ZGlmZiAtLWdpdCBhL2NvbnRhaW5lci8uY3ZzaWdub3JlIGIvY29udGFpbmVyLy5jdnNpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQwYjcxYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci8uY3ZzaWdub3JlCkBAIC0wLDAgKzEsMiBAQAorYnVpbGQKK2Rpc3QKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9MSUNFTlNFIGIvY29udGFpbmVyL0xJQ0VOU0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY0NTY5NQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9MSUNFTlNFCkBAIC0wLDAgKzEsMjAyIEBACisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0CisgICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCisKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgorCisgICAxLiBEZWZpbml0aW9ucy4KKworICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKKyAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgorCisgICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQorICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCisgICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCisgICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAorICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCisgICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgorICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCisgICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgorCisgICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgorCisgICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKKyAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KKyAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisKKyAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCisgICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CisgICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCisgICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCisKKyAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCisgICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCisgICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKKyAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCisKKyAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKKyAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKKyAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKKyAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCisgICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KKyAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKKyAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCisKKyAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCisgICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCisgICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKKyAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKKyAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgorICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCisgICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50CisgICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bworICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKKyAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCisgICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKKyAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCisgICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKKworICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAorICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCisKKyAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAorICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCisgICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgorCisgICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKKyAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAorICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKKyAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCisgICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCisgICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQorICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKKyAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKKyAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0CisgICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCisgICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKKyAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KKworICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKKyAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAorICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKKyAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgorICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCisKKyAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKKworICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCisgICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAorICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCisgICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgorICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKKworICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCisgICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAorICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAorICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAorICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQorICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCisgICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgorICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAorICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKKyAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKKyAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCisgICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KKyAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQorICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAorICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAorICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KKworICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCisgICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCisgICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKKyAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAorICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KKworICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAorICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCisgICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCisgICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5CisgICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAorICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgorCisgICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCisgICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCisgICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKKyAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgorCisgICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKKyAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKKyAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisgICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucworICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQorICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCisgICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKKyAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KKworICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCisgICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKKyAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5CisgICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQorICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAorICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCisgICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCisgICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCisgICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAorICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgorICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgorCisgICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCisgICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAorICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKKyAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCisgICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQorICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKKyAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKKyAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQorICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgorICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCisKKyAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworCisgICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCisKKyAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nCisgICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCisgICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQorICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUKKyAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQorICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQorICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyCisgICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCisKKyAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQorCisgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL05PVElDRSBiL2NvbnRhaW5lci9OT1RJQ0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y1OTgwNQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9OT1RJQ0UKQEAgLTAsMCArMSwyIEBACitUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5CitUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2J1aWxkLnhtbCBiL2NvbnRhaW5lci9idWlsZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM5ZDU0ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9idWlsZC54bWwKQEAgLTAsMCArMSwxODggQEAKKzxwcm9qZWN0IG5hbWU9IkNhdGFsaW5hIDIuMCIgZGVmYXVsdD0iZGVwbG95IiBiYXNlZGlyPSIuIj4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09IEluaXRpYWxpemUgUHJvcGVydHkgVmFsdWVzID09PT09PT09PT09PT09PT09PT0gLS0+CisKKyAgPCEtLSBTZWUgImJ1aWxkLnByb3BlcnRpZXMuc2FtcGxlIiBpbiB0aGUgdG9wIGxldmVsIGRpcmVjdG9yeSBmb3IgYWxsICAgICAtLT4KKyAgPCEtLSBwcm9wZXJ0eSB2YWx1ZXMgeW91IG11c3QgY3VzdG9taXplIGZvciBzdWNjZXNzZnVsIGJ1aWxkaW5nISEhICAgICAgICAtLT4KKyAgPCEtLXByb3BlcnR5IGZpbGU9ImJ1aWxkLnByb3BlcnRpZXMiLz4KKyAgPHByb3BlcnR5IGZpbGU9IiR7dXNlci5ob21lfS9idWlsZC5wcm9wZXJ0aWVzIi8tLT4KKworICA8IS0tIEJ1aWxkIERlZmF1bHRzIC0tPgorICA8IS0tcHJvcGVydHkgbmFtZT0iY2F0YWxpbmEuYnVpbGQiICAgdmFsdWU9IiR7YmFzZWRpcn0vY2F0YWxpbmEvYnVpbGQiLy0tPgorCisgIDwhLS0gU291cmNlIGRlcGVuZGVuY2llcyAtLT4KKyAgPHByb3BlcnR5IG5hbWU9ImFwaS5ob21lIgorICAgICAgICAgICB2YWx1ZT0iJHtiYXNlZGlyfS8uLi9qYWthcnRhLXNlcnZsZXRhcGktNSIvPgorICA8cHJvcGVydHkgbmFtZT0ianRjLmhvbWUiCisgICAgICAgICAgIHZhbHVlPSIke2Jhc2VkaXJ9Ly4uL2pha2FydGEtdG9tY2F0LWNvbm5lY3RvcnMiLz4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PSBERVRFQ1Q6IERpc3BsYXkgY29uZmlndXJhdGlvbiA9PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iZmxhZ3MuZGlzcGxheSIKKyAgIGRlc2NyaXB0aW9uPSJEaXNwbGF5IGNvbmZpZ3VyYXRpb24gYW5kIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIGZsYWdzIj4KKworICAgIDxhbnQgZGlyPSIke2Jhc2VkaXJ9L2NhdGFsaW5hIiB0YXJnZXQ9ImZsYWdzLmRpc3BsYXkiLz4KKyAgICA8YW50IGRpcj0iJHtiYXNlZGlyfS93ZWJhcHBzL2FkbWluIiB0YXJnZXQ9ImZsYWdzLmRpc3BsYXkiLz4KKworICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09IERFUExPWTogQ3JlYXRlIERpcmVjdG9yaWVzID09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iZGVwbG95LXByZXBhcmUiPgorICAgIDxta2RpciBkaXI9IiR7dG9tY2F0LmJ1aWxkfSIvPgorICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PSBERVBMT1k6IENvcHkgU3RhdGljIEZpbGVzID09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iZGVwbG95LXN0YXRpYyIgZGVwZW5kcz0iZGVwbG95LXByZXBhcmUiLz4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PSBERVBMT1k6IERlcGxveSBDb21wb25lbnRzID09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iZGVwbG95IiBkZXBlbmRzPSJkZXBsb3ktc3RhdGljIgorICAgZGVzY3JpcHRpb249IkJ1aWxkIGFuZCBkZXBsb3kgYWxsIGNvbXBvbmVudHMiPgorICAgIDxlY2hvPlRhcmdldDogQ2F0YWxpbmEgLSBEZXBsb3kgLi4uPC9lY2hvPgorICAgIDxhbnQgZGlyPSIke2Jhc2VkaXJ9L2NhdGFsaW5hIiB0YXJnZXQ9ImRlcGxveSIvPgorICAgIDxlY2hvPlRhcmdldDogV2ViYXBwcyAtIERlcGxveSAuLi48L2VjaG8+CisgICAgPGFudCBkaXI9IiR7YmFzZWRpcn0vd2ViYXBwcyIgIHRhcmdldD0iZGVwbG95Ii8+CisgIDwvdGFyZ2V0PgorCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PSBERVBMT1k6IERlcGxveSBDb3JlIENvbXBvbmVudHMgPT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPCEtLSB1c2VkIGJ5IGd1bXAgdG8gYnVpbGQganVzdCBjYXRhbGluYSBhbmQgbm90IHRoZSBqLXQtY29ubmVjdG9ycyAtLT4KKyAgPHRhcmdldCBuYW1lPSJkZXBsb3ktY2F0YWxpbmEiIGRlcGVuZHM9ImRlcGxveS1zdGF0aWMiCisgICBkZXNjcmlwdGlvbj0iQnVpbGQgYW5kIGRlcGxveSBhbGwgY29tcG9uZW50cyI+CisgICAgPGVjaG8+VGFyZ2V0OiBDYXRhbGluYSAtIERlcGxveSAuLi48L2VjaG8+CisgICAgPGFudCBkaXI9IiR7YmFzZWRpcn0vY2F0YWxpbmEiIHRhcmdldD0iZGVwbG95LWNhdGFsaW5hIi8+CisgICAgPGVjaG8+VGFyZ2V0OiBXZWJhcHBzIC0gRGVwbG95IC4uLjwvZWNobz4KKyAgICA8YW50IGRpcj0iJHtiYXNlZGlyfS93ZWJhcHBzIiAgdGFyZ2V0PSJkZXBsb3kiLz4KKyAgPC90YXJnZXQ+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PT0gQ09NQk86IENsZWFuIEFsbCBEaXJlY3RvcmllcyA9PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImNsZWFuIgorICAgZGVzY3JpcHRpb249IkNsZWFuIGFsbCBjb21wb25lbnRzIj4KKyAgICA8ZGVsZXRlIGRpcj0iJHt0b21jYXQuYnVpbGR9Ii8+CisgICAgPGVjaG8+VGFyZ2V0OiBDYXRhbGluYSAtIENsZWFuIC4uLjwvZWNobz4KKyAgICA8YW50IGRpcj0iJHtiYXNlZGlyfS9jYXRhbGluYSIgdGFyZ2V0PSJjbGVhbiIvPgorICAgIDxlY2hvPlRhcmdldDogV2ViYXBwcyAtIENsZWFuIC4uLjwvZWNobz4KKyAgICA8YW50IGRpcj0iJHtiYXNlZGlyfS93ZWJhcHBzIiAgdGFyZ2V0PSJjbGVhbiIvPgorICAgIDxkZWxldGUgZGlyPSIke3RvbWNhdC5kaXN0fSIvPgorICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT0gQ09NQk86IEJ1aWxkIEFsbCBDb21wb25lbnRzID09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iYWxsIgorICAgZGVzY3JpcHRpb249IkNsZWFuLCBidWlsZCwgYW5kIGRlcGxveSBhbGwgY29tcG9uZW50cyI+CisgICAgPGVjaG8+VGFyZ2V0OiBDYXRhbGluYSAtIEFsbCAuLi48L2VjaG8+CisgICAgPGFudCBkaXI9IiR7YmFzZWRpcn0vY2F0YWxpbmEiIHRhcmdldD0iYWxsIi8+CisgICAgPGVjaG8+VGFyZ2V0OiBXZWJhcHBzIC0gQWxsIC4uLjwvZWNobz4KKyAgICA8YW50IGRpcj0iJHtiYXNlZGlyfS93ZWJhcHBzIiAgdGFyZ2V0PSJhbGwiLz4KKyAgPC90YXJnZXQ+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09IENPTUJPOiBUZXN0IEFsbCBDb21wb25lbnRzID09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9InRlc3QiCisgICBkZXNjcmlwdGlvbj0iVW5pdCB0ZXN0cyBvbiBhbGwgY29tcG9uZW50cyI+CisgICAgPGVjaG8+VGFyZ2V0OiBDYXRhbGluYSAtIFRlc3QgLi4uPC9lY2hvPgorICAgIDxhbnQgZGlyPSIke2Jhc2VkaXJ9L2NhdGFsaW5hIiB0YXJnZXQ9InRlc3QiLz4KKyAgICA8ZWNobz5UYXJnZXQ6IFdlYmFwcHMgLSBUZXN0IC4uLjwvZWNobz4KKyAgICA8YW50IGRpcj0iJHtiYXNlZGlyfS93ZWJhcHBzIiAgdGFyZ2V0PSJ0ZXN0Ii8+CisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09IERJU1Q6IENyZWF0ZSBEaXJlY3RvcmllcyA9PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJkaXN0LXByZXBhcmUiPgorICAgIDxta2RpciBkaXI9IiR7dG9tY2F0LmRpc3R9Ii8+CisgICAgPG1rZGlyIGRpcj0iJHt0b21jYXQuZGlzdH0vYmluIi8+CisgICAgPG1rZGlyIGRpcj0iJHt0b21jYXQuZGlzdH0vY29tbW9uIi8+CisgICAgPG1rZGlyIGRpcj0iJHt0b21jYXQuZGlzdH0vY29tbW9uL2NsYXNzZXMiLz4KKyAgICA8bWtkaXIgZGlyPSIke3RvbWNhdC5kaXN0fS9jb21tb24vZW5kb3JzZWQiLz4KKyAgICA8bWtkaXIgZGlyPSIke3RvbWNhdC5kaXN0fS9jb21tb24vbGliIi8+CisgICAgPG1rZGlyIGRpcj0iJHt0b21jYXQuZGlzdH0vY29uZiIvPgorICAgIDxta2RpciBkaXI9IiR7dG9tY2F0LmRpc3R9L2xvZ3MiLz4KKyAgICA8bWtkaXIgZGlyPSIke3RvbWNhdC5kaXN0fS9zZXJ2ZXIiLz4KKyAgICA8bWtkaXIgZGlyPSIke3RvbWNhdC5kaXN0fS9zZXJ2ZXIvY2xhc3NlcyIvPgorICAgIDxta2RpciBkaXI9IiR7dG9tY2F0LmRpc3R9L3NlcnZlci9saWIiLz4KKyAgICA8bWtkaXIgZGlyPSIke3RvbWNhdC5kaXN0fS9zaGFyZWQvY2xhc3NlcyIvPgorICAgIDxta2RpciBkaXI9IiR7dG9tY2F0LmRpc3R9L3NoYXJlZC9saWIiLz4KKyAgICA8bWtkaXIgZGlyPSIke3RvbWNhdC5kaXN0fS93ZWJhcHBzIi8+CisgICAgPG1rZGlyIGRpcj0iJHt0b21jYXQuZGlzdH0vd29yayIvPgorICAgIDxta2RpciBkaXI9IiR7dG9tY2F0LmRpc3R9L3RlbXAiLz4KKyAgPC90YXJnZXQ+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PT0gRElTVDogQ29weSBTdGF0aWMgRmlsZXMgPT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImRpc3Qtc3RhdGljIiBkZXBlbmRzPSJkaXN0LXByZXBhcmUiPgorCisgICAgPCEtLSBDb3B5IHRoZSB0b3AtbGV2ZWwgZG9jdW1lbnRhdGlvbiBmaWxlcyAtLT4KKyAgICA8Y29weSB0b2Rpcj0iJHt0b21jYXQuZGlzdH0iPgorICAgICAgPGZpbGVzZXQgZGlyPSIuIj4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iTElDRU5TRSIvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJJTlNUQUxMSU5HLnR4dCIvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJCVUlMRElORy50eHQiLz4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iUkVBRE1FLnR4dCIvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJSRUxFQVNFKiIvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJSVU5OSU5HLnR4dCIvPgorICAgICAgPC9maWxlc2V0PgorICAgIDwvY29weT4KKworICAgIDwhLS0gQ29weSB0aGUgY29udGVudHMgb2YgZWFjaCAiYnVpbGQiIGRpcmVjdG9yeSAtLT4KKyAgICA8Y29weSB0b2Rpcj0iJHt0b21jYXQuZGlzdH0vYmluIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHt0b21jYXQuYnVpbGR9L2JpbiIgLz4KKyAgICA8L2NvcHk+CisgICAgPGNvcHkgdG9kaXI9IiR7dG9tY2F0LmRpc3R9L2NvbW1vbi9jbGFzc2VzIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHt0b21jYXQuYnVpbGR9L2NvbW1vbi9jbGFzc2VzIiAvPgorICAgIDwvY29weT4KKyAgICA8Y29weSB0b2Rpcj0iJHt0b21jYXQuZGlzdH0vY29tbW9uL2VuZG9yc2VkIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHt0b21jYXQuYnVpbGR9L2NvbW1vbi9lbmRvcnNlZCIgLz4KKyAgICA8L2NvcHk+CisgICAgPGNvcHkgdG9kaXI9IiR7dG9tY2F0LmRpc3R9L2NvbW1vbi9saWIiPgorICAgICAgPGZpbGVzZXQgZGlyPSIke3RvbWNhdC5idWlsZH0vY29tbW9uL2xpYiIgLz4KKyAgICA8L2NvcHk+CisgICAgPGNvcHkgdG9kaXI9IiR7dG9tY2F0LmRpc3R9L2NvbmYiPgorICAgICAgPGZpbGVzZXQgZGlyPSIke3RvbWNhdC5idWlsZH0vY29uZiIgLz4KKyAgICA8L2NvcHk+CisgICAgPGNvcHkgdG9kaXI9IiR7dG9tY2F0LmRpc3R9L3NlcnZlci9jbGFzc2VzIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHt0b21jYXQuYnVpbGR9L3NlcnZlci9jbGFzc2VzIiAvPgorICAgIDwvY29weT4KKyAgICA8Y29weSB0b2Rpcj0iJHt0b21jYXQuZGlzdH0vc2VydmVyL2xpYiI+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7dG9tY2F0LmJ1aWxkfS9zZXJ2ZXIvbGliIiAvPgorICAgIDwvY29weT4KKyAgICA8Y29weSB0b2Rpcj0iJHt0b21jYXQuZGlzdH0vc2VydmVyL3dlYmFwcHMiPgorICAgICAgPGZpbGVzZXQgZGlyPSIke3RvbWNhdC5idWlsZH0vc2VydmVyL3dlYmFwcHMiIC8+CisgICAgPC9jb3B5PgorICAgIDxjb3B5IHRvZGlyPSIke3RvbWNhdC5kaXN0fS9zaGFyZWQvY2xhc3NlcyI+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7dG9tY2F0LmJ1aWxkfS9zaGFyZWQvY2xhc3NlcyIgLz4KKyAgICA8L2NvcHk+CisgICAgPGNvcHkgdG9kaXI9IiR7dG9tY2F0LmRpc3R9L3NoYXJlZC9saWIiPgorICAgICAgPGZpbGVzZXQgZGlyPSIke3RvbWNhdC5idWlsZH0vc2hhcmVkL2xpYiIgLz4KKyAgICA8L2NvcHk+CisgICAgPGNvcHkgdG9kaXI9IiR7dG9tY2F0LmRpc3R9L3dlYmFwcHMiPgorICAgICAgPGZpbGVzZXQgZGlyPSIke3RvbWNhdC5idWlsZH0vd2ViYXBwcyIgLz4KKyAgICA8L2NvcHk+CisKKyAgICA8IS0tIENvcnJlY3QgcGVybWlzc2lvbnMgYW5kIGxpbmUgZW5kaW5ncyBvbiAiYmluIiBzY3JpcHRzIC0tPgorICAgIDxmaXhjcmxmIHNyY2Rpcj0iJHt0b21jYXQuZGlzdH0vYmluIiAgIGluY2x1ZGVzPSIqLnNoIiAgZW9sPSJsZiIvPgorICAgIDxmaXhjcmxmIHNyY2Rpcj0iJHt0b21jYXQuZGlzdH0vYmluIiAgIGluY2x1ZGVzPSIqLmJhdCIgZW9sPSJjcmxmIi8+CisgICAgPGNobW9kICAgICAgZGlyPSIke3RvbWNhdC5kaXN0fS9iaW4iICAgaW5jbHVkZXM9Iiouc2giICBwZXJtPSIreCIvPgorCisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09IERJU1Q6IENyZWF0ZSBKYXZhZG9jID09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJkaXN0LWphdmFkb2MiPgorICAgIDxhbnQgZGlyPSIke2Jhc2VkaXJ9L2NhdGFsaW5hIiB0YXJnZXQ9ImphdmFkb2MiLz4KKyAgICA8bWtkaXIgIGRpcj0iJHt0b21jYXQuZGlzdH0vd2ViYXBwcy90b21jYXQtZG9jcy9jYXRhbGluYS9kb2NzL2FwaSIvPgorICAgIDxjb3B5IHRvZGlyPSIke3RvbWNhdC5kaXN0fS93ZWJhcHBzL3RvbWNhdC1kb2NzL2NhdGFsaW5hL2RvY3MvYXBpIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHtjYXRhbGluYS5idWlsZH0vamF2YWRvYyIgLz4KKyAgICA8L2NvcHk+CisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09IERJU1Q6IENyZWF0ZSBBcmNoaXZlcyA9PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJkaXN0IiBkZXBlbmRzPSJkZXBsb3ksZGlzdC1zdGF0aWMsZGlzdC1qYXZhZG9jIgorICAgZGVzY3JpcHRpb249IkNyZWF0ZSBiaW5hcnkgZGlzdHJpYnV0aW9uIj4KKyAgPC90YXJnZXQ+CisKKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hLy5jdnNpZ25vcmUgYi9jb250YWluZXIvY2F0YWxpbmEvLmN2c2lnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDBiNzFhCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hLy5jdnNpZ25vcmUKQEAgLTAsMCArMSwyIEBACitidWlsZAorZGlzdApkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL2J1aWxkLnhtbCBiL2NvbnRhaW5lci9jYXRhbGluYS9idWlsZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJkNDQ5MQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9idWlsZC54bWwKQEAgLTAsMCArMSwxMTczIEBACis8cHJvamVjdCBuYW1lPSJDYXRhbGluYSIgZGVmYXVsdD0iZGVwbG95IiBiYXNlZGlyPSIuIj4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09IEluaXRpYWxpemUgUHJvcGVydHkgVmFsdWVzID09PT09PT09PT09PT09PT09PT0gLS0+CisKKyAgPCEtLSBTZWUgImJ1aWxkLnByb3BlcnRpZXMuc2FtcGxlIiBpbiB0aGUgdG9wIGxldmVsIGRpcmVjdG9yeSBmb3IgYWxsICAgICAtLT4KKyAgPCEtLSBwcm9wZXJ0eSB2YWx1ZXMgeW91IG11c3QgY3VzdG9taXplIGZvciBzdWNjZXNzZnVsIGJ1aWxkaW5nISEhICAgICAgICAtLT4KKyAgPCEtLXByb3BlcnR5IGZpbGU9ImJ1aWxkLnByb3BlcnRpZXMiLz4KKyAgPHByb3BlcnR5IGZpbGU9Ii4uL2J1aWxkLnByb3BlcnRpZXMiLz4KKyAgPHByb3BlcnR5IGZpbGU9IiR7dXNlci5ob21lfS9idWlsZC5wcm9wZXJ0aWVzIi8tLT4KKworICA8IS0tIEJ1aWxkIERlZmF1bHRzIC0tPgorICA8cHJvcGVydHkgbmFtZT0iY2F0YWxpbmEuaG9tZSIgICAgIGxvY2F0aW9uPSIuLiIvPgorICA8cHJvcGVydHkgbmFtZT0iY2F0YWxpbmEuYnVpbGQiICAgIHZhbHVlPSIke2NhdGFsaW5hLmhvbWV9L2NhdGFsaW5hL2J1aWxkIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJjbGFzc2VzLmRpciIgdmFsdWU9IiR7Y2F0YWxpbmEuYnVpbGR9L3NlcnZlci9jbGFzc2VzIiAvPgorICA8cHJvcGVydHkgbmFtZT0iY2F0YWxpbmEuZGVwbG95IiAgIHZhbHVlPSIke2NhdGFsaW5hLmhvbWV9L2J1aWxkIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJjYXRhbGluYS5kaXN0IiAgICAgdmFsdWU9IiR7Y2F0YWxpbmEuaG9tZX0vZGlzdCIvPgorICA8cHJvcGVydHkgbmFtZT0idGVzdC5mYWlsb25lcnJvciIgIHZhbHVlPSJ0cnVlIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0LnJ1bm5lciIgICAgICAgdmFsdWU9Imp1bml0LnRleHR1aS5UZXN0UnVubmVyIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0LndlYmFwcCIgICAgICAgdmFsdWU9Ii4uL3dlYmFwcHMvYnVpbGQvUk9PVCIvPgorICA8cHJvcGVydHkgbmFtZT0idGVzdC53ZWJhcHAud2FyIiAgIHZhbHVlPSIke2phdmEuaW8udG1wZGlyfS93ZWJhcHAud2FyIi8+CisKKyAgPCEtLSBTb3VyY2UgZGVwZW5kZW5jaWVzIC0tPgorICA8cHJvcGVydHkgbmFtZT0idG9tY2F0LXV0aWwuaG9tZSIgICAgICAgdmFsdWU9IiR7anRjLmhvbWV9L3V0aWwiLz4KKyAgPHByb3BlcnR5IG5hbWU9InRvbWNhdC1jb3lvdGUuaG9tZSIgICAgIHZhbHVlPSIke2p0Yy5ob21lfS9jb3lvdGUiLz4KKyAgPHByb3BlcnR5IG5hbWU9InRvbWNhdC1qay5ob21lIiAgICAgICAgIHZhbHVlPSIke2p0Yy5ob21lfS9qayIvPgorICA8cHJvcGVydHkgbmFtZT0idG9tY2F0LWh0dHAxMS5ob21lIiAgICAgdmFsdWU9IiR7anRjLmhvbWV9L2h0dHAxMSIvPgorCisgIDwhLS0gRGVwZW5kZW50IEpBUnMgYW5kIGZpbGVzIC0tPgorICA8cHJvcGVydHkgbmFtZT0iYW50LmphciIgdmFsdWU9IiR7YW50LmhvbWV9L2xpYi9hbnQuamFyIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJzZXJ2bGV0LWFwaS5qYXIiIHZhbHVlPSIke2FwaS5ob21lfS9qc3IxNTQvZGlzdC9saWIvc2VydmxldC1hcGkuamFyIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJ0b21jYXQtdXRpbC5qYXIiCisgICAgICAgICAgIHZhbHVlPSIke3RvbWNhdC11dGlsLmhvbWV9L2J1aWxkL2xpYi90b21jYXQtdXRpbC5qYXIiLz4KKyAgPHByb3BlcnR5IG5hbWU9InRvbWNhdC1jb3lvdGUuamFyIgorICAgICAgICAgICB2YWx1ZT0iJHt0b21jYXQtY295b3RlLmhvbWV9L2J1aWxkL2xpYi90b21jYXQtY295b3RlLmphciIvPgorICA8cHJvcGVydHkgbmFtZT0idG9tY2F0LWprMi5qYXIiCisgICAgICAgICAgIHZhbHVlPSIke3RvbWNhdC1qay5ob21lfS9idWlsZC9saWIvdG9tY2F0LWprMi5qYXIiLz4KKyAgPHByb3BlcnR5IG5hbWU9InRvbWNhdC1qbmkuamFyIgorICAgICAgICAgICB2YWx1ZT0iJHt0b21jYXQtamsuaG9tZX0vYnVpbGQvbGliL3RvbWNhdC1qbmkuamFyIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJqazIucHJvcGVydGllcyIKKyAgICAgICAgICAgdmFsdWU9IiR7dG9tY2F0LWprLmhvbWV9L2J1aWxkL2NvbmYvamsyLnByb3BlcnRpZXMiLz4KKyAgPHByb3BlcnR5IG5hbWU9InRvbWNhdC1odHRwMTEuamFyIgorICAgICAgICAgICB2YWx1ZT0iJHt0b21jYXQtaHR0cDExLmhvbWV9L2J1aWxkL2xpYi90b21jYXQtaHR0cDExLmphciIvPgorICA8cHJvcGVydHkgbmFtZT0idG9tY2F0LWRiY3AuamFyIiAKKyAgICAgICAgICAgdmFsdWU9IiR7YmFzZS5wYXRofS90b21jYXQtZGVwcy9uYW1pbmctZmFjdG9yeS1kYmNwLmphciIvPgorICA8IS0tIENvbnN0cnVjdCBDYXRhbGluYSBjbGFzc3BhdGggLS0+CisgIDxwYXRoIGlkPSJjYXRhbGluYS5jbGFzc3BhdGgiPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHthY3RpdmF0aW9uLmphcn0iLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7YW50Lmphcn0iLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y29tbW9ucy1iZWFudXRpbHMuamFyfSIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjb21tb25zLWNvbGxlY3Rpb25zLmphcn0iLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7dG9tY2F0LWRiY3AuamFyfSIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjb21tb25zLWRpZ2VzdGVyLmphcn0iLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y29tbW9ucy1maWxldXBsb2FkLmphcn0iLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y29tbW9ucy1sYXVuY2hlci5qYXJ9Ii8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NvbW1vbnMtbG9nZ2luZy5qYXJ9Ii8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NvbW1vbnMtbW9kZWxlci5qYXJ9Ii8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3RvbWNhdC11dGlsLmphcn0iLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7dG9tY2F0LWNveW90ZS5qYXJ9Ii8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2phYXMuamFyfSIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtqYXZhZ3JvdXBzLmphcn0iLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7amNlcnQuamFyfSIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtqZGJjMjBleHQuamFyfSIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtqbXguamFyfSIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtqbmRpLmphcn0iLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7am5ldC5qYXJ9Ii8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2pzc2UuamFyfSIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtqYXZhLmhvbWV9L2xpYi9qc3NlLmphciIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtqdGEuamFyfSIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtsZGFwLmphcn0iLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7bWFpbC5qYXJ9Ii8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3JlZ2V4cC5qYXJ9Ii8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3NlcnZsZXQtYXBpLmphcn0iLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7eGVyY2VzSW1wbC5qYXJ9Ii8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3htbC1hcGlzLmphcn0iLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y2xhc3Nlcy5kaXJ9Ii8+CisgIDwvcGF0aD4KKworICA8IS0tIENvbnN0cnVjdCB1bml0IHRlc3RzIGNsYXNzcGF0aCAtLT4KKyAgPHBhdGggaWQ9InRlc3QuY2xhc3NwYXRoIj4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7anVuaXQuamFyfSIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHthY3RpdmF0aW9uLmphcn0iLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7YW50Lmphcn0iLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y29tbW9ucy1iZWFudXRpbHMuamFyfSIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjb21tb25zLWNvbGxlY3Rpb25zLmphcn0iLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7dG9tY2F0LWRiY3AuamFyfSIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjb21tb25zLWRpZ2VzdGVyLmphcn0iLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y29tbW9ucy1maWxldXBsb2FkLmphcn0iLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y29tbW9ucy1sYXVuY2hlci5qYXJ9Ii8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NvbW1vbnMtbG9nZ2luZy5qYXJ9Ii8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NvbW1vbnMtbW9kZWxlci5qYXJ9Ii8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2phYXMuamFyfSIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtqY2VydC5qYXJ9Ii8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2pkYmMyMGV4dC5qYXJ9Ii8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2pteC5qYXJ9Ii8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2puZGkuamFyfSIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtqbmV0Lmphcn0iLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7anNzZS5qYXJ9Ii8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2p0YS5qYXJ9Ii8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2xkYXAuamFyfSIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHttYWlsLmphcn0iLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7cmVnZXhwLmphcn0iLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7c2VydmxldC1hcGkuamFyfSIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt4ZXJjZXNJbXBsLmphcn0iLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7eG1sLWFwaXMuamFyfSIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjbGFzc2VzLmRpcn0iLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y2F0YWxpbmEuYnVpbGR9L3Rlc3RzIi8+CisgIDwvcGF0aD4KKworICA8IS0tIFNvdXJjZSBwYXRoIC0tPgorICA8cGF0aCBpZD0iamF2YWRvYy5zb3VyY2VwYXRoIj4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249InNyYy9zaGFyZSIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt0b21jYXQtdXRpbC5ob21lfS9qYXZhIi8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3RvbWNhdC1jb3lvdGUuaG9tZX0vc3JjL2phdmEiLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7dG9tY2F0LWprLmhvbWV9L2phdmEiLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7dG9tY2F0LWh0dHAxMS5ob21lfS9zcmMvamF2YSIvPgorICA8L3BhdGg+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT0gQlVJTEQ6IFNldCBjb21waWxlIGZsYWdzID09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImZsYWdzIj4KKworICAgIDwhLS0gSkRLIGZsYWdzIC0tPgorICAgIDxhdmFpbGFibGUgcHJvcGVydHk9Impkay4xLjIucHJlc2VudCIgY2xhc3NuYW1lPSJqYXZhLnV0aWwuSGFzaE1hcCIgLz4KKyAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJqZGsuMS4zLnByZXNlbnQiIAorICAgICBjbGFzc25hbWU9ImphdmEubGFuZy5yZWZsZWN0LlByb3h5IiAvPgorICAgIDxhdmFpbGFibGUgcHJvcGVydHk9Impkay4xLjQucHJlc2VudCIgY2xhc3NuYW1lPSJqYXZhLm5pby5CdWZmZXIiIC8+CisKKyAgICA8IS0tIEFudCBmbGFncyAtLT4KKyAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJzdHlsZS5hdmFpbGFibGUiCisgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuVHJhWExpYWlzb24iIC8+CisKKyAgICA8IS0tIFNvdXJjZSBwYXRoIC0tPgorICAgIDxhdmFpbGFibGUgcHJvcGVydHk9Imp0Yy5ob21lLnByZXNlbnQiIGZpbGU9IiR7anRjLmhvbWV9IiAvPgorCisgICAgPCEtLSBDbGFzcyBhdmFpbGFiaWxpdHkgZmxhZ3MgLS0+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0iYmVhbnV0aWxzLnByZXNlbnQiCisgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5jb21tb25zLmJlYW51dGlscy5CZWFuVXRpbHMiCisgICAgIGNsYXNzcGF0aD0iJHtjb21tb25zLWJlYW51dGlscy5qYXJ9Ii8+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0iY29sbGVjdGlvbnMucHJlc2VudCIKKyAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuRmFzdEhhc2hNYXAiCisgICAgIGNsYXNzcGF0aD0iJHtjb21tb25zLWNvbGxlY3Rpb25zLmphcn0iLz4KKyAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJkYmNwLnByZXNlbnQiCisgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b21jYXQuZGJjcC5kYmNwLkNvbm5lY3Rpb25GYWN0b3J5IgorICAgICBjbGFzc3BhdGg9IiR7dG9tY2F0LWRiY3AuamFyfSIvPgorICAgIDxhdmFpbGFibGUgcHJvcGVydHk9ImRpZ2VzdGVyLnByZXNlbnQiCisgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5jb21tb25zLmRpZ2VzdGVyLkRpZ2VzdGVyIgorICAgICBjbGFzc3BhdGg9IiR7Y29tbW9ucy1kaWdlc3Rlci5qYXJ9Ii8+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0iZmlsZXVwbG9hZC5wcmVzZW50IgorICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUuY29tbW9ucy5maWxldXBsb2FkLkZpbGVVcGxvYWQiCisgICAgIGNsYXNzcGF0aD0iJHtjb21tb25zLWZpbGV1cGxvYWQuamFyfSIvPgorICAgIDxhdmFpbGFibGUgcHJvcGVydHk9ImxhdW5jaGVyLnByZXNlbnQiCisgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5jb21tb25zLmxhdW5jaGVyLkxhdW5jaGVyIgorICAgICBjbGFzc3BhdGg9IiR7Y29tbW9ucy1sYXVuY2hlci5qYXJ9Ii8+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0ibGF1bmNoZXIuYm9vdHN0cmFwLnByZXNlbnQiCisgICAgIGZpbGU9IiR7Y29tbW9ucy1sYXVuY2hlci5ib290c3RyYXAuY2xhc3N9Ii8+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0ibG9nZ2luZy5wcmVzZW50IgorICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZyIKKyAgICAgY2xhc3NwYXRoPSIke2NvbW1vbnMtbG9nZ2luZy5qYXJ9Ii8+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0ibW9kZWxlci5wcmVzZW50IgorICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUuY29tbW9ucy5tb2RlbGVyLlJlZ2lzdHJ5IgorICAgICBjbGFzc3BhdGg9IiR7Y29tbW9ucy1tb2RlbGVyLmphcn06JHtqbXguamFyfSIvPgorICAgIDxhdmFpbGFibGUgcHJvcGVydHk9ImphYXMucHJlc2VudCIKKyAgICAgY2xhc3NuYW1lPSJqYXZheC5zZWN1cml0eS5hdXRoLlN1YmplY3QiCisgICAgIGNsYXNzcGF0aD0iJHtqYWFzLmphcn0iIC8+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iamF4cC5wcmVzZW50Ij4KKyAgICAgIDxhbmQ+CisgICAgICAgIDxhdmFpbGFibGUgY2xhc3NuYW1lPSJqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXIiCisgICAgICAgICBjbGFzc3BhdGg9IiR7eG1sLWFwaXMuamFyfSIgLz4KKyAgICAgICAgPGF2YWlsYWJsZSBjbGFzc25hbWU9Im9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyIgorICAgICAgICAgY2xhc3NwYXRoPSIke3htbC1hcGlzLmphcn0iIC8+CisgICAgICA8L2FuZD4KKyAgICA8L2NvbmRpdGlvbj4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJqYXZhbWFpbC5wcmVzZW50Ij4KKyAgICAgIDxhbmQ+CisgICAgICAgIDxhdmFpbGFibGUgY2xhc3NuYW1lPSJqYXZheC5hY3RpdmF0aW9uLkRhdGFTb3VyY2UiCisgICAgICAgICBjbGFzc3BhdGg9IiR7YWN0aXZhdGlvbi5qYXJ9IiAvPgorICAgICAgICA8YXZhaWxhYmxlIGNsYXNzbmFtZT0iamF2YXgubWFpbC5TZXJ2aWNlIgorICAgICAgICAgY2xhc3NwYXRoPSIke21haWwuamFyfSIgLz4KKyAgICAgIDwvYW5kPgorICAgIDwvY29uZGl0aW9uPgorICAgIDxhdmFpbGFibGUgcHJvcGVydHk9ImpteC5wcmVzZW50IgorICAgICBjbGFzc25hbWU9ImphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXIiCisgICAgIGNsYXNzcGF0aD0iJHtqbXguamFyfSIgLz4KKyAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJqbmRpLnByZXNlbnQiCisgICAgIGNsYXNzbmFtZT0iamF2YXgubmFtaW5nLkNvbnRleHQiCisgICAgIGNsYXNzcGF0aD0iJHtqbmRpLmphcn0iIC8+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0ianNzZS5wcmVzZW50Ij4KKyAgICAgIDxhbmQ+CisgICAgICAgIDxhdmFpbGFibGUgY2xhc3NuYW1lPSJqYXZheC5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlIgorICAgICAgICAgY2xhc3NwYXRoPSIke2pjZXJ0Lmphcn0iIC8+CisgICAgICAgIDxhdmFpbGFibGUgY2xhc3NuYW1lPSJqYXZheC5uZXQuU29ja2V0RmFjdG9yeSIKKyAgICAgICAgIGNsYXNzcGF0aD0iJHtqbmV0Lmphcn0iIC8+CisgICAgICAgIDxhdmFpbGFibGUgY2xhc3NuYW1lPSJqYXZheC5uZXQuc3NsLlNTTFNvY2tldCIKKyAgICAgICAgIGNsYXNzcGF0aD0iJHtqc3NlLmphcn0iIC8+CisgICAgICA8L2FuZD4KKyAgICA8L2NvbmRpdGlvbj4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJqdGEucHJlc2VudCI+CisgICAgICA8YW5kPgorICAgICAgICA8YXZhaWxhYmxlIGNsYXNzbmFtZT0iamF2YXguc3FsLlhBRGF0YVNvdXJjZSIKKyAgICAgICAgIGNsYXNzcGF0aD0iJHtqZGJjMjBleHQuamFyfSIgLz4KKyAgICAgICAgPGF2YWlsYWJsZSBjbGFzc25hbWU9ImphdmF4LnRyYW5zYWN0aW9uLlVzZXJUcmFuc2FjdGlvbiIKKyAgICAgICAgIGNsYXNzcGF0aD0iJHtqdGEuamFyfSIgLz4KKyAgICAgIDwvYW5kPgorICAgIDwvY29uZGl0aW9uPgorICAgIDxhdmFpbGFibGUgcHJvcGVydHk9Imp1bml0LnByZXNlbnQiCisgICAgIGNsYXNzbmFtZT0ianVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIgorICAgICBjbGFzc3BhdGg9IiR7anVuaXQuamFyfSIgLz4KKyAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJsZGFwLnByZXNlbnQiCisgICAgIGNsYXNzbmFtZT0iY29tLnN1bi5qbmRpLmxkYXAuTGRhcENsaWVudCIKKyAgICAgY2xhc3NwYXRoPSIke2xkYXAuamFyfSIgLz4KKyAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJwb29sLnByZXNlbnQiCisgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b21jYXQuZGJjcC5wb29sLk9iamVjdFBvb2wiCisgICAgIGNsYXNzcGF0aD0iJHt0b21jYXQtZGJjcC5qYXJ9Ii8+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0icmVnZXhwLnByZXNlbnQiCisgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5yZWdleHAuUkUiCisgICAgIGNsYXNzcGF0aD0iJHtyZWdleHAuamFyfSIgLz4KKyAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJ4ZXJjZXMucHJlc2VudCIKKyAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnhlcmNlcy5wYXJzZXJzLlNBWFBhcnNlciIKKyAgICAgY2xhc3NwYXRoPSIke3hlcmNlc0ltcGwuamFyfSIgLz4KKworICAgIDwhLS0gSkFSIGZpbGVzIGF2YWlsYWJpbGl0eSBmbGFncyAtLT4KKyAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJkYmNwLmphci5wcmVzZW50IiBmaWxlPSIke3RvbWNhdC1kYmNwLmphcn0iIC8+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0iZmlsZXVwbG9hZC5qYXIucHJlc2VudCIgZmlsZT0iJHtjb21tb25zLWZpbGV1cGxvYWQuamFyfSIgLz4KKyAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJqYWFzLmphci5wcmVzZW50IiBmaWxlPSIke2phYXMuamFyfSIgLz4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJqYXZhbWFpbC5qYXIucHJlc2VudCI+CisgICAgICA8YW5kPgorICAgICAgICA8YXZhaWxhYmxlIGZpbGU9IiR7YWN0aXZhdGlvbi5qYXJ9IiAvPgorICAgICAgICA8YXZhaWxhYmxlIGZpbGU9IiR7bWFpbC5qYXJ9IiAvPgorICAgICAgPC9hbmQ+CisgICAgPC9jb25kaXRpb24+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0iamRiYzIwZXh0Lmphci5wcmVzZW50IiBmaWxlPSIke2pkYmMyMGV4dC5qYXJ9IiAvPgorICAgIDxhdmFpbGFibGUgcHJvcGVydHk9ImpteC5qYXIucHJlc2VudCIgZmlsZT0iJHtqbXguamFyfSIgLz4KKyAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJqY2VydC5qYXIucHJlc2VudCIgZmlsZT0iJHtqY2VydC5qYXJ9IiAvPgorICAgIDxhdmFpbGFibGUgcHJvcGVydHk9ImpuZGkuamFyLnByZXNlbnQiIGZpbGU9IiR7am5kaS5qYXJ9IiAvPgorICAgIDxhdmFpbGFibGUgcHJvcGVydHk9ImpuZXQuamFyLnByZXNlbnQiIGZpbGU9IiR7am5ldC5qYXJ9IiAvPgorICAgIDxhdmFpbGFibGUgcHJvcGVydHk9Impzc2UuamFyLnByZXNlbnQiIGZpbGU9IiR7anNzZS5qYXJ9IiAvPgorICAgIDxhdmFpbGFibGUgcHJvcGVydHk9Imp0YS5qYXIucHJlc2VudCIgZmlsZT0iJHtqdGEuamFyfSIgLz4KKyAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJqdW5pdC5qYXIucHJlc2VudCIgZmlsZT0iJHtqdW5pdC5qYXJ9IiAvPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9ImxhdW5jaGVyLmphcnMucHJlc2VudCI+CisgICAgICA8YW5kPgorICAgICAgICA8ZXF1YWxzIGFyZzE9IiR7bGF1bmNoZXIucHJlc2VudH0iIGFyZzI9InRydWUiLz4KKyAgICAgICAgPGVxdWFscyBhcmcxPSIke2xhdW5jaGVyLmJvb3RzdHJhcC5wcmVzZW50fSIgYXJnMj0idHJ1ZSIvPgorICAgICAgPC9hbmQ+CisgICAgPC9jb25kaXRpb24+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0ibGRhcC5qYXIucHJlc2VudCIgZmlsZT0iJHtsZGFwLmphcn0iIC8+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0ibG9nZ2luZy5qYXIucHJlc2VudCIgZmlsZT0iJHtjb21tb25zLWxvZ2dpbmcuamFyfSIgLz4KKyAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJtb2RlbGVyLmphci5wcmVzZW50IiBmaWxlPSIke2NvbW1vbnMtbW9kZWxlci5qYXJ9IiAvPgorICAgIDxhdmFpbGFibGUgcHJvcGVydHk9InBvb2wuamFyLnByZXNlbnQiIGZpbGU9IiR7dG9tY2F0LWRiY3AuamFyfSIgLz4KKyAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJyZWdleHAuamFyLnByZXNlbnQiIGZpbGU9IiR7cmVnZXhwLmphcn0iIC8+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0ic2VydmxldC1hcGkuamFyLnByZXNlbnQiIGZpbGU9IiR7c2VydmxldC1hcGkuamFyfSIgLz4KKyAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJ0b21jYXQtdXRpbC5qYXIucHJlc2VudCIgZmlsZT0iJHt0b21jYXQtdXRpbC5qYXJ9IiAvPgorICAgIDxhdmFpbGFibGUgcHJvcGVydHk9InhlcmNlc0ltcGwuamFyLnByZXNlbnQiIGZpbGU9IiR7eGVyY2VzSW1wbC5qYXJ9Ii8+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0ieG1sLWFwaXMuamFyLnByZXNlbnQiIGZpbGU9IiR7eG1sLWFwaXMuamFyfSIvPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9InhlcmNlczIuamFycy5wcmVzZW50Ij4KKyAgICAgIDxhbmQ+CisgICAgICAgIDxlcXVhbHMgYXJnMT0iJHt4ZXJjZXNJbXBsLmphci5wcmVzZW50fSIgYXJnMj0idHJ1ZSIvPgorICAgICAgICA8ZXF1YWxzIGFyZzE9IiR7eG1sLWFwaXMuamFyLnByZXNlbnR9IiBhcmcyPSJ0cnVlIi8+CisgICAgICA8L2FuZD4KKyAgICA8L2NvbmRpdGlvbj4KKworICAgIDwhLS0gQ29uZGl0aW9uYWwgY29tcGlsYXRpb24gZmxhZ3MgKGRldGVybWluZWQgZnJvbSB0aGUgZmxhZ3MgYWJvdmUpIC0tPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9ImNvbXBpbGUuZGJjcCI+CisgICAgICA8b3I+CisgICAgICAgIDxlcXVhbHMgYXJnMT0iJHtmdWxsLmRpc3R9IiBhcmcyPSJvbiIgLz4KKyAgICAgICAgPGFuZD4KKyAgICAgICAgICA8ZXF1YWxzIGFyZzE9IiR7ZGJjcC5wcmVzZW50fSIgYXJnMj0idHJ1ZSIgLz4KKyAgICAgICAgICA8ZXF1YWxzIGFyZzE9IiR7cG9vbC5wcmVzZW50fSIgYXJnMj0idHJ1ZSIgLz4KKyAgICAgICAgPC9hbmQ+CisgICAgICA8L29yPgorICAgIDwvY29uZGl0aW9uPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9ImNvbXBpbGUuamFhcyI+CisgICAgICA8b3I+CisgICAgICAgIDxlcXVhbHMgYXJnMT0iJHtmdWxsLmRpc3R9IiBhcmcyPSJvbiIgLz4KKyAgICAgICAgPGVxdWFscyBhcmcxPSIke2phYXMucHJlc2VudH0iIGFyZzI9InRydWUiIC8+CisgICAgICA8L29yPgorICAgIDwvY29uZGl0aW9uPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9ImNvbXBpbGUuamF2YW1haWwiPgorICAgICAgPG9yPgorICAgICAgICA8ZXF1YWxzIGFyZzE9IiR7ZnVsbC5kaXN0fSIgYXJnMj0ib24iIC8+CisgICAgICAgIDxlcXVhbHMgYXJnMT0iJHtqYXZhbWFpbC5wcmVzZW50fSIgYXJnMj0idHJ1ZSIgLz4KKyAgICAgIDwvb3I+CisgICAgPC9jb25kaXRpb24+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iY29tcGlsZS5qbXgiPgorICAgICAgPG9yPgorICAgICAgICA8ZXF1YWxzIGFyZzE9IiR7ZnVsbC5kaXN0fSIgYXJnMj0ib24iIC8+CisgICAgICAgIDxhbmQ+CisgICAgICAgICAgPGVxdWFscyBhcmcxPSIke2pteC5wcmVzZW50fSIgYXJnMj0idHJ1ZSIgLz4KKyAgICAgICAgICA8ZXF1YWxzIGFyZzE9IiR7bW9kZWxlci5wcmVzZW50fSIgYXJnMj0idHJ1ZSIgLz4KKyAgICAgICAgPC9hbmQ+CisgICAgICA8L29yPgorICAgIDwvY29uZGl0aW9uPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9ImNvbXBpbGUuam5kaSI+CisgICAgICA8b3I+CisgICAgICAgIDxlcXVhbHMgYXJnMT0iJHtmdWxsLmRpc3R9IiBhcmcyPSJvbiIgLz4KKyAgICAgICAgPGVxdWFscyBhcmcxPSIke2puZGkucHJlc2VudH0iIGFyZzI9InRydWUiIC8+CisgICAgICAgIDxlcXVhbHMgYXJnMT0iJHtqZGsuMS4zLnByZXNlbnR9IiBhcmcyPSJ0cnVlIiAvPgorICAgICAgPC9vcj4KKyAgICA8L2NvbmRpdGlvbj4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJjb21waWxlLmpzc2UiPgorICAgICAgPG9yPgorICAgICAgICA8ZXF1YWxzIGFyZzE9IiR7ZnVsbC5kaXN0fSIgYXJnMj0ib24iIC8+CisgICAgICAgIDxlcXVhbHMgYXJnMT0iJHtqc3NlLnByZXNlbnR9IiBhcmcyPSJ0cnVlIiAvPgorICAgICAgICA8ZXF1YWxzIGFyZzE9IiR7amRrLjEuNC5wcmVzZW50fSIgYXJnMj0idHJ1ZSIgLz4KKyAgICAgIDwvb3I+CisgICAgPC9jb25kaXRpb24+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iY29tcGlsZS5qdGEiPgorICAgICAgPG9yPgorICAgICAgICA8ZXF1YWxzIGFyZzE9IiR7ZnVsbC5kaXN0fSIgYXJnMj0ib24iIC8+CisgICAgICAgIDxlcXVhbHMgYXJnMT0iJHtqdGEucHJlc2VudH0iIGFyZzI9InRydWUiIC8+CisgICAgICA8L29yPgorICAgIDwvY29uZGl0aW9uPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9ImNvbXBpbGUuanVuaXQiPgorICAgICAgPG9yPgorICAgICAgICA8ZXF1YWxzIGFyZzE9IiR7ZnVsbC5kaXN0fSIgYXJnMj0ib24iIC8+CisgICAgICAgIDxlcXVhbHMgYXJnMT0iJHtqdW5pdC5wcmVzZW50fSIgYXJnMj0idHJ1ZSIgLz4KKyAgICAgIDwvb3I+CisgICAgPC9jb25kaXRpb24+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iY29tcGlsZS5sYXVuY2hlciI+CisgICAgICA8b3I+CisgICAgICAgIDxlcXVhbHMgYXJnMT0iJHtmdWxsLmRpc3R9IiBhcmcyPSJvbiIgLz4KKyAgICAgICAgPGFuZD4KKyAgICAgICAgICA8ZXF1YWxzIGFyZzE9IiR7bGF1bmNoZXIucHJlc2VudH0iIGFyZzI9InRydWUiIC8+CisgICAgICAgICAgPGVxdWFscyBhcmcxPSIke2xhdW5jaGVyLmJvb3RzdHJhcC5wcmVzZW50fSIgYXJnMj0idHJ1ZSIgLz4KKyAgICAgICAgPC9hbmQ+CisgICAgICA8L29yPgorICAgIDwvY29uZGl0aW9uPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9ImNvbXBpbGUubGRhcCI+CisgICAgICA8b3I+CisgICAgICAgIDxlcXVhbHMgYXJnMT0iJHtmdWxsLmRpc3R9IiBhcmcyPSJvbiIgLz4KKyAgICAgICAgPGVxdWFscyBhcmcxPSIke2xkYXAucHJlc2VudH0iIGFyZzI9InRydWUiIC8+CisgICAgICAgIDxlcXVhbHMgYXJnMT0iJHtqZGsuMS4zLnByZXNlbnR9IiBhcmcyPSJ0cnVlIiAvPgorICAgICAgPC9vcj4KKyAgICA8L2NvbmRpdGlvbj4KKyAgICA8cHJvcGVydHkgbmFtZT0iY29tcGlsZS5zc2kiIHZhbHVlPSJ0cnVlIi8+CisKKworICAgIDwhLS0gQ29uZGl0aW9uYWwgY29weSBmbGFncyAoZGV0ZXJtaW5lZCBmcm9tIHRoZSBmbGFncyBhYm92ZSkgLS0+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iY29weS5kYmNwLmphciI+CisgICAgICA8b3I+CisgICAgICAgIDxlcXVhbHMgYXJnMT0iJHtmdWxsLmRpc3R9IiBhcmcyPSJvbiIgLz4KKyAgICAgICAgPGVxdWFscyBhcmcxPSIke2RiY3AucHJlc2VudH0iIGFyZzI9InRydWUiIC8+CisgICAgICA8L29yPgorICAgIDwvY29uZGl0aW9uPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9ImNvcHkuam14LmphciI+CisgICAgICA8b3I+CisgICAgICAgIDxlcXVhbHMgYXJnMT0iJHtmdWxsLmRpc3R9IiBhcmcyPSJvbiIgLz4KKyAgICAgICAgPGVxdWFscyBhcmcxPSIke2pteC5qYXIucHJlc2VudH0iIGFyZzI9InRydWUiIC8+CisgICAgICA8L29yPgorICAgIDwvY29uZGl0aW9uPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9ImNvcHkubGFuZy5qYXIiPgorICAgICAgPG9yPgorICAgICAgICA8ZXF1YWxzIGFyZzE9IiR7ZnVsbC5kaXN0fSIgYXJnMj0ib24iIC8+CisgICAgICAgIDxlcXVhbHMgYXJnMT0iJHtsYW5nLnByZXNlbnR9IiBhcmcyPSJ0cnVlIiAvPgorICAgICAgPC9vcj4KKyAgICA8L2NvbmRpdGlvbj4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJjb3B5LmxhdW5jaGVyLmphcnMiPgorICAgICAgPG9yPgorICAgICAgICA8ZXF1YWxzIGFyZzE9IiR7ZnVsbC5kaXN0fSIgYXJnMj0ib24iIC8+CisgICAgICAgIDxlcXVhbHMgYXJnMT0iJHtsYXVuY2hlci5qYXJzLnByZXNlbnR9IiBhcmcyPSJ0cnVlIiAvPgorICAgICAgPC9vcj4KKyAgICA8L2NvbmRpdGlvbj4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJjb3B5Lm1vZGVsZXIuamFyIj4KKyAgICAgIDxvcj4KKyAgICAgICAgPGVxdWFscyBhcmcxPSIke2Z1bGwuZGlzdH0iIGFyZzI9Im9uIiAvPgorICAgICAgICA8ZXF1YWxzIGFyZzE9IiR7bW9kZWxlci5wcmVzZW50fSIgYXJnMj0idHJ1ZSIgLz4KKyAgICAgIDwvb3I+CisgICAgPC9jb25kaXRpb24+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iY29weS5sb2dnaW5nLmphciI+CisgICAgICA8b3I+CisgICAgICAgIDxlcXVhbHMgYXJnMT0iJHtmdWxsLmRpc3R9IiBhcmcyPSJvbiIgLz4KKyAgICAgICAgPGVxdWFscyBhcmcxPSIke2xvZ2dpbmcucHJlc2VudH0iIGFyZzI9InRydWUiIC8+CisgICAgICA8L29yPgorICAgIDwvY29uZGl0aW9uPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9ImNvcHkucG9vbC5qYXIiPgorICAgICAgPG9yPgorICAgICAgICA8ZXF1YWxzIGFyZzE9IiR7ZnVsbC5kaXN0fSIgYXJnMj0ib24iIC8+CisgICAgICAgIDxlcXVhbHMgYXJnMT0iJHtwb29sLnByZXNlbnR9IiBhcmcyPSJ0cnVlIiAvPgorICAgICAgPC9vcj4KKyAgICA8L2NvbmRpdGlvbj4KKworICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PSBCVUlMRDogU2V0IGNvbXBpbGUgZmxhZ3MgPT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iZmxhZ3MuZGlzcGxheSIgZGVwZW5kcz0iZmxhZ3MiIHVubGVzcz0iZmxhZ3MuaGlkZSI+CisKKyAgICA8ZWNobyBtZXNzYWdlPSItLS0gQnVpbGQgZW52aXJvbm1lbnQgZm9yIENhdGFsaW5hIC0tLSIgLz4KKworICAgIDxlY2hvIG1lc3NhZ2U9IklmICR7cHJvcGVydHlfbmFtZX0gaXMgZGlzcGxheWVkLCB0aGVuIHRoZSBwcm9wZXJ0eSBpcyBub3Qgc2V0KSIgLz4KKworICAgIDxlY2hvIG1lc3NhZ2U9Ii0tLSBCdWlsZCBvcHRpb25zIC0tLSIgLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJmdWxsLmRpc3Q9JHtmdWxsLmRpc3R9IiAvPgorICAgIDxlY2hvIG1lc3NhZ2U9ImJ1aWxkLnN5c2NsYXNzcGF0aD0ke2J1aWxkLnN5c2NsYXNzcGF0aH0iIC8+CisgICAgPGVjaG8gbWVzc2FnZT0iY29tcGlsZS5kZWJ1Zz0ke2NvbXBpbGUuZGVidWd9IiAvPgorICAgIDxlY2hvIG1lc3NhZ2U9ImNvbXBpbGUuZGVwcmVjYXRpb249JHtjb21waWxlLmRlcHJlY2F0aW9ufSIgLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJjb21waWxlLm9wdGltaXplPSR7Y29tcGlsZS5vcHRpbWl6ZX0iIC8+CisKKyAgICA8ZWNobyBtZXNzYWdlPSItLS0gQW50IEZsYWdzIC0tLSIgLz4KKyAgICA8ZWNobyBtZXNzYWdlPSImbHQ7c3R5bGUmZ3Q7IHRhc2sgYXZhaWxhYmxlIChyZXF1aXJlZCk9JHtzdHlsZS5hdmFpbGFibGV9IiAvPgorCisgICAgPGVjaG8gbWVzc2FnZT0iLS0tIEpESyAtLS0iIC8+CisgICAgPGVjaG8gbWVzc2FnZT0iamRrLjEuMi5wcmVzZW50PSR7amRrLjEuMi5wcmVzZW50fSIgLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJqZGsuMS4zLnByZXNlbnQ9JHtqZGsuMS4zLnByZXNlbnR9IiAvPgorICAgIDxlY2hvIG1lc3NhZ2U9Impkay4xLjQucHJlc2VudD0ke2pkay4xLjQucHJlc2VudH0iIC8+CisKKyAgICA8ZWNobyBtZXNzYWdlPSItLS0gU291cmNlIERlcGVuZGVuY2llcyAtLS0iIC8+CisgICAgPGVjaG8gbWVzc2FnZT0ianRjLmhvbWUucHJlc2VudD0ke2p0Yy5ob21lLnByZXNlbnR9IiAvPgorCisgICAgPGVjaG8gbWVzc2FnZT0iLS0tIFJlcXVpcmVkIExpYnJhcmllcyAtLS0iIC8+CisgICAgPGVjaG8gbWVzc2FnZT0iYmVhbnV0aWxzLnByZXNlbnQ9JHtiZWFudXRpbHMucHJlc2VudH0iIC8+CisgICAgPGVjaG8gbWVzc2FnZT0iY29sbGVjdGlvbnMucHJlc2VudD0ke2NvbGxlY3Rpb25zLnByZXNlbnR9IiAvPgorICAgIDxlY2hvIG1lc3NhZ2U9ImRpZ2VzdGVyLnByZXNlbnQ9JHtkaWdlc3Rlci5wcmVzZW50fSIgLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJqYXhwLnByZXNlbnQ9JHtqYXhwLnByZXNlbnR9IiAvPgorICAgIDxlY2hvIG1lc3NhZ2U9ImpuZGkucHJlc2VudD0ke2puZGkucHJlc2VudH0iIC8+CisgICAgPGVjaG8gbWVzc2FnZT0ibG9nZ2luZy5wcmVzZW50PSR7bG9nZ2luZy5wcmVzZW50fSIgLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJyZWdleHAucHJlc2VudD0ke3JlZ2V4cC5wcmVzZW50fSIgLz4KKworICAgIDxlY2hvIG1lc3NhZ2U9Ii0tLSBPcHRpb25hbCBMaWJyYXJpZXMgLS0tIiAvPgorICAgIDxlY2hvIG1lc3NhZ2U9ImRiY3AucHJlc2VudD0ke2RiY3AucHJlc2VudH0iIC8+CisgICAgPGVjaG8gbWVzc2FnZT0iZmlsZXVwbG9hZC5wcmVzZW50PSR7ZmlsZXVwbG9hZC5wcmVzZW50fSIgLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJqYWFzLnByZXNlbnQ9JHtqYWFzLnByZXNlbnR9IiAvPgorICAgIDxlY2hvIG1lc3NhZ2U9ImphdmFtYWlsLnByZXNlbnQ9JHtqYXZhbWFpbC5wcmVzZW50fSIgLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJqbXgucHJlc2VudD0ke2pteC5wcmVzZW50fSIgLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJqc3NlLnByZXNlbnQ9JHtqc3NlLnByZXNlbnR9IiAvPgorICAgIDxlY2hvIG1lc3NhZ2U9Imp0YS5wcmVzZW50PSR7anRhLnByZXNlbnR9IiAvPgorICAgIDxlY2hvIG1lc3NhZ2U9Imp1bml0LnByZXNlbnQ9JHtqdW5pdC5wcmVzZW50fSIgLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJsYW5nLnByZXNlbnQ9JHtsYW5nLnByZXNlbnR9IiAvPgorICAgIDxlY2hvIG1lc3NhZ2U9ImxhdW5jaGVyLnByZXNlbnQ9JHtsYXVuY2hlci5wcmVzZW50fSIgLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJsYXVuY2hlci5ib290c3RyYXAucHJlc2VudD0ke2xhdW5jaGVyLmJvb3RzdHJhcC5wcmVzZW50fSIgLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJsZGFwLnByZXNlbnQ9JHtsZGFwLnByZXNlbnR9IiAvPgorICAgIDxlY2hvIG1lc3NhZ2U9Im1vZGVsZXIucHJlc2VudD0ke21vZGVsZXIucHJlc2VudH0iICAvPgorICAgIDxlY2hvIG1lc3NhZ2U9InBvb2wucHJlc2VudD0ke3Bvb2wucHJlc2VudH0iIC8+CisKKyAgICA8ZWNobyBtZXNzYWdlPSItLS0gUmVxdWlyZWQgSkFScyAtLS0iIC8+CisgICAgPGVjaG8gbWVzc2FnZT0iam5kaS5qYXIucHJlc2VudChleGNlcHQgSkRLIDEuMyspPSR7am5kaS5qYXIucHJlc2VudH0iIC8+CisgICAgPGVjaG8gbWVzc2FnZT0icmVnZXhwLmphci5wcmVzZW50PSR7cmVnZXhwLmphci5wcmVzZW50fSIgLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJzZXJ2bGV0LWFwaS5qYXIucHJlc2VudD0ke3NlcnZsZXQtYXBpLmphci5wcmVzZW50fSIgLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJ4ZXJjZXMyLmphcnMucHJlc2VudChleGNlcHQgSkRLIDEuNCspPSR7eGVyY2VzMi5qYXJzLnByZXNlbnR9IiAvPgorCisgICAgPGVjaG8gbWVzc2FnZT0iLS0tIE9wdGlvbmFsIEpBUnMgLS0tIiAvPgorICAgIDxlY2hvIG1lc3NhZ2U9ImRiY3AuamFyLnByZXNlbnQ9JHtkYmNwLmphci5wcmVzZW50fSIgLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJmaWxldXBsb2FkLmphci5wcmVzZW50PSR7ZmlsZXVwbG9hZC5qYXIucHJlc2VudH0iIC8+CisgICAgPGVjaG8gbWVzc2FnZT0iamFhcy5qYXIucHJlc2VudD0ke2phYXMuamFyLnByZXNlbnR9IiAvPgorICAgIDxlY2hvIG1lc3NhZ2U9ImphdmFtYWlsLmphci5wcmVzZW50PSR7amF2YW1haWwuamFyLnByZXNlbnR9IiAvPgorICAgIDxlY2hvIG1lc3NhZ2U9ImpkYmMyMGV4dC5qYXIucHJlc2VudD0ke2pkYmMyMGV4dC5qYXIucHJlc2VudH0iIC8+CisgICAgPGVjaG8gbWVzc2FnZT0iam14Lmphci5wcmVzZW50PSR7am14Lmphci5wcmVzZW50fSIgLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJqdGEuamFyLnByZXNlbnQ9JHtqdGEuamFyLnByZXNlbnR9IiAvPgorICAgIDxlY2hvIG1lc3NhZ2U9Imp1bml0Lmphci5wcmVzZW50PSR7anVuaXQuamFyLnByZXNlbnR9IiAvPgorICAgIDxlY2hvIG1lc3NhZ2U9Im1vZGVsZXIuamFyLnByZXNlbnQ9JHttb2RlbGVyLmphci5wcmVzZW50fSIgLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJwb29sLmphci5wcmVzZW50PSR7cG9vbC5qYXIucHJlc2VudH0iIC8+CisKKyAgICA8ZWNobyBtZXNzYWdlPSItLS0gQ29uZGl0aW9uYWwgY29tcGlsYXRpb24gZmxhZ3MgLS0tIiAvPgorICAgIDxlY2hvIG1lc3NhZ2U9ImNvbXBpbGUuZGJjcD0ke2NvbXBpbGUuZGJjcH0iIC8+CisgICAgPGVjaG8gbWVzc2FnZT0iY29tcGlsZS5qYWFzPSR7Y29tcGlsZS5qYWFzfSIgLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJjb21waWxlLmphdmFtYWlsPSR7Y29tcGlsZS5qYXZhbWFpbH0iIC8+CisgICAgPGVjaG8gbWVzc2FnZT0iY29tcGlsZS5qbXg9JHtjb21waWxlLmpteH0iIC8+CisgICAgPGVjaG8gbWVzc2FnZT0iY29tcGlsZS5qbmRpPSR7Y29tcGlsZS5qbmRpfSIgLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJjb21waWxlLmpzc2U9JHtjb21waWxlLmpzc2V9IiAvPgorICAgIDxlY2hvIG1lc3NhZ2U9ImNvbXBpbGUuanRhPSR7Y29tcGlsZS5qdGF9IiAvPgorICAgIDxlY2hvIG1lc3NhZ2U9ImNvbXBpbGUuanVuaXQ9JHtjb21waWxlLmp1bml0fSIgLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJjb21waWxlLmxkYXA9JHtjb21waWxlLmxkYXB9IiAvPgorICAgIDxlY2hvIG1lc3NhZ2U9ImNvbXBpbGUuc3NpPSR7Y29tcGlsZS5zc2l9IiAvPgorCisgICAgPGVjaG8gbWVzc2FnZT0iLS0tIERpc3RyaWJ1dGlvbiBmbGFncyAtLS0iIC8+CisgICAgPGVjaG8gbWVzc2FnZT0iY29weS5kYmNwLmphcj0ke2NvcHkuZGJjcC5qYXJ9IiAvPgorICAgIDxlY2hvIG1lc3NhZ2U9ImNvcHkuam14Lmphcj0ke2NvcHkuam14Lmphcn0iIC8+CisgICAgPGVjaG8gbWVzc2FnZT0iY29weS5sYXVuY2hlci5qYXJzPSR7Y29weS5sYXVuY2hlci5qYXJzfSIgLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJjb3B5LmxvZ2dpbmcuamFyPSR7Y29weS5sb2dnaW5nLmphcn0iIC8+CisgICAgPGVjaG8gbWVzc2FnZT0iY29weS5tb2RlbGVyLmphcj0ke2NvcHkubW9kZWxlci5qYXJ9IiAvPgorICAgIDxlY2hvIG1lc3NhZ2U9ImNvcHkucG9vbC5qYXI9JHtjb3B5LnBvb2wuamFyfSIgLz4KKworICA8L3RhcmdldD4KKworICA8IS0tID09PT09PT09PT09PT09PT09PT0gQlVJTEQ6IENyZWF0ZSBEaXJlY3RvcmllcyA9PT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImJ1aWxkLXByZXBhcmUiPgorCisgICAgPG1rZGlyIGRpcj0iJHtjYXRhbGluYS5idWlsZH0iLz4KKyAgICA8bWtkaXIgZGlyPSIke2NhdGFsaW5hLmJ1aWxkfS9iaW4iLz4KKyAgICA8bWtkaXIgZGlyPSIke2NhdGFsaW5hLmJ1aWxkfS9jb21tb24vY2xhc3NlcyIvPgorICAgIDxta2RpciBkaXI9IiR7Y2F0YWxpbmEuYnVpbGR9L2NvbW1vbi9saWIiLz4KKyAgICA8bWtkaXIgZGlyPSIke2NhdGFsaW5hLmJ1aWxkfS9jb21tb24vZW5kb3JzZWQiLz4KKyAgICA8bWtkaXIgZGlyPSIke2NhdGFsaW5hLmJ1aWxkfS9jb25mIi8+CisgICAgPG1rZGlyIGRpcj0iJHtjYXRhbGluYS5idWlsZH0vbG9ncyIvPgorICAgIDxta2RpciBkaXI9IiR7Y2xhc3Nlcy5kaXJ9Ii8+CisgICAgPG1rZGlyIGRpcj0iJHtjYXRhbGluYS5idWlsZH0vc2VydmVyL2xpYiIvPgorICAgIDxta2RpciBkaXI9IiR7Y2F0YWxpbmEuYnVpbGR9L3NoYXJlZC9jbGFzc2VzIi8+CisgICAgPG1rZGlyIGRpcj0iJHtjYXRhbGluYS5idWlsZH0vc2hhcmVkL2xpYiIvPgorICAgIDxta2RpciBkaXI9IiR7Y2F0YWxpbmEuYnVpbGR9L3dvcmsiLz4KKyAgICA8bWtkaXIgZGlyPSIke2NhdGFsaW5hLmJ1aWxkfS90ZW1wIi8+CisKKyAgPC90YXJnZXQ+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PSBCVUlMRDogQ29weSBKQVJzID09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImNvcHktZGJjcC5qYXIiIGlmPSJjb3B5LmRiY3AuamFyIj4KKyAgICA8Y29weSB0b2Rpcj0iJHtjYXRhbGluYS5idWlsZH0vY29tbW9uL2xpYiIgZmlsZT0iJHtjb21tb25zLWRiY3AuamFyfSIvPgorICA8L3RhcmdldD4KKyAgPHRhcmdldCBuYW1lPSJjb3B5LWZpbGV1cGxvYWQuamFyIiBpZj0iZmlsZXVwbG9hZC5qYXIucHJlc2VudCI+CisgIDwvdGFyZ2V0PgorICA8dGFyZ2V0IG5hbWU9ImNvcHktam14LmphciIgaWY9ImNvcHkuam14LmphciI+CisgICAgPGNvcHkgdG9maWxlPSIke2NhdGFsaW5hLmJ1aWxkfS9iaW4vam14LmphciIgZmlsZT0iJHtqbXguamFyfSIvPgorICA8L3RhcmdldD4KKyAgPHRhcmdldCBuYW1lPSJjb3B5LWxhdW5jaGVyLmphcnMiIGlmPSJjb3B5LmxhdW5jaGVyLmphcnMiPgorICAgIDwhLS0gPGNvcHkgdG9kaXI9IiR7Y2F0YWxpbmEuYnVpbGR9L2NvbW1vbi9saWIiIGZpbGU9IiR7YW50Lmphcn0iLz4gLS0+CisgICAgPGNvcHkgdG9kaXI9IiR7Y2F0YWxpbmEuYnVpbGR9L2JpbiIgZmlsZT0iJHtjb21tb25zLWxhdW5jaGVyLmphcn0iLz4KKyAgICA8Y29weSB0b2Rpcj0iJHtjYXRhbGluYS5idWlsZH0vYmluIiBmaWxlPSIke2NvbW1vbnMtbGF1bmNoZXIuYm9vdHN0cmFwLmNsYXNzfSIvPgorICAgIDxjb3B5IHRvZGlyPSIke2NhdGFsaW5hLmJ1aWxkfS9iaW4iPgorICAgICAgPGZpbGVzZXQgZGlyPSJzcmMvYmluIiBpbmNsdWRlcz0iKi11c2luZy1sYXVuY2hlci4qLGxhdW5jaGVyLnByb3BlcnRpZXMsY2F0YWxpbmEueG1sIiAvPgorICAgIDwvY29weT4KKyAgPC90YXJnZXQ+CisgIDx0YXJnZXQgbmFtZT0iY29weS1tb2RlbGVyLmphciIgaWY9ImNvcHkubW9kZWxlci5qYXIiPgorICAgIDxjb3B5IHRvZGlyPSIke2NhdGFsaW5hLmJ1aWxkfS9zZXJ2ZXIvbGliIiBmaWxlPSIke2NvbW1vbnMtbW9kZWxlci5qYXJ9Ii8+CisgIDwvdGFyZ2V0PgorICA8dGFyZ2V0IG5hbWU9ImNvcHktcG9vbC5qYXIiIGlmPSJjb3B5LnBvb2wuamFyIj4KKyAgICA8Y29weSB0b2Rpcj0iJHtjYXRhbGluYS5idWlsZH0vY29tbW9uL2xpYiIgZmlsZT0iJHtjb21tb25zLXBvb2wuamFyfSIvPgorICA8L3RhcmdldD4KKyAgPHRhcmdldCBuYW1lPSJjb3B5LXRvbWNhdC11dGlsLmphciI+CisgIAk8IS0tCisgICAgPGNvcHkgdG9kaXI9IiR7Y2F0YWxpbmEuYnVpbGR9L3NlcnZlci9saWIiIGZpbGU9IiR7dG9tY2F0LXV0aWwuamFyfSIvPgorICAgIC0tPgorCTxqYXIgamFyZmlsZT0iJHt0b21jYXQtdXRpbC5qYXJ9IgorICAgICAgICAgICAgIGluZGV4PSJ0cnVlIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHtjYXRhbGluYS5idWlsZH0vY2xhc3NlcyI+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvdG9tY2F0L3V0aWwvKioiLz4KKyAgICAgICAgPCEtLSBKYXZhZG9jIGFuZCBpMThuIGV4Y2x1c2lvbnMgLS0+CisgICAgICAgIDxleGNsdWRlIG5hbWU9IioqL3BhY2thZ2UuaHRtbCIgLz4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKiovTG9jYWxTdHJpbmdzXyoiIC8+CisgICAgIDwvZmlsZXNldD4KKyAgICA8L2phcj4KKyAgPC90YXJnZXQ+CisgIDx0YXJnZXQgbmFtZT0iY29weS14ZXJjZXMyLmphcnMiPgorICAgIDxjb3B5IHRvZGlyPSIke2NhdGFsaW5hLmJ1aWxkfS9jb21tb24vZW5kb3JzZWQiIGZpbGU9IiR7eGVyY2VzSW1wbC5qYXJ9Ii8+CisgICAgPGNvcHkgdG9kaXI9IiR7Y2F0YWxpbmEuYnVpbGR9L2NvbW1vbi9lbmRvcnNlZCIgZmlsZT0iJHt4bWwtYXBpcy5qYXJ9Ii8+CisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09IEJVSUxEOiBDb3B5IFN0YXRpYyBGaWxlcyA9PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJidWlsZC1zdGF0aWMiIGRlcGVuZHM9ImZsYWdzLGZsYWdzLmRpc3BsYXksYnVpbGQtcHJlcGFyZSxjb3B5LWZpbGV1cGxvYWQuamFyLGNvcHktbGF1bmNoZXIuamFycyxjb3B5LW1vZGVsZXIuamFyIj4KKworICAgIDwhLS0gRXhlY3V0YWJsZSBDb21tYW5kcyAtLT4KKyAgICA8Y29weSB0b2Rpcj0iJHtjYXRhbGluYS5idWlsZH0vYmluIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0ic3JjL2JpbiIgZXhjbHVkZXM9IiotdXNpbmctbGF1bmNoZXIuKixsYXVuY2hlci5wcm9wZXJ0aWVzLGNhdGFsaW5hLnhtbCIgLz4KKyAgICA8L2NvcHk+CisgICAgPGZpeGNybGYgc3JjZGlyPSIke2NhdGFsaW5hLmJ1aWxkfS9iaW4iIGluY2x1ZGVzPSIqLnNoIiBlb2w9ImxmIi8+CisgICAgPGZpeGNybGYgc3JjZGlyPSIke2NhdGFsaW5hLmJ1aWxkfS9iaW4iIGluY2x1ZGVzPSIqLmJhdCIgZW9sPSJjcmxmIi8+CisgICAgPGNobW9kIHBlcm09Iit4IiBkaXI9IiR7Y2F0YWxpbmEuYnVpbGR9L2JpbiIgaW5jbHVkZXM9Iiouc2giLz4KKworICAgIDwhLS0gQ29tbW9uIEV4dGVuc2lvbnMgLS0+CisgICAgPGNvcHkgdG9kaXI9IiR7Y2F0YWxpbmEuYnVpbGR9L2JpbiIKKyAgICAgICAgICAgZmlsZT0iJHtjb21tb25zLWxvZ2dpbmctYXBpLmphcn0iLz4KKzwhLS0KKyAgICA8Y29weSB0b2Rpcj0iJHtjYXRhbGluYS5idWlsZH0vY29tbW9uL2xpYiIgZmlsZT0iJHtzZXJ2bGV0LWFwaS5qYXJ9Ii8+CistLT4KKyAgICA8Y29weSB0b2Rpcj0iJHtjYXRhbGluYS5idWlsZH0vY29tbW9uL2xpYiIKKyAgICAgICAgICAgZmlsZT0iJHt0b21jYXQtZGJjcC5qYXJ9IiAvPgorCisgICAgPCEtLSBDb25maWd1cmF0aW9uIEZpbGVzIC0tPgorICAgIDxjb3B5IHRvZGlyPSIke2NhdGFsaW5hLmJ1aWxkfS9jb25mIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0ic3JjL2NvbmYiPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSJjYXRhbGluYS5jb25mLnhtbCIgLz4KKyAgICAgIDwvZmlsZXNldD4KKyAgICA8L2NvcHk+CisKKyAgICA8IS0tIEpWTSBUZW1wb3JhcnkgRGlyZWN0b3J5IFJFQURNRSAtLT4KKyAgICA8Y29weSB0b2Rpcj0iJHtjYXRhbGluYS5idWlsZH0vdGVtcCIKKyAgICAgICAgICBmaWxlPSJzcmMvdGVtcC9SRUFETUUudHh0Ii8+CisKKyAgICA8IS0tIENhdGFsaW5hIFNlcnZlciBMaWJyYXJpZXMgLS0+CisgIAk8IS0tCisgICAgPGNvcHkgdG9kaXI9IiR7Y2F0YWxpbmEuYnVpbGR9L3NlcnZlci9saWIiIGZpbGU9IiR7cmVnZXhwLmphcn0iLz4KKyAgICAtLT4KKworICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PSBCVUlMRDogQnVpbGQgdG9tY2F0LXV0aWwgPT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iYnVpbGQtdG9tY2F0LXV0aWwiPgorCisgICAgPGFudCBkaXI9IiR7dG9tY2F0LXV0aWwuaG9tZX0iIHRhcmdldD0iYnVpbGQtbWFpbiI+CisgICAgICAgPHByb3BlcnR5IG5hbWU9ImpteC5qYXIiIHZhbHVlPSIke2pteC5qYXJ9IiAvPgorICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwdXJldGxzLmphciIgdmFsdWU9IiR7cHVyZXRscy5qYXJ9IiAvPgorICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJqc3NlLmxpYiIgdmFsdWU9IiR7anNzZS5saWJ9IiAvPgorICAgIDwvYW50PgorCisgICAgPGNvcHkgdG9kaXI9IiR7Y2F0YWxpbmEuYnVpbGR9L3NlcnZlci9saWIiCisgICAgICAgICAgIGZpbGU9IiR7dG9tY2F0LXV0aWwuamFyfSIvPgorCisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09IEJVSUxEOiBDb21waWxlIENhdGFsaW5hIENvbXBvbmVudHMgPT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJidWlsZC1jYXRhbGluYSIgZGVwZW5kcz0iYnVpbGQtY2F0YWxpbmEtY29yZSxidWlsZC1jYXRhbGluYS1vcHRpb25hbCIvPgorCisgIDx0YXJnZXQgbmFtZT0iYnVpbGQtY2F0YWxpbmEtY29yZSI+CisgICAgPCEtLSBDb21waWxlIGludGVybmFsIHNlcnZlciBjb21wb25lbnRzIC0tPgorICAgIDxqYXZhYyBzcmNkaXI9InNyYy9zaGFyZSIgZGVzdGRpcj0iJHtjbGFzc2VzLmRpcn0iCisgICAgICAgICAgIGRlYnVnPSIke2NvbXBpbGUuZGVidWd9IgorICAgICAgICAgICBkZXByZWNhdGlvbj0iJHtjb21waWxlLmRlcHJlY2F0aW9ufSIKKyAgICAgICAgICAgc291cmNlPSIke2NvbXBpbGUuc291cmNlfSIKKyAgICAgICAgICAgb3B0aW1pemU9IiR7Y29tcGlsZS5vcHRpbWl6ZX0iCisgICAgICAgICAgIGV4Y2x1ZGVzPSIqKi9DVlMvKioiPgorICAgICAgPGNsYXNzcGF0aCByZWZpZD0iY2F0YWxpbmEuY2xhc3NwYXRoIiAvPgorCisgICAgICA8ZXhjbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvUHJvY2Vzc0hlbHBlci5qYXZhIiAKKyAgICAgICAgICAgICAgIHVubGVzcz0iamRrLjEuMy5wcmVzZW50Ii8+CisgICAgICA8ZXhjbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2NhdGFsaW5hL3ZhbHZlcy9DZXJ0aWZpY2F0ZXNWYWx2ZS5qYXZhIgorICAgICAgICAgICAgICAgdW5sZXNzPSJjb21waWxlLmpzc2UiLz4KKworICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9jYXRhbGluYS9zZXJ2bGV0cy9DR0lTZXJ2bGV0LmphdmEiIC8+CisgICAgICA8ZXhjbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2NhdGFsaW5hL3NlcnZsZXRzL0hUTUxNYW5hZ2VyU2VydmxldC5qYXZhIiAvPgorICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9uYW1pbmcvZmFjdG9yeS9EYmNwRGF0YVNvdXJjZUZhY3RvcnkuamF2YSIgLz4KKyAgICAgIDxleGNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvY2F0YWxpbmEvc3NpLyoqIi8+CisgICAgICA8ZXhjbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvKioiLz4KKyAgICAgIDxleGNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvbmFtaW5nL2ZhY3RvcnkvTWFpbFNlc3Npb25GYWN0b3J5LmphdmEiLz4KKyAgICAgIDxleGNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvbmFtaW5nL2ZhY3RvcnkvU2VuZE1haWxGYWN0b3J5LmphdmEiLz4KKyAgICAgIDxleGNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvY2F0YWxpbmEvbGF1bmNoZXIvKioiLz4KKyAgICA8L2phdmFjPgorICAgIDx0c3RhbXA+CisgICAgICAgIDxmb3JtYXQgcHJvcGVydHk9IlRPREFZIiBwYXR0ZXJuPSJNTU0gZCB5eXl5IiBsb2NhbGU9ImVuIi8+CisgICAgICAgIDxmb3JtYXQgcHJvcGVydHk9IlRTVEFNUCIgcGF0dGVybj0iaGg6bW06c3MiLz4gICAgICAgIAorICAgIDwvdHN0YW1wPiAgICAKKyAgICA8IS0tIENvcHkgc3RhdGljIHJlc291cmNlIGZpbGVzIC0tPgorICAgIDxmaWx0ZXIgdG9rZW49IlZFUlNJT04iIHZhbHVlPSIke3ZlcnNpb259Ii8+CisgICAgPGZpbHRlciB0b2tlbj0iVkVSU0lPTl9OVU1CRVIiIHZhbHVlPSIke3ZlcnNpb24ubnVtYmVyfSIvPgorICAgIDxmaWx0ZXIgdG9rZW49IlZFUlNJT05fQlVJTFQiIHZhbHVlPSIke1RPREFZfSAke1RTVEFNUH0iLz4KKyAgICA8Y29weSB0b2Rpcj0iJHtjbGFzc2VzLmRpcn0iIGZpbHRlcmluZz0idHJ1ZSIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPgorICAgICAgPGZpbGVzZXQgZGlyPSJzcmMvc2hhcmUiPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi8qLmphdmEiLz4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKiovKi5zZXIiLz4KKyAgICAgIDwvZmlsZXNldD4KKyAgICA8L2NvcHk+CisgICAgPGNvcHkgdG9kaXI9IiR7Y2xhc3Nlcy5kaXJ9Ij4KKyAgICAgIDxmaWxlc2V0IGRpcj0ic3JjL3NoYXJlIj4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5zZXIiLz4KKyAgICAgIDwvZmlsZXNldD4KKyAgICA8L2NvcHk+CisKKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJidWlsZC1jYXRhbGluYS1vcHRpb25hbCIgdW5sZXNzPSJidWlsZC50b21jYXQuYmFzZSI+CisgICAgPCEtLSBDb21waWxlIGludGVybmFsIHNlcnZlciBjb21wb25lbnRzIC0tPgorICAgIDxqYXZhYyBzcmNkaXI9InNyYy9zaGFyZSIgZGVzdGRpcj0iJHtjbGFzc2VzLmRpcn0iCisgICAgICAgICAgIGRlYnVnPSIke2NvbXBpbGUuZGVidWd9IgorICAgICAgICAgICBkZXByZWNhdGlvbj0iJHtjb21waWxlLmRlcHJlY2F0aW9ufSIKKyAgICAgICAgICAgb3B0aW1pemU9IiR7Y29tcGlsZS5vcHRpbWl6ZX0iCisgICAgICAgICAgIHNvdXJjZT0iJHtjb21waWxlLnNvdXJjZX0iCisgICAgICAgICAgIGV4Y2x1ZGVzPSIqKi9DVlMvKioiPgorICAgICAgPGNsYXNzcGF0aCByZWZpZD0iY2F0YWxpbmEuY2xhc3NwYXRoIiAvPgorICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9uYW1pbmcvZmFjdG9yeS9NYWlsU2Vzc2lvbkZhY3RvcnkuamF2YSIKKyAgICAgICB1bmxlc3M9ImNvbXBpbGUuamF2YW1haWwiLz4KKyAgICAgIDxleGNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvbmFtaW5nL2ZhY3RvcnkvU2VuZE1haWxGYWN0b3J5LmphdmEiCisgICAgICAgdW5sZXNzPSJjb21waWxlLmphdmFtYWlsIi8+CisgICAgICA8ZXhjbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2NhdGFsaW5hL3ZhbHZlcy9DZXJ0aWZpY2F0ZXNWYWx2ZS5qYXZhIgorICAgICAgIHVubGVzcz0iY29tcGlsZS5qc3NlIi8+CisgICAgPC9qYXZhYz4KKworICAgIDwhLS0gQ29weSBzdGF0aWMgcmVzb3VyY2UgZmlsZXMgLS0+CisgICAgPGZpbHRlciB0b2tlbj0iVkVSU0lPTiIgdmFsdWU9IiR7dmVyc2lvbn0iLz4KKyAgICA8Y29weSB0b2Rpcj0iJHtjbGFzc2VzLmRpcn0iIGZpbHRlcmluZz0idHJ1ZSI+CisgICAgICA8ZmlsZXNldCBkaXI9InNyYy9zaGFyZSI+CisgICAgICAgIDxleGNsdWRlIG5hbWU9IioqLyouamF2YSIvPgorICAgICAgPC9maWxlc2V0PgorICAgIDwvY29weT4KKyAgPC90YXJnZXQ+CisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT0gQlVJTEQ6IEJ1aWxkIHRvbWNhdC1jb3lvdGUgPT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJidWlsZC10b21jYXQtY295b3RlIj4KKworICAgIDxhbnQgZGlyPSIke3RvbWNhdC1jb3lvdGUuaG9tZX0iIHRhcmdldD0iY29tcGlsZSI+CisgICAgICA8cHJvcGVydHkgbmFtZT0iY2F0YWxpbmEuaG9tZSIgdmFsdWU9IiR7Y2F0YWxpbmEuZGVwbG95fSIvPgorICAgICAgPHByb3BlcnR5IG5hbWU9InNlcnZsZXQuamFyIiAgIHZhbHVlPSIke3NlcnZsZXQtYXBpLmphcn0iLz4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjb21tb25zLWxvZ2dpbmcuamFyIiB2YWx1ZT0iJHtjb21tb25zLWxvZ2dpbmcuamFyfSIvPgorICAgICAgPHByb3BlcnR5IG5hbWU9ImNvbW1vbnMtbW9kZWxlci5qYXIiIHZhbHVlPSIke2NvbW1vbnMtbW9kZWxlci5qYXJ9Ii8+CisgICAgICA8cHJvcGVydHkgbmFtZT0iam14LmphciIgdmFsdWU9IiR7am14Lmphcn0iLz4KKyAgICA8L2FudD4KKworICAJPCEtLQorICAgIDxjb3B5IHRvZGlyPSIke2NhdGFsaW5hLmRlcGxveX0vc2VydmVyL2xpYiIKKyAgICAgICAgICAgZmlsZT0iJHt0b21jYXQtY295b3RlLmphcn0iLz4KKyAgICAtLT4KKworICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT0gQlVJTEQ6IEJ1aWxkIHRvbWNhdC1qayA9PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iYnVpbGQtdG9tY2F0LWprIj4KKworICAgIDxhbnQgZGlyPSIke3RvbWNhdC1qay5ob21lfSIgdGFyZ2V0PSJidWlsZC1tYWluIj4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0b21jYXQ1LmhvbWUiIHZhbHVlPSIke2NhdGFsaW5hLmRlcGxveX0iLz4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjb21tb25zLWxvZ2dpbmcuamFyIiB2YWx1ZT0iJHtjb21tb25zLWxvZ2dpbmcuamFyfSIvPgorICAgICAgPHByb3BlcnR5IG5hbWU9ImNvbW1vbnMtbW9kZWxlci5qYXIiIHZhbHVlPSIke2NvbW1vbnMtbW9kZWxlci5qYXJ9Ii8+CisgICAgICA8cHJvcGVydHkgbmFtZT0iam14LmphciIgdmFsdWU9IiR7am14Lmphcn0iLz4KKyAgICA8L2FudD4KKworICAJPCEtLQorICAgIDxjb3B5IHRvZmlsZT0iJHtjYXRhbGluYS5kZXBsb3l9L3NlcnZlci9saWIvdG9tY2F0LWFqcC5qYXIiCisgICAgICAgICAgICBmaWxlPSIke3RvbWNhdC1qazIuamFyfSIvPgorICAgIC0tPgorICAJPCEtLQorICAgIDxjb3B5IHRvZGlyPSIke2NhdGFsaW5hLmRlcGxveX0vY29uZiIKKyAgICAgICAgICAgZmlsZT0iJHtqazIucHJvcGVydGllc30iLz4KKyAgICAtLT4KKworICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT0gQlVJTEQ6IEJ1aWxkIHRvbWNhdC1jb3lvdGUtaHR0cDExID09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iYnVpbGQtdG9tY2F0LWh0dHAxMSI+CisKKyAgICA8YW50IGRpcj0iJHt0b21jYXQtaHR0cDExLmhvbWV9IiB0YXJnZXQ9ImNvbXBpbGUiPgorICAgICAgPHByb3BlcnR5IG5hbWU9ImNvbW1vbnMtbG9nZ2luZy5qYXIiIHZhbHVlPSIke2NvbW1vbnMtbG9nZ2luZy5qYXJ9Ii8+CisgICAgICA8cHJvcGVydHkgbmFtZT0iY29tbW9ucy1tb2RlbGVyLmphciIgdmFsdWU9IiR7Y29tbW9ucy1tb2RlbGVyLmphcn0iLz4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJqbXguamFyIiB2YWx1ZT0iJHtqbXguamFyfSIvPgorICAgIDwvYW50PgorICAJPCEtLQorICAgIDxjb3B5IHRvZGlyPSIke2NhdGFsaW5hLmRlcGxveX0vc2VydmVyL2xpYiIKKyAgICAgICAgICAgZmlsZT0iJHt0b21jYXQtaHR0cDExLmphcn0iLz4KKyAgICAtLT4KKworICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT0gQlVJTEQ6IENvbXBpbGUgQWxsIFNlcnZlciBDb21wb25lbnRzID09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iYnVpbGQtbWFpbiIgZGVwZW5kcz0iYnVpbGQtc3RhdGljLGJ1aWxkLXRvbWNhdC11dGlsLGJ1aWxkLWNhdGFsaW5hIj4KKyAgPC90YXJnZXQ+CisKKworICA8IS0tID09PT09PT09PT09PT09PT0gQlVJTEQ6IENyZWF0ZSBDYXRhbGluYSBKYXZhZG9jcyA9PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImphdmFkb2MiIHVubGVzcz0iZG9jcy51cHRvZGF0ZSIgPgorICAgIDxkZWxldGUgZGlyPSIke2NhdGFsaW5hLmJ1aWxkfS9qYXZhZG9jIi8+CisgICAgPG1rZGlyIGRpcj0iJHtjYXRhbGluYS5idWlsZH0vamF2YWRvYyIvPgorICAgIDxqYXZhZG9jIHBhY2thZ2VuYW1lcz0ib3JnLmFwYWNoZS4qIgorICAgICAgY2xhc3NwYXRocmVmPSJjYXRhbGluYS5jbGFzc3BhdGgiCisgICAgICBzb3VyY2VwYXRocmVmPSJqYXZhZG9jLnNvdXJjZXBhdGgiCisgICAgICBkZXN0ZGlyPSIke2NhdGFsaW5hLmJ1aWxkfS9qYXZhZG9jIgorICAgICAgYXV0aG9yPSJ0cnVlIgorICAgICAgdmVyc2lvbj0idHJ1ZSIKKyAgICAgIHdpbmRvd3RpdGxlPSJUb21jYXQgQVBJIERvY3VtZW50YXRpb24iCisgICAgICBkb2N0aXRsZT0iVG9tY2F0IEFQSSIKKyAgICAgIGJvdHRvbT0iQ29weXJpZ2h0ICYjMTY5OyAyMDAwLTIwMDQgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgUmlnaHRzIFJlc2VydmVkLiIKKyAgICAgIGFkZGl0aW9uYWxwYXJhbT0iLWJyZWFraXRlcmF0b3IiCisgICAgLz4KKyAgPC90YXJnZXQ+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09IEJVSUxEOiBDbGVhbiBEaXJlY3RvcnkgPT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImJ1aWxkLWNsZWFuIj4KKworICAgIDxkZWxldGUgZGlyPSIke2NhdGFsaW5hLmJ1aWxkfSIvPgorCisgICAgPGFudCBkaXI9IiR7dG9tY2F0LXV0aWwuaG9tZX0iIHRhcmdldD0iY2xlYW4iLz4KKyAgICA8YW50IGRpcj0iJHt0b21jYXQtY295b3RlLmhvbWV9IiB0YXJnZXQ9ImNsZWFuIi8+CisgICAgPGFudCBkaXI9IiR7dG9tY2F0LWprLmhvbWV9IiB0YXJnZXQ9ImNsZWFuIi8+CisgICAgPGFudCBkaXI9IiR7dG9tY2F0LWh0dHAxMS5ob21lfSIgdGFyZ2V0PSJjbGVhbiIvPgorCisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PSBCVUlMRDogUmVidWlsZCBFdmVyeXRoaW5nID09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJhbGwiIGRlcGVuZHM9ImJ1aWxkLWNsZWFuLGJ1aWxkLW1haW4iCisgICBkZXNjcmlwdGlvbj0iQ2xlYW4sIGJ1aWxkLCBhbmQgZGVwbG95IENhdGFsaW5hIGNvbXBvbmVudCIvPgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09IFRFU1Q6IENvbXBpbGUgVW5pdCBUZXN0cyA9PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJidWlsZC10ZXN0cyIgZGVwZW5kcz0iYnVpbGQtbWFpbiIgaWY9Imp1bml0LnByZXNlbnQiPgorICAgIDxta2RpciAgICAgIGRpcj0iJHtjYXRhbGluYS5idWlsZH0vdGVzdHMiLz4KKyAgICA8IS0tIENvbXBpbGUgdW5pdCB0ZXN0IGNsYXNzZXMgLS0+CisgICAgPGphdmFjIHNyY2Rpcj0ic3JjL3Rlc3QiIGRlc3RkaXI9IiR7Y2F0YWxpbmEuYnVpbGR9L3Rlc3RzIgorICAgICAgICAgICBkZXByZWNhdGlvbj0iJHtjb21waWxlLmRlcHJlY2F0aW9ufSIKKyAgICAgICAgICAgZGVidWc9IiR7Y29tcGlsZS5kZWJ1Z30iCisgICAgICAgICAgIG9wdGltaXplPSJvZmYiCisgICAgICAgICAgIHNvdXJjZT0iJHtjb21waWxlLnNvdXJjZX0iCisgICAgICAgICAgIGV4Y2x1ZGVzPSIqKi9DVlMvKioiPgorICAgICAgPGNsYXNzcGF0aCByZWZpZD0idGVzdC5jbGFzc3BhdGgiLz4KKyAgICA8L2phdmFjPgorICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT0gVEVTVDogRXhlY3V0ZSBVbml0IFRlc3RzID09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0idGVzdCIgaWY9Imp1bml0LnByZXNlbnQiCisgICBkZXNjcmlwdGlvbj0iUnVuIGFsbCB1bml0IHRlc3QgY2FzZXMiCisgICBkZXBlbmRzPSJidWlsZC10ZXN0cyx0ZXN0LWRpci1jb250ZXh0LHRlc3QtdXRpbCI+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdC1kaXItY29udGV4dCIgaWY9Imp1bml0LnByZXNlbnQiPgorCisgICAgPGVjaG8gbWVzc2FnZT0iUnVubmluZyBGaWxlRGlyQ29udGV4dCB0ZXN0cyIvPgorICAgIDxqYXZhIGNsYXNzbmFtZT0iJHt0ZXN0LnJ1bm5lcn0iIGZvcms9InllcyIKKyAgICAgICAgZmFpbG9uZXJyb3I9IiR7dGVzdC5mYWlsb25lcnJvcn0iPgorICAgICAgPHN5c3Byb3BlcnR5IGtleT0iZG9jLmJhc2UiIHZhbHVlPSIke3Rlc3Qud2ViYXBwfSIvPgorICAgICAgPGFyZyB2YWx1ZT0ib3JnLmFwYWNoZS5uYW1pbmcucmVzb3VyY2VzLkZpbGVEaXJDb250ZXh0VGVzdENhc2UiLz4KKyAgICAgIDxjbGFzc3BhdGggcmVmaWQ9InRlc3QuY2xhc3NwYXRoIi8+CisgICAgPC9qYXZhPgorCisgICAgPGVjaG8gbWVzc2FnZT0iUnVubmluZyBXQVJEaXJDb250ZXh0IHRlc3RzIi8+CisgICAgPGphciBqYXJmaWxlPSIke3Rlc3Qud2ViYXBwLndhcn0iPgorICAgICAgPGZpbGVzZXQgZGlyPSIke3Rlc3Qud2ViYXBwfSIvPgorICAgIDwvamFyPgorICAgIDxqYXZhIGNsYXNzbmFtZT0iJHt0ZXN0LnJ1bm5lcn0iIGZvcms9InllcyIKKyAgICAgICAgZmFpbG9uZXJyb3I9IiR7dGVzdC5mYWlsb25lcnJvcn0iPgorICAgICAgPHN5c3Byb3BlcnR5IGtleT0iZG9jLmJhc2UiIHZhbHVlPSIke3Rlc3Qud2ViYXBwLndhcn0iLz4KKyAgICAgIDxhcmcgdmFsdWU9Im9yZy5hcGFjaGUubmFtaW5nLnJlc291cmNlcy5XQVJEaXJDb250ZXh0VGVzdENhc2UiLz4KKyAgICAgIDxjbGFzc3BhdGggcmVmaWQ9InRlc3QuY2xhc3NwYXRoIi8+CisgICAgPC9qYXZhPgorICAgIDxkZWxldGUgZmlsZT0iJHt0ZXN0LndlYmFwcC53YXJ9Ii8+CisKKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0LXV0aWwiIGlmPSJqdW5pdC5wcmVzZW50Ij4KKworICAgIDxlY2hvIG1lc3NhZ2U9IlJ1bm5pbmcgQ29va2llVG9vbHMgdGVzdHMiLz4KKyAgICA8amF2YSBjbGFzc25hbWU9IiR7dGVzdC5ydW5uZXJ9IiBmb3JrPSJ5ZXMiCisgICAgICAgIGZhaWxvbmVycm9yPSIke3Rlc3QuZmFpbG9uZXJyb3J9Ij4KKyAgICAgIDxhcmcgdmFsdWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5Db29raWVUb29sc1Rlc3RDYXNlIi8+CisgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJ0ZXN0LmNsYXNzcGF0aCIvPgorICAgIDwvamF2YT4KKworICAgIDxlY2hvIG1lc3NhZ2U9IlJ1bm5pbmcgVVJMIHRlc3RzIi8+CisgICAgPGphdmEgY2xhc3NuYW1lPSIke3Rlc3QucnVubmVyfSIgZm9yaz0ieWVzIgorICAgICAgICBmYWlsb25lcnJvcj0iJHt0ZXN0LmZhaWxvbmVycm9yfSI+CisgICAgICA8YXJnIHZhbHVlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuVVJMVGVzdENhc2UiLz4KKyAgICAgIDxjbGFzc3BhdGggcmVmaWQ9InRlc3QuY2xhc3NwYXRoIi8+CisgICAgPC9qYXZhPgorCisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09IERFUExPWTogQ3JlYXRlIERpcmVjdG9yaWVzID09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJkZXBsb3ktcHJlcGFyZSI+CisgICAgPG1rZGlyIGRpcj0iJHtjYXRhbGluYS5kZXBsb3l9Ii8+CisgICAgPG1rZGlyIGRpcj0iJHtjYXRhbGluYS5kZXBsb3l9L2JpbiIvPgorICAgIDxta2RpciBkaXI9IiR7Y2F0YWxpbmEuZGVwbG95fS9jb25mIi8+CisgICAgPG1rZGlyIGRpcj0iJHtjYXRhbGluYS5kZXBsb3l9L2xvZ3MiLz4KKyAgICA8bWtkaXIgZGlyPSIke2NhdGFsaW5hLmRlcGxveX0vY29tbW9uL2NsYXNzZXMiLz4KKyAgICA8bWtkaXIgZGlyPSIke2NhdGFsaW5hLmRlcGxveX0vY29tbW9uL2VuZG9yc2VkIi8+CisgICAgPG1rZGlyIGRpcj0iJHtjYXRhbGluYS5kZXBsb3l9L2NvbW1vbi9pMThuIi8+CisgICAgPG1rZGlyIGRpcj0iJHtjYXRhbGluYS5kZXBsb3l9L2NvbW1vbi9saWIiLz4KKyAgICA8bWtkaXIgZGlyPSIke2NhdGFsaW5hLmRlcGxveX0vc2VydmVyL2NsYXNzZXMiLz4KKyAgICA8bWtkaXIgZGlyPSIke2NhdGFsaW5hLmRlcGxveX0vc2VydmVyL2xpYiIvPgorICAgIDxta2RpciBkaXI9IiR7Y2F0YWxpbmEuZGVwbG95fS93b3JrIi8+CisgICAgPG1rZGlyIGRpcj0iJHtjYXRhbGluYS5kZXBsb3l9L3RlbXAiLz4KKyAgPC90YXJnZXQ+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PT0gREVQTE9ZOiBDb3B5IFN0YXRpYyBGaWxlcyA9PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImRlcGxveS1zdGF0aWMiIGRlcGVuZHM9ImJ1aWxkLW1haW4sZGVwbG95LXByZXBhcmUsZGVwbG95LXN0YXRpYy1vbmx5LGRlcGxveS1saWJzIi8+CisKKyAgPHRhcmdldCBuYW1lPSJkZXBsb3ktc3RhdGljLW9ubHkiIGRlcGVuZHM9ImRlcGxveS1wcmVwYXJlIj4KKworICAgIDwhLS0gRXhlY3V0YWJsZSBDb21tYW5kcyAtLT4KKyAgICA8Y29weSB0b2Rpcj0iJHtjYXRhbGluYS5kZXBsb3l9L2JpbiI+CisgICAgICA8ZmlsZXNldCBkaXI9InNyYy9iaW4iIGV4Y2x1ZGVzPSIqLXVzaW5nLWxhdW5jaGVyLiosbGF1bmNoZXIucHJvcGVydGllcyxjYXRhbGluYS54bWwiIC8+CisgICAgPC9jb3B5PgorICAgIDxmaXhjcmxmIHNyY2Rpcj0iJHtjYXRhbGluYS5kZXBsb3l9L2JpbiIgaW5jbHVkZXM9Iiouc2giICBlb2w9ImxmIi8+CisgICAgPGZpeGNybGYgc3JjZGlyPSIke2NhdGFsaW5hLmRlcGxveX0vYmluIiBpbmNsdWRlcz0iKi5iYXQiIGVvbD0iY3JsZiIvPgorICAgIDxjaG1vZCBwZXJtPSIreCIgZGlyPSIke2NhdGFsaW5hLmJ1aWxkfS9iaW4iIGluY2x1ZGVzPSIqLnNoIi8+CisKKyAgICA8IS0tIENvbmZpZ3VyYXRpb24gRmlsZXMgLS0+CisgICAgPGNvcHkgdG9kaXI9IiR7Y2F0YWxpbmEuZGVwbG95fS9jb25mIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHtjYXRhbGluYS5idWlsZH0vY29uZiIgLz4KKyAgICA8L2NvcHk+CisKKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJkZXBsb3ktbGlicyI+CisKKyAgICA8IS0tIENvbW1vbiBFeHRlbnNpb25zIC0tPgorICAgIDxjb3B5IHRvZGlyPSIke2NhdGFsaW5hLmRlcGxveX0vY29tbW9uL2VuZG9yc2VkIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHtjYXRhbGluYS5idWlsZH0vY29tbW9uL2VuZG9yc2VkIiAvPgorICAgIDwvY29weT4KKworICAgIDxjb3B5IHRvZGlyPSIke2NhdGFsaW5hLmRlcGxveX0vY29tbW9uL2xpYiI+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7Y2F0YWxpbmEuYnVpbGR9L2NvbW1vbi9saWIiIC8+CisgICAgPC9jb3B5PgorCisgICAgPCEtLSBTZXJ2ZXIgQ29tcG9uZW50cyAtLT4KKyAgICA8Y29weSB0b2Rpcj0iJHtjYXRhbGluYS5kZXBsb3l9L3NlcnZlci9saWIiPgorICAgICAgPGZpbGVzZXQgZGlyPSIke2NhdGFsaW5hLmJ1aWxkfS9zZXJ2ZXIvbGliIiAvPgorICAgIDwvY29weT4KKworICAgIDwhLS0gU2hhcmVkIEV4dGVuc2lvbnMgLS0+Cis8IS0tCisgICAgPGNvcHkgdG9kaXI9IiR7Y2F0YWxpbmEuZGVwbG95fS9zaGFyZWQvbGliIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHtjYXRhbGluYS5idWlsZH0vc2hhcmVkL2xpYiIgLz4KKyAgICA8L2NvcHk+CistLT4KKyAgPC90YXJnZXQ+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PT0gREVQTE9ZOiBDcmVhdGUgQ2F0YWxpbmEgSkFScyA9PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImNhdGFsaW5hLWphcnMiIGRlcGVuZHM9ImJ1aWxkLXN0YXRpYyxkZXBsb3ktcHJlcGFyZSxmbGFncyxmbGFncy5kaXNwbGF5LGJ1aWxkLWNhdGFsaW5hIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJCdWlsZCBjYXRhbGluYSBqYXJzIj4KKworICAgIDwhLS0gQ2F0YWxpbmEgQm9vdHN0cmFwIEpBUiBGaWxlLiBJdCBpcyBhIHZlcnkgd3JvbmcgaWRlYSB0byBzcGxpdCBwYWNrYWdlcyBpbiBtdWx0aXBsZSBqYXJzICEhISAtLT4KKyAgICA8amFyIGphcmZpbGU9IiR7Y2F0YWxpbmEuZGVwbG95fS9iaW4vYm9vdHN0cmFwLmphciIgCisgICAgICAgICBtYW5pZmVzdD0iZXRjL2Jvb3RzdHJhcC5NRiI+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7Y2xhc3Nlcy5kaXJ9Ij4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9jYXRhbGluYS9zdGFydHVwL0Jvb3RzdHJhcC5jbGFzcyIgLz4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9jYXRhbGluYS9zdGFydHVwL2NhdGFsaW5hLnByb3BlcnRpZXMiIC8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9DYXRhbGluYVByb3BlcnRpZXMuY2xhc3MiIC8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9DbGFzc0xvYWRlckZhY3RvcnkuY2xhc3MiIC8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9Ub29sLmNsYXNzIiAvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2NhdGFsaW5hL2xvYWRlci9TdGFuZGFyZENsYXNzTG9hZGVyKi5jbGFzcyIgLz4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9jYXRhbGluYS9sb2FkZXIvRXh0ZW5zaW9uLmNsYXNzIiAvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2NhdGFsaW5hL2xvYWRlci9SZWxvYWRlci5jbGFzcyIgLz4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9jYXRhbGluYS9zZWN1cml0eS9TZWN1cml0eUNsYXNzTG9hZC5jbGFzcyIgLz4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9jYXRhbGluYS9sYXVuY2hlci9DYXRhbGluYUxhdW5jaEZpbHRlci5jbGFzcyIgLz4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9uYW1pbmcvSm5kaVBlcm1pc3Npb24uY2xhc3MiIC8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvdG9tY2F0L3V0aWwvY29tcGF0LyoiIC8+CisKKyAgICAgIAk8IS0tIEphdmFkb2MgYW5kIGkxOG4gZXhjbHVzaW9ucyAtLT4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKiovcGFja2FnZS5odG1sIiAvPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi9Mb2NhbFN0cmluZ3NfKiIgLz4KKyAgICAgIDwvZmlsZXNldD4KKyAgICA8L2phcj4KKworICAgIDwhLS0gQ2F0YWxpbmEgTWFpbiBKQVIgRmlsZSAtLT4KKyAgICA8IS0tIEV4Y2x1ZGluZyBmaWxlcyBmcm9tIGhlcmUgaXMgd29yc2UgdGhhbiBkdXBsaWNhdGluZyB0aGVtIC0gYSBsb2FkZXIgdGhhdCB1c2VzIHRoZQorICAgICAgICAgcGFja2FnZSBuYW1lIGFzIGluZGV4IGFuZCBpbmNsdWRlcyBib3RoIGJvb3RzdHJhcCBhbmQgY2F0YWxpbmEgd2lsbCBiZSBjb25mdXNlZCAtLT4KKworICAgIDxqYXIgamFyZmlsZT0iJHtjYXRhbGluYS5kZXBsb3l9L3NlcnZlci9saWIvY2F0YWxpbmEuamFyIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHtjbGFzc2VzLmRpcn0iPgorCisgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvY2F0YWxpbmEvKioiIC8+CisKKyAgICAgICAgPCEtLSBKYXZhZG9jIGFuZCBpMThuIGV4Y2x1c2lvbnMgLS0+CisgICAgICAgIDxleGNsdWRlIG5hbWU9IioqL3BhY2thZ2UuaHRtbCIgLz4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKiovTG9jYWxTdHJpbmdzXyoiIC8+CisKKyAgICAgICAgPCEtLSBNb2R1bGVzIC0tPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2NhdGFsaW5hL2FudC8qKiIgLz4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyLyoqIiAvPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2NhdGFsaW5hL2xhdW5jaGVyLyoqIiAvPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2NhdGFsaW5hL3NlcnZsZXRzLyoqIiAvPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvQm9vdHN0cmFwLmNsYXNzIiAvPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2NhdGFsaW5hL3NzaS8qKiIgLz4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9uYW1pbmcvKioiIC8+CisKKyAgICAgICAgPCEtLSBDYXRhbGluYS1vcHRpb25hbCBjbGFzc2VzIC0tPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2NhdGFsaW5hL3JlYWxtL0RhdGFTb3VyY2VSZWFsbS5jbGFzcyIgLz4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9jYXRhbGluYS9yZWFsbS9KQUFTKiIgLz4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9jYXRhbGluYS9yZWFsbS9KREJDKiIgLz4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9jYXRhbGluYS9yZWFsbS9KTkRJKiIgLz4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9jYXRhbGluYS9yZWFsbS9NZW1vcnkqIiAvPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2NhdGFsaW5hL3Nlc3Npb24vU3RvcmVCYXNlLmNsYXNzIiAvPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2NhdGFsaW5hL3Nlc3Npb24vKlN0b3JlLmNsYXNzIiAvPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2NhdGFsaW5hL3Nlc3Npb24vUGVyc2lzdGVudE1hbmFnZXIqIiAvPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvQ0dJUHJvY2Vzc0Vudmlyb25tZW50LmNsYXNzIiAvPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvQ29va2llVG9vbHMuY2xhc3MiIC8+CisgICAgICAgIDxleGNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9EYXRlVG9vbC5jbGFzcyIgLz4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL0RPTVdyaXRlci5jbGFzcyIgLz4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL0Zhc3REYXRlRm9ybWF0LmNsYXNzIiAvPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvSU9Ub29scy5jbGFzcyIgLz4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL01JTUUySmF2YS5jbGFzcyIgLz4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL1Byb2Nlc3MqIiAvPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvUXVldWUuY2xhc3MiIC8+CisgICAgICAgIDxleGNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9TdHJmdGltZS5jbGFzcyIgLz4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL1hNTFdyaXRlci5jbGFzcyIgLz4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9jYXRhbGluYS92YWx2ZXMvRXh0ZW5kZWRBY2Nlc3NMb2dWYWx2ZS5jbGFzcyIgLz4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9jYXRhbGluYS92YWx2ZXMvRmllbGRJbmZvLmNsYXNzIiAvPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2NhdGFsaW5hL3ZhbHZlcy9KREJDQWNjZXNzTG9nVmFsdmUuY2xhc3MiIC8+CisgICAgICAgIDxleGNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvY2F0YWxpbmEvdmFsdmVzL1BlcnNpc3RlbnRWYWx2ZS5jbGFzcyIgLz4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9jYXRhbGluYS92YWx2ZXMvUmVtb3RlKiIgLz4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9jYXRhbGluYS92YWx2ZXMvUmVxdWVzdER1bXBlclZhbHZlLmNsYXNzIiAvPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2NhdGFsaW5hL3ZhbHZlcy9SZXF1ZXN0RmlsdGVyVmFsdmUuY2xhc3MiIC8+CisKKyAgICAgIDwvZmlsZXNldD4KKyAgICA8L2phcj4KKworICAgIDxqYXIgamFyZmlsZT0iJHtjYXRhbGluYS5kZXBsb3l9L3NlcnZlci9saWIvY2F0YWxpbmEtb3B0aW9uYWwuamFyIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHtjbGFzc2VzLmRpcn0iPgorCisgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvY2F0YWxpbmEvcmVhbG0vRGF0YVNvdXJjZVJlYWxtLmNsYXNzIiAvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2NhdGFsaW5hL3JlYWxtL0pBQVMqIiAvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2NhdGFsaW5hL3JlYWxtL0pEQkMqIiAvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2NhdGFsaW5hL3JlYWxtL0pOREkqIiAvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2NhdGFsaW5hL3JlYWxtL01lbW9yeSoiIC8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvY2F0YWxpbmEvc2Vzc2lvbi9TdG9yZUJhc2UuY2xhc3MiIC8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvY2F0YWxpbmEvc2Vzc2lvbi8qU3RvcmUuY2xhc3MiIC8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvY2F0YWxpbmEvc2Vzc2lvbi9QZXJzaXN0ZW50TWFuYWdlcioiIC8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9DR0lQcm9jZXNzRW52aXJvbm1lbnQuY2xhc3MiIC8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9Db29raWVUb29scy5jbGFzcyIgLz4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL0RhdGVUb29sLmNsYXNzIiAvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvRE9NV3JpdGVyLmNsYXNzIiAvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvRmFzdERhdGVGb3JtYXQuY2xhc3MiIC8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9JT1Rvb2xzLmNsYXNzIiAvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvTUlNRTJKYXZhLmNsYXNzIiAvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvUHJvY2VzcyoiIC8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9RdWV1ZS5jbGFzcyIgLz4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL1N0cmZ0aW1lLmNsYXNzIiAvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvWE1MV3JpdGVyLmNsYXNzIiAvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2NhdGFsaW5hL3ZhbHZlcy9FeHRlbmRlZEFjY2Vzc0xvZ1ZhbHZlLmNsYXNzIiAvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2NhdGFsaW5hL3ZhbHZlcy9GaWVsZEluZm8uY2xhc3MiIC8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvY2F0YWxpbmEvdmFsdmVzL0pEQkNBY2Nlc3NMb2dWYWx2ZS5jbGFzcyIgLz4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9jYXRhbGluYS92YWx2ZXMvUGVyc2lzdGVudFZhbHZlLmNsYXNzIiAvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2NhdGFsaW5hL3ZhbHZlcy9SZW1vdGUqIiAvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2NhdGFsaW5hL3ZhbHZlcy9SZXF1ZXN0RHVtcGVyVmFsdmUuY2xhc3MiIC8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvY2F0YWxpbmEvdmFsdmVzL1JlcXVlc3RGaWx0ZXJWYWx2ZS5jbGFzcyIgLz4KKworICAgICAgICA8IS0tIEphdmFkb2MgYW5kIGkxOG4gZXhjbHVzaW9ucyAtLT4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKiovcGFja2FnZS5odG1sIiAvPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi9Mb2NhbFN0cmluZ3NfKiIgLz4KKworICAgICAgPC9maWxlc2V0PgorICAgIDwvamFyPgorCisgICAgPCEtLSBDYXRhbGluYSBBbnQgVGFza3MgSkFSIEZpbGUgLS0+CisgICAgPGphciBqYXJmaWxlPSIke2NhdGFsaW5hLmRlcGxveX0vc2VydmVyL2xpYi9jYXRhbGluYS1hbnQuamFyIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHtjbGFzc2VzLmRpcn0iPgorICAgICAgICAKKyAgICAgIAk8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2NhdGFsaW5hL2FudC8qKiIgLz4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL0Jhc2U2NC5jbGFzcyIgLz4KKworICAgICAgCTwhLS0gSmF2YWRvYyBhbmQgaTE4biBleGNsdXNpb25zIC0tPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi9wYWNrYWdlLmh0bWwiIC8+CisgICAgICAgIDxleGNsdWRlIG5hbWU9IioqL0xvY2FsU3RyaW5nc18qIiAvPgorICAgICAgCQorICAgICAgPC9maWxlc2V0PgorICAgIDwvamFyPgorCisgICAgPCEtLSBOYW1pbmcgLSBGYWN0b3J5IEpBUiBGaWxlIC0tPgorICAgIDxqYXIgamFyZmlsZT0iJHtjYXRhbGluYS5kZXBsb3l9L2NvbW1vbi9saWIvbmFtaW5nLWZhY3RvcnkuamFyIiBpbmRleD0idHJ1ZSI+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7Y2xhc3Nlcy5kaXJ9Ij4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9uYW1pbmcvKioiIC8+CisgICAgICAgIDxleGNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvbmFtaW5nL3Jlc291cmNlcy8qKiIgLz4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9uYW1pbmcvSm5kaVBlcm1pc3Npb24uY2xhc3MiIC8+CisgICAgICAJPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9uYW1pbmcvTmFtZVBhcnNlckltcGwuY2xhc3MiIC8+CisgICAgICAJPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9uYW1pbmcvTmFtaW5nQ29udGV4dEJpbmRpbmdzRW51bWVyYXRpb24uY2xhc3MiIC8+CisgICAgICAJPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9uYW1pbmcvTmFtaW5nQ29udGV4dEVudW1lcmF0aW9uLmNsYXNzIiAvPgorICAgICAgCTxleGNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvbmFtaW5nL05hbWluZ0VudHJ5LmNsYXNzIiAvPgorICAgICAgCTxleGNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvbmFtaW5nL1N0cmluZ01hbmFnZXIuY2xhc3MiIC8+CisgICAgICAgIDwhLS0gSmF2YWRvYyBhbmQgaTE4biBleGNsdXNpb25zIC0tPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi9wYWNrYWdlLmh0bWwiIC8+CisgICAgICAgIDxleGNsdWRlIG5hbWU9IioqL0xvY2FsU3RyaW5nc18qIiAvPgorICAgICAgPC9maWxlc2V0PgorICAgIDwvamFyPgorCisgICAgPCEtLSBOYW1pbmcgLSBSZXNvdXJjZXMgSkFSIEZpbGUgLS0+CisgICAgPGphciBqYXJmaWxlPSIke2NhdGFsaW5hLmRlcGxveX0vY29tbW9uL2xpYi9uYW1pbmctcmVzb3VyY2VzLmphciIgaW5kZXg9InRydWUiPgorICAgICAgPGZpbGVzZXQgZGlyPSIke2NsYXNzZXMuZGlyfSI+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvbmFtaW5nL0puZGlQZXJtaXNzaW9uLmNsYXNzIiAvPgorICAgICAgCTxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvbmFtaW5nL05hbWVQYXJzZXJJbXBsLmNsYXNzIiAvPgorICAgICAgCTxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvbmFtaW5nL05hbWluZ0NvbnRleHRCaW5kaW5nc0VudW1lcmF0aW9uLmNsYXNzIiAvPgorICAgICAgCTxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvbmFtaW5nL05hbWluZ0NvbnRleHRFbnVtZXJhdGlvbi5jbGFzcyIgLz4KKyAgICAgIAk8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL25hbWluZy9OYW1pbmdFbnRyeS5jbGFzcyIgLz4KKyAgICAgIAk8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL25hbWluZy9TdHJpbmdNYW5hZ2VyLmNsYXNzIiAvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL25hbWluZy9yZXNvdXJjZXMvKioiIC8+CisgICAgICAgIDwhLS0gSmF2YWRvYyBhbmQgaTE4biBleGNsdXNpb25zIC0tPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi9wYWNrYWdlLmh0bWwiIC8+CisgICAgICAgIDxleGNsdWRlIG5hbWU9IioqL0xvY2FsU3RyaW5nc18qIiAvPgorICAgICAgPC9maWxlc2V0PgorICAgIDwvamFyPgorCisgICAgPCEtLSBTZXJ2bGV0cyAtIENHSSBTZXJ2bGV0IC0tPgorICAgIDxqYXIgamFyZmlsZT0iJHtjYXRhbGluYS5kZXBsb3l9L3NlcnZlci9saWIvc2VydmxldHMtY2dpLnJlbmFtZXRvamFyIiBpbmRleD0idHJ1ZSI+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7Y2xhc3Nlcy5kaXJ9Ij4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9jYXRhbGluYS9zZXJ2bGV0cy9DR0kqIiAvPgorICAgICAgPC9maWxlc2V0PgorICAgIDwvamFyPgorCisgICAgPCEtLSBTZXJ2bGV0cyAtIERlZmF1bHQgRmlsZS1TZXJ2aW5nIFNlcnZsZXQgLS0+CisgICAgPGphciBqYXJmaWxlPSIke2NhdGFsaW5hLmRlcGxveX0vc2VydmVyL2xpYi9zZXJ2bGV0cy1kZWZhdWx0LmphciIgaW5kZXg9InRydWUiPgorICAgICAgPGZpbGVzZXQgZGlyPSIke2NsYXNzZXMuZGlyfSI+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvY2F0YWxpbmEvc2VydmxldHMvRGVmYXVsdCoiIC8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvY2F0YWxpbmEvc2VydmxldHMvQ29uc3RhbnRzLmNsYXNzIiAvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2NhdGFsaW5hL3NlcnZsZXRzL0xvY2FsU3RyaW5ncy5wcm9wZXJ0aWVzIiAvPgorICAgICAgPC9maWxlc2V0PgorICAgIDwvamFyPgorCisgICAgPCEtLSBTZXJ2bGV0cyAtIEludm9rZXIgU2VydmxldCAtLT4KKyAgICA8amFyIGphcmZpbGU9IiR7Y2F0YWxpbmEuZGVwbG95fS9zZXJ2ZXIvbGliL3NlcnZsZXRzLWludm9rZXIuamFyIiBpbmRleD0idHJ1ZSI+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7Y2xhc3Nlcy5kaXJ9Ij4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9jYXRhbGluYS9zZXJ2bGV0cy9JbnZva2VyKiIgLz4KKyAgICAgIDwvZmlsZXNldD4KKyAgICA8L2phcj4KKworICAgIDwhLS0gU2VydmxldHMgLSBTU0kgU2VydmxldCAtLT4KKyAgICA8amFyIGphcmZpbGU9IiR7Y2F0YWxpbmEuZGVwbG95fS9zZXJ2ZXIvbGliL3NlcnZsZXRzLXNzaS5yZW5hbWV0b2phciIgaW5kZXg9InRydWUiPgorICAgICAgPGZpbGVzZXQgZGlyPSIke2NsYXNzZXMuZGlyfSI+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvY2F0YWxpbmEvc3NpLyoqIiAvPgorICAgICAgICA8IS0tIEphdmFkb2MgYW5kIGkxOG4gZXhjbHVzaW9ucyAtLT4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKiovcGFja2FnZS5odG1sIiAvPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi9Mb2NhbFN0cmluZ3NfKiIgLz4KKyAgICAgIDwvZmlsZXNldD4KKyAgICA8L2phcj4KKworICAgIDwhLS0gU2VydmxldHMgLSBXZWJkYXYgU2VydmxldCAtLT4KKyAgICA8amFyIGphcmZpbGU9IiR7Y2F0YWxpbmEuZGVwbG95fS9zZXJ2ZXIvbGliL3NlcnZsZXRzLXdlYmRhdi5qYXIiIGluZGV4PSJ0cnVlIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHtjbGFzc2VzLmRpcn0iPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2NhdGFsaW5hL3NlcnZsZXRzL1dlYmRhdioiIC8+CisgICAgICA8L2ZpbGVzZXQ+CisgICAgPC9qYXI+CisKKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJkZXBsb3ktY2F0YWxpbmEiIGRlcGVuZHM9ImRlcGxveS1zdGF0aWMsYnVpbGQtbWFpbixjYXRhbGluYS1qYXJzIgorICAgZGVzY3JpcHRpb249IkJ1aWxkIGFuZCBkZXBsb3kgQ2F0YWxpbmEgY29tcG9uZW50Ij4KKyAgPC90YXJnZXQ+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PT0gREVQTE9ZOiBDcmVhdGUgQ2F0YWxpbmEgSkFScyA9PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImRlcGxveSIgZGVwZW5kcz0iZGVwbG95LWNhdGFsaW5hLGJ1aWxkLXRvbWNhdC1jb3lvdGUsYnVpbGQtdG9tY2F0LWprLGJ1aWxkLXRvbWNhdC1odHRwMTEiCisgICBkZXNjcmlwdGlvbj0iQnVpbGQgYW5kIGRlcGxveSBDYXRhbGluYSI+CisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09IERJU1Q6IENyZWF0ZSBEaXN0cmlidXRpb24gPT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJkaXN0IiBkZXBlbmRzPSJidWlsZC1tYWluIgorICAgZGVzY3JpcHRpb249IkNyZWF0ZSBiaW5hcnkgZGlzdHJpYnV0aW9uIj4KKworICAgIDwhLS0gRXhlY3V0YWJsZSBDb21tYW5kcyAtLT4KKyAgICA8bWtkaXIgZGlyPSIke2NhdGFsaW5hLmRpc3R9L2JpbiIvPgorICAgIDxjb3B5IHRvZGlyPSIke2NhdGFsaW5hLmRpc3R9L2JpbiI+CisgICAgICA8ZmlsZXNldCBkaXI9InNyYy9iaW4iIGV4Y2x1ZGVzPSIqLXVzaW5nLWxhdW5jaGVyLiosbGF1bmNoZXIucHJvcGVydGllcyxjYXRhbGluYS54bWwiIC8+CisgICAgPC9jb3B5PgorICAgIDxmaXhjcmxmIHNyY2Rpcj0iJHtjYXRhbGluYS5kaXN0fS9iaW4iIGluY2x1ZGVzPSIqLnNoIiBlb2w9ImxmIi8+CisgICAgPGZpeGNybGYgc3JjZGlyPSIke2NhdGFsaW5hLmRpc3R9L2JpbiIgaW5jbHVkZXM9IiouYmF0IiBlb2w9ImNybGYiLz4KKyAgICA8Y2htb2QgcGVybT0iK3giIGRpcj0iJHtjYXRhbGluYS5idWlsZH0vYmluIiBpbmNsdWRlcz0iKi5zaCIvPgorCisgICAgPCEtLSBDb21tb24gRXh0ZW5zaW9ucyAtLT4gICAgCisgICAgPG1rZGlyIGRpcj0iJHtjYXRhbGluYS5kaXN0fS9jb21tb24vY2xhc3NlcyIvPgorICAgIDxjb3B5IHRvZGlyPSIke2NhdGFsaW5hLmRpc3R9L2NvbW1vbi9jbGFzc2VzIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHtjYXRhbGluYS5idWlsZH0vY29tbW9uL2NsYXNzZXMiIC8+CisgICAgPC9jb3B5PgorICAgIDxta2RpciBkaXI9IiR7Y2F0YWxpbmEuZGlzdH0vY29tbW9uL2xpYiIvPgorICAgIDxjb3B5IHRvZGlyPSIke2NhdGFsaW5hLmRpc3R9L2NvbW1vbi9saWIiPgorICAgICAgPGZpbGVzZXQgZGlyPSIke2NhdGFsaW5hLmJ1aWxkfS9jb21tb24vbGliIiAvPgorICAgIDwvY29weT4KKworICAgIDwhLS0gQ29uZmlndXJhdGlvbiBGaWxlcyAtLT4KKyAgICA8bWtkaXIgZGlyPSIke2NhdGFsaW5hLmRpc3R9L2NvbmYiLz4KKyAgICA8Y29weSB0b2Rpcj0iJHtjYXRhbGluYS5kaXN0fS9jb25mIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHtjYXRhbGluYS5idWlsZH0vY29uZiIgLz4KKyAgICA8L2NvcHk+CisKKyAgICA8IS0tIFNlcnZlciBDb21wb25lbnRzIC0tPgorICAgIDxta2RpciBkaXI9IiR7Y2F0YWxpbmEuZGlzdH0vc2VydmVyL2NsYXNzZXMiLz4KKyAgICA8IS0tIERvIHdlIHdhbnQgdG8gY29weSB0aGUgY2xhc3NlcyA/IAorICAgIDxjb3B5IHRvZGlyPSIke2NhdGFsaW5hLmRpc3R9L3NlcnZlci9jbGFzc2VzIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHtjbGFzc2VzLmRpcn0iIC8+CisgICAgPC9jb3B5PgorICAgIC0tPgorICAgIDxta2RpciBkaXI9IiR7Y2F0YWxpbmEuZGlzdH0vc2VydmVyL2xpYiIvPgorICAgIDxjb3B5IHRvZGlyPSIke2NhdGFsaW5hLmRpc3R9L3NlcnZlci9saWIiPgorICAgICAgPGZpbGVzZXQgZGlyPSIke2NhdGFsaW5hLmJ1aWxkfS9zZXJ2ZXIvbGliIiAvPgorICAgIDwvY29weT4KKworICAgIDwhLS0gU2hhcmVkIEV4dGVuc2lvbnMgLS0+CisgICAgPG1rZGlyIGRpcj0iJHtjYXRhbGluYS5kaXN0fS9zaGFyZWQvY2xhc3NlcyIvPgorICAgIDxjb3B5IHRvZGlyPSIke2NhdGFsaW5hLmRpc3R9L3NoYXJlZC9jbGFzc2VzIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHtjYXRhbGluYS5idWlsZH0vc2hhcmVkL2NsYXNzZXMiIC8+CisgICAgPC9jb3B5PgorICAgIDxta2RpciBkaXI9IiR7Y2F0YWxpbmEuZGlzdH0vc2hhcmVkL2xpYiIvPgorICAgIDxjb3B5IHRvZGlyPSIke2NhdGFsaW5hLmRpc3R9L3NoYXJlZC9saWIiPgorICAgICAgPGZpbGVzZXQgZGlyPSIke2NhdGFsaW5hLmJ1aWxkfS9zaGFyZWQvbGliIiAvPgorICAgIDwvY29weT4KKworICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09IERJU1Q6IENsZWFuIERpcmVjdG9yeSA9PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iZGlzdC1jbGVhbiI+CisgICAgPGRlbGV0ZSBkaXI9IiR7Y2F0YWxpbmEuZGlzdH0iLz4KKyAgPC90YXJnZXQ+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PT0gQ29udmVuaWVudCBTeW5vbnltcyA9PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImNsZWFuIiBkZXBlbmRzPSJidWlsZC1jbGVhbiwgZGlzdC1jbGVhbiIKKyAgIGRlc2NyaXB0aW9uPSJDbGVhbiBidWlsZCBhbmQgZGlzdCBkaXJlY3RvcmllcyIvPgorCisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9ldGMvYm9vdHN0cmFwLk1GIGIvY29udGFpbmVyL2NhdGFsaW5hL2V0Yy9ib290c3RyYXAuTUYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFlMzEzMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9ldGMvYm9vdHN0cmFwLk1GCkBAIC0wLDAgKzEsNSBAQAorTWFuaWZlc3QtVmVyc2lvbjogMS4wCitNYWluLUNsYXNzOiBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0YXJ0dXAuQm9vdHN0cmFwCitDbGFzcy1QYXRoOiBqbXguamFyIGNvbW1vbnMtZGFlbW9uLmphciBjb21tb25zLWxvZ2dpbmctYXBpLmphcgorU3BlY2lmaWNhdGlvbi1UaXRsZTogQ2F0YWxpbmEKK1NwZWNpZmljYXRpb24tVmVyc2lvbjogMS4wClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9iaW4vY2F0YWxpbmEuYmF0IGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9iaW4vY2F0YWxpbmEuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxM2E0ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL2Jpbi9jYXRhbGluYS5iYXQKQEAgLTAsMCArMSwxOTIgQEAKK0BlY2hvIG9mZgoraWYgIiVPUyUiID09ICJXaW5kb3dzX05UIiBzZXRsb2NhbAorcmVtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorcmVtIFN0YXJ0L1N0b3AgU2NyaXB0IGZvciB0aGUgQ0FUQUxJTkEgU2VydmVyCityZW0KK3JlbSBFbnZpcm9ubWVudCBWYXJpYWJsZSBQcmVxdWlzaXRlcworcmVtCityZW0gICBDQVRBTElOQV9IT01FICAgTWF5IHBvaW50IGF0IHlvdXIgQ2F0YWxpbmEgImJ1aWxkIiBkaXJlY3RvcnkuCityZW0KK3JlbSAgIENBVEFMSU5BX0JBU0UgICAoT3B0aW9uYWwpIEJhc2UgZGlyZWN0b3J5IGZvciByZXNvbHZpbmcgZHluYW1pYyBwb3J0aW9ucworcmVtICAgICAgICAgICAgICAgICAgIG9mIGEgQ2F0YWxpbmEgaW5zdGFsbGF0aW9uLiAgSWYgbm90IHByZXNlbnQsIHJlc29sdmVzIHRvCityZW0gICAgICAgICAgICAgICAgICAgdGhlIHNhbWUgZGlyZWN0b3J5IHRoYXQgQ0FUQUxJTkFfSE9NRSBwb2ludHMgdG8uCityZW0KK3JlbSAgIENBVEFMSU5BX09QVFMgICAoT3B0aW9uYWwpIEphdmEgcnVudGltZSBvcHRpb25zIHVzZWQgd2hlbiB0aGUgInN0YXJ0IiwKK3JlbSAgICAgICAgICAgICAgICAgICAic3RvcCIsIG9yICJydW4iIGNvbW1hbmQgaXMgZXhlY3V0ZWQuCityZW0KK3JlbSAgIENBVEFMSU5BX1RNUERJUiAoT3B0aW9uYWwpIERpcmVjdG9yeSBwYXRoIGxvY2F0aW9uIG9mIHRlbXBvcmFyeSBkaXJlY3RvcnkKK3JlbSAgICAgICAgICAgICAgICAgICB0aGUgSlZNIHNob3VsZCB1c2UgKGphdmEuaW8udG1wZGlyKS4gIERlZmF1bHRzIHRvCityZW0gICAgICAgICAgICAgICAgICAgJUNBVEFMSU5BX0JBU0UlXHRlbXAuCityZW0KK3JlbSAgIEpBVkFfSE9NRSAgICAgICBNdXN0IHBvaW50IGF0IHlvdXIgSmF2YSBEZXZlbG9wbWVudCBLaXQgaW5zdGFsbGF0aW9uLgorcmVtCityZW0gICBKQVZBX09QVFMgICAgICAgKE9wdGlvbmFsKSBKYXZhIHJ1bnRpbWUgb3B0aW9ucyB1c2VkIHdoZW4gdGhlICJzdGFydCIsCityZW0gICAgICAgICAgICAgICAgICAgInN0b3AiLCBvciAicnVuIiBjb21tYW5kIGlzIGV4ZWN1dGVkLgorcmVtCityZW0gICBKU1NFX0hPTUUgICAgICAgKE9wdGlvbmFsKSBNYXkgcG9pbnQgYXQgeW91ciBKYXZhIFNlY3VyZSBTb2NrZXRzIEV4dGVuc2lvbgorcmVtICAgICAgICAgICAgICAgICAgIChKU1NFKSBpbnN0YWxsYXRpb24sIHdob3NlIEpBUiBmaWxlcyB3aWxsIGJlIGFkZGVkIHRvIHRoZQorcmVtICAgICAgICAgICAgICAgICAgIHN5c3RlbSBjbGFzcyBwYXRoIHVzZWQgdG8gc3RhcnQgVG9tY2F0LgorcmVtCityZW0gICBKUERBX1RSQU5TUE9SVCAgKE9wdGlvbmFsKSBKUERBIHRyYW5zcG9ydCB1c2VkIHdoZW4gdGhlICJqcGRhIHN0YXJ0IgorcmVtICAgICAgICAgICAgICAgICAgIGNvbW1hbmQgaXMgZXhlY3V0ZWQuIFRoZSBkZWZhdWx0IGlzICJkdF9zaG1lbSIuCityZW0KK3JlbSAgIEpQREFfQUREUkVTUyAgICAoT3B0aW9uYWwpIEphdmEgcnVudGltZSBvcHRpb25zIHVzZWQgd2hlbiB0aGUgImpwZGEgc3RhcnQiCityZW0gICAgICAgICAgICAgICAgICAgY29tbWFuZCBpcyBleGVjdXRlZC4gVGhlIGRlZmF1bHQgaXMgImpkYmNvbm4iLgorcmVtCityZW0gJElkJAorcmVtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCityZW0gR3Vlc3MgQ0FUQUxJTkFfSE9NRSBpZiBub3QgZGVmaW5lZAorc2V0IENVUlJFTlRfRElSPSVjZCUKK2lmIG5vdCAiJUNBVEFMSU5BX0hPTUUlIiA9PSAiIiBnb3RvIGdvdEhvbWUKK3NldCBDQVRBTElOQV9IT01FPSVDVVJSRU5UX0RJUiUKK2lmIGV4aXN0ICIlQ0FUQUxJTkFfSE9NRSVcYmluXGNhdGFsaW5hLmJhdCIgZ290byBva0hvbWUKK2NkIC4uCitzZXQgQ0FUQUxJTkFfSE9NRT0lY2QlCitjZCAlQ1VSUkVOVF9ESVIlCis6Z290SG9tZQoraWYgZXhpc3QgIiVDQVRBTElOQV9IT01FJVxiaW5cY2F0YWxpbmEuYmF0IiBnb3RvIG9rSG9tZQorZWNobyBUaGUgQ0FUQUxJTkFfSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBub3QgZGVmaW5lZCBjb3JyZWN0bHkKK2VjaG8gVGhpcyBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBuZWVkZWQgdG8gcnVuIHRoaXMgcHJvZ3JhbQorZ290byBlbmQKKzpva0hvbWUKKworcmVtIEdldCBzdGFuZGFyZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMKK2lmIGV4aXN0ICIlQ0FUQUxJTkFfSE9NRSVcYmluXHNldGVudi5iYXQiIGNhbGwgIiVDQVRBTElOQV9IT01FJVxiaW5cc2V0ZW52LmJhdCIKKworcmVtIEdldCBzdGFuZGFyZCBKYXZhIGVudmlyb25tZW50IHZhcmlhYmxlcworaWYgZXhpc3QgIiVDQVRBTElOQV9IT01FJVxiaW5cc2V0Y2xhc3NwYXRoLmJhdCIgZ290byBva1NldGNsYXNzcGF0aAorZWNobyBDYW5ub3QgZmluZCAlQ0FUQUxJTkFfSE9NRSVcYmluXHNldGNsYXNzcGF0aC5iYXQKK2VjaG8gVGhpcyBmaWxlIGlzIG5lZWRlZCB0byBydW4gdGhpcyBwcm9ncmFtCitnb3RvIGVuZAorOm9rU2V0Y2xhc3NwYXRoCitzZXQgQkFTRURJUj0lQ0FUQUxJTkFfSE9NRSUKK2NhbGwgIiVDQVRBTElOQV9IT01FJVxiaW5cc2V0Y2xhc3NwYXRoLmJhdCIKKworcmVtIEFkZCBvbiBleHRyYSBqYXIgZmlsZXMgdG8gQ0xBU1NQQVRICitpZiAiJUpTU0VfSE9NRSUiID09ICIiIGdvdG8gbm9Kc3NlCitzZXQgQ0xBU1NQQVRIPSVDTEFTU1BBVEglOyVKU1NFX0hPTUUlXGxpYlxqY2VydC5qYXI7JUpTU0VfSE9NRSVcbGliXGpuZXQuamFyOyVKU1NFX0hPTUUlXGxpYlxqc3NlLmphcgorOm5vSnNzZQorc2V0IENMQVNTUEFUSD0lQ0xBU1NQQVRIJTslQ0FUQUxJTkFfSE9NRSVcYmluXGJvb3RzdHJhcC5qYXIKKworaWYgbm90ICIlQ0FUQUxJTkFfQkFTRSUiID09ICIiIGdvdG8gZ290QmFzZQorc2V0IENBVEFMSU5BX0JBU0U9JUNBVEFMSU5BX0hPTUUlCis6Z290QmFzZQorCitpZiBub3QgIiVDQVRBTElOQV9UTVBESVIlIiA9PSAiIiBnb3RvIGdvdFRtcGRpcgorc2V0IENBVEFMSU5BX1RNUERJUj0lQ0FUQUxJTkFfQkFTRSVcdGVtcAorOmdvdFRtcGRpcgorCityZW0gLS0tLS0gRXhlY3V0ZSBUaGUgUmVxdWVzdGVkIENvbW1hbmQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2VjaG8gVXNpbmcgQ0FUQUxJTkFfQkFTRTogICAlQ0FUQUxJTkFfQkFTRSUKK2VjaG8gVXNpbmcgQ0FUQUxJTkFfSE9NRTogICAlQ0FUQUxJTkFfSE9NRSUKK2VjaG8gVXNpbmcgQ0FUQUxJTkFfVE1QRElSOiAlQ0FUQUxJTkFfVE1QRElSJQorZWNobyBVc2luZyBKQVZBX0hPTUU6ICAgICAgICVKQVZBX0hPTUUlCisKK3NldCBfRVhFQ0pBVkE9JV9SVU5KQVZBJQorc2V0IE1BSU5DTEFTUz1vcmcuYXBhY2hlLmNhdGFsaW5hLnN0YXJ0dXAuQm9vdHN0cmFwCitzZXQgQUNUSU9OPXN0YXJ0CitzZXQgU0VDVVJJVFlfUE9MSUNZX0ZJTEU9CitzZXQgREVCVUdfT1BUUz0KK3NldCBKUERBPQorCitpZiBub3QgIiIlMSIiID09ICIianBkYSIiIGdvdG8gbm9KcGRhCitzZXQgSlBEQT1qcGRhCitpZiBub3QgIiVKUERBX1RSQU5TUE9SVCUiID09ICIiIGdvdG8gZ290SnBkYVRyYW5zcG9ydAorc2V0IEpQREFfVFJBTlNQT1JUPWR0X3NobWVtCis6Z290SnBkYVRyYW5zcG9ydAoraWYgbm90ICIlSlBEQV9BRERSRVNTJSIgPT0gIiIgZ290byBnb3RKcGRhQWRkcmVzcworc2V0IEpQREFfQUREUkVTUz1qZGJjb25uCis6Z290SnBkYUFkZHJlc3MKK3NoaWZ0Cis6bm9KcGRhCisKK2lmICIiJTEiIiA9PSAiImRlYnVnIiIgZ290byBkb0RlYnVnCitpZiAiIiUxIiIgPT0gIiJydW4iIiBnb3RvIGRvUnVuCitpZiAiIiUxIiIgPT0gIiJzdGFydCIiIGdvdG8gZG9TdGFydAoraWYgIiIlMSIiID09ICIic3RvcCIiIGdvdG8gZG9TdG9wCitpZiAiIiUxIiIgPT0gIiJ2ZXJzaW9uIiIgZ290byBkb1ZlcnNpb24KKworZWNobyBVc2FnZTogIGNhdGFsaW5hICggY29tbWFuZHMgLi4uICkKK2VjaG8gY29tbWFuZHM6CitlY2hvICAgZGVidWcgICAgICAgICAgICAgU3RhcnQgQ2F0YWxpbmEgaW4gYSBkZWJ1Z2dlcgorZWNobyAgIGRlYnVnIC1zZWN1cml0eSAgIERlYnVnIENhdGFsaW5hIHdpdGggYSBzZWN1cml0eSBtYW5hZ2VyCitlY2hvICAganBkYSBzdGFydCAgICAgICAgU3RhcnQgQ2F0YWxpbmEgdW5kZXIgSlBEQSBkZWJ1Z2dlcgorZWNobyAgIHJ1biAgICAgICAgICAgICAgIFN0YXJ0IENhdGFsaW5hIGluIHRoZSBjdXJyZW50IHdpbmRvdworZWNobyAgIHJ1biAtc2VjdXJpdHkgICAgIFN0YXJ0IGluIHRoZSBjdXJyZW50IHdpbmRvdyB3aXRoIHNlY3VyaXR5IG1hbmFnZXIKK2VjaG8gICBzdGFydCAgICAgICAgICAgICBTdGFydCBDYXRhbGluYSBpbiBhIHNlcGFyYXRlIHdpbmRvdworZWNobyAgIHN0YXJ0IC1zZWN1cml0eSAgIFN0YXJ0IGluIGEgc2VwYXJhdGUgd2luZG93IHdpdGggc2VjdXJpdHkgbWFuYWdlcgorZWNobyAgIHN0b3AgICAgICAgICAgICAgIFN0b3AgQ2F0YWxpbmEKK2VjaG8gICB2ZXJzaW9uICAgICAgICAgICBXaGF0IHZlcnNpb24gb2YgdG9tY2F0IGFyZSB5b3UgcnVubmluZz8KK2dvdG8gZW5kCisKKzpkb0RlYnVnCitzaGlmdAorc2V0IF9FWEVDSkFWQT0lX1JVTkpEQiUKK3NldCBERUJVR19PUFRTPS1zb3VyY2VwYXRoICIlQ0FUQUxJTkFfSE9NRSVcLi5cLi5camFrYXJ0YS10b21jYXQtY2F0YWxpbmFcY2F0YWxpbmFcc3JjXHNoYXJlIgoraWYgbm90ICIiJTEiIiA9PSAiIi1zZWN1cml0eSIiIGdvdG8gZXhlY0NtZAorc2hpZnQKK2VjaG8gVXNpbmcgU2VjdXJpdHkgTWFuYWdlcgorc2V0IFNFQ1VSSVRZX1BPTElDWV9GSUxFPSVDQVRBTElOQV9CQVNFJVxjb25mXGNhdGFsaW5hLnBvbGljeQorZ290byBleGVjQ21kCisKKzpkb1J1bgorc2hpZnQKK2lmIG5vdCAiIiUxIiIgPT0gIiItc2VjdXJpdHkiIiBnb3RvIGV4ZWNDbWQKK3NoaWZ0CitlY2hvIFVzaW5nIFNlY3VyaXR5IE1hbmFnZXIKK3NldCBTRUNVUklUWV9QT0xJQ1lfRklMRT0lQ0FUQUxJTkFfQkFTRSVcY29uZlxjYXRhbGluYS5wb2xpY3kKK2dvdG8gZXhlY0NtZAorCis6ZG9TdGFydAorc2hpZnQKK2lmIG5vdCAiJU9TJSIgPT0gIldpbmRvd3NfTlQiIGdvdG8gbm9UaXRsZQorc2V0IF9FWEVDSkFWQT1zdGFydCAiVG9tY2F0IiAlX1JVTkpBVkElCitnb3RvIGdvdFRpdGxlCis6bm9UaXRsZQorc2V0IF9FWEVDSkFWQT1zdGFydCAlX1JVTkpBVkElCis6Z290VGl0bGUKK2lmIG5vdCAiIiUxIiIgPT0gIiItc2VjdXJpdHkiIiBnb3RvIGV4ZWNDbWQKK3NoaWZ0CitlY2hvIFVzaW5nIFNlY3VyaXR5IE1hbmFnZXIKK3NldCBTRUNVUklUWV9QT0xJQ1lfRklMRT0lQ0FUQUxJTkFfQkFTRSVcY29uZlxjYXRhbGluYS5wb2xpY3kKK2dvdG8gZXhlY0NtZAorCis6ZG9TdG9wCitzaGlmdAorc2V0IEFDVElPTj1zdG9wCitnb3RvIGV4ZWNDbWQKKworOmRvVmVyc2lvbgorJV9FWEVDSkFWQSUgLWNsYXNzcGF0aCAiJUNBVEFMSU5BX0hPTUUlXHNlcnZlclxsaWJcY2F0YWxpbmEuamFyIiBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuU2VydmVySW5mbworZ290byBlbmQKKworCis6ZXhlY0NtZAorcmVtIEdldCByZW1haW5pbmcgdW5zaGlmdGVkIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgYW5kIHNhdmUgdGhlbSBpbiB0aGUKK3NldCBDTURfTElORV9BUkdTPQorOnNldEFyZ3MKK2lmICIiJTEiIj09IiIiIiBnb3RvIGRvbmVTZXRBcmdzCitzZXQgQ01EX0xJTkVfQVJHUz0lQ01EX0xJTkVfQVJHUyUgJTEKK3NoaWZ0Citnb3RvIHNldEFyZ3MKKzpkb25lU2V0QXJncworCityZW0gRXhlY3V0ZSBKYXZhIHdpdGggdGhlIGFwcGxpY2FibGUgcHJvcGVydGllcworaWYgbm90ICIlSlBEQSUiID09ICIiIGdvdG8gZG9KcGRhCitpZiBub3QgIiVTRUNVUklUWV9QT0xJQ1lfRklMRSUiID09ICIiIGdvdG8gZG9TZWN1cml0eQorJV9FWEVDSkFWQSUgJUpBVkFfT1BUUyUgJUNBVEFMSU5BX09QVFMlICVERUJVR19PUFRTJSAtRGphdmEuZW5kb3JzZWQuZGlycz0iJUpBVkFfRU5ET1JTRURfRElSUyUiIC1jbGFzc3BhdGggIiVDTEFTU1BBVEglIiAtRGNhdGFsaW5hLmJhc2U9IiVDQVRBTElOQV9CQVNFJSIgLURjYXRhbGluYS5ob21lPSIlQ0FUQUxJTkFfSE9NRSUiIC1EamF2YS5pby50bXBkaXI9IiVDQVRBTElOQV9UTVBESVIlIiAlTUFJTkNMQVNTJSAlQ01EX0xJTkVfQVJHUyUgJUFDVElPTiUKK2dvdG8gZW5kCis6ZG9TZWN1cml0eQorJV9FWEVDSkFWQSUgJUpBVkFfT1BUUyUgJUNBVEFMSU5BX09QVFMlICVERUJVR19PUFRTJSAtRGphdmEuZW5kb3JzZWQuZGlycz0iJUpBVkFfRU5ET1JTRURfRElSUyUiIC1jbGFzc3BhdGggIiVDTEFTU1BBVEglIiAtRGphdmEuc2VjdXJpdHkubWFuYWdlciAtRGphdmEuc2VjdXJpdHkucG9saWN5PT0iJVNFQ1VSSVRZX1BPTElDWV9GSUxFJSIgLURjYXRhbGluYS5iYXNlPSIlQ0FUQUxJTkFfQkFTRSUiIC1EY2F0YWxpbmEuaG9tZT0iJUNBVEFMSU5BX0hPTUUlIiAtRGphdmEuaW8udG1wZGlyPSIlQ0FUQUxJTkFfVE1QRElSJSIgJU1BSU5DTEFTUyUgJUNNRF9MSU5FX0FSR1MlICVBQ1RJT04lCitnb3RvIGVuZAorOmRvSnBkYQoraWYgbm90ICIlU0VDVVJJVFlfUE9MSUNZX0ZJTEUlIiA9PSAiIiBnb3RvIGRvU2VjdXJpdHlKcGRhCislX0VYRUNKQVZBJSAlSkFWQV9PUFRTJSAlQ0FUQUxJTkFfT1BUUyUgLVhkZWJ1ZyAtWHJ1bmpkd3A6dHJhbnNwb3J0PSVKUERBX1RSQU5TUE9SVCUsYWRkcmVzcz0lSlBEQV9BRERSRVNTJSxzZXJ2ZXI9eSxzdXNwZW5kPW4gJURFQlVHX09QVFMlIC1EamF2YS5lbmRvcnNlZC5kaXJzPSIlSkFWQV9FTkRPUlNFRF9ESVJTJSIgLWNsYXNzcGF0aCAiJUNMQVNTUEFUSCUiIC1EY2F0YWxpbmEuYmFzZT0iJUNBVEFMSU5BX0JBU0UlIiAtRGNhdGFsaW5hLmhvbWU9IiVDQVRBTElOQV9IT01FJSIgLURqYXZhLmlvLnRtcGRpcj0iJUNBVEFMSU5BX1RNUERJUiUiICVNQUlOQ0xBU1MlICVDTURfTElORV9BUkdTJSAlQUNUSU9OJQorZ290byBlbmQKKzpkb1NlY3VyaXR5SnBkYQorJV9FWEVDSkFWQSUgJUpBVkFfT1BUUyUgJUNBVEFMSU5BX09QVFMlIC1YZGVidWcgLVhydW5qZHdwOnRyYW5zcG9ydD0lSlBEQV9UUkFOU1BPUlQlLGFkZHJlc3M9JUpQREFfQUREUkVTUyUsc2VydmVyPXksc3VzcGVuZD1uICVERUJVR19PUFRTJSAtRGphdmEuZW5kb3JzZWQuZGlycz0iJUpBVkFfRU5ET1JTRURfRElSUyUiIC1jbGFzc3BhdGggIiVDTEFTU1BBVEglIiAtRGphdmEuc2VjdXJpdHkubWFuYWdlciAtRGphdmEuc2VjdXJpdHkucG9saWN5PT0iJVNFQ1VSSVRZX1BPTElDWV9GSUxFJSIgLURjYXRhbGluYS5iYXNlPSIlQ0FUQUxJTkFfQkFTRSUiIC1EY2F0YWxpbmEuaG9tZT0iJUNBVEFMSU5BX0hPTUUlIiAtRGphdmEuaW8udG1wZGlyPSIlQ0FUQUxJTkFfVE1QRElSJSIgJU1BSU5DTEFTUyUgJUNNRF9MSU5FX0FSR1MlICVBQ1RJT04lCitnb3RvIGVuZAorCis6ZW5kCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL2Jpbi9jYXRhbGluYS5zaCBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvYmluL2NhdGFsaW5hLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwZWEwYmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL2Jpbi9jYXRhbGluYS5zaApAQCAtMCwwICsxLDI4NyBAQAorIyEvYmluL3NoCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFN0YXJ0L1N0b3AgU2NyaXB0IGZvciB0aGUgQ0FUQUxJTkEgU2VydmVyCisjCisjIEVudmlyb25tZW50IFZhcmlhYmxlIFByZXF1aXNpdGVzCisjCisjICAgQ0FUQUxJTkFfSE9NRSAgIE1heSBwb2ludCBhdCB5b3VyIENhdGFsaW5hICJidWlsZCIgZGlyZWN0b3J5LgorIworIyAgIENBVEFMSU5BX0JBU0UgICAoT3B0aW9uYWwpIEJhc2UgZGlyZWN0b3J5IGZvciByZXNvbHZpbmcgZHluYW1pYyBwb3J0aW9ucworIyAgICAgICAgICAgICAgICAgICBvZiBhIENhdGFsaW5hIGluc3RhbGxhdGlvbi4gIElmIG5vdCBwcmVzZW50LCByZXNvbHZlcyB0bworIyAgICAgICAgICAgICAgICAgICB0aGUgc2FtZSBkaXJlY3RvcnkgdGhhdCBDQVRBTElOQV9IT01FIHBvaW50cyB0by4KKyMKKyMgICBDQVRBTElOQV9PUFRTICAgKE9wdGlvbmFsKSBKYXZhIHJ1bnRpbWUgb3B0aW9ucyB1c2VkIHdoZW4gdGhlICJzdGFydCIsCisjICAgICAgICAgICAgICAgICAgICJzdG9wIiwgb3IgInJ1biIgY29tbWFuZCBpcyBleGVjdXRlZC4KKyMKKyMgICBDQVRBTElOQV9UTVBESVIgKE9wdGlvbmFsKSBEaXJlY3RvcnkgcGF0aCBsb2NhdGlvbiBvZiB0ZW1wb3JhcnkgZGlyZWN0b3J5CisjICAgICAgICAgICAgICAgICAgIHRoZSBKVk0gc2hvdWxkIHVzZSAoamF2YS5pby50bXBkaXIpLiAgRGVmYXVsdHMgdG8KKyMgICAgICAgICAgICAgICAgICAgJENBVEFMSU5BX0JBU0UvdGVtcC4KKyMKKyMgICBKQVZBX0hPTUUgICAgICAgTXVzdCBwb2ludCBhdCB5b3VyIEphdmEgRGV2ZWxvcG1lbnQgS2l0IGluc3RhbGxhdGlvbi4KKyMKKyMgICBKQVZBX09QVFMgICAgICAgKE9wdGlvbmFsKSBKYXZhIHJ1bnRpbWUgb3B0aW9ucyB1c2VkIHdoZW4gdGhlICJzdGFydCIsCisjICAgICAgICAgICAgICAgICAgICJzdG9wIiwgb3IgInJ1biIgY29tbWFuZCBpcyBleGVjdXRlZC4KKyMKKyMgICBKUERBX1RSQU5TUE9SVCAgKE9wdGlvbmFsKSBKUERBIHRyYW5zcG9ydCB1c2VkIHdoZW4gdGhlICJqcGRhIHN0YXJ0IgorIyAgICAgICAgICAgICAgICAgICBjb21tYW5kIGlzIGV4ZWN1dGVkLiBUaGUgZGVmYXVsdCBpcyAiZHRfc29ja2V0Ii4KKyMKKyMgICBKUERBX0FERFJFU1MgICAgKE9wdGlvbmFsKSBKYXZhIHJ1bnRpbWUgb3B0aW9ucyB1c2VkIHdoZW4gdGhlICJqcGRhIHN0YXJ0IgorIyAgICAgICAgICAgICAgICAgICBjb21tYW5kIGlzIGV4ZWN1dGVkLiBUaGUgZGVmYXVsdCBpcyA4MDAwLgorIworIyAgIEpTU0VfSE9NRSAgICAgICAoT3B0aW9uYWwpIE1heSBwb2ludCBhdCB5b3VyIEphdmEgU2VjdXJlIFNvY2tldHMgRXh0ZW5zaW9uCisjICAgICAgICAgICAgICAgICAgIChKU1NFKSBpbnN0YWxsYXRpb24sIHdob3NlIEpBUiBmaWxlcyB3aWxsIGJlIGFkZGVkIHRvIHRoZQorIyAgICAgICAgICAgICAgICAgICBzeXN0ZW0gY2xhc3MgcGF0aCB1c2VkIHRvIHN0YXJ0IFRvbWNhdC4KKyMKKyMgICBDQVRBTElOQV9QSUQgICAgKE9wdGlvbmFsKSBQYXRoIG9mIHRoZSBmaWxlIHdoaWNoIHNob3VsZCBjb250YWlucyB0aGUgcGlkCisjICAgICAgICAgICAgICAgICAgIG9mIGNhdGFsaW5hIHN0YXJ0dXAgamF2YSBwcm9jZXNzLCB3aGVuIHN0YXJ0IChmb3JrKSBpcyB1c2VkCisjCisjICRJZCQKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBPUyBzcGVjaWZpYyBzdXBwb3J0LiAgJHZhciBfbXVzdF8gYmUgc2V0IHRvIGVpdGhlciB0cnVlIG9yIGZhbHNlLgorY3lnd2luPWZhbHNlCitvczQwMD1mYWxzZQorY2FzZSAiYHVuYW1lYCIgaW4KK0NZR1dJTiopIGN5Z3dpbj10cnVlOzsKK09TNDAwKikgb3M0MDA9dHJ1ZTs7Citlc2FjCisKKyMgcmVzb2x2ZSBsaW5rcyAtICQwIG1heSBiZSBhIHNvZnRsaW5rCitQUkc9IiQwIgorCit3aGlsZSBbIC1oICIkUFJHIiBdOyBkbworICBscz1gbHMgLWxkICIkUFJHImAKKyAgbGluaz1gZXhwciAiJGxzIiA6ICcuKi0+IFwoLipcKSQnYAorICBpZiBleHByICIkbGluayIgOiAnLiovLionID4gL2Rldi9udWxsOyB0aGVuCisgICAgUFJHPSIkbGluayIKKyAgZWxzZQorICAgIFBSRz1gZGlybmFtZSAiJFBSRyJgLyIkbGluayIKKyAgZmkKK2RvbmUKKworIyBHZXQgc3RhbmRhcmQgZW52aXJvbm1lbnQgdmFyaWFibGVzCitQUkdESVI9YGRpcm5hbWUgIiRQUkciYAorCisjIE9ubHkgc2V0IENBVEFMSU5BX0hPTUUgaWYgbm90IGFscmVhZHkgc2V0CitbIC16ICIkQ0FUQUxJTkFfSE9NRSIgXSAmJiBDQVRBTElOQV9IT01FPWBjZCAiJFBSR0RJUi8uLiIgOyBwd2RgCisKK2lmIFsgLXIgIiRDQVRBTElOQV9IT01FIi9iaW4vc2V0ZW52LnNoIF07IHRoZW4KKyAgLiAiJENBVEFMSU5BX0hPTUUiL2Jpbi9zZXRlbnYuc2gKK2ZpCisKKyMgRm9yIEN5Z3dpbiwgZW5zdXJlIHBhdGhzIGFyZSBpbiBVTklYIGZvcm1hdCBiZWZvcmUgYW55dGhpbmcgaXMgdG91Y2hlZAoraWYgJGN5Z3dpbjsgdGhlbgorICBbIC1uICIkSkFWQV9IT01FIiBdICYmIEpBVkFfSE9NRT1gY3lncGF0aCAtLXVuaXggIiRKQVZBX0hPTUUiYAorICBbIC1uICIkQ0FUQUxJTkFfSE9NRSIgXSAmJiBDQVRBTElOQV9IT01FPWBjeWdwYXRoIC0tdW5peCAiJENBVEFMSU5BX0hPTUUiYAorICBbIC1uICIkQ0FUQUxJTkFfQkFTRSIgXSAmJiBDQVRBTElOQV9CQVNFPWBjeWdwYXRoIC0tdW5peCAiJENBVEFMSU5BX0JBU0UiYAorICBbIC1uICIkQ0xBU1NQQVRIIiBdICYmIENMQVNTUEFUSD1gY3lncGF0aCAtLXBhdGggLS11bml4ICIkQ0xBU1NQQVRIImAKKyAgWyAtbiAiJEpTU0VfSE9NRSIgXSAmJiBKU1NFX0hPTUU9YGN5Z3BhdGggLS1hYnNvbHV0ZSAtLXVuaXggIiRKU1NFX0hPTUUiYAorZmkKKworIyBGb3IgT1M0MDAKK2lmICRvczQwMDsgdGhlbgorICAjIFNldCBqb2IgcHJpb3JpdHkgdG8gc3RhbmRhcmQgZm9yIGludGVyYWN0aXZlIChpbnRlcmFjdGl2ZSAtIDYpIGJ5IHVzaW5nCisgICMgdGhlIGludGVyYWN0aXZlIHByaW9yaXR5IC0gNiwgdGhlIGhlbHBlciB0aHJlYWRzIHRoYXQgcmVzcG9uZCB0byByZXF1ZXN0cworICAjIHdpbGwgYmUgcnVubmluZyBhdCB0aGUgc2FtZSBwcmlvcml0eSBhcyBpbnRlcmFjdGl2ZSBqb2JzLgorICBDT01NQU5EPSdjaGdqb2Igam9iKCckSk9CTkFNRScpIHJ1bnB0eSg2KScKKyAgc3lzdGVtICRDT01NQU5ECisKKyAgIyBFbmFibGUgbXVsdGkgdGhyZWFkaW5nCisgIGV4cG9ydCBRSUJNX01VTFRJX1RIUkVBREVEPVkKK2ZpCisKKyMgR2V0IHN0YW5kYXJkIEphdmEgZW52aXJvbm1lbnQgdmFyaWFibGVzCitpZiBbIC1yICIkQ0FUQUxJTkFfSE9NRSIvYmluL3NldGNsYXNzcGF0aC5zaCBdOyB0aGVuCisgIEJBU0VESVI9IiRDQVRBTElOQV9IT01FIgorICAuICIkQ0FUQUxJTkFfSE9NRSIvYmluL3NldGNsYXNzcGF0aC5zaAorZWxzZQorICBlY2hvICJDYW5ub3QgZmluZCAkQ0FUQUxJTkFfSE9NRS9iaW4vc2V0Y2xhc3NwYXRoLnNoIgorICBlY2hvICJUaGlzIGZpbGUgaXMgbmVlZGVkIHRvIHJ1biB0aGlzIHByb2dyYW0iCisgIGV4aXQgMQorZmkKKworIyBBZGQgb24gZXh0cmEgamFyIGZpbGVzIHRvIENMQVNTUEFUSAoraWYgWyAtbiAiJEpTU0VfSE9NRSIgXTsgdGhlbgorICBDTEFTU1BBVEg9IiRDTEFTU1BBVEgiOiIkSlNTRV9IT01FIi9saWIvamNlcnQuamFyOiIkSlNTRV9IT01FIi9saWIvam5ldC5qYXI6IiRKU1NFX0hPTUUiL2xpYi9qc3NlLmphcgorZmkKK0NMQVNTUEFUSD0iJENMQVNTUEFUSCI6IiRDQVRBTElOQV9IT01FIi9iaW4vYm9vdHN0cmFwLmphcjoiJENBVEFMSU5BX0hPTUUiL2Jpbi9jb21tb25zLWxvZ2dpbmctYXBpLmphcgorCitpZiBbIC16ICIkQ0FUQUxJTkFfQkFTRSIgXSA7IHRoZW4KKyAgQ0FUQUxJTkFfQkFTRT0iJENBVEFMSU5BX0hPTUUiCitmaQorCitpZiBbIC16ICIkQ0FUQUxJTkFfVE1QRElSIiBdIDsgdGhlbgorICAjIERlZmluZSB0aGUgamF2YS5pby50bXBkaXIgdG8gdXNlIGZvciBDYXRhbGluYQorICBDQVRBTElOQV9UTVBESVI9IiRDQVRBTElOQV9CQVNFIi90ZW1wCitmaQorCisjIEZvciBDeWd3aW4sIHN3aXRjaCBwYXRocyB0byBXaW5kb3dzIGZvcm1hdCBiZWZvcmUgcnVubmluZyBqYXZhCitpZiAkY3lnd2luOyB0aGVuCisgIEpBVkFfSE9NRT1gY3lncGF0aCAtLWFic29sdXRlIC0td2luZG93cyAiJEpBVkFfSE9NRSJgCisgIENBVEFMSU5BX0hPTUU9YGN5Z3BhdGggLS1hYnNvbHV0ZSAtLXdpbmRvd3MgIiRDQVRBTElOQV9IT01FImAKKyAgQ0FUQUxJTkFfQkFTRT1gY3lncGF0aCAtLWFic29sdXRlIC0td2luZG93cyAiJENBVEFMSU5BX0JBU0UiYAorICBDQVRBTElOQV9UTVBESVI9YGN5Z3BhdGggLS1hYnNvbHV0ZSAtLXdpbmRvd3MgIiRDQVRBTElOQV9UTVBESVIiYAorICBDTEFTU1BBVEg9YGN5Z3BhdGggLS1wYXRoIC0td2luZG93cyAiJENMQVNTUEFUSCJgCisgIFsgLW4gIiRKU1NFX0hPTUUiIF0gJiYgSlNTRV9IT01FPWBjeWdwYXRoIC0tYWJzb2x1dGUgLS13aW5kb3dzICIkSlNTRV9IT01FImAKKyAgSkFWQV9FTkRPUlNFRF9ESVJTPWBjeWdwYXRoIC0tcGF0aCAtLXdpbmRvd3MgIiRKQVZBX0VORE9SU0VEX0RJUlMiYAorZmkKKworIyAtLS0tLSBFeGVjdXRlIFRoZSBSZXF1ZXN0ZWQgQ29tbWFuZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitlY2hvICJVc2luZyBDQVRBTElOQV9CQVNFOiAgICRDQVRBTElOQV9CQVNFIgorZWNobyAiVXNpbmcgQ0FUQUxJTkFfSE9NRTogICAkQ0FUQUxJTkFfSE9NRSIKK2VjaG8gIlVzaW5nIENBVEFMSU5BX1RNUERJUjogJENBVEFMSU5BX1RNUERJUiIKK2VjaG8gIlVzaW5nIEpBVkFfSE9NRTogICAgICAgJEpBVkFfSE9NRSIKKworaWYgWyAiJDEiID0gImpwZGEiIF0gOyB0aGVuCisgIGlmIFsgLXogIiRKUERBX1RSQU5TUE9SVCIgXTsgdGhlbgorICAgIEpQREFfVFJBTlNQT1JUPSJkdF9zb2NrZXQiCisgIGZpCisgIGlmIFsgLXogIiRKUERBX0FERFJFU1MiIF07IHRoZW4KKyAgICBKUERBX0FERFJFU1M9IjgwMDAiCisgIGZpCisgIGlmIFsgLXogIiRKUERBX09QVFMiIF07IHRoZW4KKyAgICBKUERBX09QVFM9Ii1YZGVidWcgLVhydW5qZHdwOnRyYW5zcG9ydD0kSlBEQV9UUkFOU1BPUlQsYWRkcmVzcz0kSlBEQV9BRERSRVNTLHNlcnZlcj15LHN1c3BlbmQ9biIKKyAgZmkKKyAgQ0FUQUxJTkFfT1BUUz0iJENBVEFMSU5BX09QVFMgJEpQREFfT1BUUyIKKyAgc2hpZnQKK2ZpCisKK2lmIFsgIiQxIiA9ICJkZWJ1ZyIgXSA7IHRoZW4KKworICBpZiAkb3M0MDA7IHRoZW4KKyAgICBlY2hvICJEZWJ1ZyBjb21tYW5kIG5vdCBhdmFpbGFibGUgb24gT1M0MDAiCisgICAgZXhpdCAxCisgIGVsc2UKKyAgICBzaGlmdAorICAgIGlmIFsgIiQxIiA9ICItc2VjdXJpdHkiIF0gOyB0aGVuCisgICAgICBlY2hvICJVc2luZyBTZWN1cml0eSBNYW5hZ2VyIgorICAgICAgc2hpZnQKKyAgICAgIGV4ZWMgIiRfUlVOSkRCIiAkSkFWQV9PUFRTICRDQVRBTElOQV9PUFRTIFwKKyAgICAgICAgLURqYXZhLmVuZG9yc2VkLmRpcnM9IiRKQVZBX0VORE9SU0VEX0RJUlMiIC1jbGFzc3BhdGggIiRDTEFTU1BBVEgiIFwKKyAgICAgICAgLXNvdXJjZXBhdGggIiRDQVRBTElOQV9IT01FIi8uLi8uLi9qYWthcnRhLXRvbWNhdC1jYXRhbGluYS9jYXRhbGluYS9zcmMvc2hhcmUgXAorICAgICAgICAtRGphdmEuc2VjdXJpdHkubWFuYWdlciBcCisgICAgICAgIC1EamF2YS5zZWN1cml0eS5wb2xpY3k9PSIkQ0FUQUxJTkFfQkFTRSIvY29uZi9jYXRhbGluYS5wb2xpY3kgXAorICAgICAgICAtRGNhdGFsaW5hLmJhc2U9IiRDQVRBTElOQV9CQVNFIiBcCisgICAgICAgIC1EY2F0YWxpbmEuaG9tZT0iJENBVEFMSU5BX0hPTUUiIFwKKyAgICAgICAgLURqYXZhLmlvLnRtcGRpcj0iJENBVEFMSU5BX1RNUERJUiIgXAorICAgICAgICBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0YXJ0dXAuQm9vdHN0cmFwICIkQCIgc3RhcnQKKyAgICBlbHNlCisgICAgICBleGVjICIkX1JVTkpEQiIgJEpBVkFfT1BUUyAkQ0FUQUxJTkFfT1BUUyBcCisgICAgICAgIC1EamF2YS5lbmRvcnNlZC5kaXJzPSIkSkFWQV9FTkRPUlNFRF9ESVJTIiAtY2xhc3NwYXRoICIkQ0xBU1NQQVRIIiBcCisgICAgICAgIC1zb3VyY2VwYXRoICIkQ0FUQUxJTkFfSE9NRSIvLi4vLi4vamFrYXJ0YS10b21jYXQtY2F0YWxpbmEvY2F0YWxpbmEvc3JjL3NoYXJlIFwKKyAgICAgICAgLURjYXRhbGluYS5iYXNlPSIkQ0FUQUxJTkFfQkFTRSIgXAorICAgICAgICAtRGNhdGFsaW5hLmhvbWU9IiRDQVRBTElOQV9IT01FIiBcCisgICAgICAgIC1EamF2YS5pby50bXBkaXI9IiRDQVRBTElOQV9UTVBESVIiIFwKKyAgICAgICAgb3JnLmFwYWNoZS5jYXRhbGluYS5zdGFydHVwLkJvb3RzdHJhcCAiJEAiIHN0YXJ0CisgICAgZmkKKyAgZmkKKworZWxpZiBbICIkMSIgPSAicnVuIiBdOyB0aGVuCisKKyAgc2hpZnQKKyAgaWYgWyAiJDEiID0gIi1zZWN1cml0eSIgXSA7IHRoZW4KKyAgICBlY2hvICJVc2luZyBTZWN1cml0eSBNYW5hZ2VyIgorICAgIHNoaWZ0CisgICAgZXhlYyAiJF9SVU5KQVZBIiAkSkFWQV9PUFRTICRDQVRBTElOQV9PUFRTIFwKKyAgICAgIC1EamF2YS5lbmRvcnNlZC5kaXJzPSIkSkFWQV9FTkRPUlNFRF9ESVJTIiAtY2xhc3NwYXRoICIkQ0xBU1NQQVRIIiBcCisgICAgICAtRGphdmEuc2VjdXJpdHkubWFuYWdlciBcCisgICAgICAtRGphdmEuc2VjdXJpdHkucG9saWN5PT0iJENBVEFMSU5BX0JBU0UiL2NvbmYvY2F0YWxpbmEucG9saWN5IFwKKyAgICAgIC1EY2F0YWxpbmEuYmFzZT0iJENBVEFMSU5BX0JBU0UiIFwKKyAgICAgIC1EY2F0YWxpbmEuaG9tZT0iJENBVEFMSU5BX0hPTUUiIFwKKyAgICAgIC1EamF2YS5pby50bXBkaXI9IiRDQVRBTElOQV9UTVBESVIiIFwKKyAgICAgIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cC5Cb290c3RyYXAgIiRAIiBzdGFydAorICBlbHNlCisgICAgZXhlYyAiJF9SVU5KQVZBIiAkSkFWQV9PUFRTICRDQVRBTElOQV9PUFRTIFwKKyAgICAgIC1EamF2YS5lbmRvcnNlZC5kaXJzPSIkSkFWQV9FTkRPUlNFRF9ESVJTIiAtY2xhc3NwYXRoICIkQ0xBU1NQQVRIIiBcCisgICAgICAtRGNhdGFsaW5hLmJhc2U9IiRDQVRBTElOQV9CQVNFIiBcCisgICAgICAtRGNhdGFsaW5hLmhvbWU9IiRDQVRBTElOQV9IT01FIiBcCisgICAgICAtRGphdmEuaW8udG1wZGlyPSIkQ0FUQUxJTkFfVE1QRElSIiBcCisgICAgICBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0YXJ0dXAuQm9vdHN0cmFwICIkQCIgc3RhcnQKKyAgZmkKKworZWxpZiBbICIkMSIgPSAic3RhcnQiIF0gOyB0aGVuCisKKyAgc2hpZnQKKyAgdG91Y2ggIiRDQVRBTElOQV9CQVNFIi9sb2dzL2NhdGFsaW5hLm91dAorICBpZiBbICIkMSIgPSAiLXNlY3VyaXR5IiBdIDsgdGhlbgorICAgIGVjaG8gIlVzaW5nIFNlY3VyaXR5IE1hbmFnZXIiCisgICAgc2hpZnQKKyAgICAiJF9SVU5KQVZBIiAkSkFWQV9PUFRTICRDQVRBTElOQV9PUFRTIFwKKyAgICAgIC1EamF2YS5lbmRvcnNlZC5kaXJzPSIkSkFWQV9FTkRPUlNFRF9ESVJTIiAtY2xhc3NwYXRoICIkQ0xBU1NQQVRIIiBcCisgICAgICAtRGphdmEuc2VjdXJpdHkubWFuYWdlciBcCisgICAgICAtRGphdmEuc2VjdXJpdHkucG9saWN5PT0iJENBVEFMSU5BX0JBU0UiL2NvbmYvY2F0YWxpbmEucG9saWN5IFwKKyAgICAgIC1EY2F0YWxpbmEuYmFzZT0iJENBVEFMSU5BX0JBU0UiIFwKKyAgICAgIC1EY2F0YWxpbmEuaG9tZT0iJENBVEFMSU5BX0hPTUUiIFwKKyAgICAgIC1EamF2YS5pby50bXBkaXI9IiRDQVRBTElOQV9UTVBESVIiIFwKKyAgICAgIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cC5Cb290c3RyYXAgIiRAIiBzdGFydCBcCisgICAgICA+PiAiJENBVEFMSU5BX0JBU0UiL2xvZ3MvY2F0YWxpbmEub3V0IDI+JjEgJgorCisgICAgICBpZiBbICEgLXogIiRDQVRBTElOQV9QSUQiIF07IHRoZW4KKyAgICAgICAgZWNobyAkISA+ICRDQVRBTElOQV9QSUQKKyAgICAgIGZpCisgIGVsc2UKKyAgICAiJF9SVU5KQVZBIiAkSkFWQV9PUFRTICRDQVRBTElOQV9PUFRTIFwKKyAgICAgIC1EamF2YS5lbmRvcnNlZC5kaXJzPSIkSkFWQV9FTkRPUlNFRF9ESVJTIiAtY2xhc3NwYXRoICIkQ0xBU1NQQVRIIiBcCisgICAgICAtRGNhdGFsaW5hLmJhc2U9IiRDQVRBTElOQV9CQVNFIiBcCisgICAgICAtRGNhdGFsaW5hLmhvbWU9IiRDQVRBTElOQV9IT01FIiBcCisgICAgICAtRGphdmEuaW8udG1wZGlyPSIkQ0FUQUxJTkFfVE1QRElSIiBcCisgICAgICBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0YXJ0dXAuQm9vdHN0cmFwICIkQCIgc3RhcnQgXAorICAgICAgPj4gIiRDQVRBTElOQV9CQVNFIi9sb2dzL2NhdGFsaW5hLm91dCAyPiYxICYKKworICAgICAgaWYgWyAhIC16ICIkQ0FUQUxJTkFfUElEIiBdOyB0aGVuCisgICAgICAgIGVjaG8gJCEgPiAkQ0FUQUxJTkFfUElECisgICAgICBmaQorICBmaQorCitlbGlmIFsgIiQxIiA9ICJzdG9wIiBdIDsgdGhlbgorCisgIHNoaWZ0CisgIEZPUkNFPTAKKyAgaWYgWyAiJDEiID0gIi1mb3JjZSIgXTsgdGhlbgorICAgIHNoaWZ0CisgICAgRk9SQ0U9MQorICBmaQorCisgICIkX1JVTkpBVkEiICRKQVZBX09QVFMgJENBVEFMSU5BX09QVFMgXAorICAgIC1EamF2YS5lbmRvcnNlZC5kaXJzPSIkSkFWQV9FTkRPUlNFRF9ESVJTIiAtY2xhc3NwYXRoICIkQ0xBU1NQQVRIIiBcCisgICAgLURjYXRhbGluYS5iYXNlPSIkQ0FUQUxJTkFfQkFTRSIgXAorICAgIC1EY2F0YWxpbmEuaG9tZT0iJENBVEFMSU5BX0hPTUUiIFwKKyAgICAtRGphdmEuaW8udG1wZGlyPSIkQ0FUQUxJTkFfVE1QRElSIiBcCisgICAgb3JnLmFwYWNoZS5jYXRhbGluYS5zdGFydHVwLkJvb3RzdHJhcCAiJEAiIHN0b3AKKworICBpZiBbICRGT1JDRSAtZXEgMSBdOyB0aGVuCisgICAgaWYgWyAhIC16ICIkQ0FUQUxJTkFfUElEIiBdOyB0aGVuCisgICAgICAgZWNobyAiS2lsbGluZzogYGNhdCAkQ0FUQUxJTkFfUElEYCIKKyAgICAgICBraWxsIC05IGBjYXQgJENBVEFMSU5BX1BJRGAKKyAgICBmaQorICBmaQorCitlbGlmIFsgIiQxIiA9ICJ2ZXJzaW9uIiBdIDsgdGhlbgorCisgICAgIiRfUlVOSkFWQSIgICBcCisgICAgICAtY2xhc3NwYXRoICIkQ0FUQUxJTkFfSE9NRS9zZXJ2ZXIvbGliL2NhdGFsaW5hLmphciIgXAorICAgICAgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLlNlcnZlckluZm8KKworZWxzZQorCisgIGVjaG8gIlVzYWdlOiBjYXRhbGluYS5zaCAoIGNvbW1hbmRzIC4uLiApIgorICBlY2hvICJjb21tYW5kczoiCisgIGlmICRvczQwMDsgdGhlbgorICAgIGVjaG8gIiAgZGVidWcgICAgICAgICAgICAgU3RhcnQgQ2F0YWxpbmEgaW4gYSBkZWJ1Z2dlciAobm90IGF2YWlsYWJsZSBvbiBPUzQwMCkiCisgICAgZWNobyAiICBkZWJ1ZyAtc2VjdXJpdHkgICBEZWJ1ZyBDYXRhbGluYSB3aXRoIGEgc2VjdXJpdHkgbWFuYWdlciAobm90IGF2YWlsYWJsZSBvbiBPUzQwMCkiCisgIGVsc2UKKyAgICBlY2hvICIgIGRlYnVnICAgICAgICAgICAgIFN0YXJ0IENhdGFsaW5hIGluIGEgZGVidWdnZXIiCisgICAgZWNobyAiICBkZWJ1ZyAtc2VjdXJpdHkgICBEZWJ1ZyBDYXRhbGluYSB3aXRoIGEgc2VjdXJpdHkgbWFuYWdlciIKKyAgZmkKKyAgZWNobyAiICBqcGRhIHN0YXJ0ICAgICAgICBTdGFydCBDYXRhbGluYSB1bmRlciBKUERBIGRlYnVnZ2VyIgorICBlY2hvICIgIHJ1biAgICAgICAgICAgICAgIFN0YXJ0IENhdGFsaW5hIGluIHRoZSBjdXJyZW50IHdpbmRvdyIKKyAgZWNobyAiICBydW4gLXNlY3VyaXR5ICAgICBTdGFydCBpbiB0aGUgY3VycmVudCB3aW5kb3cgd2l0aCBzZWN1cml0eSBtYW5hZ2VyIgorICBlY2hvICIgIHN0YXJ0ICAgICAgICAgICAgIFN0YXJ0IENhdGFsaW5hIGluIGEgc2VwYXJhdGUgd2luZG93IgorICBlY2hvICIgIHN0YXJ0IC1zZWN1cml0eSAgIFN0YXJ0IGluIGEgc2VwYXJhdGUgd2luZG93IHdpdGggc2VjdXJpdHkgbWFuYWdlciIKKyAgZWNobyAiICBzdG9wICAgICAgICAgICAgICBTdG9wIENhdGFsaW5hIgorICBlY2hvICIgIHN0b3AgLWZvcmNlICAgICAgIFN0b3AgQ2F0YWxpbmEgKGZvbGxvd2VkIGJ5IGtpbGwgLUtJTEwpIgorICBlY2hvICIgIHZlcnNpb24gICAgICAgICAgIFdoYXQgdmVyc2lvbiBvZiB0b21jYXQgYXJlIHlvdSBydW5uaW5nPyIKKyAgZXhpdCAxCisKK2ZpCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL2Jpbi9jYXRhbGluYS54bWwgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL2Jpbi9jYXRhbGluYS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU3OGQ2NAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvYmluL2NhdGFsaW5hLnhtbApAQCAtMCwwICsxLDIzNCBAQAorPCEtLQorICBYTUwgZmlsZSBmb3IgbGF1bmNoaW5nIENhdGFsaW5hIGFwcGxpY2F0aW9ucyB1c2luZyBhbnQuCistLT4KKworPHByb2plY3QgbmFtZT0iQ2F0YWxpbmEgTGF1bmNoZXIiIGRlZmF1bHQ9ImNhdGFsaW5hIiBiYXNlZGlyPSIuIj4KKyAgPHByb3BlcnR5IGZpbGU9IiR7dXNlci5ob21lfS8udG9tY2F0NS5wcm9wZXJ0aWVzIi8+CisKKyAgPCEtLSBTZXQgdGhlIGFwcGxpY2F0aW9uIGhvbWUgdG8gdGhlIHBhcmVudCBkaXJlY3Rvcnkgb2YgdGhpcyBkaXJlY3RvcnkgLS0+CisgIDxwcm9wZXJ0eSBuYW1lPSJjYXRhbGluYS5ob21lIiBsb2NhdGlvbj0iJHtiYXNlZGlyfS8uLiIvPgorICA8cHJvcGVydHkgbmFtZT0iYm9vdHN0cmFwLmphciIgbG9jYXRpb249IiR7Y2F0YWxpbmEuaG9tZX0vYmluL2Jvb3RzdHJhcC5qYXIiLz4KKworICA8IS0tIEltcG9ydCB0aGUgdXNlcidzIGN1c3RvbSBwcm9wZXJ0aWVzIC0tPgorICA8cHJvcGVydHkgZmlsZT0iJHtjYXRhbGluYS5ob21lfS9iaW4vY2F0YWxpbmEucHJvcGVydGllcyIvPiA8IS0tIFhYWCBzaG9sZCBpdCBiZSBjb25mID8/IC0tPgorICA8cHJvcGVydHkgZmlsZT0iJHtjYXRhbGluYS5ob21lfS9jb25mL2NhdGFsaW5hLnByb3BlcnRpZXMiLz4gPCEtLSBYWFggc2hvbGQgaXQgYmUgY29uZiA/PyAtLT4KKworCisgIDwhLS0gU2V0IHVzZXIgY29uZmlndXJhYmxlIHByb3BlcnRpZXMgLS0+CisgIDxwcm9wZXJ0eSBuYW1lPSJqc3NlLmhvbWUiIGxvY2F0aW9uPSIke2NhdGFsaW5hLmhvbWV9Ii8+CisgIDxwcm9wZXJ0eSBuYW1lPSJjYXRhbGluYS5iYXNlIiBsb2NhdGlvbj0iJHtjYXRhbGluYS5ob21lfSIvPgorICA8cHJvcGVydHkgbmFtZT0iY2F0YWxpbmEudG1wZGlyIiBsb2NhdGlvbj0iJHtjYXRhbGluYS5iYXNlfS90ZW1wIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJjYXRhbGluYS5vdXQiIGxvY2F0aW9uPSIke2NhdGFsaW5hLmJhc2V9L2xvZ3MvY2F0YWxpbmEub3V0Ii8+CisgIDxwcm9wZXJ0eSBuYW1lPSJjYXRhbGluYS5wb2xpY3kiIGxvY2F0aW9uPSIke2NhdGFsaW5hLmJhc2V9L2NvbmYvY2F0YWxpbmEucG9saWN5Ii8+CisgIDxwcm9wZXJ0eSBuYW1lPSJjYXRhbGluYS5qdm0uYXJncyIgdmFsdWU9Ii1Ec3VuLmlvLnVzZUNhbm9uQ2FjaGVzPWZhbHNlIi8+CisKKyAgPHByb3BlcnR5IG5hbWU9ImNhdGFsaW5hLnNvdXJjZS5wYXRoIiB2YWx1ZT0iJHtjYXRhbGluYS5ob21lfS8uLi8uLi9qYWthcnRhLXNlcnZsZXRhcGktNS9zcmMvc2hhcmU6JHtjYXRhbGluYS5ob21lfS8uLi8uLi9qYWthcnRhLXRvbWNhdC1qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmU6JHtjYXRhbGluYS5ob21lfS8uLi8uLi9qYWthcnRhLXRvbWNhdC1jb25uZWN0b3JzL2NveW90ZS9zcmMvamF2YToke2NhdGFsaW5hLmhvbWV9Ly4uLy4uL2pha2FydGEtdG9tY2F0LWNhdGFsaW5hL2NhdGFsaW5hL3NyYy9zaGFyZSIvPgorCisKKyAgPCEtLSBCdWlsZCB0aGUgY2xhc3NwYXRoIHJlbGF0aXZlIHRvIHRoZSBhcHBsaWNhdGlvbiBob21lIC0tPgorICA8cGF0aCBpZD0iYmFzZS5jbGFzcy5wYXRoIj4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Ym9vdHN0cmFwLmphcn0iLz4KKyAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHtqc3NlLmhvbWV9L2xpYi9qc3NlLmphcjoke2pzc2UuaG9tZX0vbGliL2pjZXJ0Lmphcjoke2pzc2UuaG9tZX0vbGliL2puZXQuamFyIi8+CisgIDwvcGF0aD4KKworICA8cHJvcGVydHkgbmFtZT0iYmFzZWRpciIgbG9jYXRpb249Ii4iLz4KKyAgCisgIDxwcm9wZXJ0eSBuYW1lPSJ0b29scy5qYXIiIGxvY2F0aW9uPSIke2phdmEuaG9tZX0vLi4vbGliL3Rvb2xzLmphciIgLz4KKworICA8cGF0aCBpZD0idG9tY2F0Y3AiID4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y2F0YWxpbmEuaG9tZX0vYmluL2Jvb3RzdHJhcC5qYXIiLz4KKyAgICA8IS0tIAorICAgIDxmaWxlc2V0IGRpcj0iJHtjYXRhbGluYS5ob21lfS9jb21tb24vbGliIiBpbmNsdWRlcz0iKi5qYXIiLz4KKyAgICA8ZmlsZXNldCBkaXI9IiR7Y2F0YWxpbmEuaG9tZX0vc2VydmVyL2xpYiIgaW5jbHVkZXM9IiouamFyIi8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NhdGFsaW5hLmhvbWV9L2NvbW1vbi9jbGFzc2VzIi8+CisgICAgLS0+CisgICAgPCEtLSAKKyAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7YW50LmhvbWV9L2xpYi94ZXJjZXNJbXBsLmphciIgLz4KKyAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7YW50LmhvbWV9L2xpYi94bWwtYXBpcy5qYXIiIC8+CisgICAgLS0+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2FudC5ob21lfS9saWIvYW50LmphciIgLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7dG9vbHMuamFyfSIgLz4KKyAgPC9wYXRoPgorIAorCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PSBJbml0aWFsaXphdGlvbi9oZWxwZXJzID09PT09PT09PT09PT09PT09PSAtLT4KKworCisgIDx0YXJnZXQgbmFtZT0iaW5pdCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iRGlzcGxheSBjb25maWd1cmF0aW9uIGFuZCBjb25kaXRpb25hbCBjb21waWxhdGlvbiBmbGFncyI+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iaW5pdC1sYXVuY2hlciIgPgorICAgIDwhLS0gQnVpbGQgdGhlIHN5c3Byb3BlcnRpZXMgcmVsYXRpdmUgdG8gdGhlIGFwcGxpY2F0aW9uIGhvbWUgLS0+CisgICAgPHN5c3Byb3BlcnR5c2V0IGlkPSJiYXNlLnN5cy5wcm9wZXJ0aWVzIj4KKyAgICAgIDxzeXNwcm9wZXJ0eSBrZXk9ImphdmEuZW5kb3JzZWQuZGlycyIgZmlsZT0iJHtjYXRhbGluYS5ob21lfS9jb21tb24vZW5kb3JzZWQiLz4KKyAgICAgIDxzeXNwcm9wZXJ0eSBrZXk9ImphdmEuaW8udG1wZGlyIiBmaWxlPSIke2NhdGFsaW5hLnRtcGRpcn0iLz4KKyAgICAgIDxzeXNwcm9wZXJ0eSBrZXk9ImNhdGFsaW5hLmhvbWUiIGZpbGU9IiR7Y2F0YWxpbmEuaG9tZX0iLz4KKyAgICAgIDxzeXNwcm9wZXJ0eSBrZXk9ImNhdGFsaW5hLmJhc2UiIGZpbGU9IiR7Y2F0YWxpbmEuYmFzZX0iLz4KKyAgICA8L3N5c3Byb3BlcnR5c2V0PgorCisgICAgPCEtLSBCdWlsZCB0aGUgc3RhbmRhcmQganZtYXJncyAtLT4KKyAgICA8anZtYXJnc2V0IGlkPSJiYXNlLmp2bS5hcmdzIj4KKyAgICAgIDxqdm1hcmcgbGluZT0iJHtjYXRhbGluYS5qdm0uYXJnc30iLz4KKyAgICAgIDxqdm1hcmcgdmFsdWU9Ii1YZGVidWciIGlmPSJqcGRhLnNldHRpbmdzIi8+CisgICAgICA8anZtYXJnIHZhbHVlPSItWHJ1bmpkd3A6JHtqcGRhLnNldHRpbmdzfSIgaWY9ImpwZGEuc2V0dGluZ3MiLz4KKyAgICAgIDxqdm1hcmcgdmFsdWU9Ii1zb3VyY2VwYXRoIiBpZj0iamRiIi8+CisgICAgICA8anZtYXJnIHBhdGg9IiR7Y2F0YWxpbmEuc291cmNlLnBhdGh9IiBpZj0iamRiIi8+CisgICAgPC9qdm1hcmdzZXQ+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iZWNoby1jb25maWciID4KKyAgICA8ZWNobz5UT01DQVRfSE9NRT0ke2NhdGFsaW5hLmhvbWV9PC9lY2hvPgorICAgIDxlY2hvPkNMQVNTUEFUSD0ke3RvU3RyaW5nOnRvbWNhdGNwfTwvZWNobz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJoZWxwIiA+CisgICAgPGVjaG8+CisgIFRvIHJ1biBhbnkgb2YgdGhlIGFwcGxpY2F0aW9ucyBpbiB0aGUgSkRCIGRlYnVnZ2VyLCBleGVjdXRlIHRoZSBMYXVuY2hlciB3aXRoCisgIGEgIi1EZGVidWc9dHJ1ZSIgYXJndW1lbnQuCisKKyAgVG8gcnVuIGFueSBvZiB0aGUgYXBwbGljYXRpb25zIGluIEpQREEgbW9kZSwgZXhlY3V0ZSB0aGUgTGF1bmNoZXIgd2l0aCBhCisgICItRGpwZGE9dHJ1ZSIgYXJndW1lbnQuCisgICA8L2VjaG8+CisgIDwvdGFyZ2V0PgorCisgIDwhLS0gVGFyZ2V0IHRoYXQgc2V0cyBKREIgcHJvcGVydGllcyB3aGVuIHRoZSAiZGVidWciIHByb3BlcnR5IGlzIHNldCAtLT4KKyAgPHRhcmdldCBuYW1lPSJzZXRqZGIiIGRlc2NyaXB0aW9uPSJTZXQgSkRCIHByb3BlcnRpZXMiIGlmPSJkZWJ1ZyI+CisgICAgPHByb3BlcnR5IG5hbWU9ImpkYiIgdmFsdWU9InRydWUiLz4KKyAgPC90YXJnZXQ+CisKKyAgPCEtLSBUYXJnZXQgdGhhdCBzZXRzIEpQREEgcHJvcGVydGllcyB3aGVuIHRoZSAianBkYSIgcHJvcGVydHkgaXMgc2V0IC0tPgorICA8dGFyZ2V0IG5hbWU9InNldGpwZGEiIGRlc2NyaXB0aW9uPSJTZXQgSlBEQSBwcm9wZXJ0aWVzIiBpZj0ianBkYSI+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0ianBkYS50cmFuc3BvcnQiIHZhbHVlPSJkdF9zaG1lbSI+CisgICAgICA8b3MgZmFtaWx5PSJ3aW5kb3dzIi8+CisgICAgPC9jb25kaXRpb24+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0ianBkYS50cmFuc3BvcnQiIHZhbHVlPSJkdF9zb2NrZXQiPgorICAgICAgPG5vdD4KKyAgICAgICAgPG9zIGZhbWlseT0id2luZG93cyIvPgorICAgICAgPC9ub3Q+CisgICAgPC9jb25kaXRpb24+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0ianBkYS5hZGRyZXNzIiB2YWx1ZT0iamRiY29ubiI+CisgICAgICA8ZXF1YWxzIGFyZzE9IiR7anBkYS50cmFuc3BvcnR9IiBhcmcyPSJkdF9zaG1lbSIvPgorICAgIDwvY29uZGl0aW9uPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9ImpwZGEuYWRkcmVzcyIgdmFsdWU9IjgwMDAiPgorICAgICAgPG5vdD4KKyAgICAgICAgPGVxdWFscyBhcmcxPSIke2pwZGEudHJhbnNwb3J0fSIgYXJnMj0iZHRfc2htZW0iLz4KKyAgICAgIDwvbm90PgorICAgIDwvY29uZGl0aW9uPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJqcGRhLnN1c3BlbmQiIHZhbHVlPSJ5Ii8+CisgICAgPHByb3BlcnR5IG5hbWU9ImpwZGEuc2V0dGluZ3MiIHZhbHVlPSJ0cmFuc3BvcnQ9JHtqcGRhLnRyYW5zcG9ydH0sYWRkcmVzcz0ke2pwZGEuYWRkcmVzc30sc2VydmVyPXksc3VzcGVuZD0ke2pwZGEuc3VzcGVuZH0iLz4KKyAgPC90YXJnZXQ+CisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09IExhdW5jaGVyLWJhc2VkID09PT09PT09PT09PT09PT09PSAtLT4KKworICA8IS0tIFRhcmdldCB0aGF0IGV4ZWN1dGVzIENhdGFsaW5hIC0tPgorICA8dGFyZ2V0IG5hbWU9ImNhdGFsaW5hIiBkZXNjcmlwdGlvbj0iRXhlY3V0ZSBDYXRhbGluYSIKKyAgICBkZXBlbmRzPSJpbml0LWxhdW5jaGVyLHNldGpkYixzZXRqcGRhIiA+CisKKyAgICA8IS0tIFNldCBkZWZhdWx0IHRpdGxlIGZvciBtaW5pbWl6ZWQgd2luZG93IC0tPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJjYXRhbGluYS53aW5kb3cudGl0bGUiIHZhbHVlPSJDYXRhbGluYSIvPgorCisgICAgPCEtLQorICAgICAgTGF1bmNoIENhdGFsaW5hLiBOb3RlIHRoYXQgdGhlICJmaWx0ZXJjbGFzc25hbWUiIGF0dHJpYnV0ZSB3aWxsIGZvcmNlCisgICAgICB0aGUgIndhaXRmb3JjaGlsZCIgYXR0cmlidXRlIHRvICJ0cnVlIiBpZiBhbnkgaW52YWxpZCBhcmd1bWVudHMgYXJlCisgICAgICB1c2VkIG9yIGlmICJzdGFydCIgaXMgbm90IHRoZSBsYXN0IGFyZ3VtZW50LgorICAgIC0tPgorICAgIDxsYXVuY2ggY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0YXJ0dXAuQm9vdHN0cmFwIgorICAgICAgd2FpdGZvcmNoaWxkPSIke3dhaXR9IgorICAgICAgZGVidWc9IiR7amRifSIKKyAgICAgIHByaW50PSIke3ByaW50fSIKKyAgICAgIGZpbHRlcmNsYXNzbmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5sYXVuY2hlci5DYXRhbGluYUxhdW5jaEZpbHRlciIKKyAgICAgIGZpbHRlcmNsYXNzcGF0aD0iJHtib290c3RyYXAuamFyfSIKKyAgICAgIHVzZXN5c3RlbWluPSJmYWxzZSIKKyAgICAgIHJlcXVpcmV0b29scz0idHJ1ZSIKKyAgICAgIHJlZGlyZWN0b3V0cHV0PSJ0cnVlIgorICAgICAgb3V0cHV0PSIke2NhdGFsaW5hLm91dH0iCisgICAgICBkaXNwbGF5TWluaW1pemVkV2luZG93PSJ0cnVlIgorICAgICAgbWluaW1pemVkV2luZG93VGl0bGU9IiR7Y2F0YWxpbmEud2luZG93LnRpdGxlfSI+CisgICAgICAgIDxqdm1hcmdzZXQgcmVmaWQ9ImJhc2UuanZtLmFyZ3MiLz4KKyAgICAgICAgPHN5c3Byb3BlcnR5c2V0IHJlZmlkPSJiYXNlLnN5cy5wcm9wZXJ0aWVzIi8+CisgICAgICAgIDxzeXNwcm9wZXJ0eSBrZXk9ImphdmEuc2VjdXJpdHkubWFuYWdlciIgdmFsdWU9IiIgaWY9InNlY3VyaXR5Ii8+CisgICAgICAgIDxzeXNwcm9wZXJ0eSBrZXk9ImphdmEuc2VjdXJpdHkucG9saWN5IiB2YWx1ZT0iPSR7Y2F0YWxpbmEucG9saWN5fSIgaWY9InNlY3VyaXR5Ii8+CisgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9ImJhc2UuY2xhc3MucGF0aCIvPgorICAgIDwvbGF1bmNoPgorCisgIDwvdGFyZ2V0PgorCisgIDwhLS0gVGFyZ2V0IHRoYXQgZXhlY3V0ZXMgdGhlIENhdGFsaW5hIHRvb2wgd3JhcHBlciAtLT4KKyAgPHRhcmdldCBuYW1lPSJ0b29sLXdyYXBwZXIiIGRlc2NyaXB0aW9uPSJFeGVjdXRlIENhdGFsaW5hIHRvb2wgd3JhcHBlciIKKyAgICBkZXBlbmRzPSJzZXRqZGIsc2V0anBkYSIgPgorCisgICAgPCEtLSBMYXVuY2ggQ2F0YWxpbmEgdG9vbCB3cmFwcGVyIC0tPgorICAgIDxsYXVuY2ggY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0YXJ0dXAuVG9vbCIKKyAgICAgIGRlYnVnPSIke2pkYn0iCisgICAgICBwcmludD0iJHtwcmludH0iCisgICAgICB1c2VzeXN0ZW1pbj0iZmFsc2UiCisgICAgICByZXF1aXJldG9vbHM9InRydWUiPgorICAgICAgICA8anZtYXJnc2V0IHJlZmlkPSJiYXNlLmp2bS5hcmdzIi8+CisgICAgICAgIDxzeXNwcm9wZXJ0eXNldCByZWZpZD0iYmFzZS5zeXMucHJvcGVydGllcyIvPgorICAgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJiYXNlLmNsYXNzLnBhdGgiLz4KKyAgICA8L2xhdW5jaD4KKworICA8L3RhcmdldD4KKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09IEFudC9KTVggYmFzZWQgPT09PT09PT09PT09PT09PSAtLT4KKworICA8dGFyZ2V0IG5hbWU9InRhc2tkZWYiID4KKyAgICA8cHJvcGVydHkgbmFtZT0idG9tY2F0LmhvbWUiIGxvY2F0aW9uPSIuLiIgLz4KKworICAgIDxwYXRoIGlkPSJqbXgudGVzdC5jbGFzc3BhdGgiPgorICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NvbW1vbnMtbW9kZWxlci5qYXJ9IiAvPgorICAgICAgPGZpbGVzZXQgZGlyPSIke3RvbWNhdC5ob21lfS9jb21tb24vbGliIiBpbmNsdWRlcz0iKi5qYXIiLz4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHt0b21jYXQuaG9tZX0vc2VydmVyL2xpYiIgaW5jbHVkZXM9IiouamFyIi8+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7dG9tY2F0LmhvbWV9L2JpbiIgaW5jbHVkZXM9IiouamFyIi8+CisgICAgPC9wYXRoPgorCisgICAgPCEtLSBwYXJ0IG9mIG1vZGVsZXIgLS0+CisgICAgPHRhc2tkZWYgcmVzb3VyY2U9Ik1FVEEtSU5GL2FudC5wcm9wZXJ0aWVzIgorICAgICAgICAgICAgIGNsYXNzcGF0aHJlZj0iam14LnRlc3QuY2xhc3NwYXRoIiAvPgorICA8L3RhcmdldD4KKworCisgIDx0YXJnZXQgbmFtZT0icnVuIiBkZXBlbmRzPSJlY2hvLWNvbmZpZyx0YXNrZGVmIgorICAgICAgICBkZXNjcmlwdGlvbj0iU3RhcnQgdG9tY2F0IGFzIGEgdGFzayBhbmQgcmV0dXJuIj4KKyAgIAorICAgIDxNTEVUIGNvZGU9Im9yZy5hcGFjaGUuY29tbW9ucy5tb2RlbGVyLkJhc2VNb2RlbE1CZWFuIgorICAgICAgICAgIG5hbWU9ImNhdGFsaW5hOnR5cGU9c2VydmVyIiA+CisgICAgICAgPGFyZyB2YWx1ZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5zdGFydHVwLkNhdGFsaW5hIiAvPgorICAgIDwvTUxFVD4KKworICAgIDxqbXhTZXQgbmFtZT0iY2F0YWxpbmE6dHlwZT1zZXJ2ZXIiCisgICAgICAgICAgICBhdHRyaWJ1dGU9ImNhdGFsaW5hSG9tZSIKKyAgICAgICAgICAgIHZhbHVlPSIke3RvbWNhdC5ob21lfSIvPgorICAKKyAgICA8IS0tIFdlIGNvdWxkIGFsc28gY2FsbCBpbml0IGFuZCBzZXQgb3RoZXIgcHJvcGVydGllcyAtIAorICAgICAgICAgaW5pdCBzaG91bGQgbG9hZCB0aGUgbW9kdWxlcyAtLT4KKworICAgIDxqbXggbmFtZT0iY2F0YWxpbmE6dHlwZT1zZXJ2ZXIiCisgICAgICAgICBtZXRob2Q9InN0YXJ0IiAvPgorICAgIAorICAgIDxlY2hvIG1lc3NhZ2U9IlRvbWNhdDUgcnVubmluZyIvPgorCisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PSBFeGVjL2phdmEgID09PT09PT09PT09PT09PT0gLS0+CisKKyAgPHRhcmdldCBuYW1lPSJqYXZhLXN0YXJ0IiBkZXBlbmRzPSJlY2hvLWNvbmZpZyIgCisgICAgICAgIGRlc2NyaXB0aW9uPSJSdW4gdG9tY2F0IGluLXByb2Nlc3MgYW5kIHdhaXQgZm9yIGl0IHRvIGVuZCwgdXNpbmcgamF2YSB0YXNrIiA+CisKKyAgICA8cHJvcGVydHkgbmFtZT0idG9tY2F0LmZvcmsiIHZhbHVlPSJmYWxzZSIgLz4KKworICAgIDxqYXZhIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5zdGFydHVwLkJvb3RzdHJhcCIgZm9yaz0iJHt0b21jYXQuZm9ya30iPgorICAgICAgPGNsYXNzcGF0aCByZWZpZD0idG9tY2F0Y3AiIC8+CisgICAgICA8YXJnIHZhbHVlPSJzdGFydGQiIC8+CisgICAgICA8c3lzcHJvcGVydHkga2V5PSJjYXRhbGluYS5ob21lIiB2YWx1ZT0iJHtjYXRhbGluYS5ob21lfSIvPgorICAgICAgPHN5c3Byb3BlcnR5IGtleT0iYnVpbGQuY29tcGlsZXIiIHZhbHVlPSJqaWtlcyIvPgorICAgICAgPHN5c3Byb3BlcnR5IGtleT0iamF2YS5lbmRvcnNlZC5kaXJzIiB2YWx1ZT0iJHthbnQuaG9tZX0vbGliOiR7amF2YS5ob21lfS9saWIiLz4KKyAgICA8L2phdmE+CisKKyAgICA8ZWNobyBtZXNzYWdlPSJUb21jYXQ1IHJ1bm5pbmciLz4KKworICA8L3RhcmdldD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9iaW4vY3BhcHBlbmQuYmF0IGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9iaW4vY3BhcHBlbmQuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0NTVlNmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL2Jpbi9jcGFwcGVuZC5iYXQKQEAgLTAsMCArMSwxOSBAQAorcmVtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorcmVtIEFwcGVuZCB0byBDTEFTU1BBVEgKK3JlbQorcmVtICRJZCQKK3JlbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworcmVtIFByb2Nlc3MgdGhlIGZpcnN0IGFyZ3VtZW50CitpZiAiIiUxIiIgPT0gIiIiIiBnb3RvIGVuZAorc2V0IENMQVNTUEFUSD0lQ0xBU1NQQVRIJTslMQorc2hpZnQKKworcmVtIFByb2Nlc3MgdGhlIHJlbWFpbmluZyBhcmd1bWVudHMKKzpzZXRBcmdzCitpZiAiIiUxIiIgPT0gIiIiIiBnb3RvIGRvbmVTZXRBcmdzCitzZXQgQ0xBU1NQQVRIPSVDTEFTU1BBVEglICUxCitzaGlmdAorZ290byBzZXRBcmdzCis6ZG9uZVNldEFyZ3MKKzplbmQKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvYmluL2RpZ2VzdC5iYXQgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL2Jpbi9kaWdlc3QuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwNWY3MTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL2Jpbi9kaWdlc3QuYmF0CkBAIC0wLDAgKzEsNDEgQEAKK0BlY2hvIG9mZgoraWYgIiVPUyUiID09ICJXaW5kb3dzX05UIiBzZXRsb2NhbAorcmVtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorcmVtIFNjcmlwdCB0byBkaWdlc3QgcGFzc3dvcmQgdXNpbmcgdGhlIGFsZ29yaXRobSBzcGVjaWZpZWQKK3JlbQorcmVtICRJZCQKK3JlbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworcmVtIEd1ZXNzIENBVEFMSU5BX0hPTUUgaWYgbm90IGRlZmluZWQKK2lmIG5vdCAiJUNBVEFMSU5BX0hPTUUlIiA9PSAiIiBnb3RvIGdvdEhvbWUKK3NldCBDQVRBTElOQV9IT01FPS4KK2lmIGV4aXN0ICIlQ0FUQUxJTkFfSE9NRSVcYmluXHRvb2wtd3JhcHBlci5iYXQiIGdvdG8gb2tIb21lCitzZXQgQ0FUQUxJTkFfSE9NRT0uLgorOmdvdEhvbWUKK2lmIGV4aXN0ICIlQ0FUQUxJTkFfSE9NRSVcYmluXHRvb2wtd3JhcHBlci5iYXQiIGdvdG8gb2tIb21lCitlY2hvIFRoZSBDQVRBTElOQV9IT01FIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5vdCBkZWZpbmVkIGNvcnJlY3RseQorZWNobyBUaGlzIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5lZWRlZCB0byBydW4gdGhpcyBwcm9ncmFtCitnb3RvIGVuZAorOm9rSG9tZQorCitzZXQgRVhFQ1VUQUJMRT0lQ0FUQUxJTkFfSE9NRSVcYmluXHRvb2wtd3JhcHBlci5iYXQKKworcmVtIENoZWNrIHRoYXQgdGFyZ2V0IGV4ZWN1dGFibGUgZXhpc3RzCitpZiBleGlzdCAiJUVYRUNVVEFCTEUlIiBnb3RvIG9rRXhlYworZWNobyBDYW5ub3QgZmluZCAlRVhFQ1VUQUJMRSUKK2VjaG8gVGhpcyBmaWxlIGlzIG5lZWRlZCB0byBydW4gdGhpcyBwcm9ncmFtCitnb3RvIGVuZAorOm9rRXhlYworCityZW0gR2V0IHJlbWFpbmluZyB1bnNoaWZ0ZWQgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBhbmQgc2F2ZSB0aGVtIGluIHRoZQorc2V0IENNRF9MSU5FX0FSR1M9Cis6c2V0QXJncworaWYgIiIlMSIiPT0iIiIiIGdvdG8gZG9uZVNldEFyZ3MKK3NldCBDTURfTElORV9BUkdTPSVDTURfTElORV9BUkdTJSAlMQorc2hpZnQKK2dvdG8gc2V0QXJncworOmRvbmVTZXRBcmdzCisKK2NhbGwgIiVFWEVDVVRBQkxFJSIgLXNlcnZlciBvcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtLlJlYWxtQmFzZSAlQ01EX0xJTkVfQVJHUyUKKworOmVuZApkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9iaW4vZGlnZXN0LnNoIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9iaW4vZGlnZXN0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhNjIyZjIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL2Jpbi9kaWdlc3Quc2gKQEAgLTAsMCArMSwzMSBAQAorIyEvYmluL3NoCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFNjcmlwdCB0byBkaWdlc3QgcGFzc3dvcmQgdXNpbmcgdGhlIGFsZ29yaXRobSBzcGVjaWZpZWQKKyMKKyMgJElkJAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIHJlc29sdmUgbGlua3MgLSAkMCBtYXkgYmUgYSBzb2Z0bGluaworUFJHPSIkMCIKKword2hpbGUgWyAtaCAiJFBSRyIgXSA7IGRvCisgIGxzPWBscyAtbGQgIiRQUkciYAorICBsaW5rPWBleHByICIkbHMiIDogJy4qLT4gXCguKlwpJCdgCisgIGlmIGV4cHIgIiRsaW5rIiA6ICcuKi8uKicgPiAvZGV2L251bGw7IHRoZW4KKyAgICBQUkc9IiRsaW5rIgorICBlbHNlCisgICAgUFJHPWBkaXJuYW1lICIkUFJHImAvIiRsaW5rIgorICBmaQorZG9uZQorIAorUFJHRElSPWBkaXJuYW1lICIkUFJHImAKK0VYRUNVVEFCTEU9dG9vbC13cmFwcGVyLnNoCisKKyMgQ2hlY2sgdGhhdCB0YXJnZXQgZXhlY3V0YWJsZSBleGlzdHMKK2lmIFsgISAteCAiJFBSR0RJUiIvIiRFWEVDVVRBQkxFIiBdOyB0aGVuCisgIGVjaG8gIkNhbm5vdCBmaW5kICRQUkdESVIvJEVYRUNVVEFCTEUiCisgIGVjaG8gIlRoaXMgZmlsZSBpcyBuZWVkZWQgdG8gcnVuIHRoaXMgcHJvZ3JhbSIKKyAgZXhpdCAxCitmaQorCitleGVjICIkUFJHRElSIi8iJEVYRUNVVEFCTEUiIC1zZXJ2ZXIgb3JnLmFwYWNoZS5jYXRhbGluYS5yZWFsbS5SZWFsbUJhc2UgIiRAIgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9iaW4vbGF1bmNoZXIucHJvcGVydGllcyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvYmluL2xhdW5jaGVyLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU3MjJkYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvYmluL2xhdW5jaGVyLnByb3BlcnRpZXMKQEAgLTAsMCArMSwyMyBAQAorIworIyBQcm9wZXJ0aWVzIGZvciB0aGUgTGF1bmNoZXJCb290c3RyYXAgY2xhc3MKKyMKKyMgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgY29uZmlndXJhYmxlIHByb3BlcnRpZXM6CisjIC0gYW50LmNsYXNzLnBhdGggLSBUaGlzIHByb3BlcnR5IGlzIGEgIjoiIHNlcGFyYXRlZCBsaXN0IG9mIHRoZSBVUkwgZmlsZQorIyAgIGZyYWdtZW50cyB3aGVyZSB0aGUgQW50IGNsYXNzZXMgYXJlIGxvY2F0ZWQuIFRoZSBsaXN0IG11c3QgaW5jbHVkZSBhIEpBWFAKKyMgICBjb21wbGlhbnQgWE1MIHBhcnNlciBpZiB5b3UgYXJlIG5vdCB1c2luZyBKYXZhKFRNKSBTRSAxLjQgb3IgaGlnaGVyLgorIworIyBJbXBvcnRhbnQgbm90ZXM6CisjIC0gUmVsYXRpdmUgVVJMIGZpbGUgZnJhZ21lbnRzLCBzdWNoIGFzICIuLi9saWIiLCBhcmUgc3VwcG9ydGVkIGFuZCBzdHJvbmdseQorIyAgIGVuY291cmFnZWQgYXMgYWJzb2x1dGUgZmlsZXMgcHJldmVudCBjcm9zcyBwbGF0Zm9ybSBkaXN0cmlidXRpb24uCisjIC0gVVJMIGZpbGUgZnJhZ21lbnRzIGFyZSB0aGUgcG9ydGlvbnMgb2YgYSBVUkwgYWZ0ZXIgdGhlICJmaWxlOiIgc3RyaW5nLgorIyAgIFRoaXMgbWVhbnMgdGhhdCB5b3UgbXVzdCB1c2UgIi8iIGNoYXJhY3RlcnMgYXMgZGlyZWN0b3J5IHNlcGFyYXRvcnMgb24KKyMgICBhbGwgcGxhdGZvcm1zLiBBbHNvLCAiOiIgY2hhcmFjdGVycyBpbiBhIGZpbGUgZnJhZ21lbnQsIHN1Y2ggYXMgaW4gZHJpdmUKKyMgICBwb3J0aW9uIG9mIGFic29sdXRlIFdpbmRvd3MgZmlsZXMsIG11c3QgYmUgVVJMIGVuY29kZWQgYXMgIiUzQSIuIExhc3RseSwKKyMgICBkaXJlY3RvcmllcyBtdXN0IGhhdmUgYSAiLyIgY2hhcmFjdGVyIGF0IHRoZSBlbmQuCisjIC0gQWxsIHJlbGF0aXZlIFVSTCBmaWxlIGZyYWdtZW50cyBpbiB0aGUgYWJvdmUgcHJvcGVydGllcyB3aWxsIGJlIHJlc29sdmVkCisjICAgdXNpbmcgdGhlIFVSTCBvZiB0aGUgZGlyZWN0b3J5IHRoYXQgdGhlIExhdW5jaGVyQm9vdHN0cmFwIGNsYXNzIHdhcworIyAgIGxvYWRlZCBmcm9tLCBub3QgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuIFRoaXMgZW5zdXJlcyB0aGF0IHRoZQorIyAgIExhdW5jaGVyQm9vdHN0cmFwIGNsYXNzIGNhbiBwcm9wZXJseSByZXNvbHZlIHRoZSBmaWxlcyB3aXRob3V0IHJlZ2FyZCB0bworIyAgIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LgorIworYW50LmNsYXNzLnBhdGg9Li4vY29tbW9uL2xpYi9hbnQuamFyOi4uL2NvbW1vbi9saWIvYW50LWxhdW5jaGVyLmphcjouLi9jb21tb24vZW5kb3JzZWQveGVyY2VzSW1wbC5qYXI6Li4vY29tbW9uL2VuZG9yc2VkL3htbC1hcGlzLmphcgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9iaW4vc2VydmljZS5iYXQgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL2Jpbi9zZXJ2aWNlLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWE0YmM4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9iaW4vc2VydmljZS5iYXQKQEAgLTAsMCArMSwxMDkgQEAKK0BlY2hvIG9mZgoraWYgIiVPUyUiID09ICJXaW5kb3dzX05UIiBzZXRsb2NhbAorcmVtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorcmVtIE5UIFNlcnZpY2UgSW5zdGFsbC9Vbmluc3RhbGwgc2NyaXB0CityZW0KK3JlbSBPcHRpb25zCityZW0gaW5zdGFsbCAgICAgICAgICAgICAgICBJbnN0YWxsIHRoZSBzZXJ2aWNlIHVzaW5nIFRvbWNhdDUgYXMgc2VydmljZSBuYW1lLgorcmVtICAgICAgICAgICAgICAgICAgICAgICAgU2VydmljZSBpcyBpbnN0YWxsZWQgdXNpbmcgZGVmYXVsdCBzZXR0aW5ncy4KK3JlbSByZW1vdmUgICAgICAgICAgICAgICAgIFJlbW92ZSB0aGUgc2VydmljZSBmcm9tIHRoZSBTeXN0ZW0uCityZW0KK3JlbSBuYW1lICAgICAgICAob3B0aW9uYWwpIElmIHRoZSBzZWNvbmQgYXJndW1lbnQgaXMgcHJlc2VudCBpdCBpcyBjb25zaWRlcmVkCityZW0gICAgICAgICAgICAgICAgICAgICAgICB0byBiZSBuZXcgc2VydmljZSBuYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorcmVtCityZW0gJElkJAorcmVtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCityZW0gR3Vlc3MgQ0FUQUxJTkFfSE9NRSBpZiBub3QgZGVmaW5lZAorc2V0IENVUlJFTlRfRElSPSVjZCUKK2lmIG5vdCAiJUNBVEFMSU5BX0hPTUUlIiA9PSAiIiBnb3RvIGdvdEhvbWUKK3NldCBDQVRBTElOQV9IT01FPSVjZCUKK2lmIGV4aXN0ICIlQ0FUQUxJTkFfSE9NRSVcYmluXHRvbWNhdDUuZXhlIiBnb3RvIG9rSG9tZQorcmVtIENEIHRvIHRoZSB1cHBlciBkaXIKK2NkIC4uCitzZXQgQ0FUQUxJTkFfSE9NRT0lY2QlCis6Z290SG9tZQoraWYgZXhpc3QgIiVDQVRBTElOQV9IT01FJVxiaW5cdG9tY2F0NS5leGUiIGdvdG8gb2tIb21lCitlY2hvIFRoZSB0b21jYXQuZXhlIHdhcyBub3QgZm91bmQuLi4KK2VjaG8gVGhlIENBVEFMSU5BX0hPTUUgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbm90IGRlZmluZWQgY29ycmVjdGx5LgorZWNobyBUaGlzIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5lZWRlZCB0byBydW4gdGhpcyBwcm9ncmFtCitnb3RvIGVuZAorcmVtIE1ha2Ugc3VyZSBwcmVyZXF1aXNpdGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBzZXQKK2lmIG5vdCAiJUpBVkFfSE9NRSUiID09ICIiIGdvdG8gb2tIb21lCitlY2hvIFRoZSBKQVZBX0hPTUUgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbm90IGRlZmluZWQKK2VjaG8gVGhpcyBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBuZWVkZWQgdG8gcnVuIHRoaXMgcHJvZ3JhbQorZ290byBlbmQgCis6b2tIb21lCitpZiBub3QgIiVDQVRBTElOQV9CQVNFJSIgPT0gIiIgZ290byBnb3RCYXNlCitzZXQgQ0FUQUxJTkFfQkFTRT0lQ0FUQUxJTkFfSE9NRSUKKzpnb3RCYXNlCisgCitzZXQgRVhFQ1VUQUJMRT0lQ0FUQUxJTkFfSE9NRSVcYmluXHRvbWNhdDUuZXhlCisKK3JlbSBTZXQgZGVmYXVsdCBTZXJ2aWNlIG5hbWUKK3NldCBTRVJWSUNFX05BTUU9VG9tY2F0NQorc2V0IFBSX0RJU1BMQVlOQU1FPUFwYWNoZSBUb21jYXQKKworaWYgIiUxIiA9PSAiIiBnb3RvIGRpc3BsYXlVc2FnZQoraWYgIiUyIiA9PSAiIiBnb3RvIHNldFNlcnZpY2VOYW1lCitzZXQgU0VSVklDRV9OQU1FPSUyCitzZXQgUFJfRElTUExBWU5BTUU9QXBhY2hlIFRvbWNhdCAlMgorOnNldFNlcnZpY2VOYW1lCitpZiAlMSA9PSBpbnN0YWxsIGdvdG8gZG9JbnN0YWxsCitpZiAlMSA9PSByZW1vdmUgZ290byBkb1JlbW92ZQorZWNobyBVbmtub3duIHBhcmFtZXRlciAiJTEiCis6ZGlzcGxheVVzYWdlCitlY2hvIAorZWNobyBVc2FnZTogc2VydmljZS5iYXQgaW5zdGFsbC9yZW1vdmUgW3NlcnZpY2VfbmFtZV0KK2dvdG8gZW5kCisKKzpkb1JlbW92ZQorcmVtIFJlbW92ZSB0aGUgc2VydmljZQorIiVFWEVDVVRBQkxFJSIgLy9EUy8vJVNFUlZJQ0VfTkFNRSUKK2VjaG8gVGhlIHNlcnZpY2UgJyVTRVJWSUNFX05BTUUlJyBoYXMgYmVlbiByZW1vdmVkCitnb3RvIGVuZAorCis6ZG9JbnN0YWxsCityZW0gSW5zdGFsbCB0aGUgc2VydmljZQorZWNobyBJbnN0YWxsaW5nIHRoZSBzZXJ2aWNlICclU0VSVklDRV9OQU1FJScgLi4uCitlY2hvIFVzaW5nIENBVEFMSU5BX0hPTUU6ICAgICVDQVRBTElOQV9IT01FJQorZWNobyBVc2luZyBKQVZBX0hPTUU6ICAgICAgICAlSkFWQV9IT01FJQorCityZW0gVXNlIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXMgYW4gZXhhcGxlCityZW0gRWFjaCBjb21tYW5kIGxpbmUgb3B0aW9uIGlzIHByZWZpeGVkIHdpdGggUFJfCisKK3NldCBQUl9ERVNDUklQVElPTj1BcGFjaGUgVG9tY2F0IFNlcnZlciAtIGh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvdG9tY2F0CitzZXQgUFJfSU5TVEFMTD0lRVhFQ1VUQUJMRSUKK3NldCBQUl9MT0dQQVRIPSVDQVRBTElOQV9IT01FJVxsb2dzCitzZXQgUFJfQ0xBU1NQQVRIPSVDQVRBTElOQV9IT01FJVxiaW5cYm9vdHN0cmFwLmphcgorcmVtIFNldCB0aGUgc2VydmVyIGp2bSBmcm9tIEpBVkFfSE9NRQorc2V0IFBSX0pWTT0lSkFWQV9IT01FJVxqcmVcYmluXHNlcnZlclxqdm0uZGxsCitpZiBleGlzdCAiJVBSX0pWTSUiIGdvdG8gZm91bmRKdm0KK3JlbSBTZXQgdGhlIGNsaWVudCBqdm0gZnJvbSBKQVZBX0hPTUUKK3NldCBQUl9KVk09JUpBVkFfSE9NRSVcanJlXGJpblxjbGllbnRcanZtLmRsbAoraWYgZXhpc3QgIiVQUl9KVk0lIiBnb3RvIGZvdW5kSnZtCitzZXQgUFJfSlZNPWF1dG8KKzpmb3VuZEp2bQorZWNobyBVc2luZyBKVk06ICAgICAgICAgICAgICAlUFJfSlZNJQorIiVFWEVDVVRBQkxFJSIgLy9JUy8vJVNFUlZJQ0VfTkFNRSUgLS1TdGFydENsYXNzIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cC5Cb290c3RyYXAgLS1TdG9wQ2xhc3Mgb3JnLmFwYWNoZS5jYXRhbGluYS5zdGFydHVwLkJvb3RzdHJhcCAtLVN0YXJ0UGFyYW1zIHN0YXJ0IC0tU3RvcFBhcmFtcyBzdG9wCitpZiBub3QgZXJyb3JsZXZlbCAxIGdvdG8gaW5zdGFsbGVkCitlY2hvIEZhaWxlZCBpbnN0YWxsaW5nICclU0VSVklDRV9OQU1FJScgc2VydmljZQorZ290byBlbmQKKzppbnN0YWxsZWQKK3JlbSBDbGVhciB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzLiBUaGV5IGFyZSBub3QgbmVlZGVkIGFueSBtb3JlLgorc2V0IFBSX0RJU1BMQVlOQU1FPQorc2V0IFBSX0RFU0NSSVBUSU9OPQorc2V0IFBSX0lOU1RBTEw9CitzZXQgUFJfTE9HUEFUSD0KK3NldCBQUl9DTEFTU1BBVEg9CitzZXQgUFJfSlZNPQorcmVtIFNldCBleHRyYSBwYXJhbWV0ZXJzCisiJUVYRUNVVEFCTEUlIiAvL1VTLy8lU0VSVklDRV9OQU1FJSAtLUp2bU9wdGlvbnMgIi1EY2F0YWxpbmEuYmFzZT0lQ0FUQUxJTkFfQkFTRSU7LURjYXRhbGluYS5ob21lPSVDQVRBTElOQV9IT01FJTstRGphdmEuZW5kb3JzZWQuZGlycz0lQ0FUQUxJTkFfSE9NRSVcY29tbW9uXGVuZG9yc2VkIiAtLVN0YXJ0TW9kZSBqdm0gLS1TdG9wTW9kZSBqdm0KK3JlbSBNb3JlIGV4dHJhIHBhcmFtZXRlcnMKK3NldCBQUl9TVERPVVRQVVQ9JUNBVEFMSU5BX0hPTUUlXGxvZ3Ncc3Rkb3V0LmxvZworc2V0IFBSX1NUREVSUk9SPSVDQVRBTElOQV9IT01FJVxsb2dzXHN0ZGVyci5sb2cKKyIlRVhFQ1VUQUJMRSUiIC8vVVMvLyVTRVJWSUNFX05BTUUlICsrSnZtT3B0aW9ucyAiLURqYXZhLmlvLnRtcGRpcj0lQ0FUQUxJTkFfQkFTRSVcdGVtcCIgLS1Kdm1NcyAxMjggLS1Kdm1NeCAyNTYKK2VjaG8gVGhlIHNlcnZpY2UgJyVTRVJWSUNFX05BTUUlJyBoYXMgYmVlbiBpbnN0YWxsZWQuCisKKzplbmQKK2NkICVDVVJSRU5UX0RJUiUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvYmluL3NldGNsYXNzcGF0aC5iYXQgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL2Jpbi9zZXRjbGFzc3BhdGguYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiN2VkMTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL2Jpbi9zZXRjbGFzc3BhdGguYmF0CkBAIC0wLDAgKzEsNTcgQEAKK3JlbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3JlbSBTZXQgQ0xBU1NQQVRIIGFuZCBKYXZhIG9wdGlvbnMKK3JlbQorcmVtICRJZCQKK3JlbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworcmVtIE1ha2Ugc3VyZSBwcmVyZXF1aXNpdGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBzZXQKK2lmIG5vdCAiJUpBVkFfSE9NRSUiID09ICIiIGdvdG8gZ290SmF2YUhvbWUKK2VjaG8gVGhlIEpBVkFfSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBub3QgZGVmaW5lZAorZWNobyBUaGlzIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5lZWRlZCB0byBydW4gdGhpcyBwcm9ncmFtCitnb3RvIGV4aXQKKzpnb3RKYXZhSG9tZQoraWYgbm90IGV4aXN0ICIlSkFWQV9IT01FJVxiaW5camF2YS5leGUiIGdvdG8gbm9KYXZhSG9tZQoraWYgbm90IGV4aXN0ICIlSkFWQV9IT01FJVxiaW5camF2YXcuZXhlIiBnb3RvIG5vSmF2YUhvbWUKK2lmIG5vdCBleGlzdCAiJUpBVkFfSE9NRSVcYmluXGpkYi5leGUiIGdvdG8gbm9KYXZhSG9tZQoraWYgbm90IGV4aXN0ICIlSkFWQV9IT01FJVxiaW5camF2YWMuZXhlIiBnb3RvIG5vSmF2YUhvbWUKK2dvdG8gb2tKYXZhSG9tZQorOm5vSmF2YUhvbWUKK2VjaG8gVGhlIEpBVkFfSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBub3QgZGVmaW5lZCBjb3JyZWN0bHkKK2VjaG8gVGhpcyBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBuZWVkZWQgdG8gcnVuIHRoaXMgcHJvZ3JhbQorZWNobyBOQjogSkFWQV9IT01FIHNob3VsZCBwb2ludCB0byBhIEpESyBub3QgYSBKUkUKK2dvdG8gZXhpdAorOm9rSmF2YUhvbWUKKworaWYgbm90ICIlQkFTRURJUiUiID09ICIiIGdvdG8gZ290QmFzZWRpcgorZWNobyBUaGUgQkFTRURJUiBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBub3QgZGVmaW5lZAorZWNobyBUaGlzIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5lZWRlZCB0byBydW4gdGhpcyBwcm9ncmFtCitnb3RvIGV4aXQKKzpnb3RCYXNlZGlyCitpZiBleGlzdCAiJUJBU0VESVIlXGJpblxzZXRjbGFzc3BhdGguYmF0IiBnb3RvIG9rQmFzZWRpcgorZWNobyBUaGUgQkFTRURJUiBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBub3QgZGVmaW5lZCBjb3JyZWN0bHkKK2VjaG8gVGhpcyBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBuZWVkZWQgdG8gcnVuIHRoaXMgcHJvZ3JhbQorZ290byBleGl0Cis6b2tCYXNlZGlyCisKK3JlbSBTZXQgdGhlIGRlZmF1bHQgLURqYXZhLmVuZG9yc2VkLmRpcnMgYXJndW1lbnQKK3NldCBKQVZBX0VORE9SU0VEX0RJUlM9JUJBU0VESVIlXGNvbW1vblxlbmRvcnNlZAorCityZW0gU2V0IHN0YW5kYXJkIENMQVNTUEFUSAorcmVtIE5vdGUgdGhhdCB0aGVyZSBhcmUgbm8gcXVvdGVzIGFzIHdlIGRvIG5vdCB3YW50IHRvIGludHJvZHVjZSByYW5kb20KK3JlbSBxdW90ZXMgaW50byB0aGUgQ0xBU1NQQVRICitzZXQgQ0xBU1NQQVRIPSVKQVZBX0hPTUUlXGxpYlx0b29scy5qYXIKKworcmVtIFNldCBzdGFuZGFyZCBjb21tYW5kIGZvciBpbnZva2luZyBKYXZhLgorcmVtIE5vdGUgdGhhdCBOVCByZXF1aXJlcyBhIHdpbmRvdyBuYW1lIGFyZ3VtZW50IHdoZW4gdXNpbmcgc3RhcnQuCityZW0gQWxzbyBub3RlIHRoZSBxdW90aW5nIGFzIEpBVkFfSE9NRSBtYXkgY29udGFpbiBzcGFjZXMuCitzZXQgX1JVTkpBVkE9IiVKQVZBX0hPTUUlXGJpblxqYXZhIgorc2V0IF9SVU5KQVZBVz0iJUpBVkFfSE9NRSVcYmluXGphdmF3Igorc2V0IF9SVU5KREI9IiVKQVZBX0hPTUUlXGJpblxqZGIiCitzZXQgX1JVTkpBVkFDPSIlSkFWQV9IT01FJVxiaW5camF2YWMiCisKK2dvdG8gZW5kCisKKzpleGl0CitleGl0IC9iIDEKKworOmVuZApkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9iaW4vc2V0Y2xhc3NwYXRoLnNoIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9iaW4vc2V0Y2xhc3NwYXRoLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjNTBiODAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL2Jpbi9zZXRjbGFzc3BhdGguc2gKQEAgLTAsMCArMSw2MSBAQAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAgU2V0IENMQVNTUEFUSCBhbmQgSmF2YSBvcHRpb25zCisjCisjICAkSWQkCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgTWFrZSBzdXJlIHByZXJlcXVpc2l0ZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIHNldAoraWYgWyAteiAiJEpBVkFfSE9NRSIgXTsgdGhlbgorICBlY2hvICJUaGUgSkFWQV9IT01FIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5vdCBkZWZpbmVkIgorICBlY2hvICJUaGlzIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5lZWRlZCB0byBydW4gdGhpcyBwcm9ncmFtIgorICBleGl0IDEKK2ZpCitpZiAkb3M0MDA7IHRoZW4KKyAgaWYgWyAhIC14ICIkSkFWQV9IT01FIi9iaW4vamF2YSAtbyAhIC14ICIkSkFWQV9IT01FIi9iaW4vamF2YWMgXTsgdGhlbgorICAgIGVjaG8gIlRoZSBKQVZBX0hPTUUgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbm90IGRlZmluZWQgY29ycmVjdGx5IgorICAgIGVjaG8gIlRoaXMgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbmVlZGVkIHRvIHJ1biB0aGlzIHByb2dyYW0iCisgICAgZWNobyAiTkI6IEpBVkFfSE9NRSBzaG91bGQgcG9pbnQgdG8gYSBKREsgbm90IGEgSlJFIgorICAgIGV4aXQgMQorICBmaQorZWxzZQorICBpZiBbICEgLXggIiRKQVZBX0hPTUUiL2Jpbi9qYXZhIC1vICEgLXggIiRKQVZBX0hPTUUiL2Jpbi9qZGIgLW8gISAteCAiJEpBVkFfSE9NRSIvYmluL2phdmFjIF07IHRoZW4KKyAgICBlY2hvICJUaGUgSkFWQV9IT01FIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5vdCBkZWZpbmVkIGNvcnJlY3RseSIKKyAgICBlY2hvICJUaGlzIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5lZWRlZCB0byBydW4gdGhpcyBwcm9ncmFtIgorICAgIGVjaG8gIk5COiBKQVZBX0hPTUUgc2hvdWxkIHBvaW50IHRvIGEgSkRLIG5vdCBhIEpSRSIKKyAgICBleGl0IDEKKyAgZmkKK2ZpCitpZiBbIC16ICIkQkFTRURJUiIgXTsgdGhlbgorICBlY2hvICJUaGUgQkFTRURJUiBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBub3QgZGVmaW5lZCIKKyAgZWNobyAiVGhpcyBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBuZWVkZWQgdG8gcnVuIHRoaXMgcHJvZ3JhbSIKKyAgZXhpdCAxCitmaQoraWYgWyAhIC14ICIkQkFTRURJUiIvYmluL3NldGNsYXNzcGF0aC5zaCBdOyB0aGVuCisgIGVjaG8gIlRoZSBCQVNFRElSIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5vdCBkZWZpbmVkIGNvcnJlY3RseSIKKyAgZWNobyAiVGhpcyBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBuZWVkZWQgdG8gcnVuIHRoaXMgcHJvZ3JhbSIKKyAgZXhpdCAxCitmaQorCisjIFNldCB0aGUgZGVmYXVsdCAtRGphdmEuZW5kb3JzZWQuZGlycyBhcmd1bWVudAorSkFWQV9FTkRPUlNFRF9ESVJTPSIkQkFTRURJUiIvY29tbW9uL2VuZG9yc2VkCisKKyMgU2V0IHN0YW5kYXJkIENMQVNTUEFUSAorQ0xBU1NQQVRIPSIkSkFWQV9IT01FIi9saWIvdG9vbHMuamFyCisKKyMgT1NYIGhhY2sgdG8gQ0xBU1NQQVRICitKSUtFU1BBVEg9CitpZiBbIGB1bmFtZSAtc2AgPSAiRGFyd2luIiBdOyB0aGVuCisgIE9TWEhBQ0s9Ii9TeXN0ZW0vTGlicmFyeS9GcmFtZXdvcmtzL0phdmFWTS5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudEpESy9DbGFzc2VzIgorICBpZiBbIC1kICIkT1NYSEFDSyIgXTsgdGhlbgorICAgIGZvciBpIGluICIkT1NYSEFDSyIvKi5qYXI7IGRvCisgICAgICBKSUtFU1BBVEg9IiRKSUtFU1BBVEgiOiIkaSIKKyAgICBkb25lCisgIGZpCitmaQorCisjIFNldCBzdGFuZGFyZCBjb21tYW5kcyBmb3IgaW52b2tpbmcgSmF2YS4KK19SVU5KQVZBPSIkSkFWQV9IT01FIi9iaW4vamF2YQoraWYgWyAkb3M0MDAgPSBmYWxzZSBdOyB0aGVuCisgIF9SVU5KREI9IiRKQVZBX0hPTUUiL2Jpbi9qZGIKK2ZpCitfUlVOSkFWQUM9IiRKQVZBX0hPTUUiL2Jpbi9qYXZhYwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9iaW4vc2h1dGRvd24tdXNpbmctbGF1bmNoZXIuYmF0IGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9iaW4vc2h1dGRvd24tdXNpbmctbGF1bmNoZXIuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMzRlZGMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL2Jpbi9zaHV0ZG93bi11c2luZy1sYXVuY2hlci5iYXQKQEAgLTAsMCArMSwzOSBAQAorQGVjaG8gb2ZmCitpZiAiJU9TJSIgPT0gIldpbmRvd3NfTlQiIHNldGxvY2FsCisKK3JlbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3JlbQorcmVtIFNjcmlwdCBmb3Igc2h1dHRpbmcgZG93biBDYXRhbGluYSB1c2luZyB0aGUgTGF1bmNoZXIKK3JlbQorcmVtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCityZW0gR2V0IHN0YW5kYXJkIGVudmlyb25tZW50IHZhcmlhYmxlcworc2V0IFBSRz0lMAoraWYgZXhpc3QgJVBSRyVcLi5cc2V0ZW52LmJhdCBnb3RvIGdvdENtZFBhdGgKK3JlbSAlMCBtdXN0IGhhdmUgYmVlbiBmb3VuZCBieSBET1MgdXNpbmcgdGhlICVQQVRIJSBzbyB3ZSBhc3N1bWUgdGhhdAorcmVtIHNldGVudi5iYXQgd2lsbCBhbHNvIGJlIGZvdW5kIGluIHRoZSAlUEFUSCUKK2dvdG8gZG9uZVNldGVudgorOmdvdENtZFBhdGgKK2NhbGwgJVBSRyVcLi5cc2V0ZW52LmJhdAorOmRvbmVTZXRlbnYKKworcmVtIE1ha2Ugc3VyZSBwcmVyZXF1aXNpdGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBzZXQKK2lmIG5vdCAiJUpBVkFfSE9NRSUiID09ICIiIGdvdG8gZ290SmF2YUhvbWUKK2VjaG8gVGhlIEpBVkFfSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBub3QgZGVmaW5lZAorZWNobyBUaGlzIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5lZWRlZCB0byBydW4gdGhpcyBwcm9ncmFtCitnb3RvIGVuZAorOmdvdEphdmFIb21lCisKK3JlbSBHZXQgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBhbmQgc2F2ZSB0aGVtIHdpdGggdGhlIHByb3BlciBxdW90aW5nCitzZXQgQ01EX0xJTkVfQVJHUz0KKzpzZXRBcmdzCitpZiAiIiUxIiI9PSIiIiIgZ290byBkb25lU2V0QXJncworc2V0IENNRF9MSU5FX0FSR1M9JUNNRF9MSU5FX0FSR1MlICUxCitzaGlmdAorZ290byBzZXRBcmdzCis6ZG9uZVNldEFyZ3MKKworcmVtIEV4ZWN1dGUgdGhlIExhdW5jaGVyIHVzaW5nIHRoZSAiY2F0YWxpbmEiIHRhcmdldAorIiVKQVZBX0hPTUUlXGJpblxqYXZhLmV4ZSIgLWNsYXNzcGF0aCAlUFJHJVwuLjsiJVBBVEglIjsuIExhdW5jaGVyQm9vdHN0cmFwIC1sYXVuY2hmaWxlIGNhdGFsaW5hLnhtbCAtdmVyYm9zZSBjYXRhbGluYSAlQ01EX0xJTkVfQVJHUyUgc3RvcAorCis6ZW5kCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL2Jpbi9zaHV0ZG93bi11c2luZy1sYXVuY2hlci5zaCBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvYmluL3NodXRkb3duLXVzaW5nLWxhdW5jaGVyLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZGFlYzIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL2Jpbi9zaHV0ZG93bi11c2luZy1sYXVuY2hlci5zaApAQCAtMCwwICsxLDI5IEBACisjIS9iaW4vc2gKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIworIyBTY3JpcHQgZm9yIHNodXR0aW5nIGRvd24gQ2F0YWxpbmEgdXNpbmcgdGhlIExhdW5jaGVyCisjCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgUmVzb2x2ZSBsaW5rcyAtICQwIG1heSBiZSBhIHNvZnRsaW5rCitQUkc9IiQwIgorCit3aGlsZSBbIC1oICIkUFJHIiBdOyBkbworICBscz1gbHMgLWxkICIkUFJHImAKKyAgbGluaz1gZXhwciAiJGxzIiA6ICcuKi0+IFwoLipcKSQnYAorICBpZiBleHByICIkbGluayIgOiAnLiovLionID4gL2Rldi9udWxsOyB0aGVuCisgICAgUFJHPSIkbGluayIKKyAgZWxzZQorICAgIFBSRz1gZGlybmFtZSAiJFBSRyJgLyIkbGluayIKKyAgZmkKK2RvbmUKKworIyBHZXQgc3RhbmRhcmQgZW52aXJvbm1lbnQgdmFyaWFibGVzCitQUkdESVI9YGRpcm5hbWUgIiRQUkciYAoraWYgWyAtciAiJFBSR0RJUiIvc2V0ZW52LnNoIF07IHRoZW4KKyAgLiAiJFBSR0RJUiIvc2V0ZW52LnNoCitmaQorCisjIEV4ZWN1dGUgdGhlIExhdW5jaGVyIHVzaW5nIHRoZSAiY2F0YWxpbmEiIHRhcmdldAorZXhlYyAiJEpBVkFfSE9NRSIvYmluL2phdmEgLWNsYXNzcGF0aCAiJFBSR0RJUiIgTGF1bmNoZXJCb290c3RyYXAgLWxhdW5jaGZpbGUgY2F0YWxpbmEueG1sIC12ZXJib3NlIGNhdGFsaW5hICIkQCIgc3RvcApkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9iaW4vc2h1dGRvd24uYmF0IGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9iaW4vc2h1dGRvd24uYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyOGM3MTcKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL2Jpbi9zaHV0ZG93bi5iYXQKQEAgLTAsMCArMSw0NCBAQAorQGVjaG8gb2ZmCitpZiAiJU9TJSIgPT0gIldpbmRvd3NfTlQiIHNldGxvY2FsCityZW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCityZW0gU3RvcCBzY3JpcHQgZm9yIHRoZSBDQVRBTElOQSBTZXJ2ZXIKK3JlbQorcmVtICRJZCQKK3JlbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworcmVtIEd1ZXNzIENBVEFMSU5BX0hPTUUgaWYgbm90IGRlZmluZWQKK3NldCBDVVJSRU5UX0RJUj0lY2QlCitpZiBub3QgIiVDQVRBTElOQV9IT01FJSIgPT0gIiIgZ290byBnb3RIb21lCitzZXQgQ0FUQUxJTkFfSE9NRT0lQ1VSUkVOVF9ESVIlCitpZiBleGlzdCAiJUNBVEFMSU5BX0hPTUUlXGJpblxjYXRhbGluYS5iYXQiIGdvdG8gb2tIb21lCitjZCAuLgorc2V0IENBVEFMSU5BX0hPTUU9JWNkJQorY2QgJUNVUlJFTlRfRElSJQorOmdvdEhvbWUKK2lmIGV4aXN0ICIlQ0FUQUxJTkFfSE9NRSVcYmluXGNhdGFsaW5hLmJhdCIgZ290byBva0hvbWUKK2VjaG8gVGhlIENBVEFMSU5BX0hPTUUgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbm90IGRlZmluZWQgY29ycmVjdGx5CitlY2hvIFRoaXMgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbmVlZGVkIHRvIHJ1biB0aGlzIHByb2dyYW0KK2dvdG8gZW5kCis6b2tIb21lCisKK3NldCBFWEVDVVRBQkxFPSVDQVRBTElOQV9IT01FJVxiaW5cY2F0YWxpbmEuYmF0CisKK3JlbSBDaGVjayB0aGF0IHRhcmdldCBleGVjdXRhYmxlIGV4aXN0cworaWYgZXhpc3QgIiVFWEVDVVRBQkxFJSIgZ290byBva0V4ZWMKK2VjaG8gQ2Fubm90IGZpbmQgJUVYRUNVVEFCTEUlCitlY2hvIFRoaXMgZmlsZSBpcyBuZWVkZWQgdG8gcnVuIHRoaXMgcHJvZ3JhbQorZ290byBlbmQKKzpva0V4ZWMKKworcmVtIEdldCByZW1haW5pbmcgdW5zaGlmdGVkIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgYW5kIHNhdmUgdGhlbSBpbiB0aGUKK3NldCBDTURfTElORV9BUkdTPQorOnNldEFyZ3MKK2lmICIiJTEiIj09IiIiIiBnb3RvIGRvbmVTZXRBcmdzCitzZXQgQ01EX0xJTkVfQVJHUz0lQ01EX0xJTkVfQVJHUyUgJTEKK3NoaWZ0Citnb3RvIHNldEFyZ3MKKzpkb25lU2V0QXJncworCitjYWxsICIlRVhFQ1VUQUJMRSUiIHN0b3AgJUNNRF9MSU5FX0FSR1MlCisKKzplbmQKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvYmluL3NodXRkb3duLnNoIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9iaW4vc2h1dGRvd24uc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQxOTYyZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvYmluL3NodXRkb3duLnNoCkBAIC0wLDAgKzEsMzEgQEAKKyMhL2Jpbi9zaAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTdG9wIHNjcmlwdCBmb3IgdGhlIENBVEFMSU5BIFNlcnZlcgorIworIyAkSWQkCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgcmVzb2x2ZSBsaW5rcyAtICQwIG1heSBiZSBhIHNvZnRsaW5rCitQUkc9IiQwIgorCit3aGlsZSBbIC1oICIkUFJHIiBdIDsgZG8KKyAgbHM9YGxzIC1sZCAiJFBSRyJgCisgIGxpbms9YGV4cHIgIiRscyIgOiAnLiotPiBcKC4qXCkkJ2AKKyAgaWYgZXhwciAiJGxpbmsiIDogJy4qLy4qJyA+IC9kZXYvbnVsbDsgdGhlbgorICAgIFBSRz0iJGxpbmsiCisgIGVsc2UKKyAgICBQUkc9YGRpcm5hbWUgIiRQUkciYC8iJGxpbmsiCisgIGZpCitkb25lCisgCitQUkdESVI9YGRpcm5hbWUgIiRQUkciYAorRVhFQ1VUQUJMRT1jYXRhbGluYS5zaAorCisjIENoZWNrIHRoYXQgdGFyZ2V0IGV4ZWN1dGFibGUgZXhpc3RzCitpZiBbICEgLXggIiRQUkdESVIiLyIkRVhFQ1VUQUJMRSIgXTsgdGhlbgorICBlY2hvICJDYW5ub3QgZmluZCAkUFJHRElSLyRFWEVDVVRBQkxFIgorICBlY2hvICJUaGlzIGZpbGUgaXMgbmVlZGVkIHRvIHJ1biB0aGlzIHByb2dyYW0iCisgIGV4aXQgMQorZmkKKworZXhlYyAiJFBSR0RJUiIvIiRFWEVDVVRBQkxFIiBzdG9wICIkQCIKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvYmluL3N0YXJ0dXAtdXNpbmctbGF1bmNoZXIuYmF0IGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9iaW4vc3RhcnR1cC11c2luZy1sYXVuY2hlci5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE1ZWNlOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvYmluL3N0YXJ0dXAtdXNpbmctbGF1bmNoZXIuYmF0CkBAIC0wLDAgKzEsMzkgQEAKK0BlY2hvIG9mZgoraWYgIiVPUyUiID09ICJXaW5kb3dzX05UIiBzZXRsb2NhbAorCityZW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCityZW0KK3JlbSBTY3JpcHQgZm9yIHN0YXJ0aW5nIENhdGFsaW5hIHVzaW5nIHRoZSBMYXVuY2hlcgorcmVtCityZW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3JlbSBHZXQgc3RhbmRhcmQgZW52aXJvbm1lbnQgdmFyaWFibGVzCitzZXQgUFJHPSUwCitpZiBleGlzdCAlUFJHJVwuLlxzZXRlbnYuYmF0IGdvdG8gZ290Q21kUGF0aAorcmVtICUwIG11c3QgaGF2ZSBiZWVuIGZvdW5kIGJ5IERPUyB1c2luZyB0aGUgJVBBVEglIHNvIHdlIGFzc3VtZSB0aGF0CityZW0gc2V0ZW52LmJhdCB3aWxsIGFsc28gYmUgZm91bmQgaW4gdGhlICVQQVRIJQorZ290byBkb25lU2V0ZW52Cis6Z290Q21kUGF0aAorY2FsbCAlUFJHJVwuLlxzZXRlbnYuYmF0Cis6ZG9uZVNldGVudgorCityZW0gTWFrZSBzdXJlIHByZXJlcXVpc2l0ZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIHNldAoraWYgbm90ICIlSkFWQV9IT01FJSIgPT0gIiIgZ290byBnb3RKYXZhSG9tZQorZWNobyBUaGUgSkFWQV9IT01FIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5vdCBkZWZpbmVkCitlY2hvIFRoaXMgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbmVlZGVkIHRvIHJ1biB0aGlzIHByb2dyYW0KK2dvdG8gZW5kCis6Z290SmF2YUhvbWUKKworcmVtIEdldCBjb21tYW5kIGxpbmUgYXJndW1lbnRzIGFuZCBzYXZlIHRoZW0gd2l0aCB0aGUgcHJvcGVyIHF1b3RpbmcKK3NldCBDTURfTElORV9BUkdTPQorOnNldEFyZ3MKK2lmICIiJTEiIj09IiIiIiBnb3RvIGRvbmVTZXRBcmdzCitzZXQgQ01EX0xJTkVfQVJHUz0lQ01EX0xJTkVfQVJHUyUgJTEKK3NoaWZ0Citnb3RvIHNldEFyZ3MKKzpkb25lU2V0QXJncworCityZW0gRXhlY3V0ZSB0aGUgTGF1bmNoZXIgdXNpbmcgdGhlICJjYXRhbGluYSIgdGFyZ2V0CisiJUpBVkFfSE9NRSVcYmluXGphdmEuZXhlIiAtY2xhc3NwYXRoICVQUkclXC4uOyIlUEFUSCUiOy4gTGF1bmNoZXJCb290c3RyYXAgLWxhdW5jaGZpbGUgY2F0YWxpbmEueG1sIC12ZXJib3NlIGNhdGFsaW5hICVDTURfTElORV9BUkdTJSBzdGFydAorCis6ZW5kCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL2Jpbi9zdGFydHVwLXVzaW5nLWxhdW5jaGVyLnNoIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9iaW4vc3RhcnR1cC11c2luZy1sYXVuY2hlci5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2QxNzllCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9iaW4vc3RhcnR1cC11c2luZy1sYXVuY2hlci5zaApAQCAtMCwwICsxLDI5IEBACisjIS9iaW4vc2gKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIworIyBTY3JpcHQgZm9yIHN0YXJ0aW5nIENhdGFsaW5hIHVzaW5nIHRoZSBMYXVuY2hlcgorIworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIFJlc29sdmUgbGlua3MgLSAkMCBtYXkgYmUgYSBzb2Z0bGluaworUFJHPSIkMCIKKword2hpbGUgWyAtaCAiJFBSRyIgXTsgZG8KKyAgbHM9YGxzIC1sZCAiJFBSRyJgCisgIGxpbms9YGV4cHIgIiRscyIgOiAnLiotPiBcKC4qXCkkJ2AKKyAgaWYgZXhwciAiJGxpbmsiIDogJy4qLy4qJyA+IC9kZXYvbnVsbDsgdGhlbgorICAgIFBSRz0iJGxpbmsiCisgIGVsc2UKKyAgICBQUkc9YGRpcm5hbWUgIiRQUkciYC8iJGxpbmsiCisgIGZpCitkb25lCisKKyMgR2V0IHN0YW5kYXJkIGVudmlyb25tZW50IHZhcmlhYmxlcworUFJHRElSPWBkaXJuYW1lICIkUFJHImAKK2lmIFsgLXIgIiRQUkdESVIiL3NldGVudi5zaCBdOyB0aGVuCisgIC4gIiRQUkdESVIiL3NldGVudi5zaAorZmkKKworIyBFeGVjdXRlIHRoZSBMYXVuY2hlciB1c2luZyB0aGUgImNhdGFsaW5hIiB0YXJnZXQKK2V4ZWMgIiRKQVZBX0hPTUUiL2Jpbi9qYXZhIC1jbGFzc3BhdGggIiRQUkdESVIiIExhdW5jaGVyQm9vdHN0cmFwIC1sYXVuY2hmaWxlIGNhdGFsaW5hLnhtbCAtdmVyYm9zZSBjYXRhbGluYSAiJEAiIHN0YXJ0CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL2Jpbi9zdGFydHVwLmJhdCBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvYmluL3N0YXJ0dXAuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0NmUyZDkKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL2Jpbi9zdGFydHVwLmJhdApAQCAtMCwwICsxLDQ0IEBACitAZWNobyBvZmYKK2lmICIlT1MlIiA9PSAiV2luZG93c19OVCIgc2V0bG9jYWwKK3JlbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3JlbSBTdGFydCBzY3JpcHQgZm9yIHRoZSBDQVRBTElOQSBTZXJ2ZXIKK3JlbQorcmVtICRJZCQKK3JlbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworcmVtIEd1ZXNzIENBVEFMSU5BX0hPTUUgaWYgbm90IGRlZmluZWQKK3NldCBDVVJSRU5UX0RJUj0lY2QlCitpZiBub3QgIiVDQVRBTElOQV9IT01FJSIgPT0gIiIgZ290byBnb3RIb21lCitzZXQgQ0FUQUxJTkFfSE9NRT0lQ1VSUkVOVF9ESVIlCitpZiBleGlzdCAiJUNBVEFMSU5BX0hPTUUlXGJpblxjYXRhbGluYS5iYXQiIGdvdG8gb2tIb21lCitjZCAuLgorc2V0IENBVEFMSU5BX0hPTUU9JWNkJQorY2QgJUNVUlJFTlRfRElSJQorOmdvdEhvbWUKK2lmIGV4aXN0ICIlQ0FUQUxJTkFfSE9NRSVcYmluXGNhdGFsaW5hLmJhdCIgZ290byBva0hvbWUKK2VjaG8gVGhlIENBVEFMSU5BX0hPTUUgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbm90IGRlZmluZWQgY29ycmVjdGx5CitlY2hvIFRoaXMgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbmVlZGVkIHRvIHJ1biB0aGlzIHByb2dyYW0KK2dvdG8gZW5kCis6b2tIb21lCisKK3NldCBFWEVDVVRBQkxFPSVDQVRBTElOQV9IT01FJVxiaW5cY2F0YWxpbmEuYmF0CisKK3JlbSBDaGVjayB0aGF0IHRhcmdldCBleGVjdXRhYmxlIGV4aXN0cworaWYgZXhpc3QgIiVFWEVDVVRBQkxFJSIgZ290byBva0V4ZWMKK2VjaG8gQ2Fubm90IGZpbmQgJUVYRUNVVEFCTEUlCitlY2hvIFRoaXMgZmlsZSBpcyBuZWVkZWQgdG8gcnVuIHRoaXMgcHJvZ3JhbQorZ290byBlbmQKKzpva0V4ZWMKKworcmVtIEdldCByZW1haW5pbmcgdW5zaGlmdGVkIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgYW5kIHNhdmUgdGhlbSBpbiB0aGUKK3NldCBDTURfTElORV9BUkdTPQorOnNldEFyZ3MKK2lmICIiJTEiIj09IiIiIiBnb3RvIGRvbmVTZXRBcmdzCitzZXQgQ01EX0xJTkVfQVJHUz0lQ01EX0xJTkVfQVJHUyUgJTEKK3NoaWZ0Citnb3RvIHNldEFyZ3MKKzpkb25lU2V0QXJncworCitjYWxsICIlRVhFQ1VUQUJMRSUiIHN0YXJ0ICVDTURfTElORV9BUkdTJQorCis6ZW5kCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL2Jpbi9zdGFydHVwLnNoIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9iaW4vc3RhcnR1cC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjlmZmM0Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9iaW4vc3RhcnR1cC5zaApAQCAtMCwwICsxLDMxIEBACisjIS9iaW4vc2gKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU3RhcnQgU2NyaXB0IGZvciB0aGUgQ0FUQUxJTkEgU2VydmVyCisjCisjICRJZCQKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyByZXNvbHZlIGxpbmtzIC0gJDAgbWF5IGJlIGEgc29mdGxpbmsKK1BSRz0iJDAiCisKK3doaWxlIFsgLWggIiRQUkciIF0gOyBkbworICBscz1gbHMgLWxkICIkUFJHImAKKyAgbGluaz1gZXhwciAiJGxzIiA6ICcuKi0+IFwoLipcKSQnYAorICBpZiBleHByICIkbGluayIgOiAnLiovLionID4gL2Rldi9udWxsOyB0aGVuCisgICAgUFJHPSIkbGluayIKKyAgZWxzZQorICAgIFBSRz1gZGlybmFtZSAiJFBSRyJgLyIkbGluayIKKyAgZmkKK2RvbmUKKyAKK1BSR0RJUj1gZGlybmFtZSAiJFBSRyJgCitFWEVDVVRBQkxFPWNhdGFsaW5hLnNoCisKKyMgQ2hlY2sgdGhhdCB0YXJnZXQgZXhlY3V0YWJsZSBleGlzdHMKK2lmIFsgISAteCAiJFBSR0RJUiIvIiRFWEVDVVRBQkxFIiBdOyB0aGVuCisgIGVjaG8gIkNhbm5vdCBmaW5kICRQUkdESVIvJEVYRUNVVEFCTEUiCisgIGVjaG8gIlRoaXMgZmlsZSBpcyBuZWVkZWQgdG8gcnVuIHRoaXMgcHJvZ3JhbSIKKyAgZXhpdCAxCitmaQorCitleGVjICIkUFJHRElSIi8iJEVYRUNVVEFCTEUiIHN0YXJ0ICIkQCIKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvYmluL3Rvb2wtd3JhcHBlci11c2luZy1sYXVuY2hlci5iYXQgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL2Jpbi90b29sLXdyYXBwZXItdXNpbmctbGF1bmNoZXIuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzMzQ4NzYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL2Jpbi90b29sLXdyYXBwZXItdXNpbmctbGF1bmNoZXIuYmF0CkBAIC0wLDAgKzEsMzkgQEAKK0BlY2hvIG9mZgoraWYgIiVPUyUiID09ICJXaW5kb3dzX05UIiBzZXRsb2NhbAorCityZW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCityZW0KK3JlbSBTY3JpcHQgZm9yIHJ1bm5pbmcgdGhlIENhdGFsaW5hIHRvb2wgd3JhcHBlciB1c2luZyB0aGUgTGF1bmNoZXIKK3JlbQorcmVtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCityZW0gR2V0IHN0YW5kYXJkIGVudmlyb25tZW50IHZhcmlhYmxlcworc2V0IFBSRz0lMAoraWYgZXhpc3QgJVBSRyVcLi5cc2V0ZW52LmJhdCBnb3RvIGdvdENtZFBhdGgKK3JlbSAlMCBtdXN0IGhhdmUgYmVlbiBmb3VuZCBieSBET1MgdXNpbmcgdGhlICVQQVRIJSBzbyB3ZSBhc3N1bWUgdGhhdAorcmVtIHNldGVudi5iYXQgd2lsbCBhbHNvIGJlIGZvdW5kIGluIHRoZSAlUEFUSCUKK2dvdG8gZG9uZVNldGVudgorOmdvdENtZFBhdGgKK2NhbGwgJVBSRyVcLi5cc2V0ZW52LmJhdAorOmRvbmVTZXRlbnYKKworcmVtIE1ha2Ugc3VyZSBwcmVyZXF1aXNpdGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBzZXQKK2lmIG5vdCAiJUpBVkFfSE9NRSUiID09ICIiIGdvdG8gZ290SmF2YUhvbWUKK2VjaG8gVGhlIEpBVkFfSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBub3QgZGVmaW5lZAorZWNobyBUaGlzIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5lZWRlZCB0byBydW4gdGhpcyBwcm9ncmFtCitnb3RvIGVuZAorOmdvdEphdmFIb21lCisKK3JlbSBHZXQgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBhbmQgc2F2ZSB0aGVtIHdpdGggdGhlIHByb3BlciBxdW90aW5nCitzZXQgQ01EX0xJTkVfQVJHUz0KKzpzZXRBcmdzCitpZiAiIiUxIiI9PSIiIiIgZ290byBkb25lU2V0QXJncworc2V0IENNRF9MSU5FX0FSR1M9JUNNRF9MSU5FX0FSR1MlICUxCitzaGlmdAorZ290byBzZXRBcmdzCis6ZG9uZVNldEFyZ3MKKworcmVtIEV4ZWN1dGUgdGhlIExhdW5jaGVyIHVzaW5nIHRoZSAidG9vbC13cmFwcGVyIiB0YXJnZXQKKyIlSkFWQV9IT01FJVxiaW5camF2YS5leGUiIC1jbGFzc3BhdGggJVBSRyVcLi47IiVQQVRIJSI7LiBMYXVuY2hlckJvb3RzdHJhcCAtbGF1bmNoZmlsZSBjYXRhbGluYS54bWwgLXZlcmJvc2UgdG9vbC13cmFwcGVyICVDTURfTElORV9BUkdTJQorCis6ZW5kCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL2Jpbi90b29sLXdyYXBwZXItdXNpbmctbGF1bmNoZXIuc2ggYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL2Jpbi90b29sLXdyYXBwZXItdXNpbmctbGF1bmNoZXIuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIyODZjYwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvYmluL3Rvb2wtd3JhcHBlci11c2luZy1sYXVuY2hlci5zaApAQCAtMCwwICsxLDI5IEBACisjIS9iaW4vc2gKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIworIyBTY3JpcHQgZm9yIHJ1bm5pbmcgdGhlIENhdGFsaW5hIHRvb2wgd3JhcHBlciB1c2luZyB0aGUgTGF1bmNoZXIKKyMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBSZXNvbHZlIGxpbmtzIC0gJDAgbWF5IGJlIGEgc29mdGxpbmsKK1BSRz0iJDAiCisKK3doaWxlIFsgLWggIiRQUkciIF07IGRvCisgIGxzPWBscyAtbGQgIiRQUkciYAorICBsaW5rPWBleHByICIkbHMiIDogJy4qLT4gXCguKlwpJCdgCisgIGlmIGV4cHIgIiRsaW5rIiA6ICcuKi8uKicgPiAvZGV2L251bGw7IHRoZW4KKyAgICBQUkc9IiRsaW5rIgorICBlbHNlCisgICAgUFJHPWBkaXJuYW1lICIkUFJHImAvIiRsaW5rIgorICBmaQorZG9uZQorCisjIEdldCBzdGFuZGFyZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMKK1BSR0RJUj1gZGlybmFtZSAiJFBSRyJgCitpZiBbIC1yICIkUFJHRElSIi9zZXRlbnYuc2ggXTsgdGhlbgorICAuICIkUFJHRElSIi9zZXRlbnYuc2gKK2ZpCisKKyMgRXhlY3V0ZSB0aGUgTGF1bmNoZXIgdXNpbmcgdGhlICJ0b29sLXdyYXBwZXIiIHRhcmdldAorZXhlYyAiJEpBVkFfSE9NRSIvYmluL2phdmEgLWNsYXNzcGF0aCAiJFBSR0RJUiIgTGF1bmNoZXJCb290c3RyYXAgLWxhdW5jaGZpbGUgY2F0YWxpbmEueG1sIC12ZXJib3NlIHRvb2wtd3JhcHBlciAiJEAiCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL2Jpbi90b29sLXdyYXBwZXIuYmF0IGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9iaW4vdG9vbC13cmFwcGVyLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjlmZGE3Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9iaW4vdG9vbC13cmFwcGVyLmJhdApAQCAtMCwwICsxLDU5IEBACitAZWNobyBvZmYKK2lmICIlT1MlIiA9PSAiV2luZG93c19OVCIgc2V0bG9jYWwKK3JlbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3JlbSBXcmFwcGVyIHNjcmlwdCBmb3IgY29tbWFuZCBsaW5lIHRvb2xzCityZW0KK3JlbSBFbnZpcm9ubWVudCBWYXJpYWJsZSBQcmVxdWlzaXRlcworcmVtCityZW0gICBDQVRBTElOQV9IT01FIE1heSBwb2ludCBhdCB5b3VyIENhdGFsaW5hICJidWlsZCIgZGlyZWN0b3J5LgorcmVtCityZW0gICBUT09MX09QVFMgICAgIChPcHRpb25hbCkgSmF2YSBydW50aW1lIG9wdGlvbnMgdXNlZCB3aGVuIHRoZSAic3RhcnQiLAorcmVtICAgICAgICAgICAgICAgICAic3RvcCIsIG9yICJydW4iIGNvbW1hbmQgaXMgZXhlY3V0ZWQuCityZW0KK3JlbSAgIEpBVkFfSE9NRSAgICAgTXVzdCBwb2ludCBhdCB5b3VyIEphdmEgRGV2ZWxvcG1lbnQgS2l0IGluc3RhbGxhdGlvbi4KK3JlbQorcmVtICAgSkFWQV9PUFRTICAgICAoT3B0aW9uYWwpIEphdmEgcnVudGltZSBvcHRpb25zIHVzZWQgd2hlbiB0aGUgInN0YXJ0IiwKK3JlbSAgICAgICAgICAgICAgICAgInN0b3AiLCBvciAicnVuIiBjb21tYW5kIGlzIGV4ZWN1dGVkLgorcmVtCityZW0gJElkJAorcmVtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCityZW0gR3Vlc3MgQ0FUQUxJTkFfSE9NRSBpZiBub3QgZGVmaW5lZAoraWYgbm90ICIlQ0FUQUxJTkFfSE9NRSUiID09ICIiIGdvdG8gZ290SG9tZQorc2V0IENBVEFMSU5BX0hPTUU9LgoraWYgZXhpc3QgIiVDQVRBTElOQV9IT01FJVxiaW5cdG9vbC13cmFwcGVyLmJhdCIgZ290byBva0hvbWUKK3NldCBDQVRBTElOQV9IT01FPS4uCis6Z290SG9tZQoraWYgZXhpc3QgIiVDQVRBTElOQV9IT01FJVxiaW5cdG9vbC13cmFwcGVyLmJhdCIgZ290byBva0hvbWUKK2VjaG8gVGhlIENBVEFMSU5BX0hPTUUgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbm90IGRlZmluZWQgY29ycmVjdGx5CitlY2hvIFRoaXMgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbmVlZGVkIHRvIHJ1biB0aGlzIHByb2dyYW0KK2dvdG8gZW5kCis6b2tIb21lCisKK3JlbSBHZXQgc3RhbmRhcmQgZW52aXJvbm1lbnQgdmFyaWFibGVzCitpZiBleGlzdCAiJUNBVEFMSU5BX0hPTUUlXGJpblxzZXRlbnYuYmF0IiBjYWxsICIlQ0FUQUxJTkFfSE9NRSVcYmluXHNldGVudi5iYXQiCisKK3JlbSBHZXQgc3RhbmRhcmQgSmF2YSBlbnZpcm9ubWVudCB2YXJpYWJsZXMKK2lmIGV4aXN0ICIlQ0FUQUxJTkFfSE9NRSVcYmluXHNldGNsYXNzcGF0aC5iYXQiIGdvdG8gb2tTZXRjbGFzc3BhdGgKK2VjaG8gQ2Fubm90IGZpbmQgJUNBVEFMSU5BX0hPTUUlXGJpblxzZXRjbGFzc3BhdGguYmF0CitlY2hvIFRoaXMgZmlsZSBpcyBuZWVkZWQgdG8gcnVuIHRoaXMgcHJvZ3JhbQorZ290byBlbmQKKzpva1NldGNsYXNzcGF0aAorc2V0IEJBU0VESVI9JUNBVEFMSU5BX0hPTUUlCitjYWxsICIlQ0FUQUxJTkFfSE9NRSVcYmluXHNldGNsYXNzcGF0aC5iYXQiCisKK3JlbSBBZGQgb24gZXh0cmEgamFyIGZpbGVzIHRvIENMQVNTUEFUSAorc2V0IENMQVNTUEFUSD0lQ0xBU1NQQVRIJTslQ0FUQUxJTkFfSE9NRSVcYmluXGJvb3RzdHJhcC5qYXI7IiVCQVNFRElSJSJcY29tbW9uXGxpYlxqbXguamFyCisKK3JlbSBHZXQgcmVtYWluaW5nIHVuc2hpZnRlZCBjb21tYW5kIGxpbmUgYXJndW1lbnRzIGFuZCBzYXZlIHRoZW0gaW4gdGhlCitzZXQgQ01EX0xJTkVfQVJHUz0KKzpzZXRBcmdzCitpZiAiIiUxIiI9PSIiIiIgZ290byBkb25lU2V0QXJncworc2V0IENNRF9MSU5FX0FSR1M9JUNNRF9MSU5FX0FSR1MlICUxCitzaGlmdAorZ290byBzZXRBcmdzCis6ZG9uZVNldEFyZ3MKKworJV9SVU5KQVZBJSAlSkFWQV9PUFRTJSAlVE9PTF9PUFRTJSAtRGphdmEuZW5kb3JzZWQuZGlycz0iJUpBVkFfRU5ET1JTRURfRElSUyUiIC1jbGFzc3BhdGggIiVDTEFTU1BBVEglIiAtRGNhdGFsaW5hLmhvbWU9IiVDQVRBTElOQV9IT01FJSIgb3JnLmFwYWNoZS5jYXRhbGluYS5zdGFydHVwLlRvb2wgJUNNRF9MSU5FX0FSR1MlCisKKzplbmQKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvYmluL3Rvb2wtd3JhcHBlci5zaCBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvYmluL3Rvb2wtd3JhcHBlci5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTdiMThhCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9iaW4vdG9vbC13cmFwcGVyLnNoCkBAIC0wLDAgKzEsNzggQEAKKyMhL2Jpbi9zaAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBXcmFwcGVyIHNjcmlwdCBmb3IgY29tbWFuZCBsaW5lIHRvb2xzCisjCisjIEVudmlyb25tZW50IFZhcmlhYmxlIFByZXF1aXNpdGVzCisjCisjICAgQ0FUQUxJTkFfSE9NRSBNYXkgcG9pbnQgYXQgeW91ciBDYXRhbGluYSAiYnVpbGQiIGRpcmVjdG9yeS4KKyMKKyMgICBUT09MX09QVFMgICAgIChPcHRpb25hbCkgSmF2YSBydW50aW1lIG9wdGlvbnMgdXNlZCB3aGVuIHRoZSAic3RhcnQiLAorIyAgICAgICAgICAgICAgICAgInN0b3AiLCBvciAicnVuIiBjb21tYW5kIGlzIGV4ZWN1dGVkLgorIworIyAgIEpBVkFfSE9NRSAgICAgTXVzdCBwb2ludCBhdCB5b3VyIEphdmEgRGV2ZWxvcG1lbnQgS2l0IGluc3RhbGxhdGlvbi4KKyMKKyMgICBKQVZBX09QVFMgICAgIChPcHRpb25hbCkgSmF2YSBydW50aW1lIG9wdGlvbnMgdXNlZCB3aGVuIHRoZSAic3RhcnQiLAorIyAgICAgICAgICAgICAgICAgInN0b3AiLCBvciAicnVuIiBjb21tYW5kIGlzIGV4ZWN1dGVkLgorIworIyAkSWQkCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgT1Mgc3BlY2lmaWMgc3VwcG9ydC4gICR2YXIgX211c3RfIGJlIHNldCB0byBlaXRoZXIgdHJ1ZSBvciBmYWxzZS4KK2N5Z3dpbj1mYWxzZQorY2FzZSAiYHVuYW1lYCIgaW4KK0NZR1dJTiopIGN5Z3dpbj10cnVlOzsKK2VzYWMKKworIyByZXNvbHZlIGxpbmtzIC0gJDAgbWF5IGJlIGEgc29mdGxpbmsKK1BSRz0iJDAiCisKK3doaWxlIFsgLWggIiRQUkciIF07IGRvCisgIGxzPWBscyAtbGQgIiRQUkciYAorICBsaW5rPWBleHByICIkbHMiIDogJy4qLT4gXCguKlwpJCdgCisgIGlmIGV4cHIgIiRsaW5rIiA6ICcuKi8uKicgPiAvZGV2L251bGw7IHRoZW4KKyAgICBQUkc9IiRsaW5rIgorICBlbHNlCisgICAgUFJHPWBkaXJuYW1lICIkUFJHImAvIiRsaW5rIgorICBmaQorZG9uZQorCisjIEdldCBzdGFuZGFyZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMKK1BSR0RJUj1gZGlybmFtZSAiJFBSRyJgCitDQVRBTElOQV9IT01FPWBjZCAiJFBSR0RJUi8uLiIgOyBwd2RgCitpZiBbIC1yICIkQ0FUQUxJTkFfSE9NRSIvYmluL3NldGVudi5zaCBdOyB0aGVuCisgIC4gIiRDQVRBTElOQV9IT01FIi9iaW4vc2V0ZW52LnNoCitmaQorCisjIEZvciBDeWd3aW4sIGVuc3VyZSBwYXRocyBhcmUgaW4gVU5JWCBmb3JtYXQgYmVmb3JlIGFueXRoaW5nIGlzIHRvdWNoZWQKK2lmICRjeWd3aW47IHRoZW4KKyAgWyAtbiAiJEpBVkFfSE9NRSIgXSAmJiBKQVZBX0hPTUU9YGN5Z3BhdGggLS11bml4ICIkSkFWQV9IT01FImAKKyAgWyAtbiAiJENBVEFMSU5BX0hPTUUiIF0gJiYgQ0FUQUxJTkFfSE9NRT1gY3lncGF0aCAtLXVuaXggIiRDQVRBTElOQV9IT01FImAKKyAgWyAtbiAiJENMQVNTUEFUSCIgXSAmJiBDTEFTU1BBVEg9YGN5Z3BhdGggLS1wYXRoIC0tdW5peCAiJENMQVNTUEFUSCJgCitmaQorCisjIEdldCBzdGFuZGFyZCBKYXZhIGVudmlyb25tZW50IHZhcmlhYmxlcworaWYgWyAtciAiJENBVEFMSU5BX0hPTUUiL2Jpbi9zZXRjbGFzc3BhdGguc2ggXTsgdGhlbgorICBCQVNFRElSPSIkQ0FUQUxJTkFfSE9NRSIKKyAgLiAiJENBVEFMSU5BX0hPTUUiL2Jpbi9zZXRjbGFzc3BhdGguc2gKK2Vsc2UKKyAgZWNobyAiQ2Fubm90IGZpbmQgJENBVEFMSU5BX0hPTUUvYmluL3NldGNsYXNzcGF0aC5zaCIKKyAgZWNobyAiVGhpcyBmaWxlIGlzIG5lZWRlZCB0byBydW4gdGhpcyBwcm9ncmFtIgorICBleGl0IDEKK2ZpCisKKyMgQWRkIG9uIGV4dHJhIGphciBmaWxlcyB0byBDTEFTU1BBVEgKK0NMQVNTUEFUSD0iJENMQVNTUEFUSCI6IiRDQVRBTElOQV9IT01FIi9iaW4vYm9vdHN0cmFwLmphcjoiJEJBU0VESVIiL2NvbW1vbi9saWIvam14LmphcgorCisjIEZvciBDeWd3aW4sIHN3aXRjaCBwYXRocyB0byBXaW5kb3dzIGZvcm1hdCBiZWZvcmUgcnVubmluZyBqYXZhCitpZiAkY3lnd2luOyB0aGVuCisgIEpBVkFfSE9NRT1gY3lncGF0aCAtLXBhdGggLS13aW5kb3dzICIkSkFWQV9IT01FImAKKyAgQ0FUQUxJTkFfSE9NRT1gY3lncGF0aCAtLXBhdGggLS13aW5kb3dzICIkQ0FUQUxJTkFfSE9NRSJgCisgIENMQVNTUEFUSD1gY3lncGF0aCAtLXBhdGggLS13aW5kb3dzICIkQ0xBU1NQQVRIImAKK2ZpCisKKyMgLS0tLS0gRXhlY3V0ZSBUaGUgUmVxdWVzdGVkIENvbW1hbmQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworZXhlYyAiJF9SVU5KQVZBIiAkSkFWQV9PUFRTICRUT09MX09QVFMgXAorICAtRGphdmEuZW5kb3JzZWQuZGlycz0iJEpBVkFfRU5ET1JTRURfRElSUyIgLWNsYXNzcGF0aCAiJENMQVNTUEFUSCIgXAorICAtRGNhdGFsaW5hLmhvbWU9IiRDQVRBTElOQV9IT01FIiBcCisgIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cC5Ub29sICIkQCIKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvYmluL3ZlcnNpb24uYmF0IGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9iaW4vdmVyc2lvbi5iYXQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjE0YmU5ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvYmluL3ZlcnNpb24uYmF0CkBAIC0wLDAgKzEsNDQgQEAKK0BlY2hvIG9mZgoraWYgIiVPUyUiID09ICJXaW5kb3dzX05UIiBzZXRsb2NhbAorcmVtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorcmVtIFZlcnNpb24gc2NyaXB0IGZvciB0aGUgQ0FUQUxJTkEgU2VydmVyCityZW0KK3JlbSAkSWQkCityZW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3JlbSBHdWVzcyBDQVRBTElOQV9IT01FIGlmIG5vdCBkZWZpbmVkCitzZXQgQ1VSUkVOVF9ESVI9JWNkJQoraWYgbm90ICIlQ0FUQUxJTkFfSE9NRSUiID09ICIiIGdvdG8gZ290SG9tZQorc2V0IENBVEFMSU5BX0hPTUU9JUNVUlJFTlRfRElSJQoraWYgZXhpc3QgIiVDQVRBTElOQV9IT01FJVxiaW5cY2F0YWxpbmEuYmF0IiBnb3RvIG9rSG9tZQorY2QgLi4KK3NldCBDQVRBTElOQV9IT01FPSVjZCUKK2NkICVDVVJSRU5UX0RJUiUKKzpnb3RIb21lCitpZiBleGlzdCAiJUNBVEFMSU5BX0hPTUUlXGJpblxjYXRhbGluYS5iYXQiIGdvdG8gb2tIb21lCitlY2hvIFRoZSBDQVRBTElOQV9IT01FIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5vdCBkZWZpbmVkIGNvcnJlY3RseQorZWNobyBUaGlzIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5lZWRlZCB0byBydW4gdGhpcyBwcm9ncmFtCitnb3RvIGVuZAorOm9rSG9tZQorCitzZXQgRVhFQ1VUQUJMRT0lQ0FUQUxJTkFfSE9NRSVcYmluXGNhdGFsaW5hLmJhdAorCityZW0gQ2hlY2sgdGhhdCB0YXJnZXQgZXhlY3V0YWJsZSBleGlzdHMKK2lmIGV4aXN0ICIlRVhFQ1VUQUJMRSUiIGdvdG8gb2tFeGVjCitlY2hvIENhbm5vdCBmaW5kICVFWEVDVVRBQkxFJQorZWNobyBUaGlzIGZpbGUgaXMgbmVlZGVkIHRvIHJ1biB0aGlzIHByb2dyYW0KK2dvdG8gZW5kCis6b2tFeGVjCisKK3JlbSBHZXQgcmVtYWluaW5nIHVuc2hpZnRlZCBjb21tYW5kIGxpbmUgYXJndW1lbnRzIGFuZCBzYXZlIHRoZW0gaW4gdGhlCitzZXQgQ01EX0xJTkVfQVJHUz0KKzpzZXRBcmdzCitpZiAiIiUxIiI9PSIiIiIgZ290byBkb25lU2V0QXJncworc2V0IENNRF9MSU5FX0FSR1M9JUNNRF9MSU5FX0FSR1MlICUxCitzaGlmdAorZ290byBzZXRBcmdzCis6ZG9uZVNldEFyZ3MKKworY2FsbCAiJUVYRUNVVEFCTEUlIiB2ZXJzaW9uICVDTURfTElORV9BUkdTJQorCis6ZW5kCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL2Jpbi92ZXJzaW9uLnNoIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9iaW4vdmVyc2lvbi5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43NTFhNTVlCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9iaW4vdmVyc2lvbi5zaApAQCAtMCwwICsxLDMxIEBACisjIS9iaW4vc2gKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVmVyc2lvbiBTY3JpcHQgZm9yIHRoZSBDQVRBTElOQSBTZXJ2ZXIKKyMKKyMgJElkJAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIHJlc29sdmUgbGlua3MgLSAkMCBtYXkgYmUgYSBzb2Z0bGluaworUFJHPSIkMCIKKword2hpbGUgWyAtaCAiJFBSRyIgXSA7IGRvCisgIGxzPWBscyAtbGQgIiRQUkciYAorICBsaW5rPWBleHByICIkbHMiIDogJy4qLT4gXCguKlwpJCdgCisgIGlmIGV4cHIgIiRsaW5rIiA6ICcuKi8uKicgPiAvZGV2L251bGw7IHRoZW4KKyAgICBQUkc9IiRsaW5rIgorICBlbHNlCisgICAgUFJHPWBkaXJuYW1lICIkUFJHImAvIiRsaW5rIgorICBmaQorZG9uZQorCitQUkdESVI9YGRpcm5hbWUgIiRQUkciYAorRVhFQ1VUQUJMRT1jYXRhbGluYS5zaAorCisjIENoZWNrIHRoYXQgdGFyZ2V0IGV4ZWN1dGFibGUgZXhpc3RzCitpZiBbICEgLXggIiRQUkdESVIiLyIkRVhFQ1VUQUJMRSIgXTsgdGhlbgorICBlY2hvICJDYW5ub3QgZmluZCAkUFJHRElSLyRFWEVDVVRBQkxFIgorICBlY2hvICJUaGlzIGZpbGUgaXMgbmVlZGVkIHRvIHJ1biB0aGlzIHByb2dyYW0iCisgIGV4aXQgMQorZmkKKworZXhlYyAiJFBSR0RJUiIvIiRFWEVDVVRBQkxFIiB2ZXJzaW9uICIkQCIKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvY29uZi9jYXRhbGluYS5wb2xpY3kgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL2NvbmYvY2F0YWxpbmEucG9saWN5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3ZmQyZDIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL2NvbmYvY2F0YWxpbmEucG9saWN5CkBAIC0wLDAgKzEsMTY3IEBACisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBjYXRhbGluYS5jb3JlcG9saWN5IC0gU2VjdXJpdHkgUG9saWN5IFBlcm1pc3Npb25zIGZvciBUb21jYXQgNQorLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyBhIGRlZmF1bHQgc2V0IG9mIHNlY3VyaXR5IHBvbGljaWVzIHRvIGJlIGVuZm9yY2VkIChieSB0aGUKKy8vIEpWTSkgd2hlbiBDYXRhbGluYSBpcyBleGVjdXRlZCB3aXRoIHRoZSAiLXNlY3VyaXR5IiBvcHRpb24uICBJbiBhZGRpdGlvbgorLy8gdG8gdGhlIHBlcm1pc3Npb25zIGdyYW50ZWQgaGVyZSwgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIHBlcm1pc3Npb25zIGFyZQorLy8gZ3JhbnRlZCB0byB0aGUgY29kZWJhc2Ugc3BlY2lmaWMgdG8gZWFjaCB3ZWIgYXBwbGljYXRpb246CisvLworLy8gKiBSZWFkIGFjY2VzcyB0byB0aGUgZG9jdW1lbnQgcm9vdCBkaXJlY3RvcnkKKy8vCisvLyAkSWQkCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKworLy8gPT09PT09PT09PSBTWVNURU0gQ09ERSBQRVJNSVNTSU9OUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisKKy8vIFRoZXNlIHBlcm1pc3Npb25zIGFwcGx5IHRvIGphdmFjCitncmFudCBjb2RlQmFzZSAiZmlsZToke2phdmEuaG9tZX0vbGliLy0iIHsKKyAgICAgICAgcGVybWlzc2lvbiBqYXZhLnNlY3VyaXR5LkFsbFBlcm1pc3Npb247Cit9OworCisvLyBUaGVzZSBwZXJtaXNzaW9ucyBhcHBseSB0byBhbGwgc2hhcmVkIHN5c3RlbSBleHRlbnNpb25zCitncmFudCBjb2RlQmFzZSAiZmlsZToke2phdmEuaG9tZX0vanJlL2xpYi9leHQvLSIgeworICAgICAgICBwZXJtaXNzaW9uIGphdmEuc2VjdXJpdHkuQWxsUGVybWlzc2lvbjsKK307CisKKy8vIFRoZXNlIHBlcm1pc3Npb25zIGFwcGx5IHRvIGphdmFjIHdoZW4gJHtqYXZhLmhvbWVdIHBvaW50cyBhdCAkSkFWQV9IT01FL2pyZQorZ3JhbnQgY29kZUJhc2UgImZpbGU6JHtqYXZhLmhvbWV9Ly4uL2xpYi8tIiB7CisgICAgICAgIHBlcm1pc3Npb24gamF2YS5zZWN1cml0eS5BbGxQZXJtaXNzaW9uOworfTsKKworLy8gVGhlc2UgcGVybWlzc2lvbnMgYXBwbHkgdG8gYWxsIHNoYXJlZCBzeXN0ZW0gZXh0ZW5zaW9ucyB3aGVuCisvLyAke2phdmEuaG9tZX0gcG9pbnRzIGF0ICRKQVZBX0hPTUUvanJlCitncmFudCBjb2RlQmFzZSAiZmlsZToke2phdmEuaG9tZX0vbGliL2V4dC8tIiB7CisgICAgICAgIHBlcm1pc3Npb24gamF2YS5zZWN1cml0eS5BbGxQZXJtaXNzaW9uOworfTsKKworCisvLyA9PT09PT09PT09IENBVEFMSU5BIENPREUgUEVSTUlTU0lPTlMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKworLy8gVGhlc2UgcGVybWlzc2lvbnMgYXBwbHkgdG8gdGhlIGxhdW5jaGVyIGNvZGUKK2dyYW50IGNvZGVCYXNlICJmaWxlOiR7Y2F0YWxpbmEuaG9tZX0vYmluL2NvbW1vbnMtbGF1bmNoZXIuamFyIiB7CisgICAgICAgIHBlcm1pc3Npb24gamF2YS5zZWN1cml0eS5BbGxQZXJtaXNzaW9uOworfTsKKworLy8gVGhlc2UgcGVybWlzc2lvbnMgYXBwbHkgdG8gdGhlIGRhZW1vbiBjb2RlCitncmFudCBjb2RlQmFzZSAiZmlsZToke2NhdGFsaW5hLmhvbWV9L2Jpbi9jb21tb25zLWRhZW1vbi5qYXIiIHsKKyAgICAgICAgcGVybWlzc2lvbiBqYXZhLnNlY3VyaXR5LkFsbFBlcm1pc3Npb247Cit9OworCisvLyBUaGVzZSBwZXJtaXNzaW9ucyBhcHBseSB0byB0aGUgY29tbW9ucy1sb2dnaW5nIEFQSQorZ3JhbnQgY29kZUJhc2UgImZpbGU6JHtjYXRhbGluYS5ob21lfS9iaW4vY29tbW9ucy1sb2dnaW5nLWFwaS5qYXIiIHsKKyAgICAgICAgcGVybWlzc2lvbiBqYXZhLnNlY3VyaXR5LkFsbFBlcm1pc3Npb247Cit9OworCisvLyBUaGVzZSBwZXJtaXNzaW9ucyBhcHBseSB0byB0aGUgc2VydmVyIHN0YXJ0dXAgY29kZQorZ3JhbnQgY29kZUJhc2UgImZpbGU6JHtjYXRhbGluYS5ob21lfS9iaW4vYm9vdHN0cmFwLmphciIgeworICAgICAgICBwZXJtaXNzaW9uIGphdmEuc2VjdXJpdHkuQWxsUGVybWlzc2lvbjsKK307CisKKy8vIFRoZXNlIHBlcm1pc3Npb25zIGFwcGx5IHRvIHRoZSBKTVggc2VydmVyCitncmFudCBjb2RlQmFzZSAiZmlsZToke2NhdGFsaW5hLmhvbWV9L2Jpbi9qbXguamFyIiB7CisgICAgICAgIHBlcm1pc3Npb24gamF2YS5zZWN1cml0eS5BbGxQZXJtaXNzaW9uOworfTsKKworLy8gVGhlc2UgcGVybWlzc2lvbnMgYXBwbHkgdG8gdGhlIHNlcnZsZXQgQVBJIGNsYXNzZXMKKy8vIGFuZCB0aG9zZSB0aGF0IGFyZSBzaGFyZWQgYWNyb3NzIGFsbCBjbGFzcyBsb2FkZXJzCisvLyBsb2NhdGVkIGluIHRoZSAiY29tbW9uIiBkaXJlY3RvcnkKK2dyYW50IGNvZGVCYXNlICJmaWxlOiR7Y2F0YWxpbmEuaG9tZX0vY29tbW9uLy0iIHsKKyAgICAgICAgcGVybWlzc2lvbiBqYXZhLnNlY3VyaXR5LkFsbFBlcm1pc3Npb247Cit9OworCisvLyBUaGVzZSBwZXJtaXNzaW9ucyBhcHBseSB0byB0aGUgY29udGFpbmVyJ3MgY29yZSBjb2RlLCBwbHVzIGFueSBhZGRpdGlvbmFsCisvLyBsaWJyYXJpZXMgaW5zdGFsbGVkIGluIHRoZSAic2VydmVyIiBkaXJlY3RvcnkKK2dyYW50IGNvZGVCYXNlICJmaWxlOiR7Y2F0YWxpbmEuaG9tZX0vc2VydmVyLy0iIHsKKyAgICAgICAgcGVybWlzc2lvbiBqYXZhLnNlY3VyaXR5LkFsbFBlcm1pc3Npb247Cit9OworCisvLyBUaGUgcGVybWlzc2lvbnMgZ3JhbnRlZCB0byB0aGUgYmFsYW5jZXIgV0VCLUlORi9jbGFzc2VzIGRpcmVjdG9yeQorZ3JhbnQgY29kZUJhc2UgImZpbGU6JHtjYXRhbGluYS5ob21lfS93ZWJhcHBzL2JhbGFuY2VyL1dFQi1JTkYvY2xhc3Nlcy8tIiB7CisgICAgICAgIHBlcm1pc3Npb24gamF2YS5sYW5nLlJ1bnRpbWVQZXJtaXNzaW9uICJhY2Nlc3NDbGFzc0luUGFja2FnZS5vcmcuYXBhY2hlLnRvbWNhdC51dGlsLmRpZ2VzdGVyIjsKKyAgICAgICAgcGVybWlzc2lvbiBqYXZhLmxhbmcuUnVudGltZVBlcm1pc3Npb24gImFjY2Vzc0NsYXNzSW5QYWNrYWdlLm9yZy5hcGFjaGUudG9tY2F0LnV0aWwuZGlnZXN0ZXIuKiI7Cit9OworLy8gPT09PT09PT09PSBXRUIgQVBQTElDQVRJT04gUEVSTUlTU0lPTlMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisKKy8vIFRoZXNlIHBlcm1pc3Npb25zIGFyZSBncmFudGVkIGJ5IGRlZmF1bHQgdG8gYWxsIHdlYiBhcHBsaWNhdGlvbnMKKy8vIEluIGFkZGl0aW9uLCBhIHdlYiBhcHBsaWNhdGlvbiB3aWxsIGJlIGdpdmVuIGEgcmVhZCBGaWxlUGVybWlzc2lvbgorLy8gYW5kIEpuZGlQZXJtaXNzaW9uIGZvciBhbGwgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIGluIGl0cyBkb2N1bWVudCByb290LgorZ3JhbnQgeyAKKyAgICAvLyBSZXF1aXJlZCBmb3IgSk5ESSBsb29rdXAgb2YgbmFtZWQgSkRCQyBEYXRhU291cmNlJ3MgYW5kCisgICAgLy8gamF2YW1haWwgbmFtZWQgTWltZVBhcnQgRGF0YVNvdXJjZSB1c2VkIHRvIHNlbmQgbWFpbAorICAgIHBlcm1pc3Npb24gamF2YS51dGlsLlByb3BlcnR5UGVybWlzc2lvbiAiamF2YS5ob21lIiwgInJlYWQiOworICAgIHBlcm1pc3Npb24gamF2YS51dGlsLlByb3BlcnR5UGVybWlzc2lvbiAiamF2YS5uYW1pbmcuKiIsICJyZWFkIjsKKyAgICBwZXJtaXNzaW9uIGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24gImphdmF4LnNxbC4qIiwgInJlYWQiOworCisgICAgLy8gT1MgU3BlY2lmaWMgcHJvcGVydGllcyB0byBhbGxvdyByZWFkIGFjY2VzcworICAgIHBlcm1pc3Npb24gamF2YS51dGlsLlByb3BlcnR5UGVybWlzc2lvbiAib3MubmFtZSIsICJyZWFkIjsKKyAgICBwZXJtaXNzaW9uIGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24gIm9zLnZlcnNpb24iLCAicmVhZCI7CisgICAgcGVybWlzc2lvbiBqYXZhLnV0aWwuUHJvcGVydHlQZXJtaXNzaW9uICJvcy5hcmNoIiwgInJlYWQiOworICAgIHBlcm1pc3Npb24gamF2YS51dGlsLlByb3BlcnR5UGVybWlzc2lvbiAiZmlsZS5zZXBhcmF0b3IiLCAicmVhZCI7CisgICAgcGVybWlzc2lvbiBqYXZhLnV0aWwuUHJvcGVydHlQZXJtaXNzaW9uICJwYXRoLnNlcGFyYXRvciIsICJyZWFkIjsKKyAgICBwZXJtaXNzaW9uIGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24gImxpbmUuc2VwYXJhdG9yIiwgInJlYWQiOworCisgICAgLy8gSlZNIHByb3BlcnRpZXMgdG8gYWxsb3cgcmVhZCBhY2Nlc3MKKyAgICBwZXJtaXNzaW9uIGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24gImphdmEudmVyc2lvbiIsICJyZWFkIjsKKyAgICBwZXJtaXNzaW9uIGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24gImphdmEudmVuZG9yIiwgInJlYWQiOworICAgIHBlcm1pc3Npb24gamF2YS51dGlsLlByb3BlcnR5UGVybWlzc2lvbiAiamF2YS52ZW5kb3IudXJsIiwgInJlYWQiOworICAgIHBlcm1pc3Npb24gamF2YS51dGlsLlByb3BlcnR5UGVybWlzc2lvbiAiamF2YS5jbGFzcy52ZXJzaW9uIiwgInJlYWQiOworCXBlcm1pc3Npb24gamF2YS51dGlsLlByb3BlcnR5UGVybWlzc2lvbiAiamF2YS5zcGVjaWZpY2F0aW9uLnZlcnNpb24iLCAicmVhZCI7CisJcGVybWlzc2lvbiBqYXZhLnV0aWwuUHJvcGVydHlQZXJtaXNzaW9uICJqYXZhLnNwZWNpZmljYXRpb24udmVuZG9yIiwgInJlYWQiOworCXBlcm1pc3Npb24gamF2YS51dGlsLlByb3BlcnR5UGVybWlzc2lvbiAiamF2YS5zcGVjaWZpY2F0aW9uLm5hbWUiLCAicmVhZCI7CisKKwlwZXJtaXNzaW9uIGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24gImphdmEudm0uc3BlY2lmaWNhdGlvbi52ZXJzaW9uIiwgInJlYWQiOworCXBlcm1pc3Npb24gamF2YS51dGlsLlByb3BlcnR5UGVybWlzc2lvbiAiamF2YS52bS5zcGVjaWZpY2F0aW9uLnZlbmRvciIsICJyZWFkIjsKKwlwZXJtaXNzaW9uIGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24gImphdmEudm0uc3BlY2lmaWNhdGlvbi5uYW1lIiwgInJlYWQiOworCXBlcm1pc3Npb24gamF2YS51dGlsLlByb3BlcnR5UGVybWlzc2lvbiAiamF2YS52bS52ZXJzaW9uIiwgInJlYWQiOworCXBlcm1pc3Npb24gamF2YS51dGlsLlByb3BlcnR5UGVybWlzc2lvbiAiamF2YS52bS52ZW5kb3IiLCAicmVhZCI7CisJcGVybWlzc2lvbiBqYXZhLnV0aWwuUHJvcGVydHlQZXJtaXNzaW9uICJqYXZhLnZtLm5hbWUiLCAicmVhZCI7CisKKyAgICAvLyBSZXF1aXJlZCBmb3IgT3BlbkpNWAorICAgIHBlcm1pc3Npb24gamF2YS5sYW5nLlJ1bnRpbWVQZXJtaXNzaW9uICJnZXRBdHRyaWJ1dGUiOworCisJLy8gQWxsb3cgcmVhZCBvZiBKQVhQIGNvbXBsaWFudCBYTUwgcGFyc2VyIGRlYnVnCisJcGVybWlzc2lvbiBqYXZhLnV0aWwuUHJvcGVydHlQZXJtaXNzaW9uICJqYXhwLmRlYnVnIiwgInJlYWQiOworCisgICAgLy8gUHJlY29tcGlsZWQgSlNQcyBuZWVkIGFjY2VzcyB0byB0aGlzIHBhY2thZ2UuCisgICAgcGVybWlzc2lvbiBqYXZhLmxhbmcuUnVudGltZVBlcm1pc3Npb24gImFjY2Vzc0NsYXNzSW5QYWNrYWdlLm9yZy5hcGFjaGUuamFzcGVyLnJ1bnRpbWUiOworICAgIHBlcm1pc3Npb24gamF2YS5sYW5nLlJ1bnRpbWVQZXJtaXNzaW9uICJhY2Nlc3NDbGFzc0luUGFja2FnZS5vcmcuYXBhY2hlLmphc3Blci5ydW50aW1lLioiOworICAgIAorfTsKKworCisvLyBZb3UgY2FuIGFzc2lnbiBhZGRpdGlvbmFsIHBlcm1pc3Npb25zIHRvIHBhcnRpY3VsYXIgd2ViIGFwcGxpY2F0aW9ucyBieQorLy8gYWRkaW5nIGFkZGl0aW9uYWwgImdyYW50IiBlbnRyaWVzIGhlcmUsIGJhc2VkIG9uIHRoZSBjb2RlIGJhc2UgZm9yIHRoYXQKKy8vIGFwcGxpY2F0aW9uLCAvV0VCLUlORi9jbGFzc2VzLywgb3IgL1dFQi1JTkYvbGliLyBqYXIgZmlsZXMuCisvLworLy8gRGlmZmVyZW50IHBlcm1pc3Npb25zIGNhbiBiZSBncmFudGVkIHRvIEpTUCBwYWdlcywgY2xhc3NlcyBsb2FkZWQgZnJvbQorLy8gdGhlIC9XRUItSU5GL2NsYXNzZXMvIGRpcmVjdG9yeSwgYWxsIGphciBmaWxlcyBpbiB0aGUgL1dFQi1JTkYvbGliLworLy8gZGlyZWN0b3J5LCBvciBldmVuIHRvIGluZGl2aWR1YWwgamFyIGZpbGVzIGluIHRoZSAvV0VCLUlORi9saWIvIGRpcmVjdG9yeS4KKy8vCisvLyBGb3IgaW5zdGFuY2UsIGFzc3VtZSB0aGF0IHRoZSBzdGFuZGFyZCAiZXhhbXBsZXMiIGFwcGxpY2F0aW9uCisvLyBpbmNsdWRlZCBhIEpEQkMgZHJpdmVyIHRoYXQgbmVlZGVkIHRvIGVzdGFibGlzaCBhIG5ldHdvcmsgY29ubmVjdGlvbiB0byB0aGUKKy8vIGNvcnJlc3BvbmRpbmcgZGF0YWJhc2UgYW5kIHVzZWQgdGhlIHNjcmFwZSB0YWdsaWIgdG8gZ2V0IHRoZSB3ZWF0aGVyIGZyb20KKy8vIHRoZSBOT0FBIHdlYiBzZXJ2ZXIuICBZb3UgbWlnaHQgY3JlYXRlIGEgImdyYW50IiBlbnRyaWVzIGxpa2UgdGhpczoKKy8vCisvLyBUaGUgcGVybWlzc2lvbnMgZ3JhbnRlZCB0byB0aGUgY29udGV4dCByb290IGRpcmVjdG9yeSBhcHBseSB0byBKU1AgcGFnZXMuCisvLyBncmFudCBjb2RlQmFzZSAiZmlsZToke2NhdGFsaW5hLmhvbWV9L3dlYmFwcHMvZXhhbXBsZXMvLSIgeworLy8gICAgICBwZXJtaXNzaW9uIGphdmEubmV0LlNvY2tldFBlcm1pc3Npb24gImRiaG9zdC5teWNvbXBhbnkuY29tOjU0MzIiLCAiY29ubmVjdCI7CisvLyAgICAgIHBlcm1pc3Npb24gamF2YS5uZXQuU29ja2V0UGVybWlzc2lvbiAiKi5ub2FhLmdvdjo4MCIsICJjb25uZWN0IjsKKy8vIH07CisvLworLy8gVGhlIHBlcm1pc3Npb25zIGdyYW50ZWQgdG8gdGhlIGNvbnRleHQgV0VCLUlORi9jbGFzc2VzIGRpcmVjdG9yeQorLy8gZ3JhbnQgY29kZUJhc2UgImZpbGU6JHtjYXRhbGluYS5ob21lfS93ZWJhcHBzL2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy8tIiB7CisvLyB9OworLy8KKy8vIFRoZSBwZXJtaXNzaW9uIGdyYW50ZWQgdG8geW91ciBKREJDIGRyaXZlcgorLy8gZ3JhbnQgY29kZUJhc2UgImphcjpmaWxlOiR7Y2F0YWxpbmEuaG9tZX0vd2ViYXBwcy9leGFtcGxlcy9XRUItSU5GL2xpYi9kcml2ZXIuamFyIS8tIiB7CisvLyAgICAgIHBlcm1pc3Npb24gamF2YS5uZXQuU29ja2V0UGVybWlzc2lvbiAiZGJob3N0Lm15Y29tcGFueS5jb206NTQzMiIsICJjb25uZWN0IjsKKy8vIH07CisvLyBUaGUgcGVybWlzc2lvbiBncmFudGVkIHRvIHRoZSBzY3JhcGUgdGFnbGliCisvLyBncmFudCBjb2RlQmFzZSAiamFyOmZpbGU6JHtjYXRhbGluYS5ob21lfS93ZWJhcHBzL2V4YW1wbGVzL1dFQi1JTkYvbGliL3NjcmFwZS5qYXIhLy0iIHsKKy8vICAgICAgcGVybWlzc2lvbiBqYXZhLm5ldC5Tb2NrZXRQZXJtaXNzaW9uICIqLm5vYWEuZ292OjgwIiwgImNvbm5lY3QiOworLy8gfTsKKwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9jb25mL2NhdGFsaW5hLnByb3BlcnRpZXMgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL2NvbmYvY2F0YWxpbmEucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTMyOTRkCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9jb25mL2NhdGFsaW5hLnByb3BlcnRpZXMKQEAgLTAsMCArMSw1NyBAQAorIworIyBMaXN0IG9mIGNvbW1hLXNlcGFyYXRlZCBwYWNrYWdlcyB0aGF0IHN0YXJ0IHdpdGggb3IgZXF1YWwgdGhpcyBzdHJpbmcKKyMgd2lsbCBjYXVzZSBhIHNlY3VyaXR5IGV4Y2VwdGlvbiB0byBiZSB0aHJvd24gd2hlbgorIyBwYXNzZWQgdG8gY2hlY2tQYWNrYWdlQWNjZXNzIHVubGVzcyB0aGUKKyMgY29ycmVzcG9uZGluZyBSdW50aW1lUGVybWlzc2lvbiAoImFjY2Vzc0NsYXNzSW5QYWNrYWdlLiIrcGFja2FnZSkgaGFzCisjIGJlZW4gZ3JhbnRlZC4KK3BhY2thZ2UuYWNjZXNzPXN1bi4sb3JnLmFwYWNoZS5jYXRhbGluYS4sb3JnLmFwYWNoZS5jb3lvdGUuLG9yZy5hcGFjaGUudG9tY2F0LixvcmcuYXBhY2hlLmphc3Blci4sc3VuLmJlYW5zLgorIworIyBMaXN0IG9mIGNvbW1hLXNlcGFyYXRlZCBwYWNrYWdlcyB0aGF0IHN0YXJ0IHdpdGggb3IgZXF1YWwgdGhpcyBzdHJpbmcKKyMgd2lsbCBjYXVzZSBhIHNlY3VyaXR5IGV4Y2VwdGlvbiB0byBiZSB0aHJvd24gd2hlbgorIyBwYXNzZWQgdG8gY2hlY2tQYWNrYWdlRGVmaW5pdGlvbiB1bmxlc3MgdGhlCisjIGNvcnJlc3BvbmRpbmcgUnVudGltZVBlcm1pc3Npb24gKCJkZWZpbmVDbGFzc0luUGFja2FnZS4iK3BhY2thZ2UpIGhhcworIyBiZWVuIGdyYW50ZWQuCisjCisjIGJ5IGRlZmF1bHQsIG5vIHBhY2thZ2VzIGFyZSByZXN0cmljdGVkIGZvciBkZWZpbml0aW9uLCBhbmQgbm9uZSBvZgorIyB0aGUgY2xhc3MgbG9hZGVycyBzdXBwbGllZCB3aXRoIHRoZSBKREsgY2FsbCBjaGVja1BhY2thZ2VEZWZpbml0aW9uLgorIworcGFja2FnZS5kZWZpbml0aW9uPXN1bi4samF2YS4sb3JnLmFwYWNoZS5jYXRhbGluYS4sb3JnLmFwYWNoZS5jb3lvdGUuLG9yZy5hcGFjaGUudG9tY2F0LixvcmcuYXBhY2hlLmphc3Blci4KKworIworIworIyBMaXN0IG9mIGNvbW1hLXNlcGFyYXRlZCBwYXRocyBkZWZpbmluZyB0aGUgY29udGVudHMgb2YgdGhlICJjb21tb24iIAorIyBjbGFzc2xvYWRlci4gUHJlZml4ZXMgc2hvdWxkIGJlIHVzZWQgdG8gZGVmaW5lIHdoYXQgaXMgdGhlIHJlcG9zaXRvcnkgdHlwZS4KKyMgUGF0aCBtYXkgYmUgcmVsYXRpdmUgdG8gdGhlIENBVEFMSU5BX0hPTUUgb3IgQ0FUQUxJTkFfQkFTRSBwYXRoIG9yIGFic29sdXRlLgorIyBJZiBsZWZ0IGFzIGJsYW5rLHRoZSBKVk0gc3lzdGVtIGxvYWRlciB3aWxsIGJlIHVzZWQgYXMgQ2F0YWxpbmEncyAiY29tbW9uIiAKKyMgbG9hZGVyLgorIyBFeGFtcGxlczoKKyMgICAgICJmb28iOiBBZGQgdGhpcyBmb2xkZXIgYXMgYSBjbGFzcyByZXBvc2l0b3J5CisjICAgICAiZm9vLyouamFyIjogQWRkIGFsbCB0aGUgSkFScyBvZiB0aGUgc3BlY2lmaWVkIGZvbGRlciBhcyBjbGFzcyAKKyMgICAgICAgICAgICAgICAgICByZXBvc2l0b3JpZXMKKyMgICAgICJmb28vYmFyLmphciI6IEFkZCBiYXIuamFyIGFzIGEgY2xhc3MgcmVwb3NpdG9yeQorY29tbW9uLmxvYWRlcj0ke2NhdGFsaW5hLmhvbWV9L2NvbW1vbi9jbGFzc2VzLCR7Y2F0YWxpbmEuaG9tZX0vY29tbW9uL2kxOG4vKi5qYXIsJHtjYXRhbGluYS5ob21lfS9jb21tb24vZW5kb3JzZWQvKi5qYXIsJHtjYXRhbGluYS5ob21lfS9jb21tb24vbGliLyouamFyCisKKyMKKyMgTGlzdCBvZiBjb21tYS1zZXBhcmF0ZWQgcGF0aHMgZGVmaW5pbmcgdGhlIGNvbnRlbnRzIG9mIHRoZSAic2VydmVyIiAKKyMgY2xhc3Nsb2FkZXIuIFByZWZpeGVzIHNob3VsZCBiZSB1c2VkIHRvIGRlZmluZSB3aGF0IGlzIHRoZSByZXBvc2l0b3J5IHR5cGUuCisjIFBhdGggbWF5IGJlIHJlbGF0aXZlIHRvIHRoZSBDQVRBTElOQV9IT01FIG9yIENBVEFMSU5BX0JBU0UgcGF0aCBvciBhYnNvbHV0ZS4KKyMgSWYgbGVmdCBhcyBibGFuaywgdGhlICJjb21tb24iIGxvYWRlciB3aWxsIGJlIHVzZWQgYXMgQ2F0YWxpbmEncyAic2VydmVyIiAKKyMgbG9hZGVyLgorIyBFeGFtcGxlczoKKyMgICAgICJmb28iOiBBZGQgdGhpcyBmb2xkZXIgYXMgYSBjbGFzcyByZXBvc2l0b3J5CisjICAgICAiZm9vLyouamFyIjogQWRkIGFsbCB0aGUgSkFScyBvZiB0aGUgc3BlY2lmaWVkIGZvbGRlciBhcyBjbGFzcyAKKyMgICAgICAgICAgICAgICAgICByZXBvc2l0b3JpZXMKKyMgICAgICJmb28vYmFyLmphciI6IEFkZCBiYXIuamFyIGFzIGEgY2xhc3MgcmVwb3NpdG9yeQorc2VydmVyLmxvYWRlcj0ke2NhdGFsaW5hLmhvbWV9L3NlcnZlci9jbGFzc2VzLCR7Y2F0YWxpbmEuaG9tZX0vc2VydmVyL2xpYi8qLmphcgorCisjCisjIExpc3Qgb2YgY29tbWEtc2VwYXJhdGVkIHBhdGhzIGRlZmluaW5nIHRoZSBjb250ZW50cyBvZiB0aGUgInNoYXJlZCIgCisjIGNsYXNzbG9hZGVyLiBQcmVmaXhlcyBzaG91bGQgYmUgdXNlZCB0byBkZWZpbmUgd2hhdCBpcyB0aGUgcmVwb3NpdG9yeSB0eXBlLgorIyBQYXRoIG1heSBiZSByZWxhdGl2ZSB0byB0aGUgQ0FUQUxJTkFfQkFTRSBwYXRoIG9yIGFic29sdXRlLiBJZiBsZWZ0IGFzIGJsYW5rLAorIyB0aGUgImNvbW1vbiIgbG9hZGVyIHdpbGwgYmUgdXNlZCBhcyBDYXRhbGluYSdzICJzaGFyZWQiIGxvYWRlci4KKyMgRXhhbXBsZXM6CisjICAgICAiZm9vIjogQWRkIHRoaXMgZm9sZGVyIGFzIGEgY2xhc3MgcmVwb3NpdG9yeQorIyAgICAgImZvby8qLmphciI6IEFkZCBhbGwgdGhlIEpBUnMgb2YgdGhlIHNwZWNpZmllZCBmb2xkZXIgYXMgY2xhc3MgCisjICAgICAgICAgICAgICAgICAgcmVwb3NpdG9yaWVzCisjICAgICAiZm9vL2Jhci5qYXIiOiBBZGQgYmFyLmphciBhcyBhIGNsYXNzIHJlcG9zaXRvcnkgCitzaGFyZWQubG9hZGVyPSR7Y2F0YWxpbmEuYmFzZX0vc2hhcmVkL2NsYXNzZXMsJHtjYXRhbGluYS5iYXNlfS9zaGFyZWQvbGliLyouamFyCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL2NvbmYvY29udGV4dC54bWwgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL2NvbmYvY29udGV4dC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRjNDQ1NQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvY29uZi9jb250ZXh0LnhtbApAQCAtMCwwICsxLDEzIEBACis8IS0tIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgd2lsbCBiZSBsb2FkZWQgZm9yIGVhY2ggd2ViIGFwcGxpY2F0aW9uIC0tPgorPENvbnRleHQ+CisKKyAgICA8IS0tIERlZmF1bHQgc2V0IG9mIG1vbml0b3JlZCByZXNvdXJjZXMgLS0+CisJPFdhdGNoZWRSZXNvdXJjZT5XRUItSU5GL3dlYi54bWw8L1dhdGNoZWRSZXNvdXJjZT4KKwk8V2F0Y2hlZFJlc291cmNlPk1FVEEtSU5GL2NvbnRleHQueG1sPC9XYXRjaGVkUmVzb3VyY2U+CisJCisJPCEtLSBVbmNvbW1lbnQgdGhpcyB0byBkaXNhYmxlIHNlc3Npb24gcGVyc2lzdGVuY2UgYWNyb3NzIFRvbWNhdCByZXN0YXJ0cyAtLT4KKwk8IS0tCisJPE1hbmFnZXIgcGF0aG5hbWU9IiIgLz4KKwktLT4KKwkKKzwvQ29udGV4dD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL2NvbmYvc2VydmVyLW1pbmltYWwueG1sIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9jb25mL3NlcnZlci1taW5pbWFsLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjU0MmI2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9jb25mL3NlcnZlci1taW5pbWFsLnhtbApAQCAtMCwwICsxLDI1IEBACis8U2VydmVyIHBvcnQ9IjgwMDUiIHNodXRkb3duPSJTSFVURE9XTiI+CisKKyAgPEdsb2JhbE5hbWluZ1Jlc291cmNlcz4KKyAgICA8IS0tIFVzZWQgYnkgTWFuYWdlciB3ZWJhcHAgLS0+CisgICAgPFJlc291cmNlIG5hbWU9IlVzZXJEYXRhYmFzZSIgYXV0aD0iQ29udGFpbmVyIgorICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLlVzZXJEYXRhYmFzZSIKKyAgICAgICBkZXNjcmlwdGlvbj0iVXNlciBkYXRhYmFzZSB0aGF0IGNhbiBiZSB1cGRhdGVkIGFuZCBzYXZlZCIKKyAgICAgICAgICAgZmFjdG9yeT0ib3JnLmFwYWNoZS5jYXRhbGluYS51c2Vycy5NZW1vcnlVc2VyRGF0YWJhc2VGYWN0b3J5IgorICAgICAgICAgIHBhdGhuYW1lPSJjb25mL3RvbWNhdC11c2Vycy54bWwiIC8+CisgIDwvR2xvYmFsTmFtaW5nUmVzb3VyY2VzPgorCisgIDxTZXJ2aWNlIG5hbWU9IkNhdGFsaW5hIj4KKyAgICA8Q29ubmVjdG9yIHBvcnQ9IjgwODAiIC8+CisKKyAgICA8IS0tIFRoaXMgaXMgaGVyZSBmb3IgY29tcGF0aWJpbGl0eSBvbmx5LCBub3QgcmVxdWlyZWQgLS0+CisgICAgPENvbm5lY3RvciBwb3J0PSI4MDA5IiBwcm90b2NvbD0iQUpQLzEuMyIgLz4KKworICAgIDxFbmdpbmUgbmFtZT0iQ2F0YWxpbmEiIGRlZmF1bHRIb3N0PSJsb2NhbGhvc3QiPgorICAgICAgPFJlYWxtIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5yZWFsbS5Vc2VyRGF0YWJhc2VSZWFsbSIKKyAgICAgICAgICAgICByZXNvdXJjZU5hbWU9IlVzZXJEYXRhYmFzZSIgLz4KKyAgICAgIDxIb3N0IG5hbWU9ImxvY2FsaG9zdCIgYXBwQmFzZT0id2ViYXBwcyIgLz4KKyAgICA8L0VuZ2luZT4KKyAgICAKKyAgPC9TZXJ2aWNlPgorPC9TZXJ2ZXI+CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL2NvbmYvc2VydmVyLnhtbCBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvY29uZi9zZXJ2ZXIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyNDk2ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL2NvbmYvc2VydmVyLnhtbApAQCAtMCwwICsxLDM2MSBAQAorPCEtLSBFeGFtcGxlIFNlcnZlciBDb25maWd1cmF0aW9uIEZpbGUgLS0+Cis8IS0tIE5vdGUgdGhhdCBjb21wb25lbnQgZWxlbWVudHMgYXJlIG5lc3RlZCBjb3JyZXNwb25kaW5nIHRvIHRoZWlyCisgICAgIHBhcmVudC1jaGlsZCByZWxhdGlvbnNoaXBzIHdpdGggZWFjaCBvdGhlciAtLT4KKworPCEtLSBBICJTZXJ2ZXIiIGlzIGEgc2luZ2xldG9uIGVsZW1lbnQgdGhhdCByZXByZXNlbnRzIHRoZSBlbnRpcmUgSlZNLAorICAgICB3aGljaCBtYXkgY29udGFpbiBvbmUgb3IgbW9yZSAiU2VydmljZSIgaW5zdGFuY2VzLiAgVGhlIFNlcnZlcgorICAgICBsaXN0ZW5zIGZvciBhIHNodXRkb3duIGNvbW1hbmQgb24gdGhlIGluZGljYXRlZCBwb3J0LgorCisgICAgIE5vdGU6ICBBICJTZXJ2ZXIiIGlzIG5vdCBpdHNlbGYgYSAiQ29udGFpbmVyIiwgc28geW91IG1heSBub3QKKyAgICAgZGVmaW5lIHN1YmNvbXBvbmVudHMgc3VjaCBhcyAiVmFsdmVzIiBvciAiTG9nZ2VycyIgYXQgdGhpcyBsZXZlbC4KKyAtLT4KKworPFNlcnZlciBwb3J0PSI4MDA1IiBzaHV0ZG93bj0iU0hVVERPV04iIGRlYnVnPSIwIj4KKworCisgIDwhLS0gQ29tbWVudCB0aGVzZSBlbnRyaWVzIG91dCB0byBkaXNhYmxlIEpNWCBNQmVhbnMgc3VwcG9ydCAtLT4KKyAgPCEtLSBZb3UgbWF5IGFsc28gY29uZmlndXJlIGN1c3RvbSBjb21wb25lbnRzIChlLmcuIFZhbHZlcy9SZWFsbXMpIGJ5IAorICAgICAgIGluY2x1ZGluZyB5b3VyIG93biBtYmVhbi1kZXNjcmlwdG9yIGZpbGUocyksIGFuZCBzZXR0aW5nIHRoZSAKKyAgICAgICAiZGVzY3JpcHRvcnMiIGF0dHJpYnV0ZSB0byBwb2ludCB0byBhICc7JyBzZXBlcmF0ZWQgbGlzdCBvZiBwYXRocworICAgICAgIChpbiB0aGUgQ2xhc3NMb2FkZXIgc2Vuc2UpIG9mIGZpbGVzIHRvIGFkZCB0byB0aGUgZGVmYXVsdCBsaXN0LgorICAgICAgIGUuZy4gZGVzY3JpcHRvcnM9Ii9jb20vbXlmaXJtL215cGFja2FnZS9tYmVhbi1kZXNjcmlwdG9yLnhtbCIKKyAgLS0+CisgIDxMaXN0ZW5lciBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEubWJlYW5zLlNlcnZlckxpZmVjeWNsZUxpc3RlbmVyIgorICAgICAgICAgICAgZGVidWc9IjAiLz4KKyAgPExpc3RlbmVyIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5tYmVhbnMuR2xvYmFsUmVzb3VyY2VzTGlmZWN5Y2xlTGlzdGVuZXIiCisgICAgICAgICAgICBkZWJ1Zz0iMCIvPgorCisgIDwhLS0gR2xvYmFsIEpOREkgcmVzb3VyY2VzIC0tPgorICA8R2xvYmFsTmFtaW5nUmVzb3VyY2VzPgorCisgICAgPCEtLSBUZXN0IGVudHJ5IGZvciBkZW1vbnN0cmF0aW9uIHB1cnBvc2VzIC0tPgorICAgIDxFbnZpcm9ubWVudCBuYW1lPSJzaW1wbGVWYWx1ZSIgdHlwZT0iamF2YS5sYW5nLkludGVnZXIiIHZhbHVlPSIzMCIvPgorCisgICAgPCEtLSBFZGl0YWJsZSB1c2VyIGRhdGFiYXNlIHRoYXQgY2FuIGFsc28gYmUgdXNlZCBieQorICAgICAgICAgVXNlckRhdGFiYXNlUmVhbG0gdG8gYXV0aGVudGljYXRlIHVzZXJzIC0tPgorICAgIDxSZXNvdXJjZSBuYW1lPSJVc2VyRGF0YWJhc2UiIGF1dGg9IkNvbnRhaW5lciIKKyAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5Vc2VyRGF0YWJhc2UiCisgICAgICAgZGVzY3JpcHRpb249IlVzZXIgZGF0YWJhc2UgdGhhdCBjYW4gYmUgdXBkYXRlZCBhbmQgc2F2ZWQiCisgICAgICAgICAgIGZhY3Rvcnk9Im9yZy5hcGFjaGUuY2F0YWxpbmEudXNlcnMuTWVtb3J5VXNlckRhdGFiYXNlRmFjdG9yeSIKKyAgICAgICAgICBwYXRobmFtZT0iY29uZi90b21jYXQtdXNlcnMueG1sIiAvPgorCisgIDwvR2xvYmFsTmFtaW5nUmVzb3VyY2VzPgorCisgIDwhLS0gQSAiU2VydmljZSIgaXMgYSBjb2xsZWN0aW9uIG9mIG9uZSBvciBtb3JlICJDb25uZWN0b3JzIiB0aGF0IHNoYXJlCisgICAgICAgYSBzaW5nbGUgIkNvbnRhaW5lciIgKGFuZCB0aGVyZWZvcmUgdGhlIHdlYiBhcHBsaWNhdGlvbnMgdmlzaWJsZQorICAgICAgIHdpdGhpbiB0aGF0IENvbnRhaW5lcikuICBOb3JtYWxseSwgdGhhdCBDb250YWluZXIgaXMgYW4gIkVuZ2luZSIsCisgICAgICAgYnV0IHRoaXMgaXMgbm90IHJlcXVpcmVkLgorCisgICAgICAgTm90ZTogIEEgIlNlcnZpY2UiIGlzIG5vdCBpdHNlbGYgYSAiQ29udGFpbmVyIiwgc28geW91IG1heSBub3QKKyAgICAgICBkZWZpbmUgc3ViY29tcG9uZW50cyBzdWNoIGFzICJWYWx2ZXMiIG9yICJMb2dnZXJzIiBhdCB0aGlzIGxldmVsLgorICAgLS0+CisKKyAgPCEtLSBEZWZpbmUgdGhlIFRvbWNhdCBTdGFuZC1BbG9uZSBTZXJ2aWNlIC0tPgorICA8U2VydmljZSBuYW1lPSJDYXRhbGluYSI+CisKKyAgICA8IS0tIEEgIkNvbm5lY3RvciIgcmVwcmVzZW50cyBhbiBlbmRwb2ludCBieSB3aGljaCByZXF1ZXN0cyBhcmUgcmVjZWl2ZWQKKyAgICAgICAgIGFuZCByZXNwb25zZXMgYXJlIHJldHVybmVkLiAgRWFjaCBDb25uZWN0b3IgcGFzc2VzIHJlcXVlc3RzIG9uIHRvIHRoZQorICAgICAgICAgYXNzb2NpYXRlZCAiQ29udGFpbmVyIiAobm9ybWFsbHkgYW4gRW5naW5lKSBmb3IgcHJvY2Vzc2luZy4KKworICAgICAgICAgQnkgZGVmYXVsdCwgYSBub24tU1NMIEhUVFAvMS4xIENvbm5lY3RvciBpcyBlc3RhYmxpc2hlZCBvbiBwb3J0IDgwODAuCisgICAgICAgICBZb3UgY2FuIGFsc28gZW5hYmxlIGFuIFNTTCBIVFRQLzEuMSBDb25uZWN0b3Igb24gcG9ydCA4NDQzIGJ5CisgICAgICAgICBmb2xsb3dpbmcgdGhlIGluc3RydWN0aW9ucyBiZWxvdyBhbmQgdW5jb21tZW50aW5nIHRoZSBzZWNvbmQgQ29ubmVjdG9yCisgICAgICAgICBlbnRyeS4gIFNTTCBzdXBwb3J0IHJlcXVpcmVzIHRoZSBmb2xsb3dpbmcgc3RlcHMgKHNlZSB0aGUgU1NMIENvbmZpZworICAgICAgICAgSE9XVE8gaW4gdGhlIFRvbWNhdCA1IGRvY3VtZW50YXRpb24gYnVuZGxlIGZvciBtb3JlIGRldGFpbGVkCisgICAgICAgICBpbnN0cnVjdGlvbnMpOgorICAgICAgICAgKiBJZiB5b3VyIEpESyB2ZXJzaW9uIDEuMyBvciBwcmlvciwgZG93bmxvYWQgYW5kIGluc3RhbGwgSlNTRSAxLjAuMiBvcgorICAgICAgICAgICBsYXRlciwgYW5kIHB1dCB0aGUgSkFSIGZpbGVzIGludG8gIiRKQVZBX0hPTUUvanJlL2xpYi9leHQiLgorICAgICAgICAgKiBFeGVjdXRlOgorICAgICAgICAgICAgICVKQVZBX0hPTUUlXGJpblxrZXl0b29sIC1nZW5rZXkgLWFsaWFzIHRvbWNhdCAta2V5YWxnIFJTQSAoV2luZG93cykKKyAgICAgICAgICAgICAkSkFWQV9IT01FL2Jpbi9rZXl0b29sIC1nZW5rZXkgLWFsaWFzIHRvbWNhdCAta2V5YWxnIFJTQSAgKFVuaXgpCisgICAgICAgICAgIHdpdGggYSBwYXNzd29yZCB2YWx1ZSBvZiAiY2hhbmdlaXQiIGZvciBib3RoIHRoZSBjZXJ0aWZpY2F0ZSBhbmQKKyAgICAgICAgICAgdGhlIGtleXN0b3JlIGl0c2VsZi4KKworICAgICAgICAgQnkgZGVmYXVsdCwgRE5TIGxvb2t1cHMgYXJlIGVuYWJsZWQgd2hlbiBhIHdlYiBhcHBsaWNhdGlvbiBjYWxscworICAgICAgICAgcmVxdWVzdC5nZXRSZW1vdGVIb3N0KCkuICBUaGlzIGNhbiBoYXZlIGFuIGFkdmVyc2UgaW1wYWN0IG9uCisgICAgICAgICBwZXJmb3JtYW5jZSwgc28geW91IGNhbiBkaXNhYmxlIGl0IGJ5IHNldHRpbmcgdGhlCisgICAgICAgICAiZW5hYmxlTG9va3VwcyIgYXR0cmlidXRlIHRvICJmYWxzZSIuICBXaGVuIEROUyBsb29rdXBzIGFyZSBkaXNhYmxlZCwKKyAgICAgICAgIHJlcXVlc3QuZ2V0UmVtb3RlSG9zdCgpIHdpbGwgcmV0dXJuIHRoZSBTdHJpbmcgdmVyc2lvbiBvZiB0aGUKKyAgICAgICAgIElQIGFkZHJlc3Mgb2YgdGhlIHJlbW90ZSBjbGllbnQuCisgICAgLS0+CisKKyAgICA8IS0tIERlZmluZSBhIG5vbi1TU0wgSFRUUC8xLjEgQ29ubmVjdG9yIG9uIHBvcnQgODA4MCAtLT4KKyAgICA8Q29ubmVjdG9yIHBvcnQ9IjgwODAiCisgICAgICAgICAgICAgICBtYXhUaHJlYWRzPSIxNTAiIG1pblNwYXJlVGhyZWFkcz0iMjUiIG1heFNwYXJlVGhyZWFkcz0iNzUiCisgICAgICAgICAgICAgICBlbmFibGVMb29rdXBzPSJmYWxzZSIgcmVkaXJlY3RQb3J0PSI4NDQzIiBhY2NlcHRDb3VudD0iMTAwIgorICAgICAgICAgICAgICAgZGVidWc9IjAiIGNvbm5lY3Rpb25UaW1lb3V0PSIyMDAwMCIgCisgICAgICAgICAgICAgICBkaXNhYmxlVXBsb2FkVGltZW91dD0idHJ1ZSIgLz4KKyAgICA8IS0tIE5vdGUgOiBUbyBkaXNhYmxlIGNvbm5lY3Rpb24gdGltZW91dHMsIHNldCBjb25uZWN0aW9uVGltZW91dCB2YWx1ZQorICAgICB0byAwIC0tPgorCQorCTwhLS0gTm90ZSA6IFRvIHVzZSBnemlwIGNvbXByZXNzaW9uIHlvdSBjb3VsZCBzZXQgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIDoKKwkKKwkJCSAgIGNvbXByZXNzaW9uPSJvbiIgCisJCQkgICBjb21wcmVzc2lvbk1pblNpemU9IjIwNDgiIAorCQkJICAgbm9Db21wcmVzc2lvblVzZXJBZ2VudHM9ImdvemlsbGEsIHRyYXZpYXRhIiAKKwkJCSAgIGNvbXByZXNzYWJsZU1pbWVUeXBlPSJ0ZXh0L2h0bWwsdGV4dC94bWwiCisJLS0+CisKKyAgICA8IS0tIERlZmluZSBhIFNTTCBIVFRQLzEuMSBDb25uZWN0b3Igb24gcG9ydCA4NDQzIC0tPgorICAgIDwhLS0KKyAgICA8Q29ubmVjdG9yIHBvcnQ9Ijg0NDMiIAorICAgICAgICAgICAgICAgbWF4VGhyZWFkcz0iMTUwIiBtaW5TcGFyZVRocmVhZHM9IjI1IiBtYXhTcGFyZVRocmVhZHM9Ijc1IgorICAgICAgICAgICAgICAgZW5hYmxlTG9va3Vwcz0iZmFsc2UiIGRpc2FibGVVcGxvYWRUaW1lb3V0PSJ0cnVlIgorICAgICAgICAgICAgICAgYWNjZXB0Q291bnQ9IjEwMCIgZGVidWc9IjAiIHNjaGVtZT0iaHR0cHMiIHNlY3VyZT0idHJ1ZSIKKyAgICAgICAgICAgICAgIGNsaWVudEF1dGg9ImZhbHNlIiBzc2xQcm90b2NvbD0iVExTIiAvPgorICAgIC0tPgorCisgICAgPCEtLSBEZWZpbmUgYW4gQUpQIDEuMyBDb25uZWN0b3Igb24gcG9ydCA4MDA5IC0tPgorICAgIDxDb25uZWN0b3IgcG9ydD0iODAwOSIgCisgICAgICAgICAgICAgICBlbmFibGVMb29rdXBzPSJmYWxzZSIgcmVkaXJlY3RQb3J0PSI4NDQzIiBkZWJ1Zz0iMCIKKyAgICAgICAgICAgICAgIHByb3RvY29sPSJBSlAvMS4zIiAvPgorCisgICAgPCEtLSBEZWZpbmUgYSBQcm94aWVkIEhUVFAvMS4xIENvbm5lY3RvciBvbiBwb3J0IDgwODIgLS0+CisgICAgPCEtLSBTZWUgcHJveHkgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB1c2luZyB0aGlzLiAtLT4KKyAgICA8IS0tCisgICAgPENvbm5lY3RvciBwb3J0PSI4MDgyIiAKKyAgICAgICAgICAgICAgIG1heFRocmVhZHM9IjE1MCIgbWluU3BhcmVUaHJlYWRzPSIyNSIgbWF4U3BhcmVUaHJlYWRzPSI3NSIKKyAgICAgICAgICAgICAgIGVuYWJsZUxvb2t1cHM9ImZhbHNlIgorICAgICAgICAgICAgICAgYWNjZXB0Q291bnQ9IjEwMCIgZGVidWc9IjAiIGNvbm5lY3Rpb25UaW1lb3V0PSIyMDAwMCIKKyAgICAgICAgICAgICAgIHByb3h5UG9ydD0iODAiIGRpc2FibGVVcGxvYWRUaW1lb3V0PSJ0cnVlIiAvPgorICAgIC0tPgorCisgICAgPCEtLSBBbiBFbmdpbmUgcmVwcmVzZW50cyB0aGUgZW50cnkgcG9pbnQgKHdpdGhpbiBDYXRhbGluYSkgdGhhdCBwcm9jZXNzZXMKKyAgICAgICAgIGV2ZXJ5IHJlcXVlc3QuICBUaGUgRW5naW5lIGltcGxlbWVudGF0aW9uIGZvciBUb21jYXQgc3RhbmQgYWxvbmUKKyAgICAgICAgIGFuYWx5emVzIHRoZSBIVFRQIGhlYWRlcnMgaW5jbHVkZWQgd2l0aCB0aGUgcmVxdWVzdCwgYW5kIHBhc3NlcyB0aGVtCisgICAgICAgICBvbiB0byB0aGUgYXBwcm9wcmlhdGUgSG9zdCAodmlydHVhbCBob3N0KS4gLS0+CisKKyAgICA8IS0tIFlvdSBzaG91bGQgc2V0IGp2bVJvdXRlIHRvIHN1cHBvcnQgbG9hZC1iYWxhbmNpbmcgdmlhIEFKUCBpZSA6CisgICAgPEVuZ2luZSBuYW1lPSJTdGFuZGFsb25lIiBkZWZhdWx0SG9zdD0ibG9jYWxob3N0IiBkZWJ1Zz0iMCIganZtUm91dGU9Imp2bTEiPiAgICAgICAgIAorICAgIC0tPiAKKyAgICAgICAgIAorICAgIDwhLS0gRGVmaW5lIHRoZSB0b3AgbGV2ZWwgY29udGFpbmVyIGluIG91ciBjb250YWluZXIgaGllcmFyY2h5IC0tPgorICAgIDxFbmdpbmUgbmFtZT0iQ2F0YWxpbmEiIGRlZmF1bHRIb3N0PSJsb2NhbGhvc3QiIGRlYnVnPSIwIj4KKworICAgICAgPCEtLSBUaGUgcmVxdWVzdCBkdW1wZXIgdmFsdmUgZHVtcHMgdXNlZnVsIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBhYm91dAorICAgICAgICAgICB0aGUgcmVxdWVzdCBoZWFkZXJzIGFuZCBjb29raWVzIHRoYXQgd2VyZSByZWNlaXZlZCwgYW5kIHRoZSByZXNwb25zZQorICAgICAgICAgICBoZWFkZXJzIGFuZCBjb29raWVzIHRoYXQgd2VyZSBzZW50LCBmb3IgYWxsIHJlcXVlc3RzIHJlY2VpdmVkIGJ5CisgICAgICAgICAgIHRoaXMgaW5zdGFuY2Ugb2YgVG9tY2F0LiAgSWYgeW91IGNhcmUgb25seSBhYm91dCByZXF1ZXN0cyB0byBhCisgICAgICAgICAgIHBhcnRpY3VsYXIgdmlydHVhbCBob3N0LCBvciBhIHBhcnRpY3VsYXIgYXBwbGljYXRpb24sIG5lc3QgdGhpcworICAgICAgICAgICBlbGVtZW50IGluc2lkZSB0aGUgY29ycmVzcG9uZGluZyA8SG9zdD4gb3IgPENvbnRleHQ+IGVudHJ5IGluc3RlYWQuCisKKyAgICAgICAgICAgRm9yIGEgc2ltaWxhciBtZWNoYW5pc20gdGhhdCBpcyBwb3J0YWJsZSB0byBhbGwgU2VydmxldCAyLjQKKyAgICAgICAgICAgY29udGFpbmVycywgY2hlY2sgb3V0IHRoZSAiUmVxdWVzdER1bXBlckZpbHRlciIgRmlsdGVyIGluIHRoZQorICAgICAgICAgICBleGFtcGxlIGFwcGxpY2F0aW9uICh0aGUgc291cmNlIGZvciB0aGlzIGZpbHRlciBtYXkgYmUgZm91bmQgaW4KKyAgICAgICAgICAgIiRDQVRBTElOQV9IT01FL3dlYmFwcHMvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2ZpbHRlcnMiKS4KKworICAgICAgICAgICBSZXF1ZXN0IGR1bXBpbmcgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdC4gIFVuY29tbWVudCB0aGUgZm9sbG93aW5nCisgICAgICAgICAgIGVsZW1lbnQgdG8gZW5hYmxlIGl0LiAtLT4KKyAgICAgIDwhLS0KKyAgICAgIDxWYWx2ZSBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEudmFsdmVzLlJlcXVlc3REdW1wZXJWYWx2ZSIvPgorICAgICAgLS0+CisKKyAgICAgIDwhLS0gQmVjYXVzZSB0aGlzIFJlYWxtIGlzIGhlcmUsIGFuIGluc3RhbmNlIHdpbGwgYmUgc2hhcmVkIGdsb2JhbGx5IC0tPgorCisgICAgICA8IS0tIFRoaXMgUmVhbG0gdXNlcyB0aGUgVXNlckRhdGFiYXNlIGNvbmZpZ3VyZWQgaW4gdGhlIGdsb2JhbCBKTkRJCisgICAgICAgICAgIHJlc291cmNlcyB1bmRlciB0aGUga2V5ICJVc2VyRGF0YWJhc2UiLiAgQW55IGVkaXRzCisgICAgICAgICAgIHRoYXQgYXJlIHBlcmZvcm1lZCBhZ2FpbnN0IHRoaXMgVXNlckRhdGFiYXNlIGFyZSBpbW1lZGlhdGVseQorICAgICAgICAgICBhdmFpbGFibGUgZm9yIHVzZSBieSB0aGUgUmVhbG0uICAtLT4KKyAgICAgIDxSZWFsbSBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEucmVhbG0uVXNlckRhdGFiYXNlUmVhbG0iCisgICAgICAgICAgICAgICAgIGRlYnVnPSIwIiByZXNvdXJjZU5hbWU9IlVzZXJEYXRhYmFzZSIvPgorCisgICAgICA8IS0tIENvbW1lbnQgb3V0IHRoZSBvbGQgcmVhbG0gYnV0IGxlYXZlIGhlcmUgZm9yIG5vdyBpbiBjYXNlIHdlCisgICAgICAgICAgIG5lZWQgdG8gZ28gYmFjayBxdWlja2x5IC0tPgorICAgICAgPCEtLQorICAgICAgPFJlYWxtIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5yZWFsbS5NZW1vcnlSZWFsbSIgLz4KKyAgICAgIC0tPgorCisgICAgICA8IS0tIFJlcGxhY2UgdGhlIGFib3ZlIFJlYWxtIHdpdGggb25lIG9mIHRoZSBmb2xsb3dpbmcgdG8gZ2V0IGEgUmVhbG0KKyAgICAgICAgICAgc3RvcmVkIGluIGEgZGF0YWJhc2UgYW5kIGFjY2Vzc2VkIHZpYSBKREJDIC0tPgorCisgICAgICA8IS0tCisgICAgICA8UmVhbG0gIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5yZWFsbS5KREJDUmVhbG0iIGRlYnVnPSI5OSIKKyAgICAgICAgICAgICBkcml2ZXJOYW1lPSJvcmcuZ2p0Lm1tLm15c3FsLkRyaXZlciIKKyAgICAgICAgICBjb25uZWN0aW9uVVJMPSJqZGJjOm15c3FsOi8vbG9jYWxob3N0L2F1dGhvcml0eSIKKyAgICAgICAgIGNvbm5lY3Rpb25OYW1lPSJ0ZXN0IiBjb25uZWN0aW9uUGFzc3dvcmQ9InRlc3QiCisgICAgICAgICAgICAgIHVzZXJUYWJsZT0idXNlcnMiIHVzZXJOYW1lQ29sPSJ1c2VyX25hbWUiIHVzZXJDcmVkQ29sPSJ1c2VyX3Bhc3MiCisgICAgICAgICAgdXNlclJvbGVUYWJsZT0idXNlcl9yb2xlcyIgcm9sZU5hbWVDb2w9InJvbGVfbmFtZSIgLz4KKyAgICAgIC0tPgorCisgICAgICA8IS0tCisgICAgICA8UmVhbG0gIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5yZWFsbS5KREJDUmVhbG0iIGRlYnVnPSI5OSIKKyAgICAgICAgICAgICBkcml2ZXJOYW1lPSJvcmFjbGUuamRiYy5kcml2ZXIuT3JhY2xlRHJpdmVyIgorICAgICAgICAgIGNvbm5lY3Rpb25VUkw9ImpkYmM6b3JhY2xlOnRoaW46QG50c2VydmVyOjE1MjE6T1JDTCIKKyAgICAgICAgIGNvbm5lY3Rpb25OYW1lPSJzY290dCIgY29ubmVjdGlvblBhc3N3b3JkPSJ0aWdlciIKKyAgICAgICAgICAgICAgdXNlclRhYmxlPSJ1c2VycyIgdXNlck5hbWVDb2w9InVzZXJfbmFtZSIgdXNlckNyZWRDb2w9InVzZXJfcGFzcyIKKyAgICAgICAgICB1c2VyUm9sZVRhYmxlPSJ1c2VyX3JvbGVzIiByb2xlTmFtZUNvbD0icm9sZV9uYW1lIiAvPgorICAgICAgLS0+CisKKyAgICAgIDwhLS0KKyAgICAgIDxSZWFsbSAgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtLkpEQkNSZWFsbSIgZGVidWc9Ijk5IgorICAgICAgICAgICAgIGRyaXZlck5hbWU9InN1bi5qZGJjLm9kYmMuSmRiY09kYmNEcml2ZXIiCisgICAgICAgICAgY29ubmVjdGlvblVSTD0iamRiYzpvZGJjOkNBVEFMSU5BIgorICAgICAgICAgICAgICB1c2VyVGFibGU9InVzZXJzIiB1c2VyTmFtZUNvbD0idXNlcl9uYW1lIiB1c2VyQ3JlZENvbD0idXNlcl9wYXNzIgorICAgICAgICAgIHVzZXJSb2xlVGFibGU9InVzZXJfcm9sZXMiIHJvbGVOYW1lQ29sPSJyb2xlX25hbWUiIC8+CisgICAgICAtLT4KKworICAgICAgPCEtLSBEZWZpbmUgdGhlIGRlZmF1bHQgdmlydHVhbCBob3N0CisgICAgICAgICAgIE5vdGU6IFhNTCBTY2hlbWEgdmFsaWRhdGlvbiB3aWxsIG5vdCB3b3JrIHdpdGggWGVyY2VzIDIuMi4KKyAgICAgICAtLT4KKyAgICAgIDxIb3N0IG5hbWU9ImxvY2FsaG9zdCIgZGVidWc9IjAiIGFwcEJhc2U9IndlYmFwcHMiCisgICAgICAgdW5wYWNrV0FScz0idHJ1ZSIgYXV0b0RlcGxveT0idHJ1ZSIKKyAgICAgICB4bWxWYWxpZGF0aW9uPSJmYWxzZSIgeG1sTmFtZXNwYWNlQXdhcmU9ImZhbHNlIj4KKworICAgICAgICA8IS0tIERlZmluZXMgYSBjbHVzdGVyIGZvciB0aGlzIG5vZGUsCisgICAgICAgICAgICAgQnkgZGVmaW5pbmcgdGhpcyBlbGVtZW50LCBtZWFucyB0aGF0IGV2ZXJ5IG1hbmFnZXIgd2lsbCBiZSBjaGFuZ2VkLgorICAgICAgICAgICAgIFNvIHdoZW4gcnVubmluZyBhIGNsdXN0ZXIsIG9ubHkgbWFrZSBzdXJlIHRoYXQgeW91IGhhdmUgd2ViYXBwcyBpbiB0aGVyZQorICAgICAgICAgICAgIHRoYXQgbmVlZCB0byBiZSBjbHVzdGVyZWQgYW5kIHJlbW92ZSB0aGUgb3RoZXIgb25lcy4KKyAgICAgICAgICAgICBBIGNsdXN0ZXIgaGFzIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczoKKworICAgICAgICAgICAgIGNsYXNzTmFtZSA9IHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgY2x1c3RlciBjbGFzcworCisgICAgICAgICAgICAgbmFtZSA9IGEgZGVzY3JpcHRpdmUgbmFtZSBmb3IgeW91ciBjbHVzdGVyLCBjYW4gYmUgYW55dGhpbmcKKworICAgICAgICAgICAgIGRlYnVnID0gdGhlIGRlYnVnIGxldmVsLCBoaWdoZXIgbWVhbnMgbW9yZSBvdXRwdXQKKworICAgICAgICAgICAgIG1jYXN0QWRkciA9IHRoZSBtdWx0aWNhc3QgYWRkcmVzcywgaGFzIHRvIGJlIHRoZSBzYW1lIGZvciBhbGwgdGhlIG5vZGVzCisKKyAgICAgICAgICAgICBtY2FzdFBvcnQgPSB0aGUgbXVsdGljYXN0IHBvcnQsIGhhcyB0byBiZSB0aGUgc2FtZSBmb3IgYWxsIHRoZSBub2RlcworICAgICAgICAgICAgIAorICAgICAgICAgICAgIG1jYXN0QmluZEFkZHIgPSBiaW5kIHRoZSBtdWx0aWNhc3Qgc29ja2V0IHRvIGEgc3BlY2lmaWMgYWRkcmVzcworICAgICAgICAgICAgIAorICAgICAgICAgICAgIG1jYXN0VFRMID0gdGhlIG11bHRpY2FzdCBUVEwgaWYgeW91IHdhbnQgdG8gbGltaXQgeW91ciBicm9hZGNhc3QKKyAgICAgICAgICAgICAKKyAgICAgICAgICAgICBtY2FzdFNvVGltZW91dCA9IHRoZSBtdWx0aWNhc3QgcmVhZHRpbWVvdXQgCisKKyAgICAgICAgICAgICBtY2FzdEZyZXF1ZW5jeSA9IHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGluIGJldHdlZW4gc2VuZGluZyBhICJJJ20gYWxpdmUiIGhlYXJ0YmVhdAorCisgICAgICAgICAgICAgbWNhc3REcm9wVGltZSA9IHRoZSBudW1iZXIgYSBtaWxsaXNlY29uZHMgYmVmb3JlIGEgbm9kZSBpcyBjb25zaWRlcmVkICJkZWFkIiBpZiBubyBoZWFydGJlYXQgaXMgcmVjZWl2ZWQKKworICAgICAgICAgICAgIHRjcFRocmVhZENvdW50ID0gdGhlIG51bWJlciBvZiB0aHJlYWRzIHRvIGhhbmRsZSBpbmNvbWluZyByZXBsaWNhdGlvbiByZXF1ZXN0cywgb3B0aW1hbCB3b3VsZCBiZSB0aGUgc2FtZSBhbW91bnQgb2YgdGhyZWFkcyBhcyBub2RlcyAKKworICAgICAgICAgICAgIHRjcExpc3RlbkFkZHJlc3MgPSB0aGUgbGlzdGVuIGFkZHJlc3MgKGJpbmQgYWRkcmVzcykgZm9yIFRDUCBjbHVzdGVyIHJlcXVlc3Qgb24gdGhpcyBob3N0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gY2FzZSBvZiBtdWx0aXBsZSBldGhlcm5ldCBjYXJkcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0byBtZWFucyB0aGF0IGFkZHJlc3MgYmVjb21lcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKS5nZXRIb3N0QWRkcmVzcygpCisKKyAgICAgICAgICAgICB0Y3BMaXN0ZW5Qb3J0ID0gdGhlIHRjcCBsaXN0ZW4gcG9ydAorCisgICAgICAgICAgICAgdGNwU2VsZWN0b3JUaW1lb3V0ID0gdGhlIHRpbWVvdXQgKG1zKSBmb3IgdGhlIFNlbGVjdG9yLnNlbGVjdCgpIG1ldGhvZCBpbiBjYXNlIHRoZSBPUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhcyBhIHdha3VwIGJ1ZyBpbiBqYXZhLm5pby4gU2V0IHRvIDAgZm9yIG5vIHRpbWVvdXQKKworICAgICAgICAgICAgIHByaW50VG9TY3JlZW4gPSB0cnVlIG1lYW5zIHRoYXQgbWFuYWdlcnMgd2lsbCBhbHNvIHByaW50IHRvIHN0ZC5vdXQKKworICAgICAgICAgICAgIGV4cGlyZVNlc3Npb25zT25TaHV0ZG93biA9IHRydWUgbWVhbnMgdGhhdCAKKworICAgICAgICAgICAgIHVzZURpcnR5RmxhZyA9IHRydWUgbWVhbnMgdGhhdCB3ZSBvbmx5IHJlcGxpY2F0ZSBhIHNlc3Npb24gYWZ0ZXIgc2V0QXR0cmlidXRlLHJlbW92ZUF0dHJpYnV0ZSBoYXMgYmVlbiBjYWxsZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgbWVhbnMgdG8gcmVwbGljYXRlIHRoZSBzZXNzaW9uIGFmdGVyIGVhY2ggcmVxdWVzdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSBtZWFucyB0aGF0IHJlcGxpY2F0aW9uIHdvdWxkIHdvcmsgZm9yIHRoZSBmb2xsb3dpbmcgcGllY2Ugb2YgY29kZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8JQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhc2hNYXAgbWFwID0gKEhhc2hNYXApc2Vzc2lvbi5nZXRBdHRyaWJ1dGUoIm1hcCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcC5wdXQoImtleSIsInZhbHVlIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJT4KKyAgICAgICAgICAgICByZXBsaWNhdGlvbk1vZGUgPSBjYW4gYmUgZWl0aGVyICdwb29sZWQnLCAnc3luY2hyb25vdXMnIG9yICdhc3luY2hyb25vdXMnLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogUG9vbGVkIG1lYW5zIHRoYXQgdGhlIHJlcGxpY2F0aW9uIGhhcHBlbnMgdXNpbmcgc2V2ZXJhbCBzb2NrZXRzIGluIGEgc3luY2hyb25vdXMgd2F5LiBJZSwgdGhlIGRhdGEgZ2V0cyByZXBsaWNhdGVkLCB0aGVuIHRoZSByZXF1ZXN0IHJldHVybi4gVGhpcyBpcyB0aGUgc2FtZSBhcyB0aGUgJ3N5bmNocm9ub3VzJyBzZXR0aW5nIGV4Y2VwdCBpdCB1c2VzIGEgcG9vbCBvZiBzb2NrZXRzLCBoZW5jZSBpdCBpcyBtdWx0aXRocmVhZGVkLiBUaGlzIGlzIHRoZSBmYXN0ZXN0IGFuZCBzYWZlc3QgY29uZmlndXJhdGlvbi4gVG8gdXNlIHRoaXMsIGFsc28gaW5jcmVhc2UgdGhlIG5yIG9mIHRjcCB0aHJlYWRzIHRoYXQgeW91IGhhdmUgZGVhbGluZyB3aXRoIHJlcGxpY2F0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogU3luY2hyb25vdXMgbWVhbnMgdGhhdCB0aGUgdGhyZWFkIHRoYXQgZXhlY3V0ZXMgdGhlIHJlcXVlc3QsIGlzIGFsc28gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkIHRoZSByZXBsaWNhdGVzIHRoZSBkYXRhIHRvIHRoZSBvdGhlciBub2RlcywgYW5kIHdpbGwgbm90IHJldHVybiB1bnRpbCBhbGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlcyBoYXZlIHJlY2VpdmVkIHRoZSBpbmZvcm1hdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEFzeW5jaHJvbm91cyBtZWFucyB0aGF0IHRoZXJlIGlzIGEgc3BlY2lmaWMgJ3NlbmRlcicgdGhyZWFkIGZvciBlYWNoIGNsdXN0ZXIgbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbyB0aGUgcmVxdWVzdCB0aHJlYWQgd2lsbCBxdWV1ZSB0aGUgcmVwbGljYXRpb24gcmVxdWVzdCBpbnRvIGEgInNtYXJ0IiBxdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgdGhlbiByZXR1cm4gdG8gdGhlIGNsaWVudC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgInNtYXJ0IiBxdWV1ZSBpcyBhIHF1ZXVlIHdoZXJlIHdoZW4gYSBzZXNzaW9uIGlzIGFkZGVkIHRvIHRoZSBxdWV1ZSwgYW5kIHRoZSBzYW1lIHNlc3Npb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgcXVldWUgZnJvbSBhIHByZXZpb3VzIHJlcXVlc3QsIHRoYXQgc2Vzc2lvbiB3aWxsIGJlIHJlcGxhY2VkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIHF1ZXVlIGluc3RlYWQgb2YgcmVwbGljYXRpbmcgdHdvIHJlcXVlc3RzLiBUaGlzIGFsbW9zdCBuZXZlciBoYXBwZW5zLCB1bmxlc3MgdGhlcmUgaXMgYSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXJnZSBuZXR3b3JrIGRlbGF5LgorICAgICAgICAtLT4gICAgICAgICAgICAgCisgICAgICAgIDwhLS0KKyAgICAgICAgICAgIFdoZW4gY29uZmlndXJpbmcgZm9yIGNsdXN0ZXJpbmcsIHlvdSBhbHNvIGFkZCBpbiBhIHZhbHZlIHRvIGNhdGNoIGFsbCB0aGUgcmVxdWVzdHMKKyAgICAgICAgICAgIGNvbWluZyBpbiwgYXQgdGhlIGVuZCBvZiB0aGUgcmVxdWVzdCwgdGhlIHNlc3Npb24gbWF5IG9yIG1heSBub3QgYmUgcmVwbGljYXRlZC4KKyAgICAgICAgICAgIEEgc2Vzc2lvbiBpcyByZXBsaWNhdGVkIGlmIGFuZCBvbmx5IGlmIGFsbCB0aGUgY29uZGl0aW9ucyBhcmUgbWV0OgorICAgICAgICAgICAgMS4gdXNlRGlydHlGbGFnIGlzIHRydWUgb3Igc2V0QXR0cmlidXRlIG9yIHJlbW92ZUF0dHJpYnV0ZSBoYXMgYmVlbiBjYWxsZWQgQU5ECisgICAgICAgICAgICAyLiBhIHNlc3Npb24gZXhpc3RzIChoYXMgYmVlbiBjcmVhdGVkKQorICAgICAgICAgICAgMy4gdGhlIHJlcXVlc3QgaXMgbm90IHRyYXBwZWQgYnkgdGhlICJmaWx0ZXIiIGF0dHJpYnV0ZQorCisgICAgICAgICAgICBUaGUgZmlsdGVyIGF0dHJpYnV0ZSBpcyB0byBmaWx0ZXIgb3V0IHJlcXVlc3RzIHRoYXQgY291bGQgbm90IG1vZGlmeSB0aGUgc2Vzc2lvbiwKKyAgICAgICAgICAgIGhlbmNlIHdlIGRvbid0IHJlcGxpY2F0ZSB0aGUgc2Vzc2lvbiBhZnRlciB0aGUgZW5kIG9mIHRoaXMgcmVxdWVzdC4KKyAgICAgICAgICAgIFRoZSBmaWx0ZXIgaXMgbmVnYXRpdmUsIGllLCBhbnl0aGluZyB5b3UgcHV0IGluIHRoZSBmaWx0ZXIsIHlvdSBtZWFuIHRvIGZpbHRlciBvdXQsCisgICAgICAgICAgICBpZSwgbm8gcmVwbGljYXRpb24gd2lsbCBiZSBkb25lIG9uIHJlcXVlc3RzIHRoYXQgbWF0Y2ggb25lIG9mIHRoZSBmaWx0ZXJzLgorICAgICAgICAgICAgVGhlIGZpbHRlciBhdHRyaWJ1dGUgaXMgZGVsaW1pdGVkIGJ5IDssIHNvIHlvdSBjYW4ndCBlc2NhcGUgb3V0IDsgZXZlbiBpZiB5b3Ugd2FudGVkIHRvLgorCisgICAgICAgICAgICBmaWx0ZXI9Ii4qXC5naWY7LipcLmpzOyIgbWVhbnMgdGhhdCB3ZSB3aWxsIG5vdCByZXBsaWNhdGUgdGhlIHNlc3Npb24gYWZ0ZXIgcmVxdWVzdHMgd2l0aCB0aGUgVVJJCisgICAgICAgICAgICBlbmRpbmcgd2l0aCAuZ2lmIGFuZCAuanMgYXJlIGludGVyY2VwdGVkLgorICAgICAgICAgICAgCisgICAgICAgICAgICBUaGUgZGVwbG95ZXIgZWxlbWVudCBjYW4gYmUgdXNlZCB0byBkZXBsb3kgYXBwcyBjbHVzdGVyIHdpZGUuCisgICAgICAgICAgICBDdXJyZW50bHkgdGhlIGRlcGxveW1lbnQgb25seSBkZXBsb3lzL3VuZGVwbG95cyB0byB3b3JraW5nIG1lbWJlcnMgaW4gdGhlIGNsdXN0ZXIKKyAgICAgICAgICAgIHNvIG5vIFdBUnMgYXJlIGNvcGllZCB1cG9ucyBzdGFydHVwIG9mIGEgYnJva2VuIG5vZGUuCisgICAgICAgICAgICBUaGUgZGVwbG95ZXIgd2F0Y2hlcyBhIGRpcmVjdG9yeSAod2F0Y2hEaXIpIGZvciBXQVIgZmlsZXMgd2hlbiB3YXRjaEVuYWJsZWQ9InRydWUiCisgICAgICAgICAgICBXaGVuIGEgbmV3IHdhciBmaWxlIGlzIGFkZGVkIHRoZSB3YXIgZ2V0cyBkZXBsb3llZCB0byB0aGUgbG9jYWwgaW5zdGFuY2UsCisgICAgICAgICAgICBhbmQgdGhlbiBkZXBsb3llZCB0byB0aGUgb3RoZXIgaW5zdGFuY2VzIGluIHRoZSBjbHVzdGVyLgorICAgICAgICAgICAgV2hlbiBhIHdhciBmaWxlIGlzIGRlbGV0ZWQgZnJvbSB0aGUgd2F0Y2hEaXIgdGhlIHdhciBpcyB1bmRlcGxveWVkIGxvY2FsbHkgCisgICAgICAgICAgICBhbmQgY2x1c3RlciB3aWRlCisgICAgICAgIC0tPgorICAgICAgICAKKyAgICAgICAgPCEtLQorICAgICAgICA8Q2x1c3RlciBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci50Y3AuU2ltcGxlVGNwQ2x1c3RlciIKKyAgICAgICAgICAgICAgICAgbWFuYWdlckNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnNlc3Npb24uRGVsdGFNYW5hZ2VyIgorICAgICAgICAgICAgICAgICBleHBpcmVTZXNzaW9uc09uU2h1dGRvd249ImZhbHNlIgorICAgICAgICAgICAgICAgICB1c2VEaXJ0eUZsYWc9InRydWUiCisgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyc09uUmVwbGljYXRpb249InRydWUiPgorCisgICAgICAgICAgICA8TWVtYmVyc2hpcCAKKyAgICAgICAgICAgICAgICBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5tY2FzdC5NY2FzdFNlcnZpY2UiCisgICAgICAgICAgICAgICAgbWNhc3RBZGRyPSIyMjguMC4wLjQiCisgICAgICAgICAgICAgICAgbWNhc3RQb3J0PSI0NTU2NCIKKyAgICAgICAgICAgICAgICBtY2FzdEZyZXF1ZW5jeT0iNTAwIgorICAgICAgICAgICAgICAgIG1jYXN0RHJvcFRpbWU9IjMwMDAiLz4KKworICAgICAgICAgICAgPFJlY2VpdmVyIAorICAgICAgICAgICAgICAgIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnRjcC5SZXBsaWNhdGlvbkxpc3RlbmVyIgorICAgICAgICAgICAgICAgIHRjcExpc3RlbkFkZHJlc3M9ImF1dG8iCisgICAgICAgICAgICAgICAgdGNwTGlzdGVuUG9ydD0iNDAwMSIKKyAgICAgICAgICAgICAgICB0Y3BTZWxlY3RvclRpbWVvdXQ9IjEwMCIKKyAgICAgICAgICAgICAgICB0Y3BUaHJlYWRDb3VudD0iNiIvPgorCisgICAgICAgICAgICA8U2VuZGVyCisgICAgICAgICAgICAgICAgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIudGNwLlJlcGxpY2F0aW9uVHJhbnNtaXR0ZXIiCisgICAgICAgICAgICAgICAgcmVwbGljYXRpb25Nb2RlPSJwb29sZWQiCisgICAgICAgICAgICAgICAgYWNrVGltZW91dD0iMTUwMDAiLz4KKworICAgICAgICAgICAgPFZhbHZlIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnRjcC5SZXBsaWNhdGlvblZhbHZlIgorICAgICAgICAgICAgICAgICAgIGZpbHRlcj0iLipcLmdpZjsuKlwuanM7LipcLmpwZzsuKlwuaHRtOy4qXC5odG1sOy4qXC50eHQ7Ii8+CisgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICA8RGVwbG95ZXIgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuZGVwbG95LkZhcm1XYXJEZXBsb3llciIKKyAgICAgICAgICAgICAgICAgICAgICB0ZW1wRGlyPSIvdG1wL3dhci10ZW1wLyIKKyAgICAgICAgICAgICAgICAgICAgICBkZXBsb3lEaXI9Ii90bXAvd2FyLWRlcGxveS8iCisgICAgICAgICAgICAgICAgICAgICAgd2F0Y2hEaXI9Ii90bXAvd2FyLWxpc3Rlbi8iCisgICAgICAgICAgICAgICAgICAgICAgd2F0Y2hFbmFibGVkPSJmYWxzZSIvPgorICAgICAgICA8L0NsdXN0ZXI+CisgICAgICAgIC0tPiAgICAgICAgCisKKworCisgICAgICAgIDwhLS0gTm9ybWFsbHksIHVzZXJzIG11c3QgYXV0aGVudGljYXRlIHRoZW1zZWx2ZXMgdG8gZWFjaCB3ZWIgYXBwCisgICAgICAgICAgICAgaW5kaXZpZHVhbGx5LiAgVW5jb21tZW50IHRoZSBmb2xsb3dpbmcgZW50cnkgaWYgeW91IHdvdWxkIGxpa2UKKyAgICAgICAgICAgICBhIHVzZXIgdG8gYmUgYXV0aGVudGljYXRlZCB0aGUgZmlyc3QgdGltZSB0aGV5IGVuY291bnRlciBhCisgICAgICAgICAgICAgcmVzb3VyY2UgcHJvdGVjdGVkIGJ5IGEgc2VjdXJpdHkgY29uc3RyYWludCwgYW5kIHRoZW4gaGF2ZSB0aGF0CisgICAgICAgICAgICAgdXNlciBpZGVudGl0eSBtYWludGFpbmVkIGFjcm9zcyAqYWxsKiB3ZWIgYXBwbGljYXRpb25zIGNvbnRhaW5lZAorICAgICAgICAgICAgIGluIHRoaXMgdmlydHVhbCBob3N0LiAtLT4KKyAgICAgICAgPCEtLQorICAgICAgICA8VmFsdmUgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmF1dGhlbnRpY2F0b3IuU2luZ2xlU2lnbk9uIgorICAgICAgICAgICAgICAgICAgIGRlYnVnPSIwIi8+CisgICAgICAgIC0tPgorCisgICAgICAgIDwhLS0gQWNjZXNzIGxvZyBwcm9jZXNzZXMgYWxsIHJlcXVlc3RzIGZvciB0aGlzIHZpcnR1YWwgaG9zdC4gIEJ5CisgICAgICAgICAgICAgZGVmYXVsdCwgbG9nIGZpbGVzIGFyZSBjcmVhdGVkIGluIHRoZSAibG9ncyIgZGlyZWN0b3J5IHJlbGF0aXZlIHRvCisgICAgICAgICAgICAgJENBVEFMSU5BX0hPTUUuICBJZiB5b3Ugd2lzaCwgeW91IGNhbiBzcGVjaWZ5IGEgZGlmZmVyZW50CisgICAgICAgICAgICAgZGlyZWN0b3J5IHdpdGggdGhlICJkaXJlY3RvcnkiIGF0dHJpYnV0ZS4gIFNwZWNpZnkgZWl0aGVyIGEgcmVsYXRpdmUKKyAgICAgICAgICAgICAodG8gJENBVEFMSU5BX0hPTUUpIG9yIGFic29sdXRlIHBhdGggdG8gdGhlIGRlc2lyZWQgZGlyZWN0b3J5LgorICAgICAgICAtLT4KKyAgICAgICAgPCEtLQorICAgICAgICA8VmFsdmUgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcy5BY2Nlc3NMb2dWYWx2ZSIKKyAgICAgICAgICAgICAgICAgZGlyZWN0b3J5PSJsb2dzIiAgcHJlZml4PSJsb2NhbGhvc3RfYWNjZXNzX2xvZy4iIHN1ZmZpeD0iLnR4dCIKKyAgICAgICAgICAgICAgICAgcGF0dGVybj0iY29tbW9uIiByZXNvbHZlSG9zdHM9ImZhbHNlIi8+CisgICAgICAgIC0tPgorCisgICAgICA8L0hvc3Q+CisKKyAgICA8L0VuZ2luZT4KKworICA8L1NlcnZpY2U+CisKKzwvU2VydmVyPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9jb25mL3RvbWNhdC11c2Vycy54bWwgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL2NvbmYvdG9tY2F0LXVzZXJzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODhjZmM5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9jb25mL3RvbWNhdC11c2Vycy54bWwKQEAgLTAsMCArMSwxMCBAQAorPCEtLQorICBOT1RFOiAgQnkgZGVmYXVsdCwgbm8gdXNlciBpcyBpbmNsdWRlZCBpbiB0aGUgIm1hbmFnZXIiIHJvbGUgcmVxdWlyZWQKKyAgdG8gb3BlcmF0ZSB0aGUgIi9tYW5hZ2VyIiB3ZWIgYXBwbGljYXRpb24uICBJZiB5b3Ugd2lzaCB0byB1c2UgdGhpcyBhcHAsCisgIHlvdSBtdXN0IGRlZmluZSBzdWNoIGEgdXNlciAtIHRoZSB1c2VybmFtZSBhbmQgcGFzc3dvcmQgYXJlIGFyYml0cmFyeS4KKy0tPgorPHRvbWNhdC11c2Vycz4KKyAgPHVzZXIgbmFtZT0idG9tY2F0IiBwYXNzd29yZD0idG9tY2F0IiByb2xlcz0idG9tY2F0IiAvPgorICA8dXNlciBuYW1lPSJyb2xlMSIgIHBhc3N3b3JkPSJ0b21jYXQiIHJvbGVzPSJyb2xlMSIgIC8+CisgIDx1c2VyIG5hbWU9ImJvdGgiICAgcGFzc3dvcmQ9InRvbWNhdCIgcm9sZXM9InRvbWNhdCxyb2xlMSIgLz4KKzwvdG9tY2F0LXVzZXJzPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9jb25mL3dlYi54bWwgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL2NvbmYvd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGYzMTc5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9jb25mL3dlYi54bWwKQEAgLTAsMCArMSw5NDEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KKzx3ZWItYXBwIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgorICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvd2ViLWFwcF8yXzQueHNkIgorICAgIHZlcnNpb249IjIuNCI+CisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT0gSW50cm9kdWN0aW9uID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPCEtLSBUaGlzIGRvY3VtZW50IGRlZmluZXMgZGVmYXVsdCB2YWx1ZXMgZm9yICphbGwqIHdlYiBhcHBsaWNhdGlvbnMgICAgICAtLT4KKyAgPCEtLSBsb2FkZWQgaW50byB0aGlzIGluc3RhbmNlIG9mIFRvbWNhdC4gIEFzIGVhY2ggYXBwbGljYXRpb24gaXMgICAgICAgICAtLT4KKyAgPCEtLSBkZXBsb3llZCwgdGhpcyBmaWxlIGlzIHByb2Nlc3NlZCwgZm9sbG93ZWQgYnkgdGhlICAgICAgICAgICAgICAgICAgICAtLT4KKyAgPCEtLSAiL1dFQi1JTkYvd2ViLnhtbCIgZGVwbG95bWVudCBkZXNjcmlwdG9yIGZyb20geW91ciBvd24gICAgICAgICAgICAgICAtLT4KKyAgPCEtLSBhcHBsaWNhdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKyAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKyAgPCEtLSBXQVJOSU5HOiAgRG8gbm90IGNvbmZpZ3VyZSBhcHBsaWNhdGlvbi1zcGVjaWZpYyByZXNvdXJjZXMgaGVyZSEgICAgICAtLT4KKyAgPCEtLSBUaGV5IHNob3VsZCBnbyBpbiB0aGUgIi9XRUItSU5GL3dlYi54bWwiIGZpbGUgaW4geW91ciBhcHBsaWNhdGlvbi4gICAtLT4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09IEJ1aWx0IEluIFNlcnZsZXQgRGVmaW5pdGlvbnMgPT09PT09PT09PT09PT09PT09PT0gLS0+CisKKworICA8IS0tIFRoZSBkZWZhdWx0IHNlcnZsZXQgZm9yIGFsbCB3ZWIgYXBwbGljYXRpb25zLCB0aGF0IHNlcnZlcyBzdGF0aWMgICAgIC0tPgorICA8IS0tIHJlc291cmNlcy4gIEl0IHByb2Nlc3NlcyBhbGwgcmVxdWVzdHMgdGhhdCBhcmUgbm90IG1hcHBlZCB0byBvdGhlciAgIC0tPgorICA8IS0tIHNlcnZsZXRzIHdpdGggc2VydmxldCBtYXBwaW5ncyAoZGVmaW5lZCBlaXRoZXIgaGVyZSBvciBpbiB5b3VyIG93biAgIC0tPgorICA8IS0tIHdlYi54bWwgZmlsZS4gIFRoaXMgc2VydmxldCBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGluaXRpYWxpemF0aW9uICAgIC0tPgorICA8IS0tIHBhcmFtZXRlcnMgKGRlZmF1bHQgdmFsdWVzIGFyZSBpbiBzcXVhcmUgYnJhY2tldHMpOiAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgZGVidWcgICAgICAgICAgICAgICBEZWJ1Z2dpbmcgZGV0YWlsIGxldmVsIGZvciBtZXNzYWdlcyBsb2dnZWQgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICBieSB0aGlzIHNlcnZsZXQuICBbMF0gICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgaW5wdXQgICAgICAgICAgICAgICBJbnB1dCBidWZmZXIgc2l6ZSAoaW4gYnl0ZXMpIHdoZW4gcmVhZGluZyAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMgdG8gYmUgc2VydmVkLiAgWzIwNDhdICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgbGlzdGluZ3MgICAgICAgICAgICBTaG91bGQgZGlyZWN0b3J5IGxpc3RpbmdzIGJlIHByb2R1Y2VkIGlmIHRoZXJlIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICBpcyBubyB3ZWxjb21lIGZpbGUgaW4gdGhpcyBkaXJlY3Rvcnk/ICBbdHJ1ZV0gIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgb3V0cHV0ICAgICAgICAgICAgICBPdXRwdXQgYnVmZmVyIHNpemUgKGluIGJ5dGVzKSB3aGVuIHdyaXRpbmcgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMgdG8gYmUgc2VydmVkLiAgWzIwNDhdICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgcmVhZG9ubHkgICAgICAgICAgICBJcyB0aGlzIGNvbnRleHQgInJlYWQgb25seSIsIHNvIEhUVFAgICAgICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kcyBsaWtlIFBVVCBhbmQgREVMRVRFIGFyZSAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICByZWplY3RlZD8gIFt0cnVlXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgcmVhZG1lRmlsZSAgICAgICAgICBGaWxlIG5hbWUgdG8gZGlzcGxheSB3aXRoIHRoZSBkaXJlY3RvcnkgICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50cy4gW251bGxdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICBGb3IgZGlyZWN0b3J5IGxpc3RpbmcgY3VzdG9taXphdGlvbi4gQ2hlY2tzIGxvY2FsWHNsdEZpbGUsIHRoZW4gICAgIC0tPgorICA8IS0tICBnbG9iYWxYc2x0RmlsZSwgdGhlbiBkZWZhdWx0cyB0byBvcmlnaW5hbCBiZWhhdmlvci4gICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgbG9jYWxYc2x0RmlsZSAgICAgICBNYWtlIGRpcmVjdG9yeSBsaXN0aW5ncyBhbiBYTUwgZG9jIGFuZCAgICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICBwYXNzIHRoZSByZXN1bHQgdG8gdGhpcyBzdHlsZSBzaGVldCByZXNpZGluZyAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGF0IGRpcmVjdG9yeS4gVGhpcyBvdmVycmlkZXMgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsWHNsdEZpbGVbbnVsbF0gICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgZ2xvYmFsWHNsdEZpbGUgICAgICBTaXRlIHdpZGUgY29uZmlndXJhdGlvbiB2ZXJzaW9uIG9mICAgICAgICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFhzbHRGaWxlIFRoaXMgYXJndW1lbnQgaXMgZXhwZWN0ZWQgICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICB0byBiZSBhIHBoeXNpY2FsIGZpbGUuIFtudWxsXSAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+ZGVmYXVsdDwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLmNhdGFsaW5hLnNlcnZsZXRzLkRlZmF1bHRTZXJ2bGV0PC9zZXJ2bGV0LWNsYXNzPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmRlYnVnPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPjA8L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+bGlzdGluZ3M8L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+CisgICAgPC9zZXJ2bGV0PgorCisKKyAgPCEtLSBUaGUgImludm9rZXIiIHNlcnZsZXQsIHdoaWNoIGV4ZWN1dGVzIGFub255bW91cyBzZXJ2bGV0IGNsYXNzZXMgICAgICAtLT4KKyAgPCEtLSB0aGF0IGhhdmUgbm90IGJlZW4gZGVmaW5lZCBpbiBhIHdlYi54bWwgZmlsZS4gIFRyYWRpdGlvbmFsbHksIHRoaXMgICAtLT4KKyAgPCEtLSBzZXJ2bGV0IGlzIG1hcHBlZCB0byB0aGUgVVJMIHBhdHRlcm4gIi9zZXJ2bGV0LyoiLCBidXQgeW91IGNhbiBtYXAgICAtLT4KKyAgPCEtLSBpdCB0byBvdGhlciBwYXR0ZXJucyBhcyB3ZWxsLiAgVGhlIGV4dHJhIHBhdGggaW5mbyBwb3J0aW9uIG9mIHN1Y2ggYSAtLT4KKyAgPCEtLSByZXF1ZXN0IG11c3QgYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIGEgSmF2YSBjbGFzcyB0aGF0ICAtLT4KKyAgPCEtLSBpbXBsZW1lbnRzIFNlcnZsZXQgKG9yIGV4dGVuZHMgSHR0cFNlcnZsZXQpLCBvciB0aGUgc2VydmxldCBuYW1lICAgICAtLT4KKyAgPCEtLSBvZiBhbiBleGlzdGluZyBzZXJ2bGV0IGRlZmluaXRpb24uICAgICBUaGlzIHNlcnZsZXQgc3VwcG9ydHMgdGhlICAgICAtLT4KKyAgPCEtLSBmb2xsb3dpbmcgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycyAoZGVmYXVsdCB2YWx1ZXMgYXJlIGluIHNxdWFyZSAgICAtLT4KKyAgPCEtLSBicmFja2V0cyk6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKyAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKyAgPCEtLSAgIGRlYnVnICAgICAgICAgICAgICAgRGVidWdnaW5nIGRldGFpbCBsZXZlbCBmb3IgbWVzc2FnZXMgbG9nZ2VkICAgICAtLT4KKyAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgYnkgdGhpcyBzZXJ2bGV0LiAgWzBdICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKworPCEtLQorICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPmludm9rZXI8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+CisgICAgICAgICAgb3JnLmFwYWNoZS5jYXRhbGluYS5zZXJ2bGV0cy5JbnZva2VyU2VydmxldAorICAgICAgICA8L3NlcnZsZXQtY2xhc3M+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+ZGVidWc8L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+MDwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4yPC9sb2FkLW9uLXN0YXJ0dXA+CisgICAgPC9zZXJ2bGV0PgorLS0+CisKKworICA8IS0tIFRoZSBKU1AgcGFnZSBjb21waWxlciBhbmQgZXhlY3V0aW9uIHNlcnZsZXQsIHdoaWNoIGlzIHRoZSBtZWNoYW5pc20gIC0tPgorICA8IS0tIHVzZWQgYnkgVG9tY2F0IHRvIHN1cHBvcnQgSlNQIHBhZ2VzLiAgVHJhZGl0aW9uYWxseSwgdGhpcyBzZXJ2bGV0ICAgIC0tPgorICA8IS0tIGlzIG1hcHBlZCB0byB0aGUgVVJMIHBhdHRlcm4gIiouanNwIi4gIFRoaXMgc2VydmxldCBzdXBwb3J0cyB0aGUgICAgIC0tPgorICA8IS0tIGZvbGxvd2luZyBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzIChkZWZhdWx0IHZhbHVlcyBhcmUgaW4gc3F1YXJlICAgIC0tPgorICA8IS0tIGJyYWNrZXRzKTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgY2hlY2tJbnRlcnZhbCAgICAgICBJZiBkZXZlbG9wbWVudCBpcyBmYWxzZSBhbmQgcmVsb2FkaW5nIGlzIHRydWUsIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kIGNvbXBpbGVzIGFyZSBlbmFibGVkLiBjaGVja0ludGVydmFsIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICBpcyB0aGUgdGltZSBpbiBzZWNvbmRzIGJldHdlZW4gY2hlY2tzIHRvIHNlZSAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICBpZiBhIEpTUCBwYWdlIG5lZWRzIHRvIGJlIHJlY29tcGlsZWQuIFszMDBdICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgY29tcGlsZXIgICAgICAgICAgICBXaGljaCBjb21waWxlciBBbnQgc2hvdWxkIHVzZSB0byBjb21waWxlIEpTUCAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICBwYWdlcy4gIFNlZSB0aGUgQW50IGRvY3VtZW50YXRpb24gZm9yIG1vcmUgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1hdGlvbi4gW2phdmFjXSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgY2xhc3NkZWJ1Z2luZm8gICAgICBTaG91bGQgdGhlIGNsYXNzIGZpbGUgYmUgY29tcGlsZWQgd2l0aCAgICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24/ICBbdHJ1ZV0gICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgY2xhc3NwYXRoICAgICAgICAgICBXaGF0IGNsYXNzIHBhdGggc2hvdWxkIEkgdXNlIHdoaWxlIGNvbXBpbGluZyAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWQgc2VydmxldHM/ICBbQ3JlYXRlZCBkeW5hbWljYWxseSAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICBiYXNlZCBvbiB0aGUgY3VycmVudCB3ZWIgYXBwbGljYXRpb25dICAgICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgZGV2ZWxvcG1lbnQgICAgICAgICBJcyBKYXNwZXIgdXNlZCBpbiBkZXZlbG9wbWVudCBtb2RlICh3aWxsIGNoZWNrIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICBmb3IgSlNQIG1vZGlmaWNhdGlvbiBvbiBldmVyeSBhY2Nlc3MpPyAgW3RydWVdIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgZW5hYmxlUG9vbGluZyAgICAgICBEZXRlcm1pbmVzIHdoZXRoZXIgdGFnIGhhbmRsZXIgcG9vbGluZyBpcyAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkICBbdHJ1ZV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgZm9yayAgICAgICAgICAgICAgICBUZWxsIEFudCB0byBmb3JrIGNvbXBpbGVzIG9mIEpTUCBwYWdlcyBzbyB0aGF0IC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICBhIHNlcGFyYXRlIEpWTSBpcyB1c2VkIGZvciBKU1AgcGFnZSBjb21waWxlcyAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHRoZSBvbmUgVG9tY2F0IGlzIHJ1bm5pbmcgaW4uIFt0cnVlXSAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgaWVDbGFzc0lkICAgICAgICAgICBUaGUgY2xhc3MtaWQgdmFsdWUgdG8gYmUgc2VudCB0byBJbnRlcm5ldCAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICBFeHBsb3JlciB3aGVuIHVzaW5nIDxqc3A6cGx1Z2luPiB0YWdzLiAgICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICBbY2xzaWQ6OEFEOUM4NDAtMDQ0RS0xMUQxLUIzRTktMDA4MDVGNDk5RDkzXSAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgamF2YUVuY29kaW5nICAgICAgICBKYXZhIGZpbGUgZW5jb2RpbmcgdG8gdXNlIGZvciBnZW5lcmF0aW5nIGphdmEgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UgZmlsZXMuIFtVVEY4XSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAga2VlcGdlbmVyYXRlZCAgICAgICBTaG91bGQgd2Uga2VlcCB0aGUgZ2VuZXJhdGVkIEphdmEgc291cmNlIGNvZGUgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICBmb3IgZWFjaCBwYWdlIGluc3RlYWQgb2YgZGVsZXRpbmcgaXQ/IFt0cnVlXSAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgbWFwcGVkZmlsZSAgICAgICAgICBTaG91bGQgd2UgZ2VuZXJhdGUgc3RhdGljIGNvbnRlbnQgd2l0aCBvbmUgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICBwcmludCBzdGF0ZW1lbnQgcGVyIGlucHV0IGxpbmUsIHRvIGVhc2UgICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z2dpbmc/ICBbdHJ1ZV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgdHJpbVNwYWNlcyAgICAgICAgICBTaG91bGQgd2hpdGUgc3BhY2VzIGluIHRlbXBsYXRlIHRleHQgYmV0d2VlbiAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25zIG9yIGRpcmVjdGl2ZXMgYmUgdHJpbW1lZD8gIFtmYWxzZV0gICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgcmVsb2FkaW5nICAgICAgICAgICBTaG91bGQgSmFzcGVyIGNoZWNrIGZvciBtb2RpZmllZCBKU1BzPyBbZmFsc2VdIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgc3VwcHJlc3NTbWFwICAgICAgICBTaG91bGQgdGhlIGdlbmVyYXRpb24gb2YgU01BUCBpbmZvIGZvciBKU1I0NSAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z2dpbmcgYmUgc3VwcHJlc3NlZD8gIFtmYWxzZV0gICAgICAgICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgZHVtcFNtYXAgICAgICAgICAgICBTaG91bGQgdGhlIFNNQVAgaW5mbyBmb3IgSlNSNDUgZGVidWdnaW5nIGJlICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICBkdW1wZWQgdG8gYSBmaWxlPyBbZmFsc2VdICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICBGYWxzZSBpZiBzdXBwcmVzc1NtYXAgaXMgdHJ1ZSAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgZ2VuU3RyQXNDaGFyQXJyYXkgICBTaG91bGQgdGV4dCBzdHJpbmdzIGJlIGdlbmVyYXRlZCBhcyBjaGFyICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICBhcnJheXMsIHRvIGltcHJvdmUgcGVyZm9ybWFuY2UgaW4gc29tZSBjYXNlcz8gIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICBbZmFsc2VdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgZXJyb3JPblVzZUJlYW5JbnZhbGlkQ2xhc3NBdHRyaWJ1dGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICBTaG91bGQgSmFzcGVyIGlzc3VlIGFuIGVycm9yIHdoZW4gdGhlIHZhbHVlIG9mIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICB0aGUgY2xhc3MgYXR0cmlidXRlIGluIGFuIHVzZUJlYW4gYWN0aW9uIGlzICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICBub3QgYSB2YWxpZCBiZWFuIGNsYXNzPyAgW3RydWVdICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgc2NyYXRjaGRpciAgICAgICAgICBXaGF0IHNjcmF0Y2ggZGlyZWN0b3J5IHNob3VsZCB3ZSB1c2Ugd2hlbiAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICBjb21waWxpbmcgSlNQIHBhZ2VzPyAgW2RlZmF1bHQgd29yayBkaXJlY3RvcnkgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICBmb3IgdGhlIGN1cnJlbnQgd2ViIGFwcGxpY2F0aW9uXSAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgeHBvd2VyZWRCeSAgICAgICAgICBEZXRlcm1pbmVzIHdoZXRoZXIgWC1Qb3dlcmVkLUJ5IHJlc3BvbnNlICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXIgaXMgYWRkZWQgYnkgZ2VuZXJhdGVkIHNlcnZsZXQgIFtmYWxzZV0gIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tIElmIHlvdSB3aXNoIHRvIHVzZSBKaWtlcyB0byBjb21waWxlIEpTUCBwYWdlczogICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgU2V0IHRoZSBpbml0IHBhcmFtZXRlciAiY29tcGlsZXIiIHRvICJqaWtlcyIuICBEZWZpbmUgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgdGhlIHByb3BlcnR5ICItRGJ1aWxkLmNvbXBpbGVyLmVtYWNzPXRydWUiIHdoZW4gc3RhcnRpbmcgVG9tY2F0ICAgIC0tPgorICA8IS0tICAgYnkgYWRkaW5nIHRoZSBhYm92ZSB0byB5b3VyIENBVEFMSU5BX09QVFMgZW52aXJvbm1lbnQgdmFyaWFibGUuICAgIC0tPgorICA8IS0tICAgSWYgeW91IGdldCBhbiBlcnJvciByZXBvcnRpbmcgdGhhdCBqaWtlcyBjYW4ndCB1c2UgVVRGOCBlbmNvZGluZywgIC0tPgorICA8IS0tICAgdHJ5IHNldHRpbmcgdGhlIGluaXQgcGFyYW1ldGVyICJqYXZhRW5jb2RpbmciIHRvICJJU08tODg1OS0xIi4gICAgIC0tPgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+anNwPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUuamFzcGVyLnNlcnZsZXQuSnNwU2VydmxldDwvc2VydmxldC1jbGFzcz4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5mb3JrPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPmZhbHNlPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPnhwb3dlcmVkQnk8L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+ZmFsc2U8L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MzwvbG9hZC1vbi1zdGFydHVwPgorICAgIDwvc2VydmxldD4KKworCisgIDwhLS0gU2VydmVyIFNpZGUgSW5jbHVkZXMgcHJvY2Vzc2luZyBzZXJ2bGV0LCB3aGljaCBwcm9jZXNzZXMgU1NJICAgICAgICAgLS0+CisgIDwhLS0gZGlyZWN0aXZlcyBpbiBIVE1MIHBhZ2VzIGNvbnNpc3RlbnQgd2l0aCBzaW1pbGFyIHN1cHBvcnQgaW4gd2ViICAgICAgLS0+CisgIDwhLS0gc2VydmVycyBsaWtlIEFwYWNoZS4gIFRyYWRpdGlvbmFsbHksIHRoaXMgc2VydmxldCBpcyBtYXBwZWQgdG8gdGhlICAgLS0+CisgIDwhLS0gVVJMIHBhdHRlcm4gIiouc2h0bWwiLiAgVGhpcyBzZXJ2bGV0IHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgICAgICAgICAgLS0+CisgIDwhLS0gaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycyAoZGVmYXVsdCB2YWx1ZXMgYXJlIGluIHNxdWFyZSBicmFja2V0cyk6ICAgLS0+CisgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisgIDwhLS0gICBidWZmZXJlZCAgICAgICAgICAgIFNob3VsZCBvdXRwdXQgZnJvbSB0aGlzIHNlcnZsZXQgYmUgYnVmZmVyZWQ/ICAgLS0+CisgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICgwPWZhbHNlLCAxPXRydWUpICBbMF0gICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisgIDwhLS0gICBkZWJ1ZyAgICAgICAgICAgICAgIERlYnVnZ2luZyBkZXRhaWwgbGV2ZWwgZm9yIG1lc3NhZ2VzIGxvZ2dlZCAgICAgLS0+CisgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgIGJ5IHRoaXMgc2VydmxldC4gIFswXSAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisgIDwhLS0gICBleHBpcmVzICAgICAgICAgICAgIFRoZSBudW1iZXIgb2Ygc2Vjb25kcyBiZWZvcmUgYSBwYWdlIHdpdGggU1NJICAgLS0+CisgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGl2ZXMgd2lsbCBleHBpcmUuICBbTm8gZGVmYXVsdF0gICAgICAgICAgLS0+CisgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisgIDwhLS0gICBpc1ZpcnR1YWxXZWJhcHBSZWxhdGl2ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgIFNob3VsZCAidmlydHVhbCIgcGF0aHMgYmUgaW50ZXJwcmV0ZWQgYXMgICAgICAgLS0+CisgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlIHRvIHRoZSBjb250ZXh0IHJvb3QsIGluc3RlYWQgb2YgICAgICAgLS0+CisgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgIHRoZSBzZXJ2ZXIgcm9vdD8gICgwPWZhbHNlLCAxPXRydWUpIFswXSAgICAgICAgLS0+CisgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisgIDwhLS0gSU1QT1JUQU5UOiBUbyB1c2UgdGhlIFNTSSBzZXJ2bGV0LCB5b3UgYWxzbyBuZWVkIHRvIHJlbmFtZSB0aGUgICAgICAgLS0+CisgIDwhLS0gICAgICAgICAgICAkQ0FUQUxJTkFfSE9NRS9zZXJ2ZXIvbGliL3NlcnZsZXRzLXNzaS5yZW5hbWV0b2phciBmaWxlICAgLS0+CisgIDwhLS0gICAgICAgICAgICB0byAkQ0FUQUxJTkFfSE9NRS9zZXJ2ZXIvbGliL3NlcnZsZXRzLXNzaS5qYXIgICAgICAgICAgICAgLS0+CisKKzwhLS0KKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5zc2k8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+CisgICAgICAgICAgb3JnLmFwYWNoZS5jYXRhbGluYS5zc2kuU1NJU2VydmxldAorICAgICAgICA8L3NlcnZsZXQtY2xhc3M+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgIDxwYXJhbS1uYW1lPmJ1ZmZlcmVkPC9wYXJhbS1uYW1lPgorICAgICAgICAgIDxwYXJhbS12YWx1ZT4xPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICA8cGFyYW0tbmFtZT5kZWJ1ZzwvcGFyYW0tbmFtZT4KKyAgICAgICAgICA8cGFyYW0tdmFsdWU+MDwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgPHBhcmFtLW5hbWU+ZXhwaXJlczwvcGFyYW0tbmFtZT4KKyAgICAgICAgICA8cGFyYW0tdmFsdWU+NjY2PC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICA8cGFyYW0tbmFtZT5pc1ZpcnR1YWxXZWJhcHBSZWxhdGl2ZTwvcGFyYW0tbmFtZT4KKyAgICAgICAgICA8cGFyYW0tdmFsdWU+MDwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICAgICAgPGxvYWQtb24tc3RhcnR1cD40PC9sb2FkLW9uLXN0YXJ0dXA+CisgICAgPC9zZXJ2bGV0PgorLS0+CisKKworICA8IS0tIENvbW1vbiBHYXRld2F5IEluY2x1ZGVzIChDR0kpIHByb2Nlc3Npbmcgc2VydmxldCwgd2hpY2ggc3VwcG9ydHMgICAgIC0tPgorICA8IS0tIGV4ZWN1dGlvbiBvZiBleHRlcm5hbCBhcHBsaWNhdGlvbnMgdGhhdCBjb25mb3JtIHRvIHRoZSBDR0kgc3BlYyAgICAgIC0tPgorICA8IS0tIHJlcXVpcmVtZW50cy4gIFR5cGljYWxseSwgdGhpcyBzZXJ2bGV0IGlzIG1hcHBlZCB0byB0aGUgVVJMIHBhdHRlcm4gIC0tPgorICA8IS0tICIvY2dpLWJpbi8qIiwgd2hpY2ggbWVhbnMgdGhhdCBhbnkgQ0dJIGFwcGxpY2F0aW9ucyB0aGF0IGFyZSAgICAgICAgIC0tPgorICA8IS0tIGV4ZWN1dGVkIG11c3QgYmUgcHJlc2VudCB3aXRoaW4gdGhlIHdlYiBhcHBsaWNhdGlvbi4gIFRoaXMgc2VydmxldCAgIC0tPgorICA8IS0tIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycyAoZGVmYXVsdCB2YWx1ZXMgICAgIC0tPgorICA8IS0tIGFyZSBpbiBzcXVhcmUgYnJhY2tldHMpOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgY2dpUGF0aFByZWZpeCAgICAgICAgVGhlIENHSSBzZWFyY2ggcGF0aCB3aWxsIHN0YXJ0IGF0ICAgICAgICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgd2ViQXBwUm9vdERpciArIEZpbGUuc2VwYXJhdG9yICsgdGhpcyBwcmVmaXguIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgW1dFQi1JTkYvY2dpXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgZGVidWcgICAgICAgICAgICAgICAgRGVidWdnaW5nIGRldGFpbCBsZXZlbCBmb3IgbWVzc2FnZXMgbG9nZ2VkICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgYnkgdGhpcyBzZXJ2bGV0LiAgWzBdICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgZXhlY3V0YWJsZSAgICAgICAgICAgTmFtZSBvZiB0aGUgZXhlY3R1YWJsZSB1c2VkIHRvIHJ1biB0aGUgICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0LiBbcGVybF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgcGFyYW1ldGVyRW5jb2RpbmcgICAgTmFtZSBvZiBwYXJhbWV0ZXIgZW5jb2RpbmcgdG8gYmUgdXNlZCB3aXRoICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgQ0dJIHNlcnZsZXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgW1N5c3RlbS5nZXRQcm9wZXJ0eSgiZmlsZS5lbmNvZGluZyIsIlVURi04IildIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tICAgcGFzc1NoZWxsRW52aXJvbm1lbnQgU2hvdWxkIHRoZSBzaGVsbCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgKGlmICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgYW55KSBiZSBwYXNzZWQgdG8gdGhlIENHSSBzY3JpcHQ/IFtmYWxzZV0gICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tIElNUE9SVEFOVDogVG8gdXNlIHRoZSBDR0kgc2VydmxldCwgeW91IGFsc28gbmVlZCB0byByZW5hbWUgdGhlICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgJENBVEFMSU5BX0hPTUUvc2VydmVyL2xpYi9zZXJ2bGV0cy1jZ2kucmVuYW1ldG9qYXIgZmlsZSAgIC0tPgorICA8IS0tICAgICAgICAgICAgdG8gJENBVEFMSU5BX0hPTUUvc2VydmVyL2xpYi9zZXJ2bGV0cy1jZ2kuamFyICAgICAgICAgICAgIC0tPgorCis8IS0tCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+Y2dpPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUuY2F0YWxpbmEuc2VydmxldHMuQ0dJU2VydmxldDwvc2VydmxldC1jbGFzcz4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgPHBhcmFtLW5hbWU+ZGVidWc8L3BhcmFtLW5hbWU+CisgICAgICAgICAgPHBhcmFtLXZhbHVlPjY8L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgIDxwYXJhbS1uYW1lPmNnaVBhdGhQcmVmaXg8L3BhcmFtLW5hbWU+CisgICAgICAgICAgPHBhcmFtLXZhbHVlPldFQi1JTkYvY2dpPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgICAgICAgPGxvYWQtb24tc3RhcnR1cD41PC9sb2FkLW9uLXN0YXJ0dXA+CisgICAgPC9zZXJ2bGV0PgorLS0+CisKKworICA8IS0tID09PT09PT09PT09PT09PT0gQnVpbHQgSW4gU2VydmxldCBNYXBwaW5ncyA9PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCisKKyAgPCEtLSBUaGUgc2VydmxldCBtYXBwaW5ncyBmb3IgdGhlIGJ1aWx0IGluIHNlcnZsZXRzIGRlZmluZWQgYWJvdmUuICBOb3RlICAtLT4KKyAgPCEtLSB0aGF0LCBieSBkZWZhdWx0LCB0aGUgQ0dJIGFuZCBTU0kgc2VydmxldHMgYXJlICpub3QqIG1hcHBlZC4gIFlvdSAgICAtLT4KKyAgPCEtLSBtdXN0IHVuY29tbWVudCB0aGVzZSBtYXBwaW5ncyAob3IgYWRkIHRoZW0gdG8geW91ciBhcHBsaWNhdGlvbidzIG93biAtLT4KKyAgPCEtLSB3ZWIueG1sIGRlcGxveW1lbnQgZGVzY3JpcHRvcikgdG8gZW5hYmxlIHRoZXNlIHNlcnZpY2VzICAgICAgICAgICAgICAtLT4KKworICAgIDwhLS0gVGhlIG1hcHBpbmcgZm9yIHRoZSBkZWZhdWx0IHNlcnZsZXQgLS0+CisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5kZWZhdWx0PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDwhLS0gVGhlIG1hcHBpbmcgZm9yIHRoZSBpbnZva2VyIHNlcnZsZXQgLS0+Cis8IS0tCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5pbnZva2VyPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vc2VydmxldC8qPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKy0tPgorCisgICAgPCEtLSBUaGUgbWFwcGluZyBmb3IgdGhlIEpTUCBzZXJ2bGV0IC0tPgorICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+anNwPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4qLmpzcDwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPmpzcDwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+Ki5qc3B4PC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDwhLS0gVGhlIG1hcHBpbmcgZm9yIHRoZSBTU0kgc2VydmxldCAtLT4KKzwhLS0KKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPnNzaTwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+Ki5zaHRtbDwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CistLT4KKworICAgIDwhLS0gVGhlIG1hcHBpbmcgZm9yIHRoZSBDR0kgR2F0ZXdheSBzZXJ2bGV0IC0tPgorCis8IS0tCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5jZ2k8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9jZ2ktYmluLyo8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorLS0+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09IERlZmF1bHQgU2Vzc2lvbiBDb25maWd1cmF0aW9uID09PT09PT09PT09PT09PT09IC0tPgorICA8IS0tIFlvdSBjYW4gc2V0IHRoZSBkZWZhdWx0IHNlc3Npb24gdGltZW91dCAoaW4gbWludXRlcykgZm9yIGFsbCBuZXdseSAgIC0tPgorICA8IS0tIGNyZWF0ZWQgc2Vzc2lvbnMgYnkgbW9kaWZ5aW5nIHRoZSB2YWx1ZSBiZWxvdy4gICAgICAgICAgICAgICAgICAgICAgIC0tPgorCisgICAgPHNlc3Npb24tY29uZmlnPgorICAgICAgICA8c2Vzc2lvbi10aW1lb3V0PjMwPC9zZXNzaW9uLXRpbWVvdXQ+CisgICAgPC9zZXNzaW9uLWNvbmZpZz4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09IERlZmF1bHQgTUlNRSBUeXBlIE1hcHBpbmdzID09PT09PT09PT09PT09PT09PT0gLS0+CisgIDwhLS0gV2hlbiBzZXJ2aW5nIHN0YXRpYyByZXNvdXJjZXMsIFRvbWNhdCB3aWxsIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgICAgLS0+CisgIDwhLS0gYSAiQ29udGVudC1UeXBlIiBoZWFkZXIgYmFzZWQgb24gdGhlIHJlc291cmNlJ3MgZmlsZW5hbWUgZXh0ZW5zaW9uLCAgLS0+CisgIDwhLS0gYmFzZWQgb24gdGhlc2UgbWFwcGluZ3MuICBBZGRpdGlvbmFsIG1hcHBpbmdzIGNhbiBiZSBhZGRlZCBoZXJlICh0byAgLS0+CisgIDwhLS0gYXBwbHkgdG8gYWxsIHdlYiBhcHBsaWNhdGlvbnMpLCBvciBpbiB5b3VyIG93biBhcHBsaWNhdGlvbidzIHdlYi54bWwgLS0+CisgIDwhLS0gZGVwbG95bWVudCBkZXNjcmlwdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisKKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPmFiczwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPmF1ZGlvL3gtbXBlZzwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDxleHRlbnNpb24+YWk8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5hcHBsaWNhdGlvbi9wb3N0c2NyaXB0PC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5haWY8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5hdWRpby94LWFpZmY8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPmFpZmM8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5hdWRpby94LWFpZmY8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPmFpZmY8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5hdWRpby94LWFpZmY8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPmFpbTwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPmFwcGxpY2F0aW9uL3gtYWltPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5hcnQ8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5pbWFnZS94LWpnPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5hc2Y8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT52aWRlby94LW1zLWFzZjwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDxleHRlbnNpb24+YXN4PC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+dmlkZW8veC1tcy1hc2Y8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPmF1PC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+YXVkaW8vYmFzaWM8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPmF2aTwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPnZpZGVvL3gtbXN2aWRlbzwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDxleHRlbnNpb24+YXZ4PC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+dmlkZW8veC1yYWQtc2NyZWVucGxheTwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDxleHRlbnNpb24+YmNwaW88L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5hcHBsaWNhdGlvbi94LWJjcGlvPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5iaW48L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5hcHBsaWNhdGlvbi9vY3RldC1zdHJlYW08L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPmJtcDwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPmltYWdlL2JtcDwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDxleHRlbnNpb24+Ym9keTwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPnRleHQvaHRtbDwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDxleHRlbnNpb24+Y2RmPC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+YXBwbGljYXRpb24veC1jZGY8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPmNlcjwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPmFwcGxpY2F0aW9uL3gteDUwOS1jYS1jZXJ0PC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5jbGFzczwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPmFwcGxpY2F0aW9uL2phdmE8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPmNwaW88L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5hcHBsaWNhdGlvbi94LWNwaW88L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPmNzaDwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPmFwcGxpY2F0aW9uL3gtY3NoPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5jc3M8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT50ZXh0L2NzczwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDxleHRlbnNpb24+ZGliPC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+aW1hZ2UvYm1wPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5kb2M8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5hcHBsaWNhdGlvbi9tc3dvcmQ8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPmR0ZDwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPnRleHQvcGxhaW48L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPmR2PC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+dmlkZW8veC1kdjwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDxleHRlbnNpb24+ZHZpPC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+YXBwbGljYXRpb24veC1kdmk8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPmVwczwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPmFwcGxpY2F0aW9uL3Bvc3RzY3JpcHQ8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPmV0eDwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPnRleHQveC1zZXRleHQ8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPmV4ZTwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPmFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbTwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDxleHRlbnNpb24+Z2lmPC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+aW1hZ2UvZ2lmPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5ndGFyPC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+YXBwbGljYXRpb24veC1ndGFyPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5nejwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPmFwcGxpY2F0aW9uL3gtZ3ppcDwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDxleHRlbnNpb24+aGRmPC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+YXBwbGljYXRpb24veC1oZGY8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPmhxeDwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPmFwcGxpY2F0aW9uL21hYy1iaW5oZXg0MDwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDxleHRlbnNpb24+aHRjPC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+dGV4dC94LWNvbXBvbmVudDwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDxleHRlbnNpb24+aHRtPC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+dGV4dC9odG1sPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5odG1sPC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+dGV4dC9odG1sPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5ocXg8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5hcHBsaWNhdGlvbi9tYWMtYmluaGV4NDA8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPmllZjwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPmltYWdlL2llZjwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDxleHRlbnNpb24+amFkPC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+dGV4dC92bmQuc3VuLmoybWUuYXBwLWRlc2NyaXB0b3I8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPmphcjwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPmFwcGxpY2F0aW9uL2phdmEtYXJjaGl2ZTwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDxleHRlbnNpb24+amF2YTwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPnRleHQvcGxhaW48L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPmpubHA8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5hcHBsaWNhdGlvbi94LWphdmEtam5scC1maWxlPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5qcGU8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5pbWFnZS9qcGVnPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5qcGVnPC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+aW1hZ2UvanBlZzwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDxleHRlbnNpb24+anBnPC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+aW1hZ2UvanBlZzwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDxleHRlbnNpb24+anM8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT50ZXh0L2phdmFzY3JpcHQ8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPmpzZjwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPnRleHQvcGxhaW48L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPmpzcGY8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT50ZXh0L3BsYWluPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5rYXI8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5hdWRpby94LW1pZGk8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPmxhdGV4PC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+YXBwbGljYXRpb24veC1sYXRleDwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDxleHRlbnNpb24+bTN1PC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+YXVkaW8veC1tcGVndXJsPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5tYWM8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5pbWFnZS94LW1hY3BhaW50PC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5tYW48L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5hcHBsaWNhdGlvbi94LXRyb2ZmLW1hbjwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDxleHRlbnNpb24+bWU8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5hcHBsaWNhdGlvbi94LXRyb2ZmLW1lPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5taWQ8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5hdWRpby94LW1pZGk8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPm1pZGk8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5hdWRpby94LW1pZGk8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPm1pZjwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPmFwcGxpY2F0aW9uL3gtbWlmPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5tb3Y8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT52aWRlby9xdWlja3RpbWU8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPm1vdmllPC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+dmlkZW8veC1zZ2ktbW92aWU8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPm1wMTwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPmF1ZGlvL3gtbXBlZzwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDxleHRlbnNpb24+bXAyPC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+YXVkaW8veC1tcGVnPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5tcDM8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5hdWRpby94LW1wZWc8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPm1wYTwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPmF1ZGlvL3gtbXBlZzwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDxleHRlbnNpb24+bXBlPC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+dmlkZW8vbXBlZzwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDxleHRlbnNpb24+bXBlZzwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPnZpZGVvL21wZWc8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPm1wZWdhPC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+YXVkaW8veC1tcGVnPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5tcGc8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT52aWRlby9tcGVnPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5tcHYyPC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+dmlkZW8vbXBlZzI8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPm1zPC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+YXBwbGljYXRpb24veC13YWlzLXNvdXJjZTwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDxleHRlbnNpb24+bmM8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5hcHBsaWNhdGlvbi94LW5ldGNkZjwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDxleHRlbnNpb24+b2RhPC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+YXBwbGljYXRpb24vb2RhPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5wYm08L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5pbWFnZS94LXBvcnRhYmxlLWJpdG1hcDwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDxleHRlbnNpb24+cGN0PC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+aW1hZ2UvcGljdDwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDxleHRlbnNpb24+cGRmPC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+YXBwbGljYXRpb24vcGRmPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5wZ208L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5pbWFnZS94LXBvcnRhYmxlLWdyYXltYXA8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPnBpYzwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPmltYWdlL3BpY3Q8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPnBpY3Q8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5pbWFnZS9waWN0PC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5wbHM8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5hdWRpby94LXNjcGxzPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5wbmc8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5pbWFnZS9wbmc8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPnBubTwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPmltYWdlL3gtcG9ydGFibGUtYW55bWFwPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5wbnQ8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5pbWFnZS94LW1hY3BhaW50PC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5wcG08L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5pbWFnZS94LXBvcnRhYmxlLXBpeG1hcDwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDxleHRlbnNpb24+cHB0PC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+YXBwbGljYXRpb24vcG93ZXJwb2ludDwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDxleHRlbnNpb24+cHM8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5hcHBsaWNhdGlvbi9wb3N0c2NyaXB0PC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5wc2Q8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5pbWFnZS94LXBob3Rvc2hvcDwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDxleHRlbnNpb24+cXQ8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT52aWRlby9xdWlja3RpbWU8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPnF0aTwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPmltYWdlL3gtcXVpY2t0aW1lPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5xdGlmPC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+aW1hZ2UveC1xdWlja3RpbWU8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPnJhczwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPmltYWdlL3gtY211LXJhc3RlcjwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDxleHRlbnNpb24+cmdiPC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+aW1hZ2UveC1yZ2I8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPnJtPC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+YXBwbGljYXRpb24vdm5kLnJuLXJlYWxtZWRpYTwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDxleHRlbnNpb24+cm9mZjwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPmFwcGxpY2F0aW9uL3gtdHJvZmY8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPnJ0ZjwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPmFwcGxpY2F0aW9uL3J0ZjwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDxleHRlbnNpb24+cnR4PC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+dGV4dC9yaWNodGV4dDwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDxleHRlbnNpb24+c2g8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5hcHBsaWNhdGlvbi94LXNoPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5zaGFyPC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+YXBwbGljYXRpb24veC1zaGFyPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5zbWY8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5hdWRpby94LW1pZGk8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPnNpdDwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPmFwcGxpY2F0aW9uL3gtc3R1ZmZpdDwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDxleHRlbnNpb24+c25kPC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+YXVkaW8vYmFzaWM8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPnNyYzwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPmFwcGxpY2F0aW9uL3gtd2Fpcy1zb3VyY2U8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPnN2NGNwaW88L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5hcHBsaWNhdGlvbi94LXN2NGNwaW88L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPnN2NGNyYzwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPmFwcGxpY2F0aW9uL3gtc3Y0Y3JjPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5zd2Y8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5hcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaDwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDxleHRlbnNpb24+dDwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPmFwcGxpY2F0aW9uL3gtdHJvZmY8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPnRhcjwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPmFwcGxpY2F0aW9uL3gtdGFyPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj50Y2w8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5hcHBsaWNhdGlvbi94LXRjbDwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDxleHRlbnNpb24+dGV4PC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+YXBwbGljYXRpb24veC10ZXg8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPnRleGk8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5hcHBsaWNhdGlvbi94LXRleGluZm88L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPnRleGluZm88L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5hcHBsaWNhdGlvbi94LXRleGluZm88L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPnRpZjwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPmltYWdlL3RpZmY8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPnRpZmY8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5pbWFnZS90aWZmPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj50cjwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPmFwcGxpY2F0aW9uL3gtdHJvZmY8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPnRzdjwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPnRleHQvdGFiLXNlcGFyYXRlZC12YWx1ZXM8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPnR4dDwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPnRleHQvcGxhaW48L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPnVsdzwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPmF1ZGlvL2Jhc2ljPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj51c3RhcjwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPmFwcGxpY2F0aW9uL3gtdXN0YXI8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPnhibTwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPmltYWdlL3gteGJpdG1hcDwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDxleHRlbnNpb24+eGh0PC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+YXBwbGljYXRpb24veGh0bWw8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPnhodG1sPC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+YXBwbGljYXRpb24veGh0bWw8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPnhtbDwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPnRleHQveG1sPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj54cG08L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5pbWFnZS94LXhwaXhtYXA8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPnhzbDwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPnRleHQveG1sPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj54d2Q8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5pbWFnZS94LXh3aW5kb3dkdW1wPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj53YXY8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5hdWRpby94LXdhdjwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDxleHRlbnNpb24+c3ZnPC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+aW1hZ2Uvc3ZnPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj5zdmd6PC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+aW1hZ2Uvc3ZnPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj52c2Q8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5hcHBsaWNhdGlvbi94LXZpc2lvPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPCEtLSBXaXJlbGVzcyBCaXRtYXAgLS0+CisgICAgICAgIDxleHRlbnNpb24+d2JtcDwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPmltYWdlL3ZuZC53YXAud2JtcDwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDwhLS0gV01MIFNvdXJjZSAtLT4KKyAgICAgICAgPGV4dGVuc2lvbj53bWw8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT50ZXh0L3ZuZC53YXAud21sPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPCEtLSBDb21waWxlZCBXTUwgLS0+CisgICAgICAgIDxleHRlbnNpb24+d21sYzwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPmFwcGxpY2F0aW9uL3ZuZC53YXAud21sYzwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDwhLS0gV01MIFNjcmlwdCBTb3VyY2UgLS0+CisgICAgICAgIDxleHRlbnNpb24+d21sczwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPnRleHQvdm5kLndhcC53bWxzY3JpcHQ8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8IS0tIENvbXBpbGVkIFdNTCBTY3JpcHQgLS0+CisgICAgICAgIDxleHRlbnNpb24+d21sc2NyaXB0YzwvZXh0ZW5zaW9uPgorICAgICAgICA8bWltZS10eXBlPmFwcGxpY2F0aW9uL3ZuZC53YXAud21sc2NyaXB0YzwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDxleHRlbnNpb24+d3JsPC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+eC13b3JsZC94LXZybWw8L21pbWUtdHlwZT4KKyAgICA8L21pbWUtbWFwcGluZz4KKyAgICA8bWltZS1tYXBwaW5nPgorICAgICAgICA8ZXh0ZW5zaW9uPlo8L2V4dGVuc2lvbj4KKyAgICAgICAgPG1pbWUtdHlwZT5hcHBsaWNhdGlvbi94LWNvbXByZXNzPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisgICAgPG1pbWUtbWFwcGluZz4KKyAgICAgICAgPGV4dGVuc2lvbj56PC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+YXBwbGljYXRpb24veC1jb21wcmVzczwvbWltZS10eXBlPgorICAgIDwvbWltZS1tYXBwaW5nPgorICAgIDxtaW1lLW1hcHBpbmc+CisgICAgICAgIDxleHRlbnNpb24+emlwPC9leHRlbnNpb24+CisgICAgICAgIDxtaW1lLXR5cGU+YXBwbGljYXRpb24vemlwPC9taW1lLXR5cGU+CisgICAgPC9taW1lLW1hcHBpbmc+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09IERlZmF1bHQgV2VsY29tZSBGaWxlIExpc3QgPT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8IS0tIFdoZW4gYSByZXF1ZXN0IFVSSSByZWZlcnMgdG8gYSBkaXJlY3RvcnksIHRoZSBkZWZhdWx0IHNlcnZsZXQgbG9va3MgIC0tPgorICA8IS0tIGZvciBhICJ3ZWxjb21lIGZpbGUiIHdpdGhpbiB0aGF0IGRpcmVjdG9yeSBhbmQsIGlmIHByZXNlbnQsICAgICAgICAgIC0tPgorICA8IS0tIHRvIHRoZSBjb3JyZXNwb25kaW5nIHJlc291cmNlIFVSSSBmb3IgZGlzcGxheS4gIElmIG5vIHdlbGNvbWUgZmlsZSAgIC0tPgorICA8IS0tIGlzIHByZXNlbnQsIHRoZSBkZWZhdWx0IHNlcnZsZXQgZWl0aGVyIHNlcnZlcyBhIGRpcmVjdG9yeSBsaXN0aW5nLCAgIC0tPgorICA8IS0tIG9yIHJldHVybnMgYSA0MDQgc3RhdHVzLCBkZXBlbmRpbmcgb24gaG93IGl0IGlzIGNvbmZpZ3VyZWQuICAgICAgICAgIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tIElmIHlvdSBkZWZpbmUgd2VsY29tZSBmaWxlcyBpbiB5b3VyIG93biBhcHBsaWNhdGlvbidzIHdlYi54bWwgICAgICAgIC0tPgorICA8IS0tIGRlcGxveW1lbnQgZGVzY3JpcHRvciwgdGhhdCBsaXN0ICpyZXBsYWNlcyogdGhlIGxpc3QgY29uZmlndXJlZCAgICAgIC0tPgorICA8IS0tIGhlcmUsIHNvIGJlIHN1cmUgdGhhdCB5b3UgaW5jbHVkZSBhbnkgb2YgdGhlIGRlZmF1bHQgdmFsdWVzIHRoYXQgICAgIC0tPgorICA8IS0tIHlvdSB3aXNoIHRvIGluY2x1ZGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorCisgICAgPHdlbGNvbWUtZmlsZS1saXN0PgorICAgICAgICA8d2VsY29tZS1maWxlPmluZGV4Lmh0bWw8L3dlbGNvbWUtZmlsZT4KKyAgICAgICAgPHdlbGNvbWUtZmlsZT5pbmRleC5odG08L3dlbGNvbWUtZmlsZT4KKyAgICAgICAgPHdlbGNvbWUtZmlsZT5pbmRleC5qc3A8L3dlbGNvbWUtZmlsZT4KKyAgICA8L3dlbGNvbWUtZmlsZS1saXN0PgorCis8L3dlYi1hcHA+CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvQXV0aGVudGljYXRvci5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL0F1dGhlbnRpY2F0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2I1NmRjCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL0F1dGhlbnRpY2F0b3IuamF2YQpAQCAtMCwwICsxLDM1IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hOworCisKKy8qKgorICogQW4gPGI+QXV0aGVudGljYXRvcjwvYj4gaXMgYSBjb21wb25lbnQgKHVzdWFsbHkgYSBWYWx2ZSBvciBDb250YWluZXIpIHRoYXQKKyAqIHByb3ZpZGVzIHNvbWUgc29ydCBvZiBhdXRoZW50aWNhdGlvbiBzZXJ2aWNlLiAgVGhlIGludGVyZmFjZSBpdHNlbGYgaGFzIG5vCisgKiBmdW5jdGlvbmFsIHNpZ25pZmljYW5jZSwgIGJ1dCBpcyB1c2VkIGFzIGEgdGFnZ2luZyBtZWNoYW5pc20gc28gdGhhdCBvdGhlcgorICogY29tcG9uZW50cyBjYW4gZGV0ZWN0IHRoZSBwcmVzZW5jZSAodmlhIGFuICJpbnN0YW5jZW9mIEF1dGhlbnRpY2F0b3IiIHRlc3QpCisgKiBvZiBhbiBhbHJlYWR5IGNvbmZpZ3VyZWQgYXV0aGVudGljYXRpb24gc2VydmljZS4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGludGVyZmFjZSBBdXRoZW50aWNhdG9yIHsKKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvQ2x1c3Rlci5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL0NsdXN0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzAwYWE0Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL0NsdXN0ZXIuamF2YQpAQCAtMCwwICsxLDE2MyBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmE7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKKy8qKgorICogQSA8Yj5DbHVzdGVyPC9iPiB3b3JrcyBhcyBhIENsdXN0ZXIgY2xpZW50L3NlcnZlciBmb3IgdGhlIGxvY2FsIGhvc3QKKyAqIERpZmZlcmVudCBDbHVzdGVyIGltcGxlbWVudGF0aW9ucyBjYW4gYmUgdXNlZCB0byBzdXBwb3J0IGRpZmZlcmVudAorICogd2F5cyB0byBjb21tdW5pY2F0ZSB3aXRoaW4gdGhlIENsdXN0ZXIuIEEgQ2x1c3RlciBpbXBsZW1lbnRhdGlvbiBpcworICogcmVzcG9uc2libGUgZm9yIHNldHRpbmcgdXAgYSB3YXkgdG8gY29tbXVuaWNhdGUgd2l0aGluIHRoZSBDbHVzdGVyCisgKiBhbmQgYWxzbyBzdXBwbHkgIkNsaWVudEFwcGxpY2F0aW9ucyIgd2l0aCA8Y29kZT5DbHVzdGVyU2VuZGVyPC9jb2RlPgorICogdXNlZCB3aGVuIHNlbmRpbmcgaW5mb3JtYXRpb24gaW4gdGhlIENsdXN0ZXIgYW5kCisgKiA8Y29kZT5DbHVzdGVySW5mbzwvY29kZT4gdXNlZCBmb3IgcmVjZWl2aW5nIGluZm9ybWF0aW9uIGluIHRoZSBDbHVzdGVyLgorICoKKyAqIEBhdXRob3IgQmlwIFRoZWxpbgorICogQGF1dGhvciBSZW15IE1hdWNoZXJhdAorICogQGF1dGhvciBGaWxpcCBIYW5paworICogQHZlcnNpb24gJFJldmlzaW9uJCwgJERhdGUkCisgKi8KKworcHVibGljIGludGVyZmFjZSBDbHVzdGVyIHsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisgICAgLyoqCisgICAgICogUmV0dXJuIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgQ2x1c3RlciBpbXBsZW1lbnRhdGlvbiBhbmQKKyAgICAgKiB0aGUgY29ycmVzcG9uZGluZyB2ZXJzaW9uIG51bWJlciwgaW4gdGhlIGZvcm1hdAorICAgICAqIDxjb2RlPiZsdDtkZXNjcmlwdGlvbiZndDsvJmx0O3ZlcnNpb24mZ3Q7PC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEluZm8oKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgY2x1c3RlciB0aGF0IHRoaXMgU2VydmVyIGlzIGN1cnJlbnRseQorICAgICAqIGNvbmZpZ3VyZWQgdG8gb3BlcmF0ZSB3aXRoaW4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBuYW1lIG9mIHRoZSBjbHVzdGVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNlcnZlcgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2x1c3Rlck5hbWUoKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbmFtZSBvZiB0aGUgY2x1c3RlciB0byBqb2luLCBpZiBubyBjbHVzdGVyIHdpdGgKKyAgICAgKiB0aGlzIG5hbWUgaXMgcHJlc2VudCBjcmVhdGUgb25lLgorICAgICAqCisgICAgICogQHBhcmFtIGNsdXN0ZXJOYW1lIFRoZSBjbHVzdGVybmFtZSB0byBqb2luCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2x1c3Rlck5hbWUoU3RyaW5nIGNsdXN0ZXJOYW1lKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgQ29udGFpbmVyIGFzc29jaWF0ZWQgd2l0aCBvdXIgQ2x1c3RlcgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRhaW5lciBUaGUgQ29udGFpbmVyIHRvIHVzZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbnRhaW5lcihDb250YWluZXIgY29udGFpbmVyKTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgQ29udGFpbmVyIGFzc29jaWF0ZWQgd2l0aCBvdXIgQ2x1c3RlcgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgQ29udGFpbmVyIGFzc29jaWF0ZWQgd2l0aCBvdXIgQ2x1c3RlcgorICAgICAqLworICAgIHB1YmxpYyBDb250YWluZXIgZ2V0Q29udGFpbmVyKCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHByb3RvY29sIHBhcmFtZXRlcnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvdG9jb2wgVGhlIHByb3RvY29sIHVzZWQgYnkgdGhlIGNsdXN0ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcm90b2NvbChTdHJpbmcgcHJvdG9jb2wpOworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBwcm90b2NvbCB1c2VkIGJ5IHRoZSBjbHVzdGVyLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgcHJvdG9jb2wKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFByb3RvY29sKCk7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBtYW5hZ2VyIHdoaWNoIHdpbGwgdXNlIHRoaXMgY2x1c3RlciB0byByZXBsaWNhdGUgaXRzCisgICAgICogc2Vzc2lvbnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIChrZXkpIG9mIHRoZSBhcHBsaWNhdGlvbiB3aXRoIHdoaWNoIHRoZSBtYW5hZ2VyIGlzCisgICAgICogYXNzb2NpYXRlZAorICAgICAqLworICAgIHB1YmxpYyBNYW5hZ2VyIGNyZWF0ZU1hbmFnZXIoU3RyaW5nIG5hbWUpOworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENsdXN0ZXIgV2lkZSBEZXBsb3ltZW50cworICAgIC8qKgorICAgICAqIFN0YXJ0IGFuIGV4aXN0aW5nIHdlYiBhcHBsaWNhdGlvbiwgYXR0YWNoZWQgdG8gdGhlIHNwZWNpZmllZCBjb250ZXh0CisgICAgICogcGF0aCBpbiBhbGwgdGhlIG90aGVyIG5vZGVzIGluIHRoZSBjbHVzdGVyLgorICAgICAqIE9ubHkgc3RhcnRzIGEgd2ViIGFwcGxpY2F0aW9uIGlmIGl0IGlzIG5vdCBydW5uaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHRQYXRoIFRoZSBjb250ZXh0IHBhdGggb2YgdGhlIGFwcGxpY2F0aW9uIHRvIGJlIHN0YXJ0ZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBzcGVjaWZpZWQgY29udGV4dCBwYXRoCisgICAgICogIGlzIG1hbGZvcm1lZCAoaXQgbXVzdCBiZSAiIiBvciBzdGFydCB3aXRoIGEgc2xhc2gpCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHNwZWNpZmllZCBjb250ZXh0IHBhdGggZG9lcworICAgICAqICBub3QgaWRlbnRpZnkgYSBjdXJyZW50bHkgaW5zdGFsbGVkIHdlYiBhcHBsaWNhdGlvbgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycyBkdXJpbmcKKyAgICAgKiAgc3RhcnR1cAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0Q29udGV4dChTdHJpbmcgY29udGV4dFBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworCisgICAgLyoqCisgICAgICogSW5zdGFsbCBhIG5ldyB3ZWIgYXBwbGljYXRpb24sIHdob3NlIHdlYiBhcHBsaWNhdGlvbiBhcmNoaXZlIGlzIGF0IHRoZQorICAgICAqIHNwZWNpZmllZCBVUkwsIGludG8gdGhpcyBjb250YWluZXIgd2l0aCB0aGUgc3BlY2lmaWVkIGNvbnRleHQgcGF0aC4KKyAgICAgKiBBIGNvbnRleHQgcGF0aCBvZiAiIiAodGhlIGVtcHR5IHN0cmluZykgc2hvdWxkIGJlIHVzZWQgZm9yIHRoZSByb290CisgICAgICogYXBwbGljYXRpb24gZm9yIHRoaXMgY29udGFpbmVyLiAgT3RoZXJ3aXNlLCB0aGUgY29udGV4dCBwYXRoIG11c3QKKyAgICAgKiBzdGFydCB3aXRoIGEgc2xhc2guCisgICAgICogPHA+CisgICAgICogSWYgdGhpcyBhcHBsaWNhdGlvbiBpcyBzdWNjZXNzZnVsbHkgaW5zdGFsbGVkLCBhIENvbnRhaW5lckV2ZW50IG9mIHR5cGUKKyAgICAgKiA8Y29kZT5QUkVfSU5TVEFMTF9FVkVOVDwvY29kZT4gd2lsbCBiZSBzZW50IHRvIHJlZ2lzdGVyZWQgbGlzdGVuZXJzCisgICAgICogYmVmb3JlIHRoZSBhc3NvY2lhdGVkIENvbnRleHQgaXMgc3RhcnRlZCwgYW5kIGEgQ29udGFpbmVyRXZlbnQgb2YgdHlwZQorICAgICAqIDxjb2RlPklOU1RBTExfRVZFTlQ8L2NvZGU+IHdpbGwgYmUgc2VudCB0byBhbGwgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMKKyAgICAgKiBhZnRlciB0aGUgYXNzb2NpYXRlZCBDb250ZXh0IGlzIHN0YXJ0ZWQsIHdpdGggdGhlIG5ld2x5IGNyZWF0ZWQKKyAgICAgKiA8Y29kZT5Db250ZXh0PC9jb2RlPiBhcyBhbiBhcmd1bWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0UGF0aCBUaGUgY29udGV4dCBwYXRoIHRvIHdoaWNoIHRoaXMgYXBwbGljYXRpb24gc2hvdWxkCisgICAgICogIGJlIGluc3RhbGxlZCAobXVzdCBiZSB1bmlxdWUpCisgICAgICogQHBhcmFtIHdhciBBIFVSTCBvZiB0eXBlICJqYXI6IiB0aGF0IHBvaW50cyB0byBhIFdBUiBmaWxlLCBvciB0eXBlCisgICAgICogICJmaWxlOiIgdGhhdCBwb2ludHMgdG8gYW4gdW5wYWNrZWQgZGlyZWN0b3J5IHN0cnVjdHVyZSBjb250YWluaW5nCisgICAgICogIHRoZSB3ZWIgYXBwbGljYXRpb24gdG8gYmUgaW5zdGFsbGVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgc3BlY2lmaWVkIGNvbnRleHQgcGF0aAorICAgICAqICBpcyBtYWxmb3JtZWQgKGl0IG11c3QgYmUgIiIgb3Igc3RhcnQgd2l0aCBhIHNsYXNoKQorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSBzcGVjaWZpZWQgY29udGV4dCBwYXRoCisgICAgICogIGlzIGFscmVhZHkgYXR0YWNoZWQgdG8gYW4gZXhpc3Rpbmcgd2ViIGFwcGxpY2F0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgaW5zdGFsbENvbnRleHQoU3RyaW5nIGNvbnRleHRQYXRoLCBVUkwgd2FyKTsKKworICAgIC8qKgorICAgICAqIFN0b3AgYW4gZXhpc3Rpbmcgd2ViIGFwcGxpY2F0aW9uLCBhdHRhY2hlZCB0byB0aGUgc3BlY2lmaWVkIGNvbnRleHQKKyAgICAgKiBwYXRoLiAgT25seSBzdG9wcyBhIHdlYiBhcHBsaWNhdGlvbiBpZiBpdCBpcyBydW5uaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHRQYXRoIFRoZSBjb250ZXh0IHBhdGggb2YgdGhlIGFwcGxpY2F0aW9uIHRvIGJlIHN0b3BwZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBzcGVjaWZpZWQgY29udGV4dCBwYXRoCisgICAgICogIGlzIG1hbGZvcm1lZCAoaXQgbXVzdCBiZSAiIiBvciBzdGFydCB3aXRoIGEgc2xhc2gpCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHNwZWNpZmllZCBjb250ZXh0IHBhdGggZG9lcworICAgICAqICBub3QgaWRlbnRpZnkgYSBjdXJyZW50bHkgaW5zdGFsbGVkIHdlYiBhcHBsaWNhdGlvbgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycyB3aGlsZSBzdG9wcGluZworICAgICAqICB0aGUgd2ViIGFwcGxpY2F0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcChTdHJpbmcgY29udGV4dFBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvQ29udGFpbmVkLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvQ29udGFpbmVkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY3NmI2NQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9Db250YWluZWQuamF2YQpAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IDE5OTktMjAwMSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmE7CisKKworLyoqCisgKiA8cD5EZWNvdXBsaW5nIGludGVyZmFjZSB3aGljaCBzcGVjaWZpZXMgdGhhdCBhbiBpbXBsZW1lbnRpbmcgY2xhc3MgaXMKKyAqIGFzc29jaWF0ZWQgd2l0aCBhdCBtb3N0IG9uZSA8c3Ryb25nPkNvbnRhaW5lcjwvc3Ryb25nPiBpbnN0YW5jZS48L3A+CisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAYXV0aG9yIFBldGVyIERvbmFsZAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgaW50ZXJmYWNlIENvbnRhaW5lZCB7CisKKworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIDxjb2RlPkNvbnRhaW5lcjwvY29kZT4gd2l0aCB3aGljaCB0aGlzIGluc3RhbmNlIGlzIGFzc29jaWF0ZWQKKyAgICAgKiAoaWYgYW55KTsgb3RoZXJ3aXNlIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29udGFpbmVyIGdldENvbnRhaW5lcigpOworCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIDxjb2RlPkNvbnRhaW5lcjwvY29kZT4gd2l0aCB3aGljaCB0aGlzIGluc3RhbmNlIGlzIGFzc29jaWF0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBDb250YWluZXIgaW5zdGFuY2Ugd2l0aCB3aGljaCB0aGlzIGluc3RhbmNlIGlzIHRvCisgICAgICogIGJlIGFzc29jaWF0ZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvIGRpc2Fzc29jaWF0ZSB0aGlzIGluc3RhbmNlCisgICAgICogIGZyb20gYW55IENvbnRhaW5lcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbnRhaW5lcihDb250YWluZXIgY29udGFpbmVyKTsKKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvQ29udGFpbmVyLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvQ29udGFpbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYxNDRiYwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9Db250YWluZXIuamF2YQpAQCAtMCwwICsxLDQ0MiBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYTsKKworCitpbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm5hbWluZy5kaXJlY3RvcnkuRGlyQ29udGV4dDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3Rvci5SZXF1ZXN0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLlJlc3BvbnNlOworCisKKy8qKgorICogQSA8Yj5Db250YWluZXI8L2I+IGlzIGFuIG9iamVjdCB0aGF0IGNhbiBleGVjdXRlIHJlcXVlc3RzIHJlY2VpdmVkIGZyb20KKyAqIGEgY2xpZW50LCBhbmQgcmV0dXJuIHJlc3BvbnNlcyBiYXNlZCBvbiB0aG9zZSByZXF1ZXN0cy4gIEEgQ29udGFpbmVyIG1heQorICogb3B0aW9uYWxseSBzdXBwb3J0IGEgcGlwZWxpbmUgb2YgVmFsdmVzIHRoYXQgcHJvY2VzcyB0aGUgcmVxdWVzdCBpbiBhbgorICogb3JkZXIgY29uZmlndXJlZCBhdCBydW50aW1lLCBieSBpbXBsZW1lbnRpbmcgdGhlIDxiPlBpcGVsaW5lPC9iPiBpbnRlcmZhY2UKKyAqIGFzIHdlbGwuCisgKiA8cD4KKyAqIENvbnRhaW5lcnMgd2lsbCBleGlzdCBhdCBzZXZlcmFsIGNvbmNlcHR1YWwgbGV2ZWxzIHdpdGhpbiBDYXRhbGluYS4gIFRoZQorICogZm9sbG93aW5nIGV4YW1wbGVzIHJlcHJlc2VudCBjb21tb24gY2FzZXM6CisgKiA8dWw+CisgKiA8bGk+PGI+RW5naW5lPC9iPiAtIFJlcHJlc2VudGF0aW9uIG9mIHRoZSBlbnRpcmUgQ2F0YWxpbmEgc2VydmxldCBlbmdpbmUsCisgKiAgICAgbW9zdCBsaWtlbHkgY29udGFpbmluZyBvbmUgb3IgbW9yZSBzdWJjb250YWluZXJzIHRoYXQgYXJlIGVpdGhlciBIb3N0CisgKiAgICAgb3IgQ29udGV4dCBpbXBsZW1lbnRhdGlvbnMsIG9yIG90aGVyIGN1c3RvbSBncm91cHMuCisgKiA8bGk+PGI+SG9zdDwvYj4gLSBSZXByZXNlbnRhdGlvbiBvZiBhIHZpcnR1YWwgaG9zdCBjb250YWluaW5nIGEgbnVtYmVyCisgKiAgICAgb2YgQ29udGV4dHMuCisgKiA8bGk+PGI+Q29udGV4dDwvYj4gLSBSZXByZXNlbnRhdGlvbiBvZiBhIHNpbmdsZSBTZXJ2bGV0Q29udGV4dCwgd2hpY2ggd2lsbAorICogICAgIHR5cGljYWxseSBjb250YWluIG9uZSBvciBtb3JlIFdyYXBwZXJzIGZvciB0aGUgc3VwcG9ydGVkIHNlcnZsZXRzLgorICogPGxpPjxiPldyYXBwZXI8L2I+IC0gUmVwcmVzZW50YXRpb24gb2YgYW4gaW5kaXZpZHVhbCBzZXJ2bGV0IGRlZmluaXRpb24KKyAqICAgICAod2hpY2ggbWF5IHN1cHBvcnQgbXVsdGlwbGUgc2VydmxldCBpbnN0YW5jZXMgaWYgdGhlIHNlcnZsZXQgaXRzZWxmCisgKiAgICAgaW1wbGVtZW50cyBTaW5nbGVUaHJlYWRNb2RlbCkuCisgKiA8L3VsPgorICogQSBnaXZlbiBkZXBsb3ltZW50IG9mIENhdGFsaW5hIG5lZWQgbm90IGluY2x1ZGUgQ29udGFpbmVycyBhdCBhbGwgb2YgdGhlCisgKiBsZXZlbHMgZGVzY3JpYmVkIGFib3ZlLiAgRm9yIGV4YW1wbGUsIGFuIGFkbWluaXN0cmF0aW9uIGFwcGxpY2F0aW9uCisgKiBlbWJlZGRlZCB3aXRoaW4gYSBuZXR3b3JrIGRldmljZSAoc3VjaCBhcyBhIHJvdXRlcikgbWlnaHQgb25seSBjb250YWluCisgKiBhIHNpbmdsZSBDb250ZXh0IGFuZCBhIGZldyBXcmFwcGVycywgb3IgZXZlbiBhIHNpbmdsZSBXcmFwcGVyIGlmIHRoZQorICogYXBwbGljYXRpb24gaXMgcmVsYXRpdmVseSBzbWFsbC4gIFRoZXJlZm9yZSwgQ29udGFpbmVyIGltcGxlbWVudGF0aW9ucworICogbmVlZCB0byBiZSBkZXNpZ25lZCBzbyB0aGF0IHRoZXkgd2lsbCBvcGVyYXRlIGNvcnJlY3RseSBpbiB0aGUgYWJzZW5jZQorICogb2YgcGFyZW50IENvbnRhaW5lcnMgaW4gYSBnaXZlbiBkZXBsb3ltZW50LgorICogPHA+CisgKiBBIENvbnRhaW5lciBtYXkgYWxzbyBiZSBhc3NvY2lhdGVkIHdpdGggYSBudW1iZXIgb2Ygc3VwcG9ydCBjb21wb25lbnRzCisgKiB0aGF0IHByb3ZpZGUgZnVuY3Rpb25hbGl0eSB3aGljaCBtaWdodCBiZSBzaGFyZWQgKGJ5IGF0dGFjaGluZyBpdCB0byBhCisgKiBwYXJlbnQgQ29udGFpbmVyKSBvciBpbmRpdmlkdWFsbHkgY3VzdG9taXplZC4gIFRoZSBmb2xsb3dpbmcgc3VwcG9ydAorICogY29tcG9uZW50cyBhcmUgY3VycmVudGx5IHJlY29nbml6ZWQ6CisgKiA8dWw+CisgKiA8bGk+PGI+TG9hZGVyPC9iPiAtIENsYXNzIGxvYWRlciB0byB1c2UgZm9yIGludGVncmF0aW5nIG5ldyBKYXZhIGNsYXNzZXMKKyAqICAgICBmb3IgdGhpcyBDb250YWluZXIgaW50byB0aGUgSlZNIGluIHdoaWNoIENhdGFsaW5hIGlzIHJ1bm5pbmcuCisgKiA8bGk+PGI+TG9nZ2VyPC9iPiAtIEltcGxlbWVudGF0aW9uIG9mIHRoZSA8Y29kZT5sb2coKTwvY29kZT4gbWV0aG9kCisgKiAgICAgc2lnbmF0dXJlcyBvZiB0aGUgPGNvZGU+U2VydmxldENvbnRleHQ8L2NvZGU+IGludGVyZmFjZS4KKyAqIDxsaT48Yj5NYW5hZ2VyPC9iPiAtIE1hbmFnZXIgZm9yIHRoZSBwb29sIG9mIFNlc3Npb25zIGFzc29jaWF0ZWQgd2l0aAorICogICAgIHRoaXMgQ29udGFpbmVyLgorICogPGxpPjxiPlJlYWxtPC9iPiAtIFJlYWQtb25seSBpbnRlcmZhY2UgdG8gYSBzZWN1cml0eSBkb21haW4sIGZvcgorICogICAgIGF1dGhlbnRpY2F0aW5nIHVzZXIgaWRlbnRpdGllcyBhbmQgdGhlaXIgY29ycmVzcG9uZGluZyByb2xlcy4KKyAqIDxsaT48Yj5SZXNvdXJjZXM8L2I+IC0gSk5ESSBkaXJlY3RvcnkgY29udGV4dCBlbmFibGluZyBhY2Nlc3MgdG8gc3RhdGljCisgKiAgICAgcmVzb3VyY2VzLCBlbmFibGluZyBjdXN0b20gbGlua2FnZXMgdG8gZXhpc3Rpbmcgc2VydmVyIGNvbXBvbmVudHMgd2hlbgorICogICAgIENhdGFsaW5hIGlzIGVtYmVkZGVkIGluIGEgbGFyZ2VyIHNlcnZlci4KKyAqIDwvdWw+CisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAYXV0aG9yIFJlbXkgTWF1Y2hlcmF0CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBpbnRlcmZhY2UgQ29udGFpbmVyIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTWFuaWZlc3QgQ29uc3RhbnRzCisKKworICAgIC8qKgorICAgICAqIFRoZSBDb250YWluZXJFdmVudCBldmVudCB0eXBlIHNlbnQgd2hlbiBhIGNoaWxkIGNvbnRhaW5lciBpcyBhZGRlZAorICAgICAqIGJ5IDxjb2RlPmFkZENoaWxkKCk8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFERF9DSElMRF9FVkVOVCA9ICJhZGRDaGlsZCI7CisKKworICAgIC8qKgorICAgICAqIFRoZSBDb250YWluZXJFdmVudCBldmVudCB0eXBlIHNlbnQgd2hlbiBhIE1hcHBlciBpcyBhZGRlZAorICAgICAqIGJ5IDxjb2RlPmFkZE1hcHBlcigpPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERfTUFQUEVSX0VWRU5UID0gImFkZE1hcHBlciI7CisKKworICAgIC8qKgorICAgICAqIFRoZSBDb250YWluZXJFdmVudCBldmVudCB0eXBlIHNlbnQgd2hlbiBhIHZhbHZlIGlzIGFkZGVkCisgICAgICogYnkgPGNvZGU+YWRkVmFsdmUoKTwvY29kZT4sIGlmIHRoaXMgQ29udGFpbmVyIHN1cHBvcnRzIHBpcGVsaW5lcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERfVkFMVkVfRVZFTlQgPSAiYWRkVmFsdmUiOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgQ29udGFpbmVyRXZlbnQgZXZlbnQgdHlwZSBzZW50IHdoZW4gYSBjaGlsZCBjb250YWluZXIgaXMgcmVtb3ZlZAorICAgICAqIGJ5IDxjb2RlPnJlbW92ZUNoaWxkKCk8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTU9WRV9DSElMRF9FVkVOVCA9ICJyZW1vdmVDaGlsZCI7CisKKworICAgIC8qKgorICAgICAqIFRoZSBDb250YWluZXJFdmVudCBldmVudCB0eXBlIHNlbnQgd2hlbiBhIE1hcHBlciBpcyByZW1vdmVkCisgICAgICogYnkgPGNvZGU+cmVtb3ZlTWFwcGVyKCk8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTU9WRV9NQVBQRVJfRVZFTlQgPSAicmVtb3ZlTWFwcGVyIjsKKworCisgICAgLyoqCisgICAgICogVGhlIENvbnRhaW5lckV2ZW50IGV2ZW50IHR5cGUgc2VudCB3aGVuIGEgdmFsdmUgaXMgcmVtb3ZlZAorICAgICAqIGJ5IDxjb2RlPnJlbW92ZVZhbHZlKCk8L2NvZGU+LCBpZiB0aGlzIENvbnRhaW5lciBzdXBwb3J0cyBwaXBlbGluZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVNT1ZFX1ZBTFZFX0VWRU5UID0gInJlbW92ZVZhbHZlIjsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIENvbnRhaW5lciBpbXBsZW1lbnRhdGlvbiBhbmQKKyAgICAgKiB0aGUgY29ycmVzcG9uZGluZyB2ZXJzaW9uIG51bWJlciwgaW4gdGhlIGZvcm1hdAorICAgICAqIDxjb2RlPiZsdDtkZXNjcmlwdGlvbiZndDsvJmx0O3ZlcnNpb24mZ3Q7PC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEluZm8oKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBMb2FkZXIgd2l0aCB3aGljaCB0aGlzIENvbnRhaW5lciBpcyBhc3NvY2lhdGVkLiAgSWYgdGhlcmUgaXMKKyAgICAgKiBubyBhc3NvY2lhdGVkIExvYWRlciwgcmV0dXJuIHRoZSBMb2FkZXIgYXNzb2NpYXRlZCB3aXRoIG91ciBwYXJlbnQKKyAgICAgKiBDb250YWluZXIgKGlmIGFueSk7IG90aGVyd2lzZSwgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBMb2FkZXIgZ2V0TG9hZGVyKCk7CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgTG9hZGVyIHdpdGggd2hpY2ggdGhpcyBDb250YWluZXIgaXMgYXNzb2NpYXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsb2FkZXIgVGhlIG5ld2x5IGFzc29jaWF0ZWQgbG9hZGVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TG9hZGVyKExvYWRlciBsb2FkZXIpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIExvZ2dlciB3aXRoIHdoaWNoIHRoaXMgQ29udGFpbmVyIGlzIGFzc29jaWF0ZWQuICBJZiB0aGVyZSBpcworICAgICAqIG5vIGFzc29jaWF0ZWQgTG9nZ2VyLCByZXR1cm4gdGhlIExvZ2dlciBhc3NvY2lhdGVkIHdpdGggb3VyIHBhcmVudAorICAgICAqIENvbnRhaW5lciAoaWYgYW55KTsgb3RoZXJ3aXNlIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgTG9nIGdldExvZ2dlcigpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIE1hbmFnZXIgd2l0aCB3aGljaCB0aGlzIENvbnRhaW5lciBpcyBhc3NvY2lhdGVkLiAgSWYgdGhlcmUgaXMKKyAgICAgKiBubyBhc3NvY2lhdGVkIE1hbmFnZXIsIHJldHVybiB0aGUgTWFuYWdlciBhc3NvY2lhdGVkIHdpdGggb3VyIHBhcmVudAorICAgICAqIENvbnRhaW5lciAoaWYgYW55KTsgb3RoZXJ3aXNlIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWFuYWdlciBnZXRNYW5hZ2VyKCk7CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgTWFuYWdlciB3aXRoIHdoaWNoIHRoaXMgQ29udGFpbmVyIGlzIGFzc29jaWF0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFuYWdlciBUaGUgbmV3bHkgYXNzb2NpYXRlZCBNYW5hZ2VyCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWFuYWdlcihNYW5hZ2VyIG1hbmFnZXIpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYW4gb2JqZWN0IHdoaWNoIG1heSBiZSB1dGlsaXplZCBmb3IgbWFwcGluZyB0byB0aGlzIGNvbXBvbmVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldE1hcHBpbmdPYmplY3QoKTsKKworICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgSk1YIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29udGFpbmVyLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0T2JqZWN0TmFtZSgpOyAgICAKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgUGlwZWxpbmUgb2JqZWN0IHRoYXQgbWFuYWdlcyB0aGUgVmFsdmVzIGFzc29jaWF0ZWQgd2l0aAorICAgICAqIHRoaXMgQ29udGFpbmVyLgorICAgICAqLworICAgIHB1YmxpYyBQaXBlbGluZSBnZXRQaXBlbGluZSgpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIENsdXN0ZXIgd2l0aCB3aGljaCB0aGlzIENvbnRhaW5lciBpcyBhc3NvY2lhdGVkLiAgSWYgdGhlcmUgaXMKKyAgICAgKiBubyBhc3NvY2lhdGVkIENsdXN0ZXIsIHJldHVybiB0aGUgQ2x1c3RlciBhc3NvY2lhdGVkIHdpdGggb3VyIHBhcmVudAorICAgICAqIENvbnRhaW5lciAoaWYgYW55KTsgb3RoZXJ3aXNlIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2x1c3RlciBnZXRDbHVzdGVyKCk7CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgQ2x1c3RlciB3aXRoIHdoaWNoIHRoaXMgQ29udGFpbmVyIGlzIGFzc29jaWF0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2x1c3RlciB0aGUgQ2x1c3RlciB3aXRoIHdoaWNoIHRoaXMgQ29udGFpbmVyIGlzIGFzc29jaWF0ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2x1c3RlcihDbHVzdGVyIGNsdXN0ZXIpOworCisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGRlbGF5IGJldHdlZW4gdGhlIGludm9jYXRpb24gb2YgdGhlIGJhY2tncm91bmRQcm9jZXNzIG1ldGhvZCBvbgorICAgICAqIHRoaXMgY29udGFpbmVyIGFuZCBpdHMgY2hpbGRyZW4uIENoaWxkIGNvbnRhaW5lcnMgd2lsbCBub3QgYmUgaW52b2tlZAorICAgICAqIGlmIHRoZWlyIGRlbGF5IHZhbHVlIGlzIG5vdCBuZWdhdGl2ZSAod2hpY2ggd291bGQgbWVhbiB0aGV5IGFyZSB1c2luZyAKKyAgICAgKiB0aGVpciBvd24gdGhyZWFkKS4gU2V0dGluZyB0aGlzIHRvIGEgcG9zaXRpdmUgdmFsdWUgd2lsbCBjYXVzZSAKKyAgICAgKiBhIHRocmVhZCB0byBiZSBzcGF3bi4gQWZ0ZXIgd2FpdGluZyB0aGUgc3BlY2lmaWVkIGFtb3VudCBvZiB0aW1lLCAKKyAgICAgKiB0aGUgdGhyZWFkIHdpbGwgaW52b2tlIHRoZSBleGVjdXRlUGVyaW9kaWMgbWV0aG9kIG9uIHRoaXMgY29udGFpbmVyIAorICAgICAqIGFuZCBhbGwgaXRzIGNoaWxkcmVuLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0QmFja2dyb3VuZFByb2Nlc3NvckRlbGF5KCk7CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZGVsYXkgYmV0d2VlbiB0aGUgaW52b2NhdGlvbiBvZiB0aGUgZXhlY3V0ZSBtZXRob2Qgb24gdGhpcworICAgICAqIGNvbnRhaW5lciBhbmQgaXRzIGNoaWxkcmVuLgorICAgICAqIAorICAgICAqIEBwYXJhbSBkZWxheSBUaGUgZGVsYXkgaW4gc2Vjb25kcyBiZXR3ZWVuIHRoZSBpbnZvY2F0aW9uIG9mIAorICAgICAqICAgICAgICAgICAgICBiYWNrZ3JvdW5kUHJvY2VzcyBtZXRob2RzCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZFByb2Nlc3NvckRlbGF5KGludCBkZWxheSk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIG5hbWUgc3RyaW5nIChzdWl0YWJsZSBmb3IgdXNlIGJ5IGh1bWFucykgdGhhdCBkZXNjcmliZXMgdGhpcworICAgICAqIENvbnRhaW5lci4gIFdpdGhpbiB0aGUgc2V0IG9mIGNoaWxkIGNvbnRhaW5lcnMgYmVsb25naW5nIHRvIGEgcGFydGljdWxhcgorICAgICAqIHBhcmVudCwgQ29udGFpbmVyIG5hbWVzIG11c3QgYmUgdW5pcXVlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOworCisKKyAgICAvKioKKyAgICAgKiBTZXQgYSBuYW1lIHN0cmluZyAoc3VpdGFibGUgZm9yIHVzZSBieSBodW1hbnMpIHRoYXQgZGVzY3JpYmVzIHRoaXMKKyAgICAgKiBDb250YWluZXIuICBXaXRoaW4gdGhlIHNldCBvZiBjaGlsZCBjb250YWluZXJzIGJlbG9uZ2luZyB0byBhIHBhcnRpY3VsYXIKKyAgICAgKiBwYXJlbnQsIENvbnRhaW5lciBuYW1lcyBtdXN0IGJlIHVuaXF1ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5ldyBuYW1lIG9mIHRoaXMgY29udGFpbmVyCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGlzIENvbnRhaW5lciBoYXMgYWxyZWFkeSBiZWVuCisgICAgICogIGFkZGVkIHRvIHRoZSBjaGlsZHJlbiBvZiBhIHBhcmVudCBDb250YWluZXIgKGFmdGVyIHdoaWNoIHRoZSBuYW1lCisgICAgICogIG1heSBub3QgYmUgY2hhbmdlZCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBDb250YWluZXIgZm9yIHdoaWNoIHRoaXMgQ29udGFpbmVyIGlzIGEgY2hpbGQsIGlmIHRoZXJlIGlzCisgICAgICogb25lLiAgSWYgdGhlcmUgaXMgbm8gZGVmaW5lZCBwYXJlbnQsIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29udGFpbmVyIGdldFBhcmVudCgpOworCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHBhcmVudCBDb250YWluZXIgdG8gd2hpY2ggdGhpcyBDb250YWluZXIgaXMgYmVpbmcgYWRkZWQgYXMgYQorICAgICAqIGNoaWxkLiAgVGhpcyBDb250YWluZXIgbWF5IHJlZnVzZSB0byBiZWNvbWUgYXR0YWNoZWQgdG8gdGhlIHNwZWNpZmllZAorICAgICAqIENvbnRhaW5lciBieSB0aHJvd2luZyBhbiBleGNlcHRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGFpbmVyIENvbnRhaW5lciB0byB3aGljaCB0aGlzIENvbnRhaW5lciBpcyBiZWluZyBhZGRlZAorICAgICAqICBhcyBhIGNoaWxkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGlzIENvbnRhaW5lciByZWZ1c2VzIHRvIGJlY29tZQorICAgICAqICBhdHRhY2hlZCB0byB0aGUgc3BlY2lmaWVkIENvbnRhaW5lcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhcmVudChDb250YWluZXIgY29udGFpbmVyKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBwYXJlbnQgY2xhc3MgbG9hZGVyIChpZiBhbnkpIGZvciB3ZWIgYXBwbGljYXRpb25zLgorICAgICAqLworICAgIHB1YmxpYyBDbGFzc0xvYWRlciBnZXRQYXJlbnRDbGFzc0xvYWRlcigpOworCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHBhcmVudCBjbGFzcyBsb2FkZXIgKGlmIGFueSkgZm9yIHdlYiBhcHBsaWNhdGlvbnMuCisgICAgICogVGhpcyBjYWxsIGlzIG1lYW5pbmdmdWwgb25seSA8c3Ryb25nPmJlZm9yZTwvc3Ryb25nPiBhIExvYWRlciBoYXMKKyAgICAgKiBiZWVuIGNvbmZpZ3VyZWQsIGFuZCB0aGUgc3BlY2lmaWVkIHZhbHVlIChpZiBub24tbnVsbCkgc2hvdWxkIGJlCisgICAgICogcGFzc2VkIGFzIGFuIGFyZ3VtZW50IHRvIHRoZSBjbGFzcyBsb2FkZXIgY29uc3RydWN0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyZW50IFRoZSBuZXcgcGFyZW50IGNsYXNzIGxvYWRlcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhcmVudENsYXNzTG9hZGVyKENsYXNzTG9hZGVyIHBhcmVudCk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgUmVhbG0gd2l0aCB3aGljaCB0aGlzIENvbnRhaW5lciBpcyBhc3NvY2lhdGVkLiAgSWYgdGhlcmUgaXMKKyAgICAgKiBubyBhc3NvY2lhdGVkIFJlYWxtLCByZXR1cm4gdGhlIFJlYWxtIGFzc29jaWF0ZWQgd2l0aCBvdXIgcGFyZW50CisgICAgICogQ29udGFpbmVyIChpZiBhbnkpOyBvdGhlcndpc2UgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBSZWFsbSBnZXRSZWFsbSgpOworCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIFJlYWxtIHdpdGggd2hpY2ggdGhpcyBDb250YWluZXIgaXMgYXNzb2NpYXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWFsbSBUaGUgbmV3bHkgYXNzb2NpYXRlZCBSZWFsbQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlYWxtKFJlYWxtIHJlYWxtKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBSZXNvdXJjZXMgd2l0aCB3aGljaCB0aGlzIENvbnRhaW5lciBpcyBhc3NvY2lhdGVkLiAgSWYgdGhlcmUKKyAgICAgKiBpcyBubyBhc3NvY2lhdGVkIFJlc291cmNlcyBvYmplY3QsIHJldHVybiB0aGUgUmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aAorICAgICAqIG91ciBwYXJlbnQgQ29udGFpbmVyIChpZiBhbnkpOyBvdGhlcndpc2UgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBEaXJDb250ZXh0IGdldFJlc291cmNlcygpOworCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIFJlc291cmNlcyBvYmplY3Qgd2l0aCB3aGljaCB0aGlzIENvbnRhaW5lciBpcyBhc3NvY2lhdGVkLgorICAgICAqCisgICAgICogQHBhcmFtIHJlc291cmNlcyBUaGUgbmV3bHkgYXNzb2NpYXRlZCBSZXNvdXJjZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZXMoRGlyQ29udGV4dCByZXNvdXJjZXMpOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogRXhlY3V0ZSBhIHBlcmlvZGljIHRhc2ssIHN1Y2ggYXMgcmVsb2FkaW5nLCBldGMuIFRoaXMgbWV0aG9kIHdpbGwgYmUKKyAgICAgKiBpbnZva2VkIGluc2lkZSB0aGUgY2xhc3Nsb2FkaW5nIGNvbnRleHQgb2YgdGhpcyBjb250YWluZXIuIFVuZXhwZWN0ZWQKKyAgICAgKiB0aHJvd2FibGVzIHdpbGwgYmUgY2F1Z2h0IGFuZCBsb2dnZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYmFja2dyb3VuZFByb2Nlc3MoKTsKKworCisgICAgLyoqCisgICAgICogQWRkIGEgbmV3IGNoaWxkIENvbnRhaW5lciB0byB0aG9zZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBDb250YWluZXIsCisgICAgICogaWYgc3VwcG9ydGVkLiAgUHJpb3IgdG8gYWRkaW5nIHRoaXMgQ29udGFpbmVyIHRvIHRoZSBzZXQgb2YgY2hpbGRyZW4sCisgICAgICogdGhlIGNoaWxkJ3MgPGNvZGU+c2V0UGFyZW50KCk8L2NvZGU+IG1ldGhvZCBtdXN0IGJlIGNhbGxlZCwgd2l0aCB0aGlzCisgICAgICogQ29udGFpbmVyIGFzIGFuIGFyZ3VtZW50LiAgVGhpcyBtZXRob2QgbWF5IHRocm93biBhbgorICAgICAqIDxjb2RlPklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjwvY29kZT4gaWYgdGhpcyBDb250YWluZXIgY2hvb3NlcyBub3QKKyAgICAgKiB0byBiZSBhdHRhY2hlZCB0byB0aGUgc3BlY2lmaWVkIENvbnRhaW5lciwgaW4gd2hpY2ggY2FzZSBpdCBpcyBub3QgYWRkZWQKKyAgICAgKgorICAgICAqIEBwYXJhbSBjaGlsZCBOZXcgY2hpbGQgQ29udGFpbmVyIHRvIGJlIGFkZGVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGlzIGV4Y2VwdGlvbiBpcyB0aHJvd24gYnkKKyAgICAgKiAgdGhlIDxjb2RlPnNldFBhcmVudCgpPC9jb2RlPiBtZXRob2Qgb2YgdGhlIGNoaWxkIENvbnRhaW5lcgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBuZXcgY2hpbGQgZG9lcyBub3QgaGF2ZQorICAgICAqICBhIG5hbWUgdW5pcXVlIGZyb20gdGhhdCBvZiBleGlzdGluZyBjaGlsZHJlbiBvZiB0aGlzIENvbnRhaW5lcgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoaXMgQ29udGFpbmVyIGRvZXMgbm90IHN1cHBvcnQKKyAgICAgKiAgY2hpbGQgQ29udGFpbmVycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZENoaWxkKENvbnRhaW5lciBjaGlsZCk7CisKKworICAgIC8qKgorICAgICAqIEFkZCBhIGNvbnRhaW5lciBldmVudCBsaXN0ZW5lciB0byB0aGlzIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgdG8gYWRkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQ29udGFpbmVyTGlzdGVuZXIoQ29udGFpbmVyTGlzdGVuZXIgbGlzdGVuZXIpOworCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIgdG8gdGhpcyBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRvIGFkZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcik7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY2hpbGQgQ29udGFpbmVyLCBhc3NvY2lhdGVkIHdpdGggdGhpcyBDb250YWluZXIsIHdpdGgKKyAgICAgKiB0aGUgc3BlY2lmaWVkIG5hbWUgKGlmIGFueSk7IG90aGVyd2lzZSwgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+CisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBjaGlsZCBDb250YWluZXIgdG8gYmUgcmV0cmlldmVkCisgICAgICovCisgICAgcHVibGljIENvbnRhaW5lciBmaW5kQ2hpbGQoU3RyaW5nIG5hbWUpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNldCBvZiBjaGlsZHJlbiBDb250YWluZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIENvbnRhaW5lci4KKyAgICAgKiBJZiB0aGlzIENvbnRhaW5lciBoYXMgbm8gY2hpbGRyZW4sIGEgemVyby1sZW5ndGggYXJyYXkgaXMgcmV0dXJuZWQuCisgICAgICovCisgICAgcHVibGljIENvbnRhaW5lcltdIGZpbmRDaGlsZHJlbigpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNldCBvZiBjb250YWluZXIgbGlzdGVuZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIENvbnRhaW5lci4KKyAgICAgKiBJZiB0aGlzIENvbnRhaW5lciBoYXMgbm8gcmVnaXN0ZXJlZCBjb250YWluZXIgbGlzdGVuZXJzLCBhIHplcm8tbGVuZ3RoCisgICAgICogYXJyYXkgaXMgcmV0dXJuZWQuCisgICAgICovCisgICAgcHVibGljIENvbnRhaW5lckxpc3RlbmVyW10gZmluZENvbnRhaW5lckxpc3RlbmVycygpOworCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBzcGVjaWZpZWQgUmVxdWVzdCwgYW5kIGdlbmVyYXRlIHRoZSBjb3JyZXNwb25kaW5nIFJlc3BvbnNlLAorICAgICAqIGFjY29yZGluZyB0byB0aGUgZGVzaWduIG9mIHRoaXMgcGFydGljdWxhciBDb250YWluZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBSZXF1ZXN0IHRvIGJlIHByb2Nlc3NlZAorICAgICAqIEBwYXJhbSByZXNwb25zZSBSZXNwb25zZSB0byBiZSBwcm9kdWNlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJyZWQgd2hpbGUKKyAgICAgKiAgcHJvY2Vzc2luZworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIFNlcnZsZXRFeGNlcHRpb24gd2FzIHRocm93bgorICAgICAqICB3aGlsZSBwcm9jZXNzaW5nIHRoaXMgcmVxdWVzdAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGludm9rZShSZXF1ZXN0IHJlcXVlc3QsIFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb247CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhbiBleGlzdGluZyBjaGlsZCBDb250YWluZXIgZnJvbSBhc3NvY2lhdGlvbiB3aXRoIHRoaXMgcGFyZW50CisgICAgICogQ29udGFpbmVyLgorICAgICAqCisgICAgICogQHBhcmFtIGNoaWxkIEV4aXN0aW5nIGNoaWxkIENvbnRhaW5lciB0byBiZSByZW1vdmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlQ2hpbGQoQ29udGFpbmVyIGNoaWxkKTsKKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGEgY29udGFpbmVyIGV2ZW50IGxpc3RlbmVyIGZyb20gdGhpcyBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRvIHJlbW92ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUNvbnRhaW5lckxpc3RlbmVyKENvbnRhaW5lckxpc3RlbmVyIGxpc3RlbmVyKTsKKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGEgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyIGZyb20gdGhpcyBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRvIHJlbW92ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcik7CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL0NvbnRhaW5lckV2ZW50LmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvQ29udGFpbmVyRXZlbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGJmNTM4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL0NvbnRhaW5lckV2ZW50LmphdmEKQEAgLTAsMCArMSwxMTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmE7CisKKworaW1wb3J0IGphdmEudXRpbC5FdmVudE9iamVjdDsKKworCisvKioKKyAqIEdlbmVyYWwgZXZlbnQgZm9yIG5vdGlmeWluZyBsaXN0ZW5lcnMgb2Ygc2lnbmlmaWNhbnQgY2hhbmdlcyBvbiBhIENvbnRhaW5lci4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIENvbnRhaW5lckV2ZW50CisgICAgZXh0ZW5kcyBFdmVudE9iamVjdCB7CisKKworICAgIC8qKgorICAgICAqIFRoZSBDb250YWluZXIgb24gd2hpY2ggdGhpcyBldmVudCBvY2N1cnJlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIENvbnRhaW5lciBjb250YWluZXIgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZXZlbnQgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhpcyBldmVudC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE9iamVjdCBkYXRhID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIGV2ZW50IHR5cGUgdGhpcyBpbnN0YW5jZSByZXByZXNlbnRzLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHR5cGUgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgQ29udGFpbmVyRXZlbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGFpbmVyIENvbnRhaW5lciBvbiB3aGljaCB0aGlzIGV2ZW50IG9jY3VycmVkCisgICAgICogQHBhcmFtIHR5cGUgRXZlbnQgdHlwZQorICAgICAqIEBwYXJhbSBkYXRhIEV2ZW50IGRhdGEKKyAgICAgKi8KKyAgICBwdWJsaWMgQ29udGFpbmVyRXZlbnQoQ29udGFpbmVyIGNvbnRhaW5lciwgU3RyaW5nIHR5cGUsIE9iamVjdCBkYXRhKSB7CisKKyAgICAgICAgc3VwZXIoY29udGFpbmVyKTsKKyAgICAgICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7CisgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZXZlbnQgZGF0YSBvZiB0aGlzIGV2ZW50LgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0RGF0YSgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMuZGF0YSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgQ29udGFpbmVyIG9uIHdoaWNoIHRoaXMgZXZlbnQgb2NjdXJyZWQuCisgICAgICovCisgICAgcHVibGljIENvbnRhaW5lciBnZXRDb250YWluZXIoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLmNvbnRhaW5lcik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZXZlbnQgdHlwZSBvZiB0aGlzIGV2ZW50LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMudHlwZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGV2ZW50LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisKKyAgICAgICAgcmV0dXJuICgiQ29udGFpbmVyRXZlbnRbJyIgKyBnZXRDb250YWluZXIoKSArICInLCciICsKKyAgICAgICAgICAgICAgICBnZXRUeXBlKCkgKyAiJywnIiArIGdldERhdGEoKSArICInXSIpOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9Db250YWluZXJMaXN0ZW5lci5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL0NvbnRhaW5lckxpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ2NjliMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9Db250YWluZXJMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmE7CisKKworCisKKy8qKgorICogSW50ZXJmYWNlIGRlZmluaW5nIGEgbGlzdGVuZXIgZm9yIHNpZ25pZmljYW50IENvbnRhaW5lciBnZW5lcmF0ZWQgZXZlbnRzLgorICogTm90ZSB0aGF0ICJjb250YWluZXIgc3RhcnQiIGFuZCAiY29udGFpbmVyIHN0b3AiIGV2ZW50cyBhcmUgbm9ybWFsbHkKKyAqIExpZmVjeWNsZUV2ZW50cywgbm90IENvbnRhaW5lckV2ZW50cy4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGludGVyZmFjZSBDb250YWluZXJMaXN0ZW5lciB7CisKKworICAgIC8qKgorICAgICAqIEFja25vd2xlZGdlIHRoZSBvY2N1cnJlbmNlIG9mIHRoZSBzcGVjaWZpZWQgZXZlbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnQgQ29udGFpbmVyRXZlbnQgdGhhdCBoYXMgb2NjdXJyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjb250YWluZXJFdmVudChDb250YWluZXJFdmVudCBldmVudCk7CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL0NvbnRhaW5lclNlcnZsZXQuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9Db250YWluZXJTZXJ2bGV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBkNGFiOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9Db250YWluZXJTZXJ2bGV0LmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LTIwMDEsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hOworCisKKy8qKgorICogQSA8Yj5Db250YWluZXJTZXJ2bGV0PC9iPiBpcyBhIHNlcnZsZXQgdGhhdCBoYXMgYWNjZXNzIHRvIENhdGFsaW5hCisgKiBpbnRlcm5hbCBmdW5jdGlvbmFsaXR5LCBhbmQgaXMgbG9hZGVkIGZyb20gdGhlIENhdGFsaW5hIGNsYXNzIGxvYWRlcgorICogaW5zdGVhZCBvZiB0aGUgd2ViIGFwcGxpY2F0aW9uIGNsYXNzIGxvYWRlci4gIFRoZSBwcm9wZXJ0eSBzZXR0ZXIKKyAqIG1ldGhvZHMgbXVzdCBiZSBjYWxsZWQgYnkgdGhlIGNvbnRhaW5lciB3aGVuZXZlciBhIG5ldyBpbnN0YW5jZSBvZgorICogdGhpcyBzZXJ2bGV0IGlzIHB1dCBpbnRvIHNlcnZpY2UuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBpbnRlcmZhY2UgQ29udGFpbmVyU2VydmxldCB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIFdyYXBwZXIgd2l0aCB3aGljaCB0aGlzIFNlcnZsZXQgaXMgYXNzb2NpYXRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgV3JhcHBlciBnZXRXcmFwcGVyKCk7CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgV3JhcHBlciB3aXRoIHdoaWNoIHRoaXMgU2VydmxldCBpcyBhc3NvY2lhdGVkLgorICAgICAqCisgICAgICogQHBhcmFtIHdyYXBwZXIgVGhlIG5ldyBhc3NvY2lhdGVkIFdyYXBwZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRXcmFwcGVyKFdyYXBwZXIgd3JhcHBlcik7CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL0NvbnRleHQuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9Db250ZXh0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FmMzE1NwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9Db250ZXh0LmphdmEKQEAgLTAsMCArMSwxMDQwIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hOworCisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworCitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5odHRwLm1hcHBlci5NYXBwZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5BcHBsaWNhdGlvblBhcmFtZXRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5FcnJvclBhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuRmlsdGVyRGVmOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkZpbHRlck1hcDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5Mb2dpbkNvbmZpZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5OYW1pbmdSZXNvdXJjZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuU2VjdXJpdHlDb25zdHJhaW50OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5DaGFyc2V0TWFwcGVyOworCisKKy8qKgorICogQSA8Yj5Db250ZXh0PC9iPiBpcyBhIENvbnRhaW5lciB0aGF0IHJlcHJlc2VudHMgYSBzZXJ2bGV0IGNvbnRleHQsIGFuZAorICogdGhlcmVmb3JlIGFuIGluZGl2aWR1YWwgd2ViIGFwcGxpY2F0aW9uLCBpbiB0aGUgQ2F0YWxpbmEgc2VydmxldCBlbmdpbmUuCisgKiBJdCBpcyB0aGVyZWZvcmUgdXNlZnVsIGluIGFsbW9zdCBldmVyeSBkZXBsb3ltZW50IG9mIENhdGFsaW5hIChldmVuIGlmIGEKKyAqIENvbm5lY3RvciBhdHRhY2hlZCB0byBhIHdlYiBzZXJ2ZXIgKHN1Y2ggYXMgQXBhY2hlKSB1c2VzIHRoZSB3ZWIgc2VydmVyJ3MKKyAqIGZhY2lsaXRpZXMgdG8gaWRlbnRpZnkgdGhlIGFwcHJvcHJpYXRlIFdyYXBwZXIgdG8gaGFuZGxlIHRoaXMgcmVxdWVzdC4KKyAqIEl0IGFsc28gcHJvdmlkZXMgYSBjb252ZW5pZW50IG1lY2hhbmlzbSB0byB1c2UgSW50ZXJjZXB0b3JzIHRoYXQgc2VlCisgKiBldmVyeSByZXF1ZXN0IHByb2Nlc3NlZCBieSB0aGlzIHBhcnRpY3VsYXIgd2ViIGFwcGxpY2F0aW9uLgorICogPHA+CisgKiBUaGUgcGFyZW50IENvbnRhaW5lciBhdHRhY2hlZCB0byBhIENvbnRleHQgaXMgZ2VuZXJhbGx5IGEgSG9zdCwgYnV0IG1heQorICogYmUgc29tZSBvdGhlciBpbXBsZW1lbnRhdGlvbiwgb3IgbWF5IGJlIG9taXR0ZWQgaWYgaXQgaXMgbm90IG5lY2Vzc2FyeS4KKyAqIDxwPgorICogVGhlIGNoaWxkIGNvbnRhaW5lcnMgYXR0YWNoZWQgdG8gYSBDb250ZXh0IGFyZSBnZW5lcmFsbHkgaW1wbGVtZW50YXRpb25zCisgKiBvZiBXcmFwcGVyIChyZXByZXNlbnRpbmcgaW5kaXZpZHVhbCBzZXJ2bGV0IGRlZmluaXRpb25zKS4KKyAqIDxwPgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgaW50ZXJmYWNlIENvbnRleHQgZXh0ZW5kcyBDb250YWluZXIgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNYW5pZmVzdCBDb25zdGFudHMKKworCisgICAgLyoqCisgICAgICogVGhlIExpZmVjeWNsZUV2ZW50IHR5cGUgc2VudCB3aGVuIGEgY29udGV4dCBpcyByZWxvYWRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUxPQURfRVZFTlQgPSAicmVsb2FkIjsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2V0IG9mIGluaXRpYWxpemVkIGFwcGxpY2F0aW9uIGV2ZW50IGxpc3RlbmVyIG9iamVjdHMsCisgICAgICogaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSBzcGVjaWZpZWQgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbiBkZXBsb3ltZW50CisgICAgICogZGVzY3JpcHRvciwgZm9yIHRoaXMgYXBwbGljYXRpb24uCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYmVmb3JlCisgICAgICogIHRoaXMgYXBwbGljYXRpb24gaGFzIHN0YXJ0ZWQsIG9yIGFmdGVyIGl0IGhhcyBiZWVuIHN0b3BwZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0W10gZ2V0QXBwbGljYXRpb25FdmVudExpc3RlbmVycygpOworCisKKyAgICAvKioKKyAgICAgKiBTdG9yZSB0aGUgc2V0IG9mIGluaXRpYWxpemVkIGFwcGxpY2F0aW9uIGV2ZW50IGxpc3RlbmVyIG9iamVjdHMsCisgICAgICogaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSBzcGVjaWZpZWQgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbiBkZXBsb3ltZW50CisgICAgICogZGVzY3JpcHRvciwgZm9yIHRoaXMgYXBwbGljYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXJzIFRoZSBzZXQgb2YgaW5zdGFudGlhdGVkIGxpc3RlbmVyIG9iamVjdHMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QXBwbGljYXRpb25FdmVudExpc3RlbmVycyhPYmplY3QgbGlzdGVuZXJzW10pOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNldCBvZiBpbml0aWFsaXplZCBhcHBsaWNhdGlvbiBsaWZlY3ljbGUgbGlzdGVuZXIgb2JqZWN0cywKKyAgICAgKiBpbiB0aGUgb3JkZXIgdGhleSB3ZXJlIHNwZWNpZmllZCBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQKKyAgICAgKiBkZXNjcmlwdG9yLCBmb3IgdGhpcyBhcHBsaWNhdGlvbi4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBiZWZvcmUKKyAgICAgKiAgdGhpcyBhcHBsaWNhdGlvbiBoYXMgc3RhcnRlZCwgb3IgYWZ0ZXIgaXQgaGFzIGJlZW4gc3RvcHBlZAorICAgICAqLworICAgIHB1YmxpYyBPYmplY3RbXSBnZXRBcHBsaWNhdGlvbkxpZmVjeWNsZUxpc3RlbmVycygpOworCisKKyAgICAvKioKKyAgICAgKiBTdG9yZSB0aGUgc2V0IG9mIGluaXRpYWxpemVkIGFwcGxpY2F0aW9uIGxpZmVjeWNsZSBsaXN0ZW5lciBvYmplY3RzLAorICAgICAqIGluIHRoZSBvcmRlciB0aGV5IHdlcmUgc3BlY2lmaWVkIGluIHRoZSB3ZWIgYXBwbGljYXRpb24gZGVwbG95bWVudAorICAgICAqIGRlc2NyaXB0b3IsIGZvciB0aGlzIGFwcGxpY2F0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVycyBUaGUgc2V0IG9mIGluc3RhbnRpYXRlZCBsaXN0ZW5lciBvYmplY3RzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEFwcGxpY2F0aW9uTGlmZWN5Y2xlTGlzdGVuZXJzKE9iamVjdCBsaXN0ZW5lcnNbXSk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgYXBwbGljYXRpb24gYXZhaWxhYmxlIGZsYWcgZm9yIHRoaXMgQ29udGV4dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRBdmFpbGFibGUoKTsKKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBhcHBsaWNhdGlvbiBhdmFpbGFibGUgZmxhZyBmb3IgdGhpcyBDb250ZXh0LgorICAgICAqCisgICAgICogQHBhcmFtIGF2YWlsYWJsZSBUaGUgbmV3IGFwcGxpY2F0aW9uIGF2YWlsYWJsZSBmbGFnCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QXZhaWxhYmxlKGJvb2xlYW4gYXZhaWxhYmxlKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBMb2NhbGUgdG8gY2hhcmFjdGVyIHNldCBtYXBwZXIgZm9yIHRoaXMgQ29udGV4dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2hhcnNldE1hcHBlciBnZXRDaGFyc2V0TWFwcGVyKCk7CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgTG9jYWxlIHRvIGNoYXJhY3RlciBzZXQgbWFwcGVyIGZvciB0aGlzIENvbnRleHQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGVyIFRoZSBuZXcgbWFwcGVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2hhcnNldE1hcHBlcihDaGFyc2V0TWFwcGVyIG1hcHBlcik7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcGF0aCB0byBhIGZpbGUgdG8gc2F2ZSB0aGlzIENvbnRleHQgaW5mb3JtYXRpb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDb25maWdGaWxlKCk7CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcGF0aCB0byBhIGZpbGUgdG8gc2F2ZSB0aGlzIENvbnRleHQgaW5mb3JtYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29uZmlnRmlsZSBUaGUgcGF0aCB0byBhIGZpbGUgdG8gc2F2ZSB0aGlzIENvbnRleHQgaW5mb3JtYXRpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29uZmlnRmlsZShTdHJpbmcgY29uZmlnRmlsZSk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgImNvcnJlY3RseSBjb25maWd1cmVkIiBmbGFnIGZvciB0aGlzIENvbnRleHQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0Q29uZmlndXJlZCgpOworCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlICJjb3JyZWN0bHkgY29uZmlndXJlZCIgZmxhZyBmb3IgdGhpcyBDb250ZXh0LiAgVGhpcyBjYW4gYmUKKyAgICAgKiBzZXQgdG8gZmFsc2UgYnkgc3RhcnR1cCBsaXN0ZW5lcnMgdGhhdCBkZXRlY3QgYSBmYXRhbCBjb25maWd1cmF0aW9uCisgICAgICogZXJyb3IgdG8gYXZvaWQgdGhlIGFwcGxpY2F0aW9uIGZyb20gYmVpbmcgbWFkZSBhdmFpbGFibGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29uZmlndXJlZCBUaGUgbmV3IGNvcnJlY3RseSBjb25maWd1cmVkIGZsYWcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb25maWd1cmVkKGJvb2xlYW4gY29uZmlndXJlZCk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgInVzZSBjb29raWVzIGZvciBzZXNzaW9uIGlkcyIgZmxhZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRDb29raWVzKCk7CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgInVzZSBjb29raWVzIGZvciBzZXNzaW9uIGlkcyIgZmxhZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb29raWVzIFRoZSBuZXcgZmxhZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvb2tpZXMoYm9vbGVhbiBjb29raWVzKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSAiYWxsb3cgY3Jvc3Npbmcgc2VydmxldCBjb250ZXh0cyIgZmxhZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRDcm9zc0NvbnRleHQoKTsKKworCisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBhbHRlcm5hdGUgRGVwbG95bWVudCBEZXNjcmlwdG9yIG5hbWUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRBbHRERE5hbWUoKTsKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgYW4gYWx0ZXJuYXRlIERlcGxveW1lbnQgRGVzY3JpcHRvciBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEFsdERETmFtZShTdHJpbmcgYWx0REROYW1lKSA7CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSAiYWxsb3cgY3Jvc3Npbmcgc2VydmxldCBjb250ZXh0cyIgZmxhZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjcm9zc0NvbnRleHQgVGhlIG5ldyBjcm9zcyBjb250ZXh0cyBmbGFnCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q3Jvc3NDb250ZXh0KGJvb2xlYW4gY3Jvc3NDb250ZXh0KTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBkaXNwbGF5IG5hbWUgb2YgdGhpcyB3ZWIgYXBwbGljYXRpb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXREaXNwbGF5TmFtZSgpOworCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGRpc3BsYXkgbmFtZSBvZiB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkaXNwbGF5TmFtZSBUaGUgbmV3IGRpc3BsYXkgbmFtZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERpc3BsYXlOYW1lKFN0cmluZyBkaXNwbGF5TmFtZSk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZGlzdHJpYnV0YWJsZSBmbGFnIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXREaXN0cmlidXRhYmxlKCk7CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZGlzdHJpYnV0YWJsZSBmbGFnIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkaXN0cmlidXRhYmxlIFRoZSBuZXcgZGlzdHJpYnV0YWJsZSBmbGFnCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGlzdHJpYnV0YWJsZShib29sZWFuIGRpc3RyaWJ1dGFibGUpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGRvY3VtZW50IHJvb3QgZm9yIHRoaXMgQ29udGV4dC4gIFRoaXMgY2FuIGJlIGFuIGFic29sdXRlCisgICAgICogcGF0aG5hbWUsIGEgcmVsYXRpdmUgcGF0aG5hbWUsIG9yIGEgVVJMLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RG9jQmFzZSgpOworCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGRvY3VtZW50IHJvb3QgZm9yIHRoaXMgQ29udGV4dC4gIFRoaXMgY2FuIGJlIGFuIGFic29sdXRlCisgICAgICogcGF0aG5hbWUsIGEgcmVsYXRpdmUgcGF0aG5hbWUsIG9yIGEgVVJMLgorICAgICAqCisgICAgICogQHBhcmFtIGRvY0Jhc2UgVGhlIG5ldyBkb2N1bWVudCByb290CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RG9jQmFzZShTdHJpbmcgZG9jQmFzZSk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbG9naW4gY29uZmlndXJhdGlvbiBkZXNjcmlwdG9yIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgTG9naW5Db25maWcgZ2V0TG9naW5Db25maWcoKTsKKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBsb2dpbiBjb25maWd1cmF0aW9uIGRlc2NyaXB0b3IgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbmZpZyBUaGUgbmV3IGxvZ2luIGNvbmZpZ3VyYXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMb2dpbkNvbmZpZyhMb2dpbkNvbmZpZyBjb25maWcpOworCisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHJlcXVlc3QgZGlzcGF0Y2hlciBtYXBwZXIuCisgICAgICovCisgICAgcHVibGljIE1hcHBlciBnZXRNYXBwZXIoKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBuYW1pbmcgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgTmFtaW5nUmVzb3VyY2VzIGdldE5hbWluZ1Jlc291cmNlcygpOworCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG5hbWluZyByZXNvdXJjZXMgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWluZ1Jlc291cmNlcyBUaGUgbmV3IG5hbWluZyByZXNvdXJjZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXROYW1pbmdSZXNvdXJjZXMoTmFtaW5nUmVzb3VyY2VzIG5hbWluZ1Jlc291cmNlcyk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY29udGV4dCBwYXRoIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhdGgoKTsKKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjb250ZXh0IHBhdGggZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHBhdGggVGhlIG5ldyBjb250ZXh0IHBhdGgKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXRoKFN0cmluZyBwYXRoKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBwdWJsaWMgaWRlbnRpZmllciBvZiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIERURCB0aGF0IGlzCisgICAgICogY3VycmVudGx5IGJlaW5nIHBhcnNlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFB1YmxpY0lkKCk7CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcHVibGljIGlkZW50aWZpZXIgb2YgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBEVEQgdGhhdCBpcworICAgICAqIGN1cnJlbnRseSBiZWluZyBwYXJzZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHVibGljSWQgVGhlIHB1YmxpYyBpZGVudGlmaWVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHVibGljSWQoU3RyaW5nIHB1YmxpY0lkKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSByZWxvYWRhYmxlIGZsYWcgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldFJlbG9hZGFibGUoKTsKKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSByZWxvYWRhYmxlIGZsYWcgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHJlbG9hZGFibGUgVGhlIG5ldyByZWxvYWRhYmxlIGZsYWcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZWxvYWRhYmxlKGJvb2xlYW4gcmVsb2FkYWJsZSk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgb3ZlcnJpZGUgZmxhZyBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0T3ZlcnJpZGUoKTsKKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBvdmVycmlkZSBmbGFnIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvdmVycmlkZSBUaGUgbmV3IG92ZXJyaWRlIGZsYWcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPdmVycmlkZShib29sZWFuIG92ZXJyaWRlKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBwcml2aWxlZ2VkIGZsYWcgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldFByaXZpbGVnZWQoKTsKKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBwcml2aWxlZ2VkIGZsYWcgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHByaXZpbGVnZWQgVGhlIG5ldyBwcml2aWxlZ2VkIGZsYWcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcml2aWxlZ2VkKGJvb2xlYW4gcHJpdmlsZWdlZCk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2VydmxldCBjb250ZXh0IGZvciB3aGljaCB0aGlzIENvbnRleHQgaXMgYSBmYWNhZGUuCisgICAgICovCisgICAgcHVibGljIFNlcnZsZXRDb250ZXh0IGdldFNlcnZsZXRDb250ZXh0KCk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZGVmYXVsdCBzZXNzaW9uIHRpbWVvdXQgKGluIG1pbnV0ZXMpIGZvciB0aGlzCisgICAgICogd2ViIGFwcGxpY2F0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0U2Vzc2lvblRpbWVvdXQoKTsKKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBkZWZhdWx0IHNlc3Npb24gdGltZW91dCAoaW4gbWludXRlcykgZm9yIHRoaXMKKyAgICAgKiB3ZWIgYXBwbGljYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGltZW91dCBUaGUgbmV3IGRlZmF1bHQgc2Vzc2lvbiB0aW1lb3V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2Vzc2lvblRpbWVvdXQoaW50IHRpbWVvdXQpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBzd2FsbG93T3V0cHV0IGZsYWcuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0U3dhbGxvd091dHB1dCgpOworCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHZhbHVlIG9mIHRoZSBzd2FsbG93T3V0cHV0IGZsYWcuIElmIHNldCB0byB0cnVlLCB0aGUgc3lzdGVtLm91dAorICAgICAqIGFuZCBzeXN0ZW0uZXJyIHdpbGwgYmUgcmVkaXJlY3RlZCB0byB0aGUgbG9nZ2VyIGR1cmluZyBhIHNlcnZsZXQKKyAgICAgKiBleGVjdXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3dhbGxvd091dHB1dCBUaGUgbmV3IHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3dhbGxvd091dHB1dChib29sZWFuIHN3YWxsb3dPdXRwdXQpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIEphdmEgY2xhc3MgbmFtZSBvZiB0aGUgV3JhcHBlciBpbXBsZW1lbnRhdGlvbiB1c2VkCisgICAgICogZm9yIHNlcnZsZXRzIHJlZ2lzdGVyZWQgaW4gdGhpcyBDb250ZXh0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0V3JhcHBlckNsYXNzKCk7CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgSmF2YSBjbGFzcyBuYW1lIG9mIHRoZSBXcmFwcGVyIGltcGxlbWVudGF0aW9uIHVzZWQKKyAgICAgKiBmb3Igc2VydmxldHMgcmVnaXN0ZXJlZCBpbiB0aGlzIENvbnRleHQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gd3JhcHBlckNsYXNzIFRoZSBuZXcgd3JhcHBlciBjbGFzcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFdyYXBwZXJDbGFzcyhTdHJpbmcgd3JhcHBlckNsYXNzKTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIEFkZCBhIG5ldyBMaXN0ZW5lciBjbGFzcyBuYW1lIHRvIHRoZSBzZXQgb2YgTGlzdGVuZXJzCisgICAgICogY29uZmlndXJlZCBmb3IgdGhpcyBhcHBsaWNhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBKYXZhIGNsYXNzIG5hbWUgb2YgYSBsaXN0ZW5lciBjbGFzcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEFwcGxpY2F0aW9uTGlzdGVuZXIoU3RyaW5nIGxpc3RlbmVyKTsKKworCisgICAgLyoqCisgICAgICogQWRkIGEgbmV3IGFwcGxpY2F0aW9uIHBhcmFtZXRlciBmb3IgdGhpcyBhcHBsaWNhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJhbWV0ZXIgVGhlIG5ldyBhcHBsaWNhdGlvbiBwYXJhbWV0ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRBcHBsaWNhdGlvblBhcmFtZXRlcihBcHBsaWNhdGlvblBhcmFtZXRlciBwYXJhbWV0ZXIpOworCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBzZWN1cml0eSBjb25zdHJhaW50IHRvIHRoZSBzZXQgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZENvbnN0cmFpbnQoU2VjdXJpdHlDb25zdHJhaW50IGNvbnN0cmFpbnQpOworCisKKyAgICAvKioKKyAgICAgKiBBZGQgYW4gZXJyb3IgcGFnZSBmb3IgdGhlIHNwZWNpZmllZCBlcnJvciBvciBKYXZhIGV4Y2VwdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlcnJvclBhZ2UgVGhlIGVycm9yIHBhZ2UgZGVmaW5pdGlvbiB0byBiZSBhZGRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEVycm9yUGFnZShFcnJvclBhZ2UgZXJyb3JQYWdlKTsKKworCisgICAgLyoqCisgICAgICogQWRkIGEgZmlsdGVyIGRlZmluaXRpb24gdG8gdGhpcyBDb250ZXh0LgorICAgICAqCisgICAgICogQHBhcmFtIGZpbHRlckRlZiBUaGUgZmlsdGVyIGRlZmluaXRpb24gdG8gYmUgYWRkZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRGaWx0ZXJEZWYoRmlsdGVyRGVmIGZpbHRlckRlZik7CisKKworICAgIC8qKgorICAgICAqIEFkZCBhIGZpbHRlciBtYXBwaW5nIHRvIHRoaXMgQ29udGV4dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWx0ZXJNYXAgVGhlIGZpbHRlciBtYXBwaW5nIHRvIGJlIGFkZGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRmlsdGVyTWFwKEZpbHRlck1hcCBmaWx0ZXJNYXApOworCisKKyAgICAvKioKKyAgICAgKiBBZGQgdGhlIGNsYXNzbmFtZSBvZiBhbiBJbnN0YW5jZUxpc3RlbmVyIHRvIGJlIGFkZGVkIHRvIGVhY2gKKyAgICAgKiBXcmFwcGVyIGFwcGVuZGVkIHRvIHRoaXMgQ29udGV4dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBKYXZhIGNsYXNzIG5hbWUgb2YgYW4gSW5zdGFuY2VMaXN0ZW5lciBjbGFzcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEluc3RhbmNlTGlzdGVuZXIoU3RyaW5nIGxpc3RlbmVyKTsKKworCisgICAgLyoqCisgICAgICogQWRkIHRoZSBnaXZlbiBVUkwgcGF0dGVybiBhcyBhIGpzcC1wcm9wZXJ0eS1ncm91cC4gIFRoaXMgbWFwcworICAgICAqIHJlc291cmNlcyB0aGF0IG1hdGNoIHRoZSBnaXZlbiBwYXR0ZXJuIHNvIHRoZXkgd2lsbCBiZSBwYXNzZWQKKyAgICAgKiB0byB0aGUgSlNQIGNvbnRhaW5lci4gIFRob3VnaCB0aGVyZSBhcmUgb3RoZXIgZWxlbWVudHMgaW4gdGhlCisgICAgICogcHJvcGVydHkgZ3JvdXAsIHdlIG9ubHkgY2FyZSBhYm91dCB0aGUgVVJMIHBhdHRlcm4gaGVyZS4gIFRoZQorICAgICAqIEpTUCBjb250YWluZXIgd2lsbCBwYXJzZSB0aGUgcmVzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXR0ZXJuIFVSTCBwYXR0ZXJuIHRvIGJlIG1hcHBlZCAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRKc3BNYXBwaW5nKFN0cmluZyBwYXR0ZXJuKTsKKworCisgICAgLyoqCisgICAgICogQWRkIGEgTG9jYWxlIEVuY29kaW5nIE1hcHBpbmcgKHNlZSBTZWMgNS40IG9mIFNlcnZsZXQgc3BlYyAyLjQpCisgICAgICoKKyAgICAgKiBAcGFyYW0gbG9jYWxlIGxvY2FsZSB0byBtYXAgYW4gZW5jb2RpbmcgZm9yCisgICAgICogQHBhcmFtIGVuY29kaW5nIGVuY29kaW5nIHRvIGJlIHVzZWQgZm9yIGEgZ2l2ZSBsb2NhbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRMb2NhbGVFbmNvZGluZ01hcHBpbmdQYXJhbWV0ZXIoU3RyaW5nIGxvY2FsZSwgU3RyaW5nIGVuY29kaW5nKTsKKworCisgICAgLyoqCisgICAgICogQWRkIGEgbmV3IE1JTUUgbWFwcGluZywgcmVwbGFjaW5nIGFueSBleGlzdGluZyBtYXBwaW5nIGZvcgorICAgICAqIHRoZSBzcGVjaWZpZWQgZXh0ZW5zaW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGV4dGVuc2lvbiBGaWxlbmFtZSBleHRlbnNpb24gYmVpbmcgbWFwcGVkCisgICAgICogQHBhcmFtIG1pbWVUeXBlIENvcnJlc3BvbmRpbmcgTUlNRSB0eXBlCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkTWltZU1hcHBpbmcoU3RyaW5nIGV4dGVuc2lvbiwgU3RyaW5nIG1pbWVUeXBlKTsKKworCisgICAgLyoqCisgICAgICogQWRkIGEgbmV3IGNvbnRleHQgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyLCByZXBsYWNpbmcgYW55IGV4aXN0aW5nCisgICAgICogdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIG5ldyBwYXJhbWV0ZXIKKyAgICAgKiBAcGFyYW0gdmFsdWUgVmFsdWUgb2YgdGhlIG5ldyAgcGFyYW1ldGVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkUGFyYW1ldGVyKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpOworCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBzZWN1cml0eSByb2xlIHJlZmVyZW5jZSBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcm9sZSBTZWN1cml0eSByb2xlIHVzZWQgaW4gdGhlIGFwcGxpY2F0aW9uCisgICAgICogQHBhcmFtIGxpbmsgQWN0dWFsIHNlY3VyaXR5IHJvbGUgdG8gY2hlY2sgZm9yCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkUm9sZU1hcHBpbmcoU3RyaW5nIHJvbGUsIFN0cmluZyBsaW5rKTsKKworCisgICAgLyoqCisgICAgICogQWRkIGEgbmV3IHNlY3VyaXR5IHJvbGUgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHJvbGUgTmV3IHNlY3VyaXR5IHJvbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRTZWN1cml0eVJvbGUoU3RyaW5nIHJvbGUpOworCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBuZXcgc2VydmxldCBtYXBwaW5nLCByZXBsYWNpbmcgYW55IGV4aXN0aW5nIG1hcHBpbmcgZm9yCisgICAgICogdGhlIHNwZWNpZmllZCBwYXR0ZXJuLgorICAgICAqCisgICAgICogQHBhcmFtIHBhdHRlcm4gVVJMIHBhdHRlcm4gdG8gYmUgbWFwcGVkCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgY29ycmVzcG9uZGluZyBzZXJ2bGV0IHRvIGV4ZWN1dGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRTZXJ2bGV0TWFwcGluZyhTdHJpbmcgcGF0dGVybiwgU3RyaW5nIG5hbWUpOworCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBKU1AgdGFnIGxpYnJhcnkgZm9yIHRoZSBzcGVjaWZpZWQgVVJJLgorICAgICAqCisgICAgICogQHBhcmFtIHVyaSBVUkksIHJlbGF0aXZlIHRvIHRoZSB3ZWIueG1sIGZpbGUsIG9mIHRoaXMgdGFnIGxpYnJhcnkKKyAgICAgKiBAcGFyYW0gbG9jYXRpb24gTG9jYXRpb24gb2YgdGhlIHRhZyBsaWJyYXJ5IGRlc2NyaXB0b3IKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRUYWdsaWIoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2F0aW9uKTsKKworICAgIAorICAgIC8qKgorICAgICAqIEFkZCBhIHJlc291cmNlIHdoaWNoIHdpbGwgYmUgd2F0Y2hlZCBmb3IgcmVsb2FkaW5nIGJ5IHRoZSBob3N0IGF1dG8KKyAgICAgKiBkZXBsb3llci4gTm90ZTogdGhpcyB3aWxsIG5vdCBiZSB1c2VkIGluIGVtYmVkZGVkIG1vZGUuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgUGF0aCB0byB0aGUgcmVzb3VyY2UsIHJlbGF0aXZlIHRvIGRvY0Jhc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRXYXRjaGVkUmVzb3VyY2UoU3RyaW5nIG5hbWUpOworICAgIAorCisgICAgLyoqCisgICAgICogQWRkIGEgbmV3IHdlbGNvbWUgZmlsZSB0byB0aGUgc2V0IHJlY29nbml6ZWQgYnkgdGhpcyBDb250ZXh0LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmV3IHdlbGNvbWUgZmlsZSBuYW1lCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkV2VsY29tZUZpbGUoU3RyaW5nIG5hbWUpOworCisKKyAgICAvKioKKyAgICAgKiBBZGQgdGhlIGNsYXNzbmFtZSBvZiBhIExpZmVjeWNsZUxpc3RlbmVyIHRvIGJlIGFkZGVkIHRvIGVhY2gKKyAgICAgKiBXcmFwcGVyIGFwcGVuZGVkIHRvIHRoaXMgQ29udGV4dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBKYXZhIGNsYXNzIG5hbWUgb2YgYSBMaWZlY3ljbGVMaXN0ZW5lciBjbGFzcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFdyYXBwZXJMaWZlY3ljbGUoU3RyaW5nIGxpc3RlbmVyKTsKKworCisgICAgLyoqCisgICAgICogQWRkIHRoZSBjbGFzc25hbWUgb2YgYSBDb250YWluZXJMaXN0ZW5lciB0byBiZSBhZGRlZCB0byBlYWNoCisgICAgICogV3JhcHBlciBhcHBlbmRlZCB0byB0aGlzIENvbnRleHQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgSmF2YSBjbGFzcyBuYW1lIG9mIGEgQ29udGFpbmVyTGlzdGVuZXIgY2xhc3MKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRXcmFwcGVyTGlzdGVuZXIoU3RyaW5nIGxpc3RlbmVyKTsKKworCisgICAgLyoqCisgICAgICogRmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIGFuZCByZXR1cm4gYSBuZXcgV3JhcHBlciBpbnN0YW5jZSwgb2YKKyAgICAgKiB0aGUgSmF2YSBpbXBsZW1lbnRhdGlvbiBjbGFzcyBhcHByb3ByaWF0ZSBmb3IgdGhpcyBDb250ZXh0CisgICAgICogaW1wbGVtZW50YXRpb24uICBUaGUgY29uc3RydWN0b3Igb2YgdGhlIGluc3RhbnRpYXRlZCBXcmFwcGVyCisgICAgICogd2lsbCBoYXZlIGJlZW4gY2FsbGVkLCBidXQgbm8gcHJvcGVydGllcyB3aWxsIGhhdmUgYmVlbiBzZXQuCisgICAgICovCisgICAgcHVibGljIFdyYXBwZXIgY3JlYXRlV3JhcHBlcigpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNldCBvZiBhcHBsaWNhdGlvbiBsaXN0ZW5lciBjbGFzcyBuYW1lcyBjb25maWd1cmVkCisgICAgICogZm9yIHRoaXMgYXBwbGljYXRpb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGZpbmRBcHBsaWNhdGlvbkxpc3RlbmVycygpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNldCBvZiBhcHBsaWNhdGlvbiBwYXJhbWV0ZXJzIGZvciB0aGlzIGFwcGxpY2F0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBBcHBsaWNhdGlvblBhcmFtZXRlcltdIGZpbmRBcHBsaWNhdGlvblBhcmFtZXRlcnMoKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXQgb2Ygc2VjdXJpdHkgY29uc3RyYWludHMgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorICAgICAqIElmIHRoZXJlIGFyZSBub25lLCBhIHplcm8tbGVuZ3RoIGFycmF5IGlzIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBTZWN1cml0eUNvbnN0cmFpbnRbXSBmaW5kQ29uc3RyYWludHMoKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBlcnJvciBwYWdlIGVudHJ5IGZvciB0aGUgc3BlY2lmaWVkIEhUVFAgZXJyb3IgY29kZSwKKyAgICAgKiBpZiBhbnk7IG90aGVyd2lzZSByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXJyb3JDb2RlIEVycm9yIGNvZGUgdG8gbG9vayB1cAorICAgICAqLworICAgIHB1YmxpYyBFcnJvclBhZ2UgZmluZEVycm9yUGFnZShpbnQgZXJyb3JDb2RlKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBlcnJvciBwYWdlIGVudHJ5IGZvciB0aGUgc3BlY2lmaWVkIEphdmEgZXhjZXB0aW9uIHR5cGUsCisgICAgICogaWYgYW55OyBvdGhlcndpc2UgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIGV4Y2VwdGlvblR5cGUgRXhjZXB0aW9uIHR5cGUgdG8gbG9vayB1cAorICAgICAqLworICAgIHB1YmxpYyBFcnJvclBhZ2UgZmluZEVycm9yUGFnZShTdHJpbmcgZXhjZXB0aW9uVHlwZSk7CisKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXQgb2YgZGVmaW5lZCBlcnJvciBwYWdlcyBmb3IgYWxsIHNwZWNpZmllZCBlcnJvciBjb2RlcworICAgICAqIGFuZCBleGNlcHRpb24gdHlwZXMuCisgICAgICovCisgICAgcHVibGljIEVycm9yUGFnZVtdIGZpbmRFcnJvclBhZ2VzKCk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZmlsdGVyIGRlZmluaXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgZmlsdGVyIG5hbWUsIGlmIGFueTsKKyAgICAgKiBvdGhlcndpc2UgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIGZpbHRlck5hbWUgRmlsdGVyIG5hbWUgdG8gbG9vayB1cAorICAgICAqLworICAgIHB1YmxpYyBGaWx0ZXJEZWYgZmluZEZpbHRlckRlZihTdHJpbmcgZmlsdGVyTmFtZSk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2V0IG9mIGRlZmluZWQgZmlsdGVycyBmb3IgdGhpcyBDb250ZXh0LgorICAgICAqLworICAgIHB1YmxpYyBGaWx0ZXJEZWZbXSBmaW5kRmlsdGVyRGVmcygpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNldCBvZiBmaWx0ZXIgbWFwcGluZ3MgZm9yIHRoaXMgQ29udGV4dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmlsdGVyTWFwW10gZmluZEZpbHRlck1hcHMoKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXQgb2YgSW5zdGFuY2VMaXN0ZW5lciBjbGFzc2VzIHRoYXQgd2lsbCBiZSBhZGRlZCB0bworICAgICAqIG5ld2x5IGNyZWF0ZWQgV3JhcHBlcnMgYXV0b21hdGljYWxseS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZmluZEluc3RhbmNlTGlzdGVuZXJzKCk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgTUlNRSB0eXBlIHRvIHdoaWNoIHRoZSBzcGVjaWZpZWQgZXh0ZW5zaW9uIGlzIG1hcHBlZCwKKyAgICAgKiBpZiBhbnk7IG90aGVyd2lzZSByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXh0ZW5zaW9uIEV4dGVuc2lvbiB0byBtYXAgdG8gYSBNSU1FIHR5cGUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGZpbmRNaW1lTWFwcGluZyhTdHJpbmcgZXh0ZW5zaW9uKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBleHRlbnNpb25zIGZvciB3aGljaCBNSU1FIG1hcHBpbmdzIGFyZSBkZWZpbmVkLiAgSWYgdGhlcmUKKyAgICAgKiBhcmUgbm9uZSwgYSB6ZXJvLWxlbmd0aCBhcnJheSBpcyByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZmluZE1pbWVNYXBwaW5ncygpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIGNvbnRleHQgaW5pdGlhbGl6YXRpb24KKyAgICAgKiBwYXJhbWV0ZXIgbmFtZSwgaWYgYW55OyBvdGhlcndpc2UgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgcGFyYW1ldGVyIHRvIHJldHVybgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZmluZFBhcmFtZXRlcihTdHJpbmcgbmFtZSk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbmFtZXMgb2YgYWxsIGRlZmluZWQgY29udGV4dCBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzCisgICAgICogZm9yIHRoaXMgQ29udGV4dC4gIElmIG5vIHBhcmFtZXRlcnMgYXJlIGRlZmluZWQsIGEgemVyby1sZW5ndGgKKyAgICAgKiBhcnJheSBpcyByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZmluZFBhcmFtZXRlcnMoKTsKKworCisgICAgLyoqCisgICAgICogRm9yIHRoZSBnaXZlbiBzZWN1cml0eSByb2xlIChhcyB1c2VkIGJ5IGFuIGFwcGxpY2F0aW9uKSwgcmV0dXJuIHRoZQorICAgICAqIGNvcnJlc3BvbmRpbmcgcm9sZSBuYW1lIChhcyBkZWZpbmVkIGJ5IHRoZSB1bmRlcmx5aW5nIFJlYWxtKSBpZiB0aGVyZQorICAgICAqIGlzIG9uZS4gIE90aGVyd2lzZSwgcmV0dXJuIHRoZSBzcGVjaWZpZWQgcm9sZSB1bmNoYW5nZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcm9sZSBTZWN1cml0eSByb2xlIHRvIG1hcAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZmluZFJvbGVNYXBwaW5nKFN0cmluZyByb2xlKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgc2VjdXJpdHkgcm9sZSBpcyBkZWZpbmVkCisgICAgICogZm9yIHRoaXMgYXBwbGljYXRpb247IG90aGVyd2lzZSByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIHJvbGUgU2VjdXJpdHkgcm9sZSB0byB2ZXJpZnkKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBmaW5kU2VjdXJpdHlSb2xlKFN0cmluZyByb2xlKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZWN1cml0eSByb2xlcyBkZWZpbmVkIGZvciB0aGlzIGFwcGxpY2F0aW9uLiAgSWYgbm9uZQorICAgICAqIGhhdmUgYmVlbiBkZWZpbmVkLCBhIHplcm8tbGVuZ3RoIGFycmF5IGlzIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBmaW5kU2VjdXJpdHlSb2xlcygpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNlcnZsZXQgbmFtZSBtYXBwZWQgYnkgdGhlIHNwZWNpZmllZCBwYXR0ZXJuIChpZiBhbnkpOworICAgICAqIG90aGVyd2lzZSByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0dGVybiBQYXR0ZXJuIGZvciB3aGljaCBhIG1hcHBpbmcgaXMgcmVxdWVzdGVkCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBmaW5kU2VydmxldE1hcHBpbmcoU3RyaW5nIHBhdHRlcm4pOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHBhdHRlcm5zIG9mIGFsbCBkZWZpbmVkIHNlcnZsZXQgbWFwcGluZ3MgZm9yIHRoaXMKKyAgICAgKiBDb250ZXh0LiAgSWYgbm8gbWFwcGluZ3MgYXJlIGRlZmluZWQsIGEgemVyby1sZW5ndGggYXJyYXkgaXMgcmV0dXJuZWQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGZpbmRTZXJ2bGV0TWFwcGluZ3MoKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjb250ZXh0LXJlbGF0aXZlIFVSSSBvZiB0aGUgZXJyb3IgcGFnZSBmb3IgdGhlIHNwZWNpZmllZAorICAgICAqIEhUVFAgc3RhdHVzIGNvZGUsIGlmIGFueTsgb3RoZXJ3aXNlIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdGF0dXMgSFRUUCBzdGF0dXMgY29kZSB0byBsb29rIHVwCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBmaW5kU3RhdHVzUGFnZShpbnQgc3RhdHVzKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXQgb2YgSFRUUCBzdGF0dXMgY29kZXMgZm9yIHdoaWNoIGVycm9yIHBhZ2VzIGhhdmUKKyAgICAgKiBiZWVuIHNwZWNpZmllZC4gIElmIG5vbmUgYXJlIHNwZWNpZmllZCwgYSB6ZXJvLWxlbmd0aCBhcnJheQorICAgICAqIGlzIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBpbnRbXSBmaW5kU3RhdHVzUGFnZXMoKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB0YWcgbGlicmFyeSBkZXNjcmlwdG9yIGxvY2F0aW9uIGZvciB0aGUgc3BlY2lmaWVkIHRhZ2xpYgorICAgICAqIFVSSSwgaWYgYW55OyBvdGhlcndpc2UsIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmkgVVJJLCByZWxhdGl2ZSB0byB0aGUgd2ViLnhtbCBmaWxlCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBmaW5kVGFnbGliKFN0cmluZyB1cmkpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIFVSSXMgb2YgYWxsIHRhZyBsaWJyYXJpZXMgZm9yIHdoaWNoIGEgdGFnIGxpYnJhcnkKKyAgICAgKiBkZXNjcmlwdG9yIGxvY2F0aW9uIGhhcyBiZWVuIHNwZWNpZmllZC4gIElmIG5vbmUgYXJlIHNwZWNpZmllZCwKKyAgICAgKiBhIHplcm8tbGVuZ3RoIGFycmF5IGlzIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBmaW5kVGFnbGlicygpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNldCBvZiB3YXRjaGVkIHJlc291cmNlcyBmb3IgdGhpcyBDb250ZXh0LiBJZiBub25lIGFyZSAKKyAgICAgKiBkZWZpbmVkLCBhIHplcm8gbGVuZ3RoIGFycmF5IHdpbGwgYmUgcmV0dXJuZWQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGZpbmRXYXRjaGVkUmVzb3VyY2VzKCk7CisgICAgCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCB3ZWxjb21lIGZpbGUgaXMgZGVmaW5lZAorICAgICAqIGZvciB0aGlzIENvbnRleHQ7IG90aGVyd2lzZSByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgV2VsY29tZSBmaWxlIHRvIHZlcmlmeQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGZpbmRXZWxjb21lRmlsZShTdHJpbmcgbmFtZSk7CisKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNldCBvZiB3ZWxjb21lIGZpbGVzIGRlZmluZWQgZm9yIHRoaXMgQ29udGV4dC4gIElmIG5vbmUgYXJlCisgICAgICogZGVmaW5lZCwgYSB6ZXJvLWxlbmd0aCBhcnJheSBpcyByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZmluZFdlbGNvbWVGaWxlcygpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNldCBvZiBMaWZlY3ljbGVMaXN0ZW5lciBjbGFzc2VzIHRoYXQgd2lsbCBiZSBhZGRlZCB0bworICAgICAqIG5ld2x5IGNyZWF0ZWQgV3JhcHBlcnMgYXV0b21hdGljYWxseS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZmluZFdyYXBwZXJMaWZlY3ljbGVzKCk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2V0IG9mIENvbnRhaW5lckxpc3RlbmVyIGNsYXNzZXMgdGhhdCB3aWxsIGJlIGFkZGVkIHRvCisgICAgICogbmV3bHkgY3JlYXRlZCBXcmFwcGVycyBhdXRvbWF0aWNhbGx5LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBmaW5kV3JhcHBlckxpc3RlbmVycygpOworCisKKyAgICAvKioKKyAgICAgKiBSZWxvYWQgdGhpcyB3ZWIgYXBwbGljYXRpb24sIGlmIHJlbG9hZGluZyBpcyBzdXBwb3J0ZWQuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGUgPGNvZGU+cmVsb2FkYWJsZTwvY29kZT4KKyAgICAgKiAgcHJvcGVydHkgaXMgc2V0IHRvIDxjb2RlPmZhbHNlPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWxvYWQoKTsKKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgYXBwbGljYXRpb24gbGlzdGVuZXIgY2xhc3MgZnJvbSB0aGUgc2V0IG9mCisgICAgICogbGlzdGVuZXJzIGZvciB0aGlzIGFwcGxpY2F0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIEphdmEgY2xhc3MgbmFtZSBvZiB0aGUgbGlzdGVuZXIgdG8gYmUgcmVtb3ZlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUFwcGxpY2F0aW9uTGlzdGVuZXIoU3RyaW5nIGxpc3RlbmVyKTsKKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBhcHBsaWNhdGlvbiBwYXJhbWV0ZXIgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgZnJvbQorICAgICAqIHRoZSBzZXQgZm9yIHRoaXMgYXBwbGljYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiBwYXJhbWV0ZXIgdG8gcmVtb3ZlCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlQXBwbGljYXRpb25QYXJhbWV0ZXIoU3RyaW5nIG5hbWUpOworCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBzZWN1cml0eSBjb25zdHJhaW50IGZyb20gdGhpcyB3ZWIgYXBwbGljYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29uc3RyYWludCBDb25zdHJhaW50IHRvIGJlIHJlbW92ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVDb25zdHJhaW50KFNlY3VyaXR5Q29uc3RyYWludCBjb25zdHJhaW50KTsKKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBlcnJvciBwYWdlIGZvciB0aGUgc3BlY2lmaWVkIGVycm9yIGNvZGUgb3IKKyAgICAgKiBKYXZhIGxhbmd1YWdlIGV4Y2VwdGlvbiwgaWYgaXQgZXhpc3RzOyBvdGhlcndpc2UsIG5vIGFjdGlvbiBpcyB0YWtlbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlcnJvclBhZ2UgVGhlIGVycm9yIHBhZ2UgZGVmaW5pdGlvbiB0byBiZSByZW1vdmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlRXJyb3JQYWdlKEVycm9yUGFnZSBlcnJvclBhZ2UpOworCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBmaWx0ZXIgZGVmaW5pdGlvbiBmcm9tIHRoaXMgQ29udGV4dCwgaWYgaXQgZXhpc3RzOworICAgICAqIG90aGVyd2lzZSwgbm8gYWN0aW9uIGlzIHRha2VuLgorICAgICAqCisgICAgICogQHBhcmFtIGZpbHRlckRlZiBGaWx0ZXIgZGVmaW5pdGlvbiB0byBiZSByZW1vdmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlRmlsdGVyRGVmKEZpbHRlckRlZiBmaWx0ZXJEZWYpOworCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSBmaWx0ZXIgbWFwcGluZyBmcm9tIHRoaXMgQ29udGV4dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWx0ZXJNYXAgVGhlIGZpbHRlciBtYXBwaW5nIHRvIGJlIHJlbW92ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVGaWx0ZXJNYXAoRmlsdGVyTWFwIGZpbHRlck1hcCk7CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhIGNsYXNzIG5hbWUgZnJvbSB0aGUgc2V0IG9mIEluc3RhbmNlTGlzdGVuZXIgY2xhc3NlcyB0aGF0CisgICAgICogd2lsbCBiZSBhZGRlZCB0byBuZXdseSBjcmVhdGVkIFdyYXBwZXJzLgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIENsYXNzIG5hbWUgb2YgYW4gSW5zdGFuY2VMaXN0ZW5lciBjbGFzcyB0byBiZSByZW1vdmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlSW5zdGFuY2VMaXN0ZW5lcihTdHJpbmcgbGlzdGVuZXIpOworCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgdGhlIE1JTUUgbWFwcGluZyBmb3IgdGhlIHNwZWNpZmllZCBleHRlbnNpb24sIGlmIGl0IGV4aXN0czsKKyAgICAgKiBvdGhlcndpc2UsIG5vIGFjdGlvbiBpcyB0YWtlbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBleHRlbnNpb24gRXh0ZW5zaW9uIHRvIHJlbW92ZSB0aGUgbWFwcGluZyBmb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVNaW1lTWFwcGluZyhTdHJpbmcgZXh0ZW5zaW9uKTsKKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBjb250ZXh0IGluaXRpYWxpemF0aW9uIHBhcmFtZXRlciB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBuYW1lLCBpZiBpdCBleGlzdHM7IG90aGVyd2lzZSwgbm8gYWN0aW9uIGlzIHRha2VuLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgcGFyYW1ldGVyIHRvIHJlbW92ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVBhcmFtZXRlcihTdHJpbmcgbmFtZSk7CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhbnkgc2VjdXJpdHkgcm9sZSByZWZlcmVuY2UgZm9yIHRoZSBzcGVjaWZpZWQgbmFtZQorICAgICAqCisgICAgICogQHBhcmFtIHJvbGUgU2VjdXJpdHkgcm9sZSAoYXMgdXNlZCBpbiB0aGUgYXBwbGljYXRpb24pIHRvIHJlbW92ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVJvbGVNYXBwaW5nKFN0cmluZyByb2xlKTsKKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGFueSBzZWN1cml0eSByb2xlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIHJvbGUgU2VjdXJpdHkgcm9sZSB0byByZW1vdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVTZWN1cml0eVJvbGUoU3RyaW5nIHJvbGUpOworCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYW55IHNlcnZsZXQgbWFwcGluZyBmb3IgdGhlIHNwZWNpZmllZCBwYXR0ZXJuLCBpZiBpdCBleGlzdHM7CisgICAgICogb3RoZXJ3aXNlLCBubyBhY3Rpb24gaXMgdGFrZW4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0dGVybiBVUkwgcGF0dGVybiBvZiB0aGUgbWFwcGluZyB0byByZW1vdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVTZXJ2bGV0TWFwcGluZyhTdHJpbmcgcGF0dGVybik7CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGUgdGFnIGxpYnJhcnkgbG9jYXRpb24gZm9ydGhlIHNwZWNpZmllZCB0YWcgbGlicmFyeSBVUkkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJpIFVSSSwgcmVsYXRpdmUgdG8gdGhlIHdlYi54bWwgZmlsZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVRhZ2xpYihTdHJpbmcgdXJpKTsKKworICAgIAorICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIHdhdGNoZWQgcmVzb3VyY2UgbmFtZSBmcm9tIHRoZSBsaXN0IGFzc29jaWF0ZWQKKyAgICAgKiB3aXRoIHRoaXMgQ29udGV4dC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSB3YXRjaGVkIHJlc291cmNlIHRvIGJlIHJlbW92ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVXYXRjaGVkUmVzb3VyY2UoU3RyaW5nIG5hbWUpOworICAgIAorCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgd2VsY29tZSBmaWxlIG5hbWUgZnJvbSB0aGUgbGlzdCByZWNvZ25pemVkCisgICAgICogYnkgdGhpcyBDb250ZXh0LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgd2VsY29tZSBmaWxlIHRvIGJlIHJlbW92ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVXZWxjb21lRmlsZShTdHJpbmcgbmFtZSk7CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhIGNsYXNzIG5hbWUgZnJvbSB0aGUgc2V0IG9mIExpZmVjeWNsZUxpc3RlbmVyIGNsYXNzZXMgdGhhdAorICAgICAqIHdpbGwgYmUgYWRkZWQgdG8gbmV3bHkgY3JlYXRlZCBXcmFwcGVycy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBDbGFzcyBuYW1lIG9mIGEgTGlmZWN5Y2xlTGlzdGVuZXIgY2xhc3MgdG8gYmUgcmVtb3ZlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVdyYXBwZXJMaWZlY3ljbGUoU3RyaW5nIGxpc3RlbmVyKTsKKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGEgY2xhc3MgbmFtZSBmcm9tIHRoZSBzZXQgb2YgQ29udGFpbmVyTGlzdGVuZXIgY2xhc3NlcyB0aGF0CisgICAgICogd2lsbCBiZSBhZGRlZCB0byBuZXdseSBjcmVhdGVkIFdyYXBwZXJzLgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIENsYXNzIG5hbWUgb2YgYSBDb250YWluZXJMaXN0ZW5lciBjbGFzcyB0byBiZSByZW1vdmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlV3JhcHBlckxpc3RlbmVyKFN0cmluZyBsaXN0ZW5lcik7CisKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgc2VydmVyLnhtbCA8Y29udGV4dD4gYXR0cmlidXRlJ3MgeG1sTmFtZXNwYWNlQXdhcmUuCisgICAgICogQHJldHVybiB0cnVlIGlmIG5hbWVzcGFjZSBhd2FyZW5lcyBpcyBlbmFibGVkLgorICAgICAqCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0WG1sTmFtZXNwYWNlQXdhcmUoKTsKKworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBzZXJ2ZXIueG1sIDxjb250ZXh0PiBhdHRyaWJ1dGUncyB4bWxWYWxpZGF0aW9uLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB2YWxpZGF0aW9uIGlzIGVuYWJsZWQuCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRYbWxWYWxpZGF0aW9uKCk7CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdmFsaWRhdGlvbiBmZWF0dXJlIG9mIHRoZSBYTUwgcGFyc2VyIHVzZWQgd2hlbgorICAgICAqIHBhcnNpbmcgeG1sIGluc3RhbmNlcy4KKyAgICAgKiBAcGFyYW0geG1sVmFsaWRhdGlvbiB0cnVlIHRvIGVuYWJsZSB4bWwgaW5zdGFuY2UgdmFsaWRhdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFhtbFZhbGlkYXRpb24oYm9vbGVhbiB4bWxWYWxpZGF0aW9uKTsKKworCisgICAvKioKKyAgICAgKiBTZXQgdGhlIG5hbWVzcGFjZSBhd2FyZSBmZWF0dXJlIG9mIHRoZSBYTUwgcGFyc2VyIHVzZWQgd2hlbgorICAgICAqIHBhcnNpbmcgeG1sIGluc3RhbmNlcy4KKyAgICAgKiBAcGFyYW0geG1sTmFtZXNwYWNlQXdhcmUgdHJ1ZSB0byBlbmFibGUgbmFtZXNwYWNlIGF3YXJlbmVzcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFhtbE5hbWVzcGFjZUF3YXJlKGJvb2xlYW4geG1sTmFtZXNwYWNlQXdhcmUpOworICAgIC8qKgorICAgICAqIEdldCB0aGUgc2VydmVyLnhtbCA8Y29udGV4dD4gYXR0cmlidXRlJ3MgeG1sVmFsaWRhdGlvbi4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdmFsaWRhdGlvbiBpcyBlbmFibGVkLgorICAgICAqLworICAgICAKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdmFsaWRhdGlvbiBmZWF0dXJlIG9mIHRoZSBYTUwgcGFyc2VyIHVzZWQgd2hlbgorICAgICAqIHBhcnNpbmcgdGxkcyBmaWxlcy4gCisgICAgICogQHBhcmFtIHRsZFZhbGlkYXRpb24gdHJ1ZSB0byBlbmFibGUgeG1sIGluc3RhbmNlIHZhbGlkYXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUbGRWYWxpZGF0aW9uKGJvb2xlYW4gdGxkVmFsaWRhdGlvbik7CisKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgc2VydmVyLnhtbCA8Y29udGV4dD4gYXR0cmlidXRlJ3Mgd2ViWG1sVmFsaWRhdGlvbi4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdmFsaWRhdGlvbiBpcyBlbmFibGVkLgorICAgICAqCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0VGxkVmFsaWRhdGlvbigpOworCisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHNlcnZlci54bWwgPGhvc3Q+IGF0dHJpYnV0ZSdzIHhtbE5hbWVzcGFjZUF3YXJlLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBuYW1lc3BhY2UgYXdhcmVuZXMgaXMgZW5hYmxlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRUbGROYW1lc3BhY2VBd2FyZSgpOworCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG5hbWVzcGFjZSBhd2FyZSBmZWF0dXJlIG9mIHRoZSBYTUwgcGFyc2VyIHVzZWQgd2hlbgorICAgICAqIHBhcnNpbmcgeG1sIGluc3RhbmNlcy4KKyAgICAgKiBAcGFyYW0gdGxkTmFtZXNwYWNlQXdhcmUgdHJ1ZSB0byBlbmFibGUgbmFtZXNwYWNlIGF3YXJlbmVzcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRsZE5hbWVzcGFjZUF3YXJlKGJvb2xlYW4gdGxkTmFtZXNwYWNlQXdhcmUpOworCisKK30KKwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL0VuZ2luZS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL0VuZ2luZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3ZDQ5ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvRW5naW5lLmphdmEKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYTsKKworLyoqCisgKiBBbiA8Yj5FbmdpbmU8L2I+IGlzIGEgQ29udGFpbmVyIHRoYXQgcmVwcmVzZW50cyB0aGUgZW50aXJlIENhdGFsaW5hIHNlcnZsZXQKKyAqIGVuZ2luZS4gIEl0IGlzIHVzZWZ1bCBpbiB0aGUgZm9sbG93aW5nIHR5cGVzIG9mIHNjZW5hcmlvczoKKyAqIDx1bD4KKyAqIDxsaT5Zb3Ugd2lzaCB0byB1c2UgSW50ZXJjZXB0b3JzIHRoYXQgc2VlIGV2ZXJ5IHNpbmdsZSByZXF1ZXN0IHByb2Nlc3NlZAorICogICAgIGJ5IHRoZSBlbnRpcmUgZW5naW5lLgorICogPGxpPllvdSB3aXNoIHRvIHJ1biBDYXRhbGluYSBpbiB3aXRoIGEgc3RhbmRhbG9uZSBIVFRQIGNvbm5lY3RvciwgYnV0IHN0aWxsCisgKiAgICAgd2FudCBzdXBwb3J0IGZvciBtdWx0aXBsZSB2aXJ0dWFsIGhvc3RzLgorICogPC91bD4KKyAqIEluIGdlbmVyYWwsIHlvdSB3b3VsZCBub3QgdXNlIGFuIEVuZ2luZSB3aGVuIGRlcGxveWluZyBDYXRhbGluYSBjb25uZWN0ZWQKKyAqIHRvIGEgd2ViIHNlcnZlciAoc3VjaCBhcyBBcGFjaGUpLCBiZWNhdXNlIHRoZSBDb25uZWN0b3Igd2lsbCBoYXZlCisgKiB1dGlsaXplZCB0aGUgd2ViIHNlcnZlcidzIGZhY2lsaXRpZXMgdG8gZGV0ZXJtaW5lIHdoaWNoIENvbnRleHQgKG9yCisgKiBwZXJoYXBzIGV2ZW4gd2hpY2ggV3JhcHBlcikgc2hvdWxkIGJlIHV0aWxpemVkIHRvIHByb2Nlc3MgdGhpcyByZXF1ZXN0LgorICogPHA+CisgKiBUaGUgY2hpbGQgY29udGFpbmVycyBhdHRhY2hlZCB0byBhbiBFbmdpbmUgYXJlIGdlbmVyYWxseSBpbXBsZW1lbnRhdGlvbnMKKyAqIG9mIEhvc3QgKHJlcHJlc2VudGluZyBhIHZpcnR1YWwgaG9zdCkgb3IgQ29udGV4dCAocmVwcmVzZW50aW5nIGluZGl2aWR1YWwKKyAqIGFuIGluZGl2aWR1YWwgc2VydmxldCBjb250ZXh0KSwgZGVwZW5kaW5nIHVwb24gdGhlIEVuZ2luZSBpbXBsZW1lbnRhdGlvbi4KKyAqIDxwPgorICogSWYgdXNlZCwgYW4gRW5naW5lIGlzIGFsd2F5cyB0aGUgdG9wIGxldmVsIENvbnRhaW5lciBpbiBhIENhdGFsaW5hCisgKiBoaWVyYXJjaHkuIFRoZXJlZm9yZSwgdGhlIGltcGxlbWVudGF0aW9uJ3MgPGNvZGU+c2V0UGFyZW50KCk8L2NvZGU+IG1ldGhvZAorICogc2hvdWxkIHRocm93IDxjb2RlPklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjwvY29kZT4uCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBpbnRlcmZhY2UgRW5naW5lIGV4dGVuZHMgQ29udGFpbmVyIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZGVmYXVsdCBob3N0bmFtZSBmb3IgdGhpcyBFbmdpbmUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0SG9zdCgpOworCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGRlZmF1bHQgaG9zdG5hbWUgZm9yIHRoaXMgRW5naW5lLgorICAgICAqCisgICAgICogQHBhcmFtIGRlZmF1bHRIb3N0IFRoZSBuZXcgZGVmYXVsdCBob3N0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdEhvc3QoU3RyaW5nIGRlZmF1bHRIb3N0KTsKKworCisgICAgLyoqCisgICAgICogUmV0cmlldmUgdGhlIEp2bVJvdXRlSWQgZm9yIHRoaXMgZW5naW5lLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SnZtUm91dGUoKTsKKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBKdm1Sb3V0ZUlkIGZvciB0aGlzIGVuZ2luZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBqdm1Sb3V0ZUlkIHRoZSAobmV3KSBKVk0gUm91dGUgSUQuIEVhY2ggRW5naW5lIHdpdGhpbiBhIGNsdXN0ZXIKKyAgICAgKiAgICAgICAgbXVzdCBoYXZlIGEgdW5pcXVlIEpWTSBSb3V0ZSBJRC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRKdm1Sb3V0ZShTdHJpbmcganZtUm91dGVJZCk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgPGNvZGU+U2VydmljZTwvY29kZT4gd2l0aCB3aGljaCB3ZSBhcmUgYXNzb2NpYXRlZCAoaWYgYW55KS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2VydmljZSBnZXRTZXJ2aWNlKCk7CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgPGNvZGU+U2VydmljZTwvY29kZT4gd2l0aCB3aGljaCB3ZSBhcmUgYXNzb2NpYXRlZCAoaWYgYW55KS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRoYXQgb3ducyB0aGlzIEVuZ2luZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNlcnZpY2UoU2VydmljZSBzZXJ2aWNlKTsKKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvR2xvYmFscy5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL0dsb2JhbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Yjk1ZGQzCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL0dsb2JhbHMuamF2YQpAQCAtMCwwICsxLDMxNyBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYTsKKworCisvKioKKyAqIEdsb2JhbCBjb25zdGFudHMgdGhhdCBhcmUgYXBwbGljYWJsZSB0byBtdWx0aXBsZSBwYWNrYWdlcyB3aXRoaW4gQ2F0YWxpbmEuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBHbG9iYWxzIHsKKworICAgIC8qKgorICAgICAqIFRoZSBzZXJ2bGV0IGNvbnRleHQgYXR0cmlidXRlIHVuZGVyIHdoaWNoIHdlIHN0b3JlIHRoZSBhbHRlcm5hdGUKKyAgICAgKiBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uIAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFMVF9ERF9BVFRSID0gCisgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5hbHRfZGQiOworCisgICAgLyoqCisgICAgICogVGhlIHJlcXVlc3QgYXR0cmlidXRlIHVuZGVyIHdoaWNoIHdlIHN0b3JlIHRoZSBhcnJheSBvZiBYNTA5Q2VydGlmaWNhdGUKKyAgICAgKiBvYmplY3RzIHJlcHJlc2VudGluZyB0aGUgY2VydGlmaWNhdGUgY2hhaW4gcHJlc2VudGVkIGJ5IG91ciBjbGllbnQsCisgICAgICogaWYgYW55LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENFUlRJRklDQVRFU19BVFRSID0KKyAgICAgICAgImphdmF4LnNlcnZsZXQucmVxdWVzdC5YNTA5Q2VydGlmaWNhdGUiOworCisgICAgLyoqCisgICAgICogVGhlIHJlcXVlc3QgYXR0cmlidXRlIHVuZGVyIHdoaWNoIHdlIHN0b3JlIHRoZSBuYW1lIG9mIHRoZSBjaXBoZXIgc3VpdGUKKyAgICAgKiBiZWluZyB1c2VkIG9uIGFuIFNTTCBjb25uZWN0aW9uIChhcyBhbiBvYmplY3Qgb2YgdHlwZQorICAgICAqIGphdmEubGFuZy5TdHJpbmcpLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENJUEhFUl9TVUlURV9BVFRSID0KKyAgICAgICAgImphdmF4LnNlcnZsZXQucmVxdWVzdC5jaXBoZXJfc3VpdGUiOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc2VydmxldCBjb250ZXh0IGF0dHJpYnV0ZSB1bmRlciB3aGljaCB3ZSBzdG9yZSB0aGUgY2xhc3MgbG9hZGVyCisgICAgICogdXNlZCBmb3IgbG9hZGluZyBzZXJ2bGV0cyAoYXMgYW4gb2JqZWN0IG9mIHR5cGUgamF2YS5sYW5nLkNsYXNzTG9hZGVyKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU19MT0FERVJfQVRUUiA9CisgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLmNsYXNzbG9hZGVyIjsKKworICAgIC8qKgorICAgICAqIFJlcXVlc3QgZGlzcGF0Y2hlciBzdGF0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNQQVRDSEVSX1RZUEVfQVRUUiA9IAorICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLkRJU1BBVENIRVJfVFlQRSI7CisKKyAgICAvKioKKyAgICAgKiBSZXF1ZXN0IGRpc3BhdGNoZXIgcGF0aC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNQQVRDSEVSX1JFUVVFU1RfUEFUSF9BVFRSID0gCisgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuRElTUEFUQ0hFUl9SRVFVRVNUX1BBVEgiOworCisgICAgLyoqCisgICAgICogVGhlIEpOREkgZGlyZWN0b3J5IGNvbnRleHQgd2hpY2ggaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb250ZXh0LiBUaGlzCisgICAgICogY29udGV4dCBjYW4gYmUgdXNlZCB0byBtYW5pcHVsYXRlIHN0YXRpYyBmaWxlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPVVJDRVNfQVRUUiA9CisgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLnJlc291cmNlcyI7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzZXJ2bGV0IGNvbnRleHQgYXR0cmlidXRlIHVuZGVyIHdoaWNoIHdlIHN0b3JlIHRoZSBjbGFzcyBwYXRoCisgICAgICogZm9yIG91ciBhcHBsaWNhdGlvbiBjbGFzcyBsb2FkZXIgKGFzIGFuIG9iamVjdCBvZiB0eXBlIFN0cmluZyksCisgICAgICogZGVsaW1pdGVkIHdpdGggdGhlIGFwcHJvcHJpYXRlIHBhdGggZGVsaW1pdGVyIGZvciB0aGlzIHBsYXRmb3JtLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTX1BBVEhfQVRUUiA9CisgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLmpzcF9jbGFzc3BhdGgiOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgcmVxdWVzdCBhdHRyaWJ1dGUgdW5kZXIgd2hpY2ggdGhlIG9yaWdpbmFsIGNvbnRleHQgcGF0aCBpcyBzdG9yZWQKKyAgICAgKiBvbiBhbiBpbmNsdWRlZCBkaXNwYXRjaGVyIHJlcXVlc3QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5DTFVERV9DT05URVhUX1BBVEhfQVRUUiA9CisgICAgICAgICJqYXZheC5zZXJ2bGV0LmluY2x1ZGUuY29udGV4dF9wYXRoIjsKKworICAgIAorICAgIC8qKgorICAgICAqIFRoZSByZXF1ZXN0IGF0dHJpYnV0ZSB1bmRlciB3aGljaCB0aGUgb3JpZ2luYWwgY29udGV4dCBwYXRoIGlzIHN0b3JlZAorICAgICAqIG9uIGFuIGZvcndhcmRlZCBkaXNwYXRjaGVyIHJlcXVlc3QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9SV0FSRF9DT05URVhUX1BBVEhfQVRUUiA9CisgICAgICAgICJqYXZheC5zZXJ2bGV0LmZvcndhcmQuY29udGV4dF9wYXRoIjsKKworCisgICAgLyoqCisgICAgICogVGhlIHJlcXVlc3QgYXR0cmlidXRlIHVuZGVyIHdoaWNoIHdlIGZvcndhcmQgYSBKYXZhIGV4Y2VwdGlvbgorICAgICAqIChhcyBhbiBvYmplY3Qgb2YgdHlwZSBUaHJvd2FibGUpIHRvIGFuIGVycm9yIHBhZ2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhDRVBUSU9OX0FUVFIgPQorICAgICAgICAiamF2YXguc2VydmxldC5lcnJvci5leGNlcHRpb24iOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgcmVxdWVzdCBhdHRyaWJ1dGUgdW5kZXIgd2hpY2ggd2UgZm9yd2FyZCB0aGUgcmVxdWVzdCBVUkkKKyAgICAgKiAoYXMgYW4gb2JqZWN0IG9mIHR5cGUgU3RyaW5nKSBvZiB0aGUgcGFnZSBvbiB3aGljaCBhbiBlcnJvciBvY2N1cnJlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWENFUFRJT05fUEFHRV9BVFRSID0KKyAgICAgICAgImphdmF4LnNlcnZsZXQuZXJyb3IucmVxdWVzdF91cmkiOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgcmVxdWVzdCBhdHRyaWJ1dGUgdW5kZXIgd2hpY2ggd2UgZm9yd2FyZCBhIEphdmEgZXhjZXB0aW9uIHR5cGUKKyAgICAgKiAoYXMgYW4gb2JqZWN0IG9mIHR5cGUgQ2xhc3MpIHRvIGFuIGVycm9yIHBhZ2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhDRVBUSU9OX1RZUEVfQVRUUiA9CisgICAgICAgICJqYXZheC5zZXJ2bGV0LmVycm9yLmV4Y2VwdGlvbl90eXBlIjsKKworCisgICAgLyoqCisgICAgICogVGhlIHJlcXVlc3QgYXR0cmlidXRlIHVuZGVyIHdoaWNoIHdlIGZvcndhcmQgYW4gSFRUUCBzdGF0dXMgbWVzc2FnZQorICAgICAqIChhcyBhbiBvYmplY3Qgb2YgdHlwZSBTVHJpbmcpIHRvIGFuIGVycm9yIHBhZ2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfTUVTU0FHRV9BVFRSID0KKyAgICAgICAgImphdmF4LnNlcnZsZXQuZXJyb3IubWVzc2FnZSI7CisKKworICAgIC8qKgorICAgICAqIFRoZSByZXF1ZXN0IGF0dHJpYnV0ZSB1bmRlciB3aGljaCB0aGUgSW52b2tlciBzZXJ2bGV0IHdpbGwgc3RvcmUKKyAgICAgKiB0aGUgaW52b2tpbmcgc2VydmxldCBwYXRoLCBpZiBpdCB3YXMgdXNlZCB0byBleGVjdXRlIGEgc2VydmxldAorICAgICAqIGluZGlyZWN0bHkgaW5zdGVhZCBvZiB0aHJvdWdoIGEgc2VydmxldCBtYXBwaW5nLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOVk9LRURfQVRUUiA9CisgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLklOVk9LRUQiOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgcmVxdWVzdCBhdHRyaWJ1dGUgdW5kZXIgd2hpY2ggd2UgZXhwb3NlIHRoZSB2YWx1ZSBvZiB0aGUKKyAgICAgKiA8Y29kZT4mbHQ7anNwLWZpbGUmZ3Q7PC9jb2RlPiB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBzZXJ2bGV0LAorICAgICAqIGlmIGFueS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfRklMRV9BVFRSID0KKyAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuanNwX2ZpbGUiOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgcmVxdWVzdCBhdHRyaWJ1dGUgdW5kZXIgd2hpY2ggd2Ugc3RvcmUgdGhlIGtleSBzaXplIGJlaW5nIHVzZWQgZm9yCisgICAgICogdGhpcyBTU0wgY29ubmVjdGlvbiAoYXMgYW4gb2JqZWN0IG9mIHR5cGUgamF2YS5sYW5nLkludGVnZXIpLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9TSVpFX0FUVFIgPQorICAgICAgICAiamF2YXguc2VydmxldC5yZXF1ZXN0LmtleV9zaXplIjsKKworCisgICAgLyoqCisgICAgICogVGhlIHNlcnZsZXQgY29udGV4dCBhdHRyaWJ1dGUgdW5kZXIgd2hpY2ggdGhlIG1hbmFnZWQgYmVhbiBSZWdpc3RyeQorICAgICAqIHdpbGwgYmUgc3RvcmVkIGZvciBwcml2aWxlZ2VkIGNvbnRleHRzIChpZiBlbmFibGVkKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQkVBTl9SRUdJU1RSWV9BVFRSID0KKyAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuUmVnaXN0cnkiOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc2VydmxldCBjb250ZXh0IGF0dHJpYnV0ZSB1bmRlciB3aGljaCB0aGUgTUJlYW5TZXJ2ZXIgd2lsbCBiZSBzdG9yZWQKKyAgICAgKiBmb3IgcHJpdmlsZWdlZCBjb250ZXh0cyAoaWYgZW5hYmxlZCkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUJFQU5fU0VSVkVSX0FUVFIgPQorICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5NQmVhblNlcnZlciI7CisKKworICAgIC8qKgorICAgICAqIFRoZSByZXF1ZXN0IGF0dHJpYnV0ZSB1bmRlciB3aGljaCB3ZSBzdG9yZSB0aGUgc2VydmxldCBuYW1lIG9uIGEKKyAgICAgKiBuYW1lZCBkaXNwYXRjaGVyIHJlcXVlc3QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRURfRElTUEFUQ0hFUl9BVFRSID0KKyAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuTkFNRUQiOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgcmVxdWVzdCBhdHRyaWJ1dGUgdW5kZXIgd2hpY2ggdGhlIG9yaWdpbmFsIHBhdGggaW5mbyBpcyBzdG9yZWQKKyAgICAgKiBvbiBhbiBpbmNsdWRlZCBkaXNwYXRjaGVyIHJlcXVlc3QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5DTFVERV9QQVRIX0lORk9fQVRUUiA9CisgICAgICAgICJqYXZheC5zZXJ2bGV0LmluY2x1ZGUucGF0aF9pbmZvIjsKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgcmVxdWVzdCBhdHRyaWJ1dGUgdW5kZXIgd2hpY2ggdGhlIG9yaWdpbmFsIHBhdGggaW5mbyBpcyBzdG9yZWQKKyAgICAgKiBvbiBhbiBmb3J3YXJkZWQgZGlzcGF0Y2hlciByZXF1ZXN0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUldBUkRfUEFUSF9JTkZPX0FUVFIgPQorICAgICAgICAiamF2YXguc2VydmxldC5mb3J3YXJkLnBhdGhfaW5mbyI7CisKKworICAgIC8qKgorICAgICAqIFRoZSByZXF1ZXN0IGF0dHJpYnV0ZSB1bmRlciB3aGljaCB0aGUgb3JpZ2luYWwgcXVlcnkgc3RyaW5nIGlzIHN0b3JlZAorICAgICAqIG9uIGFuIGluY2x1ZGVkIGRpc3BhdGNoZXIgcmVxdWVzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTkNMVURFX1FVRVJZX1NUUklOR19BVFRSID0KKyAgICAgICAgImphdmF4LnNlcnZsZXQuaW5jbHVkZS5xdWVyeV9zdHJpbmciOworCisgICAgCisgICAgLyoqCisgICAgICogVGhlIHJlcXVlc3QgYXR0cmlidXRlIHVuZGVyIHdoaWNoIHRoZSBvcmlnaW5hbCBxdWVyeSBzdHJpbmcgaXMgc3RvcmVkCisgICAgICogb24gYW4gZm9yd2FyZGVkIGRpc3BhdGNoZXIgcmVxdWVzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JXQVJEX1FVRVJZX1NUUklOR19BVFRSID0KKyAgICAgICAgImphdmF4LnNlcnZsZXQuZm9yd2FyZC5xdWVyeV9zdHJpbmciOworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFRoZSByZXF1ZXN0IGF0dHJpYnV0ZSB1bmRlciB3aGljaCB0aGUgb3JpZ2luYWwgcmVxdWVzdCBVUkkgaXMgc3RvcmVkCisgICAgICogb24gYW4gaW5jbHVkZWQgZGlzcGF0Y2hlciByZXF1ZXN0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOQ0xVREVfUkVRVUVTVF9VUklfQVRUUiA9CisgICAgICAgICJqYXZheC5zZXJ2bGV0LmluY2x1ZGUucmVxdWVzdF91cmkiOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgcmVxdWVzdCBhdHRyaWJ1dGUgdW5kZXIgd2hpY2ggdGhlIG9yaWdpbmFsIHJlcXVlc3QgVVJJIGlzIHN0b3JlZAorICAgICAqIG9uIGFuIGZvcndhcmRlZCBkaXNwYXRjaGVyIHJlcXVlc3QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9SV0FSRF9SRVFVRVNUX1VSSV9BVFRSID0KKyAgICAgICAgImphdmF4LnNlcnZsZXQuZm9yd2FyZC5yZXF1ZXN0X3VyaSI7CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogVGhlIHJlcXVlc3QgYXR0cmlidXRlIHVuZGVyIHdoaWNoIHdlIGZvcndhcmQgYSBzZXJ2bGV0IG5hbWUgdG8KKyAgICAgKiBhbiBlcnJvciBwYWdlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZMRVRfTkFNRV9BVFRSID0KKyAgICAgICAgImphdmF4LnNlcnZsZXQuZXJyb3Iuc2VydmxldF9uYW1lIjsKKworCisgICAgLyoqCisgICAgICogVGhlIHJlcXVlc3QgYXR0cmlidXRlIHVuZGVyIHdoaWNoIHRoZSBvcmlnaW5hbCBzZXJ2bGV0IHBhdGggaXMgc3RvcmVkCisgICAgICogb24gYW4gaW5jbHVkZWQgZGlzcGF0Y2hlciByZXF1ZXN0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOQ0xVREVfU0VSVkxFVF9QQVRIX0FUVFIgPQorICAgICAgICAiamF2YXguc2VydmxldC5pbmNsdWRlLnNlcnZsZXRfcGF0aCI7CisKKworICAgIC8qKgorICAgICAqIFRoZSByZXF1ZXN0IGF0dHJpYnV0ZSB1bmRlciB3aGljaCB0aGUgb3JpZ2luYWwgc2VydmxldCBwYXRoIGlzIHN0b3JlZAorICAgICAqIG9uIGFuIGZvcndhcmRlZCBkaXNwYXRjaGVyIHJlcXVlc3QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9SV0FSRF9TRVJWTEVUX1BBVEhfQVRUUiA9CisgICAgICAgICJqYXZheC5zZXJ2bGV0LmZvcndhcmQuc2VydmxldF9wYXRoIjsKKworICAgIAorICAgIC8qKgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjb29raWUgdXNlZCB0byBwYXNzIHRoZSBzZXNzaW9uIGlkZW50aWZpZXIgYmFjaworICAgICAqIGFuZCBmb3J0aCB3aXRoIHRoZSBjbGllbnQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VTU0lPTl9DT09LSUVfTkFNRSA9ICJKU0VTU0lPTklEIjsKKworCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2YgdGhlIHBhdGggcGFyYW1ldGVyIHVzZWQgdG8gcGFzcyB0aGUgc2Vzc2lvbiBpZGVudGlmaWVyCisgICAgICogYmFjayBhbmQgZm9ydGggd2l0aCB0aGUgY2xpZW50LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFU1NJT05fUEFSQU1FVEVSX05BTUUgPSAianNlc3Npb25pZCI7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzZXJ2bGV0IGNvbnRleHQgYXR0cmlidXRlIHVuZGVyIHdoaWNoIHdlIHN0b3JlIGEgZmxhZyB1c2VkCisgICAgICogdG8gbWFyayB0aGlzIHJlcXVlc3QgYXMgaGF2aW5nIGJlZW4gcHJvY2Vzc2VkIGJ5IHRoZSBTU0lTZXJ2bGV0LgorICAgICAqIFdlIGRvIHRoaXMgYmVjYXVzZSBvZiB0aGUgcGF0aEluZm8gbWFuZ2xpbmcgaGFwcGVuaW5nIHdoZW4gdXNpbmcKKyAgICAgKiB0aGUgQ0dJU2VydmxldCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBTU0kgc2VydmxldC4gKHZhbHVlIHN0b3JlZAorICAgICAqIGFzIGFuIG9iamVjdCBvZiB0eXBlIFN0cmluZykKKyAgICAgKi8KKyAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1NJX0ZMQUdfQVRUUiA9CisgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5zc2kuU1NJU2VydmxldCI7CisKKworICAgIC8qKgorICAgICAqIFRoZSByZXF1ZXN0IGF0dHJpYnV0ZSB1bmRlciB3aGljaCB3ZSBmb3J3YXJkIGFuIEhUVFAgc3RhdHVzIGNvZGUKKyAgICAgKiAoYXMgYW4gb2JqZWN0IG9mIHR5cGUgSW50ZWdlcikgdG8gYW4gZXJyb3IgcGFnZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFUVVNfQ09ERV9BVFRSID0KKyAgICAgICAgImphdmF4LnNlcnZsZXQuZXJyb3Iuc3RhdHVzX2NvZGUiOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc3ViamVjdCB1bmRlciB3aGljaCB0aGUgQWNjZXNzQ29udHJvbENvbnRleHQgaXMgcnVubmluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVUJKRUNUX0FUVFIgPQorICAgICAgICAiamF2YXguc2VjdXJpdHkuYXV0aC5zdWJqZWN0IjsKKworICAgIAorICAgIC8qKgorICAgICAqIFRoZSBzZXJ2bGV0IGNvbnRleHQgYXR0cmlidXRlIHVuZGVyIHdoaWNoIHdlIHJlY29yZCB0aGUgc2V0IG9mCisgICAgICogd2VsY29tZSBmaWxlcyAoYXMgYW4gb2JqZWN0IG9mIHR5cGUgU3RyaW5nW10pIGZvciB0aGlzIGFwcGxpY2F0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFTENPTUVfRklMRVNfQVRUUiA9CisgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLldFTENPTUVfRklMRVMiOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc2VydmxldCBjb250ZXh0IGF0dHJpYnV0ZSB1bmRlciB3aGljaCB3ZSBzdG9yZSBhIHRlbXBvcmFyeQorICAgICAqIHdvcmtpbmcgZGlyZWN0b3J5IChhcyBhbiBvYmplY3Qgb2YgdHlwZSBGaWxlKSBmb3IgdXNlIGJ5IHNlcnZsZXRzCisgICAgICogd2l0aGluIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdPUktfRElSX0FUVFIgPQorICAgICAgICAiamF2YXguc2VydmxldC5jb250ZXh0LnRlbXBkaXIiOworCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9Hcm91cC5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL0dyb3VwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RiMTNiMgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9Hcm91cC5qYXZhCkBAIC0wLDAgKzEsMTIyIEBACisvKgorICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hOworCisKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaW5jaXBhbDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKKworLyoqCisgKiA8cD5BYnN0cmFjdCByZXByZXNlbnRhdGlvbiBvZiBhIGdyb3VwIG9mIHtAbGluayBVc2VyfXMgaW4gYQorICoge0BsaW5rIFVzZXJEYXRhYmFzZX0uICBFYWNoIHVzZXIgdGhhdCBpcyBhIG1lbWJlciBvZiB0aGlzIGdyb3VwCisgKiBpbmhlcml0cyB0aGUge0BsaW5rIFJvbGV9cyBhc3NpZ25lZCB0byB0aGUgZ3JvdXAuPC9wPgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqIEBzaW5jZSA0LjEKKyAqLworCitwdWJsaWMgaW50ZXJmYWNlIEdyb3VwIGV4dGVuZHMgUHJpbmNpcGFsIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZGVzY3JpcHRpb24gb2YgdGhpcyBncm91cC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZGVzY3JpcHRpb24gb2YgdGhpcyBncm91cC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZXNjcmlwdGlvbiBUaGUgbmV3IGRlc2NyaXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBncm91cCBuYW1lIG9mIHRoaXMgZ3JvdXAsIHdoaWNoIG11c3QgYmUgdW5pcXVlCisgICAgICogd2l0aGluIHRoZSBzY29wZSBvZiBhIHtAbGluayBVc2VyRGF0YWJhc2V9LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0R3JvdXBuYW1lKCk7CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZ3JvdXAgbmFtZSBvZiB0aGlzIGdyb3VwLCB3aGljaCBtdXN0IGJlIHVuaXF1ZQorICAgICAqIHdpdGhpbiB0aGUgc2NvcGUgb2YgYSB7QGxpbmsgVXNlckRhdGFiYXNlfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBncm91cG5hbWUgVGhlIG5ldyBncm91cCBuYW1lCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0R3JvdXBuYW1lKFN0cmluZyBncm91cG5hbWUpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNldCBvZiB7QGxpbmsgUm9sZX1zIGFzc2lnbmVkIHNwZWNpZmljYWxseSB0byB0aGlzIGdyb3VwLgorICAgICAqLworICAgIHB1YmxpYyBJdGVyYXRvciBnZXRSb2xlcygpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHtAbGluayBVc2VyRGF0YWJhc2V9IHdpdGhpbiB3aGljaCB0aGlzIEdyb3VwIGlzIGRlZmluZWQuCisgICAgICovCisgICAgcHVibGljIFVzZXJEYXRhYmFzZSBnZXRVc2VyRGF0YWJhc2UoKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXQgb2Yge0BsaW5rIFVzZXJ9cyB0aGF0IGFyZSBtZW1iZXJzIG9mIHRoaXMgZ3JvdXAuCisgICAgICovCisgICAgcHVibGljIEl0ZXJhdG9yIGdldFVzZXJzKCk7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBuZXcge0BsaW5rIFJvbGV9IHRvIHRob3NlIGFzc2lnbmVkIHNwZWNpZmljYWxseSB0byB0aGlzIGdyb3VwLgorICAgICAqCisgICAgICogQHBhcmFtIHJvbGUgVGhlIG5ldyByb2xlCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkUm9sZShSb2xlIHJvbGUpOworCisKKyAgICAvKioKKyAgICAgKiBJcyB0aGlzIGdyb3VwIHNwZWNpZmljYWxseSBhc3NpZ25lZCB0aGUgc3BlY2lmaWVkIHtAbGluayBSb2xlfT8KKyAgICAgKgorICAgICAqIEBwYXJhbSByb2xlIFRoZSByb2xlIHRvIGNoZWNrCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNJblJvbGUoUm9sZSByb2xlKTsKKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGEge0BsaW5rIFJvbGV9IGZyb20gdGhvc2UgYXNzaWduZWQgdG8gdGhpcyBncm91cC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByb2xlIFRoZSBvbGQgcm9sZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVJvbGUoUm9sZSByb2xlKTsKKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGFsbCB7QGxpbmsgUm9sZX1zIGZyb20gdGhvc2UgYXNzaWduZWQgdG8gdGhpcyBncm91cC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVSb2xlcygpOworCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9Ib3N0LmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvSG9zdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiNWNlMmIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvSG9zdC5qYXZhCkBAIC0wLDAgKzEsMjE4IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hOworCisKKworLyoqCisgKiBBIDxiPkhvc3Q8L2I+IGlzIGEgQ29udGFpbmVyIHRoYXQgcmVwcmVzZW50cyBhIHZpcnR1YWwgaG9zdCBpbiB0aGUKKyAqIENhdGFsaW5hIHNlcnZsZXQgZW5naW5lLiAgSXQgaXMgdXNlZnVsIGluIHRoZSBmb2xsb3dpbmcgdHlwZXMgb2Ygc2NlbmFyaW9zOgorICogPHVsPgorICogPGxpPllvdSB3aXNoIHRvIHVzZSBJbnRlcmNlcHRvcnMgdGhhdCBzZWUgZXZlcnkgc2luZ2xlIHJlcXVlc3QgcHJvY2Vzc2VkCisgKiAgICAgYnkgdGhpcyBwYXJ0aWN1bGFyIHZpcnR1YWwgaG9zdC4KKyAqIDxsaT5Zb3Ugd2lzaCB0byBydW4gQ2F0YWxpbmEgaW4gd2l0aCBhIHN0YW5kYWxvbmUgSFRUUCBjb25uZWN0b3IsIGJ1dCBzdGlsbAorICogICAgIHdhbnQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgdmlydHVhbCBob3N0cy4KKyAqIDwvdWw+CisgKiBJbiBnZW5lcmFsLCB5b3Ugd291bGQgbm90IHVzZSBhIEhvc3Qgd2hlbiBkZXBsb3lpbmcgQ2F0YWxpbmEgY29ubmVjdGVkCisgKiB0byBhIHdlYiBzZXJ2ZXIgKHN1Y2ggYXMgQXBhY2hlKSwgYmVjYXVzZSB0aGUgQ29ubmVjdG9yIHdpbGwgaGF2ZQorICogdXRpbGl6ZWQgdGhlIHdlYiBzZXJ2ZXIncyBmYWNpbGl0aWVzIHRvIGRldGVybWluZSB3aGljaCBDb250ZXh0IChvcgorICogcGVyaGFwcyBldmVuIHdoaWNoIFdyYXBwZXIpIHNob3VsZCBiZSB1dGlsaXplZCB0byBwcm9jZXNzIHRoaXMgcmVxdWVzdC4KKyAqIDxwPgorICogVGhlIHBhcmVudCBDb250YWluZXIgYXR0YWNoZWQgdG8gYSBIb3N0IGlzIGdlbmVyYWxseSBhbiBFbmdpbmUsIGJ1dCBtYXkKKyAqIGJlIHNvbWUgb3RoZXIgaW1wbGVtZW50YXRpb24sIG9yIG1heSBiZSBvbWl0dGVkIGlmIGl0IGlzIG5vdCBuZWNlc3NhcnkuCisgKiA8cD4KKyAqIFRoZSBjaGlsZCBjb250YWluZXJzIGF0dGFjaGVkIHRvIGEgSG9zdCBhcmUgZ2VuZXJhbGx5IGltcGxlbWVudGF0aW9ucworICogb2YgQ29udGV4dCAocmVwcmVzZW50aW5nIGFuIGluZGl2aWR1YWwgc2VydmxldCBjb250ZXh0KS4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGludGVyZmFjZSBIb3N0IGV4dGVuZHMgQ29udGFpbmVyIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTWFuaWZlc3QgQ29uc3RhbnRzCisKKworICAgIC8qKgorICAgICAqIFRoZSBDb250YWluZXJFdmVudCBldmVudCB0eXBlIHNlbnQgd2hlbiBhIG5ldyBhbGlhcyBpcyBhZGRlZAorICAgICAqIGJ5IDxjb2RlPmFkZEFsaWFzKCk8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFERF9BTElBU19FVkVOVCA9ICJhZGRBbGlhcyI7CisKKworICAgIC8qKgorICAgICAqIFRoZSBDb250YWluZXJFdmVudCBldmVudCB0eXBlIHNlbnQgd2hlbiBhbiBvbGQgYWxpYXMgaXMgcmVtb3ZlZAorICAgICAqIGJ5IDxjb2RlPnJlbW92ZUFsaWFzKCk8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTU9WRV9BTElBU19FVkVOVCA9ICJyZW1vdmVBbGlhcyI7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGFwcGxpY2F0aW9uIHJvb3QgZm9yIHRoaXMgSG9zdC4gIFRoaXMgY2FuIGJlIGFuIGFic29sdXRlCisgICAgICogcGF0aG5hbWUsIGEgcmVsYXRpdmUgcGF0aG5hbWUsIG9yIGEgVVJMLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXBwQmFzZSgpOworCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGFwcGxpY2F0aW9uIHJvb3QgZm9yIHRoaXMgSG9zdC4gIFRoaXMgY2FuIGJlIGFuIGFic29sdXRlCisgICAgICogcGF0aG5hbWUsIGEgcmVsYXRpdmUgcGF0aG5hbWUsIG9yIGEgVVJMLgorICAgICAqCisgICAgICogQHBhcmFtIGFwcEJhc2UgVGhlIG5ldyBhcHBsaWNhdGlvbiByb290CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QXBwQmFzZShTdHJpbmcgYXBwQmFzZSk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGF1dG8gZGVwbG95IGZsYWcuICBJZiB0cnVlLCBpdCBpbmRpY2F0ZXMgdGhhdCAKKyAgICAgKiB0aGlzIGhvc3QncyBjaGlsZCB3ZWJhcHBzIHNob3VsZCBiZSBkaXNjb3ZyZWQgYW5kIGF1dG9tYXRpY2FsbHkgCisgICAgICogZGVwbG95ZWQgZHluYW1pY2FsbHkuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0QXV0b0RlcGxveSgpOworCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGF1dG8gZGVwbG95IGZsYWcgdmFsdWUgZm9yIHRoaXMgaG9zdC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYXV0b0RlcGxveSBUaGUgbmV3IGF1dG8gZGVwbG95IGZsYWcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBdXRvRGVwbG95KGJvb2xlYW4gYXV0b0RlcGxveSk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgSmF2YSBjbGFzcyBuYW1lIG9mIHRoZSBjb250ZXh0IGNvbmZpZ3VyYXRpb24gY2xhc3MKKyAgICAgKiBmb3IgbmV3IHdlYiBhcHBsaWNhdGlvbnMuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDb25maWdDbGFzcygpOworCisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBKYXZhIGNsYXNzIG5hbWUgb2YgdGhlIGNvbnRleHQgY29uZmlndXJhdGlvbiBjbGFzcworICAgICAqIGZvciBuZXcgd2ViIGFwcGxpY2F0aW9ucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25maWdDbGFzcyBUaGUgbmV3IGNvbnRleHQgY29uZmlndXJhdGlvbiBjbGFzcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbmZpZ0NsYXNzKFN0cmluZyBjb25maWdDbGFzcyk7CisKKyAgICAgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgZGVwbG95IG9uIHN0YXJ0dXAgZmxhZy4gIElmIHRydWUsIGl0IGluZGljYXRlcyAKKyAgICAgKiB0aGF0IHRoaXMgaG9zdCdzIGNoaWxkIHdlYmFwcHMgc2hvdWxkIGJlIGRpc2NvdnJlZCBhbmQgYXV0b21hdGljYWxseSAKKyAgICAgKiBkZXBsb3llZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXREZXBsb3lPblN0YXJ0dXAoKTsKKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBkZXBsb3kgb24gc3RhcnR1cCBmbGFnIHZhbHVlIGZvciB0aGlzIGhvc3QuCisgICAgICogCisgICAgICogQHBhcmFtIGRlcGxveU9uU3RhcnR1cCBUaGUgbmV3IGRlcGxveSBvbiBzdGFydHVwIGZsYWcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREZXBsb3lPblN0YXJ0dXAoYm9vbGVhbiBkZXBsb3lPblN0YXJ0dXApOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGNhbm9uaWNhbCwgZnVsbHkgcXVhbGlmaWVkLCBuYW1lIG9mIHRoZSB2aXJ0dWFsIGhvc3QKKyAgICAgKiB0aGlzIENvbnRhaW5lciByZXByZXNlbnRzLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOworCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNhbm9uaWNhbCwgZnVsbHkgcXVhbGlmaWVkLCBuYW1lIG9mIHRoZSB2aXJ0dWFsIGhvc3QKKyAgICAgKiB0aGlzIENvbnRhaW5lciByZXByZXNlbnRzLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgVmlydHVhbCBob3N0IG5hbWUKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIG5hbWUgaXMgbnVsbAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpOworCisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHNlcnZlci54bWwgPGhvc3Q+IGF0dHJpYnV0ZSdzIHhtbE5hbWVzcGFjZUF3YXJlLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBuYW1lc3BhY2UgYXdhcmVuZXMgaXMgZW5hYmxlZC4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldFhtbE5hbWVzcGFjZUF3YXJlKCk7CisKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgc2VydmVyLnhtbCA8aG9zdD4gYXR0cmlidXRlJ3MgeG1sVmFsaWRhdGlvbi4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdmFsaWRhdGlvbiBpcyBlbmFibGVkLgorICAgICAqCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0WG1sVmFsaWRhdGlvbigpOworCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHZhbGlkYXRpb24gZmVhdHVyZSBvZiB0aGUgWE1MIHBhcnNlciB1c2VkIHdoZW4KKyAgICAgKiBwYXJzaW5nIHhtbCBpbnN0YW5jZXMuCisgICAgICogQHBhcmFtIHhtbFZhbGlkYXRpb24gdHJ1ZSB0byBlbmFibGUgeG1sIGluc3RhbmNlIHZhbGlkYXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRYbWxWYWxpZGF0aW9uKGJvb2xlYW4geG1sVmFsaWRhdGlvbik7CisKKworICAgLyoqCisgICAgICogU2V0IHRoZSBuYW1lc3BhY2UgYXdhcmUgZmVhdHVyZSBvZiB0aGUgWE1MIHBhcnNlciB1c2VkIHdoZW4KKyAgICAgKiBwYXJzaW5nIHhtbCBpbnN0YW5jZXMuCisgICAgICogQHBhcmFtIHhtbE5hbWVzcGFjZUF3YXJlIHRydWUgdG8gZW5hYmxlIG5hbWVzcGFjZSBhd2FyZW5lc3MKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRYbWxOYW1lc3BhY2VBd2FyZShib29sZWFuIHhtbE5hbWVzcGFjZUF3YXJlKTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIEFkZCBhbiBhbGlhcyBuYW1lIHRoYXQgc2hvdWxkIGJlIG1hcHBlZCB0byB0aGlzIHNhbWUgSG9zdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhbGlhcyBUaGUgYWxpYXMgdG8gYmUgYWRkZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRBbGlhcyhTdHJpbmcgYWxpYXMpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNldCBvZiBhbGlhcyBuYW1lcyBmb3IgdGhpcyBIb3N0LiAgSWYgbm9uZSBhcmUgZGVmaW5lZCwKKyAgICAgKiBhIHplcm8gbGVuZ3RoIGFycmF5IGlzIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBmaW5kQWxpYXNlcygpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIENvbnRleHQgdGhhdCB3b3VsZCBiZSB1c2VkIHRvIHByb2Nlc3MgdGhlIHNwZWNpZmllZAorICAgICAqIGhvc3QtcmVsYXRpdmUgcmVxdWVzdCBVUkksIGlmIGFueTsgb3RoZXJ3aXNlIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmkgUmVxdWVzdCBVUkkgdG8gYmUgbWFwcGVkCisgICAgICovCisgICAgcHVibGljIENvbnRleHQgbWFwKFN0cmluZyB1cmkpOworCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBhbGlhcyBuYW1lIGZyb20gdGhlIGFsaWFzZXMgZm9yIHRoaXMgSG9zdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhbGlhcyBBbGlhcyBuYW1lIHRvIGJlIHJlbW92ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVBbGlhcyhTdHJpbmcgYWxpYXMpOworCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9JbnN0YW5jZUV2ZW50LmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvSW5zdGFuY2VFdmVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3ZDk0ODAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvSW5zdGFuY2VFdmVudC5qYXZhCkBAIC0wLDAgKzEsNDQ4IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hOworCisKK2ltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5GaWx0ZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVzcG9uc2U7CisKKworLyoqCisgKiBHZW5lcmFsIGV2ZW50IGZvciBub3RpZnlpbmcgbGlzdGVuZXJzIG9mIHNpZ25pZmljYW50IGV2ZW50cyByZWxhdGVkIHRvCisgKiBhIHNwZWNpZmljIGluc3RhbmNlIG9mIGEgU2VydmxldCwgb3IgYSBzcGVjaWZpYyBpbnN0YW5jZSBvZiBhIEZpbHRlciwKKyAqIGFzIG9wcG9zZWQgdG8gdGhlIFdyYXBwZXIgY29tcG9uZW50IHRoYXQgbWFuYWdlcyBpdC4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIEluc3RhbmNlRXZlbnQKKyAgICBleHRlbmRzIEV2ZW50T2JqZWN0IHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTWFuaWZlc3QgQ29uc3RhbnRzCisKKworICAgIC8qKgorICAgICAqIFRoZSBldmVudCBpbmRpY2F0aW5nIHRoYXQgdGhlIDxjb2RlPmluaXQoKTwvY29kZT4gbWV0aG9kIGlzIGFib3V0CisgICAgICogdG8gYmUgY2FsbGVkIGZvciB0aGlzIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJFRk9SRV9JTklUX0VWRU5UID0gImJlZm9yZUluaXQiOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZXZlbnQgaW5kaWNhdGluZyB0aGF0IHRoZSA8Y29kZT5pbml0KCk8L2NvZGU+IG1ldGhvZCBoYXMgcmV0dXJuZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUZURVJfSU5JVF9FVkVOVCA9ICJhZnRlckluaXQiOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZXZlbnQgaW5kaWNhdGluZyB0aGF0IHRoZSA8Y29kZT5zZXJ2aWNlKCk8L2NvZGU+IG1ldGhvZCBpcyBhYm91dAorICAgICAqIHRvIGJlIGNhbGxlZCBvbiBhIHNlcnZsZXQuICBUaGUgPGNvZGU+c2VydmxldDwvY29kZT4gcHJvcGVydHkgY29udGFpbnMKKyAgICAgKiB0aGUgc2VydmxldCBiZWluZyBjYWxsZWQsIGFuZCB0aGUgPGNvZGU+cmVxdWVzdDwvY29kZT4gYW5kCisgICAgICogPGNvZGU+cmVzcG9uc2U8L2NvZGU+IHByb3BlcnRpZXMgY29udGFpbiB0aGUgY3VycmVudCByZXF1ZXN0IGFuZAorICAgICAqIHJlc3BvbnNlIGJlaW5nIHByb2Nlc3NlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCRUZPUkVfU0VSVklDRV9FVkVOVCA9ICJiZWZvcmVTZXJ2aWNlIjsKKworCisgICAgLyoqCisgICAgICogVGhlIGV2ZW50IGluZGljYXRpbmcgdGhhdCB0aGUgPGNvZGU+c2VydmljZSgpPC9jb2RlPiBtZXRob2QgaGFzCisgICAgICogcmV0dXJuZWQuICBUaGUgPGNvZGU+c2VydmxldDwvY29kZT4gcHJvcGVydHkgY29udGFpbnMgdGhlIHNlcnZsZXQKKyAgICAgKiB0aGF0IHdhcyBjYWxsZWQsIGFuZCB0aGUgPGNvZGU+cmVxdWVzdDwvY29kZT4gYW5kCisgICAgICogPGNvZGU+cmVzcG9uc2U8L2NvZGU+IHByb3BlcnRpZXMgY29udGFpbiB0aGUgY3VycmVudCByZXF1ZXN0IGFuZAorICAgICAqIHJlc3BvbnNlIGJlaW5nIHByb2Nlc3NlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRlRFUl9TRVJWSUNFX0VWRU5UID0gImFmdGVyU2VydmljZSI7CisKKworICAgIC8qKgorICAgICAqIFRoZSBldmVudCBpbmRpY2F0aW5nIHRoYXQgdGhlIDxjb2RlPmRlc3Ryb3k8L2NvZGU+IG1ldGhvZCBpcyBhYm91dAorICAgICAqIHRvIGJlIGNhbGxlZCBmb3IgdGhpcyBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCRUZPUkVfREVTVFJPWV9FVkVOVCA9ICJiZWZvcmVEZXN0cm95IjsKKworCisgICAgLyoqCisgICAgICogVGhlIGV2ZW50IGluZGljYXRpbmcgdGhhdCB0aGUgPGNvZGU+ZGVzdHJveSgpPC9jb2RlPiBtZXRob2QgaGFzCisgICAgICogcmV0dXJuZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUZURVJfREVTVFJPWV9FVkVOVCA9ICJhZnRlckRlc3Ryb3kiOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZXZlbnQgaW5kaWNhdGluZyB0aGF0IHRoZSA8Y29kZT5zZXJ2aWNlKCk8L2NvZGU+IG1ldGhvZCBvZiBhCisgICAgICogc2VydmxldCBhY2Nlc3NlZCB2aWEgYSByZXF1ZXN0IGRpc3BhdGNoZXIgaXMgYWJvdXQgdG8gYmUgY2FsbGVkLgorICAgICAqIFRoZSA8Y29kZT5zZXJ2bGV0PC9jb2RlPiBwcm9wZXJ0eSBjb250YWlucyBhIHJlZmVyZW5jZSB0byB0aGUKKyAgICAgKiBkaXNwYXRjaGVkLXRvIHNlcnZsZXQgaW5zdGFuY2UsIGFuZCB0aGUgPGNvZGU+cmVxdWVzdDwvY29kZT4gYW5kCisgICAgICogPGNvZGU+cmVzcG9uc2U8L2NvZGU+IHByb3BlcnRpZXMgY29udGFpbiB0aGUgY3VycmVudCByZXF1ZXN0IGFuZAorICAgICAqIHJlc3BvbnNlIGJlaW5nIHByb2Nlc3NlZC4gIFRoZSA8Y29kZT53cmFwcGVyPC9jb2RlPiBwcm9wZXJ0eSB3aWxsCisgICAgICogY29udGFpbiBhIHJlZmVyZW5jZSB0byB0aGUgZGlzcGF0Y2hlZC10byBXcmFwcGVyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJFRk9SRV9ESVNQQVRDSF9FVkVOVCA9ICJiZWZvcmVEaXNwYXRjaCI7CisKKworICAgIC8qKgorICAgICAqIFRoZSBldmVudCBpbmRpY2F0aW5nIHRoYXQgdGhlIDxjb2RlPnNlcnZpY2UoKTwvY29kZT4gbWV0aG9kIG9mIGEKKyAgICAgKiBzZXJ2bGV0IGFjY2Vzc2VkIHZpYSBhIHJlcXVlc3QgZGlzcGF0Y2hlciBoYXMgcmV0dXJuZWQuICBUaGUKKyAgICAgKiA8Y29kZT5zZXJ2bGV0PC9jb2RlPiBwcm9wZXJ0eSBjb250YWlucyBhIHJlZmVyZW5jZSB0byB0aGUKKyAgICAgKiBkaXNwYXRjaGVkLXRvIHNlcnZsZXQgaW5zdGFuY2UsIGFuZCB0aGUgPGNvZGU+cmVxdWVzdDwvY29kZT4gYW5kCisgICAgICogPGNvZGU+cmVzcG9uc2U8L2NvZGU+IHByb3BlcnRpZXMgY29udGFpbiB0aGUgY3VycmVudCByZXF1ZXN0IGFuZAorICAgICAqIHJlc3BvbnNlIGJlaW5nIHByb2Nlc3NlZC4gIFRoZSA8Y29kZT53cmFwcGVyPC9jb2RlPiBwcm9wZXJ0eSB3aWxsCisgICAgICogY29udGFpbiBhIHJlZmVyZW5jZSB0byB0aGUgZGlzcGF0Y2hlZC10byBXcmFwcGVyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFGVEVSX0RJU1BBVENIX0VWRU5UID0gImFmdGVyRGlzcGF0Y2giOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZXZlbnQgaW5kaWNhdGluZyB0aGF0IHRoZSA8Y29kZT5kb0ZpbHRlcigpPC9jb2RlPiBtZXRob2Qgb2YgYQorICAgICAqIEZpbHRlciBpcyBhYm91dCB0byBiZSBjYWxsZWQuICBUaGUgPGNvZGU+ZmlsdGVyPC9jb2RlPiBwcm9wZXJ0eQorICAgICAqIGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIHRoZSByZWxldmFudCBmaWx0ZXIgaW5zdGFuY2UsIGFuZCB0aGUKKyAgICAgKiA8Y29kZT5yZXF1ZXN0PC9jb2RlPiBhbmQgPGNvZGU+cmVzcG9uc2U8L2NvZGU+IHByb3BlcnRpZXMgY29udGFpbgorICAgICAqIHRoZSBjdXJyZW50IHJlcXVlc3QgYW5kIHJlc3BvbnNlIGJlaW5nIHByb2Nlc3NlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCRUZPUkVfRklMVEVSX0VWRU5UID0gImJlZm9yZUZpbHRlciI7CisKKworICAgIC8qKgorICAgICAqIFRoZSBldmVudCBpbmRpY2F0aW5nIHRoYXQgdGhlIDxjb2RlPmRvRmlsdGVyKCk8L2NvZGU+IG1ldGhvZCBvZiBhCisgICAgICogRmlsdGVyIGhhcyByZXR1cm5lZC4gIFRoZSA8Y29kZT5maWx0ZXI8L2NvZGU+IHByb3BlcnR5IGNvbnRhaW5zCisgICAgICogYSByZWZlcmVuY2UgdG8gdGhlIHJlbGV2YW50IGZpbHRlciBpbnN0YW5jZSwgYW5kIHRoZQorICAgICAqIDxjb2RlPnJlcXVlc3Q8L2NvZGU+IGFuZCA8Y29kZT5yZXNwb25zZTwvY29kZT4gcHJvcGVydGllcyBjb250YWluCisgICAgICogdGhlIGN1cnJlbnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgYmVpbmcgcHJvY2Vzc2VkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFGVEVSX0ZJTFRFUl9FVkVOVCA9ICJhZnRlckZpbHRlciI7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgSW5zdGFuY2VFdmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycy4gIFRoaXMKKyAgICAgKiBjb25zdHJ1Y3RvciBpcyB1c2VkIGZvciBmaWx0ZXIgbGlmZWN5Y2xlIGV2ZW50cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB3cmFwcGVyIFdyYXBwZXIgbWFuYWdpbmcgdGhpcyBzZXJ2bGV0IGluc3RhbmNlCisgICAgICogQHBhcmFtIGZpbHRlciBGaWx0ZXIgaW5zdGFuY2UgZm9yIHdoaWNoIHRoaXMgZXZlbnQgb2NjdXJyZWQKKyAgICAgKiBAcGFyYW0gdHlwZSBFdmVudCB0eXBlIChyZXF1aXJlZCkKKyAgICAgKi8KKyAgICBwdWJsaWMgSW5zdGFuY2VFdmVudChXcmFwcGVyIHdyYXBwZXIsIEZpbHRlciBmaWx0ZXIsIFN0cmluZyB0eXBlKSB7CisKKyAgICAgIHN1cGVyKHdyYXBwZXIpOworICAgICAgdGhpcy53cmFwcGVyID0gd3JhcHBlcjsKKyAgICAgIHRoaXMuZmlsdGVyID0gZmlsdGVyOworICAgICAgdGhpcy5zZXJ2bGV0ID0gbnVsbDsKKyAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBJbnN0YW5jZUV2ZW50IHdpdGggdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLiAgVGhpcworICAgICAqIGNvbnN0cnVjdG9yIGlzIHVzZWQgZm9yIGZpbHRlciBsaWZlY3ljbGUgZXZlbnRzLgorICAgICAqCisgICAgICogQHBhcmFtIHdyYXBwZXIgV3JhcHBlciBtYW5hZ2luZyB0aGlzIHNlcnZsZXQgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gZmlsdGVyIEZpbHRlciBpbnN0YW5jZSBmb3Igd2hpY2ggdGhpcyBldmVudCBvY2N1cnJlZAorICAgICAqIEBwYXJhbSB0eXBlIEV2ZW50IHR5cGUgKHJlcXVpcmVkKQorICAgICAqIEBwYXJhbSBleGNlcHRpb24gRXhjZXB0aW9uIHRoYXQgb2NjdXJyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgSW5zdGFuY2VFdmVudChXcmFwcGVyIHdyYXBwZXIsIEZpbHRlciBmaWx0ZXIsIFN0cmluZyB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRocm93YWJsZSBleGNlcHRpb24pIHsKKworICAgICAgc3VwZXIod3JhcHBlcik7CisgICAgICB0aGlzLndyYXBwZXIgPSB3cmFwcGVyOworICAgICAgdGhpcy5maWx0ZXIgPSBmaWx0ZXI7CisgICAgICB0aGlzLnNlcnZsZXQgPSBudWxsOworICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICAgIHRoaXMuZXhjZXB0aW9uID0gZXhjZXB0aW9uOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgSW5zdGFuY2VFdmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycy4gIFRoaXMKKyAgICAgKiBjb25zdHJ1Y3RvciBpcyB1c2VkIGZvciBmaWx0ZXIgcHJvY2Vzc2luZyBldmVudHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gd3JhcHBlciBXcmFwcGVyIG1hbmFnaW5nIHRoaXMgc2VydmxldCBpbnN0YW5jZQorICAgICAqIEBwYXJhbSBmaWx0ZXIgRmlsdGVyIGluc3RhbmNlIGZvciB3aGljaCB0aGlzIGV2ZW50IG9jY3VycmVkCisgICAgICogQHBhcmFtIHR5cGUgRXZlbnQgdHlwZSAocmVxdWlyZWQpCisgICAgICogQHBhcmFtIHJlcXVlc3QgU2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFNlcnZsZXQgcmVzcG9uc2Ugd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgSW5zdGFuY2VFdmVudChXcmFwcGVyIHdyYXBwZXIsIEZpbHRlciBmaWx0ZXIsIFN0cmluZyB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgeworCisgICAgICBzdXBlcih3cmFwcGVyKTsKKyAgICAgIHRoaXMud3JhcHBlciA9IHdyYXBwZXI7CisgICAgICB0aGlzLmZpbHRlciA9IGZpbHRlcjsKKyAgICAgIHRoaXMuc2VydmxldCA9IG51bGw7CisgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDsKKyAgICAgIHRoaXMucmVzcG9uc2UgPSByZXNwb25zZTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IEluc3RhbmNlRXZlbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMuICBUaGlzCisgICAgICogY29uc3RydWN0b3IgaXMgdXNlZCBmb3IgZmlsdGVyIHByb2Nlc3NpbmcgZXZlbnRzLgorICAgICAqCisgICAgICogQHBhcmFtIHdyYXBwZXIgV3JhcHBlciBtYW5hZ2luZyB0aGlzIHNlcnZsZXQgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gZmlsdGVyIEZpbHRlciBpbnN0YW5jZSBmb3Igd2hpY2ggdGhpcyBldmVudCBvY2N1cnJlZAorICAgICAqIEBwYXJhbSB0eXBlIEV2ZW50IHR5cGUgKHJlcXVpcmVkKQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBTZXJ2bGV0IHJlc3BvbnNlIHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIGV4Y2VwdGlvbiBFeGNlcHRpb24gdGhhdCBvY2N1cnJlZAorICAgICAqLworICAgIHB1YmxpYyBJbnN0YW5jZUV2ZW50KFdyYXBwZXIgd3JhcHBlciwgRmlsdGVyIGZpbHRlciwgU3RyaW5nIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRocm93YWJsZSBleGNlcHRpb24pIHsKKworICAgICAgc3VwZXIod3JhcHBlcik7CisgICAgICB0aGlzLndyYXBwZXIgPSB3cmFwcGVyOworICAgICAgdGhpcy5maWx0ZXIgPSBmaWx0ZXI7CisgICAgICB0aGlzLnNlcnZsZXQgPSBudWxsOworICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7CisgICAgICB0aGlzLnJlc3BvbnNlID0gcmVzcG9uc2U7CisgICAgICB0aGlzLmV4Y2VwdGlvbiA9IGV4Y2VwdGlvbjsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IEluc3RhbmNlRXZlbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMuICBUaGlzCisgICAgICogY29uc3RydWN0b3IgaXMgdXNlZCBmb3IgcHJvY2Vzc2luZyBzZXJ2bGV0IGxpZmVjeWNsZSBldmVudHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gd3JhcHBlciBXcmFwcGVyIG1hbmFnaW5nIHRoaXMgc2VydmxldCBpbnN0YW5jZQorICAgICAqIEBwYXJhbSBzZXJ2bGV0IFNlcnZsZXQgaW5zdGFuY2UgZm9yIHdoaWNoIHRoaXMgZXZlbnQgb2NjdXJyZWQKKyAgICAgKiBAcGFyYW0gdHlwZSBFdmVudCB0eXBlIChyZXF1aXJlZCkKKyAgICAgKi8KKyAgICBwdWJsaWMgSW5zdGFuY2VFdmVudChXcmFwcGVyIHdyYXBwZXIsIFNlcnZsZXQgc2VydmxldCwgU3RyaW5nIHR5cGUpIHsKKworICAgICAgc3VwZXIod3JhcHBlcik7CisgICAgICB0aGlzLndyYXBwZXIgPSB3cmFwcGVyOworICAgICAgdGhpcy5maWx0ZXIgPSBudWxsOworICAgICAgdGhpcy5zZXJ2bGV0ID0gc2VydmxldDsKKyAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBJbnN0YW5jZUV2ZW50IHdpdGggdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLiAgVGhpcworICAgICAqIGNvbnN0cnVjdG9yIGlzIHVzZWQgZm9yIHByb2Nlc3Npbmcgc2VydmxldCBsaWZlY3ljbGUgZXZlbnRzLgorICAgICAqCisgICAgICogQHBhcmFtIHdyYXBwZXIgV3JhcHBlciBtYW5hZ2luZyB0aGlzIHNlcnZsZXQgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gc2VydmxldCBTZXJ2bGV0IGluc3RhbmNlIGZvciB3aGljaCB0aGlzIGV2ZW50IG9jY3VycmVkCisgICAgICogQHBhcmFtIHR5cGUgRXZlbnQgdHlwZSAocmVxdWlyZWQpCisgICAgICogQHBhcmFtIGV4Y2VwdGlvbiBFeGNlcHRpb24gdGhhdCBvY2N1cnJlZAorICAgICAqLworICAgIHB1YmxpYyBJbnN0YW5jZUV2ZW50KFdyYXBwZXIgd3JhcHBlciwgU2VydmxldCBzZXJ2bGV0LCBTdHJpbmcgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUaHJvd2FibGUgZXhjZXB0aW9uKSB7CisKKyAgICAgIHN1cGVyKHdyYXBwZXIpOworICAgICAgdGhpcy53cmFwcGVyID0gd3JhcHBlcjsKKyAgICAgIHRoaXMuZmlsdGVyID0gbnVsbDsKKyAgICAgIHRoaXMuc2VydmxldCA9IHNlcnZsZXQ7CisgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgICAgdGhpcy5leGNlcHRpb24gPSBleGNlcHRpb247CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBJbnN0YW5jZUV2ZW50IHdpdGggdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLiAgVGhpcworICAgICAqIGNvbnN0cnVjdG9yIGlzIHVzZWQgZm9yIHByb2Nlc3Npbmcgc2VydmxldCBwcm9jZXNzaW5nIGV2ZW50cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB3cmFwcGVyIFdyYXBwZXIgbWFuYWdpbmcgdGhpcyBzZXJ2bGV0IGluc3RhbmNlCisgICAgICogQHBhcmFtIHNlcnZsZXQgU2VydmxldCBpbnN0YW5jZSBmb3Igd2hpY2ggdGhpcyBldmVudCBvY2N1cnJlZAorICAgICAqIEBwYXJhbSB0eXBlIEV2ZW50IHR5cGUgKHJlcXVpcmVkKQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBTZXJ2bGV0IHJlc3BvbnNlIHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICovCisgICAgcHVibGljIEluc3RhbmNlRXZlbnQoV3JhcHBlciB3cmFwcGVyLCBTZXJ2bGV0IHNlcnZsZXQsIFN0cmluZyB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgeworCisgICAgICBzdXBlcih3cmFwcGVyKTsKKyAgICAgIHRoaXMud3JhcHBlciA9IHdyYXBwZXI7CisgICAgICB0aGlzLmZpbHRlciA9IG51bGw7CisgICAgICB0aGlzLnNlcnZsZXQgPSBzZXJ2bGV0OworICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7CisgICAgICB0aGlzLnJlc3BvbnNlID0gcmVzcG9uc2U7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBJbnN0YW5jZUV2ZW50IHdpdGggdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLiAgVGhpcworICAgICAqIGNvbnN0cnVjdG9yIGlzIHVzZWQgZm9yIHByb2Nlc3Npbmcgc2VydmxldCBwcm9jZXNzaW5nIGV2ZW50cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB3cmFwcGVyIFdyYXBwZXIgbWFuYWdpbmcgdGhpcyBzZXJ2bGV0IGluc3RhbmNlCisgICAgICogQHBhcmFtIHNlcnZsZXQgU2VydmxldCBpbnN0YW5jZSBmb3Igd2hpY2ggdGhpcyBldmVudCBvY2N1cnJlZAorICAgICAqIEBwYXJhbSB0eXBlIEV2ZW50IHR5cGUgKHJlcXVpcmVkKQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBTZXJ2bGV0IHJlc3BvbnNlIHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIGV4Y2VwdGlvbiBFeGNlcHRpb24gdGhhdCBvY2N1cnJlZAorICAgICAqLworICAgIHB1YmxpYyBJbnN0YW5jZUV2ZW50KFdyYXBwZXIgd3JhcHBlciwgU2VydmxldCBzZXJ2bGV0LCBTdHJpbmcgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgVGhyb3dhYmxlIGV4Y2VwdGlvbikgeworCisgICAgICBzdXBlcih3cmFwcGVyKTsKKyAgICAgIHRoaXMud3JhcHBlciA9IHdyYXBwZXI7CisgICAgICB0aGlzLmZpbHRlciA9IG51bGw7CisgICAgICB0aGlzLnNlcnZsZXQgPSBzZXJ2bGV0OworICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7CisgICAgICB0aGlzLnJlc3BvbnNlID0gcmVzcG9uc2U7CisgICAgICB0aGlzLmV4Y2VwdGlvbiA9IGV4Y2VwdGlvbjsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBleGNlcHRpb24gdGhhdCB3YXMgdGhyb3duIGR1cmluZyB0aGUgcHJvY2Vzc2luZyBiZWluZyByZXBvcnRlZAorICAgICAqIGJ5IHRoaXMgZXZlbnQgKEFGVEVSX0lOSVRfRVZFTlQsIEFGVEVSX1NFUlZJQ0VfRVZFTlQsIAorICAgICAqIEFGVEVSX0RFU1RST1lfRVZFTlQsIEFGVEVSX0RJU1BBVENIX0VWRU5ULCBhbmQgQUZURVJfRklMVEVSX0VWRU5UIG9ubHkpLgorICAgICAqLworICAgIHByaXZhdGUgVGhyb3dhYmxlIGV4Y2VwdGlvbiA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBGaWx0ZXIgaW5zdGFuY2UgZm9yIHdoaWNoIHRoaXMgZXZlbnQgb2NjdXJyZWQgKEJFRk9SRV9GSUxURVJfRVZFTlQKKyAgICAgKiBhbmQgQUZURVJfRklMVEVSX0VWRU5UIG9ubHkpLgorICAgICAqLworICAgIHByaXZhdGUgRmlsdGVyIGZpbHRlciA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzZXJ2bGV0IHJlcXVlc3QgYmVpbmcgcHJvY2Vzc2VkIChCRUZPUkVfRklMVEVSX0VWRU5ULAorICAgICAqIEFGVEVSX0ZJTFRFUl9FVkVOVCwgQkVGT1JFX1NFUlZJQ0VfRVZFTlQsIGFuZCBBRlRFUl9TRVJWSUNFX0VWRU5UKS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc2VydmxldCByZXNwb25zZSBiZWluZyBwcm9jZXNzZWQgKEJFRk9SRV9GSUxURVJfRVZFTlQsCisgICAgICogQUZURVJfRklMVEVSX0VWRU5ULCBCRUZPUkVfU0VSVklDRV9FVkVOVCwgYW5kIEFGVEVSX1NFUlZJQ0VfRVZFTlQpLgorICAgICAqLworICAgIHByaXZhdGUgU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIFNlcnZsZXQgaW5zdGFuY2UgZm9yIHdoaWNoIHRoaXMgZXZlbnQgb2NjdXJyZWQgKG5vdCBwcmVzZW50IG9uCisgICAgICogQkVGT1JFX0ZJTFRFUl9FVkVOVCBvciBBRlRFUl9GSUxURVJfRVZFTlQgZXZlbnRzKS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFNlcnZsZXQgc2VydmxldCA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBldmVudCB0eXBlIHRoaXMgaW5zdGFuY2UgcmVwcmVzZW50cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyB0eXBlID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIFdyYXBwZXIgbWFuYWdpbmcgdGhlIHNlcnZsZXQgaW5zdGFuY2UgZm9yIHdoaWNoIHRoaXMgZXZlbnQgb2NjdXJyZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBXcmFwcGVyIHdyYXBwZXIgPSBudWxsOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBleGNlcHRpb24gdGhhdCBvY2N1cnJlZCBkdXJpbmcgdGhlIHByb2Nlc3NpbmcKKyAgICAgKiB0aGF0IHdhcyByZXBvcnRlZCBieSB0aGlzIGV2ZW50LgorICAgICAqLworICAgIHB1YmxpYyBUaHJvd2FibGUgZ2V0RXhjZXB0aW9uKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5leGNlcHRpb24pOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGZpbHRlciBpbnN0YW5jZSBmb3Igd2hpY2ggdGhpcyBldmVudCBvY2N1cnJlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmlsdGVyIGdldEZpbHRlcigpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMuZmlsdGVyKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXJ2bGV0IHJlcXVlc3QgZm9yIHdoaWNoIHRoaXMgZXZlbnQgb2NjdXJyZWQuCisgICAgICovCisgICAgcHVibGljIFNlcnZsZXRSZXF1ZXN0IGdldFJlcXVlc3QoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLnJlcXVlc3QpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNlcnZsZXQgcmVzcG9uc2UgZm9yIHdoaWNoIHRoaXMgZXZlbnQgb2NjdXJyZWQuCisgICAgICovCisgICAgcHVibGljIFNlcnZsZXRSZXNwb25zZSBnZXRSZXNwb25zZSgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMucmVzcG9uc2UpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNlcnZsZXQgaW5zdGFuY2UgZm9yIHdoaWNoIHRoaXMgZXZlbnQgb2NjdXJyZWQuCisgICAgICovCisgICAgcHVibGljIFNlcnZsZXQgZ2V0U2VydmxldCgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMuc2VydmxldCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZXZlbnQgdHlwZSBvZiB0aGlzIGV2ZW50LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMudHlwZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgV3JhcHBlciBtYW5hZ2luZyB0aGUgc2VydmxldCBpbnN0YW5jZSBmb3Igd2hpY2ggdGhpcworICAgICAqIGV2ZW50IG9jY3VycmVkLgorICAgICAqLworICAgIHB1YmxpYyBXcmFwcGVyIGdldFdyYXBwZXIoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLndyYXBwZXIpOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9JbnN0YW5jZUxpc3RlbmVyLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvSW5zdGFuY2VMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlZWJmMzYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvSW5zdGFuY2VMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmE7CisKKworLyoqCisgKiBJbnRlcmZhY2UgZGVmaW5pbmcgYSBsaXN0ZW5lciBmb3Igc2lnbmlmaWNhbnQgZXZlbnRzIHJlbGF0ZWQgdG8gYQorICogc3BlY2lmaWMgc2VydmxldCBpbnN0YW5jZSwgcmF0aGVyIHRoYW4gdG8gdGhlIFdyYXBwZXIgY29tcG9uZW50IHRoYXQKKyAqIGlzIG1hbmFnaW5nIHRoYXQgaW5zdGFuY2UuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBpbnRlcmZhY2UgSW5zdGFuY2VMaXN0ZW5lciB7CisKKworICAgIC8qKgorICAgICAqIEFja25vd2xlZGdlIHRoZSBvY2N1cnJlbmNlIG9mIHRoZSBzcGVjaWZpZWQgZXZlbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnQgSW5zdGFuY2VFdmVudCB0aGF0IGhhcyBvY2N1cnJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGluc3RhbmNlRXZlbnQoSW5zdGFuY2VFdmVudCBldmVudCk7CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL0xpZmVjeWNsZS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL0xpZmVjeWNsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0MTNiNWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvTGlmZWN5Y2xlLmphdmEKQEAgLTAsMCArMSwxMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmE7CisKKworLyoqCisgKiBDb21tb24gaW50ZXJmYWNlIGZvciBjb21wb25lbnQgbGlmZSBjeWNsZSBtZXRob2RzLiAgQ2F0YWxpbmEgY29tcG9uZW50cworICogbWF5LCBidXQgYXJlIG5vdCByZXF1aXJlZCB0bywgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIChhcyB3ZWxsIGFzIHRoZQorICogYXBwcm9wcmlhdGUgaW50ZXJmYWNlKHMpIGZvciB0aGUgZnVuY3Rpb25hbGl0eSB0aGV5IHN1cHBvcnQpIGluIG9yZGVyIHRvCisgKiBwcm92aWRlIGEgY29uc2lzdGVudCBtZWNoYW5pc20gdG8gc3RhcnQgYW5kIHN0b3AgdGhlIGNvbXBvbmVudC4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGludGVyZmFjZSBMaWZlY3ljbGUgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNYW5pZmVzdCBDb25zdGFudHMKKworCisgICAgLyoqCisgICAgICogVGhlIExpZmVjeWNsZUV2ZW50IHR5cGUgZm9yIHRoZSAiY29tcG9uZW50IGluaXQiIGV2ZW50LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOSVRfRVZFTlQgPSAiaW5pdCI7CisKKworICAgIC8qKgorICAgICAqIFRoZSBMaWZlY3ljbGVFdmVudCB0eXBlIGZvciB0aGUgImNvbXBvbmVudCBzdGFydCIgZXZlbnQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBUlRfRVZFTlQgPSAic3RhcnQiOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgTGlmZWN5Y2xlRXZlbnQgdHlwZSBmb3IgdGhlICJjb21wb25lbnQgYmVmb3JlIHN0YXJ0IiBldmVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCRUZPUkVfU1RBUlRfRVZFTlQgPSAiYmVmb3JlX3N0YXJ0IjsKKworCisgICAgLyoqCisgICAgICogVGhlIExpZmVjeWNsZUV2ZW50IHR5cGUgZm9yIHRoZSAiY29tcG9uZW50IGFmdGVyIHN0YXJ0IiBldmVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRlRFUl9TVEFSVF9FVkVOVCA9ICJhZnRlcl9zdGFydCI7CisKKworICAgIC8qKgorICAgICAqIFRoZSBMaWZlY3ljbGVFdmVudCB0eXBlIGZvciB0aGUgImNvbXBvbmVudCBzdG9wIiBldmVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVE9QX0VWRU5UID0gInN0b3AiOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgTGlmZWN5Y2xlRXZlbnQgdHlwZSBmb3IgdGhlICJjb21wb25lbnQgYmVmb3JlIHN0b3AiIGV2ZW50LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJFRk9SRV9TVE9QX0VWRU5UID0gImJlZm9yZV9zdG9wIjsKKworCisgICAgLyoqCisgICAgICogVGhlIExpZmVjeWNsZUV2ZW50IHR5cGUgZm9yIHRoZSAiY29tcG9uZW50IGFmdGVyIHN0b3AiIGV2ZW50LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFGVEVSX1NUT1BfRVZFTlQgPSAiYWZ0ZXJfc3RvcCI7CisKKworICAgIC8qKgorICAgICAqIFRoZSBMaWZlY3ljbGVFdmVudCB0eXBlIGZvciB0aGUgImNvbXBvbmVudCBkZXN0cm95IiBldmVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERVNUUk9ZX0VWRU5UID0gImRlc3Ryb3kiOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogQWRkIGEgTGlmZWN5Y2xlRXZlbnQgbGlzdGVuZXIgdG8gdGhpcyBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRvIGFkZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZExpZmVjeWNsZUxpc3RlbmVyKExpZmVjeWNsZUxpc3RlbmVyIGxpc3RlbmVyKTsKKworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBsaWZlY3ljbGUgbGlzdGVuZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGxpZmVjeWNsZS4gSWYgdGhpcyAKKyAgICAgKiBMaWZlY3ljbGUgaGFzIG5vIGxpc3RlbmVycyByZWdpc3RlcmVkLCBhIHplcm8tbGVuZ3RoIGFycmF5IGlzIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBMaWZlY3ljbGVMaXN0ZW5lcltdIGZpbmRMaWZlY3ljbGVMaXN0ZW5lcnMoKTsKKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGEgTGlmZWN5Y2xlRXZlbnQgbGlzdGVuZXIgZnJvbSB0aGlzIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgdG8gcmVtb3ZlCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlTGlmZWN5Y2xlTGlzdGVuZXIoTGlmZWN5Y2xlTGlzdGVuZXIgbGlzdGVuZXIpOworCisKKyAgICAvKioKKyAgICAgKiBQcmVwYXJlIGZvciB0aGUgYmVnaW5uaW5nIG9mIGFjdGl2ZSB1c2Ugb2YgdGhlIHB1YmxpYyBtZXRob2RzIG9mIHRoaXMKKyAgICAgKiBjb21wb25lbnQuICBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSBhbnkgb2YgdGhlIHB1YmxpYworICAgICAqIG1ldGhvZHMgb2YgdGhpcyBjb21wb25lbnQgYXJlIHV0aWxpemVkLiAgSXQgc2hvdWxkIGFsc28gc2VuZCBhCisgICAgICogTGlmZWN5Y2xlRXZlbnQgb2YgdHlwZSBTVEFSVF9FVkVOVCB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIExpZmVjeWNsZUV4Y2VwdGlvbiBpZiB0aGlzIGNvbXBvbmVudCBkZXRlY3RzIGEgZmF0YWwgZXJyb3IKKyAgICAgKiAgdGhhdCBwcmV2ZW50cyB0aGlzIGNvbXBvbmVudCBmcm9tIGJlaW5nIHVzZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb247CisKKworICAgIC8qKgorICAgICAqIEdyYWNlZnVsbHkgdGVybWluYXRlIHRoZSBhY3RpdmUgdXNlIG9mIHRoZSBwdWJsaWMgbWV0aG9kcyBvZiB0aGlzCisgICAgICogY29tcG9uZW50LiAgVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHRoZSBsYXN0IG9uZSBjYWxsZWQgb24gYSBnaXZlbgorICAgICAqIGluc3RhbmNlIG9mIHRoaXMgY29tcG9uZW50LiAgSXQgc2hvdWxkIGFsc28gc2VuZCBhIExpZmVjeWNsZUV2ZW50CisgICAgICogb2YgdHlwZSBTVE9QX0VWRU5UIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTGlmZWN5Y2xlRXhjZXB0aW9uIGlmIHRoaXMgY29tcG9uZW50IGRldGVjdHMgYSBmYXRhbCBlcnJvcgorICAgICAqICB0aGF0IG5lZWRzIHRvIGJlIHJlcG9ydGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcCgpIHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb247CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL0xpZmVjeWNsZUV2ZW50LmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvTGlmZWN5Y2xlRXZlbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTM0NWI0Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL0xpZmVjeWNsZUV2ZW50LmphdmEKQEAgLTAsMCArMSwxMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmE7CisKKworaW1wb3J0IGphdmEudXRpbC5FdmVudE9iamVjdDsKKworCisvKioKKyAqIEdlbmVyYWwgZXZlbnQgZm9yIG5vdGlmeWluZyBsaXN0ZW5lcnMgb2Ygc2lnbmlmaWNhbnQgY2hhbmdlcyBvbiBhIGNvbXBvbmVudAorICogdGhhdCBpbXBsZW1lbnRzIHRoZSBMaWZlY3ljbGUgaW50ZXJmYWNlLiAgSW4gcGFydGljdWxhciwgdGhpcyB3aWxsIGJlIHVzZWZ1bAorICogb24gQ29udGFpbmVycywgd2hlcmUgdGhlc2UgZXZlbnRzIHJlcGxhY2UgdGhlIENvbnRleHRJbnRlcmNlcHRvciBjb25jZXB0IGluCisgKiBUb21jYXQgMy54LgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgTGlmZWN5Y2xlRXZlbnQKKyAgICBleHRlbmRzIEV2ZW50T2JqZWN0IHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBMaWZlY3ljbGVFdmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaWZlY3ljbGUgQ29tcG9uZW50IG9uIHdoaWNoIHRoaXMgZXZlbnQgb2NjdXJyZWQKKyAgICAgKiBAcGFyYW0gdHlwZSBFdmVudCB0eXBlIChyZXF1aXJlZCkKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlmZWN5Y2xlRXZlbnQoTGlmZWN5Y2xlIGxpZmVjeWNsZSwgU3RyaW5nIHR5cGUpIHsKKworICAgICAgICB0aGlzKGxpZmVjeWNsZSwgdHlwZSwgbnVsbCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBMaWZlY3ljbGVFdmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaWZlY3ljbGUgQ29tcG9uZW50IG9uIHdoaWNoIHRoaXMgZXZlbnQgb2NjdXJyZWQKKyAgICAgKiBAcGFyYW0gdHlwZSBFdmVudCB0eXBlIChyZXF1aXJlZCkKKyAgICAgKiBAcGFyYW0gZGF0YSBFdmVudCBkYXRhIChpZiBhbnkpCisgICAgICovCisgICAgcHVibGljIExpZmVjeWNsZUV2ZW50KExpZmVjeWNsZSBsaWZlY3ljbGUsIFN0cmluZyB0eXBlLCBPYmplY3QgZGF0YSkgeworCisgICAgICAgIHN1cGVyKGxpZmVjeWNsZSk7CisgICAgICAgIHRoaXMubGlmZWN5Y2xlID0gbGlmZWN5Y2xlOworICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgICAgICB0aGlzLmRhdGEgPSBkYXRhOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIGV2ZW50IGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZXZlbnQuCisgICAgICovCisgICAgcHJpdmF0ZSBPYmplY3QgZGF0YSA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBMaWZlY3ljbGUgb24gd2hpY2ggdGhpcyBldmVudCBvY2N1cnJlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIExpZmVjeWNsZSBsaWZlY3ljbGUgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZXZlbnQgdHlwZSB0aGlzIGluc3RhbmNlIHJlcHJlc2VudHMuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgdHlwZSA9IG51bGw7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGV2ZW50IGRhdGEgb2YgdGhpcyBldmVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldERhdGEoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLmRhdGEpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIExpZmVjeWNsZSBvbiB3aGljaCB0aGlzIGV2ZW50IG9jY3VycmVkLgorICAgICAqLworICAgIHB1YmxpYyBMaWZlY3ljbGUgZ2V0TGlmZWN5Y2xlKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5saWZlY3ljbGUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGV2ZW50IHR5cGUgb2YgdGhpcyBldmVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLnR5cGUpOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9MaWZlY3ljbGVFeGNlcHRpb24uamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9MaWZlY3ljbGVFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGVhMzA1Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL0xpZmVjeWNsZUV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTQ0IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hOworCisKKy8qKgorICogR2VuZXJhbCBwdXJwb3NlIGV4Y2VwdGlvbiB0aGF0IGlzIHRocm93biB0byBpbmRpY2F0ZSBhIGxpZmVjeWNsZSByZWxhdGVkCisgKiBwcm9ibGVtLiAgU3VjaCBleGNlcHRpb25zIHNob3VsZCBnZW5lcmFsbHkgYmUgY29uc2lkZXJlZCBmYXRhbCB0byB0aGUKKyAqIG9wZXJhdGlvbiBvZiB0aGUgYXBwbGljYXRpb24gY29udGFpbmluZyB0aGlzIGNvbXBvbmVudC4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIExpZmVjeWNsZUV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7CisKKworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgTGlmZWN5Y2xlRXhjZXB0aW9uIHdpdGggbm8gb3RoZXIgaW5mb3JtYXRpb24uCisgICAgICovCisgICAgcHVibGljIExpZmVjeWNsZUV4Y2VwdGlvbigpIHsKKworICAgICAgICB0aGlzKG51bGwsIG51bGwpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgTGlmZWN5Y2xlRXhjZXB0aW9uIGZvciB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVzc2FnZSBNZXNzYWdlIGRlc2NyaWJpbmcgdGhpcyBleGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlmZWN5Y2xlRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7CisKKyAgICAgICAgdGhpcyhtZXNzYWdlLCBudWxsKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IExpZmVjeWNsZUV4Y2VwdGlvbiBmb3IgdGhlIHNwZWNpZmllZCB0aHJvd2FibGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGhyb3dhYmxlIFRocm93YWJsZSB0aGF0IGNhdXNlZCB0aGlzIGV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBMaWZlY3ljbGVFeGNlcHRpb24oVGhyb3dhYmxlIHRocm93YWJsZSkgeworCisgICAgICAgIHRoaXMobnVsbCwgdGhyb3dhYmxlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IExpZmVjeWNsZUV4Y2VwdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBtZXNzYWdlCisgICAgICogYW5kIHRocm93YWJsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXNzYWdlIE1lc3NhZ2UgZGVzY3JpYmluZyB0aGlzIGV4Y2VwdGlvbgorICAgICAqIEBwYXJhbSB0aHJvd2FibGUgVGhyb3dhYmxlIHRoYXQgY2F1c2VkIHRoaXMgZXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIExpZmVjeWNsZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIHRocm93YWJsZSkgeworCisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7CisgICAgICAgIHRoaXMudGhyb3dhYmxlID0gdGhyb3dhYmxlOworCisgICAgfQorCisKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIGVycm9yIG1lc3NhZ2UgcGFzc2VkIHRvIG91ciBjb25zdHJ1Y3RvciAoaWYgYW55KQorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgbWVzc2FnZSA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSB1bmRlcmx5aW5nIGV4Y2VwdGlvbiBvciBlcnJvciBwYXNzZWQgdG8gb3VyIGNvbnN0cnVjdG9yIChpZiBhbnkpCisgICAgICovCisgICAgcHJvdGVjdGVkIFRocm93YWJsZSB0aHJvd2FibGUgPSBudWxsOworCisKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbWVzc2FnZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBleGNlcHRpb24sIGlmIGFueS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7CisKKyAgICAgICAgcmV0dXJuIChtZXNzYWdlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdGhyb3dhYmxlIHRoYXQgY2F1c2VkIHRoaXMgZXhjZXB0aW9uLCBpZiBhbnkuCisgICAgICovCisgICAgcHVibGljIFRocm93YWJsZSBnZXRUaHJvd2FibGUoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aHJvd2FibGUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBmb3JtYXR0ZWQgc3RyaW5nIHRoYXQgZGVzY3JpYmVzIHRoaXMgZXhjZXB0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiTGlmZWN5Y2xlRXhjZXB0aW9uOiAgIik7CisgICAgICAgIGlmIChtZXNzYWdlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZChtZXNzYWdlKTsKKyAgICAgICAgICAgIGlmICh0aHJvd2FibGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiOiAgIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRocm93YWJsZSAhPSBudWxsKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQodGhyb3dhYmxlLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoc2IudG9TdHJpbmcoKSk7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL0xpZmVjeWNsZUxpc3RlbmVyLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvTGlmZWN5Y2xlTGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGUzYWM4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL0xpZmVjeWNsZUxpc3RlbmVyLmphdmEKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYTsKKworCisKKworLyoqCisgKiBJbnRlcmZhY2UgZGVmaW5pbmcgYSBsaXN0ZW5lciBmb3Igc2lnbmlmaWNhbnQgZXZlbnRzIChpbmNsdWRpbmcgImNvbXBvbmVudAorICogc3RhcnQiIGFuZCAiY29tcG9uZW50IHN0b3AiIGdlbmVyYXRlZCBieSBhIGNvbXBvbmVudCB0aGF0IGltcGxlbWVudHMgdGhlCisgKiBMaWZlY3ljbGUgaW50ZXJmYWNlLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgaW50ZXJmYWNlIExpZmVjeWNsZUxpc3RlbmVyIHsKKworCisgICAgLyoqCisgICAgICogQWNrbm93bGVkZ2UgdGhlIG9jY3VycmVuY2Ugb2YgdGhlIHNwZWNpZmllZCBldmVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudCBMaWZlY3ljbGVFdmVudCB0aGF0IGhhcyBvY2N1cnJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGxpZmVjeWNsZUV2ZW50KExpZmVjeWNsZUV2ZW50IGV2ZW50KTsKKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvTG9hZGVyLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvTG9hZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY5OGQzNgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9Mb2FkZXIuamF2YQpAQCAtMCwwICsxLDE2MCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYTsKKworCitpbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOworCisKKy8qKgorICogQSA8Yj5Mb2FkZXI8L2I+IHJlcHJlc2VudHMgYSBKYXZhIENsYXNzTG9hZGVyIGltcGxlbWVudGF0aW9uIHRoYXQgY2FuCisgKiBiZSB1c2VkIGJ5IGEgQ29udGFpbmVyIHRvIGxvYWQgY2xhc3MgZmlsZXMgKHdpdGhpbiBhIHJlcG9zaXRvcnkgYXNzb2NpYXRlZAorICogd2l0aCB0aGUgTG9hZGVyKSB0aGF0IGFyZSBkZXNpZ25lZCB0byBiZSByZWxvYWRlZCB1cG9uIHJlcXVlc3QsIGFzIHdlbGwgYXMKKyAqIGEgbWVjaGFuaXNtIHRvIGRldGVjdCB3aGV0aGVyIGNoYW5nZXMgaGF2ZSBvY2N1cnJlZCBpbiB0aGUgdW5kZXJseWluZworICogcmVwb3NpdG9yeS4KKyAqIDxwPgorICogSW4gb3JkZXIgZm9yIGEgPGNvZGU+TG9hZGVyPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiB0byBzdWNjZXNzZnVsbHkgb3BlcmF0ZQorICogd2l0aCBhIDxjb2RlPkNvbnRleHQ8L2NvZGU+IGltcGxlbWVudGF0aW9uIHRoYXQgaW1wbGVtZW50cyByZWxvYWRpbmcsIGl0CisgKiBtdXN0IG9iZXkgdGhlIGZvbGxvd2luZyBjb25zdHJhaW50czoKKyAqIDx1bD4KKyAqIDxsaT5NdXN0IGltcGxlbWVudCA8Y29kZT5MaWZlY3ljbGU8L2NvZGU+IHNvIHRoYXQgdGhlIENvbnRleHQgY2FuIGluZGljYXRlCisgKiAgICAgdGhhdCBhIG5ldyBjbGFzcyBsb2FkZXIgaXMgcmVxdWlyZWQuCisgKiA8bGk+VGhlIDxjb2RlPnN0YXJ0KCk8L2NvZGU+IG1ldGhvZCBtdXN0IHVuY29uZGl0aW9uYWxseSBjcmVhdGUgYSBuZXcKKyAqICAgICA8Y29kZT5DbGFzc0xvYWRlcjwvY29kZT4gaW1wbGVtZW50YXRpb24uCisgKiA8bGk+VGhlIDxjb2RlPnN0b3AoKTwvY29kZT4gbWV0aG9kIG11c3QgdGhyb3cgYXdheSBpdHMgcmVmZXJlbmNlIHRvIHRoZQorICogICAgIDxjb2RlPkNsYXNzTG9hZGVyPC9jb2RlPiBwcmV2aW91c2x5IHV0aWxpemVkLCBzbyB0aGF0IHRoZSBjbGFzcyBsb2FkZXIsCisgKiAgICAgYWxsIGNsYXNzZXMgbG9hZGVkIGJ5IGl0LCBhbmQgYWxsIG9iamVjdHMgb2YgdGhvc2UgY2xhc3NlcywgY2FuIGJlCisgKiAgICAgZ2FyYmFnZSBjb2xsZWN0ZWQuCisgKiA8bGk+TXVzdCBhbGxvdyBhIGNhbGwgdG8gPGNvZGU+c3RvcCgpPC9jb2RlPiB0byBiZSBmb2xsb3dlZCBieSBhIGNhbGwgdG8KKyAqICAgICA8Y29kZT5zdGFydCgpPC9jb2RlPiBvbiB0aGUgc2FtZSA8Y29kZT5Mb2FkZXI8L2NvZGU+IGluc3RhbmNlLgorICogPGxpPkJhc2VkIG9uIGEgcG9saWN5IGNob3NlbiBieSB0aGUgaW1wbGVtZW50YXRpb24sIG11c3QgY2FsbCB0aGUKKyAqICAgICA8Y29kZT5Db250ZXh0LnJlbG9hZCgpPC9jb2RlPiBtZXRob2Qgb24gdGhlIG93bmluZyA8Y29kZT5Db250ZXh0PC9jb2RlPgorICogICAgIHdoZW4gYSBjaGFuZ2UgdG8gb25lIG9yIG1vcmUgb2YgdGhlIGNsYXNzIGZpbGVzIGxvYWRlZCBieSB0aGlzIGNsYXNzCisgKiAgICAgbG9hZGVyIGlzIGRldGVjdGVkLgorICogPC91bD4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGludGVyZmFjZSBMb2FkZXIgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBKYXZhIGNsYXNzIGxvYWRlciB0byBiZSB1c2VkIGJ5IHRoaXMgQ29udGFpbmVyLgorICAgICAqLworICAgIHB1YmxpYyBDbGFzc0xvYWRlciBnZXRDbGFzc0xvYWRlcigpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIENvbnRhaW5lciB3aXRoIHdoaWNoIHRoaXMgTG9hZGVyIGhhcyBiZWVuIGFzc29jaWF0ZWQuCisgICAgICovCisgICAgcHVibGljIENvbnRhaW5lciBnZXRDb250YWluZXIoKTsKKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBDb250YWluZXIgd2l0aCB3aGljaCB0aGlzIExvYWRlciBoYXMgYmVlbiBhc3NvY2lhdGVkLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRhaW5lciBUaGUgYXNzb2NpYXRlZCBDb250YWluZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb250YWluZXIoQ29udGFpbmVyIGNvbnRhaW5lcik7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgImZvbGxvdyBzdGFuZGFyZCBkZWxlZ2F0aW9uIG1vZGVsIiBmbGFnIHVzZWQgdG8gY29uZmlndXJlCisgICAgICogb3VyIENsYXNzTG9hZGVyLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldERlbGVnYXRlKCk7CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgImZvbGxvdyBzdGFuZGFyZCBkZWxlZ2F0aW9uIG1vZGVsIiBmbGFnIHVzZWQgdG8gY29uZmlndXJlCisgICAgICogb3VyIENsYXNzTG9hZGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGRlbGVnYXRlIFRoZSBuZXcgZmxhZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERlbGVnYXRlKGJvb2xlYW4gZGVsZWdhdGUpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBMb2FkZXIgaW1wbGVtZW50YXRpb24gYW5kCisgICAgICogdGhlIGNvcnJlc3BvbmRpbmcgdmVyc2lvbiBudW1iZXIsIGluIHRoZSBmb3JtYXQKKyAgICAgKiA8Y29kZT4mbHQ7ZGVzY3JpcHRpb24mZ3Q7LyZsdDt2ZXJzaW9uJmd0OzwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJbmZvKCk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcmVsb2FkYWJsZSBmbGFnIGZvciB0aGlzIExvYWRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRSZWxvYWRhYmxlKCk7CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcmVsb2FkYWJsZSBmbGFnIGZvciB0aGlzIExvYWRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWxvYWRhYmxlIFRoZSBuZXcgcmVsb2FkYWJsZSBmbGFnCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVsb2FkYWJsZShib29sZWFuIHJlbG9hZGFibGUpOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogQWRkIGEgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyIHRvIHRoaXMgY29tcG9uZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciB0byBhZGQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpOworCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBuZXcgcmVwb3NpdG9yeSB0byB0aGUgc2V0IG9mIHJlcG9zaXRvcmllcyBmb3IgdGhpcyBjbGFzcyBsb2FkZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVwb3NpdG9yeSBSZXBvc2l0b3J5IHRvIGJlIGFkZGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkUmVwb3NpdG9yeShTdHJpbmcgcmVwb3NpdG9yeSk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2V0IG9mIHJlcG9zaXRvcmllcyBkZWZpbmVkIGZvciB0aGlzIGNsYXNzIGxvYWRlci4KKyAgICAgKiBJZiBub25lIGFyZSBkZWZpbmVkLCBhIHplcm8tbGVuZ3RoIGFycmF5IGlzIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBmaW5kUmVwb3NpdG9yaWVzKCk7CisKKworICAgIC8qKgorICAgICAqIEhhcyB0aGUgaW50ZXJuYWwgcmVwb3NpdG9yeSBhc3NvY2lhdGVkIHdpdGggdGhpcyBMb2FkZXIgYmVlbiBtb2RpZmllZCwKKyAgICAgKiBzdWNoIHRoYXQgdGhlIGxvYWRlZCBjbGFzc2VzIHNob3VsZCBiZSByZWxvYWRlZD8KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBtb2RpZmllZCgpOworCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIgZnJvbSB0aGlzIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgdG8gcmVtb3ZlCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKTsKKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvTWFuYWdlci5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL01hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWVjZWJjCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL01hbmFnZXIuamF2YQpAQCAtMCwwICsxLDM0NSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYTsKKworCitpbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKworLyoqCisgKiBBIDxiPk1hbmFnZXI8L2I+IG1hbmFnZXMgdGhlIHBvb2wgb2YgU2Vzc2lvbnMgdGhhdCBhcmUgYXNzb2NpYXRlZCB3aXRoIGEKKyAqIHBhcnRpY3VsYXIgQ29udGFpbmVyLiAgRGlmZmVyZW50IE1hbmFnZXIgaW1wbGVtZW50YXRpb25zIG1heSBzdXBwb3J0CisgKiB2YWx1ZS1hZGRlZCBmZWF0dXJlcyBzdWNoIGFzIHRoZSBwZXJzaXN0ZW50IHN0b3JhZ2Ugb2Ygc2Vzc2lvbiBkYXRhLAorICogYXMgd2VsbCBhcyBtaWdyYXRpbmcgc2Vzc2lvbnMgZm9yIGRpc3RyaWJ1dGFibGUgd2ViIGFwcGxpY2F0aW9ucy4KKyAqIDxwPgorICogSW4gb3JkZXIgZm9yIGEgPGNvZGU+TWFuYWdlcjwvY29kZT4gaW1wbGVtZW50YXRpb24gdG8gc3VjY2Vzc2Z1bGx5IG9wZXJhdGUKKyAqIHdpdGggYSA8Y29kZT5Db250ZXh0PC9jb2RlPiBpbXBsZW1lbnRhdGlvbiB0aGF0IGltcGxlbWVudHMgcmVsb2FkaW5nLCBpdAorICogbXVzdCBvYmV5IHRoZSBmb2xsb3dpbmcgY29uc3RyYWludHM6CisgKiA8dWw+CisgKiA8bGk+TXVzdCBpbXBsZW1lbnQgPGNvZGU+TGlmZWN5Y2xlPC9jb2RlPiBzbyB0aGF0IHRoZSBDb250ZXh0IGNhbiBpbmRpY2F0ZQorICogICAgIHRoYXQgYSByZXN0YXJ0IGlzIHJlcXVpcmVkLgorICogPGxpPk11c3QgYWxsb3cgYSBjYWxsIHRvIDxjb2RlPnN0b3AoKTwvY29kZT4gdG8gYmUgZm9sbG93ZWQgYnkgYSBjYWxsIHRvCisgKiAgICAgPGNvZGU+c3RhcnQoKTwvY29kZT4gb24gdGhlIHNhbWUgPGNvZGU+TWFuYWdlcjwvY29kZT4gaW5zdGFuY2UuCisgKiA8L3VsPgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgaW50ZXJmYWNlIE1hbmFnZXIgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBDb250YWluZXIgd2l0aCB3aGljaCB0aGlzIE1hbmFnZXIgaXMgYXNzb2NpYXRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29udGFpbmVyIGdldENvbnRhaW5lcigpOworCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIENvbnRhaW5lciB3aXRoIHdoaWNoIHRoaXMgTWFuYWdlciBpcyBhc3NvY2lhdGVkLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRhaW5lciBUaGUgbmV3bHkgYXNzb2NpYXRlZCBDb250YWluZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb250YWluZXIoQ29udGFpbmVyIGNvbnRhaW5lcik7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZGlzdHJpYnV0YWJsZSBmbGFnIGZvciB0aGUgc2Vzc2lvbnMgc3VwcG9ydGVkIGJ5CisgICAgICogdGhpcyBNYW5hZ2VyLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldERpc3RyaWJ1dGFibGUoKTsKKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBkaXN0cmlidXRhYmxlIGZsYWcgZm9yIHRoZSBzZXNzaW9ucyBzdXBwb3J0ZWQgYnkgdGhpcworICAgICAqIE1hbmFnZXIuICBJZiB0aGlzIGZsYWcgaXMgc2V0LCBhbGwgdXNlciBkYXRhIG9iamVjdHMgYWRkZWQgdG8KKyAgICAgKiBzZXNzaW9ucyBhc3NvY2lhdGVkIHdpdGggdGhpcyBtYW5hZ2VyIG11c3QgaW1wbGVtZW50IFNlcmlhbGl6YWJsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkaXN0cmlidXRhYmxlIFRoZSBuZXcgZGlzdHJpYnV0YWJsZSBmbGFnCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGlzdHJpYnV0YWJsZShib29sZWFuIGRpc3RyaWJ1dGFibGUpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBNYW5hZ2VyIGltcGxlbWVudGF0aW9uIGFuZAorICAgICAqIHRoZSBjb3JyZXNwb25kaW5nIHZlcnNpb24gbnVtYmVyLCBpbiB0aGUgZm9ybWF0CisgICAgICogPGNvZGU+Jmx0O2Rlc2NyaXB0aW9uJmd0Oy8mbHQ7dmVyc2lvbiZndDs8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5mbygpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGRlZmF1bHQgbWF4aW11bSBpbmFjdGl2ZSBpbnRlcnZhbCAoaW4gc2Vjb25kcykKKyAgICAgKiBmb3IgU2Vzc2lvbnMgY3JlYXRlZCBieSB0aGlzIE1hbmFnZXIuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRNYXhJbmFjdGl2ZUludGVydmFsKCk7CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZGVmYXVsdCBtYXhpbXVtIGluYWN0aXZlIGludGVydmFsIChpbiBzZWNvbmRzKQorICAgICAqIGZvciBTZXNzaW9ucyBjcmVhdGVkIGJ5IHRoaXMgTWFuYWdlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnRlcnZhbCBUaGUgbmV3IGRlZmF1bHQgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNYXhJbmFjdGl2ZUludGVydmFsKGludCBpbnRlcnZhbCk7CisKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHNlc3Npb24gaWQgbGVuZ3RoIChpbiBieXRlcykgb2YgU2Vzc2lvbnMgY3JlYXRlZCBieQorICAgICAqIHRoaXMgTWFuYWdlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIHNlc3Npb24gaWQgbGVuZ3RoCisgICAgICovCisgICAgcHVibGljIGludCBnZXRTZXNzaW9uSWRMZW5ndGgoKTsKKworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgc2Vzc2lvbiBpZCBsZW5ndGggKGluIGJ5dGVzKSBmb3IgU2Vzc2lvbnMgY3JlYXRlZCBieSB0aGlzCisgICAgICogTWFuYWdlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpZExlbmd0aCBUaGUgc2Vzc2lvbiBpZCBsZW5ndGgKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTZXNzaW9uSWRMZW5ndGgoaW50IGlkTGVuZ3RoKTsKKworCisgICAgLyoqIAorICAgICAqIFJldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZiBzZXNzaW9ucyBjcmVhdGVkIGJ5IHRoaXMgbWFuYWdlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVG90YWwgbnVtYmVyIG9mIHNlc3Npb25zIGNyZWF0ZWQgYnkgdGhpcyBtYW5hZ2VyLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0U2Vzc2lvbkNvdW50ZXIoKTsKKworCisgICAgLyoqIAorICAgICAqIFNldHMgdGhlIHRvdGFsIG51bWJlciBvZiBzZXNzaW9ucyBjcmVhdGVkIGJ5IHRoaXMgbWFuYWdlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXNzaW9uQ291bnRlciBUb3RhbCBudW1iZXIgb2Ygc2Vzc2lvbnMgY3JlYXRlZCBieSB0aGlzIG1hbmFnZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2Vzc2lvbkNvdW50ZXIoaW50IHNlc3Npb25Db3VudGVyKTsKKworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc2Vzc2lvbnMgdGhhdCBoYXZlIGJlZW4gYWN0aXZlIGF0IHRoZSBzYW1lCisgICAgICogdGltZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gTWF4aW11bSBudW1iZXIgb2Ygc2Vzc2lvbnMgdGhhdCBoYXZlIGJlZW4gYWN0aXZlIGF0IHRoZSBzYW1lCisgICAgICogdGltZQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0TWF4QWN0aXZlKCk7CisKKworICAgIC8qKgorICAgICAqIChSZSlzZXRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBzZXNzaW9ucyB0aGF0IGhhdmUgYmVlbiBhY3RpdmUgYXQgdGhlCisgICAgICogc2FtZSB0aW1lLgorICAgICAqCisgICAgICogQHBhcmFtIG1heEFjdGl2ZSBNYXhpbXVtIG51bWJlciBvZiBzZXNzaW9ucyB0aGF0IGhhdmUgYmVlbiBhY3RpdmUgYXQKKyAgICAgKiB0aGUgc2FtZSB0aW1lLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1heEFjdGl2ZShpbnQgbWF4QWN0aXZlKTsKKworCisgICAgLyoqIAorICAgICAqIEdldHMgdGhlIG51bWJlciBvZiBjdXJyZW50bHkgYWN0aXZlIHNlc3Npb25zLgorICAgICAqCisgICAgICogQHJldHVybiBOdW1iZXIgb2YgY3VycmVudGx5IGFjdGl2ZSBzZXNzaW9ucworICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0QWN0aXZlU2Vzc2lvbnMoKTsKKworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbnVtYmVyIG9mIHNlc3Npb25zIHRoYXQgaGF2ZSBleHBpcmVkLgorICAgICAqCisgICAgICogQHJldHVybiBOdW1iZXIgb2Ygc2Vzc2lvbnMgdGhhdCBoYXZlIGV4cGlyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEV4cGlyZWRTZXNzaW9ucygpOworCisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBudW1iZXIgb2Ygc2Vzc2lvbnMgdGhhdCBoYXZlIGV4cGlyZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXhwaXJlZFNlc3Npb25zIE51bWJlciBvZiBzZXNzaW9ucyB0aGF0IGhhdmUgZXhwaXJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEV4cGlyZWRTZXNzaW9ucyhpbnQgZXhwaXJlZFNlc3Npb25zKTsKKworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbnVtYmVyIG9mIHNlc3Npb25zIHRoYXQgd2VyZSBub3QgY3JlYXRlZCBiZWNhdXNlIHRoZSBtYXhpbXVtCisgICAgICogbnVtYmVyIG9mIGFjdGl2ZSBzZXNzaW9ucyB3YXMgcmVhY2hlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gTnVtYmVyIG9mIHJlamVjdGVkIHNlc3Npb25zCisgICAgICovCisgICAgcHVibGljIGludCBnZXRSZWplY3RlZFNlc3Npb25zKCk7CisKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG51bWJlciBvZiBzZXNzaW9ucyB0aGF0IHdlcmUgbm90IGNyZWF0ZWQgYmVjYXVzZSB0aGUgbWF4aW11bQorICAgICAqIG51bWJlciBvZiBhY3RpdmUgc2Vzc2lvbnMgd2FzIHJlYWNoZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVqZWN0ZWRTZXNzaW9ucyBOdW1iZXIgb2YgcmVqZWN0ZWQgc2Vzc2lvbnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZWplY3RlZFNlc3Npb25zKGludCByZWplY3RlZFNlc3Npb25zKTsKKworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbG9uZ2VzdCB0aW1lIChpbiBzZWNvbmRzKSB0aGF0IGFuIGV4cGlyZWQgc2Vzc2lvbiBoYWQgYmVlbgorICAgICAqIGFsaXZlLgorICAgICAqCisgICAgICogQHJldHVybiBMb25nZXN0IHRpbWUgKGluIHNlY29uZHMpIHRoYXQgYW4gZXhwaXJlZCBzZXNzaW9uIGhhZCBiZWVuCisgICAgICogYWxpdmUuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRTZXNzaW9uTWF4QWxpdmVUaW1lKCk7CisKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGxvbmdlc3QgdGltZSAoaW4gc2Vjb25kcykgdGhhdCBhbiBleHBpcmVkIHNlc3Npb24gaGFkIGJlZW4KKyAgICAgKiBhbGl2ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXNzaW9uTWF4QWxpdmVUaW1lIExvbmdlc3QgdGltZSAoaW4gc2Vjb25kcykgdGhhdCBhbiBleHBpcmVkCisgICAgICogc2Vzc2lvbiBoYWQgYmVlbiBhbGl2ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTZXNzaW9uTWF4QWxpdmVUaW1lKGludCBzZXNzaW9uTWF4QWxpdmVUaW1lKTsKKworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgYXZlcmFnZSB0aW1lIChpbiBzZWNvbmRzKSB0aGF0IGV4cGlyZWQgc2Vzc2lvbnMgaGFkIGJlZW4KKyAgICAgKiBhbGl2ZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gQXZlcmFnZSB0aW1lIChpbiBzZWNvbmRzKSB0aGF0IGV4cGlyZWQgc2Vzc2lvbnMgaGFkIGJlZW4KKyAgICAgKiBhbGl2ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFNlc3Npb25BdmVyYWdlQWxpdmVUaW1lKCk7CisKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGF2ZXJhZ2UgdGltZSAoaW4gc2Vjb25kcykgdGhhdCBleHBpcmVkIHNlc3Npb25zIGhhZCBiZWVuCisgICAgICogYWxpdmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2Vzc2lvbkF2ZXJhZ2VBbGl2ZVRpbWUgQXZlcmFnZSB0aW1lIChpbiBzZWNvbmRzKSB0aGF0IGV4cGlyZWQKKyAgICAgKiBzZXNzaW9ucyBoYWQgYmVlbiBhbGl2ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTZXNzaW9uQXZlcmFnZUFsaXZlVGltZShpbnQgc2Vzc2lvbkF2ZXJhZ2VBbGl2ZVRpbWUpOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogQWRkIHRoaXMgU2Vzc2lvbiB0byB0aGUgc2V0IG9mIGFjdGl2ZSBTZXNzaW9ucyBmb3IgdGhpcyBNYW5hZ2VyLgorICAgICAqCisgICAgICogQHBhcmFtIHNlc3Npb24gU2Vzc2lvbiB0byBiZSBhZGRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZChTZXNzaW9uIHNlc3Npb24pOworCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIgdG8gdGhpcyBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRvIGFkZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcik7CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSBzZXNzaW9uIGZyb20gdGhlIHJlY3ljbGVkIG9uZXMgb3IgY3JlYXRlIGEgbmV3IGVtcHR5IG9uZS4KKyAgICAgKiBUaGUgUGVyc2lzdGVudE1hbmFnZXIgbWFuYWdlciBkb2VzIG5vdCBuZWVkIHRvIGNyZWF0ZSBzZXNzaW9uIGRhdGEKKyAgICAgKiBiZWNhdXNlIGl0IHJlYWRzIGl0IGZyb20gdGhlIFN0b3JlLgorICAgICAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBwdWJsaWMgU2Vzc2lvbiBjcmVhdGVFbXB0eVNlc3Npb24oKTsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhbmQgcmV0dXJuIGEgbmV3IHNlc3Npb24gb2JqZWN0LCBiYXNlZCBvbiB0aGUgZGVmYXVsdAorICAgICAqIHNldHRpbmdzIHNwZWNpZmllZCBieSB0aGlzIE1hbmFnZXIncyBwcm9wZXJ0aWVzLiAgVGhlIHNlc3Npb24KKyAgICAgKiBpZCB3aWxsIGJlIGFzc2lnbmVkIGJ5IHRoaXMgbWV0aG9kLCBhbmQgYXZhaWxhYmxlIHZpYSB0aGUgZ2V0SWQoKQorICAgICAqIG1ldGhvZCBvZiB0aGUgcmV0dXJuZWQgc2Vzc2lvbi4gIElmIGEgbmV3IHNlc3Npb24gY2Fubm90IGJlIGNyZWF0ZWQKKyAgICAgKiBmb3IgYW55IHJlYXNvbiwgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgYSBuZXcgc2Vzc2lvbiBjYW5ub3QgYmUKKyAgICAgKiAgaW5zdGFudGlhdGVkIGZvciBhbnkgcmVhc29uCisgICAgICovCisgICAgcHVibGljIFNlc3Npb24gY3JlYXRlU2Vzc2lvbigpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGFjdGl2ZSBTZXNzaW9uLCBhc3NvY2lhdGVkIHdpdGggdGhpcyBNYW5hZ2VyLCB3aXRoIHRoZQorICAgICAqIHNwZWNpZmllZCBzZXNzaW9uIGlkIChpZiBhbnkpOyBvdGhlcndpc2UgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIGlkIFRoZSBzZXNzaW9uIGlkIGZvciB0aGUgc2Vzc2lvbiB0byBiZSByZXR1cm5lZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgYSBuZXcgc2Vzc2lvbiBjYW5ub3QgYmUKKyAgICAgKiAgaW5zdGFudGlhdGVkIGZvciBhbnkgcmVhc29uCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzIHdoaWxlCisgICAgICogIHByb2Nlc3NpbmcgdGhpcyByZXF1ZXN0CisgICAgICovCisgICAgcHVibGljIFNlc3Npb24gZmluZFNlc3Npb24oU3RyaW5nIGlkKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2V0IG9mIGFjdGl2ZSBTZXNzaW9ucyBhc3NvY2lhdGVkIHdpdGggdGhpcyBNYW5hZ2VyLgorICAgICAqIElmIHRoaXMgTWFuYWdlciBoYXMgbm8gYWN0aXZlIFNlc3Npb25zLCBhIHplcm8tbGVuZ3RoIGFycmF5IGlzIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBTZXNzaW9uW10gZmluZFNlc3Npb25zKCk7CisKKworICAgIC8qKgorICAgICAqIExvYWQgYW55IGN1cnJlbnRseSBhY3RpdmUgc2Vzc2lvbnMgdGhhdCB3ZXJlIHByZXZpb3VzbHkgdW5sb2FkZWQKKyAgICAgKiB0byB0aGUgYXBwcm9wcmlhdGUgcGVyc2lzdGVuY2UgbWVjaGFuaXNtLCBpZiBhbnkuICBJZiBwZXJzaXN0ZW5jZSBpcyBub3QKKyAgICAgKiBzdXBwb3J0ZWQsIHRoaXMgbWV0aG9kIHJldHVybnMgd2l0aG91dCBkb2luZyBhbnl0aGluZy4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBpZiBhIHNlcmlhbGl6ZWQgY2xhc3MgY2Fubm90IGJlCisgICAgICogIGZvdW5kIGR1cmluZyB0aGUgcmVsb2FkCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgbG9hZCgpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbjsKKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoaXMgU2Vzc2lvbiBmcm9tIHRoZSBhY3RpdmUgU2Vzc2lvbnMgZm9yIHRoaXMgTWFuYWdlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXNzaW9uIFNlc3Npb24gdG8gYmUgcmVtb3ZlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZShTZXNzaW9uIHNlc3Npb24pOworCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIgZnJvbSB0aGlzIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgdG8gcmVtb3ZlCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKTsKKworCisgICAgLyoqCisgICAgICogU2F2ZSBhbnkgY3VycmVudGx5IGFjdGl2ZSBzZXNzaW9ucyBpbiB0aGUgYXBwcm9wcmlhdGUgcGVyc2lzdGVuY2UKKyAgICAgKiBtZWNoYW5pc20sIGlmIGFueS4gIElmIHBlcnNpc3RlbmNlIGlzIG5vdCBzdXBwb3J0ZWQsIHRoaXMgbWV0aG9kCisgICAgICogcmV0dXJucyB3aXRob3V0IGRvaW5nIGFueXRoaW5nLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdW5sb2FkKCkgdGhyb3dzIElPRXhjZXB0aW9uOworICAgIAorICAgICAvKioKKyAgICAgICogVGhpcyBtZXRob2Qgd2lsbCBiZSBpbnZva2VkIGJ5IHRoZSBjb250ZXh0L2NvbnRhaW5lciBvbiBhIHBlcmlvZGljCisgICAgICAqIGJhc2lzIGFuZCBhbGxvd3MgdGhlIG1hbmFnZXIgdG8gaW1wbGVtZW50CisgICAgICAqIGEgbWV0aG9kIHRoYXQgZXhlY3V0ZXMgcGVyaW9kaWMgdGFza3MsIHN1Y2ggYXMgZXhwaXJpbmcgc2Vzc2lvbnMgZXRjLgorICAgICAgKi8KKyAgICAgcHVibGljIHZvaWQgYmFja2dyb3VuZFByb2Nlc3MoKTsKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL1BpcGVsaW5lLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvUGlwZWxpbmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjM0YWViCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL1BpcGVsaW5lLmphdmEKQEAgLTAsMCArMSwxMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OS0yMDAxLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYTsKKworCisvKioKKyAqIDxwPkludGVyZmFjZSBkZXNjcmliaW5nIGEgY29sbGVjdGlvbiBvZiBWYWx2ZXMgdGhhdCBzaG91bGQgYmUgZXhlY3V0ZWQKKyAqIGluIHNlcXVlbmNlIHdoZW4gdGhlIDxjb2RlPmludm9rZSgpPC9jb2RlPiBtZXRob2QgaXMgaW52b2tlZC4gIEl0IGlzCisgKiByZXF1aXJlZCB0aGF0IGEgVmFsdmUgc29tZXdoZXJlIGluIHRoZSBwaXBlbGluZSAodXN1YWxseSB0aGUgbGFzdCBvbmUpCisgKiBtdXN0IHByb2Nlc3MgdGhlIHJlcXVlc3QgYW5kIGNyZWF0ZSB0aGUgY29ycmVzcG9uZGluZyByZXNwb25zZSwgcmF0aGVyCisgKiB0aGFuIHRyeWluZyB0byBwYXNzIHRoZSByZXF1ZXN0IG9uLjwvcD4KKyAqCisgKiA8cD5UaGVyZSBpcyBnZW5lcmFsbHkgYSBzaW5nbGUgUGlwZWxpbmUgaW5zdGFuY2UgYXNzb2NpYXRlZCB3aXRoIGVhY2gKKyAqIENvbnRhaW5lci4gIFRoZSBjb250YWluZXIncyBub3JtYWwgcmVxdWVzdCBwcm9jZXNzaW5nIGZ1bmN0aW9uYWxpdHkgaXMKKyAqIGdlbmVyYWxseSBlbmNhcHN1bGF0ZWQgaW4gYSBjb250YWluZXItc3BlY2lmaWMgVmFsdmUsIHdoaWNoIHNob3VsZCBhbHdheXMKKyAqIGJlIGV4ZWN1dGVkIGF0IHRoZSBlbmQgb2YgYSBwaXBlbGluZS4gIFRvIGZhY2lsaXRhdGUgdGhpcywgdGhlCisgKiA8Y29kZT5zZXRCYXNpYygpPC9jb2RlPiBtZXRob2QgaXMgcHJvdmlkZWQgdG8gc2V0IHRoZSBWYWx2ZSBpbnN0YW5jZSB0aGF0CisgKiB3aWxsIGFsd2F5cyBiZSBleGVjdXRlZCBsYXN0LiAgT3RoZXIgVmFsdmVzIHdpbGwgYmUgZXhlY3V0ZWQgaW4gdGhlIG9yZGVyCisgKiB0aGF0IHRoZXkgd2VyZSBhZGRlZCwgYmVmb3JlIHRoZSBiYXNpYyBWYWx2ZSBpcyBleGVjdXRlZC48L3A+CisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAYXV0aG9yIFBldGVyIERvbmFsZAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgaW50ZXJmYWNlIFBpcGVsaW5lIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIDxwPlJldHVybiB0aGUgVmFsdmUgaW5zdGFuY2UgdGhhdCBoYXMgYmVlbiBkaXN0aW5ndWlzaGVkIGFzIHRoZSBiYXNpYworICAgICAqIFZhbHZlIGZvciB0aGlzIFBpcGVsaW5lIChpZiBhbnkpLgorICAgICAqLworICAgIHB1YmxpYyBWYWx2ZSBnZXRCYXNpYygpOworCisKKyAgICAvKioKKyAgICAgKiA8cD5TZXQgdGhlIFZhbHZlIGluc3RhbmNlIHRoYXQgaGFzIGJlZW4gZGlzdGluZ3Vpc2hlZCBhcyB0aGUgYmFzaWMKKyAgICAgKiBWYWx2ZSBmb3IgdGhpcyBQaXBlbGluZSAoaWYgYW55KS4gIFByaW9lciB0byBzZXR0aW5nIHRoZSBiYXNpYyBWYWx2ZSwKKyAgICAgKiB0aGUgVmFsdmUncyA8Y29kZT5zZXRDb250YWluZXIoKTwvY29kZT4gd2lsbCBiZSBjYWxsZWQsIGlmIGl0CisgICAgICogaW1wbGVtZW50cyA8Y29kZT5Db250YWluZWQ8L2NvZGU+LCB3aXRoIHRoZSBvd25pbmcgQ29udGFpbmVyIGFzIGFuCisgICAgICogYXJndW1lbnQuICBUaGUgbWV0aG9kIG1heSB0aHJvdyBhbiA8Y29kZT5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb248L2NvZGU+CisgICAgICogaWYgdGhpcyBWYWx2ZSBjaG9vc2VzIG5vdCB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBDb250YWluZXIsIG9yCisgICAgICogPGNvZGU+SWxsZWdhbFN0YXRlRXhjZXB0aW9uPC9jb2RlPiBpZiBpdCBpcyBhbHJlYWR5IGFzc29jaWF0ZWQgd2l0aAorICAgICAqIGEgZGlmZmVyZW50IENvbnRhaW5lci48L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdmUgVmFsdmUgdG8gYmUgZGlzdGluZ3Vpc2hlZCBhcyB0aGUgYmFzaWMgVmFsdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRCYXNpYyhWYWx2ZSB2YWx2ZSk7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiA8cD5BZGQgYSBuZXcgVmFsdmUgdG8gdGhlIGVuZCBvZiB0aGUgcGlwZWxpbmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMKKyAgICAgKiBDb250YWluZXIuICBQcmlvciB0byBhZGRpbmcgdGhlIFZhbHZlLCB0aGUgVmFsdmUncworICAgICAqIDxjb2RlPnNldENvbnRhaW5lcigpPC9jb2RlPiBtZXRob2Qgd2lsbCBiZSBjYWxsZWQsIGlmIGl0IGltcGxlbWVudHMKKyAgICAgKiA8Y29kZT5Db250YWluZWQ8L2NvZGU+LCB3aXRoIHRoZSBvd25pbmcgQ29udGFpbmVyIGFzIGFuIGFyZ3VtZW50LgorICAgICAqIFRoZSBtZXRob2QgbWF5IHRocm93IGFuCisgICAgICogPGNvZGU+SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uPC9jb2RlPiBpZiB0aGlzIFZhbHZlIGNob29zZXMgbm90IHRvCisgICAgICogYmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgQ29udGFpbmVyLCBvciA8Y29kZT5JbGxlZ2FsU3RhdGVFeGNlcHRpb248L2NvZGU+CisgICAgICogaWYgaXQgaXMgYWxyZWFkeSBhc3NvY2lhdGVkIHdpdGggYSBkaWZmZXJlbnQgQ29udGFpbmVyLjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx2ZSBWYWx2ZSB0byBiZSBhZGRlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhpcyBDb250YWluZXIgcmVmdXNlZCB0bworICAgICAqICBhY2NlcHQgdGhlIHNwZWNpZmllZCBWYWx2ZQorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBzcGVjaWZpZSBWYWx2ZSByZWZ1c2VzIHRvIGJlCisgICAgICogIGFzc29jaWF0ZWQgd2l0aCB0aGlzIENvbnRhaW5lcgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSBzcGVjaWZpZWQgVmFsdmUgaXMgYWxyZWFkeQorICAgICAqICBhc3NvY2lhdGVkIHdpdGggYSBkaWZmZXJlbnQgQ29udGFpbmVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkVmFsdmUoVmFsdmUgdmFsdmUpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNldCBvZiBWYWx2ZXMgaW4gdGhlIHBpcGVsaW5lIGFzc29jaWF0ZWQgd2l0aCB0aGlzCisgICAgICogQ29udGFpbmVyLCBpbmNsdWRpbmcgdGhlIGJhc2ljIFZhbHZlIChpZiBhbnkpLiAgSWYgdGhlcmUgYXJlIG5vCisgICAgICogc3VjaCBWYWx2ZXMsIGEgemVyby1sZW5ndGggYXJyYXkgaXMgcmV0dXJuZWQuCisgICAgICovCisgICAgcHVibGljIFZhbHZlW10gZ2V0VmFsdmVzKCk7CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIFZhbHZlIGZyb20gdGhlIHBpcGVsaW5lIGFzc29jaWF0ZWQgd2l0aCB0aGlzCisgICAgICogQ29udGFpbmVyLCBpZiBpdCBpcyBmb3VuZDsgb3RoZXJ3aXNlLCBkbyBub3RoaW5nLiAgSWYgdGhlIFZhbHZlIGlzCisgICAgICogZm91bmQgYW5kIHJlbW92ZWQsIHRoZSBWYWx2ZSdzIDxjb2RlPnNldENvbnRhaW5lcihudWxsKTwvY29kZT4gbWV0aG9kCisgICAgICogd2lsbCBiZSBjYWxsZWQgaWYgaXQgaW1wbGVtZW50cyA8Y29kZT5Db250YWluZWQ8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHZlIFZhbHZlIHRvIGJlIHJlbW92ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVWYWx2ZShWYWx2ZSB2YWx2ZSk7CisKKworICAgIC8qKgorICAgICAqIDxwPlJldHVybiB0aGUgVmFsdmUgaW5zdGFuY2UgdGhhdCBoYXMgYmVlbiBkaXN0aW5ndWlzaGVkIGFzIHRoZSBiYXNpYworICAgICAqIFZhbHZlIGZvciB0aGlzIFBpcGVsaW5lIChpZiBhbnkpLgorICAgICAqLworICAgIHB1YmxpYyBWYWx2ZSBnZXRGaXJzdCgpOworCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9SZWFsbS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL1JlYWxtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRjYzQwNQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9SZWFsbS5qYXZhCkBAIC0wLDAgKzEsMTkwIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hOworCitpbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5QcmluY2lwYWw7CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLlJlcXVlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuUmVzcG9uc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuU2VjdXJpdHlDb25zdHJhaW50OworLyoqCisgKiBBIDxiPlJlYWxtPC9iPiBpcyBhIHJlYWQtb25seSBmYWNhZGUgZm9yIGFuIHVuZGVybHlpbmcgc2VjdXJpdHkgcmVhbG0KKyAqIHVzZWQgdG8gYXV0aGVudGljYXRlIGluZGl2aWR1YWwgdXNlcnMsIGFuZCBpZGVudGlmeSB0aGUgc2VjdXJpdHkgcm9sZXMKKyAqIGFzc29jaWF0ZWQgd2l0aCB0aG9zZSB1c2Vycy4gIFJlYWxtcyBjYW4gYmUgYXR0YWNoZWQgYXQgYW55IENvbnRhaW5lcgorICogbGV2ZWwsIGJ1dCB3aWxsIHR5cGljYWxseSBvbmx5IGJlIGF0dGFjaGVkIHRvIGEgQ29udGV4dCwgb3IgaGlnaGVyIGxldmVsLAorICogQ29udGFpbmVyLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgaW50ZXJmYWNlIFJlYWxtIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgQ29udGFpbmVyIHdpdGggd2hpY2ggdGhpcyBSZWFsbSBoYXMgYmVlbiBhc3NvY2lhdGVkLgorICAgICAqLworICAgIHB1YmxpYyBDb250YWluZXIgZ2V0Q29udGFpbmVyKCk7CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgQ29udGFpbmVyIHdpdGggd2hpY2ggdGhpcyBSZWFsbSBoYXMgYmVlbiBhc3NvY2lhdGVkLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRhaW5lciBUaGUgYXNzb2NpYXRlZCBDb250YWluZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb250YWluZXIoQ29udGFpbmVyIGNvbnRhaW5lcik7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIFJlYWxtIGltcGxlbWVudGF0aW9uIGFuZAorICAgICAqIHRoZSBjb3JyZXNwb25kaW5nIHZlcnNpb24gbnVtYmVyLCBpbiB0aGUgZm9ybWF0CisgICAgICogPGNvZGU+Jmx0O2Rlc2NyaXB0aW9uJmd0Oy8mbHQ7dmVyc2lvbiZndDs8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5mbygpOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworICAgIAorICAgIC8qKgorICAgICAqIEFkZCBhIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lciB0byB0aGlzIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgdG8gYWRkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBQcmluY2lwYWwgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgdXNlcm5hbWUgYW5kCisgICAgICogY3JlZGVudGlhbHMsIGlmIHRoZXJlIGlzIG9uZTsgb3RoZXJ3aXNlIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1c2VybmFtZSBVc2VybmFtZSBvZiB0aGUgUHJpbmNpcGFsIHRvIGxvb2sgdXAKKyAgICAgKiBAcGFyYW0gY3JlZGVudGlhbHMgUGFzc3dvcmQgb3Igb3RoZXIgY3JlZGVudGlhbHMgdG8gdXNlIGluCisgICAgICogIGF1dGhlbnRpY2F0aW5nIHRoaXMgdXNlcm5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgUHJpbmNpcGFsIGF1dGhlbnRpY2F0ZShTdHJpbmcgdXNlcm5hbWUsIFN0cmluZyBjcmVkZW50aWFscyk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgUHJpbmNpcGFsIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIHVzZXJuYW1lIGFuZAorICAgICAqIGNyZWRlbnRpYWxzLCBpZiB0aGVyZSBpcyBvbmU7IG90aGVyd2lzZSByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXNlcm5hbWUgVXNlcm5hbWUgb2YgdGhlIFByaW5jaXBhbCB0byBsb29rIHVwCisgICAgICogQHBhcmFtIGNyZWRlbnRpYWxzIFBhc3N3b3JkIG9yIG90aGVyIGNyZWRlbnRpYWxzIHRvIHVzZSBpbgorICAgICAqICBhdXRoZW50aWNhdGluZyB0aGlzIHVzZXJuYW1lCisgICAgICovCisgICAgcHVibGljIFByaW5jaXBhbCBhdXRoZW50aWNhdGUoU3RyaW5nIHVzZXJuYW1lLCBieXRlW10gY3JlZGVudGlhbHMpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIFByaW5jaXBhbCBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCB1c2VybmFtZSwgd2hpY2gKKyAgICAgKiBtYXRjaGVzIHRoZSBkaWdlc3QgY2FsY3VsYXRlZCB1c2luZyB0aGUgZ2l2ZW4gcGFyYW1ldGVycyB1c2luZyB0aGUKKyAgICAgKiBtZXRob2QgZGVzY3JpYmVkIGluIFJGQyAyMDY5OyBvdGhlcndpc2UgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIHVzZXJuYW1lIFVzZXJuYW1lIG9mIHRoZSBQcmluY2lwYWwgdG8gbG9vayB1cAorICAgICAqIEBwYXJhbSBkaWdlc3QgRGlnZXN0IHdoaWNoIGhhcyBiZWVuIHN1Ym1pdHRlZCBieSB0aGUgY2xpZW50CisgICAgICogQHBhcmFtIG5vbmNlIFVuaXF1ZSAob3Igc3VwcG9zZWRseSB1bmlxdWUpIHRva2VuIHdoaWNoIGhhcyBiZWVuIHVzZWQKKyAgICAgKiBmb3IgdGhpcyByZXF1ZXN0CisgICAgICogQHBhcmFtIHJlYWxtIFJlYWxtIG5hbWUKKyAgICAgKiBAcGFyYW0gbWQ1YTIgU2Vjb25kIE1ENSBkaWdlc3QgdXNlZCB0byBjYWxjdWxhdGUgdGhlIGRpZ2VzdCA6CisgICAgICogTUQ1KE1ldGhvZCArICI6IiArIHVyaSkKKyAgICAgKi8KKyAgICBwdWJsaWMgUHJpbmNpcGFsIGF1dGhlbnRpY2F0ZShTdHJpbmcgdXNlcm5hbWUsIFN0cmluZyBkaWdlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5vbmNlLCBTdHJpbmcgbmMsIFN0cmluZyBjbm9uY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHFvcCwgU3RyaW5nIHJlYWxtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtZDVhMik7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgUHJpbmNpcGFsIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGNoYWluIG9mIFg1MDkKKyAgICAgKiBjbGllbnQgY2VydGlmaWNhdGVzLiAgSWYgdGhlcmUgaXMgbm9uZSwgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIGNlcnRzIEFycmF5IG9mIGNsaWVudCBjZXJ0aWZpY2F0ZXMsIHdpdGggdGhlIGZpcnN0IG9uZSBpbgorICAgICAqICB0aGUgYXJyYXkgYmVpbmcgdGhlIGNlcnRpZmljYXRlIG9mIHRoZSBjbGllbnQgaXRzZWxmLgorICAgICAqLworICAgIHB1YmxpYyBQcmluY2lwYWwgYXV0aGVudGljYXRlKFg1MDlDZXJ0aWZpY2F0ZSBjZXJ0c1tdKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIFNlY3VyaXR5Q29uc3RyYWludHMgY29uZmlndXJlZCB0byBndWFyZCB0aGUgcmVxdWVzdCBVUkkgZm9yCisgICAgICogdGhpcyByZXF1ZXN0LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBubyBzdWNoIGNvbnN0cmFpbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBSZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICovCisgICAgcHVibGljIFNlY3VyaXR5Q29uc3RyYWludCBbXSBmaW5kU2VjdXJpdHlDb25zdHJhaW50cyhSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQgY29udGV4dCk7CisgICAgLyoqCisgICAgICogUGVyZm9ybSBhY2Nlc3MgY29udHJvbCBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkIGF1dGhvcml6YXRpb24gY29uc3RyYWludC4KKyAgICAgKiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBjb25zdHJhaW50IGlzIHNhdGlzZmllZCBhbmQgcHJvY2Vzc2luZworICAgICAqIHNob3VsZCBjb250aW51ZSwgb3IgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgUmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICogQHBhcmFtIGNvbnN0cmFpbnQgU2VjdXJpdHkgY29uc3RyYWludCB3ZSBhcmUgZW5mb3JjaW5nCisgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIENvbnRleHQgdG8gd2hpY2ggY2xpZW50IG9mIHRoaXMgY2xhc3MgaXMgYXR0YWNoZWQuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNSZXNvdXJjZVBlcm1pc3Npb24oUmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNwb25zZSByZXNwb25zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VjdXJpdHlDb25zdHJhaW50IFtdIGNvbnN0cmFpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQgY29udGV4dCkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uOworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3BlY2lmaWVkIFByaW5jaXBhbCBoYXMgdGhlIHNwZWNpZmllZAorICAgICAqIHNlY3VyaXR5IHJvbGUsIHdpdGhpbiB0aGUgY29udGV4dCBvZiB0aGlzIFJlYWxtOyBvdGhlcndpc2UgcmV0dXJuCisgICAgICogPGNvZGU+ZmFsc2U8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIHByaW5jaXBhbCBQcmluY2lwYWwgZm9yIHdob20gdGhlIHJvbGUgaXMgdG8gYmUgY2hlY2tlZAorICAgICAqIEBwYXJhbSByb2xlIFNlY3VyaXR5IHJvbGUgdG8gYmUgY2hlY2tlZAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc1JvbGUoUHJpbmNpcGFsIHByaW5jaXBhbCwgU3RyaW5nIHJvbGUpOworCisgICAgICAgIC8qKgorICAgICAqIEVuZm9yY2UgYW55IHVzZXIgZGF0YSBjb25zdHJhaW50IHJlcXVpcmVkIGJ5IHRoZSBzZWN1cml0eSBjb25zdHJhaW50CisgICAgICogZ3VhcmRpbmcgdGhpcyByZXF1ZXN0IFVSSS4gIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGNvbnN0cmFpbnQKKyAgICAgKiB3YXMgbm90IHZpb2xhdGVkIGFuZCBwcm9jZXNzaW5nIHNob3VsZCBjb250aW51ZSwgb3IgPGNvZGU+ZmFsc2U8L2NvZGU+CisgICAgICogaWYgd2UgaGF2ZSBjcmVhdGVkIGEgcmVzcG9uc2UgYWxyZWFkeS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgUmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICogQHBhcmFtIGNvbnN0cmFpbnQgU2VjdXJpdHkgY29uc3RyYWludCBiZWluZyBjaGVja2VkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNVc2VyRGF0YVBlcm1pc3Npb24oUmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNwb25zZSByZXNwb25zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VjdXJpdHlDb25zdHJhaW50IFtdY29uc3RyYWludCkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uOworICAgIAorICAgIC8qKgorICAgICAqIFJlbW92ZSBhIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lciBmcm9tIHRoaXMgY29tcG9uZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciB0byByZW1vdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpOworCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9Sb2xlLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvUm9sZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhMTk3YTgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvUm9sZS5qYXZhCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmE7CisKKworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsOworCisKKy8qKgorICogPHA+QWJzdHJhY3QgcmVwcmVzZW50YXRpb24gb2YgYSBzZWN1cml0eSByb2xlLCBzdWl0YWJsZSBmb3IgdXNlIGluCisgKiBlbnZpcm9ubWVudHMgbGlrZSBKQUFTIHRoYXQgd2FudCB0byBkZWFsIHdpdGggPGNvZGU+UHJpbmNpcGFsczwvY29kZT4uPC9wPgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqIEBzaW5jZSA0LjEKKyAqLworCitwdWJsaWMgaW50ZXJmYWNlIFJvbGUgZXh0ZW5kcyBQcmluY2lwYWwgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGlzIHJvbGUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpOworCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGRlc2NyaXB0aW9uIG9mIHRoaXMgcm9sZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZXNjcmlwdGlvbiBUaGUgbmV3IGRlc2NyaXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSByb2xlIG5hbWUgb2YgdGhpcyByb2xlLCB3aGljaCBtdXN0IGJlIHVuaXF1ZQorICAgICAqIHdpdGhpbiB0aGUgc2NvcGUgb2YgYSB7QGxpbmsgVXNlckRhdGFiYXNlfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFJvbGVuYW1lKCk7CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcm9sZSBuYW1lIG9mIHRoaXMgcm9sZSwgd2hpY2ggbXVzdCBiZSB1bmlxdWUKKyAgICAgKiB3aXRoaW4gdGhlIHNjb3BlIG9mIGEge0BsaW5rIFVzZXJEYXRhYmFzZX0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcm9sZW5hbWUgVGhlIG5ldyByb2xlIG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSb2xlbmFtZShTdHJpbmcgcm9sZW5hbWUpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHtAbGluayBVc2VyRGF0YWJhc2V9IHdpdGhpbiB3aGljaCB0aGlzIFJvbGUgaXMgZGVmaW5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgVXNlckRhdGFiYXNlIGdldFVzZXJEYXRhYmFzZSgpOworCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9TZXJ2ZXIuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9TZXJ2ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZThmN2JmCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL1NlcnZlci5qYXZhCkBAIC0wLDAgKzEsMTUyIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuTmFtaW5nUmVzb3VyY2VzOworCisvKioKKyAqIEEgPGNvZGU+U2VydmVyPC9jb2RlPiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIGVudGlyZSBDYXRhbGluYQorICogc2VydmxldCBjb250YWluZXIuICBJdHMgYXR0cmlidXRlcyByZXByZXNlbnQgdGhlIGNoYXJhY3RlcmlzdGljcyBvZgorICogdGhlIHNlcnZsZXQgY29udGFpbmVyIGFzIGEgd2hvbGUuICBBIDxjb2RlPlNlcnZlcjwvY29kZT4gbWF5IGNvbnRhaW4KKyAqIG9uZSBvciBtb3JlIDxjb2RlPlNlcnZpY2VzPC9jb2RlPiwgYW5kIHRoZSB0b3AgbGV2ZWwgc2V0IG9mIG5hbWluZworICogcmVzb3VyY2VzLgorICogPHA+CisgKiBOb3JtYWxseSwgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhpcyBpbnRlcmZhY2Ugd2lsbCBhbHNvIGltcGxlbWVudAorICogPGNvZGU+TGlmZWN5Y2xlPC9jb2RlPiwgc3VjaCB0aGF0IHdoZW4gdGhlIDxjb2RlPnN0YXJ0KCk8L2NvZGU+IGFuZAorICogPGNvZGU+c3RvcCgpPC9jb2RlPiBtZXRob2RzIGFyZSBjYWxsZWQsIGFsbCBvZiB0aGUgZGVmaW5lZAorICogPGNvZGU+U2VydmljZXM8L2NvZGU+IGFyZSBhbHNvIHN0YXJ0ZWQgb3Igc3RvcHBlZC4KKyAqIDxwPgorICogSW4gYmV0d2VlbiwgdGhlIGltcGxlbWVudGF0aW9uIG11c3Qgb3BlbiBhIHNlcnZlciBzb2NrZXQgb24gdGhlIHBvcnQgbnVtYmVyCisgKiBzcGVjaWZpZWQgYnkgdGhlIDxjb2RlPnBvcnQ8L2NvZGU+IHByb3BlcnR5LiAgV2hlbiBhIGNvbm5lY3Rpb24gaXMgYWNjZXB0ZWQsCisgKiB0aGUgZmlyc3QgbGluZSBpcyByZWFkIGFuZCBjb21wYXJlZCB3aXRoIHRoZSBzcGVjaWZpZWQgc2h1dGRvd24gY29tbWFuZC4KKyAqIElmIHRoZSBjb21tYW5kIG1hdGNoZXMsIHNodXRkb3duIG9mIHRoZSBzZXJ2ZXIgaXMgaW5pdGlhdGVkLgorICogPHA+CisgKiA8c3Ryb25nPk5PVEU8L3N0cm9uZz4gLSBUaGUgY29uY3JldGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBjbGFzcyBzaG91bGQKKyAqIHJlZ2lzdGVyIHRoZSAoc2luZ2xldG9uKSBpbnN0YW5jZSB3aXRoIHRoZSA8Y29kZT5TZXJ2ZXJGYWN0b3J5PC9jb2RlPgorICogY2xhc3MgaW4gaXRzIGNvbnN0cnVjdG9yKHMpLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgaW50ZXJmYWNlIFNlcnZlciB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBTZXJ2ZXIgaW1wbGVtZW50YXRpb24gYW5kCisgICAgICogdGhlIGNvcnJlc3BvbmRpbmcgdmVyc2lvbiBudW1iZXIsIGluIHRoZSBmb3JtYXQKKyAgICAgKiA8Y29kZT4mbHQ7ZGVzY3JpcHRpb24mZ3Q7LyZsdDt2ZXJzaW9uJmd0OzwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJbmZvKCk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZ2xvYmFsIG5hbWluZyByZXNvdXJjZXMuCisgICAgICovCisgICAgcHVibGljIE5hbWluZ1Jlc291cmNlcyBnZXRHbG9iYWxOYW1pbmdSZXNvdXJjZXMoKTsKKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBnbG9iYWwgbmFtaW5nIHJlc291cmNlcy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZ2xvYmFsTmFtaW5nUmVzb3VyY2VzIFRoZSBuZXcgZ2xvYmFsIG5hbWluZyByZXNvdXJjZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRHbG9iYWxOYW1pbmdSZXNvdXJjZXMKKyAgICAgICAgKE5hbWluZ1Jlc291cmNlcyBnbG9iYWxOYW1pbmdSZXNvdXJjZXMpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHBvcnQgbnVtYmVyIHdlIGxpc3RlbiB0byBmb3Igc2h1dGRvd24gY29tbWFuZHMuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRQb3J0KCk7CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcG9ydCBudW1iZXIgd2UgbGlzdGVuIHRvIGZvciBzaHV0ZG93biBjb21tYW5kcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwb3J0IFRoZSBuZXcgcG9ydCBudW1iZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQb3J0KGludCBwb3J0KTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzaHV0ZG93biBjb21tYW5kIHN0cmluZyB3ZSBhcmUgd2FpdGluZyBmb3IuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTaHV0ZG93bigpOworCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHNodXRkb3duIGNvbW1hbmQgd2UgYXJlIHdhaXRpbmcgZm9yLgorICAgICAqCisgICAgICogQHBhcmFtIHNodXRkb3duIFRoZSBuZXcgc2h1dGRvd24gY29tbWFuZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNodXRkb3duKFN0cmluZyBzaHV0ZG93bik7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBuZXcgU2VydmljZSB0byB0aGUgc2V0IG9mIGRlZmluZWQgU2VydmljZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VydmljZSBUaGUgU2VydmljZSB0byBiZSBhZGRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFNlcnZpY2UoU2VydmljZSBzZXJ2aWNlKTsKKworCisgICAgLyoqCisgICAgICogV2FpdCB1bnRpbCBhIHByb3BlciBzaHV0ZG93biBjb21tYW5kIGlzIHJlY2VpdmVkLCB0aGVuIHJldHVybi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhd2FpdCgpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBTZXJ2aWNlIChpZiBpdCBleGlzdHMpOyBvdGhlcndpc2UgcmV0dXJuCisgICAgICogPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBTZXJ2aWNlIHRvIGJlIHJldHVybmVkCisgICAgICovCisgICAgcHVibGljIFNlcnZpY2UgZmluZFNlcnZpY2UoU3RyaW5nIG5hbWUpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNldCBvZiBTZXJ2aWNlcyBkZWZpbmVkIHdpdGhpbiB0aGlzIFNlcnZlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2VydmljZVtdIGZpbmRTZXJ2aWNlcygpOworCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBTZXJ2aWNlIGZyb20gdGhlIHNldCBhc3NvY2lhdGVkIGZyb20gdGhpcworICAgICAqIFNlcnZlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXJ2aWNlIFRoZSBTZXJ2aWNlIHRvIGJlIHJlbW92ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVTZXJ2aWNlKFNlcnZpY2Ugc2VydmljZSk7CisKKyAgICAvKioKKyAgICAgKiBJbnZva2UgYSBwcmUtc3RhcnR1cCBpbml0aWFsaXphdGlvbi4gVGhpcyBpcyB1c2VkIHRvIGFsbG93IGNvbm5lY3RvcnMKKyAgICAgKiB0byBiaW5kIHRvIHJlc3RyaWN0ZWQgcG9ydHMgdW5kZXIgVW5peCBvcGVyYXRpbmcgZW52aXJvbm1lbnRzLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBMaWZlY3ljbGVFeGNlcHRpb24gSWYgdGhpcyBzZXJ2ZXIgd2FzIGFscmVhZHkgaW5pdGlhbGl6ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpCisgICAgdGhyb3dzIExpZmVjeWNsZUV4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9TZXJ2ZXJGYWN0b3J5LmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvU2VydmVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1NzQ1YWUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvU2VydmVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmE7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRTZXJ2ZXI7CisKKworLyoqCisgKiA8cD48c3Ryb25nPlNlcnZlckZhY3Rvcnk8L3N0cm9uZz4gYWxsb3dzIHRoZSByZWdpc3RyYXRpb24gb2YgdGhlCisgKiAoc2luZ2xldG9uKSA8Y29kZT5TZXJ2ZXI8L2NvZGU+IGluc3RhbmNlIGZvciB0aGlzIEpWTSwgc28gdGhhdCBpdAorICogY2FuIGJlIGFjY2Vzc2VkIGluZGVwZW5kZW50bHkgb2YgYW55IGV4aXN0aW5nIHJlZmVyZW5jZSB0byB0aGUKKyAqIGNvbXBvbmVudCBoaWVyYXJjaHkuICBUaGlzIGlzIGltcG9ydGFudCBmb3IgYWRtaW5pc3RyYXRpb24gdG9vbHMKKyAqIHRoYXQgYXJlIGJ1aWx0IGFyb3VuZCB0aGUgaW50ZXJuYWwgY29tcG9uZW50IGltcGxlbWVudGF0aW9uIGNsYXNzZXMuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBTZXJ2ZXJGYWN0b3J5IHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTdGF0aWMgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBzaW5nbGV0b24gPGNvZGU+U2VydmVyPC9jb2RlPiBpbnN0YW5jZSBmb3IgdGhpcyBKVk0uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgU2VydmVyIHNlcnZlciA9IG51bGw7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbiA8Y29kZT5TZXJ2ZXI8L2NvZGU+IGluc3RhbmNlIGZvciB0aGlzIEpWTS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFNlcnZlciBnZXRTZXJ2ZXIoKSB7CisgICAgICAgIGlmKCBzZXJ2ZXI9PW51bGwgKQorICAgICAgICAgICAgc2VydmVyPW5ldyBTdGFuZGFyZFNlcnZlcigpOworICAgICAgICByZXR1cm4gKHNlcnZlcik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgc2luZ2xldG9uIDxjb2RlPlNlcnZlcjwvY29kZT4gaW5zdGFuY2UgZm9yIHRoaXMgSlZNLiAgVGhpcworICAgICAqIG1ldGhvZCBtdXN0IDxzdHJvbmc+b25seTwvc3Ryb25nPiBiZSBjYWxsZWQgZnJvbSBhIGNvbnN0cnVjdG9yIG9mCisgICAgICogdGhlIChzaW5nbGV0b24pIDxjb2RlPlNlcnZlcjwvY29kZT4gaW5zdGFuY2UgdGhhdCBpcyBjcmVhdGVkIGZvcgorICAgICAqIHRoaXMgZXhlY3V0aW9uIG9mIENhdGFsaW5hLgorICAgICAqCisgICAgICogQHBhcmFtIHRoZVNlcnZlciBUaGUgbmV3IHNpbmdsZXRvbiBpbnN0YW5jZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRTZXJ2ZXIoU2VydmVyIHRoZVNlcnZlcikgeworCisgICAgICAgIGlmIChzZXJ2ZXIgPT0gbnVsbCkKKyAgICAgICAgICAgIHNlcnZlciA9IHRoZVNlcnZlcjsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvU2VydmljZS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL1NlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWU5YThmCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL1NlcnZpY2UuamF2YQpAQCAtMCwwICsxLDEzMSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLkNvbm5lY3RvcjsKKworCisvKioKKyAqIEEgPHN0cm9uZz5TZXJ2aWNlPC9zdHJvbmc+IGlzIGEgZ3JvdXAgb2Ygb25lIG9yIG1vcmUKKyAqIDxzdHJvbmc+Q29ubmVjdG9yczwvc3Ryb25nPiB0aGF0IHNoYXJlIGEgc2luZ2xlIDxzdHJvbmc+Q29udGFpbmVyPC9zdHJvbmc+CisgKiB0byBwcm9jZXNzIHRoZWlyIGluY29taW5nIHJlcXVlc3RzLiAgVGhpcyBhcnJhbmdlbWVudCBhbGxvd3MsIGZvciBleGFtcGxlLAorICogYSBub24tU1NMIGFuZCBTU0wgY29ubmVjdG9yIHRvIHNoYXJlIHRoZSBzYW1lIHBvcHVsYXRpb24gb2Ygd2ViIGFwcHMuCisgKiA8cD4KKyAqIEEgZ2l2ZW4gSlZNIGNhbiBjb250YWluIGFueSBudW1iZXIgb2YgU2VydmljZSBpbnN0YW5jZXM7IGhvd2V2ZXIsIHRoZXkgYXJlCisgKiBjb21wbGV0ZWx5IGluZGVwZW5kZW50IG9mIGVhY2ggb3RoZXIgYW5kIHNoYXJlIG9ubHkgdGhlIGJhc2ljIEpWTSBmYWNpbGl0aWVzCisgKiBhbmQgY2xhc3NlcyBvbiB0aGUgc3lzdGVtIGNsYXNzIHBhdGguCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBpbnRlcmZhY2UgU2VydmljZSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIDxjb2RlPkNvbnRhaW5lcjwvY29kZT4gdGhhdCBoYW5kbGVzIHJlcXVlc3RzIGZvciBhbGwKKyAgICAgKiA8Y29kZT5Db25uZWN0b3JzPC9jb2RlPiBhc3NvY2lhdGVkIHdpdGggdGhpcyBTZXJ2aWNlLgorICAgICAqLworICAgIHB1YmxpYyBDb250YWluZXIgZ2V0Q29udGFpbmVyKCk7CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgPGNvZGU+Q29udGFpbmVyPC9jb2RlPiB0aGF0IGhhbmRsZXMgcmVxdWVzdHMgZm9yIGFsbAorICAgICAqIDxjb2RlPkNvbm5lY3RvcnM8L2NvZGU+IGFzc29jaWF0ZWQgd2l0aCB0aGlzIFNlcnZpY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBuZXcgQ29udGFpbmVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29udGFpbmVyKENvbnRhaW5lciBjb250YWluZXIpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBTZXJ2aWNlIGltcGxlbWVudGF0aW9uIGFuZAorICAgICAqIHRoZSBjb3JyZXNwb25kaW5nIHZlcnNpb24gbnVtYmVyLCBpbiB0aGUgZm9ybWF0CisgICAgICogPGNvZGU+Jmx0O2Rlc2NyaXB0aW9uJmd0Oy8mbHQ7dmVyc2lvbiZndDs8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5mbygpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyBTZXJ2aWNlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOworCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG5hbWUgb2YgdGhpcyBTZXJ2aWNlLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgVGhlIG5ldyBzZXJ2aWNlIG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSA8Y29kZT5TZXJ2ZXI8L2NvZGU+IHdpdGggd2hpY2ggd2UgYXJlIGFzc29jaWF0ZWQgKGlmIGFueSkuCisgICAgICovCisgICAgcHVibGljIFNlcnZlciBnZXRTZXJ2ZXIoKTsKKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSA8Y29kZT5TZXJ2ZXI8L2NvZGU+IHdpdGggd2hpY2ggd2UgYXJlIGFzc29jaWF0ZWQgKGlmIGFueSkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VydmVyIFRoZSBzZXJ2ZXIgdGhhdCBvd25zIHRoaXMgU2VydmljZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNlcnZlcihTZXJ2ZXIgc2VydmVyKTsKKworICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBuZXcgQ29ubmVjdG9yIHRvIHRoZSBzZXQgb2YgZGVmaW5lZCBDb25uZWN0b3JzLCBhbmQgYXNzb2NpYXRlIGl0CisgICAgICogd2l0aCB0aGlzIFNlcnZpY2UncyBDb250YWluZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdG9yIFRoZSBDb25uZWN0b3IgdG8gYmUgYWRkZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRDb25uZWN0b3IoQ29ubmVjdG9yIGNvbm5lY3Rvcik7CisKKworICAgIC8qKgorICAgICAqIEZpbmQgYW5kIHJldHVybiB0aGUgc2V0IG9mIENvbm5lY3RvcnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgU2VydmljZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29ubmVjdG9yW10gZmluZENvbm5lY3RvcnMoKTsKKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgQ29ubmVjdG9yIGZyb20gdGhlIHNldCBhc3NvY2lhdGVkIGZyb20gdGhpcworICAgICAqIFNlcnZpY2UuICBUaGUgcmVtb3ZlZCBDb25uZWN0b3Igd2lsbCBhbHNvIGJlIGRpc2Fzc29jaWF0ZWQgZnJvbSBvdXIKKyAgICAgKiBDb250YWluZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdG9yIFRoZSBDb25uZWN0b3IgdG8gYmUgcmVtb3ZlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUNvbm5lY3RvcihDb25uZWN0b3IgY29ubmVjdG9yKTsKKworICAgIC8qKgorICAgICAqIEludm9rZSBhIHByZS1zdGFydHVwIGluaXRpYWxpemF0aW9uLiBUaGlzIGlzIHVzZWQgdG8gYWxsb3cgY29ubmVjdG9ycworICAgICAqIHRvIGJpbmQgdG8gcmVzdHJpY3RlZCBwb3J0cyB1bmRlciBVbml4IG9wZXJhdGluZyBlbnZpcm9ubWVudHMuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIExpZmVjeWNsZUV4Y2VwdGlvbiBJZiB0aGlzIHNlcnZlciB3YXMgYWxyZWFkeSBpbml0aWFsaXplZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKCkKKyAgICB0aHJvd3MgTGlmZWN5Y2xlRXhjZXB0aW9uOworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvU2Vzc2lvbi5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL1Nlc3Npb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmQ0OTZmCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL1Nlc3Npb24uamF2YQpAQCAtMCwwICsxLDI3OSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LTIwMDEsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hOworCisKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaW5jaXBhbDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247CisKKworLyoqCisgKiBBIDxiPlNlc3Npb248L2I+IGlzIHRoZSBDYXRhbGluYS1pbnRlcm5hbCBmYWNhZGUgZm9yIGFuCisgKiA8Y29kZT5IdHRwU2Vzc2lvbjwvY29kZT4gdGhhdCBpcyB1c2VkIHRvIG1haW50YWluIHN0YXRlIGluZm9ybWF0aW9uCisgKiBiZXR3ZWVuIHJlcXVlc3RzIGZvciBhIHBhcnRpY3VsYXIgdXNlciBvZiBhIHdlYiBhcHBsaWNhdGlvbi4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGludGVyZmFjZSBTZXNzaW9uIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTWFuaWZlc3QgQ29uc3RhbnRzCisKKworICAgIC8qKgorICAgICAqIFRoZSBTZXNzaW9uRXZlbnQgZXZlbnQgdHlwZSB3aGVuIGEgc2Vzc2lvbiBpcyBjcmVhdGVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFU1NJT05fQ1JFQVRFRF9FVkVOVCA9ICJjcmVhdGVTZXNzaW9uIjsKKworCisgICAgLyoqCisgICAgICogVGhlIFNlc3Npb25FdmVudCBldmVudCB0eXBlIHdoZW4gYSBzZXNzaW9uIGlzIGRlc3Ryb3llZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVNTSU9OX0RFU1RST1lFRF9FVkVOVCA9ICJkZXN0cm95U2Vzc2lvbiI7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGF1dGhlbnRpY2F0aW9uIHR5cGUgdXNlZCB0byBhdXRoZW50aWNhdGUgb3VyIGNhY2hlZAorICAgICAqIFByaW5jaXBhbCwgaWYgYW55LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXV0aFR5cGUoKTsKKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBhdXRoZW50aWNhdGlvbiB0eXBlIHVzZWQgdG8gYXV0aGVudGljYXRlIG91ciBjYWNoZWQKKyAgICAgKiBQcmluY2lwYWwsIGlmIGFueS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhdXRoVHlwZSBUaGUgbmV3IGNhY2hlZCBhdXRoZW50aWNhdGlvbiB0eXBlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QXV0aFR5cGUoU3RyaW5nIGF1dGhUeXBlKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjcmVhdGlvbiB0aW1lIGZvciB0aGlzIHNlc3Npb24uCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0Q3JlYXRpb25UaW1lKCk7CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY3JlYXRpb24gdGltZSBmb3IgdGhpcyBzZXNzaW9uLiAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZQorICAgICAqIE1hbmFnZXIgd2hlbiBhbiBleGlzdGluZyBTZXNzaW9uIGluc3RhbmNlIGlzIHJldXNlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0aW1lIFRoZSBuZXcgY3JlYXRpb24gdGltZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENyZWF0aW9uVGltZShsb25nIHRpbWUpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNlc3Npb24gaWRlbnRpZmllciBmb3IgdGhpcyBzZXNzaW9uLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKTsKKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzZXNzaW9uIGlkZW50aWZpZXIgZm9yIHRoaXMgc2Vzc2lvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpZCBUaGUgbmV3IHNlc3Npb24gaWRlbnRpZmllcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBpZCk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIFNlc3Npb24gaW1wbGVtZW50YXRpb24gYW5kCisgICAgICogdGhlIGNvcnJlc3BvbmRpbmcgdmVyc2lvbiBudW1iZXIsIGluIHRoZSBmb3JtYXQKKyAgICAgKiA8Y29kZT4mbHQ7ZGVzY3JpcHRpb24mZ3Q7LyZsdDt2ZXJzaW9uJmd0OzwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJbmZvKCk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbGFzdCB0aW1lIHRoZSBjbGllbnQgc2VudCBhIHJlcXVlc3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMKKyAgICAgKiBzZXNzaW9uLCBhcyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBzaW5jZSBtaWRuaWdodCwgSmFudWFyeSAxLCAxOTcwCisgICAgICogR01ULiAgQWN0aW9ucyB0aGF0IHlvdXIgYXBwbGljYXRpb24gdGFrZXMsIHN1Y2ggYXMgZ2V0dGluZyBvciBzZXR0aW5nCisgICAgICogYSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNlc3Npb24sIGRvIG5vdCBhZmZlY3QgdGhlIGFjY2VzcyB0aW1lLgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldExhc3RBY2Nlc3NlZFRpbWUoKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBNYW5hZ2VyIHdpdGhpbiB3aGljaCB0aGlzIFNlc3Npb24gaXMgdmFsaWQuCisgICAgICovCisgICAgcHVibGljIE1hbmFnZXIgZ2V0TWFuYWdlcigpOworCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIE1hbmFnZXIgd2l0aGluIHdoaWNoIHRoaXMgU2Vzc2lvbiBpcyB2YWxpZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYW5hZ2VyIFRoZSBuZXcgTWFuYWdlcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1hbmFnZXIoTWFuYWdlciBtYW5hZ2VyKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBtYXhpbXVtIHRpbWUgaW50ZXJ2YWwsIGluIHNlY29uZHMsIGJldHdlZW4gY2xpZW50IHJlcXVlc3RzCisgICAgICogYmVmb3JlIHRoZSBzZXJ2bGV0IGNvbnRhaW5lciB3aWxsIGludmFsaWRhdGUgdGhlIHNlc3Npb24uICBBIG5lZ2F0aXZlCisgICAgICogdGltZSBpbmRpY2F0ZXMgdGhhdCB0aGUgc2Vzc2lvbiBzaG91bGQgbmV2ZXIgdGltZSBvdXQuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRNYXhJbmFjdGl2ZUludGVydmFsKCk7CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbWF4aW11bSB0aW1lIGludGVydmFsLCBpbiBzZWNvbmRzLCBiZXR3ZWVuIGNsaWVudCByZXF1ZXN0cworICAgICAqIGJlZm9yZSB0aGUgc2VydmxldCBjb250YWluZXIgd2lsbCBpbnZhbGlkYXRlIHRoZSBzZXNzaW9uLiAgQSBuZWdhdGl2ZQorICAgICAqIHRpbWUgaW5kaWNhdGVzIHRoYXQgdGhlIHNlc3Npb24gc2hvdWxkIG5ldmVyIHRpbWUgb3V0LgorICAgICAqCisgICAgICogQHBhcmFtIGludGVydmFsIFRoZSBuZXcgbWF4aW11bSBpbnRlcnZhbAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1heEluYWN0aXZlSW50ZXJ2YWwoaW50IGludGVydmFsKTsKKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSA8Y29kZT5pc05ldzwvY29kZT4gZmxhZyBmb3IgdGhpcyBzZXNzaW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGlzTmV3IFRoZSBuZXcgdmFsdWUgZm9yIHRoZSA8Y29kZT5pc05ldzwvY29kZT4gZmxhZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE5ldyhib29sZWFuIGlzTmV3KTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBhdXRoZW50aWNhdGVkIFByaW5jaXBhbCB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFNlc3Npb24uCisgICAgICogVGhpcyBwcm92aWRlcyBhbiA8Y29kZT5BdXRoZW50aWNhdG9yPC9jb2RlPiB3aXRoIGEgbWVhbnMgdG8gY2FjaGUgYQorICAgICAqIHByZXZpb3VzbHkgYXV0aGVudGljYXRlZCBQcmluY2lwYWwsIGFuZCBhdm9pZCBwb3RlbnRpYWxseSBleHBlbnNpdmUKKyAgICAgKiA8Y29kZT5SZWFsbS5hdXRoZW50aWNhdGUoKTwvY29kZT4gY2FsbHMgb24gZXZlcnkgcmVxdWVzdC4gIElmIHRoZXJlCisgICAgICogaXMgbm8gY3VycmVudCBhc3NvY2lhdGVkIFByaW5jaXBhbCwgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBQcmluY2lwYWwgZ2V0UHJpbmNpcGFsKCk7CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYXV0aGVudGljYXRlZCBQcmluY2lwYWwgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBTZXNzaW9uLgorICAgICAqIFRoaXMgcHJvdmlkZXMgYW4gPGNvZGU+QXV0aGVudGljYXRvcjwvY29kZT4gd2l0aCBhIG1lYW5zIHRvIGNhY2hlIGEKKyAgICAgKiBwcmV2aW91c2x5IGF1dGhlbnRpY2F0ZWQgUHJpbmNpcGFsLCBhbmQgYXZvaWQgcG90ZW50aWFsbHkgZXhwZW5zaXZlCisgICAgICogPGNvZGU+UmVhbG0uYXV0aGVudGljYXRlKCk8L2NvZGU+IGNhbGxzIG9uIGV2ZXJ5IHJlcXVlc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJpbmNpcGFsIFRoZSBuZXcgUHJpbmNpcGFsLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJpbmNpcGFsKFByaW5jaXBhbCBwcmluY2lwYWwpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIDxjb2RlPkh0dHBTZXNzaW9uPC9jb2RlPiBmb3Igd2hpY2ggdGhpcyBvYmplY3QKKyAgICAgKiBpcyB0aGUgZmFjYWRlLgorICAgICAqLworICAgIHB1YmxpYyBIdHRwU2Vzc2lvbiBnZXRTZXNzaW9uKCk7CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgPGNvZGU+aXNWYWxpZDwvY29kZT4gZmxhZyBmb3IgdGhpcyBzZXNzaW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGlzVmFsaWQgVGhlIG5ldyB2YWx1ZSBmb3IgdGhlIDxjb2RlPmlzVmFsaWQ8L2NvZGU+IGZsYWcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRWYWxpZChib29sZWFuIGlzVmFsaWQpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIDxjb2RlPmlzVmFsaWQ8L2NvZGU+IGZsYWcgZm9yIHRoaXMgc2Vzc2lvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCk7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBVcGRhdGUgdGhlIGFjY2Vzc2VkIHRpbWUgaW5mb3JtYXRpb24gZm9yIHRoaXMgc2Vzc2lvbi4gIFRoaXMgbWV0aG9kCisgICAgICogc2hvdWxkIGJlIGNhbGxlZCBieSB0aGUgY29udGV4dCB3aGVuIGEgcmVxdWVzdCBjb21lcyBpbiBmb3IgYSBwYXJ0aWN1bGFyCisgICAgICogc2Vzc2lvbiwgZXZlbiBpZiB0aGUgYXBwbGljYXRpb24gZG9lcyBub3QgcmVmZXJlbmNlIGl0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFjY2VzcygpOworCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBzZXNzaW9uIGV2ZW50IGxpc3RlbmVyIHRvIHRoaXMgY29tcG9uZW50LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFNlc3Npb25MaXN0ZW5lcihTZXNzaW9uTGlzdGVuZXIgbGlzdGVuZXIpOworCisKKyAgICAvKioKKyAgICAgKiBFbmQgYWNjZXNzIHRvIHRoZSBzZXNzaW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGVuZEFjY2VzcygpOworCisKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtIHRoZSBpbnRlcm5hbCBwcm9jZXNzaW5nIHJlcXVpcmVkIHRvIGludmFsaWRhdGUgdGhpcyBzZXNzaW9uLAorICAgICAqIHdpdGhvdXQgdHJpZ2dlcmluZyBhbiBleGNlcHRpb24gaWYgdGhlIHNlc3Npb24gaGFzIGFscmVhZHkgZXhwaXJlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleHBpcmUoKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBvYmplY3QgYm91bmQgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgdG8gdGhlIGludGVybmFsIG5vdGVzCisgICAgICogZm9yIHRoaXMgc2Vzc2lvbiwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gc3VjaCBiaW5kaW5nIGV4aXN0cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIG5vdGUgdG8gYmUgcmV0dXJuZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldE5vdGUoU3RyaW5nIG5hbWUpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYW4gSXRlcmF0b3IgY29udGFpbmluZyB0aGUgU3RyaW5nIG5hbWVzIG9mIGFsbCBub3RlcyBiaW5kaW5ncworICAgICAqIHRoYXQgZXhpc3QgZm9yIHRoaXMgc2Vzc2lvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgSXRlcmF0b3IgZ2V0Tm90ZU5hbWVzKCk7CisKKworICAgIC8qKgorICAgICAqIFJlbGVhc2UgYWxsIG9iamVjdCByZWZlcmVuY2VzLCBhbmQgaW5pdGlhbGl6ZSBpbnN0YW5jZSB2YXJpYWJsZXMsIGluCisgICAgICogcHJlcGFyYXRpb24gZm9yIHJldXNlIG9mIHRoaXMgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlY3ljbGUoKTsKKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGFueSBvYmplY3QgYm91bmQgdG8gdGhlIHNwZWNpZmllZCBuYW1lIGluIHRoZSBpbnRlcm5hbCBub3RlcworICAgICAqIGZvciB0aGlzIHNlc3Npb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBub3RlIHRvIGJlIHJlbW92ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVOb3RlKFN0cmluZyBuYW1lKTsKKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGEgc2Vzc2lvbiBldmVudCBsaXN0ZW5lciBmcm9tIHRoaXMgY29tcG9uZW50LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVNlc3Npb25MaXN0ZW5lcihTZXNzaW9uTGlzdGVuZXIgbGlzdGVuZXIpOworCisKKyAgICAvKioKKyAgICAgKiBCaW5kIGFuIG9iamVjdCB0byBhIHNwZWNpZmllZCBuYW1lIGluIHRoZSBpbnRlcm5hbCBub3RlcyBhc3NvY2lhdGVkCisgICAgICogd2l0aCB0aGlzIHNlc3Npb24sIHJlcGxhY2luZyBhbnkgZXhpc3RpbmcgYmluZGluZyBmb3IgdGhpcyBuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSB0byB3aGljaCB0aGUgb2JqZWN0IHNob3VsZCBiZSBib3VuZAorICAgICAqIEBwYXJhbSB2YWx1ZSBPYmplY3QgdG8gYmUgYm91bmQgdG8gdGhlIHNwZWNpZmllZCBuYW1lCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Tm90ZShTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKTsKKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvU2Vzc2lvbkV2ZW50LmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvU2Vzc2lvbkV2ZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTExMzgwMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9TZXNzaW9uRXZlbnQuamF2YQpAQCAtMCwwICsxLDExMSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LTIwMDEsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hOworCisKK2ltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7CisKKworLyoqCisgKiBHZW5lcmFsIGV2ZW50IGZvciBub3RpZnlpbmcgbGlzdGVuZXJzIG9mIHNpZ25pZmljYW50IGNoYW5nZXMgb24gYSBTZXNzaW9uLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgU2Vzc2lvbkV2ZW50CisgICAgZXh0ZW5kcyBFdmVudE9iamVjdCB7CisKKworICAgIC8qKgorICAgICAqIFRoZSBldmVudCBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGV2ZW50LgorICAgICAqLworICAgIHByaXZhdGUgT2JqZWN0IGRhdGEgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgU2Vzc2lvbiBvbiB3aGljaCB0aGlzIGV2ZW50IG9jY3VycmVkLgorICAgICAqLworICAgIHByaXZhdGUgU2Vzc2lvbiBzZXNzaW9uID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIGV2ZW50IHR5cGUgdGhpcyBpbnN0YW5jZSByZXByZXNlbnRzLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHR5cGUgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgU2Vzc2lvbkV2ZW50IHdpdGggdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLgorICAgICAqCisgICAgICogQHBhcmFtIHNlc3Npb24gU2Vzc2lvbiBvbiB3aGljaCB0aGlzIGV2ZW50IG9jY3VycmVkCisgICAgICogQHBhcmFtIHR5cGUgRXZlbnQgdHlwZQorICAgICAqIEBwYXJhbSBkYXRhIEV2ZW50IGRhdGEKKyAgICAgKi8KKyAgICBwdWJsaWMgU2Vzc2lvbkV2ZW50KFNlc3Npb24gc2Vzc2lvbiwgU3RyaW5nIHR5cGUsIE9iamVjdCBkYXRhKSB7CisKKyAgICAgICAgc3VwZXIoc2Vzc2lvbik7CisgICAgICAgIHRoaXMuc2Vzc2lvbiA9IHNlc3Npb247CisgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZXZlbnQgZGF0YSBvZiB0aGlzIGV2ZW50LgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0RGF0YSgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMuZGF0YSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgU2Vzc2lvbiBvbiB3aGljaCB0aGlzIGV2ZW50IG9jY3VycmVkLgorICAgICAqLworICAgIHB1YmxpYyBTZXNzaW9uIGdldFNlc3Npb24oKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLnNlc3Npb24pOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGV2ZW50IHR5cGUgb2YgdGhpcyBldmVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLnR5cGUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBldmVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCisgICAgICAgIHJldHVybiAoIlNlc3Npb25FdmVudFsnIiArIGdldFNlc3Npb24oKSArICInLCciICsKKyAgICAgICAgICAgICAgICBnZXRUeXBlKCkgKyAiJ10iKTsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvU2Vzc2lvbkxpc3RlbmVyLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvU2Vzc2lvbkxpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTMxM2NiMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9TZXNzaW9uTGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IDE5OTktMjAwMSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmE7CisKKworCisKKy8qKgorICogSW50ZXJmYWNlIGRlZmluaW5nIGEgbGlzdGVuZXIgZm9yIHNpZ25pZmljYW50IFNlc3Npb24gZ2VuZXJhdGVkIGV2ZW50cy4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGludGVyZmFjZSBTZXNzaW9uTGlzdGVuZXIgeworCisKKyAgICAvKioKKyAgICAgKiBBY2tub3dsZWRnZSB0aGUgb2NjdXJyZW5jZSBvZiB0aGUgc3BlY2lmaWVkIGV2ZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGV2ZW50IFNlc3Npb25FdmVudCB0aGF0IGhhcyBvY2N1cnJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNlc3Npb25FdmVudChTZXNzaW9uRXZlbnQgZXZlbnQpOworCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9TdG9yZS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL1N0b3JlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjlhMDIxNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9TdG9yZS5qYXZhCkBAIC0wLDAgKzEsMTQ0IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hOworCisKK2ltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworCisvKioKKyAqIEEgPGI+U3RvcmU8L2I+IGlzIHRoZSBhYnN0cmFjdGlvbiBvZiBhIENhdGFsaW5hIGNvbXBvbmVudCB0aGF0IHByb3ZpZGVzCisgKiBwZXJzaXN0ZW50IHN0b3JhZ2UgYW5kIGxvYWRpbmcgb2YgU2Vzc2lvbnMgYW5kIHRoZWlyIGFzc29jaWF0ZWQgdXNlciBkYXRhLgorICogSW1wbGVtZW50YXRpb25zIGFyZSBmcmVlIHRvIHNhdmUgYW5kIGxvYWQgdGhlIFNlc3Npb25zIHRvIGFueSBtZWRpYSB0aGV5CisgKiB3aXNoLCBidXQgaXQgaXMgYXNzdW1lZCB0aGF0IHNhdmVkIFNlc3Npb25zIGFyZSBwZXJzaXN0ZW50IGFjcm9zcworICogc2VydmVyIG9yIGNvbnRleHQgcmVzdGFydHMuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBpbnRlcmZhY2UgU3RvcmUgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgU3RvcmUgaW1wbGVtZW50YXRpb24gYW5kCisgICAgICogdGhlIGNvcnJlc3BvbmRpbmcgdmVyc2lvbiBudW1iZXIsIGluIHRoZSBmb3JtYXQKKyAgICAgKiA8Y29kZT4mbHQ7ZGVzY3JpcHRpb24mZ3Q7LyZsdDt2ZXJzaW9uJmd0OzwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJbmZvKCk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgTWFuYWdlciBpbnN0YW5jZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBTdG9yZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWFuYWdlciBnZXRNYW5hZ2VyKCk7CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgTWFuYWdlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBTdG9yZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYW5hZ2VyIFRoZSBNYW5hZ2VyIHdoaWNoIHdpbGwgdXNlIHRoaXMgU3RvcmUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWFuYWdlcihNYW5hZ2VyIG1hbmFnZXIpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBTZXNzaW9ucyBwcmVzZW50IGluIHRoaXMgU3RvcmUuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFNpemUoKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIgdG8gdGhpcyBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRvIGFkZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcik7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhbiBhcnJheSBjb250YWluaW5nIHRoZSBzZXNzaW9uIGlkZW50aWZpZXJzIG9mIGFsbCBTZXNzaW9ucworICAgICAqIGN1cnJlbnRseSBzYXZlZCBpbiB0aGlzIFN0b3JlLiAgSWYgdGhlcmUgYXJlIG5vIHN1Y2ggU2Vzc2lvbnMsIGEKKyAgICAgKiB6ZXJvLWxlbmd0aCBhcnJheSBpcyByZXR1cm5lZC4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycmVkCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGtleXMoKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKworICAgIC8qKgorICAgICAqIExvYWQgYW5kIHJldHVybiB0aGUgU2Vzc2lvbiBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBzZXNzaW9uCisgICAgICogaWRlbnRpZmllciBmcm9tIHRoaXMgU3RvcmUsIHdpdGhvdXQgcmVtb3ZpbmcgaXQuICBJZiB0aGVyZSBpcyBubworICAgICAqIHN1Y2ggc3RvcmVkIFNlc3Npb24sIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpZCBTZXNzaW9uIGlkZW50aWZpZXIgb2YgdGhlIHNlc3Npb24gdG8gbG9hZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGlmIGEgZGVzZXJpYWxpemF0aW9uIGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBTZXNzaW9uIGxvYWQoU3RyaW5nIGlkKQorICAgICAgICB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb247CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGUgU2Vzc2lvbiB3aXRoIHRoZSBzcGVjaWZpZWQgc2Vzc2lvbiBpZGVudGlmaWVyIGZyb20KKyAgICAgKiB0aGlzIFN0b3JlLCBpZiBwcmVzZW50LiAgSWYgbm8gc3VjaCBTZXNzaW9uIGlzIHByZXNlbnQsIHRoaXMgbWV0aG9kCisgICAgICogdGFrZXMgbm8gYWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGlkIFNlc3Npb24gaWRlbnRpZmllciBvZiB0aGUgU2Vzc2lvbiB0byBiZSByZW1vdmVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmUoU3RyaW5nIGlkKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhbGwgU2Vzc2lvbnMgZnJvbSB0aGlzIFN0b3JlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgdGhyb3dzIElPRXhjZXB0aW9uOworCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIgZnJvbSB0aGlzIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgdG8gcmVtb3ZlCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKTsKKworCisgICAgLyoqCisgICAgICogU2F2ZSB0aGUgc3BlY2lmaWVkIFNlc3Npb24gaW50byB0aGlzIFN0b3JlLiAgQW55IHByZXZpb3VzbHkgc2F2ZWQKKyAgICAgKiBpbmZvcm1hdGlvbiBmb3IgdGhlIGFzc29jaWF0ZWQgc2Vzc2lvbiBpZGVudGlmaWVyIGlzIHJlcGxhY2VkLgorICAgICAqCisgICAgICogQHBhcmFtIHNlc3Npb24gU2Vzc2lvbiB0byBiZSBzYXZlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2F2ZShTZXNzaW9uIHNlc3Npb24pIHRocm93cyBJT0V4Y2VwdGlvbjsKKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvVXNlci5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL1VzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTQyYTc5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL1VzZXIuamF2YQpAQCAtMCwwICsxLDE3MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYTsKKworCitpbXBvcnQgamF2YS5zZWN1cml0eS5QcmluY2lwYWw7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCisKKy8qKgorICogPHA+QWJzdHJhY3QgcmVwcmVzZW50YXRpb24gb2YgYSB1c2VyIGluIGEge0BsaW5rIFVzZXJEYXRhYmFzZX0uICBFYWNoIHVzZXIKKyAqIGlzIG9wdGlvbmFsbHkgYXNzb2NpYXRlZCB3aXRoIGEgc2V0IG9mIHtAbGluayBHcm91cH1zIHRocm91Z2ggd2hpY2ggaGUgb3IKKyAqIHNoZSBpbmhlcml0cyBhZGRpdGlvbmFsIHNlY3VyaXR5IHJvbGVzLCBhbmQgaXMgb3B0aW9uYWxseSBhc3NpZ25lZCBhIHNldAorICogb2Ygc3BlY2lmaWMge0BsaW5rIFJvbGV9cy48L3A+CisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICogQHNpbmNlIDQuMQorICovCisKK3B1YmxpYyBpbnRlcmZhY2UgVXNlciBleHRlbmRzIFByaW5jaXBhbCB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGZ1bGwgbmFtZSBvZiB0aGlzIHVzZXIuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRGdWxsTmFtZSgpOworCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGZ1bGwgbmFtZSBvZiB0aGlzIHVzZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnVsbE5hbWUgVGhlIG5ldyBmdWxsIG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGdWxsTmFtZShTdHJpbmcgZnVsbE5hbWUpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNldCBvZiB7QGxpbmsgR3JvdXB9cyB0byB3aGljaCB0aGlzIHVzZXIgYmVsb25ncy4KKyAgICAgKi8KKyAgICBwdWJsaWMgSXRlcmF0b3IgZ2V0R3JvdXBzKCk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbG9nb24gcGFzc3dvcmQgb2YgdGhpcyB1c2VyLCBvcHRpb25hbGx5IHByZWZpeGVkIHdpdGggdGhlCisgICAgICogaWRlbnRpZmllciBvZiBhbiBlbmNvZGluZyBzY2hlbWUgc3Vycm91bmRlZCBieSBjdXJseSBicmFjZXMsIHN1Y2ggYXMKKyAgICAgKiA8Y29kZT57bWQ1fXh4eHh4PC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhc3N3b3JkKCk7CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbG9nb24gcGFzc3dvcmQgb2YgdGhpcyB1c2VyLCBvcHRpb25hbGx5IHByZWZpeGVkIHdpdGggdGhlCisgICAgICogaWRlbnRpZmllciBvZiBhbiBlbmNvZGluZyBzY2hlbWUgc3Vycm91bmRlZCBieSBjdXJseSBicmFjZXMsIHN1Y2ggYXMKKyAgICAgKiA8Y29kZT57bWQ1fXh4eHh4PC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXNzd29yZCBUaGUgbmV3IGxvZ29uIHBhc3N3b3JkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmQoU3RyaW5nIHBhc3N3b3JkKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXQgb2Yge0BsaW5rIFJvbGV9cyBhc3NpZ25lZCBzcGVjaWZpY2FsbHkgdG8gdGhpcyB1c2VyLgorICAgICAqLworICAgIHB1YmxpYyBJdGVyYXRvciBnZXRSb2xlcygpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHtAbGluayBVc2VyRGF0YWJhc2V9IHdpdGhpbiB3aGljaCB0aGlzIFVzZXIgaXMgZGVmaW5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgVXNlckRhdGFiYXNlIGdldFVzZXJEYXRhYmFzZSgpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGxvZ29uIHVzZXJuYW1lIG9mIHRoaXMgdXNlciwgd2hpY2ggbXVzdCBiZSB1bmlxdWUKKyAgICAgKiB3aXRoaW4gdGhlIHNjb3BlIG9mIGEge0BsaW5rIFVzZXJEYXRhYmFzZX0uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRVc2VybmFtZSgpOworCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGxvZ29uIHVzZXJuYW1lIG9mIHRoaXMgdXNlciwgd2hpY2ggbXVzdCBiZSB1bmlxdWUgd2l0aGluCisgICAgICogdGhlIHNjb3BlIG9mIGEge0BsaW5rIFVzZXJEYXRhYmFzZX0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXNlcm5hbWUgVGhlIG5ldyBsb2dvbiB1c2VybmFtZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVzZXJuYW1lKFN0cmluZyB1c2VybmFtZSk7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBuZXcge0BsaW5rIEdyb3VwfSB0byB0aG9zZSB0aGlzIHVzZXIgYmVsb25ncyB0by4KKyAgICAgKgorICAgICAqIEBwYXJhbSBncm91cCBUaGUgbmV3IGdyb3VwCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkR3JvdXAoR3JvdXAgZ3JvdXApOworCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSB7QGxpbmsgUm9sZX0gdG8gdGhvc2UgYXNzaWduZWQgc3BlY2lmaWNhbGx5IHRvIHRoaXMgdXNlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSByb2xlIFRoZSBuZXcgcm9sZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFJvbGUoUm9sZSByb2xlKTsKKworCisgICAgLyoqCisgICAgICogSXMgdGhpcyB1c2VyIGluIHRoZSBzcGVjaWZpZWQge0BsaW5rIEdyb3VwfT8KKyAgICAgKgorICAgICAqIEBwYXJhbSBncm91cCBUaGUgZ3JvdXAgdG8gY2hlY2sKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0luR3JvdXAoR3JvdXAgZ3JvdXApOworCisKKyAgICAvKioKKyAgICAgKiBJcyB0aGlzIHVzZXIgc3BlY2lmaWNhbGx5IGFzc2lnbmVkIHRoZSBzcGVjaWZpZWQge0BsaW5rIFJvbGV9PyAgVGhpcworICAgICAqIG1ldGhvZCBkb2VzIDxzdHJvbmc+Tk9UPC9zdHJvbmc+IGNoZWNrIGZvciByb2xlcyBpbmhlcml0ZWQgYmFzZWQgb24KKyAgICAgKiB7QGxpbmsgR3JvdXB9IG1lbWJlcnNoaXAuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcm9sZSBUaGUgcm9sZSB0byBjaGVjaworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzSW5Sb2xlKFJvbGUgcm9sZSk7CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhIHtAbGluayBHcm91cH0gZnJvbSB0aG9zZSB0aGlzIHVzZXIgYmVsb25ncyB0by4KKyAgICAgKgorICAgICAqIEBwYXJhbSBncm91cCBUaGUgb2xkIGdyb3VwCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlR3JvdXAoR3JvdXAgZ3JvdXApOworCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYWxsIHtAbGluayBHcm91cH1zIGZyb20gdGhvc2UgdGhpcyB1c2VyIGJlbG9uZ3MgdG8uCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlR3JvdXBzKCk7CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhIHtAbGluayBSb2xlfSBmcm9tIHRob3NlIGFzc2lnbmVkIHRvIHRoaXMgdXNlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSByb2xlIFRoZSBvbGQgcm9sZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVJvbGUoUm9sZSByb2xlKTsKKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGFsbCB7QGxpbmsgUm9sZX1zIGZyb20gdGhvc2UgYXNzaWduZWQgdG8gdGhpcyB1c2VyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVJvbGVzKCk7CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL1VzZXJEYXRhYmFzZS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL1VzZXJEYXRhYmFzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4YWY2M2IKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvVXNlckRhdGFiYXNlLmphdmEKQEAgLTAsMCArMSwxNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmE7CisKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworCisvKioKKyAqIDxwPkFic3RyYWN0IHJlcHJlc2VudGF0aW9uIG9mIGEgZGF0YWJhc2Ugb2Yge0BsaW5rIFVzZXJ9cyBhbmQKKyAqIHtAbGluayBHcm91cH1zIHRoYXQgY2FuIGJlIG1haW50YWluZWQgYnkgYW4gYXBwbGljYXRpb24sCisgKiBhbG9uZyB3aXRoIGRlZmluaXRpb25zIG9mIGNvcnJlc3BvbmRpbmcge0BsaW5rIFJvbGV9cywgYW5kCisgKiByZWZlcmVuY2VkIGJ5IGEge0BsaW5rIFJlYWxtfSBmb3IgYXV0aGVudGljYXRpb24gYW5kIGFjY2VzcyBjb250cm9sLjwvcD4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKiBAc2luY2UgNC4xCisgKi8KKworcHVibGljIGludGVyZmFjZSBVc2VyRGF0YWJhc2UgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXQgb2Yge0BsaW5rIEdyb3VwfXMgZGVmaW5lZCBpbiB0aGlzIHVzZXIgZGF0YWJhc2UuCisgICAgICovCisgICAgcHVibGljIEl0ZXJhdG9yIGdldEdyb3VwcygpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHVuaXF1ZSBnbG9iYWwgaWRlbnRpZmllciBvZiB0aGlzIHVzZXIgZGF0YWJhc2UuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJZCgpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNldCBvZiB7QGxpbmsgUm9sZX1zIGRlZmluZWQgaW4gdGhpcyB1c2VyIGRhdGFiYXNlLgorICAgICAqLworICAgIHB1YmxpYyBJdGVyYXRvciBnZXRSb2xlcygpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNldCBvZiB7QGxpbmsgVXNlcn1zIGRlZmluZWQgaW4gdGhpcyB1c2VyIGRhdGFiYXNlLgorICAgICAqLworICAgIHB1YmxpYyBJdGVyYXRvciBnZXRVc2VycygpOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogRmluYWxpemUgYWNjZXNzIHRvIHRoaXMgdXNlciBkYXRhYmFzZS4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFueSBleGNlcHRpb24gaXMgdGhyb3duIGR1cmluZyBjbG9zaW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgRXhjZXB0aW9uOworCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW5kIHJldHVybiBhIG5ldyB7QGxpbmsgR3JvdXB9IGRlZmluZWQgaW4gdGhpcyB1c2VyIGRhdGFiYXNlLgorICAgICAqCisgICAgICogQHBhcmFtIGdyb3VwbmFtZSBUaGUgZ3JvdXAgbmFtZSBvZiB0aGUgbmV3IGdyb3VwIChtdXN0IGJlIHVuaXF1ZSkKKyAgICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gVGhlIGRlc2NyaXB0aW9uIG9mIHRoaXMgZ3JvdXAKKyAgICAgKi8KKyAgICBwdWJsaWMgR3JvdXAgY3JlYXRlR3JvdXAoU3RyaW5nIGdyb3VwbmFtZSwgU3RyaW5nIGRlc2NyaXB0aW9uKTsKKworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuZCByZXR1cm4gYSBuZXcge0BsaW5rIFJvbGV9IGRlZmluZWQgaW4gdGhpcyB1c2VyIGRhdGFiYXNlLgorICAgICAqCisgICAgICogQHBhcmFtIHJvbGVuYW1lIFRoZSByb2xlIG5hbWUgb2YgdGhlIG5ldyByb2xlIChtdXN0IGJlIHVuaXF1ZSkKKyAgICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gVGhlIGRlc2NyaXB0aW9uIG9mIHRoaXMgcm9sZQorICAgICAqLworICAgIHB1YmxpYyBSb2xlIGNyZWF0ZVJvbGUoU3RyaW5nIHJvbGVuYW1lLCBTdHJpbmcgZGVzY3JpcHRpb24pOworCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW5kIHJldHVybiBhIG5ldyB7QGxpbmsgVXNlcn0gZGVmaW5lZCBpbiB0aGlzIHVzZXIgZGF0YWJhc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXNlcm5hbWUgVGhlIGxvZ29uIHVzZXJuYW1lIG9mIHRoZSBuZXcgdXNlciAobXVzdCBiZSB1bmlxdWUpCisgICAgICogQHBhcmFtIHBhc3N3b3JkIFRoZSBsb2dvbiBwYXNzd29yZCBvZiB0aGUgbmV3IHVzZXIKKyAgICAgKiBAcGFyYW0gZnVsbE5hbWUgVGhlIGZ1bGwgbmFtZSBvZiB0aGUgbmV3IHVzZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgVXNlciBjcmVhdGVVc2VyKFN0cmluZyB1c2VybmFtZSwgU3RyaW5nIHBhc3N3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZ1bGxOYW1lKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB7QGxpbmsgR3JvdXB9IHdpdGggdGhlIHNwZWNpZmllZCBncm91cCBuYW1lLCBpZiBhbnk7CisgICAgICogb3RoZXJ3aXNlIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBncm91cG5hbWUgTmFtZSBvZiB0aGUgZ3JvdXAgdG8gcmV0dXJuCisgICAgICovCisgICAgcHVibGljIEdyb3VwIGZpbmRHcm91cChTdHJpbmcgZ3JvdXBuYW1lKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB7QGxpbmsgUm9sZX0gd2l0aCB0aGUgc3BlY2lmaWVkIHJvbGUgbmFtZSwgaWYgYW55OworICAgICAqIG90aGVyd2lzZSByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcm9sZW5hbWUgTmFtZSBvZiB0aGUgcm9sZSB0byByZXR1cm4KKyAgICAgKi8KKyAgICBwdWJsaWMgUm9sZSBmaW5kUm9sZShTdHJpbmcgcm9sZW5hbWUpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHtAbGluayBVc2VyfSB3aXRoIHRoZSBzcGVjaWZpZWQgdXNlciBuYW1lLCBpZiBhbnk7CisgICAgICogb3RoZXJ3aXNlIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1c2VybmFtZSBOYW1lIG9mIHRoZSB1c2VyIHRvIHJldHVybgorICAgICAqLworICAgIHB1YmxpYyBVc2VyIGZpbmRVc2VyKFN0cmluZyB1c2VybmFtZSk7CisKKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemUgYWNjZXNzIHRvIHRoaXMgdXNlciBkYXRhYmFzZS4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFueSBleGNlcHRpb24gaXMgdGhyb3duIGR1cmluZyBvcGVuaW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgb3BlbigpIHRocm93cyBFeGNlcHRpb247CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIHtAbGluayBHcm91cH0gZnJvbSB0aGlzIHVzZXIgZGF0YWJhc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZ3JvdXAgVGhlIGdyb3VwIHRvIGJlIHJlbW92ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVHcm91cChHcm91cCBncm91cCk7CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIHtAbGluayBSb2xlfSBmcm9tIHRoaXMgdXNlciBkYXRhYmFzZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByb2xlIFRoZSByb2xlIHRvIGJlIHJlbW92ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVSb2xlKFJvbGUgcm9sZSk7CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIHtAbGluayBVc2VyfSBmcm9tIHRoaXMgdXNlciBkYXRhYmFzZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1c2VyIFRoZSB1c2VyIHRvIGJlIHJlbW92ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVVc2VyKFVzZXIgdXNlcik7CisKKworICAgIC8qKgorICAgICAqIFNhdmUgYW55IHVwZGF0ZWQgaW5mb3JtYXRpb24gdG8gdGhlIHBlcnNpc3RlbnQgc3RvcmFnZSBsb2NhdGlvbiBmb3IKKyAgICAgKiB0aGlzIHVzZXIgZGF0YWJhc2UuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbnkgZXhjZXB0aW9uIGlzIHRocm93biBkdXJpbmcgc2F2aW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2F2ZSgpIHRocm93cyBFeGNlcHRpb247CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL1ZhbHZlLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvVmFsdmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzBkNWZlCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL1ZhbHZlLmphdmEKQEAgLTAsMCArMSwxMjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OS0yMDAxLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYTsKKworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3Rvci5SZXF1ZXN0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLlJlc3BvbnNlOworCisKKy8qKgorICogPHA+QSA8Yj5WYWx2ZTwvYj4gaXMgYSByZXF1ZXN0IHByb2Nlc3NpbmcgY29tcG9uZW50IGFzc29jaWF0ZWQgd2l0aCBhCisgKiBwYXJ0aWN1bGFyIENvbnRhaW5lci4gIEEgc2VyaWVzIG9mIFZhbHZlcyBhcmUgZ2VuZXJhbGx5IGFzc29jaWF0ZWQgd2l0aAorICogZWFjaCBvdGhlciBpbnRvIGEgUGlwZWxpbmUuICBUaGUgZGV0YWlsZWQgY29udHJhY3QgZm9yIGEgVmFsdmUgaXMgaW5jbHVkZWQKKyAqIGluIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgPGNvZGU+aW52b2tlKCk8L2NvZGU+IG1ldGhvZCBiZWxvdy48L3A+CisgKgorICogPGI+SElTVE9SSUNBTCBOT1RFPC9iPjogIFRoZSAiVmFsdmUiIG5hbWUgd2FzIGFzc2lnbmVkIHRvIHRoaXMgY29uY2VwdAorICogYmVjYXVzZSBhIHZhbHZlIGlzIHdoYXQgeW91IHVzZSBpbiBhIHJlYWwgd29ybGQgcGlwZWxpbmUgdG8gY29udHJvbCBhbmQvb3IKKyAqIG1vZGlmeSBmbG93cyB0aHJvdWdoIGl0LgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQGF1dGhvciBHdW5uYXIgUmpubmluZworICogQGF1dGhvciBQZXRlciBEb25hbGQKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGludGVyZmFjZSBWYWx2ZSB7CisKKworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBWYWx2ZSBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEluZm8oKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBuZXh0IFZhbHZlIGluIHRoZSBwaXBlbGluZSBjb250YWluaW5nIHRoaXMgVmFsdmUsIGlmIGFueS4KKyAgICAgKi8KKyAgICBwdWJsaWMgVmFsdmUgZ2V0TmV4dCgpOworCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG5leHQgVmFsdmUgaW4gdGhlIHBpcGVsaW5lIGNvbnRhaW5pbmcgdGhpcyBWYWx2ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx2ZSBUaGUgbmV3IG5leHQgdmFsdmUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXROZXh0KFZhbHZlIHZhbHZlKTsKKworCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIDxwPlBlcmZvcm0gcmVxdWVzdCBwcm9jZXNzaW5nIGFzIHJlcXVpcmVkIGJ5IHRoaXMgVmFsdmUuPC9wPgorICAgICAqCisgICAgICogPHA+QW4gaW5kaXZpZHVhbCBWYWx2ZSA8Yj5NQVk8L2I+IHBlcmZvcm0gdGhlIGZvbGxvd2luZyBhY3Rpb25zLCBpbgorICAgICAqIHRoZSBzcGVjaWZpZWQgb3JkZXI6PC9wPgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+RXhhbWluZSBhbmQvb3IgbW9kaWZ5IHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBzcGVjaWZpZWQgUmVxdWVzdCBhbmQKKyAgICAgKiAgICAgUmVzcG9uc2UuCisgICAgICogPGxpPkV4YW1pbmUgdGhlIHByb3BlcnRpZXMgb2YgdGhlIHNwZWNpZmllZCBSZXF1ZXN0LCBjb21wbGV0ZWx5IGdlbmVyYXRlCisgICAgICogICAgIHRoZSBjb3JyZXNwb25kaW5nIFJlc3BvbnNlLCBhbmQgcmV0dXJuIGNvbnRyb2wgdG8gdGhlIGNhbGxlci4KKyAgICAgKiA8bGk+RXhhbWluZSB0aGUgcHJvcGVydGllcyBvZiB0aGUgc3BlY2lmaWVkIFJlcXVlc3QgYW5kIFJlc3BvbnNlLCB3cmFwCisgICAgICogICAgIGVpdGhlciBvciBib3RoIG9mIHRoZXNlIG9iamVjdHMgdG8gc3VwcGxlbWVudCB0aGVpciBmdW5jdGlvbmFsaXR5LAorICAgICAqICAgICBhbmQgcGFzcyB0aGVtIG9uLgorICAgICAqIDxsaT5JZiB0aGUgY29ycmVzcG9uZGluZyBSZXNwb25zZSB3YXMgbm90IGdlbmVyYXRlZCAoYW5kIGNvbnRyb2wgd2FzIG5vdAorICAgICAqICAgICByZXR1cm5lZCwgY2FsbCB0aGUgbmV4dCBWYWx2ZSBpbiB0aGUgcGlwZWxpbmUgKGlmIHRoZXJlIGlzIG9uZSkgYnkKKyAgICAgKiAgICAgZXhlY3V0aW5nIDxjb2RlPmNvbnRleHQuaW52b2tlTmV4dCgpPC9jb2RlPi4KKyAgICAgKiA8bGk+RXhhbWluZSwgYnV0IG5vdCBtb2RpZnksIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSByZXN1bHRpbmcgUmVzcG9uc2UKKyAgICAgKiAgICAgKHdoaWNoIHdhcyBjcmVhdGVkIGJ5IGEgc3Vic2VxdWVudGx5IGludm9rZWQgVmFsdmUgb3IgQ29udGFpbmVyKS4KKyAgICAgKiA8L3VsPgorICAgICAqCisgICAgICogPHA+QSBWYWx2ZSA8Yj5NVVNUIE5PVDwvYj4gZG8gYW55IG9mIHRoZSBmb2xsb3dpbmcgdGhpbmdzOjwvcD4KKyAgICAgKiA8dWw+CisgICAgICogPGxpPkNoYW5nZSByZXF1ZXN0IHByb3BlcnRpZXMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiB1c2VkIHRvIGRpcmVjdAorICAgICAqICAgICB0aGUgZmxvdyBvZiBwcm9jZXNzaW5nIGNvbnRyb2wgZm9yIHRoaXMgcmVxdWVzdCAoZm9yIGluc3RhbmNlLAorICAgICAqICAgICB0cnlpbmcgdG8gY2hhbmdlIHRoZSB2aXJ0dWFsIGhvc3QgdG8gd2hpY2ggYSBSZXF1ZXN0IHNob3VsZCBiZQorICAgICAqICAgICBzZW50IGZyb20gYSBwaXBlbGluZSBhdHRhY2hlZCB0byBhIEhvc3Qgb3IgQ29udGV4dCBpbiB0aGUKKyAgICAgKiAgICAgc3RhbmRhcmQgaW1wbGVtZW50YXRpb24pLgorICAgICAqIDxsaT5DcmVhdGUgYSBjb21wbGV0ZWQgUmVzcG9uc2UgPHN0cm9uZz5BTkQ8L3N0cm9uZz4gcGFzcyB0aGlzCisgICAgICogICAgIFJlcXVlc3QgYW5kIFJlc3BvbnNlIG9uIHRvIHRoZSBuZXh0IFZhbHZlIGluIHRoZSBwaXBlbGluZS4KKyAgICAgKiA8bGk+Q29uc3VtZSBieXRlcyBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gYXNzb2NpYXRlZCB3aXRoIHRoZSBSZXF1ZXN0LAorICAgICAqICAgICB1bmxlc3MgaXQgaXMgY29tcGxldGVseSBnZW5lcmF0aW5nIHRoZSByZXNwb25zZSwgb3Igd3JhcHBpbmcgdGhlCisgICAgICogICAgIHJlcXVlc3QgYmVmb3JlIHBhc3NpbmcgaXQgb24uCisgICAgICogPGxpPk1vZGlmeSB0aGUgSFRUUCBoZWFkZXJzIGluY2x1ZGVkIHdpdGggdGhlIFJlc3BvbnNlIGFmdGVyIHRoZQorICAgICAqICAgICA8Y29kZT5pbnZva2VOZXh0KCk8L2NvZGU+IG1ldGhvZCBoYXMgcmV0dXJuZWQuCisgICAgICogPGxpPlBlcmZvcm0gYW55IGFjdGlvbnMgb24gdGhlIG91dHB1dCBzdHJlYW0gYXNzb2NpYXRlZCB3aXRoIHRoZQorICAgICAqICAgICBzcGVjaWZpZWQgUmVzcG9uc2UgYWZ0ZXIgdGhlIDxjb2RlPmludm9rZU5leHQoKTwvY29kZT4gbWV0aG9kIGhhcworICAgICAqICAgICByZXR1cm5lZC4KKyAgICAgKiA8L3VsPgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB0byBiZSBwcm9jZXNzZWQKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIHNlcnZsZXQgcmVzcG9uc2UgdG8gYmUgY3JlYXRlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzLCBvciBpcyB0aHJvd24KKyAgICAgKiAgYnkgYSBzdWJzZXF1ZW50bHkgaW52b2tlZCBWYWx2ZSwgRmlsdGVyLCBvciBTZXJ2bGV0CisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBlcnJvciBvY2N1cnMsIG9yIGlzIHRocm93bgorICAgICAqICBieSBhIHN1YnNlcXVlbnRseSBpbnZva2VkIFZhbHZlLCBGaWx0ZXIsIG9yIFNlcnZsZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbnZva2UoUmVxdWVzdCByZXF1ZXN0LCBSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uOworCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9XcmFwcGVyLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvV3JhcHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4Zjc3MDcKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvV3JhcHBlci5qYXZhCkBAIC0wLDAgKzEsMzE3IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hOworCisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXQ7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuVW5hdmFpbGFibGVFeGNlcHRpb247CisKKworLyoqCisgKiBBIDxiPldyYXBwZXI8L2I+IGlzIGEgQ29udGFpbmVyIHRoYXQgcmVwcmVzZW50cyBhbiBpbmRpdmlkdWFsIHNlcnZsZXQKKyAqIGRlZmluaXRpb24gZnJvbSB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIG9mIHRoZSB3ZWIgYXBwbGljYXRpb24uICBJdAorICogcHJvdmlkZXMgYSBjb252ZW5pZW50IG1lY2hhbmlzbSB0byB1c2UgSW50ZXJjZXB0b3JzIHRoYXQgc2VlIGV2ZXJ5IHNpbmdsZQorICogcmVxdWVzdCB0byB0aGUgc2VydmxldCByZXByZXNlbnRlZCBieSB0aGlzIGRlZmluaXRpb24uCisgKiA8cD4KKyAqIEltcGxlbWVudGF0aW9ucyBvZiBXcmFwcGVyIGFyZSByZXNwb25zaWJsZSBmb3IgbWFuYWdpbmcgdGhlIHNlcnZsZXQgbGlmZQorICogY3ljbGUgZm9yIHRoZWlyIHVuZGVybHlpbmcgc2VydmxldCBjbGFzcywgaW5jbHVkaW5nIGNhbGxpbmcgaW5pdCgpIGFuZAorICogZGVzdHJveSgpIGF0IGFwcHJvcHJpYXRlIHRpbWVzLCBhcyB3ZWxsIGFzIHJlc3BlY3RpbmcgdGhlIGV4aXN0ZW5jZSBvZgorICogdGhlIFNpbmdsZVRocmVhZE1vZGVsIGRlY2xhcmF0aW9uIG9uIHRoZSBzZXJ2bGV0IGNsYXNzIGl0c2VsZi4KKyAqIDxwPgorICogVGhlIHBhcmVudCBDb250YWluZXIgYXR0YWNoZWQgdG8gYSBXcmFwcGVyIHdpbGwgZ2VuZXJhbGx5IGJlIGFuCisgKiBpbXBsZW1lbnRhdGlvbiBvZiBDb250ZXh0LCByZXByZXNlbnRpbmcgdGhlIHNlcnZsZXQgY29udGV4dCAoYW5kCisgKiB0aGVyZWZvcmUgdGhlIHdlYiBhcHBsaWNhdGlvbikgd2l0aGluIHdoaWNoIHRoaXMgc2VydmxldCBleGVjdXRlcy4KKyAqIDxwPgorICogQ2hpbGQgQ29udGFpbmVycyBhcmUgbm90IGFsbG93ZWQgb24gV3JhcHBlciBpbXBsZW1lbnRhdGlvbnMsIHNvIHRoZQorICogPGNvZGU+YWRkQ2hpbGQoKTwvY29kZT4gbWV0aG9kIHNob3VsZCB0aHJvdyBhbgorICogPGNvZGU+SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uPC9jb2RlPi4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGludGVyZmFjZSBXcmFwcGVyIGV4dGVuZHMgQ29udGFpbmVyIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgYXZhaWxhYmxlIGRhdGUvdGltZSBmb3IgdGhpcyBzZXJ2bGV0LCBpbiBtaWxsaXNlY29uZHMgc2luY2UKKyAgICAgKiB0aGUgZXBvY2guICBJZiB0aGlzIGRhdGUvdGltZSBpcyBpbiB0aGUgZnV0dXJlLCBhbnkgcmVxdWVzdCBmb3IgdGhpcworICAgICAqIHNlcnZsZXQgd2lsbCByZXR1cm4gYW4gU0NfU0VSVklDRV9VTkFWQUlMQUJMRSBlcnJvci4gIElmIGl0IGlzIHplcm8sCisgICAgICogdGhlIHNlcnZsZXQgaXMgY3VycmVudGx5IGF2YWlsYWJsZS4gIEEgdmFsdWUgZXF1YWwgdG8gTG9uZy5NQVhfVkFMVUUKKyAgICAgKiBpcyBjb25zaWRlcmVkIHRvIG1lYW4gdGhhdCB1bmF2YWlsYWJpbGl0eSBpcyBwZXJtYW5lbnQuCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0QXZhaWxhYmxlKCk7CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYXZhaWxhYmxlIGRhdGUvdGltZSBmb3IgdGhpcyBzZXJ2bGV0LCBpbiBtaWxsaXNlY29uZHMgc2luY2UgdGhlCisgICAgICogZXBvY2guICBJZiB0aGlzIGRhdGUvdGltZSBpcyBpbiB0aGUgZnV0dXJlLCBhbnkgcmVxdWVzdCBmb3IgdGhpcyBzZXJ2bGV0CisgICAgICogd2lsbCByZXR1cm4gYW4gU0NfU0VSVklDRV9VTkFWQUlMQUJMRSBlcnJvci4gIEEgdmFsdWUgZXF1YWwgdG8KKyAgICAgKiBMb25nLk1BWF9WQUxVRSBpcyBjb25zaWRlcmVkIHRvIG1lYW4gdGhhdCB1bmF2YWlsYWJpbGl0eSBpcyBwZXJtYW5lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXZhaWxhYmxlIFRoZSBuZXcgYXZhaWxhYmxlIGRhdGUvdGltZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEF2YWlsYWJsZShsb25nIGF2YWlsYWJsZSk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY29udGV4dC1yZWxhdGl2ZSBVUkkgb2YgdGhlIEpTUCBmaWxlIGZvciB0aGlzIHNlcnZsZXQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRKc3BGaWxlKCk7CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY29udGV4dC1yZWxhdGl2ZSBVUkkgb2YgdGhlIEpTUCBmaWxlIGZvciB0aGlzIHNlcnZsZXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0ganNwRmlsZSBKU1AgZmlsZSBVUkkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRKc3BGaWxlKFN0cmluZyBqc3BGaWxlKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBsb2FkLW9uLXN0YXJ0dXAgb3JkZXIgdmFsdWUgKG5lZ2F0aXZlIHZhbHVlIG1lYW5zCisgICAgICogbG9hZCBvbiBmaXJzdCBjYWxsKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldExvYWRPblN0YXJ0dXAoKTsKKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBsb2FkLW9uLXN0YXJ0dXAgb3JkZXIgdmFsdWUgKG5lZ2F0aXZlIHZhbHVlIG1lYW5zCisgICAgICogbG9hZCBvbiBmaXJzdCBjYWxsKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZSBOZXcgbG9hZC1vbi1zdGFydHVwIHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TG9hZE9uU3RhcnR1cChpbnQgdmFsdWUpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHJ1bi1hcyBpZGVudGl0eSBmb3IgdGhpcyBzZXJ2bGV0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UnVuQXMoKTsKKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBydW4tYXMgaWRlbnRpdHkgZm9yIHRoaXMgc2VydmxldC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBydW5BcyBOZXcgcnVuLWFzIGlkZW50aXR5IHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UnVuQXMoU3RyaW5nIHJ1bkFzKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBmdWxseSBxdWFsaWZpZWQgc2VydmxldCBjbGFzcyBuYW1lIGZvciB0aGlzIHNlcnZsZXQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTZXJ2bGV0Q2xhc3MoKTsKKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBmdWxseSBxdWFsaWZpZWQgc2VydmxldCBjbGFzcyBuYW1lIGZvciB0aGlzIHNlcnZsZXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VydmxldENsYXNzIFNlcnZsZXQgY2xhc3MgbmFtZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNlcnZsZXRDbGFzcyhTdHJpbmcgc2VydmxldENsYXNzKTsKKworCisgICAgLyoqCisgICAgICogSXMgdGhpcyBzZXJ2bGV0IGN1cnJlbnRseSB1bmF2YWlsYWJsZT8KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1VuYXZhaWxhYmxlKCk7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBuZXcgc2VydmxldCBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIgZm9yIHRoaXMgc2VydmxldC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhpcyBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIgdG8gYWRkCisgICAgICogQHBhcmFtIHZhbHVlIFZhbHVlIG9mIHRoaXMgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyIHRvIGFkZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEluaXRQYXJhbWV0ZXIoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSk7CisKKworICAgIC8qKgorICAgICAqIEFkZCBhIG5ldyBsaXN0ZW5lciBpbnRlcmVzdGVkIGluIEluc3RhbmNlRXZlbnRzLgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBuZXcgbGlzdGVuZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRJbnN0YW5jZUxpc3RlbmVyKEluc3RhbmNlTGlzdGVuZXIgbGlzdGVuZXIpOworCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBtYXBwaW5nIGFzc29jaWF0ZWQgd2l0aCB0aGUgV3JhcHBlci4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgbmV3IHdyYXBwZXIgbWFwcGluZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZE1hcHBpbmcoU3RyaW5nIG1hcHBpbmcpOworCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBuZXcgc2VjdXJpdHkgcm9sZSByZWZlcmVuY2UgcmVjb3JkIHRvIHRoZSBzZXQgb2YgcmVjb3JkcyBmb3IKKyAgICAgKiB0aGlzIHNlcnZsZXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBSb2xlIG5hbWUgdXNlZCB3aXRoaW4gdGhpcyBzZXJ2bGV0CisgICAgICogQHBhcmFtIGxpbmsgUm9sZSBuYW1lIHVzZWQgd2l0aGluIHRoZSB3ZWIgYXBwbGljYXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRTZWN1cml0eVJlZmVyZW5jZShTdHJpbmcgbmFtZSwgU3RyaW5nIGxpbmspOworCisKKyAgICAvKioKKyAgICAgKiBBbGxvY2F0ZSBhbiBpbml0aWFsaXplZCBpbnN0YW5jZSBvZiB0aGlzIFNlcnZsZXQgdGhhdCBpcyByZWFkeSB0byBoYXZlCisgICAgICogaXRzIDxjb2RlPnNlcnZpY2UoKTwvY29kZT4gbWV0aG9kIGNhbGxlZC4gIElmIHRoZSBzZXJ2bGV0IGNsYXNzIGRvZXMKKyAgICAgKiBub3QgaW1wbGVtZW50IDxjb2RlPlNpbmdsZVRocmVhZE1vZGVsPC9jb2RlPiwgdGhlIChvbmx5KSBpbml0aWFsaXplZAorICAgICAqIGluc3RhbmNlIG1heSBiZSByZXR1cm5lZCBpbW1lZGlhdGVseS4gIElmIHRoZSBzZXJ2bGV0IGNsYXNzIGltcGxlbWVudHMKKyAgICAgKiA8Y29kZT5TaW5nbGVUaHJlYWRNb2RlbDwvY29kZT4sIHRoZSBXcmFwcGVyIGltcGxlbWVudGF0aW9uIG11c3QgZW5zdXJlCisgICAgICogdGhhdCB0aGlzIGluc3RhbmNlIGlzIG5vdCBhbGxvY2F0ZWQgYWdhaW4gdW50aWwgaXQgaXMgZGVhbGxvY2F0ZWQgYnkgYQorICAgICAqIGNhbGwgdG8gPGNvZGU+ZGVhbGxvY2F0ZSgpPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiB0aGUgc2VydmxldCBpbml0KCkgbWV0aG9kIHRocmV3CisgICAgICogIGFuIGV4Y2VwdGlvbgorICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIGxvYWRpbmcgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIFNlcnZsZXQgYWxsb2NhdGUoKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbjsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoaXMgcHJldmlvdXNseSBhbGxvY2F0ZWQgc2VydmxldCB0byB0aGUgcG9vbCBvZiBhdmFpbGFibGUKKyAgICAgKiBpbnN0YW5jZXMuICBJZiB0aGlzIHNlcnZsZXQgY2xhc3MgZG9lcyBub3QgaW1wbGVtZW50IFNpbmdsZVRocmVhZE1vZGVsLAorICAgICAqIG5vIGFjdGlvbiBpcyBhY3R1YWxseSByZXF1aXJlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXJ2bGV0IFRoZSBzZXJ2bGV0IHRvIGJlIHJldHVybmVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBkZWFsbG9jYXRpb24gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgZGVhbGxvY2F0ZShTZXJ2bGV0IHNlcnZsZXQpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlciBuYW1lLAorICAgICAqIGlmIGFueTsgb3RoZXJ3aXNlIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIHJlcXVlc3RlZCBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGZpbmRJbml0UGFyYW1ldGVyKFN0cmluZyBuYW1lKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBuYW1lcyBvZiBhbGwgZGVmaW5lZCBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzIGZvciB0aGlzCisgICAgICogc2VydmxldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZmluZEluaXRQYXJhbWV0ZXJzKCk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbWFwcGluZ3MgYXNzb2NpYXRlZCB3aXRoIHRoaXMgd3JhcHBlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZmluZE1hcHBpbmdzKCk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2VjdXJpdHkgcm9sZSBsaW5rIGZvciB0aGUgc3BlY2lmaWVkIHNlY3VyaXR5IHJvbGUKKyAgICAgKiByZWZlcmVuY2UgbmFtZSwgaWYgYW55OyBvdGhlcndpc2UgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgU2VjdXJpdHkgcm9sZSByZWZlcmVuY2UgdXNlZCB3aXRoaW4gdGhpcyBzZXJ2bGV0CisgICAgICovCisgICAgcHVibGljIFN0cmluZyBmaW5kU2VjdXJpdHlSZWZlcmVuY2UoU3RyaW5nIG5hbWUpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNldCBvZiBzZWN1cml0eSByb2xlIHJlZmVyZW5jZSBuYW1lcyBhc3NvY2lhdGVkIHdpdGgKKyAgICAgKiB0aGlzIHNlcnZsZXQsIGlmIGFueTsgb3RoZXJ3aXNlIHJldHVybiBhIHplcm8tbGVuZ3RoIGFycmF5LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBmaW5kU2VjdXJpdHlSZWZlcmVuY2VzKCk7CisKKworICAgIC8qKgorICAgICAqIEluY3JlbWVudCB0aGUgZXJyb3IgY291bnQgdmFsdWUgdXNlZCB3aGVuIG1vbml0b3JpbmcuCisgICAgICovCisgICAgcHVibGljIHZvaWQgaW5jcmVtZW50RXJyb3JDb3VudCgpOworCisKKyAgICAvKioKKyAgICAgKiBMb2FkIGFuZCBpbml0aWFsaXplIGFuIGluc3RhbmNlIG9mIHRoaXMgc2VydmxldCwgaWYgdGhlcmUgaXMgbm90IGFscmVhZHkKKyAgICAgKiBhdCBsZWFzdCBvbmUgaW5pdGlhbGl6ZWQgaW5zdGFuY2UuICBUaGlzIGNhbiBiZSB1c2VkLCBmb3IgZXhhbXBsZSwgdG8KKyAgICAgKiBsb2FkIHNlcnZsZXRzIHRoYXQgYXJlIG1hcmtlZCBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIHRvIGJlIGxvYWRlZAorICAgICAqIGF0IHNlcnZlciBzdGFydHVwIHRpbWUuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgdGhlIHNlcnZsZXQgaW5pdCgpIG1ldGhvZCB0aHJldworICAgICAqICBhbiBleGNlcHRpb24KKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgc29tZSBvdGhlciBsb2FkaW5nIHByb2JsZW0gb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgbG9hZCgpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uOworCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIgZnJvbSB0aGlzIHNlcnZsZXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIgdG8gcmVtb3ZlCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlSW5pdFBhcmFtZXRlcihTdHJpbmcgbmFtZSk7CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhIGxpc3RlbmVyIG5vIGxvbmdlciBpbnRlcmVzdGVkIGluIEluc3RhbmNlRXZlbnRzLgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciB0byByZW1vdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVJbnN0YW5jZUxpc3RlbmVyKEluc3RhbmNlTGlzdGVuZXIgbGlzdGVuZXIpOworCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSBtYXBwaW5nIGFzc29jaWF0ZWQgd2l0aCB0aGUgd3JhcHBlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBwYXR0ZXJuIHRvIHJlbW92ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZU1hcHBpbmcoU3RyaW5nIG1hcHBpbmcpOworCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYW55IHNlY3VyaXR5IHJvbGUgcmVmZXJlbmNlIGZvciB0aGUgc3BlY2lmaWVkIHJvbGUgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIFNlY3VyaXR5IHJvbGUgdXNlZCB3aXRoaW4gdGhpcyBzZXJ2bGV0IHRvIGJlIHJlbW92ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVTZWN1cml0eVJlZmVyZW5jZShTdHJpbmcgbmFtZSk7CisKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgYW4gVW5hdmFpbGFibGVFeGNlcHRpb24sIG1hcmtpbmcgdGhpcyBzZXJ2bGV0IGFzIHVuYXZhaWxhYmxlCisgICAgICogZm9yIHRoZSBzcGVjaWZpZWQgYW1vdW50IG9mIHRpbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdW5hdmFpbGFibGUgVGhlIGV4Y2VwdGlvbiB0aGF0IG9jY3VycmVkLCBvciA8Y29kZT5udWxsPC9jb2RlPgorICAgICAqICB0byBtYXJrIHRoaXMgc2VydmxldCBhcyBwZXJtYW5lbnRseSB1bmF2YWlsYWJsZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHVuYXZhaWxhYmxlKFVuYXZhaWxhYmxlRXhjZXB0aW9uIHVuYXZhaWxhYmxlKTsKKworCisgICAgLyoqCisgICAgICogVW5sb2FkIGFsbCBpbml0aWFsaXplZCBpbnN0YW5jZXMgb2YgdGhpcyBzZXJ2bGV0LCBhZnRlciBjYWxsaW5nIHRoZQorICAgICAqIDxjb2RlPmRlc3Ryb3koKTwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGluc3RhbmNlLiAgVGhpcyBjYW4gYmUgdXNlZCwKKyAgICAgKiBmb3IgZXhhbXBsZSwgcHJpb3IgdG8gc2h1dHRpbmcgZG93biB0aGUgZW50aXJlIHNlcnZsZXQgZW5naW5lLCBvcgorICAgICAqIHByaW9yIHRvIHJlbG9hZGluZyBhbGwgb2YgdGhlIGNsYXNzZXMgZnJvbSB0aGUgTG9hZGVyIGFzc29jaWF0ZWQgd2l0aAorICAgICAqIG91ciBMb2FkZXIncyByZXBvc2l0b3J5LgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGFuIHVubG9hZCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB1bmxvYWQoKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbjsKKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYW50L0Fic3RyYWN0Q2F0YWxpbmFUYXNrLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYW50L0Fic3RyYWN0Q2F0YWxpbmFUYXNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI4NGJmNgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hbnQvQWJzdHJhY3RDYXRhbGluYVRhc2suamF2YQpAQCAtMCwwICsxLDI2MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5hbnQ7CisKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEubmV0Lkh0dHBVUkxDb25uZWN0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLm5ldC5VUkxDb25uZWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5CYXNlNjQ7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOworCisKKy8qKgorICogQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgQW50IHRhc2tzIHRoYXQgaW50ZXJhY3Qgd2l0aCB0aGUKKyAqIDxlbT5NYW5hZ2VyPC9lbT4gd2ViIGFwcGxpY2F0aW9uIGZvciBkeW5hbWljYWxseSBkZXBsb3lpbmcgYW5kCisgKiB1bmRlcGxveWluZyBhcHBsaWNhdGlvbnMuICBUaGVzZSB0YXNrcyByZXF1aXJlIEFudCAxLjQgb3IgbGF0ZXIuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICogQHNpbmNlIDQuMQorICovCisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdENhdGFsaW5hVGFzayBleHRlbmRzIFRhc2sgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogbWFuYWdlciB3ZWJhcHAncyBlbmNvZGluZy4KKyAgICAgKi8gCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIENIQVJTRVQgPSAidXRmLTgiOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogVGhlIGxvZ2luIHBhc3N3b3JkIGZvciB0aGUgPGNvZGU+TWFuYWdlcjwvY29kZT4gYXBwbGljYXRpb24uCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBwYXNzd29yZCA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhc3N3b3JkKCkgeworICAgICAgICByZXR1cm4gKHRoaXMucGFzc3dvcmQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkKFN0cmluZyBwYXNzd29yZCkgeworICAgICAgICB0aGlzLnBhc3N3b3JkID0gcGFzc3dvcmQ7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgVVJMIG9mIHRoZSA8Y29kZT5NYW5hZ2VyPC9jb2RlPiBhcHBsaWNhdGlvbiB0byBiZSB1c2VkLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgdXJsID0gImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9tYW5hZ2VyIjsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXJsKCkgeworICAgICAgICByZXR1cm4gKHRoaXMudXJsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVcmwoU3RyaW5nIHVybCkgeworICAgICAgICB0aGlzLnVybCA9IHVybDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSBsb2dpbiB1c2VybmFtZSBmb3IgdGhlIDxjb2RlPk1hbmFnZXI8L2NvZGU+IGFwcGxpY2F0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgdXNlcm5hbWUgPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXRVc2VybmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLnVzZXJuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVc2VybmFtZShTdHJpbmcgdXNlcm5hbWUpIHsKKyAgICAgICAgdGhpcy51c2VybmFtZSA9IHVzZXJuYW1lOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIEV4ZWN1dGUgdGhlIHNwZWNpZmllZCBjb21tYW5kLiAgVGhpcyBsb2dpYyBvbmx5IHBlcmZvcm1zIHRoZSBjb21tb24KKyAgICAgKiBhdHRyaWJ1dGUgdmFsaWRhdGlvbiByZXF1aXJlZCBieSBhbGwgc3ViY2xhc3NlczsgaXQgZG9lcyBub3QgcGVyZm9ybQorICAgICAqIGFueSBmdW5jdGlvbmFsIGxvZ2ljIGRpcmVjdGx5LgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiBhIHZhbGlkYXRpb24gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKCh1c2VybmFtZSA9PSBudWxsKSB8fCAocGFzc3dvcmQgPT0gbnVsbCkgfHwgKHVybCA9PSBudWxsKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKCJNdXN0IHNwZWNpZnkgYWxsIG9mICd1c2VybmFtZScsICdwYXNzd29yZCcsIGFuZCAndXJsJyIpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm90ZWN0ZWQgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlIHRoZSBzcGVjaWZpZWQgY29tbWFuZCwgYmFzZWQgb24gdGhlIGNvbmZpZ3VyZWQgcHJvcGVydGllcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb21tYW5kIENvbW1hbmQgdG8gYmUgZXhlY3V0ZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZShTdHJpbmcgY29tbWFuZCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKworICAgICAgICBleGVjdXRlKGNvbW1hbmQsIG51bGwsIG51bGwsIC0xKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogRXhlY3V0ZSB0aGUgc3BlY2lmaWVkIGNvbW1hbmQsIGJhc2VkIG9uIHRoZSBjb25maWd1cmVkIHByb3BlcnRpZXMuCisgICAgICogVGhlIGlucHV0IHN0cmVhbSB3aWxsIGJlIGNsb3NlZCB1cG9uIGNvbXBsZXRpb24gb2YgdGhpcyB0YXNrLCB3aGV0aGVyCisgICAgICogaXQgd2FzIGV4ZWN1dGVkIHN1Y2Nlc3NmdWxseSBvciBub3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29tbWFuZCBDb21tYW5kIHRvIGJlIGV4ZWN1dGVkCisgICAgICogQHBhcmFtIGlzdHJlYW0gSW5wdXRTdHJlYW0gdG8gaW5jbHVkZSBpbiBhbiBIVFRQIFBVVCwgaWYgYW55CisgICAgICogQHBhcmFtIGNvbnRlbnRUeXBlIENvbnRlbnQgdHlwZSB0byBzcGVjaWZ5IGZvciB0aGUgaW5wdXQsIGlmIGFueQorICAgICAqIEBwYXJhbSBjb250ZW50TGVuZ3RoIENvbnRlbnQgbGVuZ3RoIHRvIHNwZWNpZnkgZm9yIHRoZSBpbnB1dCwgaWYgYW55CisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoU3RyaW5nIGNvbW1hbmQsIElucHV0U3RyZWFtIGlzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY29udGVudFR5cGUsIGludCBjb250ZW50TGVuZ3RoKQorICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworCisgICAgICAgIFVSTENvbm5lY3Rpb24gY29ubiA9IG51bGw7CisgICAgICAgIElucHV0U3RyZWFtUmVhZGVyIHJlYWRlciA9IG51bGw7CisgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgIC8vIENyZWF0ZSBhIGNvbm5lY3Rpb24gZm9yIHRoaXMgY29tbWFuZAorICAgICAgICAgICAgY29ubiA9IChuZXcgVVJMKHVybCArIGNvbW1hbmQpKS5vcGVuQ29ubmVjdGlvbigpOworICAgICAgICAgICAgSHR0cFVSTENvbm5lY3Rpb24gaGNvbm4gPSAoSHR0cFVSTENvbm5lY3Rpb24pIGNvbm47CisKKyAgICAgICAgICAgIC8vIFNldCB1cCBzdGFuZGFyZCBjb25uZWN0aW9uIGNoYXJhY3RlcmlzdGljcworICAgICAgICAgICAgaGNvbm4uc2V0QWxsb3dVc2VySW50ZXJhY3Rpb24oZmFsc2UpOworICAgICAgICAgICAgaGNvbm4uc2V0RG9JbnB1dCh0cnVlKTsKKyAgICAgICAgICAgIGhjb25uLnNldFVzZUNhY2hlcyhmYWxzZSk7CisgICAgICAgICAgICBpZiAoaXN0cmVhbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaGNvbm4uc2V0RG9PdXRwdXQodHJ1ZSk7CisgICAgICAgICAgICAgICAgaGNvbm4uc2V0UmVxdWVzdE1ldGhvZCgiUFVUIik7CisgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRUeXBlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaGNvbm4uc2V0UmVxdWVzdFByb3BlcnR5KCJDb250ZW50LVR5cGUiLCBjb250ZW50VHlwZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjb250ZW50TGVuZ3RoID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaGNvbm4uc2V0UmVxdWVzdFByb3BlcnR5KCJDb250ZW50LUxlbmd0aCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiArIGNvbnRlbnRMZW5ndGgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaGNvbm4uc2V0RG9PdXRwdXQoZmFsc2UpOworICAgICAgICAgICAgICAgIGhjb25uLnNldFJlcXVlc3RNZXRob2QoIkdFVCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaGNvbm4uc2V0UmVxdWVzdFByb3BlcnR5KCJVc2VyLUFnZW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2F0YWxpbmEtQW50LVRhc2svMS4wIik7CisKKyAgICAgICAgICAgIC8vIFNldCB1cCBhbiBhdXRob3JpemF0aW9uIGhlYWRlciB3aXRoIG91ciBjcmVkZW50aWFscworICAgICAgICAgICAgU3RyaW5nIGlucHV0ID0gdXNlcm5hbWUgKyAiOiIgKyBwYXNzd29yZDsKKyAgICAgICAgICAgIFN0cmluZyBvdXRwdXQgPSBuZXcgU3RyaW5nKEJhc2U2NC5lbmNvZGUoaW5wdXQuZ2V0Qnl0ZXMoKSkpOworICAgICAgICAgICAgaGNvbm4uc2V0UmVxdWVzdFByb3BlcnR5KCJBdXRob3JpemF0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmFzaWMgIiArIG91dHB1dCk7CisKKyAgICAgICAgICAgIC8vIEVzdGFibGlzaCB0aGUgY29ubmVjdGlvbiB3aXRoIHRoZSBzZXJ2ZXIKKyAgICAgICAgICAgIGhjb25uLmNvbm5lY3QoKTsKKworICAgICAgICAgICAgLy8gU2VuZCB0aGUgcmVxdWVzdCBkYXRhIChpZiBhbnkpCisgICAgICAgICAgICBpZiAoaXN0cmVhbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgQnVmZmVyZWRPdXRwdXRTdHJlYW0gb3N0cmVhbSA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShoY29ubi5nZXRPdXRwdXRTdHJlYW0oKSwgMTAyNCk7CisgICAgICAgICAgICAgICAgYnl0ZSBidWZmZXJbXSA9IG5ldyBieXRlWzEwMjRdOworICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBuID0gaXN0cmVhbS5yZWFkKGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgIGlmIChuIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgb3N0cmVhbS53cml0ZShidWZmZXIsIDAsIG4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvc3RyZWFtLmZsdXNoKCk7CisgICAgICAgICAgICAgICAgb3N0cmVhbS5jbG9zZSgpOworICAgICAgICAgICAgICAgIGlzdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gUHJvY2VzcyB0aGUgcmVzcG9uc2UgbWVzc2FnZQorICAgICAgICAgICAgcmVhZGVyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGhjb25uLmdldElucHV0U3RyZWFtKCksIENIQVJTRVQpOworICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgICAgICBTdHJpbmcgZXJyb3IgPSBudWxsOworICAgICAgICAgICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgIGludCBjaCA9IHJlYWRlci5yZWFkKCk7CisgICAgICAgICAgICAgICAgaWYgKGNoIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChjaCA9PSAnXHInKSB8fCAoY2ggPT0gJ1xuJykpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSBidWZmLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmYuc2V0TGVuZ3RoKDApOworICAgICAgICAgICAgICAgICAgICBsb2cobGluZSwgUHJvamVjdC5NU0dfSU5GTyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsaW5lLnN0YXJ0c1dpdGgoIk9LIC0iKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yID0gbGluZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBidWZmLmFwcGVuZCgoY2hhcikgY2gpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChidWZmLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgIGxvZyhidWZmLnRvU3RyaW5nKCksIFByb2plY3QuTVNHX0lORk8pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGVycm9yICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZXJyb3IpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24odCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAocmVhZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICByZWFkZXIuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdSkgeworICAgICAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlYWRlciA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaXN0cmVhbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgaXN0cmVhbS5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB1KSB7CisgICAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaXN0cmVhbSA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYW50L0RlcGxveVRhc2suamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hbnQvRGVwbG95VGFzay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiZDAxNGMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYW50L0RlcGxveVRhc2suamF2YQpAQCAtMCwwICsxLDIwMCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5hbnQ7CisKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLm5ldC5VUkxDb25uZWN0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTEVuY29kZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKKworCisvKioKKyAqIEFudCB0YXNrIHRoYXQgaW1wbGVtZW50cyB0aGUgPGNvZGU+L2RlcGxveTwvY29kZT4gY29tbWFuZCwgc3VwcG9ydGVkIGJ5CisgKiB0aGUgVG9tY2F0IG1hbmFnZXIgYXBwbGljYXRpb24uCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICogQHNpbmNlIDQuMQorICovCitwdWJsaWMgY2xhc3MgRGVwbG95VGFzayBleHRlbmRzIEFic3RyYWN0Q2F0YWxpbmFUYXNrIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFVSTCBvZiB0aGUgY29udGV4dCBjb25maWd1cmF0aW9uIGZpbGUgZm9yIHRoaXMgYXBwbGljYXRpb24sIGlmIGFueS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGNvbmZpZyA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbmZpZygpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLmNvbmZpZyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q29uZmlnKFN0cmluZyBjb25maWcpIHsKKyAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBVUkwgb2YgdGhlIHNlcnZlciBsb2NhbCB3ZWIgYXBwbGljYXRpb24gYXJjaGl2ZSAoV0FSKSBmaWxlIAorICAgICAqIHRvIGJlIGRlcGxveWVkLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgbG9jYWxXYXIgPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXRMb2NhbFdhcigpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLmxvY2FsV2FyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRMb2NhbFdhcihTdHJpbmcgbG9jYWxXYXIpIHsKKyAgICAgICAgdGhpcy5sb2NhbFdhciA9IGxvY2FsV2FyOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIGNvbnRleHQgcGF0aCBvZiB0aGUgd2ViIGFwcGxpY2F0aW9uIHdlIGFyZSBtYW5hZ2luZy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHBhdGggPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXRQYXRoKCkgeworICAgICAgICByZXR1cm4gKHRoaXMucGF0aCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UGF0aChTdHJpbmcgcGF0aCkgeworICAgICAgICB0aGlzLnBhdGggPSBwYXRoOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGFnIHRvIGFzc29jaWF0ZSB3aXRoIHRoaXMgdG8gYmUgZGVwbG95ZWQgd2ViYXBwLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgdGFnID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFnKCkgeworICAgICAgICByZXR1cm4gKHRoaXMudGFnKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUYWcoU3RyaW5nIHRhZykgeworICAgICAgICB0aGlzLnRhZyA9IHRhZzsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFVwZGF0ZSBleGlzdGluZyB3ZWJhcHBzLgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIHVwZGF0ZSA9IGZhbHNlOworCisgICAgcHVibGljIGJvb2xlYW4gZ2V0VXBkYXRlKCkgeworICAgICAgICByZXR1cm4gKHRoaXMudXBkYXRlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVcGRhdGUoYm9vbGVhbiB1cGRhdGUpIHsKKyAgICAgICAgdGhpcy51cGRhdGUgPSB1cGRhdGU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBVUkwgb2YgdGhlIHdlYiBhcHBsaWNhdGlvbiBhcmNoaXZlIChXQVIpIGZpbGUgdG8gYmUgZGVwbG95ZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyB3YXIgPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXRXYXIoKSB7CisgICAgICAgIHJldHVybiAodGhpcy53YXIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFdhcihTdHJpbmcgd2FyKSB7CisgICAgICAgIHRoaXMud2FyID0gd2FyOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIEV4ZWN1dGUgdGhlIHJlcXVlc3RlZCBvcGVyYXRpb24uCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworCisgICAgICAgIHN1cGVyLmV4ZWN1dGUoKTsKKyAgICAgICAgaWYgKHBhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKCJNdXN0IHNwZWNpZnkgJ3BhdGgnIGF0dHJpYnV0ZSIpOworICAgICAgICB9CisgICAgICAgIGlmICgod2FyID09IG51bGwpICYmIChsb2NhbFdhciA9PSBudWxsKSAmJiAoY29uZmlnID09IG51bGwpICYmICh0YWcgPT0gbnVsbCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICgiTXVzdCBzcGVjaWZ5IGVpdGhlciAnd2FyJywgJ2xvY2FsV2FyJywgJ2NvbmZpZycsIG9yICd0YWcnIGF0dHJpYnV0ZSIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQnVpbGRpbmcgYW4gaW5wdXQgc3RyZWFtIG9uIHRoZSBXQVIgdG8gdXBsb2FkLCBpZiBhbnkKKyAgICAgICAgQnVmZmVyZWRJbnB1dFN0cmVhbSBzdHJlYW0gPSBudWxsOworICAgICAgICBTdHJpbmcgY29udGVudFR5cGUgPSBudWxsOworICAgICAgICBpbnQgY29udGVudExlbmd0aCA9IC0xOworICAgICAgICBpZiAod2FyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmICh3YXIuc3RhcnRzV2l0aCgiZmlsZToiKSkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIFVSTCB1cmwgPSBuZXcgVVJMKHdhcik7CisgICAgICAgICAgICAgICAgICAgIFVSTENvbm5lY3Rpb24gY29ubiA9IHVybC5vcGVuQ29ubmVjdGlvbigpOworICAgICAgICAgICAgICAgICAgICBjb250ZW50TGVuZ3RoID0gY29ubi5nZXRDb250ZW50TGVuZ3RoKCk7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtCisgICAgICAgICAgICAgICAgICAgICAgICAoY29ubi5nZXRJbnB1dFN0cmVhbSgpLCAxMDI0KTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtCisgICAgICAgICAgICAgICAgICAgICAgICAobmV3IEZpbGVJbnB1dFN0cmVhbSh3YXIpLCAxMDI0KTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250ZW50VHlwZSA9ICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iOworICAgICAgICB9CisKKyAgICAgICAgLy8gQnVpbGRpbmcgVVJMCisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIi9kZXBsb3k/cGF0aD0iKTsKKyAgICAgICAgc2IuYXBwZW5kKFVSTEVuY29kZXIuZW5jb2RlKHRoaXMucGF0aCkpOworICAgICAgICBpZiAoKHdhciA9PSBudWxsKSAmJiAoY29uZmlnICE9IG51bGwpKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiZjb25maWc9Iik7CisgICAgICAgICAgICBzYi5hcHBlbmQoVVJMRW5jb2Rlci5lbmNvZGUoY29uZmlnKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCh3YXIgPT0gbnVsbCkgJiYgKGxvY2FsV2FyICE9IG51bGwpKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiZ3YXI9Iik7CisgICAgICAgICAgICBzYi5hcHBlbmQoVVJMRW5jb2Rlci5lbmNvZGUobG9jYWxXYXIpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodXBkYXRlKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiZ1cGRhdGU9dHJ1ZSIpOworICAgICAgICB9CisgICAgICAgIGlmICh0YWcgIT0gbnVsbCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCImdGFnPSIpOworICAgICAgICAgICAgc2IuYXBwZW5kKFVSTEVuY29kZXIuZW5jb2RlKHRhZykpOworICAgICAgICB9CisKKyAgICAgICAgZXhlY3V0ZShzYi50b1N0cmluZygpLCBzdHJlYW0sIGNvbnRlbnRUeXBlLCBjb250ZW50TGVuZ3RoKTsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYW50L0luc3RhbGxUYXNrLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYW50L0luc3RhbGxUYXNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzYyYTI0ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hbnQvSW5zdGFsbFRhc2suamF2YQpAQCAtMCwwICsxLDExOCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5hbnQ7CisKKworaW1wb3J0IGphdmEubmV0LlVSTEVuY29kZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKKworCisvKioKKyAqIEFudCB0YXNrIHRoYXQgaW1wbGVtZW50cyB0aGUgPGNvZGU+L2luc3RhbGw8L2NvZGU+IGNvbW1hbmQsIHN1cHBvcnRlZCBieSB0aGUKKyAqIFRvbWNhdCBtYW5hZ2VyIGFwcGxpY2F0aW9uLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqIEBzaW5jZSA0LjEKKyAqIEBkZXByZWNhdGVkIFJlcGxhY2VkIGJ5IERlcGxveVRhc2sKKyAqLworcHVibGljIGNsYXNzIEluc3RhbGxUYXNrIGV4dGVuZHMgQWJzdHJhY3RDYXRhbGluYVRhc2sgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogVVJMIG9mIHRoZSBjb250ZXh0IGNvbmZpZ3VyYXRpb24gZmlsZSBmb3IgdGhpcyBhcHBsaWNhdGlvbiwgaWYgYW55LgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgY29uZmlnID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29uZmlnKCkgeworICAgICAgICByZXR1cm4gKHRoaXMuY29uZmlnKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDb25maWcoU3RyaW5nIGNvbmZpZykgeworICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZzsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSBjb250ZXh0IHBhdGggb2YgdGhlIHdlYiBhcHBsaWNhdGlvbiB3ZSBhcmUgbWFuYWdpbmcuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBwYXRoID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLnBhdGgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBhdGgoU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgdGhpcy5wYXRoID0gcGF0aDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFVSTCBvZiB0aGUgd2ViIGFwcGxpY2F0aW9uIGFyY2hpdmUgKFdBUikgZmlsZSwgb3IgdGhlIHVucGFja2VkIGRpcmVjdG9yeQorICAgICAqIGNvbnRhaW5pbmcgdGhpcyBhcHBsaWNhdGlvbiwgaWYgYW55LgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgd2FyID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0V2FyKCkgeworICAgICAgICByZXR1cm4gKHRoaXMud2FyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRXYXIoU3RyaW5nIHdhcikgeworICAgICAgICB0aGlzLndhciA9IHdhcjsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlIHRoZSByZXF1ZXN0ZWQgb3BlcmF0aW9uLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKworICAgICAgICBzdXBlci5leGVjdXRlKCk7CisgICAgICAgIGlmIChwYXRoID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICgiTXVzdCBzcGVjaWZ5ICdwYXRoJyBhdHRyaWJ1dGUiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGNvbmZpZyA9PSBudWxsKSAmJiAod2FyID09IG51bGwpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoIk11c3Qgc3BlY2lmeSBhdCBsZWFzdCBvbmUgb2YgJ2NvbmZpZycgYW5kICd3YXInIik7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiL2luc3RhbGw/cGF0aD0iKTsKKyAgICAgICAgc2IuYXBwZW5kKFVSTEVuY29kZXIuZW5jb2RlKHRoaXMucGF0aCkpOworICAgICAgICBpZiAoY29uZmlnICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiJmNvbmZpZz0iKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChVUkxFbmNvZGVyLmVuY29kZShjb25maWcpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAod2FyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiJndhcj0iKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChVUkxFbmNvZGVyLmVuY29kZSh3YXIpKTsKKyAgICAgICAgfQorICAgICAgICBleGVjdXRlKHNiLnRvU3RyaW5nKCkpOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hbnQvSk1YUXVlcnlUYXNrLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYW50L0pNWFF1ZXJ5VGFzay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5MjE0YzEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYW50L0pNWFF1ZXJ5VGFzay5qYXZhCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuYW50OworCisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKKworCisvKioKKyAqIEFudCB0YXNrIHRoYXQgaW1wbGVtZW50cyB0aGUgSk1YIFF1ZXJ5IGNvbW1hbmQgCisgKiAoPGNvZGU+L2pteHByb3h5Lz9xcnk8L2NvZGU+KSBzdXBwb3J0ZWQgYnkgdGhlIFRvbWNhdCBtYW5hZ2VyIGFwcGxpY2F0aW9uLgorICoKKyAqIEBhdXRob3IgVml2ZWsgQ2hvcHJhCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBKTVhRdWVyeVRhc2sgZXh0ZW5kcyBBYnN0cmFjdENhdGFsaW5hVGFzayB7CisKKyAgICAvLyBQcm9wZXJ0aWVzCisKKyAgICAvKioKKyAgICAgKiBUaGUgSk1YIHF1ZXJ5IHN0cmluZyAKKyAgICAgKiBAc2VlICNzZXRRdWVyeShTdHJpbmcpCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBxdWVyeSAgICAgID0gbnVsbDsKKworICAgIC8vIFB1YmxpYyBNZXRob2RzCisgICAgCisgICAgLyoqCisgICAgICogR2V0IG1ldGhvZCBmb3IgdGhlIEpNWCBxdWVyeSBzdHJpbmcKKyAgICAgKiBAcmV0dXJuIFF1ZXJ5IHN0cmluZworICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UXVlcnkgKCkgeworICAgICAgICByZXR1cm4gdGhpcy5xdWVyeTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgbWV0aG9kIGZvciB0aGUgSk1YIHF1ZXJ5IHN0cmluZy4KKyAgICAqIDxQPkV4YW1wbGVzIG9mIHF1ZXJ5IGZvcm1hdDoKKyAgICAgKiA8VUw+CisgICAgICogPExJPio6KjwvTEk+CisgICAgICogPExJPio6dHlwZT1SZXF1ZXN0UHJvY2Vzc29yLCo8L0xJPgorICAgICAqIDxMST4qOmoyZWVUeXBlPVNlcnZsZXQsKjwvTEk+CisgICAgICogPExJPkNhdGFsaW5hOnR5cGU9RW52aXJvbm1lbnQscmVzb3VyY2V0eXBlPUdsb2JhbCxuYW1lPXNpbXBsZVZhbHVlPC9MST4KKyAgICAgKiA8L1VMPgorICAgICAqIDwvUD4gCisgICAgICogQHBhcmFtIHF1ZXJ5IEpNWCBRdWVyeSBzdHJpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRRdWVyeSAoU3RyaW5nIHF1ZXJ5KSB7CisgICAgICAgIHRoaXMucXVlcnkgPSBxdWVyeTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlIHRoZSByZXF1ZXN0ZWQgb3BlcmF0aW9uLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuZXhlY3V0ZSgpOworICAgICAgICBTdHJpbmcgcXVlcnlTdHJpbmcgPSAocXVlcnkgPT0gbnVsbCkgPyAiIjooIj9xcnk9IitxdWVyeSk7CisgICAgICAgIGxvZygiUXVlcnkgc3RyaW5nIGlzICIgKyBxdWVyeVN0cmluZyk7IAorICAgICAgICBleGVjdXRlICgiL2pteHByb3h5LyIgKyBxdWVyeVN0cmluZyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2FudC9KTVhTZXRUYXNrLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYW50L0pNWFNldFRhc2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGMzZmZlCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2FudC9KTVhTZXRUYXNrLmphdmEKQEAgLTAsMCArMSwxMTggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuYW50OworCisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKKworCisvKioKKyAqIEFudCB0YXNrIHRoYXQgaW1wbGVtZW50cyB0aGUgSk1YIFNldCBjb21tYW5kICg8Y29kZT4vam14cHJveHkvP3NldDwvY29kZT4pCisgKiBzdXBwb3J0ZWQgYnkgdGhlIFRvbWNhdCBtYW5hZ2VyIGFwcGxpY2F0aW9uLgorICoKKyAqIEBhdXRob3IgVml2ZWsgQ2hvcHJhCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBKTVhTZXRUYXNrIGV4dGVuZHMgQWJzdHJhY3RDYXRhbGluYVRhc2sgeworCisgICAgLy8gUHJvcGVydGllcworCisgICAgLyoqCisgICAgICogVGhlIGZ1bGwgYmVhbiBuYW1lCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBiZWFuICAgICAgPSBudWxsOworCisgICAgLyoqCisgICAgICogVGhlIGF0dHJpYnV0ZSB5b3Ugd2lzaCB0byBhbHRlcgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgYXR0cmlidXRlID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFRoZSBuZXcgdmFsdWUgZm9yIHRoZSBhdHRyaWJ1dGUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlICAgICA9IG51bGw7CisKKyAgICAvLyBQdWJsaWMgTWV0aG9kcworICAgIAorICAgIC8qKgorICAgICAqIEdldCBtZXRob2QgZm9yIHRoZSBiZWFuIG5hbWUKKyAgICAgKiBAcmV0dXJuIEJlYW4gbmFtZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QmVhbiAoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmJlYW47CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IG1ldGhvZCBmb3IgdGhlIGJlYW4gbmFtZQorICAgICAqIEBwYXJhbSBiZWFuIEJlYW4gbmFtZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEJlYW4gKFN0cmluZyBiZWFuKSB7CisgICAgICAgIHRoaXMuYmVhbiA9IGJlYW47CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IG1ldGhvZCBmb3IgdGhlIGF0dHJpYnV0ZSBuYW1lCisgICAgICogQHJldHVybiBBdHRyaWJ1dGUgbmFtZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlICgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuYXR0cmlidXRlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBtZXRob2QgZm9yIHRoZSBhdHRyaWJ1dGUgbmFtZQorICAgICAqIEBwYXJhbSBhdHRyaWJ1dGUgQXR0cmlidXRlIG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUgKFN0cmluZyBhdHRyaWJ1dGUpIHsKKyAgICAgICAgdGhpcy5hdHRyaWJ1dGUgPSBhdHRyaWJ1dGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IG1ldGhvZCBmb3IgdGhlIGF0dHJpYnV0ZSB2YWx1ZQorICAgICAqIEByZXR1cm4gQXR0cmlidXRlIHZhbHVlCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSAoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBtZXRob2QgZm9yIHRoZSBhdHRyaWJ1dGUgdmFsdWUuCisgICAgICogQHBhcmFtIHZhbHVlIEF0dHJpYnV0ZSB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlIChTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEV4ZWN1dGUgdGhlIHJlcXVlc3RlZCBvcGVyYXRpb24uCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBzdXBlci5leGVjdXRlKCk7CisgICAgICAgIGlmIChiZWFuID09IG51bGwgfHwgYXR0cmlidXRlID09IG51bGwgfHwgdmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKCJNdXN0IHNwZWNpZnkgJ2JlYW4nLCAnYXR0cmlidXRlJyBhbmQgJ3ZhbHVlJyBhdHRyaWJ1dGVzIik7CisgICAgICAgIH0KKyAgICAgICAgbG9nKCJTZXR0aW5nIGF0dHJpYnV0ZSAiICsgYXR0cmlidXRlICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGluIGJlYW4gIiArIGJlYW4gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgdG8gIiArIHZhbHVlKTsgCisgICAgICAgIGV4ZWN1dGUoIi9qbXhwcm94eS8/c2V0PSIgKyBiZWFuIAorICAgICAgICAgICAgICAgICsgIiZhdHQ9IiArIGF0dHJpYnV0ZSAKKyAgICAgICAgICAgICAgICArICImdmFsPSIgKyB2YWx1ZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2FudC9MaXN0VGFzay5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2FudC9MaXN0VGFzay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmNGMxZGMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYW50L0xpc3RUYXNrLmphdmEKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5hbnQ7CisKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworCisKKy8qKgorICogQW50IHRhc2sgdGhhdCBpbXBsZW1lbnRzIHRoZSA8Y29kZT4vbGlzdDwvY29kZT4gY29tbWFuZCwgc3VwcG9ydGVkIGJ5IHRoZQorICogVG9tY2F0IG1hbmFnZXIgYXBwbGljYXRpb24uCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICogQHNpbmNlIDQuMQorICovCitwdWJsaWMgY2xhc3MgTGlzdFRhc2sgZXh0ZW5kcyBBYnN0cmFjdENhdGFsaW5hVGFzayB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogRXhlY3V0ZSB0aGUgcmVxdWVzdGVkIG9wZXJhdGlvbi4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisKKyAgICAgICAgc3VwZXIuZXhlY3V0ZSgpOworICAgICAgICBleGVjdXRlKCIvbGlzdCIpOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hbnQvUmVsb2FkVGFzay5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2FudC9SZWxvYWRUYXNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRiOGUzZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hbnQvUmVsb2FkVGFzay5qYXZhCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuYW50OworCisKK2ltcG9ydCBqYXZhLm5ldC5VUkxFbmNvZGVyOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CisKKworLyoqCisgKiBBbnQgdGFzayB0aGF0IGltcGxlbWVudHMgdGhlIDxjb2RlPi9yZWxvYWQ8L2NvZGU+IGNvbW1hbmQsIHN1cHBvcnRlZCBieSB0aGUKKyAqIFRvbWNhdCBtYW5hZ2VyIGFwcGxpY2F0aW9uLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqIEBzaW5jZSA0LjEKKyAqLworcHVibGljIGNsYXNzIFJlbG9hZFRhc2sgZXh0ZW5kcyBBYnN0cmFjdENhdGFsaW5hVGFzayB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgY29udGV4dCBwYXRoIG9mIHRoZSB3ZWIgYXBwbGljYXRpb24gd2UgYXJlIG1hbmFnaW5nLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgcGF0aCA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhdGgoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5wYXRoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQYXRoKFN0cmluZyBwYXRoKSB7CisgICAgICAgIHRoaXMucGF0aCA9IHBhdGg7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogRXhlY3V0ZSB0aGUgcmVxdWVzdGVkIG9wZXJhdGlvbi4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisKKyAgICAgICAgc3VwZXIuZXhlY3V0ZSgpOworICAgICAgICBpZiAocGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoIk11c3Qgc3BlY2lmeSAncGF0aCcgYXR0cmlidXRlIik7CisgICAgICAgIH0KKyAgICAgICAgZXhlY3V0ZSgiL3JlbG9hZD9wYXRoPSIgKyBVUkxFbmNvZGVyLmVuY29kZSh0aGlzLnBhdGgpKTsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYW50L1JlbW92ZVRhc2suamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hbnQvUmVtb3ZlVGFzay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiYTA5ODcKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYW50L1JlbW92ZVRhc2suamF2YQpAQCAtMCwwICsxLDc0IEBACisvKgorICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmFudDsKKworCitpbXBvcnQgamF2YS5uZXQuVVJMRW5jb2RlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworCisKKy8qKgorICogQW50IHRhc2sgdGhhdCBpbXBsZW1lbnRzIHRoZSA8Y29kZT4vcmVtb3ZlPC9jb2RlPiBjb21tYW5kLCBzdXBwb3J0ZWQgYnkgdGhlCisgKiBUb21jYXQgbWFuYWdlciBhcHBsaWNhdGlvbi4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKiBAZGVwcmVjYXRlZCBSZXBsYWNlZCBieSBVbmRlcGxveVRhc2sKKyAqLworcHVibGljIGNsYXNzIFJlbW92ZVRhc2sgZXh0ZW5kcyBBYnN0cmFjdENhdGFsaW5hVGFzayB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgY29udGV4dCBwYXRoIG9mIHRoZSB3ZWIgYXBwbGljYXRpb24gd2UgYXJlIG1hbmFnaW5nLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgcGF0aCA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhdGgoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5wYXRoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQYXRoKFN0cmluZyBwYXRoKSB7CisgICAgICAgIHRoaXMucGF0aCA9IHBhdGg7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogRXhlY3V0ZSB0aGUgcmVxdWVzdGVkIG9wZXJhdGlvbi4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisKKyAgICAgICAgc3VwZXIuZXhlY3V0ZSgpOworICAgICAgICBpZiAocGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoIk11c3Qgc3BlY2lmeSAncGF0aCcgYXR0cmlidXRlIik7CisgICAgICAgIH0KKyAgICAgICAgZXhlY3V0ZSgiL3JlbW92ZT9wYXRoPSIgKyBVUkxFbmNvZGVyLmVuY29kZSh0aGlzLnBhdGgpKTsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYW50L1Jlc291cmNlc1Rhc2suamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hbnQvUmVzb3VyY2VzVGFzay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExNTIyZWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYW50L1Jlc291cmNlc1Rhc2suamF2YQpAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmFudDsKKworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CisKKworLyoqCisgKiBBbnQgdGFzayB0aGF0IGltcGxlbWVudHMgdGhlIDxjb2RlPi9yZXNvdXJjZXM8L2NvZGU+IGNvbW1hbmQsIHN1cHBvcnRlZCBieQorICogdGhlIFRvbWNhdCBtYW5hZ2VyIGFwcGxpY2F0aW9uLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqIEBzaW5jZSA0LjEKKyAqLworcHVibGljIGNsYXNzIFJlc291cmNlc1Rhc2sgZXh0ZW5kcyBBYnN0cmFjdENhdGFsaW5hVGFzayB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIHJlc291cmNlIHR5cGUgYmVpbmcgcmVxdWVzdGVkCisgICAgICogKGlmIGFueSkuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyB0eXBlID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLnR5cGUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIHR5cGUpIHsKKyAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlIHRoZSByZXF1ZXN0ZWQgb3BlcmF0aW9uLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKworICAgICAgICBzdXBlci5leGVjdXRlKCk7CisgICAgICAgIGlmICh0eXBlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGV4ZWN1dGUoIi9yZXNvdXJjZXM/dHlwZT0iICsgdHlwZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBleGVjdXRlKCIvcmVzb3VyY2VzIik7CisgICAgICAgIH0KKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYW50L1JvbGVzVGFzay5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2FudC9Sb2xlc1Rhc2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2UzNDBjCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2FudC9Sb2xlc1Rhc2suamF2YQpAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmFudDsKKworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CisKKworLyoqCisgKiBBbnQgdGFzayB0aGF0IGltcGxlbWVudHMgdGhlIDxjb2RlPi9yb2xlczwvY29kZT4gY29tbWFuZCwgc3VwcG9ydGVkIGJ5IHRoZQorICogVG9tY2F0IG1hbmFnZXIgYXBwbGljYXRpb24uCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICogQHNpbmNlIDQuMQorICovCitwdWJsaWMgY2xhc3MgUm9sZXNUYXNrIGV4dGVuZHMgQWJzdHJhY3RDYXRhbGluYVRhc2sgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIEV4ZWN1dGUgdGhlIHJlcXVlc3RlZCBvcGVyYXRpb24uCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworCisgICAgICAgIHN1cGVyLmV4ZWN1dGUoKTsKKyAgICAgICAgZXhlY3V0ZSgiL3JvbGVzIik7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2FudC9TZXJ2ZXJpbmZvVGFzay5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2FudC9TZXJ2ZXJpbmZvVGFzay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkNDFjOGMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYW50L1NlcnZlcmluZm9UYXNrLmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5hbnQ7CisKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworCisKKy8qKgorICogQW50IHRhc2sgdGhhdCBpbXBsZW1lbnRzIHRoZSA8Y29kZT4vc2VydmVyaW5mbzwvY29kZT4gY29tbWFuZAorICogc3VwcG9ydGVkIGJ5IHRoZSBUb21jYXQgbWFuYWdlciBhcHBsaWNhdGlvbi4KKyAqCisgKiBAYXV0aG9yIFZpdmVrIENob3ByYQorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworcHVibGljIGNsYXNzIFNlcnZlcmluZm9UYXNrIGV4dGVuZHMgQWJzdHJhY3RDYXRhbGluYVRhc2sgeworCisgICAgLy8gUHVibGljIE1ldGhvZHMKKworICAgIC8qKgorICAgICAqIEV4ZWN1dGUgdGhlIHJlcXVlc3RlZCBvcGVyYXRpb24uCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworCisgICAgICAgIHN1cGVyLmV4ZWN1dGUoKTsKKyAgICAgICAgZXhlY3V0ZSgiL3NlcnZlcmluZm8iKTsKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2FudC9TZXNzaW9uc1Rhc2suamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hbnQvU2Vzc2lvbnNUYXNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU4MGExMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hbnQvU2Vzc2lvbnNUYXNrLmphdmEKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5hbnQ7CisKKworaW1wb3J0IGphdmEubmV0LlVSTEVuY29kZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKKworCisvKioKKyAqIEFudCB0YXNrIHRoYXQgaW1wbGVtZW50cyB0aGUgPGNvZGU+L3Nlc3Npb25zPC9jb2RlPiBjb21tYW5kCisgKiBzdXBwb3J0ZWQgYnkgdGhlIFRvbWNhdCBtYW5hZ2VyIGFwcGxpY2F0aW9uLgorICoKKyAqIEBhdXRob3IgVml2ZWsgQ2hvcHJhCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBTZXNzaW9uc1Rhc2sgZXh0ZW5kcyBBYnN0cmFjdENhdGFsaW5hVGFzayB7CisKKyAgICAvLyBQcm9wZXJ0aWVzCisKKyAgICAvKioKKyAgICAgKiBUaGUgY29udGV4dCBwYXRoIG9mIHRoZSB3ZWIgYXBwbGljYXRpb24gd2UgYXJlIG1hbmFnaW5nLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgcGF0aCA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhdGgoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5wYXRoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQYXRoKFN0cmluZyBwYXRoKSB7CisgICAgICAgIHRoaXMucGF0aCA9IHBhdGg7CisgICAgfQorCisgICAgLy8gUHVibGljIE1ldGhvZHMKKworICAgIC8qKgorICAgICAqIEV4ZWN1dGUgdGhlIHJlcXVlc3RlZCBvcGVyYXRpb24uCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworCisgICAgICAgIHN1cGVyLmV4ZWN1dGUoKTsKKyAgICAgICAgaWYgKHBhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKCJNdXN0IHNwZWNpZnkgJ3BhdGgnIGF0dHJpYnV0ZSIpOworICAgICAgICB9CisgICAgICAgIGV4ZWN1dGUoIi9zZXNzaW9ucz9wYXRoPSIgKyBVUkxFbmNvZGVyLmVuY29kZSh0aGlzLnBhdGgpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hbnQvU3RhcnRUYXNrLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYW50L1N0YXJ0VGFzay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzMDYwNWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYW50L1N0YXJ0VGFzay5qYXZhCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuYW50OworCisKK2ltcG9ydCBqYXZhLm5ldC5VUkxFbmNvZGVyOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CisKKworLyoqCisgKiBBbnQgdGFzayB0aGF0IGltcGxlbWVudHMgdGhlIDxjb2RlPi9zdGFydDwvY29kZT4gY29tbWFuZCwgc3VwcG9ydGVkIGJ5IHRoZQorICogVG9tY2F0IG1hbmFnZXIgYXBwbGljYXRpb24uCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICogQHNpbmNlIDQuMQorICovCitwdWJsaWMgY2xhc3MgU3RhcnRUYXNrIGV4dGVuZHMgQWJzdHJhY3RDYXRhbGluYVRhc2sgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogVGhlIGNvbnRleHQgcGF0aCBvZiB0aGUgd2ViIGFwcGxpY2F0aW9uIHdlIGFyZSBtYW5hZ2luZy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHBhdGggPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXRQYXRoKCkgeworICAgICAgICByZXR1cm4gKHRoaXMucGF0aCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UGF0aChTdHJpbmcgcGF0aCkgeworICAgICAgICB0aGlzLnBhdGggPSBwYXRoOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIEV4ZWN1dGUgdGhlIHJlcXVlc3RlZCBvcGVyYXRpb24uCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworCisgICAgICAgIHN1cGVyLmV4ZWN1dGUoKTsKKyAgICAgICAgaWYgKHBhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKCJNdXN0IHNwZWNpZnkgJ3BhdGgnIGF0dHJpYnV0ZSIpOworICAgICAgICB9CisgICAgICAgIGV4ZWN1dGUoIi9zdGFydD9wYXRoPSIgKyBVUkxFbmNvZGVyLmVuY29kZSh0aGlzLnBhdGgpKTsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYW50L1N0b3BUYXNrLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYW50L1N0b3BUYXNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJiNjg3MAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hbnQvU3RvcFRhc2suamF2YQpAQCAtMCwwICsxLDc0IEBACisvKgorICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmFudDsKKworCitpbXBvcnQgamF2YS5uZXQuVVJMRW5jb2RlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworCisKKy8qKgorICogQW50IHRhc2sgdGhhdCBpbXBsZW1lbnRzIHRoZSA8Y29kZT4vc3RvcDwvY29kZT4gY29tbWFuZCwgc3VwcG9ydGVkIGJ5IHRoZQorICogVG9tY2F0IG1hbmFnZXIgYXBwbGljYXRpb24uCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICogQHNpbmNlIDQuMQorICovCitwdWJsaWMgY2xhc3MgU3RvcFRhc2sgZXh0ZW5kcyBBYnN0cmFjdENhdGFsaW5hVGFzayB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgY29udGV4dCBwYXRoIG9mIHRoZSB3ZWIgYXBwbGljYXRpb24gd2UgYXJlIG1hbmFnaW5nLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgcGF0aCA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhdGgoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5wYXRoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQYXRoKFN0cmluZyBwYXRoKSB7CisgICAgICAgIHRoaXMucGF0aCA9IHBhdGg7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogRXhlY3V0ZSB0aGUgcmVxdWVzdGVkIG9wZXJhdGlvbi4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisKKyAgICAgICAgc3VwZXIuZXhlY3V0ZSgpOworICAgICAgICBpZiAocGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoIk11c3Qgc3BlY2lmeSAncGF0aCcgYXR0cmlidXRlIik7CisgICAgICAgIH0KKyAgICAgICAgZXhlY3V0ZSgiL3N0b3A/cGF0aD0iICsgVVJMRW5jb2Rlci5lbmNvZGUodGhpcy5wYXRoKSk7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2FudC9VbmRlcGxveVRhc2suamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hbnQvVW5kZXBsb3lUYXNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFkMmMzNAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hbnQvVW5kZXBsb3lUYXNrLmphdmEKQEAgLTAsMCArMSwxMDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuYW50OworCisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKKworCisvKioKKyAqIEFudCB0YXNrIHRoYXQgaW1wbGVtZW50cyB0aGUgPGNvZGU+L3VuZGVwbG95PC9jb2RlPiBjb21tYW5kLCBzdXBwb3J0ZWQgYnkKKyAqIHRoZSBUb21jYXQgbWFuYWdlciBhcHBsaWNhdGlvbi4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKiBAc2luY2UgNC4xCisgKi8KK3B1YmxpYyBjbGFzcyBVbmRlcGxveVRhc2sgZXh0ZW5kcyBBYnN0cmFjdENhdGFsaW5hVGFzayB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gZmFpbCAod2l0aCBhIEJ1aWxkRXhjZXB0aW9uKSBpZgorICAgICAqIGFuIGVycm9yIG9jY3Vycy4gIFRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzCisgICAgICogdG8gZG8gc28uCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gZmFpbE9uRXJyb3IgPSB0cnVlOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGZhaWxPbkVycm9yCisgICAgICogcHJvcGVydHkuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNGYWlsT25FcnJvcigpIHsKKyAgICAgIHJldHVybiBmYWlsT25FcnJvcjsKKyAgICB9CisgCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGZhaWxPbkVycm9yIHByb3BlcnR5LgorICAgICAqCisgICAgICogQHBhcmFtIG5ld0ZhaWxPbkVycm9yIE5ldyBhdHRyaWJ1dGUgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGYWlsT25FcnJvcihib29sZWFuIG5ld0ZhaWxPbkVycm9yKSB7CisgICAgICBmYWlsT25FcnJvciA9IG5ld0ZhaWxPbkVycm9yOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBjb250ZXh0IHBhdGggb2YgdGhlIHdlYiBhcHBsaWNhdGlvbiB3ZSBhcmUgbWFuYWdpbmcuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBwYXRoID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLnBhdGgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBhdGgoU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgdGhpcy5wYXRoID0gcGF0aDsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlIHRoZSByZXF1ZXN0ZWQgb3BlcmF0aW9uLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKworICAgICAgICBzdXBlci5leGVjdXRlKCk7CisgICAgICAgIGlmIChwYXRoID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICgiTXVzdCBzcGVjaWZ5ICdwYXRoJyBhdHRyaWJ1dGUiKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgZXhlY3V0ZSgiL3VuZGVwbG95P3BhdGg9IiArIHRoaXMucGF0aCk7CisJfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZSkgeworCSAgaWYoIGlzRmFpbE9uRXJyb3IoKSApIHsKKwkgICAgdGhyb3cgZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYW50L1ZhbGlkYXRvclRhc2suamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hbnQvVmFsaWRhdG9yVGFzay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjOWY4OTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYW50L1ZhbGlkYXRvclRhc2suamF2YQpAQCAtMCwwICsxLDExMCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5hbnQ7CisKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cC5Db25zdGFudHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5zdGFydHVwLkRpZ2VzdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvbWNhdC51dGlsLmRpZ2VzdGVyLkRpZ2VzdGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CitpbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7CisKKworLyoqCisgKiBUYXNrIGZvciB2YWxpZGF0aW5nIGEgd2ViIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQgZGVzY3JpcHRvciwgdXNpbmcgWE1MIAorICogc2NoZW1hIHZhbGlkYXRpb24uCisgKgorICogQGF1dGhvciBSZW15IE1hdWNoZXJhdAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqIEBzaW5jZSA1LjAKKyAqLworCitwdWJsaWMgY2xhc3MgVmFsaWRhdG9yVGFzayBleHRlbmRzIFRhc2sgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBwYXRoIHRvIHRoZSB3ZWJhcHAgZGlyZWN0b3J5LgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgcGF0aCA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhdGgoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5wYXRoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQYXRoKFN0cmluZyBwYXRoKSB7CisgICAgICAgIHRoaXMucGF0aCA9IHBhdGg7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogRXhlY3V0ZSB0aGUgc3BlY2lmaWVkIGNvbW1hbmQuICBUaGlzIGxvZ2ljIG9ubHkgcGVyZm9ybXMgdGhlIGNvbW1vbgorICAgICAqIGF0dHJpYnV0ZSB2YWxpZGF0aW9uIHJlcXVpcmVkIGJ5IGFsbCBzdWJjbGFzc2VzOyBpdCBkb2VzIG5vdCBwZXJmb3JtCisgICAgICogYW55IGZ1bmN0aW9uYWwgbG9naWMgZGlyZWN0bHkuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIGEgdmFsaWRhdGlvbiBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAocGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk11c3Qgc3BlY2lmeSAncGF0aCciKTsKKyAgICAgICAgfQorCisgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKHBhdGgsIENvbnN0YW50cy5BcHBsaWNhdGlvbldlYlhtbCk7CisgICAgICAgIGlmICgoIWZpbGUuZXhpc3RzKCkpIHx8ICghZmlsZS5jYW5SZWFkKCkpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNhbm5vdCBmaW5kIHdlYi54bWwiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENvbW1vbnMtbG9nZ2luZyBsaWtlcyBoYXZpbmcgdGhlIGNvbnRleHQgY2xhc3Nsb2FkZXIgc2V0CisgICAgICAgIENsYXNzTG9hZGVyIG9sZENMID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKKyAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIKKyAgICAgICAgICAgIChWYWxpZGF0b3JUYXNrLmNsYXNzLmdldENsYXNzTG9hZGVyKCkpOworCisgICAgICAgIERpZ2VzdGVyIGRpZ2VzdGVyID0gRGlnZXN0ZXJGYWN0b3J5Lm5ld0RpZ2VzdGVyKHRydWUsIHRydWUsIG51bGwpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmlsZSA9IGZpbGUuZ2V0Q2Fub25pY2FsRmlsZSgpOworICAgICAgICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtID0gCisgICAgICAgICAgICAgICAgbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKSk7CisgICAgICAgICAgICBJbnB1dFNvdXJjZSBpcyA9IG5ldyBJbnB1dFNvdXJjZShmaWxlLnRvVVJMKCkudG9FeHRlcm5hbEZvcm0oKSk7CisgICAgICAgICAgICBpcy5zZXRCeXRlU3RyZWFtKHN0cmVhbSk7CisgICAgICAgICAgICBkaWdlc3Rlci5wYXJzZShpcyk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIndlYi54bWwgdmFsaWRhdGVkIik7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlZhbGlkYXRpb24gZmFpbHVyZSIsIHQpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIob2xkQ0wpOworICAgICAgICB9CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2FudC9jYXRhbGluYS50YXNrcyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hbnQvY2F0YWxpbmEudGFza3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk3N2QxZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hbnQvY2F0YWxpbmEudGFza3MKQEAgLTAsMCArMSwxMyBAQAorIyBQdXJlIGNhdGFsaW5hIHRhc2tzCitkZXBsb3k9b3JnLmFwYWNoZS5jYXRhbGluYS5hbnQuRGVwbG95VGFzaworbGlzdD1vcmcuYXBhY2hlLmNhdGFsaW5hLmFudC5MaXN0VGFzaworcmVsb2FkPW9yZy5hcGFjaGUuY2F0YWxpbmEuYW50LlJlbG9hZFRhc2sKK3Jlc291cmNlcz1vcmcuYXBhY2hlLmNhdGFsaW5hLmFudC5SZXNvdXJjZXNUYXNrCityb2xlcz1vcmcuYXBhY2hlLmNhdGFsaW5hLmFudC5Sb2xlc1Rhc2sKK3N0YXJ0PW9yZy5hcGFjaGUuY2F0YWxpbmEuYW50LlN0YXJ0VGFzaworc3RvcD1vcmcuYXBhY2hlLmNhdGFsaW5hLmFudC5TdG9wVGFzawordW5kZXBsb3k9b3JnLmFwYWNoZS5jYXRhbGluYS5hbnQuVW5kZXBsb3lUYXNrCit2YWxpZGF0b3I9b3JnLmFwYWNoZS5jYXRhbGluYS5hbnQuVmFsaWRhdG9yVGFzaworCisjIEphc3BlciB0YXNrcworamFzcGVyMj1vcmcuYXBhY2hlLmphc3Blci5Kc3BDCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYW50L3BhY2thZ2UuaHRtbCBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hbnQvcGFja2FnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2NWI0OWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYW50L3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDg2IEBACis8Ym9keT4KKworPHA+VGhpcyBwYWNrYWdlIGNvbnRhaW5zIGEgc2V0IG9mIDxjb2RlPlRhc2s8L2NvZGU+IGltcGxlbWVudGF0aW9ucyBmb3IKKzxlbT5BbnQgKHZlcnNpb24gMS40IG9yIGxhdGVyKTwvZW0+IHRoYXQgY2FuIGJlIHVzZWQgdG8gaW50ZXJhY3Qgd2l0aCB0aGUKK01hbmFnZXIgYXBwbGljYXRpb24gdG8gaW5zdGFsbCwgcmVsb2FkLCBhbmQgcmVtb3ZlIHdlYiBhcHBsaWNhdGlvbnMgZnJvbQorYSBydW5uaW5nIGluc3RhbmNlIG9mIFRvbWNhdC4gIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUKKzxhIGhyZWY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvdG9tY2F0L3RvbWNhdC00LjAtZG9jL21hbmFnZXItaG93dG8uaHRtbCI+CitodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3RvbWNhdC90b21jYXQtNC4wLWRvYy9tYW5hZ2VyLWhvd3RvLmh0bWw8L2E+LjwvcD4KKworPHA+VGhlIGF0dHJpYnV0ZXMgb2YgZWFjaCB0YXNrIGVsZW1lbnQgY29ycmVzcG9uZAorZXhhY3RseSB0byB0aGUgcmVxdWVzdCBwYXJhbWV0ZXJzIHRoYXQgYXJlIGluY2x1ZGVkIHdpdGggYW4gSFRUUCByZXF1ZXN0CitzZW50IGRpcmVjdGx5IHRvIHRoZSBNYW5hZ2VyIGFwcGxpY2F0aW9uLiAgVGhleSBhcmUgc3VtbWFyaXplZCBhcyBmb2xsb3dzOgorPC9wPgorCis8dGFibGU+CisgIDx0cj4KKyAgICA8dGggYWxpZ249ImNlbnRlciIgd2lkdGg9IjE1JSI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggYWxpZ249ImNlbnRlciIgd2lkdGg9Ijg1JSI+RGVzY3JpcHRpb248L3RoPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPnVybDwvdGQ+CisgICAgPHRkPgorICAgICAgVGhlIFVSTCBvZiB0aGUgTWFuYWdlciB3ZWIgYXBwbGljYXRpb24geW91IHdpbGwgdXNlIHRvCisgICAgICBwZXJmb3JtIHRoZSByZXF1ZXN0ZWQgb3BlcmF0aW9ucy4gIElmIG5vdCBzcGVjaWZpZWQsIGRlZmF1bHRzIHRvCisgICAgICA8Y29kZT5odHRwOi8vbG9jYWxob3N0OjgwODAvbWFuYWdlcjwvY29kZT4gKHdoaWNoIGNvcnJlc3BvbmRzCisgICAgICB0byBhIHN0YW5kYXJkIGluc3RhbGxhdGlvbiBvZiBUb21jYXQgNSkuCisgICAgPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj51c2VybmFtZTwvdGQ+CisgICAgPHRkPgorICAgICAgVGhlIHVzZXJuYW1lIG9mIGEgVG9tY2F0IHVzZXIgdGhhdCBoYXMgYmVlbiBjb25maWd1cmVkIHdpdGggdGhlCisgICAgICA8Y29kZT5tYW5hZ2VyPC9jb2RlPiByb2xlLCBhcyByZXF1aXJlZCB0byBleGVjdXRlIE1hbmFnZXIKKyAgICAgIGFwcGxpY2F0aW9uIGNvbW1hbmRzLiAgVGhpcyBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQuCisgICAgPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5wYXNzd29yZDwvdGQ+CisgICAgPHRkPgorICAgICAgVGhlIHBhc3N3b3JkIG9mIGEgVG9tY2F0IHVzZXIgdGhhdCBoYXMgYmVlbiBjb25maWd1cmVkIHdpdGggdGhlCisgICAgICA8Y29kZT5tYW5hZ2VyPC9jb2RlPiByb2xlLCBhcyByZXF1aXJlZCB0byBleGVjdXRlIE1hbmFnZXIKKyAgICAgIGFwcGxpY2F0aW9uIGNvbW1hbmRzLiAgVGhpcyBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQuCisgICAgPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5jb25maWc8L3RkPgorICAgIDx0ZD4KKyAgICAgIEEgVVJMIHBvaW50aW5nIGF0IHRoZSBjb250ZXh0IGNvbmZpZ3VyYXRpb24gZmlsZSAoaS5lLiBhIGZpbGUKKyAgICAgIGNvbnRhaW5pbmcgb25seSB0aGUgPGNvZGU+Jmx0O0NvbnRleHQmZ3Q7PC9jb2RlPiBlbGVtZW50LCBhbmQKKyAgICAgIGl0cyBuZXN0ZWQgZWxlbWVudHMsIGZyb20gPGNvZGU+c2VydmVyLnhtbDwvY29kZT4gZm9yIGEgcGFydGljdWxhcgorICAgICAgd2ViIGFwcGxpY2F0aW9uKS4gIFRoaXMgYXR0cmlidXRlIGlzIHN1cHBvcnRlZCBvbmx5IG9uIHRoZQorICAgICAgPGNvZGU+aW5zdGFsbDwvY29kZT4gdGFyZ2V0LCBhbmQgaXMgcmVxdWlyZWQgb25seSBpZiB5b3Ugd2lzaCB0bworICAgICAgaW5zdGFsbCBhbiBhcHBsaWNhdGlvbiB3aXRoIG5vbi1kZWZhdWx0IGNvbmZpZ3VyYXRpb24gY2hhcmFjdGVyaXN0aWNzLgorICAgIDwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+cGF0aDwvdGQ+CisgICAgPHRkPgorICAgICAgVGhlIGNvbnRleHQgcGF0aCAoaW5jbHVkaW5nIHRoZSBsZWFkaW5nIHNsYXNoKSBvZiB0aGUgd2ViIGFwcGxpY2F0aW9uCisgICAgICB0aGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgdG8gbWFuYWdlLCBvciBhIHplcm8tbGVuZ3RoIHN0cmluZyBmb3IgdGhlCisgICAgICBST09UIHdlYiBhcHBsaWNhdGlvbi4gIFRoaXMgYXR0cmlidXRlIGlzIHZhbGlkIGZvciB0aGUKKyAgICAgIDxjb2RlPmluc3RhbGw8L2NvZGU+LCA8Y29kZT5yZWxvYWQ8L2NvZGU+LCA8Y29kZT5yZW1vdmU8L2NvZGU+LAorICAgICAgPGNvZGU+c3RhcnQ8L2NvZGU+LCBhbmQgPGNvZGU+c3RvcDwvY29kZT4gdGFza3Mgb25seSwgYW5kIGlzCisgICAgICByZXF1aXJlZCBpbiBhbGwgb2YgdGhvc2UgY2FzZXMuCisgICAgPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj53YXI8L3RkPgorICAgIDx0ZD4KKyAgICAgIEEgPGNvZGU+amFyOjwvY29kZT4gVVJMIHRoYXQgcG9pbnRzIGF0IGEgd2ViIGFwcGxpY2F0aW9uIGFyY2hpdmUgKFdBUikKKyAgICAgIGZpbGUsIG9yIGEgPGNvZGU+ZmlsZTo8L2NvZGU+IFVSTCB0aGF0IHBvaW50cyBhdCBhbiB1bnBhY2tlZCBkaXJlY3RvcnkKKyAgICAgIGNvbnRhaW5pbmcgdGhlIHdlYiBhcHBsaWNhdGlvbi4gIFRoaXMgYXR0cmlidXRlIGlzIHN1cHBvcnRlZCBvbmx5IG9uCisgICAgICB0aGUgPGNvZGU+aW5zdGFsbDwvY29kZT4gdGFyZ2V0LiAgWW91IG11c3Qgc3BlY2lmeSBhdCBsZWFzdCBvbmUgb2YgdGhlCisgICAgICA8Y29kZT5jb25maWc8L2NvZGU+IGFuZCA8Y29kZT53YXI8L2NvZGU+IGF0dHJpYnV0ZXM7IGlmIHlvdSBzcGVjaWZ5CisgICAgICBib3RoLCB0aGUgPGNvZGU+d2FyPC9jb2RlPiBhdHRyaWJ1dGUgb3ZlcnJpZGVzIHRoZSA8Y29kZT5kb2NCYXNlPC9jb2RlPgorICAgICAgYXR0cmlidXRlIGluIHRoZSBjb250ZXh0IGNvbmZpZ3VyYXRpb24gZmlsZS4KKyAgICA8L3RkPgorICA8L3RyPgorPC90YWJsZT4KKworPHA+PHN0cm9uZz5OT1RFPC9zdHJvbmc+IC0gQ29tbWFuZHMgZXhlY3V0ZWQgdGhyb3VnaCB0aGUgPGVtPk1hbmFnZXI8L2VtPgorYXBwbGljYXRpb24gYXJlIDxzdHJvbmc+Tk9UPC9zdHJvbmc+IHJlZmxlY3RlZCBpbiB1cGRhdGVzIHRvIHRoZSBUb21jYXQKKzxjb2RlPnNlcnZlci54bWw8L2NvZGU+IGNvbmZpZ3VyYXRpb24gZmlsZSwgc28gdGhleSBkbyBub3QgcGVyc2lzdCBwYXN0IHRoZQorbmV4dCB0aW1lIHlvdSByZXN0YXJ0IHRoZSBlbnRpcmUgVG9tY2F0IGNvbnRhaW5lci48L3A+CisKKzwvYm9keT4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hdXRoZW50aWNhdG9yL0F1dGhlbnRpY2F0b3JCYXNlLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYXV0aGVudGljYXRvci9BdXRoZW50aWNhdG9yQmFzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmYTJlOGQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYXV0aGVudGljYXRvci9BdXRoZW50aWNhdG9yQmFzZS5qYXZhCkBAIC0wLDAgKzEsODMxIEBACisvKgorICogQ29weXJpZ2h0IDE5OTktMjAwMSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuYXV0aGVudGljYXRvcjsKKworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3Q7CitpbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5QcmluY2lwYWw7CitpbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOworCitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5Db29raWU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkF1dGhlbnRpY2F0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Db250YWluZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Db250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5QaXBlbGluZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlJlYWxtOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuU2Vzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlZhbHZlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLlJlcXVlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuUmVzcG9uc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuTG9naW5Db25maWc7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuU2VjdXJpdHlDb25zdHJhaW50OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5EYXRlVG9vbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuTGlmZWN5Y2xlU3VwcG9ydDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuU3RyaW5nTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcy5WYWx2ZUJhc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7CisKKworLyoqCisgKiBCYXNpYyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgPGI+VmFsdmU8L2I+IGludGVyZmFjZSB0aGF0IGVuZm9yY2VzIHRoZQorICogPGNvZGU+Jmx0O3NlY3VyaXR5LWNvbnN0cmFpbnQmZ3Q7PC9jb2RlPiBlbGVtZW50cyBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uCisgKiBkZXBsb3ltZW50IGRlc2NyaXB0b3IuICBUaGlzIGZ1bmN0aW9uYWxpdHkgaXMgaW1wbGVtZW50ZWQgYXMgYSBWYWx2ZQorICogc28gdGhhdCBpdCBjYW4gYmUgb21taXR0ZWQgaW4gZW52aXJvbm1lbnRzIHRoYXQgZG8gbm90IHJlcXVpcmUgdGhlc2UKKyAqIGZlYXR1cmVzLiAgSW5kaXZpZHVhbCBpbXBsZW1lbnRhdGlvbnMgb2YgZWFjaCBzdXBwb3J0ZWQgYXV0aGVudGljYXRpb24KKyAqIG1ldGhvZCBjYW4gc3ViY2xhc3MgdGhpcyBiYXNlIGNsYXNzIGFzIHJlcXVpcmVkLgorICogPHA+CisgKiA8Yj5VU0FHRSBDT05TVFJBSU5UPC9iPjogIFdoZW4gdGhpcyBjbGFzcyBpcyB1dGlsaXplZCwgdGhlIENvbnRleHQgdG8KKyAqIHdoaWNoIGl0IGlzIGF0dGFjaGVkIChvciBhIHBhcmVudCBDb250YWluZXIgaW4gYSBoaWVyYXJjaHkpIG11c3QgaGF2ZSBhbgorICogYXNzb2NpYXRlZCBSZWFsbSB0aGF0IGNhbiBiZSB1c2VkIGZvciBhdXRoZW50aWNhdGluZyB1c2VycyBhbmQgZW51bWVyYXRpbmcKKyAqIHRoZSByb2xlcyB0byB3aGljaCB0aGV5IGhhdmUgYmVlbiBhc3NpZ25lZC4KKyAqIDxwPgorICogPGI+VVNBR0UgQ09OU1RSQUlOVDwvYj46ICBUaGlzIFZhbHZlIGlzIG9ubHkgdXNlZnVsIHdoZW4gcHJvY2Vzc2luZyBIVFRQCisgKiByZXF1ZXN0cy4gIFJlcXVlc3RzIG9mIGFueSBvdGhlciB0eXBlIHdpbGwgc2ltcGx5IGJlIHBhc3NlZCB0aHJvdWdoLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBdXRoZW50aWNhdG9yQmFzZQorICAgIGV4dGVuZHMgVmFsdmVCYXNlCisgICAgaW1wbGVtZW50cyBBdXRoZW50aWNhdG9yLCBMaWZlY3ljbGUgeworICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhBdXRoZW50aWNhdG9yQmFzZS5jbGFzcyk7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBtZXNzYWdlIGRpZ2VzdCBhbGdvcml0aG0gdG8gdXNlIGlmIHdlIGNhbm5vdCB1c2UKKyAgICAgKiB0aGUgcmVxdWVzdGVkIG9uZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0FMR09SSVRITSA9ICJNRDUiOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgbnVtYmVyIG9mIHJhbmRvbSBieXRlcyB0byBpbmNsdWRlIHdoZW4gZ2VuZXJhdGluZyBhCisgICAgICogc2Vzc2lvbiBpZGVudGlmaWVyLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFNFU1NJT05fSURfQllURVMgPSAxNjsKKworCisgICAgLyoqCisgICAgICogVGhlIG1lc3NhZ2UgZGlnZXN0IGFsZ29yaXRobSB0byBiZSB1c2VkIHdoZW4gZ2VuZXJhdGluZyBzZXNzaW9uCisgICAgICogaWRlbnRpZmllcnMuICBUaGlzIG11c3QgYmUgYW4gYWxnb3JpdGhtIHN1cHBvcnRlZCBieSB0aGUKKyAgICAgKiA8Y29kZT5qYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3Q8L2NvZGU+IGNsYXNzIG9uIHlvdXIgcGxhdGZvcm0uCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBhbGdvcml0aG0gPSBERUZBVUxUX0FMR09SSVRITTsKKworCisgICAgLyoqCisgICAgICogU2hvdWxkIHdlIGNhY2hlIGF1dGhlbnRpY2F0ZWQgUHJpbmNpcGFscyBpZiB0aGUgcmVxdWVzdCBpcyBwYXJ0IG9mCisgICAgICogYW4gSFRUUCBzZXNzaW9uPworICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGNhY2hlID0gdHJ1ZTsKKworCisgICAgLyoqCisgICAgICogVGhlIENvbnRleHQgdG8gd2hpY2ggdGhpcyBWYWx2ZSBpcyBhdHRhY2hlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ29udGV4dCBjb250ZXh0ID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBNZXNzYWdlRGlnZXN0IGltcGxlbWVudGF0aW9uIHRvIGJlIHVzZWQgd2hlbgorICAgICAqIGNyZWF0aW5nIHNlc3Npb24gaWRlbnRpZmllcnMuCisgICAgICovCisgICAgcHJvdGVjdGVkIE1lc3NhZ2VEaWdlc3QgZGlnZXN0ID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogQSBTdHJpbmcgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyIHVzZWQgdG8gaW5jcmVhc2UgdGhlIGVudHJvcHkgb2YKKyAgICAgKiB0aGUgaW5pdGlhbGl6YXRpb24gb2Ygb3VyIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZW50cm9weSA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIERlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgaW5mbyA9CisgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLmF1dGhlbnRpY2F0b3IuQXV0aGVudGljYXRvckJhc2UvMS4wIjsKKworICAgIC8qKgorICAgICAqIEZsYWcgdG8gZGV0ZXJtaW5lIGlmIHdlIGRpc2FibGUgcHJveHkgY2FjaGluZywgb3IgbGVhdmUgdGhlIGlzc3VlCisgICAgICogdXAgdG8gdGhlIHdlYmFwcCBkZXZlbG9wZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gZGlzYWJsZVByb3h5Q2FjaGluZyA9IHRydWU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbGlmZWN5Y2xlIGV2ZW50IHN1cHBvcnQgZm9yIHRoaXMgY29tcG9uZW50LgorICAgICAqLworICAgIHByb3RlY3RlZCBMaWZlY3ljbGVTdXBwb3J0IGxpZmVjeWNsZSA9IG5ldyBMaWZlY3ljbGVTdXBwb3J0KHRoaXMpOworCisKKyAgICAvKioKKyAgICAgKiBBIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIHRvIHVzZSB3aGVuIGdlbmVyYXRpbmcgc2Vzc2lvbiBpZGVudGlmaWVycy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUmFuZG9tIHJhbmRvbSA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBKYXZhIGNsYXNzIG5hbWUgb2YgdGhlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGNsYXNzIHRvIGJlIHVzZWQKKyAgICAgKiB3aGVuIGdlbmVyYXRpbmcgc2Vzc2lvbiBpZGVudGlmaWVycy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHJhbmRvbUNsYXNzID0gImphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tIjsKKworCisgICAgLyoqCisgICAgICogVGhlIHN0cmluZyBtYW5hZ2VyIGZvciB0aGlzIHBhY2thZ2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdNYW5hZ2VyIHNtID0KKyAgICAgICAgU3RyaW5nTWFuYWdlci5nZXRNYW5hZ2VyKENvbnN0YW50cy5QYWNrYWdlKTsKKworCisgICAgLyoqCisgICAgICogVGhlIFNpbmdsZVNpZ25PbiBpbXBsZW1lbnRhdGlvbiBpbiBvdXIgcmVxdWVzdCBwcm9jZXNzaW5nIGNoYWluLAorICAgICAqIGlmIHRoZXJlIGlzIG9uZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU2luZ2xlU2lnbk9uIHNzbyA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIEhhcyB0aGlzIGNvbXBvbmVudCBiZWVuIHN0YXJ0ZWQ/CisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gc3RhcnRlZCA9IGZhbHNlOworCisKKyAgICAvKioKKyAgICAgKiAiRXhwaXJlcyIgaGVhZGVyIGFsd2F5cyBzZXQgdG8gRGF0ZSgxKSwgc28gZ2VuZXJhdGUgb25jZSBvbmx5CisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEVfT05FID0KKyAgICAgICAgKG5ldyBTaW1wbGVEYXRlRm9ybWF0KERhdGVUb29sLkhUVFBfUkVTUE9OU0VfREFURV9IRUFERVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbGUuVVMpKS5mb3JtYXQobmV3IERhdGUoMSkpOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBtZXNzYWdlIGRpZ2VzdCBhbGdvcml0aG0gZm9yIHRoaXMgTWFuYWdlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEFsZ29yaXRobSgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMuYWxnb3JpdGhtKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBtZXNzYWdlIGRpZ2VzdCBhbGdvcml0aG0gZm9yIHRoaXMgTWFuYWdlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhbGdvcml0aG0gVGhlIG5ldyBtZXNzYWdlIGRpZ2VzdCBhbGdvcml0aG0KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBbGdvcml0aG0oU3RyaW5nIGFsZ29yaXRobSkgeworCisgICAgICAgIHRoaXMuYWxnb3JpdGhtID0gYWxnb3JpdGhtOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGNhY2hlIGF1dGhlbnRpY2F0ZWQgUHJpbmNpcGFscyBmbGFnLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldENhY2hlKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5jYWNoZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY2FjaGUgYXV0aGVudGljYXRlZCBQcmluY2lwYWxzIGZsYWcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2FjaGUgVGhlIG5ldyBjYWNoZSBmbGFnCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2FjaGUoYm9vbGVhbiBjYWNoZSkgeworCisgICAgICAgIHRoaXMuY2FjaGUgPSBjYWNoZTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBDb250YWluZXIgdG8gd2hpY2ggdGhpcyBWYWx2ZSBpcyBhdHRhY2hlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29udGFpbmVyIGdldENvbnRhaW5lcigpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMuY29udGV4dCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgQ29udGFpbmVyIHRvIHdoaWNoIHRoaXMgVmFsdmUgaXMgYXR0YWNoZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBjb250YWluZXIgdG8gd2hpY2ggd2UgYXJlIGF0dGFjaGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29udGFpbmVyKENvbnRhaW5lciBjb250YWluZXIpIHsKKworICAgICAgICBpZiAoIShjb250YWluZXIgaW5zdGFuY2VvZiBDb250ZXh0KSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJhdXRoZW50aWNhdG9yLm5vdENvbnRleHQiKSk7CisKKyAgICAgICAgc3VwZXIuc2V0Q29udGFpbmVyKGNvbnRhaW5lcik7CisgICAgICAgIHRoaXMuY29udGV4dCA9IChDb250ZXh0KSBjb250YWluZXI7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZW50cm9weSBpbmNyZWFzZXIgdmFsdWUsIG9yIGNvbXB1dGUgYSBzZW1pLXVzZWZ1bCB2YWx1ZQorICAgICAqIGlmIHRoaXMgU3RyaW5nIGhhcyBub3QgeWV0IGJlZW4gc2V0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW50cm9weSgpIHsKKworICAgICAgICAvLyBDYWxjdWxhdGUgYSBzZW1pLXVzZWZ1bCB2YWx1ZSBpZiB0aGlzIGhhcyBub3QgYmVlbiBzZXQKKyAgICAgICAgaWYgKHRoaXMuZW50cm9weSA9PSBudWxsKQorICAgICAgICAgICAgc2V0RW50cm9weSh0aGlzLnRvU3RyaW5nKCkpOworCisgICAgICAgIHJldHVybiAodGhpcy5lbnRyb3B5KTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBlbnRyb3B5IGluY3JlYXNlciB2YWx1ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbnRyb3B5IFRoZSBuZXcgZW50cm9weSBpbmNyZWFzZXIgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFbnRyb3B5KFN0cmluZyBlbnRyb3B5KSB7CisKKyAgICAgICAgdGhpcy5lbnRyb3B5ID0gZW50cm9weTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgVmFsdmUgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJbmZvKCkgeworCisgICAgICAgIHJldHVybiAoaW5mbyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgY2xhc3MgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFJhbmRvbUNsYXNzKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5yYW5kb21DbGFzcyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgY2xhc3MgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByYW5kb21DbGFzcyBUaGUgbmV3IHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGNsYXNzIG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSYW5kb21DbGFzcyhTdHJpbmcgcmFuZG9tQ2xhc3MpIHsKKworICAgICAgICB0aGlzLnJhbmRvbUNsYXNzID0gcmFuZG9tQ2xhc3M7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGZsYWcgdGhhdCBzdGF0ZXMgaWYgd2UgYWRkIGhlYWRlcnMgdG8gZGlzYWJsZSBjYWNoaW5nIGJ5CisgICAgICogcHJveGllcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXREaXNhYmxlUHJveHlDYWNoaW5nKCkgeworICAgICAgICByZXR1cm4gZGlzYWJsZVByb3h5Q2FjaGluZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHZhbHVlIG9mIHRoZSBmbGFnIHRoYXQgc3RhdGVzIGlmIHdlIGFkZCBoZWFkZXJzIHRvIGRpc2FibGUKKyAgICAgKiBjYWNoaW5nIGJ5IHByb3hpZXMuCisgICAgICogQHBhcmFtIG5vY2FjaGUgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgd2UgYWRkIGhlYWRlcnMgdG8gZGlzYWJsZSBwcm94eSAKKyAgICAgKiAgICAgICAgICAgICAgY2FjaGluZywgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHdlIGxlYXZlIHRoZSBoZWFkZXJzIGFsb25lLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERpc2FibGVQcm94eUNhY2hpbmcoYm9vbGVhbiBub2NhY2hlKSB7CisgICAgICAgIGRpc2FibGVQcm94eUNhY2hpbmcgPSBub2NhY2hlOworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBFbmZvcmNlIHRoZSBzZWN1cml0eSByZXN0cmljdGlvbnMgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbiBkZXBsb3ltZW50CisgICAgICogZGVzY3JpcHRvciBvZiBvdXIgYXNzb2NpYXRlZCBDb250ZXh0LgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgUmVxdWVzdCB0byBiZSBwcm9jZXNzZWQKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgUmVzcG9uc2UgdG8gYmUgcHJvY2Vzc2VkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgdGhyb3duIGJ5IGEgcHJvY2Vzc2luZyBlbGVtZW50CisgICAgICovCisgICAgcHVibGljIHZvaWQgaW52b2tlKFJlcXVlc3QgcmVxdWVzdCwgUmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmRlYnVnKCJTZWN1cml0eSBjaGVja2luZyByZXF1ZXN0ICIgKworICAgICAgICAgICAgICAgIHJlcXVlc3QuZ2V0TWV0aG9kKCkgKyAiICIgKyByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKSk7CisgICAgICAgIExvZ2luQ29uZmlnIGNvbmZpZyA9IHRoaXMuY29udGV4dC5nZXRMb2dpbkNvbmZpZygpOworCisgICAgICAgIC8vIEhhdmUgd2UgZ290IGEgY2FjaGVkIGF1dGhlbnRpY2F0ZWQgUHJpbmNpcGFsIHRvIHJlY29yZD8KKyAgICAgICAgaWYgKGNhY2hlKSB7CisgICAgICAgICAgICBQcmluY2lwYWwgcHJpbmNpcGFsID0gcmVxdWVzdC5nZXRVc2VyUHJpbmNpcGFsKCk7CisgICAgICAgICAgICBpZiAocHJpbmNpcGFsID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSByZXF1ZXN0LmdldFNlc3Npb25JbnRlcm5hbChmYWxzZSk7CisgICAgICAgICAgICAgICAgaWYgKHNlc3Npb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBwcmluY2lwYWwgPSBzZXNzaW9uLmdldFByaW5jaXBhbCgpOworICAgICAgICAgICAgICAgICAgICBpZiAocHJpbmNpcGFsICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIldlIGhhdmUgY2FjaGVkIGF1dGggdHlwZSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRBdXRoVHlwZSgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBmb3IgcHJpbmNpcGFsICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldFByaW5jaXBhbCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3Quc2V0QXV0aFR5cGUoc2Vzc2lvbi5nZXRBdXRoVHlwZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3Quc2V0VXNlclByaW5jaXBhbChwcmluY2lwYWwpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gU3BlY2lhbCBoYW5kbGluZyBmb3IgZm9ybS1iYXNlZCBsb2dpbnMgdG8gZGVhbCB3aXRoIHRoZSBjYXNlCisgICAgICAgIC8vIHdoZXJlIHRoZSBsb2dpbiBmb3JtIChhbmQgdGhlcmVmb3JlIHRoZSAial9zZWN1cml0eV9jaGVjayIgVVJJCisgICAgICAgIC8vIHRvIHdoaWNoIGl0IHN1Ym1pdHMpIG1pZ2h0IGJlIG91dHNpZGUgdGhlIHNlY3VyZWQgYXJlYQorICAgICAgICBTdHJpbmcgY29udGV4dFBhdGggPSB0aGlzLmNvbnRleHQuZ2V0UGF0aCgpOworICAgICAgICBTdHJpbmcgcmVxdWVzdFVSSSA9IHJlcXVlc3QuZ2V0RGVjb2RlZFJlcXVlc3RVUkkoKTsKKyAgICAgICAgaWYgKHJlcXVlc3RVUkkuc3RhcnRzV2l0aChjb250ZXh0UGF0aCkgJiYKKyAgICAgICAgICAgIHJlcXVlc3RVUkkuZW5kc1dpdGgoQ29uc3RhbnRzLkZPUk1fQUNUSU9OKSkgeworICAgICAgICAgICAgaWYgKCFhdXRoZW50aWNhdGUocmVxdWVzdCwgcmVzcG9uc2UsIGNvbmZpZykpIHsKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiIEZhaWxlZCBhdXRoZW50aWNhdGUoKSB0ZXN0ID8/IiArIHJlcXVlc3RVUkkgKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBSZWFsbSByZWFsbSA9IHRoaXMuY29udGV4dC5nZXRSZWFsbSgpOworICAgICAgICAvLyBJcyB0aGlzIHJlcXVlc3QgVVJJIHN1YmplY3QgdG8gYSBzZWN1cml0eSBjb25zdHJhaW50PworICAgICAgICBTZWN1cml0eUNvbnN0cmFpbnQgW10gY29uc3RyYWludHMKKyAgICAgICAgICAgID0gcmVhbG0uZmluZFNlY3VyaXR5Q29uc3RyYWludHMocmVxdWVzdCwgdGhpcy5jb250ZXh0KTsKKyAgICAgICAKKyAgICAgICAgaWYgKChjb25zdHJhaW50cyA9PSBudWxsKSAvKiAmJgorICAgICAgICAgICAgKCFDb25zdGFudHMuRk9STV9NRVRIT0QuZXF1YWxzKGNvbmZpZy5nZXRBdXRoTWV0aG9kKCkpKSAqLyApIHsKKyAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiBOb3Qgc3ViamVjdCB0byBhbnkgY29uc3RyYWludCIpOworICAgICAgICAgICAgZ2V0TmV4dCgpLmludm9rZShyZXF1ZXN0LCByZXNwb25zZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCBjb25zdHJhaW5lZCByZXNvdXJjZXMgYXJlIG5vdCBjYWNoZWQgYnkgd2ViIHByb3hpZXMKKyAgICAgICAgLy8gb3IgYnJvd3NlcnMgYXMgY2FjaGluZyBjYW4gcHJvdmlkZSBhIHNlY3VyaXR5IGhvbGUKKyAgICAgICAgaWYgKGRpc2FibGVQcm94eUNhY2hpbmcgJiYgCisgICAgICAgICAgICAvLyBGSVhNRTogRGlzYWJsZWQgZm9yIE1vemlsbGEgRk9STSBzdXBwb3J0IG92ZXIgU1NMIAorICAgICAgICAgICAgLy8gKGltcHJvcGVyIGNhY2hpbmcgaXNzdWUpCisgICAgICAgICAgICAvLyFyZXF1ZXN0LmlzU2VjdXJlKCkgJiYKKyAgICAgICAgICAgICEiUE9TVCIuZXF1YWxzSWdub3JlQ2FzZShyZXF1ZXN0LmdldE1ldGhvZCgpKSkgeworICAgICAgICAgICAgcmVzcG9uc2Uuc2V0SGVhZGVyKCJQcmFnbWEiLCAiTm8tY2FjaGUiKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNldEhlYWRlcigiQ2FjaGUtQ29udHJvbCIsICJuby1jYWNoZSIpOworICAgICAgICAgICAgcmVzcG9uc2Uuc2V0SGVhZGVyKCJFeHBpcmVzIiwgREFURV9PTkUpOworICAgICAgICB9CisKKyAgICAgICAgaW50IGk7CisgICAgICAgIC8vIEVuZm9yY2UgYW55IHVzZXIgZGF0YSBjb25zdHJhaW50IGZvciB0aGlzIHNlY3VyaXR5IGNvbnN0cmFpbnQKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICBsb2cuZGVidWcoIiBDYWxsaW5nIGhhc1VzZXJEYXRhUGVybWlzc2lvbigpIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFyZWFsbS5oYXNVc2VyRGF0YVBlcm1pc3Npb24ocmVxdWVzdCwgcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRzKSkgeworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgRmFpbGVkIGhhc1VzZXJEYXRhUGVybWlzc2lvbigpIHRlc3QiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBBU1NFUlQ6IEF1dGhlbnRpY2F0b3IgYWxyZWFkeSBzZXQgdGhlIGFwcHJvcHJpYXRlCisgICAgICAgICAgICAgKiBIVFRQIHN0YXR1cyBjb2RlLCBzbyB3ZSBkbyBub3QgaGF2ZSB0byBkbyBhbnl0aGluZyBzcGVjaWFsCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgIAorICAgICAgICBmb3IoaT0wOyBpIDwgY29uc3RyYWludHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIC8vIEF1dGhlbnRpY2F0ZSBiYXNlZCB1cG9uIHRoZSBzcGVjaWZpZWQgbG9naW4gY29uZmlndXJhdGlvbgorICAgICAgICAgICAgaWYgKGNvbnN0cmFpbnRzW2ldLmdldEF1dGhDb25zdHJhaW50KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgQ2FsbGluZyBhdXRoZW50aWNhdGUoKSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIWF1dGhlbnRpY2F0ZShyZXF1ZXN0LCByZXNwb25zZSwgY29uZmlnKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiIEZhaWxlZCBhdXRoZW50aWNhdGUoKSB0ZXN0Iik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICogQVNTRVJUOiBBdXRoZW50aWNhdG9yIGFscmVhZHkgc2V0IHRoZSBhcHByb3ByaWF0ZQorICAgICAgICAgICAgICAgICAgICAgKiBIVFRQIHN0YXR1cyBjb2RlLCBzbyB3ZSBkbyBub3QgaGF2ZSB0byBkbyBhbnl0aGluZworICAgICAgICAgICAgICAgICAgICAgKiBzcGVjaWFsCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgbG9nLmRlYnVnKCIgQ2FsbGluZyBhY2Nlc3NDb250cm9sKCkiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXJlYWxtLmhhc1Jlc291cmNlUGVybWlzc2lvbihyZXF1ZXN0LCByZXNwb25zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RyYWludHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dCkpIHsKKyAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiIEZhaWxlZCBhY2Nlc3NDb250cm9sKCkgdGVzdCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIEFTU0VSVDogQWNjZXNzQ29udHJvbCBtZXRob2QgaGFzIGFscmVhZHkgc2V0IHRoZQorICAgICAgICAgICAgICogYXBwcm9wcmlhdGUgSFRUUCBzdGF0dXMgY29kZSwgc28gd2UgZG8gbm90IGhhdmUgdG8gZG8KKyAgICAgICAgICAgICAqIGFueXRoaW5nIHNwZWNpYWwKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgCisgICAgICAgIC8vIEFueSBhbmQgYWxsIHNwZWNpZmllZCBjb25zdHJhaW50cyBoYXZlIGJlZW4gc2F0aXNmaWVkCisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgbG9nLmRlYnVnKCIgU3VjY2Vzc2Z1bGx5IHBhc3NlZCBhbGwgc2VjdXJpdHkgY29uc3RyYWludHMiKTsKKyAgICAgICAgfQorICAgICAgICBnZXROZXh0KCkuaW52b2tlKHJlcXVlc3QsIHJlc3BvbnNlKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3RlY3RlZCBNZXRob2RzCisKKworCisKKyAgICAvKioKKyAgICAgKiBBc3NvY2lhdGUgdGhlIHNwZWNpZmllZCBzaW5nbGUgc2lnbiBvbiBpZGVudGlmaWVyIHdpdGggdGhlCisgICAgICogc3BlY2lmaWVkIFNlc3Npb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3NvSWQgU2luZ2xlIHNpZ24gb24gaWRlbnRpZmllcgorICAgICAqIEBwYXJhbSBzZXNzaW9uIFNlc3Npb24gdG8gYmUgYXNzb2NpYXRlZAorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGFzc29jaWF0ZShTdHJpbmcgc3NvSWQsIFNlc3Npb24gc2Vzc2lvbikgeworCisgICAgICAgIGlmIChzc28gPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgc3NvLmFzc29jaWF0ZShzc29JZCwgc2Vzc2lvbik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEF1dGhlbnRpY2F0ZSB0aGUgdXNlciBtYWtpbmcgdGhpcyByZXF1ZXN0LCBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkCisgICAgICogbG9naW4gY29uZmlndXJhdGlvbi4gIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhbnkgc3BlY2lmaWVkCisgICAgICogY29uc3RyYWludCBoYXMgYmVlbiBzYXRpc2ZpZWQsIG9yIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB3ZSBoYXZlCisgICAgICogY3JlYXRlZCBhIHJlc3BvbnNlIGNoYWxsZW5nZSBhbHJlYWR5LgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgUmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBSZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKiBAcGFyYW0gY29uZmlnICAgIExvZ2luIGNvbmZpZ3VyYXRpb24gZGVzY3JpYmluZyBob3cgYXV0aGVudGljYXRpb24KKyAgICAgKiAgICAgICAgICAgICAgc2hvdWxkIGJlIHBlcmZvcm1lZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gYXV0aGVudGljYXRlKFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZ2luQ29uZmlnIGNvbmZpZykKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uOworCisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZSBhbmQgcmV0dXJuIGEgbmV3IHNlc3Npb24gaWRlbnRpZmllciBmb3IgdGhlIGNvb2tpZSB0aGF0CisgICAgICogaWRlbnRpZmllcyBhbiBTU08gcHJpbmNpcGFsLgorICAgICAqLworICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgU3RyaW5nIGdlbmVyYXRlU2Vzc2lvbklkKCkgeworCisgICAgICAgIC8vIEdlbmVyYXRlIGEgYnl0ZSBhcnJheSBjb250YWluaW5nIGEgc2Vzc2lvbiBpZGVudGlmaWVyCisgICAgICAgIGJ5dGUgYnl0ZXNbXSA9IG5ldyBieXRlW1NFU1NJT05fSURfQllURVNdOworICAgICAgICBnZXRSYW5kb20oKS5uZXh0Qnl0ZXMoYnl0ZXMpOworICAgICAgICBieXRlcyA9IGdldERpZ2VzdCgpLmRpZ2VzdChieXRlcyk7CisKKyAgICAgICAgLy8gUmVuZGVyIHRoZSByZXN1bHQgYXMgYSBTdHJpbmcgb2YgaGV4YWRlY2ltYWwgZGlnaXRzCisgICAgICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGJ5dGUgYjEgPSAoYnl0ZSkgKChieXRlc1tpXSAmIDB4ZjApID4+IDQpOworICAgICAgICAgICAgYnl0ZSBiMiA9IChieXRlKSAoYnl0ZXNbaV0gJiAweDBmKTsKKyAgICAgICAgICAgIGlmIChiMSA8IDEwKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoKGNoYXIpICgnMCcgKyBiMSkpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoKGNoYXIpICgnQScgKyAoYjEgLSAxMCkpKTsKKyAgICAgICAgICAgIGlmIChiMiA8IDEwKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoKGNoYXIpICgnMCcgKyBiMikpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoKGNoYXIpICgnQScgKyAoYjIgLSAxMCkpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKHJlc3VsdC50b1N0cmluZygpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBNZXNzYWdlRGlnZXN0IG9iamVjdCB0byBiZSB1c2VkIGZvciBjYWxjdWxhdGluZworICAgICAqIHNlc3Npb24gaWRlbnRpZmllcnMuICBJZiBub25lIGhhcyBiZWVuIGNyZWF0ZWQgeWV0LCBpbml0aWFsaXplCisgICAgICogb25lIHRoZSBmaXJzdCB0aW1lIHRoaXMgbWV0aG9kIGlzIGNhbGxlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIE1lc3NhZ2VEaWdlc3QgZ2V0RGlnZXN0KCkgeworCisgICAgICAgIGlmICh0aGlzLmRpZ2VzdCA9PSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHRoaXMuZGlnZXN0ID0gTWVzc2FnZURpZ2VzdC5nZXRJbnN0YW5jZShhbGdvcml0aG0pOworICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICB0aGlzLmRpZ2VzdCA9IE1lc3NhZ2VEaWdlc3QuZ2V0SW5zdGFuY2UoREVGQVVMVF9BTEdPUklUSE0pOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBmKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuZGlnZXN0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKHRoaXMuZGlnZXN0KTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBpbnN0YW5jZSB3ZSBzaG91bGQgdXNlIGZvcgorICAgICAqIGdlbmVyYXRpbmcgc2Vzc2lvbiBpZGVudGlmaWVycy4gIElmIHRoZXJlIGlzIG5vIHN1Y2ggZ2VuZXJhdG9yCisgICAgICogY3VycmVudGx5IGRlZmluZWQsIGNvbnN0cnVjdCBhbmQgc2VlZCBhIG5ldyBvbmUuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCBSYW5kb20gZ2V0UmFuZG9tKCkgeworCisgICAgICAgIGlmICh0aGlzLnJhbmRvbSA9PSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIENsYXNzIGNsYXp6ID0gQ2xhc3MuZm9yTmFtZShyYW5kb21DbGFzcyk7CisgICAgICAgICAgICAgICAgdGhpcy5yYW5kb20gPSAoUmFuZG9tKSBjbGF6ei5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgICAgIGxvbmcgc2VlZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICAgICAgICAgIGNoYXIgZW50cm9weVtdID0gZ2V0RW50cm9weSgpLnRvQ2hhckFycmF5KCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyb3B5Lmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGxvbmcgdXBkYXRlID0gKChieXRlKSBlbnRyb3B5W2ldKSA8PCAoKGkgJSA4KSAqIDgpOworICAgICAgICAgICAgICAgICAgICBzZWVkIF49IHVwZGF0ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGhpcy5yYW5kb20uc2V0U2VlZChzZWVkKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhpcy5yYW5kb20gPSBuZXcgamF2YS51dGlsLlJhbmRvbSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICh0aGlzLnJhbmRvbSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEF0dGVtcHRzIHJlYXV0aGVudGljYXRpb24gdG8gdGhlIDxjb2RlPlJlYWxtPC9jb2RlPiB1c2luZworICAgICAqIHRoZSBjcmVkZW50aWFscyBpbmNsdWRlZCBpbiBhcmd1bWVudCA8Y29kZT5lbnRyeTwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3NvSWQgaWRlbnRpZmllciBvZiBTaW5nbGVTaWduT24gc2Vzc2lvbiB3aXRoIHdoaWNoIHRoZQorICAgICAqICAgICAgICAgICAgICBjYWxsZXIgaXMgYXNzb2NpYXRlZAorICAgICAqIEBwYXJhbSByZXF1ZXN0ICAgdGhlIHJlcXVlc3QgdGhhdCBuZWVkcyB0byBiZSBhdXRoZW50aWNhdGVkCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gcmVhdXRoZW50aWNhdGVGcm9tU1NPKFN0cmluZyBzc29JZCwgUmVxdWVzdCByZXF1ZXN0KSB7CisKKyAgICAgICAgaWYgKHNzbyA9PSBudWxsIHx8IHNzb0lkID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgYm9vbGVhbiByZWF1dGhlbnRpY2F0ZWQgPSBmYWxzZTsKKworICAgICAgICBDb250YWluZXIgcGFyZW50ID0gZ2V0Q29udGFpbmVyKCk7CisgICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgUmVhbG0gcmVhbG0gPSBwYXJlbnQuZ2V0UmVhbG0oKTsKKyAgICAgICAgICAgIGlmIChyZWFsbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmVhdXRoZW50aWNhdGVkID0gc3NvLnJlYXV0aGVudGljYXRlKHNzb0lkLCByZWFsbSwgcmVxdWVzdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVhdXRoZW50aWNhdGVkKSB7CisgICAgICAgICAgICBhc3NvY2lhdGUoc3NvSWQsIHJlcXVlc3QuZ2V0U2Vzc2lvbkludGVybmFsKHRydWUpKTsKKworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgUmVhdXRoZW50aWNhdGVkIGNhY2hlZCBwcmluY2lwYWwgJyIgKworICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmdldFVzZXJQcmluY2lwYWwoKS5nZXROYW1lKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAiJyB3aXRoIGF1dGggdHlwZSAnIiArICByZXF1ZXN0LmdldEF1dGhUeXBlKCkgKyAiJyIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlYXV0aGVudGljYXRlZDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVyIGFuIGF1dGhlbnRpY2F0ZWQgUHJpbmNpcGFsIGFuZCBhdXRoZW50aWNhdGlvbiB0eXBlIGluIG91cgorICAgICAqIHJlcXVlc3QsIGluIHRoZSBjdXJyZW50IHNlc3Npb24gKGlmIHRoZXJlIGlzIG9uZSksIGFuZCB3aXRoIG91cgorICAgICAqIFNpbmdsZVNpZ25PbiB2YWx2ZSwgaWYgdGhlcmUgaXMgb25lLiAgU2V0IHRoZSBhcHByb3ByaWF0ZSBjb29raWUKKyAgICAgKiB0byBiZSByZXR1cm5lZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIHNlcnZsZXQgcmVzcG9uc2Ugd2UgYXJlIGdlbmVyYXRpbmcKKyAgICAgKiBAcGFyYW0gcHJpbmNpcGFsIFRoZSBhdXRoZW50aWNhdGVkIFByaW5jaXBhbCB0byBiZSByZWdpc3RlcmVkCisgICAgICogQHBhcmFtIGF1dGhUeXBlIFRoZSBhdXRoZW50aWNhdGlvbiB0eXBlIHRvIGJlIHJlZ2lzdGVyZWQKKyAgICAgKiBAcGFyYW0gdXNlcm5hbWUgVXNlcm5hbWUgdXNlZCB0byBhdXRoZW50aWNhdGUgKGlmIGFueSkKKyAgICAgKiBAcGFyYW0gcGFzc3dvcmQgUGFzc3dvcmQgdXNlZCB0byBhdXRoZW50aWNhdGUgKGlmIGFueSkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCByZWdpc3RlcihSZXF1ZXN0IHJlcXVlc3QsIFJlc3BvbnNlIHJlc3BvbnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW5jaXBhbCBwcmluY2lwYWwsIFN0cmluZyBhdXRoVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdXNlcm5hbWUsIFN0cmluZyBwYXNzd29yZCkgeworCisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiQXV0aGVudGljYXRlZCAnIiArIHByaW5jaXBhbC5nZXROYW1lKCkgKyAiJyB3aXRoIHR5cGUgJyIKKyAgICAgICAgICAgICAgICArIGF1dGhUeXBlICsgIiciKTsKKworICAgICAgICAvLyBDYWNoZSB0aGUgYXV0aGVudGljYXRpb24gaW5mb3JtYXRpb24gaW4gb3VyIHJlcXVlc3QKKyAgICAgICAgcmVxdWVzdC5zZXRBdXRoVHlwZShhdXRoVHlwZSk7CisgICAgICAgIHJlcXVlc3Quc2V0VXNlclByaW5jaXBhbChwcmluY2lwYWwpOworCisgICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbkludGVybmFsKGZhbHNlKTsKKyAgICAgICAgLy8gQ2FjaGUgdGhlIGF1dGhlbnRpY2F0aW9uIGluZm9ybWF0aW9uIGluIG91ciBzZXNzaW9uLCBpZiBhbnkKKyAgICAgICAgaWYgKGNhY2hlKSB7CisgICAgICAgICAgICBpZiAoc2Vzc2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2Vzc2lvbi5zZXRBdXRoVHlwZShhdXRoVHlwZSk7CisgICAgICAgICAgICAgICAgc2Vzc2lvbi5zZXRQcmluY2lwYWwocHJpbmNpcGFsKTsKKyAgICAgICAgICAgICAgICBpZiAodXNlcm5hbWUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5zZXROb3RlKENvbnN0YW50cy5TRVNTX1VTRVJOQU1FX05PVEUsIHVzZXJuYW1lKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHNlc3Npb24ucmVtb3ZlTm90ZShDb25zdGFudHMuU0VTU19VU0VSTkFNRV9OT1RFKTsKKyAgICAgICAgICAgICAgICBpZiAocGFzc3dvcmQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5zZXROb3RlKENvbnN0YW50cy5TRVNTX1BBU1NXT1JEX05PVEUsIHBhc3N3b3JkKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHNlc3Npb24ucmVtb3ZlTm90ZShDb25zdGFudHMuU0VTU19QQVNTV09SRF9OT1RFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIENvbnN0cnVjdCBhIGNvb2tpZSB0byBiZSByZXR1cm5lZCB0byB0aGUgY2xpZW50CisgICAgICAgIGlmIChzc28gPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvLyBPbmx5IGNyZWF0ZSBhIG5ldyBTU08gZW50cnkgaWYgdGhlIFNTTyBkaWQgbm90IGFscmVhZHkgc2V0IGEgbm90ZQorICAgICAgICAvLyBmb3IgYW4gZXhpc3RpbmcgZW50cnkgKGFzIGl0IHdvdWxkIGRvIHdpdGggc3Vic2VxdWVudCByZXF1ZXN0cworICAgICAgICAvLyBmb3IgRElHRVNUIGFuZCBTU0wgYXV0aGVudGljYXRlZCBjb250ZXh0cykKKyAgICAgICAgU3RyaW5nIHNzb0lkID0gKFN0cmluZykgcmVxdWVzdC5nZXROb3RlKENvbnN0YW50cy5SRVFfU1NPSURfTk9URSk7CisgICAgICAgIGlmIChzc29JZCA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBDb25zdHJ1Y3QgYSBjb29raWUgdG8gYmUgcmV0dXJuZWQgdG8gdGhlIGNsaWVudAorICAgICAgICAgICAgc3NvSWQgPSBnZW5lcmF0ZVNlc3Npb25JZCgpOworICAgICAgICAgICAgQ29va2llIGNvb2tpZSA9IG5ldyBDb29raWUoQ29uc3RhbnRzLlNJTkdMRV9TSUdOX09OX0NPT0tJRSwgc3NvSWQpOworICAgICAgICAgICAgY29va2llLnNldE1heEFnZSgtMSk7CisgICAgICAgICAgICBjb29raWUuc2V0UGF0aCgiLyIpOworICAgICAgICAgICAgcmVzcG9uc2UuYWRkQ29va2llKGNvb2tpZSk7CisKKyAgICAgICAgICAgIC8vIFJlZ2lzdGVyIHRoaXMgcHJpbmNpcGFsIHdpdGggb3VyIFNTTyB2YWx2ZQorICAgICAgICAgICAgc3NvLnJlZ2lzdGVyKHNzb0lkLCBwcmluY2lwYWwsIGF1dGhUeXBlLCB1c2VybmFtZSwgcGFzc3dvcmQpOworICAgICAgICAgICAgcmVxdWVzdC5zZXROb3RlKENvbnN0YW50cy5SRVFfU1NPSURfTk9URSwgc3NvSWQpOworCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIFNTTyBzZXNzaW9uIHdpdGggdGhlIGxhdGVzdCBhdXRoZW50aWNhdGlvbiBkYXRhCisgICAgICAgICAgICBzc28udXBkYXRlKHNzb0lkLCBwcmluY2lwYWwsIGF1dGhUeXBlLCB1c2VybmFtZSwgcGFzc3dvcmQpOworICAgICAgICB9CisKKyAgICAgICAgLy8gRml4IGZvciBCdWcgMTAwNDAKKyAgICAgICAgLy8gQWx3YXlzIGFzc29jaWF0ZSBhIHNlc3Npb24gd2l0aCBhIG5ldyBTU08gcmVxaXN0cmF0aW9uLgorICAgICAgICAvLyBTU08gZW50cmllcyBhcmUgb25seSByZW1vdmVkIGZyb20gdGhlIFNTTyByZWdpc3RyeSBtYXAgd2hlbgorICAgICAgICAvLyBhc3NvY2lhdGVkIHNlc3Npb25zIGFyZSBkZXN0cm95ZWQ7IGlmIGEgbmV3IFNTTyBlbnRyeSBpcyBjcmVhdGVkCisgICAgICAgIC8vIGFib3ZlIGZvciB0aGlzIHJlcXVlc3QgYW5kIHRoZSB1c2VyIG5ldmVyIHJldmlzaXRzIHRoZSBjb250ZXh0LCB0aGUKKyAgICAgICAgLy8gU1NPIGVudHJ5IHdpbGwgbmV2ZXIgYmUgY2xlYXJlZCBpZiB3ZSBkb24ndCBhc3NvY2lhdGUgdGhlIHNlc3Npb24KKyAgICAgICAgaWYgKHNlc3Npb24gPT0gbnVsbCkKKyAgICAgICAgICAgIHNlc3Npb24gPSByZXF1ZXN0LmdldFNlc3Npb25JbnRlcm5hbCh0cnVlKTsKKyAgICAgICAgc3NvLmFzc29jaWF0ZShzc29JZCwgc2Vzc2lvbik7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBMaWZlY3ljbGUgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBsaWZlY3ljbGUgZXZlbnQgbGlzdGVuZXIgdG8gdGhpcyBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRvIGFkZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZExpZmVjeWNsZUxpc3RlbmVyKExpZmVjeWNsZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisKKyAgICAgICAgbGlmZWN5Y2xlLmFkZExpZmVjeWNsZUxpc3RlbmVyKGxpc3RlbmVyKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBsaWZlY3ljbGUgbGlzdGVuZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGxpZmVjeWNsZS4gSWYgdGhpcyAKKyAgICAgKiBMaWZlY3ljbGUgaGFzIG5vIGxpc3RlbmVycyByZWdpc3RlcmVkLCBhIHplcm8tbGVuZ3RoIGFycmF5IGlzIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBMaWZlY3ljbGVMaXN0ZW5lcltdIGZpbmRMaWZlY3ljbGVMaXN0ZW5lcnMoKSB7CisKKyAgICAgICAgcmV0dXJuIGxpZmVjeWNsZS5maW5kTGlmZWN5Y2xlTGlzdGVuZXJzKCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhIGxpZmVjeWNsZSBldmVudCBsaXN0ZW5lciBmcm9tIHRoaXMgY29tcG9uZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciB0byByZW1vdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVMaWZlY3ljbGVMaXN0ZW5lcihMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lcikgeworCisgICAgICAgIGxpZmVjeWNsZS5yZW1vdmVMaWZlY3ljbGVMaXN0ZW5lcihsaXN0ZW5lcik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFByZXBhcmUgZm9yIHRoZSBiZWdpbm5pbmcgb2YgYWN0aXZlIHVzZSBvZiB0aGUgcHVibGljIG1ldGhvZHMgb2YgdGhpcworICAgICAqIGNvbXBvbmVudC4gIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgPGNvZGU+Y29uZmlndXJlKCk8L2NvZGU+LAorICAgICAqIGFuZCBiZWZvcmUgYW55IG9mIHRoZSBwdWJsaWMgbWV0aG9kcyBvZiB0aGUgY29tcG9uZW50IGFyZSB1dGlsaXplZC4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTGlmZWN5Y2xlRXhjZXB0aW9uIGlmIHRoaXMgY29tcG9uZW50IGRldGVjdHMgYSBmYXRhbCBlcnJvcgorICAgICAqICB0aGF0IHByZXZlbnRzIHRoaXMgY29tcG9uZW50IGZyb20gYmVpbmcgdXNlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgdGhyb3dzIExpZmVjeWNsZUV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gVmFsaWRhdGUgYW5kIHVwZGF0ZSBvdXIgY3VycmVudCBjb21wb25lbnQgc3RhdGUKKyAgICAgICAgaWYgKHN0YXJ0ZWQpCisgICAgICAgICAgICB0aHJvdyBuZXcgTGlmZWN5Y2xlRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygiYXV0aGVudGljYXRvci5hbHJlYWR5U3RhcnRlZCIpKTsKKyAgICAgICAgbGlmZWN5Y2xlLmZpcmVMaWZlY3ljbGVFdmVudChTVEFSVF9FVkVOVCwgbnVsbCk7CisgICAgICAgIHN0YXJ0ZWQgPSB0cnVlOworCisgICAgICAgIC8vIExvb2sgdXAgdGhlIFNpbmdsZVNpZ25PbiBpbXBsZW1lbnRhdGlvbiBpbiBvdXIgcmVxdWVzdCBwcm9jZXNzaW5nCisgICAgICAgIC8vIHBhdGgsIGlmIHRoZXJlIGlzIG9uZQorICAgICAgICBDb250YWluZXIgcGFyZW50ID0gY29udGV4dC5nZXRQYXJlbnQoKTsKKyAgICAgICAgd2hpbGUgKChzc28gPT0gbnVsbCkgJiYgKHBhcmVudCAhPSBudWxsKSkgeworICAgICAgICAgICAgaWYgKCEocGFyZW50IGluc3RhbmNlb2YgUGlwZWxpbmUpKSB7CisgICAgICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50LmdldFBhcmVudCgpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgVmFsdmUgdmFsdmVzW10gPSAoKFBpcGVsaW5lKSBwYXJlbnQpLmdldFZhbHZlcygpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx2ZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAodmFsdmVzW2ldIGluc3RhbmNlb2YgU2luZ2xlU2lnbk9uKSB7CisgICAgICAgICAgICAgICAgICAgIHNzbyA9IChTaW5nbGVTaWduT24pIHZhbHZlc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNzbyA9PSBudWxsKQorICAgICAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnQoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIGlmIChzc28gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkZvdW5kIFNpbmdsZVNpZ25PbiBWYWx2ZSBhdCAiICsgc3NvKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk5vIFNpbmdsZVNpZ25PbiBWYWx2ZSBpcyBwcmVzZW50Iik7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogR3JhY2VmdWxseSB0ZXJtaW5hdGUgdGhlIGFjdGl2ZSB1c2Ugb2YgdGhlIHB1YmxpYyBtZXRob2RzIG9mIHRoaXMKKyAgICAgKiBjb21wb25lbnQuICBUaGlzIG1ldGhvZCBzaG91bGQgYmUgdGhlIGxhc3Qgb25lIGNhbGxlZCBvbiBhIGdpdmVuCisgICAgICogaW5zdGFuY2Ugb2YgdGhpcyBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIExpZmVjeWNsZUV4Y2VwdGlvbiBpZiB0aGlzIGNvbXBvbmVudCBkZXRlY3RzIGEgZmF0YWwgZXJyb3IKKyAgICAgKiAgdGhhdCBuZWVkcyB0byBiZSByZXBvcnRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB0aHJvd3MgTGlmZWN5Y2xlRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBWYWxpZGF0ZSBhbmQgdXBkYXRlIG91ciBjdXJyZW50IGNvbXBvbmVudCBzdGF0ZQorICAgICAgICBpZiAoIXN0YXJ0ZWQpCisgICAgICAgICAgICB0aHJvdyBuZXcgTGlmZWN5Y2xlRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygiYXV0aGVudGljYXRvci5ub3RTdGFydGVkIikpOworICAgICAgICBsaWZlY3ljbGUuZmlyZUxpZmVjeWNsZUV2ZW50KFNUT1BfRVZFTlQsIG51bGwpOworICAgICAgICBzdGFydGVkID0gZmFsc2U7CisKKyAgICAgICAgc3NvID0gbnVsbDsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYXV0aGVudGljYXRvci9CYXNpY0F1dGhlbnRpY2F0b3IuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hdXRoZW50aWNhdG9yL0Jhc2ljQXV0aGVudGljYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4YWVmNmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYXV0aGVudGljYXRvci9CYXNpY0F1dGhlbnRpY2F0b3IuamF2YQpAQCAtMCwwICsxLDIxMCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5hdXRoZW50aWNhdG9yOworCisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsOworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3Rvci5SZXF1ZXN0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLlJlc3BvbnNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkxvZ2luQ29uZmlnOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5CYXNlNjQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5idWYuQnl0ZUNodW5rOworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuYnVmLkNoYXJDaHVuazsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvbWNhdC51dGlsLmJ1Zi5NZXNzYWdlQnl0ZXM7CisKKworCisvKioKKyAqIEFuIDxiPkF1dGhlbnRpY2F0b3I8L2I+IGFuZCA8Yj5WYWx2ZTwvYj4gaW1wbGVtZW50YXRpb24gb2YgSFRUUCBCQVNJQworICogQXV0aGVudGljYXRpb24sIGFzIG91dGxpbmVkIGluIFJGQyAyNjE3OiAgIkhUVFAgQXV0aGVudGljYXRpb246IEJhc2ljCisgKiBhbmQgRGlnZXN0IEFjY2VzcyBBdXRoZW50aWNhdGlvbi4iCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBCYXNpY0F1dGhlbnRpY2F0b3IKKyAgICBleHRlbmRzIEF1dGhlbnRpY2F0b3JCYXNlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coQmFzaWNBdXRoZW50aWNhdG9yLmNsYXNzKTsKKworCisKKyAgICAvKioKKyAgICAgKiBBdXRoZW50aWNhdGUgYnl0ZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlW10gQVVUSEVOVElDQVRFX0JZVEVTID0geworICAgICAgICAoYnl0ZSkgJ1cnLAorICAgICAgICAoYnl0ZSkgJ1cnLAorICAgICAgICAoYnl0ZSkgJ1cnLAorICAgICAgICAoYnl0ZSkgJy0nLAorICAgICAgICAoYnl0ZSkgJ0EnLAorICAgICAgICAoYnl0ZSkgJ3UnLAorICAgICAgICAoYnl0ZSkgJ3QnLAorICAgICAgICAoYnl0ZSkgJ2gnLAorICAgICAgICAoYnl0ZSkgJ2UnLAorICAgICAgICAoYnl0ZSkgJ24nLAorICAgICAgICAoYnl0ZSkgJ3QnLAorICAgICAgICAoYnl0ZSkgJ2knLAorICAgICAgICAoYnl0ZSkgJ2MnLAorICAgICAgICAoYnl0ZSkgJ2EnLAorICAgICAgICAoYnl0ZSkgJ3QnLAorICAgICAgICAoYnl0ZSkgJ2UnCisgICAgfTsKKworCisgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogRGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBpbmZvID0KKyAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuYXV0aGVudGljYXRvci5CYXNpY0F1dGhlbnRpY2F0b3IvMS4wIjsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIFZhbHZlIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5mbygpIHsKKworICAgICAgICByZXR1cm4gKGluZm8pOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogQXV0aGVudGljYXRlIHRoZSB1c2VyIG1ha2luZyB0aGlzIHJlcXVlc3QsIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBsb2dpbiBjb25maWd1cmF0aW9uLiAgUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGFueSBzcGVjaWZpZWQKKyAgICAgKiBjb25zdHJhaW50IGhhcyBiZWVuIHNhdGlzZmllZCwgb3IgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHdlIGhhdmUKKyAgICAgKiBjcmVhdGVkIGEgcmVzcG9uc2UgY2hhbGxlbmdlIGFscmVhZHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBSZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqIEBwYXJhbSBjb25maWcgICAgTG9naW4gY29uZmlndXJhdGlvbiBkZXNjcmliaW5nIGhvdyBhdXRoZW50aWNhdGlvbgorICAgICAqICAgICAgICAgICAgICBzaG91bGQgYmUgcGVyZm9ybWVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBhdXRoZW50aWNhdGUoUmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNwb25zZSByZXNwb25zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9naW5Db25maWcgY29uZmlnKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIC8vIEhhdmUgd2UgYWxyZWFkeSBhdXRoZW50aWNhdGVkIHNvbWVvbmU/CisgICAgICAgIFByaW5jaXBhbCBwcmluY2lwYWwgPSByZXF1ZXN0LmdldFVzZXJQcmluY2lwYWwoKTsKKyAgICAgICAgU3RyaW5nIHNzb0lkID0gKFN0cmluZykgcmVxdWVzdC5nZXROb3RlKENvbnN0YW50cy5SRVFfU1NPSURfTk9URSk7CisgICAgICAgIGlmIChwcmluY2lwYWwgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQWxyZWFkeSBhdXRoZW50aWNhdGVkICciICsgcHJpbmNpcGFsLmdldE5hbWUoKSArICInIik7CisgICAgICAgICAgICAvLyBBc3NvY2lhdGUgdGhlIHNlc3Npb24gd2l0aCBhbnkgZXhpc3RpbmcgU1NPIHNlc3Npb24KKyAgICAgICAgICAgIGlmIChzc29JZCAhPSBudWxsKQorICAgICAgICAgICAgICAgIGFzc29jaWF0ZShzc29JZCwgcmVxdWVzdC5nZXRTZXNzaW9uSW50ZXJuYWwodHJ1ZSkpOworICAgICAgICAgICAgcmV0dXJuICh0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIElzIHRoZXJlIGFuIFNTTyBzZXNzaW9uIGFnYWluc3Qgd2hpY2ggd2UgY2FuIHRyeSB0byByZWF1dGhlbnRpY2F0ZT8KKyAgICAgICAgaWYgKHNzb0lkICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlNTTyBJZCAiICsgc3NvSWQgKyAiIHNldDsgYXR0ZW1wdGluZyAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInJlYXV0aGVudGljYXRpb24iKTsKKyAgICAgICAgICAgIC8qIFRyeSB0byByZWF1dGhlbnRpY2F0ZSB1c2luZyBkYXRhIGNhY2hlZCBieSBTU08uICBJZiB0aGlzIGZhaWxzLAorICAgICAgICAgICAgICAgZWl0aGVyIHRoZSBvcmlnaW5hbCBTU08gbG9nb24gd2FzIG9mIERJR0VTVCBvciBTU0wgKHdoaWNoCisgICAgICAgICAgICAgICB3ZSBjYW4ndCByZWF1dGhlbnRpY2F0ZSBvdXJzZWx2ZXMgYmVjYXVzZSB0aGVyZSBpcyBubworICAgICAgICAgICAgICAgY2FjaGVkIHVzZXJuYW1lIGFuZCBwYXNzd29yZCksIG9yIHRoZSByZWFsbSBkZW5pZWQKKyAgICAgICAgICAgICAgIHRoZSB1c2VyJ3MgcmVhdXRoZW50aWNhdGlvbiBmb3Igc29tZSByZWFzb24uCisgICAgICAgICAgICAgICBJbiBlaXRoZXIgY2FzZSB3ZSBoYXZlIHRvIHByb21wdCB0aGUgdXNlciBmb3IgYSBsb2dvbiAqLworICAgICAgICAgICAgaWYgKHJlYXV0aGVudGljYXRlRnJvbVNTTyhzc29JZCwgcmVxdWVzdCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICAvLyBWYWxpZGF0ZSBhbnkgY3JlZGVudGlhbHMgYWxyZWFkeSBpbmNsdWRlZCB3aXRoIHRoaXMgcmVxdWVzdAorICAgICAgICBTdHJpbmcgdXNlcm5hbWUgPSBudWxsOworICAgICAgICBTdHJpbmcgcGFzc3dvcmQgPSBudWxsOworCisgICAgICAgIE1lc3NhZ2VCeXRlcyBhdXRob3JpemF0aW9uID0gCisgICAgICAgICAgICByZXF1ZXN0LmdldENveW90ZVJlcXVlc3QoKS5nZXRNaW1lSGVhZGVycygpCisgICAgICAgICAgICAuZ2V0VmFsdWUoImF1dGhvcml6YXRpb24iKTsKKyAgICAgICAgCisgICAgICAgIGlmIChhdXRob3JpemF0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIGF1dGhvcml6YXRpb24udG9CeXRlcygpOworICAgICAgICAgICAgQnl0ZUNodW5rIGF1dGhvcml6YXRpb25CQyA9IGF1dGhvcml6YXRpb24uZ2V0Qnl0ZUNodW5rKCk7CisgICAgICAgICAgICBpZiAoYXV0aG9yaXphdGlvbkJDLnN0YXJ0c1dpdGhJZ25vcmVDYXNlKCJiYXNpYyAiLCAwKSkgeworICAgICAgICAgICAgICAgIGF1dGhvcml6YXRpb25CQy5zZXRPZmZzZXQoYXV0aG9yaXphdGlvbkJDLmdldE9mZnNldCgpICsgNik7CisgICAgICAgICAgICAgICAgLy8gRklYTUU6IEFkZCB0cmltbWluZworICAgICAgICAgICAgICAgIC8vIGF1dGhvcml6YXRpb25CQy50cmltKCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgQ2hhckNodW5rIGF1dGhvcml6YXRpb25DQyA9IGF1dGhvcml6YXRpb24uZ2V0Q2hhckNodW5rKCk7CisgICAgICAgICAgICAgICAgQmFzZTY0LmRlY29kZShhdXRob3JpemF0aW9uQkMsIGF1dGhvcml6YXRpb25DQyk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gR2V0IHVzZXJuYW1lIGFuZCBwYXNzd29yZAorICAgICAgICAgICAgICAgIGludCBjb2xvbiA9IGF1dGhvcml6YXRpb25DQy5pbmRleE9mKCc6Jyk7CisgICAgICAgICAgICAgICAgaWYgKGNvbG9uIDwgMCkgeworICAgICAgICAgICAgICAgICAgICB1c2VybmFtZSA9IGF1dGhvcml6YXRpb25DQy50b1N0cmluZygpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNoYXJbXSBidWYgPSBhdXRob3JpemF0aW9uQ0MuZ2V0QnVmZmVyKCk7CisgICAgICAgICAgICAgICAgICAgIHVzZXJuYW1lID0gbmV3IFN0cmluZyhidWYsIDAsIGNvbG9uKTsKKyAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmQgPSBuZXcgU3RyaW5nKGJ1ZiwgY29sb24gKyAxLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYubGVuZ3RoIC0gY29sb24gLSAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgYXV0aG9yaXphdGlvbkJDLnNldE9mZnNldChhdXRob3JpemF0aW9uQkMuZ2V0T2Zmc2V0KCkgLSA2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHJpbmNpcGFsID0gY29udGV4dC5nZXRSZWFsbSgpLmF1dGhlbnRpY2F0ZSh1c2VybmFtZSwgcGFzc3dvcmQpOworICAgICAgICBpZiAocHJpbmNpcGFsICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJlZ2lzdGVyKHJlcXVlc3QsIHJlc3BvbnNlLCBwcmluY2lwYWwsIENvbnN0YW50cy5CQVNJQ19NRVRIT0QsCisgICAgICAgICAgICAgICAgICAgICB1c2VybmFtZSwgcGFzc3dvcmQpOworICAgICAgICAgICAgcmV0dXJuICh0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFNlbmQgYW4gInVuYXV0aG9yaXplZCIgcmVzcG9uc2UgYW5kIGFuIGFwcHJvcHJpYXRlIGNoYWxsZW5nZQorICAgICAgICBNZXNzYWdlQnl0ZXMgYXV0aGVudGljYXRlID0gCisgICAgICAgICAgICByZXNwb25zZS5nZXRDb3lvdGVSZXNwb25zZSgpLmdldE1pbWVIZWFkZXJzKCkKKyAgICAgICAgICAgIC5hZGRWYWx1ZShBVVRIRU5USUNBVEVfQllURVMsIDAsIEFVVEhFTlRJQ0FURV9CWVRFUy5sZW5ndGgpOworICAgICAgICBDaGFyQ2h1bmsgYXV0aGVudGljYXRlQ0MgPSBhdXRoZW50aWNhdGUuZ2V0Q2hhckNodW5rKCk7CisgICAgICAgIGF1dGhlbnRpY2F0ZUNDLmFwcGVuZCgiQmFzaWMgcmVhbG09XCIiKTsKKyAgICAgICAgaWYgKGNvbmZpZy5nZXRSZWFsbU5hbWUoKSA9PSBudWxsKSB7CisgICAgICAgICAgICBhdXRoZW50aWNhdGVDQy5hcHBlbmQocmVxdWVzdC5nZXRTZXJ2ZXJOYW1lKCkpOworICAgICAgICAgICAgYXV0aGVudGljYXRlQ0MuYXBwZW5kKCc6Jyk7CisgICAgICAgICAgICBhdXRoZW50aWNhdGVDQy5hcHBlbmQoSW50ZWdlci50b1N0cmluZyhyZXF1ZXN0LmdldFNlcnZlclBvcnQoKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXV0aGVudGljYXRlQ0MuYXBwZW5kKGNvbmZpZy5nZXRSZWFsbU5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgYXV0aGVudGljYXRlQ0MuYXBwZW5kKCdcIicpOyAgICAgICAgCisgICAgICAgIGF1dGhlbnRpY2F0ZS50b0NoYXJzKCk7CisgICAgICAgIHJlc3BvbnNlLnNldFN0YXR1cyhIdHRwU2VydmxldFJlc3BvbnNlLlNDX1VOQVVUSE9SSVpFRCk7CisgICAgICAgIC8vcmVzcG9uc2UuZmx1c2hCdWZmZXIoKTsKKyAgICAgICAgcmV0dXJuIChmYWxzZSk7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2F1dGhlbnRpY2F0b3IvQ29uc3RhbnRzLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYXV0aGVudGljYXRvci9Db25zdGFudHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzI1OTk3Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2F1dGhlbnRpY2F0b3IvQ29uc3RhbnRzLmphdmEKQEAgLTAsMCArMSwxMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuYXV0aGVudGljYXRvcjsKKworCitwdWJsaWMgY2xhc3MgQ29uc3RhbnRzIHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBhY2thZ2UgPSAib3JnLmFwYWNoZS5jYXRhbGluYS5hdXRoZW50aWNhdG9yIjsKKworICAgIC8vIEF1dGhlbnRpY2F0aW9uIG1ldGhvZHMgZm9yIGxvZ2luIGNvbmZpZ3VyYXRpb24KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCQVNJQ19NRVRIT0QgPSAiQkFTSUMiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENFUlRfTUVUSE9EID0gIkNMSUVOVC1DRVJUIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESUdFU1RfTUVUSE9EID0gIkRJR0VTVCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9NRVRIT0QgPSAiRk9STSI7CisKKyAgICAvLyBVc2VyIGRhdGEgY29uc3RyYWludHMgZm9yIHRyYW5zcG9ydCBndWFyYW50ZWUKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT05FX1RSQU5TUE9SVCA9ICJOT05FIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlRFR1JBTF9UUkFOU1BPUlQgPSAiSU5URUdSQUwiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJREVOVElBTF9UUkFOU1BPUlQgPSAiQ09ORklERU5USUFMIjsKKworICAgIC8vIEZvcm0gYmFzZWQgYXV0aGVudGljYXRpb24gY29uc3RhbnRzCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9BQ1RJT04gPSAiL2pfc2VjdXJpdHlfY2hlY2siOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUEFTU1dPUkQgPSAial9wYXNzd29yZCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9VU0VSTkFNRSA9ICJqX3VzZXJuYW1lIjsKKworICAgIC8vIENvb2tpZSBuYW1lIGZvciBzaW5nbGUgc2lnbiBvbiBzdXBwb3J0CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lOR0xFX1NJR05fT05fQ09PS0lFID0gIkpTRVNTSU9OSURTU08iOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUmVxdWVzdCBOb3RlcworCisKKyAgICAvKioKKyAgICAgKiA8cD5JZiBhIHVzZXIgaGFzIGJlZW4gYXV0aGVudGljYXRlZCBieSB0aGUgd2ViIGxheWVyLCBieSBtZWFucyBvZiBhCisgICAgICogbG9naW4gbWV0aG9kIG90aGVyIHRoYW4gQ0xJRU5UX0NFUlQsIHRoZSB1c2VybmFtZSBhbmQgcGFzc3dvcmQKKyAgICAgKiB1c2VkIHRvIGF1dGhlbnRpY2F0ZSB0aGUgdXNlciB3aWxsIGJlIGF0dGFjaGVkIHRvIHRoZSByZXF1ZXN0IGFzCisgICAgICogTm90ZXMgZm9yIHVzZSBieSBvdGhlciBzZXJ2ZXIgY29tcG9uZW50cy4gIEEgc2VydmVyIGNvbXBvbmVudCBjYW4KKyAgICAgKiBhbHNvIGNhbGwgc2V2ZXJhbCBleGlzdGluZyBtZXRob2RzIG9uIFJlcXVlc3QgdG8gZGV0ZXJtaW5lIHdoZXRoZXIKKyAgICAgKiBvciBub3QgYW55IHVzZXIgaGFzIGJlZW4gYXV0aGVudGljYXRlZDo8L3A+CisgICAgICogPHVsPgorICAgICAqIDxsaT48c3Ryb25nPnJlcXVlc3QuZ2V0QXV0aFR5cGUoKTwvc3Ryb25nPgorICAgICAqICAgICB3aWxsIHJldHVybiBCQVNJQywgQ0xJRU5ULUNFUlQsIERJR0VTVCwgRk9STSwgb3IgPGNvZGU+bnVsbDwvY29kZT4KKyAgICAgKiAgICAgaWYgdGhlcmUgaXMgbm8gYXV0aGVudGljYXRlZCB1c2VyLjwvbGk+CisgICAgICogPGxpPjxzdHJvbmc+cmVxdWVzdC5nZXRVc2VyUHJpbmNpcGFsKCk8L3N0cm9uZz4KKyAgICAgKiAgICAgd2lsbCByZXR1cm4gdGhlIGF1dGhlbnRpY2F0ZWQgPGNvZGU+UHJpbmNpcGFsPC9jb2RlPiByZXR1cm5lZCBieSB0aGUKKyAgICAgKiAgICAgPGNvZGU+UmVhbG08L2NvZGU+IHRoYXQgYXV0aGVudGljYXRlZCB0aGlzIHVzZXIuPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDxwPklmIENMSUVOVF9DRVJUIGF1dGhlbnRpY2F0aW9uIHdhcyBwZXJmb3JtZWQsIHRoZSBjZXJ0aWZpY2F0ZSBjaGFpbgorICAgICAqIHdpbGwgYmUgYXZhaWxhYmxlIGFzIGEgcmVxdWVzdCBhdHRyaWJ1dGUsIGFzIGRlZmluZWQgaW4gdGhlCisgICAgICogc2VydmxldCBzcGVjaWZpY2F0aW9uLjwvcD4KKyAgICAgKi8KKworCisgICAgLyoqCisgICAgICogVGhlIG5vdGVzIGtleSBmb3IgdGhlIHBhc3N3b3JkIHVzZWQgdG8gYXV0aGVudGljYXRlIHRoaXMgdXNlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVFfUEFTU1dPUkRfTk9URSA9CisgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5yZXF1ZXN0LlBBU1NXT1JEIjsKKworCisgICAgLyoqCisgICAgICogVGhlIG5vdGVzIGtleSBmb3IgdGhlIHVzZXJuYW1lIHVzZWQgdG8gYXV0aGVudGljYXRlIHRoaXMgdXNlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVFfVVNFUk5BTUVfTk9URSA9CisgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5yZXF1ZXN0LlVTRVJOQU1FIjsKKworCisgICAgLyoqCisgICAgICogVGhlIG5vdGVzIGtleSB0byB0cmFjayB0aGUgc2luZ2xlLXNpZ24tb24gaWRlbnRpdHkgd2l0aCB3aGljaCB0aGlzCisgICAgICogcmVxdWVzdCBpcyBhc3NvY2lhdGVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUV9TU09JRF9OT1RFID0KKyAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLnJlcXVlc3QuU1NPSUQiOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNlc3Npb24gTm90ZXMKKworCisgICAgLyoqCisgICAgICogSWYgdGhlIDxjb2RlPmNhY2hlPC9jb2RlPiBwcm9wZXJ0eSBvZiBvdXIgYXV0aGVudGljYXRvciBpcyBzZXQsIGFuZAorICAgICAqIHRoZSBjdXJyZW50IHJlcXVlc3QgaXMgcGFydCBvZiBhIHNlc3Npb24sIGF1dGhlbnRpY2F0aW9uIGluZm9ybWF0aW9uCisgICAgICogd2lsbCBiZSBjYWNoZWQgdG8gYXZvaWQgdGhlIG5lZWQgZm9yIHJlcGVhdGVkIGNhbGxzIHRvCisgICAgICogPGNvZGU+UmVhbG0uYXV0aGVudGljYXRlKCk8L2NvZGU+LCB1bmRlciB0aGUgZm9sbG93aW5nIGtleXM6CisgICAgICovCisKKworICAgIC8qKgorICAgICAqIFRoZSBub3RlcyBrZXkgZm9yIHRoZSBwYXNzd29yZCB1c2VkIHRvIGF1dGhlbnRpY2F0ZSB0aGlzIHVzZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VTU19QQVNTV09SRF9OT1RFID0KKyAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLnNlc3Npb24uUEFTU1dPUkQiOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgbm90ZXMga2V5IGZvciB0aGUgdXNlcm5hbWUgdXNlZCB0byBhdXRoZW50aWNhdGUgdGhpcyB1c2VyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFU1NfVVNFUk5BTUVfTk9URSA9CisgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5zZXNzaW9uLlVTRVJOQU1FIjsKKworCisgICAgLyoqCisgICAgICogVGhlIGZvbGxvd2luZyBub3RlIGtleXMgYXJlIHVzZWQgZHVyaW5nIGZvcm0gbG9naW4gcHJvY2Vzc2luZyB0bworICAgICAqIGNhY2hlIHJlcXVpcmVkIGluZm9ybWF0aW9uIHByaW9yIHRvIHRoZSBjb21wbGV0aW9uIG9mIGF1dGhlbnRpY2F0aW9uLgorICAgICAqLworCisKKyAgICAvKioKKyAgICAgKiBUaGUgcHJldmlvdXNseSBhdXRoZW50aWNhdGVkIHByaW5jaXBhbCAoaWYgY2FjaGluZyBpcyBkaXNhYmxlZCkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QUklOQ0lQQUxfTk9URSA9CisgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLmF1dGhlbnRpY2F0b3IuUFJJTkNJUEFMIjsKKworCisgICAgLyoqCisgICAgICogVGhlIG9yaWdpbmFsIHJlcXVlc3QgaW5mb3JtYXRpb24sIHRvIHdoaWNoIHRoZSB1c2VyIHdpbGwgYmUKKyAgICAgKiByZWRpcmVjdGVkIGlmIGF1dGhlbnRpY2F0aW9uIHN1Y2NlZWRzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUkVRVUVTVF9OT1RFID0KKyAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuYXV0aGVudGljYXRvci5SRVFVRVNUIjsKKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYXV0aGVudGljYXRvci9EaWdlc3RBdXRoZW50aWNhdG9yLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYXV0aGVudGljYXRvci9EaWdlc3RBdXRoZW50aWNhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJjZjFjOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hdXRoZW50aWNhdG9yL0RpZ2VzdEF1dGhlbnRpY2F0b3IuamF2YQpAQCAtMCwwICsxLDQ1OSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5hdXRoZW50aWNhdG9yOworCisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuTWVzc2FnZURpZ2VzdDsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5Lk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaW5jaXBhbDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5SZWFsbTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3Rvci5SZXF1ZXN0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLlJlc3BvbnNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkxvZ2luQ29uZmlnOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5NRDVFbmNvZGVyOworCisKKworLyoqCisgKiBBbiA8Yj5BdXRoZW50aWNhdG9yPC9iPiBhbmQgPGI+VmFsdmU8L2I+IGltcGxlbWVudGF0aW9uIG9mIEhUVFAgRElHRVNUCisgKiBBdXRoZW50aWNhdGlvbiAoc2VlIFJGQyAyMDY5KS4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEBhdXRob3IgUmVteSBNYXVjaGVyYXQKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIERpZ2VzdEF1dGhlbnRpY2F0b3IKKyAgICBleHRlbmRzIEF1dGhlbnRpY2F0b3JCYXNlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coRGlnZXN0QXV0aGVudGljYXRvci5jbGFzcyk7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0YW50cworCisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgdGhhdCBubyBvbmNlIHRva2VucyBhcmUgdXNlZCBvbmx5IG9uY2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgVVNFX09OQ0UgPSAxOworCisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgdGhhdCBubyBvbmNlIHRva2VucyBhcmUgdXNlZCBvbmx5IG9uY2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgVVNFX05FVkVSX0VYUElSRVMgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKKworCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHRoYXQgbm8gb25jZSB0b2tlbnMgYXJlIHVzZWQgb25seSBvbmNlLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFRJTUVPVVRfSU5GSU5JVEUgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKKworCisgICAgLyoqCisgICAgICogVGhlIE1ENSBoZWxwZXIgb2JqZWN0IGZvciB0aGlzIGNsYXNzLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgTUQ1RW5jb2RlciBtZDVFbmNvZGVyID0gbmV3IE1ENUVuY29kZXIoKTsKKworCisgICAgLyoqCisgICAgICogRGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBpbmZvID0KKyAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuYXV0aGVudGljYXRvci5EaWdlc3RBdXRoZW50aWNhdG9yLzEuMCI7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICBwdWJsaWMgRGlnZXN0QXV0aGVudGljYXRvcigpIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChtZDVIZWxwZXIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBtZDVIZWxwZXIgPSBNZXNzYWdlRGlnZXN0LmdldEluc3RhbmNlKCJNRDUiKTsKKyAgICAgICAgfSBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBNRDUgbWVzc2FnZSBkaWdlc3QgcHJvdmlkZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBNZXNzYWdlRGlnZXN0IG1kNUhlbHBlcjsKKworCisgICAgLyoqCisgICAgICogTm8gb25jZSBoYXNodGFibGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIEhhc2h0YWJsZSBuT25jZVRva2VucyA9IG5ldyBIYXNodGFibGUoKTsKKworCisgICAgLyoqCisgICAgICogTm8gb25jZSBleHBpcmF0aW9uIChpbiBtaWxsaXNlY29uZCkuIEEgc2hvcnRlciBhbW91bnQgd291bGQgbWVhbiBhCisgICAgICogYmV0dGVyIHNlY3VyaXR5IGxldmVsIChzaW5jZSB0aGUgdG9rZW4gaXMgZ2VuZXJhdGVkIG1vcmUgb2Z0ZW4pLCBidXQgYXQKKyAgICAgKiB0aGUgZXhwZW5zZSBvZiBhIGJpZ2dlciBzZXJ2ZXIgb3ZlcmhlYWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIGxvbmcgbk9uY2VUaW1lb3V0ID0gVElNRU9VVF9JTkZJTklURTsKKworCisgICAgLyoqCisgICAgICogTm8gb25jZSBleHBpcmF0aW9uIGFmdGVyIGEgc3BlY2lmaWVkIG51bWJlciBvZiB1c2VzLiBBIGxvd2VyIG51bWJlcgorICAgICAqIHdvdWxkIHByb2R1Y2UgbW9yZSBvdmVyaGVhZCwgc2luY2UgYSB0b2tlbiB3b3VsZCBoYXZlIHRvIGJlIGdlbmVyYXRlZAorICAgICAqIG1vcmUgb2Z0ZW4sIGJ1dCB3b3VsZCBiZSBtb3JlIHNlY3VyZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IG5PbmNlVXNlcyA9IFVTRV9PTkNFOworCisKKyAgICAvKioKKyAgICAgKiBQcml2YXRlIGtleS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGtleSA9ICJDYXRhbGluYSI7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBWYWx2ZSBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEluZm8oKSB7CisKKyAgICAgICAgcmV0dXJuIChpbmZvKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIEF1dGhlbnRpY2F0ZSB0aGUgdXNlciBtYWtpbmcgdGhpcyByZXF1ZXN0LCBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkCisgICAgICogbG9naW4gY29uZmlndXJhdGlvbi4gIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhbnkgc3BlY2lmaWVkCisgICAgICogY29uc3RyYWludCBoYXMgYmVlbiBzYXRpc2ZpZWQsIG9yIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB3ZSBoYXZlCisgICAgICogY3JlYXRlZCBhIHJlc3BvbnNlIGNoYWxsZW5nZSBhbHJlYWR5LgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgUmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBSZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKiBAcGFyYW0gY29uZmlnICAgIExvZ2luIGNvbmZpZ3VyYXRpb24gZGVzY3JpYmluZyBob3cgYXV0aGVudGljYXRpb24KKyAgICAgKiAgICAgICAgICAgICAgc2hvdWxkIGJlIHBlcmZvcm1lZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gYXV0aGVudGljYXRlKFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZ2luQ29uZmlnIGNvbmZpZykKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBIYXZlIHdlIGFscmVhZHkgYXV0aGVudGljYXRlZCBzb21lb25lPworICAgICAgICBQcmluY2lwYWwgcHJpbmNpcGFsID0gcmVxdWVzdC5nZXRVc2VyUHJpbmNpcGFsKCk7CisgICAgICAgIC8vU3RyaW5nIHNzb0lkID0gKFN0cmluZykgcmVxdWVzdC5nZXROb3RlKENvbnN0YW50cy5SRVFfU1NPSURfTk9URSk7CisgICAgICAgIGlmIChwcmluY2lwYWwgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQWxyZWFkeSBhdXRoZW50aWNhdGVkICciICsgcHJpbmNpcGFsLmdldE5hbWUoKSArICInIik7CisgICAgICAgICAgICAvLyBBc3NvY2lhdGUgdGhlIHNlc3Npb24gd2l0aCBhbnkgZXhpc3RpbmcgU1NPIHNlc3Npb24gaW4gb3JkZXIKKyAgICAgICAgICAgIC8vIHRvIGdldCBjb29yZGluYXRlZCBzZXNzaW9uIGludmFsaWRhdGlvbiBhdCBsb2dvdXQKKyAgICAgICAgICAgIFN0cmluZyBzc29JZCA9IChTdHJpbmcpIHJlcXVlc3QuZ2V0Tm90ZShDb25zdGFudHMuUkVRX1NTT0lEX05PVEUpOworICAgICAgICAgICAgaWYgKHNzb0lkICE9IG51bGwpCisgICAgICAgICAgICAgICAgYXNzb2NpYXRlKHNzb0lkLCByZXF1ZXN0LmdldFNlc3Npb25JbnRlcm5hbCh0cnVlKSk7CisgICAgICAgICAgICByZXR1cm4gKHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gTk9URTogV2UgZG9uJ3QgdHJ5IHRvIHJlYXV0aGVudGljYXRlIHVzaW5nIGFueSBleGlzdGluZyBTU08gc2Vzc2lvbiwKKyAgICAgICAgLy8gYmVjYXVzZSB0aGF0IHdpbGwgb25seSB3b3JrIGlmIHRoZSBvcmlnaW5hbCBhdXRoZW50aWNhdGlvbiB3YXMKKyAgICAgICAgLy8gQkFTSUMgb3IgRk9STSwgd2hpY2ggYXJlIGxlc3Mgc2VjdXJlIHRoYW4gdGhlIERJR0VTVCBhdXRoLXR5cGUKKyAgICAgICAgLy8gc3BlY2lmaWVkIGZvciB0aGlzIHdlYmFwcAorICAgICAgICAvLworICAgICAgICAvLyBVbmNvbW1lbnQgYmVsb3cgdG8gYWxsb3cgcHJldmlvdXMgRk9STSBvciBCQVNJQyBhdXRoZW50aWNhdGlvbnMKKyAgICAgICAgLy8gdG8gYXV0aGVudGljYXRlIHVzZXJzIGZvciB0aGlzIHdlYmFwcAorICAgICAgICAvLyBUT0RPIG1ha2UgdGhpcyBhIGNvbmZpZ3VyYWJsZSBhdHRyaWJ1dGUgKGluIFNpbmdsZVNpZ25Pbj8/KQorICAgICAgICAvKgorICAgICAgICAvLyBJcyB0aGVyZSBhbiBTU08gc2Vzc2lvbiBhZ2FpbnN0IHdoaWNoIHdlIGNhbiB0cnkgdG8gcmVhdXRoZW50aWNhdGU/CisgICAgICAgIGlmIChzc29JZCAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJTU08gSWQgIiArIHNzb0lkICsgIiBzZXQ7IGF0dGVtcHRpbmcgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWF1dGhlbnRpY2F0aW9uIik7CisgICAgICAgICAgICAvLyBUcnkgdG8gcmVhdXRoZW50aWNhdGUgdXNpbmcgZGF0YSBjYWNoZWQgYnkgU1NPLiAgSWYgdGhpcyBmYWlscywKKyAgICAgICAgICAgIC8vIGVpdGhlciB0aGUgb3JpZ2luYWwgU1NPIGxvZ29uIHdhcyBvZiBESUdFU1Qgb3IgU1NMICh3aGljaAorICAgICAgICAgICAgLy8gd2UgY2FuJ3QgcmVhdXRoZW50aWNhdGUgb3Vyc2VsdmVzIGJlY2F1c2UgdGhlcmUgaXMgbm8KKyAgICAgICAgICAgIC8vIGNhY2hlZCB1c2VybmFtZSBhbmQgcGFzc3dvcmQpLCBvciB0aGUgcmVhbG0gZGVuaWVkCisgICAgICAgICAgICAvLyB0aGUgdXNlcidzIHJlYXV0aGVudGljYXRpb24gZm9yIHNvbWUgcmVhc29uLgorICAgICAgICAgICAgLy8gSW4gZWl0aGVyIGNhc2Ugd2UgaGF2ZSB0byBwcm9tcHQgdGhlIHVzZXIgZm9yIGEgbG9nb24KKyAgICAgICAgICAgIGlmIChyZWF1dGhlbnRpY2F0ZUZyb21TU08oc3NvSWQsIHJlcXVlc3QpKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgICovCisKKyAgICAgICAgLy8gVmFsaWRhdGUgYW55IGNyZWRlbnRpYWxzIGFscmVhZHkgaW5jbHVkZWQgd2l0aCB0aGlzIHJlcXVlc3QKKyAgICAgICAgU3RyaW5nIGF1dGhvcml6YXRpb24gPSByZXF1ZXN0LmdldEhlYWRlcigiYXV0aG9yaXphdGlvbiIpOworICAgICAgICBpZiAoYXV0aG9yaXphdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBwcmluY2lwYWwgPSBmaW5kUHJpbmNpcGFsKHJlcXVlc3QsIGF1dGhvcml6YXRpb24sIGNvbnRleHQuZ2V0UmVhbG0oKSk7CisgICAgICAgICAgICBpZiAocHJpbmNpcGFsICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdXNlcm5hbWUgPSBwYXJzZVVzZXJuYW1lKGF1dGhvcml6YXRpb24pOworICAgICAgICAgICAgICAgIHJlZ2lzdGVyKHJlcXVlc3QsIHJlc3BvbnNlLCBwcmluY2lwYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLkRJR0VTVF9NRVRIT0QsCisgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcm5hbWUsIG51bGwpOworICAgICAgICAgICAgICAgIHJldHVybiAodHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBTZW5kIGFuICJ1bmF1dGhvcml6ZWQiIHJlc3BvbnNlIGFuZCBhbiBhcHByb3ByaWF0ZSBjaGFsbGVuZ2UKKworICAgICAgICAvLyBOZXh0LCBnZW5lcmF0ZSBhIG5PbmNlIHRva2VuICh0aGF0IGlzIGEgdG9rZW4gd2hpY2ggaXMgc3VwcG9zZWQKKyAgICAgICAgLy8gdG8gYmUgdW5pcXVlKS4KKyAgICAgICAgU3RyaW5nIG5PbmNlID0gZ2VuZXJhdGVOT25jZShyZXF1ZXN0KTsKKworICAgICAgICBzZXRBdXRoZW50aWNhdGVIZWFkZXIocmVxdWVzdCwgcmVzcG9uc2UsIGNvbmZpZywgbk9uY2UpOworICAgICAgICByZXNwb25zZS5zZXRTdGF0dXMoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19VTkFVVEhPUklaRUQpOworICAgICAgICAvLyAgICAgIGhyZXMuZmx1c2hCdWZmZXIoKTsKKyAgICAgICAgcmV0dXJuIChmYWxzZSk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm90ZWN0ZWQgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBQYXJzZSB0aGUgc3BlY2lmaWVkIGF1dGhvcml6YXRpb24gY3JlZGVudGlhbHMsIGFuZCByZXR1cm4gdGhlCisgICAgICogYXNzb2NpYXRlZCBQcmluY2lwYWwgdGhhdCB0aGVzZSBjcmVkZW50aWFscyBhdXRoZW50aWNhdGUgKGlmIGFueSkKKyAgICAgKiBmcm9tIHRoZSBzcGVjaWZpZWQgUmVhbG0uICBJZiB0aGVyZSBpcyBubyBzdWNoIFByaW5jaXBhbCwgcmV0dXJuCisgICAgICogPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBIVFRQIHNlcnZsZXQgcmVxdWVzdAorICAgICAqIEBwYXJhbSBhdXRob3JpemF0aW9uIEF1dGhvcml6YXRpb24gY3JlZGVudGlhbHMgZnJvbSB0aGlzIHJlcXVlc3QKKyAgICAgKiBAcGFyYW0gcmVhbG0gUmVhbG0gdXNlZCB0byBhdXRoZW50aWNhdGUgUHJpbmNpcGFscworICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgUHJpbmNpcGFsIGZpbmRQcmluY2lwYWwoUmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGF1dGhvcml6YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWFsbSByZWFsbSkgeworCisgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJBdXRob3JpemF0aW9uIHRva2VuIDogIiArIGF1dGhvcml6YXRpb24pOworICAgICAgICAvLyBWYWxpZGF0ZSB0aGUgYXV0aG9yaXphdGlvbiBjcmVkZW50aWFscyBmb3JtYXQKKyAgICAgICAgaWYgKGF1dGhvcml6YXRpb24gPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIGlmICghYXV0aG9yaXphdGlvbi5zdGFydHNXaXRoKCJEaWdlc3QgIikpCisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICBhdXRob3JpemF0aW9uID0gYXV0aG9yaXphdGlvbi5zdWJzdHJpbmcoNykudHJpbSgpOworCisKKyAgICAgICAgU3RyaW5nVG9rZW5pemVyIGNvbW1hVG9rZW5pemVyID0KKyAgICAgICAgICAgIG5ldyBTdHJpbmdUb2tlbml6ZXIoYXV0aG9yaXphdGlvbiwgIiwiKTsKKworICAgICAgICBTdHJpbmcgdXNlck5hbWUgPSBudWxsOworICAgICAgICBTdHJpbmcgcmVhbG1OYW1lID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIG5PbmNlID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIG5jID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIGNub25jZSA9IG51bGw7CisgICAgICAgIFN0cmluZyBxb3AgPSBudWxsOworICAgICAgICBTdHJpbmcgdXJpID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIG1ldGhvZCA9IHJlcXVlc3QuZ2V0TWV0aG9kKCk7CisKKyAgICAgICAgd2hpbGUgKGNvbW1hVG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgeworICAgICAgICAgICAgU3RyaW5nIGN1cnJlbnRUb2tlbiA9IGNvbW1hVG9rZW5pemVyLm5leHRUb2tlbigpOworICAgICAgICAgICAgaW50IGVxdWFsU2lnbiA9IGN1cnJlbnRUb2tlbi5pbmRleE9mKCc9Jyk7CisgICAgICAgICAgICBpZiAoZXF1YWxTaWduIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIFN0cmluZyBjdXJyZW50VG9rZW5OYW1lID0KKyAgICAgICAgICAgICAgICBjdXJyZW50VG9rZW4uc3Vic3RyaW5nKDAsIGVxdWFsU2lnbikudHJpbSgpOworICAgICAgICAgICAgU3RyaW5nIGN1cnJlbnRUb2tlblZhbHVlID0KKyAgICAgICAgICAgICAgICBjdXJyZW50VG9rZW4uc3Vic3RyaW5nKGVxdWFsU2lnbiArIDEpLnRyaW0oKTsKKyAgICAgICAgICAgIGlmICgidXNlcm5hbWUiLmVxdWFscyhjdXJyZW50VG9rZW5OYW1lKSkKKyAgICAgICAgICAgICAgICB1c2VyTmFtZSA9IHJlbW92ZVF1b3RlcyhjdXJyZW50VG9rZW5WYWx1ZSk7CisgICAgICAgICAgICBpZiAoInJlYWxtIi5lcXVhbHMoY3VycmVudFRva2VuTmFtZSkpCisgICAgICAgICAgICAgICAgcmVhbG1OYW1lID0gcmVtb3ZlUXVvdGVzKGN1cnJlbnRUb2tlblZhbHVlLCB0cnVlKTsKKyAgICAgICAgICAgIGlmICgibm9uY2UiLmVxdWFscyhjdXJyZW50VG9rZW5OYW1lKSkKKyAgICAgICAgICAgICAgICBuT25jZSA9IHJlbW92ZVF1b3RlcyhjdXJyZW50VG9rZW5WYWx1ZSk7CisgICAgICAgICAgICBpZiAoIm5jIi5lcXVhbHMoY3VycmVudFRva2VuTmFtZSkpCisgICAgICAgICAgICAgICAgbmMgPSByZW1vdmVRdW90ZXMoY3VycmVudFRva2VuVmFsdWUpOworICAgICAgICAgICAgaWYgKCJjbm9uY2UiLmVxdWFscyhjdXJyZW50VG9rZW5OYW1lKSkKKyAgICAgICAgICAgICAgICBjbm9uY2UgPSByZW1vdmVRdW90ZXMoY3VycmVudFRva2VuVmFsdWUpOworICAgICAgICAgICAgaWYgKCJxb3AiLmVxdWFscyhjdXJyZW50VG9rZW5OYW1lKSkKKyAgICAgICAgICAgICAgICBxb3AgPSByZW1vdmVRdW90ZXMoY3VycmVudFRva2VuVmFsdWUpOworICAgICAgICAgICAgaWYgKCJ1cmkiLmVxdWFscyhjdXJyZW50VG9rZW5OYW1lKSkKKyAgICAgICAgICAgICAgICB1cmkgPSByZW1vdmVRdW90ZXMoY3VycmVudFRva2VuVmFsdWUpOworICAgICAgICAgICAgaWYgKCJyZXNwb25zZSIuZXF1YWxzKGN1cnJlbnRUb2tlbk5hbWUpKQorICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gcmVtb3ZlUXVvdGVzKGN1cnJlbnRUb2tlblZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggKHVzZXJOYW1lID09IG51bGwpIHx8IChyZWFsbU5hbWUgPT0gbnVsbCkgfHwgKG5PbmNlID09IG51bGwpCisgICAgICAgICAgICAgfHwgKHVyaSA9PSBudWxsKSB8fCAocmVzcG9uc2UgPT0gbnVsbCkgKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgLy8gU2Vjb25kIE1ENSBkaWdlc3QgdXNlZCB0byBjYWxjdWxhdGUgdGhlIGRpZ2VzdCA6CisgICAgICAgIC8vIE1ENShNZXRob2QgKyAiOiIgKyB1cmkpCisgICAgICAgIFN0cmluZyBhMiA9IG1ldGhvZCArICI6IiArIHVyaTsKKyAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIkEyOiIgKyBhMik7CisKKyAgICAgICAgU3RyaW5nIG1kNWEyID0gbWQ1RW5jb2Rlci5lbmNvZGUobWQ1SGVscGVyLmRpZ2VzdChhMi5nZXRCeXRlcygpKSk7CisKKyAgICAgICAgcmV0dXJuIChyZWFsbS5hdXRoZW50aWNhdGUodXNlck5hbWUsIHJlc3BvbnNlLCBuT25jZSwgbmMsIGNub25jZSwgcW9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFsbU5hbWUsIG1kNWEyKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFBhcnNlIHRoZSB1c2VybmFtZSBmcm9tIHRoZSBzcGVjaWZpZWQgYXV0aG9yaXphdGlvbiBzdHJpbmcuICBJZiBub25lCisgICAgICogY2FuIGJlIGlkZW50aWZpZWQsIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPgorICAgICAqCisgICAgICogQHBhcmFtIGF1dGhvcml6YXRpb24gQXV0aG9yaXphdGlvbiBzdHJpbmcgdG8gYmUgcGFyc2VkCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBwYXJzZVVzZXJuYW1lKFN0cmluZyBhdXRob3JpemF0aW9uKSB7CisKKyAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIkF1dGhvcml6YXRpb24gdG9rZW4gOiAiICsgYXV0aG9yaXphdGlvbik7CisgICAgICAgIC8vIFZhbGlkYXRlIHRoZSBhdXRob3JpemF0aW9uIGNyZWRlbnRpYWxzIGZvcm1hdAorICAgICAgICBpZiAoYXV0aG9yaXphdGlvbiA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgaWYgKCFhdXRob3JpemF0aW9uLnN0YXJ0c1dpdGgoIkRpZ2VzdCAiKSkKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIGF1dGhvcml6YXRpb24gPSBhdXRob3JpemF0aW9uLnN1YnN0cmluZyg3KS50cmltKCk7CisKKyAgICAgICAgU3RyaW5nVG9rZW5pemVyIGNvbW1hVG9rZW5pemVyID0KKyAgICAgICAgICAgIG5ldyBTdHJpbmdUb2tlbml6ZXIoYXV0aG9yaXphdGlvbiwgIiwiKTsKKworICAgICAgICB3aGlsZSAoY29tbWFUb2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7CisgICAgICAgICAgICBTdHJpbmcgY3VycmVudFRva2VuID0gY29tbWFUb2tlbml6ZXIubmV4dFRva2VuKCk7CisgICAgICAgICAgICBpbnQgZXF1YWxTaWduID0gY3VycmVudFRva2VuLmluZGV4T2YoJz0nKTsKKyAgICAgICAgICAgIGlmIChlcXVhbFNpZ24gPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgU3RyaW5nIGN1cnJlbnRUb2tlbk5hbWUgPQorICAgICAgICAgICAgICAgIGN1cnJlbnRUb2tlbi5zdWJzdHJpbmcoMCwgZXF1YWxTaWduKS50cmltKCk7CisgICAgICAgICAgICBTdHJpbmcgY3VycmVudFRva2VuVmFsdWUgPQorICAgICAgICAgICAgICAgIGN1cnJlbnRUb2tlbi5zdWJzdHJpbmcoZXF1YWxTaWduICsgMSkudHJpbSgpOworICAgICAgICAgICAgaWYgKCJ1c2VybmFtZSIuZXF1YWxzKGN1cnJlbnRUb2tlbk5hbWUpKQorICAgICAgICAgICAgICAgIHJldHVybiAocmVtb3ZlUXVvdGVzKGN1cnJlbnRUb2tlblZhbHVlKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKG51bGwpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIHRoZSBxdW90ZXMgb24gYSBzdHJpbmcuIFJGQzI2MTcgc3RhdGVzIHF1b3RlcyBhcmUgb3B0aW9uYWwgZm9yCisgICAgICogYWxsIHBhcmFtZXRlcnMgZXhjZXB0IHJlYWxtLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIHJlbW92ZVF1b3RlcyhTdHJpbmcgcXVvdGVkU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHF1b3Rlc1JlcXVpcmVkKSB7CisgICAgICAgIC8vc3VwcG9ydCBib3RoIHF1b3RlZCBhbmQgbm9uLXF1b3RlZAorICAgICAgICBpZiAocXVvdGVkU3RyaW5nLmxlbmd0aCgpID4gMCAmJiBxdW90ZWRTdHJpbmcuY2hhckF0KDApICE9ICciJyAmJgorICAgICAgICAgICAgICAgICFxdW90ZXNSZXF1aXJlZCkgeworICAgICAgICAgICAgcmV0dXJuIHF1b3RlZFN0cmluZzsKKyAgICAgICAgfSBlbHNlIGlmIChxdW90ZWRTdHJpbmcubGVuZ3RoKCkgPiAyKSB7CisgICAgICAgICAgICByZXR1cm4gcXVvdGVkU3RyaW5nLnN1YnN0cmluZygxLCBxdW90ZWRTdHJpbmcubGVuZ3RoKCkgLSAxKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIHRoZSBxdW90ZXMgb24gYSBzdHJpbmcuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgcmVtb3ZlUXVvdGVzKFN0cmluZyBxdW90ZWRTdHJpbmcpIHsKKyAgICAgICAgcmV0dXJuIHJlbW92ZVF1b3RlcyhxdW90ZWRTdHJpbmcsIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZSBhIHVuaXF1ZSB0b2tlbi4gVGhlIHRva2VuIGlzIGdlbmVyYXRlZCBhY2NvcmRpbmcgdG8gdGhlCisgICAgICogZm9sbG93aW5nIHBhdHRlcm4uIE5PbmNlVG9rZW4gPSBCYXNlNjQgKCBNRDUgKCBjbGllbnQtSVAgIjoiCisgICAgICogdGltZS1zdGFtcCAiOiIgcHJpdmF0ZS1rZXkgKSApLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgSFRUUCBTZXJ2bGV0IHJlcXVlc3QKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdlbmVyYXRlTk9uY2UoUmVxdWVzdCByZXF1ZXN0KSB7CisKKyAgICAgICAgbG9uZyBjdXJyZW50VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCisgICAgICAgIFN0cmluZyBuT25jZVZhbHVlID0gcmVxdWVzdC5nZXRSZW1vdGVBZGRyKCkgKyAiOiIgKworICAgICAgICAgICAgY3VycmVudFRpbWUgKyAiOiIgKyBrZXk7CisKKyAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG1kNUhlbHBlci5kaWdlc3Qobk9uY2VWYWx1ZS5nZXRCeXRlcygpKTsKKyAgICAgICAgbk9uY2VWYWx1ZSA9IG1kNUVuY29kZXIuZW5jb2RlKGJ1ZmZlcik7CisKKyAgICAgICAgLy8gVXBkYXRpbmcgdGhlIHZhbHVlIGluIHRoZSBubyBvbmNlIGhhc2h0YWJsZQorICAgICAgICBuT25jZVRva2Vucy5wdXQobk9uY2VWYWx1ZSwgbmV3IExvbmcoY3VycmVudFRpbWUgKyBuT25jZVRpbWVvdXQpKTsKKworICAgICAgICByZXR1cm4gbk9uY2VWYWx1ZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlcyB0aGUgV1dXLUF1dGhlbnRpY2F0ZSBoZWFkZXIuCisgICAgICogPHA+CisgICAgICogVGhlIGhlYWRlciBNVVNUIGZvbGxvdyB0aGlzIHRlbXBsYXRlIDoKKyAgICAgKiA8cHJlPgorICAgICAqICAgICAgV1dXLUF1dGhlbnRpY2F0ZSAgICA9ICJXV1ctQXV0aGVudGljYXRlIiAiOiIgIkRpZ2VzdCIKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWdlc3QtY2hhbGxlbmdlCisgICAgICoKKyAgICAgKiAgICAgIGRpZ2VzdC1jaGFsbGVuZ2UgICAgPSAxIyggcmVhbG0gfCBbIGRvbWFpbiBdIHwgbk9uY2UgfAorICAgICAqICAgICAgICAgICAgICAgICAgWyBkaWdlc3Qtb3BhcXVlIF0gfFsgc3RhbGUgXSB8IFsgYWxnb3JpdGhtIF0gKQorICAgICAqCisgICAgICogICAgICByZWFsbSAgICAgICAgICAgICAgID0gInJlYWxtIiAiPSIgcmVhbG0tdmFsdWUKKyAgICAgKiAgICAgIHJlYWxtLXZhbHVlICAgICAgICAgPSBxdW90ZWQtc3RyaW5nCisgICAgICogICAgICBkb21haW4gICAgICAgICAgICAgID0gImRvbWFpbiIgIj0iIDwiPiAxI1VSSSA8Ij4KKyAgICAgKiAgICAgIG5vbmNlICAgICAgICAgICAgICAgPSAibm9uY2UiICI9IiBub25jZS12YWx1ZQorICAgICAqICAgICAgbm9uY2UtdmFsdWUgICAgICAgICA9IHF1b3RlZC1zdHJpbmcKKyAgICAgKiAgICAgIG9wYXF1ZSAgICAgICAgICAgICAgPSAib3BhcXVlIiAiPSIgcXVvdGVkLXN0cmluZworICAgICAqICAgICAgc3RhbGUgICAgICAgICAgICAgICA9ICJzdGFsZSIgIj0iICggInRydWUiIHwgImZhbHNlIiApCisgICAgICogICAgICBhbGdvcml0aG0gICAgICAgICAgID0gImFsZ29yaXRobSIgIj0iICggIk1ENSIgfCB0b2tlbiApCisgICAgICogPC9wcmU+CisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBIVFRQIFNlcnZsZXQgcmVxdWVzdAorICAgICAqIEBwYXJhbSByZXNwb25zZSBIVFRQIFNlcnZsZXQgcmVzcG9uc2UKKyAgICAgKiBAcGFyYW0gY29uZmlnICAgIExvZ2luIGNvbmZpZ3VyYXRpb24gZGVzY3JpYmluZyBob3cgYXV0aGVudGljYXRpb24KKyAgICAgKiAgICAgICAgICAgICAgc2hvdWxkIGJlIHBlcmZvcm1lZAorICAgICAqIEBwYXJhbSBuT25jZSBub25jZSB0b2tlbgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldEF1dGhlbnRpY2F0ZUhlYWRlcihSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2dpbkNvbmZpZyBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuT25jZSkgeworCisgICAgICAgIC8vIEdldCB0aGUgcmVhbG0gbmFtZQorICAgICAgICBTdHJpbmcgcmVhbG1OYW1lID0gY29uZmlnLmdldFJlYWxtTmFtZSgpOworICAgICAgICBpZiAocmVhbG1OYW1lID09IG51bGwpCisgICAgICAgICAgICByZWFsbU5hbWUgPSByZXF1ZXN0LmdldFNlcnZlck5hbWUoKSArICI6IgorICAgICAgICAgICAgICAgICsgcmVxdWVzdC5nZXRTZXJ2ZXJQb3J0KCk7CisKKyAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG1kNUhlbHBlci5kaWdlc3Qobk9uY2UuZ2V0Qnl0ZXMoKSk7CisKKyAgICAgICAgU3RyaW5nIGF1dGhlbnRpY2F0ZUhlYWRlciA9ICJEaWdlc3QgcmVhbG09XCIiICsgcmVhbG1OYW1lICsgIlwiLCAiCisgICAgICAgICAgICArICAicW9wPVwiYXV0aFwiLCBub25jZT1cIiIgKyBuT25jZSArICJcIiwgIiArICJvcGFxdWU9XCIiCisgICAgICAgICAgICArIG1kNUVuY29kZXIuZW5jb2RlKGJ1ZmZlcikgKyAiXCIiOworICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkF1dGhlbnRpY2F0ZSBoZWFkZXIgdmFsdWUgOiAiCisgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICsgYXV0aGVudGljYXRlSGVhZGVyKTsKKyAgICAgICAgcmVzcG9uc2Uuc2V0SGVhZGVyKCJXV1ctQXV0aGVudGljYXRlIiwgYXV0aGVudGljYXRlSGVhZGVyKTsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYXV0aGVudGljYXRvci9Gb3JtQXV0aGVudGljYXRvci5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2F1dGhlbnRpY2F0b3IvRm9ybUF1dGhlbnRpY2F0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTA4ZGFkCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2F1dGhlbnRpY2F0b3IvRm9ybUF1dGhlbnRpY2F0b3IuamF2YQpAQCAtMCwwICsxLDQzOCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5hdXRoZW50aWNhdG9yOworCisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXguc2VydmxldC5SZXF1ZXN0RGlzcGF0Y2hlcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuQ29va2llOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5SZWFsbTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlNlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuUmVxdWVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3Rvci5SZXNwb25zZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5Mb2dpbkNvbmZpZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvbWNhdC51dGlsLmJ1Zi5DaGFyQ2h1bms7CitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5idWYuTWVzc2FnZUJ5dGVzOworCisKKworLyoqCisgKiBBbiA8Yj5BdXRoZW50aWNhdG9yPC9iPiBhbmQgPGI+VmFsdmU8L2I+IGltcGxlbWVudGF0aW9uIG9mIEZPUk0gQkFTRUQKKyAqIEF1dGhlbnRpY2F0aW9uLCBhcyBkZXNjcmliZWQgaW4gdGhlIFNlcnZsZXQgQVBJIFNwZWNpZmljYXRpb24sIFZlcnNpb24gMi4yLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQGF1dGhvciBSZW15IE1hdWNoZXJhdAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgRm9ybUF1dGhlbnRpY2F0b3IKKyAgICBleHRlbmRzIEF1dGhlbnRpY2F0b3JCYXNlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coRm9ybUF1dGhlbnRpY2F0b3IuY2xhc3MpOworCisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBEZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIGluZm8gPQorICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5hdXRoZW50aWNhdG9yLkZvcm1BdXRoZW50aWNhdG9yLzEuMCI7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBWYWx2ZSBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEluZm8oKSB7CisKKyAgICAgICAgcmV0dXJuIChpbmZvKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIEF1dGhlbnRpY2F0ZSB0aGUgdXNlciBtYWtpbmcgdGhpcyByZXF1ZXN0LCBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkCisgICAgICogbG9naW4gY29uZmlndXJhdGlvbi4gIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhbnkgc3BlY2lmaWVkCisgICAgICogY29uc3RyYWludCBoYXMgYmVlbiBzYXRpc2ZpZWQsIG9yIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB3ZSBoYXZlCisgICAgICogY3JlYXRlZCBhIHJlc3BvbnNlIGNoYWxsZW5nZSBhbHJlYWR5LgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgUmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBSZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKiBAcGFyYW0gY29uZmlnICAgIExvZ2luIGNvbmZpZ3VyYXRpb24gZGVzY3JpYmluZyBob3cgYXV0aGVudGljYXRpb24KKyAgICAgKiAgICAgICAgICAgICAgc2hvdWxkIGJlIHBlcmZvcm1lZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gYXV0aGVudGljYXRlKFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZ2luQ29uZmlnIGNvbmZpZykKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBSZWZlcmVuY2VzIHRvIG9iamVjdHMgd2Ugd2lsbCBuZWVkIGxhdGVyCisgICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IG51bGw7CisKKyAgICAgICAgLy8gSGF2ZSB3ZSBhbHJlYWR5IGF1dGhlbnRpY2F0ZWQgc29tZW9uZT8KKyAgICAgICAgUHJpbmNpcGFsIHByaW5jaXBhbCA9IHJlcXVlc3QuZ2V0VXNlclByaW5jaXBhbCgpOworICAgICAgICBTdHJpbmcgc3NvSWQgPSAoU3RyaW5nKSByZXF1ZXN0LmdldE5vdGUoQ29uc3RhbnRzLlJFUV9TU09JRF9OT1RFKTsKKyAgICAgICAgaWYgKHByaW5jaXBhbCAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJBbHJlYWR5IGF1dGhlbnRpY2F0ZWQgJyIgKworICAgICAgICAgICAgICAgICAgICBwcmluY2lwYWwuZ2V0TmFtZSgpICsgIiciKTsKKyAgICAgICAgICAgIC8vIEFzc29jaWF0ZSB0aGUgc2Vzc2lvbiB3aXRoIGFueSBleGlzdGluZyBTU08gc2Vzc2lvbgorICAgICAgICAgICAgaWYgKHNzb0lkICE9IG51bGwpCisgICAgICAgICAgICAgICAgYXNzb2NpYXRlKHNzb0lkLCByZXF1ZXN0LmdldFNlc3Npb25JbnRlcm5hbCh0cnVlKSk7CisgICAgICAgICAgICByZXR1cm4gKHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gSXMgdGhlcmUgYW4gU1NPIHNlc3Npb24gYWdhaW5zdCB3aGljaCB3ZSBjYW4gdHJ5IHRvIHJlYXV0aGVudGljYXRlPworICAgICAgICBpZiAoc3NvSWQgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiU1NPIElkICIgKyBzc29JZCArICIgc2V0OyBhdHRlbXB0aW5nICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAicmVhdXRoZW50aWNhdGlvbiIpOworICAgICAgICAgICAgLy8gVHJ5IHRvIHJlYXV0aGVudGljYXRlIHVzaW5nIGRhdGEgY2FjaGVkIGJ5IFNTTy4gIElmIHRoaXMgZmFpbHMsCisgICAgICAgICAgICAvLyBlaXRoZXIgdGhlIG9yaWdpbmFsIFNTTyBsb2dvbiB3YXMgb2YgRElHRVNUIG9yIFNTTCAod2hpY2gKKyAgICAgICAgICAgIC8vIHdlIGNhbid0IHJlYXV0aGVudGljYXRlIG91cnNlbHZlcyBiZWNhdXNlIHRoZXJlIGlzIG5vCisgICAgICAgICAgICAvLyBjYWNoZWQgdXNlcm5hbWUgYW5kIHBhc3N3b3JkKSwgb3IgdGhlIHJlYWxtIGRlbmllZAorICAgICAgICAgICAgLy8gdGhlIHVzZXIncyByZWF1dGhlbnRpY2F0aW9uIGZvciBzb21lIHJlYXNvbi4KKyAgICAgICAgICAgIC8vIEluIGVpdGhlciBjYXNlIHdlIGhhdmUgdG8gcHJvbXB0IHRoZSB1c2VyIGZvciBhIGxvZ29uICovCisgICAgICAgICAgICBpZiAocmVhdXRoZW50aWNhdGVGcm9tU1NPKHNzb0lkLCByZXF1ZXN0KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEhhdmUgd2UgYXV0aGVudGljYXRlZCB0aGlzIHVzZXIgYmVmb3JlIGJ1dCBoYXZlIGNhY2hpbmcgZGlzYWJsZWQ/CisgICAgICAgIGlmICghY2FjaGUpIHsKKyAgICAgICAgICAgIHNlc3Npb24gPSByZXF1ZXN0LmdldFNlc3Npb25JbnRlcm5hbCh0cnVlKTsKKyAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkNoZWNraW5nIGZvciByZWF1dGhlbnRpY2F0ZSBpbiBzZXNzaW9uICIgKyBzZXNzaW9uKTsKKyAgICAgICAgICAgIFN0cmluZyB1c2VybmFtZSA9CisgICAgICAgICAgICAgICAgKFN0cmluZykgc2Vzc2lvbi5nZXROb3RlKENvbnN0YW50cy5TRVNTX1VTRVJOQU1FX05PVEUpOworICAgICAgICAgICAgU3RyaW5nIHBhc3N3b3JkID0KKyAgICAgICAgICAgICAgICAoU3RyaW5nKSBzZXNzaW9uLmdldE5vdGUoQ29uc3RhbnRzLlNFU1NfUEFTU1dPUkRfTk9URSk7CisgICAgICAgICAgICBpZiAoKHVzZXJuYW1lICE9IG51bGwpICYmIChwYXNzd29yZCAhPSBudWxsKSkgeworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJSZWF1dGhlbnRpY2F0aW5nIHVzZXJuYW1lICciICsgdXNlcm5hbWUgKyAiJyIpOworICAgICAgICAgICAgICAgIHByaW5jaXBhbCA9CisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0UmVhbG0oKS5hdXRoZW50aWNhdGUodXNlcm5hbWUsIHBhc3N3b3JkKTsKKyAgICAgICAgICAgICAgICBpZiAocHJpbmNpcGFsICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5zZXROb3RlKENvbnN0YW50cy5GT1JNX1BSSU5DSVBBTF9OT1RFLCBwcmluY2lwYWwpOworICAgICAgICAgICAgICAgICAgICBpZiAoIW1hdGNoUmVxdWVzdChyZXF1ZXN0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIocmVxdWVzdCwgcmVzcG9uc2UsIHByaW5jaXBhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5GT1JNX01FVEhPRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJuYW1lLCBwYXNzd29yZCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHRydWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJSZWF1dGhlbnRpY2F0aW9uIGZhaWxlZCwgcHJvY2VlZCBub3JtYWxseSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gSXMgdGhpcyB0aGUgcmUtc3VibWl0IG9mIHRoZSBvcmlnaW5hbCByZXF1ZXN0IFVSSSBhZnRlciBzdWNjZXNzZnVsCisgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uPyAgSWYgc28sIGZvcndhcmQgdGhlICpvcmlnaW5hbCogcmVxdWVzdCBpbnN0ZWFkLgorICAgICAgICBpZiAobWF0Y2hSZXF1ZXN0KHJlcXVlc3QpKSB7CisgICAgICAgICAgICBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uSW50ZXJuYWwodHJ1ZSk7CisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJSZXN0b3JlIHJlcXVlc3QgZnJvbSBzZXNzaW9uICciICsgc2Vzc2lvbi5nZXRJZCgpIAorICAgICAgICAgICAgICAgICAgICAgICAgICArICInIik7CisgICAgICAgICAgICBwcmluY2lwYWwgPSAoUHJpbmNpcGFsKQorICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0Tm90ZShDb25zdGFudHMuRk9STV9QUklOQ0lQQUxfTk9URSk7CisgICAgICAgICAgICByZWdpc3RlcihyZXF1ZXN0LCByZXNwb25zZSwgcHJpbmNpcGFsLCBDb25zdGFudHMuRk9STV9NRVRIT0QsCisgICAgICAgICAgICAgICAgICAgICAoU3RyaW5nKSBzZXNzaW9uLmdldE5vdGUoQ29uc3RhbnRzLlNFU1NfVVNFUk5BTUVfTk9URSksCisgICAgICAgICAgICAgICAgICAgICAoU3RyaW5nKSBzZXNzaW9uLmdldE5vdGUoQ29uc3RhbnRzLlNFU1NfUEFTU1dPUkRfTk9URSkpOworICAgICAgICAgICAgLy8gSWYgd2UncmUgY2FjaGluZyBwcmluY2lwYWxzIHdlIG5vIGxvbmdlciBuZWVkIHRoZSB1c2VybmFtZQorICAgICAgICAgICAgLy8gYW5kIHBhc3N3b3JkIGluIHRoZSBzZXNzaW9uLCBzbyByZW1vdmUgdGhlbQorICAgICAgICAgICAgaWYgKGNhY2hlKSB7CisgICAgICAgICAgICAgICAgc2Vzc2lvbi5yZW1vdmVOb3RlKENvbnN0YW50cy5TRVNTX1VTRVJOQU1FX05PVEUpOworICAgICAgICAgICAgICAgIHNlc3Npb24ucmVtb3ZlTm90ZShDb25zdGFudHMuU0VTU19QQVNTV09SRF9OT1RFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChyZXN0b3JlUmVxdWVzdChyZXF1ZXN0LCBzZXNzaW9uKSkgeworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJQcm9jZWVkIHRvIHJlc3RvcmVkIHJlcXVlc3QiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKHRydWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiUmVzdG9yZSBvZiBvcmlnaW5hbCByZXF1ZXN0IGZhaWxlZCIpOworICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcihIdHRwU2VydmxldFJlc3BvbnNlLlNDX0JBRF9SRVFVRVNUKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEFjcXVpcmUgcmVmZXJlbmNlcyB0byBvYmplY3RzIHdlIHdpbGwgbmVlZCB0byBldmFsdWF0ZQorICAgICAgICBNZXNzYWdlQnl0ZXMgdXJpTUIgPSBNZXNzYWdlQnl0ZXMubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgQ2hhckNodW5rIHVyaUNDID0gdXJpTUIuZ2V0Q2hhckNodW5rKCk7CisgICAgICAgIHVyaUNDLnNldExpbWl0KC0xKTsKKyAgICAgICAgU3RyaW5nIGNvbnRleHRQYXRoID0gcmVxdWVzdC5nZXRDb250ZXh0UGF0aCgpOworICAgICAgICBTdHJpbmcgcmVxdWVzdFVSSSA9IHJlcXVlc3QuZ2V0RGVjb2RlZFJlcXVlc3RVUkkoKTsKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGV4dChyZXF1ZXN0LmdldENvbnRleHQoKSk7CisKKyAgICAgICAgLy8gSXMgdGhpcyB0aGUgYWN0aW9uIHJlcXVlc3QgZnJvbSB0aGUgbG9naW4gcGFnZT8KKyAgICAgICAgYm9vbGVhbiBsb2dpbkFjdGlvbiA9CisgICAgICAgICAgICByZXF1ZXN0VVJJLnN0YXJ0c1dpdGgoY29udGV4dFBhdGgpICYmCisgICAgICAgICAgICByZXF1ZXN0VVJJLmVuZHNXaXRoKENvbnN0YW50cy5GT1JNX0FDVElPTik7CisKKyAgICAgICAgLy8gTm8gLS0gU2F2ZSB0aGlzIHJlcXVlc3QgYW5kIHJlZGlyZWN0IHRvIHRoZSBmb3JtIGxvZ2luIHBhZ2UKKyAgICAgICAgaWYgKCFsb2dpbkFjdGlvbikgeworICAgICAgICAgICAgc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbkludGVybmFsKHRydWUpOworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiU2F2ZSByZXF1ZXN0IGluIHNlc3Npb24gJyIgKyBzZXNzaW9uLmdldElkKCkgKyAiJyIpOworICAgICAgICAgICAgc2F2ZVJlcXVlc3QocmVxdWVzdCwgc2Vzc2lvbik7CisgICAgICAgICAgICBSZXF1ZXN0RGlzcGF0Y2hlciBkaXNwID0KKyAgICAgICAgICAgICAgICBjb250ZXh0LmdldFNlcnZsZXRDb250ZXh0KCkuZ2V0UmVxdWVzdERpc3BhdGNoZXIKKyAgICAgICAgICAgICAgICAoY29uZmlnLmdldExvZ2luUGFnZSgpKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZGlzcC5mb3J3YXJkKHJlcXVlc3QuZ2V0UmVxdWVzdCgpLCByZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKyAgICAgICAgICAgICAgICByZXNwb25zZS5maW5pc2hSZXNwb25zZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICBsb2cud2FybigiVW5leHBlY3RlZCBlcnJvciBmb3J3YXJkaW5nIHRvIGxvZ2luIHBhZ2UiLCB0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAoZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgLy8gWWVzIC0tIFZhbGlkYXRlIHRoZSBzcGVjaWZpZWQgY3JlZGVudGlhbHMgYW5kIHJlZGlyZWN0CisgICAgICAgIC8vIHRvIHRoZSBlcnJvciBwYWdlIGlmIHRoZXkgYXJlIG5vdCBjb3JyZWN0CisgICAgICAgIFJlYWxtIHJlYWxtID0gY29udGV4dC5nZXRSZWFsbSgpOworICAgICAgICBTdHJpbmcgdXNlcm5hbWUgPSByZXF1ZXN0LmdldFBhcmFtZXRlcihDb25zdGFudHMuRk9STV9VU0VSTkFNRSk7CisgICAgICAgIFN0cmluZyBwYXNzd29yZCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKENvbnN0YW50cy5GT1JNX1BBU1NXT1JEKTsKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmRlYnVnKCJBdXRoZW50aWNhdGluZyB1c2VybmFtZSAnIiArIHVzZXJuYW1lICsgIiciKTsKKyAgICAgICAgcHJpbmNpcGFsID0gcmVhbG0uYXV0aGVudGljYXRlKHVzZXJuYW1lLCBwYXNzd29yZCk7CisgICAgICAgIGlmIChwcmluY2lwYWwgPT0gbnVsbCkgeworICAgICAgICAgICAgUmVxdWVzdERpc3BhdGNoZXIgZGlzcCA9CisgICAgICAgICAgICAgICAgY29udGV4dC5nZXRTZXJ2bGV0Q29udGV4dCgpLmdldFJlcXVlc3REaXNwYXRjaGVyCisgICAgICAgICAgICAgICAgKGNvbmZpZy5nZXRFcnJvclBhZ2UoKSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGRpc3AuZm9yd2FyZChyZXF1ZXN0LmdldFJlcXVlc3QoKSwgcmVzcG9uc2UuZ2V0UmVzcG9uc2UoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgIGxvZy53YXJuKCJVbmV4cGVjdGVkIGVycm9yIGZvcndhcmRpbmcgdG8gZXJyb3IgcGFnZSIsIHQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIChmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoIkF1dGhlbnRpY2F0aW9uIG9mICciICsgdXNlcm5hbWUgKyAiJyB3YXMgc3VjY2Vzc2Z1bCIpOworCisgICAgICAgIGlmIChzZXNzaW9uID09IG51bGwpCisgICAgICAgICAgICBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uSW50ZXJuYWwoZmFsc2UpOworICAgICAgICBpZiAoc2Vzc2lvbiA9PSBudWxsKSB7CisgICAgICAgICAgICBpZiAoY29udGFpbmVyLmdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgY29udGFpbmVyLmdldExvZ2dlcigpLmRlYnVnKCJVc2VyIHRvb2sgc28gbG9uZyB0byBsb2cgb24gdGhlIHNlc3Npb24gZXhwaXJlZCIpOworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfUkVRVUVTVF9USU1FT1VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtLmdldFN0cmluZygiYXV0aGVudGljYXRvci5zZXNzaW9uRXhwaXJlZCIpKTsKKyAgICAgICAgICAgIHJldHVybiAoZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgLy8gU2F2ZSB0aGUgYXV0aGVudGljYXRlZCBQcmluY2lwYWwgaW4gb3VyIHNlc3Npb24KKyAgICAgICAgc2Vzc2lvbi5zZXROb3RlKENvbnN0YW50cy5GT1JNX1BSSU5DSVBBTF9OT1RFLCBwcmluY2lwYWwpOworCisgICAgICAgIC8vIFNhdmUgdGhlIHVzZXJuYW1lIGFuZCBwYXNzd29yZCBhcyB3ZWxsCisgICAgICAgIHNlc3Npb24uc2V0Tm90ZShDb25zdGFudHMuU0VTU19VU0VSTkFNRV9OT1RFLCB1c2VybmFtZSk7CisgICAgICAgIHNlc3Npb24uc2V0Tm90ZShDb25zdGFudHMuU0VTU19QQVNTV09SRF9OT1RFLCBwYXNzd29yZCk7CisKKyAgICAgICAgLy8gUmVkaXJlY3QgdGhlIHVzZXIgdG8gdGhlIG9yaWdpbmFsIHJlcXVlc3QgVVJJICh3aGljaCB3aWxsIGNhdXNlCisgICAgICAgIC8vIHRoZSBvcmlnaW5hbCByZXF1ZXN0IHRvIGJlIHJlc3RvcmVkKQorICAgICAgICByZXF1ZXN0VVJJID0gc2F2ZWRSZXF1ZXN0VVJMKHNlc3Npb24pOworICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoIlJlZGlyZWN0aW5nIHRvIG9yaWdpbmFsICciICsgcmVxdWVzdFVSSSArICInIik7CisgICAgICAgIGlmIChyZXF1ZXN0VVJJID09IG51bGwpCisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19CQURfUkVRVUVTVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbS5nZXRTdHJpbmcoImF1dGhlbnRpY2F0b3IuZm9ybWxvZ2luIikpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXNwb25zZS5zZW5kUmVkaXJlY3QocmVzcG9uc2UuZW5jb2RlUmVkaXJlY3RVUkwocmVxdWVzdFVSSSkpOworICAgICAgICByZXR1cm4gKGZhbHNlKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3RlY3RlZCBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIERvZXMgdGhpcyByZXF1ZXN0IG1hdGNoIHRoZSBzYXZlZCBvbmUgKHNvIHRoYXQgaXQgbXVzdCBiZSB0aGUgcmVkaXJlY3QKKyAgICAgKiB3ZSBzaWduYWxsZWQgYWZ0ZXIgc3VjY2Vzc2Z1bCBhdXRoZW50aWNhdGlvbj8KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSByZXF1ZXN0IHRvIGJlIHZlcmlmaWVkCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gbWF0Y2hSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgeworCisgICAgICAvLyBIYXMgYSBzZXNzaW9uIGJlZW4gY3JlYXRlZD8KKyAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbkludGVybmFsKGZhbHNlKTsKKyAgICAgIGlmIChzZXNzaW9uID09IG51bGwpCisgICAgICAgICAgcmV0dXJuIChmYWxzZSk7CisKKyAgICAgIC8vIElzIHRoZXJlIGEgc2F2ZWQgcmVxdWVzdD8KKyAgICAgIFNhdmVkUmVxdWVzdCBzcmVxID0gKFNhdmVkUmVxdWVzdCkKKyAgICAgICAgICBzZXNzaW9uLmdldE5vdGUoQ29uc3RhbnRzLkZPUk1fUkVRVUVTVF9OT1RFKTsKKyAgICAgIGlmIChzcmVxID09IG51bGwpCisgICAgICAgICAgcmV0dXJuIChmYWxzZSk7CisKKyAgICAgIC8vIElzIHRoZXJlIGEgc2F2ZWQgcHJpbmNpcGFsPworICAgICAgaWYgKHNlc3Npb24uZ2V0Tm90ZShDb25zdGFudHMuRk9STV9QUklOQ0lQQUxfTk9URSkgPT0gbnVsbCkKKyAgICAgICAgICByZXR1cm4gKGZhbHNlKTsKKworICAgICAgLy8gRG9lcyB0aGUgcmVxdWVzdCBVUkkgbWF0Y2g/CisgICAgICBTdHJpbmcgcmVxdWVzdFVSSSA9IHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpOworICAgICAgaWYgKHJlcXVlc3RVUkkgPT0gbnVsbCkKKyAgICAgICAgICByZXR1cm4gKGZhbHNlKTsKKyAgICAgIHJldHVybiAocmVxdWVzdFVSSS5lcXVhbHMocmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCkpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVzdG9yZSB0aGUgb3JpZ2luYWwgcmVxdWVzdCBmcm9tIGluZm9ybWF0aW9uIHN0b3JlZCBpbiBvdXIgc2Vzc2lvbi4KKyAgICAgKiBJZiB0aGUgb3JpZ2luYWwgcmVxdWVzdCBpcyBubyBsb25nZXIgcHJlc2VudCAoYmVjYXVzZSB0aGUgc2Vzc2lvbgorICAgICAqIHRpbWVkIG91dCksIHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT47IG90aGVyd2lzZSwgcmV0dXJuCisgICAgICogPGNvZGU+dHJ1ZTwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgcmVxdWVzdCB0byBiZSByZXN0b3JlZAorICAgICAqIEBwYXJhbSBzZXNzaW9uIFRoZSBzZXNzaW9uIGNvbnRhaW5pbmcgdGhlIHNhdmVkIGluZm9ybWF0aW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gcmVzdG9yZVJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0LCBTZXNzaW9uIHNlc3Npb24pIHsKKworICAgICAgICAvLyBSZXRyaWV2ZSBhbmQgcmVtb3ZlIHRoZSBTYXZlZFJlcXVlc3Qgb2JqZWN0IGZyb20gb3VyIHNlc3Npb24KKyAgICAgICAgU2F2ZWRSZXF1ZXN0IHNhdmVkID0gKFNhdmVkUmVxdWVzdCkKKyAgICAgICAgICAgIHNlc3Npb24uZ2V0Tm90ZShDb25zdGFudHMuRk9STV9SRVFVRVNUX05PVEUpOworICAgICAgICBzZXNzaW9uLnJlbW92ZU5vdGUoQ29uc3RhbnRzLkZPUk1fUkVRVUVTVF9OT1RFKTsKKyAgICAgICAgc2Vzc2lvbi5yZW1vdmVOb3RlKENvbnN0YW50cy5GT1JNX1BSSU5DSVBBTF9OT1RFKTsKKyAgICAgICAgaWYgKHNhdmVkID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKGZhbHNlKTsKKworICAgICAgICAvLyBNb2RpZnkgb3VyIGN1cnJlbnQgcmVxdWVzdCB0byByZWZsZWN0IHRoZSBvcmlnaW5hbCBvbmUKKyAgICAgICAgcmVxdWVzdC5jbGVhckNvb2tpZXMoKTsKKyAgICAgICAgSXRlcmF0b3IgY29va2llcyA9IHNhdmVkLmdldENvb2tpZXMoKTsKKyAgICAgICAgd2hpbGUgKGNvb2tpZXMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICByZXF1ZXN0LmFkZENvb2tpZSgoQ29va2llKSBjb29raWVzLm5leHQoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmVxdWVzdC5jbGVhckhlYWRlcnMoKTsKKyAgICAgICAgSXRlcmF0b3IgbmFtZXMgPSBzYXZlZC5nZXRIZWFkZXJOYW1lcygpOworICAgICAgICB3aGlsZSAobmFtZXMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIG5hbWVzLm5leHQoKTsKKyAgICAgICAgICAgIEl0ZXJhdG9yIHZhbHVlcyA9IHNhdmVkLmdldEhlYWRlclZhbHVlcyhuYW1lKTsKKyAgICAgICAgICAgIHdoaWxlICh2YWx1ZXMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgcmVxdWVzdC5hZGRIZWFkZXIobmFtZSwgKFN0cmluZykgdmFsdWVzLm5leHQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmVxdWVzdC5jbGVhckxvY2FsZXMoKTsKKyAgICAgICAgSXRlcmF0b3IgbG9jYWxlcyA9IHNhdmVkLmdldExvY2FsZXMoKTsKKyAgICAgICAgd2hpbGUgKGxvY2FsZXMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICByZXF1ZXN0LmFkZExvY2FsZSgoTG9jYWxlKSBsb2NhbGVzLm5leHQoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmVxdWVzdC5jbGVhclBhcmFtZXRlcnMoKTsKKyAgICAgICAgaWYgKCJQT1NUIi5lcXVhbHNJZ25vcmVDYXNlKHNhdmVkLmdldE1ldGhvZCgpKSkgeworICAgICAgICAgICAgSXRlcmF0b3IgcGFyYW1OYW1lcyA9IHNhdmVkLmdldFBhcmFtZXRlck5hbWVzKCk7CisgICAgICAgICAgICB3aGlsZSAocGFyYW1OYW1lcy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcGFyYW1OYW1lID0gKFN0cmluZykgcGFyYW1OYW1lcy5uZXh0KCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIHBhcmFtVmFsdWVzW10gPQorICAgICAgICAgICAgICAgICAgICBzYXZlZC5nZXRQYXJhbWV0ZXJWYWx1ZXMocGFyYW1OYW1lKTsKKyAgICAgICAgICAgICAgICByZXF1ZXN0LmFkZFBhcmFtZXRlcihwYXJhbU5hbWUsIHBhcmFtVmFsdWVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXF1ZXN0LnNldE1ldGhvZChzYXZlZC5nZXRNZXRob2QoKSk7CisgICAgICAgIHJlcXVlc3Quc2V0UXVlcnlTdHJpbmcoc2F2ZWQuZ2V0UXVlcnlTdHJpbmcoKSk7CisgICAgICAgIHJlcXVlc3Quc2V0UmVxdWVzdFVSSShzYXZlZC5nZXRSZXF1ZXN0VVJJKCkpOworICAgICAgICByZXR1cm4gKHRydWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTYXZlIHRoZSBvcmlnaW5hbCByZXF1ZXN0IGluZm9ybWF0aW9uIGludG8gb3VyIHNlc3Npb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgcmVxdWVzdCB0byBiZSBzYXZlZAorICAgICAqIEBwYXJhbSBzZXNzaW9uIFRoZSBzZXNzaW9uIHRvIGNvbnRhaW4gdGhlIHNhdmVkIGluZm9ybWF0aW9uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNhdmVSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCwgU2Vzc2lvbiBzZXNzaW9uKSB7CisKKyAgICAgICAgLy8gQ3JlYXRlIGFuZCBwb3B1bGF0ZSBhIFNhdmVkUmVxdWVzdCBvYmplY3QgZm9yIHRoaXMgcmVxdWVzdAorICAgICAgICBTYXZlZFJlcXVlc3Qgc2F2ZWQgPSBuZXcgU2F2ZWRSZXF1ZXN0KCk7CisgICAgICAgIENvb2tpZSBjb29raWVzW10gPSByZXF1ZXN0LmdldENvb2tpZXMoKTsKKyAgICAgICAgaWYgKGNvb2tpZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb29raWVzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIHNhdmVkLmFkZENvb2tpZShjb29raWVzW2ldKTsKKyAgICAgICAgfQorICAgICAgICBFbnVtZXJhdGlvbiBuYW1lcyA9IHJlcXVlc3QuZ2V0SGVhZGVyTmFtZXMoKTsKKyAgICAgICAgd2hpbGUgKG5hbWVzLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIG5hbWVzLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICBFbnVtZXJhdGlvbiB2YWx1ZXMgPSByZXF1ZXN0LmdldEhlYWRlcnMobmFtZSk7CisgICAgICAgICAgICB3aGlsZSAodmFsdWVzLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gKFN0cmluZykgdmFsdWVzLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgc2F2ZWQuYWRkSGVhZGVyKG5hbWUsIHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBFbnVtZXJhdGlvbiBsb2NhbGVzID0gcmVxdWVzdC5nZXRMb2NhbGVzKCk7CisgICAgICAgIHdoaWxlIChsb2NhbGVzLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICBMb2NhbGUgbG9jYWxlID0gKExvY2FsZSkgbG9jYWxlcy5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgc2F2ZWQuYWRkTG9jYWxlKGxvY2FsZSk7CisgICAgICAgIH0KKyAgICAgICAgTWFwIHBhcmFtZXRlcnMgPSByZXF1ZXN0LmdldFBhcmFtZXRlck1hcCgpOworICAgICAgICBJdGVyYXRvciBwYXJhbU5hbWVzID0gcGFyYW1ldGVycy5rZXlTZXQoKS5pdGVyYXRvcigpOworICAgICAgICB3aGlsZSAocGFyYW1OYW1lcy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBwYXJhbU5hbWUgPSAoU3RyaW5nKSBwYXJhbU5hbWVzLm5leHQoKTsKKyAgICAgICAgICAgIFN0cmluZyBwYXJhbVZhbHVlc1tdID0gKFN0cmluZ1tdKSBwYXJhbWV0ZXJzLmdldChwYXJhbU5hbWUpOworICAgICAgICAgICAgc2F2ZWQuYWRkUGFyYW1ldGVyKHBhcmFtTmFtZSwgcGFyYW1WYWx1ZXMpOworICAgICAgICB9CisgICAgICAgIHNhdmVkLnNldE1ldGhvZChyZXF1ZXN0LmdldE1ldGhvZCgpKTsKKyAgICAgICAgc2F2ZWQuc2V0UXVlcnlTdHJpbmcocmVxdWVzdC5nZXRRdWVyeVN0cmluZygpKTsKKyAgICAgICAgc2F2ZWQuc2V0UmVxdWVzdFVSSShyZXF1ZXN0LmdldFJlcXVlc3RVUkkoKSk7CisKKyAgICAgICAgLy8gU3Rhc2ggdGhlIFNhdmVkUmVxdWVzdCBpbiBvdXIgc2Vzc2lvbiBmb3IgbGF0ZXIgdXNlCisgICAgICAgIHNlc3Npb24uc2V0Tm90ZShDb25zdGFudHMuRk9STV9SRVFVRVNUX05PVEUsIHNhdmVkKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSByZXF1ZXN0IFVSSSAod2l0aCB0aGUgY29ycmVzcG9uZGluZyBxdWVyeSBzdHJpbmcsIGlmIGFueSkKKyAgICAgKiBmcm9tIHRoZSBzYXZlZCByZXF1ZXN0IHNvIHRoYXQgd2UgY2FuIHJlZGlyZWN0IHRvIGl0LgorICAgICAqCisgICAgICogQHBhcmFtIHNlc3Npb24gT3VyIGN1cnJlbnQgc2Vzc2lvbgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHNhdmVkUmVxdWVzdFVSTChTZXNzaW9uIHNlc3Npb24pIHsKKworICAgICAgICBTYXZlZFJlcXVlc3Qgc2F2ZWQgPQorICAgICAgICAgICAgKFNhdmVkUmVxdWVzdCkgc2Vzc2lvbi5nZXROb3RlKENvbnN0YW50cy5GT1JNX1JFUVVFU1RfTk9URSk7CisgICAgICAgIGlmIChzYXZlZCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihzYXZlZC5nZXRSZXF1ZXN0VVJJKCkpOworICAgICAgICBpZiAoc2F2ZWQuZ2V0UXVlcnlTdHJpbmcoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoJz8nKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChzYXZlZC5nZXRRdWVyeVN0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKHNiLnRvU3RyaW5nKCkpOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hdXRoZW50aWNhdG9yL0xvY2FsU3RyaW5ncy5wcm9wZXJ0aWVzIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2F1dGhlbnRpY2F0b3IvTG9jYWxTdHJpbmdzLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzExZWQ4NwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hdXRoZW50aWNhdG9yL0xvY2FsU3RyaW5ncy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTMgQEAKK2F1dGhlbnRpY2F0b3IuYWxyZWFkeVN0YXJ0ZWQ9U2VjdXJpdHkgSW50ZXJjZXB0b3IgaGFzIGFscmVhZHkgYmVlbiBzdGFydGVkCithdXRoZW50aWNhdG9yLmNlcnRpZmljYXRlcz1ObyBjbGllbnQgY2VydGlmaWNhdGUgY2hhaW4gaW4gdGhpcyByZXF1ZXN0CithdXRoZW50aWNhdG9yLmZvcmJpZGRlbj1BY2Nlc3MgdG8gdGhlIHJlcXVlc3RlZCByZXNvdXJjZSBoYXMgYmVlbiBkZW5pZWQKK2F1dGhlbnRpY2F0b3IuZm9ybWxvZ2luPUludmFsaWQgZGlyZWN0IHJlZmVyZW5jZSB0byBmb3JtIGxvZ2luIHBhZ2UKK2F1dGhlbnRpY2F0b3IuaW52YWxpZD1JbnZhbGlkIGNsaWVudCBjZXJ0aWZpY2F0ZSBjaGFpbiBpbiB0aGlzIHJlcXVlc3QKK2F1dGhlbnRpY2F0b3Iua2V5c3RvcmU9RXhjZXB0aW9uIGxvYWRpbmcga2V5IHN0b3JlCithdXRoZW50aWNhdG9yLm1hbmFnZXI9RXhjZXB0aW9uIGluaXRpYWxpemluZyB0cnVzdCBtYW5hZ2VycworYXV0aGVudGljYXRvci5ub3RBdXRoZW50aWNhdGVkPUNvbmZpZ3VyYXRpb24gZXJyb3I6ICBDYW5ub3QgcGVyZm9ybSBhY2Nlc3MgY29udHJvbCB3aXRob3V0IGFuIGF1dGhlbnRpY2F0ZWQgcHJpbmNpcGFsCithdXRoZW50aWNhdG9yLm5vdENvbnRleHQ9Q29uZmlndXJhdGlvbiBlcnJvcjogIE11c3QgYmUgYXR0YWNoZWQgdG8gYSBDb250ZXh0CithdXRoZW50aWNhdG9yLm5vdFN0YXJ0ZWQ9U2VjdXJpdHkgSW50ZXJjZXB0b3IgaGFzIG5vdCB5ZXQgYmVlbiBzdGFydGVkCithdXRoZW50aWNhdG9yLnNlc3Npb25FeHBpcmVkPVRoZSB0aW1lIGFsbG93ZWQgZm9yIHRoZSBsb2dpbiBwcm9jZXNzIGhhcyBiZWVuIGV4Y2VlZGVkLiBJZiB5b3Ugd2lzaCB0byBjb250aW51ZSB5b3UgbXVzdCBlaXRoZXIgY2xpY2sgYmFjayB0d2ljZSBhbmQgcmUtY2xpY2sgdGhlIGxpbmsgeW91IHJlcXVlc3RlZCBvciBjbG9zZSBhbmQgcmUtb3BlbiB5b3VyIGJyb3dzZXIKK2F1dGhlbnRpY2F0b3IudW5hdXRob3JpemVkPUNhbm5vdCBhdXRoZW50aWNhdGUgd2l0aCB0aGUgcHJvdmlkZWQgY3JlZGVudGlhbHMKK2F1dGhlbnRpY2F0b3IudXNlckRhdGFDb25zdHJhaW50PVRoaXMgcmVxdWVzdCB2aW9sYXRlcyBhIFVzZXIgRGF0YSBjb25zdHJhaW50IGZvciB0aGlzIGFwcGxpY2F0aW9uCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYXV0aGVudGljYXRvci9Mb2NhbFN0cmluZ3NfZXMucHJvcGVydGllcyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hdXRoZW50aWNhdG9yL0xvY2FsU3RyaW5nc19lcy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3ZGE5M2MKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYXV0aGVudGljYXRvci9Mb2NhbFN0cmluZ3NfZXMucHJvcGVydGllcwpAQCAtMCwwICsxLDEyIEBACithdXRoZW50aWNhdG9yLmFscmVhZHlTdGFydGVkPUVsIGludGVyY2VwdG9yIGRlIHNlZ3VyaWRhZCB5YSBoYSBzaWRvIGFycmFuY2FkbworYXV0aGVudGljYXRvci5jZXJ0aWZpY2F0ZXM9Tm8gaGF5IGNhZGVuYSBkZSBjZXJ0aWZpY2Fkb3MgZGVsIGNsaWVudGUgZW4gZXN0YSBwZXRpY2nzbgorYXV0aGVudGljYXRvci5mb3JiaWRkZW49RWwgYWNjZXNvIGFsIHJlY3Vyc28gcGVkaWRvIGhhIHNpZG8gZGVuZWdhZG8KK2F1dGhlbnRpY2F0b3IuZm9ybWxvZ2luPVJlZmVyZW5jaWEgZGlyZWN0YSBhbCBmb3JtdWxhcmlvIGRlIGNvbmV4afNuIChw4WdpbmEgZGUgZm9ybXVsYXJpbyBkZSBsb2dpbikgaW524WxpZGEKK2F1dGhlbnRpY2F0b3IuaW52YWxpZD1ObyBlcyB24WxpZGEgbGEgY2FkZW5hIGRlIGNlcnRpZmljYWRvcyBkZWwgY2xpZW50ZSBlbiBlc3RhIHBldGljafNuCithdXRoZW50aWNhdG9yLmtleXN0b3JlPUV4Y2VwY2nzbiBjYXJnYW5kbyBlbCBhbG1hY+luIGRlIGNsYXZlcworYXV0aGVudGljYXRvci5tYW5hZ2VyPUV4Y2VwY2nzbiBpbmljaWFsaXphbmRvIGFkbWluaXN0cmFkb3JlcyBkZSBjb25maWFuemEKK2F1dGhlbnRpY2F0b3Iubm90QXV0aGVudGljYXRlZD1FcnJvciBkZSBDb25maWd1cmFjafNuOiBObyBzZSBwdWVkZW4gcmVhbGl6YXIgZnVuY2lvbmVzIGRlIGNvbnRyb2wgZGUgYWNjZXNvIHNpbiB1biBwcmluY2lwYWwgYXV0ZW50aWNhZG8KK2F1dGhlbnRpY2F0b3Iubm90Q29udGV4dD1FcnJvciBkZSBDb25maWd1cmFjafNuOiBEZWJlIGRlIGVzdGFyIHVuaWRvIGEgdW4gQ29udGV4dG8KK2F1dGhlbnRpY2F0b3Iubm90U3RhcnRlZD1FbCBJbnRlcmNlcHRvciBkZSBzZWd1cmlkYWQgbm8gc2lkbyBh+m4gaW5pY2lhZG8KK2F1dGhlbnRpY2F0b3IudW5hdXRob3JpemVkPUltcG9zaWJsZSBhdXRlbnRpY2FyIG1lZGlhbnRlIGxhcyBjcmVkZW5jaWFsZXMgc3VtaW5pc3RyYWRhcworYXV0aGVudGljYXRvci51c2VyRGF0YUNvbnN0cmFpbnQ9RXN0YSBwZXRpY2nzbiB2aW9sYSB1bmEgUmVzdHJpY2nzbiBkZSBEYXRvcyBkZSB1c3VhcmlvIHBhcmEgZXN0YSBhcGxpY2FjafNuCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYXV0aGVudGljYXRvci9Mb2NhbFN0cmluZ3NfZnIucHJvcGVydGllcyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hdXRoZW50aWNhdG9yL0xvY2FsU3RyaW5nc19mci5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0ZTVkNmIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYXV0aGVudGljYXRvci9Mb2NhbFN0cmluZ3NfZnIucHJvcGVydGllcwpAQCAtMCwwICsxLDEyIEBACithdXRoZW50aWNhdG9yLmFscmVhZHlTdGFydGVkPUwnJ2ludGVyY2VwdGV1ciBkZSBz6WN1cml06SAoc2VjdXJpdHkgaW50ZXJjZXB0b3IpIGEgZOlq4CDpdOkgZOltYXJy6QorYXV0aGVudGljYXRvci5jZXJ0aWZpY2F0ZXM9QXVjdW5lIGNoYe5uZSBkZSBjZXJ0aWZpY2F0IGNsaWVudCAoY2xpZW50IGNlcnRpZmljYXRlIGNoYWluKSBkYW5zIGNldHRlIHJlcXXqdGUKK2F1dGhlbnRpY2F0b3IuZm9yYmlkZGVuPUwnJ2FjY+hzIOAgbGEgcmVzc291cmNlIGRlbWFuZOllIGEg6XTpIGludGVyZGl0CithdXRoZW50aWNhdG9yLmZvcm1sb2dpbj1S6WbpcmVuY2UgZGlyZWN0ZSDgIGxhIGZvcm0gZGUgY29ubmV4aW9uIChmb3JtIGxvZ2luIHBhZ2UpIGludmFsaWRlCithdXRoZW50aWNhdG9yLmludmFsaWQ9Q2hh7m5lIGRlIGNlcnRpZmljYXQgY2xpZW50IGludmFsaWRlIGRhbnMgY2V0dGUgcmVxdep0ZQorYXV0aGVudGljYXRvci5rZXlzdG9yZT1FeGNlcHRpb24gbG9ycyBkdSBjaGFyZ2VtZW50IGR1IHLpZulyZW50aWVsIGRlIGNsZWZzIChrZXkgc3RvcmUpCithdXRoZW50aWNhdG9yLm1hbmFnZXI9RXhjZXB0aW9uIGxvcnMgZGUgbCcnaW5pdGlhbGlzYXRpb24gZGVzIGdlc3Rpb25uYWlyZXMgZCcnYXV0aGVudGlmaWNhdGlvbiAodHJ1c3QgbWFuYWdlcnMpCithdXRoZW50aWNhdG9yLm5vdEF1dGhlbnRpY2F0ZWQ9RXJyZXVyIGRlIGNvbmZpZ3VyYXRpb246ICBJbXBvc3NpYmxlIGRlIHByb2PpZGVyIOAgdW4gY29udHL0bGUgZCcnYWNj6HMgc2FucyB1biBwcmluY2lwYWwgYXV0aGVudGlmaekgKGF1dGhlbnRpY2F0ZWQgcHJpbmNpcGFsKQorYXV0aGVudGljYXRvci5ub3RDb250ZXh0PUVycmV1ciBkZSBjb25maWd1cmF0aW9uOiAgRG9pdCDqdHJlIGF0dGFjaOkg4CB1biBjb250ZXh0ZQorYXV0aGVudGljYXRvci5ub3RTdGFydGVkPUwnJ2ludGVyY2VwdGV1ciBkZSBz6WN1cml06SAoc2VjdXJpdHkgaW50ZXJjZXB0b3IpIG4nJ2EgcGFzIGVuY29yZSDpdOkgZOltYXJy6QorYXV0aGVudGljYXRvci51bmF1dGhvcml6ZWQ9SW1wb3NzaWJsZSBkJydhdXRoZW50aWZpZXIgYXZlYyBsZXMgY3LpZGl0cyBmb3VybmlzIChwcm92aWRlZCBjcmVkZW50aWFscykKK2F1dGhlbnRpY2F0b3IudXNlckRhdGFDb25zdHJhaW50PUNldHRlIHJlcXXqdGUgdmlvbGUgdW5lIGNvbnRyYWludGUgZG9ubullIHV0aWxpc2F0ZXVyICh1c2VyIGRhdGEgY29uc3RyYWludCkgcG91ciBjZXR0ZSBhcHBsaWNhdGlvbgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2F1dGhlbnRpY2F0b3IvTG9jYWxTdHJpbmdzX2phLnByb3BlcnRpZXMgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYXV0aGVudGljYXRvci9Mb2NhbFN0cmluZ3NfamEucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDdmZDU4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2F1dGhlbnRpY2F0b3IvTG9jYWxTdHJpbmdzX2phLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxMyBAQAorYXV0aGVudGljYXRvci5hbHJlYWR5U3RhcnRlZD1cdTMwYmJcdTMwYWRcdTMwZTVcdTMwZWFcdTMwYzZcdTMwYTNcdTMwYTRcdTMwZjNcdTMwYmZcdTMwZmNcdTMwYmJcdTMwZDdcdTMwYmZcdTMwNmZcdTY1ZTJcdTMwNmJcdThkNzdcdTUyZDVcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkKK2F1dGhlbnRpY2F0b3IuY2VydGlmaWNhdGVzPVx1MzA1M1x1MzA2ZVx1MzBlYVx1MzBhZlx1MzBhOFx1MzBiOVx1MzBjOFx1MzA2Ylx1MzA2Zlx1MzBhZlx1MzBlOVx1MzBhNFx1MzBhMlx1MzBmM1x1MzBjOFx1OGE4ZFx1OGEzY1x1MzBjMVx1MzBhN1x1MzBmY1x1MzBmM1x1MzA0Y1x1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5MworYXV0aGVudGljYXRvci5mb3JiaWRkZW49XHUzMGVhXHUzMGFmXHUzMGE4XHUzMGI5XHUzMGM4XHUzMDU1XHUzMDhjXHUzMDVmXHUzMGVhXHUzMGJkXHUzMGZjXHUzMGI5XHUzMDc4XHUzMDZlXHUzMGEyXHUzMGFmXHUzMGJiXHUzMGI5XHUzMDRjXHU2MmQyXHU1NDI2XHUzMDU1XHUzMDhjXHUzMDdlXHUzMDU3XHUzMDVmCithdXRoZW50aWNhdG9yLmZvcm1sb2dpbj1cdTMwZDVcdTMwYTlcdTMwZmNcdTMwZTBcdTMwZWRcdTMwYjBcdTMwYTRcdTMwZjNcdTMwZGFcdTMwZmNcdTMwYjhcdTMwNzhcdTMwNmVcdTcxMjFcdTUyYjlcdTMwNmFcdTc2ZjRcdTYzYTVcdTUzYzJcdTcxNjdcdTMwNjdcdTMwNTkKK2F1dGhlbnRpY2F0b3IuaW52YWxpZD1cdTMwNTNcdTMwNmVcdTMwZWFcdTMwYWZcdTMwYThcdTMwYjlcdTMwYzhcdTMwNmJcdTcxMjFcdTUyYjlcdTMwNmFcdTMwYWZcdTMwZTlcdTMwYTRcdTMwYTJcdTMwZjNcdTMwYzhcdThhOGRcdThhM2NcdTMwYzFcdTMwYTdcdTMwZmNcdTMwZjNcdTMwNGNcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNTkKK2F1dGhlbnRpY2F0b3Iua2V5c3RvcmU9XHUzMGFkXHUzMGZjXHUzMGI5XHUzMGM4XHUzMGEyXHUzMDkyXHUzMGVkXHUzMGZjXHUzMGM5XHU0ZTJkXHUzMDZlXHU0ZjhiXHU1OTE2XHUzMDY3XHUzMDU5CithdXRoZW50aWNhdG9yLm1hbmFnZXI9XHUzMGM4XHUzMGU5XHUzMGI5XHUzMGM4XHUzMGRlXHUzMGNkXHUzMGZjXHUzMGI4XHUzMGUzXHUzMDkyXHU1MjFkXHU2NzFmXHU1MzE2XHU0ZTJkXHUzMDZlXHU0ZjhiXHU1OTE2XHUzMDY3XHUzMDU5CithdXRoZW50aWNhdG9yLm5vdEF1dGhlbnRpY2F0ZWQ9XHU4YTJkXHU1YjlhXHUzMGE4XHUzMGU5XHUzMGZjOiBcdThhOGRcdThhM2NcdTMwNTVcdTMwOGNcdTMwNWZcdTRlM2JcdTRmNTNcdTMwNmFcdTMwNTdcdTMwNmJcdTMwYTJcdTMwYWZcdTMwYmJcdTMwYjlcdTUyMzZcdTVmYTFcdTMwOTJcdTViOWZcdTg4NGNcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMKK2F1dGhlbnRpY2F0b3Iubm90Q29udGV4dD1cdThhMmRcdTViOWFcdTMwYThcdTMwZTlcdTMwZmM6IFx1MzBiM1x1MzBmM1x1MzBjNlx1MzBhZFx1MzBiOVx1MzBjOFx1MzA2Ylx1NjMwN1x1NWI5YVx1MzA1N1x1MzA2YVx1MzA1MVx1MzA4Y1x1MzA3MFx1MzA0NFx1MzA1MVx1MzA3ZVx1MzA1Ylx1MzA5MworYXV0aGVudGljYXRvci5ub3RTdGFydGVkPVx1MzBiYlx1MzBhZFx1MzBlNVx1MzBlYVx1MzBjNlx1MzBhM1x1MzBhNFx1MzBmM1x1MzBiZlx1MzBmY1x1MzBiYlx1MzBkN1x1MzBiZlx1MzA2Zlx1MzA3ZVx1MzA2MFx1OGQ3N1x1NTJkNVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5MworYXV0aGVudGljYXRvci5zZXNzaW9uRXhwaXJlZD1cdTMwZWRcdTMwYjBcdTMwYTRcdTMwZjNcdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjlcdTMwNmJcdThhOGRcdTMwODFcdTMwODlcdTMwOGNcdTMwNjZcdTMwNDRcdTMwNWZcdTY2NDJcdTk1OTNcdTMwNGNcdTkwNGVcdTMwNGVcdTMwN2VcdTMwNTdcdTMwNWZcdTMwMDJcdTdkOTlcdTdkOWFcdTMwNTdcdTMwNWZcdTMwNDRcdTMwNmFcdTMwODlcdTMwNzBcdWZmMGNcdTMwZDBcdTMwYzNcdTMwYWZcdTMwZGNcdTMwYmZcdTMwZjNcdTMwOTIyXHU1ZWE2XHU2MmJjXHUzMDU3XHUzMDY2XHUzMDRiXHUzMDg5XHU1MThkXHU1ZWE2XHUzMGVhXHUzMGYzXHUzMGFmXHUzMDkyXHU2MmJjXHUzMDU5XHUzMDRiXHVmZjBjXHUzMGQ2XHUzMGU5XHUzMGE2XHUzMGI2XHUzMDkyXHU3YWNiXHUzMDYxXHU0ZTBhXHUzMDUyXHU3NmY0XHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0CithdXRoZW50aWNhdG9yLnVuYXV0aG9yaXplZD1cdTc1MjhcdTYxMGZcdTMwNTVcdTMwOGNcdTMwNWZcdThhM2NcdTY2MGVcdTY2ZjhcdTMwNjdcdThhOGRcdThhM2NcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMKK2F1dGhlbnRpY2F0b3IudXNlckRhdGFDb25zdHJhaW50PVx1MzA1M1x1MzA2ZVx1MzBlYVx1MzBhZlx1MzBhOFx1MzBiOVx1MzBjOFx1MzA2Zlx1MzAwMVx1MzA1M1x1MzA2ZVx1MzBhMlx1MzBkN1x1MzBlYVx1MzBiMVx1MzBmY1x1MzBiN1x1MzBlN1x1MzBmM1x1MzA2ZVx1MzBlNlx1MzBmY1x1MzBiNlx1MzBjN1x1MzBmY1x1MzBiZlx1MzA2ZVx1NTIzNlx1OTY1MFx1MzA2Ylx1OTA1NVx1NTNjZFx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2F1dGhlbnRpY2F0b3IvTm9uTG9naW5BdXRoZW50aWNhdG9yLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYXV0aGVudGljYXRvci9Ob25Mb2dpbkF1dGhlbnRpY2F0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTQ0MDIzCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2F1dGhlbnRpY2F0b3IvTm9uTG9naW5BdXRoZW50aWNhdG9yLmphdmEKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuYXV0aGVudGljYXRvcjsKKworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLlJlcXVlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuUmVzcG9uc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuTG9naW5Db25maWc7CisKKworCisvKioKKyAqIEFuIDxiPkF1dGhlbnRpY2F0b3I8L2I+IGFuZCA8Yj5WYWx2ZTwvYj4gaW1wbGVtZW50YXRpb24gdGhhdCBjaGVja3MKKyAqIG9ubHkgc2VjdXJpdHkgY29uc3RyYWludHMgbm90IGludm9sdmluZyB1c2VyIGF1dGhlbnRpY2F0aW9uLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgTm9uTG9naW5BdXRoZW50aWNhdG9yCisgICAgZXh0ZW5kcyBBdXRoZW50aWNhdG9yQmFzZSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBEZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBpbmZvID0KKyAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuYXV0aGVudGljYXRvci5Ob25Mb2dpbkF1dGhlbnRpY2F0b3IvMS4wIjsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIFZhbHZlIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5mbygpIHsKKworICAgICAgICByZXR1cm4gKGluZm8pOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogQXV0aGVudGljYXRlIHRoZSB1c2VyIG1ha2luZyB0aGlzIHJlcXVlc3QsIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBsb2dpbiBjb25maWd1cmF0aW9uLiAgUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGFueSBzcGVjaWZpZWQKKyAgICAgKiBjb25zdHJhaW50IGhhcyBiZWVuIHNhdGlzZmllZCwgb3IgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHdlIGhhdmUKKyAgICAgKiBjcmVhdGVkIGEgcmVzcG9uc2UgY2hhbGxlbmdlIGFscmVhZHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBSZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqIEBwYXJhbSBjb25maWcgICAgTG9naW4gY29uZmlndXJhdGlvbiBkZXNjcmliaW5nIGhvdyBhdXRoZW50aWNhdGlvbgorICAgICAqICAgICAgICAgICAgICBzaG91bGQgYmUgcGVyZm9ybWVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBhdXRoZW50aWNhdGUoUmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNwb25zZSByZXNwb25zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9naW5Db25maWcgY29uZmlnKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIC8qICBBc3NvY2lhdGluZyB0aGlzIHJlcXVlc3QncyBzZXNzaW9uIHdpdGggYW4gU1NPIHdvdWxkIGFsbG93CisgICAgICAgICAgICBjb29yZGluYXRlZCBzZXNzaW9uIGludmFsaWRhdGlvbiwgYnV0IHNob3VsZCB0aGUgc2Vzc2lvbiBmb3IKKyAgICAgICAgICAgIGEgd2ViYXBwIHRoYXQgdGhlIHVzZXIgZGlkbid0IGxvZyBpbnRvIGJlIGludmFsaWRhdGVkIHdoZW4KKyAgICAgICAgICAgIGFub3RoZXIgc2Vzc2lvbiBpcyBsb2dnZWQgb3V0PworICAgICAgICBTdHJpbmcgc3NvSWQgPSAoU3RyaW5nKSByZXF1ZXN0LmdldE5vdGUoQ29uc3RhbnRzLlJFUV9TU09JRF9OT1RFKTsKKyAgICAgICAgaWYgKHNzb0lkICE9IG51bGwpCisgICAgICAgICAgICBhc3NvY2lhdGUoc3NvSWQsIGdldFNlc3Npb24ocmVxdWVzdCwgdHJ1ZSkpOworICAgICAgICAqLworICAgICAgICAKKyAgICAgICAgaWYgKGNvbnRhaW5lci5nZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgY29udGFpbmVyLmdldExvZ2dlcigpLmRlYnVnKCJVc2VyIGF1dGhlbnRpY2F0aW9uIGlzIG5vdCByZXF1aXJlZCIpOworICAgICAgICByZXR1cm4gKHRydWUpOworCisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2F1dGhlbnRpY2F0b3IvU1NMQXV0aGVudGljYXRvci5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2F1dGhlbnRpY2F0b3IvU1NMQXV0aGVudGljYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMjI2NGIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYXV0aGVudGljYXRvci9TU0xBdXRoZW50aWNhdG9yLmphdmEKQEAgLTAsMCArMSwxOTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuYXV0aGVudGljYXRvcjsKKworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaW5jaXBhbDsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlOworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNveW90ZS5BY3Rpb25Db2RlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuR2xvYmFsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3Rvci5SZXF1ZXN0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLlJlc3BvbnNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkxvZ2luQ29uZmlnOworCisKKworLyoqCisgKiBBbiA8Yj5BdXRoZW50aWNhdG9yPC9iPiBhbmQgPGI+VmFsdmU8L2I+IGltcGxlbWVudGF0aW9uIG9mIGF1dGhlbnRpY2F0aW9uCisgKiB0aGF0IHV0aWxpemVzIFNTTCBjZXJ0aWZpY2F0ZXMgdG8gaWRlbnRpZnkgY2xpZW50IHVzZXJzLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgU1NMQXV0aGVudGljYXRvcgorICAgIGV4dGVuZHMgQXV0aGVudGljYXRvckJhc2UgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogRGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBpbmZvID0KKyAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuYXV0aGVudGljYXRvci5TU0xBdXRoZW50aWNhdG9yLzEuMCI7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIFZhbHZlIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5mbygpIHsKKworICAgICAgICByZXR1cm4gKGluZm8pOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogQXV0aGVudGljYXRlIHRoZSB1c2VyIGJ5IGNoZWNraW5nIGZvciB0aGUgZXhpc3RlbmNlIG9mIGEgY2VydGlmaWNhdGUKKyAgICAgKiBjaGFpbiwgYW5kIG9wdGlvbmFsbHkgYXNraW5nIGEgdHJ1c3QgbWFuYWdlciB0byB2YWxpZGF0ZSB0aGF0IHdlIHRydXN0CisgICAgICogdGhpcyB1c2VyLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgUmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBSZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKiBAcGFyYW0gY29uZmlnICAgIExvZ2luIGNvbmZpZ3VyYXRpb24gZGVzY3JpYmluZyBob3cgYXV0aGVudGljYXRpb24KKyAgICAgKiAgICAgICAgICAgICAgc2hvdWxkIGJlIHBlcmZvcm1lZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gYXV0aGVudGljYXRlKFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZ2luQ29uZmlnIGNvbmZpZykKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBIYXZlIHdlIGFscmVhZHkgYXV0aGVudGljYXRlZCBzb21lb25lPworICAgICAgICBQcmluY2lwYWwgcHJpbmNpcGFsID0gcmVxdWVzdC5nZXRVc2VyUHJpbmNpcGFsKCk7CisgICAgICAgIC8vU3RyaW5nIHNzb0lkID0gKFN0cmluZykgcmVxdWVzdC5nZXROb3RlKENvbnN0YW50cy5SRVFfU1NPSURfTk9URSk7CisgICAgICAgIGlmIChwcmluY2lwYWwgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGNvbnRhaW5lci5nZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGNvbnRhaW5lci5nZXRMb2dnZXIoKS5kZWJ1ZygiQWxyZWFkeSBhdXRoZW50aWNhdGVkICciICsgcHJpbmNpcGFsLmdldE5hbWUoKSArICInIik7CisgICAgICAgICAgICAvLyBBc3NvY2lhdGUgdGhlIHNlc3Npb24gd2l0aCBhbnkgZXhpc3RpbmcgU1NPIHNlc3Npb24gaW4gb3JkZXIKKyAgICAgICAgICAgIC8vIHRvIGdldCBjb29yZGluYXRlZCBzZXNzaW9uIGludmFsaWRhdGlvbiBhdCBsb2dvdXQKKyAgICAgICAgICAgIFN0cmluZyBzc29JZCA9IChTdHJpbmcpIHJlcXVlc3QuZ2V0Tm90ZShDb25zdGFudHMuUkVRX1NTT0lEX05PVEUpOworICAgICAgICAgICAgaWYgKHNzb0lkICE9IG51bGwpCisgICAgICAgICAgICAgICAgYXNzb2NpYXRlKHNzb0lkLCByZXF1ZXN0LmdldFNlc3Npb25JbnRlcm5hbCh0cnVlKSk7CisgICAgICAgICAgICByZXR1cm4gKHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gTk9URTogV2UgZG9uJ3QgdHJ5IHRvIHJlYXV0aGVudGljYXRlIHVzaW5nIGFueSBleGlzdGluZyBTU08gc2Vzc2lvbiwKKyAgICAgICAgLy8gYmVjYXVzZSB0aGF0IHdpbGwgb25seSB3b3JrIGlmIHRoZSBvcmlnaW5hbCBhdXRoZW50aWNhdGlvbiB3YXMKKyAgICAgICAgLy8gQkFTSUMgb3IgRk9STSwgd2hpY2ggYXJlIGxlc3Mgc2VjdXJlIHRoYW4gdGhlIENMSUVOVC1DRVJUIGF1dGgtdHlwZQorICAgICAgICAvLyBzcGVjaWZpZWQgZm9yIHRoaXMgd2ViYXBwCisgICAgICAgIC8vCisgICAgICAgIC8vIFVuY29tbWVudCBiZWxvdyB0byBhbGxvdyBwcmV2aW91cyBGT1JNIG9yIEJBU0lDIGF1dGhlbnRpY2F0aW9ucworICAgICAgICAvLyB0byBhdXRoZW50aWNhdGUgdXNlcnMgZm9yIHRoaXMgd2ViYXBwCisgICAgICAgIC8vIFRPRE8gbWFrZSB0aGlzIGEgY29uZmlndXJhYmxlIGF0dHJpYnV0ZSAoaW4gU2luZ2xlU2lnbk9uPz8pCisgICAgICAgIC8qCisgICAgICAgIC8vIElzIHRoZXJlIGFuIFNTTyBzZXNzaW9uIGFnYWluc3Qgd2hpY2ggd2UgY2FuIHRyeSB0byByZWF1dGhlbnRpY2F0ZT8KKyAgICAgICAgaWYgKHNzb0lkICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlNTTyBJZCAiICsgc3NvSWQgKyAiIHNldDsgYXR0ZW1wdGluZyAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInJlYXV0aGVudGljYXRpb24iKTsKKyAgICAgICAgICAgIC8vIFRyeSB0byByZWF1dGhlbnRpY2F0ZSB1c2luZyBkYXRhIGNhY2hlZCBieSBTU08uICBJZiB0aGlzIGZhaWxzLAorICAgICAgICAgICAgLy8gZWl0aGVyIHRoZSBvcmlnaW5hbCBTU08gbG9nb24gd2FzIG9mIERJR0VTVCBvciBTU0wgKHdoaWNoCisgICAgICAgICAgICAvLyB3ZSBjYW4ndCByZWF1dGhlbnRpY2F0ZSBvdXJzZWx2ZXMgYmVjYXVzZSB0aGVyZSBpcyBubworICAgICAgICAgICAgLy8gY2FjaGVkIHVzZXJuYW1lIGFuZCBwYXNzd29yZCksIG9yIHRoZSByZWFsbSBkZW5pZWQKKyAgICAgICAgICAgIC8vIHRoZSB1c2VyJ3MgcmVhdXRoZW50aWNhdGlvbiBmb3Igc29tZSByZWFzb24uCisgICAgICAgICAgICAvLyBJbiBlaXRoZXIgY2FzZSB3ZSBoYXZlIHRvIHByb21wdCB0aGUgdXNlciBmb3IgYSBsb2dvbgorICAgICAgICAgICAgaWYgKHJlYXV0aGVudGljYXRlRnJvbVNTTyhzc29JZCwgcmVxdWVzdCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgKi8KKworICAgICAgICAvLyBSZXRyaWV2ZSB0aGUgY2VydGlmaWNhdGUgY2hhaW4gZm9yIHRoaXMgY2xpZW50CisgICAgICAgIGlmIChjb250YWluZXIuZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGNvbnRhaW5lci5nZXRMb2dnZXIoKS5kZWJ1ZygiIExvb2tpbmcgdXAgY2VydGlmaWNhdGVzIik7CisKKyAgICAgICAgWDUwOUNlcnRpZmljYXRlIGNlcnRzW10gPSAoWDUwOUNlcnRpZmljYXRlW10pCisgICAgICAgICAgICByZXF1ZXN0LmdldEF0dHJpYnV0ZShHbG9iYWxzLkNFUlRJRklDQVRFU19BVFRSKTsKKyAgICAgICAgaWYgKChjZXJ0cyA9PSBudWxsKSB8fCAoY2VydHMubGVuZ3RoIDwgMSkpIHsKKyAgICAgICAgICAgIHJlcXVlc3QuZ2V0Q295b3RlUmVxdWVzdCgpLmFjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFjdGlvbkNvZGUuQUNUSU9OX1JFUV9TU0xfQ0VSVElGSUNBVEUsIG51bGwpOworICAgICAgICAgICAgY2VydHMgPSAoWDUwOUNlcnRpZmljYXRlW10pCisgICAgICAgICAgICAgICAgcmVxdWVzdC5nZXRBdHRyaWJ1dGUoR2xvYmFscy5DRVJUSUZJQ0FURVNfQVRUUik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChjZXJ0cyA9PSBudWxsKSB8fCAoY2VydHMubGVuZ3RoIDwgMSkpIHsKKyAgICAgICAgICAgIGlmIChjb250YWluZXIuZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBjb250YWluZXIuZ2V0TG9nZ2VyKCkuZGVidWcoIiAgTm8gY2VydGlmaWNhdGVzIGluY2x1ZGVkIHdpdGggdGhpcyByZXF1ZXN0Iik7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19CQURfUkVRVUVTVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbS5nZXRTdHJpbmcoImF1dGhlbnRpY2F0b3IuY2VydGlmaWNhdGVzIikpOworICAgICAgICAgICAgcmV0dXJuIChmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBBdXRoZW50aWNhdGUgdGhlIHNwZWNpZmllZCBjZXJ0aWZpY2F0ZSBjaGFpbgorICAgICAgICBwcmluY2lwYWwgPSBjb250ZXh0LmdldFJlYWxtKCkuYXV0aGVudGljYXRlKGNlcnRzKTsKKyAgICAgICAgaWYgKHByaW5jaXBhbCA9PSBudWxsKSB7CisgICAgICAgICAgICBpZiAoY29udGFpbmVyLmdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgY29udGFpbmVyLmdldExvZ2dlcigpLmRlYnVnKCIgIFJlYWxtLmF1dGhlbnRpY2F0ZSgpIHJldHVybmVkIGZhbHNlIik7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19VTkFVVEhPUklaRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc20uZ2V0U3RyaW5nKCJhdXRoZW50aWNhdG9yLnVuYXV0aG9yaXplZCIpKTsKKyAgICAgICAgICAgIHJldHVybiAoZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2FjaGUgdGhlIHByaW5jaXBhbCAoaWYgcmVxdWVzdGVkKSBhbmQgcmVjb3JkIHRoaXMgYXV0aGVudGljYXRpb24KKyAgICAgICAgcmVnaXN0ZXIocmVxdWVzdCwgcmVzcG9uc2UsIHByaW5jaXBhbCwgQ29uc3RhbnRzLkNFUlRfTUVUSE9ELAorICAgICAgICAgICAgICAgICBudWxsLCBudWxsKTsKKyAgICAgICAgcmV0dXJuICh0cnVlKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIExpZmVjeWNsZSBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemUgdGhlIGRhdGFiYXNlIHdlIHdpbGwgYmUgdXNpbmcgZm9yIGNsaWVudCB2ZXJpZmljYXRpb24KKyAgICAgKiBhbmQgY2VydGlmaWNhdGUgdmFsaWRhdGlvbiAoaWYgYW55KS4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTGlmZWN5Y2xlRXhjZXB0aW9uIGlmIHRoaXMgY29tcG9uZW50IGRldGVjdHMgYSBmYXRhbCBlcnJvcgorICAgICAqICB0aGF0IHByZXZlbnRzIHRoaXMgY29tcG9uZW50IGZyb20gYmVpbmcgdXNlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgdGhyb3dzIExpZmVjeWNsZUV4Y2VwdGlvbiB7CisKKyAgICAgICAgc3VwZXIuc3RhcnQoKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogRmluYWxpemUgdGhlIGRhdGFiYXNlIHdlIHVzZWQgZm9yIGNsaWVudCB2ZXJpZmljYXRpb24gYW5kCisgICAgICogY2VydGlmaWNhdGUgdmFsaWRhdGlvbiAoaWYgYW55KS4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTGlmZWN5Y2xlRXhjZXB0aW9uIGlmIHRoaXMgY29tcG9uZW50IGRldGVjdHMgYSBmYXRhbCBlcnJvcgorICAgICAqICB0aGF0IHByZXZlbnRzIHRoaXMgY29tcG9uZW50IGZyb20gYmVpbmcgdXNlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB0aHJvd3MgTGlmZWN5Y2xlRXhjZXB0aW9uIHsKKworICAgICAgICBzdXBlci5zdG9wKCk7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2F1dGhlbnRpY2F0b3IvU2F2ZWRSZXF1ZXN0LmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYXV0aGVudGljYXRvci9TYXZlZFJlcXVlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZThmN2ZiCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2F1dGhlbnRpY2F0b3IvU2F2ZWRSZXF1ZXN0LmphdmEKQEAgLTAsMCArMSwxNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuYXV0aGVudGljYXRvcjsKKworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5Db29raWU7CisKKworLyoqCisgKiBPYmplY3QgdGhhdCBzYXZlcyB0aGUgY3JpdGljYWwgaW5mb3JtYXRpb24gZnJvbSBhIHJlcXVlc3Qgc28gdGhhdAorICogZm9ybS1iYXNlZCBhdXRoZW50aWNhdGlvbiBjYW4gcmVwcm9kdWNlIGl0IG9uY2UgdGhlIHVzZXIgaGFzIGJlZW4KKyAqIGF1dGhlbnRpY2F0ZWQuCisgKiA8cD4KKyAqIDxiPklNUExFTUVOVEFUSU9OIE5PVEU8L2I+IC0gSXQgaXMgYXNzdW1lZCB0aGF0IHRoaXMgb2JqZWN0IGlzIGFjY2Vzc2VkCisgKiBvbmx5IGZyb20gdGhlIGNvbnRleHQgb2YgYSBzaW5nbGUgdGhyZWFkLCBzbyBubyBzeW5jaHJvbml6YXRpb24gYXJvdW5kCisgKiBpbnRlcm5hbCBjb2xsZWN0aW9uIGNsYXNzZXMgaXMgcGVyZm9ybWVkLgorICogPHA+CisgKiA8Yj5GSVhNRTwvYj4gLSBDdXJyZW50bHksIHRoaXMgb2JqZWN0IGhhcyBubyBtZWNoYW5pc20gdG8gc2F2ZSBvcgorICogcmVzdG9yZSB0aGUgZGF0YSBjb250ZW50IG9mIHRoZSByZXF1ZXN0LCBhbHRob3VnaCBpdCBkb2VzIHNhdmUKKyAqIHJlcXVlc3QgcGFyYW1ldGVycyBzbyB0aGF0IGEgUE9TVCB0cmFuc2FjdGlvbiBjYW4gYmUgZmFpdGhmdWxseQorICogZHVwbGljYXRlZC4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIFNhdmVkUmVxdWVzdCB7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzZXQgb2YgQ29va2llcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBSZXF1ZXN0LgorICAgICAqLworICAgIHByaXZhdGUgQXJyYXlMaXN0IGNvb2tpZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisKKyAgICBwdWJsaWMgdm9pZCBhZGRDb29raWUoQ29va2llIGNvb2tpZSkgeworICAgICAgICBjb29raWVzLmFkZChjb29raWUpOworICAgIH0KKworICAgIHB1YmxpYyBJdGVyYXRvciBnZXRDb29raWVzKCkgeworICAgICAgICByZXR1cm4gKGNvb2tpZXMuaXRlcmF0b3IoKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgc2V0IG9mIEhlYWRlcnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgUmVxdWVzdC4gIEVhY2gga2V5IGlzIGEgaGVhZGVyCisgICAgICogbmFtZSwgd2hpbGUgdGhlIHZhbHVlIGlzIGEgQXJyYXlMaXN0IGNvbnRhaW5pbmcgb25lIG9yIG1vcmUgYWN0dWFsCisgICAgICogdmFsdWVzIGZvciB0aGlzIGhlYWRlci4gIFRoZSB2YWx1ZXMgYXJlIHJldHVybmVkIGFzIGFuIEl0ZXJhdG9yIHdoZW4KKyAgICAgKiB5b3UgYXNrIGZvciB0aGVtLgorICAgICAqLworICAgIHByaXZhdGUgSGFzaE1hcCBoZWFkZXJzID0gbmV3IEhhc2hNYXAoKTsKKworICAgIHB1YmxpYyB2b2lkIGFkZEhlYWRlcihTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIEFycmF5TGlzdCB2YWx1ZXMgPSAoQXJyYXlMaXN0KSBoZWFkZXJzLmdldChuYW1lKTsKKyAgICAgICAgaWYgKHZhbHVlcyA9PSBudWxsKSB7CisgICAgICAgICAgICB2YWx1ZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgICAgICBoZWFkZXJzLnB1dChuYW1lLCB2YWx1ZXMpOworICAgICAgICB9CisgICAgICAgIHZhbHVlcy5hZGQodmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyBJdGVyYXRvciBnZXRIZWFkZXJOYW1lcygpIHsKKyAgICAgICAgcmV0dXJuIChoZWFkZXJzLmtleVNldCgpLml0ZXJhdG9yKCkpOworICAgIH0KKworICAgIHB1YmxpYyBJdGVyYXRvciBnZXRIZWFkZXJWYWx1ZXMoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgQXJyYXlMaXN0IHZhbHVlcyA9IChBcnJheUxpc3QpIGhlYWRlcnMuZ2V0KG5hbWUpOworICAgICAgICBpZiAodmFsdWVzID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKChuZXcgQXJyYXlMaXN0KCkpLml0ZXJhdG9yKCkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gKHZhbHVlcy5pdGVyYXRvcigpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSBzZXQgb2YgTG9jYWxlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBSZXF1ZXN0LgorICAgICAqLworICAgIHByaXZhdGUgQXJyYXlMaXN0IGxvY2FsZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisKKyAgICBwdWJsaWMgdm9pZCBhZGRMb2NhbGUoTG9jYWxlIGxvY2FsZSkgeworICAgICAgICBsb2NhbGVzLmFkZChsb2NhbGUpOworICAgIH0KKworICAgIHB1YmxpYyBJdGVyYXRvciBnZXRMb2NhbGVzKCkgeworICAgICAgICByZXR1cm4gKGxvY2FsZXMuaXRlcmF0b3IoKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgcmVxdWVzdCBtZXRob2QgdXNlZCBvbiB0aGlzIFJlcXVlc3QuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbWV0aG9kID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kKCkgeworICAgICAgICByZXR1cm4gKHRoaXMubWV0aG9kKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRNZXRob2QoU3RyaW5nIG1ldGhvZCkgeworICAgICAgICB0aGlzLm1ldGhvZCA9IG1ldGhvZDsKKyAgICB9CisKKworCisgICAgLyoqCisgICAgICogVGhlIHNldCBvZiByZXF1ZXN0IHBhcmFtZXRlcnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgUmVxdWVzdC4gIEVhY2gKKyAgICAgKiBlbnRyeSBpcyBrZXllZCBieSB0aGUgcGFyYW1ldGVyIG5hbWUsIHBvaW50aW5nIGF0IGEgU3RyaW5nIGFycmF5IG9mCisgICAgICogdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWVzLgorICAgICAqLworICAgIHByaXZhdGUgSGFzaE1hcCBwYXJhbWV0ZXJzID0gbmV3IEhhc2hNYXAoKTsKKworICAgIHB1YmxpYyB2b2lkIGFkZFBhcmFtZXRlcihTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlc1tdKSB7CisgICAgICAgIHBhcmFtZXRlcnMucHV0KG5hbWUsIHZhbHVlcyk7CisgICAgfQorCisgICAgcHVibGljIEl0ZXJhdG9yIGdldFBhcmFtZXRlck5hbWVzKCkgeworICAgICAgICByZXR1cm4gKHBhcmFtZXRlcnMua2V5U2V0KCkuaXRlcmF0b3IoKSk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZ1tdIGdldFBhcmFtZXRlclZhbHVlcyhTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gKChTdHJpbmdbXSkgcGFyYW1ldGVycy5nZXQobmFtZSkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIHF1ZXJ5IHN0cmluZyBhc3NvY2lhdGVkIHdpdGggdGhpcyBSZXF1ZXN0LgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHF1ZXJ5U3RyaW5nID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UXVlcnlTdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5xdWVyeVN0cmluZyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UXVlcnlTdHJpbmcoU3RyaW5nIHF1ZXJ5U3RyaW5nKSB7CisgICAgICAgIHRoaXMucXVlcnlTdHJpbmcgPSBxdWVyeVN0cmluZzsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSByZXF1ZXN0IFVSSSBhc3NvY2lhdGVkIHdpdGggdGhpcyBSZXF1ZXN0LgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHJlcXVlc3RVUkkgPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXRSZXF1ZXN0VVJJKCkgeworICAgICAgICByZXR1cm4gKHRoaXMucmVxdWVzdFVSSSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UmVxdWVzdFVSSShTdHJpbmcgcmVxdWVzdFVSSSkgeworICAgICAgICB0aGlzLnJlcXVlc3RVUkkgPSByZXF1ZXN0VVJJOworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYXV0aGVudGljYXRvci9TaW5nbGVTaWduT24uamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hdXRoZW50aWNhdG9yL1NpbmdsZVNpZ25Pbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxN2NjMTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYXV0aGVudGljYXRvci9TaW5nbGVTaWduT24uamF2YQpAQCAtMCwwICsxLDY3NCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LTIwMDEsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmF1dGhlbnRpY2F0b3I7CisKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5QcmluY2lwYWw7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkNvb2tpZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5SZWFsbTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlNlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5TZXNzaW9uRXZlbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5TZXNzaW9uTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuUmVxdWVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3Rvci5SZXNwb25zZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuTGlmZWN5Y2xlU3VwcG9ydDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuU3RyaW5nTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcy5WYWx2ZUJhc2U7CisKKworLyoqCisgKiBBIDxzdHJvbmc+VmFsdmU8L3N0cm9uZz4gdGhhdCBzdXBwb3J0cyBhICJzaW5nbGUgc2lnbiBvbiIgdXNlciBleHBlcmllbmNlLAorICogd2hlcmUgdGhlIHNlY3VyaXR5IGlkZW50aXR5IG9mIGEgdXNlciB3aG8gc3VjY2Vzc2Z1bGx5IGF1dGhlbnRpY2F0ZXMgdG8gb25lCisgKiB3ZWIgYXBwbGljYXRpb24gaXMgcHJvcG9nYXRlZCB0byBvdGhlciB3ZWIgYXBwbGljYXRpb25zIGluIHRoZSBzYW1lCisgKiBzZWN1cml0eSBkb21haW4uICBGb3Igc3VjY2Vzc2Z1bCB1c2UsIHRoZSBmb2xsb3dpbmcgcmVxdWlyZW1lbnRzIG11c3QKKyAqIGJlIG1ldDoKKyAqIDx1bD4KKyAqIDxsaT5UaGlzIFZhbHZlIG11c3QgYmUgY29uZmlndXJlZCBvbiB0aGUgQ29udGFpbmVyIHRoYXQgcmVwcmVzZW50cyBhCisgKiAgICAgdmlydHVhbCBob3N0ICh0eXBpY2FsbHkgYW4gaW1wbGVtZW50YXRpb24gb2YgPGNvZGU+SG9zdDwvY29kZT4pLjwvbGk+CisgKiA8bGk+VGhlIDxjb2RlPlJlYWxtPC9jb2RlPiB0aGF0IGNvbnRhaW5zIHRoZSBzaGFyZWQgdXNlciBhbmQgcm9sZQorICogICAgIGluZm9ybWF0aW9uIG11c3QgYmUgY29uZmlndXJlZCBvbiB0aGUgc2FtZSBDb250YWluZXIgKG9yIGEgaGlnaGVyCisgKiAgICAgb25lKSwgYW5kIG5vdCBvdmVycmlkZGVuIGF0IHRoZSB3ZWIgYXBwbGljYXRpb24gbGV2ZWwuPC9saT4KKyAqIDxsaT5UaGUgd2ViIGFwcGxpY2F0aW9ucyB0aGVtc2VsdmVzIG11c3QgdXNlIG9uZSBvZiB0aGUgc3RhbmRhcmQKKyAqICAgICBBdXRoZW50aWNhdG9ycyBmb3VuZCBpbiB0aGUKKyAqICAgICA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLmF1dGhlbnRpY2F0b3I8L2NvZGU+IHBhY2thZ2UuPC9saT4KKyAqIDwvdWw+CisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBTaW5nbGVTaWduT24KKyAgICBleHRlbmRzIFZhbHZlQmFzZQorICAgIGltcGxlbWVudHMgTGlmZWN5Y2xlLCBTZXNzaW9uTGlzdGVuZXIgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIGNhY2hlIG9mIFNpbmdsZVNpZ25PbkVudHJ5IGluc3RhbmNlcyBmb3IgYXV0aGVudGljYXRlZCBQcmluY2lwYWxzLAorICAgICAqIGtleWVkIGJ5IHRoZSBjb29raWUgdmFsdWUgdGhhdCBpcyB1c2VkIHRvIHNlbGVjdCB0aGVtLgorICAgICAqLworICAgIHByb3RlY3RlZCBIYXNoTWFwIGNhY2hlID0gbmV3IEhhc2hNYXAoKTsKKworCisgICAgLyoqCisgICAgICogRGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBWYWx2ZSBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBpbmZvID0KKyAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuYXV0aGVudGljYXRvci5TaW5nbGVTaWduT24iOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgbGlmZWN5Y2xlIGV2ZW50IHN1cHBvcnQgZm9yIHRoaXMgY29tcG9uZW50LgorICAgICAqLworICAgIHByb3RlY3RlZCBMaWZlY3ljbGVTdXBwb3J0IGxpZmVjeWNsZSA9IG5ldyBMaWZlY3ljbGVTdXBwb3J0KHRoaXMpOworCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyB2YWx2ZSBzaG91bGQgcmVxdWlyZSBhIGRvd25zdHJlYW0gQXV0aGVudGljYXRvciB0bworICAgICAqIHJlYXV0aGVudGljYXRlIGVhY2ggcmVxdWVzdCwgb3IgaWYgaXQgaXRzZWxmIGNhbiBiaW5kIGEgVXNlclByaW5jaXBhbAorICAgICAqIGFuZCBBdXRoVHlwZSBvYmplY3QgdG8gdGhlIHJlcXVlc3QuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHJlcXVpcmVSZWF1dGhlbnRpY2F0aW9uID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY2FjaGUgb2Ygc2luZ2xlIHNpZ24gb24gaWRlbnRpZmllcnMsIGtleWVkIGJ5IHRoZSBTZXNzaW9uIHRoYXQgaXMKKyAgICAgKiBhc3NvY2lhdGVkIHdpdGggdGhlbS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgSGFzaE1hcCByZXZlcnNlID0gbmV3IEhhc2hNYXAoKTsKKworCisgICAgLyoqCisgICAgICogVGhlIHN0cmluZyBtYW5hZ2VyIGZvciB0aGlzIHBhY2thZ2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmdNYW5hZ2VyIHNtID0KKyAgICAgICAgU3RyaW5nTWFuYWdlci5nZXRNYW5hZ2VyKENvbnN0YW50cy5QYWNrYWdlKTsKKworCisgICAgLyoqCisgICAgICogQ29tcG9uZW50IHN0YXJ0ZWQgZmxhZy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzdGFydGVkID0gZmFsc2U7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBHZXRzIHdoZXRoZXIgZWFjaCByZXF1ZXN0IG5lZWRzIHRvIGJlIHJlYXV0aGVudGljYXRlZCAoYnkgYW4KKyAgICAgKiBBdXRoZW50aWNhdG9yIGRvd25zdHJlYW0gaW4gdGhlIHBpcGVsaW5lKSB0byB0aGUgc2VjdXJpdHkKKyAgICAgKiA8Y29kZT5SZWFsbTwvY29kZT4sIG9yIGlmIHRoaXMgVmFsdmUgY2FuIGl0c2VsZiBiaW5kIHNlY3VyaXR5IGluZm8KKyAgICAgKiB0byB0aGUgcmVxdWVzdCBiYXNlZCBvbiB0aGUgcHJlc2VuY2Ugb2YgYSB2YWxpZCBTU08gZW50cnkgd2l0aG91dAorICAgICAqIHJlY2hlY2tpbmcgd2l0aCB0aGUgPGNvZGU+UmVhbG08L2NvZGUuLgorICAgICAqCisgICAgICogQHJldHVybiAgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgaXQgaXMgcmVxdWlyZWQgdGhhdCBhIGRvd25zdHJlYW0KKyAgICAgKiAgICAgICAgICBBdXRoZW50aWNhdG9yIHJlYXV0aGVudGljYXRlIGVhY2ggcmVxdWVzdCBiZWZvcmUgY2FsbHMgdG8KKyAgICAgKiAgICAgICAgICA8Y29kZT5IdHRwU2VydmxldFJlcXVlc3Quc2V0VXNlclByaW5jaXBhbCgpPC9jb2RlPgorICAgICAqICAgICAgICAgIGFuZCA8Y29kZT5IdHRwU2VydmxldFJlcXVlc3Quc2V0QXV0aFR5cGUoKTwvY29kZT4gYXJlIG1hZGU7CisgICAgICogICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZSA8Y29kZT5WYWx2ZTwvY29kZT4gY2FuIGl0c2VsZiBtYWtlCisgICAgICogICAgICAgICAgdGhvc2UgY2FsbHMgcmVseWluZyBvbiB0aGUgcHJlc2VuY2Ugb2YgYSB2YWxpZCBTaW5nbGVTaWduT24KKyAgICAgKiAgICAgICAgICBlbnRyeSBhc3NvY2lhdGVkIHdpdGggdGhlIHJlcXVlc3QuCisgICAgICoKKyAgICAgKiBAc2VlICNzZXRSZXF1aXJlUmVhdXRoZW50aWNhdGlvbgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldFJlcXVpcmVSZWF1dGhlbnRpY2F0aW9uKCkKKyAgICB7CisgICAgICAgIHJldHVybiByZXF1aXJlUmVhdXRoZW50aWNhdGlvbjsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldHMgd2hldGhlciBlYWNoIHJlcXVlc3QgbmVlZHMgdG8gYmUgcmVhdXRoZW50aWNhdGVkIChieSBhbgorICAgICAqIEF1dGhlbnRpY2F0b3IgZG93bnN0cmVhbSBpbiB0aGUgcGlwZWxpbmUpIHRvIHRoZSBzZWN1cml0eQorICAgICAqIDxjb2RlPlJlYWxtPC9jb2RlPiwgb3IgaWYgdGhpcyBWYWx2ZSBjYW4gaXRzZWxmIGJpbmQgc2VjdXJpdHkgaW5mbworICAgICAqIHRvIHRoZSByZXF1ZXN0LCBiYXNlZCBvbiB0aGUgcHJlc2VuY2Ugb2YgYSB2YWxpZCBTU08gZW50cnksIHdpdGhvdXQKKyAgICAgKiByZWNoZWNraW5nIHdpdGggdGhlIDxjb2RlPlJlYWxtPC9jb2RlLgorICAgICAqIDxwPgorICAgICAqIElmIHRoaXMgcHJvcGVydHkgaXMgPGNvZGU+ZmFsc2U8L2NvZGU+ICh0aGUgZGVmYXVsdCksIHRoaXMKKyAgICAgKiA8Y29kZT5WYWx2ZTwvY29kZT4gd2lsbCBiaW5kIGEgVXNlclByaW5jaXBhbCBhbmQgQXV0aFR5cGUgdG8gdGhlIHJlcXVlc3QKKyAgICAgKiBpZiBhIHZhbGlkIFNTTyBlbnRyeSBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIHJlcXVlc3QuICBJdCB3aWxsIG5vdCBub3RpZnkKKyAgICAgKiB0aGUgc2VjdXJpdHkgPGNvZGU+UmVhbG08L2NvZGU+IG9mIHRoZSBpbmNvbWluZyByZXF1ZXN0LgorICAgICAqIDxwPgorICAgICAqIFRoaXMgcHJvcGVydHkgc2hvdWxkIGJlIHNldCB0byA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb3ZlcmFsbCBzZXJ2ZXIKKyAgICAgKiBjb25maWd1cmF0aW9uIHJlcXVpcmVzIHRoYXQgdGhlIDxjb2RlPlJlYWxtPC9jb2RlPiByZWF1dGhlbnRpY2F0ZSBlYWNoCisgICAgICogcmVxdWVzdCB0aHJlYWQuICBBbiBleGFtcGxlIG9mIHN1Y2ggYSBjb25maWd1cmF0aW9uIHdvdWxkIGJlIG9uZSB3aGVyZQorICAgICAqIHRoZSA8Y29kZT5SZWFsbTwvY29kZT4gaW1wbGVtZW50YXRpb24gcHJvdmlkZXMgc2VjdXJpdHkgZm9yIGJvdGggYQorICAgICAqIHdlYiB0aWVyIGFuZCBhbiBhc3NvY2lhdGVkIEVKQiB0aWVyLCBhbmQgbmVlZHMgdG8gc2V0IHNlY3VyaXR5CisgICAgICogY3JlZGVudGlhbHMgb24gZWFjaCByZXF1ZXN0IHRocmVhZCBpbiBvcmRlciB0byBzdXBwb3J0IEVKQiBhY2Nlc3MuCisgICAgICogPHA+CisgICAgICogSWYgdGhpcyBwcm9wZXJ0eSBpcyBzZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4sIHRoaXMgVmFsdmUgd2lsbCBzZXQgZmxhZ3MKKyAgICAgKiBvbiB0aGUgcmVxdWVzdCBub3RpZnlpbmcgdGhlIGRvd25zdHJlYW0gQXV0aGVudGljYXRvciB0aGF0IHRoZSByZXF1ZXN0CisgICAgICogaXMgYXNzb2NpYXRlZCB3aXRoIGFuIFNTTyBzZXNzaW9uLiAgVGhlIEF1dGhlbnRpY2F0b3Igd2lsbCB0aGVuIGNhbGwgaXRzCisgICAgICoge0BsaW5rIEF1dGhlbnRpY2F0b3JCYXNlI3JlYXV0aGVudGljYXRlRnJvbVNTTyByZWF1dGhlbnRpY2F0ZUZyb21TU099CisgICAgICogbWV0aG9kIHRvIGF0dGVtcHQgdG8gcmVhdXRoZW50aWNhdGUgdGhlIHJlcXVlc3QgdG8gdGhlCisgICAgICogPGNvZGU+UmVhbG08L2NvZGU+LCB1c2luZyBhbnkgY3JlZGVudGlhbHMgdGhhdCB3ZXJlIGNhY2hlZCB3aXRoIHRoaXMKKyAgICAgKiBWYWx2ZS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGlzIHByb3BlcnR5IGlzIDxjb2RlPmZhbHNlPC9jb2RlPiwgaW4gb3JkZXIKKyAgICAgKiB0byBtYWludGFpbiBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggcHJldmlvdXMgdmVyc2lvbnMgb2YgVG9tY2F0LgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVpcmVkICA8Y29kZT50cnVlPC9jb2RlPiBpZiBpdCBpcyByZXF1aXJlZCB0aGF0IGEgZG93bnN0cmVhbQorICAgICAqICAgICAgICAgICAgICAgICAgQXV0aGVudGljYXRvciByZWF1dGhlbnRpY2F0ZSBlYWNoIHJlcXVlc3QgYmVmb3JlIGNhbGxzCisgICAgICogICAgICAgICAgICAgICAgICB0byAgPGNvZGU+SHR0cFNlcnZsZXRSZXF1ZXN0LnNldFVzZXJQcmluY2lwYWwoKTwvY29kZT4KKyAgICAgKiAgICAgICAgICAgICAgICAgIGFuZCA8Y29kZT5IdHRwU2VydmxldFJlcXVlc3Quc2V0QXV0aFR5cGUoKTwvY29kZT4gYXJlCisgICAgICogICAgICAgICAgICAgICAgICBtYWRlOyA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIDxjb2RlPlZhbHZlPC9jb2RlPiBjYW4KKyAgICAgKiAgICAgICAgICAgICAgICAgIGl0c2VsZiBtYWtlIHRob3NlIGNhbGxzIHJlbHlpbmcgb24gdGhlIHByZXNlbmNlIG9mIGEKKyAgICAgKiAgICAgICAgICAgICAgICAgIHZhbGlkIFNpbmdsZVNpZ25PbiBlbnRyeSBhc3NvY2lhdGVkIHdpdGggdGhlIHJlcXVlc3QuCisgICAgICoKKyAgICAgKiBAc2VlIEF1dGhlbnRpY2F0b3JCYXNlI3JlYXV0aGVudGljYXRlRnJvbVNTTworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlcXVpcmVSZWF1dGhlbnRpY2F0aW9uKGJvb2xlYW4gcmVxdWlyZWQpCisgICAgeworICAgICAgICB0aGlzLnJlcXVpcmVSZWF1dGhlbnRpY2F0aW9uID0gcmVxdWlyZWQ7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTGlmZWN5Y2xlIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogQWRkIGEgbGlmZWN5Y2xlIGV2ZW50IGxpc3RlbmVyIHRvIHRoaXMgY29tcG9uZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciB0byBhZGQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRMaWZlY3ljbGVMaXN0ZW5lcihMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lcikgeworCisgICAgICAgIGxpZmVjeWNsZS5hZGRMaWZlY3ljbGVMaXN0ZW5lcihsaXN0ZW5lcik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbGlmZWN5Y2xlIGxpc3RlbmVycyBhc3NvY2lhdGVkIHdpdGggdGhpcyBsaWZlY3ljbGUuIElmIHRoaXMgCisgICAgICogTGlmZWN5Y2xlIGhhcyBubyBsaXN0ZW5lcnMgcmVnaXN0ZXJlZCwgYSB6ZXJvLWxlbmd0aCBhcnJheSBpcyByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlmZWN5Y2xlTGlzdGVuZXJbXSBmaW5kTGlmZWN5Y2xlTGlzdGVuZXJzKCkgeworCisgICAgICAgIHJldHVybiBsaWZlY3ljbGUuZmluZExpZmVjeWNsZUxpc3RlbmVycygpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSBsaWZlY3ljbGUgZXZlbnQgbGlzdGVuZXIgZnJvbSB0aGlzIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgdG8gcmVtb3ZlCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlTGlmZWN5Y2xlTGlzdGVuZXIoTGlmZWN5Y2xlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKworICAgICAgICBsaWZlY3ljbGUucmVtb3ZlTGlmZWN5Y2xlTGlzdGVuZXIobGlzdGVuZXIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBQcmVwYXJlIGZvciB0aGUgYmVnaW5uaW5nIG9mIGFjdGl2ZSB1c2Ugb2YgdGhlIHB1YmxpYyBtZXRob2RzIG9mIHRoaXMKKyAgICAgKiBjb21wb25lbnQuICBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIDxjb2RlPmNvbmZpZ3VyZSgpPC9jb2RlPiwKKyAgICAgKiBhbmQgYmVmb3JlIGFueSBvZiB0aGUgcHVibGljIG1ldGhvZHMgb2YgdGhlIGNvbXBvbmVudCBhcmUgdXRpbGl6ZWQuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIExpZmVjeWNsZUV4Y2VwdGlvbiBpZiB0aGlzIGNvbXBvbmVudCBkZXRlY3RzIGEgZmF0YWwgZXJyb3IKKyAgICAgKiAgdGhhdCBwcmV2ZW50cyB0aGlzIGNvbXBvbmVudCBmcm9tIGJlaW5nIHVzZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb24geworCisgICAgICAgIC8vIFZhbGlkYXRlIGFuZCB1cGRhdGUgb3VyIGN1cnJlbnQgY29tcG9uZW50IHN0YXRlCisgICAgICAgIGlmIChzdGFydGVkKQorICAgICAgICAgICAgdGhyb3cgbmV3IExpZmVjeWNsZUV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoImF1dGhlbnRpY2F0b3IuYWxyZWFkeVN0YXJ0ZWQiKSk7CisgICAgICAgIGxpZmVjeWNsZS5maXJlTGlmZWN5Y2xlRXZlbnQoU1RBUlRfRVZFTlQsIG51bGwpOworICAgICAgICBzdGFydGVkID0gdHJ1ZTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogR3JhY2VmdWxseSB0ZXJtaW5hdGUgdGhlIGFjdGl2ZSB1c2Ugb2YgdGhlIHB1YmxpYyBtZXRob2RzIG9mIHRoaXMKKyAgICAgKiBjb21wb25lbnQuICBUaGlzIG1ldGhvZCBzaG91bGQgYmUgdGhlIGxhc3Qgb25lIGNhbGxlZCBvbiBhIGdpdmVuCisgICAgICogaW5zdGFuY2Ugb2YgdGhpcyBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIExpZmVjeWNsZUV4Y2VwdGlvbiBpZiB0aGlzIGNvbXBvbmVudCBkZXRlY3RzIGEgZmF0YWwgZXJyb3IKKyAgICAgKiAgdGhhdCBuZWVkcyB0byBiZSByZXBvcnRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB0aHJvd3MgTGlmZWN5Y2xlRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBWYWxpZGF0ZSBhbmQgdXBkYXRlIG91ciBjdXJyZW50IGNvbXBvbmVudCBzdGF0ZQorICAgICAgICBpZiAoIXN0YXJ0ZWQpCisgICAgICAgICAgICB0aHJvdyBuZXcgTGlmZWN5Y2xlRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygiYXV0aGVudGljYXRvci5ub3RTdGFydGVkIikpOworICAgICAgICBsaWZlY3ljbGUuZmlyZUxpZmVjeWNsZUV2ZW50KFNUT1BfRVZFTlQsIG51bGwpOworICAgICAgICBzdGFydGVkID0gZmFsc2U7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTZXNzaW9uTGlzdGVuZXIgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBBY2tub3dsZWRnZSB0aGUgb2NjdXJyZW5jZSBvZiB0aGUgc3BlY2lmaWVkIGV2ZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGV2ZW50IFNlc3Npb25FdmVudCB0aGF0IGhhcyBvY2N1cnJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNlc3Npb25FdmVudChTZXNzaW9uRXZlbnQgZXZlbnQpIHsKKworICAgICAgICAvLyBXZSBvbmx5IGNhcmUgYWJvdXQgc2Vzc2lvbiBkZXN0cm95ZWQgZXZlbnRzCisgICAgICAgIGlmICghU2Vzc2lvbi5TRVNTSU9OX0RFU1RST1lFRF9FVkVOVC5lcXVhbHMoZXZlbnQuZ2V0VHlwZSgpKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvLyBMb29rIHVwIHRoZSBzaW5nbGUgc2Vzc2lvbiBpZCBhc3NvY2lhdGVkIHdpdGggdGhpcyBzZXNzaW9uIChpZiBhbnkpCisgICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IGV2ZW50LmdldFNlc3Npb24oKTsKKyAgICAgICAgaWYgKGNvbnRhaW5lci5nZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgY29udGFpbmVyLmdldExvZ2dlcigpLmRlYnVnKCJQcm9jZXNzIHNlc3Npb24gZGVzdHJveWVkIG9uICIgKyBzZXNzaW9uKTsKKworICAgICAgICBTdHJpbmcgc3NvSWQgPSBudWxsOworICAgICAgICBzeW5jaHJvbml6ZWQgKHJldmVyc2UpIHsKKyAgICAgICAgICAgIHNzb0lkID0gKFN0cmluZykgcmV2ZXJzZS5nZXQoc2Vzc2lvbik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNzb0lkID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgLy8gV2FzIHRoZSBzZXNzaW9uIGRlc3Ryb3llZCBhcyB0aGUgcmVzdWx0IG9mIGEgdGltZW91dD8KKyAgICAgICAgLy8gSWYgc28sIHdlJ2xsIGp1c3QgcmVtb3ZlIHRoZSBleHBpcmVkIHNlc3Npb24gZnJvbSB0aGUKKyAgICAgICAgLy8gU1NPLiAgSWYgdGhlIHNlc3Npb24gd2FzIGxvZ2dlZCBvdXQsIHdlJ2xsIGxvZyBvdXQKKyAgICAgICAgLy8gb2YgYWxsIHNlc3Npb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBTU08uCisgICAgICAgIGlmICgoc2Vzc2lvbi5nZXRNYXhJbmFjdGl2ZUludGVydmFsKCkgPiAwKQorICAgICAgICAgICAgJiYgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc2Vzc2lvbi5nZXRMYXN0QWNjZXNzZWRUaW1lKCkgPj0KKyAgICAgICAgICAgICAgICBzZXNzaW9uLmdldE1heEluYWN0aXZlSW50ZXJ2YWwoKSAqIDEwMDApKSB7CisgICAgICAgICAgICByZW1vdmVTZXNzaW9uKHNzb0lkLCBzZXNzaW9uKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFRoZSBzZXNzaW9uIHdhcyBsb2dnZWQgb3V0LgorICAgICAgICAgICAgLy8gRGVyZWdpc3RlciB0aGlzIHNpbmdsZSBzZXNzaW9uIGlkLCBpbnZhbGlkYXRpbmcgCisgICAgICAgICAgICAvLyBhc3NvY2lhdGVkIHNlc3Npb25zCisgICAgICAgICAgICBkZXJlZ2lzdGVyKHNzb0lkKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFZhbHZlIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgVmFsdmUgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJbmZvKCkgeworCisgICAgICAgIHJldHVybiAoaW5mbyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFBlcmZvcm0gc2luZ2xlLXNpZ24tb24gc3VwcG9ydCBwcm9jZXNzaW5nIGZvciB0aGlzIHJlcXVlc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBzZXJ2bGV0IHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbnZva2UoUmVxdWVzdCByZXF1ZXN0LCBSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICByZXF1ZXN0LnJlbW92ZU5vdGUoQ29uc3RhbnRzLlJFUV9TU09JRF9OT1RFKTsKKworICAgICAgICAvLyBIYXMgYSB2YWxpZCB1c2VyIGFscmVhZHkgYmVlbiBhdXRoZW50aWNhdGVkPworICAgICAgICBpZiAoY29udGFpbmVyLmdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBjb250YWluZXIuZ2V0TG9nZ2VyKCkuZGVidWcoIlByb2Nlc3MgcmVxdWVzdCBmb3IgJyIgKyByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKSArICInIik7CisgICAgICAgIGlmIChyZXF1ZXN0LmdldFVzZXJQcmluY2lwYWwoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoY29udGFpbmVyLmdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgY29udGFpbmVyLmdldExvZ2dlcigpLmRlYnVnKCIgUHJpbmNpcGFsICciICsgcmVxdWVzdC5nZXRVc2VyUHJpbmNpcGFsKCkuZ2V0TmFtZSgpICsKKyAgICAgICAgICAgICAgICAgICAgIicgaGFzIGFscmVhZHkgYmVlbiBhdXRoZW50aWNhdGVkIik7CisgICAgICAgICAgICBnZXROZXh0KCkuaW52b2tlKHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENoZWNrIGZvciB0aGUgc2luZ2xlIHNpZ24gb24gY29va2llCisgICAgICAgIGlmIChjb250YWluZXIuZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGNvbnRhaW5lci5nZXRMb2dnZXIoKS5kZWJ1ZygiIENoZWNraW5nIGZvciBTU08gY29va2llIik7CisgICAgICAgIENvb2tpZSBjb29raWUgPSBudWxsOworICAgICAgICBDb29raWUgY29va2llc1tdID0gcmVxdWVzdC5nZXRDb29raWVzKCk7CisgICAgICAgIGlmIChjb29raWVzID09IG51bGwpCisgICAgICAgICAgICBjb29raWVzID0gbmV3IENvb2tpZVswXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb29raWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoQ29uc3RhbnRzLlNJTkdMRV9TSUdOX09OX0NPT0tJRS5lcXVhbHMoY29va2llc1tpXS5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgY29va2llID0gY29va2llc1tpXTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoY29va2llID09IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChjb250YWluZXIuZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBjb250YWluZXIuZ2V0TG9nZ2VyKCkuZGVidWcoIiBTU08gY29va2llIGlzIG5vdCBwcmVzZW50Iik7CisgICAgICAgICAgICBnZXROZXh0KCkuaW52b2tlKHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIExvb2sgdXAgdGhlIGNhY2hlZCBQcmluY2lwYWwgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29va2llIHZhbHVlCisgICAgICAgIGlmIChjb250YWluZXIuZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGNvbnRhaW5lci5nZXRMb2dnZXIoKS5kZWJ1ZygiIENoZWNraW5nIGZvciBjYWNoZWQgcHJpbmNpcGFsIGZvciAiICsgY29va2llLmdldFZhbHVlKCkpOworICAgICAgICBTaW5nbGVTaWduT25FbnRyeSBlbnRyeSA9IGxvb2t1cChjb29raWUuZ2V0VmFsdWUoKSk7CisgICAgICAgIGlmIChlbnRyeSAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoY29udGFpbmVyLmdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgY29udGFpbmVyLmdldExvZ2dlcigpLmRlYnVnKCIgRm91bmQgY2FjaGVkIHByaW5jaXBhbCAnIiArCisgICAgICAgICAgICAgICAgICAgIGVudHJ5LmdldFByaW5jaXBhbCgpLmdldE5hbWUoKSArICInIHdpdGggYXV0aCB0eXBlICciICsKKyAgICAgICAgICAgICAgICAgICAgZW50cnkuZ2V0QXV0aFR5cGUoKSArICInIik7CisgICAgICAgICAgICByZXF1ZXN0LnNldE5vdGUoQ29uc3RhbnRzLlJFUV9TU09JRF9OT1RFLCBjb29raWUuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICAvLyBPbmx5IHNldCBzZWN1cml0eSBlbGVtZW50cyBpZiByZWF1dGhlbnRpY2F0aW9uIGlzIG5vdCByZXF1aXJlZAorICAgICAgICAgICAgaWYgKCFnZXRSZXF1aXJlUmVhdXRoZW50aWNhdGlvbigpKSB7CisgICAgICAgICAgICAgICAgcmVxdWVzdC5zZXRBdXRoVHlwZShlbnRyeS5nZXRBdXRoVHlwZSgpKTsKKyAgICAgICAgICAgICAgICByZXF1ZXN0LnNldFVzZXJQcmluY2lwYWwoZW50cnkuZ2V0UHJpbmNpcGFsKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGNvbnRhaW5lci5nZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGNvbnRhaW5lci5nZXRMb2dnZXIoKS5kZWJ1ZygiIE5vIGNhY2hlZCBwcmluY2lwYWwgZm91bmQsIGVyYXNpbmcgU1NPIGNvb2tpZSIpOworICAgICAgICAgICAgY29va2llLnNldE1heEFnZSgwKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLmFkZENvb2tpZShjb29raWUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gSW52b2tlIHRoZSBuZXh0IFZhbHZlIGluIG91ciBwaXBlbGluZQorICAgICAgICBnZXROZXh0KCkuaW52b2tlKHJlcXVlc3QsIHJlc3BvbnNlKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIFN0cmluZyByZW5kZXJpbmcgb2YgdGhpcyBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCJTaW5nbGVTaWduT25bIik7CisgICAgICAgIGlmIChjb250YWluZXIgPT0gbnVsbCApCisgICAgICAgICAgICBzYi5hcHBlbmQoIkNvbnRhaW5lciBpcyBudWxsIik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNiLmFwcGVuZChjb250YWluZXIuZ2V0TmFtZSgpKTsKKyAgICAgICAgc2IuYXBwZW5kKCJdIik7CisgICAgICAgIHJldHVybiAoc2IudG9TdHJpbmcoKSk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm90ZWN0ZWQgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBBc3NvY2lhdGUgdGhlIHNwZWNpZmllZCBzaW5nbGUgc2lnbiBvbiBpZGVudGlmaWVyIHdpdGggdGhlCisgICAgICogc3BlY2lmaWVkIFNlc3Npb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3NvSWQgU2luZ2xlIHNpZ24gb24gaWRlbnRpZmllcgorICAgICAqIEBwYXJhbSBzZXNzaW9uIFNlc3Npb24gdG8gYmUgYXNzb2NpYXRlZAorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGFzc29jaWF0ZShTdHJpbmcgc3NvSWQsIFNlc3Npb24gc2Vzc2lvbikgeworCisgICAgICAgIGlmIChjb250YWluZXIuZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGNvbnRhaW5lci5nZXRMb2dnZXIoKS5kZWJ1ZygiQXNzb2NpYXRlIHNzbyBpZCAiICsgc3NvSWQgKyAiIHdpdGggc2Vzc2lvbiAiICsgc2Vzc2lvbik7CisKKyAgICAgICAgU2luZ2xlU2lnbk9uRW50cnkgc3NvID0gbG9va3VwKHNzb0lkKTsKKyAgICAgICAgaWYgKHNzbyAhPSBudWxsKQorICAgICAgICAgICAgc3NvLmFkZFNlc3Npb24odGhpcywgc2Vzc2lvbik7CisgICAgICAgIHN5bmNocm9uaXplZCAocmV2ZXJzZSkgeworICAgICAgICAgICAgcmV2ZXJzZS5wdXQoc2Vzc2lvbiwgc3NvSWQpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZXJlZ2lzdGVyIHRoZSBzcGVjaWZpZWQgc2Vzc2lvbi4gIElmIGl0IGlzIHRoZSBsYXN0IHNlc3Npb24sCisgICAgICogdGhlbiBhbHNvIGdldCByaWQgb2YgdGhlIHNpbmdsZSBzaWduIG9uIGlkZW50aWZpZXIKKyAgICAgKgorICAgICAqIEBwYXJhbSBzc29JZCBTaW5nbGUgc2lnbiBvbiBpZGVudGlmaWVyCisgICAgICogQHBhcmFtIHNlc3Npb24gU2Vzc2lvbiB0byBiZSBkZXJlZ2lzdGVyZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBkZXJlZ2lzdGVyKFN0cmluZyBzc29JZCwgU2Vzc2lvbiBzZXNzaW9uKSB7CisKKyAgICAgICAgc3luY2hyb25pemVkIChyZXZlcnNlKSB7CisgICAgICAgICAgICByZXZlcnNlLnJlbW92ZShzZXNzaW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIFNpbmdsZVNpZ25PbkVudHJ5IHNzbyA9IGxvb2t1cChzc29JZCk7CisgICAgICAgIGlmICggc3NvID09IG51bGwgKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIHNzby5yZW1vdmVTZXNzaW9uKCBzZXNzaW9uICk7CisKKyAgICAgICAgLy8gc2VlIGlmIHdlIGFyZSB0aGUgbGFzdCBzZXNzaW9uLCBpZiBzbyBibG93IGF3YXkgc3NvSWQKKyAgICAgICAgU2Vzc2lvbiBzZXNzaW9uc1tdID0gc3NvLmZpbmRTZXNzaW9ucygpOworICAgICAgICBpZiAoIHNlc3Npb25zID09IG51bGwgfHwgc2Vzc2lvbnMubGVuZ3RoID09IDAgKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGNhY2hlKSB7CisgICAgICAgICAgICAgICAgc3NvID0gKFNpbmdsZVNpZ25PbkVudHJ5KSBjYWNoZS5yZW1vdmUoc3NvSWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIERlcmVnaXN0ZXIgdGhlIHNwZWNpZmllZCBzaW5nbGUgc2lnbiBvbiBpZGVudGlmaWVyLCBhbmQgaW52YWxpZGF0ZQorICAgICAqIGFueSBhc3NvY2lhdGVkIHNlc3Npb25zLgorICAgICAqCisgICAgICogQHBhcmFtIHNzb0lkIFNpbmdsZSBzaWduIG9uIGlkZW50aWZpZXIgdG8gZGVyZWdpc3RlcgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGRlcmVnaXN0ZXIoU3RyaW5nIHNzb0lkKSB7CisKKyAgICAgICAgaWYgKGNvbnRhaW5lci5nZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgY29udGFpbmVyLmdldExvZ2dlcigpLmRlYnVnKCJEZXJlZ2lzdGVyaW5nIHNzbyBpZCAnIiArIHNzb0lkICsgIiciKTsKKworICAgICAgICAvLyBMb29rIHVwIGFuZCByZW1vdmUgdGhlIGNvcnJlc3BvbmRpbmcgU2luZ2xlU2lnbk9uRW50cnkKKyAgICAgICAgU2luZ2xlU2lnbk9uRW50cnkgc3NvID0gbnVsbDsKKyAgICAgICAgc3luY2hyb25pemVkIChjYWNoZSkgeworICAgICAgICAgICAgc3NvID0gKFNpbmdsZVNpZ25PbkVudHJ5KSBjYWNoZS5yZW1vdmUoc3NvSWQpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNzbyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8vIEV4cGlyZSBhbnkgYXNzb2NpYXRlZCBzZXNzaW9ucworICAgICAgICBTZXNzaW9uIHNlc3Npb25zW10gPSBzc28uZmluZFNlc3Npb25zKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2Vzc2lvbnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChjb250YWluZXIuZ2V0TG9nZ2VyKCkuaXNUcmFjZUVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBjb250YWluZXIuZ2V0TG9nZ2VyKCkudHJhY2UoIiBJbnZhbGlkYXRpbmcgc2Vzc2lvbiAiICsgc2Vzc2lvbnNbaV0pOworICAgICAgICAgICAgLy8gUmVtb3ZlIGZyb20gcmV2ZXJzZSBjYWNoZSBmaXJzdCB0byBhdm9pZCByZWN1cnNpb24KKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAocmV2ZXJzZSkgeworICAgICAgICAgICAgICAgIHJldmVyc2UucmVtb3ZlKHNlc3Npb25zW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEludmFsaWRhdGUgdGhpcyBzZXNzaW9uCisgICAgICAgICAgICBzZXNzaW9uc1tpXS5leHBpcmUoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE5PVEU6ICBDbGllbnRzIG1heSBzdGlsbCBwb3NzZXNzIHRoZSBvbGQgc2luZ2xlIHNpZ24gb24gY29va2llLAorICAgICAgICAvLyBidXQgaXQgd2lsbCBiZSByZW1vdmVkIG9uIHRoZSBuZXh0IHJlcXVlc3Qgc2luY2UgaXQgaXMgbm8gbG9uZ2VyCisgICAgICAgIC8vIGluIHRoZSBjYWNoZQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBdHRlbXB0cyByZWF1dGhlbnRpY2F0aW9uIHRvIHRoZSBnaXZlbiA8Y29kZT5SZWFsbTwvY29kZT4gdXNpbmcKKyAgICAgKiB0aGUgY3JlZGVudGlhbHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzaW5nbGUgc2lnbi1vbiBzZXNzaW9uCisgICAgICogaWRlbnRpZmllZCBieSBhcmd1bWVudCA8Y29kZT5zc29JZDwvY29kZT4uCisgICAgICogPHA+CisgICAgICogSWYgcmVhdXRoZW50aWNhdGlvbiBpcyBzdWNjZXNzZnVsLCB0aGUgPGNvZGU+UHJpbmNpcGFsPC9jb2RlPiBhbmQKKyAgICAgKiBhdXRob3JpemF0aW9uIHR5cGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBTU08gc2Vzc2lvbiB3aWxsIGJlIGJvdW5kCisgICAgICogdG8gdGhlIGdpdmVuIDxjb2RlPlJlcXVlc3Q8L2NvZGU+IG9iamVjdCB2aWEgY2FsbHMgdG8gCisgICAgICoge0BsaW5rIFJlcXVlc3Qjc2V0QXV0aFR5cGUgUmVxdWVzdC5zZXRBdXRoVHlwZSgpfSBhbmQgCisgICAgICoge0BsaW5rIFJlcXVlc3Qjc2V0VXNlclByaW5jaXBhbCBSZXF1ZXN0LnNldFVzZXJQcmluY2lwYWwoKX0KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gc3NvSWQgICAgIGlkZW50aWZpZXIgb2YgU2luZ2xlU2lnbk9uIHNlc3Npb24gd2l0aCB3aGljaCB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgIGNhbGxlciBpcyBhc3NvY2lhdGVkCisgICAgICogQHBhcmFtIHJlYWxtICAgICBSZWFsbSBpbXBsZW1lbnRhdGlvbiBhZ2FpbnN0IHdoaWNoIHRoZSBjYWxsZXIgaXMgdG8KKyAgICAgKiAgICAgICAgICAgICAgICAgIGJlIGF1dGhlbnRpY2F0ZWQKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCAgIHRoZSByZXF1ZXN0IHRoYXQgbmVlZHMgdG8gYmUgYXV0aGVudGljYXRlZAorICAgICAqIAorICAgICAqIEByZXR1cm4gIDxjb2RlPnRydWU8L2NvZGU+IGlmIHJlYXV0aGVudGljYXRpb24gd2FzIHN1Y2Nlc3NmdWwsCisgICAgICogICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiByZWF1dGhlbnRpY2F0ZShTdHJpbmcgc3NvSWQsIFJlYWxtIHJlYWxtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVlc3QgcmVxdWVzdCkgeworCisgICAgICAgIGlmIChzc29JZCA9PSBudWxsIHx8IHJlYWxtID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgYm9vbGVhbiByZWF1dGhlbnRpY2F0ZWQgPSBmYWxzZTsKKworICAgICAgICBTaW5nbGVTaWduT25FbnRyeSBlbnRyeSA9IGxvb2t1cChzc29JZCk7CisgICAgICAgIGlmIChlbnRyeSAhPSBudWxsICYmIGVudHJ5LmdldENhblJlYXV0aGVudGljYXRlKCkpIHsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgU3RyaW5nIHVzZXJuYW1lID0gZW50cnkuZ2V0VXNlcm5hbWUoKTsKKyAgICAgICAgICAgIGlmICh1c2VybmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgUHJpbmNpcGFsIHJlYXV0aFByaW5jaXBhbCA9CisgICAgICAgICAgICAgICAgICAgICAgICByZWFsbS5hdXRoZW50aWNhdGUodXNlcm5hbWUsIGVudHJ5LmdldFBhc3N3b3JkKCkpOyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAocmVhdXRoUHJpbmNpcGFsICE9IG51bGwpIHsgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICByZWF1dGhlbnRpY2F0ZWQgPSB0cnVlOyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIC8vIEJpbmQgdGhlIGF1dGhvcml6YXRpb24gY3JlZGVudGlhbHMgdG8gdGhlIHJlcXVlc3QKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5zZXRBdXRoVHlwZShlbnRyeS5nZXRBdXRoVHlwZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5zZXRVc2VyUHJpbmNpcGFsKHJlYXV0aFByaW5jaXBhbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlYXV0aGVudGljYXRlZDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVyIHRoZSBzcGVjaWZpZWQgUHJpbmNpcGFsIGFzIGJlaW5nIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgICogdmFsdWUgZm9yIHRoZSBzaW5nbGUgc2lnbiBvbiBpZGVudGlmaWVyLgorICAgICAqCisgICAgICogQHBhcmFtIHNzb0lkIFNpbmdsZSBzaWduIG9uIGlkZW50aWZpZXIgdG8gcmVnaXN0ZXIKKyAgICAgKiBAcGFyYW0gcHJpbmNpcGFsIEFzc29jaWF0ZWQgdXNlciBwcmluY2lwYWwgdGhhdCBpcyBpZGVudGlmaWVkCisgICAgICogQHBhcmFtIGF1dGhUeXBlIEF1dGhlbnRpY2F0aW9uIHR5cGUgdXNlZCB0byBhdXRoZW50aWNhdGUgdGhpcworICAgICAqICB1c2VyIHByaW5jaXBhbAorICAgICAqIEBwYXJhbSB1c2VybmFtZSBVc2VybmFtZSB1c2VkIHRvIGF1dGhlbnRpY2F0ZSB0aGlzIHVzZXIKKyAgICAgKiBAcGFyYW0gcGFzc3dvcmQgUGFzc3dvcmQgdXNlZCB0byBhdXRoZW50aWNhdGUgdGhpcyB1c2VyCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXIoU3RyaW5nIHNzb0lkLCBQcmluY2lwYWwgcHJpbmNpcGFsLCBTdHJpbmcgYXV0aFR5cGUsCisgICAgICAgICAgICAgICAgICBTdHJpbmcgdXNlcm5hbWUsIFN0cmluZyBwYXNzd29yZCkgeworCisgICAgICAgIGlmIChjb250YWluZXIuZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGNvbnRhaW5lci5nZXRMb2dnZXIoKS5kZWJ1ZygiUmVnaXN0ZXJpbmcgc3NvIGlkICciICsgc3NvSWQgKyAiJyBmb3IgdXNlciAnIiArCisgICAgICAgICAgICAgICAgcHJpbmNpcGFsLmdldE5hbWUoKSArICInIHdpdGggYXV0aCB0eXBlICciICsgYXV0aFR5cGUgKyAiJyIpOworCisgICAgICAgIHN5bmNocm9uaXplZCAoY2FjaGUpIHsKKyAgICAgICAgICAgIGNhY2hlLnB1dChzc29JZCwgbmV3IFNpbmdsZVNpZ25PbkVudHJ5KHByaW5jaXBhbCwgYXV0aFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VybmFtZSwgcGFzc3dvcmQpKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBVcGRhdGVzIGFueSA8Y29kZT5TaW5nbGVTaWduT25FbnRyeTwvY29kZT4gZm91bmQgdW5kZXIga2V5CisgICAgICogPGNvZGU+c3NvSWQ8L2NvZGU+IHdpdGggdGhlIGdpdmVuIGF1dGhlbnRpY2F0aW9uIGRhdGEuCisgICAgICogPHA+CisgICAgICogVGhlIHB1cnBvc2Ugb2YgdGhpcyBtZXRob2QgaXMgdG8gYWxsb3cgYW4gU1NPIGVudHJ5IHRoYXQgd2FzCisgICAgICogZXN0YWJsaXNoZWQgd2l0aG91dCBhIHVzZXJuYW1lL3Bhc3N3b3JkIGNvbWJpbmF0aW9uIChpLmUuIGVzdGFibGlzaGVkCisgICAgICogZm9sbG93aW5nIERJR0VTVCBvciBDTElFTlQtQ0VSVCBhdXRoZW50aWNhdGlvbikgdG8gYmUgdXBkYXRlZCB3aXRoCisgICAgICogYSB1c2VybmFtZSBhbmQgcGFzc3dvcmQgaWYgb25lIGJlY29tZXMgYXZhaWxhYmxlIHRocm91Z2ggYSBzdWJzZXF1ZW50CisgICAgICogQkFTSUMgb3IgRk9STSBhdXRoZW50aWNhdGlvbi4gIFRoZSBTU08gZW50cnkgd2lsbCB0aGVuIGJlIHVzYWJsZSBmb3IKKyAgICAgKiByZWF1dGhlbnRpY2F0aW9uLgorICAgICAqIDxwPgorICAgICAqIDxiPk5PVEU6PC9iPiBPbmx5IHVwZGF0ZXMgdGhlIFNTTyBlbnRyeSBpZiBhIGNhbGwgdG8KKyAgICAgKiA8Y29kZT5TaW5nbGVTaWduT25FbnRyeS5nZXRDYW5SZWF1dGhlbnRpY2F0ZSgpPC9jb2RlPiByZXR1cm5zCisgICAgICogPGNvZGU+ZmFsc2U8L2NvZGU+OyBvdGhlcndpc2UsIGl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgU1NPIGVudHJ5IGFscmVhZHkKKyAgICAgKiBoYXMgc3VmZmljaWVudCBpbmZvcm1hdGlvbiB0byBhbGxvdyByZWF1dGhlbnRpY2F0aW9uIGFuZCB0aGF0IG5vIHVwZGF0ZQorICAgICAqIGlzIG5lZWRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzc29JZCAgICAgaWRlbnRpZmllciBvZiBTaW5nbGUgc2lnbiB0byBiZSB1cGRhdGVkCisgICAgICogQHBhcmFtIHByaW5jaXBhbCB0aGUgPGNvZGU+UHJpbmNpcGFsPC9jb2RlPiByZXR1cm5lZCBieSB0aGUgbGF0ZXN0CisgICAgICogICAgICAgICAgICAgICAgICBjYWxsIHRvIDxjb2RlPlJlYWxtLmF1dGhlbnRpY2F0ZTwvY29kZT4uCisgICAgICogQHBhcmFtIGF1dGhUeXBlICB0aGUgdHlwZSBvZiBhdXRoZW50aWNhdG9yIHVzZWQgKEJBU0lDLCBDTElFTlQtQ0VSVCwKKyAgICAgKiAgICAgICAgICAgICAgICAgIERJR0VTVCBvciBGT1JNKQorICAgICAqIEBwYXJhbSB1c2VybmFtZSAgdGhlIHVzZXJuYW1lIChpZiBhbnkpIHVzZWQgZm9yIHRoZSBhdXRoZW50aWNhdGlvbgorICAgICAqIEBwYXJhbSBwYXNzd29yZCAgdGhlIHBhc3N3b3JkIChpZiBhbnkpIHVzZWQgZm9yIHRoZSBhdXRoZW50aWNhdGlvbgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZShTdHJpbmcgc3NvSWQsIFByaW5jaXBhbCBwcmluY2lwYWwsIFN0cmluZyBhdXRoVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVzZXJuYW1lLCBTdHJpbmcgcGFzc3dvcmQpIHsKKworICAgICAgICBTaW5nbGVTaWduT25FbnRyeSBzc28gPSBsb29rdXAoc3NvSWQpOworICAgICAgICBpZiAoc3NvICE9IG51bGwgJiYgIXNzby5nZXRDYW5SZWF1dGhlbnRpY2F0ZSgpKSB7CisgICAgICAgICAgICBpZiAoY29udGFpbmVyLmdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgY29udGFpbmVyLmdldExvZ2dlcigpLmRlYnVnKCJVcGRhdGUgc3NvIGlkICIgKyBzc29JZCArICIgdG8gYXV0aCB0eXBlICIgKyBhdXRoVHlwZSk7CisKKyAgICAgICAgICAgIHN5bmNocm9uaXplZChzc28pIHsKKyAgICAgICAgICAgICAgICBzc28udXBkYXRlQ3JlZGVudGlhbHMocHJpbmNpcGFsLCBhdXRoVHlwZSwgdXNlcm5hbWUsIHBhc3N3b3JkKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBMb29rIHVwIGFuZCByZXR1cm4gdGhlIGNhY2hlZCBTaW5nbGVTaWduT24gZW50cnkgYXNzb2NpYXRlZCB3aXRoIHRoaXMKKyAgICAgKiBzc28gaWQgdmFsdWUsIGlmIHRoZXJlIGlzIG9uZTsgb3RoZXJ3aXNlIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzc29JZCBTaW5nbGUgc2lnbiBvbiBpZGVudGlmaWVyIHRvIGxvb2sgdXAKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU2luZ2xlU2lnbk9uRW50cnkgbG9va3VwKFN0cmluZyBzc29JZCkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAoY2FjaGUpIHsKKyAgICAgICAgICAgIHJldHVybiAoKFNpbmdsZVNpZ25PbkVudHJ5KSBjYWNoZS5nZXQoc3NvSWQpKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgCisgICAgLyoqCisgICAgICogUmVtb3ZlIGEgc2luZ2xlIFNlc3Npb24gZnJvbSBhIFNpbmdsZVNpZ25Pbi4gIENhbGxlZCB3aGVuCisgICAgICogYSBzZXNzaW9uIGlzIHRpbWVkIG91dCBhbmQgbm8gbG9uZ2VyIGFjdGl2ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzc29JZCBTaW5nbGUgc2lnbiBvbiBpZGVudGlmaWVyIGZyb20gd2hpY2ggdG8gcmVtb3ZlIHRoZSBzZXNzaW9uLgorICAgICAqIEBwYXJhbSBzZXNzaW9uIHRoZSBzZXNzaW9uIHRvIGJlIHJlbW92ZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU2Vzc2lvbihTdHJpbmcgc3NvSWQsIFNlc3Npb24gc2Vzc2lvbikgeworCisgICAgICAgIGlmIChjb250YWluZXIuZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGNvbnRhaW5lci5nZXRMb2dnZXIoKS5kZWJ1ZygiUmVtb3Zpbmcgc2Vzc2lvbiAiICsgc2Vzc2lvbi50b1N0cmluZygpICsgIiBmcm9tIHNzbyBpZCAiICsgCisgICAgICAgICAgICAgICAgc3NvSWQgKTsKKworICAgICAgICAvLyBHZXQgYSByZWZlcmVuY2UgdG8gdGhlIFNpbmdsZVNpZ25PbgorICAgICAgICBTaW5nbGVTaWduT25FbnRyeSBlbnRyeSA9IGxvb2t1cChzc29JZCk7CisgICAgICAgIGlmIChlbnRyeSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8vIFJlbW92ZSB0aGUgaW5hY3RpdmUgc2Vzc2lvbiBmcm9tIFNpbmdsZVNpZ25PbkVudHJ5CisgICAgICAgIGVudHJ5LnJlbW92ZVNlc3Npb24oc2Vzc2lvbik7CisKKyAgICAgICAgLy8gUmVtb3ZlIHRoZSBpbmFjdGl2ZSBzZXNzaW9uIGZyb20gdGhlICdyZXZlcnNlJyBNYXAuCisgICAgICAgIHN5bmNocm9uaXplZChyZXZlcnNlKSB7CisgICAgICAgICAgICByZXZlcnNlLnJlbW92ZShzZXNzaW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIElmIHRoZXJlIGFyZSBub3Qgc2Vzc2lvbnMgbGVmdCBpbiB0aGUgU2luZ2xlU2lnbk9uRW50cnksCisgICAgICAgIC8vIGRlcmVnaXN0ZXIgdGhlIGVudHJ5LgorICAgICAgICBpZiAoZW50cnkuZmluZFNlc3Npb25zKCkubGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgIGRlcmVnaXN0ZXIoc3NvSWQpOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvYXV0aGVudGljYXRvci9TaW5nbGVTaWduT25FbnRyeS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2F1dGhlbnRpY2F0b3IvU2luZ2xlU2lnbk9uRW50cnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2U5MTk2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2F1dGhlbnRpY2F0b3IvU2luZ2xlU2lnbk9uRW50cnkuamF2YQpAQCAtMCwwICsxLDE4OSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LTIwMDEsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuYXV0aGVudGljYXRvcjsKKworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5TZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuYXV0aGVudGljYXRvci5Db25zdGFudHM7CisKKy8qKgorICogQSBjbGFzcyB0aGF0IHJlcHJlc2VudHMgZW50cmllcyBpbiB0aGUgY2FjaGUgb2YgYXV0aGVudGljYXRlZCB1c2Vycy4KKyAqIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIG1ha2UgaXQgYXZhaWxhYmxlIHRvCisgKiA8Y29kZT5BdXRoZW50aWNhdG9yQmFzZTwvY29kZT4gc3ViY2xhc3NlcyB0aGF0IG5lZWQgaXQgaW4gb3JkZXIgdG8gcGVyZm9ybQorICogcmVhdXRoZW50aWNhdGlvbnMgd2hlbiBTaW5nbGVTaWduT24gaXMgaW4gdXNlLgorICoKKyAqIEBhdXRob3IgIEIgU3RhbnNiZXJyeSwgYmFzZWQgb24gd29yayBieSBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKgorICogQHNlZSBTaW5nbGVTaWduT24KKyAqIEBzZWUgQXV0aGVudGljYXRvckJhc2UjcmVhdXRoZW50aWNhdGVGcm9tU1NPCisgKi8KK3B1YmxpYyBjbGFzcyBTaW5nbGVTaWduT25FbnRyeQoreworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgSW5zdGFuY2UgRmllbGRzCisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGF1dGhUeXBlID0gbnVsbDsKKworICAgIHByb3RlY3RlZCBTdHJpbmcgcGFzc3dvcmQgPSBudWxsOworCisgICAgcHJvdGVjdGVkIFByaW5jaXBhbCBwcmluY2lwYWwgPSBudWxsOworCisgICAgcHJvdGVjdGVkIFNlc3Npb24gc2Vzc2lvbnNbXSA9IG5ldyBTZXNzaW9uWzBdOworCisgICAgcHJvdGVjdGVkIFN0cmluZyB1c2VybmFtZSA9IG51bGw7CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjYW5SZWF1dGhlbnRpY2F0ZSA9IGZhbHNlOworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBDb25zdHJ1Y3RvcnMKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgU2luZ2xlU2lnbk9uRW50cnkKKyAgICAgKgorICAgICAqIEBwYXJhbSBwcmluY2lwYWwgdGhlIDxjb2RlPlByaW5jaXBhbDwvY29kZT4gcmV0dXJuZWQgYnkgdGhlIGxhdGVzdAorICAgICAqICAgICAgICAgICAgICAgICAgY2FsbCB0byA8Y29kZT5SZWFsbS5hdXRoZW50aWNhdGU8L2NvZGU+LgorICAgICAqIEBwYXJhbSBhdXRoVHlwZSAgdGhlIHR5cGUgb2YgYXV0aGVudGljYXRvciB1c2VkIChCQVNJQywgQ0xJRU5ULUNFUlQsCisgICAgICogICAgICAgICAgICAgICAgICBESUdFU1Qgb3IgRk9STSkKKyAgICAgKiBAcGFyYW0gdXNlcm5hbWUgIHRoZSB1c2VybmFtZSAoaWYgYW55KSB1c2VkIGZvciB0aGUgYXV0aGVudGljYXRpb24KKyAgICAgKiBAcGFyYW0gcGFzc3dvcmQgIHRoZSBwYXNzd29yZCAoaWYgYW55KSB1c2VkIGZvciB0aGUgYXV0aGVudGljYXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgU2luZ2xlU2lnbk9uRW50cnkoUHJpbmNpcGFsIHByaW5jaXBhbCwgU3RyaW5nIGF1dGhUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdXNlcm5hbWUsIFN0cmluZyBwYXNzd29yZCkgeworICAgICAgICBzdXBlcigpOworICAgICAgICB1cGRhdGVDcmVkZW50aWFscyhwcmluY2lwYWwsIGF1dGhUeXBlLCB1c2VybmFtZSwgcGFzc3dvcmQpOworICAgIH0KKworICAgIHB1YmxpYyBTaW5nbGVTaWduT25FbnRyeSgpIHsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBhY2thZ2UgTWV0aG9kcworCisgICAgLyoqCisgICAgICogQWRkcyBhIDxjb2RlPlNlc3Npb248L2NvZGU+IHRvIHRoZSBsaXN0IG9mIHRob3NlIGFzc29jaWF0ZWQgd2l0aAorICAgICAqIHRoaXMgU1NPLgorICAgICAqCisgICAgICogQHBhcmFtIHNzbyAgICAgICBUaGUgPGNvZGU+U2luZ2xlU2lnbk9uPC9jb2RlPiB2YWx2ZSB0aGF0IGlzIG1hbmFnaW5nCisgICAgICogICAgICAgICAgICAgICAgICB0aGUgU1NPIHNlc3Npb24uCisgICAgICogQHBhcmFtIHNlc3Npb24gICBUaGUgPGNvZGU+U2Vzc2lvbjwvY29kZT4gYmVpbmcgYXNzb2NpYXRlZCB3aXRoIHRoZSBTU08uCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZFNlc3Npb24oU2luZ2xlU2lnbk9uIHNzbywgU2Vzc2lvbiBzZXNzaW9uKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2Vzc2lvbnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChzZXNzaW9uID09IHNlc3Npb25zW2ldKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBTZXNzaW9uIHJlc3VsdHNbXSA9IG5ldyBTZXNzaW9uW3Nlc3Npb25zLmxlbmd0aCArIDFdOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHNlc3Npb25zLCAwLCByZXN1bHRzLCAwLCBzZXNzaW9ucy5sZW5ndGgpOworICAgICAgICByZXN1bHRzW3Nlc3Npb25zLmxlbmd0aF0gPSBzZXNzaW9uOworICAgICAgICBzZXNzaW9ucyA9IHJlc3VsdHM7CisgICAgICAgIHNlc3Npb24uYWRkU2Vzc2lvbkxpc3RlbmVyKHNzbyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlcyB0aGUgZ2l2ZW4gPGNvZGU+U2Vzc2lvbjwvY29kZT4gZnJvbSB0aGUgbGlzdCBvZiB0aG9zZQorICAgICAqIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFNTTy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXNzaW9uICB0aGUgPGNvZGU+U2Vzc2lvbjwvY29kZT4gdG8gcmVtb3ZlLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVTZXNzaW9uKFNlc3Npb24gc2Vzc2lvbikgeworICAgICAgICBTZXNzaW9uW10gbnNlc3Npb25zID0gbmV3IFNlc3Npb25bc2Vzc2lvbnMubGVuZ3RoIC0gMV07CisgICAgICAgIGZvciAoaW50IGkgPSAwLCBqID0gMDsgaSA8IHNlc3Npb25zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoc2Vzc2lvbiA9PSBzZXNzaW9uc1tpXSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIG5zZXNzaW9uc1tqKytdID0gc2Vzc2lvbnNbaV07CisgICAgICAgIH0KKyAgICAgICAgc2Vzc2lvbnMgPSBuc2Vzc2lvbnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgPGNvZGU+U2Vzc2lvbjwvY29kZT5zIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFNTTy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIFNlc3Npb25bXSBmaW5kU2Vzc2lvbnMoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5zZXNzaW9ucyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbmFtZSBvZiB0aGUgYXV0aGVudGljYXRpb24gdHlwZSBvcmlnaW5hbGx5IHVzZWQgdG8gYXV0aGVudGljYXRlCisgICAgICogdGhlIHVzZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBTU08uCisgICAgICoKKyAgICAgKiBAcmV0dXJuICJCQVNJQyIsICJDTElFTlQtQ0VSVCIsICJESUdFU1QiLCAiRk9STSIgb3IgIk5PTkUiCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRBdXRoVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLmF1dGhUeXBlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHdoZXRoZXIgdGhlIGF1dGhlbnRpY2F0aW9uIHR5cGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcmlnaW5hbAorICAgICAqIGF1dGhlbnRpY2F0aW9uIHN1cHBvcnRzIHJlYXV0aGVudGljYXRpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuICA8Y29kZT50cnVlPC9jb2RlPiBpZiA8Y29kZT5nZXRBdXRoVHlwZTwvY29kZT4gcmV0dXJucworICAgICAqICAgICAgICAgICJCQVNJQyIgb3IgIkZPUk0iLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldENhblJlYXV0aGVudGljYXRlKCkgeworICAgICAgICByZXR1cm4gKHRoaXMuY2FuUmVhdXRoZW50aWNhdGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHBhc3N3b3JkIGNyZWRlbnRpYWwgKGlmIGFueSkgYXNzb2NpYXRlZCB3aXRoIHRoZSBTU08uCisgICAgICoKKyAgICAgKiBAcmV0dXJuICB0aGUgcGFzc3dvcmQgY3JlZGVudGlhbCBhc3NvY2lhdGVkIHdpdGggdGhlIFNTTywgb3IKKyAgICAgKiAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgb3JpZ2luYWwgYXV0aGVudGljYXRpb24gdHlwZQorICAgICAqICAgICAgICAgIGRvZXMgbm90IGludm9sdmUgYSBwYXNzd29yZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhc3N3b3JkKCkgeworICAgICAgICByZXR1cm4gKHRoaXMucGFzc3dvcmQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIDxjb2RlPlByaW5jaXBhbDwvY29kZT4gdGhhdCBoYXMgYmVlbiBhdXRoZW50aWNhdGVkIGJ5CisgICAgICogdGhlIFNTTy4KKyAgICAgKi8KKyAgICBwdWJsaWMgUHJpbmNpcGFsIGdldFByaW5jaXBhbCgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLnByaW5jaXBhbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdXNlcm5hbWUgcHJvdmlkZWQgYnkgdGhlIHVzZXIgYXMgcGFydCBvZiB0aGUgYXV0aGVudGljYXRpb24KKyAgICAgKiBwcm9jZXNzLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXNlcm5hbWUoKSB7CisgICAgICAgIHJldHVybiAodGhpcy51c2VybmFtZSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBVcGRhdGVzIHRoZSBTaW5nbGVTaWduT25FbnRyeSB0byByZWZsZWN0IHRoZSBsYXRlc3Qgc2VjdXJpdHkKKyAgICAgKiBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGNhbGxlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcmluY2lwYWwgdGhlIDxjb2RlPlByaW5jaXBhbDwvY29kZT4gcmV0dXJuZWQgYnkgdGhlIGxhdGVzdAorICAgICAqICAgICAgICAgICAgICAgICAgY2FsbCB0byA8Y29kZT5SZWFsbS5hdXRoZW50aWNhdGU8L2NvZGU+LgorICAgICAqIEBwYXJhbSBhdXRoVHlwZSAgdGhlIHR5cGUgb2YgYXV0aGVudGljYXRvciB1c2VkIChCQVNJQywgQ0xJRU5ULUNFUlQsCisgICAgICogICAgICAgICAgICAgICAgICBESUdFU1Qgb3IgRk9STSkKKyAgICAgKiBAcGFyYW0gdXNlcm5hbWUgIHRoZSB1c2VybmFtZSAoaWYgYW55KSB1c2VkIGZvciB0aGUgYXV0aGVudGljYXRpb24KKyAgICAgKiBAcGFyYW0gcGFzc3dvcmQgIHRoZSBwYXNzd29yZCAoaWYgYW55KSB1c2VkIGZvciB0aGUgYXV0aGVudGljYXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB1cGRhdGVDcmVkZW50aWFscyhQcmluY2lwYWwgcHJpbmNpcGFsLCBTdHJpbmcgYXV0aFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVzZXJuYW1lLCBTdHJpbmcgcGFzc3dvcmQpIHsKKworICAgICAgICB0aGlzLnByaW5jaXBhbCA9IHByaW5jaXBhbDsKKyAgICAgICAgdGhpcy5hdXRoVHlwZSA9IGF1dGhUeXBlOworICAgICAgICB0aGlzLnVzZXJuYW1lID0gdXNlcm5hbWU7CisgICAgICAgIHRoaXMucGFzc3dvcmQgPSBwYXNzd29yZDsKKyAgICAgICAgdGhpcy5jYW5SZWF1dGhlbnRpY2F0ZSA9CisgICAgICAgICAgICAoQ29uc3RhbnRzLkJBU0lDX01FVEhPRC5lcXVhbHMoYXV0aFR5cGUpCisgICAgICAgICAgICAgICAgfHwgQ29uc3RhbnRzLkZPUk1fTUVUSE9ELmVxdWFscyhhdXRoVHlwZSkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2F1dGhlbnRpY2F0b3IvbWJlYW5zLWRlc2NyaXB0b3JzLnhtbCBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hdXRoZW50aWNhdG9yL21iZWFucy1kZXNjcmlwdG9ycy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU0ZGYxNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hdXRoZW50aWNhdG9yL21iZWFucy1kZXNjcmlwdG9ycy54bWwKQEAgLTAsMCArMSwxNDggQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPG1iZWFucy1kZXNjcmlwdG9ycz4KKworICA8bWJlYW4gbmFtZT0iQmFzaWNBdXRoZW50aWNhdG9yIgorICAgICAgICAgZGVzY3JpcHRpb249IkFuIEF1dGhlbnRpY2F0b3IgYW5kIFZhbHZlIGltcGxlbWVudGF0aW9uIG9mIEhUVFAgQkFTSUMgQXV0aGVudGljYXRpb24iCisgICAgICAgICBkb21haW49IkNhdGFsaW5hIgorICAgICAgICAgZ3JvdXA9IlZhbHZlIgorICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5hdXRoZW50aWNhdG9yLkJhc2ljQXV0aGVudGljYXRvciI+CisgICAgCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImFsZ29yaXRobSIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgbWVzc2FnZSBkaWdlc3QgYWxnb3JpdGhtIHRvIGJlIHVzZWQgd2hlbiBnZW5lcmF0aW5nIHNlc3Npb24gaWRlbnRpZmllcnMiCisgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgICAKKyAgICA8YXR0cmlidXRlIG5hbWU9ImNhY2hlIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlNob3VsZCB3ZSBjYWNoZSBhdXRoZW50aWNhdGVkIFByaW5jaXBhbHMgaWYgdGhlIHJlcXVlc3QgaXMgcGFydCBvZiBhbiBIVFRQIHNlc3Npb24/IgorICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIvPgorICAgICAgCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImNsYXNzTmFtZSIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJGdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgbWFuYWdlZCBvYmplY3QiCisgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgICAgCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJlbnRyb3B5IgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IkEgU3RyaW5nIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlciB1c2VkIHRvIGluY3JlYXNlIHRoZSAgZW50cm9weSBvZiB0aGUgaW5pdGlhbGl6YXRpb24gb2Ygb3VyIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIgorICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICA8L21iZWFuPgorICAKKyAgCisgIDxtYmVhbiBuYW1lPSJEaWdlc3RBdXRoZW50aWNhdG9yIgorICAgICAgICAgZGVzY3JpcHRpb249IkFuIEF1dGhlbnRpY2F0b3IgYW5kIFZhbHZlIGltcGxlbWVudGF0aW9uIG9mIEhUVFAgRElHRVNUIEF1dGhlbnRpY2F0aW9uIgorICAgICAgICAgZG9tYWluPSJDYXRhbGluYSIKKyAgICAgICAgIGdyb3VwPSJWYWx2ZSIKKyAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuYXV0aGVudGljYXRvci5EaWdlc3RBdXRoZW50aWNhdG9yIj4KKyAgICAKKyAgICA8YXR0cmlidXRlIG5hbWU9ImFsZ29yaXRobSIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgbWVzc2FnZSBkaWdlc3QgYWxnb3JpdGhtIHRvIGJlIHVzZWQgd2hlbiBnZW5lcmF0aW5nIHNlc3Npb24gaWRlbnRpZmllcnMiCisgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgICAKKyAgICA8YXR0cmlidXRlIG5hbWU9ImNhY2hlIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlNob3VsZCB3ZSBjYWNoZSBhdXRoZW50aWNhdGVkIFByaW5jaXBhbHMgaWYgdGhlIHJlcXVlc3QgaXMgcGFydCBvZiBhbiBIVFRQIHNlc3Npb24/IgorICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImNsYXNzTmFtZSIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJGdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgbWFuYWdlZCBvYmplY3QiCisgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgICAgCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImVudHJvcHkiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iQSBTdHJpbmcgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyIHVzZWQgdG8gaW5jcmVhc2UgdGhlICBlbnRyb3B5IG9mIHRoZSBpbml0aWFsaXphdGlvbiBvZiBvdXIgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IiCisgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgIDwvbWJlYW4+CisgIAorICA8bWJlYW4gbmFtZT0iRm9ybUF1dGhlbnRpY2F0b3IiCisgICAgICAgICBkZXNjcmlwdGlvbj0iQW4gQXV0aGVudGljYXRvciBhbmQgVmFsdmUgaW1wbGVtZW50YXRpb24gb2YgRk9STSBCQVNFRCBBdXRoZW50aWNhdGlvbiIKKyAgICAgICAgIGRvbWFpbj0iQ2F0YWxpbmEiCisgICAgICAgICBncm91cD0iVmFsdmUiCisgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmF1dGhlbnRpY2F0b3IuRm9ybUF1dGhlbnRpY2F0b3IiPgorICAgIAorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJhbGdvcml0aG0iCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIG1lc3NhZ2UgZGlnZXN0IGFsZ29yaXRobSB0byBiZSB1c2VkIHdoZW4gZ2VuZXJhdGluZyBzZXNzaW9uIGlkZW50aWZpZXJzIgorICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgICAgCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImNhY2hlIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlNob3VsZCB3ZSBjYWNoZSBhdXRoZW50aWNhdGVkIFByaW5jaXBhbHMgaWYgdGhlIHJlcXVlc3QgaXMgcGFydCBvZiBhbiBIVFRQIHNlc3Npb24/IgorICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImNsYXNzTmFtZSIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJGdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgbWFuYWdlZCBvYmplY3QiCisgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImVudHJvcHkiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iQSBTdHJpbmcgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyIHVzZWQgdG8gaW5jcmVhc2UgdGhlIGVudHJvcHkgb2YgdGhlIGluaXRpYWxpemF0aW9uIG9mIG91ciByYW5kb20gbnVtYmVyIGdlbmVyYXRvciIKKyAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgPC9tYmVhbj4KKyAgCisgIDxtYmVhbiBuYW1lPSJOb25Mb2dpbkF1dGhlbnRpY2F0b3IiCisgICAgICAgICBkZXNjcmlwdGlvbj0iQW4gQXV0aGVudGljYXRvciBhbmQgVmFsdmUgaW1wbGVtZW50YXRpb24gdGhhdCBjaGVja3Mgb25seSBzZWN1cml0eSBjb25zdHJhaW50cyBub3QgaW52b2x2aW5nIHVzZXIgYXV0aGVudGljYXRpb24iCisgICAgICAgICBkb21haW49IkNhdGFsaW5hIgorICAgICAgICAgZ3JvdXA9IlZhbHZlIgorICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5hdXRoZW50aWNhdG9yLk5vbkxvZ2luQXV0aGVudGljYXRvciI+CisgICAgCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJhbGdvcml0aG0iCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIG1lc3NhZ2UgZGlnZXN0IGFsZ29yaXRobSB0byBiZSB1c2VkIHdoZW4gZ2VuZXJhdGluZyBzZXNzaW9uIGlkZW50aWZpZXJzIgorICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgICAgCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJjYWNoZSIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJTaG91bGQgd2UgY2FjaGUgYXV0aGVudGljYXRlZCBQcmluY2lwYWxzIGlmIHRoZSByZXF1ZXN0IGlzIHBhcnQgb2YgYW4gSFRUUCBzZXNzaW9uPyIKKyAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iLz4KKyAgICAgIAorICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NOYW1lIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IkZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBtYW5hZ2VkIG9iamVjdCIKKyAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9ImRlYnVnIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBkZWJ1Z2dpbmcgZGV0YWlsIGxldmVsIGZvciB0aGlzIGNvbXBvbmVudCIKKyAgICAgICAgICAgICAgIHR5cGU9ImludCIvPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJlbnRyb3B5IgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IkEgU3RyaW5nIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlciB1c2VkIHRvIGluY3JlYXNlIHRoZSBlbnRyb3B5IG9mIHRoZSBpbml0aWFsaXphdGlvbiBvZiBvdXIgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IiCisgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgIDwvbWJlYW4+CisgIAorICAKKyAgPG1iZWFuIG5hbWU9IlNpbmdsZVNpZ25PbiIKKyAgICAgICAgIGRlc2NyaXB0aW9uPSJBIFZhbHZlIHRoYXQgc3VwcG9ydHMgYSAnc2luZ2xlIHNpZ25vbicgdXNlciBleHBlcmllbmNlIgorICAgICAgICAgZG9tYWluPSJDYXRhbGluYSIKKyAgICAgICAgIGdyb3VwPSJWYWx2ZSIKKyAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuYXV0aGVudGljYXRvci5TaW5nbGVTaWduT24iPgorICAgIAorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJjbGFzc05hbWUiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iRnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIG1hbmFnZWQgb2JqZWN0IgorICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICAgIAorICAgIDxhdHRyaWJ1dGUgbmFtZT0icmVxdWlyZVJlYXV0aGVudGljYXRpb24iCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iU2hvdWxkIHdlIGF0dGVtcHQgdG8gcmVhdXRoZW50aWNhdGUgZWFjaCByZXF1ZXN0IGFnYWluc3QgdGhlIHNlY3VyaXR5IFJlYWxtPyIKKyAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iLz4KKyAgICAgIAorICA8L21iZWFuPgorCisKKyAgPG1iZWFuICBuYW1lPSJTU0xBdXRoZW50aWNhdG9yIgorICAgICAgICAgZGVzY3JpcHRpb249IkFuIEF1dGhlbnRpY2F0b3IgYW5kIFZhbHZlIGltcGxlbWVudGF0aW9uIG9mIGF1dGhlbnRpY2F0aW9uIHRoYXQgdXRpbGl6ZXMgU1NMIGNlcnRpZmljYXRlcyB0byBpZGVudGlmeSBjbGllbnQgdXNlcnMiCisgICAgICAgICBkb21haW49IkNhdGFsaW5hIgorICAgICAgICAgZ3JvdXA9IlZhbHZlIgorICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5hdXRoZW50aWNhdG9yLlNTTEF1dGhlbnRpY2F0b3IiPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJhbGdvcml0aG0iCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIG1lc3NhZ2UgZGlnZXN0IGFsZ29yaXRobSB0byBiZSB1c2VkIHdoZW4gZ2VuZXJhdGluZyBzZXNzaW9uIGlkZW50aWZpZXJzIgorICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgICAgCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJjYWNoZSIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJTaG91bGQgd2UgY2FjaGUgYXV0aGVudGljYXRlZCBQcmluY2lwYWxzIGlmIHRoZSByZXF1ZXN0IGlzIHBhcnQgb2YgYW4gSFRUUCBzZXNzaW9uPyIKKyAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iLz4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NOYW1lIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IkZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBtYW5hZ2VkIG9iamVjdCIKKyAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9ImVudHJvcHkiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iQSBTdHJpbmcgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyIHVzZWQgdG8gaW5jcmVhc2UgdGhlIGVudHJvcHkgb2YgdGhlIGluaXRpYWxpemF0aW9uIG9mIG91ciByYW5kb20gbnVtYmVyIGdlbmVyYXRvciIKKyAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgPC9tYmVhbj4KKyAgCis8L21iZWFucy1kZXNjcmlwdG9ycz4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hdXRoZW50aWNhdG9yL3BhY2thZ2UuaHRtbCBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9hdXRoZW50aWNhdG9yL3BhY2thZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTgxNGYyCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2F1dGhlbnRpY2F0b3IvcGFja2FnZS5odG1sCkBAIC0wLDAgKzEsMzggQEAKKzxib2R5PgorCis8cD5UaGlzIHBhY2thZ2UgY29udGFpbnMgPGNvZGU+QXV0aGVudGljYXRvcjwvY29kZT4gaW1wbGVtZW50YXRpb25zIGZvciB0aGUKK3ZhcmlvdXMgc3VwcG9ydGVkIGF1dGhlbnRpY2F0aW9uIG1ldGhvZHMgKEJBU0lDLCBESUdFU1QsIGFuZCBGT1JNKS4gIEluCithZGRpdGlvbiwgdGhlcmUgaXMgYSBjb252ZW5pZW5jZSBiYXNlIGNsYXNzLAorPGNvZGU+QXV0aGVudGljYXRvckJhc2U8L2NvZGU+LCBmb3IgY3VzdG9taXplZCA8Y29kZT5BdXRoZW50aWNhdG9yPC9jb2RlPgoraW1wbGVtZW50YXRpb25zLjwvcD4KKworPHA+SWYgeW91IGFyZSB1c2luZyB0aGUgc3RhbmRhcmQgY29udGV4dCBjb25maWd1cmF0aW9uIGNsYXNzCisoPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5zdGFydHVwLkNvbnRleHRDb25maWc8L2NvZGU+KSB0byBjb25maWd1cmUgdGhlCitBdXRoZW50aWNhdG9yIGFzc29jaWF0ZWQgd2l0aCBhIHBhcnRpY3VsYXIgY29udGV4dCwgeW91IGNhbiByZWdpc3RlciB0aGUgSmF2YQorY2xhc3MgdG8gYmUgdXNlZCBmb3IgZWFjaCBwb3NzaWJsZSBhdXRoZW50aWNhdGlvbiBtZXRob2QgYnkgbW9kaWZ5aW5nIHRoZQorZm9sbG93aW5nIFByb3BlcnRpZXMgZmlsZTo8L3A+Cis8cHJlPgorICAgIHNyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvQXV0aGVudGljYXRvcnMucHJvcGVydGllcworPC9wcmU+CisKKzxwPkVhY2ggb2YgdGhlIHN0YW5kYXJkIGltcGxlbWVudGF0aW9ucyBleHRlbmRzIGEgY29tbW9uIGJhc2UgY2xhc3MKKyg8Y29kZT5BdXRoZW50aWNhdG9yQmFzZTwvY29kZT4pLCB3aGljaCBpcyBjb25maWd1cmVkIGJ5IHNldHRpbmcgdGhlCitmb2xsb3dpbmcgSmF2YUJlYW5zIHByb3BlcnRpZXMgKHdpdGggZGVmYXVsdCB2YWx1ZXMgaW4gc3F1YXJlIGJyYWNrZXRzKTo8L3A+Cis8dWw+Cis8bGk+PGI+Y2FjaGU8L2I+IC0gU2hvdWxkIHdlIGNhY2hlIGF1dGhlbnRpY2F0ZWQgUHJpbmNpcGFscyAodGh1cyBhdm9pZGluZworICAgIHBlci1yZXF1ZXN0IGxvb2t1cHMgaW4gb3VyIHVuZGVyeWxpbmcgPGNvZGU+UmVhbG08L2NvZGU+KSBpZiB0aGlzIHJlcXVlc3QKKyAgICBpcyBwYXJ0IG9mIGFuIEhUVFAgc2Vzc2lvbj8gIFt0cnVlXTwvbGk+Cis8bGk+PGI+ZGVidWc8L2I+IC0gRGVidWdnaW5nIGRldGFpbCBsZXZlbCBmb3IgdGhpcyBjb21wb25lbnQuICBbMF08L2xpPgorPC91bD4KKworPHA+VGhlIHN0YW5kYXJkIGF1dGhlbnRpY2F0aW9uIG1ldGhvZHMgdGhhdCBhcmUgY3VycmVudGx5IHByb3ZpZGVkIGluY2x1ZGU6PC9wPgorPHVsPgorPGxpPjxiPkJhc2ljQXV0aGVudGljYXRvcjwvYj4gLSBJbXBsZW1lbnRzIEhUVFAgQkFTSUMgYXV0aGVudGljYXRpb24sIGFzCisgICAgZGVzY3JpYmVkIGluIFJGQyAyNjE3LjwvbGk+Cis8bGk+PGI+RGlnZXN0QXV0aGVudGljYXRvcjwvYj4gLSBJbXBsZW1lbnRzIEhUVFAgRElHRVNUIGF1dGhlbnRpY2F0aW9uLCBhcworICAgIGRlc2NyaWJlZCBpbiBSRkMgMjYxNy48L2xpPgorPGxpPjxiPkZvcm1BdXRoZW50aWNhdG9yPC9iPiAtIEltcGxlbWVudHMgRk9STS1CQVNFRCBhdXRoZW50aWNhdGlvbiwgYXMKKyAgICBkZXNjcmliZWQgaW4gdGhlIFNlcnZsZXQgQVBJIFNwZWNpZmljYXRpb24sIHZlcnNpb24gMi4yLjwvbGk+Cis8L3VsPgorCis8L2JvZHk+CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29ubmVjdG9yL0NsaWVudEFib3J0RXhjZXB0aW9uLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29ubmVjdG9yL0NsaWVudEFib3J0RXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY1MGNkNAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb25uZWN0b3IvQ2xpZW50QWJvcnRFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDE0NCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3I7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCisvKioKKyAqIFdyYXAgYW4gSU9FeGNlcHRpb24gaWRlbnRpZnlpbmcgaXQgYXMgYmVpbmcgY2F1c2VkIGJ5IGFuIGFib3J0CisgKiBvZiBhIHJlcXVlc3QgYnkgYSByZW1vdGUgY2xpZW50LgorICoKKyAqIEBhdXRob3IgR2xlbm4gTC4gTmllbHNlbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgQ2xpZW50QWJvcnRFeGNlcHRpb24gZXh0ZW5kcyBJT0V4Y2VwdGlvbiB7CisKKworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgQ2xpZW50QWJvcnRFeGNlcHRpb24gd2l0aCBubyBvdGhlciBpbmZvcm1hdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xpZW50QWJvcnRFeGNlcHRpb24oKSB7CisKKyAgICAgICAgdGhpcyhudWxsLCBudWxsKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IENsaWVudEFib3J0RXhjZXB0aW9uIGZvciB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVzc2FnZSBNZXNzYWdlIGRlc2NyaWJpbmcgdGhpcyBleGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xpZW50QWJvcnRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKKworICAgICAgICB0aGlzKG1lc3NhZ2UsIG51bGwpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgQ2xpZW50QWJvcnRFeGNlcHRpb24gZm9yIHRoZSBzcGVjaWZpZWQgdGhyb3dhYmxlLgorICAgICAqCisgICAgICogQHBhcmFtIHRocm93YWJsZSBUaHJvd2FibGUgdGhhdCBjYXVzZWQgdGhpcyBleGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xpZW50QWJvcnRFeGNlcHRpb24oVGhyb3dhYmxlIHRocm93YWJsZSkgeworCisgICAgICAgIHRoaXMobnVsbCwgdGhyb3dhYmxlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IENsaWVudEFib3J0RXhjZXB0aW9uIGZvciB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UKKyAgICAgKiBhbmQgdGhyb3dhYmxlLgorICAgICAqCisgICAgICogQHBhcmFtIG1lc3NhZ2UgTWVzc2FnZSBkZXNjcmliaW5nIHRoaXMgZXhjZXB0aW9uCisgICAgICogQHBhcmFtIHRocm93YWJsZSBUaHJvd2FibGUgdGhhdCBjYXVzZWQgdGhpcyBleGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xpZW50QWJvcnRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSB0aHJvd2FibGUpIHsKKworICAgICAgICBzdXBlcigpOworICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOworICAgICAgICB0aGlzLnRocm93YWJsZSA9IHRocm93YWJsZTsKKworICAgIH0KKworCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBlcnJvciBtZXNzYWdlIHBhc3NlZCB0byBvdXIgY29uc3RydWN0b3IgKGlmIGFueSkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIG1lc3NhZ2UgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgdW5kZXJseWluZyBleGNlcHRpb24gb3IgZXJyb3IgcGFzc2VkIHRvIG91ciBjb25zdHJ1Y3RvciAoaWYgYW55KQorICAgICAqLworICAgIHByb3RlY3RlZCBUaHJvd2FibGUgdGhyb3dhYmxlID0gbnVsbDsKKworCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG1lc3NhZ2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZXhjZXB0aW9uLCBpZiBhbnkuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgeworCisgICAgICAgIHJldHVybiAobWVzc2FnZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHRocm93YWJsZSB0aGF0IGNhdXNlZCB0aGlzIGV4Y2VwdGlvbiwgaWYgYW55LgorICAgICAqLworICAgIHB1YmxpYyBUaHJvd2FibGUgZ2V0VGhyb3dhYmxlKCkgeworCisgICAgICAgIHJldHVybiAodGhyb3dhYmxlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgZm9ybWF0dGVkIHN0cmluZyB0aGF0IGRlc2NyaWJlcyB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIkNsaWVudEFib3J0RXhjZXB0aW9uOiAgIik7CisgICAgICAgIGlmIChtZXNzYWdlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZChtZXNzYWdlKTsKKyAgICAgICAgICAgIGlmICh0aHJvd2FibGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiOiAgIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRocm93YWJsZSAhPSBudWxsKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQodGhyb3dhYmxlLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoc2IudG9TdHJpbmcoKSk7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2Nvbm5lY3Rvci9Db25uZWN0b3IuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb25uZWN0b3IvQ29ubmVjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFiNjkyZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb25uZWN0b3IvQ29ubmVjdG9yLmphdmEKQEAgLTAsMCArMSwxMTI0IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3RvcjsKKworaW1wb3J0IGphdmEubmV0LlVSTEVuY29kZXI7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CisKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuUmVnaXN0cmF0aW9uOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NYWxmb3JtZWRPYmplY3ROYW1lRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGFpbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5TZXJ2aWNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZEVuZ2luZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuTGlmZWN5Y2xlU3VwcG9ydDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuU3RyaW5nTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubW9kZWxlci5SZWdpc3RyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNveW90ZS5BZGFwdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY295b3RlLlByb3RvY29sSGFuZGxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvbWNhdC51dGlsLkludHJvc3BlY3Rpb25VdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvbWNhdC51dGlsLmh0dHAubWFwcGVyLk1hcHBlcjsKKworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIGEgQ295b3RlIGNvbm5lY3RvciBmb3IgVG9tY2F0IDUueC4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEBhdXRob3IgUmVteSBNYXVjaGVyYXQKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworCitwdWJsaWMgY2xhc3MgQ29ubmVjdG9yCisgICAgaW1wbGVtZW50cyBMaWZlY3ljbGUsIE1CZWFuUmVnaXN0cmF0aW9uCit7CisgICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKENvbm5lY3Rvci5jbGFzcyk7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcgorCisKKyAgICBwdWJsaWMgQ29ubmVjdG9yKCkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMobnVsbCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBDb25uZWN0b3IoU3RyaW5nIHByb3RvY29sKSAKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHNldFByb3RvY29sKHByb3RvY29sKTsKKyAgICAgICAgLy8gSW5zdGFudGlhdGUgcHJvdG9jb2wgaGFuZGxlcgorICAgICAgICB0cnkgeworICAgICAgICAgICAgQ2xhc3MgY2xhenogPSBDbGFzcy5mb3JOYW1lKHByb3RvY29sSGFuZGxlckNsYXNzTmFtZSk7CisgICAgICAgICAgICB0aGlzLnByb3RvY29sSGFuZGxlciA9IChQcm90b2NvbEhhbmRsZXIpIGNsYXp6Lm5ld0luc3RhbmNlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2cuZXJyb3IKKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nCisgICAgICAgICAgICAgICAgICgiY295b3RlQ29ubmVjdG9yLnByb3RvY29sSGFuZGxlckluc3RhbnRpYXRpb25GYWlsZWQiLCBlKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSA8Y29kZT5TZXJ2aWNlPC9jb2RlPiB3ZSBhcmUgYXNzb2NpYXRlZCB3aXRoIChpZiBhbnkpLgorICAgICAqLworICAgIHByaXZhdGUgU2VydmljZSBzZXJ2aWNlID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogRG8gd2UgYWxsb3cgVFJBQ0UgPworICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBhbGxvd1RyYWNlID0gZmFsc2U7CisKKworICAgIC8qKgorICAgICAqIFRoZSBDb250YWluZXIgdXNlZCBmb3IgcHJvY2Vzc2luZyByZXF1ZXN0cyByZWNlaXZlZCBieSB0aGlzIENvbm5lY3Rvci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ29udGFpbmVyIGNvbnRhaW5lciA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSAiZW5hYmxlIEROUyBsb29rdXBzIiBmbGFnIGZvciB0aGlzIENvbm5lY3Rvci4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gZW5hYmxlTG9va3VwcyA9IGZhbHNlOworCisKKyAgICAvKgorICAgICAqIElzIGdlbmVyYXRpb24gb2YgWC1Qb3dlcmVkLUJ5IHJlc3BvbnNlIGhlYWRlciBlbmFibGVkL2Rpc2FibGVkPworICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiB4cG93ZXJlZEJ5ID0gZmFsc2U7CisKKworICAgIC8qKgorICAgICAqIERlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgQ29ubmVjdG9yIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBpbmZvID0KKyAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLkNvbm5lY3Rvci8yLjEiOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgbGlmZWN5Y2xlIGV2ZW50IHN1cHBvcnQgZm9yIHRoaXMgY29tcG9uZW50LgorICAgICAqLworICAgIHByb3RlY3RlZCBMaWZlY3ljbGVTdXBwb3J0IGxpZmVjeWNsZSA9IG5ldyBMaWZlY3ljbGVTdXBwb3J0KHRoaXMpOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgcG9ydCBudW1iZXIgb24gd2hpY2ggd2UgbGlzdGVuIGZvciByZXF1ZXN0cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBwb3J0ID0gMDsKKworCisgICAgLyoqCisgICAgICogVGhlIHNlcnZlciBuYW1lIHRvIHdoaWNoIHdlIHNob3VsZCBwcmV0ZW5kIHJlcXVlc3RzIHRvIHRoaXMgQ29ubmVjdG9yCisgICAgICogd2VyZSBkaXJlY3RlZC4gIFRoaXMgaXMgdXNlZnVsIHdoZW4gb3BlcmF0aW5nIFRvbWNhdCBiZWhpbmQgYSBwcm94eQorICAgICAqIHNlcnZlciwgc28gdGhhdCByZWRpcmVjdHMgZ2V0IGNvbnN0cnVjdGVkIGFjY3VyYXRlbHkuICBJZiBub3Qgc3BlY2lmaWVkLAorICAgICAqIHRoZSBzZXJ2ZXIgbmFtZSBpbmNsdWRlZCBpbiB0aGUgPGNvZGU+SG9zdDwvY29kZT4gaGVhZGVyIGlzIHVzZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcHJveHlOYW1lID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIHNlcnZlciBwb3J0IHRvIHdoaWNoIHdlIHNob3VsZCBwcmV0ZW50IHJlcXVlc3RzIHRvIHRoaXMgQ29ubmVjdG9yCisgICAgICogd2VyZSBkaXJlY3RlZC4gIFRoaXMgaXMgdXNlZnVsIHdoZW4gb3BlcmF0aW5nIFRvbWNhdCBiZWhpbmQgYSBwcm94eQorICAgICAqIHNlcnZlciwgc28gdGhhdCByZWRpcmVjdHMgZ2V0IGNvbnN0cnVjdGVkIGFjY3VyYXRlbHkuICBJZiBub3Qgc3BlY2lmaWVkLAorICAgICAqIHRoZSBwb3J0IG51bWJlciBzcGVjaWZpZWQgYnkgdGhlIDxjb2RlPnBvcnQ8L2NvZGU+IHByb3BlcnR5IGlzIHVzZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgcHJveHlQb3J0ID0gMDsKKworCisgICAgLyoqCisgICAgICogVGhlIHJlZGlyZWN0IHBvcnQgZm9yIG5vbi1TU0wgdG8gU1NMIHJlZGlyZWN0cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCByZWRpcmVjdFBvcnQgPSA0NDM7CisKKworICAgIC8qKgorICAgICAqIFRoZSByZXF1ZXN0IHNjaGVtZSB0aGF0IHdpbGwgYmUgc2V0IG9uIGFsbCByZXF1ZXN0cyByZWNlaXZlZAorICAgICAqIHRocm91Z2ggdGhpcyBjb25uZWN0b3IuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgc2NoZW1lID0gImh0dHAiOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc2VjdXJlIGNvbm5lY3Rpb24gZmxhZyB0aGF0IHdpbGwgYmUgc2V0IG9uIGFsbCByZXF1ZXN0cyByZWNlaXZlZAorICAgICAqIHRocm91Z2ggdGhpcyBjb25uZWN0b3IuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHNlY3VyZSA9IGZhbHNlOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc3RyaW5nIG1hbmFnZXIgZm9yIHRoaXMgcGFja2FnZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZ01hbmFnZXIgc20gPQorICAgICAgICBTdHJpbmdNYW5hZ2VyLmdldE1hbmFnZXIoQ29uc3RhbnRzLlBhY2thZ2UpOworCisKKyAgICAvKioKKyAgICAgKiBNYXhpbXVtIHNpemUgb2YgYSBQT1NUIHdoaWNoIHdpbGwgYmUgYXV0b21hdGljYWxseSBwYXJzZWQgYnkgdGhlIAorICAgICAqIGNvbnRhaW5lci4gMk1CIGJ5IGRlZmF1bHQuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgbWF4UG9zdFNpemUgPSAyICogMTAyNCAqIDEwMjQ7CisKKworICAgIC8qKgorICAgICAqIEhhcyB0aGlzIGNvbXBvbmVudCBiZWVuIGluaXRpYWxpemVkIHlldD8KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaW5pdGlhbGl6ZWQgPSBmYWxzZTsKKworCisgICAgLyoqCisgICAgICogSGFzIHRoaXMgY29tcG9uZW50IGJlZW4gc3RhcnRlZCB5ZXQ/CisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHN0YXJ0ZWQgPSBmYWxzZTsKKworCisgICAgLyoqCisgICAgICogVGhlIHNodXRkb3duIHNpZ25hbCB0byBvdXIgYmFja2dyb3VuZCB0aHJlYWQKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gc3RvcHBlZCA9IGZhbHNlOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgYmFja2dyb3VuZCB0aHJlYWQuCisgICAgICovCisgICAgcHJpdmF0ZSBUaHJlYWQgdGhyZWFkID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogQ295b3RlIFByb3RvY29sIGhhbmRsZXIgY2xhc3MgbmFtZS4KKyAgICAgKiBEZWZhdWx0cyB0byB0aGUgQ295b3RlIEhUVFAvMS4xIHByb3RvY29sSGFuZGxlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBwcm90b2NvbEhhbmRsZXJDbGFzc05hbWUgPQorICAgICAgICAib3JnLmFwYWNoZS5jb3lvdGUuaHR0cDExLkh0dHAxMVByb3RvY29sIjsKKworCisgICAgLyoqCisgICAgICogQ295b3RlIHByb3RvY29sIGhhbmRsZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBQcm90b2NvbEhhbmRsZXIgcHJvdG9jb2xIYW5kbGVyID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogQ295b3RlIGFkYXB0ZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBBZGFwdGVyIGFkYXB0ZXIgPSBudWxsOworCisKKyAgICAgLyoqCisgICAgICAqIE1hcHBlci4KKyAgICAgICovCisgICAgIHByaXZhdGUgTWFwcGVyIG1hcHBlciA9IG5ldyBNYXBwZXIoKTsKKworCisgICAgIC8qKgorICAgICAgKiBNYXBwZXIgbGlzdGVuZXIuCisgICAgICAqLworICAgICBwcml2YXRlIE1hcHBlckxpc3RlbmVyIG1hcHBlckxpc3RlbmVyID0gbmV3IE1hcHBlckxpc3RlbmVyKG1hcHBlcik7CisKKworICAgICAvKioKKyAgICAgICogVVJJIGVuY29kaW5nLgorICAgICAgKi8KKyAgICAgcHJpdmF0ZSBTdHJpbmcgVVJJRW5jb2RpbmcgPSBudWxsOworCisKKyAgICAgLyoqCisgICAgICAqIFVSSSBlbmNvZGluZyBhcyBib2R5LgorICAgICAgKi8KKyAgICAgcHJpdmF0ZSBib29sZWFuIHVzZUJvZHlFbmNvZGluZ0ZvclVSSSA9IGZhbHNlOworCisKKyAgICAgcHJvdGVjdGVkIHN0YXRpYyBIYXNoTWFwIHJlcGxhY2VtZW50cyA9IG5ldyBIYXNoTWFwKCk7CisgICAgIHN0YXRpYyB7CisgICAgICAgICByZXBsYWNlbWVudHMucHV0KCJhY2NlcHRDb3VudCIsICJiYWNrbG9nIik7CisgICAgICAgICByZXBsYWNlbWVudHMucHV0KCJjb25uZWN0aW9uTGluZ2VyIiwgInNvTGluZ2VyIik7CisgICAgICAgICByZXBsYWNlbWVudHMucHV0KCJjb25uZWN0aW9uVGltZW91dCIsICJzb1RpbWVvdXQiKTsKKyAgICAgICAgIHJlcGxhY2VtZW50cy5wdXQoImNvbm5lY3Rpb25VcGxvYWRUaW1lb3V0IiwgInRpbWVvdXQiKTsKKyAgICAgICAgIHJlcGxhY2VtZW50cy5wdXQoImNsaWVudEF1dGgiLCAiY2xpZW50YXV0aCIpOworICAgICAgICAgcmVwbGFjZW1lbnRzLnB1dCgia2V5c3RvcmVGaWxlIiwgImtleXN0b3JlIik7CisgICAgICAgICByZXBsYWNlbWVudHMucHV0KCJyYW5kb21GaWxlIiwgInJhbmRvbWZpbGUiKTsKKyAgICAgICAgIHJlcGxhY2VtZW50cy5wdXQoInJvb3RGaWxlIiwgInJvb3RmaWxlIik7CisgICAgICAgICByZXBsYWNlbWVudHMucHV0KCJrZXlzdG9yZVBhc3MiLCAia2V5cGFzcyIpOworICAgICAgICAgcmVwbGFjZW1lbnRzLnB1dCgia2V5c3RvcmVUeXBlIiwgImtleXR5cGUiKTsKKyAgICAgICAgIHJlcGxhY2VtZW50cy5wdXQoInNzbFByb3RvY29sIiwgInByb3RvY29sIik7CisgICAgICAgICByZXBsYWNlbWVudHMucHV0KCJzc2xQcm90b2NvbHMiLCAicHJvdG9jb2xzIik7CisgICAgIH0KKyAgICAgCisgICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBjb25maWd1cmVkIHByb3BlcnR5LgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgU3RyaW5nIHJlcGwgPSBuYW1lOworICAgICAgICBpZiAocmVwbGFjZW1lbnRzLmdldChuYW1lKSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXBsID0gKFN0cmluZykgcmVwbGFjZW1lbnRzLmdldChuYW1lKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gSW50cm9zcGVjdGlvblV0aWxzLmdldFByb3BlcnR5KHByb3RvY29sSGFuZGxlciwgcmVwbCk7CisgICAgfQorCisgICAgCisgICAgLyoqCisgICAgICogU2V0IGEgY29uZmlndXJlZCBwcm9wZXJ0eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIFN0cmluZyByZXBsID0gbmFtZTsKKyAgICAgICAgaWYgKHJlcGxhY2VtZW50cy5nZXQobmFtZSkgIT0gbnVsbCkgeworICAgICAgICAgICAgcmVwbCA9IChTdHJpbmcpIHJlcGxhY2VtZW50cy5nZXQobmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgSW50cm9zcGVjdGlvblV0aWxzLnNldFByb3BlcnR5KHByb3RvY29sSGFuZGxlciwgcmVwbCwgdmFsdWUpOworICAgIH0KKworICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiBhIGNvbmZpZ3VyZWQgcHJvcGVydHkuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIGdldFByb3BlcnR5KG5hbWUpOworICAgIH0KKworICAgIAorICAgIC8qKgorICAgICAqIFNldCBhIGNvbmZpZ3VyZWQgcHJvcGVydHkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgc2V0UHJvcGVydHkobmFtZSwgU3RyaW5nLnZhbHVlT2YodmFsdWUpKTsKKyAgICB9CisKKyAgICAKKyAgICAvKiogCisgICAgICogcmVtb3ZlIGEgY29uZmlndXJlZCBwcm9wZXJ0eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVQcm9wZXJ0eShTdHJpbmcgbmFtZSkgeworICAgICAgICAvLyBGSVhNRSAhCisgICAgICAgIC8vcHJvdG9jb2xIYW5kbGVyLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTsKKyAgICB9CisKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIDxjb2RlPlNlcnZpY2U8L2NvZGU+IHdpdGggd2hpY2ggd2UgYXJlIGFzc29jaWF0ZWQgKGlmIGFueSkuCisgICAgICovCisgICAgcHVibGljIFNlcnZpY2UgZ2V0U2VydmljZSgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMuc2VydmljZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgPGNvZGU+U2VydmljZTwvY29kZT4gd2l0aCB3aGljaCB3ZSBhcmUgYXNzb2NpYXRlZCAoaWYgYW55KS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRoYXQgb3ducyB0aGlzIEVuZ2luZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNlcnZpY2UoU2VydmljZSBzZXJ2aWNlKSB7CisKKyAgICAgICAgdGhpcy5zZXJ2aWNlID0gc2VydmljZTsKKyAgICAgICAgLy8gRklYTUU6IHNldFByb3BlcnR5KCJzZXJ2aWNlIiwgc2VydmljZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRydWUgaWYgdGhlIFRSQUNFIG1ldGhvZCBpcyBhbGxvd2VkLiAgRGVmYXVsdCB2YWx1ZSBpcyAiZmFsc2UiLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldEFsbG93VHJhY2UoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLmFsbG93VHJhY2UpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGFsbG93VHJhY2UgZmxhZywgdG8gZGlzYWJsZSBvciBlbmFibGUgdGhlIFRSQUNFIEhUVFAgbWV0aG9kLgorICAgICAqCisgICAgICogQHBhcmFtIGFsbG93VHJhY2UgVGhlIG5ldyBhbGxvd1RyYWNlIGZsYWcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBbGxvd1RyYWNlKGJvb2xlYW4gYWxsb3dUcmFjZSkgeworCisgICAgICAgIHRoaXMuYWxsb3dUcmFjZSA9IGFsbG93VHJhY2U7CisgICAgICAgIHNldFByb3BlcnR5KCJhbGxvd1RyYWNlIiwgU3RyaW5nLnZhbHVlT2YoYWxsb3dUcmFjZSkpOworCisgICAgfQorCisgICAgLyoqCisgICAgICogSXMgdGhpcyBjb25uZWN0b3IgYXZhaWxhYmxlIGZvciBwcm9jZXNzaW5nIHJlcXVlc3RzPworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzQXZhaWxhYmxlKCkgeworCisgICAgICAgIHJldHVybiAoc3RhcnRlZCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgaW5wdXQgYnVmZmVyIHNpemUgZm9yIHRoaXMgQ29ubmVjdG9yLgorICAgICAqIAorICAgICAqIEBkZXByZWNhdGVkCisgICAgICovCisgICAgcHVibGljIGludCBnZXRCdWZmZXJTaXplKCkgeworICAgICAgICByZXR1cm4gMjA0ODsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGlucHV0IGJ1ZmZlciBzaXplIGZvciB0aGlzIENvbm5lY3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBidWZmZXJTaXplIFRoZSBuZXcgaW5wdXQgYnVmZmVyIHNpemUuCisgICAgICogQGRlcHJlY2F0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRCdWZmZXJTaXplKGludCBidWZmZXJTaXplKSB7CisgICAgfQorCisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBDb250YWluZXIgdXNlZCBmb3IgcHJvY2Vzc2luZyByZXF1ZXN0cyByZWNlaXZlZCBieSB0aGlzCisgICAgICogQ29ubmVjdG9yLgorICAgICAqLworICAgIHB1YmxpYyBDb250YWluZXIgZ2V0Q29udGFpbmVyKCkgeworICAgICAgICBpZiggY29udGFpbmVyPT1udWxsICkgeworICAgICAgICAgICAgLy8gTGF6eSAtIG1heWJlIGl0IHdhcyBhZGRlZCBsYXRlcgorICAgICAgICAgICAgZmluZENvbnRhaW5lcigpOyAgICAgCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChjb250YWluZXIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIENvbnRhaW5lciB1c2VkIGZvciBwcm9jZXNzaW5nIHJlcXVlc3RzIHJlY2VpdmVkIGJ5IHRoaXMKKyAgICAgKiBDb25uZWN0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBuZXcgQ29udGFpbmVyIHRvIHVzZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbnRhaW5lcihDb250YWluZXIgY29udGFpbmVyKSB7CisKKyAgICAgICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgImVuYWJsZSBETlMgbG9va3VwcyIgZmxhZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRFbmFibGVMb29rdXBzKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5lbmFibGVMb29rdXBzKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSAiZW5hYmxlIEROUyBsb29rdXBzIiBmbGFnLgorICAgICAqCisgICAgICogQHBhcmFtIGVuYWJsZUxvb2t1cHMgVGhlIG5ldyAiZW5hYmxlIEROUyBsb29rdXBzIiBmbGFnIHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RW5hYmxlTG9va3Vwcyhib29sZWFuIGVuYWJsZUxvb2t1cHMpIHsKKworICAgICAgICB0aGlzLmVuYWJsZUxvb2t1cHMgPSBlbmFibGVMb29rdXBzOworICAgICAgICBzZXRQcm9wZXJ0eSgiZW5hYmxlTG9va3VwcyIsIFN0cmluZy52YWx1ZU9mKGVuYWJsZUxvb2t1cHMpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgQ29ubmVjdG9yIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5mbygpIHsKKworICAgICAgICByZXR1cm4gKGluZm8pOworCisgICAgfQorCisKKyAgICAgLyoqCisgICAgICAqIFJldHVybiB0aGUgbWFwcGVyLgorICAgICAgKi8KKyAgICAgcHVibGljIE1hcHBlciBnZXRNYXBwZXIoKSB7CisKKyAgICAgICAgIHJldHVybiAobWFwcGVyKTsKKworICAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbWF4aW11bSBzaXplIG9mIGEgUE9TVCB3aGljaCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkKKyAgICAgKiBwYXJzZWQgYnkgdGhlIGNvbnRhaW5lci4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldE1heFBvc3RTaXplKCkgeworCisgICAgICAgIHJldHVybiAobWF4UG9zdFNpemUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG1heGltdW0gc2l6ZSBvZiBhIFBPU1Qgd2hpY2ggd2lsbCBiZSBhdXRvbWF0aWNhbGx5CisgICAgICogcGFyc2VkIGJ5IHRoZSBjb250YWluZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWF4UG9zdFNpemUgVGhlIG5ldyBtYXhpbXVtIHNpemUgaW4gYnl0ZXMgb2YgYSBQT1NUIHdoaWNoIHdpbGwgCisgICAgICogYmUgYXV0b21hdGljYWxseSBwYXJzZWQgYnkgdGhlIGNvbnRhaW5lcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1heFBvc3RTaXplKGludCBtYXhQb3N0U2l6ZSkgeworCisgICAgICAgIHRoaXMubWF4UG9zdFNpemUgPSBtYXhQb3N0U2l6ZTsKKyAgICAgICAgc2V0UHJvcGVydHkoIm1heFBvc3RTaXplIiwgU3RyaW5nLnZhbHVlT2YobWF4UG9zdFNpemUpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcG9ydCBudW1iZXIgb24gd2hpY2ggd2UgbGlzdGVuIGZvciByZXF1ZXN0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFBvcnQoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLnBvcnQpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHBvcnQgbnVtYmVyIG9uIHdoaWNoIHdlIGxpc3RlbiBmb3IgcmVxdWVzdHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcG9ydCBUaGUgbmV3IHBvcnQgbnVtYmVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UG9ydChpbnQgcG9ydCkgeworCisgICAgICAgIHRoaXMucG9ydCA9IHBvcnQ7CisgICAgICAgIHNldFByb3BlcnR5KCJwb3J0IiwgU3RyaW5nLnZhbHVlT2YocG9ydCkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIENveW90ZSBwcm90b2NvbCBoYW5kbGVyIGluIHVzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFByb3RvY29sKCkgeworCisgICAgICAgIGlmICgib3JnLmFwYWNoZS5jb3lvdGUuaHR0cDExLkh0dHAxMVByb3RvY29sIi5lcXVhbHMKKyAgICAgICAgICAgIChnZXRQcm90b2NvbEhhbmRsZXJDbGFzc05hbWUoKSkpIHsKKyAgICAgICAgICAgIHJldHVybiAiSFRUUC8xLjEiOworICAgICAgICB9IGVsc2UgaWYgKCJvcmcuYXBhY2hlLmprLnNlcnZlci5Ka0NveW90ZUhhbmRsZXIiLmVxdWFscworICAgICAgICAgICAgICAgICAgIChnZXRQcm90b2NvbEhhbmRsZXJDbGFzc05hbWUoKSkpIHsKKyAgICAgICAgICAgIHJldHVybiAiQUpQLzEuMyI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGdldFByb3RvY29sSGFuZGxlckNsYXNzTmFtZSgpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIENveW90ZSBwcm90b2NvbCB3aGljaCB3aWxsIGJlIHVzZWQgYnkgdGhlIGNvbm5lY3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm90b2NvbCBUaGUgQ295b3RlIHByb3RvY29sIG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcm90b2NvbChTdHJpbmcgcHJvdG9jb2wpIHsKKworICAgICAgICBpZiAoIkhUVFAvMS4xIi5lcXVhbHMocHJvdG9jb2wpKSB7CisgICAgICAgICAgICBzZXRQcm90b2NvbEhhbmRsZXJDbGFzc05hbWUKKyAgICAgICAgICAgICAgICAoIm9yZy5hcGFjaGUuY295b3RlLmh0dHAxMS5IdHRwMTFQcm90b2NvbCIpOworICAgICAgICB9IGVsc2UgaWYgKCJBSlAvMS4zIi5lcXVhbHMocHJvdG9jb2wpKSB7CisgICAgICAgICAgICBzZXRQcm90b2NvbEhhbmRsZXJDbGFzc05hbWUKKyAgICAgICAgICAgICAgICAoIm9yZy5hcGFjaGUuamsuc2VydmVyLkprQ295b3RlSGFuZGxlciIpOworICAgICAgICB9IGVsc2UgaWYgKHByb3RvY29sICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNldFByb3RvY29sSGFuZGxlckNsYXNzTmFtZShwcm90b2NvbCk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjbGFzcyBuYW1lIG9mIHRoZSBDb3lvdGUgcHJvdG9jb2wgaGFuZGxlciBpbiB1c2UuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRQcm90b2NvbEhhbmRsZXJDbGFzc05hbWUoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLnByb3RvY29sSGFuZGxlckNsYXNzTmFtZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY2xhc3MgbmFtZSBvZiB0aGUgQ295b3RlIHByb3RvY29sIGhhbmRsZXIgd2hpY2ggd2lsbCBiZSB1c2VkCisgICAgICogYnkgdGhlIGNvbm5lY3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm90b2NvbEhhbmRsZXJDbGFzc05hbWUgVGhlIG5ldyBjbGFzcyBuYW1lCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJvdG9jb2xIYW5kbGVyQ2xhc3NOYW1lKFN0cmluZyBwcm90b2NvbEhhbmRsZXJDbGFzc05hbWUpIHsKKworICAgICAgICB0aGlzLnByb3RvY29sSGFuZGxlckNsYXNzTmFtZSA9IHByb3RvY29sSGFuZGxlckNsYXNzTmFtZTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBwcm90b2NvbCBoYW5kbGVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29ubmVjdG9yLgorICAgICAqLworICAgIHB1YmxpYyBQcm90b2NvbEhhbmRsZXIgZ2V0UHJvdG9jb2xIYW5kbGVyKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5wcm90b2NvbEhhbmRsZXIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHByb3h5IHNlcnZlciBuYW1lIGZvciB0aGlzIENvbm5lY3Rvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFByb3h5TmFtZSgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMucHJveHlOYW1lKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBwcm94eSBzZXJ2ZXIgbmFtZSBmb3IgdGhpcyBDb25uZWN0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJveHlOYW1lIFRoZSBuZXcgcHJveHkgc2VydmVyIG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcm94eU5hbWUoU3RyaW5nIHByb3h5TmFtZSkgeworCisgICAgICAgIGlmKHByb3h5TmFtZSAhPSBudWxsICYmIHByb3h5TmFtZS5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgIHRoaXMucHJveHlOYW1lID0gcHJveHlOYW1lOworICAgICAgICAgICAgc2V0UHJvcGVydHkoInByb3h5TmFtZSIsIHByb3h5TmFtZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aGlzLnByb3h5TmFtZSA9IG51bGw7CisgICAgICAgICAgICByZW1vdmVQcm9wZXJ0eSgicHJveHlOYW1lIik7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBwcm94eSBzZXJ2ZXIgcG9ydCBmb3IgdGhpcyBDb25uZWN0b3IuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRQcm94eVBvcnQoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLnByb3h5UG9ydCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcHJveHkgc2VydmVyIHBvcnQgZm9yIHRoaXMgQ29ubmVjdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIHByb3h5UG9ydCBUaGUgbmV3IHByb3h5IHNlcnZlciBwb3J0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJveHlQb3J0KGludCBwcm94eVBvcnQpIHsKKworICAgICAgICB0aGlzLnByb3h5UG9ydCA9IHByb3h5UG9ydDsKKyAgICAgICAgc2V0UHJvcGVydHkoInByb3h5UG9ydCIsIFN0cmluZy52YWx1ZU9mKHByb3h5UG9ydCkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHBvcnQgbnVtYmVyIHRvIHdoaWNoIGEgcmVxdWVzdCBzaG91bGQgYmUgcmVkaXJlY3RlZCBpZgorICAgICAqIGl0IGNvbWVzIGluIG9uIGEgbm9uLVNTTCBwb3J0IGFuZCBpcyBzdWJqZWN0IHRvIGEgc2VjdXJpdHkgY29uc3RyYWludAorICAgICAqIHdpdGggYSB0cmFuc3BvcnQgZ3VhcmFudGVlIHRoYXQgcmVxdWlyZXMgU1NMLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UmVkaXJlY3RQb3J0KCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5yZWRpcmVjdFBvcnQpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHJlZGlyZWN0IHBvcnQgbnVtYmVyLgorICAgICAqCisgICAgICogQHBhcmFtIHJlZGlyZWN0UG9ydCBUaGUgcmVkaXJlY3QgcG9ydCBudW1iZXIgKG5vbi1TU0wgdG8gU1NMKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlZGlyZWN0UG9ydChpbnQgcmVkaXJlY3RQb3J0KSB7CisKKyAgICAgICAgdGhpcy5yZWRpcmVjdFBvcnQgPSByZWRpcmVjdFBvcnQ7CisgICAgICAgIHNldFByb3BlcnR5KCJyZWRpcmVjdFBvcnQiLCBTdHJpbmcudmFsdWVPZihyZWRpcmVjdFBvcnQpKTsKKworICAgIH0KKworICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2NoZW1lIHRoYXQgd2lsbCBiZSBhc3NpZ25lZCB0byByZXF1ZXN0cyByZWNlaXZlZAorICAgICAqIHRocm91Z2ggdGhpcyBjb25uZWN0b3IuICBEZWZhdWx0IHZhbHVlIGlzICJodHRwIi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFNjaGVtZSgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMuc2NoZW1lKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzY2hlbWUgdGhhdCB3aWxsIGJlIGFzc2lnbmVkIHRvIHJlcXVlc3RzIHJlY2VpdmVkIHRocm91Z2gKKyAgICAgKiB0aGlzIGNvbm5lY3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzY2hlbWUgVGhlIG5ldyBzY2hlbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTY2hlbWUoU3RyaW5nIHNjaGVtZSkgeworCisgICAgICAgIHRoaXMuc2NoZW1lID0gc2NoZW1lOworICAgICAgICBzZXRQcm9wZXJ0eSgic2NoZW1lIiwgc2NoZW1lKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZWN1cmUgY29ubmVjdGlvbiBmbGFnIHRoYXQgd2lsbCBiZSBhc3NpZ25lZCB0byByZXF1ZXN0cworICAgICAqIHJlY2VpdmVkIHRocm91Z2ggdGhpcyBjb25uZWN0b3IuICBEZWZhdWx0IHZhbHVlIGlzICJmYWxzZSIuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0U2VjdXJlKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5zZWN1cmUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHNlY3VyZSBjb25uZWN0aW9uIGZsYWcgdGhhdCB3aWxsIGJlIGFzc2lnbmVkIHRvIHJlcXVlc3RzCisgICAgICogcmVjZWl2ZWQgdGhyb3VnaCB0aGlzIGNvbm5lY3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWN1cmUgVGhlIG5ldyBzZWN1cmUgY29ubmVjdGlvbiBmbGFnCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2VjdXJlKGJvb2xlYW4gc2VjdXJlKSB7CisKKyAgICAgICAgdGhpcy5zZWN1cmUgPSBzZWN1cmU7CisgICAgICAgIHNldFByb3BlcnR5KCJzZWN1cmUiLCBTdHJpbmcudmFsdWVPZihzZWN1cmUpKTsKKworICAgIH0KKworICAgICAvKioKKyAgICAgICogUmV0dXJuIHRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcgdG8gYmUgdXNlZCBmb3IgdGhlIFVSSS4KKyAgICAgICovCisgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VVJJRW5jb2RpbmcoKSB7CisKKyAgICAgICAgIHJldHVybiAodGhpcy5VUklFbmNvZGluZyk7CisKKyAgICAgfQorCisKKyAgICAgLyoqCisgICAgICAqIFNldCB0aGUgVVJJIGVuY29kaW5nIHRvIGJlIHVzZWQgZm9yIHRoZSBVUkkuCisgICAgICAqCisgICAgICAqIEBwYXJhbSBVUklFbmNvZGluZyBUaGUgbmV3IFVSSSBjaGFyYWN0ZXIgZW5jb2RpbmcuCisgICAgICAqLworICAgICBwdWJsaWMgdm9pZCBzZXRVUklFbmNvZGluZyhTdHJpbmcgVVJJRW5jb2RpbmcpIHsKKworICAgICAgICAgdGhpcy5VUklFbmNvZGluZyA9IFVSSUVuY29kaW5nOworICAgICAgICAgc2V0UHJvcGVydHkoInVSSUVuY29kaW5nIiwgVVJJRW5jb2RpbmcpOworCisgICAgIH0KKworCisgICAgIC8qKgorICAgICAgKiBSZXR1cm4gdGhlIHRydWUgaWYgdGhlIGVudGl0eSBib2R5IGVuY29kaW5nIHNob3VsZCBiZSB1c2VkIGZvciB0aGUgVVJJLgorICAgICAgKi8KKyAgICAgcHVibGljIGJvb2xlYW4gZ2V0VXNlQm9keUVuY29kaW5nRm9yVVJJKCkgeworCisgICAgICAgICByZXR1cm4gKHRoaXMudXNlQm9keUVuY29kaW5nRm9yVVJJKTsKKworICAgICB9CisKKworICAgICAvKioKKyAgICAgICogU2V0IGlmIHRoZSBlbnRpdHkgYm9keSBlbmNvZGluZyBzaG91bGQgYmUgdXNlZCBmb3IgdGhlIFVSSS4KKyAgICAgICoKKyAgICAgICogQHBhcmFtIHVzZUJvZHlFbmNvZGluZ0ZvclVSSSBUaGUgbmV3IHZhbHVlIGZvciB0aGUgZmxhZy4KKyAgICAgICovCisgICAgIHB1YmxpYyB2b2lkIHNldFVzZUJvZHlFbmNvZGluZ0ZvclVSSShib29sZWFuIHVzZUJvZHlFbmNvZGluZ0ZvclVSSSkgeworCisgICAgICAgICB0aGlzLnVzZUJvZHlFbmNvZGluZ0ZvclVSSSA9IHVzZUJvZHlFbmNvZGluZ0ZvclVSSTsKKyAgICAgICAgIHNldFByb3BlcnR5CisgICAgICAgICAgICAgKCJ1c2VCb2R5RW5jb2RpbmdGb3JVUkkiLCBTdHJpbmcudmFsdWVPZih1c2VCb2R5RW5jb2RpbmdGb3JVUkkpKTsKKworICAgICB9CisKKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBnZW5lcmF0aW9uIG9mIGFuIFgtUG93ZXJlZC1CeSByZXNwb25zZSBoZWFkZXIgZm9yCisgICAgICogc2VydmxldC1nZW5lcmF0ZWQgcmVzcG9uc2VzIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQgZm9yIHRoaXMgQ29ubmVjdG9yLgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIGdlbmVyYXRpb24gb2YgWC1Qb3dlcmVkLUJ5IHJlc3BvbnNlIGhlYWRlciBpcyBlbmFibGVkLAorICAgICAqIGZhbHNlIG90aGVyd2lzZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldFhwb3dlcmVkQnkoKSB7CisgICAgICAgIHJldHVybiB4cG93ZXJlZEJ5OworICAgIH0KKworCisgICAgLyoqCisgICAgICogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgZ2VuZXJhdGlvbiBvZiBhbiBYLVBvd2VyZWQtQnkgaGVhZGVyICh3aXRoIHZhbHVlCisgICAgICogU2VydmxldC8yLjQpIGZvciBhbGwgc2VydmxldC1nZW5lcmF0ZWQgcmVzcG9uc2VzIHJldHVybmVkIGJ5IHRoaXMKKyAgICAgKiBDb25uZWN0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0geHBvd2VyZWRCeSB0cnVlIGlmIGdlbmVyYXRpb24gb2YgWC1Qb3dlcmVkLUJ5IHJlc3BvbnNlIGhlYWRlciBpcworICAgICAqIHRvIGJlIGVuYWJsZWQsIGZhbHNlIG90aGVyd2lzZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFhwb3dlcmVkQnkoYm9vbGVhbiB4cG93ZXJlZEJ5KSB7CisgICAgICAgIHRoaXMueHBvd2VyZWRCeSA9IHhwb3dlcmVkQnk7CisgICAgICAgIHNldFByb3BlcnR5KCJ4cG93ZXJlZEJ5IiwgU3RyaW5nLnZhbHVlT2YoeHBvd2VyZWRCeSkpOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIENyZWF0ZSAob3IgYWxsb2NhdGUpIGFuZCByZXR1cm4gYSBSZXF1ZXN0IG9iamVjdCBzdWl0YWJsZSBmb3IKKyAgICAgKiBzcGVjaWZ5aW5nIHRoZSBjb250ZW50cyBvZiBhIFJlcXVlc3QgdG8gdGhlIHJlc3BvbnNpYmxlIENvbnRhaW5lci4KKyAgICAgKi8KKyAgICBwdWJsaWMgUmVxdWVzdCBjcmVhdGVSZXF1ZXN0KCkgeworCisgICAgICAgIFJlcXVlc3QgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KCk7CisgICAgICAgIHJlcXVlc3Quc2V0Q29ubmVjdG9yKHRoaXMpOworICAgICAgICByZXR1cm4gKHJlcXVlc3QpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgKG9yIGFsbG9jYXRlKSBhbmQgcmV0dXJuIGEgUmVzcG9uc2Ugb2JqZWN0IHN1aXRhYmxlIGZvcgorICAgICAqIHJlY2VpdmluZyB0aGUgY29udGVudHMgb2YgYSBSZXNwb25zZSBmcm9tIHRoZSByZXNwb25zaWJsZSBDb250YWluZXIuCisgICAgICovCisgICAgcHVibGljIFJlc3BvbnNlIGNyZWF0ZVJlc3BvbnNlKCkgeworCisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gbmV3IFJlc3BvbnNlKCk7CisgICAgICAgIHJlc3BvbnNlLnNldENvbm5lY3Rvcih0aGlzKTsKKyAgICAgICAgcmV0dXJuIChyZXNwb25zZSk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBMaWZlY3ljbGUgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBsaWZlY3ljbGUgZXZlbnQgbGlzdGVuZXIgdG8gdGhpcyBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRvIGFkZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZExpZmVjeWNsZUxpc3RlbmVyKExpZmVjeWNsZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisKKyAgICAgICAgbGlmZWN5Y2xlLmFkZExpZmVjeWNsZUxpc3RlbmVyKGxpc3RlbmVyKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBsaWZlY3ljbGUgbGlzdGVuZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGxpZmVjeWNsZS4gSWYgdGhpcworICAgICAqIExpZmVjeWNsZSBoYXMgbm8gbGlzdGVuZXJzIHJlZ2lzdGVyZWQsIGEgemVyby1sZW5ndGggYXJyYXkgaXMgcmV0dXJuZWQuCisgICAgICovCisgICAgcHVibGljIExpZmVjeWNsZUxpc3RlbmVyW10gZmluZExpZmVjeWNsZUxpc3RlbmVycygpIHsKKworICAgICAgICByZXR1cm4gbGlmZWN5Y2xlLmZpbmRMaWZlY3ljbGVMaXN0ZW5lcnMoKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGEgbGlmZWN5Y2xlIGV2ZW50IGxpc3RlbmVyIGZyb20gdGhpcyBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRvIGFkZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUxpZmVjeWNsZUxpc3RlbmVyKExpZmVjeWNsZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisKKyAgICAgICAgbGlmZWN5Y2xlLnJlbW92ZUxpZmVjeWNsZUxpc3RlbmVyKGxpc3RlbmVyKTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemUgdGhpcyBjb25uZWN0b3IgKGNyZWF0ZSBTZXJ2ZXJTb2NrZXQgaGVyZSEpCisgICAgICovCisgICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpCisgICAgICAgIHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb24KKyAgICB7CisgICAgICAgIGlmIChpbml0aWFsaXplZCkgeworICAgICAgICAgICAgbG9nLmluZm8oc20uZ2V0U3RyaW5nKCJjb3lvdGVDb25uZWN0b3IuYWxyZWFkeUluaXRpYWxpemVkIikpOworICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICB0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTsKKworICAgICAgICBpZiggb25hbWUgPT0gbnVsbCAmJiAoY29udGFpbmVyIGluc3RhbmNlb2YgU3RhbmRhcmRFbmdpbmUpKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIC8vIHdlIGFyZSBsb2FkZWQgZGlyZWN0bHksIHZpYSBBUEkgLSBhbmQgbm8gbmFtZSB3YXMgZ2l2ZW4gdG8gdXMKKyAgICAgICAgICAgICAgICBTdGFuZGFyZEVuZ2luZSBjYj0oU3RhbmRhcmRFbmdpbmUpY29udGFpbmVyOworICAgICAgICAgICAgICAgIFN0cmluZyBlbmNvZGVkQWRkciA9IG51bGw7CisgICAgICAgICAgICAgICAgaWYgKGdldFByb3BlcnR5KCJhZGRyZXNzIikgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBlbmNvZGVkQWRkciA9IFVSTEVuY29kZXIuZW5jb2RlKGdldFByb3BlcnR5KCJhZGRyZXNzIikudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFN0cmluZyBhZGRTdWZmaXg9KGdldFByb3BlcnR5KCJhZGRyZXNzIik9PW51bGwpID8iIjogIixhZGRyZXNzPSIgKyBlbmNvZGVkQWRkcjsKKyAgICAgICAgICAgICAgICBvbmFtZT1uZXcgT2JqZWN0TmFtZShjYi5nZXROYW1lKCkgKyAiOnR5cGU9Q29ubmVjdG9yLHBvcnQ9IisKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldFBvcnQoKSArIGFkZFN1ZmZpeCk7CisgICAgICAgICAgICAgICAgUmVnaXN0cnkuZ2V0UmVnaXN0cnkobnVsbCwgbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgLnJlZ2lzdGVyQ29tcG9uZW50KHRoaXMsIG9uYW1lLCBudWxsKTsKKyAgICAgICAgICAgICAgICBjb250cm9sbGVyPW9uYW1lOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3IoICJFcnJvciByZWdpc3RlcmluZyBjb25uZWN0b3IgIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb2cuZGVidWcoIkNyZWF0aW5nIG5hbWUgZm9yIGNvbm5lY3RvciAiICsgb25hbWUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gSW5pdGlhbGl6YSBhZGFwdGVyCisgICAgICAgIGFkYXB0ZXIgPSBuZXcgQ295b3RlQWRhcHRlcih0aGlzKTsKKyAgICAgICAgcHJvdG9jb2xIYW5kbGVyLnNldEFkYXB0ZXIoYWRhcHRlcik7CisKKyAgICAgICAgSW50cm9zcGVjdGlvblV0aWxzLnNldFByb3BlcnR5KHByb3RvY29sSGFuZGxlciwgImprSG9tZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydHkoImNhdGFsaW5hLmJhc2UiKSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByb3RvY29sSGFuZGxlci5pbml0KCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTGlmZWN5Y2xlRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZworICAgICAgICAgICAgICAgICAoImNveW90ZUNvbm5lY3Rvci5wcm90b2NvbEhhbmRsZXJJbml0aWFsaXphdGlvbkZhaWxlZCIsIGUpKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogUGF1c2UgdGhlIGNvbm5lY3Rvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwYXVzZSgpCisgICAgICAgIHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJvdG9jb2xIYW5kbGVyLnBhdXNlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2cuZXJyb3Ioc20uZ2V0U3RyaW5nCisgICAgICAgICAgICAgICAgICAgICAgKCJjb3lvdGVDb25uZWN0b3IucHJvdG9jb2xIYW5kbGVyUGF1c2VGYWlsZWQiKSwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFBhdXNlIHRoZSBjb25uZWN0b3IuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVzdW1lKCkKKyAgICAgICAgdGhyb3dzIExpZmVjeWNsZUV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwcm90b2NvbEhhbmRsZXIucmVzdW1lKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2cuZXJyb3Ioc20uZ2V0U3RyaW5nCisgICAgICAgICAgICAgICAgICAgICAgKCJjb3lvdGVDb25uZWN0b3IucHJvdG9jb2xIYW5kbGVyUmVzdW1lRmFpbGVkIiksIGUpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBCZWdpbiBwcm9jZXNzaW5nIHJlcXVlc3RzIHZpYSB0aGlzIENvbm5lY3Rvci4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTGlmZWN5Y2xlRXhjZXB0aW9uIGlmIGEgZmF0YWwgc3RhcnR1cCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb24geworICAgICAgICBpZiggIWluaXRpYWxpemVkICkKKyAgICAgICAgICAgIGluaXRpYWxpemUoKTsKKworICAgICAgICAvLyBWYWxpZGF0ZSBhbmQgdXBkYXRlIG91ciBjdXJyZW50IHN0YXRlCisgICAgICAgIGlmIChzdGFydGVkKSB7CisgICAgICAgICAgICBsb2cuaW5mbyhzbS5nZXRTdHJpbmcoImNveW90ZUNvbm5lY3Rvci5hbHJlYWR5U3RhcnRlZCIpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBsaWZlY3ljbGUuZmlyZUxpZmVjeWNsZUV2ZW50KFNUQVJUX0VWRU5ULCBudWxsKTsKKyAgICAgICAgc3RhcnRlZCA9IHRydWU7CisKKyAgICAgICAgLy8gV2UgY2FuJ3QgcmVnaXN0ZXIgZWFybGllciAtIHRoZSBKTVggcmVnaXN0cmF0aW9uIG9mIHRoaXMgaGFwcGVucworICAgICAgICAvLyBpbiBTZXJ2ZXIuc3RhcnQgY2FsbGJhY2sKKyAgICAgICAgaWYgKCB0aGlzLm9uYW1lICE9IG51bGwgKSB7CisgICAgICAgICAgICAvLyBXZSBhcmUgcmVnaXN0cmVkIC0gcmVnaXN0ZXIgdGhlIGFkYXB0ZXIgYXMgd2VsbC4KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgUmVnaXN0cnkuZ2V0UmVnaXN0cnkobnVsbCwgbnVsbCkucmVnaXN0ZXJDb21wb25lbnQKKyAgICAgICAgICAgICAgICAgICAgKHByb3RvY29sSGFuZGxlciwgdGhpcy5kb21haW4gKyAiOnR5cGU9cHJvdG9jb2xIYW5kbGVyLGNsYXNzTmFtZT0iCisgICAgICAgICAgICAgICAgICAgICArIHByb3RvY29sSGFuZGxlckNsYXNzTmFtZSwgbnVsbCk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3Ioc20uZ2V0U3RyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICgiY295b3RlQ29ubmVjdG9yLnByb3RvY29sUmVnaXN0cmF0aW9uRmFpbGVkIiksIGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxvZy5pbmZvKHNtLmdldFN0cmluZworICAgICAgICAgICAgICAgICAgICAgKCJjb3lvdGVDb25uZWN0b3IuY2Fubm90UmVnaXN0ZXJQcm90b2NvbCIpKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwcm90b2NvbEhhbmRsZXIuc3RhcnQoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBMaWZlY3ljbGVFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nCisgICAgICAgICAgICAgICAgICgiY295b3RlQ29ubmVjdG9yLnByb3RvY29sSGFuZGxlclN0YXJ0RmFpbGVkIiwgZSkpOworICAgICAgICB9CisKKyAgICAgICAgaWYoIHRoaXMuZG9tYWluICE9IG51bGwgKSB7CisgICAgICAgICAgICBtYXBwZXJMaXN0ZW5lci5zZXREb21haW4oIGRvbWFpbiApOworICAgICAgICAgICAgLy9tYXBwZXJMaXN0ZW5lci5zZXRFbmdpbmUoIHNlcnZpY2UuZ2V0Q29udGFpbmVyKCkuZ2V0TmFtZSgpICk7CisgICAgICAgICAgICBtYXBwZXJMaXN0ZW5lci5pbml0KCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFJlZ2lzdHJ5LmdldFJlZ2lzdHJ5KG51bGwsIG51bGwpLnJlZ2lzdGVyQ29tcG9uZW50CisgICAgICAgICAgICAgICAgICAgIChtYXBwZXIsIHRoaXMuZG9tYWluICsgIjp0eXBlPU1hcHBlciIsICJNYXBwZXIiKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIGxvZy5lcnJvcihzbS5nZXRTdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICgiY295b3RlQ29ubmVjdG9yLnByb3RvY29sUmVnaXN0cmF0aW9uRmFpbGVkIiksIGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogVGVybWluYXRlIHByb2Nlc3NpbmcgcmVxdWVzdHMgdmlhIHRoaXMgQ29ubmVjdG9yLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBMaWZlY3ljbGVFeGNlcHRpb24gaWYgYSBmYXRhbCBzaHV0ZG93biBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdG9wKCkgdGhyb3dzIExpZmVjeWNsZUV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gVmFsaWRhdGUgYW5kIHVwZGF0ZSBvdXIgY3VycmVudCBzdGF0ZQorICAgICAgICBpZiAoIXN0YXJ0ZWQpIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcihzbS5nZXRTdHJpbmcoImNveW90ZUNvbm5lY3Rvci5ub3RTdGFydGVkIikpOworICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIH0KKyAgICAgICAgbGlmZWN5Y2xlLmZpcmVMaWZlY3ljbGVFdmVudChTVE9QX0VWRU5ULCBudWxsKTsKKyAgICAgICAgc3RhcnRlZCA9IGZhbHNlOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBSZWdpc3RyeS5nZXRSZWdpc3RyeShudWxsLCBudWxsKS51bnJlZ2lzdGVyQ29tcG9uZW50CisgICAgICAgICAgICAgICAgKG5ldyBPYmplY3ROYW1lKGRvbWFpbiwidHlwZSIsICJNYXBwZXIiKSk7CisgICAgICAgICAgICBSZWdpc3RyeS5nZXRSZWdpc3RyeShudWxsLCBudWxsKS51bnJlZ2lzdGVyQ29tcG9uZW50CisgICAgICAgICAgICAgICAgKG5ldyBPYmplY3ROYW1lKGRvbWFpbgorICAgICAgICAgICAgICAgICArICI6dHlwZT1wcm90b2NvbEhhbmRsZXIsY2xhc3NOYW1lPSIKKyAgICAgICAgICAgICAgICAgKyBwcm90b2NvbEhhbmRsZXJDbGFzc05hbWUpKTsKKyAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2cuaW5mbyggIkVycm9yIHVucmVnaXN0ZXJpbmcgbWFwcGVyICIsIGUpOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwcm90b2NvbEhhbmRsZXIuZGVzdHJveSgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IExpZmVjeWNsZUV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcKKyAgICAgICAgICAgICAgICAgKCJjb3lvdGVDb25uZWN0b3IucHJvdG9jb2xIYW5kbGVyRGVzdHJveUZhaWxlZCIsIGUpKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLSBKTVggcmVnaXN0cmF0aW9uICAtLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHByb3RlY3RlZCBTdHJpbmcgZG9tYWluOworICAgIHByb3RlY3RlZCBPYmplY3ROYW1lIG9uYW1lOworICAgIHByb3RlY3RlZCBNQmVhblNlcnZlciBtc2VydmVyOworICAgIE9iamVjdE5hbWUgY29udHJvbGxlcjsKKworICAgIHB1YmxpYyBPYmplY3ROYW1lIGdldENvbnRyb2xsZXIoKSB7CisgICAgICAgIHJldHVybiBjb250cm9sbGVyOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENvbnRyb2xsZXIoT2JqZWN0TmFtZSBjb250cm9sbGVyKSB7CisgICAgICAgIHRoaXMuY29udHJvbGxlciA9IGNvbnRyb2xsZXI7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdE5hbWUgZ2V0T2JqZWN0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG9uYW1lOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RG9tYWluKCkgeworICAgICAgICByZXR1cm4gZG9tYWluOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3ROYW1lIHByZVJlZ2lzdGVyKE1CZWFuU2VydmVyIHNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3ROYW1lIG5hbWUpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBvbmFtZT1uYW1lOworICAgICAgICBtc2VydmVyPXNlcnZlcjsKKyAgICAgICAgZG9tYWluPW5hbWUuZ2V0RG9tYWluKCk7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHBvc3RSZWdpc3RlcihCb29sZWFuIHJlZ2lzdHJhdGlvbkRvbmUpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwcmVEZXJlZ2lzdGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcG9zdERlcmVnaXN0ZXIoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiggc3RhcnRlZCApIHsKKyAgICAgICAgICAgICAgICBzdG9wKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2goIFRocm93YWJsZSB0ICkgeworICAgICAgICAgICAgbG9nLmVycm9yKCAiVW5yZWdpc3RlcmluZyAtIGNhbid0IHN0b3AiLCB0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHZvaWQgZmluZENvbnRhaW5lcigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIFJlZ2lzdGVyIHRvIHRoZSBzZXJ2aWNlCisgICAgICAgICAgICBPYmplY3ROYW1lIHBhcmVudE5hbWU9bmV3IE9iamVjdE5hbWUoIGRvbWFpbiArICI6IiArCisgICAgICAgICAgICAgICAgICAgICJ0eXBlPVNlcnZpY2UiKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbG9nLmRlYnVnKCJBZGRpbmcgdG8gIiArIHBhcmVudE5hbWUgKTsKKyAgICAgICAgICAgIGlmKCBtc2VydmVyLmlzUmVnaXN0ZXJlZChwYXJlbnROYW1lICkpIHsKKyAgICAgICAgICAgICAgICBtc2VydmVyLmludm9rZShwYXJlbnROYW1lLCAiYWRkQ29ubmVjdG9yIiwgbmV3IE9iamVjdFtdIHsgdGhpcyB9LAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsib3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuQ29ubmVjdG9yIn0pOworICAgICAgICAgICAgICAgIC8vIEFzIGEgc2lkZSBlZmZlY3Qgd2UnbGwgZ2V0IHRoZSBjb250YWluZXIgZmllbGQgc2V0CisgICAgICAgICAgICAgICAgLy8gQWxzbyBpbml0aWFsaXplIHdpbGwgYmUgY2FsbGVkCisgICAgICAgICAgICAgICAgLy9yZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBYWFggR28gZGlyZWN0bHkgdG8gdGhlIEVuZ2luZQorICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSgpOyAtIGlzIGNhbGxlZCBieSBhZGRDb25uZWN0b3IKKyAgICAgICAgICAgIE9iamVjdE5hbWUgZW5nTmFtZT1uZXcgT2JqZWN0TmFtZSggZG9tYWluICsgIjoiICsgInR5cGU9RW5naW5lIik7CisgICAgICAgICAgICBpZiggbXNlcnZlci5pc1JlZ2lzdGVyZWQoZW5nTmFtZSApKSB7CisgICAgICAgICAgICAgICAgT2JqZWN0IG9iaj1tc2VydmVyLmdldEF0dHJpYnV0ZShlbmdOYW1lLCAibWFuYWdlZFJlc291cmNlIik7CisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJGb3VuZCBlbmdpbmUgIiArIG9iaiArICIgIiArIG9iai5nZXRDbGFzcygpKTsKKyAgICAgICAgICAgICAgICBjb250YWluZXI9KENvbnRhaW5lcilvYmo7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gSW50ZXJuYWwgaW5pdGlhbGl6ZSAtIHdlIG5vdyBoYXZlIHRoZSBFbmdpbmUKKyAgICAgICAgICAgICAgICBpbml0aWFsaXplKCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJJbml0aWFsaXplZCIpOworICAgICAgICAgICAgICAgIC8vIEFzIGEgc2lkZSBlZmZlY3Qgd2UnbGwgZ2V0IHRoZSBjb250YWluZXIgZmllbGQgc2V0CisgICAgICAgICAgICAgICAgLy8gQWxzbyBpbml0aWFsaXplIHdpbGwgYmUgY2FsbGVkCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoKCBFeGNlcHRpb24gZXggKSB7CisgICAgICAgICAgICBsb2cuZXJyb3IoICJFcnJvciBmaW5kaW5nIGNvbnRhaW5lciAiICsgZXgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW5pdCgpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIGlmKCB0aGlzLmdldFNlcnZpY2UoKSAhPSBudWxsICkgeworICAgICAgICAgICAgbG9nLmRlYnVnKCAiQWxyZWFkeSBjb25maWd1cmVkIiApOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmKCBjb250YWluZXI9PW51bGwgKSB7CisgICAgICAgICAgICBmaW5kQ29udGFpbmVyKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkZXN0cm95KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmKCBvbmFtZSE9bnVsbCAmJiBjb250cm9sbGVyPT1vbmFtZSApIHsKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiVW5yZWdpc3RlciBpdHNlbGYgIiArIG9uYW1lICk7CisgICAgICAgICAgICBSZWdpc3RyeS5nZXRSZWdpc3RyeShudWxsLCBudWxsKS51bnJlZ2lzdGVyQ29tcG9uZW50KG9uYW1lKTsKKyAgICAgICAgfQorICAgICAgICBpZiggZ2V0U2VydmljZSgpID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGdldFNlcnZpY2UoKS5yZW1vdmVDb25uZWN0b3IodGhpcyk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29ubmVjdG9yL0NvbnN0YW50cy5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2Nvbm5lY3Rvci9Db25zdGFudHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjQ5YmI5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2Nvbm5lY3Rvci9Db25zdGFudHMuamF2YQpAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3RvcjsKKworCisvKioKKyAqIFN0YXRpYyBjb25zdGFudHMgZm9yIHRoaXMgcGFja2FnZS4KKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgQ29uc3RhbnRzIHsKKworCQorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0YW50cworCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQYWNrYWdlID0gIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfQ09OTkVDVElPTl9MSU5HRVIgPSAtMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0NPTk5FQ1RJT05fVElNRU9VVCA9IDYwMDAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfQ09OTkVDVElPTl9VUExPQURfVElNRU9VVCA9IDMwMDAwMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1NFUlZFUl9TT0NLRVRfVElNRU9VVCA9IDA7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9DRVNTT1JfSURMRSA9IDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPQ0VTU09SX0FDVElWRSA9IDE7CisKKyAgICAvKioKKyAgICAgKiBTZWN1cml0eSBmbGFnLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBTRUNVUklUWSA9IAorICAgICAgICAoU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpICE9IG51bGwpOworCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb25uZWN0b3IvQ295b3RlQWRhcHRlci5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2Nvbm5lY3Rvci9Db3lvdGVBZGFwdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTgxMWE4NgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb25uZWN0b3IvQ295b3RlQWRhcHRlci5qYXZhCkBAIC0wLDAgKzEsNTU3IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3RvcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5HbG9iYWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuV3JhcHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuU3RyaW5nTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNveW90ZS5BY3Rpb25Db2RlOworaW1wb3J0IG9yZy5hcGFjaGUuY295b3RlLkFkYXB0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5idWYuQjJDQ29udmVydGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuYnVmLkJ5dGVDaHVuazsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvbWNhdC51dGlsLmJ1Zi5DaGFyQ2h1bms7CitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5idWYuTWVzc2FnZUJ5dGVzOworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuaHR0cC5Db29raWVzOworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuaHR0cC5TZXJ2ZXJDb29raWU7CisKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiBhIHJlcXVlc3QgcHJvY2Vzc29yIHdoaWNoIGRlbGVnYXRlcyB0aGUgcHJvY2Vzc2luZyB0byBhCisgKiBDb3lvdGUgcHJvY2Vzc29yLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQGF1dGhvciBSZW15IE1hdWNoZXJhdAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgQ295b3RlQWRhcHRlcgorICAgIGltcGxlbWVudHMgQWRhcHRlciAKKyB7CisgICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKENveW90ZUFkYXB0ZXIuY2xhc3MpOworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RhbnRzCisKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFEQVBURVJfTk9URVMgPSAxOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IENveW90ZVByb2Nlc3NvciBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBjb25uZWN0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdG9yIENveW90ZUNvbm5lY3RvciB0aGF0IG93bnMgdGhpcyBwcm9jZXNzb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgQ295b3RlQWRhcHRlcihDb25uZWN0b3IgY29ubmVjdG9yKSB7CisKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgdGhpcy5jb25uZWN0b3IgPSBjb25uZWN0b3I7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgQ295b3RlQ29ubmVjdG9yIHdpdGggd2hpY2ggdGhpcyBwcm9jZXNzb3IgaXMgYXNzb2NpYXRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIENvbm5lY3RvciBjb25uZWN0b3IgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgbWF0Y2ggc3RyaW5nIGZvciBpZGVudGlmeWluZyBhIHNlc3Npb24gSUQgcGFyYW1ldGVyLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBtYXRjaCA9CisgICAgICAgICI7IiArIEdsb2JhbHMuU0VTU0lPTl9QQVJBTUVURVJfTkFNRSArICI9IjsKKworCisgICAgLyoqCisgICAgICogVGhlIG1hdGNoIHN0cmluZyBmb3IgaWRlbnRpZnlpbmcgYSBzZXNzaW9uIElEIHBhcmFtZXRlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gU0VTU0lPTl9JRCA9IG1hdGNoLnRvQ2hhckFycmF5KCk7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzdHJpbmcgbWFuYWdlciBmb3IgdGhpcyBwYWNrYWdlLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmdNYW5hZ2VyIHNtID0KKyAgICAgICAgU3RyaW5nTWFuYWdlci5nZXRNYW5hZ2VyKENvbnN0YW50cy5QYWNrYWdlKTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQWRhcHRlciBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFNlcnZpY2UgbWV0aG9kLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNlcnZpY2Uob3JnLmFwYWNoZS5jb3lvdGUuUmVxdWVzdCByZXEsIAorICAgIAkgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5jb3lvdGUuUmVzcG9uc2UgcmVzKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBSZXF1ZXN0IHJlcXVlc3QgPSAoUmVxdWVzdCkgcmVxLmdldE5vdGUoQURBUFRFUl9OT1RFUyk7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gKFJlc3BvbnNlKSByZXMuZ2V0Tm90ZShBREFQVEVSX05PVEVTKTsKKworICAgICAgICBpZiAocmVxdWVzdCA9PSBudWxsKSB7CisKKyAgICAgICAgICAgIC8vIENyZWF0ZSBvYmplY3RzCisgICAgICAgICAgICByZXF1ZXN0ID0gKFJlcXVlc3QpIGNvbm5lY3Rvci5jcmVhdGVSZXF1ZXN0KCk7CisgICAgICAgICAgICByZXF1ZXN0LnNldENveW90ZVJlcXVlc3QocmVxKTsKKyAgICAgICAgICAgIHJlc3BvbnNlID0gKFJlc3BvbnNlKSBjb25uZWN0b3IuY3JlYXRlUmVzcG9uc2UoKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNldENveW90ZVJlc3BvbnNlKHJlcyk7CisKKyAgICAgICAgICAgIC8vIExpbmsgb2JqZWN0cworICAgICAgICAgICAgcmVxdWVzdC5zZXRSZXNwb25zZShyZXNwb25zZSk7CisgICAgICAgICAgICByZXNwb25zZS5zZXRSZXF1ZXN0KHJlcXVlc3QpOworCisgICAgICAgICAgICAvLyBTZXQgYXMgbm90ZXMKKyAgICAgICAgICAgIHJlcS5zZXROb3RlKEFEQVBURVJfTk9URVMsIHJlcXVlc3QpOworICAgICAgICAgICAgcmVzLnNldE5vdGUoQURBUFRFUl9OT1RFUywgcmVzcG9uc2UpOworCisgICAgICAgICAgICAvLyBTZXQgcXVlcnkgc3RyaW5nIGVuY29kaW5nCisgICAgICAgICAgICByZXEuZ2V0UGFyYW1ldGVycygpLnNldFF1ZXJ5U3RyaW5nRW5jb2RpbmcKKyAgICAgICAgICAgICAgICAoY29ubmVjdG9yLmdldFVSSUVuY29kaW5nKCkpOworCisgICAgICAgIH0KKworICAgICAgICBpZiAoY29ubmVjdG9yLmdldFhwb3dlcmVkQnkoKSkgeworICAgICAgICAgICAgcmVzcG9uc2UuYWRkSGVhZGVyKCJYLVBvd2VyZWQtQnkiLCAiU2VydmxldC8yLjQiKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgIC8vIFBhcnNlIGFuZCBzZXQgQ2F0YWxpbmEgYW5kIGNvbmZpZ3VyYXRpb24gc3BlY2lmaWMgCisgICAgICAgICAgICAvLyByZXF1ZXN0IHBhcmFtZXRlcnMKKyAgICAgICAgICAgIGlmICggcG9zdFBhcnNlUmVxdWVzdChyZXEsIHJlcXVlc3QsIHJlcywgcmVzcG9uc2UpICkgeworICAgICAgICAgICAgICAgIC8vIENhbGxpbmcgdGhlIGNvbnRhaW5lcgorICAgICAgICAgICAgICAgIGNvbm5lY3Rvci5nZXRDb250YWluZXIoKS5nZXRQaXBlbGluZSgpLmdldEZpcnN0KCkuaW52b2tlKHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmVzcG9uc2UuZmluaXNoUmVzcG9uc2UoKTsKKyAgICAgICAgICAgIHJlcS5hY3Rpb24oIEFjdGlvbkNvZGUuQUNUSU9OX1BPU1RfUkVRVUVTVCAsIG51bGwpOworCisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIDsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcihzbS5nZXRTdHJpbmcoImNveW90ZUFkYXB0ZXIuc2VydmljZSIpLCB0KTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIC8vIFJlY3ljbGUgdGhlIHdyYXBwZXIgcmVxdWVzdCBhbmQgcmVzcG9uc2UKKyAgICAgICAgICAgIHJlcXVlc3QucmVjeWNsZSgpOworICAgICAgICAgICAgcmVzcG9uc2UucmVjeWNsZSgpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm90ZWN0ZWQgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBQYXJzZSBhZGRpdGlvbmFsIHJlcXVlc3QgcGFyYW1ldGVycy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwb3N0UGFyc2VSZXF1ZXN0KG9yZy5hcGFjaGUuY295b3RlLlJlcXVlc3QgcmVxLCAKKyAgICAJCSAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVlc3QgcmVxdWVzdCwKKyAgICAJCSAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuY295b3RlLlJlc3BvbnNlIHJlcywgCisJCQkJCQkJCQkgICBSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIFhYWCB0aGUgcHJvY2Vzc29yIG5lZWRzIHRvIHNldCBhIGNvcnJlY3Qgc2NoZW1lIGFuZCBwb3J0IHByaW9yIHRvIHRoaXMgcG9pbnQsIAorICAgICAgICAvLyBpbiBhanAxMyBwcm90b2NvbHMgZG9udCBtYWtlIHNlbnNlIHRvIGdldCB0aGUgcG9ydCBmcm9tIHRoZSBjb25uZWN0b3IuLgorICAgICAgICAvLyBYWFggdGhlIHByb2Nlc3NvciBtYXkgaGF2ZSBzZXQgYSBjb3JyZWN0IHNjaGVtZSBhbmQgcG9ydCBwcmlvciB0byB0aGlzIHBvaW50LCAKKyAgICAgICAgLy8gaW4gYWpwMTMgcHJvdG9jb2xzIGRvbnQgbWFrZSBzZW5zZSB0byBnZXQgdGhlIHBvcnQgZnJvbSB0aGUgY29ubmVjdG9yLi4uCisgICAgICAgIC8vIG90aGVyd2lzZSwgdXNlIGNvbm5lY3RvciBjb25maWd1cmF0aW9uCisgICAgICAgIGlmICghIHJlcS5zY2hlbWUoKS5pc051bGwoKSkgeworICAgICAgICAgICAgLy8gdXNlIHByb2Nlc3NvciBzcGVjaWZpZWQgc2NoZW1lIHRvIGRldGVybWluZSBzZWN1cmUgc3RhdGUKKyAgICAgICAgICAgIHJlcXVlc3Quc2V0U2VjdXJlKHJlcS5zY2hlbWUoKS5lcXVhbHMoImh0dHBzIikpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gdXNlIGNvbm5lY3RvciBzY2hlbWUgYW5kIHNlY3VyZSBjb25maWd1cmF0aW9uLCAoZGVmYXVsdHMgdG8KKyAgICAgICAgICAgIC8vICJodHRwIiBhbmQgZmFsc2UgcmVzcGVjdGl2ZWx5KQorICAgICAgICAgICAgcmVxLnNjaGVtZSgpLnNldFN0cmluZyhjb25uZWN0b3IuZ2V0U2NoZW1lKCkpOworICAgICAgICAgICAgcmVxdWVzdC5zZXRTZWN1cmUoY29ubmVjdG9yLmdldFNlY3VyZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEZpbHRlciB0cmFjZSBtZXRob2QKKyAgICAgICAgaWYgKCFjb25uZWN0b3IuZ2V0QWxsb3dUcmFjZSgpIAorICAgICAgICAgICAgJiYgcmVxLm1ldGhvZCgpLmVxdWFsc0lnbm9yZUNhc2UoIlRSQUNFIikpIHsKKyAgICAgICAgICAgIHJlcy5zZXRTdGF0dXMoNDAzKTsKKyAgICAgICAgICAgIHJlcy5zZXRNZXNzYWdlKCJUUkFDRSBtZXRob2QgaXMgbm90IGFsbG93ZWQiKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEZJWE1FOiB0aGUgY29kZSBiZWxvdyBkb2VzbnQgYmVsb25ncyB0byBoZXJlLCAKKyAgICAgICAgLy8gdGhpcyBpcyBvbmx5IGhhdmUgc2Vuc2UgCisgICAgICAgIC8vIGluIEh0dHAxMSwgbm90IGluIGFqcDEzLi4KKyAgICAgICAgLy8gQXQgdGhpcyBwb2ludCB0aGUgSG9zdCBoZWFkZXIgaGFzIGJlZW4gcHJvY2Vzc2VkLgorICAgICAgICAvLyBPdmVycmlkZSBpZiB0aGUgcHJveHlQb3J0L3Byb3h5SG9zdCBhcmUgc2V0IAorICAgICAgICBTdHJpbmcgcHJveHlOYW1lID0gY29ubmVjdG9yLmdldFByb3h5TmFtZSgpOworICAgICAgICBpbnQgcHJveHlQb3J0ID0gY29ubmVjdG9yLmdldFByb3h5UG9ydCgpOworICAgICAgICBpZiAocHJveHlQb3J0ICE9IDApIHsKKyAgICAgICAgICAgIHJlcS5zZXRTZXJ2ZXJQb3J0KHByb3h5UG9ydCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHByb3h5TmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXEuc2VydmVyTmFtZSgpLnNldFN0cmluZyhwcm94eU5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gVVJJIGRlY29kaW5nCisgICAgICAgIE1lc3NhZ2VCeXRlcyBkZWNvZGVkVVJJID0gcmVxLmRlY29kZWRVUkkoKTsKKyAgICAgICAgZGVjb2RlZFVSSS5kdXBsaWNhdGUocmVxLnJlcXVlc3RVUkkoKSk7CisKKyAgICAgICAgaWYgKGRlY29kZWRVUkkuZ2V0VHlwZSgpID09IE1lc3NhZ2VCeXRlcy5UX0JZVEVTKSB7CisgICAgICAgICAgICAvLyAleHggZGVjb2Rpbmcgb2YgdGhlIFVSTAorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXEuZ2V0VVJMRGVjb2RlcigpLmNvbnZlcnQoZGVjb2RlZFVSSSwgZmFsc2UpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICAgICAgcmVzLnNldFN0YXR1cyg0MDApOworICAgICAgICAgICAgICAgIHJlcy5zZXRNZXNzYWdlKCJJbnZhbGlkIFVSSSIpOworICAgICAgICAgICAgICAgIHRocm93IGlvZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIE5vcm1hbGl6YXRpb24KKyAgICAgICAgICAgIGlmICghbm9ybWFsaXplKHJlcS5kZWNvZGVkVVJJKCkpKSB7CisgICAgICAgICAgICAgICAgcmVzLnNldFN0YXR1cyg0MDApOworICAgICAgICAgICAgICAgIHJlcy5zZXRNZXNzYWdlKCJJbnZhbGlkIFVSSSIpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIENoYXJhY3RlciBkZWNvZGluZworICAgICAgICAgICAgY29udmVydFVSSShkZWNvZGVkVVJJLCByZXF1ZXN0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFRoZSBVUkwgaXMgY2hhcnMgb3IgU3RyaW5nLCBhbmQgaGFzIGJlZW4gc2VudCB1c2luZyBhbiBpbi1tZW1vcnkKKyAgICAgICAgICAgIC8vIHByb3RvY29sIGhhbmRsZXIsIHdlIGhhdmUgdG8gYXNzdW1lIHRoZSBVUkwgaGFzIGJlZW4gcHJvcGVybHkKKyAgICAgICAgICAgIC8vIGRlY29kZWQgYWxyZWFkeQorICAgICAgICAgICAgZGVjb2RlZFVSSS50b0NoYXJzKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBTZXQgdGhlIHJlbW90ZSBwcmluY2lwYWwKKyAgICAgICAgU3RyaW5nIHByaW5jaXBhbCA9IHJlcS5nZXRSZW1vdGVVc2VyKCkudG9TdHJpbmcoKTsKKyAgICAgICAgaWYgKHByaW5jaXBhbCAhPSBudWxsKSB7CisgICAgICAgICAgICByZXF1ZXN0LnNldFVzZXJQcmluY2lwYWwobmV3IENveW90ZVByaW5jaXBhbChwcmluY2lwYWwpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFNldCB0aGUgYXV0aG9yaXphdGlvbiB0eXBlCisgICAgICAgIFN0cmluZyBhdXRodHlwZSA9IHJlcS5nZXRBdXRoVHlwZSgpLnRvU3RyaW5nKCk7CisgICAgICAgIGlmIChhdXRodHlwZSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXF1ZXN0LnNldEF1dGhUeXBlKGF1dGh0eXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFBhcnNlIHNlc3Npb24gSWQKKyAgICAgICAgcGFyc2VTZXNzaW9uSWQocmVxLCByZXF1ZXN0KTsKKworICAgICAgICAvLyBSZW1vdmUgYW55IHJlbWFpbmluZyBwYXJhbWV0ZXJzIChvdGhlciB0aGFuIHNlc3Npb24gaWQsIHdoaWNoIGhhcworICAgICAgICAvLyBhbHJlYWR5IGJlZW4gcmVtb3ZlZCBpbiBwYXJzZVNlc3Npb25JZCgpKSBmcm9tIHRoZSBVUkksIHNvIHRoZXkKKyAgICAgICAgLy8gd29uJ3QgYmUgY29uc2lkZXJlZCBieSB0aGUgbWFwcGluZyBhbGdvcml0aG0uCisgICAgICAgIENoYXJDaHVuayB1cmlDQyA9IGRlY29kZWRVUkkuZ2V0Q2hhckNodW5rKCk7CisgICAgICAgIGludCBzZW1pY29sb24gPSB1cmlDQy5pbmRleE9mKCc7Jyk7CisgICAgICAgIGlmIChzZW1pY29sb24gPiAwKSB7CisgICAgICAgICAgICBkZWNvZGVkVVJJLnNldENoYXJzCisgICAgICAgICAgICAgICAgKHVyaUNDLmdldEJ1ZmZlcigpLCB1cmlDQy5nZXRTdGFydCgpLCBzZW1pY29sb24pOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmVxdWVzdCBtYXBwaW5nLgorICAgICAgICBjb25uZWN0b3IuZ2V0TWFwcGVyKCkubWFwKHJlcS5zZXJ2ZXJOYW1lKCksIGRlY29kZWRVUkksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuZ2V0TWFwcGluZ0RhdGEoKSk7CisgICAgICAgIHJlcXVlc3Quc2V0Q29udGV4dCgoQ29udGV4dCkgcmVxdWVzdC5nZXRNYXBwaW5nRGF0YSgpLmNvbnRleHQpOworICAgICAgICByZXF1ZXN0LnNldFdyYXBwZXIoKFdyYXBwZXIpIHJlcXVlc3QuZ2V0TWFwcGluZ0RhdGEoKS53cmFwcGVyKTsKKworICAgICAgICAvLyBQb3NzaWJsZSByZWRpcmVjdAorICAgICAgICBNZXNzYWdlQnl0ZXMgcmVkaXJlY3RQYXRoTUIgPSByZXF1ZXN0LmdldE1hcHBpbmdEYXRhKCkucmVkaXJlY3RQYXRoOworICAgICAgICBpZiAoIXJlZGlyZWN0UGF0aE1CLmlzTnVsbCgpKSB7CisgICAgICAgICAgICBTdHJpbmcgcmVkaXJlY3RQYXRoID0gcmVkaXJlY3RQYXRoTUIudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIFN0cmluZyBxdWVyeSA9IHJlcXVlc3QuZ2V0UXVlcnlTdHJpbmcoKTsKKyAgICAgICAgICAgIGlmIChxdWVyeSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBub3Qgb3B0aW1hbCwgYnV0IGFzIHRoaXMgaXMgbm90IHZlcnkgY29tbW9uLCBpdAorICAgICAgICAgICAgICAgIC8vIHNob3VsZG4ndCBtYXR0ZXIKKyAgICAgICAgICAgICAgICByZWRpcmVjdFBhdGggPSByZWRpcmVjdFBhdGggKyAiPyIgKyBxdWVyeTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRSZWRpcmVjdChyZWRpcmVjdFBhdGgpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gUGFyc2Ugc2Vzc2lvbiBJZAorICAgICAgICBwYXJzZVNlc3Npb25Db29raWVzSWQocmVxLCByZXF1ZXN0KTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFBhcnNlIHNlc3Npb24gaWQgaW4gVVJMLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHBhcnNlU2Vzc2lvbklkKG9yZy5hcGFjaGUuY295b3RlLlJlcXVlc3QgcmVxLCBSZXF1ZXN0IHJlcXVlc3QpIHsKKworICAgICAgICBDaGFyQ2h1bmsgdXJpQ0MgPSByZXEuZGVjb2RlZFVSSSgpLmdldENoYXJDaHVuaygpOworICAgICAgICBpbnQgc2VtaWNvbG9uID0gdXJpQ0MuaW5kZXhPZihtYXRjaCwgMCwgbWF0Y2gubGVuZ3RoKCksIDApOworCisgICAgICAgIGlmIChzZW1pY29sb24gPiAwKSB7CisKKyAgICAgICAgICAgIC8vIFBhcnNlIHNlc3Npb24gSUQsIGFuZCBleHRyYWN0IGl0IGZyb20gdGhlIGRlY29kZWQgcmVxdWVzdCBVUkkKKyAgICAgICAgICAgIGludCBzdGFydCA9IHVyaUNDLmdldFN0YXJ0KCk7CisgICAgICAgICAgICBpbnQgZW5kID0gdXJpQ0MuZ2V0RW5kKCk7CisKKyAgICAgICAgICAgIGludCBzZXNzaW9uSWRTdGFydCA9IHN0YXJ0ICsgc2VtaWNvbG9uICsgbWF0Y2gubGVuZ3RoKCk7CisgICAgICAgICAgICBpbnQgc2VtaWNvbG9uMiA9IHVyaUNDLmluZGV4T2YoJzsnLCBzZXNzaW9uSWRTdGFydCk7CisgICAgICAgICAgICBpZiAoc2VtaWNvbG9uMiA+PSAwKSB7CisgICAgICAgICAgICAgICAgcmVxdWVzdC5zZXRSZXF1ZXN0ZWRTZXNzaW9uSWQKKyAgICAgICAgICAgICAgICAgICAgKG5ldyBTdHJpbmcodXJpQ0MuZ2V0QnVmZmVyKCksIHNlc3Npb25JZFN0YXJ0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VtaWNvbG9uMiAtIHNlbWljb2xvbiAtIG1hdGNoLmxlbmd0aCgpKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlcXVlc3Quc2V0UmVxdWVzdGVkU2Vzc2lvbklkCisgICAgICAgICAgICAgICAgICAgIChuZXcgU3RyaW5nKHVyaUNDLmdldEJ1ZmZlcigpLCBzZXNzaW9uSWRTdGFydCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCAtIHNlc3Npb25JZFN0YXJ0KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXF1ZXN0LnNldFJlcXVlc3RlZFNlc3Npb25VUkwodHJ1ZSk7CisKKyAgICAgICAgICAgIC8vIEV4dHJhY3Qgc2Vzc2lvbiBJRCBmcm9tIHJlcXVlc3QgVVJJCisgICAgICAgICAgICBCeXRlQ2h1bmsgdXJpQkMgPSByZXEucmVxdWVzdFVSSSgpLmdldEJ5dGVDaHVuaygpOworICAgICAgICAgICAgc3RhcnQgPSB1cmlCQy5nZXRTdGFydCgpOworICAgICAgICAgICAgZW5kID0gdXJpQkMuZ2V0RW5kKCk7CisgICAgICAgICAgICBzZW1pY29sb24gPSB1cmlCQy5pbmRleE9mKG1hdGNoLCAwLCBtYXRjaC5sZW5ndGgoKSwgMCk7CisKKyAgICAgICAgICAgIGlmIChzZW1pY29sb24gPiAwKSB7CisgICAgICAgICAgICAgICAgc2Vzc2lvbklkU3RhcnQgPSBzdGFydCArIHNlbWljb2xvbjsKKyAgICAgICAgICAgICAgICBzZW1pY29sb24yID0gdXJpQ0MuaW5kZXhPZgorICAgICAgICAgICAgICAgICAgICAoJzsnLCBzdGFydCArIHNlbWljb2xvbiArIG1hdGNoLmxlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICB1cmlCQy5zZXRFbmQoc3RhcnQgKyBzZW1pY29sb24pOworICAgICAgICAgICAgICAgIGJ5dGVbXSBidWYgPSB1cmlCQy5nZXRCdWZmZXIoKTsKKyAgICAgICAgICAgICAgICBpZiAoc2VtaWNvbG9uMiA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW5kIC0gc3RhcnQgLSBzZW1pY29sb24yOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZltzdGFydCArIHNlbWljb2xvbiArIGldIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gYnVmW3N0YXJ0ICsgaSArIHNlbWljb2xvbjJdOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHVyaUJDLnNldEJ5dGVzKGJ1Ziwgc3RhcnQsIHNlbWljb2xvbiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoZW5kIC0gc3RhcnQgLSBzZW1pY29sb24yKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXF1ZXN0LnNldFJlcXVlc3RlZFNlc3Npb25JZChudWxsKTsKKyAgICAgICAgICAgIHJlcXVlc3Quc2V0UmVxdWVzdGVkU2Vzc2lvblVSTChmYWxzZSk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUGFyc2Ugc2Vzc2lvbiBpZCBpbiBVUkwuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcGFyc2VTZXNzaW9uQ29va2llc0lkKG9yZy5hcGFjaGUuY295b3RlLlJlcXVlc3QgcmVxLCBSZXF1ZXN0IHJlcXVlc3QpIHsKKworICAgICAgICAvLyBQYXJzZSBzZXNzaW9uIGlkIGZyb20gY29va2llcworICAgICAgICBDb29raWVzIHNlcnZlckNvb2tpZXMgPSByZXEuZ2V0Q29va2llcygpOworICAgICAgICBpbnQgY291bnQgPSBzZXJ2ZXJDb29raWVzLmdldENvb2tpZUNvdW50KCk7CisgICAgICAgIGlmIChjb3VudCA8PSAwKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgU2VydmVyQ29va2llIHNjb29raWUgPSBzZXJ2ZXJDb29raWVzLmdldENvb2tpZShpKTsKKyAgICAgICAgICAgIGlmIChzY29va2llLmdldE5hbWUoKS5lcXVhbHMoR2xvYmFscy5TRVNTSU9OX0NPT0tJRV9OQU1FKSkgeworICAgICAgICAgICAgICAgIC8vIE92ZXJyaWRlIGFueXRoaW5nIHJlcXVlc3RlZCBpbiB0aGUgVVJMCisgICAgICAgICAgICAgICAgaWYgKCFyZXF1ZXN0LmlzUmVxdWVzdGVkU2Vzc2lvbklkRnJvbUNvb2tpZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEFjY2VwdCBvbmx5IHRoZSBmaXJzdCBzZXNzaW9uIGlkIGNvb2tpZQorICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LnNldFJlcXVlc3RlZFNlc3Npb25JZAorICAgICAgICAgICAgICAgICAgICAgICAgKHNjb29raWUuZ2V0VmFsdWUoKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5zZXRSZXF1ZXN0ZWRTZXNzaW9uQ29va2llKHRydWUpOworICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LnNldFJlcXVlc3RlZFNlc3Npb25VUkwoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiBSZXF1ZXN0ZWQgY29va2llIHNlc3Npb24gaWQgaXMgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5nZXRSZXF1ZXN0ZWRTZXNzaW9uSWQoKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXF1ZXN0LmlzUmVxdWVzdGVkU2Vzc2lvbklkVmFsaWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVwbGFjZSB0aGUgc2Vzc2lvbiBpZCB1bnRpbCBvbmUgaXMgdmFsaWQKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3Quc2V0UmVxdWVzdGVkU2Vzc2lvbklkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNjb29raWUuZ2V0VmFsdWUoKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDaGFyYWN0ZXIgY29udmVyc2lvbiBvZiB0aGUgVVJJLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGNvbnZlcnRVUkkoTWVzc2FnZUJ5dGVzIHVyaSwgUmVxdWVzdCByZXF1ZXN0KSAKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgQnl0ZUNodW5rIGJjID0gdXJpLmdldEJ5dGVDaHVuaygpOworICAgICAgICBDaGFyQ2h1bmsgY2MgPSB1cmkuZ2V0Q2hhckNodW5rKCk7CisgICAgICAgIGNjLmFsbG9jYXRlKGJjLmdldExlbmd0aCgpLCAtMSk7CisKKyAgICAgICAgU3RyaW5nIGVuYyA9IGNvbm5lY3Rvci5nZXRVUklFbmNvZGluZygpOworICAgICAgICBpZiAoZW5jICE9IG51bGwpIHsKKyAgICAgICAgICAgIEIyQ0NvbnZlcnRlciBjb252ID0gcmVxdWVzdC5nZXRVUklDb252ZXJ0ZXIoKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYgKGNvbnYgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBjb252ID0gbmV3IEIyQ0NvbnZlcnRlcihlbmMpOworICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LnNldFVSSUNvbnZlcnRlcihjb252KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjb252LnJlY3ljbGUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gSWdub3JlCisgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJJbnZhbGlkIFVSSSBlbmNvZGluZzsgdXNpbmcgSFRUUCBkZWZhdWx0Iik7CisgICAgICAgICAgICAgICAgY29ubmVjdG9yLnNldFVSSUVuY29kaW5nKG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNvbnYgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnYuY29udmVydChiYywgY2MpOworICAgICAgICAgICAgICAgICAgICB1cmkuc2V0Q2hhcnMoY2MuZ2V0QnVmZmVyKCksIGNjLmdldFN0YXJ0KCksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2MuZ2V0TGVuZ3RoKCkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkludmFsaWQgVVJJIGNoYXJhY3RlciBlbmNvZGluZzsgdHJ5aW5nIGFzY2lpIik7CisgICAgICAgICAgICAgICAgICAgIGNjLnJlY3ljbGUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBEZWZhdWx0IGVuY29kaW5nOiBmYXN0IGNvbnZlcnNpb24KKyAgICAgICAgYnl0ZVtdIGJidWYgPSBiYy5nZXRCdWZmZXIoKTsKKyAgICAgICAgY2hhcltdIGNidWYgPSBjYy5nZXRCdWZmZXIoKTsKKyAgICAgICAgaW50IHN0YXJ0ID0gYmMuZ2V0U3RhcnQoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBiYy5nZXRMZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICBjYnVmW2ldID0gKGNoYXIpIChiYnVmW2kgKyBzdGFydF0gJiAweGZmKTsKKyAgICAgICAgfQorICAgICAgICB1cmkuc2V0Q2hhcnMoY2J1ZiwgMCwgYmMuZ2V0TGVuZ3RoKCkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBOb3JtYWxpemUgVVJJLgorICAgICAqIDxwPgorICAgICAqIFRoaXMgbWV0aG9kIG5vcm1hbGl6ZXMgIlwiLCAiLy8iLCAiLy4vIiBhbmQgIi8uLi8iLiBUaGlzIG1ldGhvZCB3aWxsCisgICAgICogcmV0dXJuIGZhbHNlIHdoZW4gdHJ5aW5nIHRvIGdvIGFib3ZlIHRoZSByb290LCBvciBpZiB0aGUgVVJJIGNvbnRhaW5zCisgICAgICogYSBudWxsIGJ5dGUuCisgICAgICogCisgICAgICogQHBhcmFtIHVyaU1CIFVSSSB0byBiZSBub3JtYWxpemVkCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIG5vcm1hbGl6ZShNZXNzYWdlQnl0ZXMgdXJpTUIpIHsKKworICAgICAgICBCeXRlQ2h1bmsgdXJpQkMgPSB1cmlNQi5nZXRCeXRlQ2h1bmsoKTsKKyAgICAgICAgYnl0ZVtdIGIgPSB1cmlCQy5nZXRCeXRlcygpOworICAgICAgICBpbnQgc3RhcnQgPSB1cmlCQy5nZXRTdGFydCgpOworICAgICAgICBpbnQgZW5kID0gdXJpQkMuZ2V0RW5kKCk7CisKKyAgICAgICAgLy8gVVJMICogaXMgYWNjZXB0YWJsZQorICAgICAgICBpZiAoKGVuZCAtIHN0YXJ0ID09IDEpICYmIGJbc3RhcnRdID09IChieXRlKSAnKicpCisgICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAgaW50IHBvcyA9IDA7CisgICAgICAgIGludCBpbmRleCA9IDA7CisKKyAgICAgICAgLy8gUmVwbGFjZSAnXCcgd2l0aCAnLycKKyAgICAgICAgLy8gQ2hlY2sgZm9yIG51bGwgYnl0ZQorICAgICAgICBmb3IgKHBvcyA9IHN0YXJ0OyBwb3MgPCBlbmQ7IHBvcysrKSB7CisgICAgICAgICAgICBpZiAoYltwb3NdID09IChieXRlKSAnXFwnKQorICAgICAgICAgICAgICAgIGJbcG9zXSA9IChieXRlKSAnLyc7CisgICAgICAgICAgICBpZiAoYltwb3NdID09IChieXRlKSAwKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRoZSBVUkwgbXVzdCBzdGFydCB3aXRoICcvJworICAgICAgICBpZiAoYltzdGFydF0gIT0gKGJ5dGUpICcvJykgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmVwbGFjZSAiLy8iIHdpdGggIi8iCisgICAgICAgIGZvciAocG9zID0gc3RhcnQ7IHBvcyA8IChlbmQgLSAxKTsgcG9zKyspIHsKKyAgICAgICAgICAgIGlmIChiW3Bvc10gPT0gKGJ5dGUpICcvJykgeworICAgICAgICAgICAgICAgIHdoaWxlICgocG9zICsgMSA8IGVuZCkgJiYgKGJbcG9zICsgMV0gPT0gKGJ5dGUpICcvJykpIHsKKyAgICAgICAgICAgICAgICAgICAgY29weUJ5dGVzKGIsIHBvcywgcG9zICsgMSwgZW5kIC0gcG9zIC0gMSk7CisgICAgICAgICAgICAgICAgICAgIGVuZC0tOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIElmIHRoZSBVUkkgZW5kcyB3aXRoICIvLiIgb3IgIi8uLiIsIHRoZW4gd2UgYXBwZW5kIGFuIGV4dHJhICIvIgorICAgICAgICAvLyBOb3RlOiBJdCBpcyBwb3NzaWJsZSB0byBleHRlbmQgdGhlIFVSSSBieSAxIHdpdGhvdXQgYW55IHNpZGUgZWZmZWN0CisgICAgICAgIC8vIGFzIHRoZSBuZXh0IGNoYXJhY3RlciBpcyBhIG5vbi1zaWduaWZpY2FudCBXUy4KKyAgICAgICAgaWYgKCgoZW5kIC0gc3RhcnQpID49IDIpICYmIChiW2VuZCAtIDFdID09IChieXRlKSAnLicpKSB7CisgICAgICAgICAgICBpZiAoKGJbZW5kIC0gMl0gPT0gKGJ5dGUpICcvJykgCisgICAgICAgICAgICAgICAgfHwgKChiW2VuZCAtIDJdID09IChieXRlKSAnLicpIAorICAgICAgICAgICAgICAgICAgICAmJiAoYltlbmQgLSAzXSA9PSAoYnl0ZSkgJy8nKSkpIHsKKyAgICAgICAgICAgICAgICBiW2VuZF0gPSAoYnl0ZSkgJy8nOworICAgICAgICAgICAgICAgIGVuZCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdXJpQkMuc2V0RW5kKGVuZCk7CisKKyAgICAgICAgaW5kZXggPSAwOworCisgICAgICAgIC8vIFJlc29sdmUgb2NjdXJyZW5jZXMgb2YgIi8uLyIgaW4gdGhlIG5vcm1hbGl6ZWQgcGF0aAorICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgaW5kZXggPSB1cmlCQy5pbmRleE9mKCIvLi8iLCAwLCAzLCBpbmRleCk7CisgICAgICAgICAgICBpZiAoaW5kZXggPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29weUJ5dGVzKGIsIHN0YXJ0ICsgaW5kZXgsIHN0YXJ0ICsgaW5kZXggKyAyLCAKKyAgICAgICAgICAgICAgICAgICAgICBlbmQgLSBzdGFydCAtIGluZGV4IC0gMik7CisgICAgICAgICAgICBlbmQgPSBlbmQgLSAyOworICAgICAgICAgICAgdXJpQkMuc2V0RW5kKGVuZCk7CisgICAgICAgIH0KKworICAgICAgICBpbmRleCA9IDA7CisKKyAgICAgICAgLy8gUmVzb2x2ZSBvY2N1cnJlbmNlcyBvZiAiLy4uLyIgaW4gdGhlIG5vcm1hbGl6ZWQgcGF0aAorICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgaW5kZXggPSB1cmlCQy5pbmRleE9mKCIvLi4vIiwgMCwgNCwgaW5kZXgpOworICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIC8vIFByZXZlbnQgZnJvbSBnb2luZyBvdXRzaWRlIG91ciBjb250ZXh0CisgICAgICAgICAgICBpZiAoaW5kZXggPT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBpbnQgaW5kZXgyID0gLTE7CisgICAgICAgICAgICBmb3IgKHBvcyA9IHN0YXJ0ICsgaW5kZXggLSAxOyAocG9zID49IDApICYmIChpbmRleDIgPCAwKTsgcG9zIC0tKSB7CisgICAgICAgICAgICAgICAgaWYgKGJbcG9zXSA9PSAoYnl0ZSkgJy8nKSB7CisgICAgICAgICAgICAgICAgICAgIGluZGV4MiA9IHBvczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb3B5Qnl0ZXMoYiwgc3RhcnQgKyBpbmRleDIsIHN0YXJ0ICsgaW5kZXggKyAzLAorICAgICAgICAgICAgICAgICAgICAgIGVuZCAtIHN0YXJ0IC0gaW5kZXggLSAzKTsKKyAgICAgICAgICAgIGVuZCA9IGVuZCArIGluZGV4MiAtIGluZGV4IC0gMzsKKyAgICAgICAgICAgIHVyaUJDLnNldEVuZChlbmQpOworICAgICAgICAgICAgaW5kZXggPSBpbmRleDI7CisgICAgICAgIH0KKworICAgICAgICB1cmlCQy5zZXRCeXRlcyhiLCBzdGFydCwgZW5kKTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3RlY3RlZCBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIENvcHkgYW4gYXJyYXkgb2YgYnl0ZXMgdG8gYSBkaWZmZXJlbnQgcG9zaXRpb24uIFVzZWQgZHVyaW5nIAorICAgICAqIG5vcm1hbGl6YXRpb24uCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGNvcHlCeXRlcyhieXRlW10gYiwgaW50IGRlc3QsIGludCBzcmMsIGludCBsZW4pIHsKKyAgICAgICAgZm9yIChpbnQgcG9zID0gMDsgcG9zIDwgbGVuOyBwb3MrKykgeworICAgICAgICAgICAgYltwb3MgKyBkZXN0XSA9IGJbcG9zICsgc3JjXTsKKyAgICAgICAgfQorICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29ubmVjdG9yL0NveW90ZUlucHV0U3RyZWFtLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29ubmVjdG9yL0NveW90ZUlucHV0U3RyZWFtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjExM2UwZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb25uZWN0b3IvQ295b3RlSW5wdXRTdHJlYW0uamF2YQpAQCAtMCwwICsxLDIyMCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLyAKKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbjsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldElucHV0U3RyZWFtOworCisKKy8qKgorICogVGhpcyBjbGFzcyBoYW5kbGVzIHJlYWRpbmcgYnl0ZXMuCisgKiAKKyAqIEBhdXRob3IgUmVteSBNYXVjaGVyYXQKKyAqIEBhdXRob3IgSmVhbi1GcmFuY29pcyBBcmNhbmQKKyAqLworcHVibGljIGNsYXNzIENveW90ZUlucHV0U3RyZWFtCisgICAgZXh0ZW5kcyBTZXJ2bGV0SW5wdXRTdHJlYW0geworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgcHJvdGVjdGVkIElucHV0QnVmZmVyIGliOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgcHJvdGVjdGVkIENveW90ZUlucHV0U3RyZWFtKElucHV0QnVmZmVyIGliKSB7CisgICAgICAgIHRoaXMuaWIgPSBpYjsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBhY2thZ2UgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBDbGVhciBmYWNhZGUuCisgICAgICovCisgICAgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgaWIgPSBudWxsOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNlcnZsZXRJbnB1dFN0cmVhbSBNZXRob2RzCisKKworICAgIHB1YmxpYyBpbnQgcmVhZCgpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7ICAgIAorICAgICAgICBpZiAoU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpICE9IG51bGwpeworICAgICAgICAgICAgCisgICAgICAgICAgICB0cnl7CisgICAgICAgICAgICAgICAgSW50ZWdlciByZXN1bHQgPSAKKyAgICAgICAgICAgICAgICAgICAgKEludGVnZXIpQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigpeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgSU9FeGNlcHRpb257CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIgaW50ZWdlciA9IG5ldyBJbnRlZ2VyKGliLnJlYWRCeXRlKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW50ZWdlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LmludFZhbHVlKCk7CisgICAgICAgICAgICB9IGNhdGNoKFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24gcGFlKXsKKyAgICAgICAgICAgICAgICBFeGNlcHRpb24gZSA9IHBhZS5nZXRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIElPRXhjZXB0aW9uKXsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgKElPRXhjZXB0aW9uKWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBpYi5yZWFkQnl0ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGludCBhdmFpbGFibGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAKKyAgICAgICAgaWYgKFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSAhPSBudWxsKXsKKyAgICAgICAgICAgIHRyeXsKKyAgICAgICAgICAgICAgICBJbnRlZ2VyIHJlc3VsdCA9IAorICAgICAgICAgICAgICAgICAgICAoSW50ZWdlcilBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKCl7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHRocm93cyBJT0V4Y2VwdGlvbnsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlciBpbnRlZ2VyID0gbmV3IEludGVnZXIoaWIuYXZhaWxhYmxlKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW50ZWdlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LmludFZhbHVlKCk7CisgICAgICAgICAgICB9IGNhdGNoKFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24gcGFlKXsKKyAgICAgICAgICAgICAgICBFeGNlcHRpb24gZSA9IHBhZS5nZXRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIElPRXhjZXB0aW9uKXsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgKElPRXhjZXB0aW9uKWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgcmV0dXJuIGliLmF2YWlsYWJsZSgpOworICAgICAgICB9ICAgIAorICAgIH0KKworICAgIHB1YmxpYyBpbnQgcmVhZChmaW5hbCBieXRlW10gYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgCisgICAgICAgIGlmIChTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCkgIT0gbnVsbCl7CisgICAgICAgICAgICB0cnl7CisgICAgICAgICAgICAgICAgSW50ZWdlciByZXN1bHQgPSAKKyAgICAgICAgICAgICAgICAgICAgKEludGVnZXIpQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigpeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgSU9FeGNlcHRpb257CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIgaW50ZWdlciA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEludGVnZXIoaWIucmVhZChiLCAwLCBiLmxlbmd0aCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW50ZWdlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LmludFZhbHVlKCk7CisgICAgICAgICAgICB9IGNhdGNoKFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24gcGFlKXsKKyAgICAgICAgICAgICAgICBFeGNlcHRpb24gZSA9IHBhZS5nZXRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIElPRXhjZXB0aW9uKXsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgKElPRXhjZXB0aW9uKWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBpYi5yZWFkKGIsIDAsIGIubGVuZ3RoKTsKKyAgICAgICAgIH0gICAgICAgIAorICAgIH0KKworCisgICAgcHVibGljIGludCByZWFkKGZpbmFsIGJ5dGVbXSBiLCBmaW5hbCBpbnQgb2ZmLCBmaW5hbCBpbnQgbGVuKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgCisgICAgICAgIGlmIChTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCkgIT0gbnVsbCl7CisgICAgICAgICAgICB0cnl7CisgICAgICAgICAgICAgICAgSW50ZWdlciByZXN1bHQgPSAKKyAgICAgICAgICAgICAgICAgICAgKEludGVnZXIpQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigpeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgSU9FeGNlcHRpb257CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIgaW50ZWdlciA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEludGVnZXIoaWIucmVhZChiLCBvZmYsIGxlbikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW50ZWdlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LmludFZhbHVlKCk7CisgICAgICAgICAgICB9IGNhdGNoKFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24gcGFlKXsKKyAgICAgICAgICAgICAgICBFeGNlcHRpb24gZSA9IHBhZS5nZXRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIElPRXhjZXB0aW9uKXsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgKElPRXhjZXB0aW9uKWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBpYi5yZWFkKGIsIG9mZiwgbGVuKTsKKyAgICAgICAgfSAgICAgICAgICAgIAorICAgIH0KKworCisgICAgcHVibGljIGludCByZWFkTGluZShieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLnJlYWRMaW5lKGIsIG9mZiwgbGVuKTsKKyAgICB9CisKKworICAgIC8qKiAKKyAgICAgKiBDbG9zZSB0aGUgc3RyZWFtCisgICAgICogU2luY2Ugd2UgcmUtY3ljbGUsIHdlIGNhbid0IGFsbG93IHRoZSBjYWxsIHRvIHN1cGVyLmNsb3NlKCkKKyAgICAgKiB3aGljaCB3b3VsZCBwZXJtYW50ZWx5IGRpc2FibGUgdXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAKKyAgICAgICAgaWYgKFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSAhPSBudWxsKXsKKyAgICAgICAgICAgIHRyeXsKKyAgICAgICAgICAgICAgICBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKKyAgICAgICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oKXsKKworICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgSU9FeGNlcHRpb257CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWIuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfSBjYXRjaChQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIHBhZSl7CisgICAgICAgICAgICAgICAgRXhjZXB0aW9uIGUgPSBwYWUuZ2V0RXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBJT0V4Y2VwdGlvbil7CisgICAgICAgICAgICAgICAgICAgIHRocm93IChJT0V4Y2VwdGlvbillOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgaWIuY2xvc2UoKTsKKyAgICAgICAgfSAgICAgICAgICAgIAorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2Nvbm5lY3Rvci9Db3lvdGVPdXRwdXRTdHJlYW0uamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb25uZWN0b3IvQ295b3RlT3V0cHV0U3RyZWFtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJkYTdiMAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb25uZWN0b3IvQ295b3RlT3V0cHV0U3RyZWFtLmphdmEKQEAgLTAsMCArMSwxMDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8gCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3RvcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRPdXRwdXRTdHJlYW07CisKKy8qKgorICogQ295b3RlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBzZXJ2bGV0IG91dHB1dCBzdHJlYW0uCisgKiAKKyAqIEBhdXRob3IgQ29zdGluIE1hbm9sYWNoZQorICogQGF1dGhvciBSZW15IE1hdWNoZXJhdAorICovCitwdWJsaWMgY2xhc3MgQ295b3RlT3V0cHV0U3RyZWFtIAorICAgIGV4dGVuZHMgU2VydmxldE91dHB1dFN0cmVhbSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICBwcm90ZWN0ZWQgT3V0cHV0QnVmZmVyIG9iOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgcHJvdGVjdGVkIENveW90ZU91dHB1dFN0cmVhbShPdXRwdXRCdWZmZXIgb2IpIHsKKyAgICAgICAgdGhpcy5vYiA9IG9iOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUGFja2FnZSBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIENsZWFyIGZhY2FkZS4KKyAgICAgKi8KKyAgICB2b2lkIGNsZWFyKCkgeworICAgICAgICBvYiA9IG51bGw7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gT3V0cHV0U3RyZWFtIE1ldGhvZHMKKworCisgICAgcHVibGljIHZvaWQgd3JpdGUoaW50IGkpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIG9iLndyaXRlQnl0ZShpKTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBiKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB3cml0ZShiLCAwLCBiLmxlbmd0aCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgb2Iud3JpdGUoYiwgb2ZmLCBsZW4pOworICAgIH0KKworCisgICAgLyoqCisgICAgICogV2lsbCBzZW5kIHRoZSBidWZmZXIgdG8gdGhlIGNsaWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBmbHVzaCgpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIG9iLmZsdXNoKCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIG9iLmNsb3NlKCk7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTZXJ2bGV0T3V0cHV0U3RyZWFtIE1ldGhvZHMKKworCisgICAgcHVibGljIHZvaWQgcHJpbnQoU3RyaW5nIHMpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIG9iLndyaXRlKHMpOworICAgIH0KKworCit9CisKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb25uZWN0b3IvQ295b3RlUHJpbmNpcGFsLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29ubmVjdG9yL0NveW90ZVByaW5jaXBhbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjMGEyNmIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29ubmVjdG9yL0NveW90ZVByaW5jaXBhbC5qYXZhCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yOworCitpbXBvcnQgamF2YS5zZWN1cml0eS5QcmluY2lwYWw7CisKKy8qKgorICogR2VuZXJpYyBpbXBsZW1lbnRhdGlvbiBvZiA8c3Ryb25nPmphdmEuc2VjdXJpdHkuUHJpbmNpcGFsPC9zdHJvbmc+IHRoYXQKKyAqIGlzIHVzZWQgdG8gcmVwcmVzZW50IHByaW5jaXBhbHMgYXV0aGVudGljYXRlZCBhdCB0aGUgcHJvdG9jb2wgaGFuZGxlciBsZXZlbC4KKyAqCisgKiBAYXV0aG9yIFJlbXkgTWF1Y2hlcmF0CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBDb3lvdGVQcmluY2lwYWwgCisgICAgaW1wbGVtZW50cyBQcmluY2lwYWwgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgcHVibGljIENveW90ZVByaW5jaXBhbChTdHJpbmcgbmFtZSkgeworCisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgdXNlcm5hbWUgb2YgdGhlIHVzZXIgcmVwcmVzZW50ZWQgYnkgdGhpcyBQcmluY2lwYWwuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLm5hbWUpOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdCwgd2hpY2ggZXhwb3NlcyBvbmx5CisgICAgICogaW5mb3JtYXRpb24gdGhhdCBzaG91bGQgYmUgcHVibGljLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiQ295b3RlUHJpbmNpcGFsWyIpOworICAgICAgICBzYi5hcHBlbmQodGhpcy5uYW1lKTsKKyAgICAgICAgc2IuYXBwZW5kKCJdIik7CisgICAgICAgIHJldHVybiAoc2IudG9TdHJpbmcoKSk7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2Nvbm5lY3Rvci9Db3lvdGVSZWFkZXIuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb25uZWN0b3IvQ295b3RlUmVhZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJiMDE0OAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb25uZWN0b3IvQ295b3RlUmVhZGVyLmphdmEKQEAgLTAsMCArMSwxOTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8gCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3RvcjsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworCisvKioKKyAqIENveW90ZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgYnVmZnJlZCByZWFkZXIuCisgKiAKKyAqIEBhdXRob3IgUmVteSBNYXVjaGVyYXQKKyAqLworcHVibGljIGNsYXNzIENveW90ZVJlYWRlcgorICAgIGV4dGVuZHMgQnVmZmVyZWRSZWFkZXIgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdGFudHMKKworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIExJTkVfU0VQID0geyAnXHInLCAnXG4nIH07CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9MSU5FX0xFTkdUSCA9IDQwOTY7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICBwcm90ZWN0ZWQgSW5wdXRCdWZmZXIgaWI7CisKKworICAgIHByb3RlY3RlZCBjaGFyW10gbGluZUJ1ZmZlciA9IG51bGw7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICBwdWJsaWMgQ295b3RlUmVhZGVyKElucHV0QnVmZmVyIGliKSB7CisgICAgICAgIHN1cGVyKGliLCAxKTsKKyAgICAgICAgdGhpcy5pYiA9IGliOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUGFja2FnZSBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIENsZWFyIGZhY2FkZS4KKyAgICAgKi8KKyAgICB2b2lkIGNsZWFyKCkgeworICAgICAgICBpYiA9IG51bGw7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUmVhZGVyIE1ldGhvZHMKKworCisgICAgcHVibGljIHZvaWQgY2xvc2UoKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpYi5jbG9zZSgpOworICAgIH0KKworCisgICAgcHVibGljIGludCByZWFkKCkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGliLnJlYWQoKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBpbnQgcmVhZChjaGFyW10gY2J1ZikKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGliLnJlYWQoY2J1ZiwgMCwgY2J1Zi5sZW5ndGgpOworICAgIH0KKworCisgICAgcHVibGljIGludCByZWFkKGNoYXJbXSBjYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gaWIucmVhZChjYnVmLCBvZmYsIGxlbik7CisgICAgfQorCisKKyAgICBwdWJsaWMgbG9uZyBza2lwKGxvbmcgbikKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGliLnNraXAobik7CisgICAgfQorCisKKyAgICBwdWJsaWMgYm9vbGVhbiByZWFkeSgpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBpYi5yZWFkeSgpOworICAgIH0KKworCisgICAgcHVibGljIGJvb2xlYW4gbWFya1N1cHBvcnRlZCgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBtYXJrKGludCByZWFkQWhlYWRMaW1pdCkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWIubWFyayhyZWFkQWhlYWRMaW1pdCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCByZXNldCgpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGliLnJlc2V0KCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgU3RyaW5nIHJlYWRMaW5lKCkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAobGluZUJ1ZmZlciA9PSBudWxsKSB7CisgICAgICAgICAgICBsaW5lQnVmZmVyID0gbmV3IGNoYXJbTUFYX0xJTkVfTEVOR1RIXTsKKyAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIHJlc3VsdCA9IG51bGw7CisKKyAgICAgICAgaW50IHBvcyA9IDA7CisgICAgICAgIGludCBlbmQgPSAtMTsKKyAgICAgICAgaW50IHNraXAgPSAtMTsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGFnZ3JlZ2F0b3IgPSBudWxsOworICAgICAgICB3aGlsZSAoZW5kIDwgMCkgeworICAgICAgICAgICAgbWFyayhNQVhfTElORV9MRU5HVEgpOworICAgICAgICAgICAgd2hpbGUgKChwb3MgPCBNQVhfTElORV9MRU5HVEgpICYmIChlbmQgPCAwKSkgeworICAgICAgICAgICAgICAgIGludCBuUmVhZCA9IHJlYWQobGluZUJ1ZmZlciwgcG9zLCBNQVhfTElORV9MRU5HVEggLSBwb3MpOworICAgICAgICAgICAgICAgIGlmIChuUmVhZCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBvcyA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbmQgPSBwb3M7CisgICAgICAgICAgICAgICAgICAgIHNraXAgPSBwb3M7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBwb3M7IChpIDwgKHBvcyArIG5SZWFkKSkgJiYgKGVuZCA8IDApOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmVCdWZmZXJbaV0gPT0gTElORV9TRVBbMF0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuZCA9IGk7CisgICAgICAgICAgICAgICAgICAgICAgICBza2lwID0gaSArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIG5leHRjaGFyOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT0gKHBvcyArIG5SZWFkIC0gMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0Y2hhciA9IChjaGFyKSByZWFkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRjaGFyID0gbGluZUJ1ZmZlcltpKzFdOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRjaGFyID09IExJTkVfU0VQWzFdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCsrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxpbmVCdWZmZXJbaV0gPT0gTElORV9TRVBbMV0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuZCA9IGk7CisgICAgICAgICAgICAgICAgICAgICAgICBza2lwID0gaSArIDE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG5SZWFkID4gMCkgeworICAgICAgICAgICAgICAgICAgICBwb3MgKz0gblJlYWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGVuZCA8IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoYWdncmVnYXRvciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGFnZ3JlZ2F0b3IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFnZ3JlZ2F0b3IuYXBwZW5kKGxpbmVCdWZmZXIpOworICAgICAgICAgICAgICAgIHBvcyA9IDA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlc2V0KCk7CisgICAgICAgICAgICAgICAgc2tpcChza2lwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChhZ2dyZWdhdG9yID09IG51bGwpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBTdHJpbmcobGluZUJ1ZmZlciwgMCwgZW5kKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFnZ3JlZ2F0b3IuYXBwZW5kKGxpbmVCdWZmZXIsIDAsIGVuZCk7CisgICAgICAgICAgICByZXN1bHQgPSBhZ2dyZWdhdG9yLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVzdWx0OworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb25uZWN0b3IvQ295b3RlV3JpdGVyLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29ubmVjdG9yL0NveW90ZVdyaXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5Y2Q3MzYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29ubmVjdG9yL0NveW90ZVdyaXRlci5qYXZhCkBAIC0wLDAgKzEsMjc2IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovIAorCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3I7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CisKKy8qKgorICogQ295b3RlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBzZXJ2bGV0IHdyaXRlci4KKyAqIAorICogQGF1dGhvciBSZW15IE1hdWNoZXJhdAorICovCitwdWJsaWMgY2xhc3MgQ295b3RlV3JpdGVyCisgICAgZXh0ZW5kcyBQcmludFdyaXRlciB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0YW50cworCisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gTElORV9TRVAgPSB7ICdccicsICdcbicgfTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIHByb3RlY3RlZCBPdXRwdXRCdWZmZXIgb2I7CisgICAgcHJvdGVjdGVkIGJvb2xlYW4gZXJyb3IgPSBmYWxzZTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworICAgIHB1YmxpYyBDb3lvdGVXcml0ZXIoT3V0cHV0QnVmZmVyIG9iKSB7CisgICAgICAgIHN1cGVyKG9iKTsKKyAgICAgICAgdGhpcy5vYiA9IG9iOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUGFja2FnZSBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIENsZWFyIGZhY2FkZS4KKyAgICAgKi8KKyAgICB2b2lkIGNsZWFyKCkgeworICAgICAgICBvYiA9IG51bGw7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZWN5Y2xlLgorICAgICAqLworICAgIHZvaWQgcmVjeWNsZSgpIHsKKyAgICAgICAgZXJyb3IgPSBmYWxzZTsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBXcml0ZXIgTWV0aG9kcworCisKKyAgICBwdWJsaWMgdm9pZCBmbHVzaCgpIHsKKworICAgICAgICBpZiAoZXJyb3IpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9iLmZsdXNoKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGVycm9yID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKworICAgICAgICAvLyBXZSBkb24ndCBjbG9zZSB0aGUgUHJpbnRXcml0ZXIgLSBzdXBlcigpIGlzIG5vdCBjYWxsZWQsCisgICAgICAgIC8vIHNvIHRoZSBzdHJlYW0gY2FuIGJlIHJldXNlZC4gV2UgY2xvc2Ugb2IuCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvYi5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCApIHsKKyAgICAgICAgICAgIDsKKyAgICAgICAgfQorICAgICAgICBlcnJvciA9IGZhbHNlOworCisgICAgfQorCisKKyAgICBwdWJsaWMgYm9vbGVhbiBjaGVja0Vycm9yKCkgeworICAgICAgICBmbHVzaCgpOworICAgICAgICByZXR1cm4gZXJyb3I7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZShpbnQgYykgeworCisgICAgICAgIGlmIChlcnJvcikKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgb2Iud3JpdGUoYyk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGVycm9yID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZShjaGFyIGJ1ZltdLCBpbnQgb2ZmLCBpbnQgbGVuKSB7CisKKyAgICAgICAgaWYgKGVycm9yKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvYi53cml0ZShidWYsIG9mZiwgbGVuKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZXJyb3IgPSB0cnVlOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHdyaXRlKGNoYXIgYnVmW10pIHsKKwl3cml0ZShidWYsIDAsIGJ1Zi5sZW5ndGgpOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgd3JpdGUoU3RyaW5nIHMsIGludCBvZmYsIGludCBsZW4pIHsKKworICAgICAgICBpZiAoZXJyb3IpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9iLndyaXRlKHMsIG9mZiwgbGVuKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZXJyb3IgPSB0cnVlOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHdyaXRlKFN0cmluZyBzKSB7CisgICAgICAgIHdyaXRlKHMsIDAsIHMubGVuZ3RoKCkpOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcmludFdyaXRlciBNZXRob2RzCisKKworICAgIHB1YmxpYyB2b2lkIHByaW50KGJvb2xlYW4gYikgeworICAgICAgICBpZiAoYikgeworICAgICAgICAgICAgd3JpdGUoInRydWUiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHdyaXRlKCJmYWxzZSIpOworICAgICAgICB9CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBwcmludChjaGFyIGMpIHsKKyAgICAgICAgd3JpdGUoYyk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBwcmludChpbnQgaSkgeworICAgICAgICB3cml0ZShTdHJpbmcudmFsdWVPZihpKSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBwcmludChsb25nIGwpIHsKKyAgICAgICAgd3JpdGUoU3RyaW5nLnZhbHVlT2YobCkpOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgcHJpbnQoZmxvYXQgZikgeworICAgICAgICB3cml0ZShTdHJpbmcudmFsdWVPZihmKSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBwcmludChkb3VibGUgZCkgeworICAgICAgICB3cml0ZShTdHJpbmcudmFsdWVPZihkKSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBwcmludChjaGFyIHNbXSkgeworICAgICAgICB3cml0ZShzKTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHByaW50KFN0cmluZyBzKSB7CisgICAgICAgIGlmIChzID09IG51bGwpIHsKKyAgICAgICAgICAgIHMgPSAibnVsbCI7CisgICAgICAgIH0KKyAgICAgICAgd3JpdGUocyk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBwcmludChPYmplY3Qgb2JqKSB7CisgICAgICAgIHdyaXRlKFN0cmluZy52YWx1ZU9mKG9iaikpOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgcHJpbnRsbigpIHsKKyAgICAgICAgd3JpdGUoTElORV9TRVApOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgcHJpbnRsbihib29sZWFuIGIpIHsKKyAgICAgICAgcHJpbnQoYik7CisgICAgICAgIHByaW50bG4oKTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHByaW50bG4oY2hhciBjKSB7CisgICAgICAgIHByaW50KGMpOworICAgICAgICBwcmludGxuKCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBwcmludGxuKGludCBpKSB7CisgICAgICAgIHByaW50KGkpOworICAgICAgICBwcmludGxuKCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBwcmludGxuKGxvbmcgbCkgeworICAgICAgICBwcmludChsKTsKKyAgICAgICAgcHJpbnRsbigpOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgcHJpbnRsbihmbG9hdCBmKSB7CisgICAgICAgIHByaW50KGYpOworICAgICAgICBwcmludGxuKCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBwcmludGxuKGRvdWJsZSBkKSB7CisgICAgICAgIHByaW50KGQpOworICAgICAgICBwcmludGxuKCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBwcmludGxuKGNoYXIgY1tdKSB7CisgICAgICAgIHByaW50KGMpOworICAgICAgICBwcmludGxuKCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBwcmludGxuKFN0cmluZyBzKSB7CisgICAgICAgIHByaW50KHMpOworICAgICAgICBwcmludGxuKCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBwcmludGxuKE9iamVjdCBvKSB7CisgICAgICAgIHByaW50KG8pOworICAgICAgICBwcmludGxuKCk7CisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb25uZWN0b3IvSW5wdXRCdWZmZXIuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb25uZWN0b3IvSW5wdXRCdWZmZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTA5NzczCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2Nvbm5lY3Rvci9JbnB1dEJ1ZmZlci5qYXZhCkBAIC0wLDAgKzEsNDkzIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovIAorCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlJlYWRlcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY295b3RlLlJlcXVlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5idWYuQjJDQ29udmVydGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuYnVmLkJ5dGVDaHVuazsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvbWNhdC51dGlsLmJ1Zi5DaGFyQ2h1bms7CisKKworLyoqCisgKiBUaGUgYnVmZmVyIHVzZWQgYnkgVG9tY2F0IHJlcXVlc3QuIFRoaXMgaXMgYSBkZXJpdmF0aXZlIG9mIHRoZSBUb21jYXQgMy4zCisgKiBPdXRwdXRCdWZmZXIsIGFkYXB0ZWQgdG8gaGFuZGxlIGlucHV0IGluc3RlYWQgb2Ygb3V0cHV0LiBUaGlzIGFsbG93cyAKKyAqIGNvbXBsZXRlIHJlY3ljbGluZyBvZiB0aGUgZmFjYWRlIG9iamVjdHMgKHRoZSBTZXJ2bGV0SW5wdXRTdHJlYW0gYW5kIHRoZQorICogQnVmZmVyZWRSZWFkZXIpLgorICoKKyAqIEBhdXRob3IgUmVteSBNYXVjaGVyYXQKKyAqLworcHVibGljIGNsYXNzIElucHV0QnVmZmVyIGV4dGVuZHMgUmVhZGVyCisgICAgaW1wbGVtZW50cyBCeXRlQ2h1bmsuQnl0ZUlucHV0Q2hhbm5lbCwgQ2hhckNodW5rLkNoYXJJbnB1dENoYW5uZWwsCisgICAgICAgICAgICAgICBDaGFyQ2h1bmsuQ2hhck91dHB1dENoYW5uZWwgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdGFudHMKKworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9FTkNPRElORyA9IAorICAgICAgICBvcmcuYXBhY2hlLmNveW90ZS5Db25zdGFudHMuREVGQVVMVF9DSEFSQUNURVJfRU5DT0RJTkc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9CVUZGRVJfU0laRSA9IDgqMTAyNDsKKworICAgIC8vIFRoZSBidWZmZXIgY2FuIGJlIHVzZWQgZm9yIGJ5dGVbXSBhbmQgY2hhcltdIHJlYWRpbmcKKyAgICAvLyAoIHRoaXMgaXMgbmVlZGVkIHRvIHN1cHBvcnQgU2VydmxldElucHV0U3RyZWFtIGFuZCBCdWZmZXJlZFJlYWRlciApCisgICAgcHVibGljIGZpbmFsIGludCBJTklUSUFMX1NUQVRFID0gMDsKKyAgICBwdWJsaWMgZmluYWwgaW50IENIQVJfU1RBVEUgPSAxOworICAgIHB1YmxpYyBmaW5hbCBpbnQgQllURV9TVEFURSA9IDI7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgYnl0ZSBidWZmZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBCeXRlQ2h1bmsgYmI7CisKKworICAgIC8qKgorICAgICAqIFRoZSBjaHVuayBidWZmZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBDaGFyQ2h1bmsgY2I7CisKKworICAgIC8qKgorICAgICAqIFN0YXRlIG9mIHRoZSBvdXRwdXQgYnVmZmVyLgorICAgICAqLworICAgIHByaXZhdGUgaW50IHN0YXRlID0gMDsKKworCisgICAgLyoqCisgICAgICogTnVtYmVyIG9mIGJ5dGVzIHJlYWQuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgYnl0ZXNSZWFkID0gMDsKKworCisgICAgLyoqCisgICAgICogTnVtYmVyIG9mIGNoYXJzIHJlYWQuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgY2hhcnNSZWFkID0gMDsKKworCisgICAgLyoqCisgICAgICogRmxhZyB3aGljaCBpbmRpY2F0ZXMgaWYgdGhlIGlucHV0IGJ1ZmZlciBpcyBjbG9zZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGNsb3NlZCA9IGZhbHNlOworCisKKyAgICAvKioKKyAgICAgKiBCeXRlIGNodW5rIHVzZWQgdG8gaW5wdXQgYnl0ZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBCeXRlQ2h1bmsgaW5wdXRDaHVuayA9IG5ldyBCeXRlQ2h1bmsoKTsKKworCisgICAgLyoqCisgICAgICogRW5jb2RpbmcgdG8gdXNlLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGVuYzsKKworCisgICAgLyoqCisgICAgICogRW5jb2RlciBpcyBzZXQuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGdvdEVuYyA9IGZhbHNlOworCisKKyAgICAvKioKKyAgICAgKiBMaXN0IG9mIGVuY29kZXJzLgorICAgICAqLworICAgIHByb3RlY3RlZCBIYXNoTWFwIGVuY29kZXJzID0gbmV3IEhhc2hNYXAoKTsKKworCisgICAgLyoqCisgICAgICogQ3VycmVudCBieXRlIHRvIGNoYXIgY29udmVydGVyLgorICAgICAqLworICAgIHByb3RlY3RlZCBCMkNDb252ZXJ0ZXIgY29udjsKKworCisgICAgLyoqCisgICAgICogQXNzb2NpYXRlZCBDb3lvdGUgcmVxdWVzdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFJlcXVlc3QgY295b3RlUmVxdWVzdDsKKworCisgICAgLyoqCisgICAgICogQnVmZmVyIHBvc2l0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgaW50IG1hcmtQb3MgPSAtMTsKKworCisgICAgLyoqCisgICAgICogQnVmZmVyIHNpemUuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgc2l6ZSA9IC0xOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgLyoqCisgICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4gQWxsb2NhdGUgdGhlIGJ1ZmZlciB3aXRoIHRoZSBkZWZhdWx0IGJ1ZmZlciBzaXplLgorICAgICAqLworICAgIHB1YmxpYyBJbnB1dEJ1ZmZlcigpIHsKKworICAgICAgICB0aGlzKERFRkFVTFRfQlVGRkVSX1NJWkUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBbHRlcm5hdGUgY29uc3RydWN0b3Igd2hpY2ggYWxsb3dzIHNwZWNpZnlpbmcgdGhlIGluaXRpYWwgYnVmZmVyIHNpemUuCisgICAgICogCisgICAgICogQHBhcmFtIHNpemUgQnVmZmVyIHNpemUgdG8gdXNlCisgICAgICovCisgICAgcHVibGljIElucHV0QnVmZmVyKGludCBzaXplKSB7CisKKyAgICAgICAgdGhpcy5zaXplID0gc2l6ZTsKKyAgICAgICAgYmIgPSBuZXcgQnl0ZUNodW5rKHNpemUpOworICAgICAgICBiYi5zZXRMaW1pdChzaXplKTsKKyAgICAgICAgYmIuc2V0Qnl0ZUlucHV0Q2hhbm5lbCh0aGlzKTsKKyAgICAgICAgY2IgPSBuZXcgQ2hhckNodW5rKHNpemUpOworICAgICAgICBjYi5zZXRMaW1pdChzaXplKTsKKyAgICAgICAgY2Iuc2V0T3B0aW1pemVkV3JpdGUoZmFsc2UpOworICAgICAgICBjYi5zZXRDaGFySW5wdXRDaGFubmVsKHRoaXMpOworICAgICAgICBjYi5zZXRDaGFyT3V0cHV0Q2hhbm5lbCh0aGlzKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIEFzc29jaWF0ZWQgQ295b3RlIHJlcXVlc3QuCisgICAgICogCisgICAgICogQHBhcmFtIGNveW90ZVJlcXVlc3QgQXNzb2NpYXRlZCBDb3lvdGUgcmVxdWVzdAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlcXVlc3QoUmVxdWVzdCBjb3lvdGVSZXF1ZXN0KSB7CisJdGhpcy5jb3lvdGVSZXF1ZXN0ID0gY295b3RlUmVxdWVzdDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdldCBhc3NvY2lhdGVkIENveW90ZSByZXF1ZXN0LgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGFzc29jaWF0ZWQgQ295b3RlIHJlcXVlc3QKKyAgICAgKi8KKyAgICBwdWJsaWMgUmVxdWVzdCBnZXRSZXF1ZXN0KCkgeworICAgICAgICByZXR1cm4gdGhpcy5jb3lvdGVSZXF1ZXN0OworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJlY3ljbGUgdGhlIG91dHB1dCBidWZmZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVjeWNsZSgpIHsKKyAgICAgICAgCisgICAgICAgIHN0YXRlID0gSU5JVElBTF9TVEFURTsKKyAgICAgICAgYnl0ZXNSZWFkID0gMDsKKyAgICAgICAgY2hhcnNSZWFkID0gMDsKKyAgICAgICAgCisgICAgICAgIC8vIElmIHVzYWdlIG9mIG1hcmsgbWFkZSB0aGUgYnVmZmVyIHRvbyBiaWcsIHJlYWxsb2NhdGUgaXQKKyAgICAgICAgaWYgKGNiLmdldENoYXJzKCkubGVuZ3RoID4gc2l6ZSkgeworICAgICAgICAgICAgY2IgPSBuZXcgQ2hhckNodW5rKHNpemUpOworICAgICAgICAgICAgY2Iuc2V0TGltaXQoc2l6ZSk7CisgICAgICAgICAgICBjYi5zZXRDaGFySW5wdXRDaGFubmVsKHRoaXMpOworICAgICAgICAgICAgY2Iuc2V0Q2hhck91dHB1dENoYW5uZWwodGhpcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjYi5yZWN5Y2xlKCk7CisgICAgICAgIH0KKyAgICAgICAgbWFya1BvcyA9IC0xOworICAgICAgICBiYi5yZWN5Y2xlKCk7IAorICAgICAgICBjbG9zZWQgPSBmYWxzZTsKKyAgICAgICAgCisgICAgICAgIGlmIChjb252ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNvbnYucmVjeWNsZSgpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBnb3RFbmMgPSBmYWxzZTsKKyAgICAgICAgZW5jID0gbnVsbDsKKyAgICAgICAgCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDbG9zZSB0aGUgaW5wdXQgYnVmZmVyLgorICAgICAqIAorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gQW4gdW5kZXJseWluZyBJT0V4Y2VwdGlvbiBvY2N1cnJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgY2xvc2VkID0gdHJ1ZTsKKyAgICB9CisKKworICAgIHB1YmxpYyBpbnQgYXZhaWxhYmxlKCkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHN0YXRlID09IEJZVEVfU1RBVEUpIHsKKyAgICAgICAgICAgIHJldHVybiBiYi5nZXRMZW5ndGgoKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PSBDSEFSX1NUQVRFKSB7CisgICAgICAgICAgICByZXR1cm4gY2IuZ2V0TGVuZ3RoKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBCeXRlcyBIYW5kbGluZyBNZXRob2RzCisKKworICAgIC8qKiAKKyAgICAgKiBSZWFkcyBuZXcgYnl0ZXMgaW4gdGhlIGJ5dGUgY2h1bmsuCisgICAgICogCisgICAgICogQHBhcmFtIGNidWYgQnl0ZSBidWZmZXIgdG8gYmUgd3JpdHRlbiB0byB0aGUgcmVzcG9uc2UKKyAgICAgKiBAcGFyYW0gb2ZmIE9mZnNldAorICAgICAqIEBwYXJhbSBsZW4gTGVuZ3RoCisgICAgICogCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBBbiB1bmRlcmx5aW5nIElPRXhjZXB0aW9uIG9jY3VycmVkCisgICAgICovCisgICAgcHVibGljIGludCByZWFsUmVhZEJ5dGVzKGJ5dGUgY2J1ZltdLCBpbnQgb2ZmLCBpbnQgbGVuKQorCXRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKGNsb3NlZCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKGNveW90ZVJlcXVlc3QgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICBzdGF0ZSA9IEJZVEVfU1RBVEU7CisKKyAgICAgICAgaW50IHJlc3VsdCA9IGNveW90ZVJlcXVlc3QuZG9SZWFkKGJiKTsKKworICAgICAgICByZXR1cm4gcmVzdWx0OworCisgICAgfQorCisKKyAgICBwdWJsaWMgaW50IHJlYWRCeXRlKCkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGJiLnN1YnN0cmFjdCgpOworICAgIH0KKworCisgICAgcHVibGljIGludCByZWFkKGJ5dGVbXSBiLCBpbnQgb2ZmLCBpbnQgbGVuKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gYmIuc3Vic3RyYWN0KGIsIG9mZiwgbGVuKTsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ2hhcnMgSGFuZGxpbmcgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBTaW5jZSB0aGUgY29udmVydGVyIHdpbGwgdXNlIGFwcGVuZCwgaXQgaXMgcG9zc2libGUgdG8gZ2V0IGNoYXJzIHRvCisgICAgICogYmUgcmVtb3ZlZCBmcm9tIHRoZSBidWZmZXIgZm9yICJ3cml0aW5nIi4gU2luY2UgdGhlIGNoYXJzIGhhdmUgYWxyZWFkeQorICAgICAqIGJlZW4gcmVhZCBiZWZvcmUsIHRoZXkgYXJlIGlnbm9yZWQuIElmIGEgbWFyayB3YXMgc2V0LCB0aGVuIHRoZQorICAgICAqIG1hcmsgaXMgbG9zdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWFsV3JpdGVDaGFycyhjaGFyIGNbXSwgaW50IG9mZiwgaW50IGxlbikgCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIG1hcmtQb3MgPSAtMTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldEVuY29kaW5nKFN0cmluZyBzKSB7CisgICAgICAgIGVuYyA9IHM7CisgICAgfQorCisKKyAgICBwdWJsaWMgaW50IHJlYWxSZWFkQ2hhcnMoY2hhciBjYnVmW10sIGludCBvZmYsIGludCBsZW4pCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKCFnb3RFbmMpCisgICAgICAgICAgICBzZXRDb252ZXJ0ZXIoKTsKKworICAgICAgICBpZiAoYmIuZ2V0TGVuZ3RoKCkgPD0gMCkgeworICAgICAgICAgICAgaW50IG5SZWFkID0gcmVhbFJlYWRCeXRlcyhiYi5nZXRCeXRlcygpLCAwLCBiYi5nZXRCeXRlcygpLmxlbmd0aCk7CisgICAgICAgICAgICBpZiAoblJlYWQgPCAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKG1hcmtQb3MgPT0gLTEpIHsKKyAgICAgICAgICAgIGNiLnNldE9mZnNldCgwKTsKKyAgICAgICAgICAgIGNiLnNldEVuZCgwKTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnYuY29udmVydChiYiwgY2IpOworICAgICAgICBiYi5zZXRPZmZzZXQoYmIuZ2V0RW5kKCkpOworICAgICAgICBzdGF0ZSA9IENIQVJfU1RBVEU7CisKKyAgICAgICAgcmV0dXJuIGNiLmdldExlbmd0aCgpOworCisgICAgfQorCisKKyAgICBwdWJsaWMgaW50IHJlYWQoKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gY2Iuc3Vic3RyYWN0KCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgaW50IHJlYWQoY2hhcltdIGNidWYpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiByZWFkKGNidWYsIDAsIGNidWYubGVuZ3RoKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBpbnQgcmVhZChjaGFyW10gY2J1ZiwgaW50IG9mZiwgaW50IGxlbikKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGNiLnN1YnN0cmFjdChjYnVmLCBvZmYsIGxlbik7CisgICAgfQorCisKKyAgICBwdWJsaWMgbG9uZyBza2lwKGxvbmcgbikKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAobiA8IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIGxvbmcgblJlYWQgPSAwOworICAgICAgICB3aGlsZSAoblJlYWQgPCBuKSB7CisgICAgICAgICAgICBpZiAoY2IuZ2V0TGVuZ3RoKCkgPj0gbikgeworICAgICAgICAgICAgICAgIGNiLnNldE9mZnNldChjYi5nZXRTdGFydCgpICsgKGludCkgbik7CisgICAgICAgICAgICAgICAgblJlYWQgPSBuOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBuUmVhZCArPSBjYi5nZXRMZW5ndGgoKTsKKyAgICAgICAgICAgICAgICBjYi5zZXRPZmZzZXQoY2IuZ2V0RW5kKCkpOworICAgICAgICAgICAgICAgIGludCB0b1JlYWQgPSAwOworICAgICAgICAgICAgICAgIGlmIChjYi5nZXRDaGFycygpLmxlbmd0aCA8IChuIC0gblJlYWQpKSB7CisgICAgICAgICAgICAgICAgICAgIHRvUmVhZCA9IGNiLmdldENoYXJzKCkubGVuZ3RoOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRvUmVhZCA9IChpbnQpIChuIC0gblJlYWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnQgbmIgPSByZWFsUmVhZENoYXJzKGNiLmdldENoYXJzKCksIDAsIHRvUmVhZCk7CisgICAgICAgICAgICAgICAgaWYgKG5iIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gblJlYWQ7CisKKyAgICB9CisKKworICAgIHB1YmxpYyBib29sZWFuIHJlYWR5KCkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIChjYi5nZXRMZW5ndGgoKSA+IDApOworICAgIH0KKworCisgICAgcHVibGljIGJvb2xlYW4gbWFya1N1cHBvcnRlZCgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBtYXJrKGludCByZWFkQWhlYWRMaW1pdCkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGNiLmdldExlbmd0aCgpIDw9IDApIHsKKyAgICAgICAgICAgIGNiLnNldE9mZnNldCgwKTsKKyAgICAgICAgICAgIGNiLnNldEVuZCgwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICgoY2IuZ2V0QnVmZmVyKCkubGVuZ3RoID4gKDIgKiBzaXplKSkgCisgICAgICAgICAgICAgICAgJiYgKGNiLmdldExlbmd0aCgpKSA8IChjYi5nZXRTdGFydCgpKSkgeworICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoY2IuZ2V0QnVmZmVyKCksIGNiLmdldFN0YXJ0KCksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2IuZ2V0QnVmZmVyKCksIDAsIGNiLmdldExlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICBjYi5zZXRFbmQoY2IuZ2V0TGVuZ3RoKCkpOworICAgICAgICAgICAgICAgIGNiLnNldE9mZnNldCgwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpbnQgb2Zmc2V0ID0gcmVhZEFoZWFkTGltaXQ7CisgICAgICAgIGlmIChvZmZzZXQgPCBzaXplKSB7CisgICAgICAgICAgICBvZmZzZXQgPSBzaXplOworICAgICAgICB9CisgICAgICAgIGNiLnNldExpbWl0KGNiLmdldFN0YXJ0KCkgKyBvZmZzZXQpOworICAgICAgICBtYXJrUG9zID0gY2IuZ2V0U3RhcnQoKTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHN0YXRlID09IENIQVJfU1RBVEUpIHsKKyAgICAgICAgICAgIGlmIChtYXJrUG9zIDwgMCkgeworICAgICAgICAgICAgICAgIGNiLnJlY3ljbGUoKTsKKyAgICAgICAgICAgICAgICBtYXJrUG9zID0gLTE7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNiLnNldE9mZnNldChtYXJrUG9zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJiLnJlY3ljbGUoKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHVibGljIHZvaWQgY2hlY2tDb252ZXJ0ZXIoKSAKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAoIWdvdEVuYykKKyAgICAgICAgICAgIHNldENvbnZlcnRlcigpOworCisgICAgfQorCisKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRDb252ZXJ0ZXIoKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIGlmIChjb3lvdGVSZXF1ZXN0ICE9IG51bGwpCisgICAgICAgICAgICBlbmMgPSBjb3lvdGVSZXF1ZXN0LmdldENoYXJhY3RlckVuY29kaW5nKCk7CisKKyAgICAgICAgZ290RW5jID0gdHJ1ZTsKKyAgICAgICAgaWYgKGVuYyA9PSBudWxsKQorICAgICAgICAgICAgZW5jID0gREVGQVVMVF9FTkNPRElORzsKKyAgICAgICAgY29udiA9IChCMkNDb252ZXJ0ZXIpIGVuY29kZXJzLmdldChlbmMpOworICAgICAgICBpZiAoY29udiA9PSBudWxsKSB7CisgICAgICAgICAgICBpZiAoU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpICE9IG51bGwpeworICAgICAgICAgICAgICAgIHRyeXsKKyAgICAgICAgICAgICAgICAgICAgY29udiA9IChCMkNDb252ZXJ0ZXIpQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oKXsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHRocm93cyBJT0V4Y2VwdGlvbnsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQjJDQ29udmVydGVyKGVuYyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgKTsgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIH1jYXRjaChQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIGV4KXsKKyAgICAgICAgICAgICAgICAgICAgRXhjZXB0aW9uIGUgPSBleC5nZXRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBJT0V4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IChJT0V4Y2VwdGlvbillOyAKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNvbnYgPSBuZXcgQjJDQ29udmVydGVyKGVuYyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbmNvZGVycy5wdXQoZW5jLCBjb252KTsKKyAgICAgICAgfQorCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb25uZWN0b3IvTG9jYWxTdHJpbmdzLnByb3BlcnRpZXMgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29ubmVjdG9yL0xvY2FsU3RyaW5ncy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3NmIyY2UKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29ubmVjdG9yL0xvY2FsU3RyaW5ncy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNTggQEAKKworIworIyBDb3lvdGVDb25uZWN0b3IKKyMKKworY295b3RlQ29ubmVjdG9yLmFscmVhZHlJbml0aWFsaXplZD1UaGUgY29ubmVjdG9yIGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQKK2NveW90ZUNvbm5lY3Rvci5hbHJlYWR5U3RhcnRlZD1UaGUgY29ubmVjdG9yIGhhcyBhbHJlYWR5IGJlZW4gc3RhcnRlZAorY295b3RlQ29ubmVjdG9yLmNhbm5vdFJlZ2lzdGVyUHJvdG9jb2w9Q2Fubm90IHJlZ2lzdGVyIE1CZWFuIGZvciB0aGUgUHJvdG9jb2wKK2NveW90ZUNvbm5lY3Rvci5ub3RTdGFydGVkPUNveW90ZSBjb25uZWN0b3IgaGFzIG5vdCBiZWVuIHN0YXJ0ZWQKK2NveW90ZUNvbm5lY3Rvci5wcm90b2NvbEhhbmRsZXJEZXN0cm95RmFpbGVkPVByb3RvY29sIGhhbmRsZXIgZGVzdHJveSBmYWlsZWQ6IHswfQorY295b3RlQ29ubmVjdG9yLnByb3RvY29sSGFuZGxlckluaXRpYWxpemF0aW9uRmFpbGVkPVByb3RvY29sIGhhbmRsZXIgaW5pdGlhbGl6YXRpb24gZmFpbGVkOiB7MH0KK2NveW90ZUNvbm5lY3Rvci5wcm90b2NvbEhhbmRsZXJJbnN0YW50aWF0aW9uRmFpbGVkPVByb3RvY29sIGhhbmRsZXIgaW5zdGFudGlhdGlvbiBmYWlsZWQ6IHswfQorY295b3RlQ29ubmVjdG9yLnByb3RvY29sSGFuZGxlclN0YXJ0RmFpbGVkPVByb3RvY29sIGhhbmRsZXIgc3RhcnQgZmFpbGVkOiB7MH0KK2NveW90ZUNvbm5lY3Rvci5wcm90b2NvbFJlZ2lzdHJhdGlvbkZhaWxlZD1Qcm90b2NvbCBKTVggcmVnaXN0cmF0aW9uIGZhaWxlZAorY295b3RlQ29ubmVjdG9yLnByb3RvY29sSGFuZGxlclBhdXNlRmFpbGVkPVByb3RvY29sIGhhbmRsZXIgcGF1c2UgZmFpbGVkCitjb3lvdGVDb25uZWN0b3IucHJvdG9jb2xIYW5kbGVyUmVzdW1lRmFpbGVkPVByb3RvY29sIGhhbmRsZXIgcmVzdW1lIGZhaWxlZAorCisjCisjIENveW90ZUFkYXB0ZXIKKyMKKworY295b3RlQWRhcHRlci5zZXJ2aWNlPUFuIGV4Y2VwdGlvbiBvciBlcnJvciBvY2N1cnJlZCBpbiB0aGUgY29udGFpbmVyIGR1cmluZyB0aGUgcmVxdWVzdCBwcm9jZXNzaW5nCisKKyMKKyMgQ295b3RlUmVzcG9uc2UKKyMKKworY295b3RlUmVzcG9uc2UuZ2V0T3V0cHV0U3RyZWFtLmlzZT1nZXRXcml0ZXIoKSBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZCBmb3IgdGhpcyByZXNwb25zZQorY295b3RlUmVzcG9uc2UuZ2V0V3JpdGVyLmlzZT1nZXRPdXRwdXRTdHJlYW0oKSBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZCBmb3IgdGhpcyByZXNwb25zZQorY295b3RlUmVzcG9uc2UucmVzZXRCdWZmZXIuaXNlPUNhbm5vdCByZXNldCBidWZmZXIgYWZ0ZXIgcmVzcG9uc2UgaGFzIGJlZW4gY29tbWl0dGVkCitjb3lvdGVSZXNwb25zZS5zZW5kRXJyb3IuaXNlPUNhbm5vdCBjYWxsIHNlbmRFcnJvcigpIGFmdGVyIHRoZSByZXNwb25zZSBoYXMgYmVlbiBjb21taXR0ZWQKK2NveW90ZVJlc3BvbnNlLnNlbmRSZWRpcmVjdC5pc2U9Q2Fubm90IGNhbGwgc2VuZFJlZGlyZWN0KCkgYWZ0ZXIgdGhlIHJlc3BvbnNlIGhhcyBiZWVuIGNvbW1pdHRlZAorY295b3RlUmVzcG9uc2Uuc2V0QnVmZmVyU2l6ZS5pc2U9Q2Fubm90IGNoYW5nZSBidWZmZXIgc2l6ZSBhZnRlciBkYXRhIGhhcyBiZWVuIHdyaXR0ZW4KKworIworIyBDb3lvdGVSZXF1ZXN0CisjCisKK2NveW90ZVJlcXVlc3QuZ2V0SW5wdXRTdHJlYW0uaXNlPWdldFJlYWRlcigpIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkIGZvciB0aGlzIHJlcXVlc3QKK2NveW90ZVJlcXVlc3QuZ2V0UmVhZGVyLmlzZT1nZXRJbnB1dFN0cmVhbSgpIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkIGZvciB0aGlzIHJlcXVlc3QKK2NveW90ZVJlcXVlc3Quc2Vzc2lvbkNyZWF0ZUNvbW1pdHRlZD1DYW5ub3QgY3JlYXRlIGEgc2Vzc2lvbiBhZnRlciB0aGUgcmVzcG9uc2UgaGFzIGJlZW4gY29tbWl0dGVkCitjb3lvdGVSZXF1ZXN0LnNldEF0dHJpYnV0ZS5uYW1lbnVsbD1DYW5ub3QgY2FsbCBzZXRBdHRyaWJ1dGUgd2l0aCBhIG51bGwgbmFtZQorY295b3RlUmVxdWVzdC5saXN0ZW5lclN0YXJ0PUV4Y2VwdGlvbiBzZW5kaW5nIGNvbnRleHQgaW5pdGlhbGl6ZWQgZXZlbnQgdG8gbGlzdGVuZXIgaW5zdGFuY2Ugb2YgY2xhc3MgezB9Citjb3lvdGVSZXF1ZXN0Lmxpc3RlbmVyU3RvcD1FeGNlcHRpb24gc2VuZGluZyBjb250ZXh0IGRlc3Ryb3llZCBldmVudCB0byBsaXN0ZW5lciBpbnN0YW5jZSBvZiBjbGFzcyB7MH0KK2NveW90ZVJlcXVlc3QuYXR0cmlidXRlRXZlbnQ9RXhjZXB0aW9uIHRocm93biBieSBhdHRyaWJ1dGVzIGV2ZW50IGxpc3RlbmVyCitjb3lvdGVSZXF1ZXN0LnBvc3RUb29MYXJnZT1QYXJhbWV0ZXJzIHdlcmUgbm90IHBhcnNlZCBiZWNhdXNlIHRoZSBzaXplIG9mIHRoZSBwb3N0ZWQgZGF0YSB3YXMgdG9vIGJpZy4gVXNlIHRoZSBtYXhQb3N0U2l6ZSBhdHRyaWJ1dGUgb2YgdGhlIGNvbm5lY3RvciB0byByZXNvbHZlIHRoaXMgaWYgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBhY2NlcHQgbGFyZ2UgUE9TVHMuCisKKworIworIyBNYXBwZXJMaXN0ZW5lcgorIworCittYXBwZXJMaXN0ZW5lci5yZWdpc3RlckNvbnRleHQ9UmVnaXN0ZXIgQ29udGV4dCB7MH0KK21hcHBlckxpc3RlbmVyLnVucmVnaXN0ZXJDb250ZXh0PVVucmVnaXN0ZXIgQ29udGV4dCB7MH0KK21hcHBlckxpc3RlbmVyLnJlZ2lzdGVyV3JhcHBlcj1SZWdpc3RlciBXcmFwcGVyIHswfSBpbiBDb250ZXh0IHsxfQorCisKKwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2Nvbm5lY3Rvci9Mb2NhbFN0cmluZ3NfZXMucHJvcGVydGllcyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb25uZWN0b3IvTG9jYWxTdHJpbmdzX2VzLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJjYTRiZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb25uZWN0b3IvTG9jYWxTdHJpbmdzX2VzLnByb3BlcnRpZXMKQEAgLTAsMCArMSw1NiBAQAorCisjCisjIENveW90ZUNvbm5lY3RvcgorIworCitjb3lvdGVDb25uZWN0b3IuYWxyZWFkeUluaXRpYWxpemVkPVlhIGhhIHNpZG8gaW5pY2lhbGl6YWRvIGVsIGNvbmVjdG9yCitjb3lvdGVDb25uZWN0b3IuYWxyZWFkeVN0YXJ0ZWQ9WWEgaGEgc2lkbyBhcnJhbmNhZG8gZWwgY29uZWN0b3IKK2NveW90ZUNvbm5lY3Rvci5jYW5ub3RSZWdpc3RlclByb3RvY29sPU5vIHB1ZWRvIHJlZ2lzdHJhciBNQmVhbiBwYXJhIGVsIFByb3RvY29sbworY295b3RlQ29ubmVjdG9yLm5vdFN0YXJ0ZWQ9RWwgY29uZWN0b3IgQ295b3RlIG5vIGhhIHNpZG8gYXJyYW5jYWRvCitjb3lvdGVDb25uZWN0b3IucHJvdG9jb2xIYW5kbGVyRGVzdHJveUZhaWxlZD1GYWxs8yBsYSBkZXN0cnVjY2nzbiBkZWwgbWFuZWphZG9yIGRlIHByb3RvY29sbzogezB9Citjb3lvdGVDb25uZWN0b3IucHJvdG9jb2xIYW5kbGVySW5pdGlhbGl6YXRpb25GYWlsZWQ9RmFsbPMgbGEgaW5pY2lhbGl6YWNp824gZGVsIG1hbmVqYWRvciBkZSBwcm90b2NvbG86IHswfQorY295b3RlQ29ubmVjdG9yLnByb3RvY29sSGFuZGxlckluc3RhbnRpYXRpb25GYWlsZWQ9RmFsbPMgbGEgaW5zdGFuY2lhY2nzbiBkZWwgbWFuZWphZG9yIGRlIHByb3RvY29sbzogezB9Citjb3lvdGVDb25uZWN0b3IucHJvdG9jb2xIYW5kbGVyU3RhcnRGYWlsZWQ9RmFsbPMgZWwgYXJyYW5xdWUgZGVsIG1hbmVqYWRvciBkZSBwcm90b2NvbG86IHswfQorY295b3RlQ29ubmVjdG9yLnByb3RvY29sUmVnaXN0cmF0aW9uRmFpbGVkPUZhbGzzIGVsIHJlZ2lzdHJvIGRlIEpNWAorCisjCisjIENveW90ZUFkYXB0ZXIKKyMKKworY295b3RlQWRhcHRlci5zZXJ2aWNlPUhhIHRlbmlkbyBsdWdhciB1bmEgZXhjZXBjafNuIG8gZXJyb3IgZW4gZWwgY29udGVuZWRvciBkdXJhbnRlIGVsIHByb2Nlc2FtaWVudG8gZGVsIHJlcXVlcmltaWVudG8KKworIworIyBDb3lvdGVSZXNwb25zZQorIworCitjb3lvdGVSZXNwb25zZS5nZXRPdXRwdXRTdHJlYW0uaXNlPWdldFdyaXRlcigpIHlhIGhhIHNpZG8gbGxhbWFkbyBwYXJhIGVzdGEgcmVzcHVlc3RhCitjb3lvdGVSZXNwb25zZS5nZXRXcml0ZXIuaXNlPWdldE91dHB1dFN0cmVhbSgpIHlhIGhhIHNpZG8gbGxhbWFkbyBwYXJhIGVzdGEgcmVzcHVlc3RhCitjb3lvdGVSZXNwb25zZS5yZXNldEJ1ZmZlci5pc2U9Tm8gcHVlZG8gbGltcGlhciBlbCBi+mZlciBkZXNwdelzIGRlIHF1ZSBsYSByZXB1ZXN0YSBoYSBzaWRvIGxsZXZhZGEgYSBjYWJvCitjb3lvdGVSZXNwb25zZS5zZW5kRXJyb3IuaXNlPU5vIHB1ZWRvIGxsYW1hciBhIHNlbmRFcnJvcigpIHRyYXMgbGxldmFyIGEgY2FibyBsYSByZXNwdWVzdGEKK2NveW90ZVJlc3BvbnNlLnNlbmRSZWRpcmVjdC5pc2U9Tm8gcHVlZG8gbGxhbWFyIGEgc2VuZFJlZGlyZWN0KCkgdHJhcyBsbGV2YXIgYSBjYWJvIGxhIHJlc3B1ZXN0YQorY295b3RlUmVzcG9uc2Uuc2V0QnVmZmVyU2l6ZS5pc2U9Tm8gcHVlZG8gY2FtYmlhciBsYSBtZWRpZGEgZGVsIGL6ZmVyIHRyYXMgZXNjcmliaXIgbG9zIGRhdG9zCisKKyMKKyMgQ295b3RlUmVxdWVzdAorIworCitjb3lvdGVSZXF1ZXN0LmdldElucHV0U3RyZWFtLmlzZT1nZXRSZWFkZXIoKSB5YSBoYSBzaWRvIGxsYW1hZG8gcGFyYSBlc3RlIHJlcXVlcmltaWVudG8KK2NveW90ZVJlcXVlc3QuZ2V0UmVhZGVyLmlzZT1nZXRJbnB1dFN0cmVhbSgpIHlhIGhhIHNpZG8gbGxhbWFkbyBwYXJhIGVzdGUgcmVxdWVyaW1pZW50bworY295b3RlUmVxdWVzdC5zZXNzaW9uQ3JlYXRlQ29tbWl0dGVkPU5vIHB1ZWRvIGNyZWFyIHVuYSBzZXNp824gZGVzcHXpcyBkZSBsbGV2YXIgYSBjYWJvIGxhIHJlc3B1ZXRhCitjb3lvdGVSZXF1ZXN0LnNldEF0dHJpYnV0ZS5uYW1lbnVsbD1ObyBwdWRlbyBsbGFtYXIgYSBzZXRBdHRyaWJ1dGUgY29uIHVuIG5vbWJyZSBudWxvCitjb3lvdGVSZXF1ZXN0Lmxpc3RlbmVyU3RhcnQ9RXhjZXBjafNuIGVudmlhbmRvIGV2ZW50byBpbmljaWFsaXphZG8gZGUgY29udGV4dG8gYSBpbnN0YW5jaWEgZGUgZXNjdWNoYWRvciBkZSBjbGFzZSB7MH0KK2NveW90ZVJlcXVlc3QubGlzdGVuZXJTdG9wPUV4Y2VwY2nzbiBlbnZpYW5kbyBldmVudG8gZGVzdHJ17WRvIGRlIGNvbnRleHRvIGEgaW5zdGFuY2lhIGRlIGVzY3VjaGFkb3IgZGUgY2xhc2UgezB9Citjb3lvdGVSZXF1ZXN0LmF0dHJpYnV0ZUV2ZW50PUV4Y2VwY2nzbiBsYW56YWRhIG1lZGlhbnRlIGVsIGVzY3VjaGFkb3IgZGUgZXZlbnRvcyBkZSBhdHJpYnV0b3MKK2NveW90ZVJlcXVlc3QucG9zdFRvb0xhcmdlPU5vIHNlIGFuYWxpemFyb24gbG9zIHBhcuFtZXRyb3MgcG9ycXVlIGxhIG1lZGlkYSBkZSBsb3MgZGF0b3MgZW52aWFkb3MgZXJhIGRlbWFzaWFkbyBncmFuZGUuIFVzYSBlbCBhdHJpYnV0byBtYXhQb3N0U2l6ZSBkZWwgY29uZWN0b3IgcGFyYSByZXNvbHZlciBlc3RvIGVuIGNhc28gZGUgcXVlIGxhIGFwbGljYWNp824gZGViaWVyYSBkZSBhY2VwdGFyIFBPU1RzIG3hcyBncmFuZGVzLgorCisKKyMKKyMgTWFwcGVyTGlzdGVuZXIKKyMKKworbWFwcGVyTGlzdGVuZXIucmVnaXN0ZXJDb250ZXh0PVJlZ2lzdHJhciBDb250ZXh0byB7MH0KK21hcHBlckxpc3RlbmVyLnVucmVnaXN0ZXJDb250ZXh0PURlc3JlZ2lzdHJhciBDb250ZXh0byB7MH0KK21hcHBlckxpc3RlbmVyLnJlZ2lzdGVyV3JhcHBlcj1SZWdpc3RyYXIgQXJyb3BhZG9yIChXcmFwcGVyKSB7MH0gZW4gQ29udGV4dG8gezF9CisKKworCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29ubmVjdG9yL0xvY2FsU3RyaW5nc19mci5wcm9wZXJ0aWVzIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2Nvbm5lY3Rvci9Mb2NhbFN0cmluZ3NfZnIucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzc4NWRiCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2Nvbm5lY3Rvci9Mb2NhbFN0cmluZ3NfZnIucHJvcGVydGllcwpAQCAtMCwwICsxLDU4IEBACisKKyMKKyMgQ295b3RlQ29ubmVjdG9yCisjCisKK2NveW90ZUNvbm5lY3Rvci5hbHJlYWR5SW5pdGlhbGl6ZWQ9TGUgY29ubmVjdGV1ciBhIGTpauAg6XTpIGluaXRpYWxpc+kKK2NveW90ZUNvbm5lY3Rvci5hbHJlYWR5U3RhcnRlZD1MZSBjb25uZWN0ZXVyIGEgZOlq4CDpdOkgZOltYXJy6QorY295b3RlQ29ubmVjdG9yLmNhbm5vdFJlZ2lzdGVyUHJvdG9jb2w9SW1wb3NzaWJsZSBkJ2VucmVnaXN0cmVyIGxlIE1CZWFuIHBvdXIgbGUgUHJvdG9jb2wKK2NveW90ZUNvbm5lY3Rvci5ub3RTdGFydGVkPUxlIGNvbm5lY3RldXIgQ295b3RlIG4nJ2EgcGFzIOl06SBk6W1hcnLpCitjb3lvdGVDb25uZWN0b3IucHJvdG9jb2xIYW5kbGVyRGVzdHJveUZhaWxlZD1MYSBkZXN0cnVjdGlvbiBkdSBnZXN0aW9ubmFpcmUgZGUgcHJvdG9jb2xlIGEg6WNob3XpZTogezB9Citjb3lvdGVDb25uZWN0b3IucHJvdG9jb2xIYW5kbGVySW5pdGlhbGl6YXRpb25GYWlsZWQ9TCcnaW5pdGlhbGlzYXRpb24gZHUgZ2VzdGlvbm5haXJlIGRlIHByb3RvY29sZSBhIOljaG916TogezB9Citjb3lvdGVDb25uZWN0b3IucHJvdG9jb2xIYW5kbGVySW5zdGFudGlhdGlvbkZhaWxlZD1MJydpbnN0YW50aWF0aW9uIGR1IGdlc3Rpb25uYWlyZSBkZSBwcm90b2NvbGUgYSDpY2hvdek6IHswfQorY295b3RlQ29ubmVjdG9yLnByb3RvY29sSGFuZGxlclN0YXJ0RmFpbGVkPUxlIGTpbWFycmFnZSBkdSBnZXN0aW9ubmFpcmUgZGUgcHJvdG9jb2xlIGEg6WNob3XpOiB7MH0KK2NveW90ZUNvbm5lY3Rvci5wcm90b2NvbFJlZ2lzdHJhdGlvbkZhaWxlZD1MJ2VucmVnaXN0cmVtZW50IGR1IHByb3RvY29sIEpNWCBhIOljaG916QorY295b3RlQ29ubmVjdG9yLnByb3RvY29sSGFuZGxlclBhdXNlRmFpbGVkPUxhIHN1c3BlbnNpb24gZHUgZ2VzdGlvbm5haXJlIGRlIHByb3RvY29sZSBhIOljaG916WUKK2NveW90ZUNvbm5lY3Rvci5wcm90b2NvbEhhbmRsZXJSZXN1bWVGYWlsZWQ9TGUgcmVk6W1hcnJhZ2UgZHUgZ2VzdGlvbm5haXJlIGRlIHByb3RvY29sZSBhIOljaG916QorCisjCisjIENveW90ZUFkYXB0ZXIKKyMKKworY295b3RlQWRhcHRlci5zZXJ2aWNlPVVuZSBleGNlcHRpb24gb3UgdW5lIGVycmV1ciBzJydlc3QgcHJvZHVpdGUgZGFucyBsZSBjb250ZW5ldXIgZHVyYW50IGxlIHRyYWl0ZW1lbnQgZGUgbGEgcmVxdep0ZQorCisjCisjIENveW90ZVJlc3BvbnNlCisjCisKK2NveW90ZVJlc3BvbnNlLmdldE91dHB1dFN0cmVhbS5pc2U9ImdldFdyaXRlcigpIiBhIGTpauAg6XTpIGFwcGVs6SBwb3VyIGNldHRlIHLpcG9uc2UKK2NveW90ZVJlc3BvbnNlLmdldFdyaXRlci5pc2U9ImdldE91dHB1dFN0cmVhbSgpIiBhIGTpauAg6XTpIGFwcGVs6SBwb3VyIGNldHRlIHLpcG9uc2UKK2NveW90ZVJlc3BvbnNlLnJlc2V0QnVmZmVyLmlzZT1JbXBvc3NpYmxlIGRlIHJlbWV0dHJlIOAgeulybyBsZSB0YW1wb24gYXBy6HMgcXVlIGxhIHLpcG9uc2UgYWl0IOl06SBlbnZveellCitjb3lvdGVSZXNwb25zZS5zZW5kRXJyb3IuaXNlPUltcG9zc2libGUgZCcnYXBwZWxlciAic2VuZEVycm9yKCkiIGFwcuhzIHF1ZSBsYSBy6XBvbnNlIGFpdCDpdOkgZW52b3npZQorY295b3RlUmVzcG9uc2Uuc2VuZFJlZGlyZWN0LmlzZT1JbXBvc3NpYmxlIGQnJ2FwcGVsZXIgInNlbmRSZWRpcmVjdCgpIiBhcHLocyBxdWUgbGEgculwb25zZSBhaXQg6XTpIGVudm956WUKK2NveW90ZVJlc3BvbnNlLnNldEJ1ZmZlclNpemUuaXNlPUltcG9zc2libGUgZGUgY2hhbmdlciBsYSB0YWlsbGUgZHUgdGFtcG9uIGFwcuhzIHF1ZSBsZXMgZG9ubullcyBhaWVudCDpdOkg6WNyaXRlcworCisjCisjIENveW90ZVJlcXVlc3QKKyMKKworY295b3RlUmVxdWVzdC5nZXRJbnB1dFN0cmVhbS5pc2U9ImdldFJlYWRlcigpIiBhIGTpauAg6XTpIGFwcGVs6SBwb3VyIGNldHRlIHJlcXXqdGUKK2NveW90ZVJlcXVlc3QuZ2V0UmVhZGVyLmlzZT0iZ2V0SW5wdXRTdHJlYW0oKSIgYSBk6WrgIOl06SBhcHBlbOkgcG91ciBjZXR0ZSByZXF16nRlCitjb3lvdGVSZXF1ZXN0LnNlc3Npb25DcmVhdGVDb21taXR0ZWQ9SW1wb3NzaWJsZSBkZSBjcullciB1bmUgc2Vzc2lvbmFwcuhzIHF1ZSBsYSBy6XBvbnNlIGFpdCDpdOkgZW52b3npZQorY295b3RlUmVxdWVzdC5zZXRBdHRyaWJ1dGUubmFtZW51bGw9SW1wb3NzaWJsZSBkJydhcHBlbGVyICJzZXRBdHRyaWJ1dGUiIGF2ZWMgdW4gbm9tIG51bAorY295b3RlUmVxdWVzdC5saXN0ZW5lclN0YXJ0PVVuZSBleGNlcHRpb24gcycnZXN0IHByb2R1aXRlIGxvcnMgZGUgbCcnZW52b2kgZGUgbCcn6XbobmVtZW50IGNvbnRleHRlIGluaXRpYWxpc+kg4CBsJydpbnN0YW5jZSBkZSBjbGFzc2UgZCcn6WNvdXRlIHswfQorY295b3RlUmVxdWVzdC5saXN0ZW5lclN0b3A9VW5lIGV4Y2VwdGlvbiBzJydlc3QgcHJvZHVpdGUgbG9ycyBkZSBsJydlbnZvaSBkZSBsJyfpduhuZW1lbnQgY29udGV4dGUgZOl0cnVpdCDgIGwnJ2luc3RhbmNlIGRlIGNsYXNzZSBkJyfpY291dGUgezB9Citjb3lvdGVSZXF1ZXN0LmF0dHJpYnV0ZUV2ZW50PVVuZSBleGNlcHRpb24gYSDpdOkgbGFuY+llIHBhciBsJydpbnN0YW5jZSBkJyfpY291dGUgcG91ciBsJyfpduhuZW1lbnQgYXR0cmlidXRzIChhdHRyaWJ1dGVzKQorY295b3RlUmVxdWVzdC5wb3N0VG9vTGFyZ2U9TGVzIHBhcmFt6HRyZXMgbidvbnQgcGFzIOl06SDpdmFsdekgY2FyIGxhIHRhaWxsZSBkZXMgZG9ubullcyBwb3N06WVzIGVzdCB0cm9wIGltcG9ydGFudC4gVXRpbGlzZXogbCdhdHRyaWJ1dCBtYXhQb3N0U2l6ZSBkdSBjb25uZWN0ZXVyIHBvdXIgY29ycmlnZXIgY2UgcHJvYmzobWUgc2kgdm90cmUgYXBwbGljYXRpb24gZG9pdCBhY2NlcHRlciBkZXMgUE9TVHMgaW1wb3J0YW50cy4KKworCisjCisjIE1hcHBlckxpc3RlbmVyCisjCisKK21hcHBlckxpc3RlbmVyLnJlZ2lzdGVyQ29udGV4dD1FbnJlZ2lzdHJlbWVudCBkdSBjb250ZXh0ZSB7MH0KK21hcHBlckxpc3RlbmVyLnVucmVnaXN0ZXJDb250ZXh0PUTpc2VucmVnaXN0cmVtZW50IGR1IGNvbnRleHRlIHswfQorbWFwcGVyTGlzdGVuZXIucmVnaXN0ZXJXcmFwcGVyPUVucmVnaXN0cmVtZW50IGRlIGwnZW5yb2JldXIgKHdyYXBwZXIpIHswfSBkYW5zIGxlIGNvbnRleHRlIHsxfQorCisKKwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2Nvbm5lY3Rvci9Mb2NhbFN0cmluZ3NfamEucHJvcGVydGllcyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb25uZWN0b3IvTG9jYWxTdHJpbmdzX2phLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWIzYmQ4MQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb25uZWN0b3IvTG9jYWxTdHJpbmdzX2phLnByb3BlcnRpZXMKQEAgLTAsMCArMSw1OCBAQAorCisjCisjIENveW90ZUNvbm5lY3RvcgorIworCitjb3lvdGVDb25uZWN0b3IuYWxyZWFkeUluaXRpYWxpemVkPVx1MzBiM1x1MzBjZFx1MzBhZlx1MzBiZlx1MzA2Zlx1NjVlMlx1MzA2Ylx1NTIxZFx1NjcxZlx1NTMxNlx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OQorY295b3RlQ29ubmVjdG9yLmFscmVhZHlTdGFydGVkPVx1MzBiM1x1MzBjZFx1MzBhZlx1MzBiZlx1MzA2Zlx1NjVlMlx1MzA2Ylx1OGQ3N1x1NTJkNVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OQorY295b3RlQ29ubmVjdG9yLmNhbm5vdFJlZ2lzdGVyUHJvdG9jb2w9XHUzMDVkXHUzMDZlXHUzMGQ3XHUzMGVkXHUzMGM4XHUzMGIzXHUzMGViXHUzMDZiTUJlYW5cdTMwOTJcdTc2N2JcdTkzMzJcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMKK2NveW90ZUNvbm5lY3Rvci5ub3RTdGFydGVkPUNveW90ZVx1MzBiM1x1MzBjZFx1MzBhZlx1MzBiZlx1MzA2Zlx1OGQ3N1x1NTJkNVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5MworY295b3RlQ29ubmVjdG9yLnByb3RvY29sSGFuZGxlckRlc3Ryb3lGYWlsZWQ9XHUzMGQ3XHUzMGVkXHUzMGM4XHUzMGIzXHUzMGViXHUzMGNmXHUzMGYzXHUzMGM5XHUzMGU5XHUzMDZlXHU1ZWMzXHU2OGM0XHUzMDZiXHU1OTMxXHU2NTU3XHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmOiB7MH0KK2NveW90ZUNvbm5lY3Rvci5wcm90b2NvbEhhbmRsZXJJbml0aWFsaXphdGlvbkZhaWxlZD1cdTMwZDdcdTMwZWRcdTMwYzhcdTMwYjNcdTMwZWJcdTMwY2ZcdTMwZjNcdTMwYzlcdTMwZTlcdTMwNmVcdTUyMWRcdTY3MWZcdTUzMTZcdTMwNmJcdTU5MzFcdTY1NTdcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWY6IHswfQorY295b3RlQ29ubmVjdG9yLnByb3RvY29sSGFuZGxlckluc3RhbnRpYXRpb25GYWlsZWQ9XHUzMGQ3XHUzMGVkXHUzMGM4XHUzMGIzXHUzMGViXHUzMGNmXHUzMGYzXHUzMGM5XHUzMGU5XHUzMDZlXHUzMGE0XHUzMGYzXHUzMGI5XHUzMGJmXHUzMGYzXHUzMGI5XHU1MzE2XHUzMDZiXHU1OTMxXHU2NTU3XHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmOiB7MH0KK2NveW90ZUNvbm5lY3Rvci5wcm90b2NvbEhhbmRsZXJTdGFydEZhaWxlZD1cdTMwZDdcdTMwZWRcdTMwYzhcdTMwYjNcdTMwZWJcdTMwY2ZcdTMwZjNcdTMwYzlcdTMwZTlcdTMwNmVcdThkNzdcdTUyZDVcdTMwNmJcdTU5MzFcdTY1NTdcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWY6IHswfQorY295b3RlQ29ubmVjdG9yLnByb3RvY29sUmVnaXN0cmF0aW9uRmFpbGVkPVx1MzBkN1x1MzBlZFx1MzBjOFx1MzBiM1x1MzBlYkpNWFx1MzA2ZVx1NzY3Ylx1OTMzMlx1MzA2Ylx1NTkzMVx1NjU1N1x1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1ZgorY295b3RlQ29ubmVjdG9yLnByb3RvY29sSGFuZGxlclBhdXNlRmFpbGVkPVx1MzBkN1x1MzBlZFx1MzBjOFx1MzBiM1x1MzBlYlx1MzBjZlx1MzBmM1x1MzBjOVx1MzBlOVx1MzA2ZVx1NGUwMFx1NjY0Mlx1NTA1Y1x1NmI2Mlx1MzA2Ylx1NTkzMVx1NjU1N1x1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1ZgorY295b3RlQ29ubmVjdG9yLnByb3RvY29sSGFuZGxlclJlc3VtZUZhaWxlZD1cdTMwZDdcdTMwZWRcdTMwYzhcdTMwYjNcdTMwZWJcdTMwY2ZcdTMwZjNcdTMwYzlcdTMwZTlcdTMwNmVcdTUxOGRcdTk1OGJcdTMwNmJcdTU5MzFcdTY1NTdcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWYKKworIworIyBDb3lvdGVBZGFwdGVyCisjCisKK2NveW90ZUFkYXB0ZXIuc2VydmljZT1cdTMwZWFcdTMwYWZcdTMwYThcdTMwYjlcdTMwYzhcdTMwNmVcdTUxZTZcdTc0MDZcdTRlMmRcdTMwNmJcdTMwYjNcdTMwY2RcdTMwYWZcdTMwYmZcdTMwNjdcdTRmOGJcdTU5MTZcdTMwN2VcdTMwNWZcdTMwNmZcdTMwYThcdTMwZTlcdTMwZmNcdTMwNGNcdTc2N2FcdTc1MWZcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWYKKworIworIyBDb3lvdGVSZXNwb25zZQorIworCitjb3lvdGVSZXNwb25zZS5nZXRPdXRwdXRTdHJlYW0uaXNlPWdldFdyaXRlcigpXHUzMDZmXHUzMDUzXHUzMDZlXHUzMGVjXHUzMGI5XHUzMGRkXHUzMGYzXHUzMGI5XHUzMDZiXHU1YmZlXHUzMDU3XHUzMDY2XHU2NWUyXHUzMDZiXHU1NDdjXHUzMDczXHU1MWZhXHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5Citjb3lvdGVSZXNwb25zZS5nZXRXcml0ZXIuaXNlPWdldE91dHB1dFN0cmVhbSgpXHUzMDZmXHUzMDUzXHUzMDZlXHUzMGVjXHUzMGI5XHUzMGRkXHUzMGYzXHUzMGI5XHUzMDZiXHU1YmZlXHUzMDU3XHUzMDY2XHU2NWUyXHUzMDZiXHU1NDdjXHUzMDczXHU1MWZhXHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5Citjb3lvdGVSZXNwb25zZS5yZXNldEJ1ZmZlci5pc2U9XHUzMGVjXHUzMGI5XHUzMGRkXHUzMGYzXHUzMGI5XHUzMDRjXHUzMGIzXHUzMGRmXHUzMGMzXHUzMGM4XHUzMDU1XHUzMDhjXHUzMDVmXHU1ZjhjXHUzMDY3XHUzMGQwXHUzMGMzXHUzMGQ1XHUzMGExXHUzMDkyXHUzMGVhXHUzMGJiXHUzMGMzXHUzMGM4XHUzMDU5XHUzMDhiXHUzMDUzXHUzMDY4XHUzMDZmXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzCitjb3lvdGVSZXNwb25zZS5zZW5kRXJyb3IuaXNlPVx1MzBlY1x1MzBiOVx1MzBkZFx1MzBmM1x1MzBiOVx1MzA0Y1x1MzBiM1x1MzBkZlx1MzBjM1x1MzBjOFx1MzA1NVx1MzA4Y1x1MzA1Zlx1NWY4Y1x1MzA2N3NlbmRFcnJvcigpXHUzMDkyXHU1NDdjXHUzMDczXHU1MWZhXHUzMDU5XHUzMDUzXHUzMDY4XHUzMDZmXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzCitjb3lvdGVSZXNwb25zZS5zZW5kUmVkaXJlY3QuaXNlPVx1MzBlY1x1MzBiOVx1MzBkZFx1MzBmM1x1MzBiOVx1MzA0Y1x1MzBiM1x1MzBkZlx1MzBjM1x1MzBjOFx1MzA1NVx1MzA4Y1x1MzA1Zlx1NWY4Y1x1MzA2N3NlbmRSZWRpcmVjdCgpXHUzMDkyXHU1NDdjXHUzMDczXHU1MWZhXHUzMDU5XHUzMDUzXHUzMDY4XHUzMDZmXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzCitjb3lvdGVSZXNwb25zZS5zZXRCdWZmZXJTaXplLmlzZT1cdTMwYzdcdTMwZmNcdTMwYmZcdTMwNGNcdTY1ZTJcdTMwNmJcdTY2ZjhcdTMwNGRcdThmYmNcdTMwN2VcdTMwOGNcdTMwNWZcdTVmOGNcdTMwNjdcdTMwZDBcdTMwYzNcdTMwZDVcdTMwYTFcdTMwYjVcdTMwYTRcdTMwYmFcdTMwOTJcdTU5MDlcdTY2ZjRcdTMwNTlcdTMwOGJcdTMwNTNcdTMwNjhcdTMwNmZcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMKKworIworIyBDb3lvdGVSZXF1ZXN0CisjCisKK2NveW90ZVJlcXVlc3QuZ2V0SW5wdXRTdHJlYW0uaXNlPWdldFJlYWRlcigpXHUzMDZmXHUzMDUzXHUzMDZlXHUzMGVhXHUzMGFmXHUzMGE4XHUzMGI5XHUzMGM4XHUzMDZiXHU1YmZlXHUzMDU3XHUzMDY2XHU2NWUyXHUzMDZiXHU1NDdjXHUzMDczXHU1MWZhXHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5Citjb3lvdGVSZXF1ZXN0LmdldFJlYWRlci5pc2U9Z2V0SW5wdXRTdHJlYW0oKVx1MzA2Zlx1MzA1M1x1MzA2ZVx1MzBlYVx1MzBhZlx1MzBhOFx1MzBiOVx1MzBjOFx1MzA2Ylx1NWJmZVx1MzA1N1x1MzA2Nlx1NjVlMlx1MzA2Ylx1NTQ3Y1x1MzA3M1x1NTFmYVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OQorY295b3RlUmVxdWVzdC5zZXNzaW9uQ3JlYXRlQ29tbWl0dGVkPVx1MzBlY1x1MzBiOVx1MzBkZFx1MzBmM1x1MzBiOVx1MzA5Mlx1MzBiM1x1MzBkZlx1MzBjM1x1MzBjOFx1MzA1N1x1MzA1Zlx1NWY4Y1x1MzA2N1x1MzBiYlx1MzBjM1x1MzBiN1x1MzBlN1x1MzBmM1x1MzA5Mlx1NGY1Y1x1NjIxMFx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5MworY295b3RlUmVxdWVzdC5zZXRBdHRyaWJ1dGUubmFtZW51bGw9c2V0QXR0cmlidXRlXHUzMDkyXHU1NDBkXHU1MjRkXHUzMDkyXHU2MzA3XHU1YjlhXHUzMDViXHUzMDVhXHUzMDZiXHU1NDdjXHUzMDczXHU1MWZhXHUzMDU5XHUzMDUzXHUzMDY4XHUzMDZmXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzCitjb3lvdGVSZXF1ZXN0Lmxpc3RlbmVyU3RhcnQ9XHUzMGFmXHUzMGU5XHUzMGI5IHswfSBcdTMwNmVcdTMwZWFcdTMwYjlcdTMwY2FcdTMwYTRcdTMwZjNcdTMwYjlcdTMwYmZcdTMwZjNcdTMwYjlcdTMwNmJcdTUyMWRcdTY3MWZcdTUzMTZcdTMwYTRcdTMwZDlcdTMwZjNcdTMwYzhcdTMwOTJcdTkwMDFcdTRmZTFcdTRlMmRcdTMwNmJcdTRmOGJcdTU5MTZcdTMwNGNcdTYyOTVcdTMwNTJcdTMwODlcdTMwOGNcdTMwN2VcdTMwNTdcdTMwNWYKK2NveW90ZVJlcXVlc3QubGlzdGVuZXJTdG9wPVx1MzBhZlx1MzBlOVx1MzBiOSB7MH0gXHUzMDZlXHUzMGVhXHUzMGI5XHUzMGNhXHUzMGE0XHUzMGYzXHUzMGI5XHUzMGJmXHUzMGYzXHUzMGI5XHUzMDZiXHU1ZWMzXHU2OGM0XHUzMGE0XHUzMGQ5XHUzMGYzXHUzMGM4XHUzMDkyXHU5MDAxXHU0ZmUxXHU0ZTJkXHUzMDZiXHU0ZjhiXHU1OTE2XHUzMDRjXHU2Mjk1XHUzMDUyXHUzMDg5XHUzMDhjXHUzMDdlXHUzMDU3XHUzMDVmCitjb3lvdGVSZXF1ZXN0LmF0dHJpYnV0ZUV2ZW50PVx1NWM1ZVx1NjAyN1x1MzBhNFx1MzBkOVx1MzBmM1x1MzBjOFx1MzBlYVx1MzBiOVx1MzBjYVx1MzA2Ylx1MzA4OFx1MzA2M1x1MzA2Nlx1NGY4Ylx1NTkxNlx1MzA0Y1x1NjI5NVx1MzA1Mlx1MzA4OVx1MzA4Y1x1MzA3ZVx1MzA1N1x1MzA1ZgorY295b3RlUmVxdWVzdC5wb3N0VG9vTGFyZ2U9UE9TVFx1MzA1NVx1MzA4Y1x1MzA1Zlx1MzBjN1x1MzBmY1x1MzBiZlx1MzA0Y1x1NTkyN1x1MzA0ZFx1MzA1OVx1MzA0ZVx1MzA1Zlx1MzA2ZVx1MzA2N1x1MzAwMVx1MzBkMVx1MzBlOVx1MzBlMVx1MzBmY1x1MzBiZlx1MzA0Y1x1NjljYlx1NjU4N1x1ODllM1x1Njc5MFx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzA2N1x1MzA1N1x1MzA1Zlx1MzAwMlx1MzA1ZFx1MzA2ZVx1MzBhMlx1MzBkN1x1MzBlYVx1MzBiMVx1MzBmY1x1MzBiN1x1MzBlN1x1MzBmM1x1MzA0Y1x1NWRlOFx1NTkyN1x1MzA2YVBPU1RcdTMwOTJcdTUzZDdcdTMwNTFcdTRlZDhcdTMwNTFcdTMwNmRcdTMwNzBcdTMwNmFcdTMwODlcdTMwNmFcdTMwNDRcdTU4MzRcdTU0MDhcdTMwNmJcdTMwNmZcdTMwMDFcdTMwNTNcdTMwOGNcdTMwOTJcdTg5ZTNcdTZjN2FcdTMwNTlcdTMwOGJcdTMwNWZcdTMwODFcdTMwNmJcdTMwYjNcdTMwY2RcdTMwYWZcdTMwYmZcdTMwNmVtYXhQb3N0U2l6ZVx1NWM1ZVx1NjAyN1x1MzA5Mlx1NGY3Zlx1NzUyOFx1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMgorCisKKyMKKyMgTWFwcGVyTGlzdGVuZXIKKyMKKworbWFwcGVyTGlzdGVuZXIucmVnaXN0ZXJDb250ZXh0PVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBhZFx1MzBiOVx1MzBjOCB7MH1cdTMwMDBcdTMwOTJcdTc2N2JcdTkzMzJcdTMwNTdcdTMwN2VcdTMwNTkKK21hcHBlckxpc3RlbmVyLnVucmVnaXN0ZXJDb250ZXh0PVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBhZFx1MzBiOVx1MzBjOCB7MH0gXHUzMDZlXHU3NjdiXHU5MzMyXHUzMDkyXHU2MmI5XHU2ZDg4XHUzMDU3XHUzMDdlXHUzMDU5CittYXBwZXJMaXN0ZW5lci5yZWdpc3RlcldyYXBwZXI9XHUzMGIzXHUzMGYzXHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4IHsxfSBcdTMwNmJcdTMwZTlcdTMwYzNcdTMwZDEgezB9IFx1MzA5Mlx1NzY3Ylx1OTMzMlx1MzA1N1x1MzA3ZVx1MzA1OQorCisKKwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2Nvbm5lY3Rvci9NYXBwZXJMaXN0ZW5lci5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2Nvbm5lY3Rvci9NYXBwZXJMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2MDZhYWEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29ubmVjdG9yL01hcHBlckxpc3RlbmVyLmphdmEKQEAgLTAsMCArMSw0ODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8gCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXJOb3RpZmljYXRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5Ob3RpZmljYXRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5Ob3RpZmljYXRpb25MaXN0ZW5lcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdEluc3RhbmNlOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLm1vZGVsZXIuUmVnaXN0cnk7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvbWNhdC51dGlsLmh0dHAubWFwcGVyLk1hcHBlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwucmVzLlN0cmluZ01hbmFnZXI7CisKKworLyoqCisgKiBNYXBwZXIgbGlzdGVuZXIuCisgKgorICogQGF1dGhvciBSZW15IE1hdWNoZXJhdAorICogQGF1dGhvciBDb3N0aW4gTWFub2xhY2hlCisgKi8KK3B1YmxpYyBjbGFzcyBNYXBwZXJMaXN0ZW5lcgorICAgIGltcGxlbWVudHMgTm90aWZpY2F0aW9uTGlzdGVuZXIgCisgeworICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhNYXBwZXJMaXN0ZW5lci5jbGFzcyk7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworICAgIC8qKgorICAgICAqIEFzc29jaWF0ZWQgbWFwcGVyLgorICAgICAqLworICAgIHByb3RlY3RlZCBNYXBwZXIgbWFwcGVyID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIE1CZWFuIHNlcnZlci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTUJlYW5TZXJ2ZXIgbUJlYW5TZXJ2ZXIgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc3RyaW5nIG1hbmFnZXIgZm9yIHRoaXMgcGFja2FnZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZ01hbmFnZXIgc20gPQorICAgICAgICBTdHJpbmdNYW5hZ2VyLmdldE1hbmFnZXIoQ29uc3RhbnRzLlBhY2thZ2UpOworCisgICAgLy8gSXQgc2hvdWxkIGJlIG51bGwgLSBhbmQgZmFpbCBpZiBub3Qgc2V0CisgICAgcHJpdmF0ZSBTdHJpbmcgZG9tYWluPSIqIjsKKyAgICBwcml2YXRlIFN0cmluZyBlbmdpbmU9IioiOworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBtYXBwZXIgbGlzdGVuZXIuCisgICAgICovCisgICAgcHVibGljIE1hcHBlckxpc3RlbmVyKE1hcHBlciBtYXBwZXIpIHsKKyAgICAgICAgdGhpcy5tYXBwZXIgPSBtYXBwZXI7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RG9tYWluKCkgeworICAgICAgICByZXR1cm4gZG9tYWluOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERvbWFpbihTdHJpbmcgZG9tYWluKSB7CisgICAgICAgIHRoaXMuZG9tYWluID0gZG9tYWluOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW5naW5lKCkgeworICAgICAgICByZXR1cm4gZW5naW5lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEVuZ2luZShTdHJpbmcgZW5naW5lKSB7CisgICAgICAgIHRoaXMuZW5naW5lID0gZW5naW5lOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemUgYXNzb2NpYXRlZCBtYXBwZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgaW5pdCgpIHsKKworICAgICAgICB0cnkgeworCisgICAgICAgICAgICBtQmVhblNlcnZlciA9IFJlZ2lzdHJ5LmdldFJlZ2lzdHJ5KG51bGwsIG51bGwpLmdldE1CZWFuU2VydmVyKCk7CisKKyAgICAgICAgICAgIHJlZ2lzdGVyRW5naW5lKCk7CisKKyAgICAgICAgICAgIC8vIFF1ZXJ5IGhvc3RzCisgICAgICAgICAgICBTdHJpbmcgb25TdHIgPSBkb21haW4gKyAiOnR5cGU9SG9zdCwqIjsKKyAgICAgICAgICAgIE9iamVjdE5hbWUgb2JqZWN0TmFtZSA9IG5ldyBPYmplY3ROYW1lKG9uU3RyKTsKKyAgICAgICAgICAgIFNldCBzZXQgPSBtQmVhblNlcnZlci5xdWVyeU1CZWFucyhvYmplY3ROYW1lLCBudWxsKTsKKyAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gc2V0Lml0ZXJhdG9yKCk7CisgICAgICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgT2JqZWN0SW5zdGFuY2Ugb2kgPSAoT2JqZWN0SW5zdGFuY2UpIGl0ZXJhdG9yLm5leHQoKTsKKyAgICAgICAgICAgICAgICByZWdpc3Rlckhvc3Qob2kuZ2V0T2JqZWN0TmFtZSgpKTsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAvLyBRdWVyeSBjb250ZXh0cworICAgICAgICAgICAgb25TdHIgPSAiKjpqMmVlVHlwZT1XZWJNb2R1bGUsKiI7CisgICAgICAgICAgICBvYmplY3ROYW1lID0gbmV3IE9iamVjdE5hbWUob25TdHIpOworICAgICAgICAgICAgc2V0ID0gbUJlYW5TZXJ2ZXIucXVlcnlNQmVhbnMob2JqZWN0TmFtZSwgbnVsbCk7CisgICAgICAgICAgICBpdGVyYXRvciA9IHNldC5pdGVyYXRvcigpOworICAgICAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIE9iamVjdEluc3RhbmNlIG9pID0gKE9iamVjdEluc3RhbmNlKSBpdGVyYXRvci5uZXh0KCk7CisgICAgICAgICAgICAgICAgcmVnaXN0ZXJDb250ZXh0KG9pLmdldE9iamVjdE5hbWUoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFF1ZXJ5IHdyYXBwZXJzCisgICAgICAgICAgICBvblN0ciA9ICIqOmoyZWVUeXBlPVNlcnZsZXQsKiI7CisgICAgICAgICAgICBvYmplY3ROYW1lID0gbmV3IE9iamVjdE5hbWUob25TdHIpOworICAgICAgICAgICAgc2V0ID0gbUJlYW5TZXJ2ZXIucXVlcnlNQmVhbnMob2JqZWN0TmFtZSwgbnVsbCk7CisgICAgICAgICAgICBpdGVyYXRvciA9IHNldC5pdGVyYXRvcigpOworICAgICAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIE9iamVjdEluc3RhbmNlIG9pID0gKE9iamVjdEluc3RhbmNlKSBpdGVyYXRvci5uZXh0KCk7CisgICAgICAgICAgICAgICAgcmVnaXN0ZXJXcmFwcGVyKG9pLmdldE9iamVjdE5hbWUoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG9uU3RyID0gIkpNSW1wbGVtZW50YXRpb246dHlwZT1NQmVhblNlcnZlckRlbGVnYXRlIjsKKyAgICAgICAgICAgIG9iamVjdE5hbWUgPSBuZXcgT2JqZWN0TmFtZShvblN0cik7CisgICAgICAgICAgICBtQmVhblNlcnZlci5hZGROb3RpZmljYXRpb25MaXN0ZW5lcihvYmplY3ROYW1lLCB0aGlzLCBudWxsLCBudWxsKTsKKworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9nLndhcm4oIkVycm9yIHJlZ2lzdGVyaW5nIGNvbnRleHRzIixlKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE5vdGlmaWNhdGlvbkxpc3RlbmVyIE1ldGhvZHMKKworCisgICAgcHVibGljIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5PYmplY3QgaGFuZGJhY2spIHsKKworICAgICAgICBpZiAobm90aWZpY2F0aW9uIGluc3RhbmNlb2YgTUJlYW5TZXJ2ZXJOb3RpZmljYXRpb24pIHsKKyAgICAgICAgICAgIE9iamVjdE5hbWUgb2JqZWN0TmFtZSA9IAorICAgICAgICAgICAgICAgICgoTUJlYW5TZXJ2ZXJOb3RpZmljYXRpb24pIG5vdGlmaWNhdGlvbikuZ2V0TUJlYW5OYW1lKCk7CisgICAgICAgICAgICBTdHJpbmcgajJlZVR5cGUgPSBvYmplY3ROYW1lLmdldEtleVByb3BlcnR5KCJqMmVlVHlwZSIpOworICAgICAgICAgICAgU3RyaW5nIGVuZ2luZU5hbWUgPSBudWxsOworICAgICAgICAgICAgaWYgKGoyZWVUeXBlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAoKGoyZWVUeXBlLmVxdWFscygiV2ViTW9kdWxlIikpIHx8IAorICAgICAgICAgICAgICAgICAgICAoajJlZVR5cGUuZXF1YWxzKCJTZXJ2bGV0IikpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtQmVhblNlcnZlci5pc1JlZ2lzdGVyZWQob2JqZWN0TmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5naW5lTmFtZSA9IChTdHJpbmcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CZWFuU2VydmVyLmdldEF0dHJpYnV0ZShvYmplY3ROYW1lLCAiZW5naW5lTmFtZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUgIAorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBBdCBkZXBsb3ltZW50IHRpbWUsIGVuZ2luZU5hbWUgaXMgYWx3YXlzID0gbnVsbC4KKyAgICAgICAgICAgIGlmICggKCEiKiIuZXF1YWxzKGRvbWFpbikpICYmCisgICAgICAgICAgICAgICAgICggIWRvbWFpbi5lcXVhbHMob2JqZWN0TmFtZS5nZXREb21haW4oKSkgKSAmJgorICAgICAgICAgICAgICAgICAoICghZG9tYWluLmVxdWFscyhlbmdpbmVOYW1lKSApICYmCisgICAgICAgICAgICAgICAgICAgKGVuZ2luZU5hbWUgIT0gbnVsbCkgKSApICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsb2cuZGVidWcoICJIYW5kbGUgIiArIG9iamVjdE5hbWUgKTsgICAgCisgICAgICAgICAgICBpZiAobm90aWZpY2F0aW9uLmdldFR5cGUoKS5lcXVhbHMKKyAgICAgICAgICAgICAgICAoTUJlYW5TZXJ2ZXJOb3RpZmljYXRpb24uUkVHSVNUUkFUSU9OX05PVElGSUNBVElPTikpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdHlwZT1vYmplY3ROYW1lLmdldEtleVByb3BlcnR5KCJ0eXBlIik7CisgICAgICAgICAgICAgICAgaWYoICJIb3N0Ii5lcXVhbHMoIHR5cGUgKSkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJIb3N0KG9iamVjdE5hbWUpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oIkVycm9yIHJlZ2lzdGVyaW5nIEhvc3QgIiArIG9iamVjdE5hbWUsIGUpOyAgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgCisgICAgICAgICAgICAgICAgaWYgKGoyZWVUeXBlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGoyZWVUeXBlLmVxdWFscygiV2ViTW9kdWxlIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJDb250ZXh0KG9iamVjdE5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cud2FybigiRXJyb3IgcmVnaXN0ZXJpbmcgQ29udGV4dCAiICsgb2JqZWN0TmFtZSx0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChqMmVlVHlwZS5lcXVhbHMoIlNlcnZsZXQiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlcldyYXBwZXIob2JqZWN0TmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKCJFcnJvciByZWdpc3RlcmluZyBXcmFwcGVyICIgKyBvYmplY3ROYW1lLHQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChub3RpZmljYXRpb24uZ2V0VHlwZSgpLmVxdWFscworICAgICAgICAgICAgICAgICAgICAgICAoTUJlYW5TZXJ2ZXJOb3RpZmljYXRpb24uVU5SRUdJU1RSQVRJT05fTk9USUZJQ0FUSU9OKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyB0eXBlPW9iamVjdE5hbWUuZ2V0S2V5UHJvcGVydHkoInR5cGUiKTsKKyAgICAgICAgICAgICAgICBpZiggIkhvc3QiLmVxdWFscyggdHlwZSApKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICB1bnJlZ2lzdGVySG9zdChvYmplY3ROYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKCJFcnJvciB1bnJlZ2lzdGVyaW5nIEhvc3QgIiArIG9iamVjdE5hbWUsZSk7ICAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAKKyAgICAgICAgICAgICAgICBpZiAoajJlZVR5cGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoajJlZVR5cGUuZXF1YWxzKCJXZWJNb2R1bGUiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnJlZ2lzdGVyQ29udGV4dChvYmplY3ROYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oIkVycm9yIHVucmVnaXN0ZXJpbmcgd2ViYXBwICIgKyBvYmplY3ROYW1lLHQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm90ZWN0ZWQgTWV0aG9kcworCisgICAgcHJpdmF0ZSB2b2lkIHJlZ2lzdGVyRW5naW5lKCkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgT2JqZWN0TmFtZSBlbmdpbmVOYW1lID0gbmV3IE9iamVjdE5hbWUKKyAgICAgICAgICAgIChkb21haW4gKyAiOnR5cGU9RW5naW5lIik7CisgICAgICAgIGlmICggISBtQmVhblNlcnZlci5pc1JlZ2lzdGVyZWQoZW5naW5lTmFtZSkpIHJldHVybjsKKyAgICAgICAgU3RyaW5nIGRlZmF1bHRIb3N0ID0gCisgICAgICAgICAgICAoU3RyaW5nKSBtQmVhblNlcnZlci5nZXRBdHRyaWJ1dGUoZW5naW5lTmFtZSwgImRlZmF1bHRIb3N0Iik7CisgICAgICAgIE9iamVjdE5hbWUgaG9zdE5hbWUgPSBuZXcgT2JqZWN0TmFtZQorICAgICAgICAgICAgKGRvbWFpbiArICI6dHlwZT1Ib3N0LCIgKyAiaG9zdD0iICsgZGVmYXVsdEhvc3QpOworICAgICAgICBpZiAoIW1CZWFuU2VydmVyLmlzUmVnaXN0ZXJlZChob3N0TmFtZSkpIHsKKworICAgICAgICAgICAgLy8gR2V0IHRoZSBob3N0cycgbGlzdAorICAgICAgICAgICAgU3RyaW5nIG9uU3RyID0gZG9tYWluICsgIjp0eXBlPUhvc3QsKiI7CisgICAgICAgICAgICBPYmplY3ROYW1lIG9iamVjdE5hbWUgPSBuZXcgT2JqZWN0TmFtZShvblN0cik7CisgICAgICAgICAgICBTZXQgc2V0ID0gbUJlYW5TZXJ2ZXIucXVlcnlNQmVhbnMob2JqZWN0TmFtZSwgbnVsbCk7CisgICAgICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IHNldC5pdGVyYXRvcigpOworICAgICAgICAgICAgU3RyaW5nW10gYWxpYXNlczsKKyAgICAgICAgICAgIGJvb2xlYW4gaXNSZWdpc3RlcmVkV2l0aEFsaWFzID0gZmFsc2U7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKworICAgICAgICAgICAgICAgIGlmIChpc1JlZ2lzdGVyZWRXaXRoQWxpYXMpIGJyZWFrOworICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgT2JqZWN0SW5zdGFuY2Ugb2kgPSAoT2JqZWN0SW5zdGFuY2UpIGl0ZXJhdG9yLm5leHQoKTsKKyAgICAgICAgICAgICAgICBob3N0TmFtZSA9IG9pLmdldE9iamVjdE5hbWUoKTsKKyAgICAgICAgICAgICAgICBhbGlhc2VzID0gKFN0cmluZ1tdKQorICAgICAgICAgICAgICAgICAgICBtQmVhblNlcnZlci5pbnZva2UoaG9zdE5hbWUsICJmaW5kQWxpYXNlcyIsIG51bGwsIG51bGwpOworCisgICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgYWxpYXNlcy5sZW5ndGg7IGkrKyl7CisgICAgICAgICAgICAgICAgICAgIGlmIChhbGlhc2VzW2ldLmVxdWFsc0lnbm9yZUNhc2UoZGVmYXVsdEhvc3QpKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzUmVnaXN0ZXJlZFdpdGhBbGlhcyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKCFpc1JlZ2lzdGVyZWRXaXRoQWxpYXMpCisgICAgICAgICAgICAgICAgbG9nLndhcm4oIlVua25vd24gZGVmYXVsdCBob3N0OiAiICsgZGVmYXVsdEhvc3QpOworICAgICAgICB9CisgICAgICAgIC8vIFRoaXMgc2hvdWxkIHByb2JhYmx0IGJlIGNhbGxlZCBsYXRlciAKKyAgICAgICAgaWYoIGRlZmF1bHRIb3N0ICE9IG51bGwgKSB7CisgICAgICAgICAgICBtYXBwZXIuc2V0RGVmYXVsdEhvc3ROYW1lKGRlZmF1bHRIb3N0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVyIGhvc3QuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHJlZ2lzdGVySG9zdChPYmplY3ROYW1lIG9iamVjdE5hbWUpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgbmFtZT1vYmplY3ROYW1lLmdldEtleVByb3BlcnR5KCJob3N0Iik7CisgICAgICAgIGlmKCBuYW1lICE9IG51bGwgKSB7ICAgICAgICAKKyAgICAgICAgICAgIFN0cmluZ1tdIGFsaWFzZXMgPSAoU3RyaW5nW10pCisgICAgICAgICAgICAgICAgbUJlYW5TZXJ2ZXIuaW52b2tlKG9iamVjdE5hbWUsICJmaW5kQWxpYXNlcyIsIG51bGwsIG51bGwpOworICAgICAgICAgICAgbWFwcGVyLmFkZEhvc3QobmFtZSwgYWxpYXNlcywgb2JqZWN0TmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFVucmVnaXN0ZXIgaG9zdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgdW5yZWdpc3Rlckhvc3QoT2JqZWN0TmFtZSBvYmplY3ROYW1lKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIG5hbWU9b2JqZWN0TmFtZS5nZXRLZXlQcm9wZXJ0eSgiaG9zdCIpOworICAgICAgICBtYXBwZXIucmVtb3ZlSG9zdChuYW1lKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVyIGNvbnRleHQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHJlZ2lzdGVyQ29udGV4dChPYmplY3ROYW1lIG9iamVjdE5hbWUpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIFN0cmluZyBuYW1lID0gb2JqZWN0TmFtZS5nZXRLZXlQcm9wZXJ0eSgibmFtZSIpOworICAgICAgICAKKyAgICAgICAgLy8gSWYgdGhlIGRvbWFpbiBpcyB0aGUgc2FtZSB3aXRoIG91cnMgb3IgdGhlIGVuZ2luZSAKKyAgICAgICAgLy8gbmFtZSBhdHRyaWJ1dGUgaXMgdGhlIHNhbWUuLi4gLSB0aGVuIGl0J3Mgb3VycworICAgICAgICBTdHJpbmcgdGFyZ2V0RG9tYWluPW9iamVjdE5hbWUuZ2V0RG9tYWluKCk7CisgICAgICAgIGlmKCAhIGRvbWFpbi5lcXVhbHMoIHRhcmdldERvbWFpbiApKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHRhcmdldERvbWFpbiA9IChTdHJpbmcpIG1CZWFuU2VydmVyLmdldEF0dHJpYnV0ZQorICAgICAgICAgICAgICAgICAgICAob2JqZWN0TmFtZSwgImVuZ2luZU5hbWUiKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gSWdub3JlCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiggISBkb21haW4uZXF1YWxzKCB0YXJnZXREb21haW4gKSkgeworICAgICAgICAgICAgICAgIC8vIG5vdCBvdXJzCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIGhvc3ROYW1lID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIGNvbnRleHROYW1lID0gbnVsbDsKKyAgICAgICAgaWYgKG5hbWUuc3RhcnRzV2l0aCgiLy8iKSkgeworICAgICAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDIpOworICAgICAgICB9CisgICAgICAgIGludCBzbGFzaCA9IG5hbWUuaW5kZXhPZigiLyIpOworICAgICAgICBpZiAoc2xhc2ggIT0gLTEpIHsKKyAgICAgICAgICAgIGhvc3ROYW1lID0gbmFtZS5zdWJzdHJpbmcoMCwgc2xhc2gpOworICAgICAgICAgICAgY29udGV4dE5hbWUgPSBuYW1lLnN1YnN0cmluZyhzbGFzaCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgLy8gU3BlY2lhbCBjYXNlIGZvciB0aGUgcm9vdCBjb250ZXh0CisgICAgICAgIGlmIChjb250ZXh0TmFtZS5lcXVhbHMoIi8iKSkgeworICAgICAgICAgICAgY29udGV4dE5hbWUgPSAiIjsKKyAgICAgICAgfQorCisgICAgICAgIGxvZy5kZWJ1ZyhzbS5nZXRTdHJpbmcKKyAgICAgICAgICAgICAgICAgICgibWFwcGVyTGlzdGVuZXIucmVnaXN0ZXJDb250ZXh0IiwgY29udGV4dE5hbWUpKTsKKworICAgICAgICBPYmplY3QgY29udGV4dCA9IAorICAgICAgICAgICAgbUJlYW5TZXJ2ZXIuaW52b2tlKG9iamVjdE5hbWUsICJmaW5kTWFwcGluZ09iamVjdCIsIG51bGwsIG51bGwpOworICAgICAgICAgICAgLy9tQmVhblNlcnZlci5nZXRBdHRyaWJ1dGUob2JqZWN0TmFtZSwgIm1hcHBpbmdPYmplY3QiKTsKKyAgICAgICAgamF2YXgubmFtaW5nLkNvbnRleHQgcmVzb3VyY2VzID0gKGphdmF4Lm5hbWluZy5Db250ZXh0KQorICAgICAgICAgICAgbUJlYW5TZXJ2ZXIuaW52b2tlKG9iamVjdE5hbWUsICJmaW5kU3RhdGljUmVzb3VyY2VzIiwgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICAvL21CZWFuU2VydmVyLmdldEF0dHJpYnV0ZShvYmplY3ROYW1lLCAic3RhdGljUmVzb3VyY2VzIik7CisgICAgICAgIFN0cmluZ1tdIHdlbGNvbWVGaWxlcyA9IChTdHJpbmdbXSkKKyAgICAgICAgICAgIG1CZWFuU2VydmVyLmdldEF0dHJpYnV0ZShvYmplY3ROYW1lLCAid2VsY29tZUZpbGVzIik7CisKKyAgICAgICAgbWFwcGVyLmFkZENvbnRleHQoaG9zdE5hbWUsIGNvbnRleHROYW1lLCBjb250ZXh0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgd2VsY29tZUZpbGVzLCByZXNvdXJjZXMpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBVbnJlZ2lzdGVyIGNvbnRleHQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHVucmVnaXN0ZXJDb250ZXh0KE9iamVjdE5hbWUgb2JqZWN0TmFtZSkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBvYmplY3ROYW1lLmdldEtleVByb3BlcnR5KCJuYW1lIik7CisKKyAgICAgICAgLy8gSWYgdGhlIGRvbWFpbiBpcyB0aGUgc2FtZSB3aXRoIG91cnMgb3IgdGhlIGVuZ2luZSAKKyAgICAgICAgLy8gbmFtZSBhdHRyaWJ1dGUgaXMgdGhlIHNhbWUuLi4gLSB0aGVuIGl0J3Mgb3VycworICAgICAgICBTdHJpbmcgdGFyZ2V0RG9tYWluPW9iamVjdE5hbWUuZ2V0RG9tYWluKCk7CisgICAgICAgIGlmKCAhIGRvbWFpbi5lcXVhbHMoIHRhcmdldERvbWFpbiApKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHRhcmdldERvbWFpbiA9IChTdHJpbmcpIG1CZWFuU2VydmVyLmdldEF0dHJpYnV0ZQorICAgICAgICAgICAgICAgICAgICAob2JqZWN0TmFtZSwgImVuZ2luZU5hbWUiKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gSWdub3JlCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiggISBkb21haW4uZXF1YWxzKCB0YXJnZXREb21haW4gKSkgeworICAgICAgICAgICAgICAgIC8vIG5vdCBvdXJzCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIGhvc3ROYW1lID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIGNvbnRleHROYW1lID0gbnVsbDsKKyAgICAgICAgaWYgKG5hbWUuc3RhcnRzV2l0aCgiLy8iKSkgeworICAgICAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDIpOworICAgICAgICB9CisgICAgICAgIGludCBzbGFzaCA9IG5hbWUuaW5kZXhPZigiLyIpOworICAgICAgICBpZiAoc2xhc2ggIT0gLTEpIHsKKyAgICAgICAgICAgIGhvc3ROYW1lID0gbmFtZS5zdWJzdHJpbmcoMCwgc2xhc2gpOworICAgICAgICAgICAgY29udGV4dE5hbWUgPSBuYW1lLnN1YnN0cmluZyhzbGFzaCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgLy8gU3BlY2lhbCBjYXNlIGZvciB0aGUgcm9vdCBjb250ZXh0CisgICAgICAgIGlmIChjb250ZXh0TmFtZS5lcXVhbHMoIi8iKSkgeworICAgICAgICAgICAgY29udGV4dE5hbWUgPSAiIjsKKyAgICAgICAgfQorCisgICAgICAgIGxvZy5kZWJ1ZyhzbS5nZXRTdHJpbmcKKyAgICAgICAgICAgICAgICAgICgibWFwcGVyTGlzdGVuZXIudW5yZWdpc3RlckNvbnRleHQiLCBjb250ZXh0TmFtZSkpOworCisgICAgICAgIG1hcHBlci5yZW1vdmVDb250ZXh0KGhvc3ROYW1lLCBjb250ZXh0TmFtZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVyIHdyYXBwZXIuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHJlZ2lzdGVyV3JhcHBlcihPYmplY3ROYW1lIG9iamVjdE5hbWUpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgIAorICAgICAgICAvLyBJZiB0aGUgZG9tYWluIGlzIHRoZSBzYW1lIHdpdGggb3VycyBvciB0aGUgZW5naW5lIAorICAgICAgICAvLyBuYW1lIGF0dHJpYnV0ZSBpcyB0aGUgc2FtZS4uLiAtIHRoZW4gaXQncyBvdXJzCisgICAgICAgIFN0cmluZyB0YXJnZXREb21haW49b2JqZWN0TmFtZS5nZXREb21haW4oKTsKKyAgICAgICAgaWYoICEgZG9tYWluLmVxdWFscyggdGFyZ2V0RG9tYWluICkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdGFyZ2V0RG9tYWluPShTdHJpbmcpIG1CZWFuU2VydmVyLmdldEF0dHJpYnV0ZShvYmplY3ROYW1lLCAiZW5naW5lTmFtZSIpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBJZ25vcmUKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCAhIGRvbWFpbi5lcXVhbHMoIHRhcmdldERvbWFpbiApKSB7CisgICAgICAgICAgICAgICAgLy8gbm90IG91cnMKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyB3cmFwcGVyTmFtZSA9IG9iamVjdE5hbWUuZ2V0S2V5UHJvcGVydHkoIm5hbWUiKTsKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBvYmplY3ROYW1lLmdldEtleVByb3BlcnR5KCJXZWJNb2R1bGUiKTsKKworICAgICAgICBTdHJpbmcgaG9zdE5hbWUgPSBudWxsOworICAgICAgICBTdHJpbmcgY29udGV4dE5hbWUgPSBudWxsOworICAgICAgICBpZiAobmFtZS5zdGFydHNXaXRoKCIvLyIpKSB7CisgICAgICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcoMik7CisgICAgICAgIH0KKyAgICAgICAgaW50IHNsYXNoID0gbmFtZS5pbmRleE9mKCIvIik7CisgICAgICAgIGlmIChzbGFzaCAhPSAtMSkgeworICAgICAgICAgICAgaG9zdE5hbWUgPSBuYW1lLnN1YnN0cmluZygwLCBzbGFzaCk7CisgICAgICAgICAgICBjb250ZXh0TmFtZSA9IG5hbWUuc3Vic3RyaW5nKHNsYXNoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIHRoZSByb290IGNvbnRleHQKKyAgICAgICAgaWYgKGNvbnRleHROYW1lLmVxdWFscygiLyIpKSB7CisgICAgICAgICAgICBjb250ZXh0TmFtZSA9ICIiOworICAgICAgICB9CisKKyAgICAgICAgbG9nLmRlYnVnKHNtLmdldFN0cmluZworICAgICAgICAgICAgICAgICAgKCJtYXBwZXJMaXN0ZW5lci5yZWdpc3RlcldyYXBwZXIiLCAKKyAgICAgICAgICAgICAgICAgICB3cmFwcGVyTmFtZSwgY29udGV4dE5hbWUpKTsKKworICAgICAgICBTdHJpbmdbXSBtYXBwaW5ncyA9IChTdHJpbmdbXSkKKyAgICAgICAgICAgIG1CZWFuU2VydmVyLmludm9rZShvYmplY3ROYW1lLCAiZmluZE1hcHBpbmdzIiwgbnVsbCwgbnVsbCk7CisgICAgICAgIE9iamVjdCB3cmFwcGVyID0gCisgICAgICAgICAgICBtQmVhblNlcnZlci5pbnZva2Uob2JqZWN0TmFtZSwgImZpbmRNYXBwaW5nT2JqZWN0IiwgbnVsbCwgbnVsbCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXBwaW5ncy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgYm9vbGVhbiBqc3BXaWxkQ2FyZCA9ICh3cmFwcGVyTmFtZS5lcXVhbHMoImpzcCIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIG1hcHBpbmdzW2ldLmVuZHNXaXRoKCIvKiIpKTsKKyAgICAgICAgICAgIG1hcHBlci5hZGRXcmFwcGVyKGhvc3ROYW1lLCBjb250ZXh0TmFtZSwgbWFwcGluZ3NbaV0sIHdyYXBwZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc3BXaWxkQ2FyZCk7CisgICAgICAgIH0KKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29ubmVjdG9yL091dHB1dEJ1ZmZlci5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2Nvbm5lY3Rvci9PdXRwdXRCdWZmZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODhhMDE3Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2Nvbm5lY3Rvci9PdXRwdXRCdWZmZXIuamF2YQpAQCAtMCwwICsxLDY1MCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLyAKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3RvcjsKKworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLldyaXRlcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY295b3RlLkFjdGlvbkNvZGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jb3lvdGUuUmVzcG9uc2U7CitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5idWYuQnl0ZUNodW5rOworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuYnVmLkMyQkNvbnZlcnRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvbWNhdC51dGlsLmJ1Zi5DaGFyQ2h1bms7CisKKworLyoqCisgKiBUaGUgYnVmZmVyIHVzZWQgYnkgVG9tY2F0IHJlc3BvbnNlLiBUaGlzIGlzIGEgZGVyaXZhdGl2ZSBvZiB0aGUgVG9tY2F0IDMuMworICogT3V0cHV0QnVmZmVyLCB3aXRoIHRoZSByZW1vdmFsIG9mIHNvbWUgb2YgdGhlIHN0YXRlIGhhbmRsaW5nICh3aGljaCBpbiAKKyAqIENveW90ZSBpcyBtb3N0bHkgdGhlIFByb2Nlc3NvcidzIHJlc3BvbnNhYmlsaXR5KS4KKyAqCisgKiBAYXV0aG9yIENvc3RpbiBNYW5vbGFjaGUKKyAqIEBhdXRob3IgUmVteSBNYXVjaGVyYXQKKyAqLworcHVibGljIGNsYXNzIE91dHB1dEJ1ZmZlciBleHRlbmRzIFdyaXRlcgorICAgIGltcGxlbWVudHMgQnl0ZUNodW5rLkJ5dGVPdXRwdXRDaGFubmVsLCBDaGFyQ2h1bmsuQ2hhck91dHB1dENoYW5uZWwgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdGFudHMKKworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9FTkNPRElORyA9IAorICAgICAgICBvcmcuYXBhY2hlLmNveW90ZS5Db25zdGFudHMuREVGQVVMVF9DSEFSQUNURVJfRU5DT0RJTkc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9CVUZGRVJfU0laRSA9IDgqMTAyNDsKKworCisgICAgLy8gVGhlIGJ1ZmZlciBjYW4gYmUgdXNlZCBmb3IgYnl0ZVtdIGFuZCBjaGFyW10gd3JpdGluZworICAgIC8vICggdGhpcyBpcyBuZWVkZWQgdG8gc3VwcG9ydCBTZXJ2bGV0T3V0cHV0U3RyZWFtIGFuZCBmb3IKKyAgICAvLyBlZmZpY2llbnQgaW1wbGVtZW50YXRpb25zIG9mIHRlbXBsYXRpbmcgc3lzdGVtcyApCisgICAgcHVibGljIGZpbmFsIGludCBJTklUSUFMX1NUQVRFID0gMDsKKyAgICBwdWJsaWMgZmluYWwgaW50IENIQVJfU1RBVEUgPSAxOworICAgIHB1YmxpYyBmaW5hbCBpbnQgQllURV9TVEFURSA9IDI7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgYnl0ZSBidWZmZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBCeXRlQ2h1bmsgYmI7CisKKworICAgIC8qKgorICAgICAqIFRoZSBjaHVuayBidWZmZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBDaGFyQ2h1bmsgY2I7CisKKworICAgIC8qKgorICAgICAqIFN0YXRlIG9mIHRoZSBvdXRwdXQgYnVmZmVyLgorICAgICAqLworICAgIHByaXZhdGUgaW50IHN0YXRlID0gMDsKKworCisgICAgLyoqCisgICAgICogTnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4uCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgYnl0ZXNXcml0dGVuID0gMDsKKworCisgICAgLyoqCisgICAgICogTnVtYmVyIG9mIGNoYXJzIHdyaXR0ZW4uCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgY2hhcnNXcml0dGVuID0gMDsKKworCisgICAgLyoqCisgICAgICogRmxhZyB3aGljaCBpbmRpY2F0ZXMgaWYgdGhlIG91dHB1dCBidWZmZXIgaXMgY2xvc2VkLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBjbG9zZWQgPSBmYWxzZTsKKworCisgICAgLyoqCisgICAgICogRG8gYSBmbHVzaCBvbiB0aGUgbmV4dCBvcGVyYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGRvRmx1c2ggPSBmYWxzZTsKKworCisgICAgLyoqCisgICAgICogQnl0ZSBjaHVuayB1c2VkIHRvIG91dHB1dCBieXRlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIEJ5dGVDaHVuayBvdXRwdXRDaHVuayA9IG5ldyBCeXRlQ2h1bmsoKTsKKworCisgICAgLyoqCisgICAgICogRW5jb2RpbmcgdG8gdXNlLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGVuYzsKKworCisgICAgLyoqCisgICAgICogRW5jb2RlciBpcyBzZXQuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGdvdEVuYyA9IGZhbHNlOworCisKKyAgICAvKioKKyAgICAgKiBMaXN0IG9mIGVuY29kZXJzLgorICAgICAqLworICAgIHByb3RlY3RlZCBIYXNoTWFwIGVuY29kZXJzID0gbmV3IEhhc2hNYXAoKTsKKworCisgICAgLyoqCisgICAgICogQ3VycmVudCBjaGFyIHRvIGJ5dGUgY29udmVydGVyLgorICAgICAqLworICAgIHByb3RlY3RlZCBDMkJDb252ZXJ0ZXIgY29udjsKKworCisgICAgLyoqCisgICAgICogQXNzb2NpYXRlZCBDb3lvdGUgcmVzcG9uc2UuCisgICAgICovCisgICAgcHJpdmF0ZSBSZXNwb25zZSBjb3lvdGVSZXNwb25zZTsKKworCisgICAgLyoqCisgICAgICogU3VzcGVuZGVkIGZsYWcuIEFsbCBvdXRwdXQgYnl0ZXMgd2lsbCBiZSBzd2FsbG93ZWQgaWYgdGhpcyBpcyB0cnVlLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBzdXNwZW5kZWQgPSBmYWxzZTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuIEFsbG9jYXRlIHRoZSBidWZmZXIgd2l0aCB0aGUgZGVmYXVsdCBidWZmZXIgc2l6ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgT3V0cHV0QnVmZmVyKCkgeworCisgICAgICAgIHRoaXMoREVGQVVMVF9CVUZGRVJfU0laRSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEFsdGVybmF0ZSBjb25zdHJ1Y3RvciB3aGljaCBhbGxvd3Mgc3BlY2lmeWluZyB0aGUgaW5pdGlhbCBidWZmZXIgc2l6ZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc2l6ZSBCdWZmZXIgc2l6ZSB0byB1c2UKKyAgICAgKi8KKyAgICBwdWJsaWMgT3V0cHV0QnVmZmVyKGludCBzaXplKSB7CisKKyAgICAgICAgYmIgPSBuZXcgQnl0ZUNodW5rKHNpemUpOworICAgICAgICBiYi5zZXRMaW1pdChzaXplKTsKKyAgICAgICAgYmIuc2V0Qnl0ZU91dHB1dENoYW5uZWwodGhpcyk7CisgICAgICAgIGNiID0gbmV3IENoYXJDaHVuayhzaXplKTsKKyAgICAgICAgY2Iuc2V0Q2hhck91dHB1dENoYW5uZWwodGhpcyk7CisgICAgICAgIGNiLnNldExpbWl0KHNpemUpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogQXNzb2NpYXRlZCBDb3lvdGUgcmVzcG9uc2UuCisgICAgICogCisgICAgICogQHBhcmFtIGNveW90ZVJlc3BvbnNlIEFzc29jaWF0ZWQgQ295b3RlIHJlc3BvbnNlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVzcG9uc2UoUmVzcG9uc2UgY295b3RlUmVzcG9uc2UpIHsKKwl0aGlzLmNveW90ZVJlc3BvbnNlID0gY295b3RlUmVzcG9uc2U7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHZXQgYXNzb2NpYXRlZCBDb3lvdGUgcmVzcG9uc2UuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgYXNzb2NpYXRlZCBDb3lvdGUgcmVzcG9uc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgUmVzcG9uc2UgZ2V0UmVzcG9uc2UoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmNveW90ZVJlc3BvbnNlOworICAgIH0KKworCisgICAgLyoqCisgICAgICogSXMgdGhlIHJlc3BvbnNlIG91dHB1dCBzdXNwZW5kZWQgPworICAgICAqIAorICAgICAqIEByZXR1cm4gc3VzcGVuZGVkIGZsYWcgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1N1c3BlbmRlZCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuc3VzcGVuZGVkOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzdXNwZW5kZWQgZmxhZy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc3VzcGVuZGVkIE5ldyBzdXNwZW5kZWQgZmxhZyB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFN1c3BlbmRlZChib29sZWFuIHN1c3BlbmRlZCkgeworICAgICAgICB0aGlzLnN1c3BlbmRlZCA9IHN1c3BlbmRlZDsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZWN5Y2xlIHRoZSBvdXRwdXQgYnVmZmVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlY3ljbGUoKSB7CisgICAgICAgIAorICAgICAgICBzdGF0ZSA9IElOSVRJQUxfU1RBVEU7CisgICAgICAgIGJ5dGVzV3JpdHRlbiA9IDA7CisgICAgICAgIGNoYXJzV3JpdHRlbiA9IDA7CisgICAgICAgIAorICAgICAgICBjYi5yZWN5Y2xlKCk7CisgICAgICAgIGJiLnJlY3ljbGUoKTsgCisgICAgICAgIGNsb3NlZCA9IGZhbHNlOworICAgICAgICBzdXNwZW5kZWQgPSBmYWxzZTsKKyAgICAgICAgCisgICAgICAgIGlmIChjb252IT0gbnVsbCkgeworICAgICAgICAgICAgY29udi5yZWN5Y2xlKCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGdvdEVuYyA9IGZhbHNlOworICAgICAgICBlbmMgPSBudWxsOworICAgICAgICAKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENsb3NlIHRoZSBvdXRwdXQgYnVmZmVyLiBUaGlzIHRyaWVzIHRvIGNhbGN1bGF0ZSB0aGUgcmVzcG9uc2Ugc2l6ZSBpZiAKKyAgICAgKiB0aGUgcmVzcG9uc2UgaGFzIG5vdCBiZWVuIGNvbW1pdHRlZCB5ZXQuCisgICAgICogCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBBbiB1bmRlcmx5aW5nIElPRXhjZXB0aW9uIG9jY3VycmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xvc2UoKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIGlmIChjbG9zZWQpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGlmIChzdXNwZW5kZWQpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgaWYgKCghY295b3RlUmVzcG9uc2UuaXNDb21taXR0ZWQoKSkgCisgICAgICAgICAgICAmJiAoY295b3RlUmVzcG9uc2UuZ2V0Q29udGVudExlbmd0aCgpID09IC0xKSkgeworICAgICAgICAgICAgLy8gRmx1c2hpbmcgdGhlIGNoYXIgYnVmZmVyCisgICAgICAgICAgICBpZiAoc3RhdGUgPT0gQ0hBUl9TVEFURSkgeworICAgICAgICAgICAgICAgIGNiLmZsdXNoQnVmZmVyKCk7CisgICAgICAgICAgICAgICAgc3RhdGUgPSBCWVRFX1NUQVRFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gSWYgdGhpcyBkaWRuJ3QgY2F1c2UgYSBjb21taXQgb2YgdGhlIHJlc3BvbnNlLCB0aGUgZmluYWwgY29udGVudAorICAgICAgICAgICAgLy8gbGVuZ3RoIGNhbiBiZSBjYWxjdWxhdGVkCisgICAgICAgICAgICBpZiAoIWNveW90ZVJlc3BvbnNlLmlzQ29tbWl0dGVkKCkpIHsKKyAgICAgICAgICAgICAgICBjb3lvdGVSZXNwb25zZS5zZXRDb250ZW50TGVuZ3RoKGJiLmdldExlbmd0aCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGRvRmx1c2goZmFsc2UpOworICAgICAgICBjbG9zZWQgPSB0cnVlOworCisgICAgICAgIGNveW90ZVJlc3BvbnNlLmZpbmlzaCgpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBGbHVzaCBieXRlcyBvciBjaGFycyBjb250YWluZWQgaW4gdGhlIGJ1ZmZlci4KKyAgICAgKiAKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIEFuIHVuZGVybHlpbmcgSU9FeGNlcHRpb24gb2NjdXJyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBmbHVzaCgpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGRvRmx1c2godHJ1ZSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBGbHVzaCBieXRlcyBvciBjaGFycyBjb250YWluZWQgaW4gdGhlIGJ1ZmZlci4KKyAgICAgKiAKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIEFuIHVuZGVybHlpbmcgSU9FeGNlcHRpb24gb2NjdXJyZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBkb0ZsdXNoKGJvb2xlYW4gcmVhbEZsdXNoKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIGlmIChzdXNwZW5kZWQpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgZG9GbHVzaCA9IHRydWU7CisgICAgICAgIGlmIChzdGF0ZSA9PSBDSEFSX1NUQVRFKSB7CisgICAgICAgICAgICBjYi5mbHVzaEJ1ZmZlcigpOworICAgICAgICAgICAgYmIuZmx1c2hCdWZmZXIoKTsKKyAgICAgICAgICAgIHN0YXRlID0gQllURV9TVEFURTsKKyAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PSBCWVRFX1NUQVRFKSB7CisgICAgICAgICAgICBiYi5mbHVzaEJ1ZmZlcigpOworICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09IElOSVRJQUxfU1RBVEUpIHsKKyAgICAgICAgICAgIC8vIElmIHRoZSBidWZmZXJzIGFyZSBlbXB0eSwgY29tbWl0IHRoZSByZXNwb25zZSBoZWFkZXIKKyAgICAgICAgICAgIGNveW90ZVJlc3BvbnNlLnNlbmRIZWFkZXJzKCk7CisgICAgICAgIH0KKyAgICAgICAgZG9GbHVzaCA9IGZhbHNlOworCisgICAgICAgIGlmIChyZWFsRmx1c2gpIHsKKyAgICAgICAgICAgIGNveW90ZVJlc3BvbnNlLmFjdGlvbihBY3Rpb25Db2RlLkFDVElPTl9DTElFTlRfRkxVU0gsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNveW90ZVJlc3BvbnNlKTsKKyAgICAgICAgICAgIC8vIElmIHNvbWUgZXhjZXB0aW9uIG9jY3VycmVkIGVhcmxpZXIsIG9yIGlmIHNvbWUgSU9FIG9jY3VycmVkCisgICAgICAgICAgICAvLyBoZXJlLCBub3RpZnkgdGhlIHNlcnZsZXQgd2l0aCBhbiBJT0UKKyAgICAgICAgICAgIGlmIChjb3lvdGVSZXNwb25zZS5pc0V4Y2VwdGlvblByZXNlbnQoKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbGllbnRBYm9ydEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAoY295b3RlUmVzcG9uc2UuZ2V0RXJyb3JFeGNlcHRpb24oKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBCeXRlcyBIYW5kbGluZyBNZXRob2RzCisKKworICAgIC8qKiAKKyAgICAgKiBTZW5kcyB0aGUgYnVmZmVyIGRhdGEgdG8gdGhlIGNsaWVudCBvdXRwdXQsIGNoZWNraW5nIHRoZQorICAgICAqIHN0YXRlIG9mIFJlc3BvbnNlIGFuZCBjYWxsaW5nIHRoZSByaWdodCBpbnRlcmNlcHRvcnMuCisgICAgICogCisgICAgICogQHBhcmFtIGJ1ZiBCeXRlIGJ1ZmZlciB0byBiZSB3cml0dGVuIHRvIHRoZSByZXNwb25zZQorICAgICAqIEBwYXJhbSBvZmYgT2Zmc2V0CisgICAgICogQHBhcmFtIGNudCBMZW5ndGgKKyAgICAgKiAKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIEFuIHVuZGVybHlpbmcgSU9FeGNlcHRpb24gb2NjdXJyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWFsV3JpdGVCeXRlcyhieXRlIGJ1ZltdLCBpbnQgb2ZmLCBpbnQgY250KQorCXRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKGNsb3NlZCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKGNveW90ZVJlc3BvbnNlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgLy8gSWYgd2UgcmVhbGx5IGhhdmUgc29tZXRoaW5nIHRvIHdyaXRlCisgICAgICAgIGlmIChjbnQgPiAwKSB7CisgICAgICAgICAgICAvLyByZWFsIHdyaXRlIHRvIHRoZSBhZGFwdGVyCisgICAgICAgICAgICBvdXRwdXRDaHVuay5zZXRCeXRlcyhidWYsIG9mZiwgY250KTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY295b3RlUmVzcG9uc2UuZG9Xcml0ZShvdXRwdXRDaHVuayk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gQW4gSU9FeGNlcHRpb24gb24gYSB3cml0ZSBpcyBhbG1vc3QgYWx3YXlzIGR1ZSB0bworICAgICAgICAgICAgICAgIC8vIHRoZSByZW1vdGUgY2xpZW50IGFib3J0aW5nIHRoZSByZXF1ZXN0LiAgV3JhcCB0aGlzCisgICAgICAgICAgICAgICAgLy8gc28gdGhhdCBpdCBjYW4gYmUgaGFuZGxlZCBiZXR0ZXIgYnkgdGhlIGVycm9yIGRpc3BhdGNoZXIuCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENsaWVudEFib3J0RXhjZXB0aW9uKGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHdyaXRlKGJ5dGUgYltdLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIGlmIChzdXNwZW5kZWQpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgaWYgKHN0YXRlID09IENIQVJfU1RBVEUpCisgICAgICAgICAgICBjYi5mbHVzaEJ1ZmZlcigpOworICAgICAgICBzdGF0ZSA9IEJZVEVfU1RBVEU7CisgICAgICAgIHdyaXRlQnl0ZXMoYiwgb2ZmLCBsZW4pOworCisgICAgfQorCisKKyAgICBwcml2YXRlIHZvaWQgd3JpdGVCeXRlcyhieXRlIGJbXSwgaW50IG9mZiwgaW50IGxlbikgCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKGNsb3NlZCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBiYi5hcHBlbmQoYiwgb2ZmLCBsZW4pOworICAgICAgICBieXRlc1dyaXR0ZW4gKz0gbGVuOworCisgICAgICAgIC8vIGlmIGNhbGxlZCBmcm9tIHdpdGhpbiBmbHVzaCgpLCB0aGVuIGltbWVkaWF0ZWx5IGZsdXNoCisgICAgICAgIC8vIHJlbWFpbmluZyBieXRlcworICAgICAgICBpZiAoZG9GbHVzaCkgeworICAgICAgICAgICAgYmIuZmx1c2hCdWZmZXIoKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZUJ5dGUoaW50IGIpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKHN1c3BlbmRlZCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBpZiAoc3RhdGUgPT0gQ0hBUl9TVEFURSkKKyAgICAgICAgICAgIGNiLmZsdXNoQnVmZmVyKCk7CisgICAgICAgIHN0YXRlID0gQllURV9TVEFURTsKKworICAgICAgICBiYi5hcHBlbmQoIChieXRlKWIgKTsKKyAgICAgICAgYnl0ZXNXcml0dGVuKys7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ2hhcnMgSGFuZGxpbmcgTWV0aG9kcworCisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZShpbnQgYykKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAoc3VzcGVuZGVkKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIHN0YXRlID0gQ0hBUl9TVEFURTsKKworICAgICAgICBjYi5hcHBlbmQoKGNoYXIpIGMpOworICAgICAgICBjaGFyc1dyaXR0ZW4rKzsKKworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgd3JpdGUoY2hhciBjW10pCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKHN1c3BlbmRlZCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICB3cml0ZShjLCAwLCBjLmxlbmd0aCk7CisKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHdyaXRlKGNoYXIgY1tdLCBpbnQgb2ZmLCBpbnQgbGVuKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIGlmIChzdXNwZW5kZWQpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgc3RhdGUgPSBDSEFSX1NUQVRFOworCisgICAgICAgIGNiLmFwcGVuZChjLCBvZmYsIGxlbik7CisgICAgICAgIGNoYXJzV3JpdHRlbiArPSBsZW47CisKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHdyaXRlKFN0cmluZ0J1ZmZlciBzYikKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAoc3VzcGVuZGVkKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIHN0YXRlID0gQ0hBUl9TVEFURTsKKworICAgICAgICBpbnQgbGVuID0gc2IubGVuZ3RoKCk7CisgICAgICAgIGNoYXJzV3JpdHRlbiArPSBsZW47CisgICAgICAgIGNiLmFwcGVuZChzYik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEFwcGVuZCBhIHN0cmluZyB0byB0aGUgYnVmZmVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgd3JpdGUoU3RyaW5nIHMsIGludCBvZmYsIGludCBsZW4pCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKHN1c3BlbmRlZCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBzdGF0ZT1DSEFSX1NUQVRFOworCisgICAgICAgIGNoYXJzV3JpdHRlbiArPSBsZW47CisgICAgICAgIGlmIChzPT1udWxsKQorICAgICAgICAgICAgcz0ibnVsbCI7CisgICAgICAgIGNiLmFwcGVuZCggcywgb2ZmLCBsZW4gKTsKKworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgd3JpdGUoU3RyaW5nIHMpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKHN1c3BlbmRlZCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBzdGF0ZSA9IENIQVJfU1RBVEU7CisgICAgICAgIGlmIChzPT1udWxsKQorICAgICAgICAgICAgcz0ibnVsbCI7CisgICAgICAgIHdyaXRlKHMsIDAsIHMubGVuZ3RoKCkpOworCisgICAgfSAKKworCisgICAgcHVibGljIHZvaWQgZmx1c2hDaGFycygpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgY2IuZmx1c2hCdWZmZXIoKTsKKyAgICAgICAgc3RhdGUgPSBCWVRFX1NUQVRFOworCisgICAgfQorCisKKyAgICBwdWJsaWMgYm9vbGVhbiBmbHVzaENoYXJzTmVlZGVkKCkgeworICAgICAgICByZXR1cm4gc3RhdGUgPT0gQ0hBUl9TVEFURTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldEVuY29kaW5nKFN0cmluZyBzKSB7CisgICAgICAgIGVuYyA9IHM7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCByZWFsV3JpdGVDaGFycyhjaGFyIGNbXSwgaW50IG9mZiwgaW50IGxlbikgCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKCFnb3RFbmMpCisgICAgICAgICAgICBzZXRDb252ZXJ0ZXIoKTsKKworICAgICAgICBjb252LmNvbnZlcnQoYywgb2ZmLCBsZW4pOworICAgICAgICBjb252LmZsdXNoQnVmZmVyKCk7CS8vID8/PworCisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBjaGVja0NvbnZlcnRlcigpIAorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIGlmICghZ290RW5jKQorICAgICAgICAgICAgc2V0Q29udmVydGVyKCk7CisKKyAgICB9CisKKworICAgIHByb3RlY3RlZCB2b2lkIHNldENvbnZlcnRlcigpIAorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIGlmIChjb3lvdGVSZXNwb25zZSAhPSBudWxsKQorICAgICAgICAgICAgZW5jID0gY295b3RlUmVzcG9uc2UuZ2V0Q2hhcmFjdGVyRW5jb2RpbmcoKTsKKworICAgICAgICBnb3RFbmMgPSB0cnVlOworICAgICAgICBpZiAoZW5jID09IG51bGwpCisgICAgICAgICAgICBlbmMgPSBERUZBVUxUX0VOQ09ESU5HOworICAgICAgICBjb252ID0gKEMyQkNvbnZlcnRlcikgZW5jb2RlcnMuZ2V0KGVuYyk7CisgICAgICAgIGlmIChjb252ID09IG51bGwpIHsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSAhPSBudWxsKXsKKyAgICAgICAgICAgICAgICB0cnl7CisgICAgICAgICAgICAgICAgICAgIGNvbnYgPSAoQzJCQ29udmVydGVyKUFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKCl7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgSU9FeGNlcHRpb257CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEMyQkNvbnZlcnRlcihiYiwgZW5jKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICApOyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgfWNhdGNoKFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24gZXgpeworICAgICAgICAgICAgICAgICAgICBFeGNlcHRpb24gZSA9IGV4LmdldEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIElPRXhjZXB0aW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgKElPRXhjZXB0aW9uKWU7IAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY29udiA9IG5ldyBDMkJDb252ZXJ0ZXIoYmIsIGVuYyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGVuY29kZXJzLnB1dChlbmMsIGNvbnYpOworCisgICAgICAgIH0KKyAgICB9CisKKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAgQnVmZmVyZWRPdXRwdXRTdHJlYW0gY29tcGF0aWJpbGl0eQorCisKKyAgICAvKioKKyAgICAgKiBSZWFsIHdyaXRlIC0gdGhpcyBidWZmZXIgd2lsbCBiZSBzZW50IHRvIHRoZSBjbGllbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBmbHVzaEJ5dGVzKCkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICBiYi5mbHVzaEJ1ZmZlcigpOworCisgICAgfQorCisKKyAgICBwdWJsaWMgaW50IGdldEJ5dGVzV3JpdHRlbigpIHsKKyAgICAgICAgcmV0dXJuIGJ5dGVzV3JpdHRlbjsKKyAgICB9CisKKworICAgIHB1YmxpYyBpbnQgZ2V0Q2hhcnNXcml0dGVuKCkgeworICAgICAgICByZXR1cm4gY2hhcnNXcml0dGVuOworICAgIH0KKworCisgICAgcHVibGljIGludCBnZXRDb250ZW50V3JpdHRlbigpIHsKKyAgICAgICAgcmV0dXJuIGJ5dGVzV3JpdHRlbiArIGNoYXJzV3JpdHRlbjsKKyAgICB9CisKKworICAgIC8qKiAKKyAgICAgKiBUcnVlIGlmIHRoaXMgYnVmZmVyIGhhc24ndCBiZWVuIHVzZWQgKCBzaW5jZSByZWN5Y2xlKCkgKSAtCisgICAgICogaS5lLiBubyBjaGFycyBvciBieXRlcyBoYXZlIGJlZW4gYWRkZWQgdG8gdGhlIGJ1ZmZlci4gIAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzTmV3KCkgeworICAgICAgICByZXR1cm4gKGJ5dGVzV3JpdHRlbiA9PSAwKSAmJiAoY2hhcnNXcml0dGVuID09IDApOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgc2V0QnVmZmVyU2l6ZShpbnQgc2l6ZSkgeworICAgICAgICBpZiAoc2l6ZSA+IGJiLmdldExpbWl0KCkpIHsvLyA/Pz8/Pz8KKwkgICAgYmIuc2V0TGltaXQoc2l6ZSk7CisJfQorICAgIH0KKworCisgICAgcHVibGljIHZvaWQgcmVzZXQoKSB7CisKKyAgICAgICAgLy9jb3VudD0wOworICAgICAgICBiYi5yZWN5Y2xlKCk7CisgICAgICAgIGJ5dGVzV3JpdHRlbiA9IDA7CisgICAgICAgIGNiLnJlY3ljbGUoKTsKKyAgICAgICAgY2hhcnNXcml0dGVuID0gMDsKKyAgICAgICAgZ290RW5jID0gZmFsc2U7CisgICAgICAgIGVuYyA9IG51bGw7CisKKyAgICB9CisKKworICAgIHB1YmxpYyBpbnQgZ2V0QnVmZmVyU2l6ZSgpIHsKKwlyZXR1cm4gYmIuZ2V0TGltaXQoKTsKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2Nvbm5lY3Rvci9SZXF1ZXN0LmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29ubmVjdG9yL1JlcXVlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmNjMjJhCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2Nvbm5lY3Rvci9SZXF1ZXN0LmphdmEKQEAgLTAsMCArMSwyNDkxIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3RvcjsKKworCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsOworaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlRpbWVab25lOworaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOworCitpbXBvcnQgamF2YXguc2VjdXJpdHkuYXV0aC5TdWJqZWN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuRmlsdGVyQ2hhaW47CitpbXBvcnQgamF2YXguc2VydmxldC5SZXF1ZXN0RGlzcGF0Y2hlcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldElucHV0U3RyZWFtOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVFdmVudDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlTGlzdGVuZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkNvb2tpZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuYnVmLkIyQ0NvbnZlcnRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvbWNhdC51dGlsLmJ1Zi5NZXNzYWdlQnl0ZXM7CitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5odHRwLkNvb2tpZXM7CitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5odHRwLkZhc3RIdHRwRGF0ZUZvcm1hdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvbWNhdC51dGlsLmh0dHAuUGFyYW1ldGVyczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvbWNhdC51dGlsLmh0dHAuU2VydmVyQ29va2llOworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuaHR0cC5tYXBwZXIuTWFwcGluZ0RhdGE7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNveW90ZS5BY3Rpb25Db2RlOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Db250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuR2xvYmFsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkhvc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5NYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuUmVhbG07CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5TZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuV3JhcHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuQXBwbGljYXRpb25GaWx0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5FbnVtZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5QYXJhbWV0ZXJNYXA7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLlJlcXVlc3RVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5TdHJpbmdNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5TdHJpbmdQYXJzZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOworCisvKioKKyAqIFdyYXBwZXIgb2JqZWN0IGZvciB0aGUgQ295b3RlIHJlcXVlc3QuCisgKgorICogQGF1dGhvciBSZW15IE1hdWNoZXJhdAorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBSZXF1ZXN0CisgICAgaW1wbGVtZW50cyBIdHRwU2VydmxldFJlcXVlc3QgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgcHVibGljIFJlcXVlc3QoKSB7CisKKyAgICAgICAgZm9ybWF0c1swXS5zZXRUaW1lWm9uZShHTVRfWk9ORSk7CisgICAgICAgIGZvcm1hdHNbMV0uc2V0VGltZVpvbmUoR01UX1pPTkUpOworICAgICAgICBmb3JtYXRzWzJdLnNldFRpbWVab25lKEdNVF9aT05FKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIENveW90ZSByZXF1ZXN0LgorICAgICAqLworICAgIHByb3RlY3RlZCBvcmcuYXBhY2hlLmNveW90ZS5SZXF1ZXN0IGNveW90ZVJlcXVlc3Q7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIENveW90ZSByZXF1ZXN0LgorICAgICAqIAorICAgICAqIEBwYXJhbSBjb3lvdGVSZXF1ZXN0IFRoZSBDb3lvdGUgcmVxdWVzdAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENveW90ZVJlcXVlc3Qob3JnLmFwYWNoZS5jb3lvdGUuUmVxdWVzdCBjb3lvdGVSZXF1ZXN0KSB7CisgICAgICAgIHRoaXMuY295b3RlUmVxdWVzdCA9IGNveW90ZVJlcXVlc3Q7CisgICAgICAgIGlucHV0QnVmZmVyLnNldFJlcXVlc3QoY295b3RlUmVxdWVzdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBDb3lvdGUgcmVxdWVzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgb3JnLmFwYWNoZS5jb3lvdGUuUmVxdWVzdCBnZXRDb3lvdGVSZXF1ZXN0KCkgeworICAgICAgICByZXR1cm4gKHRoaXMuY295b3RlUmVxdWVzdCk7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBWYXJpYWJsZXMKKworCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBUaW1lWm9uZSBHTVRfWk9ORSA9IFRpbWVab25lLmdldFRpbWVab25lKCJHTVQiKTsKKworCisgICAgLyoqCisgICAgICogVGhlIHN0cmluZyBtYW5hZ2VyIGZvciB0aGlzIHBhY2thZ2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmdNYW5hZ2VyIHNtID0KKyAgICAgICAgU3RyaW5nTWFuYWdlci5nZXRNYW5hZ2VyKENvbnN0YW50cy5QYWNrYWdlKTsKKworCisgICAgLyoqCisgICAgICogVGhlIHNldCBvZiBjb29raWVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFJlcXVlc3QuCisgICAgICovCisgICAgcHJvdGVjdGVkIENvb2tpZVtdIGNvb2tpZXMgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc2V0IG9mIFNpbXBsZURhdGVGb3JtYXQgZm9ybWF0cyB0byB1c2UgaW4gZ2V0RGF0ZUhlYWRlcigpLgorICAgICAqCisgICAgICogTm90aWNlIHRoYXQgYmVjYXVzZSBTaW1wbGVEYXRlRm9ybWF0IGlzIG5vdCB0aHJlYWQtc2FmZSwgd2UgY2FuJ3QKKyAgICAgKiBkZWNsYXJlIGZvcm1hdHNbXSBhcyBhIHN0YXRpYyB2YXJpYWJsZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU2ltcGxlRGF0ZUZvcm1hdCBmb3JtYXRzW10gPSB7CisgICAgICAgIG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJFRUUsIGRkIE1NTSB5eXl5IEhIOm1tOnNzIHp6eiIsIExvY2FsZS5VUyksCisgICAgICAgIG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJFRUVFRUUsIGRkLU1NTS15eSBISDptbTpzcyB6enoiLCBMb2NhbGUuVVMpLAorICAgICAgICBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgiRUVFIE1NTU0gZCBISDptbTpzcyB5eXl5IiwgTG9jYWxlLlVTKQorICAgIH07CisKKworICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IExvY2FsZSBpZiBub25lIGFyZSBzcGVjaWZpZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBMb2NhbGUgZGVmYXVsdExvY2FsZSA9IExvY2FsZS5nZXREZWZhdWx0KCk7CisKKworICAgIC8qKgorICAgICAqIFRoZSBhdHRyaWJ1dGVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFJlcXVlc3QsIGtleWVkIGJ5IGF0dHJpYnV0ZSBuYW1lLgorICAgICAqLworICAgIHByb3RlY3RlZCBIYXNoTWFwIGF0dHJpYnV0ZXMgPSBuZXcgSGFzaE1hcCgpOworCisKKyAgICAvKioKKyAgICAgKiBMaXN0IG9mIHJlYWQgb25seSBhdHRyaWJ1dGVzIGZvciB0aGlzIFJlcXVlc3QuCisgICAgICovCisgICAgcHJpdmF0ZSBIYXNoTWFwIHJlYWRPbmx5QXR0cmlidXRlcyA9IG5ldyBIYXNoTWFwKCk7CisKKworICAgIC8qKgorICAgICAqIFRoZSBwcmVmZXJyZWQgTG9jYWxlcyBhc3NvY2FpdGVkIHdpdGggdGhpcyBSZXF1ZXN0LgorICAgICAqLworICAgIHByb3RlY3RlZCBBcnJheUxpc3QgbG9jYWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKKworCisgICAgLyoqCisgICAgICogSW50ZXJuYWwgbm90ZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmVxdWVzdCBieSBDYXRhbGluYSBjb21wb25lbnRzCisgICAgICogYW5kIGV2ZW50IGxpc3RlbmVycy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHRyYW5zaWVudCBIYXNoTWFwIG5vdGVzID0gbmV3IEhhc2hNYXAoKTsKKworCisgICAgLyoqCisgICAgICogQXV0aGVudGljYXRpb24gdHlwZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGF1dGhUeXBlID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIGN1cnJlbnQgZGlzcGF0Y2hlciB0eXBlLgorICAgICAqLworICAgIHByb3RlY3RlZCBPYmplY3QgZGlzcGF0Y2hlclR5cGUgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgYXNzb2NpYXRlZCBpbnB1dCBidWZmZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIElucHV0QnVmZmVyIGlucHV0QnVmZmVyID0gbmV3IElucHV0QnVmZmVyKCk7CisKKworICAgIC8qKgorICAgICAqIFNlcnZsZXRJbnB1dFN0cmVhbS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ295b3RlSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSAKKyAgICAgICAgbmV3IENveW90ZUlucHV0U3RyZWFtKGlucHV0QnVmZmVyKTsKKworCisgICAgLyoqCisgICAgICogUmVhZGVyLgorICAgICAqLworICAgIHByb3RlY3RlZCBDb3lvdGVSZWFkZXIgcmVhZGVyID0gbmV3IENveW90ZVJlYWRlcihpbnB1dEJ1ZmZlcik7CisKKworICAgIC8qKgorICAgICAqIFVzaW5nIHN0cmVhbSBmbGFnLgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIHVzaW5nSW5wdXRTdHJlYW0gPSBmYWxzZTsKKworCisgICAgLyoqCisgICAgICogVXNpbmcgd3JpdGVyIGZsYWcuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gdXNpbmdSZWFkZXIgPSBmYWxzZTsKKworCisgICAgLyoqCisgICAgICogVXNlciBwcmluY2lwYWwuCisgICAgICovCisgICAgcHJvdGVjdGVkIFByaW5jaXBhbCB1c2VyUHJpbmNpcGFsID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogU2Vzc2lvbiBwYXJzZWQgZmxhZy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzZXNzaW9uUGFyc2VkID0gZmFsc2U7CisKKworICAgIC8qKgorICAgICAqIFJlcXVlc3QgcGFyYW1ldGVycyBwYXJzZWQgZmxhZy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwYXJhbWV0ZXJzUGFyc2VkID0gZmFsc2U7CisKKworICAgIC8qKgorICAgICAqIENvb2tpZXMgcGFyc2VkIGZsYWcuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gY29va2llc1BhcnNlZCA9IGZhbHNlOworCisKKyAgICAvKioKKyAgICAgKiBTZWN1cmUgZmxhZy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzZWN1cmUgPSBmYWxzZTsKKworICAgIAorICAgIC8qKgorICAgICAqIFRoZSBTdWJqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBBY2Nlc3NDb250cm9sbGVyQ29udGV4dAorICAgICAqLworICAgIHByb3RlY3RlZCB0cmFuc2llbnQgU3ViamVjdCBzdWJqZWN0ID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogUG9zdCBkYXRhIGJ1ZmZlci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGludCBDQUNIRURfUE9TVF9MRU4gPSA4MTkyOworICAgIHByb3RlY3RlZCBieXRlW10gcG9zdERhdGEgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBIYXNoIG1hcCB1c2VkIGluIHRoZSBnZXRQYXJhbWV0ZXJzTWFwIG1ldGhvZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUGFyYW1ldGVyTWFwIHBhcmFtZXRlck1hcCA9IG5ldyBQYXJhbWV0ZXJNYXAoKTsKKworCisgICAgLyoqCisgICAgICogVGhlIGN1cnJlbnRseSBhY3RpdmUgc2Vzc2lvbiBmb3IgdGhpcyByZXF1ZXN0LgorICAgICAqLworICAgIHByb3RlY3RlZCBTZXNzaW9uIHNlc3Npb24gPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgY3VycmVudCByZXF1ZXN0IGRpc3BhdGNoZXIgcGF0aC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgT2JqZWN0IHJlcXVlc3REaXNwYXRjaGVyUGF0aCA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFdhcyB0aGUgcmVxdWVzdGVkIHNlc3Npb24gSUQgcmVjZWl2ZWQgaW4gYSBjb29raWU/CisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gcmVxdWVzdGVkU2Vzc2lvbkNvb2tpZSA9IGZhbHNlOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgcmVxdWVzdGVkIHNlc3Npb24gSUQgKGlmIGFueSkgZm9yIHRoaXMgcmVxdWVzdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHJlcXVlc3RlZFNlc3Npb25JZCA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFdhcyB0aGUgcmVxdWVzdGVkIHNlc3Npb24gSUQgcmVjZWl2ZWQgaW4gYSBVUkw/CisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gcmVxdWVzdGVkU2Vzc2lvblVSTCA9IGZhbHNlOworCisKKyAgICAvKioKKyAgICAgKiBQYXJzZSBsb2NhbGVzLgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGxvY2FsZXNQYXJzZWQgPSBmYWxzZTsKKworCisgICAgLyoqCisgICAgICogVGhlIHN0cmluZyBwYXJzZXIgd2Ugd2lsbCB1c2UgZm9yIHBhcnNpbmcgcmVxdWVzdCBsaW5lcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZ1BhcnNlciBwYXJzZXIgPSBuZXcgU3RyaW5nUGFyc2VyKCk7CisKKworICAgIC8qKgorICAgICAqIExvY2FsIHBvcnQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IGxvY2FsUG9ydCA9IC0xOworCisgICAgLyoqCisgICAgICogUmVtb3RlIGFkZHJlc3MuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyByZW1vdGVBZGRyID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogUmVtb3RlIGhvc3QuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyByZW1vdGVIb3N0ID0gbnVsbDsKKworICAgIAorICAgIC8qKgorICAgICAqIFJlbW90ZSBwb3J0CisgICAgICovCisgICAgcHJvdGVjdGVkIGludCByZW1vdGVQb3J0ID0gLTE7CisgICAgCisgICAgLyoqCisgICAgICogTG9jYWwgYWRkcmVzcworICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgbG9jYWxBZGRyID0gbnVsbDsKKworICAgIAorICAgIC8qKgorICAgICAqIExvY2FsIGFkZHJlc3MKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGxvY2FsTmFtZSA9IG51bGw7CisKKyAgICAvKiogQWZ0ZXIgdGhlIHJlcXVlc3QgaXMgbWFwcGVkIHRvIGEgU2VydmxldENvbnRleHQsIHdlIGNhbiBhbHNvCisgICAgICogbWFwIGl0IHRvIGEgbG9nZ2VyLgorICAgICAqLyAKKyAgICBwcm90ZWN0ZWQgTG9nIGxvZz1udWxsOworICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisgICAgLyoqCisgICAgICogUmVsZWFzZSBhbGwgb2JqZWN0IHJlZmVyZW5jZXMsIGFuZCBpbml0aWFsaXplIGluc3RhbmNlIHZhcmlhYmxlcywgaW4KKyAgICAgKiBwcmVwYXJhdGlvbiBmb3IgcmV1c2Ugb2YgdGhpcyBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVjeWNsZSgpIHsKKworICAgICAgICBjb250ZXh0ID0gbnVsbDsKKyAgICAgICAgd3JhcHBlciA9IG51bGw7CisKKyAgICAgICAgZGlzcGF0Y2hlclR5cGUgPSBudWxsOworICAgICAgICByZXF1ZXN0RGlzcGF0Y2hlclBhdGggPSBudWxsOworCisgICAgICAgIGF1dGhUeXBlID0gbnVsbDsKKyAgICAgICAgaW5wdXRCdWZmZXIucmVjeWNsZSgpOworICAgICAgICB1c2luZ0lucHV0U3RyZWFtID0gZmFsc2U7CisgICAgICAgIHVzaW5nUmVhZGVyID0gZmFsc2U7CisgICAgICAgIHVzZXJQcmluY2lwYWwgPSBudWxsOworICAgICAgICBzdWJqZWN0ID0gbnVsbDsKKyAgICAgICAgc2Vzc2lvblBhcnNlZCA9IGZhbHNlOworICAgICAgICBwYXJhbWV0ZXJzUGFyc2VkID0gZmFsc2U7CisgICAgICAgIGNvb2tpZXNQYXJzZWQgPSBmYWxzZTsKKyAgICAgICAgbG9jYWxlcy5jbGVhcigpOworICAgICAgICBsb2NhbGVzUGFyc2VkID0gZmFsc2U7CisgICAgICAgIHNlY3VyZSA9IGZhbHNlOworICAgICAgICByZW1vdGVBZGRyID0gbnVsbDsKKyAgICAgICAgcmVtb3RlSG9zdCA9IG51bGw7CisgICAgICAgIHJlbW90ZVBvcnQgPSAtMTsKKyAgICAgICAgbG9jYWxQb3J0ID0gLTE7CisgICAgICAgIGxvY2FsQWRkciA9IG51bGw7CisgICAgICAgIGxvY2FsTmFtZSA9IG51bGw7CisKKyAgICAgICAgYXR0cmlidXRlcy5jbGVhcigpOworICAgICAgICBub3Rlcy5jbGVhcigpOworICAgICAgICBjb29raWVzID0gbnVsbDsKKworICAgICAgICBpZiAoc2Vzc2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBzZXNzaW9uLmVuZEFjY2VzcygpOworICAgICAgICB9CisgICAgICAgIHNlc3Npb24gPSBudWxsOworICAgICAgICByZXF1ZXN0ZWRTZXNzaW9uQ29va2llID0gZmFsc2U7CisgICAgICAgIHJlcXVlc3RlZFNlc3Npb25JZCA9IG51bGw7CisgICAgICAgIHJlcXVlc3RlZFNlc3Npb25VUkwgPSBmYWxzZTsKKyAgICAgICAgbG9nID0gbnVsbDsKKworICAgICAgICBwYXJhbWV0ZXJNYXAuc2V0TG9ja2VkKGZhbHNlKTsKKyAgICAgICAgcGFyYW1ldGVyTWFwLmNsZWFyKCk7CisKKyAgICAgICAgbWFwcGluZ0RhdGEucmVjeWNsZSgpOworCisgICAgICAgIGlmIChDb25zdGFudHMuU0VDVVJJVFkpIHsKKyAgICAgICAgICAgIGlmIChmYWNhZGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZhY2FkZS5jbGVhcigpOworICAgICAgICAgICAgICAgIGZhY2FkZSA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaW5wdXRTdHJlYW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlucHV0U3RyZWFtLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgaW5wdXRTdHJlYW0gPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJlYWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmVhZGVyLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgcmVhZGVyID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBSZXF1ZXN0IE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogQXNzb2NpYXRlZCBDYXRhbGluYSBjb25uZWN0b3IuCisgICAgICovCisgICAgcHJvdGVjdGVkIENvbm5lY3RvciBjb25uZWN0b3I7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIENvbm5lY3RvciB0aHJvdWdoIHdoaWNoIHRoaXMgUmVxdWVzdCB3YXMgcmVjZWl2ZWQuCisgICAgICovCisgICAgcHVibGljIENvbm5lY3RvciBnZXRDb25uZWN0b3IoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5jb25uZWN0b3IpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgQ29ubmVjdG9yIHRocm91Z2ggd2hpY2ggdGhpcyBSZXF1ZXN0IHdhcyByZWNlaXZlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0b3IgVGhlIG5ldyBjb25uZWN0b3IKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb25uZWN0b3IoQ29ubmVjdG9yIGNvbm5lY3RvcikgeworICAgICAgICB0aGlzLmNvbm5lY3RvciA9IChDb25uZWN0b3IpIGNvbm5lY3RvcjsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEFzc29jaWF0ZWQgY29udGV4dC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ29udGV4dCBjb250ZXh0ID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgQ29udGV4dCB3aXRoaW4gd2hpY2ggdGhpcyBSZXF1ZXN0IGlzIGJlaW5nIHByb2Nlc3NlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29udGV4dCBnZXRDb250ZXh0KCkgeworICAgICAgICByZXR1cm4gKHRoaXMuY29udGV4dCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIENvbnRleHQgd2l0aGluIHdoaWNoIHRoaXMgUmVxdWVzdCBpcyBiZWluZyBwcm9jZXNzZWQuICBUaGlzCisgICAgICogbXVzdCBiZSBjYWxsZWQgYXMgc29vbiBhcyB0aGUgYXBwcm9wcmlhdGUgQ29udGV4dCBpcyBpZGVudGlmaWVkLCBiZWNhdXNlCisgICAgICogaXQgaWRlbnRpZmllcyB0aGUgdmFsdWUgdG8gYmUgcmV0dXJuZWQgYnkgPGNvZGU+Z2V0Q29udGV4dFBhdGgoKTwvY29kZT4sCisgICAgICogYW5kIHRodXMgZW5hYmxlcyBwYXJzaW5nIG9mIHRoZSByZXF1ZXN0IFVSSS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBuZXdseSBhc3NvY2lhdGVkIENvbnRleHQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb250ZXh0KENvbnRleHQgY29udGV4dCkgeworICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0OworICAgIH0KKworCisgICAgLyoqCisgICAgICogRmlsdGVyIGNoYWluIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVxdWVzdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRmlsdGVyQ2hhaW4gZmlsdGVyQ2hhaW4gPSBudWxsOworCisgICAgLyoqCisgICAgICogR2V0IGZpbHRlciBjaGFpbiBhc3NvY2lhdGVkIHdpdGggdGhlIHJlcXVlc3QuCisgICAgICovCisgICAgcHVibGljIEZpbHRlckNoYWluIGdldEZpbHRlckNoYWluKCkgeworICAgICAgICByZXR1cm4gKHRoaXMuZmlsdGVyQ2hhaW4pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBmaWx0ZXIgY2hhaW4gYXNzb2NpYXRlZCB3aXRoIHRoZSByZXF1ZXN0LgorICAgICAqIAorICAgICAqIEBwYXJhbSBmaWx0ZXJDaGFpbiBuZXcgZmlsdGVyIGNoYWluCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RmlsdGVyQ2hhaW4oRmlsdGVyQ2hhaW4gZmlsdGVyQ2hhaW4pIHsKKyAgICAgICAgdGhpcy5maWx0ZXJDaGFpbiA9IGZpbHRlckNoYWluOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBIb3N0IHdpdGhpbiB3aGljaCB0aGlzIFJlcXVlc3QgaXMgYmVpbmcgcHJvY2Vzc2VkLgorICAgICAqLworICAgIHB1YmxpYyBIb3N0IGdldEhvc3QoKSB7CisgICAgICAgIGlmIChnZXRDb250ZXh0KCkgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICByZXR1cm4gKEhvc3QpIGdldENvbnRleHQoKS5nZXRQYXJlbnQoKTsKKyAgICAgICAgLy9yZXR1cm4gKChIb3N0KSBtYXBwaW5nRGF0YS5ob3N0KTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgSG9zdCB3aXRoaW4gd2hpY2ggdGhpcyBSZXF1ZXN0IGlzIGJlaW5nIHByb2Nlc3NlZC4gIFRoaXMKKyAgICAgKiBtdXN0IGJlIGNhbGxlZCBhcyBzb29uIGFzIHRoZSBhcHByb3ByaWF0ZSBIb3N0IGlzIGlkZW50aWZpZWQsIGFuZAorICAgICAqIGJlZm9yZSB0aGUgUmVxdWVzdCBpcyBwYXNzZWQgdG8gYSBjb250ZXh0LgorICAgICAqCisgICAgICogQHBhcmFtIGhvc3QgVGhlIG5ld2x5IGFzc29jaWF0ZWQgSG9zdAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEhvc3QoSG9zdCBob3N0KSB7CisgICAgICAgIG1hcHBpbmdEYXRhLmhvc3QgPSBob3N0OworICAgIH0KKworCisgICAgLyoqCisgICAgICogRGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBSZXF1ZXN0IGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIGluZm8gPQorICAgICAgICAib3JnLmFwYWNoZS5jb3lvdGUuY2F0YWxpbmEuQ295b3RlUmVxdWVzdC8xLjAiOworCisgICAgLyoqCisgICAgICogUmV0dXJuIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgUmVxdWVzdCBpbXBsZW1lbnRhdGlvbiBhbmQKKyAgICAgKiB0aGUgY29ycmVzcG9uZGluZyB2ZXJzaW9uIG51bWJlciwgaW4gdGhlIGZvcm1hdAorICAgICAqIDxjb2RlPiZsdDtkZXNjcmlwdGlvbiZndDsvJmx0O3ZlcnNpb24mZ3Q7PC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEluZm8oKSB7CisgICAgICAgIHJldHVybiAoaW5mbyk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBNYXBwaW5nIGRhdGEuCisgICAgICovCisgICAgcHJvdGVjdGVkIE1hcHBpbmdEYXRhIG1hcHBpbmdEYXRhID0gbmV3IE1hcHBpbmdEYXRhKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gbWFwcGluZyBkYXRhLgorICAgICAqLworICAgIHB1YmxpYyBNYXBwaW5nRGF0YSBnZXRNYXBwaW5nRGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIChtYXBwaW5nRGF0YSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgZmFjYWRlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJlcXVlc3QuCisgICAgICovCisgICAgcHJvdGVjdGVkIFJlcXVlc3RGYWNhZGUgZmFjYWRlID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgPGNvZGU+U2VydmxldFJlcXVlc3Q8L2NvZGU+IGZvciB3aGljaCB0aGlzIG9iamVjdAorICAgICAqIGlzIHRoZSBmYWNhZGUuICBUaGlzIG1ldGhvZCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IGEgc3ViY2xhc3MuCisgICAgICovCisgICAgcHVibGljIEh0dHBTZXJ2bGV0UmVxdWVzdCBnZXRSZXF1ZXN0KCkgeworICAgICAgICBpZiAoZmFjYWRlID09IG51bGwpIHsKKyAgICAgICAgICAgIGZhY2FkZSA9IG5ldyBSZXF1ZXN0RmFjYWRlKHRoaXMpOworICAgICAgICB9IAorICAgICAgICByZXR1cm4gKGZhY2FkZSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgcmVzcG9uc2Ugd2l0aCB3aGljaCB0aGlzIHJlcXVlc3QgaXMgYXNzb2NpYXRlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuUmVzcG9uc2UgcmVzcG9uc2UgPSBudWxsOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBSZXNwb25zZSB3aXRoIHdoaWNoIHRoaXMgUmVxdWVzdCBpcyBhc3NvY2lhdGVkLgorICAgICAqLworICAgIHB1YmxpYyBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3Rvci5SZXNwb25zZSBnZXRSZXNwb25zZSgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLnJlc3BvbnNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIFJlc3BvbnNlIHdpdGggd2hpY2ggdGhpcyBSZXF1ZXN0IGlzIGFzc29jaWF0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIG5ldyBhc3NvY2lhdGVkIHJlc3BvbnNlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVzcG9uc2Uob3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuUmVzcG9uc2UgcmVzcG9uc2UpIHsKKyAgICAgICAgdGhpcy5yZXNwb25zZSA9IHJlc3BvbnNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgaW5wdXQgc3RyZWFtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFJlcXVlc3QuCisgICAgICovCisgICAgcHVibGljIElucHV0U3RyZWFtIGdldFN0cmVhbSgpIHsKKyAgICAgICAgaWYgKGlucHV0U3RyZWFtID09IG51bGwpIHsKKyAgICAgICAgICAgIGlucHV0U3RyZWFtID0gbmV3IENveW90ZUlucHV0U3RyZWFtKGlucHV0QnVmZmVyKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaW5wdXRTdHJlYW07CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBpbnB1dCBzdHJlYW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgUmVxdWVzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJlYW0gVGhlIG5ldyBpbnB1dCBzdHJlYW0KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTdHJlYW0oSW5wdXRTdHJlYW0gc3RyZWFtKSB7CisgICAgICAgIC8vIElnbm9yZQorICAgIH0KKworCisgICAgLyoqCisgICAgICogVVJJIGJ5dGUgdG8gY2hhciBjb252ZXJ0ZXIgKG5vdCByZWN5Y2xlZCkuCisgICAgICovCisgICAgcHJvdGVjdGVkIEIyQ0NvbnZlcnRlciBVUklDb252ZXJ0ZXIgPSBudWxsOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBVUkkgY29udmVydGVyLgorICAgICAqLworICAgIHByb3RlY3RlZCBCMkNDb252ZXJ0ZXIgZ2V0VVJJQ29udmVydGVyKCkgeworICAgICAgICByZXR1cm4gVVJJQ29udmVydGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgVVJJIGNvbnZlcnRlci4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gVVJJQ29udmVydGVyIHRoZSBuZXcgVVJJIGNvbm52ZXJ0ZXIKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVUklDb252ZXJ0ZXIoQjJDQ29udmVydGVyIFVSSUNvbnZlcnRlcikgeworICAgICAgICB0aGlzLlVSSUNvbnZlcnRlciA9IFVSSUNvbnZlcnRlcjsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEFzc29jaWF0ZWQgd3JhcHBlci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgV3JhcHBlciB3cmFwcGVyID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgV3JhcHBlciB3aXRoaW4gd2hpY2ggdGhpcyBSZXF1ZXN0IGlzIGJlaW5nIHByb2Nlc3NlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgV3JhcHBlciBnZXRXcmFwcGVyKCkgeworICAgICAgICByZXR1cm4gKHRoaXMud3JhcHBlcik7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIFdyYXBwZXIgd2l0aGluIHdoaWNoIHRoaXMgUmVxdWVzdCBpcyBiZWluZyBwcm9jZXNzZWQuICBUaGlzCisgICAgICogbXVzdCBiZSBjYWxsZWQgYXMgc29vbiBhcyB0aGUgYXBwcm9wcmlhdGUgV3JhcHBlciBpcyBpZGVudGlmaWVkLCBhbmQKKyAgICAgKiBiZWZvcmUgdGhlIFJlcXVlc3QgaXMgdWx0aW1hdGVseSBwYXNzZWQgdG8gYW4gYXBwbGljYXRpb24gc2VydmxldC4KKyAgICAgKiBAcGFyYW0gd3JhcHBlciBUaGUgbmV3bHkgYXNzb2NpYXRlZCBXcmFwcGVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0V3JhcHBlcihXcmFwcGVyIHdyYXBwZXIpIHsKKyAgICAgICAgdGhpcy53cmFwcGVyID0gd3JhcHBlcjsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUmVxdWVzdCBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW5kIHJldHVybiBhIFNlcnZsZXRJbnB1dFN0cmVhbSB0byByZWFkIHRoZSBjb250ZW50CisgICAgICogYXNzb2NpYXRlZCB3aXRoIHRoaXMgUmVxdWVzdC4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBTZXJ2bGV0SW5wdXRTdHJlYW0gY3JlYXRlSW5wdXRTdHJlYW0oKSAKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGlucHV0U3RyZWFtID09IG51bGwpIHsKKyAgICAgICAgICAgIGlucHV0U3RyZWFtID0gbmV3IENveW90ZUlucHV0U3RyZWFtKGlucHV0QnVmZmVyKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaW5wdXRTdHJlYW07CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtIHdoYXRldmVyIGFjdGlvbnMgYXJlIHJlcXVpcmVkIHRvIGZsdXNoIGFuZCBjbG9zZSB0aGUgaW5wdXQKKyAgICAgKiBzdHJlYW0gb3IgcmVhZGVyLCBpbiBhIHNpbmdsZSBvcGVyYXRpb24uCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBmaW5pc2hSZXF1ZXN0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gVGhlIHJlYWRlciBhbmQgaW5wdXQgc3RyZWFtIGRvbid0IG5lZWQgdG8gYmUgY2xvc2VkCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG9iamVjdCBib3VuZCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSB0byB0aGUgaW50ZXJuYWwgbm90ZXMKKyAgICAgKiBmb3IgdGhpcyByZXF1ZXN0LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBzdWNoIGJpbmRpbmcgZXhpc3RzLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgbm90ZSB0byBiZSByZXR1cm5lZAorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0Tm90ZShTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gKG5vdGVzLmdldChuYW1lKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYW4gSXRlcmF0b3IgY29udGFpbmluZyB0aGUgU3RyaW5nIG5hbWVzIG9mIGFsbCBub3RlcyBiaW5kaW5ncworICAgICAqIHRoYXQgZXhpc3QgZm9yIHRoaXMgcmVxdWVzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgSXRlcmF0b3IgZ2V0Tm90ZU5hbWVzKCkgeworICAgICAgICByZXR1cm4gKG5vdGVzLmtleVNldCgpLml0ZXJhdG9yKCkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGFueSBvYmplY3QgYm91bmQgdG8gdGhlIHNwZWNpZmllZCBuYW1lIGluIHRoZSBpbnRlcm5hbCBub3RlcworICAgICAqIGZvciB0aGlzIHJlcXVlc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBub3RlIHRvIGJlIHJlbW92ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVOb3RlKFN0cmluZyBuYW1lKSB7CisgICAgICAgIG5vdGVzLnJlbW92ZShuYW1lKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEJpbmQgYW4gb2JqZWN0IHRvIGEgc3BlY2lmaWVkIG5hbWUgaW4gdGhlIGludGVybmFsIG5vdGVzIGFzc29jaWF0ZWQKKyAgICAgKiB3aXRoIHRoaXMgcmVxdWVzdCwgcmVwbGFjaW5nIGFueSBleGlzdGluZyBiaW5kaW5nIGZvciB0aGlzIG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIHRvIHdoaWNoIHRoZSBvYmplY3Qgc2hvdWxkIGJlIGJvdW5kCisgICAgICogQHBhcmFtIHZhbHVlIE9iamVjdCB0byBiZSBib3VuZCB0byB0aGUgc3BlY2lmaWVkIG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXROb3RlKFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgbm90ZXMucHV0KG5hbWUsIHZhbHVlKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY29udGVudCBsZW5ndGggYXNzb2NpYXRlZCB3aXRoIHRoaXMgUmVxdWVzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsZW5ndGggVGhlIG5ldyBjb250ZW50IGxlbmd0aAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbnRlbnRMZW5ndGgoaW50IGxlbmd0aCkgeworICAgICAgICAvLyBOb3QgdXNlZAorICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjb250ZW50IHR5cGUgKGFuZCBvcHRpb25hbGx5IHRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcpCisgICAgICogYXNzb2NpYXRlZCB3aXRoIHRoaXMgUmVxdWVzdC4gIEZvciBleGFtcGxlLAorICAgICAqIDxjb2RlPnRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS00PC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0eXBlIFRoZSBuZXcgY29udGVudCB0eXBlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29udGVudFR5cGUoU3RyaW5nIHR5cGUpIHsKKyAgICAgICAgLy8gTm90IHVzZWQKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcHJvdG9jb2wgbmFtZSBhbmQgdmVyc2lvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBSZXF1ZXN0LgorICAgICAqCisgICAgICogQHBhcmFtIHByb3RvY29sIFByb3RvY29sIG5hbWUgYW5kIHZlcnNpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcm90b2NvbChTdHJpbmcgcHJvdG9jb2wpIHsKKyAgICAgICAgLy8gTm90IHVzZWQKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgSVAgYWRkcmVzcyBvZiB0aGUgcmVtb3RlIGNsaWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBSZXF1ZXN0LgorICAgICAqCisgICAgICogQHBhcmFtIHJlbW90ZUFkZHIgVGhlIHJlbW90ZSBJUCBhZGRyZXNzCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVtb3RlQWRkcihTdHJpbmcgcmVtb3RlQWRkcikgeworICAgICAgICAvLyBOb3QgdXNlZAorICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgcmVtb3RlIGNsaWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcworICAgICAqIFJlcXVlc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVtb3RlSG9zdCBUaGUgcmVtb3RlIGhvc3QgbmFtZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlbW90ZUhvc3QoU3RyaW5nIHJlbW90ZUhvc3QpIHsKKyAgICAgICAgLy8gTm90IHVzZWQKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbmFtZSBvZiB0aGUgc2NoZW1lIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJlcXVlc3QuICBUeXBpY2FsIHZhbHVlcworICAgICAqIGFyZSA8Y29kZT5odHRwPC9jb2RlPiwgPGNvZGU+aHR0cHM8L2NvZGU+LCBhbmQgPGNvZGU+ZnRwPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzY2hlbWUgVGhlIHNjaGVtZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNjaGVtZShTdHJpbmcgc2NoZW1lKSB7CisgICAgICAgIC8vIE5vdCB1c2VkCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHZhbHVlIHRvIGJlIHJldHVybmVkIGJ5IDxjb2RlPmlzU2VjdXJlKCk8L2NvZGU+CisgICAgICogZm9yIHRoaXMgUmVxdWVzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWN1cmUgVGhlIG5ldyBpc1NlY3VyZSB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNlY3VyZShib29sZWFuIHNlY3VyZSkgeworICAgICAgICB0aGlzLnNlY3VyZSA9IHNlY3VyZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbmFtZSBvZiB0aGUgc2VydmVyICh2aXJ0dWFsIGhvc3QpIHRvIHByb2Nlc3MgdGhpcyByZXF1ZXN0LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgVGhlIHNlcnZlciBuYW1lCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2VydmVyTmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICBjb3lvdGVSZXF1ZXN0LnNlcnZlck5hbWUoKS5zZXRTdHJpbmcobmFtZSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHBvcnQgbnVtYmVyIG9mIHRoZSBzZXJ2ZXIgdG8gcHJvY2VzcyB0aGlzIHJlcXVlc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcG9ydCBUaGUgc2VydmVyIHBvcnQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJQb3J0KGludCBwb3J0KSB7CisgICAgICAgIGNveW90ZVJlcXVlc3Quc2V0U2VydmVyUG9ydChwb3J0KTsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU2VydmxldFJlcXVlc3QgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCByZXF1ZXN0IGF0dHJpYnV0ZSBpZiBpdCBleGlzdHM7IG90aGVyd2lzZSwgcmV0dXJuCisgICAgICogPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSByZXF1ZXN0IGF0dHJpYnV0ZSB0byByZXR1cm4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSkgeworCisgICAgICAgIGlmIChuYW1lLmVxdWFscyhHbG9iYWxzLkRJU1BBVENIRVJfVFlQRV9BVFRSKSkgeworICAgICAgICAgICAgcmV0dXJuIChkaXNwYXRjaGVyVHlwZSA9PSBudWxsKSAKKyAgICAgICAgICAgICAgICA/IEFwcGxpY2F0aW9uRmlsdGVyRmFjdG9yeS5SRVFVRVNUX0lOVEVHRVIKKyAgICAgICAgICAgICAgICA6IGRpc3BhdGNoZXJUeXBlOworICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKEdsb2JhbHMuRElTUEFUQ0hFUl9SRVFVRVNUX1BBVEhfQVRUUikpIHsKKyAgICAgICAgICAgIHJldHVybiAocmVxdWVzdERpc3BhdGNoZXJQYXRoID09IG51bGwpIAorICAgICAgICAgICAgICAgID8gZ2V0UmVxdWVzdFBhdGhNQigpLnRvU3RyaW5nKCkKKyAgICAgICAgICAgICAgICA6IHJlcXVlc3REaXNwYXRjaGVyUGF0aC50b1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgT2JqZWN0IGF0dHI9YXR0cmlidXRlcy5nZXQobmFtZSk7CisKKyAgICAgICAgaWYoYXR0ciE9bnVsbCkKKyAgICAgICAgICAgIHJldHVybihhdHRyKTsKKworICAgICAgICBhdHRyID0gIGNveW90ZVJlcXVlc3QuZ2V0QXR0cmlidXRlKG5hbWUpOworICAgICAgICBpZihhdHRyICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gYXR0cjsKKyAgICAgICAgaWYoIGlzU1NMQXR0cmlidXRlKG5hbWUpICkgeworICAgICAgICAgICAgY295b3RlUmVxdWVzdC5hY3Rpb24oQWN0aW9uQ29kZS5BQ1RJT05fUkVRX1NTTF9BVFRSSUJVVEUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY295b3RlUmVxdWVzdCk7CisgICAgICAgICAgICBhdHRyID0gY295b3RlUmVxdWVzdC5nZXRBdHRyaWJ1dGUoR2xvYmFscy5DRVJUSUZJQ0FURVNfQVRUUik7CisgICAgICAgICAgICBpZiggYXR0ciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYXR0cmlidXRlcy5wdXQoR2xvYmFscy5DRVJUSUZJQ0FURVNfQVRUUiwgYXR0cik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdHRyID0gY295b3RlUmVxdWVzdC5nZXRBdHRyaWJ1dGUoR2xvYmFscy5DSVBIRVJfU1VJVEVfQVRUUik7CisgICAgICAgICAgICBpZihhdHRyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLnB1dChHbG9iYWxzLkNJUEhFUl9TVUlURV9BVFRSLCBhdHRyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF0dHIgPSBjb3lvdGVSZXF1ZXN0LmdldEF0dHJpYnV0ZShHbG9iYWxzLktFWV9TSVpFX0FUVFIpOworICAgICAgICAgICAgaWYoYXR0ciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYXR0cmlidXRlcy5wdXQoR2xvYmFscy5LRVlfU0laRV9BVFRSLCBhdHRyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF0dHIgPSBhdHRyaWJ1dGVzLmdldChuYW1lKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYXR0cjsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRlc3QgaWYgYSBnaXZlbiBuYW1lIGlzIG9uZSBvZiB0aGUgc3BlY2lhbCBTZXJ2bGV0LXNwZWMgU1NMIGF0dHJpYnV0ZXMuCisgICAgICovCisgICAgc3RhdGljIGJvb2xlYW4gaXNTU0xBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIEdsb2JhbHMuQ0VSVElGSUNBVEVTX0FUVFIuZXF1YWxzKG5hbWUpIHx8CisgICAgICAgICAgICBHbG9iYWxzLkNJUEhFUl9TVUlURV9BVFRSLmVxdWFscyhuYW1lKSB8fAorICAgICAgICAgICAgR2xvYmFscy5LRVlfU0laRV9BVFRSLmVxdWFscyhuYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG5hbWVzIG9mIGFsbCByZXF1ZXN0IGF0dHJpYnV0ZXMgZm9yIHRoaXMgUmVxdWVzdCwgb3IgYW4KKyAgICAgKiBlbXB0eSA8Y29kZT5FbnVtZXJhdGlvbjwvY29kZT4gaWYgdGhlcmUgYXJlIG5vbmUuCisgICAgICovCisgICAgcHVibGljIEVudW1lcmF0aW9uIGdldEF0dHJpYnV0ZU5hbWVzKCkgeworICAgICAgICBpZiAoaXNTZWN1cmUoKSkgeworICAgICAgICAgICAgZ2V0QXR0cmlidXRlKEdsb2JhbHMuQ0VSVElGSUNBVEVTX0FUVFIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgRW51bWVyYXRvcihhdHRyaWJ1dGVzLmtleVNldCgpLCB0cnVlKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY2hhcmFjdGVyIGVuY29kaW5nIGZvciB0aGlzIFJlcXVlc3QuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDaGFyYWN0ZXJFbmNvZGluZygpIHsKKyAgICAgIHJldHVybiAoY295b3RlUmVxdWVzdC5nZXRDaGFyYWN0ZXJFbmNvZGluZygpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY29udGVudCBsZW5ndGggZm9yIHRoaXMgUmVxdWVzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldENvbnRlbnRMZW5ndGgoKSB7CisgICAgICAgIHJldHVybiAoY295b3RlUmVxdWVzdC5nZXRDb250ZW50TGVuZ3RoKCkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjb250ZW50IHR5cGUgZm9yIHRoaXMgUmVxdWVzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRUeXBlKCkgeworICAgICAgICByZXR1cm4gKGNveW90ZVJlcXVlc3QuZ2V0Q29udGVudFR5cGUoKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNlcnZsZXQgaW5wdXQgc3RyZWFtIGZvciB0aGlzIFJlcXVlc3QuICBUaGUgZGVmYXVsdAorICAgICAqIGltcGxlbWVudGF0aW9uIHJldHVybnMgYSBzZXJ2bGV0IGlucHV0IHN0cmVhbSBjcmVhdGVkIGJ5CisgICAgICogPGNvZGU+Y3JlYXRlSW5wdXRTdHJlYW0oKTwvY29kZT4uCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiA8Y29kZT5nZXRSZWFkZXIoKTwvY29kZT4gaGFzCisgICAgICogIGFscmVhZHkgYmVlbiBjYWxsZWQgZm9yIHRoaXMgcmVxdWVzdAorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBTZXJ2bGV0SW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIGlmICh1c2luZ1JlYWRlcikKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJjb3lvdGVSZXF1ZXN0LmdldElucHV0U3RyZWFtLmlzZSIpKTsKKworICAgICAgICB1c2luZ0lucHV0U3RyZWFtID0gdHJ1ZTsKKyAgICAgICAgaWYgKGlucHV0U3RyZWFtID09IG51bGwpIHsKKyAgICAgICAgICAgIGlucHV0U3RyZWFtID0gbmV3IENveW90ZUlucHV0U3RyZWFtKGlucHV0QnVmZmVyKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaW5wdXRTdHJlYW07CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcHJlZmVycmVkIExvY2FsZSB0aGF0IHRoZSBjbGllbnQgd2lsbCBhY2NlcHQgY29udGVudCBpbiwKKyAgICAgKiBiYXNlZCBvbiB0aGUgdmFsdWUgZm9yIHRoZSBmaXJzdCA8Y29kZT5BY2NlcHQtTGFuZ3VhZ2U8L2NvZGU+IGhlYWRlcgorICAgICAqIHRoYXQgd2FzIGVuY291bnRlcmVkLiAgSWYgdGhlIHJlcXVlc3QgZGlkIG5vdCBzcGVjaWZ5IGEgcHJlZmVycmVkCisgICAgICogbGFuZ3VhZ2UsIHRoZSBzZXJ2ZXIncyBkZWZhdWx0IExvY2FsZSBpcyByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTG9jYWxlIGdldExvY2FsZSgpIHsKKworICAgICAgICBpZiAoIWxvY2FsZXNQYXJzZWQpCisgICAgICAgICAgICBwYXJzZUxvY2FsZXMoKTsKKworICAgICAgICBpZiAobG9jYWxlcy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICByZXR1cm4gKChMb2NhbGUpIGxvY2FsZXMuZ2V0KDApKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAoZGVmYXVsdExvY2FsZSk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXQgb2YgcHJlZmVycmVkIExvY2FsZXMgdGhhdCB0aGUgY2xpZW50IHdpbGwgYWNjZXB0CisgICAgICogY29udGVudCBpbiwgYmFzZWQgb24gdGhlIHZhbHVlcyBmb3IgYW55IDxjb2RlPkFjY2VwdC1MYW5ndWFnZTwvY29kZT4KKyAgICAgKiBoZWFkZXJzIHRoYXQgd2VyZSBlbmNvdW50ZXJlZC4gIElmIHRoZSByZXF1ZXN0IGRpZCBub3Qgc3BlY2lmeSBhCisgICAgICogcHJlZmVycmVkIGxhbmd1YWdlLCB0aGUgc2VydmVyJ3MgZGVmYXVsdCBMb2NhbGUgaXMgcmV0dXJuZWQuCisgICAgICovCisgICAgcHVibGljIEVudW1lcmF0aW9uIGdldExvY2FsZXMoKSB7CisKKyAgICAgICAgaWYgKCFsb2NhbGVzUGFyc2VkKQorICAgICAgICAgICAgcGFyc2VMb2NhbGVzKCk7CisKKyAgICAgICAgaWYgKGxvY2FsZXMuc2l6ZSgpID4gMCkKKyAgICAgICAgICAgIHJldHVybiAobmV3IEVudW1lcmF0b3IobG9jYWxlcykpOworICAgICAgICBBcnJheUxpc3QgcmVzdWx0cyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgcmVzdWx0cy5hZGQoZGVmYXVsdExvY2FsZSk7CisgICAgICAgIHJldHVybiAobmV3IEVudW1lcmF0b3IocmVzdWx0cykpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgcmVxdWVzdCBwYXJhbWV0ZXIsIGlmIGFueTsgb3RoZXJ3aXNlLAorICAgICAqIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4gIElmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgdmFsdWUgZGVmaW5lZCwKKyAgICAgKiByZXR1cm4gb25seSB0aGUgZmlyc3Qgb25lLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgZGVzaXJlZCByZXF1ZXN0IHBhcmFtZXRlcgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFyYW1ldGVyKFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgaWYgKCFwYXJhbWV0ZXJzUGFyc2VkKQorICAgICAgICAgICAgcGFyc2VQYXJhbWV0ZXJzKCk7CisKKyAgICAgICAgcmV0dXJuIGNveW90ZVJlcXVlc3QuZ2V0UGFyYW1ldGVycygpLmdldFBhcmFtZXRlcihuYW1lKTsKKworICAgIH0KKworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgPGNvZGU+TWFwPC9jb2RlPiBvZiB0aGUgcGFyYW1ldGVycyBvZiB0aGlzIHJlcXVlc3QuCisgICAgICogUmVxdWVzdCBwYXJhbWV0ZXJzIGFyZSBleHRyYSBpbmZvcm1hdGlvbiBzZW50IHdpdGggdGhlIHJlcXVlc3QuCisgICAgICogRm9yIEhUVFAgc2VydmxldHMsIHBhcmFtZXRlcnMgYXJlIGNvbnRhaW5lZCBpbiB0aGUgcXVlcnkgc3RyaW5nCisgICAgICogb3IgcG9zdGVkIGZvcm0gZGF0YS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gQSA8Y29kZT5NYXA8L2NvZGU+IGNvbnRhaW5pbmcgcGFyYW1ldGVyIG5hbWVzIGFzIGtleXMKKyAgICAgKiAgYW5kIHBhcmFtZXRlciB2YWx1ZXMgYXMgbWFwIHZhbHVlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWFwIGdldFBhcmFtZXRlck1hcCgpIHsKKworICAgICAgICBpZiAocGFyYW1ldGVyTWFwLmlzTG9ja2VkKCkpCisgICAgICAgICAgICByZXR1cm4gcGFyYW1ldGVyTWFwOworCisgICAgICAgIEVudW1lcmF0aW9uIGVudW1lcmF0aW9uID0gZ2V0UGFyYW1ldGVyTmFtZXMoKTsKKyAgICAgICAgd2hpbGUgKGVudW1lcmF0aW9uLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGVudW1lcmF0aW9uLm5leHRFbGVtZW50KCkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIFN0cmluZ1tdIHZhbHVlcyA9IGdldFBhcmFtZXRlclZhbHVlcyhuYW1lKTsKKyAgICAgICAgICAgIHBhcmFtZXRlck1hcC5wdXQobmFtZSwgdmFsdWVzKTsKKyAgICAgICAgfQorCisgICAgICAgIHBhcmFtZXRlck1hcC5zZXRMb2NrZWQodHJ1ZSk7CisKKyAgICAgICAgcmV0dXJuIHBhcmFtZXRlck1hcDsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBuYW1lcyBvZiBhbGwgZGVmaW5lZCByZXF1ZXN0IHBhcmFtZXRlcnMgZm9yIHRoaXMgcmVxdWVzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0UGFyYW1ldGVyTmFtZXMoKSB7CisKKyAgICAgICAgaWYgKCFwYXJhbWV0ZXJzUGFyc2VkKQorICAgICAgICAgICAgcGFyc2VQYXJhbWV0ZXJzKCk7CisKKyAgICAgICAgcmV0dXJuIGNveW90ZVJlcXVlc3QuZ2V0UGFyYW1ldGVycygpLmdldFBhcmFtZXRlck5hbWVzKCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZGVmaW5lZCB2YWx1ZXMgZm9yIHRoZSBzcGVjaWZpZWQgcmVxdWVzdCBwYXJhbWV0ZXIsIGlmIGFueTsKKyAgICAgKiBvdGhlcndpc2UsIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIGRlc2lyZWQgcmVxdWVzdCBwYXJhbWV0ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0UGFyYW1ldGVyVmFsdWVzKFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgaWYgKCFwYXJhbWV0ZXJzUGFyc2VkKQorICAgICAgICAgICAgcGFyc2VQYXJhbWV0ZXJzKCk7CisKKyAgICAgICAgcmV0dXJuIGNveW90ZVJlcXVlc3QuZ2V0UGFyYW1ldGVycygpLmdldFBhcmFtZXRlclZhbHVlcyhuYW1lKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBwcm90b2NvbCBhbmQgdmVyc2lvbiB1c2VkIHRvIG1ha2UgdGhpcyBSZXF1ZXN0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvdG9jb2woKSB7CisgICAgICAgIHJldHVybiBjb3lvdGVSZXF1ZXN0LnByb3RvY29sKCkudG9TdHJpbmcoKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlYWQgdGhlIFJlYWRlciB3cmFwcGluZyB0aGUgaW5wdXQgc3RyZWFtIGZvciB0aGlzIFJlcXVlc3QuICBUaGUKKyAgICAgKiBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHdyYXBzIGEgPGNvZGU+QnVmZmVyZWRSZWFkZXI8L2NvZGU+IGFyb3VuZCB0aGUKKyAgICAgKiBzZXJ2bGV0IGlucHV0IHN0cmVhbSByZXR1cm5lZCBieSA8Y29kZT5jcmVhdGVJbnB1dFN0cmVhbSgpPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIDxjb2RlPmdldElucHV0U3RyZWFtKCk8L2NvZGU+CisgICAgICogIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkIGZvciB0aGlzIHJlcXVlc3QKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgQnVmZmVyZWRSZWFkZXIgZ2V0UmVhZGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAodXNpbmdJbnB1dFN0cmVhbSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJjb3lvdGVSZXF1ZXN0LmdldFJlYWRlci5pc2UiKSk7CisKKyAgICAgICAgdXNpbmdSZWFkZXIgPSB0cnVlOworICAgICAgICBpbnB1dEJ1ZmZlci5jaGVja0NvbnZlcnRlcigpOworICAgICAgICBpZiAocmVhZGVyID09IG51bGwpIHsKKyAgICAgICAgICAgIHJlYWRlciA9IG5ldyBDb3lvdGVSZWFkZXIoaW5wdXRCdWZmZXIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZWFkZXI7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcmVhbCBwYXRoIG9mIHRoZSBzcGVjaWZpZWQgdmlydHVhbCBwYXRoLgorICAgICAqCisgICAgICogQHBhcmFtIHBhdGggUGF0aCB0byBiZSB0cmFuc2xhdGVkCisgICAgICoKKyAgICAgKiBAZGVwcmVjYXRlZCBBcyBvZiB2ZXJzaW9uIDIuMSBvZiB0aGUgSmF2YSBTZXJ2bGV0IEFQSSwgdXNlCisgICAgICogIDxjb2RlPlNlcnZsZXRDb250ZXh0LmdldFJlYWxQYXRoKCk8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVhbFBhdGgoU3RyaW5nIHBhdGgpIHsKKworICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgU2VydmxldENvbnRleHQgc2VydmxldENvbnRleHQgPSBjb250ZXh0LmdldFNlcnZsZXRDb250ZXh0KCk7CisgICAgICAgIGlmIChzZXJ2bGV0Q29udGV4dCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiAoc2VydmxldENvbnRleHQuZ2V0UmVhbFBhdGgocGF0aCkpOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcmVtb3RlIElQIGFkZHJlc3MgbWFraW5nIHRoaXMgUmVxdWVzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlbW90ZUFkZHIoKSB7CisgICAgICAgIGlmIChyZW1vdGVBZGRyID09IG51bGwpIHsKKyAgICAgICAgICAgIGNveW90ZVJlcXVlc3QuYWN0aW9uCisgICAgICAgICAgICAgICAgKEFjdGlvbkNvZGUuQUNUSU9OX1JFUV9IT1NUX0FERFJfQVRUUklCVVRFLCBjb3lvdGVSZXF1ZXN0KTsKKyAgICAgICAgICAgIHJlbW90ZUFkZHIgPSBjb3lvdGVSZXF1ZXN0LnJlbW90ZUFkZHIoKS50b1N0cmluZygpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZW1vdGVBZGRyOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSByZW1vdGUgaG9zdCBuYW1lIG1ha2luZyB0aGlzIFJlcXVlc3QuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRSZW1vdGVIb3N0KCkgeworICAgICAgICBpZiAocmVtb3RlSG9zdCA9PSBudWxsKSB7CisgICAgICAgICAgICBpZiAoIWNvbm5lY3Rvci5nZXRFbmFibGVMb29rdXBzKCkpIHsKKyAgICAgICAgICAgICAgICByZW1vdGVIb3N0ID0gZ2V0UmVtb3RlQWRkcigpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjb3lvdGVSZXF1ZXN0LmFjdGlvbgorICAgICAgICAgICAgICAgICAgICAoQWN0aW9uQ29kZS5BQ1RJT05fUkVRX0hPU1RfQVRUUklCVVRFLCBjb3lvdGVSZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICByZW1vdGVIb3N0ID0gY295b3RlUmVxdWVzdC5yZW1vdGVIb3N0KCkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVtb3RlSG9zdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBJbnRlcm5ldCBQcm90b2NvbCAoSVApIHNvdXJjZSBwb3J0IG9mIHRoZSBjbGllbnQKKyAgICAgKiBvciBsYXN0IHByb3h5IHRoYXQgc2VudCB0aGUgcmVxdWVzdC4KKyAgICAgKi8gICAgCisgICAgcHVibGljIGludCBnZXRSZW1vdGVQb3J0KCl7CisgICAgICAgIGlmIChyZW1vdGVQb3J0ID09IC0xKSB7CisgICAgICAgICAgICBjb3lvdGVSZXF1ZXN0LmFjdGlvbgorICAgICAgICAgICAgICAgIChBY3Rpb25Db2RlLkFDVElPTl9SRVFfUkVNT1RFUE9SVF9BVFRSSUJVVEUsIGNveW90ZVJlcXVlc3QpOworICAgICAgICAgICAgcmVtb3RlUG9ydCA9IGNveW90ZVJlcXVlc3QuZ2V0UmVtb3RlUG9ydCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZW1vdGVQb3J0OyAgICAKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBob3N0IG5hbWUgb2YgdGhlIEludGVybmV0IFByb3RvY29sIChJUCkgaW50ZXJmYWNlIG9uCisgICAgICogd2hpY2ggdGhlIHJlcXVlc3Qgd2FzIHJlY2VpdmVkLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxOYW1lKCl7CisgICAgICAgIGlmIChsb2NhbE5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgY295b3RlUmVxdWVzdC5hY3Rpb24KKyAgICAgICAgICAgICAgICAoQWN0aW9uQ29kZS5BQ1RJT05fUkVRX0xPQ0FMX05BTUVfQVRUUklCVVRFLCBjb3lvdGVSZXF1ZXN0KTsKKyAgICAgICAgICAgIGxvY2FsTmFtZSA9IGNveW90ZVJlcXVlc3QubG9jYWxOYW1lKCkudG9TdHJpbmcoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbG9jYWxOYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIEludGVybmV0IFByb3RvY29sIChJUCkgYWRkcmVzcyBvZiB0aGUgaW50ZXJmYWNlIG9uCisgICAgICogd2hpY2ggdGhlIHJlcXVlc3QgIHdhcyByZWNlaXZlZC4KKyAgICAgKi8gICAgICAgCisgICAgcHVibGljIFN0cmluZyBnZXRMb2NhbEFkZHIoKXsKKyAgICAgICAgaWYgKGxvY2FsQWRkciA9PSBudWxsKSB7CisgICAgICAgICAgICBjb3lvdGVSZXF1ZXN0LmFjdGlvbgorICAgICAgICAgICAgICAgIChBY3Rpb25Db2RlLkFDVElPTl9SRVFfTE9DQUxfQUREUl9BVFRSSUJVVEUsIGNveW90ZVJlcXVlc3QpOworICAgICAgICAgICAgbG9jYWxBZGRyID0gY295b3RlUmVxdWVzdC5sb2NhbEFkZHIoKS50b1N0cmluZygpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBsb2NhbEFkZHI7ICAgIAorICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgSW50ZXJuZXQgUHJvdG9jb2wgKElQKSBwb3J0IG51bWJlciBvZiB0aGUgaW50ZXJmYWNlCisgICAgICogb24gd2hpY2ggdGhlIHJlcXVlc3Qgd2FzIHJlY2VpdmVkLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0TG9jYWxQb3J0KCl7CisgICAgICAgIGlmIChsb2NhbFBvcnQgPT0gLTEpeworICAgICAgICAgICAgY295b3RlUmVxdWVzdC5hY3Rpb24KKyAgICAgICAgICAgICAgICAoQWN0aW9uQ29kZS5BQ1RJT05fUkVRX0xPQ0FMUE9SVF9BVFRSSUJVVEUsIGNveW90ZVJlcXVlc3QpOworICAgICAgICAgICAgbG9jYWxQb3J0ID0gY295b3RlUmVxdWVzdC5nZXRMb2NhbFBvcnQoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbG9jYWxQb3J0OworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBSZXF1ZXN0RGlzcGF0Y2hlciB0aGF0IHdyYXBzIHRoZSByZXNvdXJjZSBhdCB0aGUgc3BlY2lmaWVkCisgICAgICogcGF0aCwgd2hpY2ggbWF5IGJlIGludGVycHJldGVkIGFzIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHJlcXVlc3QgcGF0aC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXRoIFBhdGggb2YgdGhlIHJlc291cmNlIHRvIGJlIHdyYXBwZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgUmVxdWVzdERpc3BhdGNoZXIgZ2V0UmVxdWVzdERpc3BhdGNoZXIoU3RyaW5nIHBhdGgpIHsKKworICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKworICAgICAgICAvLyBJZiB0aGUgcGF0aCBpcyBhbHJlYWR5IGNvbnRleHQtcmVsYXRpdmUsIGp1c3QgcGFzcyBpdCB0aHJvdWdoCisgICAgICAgIGlmIChwYXRoID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICBlbHNlIGlmIChwYXRoLnN0YXJ0c1dpdGgoIi8iKSkKKyAgICAgICAgICAgIHJldHVybiAoY29udGV4dC5nZXRTZXJ2bGV0Q29udGV4dCgpLmdldFJlcXVlc3REaXNwYXRjaGVyKHBhdGgpKTsKKworICAgICAgICAvLyBDb252ZXJ0IGEgcmVxdWVzdC1yZWxhdGl2ZSBwYXRoIHRvIGEgY29udGV4dC1yZWxhdGl2ZSBvbmUKKyAgICAgICAgU3RyaW5nIHNlcnZsZXRQYXRoID0gKFN0cmluZykgZ2V0QXR0cmlidXRlKEdsb2JhbHMuSU5DTFVERV9TRVJWTEVUX1BBVEhfQVRUUik7CisgICAgICAgIGlmIChzZXJ2bGV0UGF0aCA9PSBudWxsKQorICAgICAgICAgICAgc2VydmxldFBhdGggPSBnZXRTZXJ2bGV0UGF0aCgpOworCisgICAgICAgIC8vIEFkZCB0aGUgcGF0aCBpbmZvLCBpZiB0aGVyZSBpcyBhbnkKKyAgICAgICAgU3RyaW5nIHBhdGhJbmZvID0gZ2V0UGF0aEluZm8oKTsKKyAgICAgICAgU3RyaW5nIHJlcXVlc3RQYXRoID0gbnVsbDsKKworICAgICAgICBpZiAocGF0aEluZm8gPT0gbnVsbCkgeworICAgICAgICAgICAgcmVxdWVzdFBhdGggPSBzZXJ2bGV0UGF0aDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlcXVlc3RQYXRoID0gc2VydmxldFBhdGggKyBwYXRoSW5mbzsKKyAgICAgICAgfQorCisgICAgICAgIGludCBwb3MgPSByZXF1ZXN0UGF0aC5sYXN0SW5kZXhPZignLycpOworICAgICAgICBTdHJpbmcgcmVsYXRpdmUgPSBudWxsOworICAgICAgICBpZiAocG9zID49IDApIHsKKyAgICAgICAgICAgIHJlbGF0aXZlID0gUmVxdWVzdFV0aWwubm9ybWFsaXplCisgICAgICAgICAgICAgICAgKHJlcXVlc3RQYXRoLnN1YnN0cmluZygwLCBwb3MgKyAxKSArIHBhdGgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVsYXRpdmUgPSBSZXF1ZXN0VXRpbC5ub3JtYWxpemUocmVxdWVzdFBhdGggKyBwYXRoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAoY29udGV4dC5nZXRTZXJ2bGV0Q29udGV4dCgpLmdldFJlcXVlc3REaXNwYXRjaGVyKHJlbGF0aXZlKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2NoZW1lIHVzZWQgdG8gbWFrZSB0aGlzIFJlcXVlc3QuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTY2hlbWUoKSB7CisgICAgICAgIHJldHVybiAoY295b3RlUmVxdWVzdC5zY2hlbWUoKS50b1N0cmluZygpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2VydmVyIG5hbWUgcmVzcG9uZGluZyB0byB0aGlzIFJlcXVlc3QuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTZXJ2ZXJOYW1lKCkgeworICAgICAgICByZXR1cm4gKGNveW90ZVJlcXVlc3Quc2VydmVyTmFtZSgpLnRvU3RyaW5nKCkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXJ2ZXIgcG9ydCByZXNwb25kaW5nIHRvIHRoaXMgUmVxdWVzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFNlcnZlclBvcnQoKSB7CisgICAgICAgIHJldHVybiAoY295b3RlUmVxdWVzdC5nZXRTZXJ2ZXJQb3J0KCkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogV2FzIHRoaXMgcmVxdWVzdCByZWNlaXZlZCBvbiBhIHNlY3VyZSBjb25uZWN0aW9uPworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzU2VjdXJlKCkgeworICAgICAgICByZXR1cm4gKHNlY3VyZSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCByZXF1ZXN0IGF0dHJpYnV0ZSBpZiBpdCBleGlzdHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSByZXF1ZXN0IGF0dHJpYnV0ZSB0byByZW1vdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgT2JqZWN0IHZhbHVlID0gbnVsbDsKKyAgICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOworCisgICAgICAgIC8vIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZQorICAgICAgICAvLyBDaGVjayBmb3IgcmVhZCBvbmx5IGF0dHJpYnV0ZQorICAgICAgICAvLyByZXF1ZXN0cyBhcmUgcGVyIHRocmVhZCBzbyBzeW5jaHJvbml6YXRpb24gdW5uZWNlc3NhcnkKKyAgICAgICAgaWYgKHJlYWRPbmx5QXR0cmlidXRlcy5jb250YWluc0tleShuYW1lKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZvdW5kID0gYXR0cmlidXRlcy5jb250YWluc0tleShuYW1lKTsKKyAgICAgICAgaWYgKGZvdW5kKSB7CisgICAgICAgICAgICB2YWx1ZSA9IGF0dHJpYnV0ZXMuZ2V0KG5hbWUpOworICAgICAgICAgICAgYXR0cmlidXRlcy5yZW1vdmUobmFtZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBOb3RpZnkgaW50ZXJlc3RlZCBhcHBsaWNhdGlvbiBldmVudCBsaXN0ZW5lcnMKKyAgICAgICAgT2JqZWN0IGxpc3RlbmVyc1tdID0gY29udGV4dC5nZXRBcHBsaWNhdGlvbkV2ZW50TGlzdGVuZXJzKCk7CisgICAgICAgIGlmICgobGlzdGVuZXJzID09IG51bGwpIHx8IChsaXN0ZW5lcnMubGVuZ3RoID09IDApKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZUV2ZW50IGV2ZW50ID0KKyAgICAgICAgICBuZXcgU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVFdmVudChjb250ZXh0LmdldFNlcnZsZXRDb250ZXh0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UmVxdWVzdCgpLCBuYW1lLCB2YWx1ZSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoIShsaXN0ZW5lcnNbaV0gaW5zdGFuY2VvZiBTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZUxpc3RlbmVyKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIFNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlTGlzdGVuZXIgbGlzdGVuZXIgPQorICAgICAgICAgICAgICAgIChTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZUxpc3RlbmVyKSBsaXN0ZW5lcnNbaV07CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGxpc3RlbmVyLmF0dHJpYnV0ZVJlbW92ZWQoZXZlbnQpOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICBjb250ZXh0LmdldExvZ2dlcigpLmVycm9yKHNtLmdldFN0cmluZygiY295b3RlUmVxdWVzdC5hdHRyaWJ1dGVFdmVudCIpLCB0KTsKKyAgICAgICAgICAgICAgICAvLyBFcnJvciB2YWx2ZSB3aWxsIHBpY2sgdGhpcyBleGVjcHRpb24gdXAgYW5kIGRpc3BsYXkgaXQgdG8gdXNlcgorICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMucHV0KCBHbG9iYWxzLkVYQ0VQVElPTl9BVFRSLCB0ICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgc3BlY2lmaWVkIHJlcXVlc3QgYXR0cmlidXRlIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSByZXF1ZXN0IGF0dHJpYnV0ZSB0byBzZXQKKyAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIGFzc29jaWF0ZWQgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgeworCQorICAgICAgICAvLyBOYW1lIGNhbm5vdCBiZSBudWxsCisgICAgICAgIGlmIChuYW1lID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygiY295b3RlUmVxdWVzdC5zZXRBdHRyaWJ1dGUubmFtZW51bGwiKSk7CisKKyAgICAgICAgLy8gTnVsbCB2YWx1ZSBpcyB0aGUgc2FtZSBhcyByZW1vdmVBdHRyaWJ1dGUoKQorICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgcmVtb3ZlQXR0cmlidXRlKG5hbWUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG5hbWUuZXF1YWxzKEdsb2JhbHMuRElTUEFUQ0hFUl9UWVBFX0FUVFIpKSB7CisgICAgICAgICAgICBkaXNwYXRjaGVyVHlwZSA9IHZhbHVlOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKEdsb2JhbHMuRElTUEFUQ0hFUl9SRVFVRVNUX1BBVEhfQVRUUikpIHsKKyAgICAgICAgICAgIHJlcXVlc3REaXNwYXRjaGVyUGF0aCA9IHZhbHVlOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgT2JqZWN0IG9sZFZhbHVlID0gbnVsbDsKKyAgICAgICAgYm9vbGVhbiByZXBsYWNlZCA9IGZhbHNlOworCisgICAgICAgIC8vIEFkZCBvciByZXBsYWNlIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlCisgICAgICAgIC8vIENoZWNrIGZvciByZWFkIG9ubHkgYXR0cmlidXRlCisgICAgICAgIC8vIHJlcXVlc3RzIGFyZSBwZXIgdGhyZWFkIHNvIHN5bmNocm9uaXphdGlvbiB1bm5lY2Vzc2FyeQorICAgICAgICBpZiAocmVhZE9ubHlBdHRyaWJ1dGVzLmNvbnRhaW5zS2V5KG5hbWUpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBvbGRWYWx1ZSA9IGF0dHJpYnV0ZXMucHV0KG5hbWUsIHZhbHVlKTsKKyAgICAgICAgaWYgKG9sZFZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJlcGxhY2VkID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE5vdGlmeSBpbnRlcmVzdGVkIGFwcGxpY2F0aW9uIGV2ZW50IGxpc3RlbmVycworICAgICAgICBPYmplY3QgbGlzdGVuZXJzW10gPSBjb250ZXh0LmdldEFwcGxpY2F0aW9uRXZlbnRMaXN0ZW5lcnMoKTsKKyAgICAgICAgaWYgKChsaXN0ZW5lcnMgPT0gbnVsbCkgfHwgKGxpc3RlbmVycy5sZW5ndGggPT0gMCkpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIFNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlRXZlbnQgZXZlbnQgPSBudWxsOworICAgICAgICBpZiAocmVwbGFjZWQpCisgICAgICAgICAgICBldmVudCA9CisgICAgICAgICAgICAgICAgbmV3IFNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlRXZlbnQoY29udGV4dC5nZXRTZXJ2bGV0Q29udGV4dCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFJlcXVlc3QoKSwgbmFtZSwgb2xkVmFsdWUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBldmVudCA9CisgICAgICAgICAgICAgICAgbmV3IFNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlRXZlbnQoY29udGV4dC5nZXRTZXJ2bGV0Q29udGV4dCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFJlcXVlc3QoKSwgbmFtZSwgdmFsdWUpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoIShsaXN0ZW5lcnNbaV0gaW5zdGFuY2VvZiBTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZUxpc3RlbmVyKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIFNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlTGlzdGVuZXIgbGlzdGVuZXIgPQorICAgICAgICAgICAgICAgIChTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZUxpc3RlbmVyKSBsaXN0ZW5lcnNbaV07CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmIChyZXBsYWNlZCkgeworICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5hdHRyaWJ1dGVSZXBsYWNlZChldmVudCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIuYXR0cmlidXRlQWRkZWQoZXZlbnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgY29udGV4dC5nZXRMb2dnZXIoKS5lcnJvcihzbS5nZXRTdHJpbmcoImNveW90ZVJlcXVlc3QuYXR0cmlidXRlRXZlbnQiKSwgdCk7CisgICAgICAgICAgICAgICAgLy8gRXJyb3IgdmFsdmUgd2lsbCBwaWNrIHRoaXMgZXhlY3B0aW9uIHVwIGFuZCBkaXNwbGF5IGl0IHRvIHVzZXIKKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLnB1dCggR2xvYmFscy5FWENFUFRJT05fQVRUUiwgdCApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBPdmVycmlkZXMgdGhlIG5hbWUgb2YgdGhlIGNoYXJhY3RlciBlbmNvZGluZyB1c2VkIGluIHRoZSBib2R5IG9mCisgICAgICogdGhpcyByZXF1ZXN0LiAgVGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQgcHJpb3IgdG8gcmVhZGluZyByZXF1ZXN0CisgICAgICogcGFyYW1ldGVycyBvciByZWFkaW5nIGlucHV0IHVzaW5nIDxjb2RlPmdldFJlYWRlcigpPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbmMgVGhlIGNoYXJhY3RlciBlbmNvZGluZyB0byBiZSB1c2VkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gaWYgdGhlIHNwZWNpZmllZCBlbmNvZGluZworICAgICAqICBpcyBub3Qgc3VwcG9ydGVkCisgICAgICoKKyAgICAgKiBAc2luY2UgU2VydmxldCAyLjMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDaGFyYWN0ZXJFbmNvZGluZyhTdHJpbmcgZW5jKQorICAgICAgICB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gRW5zdXJlIHRoYXQgdGhlIHNwZWNpZmllZCBlbmNvZGluZyBpcyB2YWxpZAorICAgICAgICBieXRlIGJ1ZmZlcltdID0gbmV3IGJ5dGVbMV07CisgICAgICAgIGJ1ZmZlclswXSA9IChieXRlKSAnYSc7CisgICAgICAgIFN0cmluZyBkdW1teSA9IG5ldyBTdHJpbmcoYnVmZmVyLCBlbmMpOworCisgICAgICAgIC8vIFNhdmUgdGhlIHZhbGlkYXRlZCBlbmNvZGluZworICAgICAgICBjb3lvdGVSZXF1ZXN0LnNldENoYXJhY3RlckVuY29kaW5nKGVuYyk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSHR0cFJlcXVlc3QgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBDb29raWUgdG8gdGhlIHNldCBvZiBDb29raWVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFJlcXVlc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29va2llIFRoZSBuZXcgY29va2llCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQ29va2llKENvb2tpZSBjb29raWUpIHsKKworICAgICAgICBpZiAoIWNvb2tpZXNQYXJzZWQpCisgICAgICAgICAgICBwYXJzZUNvb2tpZXMoKTsKKworICAgICAgICBpbnQgc2l6ZSA9IDA7CisgICAgICAgIGlmIChjb29raWVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNpemUgPSBjb29raWVzLmxlbmd0aDsKKyAgICAgICAgfQorCisgICAgICAgIENvb2tpZVtdIG5ld0Nvb2tpZXMgPSBuZXcgQ29va2llW3NpemUgKyAxXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgIG5ld0Nvb2tpZXNbaV0gPSBjb29raWVzW2ldOworICAgICAgICB9CisgICAgICAgIG5ld0Nvb2tpZXNbc2l6ZV0gPSBjb29raWU7CisKKyAgICAgICAgY29va2llcyA9IG5ld0Nvb2tpZXM7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEFkZCBhIEhlYWRlciB0byB0aGUgc2V0IG9mIEhlYWRlcnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgUmVxdWVzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuZXcgaGVhZGVyIG5hbWUKKyAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyBoZWFkZXIgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRIZWFkZXIoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICAvLyBOb3QgdXNlZAorICAgIH0KKworCisgICAgLyoqCisgICAgICogQWRkIGEgTG9jYWxlIHRvIHRoZSBzZXQgb2YgcHJlZmVycmVkIExvY2FsZXMgZm9yIHRoaXMgUmVxdWVzdC4gIFRoZQorICAgICAqIGZpcnN0IGFkZGVkIExvY2FsZSB3aWxsIGJlIHRoZSBmaXJzdCBvbmUgcmV0dXJuZWQgYnkgZ2V0TG9jYWxlcygpLgorICAgICAqCisgICAgICogQHBhcmFtIGxvY2FsZSBUaGUgbmV3IHByZWZlcnJlZCBMb2NhbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRMb2NhbGUoTG9jYWxlIGxvY2FsZSkgeworICAgICAgICBsb2NhbGVzLmFkZChsb2NhbGUpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQWRkIGEgcGFyYW1ldGVyIG5hbWUgYW5kIGNvcnJlc3BvbmRpbmcgc2V0IG9mIHZhbHVlcyB0byB0aGlzIFJlcXVlc3QuCisgICAgICogKFRoaXMgaXMgdXNlZCB3aGVuIHJlc3RvcmluZyB0aGUgb3JpZ2luYWwgcmVxdWVzdCBvbiBhIGZvcm0gYmFzZWQKKyAgICAgKiBsb2dpbikuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoaXMgcmVxdWVzdCBwYXJhbWV0ZXIKKyAgICAgKiBAcGFyYW0gdmFsdWVzIENvcnJlc3BvbmRpbmcgdmFsdWVzIGZvciB0aGlzIHJlcXVlc3QgcGFyYW1ldGVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkUGFyYW1ldGVyKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWVzW10pIHsKKyAgICAgICAgY295b3RlUmVxdWVzdC5nZXRQYXJhbWV0ZXJzKCkuYWRkUGFyYW1ldGVyVmFsdWVzKG5hbWUsIHZhbHVlcyk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDbGVhciB0aGUgY29sbGVjdGlvbiBvZiBDb29raWVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFJlcXVlc3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xlYXJDb29raWVzKCkgeworICAgICAgICBjb29raWVzUGFyc2VkID0gdHJ1ZTsKKyAgICAgICAgY29va2llcyA9IG51bGw7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDbGVhciB0aGUgY29sbGVjdGlvbiBvZiBIZWFkZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFJlcXVlc3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xlYXJIZWFkZXJzKCkgeworICAgICAgICAvLyBOb3QgdXNlZAorICAgIH0KKworCisgICAgLyoqCisgICAgICogQ2xlYXIgdGhlIGNvbGxlY3Rpb24gb2YgTG9jYWxlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBSZXF1ZXN0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsZWFyTG9jYWxlcygpIHsKKyAgICAgICAgbG9jYWxlcy5jbGVhcigpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ2xlYXIgdGhlIGNvbGxlY3Rpb24gb2YgcGFyYW1ldGVycyBhc3NvY2lhdGVkIHdpdGggdGhpcyBSZXF1ZXN0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsZWFyUGFyYW1ldGVycygpIHsKKyAgICAgICAgLy8gTm90IHVzZWQKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYXV0aGVudGljYXRpb24gdHlwZSB1c2VkIGZvciB0aGlzIHJlcXVlc3QsIGlmIGFueTsgb3RoZXJ3aXNlCisgICAgICogc2V0IHRoZSB0eXBlIHRvIDxjb2RlPm51bGw8L2NvZGU+LiAgVHlwaWNhbCB2YWx1ZXMgYXJlICJCQVNJQyIsCisgICAgICogIkRJR0VTVCIsIG9yICJTU0wiLgorICAgICAqCisgICAgICogQHBhcmFtIHR5cGUgVGhlIGF1dGhlbnRpY2F0aW9uIHR5cGUgdXNlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEF1dGhUeXBlKFN0cmluZyB0eXBlKSB7CisgICAgICAgIHRoaXMuYXV0aFR5cGUgPSB0eXBlOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjb250ZXh0IHBhdGggZm9yIHRoaXMgUmVxdWVzdC4gIFRoaXMgd2lsbCBub3JtYWxseSBiZSBjYWxsZWQKKyAgICAgKiB3aGVuIHRoZSBhc3NvY2lhdGVkIENvbnRleHQgaXMgbWFwcGluZyB0aGUgUmVxdWVzdCB0byBhIHBhcnRpY3VsYXIKKyAgICAgKiBXcmFwcGVyLgorICAgICAqCisgICAgICogQHBhcmFtIHBhdGggVGhlIGNvbnRleHQgcGF0aAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbnRleHRQYXRoKFN0cmluZyBwYXRoKSB7CisKKyAgICAgICAgaWYgKHBhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgbWFwcGluZ0RhdGEuY29udGV4dFBhdGguc2V0U3RyaW5nKCIiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1hcHBpbmdEYXRhLmNvbnRleHRQYXRoLnNldFN0cmluZyhwYXRoKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIEhUVFAgcmVxdWVzdCBtZXRob2QgdXNlZCBmb3IgdGhpcyBSZXF1ZXN0LgorICAgICAqCisgICAgICogQHBhcmFtIG1ldGhvZCBUaGUgcmVxdWVzdCBtZXRob2QKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNZXRob2QoU3RyaW5nIG1ldGhvZCkgeworICAgICAgICAvLyBOb3QgdXNlZAorICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBxdWVyeSBzdHJpbmcgZm9yIHRoaXMgUmVxdWVzdC4gIFRoaXMgd2lsbCBub3JtYWxseSBiZSBjYWxsZWQKKyAgICAgKiBieSB0aGUgSFRUUCBDb25uZWN0b3IsIHdoZW4gaXQgcGFyc2VzIHRoZSByZXF1ZXN0IGhlYWRlcnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcXVlcnkgVGhlIHF1ZXJ5IHN0cmluZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFF1ZXJ5U3RyaW5nKFN0cmluZyBxdWVyeSkgeworICAgICAgICAvLyBOb3QgdXNlZAorICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBwYXRoIGluZm9ybWF0aW9uIGZvciB0aGlzIFJlcXVlc3QuICBUaGlzIHdpbGwgbm9ybWFsbHkgYmUgY2FsbGVkCisgICAgICogd2hlbiB0aGUgYXNzb2NpYXRlZCBDb250ZXh0IGlzIG1hcHBpbmcgdGhlIFJlcXVlc3QgdG8gYSBwYXJ0aWN1bGFyCisgICAgICogV3JhcHBlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXRoIFRoZSBwYXRoIGluZm9ybWF0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGF0aEluZm8oU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgbWFwcGluZ0RhdGEucGF0aEluZm8uc2V0U3RyaW5nKHBhdGgpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IGEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHRoZSByZXF1ZXN0ZWQgc2Vzc2lvbiBJRCBmb3IgdGhpcworICAgICAqIHJlcXVlc3QgY2FtZSBpbiB0aHJvdWdoIGEgY29va2llLiAgVGhpcyBpcyBub3JtYWxseSBjYWxsZWQgYnkgdGhlCisgICAgICogSFRUUCBDb25uZWN0b3IsIHdoZW4gaXQgcGFyc2VzIHRoZSByZXF1ZXN0IGhlYWRlcnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmxhZyBUaGUgbmV3IGZsYWcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZXF1ZXN0ZWRTZXNzaW9uQ29va2llKGJvb2xlYW4gZmxhZykgeworCisgICAgICAgIHRoaXMucmVxdWVzdGVkU2Vzc2lvbkNvb2tpZSA9IGZsYWc7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcmVxdWVzdGVkIHNlc3Npb24gSUQgZm9yIHRoaXMgcmVxdWVzdC4gIFRoaXMgaXMgbm9ybWFsbHkgY2FsbGVkCisgICAgICogYnkgdGhlIEhUVFAgQ29ubmVjdG9yLCB3aGVuIGl0IHBhcnNlcyB0aGUgcmVxdWVzdCBoZWFkZXJzLgorICAgICAqCisgICAgICogQHBhcmFtIGlkIFRoZSBuZXcgc2Vzc2lvbiBpZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlcXVlc3RlZFNlc3Npb25JZChTdHJpbmcgaWQpIHsKKworICAgICAgICB0aGlzLnJlcXVlc3RlZFNlc3Npb25JZCA9IGlkOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgYSBmbGFnIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgdGhlIHJlcXVlc3RlZCBzZXNzaW9uIElEIGZvciB0aGlzCisgICAgICogcmVxdWVzdCBjYW1lIGluIHRocm91Z2ggYSBVUkwuICBUaGlzIGlzIG5vcm1hbGx5IGNhbGxlZCBieSB0aGUKKyAgICAgKiBIVFRQIENvbm5lY3Rvciwgd2hlbiBpdCBwYXJzZXMgdGhlIHJlcXVlc3QgaGVhZGVycy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmbGFnIFRoZSBuZXcgZmxhZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlcXVlc3RlZFNlc3Npb25VUkwoYm9vbGVhbiBmbGFnKSB7CisKKyAgICAgICAgdGhpcy5yZXF1ZXN0ZWRTZXNzaW9uVVJMID0gZmxhZzsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSB1bnBhcnNlZCByZXF1ZXN0IFVSSSBmb3IgdGhpcyBSZXF1ZXN0LiAgVGhpcyB3aWxsIG5vcm1hbGx5IGJlCisgICAgICogY2FsbGVkIGJ5IHRoZSBIVFRQIENvbm5lY3Rvciwgd2hlbiBpdCBwYXJzZXMgdGhlIHJlcXVlc3QgaGVhZGVycy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmkgVGhlIHJlcXVlc3QgVVJJCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVxdWVzdFVSSShTdHJpbmcgdXJpKSB7CisgICAgICAgIC8vIE5vdCB1c2VkCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGRlY29kZWQgcmVxdWVzdCBVUkkuCisgICAgICogCisgICAgICogQHBhcmFtIHVyaSBUaGUgZGVjb2RlZCByZXF1ZXN0IFVSSQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERlY29kZWRSZXF1ZXN0VVJJKFN0cmluZyB1cmkpIHsKKyAgICAgICAgLy8gTm90IHVzZWQKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgZGVjb2RlZCByZXF1ZXN0IFVSSS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBVUkwgZGVjb2RlZCByZXF1ZXN0IFVSSQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVjb2RlZFJlcXVlc3RVUkkoKSB7CisgICAgICAgIHJldHVybiAoY295b3RlUmVxdWVzdC5kZWNvZGVkVVJJKCkudG9TdHJpbmcoKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGRlY29kZWQgcmVxdWVzdCBVUkkuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgVVJMIGRlY29kZWQgcmVxdWVzdCBVUkkKKyAgICAgKi8KKyAgICBwdWJsaWMgTWVzc2FnZUJ5dGVzIGdldERlY29kZWRSZXF1ZXN0VVJJTUIoKSB7CisgICAgICAgIHJldHVybiAoY295b3RlUmVxdWVzdC5kZWNvZGVkVVJJKCkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzZXJ2bGV0IHBhdGggZm9yIHRoaXMgUmVxdWVzdC4gIFRoaXMgd2lsbCBub3JtYWxseSBiZSBjYWxsZWQKKyAgICAgKiB3aGVuIHRoZSBhc3NvY2lhdGVkIENvbnRleHQgaXMgbWFwcGluZyB0aGUgUmVxdWVzdCB0byBhIHBhcnRpY3VsYXIKKyAgICAgKiBXcmFwcGVyLgorICAgICAqCisgICAgICogQHBhcmFtIHBhdGggVGhlIHNlcnZsZXQgcGF0aAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNlcnZsZXRQYXRoKFN0cmluZyBwYXRoKSB7CisgICAgICAgIGlmIChwYXRoICE9IG51bGwpCisgICAgICAgICAgICBtYXBwaW5nRGF0YS53cmFwcGVyUGF0aC5zZXRTdHJpbmcocGF0aCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIFByaW5jaXBhbCB3aG8gaGFzIGJlZW4gYXV0aGVudGljYXRlZCBmb3IgdGhpcyBSZXF1ZXN0LiAgVGhpcworICAgICAqIHZhbHVlIGlzIGFsc28gdXNlZCB0byBjYWxjdWxhdGUgdGhlIHZhbHVlIHRvIGJlIHJldHVybmVkIGJ5IHRoZQorICAgICAqIDxjb2RlPmdldFJlbW90ZVVzZXIoKTwvY29kZT4gbWV0aG9kLgorICAgICAqCisgICAgICogQHBhcmFtIHByaW5jaXBhbCBUaGUgdXNlciBQcmluY2lwYWwKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVc2VyUHJpbmNpcGFsKFByaW5jaXBhbCBwcmluY2lwYWwpIHsKKworICAgICAgICBpZiAoU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpICE9IG51bGwpeworICAgICAgICAgICAgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IGdldFNlc3Npb24oZmFsc2UpOworICAgICAgICAgICAgaWYgKCAoc3ViamVjdCAhPSBudWxsKSAmJiAKKyAgICAgICAgICAgICAgICAgKCFzdWJqZWN0LmdldFByaW5jaXBhbHMoKS5jb250YWlucyhwcmluY2lwYWwpKSApeworICAgICAgICAgICAgICAgIHN1YmplY3QuZ2V0UHJpbmNpcGFscygpLmFkZChwcmluY2lwYWwpOyAgICAgICAgIAorICAgICAgICAgICAgfSBlbHNlIGlmIChzZXNzaW9uICE9IG51bGwgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0QXR0cmlidXRlKEdsb2JhbHMuU1VCSkVDVF9BVFRSKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgc3ViamVjdCA9IG5ldyBTdWJqZWN0KCk7CisgICAgICAgICAgICAgICAgc3ViamVjdC5nZXRQcmluY2lwYWxzKCkuYWRkKHByaW5jaXBhbCk7ICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2Vzc2lvbiAhPSBudWxsKXsKKyAgICAgICAgICAgICAgICBzZXNzaW9uLnNldEF0dHJpYnV0ZShHbG9iYWxzLlNVQkpFQ1RfQVRUUiwgc3ViamVjdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gCisKKyAgICAgICAgdGhpcy51c2VyUHJpbmNpcGFsID0gcHJpbmNpcGFsOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEh0dHBTZXJ2bGV0UmVxdWVzdCBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgYXV0aGVudGljYXRpb24gdHlwZSB1c2VkIGZvciB0aGlzIFJlcXVlc3QuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRBdXRoVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIChhdXRoVHlwZSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHBvcnRpb24gb2YgdGhlIHJlcXVlc3QgVVJJIHVzZWQgdG8gc2VsZWN0IHRoZSBDb250ZXh0CisgICAgICogb2YgdGhlIFJlcXVlc3QuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDb250ZXh0UGF0aCgpIHsKKyAgICAgICAgcmV0dXJuIChtYXBwaW5nRGF0YS5jb250ZXh0UGF0aC50b1N0cmluZygpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgY29udGV4dCBwYXRoLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGNvbnRleHQgcGF0aAorICAgICAqLworICAgIHB1YmxpYyBNZXNzYWdlQnl0ZXMgZ2V0Q29udGV4dFBhdGhNQigpIHsKKyAgICAgICAgcmV0dXJuIChtYXBwaW5nRGF0YS5jb250ZXh0UGF0aCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNldCBvZiBDb29raWVzIHJlY2VpdmVkIHdpdGggdGhpcyBSZXF1ZXN0LgorICAgICAqLworICAgIHB1YmxpYyBDb29raWVbXSBnZXRDb29raWVzKCkgeworCisgICAgICAgIGlmICghY29va2llc1BhcnNlZCkKKyAgICAgICAgICAgIHBhcnNlQ29va2llcygpOworCisgICAgICAgIHJldHVybiBjb29raWVzOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHNldCBvZiBjb29raWVzIHJlY2lldmVkIHdpdGggdGhpcyBSZXF1ZXN0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvb2tpZXMoQ29va2llW10gY29va2llcykgeworCisgICAgICAgIHRoaXMuY29va2llcyA9IGNvb2tpZXM7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBkYXRlIGhlYWRlciwgaWYgYW55OyBvdGhlcndpc2UKKyAgICAgKiByZXR1cm4gLTEuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSByZXF1ZXN0ZWQgZGF0ZSBoZWFkZXIKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBzcGVjaWZpZWQgaGVhZGVyIHZhbHVlCisgICAgICogIGNhbm5vdCBiZSBjb252ZXJ0ZWQgdG8gYSBkYXRlCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0RGF0ZUhlYWRlcihTdHJpbmcgbmFtZSkgeworCisgICAgICAgIFN0cmluZyB2YWx1ZSA9IGdldEhlYWRlcihuYW1lKTsKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKC0xTCk7CisKKyAgICAgICAgLy8gQXR0ZW1wdCB0byBjb252ZXJ0IHRoZSBkYXRlIGhlYWRlciBpbiBhIHZhcmlldHkgb2YgZm9ybWF0cworICAgICAgICBsb25nIHJlc3VsdCA9IEZhc3RIdHRwRGF0ZUZvcm1hdC5wYXJzZURhdGUodmFsdWUsIGZvcm1hdHMpOworICAgICAgICBpZiAocmVzdWx0ICE9ICgtMUwpKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24odmFsdWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGZpcnN0IHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgaGVhZGVyLCBpZiBhbnk7IG90aGVyd2lzZSwKKyAgICAgKiByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIHJlcXVlc3RlZCBoZWFkZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEhlYWRlcihTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gY295b3RlUmVxdWVzdC5nZXRIZWFkZXIobmFtZSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYWxsIG9mIHRoZSB2YWx1ZXMgb2YgdGhlIHNwZWNpZmllZCBoZWFkZXIsIGlmIGFueTsgb3RoZXJ3aXNlLAorICAgICAqIHJldHVybiBhbiBlbXB0eSBlbnVtZXJhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIHJlcXVlc3RlZCBoZWFkZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0SGVhZGVycyhTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gY295b3RlUmVxdWVzdC5nZXRNaW1lSGVhZGVycygpLnZhbHVlcyhuYW1lKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbmFtZXMgb2YgYWxsIGhlYWRlcnMgcmVjZWl2ZWQgd2l0aCB0aGlzIHJlcXVlc3QuCisgICAgICovCisgICAgcHVibGljIEVudW1lcmF0aW9uIGdldEhlYWRlck5hbWVzKCkgeworICAgICAgICByZXR1cm4gY295b3RlUmVxdWVzdC5nZXRNaW1lSGVhZGVycygpLm5hbWVzKCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgaGVhZGVyIGFzIGFuIGludGVnZXIsIG9yIC0xIGlmIHRoZXJlCisgICAgICogaXMgbm8gc3VjaCBoZWFkZXIgZm9yIHRoaXMgcmVxdWVzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIHJlcXVlc3RlZCBoZWFkZXIKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBzcGVjaWZpZWQgaGVhZGVyIHZhbHVlCisgICAgICogIGNhbm5vdCBiZSBjb252ZXJ0ZWQgdG8gYW4gaW50ZWdlcgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0SW50SGVhZGVyKFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgU3RyaW5nIHZhbHVlID0gZ2V0SGVhZGVyKG5hbWUpOworICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuICgtMSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gKEludGVnZXIucGFyc2VJbnQodmFsdWUpKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIEhUVFAgcmVxdWVzdCBtZXRob2QgdXNlZCBpbiB0aGlzIFJlcXVlc3QuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRNZXRob2QoKSB7CisgICAgICAgIHJldHVybiBjb3lvdGVSZXF1ZXN0Lm1ldGhvZCgpLnRvU3RyaW5nKCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHBhdGggaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgUmVxdWVzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhdGhJbmZvKCkgeworICAgICAgICByZXR1cm4gKG1hcHBpbmdEYXRhLnBhdGhJbmZvLnRvU3RyaW5nKCkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBwYXRoIGluZm8uCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgcGF0aCBpbmZvCisgICAgICovCisgICAgcHVibGljIE1lc3NhZ2VCeXRlcyBnZXRQYXRoSW5mb01CKCkgeworICAgICAgICByZXR1cm4gKG1hcHBpbmdEYXRhLnBhdGhJbmZvKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZXh0cmEgcGF0aCBpbmZvcm1hdGlvbiBmb3IgdGhpcyByZXF1ZXN0LCB0cmFuc2xhdGVkCisgICAgICogdG8gYSByZWFsIHBhdGguCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRQYXRoVHJhbnNsYXRlZCgpIHsKKworICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKworICAgICAgICBpZiAoZ2V0UGF0aEluZm8oKSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIChjb250ZXh0LmdldFNlcnZsZXRDb250ZXh0KCkuZ2V0UmVhbFBhdGgoZ2V0UGF0aEluZm8oKSkpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcXVlcnkgc3RyaW5nIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJlcXVlc3QuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRRdWVyeVN0cmluZygpIHsKKyAgICAgICAgU3RyaW5nIHF1ZXJ5U3RyaW5nID0gY295b3RlUmVxdWVzdC5xdWVyeVN0cmluZygpLnRvU3RyaW5nKCk7CisgICAgICAgIGlmIChxdWVyeVN0cmluZyA9PSBudWxsIHx8IHF1ZXJ5U3RyaW5nLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gcXVlcnlTdHJpbmc7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgcmVtb3RlIHVzZXIgdGhhdCBoYXMgYmVlbiBhdXRoZW50aWNhdGVkCisgICAgICogZm9yIHRoaXMgUmVxdWVzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlbW90ZVVzZXIoKSB7CisKKyAgICAgICAgaWYgKHVzZXJQcmluY2lwYWwgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuICh1c2VyUHJpbmNpcGFsLmdldE5hbWUoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgcmVxdWVzdCBwYXRoLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHJlcXVlc3QgcGF0aAorICAgICAqLworICAgIHB1YmxpYyBNZXNzYWdlQnl0ZXMgZ2V0UmVxdWVzdFBhdGhNQigpIHsKKyAgICAgICAgcmV0dXJuIChtYXBwaW5nRGF0YS5yZXF1ZXN0UGF0aCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNlc3Npb24gaWRlbnRpZmllciBpbmNsdWRlZCBpbiB0aGlzIHJlcXVlc3QsIGlmIGFueS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlcXVlc3RlZFNlc3Npb25JZCgpIHsKKyAgICAgICAgcmV0dXJuIChyZXF1ZXN0ZWRTZXNzaW9uSWQpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSByZXF1ZXN0IFVSSSBmb3IgdGhpcyByZXF1ZXN0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVxdWVzdFVSSSgpIHsKKyAgICAgICAgcmV0dXJuIGNveW90ZVJlcXVlc3QucmVxdWVzdFVSSSgpLnRvU3RyaW5nKCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZWNvbnN0cnVjdHMgdGhlIFVSTCB0aGUgY2xpZW50IHVzZWQgdG8gbWFrZSB0aGUgcmVxdWVzdC4KKyAgICAgKiBUaGUgcmV0dXJuZWQgVVJMIGNvbnRhaW5zIGEgcHJvdG9jb2wsIHNlcnZlciBuYW1lLCBwb3J0CisgICAgICogbnVtYmVyLCBhbmQgc2VydmVyIHBhdGgsIGJ1dCBpdCBkb2VzIG5vdCBpbmNsdWRlIHF1ZXJ5CisgICAgICogc3RyaW5nIHBhcmFtZXRlcnMuCisgICAgICogPHA+CisgICAgICogQmVjYXVzZSB0aGlzIG1ldGhvZCByZXR1cm5zIGEgPGNvZGU+U3RyaW5nQnVmZmVyPC9jb2RlPiwKKyAgICAgKiBub3QgYSA8Y29kZT5TdHJpbmc8L2NvZGU+LCB5b3UgY2FuIG1vZGlmeSB0aGUgVVJMIGVhc2lseSwKKyAgICAgKiBmb3IgZXhhbXBsZSwgdG8gYXBwZW5kIHF1ZXJ5IHBhcmFtZXRlcnMuCisgICAgICogPHA+CisgICAgICogVGhpcyBtZXRob2QgaXMgdXNlZnVsIGZvciBjcmVhdGluZyByZWRpcmVjdCBtZXNzYWdlcyBhbmQKKyAgICAgKiBmb3IgcmVwb3J0aW5nIGVycm9ycy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gQSA8Y29kZT5TdHJpbmdCdWZmZXI8L2NvZGU+IG9iamVjdCBjb250YWluaW5nIHRoZQorICAgICAqICByZWNvbnN0cnVjdGVkIFVSTAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdCdWZmZXIgZ2V0UmVxdWVzdFVSTCgpIHsKKworICAgICAgICBTdHJpbmdCdWZmZXIgdXJsID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBTdHJpbmcgc2NoZW1lID0gZ2V0U2NoZW1lKCk7CisgICAgICAgIGludCBwb3J0ID0gZ2V0U2VydmVyUG9ydCgpOworICAgICAgICBpZiAocG9ydCA8IDApCisgICAgICAgICAgICBwb3J0ID0gODA7IC8vIFdvcmsgYXJvdW5kIGphdmEubmV0LlVSTCBidWcKKworICAgICAgICB1cmwuYXBwZW5kKHNjaGVtZSk7CisgICAgICAgIHVybC5hcHBlbmQoIjovLyIpOworICAgICAgICB1cmwuYXBwZW5kKGdldFNlcnZlck5hbWUoKSk7CisgICAgICAgIGlmICgoc2NoZW1lLmVxdWFscygiaHR0cCIpICYmIChwb3J0ICE9IDgwKSkKKyAgICAgICAgICAgIHx8IChzY2hlbWUuZXF1YWxzKCJodHRwcyIpICYmIChwb3J0ICE9IDQ0MykpKSB7CisgICAgICAgICAgICB1cmwuYXBwZW5kKCc6Jyk7CisgICAgICAgICAgICB1cmwuYXBwZW5kKHBvcnQpOworICAgICAgICB9CisgICAgICAgIHVybC5hcHBlbmQoZ2V0UmVxdWVzdFVSSSgpKTsKKworICAgICAgICByZXR1cm4gKHVybCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcG9ydGlvbiBvZiB0aGUgcmVxdWVzdCBVUkkgdXNlZCB0byBzZWxlY3QgdGhlIHNlcnZsZXQKKyAgICAgKiB0aGF0IHdpbGwgcHJvY2VzcyB0aGlzIHJlcXVlc3QuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTZXJ2bGV0UGF0aCgpIHsKKyAgICAgICAgcmV0dXJuIChtYXBwaW5nRGF0YS53cmFwcGVyUGF0aC50b1N0cmluZygpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgc2VydmxldCBwYXRoLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHNlcnZsZXQgcGF0aAorICAgICAqLworICAgIHB1YmxpYyBNZXNzYWdlQnl0ZXMgZ2V0U2VydmxldFBhdGhNQigpIHsKKyAgICAgICAgcmV0dXJuIChtYXBwaW5nRGF0YS53cmFwcGVyUGF0aCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNlc3Npb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgUmVxdWVzdCwgY3JlYXRpbmcgb25lCisgICAgICogaWYgbmVjZXNzYXJ5LgorICAgICAqLworICAgIHB1YmxpYyBIdHRwU2Vzc2lvbiBnZXRTZXNzaW9uKCkgeworICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSBkb0dldFNlc3Npb24odHJ1ZSk7CisgICAgICAgIGlmIChzZXNzaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBzZXNzaW9uLmdldFNlc3Npb24oKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNlc3Npb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgUmVxdWVzdCwgY3JlYXRpbmcgb25lCisgICAgICogaWYgbmVjZXNzYXJ5IGFuZCByZXF1ZXN0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY3JlYXRlIENyZWF0ZSBhIG5ldyBzZXNzaW9uIGlmIG9uZSBkb2VzIG5vdCBleGlzdAorICAgICAqLworICAgIHB1YmxpYyBIdHRwU2Vzc2lvbiBnZXRTZXNzaW9uKGJvb2xlYW4gY3JlYXRlKSB7CisgICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IGRvR2V0U2Vzc2lvbihjcmVhdGUpOworICAgICAgICBpZiAoc2Vzc2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gc2Vzc2lvbi5nZXRTZXNzaW9uKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzZXNzaW9uIGlkZW50aWZpZXIgaW5jbHVkZWQgaW4gdGhpcworICAgICAqIHJlcXVlc3QgY2FtZSBmcm9tIGEgY29va2llLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzUmVxdWVzdGVkU2Vzc2lvbklkRnJvbUNvb2tpZSgpIHsKKworICAgICAgICBpZiAocmVxdWVzdGVkU2Vzc2lvbklkICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKHJlcXVlc3RlZFNlc3Npb25Db29raWUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gKGZhbHNlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzZXNzaW9uIGlkZW50aWZpZXIgaW5jbHVkZWQgaW4gdGhpcworICAgICAqIHJlcXVlc3QgY2FtZSBmcm9tIHRoZSByZXF1ZXN0IFVSSS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JlcXVlc3RlZFNlc3Npb25JZEZyb21VUkwoKSB7CisKKyAgICAgICAgaWYgKHJlcXVlc3RlZFNlc3Npb25JZCAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChyZXF1ZXN0ZWRTZXNzaW9uVVJMKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIChmYWxzZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc2Vzc2lvbiBpZGVudGlmaWVyIGluY2x1ZGVkIGluIHRoaXMKKyAgICAgKiByZXF1ZXN0IGNhbWUgZnJvbSB0aGUgcmVxdWVzdCBVUkkuCisgICAgICoKKyAgICAgKiBAZGVwcmVjYXRlZCBBcyBvZiBWZXJzaW9uIDIuMSBvZiB0aGUgSmF2YSBTZXJ2bGV0IEFQSSwgdXNlCisgICAgICogIDxjb2RlPmlzUmVxdWVzdGVkU2Vzc2lvbklkRnJvbVVSTCgpPC9jb2RlPiBpbnN0ZWFkLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzUmVxdWVzdGVkU2Vzc2lvbklkRnJvbVVybCgpIHsKKyAgICAgICAgcmV0dXJuIChpc1JlcXVlc3RlZFNlc3Npb25JZEZyb21VUkwoKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNlc3Npb24gaWRlbnRpZmllciBpbmNsdWRlZCBpbiB0aGlzCisgICAgICogcmVxdWVzdCBpZGVudGlmaWVzIGEgdmFsaWQgc2Vzc2lvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JlcXVlc3RlZFNlc3Npb25JZFZhbGlkKCkgeworCisgICAgICAgIGlmIChyZXF1ZXN0ZWRTZXNzaW9uSWQgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAoZmFsc2UpOworICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChmYWxzZSk7CisgICAgICAgIE1hbmFnZXIgbWFuYWdlciA9IGNvbnRleHQuZ2V0TWFuYWdlcigpOworICAgICAgICBpZiAobWFuYWdlciA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChmYWxzZSk7CisgICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzZXNzaW9uID0gbWFuYWdlci5maW5kU2Vzc2lvbihyZXF1ZXN0ZWRTZXNzaW9uSWQpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBzZXNzaW9uID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHNlc3Npb24gIT0gbnVsbCkgJiYgc2Vzc2lvbi5pc1ZhbGlkKCkpCisgICAgICAgICAgICByZXR1cm4gKHRydWUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gKGZhbHNlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBhdXRoZW50aWNhdGVkIHVzZXIgcHJpbmNpcGFsCisgICAgICogcG9zc2Vzc2VzIHRoZSBzcGVjaWZpZWQgcm9sZSBuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIHJvbGUgUm9sZSBuYW1lIHRvIGJlIHZhbGlkYXRlZAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzVXNlckluUm9sZShTdHJpbmcgcm9sZSkgeworCisgICAgICAgIC8vIEhhdmUgd2UgZ290IGFuIGF1dGhlbnRpY2F0ZWQgcHJpbmNpcGFsIGF0IGFsbD8KKyAgICAgICAgaWYgKHVzZXJQcmluY2lwYWwgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAoZmFsc2UpOworCisgICAgICAgIC8vIElkZW50aWZ5IHRoZSBSZWFsbSB3ZSB3aWxsIHVzZSBmb3IgY2hlY2tpbmcgcm9sZSBhc3NpZ25tZW5ldHMKKyAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAoZmFsc2UpOworICAgICAgICBSZWFsbSByZWFsbSA9IGNvbnRleHQuZ2V0UmVhbG0oKTsKKyAgICAgICAgaWYgKHJlYWxtID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKGZhbHNlKTsKKworICAgICAgICAvLyBDaGVjayBmb3IgYSByb2xlIGFsaWFzIGRlZmluZWQgaW4gYSA8c2VjdXJpdHktcm9sZS1yZWY+IGVsZW1lbnQKKyAgICAgICAgaWYgKHdyYXBwZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nIHJlYWxSb2xlID0gd3JhcHBlci5maW5kU2VjdXJpdHlSZWZlcmVuY2Uocm9sZSk7CisgICAgICAgICAgICBpZiAoKHJlYWxSb2xlICE9IG51bGwpICYmCisgICAgICAgICAgICAgICAgcmVhbG0uaGFzUm9sZSh1c2VyUHJpbmNpcGFsLCByZWFsUm9sZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuICh0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENoZWNrIGZvciBhIHJvbGUgZGVmaW5lZCBkaXJlY3RseSBhcyBhIDxzZWN1cml0eS1yb2xlPgorICAgICAgICByZXR1cm4gKHJlYWxtLmhhc1JvbGUodXNlclByaW5jaXBhbCwgcm9sZSkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHByaW5jaXBhbCB0aGF0IGhhcyBiZWVuIGF1dGhlbnRpY2F0ZWQgZm9yIHRoaXMgUmVxdWVzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgUHJpbmNpcGFsIGdldFVzZXJQcmluY2lwYWwoKSB7CisgICAgICAgIHJldHVybiAodXNlclByaW5jaXBhbCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNlc3Npb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgUmVxdWVzdCwgY3JlYXRpbmcgb25lCisgICAgICogaWYgbmVjZXNzYXJ5LgorICAgICAqLworICAgIHB1YmxpYyBTZXNzaW9uIGdldFNlc3Npb25JbnRlcm5hbCgpIHsKKyAgICAgICAgcmV0dXJuIGRvR2V0U2Vzc2lvbih0cnVlKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2Vzc2lvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBSZXF1ZXN0LCBjcmVhdGluZyBvbmUKKyAgICAgKiBpZiBuZWNlc3NhcnkgYW5kIHJlcXVlc3RlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjcmVhdGUgQ3JlYXRlIGEgbmV3IHNlc3Npb24gaWYgb25lIGRvZXMgbm90IGV4aXN0CisgICAgICovCisgICAgcHVibGljIFNlc3Npb24gZ2V0U2Vzc2lvbkludGVybmFsKGJvb2xlYW4gY3JlYXRlKSB7CisgICAgICAgIHJldHVybiBkb0dldFNlc3Npb24oY3JlYXRlKTsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm90ZWN0ZWQgTWV0aG9kcworCisKKyAgICBwcm90ZWN0ZWQgU2Vzc2lvbiBkb0dldFNlc3Npb24oYm9vbGVhbiBjcmVhdGUpIHsKKworICAgICAgICAvLyBUaGVyZSBjYW5ub3QgYmUgYSBzZXNzaW9uIGlmIG5vIGNvbnRleHQgaGFzIGJlZW4gYXNzaWduZWQgeWV0CisgICAgICAgIGlmIChjb250ZXh0ID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworCisgICAgICAgIC8vIFJldHVybiB0aGUgY3VycmVudCBzZXNzaW9uIGlmIGl0IGV4aXN0cyBhbmQgaXMgdmFsaWQKKyAgICAgICAgaWYgKChzZXNzaW9uICE9IG51bGwpICYmICFzZXNzaW9uLmlzVmFsaWQoKSkKKyAgICAgICAgICAgIHNlc3Npb24gPSBudWxsOworICAgICAgICBpZiAoc2Vzc2lvbiAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChzZXNzaW9uKTsKKworICAgICAgICAvLyBSZXR1cm4gdGhlIHJlcXVlc3RlZCBzZXNzaW9uIGlmIGl0IGV4aXN0cyBhbmQgaXMgdmFsaWQKKyAgICAgICAgTWFuYWdlciBtYW5hZ2VyID0gbnVsbDsKKyAgICAgICAgaWYgKGNvbnRleHQgIT0gbnVsbCkKKyAgICAgICAgICAgIG1hbmFnZXIgPSBjb250ZXh0LmdldE1hbmFnZXIoKTsKKyAgICAgICAgaWYgKG1hbmFnZXIgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7ICAgICAgLy8gU2Vzc2lvbnMgYXJlIG5vdCBzdXBwb3J0ZWQKKyAgICAgICAgaWYgKHJlcXVlc3RlZFNlc3Npb25JZCAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHNlc3Npb24gPSBtYW5hZ2VyLmZpbmRTZXNzaW9uKHJlcXVlc3RlZFNlc3Npb25JZCk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgc2Vzc2lvbiA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKHNlc3Npb24gIT0gbnVsbCkgJiYgIXNlc3Npb24uaXNWYWxpZCgpKQorICAgICAgICAgICAgICAgIHNlc3Npb24gPSBudWxsOworICAgICAgICAgICAgaWYgKHNlc3Npb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNlc3Npb24uYWNjZXNzKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIChzZXNzaW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBzZXNzaW9uIGlmIHJlcXVlc3RlZCBhbmQgdGhlIHJlc3BvbnNlIGlzIG5vdCBjb21taXR0ZWQKKyAgICAgICAgaWYgKCFjcmVhdGUpCisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICBpZiAoKGNvbnRleHQgIT0gbnVsbCkgJiYgKHJlc3BvbnNlICE9IG51bGwpICYmCisgICAgICAgICAgICBjb250ZXh0LmdldENvb2tpZXMoKSAmJgorICAgICAgICAgICAgcmVzcG9uc2UuZ2V0UmVzcG9uc2UoKS5pc0NvbW1pdHRlZCgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoImNveW90ZVJlcXVlc3Quc2Vzc2lvbkNyZWF0ZUNvbW1pdHRlZCIpKTsKKyAgICAgICAgfQorCisgICAgICAgIHNlc3Npb24gPSBtYW5hZ2VyLmNyZWF0ZVNlc3Npb24oKTsKKworICAgICAgICAvLyBDcmVhdGluZyBhIG5ldyBzZXNzaW9uIGNvb2tpZSBiYXNlZCBvbiB0aGF0IHNlc3Npb24KKyAgICAgICAgaWYgKChzZXNzaW9uICE9IG51bGwpICYmIChnZXRDb250ZXh0KCkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICYmIGdldENvbnRleHQoKS5nZXRDb29raWVzKCkpIHsKKyAgICAgICAgICAgIENvb2tpZSBjb29raWUgPSBuZXcgQ29va2llKEdsb2JhbHMuU0VTU0lPTl9DT09LSUVfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0SWQoKSk7CisgICAgICAgICAgICBjb25maWd1cmVTZXNzaW9uQ29va2llKGNvb2tpZSk7CisgICAgICAgICAgICByZXNwb25zZS5hZGRDb29raWUoY29va2llKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzZXNzaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNlc3Npb24uYWNjZXNzKCk7CisgICAgICAgICAgICByZXR1cm4gKHNlc3Npb24pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uZmlndXJlcyB0aGUgZ2l2ZW4gSlNFU1NJT05JRCBjb29raWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29va2llIFRoZSBKU0VTU0lPTklEIGNvb2tpZSB0byBiZSBjb25maWd1cmVkCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2Vzc2lvbkNvb2tpZShDb29raWUgY29va2llKSB7CisgICAgICAgIGNvb2tpZS5zZXRNYXhBZ2UoLTEpOworICAgICAgICBTdHJpbmcgY29udGV4dFBhdGggPSBudWxsOworICAgICAgICBpZiAoZ2V0Q29udGV4dCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNvbnRleHRQYXRoID0gZ2V0Q29udGV4dCgpLmdldFBhdGgoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGNvbnRleHRQYXRoICE9IG51bGwpICYmIChjb250ZXh0UGF0aC5sZW5ndGgoKSA+IDApKSB7CisgICAgICAgICAgICBjb29raWUuc2V0UGF0aChjb250ZXh0UGF0aCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb29raWUuc2V0UGF0aCgiLyIpOworICAgICAgICB9CisgICAgICAgIGlmIChpc1NlY3VyZSgpKSB7CisgICAgICAgICAgICBjb29raWUuc2V0U2VjdXJlKHRydWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2UgY29va2llcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBwYXJzZUNvb2tpZXMoKSB7CisKKyAgICAgICAgY29va2llc1BhcnNlZCA9IHRydWU7CisKKyAgICAgICAgQ29va2llcyBzZXJ2ZXJDb29raWVzID0gY295b3RlUmVxdWVzdC5nZXRDb29raWVzKCk7CisgICAgICAgIGludCBjb3VudCA9IHNlcnZlckNvb2tpZXMuZ2V0Q29va2llQ291bnQoKTsKKyAgICAgICAgaWYgKGNvdW50IDw9IDApCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgY29va2llcyA9IG5ldyBDb29raWVbY291bnRdOworCisgICAgICAgIGludCBpZHg9MDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBTZXJ2ZXJDb29raWUgc2Nvb2tpZSA9IHNlcnZlckNvb2tpZXMuZ2V0Q29va2llKGkpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBDb29raWUgY29va2llID0gbmV3IENvb2tpZShzY29va2llLmdldE5hbWUoKS50b1N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb29raWUuZ2V0VmFsdWUoKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICBjb29raWUuc2V0UGF0aChzY29va2llLmdldFBhdGgoKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICBjb29raWUuc2V0VmVyc2lvbihzY29va2llLmdldFZlcnNpb24oKSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIGRvbWFpbiA9IHNjb29raWUuZ2V0RG9tYWluKCkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBpZiAoZG9tYWluICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgY29va2llLnNldERvbWFpbihzY29va2llLmdldERvbWFpbigpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb29raWVzW2lkeCsrXSA9IGNvb2tpZTsKKyAgICAgICAgICAgIH0gY2F0Y2goSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBJZ25vcmUgYmFkIGNvb2tpZQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmKCBpZHggPCBjb3VudCApIHsKKyAgICAgICAgICAgIENvb2tpZSBbXSBuY29va2llcyA9IG5ldyBDb29raWVbaWR4XTsKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoY29va2llcywgMCwgbmNvb2tpZXMsIDAsIGlkeCk7CisgICAgICAgICAgICBjb29raWVzID0gbmNvb2tpZXM7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlIHJlcXVlc3QgcGFyYW1ldGVycy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBwYXJzZVBhcmFtZXRlcnMoKSB7CisKKyAgICAgICAgcGFyYW1ldGVyc1BhcnNlZCA9IHRydWU7CisKKyAgICAgICAgUGFyYW1ldGVycyBwYXJhbWV0ZXJzID0gY295b3RlUmVxdWVzdC5nZXRQYXJhbWV0ZXJzKCk7CisKKyAgICAgICAgU3RyaW5nIGVuYyA9IGNveW90ZVJlcXVlc3QuZ2V0Q2hhcmFjdGVyRW5jb2RpbmcoKTsKKyAgICAgICAgYm9vbGVhbiB1c2VCb2R5RW5jb2RpbmdGb3JVUkkgPSBjb25uZWN0b3IuZ2V0VXNlQm9keUVuY29kaW5nRm9yVVJJKCk7CisgICAgICAgIGlmIChlbmMgIT0gbnVsbCkgeworICAgICAgICAgICAgcGFyYW1ldGVycy5zZXRFbmNvZGluZyhlbmMpOworICAgICAgICAgICAgaWYgKHVzZUJvZHlFbmNvZGluZ0ZvclVSSSkgeworICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMuc2V0UXVlcnlTdHJpbmdFbmNvZGluZyhlbmMpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcGFyYW1ldGVycy5zZXRFbmNvZGluZworICAgICAgICAgICAgICAgIChvcmcuYXBhY2hlLmNveW90ZS5Db25zdGFudHMuREVGQVVMVF9DSEFSQUNURVJfRU5DT0RJTkcpOworICAgICAgICAgICAgaWYgKHVzZUJvZHlFbmNvZGluZ0ZvclVSSSkgeworICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMuc2V0UXVlcnlTdHJpbmdFbmNvZGluZworICAgICAgICAgICAgICAgICAgICAob3JnLmFwYWNoZS5jb3lvdGUuQ29uc3RhbnRzLkRFRkFVTFRfQ0hBUkFDVEVSX0VOQ09ESU5HKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHBhcmFtZXRlcnMuaGFuZGxlUXVlcnlQYXJhbWV0ZXJzKCk7CisKKyAgICAgICAgaWYgKHVzaW5nSW5wdXRTdHJlYW0gfHwgdXNpbmdSZWFkZXIpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgaWYgKCFnZXRNZXRob2QoKS5lcXVhbHNJZ25vcmVDYXNlKCJQT1NUIikpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgU3RyaW5nIGNvbnRlbnRUeXBlID0gZ2V0Q29udGVudFR5cGUoKTsKKyAgICAgICAgaWYgKGNvbnRlbnRUeXBlID09IG51bGwpCisgICAgICAgICAgICBjb250ZW50VHlwZSA9ICIiOworICAgICAgICBpbnQgc2VtaWNvbG9uID0gY29udGVudFR5cGUuaW5kZXhPZignOycpOworICAgICAgICBpZiAoc2VtaWNvbG9uID49IDApIHsKKyAgICAgICAgICAgIGNvbnRlbnRUeXBlID0gY29udGVudFR5cGUuc3Vic3RyaW5nKDAsIHNlbWljb2xvbikudHJpbSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29udGVudFR5cGUgPSBjb250ZW50VHlwZS50cmltKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCEoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIuZXF1YWxzKGNvbnRlbnRUeXBlKSkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgaW50IGxlbiA9IGdldENvbnRlbnRMZW5ndGgoKTsKKworICAgICAgICBpZiAobGVuID4gMCkgeworICAgICAgICAgICAgaW50IG1heFBvc3RTaXplID0gY29ubmVjdG9yLmdldE1heFBvc3RTaXplKCk7CisgICAgICAgICAgICBpZiAoKG1heFBvc3RTaXplID4gMCkgJiYgKGxlbiA+IG1heFBvc3RTaXplKSkgeworICAgICAgICAgICAgICAgIGxvZy5pbmZvKHNtLmdldFN0cmluZygiY295b3RlUmVxdWVzdC5wb3N0VG9vTGFyZ2UiKSk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiUG9zdCB0b28gbGFyZ2UiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgYnl0ZVtdIGZvcm1EYXRhID0gbnVsbDsKKyAgICAgICAgICAgICAgICBpZiAobGVuIDwgQ0FDSEVEX1BPU1RfTEVOKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwb3N0RGF0YSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgcG9zdERhdGEgPSBuZXcgYnl0ZVtDQUNIRURfUE9TVF9MRU5dOworICAgICAgICAgICAgICAgICAgICBmb3JtRGF0YSA9IHBvc3REYXRhOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhID0gbmV3IGJ5dGVbbGVuXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW50IGFjdHVhbExlbiA9IHJlYWRQb3N0Qm9keShmb3JtRGF0YSwgbGVuKTsKKyAgICAgICAgICAgICAgICBpZiAoYWN0dWFsTGVuID09IGxlbikgeworICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLnByb2Nlc3NQYXJhbWV0ZXJzKGZvcm1EYXRhLCAwLCBsZW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgOyAvLyBJZ25vcmUKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZWFkIHBvc3QgYm9keSBpbiBhbiBhcnJheS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IHJlYWRQb3N0Qm9keShieXRlIGJvZHlbXSwgaW50IGxlbikKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICBpbnQgb2Zmc2V0ID0gMDsKKyAgICAgICAgZG8geworICAgICAgICAgICAgaW50IGlucHV0TGVuID0gZ2V0U3RyZWFtKCkucmVhZChib2R5LCBvZmZzZXQsIGxlbiAtIG9mZnNldCk7CisgICAgICAgICAgICBpZiAoaW5wdXRMZW4gPD0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBvZmZzZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvZmZzZXQgKz0gaW5wdXRMZW47CisgICAgICAgIH0gd2hpbGUgKChsZW4gLSBvZmZzZXQpID4gMCk7CisgICAgICAgIHJldHVybiBsZW47CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFBhcnNlIHJlcXVlc3QgbG9jYWxlcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBwYXJzZUxvY2FsZXMoKSB7CisKKyAgICAgICAgbG9jYWxlc1BhcnNlZCA9IHRydWU7CisKKyAgICAgICAgRW51bWVyYXRpb24gdmFsdWVzID0gZ2V0SGVhZGVycygiYWNjZXB0LWxhbmd1YWdlIik7CisKKyAgICAgICAgd2hpbGUgKHZhbHVlcy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gdmFsdWVzLm5leHRFbGVtZW50KCkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIHBhcnNlTG9jYWxlc0hlYWRlcih2YWx1ZSk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUGFyc2UgYWNjZXB0LWxhbmd1YWdlIGhlYWRlciB2YWx1ZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBwYXJzZUxvY2FsZXNIZWFkZXIoU3RyaW5nIHZhbHVlKSB7CisKKyAgICAgICAgLy8gU3RvcmUgdGhlIGFjY3VtdWxhdGVkIGxhbmd1YWdlcyB0aGF0IGhhdmUgYmVlbiByZXF1ZXN0ZWQgaW4KKyAgICAgICAgLy8gYSBsb2NhbCBjb2xsZWN0aW9uLCBzb3J0ZWQgYnkgdGhlIHF1YWxpdHkgdmFsdWUgKHNvIHdlIGNhbgorICAgICAgICAvLyBhZGQgTG9jYWxlcyBpbiBkZXNjZW5kaW5nIG9yZGVyKS4gIFRoZSB2YWx1ZXMgd2lsbCBiZSBBcnJheUxpc3RzCisgICAgICAgIC8vIGNvbnRhaW5pbmcgdGhlIGNvcnJlc3BvbmRpbmcgTG9jYWxlcyB0byBiZSBhZGRlZAorICAgICAgICBUcmVlTWFwIGxvY2FsZXMgPSBuZXcgVHJlZU1hcCgpOworCisgICAgICAgIC8vIFByZXByb2Nlc3MgdGhlIHZhbHVlIHRvIHJlbW92ZSBhbGwgd2hpdGVzcGFjZQorICAgICAgICBpbnQgd2hpdGUgPSB2YWx1ZS5pbmRleE9mKCcgJyk7CisgICAgICAgIGlmICh3aGl0ZSA8IDApCisgICAgICAgICAgICB3aGl0ZSA9IHZhbHVlLmluZGV4T2YoJ1x0Jyk7CisgICAgICAgIGlmICh3aGl0ZSA+PSAwKSB7CisgICAgICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgICAgICBpbnQgbGVuID0gdmFsdWUubGVuZ3RoKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgY2hhciBjaCA9IHZhbHVlLmNoYXJBdChpKTsKKyAgICAgICAgICAgICAgICBpZiAoKGNoICE9ICcgJykgJiYgKGNoICE9ICdcdCcpKQorICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoY2gpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFsdWUgPSBzYi50b1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUHJvY2VzcyBlYWNoIGNvbW1hLWRlbGltaXRlZCBsYW5ndWFnZSBzcGVjaWZpY2F0aW9uCisgICAgICAgIHBhcnNlci5zZXRTdHJpbmcodmFsdWUpOyAgICAgICAgLy8gQVNTRVJUOiBwYXJzZXIgaXMgYXZhaWxhYmxlIHRvIHVzCisgICAgICAgIGludCBsZW5ndGggPSBwYXJzZXIuZ2V0TGVuZ3RoKCk7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisKKyAgICAgICAgICAgIC8vIEV4dHJhY3QgdGhlIG5leHQgY29tbWEtZGVsaW1pdGVkIGVudHJ5CisgICAgICAgICAgICBpbnQgc3RhcnQgPSBwYXJzZXIuZ2V0SW5kZXgoKTsKKyAgICAgICAgICAgIGlmIChzdGFydCA+PSBsZW5ndGgpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpbnQgZW5kID0gcGFyc2VyLmZpbmRDaGFyKCcsJyk7CisgICAgICAgICAgICBTdHJpbmcgZW50cnkgPSBwYXJzZXIuZXh0cmFjdChzdGFydCwgZW5kKS50cmltKCk7CisgICAgICAgICAgICBwYXJzZXIuYWR2YW5jZSgpOyAgIC8vIEZvciB0aGUgZm9sbG93aW5nIGVudHJ5CisKKyAgICAgICAgICAgIC8vIEV4dHJhY3QgdGhlIHF1YWxpdHkgZmFjdG9yIGZvciB0aGlzIGVudHJ5CisgICAgICAgICAgICBkb3VibGUgcXVhbGl0eSA9IDEuMDsKKyAgICAgICAgICAgIGludCBzZW1pID0gZW50cnkuaW5kZXhPZigiO3E9Iik7CisgICAgICAgICAgICBpZiAoc2VtaSA+PSAwKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcXVhbGl0eSA9IERvdWJsZS5wYXJzZURvdWJsZShlbnRyeS5zdWJzdHJpbmcoc2VtaSArIDMpKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBxdWFsaXR5ID0gMC4wOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbnRyeSA9IGVudHJ5LnN1YnN0cmluZygwLCBzZW1pKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gU2tpcCBlbnRyaWVzIHdlIGFyZSBub3QgZ29pbmcgdG8ga2VlcCB0cmFjayBvZgorICAgICAgICAgICAgaWYgKHF1YWxpdHkgPCAwLjAwMDA1KQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAgICAgICAvLyBaZXJvIChvciBlZmZlY3RpdmVseSB6ZXJvKSBxdWFsaXR5IGZhY3RvcnMKKyAgICAgICAgICAgIGlmICgiKiIuZXF1YWxzKGVudHJ5KSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsgICAgICAgLy8gRklYTUUgLSAiKiIgZW50cmllcyBhcmUgbm90IGhhbmRsZWQKKworICAgICAgICAgICAgLy8gRXh0cmFjdCB0aGUgbGFuZ3VhZ2UgYW5kIGNvdW50cnkgZm9yIHRoaXMgZW50cnkKKyAgICAgICAgICAgIFN0cmluZyBsYW5ndWFnZSA9IG51bGw7CisgICAgICAgICAgICBTdHJpbmcgY291bnRyeSA9IG51bGw7CisgICAgICAgICAgICBTdHJpbmcgdmFyaWFudCA9IG51bGw7CisgICAgICAgICAgICBpbnQgZGFzaCA9IGVudHJ5LmluZGV4T2YoJy0nKTsKKyAgICAgICAgICAgIGlmIChkYXNoIDwgMCkgeworICAgICAgICAgICAgICAgIGxhbmd1YWdlID0gZW50cnk7CisgICAgICAgICAgICAgICAgY291bnRyeSA9ICIiOworICAgICAgICAgICAgICAgIHZhcmlhbnQgPSAiIjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbGFuZ3VhZ2UgPSBlbnRyeS5zdWJzdHJpbmcoMCwgZGFzaCk7CisgICAgICAgICAgICAgICAgY291bnRyeSA9IGVudHJ5LnN1YnN0cmluZyhkYXNoICsgMSk7CisgICAgICAgICAgICAgICAgaW50IHZEYXNoID0gY291bnRyeS5pbmRleE9mKCctJyk7CisgICAgICAgICAgICAgICAgaWYgKHZEYXNoID4gMCkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY1RlbXAgPSBjb3VudHJ5LnN1YnN0cmluZygwLCB2RGFzaCk7CisgICAgICAgICAgICAgICAgICAgIHZhcmlhbnQgPSBjb3VudHJ5LnN1YnN0cmluZyh2RGFzaCArIDEpOworICAgICAgICAgICAgICAgICAgICBjb3VudHJ5ID0gY1RlbXA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyaWFudCA9ICIiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQWRkIGEgbmV3IExvY2FsZSB0byB0aGUgbGlzdCBvZiBMb2NhbGVzIGZvciB0aGlzIHF1YWxpdHkgbGV2ZWwKKyAgICAgICAgICAgIExvY2FsZSBsb2NhbGUgPSBuZXcgTG9jYWxlKGxhbmd1YWdlLCBjb3VudHJ5LCB2YXJpYW50KTsKKyAgICAgICAgICAgIERvdWJsZSBrZXkgPSBuZXcgRG91YmxlKC1xdWFsaXR5KTsgIC8vIFJldmVyc2UgdGhlIG9yZGVyCisgICAgICAgICAgICBBcnJheUxpc3QgdmFsdWVzID0gKEFycmF5TGlzdCkgbG9jYWxlcy5nZXQoa2V5KTsKKyAgICAgICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHZhbHVlcyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgICAgICAgICBsb2NhbGVzLnB1dChrZXksIHZhbHVlcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2YWx1ZXMuYWRkKGxvY2FsZSk7CisKKyAgICAgICAgfQorCisgICAgICAgIC8vIFByb2Nlc3MgdGhlIHF1YWxpdHkgdmFsdWVzIGluIGhpZ2hlc3QtPmxvd2VzdCBvcmRlciAoZHVlIHRvCisgICAgICAgIC8vIG5lZ2F0aW5nIHRoZSBEb3VibGUgdmFsdWUgd2hlbiBjcmVhdGluZyB0aGUga2V5KQorICAgICAgICBJdGVyYXRvciBrZXlzID0gbG9jYWxlcy5rZXlTZXQoKS5pdGVyYXRvcigpOworICAgICAgICB3aGlsZSAoa2V5cy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIERvdWJsZSBrZXkgPSAoRG91YmxlKSBrZXlzLm5leHQoKTsKKyAgICAgICAgICAgIEFycmF5TGlzdCBsaXN0ID0gKEFycmF5TGlzdCkgbG9jYWxlcy5nZXQoa2V5KTsKKyAgICAgICAgICAgIEl0ZXJhdG9yIHZhbHVlcyA9IGxpc3QuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIHdoaWxlICh2YWx1ZXMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgTG9jYWxlIGxvY2FsZSA9IChMb2NhbGUpIHZhbHVlcy5uZXh0KCk7CisgICAgICAgICAgICAgICAgYWRkTG9jYWxlKGxvY2FsZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29ubmVjdG9yL1JlcXVlc3RGYWNhZGUuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb25uZWN0b3IvUmVxdWVzdEZhY2FkZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiN2EzMTAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29ubmVjdG9yL1JlcXVlc3RGYWNhZGUuamF2YQpAQCAtMCwwICsxLDU3MSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3I7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXguc2VydmxldC5SZXF1ZXN0RGlzcGF0Y2hlcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuQ29va2llOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uOworCisKKy8qKgorICogRmFjYWRlIGNsYXNzIHRoYXQgd3JhcHMgYSBDb3lvdGUgcmVxdWVzdCBvYmplY3QuICAKKyAqIEFsbCBtZXRob2RzIGFyZSBkZWxlZ2F0ZWQgdG8gdGhlIHdyYXBwZWQgcmVxdWVzdC4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEBhdXRob3IgUmVteSBNYXVjaGVyYXQKKyAqIEBhdXRob3IgSmVhbi1GcmFuY29pcyBBcmNhbmQKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworCitwdWJsaWMgY2xhc3MgUmVxdWVzdEZhY2FkZSAKKyAgICBpbXBsZW1lbnRzIEh0dHBTZXJ2bGV0UmVxdWVzdCB7CisgICAgICAgIAorICAgICAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBEb1ByaXZpbGVnZWQKKyAgICAKKyAgICBwcml2YXRlIGZpbmFsIGNsYXNzIEdldEF0dHJpYnV0ZVByaXZpbGVnZWRBY3Rpb24gaW1wbGVtZW50cyBQcml2aWxlZ2VkQWN0aW9ueworICAgICAgICAKKyAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7CisgICAgICAgICAgICByZXR1cm4gcmVxdWVzdC5nZXRBdHRyaWJ1dGVOYW1lcygpOworICAgICAgICB9ICAgICAgICAgICAgCisgICAgfQorICAgICAKKyAgICAKKyAgICBwcml2YXRlIGZpbmFsIGNsYXNzIEdldFBhcmFtZXRlck1hcFByaXZpbGVnZWRBY3Rpb24gaW1wbGVtZW50cyBQcml2aWxlZ2VkQWN0aW9ueworICAgICAgICAKKyAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7CisgICAgICAgICAgICByZXR1cm4gcmVxdWVzdC5nZXRQYXJhbWV0ZXJNYXAoKTsKKyAgICAgICAgfSAgICAgICAgCisgICAgfSAgICAKKyAgICAKKyAgICAKKyAgICBwcml2YXRlIGZpbmFsIGNsYXNzIEdldFJlcXVlc3REaXNwYXRjaGVyUHJpdmlsZWdlZEFjdGlvbiBpbXBsZW1lbnRzIFByaXZpbGVnZWRBY3Rpb257CisgICAgICAgIHByaXZhdGUgU3RyaW5nIHBhdGg7CisgICAgICAgIHB1YmxpYyBHZXRSZXF1ZXN0RGlzcGF0Y2hlclByaXZpbGVnZWRBY3Rpb24oU3RyaW5nIHBhdGgpeworICAgICAgICAgICAgdGhpcy5wYXRoID0gcGF0aDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7ICAgCisgICAgICAgICAgICByZXR1cm4gcmVxdWVzdC5nZXRSZXF1ZXN0RGlzcGF0Y2hlcihwYXRoKTsKKyAgICAgICB9ICAgICAgICAgICAKKyAgICB9ICAgIAorICAgIAorICAgIAorICAgIHByaXZhdGUgZmluYWwgY2xhc3MgR2V0UGFyYW1ldGVyUHJpdmlsZWdlZEFjdGlvbiBpbXBsZW1lbnRzIFByaXZpbGVnZWRBY3Rpb257CisgICAgICAgIHB1YmxpYyBTdHJpbmcgbmFtZTsKKyAgICAgICAgcHVibGljIEdldFBhcmFtZXRlclByaXZpbGVnZWRBY3Rpb24oU3RyaW5nIG5hbWUpeworICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsgICAgICAgCisgICAgICAgICAgICByZXR1cm4gcmVxdWVzdC5nZXRQYXJhbWV0ZXIobmFtZSk7CisgICAgICAgIH0gICAgICAgICAgIAorICAgIH0gICAgCisgICAgCisgICAgIAorICAgIHByaXZhdGUgZmluYWwgY2xhc3MgR2V0UGFyYW1ldGVyTmFtZXNQcml2aWxlZ2VkQWN0aW9uIGltcGxlbWVudHMgUHJpdmlsZWdlZEFjdGlvbnsKKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgeyAgICAgICAgICAKKyAgICAgICAgICAgIHJldHVybiByZXF1ZXN0LmdldFBhcmFtZXRlck5hbWVzKCk7CisgICAgICAgIH0gICAgICAgICAgIAorICAgIH0gCisgICAgCisgICAgCisgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBHZXRQYXJhbWV0ZXJWYWx1ZVByaXZpbGVnZWRBY3Rpb24gaW1wbGVtZW50cyBQcml2aWxlZ2VkQWN0aW9ueworICAgICAgICBwdWJsaWMgU3RyaW5nIG5hbWU7CisgICAgICAgIHB1YmxpYyBHZXRQYXJhbWV0ZXJWYWx1ZVByaXZpbGVnZWRBY3Rpb24oU3RyaW5nIG5hbWUpeworICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsgICAgICAgCisgICAgICAgICAgICByZXR1cm4gcmVxdWVzdC5nZXRQYXJhbWV0ZXJWYWx1ZXMobmFtZSk7CisgICAgICAgIH0gICAgICAgICAgIAorICAgIH0gICAgCisgIAorICAgIAorICAgIHByaXZhdGUgZmluYWwgY2xhc3MgR2V0Q29va2llc1ByaXZpbGVnZWRBY3Rpb24gaW1wbGVtZW50cyBQcml2aWxlZ2VkQWN0aW9ueworICAgICAgICAKKyAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsgICAgICAgCisgICAgICAgICAgICByZXR1cm4gcmVxdWVzdC5nZXRDb29raWVzKCk7CisgICAgICAgIH0gICAgICAgICAgIAorICAgIH0gICAgICAKKyAgICAKKyAgICAKKyAgICBwcml2YXRlIGZpbmFsIGNsYXNzIEdldENoYXJhY3RlckVuY29kaW5nUHJpdmlsZWdlZEFjdGlvbiBpbXBsZW1lbnRzIFByaXZpbGVnZWRBY3Rpb257CisgICAgICAgIAorICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsgICAgICAgCisgICAgICAgICAgICByZXR1cm4gcmVxdWVzdC5nZXRDaGFyYWN0ZXJFbmNvZGluZygpOworICAgICAgICB9ICAgICAgICAgICAKKyAgICB9ICAgCisgICAgICAgIAorICAgIAorICAgIHByaXZhdGUgZmluYWwgY2xhc3MgR2V0SGVhZGVyc1ByaXZpbGVnZWRBY3Rpb24gaW1wbGVtZW50cyBQcml2aWxlZ2VkQWN0aW9ueworICAgICAgICBwcml2YXRlIFN0cmluZyBuYW1lOworICAgICAgICBwdWJsaWMgR2V0SGVhZGVyc1ByaXZpbGVnZWRBY3Rpb24oU3RyaW5nIG5hbWUpeworICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7ICAgICAgIAorICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3QuZ2V0SGVhZGVycyhuYW1lKTsKKyAgICAgICAgfSAgICAgICAgICAgCisgICAgfSAgICAKKyAgICAgICAgCisgICAgCisgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBHZXRIZWFkZXJOYW1lc1ByaXZpbGVnZWRBY3Rpb24gaW1wbGVtZW50cyBQcml2aWxlZ2VkQWN0aW9ueworCisgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgeyAgICAgICAKKyAgICAgICAgICAgIHJldHVybiByZXF1ZXN0LmdldEhlYWRlck5hbWVzKCk7CisgICAgICAgIH0gICAgICAgICAgIAorICAgIH0gIAorICAgICAgICAgICAgCisgICAgCisgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBHZXRMb2NhbGVQcml2aWxlZ2VkQWN0aW9uIGltcGxlbWVudHMgUHJpdmlsZWdlZEFjdGlvbnsKKworICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsgICAgICAgCisgICAgICAgICAgICByZXR1cm4gcmVxdWVzdC5nZXRMb2NhbGUoKTsKKyAgICAgICAgfSAgICAgICAgICAgCisgICAgfSAgICAKKyAgICAgICAgICAgIAorICAgIAorICAgIHByaXZhdGUgZmluYWwgY2xhc3MgR2V0TG9jYWxlc1ByaXZpbGVnZWRBY3Rpb24gaW1wbGVtZW50cyBQcml2aWxlZ2VkQWN0aW9ueworCisgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgeyAgICAgICAKKyAgICAgICAgICAgIHJldHVybiByZXF1ZXN0LmdldExvY2FsZXMoKTsKKyAgICAgICAgfSAgICAgICAgICAgCisgICAgfSAgICAKKyAgICAKKyAgICBwcml2YXRlIGZpbmFsIGNsYXNzIEdldFNlc3Npb25Qcml2aWxlZ2VkQWN0aW9uIGltcGxlbWVudHMgUHJpdmlsZWdlZEFjdGlvbnsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGNyZWF0ZTsKKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBHZXRTZXNzaW9uUHJpdmlsZWdlZEFjdGlvbihib29sZWFuIGNyZWF0ZSl7CisgICAgICAgICAgICB0aGlzLmNyZWF0ZSA9IGNyZWF0ZTsKKyAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsgIAorICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3QuZ2V0U2Vzc2lvbihjcmVhdGUpOworICAgICAgICB9ICAgICAgICAgICAKKyAgICB9ICAgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIHdyYXBwZXIgZm9yIHRoZSBzcGVjaWZpZWQgcmVxdWVzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSByZXF1ZXN0IHRvIGJlIHdyYXBwZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgUmVxdWVzdEZhY2FkZShSZXF1ZXN0IHJlcXVlc3QpIHsKKworICAgICAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0OworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIHdyYXBwZWQgcmVxdWVzdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUmVxdWVzdCByZXF1ZXN0ID0gbnVsbDsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIENsZWFyIGZhY2FkZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgcmVxdWVzdCA9IG51bGw7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNlcnZsZXRSZXF1ZXN0IE1ldGhvZHMKKworCisgICAgcHVibGljIE9iamVjdCBnZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIHJlcXVlc3QuZ2V0QXR0cmlidXRlKG5hbWUpOworICAgIH0KKworCisgICAgcHVibGljIEVudW1lcmF0aW9uIGdldEF0dHJpYnV0ZU5hbWVzKCkgeworICAgICAgICBpZiAoU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpICE9IG51bGwpeworICAgICAgICAgICAgcmV0dXJuIChFbnVtZXJhdGlvbilBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKKyAgICAgICAgICAgICAgICBuZXcgR2V0QXR0cmlidXRlUHJpdmlsZWdlZEFjdGlvbigpKTsgICAgICAgIAorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3QuZ2V0QXR0cmlidXRlTmFtZXMoKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHVibGljIFN0cmluZyBnZXRDaGFyYWN0ZXJFbmNvZGluZygpIHsKKyAgICAgICAgaWYgKFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSAhPSBudWxsKXsKKyAgICAgICAgICAgIHJldHVybiAoU3RyaW5nKUFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAorICAgICAgICAgICAgICAgIG5ldyBHZXRDaGFyYWN0ZXJFbmNvZGluZ1ByaXZpbGVnZWRBY3Rpb24oKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gcmVxdWVzdC5nZXRDaGFyYWN0ZXJFbmNvZGluZygpOworICAgICAgICB9ICAgICAgICAgCisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXRDaGFyYWN0ZXJFbmNvZGluZyhTdHJpbmcgZW52KQorICAgICAgICB0aHJvd3MgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgcmVxdWVzdC5zZXRDaGFyYWN0ZXJFbmNvZGluZyhlbnYpOworICAgIH0KKworCisgICAgcHVibGljIGludCBnZXRDb250ZW50TGVuZ3RoKCkgeworICAgICAgICByZXR1cm4gcmVxdWVzdC5nZXRDb250ZW50TGVuZ3RoKCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRUeXBlKCkgeworICAgICAgICByZXR1cm4gcmVxdWVzdC5nZXRDb250ZW50VHlwZSgpOworICAgIH0KKworCisgICAgcHVibGljIFNlcnZsZXRJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiByZXF1ZXN0LmdldElucHV0U3RyZWFtKCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhcmFtZXRlcihTdHJpbmcgbmFtZSkgeworICAgICAgICBpZiAoU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpICE9IG51bGwpeworICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCisgICAgICAgICAgICAgICAgbmV3IEdldFBhcmFtZXRlclByaXZpbGVnZWRBY3Rpb24obmFtZSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3QuZ2V0UGFyYW1ldGVyKG5hbWUpOworICAgICAgICB9CisgICAgfQorCisKKyAgICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0UGFyYW1ldGVyTmFtZXMoKSB7CisgICAgICAgIGlmIChTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCkgIT0gbnVsbCl7CisgICAgICAgICAgICByZXR1cm4gKEVudW1lcmF0aW9uKUFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAorICAgICAgICAgICAgICAgIG5ldyBHZXRQYXJhbWV0ZXJOYW1lc1ByaXZpbGVnZWRBY3Rpb24oKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gcmVxdWVzdC5nZXRQYXJhbWV0ZXJOYW1lcygpOworICAgICAgICB9CisgICAgfQorCisKKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0UGFyYW1ldGVyVmFsdWVzKFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgU3RyaW5nW10gcmV0ID0gbnVsbDsKKworICAgICAgICAvKgorICAgICAgICAgKiBDbG9uZSB0aGUgcmV0dXJuZWQgYXJyYXkgb25seSBpZiB0aGVyZSBpcyBhIHNlY3VyaXR5IG1hbmFnZXIKKyAgICAgICAgICogaW4gcGxhY2UsIHNvIHRoYXQgcGVyZm9ybWFuY2Ugd29uJ3Qgc3VmZmVyIGluIHRoZSBub25zZWN1cmUgY2FzZQorICAgICAgICAgKi8KKyAgICAgICAgaWYgKFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSAhPSBudWxsKXsKKyAgICAgICAgICAgIHJldCA9IChTdHJpbmdbXSkgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCisgICAgICAgICAgICAgICAgbmV3IEdldFBhcmFtZXRlclZhbHVlUHJpdmlsZWdlZEFjdGlvbihuYW1lKSk7CisgICAgICAgICAgICBpZiAocmV0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXQgPSAoU3RyaW5nW10pIHJldC5jbG9uZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0ID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXJWYWx1ZXMobmFtZSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworCisgICAgcHVibGljIE1hcCBnZXRQYXJhbWV0ZXJNYXAoKSB7CisgICAgICAgIGlmIChTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCkgIT0gbnVsbCl7CisgICAgICAgICAgICByZXR1cm4gKE1hcClBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKKyAgICAgICAgICAgICAgICBuZXcgR2V0UGFyYW1ldGVyTWFwUHJpdmlsZWdlZEFjdGlvbigpKTsgICAgICAgIAorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3QuZ2V0UGFyYW1ldGVyTWFwKCk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvdG9jb2woKSB7CisgICAgICAgIHJldHVybiByZXF1ZXN0LmdldFByb3RvY29sKCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFNjaGVtZSgpIHsKKyAgICAgICAgcmV0dXJuIHJlcXVlc3QuZ2V0U2NoZW1lKCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFNlcnZlck5hbWUoKSB7CisgICAgICAgIHJldHVybiByZXF1ZXN0LmdldFNlcnZlck5hbWUoKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBpbnQgZ2V0U2VydmVyUG9ydCgpIHsKKyAgICAgICAgcmV0dXJuIHJlcXVlc3QuZ2V0U2VydmVyUG9ydCgpOworICAgIH0KKworCisgICAgcHVibGljIEJ1ZmZlcmVkUmVhZGVyIGdldFJlYWRlcigpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiByZXF1ZXN0LmdldFJlYWRlcigpOworICAgIH0KKworCisgICAgcHVibGljIFN0cmluZyBnZXRSZW1vdGVBZGRyKCkgeworICAgICAgICByZXR1cm4gcmVxdWVzdC5nZXRSZW1vdGVBZGRyKCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlbW90ZUhvc3QoKSB7CisgICAgICAgIHJldHVybiByZXF1ZXN0LmdldFJlbW90ZUhvc3QoKTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgT2JqZWN0IG8pIHsKKyAgICAgICAgcmVxdWVzdC5zZXRBdHRyaWJ1dGUobmFtZSwgbyk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmVxdWVzdC5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgTG9jYWxlIGdldExvY2FsZSgpIHsKKyAgICAgICAgaWYgKFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSAhPSBudWxsKXsKKyAgICAgICAgICAgIHJldHVybiAoTG9jYWxlKUFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAorICAgICAgICAgICAgICAgIG5ldyBHZXRMb2NhbGVQcml2aWxlZ2VkQWN0aW9uKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3QuZ2V0TG9jYWxlKCk7CisgICAgICAgIH0gICAgICAgIAorICAgIH0KKworCisgICAgcHVibGljIEVudW1lcmF0aW9uIGdldExvY2FsZXMoKSB7CisgICAgICAgIGlmIChTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCkgIT0gbnVsbCl7CisgICAgICAgICAgICByZXR1cm4gKEVudW1lcmF0aW9uKUFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAorICAgICAgICAgICAgICAgIG5ldyBHZXRMb2NhbGVzUHJpdmlsZWdlZEFjdGlvbigpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiByZXF1ZXN0LmdldExvY2FsZXMoKTsKKyAgICAgICAgfSAgICAgICAgCisgICAgfQorCisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1NlY3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIHJlcXVlc3QuaXNTZWN1cmUoKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBSZXF1ZXN0RGlzcGF0Y2hlciBnZXRSZXF1ZXN0RGlzcGF0Y2hlcihTdHJpbmcgcGF0aCkgeworICAgICAgICBpZiAoU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpICE9IG51bGwpeworICAgICAgICAgICAgcmV0dXJuIChSZXF1ZXN0RGlzcGF0Y2hlcilBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKKyAgICAgICAgICAgICAgICBuZXcgR2V0UmVxdWVzdERpc3BhdGNoZXJQcml2aWxlZ2VkQWN0aW9uKHBhdGgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiByZXF1ZXN0LmdldFJlcXVlc3REaXNwYXRjaGVyKHBhdGgpOworICAgICAgICB9CisgICAgfQorCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlYWxQYXRoKFN0cmluZyBwYXRoKSB7CisgICAgICAgIHJldHVybiByZXF1ZXN0LmdldFJlYWxQYXRoKHBhdGgpOworICAgIH0KKworCisgICAgcHVibGljIFN0cmluZyBnZXRBdXRoVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIHJlcXVlc3QuZ2V0QXV0aFR5cGUoKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBDb29raWVbXSBnZXRDb29raWVzKCkgeworCisgICAgICAgIENvb2tpZVtdIHJldCA9IG51bGw7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQ2xvbmUgdGhlIHJldHVybmVkIGFycmF5IG9ubHkgaWYgdGhlcmUgaXMgYSBzZWN1cml0eSBtYW5hZ2VyCisgICAgICAgICAqIGluIHBsYWNlLCBzbyB0aGF0IHBlcmZvcm1hbmNlIHdvbid0IHN1ZmZlciBpbiB0aGUgbm9uc2VjdXJlIGNhc2UKKyAgICAgICAgICovCisgICAgICAgIGlmIChTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCkgIT0gbnVsbCl7CisgICAgICAgICAgICByZXQgPSAoQ29va2llW10pQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCisgICAgICAgICAgICAgICAgbmV3IEdldENvb2tpZXNQcml2aWxlZ2VkQWN0aW9uKCkpOworICAgICAgICAgICAgaWYgKHJldCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gKENvb2tpZVtdKSByZXQuY2xvbmUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldCA9IHJlcXVlc3QuZ2V0Q29va2llcygpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKworICAgIHB1YmxpYyBsb25nIGdldERhdGVIZWFkZXIoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIHJlcXVlc3QuZ2V0RGF0ZUhlYWRlcihuYW1lKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SGVhZGVyKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHJldHVybiByZXF1ZXN0LmdldEhlYWRlcihuYW1lKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRIZWFkZXJzKFN0cmluZyBuYW1lKSB7CisgICAgICAgIGlmIChTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCkgIT0gbnVsbCl7CisgICAgICAgICAgICByZXR1cm4gKEVudW1lcmF0aW9uKUFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAorICAgICAgICAgICAgICAgIG5ldyBHZXRIZWFkZXJzUHJpdmlsZWdlZEFjdGlvbihuYW1lKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gcmVxdWVzdC5nZXRIZWFkZXJzKG5hbWUpOworICAgICAgICB9ICAgICAgICAgCisgICAgfQorCisKKyAgICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0SGVhZGVyTmFtZXMoKSB7CisgICAgICAgIGlmIChTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCkgIT0gbnVsbCl7CisgICAgICAgICAgICByZXR1cm4gKEVudW1lcmF0aW9uKUFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAorICAgICAgICAgICAgICAgIG5ldyBHZXRIZWFkZXJOYW1lc1ByaXZpbGVnZWRBY3Rpb24oKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gcmVxdWVzdC5nZXRIZWFkZXJOYW1lcygpOworICAgICAgICB9ICAgICAgICAgICAgIAorICAgIH0KKworCisgICAgcHVibGljIGludCBnZXRJbnRIZWFkZXIoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIHJlcXVlc3QuZ2V0SW50SGVhZGVyKG5hbWUpOworICAgIH0KKworCisgICAgcHVibGljIFN0cmluZyBnZXRNZXRob2QoKSB7CisgICAgICAgIHJldHVybiByZXF1ZXN0LmdldE1ldGhvZCgpOworICAgIH0KKworCisgICAgcHVibGljIFN0cmluZyBnZXRQYXRoSW5mbygpIHsKKyAgICAgICAgcmV0dXJuIHJlcXVlc3QuZ2V0UGF0aEluZm8oKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aFRyYW5zbGF0ZWQoKSB7CisgICAgICAgIHJldHVybiByZXF1ZXN0LmdldFBhdGhUcmFuc2xhdGVkKCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRleHRQYXRoKCkgeworICAgICAgICByZXR1cm4gcmVxdWVzdC5nZXRDb250ZXh0UGF0aCgpOworICAgIH0KKworCisgICAgcHVibGljIFN0cmluZyBnZXRRdWVyeVN0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIHJlcXVlc3QuZ2V0UXVlcnlTdHJpbmcoKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVtb3RlVXNlcigpIHsKKyAgICAgICAgcmV0dXJuIHJlcXVlc3QuZ2V0UmVtb3RlVXNlcigpOworICAgIH0KKworCisgICAgcHVibGljIGJvb2xlYW4gaXNVc2VySW5Sb2xlKFN0cmluZyByb2xlKSB7CisgICAgICAgIHJldHVybiByZXF1ZXN0LmlzVXNlckluUm9sZShyb2xlKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBqYXZhLnNlY3VyaXR5LlByaW5jaXBhbCBnZXRVc2VyUHJpbmNpcGFsKCkgeworICAgICAgICByZXR1cm4gcmVxdWVzdC5nZXRVc2VyUHJpbmNpcGFsKCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlcXVlc3RlZFNlc3Npb25JZCgpIHsKKyAgICAgICAgcmV0dXJuIHJlcXVlc3QuZ2V0UmVxdWVzdGVkU2Vzc2lvbklkKCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlcXVlc3RVUkkoKSB7CisgICAgICAgIHJldHVybiByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBTdHJpbmdCdWZmZXIgZ2V0UmVxdWVzdFVSTCgpIHsKKyAgICAgICAgcmV0dXJuIHJlcXVlc3QuZ2V0UmVxdWVzdFVSTCgpOworICAgIH0KKworCisgICAgcHVibGljIFN0cmluZyBnZXRTZXJ2bGV0UGF0aCgpIHsKKyAgICAgICAgcmV0dXJuIHJlcXVlc3QuZ2V0U2VydmxldFBhdGgoKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBIdHRwU2Vzc2lvbiBnZXRTZXNzaW9uKGJvb2xlYW4gY3JlYXRlKSB7CisKKyAgICAgICAgaWYgKFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSAhPSBudWxsKXsKKyAgICAgICAgICAgIHJldHVybiAoSHR0cFNlc3Npb24pQWNjZXNzQ29udHJvbGxlci4KKyAgICAgICAgICAgICAgICBkb1ByaXZpbGVnZWQobmV3IEdldFNlc3Npb25Qcml2aWxlZ2VkQWN0aW9uKGNyZWF0ZSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3QuZ2V0U2Vzc2lvbihjcmVhdGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIEh0dHBTZXNzaW9uIGdldFNlc3Npb24oKSB7CisgICAgICAgIHJldHVybiBnZXRTZXNzaW9uKHRydWUpOworICAgIH0KKworCisgICAgcHVibGljIGJvb2xlYW4gaXNSZXF1ZXN0ZWRTZXNzaW9uSWRWYWxpZCgpIHsKKyAgICAgICAgcmV0dXJuIHJlcXVlc3QuaXNSZXF1ZXN0ZWRTZXNzaW9uSWRWYWxpZCgpOworICAgIH0KKworCisgICAgcHVibGljIGJvb2xlYW4gaXNSZXF1ZXN0ZWRTZXNzaW9uSWRGcm9tQ29va2llKCkgeworICAgICAgICByZXR1cm4gcmVxdWVzdC5pc1JlcXVlc3RlZFNlc3Npb25JZEZyb21Db29raWUoKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBib29sZWFuIGlzUmVxdWVzdGVkU2Vzc2lvbklkRnJvbVVSTCgpIHsKKyAgICAgICAgcmV0dXJuIHJlcXVlc3QuaXNSZXF1ZXN0ZWRTZXNzaW9uSWRGcm9tVVJMKCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JlcXVlc3RlZFNlc3Npb25JZEZyb21VcmwoKSB7CisgICAgICAgIHJldHVybiByZXF1ZXN0LmlzUmVxdWVzdGVkU2Vzc2lvbklkRnJvbVVSTCgpOworICAgIH0KKworCisgICAgcHVibGljIFN0cmluZyBnZXRMb2NhbEFkZHIoKSB7CisJCXJldHVybiByZXF1ZXN0LmdldExvY2FsQWRkcigpOworCX0KKworCisJcHVibGljIFN0cmluZyBnZXRMb2NhbE5hbWUoKSB7CisJCXJldHVybiByZXF1ZXN0LmdldExvY2FsTmFtZSgpOworCX0KKworCisJcHVibGljIGludCBnZXRMb2NhbFBvcnQoKSB7CisJCXJldHVybiByZXF1ZXN0LmdldExvY2FsUG9ydCgpOworCX0KKworCisJcHVibGljIGludCBnZXRSZW1vdGVQb3J0KCkgeworCQlyZXR1cm4gcmVxdWVzdC5nZXRSZW1vdGVQb3J0KCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29ubmVjdG9yL1Jlc3BvbnNlLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29ubmVjdG9yL1Jlc3BvbnNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQwMmZmMAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb25uZWN0b3IvUmVzcG9uc2UuamF2YQpAQCAtMCwwICsxLDE1NDggQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yOworCisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbjsKK2ltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5UaW1lWm9uZTsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5Db29raWU7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5XcmFwcGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5DaGFyc2V0TWFwcGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5EYXRlVG9vbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuU3RyaW5nTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvbWNhdC51dGlsLmJ1Zi5DaGFyQ2h1bms7CitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5idWYuVUVuY29kZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5odHRwLkZhc3RIdHRwRGF0ZUZvcm1hdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvbWNhdC51dGlsLmh0dHAuTWltZUhlYWRlcnM7CitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5odHRwLlNlcnZlckNvb2tpZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvbWNhdC51dGlsLm5ldC5VUkw7CitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5jb21wYXQuSmRrQ29tcGF0OworCisvKioKKyAqIFdyYXBwZXIgb2JqZWN0IGZvciB0aGUgQ295b3RlIHJlc3BvbnNlLgorICoKKyAqIEBhdXRob3IgUmVteSBNYXVjaGVyYXQKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgUmVzcG9uc2UKKyAgICBpbXBsZW1lbnRzIEh0dHBTZXJ2bGV0UmVzcG9uc2UgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgcHVibGljIFJlc3BvbnNlKCkgeworICAgICAgICB1cmxFbmNvZGVyLmFkZFNhZmVDaGFyYWN0ZXIoJy8nKTsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENsYXNzIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBKREsgY29tcGF0aWJpbGl0eSBzdXBwb3J0CisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmRrQ29tcGF0IGpka0NvbXBhdCA9IEpka0NvbXBhdC5nZXRKZGtDb21wYXQoKTsKKworCisgICAgLyoqCisgICAgICogRGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBSZXNwb25zZSBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBpbmZvID0KKyAgICAgICAgIm9yZy5hcGFjaGUuY295b3RlLnRvbWNhdDUuQ295b3RlUmVzcG9uc2UvMS4wIjsKKworCisgICAgLyoqCisgICAgICogVGhlIHN0cmluZyBtYW5hZ2VyIGZvciB0aGlzIHBhY2thZ2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmdNYW5hZ2VyIHNtID0KKyAgICAgICAgU3RyaW5nTWFuYWdlci5nZXRNYW5hZ2VyKENvbnN0YW50cy5QYWNrYWdlKTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKyAgICAvKioKKyAgICAgKiBUaGUgZGF0ZSBmb3JtYXQgd2Ugd2lsbCB1c2UgZm9yIGNyZWF0aW5nIGRhdGUgaGVhZGVycy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU2ltcGxlRGF0ZUZvcm1hdCBmb3JtYXQgPSBudWxsOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogQXNzb2NpYXRlZCBDYXRhbGluYSBjb25uZWN0b3IuCisgICAgICovCisgICAgcHJvdGVjdGVkIENvbm5lY3RvciBjb25uZWN0b3I7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIENvbm5lY3RvciB0aHJvdWdoIHdoaWNoIHRoaXMgUmVxdWVzdCB3YXMgcmVjZWl2ZWQuCisgICAgICovCisgICAgcHVibGljIENvbm5lY3RvciBnZXRDb25uZWN0b3IoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5jb25uZWN0b3IpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgQ29ubmVjdG9yIHRocm91Z2ggd2hpY2ggdGhpcyBSZXF1ZXN0IHdhcyByZWNlaXZlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0b3IgVGhlIG5ldyBjb25uZWN0b3IKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb25uZWN0b3IoQ29ubmVjdG9yIGNvbm5lY3RvcikgeworICAgICAgICB0aGlzLmNvbm5lY3RvciA9IGNvbm5lY3RvcjsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENveW90ZSByZXNwb25zZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgb3JnLmFwYWNoZS5jb3lvdGUuUmVzcG9uc2UgY295b3RlUmVzcG9uc2U7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIENveW90ZSByZXNwb25zZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY295b3RlUmVzcG9uc2UgVGhlIENveW90ZSByZXNwb25zZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENveW90ZVJlc3BvbnNlKG9yZy5hcGFjaGUuY295b3RlLlJlc3BvbnNlIGNveW90ZVJlc3BvbnNlKSB7CisgICAgICAgIHRoaXMuY295b3RlUmVzcG9uc2UgPSBjb3lvdGVSZXNwb25zZTsKKyAgICAgICAgb3V0cHV0QnVmZmVyLnNldFJlc3BvbnNlKGNveW90ZVJlc3BvbnNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIENveW90ZSByZXNwb25zZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgb3JnLmFwYWNoZS5jb3lvdGUuUmVzcG9uc2UgZ2V0Q295b3RlUmVzcG9uc2UoKSB7CisgICAgICAgIHJldHVybiAoY295b3RlUmVzcG9uc2UpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBDb250ZXh0IHdpdGhpbiB3aGljaCB0aGlzIFJlcXVlc3QgaXMgYmVpbmcgcHJvY2Vzc2VkLgorICAgICAqLworICAgIHB1YmxpYyBDb250ZXh0IGdldENvbnRleHQoKSB7CisgICAgICAgIHJldHVybiAocmVxdWVzdC5nZXRDb250ZXh0KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgQ29udGV4dCB3aXRoaW4gd2hpY2ggdGhpcyBSZXF1ZXN0IGlzIGJlaW5nIHByb2Nlc3NlZC4gIFRoaXMKKyAgICAgKiBtdXN0IGJlIGNhbGxlZCBhcyBzb29uIGFzIHRoZSBhcHByb3ByaWF0ZSBDb250ZXh0IGlzIGlkZW50aWZpZWQsIGJlY2F1c2UKKyAgICAgKiBpdCBpZGVudGlmaWVzIHRoZSB2YWx1ZSB0byBiZSByZXR1cm5lZCBieSA8Y29kZT5nZXRDb250ZXh0UGF0aCgpPC9jb2RlPiwKKyAgICAgKiBhbmQgdGh1cyBlbmFibGVzIHBhcnNpbmcgb2YgdGhlIHJlcXVlc3QgVVJJLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIG5ld2x5IGFzc29jaWF0ZWQgQ29udGV4dAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbnRleHQoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHJlcXVlc3Quc2V0Q29udGV4dChjb250ZXh0KTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSBhc3NvY2lhdGVkIG91dHB1dCBidWZmZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIE91dHB1dEJ1ZmZlciBvdXRwdXRCdWZmZXIgPSBuZXcgT3V0cHV0QnVmZmVyKCk7CisKKworICAgIC8qKgorICAgICAqIFRoZSBhc3NvY2lhdGVkIG91dHB1dCBzdHJlYW0uCisgICAgICovCisgICAgcHJvdGVjdGVkIENveW90ZU91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSAKKyAgICAgICAgbmV3IENveW90ZU91dHB1dFN0cmVhbShvdXRwdXRCdWZmZXIpOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgYXNzb2NpYXRlZCB3cml0ZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIENveW90ZVdyaXRlciB3cml0ZXIgPSBuZXcgQ295b3RlV3JpdGVyKG91dHB1dEJ1ZmZlcik7CisKKworICAgIC8qKgorICAgICAqIFRoZSBhcHBsaWNhdGlvbiBjb21taXQgZmxhZy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhcHBDb21taXR0ZWQgPSBmYWxzZTsKKworCisgICAgLyoqCisgICAgICogVGhlIGluY2x1ZGVkIGZsYWcuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaW5jbHVkZWQgPSBmYWxzZTsKKworICAgIAorICAgIC8qKgorICAgICAqIFRoZSBjaGFyYWN0ZXJFbmNvZGluZyBmbGFnCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGlzQ2hhcmFjdGVyRW5jb2RpbmdTZXQgPSBmYWxzZTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgY29udGV4dFR5cGUgZmxhZworICAgICAqLyAgICAKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNDb250ZW50VHlwZVNldCA9IGZhbHNlOworCisgICAgCisgICAgLyoqCisgICAgICogVGhlIGVycm9yIGZsYWcuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gZXJyb3IgPSBmYWxzZTsKKworCisgICAgLyoqCisgICAgICogVGhlIHNldCBvZiBDb29raWVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFJlc3BvbnNlLgorICAgICAqLworICAgIHByb3RlY3RlZCBBcnJheUxpc3QgY29va2llcyA9IG5ldyBBcnJheUxpc3QoKTsKKworCisgICAgLyoqCisgICAgICogVXNpbmcgb3V0cHV0IHN0cmVhbSBmbGFnLgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIHVzaW5nT3V0cHV0U3RyZWFtID0gZmFsc2U7CisKKworICAgIC8qKgorICAgICAqIFVzaW5nIHdyaXRlciBmbGFnLgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIHVzaW5nV3JpdGVyID0gZmFsc2U7CisKKworICAgIC8qKgorICAgICAqIFVSTCBlbmNvZGVyLgorICAgICAqLworICAgIHByb3RlY3RlZCBVRW5jb2RlciB1cmxFbmNvZGVyID0gbmV3IFVFbmNvZGVyKCk7CisKKworICAgIC8qKgorICAgICAqIFJlY3ljbGFibGUgYnVmZmVyIHRvIGhvbGQgdGhlIHJlZGlyZWN0IFVSTC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ2hhckNodW5rIHJlZGlyZWN0VVJMQ0MgPSBuZXcgQ2hhckNodW5rKCk7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZWxlYXNlIGFsbCBvYmplY3QgcmVmZXJlbmNlcywgYW5kIGluaXRpYWxpemUgaW5zdGFuY2UgdmFyaWFibGVzLCBpbgorICAgICAqIHByZXBhcmF0aW9uIGZvciByZXVzZSBvZiB0aGlzIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWN5Y2xlKCkgeworCisgICAgICAgIG91dHB1dEJ1ZmZlci5yZWN5Y2xlKCk7CisgICAgICAgIHVzaW5nT3V0cHV0U3RyZWFtID0gZmFsc2U7CisgICAgICAgIHVzaW5nV3JpdGVyID0gZmFsc2U7CisgICAgICAgIGFwcENvbW1pdHRlZCA9IGZhbHNlOworICAgICAgICBpbmNsdWRlZCA9IGZhbHNlOworICAgICAgICBlcnJvciA9IGZhbHNlOworICAgICAgICBpc0NvbnRlbnRUeXBlU2V0ID0gZmFsc2U7CisgICAgICAgIGlzQ2hhcmFjdGVyRW5jb2RpbmdTZXQgPSBmYWxzZTsKKyAgICAgICAgCisgICAgICAgIGNvb2tpZXMuY2xlYXIoKTsKKworICAgICAgICBpZiAoQ29uc3RhbnRzLlNFQ1VSSVRZKSB7CisgICAgICAgICAgICBpZiAoZmFjYWRlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmYWNhZGUuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBmYWNhZGUgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG91dHB1dFN0cmVhbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh3cml0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHdyaXRlci5jbGVhcigpOworICAgICAgICAgICAgICAgIHdyaXRlciA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB3cml0ZXIucmVjeWNsZSgpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUmVzcG9uc2UgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSB3cml0dGVuIHRvIHRoZSBvdXRwdXQgc3RyZWFtLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0Q29udGVudENvdW50KCkgeworICAgICAgICByZXR1cm4gb3V0cHV0QnVmZmVyLmdldENvbnRlbnRXcml0dGVuKCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGFwcGxpY2F0aW9uIGNvbW1pdCBmbGFnLgorICAgICAqIAorICAgICAqIEBwYXJhbSBhcHBDb21taXR0ZWQgVGhlIG5ldyBhcHBsaWNhdGlvbiBjb21taXR0ZWQgZmxhZyB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEFwcENvbW1pdHRlZChib29sZWFuIGFwcENvbW1pdHRlZCkgeworICAgICAgICB0aGlzLmFwcENvbW1pdHRlZCA9IGFwcENvbW1pdHRlZDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEFwcGxpY2F0aW9uIGNvbW1pdCBmbGFnIGFjY2Vzc29yLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzQXBwQ29tbWl0dGVkKCkgeworICAgICAgICByZXR1cm4gKHRoaXMuYXBwQ29tbWl0dGVkIHx8IGlzQ29tbWl0dGVkKCkgfHwgaXNTdXNwZW5kZWQoKQorICAgICAgICAgICAgICAgIHx8ICgoZ2V0Q29udGVudExlbmd0aCgpICE9IC0xKSAKKyAgICAgICAgICAgICAgICAgICAgJiYgKGdldENvbnRlbnRDb3VudCgpID49IGdldENvbnRlbnRMZW5ndGgoKSkpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgInByb2Nlc3NpbmcgaW5zaWRlIGFuIGluY2x1ZGUiIGZsYWcuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0SW5jbHVkZWQoKSB7CisgICAgICAgIHJldHVybiBpbmNsdWRlZDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgInByb2Nlc3NpbmcgaW5zaWRlIGFuIGluY2x1ZGUiIGZsYWcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5jbHVkZWQgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgd2UgYXJlIGN1cnJlbnRseSBpbnNpZGUgYQorICAgICAqICBSZXF1ZXN0RGlzcGF0Y2hlci5pbmNsdWRlKCksIGVsc2UgPGNvZGU+ZmFsc2U8L2NvZGU+CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SW5jbHVkZWQoYm9vbGVhbiBpbmNsdWRlZCkgeworICAgICAgICB0aGlzLmluY2x1ZGVkID0gaW5jbHVkZWQ7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBSZXNwb25zZSBpbXBsZW1lbnRhdGlvbiBhbmQKKyAgICAgKiB0aGUgY29ycmVzcG9uZGluZyB2ZXJzaW9uIG51bWJlciwgaW4gdGhlIGZvcm1hdAorICAgICAqIDxjb2RlPiZsdDtkZXNjcmlwdGlvbiZndDsvJmx0O3ZlcnNpb24mZ3Q7PC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEluZm8oKSB7CisgICAgICAgIHJldHVybiAoaW5mbyk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgcmVxdWVzdCB3aXRoIHdoaWNoIHRoaXMgcmVzcG9uc2UgaXMgYXNzb2NpYXRlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUmVxdWVzdCByZXF1ZXN0ID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgUmVxdWVzdCB3aXRoIHdoaWNoIHRoaXMgUmVzcG9uc2UgaXMgYXNzb2NpYXRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgb3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuUmVxdWVzdCBnZXRSZXF1ZXN0KCkgeworICAgICAgICByZXR1cm4gKHRoaXMucmVxdWVzdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBSZXF1ZXN0IHdpdGggd2hpY2ggdGhpcyBSZXNwb25zZSBpcyBhc3NvY2lhdGVkLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIG5ldyBhc3NvY2lhdGVkIHJlcXVlc3QKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZXF1ZXN0KG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLlJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICB0aGlzLnJlcXVlc3QgPSAoUmVxdWVzdCkgcmVxdWVzdDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSBmYWNhZGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmVzcG9uc2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIFJlc3BvbnNlRmFjYWRlIGZhY2FkZSA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIDxjb2RlPlNlcnZsZXRSZXNwb25zZTwvY29kZT4gZm9yIHdoaWNoIHRoaXMgb2JqZWN0CisgICAgICogaXMgdGhlIGZhY2FkZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgSHR0cFNlcnZsZXRSZXNwb25zZSBnZXRSZXNwb25zZSgpIHsKKyAgICAgICAgaWYgKGZhY2FkZSA9PSBudWxsKSB7CisgICAgICAgICAgICBmYWNhZGUgPSBuZXcgUmVzcG9uc2VGYWNhZGUodGhpcyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChmYWNhZGUpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBvdXRwdXQgc3RyZWFtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFJlc3BvbnNlLgorICAgICAqLworICAgIHB1YmxpYyBPdXRwdXRTdHJlYW0gZ2V0U3RyZWFtKCkgeworICAgICAgICBpZiAob3V0cHV0U3RyZWFtID09IG51bGwpIHsKKyAgICAgICAgICAgIG91dHB1dFN0cmVhbSA9IG5ldyBDb3lvdGVPdXRwdXRTdHJlYW0ob3V0cHV0QnVmZmVyKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gb3V0cHV0U3RyZWFtOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBvdXRwdXQgc3RyZWFtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFJlc3BvbnNlLgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmVhbSBUaGUgbmV3IG91dHB1dCBzdHJlYW0KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTdHJlYW0oT3V0cHV0U3RyZWFtIHN0cmVhbSkgeworICAgICAgICAvLyBUaGlzIG1ldGhvZCBpcyBldmlsCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHN1c3BlbmRlZCBmbGFnLgorICAgICAqIAorICAgICAqIEBwYXJhbSBzdXNwZW5kZWQgVGhlIG5ldyBzdXNwZW5kZWQgZmxhZyB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFN1c3BlbmRlZChib29sZWFuIHN1c3BlbmRlZCkgeworICAgICAgICBvdXRwdXRCdWZmZXIuc2V0U3VzcGVuZGVkKHN1c3BlbmRlZCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTdXNwZW5kZWQgZmxhZyBhY2Nlc3Nvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1N1c3BlbmRlZCgpIHsKKyAgICAgICAgcmV0dXJuIG91dHB1dEJ1ZmZlci5pc1N1c3BlbmRlZCgpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBlcnJvciBmbGFnLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEVycm9yKCkgeworICAgICAgICBlcnJvciA9IHRydWU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBFcnJvciBmbGFnIGFjY2Vzc29yLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRXJyb3IoKSB7CisgICAgICAgIHJldHVybiBlcnJvcjsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhbmQgcmV0dXJuIGEgU2VydmxldE91dHB1dFN0cmVhbSB0byB3cml0ZSB0aGUgY29udGVudAorICAgICAqIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFJlc3BvbnNlLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIFNlcnZsZXRPdXRwdXRTdHJlYW0gY3JlYXRlT3V0cHV0U3RyZWFtKCkgCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIFByb2JhYmx5IHVzZWxlc3MKKyAgICAgICAgaWYgKG91dHB1dFN0cmVhbSA9PSBudWxsKSB7CisgICAgICAgICAgICBvdXRwdXRTdHJlYW0gPSBuZXcgQ295b3RlT3V0cHV0U3RyZWFtKG91dHB1dEJ1ZmZlcik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG91dHB1dFN0cmVhbTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFBlcmZvcm0gd2hhdGV2ZXIgYWN0aW9ucyBhcmUgcmVxdWlyZWQgdG8gZmx1c2ggYW5kIGNsb3NlIHRoZSBvdXRwdXQKKyAgICAgKiBzdHJlYW0gb3Igd3JpdGVyLCBpbiBhIHNpbmdsZSBvcGVyYXRpb24uCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBmaW5pc2hSZXNwb25zZSgpIAorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLyBXcml0aW5nIGxlZnRvdmVyIGJ5dGVzCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvdXRwdXRCdWZmZXIuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7CisJICAgIDsKKyAgICAgICAgfSBjYXRjaChUaHJvd2FibGUgdCkgeworCSAgICB0LnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGNvbnRlbnQgbGVuZ3RoIHRoYXQgd2FzIHNldCBvciBjYWxjdWxhdGVkIGZvciB0aGlzIFJlc3BvbnNlLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0Q29udGVudExlbmd0aCgpIHsKKyAgICAgICAgcmV0dXJuIChjb3lvdGVSZXNwb25zZS5nZXRDb250ZW50TGVuZ3RoKCkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjb250ZW50IHR5cGUgdGhhdCB3YXMgc2V0IG9yIGNhbGN1bGF0ZWQgZm9yIHRoaXMgcmVzcG9uc2UsCisgICAgICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gY29udGVudCB0eXBlIHdhcyBzZXQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIChjb3lvdGVSZXNwb25zZS5nZXRDb250ZW50VHlwZSgpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIFByaW50V3JpdGVyIHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVuZGVyIGVycm9yIG1lc3NhZ2VzLAorICAgICAqIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBhIHN0cmVhbSBvciB3cml0ZXIgaGFzIGFscmVhZHkgYmVlbiBhY3F1aXJlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gV3JpdGVyIHdoaWNoIGNhbiBiZSB1c2VkIGZvciBlcnJvciByZXBvcnRzLiBJZiB0aGUgcmVzcG9uc2UgaXMKKyAgICAgKiBub3QgYW4gZXJyb3IgcmVwb3J0IHJldHVybmVkIHVzaW5nIHNlbmRFcnJvciBvciB0cmlnZ2VyZWQgYnkgYW4KKyAgICAgKiB1bmV4cGVjdGVkIGV4Y2VwdGlvbiB0aHJvd24gZHVyaW5nIHRoZSBzZXJ2bGV0IHByb2Nlc3NpbmcKKyAgICAgKiAoYW5kIG9ubHkgaW4gdGhhdCBjYXNlKSwgbnVsbCB3aWxsIGJlIHJldHVybmVkIGlmIHRoZSByZXNwb25zZSBzdHJlYW0KKyAgICAgKiBoYXMgYWxyZWFkeSBiZWVuIHVzZWQuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgUHJpbnRXcml0ZXIgZ2V0UmVwb3J0ZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAob3V0cHV0QnVmZmVyLmlzTmV3KCkpIHsKKyAgICAgICAgICAgIG91dHB1dEJ1ZmZlci5jaGVja0NvbnZlcnRlcigpOworICAgICAgICAgICAgaWYgKHdyaXRlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgd3JpdGVyID0gbmV3IENveW90ZVdyaXRlcihvdXRwdXRCdWZmZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHdyaXRlcjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU2VydmxldFJlc3BvbnNlIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogRmx1c2ggdGhlIGJ1ZmZlciBhbmQgY29tbWl0IHRoaXMgcmVzcG9uc2UuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBmbHVzaEJ1ZmZlcigpIAorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBvdXRwdXRCdWZmZXIuZmx1c2goKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgYWN0dWFsIGJ1ZmZlciBzaXplIHVzZWQgZm9yIHRoaXMgUmVzcG9uc2UuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRCdWZmZXJTaXplKCkgeworICAgICAgICByZXR1cm4gb3V0cHV0QnVmZmVyLmdldEJ1ZmZlclNpemUoKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY2hhcmFjdGVyIGVuY29kaW5nIHVzZWQgZm9yIHRoaXMgUmVzcG9uc2UuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDaGFyYWN0ZXJFbmNvZGluZygpIHsKKyAgICAgICAgcmV0dXJuIChjb3lvdGVSZXNwb25zZS5nZXRDaGFyYWN0ZXJFbmNvZGluZygpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2VydmxldCBvdXRwdXQgc3RyZWFtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFJlc3BvbnNlLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgPGNvZGU+Z2V0V3JpdGVyPC9jb2RlPiBoYXMKKyAgICAgKiAgYWxyZWFkeSBiZWVuIGNhbGxlZCBmb3IgdGhpcyByZXNwb25zZQorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBTZXJ2bGV0T3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbSgpIAorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIGlmICh1c2luZ1dyaXRlcikKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJjb3lvdGVSZXNwb25zZS5nZXRPdXRwdXRTdHJlYW0uaXNlIikpOworCisgICAgICAgIHVzaW5nT3V0cHV0U3RyZWFtID0gdHJ1ZTsKKyAgICAgICAgaWYgKG91dHB1dFN0cmVhbSA9PSBudWxsKSB7CisgICAgICAgICAgICBvdXRwdXRTdHJlYW0gPSBuZXcgQ295b3RlT3V0cHV0U3RyZWFtKG91dHB1dEJ1ZmZlcik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG91dHB1dFN0cmVhbTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBMb2NhbGUgYXNzaWduZWQgdG8gdGhpcyByZXNwb25zZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgTG9jYWxlIGdldExvY2FsZSgpIHsKKyAgICAgICAgcmV0dXJuIChjb3lvdGVSZXNwb25zZS5nZXRMb2NhbGUoKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHdyaXRlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBSZXNwb25zZS4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIDxjb2RlPmdldE91dHB1dFN0cmVhbTwvY29kZT4gaGFzCisgICAgICogIGFscmVhZHkgYmVlbiBjYWxsZWQgZm9yIHRoaXMgcmVzcG9uc2UKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgUHJpbnRXcml0ZXIgZ2V0V3JpdGVyKCkgCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKHVzaW5nT3V0cHV0U3RyZWFtKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoImNveW90ZVJlc3BvbnNlLmdldFdyaXRlci5pc2UiKSk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogSWYgdGhlIHJlc3BvbnNlJ3MgY2hhcmFjdGVyIGVuY29kaW5nIGhhcyBub3QgYmVlbiBzcGVjaWZpZWQgYXMKKyAgICAgICAgICogZGVzY3JpYmVkIGluIDxjb2RlPmdldENoYXJhY3RlckVuY29kaW5nPC9jb2RlPiAoaS5lLiwgdGhlIG1ldGhvZAorICAgICAgICAgKiBqdXN0IHJldHVybnMgdGhlIGRlZmF1bHQgdmFsdWUgPGNvZGU+SVNPLTg4NTktMTwvY29kZT4pLAorICAgICAgICAgKiA8Y29kZT5nZXRXcml0ZXI8L2NvZGU+IHVwZGF0ZXMgaXQgdG8gPGNvZGU+SVNPLTg4NTktMTwvY29kZT4KKyAgICAgICAgICogKHdpdGggdGhlIGVmZmVjdCB0aGF0IGEgc3Vic2VxdWVudCBjYWxsIHRvIGdldENvbnRlbnRUeXBlKCkgd2lsbAorICAgICAgICAgKiBpbmNsdWRlIGEgY2hhcnNldD1JU08tODg1OS0xIGNvbXBvbmVudCB3aGljaCB3aWxsIGFsc28gYmUKKyAgICAgICAgICogcmVmbGVjdGVkIGluIHRoZSBDb250ZW50LVR5cGUgcmVzcG9uc2UgaGVhZGVyLCB0aGVyZWJ5IHNhdGlzZnlpbmcKKyAgICAgICAgICogdGhlIFNlcnZsZXQgc3BlYyByZXF1aXJlbWVudCB0aGF0IGNvbnRhaW5lcnMgbXVzdCBjb21tdW5pY2F0ZSB0aGUKKyAgICAgICAgICogY2hhcmFjdGVyIGVuY29kaW5nIHVzZWQgZm9yIHRoZSBzZXJ2bGV0IHJlc3BvbnNlJ3Mgd3JpdGVyIHRvIHRoZQorICAgICAgICAgKiBjbGllbnQpLgorICAgICAgICAgKi8KKyAgICAgICAgc2V0Q2hhcmFjdGVyRW5jb2RpbmcoZ2V0Q2hhcmFjdGVyRW5jb2RpbmcoKSk7CisKKyAgICAgICAgdXNpbmdXcml0ZXIgPSB0cnVlOworICAgICAgICBvdXRwdXRCdWZmZXIuY2hlY2tDb252ZXJ0ZXIoKTsKKyAgICAgICAgaWYgKHdyaXRlciA9PSBudWxsKSB7CisgICAgICAgICAgICB3cml0ZXIgPSBuZXcgQ295b3RlV3JpdGVyKG91dHB1dEJ1ZmZlcik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHdyaXRlcjsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogSGFzIHRoZSBvdXRwdXQgb2YgdGhpcyByZXNwb25zZSBhbHJlYWR5IGJlZW4gY29tbWl0dGVkPworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzQ29tbWl0dGVkKCkgeworICAgICAgICByZXR1cm4gKGNveW90ZVJlc3BvbnNlLmlzQ29tbWl0dGVkKCkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ2xlYXIgYW55IGNvbnRlbnQgd3JpdHRlbiB0byB0aGUgYnVmZmVyLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhpcyByZXNwb25zZSBoYXMgYWxyZWFkeQorICAgICAqICBiZWVuIGNvbW1pdHRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgeworCisgICAgICAgIGlmIChpbmNsdWRlZCkKKyAgICAgICAgICAgIHJldHVybjsgICAgIC8vIElnbm9yZSBhbnkgY2FsbCBmcm9tIGFuIGluY2x1ZGVkIHNlcnZsZXQKKworICAgICAgICBjb3lvdGVSZXNwb25zZS5yZXNldCgpOworICAgICAgICBvdXRwdXRCdWZmZXIucmVzZXQoKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlc2V0IHRoZSBkYXRhIGJ1ZmZlciBidXQgbm90IGFueSBzdGF0dXMgb3IgaGVhZGVyIGluZm9ybWF0aW9uLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlIHJlc3BvbnNlIGhhcyBhbHJlYWR5CisgICAgICogIGJlZW4gY29tbWl0dGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVzZXRCdWZmZXIoKSB7CisKKyAgICAgICAgaWYgKGlzQ29tbWl0dGVkKCkpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygiY295b3RlUmVzcG9uc2UucmVzZXRCdWZmZXIuaXNlIikpOworCisgICAgICAgIG91dHB1dEJ1ZmZlci5yZXNldCgpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGJ1ZmZlciBzaXplIHRvIGJlIHVzZWQgZm9yIHRoaXMgUmVzcG9uc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2l6ZSBUaGUgbmV3IGJ1ZmZlciBzaXplCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIKKyAgICAgKiAgb3V0cHV0IGhhcyBiZWVuIGNvbW1pdHRlZCBmb3IgdGhpcyByZXNwb25zZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEJ1ZmZlclNpemUoaW50IHNpemUpIHsKKworICAgICAgICBpZiAoaXNDb21taXR0ZWQoKSB8fCAhb3V0cHV0QnVmZmVyLmlzTmV3KCkpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygiY295b3RlUmVzcG9uc2Uuc2V0QnVmZmVyU2l6ZS5pc2UiKSk7CisKKyAgICAgICAgb3V0cHV0QnVmZmVyLnNldEJ1ZmZlclNpemUoc2l6ZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY29udGVudCBsZW5ndGggKGluIGJ5dGVzKSBmb3IgdGhpcyBSZXNwb25zZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsZW5ndGggVGhlIG5ldyBjb250ZW50IGxlbmd0aAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbnRlbnRMZW5ndGgoaW50IGxlbmd0aCkgeworCisgICAgICAgIGlmIChpc0NvbW1pdHRlZCgpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8vIElnbm9yZSBhbnkgY2FsbCBmcm9tIGFuIGluY2x1ZGVkIHNlcnZsZXQKKyAgICAgICAgaWYgKGluY2x1ZGVkKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAKKyAgICAgICAgaWYgKHVzaW5nV3JpdGVyKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAKKyAgICAgICAgY295b3RlUmVzcG9uc2Uuc2V0Q29udGVudExlbmd0aChsZW5ndGgpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNvbnRlbnQgdHlwZSBmb3IgdGhpcyBSZXNwb25zZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0eXBlIFRoZSBuZXcgY29udGVudCB0eXBlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29udGVudFR5cGUoU3RyaW5nIHR5cGUpIHsKKworICAgICAgICBpZiAoaXNDb21taXR0ZWQoKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvLyBJZ25vcmUgYW55IGNhbGwgZnJvbSBhbiBpbmNsdWRlZCBzZXJ2bGV0CisgICAgICAgIGlmIChpbmNsdWRlZCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvLyBJZ25vcmUgY2hhcnNldCBpZiBnZXRXcml0ZXIoKSBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZAorICAgICAgICBpZiAodXNpbmdXcml0ZXIpIHsKKyAgICAgICAgICAgIGlmICh0eXBlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSB0eXBlLmluZGV4T2YoIjsiKTsKKyAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgdHlwZSA9IHR5cGUuc3Vic3RyaW5nKDAsIGluZGV4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjb3lvdGVSZXNwb25zZS5zZXRDb250ZW50VHlwZSh0eXBlKTsKKworICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgY29udGVudCB0eXBlIGNvbnRhaW5zIGNoYXJzZXQKKyAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCkgeworICAgICAgICAgICAgaW50IGluZGV4ID0gdHlwZS5pbmRleE9mKCI7Iik7CisgICAgICAgICAgICBpZiAoaW5kZXggIT0gLTEpIHsKKyAgICAgICAgICAgICAgICBpbnQgbGVuID0gdHlwZS5sZW5ndGgoKTsKKyAgICAgICAgICAgICAgICBpbmRleCsrOworICAgICAgICAgICAgICAgIHdoaWxlIChpbmRleCA8IGxlbiAmJiBDaGFyYWN0ZXIuaXNTcGFjZSh0eXBlLmNoYXJBdChpbmRleCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGluZGV4Kys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChpbmRleCs3IDwgbGVuCisgICAgICAgICAgICAgICAgICAgICAgICAmJiB0eXBlLmNoYXJBdChpbmRleCkgPT0gJ2MnCisgICAgICAgICAgICAgICAgICAgICAgICAmJiB0eXBlLmNoYXJBdChpbmRleCsxKSA9PSAnaCcKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIHR5cGUuY2hhckF0KGluZGV4KzIpID09ICdhJworICAgICAgICAgICAgICAgICAgICAgICAgJiYgdHlwZS5jaGFyQXQoaW5kZXgrMykgPT0gJ3InCisgICAgICAgICAgICAgICAgICAgICAgICAmJiB0eXBlLmNoYXJBdChpbmRleCs0KSA9PSAncycKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIHR5cGUuY2hhckF0KGluZGV4KzUpID09ICdlJworICAgICAgICAgICAgICAgICAgICAgICAgJiYgdHlwZS5jaGFyQXQoaW5kZXgrNikgPT0gJ3QnCisgICAgICAgICAgICAgICAgICAgICAgICAmJiB0eXBlLmNoYXJBdChpbmRleCs3KSA9PSAnPScpIHsKKyAgICAgICAgICAgICAgICAgICAgaXNDaGFyYWN0ZXJFbmNvZGluZ1NldCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaXNDb250ZW50VHlwZVNldCA9IHRydWU7ICAgIAorICAgIH0KKworCisgICAgLyoKKyAgICAgKiBPdmVycmlkZXMgdGhlIG5hbWUgb2YgdGhlIGNoYXJhY3RlciBlbmNvZGluZyB1c2VkIGluIHRoZSBib2R5CisgICAgICogb2YgdGhlIHJlcXVlc3QuIFRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkIHByaW9yIHRvIHJlYWRpbmcKKyAgICAgKiByZXF1ZXN0IHBhcmFtZXRlcnMgb3IgcmVhZGluZyBpbnB1dCB1c2luZyBnZXRSZWFkZXIoKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjaGFyc2V0IFN0cmluZyBjb250YWluaW5nIHRoZSBuYW1lIG9mIHRoZSBjaGFyYXJhY3RlciBlbmNvZGluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDaGFyYWN0ZXJFbmNvZGluZyhTdHJpbmcgY2hhcnNldCkgeworCisgICAgICAgIGlmIChpc0NvbW1pdHRlZCgpKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAKKyAgICAgICAgLy8gSWdub3JlIGFueSBjYWxsIGZyb20gYW4gaW5jbHVkZWQgc2VydmxldAorICAgICAgICBpZiAoaW5jbHVkZWQpCisgICAgICAgICAgICByZXR1cm47ICAgICAKKyAgICAgICAgCisgICAgICAgIC8vIElnbm9yZSBhbnkgY2FsbCBtYWRlIGFmdGVyIHRoZSBnZXRXcml0ZXIgaGFzIGJlZW4gaW52b2tlZAorICAgICAgICAvLyBUaGUgZGVmYXVsdCBzaG91bGQgYmUgdXNlZAorICAgICAgICBpZiAodXNpbmdXcml0ZXIpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgY295b3RlUmVzcG9uc2Uuc2V0Q2hhcmFjdGVyRW5jb2RpbmcoY2hhcnNldCk7CisgICAgICAgIGlzQ2hhcmFjdGVyRW5jb2RpbmdTZXQgPSB0cnVlOworICAgIH0KKworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgTG9jYWxlIHRoYXQgaXMgYXBwcm9wcmlhdGUgZm9yIHRoaXMgcmVzcG9uc2UsIGluY2x1ZGluZworICAgICAqIHNldHRpbmcgdGhlIGFwcHJvcHJpYXRlIGNoYXJhY3RlciBlbmNvZGluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsb2NhbGUgVGhlIG5ldyBsb2NhbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMb2NhbGUoTG9jYWxlIGxvY2FsZSkgeworCisgICAgICAgIGlmIChpc0NvbW1pdHRlZCgpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8vIElnbm9yZSBhbnkgY2FsbCBmcm9tIGFuIGluY2x1ZGVkIHNlcnZsZXQKKyAgICAgICAgaWYgKGluY2x1ZGVkKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGNveW90ZVJlc3BvbnNlLnNldExvY2FsZShsb2NhbGUpOworCisgICAgICAgIC8vIElnbm9yZSBhbnkgY2FsbCBtYWRlIGFmdGVyIHRoZSBnZXRXcml0ZXIgaGFzIGJlZW4gaW52b2tlZC4KKyAgICAgICAgLy8gVGhlIGRlZmF1bHQgc2hvdWxkIGJlIHVzZWQKKyAgICAgICAgaWYgKHVzaW5nV3JpdGVyKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGlmIChpc0NoYXJhY3RlckVuY29kaW5nU2V0KSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBDaGFyc2V0TWFwcGVyIGNtID0gZ2V0Q29udGV4dCgpLmdldENoYXJzZXRNYXBwZXIoKTsKKyAgICAgICAgU3RyaW5nIGNoYXJzZXQgPSBjbS5nZXRDaGFyc2V0KCBsb2NhbGUgKTsKKyAgICAgICAgaWYgKCBjaGFyc2V0ICE9IG51bGwgKXsKKyAgICAgICAgICAgIGNveW90ZVJlc3BvbnNlLnNldENoYXJhY3RlckVuY29kaW5nKGNoYXJzZXQpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBIdHRwUmVzcG9uc2UgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYW4gYXJyYXkgb2YgYWxsIGNvb2tpZXMgc2V0IGZvciB0aGlzIHJlc3BvbnNlLCBvcgorICAgICAqIGEgemVyby1sZW5ndGggYXJyYXkgaWYgbm8gY29va2llcyBoYXZlIGJlZW4gc2V0LgorICAgICAqLworICAgIHB1YmxpYyBDb29raWVbXSBnZXRDb29raWVzKCkgeworICAgICAgICByZXR1cm4gKChDb29raWVbXSkgY29va2llcy50b0FycmF5KG5ldyBDb29raWVbY29va2llcy5zaXplKCldKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIGhlYWRlciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcworICAgICAqIGhlYWRlciBoYXMgbm90IGJlZW4gc2V0LiAgSWYgbW9yZSB0aGFuIG9uZSB2YWx1ZSB3YXMgYWRkZWQgZm9yIHRoaXMKKyAgICAgKiBuYW1lLCBvbmx5IHRoZSBmaXJzdCBpcyByZXR1cm5lZDsgdXNlIGdldEhlYWRlclZhbHVlcygpIHRvIHJldHJpZXZlIGFsbAorICAgICAqIG9mIHRoZW0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBIZWFkZXIgbmFtZSB0byBsb29rIHVwCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRIZWFkZXIoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIGNveW90ZVJlc3BvbnNlLmdldE1pbWVIZWFkZXJzKCkuZ2V0SGVhZGVyKG5hbWUpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGFuIGFycmF5IG9mIGFsbCB0aGUgaGVhZGVyIG5hbWVzIHNldCBmb3IgdGhpcyByZXNwb25zZSwgb3IKKyAgICAgKiBhIHplcm8tbGVuZ3RoIGFycmF5IGlmIG5vIGhlYWRlcnMgaGF2ZSBiZWVuIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0SGVhZGVyTmFtZXMoKSB7CisKKyAgICAgICAgTWltZUhlYWRlcnMgaGVhZGVycyA9IGNveW90ZVJlc3BvbnNlLmdldE1pbWVIZWFkZXJzKCk7CisgICAgICAgIGludCBuID0gaGVhZGVycy5zaXplKCk7CisgICAgICAgIFN0cmluZ1tdIHJlc3VsdCA9IG5ldyBTdHJpbmdbbl07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICByZXN1bHRbaV0gPSBoZWFkZXJzLmdldE5hbWUoaSkudG9TdHJpbmcoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYW4gYXJyYXkgb2YgYWxsIHRoZSBoZWFkZXIgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUKKyAgICAgKiBzcGVjaWZpZWQgaGVhZGVyIG5hbWUsIG9yIGFuIHplcm8tbGVuZ3RoIGFycmF5IGlmIHRoZXJlIGFyZSBubyBzdWNoCisgICAgICogaGVhZGVyIHZhbHVlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIEhlYWRlciBuYW1lIHRvIGxvb2sgdXAKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0SGVhZGVyVmFsdWVzKFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgRW51bWVyYXRpb24gZW51bWVyYXRpb24gPSBjb3lvdGVSZXNwb25zZS5nZXRNaW1lSGVhZGVycygpLnZhbHVlcyhuYW1lKTsKKyAgICAgICAgVmVjdG9yIHJlc3VsdCA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgd2hpbGUgKGVudW1lcmF0aW9uLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICByZXN1bHQuYWRkRWxlbWVudChlbnVtZXJhdGlvbi5uZXh0RWxlbWVudCgpKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmdbXSByZXN1bHRBcnJheSA9IG5ldyBTdHJpbmdbcmVzdWx0LnNpemUoKV07CisgICAgICAgIHJlc3VsdC5jb3B5SW50byhyZXN1bHRBcnJheSk7CisgICAgICAgIHJldHVybiByZXN1bHRBcnJheTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBlcnJvciBtZXNzYWdlIHRoYXQgd2FzIHNldCB3aXRoIDxjb2RlPnNlbmRFcnJvcigpPC9jb2RlPgorICAgICAqIGZvciB0aGlzIFJlc3BvbnNlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKKyAgICAgICAgcmV0dXJuIGNveW90ZVJlc3BvbnNlLmdldE1lc3NhZ2UoKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgSFRUUCBzdGF0dXMgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBSZXNwb25zZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFN0YXR1cygpIHsKKyAgICAgICAgcmV0dXJuIGNveW90ZVJlc3BvbnNlLmdldFN0YXR1cygpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVzZXQgdGhpcyByZXNwb25zZSwgYW5kIHNwZWNpZnkgdGhlIHZhbHVlcyBmb3IgdGhlIEhUVFAgc3RhdHVzIGNvZGUKKyAgICAgKiBhbmQgY29ycmVzcG9uZGluZyBtZXNzYWdlLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhpcyByZXNwb25zZSBoYXMgYWxyZWFkeSBiZWVuCisgICAgICogIGNvbW1pdHRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlc2V0KGludCBzdGF0dXMsIFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgIHJlc2V0KCk7CisgICAgICAgIHNldFN0YXR1cyhzdGF0dXMsIG1lc3NhZ2UpOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSHR0cFNlcnZsZXRSZXNwb25zZSBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIEFkZCB0aGUgc3BlY2lmaWVkIENvb2tpZSB0byB0aG9zZSB0aGF0IHdpbGwgYmUgaW5jbHVkZWQgd2l0aAorICAgICAqIHRoaXMgUmVzcG9uc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29va2llIENvb2tpZSB0byBiZSBhZGRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZENvb2tpZShmaW5hbCBDb29raWUgY29va2llKSB7CisKKyAgICAgICAgaWYgKGlzQ29tbWl0dGVkKCkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgLy8gSWdub3JlIGFueSBjYWxsIGZyb20gYW4gaW5jbHVkZWQgc2VydmxldAorICAgICAgICBpZiAoaW5jbHVkZWQpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgY29va2llcy5hZGQoY29va2llKTsKKworICAgICAgICBmaW5hbCBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGlmIChTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7CisgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKXsKKyAgICAgICAgICAgICAgICAgICAgU2VydmVyQ29va2llLmFwcGVuZENvb2tpZVZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAoc2IsIGNvb2tpZS5nZXRWZXJzaW9uKCksIGNvb2tpZS5nZXROYW1lKCksIAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvb2tpZS5nZXRWYWx1ZSgpLCBjb29raWUuZ2V0UGF0aCgpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb29raWUuZ2V0RG9tYWluKCksIGNvb2tpZS5nZXRDb21tZW50KCksIAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvb2tpZS5nZXRNYXhBZ2UoKSwgY29va2llLmdldFNlY3VyZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBTZXJ2ZXJDb29raWUuYXBwZW5kQ29va2llVmFsdWUKKyAgICAgICAgICAgICAgICAoc2IsIGNvb2tpZS5nZXRWZXJzaW9uKCksIGNvb2tpZS5nZXROYW1lKCksIGNvb2tpZS5nZXRWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgY29va2llLmdldFBhdGgoKSwgY29va2llLmdldERvbWFpbigpLCBjb29raWUuZ2V0Q29tbWVudCgpLCAKKyAgICAgICAgICAgICAgICAgICAgIGNvb2tpZS5nZXRNYXhBZ2UoKSwgY29va2llLmdldFNlY3VyZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRoZSBoZWFkZXIgbmFtZSBpcyBTZXQtQ29va2llIGZvciBib3RoICJvbGQiIGFuZCB2LjEgKCBSRkMyMTA5ICkKKyAgICAgICAgLy8gUkZDMjk2NSBpcyBub3Qgc3VwcG9ydGVkIGJ5IGJyb3dzZXJzIGFuZCB0aGUgU2VydmxldCBzcGVjCisgICAgICAgIC8vIGFza3MgZm9yIDIxMDkuCisgICAgICAgIGFkZEhlYWRlcigiU2V0LUNvb2tpZSIsIHNiLnRvU3RyaW5nKCkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBZGQgdGhlIHNwZWNpZmllZCBkYXRlIGhlYWRlciB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgaGVhZGVyIHRvIHNldAorICAgICAqIEBwYXJhbSB2YWx1ZSBEYXRlIHZhbHVlIHRvIGJlIHNldAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZERhdGVIZWFkZXIoU3RyaW5nIG5hbWUsIGxvbmcgdmFsdWUpIHsKKworICAgICAgICBpZiAoaXNDb21taXR0ZWQoKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvLyBJZ25vcmUgYW55IGNhbGwgZnJvbSBhbiBpbmNsdWRlZCBzZXJ2bGV0CisgICAgICAgIGlmIChpbmNsdWRlZCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZvcm1hdCA9PSBudWxsKSB7CisgICAgICAgICAgICBmb3JtYXQgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdChEYXRlVG9vbC5IVFRQX1JFU1BPTlNFX0RBVEVfSEVBREVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxlLlVTKTsKKyAgICAgICAgICAgIGZvcm1hdC5zZXRUaW1lWm9uZShUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01UIikpOworICAgICAgICB9CisKKyAgICAgICAgYWRkSGVhZGVyKG5hbWUsIEZhc3RIdHRwRGF0ZUZvcm1hdC5mb3JtYXREYXRlKHZhbHVlLCBmb3JtYXQpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQWRkIHRoZSBzcGVjaWZpZWQgaGVhZGVyIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBoZWFkZXIgdG8gc2V0CisgICAgICogQHBhcmFtIHZhbHVlIFZhbHVlIHRvIGJlIHNldAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEhlYWRlcihTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7CisKKyAgICAgICAgaWYgKGlzQ29tbWl0dGVkKCkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgLy8gSWdub3JlIGFueSBjYWxsIGZyb20gYW4gaW5jbHVkZWQgc2VydmxldAorICAgICAgICBpZiAoaW5jbHVkZWQpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgY295b3RlUmVzcG9uc2UuYWRkSGVhZGVyKG5hbWUsIHZhbHVlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQWRkIHRoZSBzcGVjaWZpZWQgaW50ZWdlciBoZWFkZXIgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIGhlYWRlciB0byBzZXQKKyAgICAgKiBAcGFyYW0gdmFsdWUgSW50ZWdlciB2YWx1ZSB0byBiZSBzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRJbnRIZWFkZXIoU3RyaW5nIG5hbWUsIGludCB2YWx1ZSkgeworCisgICAgICAgIGlmIChpc0NvbW1pdHRlZCgpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8vIElnbm9yZSBhbnkgY2FsbCBmcm9tIGFuIGluY2x1ZGVkIHNlcnZsZXQKKyAgICAgICAgaWYgKGluY2x1ZGVkKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGFkZEhlYWRlcihuYW1lLCAiIiArIHZhbHVlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogSGFzIHRoZSBzcGVjaWZpZWQgaGVhZGVyIGJlZW4gc2V0IGFscmVhZHkgaW4gdGhpcyByZXNwb25zZT8KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIGhlYWRlciB0byBjaGVjaworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zSGVhZGVyKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHJldHVybiBjb3lvdGVSZXNwb25zZS5jb250YWluc0hlYWRlcihuYW1lKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEVuY29kZSB0aGUgc2Vzc2lvbiBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJlc3BvbnNlCisgICAgICogaW50byB0aGUgc3BlY2lmaWVkIHJlZGlyZWN0IFVSTCwgaWYgbmVjZXNzYXJ5LgorICAgICAqCisgICAgICogQHBhcmFtIHVybCBVUkwgdG8gYmUgZW5jb2RlZAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZW5jb2RlUmVkaXJlY3RVUkwoU3RyaW5nIHVybCkgeworCisgICAgICAgIGlmIChpc0VuY29kZWFibGUodG9BYnNvbHV0ZSh1cmwpKSkgeworICAgICAgICAgICAgcmV0dXJuICh0b0VuY29kZWQodXJsLCByZXF1ZXN0LmdldFNlc3Npb24oKS5nZXRJZCgpKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gKHVybCk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogRW5jb2RlIHRoZSBzZXNzaW9uIGlkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmVzcG9uc2UKKyAgICAgKiBpbnRvIHRoZSBzcGVjaWZpZWQgcmVkaXJlY3QgVVJMLCBpZiBuZWNlc3NhcnkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJsIFVSTCB0byBiZSBlbmNvZGVkCisgICAgICoKKyAgICAgKiBAZGVwcmVjYXRlZCBBcyBvZiBWZXJzaW9uIDIuMSBvZiB0aGUgSmF2YSBTZXJ2bGV0IEFQSSwgdXNlCisgICAgICogIDxjb2RlPmVuY29kZVJlZGlyZWN0VVJMKCk8L2NvZGU+IGluc3RlYWQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBlbmNvZGVSZWRpcmVjdFVybChTdHJpbmcgdXJsKSB7CisgICAgICAgIHJldHVybiAoZW5jb2RlUmVkaXJlY3RVUkwodXJsKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBFbmNvZGUgdGhlIHNlc3Npb24gaWRlbnRpZmllciBhc3NvY2lhdGVkIHdpdGggdGhpcyByZXNwb25zZQorICAgICAqIGludG8gdGhlIHNwZWNpZmllZCBVUkwsIGlmIG5lY2Vzc2FyeS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmwgVVJMIHRvIGJlIGVuY29kZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGVuY29kZVVSTChTdHJpbmcgdXJsKSB7CisgICAgICAgIAorICAgICAgICBTdHJpbmcgYWJzb2x1dGUgPSB0b0Fic29sdXRlKHVybCk7CisgICAgICAgIGlmIChpc0VuY29kZWFibGUoYWJzb2x1dGUpKSB7CisgICAgICAgICAgICAvLyBXM2Mgc3BlYyBjbGVhcmx5IHNhaWQgCisgICAgICAgICAgICBpZiAodXJsLmVxdWFsc0lnbm9yZUNhc2UoIiIpKXsKKyAgICAgICAgICAgICAgICB1cmwgPSBhYnNvbHV0ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAodG9FbmNvZGVkKHVybCwgcmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0SWQoKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuICh1cmwpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEVuY29kZSB0aGUgc2Vzc2lvbiBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJlc3BvbnNlCisgICAgICogaW50byB0aGUgc3BlY2lmaWVkIFVSTCwgaWYgbmVjZXNzYXJ5LgorICAgICAqCisgICAgICogQHBhcmFtIHVybCBVUkwgdG8gYmUgZW5jb2RlZAorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQgQXMgb2YgVmVyc2lvbiAyLjEgb2YgdGhlIEphdmEgU2VydmxldCBBUEksIHVzZQorICAgICAqICA8Y29kZT5lbmNvZGVVUkwoKTwvY29kZT4gaW5zdGVhZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGVuY29kZVVybChTdHJpbmcgdXJsKSB7CisgICAgICAgIHJldHVybiAoZW5jb2RlVVJMKHVybCkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2VuZCBhbiBhY2tub3dsZWRnbWVudCBvZiBhIHJlcXVlc3QuCisgICAgICogCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2VuZEFja25vd2xlZGdlbWVudCgpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKGlzQ29tbWl0dGVkKCkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgLy8gSWdub3JlIGFueSBjYWxsIGZyb20gYW4gaW5jbHVkZWQgc2VydmxldAorICAgICAgICBpZiAoaW5jbHVkZWQpCisgICAgICAgICAgICByZXR1cm47IAorCisgICAgICAgIGNveW90ZVJlc3BvbnNlLmFja25vd2xlZGdlKCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNlbmQgYW4gZXJyb3IgcmVzcG9uc2Ugd2l0aCB0aGUgc3BlY2lmaWVkIHN0YXR1cyBhbmQgYQorICAgICAqIGRlZmF1bHQgbWVzc2FnZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdGF0dXMgSFRUUCBzdGF0dXMgY29kZSB0byBzZW5kCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGlzIHJlc3BvbnNlIGhhcworICAgICAqICBhbHJlYWR5IGJlZW4gY29tbWl0dGVkCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2VuZEVycm9yKGludCBzdGF0dXMpIAorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBzZW5kRXJyb3Ioc3RhdHVzLCBudWxsKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNlbmQgYW4gZXJyb3IgcmVzcG9uc2Ugd2l0aCB0aGUgc3BlY2lmaWVkIHN0YXR1cyBhbmQgbWVzc2FnZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdGF0dXMgSFRUUCBzdGF0dXMgY29kZSB0byBzZW5kCisgICAgICogQHBhcmFtIG1lc3NhZ2UgQ29ycmVzcG9uZGluZyBtZXNzYWdlIHRvIHNlbmQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoaXMgcmVzcG9uc2UgaGFzCisgICAgICogIGFscmVhZHkgYmVlbiBjb21taXR0ZWQKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZW5kRXJyb3IoaW50IHN0YXR1cywgU3RyaW5nIG1lc3NhZ2UpIAorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIGlmIChpc0NvbW1pdHRlZCgpKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoImNveW90ZVJlc3BvbnNlLnNlbmRFcnJvci5pc2UiKSk7CisKKyAgICAgICAgLy8gSWdub3JlIGFueSBjYWxsIGZyb20gYW4gaW5jbHVkZWQgc2VydmxldAorICAgICAgICBpZiAoaW5jbHVkZWQpCisgICAgICAgICAgICByZXR1cm47IAorCisgICAgICAgIFdyYXBwZXIgd3JhcHBlciA9IGdldFJlcXVlc3QoKS5nZXRXcmFwcGVyKCk7CisgICAgICAgIGlmICh3cmFwcGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHdyYXBwZXIuaW5jcmVtZW50RXJyb3JDb3VudCgpOworICAgICAgICB9IAorCisgICAgICAgIHNldEVycm9yKCk7CisKKyAgICAgICAgY295b3RlUmVzcG9uc2Uuc2V0U3RhdHVzKHN0YXR1cyk7CisgICAgICAgIGNveW90ZVJlc3BvbnNlLnNldE1lc3NhZ2UobWVzc2FnZSk7CisKKyAgICAgICAgLy8gQ2xlYXIgYW55IGRhdGEgY29udGVudCB0aGF0IGhhcyBiZWVuIGJ1ZmZlcmVkCisgICAgICAgIHJlc2V0QnVmZmVyKCk7CisKKyAgICAgICAgLy8gQ2F1c2UgdGhlIHJlc3BvbnNlIHRvIGJlIGZpbmlzaGVkIChmcm9tIHRoZSBhcHBsaWNhdGlvbiBwZXJzcGVjdGl2ZSkKKyAgICAgICAgc2V0U3VzcGVuZGVkKHRydWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZW5kIGEgdGVtcG9yYXJ5IHJlZGlyZWN0IHRvIHRoZSBzcGVjaWZpZWQgcmVkaXJlY3QgbG9jYXRpb24gVVJMLgorICAgICAqCisgICAgICogQHBhcmFtIGxvY2F0aW9uIExvY2F0aW9uIFVSTCB0byByZWRpcmVjdCB0bworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhpcyByZXNwb25zZSBoYXMKKyAgICAgKiAgYWxyZWFkeSBiZWVuIGNvbW1pdHRlZAorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNlbmRSZWRpcmVjdChTdHJpbmcgbG9jYXRpb24pIAorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIGlmIChpc0NvbW1pdHRlZCgpKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoImNveW90ZVJlc3BvbnNlLnNlbmRSZWRpcmVjdC5pc2UiKSk7CisKKyAgICAgICAgLy8gSWdub3JlIGFueSBjYWxsIGZyb20gYW4gaW5jbHVkZWQgc2VydmxldAorICAgICAgICBpZiAoaW5jbHVkZWQpCisgICAgICAgICAgICByZXR1cm47IAorCisgICAgICAgIC8vIENsZWFyIGFueSBkYXRhIGNvbnRlbnQgdGhhdCBoYXMgYmVlbiBidWZmZXJlZAorICAgICAgICByZXNldEJ1ZmZlcigpOworCisgICAgICAgIC8vIEdlbmVyYXRlIGEgdGVtcG9yYXJ5IHJlZGlyZWN0IHRvIHRoZSBzcGVjaWZpZWQgbG9jYXRpb24KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN0cmluZyBhYnNvbHV0ZSA9IHRvQWJzb2x1dGUobG9jYXRpb24pOworICAgICAgICAgICAgc2V0U3RhdHVzKFNDX0ZPVU5EKTsKKyAgICAgICAgICAgIHNldEhlYWRlcigiTG9jYXRpb24iLCBhYnNvbHV0ZSk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBzZXRTdGF0dXMoU0NfTk9UX0ZPVU5EKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENhdXNlIHRoZSByZXNwb25zZSB0byBiZSBmaW5pc2hlZCAoZnJvbSB0aGUgYXBwbGljYXRpb24gcGVyc3BlY3RpdmUpCisgICAgICAgIHNldFN1c3BlbmRlZCh0cnVlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzcGVjaWZpZWQgZGF0ZSBoZWFkZXIgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIGhlYWRlciB0byBzZXQKKyAgICAgKiBAcGFyYW0gdmFsdWUgRGF0ZSB2YWx1ZSB0byBiZSBzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREYXRlSGVhZGVyKFN0cmluZyBuYW1lLCBsb25nIHZhbHVlKSB7CisKKyAgICAgICAgaWYgKGlzQ29tbWl0dGVkKCkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgLy8gSWdub3JlIGFueSBjYWxsIGZyb20gYW4gaW5jbHVkZWQgc2VydmxldAorICAgICAgICBpZiAoaW5jbHVkZWQpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChmb3JtYXQgPT0gbnVsbCkgeworICAgICAgICAgICAgZm9ybWF0ID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoRGF0ZVRvb2wuSFRUUF9SRVNQT05TRV9EQVRFX0hFQURFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsZS5VUyk7CisgICAgICAgICAgICBmb3JtYXQuc2V0VGltZVpvbmUoVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVCIpKTsKKyAgICAgICAgfQorCisgICAgICAgIHNldEhlYWRlcihuYW1lLCBGYXN0SHR0cERhdGVGb3JtYXQuZm9ybWF0RGF0ZSh2YWx1ZSwgZm9ybWF0KSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgc3BlY2lmaWVkIGhlYWRlciB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgaGVhZGVyIHRvIHNldAorICAgICAqIEBwYXJhbSB2YWx1ZSBWYWx1ZSB0byBiZSBzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRIZWFkZXIoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgeworCisgICAgICAgIGlmIChpc0NvbW1pdHRlZCgpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8vIElnbm9yZSBhbnkgY2FsbCBmcm9tIGFuIGluY2x1ZGVkIHNlcnZsZXQKKyAgICAgICAgaWYgKGluY2x1ZGVkKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGNveW90ZVJlc3BvbnNlLnNldEhlYWRlcihuYW1lLCB2YWx1ZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgc3BlY2lmaWVkIGludGVnZXIgaGVhZGVyIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBoZWFkZXIgdG8gc2V0CisgICAgICogQHBhcmFtIHZhbHVlIEludGVnZXIgdmFsdWUgdG8gYmUgc2V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SW50SGVhZGVyKFN0cmluZyBuYW1lLCBpbnQgdmFsdWUpIHsKKworICAgICAgICBpZiAoaXNDb21taXR0ZWQoKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvLyBJZ25vcmUgYW55IGNhbGwgZnJvbSBhbiBpbmNsdWRlZCBzZXJ2bGV0CisgICAgICAgIGlmIChpbmNsdWRlZCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBzZXRIZWFkZXIobmFtZSwgIiIgKyB2YWx1ZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgSFRUUCBzdGF0dXMgdG8gYmUgcmV0dXJuZWQgd2l0aCB0aGlzIHJlc3BvbnNlLgorICAgICAqCisgICAgICogQHBhcmFtIHN0YXR1cyBUaGUgbmV3IEhUVFAgc3RhdHVzCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3RhdHVzKGludCBzdGF0dXMpIHsKKyAgICAgICAgc2V0U3RhdHVzKHN0YXR1cywgbnVsbCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIEhUVFAgc3RhdHVzIGFuZCBtZXNzYWdlIHRvIGJlIHJldHVybmVkIHdpdGggdGhpcyByZXNwb25zZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdGF0dXMgVGhlIG5ldyBIVFRQIHN0YXR1cworICAgICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBhc3NvY2lhdGVkIHRleHQgbWVzc2FnZQorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQgQXMgb2YgVmVyc2lvbiAyLjEgb2YgdGhlIEphdmEgU2VydmxldCBBUEksIHRoaXMgbWV0aG9kCisgICAgICogIGhhcyBiZWVuIGRlcHJlY2F0ZWQgZHVlIHRvIHRoZSBhbWJpZ3VvdXMgbWVhbmluZyBvZiB0aGUgbWVzc2FnZQorICAgICAqICBwYXJhbWV0ZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3RhdHVzKGludCBzdGF0dXMsIFN0cmluZyBtZXNzYWdlKSB7CisKKyAgICAgICAgaWYgKGlzQ29tbWl0dGVkKCkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgLy8gSWdub3JlIGFueSBjYWxsIGZyb20gYW4gaW5jbHVkZWQgc2VydmxldAorICAgICAgICBpZiAoaW5jbHVkZWQpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgY295b3RlUmVzcG9uc2Uuc2V0U3RhdHVzKHN0YXR1cyk7CisgICAgICAgIGNveW90ZVJlc3BvbnNlLnNldE1lc3NhZ2UobWVzc2FnZSk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm90ZWN0ZWQgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCBVUkwgc2hvdWxkIGJlIGVuY29kZWQgd2l0aAorICAgICAqIGEgc2Vzc2lvbiBpZGVudGlmaWVyLiAgVGhpcyB3aWxsIGJlIHRydWUgaWYgYWxsIG9mIHRoZSBmb2xsb3dpbmcKKyAgICAgKiBjb25kaXRpb25zIGFyZSBtZXQ6CisgICAgICogPHVsPgorICAgICAqIDxsaT5UaGUgcmVxdWVzdCB3ZSBhcmUgcmVzcG9uZGluZyB0byBhc2tlZCBmb3IgYSB2YWxpZCBzZXNzaW9uCisgICAgICogPGxpPlRoZSByZXF1ZXN0ZWQgc2Vzc2lvbiBJRCB3YXMgbm90IHJlY2VpdmVkIHZpYSBhIGNvb2tpZQorICAgICAqIDxsaT5UaGUgc3BlY2lmaWVkIFVSTCBwb2ludHMgYmFjayB0byBzb21ld2hlcmUgd2l0aGluIHRoZSB3ZWIKKyAgICAgKiAgICAgYXBwbGljYXRpb24gdGhhdCBpcyByZXNwb25kaW5nIHRvIHRoaXMgcmVxdWVzdAorICAgICAqIDwvdWw+CisgICAgICoKKyAgICAgKiBAcGFyYW0gbG9jYXRpb24gQWJzb2x1dGUgVVJMIHRvIGJlIHZhbGlkYXRlZAorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGlzRW5jb2RlYWJsZShmaW5hbCBTdHJpbmcgbG9jYXRpb24pIHsKKworICAgICAgICBpZiAobG9jYXRpb24gPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAoZmFsc2UpOworCisgICAgICAgIC8vIElzIHRoaXMgYW4gaW50cmEtZG9jdW1lbnQgcmVmZXJlbmNlPworICAgICAgICBpZiAobG9jYXRpb24uc3RhcnRzV2l0aCgiIyIpKQorICAgICAgICAgICAgcmV0dXJuIChmYWxzZSk7CisKKyAgICAgICAgLy8gQXJlIHdlIGluIGEgdmFsaWQgc2Vzc2lvbiB0aGF0IGlzIG5vdCB1c2luZyBjb29raWVzPworICAgICAgICBmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgaHJlcSA9IHJlcXVlc3Q7CisgICAgICAgIGZpbmFsIEh0dHBTZXNzaW9uIHNlc3Npb24gPSBocmVxLmdldFNlc3Npb24oZmFsc2UpOworICAgICAgICBpZiAoc2Vzc2lvbiA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChmYWxzZSk7CisgICAgICAgIGlmIChocmVxLmlzUmVxdWVzdGVkU2Vzc2lvbklkRnJvbUNvb2tpZSgpKQorICAgICAgICAgICAgcmV0dXJuIChmYWxzZSk7CisgICAgICAgIAorICAgICAgICBpZiAoU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiAoKEJvb2xlYW4pCisgICAgICAgICAgICAgICAgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7CisKKyAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEJvb2xlYW4oZG9Jc0VuY29kZWFibGUoaHJlcSwgc2Vzc2lvbiwgbG9jYXRpb24pKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KSkuYm9vbGVhblZhbHVlKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZG9Jc0VuY29kZWFibGUoaHJlcSwgc2Vzc2lvbiwgbG9jYXRpb24pOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGRvSXNFbmNvZGVhYmxlKEh0dHBTZXJ2bGV0UmVxdWVzdCBocmVxLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlc3Npb24gc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxvY2F0aW9uKXsKKyAgICAgICAgLy8gSXMgdGhpcyBhIHZhbGlkIGFic29sdXRlIFVSTD8KKyAgICAgICAgVVJMIHVybCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB1cmwgPSBuZXcgVVJMKGxvY2F0aW9uKTsKKyAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiAoZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgLy8gRG9lcyB0aGlzIFVSTCBtYXRjaCBkb3duIHRvIChhbmQgaW5jbHVkaW5nKSB0aGUgY29udGV4dCBwYXRoPworICAgICAgICBpZiAoIWhyZXEuZ2V0U2NoZW1lKCkuZXF1YWxzSWdub3JlQ2FzZSh1cmwuZ2V0UHJvdG9jb2woKSkpCisgICAgICAgICAgICByZXR1cm4gKGZhbHNlKTsKKyAgICAgICAgaWYgKCFocmVxLmdldFNlcnZlck5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKHVybC5nZXRIb3N0KCkpKQorICAgICAgICAgICAgcmV0dXJuIChmYWxzZSk7CisgICAgICAgIGludCBzZXJ2ZXJQb3J0ID0gaHJlcS5nZXRTZXJ2ZXJQb3J0KCk7CisgICAgICAgIGlmIChzZXJ2ZXJQb3J0ID09IC0xKSB7CisgICAgICAgICAgICBpZiAoImh0dHBzIi5lcXVhbHMoaHJlcS5nZXRTY2hlbWUoKSkpCisgICAgICAgICAgICAgICAgc2VydmVyUG9ydCA9IDQ0MzsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBzZXJ2ZXJQb3J0ID0gODA7CisgICAgICAgIH0KKyAgICAgICAgaW50IHVybFBvcnQgPSB1cmwuZ2V0UG9ydCgpOworICAgICAgICBpZiAodXJsUG9ydCA9PSAtMSkgeworICAgICAgICAgICAgaWYgKCJodHRwcyIuZXF1YWxzKHVybC5nZXRQcm90b2NvbCgpKSkKKyAgICAgICAgICAgICAgICB1cmxQb3J0ID0gNDQzOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHVybFBvcnQgPSA4MDsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2VydmVyUG9ydCAhPSB1cmxQb3J0KQorICAgICAgICAgICAgcmV0dXJuIChmYWxzZSk7CisKKyAgICAgICAgU3RyaW5nIGNvbnRleHRQYXRoID0gZ2V0Q29udGV4dCgpLmdldFBhdGgoKTsKKyAgICAgICAgaWYgKGNvbnRleHRQYXRoICE9IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZyBmaWxlID0gdXJsLmdldEZpbGUoKTsKKyAgICAgICAgICAgIGlmICgoZmlsZSA9PSBudWxsKSB8fCAhZmlsZS5zdGFydHNXaXRoKGNvbnRleHRQYXRoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKGZhbHNlKTsKKyAgICAgICAgICAgIGlmKCBmaWxlLmluZGV4T2YoIjtqc2Vzc2lvbmlkPSIgKyBzZXNzaW9uLmdldElkKCkpID49IDAgKQorICAgICAgICAgICAgICAgIHJldHVybiAoZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgLy8gVGhpcyBVUkwgYmVsb25ncyB0byBvdXIgd2ViIGFwcGxpY2F0aW9uLCBzbyBpdCBpcyBlbmNvZGVhYmxlCisgICAgICAgIHJldHVybiAodHJ1ZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvbnZlcnQgKGlmIG5lY2Vzc2FyeSkgYW5kIHJldHVybiB0aGUgYWJzb2x1dGUgVVJMIHRoYXQgcmVwcmVzZW50cyB0aGUKKyAgICAgKiByZXNvdXJjZSByZWZlcmVuY2VkIGJ5IHRoaXMgcG9zc2libHkgcmVsYXRpdmUgVVJMLiAgSWYgdGhpcyBVUkwgaXMKKyAgICAgKiBhbHJlYWR5IGFic29sdXRlLCByZXR1cm4gaXQgdW5jaGFuZ2VkLgorICAgICAqCisgICAgICogQHBhcmFtIGxvY2F0aW9uIFVSTCB0byBiZSAocG9zc2libHkpIGNvbnZlcnRlZCBhbmQgdGhlbiByZXR1cm5lZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgYSBNYWxmb3JtZWRVUkxFeGNlcHRpb24gaXMKKyAgICAgKiAgdGhyb3duIHdoZW4gY29udmVydGluZyB0aGUgcmVsYXRpdmUgVVJMIHRvIGFuIGFic29sdXRlIG9uZQorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHRvQWJzb2x1dGUoU3RyaW5nIGxvY2F0aW9uKSB7CisKKyAgICAgICAgaWYgKGxvY2F0aW9uID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKGxvY2F0aW9uKTsKKworICAgICAgICBib29sZWFuIGxlYWRpbmdTbGFzaCA9IGxvY2F0aW9uLnN0YXJ0c1dpdGgoIi8iKTsKKworICAgICAgICBpZiAobGVhZGluZ1NsYXNoIHx8ICFoYXNTY2hlbWUobG9jYXRpb24pKSB7CisKKyAgICAgICAgICAgIHJlZGlyZWN0VVJMQ0MucmVjeWNsZSgpOworCisgICAgICAgICAgICBTdHJpbmcgc2NoZW1lID0gcmVxdWVzdC5nZXRTY2hlbWUoKTsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gcmVxdWVzdC5nZXRTZXJ2ZXJOYW1lKCk7CisgICAgICAgICAgICBpbnQgcG9ydCA9IHJlcXVlc3QuZ2V0U2VydmVyUG9ydCgpOworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJlZGlyZWN0VVJMQ0MuYXBwZW5kKHNjaGVtZSwgMCwgc2NoZW1lLmxlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICByZWRpcmVjdFVSTENDLmFwcGVuZCgiOi8vIiwgMCwgMyk7CisgICAgICAgICAgICAgICAgcmVkaXJlY3RVUkxDQy5hcHBlbmQobmFtZSwgMCwgbmFtZS5sZW5ndGgoKSk7CisgICAgICAgICAgICAgICAgaWYgKChzY2hlbWUuZXF1YWxzKCJodHRwIikgJiYgcG9ydCAhPSA4MCkKKyAgICAgICAgICAgICAgICAgICAgfHwgKHNjaGVtZS5lcXVhbHMoImh0dHBzIikgJiYgcG9ydCAhPSA0NDMpKSB7CisgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0VVJMQ0MuYXBwZW5kKCc6Jyk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwb3J0UyA9IHBvcnQgKyAiIjsKKyAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3RVUkxDQy5hcHBlbmQocG9ydFMsIDAsIHBvcnRTLmxlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFsZWFkaW5nU2xhc2gpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlbGF0aXZlUGF0aCA9IHJlcXVlc3QuZ2V0RGVjb2RlZFJlcXVlc3RVUkkoKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IHBvcyA9IHJlbGF0aXZlUGF0aC5sYXN0SW5kZXhPZignLycpOworICAgICAgICAgICAgICAgICAgICByZWxhdGl2ZVBhdGggPSByZWxhdGl2ZVBhdGguc3Vic3RyaW5nKDAsIHBvcyk7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZW5jb2RlZFVSSSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBmcmVsYXRpdmVQYXRoID0gcmVsYXRpdmVQYXRoOworICAgICAgICAgICAgICAgICAgICBpZiAoU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpICE9IG51bGwgKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVkVVJJID0gKFN0cmluZylBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCggCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKCl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgdGhyb3dzIElPRXhjZXB0aW9ueworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1cmxFbmNvZGVyLmVuY29kZVVSTChmcmVsYXRpdmVQYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOyAgIAorICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBwYWUpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGxvY2F0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqZGtDb21wYXQuY2hhaW5FeGNlcHRpb24oaWFlLCBwYWUuZ2V0RXhjZXB0aW9uKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGlhZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZWRVUkkgPSB1cmxFbmNvZGVyLmVuY29kZVVSTChyZWxhdGl2ZVBhdGgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0VVJMQ0MuYXBwZW5kKGVuY29kZWRVUkksIDAsIGVuY29kZWRVUkkubGVuZ3RoKCkpOworICAgICAgICAgICAgICAgICAgICByZWRpcmVjdFVSTENDLmFwcGVuZCgnLycpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZWRpcmVjdFVSTENDLmFwcGVuZChsb2NhdGlvbiwgMCwgbG9jYXRpb24ubGVuZ3RoKCkpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUgPQorICAgICAgICAgICAgICAgICAgICBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGxvY2F0aW9uKTsKKyAgICAgICAgICAgICAgICBqZGtDb21wYXQuY2hhaW5FeGNlcHRpb24oaWFlLCBlKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBpYWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiByZWRpcmVjdFVSTENDLnRvU3RyaW5nKCk7CisKKyAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgcmV0dXJuIChsb2NhdGlvbik7CisKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBEZXRlcm1pbmUgaWYgYSBVUkkgc3RyaW5nIGhhcyBhIDxjb2RlPnNjaGVtZTwvY29kZT4gY29tcG9uZW50LgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBoYXNTY2hlbWUoU3RyaW5nIHVyaSkgeworICAgICAgICBpbnQgbGVuID0gdXJpLmxlbmd0aCgpOworICAgICAgICBmb3IoaW50IGk9MDsgaSA8IGxlbiA7IGkrKykgeworICAgICAgICAgICAgY2hhciBjID0gdXJpLmNoYXJBdChpKTsKKyAgICAgICAgICAgIGlmKGMgPT0gJzonKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGkgPiAwOworICAgICAgICAgICAgfSBlbHNlIGlmKCFVUkwuaXNTY2hlbWVDaGFyKGMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBVUkwgd2l0aCB0aGUgc3BlY2lmaWVkIHNlc3Npb24gaWRlbnRpZmllcgorICAgICAqIHN1aXRhYmx5IGVuY29kZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJsIFVSTCB0byBiZSBlbmNvZGVkIHdpdGggdGhlIHNlc3Npb24gaWQKKyAgICAgKiBAcGFyYW0gc2Vzc2lvbklkIFNlc3Npb24gaWQgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIGVuY29kZWQgVVJMCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyB0b0VuY29kZWQoU3RyaW5nIHVybCwgU3RyaW5nIHNlc3Npb25JZCkgeworCisgICAgICAgIGlmICgodXJsID09IG51bGwpIHx8IChzZXNzaW9uSWQgPT0gbnVsbCkpCisgICAgICAgICAgICByZXR1cm4gKHVybCk7CisKKyAgICAgICAgU3RyaW5nIHBhdGggPSB1cmw7CisgICAgICAgIFN0cmluZyBxdWVyeSA9ICIiOworICAgICAgICBTdHJpbmcgYW5jaG9yID0gIiI7CisgICAgICAgIGludCBxdWVzdGlvbiA9IHVybC5pbmRleE9mKCc/Jyk7CisgICAgICAgIGlmIChxdWVzdGlvbiA+PSAwKSB7CisgICAgICAgICAgICBwYXRoID0gdXJsLnN1YnN0cmluZygwLCBxdWVzdGlvbik7CisgICAgICAgICAgICBxdWVyeSA9IHVybC5zdWJzdHJpbmcocXVlc3Rpb24pOworICAgICAgICB9CisgICAgICAgIGludCBwb3VuZCA9IHBhdGguaW5kZXhPZignIycpOworICAgICAgICBpZiAocG91bmQgPj0gMCkgeworICAgICAgICAgICAgYW5jaG9yID0gcGF0aC5zdWJzdHJpbmcocG91bmQpOworICAgICAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKDAsIHBvdW5kKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKHBhdGgpOworICAgICAgICBpZiggc2IubGVuZ3RoKCkgPiAwICkgeyAvLyBqc2Vzc2lvbmlkIGNhbid0IGJlIGZpcnN0LgorICAgICAgICAgICAgc2IuYXBwZW5kKCI7anNlc3Npb25pZD0iKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChzZXNzaW9uSWQpOworICAgICAgICB9CisgICAgICAgIHNiLmFwcGVuZChhbmNob3IpOworICAgICAgICBzYi5hcHBlbmQocXVlcnkpOworICAgICAgICByZXR1cm4gKHNiLnRvU3RyaW5nKCkpOworCisgICAgfQorCisKK30KKwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2Nvbm5lY3Rvci9SZXNwb25zZUZhY2FkZS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2Nvbm5lY3Rvci9SZXNwb25zZUZhY2FkZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzYmRhMWUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29ubmVjdG9yL1Jlc3BvbnNlRmFjYWRlLmphdmEKQEAgLTAsMCArMSw0NjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworCitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5Db29raWU7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CisKKworLyoqCisgKiBGYWNhZGUgY2xhc3MgdGhhdCB3cmFwcyBhIENveW90ZSByZXNwb25zZSBvYmplY3QuIAorICogQWxsIG1ldGhvZHMgYXJlIGRlbGVnYXRlZCB0byB0aGUgd3JhcHBlZCByZXNwb25zZS4KKyAqCisgKiBAYXV0aG9yIFJlbXkgTWF1Y2hlcmF0CisgKiBAYXV0aG9yIEplYW4tRnJhbmNvaXMgQXJjYW5kCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKKworcHVibGljIGNsYXNzIFJlc3BvbnNlRmFjYWRlIAorICAgIGltcGxlbWVudHMgSHR0cFNlcnZsZXRSZXNwb25zZSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIERvUHJpdmlsZWdlZAorICAgIAorICAgIHByaXZhdGUgZmluYWwgY2xhc3MgU2V0Q29udGVudFR5cGVQcml2aWxlZ2VkQWN0aW9uIGltcGxlbWVudHMgUHJpdmlsZWdlZEFjdGlvbnsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgY29udGVudFR5cGU7CisgICAgICAgIHB1YmxpYyBTZXRDb250ZW50VHlwZVByaXZpbGVnZWRBY3Rpb24oU3RyaW5nIGNvbnRlbnRUeXBlKXsKKyAgICAgICAgICAgIHRoaXMuY29udGVudFR5cGUgPSBjb250ZW50VHlwZTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7CisgICAgICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZShjb250ZW50VHlwZSk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfSAgICAgICAgICAgIAorICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgY2xhc3MgRGF0ZUhlYWRlclByaXZpbGVnZWRBY3Rpb24gaW1wbGVtZW50cyBQcml2aWxlZ2VkQWN0aW9uIHsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKyAgICAgICAgcHJpdmF0ZSBsb25nIHZhbHVlOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gYWRkOworCisgICAgICAgIERhdGVIZWFkZXJQcml2aWxlZ2VkQWN0aW9uKFN0cmluZyBuYW1lLCBsb25nIHZhbHVlLCBib29sZWFuIGFkZCkgeworICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgICAgIHRoaXMuYWRkID0gYWRkOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7CisgICAgICAgICAgICBpZihhZGQpIHsKKyAgICAgICAgICAgICAgICByZXNwb25zZS5hZGREYXRlSGVhZGVyKG5hbWUsIHZhbHVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2V0RGF0ZUhlYWRlcihuYW1lLCB2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgd3JhcHBlciBmb3IgdGhlIHNwZWNpZmllZCByZXNwb25zZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgcmVzcG9uc2UgdG8gYmUgd3JhcHBlZAorICAgICAqLworICAgIHB1YmxpYyBSZXNwb25zZUZhY2FkZShSZXNwb25zZSByZXNwb25zZSkgeworCisgICAgICAgICB0aGlzLnJlc3BvbnNlID0gcmVzcG9uc2U7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgd3JhcHBlZCByZXNwb25zZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUmVzcG9uc2UgcmVzcG9uc2UgPSBudWxsOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogQ2xlYXIgZmFjYWRlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgICAgICByZXNwb25zZSA9IG51bGw7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBmaW5pc2goKSB7CisKKyAgICAgICAgcmVzcG9uc2Uuc2V0U3VzcGVuZGVkKHRydWUpOworCisgICAgfQorCisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0ZpbmlzaGVkKCkgeworCisgICAgICAgIHJldHVybiByZXNwb25zZS5pc1N1c3BlbmRlZCgpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU2VydmxldFJlc3BvbnNlIE1ldGhvZHMKKworCisgICAgcHVibGljIFN0cmluZyBnZXRDaGFyYWN0ZXJFbmNvZGluZygpIHsKKyAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmdldENoYXJhY3RlckVuY29kaW5nKCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgU2VydmxldE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIC8vICAgICAgICBpZiAoaXNGaW5pc2hlZCgpKQorICAgICAgICAvLyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgICAgLy8gICAgICAgICAgICAgICAgKC8qc20uZ2V0U3RyaW5nKCJyZXNwb25zZUZhY2FkZS5maW5pc2hlZCIpKi8pOworCisgICAgICAgIFNlcnZsZXRPdXRwdXRTdHJlYW0gc29zID0gcmVzcG9uc2UuZ2V0T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIGlmIChpc0ZpbmlzaGVkKCkpCisgICAgICAgICAgICByZXNwb25zZS5zZXRTdXNwZW5kZWQodHJ1ZSk7CisgICAgICAgIHJldHVybiAoc29zKTsKKworICAgIH0KKworCisgICAgcHVibGljIFByaW50V3JpdGVyIGdldFdyaXRlcigpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gICAgICAgIGlmIChpc0ZpbmlzaGVkKCkpCisgICAgICAgIC8vICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAgICAvLyAgICAgICAgICAgICAgICAoLypzbS5nZXRTdHJpbmcoInJlc3BvbnNlRmFjYWRlLmZpbmlzaGVkIikqLyk7CisKKyAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisgICAgICAgIGlmIChpc0ZpbmlzaGVkKCkpCisgICAgICAgICAgICByZXNwb25zZS5zZXRTdXNwZW5kZWQodHJ1ZSk7CisgICAgICAgIHJldHVybiAod3JpdGVyKTsKKworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgc2V0Q29udGVudExlbmd0aChpbnQgbGVuKSB7CisKKyAgICAgICAgaWYgKGlzQ29tbWl0dGVkKCkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudExlbmd0aChsZW4pOworCisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXRDb250ZW50VHlwZShTdHJpbmcgdHlwZSkgeworCisgICAgICAgIGlmIChpc0NvbW1pdHRlZCgpKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAKKyAgICAgICAgaWYgKFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSAhPSBudWxsKXsKKyAgICAgICAgICAgIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBTZXRDb250ZW50VHlwZVByaXZpbGVnZWRBY3Rpb24odHlwZSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUodHlwZSk7ICAgICAgICAgICAgCisgICAgICAgIH0KKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldEJ1ZmZlclNpemUoaW50IHNpemUpIHsKKworICAgICAgICBpZiAoaXNDb21taXR0ZWQoKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoLypzbS5nZXRTdHJpbmcoInJlc3BvbnNlQmFzZS5yZXNldC5pc2UiKSovKTsKKworICAgICAgICByZXNwb25zZS5zZXRCdWZmZXJTaXplKHNpemUpOworCisgICAgfQorCisKKyAgICBwdWJsaWMgaW50IGdldEJ1ZmZlclNpemUoKSB7CisgICAgICAgIHJldHVybiByZXNwb25zZS5nZXRCdWZmZXJTaXplKCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBmbHVzaEJ1ZmZlcigpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKGlzRmluaXNoZWQoKSkKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgKC8qc20uZ2V0U3RyaW5nKCJyZXNwb25zZUZhY2FkZS5maW5pc2hlZCIpKi8pOworICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGlmIChTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCkgIT0gbnVsbCl7CisgICAgICAgICAgICB0cnl7CisgICAgICAgICAgICAgICAgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oKXsKKworICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHRocm93cyBJT0V4Y2VwdGlvbnsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldEFwcENvbW1pdHRlZCh0cnVlKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuZmx1c2hCdWZmZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9IGNhdGNoKFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24gZSl7CisgICAgICAgICAgICAgICAgRXhjZXB0aW9uIGV4ID0gZS5nZXRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBJT0V4Y2VwdGlvbil7CisgICAgICAgICAgICAgICAgICAgIHRocm93IChJT0V4Y2VwdGlvbilleDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXNwb25zZS5zZXRBcHBDb21taXR0ZWQodHJ1ZSk7CisKKyAgICAgICAgICAgIHJlc3BvbnNlLmZsdXNoQnVmZmVyKCk7ICAgICAgICAgICAgCisgICAgICAgIH0KKworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgcmVzZXRCdWZmZXIoKSB7CisKKyAgICAgICAgaWYgKGlzQ29tbWl0dGVkKCkpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKC8qc20uZ2V0U3RyaW5nKCJyZXNwb25zZUJhc2UucmVzZXQuaXNlIikqLyk7CisKKyAgICAgICAgcmVzcG9uc2UucmVzZXRCdWZmZXIoKTsKKworICAgIH0KKworCisgICAgcHVibGljIGJvb2xlYW4gaXNDb21taXR0ZWQoKSB7CisgICAgICAgIHJldHVybiAocmVzcG9uc2UuaXNBcHBDb21taXR0ZWQoKSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKKworICAgICAgICBpZiAoaXNDb21taXR0ZWQoKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoLypzbS5nZXRTdHJpbmcoInJlc3BvbnNlQmFzZS5yZXNldC5pc2UiKSovKTsKKworICAgICAgICByZXNwb25zZS5yZXNldCgpOworCisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXRMb2NhbGUoTG9jYWxlIGxvYykgeworCisgICAgICAgIGlmIChpc0NvbW1pdHRlZCgpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIHJlc3BvbnNlLnNldExvY2FsZShsb2MpOworICAgIH0KKworCisgICAgcHVibGljIExvY2FsZSBnZXRMb2NhbGUoKSB7CisgICAgICAgIHJldHVybiByZXNwb25zZS5nZXRMb2NhbGUoKTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIGFkZENvb2tpZShDb29raWUgY29va2llKSB7CisKKyAgICAgICAgaWYgKGlzQ29tbWl0dGVkKCkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgcmVzcG9uc2UuYWRkQ29va2llKGNvb2tpZSk7CisKKyAgICB9CisKKworICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zSGVhZGVyKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHJldHVybiByZXNwb25zZS5jb250YWluc0hlYWRlcihuYW1lKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBTdHJpbmcgZW5jb2RlVVJMKFN0cmluZyB1cmwpIHsKKyAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmVuY29kZVVSTCh1cmwpOworICAgIH0KKworCisgICAgcHVibGljIFN0cmluZyBlbmNvZGVSZWRpcmVjdFVSTChTdHJpbmcgdXJsKSB7CisgICAgICAgIHJldHVybiByZXNwb25zZS5lbmNvZGVSZWRpcmVjdFVSTCh1cmwpOworICAgIH0KKworCisgICAgcHVibGljIFN0cmluZyBlbmNvZGVVcmwoU3RyaW5nIHVybCkgeworICAgICAgICByZXR1cm4gcmVzcG9uc2UuZW5jb2RlVVJMKHVybCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgU3RyaW5nIGVuY29kZVJlZGlyZWN0VXJsKFN0cmluZyB1cmwpIHsKKyAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmVuY29kZVJlZGlyZWN0VVJMKHVybCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZW5kRXJyb3IoaW50IHNjLCBTdHJpbmcgbXNnKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIGlmIChpc0NvbW1pdHRlZCgpKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICgvKnNtLmdldFN0cmluZygicmVzcG9uc2VCYXNlLnJlc2V0LmlzZSIpKi8pOworCisgICAgICAgIHJlc3BvbnNlLnNldEFwcENvbW1pdHRlZCh0cnVlKTsKKworICAgICAgICByZXNwb25zZS5zZW5kRXJyb3Ioc2MsIG1zZyk7CisKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNlbmRFcnJvcihpbnQgc2MpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKGlzQ29tbWl0dGVkKCkpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKC8qc20uZ2V0U3RyaW5nKCJyZXNwb25zZUJhc2UucmVzZXQuaXNlIikqLyk7CisKKyAgICAgICAgcmVzcG9uc2Uuc2V0QXBwQ29tbWl0dGVkKHRydWUpOworCisgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcihzYyk7CisKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNlbmRSZWRpcmVjdChTdHJpbmcgbG9jYXRpb24pCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKGlzQ29tbWl0dGVkKCkpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKC8qc20uZ2V0U3RyaW5nKCJyZXNwb25zZUJhc2UucmVzZXQuaXNlIikqLyk7CisKKyAgICAgICAgcmVzcG9uc2Uuc2V0QXBwQ29tbWl0dGVkKHRydWUpOworCisgICAgICAgIHJlc3BvbnNlLnNlbmRSZWRpcmVjdChsb2NhdGlvbik7CisKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldERhdGVIZWFkZXIoU3RyaW5nIG5hbWUsIGxvbmcgZGF0ZSkgeworCisgICAgICAgIGlmIChpc0NvbW1pdHRlZCgpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGlmKFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgRGF0ZUhlYWRlclByaXZpbGVnZWRBY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuYW1lLCBkYXRlLCBmYWxzZSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzcG9uc2Uuc2V0RGF0ZUhlYWRlcihuYW1lLCBkYXRlKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBhZGREYXRlSGVhZGVyKFN0cmluZyBuYW1lLCBsb25nIGRhdGUpIHsKKworICAgICAgICBpZiAoaXNDb21taXR0ZWQoKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBpZihTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IERhdGVIZWFkZXJQcml2aWxlZ2VkQWN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmFtZSwgZGF0ZSwgdHJ1ZSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzcG9uc2UuYWRkRGF0ZUhlYWRlcihuYW1lLCBkYXRlKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXRIZWFkZXIoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgeworCisgICAgICAgIGlmIChpc0NvbW1pdHRlZCgpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIHJlc3BvbnNlLnNldEhlYWRlcihuYW1lLCB2YWx1ZSk7CisKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIGFkZEhlYWRlcihTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7CisKKyAgICAgICAgaWYgKGlzQ29tbWl0dGVkKCkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgcmVzcG9uc2UuYWRkSGVhZGVyKG5hbWUsIHZhbHVlKTsKKworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgc2V0SW50SGVhZGVyKFN0cmluZyBuYW1lLCBpbnQgdmFsdWUpIHsKKworICAgICAgICBpZiAoaXNDb21taXR0ZWQoKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICByZXNwb25zZS5zZXRJbnRIZWFkZXIobmFtZSwgdmFsdWUpOworCisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBhZGRJbnRIZWFkZXIoU3RyaW5nIG5hbWUsIGludCB2YWx1ZSkgeworCisgICAgICAgIGlmIChpc0NvbW1pdHRlZCgpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIHJlc3BvbnNlLmFkZEludEhlYWRlcihuYW1lLCB2YWx1ZSk7CisKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldFN0YXR1cyhpbnQgc2MpIHsKKworICAgICAgICBpZiAoaXNDb21taXR0ZWQoKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICByZXNwb25zZS5zZXRTdGF0dXMoc2MpOworCisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXRTdGF0dXMoaW50IHNjLCBTdHJpbmcgc20pIHsKKworICAgICAgICBpZiAoaXNDb21taXR0ZWQoKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICByZXNwb25zZS5zZXRTdGF0dXMoc2MsIHNtKTsKKworICAgIH0KKworCisJcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZSgpIHsKKwkJcmV0dXJuIHJlc3BvbnNlLmdldENvbnRlbnRUeXBlKCk7CisJfQorCisKKwlwdWJsaWMgdm9pZCBzZXRDaGFyYWN0ZXJFbmNvZGluZyhTdHJpbmcgYXJnMCkgeworICAgICAgICByZXNwb25zZS5zZXRDaGFyYWN0ZXJFbmNvZGluZyhhcmcwKTsKKwl9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2Nvbm5lY3Rvci9tYmVhbnMtZGVzY3JpcHRvcnMueG1sIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2Nvbm5lY3Rvci9tYmVhbnMtZGVzY3JpcHRvcnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzOWJlYWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29ubmVjdG9yL21iZWFucy1kZXNjcmlwdG9ycy54bWwKQEAgLTAsMCArMSwxOTQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPG1iZWFucy1kZXNjcmlwdG9ycz4KKworICA8bWJlYW4gICAgICAgICBuYW1lPSJDb3lvdGVDb25uZWN0b3IiCisgICAgICAgICAgICBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEubWJlYW5zLkNvbm5lY3Rvck1CZWFuIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJJbXBsZW1lbnRhdGlvbiBvZiBhIENveW90ZSBjb25uZWN0b3IiCisgICAgICAgICAgICAgICBkb21haW49IkNhdGFsaW5hIgorICAgICAgICAgICAgICAgIGdyb3VwPSJDb25uZWN0b3IiCisgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLkNvbm5lY3RvciI+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0iYWNjZXB0Q291bnQiCisgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBhY2NlcHQgY291bnQgZm9yIHRoaXMgQ29ubmVjdG9yIgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJhZGRyZXNzIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgSVAgYWRkcmVzcyBvbiB3aGljaCB0byBiaW5kIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0iYWxnb3JpdGhtIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgY2VydGlmaWNhdGUgZW5jb2RpbmcgYWxnb3JpdGhtIHRvIGJlIHVzZWQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJhbGxvd1RyYWNlIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJBbGxvdyBkaXNhYmxpbmcgVFJBQ0UgbWV0aG9kIgorICAgICAgICAgICAgICAgICB0eXBlPSJib29sZWFuIi8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0iYnVmZmVyU2l6ZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIGlucHV0IGJ1ZmZlciBzaXplIHdlIHNob3VsZCBjcmVhdGUgb24gaW5wdXQgc3RyZWFtcyIKKyAgICAgICAgICAgICAgICAgdHlwZT0iaW50Ii8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0iY2xhc3NOYW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJGdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgbWFuYWdlZCBvYmplY3QiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0iY2xpZW50QXV0aCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iU2hvdWxkIHdlIHJlcXVpcmUgY2xpZW50IGF1dGhlbnRpY2F0aW9uPyIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImNpcGhlcnMiCisgICAgICAgICAgZGVzY3JpcHRpb249IkNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIFNTTCBjaXBoZXIgc3VpdGVzIHRvIGJlIGVuYWJsZWQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJjb21wcmVzc2lvbiIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQ29tcHJlc3Npb24gdmFsdWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJjb25uZWN0aW9uTGluZ2VyIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJMaW5nZXIgdmFsdWUgb24gdGhlIGluY29taW5nIGNvbm5lY3Rpb24iCisgICAgICAgICAgICAgICAgIHR5cGU9ImludCIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImNvbm5lY3Rpb25UaW1lb3V0IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaW1lb3V0IHZhbHVlIG9uIHRoZSBpbmNvbWluZyBjb25uZWN0aW9uIgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJjb25uZWN0aW9uVXBsb2FkVGltZW91dCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVGltZW91dCB2YWx1ZSBvbiB0aGUgaW5jb21pbmcgY29ubmVjdGlvbiBkdXJpbmcgcmVxdWVzdCBwcm9jZXNzaW5nIgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiLz4KKworICAgIDxhdHRyaWJ1dGUgICAgbmFtZT0iZGlzYWJsZVVwbG9hZFRpbWVvdXQiCisgICAgICAgICAgIGRlc2NyaXB0aW9uPSJTaG91bGQgVG9tY2F0IGlnbm9yZSBzZXR0aW5nIGEgdGltZW91dCBmb3IgdXBsb2Fkcz8iIAorICAgICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImVuYWJsZUxvb2t1cHMiCisgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSAnZW5hYmxlIEROUyBsb29rdXBzJyBmbGFnIGZvciB0aGlzIENvbm5lY3RvciIKKyAgICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImtleXN0b3JlRmlsZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iUGF0aG5hbWUgdG8gdGhlIGtleSBzdG9yZSBmaWxlIHRvIGJlIHVzZWQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJrZXlzdG9yZVBhc3MiCisgICAgICAgICAgZGVzY3JpcHRpb249IlBhc3N3b3JkIGZvciBhY2Nlc3NpbmcgdGhlIGtleSBzdG9yZSBmaWxlIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0ia2V5c3RvcmVUeXBlIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJUeXBlIG9mIGtleXN0b3JlIGZpbGUgdG8gYmUgdXNlZCBmb3IgdGhlIHNlcnZlciBjZXJ0aWZpY2F0ZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImtleUFsaWFzIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJBbGlhcyBuYW1lIG9mIHRoaXMgY29ubmVjdG9yJ3Mga2V5cGFpciBhbmQgc3VwcG9ydGluZyBjZXJ0aWZpY2F0ZSBjaGFpbiIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9Im1heEh0dHBIZWFkZXJTaXplIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJNYXhpbXVtIHNpemUgaW4gYnl0ZXMgb2YgdGhlIEhUVFAgaGVhZGVyIgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJtYXhLZWVwQWxpdmVSZXF1ZXN0cyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iTWF4aW11bSBudW1iZXIgb2YgS2VlcC1BbGl2ZSByZXF1ZXN0cyB0byBob25vciBwZXIgY29ubmVjdGlvbiIKKyAgICAgICAgICAgICAgICAgdHlwZT0iaW50Ii8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0ibWF4UG9zdFNpemUiCisgICAgICAgICAgZGVzY3JpcHRpb249Ik1heGltdW0gc2l6ZSBpbiBieXRlcyBvZiBhIFBPU1Qgd2hpY2ggd2lsbCBiZSBoYW5kbGVkIGJ5IHRoZSBzZXJ2bGV0IEFQSSBwcm92aWRlZCBmZWF0dXJlcyIKKyAgICAgICAgICAgICAgICAgdHlwZT0iaW50Ii8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0ibWF4U3BhcmVUaHJlYWRzIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgbWF4aW11bSBudW1iZXIgb2YgdW51c2VkIHJlcXVlc3QgcHJvY2Vzc2luZyB0aHJlYWRzIgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJtYXhUaHJlYWRzIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgbWF4aW11bSBudW1iZXIgb2YgcmVxdWVzdCBwcm9jZXNzaW5nIHRocmVhZHMgdG8gYmUgY3JlYXRlZCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iaW50Ii8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0ibWluU3BhcmVUaHJlYWRzIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgbnVtYmVyIG9mIHJlcXVlc3QgcHJvY2Vzc2luZyB0aHJlYWRzIHRoYXQgd2lsbCBiZSBjcmVhdGVkIgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJwb3J0IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgcG9ydCBudW1iZXIgb24gd2hpY2ggd2UgbGlzdGVuIGZvciBhanAxMyByZXF1ZXN0cyIKKyAgICAgICAgICAgICAgICB0eXBlPSJpbnQiLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJwcm90b2NvbCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQ295b3RlIHByb3RvY29sIGhhbmRsZXIgaW4gdXNlIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0icHJvdG9jb2xIYW5kbGVyQ2xhc3NOYW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJDb3lvdGUgUHJvdG9jb2wgaGFuZGxlciBjbGFzcyBuYW1lIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InByb3h5TmFtZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlciBTZXJ2ZXIgbmFtZSB0byB3aGljaCB3ZSBzaG91bGQgcHJldGVuZCByZXF1ZXN0cyB0byB0aGlzIENvbm5lY3RvciIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InByb3h5UG9ydCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlciBTZXJ2ZXIgcG9ydCB0byB3aGljaCB3ZSBzaG91bGQgcHJldGVuZCByZXF1ZXN0cyB0byB0aGlzIENvbm5lY3RvciIKKyAgICAgICAgICAgICAgICAgdHlwZT0iaW50Ii8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0icmVkaXJlY3RQb3J0IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgcmVkaXJlY3QgcG9ydCBmb3Igbm9uLVNTTCB0byBTU0wgcmVkaXJlY3RzIgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJzY2hlbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249IlByb3RvY29sIG5hbWUgZm9yIHRoaXMgQ29ubmVjdG9yIChodHRwLCBodHRwcykiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJzZWNyZXQiCisgICAgICAgICAgZGVzY3JpcHRpb249IkF1dGhlbnRpY2F0aW9uIHNlY3JldCAoSSBndWVzcyAuLi4gbm90IGluIEphdmFkb2NzKSIKKyAgICAgICAgICAgIHJlYWRhYmxlID0gImZhbHNlIiAKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InNlY3VyZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iSXMgdGhpcyBhIHNlY3VyZSAoU1NMKSBDb25uZWN0b3I/IgorICAgICAgICAgICAgICAgICB0eXBlPSJib29sZWFuIi8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0ic3NsUHJvdG9jb2wiCisgICAgICAgICAgZGVzY3JpcHRpb249IlNTTCBwcm90b2NvbCB2YXJpYW50IHRvIGJlIHVzZWQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJzc2xQcm90b2NvbHMiCisgICAgICAgICAgZGVzY3JpcHRpb249IkNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIFNTTCBwcm90b2NvbCB2YXJpYW50cyB0byBiZSBlbmFibGVkIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0ic3RyYXRlZ3kiCisgICAgICAgICAgZGVzY3JpcHRpb249IlRocmVhZCBwb29sIHN0cmF0ZWd5IgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0idGNwTm9EZWxheSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iU2hvdWxkIHdlIHVzZSBUQ1Agbm8gZGVsYXk/IgorICAgICAgICAgICAgICAgICB0eXBlPSJib29sZWFuIi8+CisKKyAgICA8YXR0cmlidXRlICAgIG5hbWU9InRvbWNhdEF1dGhlbnRpY2F0aW9uIgorICAgICAgICAgICBkZXNjcmlwdGlvbj0iU2hvdWxkIFRvbWNhdCBwZXJmb3JtIGFsbCBhdXRoZW50aWNhdGlvbnM/IgorICAgICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIvPgorCisgICAgPGF0dHJpYnV0ZSAgICBuYW1lPSJ0aHJlYWRQcmlvcml0eSIKKyAgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSB0aHJlYWQgcHJpb3JpdHkgZm9yIHByb2Nlc3NvcnMiCisgICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJVUklFbmNvZGluZyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQ2hhcmFjdGVyIGVuY29kaW5nIHVzZWQgdG8gZGVjb2RlIHRoZSBVUkkiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJ1c2VCb2R5RW5jb2RpbmdGb3JVUkkiCisgICAgICAgICAgZGVzY3JpcHRpb249IlNob3VsZCB0aGUgYm9keSBlbmNvZGluZyBiZSB1c2VkIGZvciBVUkkgcXVlcnkgcGFyYW1ldGVycyIKKyAgICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIvPgorCisgICAgPGF0dHJpYnV0ZSAgICBuYW1lPSJ4cG93ZXJlZEJ5IgorICAgICAgICAgICBkZXNjcmlwdGlvbj0iSXMgZ2VuZXJhdGlvbiBvZiBYLVBvd2VyZWQtQnkgcmVzcG9uc2UgaGVhZGVyIGVuYWJsZWQvZGlzYWJsZWQ/IgorICAgICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIvPgorCisgICAgPG9wZXJhdGlvbiBuYW1lPSJzdGFydCIgZGVzY3JpcHRpb249IlN0YXJ0IiBpbXBhY3Q9IkFDVElPTiIgcmV0dXJuVHlwZT0idm9pZCIgLz4KKyAgICA8b3BlcmF0aW9uIG5hbWU9InN0b3AiIGRlc2NyaXB0aW9uPSJTdG9wIiBpbXBhY3Q9IkFDVElPTiIgcmV0dXJuVHlwZT0idm9pZCIgLz4KKyAgICA8b3BlcmF0aW9uIG5hbWU9InBhdXNlIiBkZXNjcmlwdGlvbj0iU3RhcnQiIGltcGFjdD0iQUNUSU9OIiByZXR1cm5UeXBlPSJ2b2lkIiAvPgorICAgIDxvcGVyYXRpb24gbmFtZT0icmVzdW1lIiBkZXNjcmlwdGlvbj0iU3RvcCIgaW1wYWN0PSJBQ1RJT04iIHJldHVyblR5cGU9InZvaWQiIC8+CisgICAgPG9wZXJhdGlvbiBuYW1lPSJpbml0IiBkZXNjcmlwdGlvbj0iSW5pdCIgaW1wYWN0PSJBQ1RJT04iIHJldHVyblR5cGU9InZvaWQiIC8+CisgICAgPG9wZXJhdGlvbiBuYW1lPSJkZXN0cm95IiBkZXNjcmlwdGlvbj0iRGVzdHJveSIgaW1wYWN0PSJBQ1RJT04iIHJldHVyblR5cGU9InZvaWQiIC8+CisKKyAgPC9tYmVhbj4KKworCis8L21iZWFucy1kZXNjcmlwdG9ycz4KKworCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29yZS9BcHBsaWNhdGlvbkNvbnRleHQuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb3JlL0FwcGxpY2F0aW9uQ29udGV4dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MWM2ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29yZS9BcHBsaWNhdGlvbkNvbnRleHQuamF2YQpAQCAtMCwwICsxLDk3OSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlOworCisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXgubmFtaW5nLkJpbmRpbmc7CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuZGlyZWN0b3J5LkRpckNvbnRleHQ7CitpbXBvcnQgamF2YXguc2VydmxldC5SZXF1ZXN0RGlzcGF0Y2hlcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXQ7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0QXR0cmlidXRlRXZlbnQ7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dEF0dHJpYnV0ZUxpc3RlbmVyOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Db250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuSG9zdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLldyYXBwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuQXBwbGljYXRpb25QYXJhbWV0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLkVudW1lcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLlJlc291cmNlU2V0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5TZXJ2ZXJJbmZvOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5TdHJpbmdNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUubmFtaW5nLnJlc291cmNlcy5EaXJDb250ZXh0VVJMU3RyZWFtSGFuZGxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm5hbWluZy5yZXNvdXJjZXMuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5idWYuQ2hhckNodW5rOworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuYnVmLk1lc3NhZ2VCeXRlczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvbWNhdC51dGlsLmh0dHAubWFwcGVyLk1hcHBpbmdEYXRhOworCisKKy8qKgorICogU3RhbmRhcmQgaW1wbGVtZW50YXRpb24gb2YgPGNvZGU+U2VydmxldENvbnRleHQ8L2NvZGU+IHRoYXQgcmVwcmVzZW50cworICogYSB3ZWIgYXBwbGljYXRpb24ncyBleGVjdXRpb24gZW52aXJvbm1lbnQuICBBbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGlzCisgKiBhc3NvY2lhdGVkIHdpdGggZWFjaCBpbnN0YW5jZSBvZiA8Y29kZT5TdGFuZGFyZENvbnRleHQ8L2NvZGU+LgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQGF1dGhvciBSZW15IE1hdWNoZXJhdAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgQXBwbGljYXRpb25Db250ZXh0CisgICAgaW1wbGVtZW50cyBTZXJ2bGV0Q29udGV4dCB7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3MsIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgICogQ29udGV4dCBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBhc3NvY2lhdGVkIENvbnRleHQgaW5zdGFuY2UKKyAgICAgKi8KKyAgICBwdWJsaWMgQXBwbGljYXRpb25Db250ZXh0KFN0cmluZyBiYXNlUGF0aCwgU3RhbmRhcmRDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsKKyAgICAgICAgdGhpcy5iYXNlUGF0aCA9IGJhc2VQYXRoOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBjb250ZXh0IGF0dHJpYnV0ZXMgZm9yIHRoaXMgY29udGV4dC4KKyAgICAgKi8KKyAgICBwcml2YXRlIEhhc2hNYXAgYXR0cmlidXRlcyA9IG5ldyBIYXNoTWFwKCk7CisKKworICAgIC8qKgorICAgICAqIExpc3Qgb2YgcmVhZCBvbmx5IGF0dHJpYnV0ZXMgZm9yIHRoaXMgY29udGV4dC4KKyAgICAgKi8KKyAgICBwcml2YXRlIEhhc2hNYXAgcmVhZE9ubHlBdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXAoKTsKKworCisgICAgLyoqCisgICAgICogVGhlIENvbnRleHQgaW5zdGFuY2Ugd2l0aCB3aGljaCB3ZSBhcmUgYXNzb2NpYXRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0YW5kYXJkQ29udGV4dCBjb250ZXh0ID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogRW1wdHkgY29sbGVjdGlvbiB0byBzZXJ2ZSBhcyB0aGUgYmFzaXMgZm9yIGVtcHR5IGVudW1lcmF0aW9ucy4KKyAgICAgKiA8c3Ryb25nPkRPIE5PVCBBREQgQU5ZIEVMRU1FTlRTIFRPIFRISVMgQ09MTEVDVElPTiE8L3N0cm9uZz4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBcnJheUxpc3QgZW1wdHkgPSBuZXcgQXJyYXlMaXN0KCk7CisKKworICAgIC8qKgorICAgICAqIFRoZSBmYWNhZGUgYXJvdW5kIHRoaXMgb2JqZWN0LgorICAgICAqLworICAgIHByaXZhdGUgU2VydmxldENvbnRleHQgZmFjYWRlID0gbmV3IEFwcGxpY2F0aW9uQ29udGV4dEZhY2FkZSh0aGlzKTsKKworCisgICAgLyoqCisgICAgICogVGhlIG1lcmdlZCBjb250ZXh0IGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMgZm9yIHRoaXMgQ29udGV4dC4KKyAgICAgKi8KKyAgICBwcml2YXRlIEhhc2hNYXAgcGFyYW1ldGVycyA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzdHJpbmcgbWFuYWdlciBmb3IgdGhpcyBwYWNrYWdlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ01hbmFnZXIgc20gPQorICAgICAgU3RyaW5nTWFuYWdlci5nZXRNYW5hZ2VyKENvbnN0YW50cy5QYWNrYWdlKTsKKworCisgICAgLyoqCisgICAgICogQmFzZSBwYXRoLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGJhc2VQYXRoID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhyZWFkIGxvY2FsIG1hcHBpbmcgZGF0YS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFRocmVhZExvY2FsIGxvY2FsTWFwcGluZ0RhdGEgPSBuZXcgVGhyZWFkTG9jYWwoKTsKKworCisgICAgLyoqCisgICAgICogVGhyZWFkIGxvY2FsIFVSSSBtZXNzYWdlIGJ5dGVzLgorICAgICAqLworICAgIHByaXZhdGUgVGhyZWFkTG9jYWwgbG9jYWxVcmlNQiA9IG5ldyBUaHJlYWRMb2NhbCgpOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSByZXNvdXJjZXMgb2JqZWN0IHRoYXQgaXMgbWFwcGVkIHRvIGEgc3BlY2lmaWVkIHBhdGguCisgICAgICogVGhlIHBhdGggbXVzdCBiZWdpbiB3aXRoIGEgIi8iIGFuZCBpcyBpbnRlcnByZXRlZCBhcyByZWxhdGl2ZSB0byB0aGUKKyAgICAgKiBjdXJyZW50IGNvbnRleHQgcm9vdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgRGlyQ29udGV4dCBnZXRSZXNvdXJjZXMoKSB7CisKKyAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0UmVzb3VyY2VzKCk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU2VydmxldENvbnRleHQgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgY29udGV4dCBhdHRyaWJ1dGUsIGlmIGFueTsKKyAgICAgKiBvdGhlcndpc2UgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgY29udGV4dCBhdHRyaWJ1dGUgdG8gcmV0dXJuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKGF0dHJpYnV0ZXMpIHsKKyAgICAgICAgICAgIHJldHVybiAoYXR0cmlidXRlcy5nZXQobmFtZSkpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhbiBlbnVtZXJhdGlvbiBvZiB0aGUgbmFtZXMgb2YgdGhlIGNvbnRleHQgYXR0cmlidXRlcworICAgICAqIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbnRleHQuCisgICAgICovCisgICAgcHVibGljIEVudW1lcmF0aW9uIGdldEF0dHJpYnV0ZU5hbWVzKCkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAoYXR0cmlidXRlcykgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBFbnVtZXJhdG9yKGF0dHJpYnV0ZXMua2V5U2V0KCksIHRydWUpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIDxjb2RlPlNlcnZsZXRDb250ZXh0PC9jb2RlPiBvYmplY3QgdGhhdCBjb3JyZXNwb25kcyB0byBhCisgICAgICogc3BlY2lmaWVkIFVSSSBvbiB0aGUgc2VydmVyLiAgVGhpcyBtZXRob2QgYWxsb3dzIHNlcnZsZXRzIHRvIGdhaW4KKyAgICAgKiBhY2Nlc3MgdG8gdGhlIGNvbnRleHQgZm9yIHZhcmlvdXMgcGFydHMgb2YgdGhlIHNlcnZlciwgYW5kIGFzIG5lZWRlZAorICAgICAqIG9idGFpbiA8Y29kZT5SZXF1ZXN0RGlzcGF0Y2hlcjwvY29kZT4gb2JqZWN0cyBvciByZXNvdXJjZXMgZnJvbSB0aGUKKyAgICAgKiBjb250ZXh0LiAgVGhlIGdpdmVuIHBhdGggbXVzdCBiZSBhYnNvbHV0ZSAoYmVnaW5uaW5nIHdpdGggYSAiLyIpLAorICAgICAqIGFuZCBpcyBpbnRlcnByZXRlZCBiYXNlZCBvbiBvdXIgdmlydHVhbCBob3N0J3MgZG9jdW1lbnQgcm9vdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmkgQWJzb2x1dGUgVVJJIG9mIGEgcmVzb3VyY2Ugb24gdGhlIHNlcnZlcgorICAgICAqLworICAgIHB1YmxpYyBTZXJ2bGV0Q29udGV4dCBnZXRDb250ZXh0KFN0cmluZyB1cmkpIHsKKworICAgICAgICAvLyBWYWxpZGF0ZSB0aGUgZm9ybWF0IG9mIHRoZSBzcGVjaWZpZWQgYXJndW1lbnQKKyAgICAgICAgaWYgKCh1cmkgPT0gbnVsbCkgfHwgKCF1cmkuc3RhcnRzV2l0aCgiLyIpKSkKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisKKyAgICAgICAgLy8gUmV0dXJuIHRoZSBjdXJyZW50IGNvbnRleHQgaWYgcmVxdWVzdGVkCisgICAgICAgIFN0cmluZyBjb250ZXh0UGF0aCA9IGNvbnRleHQuZ2V0UGF0aCgpOworICAgICAgICBpZiAoIWNvbnRleHRQYXRoLmVuZHNXaXRoKCIvIikpCisgICAgICAgICAgICBjb250ZXh0UGF0aCA9IGNvbnRleHRQYXRoICsgIi8iOworCisgICAgICAgIGlmICgoKGNvbnRleHRQYXRoLmxlbmd0aCgpID4gMSkgJiYgKHVyaS5zdGFydHNXaXRoKGNvbnRleHRQYXRoKSkpIHx8CisgICAgICAgICAgICAoKGNvbnRleHRQYXRoLmVxdWFscygiLyIpKSAmJiAodXJpLmVxdWFscygiLyIpKSkpIHsKKyAgICAgICAgICAgIHJldHVybiAodGhpcyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXR1cm4gb3RoZXIgY29udGV4dHMgb25seSBpZiBhbGxvd2VkCisgICAgICAgIGlmICghY29udGV4dC5nZXRDcm9zc0NvbnRleHQoKSkKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBIb3N0IGhvc3QgPSAoSG9zdCkgY29udGV4dC5nZXRQYXJlbnQoKTsKKyAgICAgICAgICAgIENvbnRleHQgY2hpbGQgPSBudWxsOworICAgICAgICAgICAgU3RyaW5nIG1hcHVyaSA9IHVyaTsKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgICAgY2hpbGQgPSAoQ29udGV4dCkgaG9zdC5maW5kQ2hpbGQobWFwdXJpKTsKKyAgICAgICAgICAgICAgICBpZiAoY2hpbGQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgaW50IHNsYXNoID0gbWFwdXJpLmxhc3RJbmRleE9mKCcvJyk7CisgICAgICAgICAgICAgICAgaWYgKHNsYXNoIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgbWFwdXJpID0gbWFwdXJpLnN1YnN0cmluZygwLCBzbGFzaCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2hpbGQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNoaWxkID0gKENvbnRleHQpIGhvc3QuZmluZENoaWxkKCIiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjaGlsZCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiAoY2hpbGQuZ2V0U2VydmxldENvbnRleHQoKSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlciwgb3IKKyAgICAgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIHBhcmFtZXRlciBkb2VzIG5vdCBleGlzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlciB0byByZXRyaWV2ZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5pdFBhcmFtZXRlcihmaW5hbCBTdHJpbmcgbmFtZSkgeworCisgICAgICAgIG1lcmdlUGFyYW1ldGVycygpOworICAgICAgICBzeW5jaHJvbml6ZWQgKHBhcmFtZXRlcnMpIHsKKyAgICAgICAgICAgIHJldHVybiAoKFN0cmluZykgcGFyYW1ldGVycy5nZXQobmFtZSkpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG5hbWVzIG9mIHRoZSBjb250ZXh0J3MgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycywgb3IgYW4KKyAgICAgKiBlbXB0eSBlbnVtZXJhdGlvbiBpZiB0aGUgY29udGV4dCBoYXMgbm8gaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0SW5pdFBhcmFtZXRlck5hbWVzKCkgeworCisgICAgICAgIG1lcmdlUGFyYW1ldGVycygpOworICAgICAgICBzeW5jaHJvbml6ZWQgKHBhcmFtZXRlcnMpIHsKKyAgICAgICAgICAgcmV0dXJuIChuZXcgRW51bWVyYXRvcihwYXJhbWV0ZXJzLmtleVNldCgpKSk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBtYWpvciB2ZXJzaW9uIG9mIHRoZSBKYXZhIFNlcnZsZXQgQVBJIHRoYXQgd2UgaW1wbGVtZW50LgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0TWFqb3JWZXJzaW9uKCkgeworCisgICAgICAgIHJldHVybiAoQ29uc3RhbnRzLk1BSk9SX1ZFUlNJT04pOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG1pbm9yIHZlcnNpb24gb2YgdGhlIEphdmEgU2VydmxldCBBUEkgdGhhdCB3ZSBpbXBsZW1lbnQuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRNaW5vclZlcnNpb24oKSB7CisKKyAgICAgICAgcmV0dXJuIChDb25zdGFudHMuTUlOT1JfVkVSU0lPTik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgTUlNRSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgZmlsZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKKyAgICAgKiB0aGUgTUlNRSB0eXBlIGNhbm5vdCBiZSBkZXRlcm1pbmVkLgorICAgICAqCisgICAgICogQHBhcmFtIGZpbGUgRmlsZW5hbWUgZm9yIHdoaWNoIHRvIGlkZW50aWZ5IGEgTUlNRSB0eXBlCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRNaW1lVHlwZShTdHJpbmcgZmlsZSkgeworCisgICAgICAgIGlmIChmaWxlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICBpbnQgcGVyaW9kID0gZmlsZS5sYXN0SW5kZXhPZigiLiIpOworICAgICAgICBpZiAocGVyaW9kIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIFN0cmluZyBleHRlbnNpb24gPSBmaWxlLnN1YnN0cmluZyhwZXJpb2QgKyAxKTsKKyAgICAgICAgaWYgKGV4dGVuc2lvbi5sZW5ndGgoKSA8IDEpCisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICByZXR1cm4gKGNvbnRleHQuZmluZE1pbWVNYXBwaW5nKGV4dGVuc2lvbikpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSA8Y29kZT5SZXF1ZXN0RGlzcGF0Y2hlcjwvY29kZT4gb2JqZWN0IHRoYXQgYWN0cyBhcyBhCisgICAgICogd3JhcHBlciBmb3IgdGhlIG5hbWVkIHNlcnZsZXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBzZXJ2bGV0IGZvciB3aGljaCBhIGRpc3BhdGNoZXIgaXMgcmVxdWVzdGVkCisgICAgICovCisgICAgcHVibGljIFJlcXVlc3REaXNwYXRjaGVyIGdldE5hbWVkRGlzcGF0Y2hlcihTdHJpbmcgbmFtZSkgeworCisgICAgICAgIC8vIFZhbGlkYXRlIHRoZSBuYW1lIGFyZ3VtZW50CisgICAgICAgIGlmIChuYW1lID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworCisgICAgICAgIC8vIENyZWF0ZSBhbmQgcmV0dXJuIGEgY29ycmVzcG9uZGluZyByZXF1ZXN0IGRpc3BhdGNoZXIKKyAgICAgICAgV3JhcHBlciB3cmFwcGVyID0gKFdyYXBwZXIpIGNvbnRleHQuZmluZENoaWxkKG5hbWUpOworICAgICAgICBpZiAod3JhcHBlciA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgCisgICAgICAgIEFwcGxpY2F0aW9uRGlzcGF0Y2hlciBkaXNwYXRjaGVyOworICAgICAgICBkaXNwYXRjaGVyID0KKyAgICAgICAgICAgICAgbmV3IEFwcGxpY2F0aW9uRGlzcGF0Y2hlcih3cmFwcGVyLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBuYW1lKTsKKyAgICAgICAgCisgICAgICAgIHJldHVybiAoKFJlcXVlc3REaXNwYXRjaGVyKSBkaXNwYXRjaGVyKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSByZWFsIHBhdGggZm9yIGEgZ2l2ZW4gdmlydHVhbCBwYXRoLCBpZiBwb3NzaWJsZTsgb3RoZXJ3aXNlCisgICAgICogcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIHBhdGggVGhlIHBhdGggdG8gdGhlIGRlc2lyZWQgcmVzb3VyY2UKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlYWxQYXRoKFN0cmluZyBwYXRoKSB7CisKKyAgICAgICAgaWYgKCFjb250ZXh0LmlzRmlsZXN5c3RlbUJhc2VkKCkpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShiYXNlUGF0aCwgcGF0aCk7CisgICAgICAgIHJldHVybiAoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIDxjb2RlPlJlcXVlc3REaXNwYXRjaGVyPC9jb2RlPiBpbnN0YW5jZSB0aGF0IGFjdHMgYXMgYQorICAgICAqIHdyYXBwZXIgZm9yIHRoZSByZXNvdXJjZSBhdCB0aGUgZ2l2ZW4gcGF0aC4gIFRoZSBwYXRoIG11c3QgYmVnaW4KKyAgICAgKiB3aXRoIGEgIi8iIGFuZCBpcyBpbnRlcnByZXRlZCBhcyByZWxhdGl2ZSB0byB0aGUgY3VycmVudCBjb250ZXh0IHJvb3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0aCBUaGUgcGF0aCB0byB0aGUgZGVzaXJlZCByZXNvdXJjZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgUmVxdWVzdERpc3BhdGNoZXIgZ2V0UmVxdWVzdERpc3BhdGNoZXIoU3RyaW5nIHBhdGgpIHsKKworICAgICAgICAvLyBWYWxpZGF0ZSB0aGUgcGF0aCBhcmd1bWVudAorICAgICAgICBpZiAocGF0aCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgaWYgKCFwYXRoLnN0YXJ0c1dpdGgoIi8iKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nCisgICAgICAgICAgICAgICAgICgiYXBwbGljYXRpb25Db250ZXh0LnJlcXVlc3REaXNwYXRjaGVyLmlhZSIsIHBhdGgpKTsKKyAgICAgICAgcGF0aCA9IG5vcm1hbGl6ZShwYXRoKTsKKyAgICAgICAgaWYgKHBhdGggPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisKKyAgICAgICAgLy8gUmV0cmlldmUgdGhlIHRocmVhZCBsb2NhbCBVUkkKKyAgICAgICAgTWVzc2FnZUJ5dGVzIHVyaU1CID0gKE1lc3NhZ2VCeXRlcykgbG9jYWxVcmlNQi5nZXQoKTsKKyAgICAgICAgaWYgKHVyaU1CID09IG51bGwpIHsKKyAgICAgICAgICAgIHVyaU1CID0gTWVzc2FnZUJ5dGVzLm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICBDaGFyQ2h1bmsgdXJpQ0MgPSB1cmlNQi5nZXRDaGFyQ2h1bmsoKTsKKyAgICAgICAgICAgIHVyaUNDLnNldExpbWl0KC0xKTsKKyAgICAgICAgICAgIGxvY2FsVXJpTUIuc2V0KHVyaU1CKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHVyaU1CLnJlY3ljbGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEdldCBxdWVyeSBzdHJpbmcKKyAgICAgICAgU3RyaW5nIHF1ZXJ5U3RyaW5nID0gbnVsbDsKKyAgICAgICAgaW50IHBvcyA9IHBhdGguaW5kZXhPZignPycpOworICAgICAgICBpZiAocG9zID49IDApIHsKKyAgICAgICAgICAgIHF1ZXJ5U3RyaW5nID0gcGF0aC5zdWJzdHJpbmcocG9zICsgMSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwb3MgPSBwYXRoLmxlbmd0aCgpOworICAgICAgICB9CisgCisgICAgICAgIC8vIFJldHJpZXZlIHRoZSB0aHJlYWQgbG9jYWwgbWFwcGluZyBkYXRhCisgICAgICAgIE1hcHBpbmdEYXRhIG1hcHBpbmdEYXRhID0gKE1hcHBpbmdEYXRhKSBsb2NhbE1hcHBpbmdEYXRhLmdldCgpOworICAgICAgICBpZiAobWFwcGluZ0RhdGEgPT0gbnVsbCkgeworICAgICAgICAgICAgbWFwcGluZ0RhdGEgPSBuZXcgTWFwcGluZ0RhdGEoKTsKKyAgICAgICAgICAgIGxvY2FsTWFwcGluZ0RhdGEuc2V0KG1hcHBpbmdEYXRhKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE1hcCB0aGUgVVJJCisgICAgICAgIENoYXJDaHVuayB1cmlDQyA9IHVyaU1CLmdldENoYXJDaHVuaygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdXJpQ0MuYXBwZW5kKGNvbnRleHQuZ2V0UGF0aCgpLCAwLCBjb250ZXh0LmdldFBhdGgoKS5sZW5ndGgoKSk7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogSWdub3JlIGFueSB0cmFpbGluZyBwYXRoIHBhcmFtcyAoc2VwYXJhdGVkIGJ5ICc7JykgZm9yIG1hcHBpbmcKKyAgICAgICAgICAgICAqIHB1cnBvc2VzCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGludCBzZW1pY29sb24gPSBwYXRoLmluZGV4T2YoJzsnKTsKKyAgICAgICAgICAgIHVyaUNDLmFwcGVuZChwYXRoLCAwLCBzZW1pY29sb24gPiAwID8gc2VtaWNvbG9uIDogcG9zKTsKKyAgICAgICAgICAgIGNvbnRleHQuZ2V0TWFwcGVyKCkubWFwKHVyaU1CLCBtYXBwaW5nRGF0YSk7CisgICAgICAgICAgICBpZiAobWFwcGluZ0RhdGEud3JhcHBlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBBcHBlbmQgYW55IHRyYWlsaW5nIHBhdGggcGFyYW1zIChzZXBhcmF0ZWQgYnkgJzsnKSB0aGF0IHdlcmUKKyAgICAgICAgICAgICAqIGlnbm9yZWQgZm9yIG1hcHBpbmcgcHVycG9zZXMsIHNvIHRoYXQgdGhleSdyZSByZWZsZWN0ZWQgaW4gdGhlCisgICAgICAgICAgICAgKiBSZXF1ZXN0RGlzcGF0Y2hlcidzIHJlcXVlc3RVUkkKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKHNlbWljb2xvbiA+IDApIHsKKyAgICAgICAgICAgICAgICB1cmlDQy5hcHBlbmQocGF0aCwgc2VtaWNvbG9uLCBwb3MgLSBzZW1pY29sb24pOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gU2hvdWxkIG5ldmVyIGhhcHBlbgorICAgICAgICAgICAgbG9nKHNtLmdldFN0cmluZygiYXBwbGljYXRpb25Db250ZXh0Lm1hcHBpbmcuZXJyb3IiKSwgZSk7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgV3JhcHBlciB3cmFwcGVyID0gKFdyYXBwZXIpIG1hcHBpbmdEYXRhLndyYXBwZXI7CisgICAgICAgIFN0cmluZyB3cmFwcGVyUGF0aCA9IG1hcHBpbmdEYXRhLndyYXBwZXJQYXRoLnRvU3RyaW5nKCk7CisgICAgICAgIFN0cmluZyBwYXRoSW5mbyA9IG1hcHBpbmdEYXRhLnBhdGhJbmZvLnRvU3RyaW5nKCk7CisKKyAgICAgICAgbWFwcGluZ0RhdGEucmVjeWNsZSgpOworICAgICAgICAKKyAgICAgICAgLy8gQ29uc3RydWN0IGEgUmVxdWVzdERpc3BhdGNoZXIgdG8gcHJvY2VzcyB0aGlzIHJlcXVlc3QKKyAgICAgICAgcmV0dXJuIChSZXF1ZXN0RGlzcGF0Y2hlcikgbmV3IEFwcGxpY2F0aW9uRGlzcGF0Y2hlcgorICAgICAgICAgICAgKHdyYXBwZXIsIHVyaUNDLnRvU3RyaW5nKCksIHdyYXBwZXJQYXRoLCBwYXRoSW5mbywgCisgICAgICAgICAgICAgcXVlcnlTdHJpbmcsIG51bGwpOworCisgICAgfQorCisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgVVJMIHRvIHRoZSByZXNvdXJjZSB0aGF0IGlzIG1hcHBlZCB0byBhIHNwZWNpZmllZCBwYXRoLgorICAgICAqIFRoZSBwYXRoIG11c3QgYmVnaW4gd2l0aCBhICIvIiBhbmQgaXMgaW50ZXJwcmV0ZWQgYXMgcmVsYXRpdmUgdG8gdGhlCisgICAgICogY3VycmVudCBjb250ZXh0IHJvb3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0aCBUaGUgcGF0aCB0byB0aGUgZGVzaXJlZCByZXNvdXJjZQorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBNYWxmb3JtZWRVUkxFeGNlcHRpb24gaWYgdGhlIHBhdGggaXMgbm90IGdpdmVuCisgICAgICogIGluIHRoZSBjb3JyZWN0IGZvcm0KKyAgICAgKi8KKyAgICBwdWJsaWMgVVJMIGdldFJlc291cmNlKFN0cmluZyBwYXRoKQorICAgICAgICB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAocGF0aCA9PSBudWxsIHx8ICFwYXRoLnN0YXJ0c1dpdGgoIi8iKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE1hbGZvcm1lZFVSTEV4Y2VwdGlvbihzbS5nZXRTdHJpbmcoImFwcGxpY2F0aW9uQ29udGV4dC5yZXF1ZXN0RGlzcGF0Y2hlci5pYWUiLCBwYXRoKSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHBhdGggPSBub3JtYWxpemUocGF0aCk7CisgICAgICAgIGlmIChwYXRoID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworCisgICAgICAgIFN0cmluZyBsaWJQYXRoID0gIi9XRUItSU5GL2xpYi8iOworICAgICAgICBpZiAoKHBhdGguc3RhcnRzV2l0aChsaWJQYXRoKSkgJiYgKHBhdGguZW5kc1dpdGgoIi5qYXIiKSkpIHsKKyAgICAgICAgICAgIEZpbGUgamFyRmlsZSA9IG51bGw7CisgICAgICAgICAgICBpZiAoY29udGV4dC5pc0ZpbGVzeXN0ZW1CYXNlZCgpKSB7CisgICAgICAgICAgICAgICAgamFyRmlsZSA9IG5ldyBGaWxlKGJhc2VQYXRoLCBwYXRoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgamFyRmlsZSA9IG5ldyBGaWxlKGNvbnRleHQuZ2V0V29ya1BhdGgoKSwgcGF0aCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoamFyRmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBqYXJGaWxlLnRvVVJMKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICBEaXJDb250ZXh0IHJlc291cmNlcyA9IGNvbnRleHQuZ2V0UmVzb3VyY2VzKCk7CisgICAgICAgICAgICBpZiAocmVzb3VyY2VzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZnVsbFBhdGggPSBjb250ZXh0LmdldE5hbWUoKSArIHBhdGg7CisgICAgICAgICAgICAgICAgU3RyaW5nIGhvc3ROYW1lID0gY29udGV4dC5nZXRQYXJlbnQoKS5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmxvb2t1cChwYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVUkwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiam5kaSIsIG51bGwsIDAsIGdldEpORElVcmkoaG9zdE5hbWUsIGZ1bGxQYXRoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGlyQ29udGV4dFVSTFN0cmVhbUhhbmRsZXIocmVzb3VyY2VzKSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIChudWxsKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSByZXF1ZXN0ZWQgcmVzb3VyY2UgYXMgYW4gPGNvZGU+SW5wdXRTdHJlYW08L2NvZGU+LiAgVGhlCisgICAgICogcGF0aCBtdXN0IGJlIHNwZWNpZmllZCBhY2NvcmRpbmcgdG8gdGhlIHJ1bGVzIGRlc2NyaWJlZCB1bmRlcgorICAgICAqIDxjb2RlPmdldFJlc291cmNlPC9jb2RlPi4gIElmIG5vIHN1Y2ggcmVzb3VyY2UgY2FuIGJlIGlkZW50aWZpZWQsCisgICAgICogcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIHBhdGggVGhlIHBhdGggdG8gdGhlIGRlc2lyZWQgcmVzb3VyY2UuCisgICAgICovCisgICAgcHVibGljIElucHV0U3RyZWFtIGdldFJlc291cmNlQXNTdHJlYW0oU3RyaW5nIHBhdGgpIHsKKworICAgICAgICBwYXRoID0gbm9ybWFsaXplKHBhdGgpOworICAgICAgICBpZiAocGF0aCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKworICAgICAgICBEaXJDb250ZXh0IHJlc291cmNlcyA9IGNvbnRleHQuZ2V0UmVzb3VyY2VzKCk7CisgICAgICAgIGlmIChyZXNvdXJjZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBPYmplY3QgcmVzb3VyY2UgPSByZXNvdXJjZXMubG9va3VwKHBhdGgpOworICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIFJlc291cmNlKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCgoUmVzb3VyY2UpIHJlc291cmNlKS5zdHJlYW1Db250ZW50KCkpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKG51bGwpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBTZXQgY29udGFpbmluZyB0aGUgcmVzb3VyY2UgcGF0aHMgb2YgcmVzb3VyY2VzIG1lbWJlciBvZiB0aGUKKyAgICAgKiBzcGVjaWZpZWQgY29sbGVjdGlvbi4gRWFjaCBwYXRoIHdpbGwgYmUgYSBTdHJpbmcgc3RhcnRpbmcgd2l0aAorICAgICAqIGEgIi8iIGNoYXJhY3Rlci4gVGhlIHJldHVybmVkIHNldCBpcyBpbW11dGFibGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0aCBDb2xsZWN0aW9uIHBhdGgKKyAgICAgKi8KKyAgICBwdWJsaWMgU2V0IGdldFJlc291cmNlUGF0aHMoU3RyaW5nIHBhdGgpIHsKKworICAgICAgICBwYXRoID0gbm9ybWFsaXplKHBhdGgpOworICAgICAgICBpZiAocGF0aCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKworICAgICAgICBEaXJDb250ZXh0IHJlc291cmNlcyA9IGNvbnRleHQuZ2V0UmVzb3VyY2VzKCk7CisgICAgICAgIGlmIChyZXNvdXJjZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIChnZXRSZXNvdXJjZVBhdGhzSW50ZXJuYWwocmVzb3VyY2VzLCBwYXRoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChudWxsKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogSW50ZXJuYWwgaW1wbGVtZW50YXRpb24gb2YgZ2V0UmVzb3VyY2VzUGF0aCgpIGxvZ2ljLgorICAgICAqCisgICAgICogQHBhcmFtIHJlc291cmNlcyBEaXJlY3RvcnkgY29udGV4dCB0byBzZWFyY2gKKyAgICAgKiBAcGFyYW0gcGF0aCBDb2xsZWN0aW9uIHBhdGgKKyAgICAgKi8KKyAgICBwcml2YXRlIFNldCBnZXRSZXNvdXJjZVBhdGhzSW50ZXJuYWwoRGlyQ29udGV4dCByZXNvdXJjZXMsIFN0cmluZyBwYXRoKSB7CisKKyAgICAgICAgUmVzb3VyY2VTZXQgc2V0ID0gbmV3IFJlc291cmNlU2V0KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBsaXN0Q29sbGVjdGlvblBhdGhzKHNldCwgcmVzb3VyY2VzLCBwYXRoKTsKKyAgICAgICAgfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIH0KKyAgICAgICAgc2V0LnNldExvY2tlZCh0cnVlKTsKKyAgICAgICAgcmV0dXJuIChzZXQpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG5hbWUgYW5kIHZlcnNpb24gb2YgdGhlIHNlcnZsZXQgY29udGFpbmVyLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmVySW5mbygpIHsKKworICAgICAgICByZXR1cm4gKFNlcnZlckluZm8uZ2V0U2VydmVySW5mbygpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQGRlcHJlY2F0ZWQgQXMgb2YgSmF2YSBTZXJ2bGV0IEFQSSAyLjEsIHdpdGggbm8gZGlyZWN0IHJlcGxhY2VtZW50LgorICAgICAqLworICAgIHB1YmxpYyBTZXJ2bGV0IGdldFNlcnZsZXQoU3RyaW5nIG5hbWUpIHsKKworICAgICAgICByZXR1cm4gKG51bGwpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGRpc3BsYXkgbmFtZSBvZiB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFNlcnZsZXRDb250ZXh0TmFtZSgpIHsKKworICAgICAgICByZXR1cm4gKGNvbnRleHQuZ2V0RGlzcGxheU5hbWUoKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEBkZXByZWNhdGVkIEFzIG9mIEphdmEgU2VydmxldCBBUEkgMi4xLCB3aXRoIG5vIGRpcmVjdCByZXBsYWNlbWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0U2VydmxldE5hbWVzKCkgeworICAgICAgICByZXR1cm4gKG5ldyBFbnVtZXJhdG9yKGVtcHR5KSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZCBBcyBvZiBKYXZhIFNlcnZsZXQgQVBJIDIuMSwgd2l0aCBubyBkaXJlY3QgcmVwbGFjZW1lbnQuCisgICAgICovCisgICAgcHVibGljIEVudW1lcmF0aW9uIGdldFNlcnZsZXRzKCkgeworICAgICAgICByZXR1cm4gKG5ldyBFbnVtZXJhdG9yKGVtcHR5KSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgdGhlIHNwZWNpZmllZCBtZXNzYWdlIHRvIGEgc2VydmxldCBsb2cgZmlsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXNzYWdlIE1lc3NhZ2UgdG8gYmUgd3JpdHRlbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGxvZyhTdHJpbmcgbWVzc2FnZSkgeworCisgICAgICAgIGNvbnRleHQuZ2V0TG9nZ2VyKCkuaW5mbyhtZXNzYWdlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogV3JpdGVzIHRoZSBzcGVjaWZpZWQgZXhjZXB0aW9uIGFuZCBtZXNzYWdlIHRvIGEgc2VydmxldCBsb2cgZmlsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBleGNlcHRpb24gRXhjZXB0aW9uIHRvIGJlIHJlcG9ydGVkCisgICAgICogQHBhcmFtIG1lc3NhZ2UgTWVzc2FnZSB0byBiZSB3cml0dGVuCisgICAgICoKKyAgICAgKiBAZGVwcmVjYXRlZCBBcyBvZiBKYXZhIFNlcnZsZXQgQVBJIDIuMSwgdXNlCisgICAgICogIDxjb2RlPmxvZyhTdHJpbmcsIFRocm93YWJsZSk8L2NvZGU+IGluc3RlYWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBsb2coRXhjZXB0aW9uIGV4Y2VwdGlvbiwgU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgCisgICAgICAgIGNvbnRleHQuZ2V0TG9nZ2VyKCkuZXJyb3IobWVzc2FnZSwgZXhjZXB0aW9uKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogV3JpdGVzIHRoZSBzcGVjaWZpZWQgbWVzc2FnZSBhbmQgZXhjZXB0aW9uIHRvIGEgc2VydmxldCBsb2cgZmlsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXNzYWdlIE1lc3NhZ2UgdG8gYmUgd3JpdHRlbgorICAgICAqIEBwYXJhbSB0aHJvd2FibGUgRXhjZXB0aW9uIHRvIGJlIHJlcG9ydGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgbG9nKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgdGhyb3dhYmxlKSB7CisgICAgICAgIAorICAgICAgICBjb250ZXh0LmdldExvZ2dlcigpLmVycm9yKG1lc3NhZ2UsIHRocm93YWJsZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGUgY29udGV4dCBhdHRyaWJ1dGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUsIGlmIGFueS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIGNvbnRleHQgYXR0cmlidXRlIHRvIGJlIHJlbW92ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHsKKworICAgICAgICBPYmplY3QgdmFsdWUgPSBudWxsOworICAgICAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7CisKKyAgICAgICAgLy8gUmVtb3ZlIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlCisgICAgICAgIHN5bmNocm9uaXplZCAoYXR0cmlidXRlcykgeworICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIHJlYWQgb25seSBhdHRyaWJ1dGUKKyAgICAgICAgICAgaWYgKHJlYWRPbmx5QXR0cmlidXRlcy5jb250YWluc0tleShuYW1lKSkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBmb3VuZCA9IGF0dHJpYnV0ZXMuY29udGFpbnNLZXkobmFtZSk7CisgICAgICAgICAgICBpZiAoZm91bmQpIHsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IGF0dHJpYnV0ZXMuZ2V0KG5hbWUpOworICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMucmVtb3ZlKG5hbWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBOb3RpZnkgaW50ZXJlc3RlZCBhcHBsaWNhdGlvbiBldmVudCBsaXN0ZW5lcnMKKyAgICAgICAgT2JqZWN0IGxpc3RlbmVyc1tdID0gY29udGV4dC5nZXRBcHBsaWNhdGlvbkV2ZW50TGlzdGVuZXJzKCk7CisgICAgICAgIGlmICgobGlzdGVuZXJzID09IG51bGwpIHx8IChsaXN0ZW5lcnMubGVuZ3RoID09IDApKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBTZXJ2bGV0Q29udGV4dEF0dHJpYnV0ZUV2ZW50IGV2ZW50ID0KKyAgICAgICAgICBuZXcgU2VydmxldENvbnRleHRBdHRyaWJ1dGVFdmVudChjb250ZXh0LmdldFNlcnZsZXRDb250ZXh0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIHZhbHVlKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmICghKGxpc3RlbmVyc1tpXSBpbnN0YW5jZW9mIFNlcnZsZXRDb250ZXh0QXR0cmlidXRlTGlzdGVuZXIpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgU2VydmxldENvbnRleHRBdHRyaWJ1dGVMaXN0ZW5lciBsaXN0ZW5lciA9CisgICAgICAgICAgICAgICAgKFNlcnZsZXRDb250ZXh0QXR0cmlidXRlTGlzdGVuZXIpIGxpc3RlbmVyc1tpXTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY29udGV4dC5maXJlQ29udGFpbmVyRXZlbnQoImJlZm9yZUNvbnRleHRBdHRyaWJ1dGVSZW1vdmVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgbGlzdGVuZXIuYXR0cmlidXRlUmVtb3ZlZChldmVudCk7CisgICAgICAgICAgICAgICAgY29udGV4dC5maXJlQ29udGFpbmVyRXZlbnQoImFmdGVyQ29udGV4dEF0dHJpYnV0ZVJlbW92ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgY29udGV4dC5maXJlQ29udGFpbmVyRXZlbnQoImFmdGVyQ29udGV4dEF0dHJpYnV0ZVJlbW92ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICAvLyBGSVhNRSAtIHNob3VsZCB3ZSBkbyBhbnl0aGluZyBiZXNpZGVzIGxvZyB0aGVzZT8KKyAgICAgICAgICAgICAgICBsb2coc20uZ2V0U3RyaW5nKCJhcHBsaWNhdGlvbkNvbnRleHQuYXR0cmlidXRlRXZlbnQiKSwgdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQmluZCB0aGUgc3BlY2lmaWVkIHZhbHVlIHdpdGggdGhlIHNwZWNpZmllZCBjb250ZXh0IGF0dHJpYnV0ZSBuYW1lLAorICAgICAqIHJlcGxhY2luZyBhbnkgZXhpc3RpbmcgdmFsdWUgZm9yIHRoYXQgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIEF0dHJpYnV0ZSBuYW1lIHRvIGJlIGJvdW5kCisgICAgICogQHBhcmFtIHZhbHVlIE5ldyBhdHRyaWJ1dGUgdmFsdWUgdG8gYmUgYm91bmQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgeworCisgICAgICAgIC8vIE5hbWUgY2Fubm90IGJlIG51bGwKKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJhcHBsaWNhdGlvbkNvbnRleHQuc2V0QXR0cmlidXRlLm5hbWVudWxsIikpOworCisgICAgICAgIC8vIE51bGwgdmFsdWUgaXMgdGhlIHNhbWUgYXMgcmVtb3ZlQXR0cmlidXRlKCkKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgIHJlbW92ZUF0dHJpYnV0ZShuYW1lKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIE9iamVjdCBvbGRWYWx1ZSA9IG51bGw7CisgICAgICAgIGJvb2xlYW4gcmVwbGFjZWQgPSBmYWxzZTsKKworICAgICAgICAvLyBBZGQgb3IgcmVwbGFjZSB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZQorICAgICAgICBzeW5jaHJvbml6ZWQgKGF0dHJpYnV0ZXMpIHsKKyAgICAgICAgICAgIC8vIENoZWNrIGZvciByZWFkIG9ubHkgYXR0cmlidXRlCisgICAgICAgICAgICBpZiAocmVhZE9ubHlBdHRyaWJ1dGVzLmNvbnRhaW5zS2V5KG5hbWUpKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIG9sZFZhbHVlID0gYXR0cmlidXRlcy5nZXQobmFtZSk7CisgICAgICAgICAgICBpZiAob2xkVmFsdWUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXBsYWNlZCA9IHRydWU7CisgICAgICAgICAgICBhdHRyaWJ1dGVzLnB1dChuYW1lLCB2YWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBOb3RpZnkgaW50ZXJlc3RlZCBhcHBsaWNhdGlvbiBldmVudCBsaXN0ZW5lcnMKKyAgICAgICAgT2JqZWN0IGxpc3RlbmVyc1tdID0gY29udGV4dC5nZXRBcHBsaWNhdGlvbkV2ZW50TGlzdGVuZXJzKCk7CisgICAgICAgIGlmICgobGlzdGVuZXJzID09IG51bGwpIHx8IChsaXN0ZW5lcnMubGVuZ3RoID09IDApKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBTZXJ2bGV0Q29udGV4dEF0dHJpYnV0ZUV2ZW50IGV2ZW50ID0gbnVsbDsKKyAgICAgICAgaWYgKHJlcGxhY2VkKQorICAgICAgICAgICAgZXZlbnQgPQorICAgICAgICAgICAgICAgIG5ldyBTZXJ2bGV0Q29udGV4dEF0dHJpYnV0ZUV2ZW50KGNvbnRleHQuZ2V0U2VydmxldENvbnRleHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBvbGRWYWx1ZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGV2ZW50ID0KKyAgICAgICAgICAgICAgICBuZXcgU2VydmxldENvbnRleHRBdHRyaWJ1dGVFdmVudChjb250ZXh0LmdldFNlcnZsZXRDb250ZXh0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgdmFsdWUpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoIShsaXN0ZW5lcnNbaV0gaW5zdGFuY2VvZiBTZXJ2bGV0Q29udGV4dEF0dHJpYnV0ZUxpc3RlbmVyKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIFNlcnZsZXRDb250ZXh0QXR0cmlidXRlTGlzdGVuZXIgbGlzdGVuZXIgPQorICAgICAgICAgICAgICAgIChTZXJ2bGV0Q29udGV4dEF0dHJpYnV0ZUxpc3RlbmVyKSBsaXN0ZW5lcnNbaV07CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmIChyZXBsYWNlZCkgeworICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmZpcmVDb250YWluZXJFdmVudAorICAgICAgICAgICAgICAgICAgICAgICAgKCJiZWZvcmVDb250ZXh0QXR0cmlidXRlUmVwbGFjZWQiLCBsaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLmF0dHJpYnV0ZVJlcGxhY2VkKGV2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dC5maXJlQ29udGFpbmVyRXZlbnQoImFmdGVyQ29udGV4dEF0dHJpYnV0ZVJlcGxhY2VkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZmlyZUNvbnRhaW5lckV2ZW50KCJiZWZvcmVDb250ZXh0QXR0cmlidXRlQWRkZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLmF0dHJpYnV0ZUFkZGVkKGV2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dC5maXJlQ29udGFpbmVyRXZlbnQoImFmdGVyQ29udGV4dEF0dHJpYnV0ZUFkZGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgaWYgKHJlcGxhY2VkKQorICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmZpcmVDb250YWluZXJFdmVudCgiYWZ0ZXJDb250ZXh0QXR0cmlidXRlUmVwbGFjZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmZpcmVDb250YWluZXJFdmVudCgiYWZ0ZXJDb250ZXh0QXR0cmlidXRlQWRkZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgLy8gRklYTUUgLSBzaG91bGQgd2UgZG8gYW55dGhpbmcgYmVzaWRlcyBsb2cgdGhlc2U/CisgICAgICAgICAgICAgICAgbG9nKHNtLmdldFN0cmluZygiYXBwbGljYXRpb25Db250ZXh0LmF0dHJpYnV0ZUV2ZW50IiksIHQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBhY2thZ2UgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBDbGVhciBhbGwgYXBwbGljYXRpb24tY3JlYXRlZCBhdHRyaWJ1dGVzLgorICAgICAqLworICAgIHZvaWQgY2xlYXJBdHRyaWJ1dGVzKCkgeworCisgICAgICAgIC8vIENyZWF0ZSBsaXN0IG9mIGF0dHJpYnV0ZXMgdG8gYmUgcmVtb3ZlZAorICAgICAgICBBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgc3luY2hyb25pemVkIChhdHRyaWJ1dGVzKSB7CisgICAgICAgICAgICBJdGVyYXRvciBpdGVyID0gYXR0cmlidXRlcy5rZXlTZXQoKS5pdGVyYXRvcigpOworICAgICAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgbGlzdC5hZGQoaXRlci5uZXh0KCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gUmVtb3ZlIGFwcGxpY2F0aW9uIG9yaWdpbmF0ZWQgYXR0cmlidXRlcworICAgICAgICAvLyAocmVhZCBvbmx5IGF0dHJpYnV0ZXMgd2lsbCBiZSBsZWZ0IGluIHBsYWNlKQorICAgICAgICBJdGVyYXRvciBrZXlzID0gbGlzdC5pdGVyYXRvcigpOworICAgICAgICB3aGlsZSAoa2V5cy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKSBrZXlzLm5leHQoKTsKKyAgICAgICAgICAgIHJlbW92ZUF0dHJpYnV0ZShrZXkpOworICAgICAgICB9CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGZhY2FkZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBBcHBsaWNhdGlvbkNvbnRleHQuCisgICAgICovCisgICAgcHJvdGVjdGVkIFNlcnZsZXRDb250ZXh0IGdldEZhY2FkZSgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMuZmFjYWRlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IGFuIGF0dHJpYnV0ZSBhcyByZWFkIG9ubHkuCisgICAgICovCisgICAgdm9pZCBzZXRBdHRyaWJ1dGVSZWFkT25seShTdHJpbmcgbmFtZSkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAoYXR0cmlidXRlcykgeworICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZXMuY29udGFpbnNLZXkobmFtZSkpCisgICAgICAgICAgICAgICAgcmVhZE9ubHlBdHRyaWJ1dGVzLnB1dChuYW1lLCBuYW1lKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcml2YXRlIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgY29udGV4dC1yZWxhdGl2ZSBwYXRoLCBiZWdpbm5pbmcgd2l0aCBhICIvIiwgdGhhdCByZXByZXNlbnRzCisgICAgICogdGhlIGNhbm9uaWNhbCB2ZXJzaW9uIG9mIHRoZSBzcGVjaWZpZWQgcGF0aCBhZnRlciAiLi4iIGFuZCAiLiIgZWxlbWVudHMKKyAgICAgKiBhcmUgcmVzb2x2ZWQgb3V0LiAgSWYgdGhlIHNwZWNpZmllZCBwYXRoIGF0dGVtcHRzIHRvIGdvIG91dHNpZGUgdGhlCisgICAgICogYm91bmRhcmllcyBvZiB0aGUgY3VycmVudCBjb250ZXh0IChpLmUuIHRvbyBtYW55ICIuLiIgcGF0aCBlbGVtZW50cworICAgICAqIGFyZSBwcmVzZW50KSwgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGluc3RlYWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0aCBQYXRoIHRvIGJlIG5vcm1hbGl6ZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBub3JtYWxpemUoU3RyaW5nIHBhdGgpIHsKKworICAgICAgICBTdHJpbmcgbm9ybWFsaXplZCA9IHBhdGg7CisKKyAgICAgICAgLy8gTm9ybWFsaXplIHRoZSBzbGFzaGVzIGFuZCBhZGQgbGVhZGluZyBzbGFzaCBpZiBuZWNlc3NhcnkKKyAgICAgICAgaWYgKG5vcm1hbGl6ZWQuaW5kZXhPZignXFwnKSA+PSAwKQorICAgICAgICAgICAgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZWQucmVwbGFjZSgnXFwnLCAnLycpOworCisgICAgICAgIC8vIFJlc29sdmUgb2NjdXJyZW5jZXMgb2YgIi8uLi8iIGluIHRoZSBub3JtYWxpemVkIHBhdGgKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIGludCBpbmRleCA9IG5vcm1hbGl6ZWQuaW5kZXhPZigiLy4uLyIpOworICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGlmIChpbmRleCA9PSAwKQorICAgICAgICAgICAgICAgIHJldHVybiAobnVsbCk7ICAvLyBUcnlpbmcgdG8gZ28gb3V0c2lkZSBvdXIgY29udGV4dAorICAgICAgICAgICAgaW50IGluZGV4MiA9IG5vcm1hbGl6ZWQubGFzdEluZGV4T2YoJy8nLCBpbmRleCAtIDEpOworICAgICAgICAgICAgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZWQuc3Vic3RyaW5nKDAsIGluZGV4MikgKworICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWQuc3Vic3RyaW5nKGluZGV4ICsgMyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXR1cm4gdGhlIG5vcm1hbGl6ZWQgcGF0aCB0aGF0IHdlIGhhdmUgY29tcGxldGVkCisgICAgICAgIHJldHVybiAobm9ybWFsaXplZCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIE1lcmdlIHRoZSBjb250ZXh0IGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMgc3BlY2lmaWVkIGluIHRoZSBhcHBsaWNhdGlvbgorICAgICAqIGRlcGxveW1lbnQgZGVzY3JpcHRvciB3aXRoIHRoZSBhcHBsaWNhdGlvbiBwYXJhbWV0ZXJzIGRlc2NyaWJlZCBpbiB0aGUKKyAgICAgKiBzZXJ2ZXIgY29uZmlndXJhdGlvbiwgcmVzcGVjdGluZyB0aGUgPGNvZGU+b3ZlcnJpZGU8L2NvZGU+IHByb3BlcnR5IG9mCisgICAgICogdGhlIGFwcGxpY2F0aW9uIHBhcmFtZXRlcnMgYXBwcm9wcmlhdGVseS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgbWVyZ2VQYXJhbWV0ZXJzKCkgeworCisgICAgICAgIGlmIChwYXJhbWV0ZXJzICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIEhhc2hNYXAgcmVzdWx0cyA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgIFN0cmluZyBuYW1lc1tdID0gY29udGV4dC5maW5kUGFyYW1ldGVycygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgcmVzdWx0cy5wdXQobmFtZXNbaV0sIGNvbnRleHQuZmluZFBhcmFtZXRlcihuYW1lc1tpXSkpOworICAgICAgICBBcHBsaWNhdGlvblBhcmFtZXRlciBwYXJhbXNbXSA9CisgICAgICAgICAgICBjb250ZXh0LmZpbmRBcHBsaWNhdGlvblBhcmFtZXRlcnMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChwYXJhbXNbaV0uZ2V0T3ZlcnJpZGUoKSkgeworICAgICAgICAgICAgICAgIGlmIChyZXN1bHRzLmdldChwYXJhbXNbaV0uZ2V0TmFtZSgpKSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICByZXN1bHRzLnB1dChwYXJhbXNbaV0uZ2V0TmFtZSgpLCBwYXJhbXNbaV0uZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlc3VsdHMucHV0KHBhcmFtc1tpXS5nZXROYW1lKCksIHBhcmFtc1tpXS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwYXJhbWV0ZXJzID0gcmVzdWx0czsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogTGlzdCByZXNvdXJjZSBwYXRocyAocmVjdXJzaXZlbHkpLCBhbmQgc3RvcmUgYWxsIG9mIHRoZW0gaW4gdGhlIGdpdmVuCisgICAgICogU2V0LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgbGlzdFBhdGhzKFNldCBzZXQsIERpckNvbnRleHQgcmVzb3VyY2VzLCBTdHJpbmcgcGF0aCkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisKKyAgICAgICAgRW51bWVyYXRpb24gY2hpbGRQYXRocyA9IHJlc291cmNlcy5saXN0QmluZGluZ3MocGF0aCk7CisgICAgICAgIHdoaWxlIChjaGlsZFBhdGhzLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZykgY2hpbGRQYXRocy5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBiaW5kaW5nLmdldE5hbWUoKTsKKyAgICAgICAgICAgIFN0cmluZyBjaGlsZFBhdGggPSBwYXRoICsgIi8iICsgbmFtZTsKKyAgICAgICAgICAgIHNldC5hZGQoY2hpbGRQYXRoKTsKKyAgICAgICAgICAgIE9iamVjdCBvYmplY3QgPSBiaW5kaW5nLmdldE9iamVjdCgpOworICAgICAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIERpckNvbnRleHQpIHsKKyAgICAgICAgICAgICAgICBsaXN0UGF0aHMoc2V0LCByZXNvdXJjZXMsIGNoaWxkUGF0aCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogTGlzdCByZXNvdXJjZSBwYXRocyAocmVjdXJzaXZlbHkpLCBhbmQgc3RvcmUgYWxsIG9mIHRoZW0gaW4gdGhlIGdpdmVuCisgICAgICogU2V0LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgbGlzdENvbGxlY3Rpb25QYXRocworICAgICAgICAoU2V0IHNldCwgRGlyQ29udGV4dCByZXNvdXJjZXMsIFN0cmluZyBwYXRoKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKworICAgICAgICBFbnVtZXJhdGlvbiBjaGlsZFBhdGhzID0gcmVzb3VyY2VzLmxpc3RCaW5kaW5ncyhwYXRoKTsKKyAgICAgICAgd2hpbGUgKGNoaWxkUGF0aHMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgIEJpbmRpbmcgYmluZGluZyA9IChCaW5kaW5nKSBjaGlsZFBhdGhzLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGJpbmRpbmcuZ2V0TmFtZSgpOworICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGNoaWxkUGF0aCA9IG5ldyBTdHJpbmdCdWZmZXIocGF0aCk7CisgICAgICAgICAgICBpZiAoISIvIi5lcXVhbHMocGF0aCkgJiYgIXBhdGguZW5kc1dpdGgoIi8iKSkKKyAgICAgICAgICAgICAgICBjaGlsZFBhdGguYXBwZW5kKCIvIik7CisgICAgICAgICAgICBjaGlsZFBhdGguYXBwZW5kKG5hbWUpOworICAgICAgICAgICAgT2JqZWN0IG9iamVjdCA9IGJpbmRpbmcuZ2V0T2JqZWN0KCk7CisgICAgICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgRGlyQ29udGV4dCkgeworICAgICAgICAgICAgICAgIGNoaWxkUGF0aC5hcHBlbmQoIi8iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldC5hZGQoY2hpbGRQYXRoLnRvU3RyaW5nKCkpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdldCBmdWxsIHBhdGgsIGJhc2VkIG9uIHRoZSBob3N0IG5hbWUgYW5kIHRoZSBjb250ZXh0IHBhdGguCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEpORElVcmkoU3RyaW5nIGhvc3ROYW1lLCBTdHJpbmcgcGF0aCkgeworICAgICAgICBpZiAoIXBhdGguc3RhcnRzV2l0aCgiLyIpKQorICAgICAgICAgICAgcmV0dXJuICIvIiArIGhvc3ROYW1lICsgIi8iICsgcGF0aDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuICIvIiArIGhvc3ROYW1lICsgcGF0aDsKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NvcmUvQXBwbGljYXRpb25Db250ZXh0RmFjYWRlLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29yZS9BcHBsaWNhdGlvbkNvbnRleHRGYWNhZGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWEwMjk0Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NvcmUvQXBwbGljYXRpb25Db250ZXh0RmFjYWRlLmphdmEKQEAgLTAsMCArMSw1MDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZTsKKworCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXguc2VydmxldC5SZXF1ZXN0RGlzcGF0Y2hlcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXQ7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CisKKworLyoqCisgKiBGYWNhZGUgb2JqZWN0IHdoaWNoIG1hc2tzIHRoZSBpbnRlcm5hbCA8Y29kZT5BcHBsaWNhdGlvbkNvbnRleHQ8L2NvZGU+CisgKiBvYmplY3QgZnJvbSB0aGUgd2ViIGFwcGxpY2F0aW9uLgorICoKKyAqIEBhdXRob3IgUmVteSBNYXVjaGVyYXQKKyAqIEBhdXRob3IgSmVhbi1GcmFuY29pcyBBcmNhbmQKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIEFwcGxpY2F0aW9uQ29udGV4dEZhY2FkZQorICAgIGltcGxlbWVudHMgU2VydmxldENvbnRleHQgeworICAgICAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEF0dHJpYnV0ZXMKKyAgICAvKioKKyAgICAgKiBDYWNoZSBDbGFzcyBvYmplY3QgdXNlZCBmb3IgcmVmbGVjdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIEhhc2hNYXAgY2xhc3NDYWNoZTsKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBDYWNoZSBtZXRob2Qgb2JqZWN0LgorICAgICAqLworICAgIHByaXZhdGUgSGFzaE1hcCBvYmplY3RDYWNoZTsKKyAgICAKKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2cgc3lzTG9nPQorICAgICAgICBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5LmdldExvZyggQXBwbGljYXRpb25Db250ZXh0RmFjYWRlLmNsYXNzICk7CisKKyAgICAgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLCBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZAorICAgICAqIENvbnRleHQgaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgYXNzb2NpYXRlZCBDb250ZXh0IGluc3RhbmNlCisgICAgICovCisgICAgcHVibGljIEFwcGxpY2F0aW9uQ29udGV4dEZhY2FkZShBcHBsaWNhdGlvbkNvbnRleHQgY29udGV4dCkgeworICAgICAgICBzdXBlcigpOworICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0OworICAgICAgICAKKyAgICAgICAgY2xhc3NDYWNoZSA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgIG9iamVjdENhY2hlID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgaW5pdENsYXNzQ2FjaGUoKTsKKyAgICB9CisgICAgCisgICAgCisgICAgcHJpdmF0ZSB2b2lkIGluaXRDbGFzc0NhY2hlKCl7CisgICAgICAgIENsYXNzW10gY2xhenogPSBuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3N9OworICAgICAgICBjbGFzc0NhY2hlLnB1dCgiZ2V0Q29udGV4dCIsIGNsYXp6KTsKKyAgICAgICAgY2xhc3NDYWNoZS5wdXQoImdldE1pbWVUeXBlIiwgY2xhenopOworICAgICAgICBjbGFzc0NhY2hlLnB1dCgiZ2V0UmVzb3VyY2VQYXRocyIsIGNsYXp6KTsKKyAgICAgICAgY2xhc3NDYWNoZS5wdXQoImdldFJlc291cmNlIiwgY2xhenopOworICAgICAgICBjbGFzc0NhY2hlLnB1dCgiZ2V0UmVzb3VyY2VBc1N0cmVhbSIsIGNsYXp6KTsKKyAgICAgICAgY2xhc3NDYWNoZS5wdXQoImdldFJlcXVlc3REaXNwYXRjaGVyIiwgY2xhenopOworICAgICAgICBjbGFzc0NhY2hlLnB1dCgiZ2V0TmFtZWREaXNwYXRjaGVyIiwgY2xhenopOworICAgICAgICBjbGFzc0NhY2hlLnB1dCgiZ2V0U2VydmxldCIsIGNsYXp6KTsKKyAgICAgICAgY2xhc3NDYWNoZS5wdXQoImdldEluaXRQYXJhbWV0ZXIiLCBjbGF6eik7CisgICAgICAgIGNsYXNzQ2FjaGUucHV0KCJzZXRBdHRyaWJ1dGUiLCBuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3MsIE9iamVjdC5jbGFzc30pOworICAgICAgICBjbGFzc0NhY2hlLnB1dCgicmVtb3ZlQXR0cmlidXRlIiwgY2xhenopOworICAgICAgICBjbGFzc0NhY2hlLnB1dCgiZ2V0UmVhbFBhdGgiLCBjbGF6eik7CisgICAgICAgIGNsYXNzQ2FjaGUucHV0KCJnZXRBdHRyaWJ1dGUiLCBjbGF6eik7CisgICAgICAgIGNsYXNzQ2FjaGUucHV0KCJsb2ciLCBjbGF6eik7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogV3JhcHBlZCBhcHBsaWNhdGlvbiBjb250ZXh0LgorICAgICAqLworICAgIHByaXZhdGUgQXBwbGljYXRpb25Db250ZXh0IGNvbnRleHQgPSBudWxsOworICAgIAorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNlcnZsZXRDb250ZXh0IE1ldGhvZHMKKworCisgICAgcHVibGljIFNlcnZsZXRDb250ZXh0IGdldENvbnRleHQoU3RyaW5nIHVyaXBhdGgpIHsKKyAgICAgICAgU2VydmxldENvbnRleHQgdGhlQ29udGV4dCA9IG51bGw7CisgICAgICAgIGlmIChTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhlQ29udGV4dCA9IChTZXJ2bGV0Q29udGV4dCkKKyAgICAgICAgICAgICAgICBkb1ByaXZpbGVnZWQoImdldENvbnRleHQiLCBuZXcgT2JqZWN0W117dXJpcGF0aH0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhlQ29udGV4dCA9IGNvbnRleHQuZ2V0Q29udGV4dCh1cmlwYXRoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHRoZUNvbnRleHQgIT0gbnVsbCkgJiYKKyAgICAgICAgICAgICh0aGVDb250ZXh0IGluc3RhbmNlb2YgQXBwbGljYXRpb25Db250ZXh0KSl7CisgICAgICAgICAgICB0aGVDb250ZXh0ID0gKChBcHBsaWNhdGlvbkNvbnRleHQpdGhlQ29udGV4dCkuZ2V0RmFjYWRlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICh0aGVDb250ZXh0KTsKKyAgICB9CisKKworICAgIHB1YmxpYyBpbnQgZ2V0TWFqb3JWZXJzaW9uKCkgeworICAgICAgICByZXR1cm4gY29udGV4dC5nZXRNYWpvclZlcnNpb24oKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBpbnQgZ2V0TWlub3JWZXJzaW9uKCkgeworICAgICAgICByZXR1cm4gY29udGV4dC5nZXRNaW5vclZlcnNpb24oKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWltZVR5cGUoU3RyaW5nIGZpbGUpIHsKKyAgICAgICAgaWYgKFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gKFN0cmluZylkb1ByaXZpbGVnZWQoImdldE1pbWVUeXBlIiwgbmV3IE9iamVjdFtde2ZpbGV9KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmdldE1pbWVUeXBlKGZpbGUpOworICAgICAgICB9CisgICAgfQorCisKKyAgICBwdWJsaWMgU2V0IGdldFJlc291cmNlUGF0aHMoU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgaWYgKFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSAhPSBudWxsKXsKKyAgICAgICAgICAgIHJldHVybiAoU2V0KWRvUHJpdmlsZWdlZCgiZ2V0UmVzb3VyY2VQYXRocyIsIG5ldyBPYmplY3RbXXtwYXRofSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gY29udGV4dC5nZXRSZXNvdXJjZVBhdGhzKHBhdGgpOworICAgICAgICB9CisgICAgfQorCisKKyAgICBwdWJsaWMgVVJMIGdldFJlc291cmNlKFN0cmluZyBwYXRoKQorICAgICAgICB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiAoVVJMKSBpbnZva2VNZXRob2QoY29udGV4dCwgImdldFJlc291cmNlIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W117cGF0aH0pOworICAgICAgICAgICAgfSBjYXRjaChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgIGlmICh0IGluc3RhbmNlb2YgTWFsZm9ybWVkVVJMRXhjZXB0aW9uKXsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbil0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmdldFJlc291cmNlKHBhdGgpOworICAgICAgICB9CisgICAgfQorCisKKyAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0UmVzb3VyY2VBc1N0cmVhbShTdHJpbmcgcGF0aCkgeworICAgICAgICBpZiAoU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiAoSW5wdXRTdHJlYW0pIGRvUHJpdmlsZWdlZCgiZ2V0UmVzb3VyY2VBc1N0cmVhbSIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXXtwYXRofSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gY29udGV4dC5nZXRSZXNvdXJjZUFzU3RyZWFtKHBhdGgpOworICAgICAgICB9CisgICAgfQorCisKKyAgICBwdWJsaWMgUmVxdWVzdERpc3BhdGNoZXIgZ2V0UmVxdWVzdERpc3BhdGNoZXIoZmluYWwgU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgaWYgKFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gKFJlcXVlc3REaXNwYXRjaGVyKSBkb1ByaXZpbGVnZWQoImdldFJlcXVlc3REaXNwYXRjaGVyIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtde3BhdGh9KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmdldFJlcXVlc3REaXNwYXRjaGVyKHBhdGgpOworICAgICAgICB9CisgICAgfQorCisKKyAgICBwdWJsaWMgUmVxdWVzdERpc3BhdGNoZXIgZ2V0TmFtZWREaXNwYXRjaGVyKFN0cmluZyBuYW1lKSB7CisgICAgICAgIGlmIChTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIChSZXF1ZXN0RGlzcGF0Y2hlcikgZG9Qcml2aWxlZ2VkKCJnZXROYW1lZERpc3BhdGNoZXIiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W117bmFtZX0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0TmFtZWREaXNwYXRjaGVyKG5hbWUpOworICAgICAgICB9CisgICAgfQorCisKKyAgICBwdWJsaWMgU2VydmxldCBnZXRTZXJ2bGV0KFN0cmluZyBuYW1lKQorICAgICAgICB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKFNlcnZsZXQpIGludm9rZU1ldGhvZChjb250ZXh0LCAiZ2V0U2VydmxldCIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXXtuYW1lfSk7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgIGlmICh0IGluc3RhbmNlb2YgU2VydmxldEV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyAoU2VydmxldEV4Y2VwdGlvbikgdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gY29udGV4dC5nZXRTZXJ2bGV0KG5hbWUpOworICAgICAgICB9CisgICAgfQorCisKKyAgICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0U2VydmxldHMoKSB7CisgICAgICAgIGlmIChTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIChFbnVtZXJhdGlvbikgZG9Qcml2aWxlZ2VkKCJnZXRTZXJ2bGV0cyIsIG51bGwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0U2VydmxldHMoKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHVibGljIEVudW1lcmF0aW9uIGdldFNlcnZsZXROYW1lcygpIHsKKyAgICAgICAgaWYgKFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gKEVudW1lcmF0aW9uKSBkb1ByaXZpbGVnZWQoImdldFNlcnZsZXROYW1lcyIsIG51bGwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0U2VydmxldE5hbWVzKCk7CisgICAgICAgIH0KKyAgIH0KKworCisgICAgcHVibGljIHZvaWQgbG9nKFN0cmluZyBtc2cpIHsKKyAgICAgICAgaWYgKFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBkb1ByaXZpbGVnZWQoImxvZyIsIG5ldyBPYmplY3RbXXttc2d9ICk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb250ZXh0LmxvZyhtc2cpOworICAgICAgICB9CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBsb2coRXhjZXB0aW9uIGV4Y2VwdGlvbiwgU3RyaW5nIG1zZykgeworICAgICAgICBpZiAoU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGRvUHJpdmlsZWdlZCgibG9nIiwgbmV3IENsYXNzW117RXhjZXB0aW9uLmNsYXNzLCBTdHJpbmcuY2xhc3N9LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W117ZXhjZXB0aW9uLG1zZ30pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29udGV4dC5sb2coZXhjZXB0aW9uLCBtc2cpOworICAgICAgICB9CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBsb2coU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSB0aHJvd2FibGUpIHsKKyAgICAgICAgaWYgKFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBkb1ByaXZpbGVnZWQoImxvZyIsIG5ldyBDbGFzc1tde1N0cmluZy5jbGFzcywgVGhyb3dhYmxlLmNsYXNzfSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtde21lc3NhZ2UsIHRocm93YWJsZX0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29udGV4dC5sb2cobWVzc2FnZSwgdGhyb3dhYmxlKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHVibGljIFN0cmluZyBnZXRSZWFsUGF0aChTdHJpbmcgcGF0aCkgeworICAgICAgICBpZiAoU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiAoU3RyaW5nKSBkb1ByaXZpbGVnZWQoImdldFJlYWxQYXRoIiwgbmV3IE9iamVjdFtde3BhdGh9KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmdldFJlYWxQYXRoKHBhdGgpOworICAgICAgICB9CisgICAgfQorCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFNlcnZlckluZm8oKSB7CisgICAgICAgIGlmIChTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpIGRvUHJpdmlsZWdlZCgiZ2V0U2VydmVySW5mbyIsIG51bGwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0U2VydmVySW5mbygpOworICAgICAgICB9CisgICAgfQorCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEluaXRQYXJhbWV0ZXIoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgaWYgKFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gKFN0cmluZykgZG9Qcml2aWxlZ2VkKCJnZXRJbml0UGFyYW1ldGVyIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXXtuYW1lfSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gY29udGV4dC5nZXRJbml0UGFyYW1ldGVyKG5hbWUpOworICAgICAgICB9CisgICAgfQorCisKKyAgICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0SW5pdFBhcmFtZXRlck5hbWVzKCkgeworICAgICAgICBpZiAoU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiAoRW51bWVyYXRpb24pIGRvUHJpdmlsZWdlZCgiZ2V0SW5pdFBhcmFtZXRlck5hbWVzIiwgbnVsbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gY29udGV4dC5nZXRJbml0UGFyYW1ldGVyTmFtZXMoKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHVibGljIE9iamVjdCBnZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgaWYgKFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZG9Qcml2aWxlZ2VkKCJnZXRBdHRyaWJ1dGUiLCBuZXcgT2JqZWN0W117bmFtZX0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0QXR0cmlidXRlKG5hbWUpOworICAgICAgICB9CisgICAgIH0KKworCisgICAgcHVibGljIEVudW1lcmF0aW9uIGdldEF0dHJpYnV0ZU5hbWVzKCkgeworICAgICAgICBpZiAoU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiAoRW51bWVyYXRpb24pIGRvUHJpdmlsZWdlZCgiZ2V0QXR0cmlidXRlTmFtZXMiLCBudWxsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmdldEF0dHJpYnV0ZU5hbWVzKCk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgT2JqZWN0IG9iamVjdCkgeworICAgICAgICBpZiAoU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGRvUHJpdmlsZWdlZCgic2V0QXR0cmlidXRlIiwgbmV3IE9iamVjdFtde25hbWUsb2JqZWN0fSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb250ZXh0LnNldEF0dHJpYnV0ZShuYW1lLCBvYmplY3QpOworICAgICAgICB9CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgaWYgKFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBkb1ByaXZpbGVnZWQoInJlbW92ZUF0dHJpYnV0ZSIsIG5ldyBPYmplY3RbXXtuYW1lfSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb250ZXh0LnJlbW92ZUF0dHJpYnV0ZShuYW1lKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHVibGljIFN0cmluZyBnZXRTZXJ2bGV0Q29udGV4dE5hbWUoKSB7CisgICAgICAgIGlmIChTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpIGRvUHJpdmlsZWdlZCgiZ2V0U2VydmxldENvbnRleHROYW1lIiwgbnVsbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gY29udGV4dC5nZXRTZXJ2bGV0Q29udGV4dE5hbWUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgICAgIAorICAgIC8qKgorICAgICAqIFVzZSByZWZsZWN0aW9uIHRvIGludm9rZSB0aGUgcmVxdWVzdGVkIG1ldGhvZC4gQ2FjaGUgdGhlIG1ldGhvZCBvYmplY3QgCisgICAgICogdG8gc3BlZWQgdXAgdGhlIHByb2Nlc3MKKyAgICAgKiBAcGFyYW0gYXBwQ29udGV4dCBUaGUgQXBwbGlhdGlvbkNvbnRleHQgb2JqZWN0IG9uIHdoaWNoIHRoZSBtZXRob2QKKyAgICAgKiAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGludm9rZWQKKyAgICAgKiBAcGFyYW0gbWV0aG9kTmFtZSBUaGUgbWV0aG9kIHRvIGNhbGwuCisgICAgICogQHBhcmFtIHBhcmFtcyBUaGUgYXJndW1lbnRzIHBhc3NlZCB0byB0aGUgY2FsbGVkIG1ldGhvZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE9iamVjdCBkb1ByaXZpbGVnZWQoQXBwbGljYXRpb25Db250ZXh0IGFwcENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtZXRob2ROYW1lLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0W10gcGFyYW1zKSB7CisgICAgICAgIHRyeXsKKyAgICAgICAgICAgIHJldHVybiBpbnZva2VNZXRob2QoYXBwQ29udGV4dCwgbWV0aG9kTmFtZSwgcGFyYW1zICk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KXsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKHQuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBVc2UgcmVmbGVjdGlvbiB0byBpbnZva2UgdGhlIHJlcXVlc3RlZCBtZXRob2QuIENhY2hlIHRoZSBtZXRob2Qgb2JqZWN0IAorICAgICAqIHRvIHNwZWVkIHVwIHRoZSBwcm9jZXNzCisgICAgICogICAgICAgICAgICAgICAgICAgd2lsbCBiZSBpbnZva2VkCisgICAgICogQHBhcmFtIG1ldGhvZE5hbWUgVGhlIG1ldGhvZCB0byBjYWxsLgorICAgICAqIEBwYXJhbSBwYXJhbXMgVGhlIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIGNhbGxlZCBtZXRob2QuCisgICAgICovCisgICAgcHJpdmF0ZSBPYmplY3QgZG9Qcml2aWxlZ2VkKGZpbmFsIFN0cmluZyBtZXRob2ROYW1lLCBmaW5hbCBPYmplY3RbXSBwYXJhbXMpeworICAgICAgICB0cnl7CisgICAgICAgICAgICByZXR1cm4gaW52b2tlTWV0aG9kKGNvbnRleHQsIG1ldGhvZE5hbWUsIHBhcmFtcyk7CisgICAgICAgIH1jYXRjaChUaHJvd2FibGUgdCl7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbih0LmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAKKyAgICAvKioKKyAgICAgKiBVc2UgcmVmbGVjdGlvbiB0byBpbnZva2UgdGhlIHJlcXVlc3RlZCBtZXRob2QuIENhY2hlIHRoZSBtZXRob2Qgb2JqZWN0IAorICAgICAqIHRvIHNwZWVkIHVwIHRoZSBwcm9jZXNzCisgICAgICogQHBhcmFtIGFwcENvbnRleHQgVGhlIEFwcGxpYXRpb25Db250ZXh0IG9iamVjdCBvbiB3aGljaCB0aGUgbWV0aG9kCisgICAgICogICAgICAgICAgICAgICAgICAgd2lsbCBiZSBpbnZva2VkCisgICAgICogQHBhcmFtIG1ldGhvZE5hbWUgVGhlIG1ldGhvZCB0byBjYWxsLgorICAgICAqIEBwYXJhbSBwYXJhbXMgVGhlIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIGNhbGxlZCBtZXRob2QuCisgICAgICovCisgICAgcHJpdmF0ZSBPYmplY3QgaW52b2tlTWV0aG9kKEFwcGxpY2F0aW9uQ29udGV4dCBhcHBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbWV0aG9kTmFtZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdFtdIHBhcmFtcykgCisgICAgICAgIHRocm93cyBUaHJvd2FibGV7CisKKyAgICAgICAgdHJ5eworICAgICAgICAgICAgTWV0aG9kIG1ldGhvZCA9IChNZXRob2Qpb2JqZWN0Q2FjaGUuZ2V0KG1ldGhvZE5hbWUpOworICAgICAgICAgICAgaWYgKG1ldGhvZCA9PSBudWxsKXsKKyAgICAgICAgICAgICAgICBtZXRob2QgPSBhcHBDb250ZXh0LmdldENsYXNzKCkKKyAgICAgICAgICAgICAgICAgICAgLmdldE1ldGhvZChtZXRob2ROYW1lLCAoQ2xhc3NbXSljbGFzc0NhY2hlLmdldChtZXRob2ROYW1lKSk7CisgICAgICAgICAgICAgICAgb2JqZWN0Q2FjaGUucHV0KG1ldGhvZE5hbWUsIG1ldGhvZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHJldHVybiBleGVjdXRlTWV0aG9kKG1ldGhvZCxhcHBDb250ZXh0LHBhcmFtcyk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCl7CisgICAgICAgICAgICBoYW5kbGVFeGNlcHRpb24oZXgsIG1ldGhvZE5hbWUpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogVXNlIHJlZmxlY3Rpb24gdG8gaW52b2tlIHRoZSByZXF1ZXN0ZWQgbWV0aG9kLiBDYWNoZSB0aGUgbWV0aG9kIG9iamVjdCAKKyAgICAgKiB0byBzcGVlZCB1cCB0aGUgcHJvY2VzcworICAgICAqIEBwYXJhbSBtZXRob2ROYW1lIFRoZSBtZXRob2QgdG8gaW52b2tlLgorICAgICAqIEBwYXJhbSBjbGF6eiBUaGUgY2xhc3Mgd2hlcmUgdGhlIG1ldGhvZCBpcy4KKyAgICAgKiBAcGFyYW0gcGFyYW1zIFRoZSBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBjYWxsZWQgbWV0aG9kLgorICAgICAqLyAgICAKKyAgICBwcml2YXRlIE9iamVjdCBkb1ByaXZpbGVnZWQoZmluYWwgU3RyaW5nIG1ldGhvZE5hbWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDbGFzc1tdIGNsYXp6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3RbXSBwYXJhbXMpeworCisgICAgICAgIHRyeXsKKyAgICAgICAgICAgIE1ldGhvZCBtZXRob2QgPSBjb250ZXh0LmdldENsYXNzKCkKKyAgICAgICAgICAgICAgICAgICAgLmdldE1ldGhvZChtZXRob2ROYW1lLCAoQ2xhc3NbXSljbGF6eik7CisgICAgICAgICAgICByZXR1cm4gZXhlY3V0ZU1ldGhvZChtZXRob2QsY29udGV4dCxwYXJhbXMpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpeworICAgICAgICAgICAgdHJ5eworICAgICAgICAgICAgICAgIGhhbmRsZUV4Y2VwdGlvbihleCwgbWV0aG9kTmFtZSk7CisgICAgICAgICAgICB9Y2F0Y2ggKFRocm93YWJsZSB0KXsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbih0LmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlcyB0aGUgbWV0aG9kIG9mIHRoZSBzcGVjaWZpZWQgPGNvZGU+QXBwbGljYXRpb25Db250ZXh0PC9jb2RlPgorICAgICAqIEBwYXJhbSBtZXRob2QgVGhlIG1ldGhvZCBvYmplY3QgdG8gYmUgaW52b2tlZC4KKyAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgQXBwbGlhdGlvbkNvbnRleHQgb2JqZWN0IG9uIHdoaWNoIHRoZSBtZXRob2QKKyAgICAgKiAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGludm9rZWQKKyAgICAgKiBAcGFyYW0gcGFyYW1zIFRoZSBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBjYWxsZWQgbWV0aG9kLgorICAgICAqLworICAgIHByaXZhdGUgT2JqZWN0IGV4ZWN1dGVNZXRob2QoZmluYWwgTWV0aG9kIG1ldGhvZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBcHBsaWNhdGlvbkNvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdFtdIHBhcmFtcykgCisgICAgICAgICAgICB0aHJvd3MgUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiwgCisgICAgICAgICAgICAgICAgICAgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgaWYgKFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSAhPSBudWxsKXsKKyAgICAgICAgICAgcmV0dXJuIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKCl7CisgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbnsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1ldGhvZC5pbnZva2UoY29udGV4dCwgIHBhcmFtcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbWV0aG9kLmludm9rZShjb250ZXh0LCBwYXJhbXMpOworICAgICAgICB9ICAgICAgICAKKyAgICB9CisKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaHJvdyB0aGUgcmVhbCBleGNlcHRpb24uCisgICAgICogQHBhcmFtIGV4IFRoZSBjdXJyZW50IGV4Y2VwdGlvbgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBoYW5kbGVFeGNlcHRpb24oRXhjZXB0aW9uIGV4LCBTdHJpbmcgbWV0aG9kTmFtZSkKKwkgICAgdGhyb3dzIFRocm93YWJsZSB7CisKKyAgICAgICAgVGhyb3dhYmxlIHJlYWxFeGNlcHRpb247CisKKyAgICAgICAgaWYgKHN5c0xvZy5pc0RlYnVnRW5hYmxlZCgpKSB7ICAgCisgICAgICAgICAgICBzeXNMb2cuZGVidWcoIkFwcGxpY2F0aW9uQ29udGV4dEZhY2FkZS4iICsgbWV0aG9kTmFtZSwgZXgpOworICAgICAgICB9CisKKwlpZiAoZXggaW5zdGFuY2VvZiBQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uKSB7CisgICAgICAgICAgICBleCA9ICgoUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbikgZXgpLmdldEV4Y2VwdGlvbigpOworCX0KKworICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKSB7CisgICAgICAgICAgICByZWFsRXhjZXB0aW9uID0KKwkJKChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKSBleCkuZ2V0VGFyZ2V0RXhjZXB0aW9uKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZWFsRXhjZXB0aW9uID0gZXg7CisgICAgICAgIH0gICAKKworICAgICAgICB0aHJvdyByZWFsRXhjZXB0aW9uOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb3JlL0FwcGxpY2F0aW9uRGlzcGF0Y2hlci5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NvcmUvQXBwbGljYXRpb25EaXNwYXRjaGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE0NmM2ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb3JlL0FwcGxpY2F0aW9uRGlzcGF0Y2hlci5qYXZhCkBAIC0wLDAgKzEsOTc2IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmU7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb247CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlJlcXVlc3REaXNwYXRjaGVyOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVxdWVzdFdyYXBwZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVzcG9uc2VXcmFwcGVyOworaW1wb3J0IGphdmF4LnNlcnZsZXQuVW5hdmFpbGFibGVFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkdsb2JhbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5JbnN0YW5jZUV2ZW50OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuV3JhcHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3Rvci5DbGllbnRBYm9ydEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3Rvci5SZXF1ZXN0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLlJlcXVlc3RGYWNhZGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuUmVzcG9uc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuUmVzcG9uc2VGYWNhZGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLkluc3RhbmNlU3VwcG9ydDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuU3RyaW5nTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvbWNhdC51dGlsLkludHJvc3BlY3Rpb25VdGlsczsKKworCisvKioKKyAqIFN0YW5kYXJkIGltcGxlbWVudGF0aW9uIG9mIDxjb2RlPlJlcXVlc3REaXNwYXRjaGVyPC9jb2RlPiB0aGF0IGFsbG93cyBhCisgKiByZXF1ZXN0IHRvIGJlIGZvcndhcmRlZCB0byBhIGRpZmZlcmVudCByZXNvdXJjZSB0byBjcmVhdGUgdGhlIHVsdGltYXRlCisgKiByZXNwb25zZSwgb3IgdG8gaW5jbHVkZSB0aGUgb3V0cHV0IG9mIGFub3RoZXIgcmVzb3VyY2UgaW4gdGhlIHJlc3BvbnNlCisgKiBmcm9tIHRoaXMgcmVzb3VyY2UuICBUaGlzIGltcGxlbWVudGF0aW9uIGFsbG93cyBhcHBsaWNhdGlvbiBsZXZlbCBzZXJ2bGV0cworICogdG8gd3JhcCB0aGUgcmVxdWVzdCBhbmQvb3IgcmVzcG9uc2Ugb2JqZWN0cyB0aGF0IGFyZSBwYXNzZWQgb24gdG8gdGhlCisgKiBjYWxsZWQgcmVzb3VyY2UsIGFzIGxvbmcgYXMgdGhlIHdyYXBwaW5nIGNsYXNzZXMgZXh0ZW5kCisgKiA8Y29kZT5qYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXF1ZXN0V3JhcHBlcjwvY29kZT4gYW5kCisgKiA8Y29kZT5qYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXNwb25zZVdyYXBwZXI8L2NvZGU+LgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitmaW5hbCBjbGFzcyBBcHBsaWNhdGlvbkRpc3BhdGNoZXIKKyAgICBpbXBsZW1lbnRzIFJlcXVlc3REaXNwYXRjaGVyIHsKKworCisgICAgcHJvdGVjdGVkIGNsYXNzIFByaXZpbGVnZWRGb3J3YXJkIGltcGxlbWVudHMgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbiB7CisgICAgICAgIHByaXZhdGUgU2VydmxldFJlcXVlc3QgcmVxdWVzdDsKKyAgICAgICAgcHJpdmF0ZSBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2U7CisKKyAgICAgICAgUHJpdmlsZWdlZEZvcndhcmQoU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0OworICAgICAgICAgICAgdGhpcy5yZXNwb25zZSA9IHJlc3BvbnNlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiB7CisgICAgICAgICAgICBkb0ZvcndhcmQocmVxdWVzdCxyZXNwb25zZSk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBjbGFzcyBQcml2aWxlZ2VkSW5jbHVkZSBpbXBsZW1lbnRzIFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24geworICAgICAgICBwcml2YXRlIFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3Q7CisgICAgICAgIHByaXZhdGUgU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlOworCisgICAgICAgIFByaXZpbGVnZWRJbmNsdWRlKFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDsKKyAgICAgICAgICAgIHRoaXMucmVzcG9uc2UgPSByZXNwb25zZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGRvSW5jbHVkZShyZXF1ZXN0LHJlc3BvbnNlKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLCBjb25maWd1cmVkIGFjY29yZGluZyB0byB0aGUKKyAgICAgKiBzcGVjaWZpZWQgcGFyYW1ldGVycy4gIElmIGJvdGggc2VydmxldFBhdGggYW5kIHBhdGhJbmZvIGFyZQorICAgICAqIDxjb2RlPm51bGw8L2NvZGU+LCBpdCB3aWxsIGJlIGFzc3VtZWQgdGhhdCB0aGlzIFJlcXVlc3REaXNwYXRjaGVyCisgICAgICogd2FzIGFjcXVpcmVkIGJ5IG5hbWUsIHJhdGhlciB0aGFuIGJ5IHBhdGguCisgICAgICoKKyAgICAgKiBAcGFyYW0gd3JhcHBlciBUaGUgV3JhcHBlciBhc3NvY2lhdGVkIHdpdGggdGhlIHJlc291cmNlIHRoYXQgd2lsbAorICAgICAqICBiZSBmb3J3YXJkZWQgdG8gb3IgaW5jbHVkZWQgKHJlcXVpcmVkKQorICAgICAqIEBwYXJhbSByZXF1ZXN0VVJJIFRoZSByZXF1ZXN0IFVSSSB0byB0aGlzIHJlc291cmNlIChpZiBhbnkpCisgICAgICogQHBhcmFtIHNlcnZsZXRQYXRoIFRoZSByZXZpc2VkIHNlcnZsZXQgcGF0aCB0byB0aGlzIHJlc291cmNlIChpZiBhbnkpCisgICAgICogQHBhcmFtIHBhdGhJbmZvIFRoZSByZXZpc2VkIGV4dHJhIHBhdGggaW5mb3JtYXRpb24gdG8gdGhpcyByZXNvdXJjZQorICAgICAqICAoaWYgYW55KQorICAgICAqIEBwYXJhbSBxdWVyeVN0cmluZyBRdWVyeSBzdHJpbmcgcGFyYW1ldGVycyBpbmNsdWRlZCB3aXRoIHRoaXMgcmVxdWVzdAorICAgICAqICAoaWYgYW55KQorICAgICAqIEBwYXJhbSBuYW1lIFNlcnZsZXQgbmFtZSAoaWYgYSBuYW1lZCBkaXNwYXRjaGVyIHdhcyBjcmVhdGVkKQorICAgICAqICBlbHNlIDxjb2RlPm51bGw8L2NvZGU+CisgICAgICovCisgICAgcHVibGljIEFwcGxpY2F0aW9uRGlzcGF0Y2hlcgorICAgICAgICAoV3JhcHBlciB3cmFwcGVyLCBTdHJpbmcgcmVxdWVzdFVSSSwgU3RyaW5nIHNlcnZsZXRQYXRoLAorICAgICAgICAgU3RyaW5nIHBhdGhJbmZvLCBTdHJpbmcgcXVlcnlTdHJpbmcsIFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgc3VwZXIoKTsKKworICAgICAgICAvLyBTYXZlIGFsbCBvZiBvdXIgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCisgICAgICAgIHRoaXMud3JhcHBlciA9IHdyYXBwZXI7CisgICAgICAgIHRoaXMuY29udGV4dCA9IChDb250ZXh0KSB3cmFwcGVyLmdldFBhcmVudCgpOworICAgICAgICB0aGlzLnJlcXVlc3RVUkkgPSByZXF1ZXN0VVJJOworICAgICAgICB0aGlzLnNlcnZsZXRQYXRoID0gc2VydmxldFBhdGg7CisgICAgICAgIHRoaXMub3JpZ1NlcnZsZXRQYXRoID0gc2VydmxldFBhdGg7CisgICAgICAgIHRoaXMucGF0aEluZm8gPSBwYXRoSW5mbzsKKyAgICAgICAgdGhpcy5xdWVyeVN0cmluZyA9IHF1ZXJ5U3RyaW5nOworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICBpZiAod3JhcHBlciBpbnN0YW5jZW9mIFN0YW5kYXJkV3JhcHBlcikKKyAgICAgICAgICAgIHRoaXMuc3VwcG9ydCA9ICgoU3RhbmRhcmRXcmFwcGVyKSB3cmFwcGVyKS5nZXRJbnN0YW5jZVN1cHBvcnQoKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdGhpcy5zdXBwb3J0ID0gbmV3IEluc3RhbmNlU3VwcG9ydCh3cmFwcGVyKTsKKworICAgICAgICBpZiAoIGxvZy5pc0RlYnVnRW5hYmxlZCgpICkKKyAgICAgICAgICAgIGxvZy5kZWJ1Zygic2VydmxldFBhdGg9IiArIHRoaXMuc2VydmxldFBhdGggKyAiLCBwYXRoSW5mbz0iICsKKyAgICAgICAgICAgICAgICB0aGlzLnBhdGhJbmZvICsgIiwgcXVlcnlTdHJpbmc9IiArIHF1ZXJ5U3RyaW5nICsKKyAgICAgICAgICAgICAgICAiLCBuYW1lPSIgKyB0aGlzLm5hbWUpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhBcHBsaWNhdGlvbkRpc3BhdGNoZXIuY2xhc3MpOworCisgICAgLyoqCisgICAgICogVGhlIHJlcXVlc3Qgc3BlY2lmaWVkIGJ5IHRoZSBkaXNwYXRjaGluZyBhcHBsaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFNlcnZsZXRSZXF1ZXN0IGFwcFJlcXVlc3QgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgcmVzcG9uc2Ugc3BlY2lmaWVkIGJ5IHRoZSBkaXNwYXRjaGluZyBhcHBsaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFNlcnZsZXRSZXNwb25zZSBhcHBSZXNwb25zZSA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBDb250ZXh0IHRoaXMgUmVxdWVzdERpc3BhdGNoZXIgaXMgYXNzb2NpYXRlZCB3aXRoLgorICAgICAqLworICAgIHByaXZhdGUgQ29udGV4dCBjb250ZXh0ID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogQXJlIHdlIHBlcmZvcm1pbmcgYW4gaW5jbHVkZSgpIGluc3RlYWQgb2YgYSBmb3J3YXJkKCk/CisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGluY2x1ZGluZyA9IGZhbHNlOworCisKKyAgICAvKioKKyAgICAgKiBEZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBpbmZvID0KKyAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5BcHBsaWNhdGlvbkRpc3BhdGNoZXIvMS4wIjsKKworCisgICAgLyoqCisgICAgICogVGhlIHNlcnZsZXQgbmFtZSBmb3IgYSBuYW1lZCBkaXNwYXRjaGVyLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIG5hbWUgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgb3V0ZXJtb3N0IHJlcXVlc3QgdGhhdCB3aWxsIGJlIHBhc3NlZCBvbiB0byB0aGUgaW52b2tlZCBzZXJ2bGV0LgorICAgICAqLworICAgIHByaXZhdGUgU2VydmxldFJlcXVlc3Qgb3V0ZXJSZXF1ZXN0ID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIG91dGVybW9zdCByZXNwb25zZSB0aGF0IHdpbGwgYmUgcGFzc2VkIG9uIHRvIHRoZSBpbnZva2VkIHNlcnZsZXQuCisgICAgICovCisgICAgcHJpdmF0ZSBTZXJ2bGV0UmVzcG9uc2Ugb3V0ZXJSZXNwb25zZSA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBleHRyYSBwYXRoIGluZm9ybWF0aW9uIGZvciB0aGlzIFJlcXVlc3REaXNwYXRjaGVyLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHBhdGhJbmZvID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIHF1ZXJ5IHN0cmluZyBwYXJhbWV0ZXJzIGZvciB0aGlzIFJlcXVlc3REaXNwYXRjaGVyLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHF1ZXJ5U3RyaW5nID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIHJlcXVlc3QgVVJJIGZvciB0aGlzIFJlcXVlc3REaXNwYXRjaGVyLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHJlcXVlc3RVUkkgPSBudWxsOworCisgICAgLyoqCisgICAgICogVGhlIHNlcnZsZXQgcGF0aCBmb3IgdGhpcyBSZXF1ZXN0RGlzcGF0Y2hlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBzZXJ2bGV0UGF0aCA9IG51bGw7CisKKyAgICBwcml2YXRlIFN0cmluZyBvcmlnU2VydmxldFBhdGggPSBudWxsOworICAgIAorICAgIC8qKgorICAgICAqIFRoZSBTdHJpbmdNYW5hZ2VyIGZvciB0aGlzIHBhY2thZ2UuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nTWFuYWdlciBzbSA9CisgICAgICBTdHJpbmdNYW5hZ2VyLmdldE1hbmFnZXIoQ29uc3RhbnRzLlBhY2thZ2UpOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgSW5zdGFuY2VTdXBwb3J0IGluc3RhbmNlIGFzc29jaWF0ZWQgd2l0aCBvdXIgV3JhcHBlciAodXNlZCB0bworICAgICAqIHNlbmQgImJlZm9yZSBkaXNwYXRjaCIgYW5kICJhZnRlciBkaXNwYXRjaCIgZXZlbnRzLgorICAgICAqLworICAgIHByaXZhdGUgSW5zdGFuY2VTdXBwb3J0IHN1cHBvcnQgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgV3JhcHBlciBhc3NvY2lhdGVkIHdpdGggdGhlIHJlc291cmNlIHRoYXQgd2lsbCBiZSBmb3J3YXJkZWQgdG8KKyAgICAgKiBvciBpbmNsdWRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFdyYXBwZXIgd3JhcHBlciA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSByZXF1ZXN0IHdyYXBwZXIgd2UgaGF2ZSBjcmVhdGVkIGFuZCBpbnN0YWxsZWQgKGlmIGFueSkuCisgICAgICovCisgICAgcHJpdmF0ZSBTZXJ2bGV0UmVxdWVzdCB3cmFwUmVxdWVzdCA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSByZXNwb25zZSB3cmFwcGVyIHdlIGhhdmUgY3JlYXRlZCBhbmQgaW5zdGFsbGVkIChpZiBhbnkpLgorICAgICAqLworICAgIHByaXZhdGUgU2VydmxldFJlc3BvbnNlIHdyYXBSZXNwb25zZSA9IG51bGw7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJbmZvKCkgeworCisgICAgICAgIHJldHVybiAoaW5mbyk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBGb3J3YXJkIHRoaXMgcmVxdWVzdCBhbmQgcmVzcG9uc2UgdG8gYW5vdGhlciByZXNvdXJjZSBmb3IgcHJvY2Vzc2luZy4KKyAgICAgKiBBbnkgcnVudGltZSBleGNlcHRpb24sIElPRXhjZXB0aW9uLCBvciBTZXJ2bGV0RXhjZXB0aW9uIHRocm93biBieSB0aGUKKyAgICAgKiBjYWxsZWQgc2VydmxldCB3aWxsIGJlIHByb3BvZ2F0ZWQgdG8gdGhlIGNhbGxlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3QgdG8gYmUgZm9yd2FyZGVkCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBzZXJ2bGV0IHJlc3BvbnNlIHRvIGJlIGZvcndhcmRlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBleGNlcHRpb24gb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgZm9yd2FyZChTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaWYgKFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFByaXZpbGVnZWRGb3J3YXJkIGRwID0gbmV3IFByaXZpbGVnZWRGb3J3YXJkKHJlcXVlc3QscmVzcG9uc2UpOworICAgICAgICAgICAgICAgIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKGRwKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24gcGUpIHsKKyAgICAgICAgICAgICAgICBFeGNlcHRpb24gZSA9IHBlLmdldEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU2VydmxldEV4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgKFNlcnZsZXRFeGNlcHRpb24pIGU7CisgICAgICAgICAgICAgICAgdGhyb3cgKElPRXhjZXB0aW9uKSBlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZG9Gb3J3YXJkKHJlcXVlc3QscmVzcG9uc2UpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRvRm9yd2FyZChTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgCisgICAgICAgIC8vIFJlc2V0IGFueSBvdXRwdXQgdGhhdCBoYXMgYmVlbiBidWZmZXJlZCwgYnV0IGtlZXAgaGVhZGVycy9jb29raWVzCisgICAgICAgIGlmIChyZXNwb25zZS5pc0NvbW1pdHRlZCgpKSB7CisgICAgICAgICAgICBpZiAoIGxvZy5pc0RlYnVnRW5hYmxlZCgpICkKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiAgRm9yd2FyZCBvbiBjb21taXR0ZWQgcmVzcG9uc2UgLS0+IElTRSIpOworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoImFwcGxpY2F0aW9uRGlzcGF0Y2hlci5mb3J3YXJkLmlzZSIpKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVzcG9uc2UucmVzZXRCdWZmZXIoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGlmICggbG9nLmlzRGVidWdFbmFibGVkKCkgKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiICBGb3J3YXJkIHJlc2V0QnVmZmVyKCkgcmV0dXJuZWQgSVNFOiAiICsgZSk7CisgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9CisKKyAgICAgICAgLy8gU2V0IHVwIHRvIGhhbmRsZSB0aGUgc3BlY2lmaWVkIHJlcXVlc3QgYW5kIHJlc3BvbnNlCisgICAgICAgIHNldHVwKHJlcXVlc3QsIHJlc3BvbnNlLCBmYWxzZSk7CisKKyAgICAgICAgLy8gSWRlbnRpZnkgdGhlIEhUVFAtc3BlY2lmaWMgcmVxdWVzdCBhbmQgcmVzcG9uc2Ugb2JqZWN0cyAoaWYgYW55KQorICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgaHJlcXVlc3QgPSBudWxsOworICAgICAgICBpZiAocmVxdWVzdCBpbnN0YW5jZW9mIEh0dHBTZXJ2bGV0UmVxdWVzdCkKKyAgICAgICAgICAgIGhyZXF1ZXN0ID0gKEh0dHBTZXJ2bGV0UmVxdWVzdCkgcmVxdWVzdDsKKyAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSBocmVzcG9uc2UgPSBudWxsOworICAgICAgICBpZiAocmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwU2VydmxldFJlc3BvbnNlKQorICAgICAgICAgICAgaHJlc3BvbnNlID0gKEh0dHBTZXJ2bGV0UmVzcG9uc2UpIHJlc3BvbnNlOworCisgICAgICAgIC8vIEhhbmRsZSBhIG5vbi1IVFRQIGZvcndhcmQgYnkgcGFzc2luZyB0aGUgZXhpc3RpbmcgcmVxdWVzdC9yZXNwb25zZQorICAgICAgICBpZiAoKGhyZXF1ZXN0ID09IG51bGwpIHx8IChocmVzcG9uc2UgPT0gbnVsbCkpIHsKKworICAgICAgICAgICAgaWYgKCBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSApCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgTm9uLUhUVFAgRm9yd2FyZCIpOworICAgICAgICAgICAgCisgICAgICAgICAgICBwcm9jZXNzUmVxdWVzdChocmVxdWVzdCxocmVzcG9uc2UpOworCisgICAgICAgIH0KKworICAgICAgICAvLyBIYW5kbGUgYW4gSFRUUCBuYW1lZCBkaXNwYXRjaGVyIGZvcndhcmQKKyAgICAgICAgZWxzZSBpZiAoKHNlcnZsZXRQYXRoID09IG51bGwpICYmIChwYXRoSW5mbyA9PSBudWxsKSkgeworCisgICAgICAgICAgICBpZiAoIGxvZy5pc0RlYnVnRW5hYmxlZCgpICkKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiBOYW1lZCBEaXNwYXRjaGVyIEZvcndhcmQiKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgQXBwbGljYXRpb25IdHRwUmVxdWVzdCB3cmVxdWVzdCA9CisgICAgICAgICAgICAgICAgKEFwcGxpY2F0aW9uSHR0cFJlcXVlc3QpIHdyYXBSZXF1ZXN0KCk7CisgICAgICAgICAgICB3cmVxdWVzdC5zZXRSZXF1ZXN0VVJJKGhyZXF1ZXN0LmdldFJlcXVlc3RVUkkoKSk7CisgICAgICAgICAgICB3cmVxdWVzdC5zZXRDb250ZXh0UGF0aChocmVxdWVzdC5nZXRDb250ZXh0UGF0aCgpKTsKKyAgICAgICAgICAgIHdyZXF1ZXN0LnNldFNlcnZsZXRQYXRoKGhyZXF1ZXN0LmdldFNlcnZsZXRQYXRoKCkpOworICAgICAgICAgICAgd3JlcXVlc3Quc2V0UGF0aEluZm8oaHJlcXVlc3QuZ2V0UGF0aEluZm8oKSk7CisgICAgICAgICAgICB3cmVxdWVzdC5zZXRRdWVyeVN0cmluZyhocmVxdWVzdC5nZXRRdWVyeVN0cmluZygpKTsKKworICAgICAgICAgICAgcHJvY2Vzc1JlcXVlc3QocmVxdWVzdCxyZXNwb25zZSk7CisKKyAgICAgICAgICAgIHdyZXF1ZXN0LnJlY3ljbGUoKTsKKyAgICAgICAgICAgIHVud3JhcFJlcXVlc3QoKTsKKworICAgICAgICB9CisKKyAgICAgICAgLy8gSGFuZGxlIGFuIEhUVFAgcGF0aC1iYXNlZCBmb3J3YXJkCisgICAgICAgIGVsc2UgeworCisgICAgICAgICAgICBpZiAoIGxvZy5pc0RlYnVnRW5hYmxlZCgpICkKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiBQYXRoIEJhc2VkIEZvcndhcmQiKTsKKworICAgICAgICAgICAgQXBwbGljYXRpb25IdHRwUmVxdWVzdCB3cmVxdWVzdCA9CisgICAgICAgICAgICAgICAgKEFwcGxpY2F0aW9uSHR0cFJlcXVlc3QpIHdyYXBSZXF1ZXN0KCk7CisgICAgICAgICAgICBTdHJpbmcgY29udGV4dFBhdGggPSBjb250ZXh0LmdldFBhdGgoKTsKKyAgICAgICAgICAgIHdyZXF1ZXN0LnNldENvbnRleHRQYXRoKGNvbnRleHRQYXRoKTsKKyAgICAgICAgICAgIHdyZXF1ZXN0LnNldFJlcXVlc3RVUkkocmVxdWVzdFVSSSk7CisgICAgICAgICAgICB3cmVxdWVzdC5zZXRTZXJ2bGV0UGF0aChzZXJ2bGV0UGF0aCk7CisgICAgICAgICAgICB3cmVxdWVzdC5zZXRQYXRoSW5mbyhwYXRoSW5mbyk7CisKKyAgICAgICAgICAgIGlmIChocmVxdWVzdC5nZXRBdHRyaWJ1dGUoR2xvYmFscy5GT1JXQVJEX1JFUVVFU1RfVVJJX0FUVFIpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB3cmVxdWVzdC5zZXRBdHRyaWJ1dGUoR2xvYmFscy5GT1JXQVJEX1JFUVVFU1RfVVJJX0FUVFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhyZXF1ZXN0LmdldFJlcXVlc3RVUkkoKSk7CisgICAgICAgICAgICAgICAgd3JlcXVlc3Quc2V0QXR0cmlidXRlKEdsb2JhbHMuRk9SV0FSRF9DT05URVhUX1BBVEhfQVRUUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHJlcXVlc3QuZ2V0Q29udGV4dFBhdGgoKSk7CisgICAgICAgICAgICAgICAgd3JlcXVlc3Quc2V0QXR0cmlidXRlKEdsb2JhbHMuRk9SV0FSRF9TRVJWTEVUX1BBVEhfQVRUUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHJlcXVlc3QuZ2V0U2VydmxldFBhdGgoKSk7CisgICAgICAgICAgICAgICAgd3JlcXVlc3Quc2V0QXR0cmlidXRlKEdsb2JhbHMuRk9SV0FSRF9QQVRIX0lORk9fQVRUUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHJlcXVlc3QuZ2V0UGF0aEluZm8oKSk7CisgICAgICAgICAgICAgICAgd3JlcXVlc3Quc2V0QXR0cmlidXRlKEdsb2JhbHMuRk9SV0FSRF9RVUVSWV9TVFJJTkdfQVRUUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHJlcXVlc3QuZ2V0UXVlcnlTdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgCisgICAgICAgICAgICBpZiAocXVlcnlTdHJpbmcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHdyZXF1ZXN0LnNldFF1ZXJ5U3RyaW5nKHF1ZXJ5U3RyaW5nKTsKKyAgICAgICAgICAgICAgICB3cmVxdWVzdC5zZXRRdWVyeVBhcmFtcyhxdWVyeVN0cmluZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByb2Nlc3NSZXF1ZXN0KHJlcXVlc3QscmVzcG9uc2UpOworCisgICAgICAgICAgICB3cmVxdWVzdC5yZWN5Y2xlKCk7CisgICAgICAgICAgICB1bndyYXBSZXF1ZXN0KCk7CisKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRoaXMgaXMgbm90IGEgcmVhbCBjbG9zZSBpbiBvcmRlciB0byBzdXBwb3J0IGVycm9yIHByb2Nlc3NpbmcKKyAgICAgICAgaWYgKCBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSApCisgICAgICAgICAgICBsb2cuZGVidWcoIiBEaXNhYmxpbmcgdGhlIHJlc3BvbnNlIGZvciBmdXRoZXIgb3V0cHV0Iik7CisKKyAgICAgICAgaWYgIChyZXNwb25zZSBpbnN0YW5jZW9mIFJlc3BvbnNlRmFjYWRlKSB7CisgICAgICAgICAgICAoKFJlc3BvbnNlRmFjYWRlKSByZXNwb25zZSkuZmluaXNoKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBTZXJ2bGV0IFNSVi42LjIuMi4gVGhlIFJlc3F1ZXN0L1Jlc3BvbnNlIG1heSBoYXZlIGJlZW4gd3JhcHBlZAorICAgICAgICAgICAgLy8gYW5kIG1heSBubyBsb25nZXIgYmUgaW5zdGFuY2Ugb2YgUmVxdWVzdEZhY2FkZSAKKyAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSl7CisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCAiIFRoZSBSZXNwb25zZSBpcyB2ZWhpY3VsZWQgdXNpbmcgYSB3cmFwcGVyOiAiIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKyByZXNwb25zZS5nZXRDbGFzcygpLmdldE5hbWUoKSApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBDbG9zZSBhbnl3YXkKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisgICAgICAgICAgICAgICAgd3JpdGVyLmNsb3NlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIFNlcnZsZXRPdXRwdXRTdHJlYW0gc3RyZWFtID0gcmVzcG9uc2UuZ2V0T3V0cHV0U3RyZWFtKCk7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBmKSB7CisgICAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBmKSB7CisgICAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKyAgICAKKworICAgIC8qKgorICAgICAqIFByZXBhcmUgdGhlIHJlcXVlc3QgYmFzZWQgb24gdGhlIGZpbHRlciBjb25maWd1cmF0aW9uLgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIHNlcnZsZXQgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0IGVycm9yIG9jY3VycworICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzUmVxdWVzdChTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworICAgICAgICAgICAgICAgIAorICAgICAgICBJbnRlZ2VyIGRpc0ludCA9IChJbnRlZ2VyKSByZXF1ZXN0LmdldEF0dHJpYnV0ZQorICAgICAgICAgICAgKEFwcGxpY2F0aW9uRmlsdGVyRmFjdG9yeS5ESVNQQVRDSEVSX1RZUEVfQVRUUik7CisgICAgICAgIGlmIChkaXNJbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGRpc0ludC5pbnRWYWx1ZSgpICE9IEFwcGxpY2F0aW9uRmlsdGVyRmFjdG9yeS5FUlJPUikgeworICAgICAgICAgICAgICAgIG91dGVyUmVxdWVzdC5zZXRBdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICAgICAgKEFwcGxpY2F0aW9uRmlsdGVyRmFjdG9yeS5ESVNQQVRDSEVSX1JFUVVFU1RfUEFUSF9BVFRSLAorICAgICAgICAgICAgICAgICAgICAgb3JpZ1NlcnZsZXRQYXRoKTsKKyAgICAgICAgICAgICAgICBvdXRlclJlcXVlc3Quc2V0QXR0cmlidXRlCisgICAgICAgICAgICAgICAgICAgIChBcHBsaWNhdGlvbkZpbHRlckZhY3RvcnkuRElTUEFUQ0hFUl9UWVBFX0FUVFIsCisgICAgICAgICAgICAgICAgICAgICBuZXcgSW50ZWdlcihBcHBsaWNhdGlvbkZpbHRlckZhY3RvcnkuRk9SV0FSRCkpOworICAgICAgICAgICAgICAgIGludm9rZShvdXRlclJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW52b2tlKG91dGVyUmVxdWVzdCwgcmVzcG9uc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisgICAgCisgICAgCisgICAgCisgICAgLyoqCisgICAgICogSW5jbHVkZSB0aGUgcmVzcG9uc2UgZnJvbSBhbm90aGVyIHJlc291cmNlIGluIHRoZSBjdXJyZW50IHJlc3BvbnNlLgorICAgICAqIEFueSBydW50aW1lIGV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIG9yIFNlcnZsZXRFeGNlcHRpb24gdGhyb3duIGJ5IHRoZQorICAgICAqIGNhbGxlZCBzZXJ2bGV0IHdpbGwgYmUgcHJvcG9nYXRlZCB0byB0aGUgY2FsbGVyLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB0aGF0IGlzIGluY2x1ZGluZyB0aGlzIG9uZQorICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgc2VydmxldCByZXNwb25zZSB0byBiZSBhcHBlbmRlZCB0bworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBleGNlcHRpb24gb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgaW5jbHVkZShTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaWYgKFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFByaXZpbGVnZWRJbmNsdWRlIGRwID0gbmV3IFByaXZpbGVnZWRJbmNsdWRlKHJlcXVlc3QscmVzcG9uc2UpOworICAgICAgICAgICAgICAgIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKGRwKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24gcGUpIHsKKyAgICAgICAgICAgICAgICBFeGNlcHRpb24gZSA9IHBlLmdldEV4Y2VwdGlvbigpOworCisgICAgICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTZXJ2bGV0RXhjZXB0aW9uKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyAoU2VydmxldEV4Y2VwdGlvbikgZTsKKyAgICAgICAgICAgICAgICB0aHJvdyAoSU9FeGNlcHRpb24pIGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkb0luY2x1ZGUocmVxdWVzdCxyZXNwb25zZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZG9JbmNsdWRlKFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICAvLyBTZXQgdXAgdG8gaGFuZGxlIHRoZSBzcGVjaWZpZWQgcmVxdWVzdCBhbmQgcmVzcG9uc2UKKyAgICAgICAgc2V0dXAocmVxdWVzdCwgcmVzcG9uc2UsIHRydWUpOworCisgICAgICAgIC8vIENyZWF0ZSBhIHdyYXBwZWQgcmVzcG9uc2UgdG8gdXNlIGZvciB0aGlzIHJlcXVlc3QKKyAgICAgICAgLy8gU2VydmxldFJlc3BvbnNlIHdyZXNwb25zZSA9IG51bGw7CisgICAgICAgIFNlcnZsZXRSZXNwb25zZSB3cmVzcG9uc2UgPSB3cmFwUmVzcG9uc2UoKTsKKworICAgICAgICAvLyBIYW5kbGUgYSBub24tSFRUUCBpbmNsdWRlCisgICAgICAgIGlmICghKHJlcXVlc3QgaW5zdGFuY2VvZiBIdHRwU2VydmxldFJlcXVlc3QpIHx8CisgICAgICAgICAgICAhKHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFNlcnZsZXRSZXNwb25zZSkpIHsKKworICAgICAgICAgICAgaWYgKCBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSApCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgTm9uLUhUVFAgSW5jbHVkZSIpOworICAgICAgICAgICAgcmVxdWVzdC5zZXRBdHRyaWJ1dGUoQXBwbGljYXRpb25GaWx0ZXJGYWN0b3J5LkRJU1BBVENIRVJfVFlQRV9BVFRSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEludGVnZXIoQXBwbGljYXRpb25GaWx0ZXJGYWN0b3J5LklOQ0xVREUpKTsKKyAgICAgICAgICAgIHJlcXVlc3Quc2V0QXR0cmlidXRlKEFwcGxpY2F0aW9uRmlsdGVyRmFjdG9yeS5ESVNQQVRDSEVSX1JFUVVFU1RfUEFUSF9BVFRSLCBvcmlnU2VydmxldFBhdGgpOworICAgICAgICAgICAgaW52b2tlKHJlcXVlc3QsIG91dGVyUmVzcG9uc2UpOworICAgICAgICB9CisKKyAgICAgICAgLy8gSGFuZGxlIGFuIEhUVFAgbmFtZWQgZGlzcGF0Y2hlciBpbmNsdWRlCisgICAgICAgIGVsc2UgaWYgKG5hbWUgIT0gbnVsbCkgeworCisgICAgICAgICAgICBpZiAoIGxvZy5pc0RlYnVnRW5hYmxlZCgpICkKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiBOYW1lZCBEaXNwYXRjaGVyIEluY2x1ZGUiKTsKKworICAgICAgICAgICAgQXBwbGljYXRpb25IdHRwUmVxdWVzdCB3cmVxdWVzdCA9CisgICAgICAgICAgICAgICAgKEFwcGxpY2F0aW9uSHR0cFJlcXVlc3QpIHdyYXBSZXF1ZXN0KCk7CisgICAgICAgICAgICB3cmVxdWVzdC5zZXRBdHRyaWJ1dGUoR2xvYmFscy5OQU1FRF9ESVNQQVRDSEVSX0FUVFIsIG5hbWUpOworICAgICAgICAgICAgaWYgKHNlcnZsZXRQYXRoICE9IG51bGwpCisgICAgICAgICAgICAgICAgd3JlcXVlc3Quc2V0U2VydmxldFBhdGgoc2VydmxldFBhdGgpOworICAgICAgICAgICAgd3JlcXVlc3Quc2V0QXR0cmlidXRlKEFwcGxpY2F0aW9uRmlsdGVyRmFjdG9yeS5ESVNQQVRDSEVSX1RZUEVfQVRUUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbnRlZ2VyKEFwcGxpY2F0aW9uRmlsdGVyRmFjdG9yeS5JTkNMVURFKSk7CisgICAgICAgICAgICB3cmVxdWVzdC5zZXRBdHRyaWJ1dGUoQXBwbGljYXRpb25GaWx0ZXJGYWN0b3J5LkRJU1BBVENIRVJfUkVRVUVTVF9QQVRIX0FUVFIsIG9yaWdTZXJ2bGV0UGF0aCk7CisgICAgICAgICAgICBpbnZva2Uob3V0ZXJSZXF1ZXN0LCBvdXRlclJlc3BvbnNlKTsKKworICAgICAgICAgICAgd3JlcXVlc3QucmVjeWNsZSgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gSGFuZGxlIGFuIEhUVFAgcGF0aCBiYXNlZCBpbmNsdWRlCisgICAgICAgIGVsc2UgeworCisgICAgICAgICAgICBpZiAoIGxvZy5pc0RlYnVnRW5hYmxlZCgpICkKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiBQYXRoIEJhc2VkIEluY2x1ZGUiKTsKKworICAgICAgICAgICAgQXBwbGljYXRpb25IdHRwUmVxdWVzdCB3cmVxdWVzdCA9CisgICAgICAgICAgICAgICAgKEFwcGxpY2F0aW9uSHR0cFJlcXVlc3QpIHdyYXBSZXF1ZXN0KCk7CisgICAgICAgICAgICBTdHJpbmcgY29udGV4dFBhdGggPSBjb250ZXh0LmdldFBhdGgoKTsKKyAgICAgICAgICAgIGlmIChyZXF1ZXN0VVJJICE9IG51bGwpCisgICAgICAgICAgICAgICAgd3JlcXVlc3Quc2V0QXR0cmlidXRlKEdsb2JhbHMuSU5DTFVERV9SRVFVRVNUX1VSSV9BVFRSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0VVJJKTsKKyAgICAgICAgICAgIGlmIChjb250ZXh0UGF0aCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHdyZXF1ZXN0LnNldEF0dHJpYnV0ZShHbG9iYWxzLklOQ0xVREVfQ09OVEVYVF9QQVRIX0FUVFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRQYXRoKTsKKyAgICAgICAgICAgIGlmIChzZXJ2bGV0UGF0aCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHdyZXF1ZXN0LnNldEF0dHJpYnV0ZShHbG9iYWxzLklOQ0xVREVfU0VSVkxFVF9QQVRIX0FUVFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZsZXRQYXRoKTsKKyAgICAgICAgICAgIGlmIChwYXRoSW5mbyAhPSBudWxsKQorICAgICAgICAgICAgICAgIHdyZXF1ZXN0LnNldEF0dHJpYnV0ZShHbG9iYWxzLklOQ0xVREVfUEFUSF9JTkZPX0FUVFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhJbmZvKTsKKyAgICAgICAgICAgIGlmIChxdWVyeVN0cmluZyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgd3JlcXVlc3Quc2V0QXR0cmlidXRlKEdsb2JhbHMuSU5DTFVERV9RVUVSWV9TVFJJTkdfQVRUUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlTdHJpbmcpOworICAgICAgICAgICAgICAgIHdyZXF1ZXN0LnNldFF1ZXJ5UGFyYW1zKHF1ZXJ5U3RyaW5nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgd3JlcXVlc3Quc2V0QXR0cmlidXRlKEFwcGxpY2F0aW9uRmlsdGVyRmFjdG9yeS5ESVNQQVRDSEVSX1RZUEVfQVRUUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbnRlZ2VyKEFwcGxpY2F0aW9uRmlsdGVyRmFjdG9yeS5JTkNMVURFKSk7CisgICAgICAgICAgICB3cmVxdWVzdC5zZXRBdHRyaWJ1dGUoQXBwbGljYXRpb25GaWx0ZXJGYWN0b3J5LkRJU1BBVENIRVJfUkVRVUVTVF9QQVRIX0FUVFIsIG9yaWdTZXJ2bGV0UGF0aCk7CisgICAgICAgICAgICBpbnZva2Uob3V0ZXJSZXF1ZXN0LCBvdXRlclJlc3BvbnNlKTsKKworICAgICAgICAgICAgd3JlcXVlc3QucmVjeWNsZSgpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByaXZhdGUgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBBc2sgdGhlIHJlc291cmNlIHJlcHJlc2VudGVkIGJ5IHRoaXMgUmVxdWVzdERpc3BhdGNoZXIgdG8gcHJvY2VzcworICAgICAqIHRoZSBhc3NvY2lhdGVkIHJlcXVlc3QsIGFuZCBjcmVhdGUgKG9yIGFwcGVuZCB0bykgdGhlIGFzc29jaWF0ZWQKKyAgICAgKiByZXNwb25zZS4KKyAgICAgKiA8cD4KKyAgICAgKiA8c3Ryb25nPklNUExFTUVOVEFUSU9OIE5PVEU8L3N0cm9uZz46IFRoaXMgaW1wbGVtZW50YXRpb24gYXNzdW1lcworICAgICAqIHRoYXQgbm8gZmlsdGVycyBhcmUgYXBwbGllZCB0byBhIGZvcndhcmRlZCBvciBpbmNsdWRlZCByZXNvdXJjZSwKKyAgICAgKiBiZWNhdXNlIHRoZXkgd2VyZSBhbHJlYWR5IGRvbmUgZm9yIHRoZSBvcmlnaW5hbCByZXF1ZXN0LgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgc2VydmxldCByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGludm9rZShTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIENoZWNraW5nIHRvIHNlZSBpZiB0aGUgY29udGV4dCBjbGFzc2xvYWRlciBpcyB0aGUgY3VycmVudCBjb250ZXh0CisgICAgICAgIC8vIGNsYXNzbG9hZGVyLiBJZiBpdCdzIG5vdCwgd2UncmUgc2F2aW5nIGl0LCBhbmQgc2V0dGluZyB0aGUgY29udGV4dAorICAgICAgICAvLyBjbGFzc2xvYWRlciB0byB0aGUgQ29udGV4dCBjbGFzc2xvYWRlcgorICAgICAgICBDbGFzc0xvYWRlciBvbGRDQ0wgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOworICAgICAgICBDbGFzc0xvYWRlciBjb250ZXh0Q2xhc3NMb2FkZXIgPSBjb250ZXh0LmdldExvYWRlcigpLmdldENsYXNzTG9hZGVyKCk7CisKKyAgICAgICAgaWYgKG9sZENDTCAhPSBjb250ZXh0Q2xhc3NMb2FkZXIpIHsKKyAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKGNvbnRleHRDbGFzc0xvYWRlcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvbGRDQ0wgPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgLy8gSW5pdGlhbGl6ZSBsb2NhbCB2YXJpYWJsZXMgd2UgbWF5IG5lZWQKKyAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IGhyZXF1ZXN0ID0gKEh0dHBTZXJ2bGV0UmVxdWVzdCkgcmVxdWVzdDsKKyAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSBocmVzcG9uc2UgPSAoSHR0cFNlcnZsZXRSZXNwb25zZSkgcmVzcG9uc2U7CisgICAgICAgIFNlcnZsZXQgc2VydmxldCA9IG51bGw7CisgICAgICAgIElPRXhjZXB0aW9uIGlvRXhjZXB0aW9uID0gbnVsbDsKKyAgICAgICAgU2VydmxldEV4Y2VwdGlvbiBzZXJ2bGV0RXhjZXB0aW9uID0gbnVsbDsKKyAgICAgICAgUnVudGltZUV4Y2VwdGlvbiBydW50aW1lRXhjZXB0aW9uID0gbnVsbDsKKyAgICAgICAgYm9vbGVhbiB1bmF2YWlsYWJsZSA9IGZhbHNlOworCisgICAgICAgIC8vIENoZWNrIGZvciB0aGUgc2VydmxldCBiZWluZyBtYXJrZWQgdW5hdmFpbGFibGUKKyAgICAgICAgaWYgKHdyYXBwZXIuaXNVbmF2YWlsYWJsZSgpKSB7CisgICAgICAgICAgICB3cmFwcGVyLmdldExvZ2dlcigpLndhcm4oCisgICAgICAgICAgICAgICAgICAgIHNtLmdldFN0cmluZygiYXBwbGljYXRpb25EaXNwYXRjaGVyLmlzVW5hdmFpbGFibGUiLCAKKyAgICAgICAgICAgICAgICAgICAgd3JhcHBlci5nZXROYW1lKCkpKTsKKyAgICAgICAgICAgIGxvbmcgYXZhaWxhYmxlID0gd3JhcHBlci5nZXRBdmFpbGFibGUoKTsKKyAgICAgICAgICAgIGlmICgoYXZhaWxhYmxlID4gMEwpICYmIChhdmFpbGFibGUgPCBMb25nLk1BWF9WQUxVRSkpCisgICAgICAgICAgICAgICAgaHJlc3BvbnNlLnNldERhdGVIZWFkZXIoIlJldHJ5LUFmdGVyIiwgYXZhaWxhYmxlKTsKKyAgICAgICAgICAgIGhyZXNwb25zZS5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19TRVJWSUNFX1VOQVZBSUxBQkxFLCBzbQorICAgICAgICAgICAgICAgICAgICAuZ2V0U3RyaW5nKCJhcHBsaWNhdGlvbkRpc3BhdGNoZXIuaXNVbmF2YWlsYWJsZSIsIHdyYXBwZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TmFtZSgpKSk7CisgICAgICAgICAgICB1bmF2YWlsYWJsZSA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICAvLyBBbGxvY2F0ZSBhIHNlcnZsZXQgaW5zdGFuY2UgdG8gcHJvY2VzcyB0aGlzIHJlcXVlc3QKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICghdW5hdmFpbGFibGUpIHsKKyAgICAgICAgICAgICAgICBzZXJ2bGV0ID0gd3JhcHBlci5hbGxvY2F0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChTZXJ2bGV0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHdyYXBwZXIuZ2V0TG9nZ2VyKCkuZXJyb3Ioc20uZ2V0U3RyaW5nKCJhcHBsaWNhdGlvbkRpc3BhdGNoZXIuYWxsb2NhdGVFeGNlcHRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVyLmdldE5hbWUoKSksIGUpOworICAgICAgICAgICAgc2VydmxldEV4Y2VwdGlvbiA9IGU7CisgICAgICAgICAgICBzZXJ2bGV0ID0gbnVsbDsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKKyAgICAgICAgICAgIHdyYXBwZXIuZ2V0TG9nZ2VyKCkuZXJyb3Ioc20uZ2V0U3RyaW5nKCJhcHBsaWNhdGlvbkRpc3BhdGNoZXIuYWxsb2NhdGVFeGNlcHRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVyLmdldE5hbWUoKSksIGUpOworICAgICAgICAgICAgc2VydmxldEV4Y2VwdGlvbiA9IG5ldyBTZXJ2bGV0RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygiYXBwbGljYXRpb25EaXNwYXRjaGVyLmFsbG9jYXRlRXhjZXB0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZXIuZ2V0TmFtZSgpKSwgZSk7CisgICAgICAgICAgICBzZXJ2bGV0ID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAvLyBHZXQgdGhlIEZpbHRlckNoYWluIEhlcmUKKyAgICAgICAgQXBwbGljYXRpb25GaWx0ZXJGYWN0b3J5IGZhY3RvcnkgPSBBcHBsaWNhdGlvbkZpbHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgQXBwbGljYXRpb25GaWx0ZXJDaGFpbiBmaWx0ZXJDaGFpbiA9IGZhY3RvcnkuY3JlYXRlRmlsdGVyQ2hhaW4ocmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVyLHNlcnZsZXQpOworICAgICAgICAvLyBDYWxsIHRoZSBzZXJ2aWNlKCkgbWV0aG9kIGZvciB0aGUgYWxsb2NhdGVkIHNlcnZsZXQgaW5zdGFuY2UKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN0cmluZyBqc3BGaWxlID0gd3JhcHBlci5nZXRKc3BGaWxlKCk7CisgICAgICAgICAgICBpZiAoanNwRmlsZSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlcXVlc3Quc2V0QXR0cmlidXRlKEdsb2JhbHMuSlNQX0ZJTEVfQVRUUiwganNwRmlsZSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmVxdWVzdC5yZW1vdmVBdHRyaWJ1dGUoR2xvYmFscy5KU1BfRklMRV9BVFRSKTsKKyAgICAgICAgICAgIHN1cHBvcnQuZmlyZUluc3RhbmNlRXZlbnQoSW5zdGFuY2VFdmVudC5CRUZPUkVfRElTUEFUQ0hfRVZFTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZsZXQsIHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICAgICAgICAgIC8vIGZvciBpbmNsdWRlcy9mb3J3YXJkcworICAgICAgICAgICAgaWYgKChzZXJ2bGV0ICE9IG51bGwpICYmIChmaWx0ZXJDaGFpbiAhPSBudWxsKSkgeworICAgICAgICAgICAgICAgZmlsdGVyQ2hhaW4uZG9GaWx0ZXIocmVxdWVzdCwgcmVzcG9uc2UpOworICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFNlcnZsZXQgU2VydmljZSBNZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBGaWx0ZXJDaGFpbgorICAgICAgICAgICAgcmVxdWVzdC5yZW1vdmVBdHRyaWJ1dGUoR2xvYmFscy5KU1BfRklMRV9BVFRSKTsKKyAgICAgICAgICAgIHN1cHBvcnQuZmlyZUluc3RhbmNlRXZlbnQoSW5zdGFuY2VFdmVudC5BRlRFUl9ESVNQQVRDSF9FVkVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmxldCwgcmVxdWVzdCwgcmVzcG9uc2UpOworICAgICAgICB9IGNhdGNoIChDbGllbnRBYm9ydEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXF1ZXN0LnJlbW92ZUF0dHJpYnV0ZShHbG9iYWxzLkpTUF9GSUxFX0FUVFIpOworICAgICAgICAgICAgc3VwcG9ydC5maXJlSW5zdGFuY2VFdmVudChJbnN0YW5jZUV2ZW50LkFGVEVSX0RJU1BBVENIX0VWRU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2bGV0LCByZXF1ZXN0LCByZXNwb25zZSk7CisgICAgICAgICAgICBpb0V4Y2VwdGlvbiA9IGU7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJlcXVlc3QucmVtb3ZlQXR0cmlidXRlKEdsb2JhbHMuSlNQX0ZJTEVfQVRUUik7CisgICAgICAgICAgICBzdXBwb3J0LmZpcmVJbnN0YW5jZUV2ZW50KEluc3RhbmNlRXZlbnQuQUZURVJfRElTUEFUQ0hfRVZFTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZsZXQsIHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICAgICAgICAgIHdyYXBwZXIuZ2V0TG9nZ2VyKCkuZXJyb3Ioc20uZ2V0U3RyaW5nKCJhcHBsaWNhdGlvbkRpc3BhdGNoZXIuc2VydmljZUV4Y2VwdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZXIuZ2V0TmFtZSgpKSwgZSk7CisgICAgICAgICAgICBpb0V4Y2VwdGlvbiA9IGU7CisgICAgICAgIH0gY2F0Y2ggKFVuYXZhaWxhYmxlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJlcXVlc3QucmVtb3ZlQXR0cmlidXRlKEdsb2JhbHMuSlNQX0ZJTEVfQVRUUik7CisgICAgICAgICAgICBzdXBwb3J0LmZpcmVJbnN0YW5jZUV2ZW50KEluc3RhbmNlRXZlbnQuQUZURVJfRElTUEFUQ0hfRVZFTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZsZXQsIHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICAgICAgICAgIHdyYXBwZXIuZ2V0TG9nZ2VyKCkuZXJyb3Ioc20uZ2V0U3RyaW5nKCJhcHBsaWNhdGlvbkRpc3BhdGNoZXIuc2VydmljZUV4Y2VwdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZXIuZ2V0TmFtZSgpKSwgZSk7CisgICAgICAgICAgICBzZXJ2bGV0RXhjZXB0aW9uID0gZTsKKyAgICAgICAgICAgIHdyYXBwZXIudW5hdmFpbGFibGUoZSk7CisgICAgICAgIH0gY2F0Y2ggKFNlcnZsZXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmVxdWVzdC5yZW1vdmVBdHRyaWJ1dGUoR2xvYmFscy5KU1BfRklMRV9BVFRSKTsKKyAgICAgICAgICAgIHN1cHBvcnQuZmlyZUluc3RhbmNlRXZlbnQoSW5zdGFuY2VFdmVudC5BRlRFUl9ESVNQQVRDSF9FVkVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmxldCwgcmVxdWVzdCwgcmVzcG9uc2UpOworICAgICAgICAgICAgVGhyb3dhYmxlIHJvb3RDYXVzZSA9IGU7CisgICAgICAgICAgICBUaHJvd2FibGUgcm9vdENhdXNlQ2hlY2sgPSBudWxsOworCisgICAgICAgICAgICAvLyBFeHRyYSBhZ2dyZXNzaXZlIHJvb3RDYXVzZSBmaW5kaW5nCisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcm9vdENhdXNlQ2hlY2sgPSAoVGhyb3dhYmxlKUludHJvc3BlY3Rpb25VdGlscy5nZXRQcm9wZXJ0eQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJvb3RDYXVzZSwgInJvb3RDYXVzZSIpOworICAgICAgICAgICAgICAgICAgICBpZiAocm9vdENhdXNlQ2hlY2shPW51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICByb290Q2F1c2UgPSByb290Q2F1c2VDaGVjazsKKworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICByb290Q2F1c2VDaGVjayA9IG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSB3aGlsZSAocm9vdENhdXNlQ2hlY2sgIT0gbnVsbCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHdyYXBwZXIuZ2V0TG9nZ2VyKCkuZXJyb3Ioc20uZ2V0U3RyaW5nKCJhcHBsaWNhdGlvbkRpc3BhdGNoZXIuc2VydmljZUV4Y2VwdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZXIuZ2V0TmFtZSgpKSwgcm9vdENhdXNlKTsKKyAgICAgICAgICAgIHNlcnZsZXRFeGNlcHRpb24gPSBlOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJlcXVlc3QucmVtb3ZlQXR0cmlidXRlKEdsb2JhbHMuSlNQX0ZJTEVfQVRUUik7CisgICAgICAgICAgICBzdXBwb3J0LmZpcmVJbnN0YW5jZUV2ZW50KEluc3RhbmNlRXZlbnQuQUZURVJfRElTUEFUQ0hfRVZFTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZsZXQsIHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICAgICAgICAgIHdyYXBwZXIuZ2V0TG9nZ2VyKCkuZXJyb3Ioc20uZ2V0U3RyaW5nKCJhcHBsaWNhdGlvbkRpc3BhdGNoZXIuc2VydmljZUV4Y2VwdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZXIuZ2V0TmFtZSgpKSwgZSk7CisgICAgICAgICAgICBydW50aW1lRXhjZXB0aW9uID0gZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlbGVhc2UgdGhlIGZpbHRlciBjaGFpbiAoaWYgYW55KSBmb3IgdGhpcyByZXF1ZXN0CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoZmlsdGVyQ2hhaW4gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBmaWx0ZXJDaGFpbi5yZWxlYXNlKCk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CisgICAgICAgICAgICBsb2cuZXJyb3Ioc20uZ2V0U3RyaW5nKCJzdGFuZGFyZFdyYXBwZXIucmVsZWFzZUZpbHRlcnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVyLmdldE5hbWUoKSksIGUpOworICAgICAgICAgIC8vRklYTUUgRXhjZXB0aW9uIGhhbmRsaW5nIG5lZWRzIHRvIGJlIHNpbXBpbGVyIHRvIHdoYXQgaXMgaW4gdGhlIFN0YW5kYXJkV3JhcHBlclZhbHVlCisgICAgICAgIH0KKworICAgICAgICAvLyBEZWFsbG9jYXRlIHRoZSBhbGxvY2F0ZWQgc2VydmxldCBpbnN0YW5jZQorICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKHNlcnZsZXQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHdyYXBwZXIuZGVhbGxvY2F0ZShzZXJ2bGV0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoU2VydmxldEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB3cmFwcGVyLmdldExvZ2dlcigpLmVycm9yKHNtLmdldFN0cmluZygiYXBwbGljYXRpb25EaXNwYXRjaGVyLmRlYWxsb2NhdGVFeGNlcHRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVyLmdldE5hbWUoKSksIGUpOworICAgICAgICAgICAgc2VydmxldEV4Y2VwdGlvbiA9IGU7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CisgICAgICAgICAgICB3cmFwcGVyLmdldExvZ2dlcigpLmVycm9yKHNtLmdldFN0cmluZygiYXBwbGljYXRpb25EaXNwYXRjaGVyLmRlYWxsb2NhdGVFeGNlcHRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVyLmdldE5hbWUoKSksIGUpOworICAgICAgICAgICAgc2VydmxldEV4Y2VwdGlvbiA9IG5ldyBTZXJ2bGV0RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygiYXBwbGljYXRpb25EaXNwYXRjaGVyLmRlYWxsb2NhdGVFeGNlcHRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlci5nZXROYW1lKCkpLCBlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlc2V0IHRoZSBvbGQgY29udGV4dCBjbGFzcyBsb2FkZXIKKyAgICAgICAgaWYgKG9sZENDTCAhPSBudWxsKQorICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIob2xkQ0NMKTsKKyAgICAgICAgCisgICAgICAgIC8vIFVud3JhcCByZXF1ZXN0L3Jlc3BvbnNlIGlmIG5lZWRlZAorICAgICAgICAvLyBTZWUgQnVnemlsbGEgMzA5NDkKKyAgICAgICAgdW53cmFwUmVxdWVzdCgpOworICAgICAgICB1bndyYXBSZXNwb25zZSgpOworCisgICAgICAgIC8vIFJldGhyb3cgYW4gZXhjZXB0aW9uIGlmIG9uZSB3YXMgdGhyb3duIGJ5IHRoZSBpbnZva2VkIHNlcnZsZXQKKyAgICAgICAgaWYgKGlvRXhjZXB0aW9uICE9IG51bGwpCisgICAgICAgICAgICB0aHJvdyBpb0V4Y2VwdGlvbjsKKyAgICAgICAgaWYgKHNlcnZsZXRFeGNlcHRpb24gIT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IHNlcnZsZXRFeGNlcHRpb247CisgICAgICAgIGlmIChydW50aW1lRXhjZXB0aW9uICE9IG51bGwpCisgICAgICAgICAgICB0aHJvdyBydW50aW1lRXhjZXB0aW9uOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdXAgdG8gaGFuZGxlIHRoZSBzcGVjaWZpZWQgcmVxdWVzdCBhbmQgcmVzcG9uc2UKKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgc3BlY2lmaWVkIGJ5IHRoZSBjYWxsZXIKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIHNlcnZsZXQgcmVzcG9uc2Ugc3BlY2lmaWVkIGJ5IHRoZSBjYWxsZXIKKyAgICAgKiBAcGFyYW0gaW5jbHVkaW5nIEFyZSB3ZSBwZXJmb3JtaW5nIGFuIGluY2x1ZGUoKSBhcyBvcHBvc2VkIHRvCisgICAgICogIGEgZm9yd2FyZCgpPworICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZXR1cChTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaW5jbHVkaW5nKSB7CisKKyAgICAgICAgdGhpcy5hcHBSZXF1ZXN0ID0gcmVxdWVzdDsKKyAgICAgICAgdGhpcy5hcHBSZXNwb25zZSA9IHJlc3BvbnNlOworICAgICAgICB0aGlzLm91dGVyUmVxdWVzdCA9IHJlcXVlc3Q7CisgICAgICAgIHRoaXMub3V0ZXJSZXNwb25zZSA9IHJlc3BvbnNlOworICAgICAgICB0aGlzLmluY2x1ZGluZyA9IGluY2x1ZGluZzsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogVW53cmFwIHRoZSByZXF1ZXN0IGlmIHdlIGhhdmUgd3JhcHBlZCBpdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgdW53cmFwUmVxdWVzdCgpIHsKKworICAgICAgICBpZiAod3JhcFJlcXVlc3QgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBTZXJ2bGV0UmVxdWVzdCBwcmV2aW91cyA9IG51bGw7CisgICAgICAgIFNlcnZsZXRSZXF1ZXN0IGN1cnJlbnQgPSBvdXRlclJlcXVlc3Q7CisgICAgICAgIHdoaWxlIChjdXJyZW50ICE9IG51bGwpIHsKKworICAgICAgICAgICAgLy8gSWYgd2UgcnVuIGludG8gdGhlIGNvbnRhaW5lciByZXF1ZXN0IHdlIGFyZSBkb25lCisgICAgICAgICAgICBpZiAoKGN1cnJlbnQgaW5zdGFuY2VvZiBSZXF1ZXN0KQorICAgICAgICAgICAgICAgIHx8IChjdXJyZW50IGluc3RhbmNlb2YgUmVxdWVzdEZhY2FkZSkpCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgY3VycmVudCByZXF1ZXN0IGlmIGl0IGlzIG91ciB3cmFwcGVyCisgICAgICAgICAgICBpZiAoY3VycmVudCA9PSB3cmFwUmVxdWVzdCkgeworICAgICAgICAgICAgICAgIFNlcnZsZXRSZXF1ZXN0IG5leHQgPQorICAgICAgICAgICAgICAgICAgKChTZXJ2bGV0UmVxdWVzdFdyYXBwZXIpIGN1cnJlbnQpLmdldFJlcXVlc3QoKTsKKyAgICAgICAgICAgICAgICBpZiAocHJldmlvdXMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgb3V0ZXJSZXF1ZXN0ID0gbmV4dDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICgoU2VydmxldFJlcXVlc3RXcmFwcGVyKSBwcmV2aW91cykuc2V0UmVxdWVzdChuZXh0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQWR2YW5jZSB0byB0aGUgbmV4dCByZXF1ZXN0IGluIHRoZSBjaGFpbgorICAgICAgICAgICAgcHJldmlvdXMgPSBjdXJyZW50OworICAgICAgICAgICAgY3VycmVudCA9ICgoU2VydmxldFJlcXVlc3RXcmFwcGVyKSBjdXJyZW50KS5nZXRSZXF1ZXN0KCk7CisKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBVbndyYXAgdGhlIHJlc3BvbnNlIGlmIHdlIGhhdmUgd3JhcHBlZCBpdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgdW53cmFwUmVzcG9uc2UoKSB7CisKKyAgICAgICAgaWYgKHdyYXBSZXNwb25zZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIFNlcnZsZXRSZXNwb25zZSBwcmV2aW91cyA9IG51bGw7CisgICAgICAgIFNlcnZsZXRSZXNwb25zZSBjdXJyZW50ID0gb3V0ZXJSZXNwb25zZTsKKyAgICAgICAgd2hpbGUgKGN1cnJlbnQgIT0gbnVsbCkgeworCisgICAgICAgICAgICAvLyBJZiB3ZSBydW4gaW50byB0aGUgY29udGFpbmVyIHJlc3BvbnNlIHdlIGFyZSBkb25lCisgICAgICAgICAgICBpZiAoKGN1cnJlbnQgaW5zdGFuY2VvZiBSZXNwb25zZSkKKyAgICAgICAgICAgICAgICB8fCAoY3VycmVudCBpbnN0YW5jZW9mIFJlc3BvbnNlRmFjYWRlKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBjdXJyZW50IHJlc3BvbnNlIGlmIGl0IGlzIG91ciB3cmFwcGVyCisgICAgICAgICAgICBpZiAoY3VycmVudCA9PSB3cmFwUmVzcG9uc2UpIHsKKyAgICAgICAgICAgICAgICBTZXJ2bGV0UmVzcG9uc2UgbmV4dCA9CisgICAgICAgICAgICAgICAgICAoKFNlcnZsZXRSZXNwb25zZVdyYXBwZXIpIGN1cnJlbnQpLmdldFJlc3BvbnNlKCk7CisgICAgICAgICAgICAgICAgaWYgKHByZXZpb3VzID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIG91dGVyUmVzcG9uc2UgPSBuZXh0OworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgKChTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyKSBwcmV2aW91cykuc2V0UmVzcG9uc2UobmV4dCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEFkdmFuY2UgdG8gdGhlIG5leHQgcmVzcG9uc2UgaW4gdGhlIGNoYWluCisgICAgICAgICAgICBwcmV2aW91cyA9IGN1cnJlbnQ7CisgICAgICAgICAgICBjdXJyZW50ID0gKChTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyKSBjdXJyZW50KS5nZXRSZXNwb25zZSgpOworCisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuZCByZXR1cm4gYSByZXF1ZXN0IHdyYXBwZXIgdGhhdCBoYXMgYmVlbiBpbnNlcnRlZCBpbiB0aGUKKyAgICAgKiBhcHByb3ByaWF0ZSBzcG90IGluIHRoZSByZXF1ZXN0IGNoYWluLgorICAgICAqLworICAgIHByaXZhdGUgU2VydmxldFJlcXVlc3Qgd3JhcFJlcXVlc3QoKSB7CisKKyAgICAgICAgLy8gTG9jYXRlIHRoZSByZXF1ZXN0IHdlIHNob3VsZCBpbnNlcnQgaW4gZnJvbnQgb2YKKyAgICAgICAgU2VydmxldFJlcXVlc3QgcHJldmlvdXMgPSBudWxsOworICAgICAgICBTZXJ2bGV0UmVxdWVzdCBjdXJyZW50ID0gb3V0ZXJSZXF1ZXN0OworICAgICAgICB3aGlsZSAoY3VycmVudCAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoIm9yZy5hcGFjaGUuY2F0YWxpbmEuc2VydmxldHMuSW52b2tlckh0dHBSZXF1ZXN0Ii4KKyAgICAgICAgICAgICAgICBlcXVhbHMoY3VycmVudC5nZXRDbGFzcygpLmdldE5hbWUoKSkpCisgICAgICAgICAgICAgICAgYnJlYWs7IC8vIEtMVURHRSAtIE1ha2UgbmVzdGVkIFJELmZvcndhcmQoKSB1c2luZyBpbnZva2VyIHdvcmsKKyAgICAgICAgICAgIGlmICghKGN1cnJlbnQgaW5zdGFuY2VvZiBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIpKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgaWYgKGN1cnJlbnQgaW5zdGFuY2VvZiBBcHBsaWNhdGlvbkh0dHBSZXF1ZXN0KQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgaWYgKGN1cnJlbnQgaW5zdGFuY2VvZiBBcHBsaWNhdGlvblJlcXVlc3QpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpZiAoY3VycmVudCBpbnN0YW5jZW9mIFJlcXVlc3QpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBwcmV2aW91cyA9IGN1cnJlbnQ7CisgICAgICAgICAgICBjdXJyZW50ID0gKChTZXJ2bGV0UmVxdWVzdFdyYXBwZXIpIGN1cnJlbnQpLmdldFJlcXVlc3QoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEluc3RhbnRpYXRlIGEgbmV3IHdyYXBwZXIgYXQgdGhpcyBwb2ludCBhbmQgaW5zZXJ0IGl0IGluIHRoZSBjaGFpbgorICAgICAgICBTZXJ2bGV0UmVxdWVzdCB3cmFwcGVyID0gbnVsbDsKKyAgICAgICAgaWYgKChjdXJyZW50IGluc3RhbmNlb2YgQXBwbGljYXRpb25IdHRwUmVxdWVzdCkgfHwKKyAgICAgICAgICAgIChjdXJyZW50IGluc3RhbmNlb2YgUmVxdWVzdCkgfHwKKyAgICAgICAgICAgIChjdXJyZW50IGluc3RhbmNlb2YgSHR0cFNlcnZsZXRSZXF1ZXN0KSkgeworICAgICAgICAgICAgLy8gQ29tcHV0ZSBhIGNyb3NzQ29udGV4dCBmbGFnCisgICAgICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgaGN1cnJlbnQgPSAoSHR0cFNlcnZsZXRSZXF1ZXN0KSBjdXJyZW50OworICAgICAgICAgICAgYm9vbGVhbiBjcm9zc0NvbnRleHQgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmICgob3V0ZXJSZXF1ZXN0IGluc3RhbmNlb2YgQXBwbGljYXRpb25IdHRwUmVxdWVzdCkgfHwKKyAgICAgICAgICAgICAgICAob3V0ZXJSZXF1ZXN0IGluc3RhbmNlb2YgUmVxdWVzdCkgfHwKKyAgICAgICAgICAgICAgICAob3V0ZXJSZXF1ZXN0IGluc3RhbmNlb2YgSHR0cFNlcnZsZXRSZXF1ZXN0KSkgeworICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCBob3V0ZXJSZXF1ZXN0ID0gCisgICAgICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlcXVlc3QpIG91dGVyUmVxdWVzdDsKKyAgICAgICAgICAgICAgICBPYmplY3QgY29udGV4dFBhdGggPSBob3V0ZXJSZXF1ZXN0LmdldEF0dHJpYnV0ZQorICAgICAgICAgICAgICAgICAgICAoR2xvYmFscy5JTkNMVURFX0NPTlRFWFRfUEFUSF9BVFRSKTsKKyAgICAgICAgICAgICAgICBpZiAoY29udGV4dFBhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAvLyBGb3J3YXJkCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHRQYXRoID0gaG91dGVyUmVxdWVzdC5nZXRDb250ZXh0UGF0aCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjcm9zc0NvbnRleHQgPSAhKGNvbnRleHQuZ2V0UGF0aCgpLmVxdWFscyhjb250ZXh0UGF0aCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd3JhcHBlciA9IG5ldyBBcHBsaWNhdGlvbkh0dHBSZXF1ZXN0CisgICAgICAgICAgICAgICAgKGhjdXJyZW50LCBjb250ZXh0LCBjcm9zc0NvbnRleHQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgd3JhcHBlciA9IG5ldyBBcHBsaWNhdGlvblJlcXVlc3QoY3VycmVudCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHByZXZpb3VzID09IG51bGwpCisgICAgICAgICAgICBvdXRlclJlcXVlc3QgPSB3cmFwcGVyOworICAgICAgICBlbHNlCisgICAgICAgICAgICAoKFNlcnZsZXRSZXF1ZXN0V3JhcHBlcikgcHJldmlvdXMpLnNldFJlcXVlc3Qod3JhcHBlcik7CisgICAgICAgIHdyYXBSZXF1ZXN0ID0gd3JhcHBlcjsKKyAgICAgICAgcmV0dXJuICh3cmFwcGVyKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuZCByZXR1cm4gYSByZXNwb25zZSB3cmFwcGVyIHRoYXQgaGFzIGJlZW4gaW5zZXJ0ZWQgaW4gdGhlCisgICAgICogYXBwcm9wcmlhdGUgc3BvdCBpbiB0aGUgcmVzcG9uc2UgY2hhaW4uCisgICAgICovCisgICAgcHJpdmF0ZSBTZXJ2bGV0UmVzcG9uc2Ugd3JhcFJlc3BvbnNlKCkgeworCisgICAgICAgIC8vIExvY2F0ZSB0aGUgcmVzcG9uc2Ugd2Ugc2hvdWxkIGluc2VydCBpbiBmcm9udCBvZgorICAgICAgICBTZXJ2bGV0UmVzcG9uc2UgcHJldmlvdXMgPSBudWxsOworICAgICAgICBTZXJ2bGV0UmVzcG9uc2UgY3VycmVudCA9IG91dGVyUmVzcG9uc2U7CisgICAgICAgIHdoaWxlIChjdXJyZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmICghKGN1cnJlbnQgaW5zdGFuY2VvZiBTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGlmIChjdXJyZW50IGluc3RhbmNlb2YgQXBwbGljYXRpb25IdHRwUmVzcG9uc2UpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpZiAoY3VycmVudCBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uUmVzcG9uc2UpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpZiAoY3VycmVudCBpbnN0YW5jZW9mIFJlc3BvbnNlKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgcHJldmlvdXMgPSBjdXJyZW50OworICAgICAgICAgICAgY3VycmVudCA9ICgoU2VydmxldFJlc3BvbnNlV3JhcHBlcikgY3VycmVudCkuZ2V0UmVzcG9uc2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEluc3RhbnRpYXRlIGEgbmV3IHdyYXBwZXIgYXQgdGhpcyBwb2ludCBhbmQgaW5zZXJ0IGl0IGluIHRoZSBjaGFpbgorICAgICAgICBTZXJ2bGV0UmVzcG9uc2Ugd3JhcHBlciA9IG51bGw7CisgICAgICAgIGlmICgoY3VycmVudCBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uSHR0cFJlc3BvbnNlKSB8fAorICAgICAgICAgICAgKGN1cnJlbnQgaW5zdGFuY2VvZiBSZXNwb25zZSkgfHwKKyAgICAgICAgICAgIChjdXJyZW50IGluc3RhbmNlb2YgSHR0cFNlcnZsZXRSZXNwb25zZSkpCisgICAgICAgICAgICB3cmFwcGVyID0KKyAgICAgICAgICAgICAgICBuZXcgQXBwbGljYXRpb25IdHRwUmVzcG9uc2UoKEh0dHBTZXJ2bGV0UmVzcG9uc2UpIGN1cnJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGluZyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHdyYXBwZXIgPSBuZXcgQXBwbGljYXRpb25SZXNwb25zZShjdXJyZW50LCBpbmNsdWRpbmcpOworICAgICAgICBpZiAocHJldmlvdXMgPT0gbnVsbCkKKyAgICAgICAgICAgIG91dGVyUmVzcG9uc2UgPSB3cmFwcGVyOworICAgICAgICBlbHNlCisgICAgICAgICAgICAoKFNlcnZsZXRSZXNwb25zZVdyYXBwZXIpIHByZXZpb3VzKS5zZXRSZXNwb25zZSh3cmFwcGVyKTsKKyAgICAgICAgd3JhcFJlc3BvbnNlID0gd3JhcHBlcjsKKyAgICAgICAgcmV0dXJuICh3cmFwcGVyKTsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29yZS9BcHBsaWNhdGlvbkZpbHRlckNoYWluLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29yZS9BcHBsaWNhdGlvbkZpbHRlckNoYWluLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRmZjhiOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb3JlL0FwcGxpY2F0aW9uRmlsdGVyQ2hhaW4uamF2YQpAQCAtMCwwICsxLDMyNyBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlOworCisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuRmlsdGVyOworaW1wb3J0IGphdmF4LnNlcnZsZXQuRmlsdGVyQ2hhaW47CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldFJlc3BvbnNlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkluc3RhbmNlRXZlbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5zZWN1cml0eS5TZWN1cml0eVV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLkluc3RhbmNlU3VwcG9ydDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuU3RyaW5nTWFuYWdlcjsKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiA8Y29kZT5qYXZheC5zZXJ2bGV0LkZpbHRlckNoYWluPC9jb2RlPiB1c2VkIHRvIG1hbmFnZQorICogdGhlIGV4ZWN1dGlvbiBvZiBhIHNldCBvZiBmaWx0ZXJzIGZvciBhIHBhcnRpY3VsYXIgcmVxdWVzdC4gIFdoZW4gdGhlCisgKiBzZXQgb2YgZGVmaW5lZCBmaWx0ZXJzIGhhcyBhbGwgYmVlbiBleGVjdXRlZCwgdGhlIG5leHQgY2FsbCB0bworICogPGNvZGU+ZG9GaWx0ZXIoKTwvY29kZT4gd2lsbCBleGVjdXRlIHRoZSBzZXJ2bGV0J3MgPGNvZGU+c2VydmljZSgpPC9jb2RlPgorICogbWV0aG9kIGl0c2VsZi4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworZmluYWwgY2xhc3MgQXBwbGljYXRpb25GaWx0ZXJDaGFpbiBpbXBsZW1lbnRzIEZpbHRlckNoYWluIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RhbnRzCisKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOQ1JFTUVOVCA9IDEwOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IGNoYWluIGluc3RhbmNlIHdpdGggbm8gZGVmaW5lZCBmaWx0ZXJzLgorICAgICAqLworICAgIHB1YmxpYyBBcHBsaWNhdGlvbkZpbHRlckNoYWluKCkgeworCisgICAgICAgIHN1cGVyKCk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBGaWx0ZXJzLgorICAgICAqLworICAgIHByaXZhdGUgQXBwbGljYXRpb25GaWx0ZXJDb25maWdbXSBmaWx0ZXJzID0gCisgICAgICAgIG5ldyBBcHBsaWNhdGlvbkZpbHRlckNvbmZpZ1swXTsKKworCisgICAgLyoqCisgICAgICogVGhlIGludCB3aGljaCBpcyB1c2VkIHRvIG1haW50YWluIHRoZSBjdXJyZW50IHBvc2l0aW9uIAorICAgICAqIGluIHRoZSBmaWx0ZXIgY2hhaW4uCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgcG9zID0gMDsKKworCisgICAgLyoqCisgICAgICogVGhlIGludCB3aGljaCBnaXZlcyB0aGUgY3VycmVudCBudW1iZXIgb2YgZmlsdGVycyBpbiB0aGUgY2hhaW4uCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgbiA9IDA7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzZXJ2bGV0IGluc3RhbmNlIHRvIGJlIGV4ZWN1dGVkIGJ5IHRoaXMgY2hhaW4uCisgICAgICovCisgICAgcHJpdmF0ZSBTZXJ2bGV0IHNlcnZsZXQgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc3RyaW5nIG1hbmFnZXIgZm9yIG91ciBwYWNrYWdlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ01hbmFnZXIgc20gPQorICAgICAgU3RyaW5nTWFuYWdlci5nZXRNYW5hZ2VyKENvbnN0YW50cy5QYWNrYWdlKTsKKworCisgICAgLyoqCisgICAgICogVGhlIEluc3RhbmNlU3VwcG9ydCBpbnN0YW5jZSBhc3NvY2lhdGVkIHdpdGggb3VyIFdyYXBwZXIgKHVzZWQgdG8KKyAgICAgKiBzZW5kICJiZWZvcmUgZmlsdGVyIiBhbmQgImFmdGVyIGZpbHRlciIgZXZlbnRzLgorICAgICAqLworICAgIHByaXZhdGUgSW5zdGFuY2VTdXBwb3J0IHN1cHBvcnQgPSBudWxsOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZpbHRlckNoYWluIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogSW52b2tlIHRoZSBuZXh0IGZpbHRlciBpbiB0aGlzIGNoYWluLCBwYXNzaW5nIHRoZSBzcGVjaWZpZWQgcmVxdWVzdAorICAgICAqIGFuZCByZXNwb25zZS4gIElmIHRoZXJlIGFyZSBubyBtb3JlIGZpbHRlcnMgaW4gdGhpcyBjaGFpbiwgaW52b2tlCisgICAgICogdGhlIDxjb2RlPnNlcnZpY2UoKTwvY29kZT4gbWV0aG9kIG9mIHRoZSBzZXJ2bGV0IGl0c2VsZi4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIHNlcnZsZXQgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0IGV4Y2VwdGlvbiBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkb0ZpbHRlcihTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYoIFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSAhPSBudWxsICkgeworICAgICAgICAgICAgZmluYWwgU2VydmxldFJlcXVlc3QgcmVxID0gcmVxdWVzdDsKKyAgICAgICAgICAgIGZpbmFsIFNlcnZsZXRSZXNwb25zZSByZXMgPSByZXNwb25zZTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKKyAgICAgICAgICAgICAgICAgICAgbmV3IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbERvRmlsdGVyKHJlcSxyZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0gY2F0Y2goIFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24gcGUpIHsKKyAgICAgICAgICAgICAgICBFeGNlcHRpb24gZSA9IHBlLmdldEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU2VydmxldEV4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgKFNlcnZsZXRFeGNlcHRpb24pIGU7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoZSBpbnN0YW5jZW9mIElPRXhjZXB0aW9uKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyAoSU9FeGNlcHRpb24pIGU7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoZSBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pCisgICAgICAgICAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKSBlOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50ZXJuYWxEb0ZpbHRlcihyZXF1ZXN0LHJlc3BvbnNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbnRlcm5hbERvRmlsdGVyKFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICAvLyBDYWxsIHRoZSBuZXh0IGZpbHRlciBpZiB0aGVyZSBpcyBvbmUKKyAgICAgICAgaWYgKHBvcyA8IG4pIHsKKyAgICAgICAgICAgIEFwcGxpY2F0aW9uRmlsdGVyQ29uZmlnIGZpbHRlckNvbmZpZyA9IGZpbHRlcnNbcG9zKytdOworICAgICAgICAgICAgRmlsdGVyIGZpbHRlciA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGZpbHRlciA9IGZpbHRlckNvbmZpZy5nZXRGaWx0ZXIoKTsKKyAgICAgICAgICAgICAgICBzdXBwb3J0LmZpcmVJbnN0YW5jZUV2ZW50KEluc3RhbmNlRXZlbnQuQkVGT1JFX0ZJTFRFUl9FVkVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlciwgcmVxdWVzdCwgcmVzcG9uc2UpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmKCBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCkgIT0gbnVsbCApIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgU2VydmxldFJlcXVlc3QgcmVxID0gcmVxdWVzdDsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgU2VydmxldFJlc3BvbnNlIHJlcyA9IHJlc3BvbnNlOworICAgICAgICAgICAgICAgICAgICBQcmluY2lwYWwgcHJpbmNpcGFsID0gCisgICAgICAgICAgICAgICAgICAgICAgICAoKEh0dHBTZXJ2bGV0UmVxdWVzdCkgcmVxKS5nZXRVc2VyUHJpbmNpcGFsKCk7CisgICAgICAgICAgICAgICAgICAgIENsYXNzW10gY2xhc3NUeXBlID0gbmV3IENsYXNzW117U2VydmxldFJlcXVlc3QuY2xhc3MsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZsZXRSZXNwb25zZS5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWx0ZXJDaGFpbi5jbGFzc307CisgICAgICAgICAgICAgICAgICAgIE9iamVjdFtdIGFyZ3MgPSBuZXcgT2JqZWN0W117cmVxLCByZXMsIHRoaXN9OworICAgICAgICAgICAgICAgICAgICBTZWN1cml0eVV0aWwuZG9Bc1ByaXZpbGVnZQorICAgICAgICAgICAgICAgICAgICAgICAgKCJkb0ZpbHRlciIsIGZpbHRlciwgY2xhc3NUeXBlLCBhcmdzKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeyAgCisgICAgICAgICAgICAgICAgICAgIGZpbHRlci5kb0ZpbHRlcihyZXF1ZXN0LCByZXNwb25zZSwgdGhpcyk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3VwcG9ydC5maXJlSW5zdGFuY2VFdmVudChJbnN0YW5jZUV2ZW50LkFGVEVSX0ZJTFRFUl9FVkVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlciwgcmVxdWVzdCwgcmVzcG9uc2UpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGlmIChmaWx0ZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgc3VwcG9ydC5maXJlSW5zdGFuY2VFdmVudChJbnN0YW5jZUV2ZW50LkFGVEVSX0ZJTFRFUl9FVkVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIsIHJlcXVlc3QsIHJlc3BvbnNlLCBlKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICAgICAgfSBjYXRjaCAoU2VydmxldEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgaWYgKGZpbHRlciAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBzdXBwb3J0LmZpcmVJbnN0YW5jZUV2ZW50KEluc3RhbmNlRXZlbnQuQUZURVJfRklMVEVSX0VWRU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlciwgcmVxdWVzdCwgcmVzcG9uc2UsIGUpOworICAgICAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBpZiAoZmlsdGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHN1cHBvcnQuZmlyZUluc3RhbmNlRXZlbnQoSW5zdGFuY2VFdmVudC5BRlRFUl9GSUxURVJfRVZFTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyLCByZXF1ZXN0LCByZXNwb25zZSwgZSk7CisgICAgICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CisgICAgICAgICAgICAgICAgaWYgKGZpbHRlciAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBzdXBwb3J0LmZpcmVJbnN0YW5jZUV2ZW50KEluc3RhbmNlRXZlbnQuQUZURVJfRklMVEVSX0VWRU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlciwgcmVxdWVzdCwgcmVzcG9uc2UsIGUpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJmaWx0ZXJDaGFpbi5maWx0ZXIiKSwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBXZSBmZWxsIG9mZiB0aGUgZW5kIG9mIHRoZSBjaGFpbiAtLSBjYWxsIHRoZSBzZXJ2bGV0IGluc3RhbmNlCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzdXBwb3J0LmZpcmVJbnN0YW5jZUV2ZW50KEluc3RhbmNlRXZlbnQuQkVGT1JFX1NFUlZJQ0VfRVZFTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZsZXQsIHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICAgICAgICAgIGlmICgocmVxdWVzdCBpbnN0YW5jZW9mIEh0dHBTZXJ2bGV0UmVxdWVzdCkgJiYKKyAgICAgICAgICAgICAgICAocmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwU2VydmxldFJlc3BvbnNlKSkgeworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiggU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpICE9IG51bGwgKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFNlcnZsZXRSZXF1ZXN0IHJlcSA9IHJlcXVlc3Q7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFNlcnZsZXRSZXNwb25zZSByZXMgPSByZXNwb25zZTsKKyAgICAgICAgICAgICAgICAgICAgUHJpbmNpcGFsIHByaW5jaXBhbCA9IAorICAgICAgICAgICAgICAgICAgICAgICAgKChIdHRwU2VydmxldFJlcXVlc3QpIHJlcSkuZ2V0VXNlclByaW5jaXBhbCgpOworICAgICAgICAgICAgICAgICAgICBDbGFzc1tdIGNsYXNzVHlwZSA9IG5ldyBDbGFzc1tde1NlcnZsZXRSZXF1ZXN0LmNsYXNzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmxldFJlc3BvbnNlLmNsYXNzfTsKKyAgICAgICAgICAgICAgICAgICAgT2JqZWN0W10gYXJncyA9IG5ldyBPYmplY3RbXXtyZXEsIHJlc307CisgICAgICAgICAgICAgICAgICAgIFNlY3VyaXR5VXRpbC5kb0FzUHJpdmlsZWdlKCJzZXJ2aWNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmxldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NUeXBlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbmNpcGFsKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB9IGVsc2UgeyAgCisgICAgICAgICAgICAgICAgICAgIHNlcnZsZXQuc2VydmljZSgoSHR0cFNlcnZsZXRSZXF1ZXN0KSByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UpIHJlc3BvbnNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNlcnZsZXQuc2VydmljZShyZXF1ZXN0LCByZXNwb25zZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdXBwb3J0LmZpcmVJbnN0YW5jZUV2ZW50KEluc3RhbmNlRXZlbnQuQUZURVJfU0VSVklDRV9FVkVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmxldCwgcmVxdWVzdCwgcmVzcG9uc2UpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBzdXBwb3J0LmZpcmVJbnN0YW5jZUV2ZW50KEluc3RhbmNlRXZlbnQuQUZURVJfU0VSVklDRV9FVkVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmxldCwgcmVxdWVzdCwgcmVzcG9uc2UsIGUpOworICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgfSBjYXRjaCAoU2VydmxldEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBzdXBwb3J0LmZpcmVJbnN0YW5jZUV2ZW50KEluc3RhbmNlRXZlbnQuQUZURVJfU0VSVklDRV9FVkVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmxldCwgcmVxdWVzdCwgcmVzcG9uc2UsIGUpOworICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBzdXBwb3J0LmZpcmVJbnN0YW5jZUV2ZW50KEluc3RhbmNlRXZlbnQuQUZURVJfU0VSVklDRV9FVkVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmxldCwgcmVxdWVzdCwgcmVzcG9uc2UsIGUpOworICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKKyAgICAgICAgICAgIHN1cHBvcnQuZmlyZUluc3RhbmNlRXZlbnQoSW5zdGFuY2VFdmVudC5BRlRFUl9TRVJWSUNFX0VWRU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2bGV0LCByZXF1ZXN0LCByZXNwb25zZSwgZSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbgorICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJmaWx0ZXJDaGFpbi5zZXJ2bGV0IiksIGUpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBhY2thZ2UgTWV0aG9kcworCisKKworICAgIC8qKgorICAgICAqIEFkZCBhIGZpbHRlciB0byB0aGUgc2V0IG9mIGZpbHRlcnMgdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIGluIHRoaXMgY2hhaW4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsdGVyQ29uZmlnIFRoZSBGaWx0ZXJDb25maWcgZm9yIHRoZSBzZXJ2bGV0IHRvIGJlIGV4ZWN1dGVkCisgICAgICovCisgICAgdm9pZCBhZGRGaWx0ZXIoQXBwbGljYXRpb25GaWx0ZXJDb25maWcgZmlsdGVyQ29uZmlnKSB7CisKKyAgICAgICAgaWYgKG4gPT0gZmlsdGVycy5sZW5ndGgpIHsKKyAgICAgICAgICAgIEFwcGxpY2F0aW9uRmlsdGVyQ29uZmlnW10gbmV3RmlsdGVycyA9CisgICAgICAgICAgICAgICAgbmV3IEFwcGxpY2F0aW9uRmlsdGVyQ29uZmlnW24gKyBJTkNSRU1FTlRdOworICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShmaWx0ZXJzLCAwLCBuZXdGaWx0ZXJzLCAwLCBuKTsKKyAgICAgICAgICAgIGZpbHRlcnMgPSBuZXdGaWx0ZXJzOworICAgICAgICB9CisgICAgICAgIGZpbHRlcnNbbisrXSA9IGZpbHRlckNvbmZpZzsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVsZWFzZSByZWZlcmVuY2VzIHRvIHRoZSBmaWx0ZXJzIGFuZCB3cmFwcGVyIGV4ZWN1dGVkIGJ5IHRoaXMgY2hhaW4uCisgICAgICovCisgICAgdm9pZCByZWxlYXNlKCkgeworCisgICAgICAgIG4gPSAwOworICAgICAgICBwb3MgPSAwOworICAgICAgICBzZXJ2bGV0ID0gbnVsbDsKKyAgICAgICAgc3VwcG9ydCA9IG51bGw7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgc2VydmxldCB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgYXQgdGhlIGVuZCBvZiB0aGlzIGNoYWluLgorICAgICAqCisgICAgICogQHBhcmFtIHNlcnZsZXQgVGhlIFdyYXBwZXIgZm9yIHRoZSBzZXJ2bGV0IHRvIGJlIGV4ZWN1dGVkCisgICAgICovCisgICAgdm9pZCBzZXRTZXJ2bGV0KFNlcnZsZXQgc2VydmxldCkgeworCisgICAgICAgIHRoaXMuc2VydmxldCA9IHNlcnZsZXQ7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgSW5zdGFuY2VTdXBwb3J0IG9iamVjdCB1c2VkIGZvciBldmVudCBub3RpZmljYXRpb25zCisgICAgICogZm9yIHRoaXMgZmlsdGVyIGNoYWluLgorICAgICAqCisgICAgICogQHBhcmFtIHN1cHBvcnQgVGhlIEluc3RhbmNlU3VwcG9ydCBvYmplY3QgZm9yIG91ciBXcmFwcGVyCisgICAgICovCisgICAgdm9pZCBzZXRTdXBwb3J0KEluc3RhbmNlU3VwcG9ydCBzdXBwb3J0KSB7CisKKyAgICAgICAgdGhpcy5zdXBwb3J0ID0gc3VwcG9ydDsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29yZS9BcHBsaWNhdGlvbkZpbHRlckNvbmZpZy5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NvcmUvQXBwbGljYXRpb25GaWx0ZXJDb25maWcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjZjZGVkCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NvcmUvQXBwbGljYXRpb25GaWx0ZXJDb25maWcuamF2YQpAQCAtMCwwICsxLDMxOCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlOworCisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXguc2VydmxldC5GaWx0ZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5GaWx0ZXJDb25maWc7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuRmlsdGVyRGVmOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuc2VjdXJpdHkuU2VjdXJpdHlVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5FbnVtZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwubG9nLlN5c3RlbUxvZ0hhbmRsZXI7CisKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiBhIDxjb2RlPmphdmF4LnNlcnZsZXQuRmlsdGVyQ29uZmlnPC9jb2RlPiB1c2VmdWwgaW4KKyAqIG1hbmFnaW5nIHRoZSBmaWx0ZXIgaW5zdGFuY2VzIGluc3RhbnRpYXRlZCB3aGVuIGEgd2ViIGFwcGxpY2F0aW9uCisgKiBpcyBmaXJzdCBzdGFydGVkLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitmaW5hbCBjbGFzcyBBcHBsaWNhdGlvbkZpbHRlckNvbmZpZyBpbXBsZW1lbnRzIEZpbHRlckNvbmZpZywgU2VyaWFsaXphYmxlIHsKKworICAgIHByaXZhdGUgc3RhdGljIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZyBsb2c9CisgICAgICAgIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3RvcnkuZ2V0TG9nKCBBcHBsaWNhdGlvbkZpbHRlckNvbmZpZy5jbGFzcyApOworIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgQXBwbGljYXRpb25GaWx0ZXJDb25maWcgZm9yIHRoZSBzcGVjaWZpZWQgZmlsdGVyCisgICAgICogZGVmaW5pdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHdpdGggd2hpY2ggd2UgYXJlIGFzc29jaWF0ZWQKKyAgICAgKiBAcGFyYW0gZmlsdGVyRGVmIEZpbHRlciBkZWZpbml0aW9uIGZvciB3aGljaCBhIEZpbHRlckNvbmZpZyBpcyB0byBiZQorICAgICAqICBjb25zdHJ1Y3RlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBDbGFzc0Nhc3RFeGNlcHRpb24gaWYgdGhlIHNwZWNpZmllZCBjbGFzcyBkb2VzIG5vdCBpbXBsZW1lbnQKKyAgICAgKiAgdGhlIDxjb2RlPmphdmF4LnNlcnZsZXQuRmlsdGVyPC9jb2RlPiBpbnRlcmZhY2UKKyAgICAgKiBAZXhjZXB0aW9uIENsYXNzTm90Rm91bmRFeGNlcHRpb24gaWYgdGhlIGZpbHRlciBjbGFzcyBjYW5ub3QgYmUgZm91bmQKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gaWYgdGhlIGZpbHRlciBjbGFzcyBjYW5ub3QgYmUKKyAgICAgKiAgcHVibGljbHkgaW5zdGFudGlhdGVkCisgICAgICogQGV4Y2VwdGlvbiBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUKKyAgICAgKiAgaW5zdGFudGlhdGluZyB0aGUgZmlsdGVyIG9iamVjdAorICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiB0aHJvd24gYnkgdGhlIGZpbHRlcidzIGluaXQoKSBtZXRob2QKKyAgICAgKi8KKyAgICBwdWJsaWMgQXBwbGljYXRpb25GaWx0ZXJDb25maWcoQ29udGV4dCBjb250ZXh0LCBGaWx0ZXJEZWYgZmlsdGVyRGVmKQorICAgICAgICB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLAorICAgICAgICAgICAgICAgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgIHNldEZpbHRlckRlZihmaWx0ZXJEZWYpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIENvbnRleHQgd2l0aCB3aGljaCB3ZSBhcmUgYXNzb2NpYXRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIENvbnRleHQgY29udGV4dCA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBhcHBsaWNhdGlvbiBGaWx0ZXIgd2UgYXJlIGNvbmZpZ3VyZWQgZm9yLgorICAgICAqLworICAgIHByaXZhdGUgdHJhbnNpZW50IEZpbHRlciBmaWx0ZXIgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgPGNvZGU+RmlsdGVyRGVmPC9jb2RlPiB0aGF0IGRlZmluZXMgb3VyIGFzc29jaWF0ZWQgRmlsdGVyLgorICAgICAqLworICAgIHByaXZhdGUgRmlsdGVyRGVmIGZpbHRlckRlZiA9IG51bGw7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGaWx0ZXJDb25maWcgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGZpbHRlciB3ZSBhcmUgY29uZmlndXJpbmcuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRGaWx0ZXJOYW1lKCkgeworCisgICAgICAgIHJldHVybiAoZmlsdGVyRGVmLmdldEZpbHRlck5hbWUoKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIDxjb2RlPlN0cmluZzwvY29kZT4gY29udGFpbmluZyB0aGUgdmFsdWUgb2YgdGhlIG5hbWVkCisgICAgICogaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcGFyYW1ldGVyCisgICAgICogZG9lcyBub3QgZXhpc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSByZXF1ZXN0ZWQgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJbml0UGFyYW1ldGVyKFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgTWFwIG1hcCA9IGZpbHRlckRlZi5nZXRQYXJhbWV0ZXJNYXAoKTsKKyAgICAgICAgaWYgKG1hcCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuICgoU3RyaW5nKSBtYXAuZ2V0KG5hbWUpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGFuIDxjb2RlPkVudW1lcmF0aW9uPC9jb2RlPiBvZiB0aGUgbmFtZXMgb2YgdGhlIGluaXRpYWxpemF0aW9uCisgICAgICogcGFyYW1ldGVycyBmb3IgdGhpcyBGaWx0ZXIuCisgICAgICovCisgICAgcHVibGljIEVudW1lcmF0aW9uIGdldEluaXRQYXJhbWV0ZXJOYW1lcygpIHsKKworICAgICAgICBNYXAgbWFwID0gZmlsdGVyRGVmLmdldFBhcmFtZXRlck1hcCgpOworICAgICAgICBpZiAobWFwID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKG5ldyBFbnVtZXJhdG9yKG5ldyBBcnJheUxpc3QoKSkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gKG5ldyBFbnVtZXJhdG9yKG1hcC5rZXlTZXQoKSkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIFNlcnZsZXRDb250ZXh0IG9mIG91ciBhc3NvY2lhdGVkIHdlYiBhcHBsaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2VydmxldENvbnRleHQgZ2V0U2VydmxldENvbnRleHQoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLmNvbnRleHQuZ2V0U2VydmxldENvbnRleHQoKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIkFwcGxpY2F0aW9uRmlsdGVyQ29uZmlnWyIpOworICAgICAgICBzYi5hcHBlbmQoIm5hbWU9Iik7CisgICAgICAgIHNiLmFwcGVuZChmaWx0ZXJEZWYuZ2V0RmlsdGVyTmFtZSgpKTsKKyAgICAgICAgc2IuYXBwZW5kKCIsIGZpbHRlckNsYXNzPSIpOworICAgICAgICBzYi5hcHBlbmQoZmlsdGVyRGVmLmdldEZpbHRlckNsYXNzKCkpOworICAgICAgICBzYi5hcHBlbmQoIl0iKTsKKyAgICAgICAgcmV0dXJuIChzYi50b1N0cmluZygpKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUGFja2FnZSBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgYXBwbGljYXRpb24gRmlsdGVyIHdlIGFyZSBjb25maWd1cmVkIGZvci4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gQ2xhc3NDYXN0RXhjZXB0aW9uIGlmIHRoZSBzcGVjaWZpZWQgY2xhc3MgZG9lcyBub3QgaW1wbGVtZW50CisgICAgICogIHRoZSA8Y29kZT5qYXZheC5zZXJ2bGV0LkZpbHRlcjwvY29kZT4gaW50ZXJmYWNlCisgICAgICogQGV4Y2VwdGlvbiBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGlmIHRoZSBmaWx0ZXIgY2xhc3MgY2Fubm90IGJlIGZvdW5kCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGlmIHRoZSBmaWx0ZXIgY2xhc3MgY2Fubm90IGJlCisgICAgICogIHB1YmxpY2x5IGluc3RhbnRpYXRlZAorICAgICAqIEBleGNlcHRpb24gSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBpZiBhbiBleGNlcHRpb24gb2NjdXJzIHdoaWxlCisgICAgICogIGluc3RhbnRpYXRpbmcgdGhlIGZpbHRlciBvYmplY3QKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgdGhyb3duIGJ5IHRoZSBmaWx0ZXIncyBpbml0KCkgbWV0aG9kCisgICAgICovCisgICAgRmlsdGVyIGdldEZpbHRlcigpIHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24sCisgICAgICAgIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEluc3RhbnRpYXRpb25FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIFJldHVybiB0aGUgZXhpc3RpbmcgZmlsdGVyIGluc3RhbmNlLCBpZiBhbnkKKyAgICAgICAgaWYgKHRoaXMuZmlsdGVyICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKHRoaXMuZmlsdGVyKTsKKworICAgICAgICAvLyBJZGVudGlmeSB0aGUgY2xhc3MgbG9hZGVyIHdlIHdpbGwgYmUgdXNpbmcKKyAgICAgICAgU3RyaW5nIGZpbHRlckNsYXNzID0gZmlsdGVyRGVmLmdldEZpbHRlckNsYXNzKCk7CisgICAgICAgIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyID0gbnVsbDsKKyAgICAgICAgaWYgKGZpbHRlckNsYXNzLnN0YXJ0c1dpdGgoIm9yZy5hcGFjaGUuY2F0YWxpbmEuIikpCisgICAgICAgICAgICBjbGFzc0xvYWRlciA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBjbGFzc0xvYWRlciA9IGNvbnRleHQuZ2V0TG9hZGVyKCkuZ2V0Q2xhc3NMb2FkZXIoKTsKKworICAgICAgICBDbGFzc0xvYWRlciBvbGRDdHhDbGFzc0xvYWRlciA9CisgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOworCisgICAgICAgIC8vIEluc3RhbnRpYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgZmlsdGVyIGFuZCByZXR1cm4gaXQKKyAgICAgICAgQ2xhc3MgY2xhenogPSBjbGFzc0xvYWRlci5sb2FkQ2xhc3MoZmlsdGVyQ2xhc3MpOworICAgICAgICB0aGlzLmZpbHRlciA9IChGaWx0ZXIpIGNsYXp6Lm5ld0luc3RhbmNlKCk7CisgICAgICAgIGlmIChjb250ZXh0IGluc3RhbmNlb2YgU3RhbmRhcmRDb250ZXh0ICYmCisgICAgICAgICAgICAoKFN0YW5kYXJkQ29udGV4dCljb250ZXh0KS5nZXRTd2FsbG93T3V0cHV0KCkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgU3lzdGVtTG9nSGFuZGxlci5zdGFydENhcHR1cmUoKTsKKyAgICAgICAgICAgICAgICBmaWx0ZXIuaW5pdCh0aGlzKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGxvZyA9IFN5c3RlbUxvZ0hhbmRsZXIuc3RvcENhcHR1cmUoKTsKKyAgICAgICAgICAgICAgICBpZiAobG9nICE9IG51bGwgJiYgbG9nLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICBnZXRTZXJ2bGV0Q29udGV4dCgpLmxvZyhsb2cpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZpbHRlci5pbml0KHRoaXMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAodGhpcy5maWx0ZXIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGZpbHRlciBkZWZpbml0aW9uIHdlIGFyZSBjb25maWd1cmVkIGZvci4KKyAgICAgKi8KKyAgICBGaWx0ZXJEZWYgZ2V0RmlsdGVyRGVmKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5maWx0ZXJEZWYpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZWxlYXNlIHRoZSBGaWx0ZXIgaW5zdGFuY2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgRmlsdGVyQ29uZmlnLAorICAgICAqIGlmIHRoZXJlIGlzIG9uZS4KKyAgICAgKi8KKyAgICB2b2lkIHJlbGVhc2UoKSB7CisKKyAgICAgICAgaWYgKHRoaXMuZmlsdGVyICE9IG51bGwpeworICAgICAgICAgICAgIGlmKCBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeXsKKyAgICAgICAgICAgICAgICAgICAgU2VjdXJpdHlVdGlsLmRvQXNQcml2aWxlZ2UoImRlc3Ryb3kiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIpOyAKKyAgICAgICAgICAgICAgICAgICAgU2VjdXJpdHlVdGlsLnJlbW92ZShmaWx0ZXIpOworICAgICAgICAgICAgICAgIH0gY2F0Y2goamF2YS5sYW5nLkV4Y2VwdGlvbiBleCl7ICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJBcHBsaWNhdGlvbkZpbHRlckNvbmZpZy5kb0FzUHJpdmlsZWdlIiwgZXgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7IAorICAgICAgICAgICAgICAgIGZpbHRlci5kZXN0cm95KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5maWx0ZXIgPSBudWxsOworCisgICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBmaWx0ZXIgZGVmaW5pdGlvbiB3ZSBhcmUgY29uZmlndXJlZCBmb3IuICBUaGlzIGhhcyB0aGUgc2lkZQorICAgICAqIGVmZmVjdCBvZiBpbnN0YW50aWF0aW5nIGFuIGluc3RhbmNlIG9mIHRoZSBjb3JyZXNwb25kaW5nIGZpbHRlciBjbGFzcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWx0ZXJEZWYgVGhlIG5ldyBmaWx0ZXIgZGVmaW5pdGlvbgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBDbGFzc0Nhc3RFeGNlcHRpb24gaWYgdGhlIHNwZWNpZmllZCBjbGFzcyBkb2VzIG5vdCBpbXBsZW1lbnQKKyAgICAgKiAgdGhlIDxjb2RlPmphdmF4LnNlcnZsZXQuRmlsdGVyPC9jb2RlPiBpbnRlcmZhY2UKKyAgICAgKiBAZXhjZXB0aW9uIENsYXNzTm90Rm91bmRFeGNlcHRpb24gaWYgdGhlIGZpbHRlciBjbGFzcyBjYW5ub3QgYmUgZm91bmQKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gaWYgdGhlIGZpbHRlciBjbGFzcyBjYW5ub3QgYmUKKyAgICAgKiAgcHVibGljbHkgaW5zdGFudGlhdGVkCisgICAgICogQGV4Y2VwdGlvbiBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUKKyAgICAgKiAgaW5zdGFudGlhdGluZyB0aGUgZmlsdGVyIG9iamVjdAorICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiB0aHJvd24gYnkgdGhlIGZpbHRlcidzIGluaXQoKSBtZXRob2QKKyAgICAgKi8KKyAgICB2b2lkIHNldEZpbHRlckRlZihGaWx0ZXJEZWYgZmlsdGVyRGVmKQorICAgICAgICB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLAorICAgICAgICAgICAgICAgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIHRoaXMuZmlsdGVyRGVmID0gZmlsdGVyRGVmOworICAgICAgICBpZiAoZmlsdGVyRGVmID09IG51bGwpIHsKKworICAgICAgICAgICAgLy8gUmVsZWFzZSBhbnkgcHJldmlvdXNseSBhbGxvY2F0ZWQgZmlsdGVyIGluc3RhbmNlCisgICAgICAgICAgICBpZiAodGhpcy5maWx0ZXIgIT0gbnVsbCl7CisgICAgICAgICAgICAgICAgIGlmKCBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0cnl7CisgICAgICAgICAgICAgICAgICAgICAgICBTZWN1cml0eVV0aWwuZG9Bc1ByaXZpbGVnZSgiZGVzdHJveSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIpOyAgCisgICAgICAgICAgICAgICAgICAgICAgICBTZWN1cml0eVV0aWwucmVtb3ZlKGZpbHRlcik7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2goamF2YS5sYW5nLkV4Y2VwdGlvbiBleCl7ICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJBcHBsaWNhdGlvbkZpbHRlckNvbmZpZy5kb0FzUHJpdmlsZWdlIiwgZXgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsgCisgICAgICAgICAgICAgICAgICAgIGZpbHRlci5kZXN0cm95KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhpcy5maWx0ZXIgPSBudWxsOworCisgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgIC8vIEFsbG9jYXRlIGEgbmV3IGZpbHRlciBpbnN0YW5jZQorICAgICAgICAgICAgRmlsdGVyIGZpbHRlciA9IGdldEZpbHRlcigpOworCisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJpdmF0ZSBNZXRob2RzCisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NvcmUvQXBwbGljYXRpb25GaWx0ZXJGYWN0b3J5LmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29yZS9BcHBsaWNhdGlvbkZpbHRlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGFjZTg0Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NvcmUvQXBwbGljYXRpb25GaWx0ZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwzMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZTsKKworCitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuR2xvYmFsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLldyYXBwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuUmVxdWVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5GaWx0ZXJNYXA7CisKKy8qKgorICogRmFjdG9yeSBmb3IgdGhlIGNyZWF0aW9uIGFuZCBjYWNoaW5nIG9mIEZpbHRlcnMgYW5kIGNyZWF0aW9uZyAKKyAqIG9mIEZpbHRlciBDaGFpbnMuCisgKgorICogQGF1dGhvciBHcmVnIE11cnJheQorICogQGF1dGhvciBSZW15IE1hdWNoZXJhdAorICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjAKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgQXBwbGljYXRpb25GaWx0ZXJGYWN0b3J5IHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RhbnRzCisKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SID0gMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEludGVnZXIgRVJST1JfSU5URUdFUiA9IG5ldyBJbnRlZ2VyKEVSUk9SKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JXQVJEID0gMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEludGVnZXIgRk9SV0FSRF9JTlRFR0VSID0gbmV3IEludGVnZXIoRk9SV0FSRCk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5DTFVERSA9IDQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIElOQ0xVREVfSU5URUdFUiA9IG5ldyBJbnRlZ2VyKElOQ0xVREUpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFUVVFU1QgPSA4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSW50ZWdlciBSRVFVRVNUX0lOVEVHRVIgPSBuZXcgSW50ZWdlcihSRVFVRVNUKTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU1BBVENIRVJfVFlQRV9BVFRSID0gCisgICAgICAgIEdsb2JhbHMuRElTUEFUQ0hFUl9UWVBFX0FUVFI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTUEFUQ0hFUl9SRVFVRVNUX1BBVEhfQVRUUiA9IAorICAgICAgICBHbG9iYWxzLkRJU1BBVENIRVJfUkVRVUVTVF9QQVRIX0FUVFI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZWN1cml0eU1hbmFnZXIgc2VjdXJpdHlNYW5hZ2VyID0gCisgICAgICAgIFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKTsKKworICAgIHByaXZhdGUgc3RhdGljIEFwcGxpY2F0aW9uRmlsdGVyRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDs7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvKgorICAgICAqIFByZXZlbnQgaW5zdGFuY2lhdGlvbiBvdXRzaWRlIG9mIHRoZSBnZXRJbnN0YW5jZU1ldGhvZCgpLgorICAgICAqLworICAgIHByaXZhdGUgQXBwbGljYXRpb25GaWx0ZXJGYWN0b3J5KCkgeworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZnFjdG9yeSBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEFwcGxpY2F0aW9uRmlsdGVyRmFjdG9yeSBnZXRJbnN0YW5jZSgpIHsKKyAgICAgICAgaWYgKGZhY3RvcnkgPT0gbnVsbCkgeworICAgICAgICAgICAgZmFjdG9yeSA9IG5ldyBBcHBsaWNhdGlvbkZpbHRlckZhY3RvcnkoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFjdG9yeTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhbmQgcmV0dXJuIGEgRmlsdGVyQ2hhaW4gaW1wbGVtZW50YXRpb24gdGhhdCB3aWxsIHdyYXAgdGhlCisgICAgICogZXhlY3V0aW9uIG9mIHRoZSBzcGVjaWZpZWQgc2VydmxldCBpbnN0YW5jZS4gIElmIHdlIHNob3VsZCBub3QgZXhlY3V0ZQorICAgICAqIGEgZmlsdGVyIGNoYWluIGF0IGFsbCwgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSBzZXJ2bGV0IFRoZSBzZXJ2bGV0IGluc3RhbmNlIHRvIGJlIHdyYXBwZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgQXBwbGljYXRpb25GaWx0ZXJDaGFpbiBjcmVhdGVGaWx0ZXJDaGFpbgorICAgICAgICAoU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgV3JhcHBlciB3cmFwcGVyLCBTZXJ2bGV0IHNlcnZsZXQpIHsKKworICAgICAgICAvLyBnZXQgdGhlIGRpc3BhdGNoZXIgdHlwZQorICAgICAgICBpbnQgZGlzcGF0Y2hlciA9IC0xOyAKKyAgICAgICAgaWYgKHJlcXVlc3QuZ2V0QXR0cmlidXRlKERJU1BBVENIRVJfVFlQRV9BVFRSKSAhPSBudWxsKSB7CisgICAgICAgICAgICBJbnRlZ2VyIGRpc3BhdGNoZXJJbnQgPSAKKyAgICAgICAgICAgICAgICAoSW50ZWdlcikgcmVxdWVzdC5nZXRBdHRyaWJ1dGUoRElTUEFUQ0hFUl9UWVBFX0FUVFIpOworICAgICAgICAgICAgZGlzcGF0Y2hlciA9IGRpc3BhdGNoZXJJbnQuaW50VmFsdWUoKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgcmVxdWVzdFBhdGggPSBudWxsOworICAgICAgICBPYmplY3QgYXR0cmlidXRlID0gcmVxdWVzdC5nZXRBdHRyaWJ1dGUoRElTUEFUQ0hFUl9SRVFVRVNUX1BBVEhfQVRUUik7CisgICAgICAgIAorICAgICAgICBpZiAoYXR0cmlidXRlICE9IG51bGwpeworICAgICAgICAgICAgcmVxdWVzdFBhdGggPSBhdHRyaWJ1dGUudG9TdHJpbmcoKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IGhyZXEgPSBudWxsOworICAgICAgICBpZiAocmVxdWVzdCBpbnN0YW5jZW9mIEh0dHBTZXJ2bGV0UmVxdWVzdCkgCisgICAgICAgICAgICBocmVxID0gKEh0dHBTZXJ2bGV0UmVxdWVzdClyZXF1ZXN0OworICAgICAgICAvLyBJZiB0aGVyZSBpcyBubyBzZXJ2bGV0IHRvIGV4ZWN1dGUsIHJldHVybiBudWxsCisgICAgICAgIGlmIChzZXJ2bGV0ID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworCisgICAgICAgIC8vIENyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBhIGZpbHRlciBjaGFpbiBvYmplY3QKKyAgICAgICAgQXBwbGljYXRpb25GaWx0ZXJDaGFpbiBmaWx0ZXJDaGFpbiA9IG51bGw7CisgICAgICAgIGlmICgoc2VjdXJpdHlNYW5hZ2VyID09IG51bGwpICYmIChyZXF1ZXN0IGluc3RhbmNlb2YgUmVxdWVzdCkpIHsKKyAgICAgICAgICAgIFJlcXVlc3QgcmVxID0gKFJlcXVlc3QpIHJlcXVlc3Q7CisgICAgICAgICAgICBmaWx0ZXJDaGFpbiA9IChBcHBsaWNhdGlvbkZpbHRlckNoYWluKSByZXEuZ2V0RmlsdGVyQ2hhaW4oKTsKKyAgICAgICAgICAgIGlmIChmaWx0ZXJDaGFpbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgZmlsdGVyQ2hhaW4gPSBuZXcgQXBwbGljYXRpb25GaWx0ZXJDaGFpbigpOworICAgICAgICAgICAgICAgIHJlcS5zZXRGaWx0ZXJDaGFpbihmaWx0ZXJDaGFpbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBTZWN1cml0eTogRG8gbm90IHJlY3ljbGUKKyAgICAgICAgICAgIGZpbHRlckNoYWluID0gbmV3IEFwcGxpY2F0aW9uRmlsdGVyQ2hhaW4oKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbHRlckNoYWluLnNldFNlcnZsZXQoc2VydmxldCk7CisKKyAgICAgICAgZmlsdGVyQ2hhaW4uc2V0U3VwcG9ydAorICAgICAgICAgICAgKCgoU3RhbmRhcmRXcmFwcGVyKXdyYXBwZXIpLmdldEluc3RhbmNlU3VwcG9ydCgpKTsKKworICAgICAgICAvLyBBY3F1aXJlIHRoZSBmaWx0ZXIgbWFwcGluZ3MgZm9yIHRoaXMgQ29udGV4dAorICAgICAgICBTdGFuZGFyZENvbnRleHQgY29udGV4dCA9IChTdGFuZGFyZENvbnRleHQpIHdyYXBwZXIuZ2V0UGFyZW50KCk7CisgICAgICAgIEZpbHRlck1hcCBmaWx0ZXJNYXBzW10gPSBjb250ZXh0LmZpbmRGaWx0ZXJNYXBzKCk7CisKKyAgICAgICAgLy8gSWYgdGhlcmUgYXJlIG5vIGZpbHRlciBtYXBwaW5ncywgd2UgYXJlIGRvbmUKKyAgICAgICAgaWYgKChmaWx0ZXJNYXBzID09IG51bGwpIHx8IChmaWx0ZXJNYXBzLmxlbmd0aCA9PSAwKSkKKyAgICAgICAgICAgIHJldHVybiAoZmlsdGVyQ2hhaW4pOworCisgICAgICAgIC8vIEFjcXVpcmUgdGhlIGluZm9ybWF0aW9uIHdlIHdpbGwgbmVlZCB0byBtYXRjaCBmaWx0ZXIgbWFwcGluZ3MKKyAgICAgICAgU3RyaW5nIHNlcnZsZXROYW1lID0gd3JhcHBlci5nZXROYW1lKCk7CisKKyAgICAgICAgaW50IG4gPSAwOworCisgICAgICAgIC8vIEFkZCB0aGUgcmVsZXZhbnQgcGF0aC1tYXBwZWQgZmlsdGVycyB0byB0aGlzIGZpbHRlciBjaGFpbgorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbHRlck1hcHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmICghbWF0Y2hEaXNwYXRjaGVyKGZpbHRlck1hcHNbaV0gLGRpc3BhdGNoZXIpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIW1hdGNoRmlsdGVyc1VSTChmaWx0ZXJNYXBzW2ldLCByZXF1ZXN0UGF0aCkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBBcHBsaWNhdGlvbkZpbHRlckNvbmZpZyBmaWx0ZXJDb25maWcgPSAoQXBwbGljYXRpb25GaWx0ZXJDb25maWcpCisgICAgICAgICAgICAgICAgY29udGV4dC5maW5kRmlsdGVyQ29uZmlnKGZpbHRlck1hcHNbaV0uZ2V0RmlsdGVyTmFtZSgpKTsKKyAgICAgICAgICAgIGlmIChmaWx0ZXJDb25maWcgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIDsgICAgICAgLy8gRklYTUUgLSBsb2cgY29uZmlndXJhdGlvbiBwcm9ibGVtCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaWx0ZXJDaGFpbi5hZGRGaWx0ZXIoZmlsdGVyQ29uZmlnKTsKKyAgICAgICAgICAgIG4rKzsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEFkZCBmaWx0ZXJzIHRoYXQgbWF0Y2ggb24gc2VydmxldCBuYW1lIHNlY29uZAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbHRlck1hcHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmICghbWF0Y2hEaXNwYXRjaGVyKGZpbHRlck1hcHNbaV0gLGRpc3BhdGNoZXIpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIW1hdGNoRmlsdGVyc1NlcnZsZXQoZmlsdGVyTWFwc1tpXSwgc2VydmxldE5hbWUpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgQXBwbGljYXRpb25GaWx0ZXJDb25maWcgZmlsdGVyQ29uZmlnID0gKEFwcGxpY2F0aW9uRmlsdGVyQ29uZmlnKQorICAgICAgICAgICAgICAgIGNvbnRleHQuZmluZEZpbHRlckNvbmZpZyhmaWx0ZXJNYXBzW2ldLmdldEZpbHRlck5hbWUoKSk7CisgICAgICAgICAgICBpZiAoZmlsdGVyQ29uZmlnID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICA7ICAgICAgIC8vIEZJWE1FIC0gbG9nIGNvbmZpZ3VyYXRpb24gcHJvYmxlbQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmlsdGVyQ2hhaW4uYWRkRmlsdGVyKGZpbHRlckNvbmZpZyk7CisgICAgICAgICAgICBuKys7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXR1cm4gdGhlIGNvbXBsZXRlZCBmaWx0ZXIgY2hhaW4KKyAgICAgICAgcmV0dXJuIChmaWx0ZXJDaGFpbik7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByaXZhdGUgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNvbnRleHQtcmVsYXRpdmUgcmVxdWVzdCBwYXRoCisgICAgICogbWF0Y2hlcyB0aGUgcmVxdWlyZW1lbnRzIG9mIHRoZSBzcGVjaWZpZWQgZmlsdGVyIG1hcHBpbmc7CisgICAgICogb3RoZXJ3aXNlLCByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsdGVyTWFwIEZpbHRlciBtYXBwaW5nIGJlaW5nIGNoZWNrZWQKKyAgICAgKiBAcGFyYW0gcmVxdWVzdFBhdGggQ29udGV4dC1yZWxhdGl2ZSByZXF1ZXN0IHBhdGggb2YgdGhpcyByZXF1ZXN0CisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIG1hdGNoRmlsdGVyc1VSTChGaWx0ZXJNYXAgZmlsdGVyTWFwLCBTdHJpbmcgcmVxdWVzdFBhdGgpIHsKKworICAgICAgICBpZiAocmVxdWVzdFBhdGggPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAoZmFsc2UpOworCisgICAgICAgIC8vIE1hdGNoIG9uIGNvbnRleHQgcmVsYXRpdmUgcmVxdWVzdCBwYXRoCisgICAgICAgIFN0cmluZyB0ZXN0UGF0aCA9IGZpbHRlck1hcC5nZXRVUkxQYXR0ZXJuKCk7CisgICAgICAgIGlmICh0ZXN0UGF0aCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChmYWxzZSk7CisKKyAgICAgICAgLy8gQ2FzZSAxIC0gRXhhY3QgTWF0Y2gKKyAgICAgICAgaWYgKHRlc3RQYXRoLmVxdWFscyhyZXF1ZXN0UGF0aCkpCisgICAgICAgICAgICByZXR1cm4gKHRydWUpOworCisgICAgICAgIC8vIENhc2UgMiAtIFBhdGggTWF0Y2ggKCIvLi4uLyoiKQorICAgICAgICBpZiAodGVzdFBhdGguZXF1YWxzKCIvKiIpKQorICAgICAgICAgICAgcmV0dXJuICh0cnVlKTsKKyAgICAgICAgaWYgKHRlc3RQYXRoLmVuZHNXaXRoKCIvKiIpKSB7CisgICAgICAgICAgICBpZiAodGVzdFBhdGgucmVnaW9uTWF0Y2hlcygwLCByZXF1ZXN0UGF0aCwgMCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0UGF0aC5sZW5ndGgoKSAtIDIpKSB7CisgICAgICAgICAgICAgICAgaWYgKHJlcXVlc3RQYXRoLmxlbmd0aCgpID09ICh0ZXN0UGF0aC5sZW5ndGgoKSAtIDIpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAodHJ1ZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgnLycgPT0gcmVxdWVzdFBhdGguY2hhckF0KHRlc3RQYXRoLmxlbmd0aCgpIC0gMikpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh0cnVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gKGZhbHNlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENhc2UgMyAtIEV4dGVuc2lvbiBNYXRjaAorICAgICAgICBpZiAodGVzdFBhdGguc3RhcnRzV2l0aCgiKi4iKSkgeworICAgICAgICAgICAgaW50IHNsYXNoID0gcmVxdWVzdFBhdGgubGFzdEluZGV4T2YoJy8nKTsKKyAgICAgICAgICAgIGludCBwZXJpb2QgPSByZXF1ZXN0UGF0aC5sYXN0SW5kZXhPZignLicpOworICAgICAgICAgICAgaWYgKChzbGFzaCA+PSAwKSAmJiAocGVyaW9kID4gc2xhc2gpIAorICAgICAgICAgICAgICAgICYmIChwZXJpb2QgIT0gcmVxdWVzdFBhdGgubGVuZ3RoKCkgLSAxKQorICAgICAgICAgICAgICAgICYmICgocmVxdWVzdFBhdGgubGVuZ3RoKCkgLSBwZXJpb2QpIAorICAgICAgICAgICAgICAgICAgICA9PSAodGVzdFBhdGgubGVuZ3RoKCkgLSAxKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKHRlc3RQYXRoLnJlZ2lvbk1hdGNoZXMoMiwgcmVxdWVzdFBhdGgsIHBlcmlvZCArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RQYXRoLmxlbmd0aCgpIC0gMikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gQ2FzZSA0IC0gIkRlZmF1bHQiIE1hdGNoCisgICAgICAgIHJldHVybiAoZmFsc2UpOyAvLyBOT1RFIC0gTm90IHJlbGV2YW50IGZvciBzZWxlY3RpbmcgZmlsdGVycworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCBzZXJ2bGV0IG5hbWUgbWF0Y2hlcworICAgICAqIHRoZSByZXF1aXJlbWVudHMgb2YgdGhlIHNwZWNpZmllZCBmaWx0ZXIgbWFwcGluZzsgb3RoZXJ3aXNlCisgICAgICogcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWx0ZXJNYXAgRmlsdGVyIG1hcHBpbmcgYmVpbmcgY2hlY2tlZAorICAgICAqIEBwYXJhbSBzZXJ2bGV0TmFtZSBTZXJ2bGV0IG5hbWUgYmVpbmcgY2hlY2tlZAorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBtYXRjaEZpbHRlcnNTZXJ2bGV0KEZpbHRlck1hcCBmaWx0ZXJNYXAsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZXJ2bGV0TmFtZSkgeworCisgICAgICAgIGlmIChzZXJ2bGV0TmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gKGZhbHNlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChzZXJ2bGV0TmFtZS5lcXVhbHMoZmlsdGVyTWFwLmdldFNlcnZsZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICh0cnVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvbnZpZW5pZW5jZSBtZXRob2Qgd2hpY2ggcmV0dXJucyB0cnVlIGlmICB0aGUgZGlzcGF0Y2hlciB0eXBlCisgICAgICogbWF0Y2hlcyB0aGUgZGlzcGF0Y2hlciB0eXBlcyBzcGVjaWZpZWQgaW4gdGhlIEZpbHRlck1hcAorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBtYXRjaERpc3BhdGNoZXIoRmlsdGVyTWFwIGZpbHRlck1hcCwgaW50IGRpc3BhdGNoZXIpIHsKKyAgICAgICAgc3dpdGNoIChkaXNwYXRjaGVyKSB7CisgICAgICAgICAgICBjYXNlIEZPUldBUkQgOiB7CisgICAgICAgICAgICAgICAgaWYgKGZpbHRlck1hcC5nZXREaXNwYXRjaGVyTWFwcGluZygpID09IEZpbHRlck1hcC5GT1JXQVJEIHx8CisgICAgICAgICAgICAgICAgICAgIGZpbHRlck1hcC5nZXREaXNwYXRjaGVyTWFwcGluZygpID09IEZpbHRlck1hcC5GT1JXQVJEX0VSUk9SIHx8CisgICAgICAgICAgICAgICAgICAgIGZpbHRlck1hcC5nZXREaXNwYXRjaGVyTWFwcGluZygpID09IEZpbHRlck1hcC5JTkNMVURFX0ZPUldBUkQgfHwKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyTWFwLmdldERpc3BhdGNoZXJNYXBwaW5nKCkgPT0gRmlsdGVyTWFwLklOQ0xVREVfRVJST1JfRk9SV0FSRCB8fAorICAgICAgICAgICAgICAgICAgICBmaWx0ZXJNYXAuZ2V0RGlzcGF0Y2hlck1hcHBpbmcoKSA9PSBGaWx0ZXJNYXAuUkVRVUVTVF9GT1JXQVJEIHx8CisgICAgICAgICAgICAgICAgICAgIGZpbHRlck1hcC5nZXREaXNwYXRjaGVyTWFwcGluZygpID09IEZpbHRlck1hcC5SRVFVRVNUX0VSUk9SX0ZPUldBUkQgfHwKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyTWFwLmdldERpc3BhdGNoZXJNYXBwaW5nKCkgPT0gRmlsdGVyTWFwLlJFUVVFU1RfRVJST1JfRk9SV0FSRF9JTkNMVURFIHx8CisgICAgICAgICAgICAgICAgICAgIGZpbHRlck1hcC5nZXREaXNwYXRjaGVyTWFwcGluZygpID09IEZpbHRlck1hcC5SRVFVRVNUX0ZPUldBUkRfSU5DTFVERSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBJTkNMVURFIDogeworICAgICAgICAgICAgICAgIGlmIChmaWx0ZXJNYXAuZ2V0RGlzcGF0Y2hlck1hcHBpbmcoKSA9PSBGaWx0ZXJNYXAuSU5DTFVERSB8fAorICAgICAgICAgICAgICAgICAgICBmaWx0ZXJNYXAuZ2V0RGlzcGF0Y2hlck1hcHBpbmcoKSA9PSBGaWx0ZXJNYXAuSU5DTFVERV9FUlJPUiB8fAorICAgICAgICAgICAgICAgICAgICBmaWx0ZXJNYXAuZ2V0RGlzcGF0Y2hlck1hcHBpbmcoKSA9PSBGaWx0ZXJNYXAuSU5DTFVERV9GT1JXQVJEIHx8CisgICAgICAgICAgICAgICAgICAgIGZpbHRlck1hcC5nZXREaXNwYXRjaGVyTWFwcGluZygpID09IEZpbHRlck1hcC5JTkNMVURFX0VSUk9SX0ZPUldBUkQgfHwKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyTWFwLmdldERpc3BhdGNoZXJNYXBwaW5nKCkgPT0gRmlsdGVyTWFwLlJFUVVFU1RfSU5DTFVERSB8fAorICAgICAgICAgICAgICAgICAgICBmaWx0ZXJNYXAuZ2V0RGlzcGF0Y2hlck1hcHBpbmcoKSA9PSBGaWx0ZXJNYXAuUkVRVUVTVF9FUlJPUl9JTkNMVURFIHx8CisgICAgICAgICAgICAgICAgICAgIGZpbHRlck1hcC5nZXREaXNwYXRjaGVyTWFwcGluZygpID09IEZpbHRlck1hcC5SRVFVRVNUX0VSUk9SX0ZPUldBUkRfSU5DTFVERSB8fAorICAgICAgICAgICAgICAgICAgICBmaWx0ZXJNYXAuZ2V0RGlzcGF0Y2hlck1hcHBpbmcoKSA9PSBGaWx0ZXJNYXAuUkVRVUVTVF9GT1JXQVJEX0lOQ0xVREUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgUkVRVUVTVCA6IHsKKyAgICAgICAgICAgICAgICBpZiAoZmlsdGVyTWFwLmdldERpc3BhdGNoZXJNYXBwaW5nKCkgPT0gRmlsdGVyTWFwLlJFUVVFU1QgfHwKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyTWFwLmdldERpc3BhdGNoZXJNYXBwaW5nKCkgPT0gRmlsdGVyTWFwLlJFUVVFU1RfRVJST1IgfHwKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyTWFwLmdldERpc3BhdGNoZXJNYXBwaW5nKCkgPT0gRmlsdGVyTWFwLlJFUVVFU1RfSU5DTFVERSB8fAorICAgICAgICAgICAgICAgICAgICBmaWx0ZXJNYXAuZ2V0RGlzcGF0Y2hlck1hcHBpbmcoKSA9PSBGaWx0ZXJNYXAuUkVRVUVTVF9FUlJPUl9JTkNMVURFIHx8CisgICAgICAgICAgICAgICAgICAgIGZpbHRlck1hcC5nZXREaXNwYXRjaGVyTWFwcGluZygpID09IEZpbHRlck1hcC5SRVFVRVNUX0ZPUldBUkQgfHwKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyTWFwLmdldERpc3BhdGNoZXJNYXBwaW5nKCkgPT0gRmlsdGVyTWFwLlJFUVVFU1RfRVJST1JfRk9SV0FSRCB8fAorICAgICAgICAgICAgICAgICAgICBmaWx0ZXJNYXAuZ2V0RGlzcGF0Y2hlck1hcHBpbmcoKSA9PSBGaWx0ZXJNYXAuUkVRVUVTVF9GT1JXQVJEX0lOQ0xVREUgfHwKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyTWFwLmdldERpc3BhdGNoZXJNYXBwaW5nKCkgPT0gRmlsdGVyTWFwLlJFUVVFU1RfRVJST1JfRk9SV0FSRF9JTkNMVURFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEVSUk9SIDogeworICAgICAgICAgICAgICAgIGlmIChmaWx0ZXJNYXAuZ2V0RGlzcGF0Y2hlck1hcHBpbmcoKSA9PSBGaWx0ZXJNYXAuRVJST1IgfHwKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyTWFwLmdldERpc3BhdGNoZXJNYXBwaW5nKCkgPT0gRmlsdGVyTWFwLkZPUldBUkRfRVJST1IgfHwgCisgICAgICAgICAgICAgICAgICAgIGZpbHRlck1hcC5nZXREaXNwYXRjaGVyTWFwcGluZygpID09IEZpbHRlck1hcC5JTkNMVURFX0VSUk9SIHx8IAorICAgICAgICAgICAgICAgICAgICBmaWx0ZXJNYXAuZ2V0RGlzcGF0Y2hlck1hcHBpbmcoKSA9PSBGaWx0ZXJNYXAuSU5DTFVERV9FUlJPUl9GT1JXQVJEIHx8IAorICAgICAgICAgICAgICAgICAgICBmaWx0ZXJNYXAuZ2V0RGlzcGF0Y2hlck1hcHBpbmcoKSA9PSBGaWx0ZXJNYXAuUkVRVUVTVF9FUlJPUiB8fAorICAgICAgICAgICAgICAgICAgICBmaWx0ZXJNYXAuZ2V0RGlzcGF0Y2hlck1hcHBpbmcoKSA9PSBGaWx0ZXJNYXAuUkVRVUVTVF9FUlJPUl9GT1JXQVJEIHx8CisgICAgICAgICAgICAgICAgICAgIGZpbHRlck1hcC5nZXREaXNwYXRjaGVyTWFwcGluZygpID09IEZpbHRlck1hcC5SRVFVRVNUX0VSUk9SX0ZPUldBUkRfSU5DTFVERSB8fAorICAgICAgICAgICAgICAgICAgICBmaWx0ZXJNYXAuZ2V0RGlzcGF0Y2hlck1hcHBpbmcoKSA9PSBGaWx0ZXJNYXAuUkVRVUVTVF9FUlJPUl9JTkNMVURFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29yZS9BcHBsaWNhdGlvbkh0dHBSZXF1ZXN0LmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29yZS9BcHBsaWNhdGlvbkh0dHBSZXF1ZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRjNmVmMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb3JlL0FwcGxpY2F0aW9uSHR0cFJlcXVlc3QuamF2YQpAQCAtMCwwICsxLDg4NyBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlOworCisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOworCitpbXBvcnQgamF2YXguc2VydmxldC5SZXF1ZXN0RGlzcGF0Y2hlcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkdsb2JhbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5TZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5FbnVtZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5SZXF1ZXN0VXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuU3RyaW5nTWFuYWdlcjsKKworCisvKioKKyAqIFdyYXBwZXIgYXJvdW5kIGEgPGNvZGU+amF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDwvY29kZT4KKyAqIHRoYXQgdHJhbnNmb3JtcyBhbiBhcHBsaWNhdGlvbiByZXF1ZXN0IG9iamVjdCAod2hpY2ggbWlnaHQgYmUgdGhlIG9yaWdpbmFsCisgKiBvbmUgcGFzc2VkIHRvIGEgc2VydmxldCwgb3IgbWlnaHQgYmUgYmFzZWQgb24gdGhlIDIuMworICogPGNvZGU+amF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXI8L2NvZGU+IGNsYXNzKQorICogYmFjayBpbnRvIGFuIGludGVybmFsIDxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuSHR0cFJlcXVlc3Q8L2NvZGU+LgorICogPHA+CisgKiA8c3Ryb25nPldBUk5JTkc8L3N0cm9uZz46ICBEdWUgdG8gSmF2YSdzIGxhY2sgb2Ygc3VwcG9ydCBmb3IgbXVsdGlwbGUKKyAqIGluaGVyaXRhbmNlLCBhbGwgb2YgdGhlIGxvZ2ljIGluIDxjb2RlPkFwcGxpY2F0aW9uUmVxdWVzdDwvY29kZT4gaXMKKyAqIGR1cGxpY2F0ZWQgaW4gPGNvZGU+QXBwbGljYXRpb25IdHRwUmVxdWVzdDwvY29kZT4uICBNYWtlIHN1cmUgdGhhdCB5b3UKKyAqIGtlZXAgdGhlc2UgdHdvIGNsYXNzZXMgaW4gc3luY2hyb25pemF0aW9uIHdoZW4gbWFraW5nIGNoYW5nZXMhCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAYXV0aG9yIFJlbXkgTWF1Y2hlcmF0CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK2NsYXNzIEFwcGxpY2F0aW9uSHR0cFJlcXVlc3QgZXh0ZW5kcyBIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTdGF0aWMgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBzZXQgb2YgYXR0cmlidXRlIG5hbWVzIHRoYXQgYXJlIHNwZWNpYWwgZm9yIHJlcXVlc3QgZGlzcGF0Y2hlcnMuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgc3BlY2lhbHNbXSA9CisgICAgeyBHbG9iYWxzLklOQ0xVREVfUkVRVUVTVF9VUklfQVRUUiwgR2xvYmFscy5JTkNMVURFX0NPTlRFWFRfUEFUSF9BVFRSLAorICAgICAgR2xvYmFscy5JTkNMVURFX1NFUlZMRVRfUEFUSF9BVFRSLCBHbG9iYWxzLklOQ0xVREVfUEFUSF9JTkZPX0FUVFIsCisgICAgICBHbG9iYWxzLklOQ0xVREVfUVVFUllfU1RSSU5HX0FUVFIsIEdsb2JhbHMuRk9SV0FSRF9SRVFVRVNUX1VSSV9BVFRSLCAKKyAgICAgIEdsb2JhbHMuRk9SV0FSRF9DT05URVhUX1BBVEhfQVRUUiwgR2xvYmFscy5GT1JXQVJEX1NFUlZMRVRfUEFUSF9BVFRSLCAKKyAgICAgIEdsb2JhbHMuRk9SV0FSRF9QQVRIX0lORk9fQVRUUiwgR2xvYmFscy5GT1JXQVJEX1FVRVJZX1NUUklOR19BVFRSIH07CisKKworICAgIC8qKgorICAgICAqIFRoZSBzdHJpbmcgbWFuYWdlciBmb3IgdGhpcyBwYWNrYWdlLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nTWFuYWdlciBzbSA9CisgICAgICAgIFN0cmluZ01hbmFnZXIuZ2V0TWFuYWdlcihDb25zdGFudHMuUGFja2FnZSk7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgd3JhcHBlZCByZXF1ZXN0IGFyb3VuZCB0aGUgc3BlY2lmaWVkIHNlcnZsZXQgcmVxdWVzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3QgYmVpbmcgd3JhcHBlZAorICAgICAqLworICAgIHB1YmxpYyBBcHBsaWNhdGlvbkh0dHBSZXF1ZXN0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBjcm9zc0NvbnRleHQpIHsKKworICAgICAgICBzdXBlcihyZXF1ZXN0KTsKKyAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsKKyAgICAgICAgdGhpcy5jcm9zc0NvbnRleHQgPSBjcm9zc0NvbnRleHQ7CisgICAgICAgIHNldFJlcXVlc3QocmVxdWVzdCk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgY29udGV4dCBmb3IgdGhpcyByZXF1ZXN0LgorICAgICAqLworICAgIHByb3RlY3RlZCBDb250ZXh0IGNvbnRleHQgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgY29udGV4dCBwYXRoIGZvciB0aGlzIHJlcXVlc3QuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBjb250ZXh0UGF0aCA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIElmIHRoaXMgcmVxdWVzdCBpcyBjcm9zcyBjb250ZXh0LCBzaW5jZSB0aGlzIGNoYW5nZXMgc2Vzc2lvbiBhY2Nlc3NzCisgICAgICogYmVoYXZpb3IuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gY3Jvc3NDb250ZXh0ID0gZmFsc2U7CisKKworICAgIC8qKgorICAgICAqIFRoZSBjdXJyZW50IGRpc3BhdGNoZXIgdHlwZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgT2JqZWN0IGRpc3BhdGNoZXJUeXBlID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogRGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBpbmZvID0KKyAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5BcHBsaWNhdGlvbkh0dHBSZXF1ZXN0LzEuMCI7CisKKworICAgIC8qKgorICAgICAqIFRoZSByZXF1ZXN0IHBhcmFtZXRlcnMgZm9yIHRoaXMgcmVxdWVzdC4gIFRoaXMgaXMgaW5pdGlhbGl6ZWQgZnJvbSB0aGUKKyAgICAgKiB3cmFwcGVkIHJlcXVlc3QsIGJ1dCB1cGRhdGVzIGFyZSBhbGxvd2VkLgorICAgICAqLworICAgIHByb3RlY3RlZCBNYXAgcGFyYW1ldGVycyA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIEhhdmUgdGhlIHBhcmFtZXRlcnMgZm9yIHRoaXMgcmVxdWVzdCBhbHJlYWR5IGJlZW4gcGFyc2VkPworICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBwYXJzZWRQYXJhbXMgPSBmYWxzZTsKKworCisgICAgLyoqCisgICAgICogVGhlIHBhdGggaW5mb3JtYXRpb24gZm9yIHRoaXMgcmVxdWVzdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHBhdGhJbmZvID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIHF1ZXJ5IHBhcmFtZXRlcnMgZm9yIHRoZSBjdXJyZW50IHJlcXVlc3QuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcXVlcnlQYXJhbVN0cmluZyA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBxdWVyeSBzdHJpbmcgZm9yIHRoaXMgcmVxdWVzdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHF1ZXJ5U3RyaW5nID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIGN1cnJlbnQgcmVxdWVzdCBkaXNwYXRjaGVyIHBhdGguCisgICAgICovCisgICAgcHJvdGVjdGVkIE9iamVjdCByZXF1ZXN0RGlzcGF0Y2hlclBhdGggPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgcmVxdWVzdCBVUkkgZm9yIHRoaXMgcmVxdWVzdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHJlcXVlc3RVUkkgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc2VydmxldCBwYXRoIGZvciB0aGlzIHJlcXVlc3QuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBzZXJ2bGV0UGF0aCA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBjdXJyZW50bHkgYWN0aXZlIHNlc3Npb24gZm9yIHRoaXMgcmVxdWVzdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU2Vzc2lvbiBzZXNzaW9uID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogU3BlY2lhbCBhdHRyaWJ1dGVzLgorICAgICAqLworICAgIHByb3RlY3RlZCBPYmplY3RbXSBzcGVjaWFsQXR0cmlidXRlcyA9IG5ldyBPYmplY3Rbc3BlY2lhbHMubGVuZ3RoXTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTZXJ2bGV0UmVxdWVzdCBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIE92ZXJyaWRlIHRoZSA8Y29kZT5nZXRBdHRyaWJ1dGUoKTwvY29kZT4gbWV0aG9kIG9mIHRoZSB3cmFwcGVkIHJlcXVlc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdG8gcmV0cmlldmUKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSkgeworCisgICAgICAgIGlmIChuYW1lLmVxdWFscyhHbG9iYWxzLkRJU1BBVENIRVJfVFlQRV9BVFRSKSkgeworICAgICAgICAgICAgcmV0dXJuIGRpc3BhdGNoZXJUeXBlOworICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKEdsb2JhbHMuRElTUEFUQ0hFUl9SRVFVRVNUX1BBVEhfQVRUUikpIHsKKyAgICAgICAgICAgIGlmICggcmVxdWVzdERpc3BhdGNoZXJQYXRoICE9IG51bGwgKXsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVxdWVzdERpc3BhdGNoZXJQYXRoLnRvU3RyaW5nKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOyAgIAorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaW50IHBvcyA9IGdldFNwZWNpYWwobmFtZSk7CisgICAgICAgIGlmIChwb3MgPT0gLTEpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRSZXF1ZXN0KCkuZ2V0QXR0cmlidXRlKG5hbWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKChzcGVjaWFsQXR0cmlidXRlc1twb3NdID09IG51bGwpIAorICAgICAgICAgICAgICAgICYmIChzcGVjaWFsQXR0cmlidXRlc1s1XSA9PSBudWxsKSAmJiAocG9zID49IDUpKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgaXQncyBhIGZvcndhcmQgc3BlY2lhbCBhdHRyaWJ1dGUsIGFuZCBudWxsLCBpdCBtZWFucyB0aGlzCisgICAgICAgICAgICAgICAgLy8gaXMgYW4gaW5jbHVkZSwgc28gd2UgY2hlY2sgdGhlIHdyYXBwZWQgcmVxdWVzdCBzaW5jZSAKKyAgICAgICAgICAgICAgICAvLyB0aGUgcmVxdWVzdCBjb3VsZCBoYXZlIGJlZW4gZm9yd2FyZGVkIGJlZm9yZSB0aGUgaW5jbHVkZQorICAgICAgICAgICAgICAgIHJldHVybiBnZXRSZXF1ZXN0KCkuZ2V0QXR0cmlidXRlKG5hbWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3BlY2lhbEF0dHJpYnV0ZXNbcG9zXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBPdmVycmlkZSB0aGUgPGNvZGU+Z2V0QXR0cmlidXRlTmFtZXMoKTwvY29kZT4gbWV0aG9kIG9mIHRoZSB3cmFwcGVkCisgICAgICogcmVxdWVzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0QXR0cmlidXRlTmFtZXMoKSB7CisgICAgICAgIHJldHVybiAobmV3IEF0dHJpYnV0ZU5hbWVzRW51bWVyYXRvcigpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIE92ZXJyaWRlIHRoZSA8Y29kZT5yZW1vdmVBdHRyaWJ1dGUoKTwvY29kZT4gbWV0aG9kIG9mIHRoZQorICAgICAqIHdyYXBwZWQgcmVxdWVzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0byByZW1vdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHsKKworICAgICAgICBpZiAoIXJlbW92ZVNwZWNpYWwobmFtZSkpCisgICAgICAgICAgICBnZXRSZXF1ZXN0KCkucmVtb3ZlQXR0cmlidXRlKG5hbWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBPdmVycmlkZSB0aGUgPGNvZGU+c2V0QXR0cmlidXRlKCk8L2NvZGU+IG1ldGhvZCBvZiB0aGUKKyAgICAgKiB3cmFwcGVkIHJlcXVlc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdG8gc2V0CisgICAgICogQHBhcmFtIHZhbHVlIFZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgdG8gc2V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsKKworICAgICAgICBpZiAobmFtZS5lcXVhbHMoR2xvYmFscy5ESVNQQVRDSEVSX1RZUEVfQVRUUikpIHsKKyAgICAgICAgICAgIGRpc3BhdGNoZXJUeXBlID0gdmFsdWU7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoR2xvYmFscy5ESVNQQVRDSEVSX1JFUVVFU1RfUEFUSF9BVFRSKSkgeworICAgICAgICAgICAgcmVxdWVzdERpc3BhdGNoZXJQYXRoID0gdmFsdWU7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXNldFNwZWNpYWwobmFtZSwgdmFsdWUpKSB7CisgICAgICAgICAgICBnZXRSZXF1ZXN0KCkuc2V0QXR0cmlidXRlKG5hbWUsIHZhbHVlKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBSZXF1ZXN0RGlzcGF0Y2hlciB0aGF0IHdyYXBzIHRoZSByZXNvdXJjZSBhdCB0aGUgc3BlY2lmaWVkCisgICAgICogcGF0aCwgd2hpY2ggbWF5IGJlIGludGVycHJldGVkIGFzIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHJlcXVlc3QgcGF0aC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXRoIFBhdGggb2YgdGhlIHJlc291cmNlIHRvIGJlIHdyYXBwZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgUmVxdWVzdERpc3BhdGNoZXIgZ2V0UmVxdWVzdERpc3BhdGNoZXIoU3RyaW5nIHBhdGgpIHsKKworICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKworICAgICAgICAvLyBJZiB0aGUgcGF0aCBpcyBhbHJlYWR5IGNvbnRleHQtcmVsYXRpdmUsIGp1c3QgcGFzcyBpdCB0aHJvdWdoCisgICAgICAgIGlmIChwYXRoID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICBlbHNlIGlmIChwYXRoLnN0YXJ0c1dpdGgoIi8iKSkKKyAgICAgICAgICAgIHJldHVybiAoY29udGV4dC5nZXRTZXJ2bGV0Q29udGV4dCgpLmdldFJlcXVlc3REaXNwYXRjaGVyKHBhdGgpKTsKKworICAgICAgICAvLyBDb252ZXJ0IGEgcmVxdWVzdC1yZWxhdGl2ZSBwYXRoIHRvIGEgY29udGV4dC1yZWxhdGl2ZSBvbmUKKyAgICAgICAgU3RyaW5nIHNlcnZsZXRQYXRoID0gCisgICAgICAgICAgICAoU3RyaW5nKSBnZXRBdHRyaWJ1dGUoR2xvYmFscy5JTkNMVURFX1NFUlZMRVRfUEFUSF9BVFRSKTsKKyAgICAgICAgaWYgKHNlcnZsZXRQYXRoID09IG51bGwpCisgICAgICAgICAgICBzZXJ2bGV0UGF0aCA9IGdldFNlcnZsZXRQYXRoKCk7CisKKyAgICAgICAgLy8gQWRkIHRoZSBwYXRoIGluZm8sIGlmIHRoZXJlIGlzIGFueQorICAgICAgICBTdHJpbmcgcGF0aEluZm8gPSBnZXRQYXRoSW5mbygpOworICAgICAgICBTdHJpbmcgcmVxdWVzdFBhdGggPSBudWxsOworCisgICAgICAgIGlmIChwYXRoSW5mbyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXF1ZXN0UGF0aCA9IHNlcnZsZXRQYXRoOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVxdWVzdFBhdGggPSBzZXJ2bGV0UGF0aCArIHBhdGhJbmZvOworICAgICAgICB9CisKKyAgICAgICAgaW50IHBvcyA9IHJlcXVlc3RQYXRoLmxhc3RJbmRleE9mKCcvJyk7CisgICAgICAgIFN0cmluZyByZWxhdGl2ZSA9IG51bGw7CisgICAgICAgIGlmIChwb3MgPj0gMCkgeworICAgICAgICAgICAgcmVsYXRpdmUgPSBSZXF1ZXN0VXRpbC5ub3JtYWxpemUKKyAgICAgICAgICAgICAgICAocmVxdWVzdFBhdGguc3Vic3RyaW5nKDAsIHBvcyArIDEpICsgcGF0aCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZWxhdGl2ZSA9IFJlcXVlc3RVdGlsLm5vcm1hbGl6ZShyZXF1ZXN0UGF0aCArIHBhdGgpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIChjb250ZXh0LmdldFNlcnZsZXRDb250ZXh0KCkuZ2V0UmVxdWVzdERpc3BhdGNoZXIocmVsYXRpdmUpKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEh0dHBTZXJ2bGV0UmVxdWVzdCBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIE92ZXJyaWRlIHRoZSA8Y29kZT5nZXRDb250ZXh0UGF0aCgpPC9jb2RlPiBtZXRob2Qgb2YgdGhlIHdyYXBwZWQKKyAgICAgKiByZXF1ZXN0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGV4dFBhdGgoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLmNvbnRleHRQYXRoKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogT3ZlcnJpZGUgdGhlIDxjb2RlPmdldFBhcmFtZXRlcigpPC9jb2RlPiBtZXRob2Qgb2YgdGhlIHdyYXBwZWQgcmVxdWVzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIHJlcXVlc3RlZCBwYXJhbWV0ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhcmFtZXRlcihTdHJpbmcgbmFtZSkgeworCisJcGFyc2VQYXJhbWV0ZXJzKCk7CisKKyAgICAgICAgT2JqZWN0IHZhbHVlID0gcGFyYW1ldGVycy5nZXQobmFtZSk7CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmdbXSkKKyAgICAgICAgICAgIHJldHVybiAoKChTdHJpbmdbXSkgdmFsdWUpWzBdKTsKKyAgICAgICAgZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpCisgICAgICAgICAgICByZXR1cm4gKChTdHJpbmcpIHZhbHVlKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuICh2YWx1ZS50b1N0cmluZygpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogT3ZlcnJpZGUgdGhlIDxjb2RlPmdldFBhcmFtZXRlck1hcCgpPC9jb2RlPiBtZXRob2Qgb2YgdGhlCisgICAgICogd3JhcHBlZCByZXF1ZXN0LgorICAgICAqLworICAgIHB1YmxpYyBNYXAgZ2V0UGFyYW1ldGVyTWFwKCkgeworCisJcGFyc2VQYXJhbWV0ZXJzKCk7CisgICAgICAgIHJldHVybiAocGFyYW1ldGVycyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIE92ZXJyaWRlIHRoZSA8Y29kZT5nZXRQYXJhbWV0ZXJOYW1lcygpPC9jb2RlPiBtZXRob2Qgb2YgdGhlCisgICAgICogd3JhcHBlZCByZXF1ZXN0LgorICAgICAqLworICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRQYXJhbWV0ZXJOYW1lcygpIHsKKworCXBhcnNlUGFyYW1ldGVycygpOworICAgICAgICByZXR1cm4gKG5ldyBFbnVtZXJhdG9yKHBhcmFtZXRlcnMua2V5U2V0KCkpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogT3ZlcnJpZGUgdGhlIDxjb2RlPmdldFBhcmFtZXRlclZhbHVlcygpPC9jb2RlPiBtZXRob2Qgb2YgdGhlCisgICAgICogd3JhcHBlZCByZXF1ZXN0LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgcmVxdWVzdGVkIHBhcmFtZXRlcgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRQYXJhbWV0ZXJWYWx1ZXMoU3RyaW5nIG5hbWUpIHsKKworCXBhcnNlUGFyYW1ldGVycygpOworICAgICAgICBPYmplY3QgdmFsdWUgPSBwYXJhbWV0ZXJzLmdldChuYW1lKTsKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKChTdHJpbmdbXSkgbnVsbCk7CisgICAgICAgIGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nW10pCisgICAgICAgICAgICByZXR1cm4gKChTdHJpbmdbXSkgdmFsdWUpOworICAgICAgICBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgeworICAgICAgICAgICAgU3RyaW5nIHZhbHVlc1tdID0gbmV3IFN0cmluZ1sxXTsKKyAgICAgICAgICAgIHZhbHVlc1swXSA9IChTdHJpbmcpIHZhbHVlOworICAgICAgICAgICAgcmV0dXJuICh2YWx1ZXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU3RyaW5nIHZhbHVlc1tdID0gbmV3IFN0cmluZ1sxXTsKKyAgICAgICAgICAgIHZhbHVlc1swXSA9IHZhbHVlLnRvU3RyaW5nKCk7CisgICAgICAgICAgICByZXR1cm4gKHZhbHVlcyk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogT3ZlcnJpZGUgdGhlIDxjb2RlPmdldFBhdGhJbmZvKCk8L2NvZGU+IG1ldGhvZCBvZiB0aGUgd3JhcHBlZCByZXF1ZXN0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aEluZm8oKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLnBhdGhJbmZvKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogT3ZlcnJpZGUgdGhlIDxjb2RlPmdldFF1ZXJ5U3RyaW5nKCk8L2NvZGU+IG1ldGhvZCBvZiB0aGUgd3JhcHBlZAorICAgICAqIHJlcXVlc3QuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRRdWVyeVN0cmluZygpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMucXVlcnlTdHJpbmcpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBPdmVycmlkZSB0aGUgPGNvZGU+Z2V0UmVxdWVzdFVSSSgpPC9jb2RlPiBtZXRob2Qgb2YgdGhlIHdyYXBwZWQKKyAgICAgKiByZXF1ZXN0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVxdWVzdFVSSSgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMucmVxdWVzdFVSSSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIE92ZXJyaWRlIHRoZSA8Y29kZT5nZXRTZXJ2bGV0UGF0aCgpPC9jb2RlPiBtZXRob2Qgb2YgdGhlIHdyYXBwZWQKKyAgICAgKiByZXF1ZXN0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmxldFBhdGgoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLnNlcnZsZXRQYXRoKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXNzaW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFJlcXVlc3QsIGNyZWF0aW5nIG9uZQorICAgICAqIGlmIG5lY2Vzc2FyeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgSHR0cFNlc3Npb24gZ2V0U2Vzc2lvbigpIHsKKyAgICAgICAgcmV0dXJuIChnZXRTZXNzaW9uKHRydWUpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2Vzc2lvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBSZXF1ZXN0LCBjcmVhdGluZyBvbmUKKyAgICAgKiBpZiBuZWNlc3NhcnkgYW5kIHJlcXVlc3RlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjcmVhdGUgQ3JlYXRlIGEgbmV3IHNlc3Npb24gaWYgb25lIGRvZXMgbm90IGV4aXN0CisgICAgICovCisgICAgcHVibGljIEh0dHBTZXNzaW9uIGdldFNlc3Npb24oYm9vbGVhbiBjcmVhdGUpIHsKKworICAgICAgICBpZiAoY3Jvc3NDb250ZXh0KSB7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIFRoZXJlIGNhbm5vdCBiZSBhIHNlc3Npb24gaWYgbm8gY29udGV4dCBoYXMgYmVlbiBhc3NpZ25lZCB5ZXQKKyAgICAgICAgICAgIGlmIChjb250ZXh0ID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKworICAgICAgICAgICAgLy8gUmV0dXJuIHRoZSBjdXJyZW50IHNlc3Npb24gaWYgaXQgZXhpc3RzIGFuZCBpcyB2YWxpZAorICAgICAgICAgICAgaWYgKHNlc3Npb24gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gKHNlc3Npb24uZ2V0U2Vzc2lvbigpKTsKKworICAgICAgICAgICAgSHR0cFNlc3Npb24gb3RoZXIgPSBzdXBlci5nZXRTZXNzaW9uKGZhbHNlKTsKKyAgICAgICAgICAgIGlmIChjcmVhdGUgJiYgKG90aGVyID09IG51bGwpKSB7CisgICAgICAgICAgICAgICAgLy8gRmlyc3QgY3JlYXRlIGEgc2Vzc2lvbiBpbiB0aGUgZmlyc3QgY29udGV4dDogdGhlIHByb2JsZW0gaXMKKyAgICAgICAgICAgICAgICAvLyB0aGF0IHRoZSB0b3AgbGV2ZWwgcmVxdWVzdCBpcyB0aGUgb25seSBvbmUgd2hpY2ggY2FuIAorICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgY29va2llIHNhZmVseQorICAgICAgICAgICAgICAgIG90aGVyID0gc3VwZXIuZ2V0U2Vzc2lvbih0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChvdGhlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgU2Vzc2lvbiBsb2NhbFNlc3Npb24gPSBudWxsOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGxvY2FsU2Vzc2lvbiA9CisgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmdldE1hbmFnZXIoKS5maW5kU2Vzc2lvbihvdGhlci5nZXRJZCgpKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobG9jYWxTZXNzaW9uID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9jYWxTZXNzaW9uID0gY29udGV4dC5nZXRNYW5hZ2VyKCkuY3JlYXRlRW1wdHlTZXNzaW9uKCk7CisgICAgICAgICAgICAgICAgICAgIGxvY2FsU2Vzc2lvbi5zZXROZXcodHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIGxvY2FsU2Vzc2lvbi5zZXRWYWxpZCh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgbG9jYWxTZXNzaW9uLnNldENyZWF0aW9uVGltZShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisgICAgICAgICAgICAgICAgICAgIGxvY2FsU2Vzc2lvbi5zZXRNYXhJbmFjdGl2ZUludGVydmFsCisgICAgICAgICAgICAgICAgICAgICAgICAoY29udGV4dC5nZXRNYW5hZ2VyKCkuZ2V0TWF4SW5hY3RpdmVJbnRlcnZhbCgpKTsKKyAgICAgICAgICAgICAgICAgICAgbG9jYWxTZXNzaW9uLnNldElkKG90aGVyLmdldElkKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsb2NhbFNlc3Npb24uYWNjZXNzKCk7CisgICAgICAgICAgICAgICAgc2Vzc2lvbiA9IGxvY2FsU2Vzc2lvbjsKKyAgICAgICAgICAgICAgICByZXR1cm4gc2Vzc2lvbi5nZXRTZXNzaW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldFNlc3Npb24oY3JlYXRlKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQYWNrYWdlIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmVjeWNsZSB0aGlzIHJlcXVlc3QKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWN5Y2xlKCkgeworICAgICAgICBpZiAoc2Vzc2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBzZXNzaW9uLmVuZEFjY2VzcygpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEluZm8oKSB7CisKKyAgICAgICAgcmV0dXJuIChpbmZvKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUGVyZm9ybSBhIHNoYWxsb3cgY29weSBvZiB0aGUgc3BlY2lmaWVkIE1hcCwgYW5kIHJldHVybiB0aGUgcmVzdWx0LgorICAgICAqCisgICAgICogQHBhcmFtIG9yaWcgT3JpZ2luIE1hcCB0byBiZSBjb3BpZWQKKyAgICAgKi8KKyAgICBNYXAgY29weU1hcChNYXAgb3JpZykgeworCisgICAgICAgIGlmIChvcmlnID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKG5ldyBIYXNoTWFwKCkpOworICAgICAgICBIYXNoTWFwIGRlc3QgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICBJdGVyYXRvciBrZXlzID0gb3JpZy5rZXlTZXQoKS5pdGVyYXRvcigpOworICAgICAgICB3aGlsZSAoa2V5cy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKSBrZXlzLm5leHQoKTsKKyAgICAgICAgICAgIGRlc3QucHV0KGtleSwgb3JpZy5nZXQoa2V5KSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChkZXN0KTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjb250ZXh0IHBhdGggZm9yIHRoaXMgcmVxdWVzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0UGF0aCBUaGUgbmV3IGNvbnRleHQgcGF0aAorICAgICAqLworICAgIHZvaWQgc2V0Q29udGV4dFBhdGgoU3RyaW5nIGNvbnRleHRQYXRoKSB7CisKKyAgICAgICAgdGhpcy5jb250ZXh0UGF0aCA9IGNvbnRleHRQYXRoOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHBhdGggaW5mb3JtYXRpb24gZm9yIHRoaXMgcmVxdWVzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXRoSW5mbyBUaGUgbmV3IHBhdGggaW5mbworICAgICAqLworICAgIHZvaWQgc2V0UGF0aEluZm8oU3RyaW5nIHBhdGhJbmZvKSB7CisKKyAgICAgICAgdGhpcy5wYXRoSW5mbyA9IHBhdGhJbmZvOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHF1ZXJ5IHN0cmluZyBmb3IgdGhpcyByZXF1ZXN0LgorICAgICAqCisgICAgICogQHBhcmFtIHF1ZXJ5U3RyaW5nIFRoZSBuZXcgcXVlcnkgc3RyaW5nCisgICAgICovCisgICAgdm9pZCBzZXRRdWVyeVN0cmluZyhTdHJpbmcgcXVlcnlTdHJpbmcpIHsKKworICAgICAgICB0aGlzLnF1ZXJ5U3RyaW5nID0gcXVlcnlTdHJpbmc7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcmVxdWVzdCB0aGF0IHdlIGFyZSB3cmFwcGluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBuZXcgd3JhcHBlZCByZXF1ZXN0CisgICAgICovCisgICAgdm9pZCBzZXRSZXF1ZXN0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisKKyAgICAgICAgc3VwZXIuc2V0UmVxdWVzdChyZXF1ZXN0KTsKKworICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBhdHRyaWJ1dGVzIGZvciB0aGlzIHJlcXVlc3QKKyAgICAgICAgZGlzcGF0Y2hlclR5cGUgPSByZXF1ZXN0LmdldEF0dHJpYnV0ZShHbG9iYWxzLkRJU1BBVENIRVJfVFlQRV9BVFRSKTsKKyAgICAgICAgcmVxdWVzdERpc3BhdGNoZXJQYXRoID0gCisgICAgICAgICAgICByZXF1ZXN0LmdldEF0dHJpYnV0ZShHbG9iYWxzLkRJU1BBVENIRVJfUkVRVUVTVF9QQVRIX0FUVFIpOworCisgICAgICAgIC8vIEluaXRpYWxpemUgdGhlIHBhdGggZWxlbWVudHMgZm9yIHRoaXMgcmVxdWVzdAorICAgICAgICBjb250ZXh0UGF0aCA9IHJlcXVlc3QuZ2V0Q29udGV4dFBhdGgoKTsKKyAgICAgICAgcGF0aEluZm8gPSByZXF1ZXN0LmdldFBhdGhJbmZvKCk7CisgICAgICAgIHF1ZXJ5U3RyaW5nID0gcmVxdWVzdC5nZXRRdWVyeVN0cmluZygpOworICAgICAgICByZXF1ZXN0VVJJID0gcmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCk7CisgICAgICAgIHNlcnZsZXRQYXRoID0gcmVxdWVzdC5nZXRTZXJ2bGV0UGF0aCgpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHJlcXVlc3QgVVJJIGZvciB0aGlzIHJlcXVlc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdFVSSSBUaGUgbmV3IHJlcXVlc3QgVVJJCisgICAgICovCisgICAgdm9pZCBzZXRSZXF1ZXN0VVJJKFN0cmluZyByZXF1ZXN0VVJJKSB7CisKKyAgICAgICAgdGhpcy5yZXF1ZXN0VVJJID0gcmVxdWVzdFVSSTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzZXJ2bGV0IHBhdGggZm9yIHRoaXMgcmVxdWVzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXJ2bGV0UGF0aCBUaGUgbmV3IHNlcnZsZXQgcGF0aAorICAgICAqLworICAgIHZvaWQgc2V0U2VydmxldFBhdGgoU3RyaW5nIHNlcnZsZXRQYXRoKSB7CisKKyAgICAgICAgdGhpcy5zZXJ2bGV0UGF0aCA9IHNlcnZsZXRQYXRoOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBQYXJzZXMgdGhlIHBhcmFtZXRlcnMgb2YgdGhpcyByZXF1ZXN0LgorICAgICAqCisgICAgICogSWYgcGFyYW1ldGVycyBhcmUgcHJlc2VudCBpbiBib3RoIHRoZSBxdWVyeSBzdHJpbmcgYW5kIHRoZSByZXF1ZXN0CisgICAgICogY29udGVudCwgdGhleSBhcmUgbWVyZ2VkLgorICAgICAqLworICAgIHZvaWQgcGFyc2VQYXJhbWV0ZXJzKCkgeworCisJaWYgKHBhcnNlZFBhcmFtcykgeworCSAgICByZXR1cm47CisJfQorCisgICAgICAgIHBhcmFtZXRlcnMgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICBwYXJhbWV0ZXJzID0gY29weU1hcChnZXRSZXF1ZXN0KCkuZ2V0UGFyYW1ldGVyTWFwKCkpOworICAgICAgICBtZXJnZVBhcmFtZXRlcnMoKTsKKyAgICAgICAgcGFyc2VkUGFyYW1zID0gdHJ1ZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNhdmUgcXVlcnkgcGFyYW1ldGVycyBmb3IgdGhpcyByZXF1ZXN0LgorICAgICAqCisgICAgICogQHBhcmFtIHF1ZXJ5U3RyaW5nIFRoZSBxdWVyeSBzdHJpbmcgY29udGFpbmluZyBwYXJhbWV0ZXJzIGZvciB0aGlzCisgICAgICogICAgICAgICAgICAgICAgICAgIHJlcXVlc3QKKyAgICAgKi8KKyAgICB2b2lkIHNldFF1ZXJ5UGFyYW1zKFN0cmluZyBxdWVyeVN0cmluZykgeworICAgICAgICB0aGlzLnF1ZXJ5UGFyYW1TdHJpbmcgPSBxdWVyeVN0cmluZzsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm90ZWN0ZWQgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBJcyB0aGlzIGF0dHJpYnV0ZSBuYW1lIG9uZSBvZiB0aGUgc3BlY2lhbCBvbmVzIHRoYXQgaXMgYWRkZWQgb25seSBmb3IKKyAgICAgKiBpbmNsdWRlZCBzZXJ2bGV0cz8KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIEF0dHJpYnV0ZSBuYW1lIHRvIGJlIHRlc3RlZAorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGlzU3BlY2lhbChTdHJpbmcgbmFtZSkgeworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3BlY2lhbHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChzcGVjaWFsc1tpXS5lcXVhbHMobmFtZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuICh0cnVlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKGZhbHNlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0IGEgc3BlY2lhbCBhdHRyaWJ1dGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBzcGVjaWFsIGF0dHJpYnV0ZSBwb3MsIG9yIC0xIGlmIGl0IGlzIG5vdCBhIHNwZWNpYWwgCisgICAgICogICAgICAgICBhdHRyaWJ1dGUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IGdldFNwZWNpYWwoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzcGVjaWFscy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKHNwZWNpYWxzW2ldLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgIHJldHVybiAoaSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICgtMSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgYSBzcGVjaWFsIGF0dHJpYnV0ZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGF0dHJpYnV0ZSB3YXMgYSBzcGVjaWFsIGF0dHJpYnV0ZSwgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gc2V0U3BlY2lhbChTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3BlY2lhbHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChzcGVjaWFsc1tpXS5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgICAgICBzcGVjaWFsQXR0cmlidXRlc1tpXSA9IHZhbHVlOworICAgICAgICAgICAgICAgIHJldHVybiAodHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChmYWxzZSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSBzcGVjaWFsIGF0dHJpYnV0ZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGF0dHJpYnV0ZSB3YXMgYSBzcGVjaWFsIGF0dHJpYnV0ZSwgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlU3BlY2lhbChTdHJpbmcgbmFtZSkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNwZWNpYWxzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoc3BlY2lhbHNbaV0uZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgc3BlY2lhbEF0dHJpYnV0ZXNbaV0gPSBudWxsOworICAgICAgICAgICAgICAgIHJldHVybiAodHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChmYWxzZSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBNZXJnZSB0aGUgdHdvIHNldHMgb2YgcGFyYW1ldGVyIHZhbHVlcyBpbnRvIGEgc2luZ2xlIFN0cmluZyBhcnJheS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZXMxIEZpcnN0IHNldCBvZiB2YWx1ZXMKKyAgICAgKiBAcGFyYW0gdmFsdWVzMiBTZWNvbmQgc2V0IG9mIHZhbHVlcworICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmdbXSBtZXJnZVZhbHVlcyhPYmplY3QgdmFsdWVzMSwgT2JqZWN0IHZhbHVlczIpIHsKKworICAgICAgICBBcnJheUxpc3QgcmVzdWx0cyA9IG5ldyBBcnJheUxpc3QoKTsKKworICAgICAgICBpZiAodmFsdWVzMSA9PSBudWxsKQorICAgICAgICAgICAgOworICAgICAgICBlbHNlIGlmICh2YWx1ZXMxIGluc3RhbmNlb2YgU3RyaW5nKQorICAgICAgICAgICAgcmVzdWx0cy5hZGQodmFsdWVzMSk7CisgICAgICAgIGVsc2UgaWYgKHZhbHVlczEgaW5zdGFuY2VvZiBTdHJpbmdbXSkgeworICAgICAgICAgICAgU3RyaW5nIHZhbHVlc1tdID0gKFN0cmluZ1tdKSB2YWx1ZXMxOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgcmVzdWx0cy5hZGQodmFsdWVzW2ldKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICByZXN1bHRzLmFkZCh2YWx1ZXMxLnRvU3RyaW5nKCkpOworCisgICAgICAgIGlmICh2YWx1ZXMyID09IG51bGwpCisgICAgICAgICAgICA7CisgICAgICAgIGVsc2UgaWYgKHZhbHVlczIgaW5zdGFuY2VvZiBTdHJpbmcpCisgICAgICAgICAgICByZXN1bHRzLmFkZCh2YWx1ZXMyKTsKKyAgICAgICAgZWxzZSBpZiAodmFsdWVzMiBpbnN0YW5jZW9mIFN0cmluZ1tdKSB7CisgICAgICAgICAgICBTdHJpbmcgdmFsdWVzW10gPSAoU3RyaW5nW10pIHZhbHVlczI7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICByZXN1bHRzLmFkZCh2YWx1ZXNbaV0pOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHJlc3VsdHMuYWRkKHZhbHVlczIudG9TdHJpbmcoKSk7CisKKyAgICAgICAgU3RyaW5nIHZhbHVlc1tdID0gbmV3IFN0cmluZ1tyZXN1bHRzLnNpemUoKV07CisgICAgICAgIHJldHVybiAoKFN0cmluZ1tdKSByZXN1bHRzLnRvQXJyYXkodmFsdWVzKSk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcml2YXRlIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogTWVyZ2UgdGhlIHBhcmFtZXRlcnMgZnJvbSB0aGUgc2F2ZWQgcXVlcnkgcGFyYW1ldGVyIHN0cmluZyAoaWYgYW55KSwgYW5kCisgICAgICogdGhlIHBhcmFtZXRlcnMgYWxyZWFkeSBwcmVzZW50IG9uIHRoaXMgcmVxdWVzdCAoaWYgYW55KSwgc3VjaCB0aGF0IHRoZQorICAgICAqIHBhcmFtZXRlciB2YWx1ZXMgZnJvbSB0aGUgcXVlcnkgc3RyaW5nIHNob3cgdXAgZmlyc3QgaWYgdGhlcmUgYXJlCisgICAgICogZHVwbGljYXRlIHBhcmFtZXRlciBuYW1lcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgbWVyZ2VQYXJhbWV0ZXJzKCkgeworCisgICAgICAgIGlmICgocXVlcnlQYXJhbVN0cmluZyA9PSBudWxsKSB8fCAocXVlcnlQYXJhbVN0cmluZy5sZW5ndGgoKSA8IDEpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIEhhc2hNYXAgcXVlcnlQYXJhbWV0ZXJzID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgU3RyaW5nIGVuY29kaW5nID0gZ2V0Q2hhcmFjdGVyRW5jb2RpbmcoKTsKKyAgICAgICAgaWYgKGVuY29kaW5nID09IG51bGwpCisgICAgICAgICAgICBlbmNvZGluZyA9ICJJU08tODg1OS0xIjsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFJlcXVlc3RVdGlsLnBhcnNlUGFyYW1ldGVycworICAgICAgICAgICAgICAgIChxdWVyeVBhcmFtZXRlcnMsIHF1ZXJ5UGFyYW1TdHJpbmcsIGVuY29kaW5nKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIDsKKyAgICAgICAgfQorICAgICAgICBJdGVyYXRvciBrZXlzID0gcGFyYW1ldGVycy5rZXlTZXQoKS5pdGVyYXRvcigpOworICAgICAgICB3aGlsZSAoa2V5cy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKSBrZXlzLm5leHQoKTsKKyAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IHF1ZXJ5UGFyYW1ldGVycy5nZXQoa2V5KTsKKyAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcXVlcnlQYXJhbWV0ZXJzLnB1dChrZXksIHBhcmFtZXRlcnMuZ2V0KGtleSkpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcXVlcnlQYXJhbWV0ZXJzLnB1dAorICAgICAgICAgICAgICAgIChrZXksIG1lcmdlVmFsdWVzKHZhbHVlLCBwYXJhbWV0ZXJzLmdldChrZXkpKSk7CisgICAgICAgIH0KKyAgICAgICAgcGFyYW1ldGVycyA9IHF1ZXJ5UGFyYW1ldGVyczsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQXR0cmlidXRlTmFtZXNFbnVtZXJhdG9yIElubmVyIENsYXNzCisKKworICAgIC8qKgorICAgICAqIFV0aWxpdHkgY2xhc3MgdXNlZCB0byBleHBvc2UgdGhlIHNwZWNpYWwgYXR0cmlidXRlcyBhcyBiZWluZyBhdmFpbGFibGUKKyAgICAgKiBhcyByZXF1ZXN0IGF0dHJpYnV0ZXMuCisgICAgICovCisgICAgcHJvdGVjdGVkIGNsYXNzIEF0dHJpYnV0ZU5hbWVzRW51bWVyYXRvciBpbXBsZW1lbnRzIEVudW1lcmF0aW9uIHsKKworICAgICAgICBwcm90ZWN0ZWQgaW50IHBvcyA9IC0xOworICAgICAgICBwcm90ZWN0ZWQgaW50IGxhc3QgPSAtMTsKKyAgICAgICAgcHJvdGVjdGVkIEVudW1lcmF0aW9uIHBhcmVudEVudW1lcmF0aW9uID0gbnVsbDsKKyAgICAgICAgcHJvdGVjdGVkIFN0cmluZyBuZXh0ID0gbnVsbDsKKworICAgICAgICBwdWJsaWMgQXR0cmlidXRlTmFtZXNFbnVtZXJhdG9yKCkgeworICAgICAgICAgICAgcGFyZW50RW51bWVyYXRpb24gPSBnZXRSZXF1ZXN0KCkuZ2V0QXR0cmlidXRlTmFtZXMoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3BlY2lhbEF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoZ2V0QXR0cmlidXRlKHNwZWNpYWxzW2ldKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGxhc3QgPSBpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc01vcmVFbGVtZW50cygpIHsKKyAgICAgICAgICAgIHJldHVybiAoKHBvcyAhPSBsYXN0KSB8fCAobmV4dCAhPSBudWxsKSAKKyAgICAgICAgICAgICAgICAgICAgfHwgKChuZXh0ID0gZmluZE5leHQoKSkgIT0gbnVsbCkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE9iamVjdCBuZXh0RWxlbWVudCgpIHsKKyAgICAgICAgICAgIGlmIChwb3MgIT0gbGFzdCkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBwb3MgKyAxOyBpIDw9IGxhc3Q7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0QXR0cmlidXRlKHNwZWNpYWxzW2ldKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwb3MgPSBpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChzcGVjaWFsc1tpXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJpbmcgcmVzdWx0ID0gbmV4dDsKKyAgICAgICAgICAgIGlmIChuZXh0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBuZXh0ID0gZmluZE5leHQoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgU3RyaW5nIGZpbmROZXh0KCkgeworICAgICAgICAgICAgU3RyaW5nIHJlc3VsdCA9IG51bGw7CisgICAgICAgICAgICB3aGlsZSAoKHJlc3VsdCA9PSBudWxsKSAmJiAocGFyZW50RW51bWVyYXRpb24uaGFzTW9yZUVsZW1lbnRzKCkpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGN1cnJlbnQgPSAoU3RyaW5nKSBwYXJlbnRFbnVtZXJhdGlvbi5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgICAgIGlmICghaXNTcGVjaWFsKGN1cnJlbnQpKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb3JlL0FwcGxpY2F0aW9uSHR0cFJlc3BvbnNlLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29yZS9BcHBsaWNhdGlvbkh0dHBSZXNwb25zZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4ZGE5YjMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29yZS9BcHBsaWNhdGlvbkh0dHBSZXNwb25zZS5qYXZhCkBAIC0wLDAgKzEsMzkzIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmU7CisKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5Db29raWU7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLlN0cmluZ01hbmFnZXI7CisKKworLyoqCisgKiBXcmFwcGVyIGFyb3VuZCBhIDxjb2RlPmphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlPC9jb2RlPgorICogdGhhdCB0cmFuc2Zvcm1zIGFuIGFwcGxpY2F0aW9uIHJlc3BvbnNlIG9iamVjdCAod2hpY2ggbWlnaHQgYmUgdGhlIG9yaWdpbmFsCisgKiBvbmUgcGFzc2VkIHRvIGEgc2VydmxldCwgb3IgbWlnaHQgYmUgYmFzZWQgb24gdGhlIDIuMworICogPGNvZGU+amF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyPC9jb2RlPiBjbGFzcykKKyAqIGJhY2sgaW50byBhbiBpbnRlcm5hbCA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLkh0dHBSZXNwb25zZTwvY29kZT4uCisgKiA8cD4KKyAqIDxzdHJvbmc+V0FSTklORzwvc3Ryb25nPjogIER1ZSB0byBKYXZhJ3MgbGFjayBvZiBzdXBwb3J0IGZvciBtdWx0aXBsZQorICogaW5oZXJpdGFuY2UsIGFsbCBvZiB0aGUgbG9naWMgaW4gPGNvZGU+QXBwbGljYXRpb25SZXNwb25zZTwvY29kZT4gaXMKKyAqIGR1cGxpY2F0ZWQgaW4gPGNvZGU+QXBwbGljYXRpb25IdHRwUmVzcG9uc2U8L2NvZGU+LiAgTWFrZSBzdXJlIHRoYXQgeW91CisgKiBrZWVwIHRoZXNlIHR3byBjbGFzc2VzIGluIHN5bmNocm9uaXphdGlvbiB3aGVuIG1ha2luZyBjaGFuZ2VzIQorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitjbGFzcyBBcHBsaWNhdGlvbkh0dHBSZXNwb25zZSBleHRlbmRzIEh0dHBTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyB3cmFwcGVkIHJlc3BvbnNlIGFyb3VuZCB0aGUgc3BlY2lmaWVkIHNlcnZsZXQgcmVzcG9uc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIHNlcnZsZXQgcmVzcG9uc2UgYmVpbmcgd3JhcHBlZAorICAgICAqLworICAgIHB1YmxpYyBBcHBsaWNhdGlvbkh0dHBSZXNwb25zZShIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB7CisKKyAgICAgICAgdGhpcyhyZXNwb25zZSwgZmFsc2UpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgd3JhcHBlZCByZXNwb25zZSBhcm91bmQgdGhlIHNwZWNpZmllZCBzZXJ2bGV0IHJlc3BvbnNlLgorICAgICAqCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBzZXJ2bGV0IHJlc3BvbnNlIGJlaW5nIHdyYXBwZWQKKyAgICAgKiBAcGFyYW0gaW5jbHVkZWQgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyByZXNwb25zZSBpcyBiZWluZyBwcm9jZXNzZWQKKyAgICAgKiAgYnkgYSA8Y29kZT5SZXF1ZXN0RGlzcGF0Y2hlci5pbmNsdWRlKCk8L2NvZGU+IGNhbGwKKyAgICAgKi8KKyAgICBwdWJsaWMgQXBwbGljYXRpb25IdHRwUmVzcG9uc2UoSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpbmNsdWRlZCkgeworCisgICAgICAgIHN1cGVyKHJlc3BvbnNlKTsKKyAgICAgICAgc2V0SW5jbHVkZWQoaW5jbHVkZWQpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogSXMgdGhpcyB3cmFwcGVkIHJlc3BvbnNlIHRoZSBzdWJqZWN0IG9mIGFuIDxjb2RlPmluY2x1ZGUoKTwvY29kZT4KKyAgICAgKiBjYWxsPworICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGluY2x1ZGVkID0gZmFsc2U7CisKKworICAgIC8qKgorICAgICAqIERlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgaW5mbyA9CisgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuQXBwbGljYXRpb25IdHRwUmVzcG9uc2UvMS4wIjsKKworCisgICAgLyoqCisgICAgICogVGhlIHN0cmluZyBtYW5hZ2VyIGZvciB0aGlzIHBhY2thZ2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmdNYW5hZ2VyIHNtID0KKyAgICAgICAgU3RyaW5nTWFuYWdlci5nZXRNYW5hZ2VyKENvbnN0YW50cy5QYWNrYWdlKTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNlcnZsZXRSZXNwb25zZSBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIERpc2FsbG93IDxjb2RlPnJlc2V0KCk8L2NvZGU+IGNhbGxzIG9uIGEgaW5jbHVkZWQgcmVzcG9uc2UuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGUgcmVzcG9uc2UgaGFzIGFscmVhZHkKKyAgICAgKiAgYmVlbiBjb21taXR0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKKworICAgICAgICAvLyBJZiBhbHJlYWR5IGNvbW1pdHRlZCwgdGhlIHdyYXBwZWQgcmVzcG9uc2Ugd2lsbCB0aHJvdyBJU0UKKyAgICAgICAgaWYgKCFpbmNsdWRlZCB8fCBnZXRSZXNwb25zZSgpLmlzQ29tbWl0dGVkKCkpCisgICAgICAgICAgICBnZXRSZXNwb25zZSgpLnJlc2V0KCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIERpc2FsbG93IDxjb2RlPnNldENvbnRlbnRMZW5ndGgoKTwvY29kZT4gY2FsbHMgb24gYW4gaW5jbHVkZWQgcmVzcG9uc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGVuIFRoZSBuZXcgY29udGVudCBsZW5ndGgKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb250ZW50TGVuZ3RoKGludCBsZW4pIHsKKworICAgICAgICBpZiAoIWluY2x1ZGVkKQorICAgICAgICAgICAgZ2V0UmVzcG9uc2UoKS5zZXRDb250ZW50TGVuZ3RoKGxlbik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIERpc2FsbG93IDxjb2RlPnNldENvbnRlbnRUeXBlKCk8L2NvZGU+IGNhbGxzIG9uIGFuIGluY2x1ZGVkIHJlc3BvbnNlLgorICAgICAqCisgICAgICogQHBhcmFtIHR5cGUgVGhlIG5ldyBjb250ZW50IHR5cGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb250ZW50VHlwZShTdHJpbmcgdHlwZSkgeworCisgICAgICAgIGlmICghaW5jbHVkZWQpCisgICAgICAgICAgICBnZXRSZXNwb25zZSgpLnNldENvbnRlbnRUeXBlKHR5cGUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBEaXNhbGxvdyA8Y29kZT5zZXRMb2NhbGUoKTwvY29kZT4gY2FsbHMgb24gYW4gaW5jbHVkZWQgcmVzcG9uc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbG9jIFRoZSBuZXcgbG9jYWxlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TG9jYWxlKExvY2FsZSBsb2MpIHsKKworICAgICAgICBpZiAoIWluY2x1ZGVkKQorICAgICAgICAgICAgZ2V0UmVzcG9uc2UoKS5zZXRMb2NhbGUobG9jKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogSWdub3JlIDxjb2RlPnNldEJ1ZmZlclNpemUoKTwvY29kZT4gY2FsbHMgb24gYW4gaW5jbHVkZWQgcmVzcG9uc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2l6ZSBUaGUgYnVmZmVyIHNpemUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRCdWZmZXJTaXplKGludCBzaXplKSB7CisgICAgICAgIGlmICghaW5jbHVkZWQpCisgICAgICAgICAgICBnZXRSZXNwb25zZSgpLnNldEJ1ZmZlclNpemUoc2l6ZSk7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBIdHRwU2VydmxldFJlc3BvbnNlIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogRGlzYWxsb3cgPGNvZGU+YWRkQ29va2llKCk8L2NvZGU+IGNhbGxzIG9uIGFuIGluY2x1ZGVkIHJlc3BvbnNlLgorICAgICAqCisgICAgICogQHBhcmFtIGNvb2tpZSBUaGUgbmV3IGNvb2tpZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZENvb2tpZShDb29raWUgY29va2llKSB7CisKKyAgICAgICAgaWYgKCFpbmNsdWRlZCkKKyAgICAgICAgICAgICgoSHR0cFNlcnZsZXRSZXNwb25zZSkgZ2V0UmVzcG9uc2UoKSkuYWRkQ29va2llKGNvb2tpZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIERpc2FsbG93IDxjb2RlPmFkZERhdGVIZWFkZXIoKTwvY29kZT4gY2FsbHMgb24gYW4gaW5jbHVkZWQgcmVzcG9uc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmV3IGhlYWRlciBuYW1lCisgICAgICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgaGVhZGVyIHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRGF0ZUhlYWRlcihTdHJpbmcgbmFtZSwgbG9uZyB2YWx1ZSkgeworCisgICAgICAgIGlmICghaW5jbHVkZWQpCisgICAgICAgICAgICAoKEh0dHBTZXJ2bGV0UmVzcG9uc2UpIGdldFJlc3BvbnNlKCkpLmFkZERhdGVIZWFkZXIobmFtZSwgdmFsdWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBEaXNhbGxvdyA8Y29kZT5hZGRIZWFkZXIoKTwvY29kZT4gY2FsbHMgb24gYW4gaW5jbHVkZWQgcmVzcG9uc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmV3IGhlYWRlciBuYW1lCisgICAgICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgaGVhZGVyIHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkSGVhZGVyKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKKworICAgICAgICBpZiAoIWluY2x1ZGVkKQorICAgICAgICAgICAgKChIdHRwU2VydmxldFJlc3BvbnNlKSBnZXRSZXNwb25zZSgpKS5hZGRIZWFkZXIobmFtZSwgdmFsdWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBEaXNhbGxvdyA8Y29kZT5hZGRJbnRIZWFkZXIoKTwvY29kZT4gY2FsbHMgb24gYW4gaW5jbHVkZWQgcmVzcG9uc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmV3IGhlYWRlciBuYW1lCisgICAgICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgaGVhZGVyIHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkSW50SGVhZGVyKFN0cmluZyBuYW1lLCBpbnQgdmFsdWUpIHsKKworICAgICAgICBpZiAoIWluY2x1ZGVkKQorICAgICAgICAgICAgKChIdHRwU2VydmxldFJlc3BvbnNlKSBnZXRSZXNwb25zZSgpKS5hZGRJbnRIZWFkZXIobmFtZSwgdmFsdWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBEaXNhbGxvdyA8Y29kZT5zZW5kRXJyb3IoKTwvY29kZT4gY2FsbHMgb24gYW4gaW5jbHVkZWQgcmVzcG9uc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2MgVGhlIG5ldyBzdGF0dXMgY29kZQorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2VuZEVycm9yKGludCBzYykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAoIWluY2x1ZGVkKQorICAgICAgICAgICAgKChIdHRwU2VydmxldFJlc3BvbnNlKSBnZXRSZXNwb25zZSgpKS5zZW5kRXJyb3Ioc2MpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBEaXNhbGxvdyA8Y29kZT5zZW5kRXJyb3IoKTwvY29kZT4gY2FsbHMgb24gYW4gaW5jbHVkZWQgcmVzcG9uc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2MgVGhlIG5ldyBzdGF0dXMgY29kZQorICAgICAqIEBwYXJhbSBtc2cgVGhlIG5ldyBtZXNzYWdlCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZW5kRXJyb3IoaW50IHNjLCBTdHJpbmcgbXNnKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIGlmICghaW5jbHVkZWQpCisgICAgICAgICAgICAoKEh0dHBTZXJ2bGV0UmVzcG9uc2UpIGdldFJlc3BvbnNlKCkpLnNlbmRFcnJvcihzYywgbXNnKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogRGlzYWxsb3cgPGNvZGU+c2VuZFJlZGlyZWN0KCk8L2NvZGU+IGNhbGxzIG9uIGFuIGluY2x1ZGVkIHJlc3BvbnNlLgorICAgICAqCisgICAgICogQHBhcmFtIGxvY2F0aW9uIFRoZSBuZXcgbG9jYXRpb24KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNlbmRSZWRpcmVjdChTdHJpbmcgbG9jYXRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKCFpbmNsdWRlZCkKKyAgICAgICAgICAgICgoSHR0cFNlcnZsZXRSZXNwb25zZSkgZ2V0UmVzcG9uc2UoKSkuc2VuZFJlZGlyZWN0KGxvY2F0aW9uKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogRGlzYWxsb3cgPGNvZGU+c2V0RGF0ZUhlYWRlcigpPC9jb2RlPiBjYWxscyBvbiBhbiBpbmNsdWRlZCByZXNwb25zZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuZXcgaGVhZGVyIG5hbWUKKyAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyBoZWFkZXIgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREYXRlSGVhZGVyKFN0cmluZyBuYW1lLCBsb25nIHZhbHVlKSB7CisKKyAgICAgICAgaWYgKCFpbmNsdWRlZCkKKyAgICAgICAgICAgICgoSHR0cFNlcnZsZXRSZXNwb25zZSkgZ2V0UmVzcG9uc2UoKSkuc2V0RGF0ZUhlYWRlcihuYW1lLCB2YWx1ZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIERpc2FsbG93IDxjb2RlPnNldEhlYWRlcigpPC9jb2RlPiBjYWxscyBvbiBhbiBpbmNsdWRlZCByZXNwb25zZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuZXcgaGVhZGVyIG5hbWUKKyAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyBoZWFkZXIgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRIZWFkZXIoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgeworCisgICAgICAgIGlmICghaW5jbHVkZWQpCisgICAgICAgICAgICAoKEh0dHBTZXJ2bGV0UmVzcG9uc2UpIGdldFJlc3BvbnNlKCkpLnNldEhlYWRlcihuYW1lLCB2YWx1ZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIERpc2FsbG93IDxjb2RlPnNldEludEhlYWRlcigpPC9jb2RlPiBjYWxscyBvbiBhbiBpbmNsdWRlZCByZXNwb25zZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuZXcgaGVhZGVyIG5hbWUKKyAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyBoZWFkZXIgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJbnRIZWFkZXIoU3RyaW5nIG5hbWUsIGludCB2YWx1ZSkgeworCisgICAgICAgIGlmICghaW5jbHVkZWQpCisgICAgICAgICAgICAoKEh0dHBTZXJ2bGV0UmVzcG9uc2UpIGdldFJlc3BvbnNlKCkpLnNldEludEhlYWRlcihuYW1lLCB2YWx1ZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIERpc2FsbG93IDxjb2RlPnNldFN0YXR1cygpPC9jb2RlPiBjYWxscyBvbiBhbiBpbmNsdWRlZCByZXNwb25zZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzYyBUaGUgbmV3IHN0YXR1cyBjb2RlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3RhdHVzKGludCBzYykgeworCisgICAgICAgIGlmICghaW5jbHVkZWQpCisgICAgICAgICAgICAoKEh0dHBTZXJ2bGV0UmVzcG9uc2UpIGdldFJlc3BvbnNlKCkpLnNldFN0YXR1cyhzYyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIERpc2FsbG93IDxjb2RlPnNldFN0YXR1cygpPC9jb2RlPiBjYWxscyBvbiBhbiBpbmNsdWRlZCByZXNwb25zZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzYyBUaGUgbmV3IHN0YXR1cyBjb2RlCisgICAgICogQHBhcmFtIG1zZyBUaGUgbmV3IG1lc3NhZ2UKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTdGF0dXMoaW50IHNjLCBTdHJpbmcgbXNnKSB7CisKKyAgICAgICAgaWYgKCFpbmNsdWRlZCkKKyAgICAgICAgICAgICgoSHR0cFNlcnZsZXRSZXNwb25zZSkgZ2V0UmVzcG9uc2UoKSkuc2V0U3RhdHVzKHNjLCBtc2cpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQYWNrYWdlIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJbmZvKCkgeworCisgICAgICAgIHJldHVybiAoaW5mbyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgaW5jbHVkZWQgZmxhZyBmb3IgdGhpcyByZXNwb25zZS4KKyAgICAgKi8KKyAgICBib29sZWFuIGlzSW5jbHVkZWQoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLmluY2x1ZGVkKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBpbmNsdWRlZCBmbGFnIGZvciB0aGlzIHJlc3BvbnNlLgorICAgICAqCisgICAgICogQHBhcmFtIGluY2x1ZGVkIFRoZSBuZXcgaW5jbHVkZWQgZmxhZworICAgICAqLworICAgIHZvaWQgc2V0SW5jbHVkZWQoYm9vbGVhbiBpbmNsdWRlZCkgeworCisgICAgICAgIHRoaXMuaW5jbHVkZWQgPSBpbmNsdWRlZDsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSByZXNwb25zZSB0aGF0IHdlIGFyZSB3cmFwcGluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgbmV3IHdyYXBwZWQgcmVzcG9uc2UKKyAgICAgKi8KKyAgICB2b2lkIHNldFJlc3BvbnNlKEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHsKKworICAgICAgICBzdXBlci5zZXRSZXNwb25zZShyZXNwb25zZSk7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NvcmUvQXBwbGljYXRpb25SZXF1ZXN0LmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29yZS9BcHBsaWNhdGlvblJlcXVlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGIxYmRlCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NvcmUvQXBwbGljYXRpb25SZXF1ZXN0LmphdmEKQEAgLTAsMCArMSwyMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZTsKKworCitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworCitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXF1ZXN0V3JhcHBlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuR2xvYmFsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuRW51bWVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuU3RyaW5nTWFuYWdlcjsKKworCisvKioKKyAqIFdyYXBwZXIgYXJvdW5kIGEgPGNvZGU+amF2YXguc2VydmxldC5TZXJ2bGV0UmVxdWVzdDwvY29kZT4KKyAqIHRoYXQgdHJhbnNmb3JtcyBhbiBhcHBsaWNhdGlvbiByZXF1ZXN0IG9iamVjdCAod2hpY2ggbWlnaHQgYmUgdGhlIG9yaWdpbmFsCisgKiBvbmUgcGFzc2VkIHRvIGEgc2VydmxldCwgb3IgbWlnaHQgYmUgYmFzZWQgb24gdGhlIDIuMworICogPGNvZGU+amF2YXguc2VydmxldC5TZXJ2bGV0UmVxdWVzdFdyYXBwZXI8L2NvZGU+IGNsYXNzKQorICogYmFjayBpbnRvIGFuIGludGVybmFsIDxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuUmVxdWVzdDwvY29kZT4uCisgKiA8cD4KKyAqIDxzdHJvbmc+V0FSTklORzwvc3Ryb25nPjogIER1ZSB0byBKYXZhJ3MgbGFjayBvZiBzdXBwb3J0IGZvciBtdWx0aXBsZQorICogaW5oZXJpdGFuY2UsIGFsbCBvZiB0aGUgbG9naWMgaW4gPGNvZGU+QXBwbGljYXRpb25SZXF1ZXN0PC9jb2RlPiBpcworICogZHVwbGljYXRlZCBpbiA8Y29kZT5BcHBsaWNhdGlvbkh0dHBSZXF1ZXN0PC9jb2RlPi4gIE1ha2Ugc3VyZSB0aGF0IHlvdQorICoga2VlcCB0aGVzZSB0d28gY2xhc3NlcyBpbiBzeW5jaHJvbml6YXRpb24gd2hlbiBtYWtpbmcgY2hhbmdlcyEKKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworY2xhc3MgQXBwbGljYXRpb25SZXF1ZXN0IGV4dGVuZHMgU2VydmxldFJlcXVlc3RXcmFwcGVyIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTdGF0aWMgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBzZXQgb2YgYXR0cmlidXRlIG5hbWVzIHRoYXQgYXJlIHNwZWNpYWwgZm9yIHJlcXVlc3QgZGlzcGF0Y2hlcnMuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgc3BlY2lhbHNbXSA9CisgICAgeyBHbG9iYWxzLklOQ0xVREVfUkVRVUVTVF9VUklfQVRUUiwgR2xvYmFscy5JTkNMVURFX0NPTlRFWFRfUEFUSF9BVFRSLAorICAgICAgR2xvYmFscy5JTkNMVURFX1NFUlZMRVRfUEFUSF9BVFRSLCBHbG9iYWxzLklOQ0xVREVfUEFUSF9JTkZPX0FUVFIsCisgICAgICBHbG9iYWxzLklOQ0xVREVfUVVFUllfU1RSSU5HX0FUVFIsIEdsb2JhbHMuRk9SV0FSRF9SRVFVRVNUX1VSSV9BVFRSLCAKKyAgICAgIEdsb2JhbHMuRk9SV0FSRF9DT05URVhUX1BBVEhfQVRUUiwgR2xvYmFscy5GT1JXQVJEX1NFUlZMRVRfUEFUSF9BVFRSLCAKKyAgICAgIEdsb2JhbHMuRk9SV0FSRF9QQVRIX0lORk9fQVRUUiwgR2xvYmFscy5GT1JXQVJEX1FVRVJZX1NUUklOR19BVFRSIH07CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgd3JhcHBlZCByZXF1ZXN0IGFyb3VuZCB0aGUgc3BlY2lmaWVkIHNlcnZsZXQgcmVxdWVzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3QgYmVpbmcgd3JhcHBlZAorICAgICAqLworICAgIHB1YmxpYyBBcHBsaWNhdGlvblJlcXVlc3QoU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworCisgICAgICAgIHN1cGVyKHJlcXVlc3QpOworICAgICAgICBzZXRSZXF1ZXN0KHJlcXVlc3QpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIHJlcXVlc3QgYXR0cmlidXRlcyBmb3IgdGhpcyByZXF1ZXN0LiAgVGhpcyBpcyBpbml0aWFsaXplZCBmcm9tIHRoZQorICAgICAqIHdyYXBwZWQgcmVxdWVzdCwgYnV0IHVwZGF0ZXMgYXJlIGFsbG93ZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIEhhc2hNYXAgYXR0cmlidXRlcyA9IG5ldyBIYXNoTWFwKCk7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzdHJpbmcgbWFuYWdlciBmb3IgdGhpcyBwYWNrYWdlLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nTWFuYWdlciBzbSA9CisgICAgICAgIFN0cmluZ01hbmFnZXIuZ2V0TWFuYWdlcihDb25zdGFudHMuUGFja2FnZSk7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU2VydmxldFJlcXVlc3QgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBPdmVycmlkZSB0aGUgPGNvZGU+Z2V0QXR0cmlidXRlKCk8L2NvZGU+IG1ldGhvZCBvZiB0aGUgd3JhcHBlZCByZXF1ZXN0LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgYXR0cmlidXRlIHRvIHJldHJpZXZlCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKGF0dHJpYnV0ZXMpIHsKKyAgICAgICAgICAgIHJldHVybiAoYXR0cmlidXRlcy5nZXQobmFtZSkpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIE92ZXJyaWRlIHRoZSA8Y29kZT5nZXRBdHRyaWJ1dGVOYW1lcygpPC9jb2RlPiBtZXRob2Qgb2YgdGhlIHdyYXBwZWQKKyAgICAgKiByZXF1ZXN0LgorICAgICAqLworICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRBdHRyaWJ1dGVOYW1lcygpIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKGF0dHJpYnV0ZXMpIHsKKyAgICAgICAgICAgIHJldHVybiAobmV3IEVudW1lcmF0b3IoYXR0cmlidXRlcy5rZXlTZXQoKSkpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIE92ZXJyaWRlIHRoZSA8Y29kZT5yZW1vdmVBdHRyaWJ1dGUoKTwvY29kZT4gbWV0aG9kIG9mIHRoZQorICAgICAqIHdyYXBwZWQgcmVxdWVzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0byByZW1vdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKGF0dHJpYnV0ZXMpIHsKKyAgICAgICAgICAgIGF0dHJpYnV0ZXMucmVtb3ZlKG5hbWUpOworICAgICAgICAgICAgaWYgKCFpc1NwZWNpYWwobmFtZSkpCisgICAgICAgICAgICAgICAgZ2V0UmVxdWVzdCgpLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBPdmVycmlkZSB0aGUgPGNvZGU+c2V0QXR0cmlidXRlKCk8L2NvZGU+IG1ldGhvZCBvZiB0aGUKKyAgICAgKiB3cmFwcGVkIHJlcXVlc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdG8gc2V0CisgICAgICogQHBhcmFtIHZhbHVlIFZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgdG8gc2V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKGF0dHJpYnV0ZXMpIHsKKyAgICAgICAgICAgIGF0dHJpYnV0ZXMucHV0KG5hbWUsIHZhbHVlKTsKKyAgICAgICAgICAgIGlmICghaXNTcGVjaWFsKG5hbWUpKQorICAgICAgICAgICAgICAgIGdldFJlcXVlc3QoKS5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHJlcXVlc3QgdGhhdCB3ZSBhcmUgd3JhcHBpbmcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgbmV3IHdyYXBwZWQgcmVxdWVzdAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlcXVlc3QoU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworCisgICAgICAgIHN1cGVyLnNldFJlcXVlc3QocmVxdWVzdCk7CisKKyAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgYXR0cmlidXRlcyBmb3IgdGhpcyByZXF1ZXN0CisgICAgICAgIHN5bmNocm9uaXplZCAoYXR0cmlidXRlcykgeworICAgICAgICAgICAgYXR0cmlidXRlcy5jbGVhcigpOworICAgICAgICAgICAgRW51bWVyYXRpb24gbmFtZXMgPSByZXF1ZXN0LmdldEF0dHJpYnV0ZU5hbWVzKCk7CisgICAgICAgICAgICB3aGlsZSAobmFtZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIG5hbWVzLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gcmVxdWVzdC5nZXRBdHRyaWJ1dGUobmFtZSk7CisgICAgICAgICAgICAgICAgYXR0cmlidXRlcy5wdXQobmFtZSwgdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm90ZWN0ZWQgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBJcyB0aGlzIGF0dHJpYnV0ZSBuYW1lIG9uZSBvZiB0aGUgc3BlY2lhbCBvbmVzIHRoYXQgaXMgYWRkZWQgb25seSBmb3IKKyAgICAgKiBpbmNsdWRlZCBzZXJ2bGV0cz8KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIEF0dHJpYnV0ZSBuYW1lIHRvIGJlIHRlc3RlZAorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGlzU3BlY2lhbChTdHJpbmcgbmFtZSkgeworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3BlY2lhbHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChzcGVjaWFsc1tpXS5lcXVhbHMobmFtZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuICh0cnVlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKGZhbHNlKTsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29yZS9BcHBsaWNhdGlvblJlc3BvbnNlLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29yZS9BcHBsaWNhdGlvblJlc3BvbnNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ1NmExNQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb3JlL0FwcGxpY2F0aW9uUmVzcG9uc2UuamF2YQpAQCAtMCwwICsxLDIwMSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlOworCisKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworCitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVzcG9uc2VXcmFwcGVyOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLlN0cmluZ01hbmFnZXI7CisKKworLyoqCisgKiBXcmFwcGVyIGFyb3VuZCBhIDxjb2RlPmphdmF4LnNlcnZsZXQuU2VydmxldFJlc3BvbnNlPC9jb2RlPgorICogdGhhdCB0cmFuc2Zvcm1zIGFuIGFwcGxpY2F0aW9uIHJlc3BvbnNlIG9iamVjdCAod2hpY2ggbWlnaHQgYmUgdGhlIG9yaWdpbmFsCisgKiBvbmUgcGFzc2VkIHRvIGEgc2VydmxldCwgb3IgbWlnaHQgYmUgYmFzZWQgb24gdGhlIDIuMworICogPGNvZGU+amF2YXguc2VydmxldC5TZXJ2bGV0UmVzcG9uc2VXcmFwcGVyPC9jb2RlPiBjbGFzcykKKyAqIGJhY2sgaW50byBhbiBpbnRlcm5hbCA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLlJlc3BvbnNlPC9jb2RlPi4KKyAqIDxwPgorICogPHN0cm9uZz5XQVJOSU5HPC9zdHJvbmc+OiAgRHVlIHRvIEphdmEncyBsYWNrIG9mIHN1cHBvcnQgZm9yIG11bHRpcGxlCisgKiBpbmhlcml0YW5jZSwgYWxsIG9mIHRoZSBsb2dpYyBpbiA8Y29kZT5BcHBsaWNhdGlvblJlc3BvbnNlPC9jb2RlPiBpcworICogZHVwbGljYXRlZCBpbiA8Y29kZT5BcHBsaWNhdGlvbkh0dHBSZXNwb25zZTwvY29kZT4uICBNYWtlIHN1cmUgdGhhdCB5b3UKKyAqIGtlZXAgdGhlc2UgdHdvIGNsYXNzZXMgaW4gc3luY2hyb25pemF0aW9uIHdoZW4gbWFraW5nIGNoYW5nZXMhCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK2NsYXNzIEFwcGxpY2F0aW9uUmVzcG9uc2UgZXh0ZW5kcyBTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyB3cmFwcGVkIHJlc3BvbnNlIGFyb3VuZCB0aGUgc3BlY2lmaWVkIHNlcnZsZXQgcmVzcG9uc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIHNlcnZsZXQgcmVzcG9uc2UgYmVpbmcgd3JhcHBlZAorICAgICAqLworICAgIHB1YmxpYyBBcHBsaWNhdGlvblJlc3BvbnNlKFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgeworCisgICAgICAgIHRoaXMocmVzcG9uc2UsIGZhbHNlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IHdyYXBwZWQgcmVzcG9uc2UgYXJvdW5kIHRoZSBzcGVjaWZpZWQgc2VydmxldCByZXNwb25zZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgc2VydmxldCByZXNwb25zZSBiZWluZyB3cmFwcGVkCisgICAgICogQHBhcmFtIGluY2x1ZGVkIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgcmVzcG9uc2UgaXMgYmVpbmcgcHJvY2Vzc2VkCisgICAgICogIGJ5IGEgPGNvZGU+UmVxdWVzdERpc3BhdGNoZXIuaW5jbHVkZSgpPC9jb2RlPiBjYWxsCisgICAgICovCisgICAgcHVibGljIEFwcGxpY2F0aW9uUmVzcG9uc2UoU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLCBib29sZWFuIGluY2x1ZGVkKSB7CisKKyAgICAgICAgc3VwZXIocmVzcG9uc2UpOworICAgICAgICBzZXRJbmNsdWRlZChpbmNsdWRlZCk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBJcyB0aGlzIHdyYXBwZWQgcmVzcG9uc2UgdGhlIHN1YmplY3Qgb2YgYW4gPGNvZGU+aW5jbHVkZSgpPC9jb2RlPgorICAgICAqIGNhbGw/CisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaW5jbHVkZWQgPSBmYWxzZTsKKworCisgICAgLyoqCisgICAgICogVGhlIHN0cmluZyBtYW5hZ2VyIGZvciB0aGlzIHBhY2thZ2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmdNYW5hZ2VyIHNtID0KKyAgICAgICAgU3RyaW5nTWFuYWdlci5nZXRNYW5hZ2VyKENvbnN0YW50cy5QYWNrYWdlKTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNlcnZsZXRSZXNwb25zZSBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIERpc2FsbG93IDxjb2RlPnJlc2V0KCk8L2NvZGU+IGNhbGxzIG9uIGEgaW5jbHVkZWQgcmVzcG9uc2UuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGUgcmVzcG9uc2UgaGFzIGFscmVhZHkKKyAgICAgKiAgYmVlbiBjb21taXR0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKKworICAgICAgICAvLyBJZiBhbHJlYWR5IGNvbW1pdHRlZCwgdGhlIHdyYXBwZWQgcmVzcG9uc2Ugd2lsbCB0aHJvdyBJU0UKKyAgICAgICAgaWYgKCFpbmNsdWRlZCB8fCBnZXRSZXNwb25zZSgpLmlzQ29tbWl0dGVkKCkpCisgICAgICAgICAgICBnZXRSZXNwb25zZSgpLnJlc2V0KCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIERpc2FsbG93IDxjb2RlPnNldENvbnRlbnRMZW5ndGgoKTwvY29kZT4gY2FsbHMgb24gYW4gaW5jbHVkZWQgcmVzcG9uc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGVuIFRoZSBuZXcgY29udGVudCBsZW5ndGgKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb250ZW50TGVuZ3RoKGludCBsZW4pIHsKKworICAgICAgICBpZiAoIWluY2x1ZGVkKQorICAgICAgICAgICAgZ2V0UmVzcG9uc2UoKS5zZXRDb250ZW50TGVuZ3RoKGxlbik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIERpc2FsbG93IDxjb2RlPnNldENvbnRlbnRUeXBlKCk8L2NvZGU+IGNhbGxzIG9uIGFuIGluY2x1ZGVkIHJlc3BvbnNlLgorICAgICAqCisgICAgICogQHBhcmFtIHR5cGUgVGhlIG5ldyBjb250ZW50IHR5cGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb250ZW50VHlwZShTdHJpbmcgdHlwZSkgeworCisgICAgICAgIGlmICghaW5jbHVkZWQpCisgICAgICAgICAgICBnZXRSZXNwb25zZSgpLnNldENvbnRlbnRUeXBlKHR5cGUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBJZ25vcmUgPGNvZGU+c2V0TG9jYWxlKCk8L2NvZGU+IGNhbGxzIG9uIGFuIGluY2x1ZGVkIHJlc3BvbnNlLgorICAgICAqCisgICAgICogQHBhcmFtIGxvYyBUaGUgbmV3IGxvY2FsZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExvY2FsZShMb2NhbGUgbG9jKSB7CisgICAgICAgIGlmICghaW5jbHVkZWQpCisgICAgICAgICAgICBnZXRSZXNwb25zZSgpLnNldExvY2FsZShsb2MpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogSWdub3JlIDxjb2RlPnNldEJ1ZmZlclNpemUoKTwvY29kZT4gY2FsbHMgb24gYW4gaW5jbHVkZWQgcmVzcG9uc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2l6ZSBUaGUgYnVmZmVyIHNpemUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRCdWZmZXJTaXplKGludCBzaXplKSB7CisgICAgICAgIGlmICghaW5jbHVkZWQpCisgICAgICAgICAgICBnZXRSZXNwb25zZSgpLnNldEJ1ZmZlclNpemUoc2l6ZSk7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSByZXNwb25zZSB0aGF0IHdlIGFyZSB3cmFwcGluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgbmV3IHdyYXBwZWQgcmVzcG9uc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZXNwb25zZShTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHsKKworICAgICAgICBzdXBlci5zZXRSZXNwb25zZShyZXNwb25zZSk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBhY2thZ2UgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGluY2x1ZGVkIGZsYWcgZm9yIHRoaXMgcmVzcG9uc2UuCisgICAgICovCisgICAgYm9vbGVhbiBpc0luY2x1ZGVkKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5pbmNsdWRlZCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgaW5jbHVkZWQgZmxhZyBmb3IgdGhpcyByZXNwb25zZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbmNsdWRlZCBUaGUgbmV3IGluY2x1ZGVkIGZsYWcKKyAgICAgKi8KKyAgICB2b2lkIHNldEluY2x1ZGVkKGJvb2xlYW4gaW5jbHVkZWQpIHsKKworICAgICAgICB0aGlzLmluY2x1ZGVkID0gaW5jbHVkZWQ7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NvcmUvQ29uc3RhbnRzLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29yZS9Db25zdGFudHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzU5ODZhCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NvcmUvQ29uc3RhbnRzLmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlOworCisKK3B1YmxpYyBjbGFzcyBDb25zdGFudHMgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUGFja2FnZSA9ICJvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BSk9SX1ZFUlNJT04gPSAyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1JTk9SX1ZFUlNJT04gPSA0OworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX1NFUlZMRVRfQ0xBU1MgPQorICAgICAgICAib3JnLmFwYWNoZS5qYXNwZXIuc2VydmxldC5Kc3BTZXJ2bGV0IjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfU0VSVkxFVF9OQU1FID0gImpzcCI7CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb3JlL0NvbnRhaW5lckJhc2UuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb3JlL0NvbnRhaW5lckJhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTYzMTBjCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NvcmUvQ29udGFpbmVyQmFzZS5qYXZhCkBAIC0wLDAgKzEsMTUyOCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LTIwMDEsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmU7CisKKworaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKK2ltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlU3VwcG9ydDsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5SZWdpc3RyYXRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1hbGZvcm1lZE9iamVjdE5hbWVFeGNlcHRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworaW1wb3J0IGphdmF4Lm5hbWluZy5kaXJlY3RvcnkuRGlyQ29udGV4dDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNsdXN0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Db250YWluZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Db250YWluZXJFdmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRhaW5lckxpc3RlbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Mb2FkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5NYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuUGlwZWxpbmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5SZWFsbTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlZhbHZlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLlJlcXVlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuUmVzcG9uc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLkxpZmVjeWNsZVN1cHBvcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLlN0cmluZ01hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLm1vZGVsZXIuUmVnaXN0cnk7CitpbXBvcnQgb3JnLmFwYWNoZS5uYW1pbmcucmVzb3VyY2VzLlByb3h5RGlyQ29udGV4dDsKKworCisvKioKKyAqIEFic3RyYWN0IGltcGxlbWVudGF0aW9uIG9mIHRoZSA8Yj5Db250YWluZXI8L2I+IGludGVyZmFjZSwgcHJvdmlkaW5nIGNvbW1vbgorICogZnVuY3Rpb25hbGl0eSByZXF1aXJlZCBieSBuZWFybHkgZXZlcnkgaW1wbGVtZW50YXRpb24uICBDbGFzc2VzIGV4dGVuZGluZworICogdGhpcyBiYXNlIGNsYXNzIG11c3QgaW1wbGVtZW50IDxjb2RlPmdldEluZm8oKTwvY29kZT4sIGFuZCBtYXkgaW1wbGVtZW50CisgKiBhIHJlcGxhY2VtZW50IGZvciA8Y29kZT5pbnZva2UoKTwvY29kZT4uCisgKiA8cD4KKyAqIEFsbCBzdWJjbGFzc2VzIG9mIHRoaXMgYWJzdHJhY3QgYmFzZSBjbGFzcyB3aWxsIGluY2x1ZGUgc3VwcG9ydCBmb3IgYQorICogUGlwZWxpbmUgb2JqZWN0IHRoYXQgZGVmaW5lcyB0aGUgcHJvY2Vzc2luZyB0byBiZSBwZXJmb3JtZWQgZm9yIGVhY2ggcmVxdWVzdAorICogcmVjZWl2ZWQgYnkgdGhlIDxjb2RlPmludm9rZSgpPC9jb2RlPiBtZXRob2Qgb2YgdGhpcyBjbGFzcywgdXRpbGl6aW5nIHRoZQorICogIkNoYWluIG9mIFJlc3BvbnNpYmlsaXR5IiBkZXNpZ24gcGF0dGVybi4gIEEgc3ViY2xhc3Mgc2hvdWxkIGVuY2Fwc3VsYXRlIGl0cworICogb3duIHByb2Nlc3NpbmcgZnVuY3Rpb25hbGl0eSBhcyBhIDxjb2RlPlZhbHZlPC9jb2RlPiwgYW5kIGNvbmZpZ3VyZSB0aGlzCisgKiBWYWx2ZSBpbnRvIHRoZSBwaXBlbGluZSBieSBjYWxsaW5nIDxjb2RlPnNldEJhc2ljKCk8L2NvZGU+LgorICogPHA+CisgKiBUaGlzIGltcGxlbWVudGF0aW9uIGZpcmVzIHByb3BlcnR5IGNoYW5nZSBldmVudHMsIHBlciB0aGUgSmF2YUJlYW5zIGRlc2lnbgorICogcGF0dGVybiwgZm9yIGNoYW5nZXMgaW4gc2luZ2xldG9uIHByb3BlcnRpZXMuICBJbiBhZGRpdGlvbiwgaXQgZmlyZXMgdGhlCisgKiBmb2xsb3dpbmcgPGNvZGU+Q29udGFpbmVyRXZlbnQ8L2NvZGU+IGV2ZW50cyB0byBsaXN0ZW5lcnMgd2hvIHJlZ2lzdGVyCisgKiB0aGVtc2VsdmVzIHdpdGggPGNvZGU+YWRkQ29udGFpbmVyTGlzdGVuZXIoKTwvY29kZT46CisgKiA8dGFibGUgYm9yZGVyPTE+CisgKiAgIDx0cj4KKyAqICAgICA8dGg+VHlwZTwvdGg+CisgKiAgICAgPHRoPkRhdGE8L3RoPgorICogICAgIDx0aD5EZXNjcmlwdGlvbjwvdGg+CisgKiAgIDwvdHI+CisgKiAgIDx0cj4KKyAqICAgICA8dGQgYWxpZ249Y2VudGVyPjxjb2RlPmFkZENoaWxkPC9jb2RlPjwvdGQ+CisgKiAgICAgPHRkIGFsaWduPWNlbnRlcj48Y29kZT5Db250YWluZXI8L2NvZGU+PC90ZD4KKyAqICAgICA8dGQ+Q2hpbGQgY29udGFpbmVyIGFkZGVkIHRvIHRoaXMgQ29udGFpbmVyLjwvdGQ+CisgKiAgIDwvdHI+CisgKiAgIDx0cj4KKyAqICAgICA8dGQgYWxpZ249Y2VudGVyPjxjb2RlPmFkZFZhbHZlPC9jb2RlPjwvdGQ+CisgKiAgICAgPHRkIGFsaWduPWNlbnRlcj48Y29kZT5WYWx2ZTwvY29kZT48L3RkPgorICogICAgIDx0ZD5WYWx2ZSBhZGRlZCB0byB0aGlzIENvbnRhaW5lci48L3RkPgorICogICA8L3RyPgorICogICA8dHI+CisgKiAgICAgPHRkIGFsaWduPWNlbnRlcj48Y29kZT5yZW1vdmVDaGlsZDwvY29kZT48L3RkPgorICogICAgIDx0ZCBhbGlnbj1jZW50ZXI+PGNvZGU+Q29udGFpbmVyPC9jb2RlPjwvdGQ+CisgKiAgICAgPHRkPkNoaWxkIGNvbnRhaW5lciByZW1vdmVkIGZyb20gdGhpcyBDb250YWluZXIuPC90ZD4KKyAqICAgPC90cj4KKyAqICAgPHRyPgorICogICAgIDx0ZCBhbGlnbj1jZW50ZXI+PGNvZGU+cmVtb3ZlVmFsdmU8L2NvZGU+PC90ZD4KKyAqICAgICA8dGQgYWxpZ249Y2VudGVyPjxjb2RlPlZhbHZlPC9jb2RlPjwvdGQ+CisgKiAgICAgPHRkPlZhbHZlIHJlbW92ZWQgZnJvbSB0aGlzIENvbnRhaW5lci48L3RkPgorICogICA8L3RyPgorICogICA8dHI+CisgKiAgICAgPHRkIGFsaWduPWNlbnRlcj48Y29kZT5zdGFydDwvY29kZT48L3RkPgorICogICAgIDx0ZCBhbGlnbj1jZW50ZXI+PGNvZGU+bnVsbDwvY29kZT48L3RkPgorICogICAgIDx0ZD5Db250YWluZXIgd2FzIHN0YXJ0ZWQuPC90ZD4KKyAqICAgPC90cj4KKyAqICAgPHRyPgorICogICAgIDx0ZCBhbGlnbj1jZW50ZXI+PGNvZGU+c3RvcDwvY29kZT48L3RkPgorICogICAgIDx0ZCBhbGlnbj1jZW50ZXI+PGNvZGU+bnVsbDwvY29kZT48L3RkPgorICogICAgIDx0ZD5Db250YWluZXIgd2FzIHN0b3BwZWQuPC90ZD4KKyAqICAgPC90cj4KKyAqIDwvdGFibGU+CisgKiBTdWJjbGFzc2VzIHRoYXQgZmlyZSBhZGRpdGlvbmFsIGV2ZW50cyBzaG91bGQgZG9jdW1lbnQgdGhlbSBpbiB0aGUKKyAqIGNsYXNzIGNvbW1lbnRzIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcy4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqLworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29udGFpbmVyQmFzZQorICAgIGltcGxlbWVudHMgQ29udGFpbmVyLCBMaWZlY3ljbGUsIFBpcGVsaW5lLCBNQmVhblJlZ2lzdHJhdGlvbiwgU2VyaWFsaXphYmxlIHsKKworICAgIHByaXZhdGUgc3RhdGljIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZyBsb2c9CisgICAgICAgIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3RvcnkuZ2V0TG9nKCBDb250YWluZXJCYXNlLmNsYXNzICk7CisKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtIGFkZENoaWxkIHdpdGggdGhlIHBlcm1pc3Npb25zIG9mIHRoaXMgY2xhc3MuCisgICAgICogYWRkQ2hpbGQgY2FuIGJlIGNhbGxlZCB3aXRoIHRoZSBYTUwgcGFyc2VyIG9uIHRoZSBzdGFjaywKKyAgICAgKiB0aGlzIGFsbG93cyB0aGUgWE1MIHBhcnNlciB0byBoYXZlIGZld2VyIHByaXZpbGVnZXMgdGhhbgorICAgICAqIFRvbWNhdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgY2xhc3MgUHJpdmlsZWdlZEFkZENoaWxkCisgICAgICAgIGltcGxlbWVudHMgUHJpdmlsZWdlZEFjdGlvbiB7CisKKyAgICAgICAgcHJpdmF0ZSBDb250YWluZXIgY2hpbGQ7CisKKyAgICAgICAgUHJpdmlsZWdlZEFkZENoaWxkKENvbnRhaW5lciBjaGlsZCkgeworICAgICAgICAgICAgdGhpcy5jaGlsZCA9IGNoaWxkOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7CisgICAgICAgICAgICBhZGRDaGlsZEludGVybmFsKGNoaWxkKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgY2hpbGQgQ29udGFpbmVycyBiZWxvbmdpbmcgdG8gdGhpcyBDb250YWluZXIsIGtleWVkIGJ5IG5hbWUuCisgICAgICovCisgICAgcHJvdGVjdGVkIEhhc2hNYXAgY2hpbGRyZW4gPSBuZXcgSGFzaE1hcCgpOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgcHJvY2Vzc29yIGRlbGF5IGZvciB0aGlzIGNvbXBvbmVudC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IGJhY2tncm91bmRQcm9jZXNzb3JEZWxheSA9IC0xOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgbGlmZWN5Y2xlIGV2ZW50IHN1cHBvcnQgZm9yIHRoaXMgY29tcG9uZW50LgorICAgICAqLworICAgIHByb3RlY3RlZCBMaWZlY3ljbGVTdXBwb3J0IGxpZmVjeWNsZSA9IG5ldyBMaWZlY3ljbGVTdXBwb3J0KHRoaXMpOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgY29udGFpbmVyIGV2ZW50IGxpc3RlbmVycyBmb3IgdGhpcyBDb250YWluZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIEFycmF5TGlzdCBsaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0KCk7CisKKworICAgIC8qKgorICAgICAqIFRoZSBMb2FkZXIgaW1wbGVtZW50YXRpb24gd2l0aCB3aGljaCB0aGlzIENvbnRhaW5lciBpcyBhc3NvY2lhdGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCBMb2FkZXIgbG9hZGVyID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIExvZ2dlciBpbXBsZW1lbnRhdGlvbiB3aXRoIHdoaWNoIHRoaXMgQ29udGFpbmVyIGlzIGFzc29jaWF0ZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIExvZyBsb2dnZXIgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBBc3NvY2lhdGVkIGxvZ2dlciBuYW1lLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgbG9nTmFtZSA9IG51bGw7CisgICAgCisKKyAgICAvKioKKyAgICAgKiBUaGUgTWFuYWdlciBpbXBsZW1lbnRhdGlvbiB3aXRoIHdoaWNoIHRoaXMgQ29udGFpbmVyIGlzIGFzc29jaWF0ZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIE1hbmFnZXIgbWFuYWdlciA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBjbHVzdGVyIHdpdGggd2hpY2ggdGhpcyBDb250YWluZXIgaXMgYXNzb2NpYXRlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ2x1c3RlciBjbHVzdGVyID0gbnVsbDsKKworICAgIAorICAgIC8qKgorICAgICAqIFRoZSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoaXMgQ29udGFpbmVyLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBwYXJlbnQgQ29udGFpbmVyIHRvIHdoaWNoIHRoaXMgQ29udGFpbmVyIGlzIGEgY2hpbGQuCisgICAgICovCisgICAgcHJvdGVjdGVkIENvbnRhaW5lciBwYXJlbnQgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgcGFyZW50IGNsYXNzIGxvYWRlciB0byBiZSBjb25maWd1cmVkIHdoZW4gd2UgaW5zdGFsbCBhIExvYWRlci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ2xhc3NMb2FkZXIgcGFyZW50Q2xhc3NMb2FkZXIgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgUGlwZWxpbmUgb2JqZWN0IHdpdGggd2hpY2ggdGhpcyBDb250YWluZXIgaXMgYXNzb2NpYXRlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUGlwZWxpbmUgcGlwZWxpbmUgPSBuZXcgU3RhbmRhcmRQaXBlbGluZSh0aGlzKTsKKworCisgICAgLyoqCisgICAgICogVGhlIFJlYWxtIHdpdGggd2hpY2ggdGhpcyBDb250YWluZXIgaXMgYXNzb2NpYXRlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUmVhbG0gcmVhbG0gPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgcmVzb3VyY2VzIERpckNvbnRleHQgb2JqZWN0IHdpdGggd2hpY2ggdGhpcyBDb250YWluZXIgaXMgYXNzb2NpYXRlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRGlyQ29udGV4dCByZXNvdXJjZXMgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc3RyaW5nIG1hbmFnZXIgZm9yIHRoaXMgcGFja2FnZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZ01hbmFnZXIgc20gPQorICAgICAgICBTdHJpbmdNYW5hZ2VyLmdldE1hbmFnZXIoQ29uc3RhbnRzLlBhY2thZ2UpOworCisKKyAgICAvKioKKyAgICAgKiBIYXMgdGhpcyBjb21wb25lbnQgYmVlbiBzdGFydGVkPworICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIHN0YXJ0ZWQgPSBmYWxzZTsKKworICAgIHByb3RlY3RlZCBib29sZWFuIGluaXRpYWxpemVkPWZhbHNlOworCisgICAgLyoqCisgICAgICogVGhlIHByb3BlcnR5IGNoYW5nZSBzdXBwb3J0IGZvciB0aGlzIGNvbXBvbmVudC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VTdXBwb3J0IHN1cHBvcnQgPSBuZXcgUHJvcGVydHlDaGFuZ2VTdXBwb3J0KHRoaXMpOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgYmFja2dyb3VuZCB0aHJlYWQuCisgICAgICovCisgICAgcHJpdmF0ZSBUaHJlYWQgdGhyZWFkID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIGJhY2tncm91bmQgdGhyZWFkIGNvbXBsZXRpb24gc2VtYXBob3JlLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiB0aHJlYWREb25lID0gZmFsc2U7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGRlbGF5IGJldHdlZW4gdGhlIGludm9jYXRpb24gb2YgdGhlIGJhY2tncm91bmRQcm9jZXNzIG1ldGhvZCBvbgorICAgICAqIHRoaXMgY29udGFpbmVyIGFuZCBpdHMgY2hpbGRyZW4uIENoaWxkIGNvbnRhaW5lcnMgd2lsbCBub3QgYmUgaW52b2tlZAorICAgICAqIGlmIHRoZWlyIGRlbGF5IHZhbHVlIGlzIG5vdCBuZWdhdGl2ZSAod2hpY2ggd291bGQgbWVhbiB0aGV5IGFyZSB1c2luZyAKKyAgICAgKiB0aGVpciBvd24gdGhyZWFkKS4gU2V0dGluZyB0aGlzIHRvIGEgcG9zaXRpdmUgdmFsdWUgd2lsbCBjYXVzZSAKKyAgICAgKiBhIHRocmVhZCB0byBiZSBzcGF3bi4gQWZ0ZXIgd2FpdGluZyB0aGUgc3BlY2lmaWVkIGFtb3VudCBvZiB0aW1lLCAKKyAgICAgKiB0aGUgdGhyZWFkIHdpbGwgaW52b2tlIHRoZSBleGVjdXRlUGVyaW9kaWMgbWV0aG9kIG9uIHRoaXMgY29udGFpbmVyIAorICAgICAqIGFuZCBhbGwgaXRzIGNoaWxkcmVuLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0QmFja2dyb3VuZFByb2Nlc3NvckRlbGF5KCkgeworICAgICAgICByZXR1cm4gYmFja2dyb3VuZFByb2Nlc3NvckRlbGF5OworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBkZWxheSBiZXR3ZWVuIHRoZSBpbnZvY2F0aW9uIG9mIHRoZSBleGVjdXRlIG1ldGhvZCBvbiB0aGlzCisgICAgICogY29udGFpbmVyIGFuZCBpdHMgY2hpbGRyZW4uCisgICAgICogCisgICAgICogQHBhcmFtIGRlbGF5IFRoZSBkZWxheSBpbiBzZWNvbmRzIGJldHdlZW4gdGhlIGludm9jYXRpb24gb2YgCisgICAgICogICAgICAgICAgICAgIGJhY2tncm91bmRQcm9jZXNzIG1ldGhvZHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRCYWNrZ3JvdW5kUHJvY2Vzc29yRGVsYXkoaW50IGRlbGF5KSB7CisgICAgICAgIGJhY2tncm91bmRQcm9jZXNzb3JEZWxheSA9IGRlbGF5OworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgQ29udGFpbmVyIGltcGxlbWVudGF0aW9uIGFuZAorICAgICAqIHRoZSBjb3JyZXNwb25kaW5nIHZlcnNpb24gbnVtYmVyLCBpbiB0aGUgZm9ybWF0CisgICAgICogPGNvZGU+Jmx0O2Rlc2NyaXB0aW9uJmd0Oy8mbHQ7dmVyc2lvbiZndDs8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5mbygpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIExvYWRlciB3aXRoIHdoaWNoIHRoaXMgQ29udGFpbmVyIGlzIGFzc29jaWF0ZWQuICBJZiB0aGVyZSBpcworICAgICAqIG5vIGFzc29jaWF0ZWQgTG9hZGVyLCByZXR1cm4gdGhlIExvYWRlciBhc3NvY2lhdGVkIHdpdGggb3VyIHBhcmVudAorICAgICAqIENvbnRhaW5lciAoaWYgYW55KTsgb3RoZXJ3aXNlLCByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIExvYWRlciBnZXRMb2FkZXIoKSB7CisKKyAgICAgICAgaWYgKGxvYWRlciAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChsb2FkZXIpOworICAgICAgICBpZiAocGFyZW50ICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKHBhcmVudC5nZXRMb2FkZXIoKSk7CisgICAgICAgIHJldHVybiAobnVsbCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgTG9hZGVyIHdpdGggd2hpY2ggdGhpcyBDb250YWluZXIgaXMgYXNzb2NpYXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsb2FkZXIgVGhlIG5ld2x5IGFzc29jaWF0ZWQgbG9hZGVyCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldExvYWRlcihMb2FkZXIgbG9hZGVyKSB7CisKKyAgICAgICAgLy8gQ2hhbmdlIGNvbXBvbmVudHMgaWYgbmVjZXNzYXJ5CisgICAgICAgIExvYWRlciBvbGRMb2FkZXIgPSB0aGlzLmxvYWRlcjsKKyAgICAgICAgaWYgKG9sZExvYWRlciA9PSBsb2FkZXIpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIHRoaXMubG9hZGVyID0gbG9hZGVyOworCisgICAgICAgIC8vIFN0b3AgdGhlIG9sZCBjb21wb25lbnQgaWYgbmVjZXNzYXJ5CisgICAgICAgIGlmIChzdGFydGVkICYmIChvbGRMb2FkZXIgIT0gbnVsbCkgJiYKKyAgICAgICAgICAgIChvbGRMb2FkZXIgaW5zdGFuY2VvZiBMaWZlY3ljbGUpKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICgoTGlmZWN5Y2xlKSBvbGRMb2FkZXIpLnN0b3AoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKExpZmVjeWNsZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJDb250YWluZXJCYXNlLnNldExvYWRlcjogc3RvcDogIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBTdGFydCB0aGUgbmV3IGNvbXBvbmVudCBpZiBuZWNlc3NhcnkKKyAgICAgICAgaWYgKGxvYWRlciAhPSBudWxsKQorICAgICAgICAgICAgbG9hZGVyLnNldENvbnRhaW5lcih0aGlzKTsKKyAgICAgICAgaWYgKHN0YXJ0ZWQgJiYgKGxvYWRlciAhPSBudWxsKSAmJgorICAgICAgICAgICAgKGxvYWRlciBpbnN0YW5jZW9mIExpZmVjeWNsZSkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgKChMaWZlY3ljbGUpIGxvYWRlcikuc3RhcnQoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKExpZmVjeWNsZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJDb250YWluZXJCYXNlLnNldExvYWRlcjogc3RhcnQ6ICIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gUmVwb3J0IHRoaXMgcHJvcGVydHkgY2hhbmdlIHRvIGludGVyZXN0ZWQgbGlzdGVuZXJzCisgICAgICAgIHN1cHBvcnQuZmlyZVByb3BlcnR5Q2hhbmdlKCJsb2FkZXIiLCBvbGRMb2FkZXIsIHRoaXMubG9hZGVyKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBMb2dnZXIgd2l0aCB3aGljaCB0aGlzIENvbnRhaW5lciBpcyBhc3NvY2lhdGVkLiAgSWYgdGhlcmUgaXMKKyAgICAgKiBubyBhc3NvY2lhdGVkIExvZ2dlciwgcmV0dXJuIHRoZSBMb2dnZXIgYXNzb2NpYXRlZCB3aXRoIG91ciBwYXJlbnQKKyAgICAgKiBDb250YWluZXIgKGlmIGFueSk7IG90aGVyd2lzZSByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIExvZyBnZXRMb2dnZXIoKSB7CisKKyAgICAgICAgaWYgKGxvZ2dlciAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChsb2dnZXIpOworICAgICAgICBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhsb2dOYW1lKCkpOworICAgICAgICByZXR1cm4gKGxvZ2dlcik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgTWFuYWdlciB3aXRoIHdoaWNoIHRoaXMgQ29udGFpbmVyIGlzIGFzc29jaWF0ZWQuICBJZiB0aGVyZSBpcworICAgICAqIG5vIGFzc29jaWF0ZWQgTWFuYWdlciwgcmV0dXJuIHRoZSBNYW5hZ2VyIGFzc29jaWF0ZWQgd2l0aCBvdXIgcGFyZW50CisgICAgICogQ29udGFpbmVyIChpZiBhbnkpOyBvdGhlcndpc2UgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBNYW5hZ2VyIGdldE1hbmFnZXIoKSB7CisKKyAgICAgICAgaWYgKG1hbmFnZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAobWFuYWdlcik7CisgICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAocGFyZW50LmdldE1hbmFnZXIoKSk7CisgICAgICAgIHJldHVybiAobnVsbCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgTWFuYWdlciB3aXRoIHdoaWNoIHRoaXMgQ29udGFpbmVyIGlzIGFzc29jaWF0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFuYWdlciBUaGUgbmV3bHkgYXNzb2NpYXRlZCBNYW5hZ2VyCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldE1hbmFnZXIoTWFuYWdlciBtYW5hZ2VyKSB7CisKKyAgICAgICAgLy8gQ2hhbmdlIGNvbXBvbmVudHMgaWYgbmVjZXNzYXJ5CisgICAgICAgIE1hbmFnZXIgb2xkTWFuYWdlciA9IHRoaXMubWFuYWdlcjsKKyAgICAgICAgaWYgKG9sZE1hbmFnZXIgPT0gbWFuYWdlcikKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKKworICAgICAgICAvLyBTdG9wIHRoZSBvbGQgY29tcG9uZW50IGlmIG5lY2Vzc2FyeQorICAgICAgICBpZiAoc3RhcnRlZCAmJiAob2xkTWFuYWdlciAhPSBudWxsKSAmJgorICAgICAgICAgICAgKG9sZE1hbmFnZXIgaW5zdGFuY2VvZiBMaWZlY3ljbGUpKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICgoTGlmZWN5Y2xlKSBvbGRNYW5hZ2VyKS5zdG9wKCk7CisgICAgICAgICAgICB9IGNhdGNoIChMaWZlY3ljbGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiQ29udGFpbmVyQmFzZS5zZXRNYW5hZ2VyOiBzdG9wOiAiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFN0YXJ0IHRoZSBuZXcgY29tcG9uZW50IGlmIG5lY2Vzc2FyeQorICAgICAgICBpZiAobWFuYWdlciAhPSBudWxsKQorICAgICAgICAgICAgbWFuYWdlci5zZXRDb250YWluZXIodGhpcyk7CisgICAgICAgIGlmIChzdGFydGVkICYmIChtYW5hZ2VyICE9IG51bGwpICYmCisgICAgICAgICAgICAobWFuYWdlciBpbnN0YW5jZW9mIExpZmVjeWNsZSkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgKChMaWZlY3ljbGUpIG1hbmFnZXIpLnN0YXJ0KCk7CisgICAgICAgICAgICB9IGNhdGNoIChMaWZlY3ljbGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiQ29udGFpbmVyQmFzZS5zZXRNYW5hZ2VyOiBzdGFydDogIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXBvcnQgdGhpcyBwcm9wZXJ0eSBjaGFuZ2UgdG8gaW50ZXJlc3RlZCBsaXN0ZW5lcnMKKyAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoIm1hbmFnZXIiLCBvbGRNYW5hZ2VyLCB0aGlzLm1hbmFnZXIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYW4gb2JqZWN0IHdoaWNoIG1heSBiZSB1dGlsaXplZCBmb3IgbWFwcGluZyB0byB0aGlzIGNvbXBvbmVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldE1hcHBpbmdPYmplY3QoKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBDbHVzdGVyIHdpdGggd2hpY2ggdGhpcyBDb250YWluZXIgaXMgYXNzb2NpYXRlZC4gIElmIHRoZXJlIGlzCisgICAgICogbm8gYXNzb2NpYXRlZCBDbHVzdGVyLCByZXR1cm4gdGhlIENsdXN0ZXIgYXNzb2NpYXRlZCB3aXRoIG91ciBwYXJlbnQKKyAgICAgKiBDb250YWluZXIgKGlmIGFueSk7IG90aGVyd2lzZSByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIENsdXN0ZXIgZ2V0Q2x1c3RlcigpIHsKKyAgICAgICAgaWYgKGNsdXN0ZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAoY2x1c3Rlcik7CisKKyAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChwYXJlbnQuZ2V0Q2x1c3RlcigpKTsKKworICAgICAgICByZXR1cm4gKG51bGwpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBDbHVzdGVyIHdpdGggd2hpY2ggdGhpcyBDb250YWluZXIgaXMgYXNzb2NpYXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbHVzdGVyIFRoZSBuZXdseSBhc3NvY2lhdGVkIENsdXN0ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0Q2x1c3RlcihDbHVzdGVyIGNsdXN0ZXIpIHsKKyAgICAgICAgLy8gQ2hhbmdlIGNvbXBvbmVudHMgaWYgbmVjZXNzYXJ5CisgICAgICAgIENsdXN0ZXIgb2xkQ2x1c3RlciA9IHRoaXMuY2x1c3RlcjsKKyAgICAgICAgaWYgKG9sZENsdXN0ZXIgPT0gY2x1c3RlcikKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgdGhpcy5jbHVzdGVyID0gY2x1c3RlcjsKKworICAgICAgICAvLyBTdG9wIHRoZSBvbGQgY29tcG9uZW50IGlmIG5lY2Vzc2FyeQorICAgICAgICBpZiAoc3RhcnRlZCAmJiAob2xkQ2x1c3RlciAhPSBudWxsKSAmJgorICAgICAgICAgICAgKG9sZENsdXN0ZXIgaW5zdGFuY2VvZiBMaWZlY3ljbGUpKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICgoTGlmZWN5Y2xlKSBvbGRDbHVzdGVyKS5zdG9wKCk7CisgICAgICAgICAgICB9IGNhdGNoIChMaWZlY3ljbGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiQ29udGFpbmVyQmFzZS5zZXRDbHVzdGVyOiBzdG9wOiAiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFN0YXJ0IHRoZSBuZXcgY29tcG9uZW50IGlmIG5lY2Vzc2FyeQorICAgICAgICBpZiAoY2x1c3RlciAhPSBudWxsKQorICAgICAgICAgICAgY2x1c3Rlci5zZXRDb250YWluZXIodGhpcyk7CisKKyAgICAgICAgaWYgKHN0YXJ0ZWQgJiYgKGNsdXN0ZXIgIT0gbnVsbCkgJiYKKyAgICAgICAgICAgIChjbHVzdGVyIGluc3RhbmNlb2YgTGlmZWN5Y2xlKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAoKExpZmVjeWNsZSkgY2x1c3Rlcikuc3RhcnQoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKExpZmVjeWNsZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJDb250YWluZXJCYXNlLnNldENsdXN0ZXI6IHN0YXJ0OiAiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlcG9ydCB0aGlzIHByb3BlcnR5IGNoYW5nZSB0byBpbnRlcmVzdGVkIGxpc3RlbmVycworICAgICAgICBzdXBwb3J0LmZpcmVQcm9wZXJ0eUNoYW5nZSgiY2x1c3RlciIsIG9sZENsdXN0ZXIsIHRoaXMuY2x1c3Rlcik7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBuYW1lIHN0cmluZyAoc3VpdGFibGUgZm9yIHVzZSBieSBodW1hbnMpIHRoYXQgZGVzY3JpYmVzIHRoaXMKKyAgICAgKiBDb250YWluZXIuICBXaXRoaW4gdGhlIHNldCBvZiBjaGlsZCBjb250YWluZXJzIGJlbG9uZ2luZyB0byBhIHBhcnRpY3VsYXIKKyAgICAgKiBwYXJlbnQsIENvbnRhaW5lciBuYW1lcyBtdXN0IGJlIHVuaXF1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisKKyAgICAgICAgcmV0dXJuIChuYW1lKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IGEgbmFtZSBzdHJpbmcgKHN1aXRhYmxlIGZvciB1c2UgYnkgaHVtYW5zKSB0aGF0IGRlc2NyaWJlcyB0aGlzCisgICAgICogQ29udGFpbmVyLiAgV2l0aGluIHRoZSBzZXQgb2YgY2hpbGQgY29udGFpbmVycyBiZWxvbmdpbmcgdG8gYSBwYXJ0aWN1bGFyCisgICAgICogcGFyZW50LCBDb250YWluZXIgbmFtZXMgbXVzdCBiZSB1bmlxdWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOZXcgbmFtZSBvZiB0aGlzIGNvbnRhaW5lcgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhpcyBDb250YWluZXIgaGFzIGFscmVhZHkgYmVlbgorICAgICAqICBhZGRlZCB0byB0aGUgY2hpbGRyZW4gb2YgYSBwYXJlbnQgQ29udGFpbmVyIChhZnRlciB3aGljaCB0aGUgbmFtZQorICAgICAqICBtYXkgbm90IGJlIGNoYW5nZWQpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworCisgICAgICAgIFN0cmluZyBvbGROYW1lID0gdGhpcy5uYW1lOworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICBzdXBwb3J0LmZpcmVQcm9wZXJ0eUNoYW5nZSgibmFtZSIsIG9sZE5hbWUsIHRoaXMubmFtZSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIENvbnRhaW5lciBmb3Igd2hpY2ggdGhpcyBDb250YWluZXIgaXMgYSBjaGlsZCwgaWYgdGhlcmUgaXMKKyAgICAgKiBvbmUuICBJZiB0aGVyZSBpcyBubyBkZWZpbmVkIHBhcmVudCwgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBDb250YWluZXIgZ2V0UGFyZW50KCkgeworCisgICAgICAgIHJldHVybiAocGFyZW50KTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBwYXJlbnQgQ29udGFpbmVyIHRvIHdoaWNoIHRoaXMgQ29udGFpbmVyIGlzIGJlaW5nIGFkZGVkIGFzIGEKKyAgICAgKiBjaGlsZC4gIFRoaXMgQ29udGFpbmVyIG1heSByZWZ1c2UgdG8gYmVjb21lIGF0dGFjaGVkIHRvIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBDb250YWluZXIgYnkgdGhyb3dpbmcgYW4gZXhjZXB0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRhaW5lciBDb250YWluZXIgdG8gd2hpY2ggdGhpcyBDb250YWluZXIgaXMgYmVpbmcgYWRkZWQKKyAgICAgKiAgYXMgYSBjaGlsZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhpcyBDb250YWluZXIgcmVmdXNlcyB0byBiZWNvbWUKKyAgICAgKiAgYXR0YWNoZWQgdG8gdGhlIHNwZWNpZmllZCBDb250YWluZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXJlbnQoQ29udGFpbmVyIGNvbnRhaW5lcikgeworCisgICAgICAgIENvbnRhaW5lciBvbGRQYXJlbnQgPSB0aGlzLnBhcmVudDsKKyAgICAgICAgdGhpcy5wYXJlbnQgPSBjb250YWluZXI7CisgICAgICAgIHN1cHBvcnQuZmlyZVByb3BlcnR5Q2hhbmdlKCJwYXJlbnQiLCBvbGRQYXJlbnQsIHRoaXMucGFyZW50KTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBwYXJlbnQgY2xhc3MgbG9hZGVyIChpZiBhbnkpIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KKyAgICAgKiBUaGlzIGNhbGwgaXMgbWVhbmluZ2Z1bCBvbmx5IDxzdHJvbmc+YWZ0ZXI8L3N0cm9uZz4gYSBMb2FkZXIgaGFzCisgICAgICogYmVlbiBjb25maWd1cmVkLgorICAgICAqLworICAgIHB1YmxpYyBDbGFzc0xvYWRlciBnZXRQYXJlbnRDbGFzc0xvYWRlcigpIHsKKyAgICAgICAgaWYgKHBhcmVudENsYXNzTG9hZGVyICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKHBhcmVudENsYXNzTG9hZGVyKTsKKyAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gKHBhcmVudC5nZXRQYXJlbnRDbGFzc0xvYWRlcigpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKENsYXNzTG9hZGVyLmdldFN5c3RlbUNsYXNzTG9hZGVyKCkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHBhcmVudCBjbGFzcyBsb2FkZXIgKGlmIGFueSkgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorICAgICAqIFRoaXMgY2FsbCBpcyBtZWFuaW5nZnVsIG9ubHkgPHN0cm9uZz5iZWZvcmU8L3N0cm9uZz4gYSBMb2FkZXIgaGFzCisgICAgICogYmVlbiBjb25maWd1cmVkLCBhbmQgdGhlIHNwZWNpZmllZCB2YWx1ZSAoaWYgbm9uLW51bGwpIHNob3VsZCBiZQorICAgICAqIHBhc3NlZCBhcyBhbiBhcmd1bWVudCB0byB0aGUgY2xhc3MgbG9hZGVyIGNvbnN0cnVjdG9yLgorICAgICAqCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyZW50IFRoZSBuZXcgcGFyZW50IGNsYXNzIGxvYWRlcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhcmVudENsYXNzTG9hZGVyKENsYXNzTG9hZGVyIHBhcmVudCkgeworICAgICAgICBDbGFzc0xvYWRlciBvbGRQYXJlbnRDbGFzc0xvYWRlciA9IHRoaXMucGFyZW50Q2xhc3NMb2FkZXI7CisgICAgICAgIHRoaXMucGFyZW50Q2xhc3NMb2FkZXIgPSBwYXJlbnQ7CisgICAgICAgIHN1cHBvcnQuZmlyZVByb3BlcnR5Q2hhbmdlKCJwYXJlbnRDbGFzc0xvYWRlciIsIG9sZFBhcmVudENsYXNzTG9hZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcmVudENsYXNzTG9hZGVyKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBQaXBlbGluZSBvYmplY3QgdGhhdCBtYW5hZ2VzIHRoZSBWYWx2ZXMgYXNzb2NpYXRlZCB3aXRoCisgICAgICogdGhpcyBDb250YWluZXIuCisgICAgICovCisgICAgcHVibGljIFBpcGVsaW5lIGdldFBpcGVsaW5lKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5waXBlbGluZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgUmVhbG0gd2l0aCB3aGljaCB0aGlzIENvbnRhaW5lciBpcyBhc3NvY2lhdGVkLiAgSWYgdGhlcmUgaXMKKyAgICAgKiBubyBhc3NvY2lhdGVkIFJlYWxtLCByZXR1cm4gdGhlIFJlYWxtIGFzc29jaWF0ZWQgd2l0aCBvdXIgcGFyZW50CisgICAgICogQ29udGFpbmVyIChpZiBhbnkpOyBvdGhlcndpc2UgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBSZWFsbSBnZXRSZWFsbSgpIHsKKworICAgICAgICBpZiAocmVhbG0gIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAocmVhbG0pOworICAgICAgICBpZiAocGFyZW50ICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKHBhcmVudC5nZXRSZWFsbSgpKTsKKyAgICAgICAgcmV0dXJuIChudWxsKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBSZWFsbSB3aXRoIHdoaWNoIHRoaXMgQ29udGFpbmVyIGlzIGFzc29jaWF0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVhbG0gVGhlIG5ld2x5IGFzc29jaWF0ZWQgUmVhbG0KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0UmVhbG0oUmVhbG0gcmVhbG0pIHsKKworICAgICAgICAvLyBDaGFuZ2UgY29tcG9uZW50cyBpZiBuZWNlc3NhcnkKKyAgICAgICAgUmVhbG0gb2xkUmVhbG0gPSB0aGlzLnJlYWxtOworICAgICAgICBpZiAob2xkUmVhbG0gPT0gcmVhbG0pCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIHRoaXMucmVhbG0gPSByZWFsbTsKKworICAgICAgICAvLyBTdG9wIHRoZSBvbGQgY29tcG9uZW50IGlmIG5lY2Vzc2FyeQorICAgICAgICBpZiAoc3RhcnRlZCAmJiAob2xkUmVhbG0gIT0gbnVsbCkgJiYKKyAgICAgICAgICAgIChvbGRSZWFsbSBpbnN0YW5jZW9mIExpZmVjeWNsZSkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgKChMaWZlY3ljbGUpIG9sZFJlYWxtKS5zdG9wKCk7CisgICAgICAgICAgICB9IGNhdGNoIChMaWZlY3ljbGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiQ29udGFpbmVyQmFzZS5zZXRSZWFsbTogc3RvcDogIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBTdGFydCB0aGUgbmV3IGNvbXBvbmVudCBpZiBuZWNlc3NhcnkKKyAgICAgICAgaWYgKHJlYWxtICE9IG51bGwpCisgICAgICAgICAgICByZWFsbS5zZXRDb250YWluZXIodGhpcyk7CisgICAgICAgIGlmIChzdGFydGVkICYmIChyZWFsbSAhPSBudWxsKSAmJgorICAgICAgICAgICAgKHJlYWxtIGluc3RhbmNlb2YgTGlmZWN5Y2xlKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAoKExpZmVjeWNsZSkgcmVhbG0pLnN0YXJ0KCk7CisgICAgICAgICAgICB9IGNhdGNoIChMaWZlY3ljbGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiQ29udGFpbmVyQmFzZS5zZXRSZWFsbTogc3RhcnQ6ICIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gUmVwb3J0IHRoaXMgcHJvcGVydHkgY2hhbmdlIHRvIGludGVyZXN0ZWQgbGlzdGVuZXJzCisgICAgICAgIHN1cHBvcnQuZmlyZVByb3BlcnR5Q2hhbmdlKCJyZWFsbSIsIG9sZFJlYWxtLCB0aGlzLnJlYWxtKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICAqIFJldHVybiB0aGUgcmVzb3VyY2VzIERpckNvbnRleHQgb2JqZWN0IHdpdGggd2hpY2ggdGhpcyBDb250YWluZXIgaXMKKyAgICAgICogYXNzb2NpYXRlZC4gIElmIHRoZXJlIGlzIG5vIGFzc29jaWF0ZWQgcmVzb3VyY2VzIG9iamVjdCwgcmV0dXJuIHRoZQorICAgICAgKiByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIG91ciBwYXJlbnQgQ29udGFpbmVyIChpZiBhbnkpOyBvdGhlcndpc2UKKyAgICAgICogcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBEaXJDb250ZXh0IGdldFJlc291cmNlcygpIHsKKyAgICAgICAgaWYgKHJlc291cmNlcyAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChyZXNvdXJjZXMpOworICAgICAgICBpZiAocGFyZW50ICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKHBhcmVudC5nZXRSZXNvdXJjZXMoKSk7CisgICAgICAgIHJldHVybiAobnVsbCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcmVzb3VyY2VzIERpckNvbnRleHQgb2JqZWN0IHdpdGggd2hpY2ggdGhpcyBDb250YWluZXIgaXMKKyAgICAgKiBhc3NvY2lhdGVkLgorICAgICAqCisgICAgICogQHBhcmFtIHJlc291cmNlcyBUaGUgbmV3bHkgYXNzb2NpYXRlZCBEaXJDb250ZXh0CisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFJlc291cmNlcyhEaXJDb250ZXh0IHJlc291cmNlcykgeworICAgICAgICAvLyBDYWxsZWQgZnJvbSBTdGFuZGFyZENvbnRleHQuc2V0UmVzb3VyY2VzKCkKKyAgICAgICAgLy8gICAgICAgICAgICAgIDwtIFN0YW5kYXJkQ29udGV4dC5zdGFydCgpIAorICAgICAgICAvLyAgICAgICAgICAgICAgPC0gQ29udGFpbmVyQmFzZS5hZGRDaGlsZEludGVybmFsKCkgCisKKyAgICAgICAgLy8gQ2hhbmdlIGNvbXBvbmVudHMgaWYgbmVjZXNzYXJ5CisgICAgICAgIERpckNvbnRleHQgb2xkUmVzb3VyY2VzID0gdGhpcy5yZXNvdXJjZXM7CisgICAgICAgIGlmIChvbGRSZXNvdXJjZXMgPT0gcmVzb3VyY2VzKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBIYXNodGFibGUgZW52ID0gbmV3IEhhc2h0YWJsZSgpOworICAgICAgICBpZiAoZ2V0UGFyZW50KCkgIT0gbnVsbCkKKyAgICAgICAgICAgIGVudi5wdXQoUHJveHlEaXJDb250ZXh0LkhPU1QsIGdldFBhcmVudCgpLmdldE5hbWUoKSk7CisgICAgICAgIGVudi5wdXQoUHJveHlEaXJDb250ZXh0LkNPTlRFWFQsIGdldE5hbWUoKSk7CisgICAgICAgIHRoaXMucmVzb3VyY2VzID0gbmV3IFByb3h5RGlyQ29udGV4dChlbnYsIHJlc291cmNlcyk7CisgICAgICAgIC8vIFJlcG9ydCB0aGlzIHByb3BlcnR5IGNoYW5nZSB0byBpbnRlcmVzdGVkIGxpc3RlbmVycworICAgICAgICBzdXBwb3J0LmZpcmVQcm9wZXJ0eUNoYW5nZSgicmVzb3VyY2VzIiwgb2xkUmVzb3VyY2VzLCB0aGlzLnJlc291cmNlcyk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb250YWluZXIgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBuZXcgY2hpbGQgQ29udGFpbmVyIHRvIHRob3NlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIENvbnRhaW5lciwKKyAgICAgKiBpZiBzdXBwb3J0ZWQuICBQcmlvciB0byBhZGRpbmcgdGhpcyBDb250YWluZXIgdG8gdGhlIHNldCBvZiBjaGlsZHJlbiwKKyAgICAgKiB0aGUgY2hpbGQncyA8Y29kZT5zZXRQYXJlbnQoKTwvY29kZT4gbWV0aG9kIG11c3QgYmUgY2FsbGVkLCB3aXRoIHRoaXMKKyAgICAgKiBDb250YWluZXIgYXMgYW4gYXJndW1lbnQuICBUaGlzIG1ldGhvZCBtYXkgdGhyb3duIGFuCisgICAgICogPGNvZGU+SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uPC9jb2RlPiBpZiB0aGlzIENvbnRhaW5lciBjaG9vc2VzIG5vdAorICAgICAqIHRvIGJlIGF0dGFjaGVkIHRvIHRoZSBzcGVjaWZpZWQgQ29udGFpbmVyLCBpbiB3aGljaCBjYXNlIGl0IGlzIG5vdCBhZGRlZAorICAgICAqCisgICAgICogQHBhcmFtIGNoaWxkIE5ldyBjaGlsZCBDb250YWluZXIgdG8gYmUgYWRkZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoaXMgZXhjZXB0aW9uIGlzIHRocm93biBieQorICAgICAqICB0aGUgPGNvZGU+c2V0UGFyZW50KCk8L2NvZGU+IG1ldGhvZCBvZiB0aGUgY2hpbGQgQ29udGFpbmVyCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIG5ldyBjaGlsZCBkb2VzIG5vdCBoYXZlCisgICAgICogIGEgbmFtZSB1bmlxdWUgZnJvbSB0aGF0IG9mIGV4aXN0aW5nIGNoaWxkcmVuIG9mIHRoaXMgQ29udGFpbmVyCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhpcyBDb250YWluZXIgZG9lcyBub3Qgc3VwcG9ydAorICAgICAqICBjaGlsZCBDb250YWluZXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQ2hpbGQoQ29udGFpbmVyIGNoaWxkKSB7CisgICAgICAgIGlmIChTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgUHJpdmlsZWdlZEFjdGlvbiBkcCA9CisgICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRBZGRDaGlsZChjaGlsZCk7CisgICAgICAgICAgICBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChkcCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhZGRDaGlsZEludGVybmFsKGNoaWxkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhZGRDaGlsZEludGVybmFsKENvbnRhaW5lciBjaGlsZCkgeworCisgICAgICAgIGlmKCBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSApCisgICAgICAgICAgICBsb2cuZGVidWcoIkFkZCBjaGlsZCAiICsgY2hpbGQgKyAiICIgKyB0aGlzKTsKKyAgICAgICAgc3luY2hyb25pemVkKGNoaWxkcmVuKSB7CisgICAgICAgICAgICBpZiAoY2hpbGRyZW4uZ2V0KGNoaWxkLmdldE5hbWUoKSkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJhZGRDaGlsZDogIENoaWxkIG5hbWUgJyIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuZ2V0TmFtZSgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICInIGlzIG5vdCB1bmlxdWUiKTsKKyAgICAgICAgICAgIGNoaWxkLnNldFBhcmVudCh0aGlzKTsgIC8vIE1heSB0aHJvdyBJQUUKKyAgICAgICAgICAgIGlmIChzdGFydGVkICYmIChjaGlsZCBpbnN0YW5jZW9mIExpZmVjeWNsZSkpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAoKExpZmVjeWNsZSkgY2hpbGQpLnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoTGlmZWN5Y2xlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJDb250YWluZXJCYXNlLmFkZENoaWxkOiBzdGFydDogIiwgZSk7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICgiQ29udGFpbmVyQmFzZS5hZGRDaGlsZDogc3RhcnQ6ICIgKyBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjaGlsZHJlbi5wdXQoY2hpbGQuZ2V0TmFtZSgpLCBjaGlsZCk7CisKKyAgICAgICAgICAgIGZpcmVDb250YWluZXJFdmVudChBRERfQ0hJTERfRVZFTlQsIGNoaWxkKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBjb250YWluZXIgZXZlbnQgbGlzdGVuZXIgdG8gdGhpcyBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRvIGFkZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZENvbnRhaW5lckxpc3RlbmVyKENvbnRhaW5lckxpc3RlbmVyIGxpc3RlbmVyKSB7CisKKyAgICAgICAgc3luY2hyb25pemVkIChsaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgIGxpc3RlbmVycy5hZGQobGlzdGVuZXIpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEFkZCBhIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lciB0byB0aGlzIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgdG8gYWRkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisKKyAgICAgICAgc3VwcG9ydC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjaGlsZCBDb250YWluZXIsIGFzc29jaWF0ZWQgd2l0aCB0aGlzIENvbnRhaW5lciwgd2l0aAorICAgICAqIHRoZSBzcGVjaWZpZWQgbmFtZSAoaWYgYW55KTsgb3RoZXJ3aXNlLCByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIGNoaWxkIENvbnRhaW5lciB0byBiZSByZXRyaWV2ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgQ29udGFpbmVyIGZpbmRDaGlsZChTdHJpbmcgbmFtZSkgeworCisgICAgICAgIGlmIChuYW1lID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICBzeW5jaHJvbml6ZWQgKGNoaWxkcmVuKSB7ICAgICAgIC8vIFJlcXVpcmVkIGJ5IHBvc3Qtc3RhcnQgY2hhbmdlcworICAgICAgICAgICAgcmV0dXJuICgoQ29udGFpbmVyKSBjaGlsZHJlbi5nZXQobmFtZSkpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2V0IG9mIGNoaWxkcmVuIENvbnRhaW5lcnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgQ29udGFpbmVyLgorICAgICAqIElmIHRoaXMgQ29udGFpbmVyIGhhcyBubyBjaGlsZHJlbiwgYSB6ZXJvLWxlbmd0aCBhcnJheSBpcyByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29udGFpbmVyW10gZmluZENoaWxkcmVuKCkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAoY2hpbGRyZW4pIHsKKyAgICAgICAgICAgIENvbnRhaW5lciByZXN1bHRzW10gPSBuZXcgQ29udGFpbmVyW2NoaWxkcmVuLnNpemUoKV07CisgICAgICAgICAgICByZXR1cm4gKChDb250YWluZXJbXSkgY2hpbGRyZW4udmFsdWVzKCkudG9BcnJheShyZXN1bHRzKSk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXQgb2YgY29udGFpbmVyIGxpc3RlbmVycyBhc3NvY2lhdGVkIHdpdGggdGhpcyBDb250YWluZXIuCisgICAgICogSWYgdGhpcyBDb250YWluZXIgaGFzIG5vIHJlZ2lzdGVyZWQgY29udGFpbmVyIGxpc3RlbmVycywgYSB6ZXJvLWxlbmd0aAorICAgICAqIGFycmF5IGlzIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBDb250YWluZXJMaXN0ZW5lcltdIGZpbmRDb250YWluZXJMaXN0ZW5lcnMoKSB7CisKKyAgICAgICAgc3luY2hyb25pemVkIChsaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgIENvbnRhaW5lckxpc3RlbmVyW10gcmVzdWx0cyA9IAorICAgICAgICAgICAgICAgIG5ldyBDb250YWluZXJMaXN0ZW5lcltsaXN0ZW5lcnMuc2l6ZSgpXTsKKyAgICAgICAgICAgIHJldHVybiAoKENvbnRhaW5lckxpc3RlbmVyW10pIGxpc3RlbmVycy50b0FycmF5KHJlc3VsdHMpKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBzcGVjaWZpZWQgUmVxdWVzdCwgdG8gcHJvZHVjZSB0aGUgY29ycmVzcG9uZGluZyBSZXNwb25zZSwKKyAgICAgKiBieSBpbnZva2luZyB0aGUgZmlyc3QgVmFsdmUgaW4gb3VyIHBpcGVsaW5lIChpZiBhbnkpLCBvciB0aGUgYmFzaWMKKyAgICAgKiBWYWx2ZSBvdGhlcndpc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBSZXF1ZXN0IHRvIGJlIHByb2Nlc3NlZAorICAgICAqIEBwYXJhbSByZXNwb25zZSBSZXNwb25zZSB0byBiZSBwcm9kdWNlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgbmVpdGhlciBhIHBpcGVsaW5lIG9yIGEgYmFzaWMKKyAgICAgKiAgVmFsdmUgaGF2ZSBiZWVuIGNvbmZpZ3VyZWQgZm9yIHRoaXMgQ29udGFpbmVyCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJyZWQgd2hpbGUKKyAgICAgKiAgcHJvY2Vzc2luZworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIFNlcnZsZXRFeGNlcHRpb24gd2FzIHRocm93bgorICAgICAqICB3aGlsZSBwcm9jZXNzaW5nIHRoaXMgcmVxdWVzdAorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGludm9rZShSZXF1ZXN0IHJlcXVlc3QsIFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIHBpcGVsaW5lLmdldEZpcnN0KCkuaW52b2tlKHJlcXVlc3QsIHJlc3BvbnNlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGFuIGV4aXN0aW5nIGNoaWxkIENvbnRhaW5lciBmcm9tIGFzc29jaWF0aW9uIHdpdGggdGhpcyBwYXJlbnQKKyAgICAgKiBDb250YWluZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2hpbGQgRXhpc3RpbmcgY2hpbGQgQ29udGFpbmVyIHRvIGJlIHJlbW92ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVDaGlsZChDb250YWluZXIgY2hpbGQpIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQoY2hpbGRyZW4pIHsKKyAgICAgICAgICAgIGlmIChjaGlsZHJlbi5nZXQoY2hpbGQuZ2V0TmFtZSgpKSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIGNoaWxkcmVuLnJlbW92ZShjaGlsZC5nZXROYW1lKCkpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoc3RhcnRlZCAmJiAoY2hpbGQgaW5zdGFuY2VvZiBMaWZlY3ljbGUpKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmKCBjaGlsZCBpbnN0YW5jZW9mIENvbnRhaW5lckJhc2UgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKCAoKENvbnRhaW5lckJhc2UpY2hpbGQpLnN0YXJ0ZWQgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAoKExpZmVjeWNsZSkgY2hpbGQpLnN0b3AoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICgoTGlmZWN5Y2xlKSBjaGlsZCkuc3RvcCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKExpZmVjeWNsZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJDb250YWluZXJCYXNlLnJlbW92ZUNoaWxkOiBzdG9wOiAiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgZmlyZUNvbnRhaW5lckV2ZW50KFJFTU9WRV9DSElMRF9FVkVOVCwgY2hpbGQpOworICAgICAgICAKKyAgICAgICAgLy8gY2hpbGQuc2V0UGFyZW50KG51bGwpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSBjb250YWluZXIgZXZlbnQgbGlzdGVuZXIgZnJvbSB0aGlzIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgdG8gcmVtb3ZlCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlQ29udGFpbmVyTGlzdGVuZXIoQ29udGFpbmVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKGxpc3RlbmVycykgeworICAgICAgICAgICAgbGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGEgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyIGZyb20gdGhpcyBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRvIHJlbW92ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgeworCisgICAgICAgIHN1cHBvcnQucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBMaWZlY3ljbGUgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBsaWZlY3ljbGUgZXZlbnQgbGlzdGVuZXIgdG8gdGhpcyBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRvIGFkZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZExpZmVjeWNsZUxpc3RlbmVyKExpZmVjeWNsZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisKKyAgICAgICAgbGlmZWN5Y2xlLmFkZExpZmVjeWNsZUxpc3RlbmVyKGxpc3RlbmVyKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBsaWZlY3ljbGUgbGlzdGVuZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGxpZmVjeWNsZS4gSWYgdGhpcyAKKyAgICAgKiBMaWZlY3ljbGUgaGFzIG5vIGxpc3RlbmVycyByZWdpc3RlcmVkLCBhIHplcm8tbGVuZ3RoIGFycmF5IGlzIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBMaWZlY3ljbGVMaXN0ZW5lcltdIGZpbmRMaWZlY3ljbGVMaXN0ZW5lcnMoKSB7CisKKyAgICAgICAgcmV0dXJuIGxpZmVjeWNsZS5maW5kTGlmZWN5Y2xlTGlzdGVuZXJzKCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhIGxpZmVjeWNsZSBldmVudCBsaXN0ZW5lciBmcm9tIHRoaXMgY29tcG9uZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciB0byByZW1vdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVMaWZlY3ljbGVMaXN0ZW5lcihMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lcikgeworCisgICAgICAgIGxpZmVjeWNsZS5yZW1vdmVMaWZlY3ljbGVMaXN0ZW5lcihsaXN0ZW5lcik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFByZXBhcmUgZm9yIGFjdGl2ZSB1c2Ugb2YgdGhlIHB1YmxpYyBtZXRob2RzIG9mIHRoaXMgQ29tcG9uZW50LgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBMaWZlY3ljbGVFeGNlcHRpb24gaWYgdGhpcyBjb21wb25lbnQgZGV0ZWN0cyBhIGZhdGFsIGVycm9yCisgICAgICogIHRoYXQgcHJldmVudHMgaXQgZnJvbSBiZWluZyBzdGFydGVkCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHN0YXJ0KCkgdGhyb3dzIExpZmVjeWNsZUV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gVmFsaWRhdGUgYW5kIHVwZGF0ZSBvdXIgY3VycmVudCBjb21wb25lbnQgc3RhdGUKKyAgICAgICAgaWYgKHN0YXJ0ZWQpIHsKKyAgICAgICAgICAgIGxvZy5pbmZvKHNtLmdldFN0cmluZygiY29udGFpbmVyQmFzZS5hbHJlYWR5U3RhcnRlZCIsIGxvZ05hbWUoKSkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBOb3RpZnkgb3VyIGludGVyZXN0ZWQgTGlmZWN5Y2xlTGlzdGVuZXJzCisgICAgICAgIGxpZmVjeWNsZS5maXJlTGlmZWN5Y2xlRXZlbnQoQkVGT1JFX1NUQVJUX0VWRU5ULCBudWxsKTsKKworICAgICAgICBzdGFydGVkID0gdHJ1ZTsKKworICAgICAgICAvLyBTdGFydCBvdXIgc3Vib3JkaW5hdGUgY29tcG9uZW50cywgaWYgYW55CisgICAgICAgIGlmICgobG9hZGVyICE9IG51bGwpICYmIChsb2FkZXIgaW5zdGFuY2VvZiBMaWZlY3ljbGUpKQorICAgICAgICAgICAgKChMaWZlY3ljbGUpIGxvYWRlcikuc3RhcnQoKTsKKyAgICAgICAgZ2V0TG9nZ2VyKCk7CisgICAgICAgIGlmICgobG9nZ2VyICE9IG51bGwpICYmIChsb2dnZXIgaW5zdGFuY2VvZiBMaWZlY3ljbGUpKQorICAgICAgICAgICAgKChMaWZlY3ljbGUpIGxvZ2dlcikuc3RhcnQoKTsKKyAgICAgICAgaWYgKChtYW5hZ2VyICE9IG51bGwpICYmIChtYW5hZ2VyIGluc3RhbmNlb2YgTGlmZWN5Y2xlKSkKKyAgICAgICAgICAgICgoTGlmZWN5Y2xlKSBtYW5hZ2VyKS5zdGFydCgpOworICAgICAgICBpZiAoKGNsdXN0ZXIgIT0gbnVsbCkgJiYgKGNsdXN0ZXIgaW5zdGFuY2VvZiBMaWZlY3ljbGUpKQorICAgICAgICAgICAgKChMaWZlY3ljbGUpIGNsdXN0ZXIpLnN0YXJ0KCk7CisgICAgICAgIGlmICgocmVhbG0gIT0gbnVsbCkgJiYgKHJlYWxtIGluc3RhbmNlb2YgTGlmZWN5Y2xlKSkKKyAgICAgICAgICAgICgoTGlmZWN5Y2xlKSByZWFsbSkuc3RhcnQoKTsKKyAgICAgICAgaWYgKChyZXNvdXJjZXMgIT0gbnVsbCkgJiYgKHJlc291cmNlcyBpbnN0YW5jZW9mIExpZmVjeWNsZSkpCisgICAgICAgICAgICAoKExpZmVjeWNsZSkgcmVzb3VyY2VzKS5zdGFydCgpOworCisgICAgICAgIC8vIFN0YXJ0IG91ciBjaGlsZCBjb250YWluZXJzLCBpZiBhbnkKKyAgICAgICAgQ29udGFpbmVyIGNoaWxkcmVuW10gPSBmaW5kQ2hpbGRyZW4oKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKGNoaWxkcmVuW2ldIGluc3RhbmNlb2YgTGlmZWN5Y2xlKQorICAgICAgICAgICAgICAgICgoTGlmZWN5Y2xlKSBjaGlsZHJlbltpXSkuc3RhcnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFN0YXJ0IHRoZSBWYWx2ZXMgaW4gb3VyIHBpcGVsaW5lIChpbmNsdWRpbmcgdGhlIGJhc2ljKSwgaWYgYW55CisgICAgICAgIGlmIChwaXBlbGluZSBpbnN0YW5jZW9mIExpZmVjeWNsZSkKKyAgICAgICAgICAgICgoTGlmZWN5Y2xlKSBwaXBlbGluZSkuc3RhcnQoKTsKKworICAgICAgICAvLyBOb3RpZnkgb3VyIGludGVyZXN0ZWQgTGlmZWN5Y2xlTGlzdGVuZXJzCisgICAgICAgIGxpZmVjeWNsZS5maXJlTGlmZWN5Y2xlRXZlbnQoU1RBUlRfRVZFTlQsIG51bGwpOworCisgICAgICAgIC8vIFN0YXJ0IG91ciB0aHJlYWQKKyAgICAgICAgdGhyZWFkU3RhcnQoKTsKKworICAgICAgICAvLyBOb3RpZnkgb3VyIGludGVyZXN0ZWQgTGlmZWN5Y2xlTGlzdGVuZXJzCisgICAgICAgIGxpZmVjeWNsZS5maXJlTGlmZWN5Y2xlRXZlbnQoQUZURVJfU1RBUlRfRVZFTlQsIG51bGwpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHcmFjZWZ1bGx5IHNodXQgZG93biBhY3RpdmUgdXNlIG9mIHRoZSBwdWJsaWMgbWV0aG9kcyBvZiB0aGlzIENvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTGlmZWN5Y2xlRXhjZXB0aW9uIGlmIHRoaXMgY29tcG9uZW50IGRldGVjdHMgYSBmYXRhbCBlcnJvcgorICAgICAqICB0aGF0IG5lZWRzIHRvIGJlIHJlcG9ydGVkCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHN0b3AoKSB0aHJvd3MgTGlmZWN5Y2xlRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBWYWxpZGF0ZSBhbmQgdXBkYXRlIG91ciBjdXJyZW50IGNvbXBvbmVudCBzdGF0ZQorICAgICAgICBpZiAoIXN0YXJ0ZWQpIHsKKyAgICAgICAgICAgIGxvZy5pbmZvKHNtLmdldFN0cmluZygiY29udGFpbmVyQmFzZS5ub3RTdGFydGVkIiwgbG9nTmFtZSgpKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBOb3RpZnkgb3VyIGludGVyZXN0ZWQgTGlmZWN5Y2xlTGlzdGVuZXJzCisgICAgICAgIGxpZmVjeWNsZS5maXJlTGlmZWN5Y2xlRXZlbnQoQkVGT1JFX1NUT1BfRVZFTlQsIG51bGwpOworCisgICAgICAgIC8vIFN0b3Agb3VyIHRocmVhZAorICAgICAgICB0aHJlYWRTdG9wKCk7CisKKyAgICAgICAgLy8gTm90aWZ5IG91ciBpbnRlcmVzdGVkIExpZmVjeWNsZUxpc3RlbmVycworICAgICAgICBsaWZlY3ljbGUuZmlyZUxpZmVjeWNsZUV2ZW50KFNUT1BfRVZFTlQsIG51bGwpOworICAgICAgICBzdGFydGVkID0gZmFsc2U7CisKKyAgICAgICAgLy8gU3RvcCB0aGUgVmFsdmVzIGluIG91ciBwaXBlbGluZSAoaW5jbHVkaW5nIHRoZSBiYXNpYyksIGlmIGFueQorICAgICAgICBpZiAocGlwZWxpbmUgaW5zdGFuY2VvZiBMaWZlY3ljbGUpIHsKKyAgICAgICAgICAgICgoTGlmZWN5Y2xlKSBwaXBlbGluZSkuc3RvcCgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gU3RvcCBvdXIgY2hpbGQgY29udGFpbmVycywgaWYgYW55CisgICAgICAgIENvbnRhaW5lciBjaGlsZHJlbltdID0gZmluZENoaWxkcmVuKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChjaGlsZHJlbltpXSBpbnN0YW5jZW9mIExpZmVjeWNsZSkKKyAgICAgICAgICAgICAgICAoKExpZmVjeWNsZSkgY2hpbGRyZW5baV0pLnN0b3AoKTsKKyAgICAgICAgfQorICAgICAgICAvLyBSZW1vdmUgY2hpbGRyZW4gLSBzbyBuZXh0IHN0YXJ0IGNhbiB3b3JrCisgICAgICAgIGNoaWxkcmVuID0gZmluZENoaWxkcmVuKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHJlbW92ZUNoaWxkKGNoaWxkcmVuW2ldKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFN0b3Agb3VyIHN1Ym9yZGluYXRlIGNvbXBvbmVudHMsIGlmIGFueQorICAgICAgICBpZiAoKHJlc291cmNlcyAhPSBudWxsKSAmJiAocmVzb3VyY2VzIGluc3RhbmNlb2YgTGlmZWN5Y2xlKSkgeworICAgICAgICAgICAgKChMaWZlY3ljbGUpIHJlc291cmNlcykuc3RvcCgpOworICAgICAgICB9CisgICAgICAgIGlmICgocmVhbG0gIT0gbnVsbCkgJiYgKHJlYWxtIGluc3RhbmNlb2YgTGlmZWN5Y2xlKSkgeworICAgICAgICAgICAgKChMaWZlY3ljbGUpIHJlYWxtKS5zdG9wKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChjbHVzdGVyICE9IG51bGwpICYmIChjbHVzdGVyIGluc3RhbmNlb2YgTGlmZWN5Y2xlKSkgeworICAgICAgICAgICAgKChMaWZlY3ljbGUpIGNsdXN0ZXIpLnN0b3AoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKG1hbmFnZXIgIT0gbnVsbCkgJiYgKG1hbmFnZXIgaW5zdGFuY2VvZiBMaWZlY3ljbGUpKSB7CisgICAgICAgICAgICAoKExpZmVjeWNsZSkgbWFuYWdlcikuc3RvcCgpOworICAgICAgICB9CisgICAgICAgIGlmICgobG9nZ2VyICE9IG51bGwpICYmIChsb2dnZXIgaW5zdGFuY2VvZiBMaWZlY3ljbGUpKSB7CisgICAgICAgICAgICAoKExpZmVjeWNsZSkgbG9nZ2VyKS5zdG9wKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChsb2FkZXIgIT0gbnVsbCkgJiYgKGxvYWRlciBpbnN0YW5jZW9mIExpZmVjeWNsZSkpIHsKKyAgICAgICAgICAgICgoTGlmZWN5Y2xlKSBsb2FkZXIpLnN0b3AoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE5vdGlmeSBvdXIgaW50ZXJlc3RlZCBMaWZlY3ljbGVMaXN0ZW5lcnMKKyAgICAgICAgbGlmZWN5Y2xlLmZpcmVMaWZlY3ljbGVFdmVudChBRlRFUl9TVE9QX0VWRU5ULCBudWxsKTsKKworICAgIH0KKworICAgIC8qKiBJbml0IG1ldGhvZCwgcGFydCBvZiB0aGUgTUJlYW4gbGlmZWN5Y2xlLgorICAgICAqICBJZiB0aGUgY29udGFpbmVyIHdhcyBhZGRlZCB2aWEgSk1YLCBpdCdsbCByZWdpc3RlciBpdHNlbGYgd2l0aCB0aGUgCisgICAgICogcGFyZW50LCB1c2luZyB0aGUgT2JqZWN0TmFtZSBjb252ZW50aW9ucyB0byBsb2NhdGUgdGhlIHBhcmVudC4KKyAgICAgKiAKKyAgICAgKiAgSWYgdGhlIGNvbnRhaW5lciB3YXMgYWRkZWQgZGlyZWN0bHkgYW5kIGl0IGRvZXNuJ3QgaGF2ZSBhbiBPYmplY3ROYW1lLAorICAgICAqIGl0J2xsIGNyZWF0ZSBhIG5hbWUgYW5kIHJlZ2lzdGVyIGl0c2VsZiB3aXRoIHRoZSBKTVggY29uc29sZS4gT24gZGVzdHJveSgpLCAKKyAgICAgKiB0aGUgb2JqZWN0IHdpbGwgdW5yZWdpc3Rlci4KKyAgICAgKiAKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgorICAgICAqLyAKKyAgICBwdWJsaWMgdm9pZCBpbml0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYoIHRoaXMuZ2V0UGFyZW50KCkgPT0gbnVsbCApIHsKKyAgICAgICAgICAgIC8vICJMaWZlIiB1cGRhdGUKKyAgICAgICAgICAgIE9iamVjdE5hbWUgcGFyZW50TmFtZT1nZXRQYXJlbnROYW1lKCk7CisKKyAgICAgICAgICAgIC8vbG9nLmluZm8oIlJlZ2lzdGVyICIgKyBwYXJlbnROYW1lICk7CisgICAgICAgICAgICBpZiggcGFyZW50TmFtZSAhPSBudWxsICYmIAorICAgICAgICAgICAgICAgICAgICBtc2VydmVyLmlzUmVnaXN0ZXJlZChwYXJlbnROYW1lKSkgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbXNlcnZlci5pbnZva2UocGFyZW50TmFtZSwgImFkZENoaWxkIiwgbmV3IE9iamVjdFtdIHsgdGhpcyB9LAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsib3JnLmFwYWNoZS5jYXRhbGluYS5Db250YWluZXIifSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaW5pdGlhbGl6ZWQ9dHJ1ZTsKKyAgICB9CisgICAgCisgICAgcHVibGljIE9iamVjdE5hbWUgZ2V0UGFyZW50TmFtZSgpIHRocm93cyBNYWxmb3JtZWRPYmplY3ROYW1lRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYoIHN0YXJ0ZWQgKSB7CisgICAgICAgICAgICBzdG9wKCk7CisgICAgICAgIH0KKyAgICAgICAgaW5pdGlhbGl6ZWQ9ZmFsc2U7CisKKyAgICAgICAgLy8gdW5yZWdpc3RlciB0aGlzIGNvbXBvbmVudAorICAgICAgICBpZiAoIG9uYW1lICE9IG51bGwgKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmKCBjb250cm9sbGVyID09IG9uYW1lICkgeworICAgICAgICAgICAgICAgICAgICBSZWdpc3RyeS5nZXRSZWdpc3RyeShudWxsLCBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgLnVucmVnaXN0ZXJDb21wb25lbnQob25hbWUpOworICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoInVucmVnaXN0ZXJpbmcgIiArIG9uYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoKCBUaHJvd2FibGUgdCApIHsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkVycm9yIHVucmVnaXN0ZXJpbmcgIiwgdCApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsKSB7CisgICAgICAgICAgICBwYXJlbnQucmVtb3ZlQ2hpbGQodGhpcyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBTdG9wIG91ciBjaGlsZCBjb250YWluZXJzLCBpZiBhbnkKKyAgICAgICAgQ29udGFpbmVyIGNoaWxkcmVuW10gPSBmaW5kQ2hpbGRyZW4oKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgcmVtb3ZlQ2hpbGQoY2hpbGRyZW5baV0pOworICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQaXBlbGluZSBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIEFkZCBhIG5ldyBWYWx2ZSB0byB0aGUgZW5kIG9mIHRoZSBwaXBlbGluZSBhc3NvY2lhdGVkIHdpdGggdGhpcworICAgICAqIENvbnRhaW5lci4gIFByaW9yIHRvIGFkZGluZyB0aGUgVmFsdmUsIHRoZSBWYWx2ZSdzCisgICAgICogPGNvZGU+c2V0Q29udGFpbmVyPC9jb2RlPiBtZXRob2QgbXVzdCBiZSBjYWxsZWQsIHdpdGggdGhpcyBDb250YWluZXIKKyAgICAgKiBhcyBhbiBhcmd1bWVudC4gIFRoZSBtZXRob2QgbWF5IHRocm93IGFuCisgICAgICogPGNvZGU+SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uPC9jb2RlPiBpZiB0aGlzIFZhbHZlIGNob29zZXMgbm90IHRvCisgICAgICogYmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgQ29udGFpbmVyLCBvciA8Y29kZT5JbGxlZ2FsU3RhdGVFeGNlcHRpb248L2NvZGU+CisgICAgICogaWYgaXQgaXMgYWxyZWFkeSBhc3NvY2lhdGVkIHdpdGggYSBkaWZmZXJlbnQgQ29udGFpbmVyLgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHZlIFZhbHZlIHRvIGJlIGFkZGVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGlzIENvbnRhaW5lciByZWZ1c2VkIHRvCisgICAgICogIGFjY2VwdCB0aGUgc3BlY2lmaWVkIFZhbHZlCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHNwZWNpZmllIFZhbHZlIHJlZnVzZXMgdG8gYmUKKyAgICAgKiAgYXNzb2NpYXRlZCB3aXRoIHRoaXMgQ29udGFpbmVyCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlIHNwZWNpZmllZCBWYWx2ZSBpcyBhbHJlYWR5CisgICAgICogIGFzc29jaWF0ZWQgd2l0aCBhIGRpZmZlcmVudCBDb250YWluZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkVmFsdmUoVmFsdmUgdmFsdmUpIHsKKworICAgICAgICBwaXBlbGluZS5hZGRWYWx2ZSh2YWx2ZSk7CisgICAgICAgIGZpcmVDb250YWluZXJFdmVudChBRERfVkFMVkVfRVZFTlQsIHZhbHZlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0TmFtZVtdIGdldFZhbHZlT2JqZWN0TmFtZXMoKSB7CisgICAgICAgIHJldHVybiAoKFN0YW5kYXJkUGlwZWxpbmUpcGlwZWxpbmUpLmdldFZhbHZlT2JqZWN0TmFtZXMoKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogPHA+UmV0dXJuIHRoZSBWYWx2ZSBpbnN0YW5jZSB0aGF0IGhhcyBiZWVuIGRpc3Rpbmd1aXNoZWQgYXMgdGhlIGJhc2ljCisgICAgICogVmFsdmUgZm9yIHRoaXMgUGlwZWxpbmUgKGlmIGFueSkuCisgICAgICovCisgICAgcHVibGljIFZhbHZlIGdldEJhc2ljKCkgeworCisgICAgICAgIHJldHVybiAocGlwZWxpbmUuZ2V0QmFzaWMoKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZmlyc3QgdmFsdmUgaW4gdGhlIHBpcGVsaW5lLgorICAgICAqLworICAgIHB1YmxpYyBWYWx2ZSBnZXRGaXJzdCgpIHsKKworICAgICAgICByZXR1cm4gKHBpcGVsaW5lLmdldEZpcnN0KCkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNldCBvZiBWYWx2ZXMgaW4gdGhlIHBpcGVsaW5lIGFzc29jaWF0ZWQgd2l0aCB0aGlzCisgICAgICogQ29udGFpbmVyLCBpbmNsdWRpbmcgdGhlIGJhc2ljIFZhbHZlIChpZiBhbnkpLiAgSWYgdGhlcmUgYXJlIG5vCisgICAgICogc3VjaCBWYWx2ZXMsIGEgemVyby1sZW5ndGggYXJyYXkgaXMgcmV0dXJuZWQuCisgICAgICovCisgICAgcHVibGljIFZhbHZlW10gZ2V0VmFsdmVzKCkgeworCisgICAgICAgIHJldHVybiAocGlwZWxpbmUuZ2V0VmFsdmVzKCkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBWYWx2ZSBmcm9tIHRoZSBwaXBlbGluZSBhc3NvY2lhdGVkIHdpdGggdGhpcworICAgICAqIENvbnRhaW5lciwgaWYgaXQgaXMgZm91bmQ7IG90aGVyd2lzZSwgZG8gbm90aGluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx2ZSBWYWx2ZSB0byBiZSByZW1vdmVkCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZVZhbHZlKFZhbHZlIHZhbHZlKSB7CisKKyAgICAgICAgcGlwZWxpbmUucmVtb3ZlVmFsdmUodmFsdmUpOworICAgICAgICBmaXJlQ29udGFpbmVyRXZlbnQoUkVNT1ZFX1ZBTFZFX0VWRU5ULCB2YWx2ZSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiA8cD5TZXQgdGhlIFZhbHZlIGluc3RhbmNlIHRoYXQgaGFzIGJlZW4gZGlzdGluZ3Vpc2hlZCBhcyB0aGUgYmFzaWMKKyAgICAgKiBWYWx2ZSBmb3IgdGhpcyBQaXBlbGluZSAoaWYgYW55KS4gIFByaW9lciB0byBzZXR0aW5nIHRoZSBiYXNpYyBWYWx2ZSwKKyAgICAgKiB0aGUgVmFsdmUncyA8Y29kZT5zZXRDb250YWluZXIoKTwvY29kZT4gd2lsbCBiZSBjYWxsZWQsIGlmIGl0CisgICAgICogaW1wbGVtZW50cyA8Y29kZT5Db250YWluZWQ8L2NvZGU+LCB3aXRoIHRoZSBvd25pbmcgQ29udGFpbmVyIGFzIGFuCisgICAgICogYXJndW1lbnQuICBUaGUgbWV0aG9kIG1heSB0aHJvdyBhbiA8Y29kZT5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb248L2NvZGU+CisgICAgICogaWYgdGhpcyBWYWx2ZSBjaG9vc2VzIG5vdCB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBDb250YWluZXIsIG9yCisgICAgICogPGNvZGU+SWxsZWdhbFN0YXRlRXhjZXB0aW9uPC9jb2RlPiBpZiBpdCBpcyBhbHJlYWR5IGFzc29jaWF0ZWQgd2l0aAorICAgICAqIGEgZGlmZmVyZW50IENvbnRhaW5lci48L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdmUgVmFsdmUgdG8gYmUgZGlzdGluZ3Vpc2hlZCBhcyB0aGUgYmFzaWMgVmFsdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRCYXNpYyhWYWx2ZSB2YWx2ZSkgeworCisgICAgICAgIHBpcGVsaW5lLnNldEJhc2ljKHZhbHZlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogRXhlY3V0ZSBhIHBlcmlvZGljIHRhc2ssIHN1Y2ggYXMgcmVsb2FkaW5nLCBldGMuIFRoaXMgbWV0aG9kIHdpbGwgYmUKKyAgICAgKiBpbnZva2VkIGluc2lkZSB0aGUgY2xhc3Nsb2FkaW5nIGNvbnRleHQgb2YgdGhpcyBjb250YWluZXIuIFVuZXhwZWN0ZWQKKyAgICAgKiB0aHJvd2FibGVzIHdpbGwgYmUgY2F1Z2h0IGFuZCBsb2dnZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYmFja2dyb3VuZFByb2Nlc3MoKSB7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvdGVjdGVkIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogTm90aWZ5IGFsbCBjb250YWluZXIgZXZlbnQgbGlzdGVuZXJzIHRoYXQgYSBwYXJ0aWN1bGFyIGV2ZW50IGhhcworICAgICAqIG9jY3VycmVkIGZvciB0aGlzIENvbnRhaW5lci4gIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHBlcmZvcm1zCisgICAgICogdGhpcyBub3RpZmljYXRpb24gc3luY2hyb25vdXNseSB1c2luZyB0aGUgY2FsbGluZyB0aHJlYWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHlwZSBFdmVudCB0eXBlCisgICAgICogQHBhcmFtIGRhdGEgRXZlbnQgZGF0YQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGZpcmVDb250YWluZXJFdmVudChTdHJpbmcgdHlwZSwgT2JqZWN0IGRhdGEpIHsKKworICAgICAgICBpZiAobGlzdGVuZXJzLnNpemUoKSA8IDEpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIENvbnRhaW5lckV2ZW50IGV2ZW50ID0gbmV3IENvbnRhaW5lckV2ZW50KHRoaXMsIHR5cGUsIGRhdGEpOworICAgICAgICBDb250YWluZXJMaXN0ZW5lciBsaXN0W10gPSBuZXcgQ29udGFpbmVyTGlzdGVuZXJbMF07CisgICAgICAgIHN5bmNocm9uaXplZCAobGlzdGVuZXJzKSB7CisgICAgICAgICAgICBsaXN0ID0gKENvbnRhaW5lckxpc3RlbmVyW10pIGxpc3RlbmVycy50b0FycmF5KGxpc3QpOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICgoQ29udGFpbmVyTGlzdGVuZXIpIGxpc3RbaV0pLmNvbnRhaW5lckV2ZW50KGV2ZW50KTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBhYmJyZXZpYXRlZCBuYW1lIG9mIHRoaXMgY29udGFpbmVyIGZvciBsb2dnaW5nIG1lc3NzYWdlcworICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgbG9nTmFtZSgpIHsKKworICAgICAgICBpZiAobG9nTmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbG9nTmFtZTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgbG9nZ2VyTmFtZSA9IG51bGw7CisgICAgICAgIENvbnRhaW5lciBjdXJyZW50ID0gdGhpczsKKyAgICAgICAgd2hpbGUgKGN1cnJlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgbG9nZ2VyTmFtZSA9ICJbIiArIGN1cnJlbnQuZ2V0TmFtZSgpICsgIl0iIAorICAgICAgICAgICAgICAgICsgKChsb2dnZXJOYW1lICE9IG51bGwpID8gKCIuIiArIGxvZ2dlck5hbWUpIDogIiIpOworICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQuZ2V0UGFyZW50KCk7CisgICAgICAgIH0KKyAgICAgICAgbG9nTmFtZSA9IENvbnRhaW5lckJhc2UuY2xhc3MuZ2V0TmFtZSgpICsgIi4iICsgbG9nZ2VyTmFtZTsKKyAgICAgICAgcmV0dXJuIGxvZ05hbWU7CisgICAgICAgIAorICAgIH0KKworICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tIEpNWCBhbmQgUmVnaXN0cmF0aW9uICAtLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHByb3RlY3RlZCBTdHJpbmcgdHlwZTsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGRvbWFpbjsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHN1ZmZpeDsKKyAgICBwcm90ZWN0ZWQgT2JqZWN0TmFtZSBvbmFtZTsKKyAgICBwcm90ZWN0ZWQgT2JqZWN0TmFtZSBjb250cm9sbGVyOworICAgIHByb3RlY3RlZCB0cmFuc2llbnQgTUJlYW5TZXJ2ZXIgbXNlcnZlcjsKKworICAgIHB1YmxpYyBPYmplY3ROYW1lIGdldEpteE5hbWUoKSB7CisgICAgICAgIHJldHVybiBvbmFtZTsKKyAgICB9CisgICAgCisgICAgcHVibGljIFN0cmluZyBnZXRPYmplY3ROYW1lKCkgeworICAgICAgICBpZiAob25hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG9uYW1lLnRvU3RyaW5nKCk7CisgICAgICAgIH0gZWxzZSByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldERvbWFpbigpIHsKKyAgICAgICAgaWYoIGRvbWFpbj09bnVsbCApIHsKKyAgICAgICAgICAgIENvbnRhaW5lciBwYXJlbnQ9dGhpczsKKyAgICAgICAgICAgIHdoaWxlKCBwYXJlbnQgIT0gbnVsbCAmJgorICAgICAgICAgICAgICAgICAgICAhKCBwYXJlbnQgaW5zdGFuY2VvZiBTdGFuZGFyZEVuZ2luZSkgKSB7CisgICAgICAgICAgICAgICAgcGFyZW50PXBhcmVudC5nZXRQYXJlbnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCBwYXJlbnQgaW5zdGFuY2VvZiBTdGFuZGFyZEVuZ2luZSApIHsKKyAgICAgICAgICAgICAgICBkb21haW49KChTdGFuZGFyZEVuZ2luZSlwYXJlbnQpLmdldERvbWFpbigpOworICAgICAgICAgICAgfSAKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZG9tYWluOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERvbWFpbihTdHJpbmcgZG9tYWluKSB7CisgICAgICAgIHRoaXMuZG9tYWluPWRvbWFpbjsKKyAgICB9CisgICAgCisgICAgcHVibGljIFN0cmluZyBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gdHlwZTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEpTUjc3U3VmZml4KCkgeworICAgICAgICByZXR1cm4gc3VmZml4OworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3ROYW1lIHByZVJlZ2lzdGVyKE1CZWFuU2VydmVyIHNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3ROYW1lIG5hbWUpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBvbmFtZT1uYW1lOworICAgICAgICBtc2VydmVyPXNlcnZlcjsKKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCApeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBkb21haW49bmFtZS5nZXREb21haW4oKTsKKworICAgICAgICB0eXBlPW5hbWUuZ2V0S2V5UHJvcGVydHkoInR5cGUiKTsKKyAgICAgICAgaWYoIHR5cGU9PW51bGwgKSB7CisgICAgICAgICAgICB0eXBlPW5hbWUuZ2V0S2V5UHJvcGVydHkoImoyZWVUeXBlIik7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgajJlZUFwcD1uYW1lLmdldEtleVByb3BlcnR5KCJKMkVFQXBwbGljYXRpb24iKTsKKyAgICAgICAgU3RyaW5nIGoyZWVTZXJ2ZXI9bmFtZS5nZXRLZXlQcm9wZXJ0eSgiSjJFRVNlcnZlciIpOworICAgICAgICBpZiggajJlZUFwcD09bnVsbCApIHsKKyAgICAgICAgICAgIGoyZWVBcHA9Im5vbmUiOworICAgICAgICB9CisgICAgICAgIGlmKCBqMmVlU2VydmVyPT1udWxsICkgeworICAgICAgICAgICAgajJlZVNlcnZlcj0ibm9uZSI7CisgICAgICAgIH0KKyAgICAgICAgc3VmZml4PSIsSjJFRUFwcGxpY2F0aW9uPSIgKyBqMmVlQXBwICsgIixKMkVFU2VydmVyPSIgKyBqMmVlU2VydmVyOworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwb3N0UmVnaXN0ZXIoQm9vbGVhbiByZWdpc3RyYXRpb25Eb25lKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHJlRGVyZWdpc3RlcigpIHRocm93cyBFeGNlcHRpb24geworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHBvc3REZXJlZ2lzdGVyKCkgeworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3ROYW1lW10gZ2V0Q2hpbGRyZW4oKSB7CisgICAgICAgIE9iamVjdE5hbWUgcmVzdWx0W109bmV3IE9iamVjdE5hbWVbY2hpbGRyZW4uc2l6ZSgpXTsKKyAgICAgICAgSXRlcmF0b3IgaXQ9Y2hpbGRyZW4udmFsdWVzKCkuaXRlcmF0b3IoKTsKKyAgICAgICAgaW50IGk9MDsKKyAgICAgICAgd2hpbGUoIGl0Lmhhc05leHQoKSApIHsKKyAgICAgICAgICAgIE9iamVjdCBuZXh0PWl0Lm5leHQoKTsKKyAgICAgICAgICAgIGlmKCBuZXh0IGluc3RhbmNlb2YgQ29udGFpbmVyQmFzZSApIHsKKyAgICAgICAgICAgICAgICByZXN1bHRbaSsrXT0oKENvbnRhaW5lckJhc2UpbmV4dCkuZ2V0Sm14TmFtZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdE5hbWUgY3JlYXRlT2JqZWN0TmFtZShTdHJpbmcgZG9tYWluLCBPYmplY3ROYW1lIHBhcmVudCkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaWYoIGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmRlYnVnKCJDcmVhdGUgT2JqZWN0TmFtZSAiICsgZG9tYWluICsgIiAiICsgcGFyZW50ICk7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGFpbmVyU3VmZml4KCkgeworICAgICAgICBDb250YWluZXIgY29udGFpbmVyPXRoaXM7CisgICAgICAgIENvbnRhaW5lciBjb250ZXh0PW51bGw7CisgICAgICAgIENvbnRhaW5lciBob3N0PW51bGw7CisgICAgICAgIENvbnRhaW5lciBzZXJ2bGV0PW51bGw7CisgICAgICAgIAorICAgICAgICBTdHJpbmdCdWZmZXIgc3VmZml4PW5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgCisgICAgICAgIGlmKCBjb250YWluZXIgaW5zdGFuY2VvZiBTdGFuZGFyZEhvc3QgKSB7CisgICAgICAgICAgICBob3N0PWNvbnRhaW5lcjsKKyAgICAgICAgfSBlbHNlIGlmKCBjb250YWluZXIgaW5zdGFuY2VvZiBTdGFuZGFyZENvbnRleHQgKSB7CisgICAgICAgICAgICBob3N0PWNvbnRhaW5lci5nZXRQYXJlbnQoKTsKKyAgICAgICAgICAgIGNvbnRleHQ9Y29udGFpbmVyOworICAgICAgICB9IGVsc2UgaWYoIGNvbnRhaW5lciBpbnN0YW5jZW9mIFN0YW5kYXJkV3JhcHBlciApIHsKKyAgICAgICAgICAgIGNvbnRleHQ9Y29udGFpbmVyLmdldFBhcmVudCgpOworICAgICAgICAgICAgaG9zdD1jb250ZXh0LmdldFBhcmVudCgpOworICAgICAgICAgICAgc2VydmxldD1jb250YWluZXI7CisgICAgICAgIH0KKyAgICAgICAgaWYoIGNvbnRleHQhPW51bGwgKSB7CisgICAgICAgICAgICBTdHJpbmcgcGF0aD0oKFN0YW5kYXJkQ29udGV4dCljb250ZXh0KS5nZXRQYXRoKCk7CisgICAgICAgICAgICBzdWZmaXguYXBwZW5kKCIscGF0aD0iKS5hcHBlbmQoKHBhdGguZXF1YWxzKCIiKSkgPyAiLyIgOiBwYXRoKTsKKyAgICAgICAgfSAKKyAgICAgICAgaWYoIGhvc3QhPW51bGwgKSBzdWZmaXguYXBwZW5kKCIsaG9zdD0iKS5hcHBlbmQoIGhvc3QuZ2V0TmFtZSgpICk7CisgICAgICAgIGlmKCBzZXJ2bGV0ICE9IG51bGwgKSB7CisgICAgICAgICAgICBTdHJpbmcgbmFtZT1jb250YWluZXIuZ2V0TmFtZSgpOworICAgICAgICAgICAgc3VmZml4LmFwcGVuZCgiLHNlcnZsZXQ9Iik7CisgICAgICAgICAgICBzdWZmaXguYXBwZW5kKChuYW1lPT0iIikgPyAiLyIgOiBuYW1lKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VmZml4LnRvU3RyaW5nKCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTdGFydCB0aGUgYmFja2dyb3VuZCB0aHJlYWQgdGhhdCB3aWxsIHBlcmlvZGljYWxseSBjaGVjayBmb3IKKyAgICAgKiBzZXNzaW9uIHRpbWVvdXRzLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHRocmVhZFN0YXJ0KCkgeworCisgICAgICAgIGlmICh0aHJlYWQgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKGJhY2tncm91bmRQcm9jZXNzb3JEZWxheSA8PSAwKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIHRocmVhZERvbmUgPSBmYWxzZTsKKyAgICAgICAgU3RyaW5nIHRocmVhZE5hbWUgPSAiQ29udGFpbmVyQmFja2dyb3VuZFByb2Nlc3NvclsiICsgdG9TdHJpbmcoKSArICJdIjsKKyAgICAgICAgdGhyZWFkID0gbmV3IFRocmVhZChuZXcgQ29udGFpbmVyQmFja2dyb3VuZFByb2Nlc3NvcigpLCB0aHJlYWROYW1lKTsKKyAgICAgICAgdGhyZWFkLnNldERhZW1vbih0cnVlKTsKKyAgICAgICAgdGhyZWFkLnN0YXJ0KCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFN0b3AgdGhlIGJhY2tncm91bmQgdGhyZWFkIHRoYXQgaXMgcGVyaW9kaWNhbGx5IGNoZWNraW5nIGZvcgorICAgICAqIHNlc3Npb24gdGltZW91dHMuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgdGhyZWFkU3RvcCgpIHsKKworICAgICAgICBpZiAodGhyZWFkID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgdGhyZWFkRG9uZSA9IHRydWU7CisgICAgICAgIHRocmVhZC5pbnRlcnJ1cHQoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRocmVhZC5qb2luKCk7CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIDsKKyAgICAgICAgfQorCisgICAgICAgIHRocmVhZCA9IG51bGw7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnRhaW5lckV4ZWN1dGVEZWxheSBJbm5lciBDbGFzcworCisKKyAgICAvKioKKyAgICAgKiBQcml2YXRlIHRocmVhZCBjbGFzcyB0byBpbnZva2UgdGhlIGJhY2tncm91bmRQcm9jZXNzIG1ldGhvZCAKKyAgICAgKiBvZiB0aGlzIGNvbnRhaW5lciBhbmQgaXRzIGNoaWxkcmVuIGFmdGVyIGEgZml4ZWQgZGVsYXkuCisgICAgICovCisgICAgcHJvdGVjdGVkIGNsYXNzIENvbnRhaW5lckJhY2tncm91bmRQcm9jZXNzb3IgaW1wbGVtZW50cyBSdW5uYWJsZSB7CisKKyAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgd2hpbGUgKCF0aHJlYWREb25lKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKGJhY2tncm91bmRQcm9jZXNzb3JEZWxheSAqIDEwMDBMKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCF0aHJlYWREb25lKSB7CisgICAgICAgICAgICAgICAgICAgIENvbnRhaW5lciBwYXJlbnQgPSAoQ29udGFpbmVyKSBnZXRNYXBwaW5nT2JqZWN0KCk7CisgICAgICAgICAgICAgICAgICAgIENsYXNzTG9hZGVyIGNsID0gCisgICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOworICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50LmdldExvYWRlcigpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsID0gcGFyZW50LmdldExvYWRlcigpLmdldENsYXNzTG9hZGVyKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0NoaWxkcmVuKHBhcmVudCwgY2wpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NDaGlsZHJlbihDb250YWluZXIgY29udGFpbmVyLCBDbGFzc0xvYWRlciBjbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAoY29udGFpbmVyLmdldExvYWRlcigpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIChjb250YWluZXIuZ2V0TG9hZGVyKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvbnRhaW5lci5iYWNrZ3JvdW5kUHJvY2VzcygpOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkV4Y2VwdGlvbiBpbnZva2luZyBwZXJpb2RpYyBvcGVyYXRpb246ICIsIHQpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihjbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb250YWluZXJbXSBjaGlsZHJlbiA9IGNvbnRhaW5lci5maW5kQ2hpbGRyZW4oKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoY2hpbGRyZW5baV0uZ2V0QmFja2dyb3VuZFByb2Nlc3NvckRlbGF5KCkgPD0gMCkgeworICAgICAgICAgICAgICAgICAgICBwcm9jZXNzQ2hpbGRyZW4oY2hpbGRyZW5baV0sIGNsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29yZS9EdW1teVJlcXVlc3QuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb3JlL0R1bW15UmVxdWVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2NmVjZTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29yZS9EdW1teVJlcXVlc3QuamF2YQpAQCAtMCwwICsxLDI2NyBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlOworCisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuU29ja2V0OworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXguc2VydmxldC5GaWx0ZXJDaGFpbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlJlcXVlc3REaXNwYXRjaGVyOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldElucHV0U3RyZWFtOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkNvb2tpZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkhvc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5XcmFwcGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLkNvbm5lY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3Rvci5SZXNwb25zZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvbWNhdC51dGlsLmJ1Zi5NZXNzYWdlQnl0ZXM7CisKKworLyoqCisgKiBEdW1teSByZXF1ZXN0IG9iamVjdCwgdXNlZCBmb3IgcmVxdWVzdCBkaXNwYXRjaGVyIG1hcHBpbmcsIGFzIHdlbGwgYXMKKyAqIEpTUCBwcmVjb21waWxhdGlvbi4KKyAqCisgKiBAYXV0aG9yIFJlbXkgTWF1Y2hlcmF0CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBEdW1teVJlcXVlc3QKKyAgICBpbXBsZW1lbnRzIEh0dHBTZXJ2bGV0UmVxdWVzdCB7CisKKyAgICBwdWJsaWMgRHVtbXlSZXF1ZXN0KCkgeworICAgIH0KKworICAgIHB1YmxpYyBEdW1teVJlcXVlc3QoU3RyaW5nIGNvbnRleHRQYXRoLCBTdHJpbmcgZGVjb2RlZFVSSSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBxdWVyeVN0cmluZykgeworICAgICAgICB0aGlzLmNvbnRleHRQYXRoID0gY29udGV4dFBhdGg7CisgICAgICAgIHRoaXMuZGVjb2RlZFVSSSA9IGRlY29kZWRVUkk7CisgICAgICAgIHRoaXMucXVlcnlTdHJpbmcgPSBxdWVyeVN0cmluZzsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGNvbnRleHRQYXRoID0gbnVsbDsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGRlY29kZWRVUkkgPSBudWxsOworICAgIHByb3RlY3RlZCBTdHJpbmcgcXVlcnlTdHJpbmcgPSBudWxsOworCisgICAgcHJvdGVjdGVkIFN0cmluZyBwYXRoSW5mbyA9IG51bGw7CisgICAgcHJvdGVjdGVkIFN0cmluZyBzZXJ2bGV0UGF0aCA9IG51bGw7CisgICAgcHJvdGVjdGVkIFdyYXBwZXIgd3JhcHBlciA9IG51bGw7CisKKyAgICBwcm90ZWN0ZWQgRmlsdGVyQ2hhaW4gZmlsdGVyQ2hhaW4gPSBudWxsOworICAgIAorICAgIHByaXZhdGUgc3RhdGljIEVudW1lcmF0aW9uIGR1bW15RW51bSA9IG5ldyBFbnVtZXJhdGlvbigpeworICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNNb3JlRWxlbWVudHMoKXsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgT2JqZWN0IG5leHRFbGVtZW50KCl7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRleHRQYXRoKCkgeworICAgICAgICByZXR1cm4gKGNvbnRleHRQYXRoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVzc2FnZUJ5dGVzIGdldENvbnRleHRQYXRoTUIoKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBTZXJ2bGV0UmVxdWVzdCBnZXRSZXF1ZXN0KCkgeworICAgICAgICByZXR1cm4gKHRoaXMpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVjb2RlZFJlcXVlc3RVUkkoKSB7CisgICAgICAgIHJldHVybiBkZWNvZGVkVVJJOworICAgIH0KKworICAgIHB1YmxpYyBNZXNzYWdlQnl0ZXMgZ2V0RGVjb2RlZFJlcXVlc3RVUklNQigpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIEZpbHRlckNoYWluIGdldEZpbHRlckNoYWluKCkgeworICAgICAgICByZXR1cm4gKHRoaXMuZmlsdGVyQ2hhaW4pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEZpbHRlckNoYWluKEZpbHRlckNoYWluIGZpbHRlckNoYWluKSB7CisgICAgICAgIHRoaXMuZmlsdGVyQ2hhaW4gPSBmaWx0ZXJDaGFpbjsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFF1ZXJ5U3RyaW5nKCkgeworICAgICAgICByZXR1cm4gcXVlcnlTdHJpbmc7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UXVlcnlTdHJpbmcoU3RyaW5nIHF1ZXJ5KSB7CisgICAgICAgIHF1ZXJ5U3RyaW5nID0gcXVlcnk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRQYXRoSW5mbygpIHsKKyAgICAgICAgcmV0dXJuIHBhdGhJbmZvOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBhdGhJbmZvKFN0cmluZyBwYXRoKSB7CisgICAgICAgIHBhdGhJbmZvID0gcGF0aDsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVzc2FnZUJ5dGVzIGdldFBhdGhJbmZvTUIoKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBNZXNzYWdlQnl0ZXMgZ2V0UmVxdWVzdFBhdGhNQigpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRTZXJ2bGV0UGF0aCgpIHsKKyAgICAgICAgcmV0dXJuIHNlcnZsZXRQYXRoOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFNlcnZsZXRQYXRoKFN0cmluZyBwYXRoKSB7CisgICAgICAgIHNlcnZsZXRQYXRoID0gcGF0aDsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVzc2FnZUJ5dGVzIGdldFNlcnZsZXRQYXRoTUIoKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBXcmFwcGVyIGdldFdyYXBwZXIoKSB7CisgICAgICAgIHJldHVybiAodGhpcy53cmFwcGVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRXcmFwcGVyKFdyYXBwZXIgd3JhcHBlcikgeworICAgICAgICB0aGlzLndyYXBwZXIgPSB3cmFwcGVyOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXV0aG9yaXphdGlvbigpIHsgcmV0dXJuIG51bGw7IH0KKyAgICBwdWJsaWMgdm9pZCBzZXRBdXRob3JpemF0aW9uKFN0cmluZyBhdXRob3JpemF0aW9uKSB7fQorICAgIHB1YmxpYyBDb25uZWN0b3IgZ2V0Q29ubmVjdG9yKCkgeyByZXR1cm4gbnVsbDsgfQorICAgIHB1YmxpYyB2b2lkIHNldENvbm5lY3RvcihDb25uZWN0b3IgY29ubmVjdG9yKSB7fQorICAgIHB1YmxpYyBDb250ZXh0IGdldENvbnRleHQoKSB7IHJldHVybiBudWxsOyB9CisgICAgcHVibGljIHZvaWQgc2V0Q29udGV4dChDb250ZXh0IGNvbnRleHQpIHt9CisgICAgcHVibGljIEhvc3QgZ2V0SG9zdCgpIHsgcmV0dXJuIG51bGw7IH0KKyAgICBwdWJsaWMgdm9pZCBzZXRIb3N0KEhvc3QgaG9zdCkge30KKyAgICBwdWJsaWMgU3RyaW5nIGdldEluZm8oKSB7IHJldHVybiBudWxsOyB9CisgICAgcHVibGljIFJlc3BvbnNlIGdldFJlc3BvbnNlKCkgeyByZXR1cm4gbnVsbDsgfQorICAgIHB1YmxpYyB2b2lkIHNldFJlc3BvbnNlKFJlc3BvbnNlIHJlc3BvbnNlKSB7fQorICAgIHB1YmxpYyBTb2NrZXQgZ2V0U29ja2V0KCkgeyByZXR1cm4gbnVsbDsgfQorICAgIHB1YmxpYyB2b2lkIHNldFNvY2tldChTb2NrZXQgc29ja2V0KSB7fQorICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRTdHJlYW0oKSB7IHJldHVybiBudWxsOyB9CisgICAgcHVibGljIHZvaWQgc2V0U3RyZWFtKElucHV0U3RyZWFtIGlucHV0KSB7fQorICAgIHB1YmxpYyB2b2lkIGFkZExvY2FsZShMb2NhbGUgbG9jYWxlKSB7fQorICAgIHB1YmxpYyBTZXJ2bGV0SW5wdXRTdHJlYW0gY3JlYXRlSW5wdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgcHVibGljIHZvaWQgZmluaXNoUmVxdWVzdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7fQorICAgIHB1YmxpYyBPYmplY3QgZ2V0Tm90ZShTdHJpbmcgbmFtZSkgeyByZXR1cm4gbnVsbDsgfQorICAgIHB1YmxpYyBJdGVyYXRvciBnZXROb3RlTmFtZXMoKSB7IHJldHVybiBudWxsOyB9CisgICAgcHVibGljIHZvaWQgcmVtb3ZlTm90ZShTdHJpbmcgbmFtZSkge30KKyAgICBwdWJsaWMgdm9pZCBzZXRDb250ZW50VHlwZShTdHJpbmcgdHlwZSkge30KKyAgICBwdWJsaWMgdm9pZCBzZXROb3RlKFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHt9CisgICAgcHVibGljIHZvaWQgc2V0UHJvdG9jb2woU3RyaW5nIHByb3RvY29sKSB7fQorICAgIHB1YmxpYyB2b2lkIHNldFJlbW90ZUFkZHIoU3RyaW5nIHJlbW90ZUFkZHIpIHt9CisgICAgcHVibGljIHZvaWQgc2V0UmVtb3RlSG9zdChTdHJpbmcgcmVtb3RlSG9zdCkge30KKyAgICBwdWJsaWMgdm9pZCBzZXRTY2hlbWUoU3RyaW5nIHNjaGVtZSkge30KKyAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJOYW1lKFN0cmluZyBuYW1lKSB7fQorICAgIHB1YmxpYyB2b2lkIHNldFNlcnZlclBvcnQoaW50IHBvcnQpIHt9CisgICAgcHVibGljIE9iamVjdCBnZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHsgcmV0dXJuIG51bGw7IH0KKyAgICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0QXR0cmlidXRlTmFtZXMoKSB7IHJldHVybiBudWxsOyB9CisgICAgcHVibGljIFN0cmluZyBnZXRDaGFyYWN0ZXJFbmNvZGluZygpIHsgcmV0dXJuIG51bGw7IH0KKyAgICBwdWJsaWMgaW50IGdldENvbnRlbnRMZW5ndGgoKSB7IHJldHVybiAtMTsgfQorICAgIHB1YmxpYyB2b2lkIHNldENvbnRlbnRMZW5ndGgoaW50IGxlbmd0aCkge30KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRUeXBlKCkgeyByZXR1cm4gbnVsbDsgfQorICAgIHB1YmxpYyBTZXJ2bGV0SW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgcHVibGljIExvY2FsZSBnZXRMb2NhbGUoKSB7IHJldHVybiBudWxsOyB9CisgICAgcHVibGljIEVudW1lcmF0aW9uIGdldExvY2FsZXMoKSB7IHJldHVybiBudWxsOyB9CisgICAgcHVibGljIFN0cmluZyBnZXRQcm90b2NvbCgpIHsgcmV0dXJuIG51bGw7IH0KKyAgICBwdWJsaWMgQnVmZmVyZWRSZWFkZXIgZ2V0UmVhZGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsgcmV0dXJuIG51bGw7IH0KKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlYWxQYXRoKFN0cmluZyBwYXRoKSB7IHJldHVybiBudWxsOyB9CisgICAgcHVibGljIFN0cmluZyBnZXRSZW1vdGVBZGRyKCkgeyByZXR1cm4gbnVsbDsgfQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVtb3RlSG9zdCgpIHsgcmV0dXJuIG51bGw7IH0KKyAgICBwdWJsaWMgU3RyaW5nIGdldFNjaGVtZSgpIHsgcmV0dXJuIG51bGw7IH0KKyAgICBwdWJsaWMgU3RyaW5nIGdldFNlcnZlck5hbWUoKSB7IHJldHVybiBudWxsOyB9CisgICAgcHVibGljIGludCBnZXRTZXJ2ZXJQb3J0KCkgeyByZXR1cm4gLTE7IH0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1NlY3VyZSgpIHsgcmV0dXJuIGZhbHNlOyB9CisgICAgcHVibGljIHZvaWQgcmVtb3ZlQXR0cmlidXRlKFN0cmluZyBuYW1lKSB7fQorICAgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKSB7fQorICAgIHB1YmxpYyB2b2lkIHNldENoYXJhY3RlckVuY29kaW5nKFN0cmluZyBlbmMpCisgICAgICAgIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHt9CisgICAgcHVibGljIHZvaWQgYWRkQ29va2llKENvb2tpZSBjb29raWUpIHt9CisgICAgcHVibGljIHZvaWQgYWRkSGVhZGVyKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHt9CisgICAgcHVibGljIHZvaWQgYWRkUGFyYW1ldGVyKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWVzW10pIHt9CisgICAgcHVibGljIHZvaWQgY2xlYXJDb29raWVzKCkge30KKyAgICBwdWJsaWMgdm9pZCBjbGVhckhlYWRlcnMoKSB7fQorICAgIHB1YmxpYyB2b2lkIGNsZWFyTG9jYWxlcygpIHt9CisgICAgcHVibGljIHZvaWQgY2xlYXJQYXJhbWV0ZXJzKCkge30KKyAgICBwdWJsaWMgdm9pZCByZWN5Y2xlKCkge30KKyAgICBwdWJsaWMgdm9pZCBzZXRBdXRoVHlwZShTdHJpbmcgYXV0aFR5cGUpIHt9CisgICAgcHVibGljIHZvaWQgc2V0Q29udGV4dFBhdGgoU3RyaW5nIHBhdGgpIHt9CisgICAgcHVibGljIHZvaWQgc2V0TWV0aG9kKFN0cmluZyBtZXRob2QpIHt9CisgICAgcHVibGljIHZvaWQgc2V0UmVxdWVzdGVkU2Vzc2lvbkNvb2tpZShib29sZWFuIGZsYWcpIHt9CisgICAgcHVibGljIHZvaWQgc2V0UmVxdWVzdGVkU2Vzc2lvbklkKFN0cmluZyBpZCkge30KKyAgICBwdWJsaWMgdm9pZCBzZXRSZXF1ZXN0ZWRTZXNzaW9uVVJMKGJvb2xlYW4gZmxhZykge30KKyAgICBwdWJsaWMgdm9pZCBzZXRSZXF1ZXN0VVJJKFN0cmluZyB1cmkpIHt9CisgICAgcHVibGljIHZvaWQgc2V0U2VjdXJlKGJvb2xlYW4gc2VjdXJlKSB7fQorICAgIHB1YmxpYyB2b2lkIHNldFVzZXJQcmluY2lwYWwoUHJpbmNpcGFsIHByaW5jaXBhbCkge30KKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhcmFtZXRlcihTdHJpbmcgbmFtZSkgeyByZXR1cm4gbnVsbDsgfQorICAgIHB1YmxpYyBNYXAgZ2V0UGFyYW1ldGVyTWFwKCkgeyByZXR1cm4gbnVsbDsgfQorICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRQYXJhbWV0ZXJOYW1lcygpIHsgcmV0dXJuIGR1bW15RW51bTsgfQorICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRQYXJhbWV0ZXJWYWx1ZXMoU3RyaW5nIG5hbWUpIHsgcmV0dXJuIG51bGw7IH0KKyAgICBwdWJsaWMgUmVxdWVzdERpc3BhdGNoZXIgZ2V0UmVxdWVzdERpc3BhdGNoZXIoU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXV0aFR5cGUoKSB7IHJldHVybiBudWxsOyB9CisgICAgcHVibGljIENvb2tpZVtdIGdldENvb2tpZXMoKSB7IHJldHVybiBudWxsOyB9CisgICAgcHVibGljIGxvbmcgZ2V0RGF0ZUhlYWRlcihTdHJpbmcgbmFtZSkgeyByZXR1cm4gLTE7IH0KKyAgICBwdWJsaWMgU3RyaW5nIGdldEhlYWRlcihTdHJpbmcgbmFtZSkgeyByZXR1cm4gbnVsbDsgfQorICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRIZWFkZXJzKFN0cmluZyBuYW1lKSB7IHJldHVybiBudWxsOyB9CisgICAgcHVibGljIEVudW1lcmF0aW9uIGdldEhlYWRlck5hbWVzKCkgeyByZXR1cm4gbnVsbDsgfQorICAgIHB1YmxpYyBpbnQgZ2V0SW50SGVhZGVyKFN0cmluZyBuYW1lKSB7IHJldHVybiAtMTsgfQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kKCkgeyByZXR1cm4gbnVsbDsgfQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aFRyYW5zbGF0ZWQoKSB7IHJldHVybiBudWxsOyB9CisgICAgcHVibGljIFN0cmluZyBnZXRSZW1vdGVVc2VyKCkgeyByZXR1cm4gbnVsbDsgfQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVxdWVzdGVkU2Vzc2lvbklkKCkgeyByZXR1cm4gbnVsbDsgfQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVxdWVzdFVSSSgpIHsgcmV0dXJuIG51bGw7IH0KKyAgICBwdWJsaWMgdm9pZCBzZXREZWNvZGVkUmVxdWVzdFVSSShTdHJpbmcgdXJpKSB7fQorICAgIHB1YmxpYyBTdHJpbmdCdWZmZXIgZ2V0UmVxdWVzdFVSTCgpIHsgcmV0dXJuIG51bGw7IH0KKyAgICBwdWJsaWMgSHR0cFNlc3Npb24gZ2V0U2Vzc2lvbigpIHsgcmV0dXJuIG51bGw7IH0KKyAgICBwdWJsaWMgSHR0cFNlc3Npb24gZ2V0U2Vzc2lvbihib29sZWFuIGNyZWF0ZSkgeyByZXR1cm4gbnVsbDsgfQorICAgIHB1YmxpYyBib29sZWFuIGlzUmVxdWVzdGVkU2Vzc2lvbklkRnJvbUNvb2tpZSgpIHsgcmV0dXJuIGZhbHNlOyB9CisgICAgcHVibGljIGJvb2xlYW4gaXNSZXF1ZXN0ZWRTZXNzaW9uSWRGcm9tVVJMKCkgeyByZXR1cm4gZmFsc2U7IH0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JlcXVlc3RlZFNlc3Npb25JZEZyb21VcmwoKSB7IHJldHVybiBmYWxzZTsgfQorICAgIHB1YmxpYyBib29sZWFuIGlzUmVxdWVzdGVkU2Vzc2lvbklkVmFsaWQoKSB7IHJldHVybiBmYWxzZTsgfQorICAgIHB1YmxpYyBib29sZWFuIGlzVXNlckluUm9sZShTdHJpbmcgcm9sZSkgeyByZXR1cm4gZmFsc2U7IH0KKyAgICBwdWJsaWMgUHJpbmNpcGFsIGdldFVzZXJQcmluY2lwYWwoKSB7IHJldHVybiBudWxsOyB9CisgICAgcHVibGljIFN0cmluZyBnZXRMb2NhbEFkZHIoKSB7IHJldHVybiBudWxsOyB9ICAgIAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxOYW1lKCkgeyByZXR1cm4gbnVsbDsgfQorICAgIHB1YmxpYyBpbnQgZ2V0TG9jYWxQb3J0KCkgeyByZXR1cm4gLTE7IH0KKyAgICBwdWJsaWMgaW50IGdldFJlbW90ZVBvcnQoKSB7IHJldHVybiAtMTsgfQorICAgIAorfQorCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29yZS9EdW1teVJlc3BvbnNlLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29yZS9EdW1teVJlc3BvbnNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZiZjg0ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb3JlL0R1bW15UmVzcG9uc2UuamF2YQpAQCAtMCwwICsxLDEyNCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlOworCisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldE91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuQ29va2llOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Db250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLkNvbm5lY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3Rvci5SZXF1ZXN0OworCisKKy8qKgorICogRHVtbXkgcmVzcG9uc2Ugb2JqZWN0LCB1c2VkIGZvciBKU1AgcHJlY29tcGlsYXRpb24uCisgKgorICogQGF1dGhvciBSZW15IE1hdWNoZXJhdAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgRHVtbXlSZXNwb25zZQorICAgIGltcGxlbWVudHMgSHR0cFNlcnZsZXRSZXNwb25zZSB7CisKKyAgICBwdWJsaWMgRHVtbXlSZXNwb25zZSgpIHsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldEFwcENvbW1pdHRlZChib29sZWFuIGFwcENvbW1pdHRlZCkge30KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0FwcENvbW1pdHRlZCgpIHsgcmV0dXJuIGZhbHNlOyB9CisgICAgcHVibGljIENvbm5lY3RvciBnZXRDb25uZWN0b3IoKSB7IHJldHVybiBudWxsOyB9CisgICAgcHVibGljIHZvaWQgc2V0Q29ubmVjdG9yKENvbm5lY3RvciBjb25uZWN0b3IpIHt9CisgICAgcHVibGljIGludCBnZXRDb250ZW50Q291bnQoKSB7IHJldHVybiAtMTsgfQorICAgIHB1YmxpYyBDb250ZXh0IGdldENvbnRleHQoKSB7IHJldHVybiBudWxsOyB9CisgICAgcHVibGljIHZvaWQgc2V0Q29udGV4dChDb250ZXh0IGNvbnRleHQpIHt9CisgICAgcHVibGljIGJvb2xlYW4gZ2V0SW5jbHVkZWQoKSB7IHJldHVybiBmYWxzZTsgfQorICAgIHB1YmxpYyB2b2lkIHNldEluY2x1ZGVkKGJvb2xlYW4gaW5jbHVkZWQpIHt9CisgICAgcHVibGljIFN0cmluZyBnZXRJbmZvKCkgeyByZXR1cm4gbnVsbDsgfQorICAgIHB1YmxpYyBSZXF1ZXN0IGdldFJlcXVlc3QoKSB7IHJldHVybiBudWxsOyB9CisgICAgcHVibGljIHZvaWQgc2V0UmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHt9CisgICAgcHVibGljIFNlcnZsZXRSZXNwb25zZSBnZXRSZXNwb25zZSgpIHsgcmV0dXJuIG51bGw7IH0KKyAgICBwdWJsaWMgT3V0cHV0U3RyZWFtIGdldFN0cmVhbSgpIHsgcmV0dXJuIG51bGw7IH0KKyAgICBwdWJsaWMgdm9pZCBzZXRTdHJlYW0oT3V0cHV0U3RyZWFtIHN0cmVhbSkge30KKyAgICBwdWJsaWMgdm9pZCBzZXRTdXNwZW5kZWQoYm9vbGVhbiBzdXNwZW5kZWQpIHt9CisgICAgcHVibGljIGJvb2xlYW4gaXNTdXNwZW5kZWQoKSB7IHJldHVybiBmYWxzZTsgfQorICAgIHB1YmxpYyB2b2lkIHNldEVycm9yKCkge30KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0Vycm9yKCkgeyByZXR1cm4gZmFsc2U7IH0KKyAgICBwdWJsaWMgU2VydmxldE91dHB1dFN0cmVhbSBjcmVhdGVPdXRwdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgcHVibGljIHZvaWQgZmluaXNoUmVzcG9uc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24ge30KKyAgICBwdWJsaWMgaW50IGdldENvbnRlbnRMZW5ndGgoKSB7IHJldHVybiAtMTsgfQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGUoKSB7IHJldHVybiBudWxsOyB9CisgICAgcHVibGljIFByaW50V3JpdGVyIGdldFJlcG9ydGVyKCkgeyByZXR1cm4gbnVsbDsgfQorICAgIHB1YmxpYyB2b2lkIHJlY3ljbGUoKSB7fQorICAgIHB1YmxpYyB2b2lkIHdyaXRlKGludCBiKSB0aHJvd3MgSU9FeGNlcHRpb24ge30KKyAgICBwdWJsaWMgdm9pZCB3cml0ZShieXRlIGJbXSkgdGhyb3dzIElPRXhjZXB0aW9uIHt9CisgICAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZSBiW10sIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7fQorICAgIHB1YmxpYyB2b2lkIGZsdXNoQnVmZmVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHt9CisgICAgcHVibGljIGludCBnZXRCdWZmZXJTaXplKCkgeyByZXR1cm4gLTE7IH0KKyAgICBwdWJsaWMgU3RyaW5nIGdldENoYXJhY3RlckVuY29kaW5nKCkgeyByZXR1cm4gbnVsbDsgfQorICAgIHB1YmxpYyB2b2lkIHNldENoYXJhY3RlckVuY29kaW5nKFN0cmluZyBjaGFyRW5jb2RpbmcpIHt9CisgICAgcHVibGljIFNlcnZsZXRPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIHB1YmxpYyBMb2NhbGUgZ2V0TG9jYWxlKCkgeyByZXR1cm4gbnVsbDsgfQorICAgIHB1YmxpYyBQcmludFdyaXRlciBnZXRXcml0ZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geyByZXR1cm4gbnVsbDsgfQorICAgIHB1YmxpYyBib29sZWFuIGlzQ29tbWl0dGVkKCkgeyByZXR1cm4gZmFsc2U7IH0KKyAgICBwdWJsaWMgdm9pZCByZXNldCgpIHt9CisgICAgcHVibGljIHZvaWQgcmVzZXRCdWZmZXIoKSB7fQorICAgIHB1YmxpYyB2b2lkIHNldEJ1ZmZlclNpemUoaW50IHNpemUpIHt9CisgICAgcHVibGljIHZvaWQgc2V0Q29udGVudExlbmd0aChpbnQgbGVuZ3RoKSB7fQorICAgIHB1YmxpYyB2b2lkIHNldENvbnRlbnRUeXBlKFN0cmluZyB0eXBlKSB7fQorICAgIHB1YmxpYyB2b2lkIHNldExvY2FsZShMb2NhbGUgbG9jYWxlKSB7fQorCisgICAgcHVibGljIENvb2tpZVtdIGdldENvb2tpZXMoKSB7IHJldHVybiBudWxsOyB9CisgICAgcHVibGljIFN0cmluZyBnZXRIZWFkZXIoU3RyaW5nIG5hbWUpIHsgcmV0dXJuIG51bGw7IH0KKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0SGVhZGVyTmFtZXMoKSB7IHJldHVybiBudWxsOyB9CisgICAgcHVibGljIFN0cmluZ1tdIGdldEhlYWRlclZhbHVlcyhTdHJpbmcgbmFtZSkgeyByZXR1cm4gbnVsbDsgfQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsgcmV0dXJuIG51bGw7IH0KKyAgICBwdWJsaWMgaW50IGdldFN0YXR1cygpIHsgcmV0dXJuIC0xOyB9CisgICAgcHVibGljIHZvaWQgcmVzZXQoaW50IHN0YXR1cywgU3RyaW5nIG1lc3NhZ2UpIHt9CisgICAgcHVibGljIHZvaWQgYWRkQ29va2llKENvb2tpZSBjb29raWUpIHt9CisgICAgcHVibGljIHZvaWQgYWRkRGF0ZUhlYWRlcihTdHJpbmcgbmFtZSwgbG9uZyB2YWx1ZSkge30KKyAgICBwdWJsaWMgdm9pZCBhZGRIZWFkZXIoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkge30KKyAgICBwdWJsaWMgdm9pZCBhZGRJbnRIZWFkZXIoU3RyaW5nIG5hbWUsIGludCB2YWx1ZSkge30KKyAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0hlYWRlcihTdHJpbmcgbmFtZSkgeyByZXR1cm4gZmFsc2U7IH0KKyAgICBwdWJsaWMgU3RyaW5nIGVuY29kZVJlZGlyZWN0VVJMKFN0cmluZyB1cmwpIHsgcmV0dXJuIG51bGw7IH0KKyAgICBwdWJsaWMgU3RyaW5nIGVuY29kZVJlZGlyZWN0VXJsKFN0cmluZyB1cmwpIHsgcmV0dXJuIG51bGw7IH0KKyAgICBwdWJsaWMgU3RyaW5nIGVuY29kZVVSTChTdHJpbmcgdXJsKSB7IHJldHVybiBudWxsOyB9CisgICAgcHVibGljIFN0cmluZyBlbmNvZGVVcmwoU3RyaW5nIHVybCkgeyByZXR1cm4gbnVsbDsgfQorICAgIHB1YmxpYyB2b2lkIHNlbmRBY2tub3dsZWRnZW1lbnQoKSB0aHJvd3MgSU9FeGNlcHRpb24ge30KKyAgICBwdWJsaWMgdm9pZCBzZW5kRXJyb3IoaW50IHN0YXR1cykgdGhyb3dzIElPRXhjZXB0aW9uIHt9CisgICAgcHVibGljIHZvaWQgc2VuZEVycm9yKGludCBzdGF0dXMsIFN0cmluZyBtZXNzYWdlKSB0aHJvd3MgSU9FeGNlcHRpb24ge30KKyAgICBwdWJsaWMgdm9pZCBzZW5kUmVkaXJlY3QoU3RyaW5nIGxvY2F0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24ge30KKyAgICBwdWJsaWMgdm9pZCBzZXREYXRlSGVhZGVyKFN0cmluZyBuYW1lLCBsb25nIHZhbHVlKSB7fQorICAgIHB1YmxpYyB2b2lkIHNldEhlYWRlcihTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7fQorICAgIHB1YmxpYyB2b2lkIHNldEludEhlYWRlcihTdHJpbmcgbmFtZSwgaW50IHZhbHVlKSB7fQorICAgIHB1YmxpYyB2b2lkIHNldFN0YXR1cyhpbnQgc3RhdHVzKSB7fQorICAgIHB1YmxpYyB2b2lkIHNldFN0YXR1cyhpbnQgc3RhdHVzLCBTdHJpbmcgbWVzc2FnZSkge30KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29yZS9Mb2NhbFN0cmluZ3MucHJvcGVydGllcyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb3JlL0xvY2FsU3RyaW5ncy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0NzE3ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29yZS9Mb2NhbFN0cmluZ3MucHJvcGVydGllcwpAQCAtMCwwICsxLDE3MiBAQAorYXBwbGljYXRpb25Db250ZXh0LmF0dHJpYnV0ZUV2ZW50PUV4Y2VwdGlvbiB0aHJvd24gYnkgYXR0cmlidXRlcyBldmVudCBsaXN0ZW5lcgorYXBwbGljYXRpb25Db250ZXh0Lm1hcHBpbmcuZXJyb3I9RXJyb3IgZHVyaW5nIG1hcHBpbmcKK2FwcGxpY2F0aW9uQ29udGV4dC5yZXF1ZXN0RGlzcGF0Y2hlci5pYWU9UGF0aCB7MH0gZG9lcyBub3Qgc3RhcnQgd2l0aCBhICIvIiBjaGFyYWN0ZXIKK2FwcGxpY2F0aW9uQ29udGV4dC5zZXRBdHRyaWJ1dGUubmFtZW51bGw9TmFtZSBjYW5ub3QgYmUgbnVsbAorYXBwbGljYXRpb25EaXNwYXRjaGVyLmFsbG9jYXRlRXhjZXB0aW9uPUFsbG9jYXRlIGV4Y2VwdGlvbiBmb3Igc2VydmxldCB7MH0KK2FwcGxpY2F0aW9uRGlzcGF0Y2hlci5kZWFsbG9jYXRlRXhjZXB0aW9uPURlYWxsb2NhdGUgZXhjZXB0aW9uIGZvciBzZXJ2bGV0IHswfQorYXBwbGljYXRpb25EaXNwYXRjaGVyLmZvcndhcmQuaXNlPUNhbm5vdCBmb3J3YXJkIGFmdGVyIHJlc3BvbnNlIGhhcyBiZWVuIGNvbW1pdHRlZAorYXBwbGljYXRpb25EaXNwYXRjaGVyLmZvcndhcmQudGhyb3c9Rm9yd2FyZGVkIHJlc291cmNlIHRocmV3IGFuIGV4Y2VwdGlvbgorYXBwbGljYXRpb25EaXNwYXRjaGVyLmluY2x1ZGUudGhyb3c9SW5jbHVkZWQgcmVzb3VyY2UgdGhyZXcgYW4gZXhjZXB0aW9uCithcHBsaWNhdGlvbkRpc3BhdGNoZXIuaXNVbmF2YWlsYWJsZT1TZXJ2bGV0IHswfSBpcyBjdXJyZW50bHkgdW5hdmFpbGFibGUKK2FwcGxpY2F0aW9uRGlzcGF0Y2hlci5zZXJ2aWNlRXhjZXB0aW9uPVNlcnZsZXQuc2VydmljZSgpIGZvciBzZXJ2bGV0IHswfSB0aHJldyBleGNlcHRpb24KK2FwcGxpY2F0aW9uUmVxdWVzdC5iYWRQYXJlbnQ9Q2Fubm90IGxvY2F0ZSBwYXJlbnQgUmVxdWVzdCBpbXBsZW1lbnRhdGlvbgorYXBwbGljYXRpb25SZXF1ZXN0LmJhZFJlcXVlc3Q9UmVxdWVzdCBpcyBub3QgYSBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXF1ZXN0V3JhcHBlcgorYXBwbGljYXRpb25SZXNwb25zZS5iYWRQYXJlbnQ9Q2Fubm90IGxvY2F0ZSBwYXJlbnQgUmVzcG9uc2UgaW1wbGVtZW50YXRpb24KK2FwcGxpY2F0aW9uUmVzcG9uc2UuYmFkUmVzcG9uc2U9UmVzcG9uc2UgaXMgbm90IGEgamF2YXguc2VydmxldC5TZXJ2bGV0UmVzcG9uc2VXcmFwcGVyCitjb250YWluZXJCYXNlLmFkZERlZmF1bHRNYXBwZXI9RXhjZXB0aW9uIGNvbmZpZ3VyaW5nIGRlZmF1bHQgbWFwcGVyIG9mIGNsYXNzIHswfQorY29udGFpbmVyQmFzZS5hbHJlYWR5U3RhcnRlZD1Db250YWluZXIgezB9IGhhcyBhbHJlYWR5IGJlZW4gc3RhcnRlZAorY29udGFpbmVyQmFzZS5ub3RDb25maWd1cmVkPU5vIGJhc2ljIFZhbHZlIGhhcyBiZWVuIGNvbmZpZ3VyZWQKK2NvbnRhaW5lckJhc2Uubm90U3RhcnRlZD1Db250YWluZXIgezB9IGhhcyBub3QgYmVlbiBzdGFydGVkCitmYXN0RW5naW5lTWFwcGVyLmFscmVhZHlTdGFydGVkPUZhc3RFbmdpbmVNYXBwZXIgezB9IGhhcyBhbHJlYWR5IGJlZW4gc3RhcnRlZAorZmFzdEVuZ2luZU1hcHBlci5ub3RTdGFydGVkPUZhc3RFbmdpbmVNYXBwZXIgezB9IGhhcyBub3QgeWV0IGJlZW4gc3RhcnRlZAorZmlsdGVyQ2hhaW4uZmlsdGVyPUZpbHRlciBleGVjdXRpb24gdGhyZXcgYW4gZXhjZXB0aW9uCitmaWx0ZXJDaGFpbi5zZXJ2bGV0PVNlcnZsZXQgZXhlY3V0aW9uIHRocmV3IGFuIGV4Y2VwdGlvbgoraHR0cENvbnRleHRNYXBwZXIuY29udGFpbmVyPVRoaXMgY29udGFpbmVyIGlzIG5vdCBhIFN0YW5kYXJkQ29udGV4dAoraHR0cEVuZ2luZU1hcHBlci5jb250YWluZXI9VGhpcyBjb250YWluZXIgaXMgbm90IGEgU3RhbmRhcmRFbmdpbmUKK2h0dHBIb3N0TWFwcGVyLmNvbnRhaW5lcj1UaGlzIGNvbnRhaW5lciBpcyBub3QgYSBTdGFuZGFyZEhvc3QKK2ludGVyY2VwdG9yVmFsdmUuYWxyZWFkeVN0YXJ0ZWQ9SW50ZXJjZXB0b3JWYWx2ZSBoYXMgYWxyZWFkeSBiZWVuIHN0YXJ0ZWQKK2ludGVyY2VwdG9yVmFsdmUubm90U3RhcnRlZD1JbnRlcmNlcHRvclZhbHZlIGhhcyBub3QgeWV0IGJlZW4gc3RhcnRlZAorbmFtaW5nLmJpbmRGYWlsZWQ9RmFpbGVkIHRvIGJpbmQgb2JqZWN0OiB7MH0KK25hbWluZy51bmJpbmRGYWlsZWQ9RmFpbGVkIHRvIHVuYmluZCBvYmplY3Q6IHswfQorbmFtaW5nLmludmFsaWRFbnZFbnRyeVR5cGU9RW52aXJvbm1lbnQgZW50cnkgezB9IGhhcyBhbiBpbnZhbGlkIHR5cGUKK25hbWluZy5pbnZhbGlkRW52RW50cnlWYWx1ZT1FbnZpcm9ubWVudCBlbnRyeSB7MH0gaGFzIGFuIGludmFsaWQgdmFsdWUKK25hbWluZy5uYW1pbmdDb250ZXh0Q3JlYXRpb25GYWlsZWQ9Q3JlYXRpb24gb2YgdGhlIG5hbWluZyBjb250ZXh0IGZhaWxlZDogezB9CitzdGFuZGFyZENvbnRleHQuYWxyZWFkeVN0YXJ0ZWQ9Q29udGV4dCBoYXMgYWxyZWFkeSBiZWVuIHN0YXJ0ZWQKK3N0YW5kYXJkQ29udGV4dC5hcHBsaWNhdGlvbkxpc3RlbmVyPUVycm9yIGNvbmZpZ3VyaW5nIGFwcGxpY2F0aW9uIGxpc3RlbmVyIG9mIGNsYXNzIHswfQorc3RhbmRhcmRDb250ZXh0LmFwcGxpY2F0aW9uU2tpcHBlZD1Ta2lwcGVkIGluc3RhbGxpbmcgYXBwbGljYXRpb24gbGlzdGVuZXJzIGR1ZSB0byBwcmV2aW91cyBlcnJvcihzKQorc3RhbmRhcmRDb250ZXh0LmJhZFJlcXVlc3Q9SW52YWxpZCByZXF1ZXN0IHBhdGggKHswfSkuCitzdGFuZGFyZENvbnRleHQuZXJyb3JQYWdlLmVycm9yPUVycm9yIHBhZ2UgbG9jYXRpb24gezB9IG11c3Qgc3RhcnQgd2l0aCBhICcvJworc3RhbmRhcmRDb250ZXh0LmVycm9yUGFnZS5yZXF1aXJlZD1FcnJvclBhZ2UgY2Fubm90IGJlIG51bGwKK3N0YW5kYXJkQ29udGV4dC5lcnJvclBhZ2Uud2FybmluZz1XQVJOSU5HOiBFcnJvciBwYWdlIGxvY2F0aW9uIHswfSBtdXN0IHN0YXJ0IHdpdGggYSAnLycgaW4gU2VydmxldCAyLjQKK3N0YW5kYXJkQ29udGV4dC5maWx0ZXJNYXAuZWl0aGVyPUZpbHRlciBtYXBwaW5nIG11c3Qgc3BlY2lmeSBlaXRoZXIgYSA8dXJsLXBhdHRlcm4+IG9yIGEgPHNlcnZsZXQtbmFtZT4KK3N0YW5kYXJkQ29udGV4dC5maWx0ZXJNYXAubmFtZT1GaWx0ZXIgbWFwcGluZyBzcGVjaWZpZXMgYW4gdW5rbm93biBmaWx0ZXIgbmFtZSB7MH0KK3N0YW5kYXJkQ29udGV4dC5maWx0ZXJNYXAucGF0dGVybj1JbnZhbGlkIDx1cmwtcGF0dGVybj4gezB9IGluIGZpbHRlciBtYXBwaW5nCitzdGFuZGFyZENvbnRleHQuZmlsdGVyU3RhcnQ9RXhjZXB0aW9uIHN0YXJ0aW5nIGZpbHRlciB7MH0KK3N0YW5kYXJkQ29udGV4dC5maWx0ZXJTdGFydEZhaWxlZD1GYWlsZWQgdG8gc3RhcnQgYXBwbGljYXRpb24gRmlsdGVycyBzdWNjZXNzZnVsbHkKK3N0YW5kYXJkQ29udGV4dC5yZXF1ZXN0TGlzdGVuZXJTdGFydEZhaWxlZD1GYWlsZWQgdG8gc3RhcnQgcmVxdWVzdCBsaXN0ZW5lciB2YWx2ZSBzdWNjZXNzZnVsbHkKK3N0YW5kYXJkQ29udGV4dC5yZXF1ZXN0TGlzdGVuZXJDb25maWcuYWRkZWQ9QWRkZWQgcmVxdWVzdCBsaXN0ZW5lciBWYWx2ZQorc3RhbmRhcmRDb250ZXh0LnJlcXVlc3RMaXN0ZW5lckNvbmZpZy5lcnJvcj1FeGNlcHRpb24gYWRkaW5nIHJlcXVlc3QgbGlzdGVuZXIgVmFsdmU6IHswfQorc3RhbmRhcmRDb250ZXh0LmlzVW5hdmFpbGFibGU9VGhpcyBhcHBsaWNhdGlvbiBpcyBub3QgY3VycmVudGx5IGF2YWlsYWJsZQorc3RhbmRhcmRDb250ZXh0Lmxpc3RlbmVyU3RhcnQ9RXhjZXB0aW9uIHNlbmRpbmcgY29udGV4dCBpbml0aWFsaXplZCBldmVudCB0byBsaXN0ZW5lciBpbnN0YW5jZSBvZiBjbGFzcyB7MH0KK3N0YW5kYXJkQ29udGV4dC5saXN0ZW5lclN0YXJ0RmFpbGVkPUZhaWxlZCB0byBzdGFydCBhcHBsaWNhdGlvbiBMaXN0ZW5lcnMgc3VjY2Vzc2Z1bGx5CitzdGFuZGFyZENvbnRleHQubGlzdGVuZXJTdG9wPUV4Y2VwdGlvbiBzZW5kaW5nIGNvbnRleHQgZGVzdHJveWVkIGV2ZW50IHRvIGxpc3RlbmVyIGluc3RhbmNlIG9mIGNsYXNzIHswfQorc3RhbmRhcmRDb250ZXh0LmxvZ2luQ29uZmlnLmVycm9yUGFnZT1Gb3JtIGVycm9yIHBhZ2UgezB9IG11c3Qgc3RhcnQgd2l0aCBhICcvJworc3RhbmRhcmRDb250ZXh0LmxvZ2luQ29uZmlnLmVycm9yV2FybmluZz1XQVJOSU5HOiBGb3JtIGVycm9yIHBhZ2UgezB9IG11c3Qgc3RhcnQgd2l0aCBhICcvJyBpbiBTZXJ2bGV0IDIuNAorc3RhbmRhcmRDb250ZXh0LmxvZ2luQ29uZmlnLmxvZ2luUGFnZT1Gb3JtIGxvZ2luIHBhZ2UgezB9IG11c3Qgc3RhcnQgd2l0aCBhICcvJworc3RhbmRhcmRDb250ZXh0LmxvZ2luQ29uZmlnLmxvZ2luV2FybmluZz1XQVJOSU5HOiBGb3JtIGxvZ2luIHBhZ2UgezB9IG11c3Qgc3RhcnQgd2l0aCBhICcvJyBpbiBTZXJ2bGV0IDIuNAorc3RhbmRhcmRDb250ZXh0LmxvZ2luQ29uZmlnLnJlcXVpcmVkPUxvZ2luQ29uZmlnIGNhbm5vdCBiZSBudWxsCitzdGFuZGFyZENvbnRleHQubWFwcGluZ0Vycm9yPU1BUFBJTkcgY29uZmlndXJhdGlvbiBlcnJvciBmb3IgcmVsYXRpdmUgVVJJIHswfQorc3RhbmRhcmRDb250ZXh0Lm5vdEZvdW5kPVRoZSByZXF1ZXN0ZWQgcmVzb3VyY2UgKHswfSkgaXMgbm90IGF2YWlsYWJsZS4KK3N0YW5kYXJkQ29udGV4dC5ub3RSZWxvYWRhYmxlPVJlbG9hZGluZyBpcyBkaXNhYmxlZCBvbiB0aGlzIENvbnRleHQKK3N0YW5kYXJkQ29udGV4dC5ub3RTdGFydGVkPUNvbnRleHQgaGFzIG5vdCB5ZXQgYmVlbiBzdGFydGVkCitzdGFuZGFyZENvbnRleHQubm90V3JhcHBlcj1DaGlsZCBvZiBhIENvbnRleHQgbXVzdCBiZSBhIFdyYXBwZXIKK3N0YW5kYXJkQ29udGV4dC5wYXJhbWV0ZXIuZHVwbGljYXRlPUR1cGxpY2F0ZSBjb250ZXh0IGluaXRpYWxpemF0aW9uIHBhcmFtZXRlciB7MH0KK3N0YW5kYXJkQ29udGV4dC5wYXJhbWV0ZXIucmVxdWlyZWQ9Qm90aCBwYXJhbWV0ZXIgbmFtZSBhbmQgcGFyYW1ldGVyIHZhbHVlIGFyZSByZXF1aXJlZAorc3RhbmRhcmRDb250ZXh0LnJlbG9hZGluZ0NvbXBsZXRlZD1SZWxvYWRpbmcgdGhpcyBDb250ZXh0IGlzIGNvbXBsZXRlZAorc3RhbmRhcmRDb250ZXh0LnJlbG9hZGluZ0ZhaWxlZD1SZWxvYWRpbmcgdGhpcyBDb250ZXh0IGZhaWxlZCBkdWUgdG8gcHJldmlvdXMgZXJyb3JzCitzdGFuZGFyZENvbnRleHQucmVsb2FkaW5nU3RhcnRlZD1SZWxvYWRpbmcgdGhpcyBDb250ZXh0IGhhcyBzdGFydGVkCitzdGFuZGFyZENvbnRleHQucmVzb3VyY2VzU3RhcnQ9RXJyb3Igc3RhcnRpbmcgc3RhdGljIFJlc291cmNlcworc3RhbmRhcmRDb250ZXh0LnNlY3VyaXR5Q29uc3RyYWludC5wYXR0ZXJuPUludmFsaWQgPHVybC1wYXR0ZXJuPiB7MH0gaW4gc2VjdXJpdHkgY29uc3RyYWludAorc3RhbmRhcmRDb250ZXh0LnNlcnZsZXRNYXAubmFtZT1TZXJ2bGV0IG1hcHBpbmcgc3BlY2lmaWVzIGFuIHVua25vd24gc2VydmxldCBuYW1lIHswfQorc3RhbmRhcmRDb250ZXh0LnNlcnZsZXRNYXAucGF0dGVybj1JbnZhbGlkIDx1cmwtcGF0dGVybj4gezB9IGluIHNlcnZsZXQgbWFwcGluZworc3RhbmRhcmRDb250ZXh0LnN0YXJ0Q2xlYW51cD1FeGNlcHRpb24gZHVyaW5nIGNsZWFudXAgYWZ0ZXIgc3RhcnQgZmFpbGVkCitzdGFuZGFyZENvbnRleHQuc3RhcnRGYWlsZWQ9Q29udGV4dCBzdGFydHVwIGZhaWxlZCBkdWUgdG8gcHJldmlvdXMgZXJyb3JzCitzdGFuZGFyZENvbnRleHQuc3RhcnRpbmdMb2FkZXI9RXhjZXB0aW9uIHN0YXJ0aW5nIExvYWRlcgorc3RhbmRhcmRDb250ZXh0LnN0YXJ0aW5nTWFuYWdlcj1FeGNlcHRpb24gc3RhcnRpbmcgTWFuYWdlcgorc3RhbmRhcmRDb250ZXh0LnN0YXJ0aW5nV3JhcHBlcj1FeGNlcHRpb24gc3RhcnRpbmcgV3JhcHBlciBmb3Igc2VydmxldCB7MH0KK3N0YW5kYXJkQ29udGV4dC5zdG9wcGluZ0NvbnRleHQ9RXhjZXB0aW9uIHN0b3BwaW5nIENvbnRleHQKK3N0YW5kYXJkQ29udGV4dC5zdG9wcGluZ0xvYWRlcj1FeGNlcHRpb24gc3RvcHBpbmcgTG9hZGVyCitzdGFuZGFyZENvbnRleHQuc3RvcHBpbmdNYW5hZ2VyPUV4Y2VwdGlvbiBzdG9wcGluZyBNYW5hZ2VyCitzdGFuZGFyZENvbnRleHQuc3RvcHBpbmdXcmFwcGVyPUV4Y2VwdGlvbiBzdG9wcGluZyBXcmFwcGVyIGZvciBzZXJ2bGV0IHswfQorc3RhbmRhcmRDb250ZXh0LnVybERlY29kZT1DYW5ub3QgVVJMIGRlY29kZSByZXF1ZXN0IHBhdGggezB9CitzdGFuZGFyZENvbnRleHQudXJsUGF0dGVybi5wYXR0ZXJuV2FybmluZz1XQVJOSU5HOiBVUkwgcGF0dGVybiB7MH0gbXVzdCBzdGFydCB3aXRoIGEgJy8nIGluIFNlcnZsZXQgMi40CitzdGFuZGFyZENvbnRleHQudXJsVmFsaWRhdGU9Q2Fubm90IHZhbGlkYXRlIFVSTCBkZWNvZGVkIHJlcXVlc3QgcGF0aCB7MH0KK3N0YW5kYXJkQ29udGV4dC53cmFwcGVyLmVycm9yPUpTUCBmaWxlIHswfSBtdXN0IHN0YXJ0IHdpdGggYSAnLycKK3N0YW5kYXJkQ29udGV4dC53cmFwcGVyLndhcm5pbmc9V0FSTklORzogSlNQIGZpbGUgezB9IG11c3Qgc3RhcnQgd2l0aCBhICcvJyBpbiBTZXJ2bGV0IDIuNAorc3RhbmRhcmRFbmdpbmUuYWxyZWFkeVN0YXJ0ZWQ9RW5naW5lIGhhcyBhbHJlYWR5IGJlZW4gc3RhcnRlZAorc3RhbmRhcmRFbmdpbmUubWFwcGluZ0Vycm9yPU1BUFBJTkcgY29uZmlndXJhdGlvbiBlcnJvciBmb3Igc2VydmVyIG5hbWUgezB9CitzdGFuZGFyZEVuZ2luZS5ub0hvc3Q9Tm8gSG9zdCBtYXRjaGVzIHNlcnZlciBuYW1lIHswfQorc3RhbmRhcmRFbmdpbmUubm9Ib3N0SGVhZGVyPUhUVFAvMS4xIHJlcXVlc3Qgd2l0aCBubyBIb3N0OiBoZWFkZXIKK3N0YW5kYXJkRW5naW5lLm5vdEhvc3Q9Q2hpbGQgb2YgYW4gRW5naW5lIG11c3QgYmUgYSBIb3N0CitzdGFuZGFyZEVuZ2luZS5ub3RQYXJlbnQ9RW5naW5lIGNhbm5vdCBoYXZlIGEgcGFyZW50IENvbnRhaW5lcgorc3RhbmRhcmRFbmdpbmUubm90U3RhcnRlZD1FbmdpbmUgaGFzIG5vdCB5ZXQgYmVlbiBzdGFydGVkCitzdGFuZGFyZEVuZ2luZS51bmZvdW5kSG9zdD1WaXJ0dWFsIGhvc3QgezB9IG5vdCBmb3VuZAorc3RhbmRhcmRFbmdpbmUudW5rbm93bkhvc3Q9Tm8gc2VydmVyIGhvc3Qgc3BlY2lmaWVkIGluIHRoaXMgcmVxdWVzdAorc3RhbmRhcmRIb3N0LmFjY2Vzc0Jhc2U9Q2Fubm90IGFjY2VzcyBkb2N1bWVudCBiYXNlIGRpcmVjdG9yeSB7MH0KK3N0YW5kYXJkSG9zdC5hbHJlYWR5U3RhcnRlZD1Ib3N0IGhhcyBhbHJlYWR5IGJlZW4gc3RhcnRlZAorc3RhbmRhcmRIb3N0LmFwcEJhc2U9QXBwbGljYXRpb24gYmFzZSBkaXJlY3RvcnkgezB9IGRvZXMgbm90IGV4aXN0CitzdGFuZGFyZEhvc3QuY2xpZW50QWJvcnQ9UmVtb3RlIENsaWVudCBBYm9ydGVkIFJlcXVlc3QsIElPRXhjZXB0aW9uOiB7MH0KK3N0YW5kYXJkSG9zdC5jb25maWdSZXF1aXJlZD1VUkwgdG8gY29uZmlndXJhdGlvbiBmaWxlIGlzIHJlcXVpcmVkCitzdGFuZGFyZEhvc3QuY29uZmlnTm90QWxsb3dlZD1Vc2Ugb2YgY29uZmlndXJhdGlvbiBmaWxlIGlzIG5vdCBhbGxvd2VkCitzdGFuZGFyZEhvc3QuaW5zdGFsbEJhc2U9T25seSB3ZWIgYXBwbGljYXRpb25zIGluIHRoZSBIb3N0IHdlYiBhcHBsaWNhdGlvbiBkaXJlY3RvcnkgY2FuIGJlIGluc3RhbGxlZAorc3RhbmRhcmRIb3N0Lmluc3RhbGxpbmc9SW5zdGFsbGluZyB3ZWIgYXBwbGljYXRpb24gYXQgY29udGV4dCBwYXRoIHswfSBmcm9tIFVSTCB7MX0KK3N0YW5kYXJkSG9zdC5pbnN0YWxsaW5nV0FSPUluc3RhbGxpbmcgd2ViIGFwcGxpY2F0aW9uIGZyb20gVVJMIHswfQorc3RhbmRhcmRIb3N0Lmluc3RhbGxpbmdYTUw9UHJvY2Vzc2luZyBDb250ZXh0IGNvbmZpZ3VyYXRpb24gZmlsZSBVUkwgezB9CitzdGFuZGFyZEhvc3QuaW5zdGFsbEVycm9yPUVycm9yIGRlcGxveWluZyBhcHBsaWNhdGlvbiBhdCBjb250ZXh0IHBhdGggezB9CitzdGFuZGFyZEhvc3QuaW52YWxpZEVycm9yUmVwb3J0VmFsdmVDbGFzcz1Db3VsZG4ndCBsb2FkIHNwZWNpZmllZCBlcnJvciByZXBvcnQgdmFsdmUgY2xhc3M6IHswfQorc3RhbmRhcmRIb3N0LmRvY0Jhc2U9RG9jdW1lbnQgYmFzZSBkaXJlY3RvcnkgezB9IGFscmVhZHkgZXhpc3RzCitzdGFuZGFyZEhvc3QubWFwcGluZ0Vycm9yPU1BUFBJTkcgY29uZmlndXJhdGlvbiBlcnJvciBmb3IgcmVxdWVzdCBVUkkgezB9CitzdGFuZGFyZEhvc3Qubm9Db250ZXh0PU5vIENvbnRleHQgY29uZmlndXJlZCB0byBwcm9jZXNzIHRoaXMgcmVxdWVzdAorc3RhbmRhcmRIb3N0Lm5vSG9zdD1ObyBIb3N0IGNvbmZpZ3VyZWQgdG8gcHJvY2VzcyB0aGlzIHJlcXVlc3QKK3N0YW5kYXJkSG9zdC5ub3RDb250ZXh0PUNoaWxkIG9mIGEgSG9zdCBtdXN0IGJlIGEgQ29udGV4dAorc3RhbmRhcmRIb3N0Lm5vdFN0YXJ0ZWQ9SG9zdCBoYXMgbm90IHlldCBiZWVuIHN0YXJ0ZWQKK3N0YW5kYXJkSG9zdC5udWxsTmFtZT1Ib3N0IG5hbWUgaXMgcmVxdWlyZWQKK3N0YW5kYXJkSG9zdC5wYXRoRm9ybWF0PUludmFsaWQgY29udGV4dCBwYXRoOiB7MH0KK3N0YW5kYXJkSG9zdC5wYXRoTWF0Y2g9Q29udGV4dCBwYXRoIHswfSBtdXN0IG1hdGNoIHRoZSBkaXJlY3Rvcnkgb3IgV0FSIGZpbGUgbmFtZTogezF9CitzdGFuZGFyZEhvc3QucGF0aE1pc3Npbmc9Q29udGV4dCBwYXRoIHswfSBpcyBub3QgY3VycmVudGx5IGluIHVzZQorc3RhbmRhcmRIb3N0LnBhdGhSZXF1aXJlZD1Db250ZXh0IHBhdGggaXMgcmVxdWlyZWQKK3N0YW5kYXJkSG9zdC5wYXRoVXNlZD1Db250ZXh0IHBhdGggezB9IGlzIGFscmVhZHkgaW4gdXNlCitzdGFuZGFyZEhvc3QucmVtb3Zpbmc9UmVtb3Zpbmcgd2ViIGFwcGxpY2F0aW9uIGF0IGNvbnRleHQgcGF0aCB7MH0KK3N0YW5kYXJkSG9zdC5yZW1vdmVFcnJvcj1FcnJvciByZW1vdmluZyBhcHBsaWNhdGlvbiBhdCBjb250ZXh0IHBhdGggezB9CitzdGFuZGFyZEhvc3Quc3RhcnQ9U3RhcnRpbmcgd2ViIGFwcGxpY2F0aW9uIGF0IGNvbnRleHQgcGF0aCB7MH0KK3N0YW5kYXJkSG9zdC5zdG9wPVN0b3BwaW5nIHdlYiBhcHBsaWNhdGlvbiBhdCBjb250ZXh0IHBhdGggezB9CitzdGFuZGFyZEhvc3QudW5mb3VuZENvbnRleHQ9Q2Fubm90IGZpbmQgY29udGV4dCBmb3IgcmVxdWVzdCBVUkkgezB9CitzdGFuZGFyZEhvc3Qud2FyUmVxdWlyZWQ9VVJMIHRvIHdlYiBhcHBsaWNhdGlvbiBhcmNoaXZlIGlzIHJlcXVpcmVkCitzdGFuZGFyZEhvc3Qud2FyVVJMPUludmFsaWQgVVJMIGZvciB3ZWIgYXBwbGljYXRpb24gYXJjaGl2ZTogezB9CitzdGFuZGFyZEhvc3QudmFsaWRhdGlvbkVuYWJsZWQ9WE1MIHZhbGlkYXRpb24gZW5hYmxlZAorc3RhbmRhcmRIb3N0LnZhbGlkYXRpb25EaXNhYmxlZD1YTUwgdmFsaWRhdGlvbiBkaXNhYmxlZAorc3RhbmRhcmRQaXBlbGluZS5hbHJlYWR5U3RhcnRlZD1QaXBlbGluZSBoYXMgYWxyZWFkeSBiZWVuIHN0YXJ0ZWQKK3N0YW5kYXJkUGlwZWxpbmUubm90U3RhcnRlZD1QaXBlbGluZSBoYXMgbm90IGJlZW4gc3RhcnRlZAorc3RhbmRhcmRQaXBlbGluZS5ub1ZhbHZlPU5vIG1vcmUgVmFsdmVzIGluIHRoZSBQaXBlbGluZSBwcm9jZXNzaW5nIHRoaXMgcmVxdWVzdAorc3RhbmRhcmRTZXJ2ZXIuYWRkQ29udGFpbmVyLmlzZT1ObyBjb25uZWN0b3JzIGF2YWlsYWJsZSB0byBhc3NvY2lhdGUgdGhpcyBjb250YWluZXIgd2l0aAorc3RhbmRhcmRTZXJ2ZXIuaW5pdGlhbGl6ZS5pbml0aWFsaXplZD1UaGlzIHNlcnZlciBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkCitzdGFuZGFyZFNlcnZlci5zdGFydC5jb25uZWN0b3JzPUF0IGxlYXN0IG9uZSBjb25uZWN0b3IgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCBhbnkgY29udGFpbmVyCitzdGFuZGFyZFNlcnZlci5zdGFydC5zdGFydGVkPVRoaXMgc2VydmVyIGhhcyBhbHJlYWR5IGJlZW4gc3RhcnRlZAorc3RhbmRhcmRTZXJ2ZXIuc3RvcC5ub3RTdGFydGVkPVRoaXMgc2VydmVyIGhhcyBub3QgeWV0IGJlZW4gc3RhcnRlZAorc3RhbmRhcmRTZXJ2aWNlLmluaXRpYWxpemUuaW5pdGlhbGl6ZWQ9VGhpcyBzZXJ2aWNlIGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQKK3N0YW5kYXJkU2VydmljZS5zdGFydC5uYW1lPVN0YXJ0aW5nIHNlcnZpY2UgezB9CitzdGFuZGFyZFNlcnZpY2Uuc3RhcnQuc3RhcnRlZD1UaGlzIHNlcnZpY2UgaGFzIGFscmVhZHkgYmVlbiBzdGFydGVkCitzdGFuZGFyZFNlcnZpY2Uuc3RvcC5uYW1lPVN0b3BwaW5nIHNlcnZpY2UgezB9CitzdGFuZGFyZFNlcnZpY2Uuc3RvcC5ub3RTdGFydGVkPVRoaXMgc2VydmljZSBoYXMgbm90IHlldCBiZWVuIHN0YXJ0ZWQKK3N0YW5kYXJkV3JhcHBlci5hbGxvY2F0ZT1FcnJvciBhbGxvY2F0aW5nIGEgc2VydmxldCBpbnN0YW5jZQorc3RhbmRhcmRXcmFwcGVyLmFsbG9jYXRlRXhjZXB0aW9uPUFsbG9jYXRlIGV4Y2VwdGlvbiBmb3Igc2VydmxldCB7MH0KK3N0YW5kYXJkV3JhcHBlci5jb250YWluZXJTZXJ2bGV0PUxvYWRpbmcgY29udGFpbmVyIHNlcnZsZXQgezB9CitzdGFuZGFyZFdyYXBwZXIuY3JlYXRlRmlsdGVycz1DcmVhdGUgZmlsdGVycyBleGNlcHRpb24gZm9yIHNlcnZsZXQgezB9CitzdGFuZGFyZFdyYXBwZXIuZGVhbGxvY2F0ZUV4Y2VwdGlvbj1EZWFsbG9jYXRlIGV4Y2VwdGlvbiBmb3Igc2VydmxldCB7MH0KK3N0YW5kYXJkV3JhcHBlci5kZXN0cm95RXhjZXB0aW9uPVNlcnZsZXQuZGVzdHJveSgpIGZvciBzZXJ2bGV0IHswfSB0aHJldyBleGNlcHRpb24KK3N0YW5kYXJkV3JhcHBlci5leGNlcHRpb24wPVRvbWNhdCBFeGNlcHRpb24gUmVwb3J0CitzdGFuZGFyZFdyYXBwZXIuZXhjZXB0aW9uMT1BIFNlcnZsZXQgRXhjZXB0aW9uIEhhcyBPY2N1cnJlZAorc3RhbmRhcmRXcmFwcGVyLmV4Y2VwdGlvbjI9RXhjZXB0aW9uIFJlcG9ydDoKK3N0YW5kYXJkV3JhcHBlci5leGNlcHRpb24zPVJvb3QgQ2F1c2U6CitzdGFuZGFyZFdyYXBwZXIuaW5pdEV4Y2VwdGlvbj1TZXJ2bGV0LmluaXQoKSBmb3Igc2VydmxldCB7MH0gdGhyZXcgZXhjZXB0aW9uCitzdGFuZGFyZFdyYXBwZXIuaW5zdGFudGlhdGU9RXJyb3IgaW5zdGFudGlhdGluZyBzZXJ2bGV0IGNsYXNzIHswfQorc3RhbmRhcmRXcmFwcGVyLmlzVW5hdmFpbGFibGU9U2VydmxldCB7MH0gaXMgY3VycmVudGx5IHVuYXZhaWxhYmxlCitzdGFuZGFyZFdyYXBwZXIuamFzcGVyTG9hZGVyPVVzaW5nIEphc3BlciBjbGFzc2xvYWRlciBmb3Igc2VydmxldCB7MH0KK3N0YW5kYXJkV3JhcHBlci5qc3BGaWxlLmZvcm1hdD1KU1AgZmlsZSB7MH0gZG9lcyBub3Qgc3RhcnQgd2l0aCBhICcvJyBjaGFyYWN0ZXIKK3N0YW5kYXJkV3JhcHBlci5sb2FkRXhjZXB0aW9uPVNlcnZsZXQgezB9IHRocmV3IGxvYWQoKSBleGNlcHRpb24KK3N0YW5kYXJkV3JhcHBlci5taXNzaW5nQ2xhc3M9V3JhcHBlciBjYW5ub3QgZmluZCBzZXJ2bGV0IGNsYXNzIHswfSBvciBhIGNsYXNzIGl0IGRlcGVuZHMgb24KK3N0YW5kYXJkV3JhcHBlci5taXNzaW5nTG9hZGVyPVdyYXBwZXIgY2Fubm90IGZpbmQgTG9hZGVyIGZvciBzZXJ2bGV0IHswfQorc3RhbmRhcmRXcmFwcGVyLm5vdENoaWxkPVdyYXBwZXIgY29udGFpbmVyIG1heSBub3QgaGF2ZSBjaGlsZCBjb250YWluZXJzCitzdGFuZGFyZFdyYXBwZXIubm90Q2xhc3M9Tm8gc2VydmxldCBjbGFzcyBoYXMgYmVlbiBzcGVjaWZpZWQgZm9yIHNlcnZsZXQgezB9CitzdGFuZGFyZFdyYXBwZXIubm90Q29udGV4dD1QYXJlbnQgY29udGFpbmVyIG9mIGEgV3JhcHBlciBtdXN0IGJlIGEgQ29udGV4dAorc3RhbmRhcmRXcmFwcGVyLm5vdEZvdW5kPVNlcnZsZXQgezB9IGlzIG5vdCBhdmFpbGFibGUKK3N0YW5kYXJkV3JhcHBlci5ub3RTZXJ2bGV0PUNsYXNzIHswfSBpcyBub3QgYSBTZXJ2bGV0CitzdGFuZGFyZFdyYXBwZXIucHJpdmlsZWdlZFNlcnZsZXQ9U2VydmxldCBvZiBjbGFzcyB7MH0gaXMgcHJpdmlsZWdlZCBhbmQgY2Fubm90IGJlIGxvYWRlZCBieSB0aGlzIHdlYiBhcHBsaWNhdGlvbgorc3RhbmRhcmRXcmFwcGVyLnJlbGVhc2VGaWx0ZXJzPVJlbGVhc2UgZmlsdGVycyBleGNlcHRpb24gZm9yIHNlcnZsZXQgezB9CitzdGFuZGFyZFdyYXBwZXIuc2VydmljZUV4Y2VwdGlvbj1TZXJ2bGV0LnNlcnZpY2UoKSBmb3Igc2VydmxldCB7MH0gdGhyZXcgZXhjZXB0aW9uCitzdGFuZGFyZFdyYXBwZXIuc3RhdHVzSGVhZGVyPUhUVFAgU3RhdHVzIHswfSAtIHsxfQorc3RhbmRhcmRXcmFwcGVyLnN0YXR1c1RpdGxlPVRvbWNhdCBFcnJvciBSZXBvcnQKK3N0YW5kYXJkV3JhcHBlci51bmF2YWlsYWJsZT1NYXJraW5nIHNlcnZsZXQgezB9IGFzIHVuYXZhaWxhYmxlCitzdGFuZGFyZFdyYXBwZXIudW5sb2FkRXhjZXB0aW9uPVNlcnZsZXQgezB9IHRocmV3IHVubG9hZCgpIGV4Y2VwdGlvbgorc3RhbmRhcmRXcmFwcGVyLnVubG9hZGluZz1DYW5ub3QgYWxsb2NhdGUgc2VydmxldCB7MH0gYmVjYXVzZSBpdCBpcyBiZWluZyB1bmxvYWRlZAorc3RhbmRhcmRXcmFwcGVyLndhaXRpbmc9V2FpdGluZyBmb3IgezB9IGluc3RhbmNlKHMpIHRvIGJlIGRlYWxsb2NhdGVkCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29yZS9Mb2NhbFN0cmluZ3NfZXMucHJvcGVydGllcyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb3JlL0xvY2FsU3RyaW5nc19lcy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjODI3OTAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29yZS9Mb2NhbFN0cmluZ3NfZXMucHJvcGVydGllcwpAQCAtMCwwICsxLDE3MiBAQAorYXBwbGljYXRpb25Db250ZXh0LmF0dHJpYnV0ZUV2ZW50PUV4Y2VwY2nzbiBsYW56YWRhIHBvciBlc2N1Y2hhZG9yIGRlIGV2ZW50b3MgZGUgYXRyaWJ1dG9zCithcHBsaWNhdGlvbkNvbnRleHQubWFwcGluZy5lcnJvcj1FcnJvciBkdXJhbnRlIG1hcGVvCithcHBsaWNhdGlvbkNvbnRleHQucmVxdWVzdERpc3BhdGNoZXIuaWFlPUxhIFRyYXllY3RvcmlhIHswfSBubyBjb21pZW56YSBjb24gY2Fy4WN0ZXIgIi8iCithcHBsaWNhdGlvbkNvbnRleHQuc2V0QXR0cmlidXRlLm5hbWVudWxsPUVsIG5vbWJyZSBubyBwdWVkZSBzZXIgbnVsbworYXBwbGljYXRpb25EaXNwYXRjaGVyLmFsbG9jYXRlRXhjZXB0aW9uPUV4Y2VwY2nzbiBkZSByZXNlcnZhIGRlIGVzcGFjaW8gcGFyYSBzZXJ2bGV0IHswfQorYXBwbGljYXRpb25EaXNwYXRjaGVyLmRlYWxsb2NhdGVFeGNlcHRpb249RXhjZXBjafNuIGRlIHJlY3VwZXJhY2nzbiBkZSBlc3BhY2lvIHBhcmEgc2VydmxldCB7MH0KK2FwcGxpY2F0aW9uRGlzcGF0Y2hlci5mb3J3YXJkLmlzZT1ObyBwdWVkbyByZWVudmlhciBkZXNwdelzIGRlIHF1ZSBsYSByZXNwdWVzdGEgc2UgaGF5YSBsbGV2YWRvIGEgY2Fiby4KK2FwcGxpY2F0aW9uRGlzcGF0Y2hlci5mb3J3YXJkLnRocm93PUVsIHJlY3Vyc28gcmVlbnZpYWRvIGxhbnrzIHVuIGV4Y2VwY2nzbgorYXBwbGljYXRpb25EaXNwYXRjaGVyLmluY2x1ZGUudGhyb3c9RWwgcmVjdXJzbyBpbmNsde1kbyBsYW568yB1bmEgZXhjZXBjafNuCithcHBsaWNhdGlvbkRpc3BhdGNoZXIuaXNVbmF2YWlsYWJsZT1FbCBTZXJ2bGV0IHswfSBubyBlc3ThIGRpc3BvbmlibGUgZW4gZXN0ZSBtb21lbnRvCithcHBsaWNhdGlvbkRpc3BhdGNoZXIuc2VydmljZUV4Y2VwdGlvbj1FbCBTZXJ2bGV0LnNlcnZpY2UoKSBwYXJhIHNlcnZsZXQgezB9IGxhbnrzIHVuYSBleGNlcGNp824KK2FwcGxpY2F0aW9uUmVxdWVzdC5iYWRQYXJlbnQ9Tm8gcHVlZG8gbG9jYWxpemFyIGxhIGltcGxlbWVudGFjafNuIGRlIFJlcXVlcmltaWVudG8gcGFkcmUKK2FwcGxpY2F0aW9uUmVxdWVzdC5iYWRSZXF1ZXN0PUVsIHJlcXVlcmltaWVudG8gbm8gZXMgdW4gamF2YXguc2VydmxldC5TZXJ2bGV0UmVxdWVzdFdyYXBwZXIKK2FwcGxpY2F0aW9uUmVzcG9uc2UuYmFkUGFyZW50PU5vIHB1ZWRvIGxvY2FsaXphciBpbXBsZW1lbnRhY2nzbiBkZSBSZXNwdWVzdGEgcGFkcmUKK2FwcGxpY2F0aW9uUmVzcG9uc2UuYmFkUmVzcG9uc2U9TGEgUmVzcHVlc3RhIG5vIGVzIHVuIGphdmF4LnNlcnZsZXQuU2VydmxldFJlc3BvbnNlV3JhcHBlcgorY29udGFpbmVyQmFzZS5hZGREZWZhdWx0TWFwcGVyPUV4Y2VwY2nzbiBjb25maWd1cmFuZG8gbWFwZWFkb3IgcG9yIGRlZmVjdG8gZGUgY2xhc2UgezB9Citjb250YWluZXJCYXNlLmFscmVhZHlTdGFydGVkPVlhIGhhIHNpZG8gYXJyYW5jYWRvIGVsIENvbnRlbmVkb3IgezB9Citjb250YWluZXJCYXNlLm5vdENvbmZpZ3VyZWQ9Tm8gc2UgaGEgY29uZmlndXJhZG8gVuFsdnVsYSBi4XNpY2EKK2NvbnRhaW5lckJhc2Uubm90U3RhcnRlZD1ObyBzZSBoYSBhcnJhbmNhZG8gZWwgQ29udGVuZWRvciB7MH0KK2Zhc3RFbmdpbmVNYXBwZXIuYWxyZWFkeVN0YXJ0ZWQ9WWEgc2UgaGEgYXJyYW5jYWRvIGVsIEZhc3RFbmdpbmVNYXBwZXIgezB9CitmYXN0RW5naW5lTWFwcGVyLm5vdFN0YXJ0ZWQ9Tm8gc2UgaGEgYXJyYW5jYWRvIGH6biBlbCBGYXN0RW5naW5lTWFwcGVyIHswfQorZmlsdGVyQ2hhaW4uZmlsdGVyPUxhIGVqZWN1Y2nzbiBkZWwgRmlsdHJvIGxhbnrzIHVuYSBleGNlcGNp824KK2ZpbHRlckNoYWluLnNlcnZsZXQ9TGEgZWplY3VjafNuIGRlbCBTZXJ2bGV0IGxhbnrzIHVuYSBleGNlcGNp824KK2h0dHBDb250ZXh0TWFwcGVyLmNvbnRhaW5lcj1Fc3RlIENvbnRlbmVkb3Igbm8gZXMgdW4gU3RhbmRhcmRDb250ZXh0CitodHRwRW5naW5lTWFwcGVyLmNvbnRhaW5lcj1Fc3RlIENvbnRlbmVkb3Igbm8gZXMgdW4gU3RhbmRhcmRFbmdpbmUKK2h0dHBIb3N0TWFwcGVyLmNvbnRhaW5lcj1Fc3RhIENvbnRlbmVkb3Igbm8gZXMgdW5hIFN0YW5kYXJkSG9zdAoraW50ZXJjZXB0b3JWYWx2ZS5hbHJlYWR5U3RhcnRlZD1ZYSBoYSBzaWRvIGFycmFuY2FkYSBsYSBJbnRlcmNlcHRvclZhbHZlCitpbnRlcmNlcHRvclZhbHZlLm5vdFN0YXJ0ZWQ9QfpuIG5vIGhhIHNpZG8gYXJyYW5jYWRhIGxhIEludGVyY2VwdG9yVmFsdmUKK25hbWluZy5iaW5kRmFpbGVkPU5vIHB1ZGUgY2FtYmlhciAoYmluZCkgb2JqZXRvOiB7MH0KK25hbWluZy51bmJpbmRGYWlsZWQ9Tm8gcHVkZSBkZXNjYW1iaWFyICh1bmJpbmQpIG9iamVjdG86IHswfQorbmFtaW5nLmludmFsaWRFbnZFbnRyeVR5cGU9TGEgZW50cmFkYSBkZSBFbnRvcm5vIHswfSB0aWVuZSB1biB0aXBvIGluduFsaWRvCituYW1pbmcuaW52YWxpZEVudkVudHJ5VmFsdWU9TGEgZW50cmFkYSBkZSBFbnRvcm5vIHswfSB0aWVuZSB1biB2YWxvciBpbnbhbGlkbworbmFtaW5nLm5hbWluZ0NvbnRleHRDcmVhdGlvbkZhaWxlZD1GYWxs8yBsYSBjcmVhY2nzbiBkZWwgY29udGV4dG8gZGUgbm9tYnJlcyAobmFtaW5nKTogezB9CitzdGFuZGFyZENvbnRleHQuYWxyZWFkeVN0YXJ0ZWQ9WWEgc2UgaGEgYXJyYW5jYWRvIGVsIENvbnRleHRvCitzdGFuZGFyZENvbnRleHQuYXBwbGljYXRpb25MaXN0ZW5lcj1FcnJvciBjb25maWd1cmFuZG8gZXNjdWNoYWRvciBkZSBhcGxpY2FjafNuIGRlIGNsYXNlIHswfQorc3RhbmRhcmRDb250ZXh0LmFwcGxpY2F0aW9uU2tpcHBlZD1TZSBoYSBzYWx0YWRvIGxhIGluc3RhbGFjafNuIGRlIGVzY3VjaGFkb3JlcyBkZSBhcGxpY2FjafNuIGRlYmlkbyBhIGVycm9yKGVzKSBwcmV2aW8ocykKK3N0YW5kYXJkQ29udGV4dC5iYWRSZXF1ZXN0PVRyYXllY3RvcmlhIGRlIHJlcXVlcmltaWVudG8gaW524WxpZGEgKHswfSkuCitzdGFuZGFyZENvbnRleHQuZXJyb3JQYWdlLmVycm9yPUxhIGxvY2FsaXphY2nzbiBkZSBsYSBw4WdpbmEgZGUgZXJyb3IgMH0gZGViZSBkZSBjb21lbnphciBjb24gJy8nCitzdGFuZGFyZENvbnRleHQuZXJyb3JQYWdlLnJlcXVpcmVkPUVycm9yUGFnZSBubyBwdWVkZSBzZXIgbnVsbworc3RhbmRhcmRDb250ZXh0LmVycm9yUGFnZS53YXJuaW5nPUFWSVNPOiBMYSBsb2NhbGl6YWNp824gZGUgbGEgcOFnaW5hIGRlIGVycm9yIHswfSBkZWJlIGRlIGNvbWVuemFyIGNvbiAnLycgZW4gU2VydmxldCAyLjQKK3N0YW5kYXJkQ29udGV4dC5maWx0ZXJNYXAuZWl0aGVyPUVsIG1hcGVvIGRlIGZpbHRybyBkZWJlIGRlIGVzcGVjaWZpY2FyIG8gdW4gPHVybC1wYXR0ZXJuPiBvIHVuIDxzZXJ2bGV0LW5hbWU+CitzdGFuZGFyZENvbnRleHQuZmlsdGVyTWFwLm5hbWU9RWwgbWFwZW8gZGUgZmlsdHJvIGVzcGVjaWZpY2EgdW4gbm9tYnJlIGRlc2Nvbm9jaWRvIGRlIGZpbHRybyB7MH0KK3N0YW5kYXJkQ29udGV4dC5maWx0ZXJNYXAucGF0dGVybj08dXJsLXBhdHRlcm4+IHswfSBpbnbhbGlkbyBlbiBtYXBlbyBkZSBmaWx0cm8KK3N0YW5kYXJkQ29udGV4dC5maWx0ZXJTdGFydD1FeGNlcGNp824gYXJyYW5jYW5kbyBmaWx0cm8gezB9CitzdGFuZGFyZENvbnRleHQuZmlsdGVyU3RhcnRGYWlsZWQ9Tm8gcHVkZSBhcnJhbmNhciBGaWx0cm9zIGRlIGFwbGljYWNp824gY29uIOl4aXRvCitzdGFuZGFyZENvbnRleHQucmVxdWVzdExpc3RlbmVyU3RhcnRGYWlsZWQ9Tm8gcHVkZSBhcnJhbmNhciB24Wx2dWxhIGRlIGVzY3VjaGFkb3IgZGUgcmVxdWVyaW1pZW50byBjb24gZXhpdG8KK3N0YW5kYXJkQ29udGV4dC5yZXF1ZXN0TGlzdGVuZXJDb25maWcuYWRkZWQ9QfFhZGlkYSBW4Wx2dWxhIGRlIGVzY3VjaGFkb3IgZGUgcmVxdWVyaW1pZW50bworc3RhbmRhcmRDb250ZXh0LnJlcXVlc3RMaXN0ZW5lckNvbmZpZy5lcnJvcj1FeGNlcGNp824gYfFhZGllbmRvIFbhbHZ1bGEgZGUgZXNjdWNoYWRvciBkZSByZXF1ZXJpbWllbnRvOiB7MH0KK3N0YW5kYXJkQ29udGV4dC5pc1VuYXZhaWxhYmxlPUVzdGEgYXBsaWNhY2nzbiBubyBlc3ThIGRpc3BvbmlibGUgZW4gZXN0ZSBtb21lbnRvCitzdGFuZGFyZENvbnRleHQubGlzdGVuZXJTdGFydD1FeGNlcGNp824gZW52aWFuZG8gZXZlbnRvIGluaWNpYWxpemFkbyBkZSBjb250ZXh0byBhIGluc3RhbmNpYSBkZSBlc2N1Y2hhZG9yIGRlIGNsYXNlIHswfQorc3RhbmRhcmRDb250ZXh0Lmxpc3RlbmVyU3RhcnRGYWlsZWQ9Tm8gcHVkZSBhcnJhbmNhciBFc2N1Y2hhZG9yZXMgZGUgYXBsaWNhY2nzbiBjb24g6XhpdG8KK3N0YW5kYXJkQ29udGV4dC5saXN0ZW5lclN0b3A9RXhjZXBjafNuIGVudmlhbmRvIGV2ZW50byBkZSBjb250ZXh0byBkZXN0cnXtZG8gYSBpbnN0YW5jaWEgZGUgZXNjdWNoYWRvciBkZSBjbGFzZSB7MH0KK3N0YW5kYXJkQ29udGV4dC5sb2dpbkNvbmZpZy5lcnJvclBhZ2U9TGEgUOFnaW5hIGRlIGVycm9yIGRlIEZvcm11bGFyaW8gezB9IGRlYmUgZGUgY29tZW56YXIgY29uICcvJworc3RhbmRhcmRDb250ZXh0LmxvZ2luQ29uZmlnLmVycm9yV2FybmluZz1BVklTTzogTGEgcOFnaW5hIGRlIGVycm9yIGRlIEZvcm11bGFyaW8gezB9IGRlYmUgZGUgY29tZW56YXIgY29uICcvJyBlbiBTZXJ2bGV0IDIuNAorc3RhbmRhcmRDb250ZXh0LmxvZ2luQ29uZmlnLmxvZ2luUGFnZT1MYSBw4WdpbmEgZGUgbG9naW4gZGUgRm9ybXVsYXJpbyB7MH0gZGViZSBkZSBjb21lbnphciBjb24gJy8nCitzdGFuZGFyZENvbnRleHQubG9naW5Db25maWcubG9naW5XYXJuaW5nPUFWSVNPOiBMYSBw4WdpbmEgZGUgbG9naW4gZGUgRm9ybXVsYXJpbyB7MH0gZGViZSBkZSBjb21lbnphciBjb24gJy8nIGVuIFNlcnZsZXQgMi40CitzdGFuZGFyZENvbnRleHQubG9naW5Db25maWcucmVxdWlyZWQ9TG9naW5Db25maWcgbm8gcHVlZGUgc2VyIG51bGEKK3N0YW5kYXJkQ29udGV4dC5tYXBwaW5nRXJyb3I9RXJyb3IgZGUgY29uZmlndXJhY2nzbiBkZSBNQVBFTyBwYXJhIFVSSSByZWxhdGl2YSB7MH0KK3N0YW5kYXJkQ29udGV4dC5ub3RGb3VuZD1FbCByZWN1cnNvIHJlcXVlcmlkbyAoezB9KSBubyBzZSBlbmN1ZW50cmEgZGlzcG9uaWJsZQorc3RhbmRhcmRDb250ZXh0Lm5vdFJlbG9hZGFibGU9RXN04SBkZXNhY3RpdmFkYSBsYSByZWNhcmdhIGVuIGVzdGUgQ29udGV4dG8KK3N0YW5kYXJkQ29udGV4dC5ub3RTdGFydGVkPUH6biBubyBzZSBoYSBhcnJhbmNhZG8gZWwgQ29udGV4dG8KK3N0YW5kYXJkQ29udGV4dC5ub3RXcmFwcGVyPUVsIEhpam8gZGUgdW4gQ29udGV4dG8gZGViZSBkZSBzZXIgdW4gQXJyb3BhZG9yIChXcmFwcGVyKQorc3RhbmRhcmRDb250ZXh0LnBhcmFtZXRlci5kdXBsaWNhdGU9RHVwbGljYWRvIHBhcuFtZXRybyBkZSBpbmljaWFsaXphY2nzbiBkZSBjb250ZXh0byB7MH0KK3N0YW5kYXJkQ29udGV4dC5wYXJhbWV0ZXIucmVxdWlyZWQ9RXMgbmVjZXNhcmlvIHBvbmVyIG5vbWJyZSBkZSBwYXLhbWV0cm8geSB2YWxvciBkZSBwYXLhbWV0cm8KK3N0YW5kYXJkQ29udGV4dC5yZWxvYWRpbmdDb21wbGV0ZWQ9U2UgaGEgY29tcGxldGFkbyBsYSBSZWdhcmdhIGRlIGVzdGUgQ29udGV4dG8KK3N0YW5kYXJkQ29udGV4dC5yZWxvYWRpbmdGYWlsZWQ9RmFsbPMgbGEgcmVjYXJnYSBkZSBlc3RlIENvbnRleHRvIGRlYmlkbyBhIGVycm9yZXMgcHJldmlvcworc3RhbmRhcmRDb250ZXh0LnJlbG9hZGluZ1N0YXJ0ZWQ9SGEgY29tZW56YWRvIGxhIHJlY2FyZ2EgZGUgZXN0ZSBDb250ZXh0bworc3RhbmRhcmRDb250ZXh0LnJlc291cmNlc1N0YXJ0PUVycm9yIGFycmFuY2FuZG8gUmVjdXJzb3MgZXN04XRpY29zCitzdGFuZGFyZENvbnRleHQuc2VjdXJpdHlDb25zdHJhaW50LnBhdHRlcm49PHVybC1wYXR0ZXJuPiB7MH0gaW524WxpZGEgZW4gcmVzdHJpY2Np824gZGUgc2VndXJpZGFkCitzdGFuZGFyZENvbnRleHQuc2VydmxldE1hcC5uYW1lPUVsIG1hcGVvIGRlIFNlcnZsZXQgZXNwZWNpZmljYSB1biBub21icmUgZGUgc2VydmxldCBkZXNjb25vY2lkbyB7MH0KK3N0YW5kYXJkQ29udGV4dC5zZXJ2bGV0TWFwLnBhdHRlcm49PHVybC1wYXR0ZXJuPiB7MH0gaW524WxpZGEgZW4gbWFwZW8gZGUgc2VydmxldAorc3RhbmRhcmRDb250ZXh0LnN0YXJ0Q2xlYW51cD1FeGNlcGNp824gZHVyYW50ZSBsYSBsaW1waWV6YSB0cmFzIG5vIHBvZGVyIGFycmFuY2FyCitzdGFuZGFyZENvbnRleHQuc3RhcnRGYWlsZWQ9RmFsbPMgZW4gYXJyYW5xdWUgZGVsIENvbnRleHRvIGRlYmlkbyBhIGVycm9yZXMgcHJldmlvcworc3RhbmRhcmRDb250ZXh0LnN0YXJ0aW5nTG9hZGVyPUV4Y2VwY2nzbiBhcnJhbmNhbmRvIENhcmdhZG9yCitzdGFuZGFyZENvbnRleHQuc3RhcnRpbmdNYW5hZ2VyPUV4Y2VwY2nzbiBhcnJhbmNhbmRvIEdlc3Rvcgorc3RhbmRhcmRDb250ZXh0LnN0YXJ0aW5nV3JhcHBlcj1FeGNlcGNp824gYXJyYW5jYW5kbyBBcnJvcGFkb3IgKFdyYXBwZXIpIHBhcmEgc2VydmxldCB7MH0KK3N0YW5kYXJkQ29udGV4dC5zdG9wcGluZ0NvbnRleHQ9RXhjZXBjaT9uIHBhcmFuZG8gQ29udGV4dAorc3RhbmRhcmRDb250ZXh0LnN0b3BwaW5nTG9hZGVyPUV4Y2VwY2nzbiBwYXJhbmRvIENhcmdhZG9yCitzdGFuZGFyZENvbnRleHQuc3RvcHBpbmdNYW5hZ2VyPUV4Y2VwY2nzbiBwYXJhbmRvIEdlc3Rvcgorc3RhbmRhcmRDb250ZXh0LnN0b3BwaW5nV3JhcHBlcj1FeGNlcGNp824gcGFyYW5kbyBBcnJvcGFkb3IgKFdyYXBwZXIpIHBhcmEgc2VydmxldCB7MH0KK3N0YW5kYXJkQ29udGV4dC51cmxEZWNvZGU9Tm8gcHVlZG8gZGVjb2RpZmljYXIgVVJMIGRlIHRyYXllY3RvcmlhIGRlIHJlcXVlcmltaWVudG8gezB9CitzdGFuZGFyZENvbnRleHQudXJsUGF0dGVybi5wYXR0ZXJuV2FybmluZz1BVklTTzogZWwgcGF0cvNuIFVSTCB7MH0gZGViZSBkZSBjb21lbnphciBjb24gJy8nIGVuIFNlcnZsZXQgMi40CitzdGFuZGFyZENvbnRleHQudXJsVmFsaWRhdGU9Tm8gcHVlZG8gdmFsaWRhciB0cmF5ZWN0b3JpYSBkZSByZXF1ZXJpbWllbnRvIGRlIFVSTCBkZWNvZGlmaWNhZGEgezB9CitzdGFuZGFyZENvbnRleHQud3JhcHBlci5lcnJvcj1FbCBhcmNoaXZvIEpTUCB7MH0gZGViZSBkZSBjb21lbnphciBjb24gJy8nCitzdGFuZGFyZENvbnRleHQud3JhcHBlci53YXJuaW5nPUFWSVNPOiBFbCBhcmNoaXZvIEpTUCB7MH0gZGViZSBkZSBjb21lbnphciBjb24gJy8nIGVuIFNlcnZsZXQgMi40CitzdGFuZGFyZEVuZ2luZS5hbHJlYWR5U3RhcnRlZD1ZYSBoYSBzaWRvIGFycmFuY2FkbyBlbCBNb3Rvcgorc3RhbmRhcmRFbmdpbmUubWFwcGluZ0Vycm9yPUVycm9yIGRlIGNvbmZpZ3VyYWNp824gZGUgTUFQRU8gcGFyYSBub21icmUgZGUgc2Vydmlkb3IgezB9CitzdGFuZGFyZEVuZ2luZS5ub0hvc3Q9Tm8gaGF5IE3hcXVpbmEgcXVlIGNvaW5jaWRhIGNvbiBub21icmUgZGUgc2Vydmlkb3IgezB9CitzdGFuZGFyZEVuZ2luZS5ub0hvc3RIZWFkZXI9UmVxdWVyaW1pZW50byBIVFRQLzEuMSBzaW4gTeFxdWluYTogY2FiZWNlcmEKK3N0YW5kYXJkRW5naW5lLm5vdEhvc3Q9RWwgSGlqbyBkZSB1biBNb3RvciBkZWJlIGRlIHNlciB1biBN4XF1aW5hCitzdGFuZGFyZEVuZ2luZS5ub3RQYXJlbnQ9RWwgTW90b3Igbm8gcHVlZGUgdGVuZXIgdW4gQ29udGVuZWRvciBwYWRyZQorc3RhbmRhcmRFbmdpbmUubm90U3RhcnRlZD1B+m4gbm8gc2UgaGEgYXJyYW5jYWRvIGVsIE1vdG9yCitzdGFuZGFyZEVuZ2luZS51bmZvdW5kSG9zdD1N4XF1aW5hIHZpcnR1YWwgezB9IG5vIGhhbGxhZGEKK3N0YW5kYXJkRW5naW5lLnVua25vd25Ib3N0PU5vIHNlIGhhIGVzcGVjaWZpY2FkbyBt4XF1aW5hIHNlcnZpZG9yYSBlbiBlc3RlIHJlcXVlcmltaWVudG8KK3N0YW5kYXJkSG9zdC5hY2Nlc3NCYXNlPU5vIHB1ZWRvIGFjY2VkZXIgYSBkaXJlY3RvcmlvIGJhc2UgZGUgZG9jdW1lbnRvIHswfQorc3RhbmRhcmRIb3N0LmFscmVhZHlTdGFydGVkPVlhIGhhIHNpZG8gYXJyYW5jYWRhIGxhIE3hcXVpbmEKK3N0YW5kYXJkSG9zdC5hcHBCYXNlPU5vIGV4aXN0ZSBlbCBkaXJlY3RvcmlvIGJhc2UgZGUgYXBsaWNhY2nzbiB7MH0KK3N0YW5kYXJkSG9zdC5jbGllbnRBYm9ydD1FbCBDbGllbnRlIFJlbW90byBBYm9ydPMgZWwgUmVxdWVyaW1pZW50bywgSU9FeGNlcHRpb246IHswfQorc3RhbmRhcmRIb3N0LmNvbmZpZ1JlcXVpcmVkPUVzIG5lY2VzYXJpbyBwb25lciBsYSBVUkwgYSBhcmNoaXZvIGRlIGNvbmZpZ3VyYWNp824KK3N0YW5kYXJkSG9zdC5jb25maWdOb3RBbGxvd2VkPU5vIHNlIHBlcm1pdGUgZWwgdXNvIGRlbCBhcmNoaXZvIGRlIGNvbmZpZ3VyYWNp824KK3N0YW5kYXJkSG9zdC5pbnN0YWxsQmFzZT1T82xvIHNlIHB1ZWRlbiBpbnN0YWxhciBhcGxpY2FjaW9uZXMgd2ViIGVuIGVsIGRpcmVjdG9yaW8gZGUgYXBsaWNhY2lvbmVzIHdlYiBkZSBN4XF1aW5hCitzdGFuZGFyZEhvc3QuaW5zdGFsbGluZz1JbnN0YWxhbmRvIGFwbGljYWNpb25lcyB3ZWIgZW4gdHJheWVjdG9yaWEgZGUgY29udGV4dG8gezB9IGRlc2RlIFVSTCB7MX0KK3N0YW5kYXJkSG9zdC5pbnN0YWxsaW5nV0FSPUluc3RhbGFuZG8gYXBsaWNhY2nzbiB3ZWIgZGVzZGUgVVJMIHswfQorc3RhbmRhcmRIb3N0Lmluc3RhbGxpbmdYTUw9UHJvY2VzYW5kbyBVUkwgZGUgYXJjaGl2byBkZSBjb25maWd1cmFjafNuIGRlIENvbnRleHRvIHswfQorc3RhbmRhcmRIb3N0Lmluc3RhbGxFcnJvcj1FcnJvciBkZXNwbGVnYW5kbyBhcGxpY2FjafNuIGVuIHRyYXllY3RvcmlhIGRlIGNvbnRleHRvIHswfQorc3RhbmRhcmRIb3N0LmludmFsaWRFcnJvclJlcG9ydFZhbHZlQ2xhc3M9Tm8gcHVkZSBjYXJnYXIgY2xhc2UgZXNwZWNpZmlhZGEgZGUgduFsdnVsYSBkZSBpbmZvcm1lIGRlIGVycm9yOiB7MH0KK3N0YW5kYXJkSG9zdC5kb2NCYXNlPVlhIGV4aXN0ZSBlbCBkaXJlY3RvcmlvIGJhc2UgZGUgZG9jdW1lbnRvIHswfQorc3RhbmRhcmRIb3N0Lm1hcHBpbmdFcnJvcj1FcnJvciBkZSBjb25maWd1cmFjafNuIGRlIE1BUEVPIHBhcmEgVVJJIGRlIHJlcXVlcmltaWVudG8gezB9CitzdGFuZGFyZEhvc3Qubm9Db250ZXh0PU5vIHNlIGhhIGNvbmZpZ3VyYWRvIENvbnRleHRvIHBhcmEgcHJvY2VzYXIgZXN0ZSByZXF1ZXJpbWllbnRvCitzdGFuZGFyZEhvc3Qubm9Ib3N0PU5vIHNlIGhhIGNvbmZpZ3VyYWRvIE3hcXVpbmEgcGFyYSBwcm9jZXNhciBlc3RlIHJlcXVlcmltaWVudG8KK3N0YW5kYXJkSG9zdC5ub3RDb250ZXh0PUVsIEhpam8gZGUgdW5hIE3hcXVpbmEgZGViZSBkZSBzZXIgdW4gQ29udGV4dG8KK3N0YW5kYXJkSG9zdC5ub3RTdGFydGVkPUH6biBubyBzZSBoYSBhcnJhbmNhZG8gbGEgTeFxdWluYQorc3RhbmRhcmRIb3N0Lm51bGxOYW1lPUVzIG5lY2VzYXJpbyBwb25lciBlbCBub21icmUgZGUgTeFxdWluYQorc3RhbmRhcmRIb3N0LnBhdGhGb3JtYXQ9VHJheWVjdG9yaWEgZGUgY29udGV4dG8gaW524WxpZGE6IHswfQorc3RhbmRhcmRIb3N0LnBhdGhNYXRjaD1MYSB0cmF5ZWN0b3JpYSBkZSBDb250ZXh0byB7MH0gZGViZSBkZSBjb2luY2lkaXIgY29uIGVsIG5vbWJyZSBkZSBkaXJlY3RvcmlvIG8gZGUgYXJjaGl2byBXQVI6IHsxfQorc3RhbmRhcmRIb3N0LnBhdGhNaXNzaW5nPUxhIHRyYXllY3RvcmlhIGRlIENvbnRleHRvIHswfSBubyBlc3ThIGVuIHVzbyBlbiBlc3RlIG1vbWVudG8KK3N0YW5kYXJkSG9zdC5wYXRoUmVxdWlyZWQ9RXMgbmVjZXNhcmlvIHBvbmVyIGxhIHRyYXllY3RvcmlhIGRlIENvbnRleHRvCitzdGFuZGFyZEhvc3QucGF0aFVzZWQ9WWEgZXN04SBlbiB1c28gbGEgdHJheWVjdG9yaWEgZGUgQ29udGV4dG8gezB9CitzdGFuZGFyZEhvc3QucmVtb3Zpbmc9UXVpdGFuZG8gYXBsaWNhY2nzbiB3ZWIgZW4gdHJheWVjdG9yaWEgZGUgY29udGV4dG8gezB9CitzdGFuZGFyZEhvc3QucmVtb3ZlRXJyb3I9RXJyb3IgcXVpdGFuZG8gYXBsaWNhY2nzbiBlbiB0cmF5ZWN0b3JpYSBkZSBjb250ZXh0byB7MH0KK3N0YW5kYXJkSG9zdC5zdGFydD1BcnJhbmNhbmRvIGFwbGljYWNp824gd2ViIGVuIHRyYXllY3RvcmlhIGRlIGNvbnRleHRvIHswfQorc3RhbmRhcmRIb3N0LnN0b3A9UGFyYW5kbyBhcGxpY2FjafNuIHdlYiBlbiB0cmF5ZWN0b3JpYSBkZSBjb250ZXh0byB7MH0KK3N0YW5kYXJkSG9zdC51bmZvdW5kQ29udGV4dD1ObyBwdWVkbyBoYWxsYXIgY29udGV4dG8gcGFyYSBVUkkgZGUgcmVxdWVyaW1pZW50byB7MH0KK3N0YW5kYXJkSG9zdC53YXJSZXF1aXJlZD1FcyBuZWNlc2FyaW8gcG9uZXIgbGEgVVJMIGEgYXJjaGl2byBkZSBhcGxpY2FjafNuIHdlYgorc3RhbmRhcmRIb3N0LndhclVSTD1VUkwgaW524WxpZGEgcGFyYSBhcmNoaXZvIGRlIGFwbGljYWNp824gd2ViOiB7MH0KK3N0YW5kYXJkSG9zdC52YWxpZGF0aW9uRW5hYmxlZD1BY3RpdmFkYSBsYSB2YWxpZGFjafNuIFhNTAorc3RhbmRhcmRIb3N0LnZhbGlkYXRpb25EaXNhYmxlZD1EZXNhY3RpdmFkYSBsYSB2YWxpZGFjafNuIFhNTAorc3RhbmRhcmRQaXBlbGluZS5hbHJlYWR5U3RhcnRlZD1ZYSBzZSBoYSBhcnJhbmNhZG8gbGEgVHViZXLtYSAoUGlwZWxpbmUpCitzdGFuZGFyZFBpcGVsaW5lLm5vdFN0YXJ0ZWQ9Tm8gc2UgaGEgYXJyYW5jYWRvIGxhIFR1YmVy7WEgKFBpcGVsaW5lKQorc3RhbmRhcmRQaXBlbGluZS5ub1ZhbHZlPU5vIGhheSBt4XMgVuFsdnVsYXMgZW4gbGEgVHViZXLtYSAoUGlwZWxpbmUpIHByb2Nlc2FuZG8gZXN0ZSByZXF1ZXJpbWllbnRvCitzdGFuZGFyZFNlcnZlci5hZGRDb250YWluZXIuaXNlPU5vIGhheSBjb25lY3RvcmVzIGRpc3BvbmlibGVzIHBhcmEgc2VyIGFzb2NpYWRvcyBjb24gZXN0ZSBjb250ZW5lZG9yCitzdGFuZGFyZFNlcnZlci5pbml0aWFsaXplLmluaXRpYWxpemVkPVlhIHNlIGhhIGluaWNpYWxpemFkbyBlc3RlIHNlcnZpZG9yCitzdGFuZGFyZFNlcnZlci5zdGFydC5jb25uZWN0b3JzPUFsIG1lbm9zIHVuIGNvbmVjdG9yIG5vIGVzdOEgYXNvY2lhZG8gY29uIGN1YWxxdWllciBjb250ZW5lZG9yCitzdGFuZGFyZFNlcnZlci5zdGFydC5zdGFydGVkPVlhIGhhIHNpZG8gYXJyYW5jYWRvIGVzdGUgc2Vydmlkb3IKK3N0YW5kYXJkU2VydmVyLnN0b3Aubm90U3RhcnRlZD1B+m4gbm8gaGEgc2lkbyBhcnJhbmNhZG8gZXN0ZSBzZXJ2aWRvcgorc3RhbmRhcmRTZXJ2aWNlLmluaXRpYWxpemUuaW5pdGlhbGl6ZWQ9WWEgaGEgc2lkbyBpbmljaWFsaXphZG8gZXN0ZSBzZXJ2aWNpbworc3RhbmRhcmRTZXJ2aWNlLnN0YXJ0Lm5hbWU9QXJyYW5jYW5kbyBzZXJ2aWNpbyB7MH0KK3N0YW5kYXJkU2VydmljZS5zdGFydC5zdGFydGVkPVlhIGhhIHNpZG8gYXJyYW5jYWRvIGVzdGUgc2VyY2ljaW8KK3N0YW5kYXJkU2VydmljZS5zdG9wLm5hbWU9UGFyYW5kbyBzZXJ2aWNpbyB7MH0KK3N0YW5kYXJkU2VydmljZS5zdG9wLm5vdFN0YXJ0ZWQ9QfpuIG5vIHNlIGhhIGFycmFuY2FkbyBlc3RlIHNlcnZpY2lvCitzdGFuZGFyZFdyYXBwZXIuYWxsb2NhdGU9RXJyb3IgcmVzZXJ2YW5kbyBlc3BhY2lvIHBhcmEgdW5hIGluc3RhbmNpYSBkZSBzZXJ2bGV0CitzdGFuZGFyZFdyYXBwZXIuYWxsb2NhdGVFeGNlcHRpb249RXhjZXBjafNuIGRlIHJlc2VydmEgZGUgZXNwYWNpbyBwYXJhIHNlcnZsZXQgezB9CitzdGFuZGFyZFdyYXBwZXIuY29udGFpbmVyU2VydmxldD1DYXJnYW5kbyBzZXJ2bGV0IGRlIGNvbnRlbmVkb3IgezB9CitzdGFuZGFyZFdyYXBwZXIuY3JlYXRlRmlsdGVycz1FeGNlcGNp824gZGUgY3JlYWNp824gZGUgZmlsdHJvcyBwYXJhIHNlcnZsZXQgezB9CitzdGFuZGFyZFdyYXBwZXIuZGVhbGxvY2F0ZUV4Y2VwdGlvbj1FeGNlcGNp824gZGUgcmVjdXBlcmFjafNuIGRlIGVzcGFjaW8gcGFyYSBzZXJ2bGV0IHswfQorc3RhbmRhcmRXcmFwcGVyLmRlc3Ryb3lFeGNlcHRpb249U2VydmxldC5kZXN0cm95KCkgcGFyYSBzZXJ2bGV0IHswfSBsYW568yBleGNlcGNp824KK3N0YW5kYXJkV3JhcHBlci5leGNlcHRpb24wPUluZm9ybWUgZGUgRXhjZXBjafNuIGRlIFRvbWNhdAorc3RhbmRhcmRXcmFwcGVyLmV4Y2VwdGlvbjE9SGEgdGVuaWRvIGx1Z2FyIHVuYSBFeGNlcGNp824gZGUgU2VydmxldAorc3RhbmRhcmRXcmFwcGVyLmV4Y2VwdGlvbjI9SW5mb3JtZSBkZSBFeGNlcGNp8246CitzdGFuZGFyZFdyYXBwZXIuZXhjZXB0aW9uMz1DYXVzYSBSYe16Ogorc3RhbmRhcmRXcmFwcGVyLmluaXRFeGNlcHRpb249U2VydmxldC5pbml0KCkgcGFyYSBzZXJ2bGV0IHswfSBsYW568yBleGNlcGNp824KK3N0YW5kYXJkV3JhcHBlci5pbnN0YW50aWF0ZT1FcnJvciBpbnN0YW5jaWFuZG8gY2xhc2UgZGUgc2VydmxldCB7MH0KK3N0YW5kYXJkV3JhcHBlci5pc1VuYXZhaWxhYmxlPUVsIFNlcnZsZXQgezB9IG5vIGVzdOEgZGlzcG9uaWJsZSBlbiBlc3RlIG1vbWVudG8KK3N0YW5kYXJkV3JhcHBlci5qYXNwZXJMb2FkZXI9VXNhbmRvIGNhcmdhZG9yIGRlIGNsYXNlcyAoY2xhc3Nsb2FkZXIpIGRlIEphc3BlciBwYXJhIHNlcnZsZXQgezB9CitzdGFuZGFyZFdyYXBwZXIuanNwRmlsZS5mb3JtYXQ9RWwgYXJjaGl2byBKU1AgezB9IG5vIGNvbWllbnphIGNvbiBjYXLhY3RlciAnLycKK3N0YW5kYXJkV3JhcHBlci5sb2FkRXhjZXB0aW9uPUVsIFNlcnZsZXQgezB9IGxhbnrzIGV4Y2VwY2nzbiBkZSBsb2FkKCkKK3N0YW5kYXJkV3JhcHBlci5taXNzaW5nQ2xhc3M9RWwgQXJyb3BhZG9yIChXcmFwcGVyKSBubyBwdWVkZSBoYWxsYXIgY2xhc2UgZGUgc2VydmxldCB7MH0gbyB1bmEgY2xhc2UgZGUgbGEgcXVlIGRlcGVuZGUKK3N0YW5kYXJkV3JhcHBlci5taXNzaW5nTG9hZGVyPUVsIEFycm9wYWRvciAoV3JhcHBlcikgbm8gcHVlZGUgaGFsbGFyIENhcmdhZG9yIHBhcmEgc2VydmxldCB7MH0KK3N0YW5kYXJkV3JhcHBlci5ub3RDaGlsZD1FbCBjb250ZW5lZG9yIGRlIEFycm9wYWRvciAoV3JhcHBlcikgbm8gcHVlZGUgdGVuZXIgY29udGVuZWRvcmVzIGhpam8KK3N0YW5kYXJkV3JhcHBlci5ub3RDbGFzcz1ObyBzZSBoYSBlc3BlY2lmaWNhZG8gY2xhc2UgZGUgc2VydmxldCBwYXJhIHNlcnZsZXQgezB9CitzdGFuZGFyZFdyYXBwZXIubm90Q29udGV4dD1FbCBjb250ZW5lZG9yIHBhZHJlIHBhcmEgdW4gQXJyb3BhZG9yIChXcmFwcGVyKSBkZWJlIGRlIHNlciB1biBDb250ZXh0bworc3RhbmRhcmRXcmFwcGVyLm5vdEZvdW5kPU5vIGVzdOEgZGlzcG9uaWJsZSBlbCBTZXJ2bGV0IHswfQorc3RhbmRhcmRXcmFwcGVyLm5vdFNlcnZsZXQ9TGEgQ2xhc2UgezB9IG5vIGVzIHVuIFNlcnZsZXQKK3N0YW5kYXJkV3JhcHBlci5wcml2aWxlZ2VkU2VydmxldD1FbCBTZXJ2bGV0IGRlIGNsYXNlIHswfSBlcyBwcml2aWxlZ2lhZG8geSBubyBwdWVkZSBzZXIgY2FyZ2FkbyBtZWRpYW50ZSBlc3RhIGFwbGljYWNp824gd2ViCitzdGFuZGFyZFdyYXBwZXIucmVsZWFzZUZpbHRlcnM9RXhjZXBjafNuIGRlIExpYmVyYWNp824gZGUgZmlsdHJvcyBwYXJhIHNlcnZsZXQgezB9CitzdGFuZGFyZFdyYXBwZXIuc2VydmljZUV4Y2VwdGlvbj1TZXJ2bGV0LnNlcnZpY2UoKSBwYXJhIHNlcnZsZXQgezB9IGxhbnrzIGV4Y2VwY2nzbgorc3RhbmRhcmRXcmFwcGVyLnN0YXR1c0hlYWRlcj1IVFRQIEVzdGFkbyB7MH0gLSB7MX0KK3N0YW5kYXJkV3JhcHBlci5zdGF0dXNUaXRsZT1JbmZvcm1lIGRlIEVycm9yIGRlIFRvbWNhdAorc3RhbmRhcmRXcmFwcGVyLnVuYXZhaWxhYmxlPU1hcmNhbmRvIGVsIHNlcnZsZXQgezB9IGNvbW8gbm8gZGlzcG9uaWJsZQorc3RhbmRhcmRXcmFwcGVyLnVubG9hZEV4Y2VwdGlvbj1FbCBTZXJ2bGV0IHswfSBsYW568yBleGNlcGNp824gdW5sb2FkKCkKK3N0YW5kYXJkV3JhcHBlci51bmxvYWRpbmc9Tm8gcHVlZG8gcmVzZXJ2YXIgZXNwYWNpbyBwYXJhIHNlcnZsZXQgezB9IHBvcnF1ZSBlc3ThIHNpZW5kbyBkZXNjYXJnYWRvCitzdGFuZGFyZFdyYXBwZXIud2FpdGluZz1Fc3BlcmFuZG8gcG9yIHswfSBpbnN0YW5jaWEocykgcGFyYSByZWN1cGVyYXIgc3UgZXNwYWNpbyByZXNlcnZhZG8KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb3JlL0xvY2FsU3RyaW5nc19mci5wcm9wZXJ0aWVzIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NvcmUvTG9jYWxTdHJpbmdzX2ZyLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdhZjMxYwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb3JlL0xvY2FsU3RyaW5nc19mci5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTY0IEBACithcHBsaWNhdGlvbkNvbnRleHQuYXR0cmlidXRlRXZlbnQ9RXhjZXB0aW9uIGxhbmPpZSBwYXIgbCcn6WNvdXRldXIgKGxpc3RlbmVyKSBkJyfpduhuZW1lbnQgYXR0cmlidXRzCithcHBsaWNhdGlvbkNvbnRleHQucmVxdWVzdERpc3BhdGNoZXIuaWFlPUxlIGNoZW1pbiB7MH0gbmUgY29tbWVuY2UgcGFzIHBhciBsZSBjYXJhY3TocmUgIi8iCithcHBsaWNhdGlvbkNvbnRleHQuc2V0QXR0cmlidXRlLm5hbWVudWxsPWxlIG5vbSBuZSBwZXV0IOp0cmUgbnVsCithcHBsaWNhdGlvbkRpc3BhdGNoZXIuYWxsb2NhdGVFeGNlcHRpb249RXhjZXB0aW9uIGQnJ2FsbG9jYXRpb24gcG91ciBsYSBzZXJ2bGV0IHswfQorYXBwbGljYXRpb25EaXNwYXRjaGVyLmRlYWxsb2NhdGVFeGNlcHRpb249RXhjZXB0aW9uIGRlIGTpc2FsbG9jYXRpb24gcG91ciBsYSBzZXJ2bGV0IHswfQorYXBwbGljYXRpb25EaXNwYXRjaGVyLmZvcndhcmQuaXNlPUltcG9zc2libGUgZCcndXRpbGlzZXIgZmFpcmUtc3VpdnJlIChmb3J3YXJkKSBhcHLocyBxdWUgbGEgculwb25zZSBhaXQg6XTpIGVudm956WUKK2FwcGxpY2F0aW9uRGlzcGF0Y2hlci5mb3J3YXJkLnRocm93PUxhIHJlc3NvdXJjZSBmYWlyZS1zdWl2cmUgKGZvcndhcmRlZCkgYSBsYW5j6SB1bmUgZXhjZXB0aW9uCithcHBsaWNhdGlvbkRpc3BhdGNoZXIuaW5jbHVkZS50aHJvdz1MYSByZXNzb3VyY2UgaW5jbHVzZSAoaW5jbHVkZWQpIGEgbGFuY+kgdW5lIGV4Y2VwdGlvbgorYXBwbGljYXRpb25EaXNwYXRjaGVyLmlzVW5hdmFpbGFibGU9TGEgc2VydmxldCB7MH0gZXN0IGFjdHVlbGxlbWVudCBpbmRpc3BvbmlibGUKK2FwcGxpY2F0aW9uRGlzcGF0Y2hlci5zZXJ2aWNlRXhjZXB0aW9uPSJTZXJ2bGV0LnNlcnZpY2UoKSIgcG91ciBsYSBzZXJ2bGV0IHswfSBhIGxhbmPpIHVuZSBleGNlcHRpb24KK2FwcGxpY2F0aW9uUmVxdWVzdC5iYWRQYXJlbnQ9SW1wb3NzaWJsZSBkZSB0cm91dmVyIGwnJ2ltcGxlbWVudGF0aW9uIHJlcXXqdGUgYXBwYXJlbnTpZSAocGFyZW50IHJlcXVlc3QpCithcHBsaWNhdGlvblJlcXVlc3QuYmFkUmVxdWVzdD1MYSByZXF16nRlIG4nJ2VzdCBwYXMgdW5lICJqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXF1ZXN0V3JhcHBlciIKK2FwcGxpY2F0aW9uUmVzcG9uc2UuYmFkUGFyZW50PUltcG9zc2libGUgZGUgdHJvdXZlciB1bmUgaW1wbOltZW50YXRpb24gculwb25zZSBhcHBhcmVudOllIChwYXJlbnQgcmVzcG9uc2UpCithcHBsaWNhdGlvblJlc3BvbnNlLmJhZFJlc3BvbnNlPUxhIHLpcG9uc2UgbicnZXN0IHBhcyB1bmUgImphdmF4LnNlcnZsZXQuU2VydmxldFJlc3BvbnNlV3JhcHBlciIKK2NvbnRhaW5lckJhc2UuYWRkRGVmYXVsdE1hcHBlcj1FeGNlcHRpb24gbG9ycyBkZSBsYSBjb25maWd1cmF0aW9uIGR1IHJvdXRldXIgcGFyIGTpZmF1dCAoZGVmYXVsdCBtYXBwZXIpIHBvdXIgbGEgY2xhc3NlIHswfQorY29udGFpbmVyQmFzZS5hbHJlYWR5U3RhcnRlZD1MZSBjb250ZW5ldXIgezB9IGEgZOlq4CDpdOkgZOltYXJy6QorY29udGFpbmVyQmFzZS5ub3RDb25maWd1cmVkPUF1Y3VuZSBWYWx2ZSBiYXNpcXVlIChiYXNpYyB2YWx2ZSkgbicnYSDpdOkgY29uZmlndXLpZQorY29udGFpbmVyQmFzZS5ub3RTdGFydGVkPUxlIGNvbnRlbmV1ciB7MH0gbicnYSBwYXMg6XTpIGTpbWFycukKK2Zhc3RFbmdpbmVNYXBwZXIuYWxyZWFkeVN0YXJ0ZWQ9bGUgIkZhc3RFbmdpbmVNYXBwZXIiIHswfSBhIGTpauAg6XTpIGTpbWFycukKK2Zhc3RFbmdpbmVNYXBwZXIubm90U3RhcnRlZD1MZSAiRmFzdEVuZ2luZU1hcHBlciIgezB9IG4nJ2EgcGFzIGVuY29yZSDpdOkgZOltYXJy6QorZmlsdGVyQ2hhaW4uZmlsdGVyPUwnJ2V46WN1dGlvbiBkdSBmaWx0cmUgKEZpbHRlcikgYSBsYW5j6SB1bmUgZXhjZXB0aW9uCitmaWx0ZXJDaGFpbi5zZXJ2bGV0PUwnJ2V46WN1dGlvbiBkZSBsYSBzZXJ2bGV0IGEgbGFuY+kgdW5lIGV4Y2VwdGlvbgoraHR0cENvbnRleHRNYXBwZXIuY29udGFpbmVyPUNlIGNvbnRlbmV1ciBuJydlc3QgcGFzIHVuICJTdGFuZGFyZENvbnRleHQiCitodHRwRW5naW5lTWFwcGVyLmNvbnRhaW5lcj1DZSBjb250ZW5ldXIgbicnZXN0IHBhcyB1biAiU3RhbmRhcmRFbmdpbmUiCitodHRwSG9zdE1hcHBlci5jb250YWluZXI9Q2UgY29udGVuZXVyIG4nJ2VzdCBwYXMgdW4gIlN0YW5kYXJkSG9zdCIKK2ludGVyY2VwdG9yVmFsdmUuYWxyZWFkeVN0YXJ0ZWQ9TGEgdmFsdmUgZCcnaW50ZXJjZXB0aW9uIChJbnRlcmNlcHRvclZhbHZlKSBhIGTpauAg6XTpIGTpbWFycullCitpbnRlcmNlcHRvclZhbHZlLm5vdFN0YXJ0ZWQ9TGEgdmFsdmUgZCcnaW50ZXJjZXB0aW9uIChJbnRlcmNlcHRvclZhbHZlKSBuJydhIHBhcyBlbmNvcmUg6XTpIGTpbWFycullCituYW1pbmcuYmluZEZhaWxlZD1FY2hlYyBsb3JzIGR1IGxpYWdlIOAgbCcnb2JqZXQ6IHswfQorbmFtaW5nLnVuYmluZEZhaWxlZD1FY2hlYyBsb3JzIGR1IGTpbGlhZ2Ug4CBsJ29iamV0IDogezB9CituYW1pbmcuaW52YWxpZEVudkVudHJ5VHlwZT1MJydlbnRy6WUgZW52aXJvbm5lbWVudCB7MH0gYSB1biB0eXBlIGludmFsaWRlCituYW1pbmcuaW52YWxpZEVudkVudHJ5VmFsdWU9TCcnZW50cullIGVudmlyb25uZW1lbnQgezB9IGEgdW5lIHZhbGV1ciBpbnZhbGlkZQorbmFtaW5nLm5hbWluZ0NvbnRleHRDcmVhdGlvbkZhaWxlZD1MYSBjculhdGlvbiBkdSBjb250ZXh0IGRlIG5vbW1hZ2UgKG5hbWluZyBjb250ZXh0KSBhIOljaG916SA6IHswfQorc3RhbmRhcmRDb250ZXh0LmFscmVhZHlTdGFydGVkPUxlIGNvbnRleHRlIGEgZOlq4CDpdOkgZOltYXJy6Qorc3RhbmRhcmRDb250ZXh0LmFwcGxpY2F0aW9uTGlzdGVuZXI9RXJyZXVyIGxvcnMgZGUgbGEgY29uZmlndXJhdGlvbiBkZSBsYSBjbGFzc2UgZCcn6WNvdXRlIGRlIGwnJ2FwcGxpY2F0aW9uIChhcHBsaWNhdGlvbiBsaXN0ZW5lcikgezB9CitzdGFuZGFyZENvbnRleHQuYXBwbGljYXRpb25Ta2lwcGVkPUwnaW5zdGFsbGF0aW9uIGRlcyDpY291dGV1cnMgKGxpc3RlbmVycykgZGUgbCcnYXBwbGljYXRpb24gYSDpdOkgc2F1dOllIHN1aXRlIGF1eCBlcnJldXJzIHBy6WPpZGVudGVzCitzdGFuZGFyZENvbnRleHQuYmFkUmVxdWVzdD1DaGVtaW4gZGUgcmVxdep0ZSBpbnZhbGlkZSAoezB9KS4KK3N0YW5kYXJkQ29udGV4dC5lcnJvclBhZ2UuZXJyb3I9TGEgcG9zaXRpb24gZGUgbGEgcGFnZSBkJydlcnJldXIgKEVycm9yUGFnZSkgezB9IGRvaXQgY29tbWVuY2VyIHBhciB1biAnLycKK3N0YW5kYXJkQ29udGV4dC5lcnJvclBhZ2UucmVxdWlyZWQ9TGEgcGFnZSBkJydlcnJldXIgKEVycm9yUGFnZSkgbmUgcGV1dCDqdHJlIG51bGxlCitzdGFuZGFyZENvbnRleHQuZXJyb3JQYWdlLndhcm5pbmc9QVRURU5USU9OOiBMYSBwb3NpdGlvbiBkZSBsYSBwYWdlIGQnJ2VycmV1ciAoRXJyb3JQYWdlKSB7MH0gZG9pdCBjb21tZW5jZXIgcGFyIHVuICcvJyBkYW5zIGwnJ0FQSSBTZXJ2bGV0IDIuNAorc3RhbmRhcmRDb250ZXh0LmZpbHRlck1hcC5laXRoZXI9TCcnYXNzb2NpYXRpb24gZGUgZmlsdHJlIChmaWx0ZXIgbWFwcGluZykgZG9pdCBpbmRpcXXpIHNvaXQgdW5lIDx1cmwtcGF0dGVybj4gb3UgdW5lIDxzZXJ2bGV0LW5hbWU+CitzdGFuZGFyZENvbnRleHQuZmlsdGVyTWFwLm5hbWU9TCcnYXNzb2NpYXRpb24gZGUgZmlsdHJlIChmaWx0ZXIgbWFwcGluZykgaW5kaXF1ZSB1biBub20gZGUgZmlsdHJlIGluY29ubnUgezB9CitzdGFuZGFyZENvbnRleHQuZmlsdGVyTWFwLnBhdHRlcm49PHVybC1wYXR0ZXJuPiB7MH0gaW52YWxpZGUgZGFucyBsJydhc3NvY2lhdGlvbiBkZSBmaWx0cmUgKGZpbHRlciBtYXBwaW5nKQorc3RhbmRhcmRDb250ZXh0LmZpbHRlclN0YXJ0PUV4Y2VwdGlvbiBhdSBk6W1hcnJhZ2UgZHUgZmlsdHJlIHswfQorc3RhbmRhcmRDb250ZXh0LmZpbHRlclN0YXJ0RmFpbGVkPUVjaGVjIGR1IGTpbWFycmFnZSBkZXMgZmlsdHJlcyBkJydhcHBsaWNhdGlvbgorc3RhbmRhcmRDb250ZXh0LnJlcXVlc3RMaXN0ZW5lclN0YXJ0RmFpbGVkPUVjaGVjIGTpbWFycmFnZSBkZXMgVmFsdmVzIGQnJ+ljb3V0ZQorc3RhbmRhcmRDb250ZXh0LnJlcXVlc3RMaXN0ZW5lckNvbmZpZy5hZGRlZD1Bam91dCBkZSBsYSB2YWx2ZSBkJyfpY291dGUKK3N0YW5kYXJkQ29udGV4dC5yZXF1ZXN0TGlzdGVuZXJDb25maWcuZXJyb3I9RXhjZXB0aW9uIGxvcnMgZGUgbCcnYWpvdXQgZGUgbGEgdmFsdmUgZCcn6WNvdXRlIGRlIHJlcXXqdGU6IHswfQorc3RhbmRhcmRDb250ZXh0LmlzVW5hdmFpbGFibGU9Q2V0dGUgYXBwbGljYXRpb24gbicnZXN0IHBhcyBkaXNwb25pYmxlIGFjdHVlbGxlbWVudAorc3RhbmRhcmRDb250ZXh0Lmxpc3RlbmVyU3RhcnQ9RXhjZXB0aW9uIGxvcnMgZGUgbCcnZW52b2kgZGUgbCcn6XbobmVtZW50IGNvbnRleHRlIGluaXRpYWxpc+kgKGNvbnRleHQgaW5pdGlhbGl6ZWQpIOAgbCcnaW5zdGFuY2UgZGUgY2xhc3NlIGQnJ+ljb3V0ZSAobGlzdGVuZXIpIHswfQorc3RhbmRhcmRDb250ZXh0Lmxpc3RlbmVyU3RhcnRGYWlsZWQ9RWNoZWMgZHUgZOltYXJyYWdlIGRlcyDpY291dGV1cnMgKGxpc3RlbmVycykgZCcnYXBwbGljYXRpb24KK3N0YW5kYXJkQ29udGV4dC5saXN0ZW5lclN0b3A9RXhjZXB0aW9uIGxvcnMgZGUgbCcnZW52b2kgZGUgbCcn6XbobmVtZW50IGNvbnRleHRlIGTpdHJ1aXQgKGNvbnRleHQgZGVzdHJveWVkKSDgIGwnJ2luc3RhbmNlIGRlIGNsYXNzZSBkJyfpY291dGUgezB9CitzdGFuZGFyZENvbnRleHQubG9naW5Db25maWcuZXJyb3JQYWdlPUxhIGZvcm1lIGRlIHBhZ2UgZCcnZXJyZXVyIChmb3JtIGVycm9yIHBhZ2UpIHswfSBkb2l0IGNvbW1lbmNlciBwYXIgdW4gJy8nCitzdGFuZGFyZENvbnRleHQubG9naW5Db25maWcuZXJyb3JXYXJuaW5nPUFUVEVOVElPTjogTGEgZm9ybWUgZGUgcGFnZSBkJydlcnJldXIgKGZvcm0gZXJyb3IgcGFnZSkgezB9IGRvaXQgY29tbWVuY2VyIHBhciB1biAnLycgZGFucyBsJydBUEkgU2VydmxldCAyLjQKK3N0YW5kYXJkQ29udGV4dC5sb2dpbkNvbmZpZy5sb2dpblBhZ2U9TGEgZm9ybWUgZGUgcGFnZSBkZSBjb25uZXhpb24gKGZvcm0gbG9naW4gcGFnZSkgezB9IGRvaXQgY29tbWVuY2VyIHBhciB1biAnLycKK3N0YW5kYXJkQ29udGV4dC5sb2dpbkNvbmZpZy5sb2dpbldhcm5pbmc9QVRURU5USU9OOiBMYSBmb3JtZSBkZSBwYWdlIGRlIGNvbm5leGlvbiAoZm9ybSBsb2dpbiBwYWdlKSB7MH0gZG9pdCBjb21tZW5jZXIgcGFyIHVuICcvJyBkYW5zIGwnJ0FQSSBTZXJ2bGV0IDIuNAorc3RhbmRhcmRDb250ZXh0LmxvZ2luQ29uZmlnLnJlcXVpcmVkPSJMb2dpbkNvbmZpZyIgbmUgcGV1dCDqdHJlIG51bAorc3RhbmRhcmRDb250ZXh0Lm1hcHBpbmdFcnJvcj1FcnJldXIgZGFucyBsYSBjb25maWd1cmF0aW9uIGQnJ2Fzc29jaWF0aW9uIChtYXBwaW5nIGNvbmZpZ3VyYXRpb24pIHBvdXIgbCcnVVJJIHJlbGF0aXZlIHswfQorc3RhbmRhcmRDb250ZXh0Lm5vdEZvdW5kPUxhIHJlc3NvdXJjZSBkZW1hbmTpZSAoezB9KSBuJydlc3QgcGFzIGRpc3BvbmlibGUuCitzdGFuZGFyZENvbnRleHQubm90UmVsb2FkYWJsZT1MZSByZWNoYXJnZW1lbnQgZXN0IGTpc2FjdGl26SBwb3VyIGNlIGNvbnRleHRlCitzdGFuZGFyZENvbnRleHQubm90U3RhcnRlZD1MZSBjb250ZXh0ZSBuJydhIHBhcyBlbmNvcmUg6XTpIGTpbWFycukKK3N0YW5kYXJkQ29udGV4dC5ub3RXcmFwcGVyPUxlIGZpbHMgZHUgY29udGV4dGUgKGNoaWxkIG9mIGNvbnRleHQpIGRvaXQg6nRyZSB1biBlbnJvYmV1ciAod3JhcHBlcikKK3N0YW5kYXJkQ29udGV4dC5wYXJhbWV0ZXIuZHVwbGljYXRlPVBhcmFt6HRyZSBkJydpbml0aWFsaXNhdGlvbiBkZSBjb250ZXh0ZSBkdXBsaXF16SB7MH0KK3N0YW5kYXJkQ29udGV4dC5wYXJhbWV0ZXIucmVxdWlyZWQ9TGUgbm9tIGRlIHBhcmFt6HRyZSBhaW5zaSBxdWUgbGEgdmFsZXVyIGR1IHBhcmFt6HRyZSBzb250IHJlcXVpcworc3RhbmRhcmRDb250ZXh0LnJlbG9hZGluZ0NvbXBsZXRlZD1MZSByZWNoYXJnZW1lbnQgZGUgY2UgY29udGV4dGUgZXN0IHRlcm1pbukKK3N0YW5kYXJkQ29udGV4dC5yZWxvYWRpbmdGYWlsZWQ9TGUgcmVjaGFyZ2VtZW50IGRlIGNlIGNvbnRleHRlIGEg6WNob3XpIHN1aXRlIOAgdW5lIGVycmV1ciBwculj6WRlbnRlCitzdGFuZGFyZENvbnRleHQucmVsb2FkaW5nU3RhcnRlZD1MZSByZWNoYXJnZW1lbnQgZGUgY2UgY29udGV4dGUgYSBk6W1hcnLpCitzdGFuZGFyZENvbnRleHQuc2VjdXJpdHlDb25zdHJhaW50LnBhdHRlcm49PHVybC1wYXR0ZXJuPiB7MH0gaW52YWxpZGUgZCcnYXBy6HMgbGVzIGNvbnRyYWludGVzIGRlIHPpY3VyaXTpIChzZWN1cml0eSBjb25zdHJhaW50KQorc3RhbmRhcmRDb250ZXh0LnNlcnZsZXRNYXAubmFtZT1MJydhc3NvY2lhdGlvbiBkZSBzZXJ2bGV0IChzZXJ2bGV0IG1hcHBpbmcpIGluZGlxdWUgdW4gbm9tIGRlIHNlcnZsZXQgaW5jb25udSB7MH0KK3N0YW5kYXJkQ29udGV4dC5zZXJ2bGV0TWFwLnBhdHRlcm49PHVybC1wYXR0ZXJuPiB7MH0gaW52YWxpZGUgZGFucyBsJydhc3NvY2lhdGlvbiBkZSBzZXJ2bGV0IChzZXJ2bGV0IG1hcHBpbmcpCitzdGFuZGFyZENvbnRleHQuc3RhcnRDbGVhbnVwPUV4Y2VwdGlvbiBsb3JzIGR1IG5ldHRveWFnZSBhcHLocyBxdWUgbGUgZOltYXJyYWdlIGFpdCDpY2hvdekKK3N0YW5kYXJkQ29udGV4dC5zdGFydEZhaWxlZD1FcnJldXIgZGUgZOltYXJyYWdlIGR1IGNvbnRleHRlIHN1aXRlIGF1eCBlcnJldXJzIHBy6WPpZGVudGVzCitzdGFuZGFyZENvbnRleHQuc3RhcnRpbmdMb2FkZXI9RXhjZXB0aW9uIGFuIGTpbWFycmFnZSBkdSAiTG9hZGVyIgorc3RhbmRhcmRDb250ZXh0LnN0YXJ0aW5nTWFuYWdlcj1FeGNlcHRpb24gYW4gZOltYXJyYWdlIGR1ICJNYW5hZ2VyIgorc3RhbmRhcmRDb250ZXh0LnN0YXJ0aW5nV3JhcHBlcj1FeGNlcHRpb24gYW4gZOltYXJyYWdlIGRlIGwnJ2Vucm9iZXVyICh3cmFwcGVyKSBkZSBsYSBzZXJ2bGV0IHswfQorc3RhbmRhcmRDb250ZXh0LnN0b3BwaW5nQ29udGV4dD1FeGNlcHRpb24gPyBsJydhcnI/dCBkdSAiQ29udGV4dCIKK3N0YW5kYXJkQ29udGV4dC5zdG9wcGluZ0xvYWRlcj1FeGNlcHRpb24g4CBsJydhcnLqdCBkdSAiTG9hZGVyIgorc3RhbmRhcmRDb250ZXh0LnN0b3BwaW5nTWFuYWdlcj1FeGNlcHRpb24g4CBsJydhcnLqdCBkdSAiTWFuYWdlciIKK3N0YW5kYXJkQ29udGV4dC5zdG9wcGluZ1dyYXBwZXI9RXhjZXB0aW9uIOAgbCcnYXJy6nQgZGUgbCcnZW5yb2JldXIgKHdyYXBwZXIpIGRlIGxhIHNlcnZsZXQgezB9CitzdGFuZGFyZENvbnRleHQucmVzb3VyY2VzU3RhcnQ9RXJyZXVyIGxvcnMgZHUgZOltYXJyYWdlIGRlcyBSZXNvdXJjZXMgc3RhdGlxdWVzCitzdGFuZGFyZENvbnRleHQudXJsRGVjb2RlPUltcG9zc2libGUgZGUgZOljb2RlciBsZSBjaGVtaW4gZGUgcmVxdep0ZSBlbmNvZOkgZGFucyBsJydVUkwgezB9CitzdGFuZGFyZENvbnRleHQudXJsUGF0dGVybi5wYXR0ZXJuV2FybmluZz1BVFRFTlRJT046IExlIG1vZOhsZSAocGF0dGVybikgVVJMIHswfSBkb2l0IGNvbW1lbmNlciBwYXIgdW4gJy8nIGRhbnMgbCcnQVBJIFNlcnZsZXQgMi40CitzdGFuZGFyZENvbnRleHQudXJsVmFsaWRhdGU9SW1wb3NzaWJsZSBkZSB2YWxpZGVyIGxlIGNoZW1pbiBkZSByZXF16nRlIGVuY29k6SBkYW5zIGwnJ1VSTCB7MH0KK3N0YW5kYXJkQ29udGV4dC53cmFwcGVyLmVycm9yPUxlIGZpY2hpZXIgSlNQIHswfSBkb2l0IGNvbW1lbmNlciBwYXIgdW4gJy8nCitzdGFuZGFyZENvbnRleHQud3JhcHBlci53YXJuaW5nPUFUVEVOVElPTjogTGUgZmljaGllciBKU1AgezB9IGRvaXQgY29tbWVuY2VyIHBhciB1biAgJy8nIGRhbnMgbCcnQVBJIFNlcnZsZXQgMi40CitzdGFuZGFyZEVuZ2luZS5hbHJlYWR5U3RhcnRlZD1MZSBtb3RldXIgYSBk6WrgIOl06SBk6W1hcnLpCitzdGFuZGFyZEVuZ2luZS5tYXBwaW5nRXJyb3I9RXJyZXVyIGRlIGNvbmZpZ3VyYXRpb24gZCcnYXNzb2NpYXRpb24gKG1hcHBpbmcgY29uZmlndXJhdGlvbikgcG91ciBsZSBzZXJ2ZXVyIHswfQorc3RhbmRhcmRFbmdpbmUubm9Ib3N0PUF1Y3VuZSBo9HRlIChob3N0KSBuZSBjb3JyZXNwb25kIGF1IG5vbSBkZSBzZXJ2ZXVyIHswfQorc3RhbmRhcmRFbmdpbmUubm9Ib3N0SGVhZGVyPXJlcXXqdGUgSFRUUC8xLjEgc2FucyBlbnTqdGUgSG9zdDogCitzdGFuZGFyZEVuZ2luZS5ub3RIb3N0PUxlIGZpbHMgZCcndW4gbW90ZXVyIChjaGlsZCBvZiBhbiBFbmdpbmUpIGRvaXQg6nRyZSB1biBo9HRlCitzdGFuZGFyZEVuZ2luZS5ub3RQYXJlbnQ9TGVzIG1vdGV1cnMgKGVuZ2luZSkgbmUgcGV1dmVudCBhdm9pciBkZSBwYXJlbnQgY29udGVuZXVyIChjb250YWluZXIpCitzdGFuZGFyZEVuZ2luZS5ub3RTdGFydGVkPUxlIG1vdGV1ciBuJydhIHBhcyBlbmNvcmUg6XTpIGTpbWFycukKK3N0YW5kYXJkRW5naW5lLnVuZm91bmRIb3N0PUwnJ2j0dGUgdmlydHVlbCAodmlydHVhbCBob3N0KSB7MH0gZXN0IGludHJvdXZhYmxlCitzdGFuZGFyZEVuZ2luZS51bmtub3duSG9zdD1BdWN1biBzZXJ2ZXVyIGj0dGUgbicnZXN0IGluZGlxdekgcG91ciBjZXR0ZSByZXF16nRlCitzdGFuZGFyZEhvc3QuYWNjZXNzQmFzZT1JbXBvc3NpYmxlIGQnJ2FjY+lkZXIgbGUgculwZXJ0b2lyZSAiZG9jdW1lbnQgYmFzZSIgezB9CitzdGFuZGFyZEhvc3QuYWxyZWFkeVN0YXJ0ZWQ9TCcnaPR0ZSBhIGTpauAg6XTpIGTpbWFycukKK3N0YW5kYXJkSG9zdC5hcHBCYXNlPUxlIHLpcGVydG9pcmUgZGUgYmFzZSBkZSBsJydhcHBsaWNhdGlvbiB7MH0gbicnZXhpc3RlIHBhcworc3RhbmRhcmRIb3N0LmNvbmZpZ1JlcXVpcmVkPVVuZSBVUkwgdmVycyBsZSBmaWNoaWVyIGRlIGNvbmZpZ3VyYXRpb24gZXN0IG9ibGlnYXRvaXJlCitzdGFuZGFyZEhvc3QuY29uZmlnTm90QWxsb3dlZD1MJyd1dGlsaXNhdGlvbiBkJ3VuIGZpY2hpZXIgZGUgY29uZmlndXJhdGlvbiBmaWxlIG4nJ2VzdCBwYXMgYXV0b3Jpc+kKK3N0YW5kYXJkSG9zdC5pbnN0YWxsaW5nPUluc3RhbGxhdGlvbiBkJyd1bmUgYXBwbGljYXRpb24gcG91ciBsZSBjaGVtaW4gZGUgY29udGV4dGUgezB9IGRlcHVpcyBsJydVUkwgezF9CitzdGFuZGFyZEhvc3QuaW5zdGFsbGluZ1dBUj1JbnN0YWxsYXRpb24gZCcndW5lIGFwcGxpY2F0aW9uIGRlcHVpcyBsJydVUkwgezB9CitzdGFuZGFyZEhvc3QuaW5zdGFsbEVycm9yPUVycmV1ciBsb3JzIGR1IGTpcGxvaWVtZW50IGRlIGwnJ2FwcGxpY2F0aW9uIHBvdXIgbGUgY2hlbWluIGRlIGNvbnRleHRlIHswfQorc3RhbmRhcmRIb3N0LmludmFsaWRFcnJvclJlcG9ydFZhbHZlQ2xhc3M9SW1wb3NzaWJsZSBkZSBjaGFyZ2VyIGxhIGNsYXNzZSB2YWx2ZSBkZSByYXBwb3J0IGQnJ2VycmV1cjogezB9CitzdGFuZGFyZEhvc3QuZG9jQmFzZT1MZSBy6XBlcnRvaXJlICJkb2N1bWVudCBiYXNlIiB7MH0gZXhpc3RlIGTpauAKK3N0YW5kYXJkSG9zdC5tYXBwaW5nRXJyb3I9RXJyZXVyIGQnJ2Fzc29jaWF0aW9uIGRlIGNvbmZpZ3VyYXRpb24gKG1hcHBpbmcgY29uZmlndXJhdGlvbikgcG91ciBsJydVUkkgZGVtYW5k6WUgezB9CitzdGFuZGFyZEhvc3Qubm9Db250ZXh0PUF1Y3VuZSBjb250ZXh0ZSBuJydlc3QgY29uZmlndXLpIHBvdXIgdHJhaXRlciBjZXR0ZSByZXF16nRlCitzdGFuZGFyZEhvc3Qubm9Ib3N0PUF1Y3VuIGj0dGUgbicnZXN0IGNvbmZpZ3Vy6SBwb3VyIHRyYWl0ZXIgY2V0dGUgcmVxdep0ZQorc3RhbmRhcmRIb3N0Lm5vdENvbnRleHQ9TGUgZmlscyBkJyd1biBo9HRlIChjaGlsZCBvZiBhIEhvc3QpIGRvaXQg6nRyZSB1biBjb250ZXh0ZQorc3RhbmRhcmRIb3N0Lm5vdFN0YXJ0ZWQ9bCcnaPR0ZSBuJydhIHBhcyBlbmNvcmUg6XTpIGTpbWFycukKK3N0YW5kYXJkSG9zdC5udWxsTmFtZT1MZSBub20gZCcnaPR0ZSBlc3QgcmVxdWlzCitzdGFuZGFyZEhvc3QucGF0aEZvcm1hdD1DaGVtaW4gZGUgY29udGV4dGUgaW52YWxpZGU6IHswfQorc3RhbmRhcmRIb3N0LnBhdGhNaXNzaW5nPUxlIGNoZW1pbiBkZSBjb250ZXh0ZSB7MH0gbicnZXN0IHBhcyB1dGlsaXPpIGFjdHVlbGxlbWVudAorc3RhbmRhcmRIb3N0LnBhdGhSZXF1aXJlZD1MZSBjaGVtaW4gZGUgY29udGV4dGUgZXN0IHJlcXVpcworc3RhbmRhcmRIb3N0LnBhdGhVc2VkPUxlIGNoZW1pbiBkZSBjb250ZXh0ZSB7MH0gZXN0IGTpauAgdXRpbGlz6Qorc3RhbmRhcmRIb3N0LnJlbW92aW5nPVJldHJhaXQgZGUgbCcnYXBwbGljYXRpb24gd2ViIHBvdXIgbGUgY2hlbWluIGRlIGNvbnRleHRlIHswfQorc3RhbmRhcmRIb3N0LnJlbW92ZUVycm9yPUVycmV1ciBsb3JzIGR1IHJldHJhaXQgZGUgbCcnYXBwbGljYXRpb24gd2ViIHBvdXIgbGUgY2hlbWluIGRlIGNvbnRleHRlIHswfQorc3RhbmRhcmRIb3N0LnN0YXJ0PUTpbWFycmFnZSBkZSBsJydhcHBsaWNhdGlvbiB3ZWIgYXBwbGljYXRpb24gcG91ciBsZSBjaGVtaW4gZGUgY29udGV4dGUgezB9CitzdGFuZGFyZEhvc3Quc3RvcD1BcnLpdCBkZSBsJydhcHBsaWNhdGlvbiB3ZWIgYXBwbGljYXRpb24gcG91ciBsZSBjaGVtaW4gZGUgY29udGV4dGUgezB9CitzdGFuZGFyZEhvc3QudW5mb3VuZENvbnRleHQ9SW1wb3NzaWJsZSBkZSB0cm91dmVyIHVuIGNvbnRleHRlIHBvdXIgbCcnVVJJIHswfSBkZW1hbmTpZQorc3RhbmRhcmRIb3N0LndhclJlcXVpcmVkPVVuZSBVUkwgdmVycyBsJydhcmNoaXZlIGQnJ2FwcGxpY2F0aW9uIHdlYiAod2FyKSBlc3QgbuljZXNzYWlyZSAKK3N0YW5kYXJkSG9zdC53YXJVUkw9VVJMIHZlcnMgbCcnYXJjaGl2ZSBkJydhcHBsaWNhdGlvbiB3ZWIgKHdhcikgaW52YWxpZGU6IHswfQorc3RhbmRhcmRQaXBlbGluZS5hbHJlYWR5U3RhcnRlZD1MZSAiUGlwZWxpbmUiIGEgZOlq4CDpdOkgZOltYXJy6Qorc3RhbmRhcmRQaXBlbGluZS5ub3RTdGFydGVkPWxlICJQaXBlbGluZSIgbicnYSBwYXMg6XTpIGTpbWFycukKK3N0YW5kYXJkUGlwZWxpbmUubm9WYWx2ZT1QbHVzIGF1Y3VuZSBWYWx2ZXMgZGFucyBsZSAiUGlwZWxpbmUiIHRyYWl0YW50IGNldHRlIHJlcXXqdGUKK3N0YW5kYXJkU2VydmVyLmFkZENvbnRhaW5lci5pc2U9QXVjdW4gY29ubmVjdGV1ciBkaXNwb25pYmxlIOAgYXNzb2NpZXIgYXZlYyBjZSBjb250ZW5ldXIgKGNvbnRhaW5lcikKK3N0YW5kYXJkU2VydmVyLmluaXRpYWxpemUuaW5pdGlhbGl6ZWQ9Q2Ugc2VydmV1ciBhIGTpauAg6XTpIGluaXRpYWxpc+kKK3N0YW5kYXJkU2VydmVyLnN0YXJ0LmNvbm5lY3RvcnM9QXUgbW9pbnMgdW4gY29ubmVjdGV1ciBuJydlc3QgcGFzIGFzc29jaekg4CBhdWN1biBjb250ZW5ldXIgKGNvbnRhaW5lcikKK3N0YW5kYXJkU2VydmVyLnN0YXJ0LnN0YXJ0ZWQ9Q2Ugc2VydmV1ciBhIGTpauAg6XTpIGTpbWFycukKK3N0YW5kYXJkU2VydmVyLnN0b3Aubm90U3RhcnRlZD1DZSBzZXJ2ZXVyIG4nJ2EgcGFzIGVuY29yZSDpdOkgZOltYXJy6Qorc3RhbmRhcmRTZXJ2aWNlLmluaXRpYWxpemUuaW5pdGlhbGl6ZWQ9Q2Ugc2VydmljZSBhIGTpauAg6XTpIGluaXRpYWxpc+kKK3N0YW5kYXJkU2VydmljZS5zdGFydC5uYW1lPUTpbWFycmFnZSBkdSBzZXJ2aWNlIHswfQorc3RhbmRhcmRTZXJ2aWNlLnN0YXJ0LnN0YXJ0ZWQ9Q2Ugc2VydmljZSBhIGTpauAg6XTpIGTpbWFycukKK3N0YW5kYXJkU2VydmljZS5zdG9wLm5hbWU9QXJy6nQgZHUgc2VydmljZSB7MH0KK3N0YW5kYXJkU2VydmljZS5zdG9wLm5vdFN0YXJ0ZWQ9Q2Ugc2VydmljZSBuJydhIHBhcyBlbmNvcmUg6XTpIGTpbWFycukKK3N0YW5kYXJkV3JhcHBlci5hbGxvY2F0ZT1FcnJldXIgZCcnYWxsb2NhdGlvbiDgIHVuZSBpbnN0YW5jZSBkZSBzZXJ2bGV0CitzdGFuZGFyZFdyYXBwZXIuYWxsb2NhdGVFeGNlcHRpb249RXhjZXB0aW9uIGxvcnMgZGUgbCdhbGxvY2F0aW9uIHBvdXIgbGEgc2VydmxldCB7MH0KK3N0YW5kYXJkV3JhcHBlci5jb250YWluZXJTZXJ2bGV0PUNoYXJnZW1lbnQgZHUgY29udGVuZXVyIChjb250YWluZXIpIGRlIHNlcnZsZXQgezB9CitzdGFuZGFyZFdyYXBwZXIuY3JlYXRlRmlsdGVycz1FeGNlcHRpb24g4CBsYSBjculhdGlvbiBkZSBmaWx0cmVzIHBvdXIgbGEgc2VydmxldCB7MH0KK3N0YW5kYXJkV3JhcHBlci5kZWFsbG9jYXRlRXhjZXB0aW9uPUV4Y2VwdGlvbiDgIGxhIGTpc2FsbG9jYXRpb24gcG91ciBsYSBzZXJ2bGV0IHswfQorc3RhbmRhcmRXcmFwcGVyLmRlc3Ryb3lFeGNlcHRpb249IlNlcnZsZXQuZGVzdHJveSgpIiBkZSBsYSBzZXJ2bGV0IHswfSBhIGfpbuly6SB1bmUgZXhjZXB0aW9uCitzdGFuZGFyZFdyYXBwZXIuZXhjZXB0aW9uMD1SYXBwb3J0IGQnJ2V4Y2VwdGlvbiBUb21jYXQKK3N0YW5kYXJkV3JhcHBlci5leGNlcHRpb24xPVVuZSBleGNlcHRpb24gU2VydmxldCBzJydlc3QgcHJvZHVpdGUKK3N0YW5kYXJkV3JhcHBlci5leGNlcHRpb24yPVJhcHBvcnQgZCcnZXhjZXB0aW9uOgorc3RhbmRhcmRXcmFwcGVyLmV4Y2VwdGlvbjM9Q2F1c2UgbehyZToKK3N0YW5kYXJkV3JhcHBlci5pbml0RXhjZXB0aW9uPSJTZXJ2bGV0LmluaXQoKSIgcG91ciBsYSBzZXJ2bGV0IHswfSBhIGfpbuly6SB1bmUgZXhjZXB0aW9uCitzdGFuZGFyZFdyYXBwZXIuaW5zdGFudGlhdGU9RXJyZXVyIOAgbCcnaW5zdGFudGlhdGlvbiBkZSBsYSBjbGFzc2Ugc2VydmxldCB7MH0KK3N0YW5kYXJkV3JhcHBlci5pc1VuYXZhaWxhYmxlPUxhIHNlcnZsZXQgezB9IGVzdCBhY3R1ZWxsZW1lbnQgaW5kaXNwb25pYmxlCitzdGFuZGFyZFdyYXBwZXIuamFzcGVyTG9hZGVyPVV0aWxpc2F0aW9uIGR1IGNoYXJnZXVyIGRlIGNsYXNzZSBKYXNwZXIgKGNsYXNzbG9hZGVyKSBwb3VyIGxhIHNlcnZsZXQgezB9CitzdGFuZGFyZFdyYXBwZXIuanNwRmlsZS5mb3JtYXQ9TGUgZmljaGllciBKU1AgezB9IG5lIGNvbW1lbmNlIHBhciBwYXIgdW4gY2FyYWN06HJlICcvJworc3RhbmRhcmRXcmFwcGVyLmxvYWRFeGNlcHRpb249TGEgc2VydmxldCB7MH0gYSBn6W7pcukgdW5lIGV4Y2VwdGlvbiAibG9hZCgpIgorc3RhbmRhcmRXcmFwcGVyLm1pc3NpbmdDbGFzcz1MJydlbnJvYmV1ciAod3JhcHBlcikgbmUgcGV1dCB0cm91dmVyIGxhIGNsYXNzZSBzZXJ2bGV0IHswfSBvdSB1bmUgY2xhc3NlIGRvbnQgZWxsZSBk6XBlbmQKK3N0YW5kYXJkV3JhcHBlci5taXNzaW5nTG9hZGVyPUwnJ2Vucm9iZXVyICh3cmFwcGVyKSBuZSBwZXV0IHRyb3V2ZXIgZGUgY2hhcmdldXIgKGxvYWRlcikgcG91ciBsYSBzZXJ2bGV0IHswfQorc3RhbmRhcmRXcmFwcGVyLm5vdENoaWxkPUwnJ2Vucm9iZXVyIGRlIGNvbnRlbmV1ciAod3JhcHBlciBjb250YWluZXIpIHBldXQgbmUgcGFzIGF2b2lyIGRlIGNvbnRlbmV1cnMgZmlscworc3RhbmRhcmRXcmFwcGVyLm5vdENsYXNzPUF1Y3VuZSBjbGFzc2Ugc2VydmxldCBuJydhIOl06SBzcOljaWZp6WUgcG91ciBsYSBzZXJ2bGV0IHswfQorc3RhbmRhcmRXcmFwcGVyLm5vdENvbnRleHQ9TGUgY29udGVuZXVyIHBhcmVudCBkJyd1biBlbnJvYmV1ciAod3JhcHBlcikgZG9pdCDqdHJlIHVuIGNvbnRleHRlCitzdGFuZGFyZFdyYXBwZXIubm90Rm91bmQ9U2VydmxldCB7MH0gbicnZXN0IHBhcyBkaXNwb25pYmxlLgorc3RhbmRhcmRXcmFwcGVyLm5vdFNlcnZsZXQ9TGEgY2xhc3NlIHswfSBuJydlc3QgcGFzIHVuZSBzZXJ2bGV0CitzdGFuZGFyZFdyYXBwZXIucHJpdmlsZWdlZFNlcnZsZXQ9TGEgc2VydmxldCBkZSBjbGFzc2UgezB9IGVzdCBwcml2aWzpZ2npZSAocHJpdmlsZWdlZCkgZXQgbmUgcGV1dCDqdHJlIGNoYXJn6SBwYXIgY2V0dGUgYXBwbGljYXRpb24gd2ViCitzdGFuZGFyZFdyYXBwZXIucmVsZWFzZUZpbHRlcnM9RXhjZXB0aW9uIGRlcyBmaWx0cmVzIGRlIHNvcnRpZSAocmVsZWFzZSBmaWx0ZXJzKSBwb3VyIGxhIHNlcnZsZXQgezB9CitzdGFuZGFyZFdyYXBwZXIuc2VydmljZUV4Y2VwdGlvbj0iU2VydmxldC5zZXJ2aWNlKCkiIHBvdXIgbGEgc2VydmxldCB7MH0gYSBn6W7pcukgdW5lIGV4Y2VwdGlvbgorc3RhbmRhcmRXcmFwcGVyLnN0YXR1c0hlYWRlcj1FdGF0IEhUVFAgezB9IC0gezF9CitzdGFuZGFyZFdyYXBwZXIuc3RhdHVzVGl0bGU9UmFwcG9ydCBkJydlcnJldXIgVG9tY2F0CitzdGFuZGFyZFdyYXBwZXIudW5hdmFpbGFibGU9TGEgc2VydmxldCB7MH0gZXN0IG1hcnF16SBjb21tZSBpbmRpc3BvbmlibGUKK3N0YW5kYXJkV3JhcHBlci51bmxvYWRFeGNlcHRpb249TGEgc2VydmxldCB7MH0gYSBn6W7pcukgdW5lIGV4Y2VwdGlvbiAidW5sb2FkKCkiCitzdGFuZGFyZFdyYXBwZXIudW5sb2FkaW5nPUltcG9zc2libGUgZCcnYWxsb3VlciBsYSBzZXJ2bGV0IHswfSBjYXIgZWxsZSBhIOl06SBk6WNoYXJn6WUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb3JlL0xvY2FsU3RyaW5nc19qYS5wcm9wZXJ0aWVzIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NvcmUvTG9jYWxTdHJpbmdzX2phLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWIwMjkxZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb3JlL0xvY2FsU3RyaW5nc19qYS5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTcyIEBACithcHBsaWNhdGlvbkNvbnRleHQuYXR0cmlidXRlRXZlbnQ9XHU1YzVlXHU2MDI3XHUzMGE0XHUzMGQ5XHUzMGYzXHUzMGM4XHUzMGVhXHUzMGI5XHUzMGNhXHUzMDZiXHUzMDg4XHUzMDYzXHUzMDY2XHU0ZjhiXHU1OTE2XHUzMDRjXHU2Mjk1XHUzMDUyXHUzMDg5XHUzMDhjXHUzMDdlXHUzMDU3XHUzMDVmCithcHBsaWNhdGlvbkNvbnRleHQubWFwcGluZy5lcnJvcj1cdTMwZGVcdTMwYzNcdTMwZDRcdTMwZjNcdTMwYjBcdTRlMmRcdTMwNmVcdTMwYThcdTMwZTlcdTMwZmNcdTMwNjdcdTMwNTkKK2FwcGxpY2F0aW9uQ29udGV4dC5yZXF1ZXN0RGlzcGF0Y2hlci5pYWU9XHUzMGQxXHUzMGI5IHswfSBcdTMwNGMiLyJcdTY1ODdcdTViNTdcdTMwNjdcdTU5Y2JcdTMwN2VcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTMKK2FwcGxpY2F0aW9uQ29udGV4dC5zZXRBdHRyaWJ1dGUubmFtZW51bGw9bmFtZVx1MzA0Y251bGxcdTMwNjdcdTMwNmZcdTMwNDRcdTMwNTFcdTMwN2VcdTMwNWJcdTMwOTMKK2FwcGxpY2F0aW9uRGlzcGF0Y2hlci5hbGxvY2F0ZUV4Y2VwdGlvbj1cdTMwYjVcdTMwZmNcdTMwZDZcdTMwZWNcdTMwYzNcdTMwYzggezB9IFx1MzA2Ylx1NGY4Ylx1NTkxNlx1MzA5Mlx1NTI3Mlx1MzA4YVx1NWY1M1x1MzA2Nlx1MzA3ZVx1MzA1OQorYXBwbGljYXRpb25EaXNwYXRjaGVyLmRlYWxsb2NhdGVFeGNlcHRpb249XHUzMGI1XHUzMGZjXHUzMGQ2XHUzMGVjXHUzMGMzXHUzMGM4IHswfSBcdTMwNmVcdTRmOGJcdTU5MTZcdTMwOTJcdTg5ZTNcdTk2NjRcdTMwNTdcdTMwN2VcdTMwNTkKK2FwcGxpY2F0aW9uRGlzcGF0Y2hlci5mb3J3YXJkLmlzZT1cdTMwZWNcdTMwYjlcdTMwZGRcdTMwZjNcdTMwYjlcdTMwOTJcdTMwYjNcdTMwZGZcdTMwYzNcdTMwYzhcdTMwNTdcdTMwNWZcdTVmOGNcdTMwNjdcdTMwZDVcdTMwYTlcdTMwZWZcdTMwZmNcdTMwYzlcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMKK2FwcGxpY2F0aW9uRGlzcGF0Y2hlci5mb3J3YXJkLnRocm93PVx1MzBkNVx1MzBhOVx1MzBlZlx1MzBmY1x1MzBjOVx1MzA1N1x1MzA1Zlx1MzBlYVx1MzBiZFx1MzBmY1x1MzBiOVx1MzA0Y1x1NGY4Ylx1NTkxNlx1MzA5Mlx1NjI5NVx1MzA1Mlx1MzA3ZVx1MzA1N1x1MzA1ZgorYXBwbGljYXRpb25EaXNwYXRjaGVyLmluY2x1ZGUudGhyb3c9XHUzMGE0XHUzMGYzXHUzMGFmXHUzMGViXHUzMGZjXHUzMGM5XHUzMDU3XHUzMDVmXHUzMGVhXHUzMGJkXHUzMGZjXHUzMGI5XHUzMDRjXHU0ZjhiXHU1OTE2XHUzMDkyXHU2Mjk1XHUzMDUyXHUzMDdlXHUzMDU3XHUzMDVmCithcHBsaWNhdGlvbkRpc3BhdGNoZXIuaXNVbmF2YWlsYWJsZT1cdTMwYjVcdTMwZmNcdTMwZDZcdTMwZWNcdTMwYzNcdTMwYzggezB9IFx1MzA2Zlx1NzNmZVx1NTcyOFx1NTIyOVx1NzUyOFx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5MworYXBwbGljYXRpb25EaXNwYXRjaGVyLnNlcnZpY2VFeGNlcHRpb249XHUzMGI1XHUzMGZjXHUzMGQ2XHUzMGVjXHUzMGMzXHUzMGM4IHswfSBcdTMwNmVTZXJ2bGV0LnNlcnZpY2UoKVx1MzA0Y1x1NGY4Ylx1NTkxNlx1MzA5Mlx1NjI5NVx1MzA1Mlx1MzA3ZVx1MzA1N1x1MzA1ZgorYXBwbGljYXRpb25SZXF1ZXN0LmJhZFBhcmVudD1cdTg5YWFcdTMwNmVcdTMwZWFcdTMwYWZcdTMwYThcdTMwYjlcdTMwYzhcdTViOWZcdTg4YzVcdTMwOTJcdTkxNGRcdTdmNmVcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMKK2FwcGxpY2F0aW9uUmVxdWVzdC5iYWRSZXF1ZXN0PVx1MzBlYVx1MzBhZlx1MzBhOFx1MzBiOVx1MzBjOFx1MzA0Y2phdmF4LnNlcnZsZXQuU2VydmxldFJlcXVlc3RXcmFwcGVyXHUzMDY3XHUzMDZmXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDViXHUzMDkzCithcHBsaWNhdGlvblJlc3BvbnNlLmJhZFBhcmVudD1cdTg5YWFcdTMwNmVcdTMwZWNcdTMwYjlcdTMwZGRcdTMwZjNcdTMwYjlcdTViOWZcdTg4YzVcdTMwOTJcdTkxNGRcdTdmNmVcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMKK2FwcGxpY2F0aW9uUmVzcG9uc2UuYmFkUmVzcG9uc2U9XHUzMGVjXHUzMGI5XHUzMGRkXHUzMGYzXHUzMGI5XHUzMDRjamF2YXguc2VydmxldC5TZXJ2bGV0UmVzcG9uc2VXcmFwcGVyXHUzMDY3XHUzMDZmXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDViXHUzMDkzCitjb250YWluZXJCYXNlLmFkZERlZmF1bHRNYXBwZXI9XHUzMGFmXHUzMGU5XHUzMGI5IHswfSBcdTMwNmVcdTMwYzdcdTMwZDVcdTMwYTlcdTMwZWJcdTMwYzhcdTMwNmVcdTMwZGVcdTMwYzNcdTMwZDFcdTMwOTJcdThhMmRcdTViOWFcdTRlMmRcdTMwNmJcdTRmOGJcdTU5MTZcdTMwNGNcdTc2N2FcdTc1MWZcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWYKK2NvbnRhaW5lckJhc2UuYWxyZWFkeVN0YXJ0ZWQ9XHUzMGIzXHUzMGYzXHUzMGM2XHUzMGNhIHswfSBcdTMwNmZcdTY1ZTJcdTMwNmJcdThkNzdcdTUyZDVcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkKK2NvbnRhaW5lckJhc2Uubm90Q29uZmlndXJlZD1cdTU3ZmFcdTY3MmNcdTMwZDBcdTMwZWJcdTMwZDZcdTMwNGNcdThhMmRcdTViOWFcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNWJcdTMwOTMKK2NvbnRhaW5lckJhc2Uubm90U3RhcnRlZD1cdTMwYjNcdTMwZjNcdTMwYzZcdTMwY2EgezB9IFx1MzA2Zlx1MzA3ZVx1MzA2MFx1OGQ3N1x1NTJkNVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5MworZmFzdEVuZ2luZU1hcHBlci5hbHJlYWR5U3RhcnRlZD1GYXN0RW5naW5lTWFwcGVyIHswfSBcdTMwNmZcdTY1ZTJcdTMwNmJcdThkNzdcdTUyZDVcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkKK2Zhc3RFbmdpbmVNYXBwZXIubm90U3RhcnRlZD1GYXN0RW5naW5lTWFwcGVyIHswfSBcdTMwNmZcdTMwN2VcdTMwNjBcdThkNzdcdTUyZDVcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNWJcdTMwOTMKK2ZpbHRlckNoYWluLmZpbHRlcj1cdTMwZDVcdTMwYTNcdTMwZWJcdTMwYmZcdTMwNmVcdTViOWZcdTg4NGNcdTMwNmJcdTMwODhcdTMwOGFcdTRmOGJcdTU5MTZcdTMwOTJcdTYyOTVcdTMwNTJcdTMwN2VcdTMwNTdcdTMwNWYKK2ZpbHRlckNoYWluLnNlcnZsZXQ9XHUzMGI1XHUzMGZjXHUzMGQ2XHUzMGVjXHUzMGMzXHUzMGM4XHUzMDZlXHU1YjlmXHU4ODRjXHUzMDZiXHUzMDg4XHUzMDhhXHU0ZjhiXHU1OTE2XHUzMDkyXHU2Mjk1XHUzMDUyXHUzMDdlXHUzMDU3XHUzMDVmCitodHRwQ29udGV4dE1hcHBlci5jb250YWluZXI9XHUzMDUzXHUzMDZlXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGNhXHUzMDZmU3RhbmRhcmRDb250ZXh0XHUzMDY3XHUzMDZmXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDViXHUzMDkzCitodHRwRW5naW5lTWFwcGVyLmNvbnRhaW5lcj1cdTMwNTNcdTMwNmVcdTMwYjNcdTMwZjNcdTMwYzZcdTMwY2FcdTMwNmZTdGFuZGFyZEVuZ2luZVx1MzA2N1x1MzA2Zlx1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5MworaHR0cEhvc3RNYXBwZXIuY29udGFpbmVyPVx1MzA1M1x1MzA2ZVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBjYVx1MzA2ZlN0YW5kYXJkSG9zdFx1MzA2N1x1MzA2Zlx1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5MworaW50ZXJjZXB0b3JWYWx2ZS5hbHJlYWR5U3RhcnRlZD1JbnRlcmNlcHRvclZhbHZlXHUzMDZmXHU2NWUyXHUzMDZiXHU4ZDc3XHU1MmQ1XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5CitpbnRlcmNlcHRvclZhbHZlLm5vdFN0YXJ0ZWQ9SW50ZXJjZXB0b3JWYWx2ZVx1MzA2Zlx1MzA3ZVx1MzA2MFx1OGQ3N1x1NTJkNVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5MworbmFtaW5nLmJpbmRGYWlsZWQ9XHUzMGFhXHUzMGQ2XHUzMGI4XHUzMGE3XHUzMGFmXHUzMGM4XHUzMDZlXHUzMGQwXHUzMGE0XHUzMGYzXHUzMGM5XHUzMDZiXHU1OTMxXHU2NTU3XHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmOiB7MH0KK25hbWluZy51bmJpbmRGYWlsZWQ9XHUzMGFhXHUzMGQ2XHUzMGI4XHUzMGE3XHUzMGFmXHUzMGM4XHUzMDZlXHUzMGEyXHUzMGYzXHUzMGQwXHUzMGE0XHUzMGYzXHUzMGM5XHUzMDZiXHU1OTMxXHU2NTU3XHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmOiB7MH0KK25hbWluZy5pbnZhbGlkRW52RW50cnlUeXBlPVx1NzRiMFx1NTg4M1x1MzBhOFx1MzBmM1x1MzBjOFx1MzBlYSB7MH0gXHUzMDZmXHU3MTIxXHU1MmI5XHUzMDZhXHU1NzhiXHUzMDkyXHU2MzAxXHUzMDYzXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5CituYW1pbmcuaW52YWxpZEVudkVudHJ5VmFsdWU9XHU3NGIwXHU1ODgzXHUzMGE4XHUzMGYzXHUzMGM4XHUzMGVhIHswfSBcdTMwNmZcdTcxMjFcdTUyYjlcdTMwNmFcdTUwMjRcdTMwOTJcdTYzMDFcdTMwNjNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkKK25hbWluZy5uYW1pbmdDb250ZXh0Q3JlYXRpb25GYWlsZWQ9XHU1NDBkXHU1MjRkXHU0ZWQ4XHUzMDRkXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4XHUzMDZlXHU3NTFmXHU2MjEwXHUzMDZiXHU1OTMxXHU2NTU3XHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmOiB7MH0KK3N0YW5kYXJkQ29udGV4dC5hbHJlYWR5U3RhcnRlZD1cdTMwYjNcdTMwZjNcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzhcdTMwNmZcdTY1ZTJcdTMwNmJcdThkNzdcdTUyZDVcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkKK3N0YW5kYXJkQ29udGV4dC5hcHBsaWNhdGlvbkxpc3RlbmVyPVx1MzBhZlx1MzBlOVx1MzBiOSB7MH0gXHUzMDZlXHUzMGEyXHUzMGQ3XHUzMGVhXHUzMGIxXHUzMGZjXHUzMGI3XHUzMGU3XHUzMGYzXHUzMGVhXHUzMGI5XHUzMGNhXHUzMDZlXHU4YTJkXHU1YjlhXHU0ZTJkXHUzMDZiXHUzMGE4XHUzMGU5XHUzMGZjXHUzMDRjXHU3NjdhXHU3NTFmXHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmCitzdGFuZGFyZENvbnRleHQuYXBwbGljYXRpb25Ta2lwcGVkPVx1NTI0ZFx1MzA2ZVx1MzBhOFx1MzBlOVx1MzBmY1x1MzA2ZVx1MzA1Zlx1MzA4MVx1MzA2Ylx1MzBhMlx1MzBkN1x1MzBlYVx1MzBiMVx1MzBmY1x1MzBiN1x1MzBlN1x1MzBmM1x1MzBlYVx1MzBiOVx1MzBjYVx1MzA2ZVx1MzBhNFx1MzBmM1x1MzBiOVx1MzBjOFx1MzBmY1x1MzBlYlx1MzA5Mlx1MzBiOVx1MzBhZFx1MzBjM1x1MzBkN1x1MzA1N1x1MzA3ZVx1MzA1OQorc3RhbmRhcmRDb250ZXh0LmJhZFJlcXVlc3Q9XHU3MTIxXHU1MmI5XHUzMDZhXHUzMGVhXHUzMGFmXHUzMGE4XHUzMGI5XHUzMGM4XHUzMGQxXHUzMGI5XHUzMDY3XHUzMDU5ICh7MH0pXHUzMDAyCitzdGFuZGFyZENvbnRleHQuZXJyb3JQYWdlLmVycm9yPVx1MzBhOFx1MzBlOVx1MzBmY1x1MzBkYVx1MzBmY1x1MzBiOFx1MzA2ZVx1NGY0ZFx1N2Y2ZSB7MH0gXHUzMDZmJy8nXHUzMDY3XHU1OWNiXHUzMDdlXHUzMDg5XHUzMDZhXHUzMDUxXHUzMDhjXHUzMDcwXHUzMDQ0XHUzMDUxXHUzMDdlXHUzMDViXHUzMDkzCitzdGFuZGFyZENvbnRleHQuZXJyb3JQYWdlLnJlcXVpcmVkPUVycm9yUGFnZVx1MzA0Y251bGxcdTMwNjdcdTMwNmZcdTMwNDRcdTMwNTFcdTMwN2VcdTMwNWJcdTMwOTMKK3N0YW5kYXJkQ29udGV4dC5lcnJvclBhZ2Uud2FybmluZz1cdThiNjZcdTU0NGE6IFNlcnZsZXQgMi40XHUzMDY3XHUzMDZmXHUzMGE4XHUzMGU5XHUzMGZjXHUzMGRhXHUzMGZjXHUzMGI4XHUzMDZlXHU0ZjRkXHU3ZjZlIHswfSBcdTMwNmYnLydcdTMwNjdcdTU5Y2JcdTMwN2VcdTMwODlcdTMwNmFcdTMwNTFcdTMwOGNcdTMwNzBcdTMwNDRcdTMwNTFcdTMwN2VcdTMwNWJcdTMwOTMKK3N0YW5kYXJkQ29udGV4dC5maWx0ZXJNYXAuZWl0aGVyPVx1MzBkNVx1MzBhM1x1MzBlYlx1MzBiZlx1MzBkZVx1MzBjM1x1MzBkNFx1MzBmM1x1MzBiMFx1MzA2Zjx1cmwtcGF0dGVybj5cdTUzYzhcdTMwNmY8c2VydmxldC1uYW1lPlx1MzA2ZVx1MzA2OVx1MzA2MVx1MzA4OVx1MzA0Ylx1MzA5Mlx1NjMwN1x1NWI5YVx1MzA1N1x1MzA2YVx1MzA1MVx1MzA4Y1x1MzA3MFx1MzA0NFx1MzA1MVx1MzA3ZVx1MzA1Ylx1MzA5Mworc3RhbmRhcmRDb250ZXh0LmZpbHRlck1hcC5uYW1lPVx1MzBkNVx1MzBhM1x1MzBlYlx1MzBiZlx1MzBkZVx1MzBjM1x1MzBkNFx1MzBmM1x1MzBiMFx1MzA2Zlx1NjcyYVx1NzdlNVx1MzA2ZVx1MzBkNVx1MzBhM1x1MzBlYlx1MzBiZlx1NTQwZCB7MH0gXHUzMDkyXHU2MzA3XHU1YjlhXHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmCitzdGFuZGFyZENvbnRleHQuZmlsdGVyTWFwLnBhdHRlcm49XHUzMGQ1XHUzMGEzXHUzMGViXHUzMGJmXHUzMGRlXHUzMGMzXHUzMGQ0XHUzMGYzXHUzMGIwXHU0ZTJkXHUzMDZiXHU3MTIxXHU1MmI5XHUzMDZhIDx1cmwtcGF0dGVybj4gezB9IFx1MzA0Y1x1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1OQorc3RhbmRhcmRDb250ZXh0LmZpbHRlclN0YXJ0PVx1MzBkNVx1MzBhM1x1MzBlYlx1MzBiZiB7MH0gXHUzMDZlXHU4ZDc3XHU1MmQ1XHU0ZTJkXHUzMDZlXHU0ZjhiXHU1OTE2XHUzMDY3XHUzMDU5CitzdGFuZGFyZENvbnRleHQuZmlsdGVyU3RhcnRGYWlsZWQ9XHUzMGEyXHUzMGQ3XHUzMGVhXHUzMGIxXHUzMGZjXHUzMGI3XHUzMGU3XHUzMGYzXHUzMGQ1XHUzMGEzXHUzMGViXHUzMGJmXHUzMDZlXHU4ZDc3XHU1MmQ1XHUzMDZiXHU1OTMxXHU2NTU3XHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmCitzdGFuZGFyZENvbnRleHQucmVxdWVzdExpc3RlbmVyU3RhcnRGYWlsZWQ9XHUzMGVhXHUzMGFmXHUzMGE4XHUzMGI5XHUzMGM4XHUzMGVhXHUzMGI5XHUzMGNhXHUzMGQwXHUzMGViXHUzMGQ2XHUzMDZlXHU4ZDc3XHU1MmQ1XHUzMDZiXHU1OTMxXHU2NTU3XHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmCitzdGFuZGFyZENvbnRleHQucmVxdWVzdExpc3RlbmVyQ29uZmlnLmFkZGVkPVx1MzBlYVx1MzBhZlx1MzBhOFx1MzBiOVx1MzBjOFx1MzBlYVx1MzBiOVx1MzBjYVx1MzBkMFx1MzBlYlx1MzBkNlx1MzA5Mlx1OGZmZFx1NTJhMFx1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1Zgorc3RhbmRhcmRDb250ZXh0LnJlcXVlc3RMaXN0ZW5lckNvbmZpZy5lcnJvcj1cdTMwZWFcdTMwYWZcdTMwYThcdTMwYjlcdTMwYzhcdTMwZWFcdTMwYjlcdTMwY2FcdTMwZDBcdTMwZWJcdTMwZDZcdThmZmRcdTUyYTBcdTRlMmRcdTMwNmVcdTRmOGJcdTU5MTZcdTMwNjdcdTMwNTk6IHswfQorc3RhbmRhcmRDb250ZXh0LmlzVW5hdmFpbGFibGU9XHUzMDUzXHUzMDZlXHUzMGEyXHUzMGQ3XHUzMGVhXHUzMGIxXHUzMGZjXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDZmXHU3M2ZlXHU1NzI4XHU1MjI5XHU3NTI4XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzCitzdGFuZGFyZENvbnRleHQubGlzdGVuZXJTdGFydD1cdTMwYWZcdTMwZTlcdTMwYjkgezB9IFx1MzA2ZVx1MzBlYVx1MzBiOVx1MzBjYVx1MzBhNFx1MzBmM1x1MzBiOVx1MzBiZlx1MzBmM1x1MzBiOVx1MzA2Ylx1MzBiM1x1MzBmM1x1MzBjNlx1MzBhZFx1MzBiOVx1MzBjOFx1NTIxZFx1NjcxZlx1NTMxNlx1MzBhNFx1MzBkOVx1MzBmM1x1MzBjOFx1MzA5Mlx1OTAwMVx1NGZlMVx1NGUyZFx1MzA2ZVx1NGY4Ylx1NTkxNlx1MzA2N1x1MzA1OQorc3RhbmRhcmRDb250ZXh0Lmxpc3RlbmVyU3RhcnRGYWlsZWQ9XHUzMGEyXHUzMGQ3XHUzMGVhXHUzMGIxXHUzMGZjXHUzMGI3XHUzMGU3XHUzMGYzXHUzMGVhXHUzMGI5XHUzMGNhXHUzMDZlXHU4ZDc3XHU1MmQ1XHUzMDZiXHU1OTMxXHU2NTU3XHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmCitzdGFuZGFyZENvbnRleHQubGlzdGVuZXJTdG9wPVx1MzBhZlx1MzBlOVx1MzBiOSB7MH0gXHUzMDZlXHUzMGVhXHUzMGI5XHUzMGNhXHUzMGE0XHUzMGYzXHUzMGI5XHUzMGJmXHUzMGYzXHUzMGI5XHUzMDZiXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4XHU3ODM0XHU2OGM0XHUzMGE0XHUzMGQ5XHUzMGYzXHUzMGM4XHUzMDkyXHU5MDAxXHU0ZmUxXHU0ZTJkXHUzMDZlXHU0ZjhiXHU1OTE2XHUzMDY3XHUzMDU5CitzdGFuZGFyZENvbnRleHQubG9naW5Db25maWcuZXJyb3JQYWdlPVx1MzBkNVx1MzBhOVx1MzBmY1x1MzBlMFx1MzA2ZVx1MzBhOFx1MzBlOVx1MzBmY1x1MzBkYVx1MzBmY1x1MzBiOCB7MH0gXHUzMDZmJy8nXHUzMDY3XHU1OWNiXHUzMDdlXHUzMDg5XHUzMDZhXHUzMDUxXHUzMDhjXHUzMDcwXHUzMDQ0XHUzMDUxXHUzMDdlXHUzMDViXHUzMDkzCitzdGFuZGFyZENvbnRleHQubG9naW5Db25maWcuZXJyb3JXYXJuaW5nPVx1OGI2Nlx1NTQ0YTogU2VydmxldCAyLjRcdTMwNjdcdTMwNmZcdTMwZDVcdTMwYTlcdTMwZmNcdTMwZTBcdTMwNmVcdTMwYThcdTMwZTlcdTMwZmNcdTMwZGFcdTMwZmNcdTMwYjggezB9IFx1MzA2ZicvJ1x1MzA2N1x1NTljYlx1MzA3ZVx1MzA4OVx1MzA2YVx1MzA1MVx1MzA4Y1x1MzA3MFx1MzA0NFx1MzA1MVx1MzA3ZVx1MzA1Ylx1MzA5Mworc3RhbmRhcmRDb250ZXh0LmxvZ2luQ29uZmlnLmxvZ2luUGFnZT1cdTMwZDVcdTMwYTlcdTMwZmNcdTMwZTBcdTMwNmVcdTMwZWRcdTMwYjBcdTMwYTRcdTMwZjNcdTMwZGFcdTMwZmNcdTMwYjggezB9IFx1MzA2ZicvJ1x1MzA2N1x1NTljYlx1MzA3ZVx1MzA4OVx1MzA2YVx1MzA1MVx1MzA4Y1x1MzA3MFx1MzA0NFx1MzA1MVx1MzA3ZVx1MzA1Ylx1MzA5Mworc3RhbmRhcmRDb250ZXh0LmxvZ2luQ29uZmlnLmxvZ2luV2FybmluZz1cdThiNjZcdTU0NGE6IFNlcnZsZXQgMi40XHUzMDY3XHUzMDZmXHUzMGQ1XHUzMGE5XHUzMGZjXHUzMGUwXHUzMDZlXHUzMGVkXHUzMGIwXHUzMGE0XHUzMGYzXHUzMGRhXHUzMGZjXHUzMGI4IHswfSBcdTMwNmYnLydcdTMwNjdcdTU5Y2JcdTMwN2VcdTMwODlcdTMwNmFcdTMwNTFcdTMwOGNcdTMwNzBcdTMwNDRcdTMwNTFcdTMwN2VcdTMwNWJcdTMwOTMKK3N0YW5kYXJkQ29udGV4dC5sb2dpbkNvbmZpZy5yZXF1aXJlZD1Mb2dpbkNvbmZpZ1x1MzA2Zm51bGxcdTMwNjdcdTMwNmZcdTMwNDRcdTMwNTFcdTMwN2VcdTMwNWJcdTMwOTMKK3N0YW5kYXJkQ29udGV4dC5tYXBwaW5nRXJyb3I9XHU3NmY4XHU1YmZlVVJJIHswfSBcdTMwNmVcdTMwZGVcdTMwYzNcdTMwZDRcdTMwZjNcdTMwYjBcdThhMmRcdTViOWFcdTMwYThcdTMwZTlcdTMwZmNcdTMwNjdcdTMwNTkKK3N0YW5kYXJkQ29udGV4dC5ub3RGb3VuZD1cdTMwZWFcdTMwYWZcdTMwYThcdTMwYjlcdTMwYzhcdTMwNTVcdTMwOGNcdTMwNWZcdTMwZWFcdTMwYmRcdTMwZmNcdTMwYjkgKHswfSkgXHUzMDZmXHU1MjI5XHU3NTI4XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyCitzdGFuZGFyZENvbnRleHQubm90UmVsb2FkYWJsZT1cdTMwNTNcdTMwNmVcdTMwYjNcdTMwZjNcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzhcdTMwNjdcdTMwNmZcdTUxOGRcdTMwZWRcdTMwZmNcdTMwYzlcdTMwNmZcdTcxMjFcdTUyYjlcdTMwNjdcdTMwNTkKK3N0YW5kYXJkQ29udGV4dC5ub3RTdGFydGVkPVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBhZFx1MzBiOVx1MzBjOFx1MzA2Zlx1MzA3ZVx1MzA2MFx1OGQ3N1x1NTJkNVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5Mworc3RhbmRhcmRDb250ZXh0Lm5vdFdyYXBwZXI9XHUzMGIzXHUzMGYzXHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4XHUzMDZlXHU1YjUwXHU0ZjliXHUzMDZmXHUzMGU5XHUzMGMzXHUzMGQxXHUzMDY3XHUzMDZhXHUzMDUxXHUzMDhjXHUzMDcwXHUzMDQ0XHUzMDUxXHUzMDdlXHUzMDViXHUzMDkzCitzdGFuZGFyZENvbnRleHQucGFyYW1ldGVyLmR1cGxpY2F0ZT1cdTMwYjNcdTMwZjNcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzhcdTUyMWRcdTY3MWZcdTUzMTZcdTMwZDFcdTMwZTlcdTMwZTFcdTMwYmYgezB9IFx1MzA0Y1x1OTFjZFx1ODkwN1x1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OQorc3RhbmRhcmRDb250ZXh0LnBhcmFtZXRlci5yZXF1aXJlZD1cdTMwZDFcdTMwZTlcdTMwZTFcdTMwYmZcdTU0MGRcdTMwNjhcdTMwZDFcdTMwZTlcdTMwZTFcdTMwYmZcdTUwMjRcdTMwNmVcdTRlMjFcdTY1YjlcdTMwNGNcdTVmYzVcdTg5ODFcdTMwNjdcdTMwNTkKK3N0YW5kYXJkQ29udGV4dC5yZWxvYWRpbmdDb21wbGV0ZWQ9XHUzMDUzXHUzMDZlXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4XHUzMDZlXHU1MThkXHUzMGVkXHUzMGZjXHUzMGM5XHUzMDRjXHU1YjhjXHU0ZTg2XHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmCitzdGFuZGFyZENvbnRleHQucmVsb2FkaW5nRmFpbGVkPVx1NGVlNVx1NTI0ZFx1MzA2ZVx1MzBhOFx1MzBlOVx1MzBmY1x1MzA2ZVx1MzA1Zlx1MzA4MVx1MzA2Ylx1MzA1M1x1MzA2ZVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBhZFx1MzBiOVx1MzBjOFx1MzA2ZVx1NTE4ZFx1MzBlZFx1MzBmY1x1MzBjOVx1MzA0Y1x1NTkzMVx1NjU1N1x1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1Zgorc3RhbmRhcmRDb250ZXh0LnJlbG9hZGluZ1N0YXJ0ZWQ9XHUzMDUzXHUzMDZlXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4XHUzMDZlXHU1MThkXHUzMGVkXHUzMGZjXHUzMGM5XHUzMDkyXHU5NThiXHU1OWNiXHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmCitzdGFuZGFyZENvbnRleHQucmVzb3VyY2VzU3RhcnQ9XHU5NzU5XHU3Njg0XHUzMGVhXHUzMGJkXHUzMGZjXHUzMGI5XHUzMDZlXHU4ZDc3XHU1MmQ1XHU0ZTJkXHUzMDZlXHUzMGE4XHUzMGU5XHUzMGZjXHUzMDY3XHUzMDU5CitzdGFuZGFyZENvbnRleHQuc2VjdXJpdHlDb25zdHJhaW50LnBhdHRlcm49XHUzMGJiXHUzMGFkXHUzMGU1XHUzMGVhXHUzMGM2XHUzMGEzXHUzMDZlXHU1MjM2XHU3ZDA0XHUzMDZlXHU0ZTJkXHUzMDZiXHU3MTIxXHU1MmI5XHUzMDZhIDx1cmwtcGF0dGVybj4gezB9IFx1MzA0Y1x1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1OQorc3RhbmRhcmRDb250ZXh0LnNlcnZsZXRNYXAubmFtZT1cdTMwYjVcdTMwZmNcdTMwZDZcdTMwZWNcdTMwYzNcdTMwYzhcdTMwZGVcdTMwYzNcdTMwZDRcdTMwZjNcdTMwYjBcdTMwNmZcdTY3MmFcdTc3ZTVcdTMwNmVcdTMwYjVcdTMwZmNcdTMwZDZcdTMwZWNcdTMwYzNcdTMwYzhcdTU0MGQgezB9IFx1MzA5Mlx1NjMwN1x1NWI5YVx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OQorc3RhbmRhcmRDb250ZXh0LnNlcnZsZXRNYXAucGF0dGVybj1cdTMwYjVcdTMwZmNcdTMwZDZcdTMwZWNcdTMwYzNcdTMwYzhcdTMwZGVcdTMwYzNcdTMwZDRcdTMwZjNcdTMwYjBcdTRlMmRcdTMwNmJcdTcxMjFcdTUyYjlcdTMwNmEgPHVybC1wYXR0ZXJuPiB7MH0gXHUzMDRjXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDU5CitzdGFuZGFyZENvbnRleHQuc3RhcnRDbGVhbnVwPVx1OGQ3N1x1NTJkNVx1MzA0Y1x1NTkzMVx1NjU1N1x1MzA1N1x1MzA1Zlx1NWY4Y1x1MzA2ZVx1MzBhZlx1MzBlYVx1MzBmY1x1MzBmM1x1MzBjYVx1MzBjM1x1MzBkN1x1NGUyZFx1MzA2Ylx1NGY4Ylx1NTkxNlx1MzA0Y1x1NzY3YVx1NzUxZlx1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1Zgorc3RhbmRhcmRDb250ZXh0LnN0YXJ0RmFpbGVkPVx1NGVlNVx1NTI0ZFx1MzA2ZVx1MzBhOFx1MzBlOVx1MzBmY1x1MzA2ZVx1MzA1Zlx1MzA4MVx1MzA2Ylx1MzBiM1x1MzBmM1x1MzBjNlx1MzBhZFx1MzBiOVx1MzBjOFx1MzA2ZVx1OGQ3N1x1NTJkNVx1MzA0Y1x1NTkzMVx1NjU1N1x1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1Zgorc3RhbmRhcmRDb250ZXh0LnN0YXJ0aW5nTG9hZGVyPVx1MzBlZFx1MzBmY1x1MzBjMFx1MzA5Mlx1OGQ3N1x1NTJkNVx1NGUyZFx1MzA2ZVx1NGY4Ylx1NTkxNlx1MzA2N1x1MzA1OQorc3RhbmRhcmRDb250ZXh0LnN0YXJ0aW5nTWFuYWdlcj1cdTMwZGVcdTMwY2RcdTMwZmNcdTMwYjhcdTMwZTNcdTMwOTJcdThkNzdcdTUyZDVcdTRlMmRcdTMwNmVcdTRmOGJcdTU5MTZcdTMwNjdcdTMwNTkKK3N0YW5kYXJkQ29udGV4dC5zdGFydGluZ1dyYXBwZXI9XHUzMGI1XHUzMGZjXHUzMGQ2XHUzMGVjXHUzMGMzXHUzMGM4IHswfSBcdTMwNmVcdTMwZTlcdTMwYzNcdTMwZDFcdTMwOTJcdThkNzdcdTUyZDVcdTRlMmRcdTMwNmVcdTRmOGJcdTU5MTZcdTMwNjdcdTMwNTkKK3N0YW5kYXJkQ29udGV4dC5zdG9wcGluZ0NvbnRleHQ9XHUzMGVkXHUzMGZjXHUzMGMwXHUzMDkyXHU1MDVjXHU2YjYyXHU0ZTJkXHUzMDZlXHU0ZjhiXHU1OTE2XHUzMDY3XHUzMDU5CitzdGFuZGFyZENvbnRleHQuc3RvcHBpbmdMb2FkZXI9XHUzMGVkXHUzMGZjXHUzMGMwXHUzMDkyXHU1MDVjXHU2YjYyXHU0ZTJkXHUzMDZlXHU0ZjhiXHU1OTE2XHUzMDY3XHUzMDU5CitzdGFuZGFyZENvbnRleHQuc3RvcHBpbmdNYW5hZ2VyPVx1MzBkZVx1MzBjZFx1MzBmY1x1MzBiOFx1MzBlM1x1MzA5Mlx1NTA1Y1x1NmI2Mlx1NGUyZFx1MzA2ZVx1NGY4Ylx1NTkxNlx1MzA2N1x1MzA1OQorc3RhbmRhcmRDb250ZXh0LnN0b3BwaW5nV3JhcHBlcj1cdTMwYjVcdTMwZmNcdTMwZDZcdTMwZWNcdTMwYzNcdTMwYzggezB9IFx1MzA2ZVx1MzBlOVx1MzBjM1x1MzBkMVx1MzA5Mlx1NTA1Y1x1NmI2Mlx1NGUyZFx1MzA2ZVx1NGY4Ylx1NTkxNlx1MzA2N1x1MzA1OQorc3RhbmRhcmRDb250ZXh0LnVybERlY29kZT1cdTMwZWFcdTMwYWZcdTMwYThcdTMwYjlcdTMwYzhcdTMwZDFcdTMwYjkgezB9IFx1MzA2ZVVSTFx1MzBjN1x1MzBiM1x1MzBmY1x1MzBjOVx1MzA0Y1x1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5Mworc3RhbmRhcmRDb250ZXh0LnVybFBhdHRlcm4ucGF0dGVybldhcm5pbmc9XHU4YjY2XHU1NDRhOiBTZXJ2bGV0IDIuNFx1MzA2N1x1MzA2ZlVSTFx1MzBkMVx1MzBiZlx1MzBmY1x1MzBmMyB7MH0gXHUzMDZmJy8nXHUzMDY3XHU1OWNiXHUzMDdlXHUzMDg5XHUzMDZhXHUzMDUxXHUzMDhjXHUzMDcwXHUzMDQ0XHUzMDUxXHUzMDdlXHUzMDViXHUzMDkzCitzdGFuZGFyZENvbnRleHQudXJsVmFsaWRhdGU9VVJMXHUzMGM3XHUzMGIzXHUzMGZjXHUzMGM5XHUzMDU1XHUzMDhjXHUzMDVmXHUzMGVhXHUzMGFmXHUzMGE4XHUzMGI5XHUzMGM4XHUzMGQxXHUzMGI5IHswfSBcdTMwOTJcdTY5MWNcdThhM2NcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMKK3N0YW5kYXJkQ29udGV4dC53cmFwcGVyLmVycm9yPUpTUFx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYiB7MH0gXHUzMDZmJy8nXHUzMDY3XHU1OWNiXHUzMDdlXHUzMDg5XHUzMDZhXHUzMDUxXHUzMDhjXHUzMDcwXHUzMDQ0XHUzMDUxXHUzMDdlXHUzMDViXHUzMDkzCitzdGFuZGFyZENvbnRleHQud3JhcHBlci53YXJuaW5nPVx1OGI2Nlx1NTQ0YTogU2VydmxldCAyLjRcdTMwNjdcdTMwNmZKU1BcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWIgezB9IFx1MzA2ZicvJ1x1MzA2N1x1NTljYlx1MzA3ZVx1MzA4OVx1MzA2YVx1MzA1MVx1MzA4Y1x1MzA3MFx1MzA0NFx1MzA1MVx1MzA3ZVx1MzA1Ylx1MzA5Mworc3RhbmRhcmRFbmdpbmUuYWxyZWFkeVN0YXJ0ZWQ9XHUzMGE4XHUzMGYzXHUzMGI4XHUzMGYzXHUzMDZmXHU2NWUyXHUzMDZiXHU4ZDc3XHU1MmQ1XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5CitzdGFuZGFyZEVuZ2luZS5tYXBwaW5nRXJyb3I9XHUzMGI1XHUzMGZjXHUzMGQwXHU1NDBkIHswfSBcdTMwNmVcdTMwZGVcdTMwYzNcdTMwZDRcdTMwZjNcdTMwYjBcdThhMmRcdTViOWFcdTMwYThcdTMwZTlcdTMwZmNcdTMwNjdcdTMwNTkKK3N0YW5kYXJkRW5naW5lLm5vSG9zdD1cdTMwYjVcdTMwZmNcdTMwZDBcdTU0MGQgezB9IFx1MzA2Ylx1NGUwMFx1ODFmNFx1MzA1OVx1MzA4Ylx1MzBkYlx1MzBiOVx1MzBjOFx1MzA0Y1x1NWI1OFx1NTcyOFx1MzA1N1x1MzA3ZVx1MzA1Ylx1MzA5Mworc3RhbmRhcmRFbmdpbmUubm9Ib3N0SGVhZGVyPUhvc3Q6XHUzMGQ4XHUzMGMzXHUzMGMwXHUzMDkyXHU2MzAxXHUzMDVmXHUzMDZhXHUzMDQ0IEhUVFAvMS4xIFx1MzBlYVx1MzBhZlx1MzBhOFx1MzBiOVx1MzBjOFx1MzA2N1x1MzA1OQorc3RhbmRhcmRFbmdpbmUubm90SG9zdD1cdTMwYThcdTMwZjNcdTMwYjhcdTMwZjNcdTMwNmVcdTViNTBcdTRmOWJcdTMwNmZcdTMwZGJcdTMwYjlcdTMwYzhcdTMwNjdcdTMwNmFcdTMwNTFcdTMwOGNcdTMwNzBcdTMwNDRcdTMwNTFcdTMwN2VcdTMwNWJcdTMwOTMKK3N0YW5kYXJkRW5naW5lLm5vdFBhcmVudD1cdTMwYThcdTMwZjNcdTMwYjhcdTMwZjNcdTMwNmZcdTg5YWFcdTMwNmVcdTMwYjNcdTMwZjNcdTMwYzZcdTMwY2FcdTMwOTJcdTYzMDFcdTMwNjRcdTMwNTNcdTMwNjhcdTMwNmZcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMKK3N0YW5kYXJkRW5naW5lLm5vdFN0YXJ0ZWQ9XHUzMGE4XHUzMGYzXHUzMGI4XHUzMGYzXHUzMDZmXHUzMDdlXHUzMDYwXHU4ZDc3XHU1MmQ1XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzCitzdGFuZGFyZEVuZ2luZS51bmZvdW5kSG9zdD1cdTMwZDBcdTMwZmNcdTMwYzFcdTMwZTNcdTMwZWJcdTMwZGJcdTMwYjlcdTMwYzggezB9IFx1MzA0Y1x1ODk4Ylx1MzA2NFx1MzA0Ylx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5Mworc3RhbmRhcmRFbmdpbmUudW5rbm93bkhvc3Q9XHUzMDUzXHUzMDZlXHUzMGVhXHUzMGFmXHUzMGE4XHUzMGI5XHUzMGM4XHU0ZTJkXHUzMDZiXHUzMGI1XHUzMGZjXHUzMGQwXHUzMGRiXHUzMGI5XHUzMGM4XHUzMDRjXHU2MzA3XHU1YjlhXHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzCitzdGFuZGFyZEhvc3QuYWNjZXNzQmFzZT1cdTMwYzlcdTMwYWRcdTMwZTVcdTMwZTFcdTMwZjNcdTMwYzhcdTMwZDlcdTMwZmNcdTMwYjlcdTMwYzdcdTMwYTNcdTMwZWNcdTMwYWZcdTMwYzhcdTMwZWEgezB9IFx1MzA2Ylx1MzBhMlx1MzBhZlx1MzBiYlx1MzBiOVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5Mworc3RhbmRhcmRIb3N0LmFscmVhZHlTdGFydGVkPVx1MzBkYlx1MzBiOVx1MzBjOFx1MzA2Zlx1NjVlMlx1MzA2Ylx1OGQ3N1x1NTJkNVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OQorc3RhbmRhcmRIb3N0LmFwcEJhc2U9XHUzMGEyXHUzMGQ3XHUzMGVhXHUzMGIxXHUzMGZjXHUzMGI3XHUzMGU3XHUzMGYzXHUzMGQ5XHUzMGZjXHUzMGI5XHUzMGM3XHUzMGEzXHUzMGVjXHUzMGFmXHUzMGM4XHUzMGVhIHswfSBcdTMwNGNcdTViNThcdTU3MjhcdTMwNTdcdTMwN2VcdTMwNWJcdTMwOTMKK3N0YW5kYXJkSG9zdC5jbGllbnRBYm9ydD1cdTMwZWFcdTMwZTJcdTMwZmNcdTMwYzhcdTMwYWZcdTMwZTlcdTMwYTRcdTMwYTJcdTMwZjNcdTMwYzhcdTMwNGNcdTMwZWFcdTMwYWZcdTMwYThcdTMwYjlcdTMwYzhcdTMwOTJcdTRlMmRcdTZiNjJcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWYsIElPRXhjZXB0aW9uOiB7MH0KK3N0YW5kYXJkSG9zdC5jb25maWdSZXF1aXJlZD1cdThhMmRcdTViOWFcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTMwNzhcdTMwNmVVUkxcdTMwNGNcdTVmYzVcdTg5ODFcdTMwNjdcdTMwNTkKK3N0YW5kYXJkSG9zdC5jb25maWdOb3RBbGxvd2VkPVx1OGEyZFx1NWI5YVx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA0Y1x1NGY3Zlx1NzUyOFx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5Mworc3RhbmRhcmRIb3N0Lmluc3RhbGxCYXNlPVx1MzBkYlx1MzBiOVx1MzBjOFdlYlx1MzBhMlx1MzBkN1x1MzBlYVx1MzBiMVx1MzBmY1x1MzBiN1x1MzBlN1x1MzBmM1x1MzBjN1x1MzBhM1x1MzBlY1x1MzBhZlx1MzBjOFx1MzBlYVx1NGUyZFx1MzA2ZVdlYlx1MzBhMlx1MzBkN1x1MzBlYVx1MzBiMVx1MzBmY1x1MzBiN1x1MzBlN1x1MzBmM1x1MzA2MFx1MzA1MVx1MzA0Y1x1MzBhNFx1MzBmM1x1MzBiOVx1MzBjOFx1MzBmY1x1MzBlYlx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1OQorc3RhbmRhcmRIb3N0Lmluc3RhbGxpbmc9VVJMIHsxfSBcdTMwNGJcdTMwODlcdTMwYjNcdTMwZjNcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzhcdTMwZDFcdTMwYjkgezB9IFx1MzA2YldlYlx1MzBhMlx1MzBkN1x1MzBlYVx1MzBiMVx1MzBmY1x1MzBiN1x1MzBlN1x1MzBmM1x1MzA5Mlx1MzBhNFx1MzBmM1x1MzBiOVx1MzBjOFx1MzBmY1x1MzBlYlx1MzA1N1x1MzA3ZVx1MzA1OQorc3RhbmRhcmRIb3N0Lmluc3RhbGxpbmdXQVI9VVJMIHswfSBcdTMwNGJcdTMwODlXZWJcdTMwYTJcdTMwZDdcdTMwZWFcdTMwYjFcdTMwZmNcdTMwYjdcdTMwZTdcdTMwZjNcdTMwOTJcdTMwYTRcdTMwZjNcdTMwYjlcdTMwYzhcdTMwZmNcdTMwZWJcdTMwNTdcdTMwN2VcdTMwNTkKK3N0YW5kYXJkSG9zdC5pbnN0YWxsaW5nWE1MPVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBhZFx1MzBiOVx1MzBjOFx1OGEyZFx1NWI5YVx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA2ZVVSTCB7MH0gXHUzMDkyXHU1MWU2XHU3NDA2XHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5CitzdGFuZGFyZEhvc3QuaW5zdGFsbEVycm9yPVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBhZFx1MzBiOVx1MzBjOFx1MzBkMVx1MzBiOSB7MH0gXHUzMDZiXHUzMGEyXHUzMGQ3XHUzMGVhXHUzMGIxXHUzMGZjXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDkyXHU5MTRkXHU1MDk5XHU0ZTJkXHUzMDZlXHUzMGE4XHUzMGU5XHUzMGZjXHUzMDY3XHUzMDU5CitzdGFuZGFyZEhvc3QuaW52YWxpZEVycm9yUmVwb3J0VmFsdmVDbGFzcz1cdTYzMDdcdTViOWFcdTMwNTVcdTMwOGNcdTMwNWZcdTMwYThcdTMwZTlcdTMwZmNcdTMwZWFcdTMwZGRcdTMwZmNcdTMwYzhcdTMwZDBcdTMwZWJcdTMwZDZcdTMwYWZcdTMwZTlcdTMwYjlcdTMwOTJcdTMwZWRcdTMwZmNcdTMwYzlcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTM6IHswfQorc3RhbmRhcmRIb3N0LmRvY0Jhc2U9XHUzMGM5XHUzMGFkXHUzMGU1XHUzMGUxXHUzMGYzXHUzMGM4XHUzMGQ5XHUzMGZjXHUzMGI5XHUzMGM3XHUzMGEzXHUzMGVjXHUzMGFmXHUzMGM4XHUzMGVhIHswfSBcdTMwNGNcdTY1ZTJcdTMwNmJcdTViNThcdTU3MjhcdTMwNTdcdTMwN2VcdTMwNTkKK3N0YW5kYXJkSG9zdC5tYXBwaW5nRXJyb3I9XHUzMGVhXHUzMGFmXHUzMGE4XHUzMGI5XHUzMGM4VVJJIHswfSBcdTMwNmVcdTMwZGVcdTMwYzNcdTMwZDRcdTMwZjNcdTMwYjBcdThhMmRcdTViOWFcdTMwYThcdTMwZTlcdTMwZmNcdTMwNjdcdTMwNTkKK3N0YW5kYXJkSG9zdC5ub0NvbnRleHQ9XHUzMDUzXHUzMDZlXHUzMGVhXHUzMGFmXHUzMGE4XHUzMGI5XHUzMGM4XHUzMDkyXHU1MWU2XHU3NDA2XHUzMDU5XHUzMDhiXHUzMDVmXHUzMDgxXHUzMDZiXHU4YTJkXHU1YjlhXHUzMDU1XHUzMDhjXHUzMDVmXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4XHUzMDRjXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDViXHUzMDkzCitzdGFuZGFyZEhvc3Qubm9Ib3N0PVx1MzA1M1x1MzA2ZVx1MzBlYVx1MzBhZlx1MzBhOFx1MzBiOVx1MzBjOFx1MzA5Mlx1NTFlNlx1NzQwNlx1MzA1OVx1MzA4Ylx1MzA1Zlx1MzA4MVx1MzA2Ylx1OGEyZFx1NWI5YVx1MzA1NVx1MzA4Y1x1MzA1Zlx1MzBkYlx1MzBiOVx1MzBjOFx1MzA0Y1x1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5Mworc3RhbmRhcmRIb3N0Lm5vdENvbnRleHQ9XHUzMGRiXHUzMGI5XHUzMGM4XHUzMDZlXHU1YjUwXHU0ZjliXHUzMDZmXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4XHUzMDY3XHUzMDZhXHUzMDUxXHUzMDhjXHUzMDcwXHUzMDQ0XHUzMDUxXHUzMDdlXHUzMDViXHUzMDkzCitzdGFuZGFyZEhvc3Qubm90U3RhcnRlZD1cdTMwZGJcdTMwYjlcdTMwYzhcdTMwNGNcdTMwN2VcdTMwNjBcdThkNzdcdTUyZDVcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNWJcdTMwOTMKK3N0YW5kYXJkSG9zdC5udWxsTmFtZT1cdTMwZGJcdTMwYjlcdTMwYzhcdTU0MGRcdTMwNGNcdTVmYzVcdTg5ODFcdTMwNjdcdTMwNTkKK3N0YW5kYXJkSG9zdC5wYXRoRm9ybWF0PVx1NzEyMVx1NTJiOVx1MzA2YVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBhZFx1MzBiOVx1MzBjOFx1MzBkMVx1MzBiOVx1MzA2N1x1MzA1OTogezB9CitzdGFuZGFyZEhvc3QucGF0aE1hdGNoPVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBhZFx1MzBiOVx1MzBjOFx1MzBkMVx1MzBiOSB7MH0gXHUzMDZmXHUzMGM3XHUzMGEzXHUzMGVjXHUzMGFmXHUzMGM4XHUzMGVhXHU1M2M4XHUzMDZmV0FSXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHU1NDBkXHUzMDZiXHU0ZTAwXHU4MWY0XHUzMDU3XHUzMDZhXHUzMDUxXHUzMDhjXHUzMDcwXHUzMDQ0XHUzMDUxXHUzMDdlXHUzMDViXHUzMDkzOiB7MX0KK3N0YW5kYXJkSG9zdC5wYXRoTWlzc2luZz1cdTMwYjNcdTMwZjNcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzhcdTMwZDFcdTMwYjkgezB9IFx1MzA2Zlx1NzNmZVx1NTcyOFx1NGY3Zlx1NzUyOFx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5Mworc3RhbmRhcmRIb3N0LnBhdGhSZXF1aXJlZD1cdTMwYjNcdTMwZjNcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzhcdTMwZDFcdTMwYjlcdTMwNGNcdTVmYzVcdTg5ODFcdTMwNjdcdTMwNTkKK3N0YW5kYXJkSG9zdC5wYXRoVXNlZD1cdTMwYjNcdTMwZjNcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzhcdTMwZDFcdTMwYjkgezB9IFx1MzA2Zlx1NjVlMlx1MzA2Ylx1NGY3Zlx1NzUyOFx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OQorc3RhbmRhcmRIb3N0LnJlbW92aW5nPVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBhZFx1MzBiOVx1MzBjOFx1MzBkMVx1MzBiOSB7MH0gXHUzMDZlV2ViXHUzMGEyXHUzMGQ3XHUzMGVhXHUzMGIxXHUzMGZjXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDkyXHU1MjRhXHU5NjY0XHUzMDU3XHUzMDdlXHUzMDU5CitzdGFuZGFyZEhvc3QucmVtb3ZlRXJyb3I9XHUzMGIzXHUzMGYzXHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4XHUzMGQxXHUzMGI5IHswfSBcdTMwNmVcdTMwYTJcdTMwZDdcdTMwZWFcdTMwYjFcdTMwZmNcdTMwYjdcdTMwZTdcdTMwZjNcdTMwOTJcdTUyNGFcdTk2NjRcdTRlMmRcdTMwNmJcdTMwYThcdTMwZTlcdTMwZmNcdTMwNGNcdTc2N2FcdTc1MWZcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWYKK3N0YW5kYXJkSG9zdC5zdGFydD1cdTMwYjNcdTMwZjNcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzhcdTMwZDFcdTMwYjkgezB9IFx1MzA2ZVdlYlx1MzBhMlx1MzBkN1x1MzBlYVx1MzBiMVx1MzBmY1x1MzBiN1x1MzBlN1x1MzBmM1x1MzA5Mlx1OGQ3N1x1NTJkNVx1MzA1N1x1MzA3ZVx1MzA1OQorc3RhbmRhcmRIb3N0LnN0b3A9XHUzMGIzXHUzMGYzXHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4XHUzMGQxXHUzMGI5IHswfSBcdTMwNmVXZWJcdTMwYTJcdTMwZDdcdTMwZWFcdTMwYjFcdTMwZmNcdTMwYjdcdTMwZTdcdTMwZjNcdTMwOTJcdTUwNWNcdTZiNjJcdTMwNTdcdTMwN2VcdTMwNTkKK3N0YW5kYXJkSG9zdC51bmZvdW5kQ29udGV4dD1cdTMwZWFcdTMwYWZcdTMwYThcdTMwYjlcdTMwYzhVUkkgezB9IFx1MzA2ZVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBhZFx1MzBiOVx1MzBjOFx1MzA5Mlx1ODk4Ylx1MzA2NFx1MzA1MVx1MzA4Ylx1MzA1M1x1MzA2OFx1MzA0Y1x1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5Mworc3RhbmRhcmRIb3N0LndhclJlcXVpcmVkPVdlYlx1MzBhMlx1MzBkN1x1MzBlYVx1MzBiMVx1MzBmY1x1MzBiN1x1MzBlN1x1MzBmM1x1MzBhMlx1MzBmY1x1MzBhYlx1MzBhNFx1MzBkNlx1MzA2ZVVSTFx1MzA0Y1x1NWZjNVx1ODk4MVx1MzA2N1x1MzA1OQorc3RhbmRhcmRIb3N0LndhclVSTD1XZWJcdTMwYTJcdTMwZDdcdTMwZWFcdTMwYjFcdTMwZmNcdTMwYjdcdTMwZTdcdTMwZjNcdTMwYTJcdTMwZmNcdTMwYWJcdTMwYTRcdTMwZDZcdTMwNmJcdTViZmVcdTMwNTlcdTMwOGJcdTcxMjFcdTUyYjlcdTMwNmFVUkxcdTMwNjdcdTMwNTk6IHswfQorc3RhbmRhcmRIb3N0LnZhbGlkYXRpb25FbmFibGVkPVhNTFx1NjkxY1x1OGEzY1x1MzA2Zlx1NjcwOVx1NTJiOVx1MzA2N1x1MzA1OQorc3RhbmRhcmRIb3N0LnZhbGlkYXRpb25EaXNhYmxlZD1YTUxcdTY5MWNcdThhM2NcdTMwNmZcdTcxMjFcdTUyYjlcdTMwNjdcdTMwNTkKK3N0YW5kYXJkUGlwZWxpbmUuYWxyZWFkeVN0YXJ0ZWQ9XHUzMGQxXHUzMGE0XHUzMGQ3XHUzMGU5XHUzMGE0XHUzMGYzXHUzMDZmXHU2NWUyXHUzMDZiXHU4ZDc3XHU1MmQ1XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5CitzdGFuZGFyZFBpcGVsaW5lLm5vdFN0YXJ0ZWQ9XHUzMGQxXHUzMGE0XHUzMGQ3XHUzMGU5XHUzMGE0XHUzMGYzXHUzMDZmXHUzMDdlXHUzMDYwXHU4ZDc3XHU1MmQ1XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzCitzdGFuZGFyZFBpcGVsaW5lLm5vVmFsdmU9XHUzMDUzXHUzMDZlXHUzMGVhXHUzMGFmXHUzMGE4XHUzMGI5XHUzMGM4XHUzMDkyXHU1MWU2XHU3NDA2XHUzMDU5XHUzMDhiXHUzMGQxXHUzMGE0XHUzMGQ3XHUzMGU5XHUzMGE0XHUzMGYzXHU0ZTJkXHUzMDZiXHUzMDUzXHUzMDhjXHU0ZWU1XHU0ZTBhXHUzMDZlXHUzMGQwXHUzMGViXHUzMGQ2XHUzMDZmXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDViXHUzMDkzCitzdGFuZGFyZFNlcnZlci5hZGRDb250YWluZXIuaXNlPVx1MzA1M1x1MzA2ZVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBjYVx1MzA5Mlx1OTVhMlx1OTAyM1x1MzA2NVx1MzA1MVx1MzA4Ylx1MzA1Zlx1MzA4MVx1MzA2ZVx1MzBiM1x1MzBjZFx1MzBhZlx1MzBiZlx1MzA0Y1x1NTIyOVx1NzUyOFx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5Mworc3RhbmRhcmRTZXJ2ZXIuaW5pdGlhbGl6ZS5pbml0aWFsaXplZD1cdTMwNTNcdTMwNmVcdTMwYjVcdTMwZmNcdTMwZDBcdTMwNmZcdTY1ZTJcdTMwNmJcdTUyMWRcdTY3MWZcdTUzMTZcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkKK3N0YW5kYXJkU2VydmVyLnN0YXJ0LmNvbm5lY3RvcnM9XHUzMGIzXHUzMGYzXHUzMGM2XHUzMGNhXHUzMDZiXHU0ZTAwXHUzMDY0XHUzMDgyXHUzMGIzXHUzMGNkXHUzMGFmXHUzMGJmXHUzMDRjXHU5NWEyXHU5MDIzXHUzMDY1XHUzMDUxXHUzMDg5XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzCitzdGFuZGFyZFNlcnZlci5zdGFydC5zdGFydGVkPVx1MzA1M1x1MzA2ZVx1MzBiNVx1MzBmY1x1MzBkMFx1MzA2Zlx1NjVlMlx1MzA2Ylx1OGQ3N1x1NTJkNVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OQorc3RhbmRhcmRTZXJ2ZXIuc3RvcC5ub3RTdGFydGVkPVx1MzA1M1x1MzA2ZVx1MzBiNVx1MzBmY1x1MzBkMFx1MzA2Zlx1MzA3ZVx1MzA2MFx1OGQ3N1x1NTJkNVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5Mworc3RhbmRhcmRTZXJ2aWNlLmluaXRpYWxpemUuaW5pdGlhbGl6ZWQ9XHUzMDUzXHUzMDZlXHUzMGI1XHUzMGZjXHUzMGQzXHUzMGI5XHUzMDZmXHU2NWUyXHUzMDZiXHU1MjFkXHU2NzFmXHU1MzE2XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5CitzdGFuZGFyZFNlcnZpY2Uuc3RhcnQubmFtZT1cdTMwYjVcdTMwZmNcdTMwZDNcdTMwYjkgezB9IFx1MzA5Mlx1OGQ3N1x1NTJkNVx1MzA1N1x1MzA3ZVx1MzA1OQorc3RhbmRhcmRTZXJ2aWNlLnN0YXJ0LnN0YXJ0ZWQ9XHUzMDUzXHUzMDZlXHUzMGI1XHUzMGZjXHUzMGQzXHUzMGI5XHUzMDZmXHU2NWUyXHUzMDZiXHU4ZDc3XHU1MmQ1XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5CitzdGFuZGFyZFNlcnZpY2Uuc3RvcC5uYW1lPVx1MzBiNVx1MzBmY1x1MzBkM1x1MzBiOSB7MH0gXHUzMDkyXHU1MDVjXHU2YjYyXHUzMDU3XHUzMDdlXHUzMDU5CitzdGFuZGFyZFNlcnZpY2Uuc3RvcC5ub3RTdGFydGVkPVx1MzA1M1x1MzA2ZVx1MzBiNVx1MzBmY1x1MzBkM1x1MzBiOVx1MzA2Zlx1MzA3ZVx1MzA2MFx1OGQ3N1x1NTJkNVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5Mworc3RhbmRhcmRXcmFwcGVyLmFsbG9jYXRlPVx1MzBiNVx1MzBmY1x1MzBkNlx1MzBlY1x1MzBjM1x1MzBjOFx1MzBhNFx1MzBmM1x1MzBiOVx1MzBiZlx1MzBmM1x1MzBiOVx1MzA5Mlx1NTI3Mlx1MzA4YVx1NWY1M1x1MzA2Nlx1NGUyZFx1MzA2ZVx1MzBhOFx1MzBlOVx1MzBmY1x1MzA2N1x1MzA1OQorc3RhbmRhcmRXcmFwcGVyLmFsbG9jYXRlRXhjZXB0aW9uPVx1MzBiNVx1MzBmY1x1MzBkNlx1MzBlY1x1MzBjM1x1MzBjOCB7MH0gXHUzMDZiXHU0ZjhiXHU1OTE2XHUzMDkyXHU1MjcyXHUzMDhhXHU1ZjUzXHUzMDY2XHUzMDdlXHUzMDU5CitzdGFuZGFyZFdyYXBwZXIuY29udGFpbmVyU2VydmxldD1cdTMwYjNcdTMwZjNcdTMwYzZcdTMwY2FcdTMwYjVcdTMwZmNcdTMwZDZcdTMwZWNcdTMwYzNcdTMwYzggezB9IFx1MzA5Mlx1MzBlZFx1MzBmY1x1MzBjOVx1MzA1N1x1MzA3ZVx1MzA1OQorc3RhbmRhcmRXcmFwcGVyLmNyZWF0ZUZpbHRlcnM9XHUzMGI1XHUzMGZjXHUzMGQ2XHUzMGVjXHUzMGMzXHUzMGM4IHswfVx1MzA2Ylx1NWJmZVx1MzA1OVx1MzA4Ylx1MzBkNVx1MzBhM1x1MzBlYlx1MzBiZlx1NGY4Ylx1NTkxNlx1MzA5Mlx1NGY1Y1x1NjIxMFx1MzA1N1x1MzA3ZVx1MzA1OQorc3RhbmRhcmRXcmFwcGVyLmRlYWxsb2NhdGVFeGNlcHRpb249XHUzMGI1XHUzMGZjXHUzMGQ2XHUzMGVjXHUzMGMzXHUzMGM4IHswfSBcdTMwNmJcdTViZmVcdTMwNTlcdTMwOGJcdTRmOGJcdTU5MTZcdTMwNmVcdTUyNzJcdTMwOGFcdTVmNTNcdTMwNjZcdTMwOTJcdTg5ZTNcdTk2NjRcdTMwNTdcdTMwN2VcdTMwNTkKK3N0YW5kYXJkV3JhcHBlci5kZXN0cm95RXhjZXB0aW9uPVx1MzBiNVx1MzBmY1x1MzBkNlx1MzBlY1x1MzBjM1x1MzBjOCB7MH0gXHUzMDZlU2VydmxldC5kZXN0cm95KClcdTMwNGNcdTRmOGJcdTU5MTZcdTMwOTJcdTYyOTVcdTMwNTJcdTMwN2VcdTMwNTdcdTMwNWYKK3N0YW5kYXJkV3JhcHBlci5leGNlcHRpb24wPVRvbWNhdFx1MzA2ZVx1NGY4Ylx1NTkxNlx1MzA2ZVx1NTgzMVx1NTQ0YQorc3RhbmRhcmRXcmFwcGVyLmV4Y2VwdGlvbjE9XHUzMGI1XHUzMGZjXHUzMGQ2XHUzMGVjXHUzMGMzXHUzMGM4XHU0ZjhiXHU1OTE2XHUzMDRjXHU3NjdhXHU3NTFmXHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmCitzdGFuZGFyZFdyYXBwZXIuZXhjZXB0aW9uMj1cdTRmOGJcdTU5MTZcdTMwNmVcdTU4MzFcdTU0NGE6CitzdGFuZGFyZFdyYXBwZXIuZXhjZXB0aW9uMz1cdTY4MzlcdTY3MmNcdTMwNmVcdTUzOWZcdTU2ZTA6CitzdGFuZGFyZFdyYXBwZXIuaW5pdEV4Y2VwdGlvbj1cdTMwYjVcdTMwZmNcdTMwZDZcdTMwZWNcdTMwYzNcdTMwYzggezB9IFx1MzA2ZVNlcnZsZXQuaW5pdCgpXHUzMDRjXHU0ZjhiXHU1OTE2XHUzMDkyXHU2Mjk1XHUzMDUyXHUzMDdlXHUzMDU3XHUzMDVmCitzdGFuZGFyZFdyYXBwZXIuaW5zdGFudGlhdGU9XHUzMGI1XHUzMGZjXHUzMGQ2XHUzMGVjXHUzMGMzXHUzMGM4XHUzMGFmXHUzMGU5XHUzMGI5IHswfSBcdTMwOTJcdTUyMWRcdTY3MWZcdTUzMTZcdTRlMmRcdTMwNmJcdTMwYThcdTMwZTlcdTMwZmNcdTMwNGNcdTc2N2FcdTc1MWZcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWYKK3N0YW5kYXJkV3JhcHBlci5pc1VuYXZhaWxhYmxlPVx1MzBiNVx1MzBmY1x1MzBkNlx1MzBlY1x1MzBjM1x1MzBjOCB7MH0gXHUzMDZmXHU3M2ZlXHU1NzI4XHU1MjI5XHU3NTI4XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzCitzdGFuZGFyZFdyYXBwZXIuamFzcGVyTG9hZGVyPVx1MzBiNVx1MzBmY1x1MzBkNlx1MzBlY1x1MzBjM1x1MzBjOCB7MH0gXHUzMDZiSmFzcGVyXHUzMGFmXHUzMGU5XHUzMGI5XHUzMGVkXHUzMGZjXHUzMGMwXHUzMDkyXHU0ZjdmXHU3NTI4XHUzMDU3XHUzMDdlXHUzMDU5CitzdGFuZGFyZFdyYXBwZXIuanNwRmlsZS5mb3JtYXQ9SlNQXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViIHswfSBcdTMwNGMnLydcdTY1ODdcdTViNTdcdTMwNjdcdTU5Y2JcdTMwN2VcdTMwNjNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNWJcdTMwOTMKK3N0YW5kYXJkV3JhcHBlci5sb2FkRXhjZXB0aW9uPVx1MzBiNVx1MzBmY1x1MzBkNlx1MzBlY1x1MzBjM1x1MzBjOCB7MH0gXHUzMDRjbG9hZCgpXHU0ZjhiXHU1OTE2XHUzMDkyXHU2Mjk1XHUzMDUyXHUzMDdlXHUzMDU3XHUzMDVmCitzdGFuZGFyZFdyYXBwZXIubWlzc2luZ0NsYXNzPVx1MzBlOVx1MzBjM1x1MzBkMVx1MzA0Y1x1MzBiNVx1MzBmY1x1MzBkNlx1MzBlY1x1MzBjM1x1MzBjOFx1MzBhZlx1MzBlOVx1MzBiOSB7MH0gXHU1M2M4XHUzMDZmXHUzMDVkXHUzMDhjXHUzMDRjXHU0ZjlkXHU1YjU4XHUzMDU5XHUzMDhiXHUzMGFmXHUzMGU5XHUzMGI5XHUzMDkyXHU4OThiXHUzMDY0XHUzMDUxXHUzMDhiXHUzMDUzXHUzMDY4XHUzMDRjXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzCitzdGFuZGFyZFdyYXBwZXIubWlzc2luZ0xvYWRlcj1cdTMwZTlcdTMwYzNcdTMwZDFcdTMwNGNcdTMwYjVcdTMwZmNcdTMwZDZcdTMwZWNcdTMwYzNcdTMwYzggezB9IFx1MzA2ZVx1MzBlZFx1MzBmY1x1MzBjMFx1MzA5Mlx1ODk4Ylx1MzA2NFx1MzA1MVx1MzA4Ylx1MzA1M1x1MzA2OFx1MzA0Y1x1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5Mworc3RhbmRhcmRXcmFwcGVyLm5vdENoaWxkPVx1MzBlOVx1MzBjM1x1MzBkMVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBjYVx1MzA2Zlx1NWI1MFx1NGY5Ylx1MzA2ZVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBjYVx1MzA5Mlx1NjMwMVx1MzA2NFx1MzA1M1x1MzA2OFx1MzA2Zlx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5Mworc3RhbmRhcmRXcmFwcGVyLm5vdENsYXNzPVx1MzBiNVx1MzBmY1x1MzBkNlx1MzBlY1x1MzBjM1x1MzBjOCB7MH0gXHUzMDZiXHU2MzA3XHU1YjlhXHUzMDU1XHUzMDhjXHUzMDVmXHUzMGI1XHUzMGZjXHUzMGQ2XHUzMGVjXHUzMGMzXHUzMGM4XHUzMGFmXHUzMGU5XHUzMGI5XHUzMDRjXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDViXHUzMDkzCitzdGFuZGFyZFdyYXBwZXIubm90Q29udGV4dD1cdTMwZTlcdTMwYzNcdTMwZDFcdTMwNmVcdTg5YWFcdTMwNmVcdTMwYjNcdTMwZjNcdTMwYzZcdTMwY2FcdTMwNmZcdTMwYjNcdTMwZjNcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzhcdTMwNjdcdTMwNmFcdTMwNTFcdTMwOGNcdTMwNzBcdTMwNDRcdTMwNTFcdTMwN2VcdTMwNWJcdTMwOTMKK3N0YW5kYXJkV3JhcHBlci5ub3RGb3VuZD1cdTMwYjVcdTMwZmNcdTMwZDZcdTMwZWNcdTMwYzNcdTMwYzggezB9IFx1MzA0Y1x1NTIyOVx1NzUyOFx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5Mworc3RhbmRhcmRXcmFwcGVyLm5vdFNlcnZsZXQ9XHUzMGFmXHUzMGU5XHUzMGI5IHswfSBcdTMwNmZcdTMwYjVcdTMwZmNcdTMwZDZcdTMwZWNcdTMwYzNcdTMwYzhcdTMwNjdcdTMwNmZcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTMKK3N0YW5kYXJkV3JhcHBlci5wcml2aWxlZ2VkU2VydmxldD1cdTMwYWZcdTMwZTlcdTMwYjkgezB9IFx1MzA2ZVx1MzBiNVx1MzBmY1x1MzBkNlx1MzBlY1x1MzBjM1x1MzBjOFx1MzA2Zlx1NzI3OVx1NmEyOVx1MzA5Mlx1NGUwZVx1MzA0OFx1MzA4OVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA4Ylx1MzA2ZVx1MzA2N1x1MzAwMVx1MzA1M1x1MzA2ZVdlYlx1MzBhMlx1MzBkN1x1MzBlYVx1MzBiMVx1MzBmY1x1MzBiN1x1MzBlN1x1MzBmM1x1MzA2Ylx1MzA4OFx1MzA2M1x1MzA2Nlx1MzBlZFx1MzBmY1x1MzBjOVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5Mworc3RhbmRhcmRXcmFwcGVyLnJlbGVhc2VGaWx0ZXJzPVx1MzBiNVx1MzBmY1x1MzBkNlx1MzBlY1x1MzBjM1x1MzBjOCB7MH0gXHUzMDZlXHUzMGQ1XHUzMGEzXHUzMGViXHUzMGJmXHU0ZjhiXHU1OTE2XHUzMDkyXHU4OWUzXHU5NjY0XHUzMDU3XHUzMDdlXHUzMDU5CitzdGFuZGFyZFdyYXBwZXIuc2VydmljZUV4Y2VwdGlvbj1cdTMwYjVcdTMwZmNcdTMwZDZcdTMwZWNcdTMwYzNcdTMwYzggezB9IFx1MzA2ZVNlcnZsZXQuc2VydmljZSgpXHUzMDRjXHU0ZjhiXHU1OTE2XHUzMDkyXHU2Mjk1XHUzMDUyXHUzMDdlXHUzMDU3XHUzMDVmCitzdGFuZGFyZFdyYXBwZXIuc3RhdHVzSGVhZGVyPUhUVFBcdTMwYjlcdTMwYzZcdTMwZmNcdTMwYmZcdTMwYjkgezB9IC0gezF9CitzdGFuZGFyZFdyYXBwZXIuc3RhdHVzVGl0bGU9VG9tY2F0XHUzMDZlXHUzMGE4XHUzMGU5XHUzMGZjXHUzMDZlXHU1ODMxXHU1NDRhCitzdGFuZGFyZFdyYXBwZXIudW5hdmFpbGFibGU9XHUzMGI1XHUzMGZjXHUzMGQ2XHUzMGVjXHUzMGMzXHUzMGM4IHswfSBcdTMwOTJcdTUyMjlcdTc1MjhcdTRlMGRcdTUzZWZcdTgwZmRcdTMwNmJcdTMwZGVcdTMwZmNcdTMwYWZcdTMwNTdcdTMwN2VcdTMwNTkKK3N0YW5kYXJkV3JhcHBlci51bmxvYWRFeGNlcHRpb249XHUzMGI1XHUzMGZjXHUzMGQ2XHUzMGVjXHUzMGMzXHUzMGM4IHswfSBcdTMwNGN1bmxvYWQoKVx1NGY4Ylx1NTkxNlx1MzA5Mlx1NjI5NVx1MzA1Mlx1MzA3ZVx1MzA1N1x1MzA1Zgorc3RhbmRhcmRXcmFwcGVyLnVubG9hZGluZz1cdTMwYjVcdTMwZmNcdTMwZDZcdTMwZWNcdTMwYzNcdTMwYzggezB9IFx1MzA0Y1x1MzBlZFx1MzBmY1x1MzBjOVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA2YVx1MzA0NFx1MzA2ZVx1MzA2N1x1MzAwMVx1NTI3Mlx1MzA4YVx1NWY1M1x1MzA2Nlx1MzA4Ylx1MzA1M1x1MzA2OFx1MzA0Y1x1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5Mworc3RhbmRhcmRXcmFwcGVyLndhaXRpbmc9ezB9IFx1MzBhNFx1MzBmM1x1MzBiOVx1MzBiZlx1MzBmM1x1MzBiOVx1MzA0Y1x1NTI3Mlx1MzA4YVx1NWY1M1x1MzA2Nlx1ODllM1x1OTY2NFx1MzA1NVx1MzA4Y1x1MzA4Ylx1MzA2ZVx1MzA5Mlx1NWY4NVx1MzA2M1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NvcmUvTmFtaW5nQ29udGV4dExpc3RlbmVyLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29yZS9OYW1pbmdDb250ZXh0TGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDdkYzVmCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NvcmUvTmFtaW5nQ29udGV4dExpc3RlbmVyLmphdmEKQEAgLTAsMCArMSw5NDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZTsKKworCitpbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUV2ZW50OworaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOworCitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWVBbHJlYWR5Qm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuUmVmZXJlbmNlOworaW1wb3J0IGphdmF4Lm5hbWluZy5TdHJpbmdSZWZBZGRyOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Db250YWluZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Db250YWluZXJFdmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRhaW5lckxpc3RlbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZUV2ZW50OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5TZXJ2ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuQ29udGV4dEVqYjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5Db250ZXh0RW52aXJvbm1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuQ29udGV4dExvY2FsRWpiOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkNvbnRleHRSZXNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5Db250ZXh0UmVzb3VyY2VFbnZSZWY7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuQ29udGV4dFJlc291cmNlTGluazsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5Db250ZXh0VHJhbnNhY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuTmFtaW5nUmVzb3VyY2VzOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5TdHJpbmdNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUubmFtaW5nLkNvbnRleHRBY2Nlc3NDb250cm9sbGVyOworaW1wb3J0IG9yZy5hcGFjaGUubmFtaW5nLkNvbnRleHRCaW5kaW5nczsKK2ltcG9ydCBvcmcuYXBhY2hlLm5hbWluZy5FamJSZWY7CitpbXBvcnQgb3JnLmFwYWNoZS5uYW1pbmcuTmFtaW5nQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLm5hbWluZy5SZXNvdXJjZUVudlJlZjsKK2ltcG9ydCBvcmcuYXBhY2hlLm5hbWluZy5SZXNvdXJjZUxpbmtSZWY7CitpbXBvcnQgb3JnLmFwYWNoZS5uYW1pbmcuUmVzb3VyY2VSZWY7CitpbXBvcnQgb3JnLmFwYWNoZS5uYW1pbmcuVHJhbnNhY3Rpb25SZWY7CisKKworLyoqCisgKiBIZWxwZXIgY2xhc3MgdXNlZCB0byBpbml0aWFsaXplIGFuZCBwb3B1bGF0ZSB0aGUgSk5ESSBjb250ZXh0IGFzc29jaWF0ZWQKKyAqIHdpdGggZWFjaCBjb250ZXh0IGFuZCBzZXJ2ZXIuCisgKgorICogQGF1dGhvciBSZW15IE1hdWNoZXJhdAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgTmFtaW5nQ29udGV4dExpc3RlbmVyCisgICAgaW1wbGVtZW50cyBMaWZlY3ljbGVMaXN0ZW5lciwgQ29udGFpbmVyTGlzdGVuZXIsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKE5hbWluZ0NvbnRleHRMaXN0ZW5lci5jbGFzcyk7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICBwcm90ZWN0ZWQgTG9nIGxvZ2dlciA9IGxvZzsKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBOYW1lIG9mIHRoZSBhc3NvY2lhdGVkIG5hbWluZyBjb250ZXh0LgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgbmFtZSA9ICIvIjsKKworCisgICAgLyoqCisgICAgICogQXNzb2NpYXRlZCBjb250YWluZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIE9iamVjdCBjb250YWluZXIgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplZCBmbGFnLgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGluaXRpYWxpemVkID0gZmFsc2U7CisKKworICAgIC8qKgorICAgICAqIEFzc29jaWF0ZWQgbmFtaW5nIHJlc291cmNlcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTmFtaW5nUmVzb3VyY2VzIG5hbWluZ1Jlc291cmNlcyA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIEFzc29jaWF0ZWQgSk5ESSBjb250ZXh0LgorICAgICAqLworICAgIHByb3RlY3RlZCBOYW1pbmdDb250ZXh0IG5hbWluZ0NvbnRleHQgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBDb21wIGNvbnRleHQuCisgICAgICovCisgICAgcHJvdGVjdGVkIGphdmF4Lm5hbWluZy5Db250ZXh0IGNvbXBDdHggPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBFbnYgY29udGV4dC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgamF2YXgubmFtaW5nLkNvbnRleHQgZW52Q3R4ID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIHN0cmluZyBtYW5hZ2VyIGZvciB0aGlzIHBhY2thZ2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmdNYW5hZ2VyIHNtID0KKyAgICAgICAgU3RyaW5nTWFuYWdlci5nZXRNYW5hZ2VyKENvbnN0YW50cy5QYWNrYWdlKTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgIm5hbWUiIHByb3BlcnR5LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMubmFtZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgIm5hbWUiIHByb3BlcnR5LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgVGhlIG5ldyBuYW1lCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworCisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIGlmKCBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSApCisgICAgICAgICAgICBsb2cuZGVidWcoICJzZXROYW1lICIgKyBuYW1lKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgYXNzb2NpYXRlZCBuYW1pbmcgY29udGV4dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTmFtaW5nQ29udGV4dCBnZXROYW1pbmdDb250ZXh0KCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5uYW1pbmdDb250ZXh0KTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBMaWZlY3ljbGVMaXN0ZW5lciBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIEFja25vd2xlZGdlIHRoZSBvY2N1cnJlbmNlIG9mIHRoZSBzcGVjaWZpZWQgZXZlbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnQgTGlmZWN5Y2xlRXZlbnQgdGhhdCBoYXMgb2NjdXJyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBsaWZlY3ljbGVFdmVudChMaWZlY3ljbGVFdmVudCBldmVudCkgeworCisgICAgICAgIGNvbnRhaW5lciA9IGV2ZW50LmdldExpZmVjeWNsZSgpOworCisgICAgICAgIGlmIChjb250YWluZXIgaW5zdGFuY2VvZiBDb250ZXh0KSB7CisgICAgICAgICAgICBuYW1pbmdSZXNvdXJjZXMgPSAoKENvbnRleHQpIGNvbnRhaW5lcikuZ2V0TmFtaW5nUmVzb3VyY2VzKCk7CisgICAgICAgICAgICBsb2dnZXIgPSBsb2c7CisgICAgICAgIH0gZWxzZSBpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgU2VydmVyKSB7CisgICAgICAgICAgICBuYW1pbmdSZXNvdXJjZXMgPSAoKFNlcnZlcikgY29udGFpbmVyKS5nZXRHbG9iYWxOYW1pbmdSZXNvdXJjZXMoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChldmVudC5nZXRUeXBlKCkgPT0gTGlmZWN5Y2xlLlNUQVJUX0VWRU5UKSB7CisKKyAgICAgICAgICAgIGlmIChpbml0aWFsaXplZCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIEhhc2h0YWJsZSBjb250ZXh0RW52ID0gbmV3IEhhc2h0YWJsZSgpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBuYW1pbmdDb250ZXh0ID0gbmV3IE5hbWluZ0NvbnRleHQoY29udGV4dEVudiwgZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gTmV2ZXIgaGFwcGVucworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29udGV4dEFjY2Vzc0NvbnRyb2xsZXIuc2V0U2VjdXJpdHlUb2tlbihnZXROYW1lKCksIGNvbnRhaW5lcik7CisgICAgICAgICAgICBDb250ZXh0QmluZGluZ3MuYmluZENvbnRleHQoY29udGFpbmVyLCBuYW1pbmdDb250ZXh0LCBjb250YWluZXIpOworICAgICAgICAgICAgaWYoIGxvZy5pc0RlYnVnRW5hYmxlZCgpICkgeworICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQm91bmQgIiArIGNvbnRhaW5lciApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBTZXR0aW5nIHRoZSBjb250ZXh0IGluIHJlYWQvd3JpdGUgbW9kZQorICAgICAgICAgICAgQ29udGV4dEFjY2Vzc0NvbnRyb2xsZXIuc2V0V3JpdGFibGUoZ2V0TmFtZSgpLCBjb250YWluZXIpOworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNyZWF0ZU5hbWluZ0NvbnRleHQoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yCisgICAgICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoIm5hbWluZy5uYW1pbmdDb250ZXh0Q3JlYXRpb25GYWlsZWQiLCBlKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEJpbmRpbmcgdGhlIG5hbWluZyBjb250ZXh0IHRvIHRoZSBjbGFzcyBsb2FkZXIKKyAgICAgICAgICAgIGlmIChjb250YWluZXIgaW5zdGFuY2VvZiBDb250ZXh0KSB7CisgICAgICAgICAgICAgICAgLy8gU2V0dGluZyB0aGUgY29udGV4dCBpbiByZWFkIG9ubHkgbW9kZQorICAgICAgICAgICAgICAgIENvbnRleHRBY2Nlc3NDb250cm9sbGVyLnNldFJlYWRPbmx5KGdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgQ29udGV4dEJpbmRpbmdzLmJpbmRDbGFzc0xvYWRlcgorICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnRhaW5lciwgY29udGFpbmVyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAoKENvbnRhaW5lcikgY29udGFpbmVyKS5nZXRMb2FkZXIoKS5nZXRDbGFzc0xvYWRlcigpKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChOYW1pbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3Ioc20uZ2V0U3RyaW5nKCJuYW1pbmcuYmluZEZhaWxlZCIsIGUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjb250YWluZXIgaW5zdGFuY2VvZiBTZXJ2ZXIpIHsKKyAgICAgICAgICAgICAgICBuYW1pbmdSZXNvdXJjZXMuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLm5hbWluZy5mYWN0b3J5LlJlc291cmNlTGlua0ZhY3Rvcnkuc2V0R2xvYmFsQ29udGV4dAorICAgICAgICAgICAgICAgICAgICAobmFtaW5nQ29udGV4dCk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgQ29udGV4dEJpbmRpbmdzLmJpbmRDbGFzc0xvYWRlcgorICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnRhaW5lciwgY29udGFpbmVyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKHNtLmdldFN0cmluZygibmFtaW5nLmJpbmRGYWlsZWQiLCBlKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjb250YWluZXIgaW5zdGFuY2VvZiBTdGFuZGFyZFNlcnZlcikgeworICAgICAgICAgICAgICAgICAgICAoKFN0YW5kYXJkU2VydmVyKSBjb250YWluZXIpLnNldEdsb2JhbE5hbWluZ0NvbnRleHQKKyAgICAgICAgICAgICAgICAgICAgICAgIChuYW1pbmdDb250ZXh0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGluaXRpYWxpemVkID0gdHJ1ZTsKKworICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmdldFR5cGUoKSA9PSBMaWZlY3ljbGUuU1RPUF9FVkVOVCkgeworCisgICAgICAgICAgICBpZiAoIWluaXRpYWxpemVkKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgLy8gU2V0dGluZyB0aGUgY29udGV4dCBpbiByZWFkL3dyaXRlIG1vZGUKKyAgICAgICAgICAgIENvbnRleHRBY2Nlc3NDb250cm9sbGVyLnNldFdyaXRhYmxlKGdldE5hbWUoKSwgY29udGFpbmVyKTsKKyAgICAgICAgICAgIENvbnRleHRCaW5kaW5ncy51bmJpbmRDb250ZXh0KGNvbnRhaW5lciwgY29udGFpbmVyKTsKKworICAgICAgICAgICAgaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIENvbnRleHQpIHsKKyAgICAgICAgICAgICAgICBDb250ZXh0QmluZGluZ3MudW5iaW5kQ2xhc3NMb2FkZXIKKyAgICAgICAgICAgICAgICAgICAgKGNvbnRhaW5lciwgY29udGFpbmVyLCAKKyAgICAgICAgICAgICAgICAgICAgICgoQ29udGFpbmVyKSBjb250YWluZXIpLmdldExvYWRlcigpLmdldENsYXNzTG9hZGVyKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgU2VydmVyKSB7CisgICAgICAgICAgICAgICAgbmFtaW5nUmVzb3VyY2VzLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7CisgICAgICAgICAgICAgICAgQ29udGV4dEJpbmRpbmdzLnVuYmluZENsYXNzTG9hZGVyCisgICAgICAgICAgICAgICAgICAgIChjb250YWluZXIsIGNvbnRhaW5lciwgCisgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENvbnRleHRBY2Nlc3NDb250cm9sbGVyLnVuc2V0U2VjdXJpdHlUb2tlbihnZXROYW1lKCksIGNvbnRhaW5lcik7CisKKyAgICAgICAgICAgIG5hbWluZ0NvbnRleHQgPSBudWxsOworICAgICAgICAgICAgZW52Q3R4ID0gbnVsbDsKKyAgICAgICAgICAgIGNvbXBDdHggPSBudWxsOworICAgICAgICAgICAgaW5pdGlhbGl6ZWQgPSBmYWxzZTsKKworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29udGFpbmVyTGlzdGVuZXIgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBBY2tub3dsZWRnZSB0aGUgb2NjdXJyZW5jZSBvZiB0aGUgc3BlY2lmaWVkIGV2ZW50LgorICAgICAqIE5vdGU6IFdpbGwgbmV2ZXIgYmUgY2FsbGVkIHdoZW4gdGhlIGxpc3RlbmVyIGlzIGFzc29jaWF0ZWQgdG8gYSBTZXJ2ZXIsCisgICAgICogc2luY2UgaXQgaXMgbm90IGEgQ29udGFpbmVyLgorICAgICAqCisgICAgICogQHBhcmFtIGV2ZW50IENvbnRhaW5lckV2ZW50IHRoYXQgaGFzIG9jY3VycmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgY29udGFpbmVyRXZlbnQoQ29udGFpbmVyRXZlbnQgZXZlbnQpIHsKKworICAgICAgICBpZiAoIWluaXRpYWxpemVkKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8vIFNldHRpbmcgdGhlIGNvbnRleHQgaW4gcmVhZC93cml0ZSBtb2RlCisgICAgICAgIENvbnRleHRBY2Nlc3NDb250cm9sbGVyLnNldFdyaXRhYmxlKGdldE5hbWUoKSwgY29udGFpbmVyKTsKKworICAgICAgICBTdHJpbmcgdHlwZSA9IGV2ZW50LmdldFR5cGUoKTsKKworICAgICAgICBpZiAodHlwZS5lcXVhbHMoImFkZEVqYiIpKSB7CisKKyAgICAgICAgICAgIFN0cmluZyBlamJOYW1lID0gKFN0cmluZykgZXZlbnQuZ2V0RGF0YSgpOworICAgICAgICAgICAgaWYgKGVqYk5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIENvbnRleHRFamIgZWpiID0gbmFtaW5nUmVzb3VyY2VzLmZpbmRFamIoZWpiTmFtZSk7CisgICAgICAgICAgICAgICAgYWRkRWpiKGVqYik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBlbHNlIGlmICh0eXBlLmVxdWFscygiYWRkRW52aXJvbm1lbnQiKSkgeworCisgICAgICAgICAgICBTdHJpbmcgZW52aXJvbm1lbnROYW1lID0gKFN0cmluZykgZXZlbnQuZ2V0RGF0YSgpOworICAgICAgICAgICAgaWYgKGVudmlyb25tZW50TmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgQ29udGV4dEVudmlyb25tZW50IGVudiA9IAorICAgICAgICAgICAgICAgICAgICBuYW1pbmdSZXNvdXJjZXMuZmluZEVudmlyb25tZW50KGVudmlyb25tZW50TmFtZSk7CisgICAgICAgICAgICAgICAgYWRkRW52aXJvbm1lbnQoZW52KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGVsc2UgaWYgKHR5cGUuZXF1YWxzKCJhZGRMb2NhbEVqYiIpKSB7CisKKyAgICAgICAgICAgIFN0cmluZyBsb2NhbEVqYk5hbWUgPSAoU3RyaW5nKSBldmVudC5nZXREYXRhKCk7CisgICAgICAgICAgICBpZiAobG9jYWxFamJOYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBDb250ZXh0TG9jYWxFamIgbG9jYWxFamIgPSAKKyAgICAgICAgICAgICAgICAgICAgbmFtaW5nUmVzb3VyY2VzLmZpbmRMb2NhbEVqYihsb2NhbEVqYk5hbWUpOworICAgICAgICAgICAgICAgIGFkZExvY2FsRWpiKGxvY2FsRWpiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGVsc2UgaWYgKHR5cGUuZXF1YWxzKCJhZGRSZXNvdXJjZSIpKSB7CisKKyAgICAgICAgICAgIFN0cmluZyByZXNvdXJjZU5hbWUgPSAoU3RyaW5nKSBldmVudC5nZXREYXRhKCk7CisgICAgICAgICAgICBpZiAocmVzb3VyY2VOYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBDb250ZXh0UmVzb3VyY2UgcmVzb3VyY2UgPSAKKyAgICAgICAgICAgICAgICAgICAgbmFtaW5nUmVzb3VyY2VzLmZpbmRSZXNvdXJjZShyZXNvdXJjZU5hbWUpOworICAgICAgICAgICAgICAgIGFkZFJlc291cmNlKHJlc291cmNlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGVsc2UgaWYgKHR5cGUuZXF1YWxzKCJhZGRSZXNvdXJjZUxpbmsiKSkgeworCisgICAgICAgICAgICBTdHJpbmcgcmVzb3VyY2VMaW5rTmFtZSA9IChTdHJpbmcpIGV2ZW50LmdldERhdGEoKTsKKyAgICAgICAgICAgIGlmIChyZXNvdXJjZUxpbmtOYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBDb250ZXh0UmVzb3VyY2VMaW5rIHJlc291cmNlTGluayA9IAorICAgICAgICAgICAgICAgICAgICBuYW1pbmdSZXNvdXJjZXMuZmluZFJlc291cmNlTGluayhyZXNvdXJjZUxpbmtOYW1lKTsKKyAgICAgICAgICAgICAgICBhZGRSZXNvdXJjZUxpbmsocmVzb3VyY2VMaW5rKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGVsc2UgaWYgKHR5cGUuZXF1YWxzKCJhZGRSZXNvdXJjZUVudlJlZiIpKSB7CisKKyAgICAgICAgICAgIFN0cmluZyByZXNvdXJjZUVudlJlZk5hbWUgPSAoU3RyaW5nKSBldmVudC5nZXREYXRhKCk7CisgICAgICAgICAgICBpZiAocmVzb3VyY2VFbnZSZWZOYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBDb250ZXh0UmVzb3VyY2VFbnZSZWYgcmVzb3VyY2VFbnZSZWYgPSAKKyAgICAgICAgICAgICAgICAgICAgbmFtaW5nUmVzb3VyY2VzLmZpbmRSZXNvdXJjZUVudlJlZihyZXNvdXJjZUVudlJlZk5hbWUpOworICAgICAgICAgICAgICAgIGFkZFJlc291cmNlRW52UmVmKHJlc291cmNlRW52UmVmKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGVsc2UgaWYgKHR5cGUuZXF1YWxzKCJyZW1vdmVFamIiKSkgeworCisgICAgICAgICAgICBTdHJpbmcgZWpiTmFtZSA9IChTdHJpbmcpIGV2ZW50LmdldERhdGEoKTsKKyAgICAgICAgICAgIGlmIChlamJOYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZW1vdmVFamIoZWpiTmFtZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBlbHNlIGlmICh0eXBlLmVxdWFscygicmVtb3ZlRW52aXJvbm1lbnQiKSkgeworCisgICAgICAgICAgICBTdHJpbmcgZW52aXJvbm1lbnROYW1lID0gKFN0cmluZykgZXZlbnQuZ2V0RGF0YSgpOworICAgICAgICAgICAgaWYgKGVudmlyb25tZW50TmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmVtb3ZlRW52aXJvbm1lbnQoZW52aXJvbm1lbnROYW1lKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGVsc2UgaWYgKHR5cGUuZXF1YWxzKCJyZW1vdmVMb2NhbEVqYiIpKSB7CisKKyAgICAgICAgICAgIFN0cmluZyBsb2NhbEVqYk5hbWUgPSAoU3RyaW5nKSBldmVudC5nZXREYXRhKCk7CisgICAgICAgICAgICBpZiAobG9jYWxFamJOYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZW1vdmVMb2NhbEVqYihsb2NhbEVqYk5hbWUpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gZWxzZSBpZiAodHlwZS5lcXVhbHMoInJlbW92ZVJlc291cmNlIikpIHsKKworICAgICAgICAgICAgU3RyaW5nIHJlc291cmNlTmFtZSA9IChTdHJpbmcpIGV2ZW50LmdldERhdGEoKTsKKyAgICAgICAgICAgIGlmIChyZXNvdXJjZU5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJlbW92ZVJlc291cmNlKHJlc291cmNlTmFtZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBlbHNlIGlmICh0eXBlLmVxdWFscygicmVtb3ZlUmVzb3VyY2VMaW5rIikpIHsKKworICAgICAgICAgICAgU3RyaW5nIHJlc291cmNlTGlua05hbWUgPSAoU3RyaW5nKSBldmVudC5nZXREYXRhKCk7CisgICAgICAgICAgICBpZiAocmVzb3VyY2VMaW5rTmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmVtb3ZlUmVzb3VyY2VMaW5rKHJlc291cmNlTGlua05hbWUpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gZWxzZSBpZiAodHlwZS5lcXVhbHMoInJlbW92ZVJlc291cmNlRW52UmVmIikpIHsKKworICAgICAgICAgICAgU3RyaW5nIHJlc291cmNlRW52UmVmTmFtZSA9IChTdHJpbmcpIGV2ZW50LmdldERhdGEoKTsKKyAgICAgICAgICAgIGlmIChyZXNvdXJjZUVudlJlZk5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJlbW92ZVJlc291cmNlRW52UmVmKHJlc291cmNlRW52UmVmTmFtZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIC8vIFNldHRpbmcgdGhlIGNvbnRleHQgaW4gcmVhZCBvbmx5IG1vZGUKKyAgICAgICAgQ29udGV4dEFjY2Vzc0NvbnRyb2xsZXIuc2V0UmVhZE9ubHkoZ2V0TmFtZSgpKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgcHJvcGVydHkgY2hhbmdlIGV2ZW50cy4gIEN1cnJlbnRseSwgb25seSBsaXN0ZW5zIHRvIHN1Y2ggZXZlbnRzCisgICAgICogb24gdGhlIDxjb2RlPk5hbWluZ1Jlc291cmNlczwvY29kZT4gaW5zdGFuY2UgZm9yIHRoZSBnbG9iYWwgbmFtaW5nCisgICAgICogcmVzb3VyY2VzLgorICAgICAqCisgICAgICogQHBhcmFtIGV2ZW50IFRoZSBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQgdGhhdCBoYXMgb2NjdXJyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7CisKKyAgICAgICAgaWYgKCFpbml0aWFsaXplZCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBPYmplY3Qgc291cmNlID0gZXZlbnQuZ2V0U291cmNlKCk7CisgICAgICAgIGlmIChzb3VyY2UgPT0gbmFtaW5nUmVzb3VyY2VzKSB7CisKKyAgICAgICAgICAgIC8vIFNldHRpbmcgdGhlIGNvbnRleHQgaW4gcmVhZC93cml0ZSBtb2RlCisgICAgICAgICAgICBDb250ZXh0QWNjZXNzQ29udHJvbGxlci5zZXRXcml0YWJsZShnZXROYW1lKCksIGNvbnRhaW5lcik7CisKKyAgICAgICAgICAgIHByb2Nlc3NHbG9iYWxSZXNvdXJjZXNDaGFuZ2UoZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmdldE9sZFZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmdldE5ld1ZhbHVlKCkpOworCisgICAgICAgICAgICAvLyBTZXR0aW5nIHRoZSBjb250ZXh0IGluIHJlYWQgb25seSBtb2RlCisgICAgICAgICAgICBDb250ZXh0QWNjZXNzQ29udHJvbGxlci5zZXRSZWFkT25seShnZXROYW1lKCkpOworCisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJpdmF0ZSBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgYSBwcm9wZXJ0eSBjaGFuZ2Ugb24gdGhlIGdsb2JhbCBuYW1pbmcgcmVzb3VyY2VzLCBieSBtYWtpbmcgdGhlCisgICAgICogY29ycmVzcG9uZGluZyBhZGRpdGlvbiBvciByZW1vdmFsIHRvIHRoZSBhc3NvY2lhdGVkIEpOREkgY29udGV4dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIFByb3BlcnR5IG5hbWUgb2YgdGhlIGNoYW5nZSB0byBiZSBwcm9jZXNzZWQKKyAgICAgKiBAcGFyYW0gb2xkVmFsdWUgVGhlIG9sZCB2YWx1ZSAob3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgYWRkaW5nKQorICAgICAqIEBwYXJhbSBuZXdWYWx1ZSBUaGUgbmV3IHZhbHVlIChvciA8Y29kZT5udWxsPC9jb2RlPiBpZiByZW1vdmluZykKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0dsb2JhbFJlc291cmNlc0NoYW5nZShTdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qgb2xkVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG5ld1ZhbHVlKSB7CisKKyAgICAgICAgLy8gTk9URSAtIEl0IHNlZW1zIHRoYXQgdGhlIENvbnRleHQgZm9yIGdsb2JhbCBKTkRJIHJlc291cmNlcworICAgICAgICAvLyBpcyBsZWZ0IGluIHJlYWQtd3JpdGUgbW9kZSwgc28gd2UgZG8gbm90IGhhdmUgdG8gY2hhbmdlIGl0IGhlcmUKKworICAgICAgICBpZiAobmFtZS5lcXVhbHMoImVqYiIpKSB7CisgICAgICAgICAgICBpZiAob2xkVmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIENvbnRleHRFamIgZWpiID0gKENvbnRleHRFamIpIG9sZFZhbHVlOworICAgICAgICAgICAgICAgIGlmIChlamIuZ2V0TmFtZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVtb3ZlRWpiKGVqYi5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChuZXdWYWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgQ29udGV4dEVqYiBlamIgPSAoQ29udGV4dEVqYikgbmV3VmFsdWU7CisgICAgICAgICAgICAgICAgaWYgKGVqYi5nZXROYW1lKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBhZGRFamIoZWpiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoImVudmlyb25tZW50IikpIHsKKyAgICAgICAgICAgIGlmIChvbGRWYWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgQ29udGV4dEVudmlyb25tZW50IGVudiA9IChDb250ZXh0RW52aXJvbm1lbnQpIG9sZFZhbHVlOworICAgICAgICAgICAgICAgIGlmIChlbnYuZ2V0TmFtZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVtb3ZlRW52aXJvbm1lbnQoZW52LmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG5ld1ZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBDb250ZXh0RW52aXJvbm1lbnQgZW52ID0gKENvbnRleHRFbnZpcm9ubWVudCkgbmV3VmFsdWU7CisgICAgICAgICAgICAgICAgaWYgKGVudi5nZXROYW1lKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBhZGRFbnZpcm9ubWVudChlbnYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscygibG9jYWxFamIiKSkgeworICAgICAgICAgICAgaWYgKG9sZFZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBDb250ZXh0TG9jYWxFamIgZWpiID0gKENvbnRleHRMb2NhbEVqYikgb2xkVmFsdWU7CisgICAgICAgICAgICAgICAgaWYgKGVqYi5nZXROYW1lKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZW1vdmVMb2NhbEVqYihlamIuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobmV3VmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIENvbnRleHRMb2NhbEVqYiBlamIgPSAoQ29udGV4dExvY2FsRWpiKSBuZXdWYWx1ZTsKKyAgICAgICAgICAgICAgICBpZiAoZWpiLmdldE5hbWUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGFkZExvY2FsRWpiKGVqYik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKCJyZXNvdXJjZSIpKSB7CisgICAgICAgICAgICBpZiAob2xkVmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIENvbnRleHRSZXNvdXJjZSByZXNvdXJjZSA9IChDb250ZXh0UmVzb3VyY2UpIG9sZFZhbHVlOworICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZS5nZXROYW1lKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZW1vdmVSZXNvdXJjZShyZXNvdXJjZS5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChuZXdWYWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgQ29udGV4dFJlc291cmNlIHJlc291cmNlID0gKENvbnRleHRSZXNvdXJjZSkgbmV3VmFsdWU7CisgICAgICAgICAgICAgICAgaWYgKHJlc291cmNlLmdldE5hbWUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGFkZFJlc291cmNlKHJlc291cmNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoInJlc291cmNlRW52UmVmIikpIHsKKyAgICAgICAgICAgIGlmIChvbGRWYWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgQ29udGV4dFJlc291cmNlRW52UmVmIHJlc291cmNlRW52UmVmID0gCisgICAgICAgICAgICAgICAgICAgIChDb250ZXh0UmVzb3VyY2VFbnZSZWYpIG9sZFZhbHVlOworICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZUVudlJlZi5nZXROYW1lKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZW1vdmVSZXNvdXJjZUVudlJlZihyZXNvdXJjZUVudlJlZi5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChuZXdWYWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgQ29udGV4dFJlc291cmNlRW52UmVmIHJlc291cmNlRW52UmVmID0gCisgICAgICAgICAgICAgICAgICAgIChDb250ZXh0UmVzb3VyY2VFbnZSZWYpIG5ld1ZhbHVlOworICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZUVudlJlZi5nZXROYW1lKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBhZGRSZXNvdXJjZUVudlJlZihyZXNvdXJjZUVudlJlZik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKCJyZXNvdXJjZUxpbmsiKSkgeworICAgICAgICAgICAgaWYgKG9sZFZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBDb250ZXh0UmVzb3VyY2VMaW5rIHJsID0gKENvbnRleHRSZXNvdXJjZUxpbmspIG9sZFZhbHVlOworICAgICAgICAgICAgICAgIGlmIChybC5nZXROYW1lKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZW1vdmVSZXNvdXJjZUxpbmsocmwuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobmV3VmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIENvbnRleHRSZXNvdXJjZUxpbmsgcmwgPSAoQ29udGV4dFJlc291cmNlTGluaykgbmV3VmFsdWU7CisgICAgICAgICAgICAgICAgaWYgKHJsLmdldE5hbWUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGFkZFJlc291cmNlTGluayhybCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuZCBpbml0aWFsaXplIHRoZSBKTkRJIG5hbWluZyBjb250ZXh0LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBjcmVhdGVOYW1pbmdDb250ZXh0KCkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gQ3JlYXRpbmcgdGhlIGNvbXAgc3ViY29udGV4dAorICAgICAgICBpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgU2VydmVyKSB7CisgICAgICAgICAgICBjb21wQ3R4ID0gbmFtaW5nQ29udGV4dDsKKyAgICAgICAgICAgIGVudkN0eCA9IG5hbWluZ0NvbnRleHQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb21wQ3R4ID0gbmFtaW5nQ29udGV4dC5jcmVhdGVTdWJjb250ZXh0KCJjb21wIik7CisgICAgICAgICAgICBlbnZDdHggPSBjb21wQ3R4LmNyZWF0ZVN1YmNvbnRleHQoImVudiIpOworICAgICAgICB9CisKKyAgICAgICAgaW50IGk7CisKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmRlYnVnKCJDcmVhdGluZyBKTkRJIG5hbWluZyBjb250ZXh0Iik7CisKKyAgICAgICAgaWYgKG5hbWluZ1Jlc291cmNlcyA9PSBudWxsKSB7CisgICAgICAgICAgICBuYW1pbmdSZXNvdXJjZXMgPSBuZXcgTmFtaW5nUmVzb3VyY2VzKCk7CisgICAgICAgICAgICBuYW1pbmdSZXNvdXJjZXMuc2V0Q29udGFpbmVyKGNvbnRhaW5lcik7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXNvdXJjZSBsaW5rcworICAgICAgICBDb250ZXh0UmVzb3VyY2VMaW5rW10gcmVzb3VyY2VMaW5rcyA9IAorICAgICAgICAgICAgbmFtaW5nUmVzb3VyY2VzLmZpbmRSZXNvdXJjZUxpbmtzKCk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCByZXNvdXJjZUxpbmtzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBhZGRSZXNvdXJjZUxpbmsocmVzb3VyY2VMaW5rc1tpXSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXNvdXJjZXMKKyAgICAgICAgQ29udGV4dFJlc291cmNlW10gcmVzb3VyY2VzID0gbmFtaW5nUmVzb3VyY2VzLmZpbmRSZXNvdXJjZXMoKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHJlc291cmNlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgYWRkUmVzb3VyY2UocmVzb3VyY2VzW2ldKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlc291cmNlcyBFbnYKKyAgICAgICAgQ29udGV4dFJlc291cmNlRW52UmVmW10gcmVzb3VyY2VFbnZSZWZzID0gbmFtaW5nUmVzb3VyY2VzLmZpbmRSZXNvdXJjZUVudlJlZnMoKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHJlc291cmNlRW52UmVmcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgYWRkUmVzb3VyY2VFbnZSZWYocmVzb3VyY2VFbnZSZWZzW2ldKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEVudmlyb25tZW50IGVudHJpZXMKKyAgICAgICAgQ29udGV4dEVudmlyb25tZW50W10gY29udGV4dEVudmlyb25tZW50cyA9IAorICAgICAgICAgICAgbmFtaW5nUmVzb3VyY2VzLmZpbmRFbnZpcm9ubWVudHMoKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvbnRleHRFbnZpcm9ubWVudHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGFkZEVudmlyb25tZW50KGNvbnRleHRFbnZpcm9ubWVudHNbaV0pOworICAgICAgICB9CisKKyAgICAgICAgLy8gRUpCIHJlZmVyZW5jZXMKKyAgICAgICAgQ29udGV4dEVqYltdIGVqYnMgPSBuYW1pbmdSZXNvdXJjZXMuZmluZEVqYnMoKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGVqYnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGFkZEVqYihlamJzW2ldKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEJpbmRpbmcgYSBVc2VyIFRyYW5zYWN0aW9uIHJlZmVyZW5jZQorICAgICAgICBpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgQ29udGV4dCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBSZWZlcmVuY2UgcmVmID0gbmV3IFRyYW5zYWN0aW9uUmVmKCk7CisgICAgICAgICAgICAgICAgY29tcEN0eC5iaW5kKCJVc2VyVHJhbnNhY3Rpb24iLCByZWYpOworICAgICAgICAgICAgICAgIENvbnRleHRUcmFuc2FjdGlvbiB0cmFuc2FjdGlvbiA9IG5hbWluZ1Jlc291cmNlcy5nZXRUcmFuc2FjdGlvbigpOworICAgICAgICAgICAgICAgIGlmICh0cmFuc2FjdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yIHBhcmFtcyA9IHRyYW5zYWN0aW9uLmxpc3RQcm9wZXJ0aWVzKCk7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChwYXJhbXMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFyYW1OYW1lID0gKFN0cmluZykgcGFyYW1zLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXJhbVZhbHVlID0gKFN0cmluZykgdHJhbnNhY3Rpb24uZ2V0UHJvcGVydHkocGFyYW1OYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZkFkZHIgcmVmQWRkciA9IG5ldyBTdHJpbmdSZWZBZGRyKHBhcmFtTmFtZSwgcGFyYW1WYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZWYuYWRkKHJlZkFkZHIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoTmFtZUFscmVhZHlCb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gSWdub3JlIGJlY2F1c2UgVXNlclRyYW5zYWN0aW9uIHdhcyBvYnZpb3VzbHkgCisgICAgICAgICAgICAgICAgLy8gYWRkZWQgdmlhIFJlc291cmNlTGluaworICAgICAgICAgICAgfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3Ioc20uZ2V0U3RyaW5nKCJuYW1pbmcuYmluZEZhaWxlZCIsIGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEJpbmRpbmcgdGhlIHJlc291cmNlcyBkaXJlY3RvcnkgY29udGV4dAorICAgICAgICBpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgQ29udGV4dCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjb21wQ3R4LmJpbmQoIlJlc291cmNlcyIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENvbnRhaW5lcikgY29udGFpbmVyKS5nZXRSZXNvdXJjZXMoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChOYW1pbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihzbS5nZXRTdHJpbmcoIm5hbWluZy5iaW5kRmFpbGVkIiwgZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgc3BlY2lmaWVkIEVKQnMgaW4gdGhlIG5hbWluZyBjb250ZXh0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEVqYihDb250ZXh0RWpiIGVqYikgeworCisgICAgICAgIC8vIENyZWF0ZSBhIHJlZmVyZW5jZSB0byB0aGUgRUpCLgorICAgICAgICBSZWZlcmVuY2UgcmVmID0gbmV3IEVqYlJlZgorICAgICAgICAgICAgKGVqYi5nZXRUeXBlKCksIGVqYi5nZXRIb21lKCksIGVqYi5nZXRSZW1vdGUoKSwgZWpiLmdldExpbmsoKSk7CisgICAgICAgIC8vIEFkZGluZyB0aGUgYWRkaXRpb25hbCBwYXJhbWV0ZXJzLCBpZiBhbnkKKyAgICAgICAgSXRlcmF0b3IgcGFyYW1zID0gZWpiLmxpc3RQcm9wZXJ0aWVzKCk7CisgICAgICAgIHdoaWxlIChwYXJhbXMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBTdHJpbmcgcGFyYW1OYW1lID0gKFN0cmluZykgcGFyYW1zLm5leHQoKTsKKyAgICAgICAgICAgIFN0cmluZyBwYXJhbVZhbHVlID0gKFN0cmluZykgZWpiLmdldFByb3BlcnR5KHBhcmFtTmFtZSk7CisgICAgICAgICAgICBTdHJpbmdSZWZBZGRyIHJlZkFkZHIgPSBuZXcgU3RyaW5nUmVmQWRkcihwYXJhbU5hbWUsIHBhcmFtVmFsdWUpOworICAgICAgICAgICAgcmVmLmFkZChyZWZBZGRyKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgY3JlYXRlU3ViY29udGV4dHMoZW52Q3R4LCBlamIuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIGVudkN0eC5iaW5kKGVqYi5nZXROYW1lKCksIHJlZik7CisgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2dnZXIuZXJyb3Ioc20uZ2V0U3RyaW5nKCJuYW1pbmcuYmluZEZhaWxlZCIsIGUpKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHNwZWNpZmllZCBlbnZpcm9ubWVudCBlbnRyaWVzIGluIHRoZSBuYW1pbmcgY29udGV4dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRFbnZpcm9ubWVudChDb250ZXh0RW52aXJvbm1lbnQgZW52KSB7CisKKyAgICAgICAgT2JqZWN0IHZhbHVlID0gbnVsbDsKKyAgICAgICAgLy8gSW5zdGFudGlhdGluZyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgY29ycmVjdCBvYmplY3QgdHlwZSwgYW5kCisgICAgICAgIC8vIGluaXRpYWxpemluZyBpdC4KKyAgICAgICAgU3RyaW5nIHR5cGUgPSBlbnYuZ2V0VHlwZSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKHR5cGUuZXF1YWxzKCJqYXZhLmxhbmcuU3RyaW5nIikpIHsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IGVudi5nZXRWYWx1ZSgpOworICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlLmVxdWFscygiamF2YS5sYW5nLkJ5dGUiKSkgeworICAgICAgICAgICAgICAgIGlmIChlbnYuZ2V0VmFsdWUoKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gbmV3IEJ5dGUoKGJ5dGUpIDApOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gQnl0ZS5kZWNvZGUoZW52LmdldFZhbHVlKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZS5lcXVhbHMoImphdmEubGFuZy5TaG9ydCIpKSB7CisgICAgICAgICAgICAgICAgaWYgKGVudi5nZXRWYWx1ZSgpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBuZXcgU2hvcnQoKHNob3J0KSAwKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IFNob3J0LmRlY29kZShlbnYuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlLmVxdWFscygiamF2YS5sYW5nLkludGVnZXIiKSkgeworICAgICAgICAgICAgICAgIGlmIChlbnYuZ2V0VmFsdWUoKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gbmV3IEludGVnZXIoMCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBJbnRlZ2VyLmRlY29kZShlbnYuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlLmVxdWFscygiamF2YS5sYW5nLkxvbmciKSkgeworICAgICAgICAgICAgICAgIGlmIChlbnYuZ2V0VmFsdWUoKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gbmV3IExvbmcoMCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBMb25nLmRlY29kZShlbnYuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlLmVxdWFscygiamF2YS5sYW5nLkJvb2xlYW4iKSkgeworICAgICAgICAgICAgICAgIHZhbHVlID0gQm9vbGVhbi52YWx1ZU9mKGVudi5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZS5lcXVhbHMoImphdmEubGFuZy5Eb3VibGUiKSkgeworICAgICAgICAgICAgICAgIGlmIChlbnYuZ2V0VmFsdWUoKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gbmV3IERvdWJsZSgwKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IERvdWJsZS52YWx1ZU9mKGVudi5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUuZXF1YWxzKCJqYXZhLmxhbmcuRmxvYXQiKSkgeworICAgICAgICAgICAgICAgIGlmIChlbnYuZ2V0VmFsdWUoKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gbmV3IEZsb2F0KDApOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gRmxvYXQudmFsdWVPZihlbnYuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlLmVxdWFscygiamF2YS5sYW5nLkNoYXJhY3RlciIpKSB7CisgICAgICAgICAgICAgICAgaWYgKGVudi5nZXRWYWx1ZSgpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBuZXcgQ2hhcmFjdGVyKChjaGFyKSAwKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoZW52LmdldFZhbHVlKCkubGVuZ3RoKCkgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBuZXcgQ2hhcmFjdGVyKGVudi5nZXRWYWx1ZSgpLmNoYXJBdCgwKSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihzbS5nZXRTdHJpbmcoIm5hbWluZy5pbnZhbGlkRW52RW50cnlUeXBlIiwgZW52LmdldE5hbWUoKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9nZ2VyLmVycm9yKHNtLmdldFN0cmluZygibmFtaW5nLmludmFsaWRFbnZFbnRyeVZhbHVlIiwgZW52LmdldE5hbWUoKSkpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9nZ2VyLmVycm9yKHNtLmdldFN0cmluZygibmFtaW5nLmludmFsaWRFbnZFbnRyeVZhbHVlIiwgZW52LmdldE5hbWUoKSkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQmluZGluZyB0aGUgb2JqZWN0IHRvIHRoZSBhcHByb3ByaWF0ZSBuYW1lCisgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmIChsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCIgIEFkZGluZyBlbnZpcm9ubWVudCBlbnRyeSAiICsgZW52LmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgY3JlYXRlU3ViY29udGV4dHMoZW52Q3R4LCBlbnYuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICBlbnZDdHguYmluZChlbnYuZ2V0TmFtZSgpLCB2YWx1ZSk7CisgICAgICAgICAgICB9IGNhdGNoIChOYW1pbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihzbS5nZXRTdHJpbmcoIm5hbWluZy5pbnZhbGlkRW52RW50cnlWYWx1ZSIsIGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHNwZWNpZmllZCBsb2NhbCBFSkJzIGluIHRoZSBuYW1pbmcgY29udGV4dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRMb2NhbEVqYihDb250ZXh0TG9jYWxFamIgbG9jYWxFamIpIHsKKworCisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgc3BlY2lmaWVkIHJlc291cmNlcyBpbiB0aGUgbmFtaW5nIGNvbnRleHQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkUmVzb3VyY2UoQ29udGV4dFJlc291cmNlIHJlc291cmNlKSB7CisKKyAgICAgICAgLy8gQ3JlYXRlIGEgcmVmZXJlbmNlIHRvIHRoZSByZXNvdXJjZS4KKyAgICAgICAgUmVmZXJlbmNlIHJlZiA9IG5ldyBSZXNvdXJjZVJlZgorICAgICAgICAgICAgKHJlc291cmNlLmdldFR5cGUoKSwgcmVzb3VyY2UuZ2V0RGVzY3JpcHRpb24oKSwKKyAgICAgICAgICAgICByZXNvdXJjZS5nZXRTY29wZSgpLCByZXNvdXJjZS5nZXRBdXRoKCkpOworICAgICAgICAvLyBBZGRpbmcgdGhlIGFkZGl0aW9uYWwgcGFyYW1ldGVycywgaWYgYW55CisgICAgICAgIEl0ZXJhdG9yIHBhcmFtcyA9IHJlc291cmNlLmxpc3RQcm9wZXJ0aWVzKCk7CisgICAgICAgIHdoaWxlIChwYXJhbXMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBTdHJpbmcgcGFyYW1OYW1lID0gKFN0cmluZykgcGFyYW1zLm5leHQoKTsKKyAgICAgICAgICAgIFN0cmluZyBwYXJhbVZhbHVlID0gKFN0cmluZykgcmVzb3VyY2UuZ2V0UHJvcGVydHkocGFyYW1OYW1lKTsKKyAgICAgICAgICAgIFN0cmluZ1JlZkFkZHIgcmVmQWRkciA9IG5ldyBTdHJpbmdSZWZBZGRyKHBhcmFtTmFtZSwgcGFyYW1WYWx1ZSk7CisgICAgICAgICAgICByZWYuYWRkKHJlZkFkZHIpOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoIiAgQWRkaW5nIHJlc291cmNlIHJlZiAiIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHJlc291cmNlLmdldE5hbWUoKSArICIgICIgKyByZWYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY3JlYXRlU3ViY29udGV4dHMoZW52Q3R4LCByZXNvdXJjZS5nZXROYW1lKCkpOworICAgICAgICAgICAgZW52Q3R4LmJpbmQocmVzb3VyY2UuZ2V0TmFtZSgpLCByZWYpOworICAgICAgICB9IGNhdGNoIChOYW1pbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9nZ2VyLmVycm9yKHNtLmdldFN0cmluZygibmFtaW5nLmJpbmRGYWlsZWQiLCBlKSk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzcGVjaWZpZWQgcmVzb3VyY2VzIGluIHRoZSBuYW1pbmcgY29udGV4dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRSZXNvdXJjZUVudlJlZihDb250ZXh0UmVzb3VyY2VFbnZSZWYgcmVzb3VyY2VFbnZSZWYpIHsKKworICAgICAgICAvLyBDcmVhdGUgYSByZWZlcmVuY2UgdG8gdGhlIHJlc291cmNlIGVudi4KKyAgICAgICAgUmVmZXJlbmNlIHJlZiA9IG5ldyBSZXNvdXJjZUVudlJlZihyZXNvdXJjZUVudlJlZi5nZXRUeXBlKCkpOworICAgICAgICAvLyBGSVhNRTogQWRkaW5nIHRoZSBhZGRpdGlvbmFsIHBhcmFtZXRlcnMsIGlmIGFueQorICAgICAgICBJdGVyYXRvciBwYXJhbXMgPSByZXNvdXJjZUVudlJlZi5saXN0UHJvcGVydGllcygpOworICAgICAgICB3aGlsZSAocGFyYW1zLmhhc05leHQoKSkgeworICAgICAgICAgICAgU3RyaW5nIHBhcmFtTmFtZSA9IChTdHJpbmcpIHBhcmFtcy5uZXh0KCk7CisgICAgICAgICAgICBTdHJpbmcgcGFyYW1WYWx1ZSA9IChTdHJpbmcpIHJlc291cmNlRW52UmVmLmdldFByb3BlcnR5KHBhcmFtTmFtZSk7CisgICAgICAgICAgICBTdHJpbmdSZWZBZGRyIHJlZkFkZHIgPSBuZXcgU3RyaW5nUmVmQWRkcihwYXJhbU5hbWUsIHBhcmFtVmFsdWUpOworICAgICAgICAgICAgcmVmLmFkZChyZWZBZGRyKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiICBBZGRpbmcgcmVzb3VyY2UgZW52IHJlZiAiICsgbmFtZSk7CisgICAgICAgICAgICBjcmVhdGVTdWJjb250ZXh0cyhlbnZDdHgsIG5hbWUpOworICAgICAgICAgICAgZW52Q3R4LmJpbmQobmFtZSwgcmVmKTsKKyAgICAgICAgfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZ2dlci5lcnJvcihzbS5nZXRTdHJpbmcoIm5hbWluZy5iaW5kRmFpbGVkIiwgZSkpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgc3BlY2lmaWVkIHJlc291cmNlIGxpbmsgaW4gdGhlIG5hbWluZyBjb250ZXh0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFJlc291cmNlTGluayhDb250ZXh0UmVzb3VyY2VMaW5rIHJlc291cmNlTGluaykgeworCisgICAgICAgIC8vIENyZWF0ZSBhIHJlZmVyZW5jZSB0byB0aGUgcmVzb3VyY2UuCisgICAgICAgIFJlZmVyZW5jZSByZWYgPSBuZXcgUmVzb3VyY2VMaW5rUmVmCisgICAgICAgICAgICAocmVzb3VyY2VMaW5rLmdldFR5cGUoKSwgcmVzb3VyY2VMaW5rLmdldEdsb2JhbCgpKTsKKyAgICAgICAgamF2YXgubmFtaW5nLkNvbnRleHQgY3R4ID0gCisgICAgICAgICAgICAiVXNlclRyYW5zYWN0aW9uIi5lcXVhbHMocmVzb3VyY2VMaW5rLmdldE5hbWUoKSkgCisgICAgICAgICAgICA/IGNvbXBDdHggOiBlbnZDdHg7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgIEFkZGluZyByZXNvdXJjZSBsaW5rICIgKyByZXNvdXJjZUxpbmsuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIGNyZWF0ZVN1YmNvbnRleHRzKGVudkN0eCwgcmVzb3VyY2VMaW5rLmdldE5hbWUoKSk7CisgICAgICAgICAgICBjdHguYmluZChyZXNvdXJjZUxpbmsuZ2V0TmFtZSgpLCByZWYpOworICAgICAgICB9IGNhdGNoIChOYW1pbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9nZ2VyLmVycm9yKHNtLmdldFN0cmluZygibmFtaW5nLmJpbmRGYWlsZWQiLCBlKSk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzcGVjaWZpZWQgRUpCcyBpbiB0aGUgbmFtaW5nIGNvbnRleHQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlRWpiKFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGVudkN0eC51bmJpbmQobmFtZSk7CisgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2dnZXIuZXJyb3Ioc20uZ2V0U3RyaW5nKCJuYW1pbmcudW5iaW5kRmFpbGVkIiwgZSkpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgc3BlY2lmaWVkIGVudmlyb25tZW50IGVudHJpZXMgaW4gdGhlIG5hbWluZyBjb250ZXh0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUVudmlyb25tZW50KFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGVudkN0eC51bmJpbmQobmFtZSk7CisgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2dnZXIuZXJyb3Ioc20uZ2V0U3RyaW5nKCJuYW1pbmcudW5iaW5kRmFpbGVkIiwgZSkpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgc3BlY2lmaWVkIGxvY2FsIEVKQnMgaW4gdGhlIG5hbWluZyBjb250ZXh0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUxvY2FsRWpiKFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGVudkN0eC51bmJpbmQobmFtZSk7CisgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2dnZXIuZXJyb3Ioc20uZ2V0U3RyaW5nKCJuYW1pbmcudW5iaW5kRmFpbGVkIiwgZSkpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgc3BlY2lmaWVkIHJlc291cmNlcyBpbiB0aGUgbmFtaW5nIGNvbnRleHQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlUmVzb3VyY2UoU3RyaW5nIG5hbWUpIHsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgZW52Q3R4LnVuYmluZChuYW1lKTsKKyAgICAgICAgfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZ2dlci5lcnJvcihzbS5nZXRTdHJpbmcoIm5hbWluZy51bmJpbmRGYWlsZWQiLCBlKSk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzcGVjaWZpZWQgcmVzb3VyY2VzIGluIHRoZSBuYW1pbmcgY29udGV4dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVSZXNvdXJjZUVudlJlZihTdHJpbmcgbmFtZSkgeworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBlbnZDdHgudW5iaW5kKG5hbWUpOworICAgICAgICB9IGNhdGNoIChOYW1pbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9nZ2VyLmVycm9yKHNtLmdldFN0cmluZygibmFtaW5nLnVuYmluZEZhaWxlZCIsIGUpKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHNwZWNpZmllZCByZXNvdXJjZXMgaW4gdGhlIG5hbWluZyBjb250ZXh0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVJlc291cmNlTGluayhTdHJpbmcgbmFtZSkgeworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBlbnZDdHgudW5iaW5kKG5hbWUpOworICAgICAgICB9IGNhdGNoIChOYW1pbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9nZ2VyLmVycm9yKHNtLmdldFN0cmluZygibmFtaW5nLnVuYmluZEZhaWxlZCIsIGUpKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYWxsIGludGVybWVkaWF0ZSBzdWJjb250ZXh0cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgY3JlYXRlU3ViY29udGV4dHMoamF2YXgubmFtaW5nLkNvbnRleHQgY3R4LCBTdHJpbmcgbmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIGphdmF4Lm5hbWluZy5Db250ZXh0IGN1cnJlbnRDb250ZXh0ID0gY3R4OworICAgICAgICBTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihuYW1lLCAiLyIpOworICAgICAgICB3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgeworICAgICAgICAgICAgU3RyaW5nIHRva2VuID0gdG9rZW5pemVyLm5leHRUb2tlbigpOworICAgICAgICAgICAgaWYgKCghdG9rZW4uZXF1YWxzKCIiKSkgJiYgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudENvbnRleHQgPSBjdXJyZW50Q29udGV4dC5jcmVhdGVTdWJjb250ZXh0KHRva2VuKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChOYW1pbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBTaWxlbnQgY2F0Y2guIFByb2JhYmx5IGFuIG9iamVjdCBpcyBhbHJlYWR5IGJvdW5kIGluCisgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBjb250ZXh0LgorICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q29udGV4dCA9CisgICAgICAgICAgICAgICAgICAgICAgICAoamF2YXgubmFtaW5nLkNvbnRleHQpIGN1cnJlbnRDb250ZXh0Lmxvb2t1cCh0b2tlbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb3JlL1N0YW5kYXJkQ29udGV4dC5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NvcmUvU3RhbmRhcmRDb250ZXh0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFiYjIyYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb3JlL1N0YW5kYXJkQ29udGV4dC5qYXZhCkBAIC0wLDAgKzEsNTM5NCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlOworCisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CitpbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7CisKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lkxpc3RlbmVyTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhbk5vdGlmaWNhdGlvbkluZm87CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblJlZ2lzdHJhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk5vdGlmaWNhdGlvbkJyb2FkY2FzdGVyU3VwcG9ydDsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk5vdGlmaWNhdGlvbkVtaXR0ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5Ob3RpZmljYXRpb25GaWx0ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5Ob3RpZmljYXRpb25MaXN0ZW5lcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuZGlyZWN0b3J5LkRpckNvbnRleHQ7CitpbXBvcnQgamF2YXguc2VydmxldC5GaWx0ZXJDb25maWc7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0QXR0cmlidXRlTGlzdGVuZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dEV2ZW50OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHRMaXN0ZW5lcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZUxpc3RlbmVyOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldFJlcXVlc3RMaXN0ZW5lcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb25BdHRyaWJ1dGVMaXN0ZW5lcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb25MaXN0ZW5lcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGFpbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGFpbmVyTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Db250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuRW5naW5lOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuR2xvYmFsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkhvc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5JbnN0YW5jZUxpc3RlbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Mb2FkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5XcmFwcGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkFwcGxpY2F0aW9uUGFyYW1ldGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkVycm9yUGFnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5GaWx0ZXJEZWY7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuRmlsdGVyTWFwOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkxvZ2luQ29uZmlnOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95Lk1lc3NhZ2VEZXN0aW5hdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5NZXNzYWdlRGVzdGluYXRpb25SZWY7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuTmFtaW5nUmVzb3VyY2VzOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LlNlY3VyaXR5Q29sbGVjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5TZWN1cml0eUNvbnN0cmFpbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5sb2FkZXIuV2ViYXBwTG9hZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cC5Db250ZXh0Q29uZmlnOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cC5UbGRDb25maWc7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLkNoYXJzZXRNYXBwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLkV4dGVuc2lvblZhbGlkYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuUmVxdWVzdFV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLm1vZGVsZXIuUmVnaXN0cnk7CitpbXBvcnQgb3JnLmFwYWNoZS5uYW1pbmcuQ29udGV4dEJpbmRpbmdzOworaW1wb3J0IG9yZy5hcGFjaGUubmFtaW5nLnJlc291cmNlcy5CYXNlRGlyQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLm5hbWluZy5yZXNvdXJjZXMuRGlyQ29udGV4dFVSTFN0cmVhbUhhbmRsZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5uYW1pbmcucmVzb3VyY2VzLkZpbGVEaXJDb250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUubmFtaW5nLnJlc291cmNlcy5Qcm94eURpckNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5uYW1pbmcucmVzb3VyY2VzLldBUkRpckNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5jb21wYXQuSmRrQ29tcGF0OworCisvKioKKyAqIFN0YW5kYXJkIGltcGxlbWVudGF0aW9uIG9mIHRoZSA8Yj5Db250ZXh0PC9iPiBpbnRlcmZhY2UuICBFYWNoCisgKiBjaGlsZCBjb250YWluZXIgbXVzdCBiZSBhIFdyYXBwZXIgaW1wbGVtZW50YXRpb24gdG8gcHJvY2VzcyB0aGUKKyAqIHJlcXVlc3RzIGRpcmVjdGVkIHRvIGEgcGFydGljdWxhciBzZXJ2bGV0LgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQGF1dGhvciBSZW15IE1hdWNoZXJhdAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgU3RhbmRhcmRDb250ZXh0CisgICAgZXh0ZW5kcyBDb250YWluZXJCYXNlCisgICAgaW1wbGVtZW50cyBDb250ZXh0LCBTZXJpYWxpemFibGUsIE5vdGlmaWNhdGlvbkVtaXR0ZXIKK3sKKyAgICBwcml2YXRlIHN0YXRpYyB0cmFuc2llbnQgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFN0YW5kYXJkQ29udGV4dC5jbGFzcyk7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgU3RhbmRhcmRDb250ZXh0IGNvbXBvbmVudCB3aXRoIHRoZSBkZWZhdWx0IGJhc2ljIFZhbHZlLgorICAgICAqLworICAgIHB1YmxpYyBTdGFuZGFyZENvbnRleHQoKSB7CisKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgcGlwZWxpbmUuc2V0QmFzaWMobmV3IFN0YW5kYXJkQ29udGV4dFZhbHZlKCkpOworICAgICAgICBicm9hZGNhc3RlciA9IG5ldyBOb3RpZmljYXRpb25Ccm9hZGNhc3RlclN1cHBvcnQoKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ2xhc3MgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBzdHJpbmcgZm9yIHRoaXMgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGluZm8gPQorICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkQ29udGV4dC8xLjAiOworCisKKyAgICAvKioKKyAgICAgKiBKREsgY29tcGF0aWJpbGl0eSBzdXBwb3J0CisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmRrQ29tcGF0IGpka0NvbXBhdCA9IEpka0NvbXBhdC5nZXRKZGtDb21wYXQoKTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBhbHRlcm5hdGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIG5hbWUuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgYWx0REROYW1lID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogQXNzb2NpYXRlZCBob3N0IG5hbWUuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgaG9zdE5hbWU7CisKKworICAgIC8qKgorICAgICAqIFRoZSBhbnRpSkFSTG9ja2luZyBmbGFnIGZvciB0aGlzIENvbnRleHQuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGFudGlKQVJMb2NraW5nID0gZmFsc2U7CisKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgYW50aVJlc291cmNlTG9ja2luZyBmbGFnIGZvciB0aGlzIENvbnRleHQuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGFudGlSZXNvdXJjZUxvY2tpbmcgPSBmYWxzZTsKKworICAgIAorICAgIC8qKgorICAgICAqIFRoZSBzZXQgb2YgYXBwbGljYXRpb24gbGlzdGVuZXIgY2xhc3MgbmFtZXMgY29uZmlndXJlZCBmb3IgdGhpcworICAgICAqIGFwcGxpY2F0aW9uLCBpbiB0aGUgb3JkZXIgdGhleSB3ZXJlIGVuY291bnRlcmVkIGluIHRoZSB3ZWIueG1sIGZpbGUuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgYXBwbGljYXRpb25MaXN0ZW5lcnNbXSA9IG5ldyBTdHJpbmdbMF07CisKKworICAgIC8qKgorICAgICAqIFRoZSBzZXQgb2YgaW5zdGFudGlhdGVkIGFwcGxpY2F0aW9uIGV2ZW50IGxpc3RlbmVyIG9iamVjdHM8L2NvZGU+LgorICAgICAqLworICAgIHByaXZhdGUgdHJhbnNpZW50IE9iamVjdCBhcHBsaWNhdGlvbkV2ZW50TGlzdGVuZXJzT2JqZWN0c1tdID0gCisgICAgICAgIG5ldyBPYmplY3RbMF07CisKKworICAgIC8qKgorICAgICAqIFRoZSBzZXQgb2YgaW5zdGFudGlhdGVkIGFwcGxpY2F0aW9uIGxpZmVjeWNsZSBsaXN0ZW5lciBvYmplY3RzPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHRyYW5zaWVudCBPYmplY3QgYXBwbGljYXRpb25MaWZlY3ljbGVMaXN0ZW5lcnNPYmplY3RzW10gPSAKKyAgICAgICAgbmV3IE9iamVjdFswXTsKKworCisgICAgLyoqCisgICAgICogVGhlIHNldCBvZiBhcHBsaWNhdGlvbiBwYXJhbWV0ZXJzIGRlZmluZWQgZm9yIHRoaXMgYXBwbGljYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBBcHBsaWNhdGlvblBhcmFtZXRlciBhcHBsaWNhdGlvblBhcmFtZXRlcnNbXSA9CisgICAgICAgIG5ldyBBcHBsaWNhdGlvblBhcmFtZXRlclswXTsKKworCisgICAgLyoqCisgICAgICogVGhlIGFwcGxpY2F0aW9uIGF2YWlsYWJsZSBmbGFnIGZvciB0aGlzIENvbnRleHQuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGF2YWlsYWJsZSA9IGZhbHNlOworICAgIAorICAgIC8qKgorICAgICAqIFRoZSBicm9hZGNhc3RlciB0aGF0IHNlbmRzIGoyZWUgbm90aWZpY2F0aW9ucy4gCisgICAgICovCisgICAgcHJpdmF0ZSBOb3RpZmljYXRpb25Ccm9hZGNhc3RlclN1cHBvcnQgYnJvYWRjYXN0ZXIgPSBudWxsOworICAgIAorICAgIC8qKgorICAgICAqIFRoZSBMb2NhbGUgdG8gY2hhcmFjdGVyIHNldCBtYXBwZXIgZm9yIHRoaXMgYXBwbGljYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSB0cmFuc2llbnQgQ2hhcnNldE1hcHBlciBjaGFyc2V0TWFwcGVyID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIEphdmEgY2xhc3MgbmFtZSBvZiB0aGUgQ2hhcnNldE1hcHBlciBjbGFzcyB0byBiZSBjcmVhdGVkLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGNoYXJzZXRNYXBwZXJDbGFzcyA9CisgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLkNoYXJzZXRNYXBwZXIiOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgcGF0aCB0byBhIGZpbGUgdG8gc2F2ZSB0aGlzIENvbnRleHQgaW5mb3JtYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgY29uZmlnRmlsZSA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSAiY29ycmVjdGx5IGNvbmZpZ3VyZWQiIGZsYWcgZm9yIHRoaXMgQ29udGV4dC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gY29uZmlndXJlZCA9IGZhbHNlOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc2VjdXJpdHkgY29uc3RyYWludHMgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgU2VjdXJpdHlDb25zdHJhaW50IGNvbnN0cmFpbnRzW10gPSBuZXcgU2VjdXJpdHlDb25zdHJhaW50WzBdOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgU2VydmxldENvbnRleHQgaW1wbGVtZW50YXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgQ29udGV4dC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHRyYW5zaWVudCBBcHBsaWNhdGlvbkNvbnRleHQgY29udGV4dCA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIENvbXBpbGVyIGNsYXNzcGF0aCB0byB1c2UuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgY29tcGlsZXJDbGFzc3BhdGggPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBTaG91bGQgd2UgYXR0ZW1wdCB0byB1c2UgY29va2llcyBmb3Igc2Vzc2lvbiBpZCBjb21tdW5pY2F0aW9uPworICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBjb29raWVzID0gdHJ1ZTsKKworCisgICAgLyoqCisgICAgICogU2hvdWxkIHdlIGFsbG93IHRoZSA8Y29kZT5TZXJ2bGV0Q29udGV4dC5nZXRDb250ZXh0KCk8L2NvZGU+IG1ldGhvZAorICAgICAqIHRvIGFjY2VzcyB0aGUgY29udGV4dCBvZiBvdGhlciB3ZWIgYXBwbGljYXRpb25zIGluIHRoaXMgc2VydmVyPworICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBjcm9zc0NvbnRleHQgPSBmYWxzZTsKKworCisgICAgLyoqCisgICAgICogVGhlICJmb2xsb3cgc3RhbmRhcmQgZGVsZWdhdGlvbiBtb2RlbCIgZmxhZyB0aGF0IHdpbGwgYmUgdXNlZCB0bworICAgICAqIGNvbmZpZ3VyZSBvdXIgQ2xhc3NMb2FkZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGRlbGVnYXRlID0gZmFsc2U7CisKKworICAgICAvKioKKyAgICAgKiBUaGUgZGlzcGxheSBuYW1lIG9mIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGRpc3BsYXlOYW1lID0gbnVsbDsKKworCisgICAgLyoqIAorICAgICAqIE92ZXJyaWRlIHRoZSBkZWZhdWx0IGNvbnRleHQgeG1sIGxvY2F0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGRlZmF1bHRDb250ZXh0WG1sOworCisKKyAgICAvKiogCisgICAgICogT3ZlcnJpZGUgdGhlIGRlZmF1bHQgd2ViIHhtbCBsb2NhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBkZWZhdWx0V2ViWG1sOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZGlzdHJpYnV0YWJsZSBmbGFnIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gZGlzdHJpYnV0YWJsZSA9IGZhbHNlOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZG9jdW1lbnQgcm9vdCBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZG9jQmFzZSA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBleGNlcHRpb24gcGFnZXMgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLCBrZXllZCBieSBmdWxseSBxdWFsaWZpZWQKKyAgICAgKiBjbGFzcyBuYW1lIG9mIHRoZSBKYXZhIGV4Y2VwdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIEhhc2hNYXAgZXhjZXB0aW9uUGFnZXMgPSBuZXcgSGFzaE1hcCgpOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc2V0IG9mIGZpbHRlciBjb25maWd1cmF0aW9ucyAoYW5kIGFzc29jaWF0ZWQgZmlsdGVyIGluc3RhbmNlcykgd2UKKyAgICAgKiBoYXZlIGluaXRpYWxpemVkLCBrZXllZCBieSBmaWx0ZXIgbmFtZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIEhhc2hNYXAgZmlsdGVyQ29uZmlncyA9IG5ldyBIYXNoTWFwKCk7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzZXQgb2YgZmlsdGVyIGRlZmluaXRpb25zIGZvciB0aGlzIGFwcGxpY2F0aW9uLCBrZXllZCBieQorICAgICAqIGZpbHRlciBuYW1lLgorICAgICAqLworICAgIHByaXZhdGUgSGFzaE1hcCBmaWx0ZXJEZWZzID0gbmV3IEhhc2hNYXAoKTsKKworCisgICAgLyoqCisgICAgICogVGhlIHNldCBvZiBmaWx0ZXIgbWFwcGluZ3MgZm9yIHRoaXMgYXBwbGljYXRpb24sIGluIHRoZSBvcmRlcgorICAgICAqIHRoZXkgd2VyZSBkZWZpbmVkIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCisgICAgICovCisgICAgcHJpdmF0ZSBGaWx0ZXJNYXAgZmlsdGVyTWFwc1tdID0gbmV3IEZpbHRlck1hcFswXTsKKworCisgICAgLyoqCisgICAgICogVGhlIHNldCBvZiBjbGFzc25hbWVzIG9mIEluc3RhbmNlTGlzdGVuZXJzIHRoYXQgd2lsbCBiZSBhZGRlZAorICAgICAqIHRvIGVhY2ggbmV3bHkgY3JlYXRlZCBXcmFwcGVyIGJ5IDxjb2RlPmNyZWF0ZVdyYXBwZXIoKTwvY29kZT4uCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgaW5zdGFuY2VMaXN0ZW5lcnNbXSA9IG5ldyBTdHJpbmdbMF07CisKKworICAgIC8qKgorICAgICAqIFRoZSBsb2dpbiBjb25maWd1cmF0aW9uIGRlc2NyaXB0b3IgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgTG9naW5Db25maWcgbG9naW5Db25maWcgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgbWFwcGVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbnRleHQuCisgICAgICovCisgICAgcHJpdmF0ZSBvcmcuYXBhY2hlLnRvbWNhdC51dGlsLmh0dHAubWFwcGVyLk1hcHBlciBtYXBwZXIgPSAKKyAgICAgICAgbmV3IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuaHR0cC5tYXBwZXIuTWFwcGVyKCk7CisKKworICAgIC8qKgorICAgICAqIFRoZSBuYW1pbmcgY29udGV4dCBsaXN0ZW5lciBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSB0cmFuc2llbnQgTmFtaW5nQ29udGV4dExpc3RlbmVyIG5hbWluZ0NvbnRleHRMaXN0ZW5lciA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBuYW1pbmcgcmVzb3VyY2VzIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIE5hbWluZ1Jlc291cmNlcyBuYW1pbmdSZXNvdXJjZXMgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgbWVzc2FnZSBkZXN0aW5hdGlvbnMgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgSGFzaE1hcCBtZXNzYWdlRGVzdGluYXRpb25zID0gbmV3IEhhc2hNYXAoKTsKKworCisgICAgLyoqCisgICAgICogVGhlIE1JTUUgbWFwcGluZ3MgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLCBrZXllZCBieSBleHRlbnNpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBIYXNoTWFwIG1pbWVNYXBwaW5ncyA9IG5ldyBIYXNoTWFwKCk7CisKKworICAgICAvKioKKyAgICAgICogU3BlY2lhbCBjYXNlOiBlcnJvciBwYWdlIGZvciBzdGF0dXMgMjAwLgorICAgICAgKi8KKyAgICAgcHJpdmF0ZSBFcnJvclBhZ2Ugb2tFcnJvclBhZ2UgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgY29udGV4dCBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbiwKKyAgICAgKiBrZXllZCBieSBuYW1lLgorICAgICAqLworICAgIHByaXZhdGUgSGFzaE1hcCBwYXJhbWV0ZXJzID0gbmV3IEhhc2hNYXAoKTsKKworCisgICAgLyoqCisgICAgICogVGhlIHJlcXVlc3QgcHJvY2Vzc2luZyBwYXVzZSBmbGFnICh3aGlsZSByZWxvYWRpbmcgb2NjdXJzKQorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBwYXVzZWQgPSBmYWxzZTsKKworCisgICAgLyoqCisgICAgICogVGhlIHB1YmxpYyBpZGVudGlmaWVyIG9mIHRoZSBEVEQgZm9yIHRoZSB3ZWIgYXBwbGljYXRpb24gZGVwbG95bWVudAorICAgICAqIGRlc2NyaXB0b3IgdmVyc2lvbiB3ZSBhcmUgY3VycmVudGx5IHBhcnNpbmcuICBUaGlzIGlzIHVzZWQgdG8gc3VwcG9ydAorICAgICAqIHJlbGF4ZWQgdmFsaWRhdGlvbiBydWxlcyB3aGVuIHByb2Nlc3NpbmcgdmVyc2lvbiAyLjIgd2ViLnhtbCBmaWxlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBwdWJsaWNJZCA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSByZWxvYWRhYmxlIGZsYWcgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiByZWxvYWRhYmxlID0gZmFsc2U7CisKKworICAgIC8qKgorICAgICAqIFVucGFjayBXQVIgcHJvcGVydHkuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHVucGFja1dBUiA9IHRydWU7CisKKworICAgIC8qKgorICAgICAqIFRoZSBEZWZhdWx0Q29udGV4dCBvdmVycmlkZSBmbGFnIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gb3ZlcnJpZGUgPSBmYWxzZTsKKworCisgICAgLyoqCisgICAgICogVGhlIHByaXZpbGVnZWQgZmxhZyBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHByaXZpbGVnZWQgPSBmYWxzZTsKKworCisgICAgLyoqCisgICAgICogU2hvdWxkIHRoZSBuZXh0IGNhbGwgdG8gPGNvZGU+YWRkV2VsY29tZUZpbGUoKTwvY29kZT4gY2F1c2UgcmVwbGFjZW1lbnQKKyAgICAgKiBvZiBhbnkgZXhpc3Rpbmcgd2VsY29tZSBmaWxlcz8gIFRoaXMgd2lsbCBiZSBzZXQgYmVmb3JlIHByb2Nlc3NpbmcgdGhlCisgICAgICogd2ViIGFwcGxpY2F0aW9uJ3MgZGVwbG95bWVudCBkZXNjcmlwdG9yLCBzbyB0aGF0IGFwcGxpY2F0aW9uIHNwZWNpZmllZAorICAgICAqIGNob2ljZXMgPHN0cm9uZz5yZXBsYWNlPC9zdHJvbmc+LCByYXRoZXIgdGhhbiBhcHBlbmQgdG8sIHRob3NlIGRlZmluZWQKKyAgICAgKiBpbiB0aGUgZ2xvYmFsIGRlc2NyaXB0b3IuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHJlcGxhY2VXZWxjb21lRmlsZXMgPSBmYWxzZTsKKworCisgICAgLyoqCisgICAgICogVGhlIHNlY3VyaXR5IHJvbGUgbWFwcGluZ3MgZm9yIHRoaXMgYXBwbGljYXRpb24sIGtleWVkIGJ5IHJvbGUKKyAgICAgKiBuYW1lIChhcyB1c2VkIHdpdGhpbiB0aGUgYXBwbGljYXRpb24pLgorICAgICAqLworICAgIHByaXZhdGUgSGFzaE1hcCByb2xlTWFwcGluZ3MgPSBuZXcgSGFzaE1hcCgpOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc2VjdXJpdHkgcm9sZXMgZm9yIHRoaXMgYXBwbGljYXRpb24sIGtleWVkIGJ5IHJvbGUgbmFtZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBzZWN1cml0eVJvbGVzW10gPSBuZXcgU3RyaW5nWzBdOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc2VydmxldCBtYXBwaW5ncyBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24sIGtleWVkIGJ5CisgICAgICogbWF0Y2hpbmcgcGF0dGVybi4KKyAgICAgKi8KKyAgICBwcml2YXRlIEhhc2hNYXAgc2VydmxldE1hcHBpbmdzID0gbmV3IEhhc2hNYXAoKTsKKworCisgICAgLyoqCisgICAgICogVGhlIHNlc3Npb24gdGltZW91dCAoaW4gbWludXRlcykgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgaW50IHNlc3Npb25UaW1lb3V0ID0gMzA7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbm90aWZpY2F0aW9uIHNlcXVlbmNlIG51bWJlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIGxvbmcgc2VxdWVuY2VOdW1iZXIgPSAwOworICAgIAorICAgIC8qKgorICAgICAqIFRoZSBzdGF0dXMgY29kZSBlcnJvciBwYWdlcyBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24sIGtleWVkIGJ5CisgICAgICogSFRUUCBzdGF0dXMgY29kZSAoYXMgYW4gSW50ZWdlcikuCisgICAgICovCisgICAgcHJpdmF0ZSBIYXNoTWFwIHN0YXR1c1BhZ2VzID0gbmV3IEhhc2hNYXAoKTsKKworCisgICAgLyoqCisgICAgICogU2V0IGZsYWcgdG8gdHJ1ZSB0byBjYXVzZSB0aGUgc3lzdGVtLm91dCBhbmQgc3lzdGVtLmVyciB0byBiZSByZWRpcmVjdGVkCisgICAgICogdG8gdGhlIGxvZ2dlciB3aGVuIGV4ZWN1dGluZyBhIHNlcnZsZXQuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHN3YWxsb3dPdXRwdXQgPSBmYWxzZTsKKworCisgICAgLyoqCisgICAgICogVGhlIEpTUCB0YWcgbGlicmFyaWVzIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbiwga2V5ZWQgYnkgVVJJCisgICAgICovCisgICAgcHJpdmF0ZSBIYXNoTWFwIHRhZ2xpYnMgPSBuZXcgSGFzaE1hcCgpOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgd2F0Y2hlZCByZXNvdXJjZXMgZm9yIHRoaXMgYXBwbGljYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgd2F0Y2hlZFJlc291cmNlc1tdID0gbmV3IFN0cmluZ1swXTsKKworCisgICAgLyoqCisgICAgICogVGhlIHdlbGNvbWUgZmlsZXMgZm9yIHRoaXMgYXBwbGljYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgd2VsY29tZUZpbGVzW10gPSBuZXcgU3RyaW5nWzBdOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc2V0IG9mIGNsYXNzbmFtZXMgb2YgTGlmZWN5Y2xlTGlzdGVuZXJzIHRoYXQgd2lsbCBiZSBhZGRlZAorICAgICAqIHRvIGVhY2ggbmV3bHkgY3JlYXRlZCBXcmFwcGVyIGJ5IDxjb2RlPmNyZWF0ZVdyYXBwZXIoKTwvY29kZT4uCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgd3JhcHBlckxpZmVjeWNsZXNbXSA9IG5ldyBTdHJpbmdbMF07CisKKworICAgIC8qKgorICAgICAqIFRoZSBzZXQgb2YgY2xhc3NuYW1lcyBvZiBDb250YWluZXJMaXN0ZW5lcnMgdGhhdCB3aWxsIGJlIGFkZGVkCisgICAgICogdG8gZWFjaCBuZXdseSBjcmVhdGVkIFdyYXBwZXIgYnkgPGNvZGU+Y3JlYXRlV3JhcHBlcigpPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyB3cmFwcGVyTGlzdGVuZXJzW10gPSBuZXcgU3RyaW5nWzBdOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgcGF0aG5hbWUgdG8gdGhlIHdvcmsgZGlyZWN0b3J5IGZvciB0aGlzIGNvbnRleHQgKHJlbGF0aXZlIHRvCisgICAgICogdGhlIHNlcnZlcidzIGhvbWUgaWYgbm90IGFic29sdXRlKS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyB3b3JrRGlyID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogSmF2YSBjbGFzcyBuYW1lIG9mIHRoZSBXcmFwcGVyIGNsYXNzIGltcGxlbWVudGF0aW9uIHdlIHVzZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyB3cmFwcGVyQ2xhc3MgPSAib3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkV3JhcHBlciI7CisKKworICAgIC8qKgorICAgICAqIEpOREkgdXNlIGZsYWcuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHVzZU5hbWluZyA9IHRydWU7CisKKworICAgIC8qKgorICAgICAqIEZpbGVzeXN0ZW0gYmFzZWQgZmxhZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gZmlsZXN5c3RlbUJhc2VkID0gZmFsc2U7CisKKworICAgIC8qKgorICAgICAqIE5hbWUgb2YgdGhlIGFzc29jaWF0ZWQgbmFtaW5nIGNvbnRleHQuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtaW5nQ29udGV4dE5hbWUgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBGcmVxdWVuY3kgb2YgdGhlIHNlc3Npb24gZXhwaXJhdGlvbiwgYW5kIHJlbGF0ZWQgbWFuYWdlciBvcGVyYXRpb25zLgorICAgICAqIE1hbmFnZXIgb3BlcmF0aW9ucyB3aWxsIGJlIGRvbmUgb25jZSBmb3IgdGhlIHNwZWNpZmllZCBhbW91bnQgb2YKKyAgICAgKiBiYWNrZ3JvbmRQcm9jZXNzIGNhbGxzIChpZSwgdGhlIGxvd2VyIHRoZSBhbW91bnQsIHRoZSBtb3N0IG9mdGVuIHRoZQorICAgICAqIGNoZWNrcyB3aWxsIG9jY3VyKS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBtYW5hZ2VyQ2hlY2tzRnJlcXVlbmN5ID0gNjsKKworCisgICAgLyoqCisgICAgICogSXRlcmF0aW9uIGNvdW50IGZvciBiYWNrZ3JvdW5kIHByb2Nlc3NpbmcuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgY291bnQgPSAwOworCisKKyAgICAvKioKKyAgICAgKiBDYWNoaW5nIGFsbG93ZWQgZmxhZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gY2FjaGluZ0FsbG93ZWQgPSB0cnVlOworCisKKyAgICAvKioKKyAgICAgKiBDYXNlIHNlbnNpdGl2aXR5LgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGNhc2VTZW5zaXRpdmUgPSB0cnVlOworCisKKyAgICAvKioKKyAgICAgKiBBbGxvdyBsaW5raW5nLgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGFsbG93TGlua2luZyA9IGZhbHNlOworCisKKyAgICAvKioKKyAgICAgKiBDYWNoZSBtYXggc2l6ZSBpbiBLQi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IGNhY2hlTWF4U2l6ZSA9IDEwMjQwOyAvLyAxMCBNQgorCisKKyAgICAvKioKKyAgICAgKiBDYWNoZSBUVEwgaW4gbXMuCisgICAgICovCisgICAgcHJvdGVjdGVkIGludCBjYWNoZVRUTCA9IDUwMDA7CisKKworICAgIHByaXZhdGUgYm9vbGVhbiBsYXp5PXRydWU7CisKKyAgICAvKioKKyAgICAgKiBOb24gcHJveGllZCByZXNvdXJjZXMuCisgICAgICovCisgICAgcHJpdmF0ZSB0cmFuc2llbnQgRGlyQ29udGV4dCB3ZWJhcHBSZXNvdXJjZXMgPSBudWxsOworCisgICAgcHJpdmF0ZSBsb25nIHN0YXJ0dXBUaW1lOworICAgIHByaXZhdGUgbG9uZyBzdGFydFRpbWU7CisgICAgcHJpdmF0ZSBsb25nIHRsZFNjYW5UaW1lOworCisgICAgLyoqIAorICAgICAqIE5hbWUgb2YgdGhlIGVuZ2luZS4gSWYgbnVsbCwgdGhlIGRvbWFpbiBpcyB1c2VkLgorICAgICAqLyAKKyAgICBwcml2YXRlIFN0cmluZyBlbmdpbmVOYW1lID0gbnVsbDsKKyAgICBwcml2YXRlIFN0cmluZyBqMkVFQXBwbGljYXRpb249Im5vbmUiOworICAgIHByaXZhdGUgU3RyaW5nIGoyRUVTZXJ2ZXI9Im5vbmUiOworCisKKyAgICAvKioKKyAgICAgKiBBdHRyaWJ1dGUgdmFsdWUgdXNlZCB0byB0dXJuIG9uL29mZiBYTUwgdmFsaWRhdGlvbgorICAgICAqLworICAgICBwcml2YXRlIGJvb2xlYW4gd2ViWG1sVmFsaWRhdGlvbiA9IGZhbHNlOworCisKKyAgICAvKioKKyAgICAgKiBBdHRyaWJ1dGUgdmFsdWUgdXNlZCB0byB0dXJuIG9uL29mZiBYTUwgbmFtZXNwYWNlIHZhbGlkYXRpb24KKyAgICAgKi8KKyAgICAgcHJpdmF0ZSBib29sZWFuIHdlYlhtbE5hbWVzcGFjZUF3YXJlID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBBdHRyaWJ1dGUgdmFsdWUgdXNlZCB0byB0dXJuIG9uL29mZiBUTEQgcHJvY2Vzc2luZworICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBwcm9jZXNzVGxkcyA9IHRydWU7CisKKyAgICAvKioKKyAgICAgKiBBdHRyaWJ1dGUgdmFsdWUgdXNlZCB0byB0dXJuIG9uL29mZiBYTUwgdmFsaWRhdGlvbgorICAgICAqLworICAgICBwcml2YXRlIGJvb2xlYW4gdGxkVmFsaWRhdGlvbiA9IGZhbHNlOworCisKKyAgICAvKioKKyAgICAgKiBBdHRyaWJ1dGUgdmFsdWUgdXNlZCB0byB0dXJuIG9uL29mZiBUTEQgWE1MIG5hbWVzcGFjZSB2YWxpZGF0aW9uCisgICAgICovCisgICAgIHByaXZhdGUgYm9vbGVhbiB0bGROYW1lc3BhY2VBd2FyZSA9IGZhbHNlOworCisKKyAgICAvKioKKyAgICAgKiBTaG91bGQgd2Ugc2F2ZSB0aGUgY29uZmlndXJhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gc2F2ZUNvbmZpZyA9IHRydWU7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnRleHQgUHJvcGVydGllcworCisgICAgcHVibGljIHZvaWQgc2V0TmFtZSggU3RyaW5nIG5hbWUgKSB7CisgICAgICAgIHN1cGVyLnNldE5hbWUoIG5hbWUgKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIElzIGNhY2hpbmcgYWxsb3dlZCA/CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNDYWNoaW5nQWxsb3dlZCgpIHsKKyAgICAgICAgcmV0dXJuIGNhY2hpbmdBbGxvd2VkOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IGNhY2hpbmcgYWxsb3dlZCBmbGFnLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENhY2hpbmdBbGxvd2VkKGJvb2xlYW4gY2FjaGluZ0FsbG93ZWQpIHsKKyAgICAgICAgdGhpcy5jYWNoaW5nQWxsb3dlZCA9IGNhY2hpbmdBbGxvd2VkOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IGNhc2Ugc2Vuc2l0aXZpdHkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2FzZVNlbnNpdGl2ZShib29sZWFuIGNhc2VTZW5zaXRpdmUpIHsKKyAgICAgICAgdGhpcy5jYXNlU2Vuc2l0aXZlID0gY2FzZVNlbnNpdGl2ZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIElzIGNhc2Ugc2Vuc2l0aXZlID8KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUoKSB7CisgICAgICAgIHJldHVybiBjYXNlU2Vuc2l0aXZlOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IGFsbG93IGxpbmtpbmcuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QWxsb3dMaW5raW5nKGJvb2xlYW4gYWxsb3dMaW5raW5nKSB7CisgICAgICAgIHRoaXMuYWxsb3dMaW5raW5nID0gYWxsb3dMaW5raW5nOworICAgIH0KKworCisgICAgLyoqCisgICAgICogSXMgbGlua2luZyBhbGxvd2VkLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzQWxsb3dMaW5raW5nKCkgeworICAgICAgICByZXR1cm4gYWxsb3dMaW5raW5nOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IGNhY2hlIFRUTC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDYWNoZVRUTChpbnQgY2FjaGVUVEwpIHsKKyAgICAgICAgdGhpcy5jYWNoZVRUTCA9IGNhY2hlVFRMOworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0IGNhY2hlIFRUTC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldENhY2hlVFRMKCkgeworICAgICAgICByZXR1cm4gY2FjaGVUVEw7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgY2FjaGUgaW4gS0IuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRDYWNoZU1heFNpemUoKSB7CisgICAgICAgIHJldHVybiBjYWNoZU1heFNpemU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgY2FjaGUgaW4gS0IuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2FjaGVNYXhTaXplKGludCBjYWNoZU1heFNpemUpIHsKKyAgICAgICAgdGhpcy5jYWNoZU1heFNpemUgPSBjYWNoZU1heFNpemU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlICJmb2xsb3cgc3RhbmRhcmQgZGVsZWdhdGlvbiBtb2RlbCIgZmxhZyB1c2VkIHRvIGNvbmZpZ3VyZQorICAgICAqIG91ciBDbGFzc0xvYWRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXREZWxlZ2F0ZSgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMuZGVsZWdhdGUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlICJmb2xsb3cgc3RhbmRhcmQgZGVsZWdhdGlvbiBtb2RlbCIgZmxhZyB1c2VkIHRvIGNvbmZpZ3VyZQorICAgICAqIG91ciBDbGFzc0xvYWRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZWxlZ2F0ZSBUaGUgbmV3IGZsYWcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREZWxlZ2F0ZShib29sZWFuIGRlbGVnYXRlKSB7CisKKyAgICAgICAgYm9vbGVhbiBvbGREZWxlZ2F0ZSA9IHRoaXMuZGVsZWdhdGU7CisgICAgICAgIHRoaXMuZGVsZWdhdGUgPSBkZWxlZ2F0ZTsKKyAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoImRlbGVnYXRlIiwgbmV3IEJvb2xlYW4ob2xkRGVsZWdhdGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQm9vbGVhbih0aGlzLmRlbGVnYXRlKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgaW50ZXJuYWwgbmFtaW5nIHN1cHBvcnQgaXMgdXNlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1VzZU5hbWluZygpIHsKKworICAgICAgICByZXR1cm4gKHVzZU5hbWluZyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgbmFtaW5nLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVzZU5hbWluZyhib29sZWFuIHVzZU5hbWluZykgeworICAgICAgICB0aGlzLnVzZU5hbWluZyA9IHVzZU5hbWluZzsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbnRleHQgYXJlCisgICAgICogZmlsZXN5c3RlbSBiYXNlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0ZpbGVzeXN0ZW1CYXNlZCgpIHsKKworICAgICAgICByZXR1cm4gKGZpbGVzeXN0ZW1CYXNlZCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2V0IG9mIGluaXRpYWxpemVkIGFwcGxpY2F0aW9uIGV2ZW50IGxpc3RlbmVyIG9iamVjdHMsCisgICAgICogaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSBzcGVjaWZpZWQgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbiBkZXBsb3ltZW50CisgICAgICogZGVzY3JpcHRvciwgZm9yIHRoaXMgYXBwbGljYXRpb24uCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYmVmb3JlCisgICAgICogIHRoaXMgYXBwbGljYXRpb24gaGFzIHN0YXJ0ZWQsIG9yIGFmdGVyIGl0IGhhcyBiZWVuIHN0b3BwZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0W10gZ2V0QXBwbGljYXRpb25FdmVudExpc3RlbmVycygpIHsKKyAgICAgICAgcmV0dXJuIChhcHBsaWNhdGlvbkV2ZW50TGlzdGVuZXJzT2JqZWN0cyk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTdG9yZSB0aGUgc2V0IG9mIGluaXRpYWxpemVkIGFwcGxpY2F0aW9uIGV2ZW50IGxpc3RlbmVyIG9iamVjdHMsCisgICAgICogaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSBzcGVjaWZpZWQgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbiBkZXBsb3ltZW50CisgICAgICogZGVzY3JpcHRvciwgZm9yIHRoaXMgYXBwbGljYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXJzIFRoZSBzZXQgb2YgaW5zdGFudGlhdGVkIGxpc3RlbmVyIG9iamVjdHMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QXBwbGljYXRpb25FdmVudExpc3RlbmVycyhPYmplY3QgbGlzdGVuZXJzW10pIHsKKyAgICAgICAgYXBwbGljYXRpb25FdmVudExpc3RlbmVyc09iamVjdHMgPSBsaXN0ZW5lcnM7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNldCBvZiBpbml0aWFsaXplZCBhcHBsaWNhdGlvbiBsaWZlY3ljbGUgbGlzdGVuZXIgb2JqZWN0cywKKyAgICAgKiBpbiB0aGUgb3JkZXIgdGhleSB3ZXJlIHNwZWNpZmllZCBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQKKyAgICAgKiBkZXNjcmlwdG9yLCBmb3IgdGhpcyBhcHBsaWNhdGlvbi4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBiZWZvcmUKKyAgICAgKiAgdGhpcyBhcHBsaWNhdGlvbiBoYXMgc3RhcnRlZCwgb3IgYWZ0ZXIgaXQgaGFzIGJlZW4gc3RvcHBlZAorICAgICAqLworICAgIHB1YmxpYyBPYmplY3RbXSBnZXRBcHBsaWNhdGlvbkxpZmVjeWNsZUxpc3RlbmVycygpIHsKKyAgICAgICAgcmV0dXJuIChhcHBsaWNhdGlvbkxpZmVjeWNsZUxpc3RlbmVyc09iamVjdHMpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU3RvcmUgdGhlIHNldCBvZiBpbml0aWFsaXplZCBhcHBsaWNhdGlvbiBsaWZlY3ljbGUgbGlzdGVuZXIgb2JqZWN0cywKKyAgICAgKiBpbiB0aGUgb3JkZXIgdGhleSB3ZXJlIHNwZWNpZmllZCBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQKKyAgICAgKiBkZXNjcmlwdG9yLCBmb3IgdGhpcyBhcHBsaWNhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lcnMgVGhlIHNldCBvZiBpbnN0YW50aWF0ZWQgbGlzdGVuZXIgb2JqZWN0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBcHBsaWNhdGlvbkxpZmVjeWNsZUxpc3RlbmVycyhPYmplY3QgbGlzdGVuZXJzW10pIHsKKyAgICAgICAgYXBwbGljYXRpb25MaWZlY3ljbGVMaXN0ZW5lcnNPYmplY3RzID0gbGlzdGVuZXJzOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBhbnRpSkFSTG9ja2luZyBmbGFnIGZvciB0aGlzIENvbnRleHQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0QW50aUpBUkxvY2tpbmcoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLmFudGlKQVJMb2NraW5nKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBhbnRpUmVzb3VyY2VMb2NraW5nIGZsYWcgZm9yIHRoaXMgQ29udGV4dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRBbnRpUmVzb3VyY2VMb2NraW5nKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5hbnRpUmVzb3VyY2VMb2NraW5nKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBhbnRpSkFSTG9ja2luZyBmZWF0dXJlIGZvciB0aGlzIENvbnRleHQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYW50aUpBUkxvY2tpbmcgVGhlIG5ldyBmbGFnIHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QW50aUpBUkxvY2tpbmcoYm9vbGVhbiBhbnRpSkFSTG9ja2luZykgeworCisgICAgICAgIGJvb2xlYW4gb2xkQW50aUpBUkxvY2tpbmcgPSB0aGlzLmFudGlKQVJMb2NraW5nOworICAgICAgICB0aGlzLmFudGlKQVJMb2NraW5nID0gYW50aUpBUkxvY2tpbmc7CisgICAgICAgIHN1cHBvcnQuZmlyZVByb3BlcnR5Q2hhbmdlKCJhbnRpSkFSTG9ja2luZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCb29sZWFuKG9sZEFudGlKQVJMb2NraW5nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJvb2xlYW4odGhpcy5hbnRpSkFSTG9ja2luZykpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGFudGlSZXNvdXJjZUxvY2tpbmcgZmVhdHVyZSBmb3IgdGhpcyBDb250ZXh0LgorICAgICAqCisgICAgICogQHBhcmFtIGFudGlSZXNvdXJjZUxvY2tpbmcgVGhlIG5ldyBmbGFnIHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QW50aVJlc291cmNlTG9ja2luZyhib29sZWFuIGFudGlSZXNvdXJjZUxvY2tpbmcpIHsKKworICAgICAgICBib29sZWFuIG9sZEFudGlSZXNvdXJjZUxvY2tpbmcgPSB0aGlzLmFudGlSZXNvdXJjZUxvY2tpbmc7CisgICAgICAgIHRoaXMuYW50aVJlc291cmNlTG9ja2luZyA9IGFudGlSZXNvdXJjZUxvY2tpbmc7CisgICAgICAgIHN1cHBvcnQuZmlyZVByb3BlcnR5Q2hhbmdlKCJhbnRpUmVzb3VyY2VMb2NraW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJvb2xlYW4ob2xkQW50aVJlc291cmNlTG9ja2luZyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCb29sZWFuKHRoaXMuYW50aVJlc291cmNlTG9ja2luZykpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGFwcGxpY2F0aW9uIGF2YWlsYWJsZSBmbGFnIGZvciB0aGlzIENvbnRleHQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0QXZhaWxhYmxlKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5hdmFpbGFibGUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGFwcGxpY2F0aW9uIGF2YWlsYWJsZSBmbGFnIGZvciB0aGlzIENvbnRleHQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXZhaWxhYmxlIFRoZSBuZXcgYXBwbGljYXRpb24gYXZhaWxhYmxlIGZsYWcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBdmFpbGFibGUoYm9vbGVhbiBhdmFpbGFibGUpIHsKKworICAgICAgICBib29sZWFuIG9sZEF2YWlsYWJsZSA9IHRoaXMuYXZhaWxhYmxlOworICAgICAgICB0aGlzLmF2YWlsYWJsZSA9IGF2YWlsYWJsZTsKKyAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoImF2YWlsYWJsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCb29sZWFuKG9sZEF2YWlsYWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCb29sZWFuKHRoaXMuYXZhaWxhYmxlKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgTG9jYWxlIHRvIGNoYXJhY3RlciBzZXQgbWFwcGVyIGZvciB0aGlzIENvbnRleHQuCisgICAgICovCisgICAgcHVibGljIENoYXJzZXRNYXBwZXIgZ2V0Q2hhcnNldE1hcHBlcigpIHsKKworICAgICAgICAvLyBDcmVhdGUgYSBtYXBwZXIgdGhlIGZpcnN0IHRpbWUgaXQgaXMgcmVxdWVzdGVkCisgICAgICAgIGlmICh0aGlzLmNoYXJzZXRNYXBwZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBDbGFzcyBjbGF6eiA9IENsYXNzLmZvck5hbWUoY2hhcnNldE1hcHBlckNsYXNzKTsKKyAgICAgICAgICAgICAgICB0aGlzLmNoYXJzZXRNYXBwZXIgPQorICAgICAgICAgICAgICAgICAgKENoYXJzZXRNYXBwZXIpIGNsYXp6Lm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgIHRoaXMuY2hhcnNldE1hcHBlciA9IG5ldyBDaGFyc2V0TWFwcGVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKHRoaXMuY2hhcnNldE1hcHBlcik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgTG9jYWxlIHRvIGNoYXJhY3RlciBzZXQgbWFwcGVyIGZvciB0aGlzIENvbnRleHQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGVyIFRoZSBuZXcgbWFwcGVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2hhcnNldE1hcHBlcihDaGFyc2V0TWFwcGVyIG1hcHBlcikgeworCisgICAgICAgIENoYXJzZXRNYXBwZXIgb2xkQ2hhcnNldE1hcHBlciA9IHRoaXMuY2hhcnNldE1hcHBlcjsKKyAgICAgICAgdGhpcy5jaGFyc2V0TWFwcGVyID0gbWFwcGVyOworICAgICAgICBpZiggbWFwcGVyICE9IG51bGwgKQorICAgICAgICAgICAgdGhpcy5jaGFyc2V0TWFwcGVyQ2xhc3M9IG1hcHBlci5nZXRDbGFzcygpLmdldE5hbWUoKTsKKyAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoImNoYXJzZXRNYXBwZXIiLCBvbGRDaGFyc2V0TWFwcGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYXJzZXRNYXBwZXIpOworCisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBwYXRoIHRvIGEgZmlsZSB0byBzYXZlIHRoaXMgQ29udGV4dCBpbmZvcm1hdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbmZpZ0ZpbGUoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLmNvbmZpZ0ZpbGUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHBhdGggdG8gYSBmaWxlIHRvIHNhdmUgdGhpcyBDb250ZXh0IGluZm9ybWF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbmZpZ0ZpbGUgVGhlIHBhdGggdG8gYSBmaWxlIHRvIHNhdmUgdGhpcyBDb250ZXh0IGluZm9ybWF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbmZpZ0ZpbGUoU3RyaW5nIGNvbmZpZ0ZpbGUpIHsKKworICAgICAgICB0aGlzLmNvbmZpZ0ZpbGUgPSBjb25maWdGaWxlOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSAiY29ycmVjdGx5IGNvbmZpZ3VyZWQiIGZsYWcgZm9yIHRoaXMgQ29udGV4dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRDb25maWd1cmVkKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5jb25maWd1cmVkKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSAiY29ycmVjdGx5IGNvbmZpZ3VyZWQiIGZsYWcgZm9yIHRoaXMgQ29udGV4dC4gIFRoaXMgY2FuIGJlCisgICAgICogc2V0IHRvIGZhbHNlIGJ5IHN0YXJ0dXAgbGlzdGVuZXJzIHRoYXQgZGV0ZWN0IGEgZmF0YWwgY29uZmlndXJhdGlvbgorICAgICAqIGVycm9yIHRvIGF2b2lkIHRoZSBhcHBsaWNhdGlvbiBmcm9tIGJlaW5nIG1hZGUgYXZhaWxhYmxlLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbmZpZ3VyZWQgVGhlIG5ldyBjb3JyZWN0bHkgY29uZmlndXJlZCBmbGFnCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29uZmlndXJlZChib29sZWFuIGNvbmZpZ3VyZWQpIHsKKworICAgICAgICBib29sZWFuIG9sZENvbmZpZ3VyZWQgPSB0aGlzLmNvbmZpZ3VyZWQ7CisgICAgICAgIHRoaXMuY29uZmlndXJlZCA9IGNvbmZpZ3VyZWQ7CisgICAgICAgIHN1cHBvcnQuZmlyZVByb3BlcnR5Q2hhbmdlKCJjb25maWd1cmVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJvb2xlYW4ob2xkQ29uZmlndXJlZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCb29sZWFuKHRoaXMuY29uZmlndXJlZCkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlICJ1c2UgY29va2llcyBmb3Igc2Vzc2lvbiBpZHMiIGZsYWcuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0Q29va2llcygpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMuY29va2llcyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgInVzZSBjb29raWVzIGZvciBzZXNzaW9uIGlkcyIgZmxhZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb29raWVzIFRoZSBuZXcgZmxhZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvb2tpZXMoYm9vbGVhbiBjb29raWVzKSB7CisKKyAgICAgICAgYm9vbGVhbiBvbGRDb29raWVzID0gdGhpcy5jb29raWVzOworICAgICAgICB0aGlzLmNvb2tpZXMgPSBjb29raWVzOworICAgICAgICBzdXBwb3J0LmZpcmVQcm9wZXJ0eUNoYW5nZSgiY29va2llcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCb29sZWFuKG9sZENvb2tpZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQm9vbGVhbih0aGlzLmNvb2tpZXMpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSAiYWxsb3cgY3Jvc3Npbmcgc2VydmxldCBjb250ZXh0cyIgZmxhZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRDcm9zc0NvbnRleHQoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLmNyb3NzQ29udGV4dCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgImFsbG93IGNyb3NzaW5nIHNlcnZsZXQgY29udGV4dHMiIGZsYWcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY3Jvc3NDb250ZXh0IFRoZSBuZXcgY3Jvc3MgY29udGV4dHMgZmxhZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENyb3NzQ29udGV4dChib29sZWFuIGNyb3NzQ29udGV4dCkgeworCisgICAgICAgIGJvb2xlYW4gb2xkQ3Jvc3NDb250ZXh0ID0gdGhpcy5jcm9zc0NvbnRleHQ7CisgICAgICAgIHRoaXMuY3Jvc3NDb250ZXh0ID0gY3Jvc3NDb250ZXh0OworICAgICAgICBzdXBwb3J0LmZpcmVQcm9wZXJ0eUNoYW5nZSgiY3Jvc3NDb250ZXh0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJvb2xlYW4ob2xkQ3Jvc3NDb250ZXh0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJvb2xlYW4odGhpcy5jcm9zc0NvbnRleHQpKTsKKworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENvbnRleHRYbWwoKSB7CisgICAgICAgIHJldHVybiBkZWZhdWx0Q29udGV4dFhtbDsKKyAgICB9CisKKyAgICAvKiogCisgICAgICogU2V0IHRoZSBsb2NhdGlvbiBvZiB0aGUgZGVmYXVsdCBjb250ZXh0IHhtbCB0aGF0IHdpbGwgYmUgdXNlZC4KKyAgICAgKiBJZiBub3QgYWJzb2x1dGUsIGl0J2xsIGJlIG1hZGUgcmVsYXRpdmUgdG8gdGhlIGVuZ2luZSdzIGJhc2UgZGlyCisgICAgICogKCB3aGljaCBkZWZhdWx0cyB0byBjYXRhbGluYS5iYXNlIHN5c3RlbSBwcm9wZXJ0eSApLgorICAgICAqCisgICAgICogQHBhcmFtIGRlZmF1bHRXZWJYbWwgVGhlIGRlZmF1bHQgd2ViIHhtbCAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0Q29udGV4dFhtbChTdHJpbmcgZGVmYXVsdENvbnRleHRYbWwpIHsKKyAgICAgICAgdGhpcy5kZWZhdWx0Q29udGV4dFhtbCA9IGRlZmF1bHRDb250ZXh0WG1sOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFdlYlhtbCgpIHsKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRXZWJYbWw7CisgICAgfQorCisgICAgLyoqIAorICAgICAqIFNldCB0aGUgbG9jYXRpb24gb2YgdGhlIGRlZmF1bHQgd2ViIHhtbCB0aGF0IHdpbGwgYmUgdXNlZC4KKyAgICAgKiBJZiBub3QgYWJzb2x1dGUsIGl0J2xsIGJlIG1hZGUgcmVsYXRpdmUgdG8gdGhlIGVuZ2luZSdzIGJhc2UgZGlyCisgICAgICogKCB3aGljaCBkZWZhdWx0cyB0byBjYXRhbGluYS5iYXNlIHN5c3RlbSBwcm9wZXJ0eSApLgorICAgICAqCisgICAgICogQHBhcmFtIGRlZmF1bHRXZWJYbWwgVGhlIGRlZmF1bHQgd2ViIHhtbCAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0V2ViWG1sKFN0cmluZyBkZWZhdWx0V2ViWG1sKSB7CisgICAgICAgIHRoaXMuZGVmYXVsdFdlYlhtbCA9IGRlZmF1bHRXZWJYbWw7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdGltZSAoaW4gbWlsbGlzZWNvbmRzKSBpdCB0b29rIHRvIHN0YXJ0IHRoaXMgY29udGV4dC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGltZSAoaW4gbWlsbGlzZWNvbmRzKSBpdCB0b29rIHRvIHN0YXJ0IHRoaXMgY29udGV4dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRTdGFydHVwVGltZSgpIHsKKyAgICAgICAgcmV0dXJuIHN0YXJ0dXBUaW1lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFN0YXJ0dXBUaW1lKGxvbmcgc3RhcnR1cFRpbWUpIHsKKyAgICAgICAgdGhpcy5zdGFydHVwVGltZSA9IHN0YXJ0dXBUaW1lOworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGdldFRsZFNjYW5UaW1lKCkgeworICAgICAgICByZXR1cm4gdGxkU2NhblRpbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VGxkU2NhblRpbWUobG9uZyB0bGRTY2FuVGltZSkgeworICAgICAgICB0aGlzLnRsZFNjYW5UaW1lID0gdGxkU2NhblRpbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBkaXNwbGF5IG5hbWUgb2YgdGhpcyB3ZWIgYXBwbGljYXRpb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXREaXNwbGF5TmFtZSgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMuZGlzcGxheU5hbWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGFsdGVybmF0ZSBEZXBsb3ltZW50IERlc2NyaXB0b3IgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEFsdERETmFtZSgpeworICAgICAgICByZXR1cm4gYWx0REROYW1lOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IGFuIGFsdGVybmF0ZSBEZXBsb3ltZW50IERlc2NyaXB0b3IgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBbHRERE5hbWUoU3RyaW5nIGFsdERETmFtZSkgeworICAgICAgICB0aGlzLmFsdERETmFtZSA9IGFsdERETmFtZTsKKyAgICAgICAgaWYgKGNvbnRleHQgIT0gbnVsbCkgeworICAgICAgICAgICAgY29udGV4dC5zZXRBdHRyaWJ1dGUoR2xvYmFscy5BTFRfRERfQVRUUixhbHRERE5hbWUpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGNvbXBpbGVyIGNsYXNzcGF0aC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbXBpbGVyQ2xhc3NwYXRoKCl7CisgICAgICAgIHJldHVybiBjb21waWxlckNsYXNzcGF0aDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY29tcGlsZXIgY2xhc3NwYXRoLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbXBpbGVyQ2xhc3NwYXRoKFN0cmluZyBjb21waWxlckNsYXNzcGF0aCkgeworICAgICAgICB0aGlzLmNvbXBpbGVyQ2xhc3NwYXRoID0gY29tcGlsZXJDbGFzc3BhdGg7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGRpc3BsYXkgbmFtZSBvZiB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkaXNwbGF5TmFtZSBUaGUgbmV3IGRpc3BsYXkgbmFtZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERpc3BsYXlOYW1lKFN0cmluZyBkaXNwbGF5TmFtZSkgeworCisgICAgICAgIFN0cmluZyBvbGREaXNwbGF5TmFtZSA9IHRoaXMuZGlzcGxheU5hbWU7CisgICAgICAgIHRoaXMuZGlzcGxheU5hbWUgPSBkaXNwbGF5TmFtZTsKKyAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoImRpc3BsYXlOYW1lIiwgb2xkRGlzcGxheU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGxheU5hbWUpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBkaXN0cmlidXRhYmxlIGZsYWcgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldERpc3RyaWJ1dGFibGUoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLmRpc3RyaWJ1dGFibGUpOworCisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBkaXN0cmlidXRhYmxlIGZsYWcgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGRpc3RyaWJ1dGFibGUgVGhlIG5ldyBkaXN0cmlidXRhYmxlIGZsYWcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREaXN0cmlidXRhYmxlKGJvb2xlYW4gZGlzdHJpYnV0YWJsZSkgeworICAgICAgICBib29sZWFuIG9sZERpc3RyaWJ1dGFibGUgPSB0aGlzLmRpc3RyaWJ1dGFibGU7CisgICAgICAgIHRoaXMuZGlzdHJpYnV0YWJsZSA9IGRpc3RyaWJ1dGFibGU7CisgICAgICAgIHN1cHBvcnQuZmlyZVByb3BlcnR5Q2hhbmdlKCJkaXN0cmlidXRhYmxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJvb2xlYW4ob2xkRGlzdHJpYnV0YWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCb29sZWFuKHRoaXMuZGlzdHJpYnV0YWJsZSkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBkb2N1bWVudCByb290IGZvciB0aGlzIENvbnRleHQuICBUaGlzIGNhbiBiZSBhbiBhYnNvbHV0ZQorICAgICAqIHBhdGhuYW1lLCBhIHJlbGF0aXZlIHBhdGhuYW1lLCBvciBhIFVSTC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldERvY0Jhc2UoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLmRvY0Jhc2UpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGRvY3VtZW50IHJvb3QgZm9yIHRoaXMgQ29udGV4dC4gIFRoaXMgY2FuIGJlIGFuIGFic29sdXRlCisgICAgICogcGF0aG5hbWUsIGEgcmVsYXRpdmUgcGF0aG5hbWUsIG9yIGEgVVJMLgorICAgICAqCisgICAgICogQHBhcmFtIGRvY0Jhc2UgVGhlIG5ldyBkb2N1bWVudCByb290CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RG9jQmFzZShTdHJpbmcgZG9jQmFzZSkgeworCisgICAgICAgIHRoaXMuZG9jQmFzZSA9IGRvY0Jhc2U7CisKKyAgICB9CisKKyAgICAvLyBleHBlcmltZW50YWwKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0xhenkoKSB7CisgICAgICAgIHJldHVybiBsYXp5OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldExhenkoYm9vbGVhbiBsYXp5KSB7CisgICAgICAgIHRoaXMubGF6eSA9IGxhenk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGZyZXF1ZW5jeSBvZiBtYW5hZ2VyIGNoZWNrcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldE1hbmFnZXJDaGVja3NGcmVxdWVuY3koKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLm1hbmFnZXJDaGVja3NGcmVxdWVuY3kpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG1hbmFnZXIgY2hlY2tzIGZyZXF1ZW5jeS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYW5hZ2VyQ2hlY2tzRnJlcXVlbmN5IHRoZSBuZXcgbWFuYWdlciBjaGVja3MgZnJlcXVlbmN5CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWFuYWdlckNoZWNrc0ZyZXF1ZW5jeShpbnQgbWFuYWdlckNoZWNrc0ZyZXF1ZW5jeSkgeworCisgICAgICAgIGlmIChtYW5hZ2VyQ2hlY2tzRnJlcXVlbmN5IDw9IDApIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGludCBvbGRNYW5hZ2VyQ2hlY2tzRnJlcXVlbmN5ID0gdGhpcy5tYW5hZ2VyQ2hlY2tzRnJlcXVlbmN5OworICAgICAgICB0aGlzLm1hbmFnZXJDaGVja3NGcmVxdWVuY3kgPSBtYW5hZ2VyQ2hlY2tzRnJlcXVlbmN5OworICAgICAgICBzdXBwb3J0LmZpcmVQcm9wZXJ0eUNoYW5nZSgibWFuYWdlckNoZWNrc0ZyZXF1ZW5jeSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbnRlZ2VyKG9sZE1hbmFnZXJDaGVja3NGcmVxdWVuY3kpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSW50ZWdlcih0aGlzLm1hbmFnZXJDaGVja3NGcmVxdWVuY3kpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgQ29udGFpbmVyIGltcGxlbWVudGF0aW9uIGFuZAorICAgICAqIHRoZSBjb3JyZXNwb25kaW5nIHZlcnNpb24gbnVtYmVyLCBpbiB0aGUgZm9ybWF0CisgICAgICogPGNvZGU+Jmx0O2Rlc2NyaXB0aW9uJmd0Oy8mbHQ7dmVyc2lvbiZndDs8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5mbygpIHsKKworICAgICAgICByZXR1cm4gKGluZm8pOworCisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRFbmdpbmVOYW1lKCkgeworICAgICAgICBpZiggZW5naW5lTmFtZSAhPSBudWxsICkgcmV0dXJuIGVuZ2luZU5hbWU7CisgICAgICAgIHJldHVybiBkb21haW47CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RW5naW5lTmFtZShTdHJpbmcgZW5naW5lTmFtZSkgeworICAgICAgICB0aGlzLmVuZ2luZU5hbWUgPSBlbmdpbmVOYW1lOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SjJFRUFwcGxpY2F0aW9uKCkgeworICAgICAgICByZXR1cm4gajJFRUFwcGxpY2F0aW9uOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEoyRUVBcHBsaWNhdGlvbihTdHJpbmcgajJFRUFwcGxpY2F0aW9uKSB7CisgICAgICAgIHRoaXMuajJFRUFwcGxpY2F0aW9uID0gajJFRUFwcGxpY2F0aW9uOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SjJFRVNlcnZlcigpIHsKKyAgICAgICAgcmV0dXJuIGoyRUVTZXJ2ZXI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SjJFRVNlcnZlcihTdHJpbmcgajJFRVNlcnZlcikgeworICAgICAgICB0aGlzLmoyRUVTZXJ2ZXIgPSBqMkVFU2VydmVyOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBMb2FkZXIgd2l0aCB3aGljaCB0aGlzIENvbnRleHQgaXMgYXNzb2NpYXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsb2FkZXIgVGhlIG5ld2x5IGFzc29jaWF0ZWQgbG9hZGVyCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldExvYWRlcihMb2FkZXIgbG9hZGVyKSB7CisKKyAgICAgICAgc3VwZXIuc2V0TG9hZGVyKGxvYWRlcik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbG9naW4gY29uZmlndXJhdGlvbiBkZXNjcmlwdG9yIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgTG9naW5Db25maWcgZ2V0TG9naW5Db25maWcoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLmxvZ2luQ29uZmlnKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBsb2dpbiBjb25maWd1cmF0aW9uIGRlc2NyaXB0b3IgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbmZpZyBUaGUgbmV3IGxvZ2luIGNvbmZpZ3VyYXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMb2dpbkNvbmZpZyhMb2dpbkNvbmZpZyBjb25maWcpIHsKKworICAgICAgICAvLyBWYWxpZGF0ZSB0aGUgaW5jb21pbmcgcHJvcGVydHkgdmFsdWUKKyAgICAgICAgaWYgKGNvbmZpZyA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInN0YW5kYXJkQ29udGV4dC5sb2dpbkNvbmZpZy5yZXF1aXJlZCIpKTsKKyAgICAgICAgU3RyaW5nIGxvZ2luUGFnZSA9IGNvbmZpZy5nZXRMb2dpblBhZ2UoKTsKKyAgICAgICAgaWYgKChsb2dpblBhZ2UgIT0gbnVsbCkgJiYgIWxvZ2luUGFnZS5zdGFydHNXaXRoKCIvIikpIHsKKyAgICAgICAgICAgIGlmIChpc1NlcnZsZXQyMigpKSB7CisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKHNtLmdldFN0cmluZygic3RhbmRhcmRDb250ZXh0LmxvZ2luQ29uZmlnLmxvZ2luV2FybmluZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dpblBhZ2UpKTsKKyAgICAgICAgICAgICAgICBjb25maWcuc2V0TG9naW5QYWdlKCIvIiArIGxvZ2luUGFnZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygic3RhbmRhcmRDb250ZXh0LmxvZ2luQ29uZmlnLmxvZ2luUGFnZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9naW5QYWdlKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIGVycm9yUGFnZSA9IGNvbmZpZy5nZXRFcnJvclBhZ2UoKTsKKyAgICAgICAgaWYgKChlcnJvclBhZ2UgIT0gbnVsbCkgJiYgIWVycm9yUGFnZS5zdGFydHNXaXRoKCIvIikpIHsKKyAgICAgICAgICAgIGlmIChpc1NlcnZsZXQyMigpKSB7CisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKHNtLmdldFN0cmluZygic3RhbmRhcmRDb250ZXh0LmxvZ2luQ29uZmlnLmVycm9yV2FybmluZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvclBhZ2UpKTsKKyAgICAgICAgICAgICAgICBjb25maWcuc2V0RXJyb3JQYWdlKCIvIiArIGVycm9yUGFnZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygic3RhbmRhcmRDb250ZXh0LmxvZ2luQ29uZmlnLmVycm9yUGFnZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JQYWdlKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBQcm9jZXNzIHRoZSBwcm9wZXJ0eSBzZXR0aW5nIGNoYW5nZQorICAgICAgICBMb2dpbkNvbmZpZyBvbGRMb2dpbkNvbmZpZyA9IHRoaXMubG9naW5Db25maWc7CisgICAgICAgIHRoaXMubG9naW5Db25maWcgPSBjb25maWc7CisgICAgICAgIHN1cHBvcnQuZmlyZVByb3BlcnR5Q2hhbmdlKCJsb2dpbkNvbmZpZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZExvZ2luQ29uZmlnLCB0aGlzLmxvZ2luQ29uZmlnKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBtYXBwZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb250ZXh0LgorICAgICAqLworICAgIHB1YmxpYyBvcmcuYXBhY2hlLnRvbWNhdC51dGlsLmh0dHAubWFwcGVyLk1hcHBlciBnZXRNYXBwZXIoKSB7CisgICAgICAgIHJldHVybiAobWFwcGVyKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbmFtaW5nIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWIgYXBwbGljYXRpb24uCisgICAgICovCisgICAgcHVibGljIE5hbWluZ1Jlc291cmNlcyBnZXROYW1pbmdSZXNvdXJjZXMoKSB7CisKKyAgICAgICAgaWYgKG5hbWluZ1Jlc291cmNlcyA9PSBudWxsKSB7CisgICAgICAgICAgICBzZXROYW1pbmdSZXNvdXJjZXMobmV3IE5hbWluZ1Jlc291cmNlcygpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKG5hbWluZ1Jlc291cmNlcyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbmFtaW5nIHJlc291cmNlcyBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtaW5nUmVzb3VyY2VzIFRoZSBuZXcgbmFtaW5nIHJlc291cmNlcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE5hbWluZ1Jlc291cmNlcyhOYW1pbmdSZXNvdXJjZXMgbmFtaW5nUmVzb3VyY2VzKSB7CisKKyAgICAgICAgLy8gUHJvY2VzcyB0aGUgcHJvcGVydHkgc2V0dGluZyBjaGFuZ2UKKyAgICAgICAgTmFtaW5nUmVzb3VyY2VzIG9sZE5hbWluZ1Jlc291cmNlcyA9IHRoaXMubmFtaW5nUmVzb3VyY2VzOworICAgICAgICB0aGlzLm5hbWluZ1Jlc291cmNlcyA9IG5hbWluZ1Jlc291cmNlczsKKyAgICAgICAgbmFtaW5nUmVzb3VyY2VzLnNldENvbnRhaW5lcih0aGlzKTsKKyAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoIm5hbWluZ1Jlc291cmNlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZE5hbWluZ1Jlc291cmNlcywgdGhpcy5uYW1pbmdSZXNvdXJjZXMpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGNvbnRleHQgcGF0aCBmb3IgdGhpcyBDb250ZXh0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpIHsKKworICAgICAgICByZXR1cm4gKGdldE5hbWUoKSk7CisKKyAgICB9CisKKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNvbnRleHQgcGF0aCBmb3IgdGhpcyBDb250ZXh0LgorICAgICAqIDxwPgorICAgICAqIDxiPklNUExFTUVOVEFUSU9OIE5PVEU8L2I+OiAgVGhlIGNvbnRleHQgcGF0aCBpcyB1c2VkIGFzIHRoZSAibmFtZSIgb2YKKyAgICAgKiBhIENvbnRleHQsIGJlY2F1c2UgaXQgbXVzdCBiZSB1bmlxdWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0aCBUaGUgbmV3IGNvbnRleHQgcGF0aAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhdGgoU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgLy8gWFhYIFVzZSBob3N0IGluIG5hbWUKKyAgICAgICAgc2V0TmFtZShSZXF1ZXN0VXRpbC5VUkxEZWNvZGUocGF0aCkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHB1YmxpYyBpZGVudGlmaWVyIG9mIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgRFREIHRoYXQgaXMKKyAgICAgKiBjdXJyZW50bHkgYmVpbmcgcGFyc2VkLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHVibGljSWQoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLnB1YmxpY0lkKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBwdWJsaWMgaWRlbnRpZmllciBvZiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIERURCB0aGF0IGlzCisgICAgICogY3VycmVudGx5IGJlaW5nIHBhcnNlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwdWJsaWNJZCBUaGUgcHVibGljIGlkZW50aWZpZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQdWJsaWNJZChTdHJpbmcgcHVibGljSWQpIHsKKworICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoIlNldHRpbmcgZGVwbG95bWVudCBkZXNjcmlwdG9yIHB1YmxpYyBJRCB0byAnIiArCisgICAgICAgICAgICAgICAgcHVibGljSWQgKyAiJyIpOworCisgICAgICAgIFN0cmluZyBvbGRQdWJsaWNJZCA9IHRoaXMucHVibGljSWQ7CisgICAgICAgIHRoaXMucHVibGljSWQgPSBwdWJsaWNJZDsKKyAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoInB1YmxpY0lkIiwgb2xkUHVibGljSWQsIHB1YmxpY0lkKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSByZWxvYWRhYmxlIGZsYWcgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldFJlbG9hZGFibGUoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLnJlbG9hZGFibGUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIERlZmF1bHRDb250ZXh0IG92ZXJyaWRlIGZsYWcgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldE92ZXJyaWRlKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5vdmVycmlkZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcHJpdmlsZWdlZCBmbGFnIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRQcml2aWxlZ2VkKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5wcml2aWxlZ2VkKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBwcml2aWxlZ2VkIGZsYWcgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHByaXZpbGVnZWQgVGhlIG5ldyBwcml2aWxlZ2VkIGZsYWcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcml2aWxlZ2VkKGJvb2xlYW4gcHJpdmlsZWdlZCkgeworCisgICAgICAgIGJvb2xlYW4gb2xkUHJpdmlsZWdlZCA9IHRoaXMucHJpdmlsZWdlZDsKKyAgICAgICAgdGhpcy5wcml2aWxlZ2VkID0gcHJpdmlsZWdlZDsKKyAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoInByaXZpbGVnZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQm9vbGVhbihvbGRQcml2aWxlZ2VkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJvb2xlYW4odGhpcy5wcml2aWxlZ2VkKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcmVsb2FkYWJsZSBmbGFnIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWxvYWRhYmxlIFRoZSBuZXcgcmVsb2FkYWJsZSBmbGFnCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVsb2FkYWJsZShib29sZWFuIHJlbG9hZGFibGUpIHsKKworICAgICAgICBib29sZWFuIG9sZFJlbG9hZGFibGUgPSB0aGlzLnJlbG9hZGFibGU7CisgICAgICAgIHRoaXMucmVsb2FkYWJsZSA9IHJlbG9hZGFibGU7CisgICAgICAgIHN1cHBvcnQuZmlyZVByb3BlcnR5Q2hhbmdlKCJyZWxvYWRhYmxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJvb2xlYW4ob2xkUmVsb2FkYWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCb29sZWFuKHRoaXMucmVsb2FkYWJsZSkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIERlZmF1bHRDb250ZXh0IG92ZXJyaWRlIGZsYWcgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIG92ZXJyaWRlIFRoZSBuZXcgb3ZlcnJpZGUgZmxhZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE92ZXJyaWRlKGJvb2xlYW4gb3ZlcnJpZGUpIHsKKworICAgICAgICBib29sZWFuIG9sZE92ZXJyaWRlID0gdGhpcy5vdmVycmlkZTsKKyAgICAgICAgdGhpcy5vdmVycmlkZSA9IG92ZXJyaWRlOworICAgICAgICBzdXBwb3J0LmZpcmVQcm9wZXJ0eUNoYW5nZSgib3ZlcnJpZGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQm9vbGVhbihvbGRPdmVycmlkZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCb29sZWFuKHRoaXMub3ZlcnJpZGUpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSAicmVwbGFjZSB3ZWxjb21lIGZpbGVzIiBwcm9wZXJ0eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JlcGxhY2VXZWxjb21lRmlsZXMoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLnJlcGxhY2VXZWxjb21lRmlsZXMpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlICJyZXBsYWNlIHdlbGNvbWUgZmlsZXMiIHByb3BlcnR5LgorICAgICAqCisgICAgICogQHBhcmFtIHJlcGxhY2VXZWxjb21lRmlsZXMgVGhlIG5ldyBwcm9wZXJ0eSB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlcGxhY2VXZWxjb21lRmlsZXMoYm9vbGVhbiByZXBsYWNlV2VsY29tZUZpbGVzKSB7CisKKyAgICAgICAgYm9vbGVhbiBvbGRSZXBsYWNlV2VsY29tZUZpbGVzID0gdGhpcy5yZXBsYWNlV2VsY29tZUZpbGVzOworICAgICAgICB0aGlzLnJlcGxhY2VXZWxjb21lRmlsZXMgPSByZXBsYWNlV2VsY29tZUZpbGVzOworICAgICAgICBzdXBwb3J0LmZpcmVQcm9wZXJ0eUNoYW5nZSgicmVwbGFjZVdlbGNvbWVGaWxlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCb29sZWFuKG9sZFJlcGxhY2VXZWxjb21lRmlsZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQm9vbGVhbih0aGlzLnJlcGxhY2VXZWxjb21lRmlsZXMpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXJ2bGV0IGNvbnRleHQgZm9yIHdoaWNoIHRoaXMgQ29udGV4dCBpcyBhIGZhY2FkZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2VydmxldENvbnRleHQgZ2V0U2VydmxldENvbnRleHQoKSB7CisKKyAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkgeworICAgICAgICAgICAgY29udGV4dCA9IG5ldyBBcHBsaWNhdGlvbkNvbnRleHQoZ2V0QmFzZVBhdGgoKSwgdGhpcyk7CisgICAgICAgICAgICBpZiAoYWx0REROYW1lICE9IG51bGwpCisgICAgICAgICAgICAgICAgY29udGV4dC5zZXRBdHRyaWJ1dGUoR2xvYmFscy5BTFRfRERfQVRUUixhbHRERE5hbWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoY29udGV4dC5nZXRGYWNhZGUoKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZGVmYXVsdCBzZXNzaW9uIHRpbWVvdXQgKGluIG1pbnV0ZXMpIGZvciB0aGlzCisgICAgICogd2ViIGFwcGxpY2F0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0U2Vzc2lvblRpbWVvdXQoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLnNlc3Npb25UaW1lb3V0KTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBkZWZhdWx0IHNlc3Npb24gdGltZW91dCAoaW4gbWludXRlcykgZm9yIHRoaXMKKyAgICAgKiB3ZWIgYXBwbGljYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGltZW91dCBUaGUgbmV3IGRlZmF1bHQgc2Vzc2lvbiB0aW1lb3V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2Vzc2lvblRpbWVvdXQoaW50IHRpbWVvdXQpIHsKKworICAgICAgICBpbnQgb2xkU2Vzc2lvblRpbWVvdXQgPSB0aGlzLnNlc3Npb25UaW1lb3V0OworICAgICAgICAvKgorICAgICAgICAgKiBTUlYuMTMuNCAoIkRlcGxveW1lbnQgRGVzY3JpcHRvciIpOgorICAgICAgICAgKiBJZiB0aGUgdGltZW91dCBpcyAwIG9yIGxlc3MsIHRoZSBjb250YWluZXIgZW5zdXJlcyB0aGUgZGVmYXVsdAorICAgICAgICAgKiBiZWhhdmlvdXIgb2Ygc2Vzc2lvbnMgaXMgbmV2ZXIgdG8gdGltZSBvdXQuCisgICAgICAgICAqLworICAgICAgICB0aGlzLnNlc3Npb25UaW1lb3V0ID0gKHRpbWVvdXQgPT0gMCkgPyAtMSA6IHRpbWVvdXQ7CisgICAgICAgIHN1cHBvcnQuZmlyZVByb3BlcnR5Q2hhbmdlKCJzZXNzaW9uVGltZW91dCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbnRlZ2VyKG9sZFNlc3Npb25UaW1lb3V0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEludGVnZXIodGhpcy5zZXNzaW9uVGltZW91dCkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBzd2FsbG93T3V0cHV0IGZsYWcuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0U3dhbGxvd091dHB1dCgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMuc3dhbGxvd091dHB1dCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdmFsdWUgb2YgdGhlIHN3YWxsb3dPdXRwdXQgZmxhZy4gSWYgc2V0IHRvIHRydWUsIHRoZSBzeXN0ZW0ub3V0CisgICAgICogYW5kIHN5c3RlbS5lcnIgd2lsbCBiZSByZWRpcmVjdGVkIHRvIHRoZSBsb2dnZXIgZHVyaW5nIGEgc2VydmxldAorICAgICAqIGV4ZWN1dGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzd2FsbG93T3V0cHV0IFRoZSBuZXcgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTd2FsbG93T3V0cHV0KGJvb2xlYW4gc3dhbGxvd091dHB1dCkgeworCisgICAgICAgIGJvb2xlYW4gb2xkU3dhbGxvd091dHB1dCA9IHRoaXMuc3dhbGxvd091dHB1dDsKKyAgICAgICAgdGhpcy5zd2FsbG93T3V0cHV0ID0gc3dhbGxvd091dHB1dDsKKyAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoInN3YWxsb3dPdXRwdXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQm9vbGVhbihvbGRTd2FsbG93T3V0cHV0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJvb2xlYW4odGhpcy5zd2FsbG93T3V0cHV0KSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFVucGFjayBXQVIgZmxhZyBhY2Nlc3Nvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRVbnBhY2tXQVIoKSB7CisKKyAgICAgICAgcmV0dXJuICh1bnBhY2tXQVIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBVbnBhY2sgV0FSIGZsYWcgbXV0YXRvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVbnBhY2tXQVIoYm9vbGVhbiB1bnBhY2tXQVIpIHsKKworICAgICAgICB0aGlzLnVucGFja1dBUiA9IHVucGFja1dBUjsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgSmF2YSBjbGFzcyBuYW1lIG9mIHRoZSBXcmFwcGVyIGltcGxlbWVudGF0aW9uIHVzZWQKKyAgICAgKiBmb3Igc2VydmxldHMgcmVnaXN0ZXJlZCBpbiB0aGlzIENvbnRleHQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRXcmFwcGVyQ2xhc3MoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLndyYXBwZXJDbGFzcyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgSmF2YSBjbGFzcyBuYW1lIG9mIHRoZSBXcmFwcGVyIGltcGxlbWVudGF0aW9uIHVzZWQKKyAgICAgKiBmb3Igc2VydmxldHMgcmVnaXN0ZXJlZCBpbiB0aGlzIENvbnRleHQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gd3JhcHBlckNsYXNzIFRoZSBuZXcgd3JhcHBlciBjbGFzcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFdyYXBwZXJDbGFzcyhTdHJpbmcgd3JhcHBlckNsYXNzKSB7CisKKyAgICAgICAgdGhpcy53cmFwcGVyQ2xhc3MgPSB3cmFwcGVyQ2xhc3M7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcmVzb3VyY2VzIERpckNvbnRleHQgb2JqZWN0IHdpdGggd2hpY2ggdGhpcyBDb250YWluZXIgaXMKKyAgICAgKiBhc3NvY2lhdGVkLgorICAgICAqCisgICAgICogQHBhcmFtIHJlc291cmNlcyBUaGUgbmV3bHkgYXNzb2NpYXRlZCBEaXJDb250ZXh0CisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFJlc291cmNlcyhEaXJDb250ZXh0IHJlc291cmNlcykgeworCisgICAgICAgIGlmIChzdGFydGVkKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygic3RhbmRhcmRDb250ZXh0LnJlc291cmNlcy5zdGFydGVkIikpOworICAgICAgICB9CisKKyAgICAgICAgRGlyQ29udGV4dCBvbGRSZXNvdXJjZXMgPSB0aGlzLndlYmFwcFJlc291cmNlczsKKyAgICAgICAgaWYgKG9sZFJlc291cmNlcyA9PSByZXNvdXJjZXMpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgaWYgKHJlc291cmNlcyBpbnN0YW5jZW9mIEJhc2VEaXJDb250ZXh0KSB7CisgICAgICAgICAgICAoKEJhc2VEaXJDb250ZXh0KSByZXNvdXJjZXMpLnNldENhY2hlZChpc0NhY2hpbmdBbGxvd2VkKCkpOworICAgICAgICAgICAgKChCYXNlRGlyQ29udGV4dCkgcmVzb3VyY2VzKS5zZXRDYWNoZVRUTChnZXRDYWNoZVRUTCgpKTsKKyAgICAgICAgICAgICgoQmFzZURpckNvbnRleHQpIHJlc291cmNlcykuc2V0Q2FjaGVNYXhTaXplKGdldENhY2hlTWF4U2l6ZSgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVzb3VyY2VzIGluc3RhbmNlb2YgRmlsZURpckNvbnRleHQpIHsKKyAgICAgICAgICAgIGZpbGVzeXN0ZW1CYXNlZCA9IHRydWU7CisgICAgICAgICAgICAoKEZpbGVEaXJDb250ZXh0KSByZXNvdXJjZXMpLnNldENhc2VTZW5zaXRpdmUoaXNDYXNlU2Vuc2l0aXZlKCkpOworICAgICAgICAgICAgKChGaWxlRGlyQ29udGV4dCkgcmVzb3VyY2VzKS5zZXRBbGxvd0xpbmtpbmcoaXNBbGxvd0xpbmtpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy53ZWJhcHBSZXNvdXJjZXMgPSByZXNvdXJjZXM7CisKKyAgICAgICAgLy8gVGhlIHByb3hpZWQgcmVzb3VyY2VzIHdpbGwgYmUgcmVmcmVzaGVkIG9uIHN0YXJ0CisgICAgICAgIHRoaXMucmVzb3VyY2VzID0gbnVsbDsKKworICAgICAgICBzdXBwb3J0LmZpcmVQcm9wZXJ0eUNoYW5nZSgicmVzb3VyY2VzIiwgb2xkUmVzb3VyY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndlYmFwcFJlc291cmNlcyk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIExvY2FsZSB0byBjaGFyYWN0ZXIgc2V0IG1hcHBlciBjbGFzcyBmb3IgdGhpcyBDb250ZXh0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2hhcnNldE1hcHBlckNsYXNzKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5jaGFyc2V0TWFwcGVyQ2xhc3MpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIExvY2FsZSB0byBjaGFyYWN0ZXIgc2V0IG1hcHBlciBjbGFzcyBmb3IgdGhpcyBDb250ZXh0LgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBlciBUaGUgbmV3IG1hcHBlciBjbGFzcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENoYXJzZXRNYXBwZXJDbGFzcyhTdHJpbmcgbWFwcGVyKSB7CisKKyAgICAgICAgU3RyaW5nIG9sZENoYXJzZXRNYXBwZXJDbGFzcyA9IHRoaXMuY2hhcnNldE1hcHBlckNsYXNzOworICAgICAgICB0aGlzLmNoYXJzZXRNYXBwZXJDbGFzcyA9IG1hcHBlcjsKKyAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoImNoYXJzZXRNYXBwZXJDbGFzcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZENoYXJzZXRNYXBwZXJDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFyc2V0TWFwcGVyQ2xhc3MpOworCisgICAgfQorCisKKyAgICAvKiogR2V0IHRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB3b3JrIGRpci4KKyAgICAgKiAgVG8gYXZvaWQgZHVwbGljYXRpb24uCisgICAgICogCisgICAgICogQHJldHVybiBUaGUgd29yayBwYXRoCisgICAgICovIAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0V29ya1BhdGgoKSB7CisgICAgICAgIEZpbGUgd29ya0RpciA9IG5ldyBGaWxlKGdldFdvcmtEaXIoKSk7CisgICAgICAgIGlmICghd29ya0Rpci5pc0Fic29sdXRlKCkpIHsKKyAgICAgICAgICAgIEZpbGUgY2F0YWxpbmFIb21lID0gZW5naW5lQmFzZSgpOworICAgICAgICAgICAgU3RyaW5nIGNhdGFsaW5hSG9tZVBhdGggPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjYXRhbGluYUhvbWVQYXRoID0gY2F0YWxpbmFIb21lLmdldENhbm9uaWNhbFBhdGgoKTsKKyAgICAgICAgICAgICAgICB3b3JrRGlyID0gbmV3IEZpbGUoY2F0YWxpbmFIb21lUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldFdvcmtEaXIoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHdvcmtEaXIuZ2V0QWJzb2x1dGVQYXRoKCk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgd29yayBkaXJlY3RvcnkgZm9yIHRoaXMgQ29udGV4dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFdvcmtEaXIoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLndvcmtEaXIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHdvcmsgZGlyZWN0b3J5IGZvciB0aGlzIENvbnRleHQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gd29ya0RpciBUaGUgbmV3IHdvcmsgZGlyZWN0b3J5CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0V29ya0RpcihTdHJpbmcgd29ya0RpcikgeworCisgICAgICAgIHRoaXMud29ya0RpciA9IHdvcmtEaXI7CisKKyAgICAgICAgaWYgKHN0YXJ0ZWQpCisgICAgICAgICAgICBwb3N0V29ya0RpcmVjdG9yeSgpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTYXZlIGNvbmZpZyA/CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNTYXZlQ29uZmlnKCkgeworICAgICAgICByZXR1cm4gc2F2ZUNvbmZpZzsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCBzYXZlIGNvbmZpZyBmbGFnLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNhdmVDb25maWcoYm9vbGVhbiBzYXZlQ29uZmlnKSB7CisgICAgICAgIHRoaXMuc2F2ZUNvbmZpZyA9IHNhdmVDb25maWc7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb250ZXh0IE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogQWRkIGEgbmV3IExpc3RlbmVyIGNsYXNzIG5hbWUgdG8gdGhlIHNldCBvZiBMaXN0ZW5lcnMKKyAgICAgKiBjb25maWd1cmVkIGZvciB0aGlzIGFwcGxpY2F0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIEphdmEgY2xhc3MgbmFtZSBvZiBhIGxpc3RlbmVyIGNsYXNzCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQXBwbGljYXRpb25MaXN0ZW5lcihTdHJpbmcgbGlzdGVuZXIpIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKGFwcGxpY2F0aW9uTGlzdGVuZXJzKSB7CisgICAgICAgICAgICBTdHJpbmcgcmVzdWx0c1tdID1uZXcgU3RyaW5nW2FwcGxpY2F0aW9uTGlzdGVuZXJzLmxlbmd0aCArIDFdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcHBsaWNhdGlvbkxpc3RlbmVycy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChsaXN0ZW5lci5lcXVhbHMoYXBwbGljYXRpb25MaXN0ZW5lcnNbaV0pKQorICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgcmVzdWx0c1tpXSA9IGFwcGxpY2F0aW9uTGlzdGVuZXJzW2ldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzdWx0c1thcHBsaWNhdGlvbkxpc3RlbmVycy5sZW5ndGhdID0gbGlzdGVuZXI7CisgICAgICAgICAgICBhcHBsaWNhdGlvbkxpc3RlbmVycyA9IHJlc3VsdHM7CisgICAgICAgIH0KKyAgICAgICAgZmlyZUNvbnRhaW5lckV2ZW50KCJhZGRBcHBsaWNhdGlvbkxpc3RlbmVyIiwgbGlzdGVuZXIpOworCisgICAgICAgIC8vIEZJWE1FIC0gYWRkIGluc3RhbmNlIGlmIGFscmVhZHkgc3RhcnRlZD8KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQWRkIGEgbmV3IGFwcGxpY2F0aW9uIHBhcmFtZXRlciBmb3IgdGhpcyBhcHBsaWNhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJhbWV0ZXIgVGhlIG5ldyBhcHBsaWNhdGlvbiBwYXJhbWV0ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRBcHBsaWNhdGlvblBhcmFtZXRlcihBcHBsaWNhdGlvblBhcmFtZXRlciBwYXJhbWV0ZXIpIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKGFwcGxpY2F0aW9uUGFyYW1ldGVycykgeworICAgICAgICAgICAgU3RyaW5nIG5ld05hbWUgPSBwYXJhbWV0ZXIuZ2V0TmFtZSgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcHBsaWNhdGlvblBhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAobmV3TmFtZS5lcXVhbHMoYXBwbGljYXRpb25QYXJhbWV0ZXJzW2ldLmdldE5hbWUoKSkgJiYKKyAgICAgICAgICAgICAgICAgICAgIWFwcGxpY2F0aW9uUGFyYW1ldGVyc1tpXS5nZXRPdmVycmlkZSgpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBcHBsaWNhdGlvblBhcmFtZXRlciByZXN1bHRzW10gPQorICAgICAgICAgICAgICAgIG5ldyBBcHBsaWNhdGlvblBhcmFtZXRlclthcHBsaWNhdGlvblBhcmFtZXRlcnMubGVuZ3RoICsgMV07CisgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGFwcGxpY2F0aW9uUGFyYW1ldGVycywgMCwgcmVzdWx0cywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb25QYXJhbWV0ZXJzLmxlbmd0aCk7CisgICAgICAgICAgICByZXN1bHRzW2FwcGxpY2F0aW9uUGFyYW1ldGVycy5sZW5ndGhdID0gcGFyYW1ldGVyOworICAgICAgICAgICAgYXBwbGljYXRpb25QYXJhbWV0ZXJzID0gcmVzdWx0czsKKyAgICAgICAgfQorICAgICAgICBmaXJlQ29udGFpbmVyRXZlbnQoImFkZEFwcGxpY2F0aW9uUGFyYW1ldGVyIiwgcGFyYW1ldGVyKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQWRkIGEgY2hpbGQgQ29udGFpbmVyLCBvbmx5IGlmIHRoZSBwcm9wb3NlZCBjaGlsZCBpcyBhbiBpbXBsZW1lbnRhdGlvbgorICAgICAqIG9mIFdyYXBwZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2hpbGQgQ2hpbGQgY29udGFpbmVyIHRvIGJlIGFkZGVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgcHJvcG9zZWQgY29udGFpbmVyIGlzCisgICAgICogIG5vdCBhbiBpbXBsZW1lbnRhdGlvbiBvZiBXcmFwcGVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQ2hpbGQoQ29udGFpbmVyIGNoaWxkKSB7CisKKyAgICAgICAgLy8gR2xvYmFsIEpzcFNlcnZsZXQKKyAgICAgICAgV3JhcHBlciBvbGRKc3BTZXJ2bGV0ID0gbnVsbDsKKworICAgICAgICBpZiAoIShjaGlsZCBpbnN0YW5jZW9mIFdyYXBwZXIpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygic3RhbmRhcmRDb250ZXh0Lm5vdFdyYXBwZXIiKSk7CisgICAgICAgIH0KKworICAgICAgICBXcmFwcGVyIHdyYXBwZXIgPSAoV3JhcHBlcikgY2hpbGQ7CisgICAgICAgIGJvb2xlYW4gaXNKc3BTZXJ2bGV0ID0gImpzcCIuZXF1YWxzKGNoaWxkLmdldE5hbWUoKSk7CisKKyAgICAgICAgLy8gQWxsb3cgd2ViYXBwIHRvIG92ZXJyaWRlIEpzcFNlcnZsZXQgaW5oZXJpdGVkIGZyb20gZ2xvYmFsIHdlYi54bWwuCisgICAgICAgIGlmIChpc0pzcFNlcnZsZXQpIHsKKyAgICAgICAgICAgIG9sZEpzcFNlcnZsZXQgPSAoV3JhcHBlcikgZmluZENoaWxkKCJqc3AiKTsKKyAgICAgICAgICAgIGlmIChvbGRKc3BTZXJ2bGV0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZW1vdmVDaGlsZChvbGRKc3BTZXJ2bGV0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBqc3BGaWxlID0gd3JhcHBlci5nZXRKc3BGaWxlKCk7CisgICAgICAgIGlmICgoanNwRmlsZSAhPSBudWxsKSAmJiAhanNwRmlsZS5zdGFydHNXaXRoKCIvIikpIHsKKyAgICAgICAgICAgIGlmIChpc1NlcnZsZXQyMigpKSB7CisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKHNtLmdldFN0cmluZygic3RhbmRhcmRDb250ZXh0LndyYXBwZXIud2FybmluZyIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganNwRmlsZSkpOworICAgICAgICAgICAgICAgIHdyYXBwZXIuc2V0SnNwRmlsZSgiLyIgKyBqc3BGaWxlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJzdGFuZGFyZENvbnRleHQud3JhcHBlci5lcnJvciIsIGpzcEZpbGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHN1cGVyLmFkZENoaWxkKGNoaWxkKTsKKworICAgICAgICBpZiAoaXNKc3BTZXJ2bGV0ICYmIG9sZEpzcFNlcnZsZXQgIT0gbnVsbCkgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFRoZSB3ZWJhcHAtc3BlY2lmaWMgSnNwU2VydmxldCBpbmhlcml0cyBhbGwgdGhlIG1hcHBpbmdzCisgICAgICAgICAgICAgKiBzcGVjaWZpZWQgaW4gdGhlIGdsb2JhbCB3ZWIueG1sLCBhbmQgbWF5IGFkZCBhZGRpdGlvbmFsIG9uZXMuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIFN0cmluZ1tdIGpzcE1hcHBpbmdzID0gb2xkSnNwU2VydmxldC5maW5kTWFwcGluZ3MoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsganNwTWFwcGluZ3MhPW51bGwgJiYgaTxqc3BNYXBwaW5ncy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGFkZFNlcnZsZXRNYXBwaW5nKGpzcE1hcHBpbmdzW2ldLCBjaGlsZC5nZXROYW1lKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBzZWN1cml0eSBjb25zdHJhaW50IHRvIHRoZSBzZXQgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZENvbnN0cmFpbnQoU2VjdXJpdHlDb25zdHJhaW50IGNvbnN0cmFpbnQpIHsKKworICAgICAgICAvLyBWYWxpZGF0ZSB0aGUgcHJvcG9zZWQgY29uc3RyYWludAorICAgICAgICBTZWN1cml0eUNvbGxlY3Rpb24gY29sbGVjdGlvbnNbXSA9IGNvbnN0cmFpbnQuZmluZENvbGxlY3Rpb25zKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29sbGVjdGlvbnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIFN0cmluZyBwYXR0ZXJuc1tdID0gY29sbGVjdGlvbnNbaV0uZmluZFBhdHRlcm5zKCk7CisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHBhdHRlcm5zLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgcGF0dGVybnNbal0gPSBhZGp1c3RVUkxQYXR0ZXJuKHBhdHRlcm5zW2pdKTsKKyAgICAgICAgICAgICAgICBpZiAoIXZhbGlkYXRlVVJMUGF0dGVybihwYXR0ZXJuc1tqXSkpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAoInN0YW5kYXJkQ29udGV4dC5zZWN1cml0eUNvbnN0cmFpbnQucGF0dGVybiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm5zW2pdKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBBZGQgdGhpcyBjb25zdHJhaW50IHRvIHRoZSBzZXQgZm9yIG91ciB3ZWIgYXBwbGljYXRpb24KKyAgICAgICAgc3luY2hyb25pemVkIChjb25zdHJhaW50cykgeworICAgICAgICAgICAgU2VjdXJpdHlDb25zdHJhaW50IHJlc3VsdHNbXSA9CisgICAgICAgICAgICAgICAgbmV3IFNlY3VyaXR5Q29uc3RyYWludFtjb25zdHJhaW50cy5sZW5ndGggKyAxXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29uc3RyYWludHMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgcmVzdWx0c1tpXSA9IGNvbnN0cmFpbnRzW2ldOworICAgICAgICAgICAgcmVzdWx0c1tjb25zdHJhaW50cy5sZW5ndGhdID0gY29uc3RyYWludDsKKyAgICAgICAgICAgIGNvbnN0cmFpbnRzID0gcmVzdWx0czsKKyAgICAgICAgfQorCisgICAgfQorCisKKworICAgIC8qKgorICAgICAqIEFkZCBhbiBlcnJvciBwYWdlIGZvciB0aGUgc3BlY2lmaWVkIGVycm9yIG9yIEphdmEgZXhjZXB0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGVycm9yUGFnZSBUaGUgZXJyb3IgcGFnZSBkZWZpbml0aW9uIHRvIGJlIGFkZGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRXJyb3JQYWdlKEVycm9yUGFnZSBlcnJvclBhZ2UpIHsKKyAgICAgICAgLy8gVmFsaWRhdGUgdGhlIGlucHV0IHBhcmFtZXRlcnMKKyAgICAgICAgaWYgKGVycm9yUGFnZSA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInN0YW5kYXJkQ29udGV4dC5lcnJvclBhZ2UucmVxdWlyZWQiKSk7CisgICAgICAgIFN0cmluZyBsb2NhdGlvbiA9IGVycm9yUGFnZS5nZXRMb2NhdGlvbigpOworICAgICAgICBpZiAoKGxvY2F0aW9uICE9IG51bGwpICYmICFsb2NhdGlvbi5zdGFydHNXaXRoKCIvIikpIHsKKyAgICAgICAgICAgIGlmIChpc1NlcnZsZXQyMigpKSB7CisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKHNtLmdldFN0cmluZygic3RhbmRhcmRDb250ZXh0LmVycm9yUGFnZS53YXJuaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uKSk7CisgICAgICAgICAgICAgICAgZXJyb3JQYWdlLnNldExvY2F0aW9uKCIvIiArIGxvY2F0aW9uKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJzdGFuZGFyZENvbnRleHQuZXJyb3JQYWdlLmVycm9yIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gQWRkIHRoZSBzcGVjaWZpZWQgZXJyb3IgcGFnZSB0byBvdXIgaW50ZXJuYWwgY29sbGVjdGlvbnMKKyAgICAgICAgU3RyaW5nIGV4Y2VwdGlvblR5cGUgPSBlcnJvclBhZ2UuZ2V0RXhjZXB0aW9uVHlwZSgpOworICAgICAgICBpZiAoZXhjZXB0aW9uVHlwZSAhPSBudWxsKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGV4Y2VwdGlvblBhZ2VzKSB7CisgICAgICAgICAgICAgICAgZXhjZXB0aW9uUGFnZXMucHV0KGV4Y2VwdGlvblR5cGUsIGVycm9yUGFnZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHN0YXR1c1BhZ2VzKSB7CisgICAgICAgICAgICAgICAgaWYgKGVycm9yUGFnZS5nZXRFcnJvckNvZGUoKSA9PSAyMDApIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5va0Vycm9yUGFnZSA9IGVycm9yUGFnZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RhdHVzUGFnZXMucHV0KG5ldyBJbnRlZ2VyKGVycm9yUGFnZS5nZXRFcnJvckNvZGUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yUGFnZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZmlyZUNvbnRhaW5lckV2ZW50KCJhZGRFcnJvclBhZ2UiLCBlcnJvclBhZ2UpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBmaWx0ZXIgZGVmaW5pdGlvbiB0byB0aGlzIENvbnRleHQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsdGVyRGVmIFRoZSBmaWx0ZXIgZGVmaW5pdGlvbiB0byBiZSBhZGRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEZpbHRlckRlZihGaWx0ZXJEZWYgZmlsdGVyRGVmKSB7CisKKyAgICAgICAgc3luY2hyb25pemVkIChmaWx0ZXJEZWZzKSB7CisgICAgICAgICAgICBmaWx0ZXJEZWZzLnB1dChmaWx0ZXJEZWYuZ2V0RmlsdGVyTmFtZSgpLCBmaWx0ZXJEZWYpOworICAgICAgICB9CisgICAgICAgIGZpcmVDb250YWluZXJFdmVudCgiYWRkRmlsdGVyRGVmIiwgZmlsdGVyRGVmKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQWRkIGEgZmlsdGVyIG1hcHBpbmcgdG8gdGhpcyBDb250ZXh0LgorICAgICAqCisgICAgICogQHBhcmFtIGZpbHRlck1hcCBUaGUgZmlsdGVyIG1hcHBpbmcgdG8gYmUgYWRkZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBzcGVjaWZpZWQgZmlsdGVyIG5hbWUKKyAgICAgKiAgZG9lcyBub3QgbWF0Y2ggYW4gZXhpc3RpbmcgZmlsdGVyIGRlZmluaXRpb24sIG9yIHRoZSBmaWx0ZXIgbWFwcGluZworICAgICAqICBpcyBtYWxmb3JtZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRGaWx0ZXJNYXAoRmlsdGVyTWFwIGZpbHRlck1hcCkgeworCisgICAgICAgIC8vIFZhbGlkYXRlIHRoZSBwcm9wb3NlZCBmaWx0ZXIgbWFwcGluZworICAgICAgICBTdHJpbmcgZmlsdGVyTmFtZSA9IGZpbHRlck1hcC5nZXRGaWx0ZXJOYW1lKCk7CisgICAgICAgIFN0cmluZyBzZXJ2bGV0TmFtZSA9IGZpbHRlck1hcC5nZXRTZXJ2bGV0TmFtZSgpOworICAgICAgICBTdHJpbmcgdXJsUGF0dGVybiA9IGZpbHRlck1hcC5nZXRVUkxQYXR0ZXJuKCk7CisgICAgICAgIGlmIChmaW5kRmlsdGVyRGVmKGZpbHRlck5hbWUpID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygic3RhbmRhcmRDb250ZXh0LmZpbHRlck1hcC5uYW1lIiwgZmlsdGVyTmFtZSkpOworICAgICAgICBpZiAoKHNlcnZsZXROYW1lID09IG51bGwpICYmICh1cmxQYXR0ZXJuID09IG51bGwpKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInN0YW5kYXJkQ29udGV4dC5maWx0ZXJNYXAuZWl0aGVyIikpOworICAgICAgICBpZiAoKHNlcnZsZXROYW1lICE9IG51bGwpICYmICh1cmxQYXR0ZXJuICE9IG51bGwpKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInN0YW5kYXJkQ29udGV4dC5maWx0ZXJNYXAuZWl0aGVyIikpOworICAgICAgICAvLyBCZWNhdXNlIGZpbHRlci1wYXR0ZXJuIGlzIG5ldyBpbiAyLjMsIG5vIG5lZWQgdG8gYWRqdXN0CisgICAgICAgIC8vIGZvciAyLjIgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKKyAgICAgICAgaWYgKCh1cmxQYXR0ZXJuICE9IG51bGwpICYmICF2YWxpZGF0ZVVSTFBhdHRlcm4odXJsUGF0dGVybikpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygic3RhbmRhcmRDb250ZXh0LmZpbHRlck1hcC5wYXR0ZXJuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybFBhdHRlcm4pKTsKKworICAgICAgICAvLyBBZGQgdGhpcyBmaWx0ZXIgbWFwcGluZyB0byBvdXIgcmVnaXN0ZXJlZCBzZXQKKyAgICAgICAgc3luY2hyb25pemVkIChmaWx0ZXJNYXBzKSB7CisgICAgICAgICAgICBGaWx0ZXJNYXAgcmVzdWx0c1tdID1uZXcgRmlsdGVyTWFwW2ZpbHRlck1hcHMubGVuZ3RoICsgMV07CisgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGZpbHRlck1hcHMsIDAsIHJlc3VsdHMsIDAsIGZpbHRlck1hcHMubGVuZ3RoKTsKKyAgICAgICAgICAgIHJlc3VsdHNbZmlsdGVyTWFwcy5sZW5ndGhdID0gZmlsdGVyTWFwOworICAgICAgICAgICAgZmlsdGVyTWFwcyA9IHJlc3VsdHM7CisgICAgICAgIH0KKyAgICAgICAgZmlyZUNvbnRhaW5lckV2ZW50KCJhZGRGaWx0ZXJNYXAiLCBmaWx0ZXJNYXApOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBZGQgdGhlIGNsYXNzbmFtZSBvZiBhbiBJbnN0YW5jZUxpc3RlbmVyIHRvIGJlIGFkZGVkIHRvIGVhY2gKKyAgICAgKiBXcmFwcGVyIGFwcGVuZGVkIHRvIHRoaXMgQ29udGV4dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBKYXZhIGNsYXNzIG5hbWUgb2YgYW4gSW5zdGFuY2VMaXN0ZW5lciBjbGFzcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEluc3RhbmNlTGlzdGVuZXIoU3RyaW5nIGxpc3RlbmVyKSB7CisKKyAgICAgICAgc3luY2hyb25pemVkIChpbnN0YW5jZUxpc3RlbmVycykgeworICAgICAgICAgICAgU3RyaW5nIHJlc3VsdHNbXSA9bmV3IFN0cmluZ1tpbnN0YW5jZUxpc3RlbmVycy5sZW5ndGggKyAxXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5zdGFuY2VMaXN0ZW5lcnMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgcmVzdWx0c1tpXSA9IGluc3RhbmNlTGlzdGVuZXJzW2ldOworICAgICAgICAgICAgcmVzdWx0c1tpbnN0YW5jZUxpc3RlbmVycy5sZW5ndGhdID0gbGlzdGVuZXI7CisgICAgICAgICAgICBpbnN0YW5jZUxpc3RlbmVycyA9IHJlc3VsdHM7CisgICAgICAgIH0KKyAgICAgICAgZmlyZUNvbnRhaW5lckV2ZW50KCJhZGRJbnN0YW5jZUxpc3RlbmVyIiwgbGlzdGVuZXIpOworCisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIHRoZSBnaXZlbiBVUkwgcGF0dGVybiBhcyBhIGpzcC1wcm9wZXJ0eS1ncm91cC4gIFRoaXMgbWFwcworICAgICAqIHJlc291cmNlcyB0aGF0IG1hdGNoIHRoZSBnaXZlbiBwYXR0ZXJuIHNvIHRoZXkgd2lsbCBiZSBwYXNzZWQKKyAgICAgKiB0byB0aGUgSlNQIGNvbnRhaW5lci4gIFRob3VnaCB0aGVyZSBhcmUgb3RoZXIgZWxlbWVudHMgaW4gdGhlCisgICAgICogcHJvcGVydHkgZ3JvdXAsIHdlIG9ubHkgY2FyZSBhYm91dCB0aGUgVVJMIHBhdHRlcm4gaGVyZS4gIFRoZQorICAgICAqIEpTUCBjb250YWluZXIgd2lsbCBwYXJzZSB0aGUgcmVzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXR0ZXJuIFVSTCBwYXR0ZXJuIHRvIGJlIG1hcHBlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEpzcE1hcHBpbmcoU3RyaW5nIHBhdHRlcm4pIHsKKyAgICAgICAgU3RyaW5nIHNlcnZsZXROYW1lID0gZmluZFNlcnZsZXRNYXBwaW5nKCIqLmpzcCIpOworICAgICAgICBpZiAoc2VydmxldE5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgc2VydmxldE5hbWUgPSAianNwIjsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCBmaW5kQ2hpbGQoc2VydmxldE5hbWUpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFkZFNlcnZsZXRNYXBwaW5nKHBhdHRlcm4sIHNlcnZsZXROYW1lLCB0cnVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiU2tpcGluZyAiICsgcGF0dGVybiArICIgLCBubyBzZXJ2bGV0ICIgKyBzZXJ2bGV0TmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEFkZCBhIExvY2FsZSBFbmNvZGluZyBNYXBwaW5nIChzZWUgU2VjIDUuNCBvZiBTZXJ2bGV0IHNwZWMgMi40KQorICAgICAqCisgICAgICogQHBhcmFtIGxvY2FsZSBsb2NhbGUgdG8gbWFwIGFuIGVuY29kaW5nIGZvcgorICAgICAqIEBwYXJhbSBlbmNvZGluZyBlbmNvZGluZyB0byBiZSB1c2VkIGZvciBhIGdpdmUgbG9jYWxlCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkTG9jYWxlRW5jb2RpbmdNYXBwaW5nUGFyYW1ldGVyKFN0cmluZyBsb2NhbGUsIFN0cmluZyBlbmNvZGluZyl7CisgICAgICAgIGdldENoYXJzZXRNYXBwZXIoKS5hZGRDaGFyc2V0TWFwcGluZ0Zyb21EZXBsb3ltZW50RGVzY3JpcHRvcihsb2NhbGUsIGVuY29kaW5nKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEFkZCBhIG1lc3NhZ2UgZGVzdGluYXRpb24gZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIG1kIE5ldyBtZXNzYWdlIGRlc3RpbmF0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkTWVzc2FnZURlc3RpbmF0aW9uKE1lc3NhZ2VEZXN0aW5hdGlvbiBtZCkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAobWVzc2FnZURlc3RpbmF0aW9ucykgeworICAgICAgICAgICAgbWVzc2FnZURlc3RpbmF0aW9ucy5wdXQobWQuZ2V0TmFtZSgpLCBtZCk7CisgICAgICAgIH0KKyAgICAgICAgZmlyZUNvbnRhaW5lckV2ZW50KCJhZGRNZXNzYWdlRGVzdGluYXRpb24iLCBtZC5nZXROYW1lKCkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBtZXNzYWdlIGRlc3RpbmF0aW9uIHJlZmVyZW5jZSBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWRyIE5ldyBtZXNzYWdlIGRlc3RpbmF0aW9uIHJlZmVyZW5jZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZE1lc3NhZ2VEZXN0aW5hdGlvblJlZgorICAgICAgICAoTWVzc2FnZURlc3RpbmF0aW9uUmVmIG1kcikgeworCisgICAgICAgIG5hbWluZ1Jlc291cmNlcy5hZGRNZXNzYWdlRGVzdGluYXRpb25SZWYobWRyKTsKKyAgICAgICAgZmlyZUNvbnRhaW5lckV2ZW50KCJhZGRNZXNzYWdlRGVzdGluYXRpb25SZWYiLCBtZHIuZ2V0TmFtZSgpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQWRkIGEgbmV3IE1JTUUgbWFwcGluZywgcmVwbGFjaW5nIGFueSBleGlzdGluZyBtYXBwaW5nIGZvcgorICAgICAqIHRoZSBzcGVjaWZpZWQgZXh0ZW5zaW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGV4dGVuc2lvbiBGaWxlbmFtZSBleHRlbnNpb24gYmVpbmcgbWFwcGVkCisgICAgICogQHBhcmFtIG1pbWVUeXBlIENvcnJlc3BvbmRpbmcgTUlNRSB0eXBlCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkTWltZU1hcHBpbmcoU3RyaW5nIGV4dGVuc2lvbiwgU3RyaW5nIG1pbWVUeXBlKSB7CisKKyAgICAgICAgc3luY2hyb25pemVkIChtaW1lTWFwcGluZ3MpIHsKKyAgICAgICAgICAgIG1pbWVNYXBwaW5ncy5wdXQoZXh0ZW5zaW9uLCBtaW1lVHlwZSk7CisgICAgICAgIH0KKyAgICAgICAgZmlyZUNvbnRhaW5lckV2ZW50KCJhZGRNaW1lTWFwcGluZyIsIGV4dGVuc2lvbik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEFkZCBhIG5ldyBjb250ZXh0IGluaXRpYWxpemF0aW9uIHBhcmFtZXRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIG5ldyBwYXJhbWV0ZXIKKyAgICAgKiBAcGFyYW0gdmFsdWUgVmFsdWUgb2YgdGhlIG5ldyAgcGFyYW1ldGVyCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgbmFtZSBvciB2YWx1ZSBpcyBtaXNzaW5nLAorICAgICAqICBvciBpZiB0aGlzIGNvbnRleHQgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyIGhhcyBhbHJlYWR5IGJlZW4KKyAgICAgKiAgcmVnaXN0ZXJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFBhcmFtZXRlcihTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIC8vIFZhbGlkYXRlIHRoZSBwcm9wb3NlZCBjb250ZXh0IGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcgorICAgICAgICBpZiAoKG5hbWUgPT0gbnVsbCkgfHwgKHZhbHVlID09IG51bGwpKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInN0YW5kYXJkQ29udGV4dC5wYXJhbWV0ZXIucmVxdWlyZWQiKSk7CisgICAgICAgIGlmIChwYXJhbWV0ZXJzLmdldChuYW1lKSAhPSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInN0YW5kYXJkQ29udGV4dC5wYXJhbWV0ZXIuZHVwbGljYXRlIiwgbmFtZSkpOworCisgICAgICAgIC8vIEFkZCB0aGlzIHBhcmFtZXRlciB0byBvdXIgZGVmaW5lZCBzZXQKKyAgICAgICAgc3luY2hyb25pemVkIChwYXJhbWV0ZXJzKSB7CisgICAgICAgICAgICBwYXJhbWV0ZXJzLnB1dChuYW1lLCB2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgZmlyZUNvbnRhaW5lckV2ZW50KCJhZGRQYXJhbWV0ZXIiLCBuYW1lKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQWRkIGEgc2VjdXJpdHkgcm9sZSByZWZlcmVuY2UgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHJvbGUgU2VjdXJpdHkgcm9sZSB1c2VkIGluIHRoZSBhcHBsaWNhdGlvbgorICAgICAqIEBwYXJhbSBsaW5rIEFjdHVhbCBzZWN1cml0eSByb2xlIHRvIGNoZWNrIGZvcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFJvbGVNYXBwaW5nKFN0cmluZyByb2xlLCBTdHJpbmcgbGluaykgeworCisgICAgICAgIHN5bmNocm9uaXplZCAocm9sZU1hcHBpbmdzKSB7CisgICAgICAgICAgICByb2xlTWFwcGluZ3MucHV0KHJvbGUsIGxpbmspOworICAgICAgICB9CisgICAgICAgIGZpcmVDb250YWluZXJFdmVudCgiYWRkUm9sZU1hcHBpbmciLCByb2xlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQWRkIGEgbmV3IHNlY3VyaXR5IHJvbGUgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHJvbGUgTmV3IHNlY3VyaXR5IHJvbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRTZWN1cml0eVJvbGUoU3RyaW5nIHJvbGUpIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKHNlY3VyaXR5Um9sZXMpIHsKKyAgICAgICAgICAgIFN0cmluZyByZXN1bHRzW10gPW5ldyBTdHJpbmdbc2VjdXJpdHlSb2xlcy5sZW5ndGggKyAxXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VjdXJpdHlSb2xlcy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICByZXN1bHRzW2ldID0gc2VjdXJpdHlSb2xlc1tpXTsKKyAgICAgICAgICAgIHJlc3VsdHNbc2VjdXJpdHlSb2xlcy5sZW5ndGhdID0gcm9sZTsKKyAgICAgICAgICAgIHNlY3VyaXR5Um9sZXMgPSByZXN1bHRzOworICAgICAgICB9CisgICAgICAgIGZpcmVDb250YWluZXJFdmVudCgiYWRkU2VjdXJpdHlSb2xlIiwgcm9sZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEFkZCBhIG5ldyBzZXJ2bGV0IG1hcHBpbmcsIHJlcGxhY2luZyBhbnkgZXhpc3RpbmcgbWFwcGluZyBmb3IKKyAgICAgKiB0aGUgc3BlY2lmaWVkIHBhdHRlcm4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0dGVybiBVUkwgcGF0dGVybiB0byBiZSBtYXBwZWQKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBjb3JyZXNwb25kaW5nIHNlcnZsZXQgdG8gZXhlY3V0ZQorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHNwZWNpZmllZCBzZXJ2bGV0IG5hbWUKKyAgICAgKiAgaXMgbm90IGtub3duIHRvIHRoaXMgQ29udGV4dAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFNlcnZsZXRNYXBwaW5nKFN0cmluZyBwYXR0ZXJuLCBTdHJpbmcgbmFtZSkgeworICAgICAgICBhZGRTZXJ2bGV0TWFwcGluZyhwYXR0ZXJuLCBuYW1lLCBmYWxzZSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBuZXcgc2VydmxldCBtYXBwaW5nLCByZXBsYWNpbmcgYW55IGV4aXN0aW5nIG1hcHBpbmcgZm9yCisgICAgICogdGhlIHNwZWNpZmllZCBwYXR0ZXJuLgorICAgICAqCisgICAgICogQHBhcmFtIHBhdHRlcm4gVVJMIHBhdHRlcm4gdG8gYmUgbWFwcGVkCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgY29ycmVzcG9uZGluZyBzZXJ2bGV0IHRvIGV4ZWN1dGUKKyAgICAgKiBAcGFyYW0ganNwV2lsZENhcmQgdHJ1ZSBpZiBuYW1lIGlkZW50aWZpZXMgdGhlIEpzcFNlcnZsZXQKKyAgICAgKiBhbmQgcGF0dGVybiBjb250YWlucyBhIHdpbGRjYXJkOyBmYWxzZSBvdGhlcndpc2UKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBzcGVjaWZpZWQgc2VydmxldCBuYW1lCisgICAgICogIGlzIG5vdCBrbm93biB0byB0aGlzIENvbnRleHQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRTZXJ2bGV0TWFwcGluZyhTdHJpbmcgcGF0dGVybiwgU3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBqc3BXaWxkQ2FyZCkgeworICAgICAgICAvLyBWYWxpZGF0ZSB0aGUgcHJvcG9zZWQgbWFwcGluZworICAgICAgICBpZiAoZmluZENoaWxkKG5hbWUpID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygic3RhbmRhcmRDb250ZXh0LnNlcnZsZXRNYXAubmFtZSIsIG5hbWUpKTsKKyAgICAgICAgcGF0dGVybiA9IGFkanVzdFVSTFBhdHRlcm4oUmVxdWVzdFV0aWwuVVJMRGVjb2RlKHBhdHRlcm4pKTsKKyAgICAgICAgaWYgKCF2YWxpZGF0ZVVSTFBhdHRlcm4ocGF0dGVybikpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygic3RhbmRhcmRDb250ZXh0LnNlcnZsZXRNYXAucGF0dGVybiIsIHBhdHRlcm4pKTsKKworICAgICAgICAvLyBBZGQgdGhpcyBtYXBwaW5nIHRvIG91ciByZWdpc3RlcmVkIHNldAorICAgICAgICBzeW5jaHJvbml6ZWQgKHNlcnZsZXRNYXBwaW5ncykgeworICAgICAgICAgICAgU3RyaW5nIG5hbWUyID0gKFN0cmluZykgc2VydmxldE1hcHBpbmdzLmdldChwYXR0ZXJuKTsKKyAgICAgICAgICAgIGlmIChuYW1lMiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gRG9uJ3QgYWxsb3cgbW9yZSB0aGFuIG9uZSBzZXJ2bGV0IG9uIHRoZSBzYW1lIHBhdHRlcm4KKyAgICAgICAgICAgICAgICBXcmFwcGVyIHdyYXBwZXIgPSAoV3JhcHBlcikgZmluZENoaWxkKG5hbWUyKTsKKyAgICAgICAgICAgICAgICB3cmFwcGVyLnJlbW92ZU1hcHBpbmcocGF0dGVybik7CisgICAgICAgICAgICAgICAgbWFwcGVyLnJlbW92ZVdyYXBwZXIocGF0dGVybik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXJ2bGV0TWFwcGluZ3MucHV0KHBhdHRlcm4sIG5hbWUpOworICAgICAgICB9CisgICAgICAgIFdyYXBwZXIgd3JhcHBlciA9IChXcmFwcGVyKSBmaW5kQ2hpbGQobmFtZSk7CisgICAgICAgIHdyYXBwZXIuYWRkTWFwcGluZyhwYXR0ZXJuKTsKKworICAgICAgICAvLyBVcGRhdGUgY29udGV4dCBtYXBwZXIKKyAgICAgICAgbWFwcGVyLmFkZFdyYXBwZXIocGF0dGVybiwgd3JhcHBlciwganNwV2lsZENhcmQpOworCisgICAgICAgIGZpcmVDb250YWluZXJFdmVudCgiYWRkU2VydmxldE1hcHBpbmciLCBwYXR0ZXJuKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQWRkIGEgSlNQIHRhZyBsaWJyYXJ5IGZvciB0aGUgc3BlY2lmaWVkIFVSSS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmkgVVJJLCByZWxhdGl2ZSB0byB0aGUgd2ViLnhtbCBmaWxlLCBvZiB0aGlzIHRhZyBsaWJyYXJ5CisgICAgICogQHBhcmFtIGxvY2F0aW9uIExvY2F0aW9uIG9mIHRoZSB0YWcgbGlicmFyeSBkZXNjcmlwdG9yCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkVGFnbGliKFN0cmluZyB1cmksIFN0cmluZyBsb2NhdGlvbikgeworCisgICAgICAgIHN5bmNocm9uaXplZCAodGFnbGlicykgeworICAgICAgICAgICAgdGFnbGlicy5wdXQodXJpLCBsb2NhdGlvbik7CisgICAgICAgIH0KKyAgICAgICAgZmlyZUNvbnRhaW5lckV2ZW50KCJhZGRUYWdsaWIiLCB1cmkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBuZXcgd2F0Y2hlZCByZXNvdXJjZSB0byB0aGUgc2V0IHJlY29nbml6ZWQgYnkgdGhpcyBDb250ZXh0LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmV3IHdhdGNoZWQgcmVzb3VyY2UgZmlsZSBuYW1lCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkV2F0Y2hlZFJlc291cmNlKFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgc3luY2hyb25pemVkICh3YXRjaGVkUmVzb3VyY2VzKSB7CisgICAgICAgICAgICBTdHJpbmcgcmVzdWx0c1tdID0gbmV3IFN0cmluZ1t3YXRjaGVkUmVzb3VyY2VzLmxlbmd0aCArIDFdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3YXRjaGVkUmVzb3VyY2VzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIHJlc3VsdHNbaV0gPSB3YXRjaGVkUmVzb3VyY2VzW2ldOworICAgICAgICAgICAgcmVzdWx0c1t3YXRjaGVkUmVzb3VyY2VzLmxlbmd0aF0gPSBuYW1lOworICAgICAgICAgICAgd2F0Y2hlZFJlc291cmNlcyA9IHJlc3VsdHM7CisgICAgICAgIH0KKyAgICAgICAgZmlyZUNvbnRhaW5lckV2ZW50KCJhZGRXYXRjaGVkUmVzb3VyY2UiLCBuYW1lKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQWRkIGEgbmV3IHdlbGNvbWUgZmlsZSB0byB0aGUgc2V0IHJlY29nbml6ZWQgYnkgdGhpcyBDb250ZXh0LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmV3IHdlbGNvbWUgZmlsZSBuYW1lCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkV2VsY29tZUZpbGUoU3RyaW5nIG5hbWUpIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKHdlbGNvbWVGaWxlcykgeworICAgICAgICAgICAgLy8gV2VsY29tZSBmaWxlcyBmcm9tIHRoZSBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IKKyAgICAgICAgICAgIC8vIGNvbXBsZXRlbHkgcmVwbGFjZSB0aG9zZSBmcm9tIHRoZSBkZWZhdWx0IGNvbmYvd2ViLnhtbCBmaWxlCisgICAgICAgICAgICBpZiAocmVwbGFjZVdlbGNvbWVGaWxlcykgeworICAgICAgICAgICAgICAgIHdlbGNvbWVGaWxlcyA9IG5ldyBTdHJpbmdbMF07CisgICAgICAgICAgICAgICAgc2V0UmVwbGFjZVdlbGNvbWVGaWxlcyhmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJpbmcgcmVzdWx0c1tdID1uZXcgU3RyaW5nW3dlbGNvbWVGaWxlcy5sZW5ndGggKyAxXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd2VsY29tZUZpbGVzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIHJlc3VsdHNbaV0gPSB3ZWxjb21lRmlsZXNbaV07CisgICAgICAgICAgICByZXN1bHRzW3dlbGNvbWVGaWxlcy5sZW5ndGhdID0gbmFtZTsKKyAgICAgICAgICAgIHdlbGNvbWVGaWxlcyA9IHJlc3VsdHM7CisgICAgICAgIH0KKyAgICAgICAgcG9zdFdlbGNvbWVGaWxlcygpOworICAgICAgICBmaXJlQ29udGFpbmVyRXZlbnQoImFkZFdlbGNvbWVGaWxlIiwgbmFtZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEFkZCB0aGUgY2xhc3NuYW1lIG9mIGEgTGlmZWN5Y2xlTGlzdGVuZXIgdG8gYmUgYWRkZWQgdG8gZWFjaAorICAgICAqIFdyYXBwZXIgYXBwZW5kZWQgdG8gdGhpcyBDb250ZXh0LgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIEphdmEgY2xhc3MgbmFtZSBvZiBhIExpZmVjeWNsZUxpc3RlbmVyIGNsYXNzCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkV3JhcHBlckxpZmVjeWNsZShTdHJpbmcgbGlzdGVuZXIpIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKHdyYXBwZXJMaWZlY3ljbGVzKSB7CisgICAgICAgICAgICBTdHJpbmcgcmVzdWx0c1tdID1uZXcgU3RyaW5nW3dyYXBwZXJMaWZlY3ljbGVzLmxlbmd0aCArIDFdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3cmFwcGVyTGlmZWN5Y2xlcy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICByZXN1bHRzW2ldID0gd3JhcHBlckxpZmVjeWNsZXNbaV07CisgICAgICAgICAgICByZXN1bHRzW3dyYXBwZXJMaWZlY3ljbGVzLmxlbmd0aF0gPSBsaXN0ZW5lcjsKKyAgICAgICAgICAgIHdyYXBwZXJMaWZlY3ljbGVzID0gcmVzdWx0czsKKyAgICAgICAgfQorICAgICAgICBmaXJlQ29udGFpbmVyRXZlbnQoImFkZFdyYXBwZXJMaWZlY3ljbGUiLCBsaXN0ZW5lcik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEFkZCB0aGUgY2xhc3NuYW1lIG9mIGEgQ29udGFpbmVyTGlzdGVuZXIgdG8gYmUgYWRkZWQgdG8gZWFjaAorICAgICAqIFdyYXBwZXIgYXBwZW5kZWQgdG8gdGhpcyBDb250ZXh0LgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIEphdmEgY2xhc3MgbmFtZSBvZiBhIENvbnRhaW5lckxpc3RlbmVyIGNsYXNzCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkV3JhcHBlckxpc3RlbmVyKFN0cmluZyBsaXN0ZW5lcikgeworCisgICAgICAgIHN5bmNocm9uaXplZCAod3JhcHBlckxpc3RlbmVycykgeworICAgICAgICAgICAgU3RyaW5nIHJlc3VsdHNbXSA9bmV3IFN0cmluZ1t3cmFwcGVyTGlzdGVuZXJzLmxlbmd0aCArIDFdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3cmFwcGVyTGlzdGVuZXJzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIHJlc3VsdHNbaV0gPSB3cmFwcGVyTGlzdGVuZXJzW2ldOworICAgICAgICAgICAgcmVzdWx0c1t3cmFwcGVyTGlzdGVuZXJzLmxlbmd0aF0gPSBsaXN0ZW5lcjsKKyAgICAgICAgICAgIHdyYXBwZXJMaXN0ZW5lcnMgPSByZXN1bHRzOworICAgICAgICB9CisgICAgICAgIGZpcmVDb250YWluZXJFdmVudCgiYWRkV3JhcHBlckxpc3RlbmVyIiwgbGlzdGVuZXIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYW5kIHJldHVybiBhIG5ldyBXcmFwcGVyIGluc3RhbmNlLCBvZgorICAgICAqIHRoZSBKYXZhIGltcGxlbWVudGF0aW9uIGNsYXNzIGFwcHJvcHJpYXRlIGZvciB0aGlzIENvbnRleHQKKyAgICAgKiBpbXBsZW1lbnRhdGlvbi4gIFRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgaW5zdGFudGlhdGVkIFdyYXBwZXIKKyAgICAgKiB3aWxsIGhhdmUgYmVlbiBjYWxsZWQsIGJ1dCBubyBwcm9wZXJ0aWVzIHdpbGwgaGF2ZSBiZWVuIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgV3JhcHBlciBjcmVhdGVXcmFwcGVyKCkgeworICAgICAgICAvL2xvZy5pbmZvKCAiQ3JlYXRlIHdyYXBwZXIiICk7CisgICAgICAgIFdyYXBwZXIgd3JhcHBlciA9IG5ldyBTdGFuZGFyZFdyYXBwZXIoKTsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKGluc3RhbmNlTGlzdGVuZXJzKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGluc3RhbmNlTGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgQ2xhc3MgY2xhenogPSBDbGFzcy5mb3JOYW1lKGluc3RhbmNlTGlzdGVuZXJzW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgSW5zdGFuY2VMaXN0ZW5lciBsaXN0ZW5lciA9CisgICAgICAgICAgICAgICAgICAgICAgKEluc3RhbmNlTGlzdGVuZXIpIGNsYXp6Lm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICAgICAgICAgIHdyYXBwZXIuYWRkSW5zdGFuY2VMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJjcmVhdGVXcmFwcGVyIiwgdCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc3luY2hyb25pemVkICh3cmFwcGVyTGlmZWN5Y2xlcykgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3cmFwcGVyTGlmZWN5Y2xlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIENsYXNzIGNsYXp6ID0gQ2xhc3MuZm9yTmFtZSh3cmFwcGVyTGlmZWN5Y2xlc1tpXSk7CisgICAgICAgICAgICAgICAgICAgIExpZmVjeWNsZUxpc3RlbmVyIGxpc3RlbmVyID0KKyAgICAgICAgICAgICAgICAgICAgICAoTGlmZWN5Y2xlTGlzdGVuZXIpIGNsYXp6Lm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmICh3cmFwcGVyIGluc3RhbmNlb2YgTGlmZWN5Y2xlKQorICAgICAgICAgICAgICAgICAgICAgICAgKChMaWZlY3ljbGUpIHdyYXBwZXIpLmFkZExpZmVjeWNsZUxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IoImNyZWF0ZVdyYXBwZXIiLCB0KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzeW5jaHJvbml6ZWQgKHdyYXBwZXJMaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd3JhcHBlckxpc3RlbmVycy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIENsYXNzIGNsYXp6ID0gQ2xhc3MuZm9yTmFtZSh3cmFwcGVyTGlzdGVuZXJzW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgQ29udGFpbmVyTGlzdGVuZXIgbGlzdGVuZXIgPQorICAgICAgICAgICAgICAgICAgICAgIChDb250YWluZXJMaXN0ZW5lcikgY2xhenoubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgd3JhcHBlci5hZGRDb250YWluZXJMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJjcmVhdGVXcmFwcGVyIiwgdCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICh3cmFwcGVyKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXQgb2YgYXBwbGljYXRpb24gbGlzdGVuZXIgY2xhc3MgbmFtZXMgY29uZmlndXJlZAorICAgICAqIGZvciB0aGlzIGFwcGxpY2F0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBmaW5kQXBwbGljYXRpb25MaXN0ZW5lcnMoKSB7CisKKyAgICAgICAgcmV0dXJuIChhcHBsaWNhdGlvbkxpc3RlbmVycyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2V0IG9mIGFwcGxpY2F0aW9uIHBhcmFtZXRlcnMgZm9yIHRoaXMgYXBwbGljYXRpb24uCisgICAgICovCisgICAgcHVibGljIEFwcGxpY2F0aW9uUGFyYW1ldGVyW10gZmluZEFwcGxpY2F0aW9uUGFyYW1ldGVycygpIHsKKworICAgICAgICByZXR1cm4gKGFwcGxpY2F0aW9uUGFyYW1ldGVycyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2VjdXJpdHkgY29uc3RyYWludHMgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorICAgICAqIElmIHRoZXJlIGFyZSBub25lLCBhIHplcm8tbGVuZ3RoIGFycmF5IGlzIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBTZWN1cml0eUNvbnN0cmFpbnRbXSBmaW5kQ29uc3RyYWludHMoKSB7CisKKyAgICAgICAgcmV0dXJuIChjb25zdHJhaW50cyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZXJyb3IgcGFnZSBlbnRyeSBmb3IgdGhlIHNwZWNpZmllZCBIVFRQIGVycm9yIGNvZGUsCisgICAgICogaWYgYW55OyBvdGhlcndpc2UgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIGVycm9yQ29kZSBFcnJvciBjb2RlIHRvIGxvb2sgdXAKKyAgICAgKi8KKyAgICBwdWJsaWMgRXJyb3JQYWdlIGZpbmRFcnJvclBhZ2UoaW50IGVycm9yQ29kZSkgeworICAgICAgICBpZiAoZXJyb3JDb2RlID09IDIwMCkgeworICAgICAgICAgICAgcmV0dXJuIChva0Vycm9yUGFnZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gKChFcnJvclBhZ2UpIHN0YXR1c1BhZ2VzLmdldChuZXcgSW50ZWdlcihlcnJvckNvZGUpKSk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBlcnJvciBwYWdlIGVudHJ5IGZvciB0aGUgc3BlY2lmaWVkIEphdmEgZXhjZXB0aW9uIHR5cGUsCisgICAgICogaWYgYW55OyBvdGhlcndpc2UgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIGV4Y2VwdGlvblR5cGUgRXhjZXB0aW9uIHR5cGUgdG8gbG9vayB1cAorICAgICAqLworICAgIHB1YmxpYyBFcnJvclBhZ2UgZmluZEVycm9yUGFnZShTdHJpbmcgZXhjZXB0aW9uVHlwZSkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAoZXhjZXB0aW9uUGFnZXMpIHsKKyAgICAgICAgICAgIHJldHVybiAoKEVycm9yUGFnZSkgZXhjZXB0aW9uUGFnZXMuZ2V0KGV4Y2VwdGlvblR5cGUpKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNldCBvZiBkZWZpbmVkIGVycm9yIHBhZ2VzIGZvciBhbGwgc3BlY2lmaWVkIGVycm9yIGNvZGVzCisgICAgICogYW5kIGV4Y2VwdGlvbiB0eXBlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgRXJyb3JQYWdlW10gZmluZEVycm9yUGFnZXMoKSB7CisKKyAgICAgICAgc3luY2hyb25pemVkKGV4Y2VwdGlvblBhZ2VzKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQoc3RhdHVzUGFnZXMpIHsKKyAgICAgICAgICAgICAgICBFcnJvclBhZ2UgcmVzdWx0czFbXSA9IG5ldyBFcnJvclBhZ2VbZXhjZXB0aW9uUGFnZXMuc2l6ZSgpXTsKKyAgICAgICAgICAgICAgICByZXN1bHRzMSA9CisgICAgICAgICAgICAgICAgICAgIChFcnJvclBhZ2VbXSkgZXhjZXB0aW9uUGFnZXMudmFsdWVzKCkudG9BcnJheShyZXN1bHRzMSk7CisgICAgICAgICAgICAgICAgRXJyb3JQYWdlIHJlc3VsdHMyW10gPSBuZXcgRXJyb3JQYWdlW3N0YXR1c1BhZ2VzLnNpemUoKV07CisgICAgICAgICAgICAgICAgcmVzdWx0czIgPQorICAgICAgICAgICAgICAgICAgICAoRXJyb3JQYWdlW10pIHN0YXR1c1BhZ2VzLnZhbHVlcygpLnRvQXJyYXkocmVzdWx0czIpOworICAgICAgICAgICAgICAgIEVycm9yUGFnZSByZXN1bHRzW10gPQorICAgICAgICAgICAgICAgICAgICBuZXcgRXJyb3JQYWdlW3Jlc3VsdHMxLmxlbmd0aCArIHJlc3VsdHMyLmxlbmd0aF07CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHRzMS5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0c1tpXSA9IHJlc3VsdHMxW2ldOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSByZXN1bHRzMS5sZW5ndGg7IGkgPCByZXN1bHRzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgICAgICByZXN1bHRzW2ldID0gcmVzdWx0czJbaSAtIHJlc3VsdHMxLmxlbmd0aF07CisgICAgICAgICAgICAgICAgcmV0dXJuIChyZXN1bHRzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGZpbHRlciBkZWZpbml0aW9uIGZvciB0aGUgc3BlY2lmaWVkIGZpbHRlciBuYW1lLCBpZiBhbnk7CisgICAgICogb3RoZXJ3aXNlIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWx0ZXJOYW1lIEZpbHRlciBuYW1lIHRvIGxvb2sgdXAKKyAgICAgKi8KKyAgICBwdWJsaWMgRmlsdGVyRGVmIGZpbmRGaWx0ZXJEZWYoU3RyaW5nIGZpbHRlck5hbWUpIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKGZpbHRlckRlZnMpIHsKKyAgICAgICAgICAgIHJldHVybiAoKEZpbHRlckRlZikgZmlsdGVyRGVmcy5nZXQoZmlsdGVyTmFtZSkpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2V0IG9mIGRlZmluZWQgZmlsdGVycyBmb3IgdGhpcyBDb250ZXh0LgorICAgICAqLworICAgIHB1YmxpYyBGaWx0ZXJEZWZbXSBmaW5kRmlsdGVyRGVmcygpIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKGZpbHRlckRlZnMpIHsKKyAgICAgICAgICAgIEZpbHRlckRlZiByZXN1bHRzW10gPSBuZXcgRmlsdGVyRGVmW2ZpbHRlckRlZnMuc2l6ZSgpXTsKKyAgICAgICAgICAgIHJldHVybiAoKEZpbHRlckRlZltdKSBmaWx0ZXJEZWZzLnZhbHVlcygpLnRvQXJyYXkocmVzdWx0cykpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2V0IG9mIGZpbHRlciBtYXBwaW5ncyBmb3IgdGhpcyBDb250ZXh0LgorICAgICAqLworICAgIHB1YmxpYyBGaWx0ZXJNYXBbXSBmaW5kRmlsdGVyTWFwcygpIHsKKworICAgICAgICByZXR1cm4gKGZpbHRlck1hcHMpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNldCBvZiBJbnN0YW5jZUxpc3RlbmVyIGNsYXNzZXMgdGhhdCB3aWxsIGJlIGFkZGVkIHRvCisgICAgICogbmV3bHkgY3JlYXRlZCBXcmFwcGVycyBhdXRvbWF0aWNhbGx5LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBmaW5kSW5zdGFuY2VMaXN0ZW5lcnMoKSB7CisKKyAgICAgICAgcmV0dXJuIChpbnN0YW5jZUxpc3RlbmVycyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEZJWE1FOiBGb29saW5nIGludHJvc3BlY3Rpb24gLi4uCisgICAgICovCisgICAgcHVibGljIENvbnRleHQgZmluZE1hcHBpbmdPYmplY3QoKSB7CisgICAgICAgIHJldHVybiAoQ29udGV4dCkgZ2V0TWFwcGluZ09iamVjdCgpOworICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG1lc3NhZ2UgZGVzdGluYXRpb24gd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUsIGlmIGFueTsKKyAgICAgKiBvdGhlcndpc2UsIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIGRlc2lyZWQgbWVzc2FnZSBkZXN0aW5hdGlvbgorICAgICAqLworICAgIHB1YmxpYyBNZXNzYWdlRGVzdGluYXRpb24gZmluZE1lc3NhZ2VEZXN0aW5hdGlvbihTdHJpbmcgbmFtZSkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAobWVzc2FnZURlc3RpbmF0aW9ucykgeworICAgICAgICAgICAgcmV0dXJuICgoTWVzc2FnZURlc3RpbmF0aW9uKSBtZXNzYWdlRGVzdGluYXRpb25zLmdldChuYW1lKSk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXQgb2YgZGVmaW5lZCBtZXNzYWdlIGRlc3RpbmF0aW9ucyBmb3IgdGhpcyB3ZWIKKyAgICAgKiBhcHBsaWNhdGlvbi4gIElmIG5vbmUgaGF2ZSBiZWVuIGRlZmluZWQsIGEgemVyby1sZW5ndGggYXJyYXkKKyAgICAgKiBpcyByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWVzc2FnZURlc3RpbmF0aW9uW10gZmluZE1lc3NhZ2VEZXN0aW5hdGlvbnMoKSB7CisKKyAgICAgICAgc3luY2hyb25pemVkIChtZXNzYWdlRGVzdGluYXRpb25zKSB7CisgICAgICAgICAgICBNZXNzYWdlRGVzdGluYXRpb24gcmVzdWx0c1tdID0KKyAgICAgICAgICAgICAgICBuZXcgTWVzc2FnZURlc3RpbmF0aW9uW21lc3NhZ2VEZXN0aW5hdGlvbnMuc2l6ZSgpXTsKKyAgICAgICAgICAgIHJldHVybiAoKE1lc3NhZ2VEZXN0aW5hdGlvbltdKQorICAgICAgICAgICAgICAgICAgICBtZXNzYWdlRGVzdGluYXRpb25zLnZhbHVlcygpLnRvQXJyYXkocmVzdWx0cykpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWYgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUsIGlmIGFueTsKKyAgICAgKiBvdGhlcndpc2UsIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIGRlc2lyZWQgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWYKKyAgICAgKi8KKyAgICBwdWJsaWMgTWVzc2FnZURlc3RpbmF0aW9uUmVmCisgICAgICAgIGZpbmRNZXNzYWdlRGVzdGluYXRpb25SZWYoU3RyaW5nIG5hbWUpIHsKKworICAgICAgICByZXR1cm4gbmFtaW5nUmVzb3VyY2VzLmZpbmRNZXNzYWdlRGVzdGluYXRpb25SZWYobmFtZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2V0IG9mIGRlZmluZWQgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZzIGZvciB0aGlzIHdlYgorICAgICAqIGFwcGxpY2F0aW9uLiAgSWYgbm9uZSBoYXZlIGJlZW4gZGVmaW5lZCwgYSB6ZXJvLWxlbmd0aCBhcnJheQorICAgICAqIGlzIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBNZXNzYWdlRGVzdGluYXRpb25SZWZbXQorICAgICAgICBmaW5kTWVzc2FnZURlc3RpbmF0aW9uUmVmcygpIHsKKworICAgICAgICByZXR1cm4gbmFtaW5nUmVzb3VyY2VzLmZpbmRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgTUlNRSB0eXBlIHRvIHdoaWNoIHRoZSBzcGVjaWZpZWQgZXh0ZW5zaW9uIGlzIG1hcHBlZCwKKyAgICAgKiBpZiBhbnk7IG90aGVyd2lzZSByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXh0ZW5zaW9uIEV4dGVuc2lvbiB0byBtYXAgdG8gYSBNSU1FIHR5cGUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGZpbmRNaW1lTWFwcGluZyhTdHJpbmcgZXh0ZW5zaW9uKSB7CisKKyAgICAgICAgcmV0dXJuICgoU3RyaW5nKSBtaW1lTWFwcGluZ3MuZ2V0KGV4dGVuc2lvbikpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGV4dGVuc2lvbnMgZm9yIHdoaWNoIE1JTUUgbWFwcGluZ3MgYXJlIGRlZmluZWQuICBJZiB0aGVyZQorICAgICAqIGFyZSBub25lLCBhIHplcm8tbGVuZ3RoIGFycmF5IGlzIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBmaW5kTWltZU1hcHBpbmdzKCkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAobWltZU1hcHBpbmdzKSB7CisgICAgICAgICAgICBTdHJpbmcgcmVzdWx0c1tdID0gbmV3IFN0cmluZ1ttaW1lTWFwcGluZ3Muc2l6ZSgpXTsKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgICgoU3RyaW5nW10pIG1pbWVNYXBwaW5ncy5rZXlTZXQoKS50b0FycmF5KHJlc3VsdHMpKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIGNvbnRleHQgaW5pdGlhbGl6YXRpb24KKyAgICAgKiBwYXJhbWV0ZXIgbmFtZSwgaWYgYW55OyBvdGhlcndpc2UgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgcGFyYW1ldGVyIHRvIHJldHVybgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZmluZFBhcmFtZXRlcihTdHJpbmcgbmFtZSkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAocGFyYW1ldGVycykgeworICAgICAgICAgICAgcmV0dXJuICgoU3RyaW5nKSBwYXJhbWV0ZXJzLmdldChuYW1lKSk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBuYW1lcyBvZiBhbGwgZGVmaW5lZCBjb250ZXh0IGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMKKyAgICAgKiBmb3IgdGhpcyBDb250ZXh0LiAgSWYgbm8gcGFyYW1ldGVycyBhcmUgZGVmaW5lZCwgYSB6ZXJvLWxlbmd0aAorICAgICAqIGFycmF5IGlzIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBmaW5kUGFyYW1ldGVycygpIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKHBhcmFtZXRlcnMpIHsKKyAgICAgICAgICAgIFN0cmluZyByZXN1bHRzW10gPSBuZXcgU3RyaW5nW3BhcmFtZXRlcnMuc2l6ZSgpXTsKKyAgICAgICAgICAgIHJldHVybiAoKFN0cmluZ1tdKSBwYXJhbWV0ZXJzLmtleVNldCgpLnRvQXJyYXkocmVzdWx0cykpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEZvciB0aGUgZ2l2ZW4gc2VjdXJpdHkgcm9sZSAoYXMgdXNlZCBieSBhbiBhcHBsaWNhdGlvbiksIHJldHVybiB0aGUKKyAgICAgKiBjb3JyZXNwb25kaW5nIHJvbGUgbmFtZSAoYXMgZGVmaW5lZCBieSB0aGUgdW5kZXJseWluZyBSZWFsbSkgaWYgdGhlcmUKKyAgICAgKiBpcyBvbmUuICBPdGhlcndpc2UsIHJldHVybiB0aGUgc3BlY2lmaWVkIHJvbGUgdW5jaGFuZ2VkLgorICAgICAqCisgICAgICogQHBhcmFtIHJvbGUgU2VjdXJpdHkgcm9sZSB0byBtYXAKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGZpbmRSb2xlTWFwcGluZyhTdHJpbmcgcm9sZSkgeworCisgICAgICAgIFN0cmluZyByZWFsUm9sZSA9IG51bGw7CisgICAgICAgIHN5bmNocm9uaXplZCAocm9sZU1hcHBpbmdzKSB7CisgICAgICAgICAgICByZWFsUm9sZSA9IChTdHJpbmcpIHJvbGVNYXBwaW5ncy5nZXQocm9sZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlYWxSb2xlICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKHJlYWxSb2xlKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIChyb2xlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgc2VjdXJpdHkgcm9sZSBpcyBkZWZpbmVkCisgICAgICogZm9yIHRoaXMgYXBwbGljYXRpb247IG90aGVyd2lzZSByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIHJvbGUgU2VjdXJpdHkgcm9sZSB0byB2ZXJpZnkKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBmaW5kU2VjdXJpdHlSb2xlKFN0cmluZyByb2xlKSB7CisKKyAgICAgICAgc3luY2hyb25pemVkIChzZWN1cml0eVJvbGVzKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlY3VyaXR5Um9sZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAocm9sZS5lcXVhbHMoc2VjdXJpdHlSb2xlc1tpXSkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAodHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChmYWxzZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2VjdXJpdHkgcm9sZXMgZGVmaW5lZCBmb3IgdGhpcyBhcHBsaWNhdGlvbi4gIElmIG5vbmUKKyAgICAgKiBoYXZlIGJlZW4gZGVmaW5lZCwgYSB6ZXJvLWxlbmd0aCBhcnJheSBpcyByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZmluZFNlY3VyaXR5Um9sZXMoKSB7CisKKyAgICAgICAgcmV0dXJuIChzZWN1cml0eVJvbGVzKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXJ2bGV0IG5hbWUgbWFwcGVkIGJ5IHRoZSBzcGVjaWZpZWQgcGF0dGVybiAoaWYgYW55KTsKKyAgICAgKiBvdGhlcndpc2UgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIHBhdHRlcm4gUGF0dGVybiBmb3Igd2hpY2ggYSBtYXBwaW5nIGlzIHJlcXVlc3RlZAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZmluZFNlcnZsZXRNYXBwaW5nKFN0cmluZyBwYXR0ZXJuKSB7CisKKyAgICAgICAgc3luY2hyb25pemVkIChzZXJ2bGV0TWFwcGluZ3MpIHsKKyAgICAgICAgICAgIHJldHVybiAoKFN0cmluZykgc2VydmxldE1hcHBpbmdzLmdldChwYXR0ZXJuKSk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBwYXR0ZXJucyBvZiBhbGwgZGVmaW5lZCBzZXJ2bGV0IG1hcHBpbmdzIGZvciB0aGlzCisgICAgICogQ29udGV4dC4gIElmIG5vIG1hcHBpbmdzIGFyZSBkZWZpbmVkLCBhIHplcm8tbGVuZ3RoIGFycmF5IGlzIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBmaW5kU2VydmxldE1hcHBpbmdzKCkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAoc2VydmxldE1hcHBpbmdzKSB7CisgICAgICAgICAgICBTdHJpbmcgcmVzdWx0c1tdID0gbmV3IFN0cmluZ1tzZXJ2bGV0TWFwcGluZ3Muc2l6ZSgpXTsKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgKChTdHJpbmdbXSkgc2VydmxldE1hcHBpbmdzLmtleVNldCgpLnRvQXJyYXkocmVzdWx0cykpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY29udGV4dC1yZWxhdGl2ZSBVUkkgb2YgdGhlIGVycm9yIHBhZ2UgZm9yIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBIVFRQIHN0YXR1cyBjb2RlLCBpZiBhbnk7IG90aGVyd2lzZSByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RhdHVzIEhUVFAgc3RhdHVzIGNvZGUgdG8gbG9vayB1cAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZmluZFN0YXR1c1BhZ2UoaW50IHN0YXR1cykgeworCisgICAgICAgIHJldHVybiAoKFN0cmluZykgc3RhdHVzUGFnZXMuZ2V0KG5ldyBJbnRlZ2VyKHN0YXR1cykpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXQgb2YgSFRUUCBzdGF0dXMgY29kZXMgZm9yIHdoaWNoIGVycm9yIHBhZ2VzIGhhdmUKKyAgICAgKiBiZWVuIHNwZWNpZmllZC4gIElmIG5vbmUgYXJlIHNwZWNpZmllZCwgYSB6ZXJvLWxlbmd0aCBhcnJheQorICAgICAqIGlzIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBpbnRbXSBmaW5kU3RhdHVzUGFnZXMoKSB7CisKKyAgICAgICAgc3luY2hyb25pemVkIChzdGF0dXNQYWdlcykgeworICAgICAgICAgICAgaW50IHJlc3VsdHNbXSA9IG5ldyBpbnRbc3RhdHVzUGFnZXMuc2l6ZSgpXTsKKyAgICAgICAgICAgIEl0ZXJhdG9yIGVsZW1lbnRzID0gc3RhdHVzUGFnZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgICAgIHdoaWxlIChlbGVtZW50cy5oYXNOZXh0KCkpCisgICAgICAgICAgICAgICAgcmVzdWx0c1tpKytdID0gKChJbnRlZ2VyKSBlbGVtZW50cy5uZXh0KCkpLmludFZhbHVlKCk7CisgICAgICAgICAgICByZXR1cm4gKHJlc3VsdHMpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdGFnIGxpYnJhcnkgZGVzY3JpcHRvciBsb2NhdGlvbiBmb3IgdGhlIHNwZWNpZmllZCB0YWdsaWIKKyAgICAgKiBVUkksIGlmIGFueTsgb3RoZXJ3aXNlLCByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJpIFVSSSwgcmVsYXRpdmUgdG8gdGhlIHdlYi54bWwgZmlsZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZmluZFRhZ2xpYihTdHJpbmcgdXJpKSB7CisKKyAgICAgICAgc3luY2hyb25pemVkICh0YWdsaWJzKSB7CisgICAgICAgICAgICByZXR1cm4gKChTdHJpbmcpIHRhZ2xpYnMuZ2V0KHVyaSkpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgVVJJcyBvZiBhbGwgdGFnIGxpYnJhcmllcyBmb3Igd2hpY2ggYSB0YWcgbGlicmFyeQorICAgICAqIGRlc2NyaXB0b3IgbG9jYXRpb24gaGFzIGJlZW4gc3BlY2lmaWVkLiAgSWYgbm9uZSBhcmUgc3BlY2lmaWVkLAorICAgICAqIGEgemVyby1sZW5ndGggYXJyYXkgaXMgcmV0dXJuZWQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGZpbmRUYWdsaWJzKCkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAodGFnbGlicykgeworICAgICAgICAgICAgU3RyaW5nIHJlc3VsdHNbXSA9IG5ldyBTdHJpbmdbdGFnbGlicy5zaXplKCldOworICAgICAgICAgICAgcmV0dXJuICgoU3RyaW5nW10pIHRhZ2xpYnMua2V5U2V0KCkudG9BcnJheShyZXN1bHRzKSk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgd2VsY29tZSBmaWxlIGlzIGRlZmluZWQKKyAgICAgKiBmb3IgdGhpcyBDb250ZXh0OyBvdGhlcndpc2UgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIFdlbGNvbWUgZmlsZSB0byB2ZXJpZnkKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBmaW5kV2VsY29tZUZpbGUoU3RyaW5nIG5hbWUpIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKHdlbGNvbWVGaWxlcykgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3ZWxjb21lRmlsZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMod2VsY29tZUZpbGVzW2ldKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKGZhbHNlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXQgb2Ygd2F0Y2hlZCByZXNvdXJjZXMgZm9yIHRoaXMgQ29udGV4dC4gSWYgbm9uZSBhcmUgCisgICAgICogZGVmaW5lZCwgYSB6ZXJvIGxlbmd0aCBhcnJheSB3aWxsIGJlIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBmaW5kV2F0Y2hlZFJlc291cmNlcygpIHsKKyAgICAgICAgcmV0dXJuIHdhdGNoZWRSZXNvdXJjZXM7CisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2V0IG9mIHdlbGNvbWUgZmlsZXMgZGVmaW5lZCBmb3IgdGhpcyBDb250ZXh0LiAgSWYgbm9uZSBhcmUKKyAgICAgKiBkZWZpbmVkLCBhIHplcm8tbGVuZ3RoIGFycmF5IGlzIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBmaW5kV2VsY29tZUZpbGVzKCkgeworCisgICAgICAgIHJldHVybiAod2VsY29tZUZpbGVzKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXQgb2YgTGlmZWN5Y2xlTGlzdGVuZXIgY2xhc3NlcyB0aGF0IHdpbGwgYmUgYWRkZWQgdG8KKyAgICAgKiBuZXdseSBjcmVhdGVkIFdyYXBwZXJzIGF1dG9tYXRpY2FsbHkuCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGZpbmRXcmFwcGVyTGlmZWN5Y2xlcygpIHsKKworICAgICAgICByZXR1cm4gKHdyYXBwZXJMaWZlY3ljbGVzKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXQgb2YgQ29udGFpbmVyTGlzdGVuZXIgY2xhc3NlcyB0aGF0IHdpbGwgYmUgYWRkZWQgdG8KKyAgICAgKiBuZXdseSBjcmVhdGVkIFdyYXBwZXJzIGF1dG9tYXRpY2FsbHkuCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGZpbmRXcmFwcGVyTGlzdGVuZXJzKCkgeworCisgICAgICAgIHJldHVybiAod3JhcHBlckxpc3RlbmVycyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbG9hZCB0aGlzIHdlYiBhcHBsaWNhdGlvbiwgaWYgcmVsb2FkaW5nIGlzIHN1cHBvcnRlZC4KKyAgICAgKiA8cD4KKyAgICAgKiA8Yj5JTVBMRU1FTlRBVElPTiBOT1RFPC9iPjogIFRoaXMgbWV0aG9kIGlzIGRlc2lnbmVkIHRvIGRlYWwgd2l0aAorICAgICAqIHJlbG9hZHMgcmVxdWlyZWQgYnkgY2hhbmdlcyB0byBjbGFzc2VzIGluIHRoZSB1bmRlcmx5aW5nIHJlcG9zaXRvcmllcworICAgICAqIG9mIG91ciBjbGFzcyBsb2FkZXIuICBJdCBkb2VzIG5vdCBoYW5kbGUgY2hhbmdlcyB0byB0aGUgd2ViIGFwcGxpY2F0aW9uCisgICAgICogZGVwbG95bWVudCBkZXNjcmlwdG9yLiAgSWYgdGhhdCBoYXMgb2NjdXJyZWQsIHlvdSBzaG91bGQgc3RvcCB0aGlzCisgICAgICogQ29udGV4dCBhbmQgY3JlYXRlIChhbmQgc3RhcnQpIGEgbmV3IENvbnRleHQgaW5zdGFuY2UgaW5zdGVhZC4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSA8Y29kZT5yZWxvYWRhYmxlPC9jb2RlPgorICAgICAqICBwcm9wZXJ0eSBpcyBzZXQgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZWxvYWQoKSB7CisKKyAgICAgICAgLy8gVmFsaWRhdGUgb3VyIGN1cnJlbnQgY29tcG9uZW50IHN0YXRlCisgICAgICAgIGlmICghc3RhcnRlZCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJjb250YWluZXJCYXNlLm5vdFN0YXJ0ZWQiLCBsb2dOYW1lKCkpKTsKKworICAgICAgICAvLyBNYWtlIHN1cmUgcmVsb2FkaW5nIGlzIGVuYWJsZWQKKyAgICAgICAgLy8gICAgICBpZiAoIXJlbG9hZGFibGUpCisgICAgICAgIC8vICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgICAgLy8gICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInN0YW5kYXJkQ29udGV4dC5ub3RSZWxvYWRhYmxlIikpOworICAgICAgICBsb2cuaW5mbyhzbS5nZXRTdHJpbmcoInN0YW5kYXJkQ29udGV4dC5yZWxvYWRpbmdTdGFydGVkIikpOworCisgICAgICAgIC8vIFN0b3AgYWNjZXB0aW5nIHJlcXVlc3RzIHRlbXBvcmFyaWx5CisgICAgICAgIHNldFBhdXNlZCh0cnVlKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3RvcCgpOworICAgICAgICB9IGNhdGNoIChMaWZlY3ljbGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9nLmVycm9yKHNtLmdldFN0cmluZygic3RhbmRhcmRDb250ZXh0LnN0b3BwaW5nQ29udGV4dCIpLCBlKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzdGFydCgpOworICAgICAgICB9IGNhdGNoIChMaWZlY3ljbGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9nLmVycm9yKHNtLmdldFN0cmluZygic3RhbmRhcmRDb250ZXh0LnN0YXJ0aW5nQ29udGV4dCIpLCBlKTsKKyAgICAgICAgfQorCisgICAgICAgIHNldFBhdXNlZChmYWxzZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGFwcGxpY2F0aW9uIGxpc3RlbmVyIGNsYXNzIGZyb20gdGhlIHNldCBvZgorICAgICAqIGxpc3RlbmVycyBmb3IgdGhpcyBhcHBsaWNhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBKYXZhIGNsYXNzIG5hbWUgb2YgdGhlIGxpc3RlbmVyIHRvIGJlIHJlbW92ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVBcHBsaWNhdGlvbkxpc3RlbmVyKFN0cmluZyBsaXN0ZW5lcikgeworCisgICAgICAgIHN5bmNocm9uaXplZCAoYXBwbGljYXRpb25MaXN0ZW5lcnMpIHsKKworICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoaXMgd2VsY29tZSBmaWxlIGlzIGN1cnJlbnRseSBwcmVzZW50CisgICAgICAgICAgICBpbnQgbiA9IC0xOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcHBsaWNhdGlvbkxpc3RlbmVycy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChhcHBsaWNhdGlvbkxpc3RlbmVyc1tpXS5lcXVhbHMobGlzdGVuZXIpKSB7CisgICAgICAgICAgICAgICAgICAgIG4gPSBpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobiA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIHNwZWNpZmllZCBjb25zdHJhaW50CisgICAgICAgICAgICBpbnQgaiA9IDA7CisgICAgICAgICAgICBTdHJpbmcgcmVzdWx0c1tdID0gbmV3IFN0cmluZ1thcHBsaWNhdGlvbkxpc3RlbmVycy5sZW5ndGggLSAxXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXBwbGljYXRpb25MaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoaSAhPSBuKQorICAgICAgICAgICAgICAgICAgICByZXN1bHRzW2orK10gPSBhcHBsaWNhdGlvbkxpc3RlbmVyc1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFwcGxpY2F0aW9uTGlzdGVuZXJzID0gcmVzdWx0czsKKworICAgICAgICB9CisKKyAgICAgICAgLy8gSW5mb3JtIGludGVyZXN0ZWQgbGlzdGVuZXJzCisgICAgICAgIGZpcmVDb250YWluZXJFdmVudCgicmVtb3ZlQXBwbGljYXRpb25MaXN0ZW5lciIsIGxpc3RlbmVyKTsKKworICAgICAgICAvLyBGSVhNRSAtIGJlaGF2aW9yIGlmIGFscmVhZHkgc3RhcnRlZD8KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBhcHBsaWNhdGlvbiBwYXJhbWV0ZXIgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgZnJvbQorICAgICAqIHRoZSBzZXQgZm9yIHRoaXMgYXBwbGljYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiBwYXJhbWV0ZXIgdG8gcmVtb3ZlCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlQXBwbGljYXRpb25QYXJhbWV0ZXIoU3RyaW5nIG5hbWUpIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKGFwcGxpY2F0aW9uUGFyYW1ldGVycykgeworCisgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhpcyBwYXJhbWV0ZXIgaXMgY3VycmVudGx5IHByZXNlbnQKKyAgICAgICAgICAgIGludCBuID0gLTE7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFwcGxpY2F0aW9uUGFyYW1ldGVycy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChuYW1lLmVxdWFscyhhcHBsaWNhdGlvblBhcmFtZXRlcnNbaV0uZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgICAgICAgICBuID0gaTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG4gPCAwKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVyCisgICAgICAgICAgICBpbnQgaiA9IDA7CisgICAgICAgICAgICBBcHBsaWNhdGlvblBhcmFtZXRlciByZXN1bHRzW10gPQorICAgICAgICAgICAgICAgIG5ldyBBcHBsaWNhdGlvblBhcmFtZXRlclthcHBsaWNhdGlvblBhcmFtZXRlcnMubGVuZ3RoIC0gMV07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFwcGxpY2F0aW9uUGFyYW1ldGVycy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChpICE9IG4pCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdHNbaisrXSA9IGFwcGxpY2F0aW9uUGFyYW1ldGVyc1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFwcGxpY2F0aW9uUGFyYW1ldGVycyA9IHJlc3VsdHM7CisKKyAgICAgICAgfQorCisgICAgICAgIC8vIEluZm9ybSBpbnRlcmVzdGVkIGxpc3RlbmVycworICAgICAgICBmaXJlQ29udGFpbmVyRXZlbnQoInJlbW92ZUFwcGxpY2F0aW9uUGFyYW1ldGVyIiwgbmFtZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEFkZCBhIGNoaWxkIENvbnRhaW5lciwgb25seSBpZiB0aGUgcHJvcG9zZWQgY2hpbGQgaXMgYW4gaW1wbGVtZW50YXRpb24KKyAgICAgKiBvZiBXcmFwcGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGNoaWxkIENoaWxkIGNvbnRhaW5lciB0byBiZSBhZGRlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHByb3Bvc2VkIGNvbnRhaW5lciBpcworICAgICAqICBub3QgYW4gaW1wbGVtZW50YXRpb24gb2YgV3JhcHBlcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUNoaWxkKENvbnRhaW5lciBjaGlsZCkgeworCisgICAgICAgIGlmICghKGNoaWxkIGluc3RhbmNlb2YgV3JhcHBlcikpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJzdGFuZGFyZENvbnRleHQubm90V3JhcHBlciIpKTsKKyAgICAgICAgfQorCisgICAgICAgIHN1cGVyLnJlbW92ZUNoaWxkKGNoaWxkKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgc2VjdXJpdHkgY29uc3RyYWludCBmcm9tIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnN0cmFpbnQgQ29uc3RyYWludCB0byBiZSByZW1vdmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlQ29uc3RyYWludChTZWN1cml0eUNvbnN0cmFpbnQgY29uc3RyYWludCkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAoY29uc3RyYWludHMpIHsKKworICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoaXMgY29uc3RyYWludCBpcyBjdXJyZW50bHkgcHJlc2VudAorICAgICAgICAgICAgaW50IG4gPSAtMTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29uc3RyYWludHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoY29uc3RyYWludHNbaV0uZXF1YWxzKGNvbnN0cmFpbnQpKSB7CisgICAgICAgICAgICAgICAgICAgIG4gPSBpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobiA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIHNwZWNpZmllZCBjb25zdHJhaW50CisgICAgICAgICAgICBpbnQgaiA9IDA7CisgICAgICAgICAgICBTZWN1cml0eUNvbnN0cmFpbnQgcmVzdWx0c1tdID0KKyAgICAgICAgICAgICAgICBuZXcgU2VjdXJpdHlDb25zdHJhaW50W2NvbnN0cmFpbnRzLmxlbmd0aCAtIDFdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb25zdHJhaW50cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChpICE9IG4pCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdHNbaisrXSA9IGNvbnN0cmFpbnRzW2ldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29uc3RyYWludHMgPSByZXN1bHRzOworCisgICAgICAgIH0KKworICAgICAgICAvLyBJbmZvcm0gaW50ZXJlc3RlZCBsaXN0ZW5lcnMKKyAgICAgICAgZmlyZUNvbnRhaW5lckV2ZW50KCJyZW1vdmVDb25zdHJhaW50IiwgY29uc3RyYWludCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGUgZXJyb3IgcGFnZSBmb3IgdGhlIHNwZWNpZmllZCBlcnJvciBjb2RlIG9yCisgICAgICogSmF2YSBsYW5ndWFnZSBleGNlcHRpb24sIGlmIGl0IGV4aXN0czsgb3RoZXJ3aXNlLCBubyBhY3Rpb24gaXMgdGFrZW4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXJyb3JQYWdlIFRoZSBlcnJvciBwYWdlIGRlZmluaXRpb24gdG8gYmUgcmVtb3ZlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUVycm9yUGFnZShFcnJvclBhZ2UgZXJyb3JQYWdlKSB7CisKKyAgICAgICAgU3RyaW5nIGV4Y2VwdGlvblR5cGUgPSBlcnJvclBhZ2UuZ2V0RXhjZXB0aW9uVHlwZSgpOworICAgICAgICBpZiAoZXhjZXB0aW9uVHlwZSAhPSBudWxsKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGV4Y2VwdGlvblBhZ2VzKSB7CisgICAgICAgICAgICAgICAgZXhjZXB0aW9uUGFnZXMucmVtb3ZlKGV4Y2VwdGlvblR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3luY2hyb25pemVkIChzdGF0dXNQYWdlcykgeworICAgICAgICAgICAgICAgIGlmIChlcnJvclBhZ2UuZ2V0RXJyb3JDb2RlKCkgPT0gMjAwKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMub2tFcnJvclBhZ2UgPSBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdGF0dXNQYWdlcy5yZW1vdmUobmV3IEludGVnZXIoZXJyb3JQYWdlLmdldEVycm9yQ29kZSgpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZmlyZUNvbnRhaW5lckV2ZW50KCJyZW1vdmVFcnJvclBhZ2UiLCBlcnJvclBhZ2UpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBmaWx0ZXIgZGVmaW5pdGlvbiBmcm9tIHRoaXMgQ29udGV4dCwgaWYgaXQgZXhpc3RzOworICAgICAqIG90aGVyd2lzZSwgbm8gYWN0aW9uIGlzIHRha2VuLgorICAgICAqCisgICAgICogQHBhcmFtIGZpbHRlckRlZiBGaWx0ZXIgZGVmaW5pdGlvbiB0byBiZSByZW1vdmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlRmlsdGVyRGVmKEZpbHRlckRlZiBmaWx0ZXJEZWYpIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKGZpbHRlckRlZnMpIHsKKyAgICAgICAgICAgIGZpbHRlckRlZnMucmVtb3ZlKGZpbHRlckRlZi5nZXRGaWx0ZXJOYW1lKCkpOworICAgICAgICB9CisgICAgICAgIGZpcmVDb250YWluZXJFdmVudCgicmVtb3ZlRmlsdGVyRGVmIiwgZmlsdGVyRGVmKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGEgZmlsdGVyIG1hcHBpbmcgZnJvbSB0aGlzIENvbnRleHQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsdGVyTWFwIFRoZSBmaWx0ZXIgbWFwcGluZyB0byBiZSByZW1vdmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlRmlsdGVyTWFwKEZpbHRlck1hcCBmaWx0ZXJNYXApIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKGZpbHRlck1hcHMpIHsKKworICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoaXMgZmlsdGVyIG1hcHBpbmcgaXMgY3VycmVudGx5IHByZXNlbnQKKyAgICAgICAgICAgIGludCBuID0gLTE7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbHRlck1hcHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoZmlsdGVyTWFwc1tpXSA9PSBmaWx0ZXJNYXApIHsKKyAgICAgICAgICAgICAgICAgICAgbiA9IGk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChuIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGZpbHRlciBtYXBwaW5nCisgICAgICAgICAgICBGaWx0ZXJNYXAgcmVzdWx0c1tdID0gbmV3IEZpbHRlck1hcFtmaWx0ZXJNYXBzLmxlbmd0aCAtIDFdOworICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShmaWx0ZXJNYXBzLCAwLCByZXN1bHRzLCAwLCBuKTsKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoZmlsdGVyTWFwcywgbiArIDEsIHJlc3VsdHMsIG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmaWx0ZXJNYXBzLmxlbmd0aCAtIDEpIC0gbik7CisgICAgICAgICAgICBmaWx0ZXJNYXBzID0gcmVzdWx0czsKKworICAgICAgICB9CisKKyAgICAgICAgLy8gSW5mb3JtIGludGVyZXN0ZWQgbGlzdGVuZXJzCisgICAgICAgIGZpcmVDb250YWluZXJFdmVudCgicmVtb3ZlRmlsdGVyTWFwIiwgZmlsdGVyTWFwKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGEgY2xhc3MgbmFtZSBmcm9tIHRoZSBzZXQgb2YgSW5zdGFuY2VMaXN0ZW5lciBjbGFzc2VzIHRoYXQKKyAgICAgKiB3aWxsIGJlIGFkZGVkIHRvIG5ld2x5IGNyZWF0ZWQgV3JhcHBlcnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgQ2xhc3MgbmFtZSBvZiBhbiBJbnN0YW5jZUxpc3RlbmVyIGNsYXNzIHRvIGJlIHJlbW92ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVJbnN0YW5jZUxpc3RlbmVyKFN0cmluZyBsaXN0ZW5lcikgeworCisgICAgICAgIHN5bmNocm9uaXplZCAoaW5zdGFuY2VMaXN0ZW5lcnMpIHsKKworICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoaXMgd2VsY29tZSBmaWxlIGlzIGN1cnJlbnRseSBwcmVzZW50CisgICAgICAgICAgICBpbnQgbiA9IC0xOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnN0YW5jZUxpc3RlbmVycy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZUxpc3RlbmVyc1tpXS5lcXVhbHMobGlzdGVuZXIpKSB7CisgICAgICAgICAgICAgICAgICAgIG4gPSBpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobiA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIHNwZWNpZmllZCBjb25zdHJhaW50CisgICAgICAgICAgICBpbnQgaiA9IDA7CisgICAgICAgICAgICBTdHJpbmcgcmVzdWx0c1tdID0gbmV3IFN0cmluZ1tpbnN0YW5jZUxpc3RlbmVycy5sZW5ndGggLSAxXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5zdGFuY2VMaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoaSAhPSBuKQorICAgICAgICAgICAgICAgICAgICByZXN1bHRzW2orK10gPSBpbnN0YW5jZUxpc3RlbmVyc1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGluc3RhbmNlTGlzdGVuZXJzID0gcmVzdWx0czsKKworICAgICAgICB9CisKKyAgICAgICAgLy8gSW5mb3JtIGludGVyZXN0ZWQgbGlzdGVuZXJzCisgICAgICAgIGZpcmVDb250YWluZXJFdmVudCgicmVtb3ZlSW5zdGFuY2VMaXN0ZW5lciIsIGxpc3RlbmVyKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGFueSBtZXNzYWdlIGRlc3RpbmF0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgbWVzc2FnZSBkZXN0aW5hdGlvbiB0byByZW1vdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVNZXNzYWdlRGVzdGluYXRpb24oU3RyaW5nIG5hbWUpIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKG1lc3NhZ2VEZXN0aW5hdGlvbnMpIHsKKyAgICAgICAgICAgIG1lc3NhZ2VEZXN0aW5hdGlvbnMucmVtb3ZlKG5hbWUpOworICAgICAgICB9CisgICAgICAgIGZpcmVDb250YWluZXJFdmVudCgicmVtb3ZlTWVzc2FnZURlc3RpbmF0aW9uIiwgbmFtZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhbnkgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWYgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBtZXNzYWdlIGRlc3RpbmF0aW9uIHJlZiB0byByZW1vdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVNZXNzYWdlRGVzdGluYXRpb25SZWYoU3RyaW5nIG5hbWUpIHsKKworICAgICAgICBuYW1pbmdSZXNvdXJjZXMucmVtb3ZlTWVzc2FnZURlc3RpbmF0aW9uUmVmKG5hbWUpOworICAgICAgICBmaXJlQ29udGFpbmVyRXZlbnQoInJlbW92ZU1lc3NhZ2VEZXN0aW5hdGlvblJlZiIsIG5hbWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgdGhlIE1JTUUgbWFwcGluZyBmb3IgdGhlIHNwZWNpZmllZCBleHRlbnNpb24sIGlmIGl0IGV4aXN0czsKKyAgICAgKiBvdGhlcndpc2UsIG5vIGFjdGlvbiBpcyB0YWtlbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBleHRlbnNpb24gRXh0ZW5zaW9uIHRvIHJlbW92ZSB0aGUgbWFwcGluZyBmb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVNaW1lTWFwcGluZyhTdHJpbmcgZXh0ZW5zaW9uKSB7CisKKyAgICAgICAgc3luY2hyb25pemVkIChtaW1lTWFwcGluZ3MpIHsKKyAgICAgICAgICAgIG1pbWVNYXBwaW5ncy5yZW1vdmUoZXh0ZW5zaW9uKTsKKyAgICAgICAgfQorICAgICAgICBmaXJlQ29udGFpbmVyRXZlbnQoInJlbW92ZU1pbWVNYXBwaW5nIiwgZXh0ZW5zaW9uKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBjb250ZXh0IGluaXRpYWxpemF0aW9uIHBhcmFtZXRlciB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBuYW1lLCBpZiBpdCBleGlzdHM7IG90aGVyd2lzZSwgbm8gYWN0aW9uIGlzIHRha2VuLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgcGFyYW1ldGVyIHRvIHJlbW92ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVBhcmFtZXRlcihTdHJpbmcgbmFtZSkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAocGFyYW1ldGVycykgeworICAgICAgICAgICAgcGFyYW1ldGVycy5yZW1vdmUobmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgZmlyZUNvbnRhaW5lckV2ZW50KCJyZW1vdmVQYXJhbWV0ZXIiLCBuYW1lKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGFueSBzZWN1cml0eSByb2xlIHJlZmVyZW5jZSBmb3IgdGhlIHNwZWNpZmllZCBuYW1lCisgICAgICoKKyAgICAgKiBAcGFyYW0gcm9sZSBTZWN1cml0eSByb2xlIChhcyB1c2VkIGluIHRoZSBhcHBsaWNhdGlvbikgdG8gcmVtb3ZlCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlUm9sZU1hcHBpbmcoU3RyaW5nIHJvbGUpIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKHJvbGVNYXBwaW5ncykgeworICAgICAgICAgICAgcm9sZU1hcHBpbmdzLnJlbW92ZShyb2xlKTsKKyAgICAgICAgfQorICAgICAgICBmaXJlQ29udGFpbmVyRXZlbnQoInJlbW92ZVJvbGVNYXBwaW5nIiwgcm9sZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhbnkgc2VjdXJpdHkgcm9sZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByb2xlIFNlY3VyaXR5IHJvbGUgdG8gcmVtb3ZlCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlU2VjdXJpdHlSb2xlKFN0cmluZyByb2xlKSB7CisKKyAgICAgICAgc3luY2hyb25pemVkIChzZWN1cml0eVJvbGVzKSB7CisKKyAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGlzIHNlY3VyaXR5IHJvbGUgaXMgY3VycmVudGx5IHByZXNlbnQKKyAgICAgICAgICAgIGludCBuID0gLTE7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlY3VyaXR5Um9sZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAocm9sZS5lcXVhbHMoc2VjdXJpdHlSb2xlc1tpXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbiA9IGk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChuIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgc3BlY2lmaWVkIHNlY3VyaXR5IHJvbGUKKyAgICAgICAgICAgIGludCBqID0gMDsKKyAgICAgICAgICAgIFN0cmluZyByZXN1bHRzW10gPSBuZXcgU3RyaW5nW3NlY3VyaXR5Um9sZXMubGVuZ3RoIC0gMV07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlY3VyaXR5Um9sZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoaSAhPSBuKQorICAgICAgICAgICAgICAgICAgICByZXN1bHRzW2orK10gPSBzZWN1cml0eVJvbGVzW2ldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2VjdXJpdHlSb2xlcyA9IHJlc3VsdHM7CisKKyAgICAgICAgfQorCisgICAgICAgIC8vIEluZm9ybSBpbnRlcmVzdGVkIGxpc3RlbmVycworICAgICAgICBmaXJlQ29udGFpbmVyRXZlbnQoInJlbW92ZVNlY3VyaXR5Um9sZSIsIHJvbGUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYW55IHNlcnZsZXQgbWFwcGluZyBmb3IgdGhlIHNwZWNpZmllZCBwYXR0ZXJuLCBpZiBpdCBleGlzdHM7CisgICAgICogb3RoZXJ3aXNlLCBubyBhY3Rpb24gaXMgdGFrZW4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0dGVybiBVUkwgcGF0dGVybiBvZiB0aGUgbWFwcGluZyB0byByZW1vdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVTZXJ2bGV0TWFwcGluZyhTdHJpbmcgcGF0dGVybikgeworCisgICAgICAgIFN0cmluZyBuYW1lID0gbnVsbDsKKyAgICAgICAgc3luY2hyb25pemVkIChzZXJ2bGV0TWFwcGluZ3MpIHsKKyAgICAgICAgICAgIG5hbWUgPSAoU3RyaW5nKSBzZXJ2bGV0TWFwcGluZ3MucmVtb3ZlKHBhdHRlcm4pOworICAgICAgICB9CisgICAgICAgIFdyYXBwZXIgd3JhcHBlciA9IChXcmFwcGVyKSBmaW5kQ2hpbGQobmFtZSk7CisgICAgICAgIGlmKCB3cmFwcGVyICE9IG51bGwgKSB7CisgICAgICAgICAgICB3cmFwcGVyLnJlbW92ZU1hcHBpbmcocGF0dGVybik7CisgICAgICAgIH0KKyAgICAgICAgbWFwcGVyLnJlbW92ZVdyYXBwZXIocGF0dGVybik7CisgICAgICAgIGZpcmVDb250YWluZXJFdmVudCgicmVtb3ZlU2VydmxldE1hcHBpbmciLCBwYXR0ZXJuKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSB0YWcgbGlicmFyeSBsb2NhdGlvbiBmb3J0aGUgc3BlY2lmaWVkIHRhZyBsaWJyYXJ5IFVSSS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmkgVVJJLCByZWxhdGl2ZSB0byB0aGUgd2ViLnhtbCBmaWxlCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlVGFnbGliKFN0cmluZyB1cmkpIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKHRhZ2xpYnMpIHsKKyAgICAgICAgICAgIHRhZ2xpYnMucmVtb3ZlKHVyaSk7CisgICAgICAgIH0KKyAgICAgICAgZmlyZUNvbnRhaW5lckV2ZW50KCJyZW1vdmVUYWdsaWIiLCB1cmkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgd2F0Y2hlZCByZXNvdXJjZSBuYW1lIGZyb20gdGhlIGxpc3QgYXNzb2NpYXRlZAorICAgICAqIHdpdGggdGhpcyBDb250ZXh0LgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIHdhdGNoZWQgcmVzb3VyY2UgdG8gYmUgcmVtb3ZlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVdhdGNoZWRSZXNvdXJjZShTdHJpbmcgbmFtZSkgeworICAgICAgICAKKyAgICAgICAgc3luY2hyb25pemVkICh3YXRjaGVkUmVzb3VyY2VzKSB7CisKKyAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGlzIHdhdGNoZWQgcmVzb3VyY2UgaXMgY3VycmVudGx5IHByZXNlbnQKKyAgICAgICAgICAgIGludCBuID0gLTE7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHdhdGNoZWRSZXNvdXJjZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAod2F0Y2hlZFJlc291cmNlc1tpXS5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbiA9IGk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChuIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgc3BlY2lmaWVkIHdhdGNoZWQgcmVzb3VyY2UKKyAgICAgICAgICAgIGludCBqID0gMDsKKyAgICAgICAgICAgIFN0cmluZyByZXN1bHRzW10gPSBuZXcgU3RyaW5nW3dhdGNoZWRSZXNvdXJjZXMubGVuZ3RoIC0gMV07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHdhdGNoZWRSZXNvdXJjZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoaSAhPSBuKQorICAgICAgICAgICAgICAgICAgICByZXN1bHRzW2orK10gPSB3YXRjaGVkUmVzb3VyY2VzW2ldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd2F0Y2hlZFJlc291cmNlcyA9IHJlc3VsdHM7CisKKyAgICAgICAgfQorCisgICAgICAgIGZpcmVDb250YWluZXJFdmVudCgicmVtb3ZlV2F0Y2hlZFJlc291cmNlIiwgbmFtZSk7CisKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgd2VsY29tZSBmaWxlIG5hbWUgZnJvbSB0aGUgbGlzdCByZWNvZ25pemVkCisgICAgICogYnkgdGhpcyBDb250ZXh0LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgd2VsY29tZSBmaWxlIHRvIGJlIHJlbW92ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVXZWxjb21lRmlsZShTdHJpbmcgbmFtZSkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAod2VsY29tZUZpbGVzKSB7CisKKyAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGlzIHdlbGNvbWUgZmlsZSBpcyBjdXJyZW50bHkgcHJlc2VudAorICAgICAgICAgICAgaW50IG4gPSAtMTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd2VsY29tZUZpbGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKHdlbGNvbWVGaWxlc1tpXS5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbiA9IGk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChuIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGNvbnN0cmFpbnQKKyAgICAgICAgICAgIGludCBqID0gMDsKKyAgICAgICAgICAgIFN0cmluZyByZXN1bHRzW10gPSBuZXcgU3RyaW5nW3dlbGNvbWVGaWxlcy5sZW5ndGggLSAxXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd2VsY29tZUZpbGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGkgIT0gbikKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0c1tqKytdID0gd2VsY29tZUZpbGVzW2ldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd2VsY29tZUZpbGVzID0gcmVzdWx0czsKKworICAgICAgICB9CisKKyAgICAgICAgLy8gSW5mb3JtIGludGVyZXN0ZWQgbGlzdGVuZXJzCisgICAgICAgIHBvc3RXZWxjb21lRmlsZXMoKTsKKyAgICAgICAgZmlyZUNvbnRhaW5lckV2ZW50KCJyZW1vdmVXZWxjb21lRmlsZSIsIG5hbWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSBjbGFzcyBuYW1lIGZyb20gdGhlIHNldCBvZiBMaWZlY3ljbGVMaXN0ZW5lciBjbGFzc2VzIHRoYXQKKyAgICAgKiB3aWxsIGJlIGFkZGVkIHRvIG5ld2x5IGNyZWF0ZWQgV3JhcHBlcnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgQ2xhc3MgbmFtZSBvZiBhIExpZmVjeWNsZUxpc3RlbmVyIGNsYXNzIHRvIGJlIHJlbW92ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVXcmFwcGVyTGlmZWN5Y2xlKFN0cmluZyBsaXN0ZW5lcikgeworCisKKyAgICAgICAgc3luY2hyb25pemVkICh3cmFwcGVyTGlmZWN5Y2xlcykgeworCisgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhpcyB3ZWxjb21lIGZpbGUgaXMgY3VycmVudGx5IHByZXNlbnQKKyAgICAgICAgICAgIGludCBuID0gLTE7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHdyYXBwZXJMaWZlY3ljbGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKHdyYXBwZXJMaWZlY3ljbGVzW2ldLmVxdWFscyhsaXN0ZW5lcikpIHsKKyAgICAgICAgICAgICAgICAgICAgbiA9IGk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChuIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGNvbnN0cmFpbnQKKyAgICAgICAgICAgIGludCBqID0gMDsKKyAgICAgICAgICAgIFN0cmluZyByZXN1bHRzW10gPSBuZXcgU3RyaW5nW3dyYXBwZXJMaWZlY3ljbGVzLmxlbmd0aCAtIDFdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3cmFwcGVyTGlmZWN5Y2xlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChpICE9IG4pCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdHNbaisrXSA9IHdyYXBwZXJMaWZlY3ljbGVzW2ldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd3JhcHBlckxpZmVjeWNsZXMgPSByZXN1bHRzOworCisgICAgICAgIH0KKworICAgICAgICAvLyBJbmZvcm0gaW50ZXJlc3RlZCBsaXN0ZW5lcnMKKyAgICAgICAgZmlyZUNvbnRhaW5lckV2ZW50KCJyZW1vdmVXcmFwcGVyTGlmZWN5Y2xlIiwgbGlzdGVuZXIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSBjbGFzcyBuYW1lIGZyb20gdGhlIHNldCBvZiBDb250YWluZXJMaXN0ZW5lciBjbGFzc2VzIHRoYXQKKyAgICAgKiB3aWxsIGJlIGFkZGVkIHRvIG5ld2x5IGNyZWF0ZWQgV3JhcHBlcnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgQ2xhc3MgbmFtZSBvZiBhIENvbnRhaW5lckxpc3RlbmVyIGNsYXNzIHRvIGJlIHJlbW92ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVXcmFwcGVyTGlzdGVuZXIoU3RyaW5nIGxpc3RlbmVyKSB7CisKKworICAgICAgICBzeW5jaHJvbml6ZWQgKHdyYXBwZXJMaXN0ZW5lcnMpIHsKKworICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoaXMgd2VsY29tZSBmaWxlIGlzIGN1cnJlbnRseSBwcmVzZW50CisgICAgICAgICAgICBpbnQgbiA9IC0xOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3cmFwcGVyTGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKHdyYXBwZXJMaXN0ZW5lcnNbaV0uZXF1YWxzKGxpc3RlbmVyKSkgeworICAgICAgICAgICAgICAgICAgICBuID0gaTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG4gPCAwKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBzcGVjaWZpZWQgY29uc3RyYWludAorICAgICAgICAgICAgaW50IGogPSAwOworICAgICAgICAgICAgU3RyaW5nIHJlc3VsdHNbXSA9IG5ldyBTdHJpbmdbd3JhcHBlckxpc3RlbmVycy5sZW5ndGggLSAxXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd3JhcHBlckxpc3RlbmVycy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChpICE9IG4pCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdHNbaisrXSA9IHdyYXBwZXJMaXN0ZW5lcnNbaV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3cmFwcGVyTGlzdGVuZXJzID0gcmVzdWx0czsKKworICAgICAgICB9CisKKyAgICAgICAgLy8gSW5mb3JtIGludGVyZXN0ZWQgbGlzdGVuZXJzCisgICAgICAgIGZpcmVDb250YWluZXJFdmVudCgicmVtb3ZlV3JhcHBlckxpc3RlbmVyIiwgbGlzdGVuZXIpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogQ29uZmlndXJlIGFuZCBpbml0aWFsaXplIHRoZSBzZXQgb2YgZmlsdGVycyBmb3IgdGhpcyBDb250ZXh0LgorICAgICAqIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhbGwgZmlsdGVyIGluaXRpYWxpemF0aW9uIGNvbXBsZXRlZAorICAgICAqIHN1Y2Nlc3NmdWxseSwgb3IgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBmaWx0ZXJTdGFydCgpIHsKKworICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoIlN0YXJ0aW5nIGZpbHRlcnMiKTsKKyAgICAgICAgLy8gSW5zdGFudGlhdGUgYW5kIHJlY29yZCBhIEZpbHRlckNvbmZpZyBmb3IgZWFjaCBkZWZpbmVkIGZpbHRlcgorICAgICAgICBib29sZWFuIG9rID0gdHJ1ZTsKKyAgICAgICAgc3luY2hyb25pemVkIChmaWx0ZXJDb25maWdzKSB7CisgICAgICAgICAgICBmaWx0ZXJDb25maWdzLmNsZWFyKCk7CisgICAgICAgICAgICBJdGVyYXRvciBuYW1lcyA9IGZpbHRlckRlZnMua2V5U2V0KCkuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIHdoaWxlIChuYW1lcy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIG5hbWVzLm5leHQoKTsKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiIFN0YXJ0aW5nIGZpbHRlciAnIiArIG5hbWUgKyAiJyIpOworICAgICAgICAgICAgICAgIEFwcGxpY2F0aW9uRmlsdGVyQ29uZmlnIGZpbHRlckNvbmZpZyA9IG51bGw7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyQ29uZmlnID0gbmV3IEFwcGxpY2F0aW9uRmlsdGVyQ29uZmlnCisgICAgICAgICAgICAgICAgICAgICAgKHRoaXMsIChGaWx0ZXJEZWYpIGZpbHRlckRlZnMuZ2V0KG5hbWUpKTsKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyQ29uZmlncy5wdXQobmFtZSwgZmlsdGVyQ29uZmlnKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgICAgICBnZXRTZXJ2bGV0Q29udGV4dCgpLmxvZworICAgICAgICAgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygic3RhbmRhcmRDb250ZXh0LmZpbHRlclN0YXJ0IiwgbmFtZSksIHQpOworICAgICAgICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAob2spOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBGaW5hbGl6ZSBhbmQgcmVsZWFzZSB0aGUgc2V0IG9mIGZpbHRlcnMgZm9yIHRoaXMgQ29udGV4dC4KKyAgICAgKiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYWxsIGZpbHRlciBmaW5hbGl6YXRpb24gY29tcGxldGVkCisgICAgICogc3VjY2Vzc2Z1bGx5LCBvciA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGZpbHRlclN0b3AoKSB7CisKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmRlYnVnKCJTdG9wcGluZyBmaWx0ZXJzIik7CisKKyAgICAgICAgLy8gUmVsZWFzZSBhbGwgRmlsdGVyIGFuZCBGaWx0ZXJDb25maWcgaW5zdGFuY2VzCisgICAgICAgIHN5bmNocm9uaXplZCAoZmlsdGVyQ29uZmlncykgeworICAgICAgICAgICAgSXRlcmF0b3IgbmFtZXMgPSBmaWx0ZXJDb25maWdzLmtleVNldCgpLml0ZXJhdG9yKCk7CisgICAgICAgICAgICB3aGlsZSAobmFtZXMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBuYW1lcy5uZXh0KCk7CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiBTdG9wcGluZyBmaWx0ZXIgJyIgKyBuYW1lICsgIiciKTsKKyAgICAgICAgICAgICAgICBBcHBsaWNhdGlvbkZpbHRlckNvbmZpZyBmaWx0ZXJDb25maWcgPQorICAgICAgICAgICAgICAgICAgKEFwcGxpY2F0aW9uRmlsdGVyQ29uZmlnKSBmaWx0ZXJDb25maWdzLmdldChuYW1lKTsKKyAgICAgICAgICAgICAgICBmaWx0ZXJDb25maWcucmVsZWFzZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmlsdGVyQ29uZmlncy5jbGVhcigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAodHJ1ZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEZpbmQgYW5kIHJldHVybiB0aGUgaW5pdGlhbGl6ZWQgPGNvZGU+RmlsdGVyQ29uZmlnPC9jb2RlPiBmb3IgdGhlCisgICAgICogc3BlY2lmaWVkIGZpbHRlciBuYW1lLCBpZiBhbnk7IG90aGVyd2lzZSByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBkZXNpcmVkIGZpbHRlcgorICAgICAqLworICAgIHB1YmxpYyBGaWx0ZXJDb25maWcgZmluZEZpbHRlckNvbmZpZyhTdHJpbmcgbmFtZSkgeworCisgICAgICAgIHJldHVybiAoKEZpbHRlckNvbmZpZykgZmlsdGVyQ29uZmlncy5nZXQobmFtZSkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDb25maWd1cmUgdGhlIHNldCBvZiBpbnN0YW50aWF0ZWQgYXBwbGljYXRpb24gZXZlbnQgbGlzdGVuZXJzCisgICAgICogZm9yIHRoaXMgQ29udGV4dC4gIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhbGwgbGlzdGVuZXJzIHdyZQorICAgICAqIGluaXRpYWxpemVkIHN1Y2Nlc3NmdWxseSwgb3IgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBsaXN0ZW5lclN0YXJ0KCkgeworCisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ29uZmlndXJpbmcgYXBwbGljYXRpb24gZXZlbnQgbGlzdGVuZXJzIik7CisKKyAgICAgICAgLy8gSW5zdGFudGlhdGUgdGhlIHJlcXVpcmVkIGxpc3RlbmVycworICAgICAgICBDbGFzc0xvYWRlciBsb2FkZXIgPSBnZXRMb2FkZXIoKS5nZXRDbGFzc0xvYWRlcigpOworICAgICAgICBTdHJpbmcgbGlzdGVuZXJzW10gPSBmaW5kQXBwbGljYXRpb25MaXN0ZW5lcnMoKTsKKyAgICAgICAgT2JqZWN0IHJlc3VsdHNbXSA9IG5ldyBPYmplY3RbbGlzdGVuZXJzLmxlbmd0aF07CisgICAgICAgIGJvb2xlYW4gb2sgPSB0cnVlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiBDb25maWd1cmluZyBldmVudCBsaXN0ZW5lciBjbGFzcyAnIiArCisgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyc1tpXSArICInIik7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIENsYXNzIGNsYXp6ID0gbG9hZGVyLmxvYWRDbGFzcyhsaXN0ZW5lcnNbaV0pOworICAgICAgICAgICAgICAgIHJlc3VsdHNbaV0gPSBjbGF6ei5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICBnZXRTZXJ2bGV0Q29udGV4dCgpLmxvZworICAgICAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJzdGFuZGFyZENvbnRleHQuYXBwbGljYXRpb25MaXN0ZW5lciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJzW2ldKSwgdCk7CisgICAgICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIW9rKSB7CisgICAgICAgICAgICBsb2cuZXJyb3Ioc20uZ2V0U3RyaW5nKCJzdGFuZGFyZENvbnRleHQuYXBwbGljYXRpb25Ta2lwcGVkIikpOworICAgICAgICAgICAgcmV0dXJuIChmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBTb3J0IGxpc3RlbmVycyBpbiB0d28gYXJyYXlzCisgICAgICAgIEFycmF5TGlzdCBldmVudExpc3RlbmVycyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgQXJyYXlMaXN0IGxpZmVjeWNsZUxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoKHJlc3VsdHNbaV0gaW5zdGFuY2VvZiBTZXJ2bGV0Q29udGV4dEF0dHJpYnV0ZUxpc3RlbmVyKQorICAgICAgICAgICAgICAgIHx8IChyZXN1bHRzW2ldIGluc3RhbmNlb2YgU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVMaXN0ZW5lcikKKyAgICAgICAgICAgICAgICB8fCAocmVzdWx0c1tpXSBpbnN0YW5jZW9mIFNlcnZsZXRSZXF1ZXN0TGlzdGVuZXIpCisgICAgICAgICAgICAgICAgfHwgKHJlc3VsdHNbaV0gaW5zdGFuY2VvZiBIdHRwU2Vzc2lvbkF0dHJpYnV0ZUxpc3RlbmVyKSkgeworICAgICAgICAgICAgICAgIGV2ZW50TGlzdGVuZXJzLmFkZChyZXN1bHRzW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgocmVzdWx0c1tpXSBpbnN0YW5jZW9mIFNlcnZsZXRDb250ZXh0TGlzdGVuZXIpCisgICAgICAgICAgICAgICAgfHwgKHJlc3VsdHNbaV0gaW5zdGFuY2VvZiBIdHRwU2Vzc2lvbkxpc3RlbmVyKSkgeworICAgICAgICAgICAgICAgIGxpZmVjeWNsZUxpc3RlbmVycy5hZGQocmVzdWx0c1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzZXRBcHBsaWNhdGlvbkV2ZW50TGlzdGVuZXJzKGV2ZW50TGlzdGVuZXJzLnRvQXJyYXkoKSk7CisgICAgICAgIHNldEFwcGxpY2F0aW9uTGlmZWN5Y2xlTGlzdGVuZXJzKGxpZmVjeWNsZUxpc3RlbmVycy50b0FycmF5KCkpOworCisgICAgICAgIC8vIFNlbmQgYXBwbGljYXRpb24gc3RhcnQgZXZlbnRzCisKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmRlYnVnKCJTZW5kaW5nIGFwcGxpY2F0aW9uIHN0YXJ0IGV2ZW50cyIpOworCisgICAgICAgIE9iamVjdCBpbnN0YW5jZXNbXSA9IGdldEFwcGxpY2F0aW9uTGlmZWN5Y2xlTGlzdGVuZXJzKCk7CisgICAgICAgIGlmIChpbnN0YW5jZXMgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAob2spOworICAgICAgICBTZXJ2bGV0Q29udGV4dEV2ZW50IGV2ZW50ID0KKyAgICAgICAgICBuZXcgU2VydmxldENvbnRleHRFdmVudChnZXRTZXJ2bGV0Q29udGV4dCgpKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnN0YW5jZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChpbnN0YW5jZXNbaV0gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlmICghKGluc3RhbmNlc1tpXSBpbnN0YW5jZW9mIFNlcnZsZXRDb250ZXh0TGlzdGVuZXIpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgU2VydmxldENvbnRleHRMaXN0ZW5lciBsaXN0ZW5lciA9CisgICAgICAgICAgICAgICAgKFNlcnZsZXRDb250ZXh0TGlzdGVuZXIpIGluc3RhbmNlc1tpXTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZmlyZUNvbnRhaW5lckV2ZW50KCJiZWZvcmVDb250ZXh0SW5pdGlhbGl6ZWQiLCBsaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgbGlzdGVuZXIuY29udGV4dEluaXRpYWxpemVkKGV2ZW50KTsKKyAgICAgICAgICAgICAgICBmaXJlQ29udGFpbmVyRXZlbnQoImFmdGVyQ29udGV4dEluaXRpYWxpemVkIiwgbGlzdGVuZXIpOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICBmaXJlQ29udGFpbmVyRXZlbnQoImFmdGVyQ29udGV4dEluaXRpYWxpemVkIiwgbGlzdGVuZXIpOworICAgICAgICAgICAgICAgIGdldFNlcnZsZXRDb250ZXh0KCkubG9nCisgICAgICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInN0YW5kYXJkQ29udGV4dC5saXN0ZW5lclN0YXJ0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZXNbaV0uZ2V0Q2xhc3MoKS5nZXROYW1lKCkpLCB0KTsKKyAgICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAob2spOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZW5kIGFuIGFwcGxpY2F0aW9uIHN0b3AgZXZlbnQgdG8gYWxsIGludGVyZXN0ZWQgbGlzdGVuZXJzLgorICAgICAqIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhbGwgZXZlbnRzIHdlcmUgc2VudCBzdWNjZXNzZnVsbHksCisgICAgICogb3IgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBsaXN0ZW5lclN0b3AoKSB7CisKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmRlYnVnKCJTZW5kaW5nIGFwcGxpY2F0aW9uIHN0b3AgZXZlbnRzIik7CisKKyAgICAgICAgYm9vbGVhbiBvayA9IHRydWU7CisgICAgICAgIE9iamVjdCBsaXN0ZW5lcnNbXSA9IGdldEFwcGxpY2F0aW9uTGlmZWN5Y2xlTGlzdGVuZXJzKCk7CisgICAgICAgIGlmIChsaXN0ZW5lcnMgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAob2spOworICAgICAgICBTZXJ2bGV0Q29udGV4dEV2ZW50IGV2ZW50ID0KKyAgICAgICAgICBuZXcgU2VydmxldENvbnRleHRFdmVudChnZXRTZXJ2bGV0Q29udGV4dCgpKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGludCBqID0gKGxpc3RlbmVycy5sZW5ndGggLSAxKSAtIGk7CisgICAgICAgICAgICBpZiAobGlzdGVuZXJzW2pdID09IG51bGwpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBpZiAoIShsaXN0ZW5lcnNbal0gaW5zdGFuY2VvZiBTZXJ2bGV0Q29udGV4dExpc3RlbmVyKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIFNlcnZsZXRDb250ZXh0TGlzdGVuZXIgbGlzdGVuZXIgPQorICAgICAgICAgICAgICAgIChTZXJ2bGV0Q29udGV4dExpc3RlbmVyKSBsaXN0ZW5lcnNbal07CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGZpcmVDb250YWluZXJFdmVudCgiYmVmb3JlQ29udGV4dERlc3Ryb3llZCIsIGxpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci5jb250ZXh0RGVzdHJveWVkKGV2ZW50KTsKKyAgICAgICAgICAgICAgICBmaXJlQ29udGFpbmVyRXZlbnQoImJlZm9yZUNvbnRleHREZXN0cm95ZWQiLCBsaXN0ZW5lcik7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgIGZpcmVDb250YWluZXJFdmVudCgiYmVmb3JlQ29udGV4dERlc3Ryb3llZCIsIGxpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICBnZXRTZXJ2bGV0Q29udGV4dCgpLmxvZworICAgICAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJzdGFuZGFyZENvbnRleHQubGlzdGVuZXJTdG9wIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcnNbal0uZ2V0Q2xhc3MoKS5nZXROYW1lKCkpLCB0KTsKKyAgICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHNldEFwcGxpY2F0aW9uRXZlbnRMaXN0ZW5lcnMobnVsbCk7CisgICAgICAgIHNldEFwcGxpY2F0aW9uTGlmZWN5Y2xlTGlzdGVuZXJzKG51bGwpOworICAgICAgICByZXR1cm4gKG9rKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQWxsb2NhdGUgcmVzb3VyY2VzLCBpbmNsdWRpbmcgcHJveHkuCisgICAgICogUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGluaXRpYWxpemF0aW9uIHdhcyBzdWNjZXNzZnVsbCwKKyAgICAgKiBvciA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHJlc291cmNlc1N0YXJ0KCkgeworCisgICAgICAgIGJvb2xlYW4gb2sgPSB0cnVlOworCisgICAgICAgIEhhc2h0YWJsZSBlbnYgPSBuZXcgSGFzaHRhYmxlKCk7CisgICAgICAgIGlmIChnZXRQYXJlbnQoKSAhPSBudWxsKQorICAgICAgICAgICAgZW52LnB1dChQcm94eURpckNvbnRleHQuSE9TVCwgZ2V0UGFyZW50KCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgZW52LnB1dChQcm94eURpckNvbnRleHQuQ09OVEVYVCwgZ2V0TmFtZSgpKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgUHJveHlEaXJDb250ZXh0IHByb3h5RGlyQ29udGV4dCA9CisgICAgICAgICAgICAgICAgbmV3IFByb3h5RGlyQ29udGV4dChlbnYsIHdlYmFwcFJlc291cmNlcyk7CisgICAgICAgICAgICBpZiAod2ViYXBwUmVzb3VyY2VzIGluc3RhbmNlb2YgRmlsZURpckNvbnRleHQpIHsKKyAgICAgICAgICAgICAgICBmaWxlc3lzdGVtQmFzZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICgoRmlsZURpckNvbnRleHQpIHdlYmFwcFJlc291cmNlcykuc2V0Q2FzZVNlbnNpdGl2ZQorICAgICAgICAgICAgICAgICAgICAoaXNDYXNlU2Vuc2l0aXZlKCkpOworICAgICAgICAgICAgICAgICgoRmlsZURpckNvbnRleHQpIHdlYmFwcFJlc291cmNlcykuc2V0QWxsb3dMaW5raW5nCisgICAgICAgICAgICAgICAgICAgIChpc0FsbG93TGlua2luZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh3ZWJhcHBSZXNvdXJjZXMgaW5zdGFuY2VvZiBCYXNlRGlyQ29udGV4dCkgeworICAgICAgICAgICAgICAgICgoQmFzZURpckNvbnRleHQpIHdlYmFwcFJlc291cmNlcykuc2V0RG9jQmFzZShnZXRCYXNlUGF0aCgpKTsKKyAgICAgICAgICAgICAgICAoKEJhc2VEaXJDb250ZXh0KSB3ZWJhcHBSZXNvdXJjZXMpLnNldENhY2hlZAorICAgICAgICAgICAgICAgICAgICAoaXNDYWNoaW5nQWxsb3dlZCgpKTsKKyAgICAgICAgICAgICAgICAoKEJhc2VEaXJDb250ZXh0KSB3ZWJhcHBSZXNvdXJjZXMpLnNldENhY2hlVFRMKGdldENhY2hlVFRMKCkpOworICAgICAgICAgICAgICAgICgoQmFzZURpckNvbnRleHQpIHdlYmFwcFJlc291cmNlcykuc2V0Q2FjaGVNYXhTaXplCisgICAgICAgICAgICAgICAgICAgIChnZXRDYWNoZU1heFNpemUoKSk7CisgICAgICAgICAgICAgICAgKChCYXNlRGlyQ29udGV4dCkgd2ViYXBwUmVzb3VyY2VzKS5hbGxvY2F0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gUmVnaXN0ZXIgdGhlIGNhY2hlIGluIEpNWAorICAgICAgICAgICAgaWYgKGlzQ2FjaGluZ0FsbG93ZWQoKSkgeworICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgcmVzb3VyY2VzTmFtZSA9IAorICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0TmFtZSh0aGlzLmdldERvbWFpbigpICsgIjp0eXBlPUNhY2hlLGhvc3Q9IiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBnZXRIb3N0bmFtZSgpICsgIixwYXRoPSIgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCgiIi5lcXVhbHMoZ2V0UGF0aCgpKSk/Ii8iOmdldFBhdGgoKSkpOworICAgICAgICAgICAgICAgIFJlZ2lzdHJ5LmdldFJlZ2lzdHJ5KG51bGwsIG51bGwpLnJlZ2lzdGVyQ29tcG9uZW50CisgICAgICAgICAgICAgICAgICAgIChwcm94eURpckNvbnRleHQuZ2V0Q2FjaGUoKSwgcmVzb3VyY2VzTmFtZSwgbnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aGlzLnJlc291cmNlcyA9IHByb3h5RGlyQ29udGV4dDsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcihzbS5nZXRTdHJpbmcoInN0YW5kYXJkQ29udGV4dC5yZXNvdXJjZXNTdGFydCIpLCB0KTsKKyAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKG9rKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogRGVhbGxvY2F0ZSByZXNvdXJjZXMgYW5kIGRlc3Ryb3kgcHJveHkuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gcmVzb3VyY2VzU3RvcCgpIHsKKworICAgICAgICBib29sZWFuIG9rID0gdHJ1ZTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKHJlc291cmNlcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKHJlc291cmNlcyBpbnN0YW5jZW9mIExpZmVjeWNsZSkgeworICAgICAgICAgICAgICAgICAgICAoKExpZmVjeWNsZSkgcmVzb3VyY2VzKS5zdG9wKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh3ZWJhcHBSZXNvdXJjZXMgaW5zdGFuY2VvZiBCYXNlRGlyQ29udGV4dCkgeworICAgICAgICAgICAgICAgICAgICAoKEJhc2VEaXJDb250ZXh0KSB3ZWJhcHBSZXNvdXJjZXMpLnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gVW5yZWdpc3RlciB0aGUgY2FjaGUgaW4gSk1YCisgICAgICAgICAgICAgICAgaWYgKGlzQ2FjaGluZ0FsbG93ZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBPYmplY3ROYW1lIHJlc291cmNlc05hbWUgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3ROYW1lKHRoaXMuZ2V0RG9tYWluKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjp0eXBlPUNhY2hlLGhvc3Q9IiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZ2V0SG9zdG5hbWUoKSArICIscGF0aD0iIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKCIiLmVxdWFscyhnZXRQYXRoKCkpKT8iLyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpnZXRQYXRoKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgUmVnaXN0cnkuZ2V0UmVnaXN0cnkobnVsbCwgbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC51bnJlZ2lzdGVyQ29tcG9uZW50KHJlc291cmNlc05hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcihzbS5nZXRTdHJpbmcoInN0YW5kYXJkQ29udGV4dC5yZXNvdXJjZXNTdG9wIiksIHQpOworICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMucmVzb3VyY2VzID0gbnVsbDsKKworICAgICAgICByZXR1cm4gKG9rKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogTG9hZCBhbmQgaW5pdGlhbGl6ZSBhbGwgc2VydmxldHMgbWFya2VkICJsb2FkIG9uIHN0YXJ0dXAiIGluIHRoZQorICAgICAqIHdlYiBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2hpbGRyZW4gQXJyYXkgb2Ygd3JhcHBlcnMgZm9yIGFsbCBjdXJyZW50bHkgZGVmaW5lZAorICAgICAqICBzZXJ2bGV0cyAoaW5jbHVkaW5nIHRob3NlIG5vdCBkZWNsYXJlZCBsb2FkIG9uIHN0YXJ0dXApCisgICAgICovCisgICAgcHVibGljIHZvaWQgbG9hZE9uU3RhcnR1cChDb250YWluZXIgY2hpbGRyZW5bXSkgeworCisgICAgICAgIC8vIENvbGxlY3QgImxvYWQgb24gc3RhcnR1cCIgc2VydmxldHMgdGhhdCBuZWVkIHRvIGJlIGluaXRpYWxpemVkCisgICAgICAgIFRyZWVNYXAgbWFwID0gbmV3IFRyZWVNYXAoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgV3JhcHBlciB3cmFwcGVyID0gKFdyYXBwZXIpIGNoaWxkcmVuW2ldOworICAgICAgICAgICAgaW50IGxvYWRPblN0YXJ0dXAgPSB3cmFwcGVyLmdldExvYWRPblN0YXJ0dXAoKTsKKyAgICAgICAgICAgIGlmIChsb2FkT25TdGFydHVwIDwgMCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlmIChsb2FkT25TdGFydHVwID09IDApICAgICAvLyBBcmJpdHJhcmlseSBwdXQgdGhlbSBsYXN0CisgICAgICAgICAgICAgICAgbG9hZE9uU3RhcnR1cCA9IEludGVnZXIuTUFYX1ZBTFVFOworICAgICAgICAgICAgSW50ZWdlciBrZXkgPSBuZXcgSW50ZWdlcihsb2FkT25TdGFydHVwKTsKKyAgICAgICAgICAgIEFycmF5TGlzdCBsaXN0ID0gKEFycmF5TGlzdCkgbWFwLmdldChrZXkpOworICAgICAgICAgICAgaWYgKGxpc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgICAgICAgICAgbWFwLnB1dChrZXksIGxpc3QpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGlzdC5hZGQod3JhcHBlcik7CisgICAgICAgIH0KKworICAgICAgICAvLyBMb2FkIHRoZSBjb2xsZWN0ZWQgImxvYWQgb24gc3RhcnR1cCIgc2VydmxldHMKKyAgICAgICAgSXRlcmF0b3Iga2V5cyA9IG1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOworICAgICAgICB3aGlsZSAoa2V5cy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIEludGVnZXIga2V5ID0gKEludGVnZXIpIGtleXMubmV4dCgpOworICAgICAgICAgICAgQXJyYXlMaXN0IGxpc3QgPSAoQXJyYXlMaXN0KSBtYXAuZ2V0KGtleSk7CisgICAgICAgICAgICBJdGVyYXRvciB3cmFwcGVycyA9IGxpc3QuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIHdoaWxlICh3cmFwcGVycy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBXcmFwcGVyIHdyYXBwZXIgPSAoV3JhcHBlcikgd3JhcHBlcnMubmV4dCgpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHdyYXBwZXIubG9hZCgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNlcnZsZXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBnZXRTZXJ2bGV0Q29udGV4dCgpLmxvZworICAgICAgICAgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygic3RhbmRhcmRXcmFwcGVyLmxvYWRFeGNlcHRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXROYW1lKCkpLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gTk9URTogbG9hZCBlcnJvcnMgKGluY2x1ZGluZyBhIHNlcnZsZXQgdGhhdCB0aHJvd3MKKyAgICAgICAgICAgICAgICAgICAgLy8gVW5hdmFpbGFibGVFeGNlcHRpb24gZnJvbSB0aHQgaW5pdCgpIG1ldGhvZCkgYXJlIE5PVAorICAgICAgICAgICAgICAgICAgICAvLyBmYXRhbCB0byBhcHBsaWNhdGlvbiBzdGFydHVwCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFN0YXJ0IHRoaXMgQ29udGV4dCBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIExpZmVjeWNsZUV4Y2VwdGlvbiBpZiBhIHN0YXJ0dXAgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHN0YXJ0KCkgdGhyb3dzIExpZmVjeWNsZUV4Y2VwdGlvbiB7CisgICAgICAgIC8vaWYgKGxhenkgKSByZXR1cm47CisgICAgICAgIGlmIChzdGFydGVkKSB7CisgICAgICAgICAgICBsb2cuaW5mbyhzbS5nZXRTdHJpbmcoImNvbnRhaW5lckJhc2UuYWxyZWFkeVN0YXJ0ZWQiLCBsb2dOYW1lKCkpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiggIWluaXRpYWxpemVkICkgeyAKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaW5pdCgpOworICAgICAgICAgICAgfSBjYXRjaCggRXhjZXB0aW9uIGV4ICkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBMaWZlY3ljbGVFeGNlcHRpb24oIkVycm9yIGluaXRpYWxpemFpbmcgIiwgZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbG9nLmRlYnVnKCJTdGFydGluZyAiICsgKCIiLmVxdWFscyhnZXROYW1lKCkpID8gIlJPT1QiIDogZ2V0TmFtZSgpKSk7CisKKyAgICAgICAgLy8gU2V0IEpNWCBvYmplY3QgbmFtZSBmb3IgcHJvcGVyIHBpcGVsaW5lIHJlZ2lzdHJhdGlvbgorICAgICAgICBwcmVSZWdpc3RlckpNWCgpOworCisgICAgICAgIGlmICgob25hbWUgIT0gbnVsbCkgJiYgCisgICAgICAgICAgICAoUmVnaXN0cnkuZ2V0UmVnaXN0cnkobnVsbCwgbnVsbCkuZ2V0TUJlYW5TZXJ2ZXIoKS5pc1JlZ2lzdGVyZWQob25hbWUpKSkgeworICAgICAgICAgICAgLy8gQXMgdGhpbmdzIGRlcGVuZCBvbiB0aGUgSk1YIHJlZ2lzdHJhdGlvbiwgdGhlIGNvbnRleHQKKyAgICAgICAgICAgIC8vIG11c3QgYmUgcmVyZWdpc3RlcmVkIGFnYWluIG9uY2UgcHJvcGVybHkgaW5pdGlhbGl6ZWQKKyAgICAgICAgICAgIFJlZ2lzdHJ5LmdldFJlZ2lzdHJ5KG51bGwsIG51bGwpLnVucmVnaXN0ZXJDb21wb25lbnQob25hbWUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gTm90aWZ5IG91ciBpbnRlcmVzdGVkIExpZmVjeWNsZUxpc3RlbmVycworICAgICAgICBsaWZlY3ljbGUuZmlyZUxpZmVjeWNsZUV2ZW50KEJFRk9SRV9TVEFSVF9FVkVOVCwgbnVsbCk7CisKKyAgICAgICAgc2V0QXZhaWxhYmxlKGZhbHNlKTsKKyAgICAgICAgc2V0Q29uZmlndXJlZChmYWxzZSk7CisgICAgICAgIGJvb2xlYW4gb2sgPSB0cnVlOworCisgICAgICAgIC8vIEFkZCBtaXNzaW5nIGNvbXBvbmVudHMgYXMgbmVjZXNzYXJ5CisgICAgICAgIGlmICh3ZWJhcHBSZXNvdXJjZXMgPT0gbnVsbCkgeyAgIC8vICgxKSBSZXF1aXJlZCBieSBMb2FkZXIKKyAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkNvbmZpZ3VyaW5nIGRlZmF1bHQgUmVzb3VyY2VzIik7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmICgoZG9jQmFzZSAhPSBudWxsKSAmJiAoZG9jQmFzZS5lbmRzV2l0aCgiLndhciIpKSAmJiAoIShuZXcgRmlsZShnZXRCYXNlUGF0aCgpKSkuaXNEaXJlY3RvcnkoKSkpCisgICAgICAgICAgICAgICAgICAgIHNldFJlc291cmNlcyhuZXcgV0FSRGlyQ29udGV4dCgpKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHNldFJlc291cmNlcyhuZXcgRmlsZURpckNvbnRleHQoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiRXJyb3IgaW5pdGlhbGl6aW5nIHJlc291cmNlczogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChvaykgeworICAgICAgICAgICAgaWYgKCFyZXNvdXJjZXNTdGFydCgpKSB7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKCAiRXJyb3IgaW4gcmVzb3VyY2VTdGFydCgpIik7CisgICAgICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIExvb2sgZm9yIGEgcmVhbG0gLSB0aGF0IG1heSBoYXZlIGJlZW4gY29uZmlndXJlZCBlYXJsaWVyLiAKKyAgICAgICAgLy8gSWYgdGhlIHJlYWxtIGlzIGFkZGVkIGFmdGVyIGNvbnRleHQgLSBpdCdsbCBzZXQgaXRzZWxmLgorICAgICAgICBpZiggcmVhbG0gPT0gbnVsbCApIHsKKyAgICAgICAgICAgIE9iamVjdE5hbWUgcmVhbG1OYW1lPW51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJlYWxtTmFtZT1uZXcgT2JqZWN0TmFtZSggZ2V0RW5naW5lTmFtZSgpICsgIjp0eXBlPVJlYWxtLGhvc3Q9IiArIAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SG9zdG5hbWUoKSArICIscGF0aD0iICsgZ2V0UGF0aCgpKTsKKyAgICAgICAgICAgICAgICBpZiggbXNlcnZlci5pc1JlZ2lzdGVyZWQocmVhbG1OYW1lICkgKSB7CisgICAgICAgICAgICAgICAgICAgIG1zZXJ2ZXIuaW52b2tlKHJlYWxtTmFtZSwgImluaXQiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10ge30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHt9CisgICAgICAgICAgICAgICAgICAgICk7ICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCggVGhyb3dhYmxlIHQgKSB7CisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJObyByZWFsbSBmb3IgdGhpcyBob3N0ICIgKyByZWFsbU5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoZ2V0TG9hZGVyKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgQ2xhc3NMb2FkZXIgcGFyZW50ID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChnZXRQcml2aWxlZ2VkKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ29uZmlndXJpbmcgcHJpdmlsZWdlZCBkZWZhdWx0IExvYWRlciIpOworICAgICAgICAgICAgICAgIHBhcmVudCA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ29uZmlndXJpbmcgbm9uLXByaXZpbGVnZWQgZGVmYXVsdCBMb2FkZXIiKTsKKyAgICAgICAgICAgICAgICBwYXJlbnQgPSBnZXRQYXJlbnRDbGFzc0xvYWRlcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgV2ViYXBwTG9hZGVyIHdlYmFwcExvYWRlciA9IG5ldyBXZWJhcHBMb2FkZXIocGFyZW50KTsKKyAgICAgICAgICAgIHdlYmFwcExvYWRlci5zZXREZWxlZ2F0ZShnZXREZWxlZ2F0ZSgpKTsKKyAgICAgICAgICAgIHNldExvYWRlcih3ZWJhcHBMb2FkZXIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gSW5pdGlhbGl6ZSBjaGFyYWN0ZXIgc2V0IG1hcHBlcgorICAgICAgICBnZXRDaGFyc2V0TWFwcGVyKCk7CisKKyAgICAgICAgLy8gUG9zdCB3b3JrIGRpcmVjdG9yeQorICAgICAgICBwb3N0V29ya0RpcmVjdG9yeSgpOworCisgICAgICAgIC8vIFZhbGlkYXRlIHJlcXVpcmVkIGV4dGVuc2lvbnMKKyAgICAgICAgYm9vbGVhbiBkZXBlbmRlbmN5Q2hlY2sgPSB0cnVlOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZGVwZW5kZW5jeUNoZWNrID0gRXh0ZW5zaW9uVmFsaWRhdG9yLnZhbGlkYXRlQXBwbGljYXRpb24KKyAgICAgICAgICAgICAgICAoZ2V0UmVzb3VyY2VzKCksIHRoaXMpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcigiRXJyb3IgaW4gZGVwZW5kZW5jeUNoZWNrIiwgaW9lKTsKKyAgICAgICAgICAgIGRlcGVuZGVuY3lDaGVjayA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFkZXBlbmRlbmN5Q2hlY2spIHsKKyAgICAgICAgICAgIC8vIGRvIG5vdCBtYWtlIGFwcGxpY2F0aW9uIGF2YWlsYWJsZSBpZiBkZXBlbmN5IGNoZWNrIGZhaWxzCisgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmVhZGluZyB0aGUgImNhdGFsaW5hLnVzZU5hbWluZyIgZW52aXJvbm1lbnQgdmFyaWFibGUKKyAgICAgICAgU3RyaW5nIHVzZU5hbWluZ1Byb3BlcnR5ID0gU3lzdGVtLmdldFByb3BlcnR5KCJjYXRhbGluYS51c2VOYW1pbmciKTsKKyAgICAgICAgaWYgKCh1c2VOYW1pbmdQcm9wZXJ0eSAhPSBudWxsKQorICAgICAgICAgICAgJiYgKHVzZU5hbWluZ1Byb3BlcnR5LmVxdWFscygiZmFsc2UiKSkpIHsKKyAgICAgICAgICAgIHVzZU5hbWluZyA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG9rICYmIGlzVXNlTmFtaW5nKCkpIHsKKyAgICAgICAgICAgIGlmIChuYW1pbmdDb250ZXh0TGlzdGVuZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG5hbWluZ0NvbnRleHRMaXN0ZW5lciA9IG5ldyBOYW1pbmdDb250ZXh0TGlzdGVuZXIoKTsKKyAgICAgICAgICAgICAgICBuYW1pbmdDb250ZXh0TGlzdGVuZXIuc2V0TmFtZShnZXROYW1pbmdDb250ZXh0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICBhZGRMaWZlY3ljbGVMaXN0ZW5lcihuYW1pbmdDb250ZXh0TGlzdGVuZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gQmluZGluZyB0aHJlYWQKKyAgICAgICAgQ2xhc3NMb2FkZXIgb2xkQ0NMID0gYmluZFRocmVhZCgpOworCisgICAgICAgIC8vIFN0YW5kYXJkIGNvbnRhaW5lciBzdGFydHVwCisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiUHJvY2Vzc2luZyBzdGFuZGFyZCBjb250YWluZXIgc3RhcnR1cCIpOworCisgICAgICAgIGlmIChvaykgeworCisgICAgICAgICAgICBib29sZWFuIG1haW5PayA9IGZhbHNlOworICAgICAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgICAgIHN0YXJ0ZWQgPSB0cnVlOworCisgICAgICAgICAgICAgICAgLy8gU3RhcnQgb3VyIHN1Ym9yZGluYXRlIGNvbXBvbmVudHMsIGlmIGFueQorICAgICAgICAgICAgICAgIGlmICgobG9hZGVyICE9IG51bGwpICYmIChsb2FkZXIgaW5zdGFuY2VvZiBMaWZlY3ljbGUpKQorICAgICAgICAgICAgICAgICAgICAoKExpZmVjeWNsZSkgbG9hZGVyKS5zdGFydCgpOworICAgICAgICAgICAgICAgIGlmICgobG9nZ2VyICE9IG51bGwpICYmIChsb2dnZXIgaW5zdGFuY2VvZiBMaWZlY3ljbGUpKQorICAgICAgICAgICAgICAgICAgICAoKExpZmVjeWNsZSkgbG9nZ2VyKS5zdGFydCgpOworCisgICAgICAgICAgICAgICAgLy8gVW5iaW5kaW5nIHRocmVhZAorICAgICAgICAgICAgICAgIHVuYmluZFRocmVhZChvbGRDQ0wpOworCisgICAgICAgICAgICAgICAgLy8gQmluZGluZyB0aHJlYWQKKyAgICAgICAgICAgICAgICBvbGRDQ0wgPSBiaW5kVGhyZWFkKCk7CisKKyAgICAgICAgICAgICAgICBpZiAoKGNsdXN0ZXIgIT0gbnVsbCkgJiYgKGNsdXN0ZXIgaW5zdGFuY2VvZiBMaWZlY3ljbGUpKQorICAgICAgICAgICAgICAgICAgICAoKExpZmVjeWNsZSkgY2x1c3Rlcikuc3RhcnQoKTsKKyAgICAgICAgICAgICAgICBpZiAoKHJlYWxtICE9IG51bGwpICYmIChyZWFsbSBpbnN0YW5jZW9mIExpZmVjeWNsZSkpCisgICAgICAgICAgICAgICAgICAgICgoTGlmZWN5Y2xlKSByZWFsbSkuc3RhcnQoKTsKKyAgICAgICAgICAgICAgICBpZiAoKHJlc291cmNlcyAhPSBudWxsKSAmJiAocmVzb3VyY2VzIGluc3RhbmNlb2YgTGlmZWN5Y2xlKSkKKyAgICAgICAgICAgICAgICAgICAgKChMaWZlY3ljbGUpIHJlc291cmNlcykuc3RhcnQoKTsKKworICAgICAgICAgICAgICAgIC8vIFN0YXJ0IG91ciBjaGlsZCBjb250YWluZXJzLCBpZiBhbnkKKyAgICAgICAgICAgICAgICBDb250YWluZXIgY2hpbGRyZW5bXSA9IGZpbmRDaGlsZHJlbigpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkcmVuW2ldIGluc3RhbmNlb2YgTGlmZWN5Y2xlKQorICAgICAgICAgICAgICAgICAgICAgICAgKChMaWZlY3ljbGUpIGNoaWxkcmVuW2ldKS5zdGFydCgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIFN0YXJ0IHRoZSBWYWx2ZXMgaW4gb3VyIHBpcGVsaW5lIChpbmNsdWRpbmcgdGhlIGJhc2ljKSwKKyAgICAgICAgICAgICAgICAvLyBpZiBhbnkKKyAgICAgICAgICAgICAgICBpZiAocGlwZWxpbmUgaW5zdGFuY2VvZiBMaWZlY3ljbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgKChMaWZlY3ljbGUpIHBpcGVsaW5lKS5zdGFydCgpOworCQl9CisKKyAgICAgICAgICAgICAgICBpZihnZXRQcm9jZXNzVGxkcygpKSB7CisJCSAgICBwcm9jZXNzVGxkcygpOworCQl9CisKKyAgICAgICAgICAgICAgICAvLyBOb3RpZnkgb3VyIGludGVyZXN0ZWQgTGlmZWN5Y2xlTGlzdGVuZXJzCisgICAgICAgICAgICAgICAgbGlmZWN5Y2xlLmZpcmVMaWZlY3ljbGVFdmVudChTVEFSVF9FVkVOVCwgbnVsbCk7CisKKyAgICAgICAgICAgICAgICAvLyBTdGFydCBtYW5hZ2VyCisgICAgICAgICAgICAgICAgaWYgKChtYW5hZ2VyICE9IG51bGwpICYmIChtYW5hZ2VyIGluc3RhbmNlb2YgTGlmZWN5Y2xlKSkgeworICAgICAgICAgICAgICAgICAgICAoKExpZmVjeWNsZSkgZ2V0TWFuYWdlcigpKS5zdGFydCgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIFN0YXJ0IENvbnRhaW5lckJhY2tncm91bmRQcm9jZXNzb3IgdGhyZWFkCisgICAgICAgICAgICAgICAgc3VwZXIudGhyZWFkU3RhcnQoKTsKKworICAgICAgICAgICAgICAgIG1haW5PayA9IHRydWU7CisKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgLy8gVW5iaW5kaW5nIHRocmVhZAorICAgICAgICAgICAgICAgIHVuYmluZFRocmVhZChvbGRDQ0wpOworICAgICAgICAgICAgICAgIGlmICghbWFpbk9rKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEFuIGV4Y2VwdGlvbiBvY2N1cnJlZAorICAgICAgICAgICAgICAgICAgICAvLyBSZWdpc3RlciB3aXRoIEpNWCBhbnl3YXksIHRvIGFsbG93IG1hbmFnZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJKTVgoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBpZiAoIWdldENvbmZpZ3VyZWQoKSkgeworICAgICAgICAgICAgbG9nLmVycm9yKCAiRXJyb3IgZ2V0Q29uZmlndXJlZCIpOworICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFdlIHB1dCB0aGUgcmVzb3VyY2VzIGludG8gdGhlIHNlcnZsZXQgY29udGV4dAorICAgICAgICBpZiAob2spCisgICAgICAgICAgICBnZXRTZXJ2bGV0Q29udGV4dCgpLnNldEF0dHJpYnV0ZQorICAgICAgICAgICAgICAgIChHbG9iYWxzLlJFU09VUkNFU19BVFRSLCBnZXRSZXNvdXJjZXMoKSk7CisKKyAgICAgICAgLy8gSW5pdGlhbGl6ZSBhc3NvY2lhdGVkIG1hcHBlcgorICAgICAgICBtYXBwZXIuc2V0Q29udGV4dChnZXRQYXRoKCksIHdlbGNvbWVGaWxlcywgcmVzb3VyY2VzKTsKKworICAgICAgICAvLyBCaW5kaW5nIHRocmVhZAorICAgICAgICBvbGRDQ0wgPSBiaW5kVGhyZWFkKCk7CisKKyAgICAgICAgLy8gQ3JlYXRlIGNvbnRleHQgYXR0cmlidXRlcyB0aGF0IHdpbGwgYmUgcmVxdWlyZWQKKyAgICAgICAgaWYgKG9rKSB7CisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJQb3N0aW5nIHN0YW5kYXJkIGNvbnRleHQgYXR0cmlidXRlcyIpOworICAgICAgICAgICAgcG9zdFdlbGNvbWVGaWxlcygpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG9rKSB7CisgICAgICAgICAgICAvLyBOb3RpZnkgb3VyIGludGVyZXN0ZWQgTGlmZWN5Y2xlTGlzdGVuZXJzCisgICAgICAgICAgICBsaWZlY3ljbGUuZmlyZUxpZmVjeWNsZUV2ZW50KEFGVEVSX1NUQVJUX0VWRU5ULCBudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENvbmZpZ3VyZSBhbmQgY2FsbCBhcHBsaWNhdGlvbiBldmVudCBsaXN0ZW5lcnMgYW5kIGZpbHRlcnMKKyAgICAgICAgaWYgKG9rKSB7CisgICAgICAgICAgICBpZiAoIWxpc3RlbmVyU3RhcnQoKSkgeworICAgICAgICAgICAgICAgIGxvZy5lcnJvciggIkVycm9yIGxpc3RlbmVyU3RhcnQiKTsKKyAgICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChvaykgeworICAgICAgICAgICAgaWYgKCFmaWx0ZXJTdGFydCgpKSB7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKCAiRXJyb3IgZmlsdGVyU3RhcnQiKTsKKyAgICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gTG9hZCBhbmQgaW5pdGlhbGl6ZSBhbGwgImxvYWQgb24gc3RhcnR1cCIgc2VydmxldHMKKyAgICAgICAgaWYgKG9rKSB7CisgICAgICAgICAgICBsb2FkT25TdGFydHVwKGZpbmRDaGlsZHJlbigpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFVuYmluZGluZyB0aHJlYWQKKyAgICAgICAgdW5iaW5kVGhyZWFkKG9sZENDTCk7CisKKyAgICAgICAgLy8gU2V0IGF2YWlsYWJsZSBzdGF0dXMgZGVwZW5kaW5nIHVwb24gc3RhcnR1cCBzdWNjZXNzCisgICAgICAgIGlmIChvaykgeworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiU3RhcnRpbmcgY29tcGxldGVkIik7CisgICAgICAgICAgICBzZXRBdmFpbGFibGUodHJ1ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsb2cuZXJyb3Ioc20uZ2V0U3RyaW5nKCJzdGFuZGFyZENvbnRleHQuc3RhcnRGYWlsZWQiKSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHN0b3AoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKHNtLmdldFN0cmluZygic3RhbmRhcmRDb250ZXh0LnN0YXJ0Q2xlYW51cCIpLCB0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldEF2YWlsYWJsZShmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBKTVggcmVnaXN0cmF0aW9uCisgICAgICAgIHJlZ2lzdGVySk1YKCk7CisKKyAgICAgICAgc3RhcnRUaW1lPVN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICAKKyAgICAgICAgLy8gU2VuZCBqMmVlLnN0YXRlLnJ1bm5pbmcgbm90aWZpY2F0aW9uIAorICAgICAgICBpZiAob2sgJiYgKHRoaXMuZ2V0T2JqZWN0TmFtZSgpICE9IG51bGwpKSB7CisgICAgICAgICAgICBOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uID0gCisgICAgICAgICAgICAgICAgbmV3IE5vdGlmaWNhdGlvbigiajJlZS5zdGF0ZS5ydW5uaW5nIiwgdGhpcy5nZXRPYmplY3ROYW1lKCksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZU51bWJlcisrKTsKKyAgICAgICAgICAgIGJyb2FkY2FzdGVyLnNlbmROb3RpZmljYXRpb24obm90aWZpY2F0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENsb3NlIGFsbCBKQVJzIHJpZ2h0IGF3YXkgdG8gYXZvaWQgYWx3YXlzIG9wZW5pbmcgYSBwZWFrIG51bWJlciAKKyAgICAgICAgLy8gb2YgZmlsZXMgb24gc3RhcnR1cAorICAgICAgICBpZiAoZ2V0TG9hZGVyKCkgaW5zdGFuY2VvZiBXZWJhcHBMb2FkZXIpIHsKKyAgICAgICAgICAgICgoV2ViYXBwTG9hZGVyKSBnZXRMb2FkZXIoKSkuY2xvc2VKQVJzKHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmVpbml0aWFsaXppbmcgaWYgc29tZXRoaW5nIHdlbnQgd3JvbmcKKyAgICAgICAgaWYgKCFvayAmJiBzdGFydGVkKSB7CisgICAgICAgICAgICBzdG9wKCk7CisgICAgICAgIH0KKworICAgICAgICAvL2NhY2hlQ29udGV4dCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb2Nlc3NlcyBUTERzLgorICAgICAqCisgICAgICogQHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb24gSWYgYW4gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NUbGRzKCkgdGhyb3dzIExpZmVjeWNsZUV4Y2VwdGlvbiB7CisgICAgICAgVGxkQ29uZmlnIHRsZENvbmZpZyA9IG5ldyBUbGRDb25maWcoKTsKKyAgICAgICB0bGRDb25maWcuc2V0Q29udGV4dCh0aGlzKTsKKworICAgICAgIC8vICgxKSAgY2hlY2sgaWYgdGhlIGF0dHJpYnV0ZSBoYXMgYmVlbiBkZWZpbmVkCisgICAgICAgLy8gICAgICBvbiB0aGUgY29udGV4dCBlbGVtZW50LgorICAgICAgIHRsZENvbmZpZy5zZXRUbGRWYWxpZGF0aW9uKHRsZFZhbGlkYXRpb24pOworICAgICAgIHRsZENvbmZpZy5zZXRUbGROYW1lc3BhY2VBd2FyZSh0bGROYW1lc3BhY2VBd2FyZSk7CisKKyAgICAgICAvLyAoMikgaWYgdGhlIGF0dHJpYnV0ZSB3YXNuJ3QgZGVmaW5lZCBvbiB0aGUgY29udGV4dAorICAgICAgIC8vICAgICB0cnkgdGhlIGhvc3QuCisgICAgICAgaWYgKCF0bGRWYWxpZGF0aW9uKSB7CisgICAgICAgICB0bGRDb25maWcuc2V0VGxkVmFsaWRhdGlvbgorICAgICAgICAgICAoKChTdGFuZGFyZEhvc3QpIGdldFBhcmVudCgpKS5nZXRYbWxWYWxpZGF0aW9uKCkpOworICAgICAgIH0KKworICAgICAgIGlmICghdGxkTmFtZXNwYWNlQXdhcmUpIHsKKyAgICAgICAgIHRsZENvbmZpZy5zZXRUbGROYW1lc3BhY2VBd2FyZQorICAgICAgICAgICAoKChTdGFuZGFyZEhvc3QpIGdldFBhcmVudCgpKS5nZXRYbWxOYW1lc3BhY2VBd2FyZSgpKTsKKyAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgIHRyeSB7CisgICAgICAgICB0bGRDb25maWcuZXhlY3V0ZSgpOworICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgbG9nLmVycm9yKCJFcnJvciByZWFkaW5nIHRsZCBsaXN0ZW5lcnMgIiAKKyAgICAgICAgICAgICAgICAgICAgKyBleC50b1N0cmluZygpLCBleCk7IAorICAgICAgIH0KKyAgICAgfQorICAgIAorICAgIHByaXZhdGUgdm9pZCBjYWNoZUNvbnRleHQoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBGaWxlIHdvcmtEaXI9bmV3IEZpbGUoIGdldFdvcmtQYXRoKCkgKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgRmlsZSBjdHhTZXI9bmV3IEZpbGUoIHdvcmtEaXIsICJfdG9tY2F0X2NvbnRleHQuc2VyIik7CisgICAgICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIGZvcz1uZXcgRmlsZU91dHB1dFN0cmVhbSggY3R4U2VyICk7CisgICAgICAgICAgICBPYmplY3RPdXRwdXRTdHJlYW0gb29zPW5ldyBPYmplY3RPdXRwdXRTdHJlYW0oIGZvcyApOworICAgICAgICAgICAgb29zLndyaXRlT2JqZWN0KHRoaXMpOworICAgICAgICAgICAgb29zLmNsb3NlKCk7CisgICAgICAgICAgICBmb3MuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCggVGhyb3dhYmxlIHQgKSB7CisgICAgICAgICAgICBsb2cuaW5mbygiRXJyb3Igc2F2aW5nIGNvbnRleHQuc2VyICIsIHQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RvcCB0aGlzIENvbnRleHQgY29tcG9uZW50LiBFeHBlcmltZW50YWwsIHBsZWFzZSBpZ25vcmUuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIExpZmVjeWNsZUV4Y2VwdGlvbiBpZiBhIHNodXRkb3duIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdG9wTmV3KCkgdGhyb3dzIExpZmVjeWNsZUV4Y2VwdGlvbiB7CisgICAgICAgIC8vIE1hcmsgdGhpcyBhcHBsaWNhdGlvbiBhcyB1bmF2YWlsYWJsZSB3aGlsZSB3ZSBzaHV0IGRvd24KKyAgICAgICAgc2V0QXZhaWxhYmxlKGZhbHNlKTsKKworICAgICAgICAvLyBCaW5kaW5nIHRocmVhZAorICAgICAgICBDbGFzc0xvYWRlciBvbGRDQ0wgPSBiaW5kVGhyZWFkKCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIFN0b3Agb3VyIGZpbHRlcnMKKyAgICAgICAgICAgIGZpbHRlclN0b3AoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gRmluYWxpemUgb3VyIGNoYXJhY3RlciBzZXQgbWFwcGVyCisgICAgICAgICAgICBzZXRDaGFyc2V0TWFwcGVyKG51bGwpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBTdG9wIG91ciBhcHBsaWNhdGlvbiBsaXN0ZW5lcnMKKyAgICAgICAgICAgIGxpc3RlbmVyU3RvcCgpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBTdG9wIHJlc291cmNlcworICAgICAgICAgICAgcmVzb3VyY2VzU3RvcCgpOworICAgICAgICAgICAgCisgICAgICAgICAgICBzdXBlci5zdG9wKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIFVuYmluZGluZyB0aHJlYWQKKyAgICAgICAgICAgIHVuYmluZFRocmVhZChvbGRDQ0wpOworICAgICAgICAgICAgCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIFJlc2V0IGFwcGxpY2F0aW9uIGNvbnRleHQKKyAgICAgICAgY29udGV4dCA9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RvcCB0aGlzIENvbnRleHQgY29tcG9uZW50LgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBMaWZlY3ljbGVFeGNlcHRpb24gaWYgYSBzaHV0ZG93biBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc3RvcCgpIHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb24geworCisgICAgICAgIC8vIFZhbGlkYXRlIGFuZCB1cGRhdGUgb3VyIGN1cnJlbnQgY29tcG9uZW50IHN0YXRlCisgICAgICAgIGlmICghc3RhcnRlZCkKKyAgICAgICAgICAgIHRocm93IG5ldyBMaWZlY3ljbGVFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJjb250YWluZXJCYXNlLm5vdFN0YXJ0ZWQiLCBsb2dOYW1lKCkpKTsKKworICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoIlN0b3BwaW5nIik7CisKKyAgICAgICAgLy8gTm90aWZ5IG91ciBpbnRlcmVzdGVkIExpZmVjeWNsZUxpc3RlbmVycworICAgICAgICBsaWZlY3ljbGUuZmlyZUxpZmVjeWNsZUV2ZW50KEJFRk9SRV9TVE9QX0VWRU5ULCBudWxsKTsKKyAgICAgICAgCisgICAgICAgIC8vIFNlbmQgajJlZS5zdGF0ZS5zdG9wcGluZyBub3RpZmljYXRpb24gCisgICAgICAgIGlmICh0aGlzLmdldE9iamVjdE5hbWUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uID0gCisgICAgICAgICAgICAgICAgbmV3IE5vdGlmaWNhdGlvbigiajJlZS5zdGF0ZS5zdG9wcGluZyIsIHRoaXMuZ2V0T2JqZWN0TmFtZSgpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VOdW1iZXIrKyk7CisgICAgICAgICAgICBicm9hZGNhc3Rlci5zZW5kTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbik7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIE1hcmsgdGhpcyBhcHBsaWNhdGlvbiBhcyB1bmF2YWlsYWJsZSB3aGlsZSB3ZSBzaHV0IGRvd24KKyAgICAgICAgc2V0QXZhaWxhYmxlKGZhbHNlKTsKKworICAgICAgICAvLyBCaW5kaW5nIHRocmVhZAorICAgICAgICBDbGFzc0xvYWRlciBvbGRDQ0wgPSBiaW5kVGhyZWFkKCk7CisKKyAgICAgICAgLy8gU3RvcCBvdXIgZmlsdGVycworICAgICAgICBmaWx0ZXJTdG9wKCk7CisKKyAgICAgICAgLy8gU3RvcCBDb250YWluZXJCYWNrZ3JvdW5kUHJvY2Vzc29yIHRocmVhZAorICAgICAgICBzdXBlci50aHJlYWRTdG9wKCk7CisKKyAgICAgICAgaWYgKChtYW5hZ2VyICE9IG51bGwpICYmIChtYW5hZ2VyIGluc3RhbmNlb2YgTGlmZWN5Y2xlKSkgeworICAgICAgICAgICAgKChMaWZlY3ljbGUpIG1hbmFnZXIpLnN0b3AoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEZpbmFsaXplIG91ciBjaGFyYWN0ZXIgc2V0IG1hcHBlcgorICAgICAgICBzZXRDaGFyc2V0TWFwcGVyKG51bGwpOworCisgICAgICAgIC8vIE5vcm1hbCBjb250YWluZXIgc2h1dGRvd24gcHJvY2Vzc2luZworICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoIlByb2Nlc3Npbmcgc3RhbmRhcmQgY29udGFpbmVyIHNodXRkb3duIik7CisgICAgICAgIC8vIE5vdGlmeSBvdXIgaW50ZXJlc3RlZCBMaWZlY3ljbGVMaXN0ZW5lcnMKKyAgICAgICAgbGlmZWN5Y2xlLmZpcmVMaWZlY3ljbGVFdmVudChTVE9QX0VWRU5ULCBudWxsKTsKKyAgICAgICAgc3RhcnRlZCA9IGZhbHNlOworCisgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgIC8vIFN0b3AgdGhlIFZhbHZlcyBpbiBvdXIgcGlwZWxpbmUgKGluY2x1ZGluZyB0aGUgYmFzaWMpLCBpZiBhbnkKKyAgICAgICAgICAgIGlmIChwaXBlbGluZSBpbnN0YW5jZW9mIExpZmVjeWNsZSkgeworICAgICAgICAgICAgICAgICgoTGlmZWN5Y2xlKSBwaXBlbGluZSkuc3RvcCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBTdG9wIG91ciBjaGlsZCBjb250YWluZXJzLCBpZiBhbnkKKyAgICAgICAgICAgIENvbnRhaW5lcltdIGNoaWxkcmVuID0gZmluZENoaWxkcmVuKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGNoaWxkcmVuW2ldIGluc3RhbmNlb2YgTGlmZWN5Y2xlKQorICAgICAgICAgICAgICAgICAgICAoKExpZmVjeWNsZSkgY2hpbGRyZW5baV0pLnN0b3AoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gU3RvcCBvdXIgYXBwbGljYXRpb24gbGlzdGVuZXJzCisgICAgICAgICAgICBsaXN0ZW5lclN0b3AoKTsKKworICAgICAgICAgICAgLy8gU3RvcCByZXNvdXJjZXMKKyAgICAgICAgICAgIHJlc291cmNlc1N0b3AoKTsKKworICAgICAgICAgICAgaWYgKChyZWFsbSAhPSBudWxsKSAmJiAocmVhbG0gaW5zdGFuY2VvZiBMaWZlY3ljbGUpKSB7CisgICAgICAgICAgICAgICAgKChMaWZlY3ljbGUpIHJlYWxtKS5zdG9wKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKGNsdXN0ZXIgIT0gbnVsbCkgJiYgKGNsdXN0ZXIgaW5zdGFuY2VvZiBMaWZlY3ljbGUpKSB7CisgICAgICAgICAgICAgICAgKChMaWZlY3ljbGUpIGNsdXN0ZXIpLnN0b3AoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgobG9nZ2VyICE9IG51bGwpICYmIChsb2dnZXIgaW5zdGFuY2VvZiBMaWZlY3ljbGUpKSB7CisgICAgICAgICAgICAgICAgKChMaWZlY3ljbGUpIGxvZ2dlcikuc3RvcCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChsb2FkZXIgIT0gbnVsbCkgJiYgKGxvYWRlciBpbnN0YW5jZW9mIExpZmVjeWNsZSkpIHsKKyAgICAgICAgICAgICAgICAoKExpZmVjeWNsZSkgbG9hZGVyKS5zdG9wKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBmaW5hbGx5IHsKKworICAgICAgICAgICAgLy8gVW5iaW5kaW5nIHRocmVhZAorICAgICAgICAgICAgdW5iaW5kVGhyZWFkKG9sZENDTCk7CisKKyAgICAgICAgfQorCisgICAgICAgIC8vIFNlbmQgajJlZS5zdGF0ZS5zdG9wcGVkIG5vdGlmaWNhdGlvbiAKKyAgICAgICAgaWYgKHRoaXMuZ2V0T2JqZWN0TmFtZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24gPSAKKyAgICAgICAgICAgICAgICBuZXcgTm90aWZpY2F0aW9uKCJqMmVlLnN0YXRlLnN0b3BwZWQiLCB0aGlzLmdldE9iamVjdE5hbWUoKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlTnVtYmVyKyspOworICAgICAgICAgICAgYnJvYWRjYXN0ZXIuc2VuZE5vdGlmaWNhdGlvbihub3RpZmljYXRpb24pOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBSZXNldCBhcHBsaWNhdGlvbiBjb250ZXh0CisgICAgICAgIGNvbnRleHQgPSBudWxsOworCisgICAgICAgIC8vIFRoaXMgb2JqZWN0IHdpbGwgbm8gbG9uZ2VyIGJlIHZpc2libGUgb3IgdXNlZC4gCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXNldENvbnRleHQoKTsKKyAgICAgICAgfSBjYXRjaCggRXhjZXB0aW9uIGV4ICkgeworICAgICAgICAgICAgbG9nLmVycm9yKCAiRXJyb3IgcmVzZXRpbmcgY29udGV4dCAiICsgdGhpcyArICIgIiArIGV4LCBleCApOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBOb3RpZnkgb3VyIGludGVyZXN0ZWQgTGlmZWN5Y2xlTGlzdGVuZXJzCisgICAgICAgIGxpZmVjeWNsZS5maXJlTGlmZWN5Y2xlRXZlbnQoQUZURVJfU1RPUF9FVkVOVCwgbnVsbCk7CisKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmRlYnVnKCJTdG9wcGluZyBjb21wbGV0ZSIpOworCisgICAgfQorCisgICAgLyoqIERlc3Ryb3kgbmVlZHMgdG8gY2xlYW4gdXAgdGhlIGNvbnRleHQgY29tcGxldGVseS4KKyAgICAgKiAKKyAgICAgKiBUaGUgcHJvYmxlbSBpcyB0aGF0IHVuZG9pbmcgYWxsIHRoZSBjb25maWcgaW4gc3RhcnQoKSBhbmQgcmVzdG9yaW5nIAorICAgICAqIGEgJ2ZyZXNoJyBzdGF0ZSBpcyBpbXBvc3NpYmxlLiBBZnRlciBzdG9wKCkvZGVzdHJveSgpL2luaXQoKS9zdGFydCgpCisgICAgICogd2Ugc2hvdWxkIGhhdmUgdGhlIHNhbWUgc3RhdGUgYXMgaWYgYSBmcmVzaCBzdGFydCB3YXMgZG9uZSAtIGkuZQorICAgICAqIHJlYWQgbW9kaWZpZWQgd2ViLnhtbCwgZXRjLiBUaGlzIGNhbiBvbmx5IGJlIGRvbmUgYnkgY29tcGxldGVseSAKKyAgICAgKiByZW1vdmluZyB0aGUgY29udGV4dCBvYmplY3QgYW5kIHJlbWFwcGluZyBhIG5ldyBvbmUsIG9yIGJ5IGNsZWFuaW5nCisgICAgICogdXAgZXZlcnl0aGluZy4KKyAgICAgKiAKKyAgICAgKiBYWFggU2hvdWxkIHRoaXMgYmUgZG9uZSBpbiBzdG9wKCkgPworICAgICAqIAorICAgICAqLyAKKyAgICBwdWJsaWMgdm9pZCBkZXN0cm95KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmKCBvbmFtZSAhPSBudWxsICkgeyAKKyAgICAgICAgICAgIC8vIFNlbmQgajJlZS5vYmplY3QuZGVsZXRlZCBub3RpZmljYXRpb24gCisgICAgICAgICAgICBOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uID0gCisgICAgICAgICAgICAgICAgbmV3IE5vdGlmaWNhdGlvbigiajJlZS5vYmplY3QuZGVsZXRlZCIsIHRoaXMuZ2V0T2JqZWN0TmFtZSgpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VOdW1iZXIrKyk7CisgICAgICAgICAgICBicm9hZGNhc3Rlci5zZW5kTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbik7CisgICAgICAgIH0gCisgICAgICAgIHN1cGVyLmRlc3Ryb3koKTsKKworICAgICAgICAvLyBOb3RpZnkgb3VyIGludGVyZXN0ZWQgTGlmZWN5Y2xlTGlzdGVuZXJzCisgICAgICAgIGxpZmVjeWNsZS5maXJlTGlmZWN5Y2xlRXZlbnQoREVTVFJPWV9FVkVOVCwgbnVsbCk7CisKKyAgICAgICAgaW5zdGFuY2VMaXN0ZW5lcnMgPSBuZXcgU3RyaW5nWzBdOworICAgICAgICBhcHBsaWNhdGlvbkxpc3RlbmVycyA9IG5ldyBTdHJpbmdbMF07CisgICAgfQorICAgIAorICAgIHByaXZhdGUgdm9pZCByZXNldENvbnRleHQoKSB0aHJvd3MgRXhjZXB0aW9uLCBNQmVhblJlZ2lzdHJhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIC8vIFJlc3RvcmUgdGhlIG9yaWdpbmFsIHN0YXRlICggcHJlIHJlYWRpbmcgd2ViLnhtbCBpbiBzdGFydCApCisgICAgICAgIC8vIElmIHlvdSBleHRlbmQgdGhpcyAtIG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFuZCBtYWtlIHN1cmUgdG8gY2xlYW4gdXAKKyAgICAgICAgY2hpbGRyZW49bmV3IEhhc2hNYXAoKTsKKyAgICAgICAgc3RhcnR1cFRpbWUgPSAwOworICAgICAgICBzdGFydFRpbWUgPSAwOworICAgICAgICB0bGRTY2FuVGltZSA9IDA7CisgICAgICAgIGxvZy5kZWJ1ZygicmVzZXRDb250ZXh0ICIgKyBvbmFtZSArICIgIiArIG1zZXJ2ZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGNvbXBvbmVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgaWYgKGdldFBhcmVudCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZChnZXRQYXJlbnQoKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiLiIpOworICAgICAgICB9CisgICAgICAgIHNiLmFwcGVuZCgiU3RhbmRhcmRDb250ZXh0WyIpOworICAgICAgICBzYi5hcHBlbmQoZ2V0TmFtZSgpKTsKKyAgICAgICAgc2IuYXBwZW5kKCJdIik7CisgICAgICAgIHJldHVybiAoc2IudG9TdHJpbmcoKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEV4ZWN1dGUgYSBwZXJpb2RpYyB0YXNrLCBzdWNoIGFzIHJlbG9hZGluZywgZXRjLiBUaGlzIG1ldGhvZCB3aWxsIGJlCisgICAgICogaW52b2tlZCBpbnNpZGUgdGhlIGNsYXNzbG9hZGluZyBjb250ZXh0IG9mIHRoaXMgY29udGFpbmVyLiBVbmV4cGVjdGVkCisgICAgICogdGhyb3dhYmxlcyB3aWxsIGJlIGNhdWdodCBhbmQgbG9nZ2VkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGJhY2tncm91bmRQcm9jZXNzKCkgeworCisgICAgICAgIGlmICghc3RhcnRlZCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBjb3VudCA9IChjb3VudCArIDEpICUgbWFuYWdlckNoZWNrc0ZyZXF1ZW5jeTsKKworICAgICAgICBpZiAoKGdldE1hbmFnZXIoKSAhPSBudWxsKSAmJiAoY291bnQgPT0gMCkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZ2V0TWFuYWdlcigpLmJhY2tncm91bmRQcm9jZXNzKCk7CisgICAgICAgICAgICB9IGNhdGNoICggRXhjZXB0aW9uIHggKSB7CisgICAgICAgICAgICAgICAgbG9nLndhcm4oIlVuYWJsZSB0byBwZXJmb3JtIGJhY2tncm91bmQgcHJvY2VzcyBvbiBtYW5hZ2VyIix4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChnZXRMb2FkZXIoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAocmVsb2FkYWJsZSAmJiAoZ2V0TG9hZGVyKCkubW9kaWZpZWQoKSkpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcgorICAgICAgICAgICAgICAgICAgICAgICAgKFN0YW5kYXJkQ29udGV4dC5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKTsKKyAgICAgICAgICAgICAgICAgICAgcmVsb2FkKCk7CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldExvYWRlcigpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdldExvYWRlcigpLmdldENsYXNzTG9hZGVyKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGdldExvYWRlcigpIGluc3RhbmNlb2YgV2ViYXBwTG9hZGVyKSB7CisgICAgICAgICAgICAgICAgKChXZWJhcHBMb2FkZXIpIGdldExvYWRlcigpKS5jbG9zZUpBUnMoZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm90ZWN0ZWQgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBBZGp1c3QgdGhlIFVSTCBwYXR0ZXJuIHRvIGJlZ2luIHdpdGggYSBsZWFkaW5nIHNsYXNoLCBpZiBhcHByb3ByaWF0ZQorICAgICAqIChpLmUuIHdlIGFyZSBydW5uaW5nIGEgc2VydmxldCAyLjIgYXBwbGljYXRpb24pLiAgT3RoZXJ3aXNlLCByZXR1cm4KKyAgICAgKiB0aGUgc3BlY2lmaWVkIFVSTCBwYXR0ZXJuIHVuY2hhbmdlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmxQYXR0ZXJuIFRoZSBVUkwgcGF0dGVybiB0byBiZSBhZGp1c3RlZCAoaWYgbmVlZGVkKQorICAgICAqICBhbmQgcmV0dXJuZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGFkanVzdFVSTFBhdHRlcm4oU3RyaW5nIHVybFBhdHRlcm4pIHsKKworICAgICAgICBpZiAodXJsUGF0dGVybiA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuICh1cmxQYXR0ZXJuKTsKKyAgICAgICAgaWYgKHVybFBhdHRlcm4uc3RhcnRzV2l0aCgiLyIpIHx8IHVybFBhdHRlcm4uc3RhcnRzV2l0aCgiKi4iKSkKKyAgICAgICAgICAgIHJldHVybiAodXJsUGF0dGVybik7CisgICAgICAgIGlmICghaXNTZXJ2bGV0MjIoKSkKKyAgICAgICAgICAgIHJldHVybiAodXJsUGF0dGVybik7CisgICAgICAgIGxvZy5kZWJ1ZyhzbS5nZXRTdHJpbmcoInN0YW5kYXJkQ29udGV4dC51cmxQYXR0ZXJuLnBhdHRlcm5XYXJuaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1cmxQYXR0ZXJuKSk7CisgICAgICAgIHJldHVybiAoIi8iICsgdXJsUGF0dGVybik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEFyZSB3ZSBwcm9jZXNzaW5nIGEgdmVyc2lvbiAyLjIgZGVwbG95bWVudCBkZXNjcmlwdG9yPworICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGlzU2VydmxldDIyKCkgeworCisgICAgICAgIGlmICh0aGlzLnB1YmxpY0lkID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKGZhbHNlKTsKKyAgICAgICAgaWYgKHRoaXMucHVibGljSWQuZXF1YWxzCisgICAgICAgICAgICAob3JnLmFwYWNoZS5jYXRhbGluYS5zdGFydHVwLkNvbnN0YW50cy5XZWJEdGRQdWJsaWNJZF8yMikpCisgICAgICAgICAgICByZXR1cm4gKHRydWUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gKGZhbHNlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgRmlsZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBiYXNlIGRpcmVjdG9yeSBmb3IgdGhlCisgICAgICogZW50aXJlIHNlcnZsZXQgY29udGFpbmVyIChpLmUuIHRoZSBFbmdpbmUgY29udGFpbmVyIGlmIHByZXNlbnQpLgorICAgICAqLworICAgIHByb3RlY3RlZCBGaWxlIGVuZ2luZUJhc2UoKSB7CisgICAgICAgIFN0cmluZyBiYXNlPVN5c3RlbS5nZXRQcm9wZXJ0eSgiY2F0YWxpbmEuYmFzZSIpOworICAgICAgICBpZiggYmFzZSA9PSBudWxsICkgeworICAgICAgICAgICAgU3RhbmRhcmRFbmdpbmUgZW5nPShTdGFuZGFyZEVuZ2luZSl0aGlzLmdldFBhcmVudCgpLmdldFBhcmVudCgpOworICAgICAgICAgICAgYmFzZT1lbmcuZ2V0QmFzZURpcigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAobmV3IEZpbGUoYmFzZSkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBhYmJyZXZpYXRlZCBuYW1lIG9mIHRoaXMgY29udGFpbmVyIGZvciBsb2dnaW5nIG1lc3NzYWdlcworICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgbG9nTmFtZSgpIHsKKworICAgICAgICBpZiAobG9nTmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbG9nTmFtZTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgbG9nZ2VyTmFtZSA9ICgoZ2V0TmFtZSgpID09IG51bGwpIHx8IChnZXROYW1lKCkuZXF1YWxzKCIiKSkpIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICJbL10iIDogKCJbIiArIGdldE5hbWUoKSArICJdIik7CisgICAgICAgIENvbnRhaW5lciBjdXJyZW50ID0gZ2V0UGFyZW50KCk7CisgICAgICAgIHdoaWxlIChjdXJyZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGxvZ2dlck5hbWUgPSAiWyIgKyBjdXJyZW50LmdldE5hbWUoKSArICJdIiAKKyAgICAgICAgICAgICAgICArICgobG9nZ2VyTmFtZSAhPSBudWxsKSA/ICgiLiIgKyBsb2dnZXJOYW1lKSA6ICIiKTsKKyAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LmdldFBhcmVudCgpOworICAgICAgICB9CisgICAgICAgIGxvZ05hbWUgPSBDb250YWluZXJCYXNlLmNsYXNzLmdldE5hbWUoKSArICIuIiArIGxvZ2dlck5hbWU7CisgICAgICAgIHJldHVybiBsb2dOYW1lOworICAgICAgICAKKyAgICB9CisKKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcml2YXRlIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogQmluZCBjdXJyZW50IHRocmVhZCwgYm90aCBmb3IgQ0wgcHVycG9zZXMgYW5kIGZvciBKTkRJIEVOQyBzdXBwb3J0CisgICAgICogZHVyaW5nIDogc3RhcnR1cCwgc2h1dGRvd24gYW5kIHJlYWxvYWRpbmcgb2YgdGhlIGNvbnRleHQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBwcmV2aW91cyBjb250ZXh0IGNsYXNzIGxvYWRlcgorICAgICAqLworICAgIHByaXZhdGUgQ2xhc3NMb2FkZXIgYmluZFRocmVhZCgpIHsKKworICAgICAgICBDbGFzc0xvYWRlciBvbGRDb250ZXh0Q2xhc3NMb2FkZXIgPQorICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKKworICAgICAgICBpZiAoZ2V0UmVzb3VyY2VzKCkgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBvbGRDb250ZXh0Q2xhc3NMb2FkZXI7CisKKyAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIKKyAgICAgICAgICAgIChnZXRMb2FkZXIoKS5nZXRDbGFzc0xvYWRlcigpKTsKKworICAgICAgICBEaXJDb250ZXh0VVJMU3RyZWFtSGFuZGxlci5iaW5kKGdldFJlc291cmNlcygpKTsKKworICAgICAgICBpZiAoaXNVc2VOYW1pbmcoKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBDb250ZXh0QmluZGluZ3MuYmluZFRocmVhZCh0aGlzLCB0aGlzKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gU2lsZW50IGNhdGNoLCBhcyB0aGlzIGlzIGEgbm9ybWFsIGNhc2UgZHVyaW5nIHRoZSBlYXJseQorICAgICAgICAgICAgICAgIC8vIHN0YXJ0dXAgc3RhZ2VzCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gb2xkQ29udGV4dENsYXNzTG9hZGVyOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBVbmJpbmQgdGhyZWFkLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB1bmJpbmRUaHJlYWQoQ2xhc3NMb2FkZXIgb2xkQ29udGV4dENsYXNzTG9hZGVyKSB7CisKKyAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIob2xkQ29udGV4dENsYXNzTG9hZGVyKTsKKworICAgICAgICBvbGRDb250ZXh0Q2xhc3NMb2FkZXIgPSBudWxsOworCisgICAgICAgIGlmIChpc1VzZU5hbWluZygpKSB7CisgICAgICAgICAgICBDb250ZXh0QmluZGluZ3MudW5iaW5kVGhyZWFkKHRoaXMsIHRoaXMpOworICAgICAgICB9CisKKyAgICAgICAgRGlyQ29udGV4dFVSTFN0cmVhbUhhbmRsZXIudW5iaW5kKCk7CisKKyAgICB9CisKKworCisgICAgLyoqCisgICAgICogR2V0IGJhc2UgcGF0aC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBnZXRCYXNlUGF0aCgpIHsKKyAgICAgICAgU3RyaW5nIGRvY0Jhc2UgPSBudWxsOworICAgICAgICBDb250YWluZXIgY29udGFpbmVyID0gdGhpczsKKyAgICAgICAgd2hpbGUgKGNvbnRhaW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgSG9zdCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRhaW5lciA9IGNvbnRhaW5lci5nZXRQYXJlbnQoKTsKKyAgICAgICAgfQorICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShnZXREb2NCYXNlKCkpOworICAgICAgICBpZiAoIWZpbGUuaXNBYnNvbHV0ZSgpKSB7CisgICAgICAgICAgICBpZiAoY29udGFpbmVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBkb2NCYXNlID0gKG5ldyBGaWxlKGVuZ2luZUJhc2UoKSwgZ2V0RG9jQmFzZSgpKSkuZ2V0UGF0aCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBVc2UgdGhlICJhcHBCYXNlIiBwcm9wZXJ0eSBvZiB0aGlzIGNvbnRhaW5lcgorICAgICAgICAgICAgICAgIFN0cmluZyBhcHBCYXNlID0gKChIb3N0KSBjb250YWluZXIpLmdldEFwcEJhc2UoKTsKKyAgICAgICAgICAgICAgICBmaWxlID0gbmV3IEZpbGUoYXBwQmFzZSk7CisgICAgICAgICAgICAgICAgaWYgKCFmaWxlLmlzQWJzb2x1dGUoKSkKKyAgICAgICAgICAgICAgICAgICAgZmlsZSA9IG5ldyBGaWxlKGVuZ2luZUJhc2UoKSwgYXBwQmFzZSk7CisgICAgICAgICAgICAgICAgZG9jQmFzZSA9IChuZXcgRmlsZShmaWxlLCBnZXREb2NCYXNlKCkpKS5nZXRQYXRoKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkb2NCYXNlID0gZmlsZS5nZXRQYXRoKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGRvY0Jhc2U7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHZXQgYXBwIGJhc2UuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0QXBwQmFzZSgpIHsKKyAgICAgICAgU3RyaW5nIGFwcEJhc2UgPSBudWxsOworICAgICAgICBDb250YWluZXIgY29udGFpbmVyID0gdGhpczsKKyAgICAgICAgd2hpbGUgKGNvbnRhaW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgSG9zdCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRhaW5lciA9IGNvbnRhaW5lci5nZXRQYXJlbnQoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY29udGFpbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFwcEJhc2UgPSAoKEhvc3QpIGNvbnRhaW5lcikuZ2V0QXBwQmFzZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhcHBCYXNlOworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0IGNvbmZpZyBiYXNlLgorICAgICAqLworICAgIHB1YmxpYyBGaWxlIGdldENvbmZpZ0Jhc2UoKSB7CisgICAgICAgIEZpbGUgY29uZmlnQmFzZSA9IAorICAgICAgICAgICAgbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJjYXRhbGluYS5iYXNlIiksICJjb25mIik7CisgICAgICAgIGlmICghY29uZmlnQmFzZS5leGlzdHMoKSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgQ29udGFpbmVyIGNvbnRhaW5lciA9IHRoaXM7CisgICAgICAgIENvbnRhaW5lciBob3N0ID0gbnVsbDsKKyAgICAgICAgQ29udGFpbmVyIGVuZ2luZSA9IG51bGw7CisgICAgICAgIHdoaWxlIChjb250YWluZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIEhvc3QpCisgICAgICAgICAgICAgICAgaG9zdCA9IGNvbnRhaW5lcjsKKyAgICAgICAgICAgIGlmIChjb250YWluZXIgaW5zdGFuY2VvZiBFbmdpbmUpCisgICAgICAgICAgICAgICAgZW5naW5lID0gY29udGFpbmVyOworICAgICAgICAgICAgY29udGFpbmVyID0gY29udGFpbmVyLmdldFBhcmVudCgpOworICAgICAgICB9CisgICAgICAgIGlmIChlbmdpbmUgIT0gbnVsbCkgeworICAgICAgICAgICAgY29uZmlnQmFzZSA9IG5ldyBGaWxlKGNvbmZpZ0Jhc2UsIGVuZ2luZS5nZXROYW1lKCkpOworICAgICAgICB9CisgICAgICAgIGlmIChob3N0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNvbmZpZ0Jhc2UgPSBuZXcgRmlsZShjb25maWdCYXNlLCBob3N0LmdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgY29uZmlnQmFzZS5ta2RpcnMoKTsKKyAgICAgICAgcmV0dXJuIGNvbmZpZ0Jhc2U7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHaXZlbiBhIGNvbnRleHQgcGF0aCwgZ2V0IHRoZSBjb25maWcgZmlsZSBuYW1lLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdENvbmZpZ0ZpbGUoKSB7CisgICAgICAgIFN0cmluZyBiYXNlbmFtZSA9IG51bGw7CisgICAgICAgIFN0cmluZyBwYXRoID0gZ2V0UGF0aCgpOworICAgICAgICBpZiAocGF0aC5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICBiYXNlbmFtZSA9ICJST09UIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJhc2VuYW1lID0gcGF0aC5zdWJzdHJpbmcoMSkucmVwbGFjZSgnLycsICcjJyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChiYXNlbmFtZSArICIueG1sIik7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDb3B5IGEgZmlsZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gY29weShGaWxlIHNyYywgRmlsZSBkZXN0KSB7CisgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBpcyA9IG51bGw7CisgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gb3MgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHNyYyk7CisgICAgICAgICAgICBvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGRlc3QpOworICAgICAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzQwOTZdOworICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICBpbnQgbGVuID0gaXMucmVhZChidWYpOworICAgICAgICAgICAgICAgIGlmIChsZW4gPCAwKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBvcy53cml0ZShidWYsIDAsIGxlbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpcy5jbG9zZSgpOworICAgICAgICAgICAgb3MuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAoaXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpcy5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gSWdub3JlCisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmIChvcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG9zLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBJZ25vcmUKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdldCBuYW1pbmcgY29udGV4dCBmdWxsIG5hbWUuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0TmFtaW5nQ29udGV4dE5hbWUoKSB7CisgICAgaWYgKG5hbWluZ0NvbnRleHROYW1lID09IG51bGwpIHsKKyAgICAgICAgQ29udGFpbmVyIHBhcmVudCA9IGdldFBhcmVudCgpOworICAgICAgICBpZiAocGFyZW50ID09IG51bGwpIHsKKyAgICAgICAgbmFtaW5nQ29udGV4dE5hbWUgPSBnZXROYW1lKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgIFN0YWNrIHN0ayA9IG5ldyBTdGFjaygpOworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgd2hpbGUgKHBhcmVudCAhPSBudWxsKSB7CisgICAgICAgICAgICBzdGsucHVzaChwYXJlbnQuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnQoKTsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoIXN0ay5lbXB0eSgpKSB7CisgICAgICAgICAgICBidWZmLmFwcGVuZCgiLyIgKyBzdGsucG9wKCkpOworICAgICAgICB9CisgICAgICAgIGJ1ZmYuYXBwZW5kKGdldE5hbWUoKSk7CisgICAgICAgIG5hbWluZ0NvbnRleHROYW1lID0gYnVmZi50b1N0cmluZygpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBuYW1pbmdDb250ZXh0TmFtZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcmVxdWVzdCBwcm9jZXNzaW5nIHBhdXNlZCBmbGFnIGZvciB0aGlzIENvbnRleHQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0UGF1c2VkKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5wYXVzZWQpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBQb3N0IGEgY29weSBvZiBvdXIgd2ViIGFwcGxpY2F0aW9uIHJlc291cmNlcyBhcyBhIHNlcnZsZXQgY29udGV4dAorICAgICAqIGF0dHJpYnV0ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcG9zdFJlc291cmNlcygpIHsKKworICAgICAgICBnZXRTZXJ2bGV0Q29udGV4dCgpLnNldEF0dHJpYnV0ZQorICAgICAgICAgICAgKEdsb2JhbHMuUkVTT1VSQ0VTX0FUVFIsIGdldFJlc291cmNlcygpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUG9zdCBhIGNvcHkgb2Ygb3VyIGN1cnJlbnQgbGlzdCBvZiB3ZWxjb21lIGZpbGVzIGFzIGEgc2VydmxldCBjb250ZXh0CisgICAgICogYXR0cmlidXRlLCBzbyB0aGF0IHRoZSBkZWZhdWx0IHNlcnZsZXQgY2FuIGZpbmQgdGhlbS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcG9zdFdlbGNvbWVGaWxlcygpIHsKKworICAgICAgICBnZXRTZXJ2bGV0Q29udGV4dCgpLnNldEF0dHJpYnV0ZSgib3JnLmFwYWNoZS5jYXRhbGluYS5XRUxDT01FX0ZJTEVTIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VsY29tZUZpbGVzKTsKKworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SG9zdG5hbWUoKSB7CisgICAgICAgIENvbnRhaW5lciBwYXJlbnRIb3N0ID0gZ2V0UGFyZW50KCk7CisgICAgICAgIGlmIChwYXJlbnRIb3N0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGhvc3ROYW1lID0gcGFyZW50SG9zdC5nZXROYW1lKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChob3N0TmFtZSA9PSBudWxsKSB8fCAoaG9zdE5hbWUubGVuZ3RoKCkgPCAxKSkKKyAgICAgICAgICAgIGhvc3ROYW1lID0gIl8iOworICAgICAgICByZXR1cm4gaG9zdE5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBhcHByb3ByaWF0ZSBjb250ZXh0IGF0dHJpYnV0ZSBmb3Igb3VyIHdvcmsgZGlyZWN0b3J5LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwb3N0V29ya0RpcmVjdG9yeSgpIHsKKworICAgICAgICAvLyBBY3F1aXJlIChvciBjYWxjdWxhdGUpIHRoZSB3b3JrIGRpcmVjdG9yeSBwYXRoCisgICAgICAgIFN0cmluZyB3b3JrRGlyID0gZ2V0V29ya0RpcigpOworICAgICAgICBpZiAod29ya0RpciA9PSBudWxsKSB7CisKKyAgICAgICAgICAgIC8vIFJldHJpZXZlIG91ciBwYXJlbnQgKG5vcm1hbGx5IGEgaG9zdCkgbmFtZQorICAgICAgICAgICAgU3RyaW5nIGhvc3ROYW1lID0gbnVsbDsKKyAgICAgICAgICAgIFN0cmluZyBlbmdpbmVOYW1lID0gbnVsbDsKKyAgICAgICAgICAgIFN0cmluZyBob3N0V29ya0RpciA9IG51bGw7CisgICAgICAgICAgICBDb250YWluZXIgcGFyZW50SG9zdCA9IGdldFBhcmVudCgpOworICAgICAgICAgICAgaWYgKHBhcmVudEhvc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGhvc3ROYW1lID0gcGFyZW50SG9zdC5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgaWYgKHBhcmVudEhvc3QgaW5zdGFuY2VvZiBTdGFuZGFyZEhvc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgaG9zdFdvcmtEaXIgPSAoKFN0YW5kYXJkSG9zdClwYXJlbnRIb3N0KS5nZXRXb3JrRGlyKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENvbnRhaW5lciBwYXJlbnRFbmdpbmUgPSBwYXJlbnRIb3N0LmdldFBhcmVudCgpOworICAgICAgICAgICAgICAgIGlmIChwYXJlbnRFbmdpbmUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgIGVuZ2luZU5hbWUgPSBwYXJlbnRFbmdpbmUuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgoaG9zdE5hbWUgPT0gbnVsbCkgfHwgKGhvc3ROYW1lLmxlbmd0aCgpIDwgMSkpCisgICAgICAgICAgICAgICAgaG9zdE5hbWUgPSAiXyI7CisgICAgICAgICAgICBpZiAoKGVuZ2luZU5hbWUgPT0gbnVsbCkgfHwgKGVuZ2luZU5hbWUubGVuZ3RoKCkgPCAxKSkKKyAgICAgICAgICAgICAgICBlbmdpbmVOYW1lID0gIl8iOworCisgICAgICAgICAgICBTdHJpbmcgdGVtcCA9IGdldFBhdGgoKTsKKyAgICAgICAgICAgIGlmICh0ZW1wLnN0YXJ0c1dpdGgoIi8iKSkKKyAgICAgICAgICAgICAgICB0ZW1wID0gdGVtcC5zdWJzdHJpbmcoMSk7CisgICAgICAgICAgICB0ZW1wID0gdGVtcC5yZXBsYWNlKCcvJywgJ18nKTsKKyAgICAgICAgICAgIHRlbXAgPSB0ZW1wLnJlcGxhY2UoJ1xcJywgJ18nKTsKKyAgICAgICAgICAgIGlmICh0ZW1wLmxlbmd0aCgpIDwgMSkKKyAgICAgICAgICAgICAgICB0ZW1wID0gIl8iOworICAgICAgICAgICAgaWYgKGhvc3RXb3JrRGlyICE9IG51bGwgKSB7CisgICAgICAgICAgICAgICAgd29ya0RpciA9IGhvc3RXb3JrRGlyICsgRmlsZS5zZXBhcmF0b3IgKyB0ZW1wOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB3b3JrRGlyID0gIndvcmsiICsgRmlsZS5zZXBhcmF0b3IgKyBlbmdpbmVOYW1lICsKKyAgICAgICAgICAgICAgICAgICAgRmlsZS5zZXBhcmF0b3IgKyBob3N0TmFtZSArIEZpbGUuc2VwYXJhdG9yICsgdGVtcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldFdvcmtEaXIod29ya0Rpcik7CisgICAgICAgIH0KKworICAgICAgICAvLyBDcmVhdGUgdGhpcyBkaXJlY3RvcnkgaWYgbmVjZXNzYXJ5CisgICAgICAgIEZpbGUgZGlyID0gbmV3IEZpbGUod29ya0Rpcik7CisgICAgICAgIGlmICghZGlyLmlzQWJzb2x1dGUoKSkgeworICAgICAgICAgICAgRmlsZSBjYXRhbGluYUhvbWUgPSBlbmdpbmVCYXNlKCk7CisgICAgICAgICAgICBTdHJpbmcgY2F0YWxpbmFIb21lUGF0aCA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNhdGFsaW5hSG9tZVBhdGggPSBjYXRhbGluYUhvbWUuZ2V0Q2Fub25pY2FsUGF0aCgpOworICAgICAgICAgICAgICAgIGRpciA9IG5ldyBGaWxlKGNhdGFsaW5hSG9tZVBhdGgsIHdvcmtEaXIpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGRpci5ta2RpcnMoKTsKKworICAgICAgICAvLyBTZXQgdGhlIGFwcHJvcHJpYXRlIHNlcnZsZXQgY29udGV4dCBhdHRyaWJ1dGUKKyAgICAgICAgZ2V0U2VydmxldENvbnRleHQoKS5zZXRBdHRyaWJ1dGUoR2xvYmFscy5XT1JLX0RJUl9BVFRSLCBkaXIpOworICAgICAgICBpZiAoZ2V0U2VydmxldENvbnRleHQoKSBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uQ29udGV4dCkKKyAgICAgICAgICAgICgoQXBwbGljYXRpb25Db250ZXh0KSBnZXRTZXJ2bGV0Q29udGV4dCgpKS5zZXRBdHRyaWJ1dGVSZWFkT25seQorICAgICAgICAgICAgICAgIChHbG9iYWxzLldPUktfRElSX0FUVFIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHJlcXVlc3QgcHJvY2Vzc2luZyBwYXVzZWQgZmxhZyBmb3IgdGhpcyBDb250ZXh0LgorICAgICAqCisgICAgICogQHBhcmFtIHBhdXNlZCBUaGUgbmV3IHJlcXVlc3QgcHJvY2Vzc2luZyBwYXVzZWQgZmxhZworICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZXRQYXVzZWQoYm9vbGVhbiBwYXVzZWQpIHsKKworICAgICAgICB0aGlzLnBhdXNlZCA9IHBhdXNlZDsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogVmFsaWRhdGUgdGhlIHN5bnRheCBvZiBhIHByb3Bvc2VkIDxjb2RlPiZsdDt1cmwtcGF0dGVybiZndDs8L2NvZGU+CisgICAgICogZm9yIGNvbmZvcm1hbmNlIHdpdGggc3BlY2lmaWNhdGlvbiByZXF1aXJlbWVudHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJsUGF0dGVybiBVUkwgcGF0dGVybiB0byBiZSB2YWxpZGF0ZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gdmFsaWRhdGVVUkxQYXR0ZXJuKFN0cmluZyB1cmxQYXR0ZXJuKSB7CisKKyAgICAgICAgaWYgKHVybFBhdHRlcm4gPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAoZmFsc2UpOworICAgICAgICBpZiAodXJsUGF0dGVybi5zdGFydHNXaXRoKCIqLiIpKSB7CisgICAgICAgICAgICBpZiAodXJsUGF0dGVybi5pbmRleE9mKCcvJykgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiAodHJ1ZSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIChmYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCAodXJsUGF0dGVybi5zdGFydHNXaXRoKCIvIikpICYmCisgICAgICAgICAgICAgICAgKHVybFBhdHRlcm4uaW5kZXhPZigiKi4iKSA8IDApKQorICAgICAgICAgICAgcmV0dXJuICh0cnVlKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIChmYWxzZSk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gT3BlcmF0aW9ucworCisKKyAgICAvKioKKyAgICAgKiBKU1I3NyBkZXBsb3ltZW50RGVzY3JpcHRvciBhdHRyaWJ1dGUKKyAgICAgKgorICAgICAqIEByZXR1cm4gc3RyaW5nIGRlcGxveW1lbnQgZGVzY3JpcHRvciAKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldERlcGxveW1lbnREZXNjcmlwdG9yKCkgeworICAgIAorICAgICAgICBJbnB1dFN0cmVhbSBzdHJlYW0gPSBudWxsOworICAgICAgICBTZXJ2bGV0Q29udGV4dCBzZXJ2bGV0Q29udGV4dCA9IGdldFNlcnZsZXRDb250ZXh0KCk7CisgICAgICAgIGlmIChzZXJ2bGV0Q29udGV4dCAhPSBudWxsKSB7CisgICAgICAgICAgICBzdHJlYW0gPSBzZXJ2bGV0Q29udGV4dC5nZXRSZXNvdXJjZUFzU3RyZWFtKAorICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cC5Db25zdGFudHMuQXBwbGljYXRpb25XZWJYbWwpOworICAgICAgICB9CisgICAgICAgIGlmIChzdHJlYW0gPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICB9CisgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoc3RyZWFtKSk7CisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgU3RyaW5nIHN0clJlYWQgPSAiIjsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHdoaWxlIChzdHJSZWFkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoc3RyUmVhZCk7CisgICAgICAgICAgICAgICAgc3RyUmVhZCA9IGJyLnJlYWRMaW5lKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOyAKKyAgICAKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogSlNSNzcgc2VydmxldHMgYXR0cmlidXRlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGxpc3Qgb2YgYWxsIHNlcnZsZXRzICggd2Uga25vdyBhYm91dCApCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGdldFNlcnZsZXRzKCkgeworICAgICAgICAKKyAgICAgICAgU3RyaW5nW10gcmVzdWx0ID0gbnVsbDsKKworICAgICAgICBDb250YWluZXJbXSBjaGlsZHJlbiA9IGZpbmRDaGlsZHJlbigpOworICAgICAgICBpZiAoY2hpbGRyZW4gIT0gbnVsbCkgeworICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFN0cmluZ1tjaGlsZHJlbi5sZW5ndGhdOworICAgICAgICAgICAgZm9yKCBpbnQgaT0wOyBpPCBjaGlsZHJlbi5sZW5ndGg7IGkrKyApIHsKKyAgICAgICAgICAgICAgICByZXN1bHRbaV0gPSAoKFN0YW5kYXJkV3JhcHBlciljaGlsZHJlbltpXSkuZ2V0T2JqZWN0TmFtZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgCisKKyAgICBwdWJsaWMgT2JqZWN0TmFtZSBjcmVhdGVPYmplY3ROYW1lKFN0cmluZyBob3N0RG9tYWluLCBPYmplY3ROYW1lIHBhcmVudE5hbWUpCisgICAgICAgICAgICB0aHJvd3MgTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgU3RyaW5nIG9uYW1lU3RyOworICAgICAgICBTdGFuZGFyZEhvc3QgaHN0PShTdGFuZGFyZEhvc3QpZ2V0UGFyZW50KCk7CisgICAgICAgIAorICAgICAgICBTdHJpbmcgcGF0aE5hbWU9Z2V0TmFtZSgpOworICAgICAgICBTdHJpbmcgaG9zdE5hbWU9Z2V0UGFyZW50KCkuZ2V0TmFtZSgpOworICAgICAgICBTdHJpbmcgbmFtZT0gIi8vIiArICgoaG9zdE5hbWU9PW51bGwpPyAiREVGQVVMVCIgOiBob3N0TmFtZSkgKworICAgICAgICAgICAgICAgICgoIiIuZXF1YWxzKHBhdGhOYW1lKSk/Ii8iOnBhdGhOYW1lICk7CisKKyAgICAgICAgU3RyaW5nIHN1ZmZpeD0iLEoyRUVBcHBsaWNhdGlvbj0iICsKKyAgICAgICAgICAgICAgICBnZXRKMkVFQXBwbGljYXRpb24oKSArICIsSjJFRVNlcnZlcj0iICsKKyAgICAgICAgICAgICAgICBnZXRKMkVFU2VydmVyKCk7CisKKyAgICAgICAgb25hbWVTdHI9ImoyZWVUeXBlPVdlYk1vZHVsZSxuYW1lPSIgKyBuYW1lICsgc3VmZml4OworICAgICAgICBpZiggbG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoIlJlZ2lzdGVyaW5nICIgKyBvbmFtZVN0ciArICIgZm9yICIgKyBvbmFtZSk7CisgICAgICAgIAorICAgICAgICAvLyBkZWZhdWx0IGNhc2UgLSBubyBkb21haW4gZXhwbGljdGVseSBzZXQuCisgICAgICAgIGlmKCBnZXREb21haW4oKSA9PSBudWxsICkgZG9tYWluPWhzdC5nZXREb21haW4oKTsKKworICAgICAgICBPYmplY3ROYW1lIG9uYW1lPW5ldyBPYmplY3ROYW1lKGdldERvbWFpbigpICsgIjoiICsgb25hbWVTdHIpOworICAgICAgICByZXR1cm4gb25hbWU7ICAgICAgICAKKyAgICB9ICAgIAorICAgIAorICAgIHByaXZhdGUgdm9pZCBwcmVSZWdpc3RlckpNWCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN0YW5kYXJkSG9zdCBob3N0ID0gKFN0YW5kYXJkSG9zdCkgZ2V0UGFyZW50KCk7CisgICAgICAgICAgICBpZiAoKG9uYW1lID09IG51bGwpIAorICAgICAgICAgICAgICAgIHx8IChvbmFtZS5nZXRLZXlQcm9wZXJ0eSgiajJlZVR5cGUiKSA9PSBudWxsKSkgeworICAgICAgICAgICAgICAgIG9uYW1lID0gY3JlYXRlT2JqZWN0TmFtZShob3N0LmdldERvbWFpbigpLCBob3N0LmdldEpteE5hbWUoKSk7CisgICAgICAgICAgICAgICAgY29udHJvbGxlciA9IG9uYW1lOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgbG9nLmluZm8oIkVycm9yIHJlZ2lzdGVyaW5nIGN0eCB3aXRoIGpteCAiICsgdGhpcyArICIgIiArCisgICAgICAgICAgICAgICAgICAgICBvbmFtZSArICIgIiArIGV4LnRvU3RyaW5nKCksIGV4ICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVnaXN0ZXJKTVgoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkNoZWNraW5nIGZvciAiICsgb25hbWUgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCEgUmVnaXN0cnkuZ2V0UmVnaXN0cnkobnVsbCwgbnVsbCkKKyAgICAgICAgICAgICAgICAuZ2V0TUJlYW5TZXJ2ZXIoKS5pc1JlZ2lzdGVyZWQob25hbWUpKSB7CisgICAgICAgICAgICAgICAgY29udHJvbGxlciA9IG9uYW1lOworICAgICAgICAgICAgICAgIFJlZ2lzdHJ5LmdldFJlZ2lzdHJ5KG51bGwsIG51bGwpCisgICAgICAgICAgICAgICAgICAgIC5yZWdpc3RlckNvbXBvbmVudCh0aGlzLCBvbmFtZSwgbnVsbCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gU2VuZCBqMmVlLm9iamVjdC5jcmVhdGVkIG5vdGlmaWNhdGlvbiAKKyAgICAgICAgICAgICAgICBpZiAodGhpcy5nZXRPYmplY3ROYW1lKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uID0gbmV3IE5vdGlmaWNhdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImoyZWUub2JqZWN0LmNyZWF0ZWQiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRPYmplY3ROYW1lKCksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZU51bWJlcisrKTsKKyAgICAgICAgICAgICAgICAgICAgYnJvYWRjYXN0ZXIuc2VuZE5vdGlmaWNhdGlvbihub3RpZmljYXRpb24pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnRhaW5lciBjaGlsZHJlbltdID0gZmluZENoaWxkcmVuKCk7CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGNoaWxkcmVuIT1udWxsICYmIGk8Y2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAoKFN0YW5kYXJkV3JhcHBlciljaGlsZHJlbltpXSkucmVnaXN0ZXJKTVgoIHRoaXMgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBsb2cuaW5mbygiRXJyb3IgcmVnaXN0ZXJpbmcgd3JhcHBlciB3aXRoIGpteCAiICsgdGhpcyArICIgIiArCisgICAgICAgICAgICAgICAgICAgIG9uYW1lICsgIiAiICsgZXgudG9TdHJpbmcoKSwgZXggKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiBUaGVyZSBhcmUgMiBjYXNlczoKKyAgICAgKiAgIDEuVGhlIGNvbnRleHQgaXMgY3JlYXRlZCBhbmQgcmVnaXN0ZXJlZCBieSBpbnRlcm5hbCBBUElTCisgICAgICogICAyLiBUaGUgY29udGV4dCBpcyBjcmVhdGVkIGJ5IEpNWCwgYW5kIGl0J2xsIHNlbGYtcmVnaXN0ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VydmVyIFRoZSBzZXJ2ZXIKKyAgICAgKiBAcGFyYW0gbmFtZSBUaGUgb2JqZWN0IG5hbWUKKyAgICAgKiBAcmV0dXJuIE9iamVjdE5hbWUgVGhlIG5hbWUgb2YgdGhlIG9iamVjdAorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIElmIGFuIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBPYmplY3ROYW1lIHByZVJlZ2lzdGVyKE1CZWFuU2VydmVyIHNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3ROYW1lIG5hbWUpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBpZiggb25hbWUgIT0gbnVsbCApIHsKKyAgICAgICAgICAgIC8vbG9nLmluZm8oICJBbHJlYWR5IHJlZ2lzdGVyZWQgIiArIG9uYW1lICsgIiAiICsgbmFtZSk7CisgICAgICAgICAgICAvLyBUZW1wb3JhcnkgLSAvYWRtaW4gdXNlcyB0aGUgb2xkIG5hbWVzCisgICAgICAgICAgICByZXR1cm4gbmFtZTsKKyAgICAgICAgfQorICAgICAgICBPYmplY3ROYW1lIHJlc3VsdD1zdXBlci5wcmVSZWdpc3RlcihzZXJ2ZXIsbmFtZSk7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHByZURlcmVnaXN0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYoIHN0YXJ0ZWQgKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHN0b3AoKTsKKyAgICAgICAgICAgIH0gY2F0Y2goIEV4Y2VwdGlvbiBleCApIHsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3IoICJlcnJvciBzdG9wcGluZyAiLCBleCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbml0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYoIHRoaXMuZ2V0UGFyZW50KCkgPT0gbnVsbCApIHsKKyAgICAgICAgICAgIE9iamVjdE5hbWUgcGFyZW50TmFtZT1nZXRQYXJlbnROYW1lKCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmKCAhIG1zZXJ2ZXIuaXNSZWdpc3RlcmVkKHBhcmVudE5hbWUpKSB7CisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJObyBob3N0LCBjcmVhdGluZyBvbmUgIiArIHBhcmVudE5hbWUpOworICAgICAgICAgICAgICAgIFN0YW5kYXJkSG9zdCBob3N0PW5ldyBTdGFuZGFyZEhvc3QoKTsKKyAgICAgICAgICAgICAgICBob3N0LnNldE5hbWUoaG9zdE5hbWUpOworICAgICAgICAgICAgICAgIGhvc3Quc2V0QXV0b0RlcGxveShmYWxzZSk7CisgICAgICAgICAgICAgICAgUmVnaXN0cnkuZ2V0UmVnaXN0cnkobnVsbCwgbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgLnJlZ2lzdGVyQ29tcG9uZW50KGhvc3QsIHBhcmVudE5hbWUsIG51bGwpOworICAgICAgICAgICAgICAgIG1zZXJ2ZXIuaW52b2tlKHBhcmVudE5hbWUsICJpbml0IiwgbmV3IE9iamVjdFtdIHt9LCBuZXcgU3RyaW5nW10ge30gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnRleHRDb25maWcgY29uZmlnID0gbmV3IENvbnRleHRDb25maWcoKTsKKyAgICAgICAgICAgIHRoaXMuYWRkTGlmZWN5Y2xlTGlzdGVuZXIoY29uZmlnKTsKKworICAgICAgICAgICAgbG9nLmRlYnVnKCAiQWRkQ2hpbGQgIiArIHBhcmVudE5hbWUgKyAiICIgKyB0aGlzKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbXNlcnZlci5pbnZva2UocGFyZW50TmFtZSwgImFkZENoaWxkIiwgbmV3IE9iamVjdFtdIHsgdGhpcyB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7Im9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGFpbmVyIn0pOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBkZXN0cm95KCk7CisgICAgICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzdXBlci5pbml0KCk7CisgICAgICAgIAorICAgICAgICAvLyBOb3RpZnkgb3VyIGludGVyZXN0ZWQgTGlmZWN5Y2xlTGlzdGVuZXJzCisgICAgICAgIGxpZmVjeWNsZS5maXJlTGlmZWN5Y2xlRXZlbnQoSU5JVF9FVkVOVCwgbnVsbCk7CisKKyAgICAgICAgLy8gU2VuZCBqMmVlLnN0YXRlLnN0YXJ0aW5nIG5vdGlmaWNhdGlvbiAKKyAgICAgICAgaWYgKHRoaXMuZ2V0T2JqZWN0TmFtZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24gPSBuZXcgTm90aWZpY2F0aW9uKCJqMmVlLnN0YXRlLnN0YXJ0aW5nIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0T2JqZWN0TmFtZSgpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VOdW1iZXIrKyk7CisgICAgICAgICAgICBicm9hZGNhc3Rlci5zZW5kTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbik7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgfQorCisgICAgcHVibGljIE9iamVjdE5hbWUgZ2V0UGFyZW50TmFtZSgpIHRocm93cyBNYWxmb3JtZWRPYmplY3ROYW1lRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gIkxpZmUiIHVwZGF0ZQorICAgICAgICBTdHJpbmcgcGF0aD1vbmFtZS5nZXRLZXlQcm9wZXJ0eSgibmFtZSIpOworICAgICAgICBpZiggcGF0aCA9PSBudWxsICkgeworICAgICAgICAgICAgbG9nLmVycm9yKCAiTm8gbmFtZSBhdHRyaWJ1dGUgIiArbmFtZSApOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgaWYoICEgcGF0aC5zdGFydHNXaXRoKCAiLy8iKSkgeworICAgICAgICAgICAgbG9nLmVycm9yKCJJbnZhbGlkIG5hbWUgIiArIG5hbWUpOworICAgICAgICB9CisgICAgICAgIHBhdGg9cGF0aC5zdWJzdHJpbmcoMik7CisgICAgICAgIGludCBkZWxpbT1wYXRoLmluZGV4T2YoICIvIiApOworICAgICAgICBob3N0TmFtZT0ibG9jYWxob3N0IjsgLy8gU2hvdWxkIGJlIGRlZmF1bHQuLi4KKyAgICAgICAgaWYoIGRlbGltID4gMCApIHsKKyAgICAgICAgICAgIGhvc3ROYW1lPXBhdGguc3Vic3RyaW5nKDAsIGRlbGltKTsKKyAgICAgICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZyhkZWxpbSk7CisgICAgICAgICAgICBpZiAocGF0aC5lcXVhbHMoIi8iKSkgeworICAgICAgICAgICAgICAgIHRoaXMuc2V0TmFtZSgiIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRoaXMuc2V0TmFtZShwYXRoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiU2V0dGluZyBwYXRoICIgKyAgcGF0aCApOworICAgICAgICAgICAgdGhpcy5zZXROYW1lKCBwYXRoICk7CisgICAgICAgIH0KKyAgICAgICAgLy8gWFhYIFRoZSBzZXJ2aWNlIGFuZCBkb21haW4gc2hvdWxkIGJlIHRoZSBzYW1lLgorICAgICAgICBTdHJpbmcgcGFyZW50RG9tYWluPWdldEVuZ2luZU5hbWUoKTsKKyAgICAgICAgaWYoIHBhcmVudERvbWFpbiA9PSBudWxsICkgcGFyZW50RG9tYWluPWRvbWFpbjsKKyAgICAgICAgT2JqZWN0TmFtZSBwYXJlbnROYW1lPW5ldyBPYmplY3ROYW1lKCBwYXJlbnREb21haW4gKyAiOiIgKworICAgICAgICAgICAgICAgICJ0eXBlPUhvc3QsaG9zdD0iICsgaG9zdE5hbWUpOworICAgICAgICByZXR1cm4gcGFyZW50TmFtZTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgY3JlYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbnsKKyAgICAgICAgaW5pdCgpOworICAgIH0KKworICAgIC8qIFJlbW92ZSBhIEpNWCBub3RmaWNhdGlvbkxpc3RlbmVyIAorICAgICAqIEBzZWUgamF2YXgubWFuYWdlbWVudC5Ob3RpZmljYXRpb25FbWl0dGVyI3JlbW92ZU5vdGlmaWNhdGlvbkxpc3RlbmVyKGphdmF4Lm1hbmFnZW1lbnQuTm90aWZpY2F0aW9uTGlzdGVuZXIsIGphdmF4Lm1hbmFnZW1lbnQuTm90aWZpY2F0aW9uRmlsdGVyLCBqYXZhLmxhbmcuT2JqZWN0KQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZU5vdGlmaWNhdGlvbkxpc3RlbmVyKE5vdGlmaWNhdGlvbkxpc3RlbmVyIGxpc3RlbmVyLCAKKyAgICAgICAgICAgIE5vdGlmaWNhdGlvbkZpbHRlciBmaWx0ZXIsIE9iamVjdCBvYmplY3QpIHRocm93cyBMaXN0ZW5lck5vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAJYnJvYWRjYXN0ZXIucmVtb3ZlTm90aWZpY2F0aW9uTGlzdGVuZXIobGlzdGVuZXIsZmlsdGVyLG9iamVjdCk7CisgICAgCQorICAgIH0KKyAgICAKKyAgICBwcml2YXRlIE1CZWFuTm90aWZpY2F0aW9uSW5mb1tdIG5vdGlmaWNhdGlvbkluZm87CisgICAgCisgICAgLyogR2V0IEpNWCBCcm9hZGNhc3RlciBJbmZvCisgICAgICogQFRPRE8gdXNlIFN0cmluZ01hbmFnZXIgZm9yIGludGVybmF0aW9uYWwgc3VwcG9ydCEKKyAgICAgKiBAVE9ETyBUaGlzIHR3byBldmVudHMgd2Ugbm90IHNlbmQgajJlZS5zdGF0ZS5mYWlsZWQgYW5kIGoyZWUuYXR0cmlidXRlLmNoYW5nZWQhCisgICAgICogQHNlZSBqYXZheC5tYW5hZ2VtZW50Lk5vdGlmaWNhdGlvbkJyb2FkY2FzdGVyI2dldE5vdGlmaWNhdGlvbkluZm8oKQorICAgICAqLworICAgIHB1YmxpYyBNQmVhbk5vdGlmaWNhdGlvbkluZm9bXSBnZXROb3RpZmljYXRpb25JbmZvKCkgeworICAgIAkvLyBGSVhNRTogaTE4bgorICAgIAlpZihub3RpZmljYXRpb25JbmZvID09IG51bGwpIHsKKyAgICAJCW5vdGlmaWNhdGlvbkluZm8gPSBuZXcgTUJlYW5Ob3RpZmljYXRpb25JbmZvW117CisgICAgCQkJCW5ldyBNQmVhbk5vdGlmaWNhdGlvbkluZm8obmV3IFN0cmluZ1tdIHsKKyAgICAJCQkJImoyZWUub2JqZWN0LmNyZWF0ZWQifSwKKwkJCQkJTm90aWZpY2F0aW9uLmNsYXNzLmdldE5hbWUoKSwKKwkJCQkJIndlYiBhcHBsaWNhdGlvbiBpcyBjcmVhdGVkIgorICAgIAkJCQkpLCAKKwkJCQkJbmV3IE1CZWFuTm90aWZpY2F0aW9uSW5mbyhuZXcgU3RyaW5nW10geworCQkJCQkiajJlZS5zdGF0ZS5zdGFydGluZyJ9LAorCQkJCQlOb3RpZmljYXRpb24uY2xhc3MuZ2V0TmFtZSgpLAorCQkJCQkiY2hhbmdlIHdlYiBhcHBsaWNhdGlvbiBpcyBzdGFydGluZyIKKwkJCQkJKSwKKwkJCQkJbmV3IE1CZWFuTm90aWZpY2F0aW9uSW5mbyhuZXcgU3RyaW5nW10geworCQkJCQkiajJlZS5zdGF0ZS5ydW5uaW5nIn0sCisJCQkJCU5vdGlmaWNhdGlvbi5jbGFzcy5nZXROYW1lKCksCisJCQkJCSJ3ZWIgYXBwbGljYXRpb24gaXMgcnVubmluZyIKKwkJCQkJKSwKKwkJCQkJbmV3IE1CZWFuTm90aWZpY2F0aW9uSW5mbyhuZXcgU3RyaW5nW10geworCQkJCQkiajJlZS5zdGF0ZS5zdG9wcGVkIn0sCisJCQkJCU5vdGlmaWNhdGlvbi5jbGFzcy5nZXROYW1lKCksCisJCQkJCSJ3ZWIgYXBwbGljYXRpb24gc3RhcnQgdG8gc3RvcHBlZCIKKwkJCQkJKSwKKwkJCQkJbmV3IE1CZWFuTm90aWZpY2F0aW9uSW5mbyhuZXcgU3RyaW5nW10geworCQkJCQkiajJlZS5vYmplY3Quc3RvcHBlZCJ9LAorCQkJCQlOb3RpZmljYXRpb24uY2xhc3MuZ2V0TmFtZSgpLAorCQkJCQkid2ViIGFwcGxpY2F0aW9uIGlzIHN0b3BwZWQiCisJCQkJCSksCisJCQkJCW5ldyBNQmVhbk5vdGlmaWNhdGlvbkluZm8obmV3IFN0cmluZ1tdIHsKKwkJCQkJImoyZWUub2JqZWN0LmRlbGV0ZWQifSwKKwkJCQkJTm90aWZpY2F0aW9uLmNsYXNzLmdldE5hbWUoKSwKKwkJCQkJIndlYiBhcHBsaWNhdGlvbiBpcyBkZWxldGVkIgorCQkJCQkpCisgICAgCQl9OworICAgIAkJCisgICAgCX0KKyAgICAJCisgICAgCXJldHVybiBub3RpZmljYXRpb25JbmZvOworICAgIH0KKyAgICAKKyAgICAKKyAgICAvKiBBZGQgYSBKTVgtTm90aWZpY2F0aW9uTGlzdGVuZXIKKyAgICAgKiBAc2VlIGphdmF4Lm1hbmFnZW1lbnQuTm90aWZpY2F0aW9uQnJvYWRjYXN0ZXIjYWRkTm90aWZpY2F0aW9uTGlzdGVuZXIoamF2YXgubWFuYWdlbWVudC5Ob3RpZmljYXRpb25MaXN0ZW5lciwgamF2YXgubWFuYWdlbWVudC5Ob3RpZmljYXRpb25GaWx0ZXIsIGphdmEubGFuZy5PYmplY3QpCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkTm90aWZpY2F0aW9uTGlzdGVuZXIoTm90aWZpY2F0aW9uTGlzdGVuZXIgbGlzdGVuZXIsIAorICAgICAgICAgICAgTm90aWZpY2F0aW9uRmlsdGVyIGZpbHRlciwgT2JqZWN0IG9iamVjdCkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisgICAgCWJyb2FkY2FzdGVyLmFkZE5vdGlmaWNhdGlvbkxpc3RlbmVyKGxpc3RlbmVyLGZpbHRlcixvYmplY3QpOworICAgIAkKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogUmVtb3ZlIGEgSk1YLU5vdGlmaWNhdGlvbkxpc3RlbmVyIAorICAgICAqIEBzZWUgamF2YXgubWFuYWdlbWVudC5Ob3RpZmljYXRpb25Ccm9hZGNhc3RlciNyZW1vdmVOb3RpZmljYXRpb25MaXN0ZW5lcihqYXZheC5tYW5hZ2VtZW50Lk5vdGlmaWNhdGlvbkxpc3RlbmVyKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZU5vdGlmaWNhdGlvbkxpc3RlbmVyKE5vdGlmaWNhdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSAKKyAgICB0aHJvd3MgTGlzdGVuZXJOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgCWJyb2FkY2FzdGVyLnJlbW92ZU5vdGlmaWNhdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICAJCisgICAgfQorICAgIAorICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQXR0cmlidXRlcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG5hbWluZyByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBqYXZheC5uYW1pbmcuZGlyZWN0b3J5LkRpckNvbnRleHQgZ2V0U3RhdGljUmVzb3VyY2VzKCkgeworCisgICAgICAgIHJldHVybiBnZXRSZXNvdXJjZXMoKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBuYW1pbmcgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KKyAgICAgKiBGSVhNRTogRm9vbGluZyBpbnRyb3NwZWN0aW9uIC4uLiAKKyAgICAgKi8KKyAgICBwdWJsaWMgamF2YXgubmFtaW5nLmRpcmVjdG9yeS5EaXJDb250ZXh0IGZpbmRTdGF0aWNSZXNvdXJjZXMoKSB7CisKKyAgICAgICAgcmV0dXJuIGdldFJlc291cmNlcygpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG5hbWluZyByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRXZWxjb21lRmlsZXMoKSB7CisKKyAgICAgICAgcmV0dXJuIGZpbmRXZWxjb21lRmlsZXMoKTsKKworICAgIH0KKworICAgICAvKioKKyAgICAgKiBTZXQgdGhlIHZhbGlkYXRpb24gZmVhdHVyZSBvZiB0aGUgWE1MIHBhcnNlciB1c2VkIHdoZW4KKyAgICAgKiBwYXJzaW5nIHhtbCBpbnN0YW5jZXMuCisgICAgICogQHBhcmFtIHdlYlhtbFZhbGlkYXRpb24gdHJ1ZSB0byBlbmFibGUgeG1sIGluc3RhbmNlIHZhbGlkYXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRYbWxWYWxpZGF0aW9uKGJvb2xlYW4gd2ViWG1sVmFsaWRhdGlvbil7CisgICAgICAgIAorICAgICAgICB0aGlzLndlYlhtbFZhbGlkYXRpb24gPSB3ZWJYbWxWYWxpZGF0aW9uOworCisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBzZXJ2ZXIueG1sIDxjb250ZXh0PiBhdHRyaWJ1dGUncyB4bWxWYWxpZGF0aW9uLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB2YWxpZGF0aW9uIGlzIGVuYWJsZWQuCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRYbWxWYWxpZGF0aW9uKCl7CisgICAgICAgIHJldHVybiB3ZWJYbWxWYWxpZGF0aW9uOworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBzZXJ2ZXIueG1sIDxjb250ZXh0PiBhdHRyaWJ1dGUncyB4bWxOYW1lc3BhY2VBd2FyZS4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgbmFtZXNwYWNlIGF3YXJlbmVzIGlzIGVuYWJsZWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0WG1sTmFtZXNwYWNlQXdhcmUoKXsKKyAgICAgICAgcmV0dXJuIHdlYlhtbE5hbWVzcGFjZUF3YXJlOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBuYW1lc3BhY2UgYXdhcmUgZmVhdHVyZSBvZiB0aGUgWE1MIHBhcnNlciB1c2VkIHdoZW4KKyAgICAgKiBwYXJzaW5nIHhtbCBpbnN0YW5jZXMuCisgICAgICogQHBhcmFtIHdlYlhtbE5hbWVzcGFjZUF3YXJlIHRydWUgdG8gZW5hYmxlIG5hbWVzcGFjZSBhd2FyZW5lc3MKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRYbWxOYW1lc3BhY2VBd2FyZShib29sZWFuIHdlYlhtbE5hbWVzcGFjZUF3YXJlKXsKKyAgICAgICAgdGhpcy53ZWJYbWxOYW1lc3BhY2VBd2FyZT0gd2ViWG1sTmFtZXNwYWNlQXdhcmU7CisgICAgfSAgICAKKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSB2YWxpZGF0aW9uIGZlYXR1cmUgb2YgdGhlIFhNTCBwYXJzZXIgdXNlZCB3aGVuCisgICAgICogcGFyc2luZyB0bGRzIGZpbGVzLiAKKyAgICAgKiBAcGFyYW0gdGxkVmFsaWRhdGlvbiB0cnVlIHRvIGVuYWJsZSB4bWwgaW5zdGFuY2UgdmFsaWRhdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRsZFZhbGlkYXRpb24oYm9vbGVhbiB0bGRWYWxpZGF0aW9uKXsKKyAgICAgICAgCisgICAgICAgIHRoaXMudGxkVmFsaWRhdGlvbiA9IHRsZFZhbGlkYXRpb247CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHNlcnZlci54bWwgPGNvbnRleHQ+IGF0dHJpYnV0ZSdzIHdlYlhtbFZhbGlkYXRpb24uCisgICAgICogQHJldHVybiB0cnVlIGlmIHZhbGlkYXRpb24gaXMgZW5hYmxlZC4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldFRsZFZhbGlkYXRpb24oKXsKKyAgICAgICAgcmV0dXJuIHRsZFZhbGlkYXRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgcHJvY2VzcyBUTERzIGF0dHJpYnV0ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuZXdQcm9jZXNzVGxkcyBUaGUgbmV3IHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJvY2Vzc1RsZHMoYm9vbGVhbiBuZXdQcm9jZXNzVGxkcykgeworCXByb2Nlc3NUbGRzID0gbmV3UHJvY2Vzc1RsZHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgcHJvY2Vzc1RsZHMgYXR0cmlidXRlIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldFByb2Nlc3NUbGRzKCkgeworCXJldHVybiBwcm9jZXNzVGxkczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHNlcnZlci54bWwgPGhvc3Q+IGF0dHJpYnV0ZSdzIHhtbE5hbWVzcGFjZUF3YXJlLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBuYW1lc3BhY2UgYXdhcmVuZXMgaXMgZW5hYmxlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRUbGROYW1lc3BhY2VBd2FyZSgpeworICAgICAgICByZXR1cm4gdGxkTmFtZXNwYWNlQXdhcmU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG5hbWVzcGFjZSBhd2FyZSBmZWF0dXJlIG9mIHRoZSBYTUwgcGFyc2VyIHVzZWQgd2hlbgorICAgICAqIHBhcnNpbmcgeG1sIGluc3RhbmNlcy4KKyAgICAgKiBAcGFyYW0gdGxkTmFtZXNwYWNlQXdhcmUgdHJ1ZSB0byBlbmFibGUgbmFtZXNwYWNlIGF3YXJlbmVzcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRsZE5hbWVzcGFjZUF3YXJlKGJvb2xlYW4gdGxkTmFtZXNwYWNlQXdhcmUpeworICAgICAgICB0aGlzLnRsZE5hbWVzcGFjZUF3YXJlPSB0bGROYW1lc3BhY2VBd2FyZTsKKyAgICB9ICAgIAorCisKKyAgICAvKiogCisgICAgICogU3VwcG9ydCBmb3IgInN0YXRlTWFuYWdlYWJsZSIgSlNSNzcgCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNTdGF0ZU1hbmFnZWFibGUoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzdGFydFJlY3Vyc2l2ZSgpIHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb24geworICAgICAgICAvLyBub3RoaW5nIHRvIHN0YXJ0IHJlY3Vyc2l2ZSwgdGhlIHNlcnZsZXRzIHdpbGwgYmUgc3RhcnRlZCBieSBsb2FkLW9uLXN0YXJ0dXAKKyAgICAgICAgc3RhcnQoKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIGludCBnZXRTdGF0ZSgpIHsKKyAgICAgICAgaWYoIHN0YXJ0ZWQgKSB7CisgICAgICAgICAgICByZXR1cm4gMTsgLy8gUlVOTklORworICAgICAgICB9CisgICAgICAgIGlmKCBpbml0aWFsaXplZCApIHsKKyAgICAgICAgICAgIHJldHVybiAwOyAvLyBzdGFydGluZyA/IAorICAgICAgICB9CisgICAgICAgIGlmKCAhIGF2YWlsYWJsZSApIHsgCisgICAgICAgICAgICByZXR1cm4gNDsgLy9GQUlMRUQKKyAgICAgICAgfQorICAgICAgICAvLyAyIC0gU1RPUFBJTkcKKyAgICAgICAgcmV0dXJuIDM7IC8vIFNUT1BQRUQKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogVGhlIEoyRUUgU2VydmVyIE9iamVjdE5hbWUgdGhpcyBtb2R1bGUgaXMgZGVwbG95ZWQgb24uCisgICAgICovICAgICAKKyAgICBwcml2YXRlIFN0cmluZyBzZXJ2ZXIgPSBudWxsOworICAgIAorICAgIC8qKgorICAgICAqIFRoZSBKYXZhIHZpcnR1YWwgbWFjaGluZXMgb24gd2hpY2ggdGhpcyBtb2R1bGUgaXMgcnVubmluZy4KKyAgICAgKi8gICAgICAgCisgICAgcHJpdmF0ZSBTdHJpbmdbXSBqYXZhVk1zID0gbnVsbDsKKyAgICAKKyAgICBwdWJsaWMgU3RyaW5nIGdldFNlcnZlcigpIHsKKyAgICAgICAgcmV0dXJuIHNlcnZlcjsKKyAgICB9CisgICAgICAgIAorICAgIHB1YmxpYyBTdHJpbmcgc2V0U2VydmVyKFN0cmluZyBzZXJ2ZXIpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuc2VydmVyPXNlcnZlcjsKKyAgICB9CisgICAgICAgIAorICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRKYXZhVk1zKCkgeworICAgICAgICByZXR1cm4gamF2YVZNczsKKyAgICB9CisgICAgICAgIAorICAgIHB1YmxpYyBTdHJpbmdbXSBzZXRKYXZhVk1zKFN0cmluZ1tdIGphdmFWTXMpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuamF2YVZNcyA9IGphdmFWTXM7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEdldHMgdGhlIHRpbWUgdGhpcyBjb250ZXh0IHdhcyBzdGFydGVkLgorICAgICAqCisgICAgICogQHJldHVybiBUaW1lIChpbiBtaWxsaXNlY29uZHMgc2luY2UgSmFudWFyeSAxLCAxOTcwLCAwMDowMDowMCkgd2hlbiB0aGlzCisgICAgICogY29udGV4dCB3YXMgc3RhcnRlZCAKKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRTdGFydFRpbWUoKSB7CisgICAgICAgIHJldHVybiBzdGFydFRpbWU7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIGlzRXZlbnRQcm92aWRlcigpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1N0YXRpc3RpY3NQcm92aWRlcigpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb3JlL1N0YW5kYXJkQ29udGV4dFZhbHZlLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29yZS9TdGFuZGFyZENvbnRleHRWYWx2ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhMzhkZmQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29yZS9TdGFuZGFyZENvbnRleHRWYWx2ZS5qYXZhCkBAIC0wLDAgKzEsMjcwIEBACisvKgorICogQ29weXJpZ2h0IDE5OTktMjAwMSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZTsKKworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldFJlcXVlc3RFdmVudDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXF1ZXN0TGlzdGVuZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkdsb2JhbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5XcmFwcGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLlJlcXVlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuUmVzcG9uc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLlN0cmluZ01hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS52YWx2ZXMuVmFsdmVCYXNlOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuYnVmLk1lc3NhZ2VCeXRlczsKKworLyoqCisgKiBWYWx2ZSB0aGF0IGltcGxlbWVudHMgdGhlIGRlZmF1bHQgYmFzaWMgYmVoYXZpb3IgZm9yIHRoZQorICogPGNvZGU+U3RhbmRhcmRDb250ZXh0PC9jb2RlPiBjb250YWluZXIgaW1wbGVtZW50YXRpb24uCisgKiA8cD4KKyAqIDxiPlVTQUdFIENPTlNUUkFJTlQ8L2I+OiAgVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBsaWtlbHkgdG8gYmUgdXNlZnVsIG9ubHkKKyAqIHdoZW4gcHJvY2Vzc2luZyBIVFRQIHJlcXVlc3RzLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitmaW5hbCBjbGFzcyBTdGFuZGFyZENvbnRleHRWYWx2ZQorICAgIGV4dGVuZHMgVmFsdmVCYXNlIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIHRoaXMgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGluZm8gPQorICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkQ29udGV4dFZhbHZlLzEuMCI7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzdHJpbmcgbWFuYWdlciBmb3IgdGhpcyBwYWNrYWdlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ01hbmFnZXIgc20gPQorICAgICAgICBTdHJpbmdNYW5hZ2VyLmdldE1hbmFnZXIoQ29uc3RhbnRzLlBhY2thZ2UpOworCisKKyAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coU3RhbmRhcmRDb250ZXh0VmFsdmUuY2xhc3MpOworCisgICAgCisgICAgcHJpdmF0ZSBTdGFuZGFyZENvbnRleHQgY29udGV4dCA9IG51bGw7CisgICAgCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgVmFsdmUgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJbmZvKCkgeworCisgICAgICAgIHJldHVybiAoaW5mbyk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBDYXN0IHRvIGEgU3RhbmRhcmRDb250ZXh0IHJpZ2h0IGF3YXksIGFzIGl0IHdpbGwgYmUgbmVlZGVkIGxhdGVyLgorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jYXRhbGluYS5Db250YWluZWQjc2V0Q29udGFpbmVyKG9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGFpbmVyKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbnRhaW5lcihDb250YWluZXIgY29udGFpbmVyKSB7CisgICAgICAgIHN1cGVyLnNldENvbnRhaW5lcihjb250YWluZXIpOworICAgICAgICBjb250ZXh0ID0gKFN0YW5kYXJkQ29udGV4dCkgY29udGFpbmVyOworICAgIH0KKworICAgIAorICAgIC8qKgorICAgICAqIFNlbGVjdCB0aGUgYXBwcm9wcmlhdGUgY2hpbGQgV3JhcHBlciB0byBwcm9jZXNzIHRoaXMgcmVxdWVzdCwKKyAgICAgKiBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkIHJlcXVlc3QgVVJJLiAgSWYgbm8gbWF0Y2hpbmcgV3JhcHBlciBjYW4KKyAgICAgKiBiZSBmb3VuZCwgcmV0dXJuIGFuIGFwcHJvcHJpYXRlIEhUVFAgZXJyb3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBSZXF1ZXN0IHRvIGJlIHByb2Nlc3NlZAorICAgICAqIEBwYXJhbSByZXNwb25zZSBSZXNwb25zZSB0byBiZSBwcm9kdWNlZAorICAgICAqIEBwYXJhbSB2YWx2ZUNvbnRleHQgVmFsdmUgY29udGV4dCB1c2VkIHRvIGZvcndhcmQgdG8gdGhlIG5leHQgVmFsdmUKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycmVkCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBlcnJvciBvY2N1cnJlZAorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGludm9rZShSZXF1ZXN0IHJlcXVlc3QsIFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIERpc2FsbG93IGFueSBkaXJlY3QgYWNjZXNzIHRvIHJlc291cmNlcyB1bmRlciBXRUItSU5GIG9yIE1FVEEtSU5GCisgICAgICAgIE1lc3NhZ2VCeXRlcyByZXF1ZXN0UGF0aE1CID0gcmVxdWVzdC5nZXRSZXF1ZXN0UGF0aE1CKCk7CisgICAgICAgIGlmICgocmVxdWVzdFBhdGhNQi5zdGFydHNXaXRoSWdub3JlQ2FzZSgiL01FVEEtSU5GLyIsIDApKQorICAgICAgICAgICAgfHwgKHJlcXVlc3RQYXRoTUIuZXF1YWxzSWdub3JlQ2FzZSgiL01FVEEtSU5GIikpCisgICAgICAgICAgICB8fCAocmVxdWVzdFBhdGhNQi5zdGFydHNXaXRoSWdub3JlQ2FzZSgiL1dFQi1JTkYvIiwgMCkpCisgICAgICAgICAgICB8fCAocmVxdWVzdFBhdGhNQi5lcXVhbHNJZ25vcmVDYXNlKCIvV0VCLUlORiIpKSkgeworICAgICAgICAgICAgU3RyaW5nIHJlcXVlc3RVUkkgPSByZXF1ZXN0LmdldERlY29kZWRSZXF1ZXN0VVJJKCk7CisgICAgICAgICAgICBub3RGb3VuZChyZXF1ZXN0VVJJLCByZXNwb25zZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBXYWl0IGlmIHdlIGFyZSByZWxvYWRpbmcKKyAgICAgICAgd2hpbGUgKGNvbnRleHQuZ2V0UGF1c2VkKCkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOworICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFNlbGVjdCB0aGUgV3JhcHBlciB0byBiZSB1c2VkIGZvciB0aGlzIFJlcXVlc3QKKyAgICAgICAgV3JhcHBlciB3cmFwcGVyID0gcmVxdWVzdC5nZXRXcmFwcGVyKCk7CisgICAgICAgIGlmICh3cmFwcGVyID09IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZyByZXF1ZXN0VVJJID0gcmVxdWVzdC5nZXREZWNvZGVkUmVxdWVzdFVSSSgpOworICAgICAgICAgICAgbm90Rm91bmQocmVxdWVzdFVSSSwgcmVzcG9uc2UpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gTm9ybWFsIHJlcXVlc3QgcHJvY2Vzc2luZworICAgICAgICBPYmplY3QgaW5zdGFuY2VzW10gPSBjb250ZXh0LmdldEFwcGxpY2F0aW9uRXZlbnRMaXN0ZW5lcnMoKTsKKworICAgICAgICBTZXJ2bGV0UmVxdWVzdEV2ZW50IGV2ZW50ID0gbnVsbDsKKworICAgICAgICBpZiAoKGluc3RhbmNlcyAhPSBudWxsKSAKKyAgICAgICAgICAgICAgICAmJiAoaW5zdGFuY2VzLmxlbmd0aCA+IDApKSB7CisgICAgICAgICAgICBldmVudCA9IG5ldyBTZXJ2bGV0UmVxdWVzdEV2ZW50CisgICAgICAgICAgICAgICAgKCgoU3RhbmRhcmRDb250ZXh0KSBjb250YWluZXIpLmdldFNlcnZsZXRDb250ZXh0KCksIAorICAgICAgICAgICAgICAgICByZXF1ZXN0LmdldFJlcXVlc3QoKSk7CisgICAgICAgICAgICAvLyBjcmVhdGUgcHJlLXNlcnZpY2UgZXZlbnQKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5zdGFuY2VzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlc1tpXSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBpZiAoIShpbnN0YW5jZXNbaV0gaW5zdGFuY2VvZiBTZXJ2bGV0UmVxdWVzdExpc3RlbmVyKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgU2VydmxldFJlcXVlc3RMaXN0ZW5lciBsaXN0ZW5lciA9CisgICAgICAgICAgICAgICAgICAgIChTZXJ2bGV0UmVxdWVzdExpc3RlbmVyKSBpbnN0YW5jZXNbaV07CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIucmVxdWVzdEluaXRpYWxpemVkKGV2ZW50KTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgICAgICBjb250YWluZXIuZ2V0TG9nZ2VyKCkuZXJyb3Ioc20uZ2V0U3RyaW5nKCJyZXF1ZXN0TGlzdGVuZXJWYWx2ZS5yZXF1ZXN0SW5pdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VzW2ldLmdldENsYXNzKCkuZ2V0TmFtZSgpKSwgdCk7CisgICAgICAgICAgICAgICAgICAgIFNlcnZsZXRSZXF1ZXN0IHNyZXEgPSByZXF1ZXN0LmdldFJlcXVlc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgc3JlcS5zZXRBdHRyaWJ1dGUoR2xvYmFscy5FWENFUFRJT05fQVRUUix0KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHdyYXBwZXIuZ2V0UGlwZWxpbmUoKS5nZXRGaXJzdCgpLmludm9rZShyZXF1ZXN0LCByZXNwb25zZSk7CisKKyAgICAgICAgaWYgKChpbnN0YW5jZXMgIT1udWxsICkgJiYKKyAgICAgICAgICAgICAgICAoaW5zdGFuY2VzLmxlbmd0aCA+IDApKSB7CisgICAgICAgICAgICAvLyBjcmVhdGUgcG9zdC1zZXJ2aWNlIGV2ZW50CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGluc3RhbmNlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZXNbaV0gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgaWYgKCEoaW5zdGFuY2VzW2ldIGluc3RhbmNlb2YgU2VydmxldFJlcXVlc3RMaXN0ZW5lcikpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIFNlcnZsZXRSZXF1ZXN0TGlzdGVuZXIgbGlzdGVuZXIgPQorICAgICAgICAgICAgICAgICAgICAoU2VydmxldFJlcXVlc3RMaXN0ZW5lcikgaW5zdGFuY2VzW2ldOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLnJlcXVlc3REZXN0cm95ZWQoZXZlbnQpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lci5nZXRMb2dnZXIoKS5lcnJvcihzbS5nZXRTdHJpbmcoInJlcXVlc3RMaXN0ZW5lclZhbHZlLnJlcXVlc3REZXN0cm95IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZXNbaV0uZ2V0Q2xhc3MoKS5nZXROYW1lKCkpLCB0KTsKKyAgICAgICAgICAgICAgICAgICAgU2VydmxldFJlcXVlc3Qgc3JlcSA9IHJlcXVlc3QuZ2V0UmVxdWVzdCgpOworICAgICAgICAgICAgICAgICAgICBzcmVxLnNldEF0dHJpYnV0ZShHbG9iYWxzLkVYQ0VQVElPTl9BVFRSLHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJpdmF0ZSBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJlcG9ydCBhICJiYWQgcmVxdWVzdCIgZXJyb3IgZm9yIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UuICBGSVhNRTogIFdlCisgICAgICogc2hvdWxkIHJlYWxseSBiZSB1c2luZyB0aGUgZXJyb3IgcmVwb3J0aW5nIHNldHRpbmdzIGZvciB0aGlzIHdlYgorICAgICAqIGFwcGxpY2F0aW9uLCBidXQgY3VycmVudGx5IHRoYXQgY29kZSBydW5zIGF0IHRoZSB3cmFwcGVyIGxldmVsIHJhdGhlcgorICAgICAqIHRoYW4gdGhlIGNvbnRleHQgbGV2ZWwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdFVSSSBUaGUgcmVxdWVzdCBVUkkgZm9yIHRoZSByZXF1ZXN0ZWQgcmVzb3VyY2UKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqLworICAgIHByaXZhdGUgdm9pZCBiYWRSZXF1ZXN0KFN0cmluZyByZXF1ZXN0VVJJLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcihIdHRwU2VydmxldFJlc3BvbnNlLlNDX0JBRF9SRVFVRVNULCByZXF1ZXN0VVJJKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIDsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgOworICAgICAgICB9CisKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogUmVwb3J0IGEgImZvcmJpZGRlbiIgZXJyb3IgZm9yIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UuIAorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3RVUkkgVGhlIHJlcXVlc3QgVVJJIGZvciB0aGUgcmVxdWVzdGVkIHJlc291cmNlCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZm9yYmlkZGVuKFN0cmluZyByZXF1ZXN0VVJJLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcihIdHRwU2VydmxldFJlc3BvbnNlLlNDX0ZPUkJJRERFTiwgcmVxdWVzdFVSSSk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICA7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIDsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXBvcnQgYSAibm90IGZvdW5kIiBlcnJvciBmb3IgdGhlIHNwZWNpZmllZCByZXNvdXJjZS4gIEZJWE1FOiAgV2UKKyAgICAgKiBzaG91bGQgcmVhbGx5IGJlIHVzaW5nIHRoZSBlcnJvciByZXBvcnRpbmcgc2V0dGluZ3MgZm9yIHRoaXMgd2ViCisgICAgICogYXBwbGljYXRpb24sIGJ1dCBjdXJyZW50bHkgdGhhdCBjb2RlIHJ1bnMgYXQgdGhlIHdyYXBwZXIgbGV2ZWwgcmF0aGVyCisgICAgICogdGhhbiB0aGUgY29udGV4dCBsZXZlbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0VVJJIFRoZSByZXF1ZXN0IFVSSSBmb3IgdGhlIHJlcXVlc3RlZCByZXNvdXJjZQorICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIG5vdEZvdW5kKFN0cmluZyByZXF1ZXN0VVJJLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcihIdHRwU2VydmxldFJlc3BvbnNlLlNDX05PVF9GT1VORCwgcmVxdWVzdFVSSSk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICA7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIDsKKyAgICAgICAgfQorCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb3JlL1N0YW5kYXJkRW5naW5lLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29yZS9TdGFuZGFyZEVuZ2luZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NDJjMjIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29yZS9TdGFuZGFyZEVuZ2luZS5qYXZhCkBAIC0wLDAgKzEsNTMyIEBACisvKgorICogQ29weXJpZ2h0IDE5OTktMjAwMSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZTsKKworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1hbGZvcm1lZE9iamVjdE5hbWVFeGNlcHRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Db250YWluZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5FbmdpbmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Ib3N0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuUmVhbG07CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5TZXJ2aWNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEucmVhbG0uSkFBU1JlYWxtOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5TZXJ2ZXJJbmZvOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5tb2RlbGVyLlJlZ2lzdHJ5OworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5tb2RlbGVyLm1vZHVsZXMuTWJlYW5zU291cmNlOworCisvKioKKyAqIFN0YW5kYXJkIGltcGxlbWVudGF0aW9uIG9mIHRoZSA8Yj5FbmdpbmU8L2I+IGludGVyZmFjZS4gIEVhY2gKKyAqIGNoaWxkIGNvbnRhaW5lciBtdXN0IGJlIGEgSG9zdCBpbXBsZW1lbnRhdGlvbiB0byBwcm9jZXNzIHRoZSBzcGVjaWZpYworICogZnVsbHkgcXVhbGlmaWVkIGhvc3QgbmFtZSBvZiB0aGF0IHZpcnR1YWwgaG9zdC4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIFN0YW5kYXJkRW5naW5lCisgICAgZXh0ZW5kcyBDb250YWluZXJCYXNlCisgICAgaW1wbGVtZW50cyBFbmdpbmUgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFN0YW5kYXJkRW5naW5lLmNsYXNzKTsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgU3RhbmRhcmRFbmdpbmUgY29tcG9uZW50IHdpdGggdGhlIGRlZmF1bHQgYmFzaWMgVmFsdmUuCisgICAgICovCisgICAgcHVibGljIFN0YW5kYXJkRW5naW5lKCkgeworCisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIHBpcGVsaW5lLnNldEJhc2ljKG5ldyBTdGFuZGFyZEVuZ2luZVZhbHZlKCkpOworICAgICAgICAvKiBTZXQgdGhlIGptdlJvdXRlIHVzaW5nIHRoZSBzeXN0ZW0gcHJvcGVydHkganZtUm91dGUgKi8KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNldEp2bVJvdXRlKFN5c3RlbS5nZXRQcm9wZXJ0eSgianZtUm91dGUiKSk7CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGV4KSB7CisgICAgICAgIH0KKyAgICAgICAgLy8gQnkgZGVmYXVsdCwgdGhlIGVuZ2luZSB3aWxsIGhvbGQgdGhlIHJlbG9hZGluZyB0aHJlYWQKKyAgICAgICAgYmFja2dyb3VuZFByb2Nlc3NvckRlbGF5ID0gMTA7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBIb3N0IG5hbWUgdG8gdXNlIHdoZW4gbm8gc2VydmVyIGhvc3QsIG9yIGFuIHVua25vd24gaG9zdCwKKyAgICAgKiBpcyBzcGVjaWZpZWQgaW4gdGhlIHJlcXVlc3QuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdEhvc3QgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gc3RyaW5nIGZvciB0aGlzIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBpbmZvID0KKyAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZEVuZ2luZS8xLjAiOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgPGNvZGU+U2VydmljZTwvY29kZT4gdGhhdCBvd25zIHRoaXMgRW5naW5lLCBpZiBhbnkuCisgICAgICovCisgICAgcHJpdmF0ZSBTZXJ2aWNlIHNlcnZpY2UgPSBudWxsOworCisgICAgLyoqIEFsbG93IHRoZSBiYXNlIGRpciB0byBiZSBzcGVjaWZpZWQgZXhwbGljaXRlbHkgZm9yCisgICAgICogZWFjaCBlbmdpbmUuIEluIHRpbWUgd2Ugc2hvdWxkIHN0b3AgdXNpbmcgY2F0YWxpbmEuYmFzZSBwcm9wZXJ0eSAtCisgICAgICogb3RoZXJ3aXNlIHdlIGxvb3NlIHNvbWUgZmxleGliaWxpdHkuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgYmFzZURpciA9IG51bGw7CisKKyAgICAvKiogT3B0aW9uYWwgbWJlYW5zIGNvbmZpZyBmaWxlLiBUaGlzIHdpbGwgcmVwbGFjZSB0aGUgImhhY2tzIiBpbgorICAgICAqIGprIGFuZCBTZXJ2ZXJMaXN0ZW5lci4gVGhlIG1iZWFucyBmaWxlIHdpbGwgc3VwcG9ydCAodHJhbnNwYXJlbnQpIAorICAgICAqIHBlcnNpc3RlbmNlIC0gc29vbi4gSXQnbGwgcHJvYmFibHkgcmVwbGFjZSBqazIucHJvcGVydGllcyBhbmQgY291bGQKKyAgICAgKiByZXBsYWNlIHNlcnZlci54bWwuIE9mIGNvdXJzZSAtIHRoZSBzYW1lIGJlYW5zIGNvdWxkIGJlIGxvYWRlZCBhbmQgCisgICAgICogbWFuYWdlZCBieSBhbiBleHRlcm5hbCBlbnRpdHkgLSBsaWtlIHRoZSBlbWJlZGRpbmcgYXBwIC0gd2hpY2gKKyAgICAgKiAgY2FuIHVzZSBhIGRpZmZlcmVudCBwZXJzaXN0ZW5jZSBtZWNoYW5pc20uCisgICAgICovIAorICAgIHByaXZhdGUgU3RyaW5nIG1iZWFuc0ZpbGUgPSBudWxsOworICAgIAorICAgIC8qKiBNYmVhbnMgbG9hZGVkIGJ5IHRoZSBlbmdpbmUuICAKKyAgICAgKi8gCisgICAgcHJpdmF0ZSBMaXN0IG1iZWFuczsKKyAgICAKKworICAgIC8qKgorICAgICAqIFRoZSBKVk0gUm91dGUgSUQgZm9yIHRoaXMgVG9tY2F0IGluc3RhbmNlLiBBbGwgUm91dGUgSUQncyBtdXN0IGJlIHVuaXF1ZQorICAgICAqIGFjcm9zcyB0aGUgY2x1c3Rlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBqdm1Sb3V0ZUlkOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworICAgIC8qKiBQcm92aWRlIGEgZGVmYXVsdCBpbiBjYXNlIG5vIGV4cGxpY2l0IGNvbmZpZ3VyYXRpb24gaXMgc2V0CisgICAgICoKKyAgICAgKiBAcmV0dXJuIGNvbmZpZ3VyZWQgcmVhbG0sIG9yIGEgSkFBUyByZWFsbSBieSBkZWZhdWx0CisgICAgICovCisgICAgcHVibGljIFJlYWxtIGdldFJlYWxtKCkgeworICAgICAgICBSZWFsbSBjb25maWd1cmVkPXN1cGVyLmdldFJlYWxtKCk7CisgICAgICAgIC8vIElmIG5vIHNldCByZWFsbSBoYXMgYmVlbiBjYWxsZWQgLSBkZWZhdWx0IHRvIEpBQVMKKyAgICAgICAgLy8gVGhpcyBjYW4gYmUgb3ZlcnJpZGVuIGF0IGVuZ2luZSwgY29udGV4dCBhbmQgaG9zdCBsZXZlbCAgCisgICAgICAgIGlmKCBjb25maWd1cmVkPT1udWxsICkgeworICAgICAgICAgICAgY29uZmlndXJlZD1uZXcgSkFBU1JlYWxtKCk7CisgICAgICAgICAgICB0aGlzLnNldFJlYWxtKCBjb25maWd1cmVkICk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvbmZpZ3VyZWQ7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGRlZmF1bHQgaG9zdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRIb3N0KCkgeworCisgICAgICAgIHJldHVybiAoZGVmYXVsdEhvc3QpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGRlZmF1bHQgaG9zdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBob3N0IFRoZSBuZXcgZGVmYXVsdCBob3N0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdEhvc3QoU3RyaW5nIGhvc3QpIHsKKworICAgICAgICBTdHJpbmcgb2xkRGVmYXVsdEhvc3QgPSB0aGlzLmRlZmF1bHRIb3N0OworICAgICAgICBpZiAoaG9zdCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aGlzLmRlZmF1bHRIb3N0ID0gbnVsbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRoaXMuZGVmYXVsdEhvc3QgPSBob3N0LnRvTG93ZXJDYXNlKCk7CisgICAgICAgIH0KKyAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoImRlZmF1bHRIb3N0Iiwgb2xkRGVmYXVsdEhvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdEhvc3QpOworCisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUgKSB7CisgICAgICAgIGlmKCBkb21haW4gIT0gbnVsbCApIHsKKyAgICAgICAgICAgIC8vIGtlZXAgbmFtZT09ZG9tYWluLCBpZ25vcmUgb3ZlcnJpZGUKKyAgICAgICAgICAgIC8vIHdlIGFyZSBhbHJlYWR5IHJlZ2lzdGVyZWQKKyAgICAgICAgICAgIHN1cGVyLnNldE5hbWUoIGRvbWFpbiApOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8vIFRoZSBlbmdpbmUgbmFtZSBpcyB1c2VkIGFzIGRvbWFpbgorICAgICAgICBkb21haW49bmFtZTsgLy8gWFhYIHNob3VsZCB3ZSBzZXQgaXQgaW4gaW5pdCgpID8gSXQgc2hvdWxkbid0IG1hdHRlcgorICAgICAgICBzdXBlci5zZXROYW1lKCBuYW1lICk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNsdXN0ZXItd2lkZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBFbmdpbmUuCisgICAgICogVGhpcyB2YWx1ZSBpcyBvbmx5IHVzZWZ1bCBpbiBhIGxvYWQtYmFsYW5jaW5nIHNjZW5hcmlvLgorICAgICAqIDxwPgorICAgICAqIFRoaXMgcHJvcGVydHkgc2hvdWxkIG5vdCBiZSBjaGFuZ2VkIG9uY2UgaXQgaXMgc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEp2bVJvdXRlKFN0cmluZyByb3V0ZUlkKSB7CisgICAgICAgIGp2bVJvdXRlSWQgPSByb3V0ZUlkOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0cmlldmUgdGhlIGNsdXN0ZXItd2lkZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBFbmdpbmUuCisgICAgICogVGhpcyB2YWx1ZSBpcyBvbmx5IHVzZWZ1bCBpbiBhIGxvYWQtYmFsYW5jaW5nIHNjZW5hcmlvLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SnZtUm91dGUoKSB7CisgICAgICAgIHJldHVybiBqdm1Sb3V0ZUlkOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSA8Y29kZT5TZXJ2aWNlPC9jb2RlPiB3aXRoIHdoaWNoIHdlIGFyZSBhc3NvY2lhdGVkIChpZiBhbnkpLgorICAgICAqLworICAgIHB1YmxpYyBTZXJ2aWNlIGdldFNlcnZpY2UoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLnNlcnZpY2UpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIDxjb2RlPlNlcnZpY2U8L2NvZGU+IHdpdGggd2hpY2ggd2UgYXJlIGFzc29jaWF0ZWQgKGlmIGFueSkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VydmljZSBUaGUgc2VydmljZSB0aGF0IG93bnMgdGhpcyBFbmdpbmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlKFNlcnZpY2Ugc2VydmljZSkgeworICAgICAgICB0aGlzLnNlcnZpY2UgPSBzZXJ2aWNlOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWJlYW5zRmlsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1iZWFuc0ZpbGU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TWJlYW5zRmlsZShTdHJpbmcgbWJlYW5zRmlsZSkgeworICAgICAgICB0aGlzLm1iZWFuc0ZpbGUgPSBtYmVhbnNGaWxlOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QmFzZURpcigpIHsKKyAgICAgICAgaWYoIGJhc2VEaXI9PW51bGwgKSB7CisgICAgICAgICAgICBiYXNlRGlyPVN5c3RlbS5nZXRQcm9wZXJ0eSgiY2F0YWxpbmEuYmFzZSIpOworICAgICAgICB9CisgICAgICAgIGlmKCBiYXNlRGlyPT1udWxsICkgeworICAgICAgICAgICAgYmFzZURpcj1TeXN0ZW0uZ2V0UHJvcGVydHkoImNhdGFsaW5hLmhvbWUiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYmFzZURpcjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRCYXNlRGlyKFN0cmluZyBiYXNlRGlyKSB7CisgICAgICAgIHRoaXMuYmFzZURpciA9IGJhc2VEaXI7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIEFkZCBhIGNoaWxkIENvbnRhaW5lciwgb25seSBpZiB0aGUgcHJvcG9zZWQgY2hpbGQgaXMgYW4gaW1wbGVtZW50YXRpb24KKyAgICAgKiBvZiBIb3N0LgorICAgICAqCisgICAgICogQHBhcmFtIGNoaWxkIENoaWxkIGNvbnRhaW5lciB0byBiZSBhZGRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZENoaWxkKENvbnRhaW5lciBjaGlsZCkgeworCisgICAgICAgIGlmICghKGNoaWxkIGluc3RhbmNlb2YgSG9zdCkpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygic3RhbmRhcmRFbmdpbmUubm90SG9zdCIpKTsKKyAgICAgICAgc3VwZXIuYWRkQ2hpbGQoY2hpbGQpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBDb250YWluZXIgaW1wbGVtZW50YXRpb24gYW5kCisgICAgICogdGhlIGNvcnJlc3BvbmRpbmcgdmVyc2lvbiBudW1iZXIsIGluIHRoZSBmb3JtYXQKKyAgICAgKiA8Y29kZT4mbHQ7ZGVzY3JpcHRpb24mZ3Q7LyZsdDt2ZXJzaW9uJmd0OzwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJbmZvKCkgeworCisgICAgICAgIHJldHVybiAoaW5mbyk7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEaXNhbGxvdyBhbnkgYXR0ZW1wdCB0byBzZXQgYSBwYXJlbnQgZm9yIHRoaXMgQ29udGFpbmVyLCBzaW5jZSBhbgorICAgICAqIEVuZ2luZSBpcyBzdXBwb3NlZCB0byBiZSBhdCB0aGUgdG9wIG9mIHRoZSBDb250YWluZXIgaGllcmFyY2h5LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRhaW5lciBQcm9wb3NlZCBwYXJlbnQgQ29udGFpbmVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGFyZW50KENvbnRhaW5lciBjb250YWluZXIpIHsKKworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJzdGFuZGFyZEVuZ2luZS5ub3RQYXJlbnQiKSk7CisKKyAgICB9CisKKworICAgIHByaXZhdGUgYm9vbGVhbiBpbml0aWFsaXplZD1mYWxzZTsKKyAgICAKKyAgICBwdWJsaWMgdm9pZCBpbml0KCkgeworICAgICAgICBpZiggaW5pdGlhbGl6ZWQgKSByZXR1cm47CisgICAgICAgIGluaXRpYWxpemVkPXRydWU7CisKKyAgICAgICAgaWYoIG9uYW1lPT1udWxsICkgeworICAgICAgICAgICAgLy8gbm90IHJlZ2lzdGVyZWQgaW4gSk1YIHlldCAtIHN0YW5kYWxvbmUgbW9kZQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAoZG9tYWluPT1udWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGRvbWFpbj1nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyggIlJlZ2lzdGVyICIgKyBkb21haW4gKTsKKyAgICAgICAgICAgICAgICBvbmFtZT1uZXcgT2JqZWN0TmFtZShkb21haW4gKyAiOnR5cGU9RW5naW5lIik7CisgICAgICAgICAgICAgICAgY29udHJvbGxlcj1vbmFtZTsKKyAgICAgICAgICAgICAgICBSZWdpc3RyeS5nZXRSZWdpc3RyeShudWxsLCBudWxsKQorICAgICAgICAgICAgICAgICAgICAucmVnaXN0ZXJDb21wb25lbnQodGhpcywgb25hbWUsIG51bGwpOworICAgICAgICAgICAgfSBjYXRjaCggVGhyb3dhYmxlIHQgKSB7CisgICAgICAgICAgICAgICAgbG9nLmluZm8oIkVycm9yIHJlZ2lzdGVyaW5nICIsIHQgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmKCBtYmVhbnNGaWxlID09IG51bGwgKSB7CisgICAgICAgICAgICBTdHJpbmcgZGVmYXVsdE1CZWFuc0ZpbGU9Z2V0QmFzZURpcigpICsgIi9jb25mL3RvbWNhdDUtbWJlYW5zLnhtbCI7CisgICAgICAgICAgICBGaWxlIGY9bmV3IEZpbGUoIGRlZmF1bHRNQmVhbnNGaWxlICk7CisgICAgICAgICAgICBpZiggZi5leGlzdHMoKSApIG1iZWFuc0ZpbGU9Zi5nZXRBYnNvbHV0ZVBhdGgoKTsKKyAgICAgICAgfQorICAgICAgICBpZiggbWJlYW5zRmlsZSAhPSBudWxsICkgeworICAgICAgICAgICAgcmVhZEVuZ2luZU1iZWFucygpOworICAgICAgICB9CisgICAgICAgIGlmKCBtYmVhbnMgIT0gbnVsbCApIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgUmVnaXN0cnkuZ2V0UmVnaXN0cnkobnVsbCwgbnVsbCkuaW52b2tlKG1iZWFucywgImluaXQiLCBmYWxzZSk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiRXJyb3IgaW4gaW5pdCgpIGZvciAiICsgbWJlYW5zRmlsZSwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIG5vdCBuZWVkZWQgc2luY2UgdGhlIGZvbGxvd2luZyBpZiBzdGF0ZW1lbnQgZG9lcyB0aGUgc2FtZSB0aGluZyB0aGUgcmlnaHQgd2F5CisgICAgICAgIC8vIHJlbW92ZSBsYXRlciBhZnRlciBjaGVja2luZworICAgICAgICAvL2lmKCBzZXJ2aWNlPT1udWxsICkgeworICAgICAgICAvLyAgICB0cnkgeworICAgICAgICAvLyAgICAgICAgT2JqZWN0TmFtZSBzZXJ2aWNlTmFtZT1nZXRQYXJlbnROYW1lKCk7ICAgICAgICAKKyAgICAgICAgLy8gICAgICAgIGlmKCBtc2VydmVyLmlzUmVnaXN0ZXJlZCggc2VydmljZU5hbWUgKSkgeworICAgICAgICAvLyAgICAgICAgICAgIGxvZy5pbmZvKCJSZWdpc3RlcmluZyB3aXRoIHRoZSBzZXJ2aWNlICIpOworICAgICAgICAvLyAgICAgICAgICAgIHRyeSB7CisgICAgICAgIC8vICAgICAgICAgICAgICAgIG1zZXJ2ZXIuaW52b2tlKCBzZXJ2aWNlTmFtZSwgInNldENvbnRhaW5lciIsCisgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgdGhpcyB9LAorICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7ICJvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRhaW5lciIgfSApOworICAgICAgICAvLyAgICAgICAgICAgIH0gY2F0Y2goIEV4Y2VwdGlvbiBleCApIHsKKyAgICAgICAgLy8gICAgICAgICAgICAgICBleC5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgLy8gICAgICAgICAgICB9CisgICAgICAgIC8vICAgICAgICB9CisgICAgICAgIC8vICAgIH0gY2F0Y2goIEV4Y2VwdGlvbiBleCApIHsKKyAgICAgICAgLy8gICAgICAgIGxvZy5lcnJvcigiRXJyb3IgcmVnaXN0ZXJpbmcgd2l0aCBzZXJ2aWNlICIpOworICAgICAgICAvLyAgICB9CisgICAgICAgIC8vfQorICAgICAgICAKKyAgICAgICAgaWYoIHNlcnZpY2U9PW51bGwgKSB7CisgICAgICAgICAgICAvLyBmb3IgY29uc2lzdGVuY3kuLi46IHdlIGFyZSBwcm9iYWJseSBpbiBlbWJlZGVkIG1vZGUKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc2VydmljZT1uZXcgU3RhbmRhcmRTZXJ2aWNlKCk7CisgICAgICAgICAgICAgICAgc2VydmljZS5zZXRDb250YWluZXIoIHRoaXMgKTsKKyAgICAgICAgICAgICAgICBzZXJ2aWNlLmluaXRpYWxpemUoKTsKKyAgICAgICAgICAgIH0gY2F0Y2goIFRocm93YWJsZSB0ICkgeworICAgICAgICAgICAgICAgIHQucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3koKSB0aHJvd3MgTGlmZWN5Y2xlRXhjZXB0aW9uIHsKKyAgICAgICAgaWYoICEgaW5pdGlhbGl6ZWQgKSByZXR1cm47CisgICAgICAgIGluaXRpYWxpemVkPWZhbHNlOworICAgICAgICAKKyAgICAgICAgLy8gaWYgd2UgY3JlYXRlZCBpdCwgbWFrZSBzdXJlIGl0J3MgYWxzbyBkZXN0cm95ZWQKKyAgICAgICAgKChTdGFuZGFyZFNlcnZpY2Upc2VydmljZSkuZGVzdHJveSgpOworCisgICAgICAgIGlmKCBtYmVhbnMgIT0gbnVsbCApIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgUmVnaXN0cnkuZ2V0UmVnaXN0cnkobnVsbCwgbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgLmludm9rZShtYmVhbnMsICJkZXN0cm95IiwgZmFsc2UpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkVycm9yIGluIGRlc3Ryb3koKSBmb3IgIiArIG1iZWFuc0ZpbGUsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIAorICAgICAgICBpZiggbWJlYW5zICE9IG51bGwgKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGZvciggaW50IGk9MDsgaTxtYmVhbnMuc2l6ZSgpIDsgaSsrICkgeworICAgICAgICAgICAgICAgICAgICBSZWdpc3RyeS5nZXRSZWdpc3RyeShudWxsLCBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgLnVucmVnaXN0ZXJDb21wb25lbnQoKE9iamVjdE5hbWUpbWJlYW5zLmdldChpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkVycm9yIGluIGRlc3Ryb3koKSBmb3IgIiArIG1iZWFuc0ZpbGUsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBmb3JjZSBhbGwgbWV0YWRhdGEgdG8gYmUgcmVsb2FkZWQuCisgICAgICAgIC8vIFRoYXQgZG9lc24ndCBhZmZlY3QgZXhpc3RpbmcgYmVhbnMuIFdlIHNob3VsZCBtYWtlIGl0IHBlcgorICAgICAgICAvLyByZWdpc3RyeSAtIGFuZCBzdG9wIHVzaW5nIHRoZSBzdGF0aWMuCisgICAgICAgIFJlZ2lzdHJ5LmdldFJlZ2lzdHJ5KG51bGwsIG51bGwpLnJlc2V0TWV0YWRhdGEoKTsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFN0YXJ0IHRoaXMgRW5naW5lIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTGlmZWN5Y2xlRXhjZXB0aW9uIGlmIGEgc3RhcnR1cCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb24geworICAgICAgICBpZiggc3RhcnRlZCApIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiggIWluaXRpYWxpemVkICkgeworICAgICAgICAgICAgaW5pdCgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gTG9vayBmb3IgYSByZWFsbSAtIHRoYXQgbWF5IGhhdmUgYmVlbiBjb25maWd1cmVkIGVhcmxpZXIuIAorICAgICAgICAvLyBJZiB0aGUgcmVhbG0gaXMgYWRkZWQgYWZ0ZXIgY29udGV4dCAtIGl0J2xsIHNldCBpdHNlbGYuCisgICAgICAgIGlmKCByZWFsbSA9PSBudWxsICkgeworICAgICAgICAgICAgT2JqZWN0TmFtZSByZWFsbU5hbWU9bnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmVhbG1OYW1lPW5ldyBPYmplY3ROYW1lKCBkb21haW4gKyAiOnR5cGU9UmVhbG0iKTsKKyAgICAgICAgICAgICAgICBpZiggbXNlcnZlci5pc1JlZ2lzdGVyZWQocmVhbG1OYW1lICkgKSB7CisgICAgICAgICAgICAgICAgICAgIFJlYWxtIG5yZWFsbSA9IChSZWFsbSltc2VydmVyLmdldEF0dHJpYnV0ZShyZWFsbU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hbmFnZWRSZXNvdXJjZSIpOworICAgICAgICAgICAgICAgICAgICBzZXRSZWFsbShucmVhbG0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2goIFRocm93YWJsZSB0ICkgeworICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiTm8gcmVhbG0gZm9yIHRoaXMgZW5naW5lICIgKyByZWFsbU5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgLy8gTG9nIG91ciBzZXJ2ZXIgaWRlbnRpZmljYXRpb24gaW5mb3JtYXRpb24KKyAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oU2VydmVySW5mby5nZXRTZXJ2ZXJJbmZvKCkpOworICAgICAgICBsb2cuaW5mbyggIlN0YXJ0aW5nIFNlcnZsZXQgRW5naW5lOiAiICsgU2VydmVySW5mby5nZXRTZXJ2ZXJJbmZvKCkpOworICAgICAgICBpZiggbWJlYW5zICE9IG51bGwgKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFJlZ2lzdHJ5LmdldFJlZ2lzdHJ5KG51bGwsIG51bGwpCisgICAgICAgICAgICAgICAgICAgIC5pbnZva2UobWJlYW5zLCAic3RhcnQiLCBmYWxzZSk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiRXJyb3IgaW4gc3RhcnQoKSBmb3IgIiArIG1iZWFuc0ZpbGUsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gU3RhbmRhcmQgY29udGFpbmVyIHN0YXJ0dXAKKyAgICAgICAgc3VwZXIuc3RhcnQoKTsKKworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzdG9wKCkgdGhyb3dzIExpZmVjeWNsZUV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnN0b3AoKTsKKyAgICAgICAgaWYoIG1iZWFucyAhPSBudWxsICkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBSZWdpc3RyeS5nZXRSZWdpc3RyeShudWxsLCBudWxsKS5pbnZva2UobWJlYW5zLCAic3RvcCIsIGZhbHNlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJFcnJvciBpbiBzdG9wKCkgZm9yICIgKyBtYmVhbnNGaWxlLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgY29tcG9uZW50LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiU3RhbmRhcmRFbmdpbmVbIik7CisgICAgICAgIHNiLmFwcGVuZChnZXROYW1lKCkpOworICAgICAgICBzYi5hcHBlbmQoIl0iKTsKKyAgICAgICAgcmV0dXJuIChzYi50b1N0cmluZygpKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3RlY3RlZCBNZXRob2RzCisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tIEpNWCByZWdpc3RyYXRpb24gIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBwdWJsaWMgT2JqZWN0TmFtZSBwcmVSZWdpc3RlcihNQmVhblNlcnZlciBzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSBuYW1lKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBzdXBlci5wcmVSZWdpc3RlcihzZXJ2ZXIsbmFtZSk7CisKKyAgICAgICAgdGhpcy5zZXROYW1lKCBuYW1lLmdldERvbWFpbigpKTsKKworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKyAgICAvLyBGSVhNRSBSZW1vdmUgLS0gbm90IHVzZWQgCisgICAgcHVibGljIE9iamVjdE5hbWUgZ2V0UGFyZW50TmFtZSgpIHRocm93cyBNYWxmb3JtZWRPYmplY3ROYW1lRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGdldFNlcnZpY2UoKT09bnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIG5hbWUgPSBnZXRTZXJ2aWNlKCkuZ2V0TmFtZSgpOworICAgICAgICBPYmplY3ROYW1lIHNlcnZpY2VOYW1lPW5ldyBPYmplY3ROYW1lKGRvbWFpbiArCisgICAgICAgICAgICAgICAgICAgICAgICAiOnR5cGU9U2VydmljZSxzZXJ2aWNlTmFtZT0iK25hbWUpOworICAgICAgICByZXR1cm4gc2VydmljZU5hbWU7ICAgICAgICAgICAgICAgIAorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgT2JqZWN0TmFtZSBjcmVhdGVPYmplY3ROYW1lKFN0cmluZyBkb21haW4sIE9iamVjdE5hbWUgcGFyZW50KQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBpZiggbG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoIkNyZWF0ZSBPYmplY3ROYW1lICIgKyBkb21haW4gKyAiICIgKyBwYXJlbnQgKTsKKyAgICAgICAgcmV0dXJuIG5ldyBPYmplY3ROYW1lKCBkb21haW4gKyAiOnR5cGU9RW5naW5lIik7CisgICAgfQorCisgICAgCisgICAgcHJpdmF0ZSB2b2lkIHJlYWRFbmdpbmVNYmVhbnMoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBNYmVhbnNTb3VyY2UgbWJlYW5zTUI9bmV3IE1iZWFuc1NvdXJjZSgpOworICAgICAgICAgICAgRmlsZSBtYmVhbnNGPW5ldyBGaWxlKCBtYmVhbnNGaWxlICk7CisgICAgICAgICAgICBtYmVhbnNNQi5zZXRTb3VyY2UobWJlYW5zRik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIFJlZ2lzdHJ5LmdldFJlZ2lzdHJ5KG51bGwsIG51bGwpLnJlZ2lzdGVyQ29tcG9uZW50CisgICAgICAgICAgICAgICAgKG1iZWFuc01CLCBkb21haW4gKyAiOnR5cGU9TWJlYW5zRmlsZSIsIG51bGwpOworICAgICAgICAgICAgbWJlYW5zTUIubG9hZCgpOworICAgICAgICAgICAgbWJlYW5zTUIuaW5pdCgpOworICAgICAgICAgICAgbWJlYW5zTUIuc2V0UmVnaXN0cnkoUmVnaXN0cnkuZ2V0UmVnaXN0cnkobnVsbCwgbnVsbCkpOworICAgICAgICAgICAgbWJlYW5zPW1iZWFuc01CLmdldE1CZWFucygpOworICAgICAgICAgICAgCisgICAgICAgIH0gY2F0Y2goIFRocm93YWJsZSB0ICkgeworICAgICAgICAgICAgbG9nLmVycm9yKCAiRXJyb3IgbG9hZGluZyAiICsgbWJlYW5zRmlsZSwgdCApOworICAgICAgICB9CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgU3RyaW5nIGdldERvbWFpbigpIHsKKyAgICAgICAgaWYgKGRvbWFpbiE9bnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGRvbWFpbjsKKyAgICAgICAgfSBlbHNlIHsgCisgICAgICAgICAgICByZXR1cm4gZ2V0TmFtZSgpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNldERvbWFpbihTdHJpbmcgZG9tYWluKSB7CisgICAgICAgIHRoaXMuZG9tYWluID0gZG9tYWluOworICAgIH0KKyAgICAKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb3JlL1N0YW5kYXJkRW5naW5lVmFsdmUuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb3JlL1N0YW5kYXJkRW5naW5lVmFsdmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmQ5NThmCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NvcmUvU3RhbmRhcmRFbmdpbmVWYWx2ZS5qYXZhCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogQ29weXJpZ2h0IDE5OTktMjAwMSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZTsKKworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuSG9zdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3Rvci5SZXF1ZXN0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLlJlc3BvbnNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5TdHJpbmdNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudmFsdmVzLlZhbHZlQmFzZTsKKworCisvKioKKyAqIFZhbHZlIHRoYXQgaW1wbGVtZW50cyB0aGUgZGVmYXVsdCBiYXNpYyBiZWhhdmlvciBmb3IgdGhlCisgKiA8Y29kZT5TdGFuZGFyZEVuZ2luZTwvY29kZT4gY29udGFpbmVyIGltcGxlbWVudGF0aW9uLgorICogPHA+CisgKiA8Yj5VU0FHRSBDT05TVFJBSU5UPC9iPjogIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgbGlrZWx5IHRvIGJlIHVzZWZ1bCBvbmx5CisgKiB3aGVuIHByb2Nlc3NpbmcgSFRUUCByZXF1ZXN0cy4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworZmluYWwgY2xhc3MgU3RhbmRhcmRFbmdpbmVWYWx2ZQorICAgIGV4dGVuZHMgVmFsdmVCYXNlIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIHRoaXMgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGluZm8gPQorICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkRW5naW5lVmFsdmUvMS4wIjsKKworCisgICAgLyoqCisgICAgICogVGhlIHN0cmluZyBtYW5hZ2VyIGZvciB0aGlzIHBhY2thZ2UuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nTWFuYWdlciBzbSA9CisgICAgICAgIFN0cmluZ01hbmFnZXIuZ2V0TWFuYWdlcihDb25zdGFudHMuUGFja2FnZSk7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBWYWx2ZSBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEluZm8oKSB7CisKKyAgICAgICAgcmV0dXJuIChpbmZvKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFNlbGVjdCB0aGUgYXBwcm9wcmlhdGUgY2hpbGQgSG9zdCB0byBwcm9jZXNzIHRoaXMgcmVxdWVzdCwKKyAgICAgKiBiYXNlZCBvbiB0aGUgcmVxdWVzdGVkIHNlcnZlciBuYW1lLiAgSWYgbm8gbWF0Y2hpbmcgSG9zdCBjYW4KKyAgICAgKiBiZSBmb3VuZCwgcmV0dXJuIGFuIGFwcHJvcHJpYXRlIEhUVFAgZXJyb3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBSZXF1ZXN0IHRvIGJlIHByb2Nlc3NlZAorICAgICAqIEBwYXJhbSByZXNwb25zZSBSZXNwb25zZSB0byBiZSBwcm9kdWNlZAorICAgICAqIEBwYXJhbSB2YWx2ZUNvbnRleHQgVmFsdmUgY29udGV4dCB1c2VkIHRvIGZvcndhcmQgdG8gdGhlIG5leHQgVmFsdmUKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycmVkCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBlcnJvciBvY2N1cnJlZAorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGludm9rZShSZXF1ZXN0IHJlcXVlc3QsIFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIFNlbGVjdCB0aGUgSG9zdCB0byBiZSB1c2VkIGZvciB0aGlzIFJlcXVlc3QKKyAgICAgICAgSG9zdCBob3N0ID0gcmVxdWVzdC5nZXRIb3N0KCk7CisgICAgICAgIGlmIChob3N0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0JBRF9SRVFVRVNULAorICAgICAgICAgICAgICAgICBzbS5nZXRTdHJpbmcoInN0YW5kYXJkRW5naW5lLm5vSG9zdCIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5nZXRTZXJ2ZXJOYW1lKCkpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEFzayB0aGlzIEhvc3QgdG8gcHJvY2VzcyB0aGlzIHJlcXVlc3QKKyAgICAgICAgaG9zdC5nZXRQaXBlbGluZSgpLmdldEZpcnN0KCkuaW52b2tlKHJlcXVlc3QsIHJlc3BvbnNlKTsKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NvcmUvU3RhbmRhcmRIb3N0LmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29yZS9TdGFuZGFyZEhvc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGEwNTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NvcmUvU3RhbmRhcmRIb3N0LmphdmEKQEAgLTAsMCArMSw4MTggQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZTsKKworCitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Ib3N0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuUmVhbG07CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5WYWx2ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0YXJ0dXAuSG9zdENvbmZpZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcy5WYWx2ZUJhc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLm1vZGVsZXIuUmVnaXN0cnk7CisKKworLyoqCisgKiBTdGFuZGFyZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgPGI+SG9zdDwvYj4gaW50ZXJmYWNlLiAgRWFjaAorICogY2hpbGQgY29udGFpbmVyIG11c3QgYmUgYSBDb250ZXh0IGltcGxlbWVudGF0aW9uIHRvIHByb2Nlc3MgdGhlCisgKiByZXF1ZXN0cyBkaXJlY3RlZCB0byBhIHBhcnRpY3VsYXIgd2ViIGFwcGxpY2F0aW9uLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQGF1dGhvciBSZW15IE1hdWNoZXJhdAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgU3RhbmRhcmRIb3N0CisgICAgZXh0ZW5kcyBDb250YWluZXJCYXNlCisgICAgaW1wbGVtZW50cyBIb3N0ICAKKyB7CisgICAgLyogV2h5IGRvIHdlIGltcGxlbWVudCBkZXBsb3llciBhbmQgZGVsZWdhdGUgdG8gZGVwbG95ZXIgPz8/ICovCisKKyAgICBwcml2YXRlIHN0YXRpYyBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2cgbG9nPQorICAgICAgICBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5LmdldExvZyggU3RhbmRhcmRIb3N0LmNsYXNzICk7CisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBTdGFuZGFyZEhvc3QgY29tcG9uZW50IHdpdGggdGhlIGRlZmF1bHQgYmFzaWMgVmFsdmUuCisgICAgICovCisgICAgcHVibGljIFN0YW5kYXJkSG9zdCgpIHsKKworICAgICAgICBzdXBlcigpOworICAgICAgICBwaXBlbGluZS5zZXRCYXNpYyhuZXcgU3RhbmRhcmRIb3N0VmFsdmUoKSk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc2V0IG9mIGFsaWFzZXMgZm9yIHRoaXMgSG9zdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZ1tdIGFsaWFzZXMgPSBuZXcgU3RyaW5nWzBdOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgYXBwbGljYXRpb24gcm9vdCBmb3IgdGhpcyBIb3N0LgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGFwcEJhc2UgPSAiLiI7CisKKworICAgIC8qKgorICAgICAqIFRoZSBhdXRvIGRlcGxveSBmbGFnIGZvciB0aGlzIEhvc3QuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGF1dG9EZXBsb3kgPSB0cnVlOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgSmF2YSBjbGFzcyBuYW1lIG9mIHRoZSBkZWZhdWx0IGNvbnRleHQgY29uZmlndXJhdGlvbiBjbGFzcworICAgICAqIGZvciBkZXBsb3llZCB3ZWIgYXBwbGljYXRpb25zLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGNvbmZpZ0NsYXNzID0KKyAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cC5Db250ZXh0Q29uZmlnIjsKKworCisgICAgLyoqCisgICAgICogVGhlIEphdmEgY2xhc3MgbmFtZSBvZiB0aGUgZGVmYXVsdCBDb250ZXh0IGltcGxlbWVudGF0aW9uIGNsYXNzIGZvcgorICAgICAqIGRlcGxveWVkIHdlYiBhcHBsaWNhdGlvbnMuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgY29udGV4dENsYXNzID0KKyAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZENvbnRleHQiOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVwbG95IG9uIHN0YXJ0dXAgZmxhZyBmb3IgdGhpcyBIb3N0LgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBkZXBsb3lPblN0YXJ0dXAgPSB0cnVlOworCisKKyAgICAvKioKKyAgICAgKiBkZXBsb3kgQ29udGV4dCBYTUwgY29uZmlnIGZpbGVzIHByb3BlcnR5LgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBkZXBsb3lYTUwgPSB0cnVlOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgSmF2YSBjbGFzcyBuYW1lIG9mIHRoZSBkZWZhdWx0IGVycm9yIHJlcG9ydGVyIGltcGxlbWVudGF0aW9uIGNsYXNzIAorICAgICAqIGZvciBkZXBsb3llZCB3ZWIgYXBwbGljYXRpb25zLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGVycm9yUmVwb3J0VmFsdmVDbGFzcyA9CisgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcy5FcnJvclJlcG9ydFZhbHZlIjsKKworICAgIC8qKgorICAgICAqIFRoZSBvYmplY3QgbmFtZSBmb3IgdGhlIGVycm9yUmVwb3J0VmFsdmUuCisgICAgICovCisgICAgcHJpdmF0ZSBPYmplY3ROYW1lIGVycm9yUmVwb3J0VmFsdmVPYmplY3ROYW1lID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFRoZSBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBzdHJpbmcgZm9yIHRoaXMgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGluZm8gPQorICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkSG9zdC8xLjAiOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgbGl2ZSBkZXBsb3kgZmxhZyBmb3IgdGhpcyBIb3N0LgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBsaXZlRGVwbG95ID0gdHJ1ZTsKKworCisgICAgLyoqCisgICAgICogVW5wYWNrIFdBUnMgcHJvcGVydHkuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHVucGFja1dBUnMgPSB0cnVlOworCisKKyAgICAvKioKKyAgICAgKiBXb3JrIERpcmVjdG9yeSBiYXNlIGZvciBhcHBsaWNhdGlvbnMuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgd29ya0RpciA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIEF0dHJpYnV0ZSB2YWx1ZSB1c2VkIHRvIHR1cm4gb24vb2ZmIFhNTCB2YWxpZGF0aW9uCisgICAgICovCisgICAgIHByaXZhdGUgYm9vbGVhbiB4bWxWYWxpZGF0aW9uID0gZmFsc2U7CisKKworICAgIC8qKgorICAgICAqIEF0dHJpYnV0ZSB2YWx1ZSB1c2VkIHRvIHR1cm4gb24vb2ZmIFhNTCBuYW1lc3BhY2UgYXdhcmVuZXMuCisgICAgICovCisgICAgIHByaXZhdGUgYm9vbGVhbiB4bWxOYW1lc3BhY2VBd2FyZSA9IGZhbHNlOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBhcHBsaWNhdGlvbiByb290IGZvciB0aGlzIEhvc3QuICBUaGlzIGNhbiBiZSBhbiBhYnNvbHV0ZQorICAgICAqIHBhdGhuYW1lLCBhIHJlbGF0aXZlIHBhdGhuYW1lLCBvciBhIFVSTC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEFwcEJhc2UoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLmFwcEJhc2UpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGFwcGxpY2F0aW9uIHJvb3QgZm9yIHRoaXMgSG9zdC4gIFRoaXMgY2FuIGJlIGFuIGFic29sdXRlCisgICAgICogcGF0aG5hbWUsIGEgcmVsYXRpdmUgcGF0aG5hbWUsIG9yIGEgVVJMLgorICAgICAqCisgICAgICogQHBhcmFtIGFwcEJhc2UgVGhlIG5ldyBhcHBsaWNhdGlvbiByb290CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QXBwQmFzZShTdHJpbmcgYXBwQmFzZSkgeworCisgICAgICAgIFN0cmluZyBvbGRBcHBCYXNlID0gdGhpcy5hcHBCYXNlOworICAgICAgICB0aGlzLmFwcEJhc2UgPSBhcHBCYXNlOworICAgICAgICBzdXBwb3J0LmZpcmVQcm9wZXJ0eUNoYW5nZSgiYXBwQmFzZSIsIG9sZEFwcEJhc2UsIHRoaXMuYXBwQmFzZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGF1dG8gZGVwbG95IGZsYWcuICBJZiB0cnVlLCBpdCBpbmRpY2F0ZXMgdGhhdCAKKyAgICAgKiB0aGlzIGhvc3QncyBjaGlsZCB3ZWJhcHBzIHdpbGwgYmUgZHluYW1pY2FsbHkgZGVwbG95ZWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0QXV0b0RlcGxveSgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMuYXV0b0RlcGxveSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYXV0byBkZXBsb3kgZmxhZyB2YWx1ZSBmb3IgdGhpcyBob3N0LgorICAgICAqIAorICAgICAqIEBwYXJhbSBhdXRvRGVwbG95IFRoZSBuZXcgYXV0byBkZXBsb3kgZmxhZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEF1dG9EZXBsb3koYm9vbGVhbiBhdXRvRGVwbG95KSB7CisKKyAgICAgICAgYm9vbGVhbiBvbGRBdXRvRGVwbG95ID0gdGhpcy5hdXRvRGVwbG95OworICAgICAgICB0aGlzLmF1dG9EZXBsb3kgPSBhdXRvRGVwbG95OworICAgICAgICBzdXBwb3J0LmZpcmVQcm9wZXJ0eUNoYW5nZSgiYXV0b0RlcGxveSIsIG9sZEF1dG9EZXBsb3ksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmF1dG9EZXBsb3kpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIEphdmEgY2xhc3MgbmFtZSBvZiB0aGUgY29udGV4dCBjb25maWd1cmF0aW9uIGNsYXNzCisgICAgICogZm9yIG5ldyB3ZWIgYXBwbGljYXRpb25zLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29uZmlnQ2xhc3MoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLmNvbmZpZ0NsYXNzKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBKYXZhIGNsYXNzIG5hbWUgb2YgdGhlIGNvbnRleHQgY29uZmlndXJhdGlvbiBjbGFzcworICAgICAqIGZvciBuZXcgd2ViIGFwcGxpY2F0aW9ucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25maWdDbGFzcyBUaGUgbmV3IGNvbnRleHQgY29uZmlndXJhdGlvbiBjbGFzcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbmZpZ0NsYXNzKFN0cmluZyBjb25maWdDbGFzcykgeworCisgICAgICAgIFN0cmluZyBvbGRDb25maWdDbGFzcyA9IHRoaXMuY29uZmlnQ2xhc3M7CisgICAgICAgIHRoaXMuY29uZmlnQ2xhc3MgPSBjb25maWdDbGFzczsKKyAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoImNvbmZpZ0NsYXNzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkQ29uZmlnQ2xhc3MsIHRoaXMuY29uZmlnQ2xhc3MpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIEphdmEgY2xhc3MgbmFtZSBvZiB0aGUgQ29udGV4dCBpbXBsZW1lbnRhdGlvbiBjbGFzcworICAgICAqIGZvciBuZXcgd2ViIGFwcGxpY2F0aW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRleHRDbGFzcygpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMuY29udGV4dENsYXNzKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBKYXZhIGNsYXNzIG5hbWUgb2YgdGhlIENvbnRleHQgaW1wbGVtZW50YXRpb24gY2xhc3MKKyAgICAgKiBmb3IgbmV3IHdlYiBhcHBsaWNhdGlvbnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dENsYXNzIFRoZSBuZXcgY29udGV4dCBpbXBsZW1lbnRhdGlvbiBjbGFzcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbnRleHRDbGFzcyhTdHJpbmcgY29udGV4dENsYXNzKSB7CisKKyAgICAgICAgU3RyaW5nIG9sZENvbnRleHRDbGFzcyA9IHRoaXMuY29udGV4dENsYXNzOworICAgICAgICB0aGlzLmNvbnRleHRDbGFzcyA9IGNvbnRleHRDbGFzczsKKyAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoImNvbnRleHRDbGFzcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZENvbnRleHRDbGFzcywgdGhpcy5jb250ZXh0Q2xhc3MpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBkZXBsb3kgb24gc3RhcnR1cCBmbGFnLiAgSWYgdHJ1ZSwgaXQgaW5kaWNhdGVzIAorICAgICAqIHRoYXQgdGhpcyBob3N0J3MgY2hpbGQgd2ViYXBwcyBzaG91bGQgYmUgZGlzY292cmVkIGFuZCBhdXRvbWF0aWNhbGx5IAorICAgICAqIGRlcGxveWVkIGF0IHN0YXJ0dXAgdGltZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXREZXBsb3lPblN0YXJ0dXAoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLmRlcGxveU9uU3RhcnR1cCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZGVwbG95IG9uIHN0YXJ0dXAgZmxhZyB2YWx1ZSBmb3IgdGhpcyBob3N0LgorICAgICAqIAorICAgICAqIEBwYXJhbSBkZXBsb3lPblN0YXJ0dXAgVGhlIG5ldyBkZXBsb3kgb24gc3RhcnR1cCBmbGFnCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVwbG95T25TdGFydHVwKGJvb2xlYW4gZGVwbG95T25TdGFydHVwKSB7CisKKyAgICAgICAgYm9vbGVhbiBvbGREZXBsb3lPblN0YXJ0dXAgPSB0aGlzLmRlcGxveU9uU3RhcnR1cDsKKyAgICAgICAgdGhpcy5kZXBsb3lPblN0YXJ0dXAgPSBkZXBsb3lPblN0YXJ0dXA7CisgICAgICAgIHN1cHBvcnQuZmlyZVByb3BlcnR5Q2hhbmdlKCJkZXBsb3lPblN0YXJ0dXAiLCBvbGREZXBsb3lPblN0YXJ0dXAsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlcGxveU9uU3RhcnR1cCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIERlcGxveSBYTUwgQ29udGV4dCBjb25maWcgZmlsZXMgZmxhZyBhY2Nlc3Nvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0RlcGxveVhNTCgpIHsKKworICAgICAgICByZXR1cm4gKGRlcGxveVhNTCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIERlcGxveSBYTUwgQ29udGV4dCBjb25maWcgZmlsZXMgZmxhZyBtdXRhdG9yLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERlcGxveVhNTChib29sZWFuIGRlcGxveVhNTCkgeworCisgICAgICAgIHRoaXMuZGVwbG95WE1MID0gZGVwbG95WE1MOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBsaXZlIGRlcGxveSBmbGFnLiAgSWYgdHJ1ZSwgaXQgaW5kaWNhdGVzIHRoYXQgCisgICAgICogYSBiYWNrZ3JvdW5kIHRocmVhZCBzaG91bGQgYmUgc3RhcnRlZCB0aGF0IGxvb2tzIGZvciB3ZWIgYXBwbGljYXRpb24KKyAgICAgKiBjb250ZXh0IGZpbGVzLCBXQVIgZmlsZXMsIG9yIHVucGFja2VkIGRpcmVjdG9yaWVzIGJlaW5nIGRyb3BwZWQgaW4gdG8KKyAgICAgKiB0aGUgPGNvZGU+YXBwQmFzZTwvY29kZT4gZGlyZWN0b3J5LCBhbmQgZGVwbG95cyBuZXcgb25lcyBhcyB0aGV5IGFyZQorICAgICAqIGVuY291bnRlcmVkLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldExpdmVEZXBsb3koKSB7CisgICAgICAgIHJldHVybiAodGhpcy5hdXRvRGVwbG95KTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbGl2ZSBkZXBsb3kgZmxhZyB2YWx1ZSBmb3IgdGhpcyBob3N0LgorICAgICAqIAorICAgICAqIEBwYXJhbSBsaXZlRGVwbG95IFRoZSBuZXcgbGl2ZSBkZXBsb3kgZmxhZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExpdmVEZXBsb3koYm9vbGVhbiBsaXZlRGVwbG95KSB7CisgICAgICAgIHNldEF1dG9EZXBsb3kobGl2ZURlcGxveSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIEphdmEgY2xhc3MgbmFtZSBvZiB0aGUgZXJyb3IgcmVwb3J0IHZhbHZlIGNsYXNzCisgICAgICogZm9yIG5ldyB3ZWIgYXBwbGljYXRpb25zLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JSZXBvcnRWYWx2ZUNsYXNzKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5lcnJvclJlcG9ydFZhbHZlQ2xhc3MpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIEphdmEgY2xhc3MgbmFtZSBvZiB0aGUgZXJyb3IgcmVwb3J0IHZhbHZlIGNsYXNzCisgICAgICogZm9yIG5ldyB3ZWIgYXBwbGljYXRpb25zLgorICAgICAqCisgICAgICogQHBhcmFtIGVycm9yUmVwb3J0VmFsdmVDbGFzcyBUaGUgbmV3IGVycm9yIHJlcG9ydCB2YWx2ZSBjbGFzcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEVycm9yUmVwb3J0VmFsdmVDbGFzcyhTdHJpbmcgZXJyb3JSZXBvcnRWYWx2ZUNsYXNzKSB7CisKKyAgICAgICAgU3RyaW5nIG9sZEVycm9yUmVwb3J0VmFsdmVDbGFzc0NsYXNzID0gdGhpcy5lcnJvclJlcG9ydFZhbHZlQ2xhc3M7CisgICAgICAgIHRoaXMuZXJyb3JSZXBvcnRWYWx2ZUNsYXNzID0gZXJyb3JSZXBvcnRWYWx2ZUNsYXNzOworICAgICAgICBzdXBwb3J0LmZpcmVQcm9wZXJ0eUNoYW5nZSgiZXJyb3JSZXBvcnRWYWx2ZUNsYXNzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkRXJyb3JSZXBvcnRWYWx2ZUNsYXNzQ2xhc3MsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVycm9yUmVwb3J0VmFsdmVDbGFzcyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY2Fub25pY2FsLCBmdWxseSBxdWFsaWZpZWQsIG5hbWUgb2YgdGhlIHZpcnR1YWwgaG9zdAorICAgICAqIHRoaXMgQ29udGFpbmVyIHJlcHJlc2VudHMuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCisgICAgICAgIHJldHVybiAobmFtZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY2Fub25pY2FsLCBmdWxseSBxdWFsaWZpZWQsIG5hbWUgb2YgdGhlIHZpcnR1YWwgaG9zdAorICAgICAqIHRoaXMgQ29udGFpbmVyIHJlcHJlc2VudHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBWaXJ0dWFsIGhvc3QgbmFtZQorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgbmFtZSBpcyBudWxsCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworCisgICAgICAgIGlmIChuYW1lID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygic3RhbmRhcmRIb3N0Lm51bGxOYW1lIikpOworCisgICAgICAgIG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7ICAgICAgLy8gSW50ZXJuYWxseSBhbGwgbmFtZXMgYXJlIGxvd2VyIGNhc2UKKworICAgICAgICBTdHJpbmcgb2xkTmFtZSA9IHRoaXMubmFtZTsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoIm5hbWUiLCBvbGROYW1lLCB0aGlzLm5hbWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBVbnBhY2sgV0FScyBmbGFnIGFjY2Vzc29yLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzVW5wYWNrV0FScygpIHsKKworICAgICAgICByZXR1cm4gKHVucGFja1dBUnMpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBVbnBhY2sgV0FScyBmbGFnIG11dGF0b3IuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VW5wYWNrV0FScyhib29sZWFuIHVucGFja1dBUnMpIHsKKworICAgICAgICB0aGlzLnVucGFja1dBUnMgPSB1bnBhY2tXQVJzOworCisgICAgfQorCisgICAgIC8qKgorICAgICAqIFNldCB0aGUgdmFsaWRhdGlvbiBmZWF0dXJlIG9mIHRoZSBYTUwgcGFyc2VyIHVzZWQgd2hlbgorICAgICAqIHBhcnNpbmcgeG1sIGluc3RhbmNlcy4KKyAgICAgKiBAcGFyYW0geG1sVmFsaWRhdGlvbiB0cnVlIHRvIGVuYWJsZSB4bWwgaW5zdGFuY2UgdmFsaWRhdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFhtbFZhbGlkYXRpb24oYm9vbGVhbiB4bWxWYWxpZGF0aW9uKXsKKyAgICAgICAgCisgICAgICAgIHRoaXMueG1sVmFsaWRhdGlvbiA9IHhtbFZhbGlkYXRpb247CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHNlcnZlci54bWwgPGhvc3Q+IGF0dHJpYnV0ZSdzIHhtbFZhbGlkYXRpb24uCisgICAgICogQHJldHVybiB0cnVlIGlmIHZhbGlkYXRpb24gaXMgZW5hYmxlZC4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldFhtbFZhbGlkYXRpb24oKXsKKyAgICAgICAgcmV0dXJuIHhtbFZhbGlkYXRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBzZXJ2ZXIueG1sIDxob3N0PiBhdHRyaWJ1dGUncyB4bWxOYW1lc3BhY2VBd2FyZS4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgbmFtZXNwYWNlIGF3YXJlbmVzIGlzIGVuYWJsZWQuCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRYbWxOYW1lc3BhY2VBd2FyZSgpeworICAgICAgICByZXR1cm4geG1sTmFtZXNwYWNlQXdhcmU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG5hbWVzcGFjZSBhd2FyZSBmZWF0dXJlIG9mIHRoZSBYTUwgcGFyc2VyIHVzZWQgd2hlbgorICAgICAqIHBhcnNpbmcgeG1sIGluc3RhbmNlcy4KKyAgICAgKiBAcGFyYW0geG1sTmFtZXNwYWNlQXdhcmUgdHJ1ZSB0byBlbmFibGUgbmFtZXNwYWNlIGF3YXJlbmVzcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFhtbE5hbWVzcGFjZUF3YXJlKGJvb2xlYW4geG1sTmFtZXNwYWNlQXdhcmUpeworICAgICAgICB0aGlzLnhtbE5hbWVzcGFjZUF3YXJlPXhtbE5hbWVzcGFjZUF3YXJlOworICAgIH0gICAgCisgICAgCisgICAgLyoqCisgICAgICogSG9zdCB3b3JrIGRpcmVjdG9yeSBiYXNlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0V29ya0RpcigpIHsKKworICAgICAgICByZXR1cm4gKHdvcmtEaXIpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogSG9zdCB3b3JrIGRpcmVjdG9yeSBiYXNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFdvcmtEaXIoU3RyaW5nIHdvcmtEaXIpIHsKKworICAgICAgICB0aGlzLndvcmtEaXIgPSB3b3JrRGlyOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIEFkZCBhbiBhbGlhcyBuYW1lIHRoYXQgc2hvdWxkIGJlIG1hcHBlZCB0byB0aGlzIHNhbWUgSG9zdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhbGlhcyBUaGUgYWxpYXMgdG8gYmUgYWRkZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRBbGlhcyhTdHJpbmcgYWxpYXMpIHsKKworICAgICAgICBhbGlhcyA9IGFsaWFzLnRvTG93ZXJDYXNlKCk7CisKKyAgICAgICAgLy8gU2tpcCBkdXBsaWNhdGUgYWxpYXNlcworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFsaWFzZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChhbGlhc2VzW2ldLmVxdWFscyhhbGlhcykpCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gQWRkIHRoaXMgYWxpYXMgdG8gdGhlIGxpc3QKKyAgICAgICAgU3RyaW5nIG5ld0FsaWFzZXNbXSA9IG5ldyBTdHJpbmdbYWxpYXNlcy5sZW5ndGggKyAxXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbGlhc2VzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgbmV3QWxpYXNlc1tpXSA9IGFsaWFzZXNbaV07CisgICAgICAgIG5ld0FsaWFzZXNbYWxpYXNlcy5sZW5ndGhdID0gYWxpYXM7CisKKyAgICAgICAgYWxpYXNlcyA9IG5ld0FsaWFzZXM7CisKKyAgICAgICAgLy8gSW5mb3JtIGludGVyZXN0ZWQgbGlzdGVuZXJzCisgICAgICAgIGZpcmVDb250YWluZXJFdmVudChBRERfQUxJQVNfRVZFTlQsIGFsaWFzKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQWRkIGEgY2hpbGQgQ29udGFpbmVyLCBvbmx5IGlmIHRoZSBwcm9wb3NlZCBjaGlsZCBpcyBhbiBpbXBsZW1lbnRhdGlvbgorICAgICAqIG9mIENvbnRleHQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2hpbGQgQ2hpbGQgY29udGFpbmVyIHRvIGJlIGFkZGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQ2hpbGQoQ29udGFpbmVyIGNoaWxkKSB7CisKKyAgICAgICAgaWYgKCEoY2hpbGQgaW5zdGFuY2VvZiBDb250ZXh0KSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJzdGFuZGFyZEhvc3Qubm90Q29udGV4dCIpKTsKKyAgICAgICAgc3VwZXIuYWRkQ2hpbGQoY2hpbGQpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNldCBvZiBhbGlhcyBuYW1lcyBmb3IgdGhpcyBIb3N0LiAgSWYgbm9uZSBhcmUgZGVmaW5lZCwKKyAgICAgKiBhIHplcm8gbGVuZ3RoIGFycmF5IGlzIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBmaW5kQWxpYXNlcygpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMuYWxpYXNlcyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIENvbnRhaW5lciBpbXBsZW1lbnRhdGlvbiBhbmQKKyAgICAgKiB0aGUgY29ycmVzcG9uZGluZyB2ZXJzaW9uIG51bWJlciwgaW4gdGhlIGZvcm1hdAorICAgICAqIDxjb2RlPiZsdDtkZXNjcmlwdGlvbiZndDsvJmx0O3ZlcnNpb24mZ3Q7PC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEluZm8oKSB7CisKKyAgICAgICAgcmV0dXJuIChpbmZvKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBDb250ZXh0IHRoYXQgd291bGQgYmUgdXNlZCB0byBwcm9jZXNzIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBob3N0LXJlbGF0aXZlIHJlcXVlc3QgVVJJLCBpZiBhbnk7IG90aGVyd2lzZSByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJpIFJlcXVlc3QgVVJJIHRvIGJlIG1hcHBlZAorICAgICAqLworICAgIHB1YmxpYyBDb250ZXh0IG1hcChTdHJpbmcgdXJpKSB7CisKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmRlYnVnKCJNYXBwaW5nIHJlcXVlc3QgVVJJICciICsgdXJpICsgIiciKTsKKyAgICAgICAgaWYgKHVyaSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKworICAgICAgICAvLyBNYXRjaCBvbiB0aGUgbG9uZ2VzdCBwb3NzaWJsZSBjb250ZXh0IHBhdGggcHJlZml4CisgICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy50cmFjZSgiICBUcnlpbmcgdGhlIGxvbmdlc3QgY29udGV4dCBwYXRoIHByZWZpeCIpOworICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBudWxsOworICAgICAgICBTdHJpbmcgbWFwdXJpID0gdXJpOworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgY29udGV4dCA9IChDb250ZXh0KSBmaW5kQ2hpbGQobWFwdXJpKTsKKyAgICAgICAgICAgIGlmIChjb250ZXh0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpbnQgc2xhc2ggPSBtYXB1cmkubGFzdEluZGV4T2YoJy8nKTsKKyAgICAgICAgICAgIGlmIChzbGFzaCA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBtYXB1cmkgPSBtYXB1cmkuc3Vic3RyaW5nKDAsIHNsYXNoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIElmIG5vIENvbnRleHQgbWF0Y2hlcywgc2VsZWN0IHRoZSBkZWZhdWx0IENvbnRleHQKKyAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy50cmFjZSgiICBUcnlpbmcgdGhlIGRlZmF1bHQgY29udGV4dCIpOworICAgICAgICAgICAgY29udGV4dCA9IChDb250ZXh0KSBmaW5kQ2hpbGQoIiIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ29tcGxhaW4gaWYgbm8gQ29udGV4dCBoYXMgYmVlbiBzZWxlY3RlZAorICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKSB7CisgICAgICAgICAgICBsb2cuZXJyb3Ioc20uZ2V0U3RyaW5nKCJzdGFuZGFyZEhvc3QubWFwcGluZ0Vycm9yIiwgdXJpKSk7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmV0dXJuIHRoZSBtYXBwZWQgQ29udGV4dCAoaWYgYW55KQorICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoIiBNYXBwZWQgdG8gY29udGV4dCAnIiArIGNvbnRleHQuZ2V0UGF0aCgpICsgIiciKTsKKyAgICAgICAgcmV0dXJuIChjb250ZXh0KTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgYWxpYXMgbmFtZSBmcm9tIHRoZSBhbGlhc2VzIGZvciB0aGlzIEhvc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWxpYXMgQWxpYXMgbmFtZSB0byBiZSByZW1vdmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlQWxpYXMoU3RyaW5nIGFsaWFzKSB7CisKKyAgICAgICAgYWxpYXMgPSBhbGlhcy50b0xvd2VyQ2FzZSgpOworCisgICAgICAgIHN5bmNocm9uaXplZCAoYWxpYXNlcykgeworCisgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhpcyBhbGlhcyBpcyBjdXJyZW50bHkgcHJlc2VudAorICAgICAgICAgICAgaW50IG4gPSAtMTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWxpYXNlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChhbGlhc2VzW2ldLmVxdWFscyhhbGlhcykpIHsKKyAgICAgICAgICAgICAgICAgICAgbiA9IGk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChuIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGFsaWFzCisgICAgICAgICAgICBpbnQgaiA9IDA7CisgICAgICAgICAgICBTdHJpbmcgcmVzdWx0c1tdID0gbmV3IFN0cmluZ1thbGlhc2VzLmxlbmd0aCAtIDFdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbGlhc2VzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGkgIT0gbikKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0c1tqKytdID0gYWxpYXNlc1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFsaWFzZXMgPSByZXN1bHRzOworCisgICAgICAgIH0KKworICAgICAgICAvLyBJbmZvcm0gaW50ZXJlc3RlZCBsaXN0ZW5lcnMKKyAgICAgICAgZmlyZUNvbnRhaW5lckV2ZW50KFJFTU9WRV9BTElBU19FVkVOVCwgYWxpYXMpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBjb21wb25lbnQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGlmIChnZXRQYXJlbnQoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoZ2V0UGFyZW50KCkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICBzYi5hcHBlbmQoIi4iKTsKKyAgICAgICAgfQorICAgICAgICBzYi5hcHBlbmQoIlN0YW5kYXJkSG9zdFsiKTsKKyAgICAgICAgc2IuYXBwZW5kKGdldE5hbWUoKSk7CisgICAgICAgIHNiLmFwcGVuZCgiXSIpOworICAgICAgICByZXR1cm4gKHNiLnRvU3RyaW5nKCkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTdGFydCB0aGlzIGhvc3QuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIExpZmVjeWNsZUV4Y2VwdGlvbiBpZiB0aGlzIGNvbXBvbmVudCBkZXRlY3RzIGEgZmF0YWwgZXJyb3IKKyAgICAgKiAgdGhhdCBwcmV2ZW50cyBpdCBmcm9tIGJlaW5nIHN0YXJ0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc3RhcnQoKSB0aHJvd3MgTGlmZWN5Y2xlRXhjZXB0aW9uIHsKKyAgICAgICAgaWYoIHN0YXJ0ZWQgKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYoICEgaW5pdGlhbGl6ZWQgKQorICAgICAgICAgICAgaW5pdCgpOworCisgICAgICAgIC8vIExvb2sgZm9yIGEgcmVhbG0gLSB0aGF0IG1heSBoYXZlIGJlZW4gY29uZmlndXJlZCBlYXJsaWVyLiAKKyAgICAgICAgLy8gSWYgdGhlIHJlYWxtIGlzIGFkZGVkIGFmdGVyIGNvbnRleHQgLSBpdCdsbCBzZXQgaXRzZWxmLgorICAgICAgICBpZiggcmVhbG0gPT0gbnVsbCApIHsKKyAgICAgICAgICAgIE9iamVjdE5hbWUgcmVhbG1OYW1lPW51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJlYWxtTmFtZT1uZXcgT2JqZWN0TmFtZSggZG9tYWluICsgIjp0eXBlPVJlYWxtLGhvc3Q9IiArIGdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgaWYoIG1zZXJ2ZXIuaXNSZWdpc3RlcmVkKHJlYWxtTmFtZSApICkgeworICAgICAgICAgICAgICAgICAgICBSZWFsbSBucmVhbG0gPSAoUmVhbG0pbXNlcnZlci5nZXRBdHRyaWJ1dGUocmVhbG1OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYW5hZ2VkUmVzb3VyY2UiKTsKKyAgICAgICAgICAgICAgICAgICAgc2V0UmVhbG0obnJlYWxtKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoKCBUaHJvd2FibGUgdCApIHsKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk5vIHJlYWxtIGZvciB0aGlzIGhvc3QgIiArIHJlYWxtTmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAvLyBTZXQgZXJyb3IgcmVwb3J0IHZhbHZlCisgICAgICAgIGlmICgoZXJyb3JSZXBvcnRWYWx2ZUNsYXNzICE9IG51bGwpCisgICAgICAgICAgICAmJiAoIWVycm9yUmVwb3J0VmFsdmVDbGFzcy5lcXVhbHMoIiIpKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7CisgICAgICAgICAgICAgICAgaWYoZXJyb3JSZXBvcnRWYWx2ZU9iamVjdE5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBPYmplY3ROYW1lW10gbmFtZXMgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICgoU3RhbmRhcmRQaXBlbGluZSlwaXBlbGluZSkuZ2V0VmFsdmVPYmplY3ROYW1lcygpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7ICFmb3VuZCAmJiBpPG5hbWVzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYoZXJyb3JSZXBvcnRWYWx2ZU9iamVjdE5hbWUuZXF1YWxzKG5hbWVzW2ldKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWUgOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmKCFmb3VuZCkgeyAgICAgICAgICAJCisgICAgICAgICAgICAgICAgICAgICAgICBWYWx2ZSB2YWx2ZSA9IChWYWx2ZSkgQ2xhc3MuZm9yTmFtZShlcnJvclJlcG9ydFZhbHZlQ2xhc3MpCisgICAgICAgICAgICAgICAgICAgICAgICAubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZFZhbHZlKHZhbHZlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yUmVwb3J0VmFsdmVPYmplY3ROYW1lID0gKChWYWx2ZUJhc2UpdmFsdmUpLmdldE9iamVjdE5hbWUoKSA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKHNtLmdldFN0cmluZworICAgICAgICAgICAgICAgICAgICAoInN0YW5kYXJkSG9zdC5pbnZhbGlkRXJyb3JSZXBvcnRWYWx2ZUNsYXNzIiwgCisgICAgICAgICAgICAgICAgICAgICBlcnJvclJlcG9ydFZhbHZlQ2xhc3MpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICh4bWxWYWxpZGF0aW9uKQorICAgICAgICAgICAgbG9nLmluZm8oIHNtLmdldFN0cmluZygic3RhbmRhcmRIb3N0LnZhbGlkYXRpb25FbmFibGVkIikpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBsb2cuaW5mbyggc20uZ2V0U3RyaW5nKCJzdGFuZGFyZEhvc3QudmFsaWRhdGlvbkRpc2FibGVkIikpOworCisgICAgICAgIHN1cGVyLnN0YXJ0KCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEV4ZWN1dGUgYSBwZXJpb2RpYyB0YXNrLCBzdWNoIGFzIHJlbG9hZGluZywgZXRjLiBUaGlzIG1ldGhvZCB3aWxsIGJlCisgICAgICogaW52b2tlZCBpbnNpZGUgdGhlIGNsYXNzbG9hZGluZyBjb250ZXh0IG9mIHRoaXMgY29udGFpbmVyLiBVbmV4cGVjdGVkCisgICAgICogdGhyb3dhYmxlcyB3aWxsIGJlIGNhdWdodCBhbmQgbG9nZ2VkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGJhY2tncm91bmRQcm9jZXNzKCkgeworICAgICAgICBsaWZlY3ljbGUuZmlyZUxpZmVjeWNsZUV2ZW50KCJjaGVjayIsIG51bGwpOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0gSk1YICAtLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8qKgorICAgICAgKiBSZXR1cm4gdGhlIE1CZWFuIE5hbWVzIG9mIHRoZSBWYWx2ZXMgYXNzb2ljYXRlZCB3aXRoIHRoaXMgSG9zdAorICAgICAgKgorICAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBNQmVhbiBjYW5ub3QgYmUgY3JlYXRlZCBvciByZWdpc3RlcmVkCisgICAgICAqLworICAgICBwdWJsaWMgU3RyaW5nIFtdIGdldFZhbHZlTmFtZXMoKQorICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgIFZhbHZlIFtdIHZhbHZlcyA9IHRoaXMuZ2V0VmFsdmVzKCk7CisgICAgICAgICBTdHJpbmcgW10gbWJlYW5OYW1lcyA9IG5ldyBTdHJpbmdbdmFsdmVzLmxlbmd0aF07CisgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHZlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgIGlmKCB2YWx2ZXNbaV0gPT0gbnVsbCApIGNvbnRpbnVlOworICAgICAgICAgICAgIGlmKCAoKFZhbHZlQmFzZSl2YWx2ZXNbaV0pLmdldE9iamVjdE5hbWUoKSA9PSBudWxsICkgY29udGludWU7CisgICAgICAgICAgICAgbWJlYW5OYW1lc1tpXSA9ICgoVmFsdmVCYXNlKXZhbHZlc1tpXSkuZ2V0T2JqZWN0TmFtZSgpLnRvU3RyaW5nKCk7CisgICAgICAgICB9CisKKyAgICAgICAgIHJldHVybiBtYmVhbk5hbWVzOworCisgICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRBbGlhc2VzKCkgeworICAgICAgICByZXR1cm4gYWxpYXNlczsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaW5pdGlhbGl6ZWQ9ZmFsc2U7CisgICAgCisgICAgcHVibGljIHZvaWQgaW5pdCgpIHsKKyAgICAgICAgaWYoIGluaXRpYWxpemVkICkgcmV0dXJuOworICAgICAgICBpbml0aWFsaXplZD10cnVlOworICAgICAgICAKKyAgICAgICAgLy8gYWxyZWFkeSByZWdpc3RlcmVkLgorICAgICAgICBpZiggZ2V0UGFyZW50KCkgPT0gbnVsbCApIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgLy8gUmVnaXN0ZXIgd2l0aCB0aGUgRW5naW5lCisgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSBzZXJ2aWNlTmFtZT1uZXcgT2JqZWN0TmFtZShkb21haW4gKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOnR5cGU9RW5naW5lIik7CisKKyAgICAgICAgICAgICAgICBIb3N0Q29uZmlnIGRlcGxveWVyID0gbmV3IEhvc3RDb25maWcoKTsKKyAgICAgICAgICAgICAgICBhZGRMaWZlY3ljbGVMaXN0ZW5lcihkZXBsb3llcik7ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmKCBtc2VydmVyLmlzUmVnaXN0ZXJlZCggc2VydmljZU5hbWUgKSkgeworICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlJlZ2lzdGVyaW5nIHdpdGggdGhlIEVuZ2luZSIpOworICAgICAgICAgICAgICAgICAgICBtc2VydmVyLmludm9rZSggc2VydmljZU5hbWUsICJhZGRDaGlsZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgdGhpcyB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7ICJvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRhaW5lciIgfSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2goIEV4Y2VwdGlvbiBleCApIHsKKyAgICAgICAgICAgICAgICBleC5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYoIG9uYW1lPT1udWxsICkgeworICAgICAgICAgICAgLy8gbm90IHJlZ2lzdGVyZWQgaW4gSk1YIHlldCAtIHN0YW5kYWxvbmUgbW9kZQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBTdGFuZGFyZEVuZ2luZSBlbmdpbmU9KFN0YW5kYXJkRW5naW5lKXBhcmVudDsKKyAgICAgICAgICAgICAgICBkb21haW49ZW5naW5lLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoICJSZWdpc3RlciAiICsgZG9tYWluICk7CisgICAgICAgICAgICAgICAgb25hbWU9bmV3IE9iamVjdE5hbWUoZG9tYWluICsgIjp0eXBlPUhvc3QsaG9zdD0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICBSZWdpc3RyeS5nZXRSZWdpc3RyeShudWxsLCBudWxsKQorICAgICAgICAgICAgICAgICAgICAucmVnaXN0ZXJDb21wb25lbnQodGhpcywgb25hbWUsIG51bGwpOworICAgICAgICAgICAgfSBjYXRjaCggVGhyb3dhYmxlIHQgKSB7CisgICAgICAgICAgICAgICAgbG9nLmluZm8oIkVycm9yIHJlZ2lzdGVyaW5nICIsIHQgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBPYmplY3ROYW1lIHByZVJlZ2lzdGVyKE1CZWFuU2VydmVyIHNlcnZlciwgT2JqZWN0TmFtZSBvbmFtZSApIAorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBPYmplY3ROYW1lIHJlcz1zdXBlci5wcmVSZWdpc3RlcihzZXJ2ZXIsIG9uYW1lKTsKKyAgICAgICAgU3RyaW5nIG5hbWU9b25hbWUuZ2V0S2V5UHJvcGVydHkoImhvc3QiKTsKKyAgICAgICAgaWYoIG5hbWUgIT0gbnVsbCApCisgICAgICAgICAgICBzZXROYW1lKCBuYW1lICk7CisgICAgICAgIHJldHVybiByZXM7ICAgICAgICAKKyAgICB9CisgICAgCisgICAgcHVibGljIE9iamVjdE5hbWUgY3JlYXRlT2JqZWN0TmFtZShTdHJpbmcgZG9tYWluLCBPYmplY3ROYW1lIHBhcmVudCkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaWYoIGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmRlYnVnKCJDcmVhdGUgT2JqZWN0TmFtZSAiICsgZG9tYWluICsgIiAiICsgcGFyZW50ICk7CisgICAgICAgIHJldHVybiBuZXcgT2JqZWN0TmFtZSggZG9tYWluICsgIjp0eXBlPUhvc3QsaG9zdD0iICsgZ2V0TmFtZSgpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb3JlL1N0YW5kYXJkSG9zdFZhbHZlLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29yZS9TdGFuZGFyZEhvc3RWYWx2ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3ZTdhY2QKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29yZS9TdGFuZGFyZEhvc3RWYWx2ZS5qYXZhCkBAIC0wLDAgKzEsMzgxIEBACisvKgorICogQ29weXJpZ2h0IDE5OTktMjAwMSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZTsKKworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuUmVxdWVzdERpc3BhdGNoZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5HbG9iYWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuV3JhcHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3Rvci5DbGllbnRBYm9ydEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3Rvci5SZXF1ZXN0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLlJlc3BvbnNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkVycm9yUGFnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuUmVxdWVzdFV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLlN0cmluZ01hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS52YWx2ZXMuVmFsdmVCYXNlOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OworCisKKy8qKgorICogVmFsdmUgdGhhdCBpbXBsZW1lbnRzIHRoZSBkZWZhdWx0IGJhc2ljIGJlaGF2aW9yIGZvciB0aGUKKyAqIDxjb2RlPlN0YW5kYXJkSG9zdDwvY29kZT4gY29udGFpbmVyIGltcGxlbWVudGF0aW9uLgorICogPHA+CisgKiA8Yj5VU0FHRSBDT05TVFJBSU5UPC9iPjogIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgbGlrZWx5IHRvIGJlIHVzZWZ1bCBvbmx5CisgKiB3aGVuIHByb2Nlc3NpbmcgSFRUUCByZXF1ZXN0cy4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEBhdXRob3IgUmVteSBNYXVjaGVyYXQKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworZmluYWwgY2xhc3MgU3RhbmRhcmRIb3N0VmFsdmUKKyAgICBleHRlbmRzIFZhbHZlQmFzZSB7CisKKworICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhTdGFuZGFyZEhvc3RWYWx2ZS5jbGFzcyk7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gdGhpcyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgaW5mbyA9CisgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRIb3N0VmFsdmUvMS4wIjsKKworCisgICAgLyoqCisgICAgICogVGhlIHN0cmluZyBtYW5hZ2VyIGZvciB0aGlzIHBhY2thZ2UuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nTWFuYWdlciBzbSA9CisgICAgICAgIFN0cmluZ01hbmFnZXIuZ2V0TWFuYWdlcihDb25zdGFudHMuUGFja2FnZSk7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBWYWx2ZSBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEluZm8oKSB7CisKKyAgICAgICAgcmV0dXJuIChpbmZvKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFNlbGVjdCB0aGUgYXBwcm9wcmlhdGUgY2hpbGQgQ29udGV4dCB0byBwcm9jZXNzIHRoaXMgcmVxdWVzdCwKKyAgICAgKiBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkIHJlcXVlc3QgVVJJLiAgSWYgbm8gbWF0Y2hpbmcgQ29udGV4dCBjYW4KKyAgICAgKiBiZSBmb3VuZCwgcmV0dXJuIGFuIGFwcHJvcHJpYXRlIEhUVFAgZXJyb3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBSZXF1ZXN0IHRvIGJlIHByb2Nlc3NlZAorICAgICAqIEBwYXJhbSByZXNwb25zZSBSZXNwb25zZSB0byBiZSBwcm9kdWNlZAorICAgICAqIEBwYXJhbSB2YWx2ZUNvbnRleHQgVmFsdmUgY29udGV4dCB1c2VkIHRvIGZvcndhcmQgdG8gdGhlIG5leHQgVmFsdmUKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycmVkCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBlcnJvciBvY2N1cnJlZAorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGludm9rZShSZXF1ZXN0IHJlcXVlc3QsIFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIFNlbGVjdCB0aGUgQ29udGV4dCB0byBiZSB1c2VkIGZvciB0aGlzIFJlcXVlc3QKKyAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gcmVxdWVzdC5nZXRDb250ZXh0KCk7CisgICAgICAgIGlmIChjb250ZXh0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgc20uZ2V0U3RyaW5nKCJzdGFuZGFyZEhvc3Qubm9Db250ZXh0IikpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gQmluZCB0aGUgY29udGV4dCBDTCB0byB0aGUgY3VycmVudCB0aHJlYWQKKyAgICAgICAgaWYoIGNvbnRleHQuZ2V0TG9hZGVyKCkgIT0gbnVsbCApIHsKKyAgICAgICAgICAgIC8vIE5vdCBzdGFydGVkIC0gaXQgc2hvdWxkIGNoZWNrIGZvciBhdmFpbGFiaWxpdHkgZmlyc3QKKyAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIGV2ZW50dWFsbHkgbW92ZSB0byBFbmdpbmUsIGl0J3MgZ2VuZXJpYy4KKyAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyCisgICAgICAgICAgICAgICAgICAgIChjb250ZXh0LmdldExvYWRlcigpLmdldENsYXNzTG9hZGVyKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQXNrIHRoaXMgQ29udGV4dCB0byBwcm9jZXNzIHRoaXMgcmVxdWVzdAorICAgICAgICBjb250ZXh0LmdldFBpcGVsaW5lKCkuZ2V0Rmlyc3QoKS5pbnZva2UocmVxdWVzdCwgcmVzcG9uc2UpOworCisgICAgICAgIC8vIEVycm9yIHBhZ2UgcHJvY2Vzc2luZworICAgICAgICByZXNwb25zZS5zZXRTdXNwZW5kZWQoZmFsc2UpOworCisgICAgICAgIFRocm93YWJsZSB0ID0gKFRocm93YWJsZSkgcmVxdWVzdC5nZXRBdHRyaWJ1dGUoR2xvYmFscy5FWENFUFRJT05fQVRUUik7CisKKyAgICAgICAgaWYgKHQgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3dhYmxlKHJlcXVlc3QsIHJlc3BvbnNlLCB0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXR1cyhyZXF1ZXN0LCByZXNwb25zZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXN0b3JlIHRoZSBjb250ZXh0IGNsYXNzbG9hZGVyCisgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyCisgICAgICAgICAgICAoU3RhbmRhcmRIb3N0VmFsdmUuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm90ZWN0ZWQgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBIYW5kbGUgdGhlIHNwZWNpZmllZCBUaHJvd2FibGUgZW5jb3VudGVyZWQgd2hpbGUgcHJvY2Vzc2luZworICAgICAqIHRoZSBzcGVjaWZpZWQgUmVxdWVzdCB0byBwcm9kdWNlIHRoZSBzcGVjaWZpZWQgUmVzcG9uc2UuICBBbnkKKyAgICAgKiBleGNlcHRpb25zIHRoYXQgb2NjdXIgZHVyaW5nIGdlbmVyYXRpb24gb2YgdGhlIGV4Y2VwdGlvbiByZXBvcnQgYXJlCisgICAgICogbG9nZ2VkIGFuZCBzd2FsbG93ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgcmVxdWVzdCBiZWluZyBwcm9jZXNzZWQKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIHJlc3BvbnNlIGJlaW5nIGdlbmVyYXRlZAorICAgICAqIEBwYXJhbSB0aHJvd2FibGUgVGhlIGV4Y2VwdGlvbiB0aGF0IG9jY3VycmVkICh3aGljaCBwb3NzaWJseSB3cmFwcworICAgICAqICBhIHJvb3QgY2F1c2UgZXhjZXB0aW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgdGhyb3dhYmxlKFJlcXVlc3QgcmVxdWVzdCwgUmVzcG9uc2UgcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocm93YWJsZSB0aHJvd2FibGUpIHsKKyAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gcmVxdWVzdC5nZXRDb250ZXh0KCk7CisgICAgICAgIGlmIChjb250ZXh0ID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgVGhyb3dhYmxlIHJlYWxFcnJvciA9IHRocm93YWJsZTsKKworICAgICAgICBpZiAocmVhbEVycm9yIGluc3RhbmNlb2YgU2VydmxldEV4Y2VwdGlvbikgeworICAgICAgICAgICAgcmVhbEVycm9yID0gKChTZXJ2bGV0RXhjZXB0aW9uKSByZWFsRXJyb3IpLmdldFJvb3RDYXVzZSgpOworICAgICAgICAgICAgaWYgKHJlYWxFcnJvciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmVhbEVycm9yID0gdGhyb3dhYmxlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgdGhpcyBpcyBhbiBhYm9ydGVkIHJlcXVlc3QgZnJvbSBhIGNsaWVudCBqdXN0IGxvZyBpdCBhbmQgcmV0dXJuCisgICAgICAgIGlmIChyZWFsRXJyb3IgaW5zdGFuY2VvZiBDbGllbnRBYm9ydEV4Y2VwdGlvbiApIHsKKyAgICAgICAgICAgIGxvZy5kZWJ1ZworICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInN0YW5kYXJkSG9zdC5jbGllbnRBYm9ydCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENsaWVudEFib3J0RXhjZXB0aW9uKSByZWFsRXJyb3IpLmdldFRocm93YWJsZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TWVzc2FnZSgpKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBFcnJvclBhZ2UgZXJyb3JQYWdlID0gZmluZEVycm9yUGFnZShjb250ZXh0LCB0aHJvd2FibGUpOworICAgICAgICBpZiAoKGVycm9yUGFnZSA9PSBudWxsKSAmJiAocmVhbEVycm9yICE9IHRocm93YWJsZSkpIHsKKyAgICAgICAgICAgIGVycm9yUGFnZSA9IGZpbmRFcnJvclBhZ2UoY29udGV4dCwgcmVhbEVycm9yKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChlcnJvclBhZ2UgIT0gbnVsbCkgeworICAgICAgICAgICAgcmVzcG9uc2Uuc2V0QXBwQ29tbWl0dGVkKGZhbHNlKTsKKyAgICAgICAgICAgIHJlcXVlc3Quc2V0QXR0cmlidXRlCisgICAgICAgICAgICAgICAgKEFwcGxpY2F0aW9uRmlsdGVyRmFjdG9yeS5ESVNQQVRDSEVSX1JFUVVFU1RfUEFUSF9BVFRSLAorICAgICAgICAgICAgICAgICBlcnJvclBhZ2UuZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICByZXF1ZXN0LnNldEF0dHJpYnV0ZShBcHBsaWNhdGlvbkZpbHRlckZhY3RvcnkuRElTUEFUQ0hFUl9UWVBFX0FUVFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSW50ZWdlcihBcHBsaWNhdGlvbkZpbHRlckZhY3RvcnkuRVJST1IpKTsKKyAgICAgICAgICAgIHJlcXVlc3Quc2V0QXR0cmlidXRlCisgICAgICAgICAgICAgICAgKEdsb2JhbHMuU1RBVFVTX0NPREVfQVRUUiwKKyAgICAgICAgICAgICAgICAgbmV3IEludGVnZXIoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IpKTsKKyAgICAgICAgICAgIHJlcXVlc3Quc2V0QXR0cmlidXRlKEdsb2JhbHMuRVJST1JfTUVTU0FHRV9BVFRSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dhYmxlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICByZXF1ZXN0LnNldEF0dHJpYnV0ZShHbG9iYWxzLkVYQ0VQVElPTl9BVFRSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbEVycm9yKTsKKyAgICAgICAgICAgIFdyYXBwZXIgd3JhcHBlciA9IHJlcXVlc3QuZ2V0V3JhcHBlcigpOworICAgICAgICAgICAgaWYgKHdyYXBwZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXF1ZXN0LnNldEF0dHJpYnV0ZShHbG9iYWxzLlNFUlZMRVRfTkFNRV9BVFRSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZXIuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIHJlcXVlc3Quc2V0QXR0cmlidXRlKEdsb2JhbHMuRVhDRVBUSU9OX1BBR0VfQVRUUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpKTsKKyAgICAgICAgICAgIHJlcXVlc3Quc2V0QXR0cmlidXRlKEdsb2JhbHMuRVhDRVBUSU9OX1RZUEVfQVRUUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxFcnJvci5nZXRDbGFzcygpKTsKKyAgICAgICAgICAgIGlmIChjdXN0b20ocmVxdWVzdCwgcmVzcG9uc2UsIGVycm9yUGFnZSkpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5mbHVzaEJ1ZmZlcigpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLmdldExvZ2dlcigpLndhcm4oIkV4Y2VwdGlvbiBQcm9jZXNzaW5nICIgKyBlcnJvclBhZ2UsIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIEEgY3VzdG9tIGVycm9yLXBhZ2UgaGFzIG5vdCBiZWVuIGRlZmluZWQgZm9yIHRoZSBleGNlcHRpb24KKyAgICAgICAgICAgIC8vIHRoYXQgd2FzIHRocm93biBkdXJpbmcgcmVxdWVzdCBwcm9jZXNzaW5nLiBDaGVjayBpZiBhbgorICAgICAgICAgICAgLy8gZXJyb3ItcGFnZSBmb3IgZXJyb3IgY29kZSA1MDAgd2FzIHNwZWNpZmllZCBhbmQgaWYgc28sCisgICAgICAgICAgICAvLyBzZW5kIHRoYXQgcGFnZSBiYWNrIGFzIHRoZSByZXNwb25zZS4KKyAgICAgICAgICAgIHJlc3BvbnNlLnNldFN0YXR1cyhIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUik7CisgICAgICAgICAgICAvLyBUaGUgcmVzcG9uc2UgaXMgYW4gZXJyb3IKKyAgICAgICAgICAgIHJlc3BvbnNlLnNldEVycm9yKCk7CisKKyAgICAgICAgICAgIHN0YXR1cyhyZXF1ZXN0LCByZXNwb25zZSk7CisgICAgICAgIH0KKworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBIYW5kbGUgdGhlIEhUVFAgc3RhdHVzIGNvZGUgKGFuZCBjb3JyZXNwb25kaW5nIG1lc3NhZ2UpIGdlbmVyYXRlZAorICAgICAqIHdoaWxlIHByb2Nlc3NpbmcgdGhlIHNwZWNpZmllZCBSZXF1ZXN0IHRvIHByb2R1Y2UgdGhlIHNwZWNpZmllZAorICAgICAqIFJlc3BvbnNlLiAgQW55IGV4Y2VwdGlvbnMgdGhhdCBvY2N1ciBkdXJpbmcgZ2VuZXJhdGlvbiBvZiB0aGUgZXJyb3IKKyAgICAgKiByZXBvcnQgYXJlIGxvZ2dlZCBhbmQgc3dhbGxvd2VkLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHJlcXVlc3QgYmVpbmcgcHJvY2Vzc2VkCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSByZXNwb25zZSBiZWluZyBnZW5lcmF0ZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzdGF0dXMoUmVxdWVzdCByZXF1ZXN0LCBSZXNwb25zZSByZXNwb25zZSkgeworCisgICAgICAgIGludCBzdGF0dXNDb2RlID0gcmVzcG9uc2UuZ2V0U3RhdHVzKCk7CisKKyAgICAgICAgLy8gSGFuZGxlIGEgY3VzdG9tIGVycm9yIHBhZ2UgZm9yIHRoaXMgc3RhdHVzIGNvZGUKKyAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gcmVxdWVzdC5nZXRDb250ZXh0KCk7CisgICAgICAgIGlmIChjb250ZXh0ID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgLyogT25seSBsb29rIGZvciBlcnJvciBwYWdlcyB3aGVuIGlzRXJyb3IoKSBpcyBzZXQuCisgICAgICAgICAqIGlzRXJyb3IoKSBpcyBzZXQgd2hlbiByZXNwb25zZS5zZW5kRXJyb3IoKSBpcyBpbnZva2VkLiBUaGlzCisgICAgICAgICAqIGFsbG93cyBjdXN0b20gZXJyb3IgcGFnZXMgd2l0aG91dCByZWx5aW5nIG9uIGRlZmF1bHQgZnJvbQorICAgICAgICAgKiB3ZWIueG1sLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKCFyZXNwb25zZS5pc0Vycm9yKCkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgRXJyb3JQYWdlIGVycm9yUGFnZSA9IGNvbnRleHQuZmluZEVycm9yUGFnZShzdGF0dXNDb2RlKTsKKyAgICAgICAgaWYgKGVycm9yUGFnZSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXNwb25zZS5zZXRBcHBDb21taXR0ZWQoZmFsc2UpOworICAgICAgICAgICAgcmVxdWVzdC5zZXRBdHRyaWJ1dGUoR2xvYmFscy5TVEFUVVNfQ09ERV9BVFRSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEludGVnZXIoc3RhdHVzQ29kZSkpOworCisgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IFJlcXVlc3RVdGlsLmZpbHRlcihyZXNwb25zZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBtZXNzYWdlID0gIiI7CisgICAgICAgICAgICByZXF1ZXN0LnNldEF0dHJpYnV0ZShHbG9iYWxzLkVSUk9SX01FU1NBR0VfQVRUUiwgbWVzc2FnZSk7CisgICAgICAgICAgICByZXF1ZXN0LnNldEF0dHJpYnV0ZQorICAgICAgICAgICAgICAgIChBcHBsaWNhdGlvbkZpbHRlckZhY3RvcnkuRElTUEFUQ0hFUl9SRVFVRVNUX1BBVEhfQVRUUiwKKyAgICAgICAgICAgICAgICAgZXJyb3JQYWdlLmdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgcmVxdWVzdC5zZXRBdHRyaWJ1dGUoQXBwbGljYXRpb25GaWx0ZXJGYWN0b3J5LkRJU1BBVENIRVJfVFlQRV9BVFRSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEludGVnZXIoQXBwbGljYXRpb25GaWx0ZXJGYWN0b3J5LkVSUk9SKSk7CisKKworICAgICAgICAgICAgV3JhcHBlciB3cmFwcGVyID0gcmVxdWVzdC5nZXRXcmFwcGVyKCk7CisgICAgICAgICAgICBpZiAod3JhcHBlciAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlcXVlc3Quc2V0QXR0cmlidXRlKEdsb2JhbHMuU0VSVkxFVF9OQU1FX0FUVFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlci5nZXROYW1lKCkpOworICAgICAgICAgICAgcmVxdWVzdC5zZXRBdHRyaWJ1dGUoR2xvYmFscy5FWENFUFRJT05fUEFHRV9BVFRSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCkpOworICAgICAgICAgICAgaWYgKGN1c3RvbShyZXF1ZXN0LCByZXNwb25zZSwgZXJyb3JQYWdlKSkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmZsdXNoQnVmZmVyKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBjb250YWluZXIuZ2V0TG9nZ2VyKCkud2FybigiRXhjZXB0aW9uIFByb2Nlc3NpbmcgIiArIGVycm9yUGFnZSwgZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEZpbmQgYW5kIHJldHVybiB0aGUgRXJyb3JQYWdlIGluc3RhbmNlIGZvciB0aGUgc3BlY2lmaWVkIGV4Y2VwdGlvbidzCisgICAgICogY2xhc3MsIG9yIGFuIEVycm9yUGFnZSBpbnN0YW5jZSBmb3IgdGhlIGNsb3Nlc3Qgc3VwZXJjbGFzcyBmb3Igd2hpY2gKKyAgICAgKiB0aGVyZSBpcyBzdWNoIGEgZGVmaW5pdGlvbi4gIElmIG5vIGFzc29jaWF0ZWQgRXJyb3JQYWdlIGluc3RhbmNlIGlzCisgICAgICogZm91bmQsIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBDb250ZXh0IGluIHdoaWNoIHRvIHNlYXJjaAorICAgICAqIEBwYXJhbSBleGNlcHRpb24gVGhlIGV4Y2VwdGlvbiBmb3Igd2hpY2ggdG8gZmluZCBhbiBFcnJvclBhZ2UKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIEVycm9yUGFnZSBmaW5kRXJyb3JQYWdlCisgICAgICAgIChDb250ZXh0IGNvbnRleHQsIFRocm93YWJsZSBleGNlcHRpb24pIHsKKworICAgICAgICBpZiAoZXhjZXB0aW9uID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICBDbGFzcyBjbGF6eiA9IGV4Y2VwdGlvbi5nZXRDbGFzcygpOworICAgICAgICBTdHJpbmcgbmFtZSA9IGNsYXp6LmdldE5hbWUoKTsKKyAgICAgICAgd2hpbGUgKCEiamF2YS5sYW5nLk9iamVjdCIuZXF1YWxzKGNsYXp6KSkgeworICAgICAgICAgICAgRXJyb3JQYWdlIGVycm9yUGFnZSA9IGNvbnRleHQuZmluZEVycm9yUGFnZShuYW1lKTsKKyAgICAgICAgICAgIGlmIChlcnJvclBhZ2UgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gKGVycm9yUGFnZSk7CisgICAgICAgICAgICBjbGF6eiA9IGNsYXp6LmdldFN1cGVyY2xhc3MoKTsKKyAgICAgICAgICAgIGlmIChjbGF6eiA9PSBudWxsKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgbmFtZSA9IGNsYXp6LmdldE5hbWUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKG51bGwpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBIYW5kbGUgYW4gSFRUUCBzdGF0dXMgY29kZSBvciBKYXZhIGV4Y2VwdGlvbiBieSBmb3J3YXJkaW5nIGNvbnRyb2wKKyAgICAgKiB0byB0aGUgbG9jYXRpb24gaW5jbHVkZWQgaW4gdGhlIHNwZWNpZmllZCBlcnJvclBhZ2Ugb2JqZWN0LiAgSXQgaXMKKyAgICAgKiBhc3N1bWVkIHRoYXQgdGhlIGNhbGxlciBoYXMgYWxyZWFkeSByZWNvcmRlZCBhbnkgcmVxdWVzdCBhdHRyaWJ1dGVzCisgICAgICogdGhhdCBhcmUgdG8gYmUgZm9yd2FyZGVkIHRvIHRoaXMgcGFnZS4gIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZgorICAgICAqIHdlIHN1Y2Nlc3NmdWxseSB1dGlsaXplZCB0aGUgc3BlY2lmaWVkIGVycm9yIHBhZ2UgbG9jYXRpb24sIG9yCisgICAgICogPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZSBkZWZhdWx0IGVycm9yIHJlcG9ydCBzaG91bGQgYmUgcmVuZGVyZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgcmVxdWVzdCBiZWluZyBwcm9jZXNzZWQKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIHJlc3BvbnNlIGJlaW5nIGdlbmVyYXRlZAorICAgICAqIEBwYXJhbSBlcnJvclBhZ2UgVGhlIGVycm9yUGFnZSBkaXJlY3RpdmUgd2UgYXJlIG9iZXlpbmcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjdXN0b20oUmVxdWVzdCByZXF1ZXN0LCBSZXNwb25zZSByZXNwb25zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3JQYWdlIGVycm9yUGFnZSkgeworCisgICAgICAgIGlmIChjb250YWluZXIuZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGNvbnRhaW5lci5nZXRMb2dnZXIoKS5kZWJ1ZygiUHJvY2Vzc2luZyAiICsgZXJyb3JQYWdlKTsKKworICAgICAgICByZXF1ZXN0LnNldFBhdGhJbmZvKGVycm9yUGFnZS5nZXRMb2NhdGlvbigpKTsKKworICAgICAgICB0cnkgeworCisgICAgICAgICAgICAvLyBSZXNldCB0aGUgcmVzcG9uc2UgaWYgcG9zc2libGUgKGVsc2UgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKQorICAgICAgICAgICAgLy9ocmVzLnJlc2V0KCk7CisgICAgICAgICAgICAvLyBSZXNldCB0aGUgcmVzcG9uc2UgKGtlZXBpbmcgdGhlIHJlYWwgZXJyb3IgY29kZSBhbmQgbWVzc2FnZSkKKyAgICAgICAgICAgIEludGVnZXIgc3RhdHVzQ29kZU9iaiA9CisgICAgICAgICAgICAgICAgKEludGVnZXIpIHJlcXVlc3QuZ2V0QXR0cmlidXRlKEdsb2JhbHMuU1RBVFVTX0NPREVfQVRUUik7CisgICAgICAgICAgICBpbnQgc3RhdHVzQ29kZSA9IHN0YXR1c0NvZGVPYmouaW50VmFsdWUoKTsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0KKyAgICAgICAgICAgICAgICAoU3RyaW5nKSByZXF1ZXN0LmdldEF0dHJpYnV0ZShHbG9iYWxzLkVSUk9SX01FU1NBR0VfQVRUUik7CisgICAgICAgICAgICByZXNwb25zZS5yZXNldChzdGF0dXNDb2RlLCBtZXNzYWdlKTsKKworICAgICAgICAgICAgLy8gRm9yd2FyZCBjb250cm9sIHRvIHRoZSBzcGVjaWZpZWQgbG9jYXRpb24KKyAgICAgICAgICAgIFNlcnZsZXRDb250ZXh0IHNlcnZsZXRDb250ZXh0ID0KKyAgICAgICAgICAgICAgICByZXF1ZXN0LmdldENvbnRleHQoKS5nZXRTZXJ2bGV0Q29udGV4dCgpOworICAgICAgICAgICAgUmVxdWVzdERpc3BhdGNoZXIgcmQgPQorICAgICAgICAgICAgICAgIHNlcnZsZXRDb250ZXh0LmdldFJlcXVlc3REaXNwYXRjaGVyKGVycm9yUGFnZS5nZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgIHJkLmZvcndhcmQocmVxdWVzdC5nZXRSZXF1ZXN0KCksIHJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworCisgICAgICAgICAgICAvLyBJZiB3ZSBmb3J3YXJkLCB0aGUgcmVzcG9uc2UgaXMgc3VzcGVuZGVkIGFnYWluCisgICAgICAgICAgICByZXNwb25zZS5zZXRTdXNwZW5kZWQoZmFsc2UpOworCisgICAgICAgICAgICAvLyBJbmRpY2F0ZSB0aGF0IHdlIGhhdmUgc3VjY2Vzc2Z1bGx5IHByb2Nlc3NlZCB0aGlzIGN1c3RvbSBwYWdlCisgICAgICAgICAgICByZXR1cm4gKHRydWUpOworCisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisKKyAgICAgICAgICAgIC8vIFJlcG9ydCBvdXIgZmFpbHVyZSB0byBwcm9jZXNzIHRoaXMgY3VzdG9tIHBhZ2UKKyAgICAgICAgICAgIGNvbnRhaW5lci5nZXRMb2dnZXIoKS5lcnJvcigiRXhjZXB0aW9uIFByb2Nlc3NpbmcgIiArIGVycm9yUGFnZSwgdCk7CisgICAgICAgICAgICByZXR1cm4gKGZhbHNlKTsKKworICAgICAgICB9CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NvcmUvU3RhbmRhcmRQaXBlbGluZS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NvcmUvU3RhbmRhcmRQaXBlbGluZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjY2I1NWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29yZS9TdGFuZGFyZFBpcGVsaW5lLmphdmEKQEAgLTAsMCArMSw1NTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OS0yMDAxLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlOworCisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Db250YWluZWQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Db250YWluZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlBpcGVsaW5lOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuVmFsdmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLkxpZmVjeWNsZVN1cHBvcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLlN0cmluZ01hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS52YWx2ZXMuVmFsdmVCYXNlOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5tb2RlbGVyLlJlZ2lzdHJ5OworCisKKy8qKgorICogU3RhbmRhcmQgaW1wbGVtZW50YXRpb24gb2YgYSBwcm9jZXNzaW5nIDxiPlBpcGVsaW5lPC9iPiB0aGF0IHdpbGwgaW52b2tlCisgKiBhIHNlcmllcyBvZiBWYWx2ZXMgdGhhdCBoYXZlIGJlZW4gY29uZmlndXJlZCB0byBiZSBjYWxsZWQgaW4gb3JkZXIuICBUaGlzCisgKiBpbXBsZW1lbnRhdGlvbiBjYW4gYmUgdXNlZCBmb3IgYW55IHR5cGUgb2YgQ29udGFpbmVyLgorICoKKyAqIDxiPklNUExFTUVOVEFUSU9OIFdBUk5JTkc8L2I+IC0gVGhpcyBpbXBsZW1lbnRhdGlvbiBhc3N1bWVzIHRoYXQgbm8KKyAqIGNhbGxzIHRvIDxjb2RlPmFkZFZhbHZlKCk8L2NvZGU+IG9yIDxjb2RlPnJlbW92ZVZhbHZlPC9jb2RlPiBhcmUgYWxsb3dlZAorICogd2hpbGUgYSByZXF1ZXN0IGlzIGN1cnJlbnRseSBiZWluZyBwcm9jZXNzZWQuICBPdGhlcndpc2UsIHRoZSBtZWNoYW5pc20KKyAqIGJ5IHdoaWNoIHBlci10aHJlYWQgc3RhdGUgaXMgbWFpbnRhaW5lZCB3aWxsIG5lZWQgdG8gYmUgbW9kaWZpZWQuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKi8KKworcHVibGljIGNsYXNzIFN0YW5kYXJkUGlwZWxpbmUKKyAgICBpbXBsZW1lbnRzIFBpcGVsaW5lLCBDb250YWluZWQsIExpZmVjeWNsZSAKKyB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coU3RhbmRhcmRQaXBlbGluZS5jbGFzcyk7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IFN0YW5kYXJkUGlwZWxpbmUgaW5zdGFuY2Ugd2l0aCBubyBhc3NvY2lhdGVkIENvbnRhaW5lci4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RhbmRhcmRQaXBlbGluZSgpIHsKKworICAgICAgICB0aGlzKG51bGwpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgU3RhbmRhcmRQaXBlbGluZSBpbnN0YW5jZSB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUKKyAgICAgKiBzcGVjaWZpZWQgQ29udGFpbmVyLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRhaW5lciBUaGUgY29udGFpbmVyIHdlIHNob3VsZCBiZSBhc3NvY2lhdGVkIHdpdGgKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RhbmRhcmRQaXBlbGluZShDb250YWluZXIgY29udGFpbmVyKSB7CisKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgc2V0Q29udGFpbmVyKGNvbnRhaW5lcik7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgYmFzaWMgVmFsdmUgKGlmIGFueSkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgUGlwZWxpbmUuCisgICAgICovCisgICAgcHJvdGVjdGVkIFZhbHZlIGJhc2ljID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIENvbnRhaW5lciB3aXRoIHdoaWNoIHRoaXMgUGlwZWxpbmUgaXMgYXNzb2NpYXRlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ29udGFpbmVyIGNvbnRhaW5lciA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIERlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBpbmZvID0gIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZFBpcGVsaW5lLzEuMCI7CisKKworICAgIC8qKgorICAgICAqIFRoZSBsaWZlY3ljbGUgZXZlbnQgc3VwcG9ydCBmb3IgdGhpcyBjb21wb25lbnQuCisgICAgICovCisgICAgcHJvdGVjdGVkIExpZmVjeWNsZVN1cHBvcnQgbGlmZWN5Y2xlID0gbmV3IExpZmVjeWNsZVN1cHBvcnQodGhpcyk7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzdHJpbmcgbWFuYWdlciBmb3IgdGhpcyBwYWNrYWdlLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nTWFuYWdlciBzbSA9CisgICAgICAgIFN0cmluZ01hbmFnZXIuZ2V0TWFuYWdlcihDb25zdGFudHMuUGFja2FnZSk7CisKKworICAgIC8qKgorICAgICAqIEhhcyB0aGlzIGNvbXBvbmVudCBiZWVuIHN0YXJ0ZWQgeWV0PworICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIHN0YXJ0ZWQgPSBmYWxzZTsKKworCisgICAgLyoqCisgICAgICogVGhlIGZpcnN0IHZhbHZlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFBpcGVsaW5lLgorICAgICAqLworICAgIHByb3RlY3RlZCBWYWx2ZSBmaXJzdCA9IG51bGw7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBpbXBsZW1lbnRhdGlvbiBjbGFzcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEluZm8oKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLmluZm8pOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29udGFpbmVkIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBDb250YWluZXIgd2l0aCB3aGljaCB0aGlzIFBpcGVsaW5lIGlzIGFzc29jaWF0ZWQuCisgICAgICovCisgICAgcHVibGljIENvbnRhaW5lciBnZXRDb250YWluZXIoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLmNvbnRhaW5lcik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgQ29udGFpbmVyIHdpdGggd2hpY2ggdGhpcyBQaXBlbGluZSBpcyBhc3NvY2lhdGVkLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRhaW5lciBUaGUgbmV3IGFzc29jaWF0ZWQgY29udGFpbmVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29udGFpbmVyKENvbnRhaW5lciBjb250YWluZXIpIHsKKworICAgICAgICB0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lcjsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIExpZmVjeWNsZSBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIEFkZCBhIGxpZmVjeWNsZSBldmVudCBsaXN0ZW5lciB0byB0aGlzIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgdG8gYWRkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkTGlmZWN5Y2xlTGlzdGVuZXIoTGlmZWN5Y2xlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKworICAgICAgICBsaWZlY3ljbGUuYWRkTGlmZWN5Y2xlTGlzdGVuZXIobGlzdGVuZXIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGxpZmVjeWNsZSBsaXN0ZW5lcnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbGlmZWN5Y2xlLiBJZiB0aGlzIAorICAgICAqIExpZmVjeWNsZSBoYXMgbm8gbGlzdGVuZXJzIHJlZ2lzdGVyZWQsIGEgemVyby1sZW5ndGggYXJyYXkgaXMgcmV0dXJuZWQuCisgICAgICovCisgICAgcHVibGljIExpZmVjeWNsZUxpc3RlbmVyW10gZmluZExpZmVjeWNsZUxpc3RlbmVycygpIHsKKworICAgICAgICByZXR1cm4gbGlmZWN5Y2xlLmZpbmRMaWZlY3ljbGVMaXN0ZW5lcnMoKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGEgbGlmZWN5Y2xlIGV2ZW50IGxpc3RlbmVyIGZyb20gdGhpcyBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRvIHJlbW92ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUxpZmVjeWNsZUxpc3RlbmVyKExpZmVjeWNsZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisKKyAgICAgICAgbGlmZWN5Y2xlLnJlbW92ZUxpZmVjeWNsZUxpc3RlbmVyKGxpc3RlbmVyKTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFByZXBhcmUgZm9yIGFjdGl2ZSB1c2Ugb2YgdGhlIHB1YmxpYyBtZXRob2RzIG9mIHRoaXMgQ29tcG9uZW50LgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBMaWZlY3ljbGVFeGNlcHRpb24gaWYgdGhpcyBjb21wb25lbnQgZGV0ZWN0cyBhIGZhdGFsIGVycm9yCisgICAgICogIHRoYXQgcHJldmVudHMgaXQgZnJvbSBiZWluZyBzdGFydGVkCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHN0YXJ0KCkgdGhyb3dzIExpZmVjeWNsZUV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gVmFsaWRhdGUgYW5kIHVwZGF0ZSBvdXIgY3VycmVudCBjb21wb25lbnQgc3RhdGUKKyAgICAgICAgaWYgKHN0YXJ0ZWQpCisgICAgICAgICAgICB0aHJvdyBuZXcgTGlmZWN5Y2xlRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygic3RhbmRhcmRQaXBlbGluZS5hbHJlYWR5U3RhcnRlZCIpKTsKKworICAgICAgICAvLyBOb3RpZnkgb3VyIGludGVyZXN0ZWQgTGlmZWN5Y2xlTGlzdGVuZXJzCisgICAgICAgIGxpZmVjeWNsZS5maXJlTGlmZWN5Y2xlRXZlbnQoQkVGT1JFX1NUQVJUX0VWRU5ULCBudWxsKTsKKworICAgICAgICBzdGFydGVkID0gdHJ1ZTsKKworICAgICAgICAvLyBTdGFydCB0aGUgVmFsdmVzIGluIG91ciBwaXBlbGluZSAoaW5jbHVkaW5nIHRoZSBiYXNpYyksIGlmIGFueQorICAgICAgICBWYWx2ZSBjdXJyZW50ID0gZmlyc3Q7CisgICAgICAgIGlmIChjdXJyZW50ID09IG51bGwpIHsKKyAgICAgICAgCWN1cnJlbnQgPSBiYXNpYzsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoY3VycmVudCAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoY3VycmVudCBpbnN0YW5jZW9mIExpZmVjeWNsZSkKKyAgICAgICAgICAgICAgICAoKExpZmVjeWNsZSkgY3VycmVudCkuc3RhcnQoKTsKKyAgICAgICAgICAgIHJlZ2lzdGVyVmFsdmUoY3VycmVudCk7CisgICAgICAgIAljdXJyZW50ID0gY3VycmVudC5nZXROZXh0KCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBOb3RpZnkgb3VyIGludGVyZXN0ZWQgTGlmZWN5Y2xlTGlzdGVuZXJzCisgICAgICAgIGxpZmVjeWNsZS5maXJlTGlmZWN5Y2xlRXZlbnQoU1RBUlRfRVZFTlQsIG51bGwpOworCisgICAgICAgIC8vIE5vdGlmeSBvdXIgaW50ZXJlc3RlZCBMaWZlY3ljbGVMaXN0ZW5lcnMKKyAgICAgICAgbGlmZWN5Y2xlLmZpcmVMaWZlY3ljbGVFdmVudChBRlRFUl9TVEFSVF9FVkVOVCwgbnVsbCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdyYWNlZnVsbHkgc2h1dCBkb3duIGFjdGl2ZSB1c2Ugb2YgdGhlIHB1YmxpYyBtZXRob2RzIG9mIHRoaXMgQ29tcG9uZW50LgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBMaWZlY3ljbGVFeGNlcHRpb24gaWYgdGhpcyBjb21wb25lbnQgZGV0ZWN0cyBhIGZhdGFsIGVycm9yCisgICAgICogIHRoYXQgbmVlZHMgdG8gYmUgcmVwb3J0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc3RvcCgpIHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb24geworCisgICAgICAgIC8vIFZhbGlkYXRlIGFuZCB1cGRhdGUgb3VyIGN1cnJlbnQgY29tcG9uZW50IHN0YXRlCisgICAgICAgIGlmICghc3RhcnRlZCkKKyAgICAgICAgICAgIHRocm93IG5ldyBMaWZlY3ljbGVFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJzdGFuZGFyZFBpcGVsaW5lLm5vdFN0YXJ0ZWQiKSk7CisKKyAgICAgICAgLy8gTm90aWZ5IG91ciBpbnRlcmVzdGVkIExpZmVjeWNsZUxpc3RlbmVycworICAgICAgICBsaWZlY3ljbGUuZmlyZUxpZmVjeWNsZUV2ZW50KEJFRk9SRV9TVE9QX0VWRU5ULCBudWxsKTsKKworICAgICAgICAvLyBOb3RpZnkgb3VyIGludGVyZXN0ZWQgTGlmZWN5Y2xlTGlzdGVuZXJzCisgICAgICAgIGxpZmVjeWNsZS5maXJlTGlmZWN5Y2xlRXZlbnQoU1RPUF9FVkVOVCwgbnVsbCk7CisgICAgICAgIHN0YXJ0ZWQgPSBmYWxzZTsKKworICAgICAgICAvLyBTdG9wIHRoZSBWYWx2ZXMgaW4gb3VyIHBpcGVsaW5lIChpbmNsdWRpbmcgdGhlIGJhc2ljKSwgaWYgYW55CisgICAgICAgIFZhbHZlIGN1cnJlbnQgPSBmaXJzdDsKKyAgICAgICAgaWYgKGN1cnJlbnQgPT0gbnVsbCkgeworICAgICAgICAJY3VycmVudCA9IGJhc2ljOworICAgICAgICB9CisgICAgICAgIHdoaWxlIChjdXJyZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChjdXJyZW50IGluc3RhbmNlb2YgTGlmZWN5Y2xlKQorICAgICAgICAgICAgICAgICgoTGlmZWN5Y2xlKSBjdXJyZW50KS5zdG9wKCk7CisgICAgICAgICAgICB1bnJlZ2lzdGVyVmFsdmUoY3VycmVudCk7CisgICAgICAgIAljdXJyZW50ID0gY3VycmVudC5nZXROZXh0KCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBOb3RpZnkgb3VyIGludGVyZXN0ZWQgTGlmZWN5Y2xlTGlzdGVuZXJzCisgICAgICAgIGxpZmVjeWNsZS5maXJlTGlmZWN5Y2xlRXZlbnQoQUZURVJfU1RPUF9FVkVOVCwgbnVsbCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlZ2lzdGVyVmFsdmUoVmFsdmUgdmFsdmUpIHsKKworICAgICAgICBpZiggdmFsdmUgaW5zdGFuY2VvZiBWYWx2ZUJhc2UgJiYKKyAgICAgICAgICAgICAgICAoKFZhbHZlQmFzZSl2YWx2ZSkuZ2V0T2JqZWN0TmFtZSgpPT1udWxsICkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBTdHJpbmcgZG9tYWluPSgoQ29udGFpbmVyQmFzZSljb250YWluZXIpLmdldERvbWFpbigpOworICAgICAgICAgICAgICAgIGlmKCBjb250YWluZXIgaW5zdGFuY2VvZiBTdGFuZGFyZENvbnRleHQgKSB7CisgICAgICAgICAgICAgICAgICAgIGRvbWFpbj0oKFN0YW5kYXJkQ29udGV4dCljb250YWluZXIpLmdldEVuZ2luZU5hbWUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYoIGNvbnRhaW5lciBpbnN0YW5jZW9mIFN0YW5kYXJkV3JhcHBlcikgeworICAgICAgICAgICAgICAgICAgICBDb250YWluZXIgY3R4PSgoU3RhbmRhcmRXcmFwcGVyKWNvbnRhaW5lcikuZ2V0UGFyZW50KCk7CisgICAgICAgICAgICAgICAgICAgIGRvbWFpbj0oKFN0YW5kYXJkQ29udGV4dCljdHgpLmdldEVuZ2luZU5hbWUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSB2bmFtZT0oKFZhbHZlQmFzZSl2YWx2ZSkuY3JlYXRlT2JqZWN0TmFtZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvbWFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICgoQ29udGFpbmVyQmFzZSljb250YWluZXIpLmdldEpteE5hbWUoKSk7CisgICAgICAgICAgICAgICAgaWYoIHZuYW1lICE9IG51bGwgKSB7CisgICAgICAgICAgICAgICAgICAgICgoVmFsdmVCYXNlKXZhbHZlKS5zZXRPYmplY3ROYW1lKHZuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgUmVnaXN0cnkuZ2V0UmVnaXN0cnkobnVsbCwgbnVsbCkucmVnaXN0ZXJDb21wb25lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICh2YWx2ZSwgdm5hbWUsIHZhbHZlLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgKChWYWx2ZUJhc2UpdmFsdmUpLnNldENvbnRyb2xsZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICgoKENvbnRhaW5lckJhc2UpY29udGFpbmVyKS5nZXRKbXhOYW1lKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2goIFRocm93YWJsZSB0ICkgeworICAgICAgICAgICAgICAgIGxvZy5pbmZvKCAiQ2FuJ3QgcmVnaXN0ZXIgdmFsdmUgIiArIHZhbHZlICwgdCApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIHByaXZhdGUgdm9pZCB1bnJlZ2lzdGVyVmFsdmUoVmFsdmUgdmFsdmUpIHsKKyAgICAgICAgaWYoIHZhbHZlIGluc3RhbmNlb2YgVmFsdmVCYXNlICkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBWYWx2ZUJhc2UgdmI9KFZhbHZlQmFzZSl2YWx2ZTsKKyAgICAgICAgICAgICAgICBpZiggdmIuZ2V0Q29udHJvbGxlcigpIT1udWxsICYmCisgICAgICAgICAgICAgICAgICAgICAgICB2Yi5nZXRDb250cm9sbGVyKCkgPT0gCisgICAgICAgICAgICAgICAgICAgICAgICAoKENvbnRhaW5lckJhc2UpY29udGFpbmVyKS5nZXRKbXhOYW1lKCkgKSB7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBPYmplY3ROYW1lIHZuYW1lPXZiLmdldE9iamVjdE5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgUmVnaXN0cnkuZ2V0UmVnaXN0cnkobnVsbCwgbnVsbCkuZ2V0TUJlYW5TZXJ2ZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgLnVucmVnaXN0ZXJNQmVhbih2bmFtZSk7CisgICAgICAgICAgICAgICAgICAgICgoVmFsdmVCYXNlKXZhbHZlKS5zZXRPYmplY3ROYW1lKG51bGwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2goIFRocm93YWJsZSB0ICkgeworICAgICAgICAgICAgICAgIGxvZy5pbmZvKCAiQ2FuJ3QgdW5yZWdpc3RlciB2YWx2ZSAiICsgdmFsdmUgLCB0ICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9ICAgIAorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQaXBlbGluZSBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIDxwPlJldHVybiB0aGUgVmFsdmUgaW5zdGFuY2UgdGhhdCBoYXMgYmVlbiBkaXN0aW5ndWlzaGVkIGFzIHRoZSBiYXNpYworICAgICAqIFZhbHZlIGZvciB0aGlzIFBpcGVsaW5lIChpZiBhbnkpLgorICAgICAqLworICAgIHB1YmxpYyBWYWx2ZSBnZXRCYXNpYygpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMuYmFzaWMpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiA8cD5TZXQgdGhlIFZhbHZlIGluc3RhbmNlIHRoYXQgaGFzIGJlZW4gZGlzdGluZ3Vpc2hlZCBhcyB0aGUgYmFzaWMKKyAgICAgKiBWYWx2ZSBmb3IgdGhpcyBQaXBlbGluZSAoaWYgYW55KS4gIFByaW9lciB0byBzZXR0aW5nIHRoZSBiYXNpYyBWYWx2ZSwKKyAgICAgKiB0aGUgVmFsdmUncyA8Y29kZT5zZXRDb250YWluZXIoKTwvY29kZT4gd2lsbCBiZSBjYWxsZWQsIGlmIGl0CisgICAgICogaW1wbGVtZW50cyA8Y29kZT5Db250YWluZWQ8L2NvZGU+LCB3aXRoIHRoZSBvd25pbmcgQ29udGFpbmVyIGFzIGFuCisgICAgICogYXJndW1lbnQuICBUaGUgbWV0aG9kIG1heSB0aHJvdyBhbiA8Y29kZT5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb248L2NvZGU+CisgICAgICogaWYgdGhpcyBWYWx2ZSBjaG9vc2VzIG5vdCB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBDb250YWluZXIsIG9yCisgICAgICogPGNvZGU+SWxsZWdhbFN0YXRlRXhjZXB0aW9uPC9jb2RlPiBpZiBpdCBpcyBhbHJlYWR5IGFzc29jaWF0ZWQgd2l0aAorICAgICAqIGEgZGlmZmVyZW50IENvbnRhaW5lci48L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdmUgVmFsdmUgdG8gYmUgZGlzdGluZ3Vpc2hlZCBhcyB0aGUgYmFzaWMgVmFsdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRCYXNpYyhWYWx2ZSB2YWx2ZSkgeworCisgICAgICAgIC8vIENoYW5nZSBjb21wb25lbnRzIGlmIG5lY2Vzc2FyeQorICAgICAgICBWYWx2ZSBvbGRCYXNpYyA9IHRoaXMuYmFzaWM7CisgICAgICAgIGlmIChvbGRCYXNpYyA9PSB2YWx2ZSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvLyBTdG9wIHRoZSBvbGQgY29tcG9uZW50IGlmIG5lY2Vzc2FyeQorICAgICAgICBpZiAob2xkQmFzaWMgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKHN0YXJ0ZWQgJiYgKG9sZEJhc2ljIGluc3RhbmNlb2YgTGlmZWN5Y2xlKSkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICgoTGlmZWN5Y2xlKSBvbGRCYXNpYykuc3RvcCgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKExpZmVjeWNsZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiU3RhbmRhcmRQaXBlbGluZS5zZXRCYXNpYzogc3RvcCIsIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChvbGRCYXNpYyBpbnN0YW5jZW9mIENvbnRhaW5lZCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICgoQ29udGFpbmVkKSBvbGRCYXNpYykuc2V0Q29udGFpbmVyKG51bGwpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBTdGFydCB0aGUgbmV3IGNvbXBvbmVudCBpZiBuZWNlc3NhcnkKKyAgICAgICAgaWYgKHZhbHZlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGlmICh2YWx2ZSBpbnN0YW5jZW9mIENvbnRhaW5lZCkgeworICAgICAgICAgICAgKChDb250YWluZWQpIHZhbHZlKS5zZXRDb250YWluZXIodGhpcy5jb250YWluZXIpOworICAgICAgICB9CisgICAgICAgIGlmICh2YWx2ZSBpbnN0YW5jZW9mIExpZmVjeWNsZSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAoKExpZmVjeWNsZSkgdmFsdmUpLnN0YXJ0KCk7CisgICAgICAgICAgICB9IGNhdGNoIChMaWZlY3ljbGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiU3RhbmRhcmRQaXBlbGluZS5zZXRCYXNpYzogc3RhcnQiLCBlKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBVcGRhdGUgdGhlIHBpcGVsaW5lCisgICAgICAgIFZhbHZlIGN1cnJlbnQgPSBmaXJzdDsKKyAgICAgICAgd2hpbGUgKGN1cnJlbnQgIT0gbnVsbCkgeworICAgICAgICAJaWYgKGN1cnJlbnQuZ2V0TmV4dCgpID09IG9sZEJhc2ljKSB7CisgICAgICAgIAkJY3VycmVudC5zZXROZXh0KHZhbHZlKTsKKyAgICAgICAgCQlicmVhazsKKyAgICAgICAgCX0KKyAgICAgICAgCWN1cnJlbnQgPSBjdXJyZW50LmdldE5leHQoKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgdGhpcy5iYXNpYyA9IHZhbHZlOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiA8cD5BZGQgYSBuZXcgVmFsdmUgdG8gdGhlIGVuZCBvZiB0aGUgcGlwZWxpbmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMKKyAgICAgKiBDb250YWluZXIuICBQcmlvciB0byBhZGRpbmcgdGhlIFZhbHZlLCB0aGUgVmFsdmUncworICAgICAqIDxjb2RlPnNldENvbnRhaW5lcigpPC9jb2RlPiBtZXRob2Qgd2lsbCBiZSBjYWxsZWQsIGlmIGl0IGltcGxlbWVudHMKKyAgICAgKiA8Y29kZT5Db250YWluZWQ8L2NvZGU+LCB3aXRoIHRoZSBvd25pbmcgQ29udGFpbmVyIGFzIGFuIGFyZ3VtZW50LgorICAgICAqIFRoZSBtZXRob2QgbWF5IHRocm93IGFuCisgICAgICogPGNvZGU+SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uPC9jb2RlPiBpZiB0aGlzIFZhbHZlIGNob29zZXMgbm90IHRvCisgICAgICogYmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgQ29udGFpbmVyLCBvciA8Y29kZT5JbGxlZ2FsU3RhdGVFeGNlcHRpb248L2NvZGU+CisgICAgICogaWYgaXQgaXMgYWxyZWFkeSBhc3NvY2lhdGVkIHdpdGggYSBkaWZmZXJlbnQgQ29udGFpbmVyLjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx2ZSBWYWx2ZSB0byBiZSBhZGRlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhpcyBDb250YWluZXIgcmVmdXNlZCB0bworICAgICAqICBhY2NlcHQgdGhlIHNwZWNpZmllZCBWYWx2ZQorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBzcGVjaWZpZSBWYWx2ZSByZWZ1c2VzIHRvIGJlCisgICAgICogIGFzc29jaWF0ZWQgd2l0aCB0aGlzIENvbnRhaW5lcgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSBzcGVjaWZpZWQgVmFsdmUgaXMgYWxyZWFkeQorICAgICAqICBhc3NvY2lhdGVkIHdpdGggYSBkaWZmZXJlbnQgQ29udGFpbmVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkVmFsdmUoVmFsdmUgdmFsdmUpIHsKKyAgICAKKyAgICAgICAgLy8gVmFsaWRhdGUgdGhhdCB3ZSBjYW4gYWRkIHRoaXMgVmFsdmUKKyAgICAgICAgaWYgKHZhbHZlIGluc3RhbmNlb2YgQ29udGFpbmVkKQorICAgICAgICAgICAgKChDb250YWluZWQpIHZhbHZlKS5zZXRDb250YWluZXIodGhpcy5jb250YWluZXIpOworCisgICAgICAgIC8vIFN0YXJ0IHRoZSBuZXcgY29tcG9uZW50IGlmIG5lY2Vzc2FyeQorICAgICAgICBpZiAoc3RhcnRlZCkgeworICAgICAgICAgICAgaWYgKHZhbHZlIGluc3RhbmNlb2YgTGlmZWN5Y2xlKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgKChMaWZlY3ljbGUpIHZhbHZlKS5zdGFydCgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKExpZmVjeWNsZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiU3RhbmRhcmRQaXBlbGluZS5hZGRWYWx2ZTogc3RhcnQ6ICIsIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFJlZ2lzdGVyIHRoZSBuZXdseSBhZGRlZCB2YWx2ZQorICAgICAgICAgICAgcmVnaXN0ZXJWYWx2ZSh2YWx2ZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBBZGQgdGhpcyBWYWx2ZSB0byB0aGUgc2V0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIFBpcGVsaW5lCisgICAgICAgIGlmIChmaXJzdCA9PSBudWxsKSB7CisgICAgICAgIAlmaXJzdCA9IHZhbHZlOworICAgICAgICAJdmFsdmUuc2V0TmV4dChiYXNpYyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBWYWx2ZSBjdXJyZW50ID0gZmlyc3Q7CisgICAgICAgICAgICB3aGlsZSAoY3VycmVudCAhPSBudWxsKSB7CisJCQkJaWYgKGN1cnJlbnQuZ2V0TmV4dCgpID09IGJhc2ljKSB7CisJCQkJCWN1cnJlbnQuc2V0TmV4dCh2YWx2ZSk7CisJCQkJCXZhbHZlLnNldE5leHQoYmFzaWMpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJY3VycmVudCA9IGN1cnJlbnQuZ2V0TmV4dCgpOworCQkJfQorICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2V0IG9mIFZhbHZlcyBpbiB0aGUgcGlwZWxpbmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMKKyAgICAgKiBDb250YWluZXIsIGluY2x1ZGluZyB0aGUgYmFzaWMgVmFsdmUgKGlmIGFueSkuICBJZiB0aGVyZSBhcmUgbm8KKyAgICAgKiBzdWNoIFZhbHZlcywgYSB6ZXJvLWxlbmd0aCBhcnJheSBpcyByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgVmFsdmVbXSBnZXRWYWx2ZXMoKSB7CisKKyAgICAJQXJyYXlMaXN0IHZhbHZlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgVmFsdmUgY3VycmVudCA9IGZpcnN0OworICAgICAgICBpZiAoY3VycmVudCA9PSBudWxsKSB7CisgICAgICAgIAljdXJyZW50ID0gYmFzaWM7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKGN1cnJlbnQgIT0gbnVsbCkgeworICAgICAgICAJdmFsdmVMaXN0LmFkZChjdXJyZW50KTsKKyAgICAgICAgCWN1cnJlbnQgPSBjdXJyZW50LmdldE5leHQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAoKFZhbHZlW10pIHZhbHZlTGlzdC50b0FycmF5KG5ldyBWYWx2ZVswXSkpOworCisgICAgfQorCisgICAgcHVibGljIE9iamVjdE5hbWVbXSBnZXRWYWx2ZU9iamVjdE5hbWVzKCkgeworCisgICAgCUFycmF5TGlzdCB2YWx2ZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIFZhbHZlIGN1cnJlbnQgPSBmaXJzdDsKKyAgICAgICAgaWYgKGN1cnJlbnQgPT0gbnVsbCkgeworICAgICAgICAJY3VycmVudCA9IGJhc2ljOworICAgICAgICB9CisgICAgICAgIHdoaWxlIChjdXJyZW50ICE9IG51bGwpIHsKKyAgICAgICAgCWlmIChjdXJyZW50IGluc3RhbmNlb2YgVmFsdmVCYXNlKSB7CisgICAgICAgIAkJdmFsdmVMaXN0LmFkZCgoKFZhbHZlQmFzZSkgY3VycmVudCkuZ2V0T2JqZWN0TmFtZSgpKTsKKyAgICAgICAgCX0KKyAgICAgICAgCWN1cnJlbnQgPSBjdXJyZW50LmdldE5leHQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAoKE9iamVjdE5hbWVbXSkgdmFsdmVMaXN0LnRvQXJyYXkobmV3IE9iamVjdE5hbWVbMF0pKTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIFZhbHZlIGZyb20gdGhlIHBpcGVsaW5lIGFzc29jaWF0ZWQgd2l0aCB0aGlzCisgICAgICogQ29udGFpbmVyLCBpZiBpdCBpcyBmb3VuZDsgb3RoZXJ3aXNlLCBkbyBub3RoaW5nLiAgSWYgdGhlIFZhbHZlIGlzCisgICAgICogZm91bmQgYW5kIHJlbW92ZWQsIHRoZSBWYWx2ZSdzIDxjb2RlPnNldENvbnRhaW5lcihudWxsKTwvY29kZT4gbWV0aG9kCisgICAgICogd2lsbCBiZSBjYWxsZWQgaWYgaXQgaW1wbGVtZW50cyA8Y29kZT5Db250YWluZWQ8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHZlIFZhbHZlIHRvIGJlIHJlbW92ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVWYWx2ZShWYWx2ZSB2YWx2ZSkgeworCisgICAgICAgIFZhbHZlIGN1cnJlbnQgPSBmaXJzdDsKKyAgICAgICAgd2hpbGUgKGN1cnJlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGN1cnJlbnQuZ2V0TmV4dCgpID09IHZhbHZlKSB7CisgICAgICAgICAgICAgICAgY3VycmVudC5zZXROZXh0KHZhbHZlLmdldE5leHQoKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5nZXROZXh0KCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAodmFsdmUgaW5zdGFuY2VvZiBDb250YWluZWQpCisgICAgICAgICAgICAoKENvbnRhaW5lZCkgdmFsdmUpLnNldENvbnRhaW5lcihudWxsKTsKKworICAgICAgICAvLyBTdG9wIHRoaXMgdmFsdmUgaWYgbmVjZXNzYXJ5CisgICAgICAgIGlmIChzdGFydGVkKSB7CisgICAgICAgICAgICBpZiAodmFsdmUgaW5zdGFuY2VvZiBMaWZlY3ljbGUpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAoKExpZmVjeWNsZSkgdmFsdmUpLnN0b3AoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChMaWZlY3ljbGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIlN0YW5kYXJkUGlwZWxpbmUucmVtb3ZlVmFsdmU6IHN0b3A6ICIsIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFVucmVnaXN0ZXIgdGhlIHJlbW92ZWQgdmFsYXZlCisgICAgICAgICAgICB1bnJlZ2lzdGVyVmFsdmUodmFsdmUpOworICAgICAgICB9CisgICAgCisgICAgfQorCisKKyAgICBwdWJsaWMgVmFsdmUgZ2V0Rmlyc3QoKSB7CisgICAgICAgIGlmIChmaXJzdCAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmlyc3Q7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gYmFzaWM7CisgICAgICAgIH0KKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NvcmUvU3RhbmRhcmRTZXJ2ZXIuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb3JlL1N0YW5kYXJkU2VydmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmVhZDRjOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb3JlL1N0YW5kYXJkU2VydmVyLmphdmEKQEAgLTAsMCArMSwyMTE1IEBACisvKgorICogQ29weXJpZ2h0IDE5OTktMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZTsKKworCitpbXBvcnQgamF2YS5iZWFucy5JbmRleGVkUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IGphdmEuYmVhbnMuSW50cm9zcGVjdG9yOworaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKK2ltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlU3VwcG9ydDsKK2ltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0LlNlcnZlclNvY2tldDsKK2ltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7CitpbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc3FsLlRpbWVzdGFtcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKKworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5SZWdpc3RyYXRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CitpbXBvcnQgamF2YXgubmFtaW5nLmRpcmVjdG9yeS5EaXJDb250ZXh0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Db250YWluZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Db250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuRW5naW5lOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuSG9zdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZUxpc3RlbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTG9hZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlBpcGVsaW5lOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuUmVhbG07CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5TZXJ2ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5TZXJ2ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuU2VydmljZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlN0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuVmFsdmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuQ29ubmVjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkFwcGxpY2F0aW9uUGFyYW1ldGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkNvbnRleHRFamI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuQ29udGV4dEVudmlyb25tZW50OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkNvbnRleHRMb2NhbEVqYjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5Db250ZXh0UmVzb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuQ29udGV4dFJlc291cmNlRW52UmVmOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkNvbnRleHRSZXNvdXJjZUxpbms7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuTmFtaW5nUmVzb3VyY2VzOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEubG9hZGVyLldlYmFwcExvYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnNlc3Npb24uUGVyc2lzdGVudE1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5zZXNzaW9uLlN0YW5kYXJkTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuTGlmZWN5Y2xlU3VwcG9ydDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuU3RyaW5nTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubW9kZWxlci5SZWdpc3RyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNveW90ZS5Qcm90b2NvbEhhbmRsZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5JbnRyb3NwZWN0aW9uVXRpbHM7CisKKworCisvKioKKyAqIFN0YW5kYXJkIGltcGxlbWVudGF0aW9uIG9mIHRoZSA8Yj5TZXJ2ZXI8L2I+IGludGVyZmFjZSwgYXZhaWxhYmxlIGZvciB1c2UKKyAqIChidXQgbm90IHJlcXVpcmVkKSB3aGVuIGRlcGxveWluZyBhbmQgc3RhcnRpbmcgQ2F0YWxpbmEuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBTdGFuZGFyZFNlcnZlcgorICAgIGltcGxlbWVudHMgTGlmZWN5Y2xlLCBTZXJ2ZXIsIE1CZWFuUmVnaXN0cmF0aW9uIAorIHsKKyAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coU3RhbmRhcmRTZXJ2ZXIuY2xhc3MpOworICAgCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdGFudHMKKworCisgICAgLyoqCisgICAgICogVGhlIHNldCBvZiBjbGFzcy9wcm9wZXJ0eSBjb21iaW5hdGlvbnMgdGhhdCBzaG91bGQgPHN0cm9uZz5OT1Q8L3N0cm9uZz4KKyAgICAgKiBiZSBwZXJzaXN0ZWQgYmVjYXVzZSB0aGV5IGFyZSBhdXRvbWF0aWNhbGx5IGNhbGN1bGF0ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGV4Y2VwdGlvbnNbXVtdID0geworICAgICAgICB7ICJvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRFbmdpbmUiLCAiZG9tYWluIiB9LAorICAgICAgICB7ICJvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRIb3N0IiwgImRvbWFpbiIgfSwKKyAgICAgICAgeyAib3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkQ29udGV4dCIsICJhdmFpbGFibGUiIH0sCisgICAgICAgIHsgIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZENvbnRleHQiLCAiY29uZmlnRmlsZSIgfSwKKyAgICAgICAgeyAib3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkQ29udGV4dCIsICJjb25maWd1cmVkIiB9LAorICAgICAgICB7ICJvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRDb250ZXh0IiwgImRpc3RyaWJ1dGFibGUiIH0sCisgICAgICAgIHsgIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZENvbnRleHQiLCAiZG9tYWluIiB9LAorICAgICAgICB7ICJvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRDb250ZXh0IiwgImVuZ2luZU5hbWUiIH0sCisgICAgICAgIHsgIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZENvbnRleHQiLCAibmFtZSIgfSwKKyAgICAgICAgeyAib3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkQ29udGV4dCIsICJvdmVycmlkZSIgfSwKKyAgICAgICAgeyAib3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkQ29udGV4dCIsICJwdWJsaWNJZCIgfSwKKyAgICAgICAgeyAib3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkQ29udGV4dCIsICJyZXBsYWNlV2VsY29tZUZpbGVzIiB9LAorICAgICAgICB7ICJvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRDb250ZXh0IiwgInNlc3Npb25UaW1lb3V0IiB9LAorICAgICAgICB7ICJvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRDb250ZXh0IiwgInN0YXJ0dXBUaW1lIiB9LAorICAgICAgICB7ICJvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRDb250ZXh0IiwgInRsZFNjYW5UaW1lIiB9LAorICAgICAgICAvL3sgIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZENvbnRleHQiLCAid29ya0RpciIgfSwKKyAgICAgICAgeyAib3JnLmFwYWNoZS5jYXRhbGluYS5zZXNzaW9uLlN0YW5kYXJkTWFuYWdlciIsICJkaXN0cmlidXRhYmxlIiB9LAorICAgICAgICB7ICJvcmcuYXBhY2hlLmNhdGFsaW5hLnNlc3Npb24uU3RhbmRhcmRNYW5hZ2VyIiwgImVudHJvcHkiIH0sCisgICAgICAgIHsgIm9yZy5hcGFjaGUuY295b3RlLmh0dHAxMS5IdHRwMTFQcm90b2NvbCIsICJwb3J0In0sCisgICAgICAgIHsgIm9yZy5hcGFjaGUuY295b3RlLmh0dHAxMS5IdHRwMTFQcm90b2NvbCIsICJzb1RpbWVvdXQifSwKKyAgICAgICAgeyAib3JnLmFwYWNoZS5qay5zZXJ2ZXIuSmtDb3lvdGVIYW5kbGVyIiwgIm5hbWUifSwKKyAgICAgICAgCisgICAgfTsKKworCisgICAgLyoqCisgICAgICogVGhlIHNldCBvZiBjbGFzc2VzIHRoYXQgcmVwcmVzZW50IHBlcnNpc3RhYmxlIHByb3BlcnRpZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3MgcGVyc2lzdGFibGVzW10gPSB7CisgICAgICAgIFN0cmluZy5jbGFzcywKKyAgICAgICAgSW50ZWdlci5jbGFzcywgSW50ZWdlci5UWVBFLAorICAgICAgICBCb29sZWFuLmNsYXNzLCBCb29sZWFuLlRZUEUsCisgICAgICAgIEJ5dGUuY2xhc3MsIEJ5dGUuVFlQRSwKKyAgICAgICAgQ2hhcmFjdGVyLmNsYXNzLCBDaGFyYWN0ZXIuVFlQRSwKKyAgICAgICAgRG91YmxlLmNsYXNzLCBEb3VibGUuVFlQRSwKKyAgICAgICAgRmxvYXQuY2xhc3MsIEZsb2F0LlRZUEUsCisgICAgICAgIExvbmcuY2xhc3MsIExvbmcuVFlQRSwKKyAgICAgICAgU2hvcnQuY2xhc3MsIFNob3J0LlRZUEUsCisgICAgfTsKKworCisgICAgLyoqCisgICAgICogVGhlIHNldCBvZiBjbGFzcyBuYW1lcyB0aGF0IHNob3VsZCBiZSBza2lwcGVkIHdoZW4gcGVyc2lzdGluZyBzdGF0ZSwKKyAgICAgKiBiZWNhdXNlIHRoZSBjb3JyZXNwb25kaW5nIGxpc3RlbmVycywgdmFsdmVzLCBldGMuIGFyZSBjb25maWd1cmVkCisgICAgICogYXV0b21hdGljYWxseSBhdCBzdGFydHVwIHRpbWUuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHNraXBwYWJsZXNbXSA9IHsKKyAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuYXV0aGVudGljYXRvci5CYXNpY0F1dGhlbnRpY2F0b3IiLAorICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5hdXRoZW50aWNhdG9yLkRpZ2VzdEF1dGhlbnRpY2F0b3IiLAorICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5hdXRoZW50aWNhdG9yLkZvcm1BdXRoZW50aWNhdG9yIiwKKyAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuYXV0aGVudGljYXRvci5Ob25Mb2dpbkF1dGhlbnRpY2F0b3IiLAorICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5hdXRoZW50aWNhdG9yLlNTTEF1dGhlbnRpY2F0b3IiLAorICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLk5hbWluZ0NvbnRleHRMaXN0ZW5lciIsCisgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRDb250ZXh0VmFsdmUiLAorICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkRGVmYXVsdENvbnRleHQiLAorICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkRW5naW5lVmFsdmUiLAorICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkSG9zdFZhbHZlIiwKKyAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cC5Db250ZXh0Q29uZmlnIiwKKyAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cC5FbmdpbmVDb25maWciLAorICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5zdGFydHVwLkhvc3RDb25maWciLAorICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS52YWx2ZXMuQ2VydGlmaWNhdGVzVmFsdmUiLAorICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS52YWx2ZXMuRXJyb3JSZXBvcnRWYWx2ZSIsCisgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcy5SZXF1ZXN0TGlzdGVuZXJWYWx2ZSIsCisgICAgfTsKKworCisgICAgLyoqCisgICAgICogVGhlIHNldCBvZiBjbGFzcyBuYW1lcyB0aGF0IGFyZSB0aGUgc3RhbmRhcmQgaW1wbGVtZW50YXRpb25zIG9mIAorICAgICAqIGNvbXBvbmVudHMsIGFuZCBoZW5jZSBzaG91bGQgbm90IGJlIHBlcnNpc3RlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgc3RhbmRhcmRJbXBsZW1lbnRhdGlvbnNbXSA9IHsKKyAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLkNvbm5lY3RvciIsCisgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRTZXJ2ZXIiLAorICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkU2VydmljZSIsCisgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRFbmdpbmUiLAorICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkSG9zdCIsCisgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRDb250ZXh0IiwKKyAgICAgICAgIm9yZy5hcGFjaGUuY295b3RlLmh0dHAxMS5IdHRwMTFQcm90b2NvbCIsCisgICAgICAgICJvcmcuYXBhY2hlLmprLnNlcnZlci5Ka0NveW90ZUhhbmRsZXIiCisgICAgICAgIAorICAgIH07CisKKworICAgIC8qKgorICAgICAqIFNlcnZlckxpZmVjeWNsZUxpc3RlbmVyIGNsYXNzbmFtZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgU0VSVkVSX0xJU1RFTkVSX0NMQVNTX05BTUUgPQorICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5tYmVhbnMuU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXIiOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3IKKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgZGVmYXVsdCBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLgorICAgICAqLworICAgIHB1YmxpYyBTdGFuZGFyZFNlcnZlcigpIHsKKworICAgICAgICBzdXBlcigpOworICAgICAgICBTZXJ2ZXJGYWN0b3J5LnNldFNlcnZlcih0aGlzKTsKKworICAgICAgICBnbG9iYWxOYW1pbmdSZXNvdXJjZXMgPSBuZXcgTmFtaW5nUmVzb3VyY2VzKCk7CisgICAgICAgIGdsb2JhbE5hbWluZ1Jlc291cmNlcy5zZXRDb250YWluZXIodGhpcyk7CisKKyAgICAgICAgaWYgKGlzVXNlTmFtaW5nKCkpIHsKKyAgICAgICAgICAgIGlmIChuYW1pbmdDb250ZXh0TGlzdGVuZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG5hbWluZ0NvbnRleHRMaXN0ZW5lciA9IG5ldyBOYW1pbmdDb250ZXh0TGlzdGVuZXIoKTsKKyAgICAgICAgICAgICAgICBhZGRMaWZlY3ljbGVMaXN0ZW5lcihuYW1pbmdDb250ZXh0TGlzdGVuZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBHbG9iYWwgbmFtaW5nIHJlc291cmNlcyBjb250ZXh0LgorICAgICAqLworICAgIHByaXZhdGUgamF2YXgubmFtaW5nLkNvbnRleHQgZ2xvYmFsTmFtaW5nQ29udGV4dCA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIEdsb2JhbCBuYW1pbmcgcmVzb3VyY2VzLgorICAgICAqLworICAgIHByaXZhdGUgTmFtaW5nUmVzb3VyY2VzIGdsb2JhbE5hbWluZ1Jlc291cmNlcyA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIERlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgU2VydmVyIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBpbmZvID0KKyAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZFNlcnZlci8xLjAiOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgbGlmZWN5Y2xlIGV2ZW50IHN1cHBvcnQgZm9yIHRoaXMgY29tcG9uZW50LgorICAgICAqLworICAgIHByaXZhdGUgTGlmZWN5Y2xlU3VwcG9ydCBsaWZlY3ljbGUgPSBuZXcgTGlmZWN5Y2xlU3VwcG9ydCh0aGlzKTsKKworCisgICAgLyoqCisgICAgICogVGhlIG5hbWluZyBjb250ZXh0IGxpc3RlbmVyIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIE5hbWluZ0NvbnRleHRMaXN0ZW5lciBuYW1pbmdDb250ZXh0TGlzdGVuZXIgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgcG9ydCBudW1iZXIgb24gd2hpY2ggd2Ugd2FpdCBmb3Igc2h1dGRvd24gY29tbWFuZHMuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgcG9ydCA9IDgwMDU7CisKKworICAgIC8qKgorICAgICAqIEEgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgdGhhdCBpcyA8c3Ryb25nPm9ubHk8L3N0cm9uZz4gdXNlZCBpZgorICAgICAqIHRoZSBzaHV0ZG93biBjb21tYW5kIHN0cmluZyBpcyBsb25nZXIgdGhhbiAxMDI0IGNoYXJhY3RlcnMuCisgICAgICovCisgICAgcHJpdmF0ZSBSYW5kb20gcmFuZG9tID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIHNldCBvZiBTZXJ2aWNlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBTZXJ2ZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBTZXJ2aWNlIHNlcnZpY2VzW10gPSBuZXcgU2VydmljZVswXTsKKworCisgICAgLyoqCisgICAgICogVGhlIHNodXRkb3duIGNvbW1hbmQgc3RyaW5nIHdlIGFyZSBsb29raW5nIGZvci4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBzaHV0ZG93biA9ICJTSFVURE9XTiI7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzdHJpbmcgbWFuYWdlciBmb3IgdGhpcyBwYWNrYWdlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ01hbmFnZXIgc20gPQorICAgICAgICBTdHJpbmdNYW5hZ2VyLmdldE1hbmFnZXIoQ29uc3RhbnRzLlBhY2thZ2UpOworCisKKyAgICAvKioKKyAgICAgKiBIYXMgdGhpcyBjb21wb25lbnQgYmVlbiBzdGFydGVkPworICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBzdGFydGVkID0gZmFsc2U7CisKKworICAgIC8qKgorICAgICAqIEhhcyB0aGlzIGNvbXBvbmVudCBiZWVuIGluaXRpYWxpemVkPworICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBpbml0aWFsaXplZCA9IGZhbHNlOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgcHJvcGVydHkgY2hhbmdlIHN1cHBvcnQgZm9yIHRoaXMgY29tcG9uZW50LgorICAgICAqLworICAgIHByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZVN1cHBvcnQgc3VwcG9ydCA9IG5ldyBQcm9wZXJ0eUNoYW5nZVN1cHBvcnQodGhpcyk7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGdsb2JhbCBuYW1pbmcgcmVzb3VyY2VzIGNvbnRleHQuCisgICAgICovCisgICAgcHVibGljIGphdmF4Lm5hbWluZy5Db250ZXh0IGdldEdsb2JhbE5hbWluZ0NvbnRleHQoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLmdsb2JhbE5hbWluZ0NvbnRleHQpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGdsb2JhbCBuYW1pbmcgcmVzb3VyY2VzIGNvbnRleHQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZ2xvYmFsTmFtaW5nQ29udGV4dCBUaGUgbmV3IGdsb2JhbCBuYW1pbmcgcmVzb3VyY2UgY29udGV4dAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEdsb2JhbE5hbWluZ0NvbnRleHQKKyAgICAgICAgKGphdmF4Lm5hbWluZy5Db250ZXh0IGdsb2JhbE5hbWluZ0NvbnRleHQpIHsKKworICAgICAgICB0aGlzLmdsb2JhbE5hbWluZ0NvbnRleHQgPSBnbG9iYWxOYW1pbmdDb250ZXh0OworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGdsb2JhbCBuYW1pbmcgcmVzb3VyY2VzLgorICAgICAqLworICAgIHB1YmxpYyBOYW1pbmdSZXNvdXJjZXMgZ2V0R2xvYmFsTmFtaW5nUmVzb3VyY2VzKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5nbG9iYWxOYW1pbmdSZXNvdXJjZXMpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGdsb2JhbCBuYW1pbmcgcmVzb3VyY2VzLgorICAgICAqCisgICAgICogQHBhcmFtIGdsb2JhbE5hbWluZ1Jlc291cmNlcyBUaGUgbmV3IGdsb2JhbCBuYW1pbmcgcmVzb3VyY2VzCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0R2xvYmFsTmFtaW5nUmVzb3VyY2VzCisgICAgICAgIChOYW1pbmdSZXNvdXJjZXMgZ2xvYmFsTmFtaW5nUmVzb3VyY2VzKSB7CisKKyAgICAgICAgTmFtaW5nUmVzb3VyY2VzIG9sZEdsb2JhbE5hbWluZ1Jlc291cmNlcyA9CisgICAgICAgICAgICB0aGlzLmdsb2JhbE5hbWluZ1Jlc291cmNlczsKKyAgICAgICAgdGhpcy5nbG9iYWxOYW1pbmdSZXNvdXJjZXMgPSBnbG9iYWxOYW1pbmdSZXNvdXJjZXM7CisgICAgICAgIHRoaXMuZ2xvYmFsTmFtaW5nUmVzb3VyY2VzLnNldENvbnRhaW5lcih0aGlzKTsKKyAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoImdsb2JhbE5hbWluZ1Jlc291cmNlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZEdsb2JhbE5hbWluZ1Jlc291cmNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nbG9iYWxOYW1pbmdSZXNvdXJjZXMpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBTZXJ2ZXIgaW1wbGVtZW50YXRpb24gYW5kCisgICAgICogdGhlIGNvcnJlc3BvbmRpbmcgdmVyc2lvbiBudW1iZXIsIGluIHRoZSBmb3JtYXQKKyAgICAgKiA8Y29kZT4mbHQ7ZGVzY3JpcHRpb24mZ3Q7LyZsdDt2ZXJzaW9uJmd0OzwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJbmZvKCkgeworCisgICAgICAgIHJldHVybiAoaW5mbyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcG9ydCBudW1iZXIgd2UgbGlzdGVuIHRvIGZvciBzaHV0ZG93biBjb21tYW5kcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFBvcnQoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLnBvcnQpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHBvcnQgbnVtYmVyIHdlIGxpc3RlbiB0byBmb3Igc2h1dGRvd24gY29tbWFuZHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcG9ydCBUaGUgbmV3IHBvcnQgbnVtYmVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UG9ydChpbnQgcG9ydCkgeworCisgICAgICAgIHRoaXMucG9ydCA9IHBvcnQ7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2h1dGRvd24gY29tbWFuZCBzdHJpbmcgd2UgYXJlIHdhaXRpbmcgZm9yLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2h1dGRvd24oKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLnNodXRkb3duKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzaHV0ZG93biBjb21tYW5kIHdlIGFyZSB3YWl0aW5nIGZvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzaHV0ZG93biBUaGUgbmV3IHNodXRkb3duIGNvbW1hbmQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTaHV0ZG93bihTdHJpbmcgc2h1dGRvd24pIHsKKworICAgICAgICB0aGlzLnNodXRkb3duID0gc2h1dGRvd247CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTZXJ2ZXIgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBuZXcgU2VydmljZSB0byB0aGUgc2V0IG9mIGRlZmluZWQgU2VydmljZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VydmljZSBUaGUgU2VydmljZSB0byBiZSBhZGRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFNlcnZpY2UoU2VydmljZSBzZXJ2aWNlKSB7CisKKyAgICAgICAgc2VydmljZS5zZXRTZXJ2ZXIodGhpcyk7CisKKyAgICAgICAgc3luY2hyb25pemVkIChzZXJ2aWNlcykgeworICAgICAgICAgICAgU2VydmljZSByZXN1bHRzW10gPSBuZXcgU2VydmljZVtzZXJ2aWNlcy5sZW5ndGggKyAxXTsKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoc2VydmljZXMsIDAsIHJlc3VsdHMsIDAsIHNlcnZpY2VzLmxlbmd0aCk7CisgICAgICAgICAgICByZXN1bHRzW3NlcnZpY2VzLmxlbmd0aF0gPSBzZXJ2aWNlOworICAgICAgICAgICAgc2VydmljZXMgPSByZXN1bHRzOworCisgICAgICAgICAgICBpZiAoaW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLmluaXRpYWxpemUoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChMaWZlY3ljbGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZShTeXN0ZW0uZXJyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzdGFydGVkICYmIChzZXJ2aWNlIGluc3RhbmNlb2YgTGlmZWN5Y2xlKSkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICgoTGlmZWN5Y2xlKSBzZXJ2aWNlKS5zdGFydCgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKExpZmVjeWNsZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFJlcG9ydCB0aGlzIHByb3BlcnR5IGNoYW5nZSB0byBpbnRlcmVzdGVkIGxpc3RlbmVycworICAgICAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoInNlcnZpY2UiLCBudWxsLCBzZXJ2aWNlKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBXYWl0IHVudGlsIGEgcHJvcGVyIHNodXRkb3duIGNvbW1hbmQgaXMgcmVjZWl2ZWQsIHRoZW4gcmV0dXJuLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGF3YWl0KCkgeworCisgICAgICAgIC8vIFNldCB1cCBhIHNlcnZlciBzb2NrZXQgdG8gd2FpdCBvbgorICAgICAgICBTZXJ2ZXJTb2NrZXQgc2VydmVyU29ja2V0ID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNlcnZlclNvY2tldCA9CisgICAgICAgICAgICAgICAgbmV3IFNlcnZlclNvY2tldChwb3J0LCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKCIxMjcuMC4wLjEiKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcigiU3RhbmRhcmRTZXJ2ZXIuYXdhaXQ6IGNyZWF0ZVsiICsgcG9ydAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIl06ICIsIGUpOworICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBMb29wIHdhaXRpbmcgZm9yIGEgY29ubmVjdGlvbiBhbmQgYSB2YWxpZCBjb21tYW5kCisgICAgICAgIHdoaWxlICh0cnVlKSB7CisKKyAgICAgICAgICAgIC8vIFdhaXQgZm9yIHRoZSBuZXh0IGNvbm5lY3Rpb24KKyAgICAgICAgICAgIFNvY2tldCBzb2NrZXQgPSBudWxsOworICAgICAgICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc29ja2V0ID0gc2VydmVyU29ja2V0LmFjY2VwdCgpOworICAgICAgICAgICAgICAgIHNvY2tldC5zZXRTb1RpbWVvdXQoMTAgKiAxMDAwKTsgIC8vIFRlbiBzZWNvbmRzCisgICAgICAgICAgICAgICAgc3RyZWFtID0gc29ja2V0LmdldElucHV0U3RyZWFtKCk7CisgICAgICAgICAgICB9IGNhdGNoIChBY2Nlc3NDb250cm9sRXhjZXB0aW9uIGFjZSkgeworICAgICAgICAgICAgICAgIGxvZy53YXJuKCJTdGFuZGFyZFNlcnZlci5hY2NlcHQgc2VjdXJpdHkgZXhjZXB0aW9uOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgYWNlLmdldE1lc3NhZ2UoKSwgYWNlKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIlN0YW5kYXJkU2VydmVyLmF3YWl0OiBhY2NlcHQ6ICIsIGUpOworICAgICAgICAgICAgICAgIFN5c3RlbS5leGl0KDEpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBSZWFkIGEgc2V0IG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgc29ja2V0CisgICAgICAgICAgICBTdHJpbmdCdWZmZXIgY29tbWFuZCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgICAgIGludCBleHBlY3RlZCA9IDEwMjQ7IC8vIEN1dCBvZmYgdG8gYXZvaWQgRG9TIGF0dGFjaworICAgICAgICAgICAgd2hpbGUgKGV4cGVjdGVkIDwgc2h1dGRvd24ubGVuZ3RoKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAocmFuZG9tID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHJhbmRvbSA9IG5ldyBSYW5kb20oU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworICAgICAgICAgICAgICAgIGV4cGVjdGVkICs9IChyYW5kb20ubmV4dEludCgpICUgMTAyNCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAoZXhwZWN0ZWQgPiAwKSB7CisgICAgICAgICAgICAgICAgaW50IGNoID0gLTE7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgY2ggPSBzdHJlYW0ucmVhZCgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oIlN0YW5kYXJkU2VydmVyLmF3YWl0OiByZWFkOiAiLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgY2ggPSAtMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGNoIDwgMzIpICAvLyBDb250cm9sIGNoYXJhY3RlciBvciBFT0YgdGVybWluYXRlcyBsb29wCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNvbW1hbmQuYXBwZW5kKChjaGFyKSBjaCk7CisgICAgICAgICAgICAgICAgZXhwZWN0ZWQtLTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQ2xvc2UgdGhlIHNvY2tldCBub3cgdGhhdCB3ZSBhcmUgZG9uZSB3aXRoIGl0CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHNvY2tldC5jbG9zZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gTWF0Y2ggYWdhaW5zdCBvdXIgY29tbWFuZCBzdHJpbmcKKyAgICAgICAgICAgIGJvb2xlYW4gbWF0Y2ggPSBjb21tYW5kLnRvU3RyaW5nKCkuZXF1YWxzKHNodXRkb3duKTsKKyAgICAgICAgICAgIGlmIChtYXRjaCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgbG9nLndhcm4oIlN0YW5kYXJkU2VydmVyLmF3YWl0OiBJbnZhbGlkIGNvbW1hbmQgJyIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLnRvU3RyaW5nKCkgKyAiJyByZWNlaXZlZCIpOworCisgICAgICAgIH0KKworICAgICAgICAvLyBDbG9zZSB0aGUgc2VydmVyIHNvY2tldCBhbmQgcmV0dXJuCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzZXJ2ZXJTb2NrZXQuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc3BlY2lmaWVkIFNlcnZpY2UgKGlmIGl0IGV4aXN0cyk7IG90aGVyd2lzZSByZXR1cm4KKyAgICAgKiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIFNlcnZpY2UgdG8gYmUgcmV0dXJuZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgU2VydmljZSBmaW5kU2VydmljZShTdHJpbmcgbmFtZSkgeworCisgICAgICAgIGlmIChuYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIH0KKyAgICAgICAgc3luY2hyb25pemVkIChzZXJ2aWNlcykgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJ2aWNlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChuYW1lLmVxdWFscyhzZXJ2aWNlc1tpXS5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoc2VydmljZXNbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKG51bGwpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNldCBvZiBTZXJ2aWNlcyBkZWZpbmVkIHdpdGhpbiB0aGlzIFNlcnZlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2VydmljZVtdIGZpbmRTZXJ2aWNlcygpIHsKKworICAgICAgICByZXR1cm4gKHNlcnZpY2VzKTsKKworICAgIH0KKyAgICAKKyAgICAvKiogCisgICAgICogUmV0dXJuIHRoZSBKTVggc2VydmljZSBuYW1lcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0TmFtZVtdIGdldFNlcnZpY2VOYW1lcygpIHsKKyAgICAgICAgT2JqZWN0TmFtZSBvbmFtZXNbXT1uZXcgT2JqZWN0TmFtZVsgc2VydmljZXMubGVuZ3RoIF07CisgICAgICAgIGZvciggaW50IGk9MDsgaTxzZXJ2aWNlcy5sZW5ndGg7IGkrKyApIHsKKyAgICAgICAgICAgIG9uYW1lc1tpXT0oKFN0YW5kYXJkU2VydmljZSlzZXJ2aWNlc1tpXSkuZ2V0T2JqZWN0TmFtZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBvbmFtZXM7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBTZXJ2aWNlIGZyb20gdGhlIHNldCBhc3NvY2lhdGVkIGZyb20gdGhpcworICAgICAqIFNlcnZlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXJ2aWNlIFRoZSBTZXJ2aWNlIHRvIGJlIHJlbW92ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVTZXJ2aWNlKFNlcnZpY2Ugc2VydmljZSkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAoc2VydmljZXMpIHsKKyAgICAgICAgICAgIGludCBqID0gLTE7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlcnZpY2VzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKHNlcnZpY2UgPT0gc2VydmljZXNbaV0pIHsKKyAgICAgICAgICAgICAgICAgICAgaiA9IGk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChqIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBpZiAoc2VydmljZXNbal0gaW5zdGFuY2VvZiBMaWZlY3ljbGUpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAoKExpZmVjeWNsZSkgc2VydmljZXNbal0pLnN0b3AoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChMaWZlY3ljbGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IGsgPSAwOworICAgICAgICAgICAgU2VydmljZSByZXN1bHRzW10gPSBuZXcgU2VydmljZVtzZXJ2aWNlcy5sZW5ndGggLSAxXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VydmljZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoaSAhPSBqKQorICAgICAgICAgICAgICAgICAgICByZXN1bHRzW2srK10gPSBzZXJ2aWNlc1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNlcnZpY2VzID0gcmVzdWx0czsKKworICAgICAgICAgICAgLy8gUmVwb3J0IHRoaXMgcHJvcGVydHkgY2hhbmdlIHRvIGludGVyZXN0ZWQgbGlzdGVuZXJzCisgICAgICAgICAgICBzdXBwb3J0LmZpcmVQcm9wZXJ0eUNoYW5nZSgic2VydmljZSIsIHNlcnZpY2UsIG51bGwpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIgdG8gdGhpcyBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRvIGFkZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgeworCisgICAgICAgIHN1cHBvcnQuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lciBmcm9tIHRoaXMgY29tcG9uZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciB0byByZW1vdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKworICAgICAgICBzdXBwb3J0LnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBjb21wb25lbnQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCJTdGFuZGFyZFNlcnZlclsiKTsKKyAgICAgICAgc2IuYXBwZW5kKGdldFBvcnQoKSk7CisgICAgICAgIHNiLmFwcGVuZCgiXSIpOworICAgICAgICByZXR1cm4gKHNiLnRvU3RyaW5nKCkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBXcml0ZSB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhpcyBlbnRpcmUgPGNvZGU+U2VydmVyPC9jb2RlPgorICAgICAqIG91dCB0byB0aGUgc2VydmVyLnhtbCBjb25maWd1cmF0aW9uIGZpbGUuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIGphdmF4Lm1hbmFnZW1lbnQuSW5zdGFuY2VOb3RGb3VuZEV4Y2VwdGlvbiBpZiB0aGUgbWFuYWdlZCByZXNvdXJjZSBvYmplY3QKKyAgICAgKiAgY2Fubm90IGJlIGZvdW5kCisgICAgICogQGV4Y2VwdGlvbiBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuRXhjZXB0aW9uIGlmIHRoZSBpbml0aWFsaXplciBvZiB0aGUgb2JqZWN0IHRocm93cworICAgICAqICBhbiBleGNlcHRpb24sIG9yIHBlcnNpc3RlbmNlIGlzIG5vdCBzdXBwb3J0ZWQKKyAgICAgKiBAZXhjZXB0aW9uIGphdmF4Lm1hbmFnZW1lbnQuUnVudGltZU9wZXJhdGlvbnNFeGNlcHRpb24gaWYgYW4gZXhjZXB0aW9uIGlzIHJlcG9ydGVkCisgICAgICogIGJ5IHRoZSBwZXJzaXN0ZW5jZSBtZWNoYW5pc20KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc3RvcmVDb25maWcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBDYWxjdWxhdGUgZmlsZSBvYmplY3RzIGZvciB0aGUgb2xkIGFuZCBuZXcgY29uZmlndXJhdGlvbiBmaWxlcy4KKyAgICAgICAgU3RyaW5nIGNvbmZpZ0ZpbGUgPSAiY29uZi9zZXJ2ZXIueG1sIjsgLy8gRklYTUUgLSBjb25maWd1cmFibGU/CisgICAgICAgIEZpbGUgY29uZmlnT2xkID0gbmV3IEZpbGUoY29uZmlnRmlsZSk7CisgICAgICAgIGlmICghY29uZmlnT2xkLmlzQWJzb2x1dGUoKSkgeworICAgICAgICAgICAgY29uZmlnT2xkID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJjYXRhbGluYS5iYXNlIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdGaWxlKTsKKyAgICAgICAgfQorICAgICAgICBGaWxlIGNvbmZpZ05ldyA9IG5ldyBGaWxlKGNvbmZpZ0ZpbGUgKyAiLm5ldyIpOworICAgICAgICBpZiAoIWNvbmZpZ05ldy5pc0Fic29sdXRlKCkpIHsKKyAgICAgICAgICAgIGNvbmZpZ05ldyA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2F0YWxpbmEuYmFzZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnRmlsZSArICIubmV3Iik7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIHRzID0gKG5ldyBUaW1lc3RhbXAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpKS50b1N0cmluZygpOworICAgICAgICAvLyAgICAgICAgeXl5eS1tbS1kZCBoaDptbTpzcworICAgICAgICAvLyAgICAgICAgMDEyMzQ1Njc4OTAxMjM0NTY3OAorICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCIuIik7CisgICAgICAgIHNiLmFwcGVuZCh0cy5zdWJzdHJpbmcoMCwgMTApKTsKKyAgICAgICAgc2IuYXBwZW5kKCcuJyk7CisgICAgICAgIHNiLmFwcGVuZCh0cy5zdWJzdHJpbmcoMTEsIDEzKSk7CisgICAgICAgIHNiLmFwcGVuZCgnLScpOworICAgICAgICBzYi5hcHBlbmQodHMuc3Vic3RyaW5nKDE0LCAxNikpOworICAgICAgICBzYi5hcHBlbmQoJy0nKTsKKyAgICAgICAgc2IuYXBwZW5kKHRzLnN1YnN0cmluZygxNywgMTkpKTsKKyAgICAgICAgRmlsZSBjb25maWdTYXZlID0gbmV3IEZpbGUoY29uZmlnRmlsZSArIHNiLnRvU3RyaW5nKCkpOworICAgICAgICBpZiAoIWNvbmZpZ1NhdmUuaXNBYnNvbHV0ZSgpKSB7CisgICAgICAgICAgICBjb25maWdTYXZlID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJjYXRhbGluYS5iYXNlIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnRmlsZSArIHNiLnRvU3RyaW5nKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gT3BlbiBhbiBvdXRwdXQgd3JpdGVyIGZvciB0aGUgbmV3IGNvbmZpZ3VyYXRpb24gZmlsZQorICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgd3JpdGVyID0gbmV3IFByaW50V3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIobmV3IEZpbGVPdXRwdXRTdHJlYW0oY29uZmlnTmV3KSwgIlVURjgiKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGlmICh3cml0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyAoZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBTdG9yZSB0aGUgc3RhdGUgb2YgdGhpcyBTZXJ2ZXIgTUJlYW4KKyAgICAgICAgLy8gKHdoaWNoIHdpbGwgcmVjdXJzaXZlbHkgc3RvcmUgZXZlcnl0aGluZworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3RvcmVTZXJ2ZXIod3JpdGVyLCAwLCB0aGlzKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGlmICh3cml0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyAoZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBGbHVzaCBhbmQgY2xvc2UgdGhlIG91dHB1dCBmaWxlCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB3cml0ZXIuZmx1c2goKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IChlKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgd3JpdGVyLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyAoZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBTaHVmZmxlIG9sZC0+c2F2ZSBhbmQgbmV3LT5vbGQKKyAgICAgICAgaWYgKGNvbmZpZ09sZC5yZW5hbWVUbyhjb25maWdTYXZlKSkgeworICAgICAgICAgICAgaWYgKGNvbmZpZ05ldy5yZW5hbWVUbyhjb25maWdPbGQpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjb25maWdTYXZlLnJlbmFtZVRvKGNvbmZpZ09sZCk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJDYW5ub3QgcmVuYW1lICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdOZXcuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiIHRvICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdPbGQuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJDYW5ub3QgcmVuYW1lICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ09sZC5nZXRBYnNvbHV0ZVBhdGgoKSArICIgdG8gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnU2F2ZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogV3JpdGUgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIDxjb2RlPkNvbnRleHQ8L2NvZGU+CisgICAgICogb3V0IHRvIHRoZSBzcGVjaWZpZWQgY29uZmlndXJhdGlvbiBmaWxlLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBqYXZheC5tYW5hZ2VtZW50Lkluc3RhbmNlTm90Rm91bmRFeGNlcHRpb24gaWYgdGhlIG1hbmFnZWQgcmVzb3VyY2Ugb2JqZWN0CisgICAgICogIGNhbm5vdCBiZSBmb3VuZAorICAgICAqIEBleGNlcHRpb24gamF2YXgubWFuYWdlbWVudC5NQmVhbkV4Y2VwdGlvbiBpZiB0aGUgaW5pdGlhbGl6ZXIgb2YgdGhlIG9iamVjdCB0aHJvd3MKKyAgICAgKiAgYW4gZXhjZXB0aW9uLCBvciBwZXJzaXN0ZW5jZSBpcyBub3Qgc3VwcG9ydGVkCisgICAgICogQGV4Y2VwdGlvbiBqYXZheC5tYW5hZ2VtZW50LlJ1bnRpbWVPcGVyYXRpb25zRXhjZXB0aW9uIGlmIGFuIGV4Y2VwdGlvbiBpcyByZXBvcnRlZAorICAgICAqICBieSB0aGUgcGVyc2lzdGVuY2UgbWVjaGFuaXNtCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHN0b3JlQ29udGV4dChDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIFN0cmluZyBjb25maWdGaWxlID0gY29udGV4dC5nZXRDb25maWdGaWxlKCk7CisKKyAgICAgICAgaWYgKGNvbmZpZ0ZpbGUgIT0gbnVsbCkgeworICAgICAgICAgICAgRmlsZSBjb25maWcgPSBuZXcgRmlsZShjb25maWdGaWxlKTsKKyAgICAgICAgICAgIGlmICghY29uZmlnLmlzQWJzb2x1dGUoKSkgeworICAgICAgICAgICAgICAgIGNvbmZpZyA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2F0YWxpbmEuYmFzZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ0ZpbGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBPcGVuIGFuIG91dHB1dCB3cml0ZXIgZm9yIHRoZSBuZXcgY29uZmlndXJhdGlvbiBmaWxlCisgICAgICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcihuZXcgRmlsZU91dHB1dFN0cmVhbShjb25maWcpLCAiVVRGOCIpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBpZiAod3JpdGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRocm93IChlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIjw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J3V0Zi04Jz8+Iik7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoIjxDb250ZXh0Iik7CisgICAgICAgICAgICBzdG9yZUF0dHJpYnV0ZXMod3JpdGVyLCBjb250ZXh0KTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCI+Iik7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiPC9Db250ZXh0PiIpOworCisgICAgICAgICAgICAvLyBGbHVzaCBhbmQgY2xvc2UgdGhlIG91dHB1dCBmaWxlCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHdyaXRlci5mbHVzaCgpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyAoZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHdyaXRlci5jbG9zZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyAoZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJpdmF0ZSBNZXRob2RzCisKKworICAgIC8qKiBHaXZlbiBhIHN0cmluZywgdGhpcyBtZXRob2QgcmVwbGFjZXMgYWxsIG9jY3VycmVuY2VzIG9mCisgICAgICogICc8JywgJz4nLCAnJicsIGFuZCAnIicuCisgICAgKi8KKworICAgIHByaXZhdGUgU3RyaW5nIGNvbnZlcnRTdHIoU3RyaW5nIGlucHV0KSB7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIGZpbHRlcmVkID0gbmV3IFN0cmluZ0J1ZmZlcihpbnB1dC5sZW5ndGgoKSk7CisgICAgICAgIGNoYXIgYzsKKyAgICAgICAgZm9yKGludCBpPTA7IGk8aW5wdXQubGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgYyA9IGlucHV0LmNoYXJBdChpKTsKKyAgICAgICAgICAgIGlmIChjID09ICc8JykgeworICAgICAgICAgICAgICAgIGZpbHRlcmVkLmFwcGVuZCgiJmx0OyIpOworICAgICAgICAgICAgfSBlbHNlIGlmIChjID09ICc+JykgeworICAgICAgICAgICAgICAgIGZpbHRlcmVkLmFwcGVuZCgiJmd0OyIpOworICAgICAgICAgICAgfSBlbHNlIGlmIChjID09ICdcJycpIHsKKyAgICAgICAgICAgICAgICBmaWx0ZXJlZC5hcHBlbmQoIiZhcG9zOyIpOworICAgICAgICAgICAgfSBlbHNlIGlmIChjID09ICciJykgeworICAgICAgICAgICAgICAgIGZpbHRlcmVkLmFwcGVuZCgiJnF1b3Q7Iik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPT0gJyYnKSB7CisgICAgICAgICAgICAgICAgZmlsdGVyZWQuYXBwZW5kKCImYW1wOyIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmaWx0ZXJlZC5hcHBlbmQoYyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybihmaWx0ZXJlZC50b1N0cmluZygpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIElzIHRoaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGRlZmF1bHQgPGNvZGU+TG9hZGVyPC9jb2RlPiBjb25maWd1cmF0aW9uLAorICAgICAqIHdpdGggYWxsLWRlZmF1bHQgcHJvcGVydGllcz8KKyAgICAgKgorICAgICAqIEBwYXJhbSBsb2FkZXIgTG9hZGVyIHRvIGJlIHRlc3RlZAorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBpc0RlZmF1bHRMb2FkZXIoTG9hZGVyIGxvYWRlcikgeworCisgICAgICAgIGlmICghKGxvYWRlciBpbnN0YW5jZW9mIFdlYmFwcExvYWRlcikpIHsKKyAgICAgICAgICAgIHJldHVybiAoZmFsc2UpOworICAgICAgICB9CisgICAgICAgIFdlYmFwcExvYWRlciB3bG9hZGVyID0gKFdlYmFwcExvYWRlcikgbG9hZGVyOworICAgICAgICBpZiAoKHdsb2FkZXIuZ2V0RGVsZWdhdGUoKSAhPSBmYWxzZSkgfHwKKyAgICAgICAgICAgICF3bG9hZGVyLmdldExvYWRlckNsYXNzKCkuZXF1YWxzCisgICAgICAgICAgICAgKCJvcmcuYXBhY2hlLmNhdGFsaW5hLmxvYWRlci5XZWJhcHBDbGFzc0xvYWRlciIpKSB7CisgICAgICAgICAgICByZXR1cm4gKGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKHRydWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBJcyB0aGlzIGFuIGluc3RhbmNlIG9mIHRoZSBkZWZhdWx0IDxjb2RlPk1hbmFnZXI8L2NvZGU+IGNvbmZpZ3VyYXRpb24sCisgICAgICogd2l0aCBhbGwtZGVmYXVsdCBwcm9wZXJ0aWVzPworICAgICAqCisgICAgICogQHBhcmFtIG1hbmFnZXIgTWFuYWdlciB0byBiZSB0ZXN0ZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaXNEZWZhdWx0TWFuYWdlcihNYW5hZ2VyIG1hbmFnZXIpIHsKKworICAgICAgICBpZiAoIShtYW5hZ2VyIGluc3RhbmNlb2YgU3RhbmRhcmRNYW5hZ2VyKSkgeworICAgICAgICAgICAgcmV0dXJuIChmYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgU3RhbmRhcmRNYW5hZ2VyIHNtYW5hZ2VyID0gKFN0YW5kYXJkTWFuYWdlcikgbWFuYWdlcjsKKyAgICAgICAgaWYgKCFzbWFuYWdlci5nZXRQYXRobmFtZSgpLmVxdWFscygiU0VTU0lPTlMuc2VyIikgfHwKKyAgICAgICAgICAgICFzbWFuYWdlci5nZXRSYW5kb21DbGFzcygpLmVxdWFscygiamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb20iKSB8fAorICAgICAgICAgICAgKHNtYW5hZ2VyLmdldE1heEFjdGl2ZVNlc3Npb25zKCkgIT0gLTEpIHx8CisgICAgICAgICAgICAhc21hbmFnZXIuZ2V0QWxnb3JpdGhtKCkuZXF1YWxzKCJNRDUiKSkgeworICAgICAgICAgICAgcmV0dXJuIChmYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICh0cnVlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogSXMgdGhlIHNwZWNpZmllZCBjbGFzcyBuYW1lICsgcHJvcGVydHkgbmFtZSBjb21iaW5hdGlvbiBhbgorICAgICAqIGV4Y2VwdGlvbiB0aGF0IHNob3VsZCBub3QgYmUgcGVyc2lzdGVkPworICAgICAqCisgICAgICogQHBhcmFtIGNsYXNzTmFtZSBUaGUgY2xhc3MgbmFtZSB0byBjaGVjaworICAgICAqIEBwYXJhbSBwcm9wZXJ0eSBUaGUgcHJvcGVydHkgbmFtZSB0byBjaGVjaworICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBpc0V4Y2VwdGlvbihTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgcHJvcGVydHkpIHsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4Y2VwdGlvbnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChjbGFzc05hbWUuZXF1YWxzKGV4Y2VwdGlvbnNbaV1bMF0pICYmCisgICAgICAgICAgICAgICAgcHJvcGVydHkuZXF1YWxzKGV4Y2VwdGlvbnNbaV1bMV0pKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICh0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKGZhbHNlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogSXMgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eSB0eXBlIG9uZSBmb3Igd2hpY2ggd2Ugc2hvdWxkIGdlbmVyYXRlCisgICAgICogYSBwZXJzaXN0ZW5jZSBhdHRyaWJ1dGU/CisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xhenogSmF2YSBjbGFzcyB0byBiZSB0ZXN0ZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaXNQZXJzaXN0YWJsZShDbGFzcyBjbGF6eikgeworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGVyc2lzdGFibGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAocGVyc2lzdGFibGVzW2ldID09IGNsYXp6KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICh0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKGZhbHNlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogSXMgdGhlIHNwZWNpZmllZCBjbGFzcyBuYW1lIG9uZSB0aGF0IHNob3VsZCBiZSBza2lwcGVkIGJlY2F1c2UKKyAgICAgKiB0aGUgY29ycmVzcG9uZGluZyBjb21wb25lbnQgaXMgY29uZmlndXJlZCBhdXRvbWF0aWNhbGx5IGF0CisgICAgICogc3RhcnR1cCB0aW1lPworICAgICAqCisgICAgICogQHBhcmFtIGNsYXNzTmFtZSBDbGFzcyBuYW1lIHRvIGJlIHRlc3RlZAorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBpc1NraXBwYWJsZShTdHJpbmcgY2xhc3NOYW1lKSB7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBza2lwcGFibGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoc2tpcHBhYmxlc1tpXS5lcXVhbHMoY2xhc3NOYW1lKSkgeworICAgICAgICAgICAgICAgIHJldHVybiAodHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChmYWxzZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFN0b3JlIHRoZSByZWxldmFudCBhdHRyaWJ1dGVzIG9mIHRoZSBzcGVjaWZpZWQgSmF2YUJlYW4sIHBsdXMgYQorICAgICAqIDxjb2RlPmNsYXNzTmFtZTwvY29kZT4gYXR0cmlidXRlIGRlZmluaW5nIHRoZSBmdWxseSBxdWFsaWZpZWQKKyAgICAgKiBKYXZhIGNsYXNzIG5hbWUgb2YgdGhlIGJlYW4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gd3JpdGVyIFByaW50V3JpdGVyIHRvIHdoaWNoIHdlIGFyZSBzdG9yaW5nCisgICAgICogQHBhcmFtIGJlYW4gQmVhbiB3aG9zZSBwcm9wZXJ0aWVzIGFyZSB0byBiZSByZW5kZXJlZCBhcyBhdHRyaWJ1dGVzLAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW4gZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBzdG9yaW5nCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHN0b3JlQXR0cmlidXRlcyhQcmludFdyaXRlciB3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgYmVhbikgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgc3RvcmVBdHRyaWJ1dGVzKHdyaXRlciwgdHJ1ZSwgYmVhbik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFN0b3JlIHRoZSByZWxldmFudCBhdHRyaWJ1dGVzIG9mIHRoZSBzcGVjaWZpZWQgSmF2YUJlYW4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gd3JpdGVyIFByaW50V3JpdGVyIHRvIHdoaWNoIHdlIGFyZSBzdG9yaW5nCisgICAgICogQHBhcmFtIGluY2x1ZGUgU2hvdWxkIHdlIGluY2x1ZGUgYSA8Y29kZT5jbGFzc05hbWU8L2NvZGU+IGF0dHJpYnV0ZT8KKyAgICAgKiBAcGFyYW0gYmVhbiBCZWFuIHdob3NlIHByb3BlcnRpZXMgYXJlIHRvIGJlIHJlbmRlcmVkIGFzIGF0dHJpYnV0ZXMsCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBleGNlcHRpb24gb2NjdXJzIHdoaWxlIHN0b3JpbmcKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc3RvcmVBdHRyaWJ1dGVzKFByaW50V3JpdGVyIHdyaXRlciwgYm9vbGVhbiBpbmNsdWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGJlYW4pIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIC8vIEZJWE1FOiBBZGQgc3VwcG9ydCBmb3Igc3RvcmluZyBhbGwgYXR0cmlidXRlcworICAgICAgICAKKyAgICAgICAgLy8gUmVuZGVyIHRoZSByZWxldmFudCBwcm9wZXJ0aWVzIG9mIHRoaXMgYmVhbgorICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gYmVhbi5nZXRDbGFzcygpLmdldE5hbWUoKTsKKyAgICAgICAgLy8gUmVuZGVyIGEgY2xhc3NOYW1lIGF0dHJpYnV0ZSBpZiByZXF1ZXN0ZWQKKyAgICAgICAgaWYgKGluY2x1ZGUpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RhbmRhcmRJbXBsZW1lbnRhdGlvbnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xhc3NOYW1lLmVxdWFscyhzdGFuZGFyZEltcGxlbWVudGF0aW9uc1tpXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5jbHVkZSA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpbmNsdWRlKSB7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KCIgY2xhc3NOYW1lPVwiIik7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KGJlYW4uZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludCgiXCIiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEFjcXVpcmUgdGhlIGxpc3Qgb2YgcHJvcGVydGllcyBmb3IgdGhpcyBiZWFuCisgICAgICAgIFByb3BlcnR5RGVzY3JpcHRvciBkZXNjcmlwdG9yc1tdID0KKyAgICAgICAgICAgIEludHJvc3BlY3Rvci5nZXRCZWFuSW5mbyhiZWFuLmdldENsYXNzKCkpLmdldFByb3BlcnR5RGVzY3JpcHRvcnMoKTsKKyAgICAgICAgaWYgKGRlc2NyaXB0b3JzID09IG51bGwpIHsKKyAgICAgICAgICAgIGRlc2NyaXB0b3JzID0gbmV3IFByb3BlcnR5RGVzY3JpcHRvclswXTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENyZWF0ZSBibGFuayBpbnN0YW5jZQorICAgICAgICBPYmplY3QgYmVhbjIgPSBiZWFuLmdldENsYXNzKCkubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3JzW2ldIGluc3RhbmNlb2YgSW5kZXhlZFByb3BlcnR5RGVzY3JpcHRvcikgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBJbmRleGVkIHByb3BlcnRpZXMgYXJlIG5vdCBwZXJzaXN0ZWQKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghaXNQZXJzaXN0YWJsZShkZXNjcmlwdG9yc1tpXS5nZXRQcm9wZXJ0eVR5cGUoKSkgfHwKKyAgICAgICAgICAgICAgICAoZGVzY3JpcHRvcnNbaV0uZ2V0UmVhZE1ldGhvZCgpID09IG51bGwpIHx8CisgICAgICAgICAgICAgICAgKGRlc2NyaXB0b3JzW2ldLmdldFdyaXRlTWV0aG9kKCkgPT0gbnVsbCkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gTXVzdCBiZSBhIHJlYWQtd3JpdGUgcHJpbWl0aXZlIG9yIFN0cmluZworICAgICAgICAgICAgfQorICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0KKyAgICAgICAgICAgICAgICBJbnRyb3NwZWN0aW9uVXRpbHMuZ2V0UHJvcGVydHkoYmVhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JzW2ldLmdldE5hbWUoKSk7CisgICAgICAgICAgICBPYmplY3QgdmFsdWUyID0KKyAgICAgICAgICAgICAgICBJbnRyb3NwZWN0aW9uVXRpbHMuZ2V0UHJvcGVydHkoYmVhbjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yc1tpXS5nZXROYW1lKCkpOworICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gTnVsbCB2YWx1ZXMgYXJlIG5vdCBwZXJzaXN0ZWQKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpc0V4Y2VwdGlvbihjbGFzc05hbWUsIGRlc2NyaXB0b3JzW2ldLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gU2tpcCB0aGUgc3BlY2lmaWVkIGV4Y2VwdGlvbnMKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh2YWx1ZS5lcXVhbHModmFsdWUyKSkgeworICAgICAgICAgICAgICAgIC8vIFRoZSBwcm9wZXJ0eSBoYXMgaXRzIGRlZmF1bHQgdmFsdWUKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSkgeworICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdyaXRlci5wcmludCgnICcpOworICAgICAgICAgICAgd3JpdGVyLnByaW50KGRlc2NyaXB0b3JzW2ldLmdldE5hbWUoKSk7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoIj1cIiIpOworICAgICAgICAgICAgU3RyaW5nIHN0clZhbHVlID0gY29udmVydFN0cigoU3RyaW5nKSB2YWx1ZSk7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoc3RyVmFsdWUpOworICAgICAgICAgICAgd3JpdGVyLnByaW50KCJcIiIpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFN0b3JlIHRoZSBzcGVjaWZpZWQgQ29ubmVjdG9yIHByb3BlcnRpZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gd3JpdGVyIFByaW50V3JpdGVyIHRvIHdoaWNoIHdlIGFyZSBzdG9yaW5nCisgICAgICogQHBhcmFtIGluZGVudCBOdW1iZXIgb2Ygc3BhY2VzIHRvIGluZGVudCB0aGlzIGVsZW1lbnQKKyAgICAgKiBAcGFyYW0gY29ubmVjdG9yIE9iamVjdCB3aG9zZSBwcm9wZXJ0aWVzIGFyZSBiZWluZyBzdG9yZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgc3RvcmluZworICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzdG9yZUNvbm5lY3RvcihQcmludFdyaXRlciB3cml0ZXIsIGludCBpbmRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3RvciBjb25uZWN0b3IpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIC8vIFN0b3JlIHRoZSBiZWdpbm5pbmcgb2YgdGhpcyBlbGVtZW50CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5kZW50OyBpKyspIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgnICcpOworICAgICAgICB9CisgICAgICAgIHdyaXRlci5wcmludCgiPENvbm5lY3RvciIpOworICAgICAgICBzdG9yZUF0dHJpYnV0ZXMod3JpdGVyLCBjb25uZWN0b3IpOworICAgIAorICAgICAgICBpZiAoY29ubmVjdG9yIGluc3RhbmNlb2YgQ29ubmVjdG9yKSB7CisgICAgICAgICAgICBQcm90b2NvbEhhbmRsZXIgcHJvdG9jb2xIYW5kbGVyID0gCisgICAgICAgICAgICAgICAgKChDb25uZWN0b3IpY29ubmVjdG9yKS5nZXRQcm90b2NvbEhhbmRsZXIoKTsKKyAgICAgICAgICAgIHN0b3JlQXR0cmlidXRlcyh3cml0ZXIsIHByb3RvY29sSGFuZGxlcik7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHdyaXRlci5wcmludGxuKCI+Iik7CisKKyAgICAgICAgLy8gU3RvcmUgbmVzdGVkIDxMaXN0ZW5lcj4gZWxlbWVudHMKKyAgICAgICAgaWYgKGNvbm5lY3RvciBpbnN0YW5jZW9mIExpZmVjeWNsZSkgeworICAgICAgICAgICAgTGlmZWN5Y2xlTGlzdGVuZXIgbGlzdGVuZXJzW10gPQorICAgICAgICAgICAgICAgICgoTGlmZWN5Y2xlKSBjb25uZWN0b3IpLmZpbmRMaWZlY3ljbGVMaXN0ZW5lcnMoKTsKKyAgICAgICAgICAgIGlmIChsaXN0ZW5lcnMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGxpc3RlbmVycyA9IG5ldyBMaWZlY3ljbGVMaXN0ZW5lclswXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGxpc3RlbmVyc1tpXS5nZXRDbGFzcygpLmdldE5hbWUoKS5lcXVhbHMKKyAgICAgICAgICAgICAgICAgICAgKFNFUlZFUl9MSVNURU5FUl9DTEFTU19OQU1FKSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RvcmVMaXN0ZW5lcih3cml0ZXIsIGluZGVudCArIDIsIGxpc3RlbmVyc1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBTdG9yZSB0aGUgZW5kaW5nIG9mIHRoaXMgZWxlbWVudAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGluZGVudDsgaSsrKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoJyAnKTsKKyAgICAgICAgfQorICAgICAgICB3cml0ZXIucHJpbnRsbigiPC9Db25uZWN0b3I+Iik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFN0b3JlIHRoZSBzcGVjaWZpZWQgQ29udGV4dCBwcm9wZXJ0aWVzLgorICAgICAqCisgICAgICogQHBhcmFtIHdyaXRlciBQcmludFdyaXRlciB0byB3aGljaCB3ZSBhcmUgc3RvcmluZworICAgICAqIEBwYXJhbSBpbmRlbnQgTnVtYmVyIG9mIHNwYWNlcyB0byBpbmRlbnQgdGhpcyBlbGVtZW50CisgICAgICogQHBhcmFtIGNvbnRleHQgIE9iamVjdCB3aG9zZSBwcm9wZXJ0aWVzIGFyZSBiZWluZyBzdG9yZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgc3RvcmluZworICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzdG9yZUNvbnRleHQoUHJpbnRXcml0ZXIgd3JpdGVyLCBpbnQgaW5kZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBTdHJpbmcgY29uZmlnRmlsZSA9IGNvbnRleHQuZ2V0Q29uZmlnRmlsZSgpOworCisgICAgICAgIGlmIChjb25maWdGaWxlICE9IG51bGwpIHsKKworICAgICAgICAgICAgRmlsZSBjb25maWcgPSBuZXcgRmlsZShjb25maWdGaWxlKTsKKyAgICAgICAgICAgIGlmICghY29uZmlnLmlzQWJzb2x1dGUoKSkgeworICAgICAgICAgICAgICAgIGNvbmZpZyA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2F0YWxpbmEuYmFzZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ0ZpbGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBPcGVuIGFuIG91dHB1dCB3cml0ZXIgZm9yIHRoZSBuZXcgY29uZmlndXJhdGlvbiBmaWxlCisgICAgICAgICAgICB3cml0ZXIgPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBGaWxlIHBhcmVudCA9IGNvbmZpZy5nZXRQYXJlbnRGaWxlKCk7CisgICAgICAgICAgICAgICAgaWYgKChwYXJlbnQgIT0gbnVsbCkgJiYgKCFwYXJlbnQuZXhpc3RzKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIHBhcmVudC5ta2RpcnMoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd3JpdGVyID0gbmV3IFByaW50V3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIobmV3IEZpbGVPdXRwdXRTdHJlYW0oY29uZmlnKSwgIlVURjgiKSk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGlmICh3cml0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGhyb3cgKGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0ndXRmLTgnPz4iKTsKKyAgICAgICAgICAgIGluZGVudCA9IDA7CisKKyAgICAgICAgfQorCisgICAgICAgIC8vIFN0b3JlIHRoZSBiZWdpbm5pbmcgb2YgdGhpcyBlbGVtZW50CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5kZW50OyBpKyspIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgnICcpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICB3cml0ZXIucHJpbnQoIjxDb250ZXh0Iik7CisgICAgICAgIHN0b3JlQXR0cmlidXRlcyh3cml0ZXIsIGNvbnRleHQpOworICAgICAgICB3cml0ZXIucHJpbnRsbigiPiIpOworCisgICAgICAgIC8vIFN0b3JlIG5lc3RlZCA8SW5zdGFuY2VMaXN0ZW5lcj4gZWxlbWVudHMKKyAgICAgICAgU3RyaW5nIGlMaXN0ZW5lcnNbXSA9IGNvbnRleHQuZmluZEluc3RhbmNlTGlzdGVuZXJzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaUxpc3RlbmVycy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBpbmRlbnQ7IGorKykgeworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludCgnICcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd3JpdGVyLnByaW50KCI8SW5zdGFuY2VMaXN0ZW5lcj4iKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludChpTGlzdGVuZXJzW2ldKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCI8L0luc3RhbmNlTGlzdGVuZXI+Iik7CisgICAgICAgIH0KKworICAgICAgICAvLyBTdG9yZSBuZXN0ZWQgPExpc3RlbmVyPiBlbGVtZW50cworICAgICAgICBpZiAoY29udGV4dCBpbnN0YW5jZW9mIExpZmVjeWNsZSkgeworICAgICAgICAgICAgTGlmZWN5Y2xlTGlzdGVuZXIgbGlzdGVuZXJzW10gPQorICAgICAgICAgICAgICAgICgoTGlmZWN5Y2xlKSBjb250ZXh0KS5maW5kTGlmZWN5Y2xlTGlzdGVuZXJzKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChsaXN0ZW5lcnNbaV0uZ2V0Q2xhc3MoKS5nZXROYW1lKCkuZXF1YWxzCisgICAgICAgICAgICAgICAgICAgIChTRVJWRVJfTElTVEVORVJfQ0xBU1NfTkFNRSkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0b3JlTGlzdGVuZXIod3JpdGVyLCBpbmRlbnQgKyAyLCBsaXN0ZW5lcnNbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gU3RvcmUgbmVzdGVkIDxMb2FkZXI+IGVsZW1lbnQKKyAgICAgICAgTG9hZGVyIGxvYWRlciA9IGNvbnRleHQuZ2V0TG9hZGVyKCk7CisgICAgICAgIGlmIChsb2FkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgc3RvcmVMb2FkZXIod3JpdGVyLCBpbmRlbnQgKyAyLCBsb2FkZXIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gU3RvcmUgbmVzdGVkIDxNYW5hZ2VyPiBlbGVtZW50CisgICAgICAgIE1hbmFnZXIgbWFuYWdlciA9IGNvbnRleHQuZ2V0TWFuYWdlcigpOworICAgICAgICBpZiAobWFuYWdlciAhPSBudWxsKSB7CisgICAgICAgICAgICBzdG9yZU1hbmFnZXIod3JpdGVyLCBpbmRlbnQgKyAyLCBtYW5hZ2VyKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFN0b3JlIG5lc3RlZCA8UGFyYW1ldGVyPiBlbGVtZW50cworICAgICAgICBBcHBsaWNhdGlvblBhcmFtZXRlcltdIGFwcFBhcmFtcyA9IGNvbnRleHQuZmluZEFwcGxpY2F0aW9uUGFyYW1ldGVycygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFwcFBhcmFtcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBpbmRlbnQgKyAyOyBqKyspIHsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQoJyAnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiPFBhcmFtZXRlciIpOworICAgICAgICAgICAgc3RvcmVBdHRyaWJ1dGVzKHdyaXRlciwgZmFsc2UsIGFwcFBhcmFtc1tpXSk7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiLz4iKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFN0b3JlIG5lc3RlZCA8UmVhbG0+IGVsZW1lbnQKKyAgICAgICAgUmVhbG0gcmVhbG0gPSBjb250ZXh0LmdldFJlYWxtKCk7CisgICAgICAgIGlmIChyZWFsbSAhPSBudWxsKSB7CisgICAgICAgICAgICBSZWFsbSBwYXJlbnRSZWFsbSA9IG51bGw7CisgICAgICAgICAgICBpZiAoY29udGV4dC5nZXRQYXJlbnQoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcGFyZW50UmVhbG0gPSBjb250ZXh0LmdldFBhcmVudCgpLmdldFJlYWxtKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocmVhbG0gIT0gcGFyZW50UmVhbG0pIHsKKyAgICAgICAgICAgICAgICBzdG9yZVJlYWxtKHdyaXRlciwgaW5kZW50ICsgMiwgcmVhbG0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gU3RvcmUgbmVzdGVkIDxSZXNvdXJjZXM+IGVsZW1lbnQKKyAgICAgICAgRGlyQ29udGV4dCByZXNvdXJjZXMgPSBjb250ZXh0LmdldFJlc291cmNlcygpOworICAgICAgICBpZiAocmVzb3VyY2VzICE9IG51bGwpIHsKKyAgICAgICAgICAgIHN0b3JlUmVzb3VyY2VzKHdyaXRlciwgaW5kZW50ICsgMiwgcmVzb3VyY2VzKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFN0b3JlIG5lc3RlZCA8VmFsdmU+IGVsZW1lbnRzCisgICAgICAgIGlmIChjb250ZXh0IGluc3RhbmNlb2YgUGlwZWxpbmUpIHsKKyAgICAgICAgICAgIFZhbHZlIHZhbHZlc1tdID0gKChQaXBlbGluZSkgY29udGV4dCkuZ2V0VmFsdmVzKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHZlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIHN0b3JlVmFsdmUod3JpdGVyLCBpbmRlbnQgKyAyLCB2YWx2ZXNbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gU3RvcmUgbmVzdGVkIDxXcmFwcGVyTGlmZWN5Y2xlPiBlbGVtZW50cworICAgICAgICBTdHJpbmcgd0xpZmVjeWNsZXNbXSA9IGNvbnRleHQuZmluZFdyYXBwZXJMaWZlY3ljbGVzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd0xpZmVjeWNsZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgaW5kZW50OyBqKyspIHsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQoJyAnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiPFdyYXBwZXJMaWZlY3ljbGU+Iik7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQod0xpZmVjeWNsZXNbaV0pOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIjwvV3JhcHBlckxpZmVjeWNsZT4iKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFN0b3JlIG5lc3RlZCA8V3JhcHBlckxpc3RlbmVyPiBlbGVtZW50cworICAgICAgICBTdHJpbmcgd0xpc3RlbmVyc1tdID0gY29udGV4dC5maW5kV3JhcHBlckxpc3RlbmVycygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHdMaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgaW5kZW50OyBqKyspIHsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQoJyAnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiPFdyYXBwZXJMaXN0ZW5lcj4iKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludCh3TGlzdGVuZXJzW2ldKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCI8L1dyYXBwZXJMaXN0ZW5lcj4iKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFN0b3JlIG5lc3RlZCBuYW1pbmcgcmVzb3VyY2VzIGVsZW1lbnRzCisgICAgICAgIE5hbWluZ1Jlc291cmNlcyBucmVzb3VyY2VzID0gY29udGV4dC5nZXROYW1pbmdSZXNvdXJjZXMoKTsKKyAgICAgICAgaWYgKG5yZXNvdXJjZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgc3RvcmVOYW1pbmdSZXNvdXJjZXMod3JpdGVyLCBpbmRlbnQgKyAyLCBucmVzb3VyY2VzKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFN0b3JlIHRoZSBlbmRpbmcgb2YgdGhpcyBlbGVtZW50CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5kZW50OyBpKyspIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgnICcpOworICAgICAgICB9CisgICAgICAgIHdyaXRlci5wcmludGxuKCI8L0NvbnRleHQ+Iik7CisKKyAgICAgICAgaWYgKGNvbmZpZ0ZpbGUgIT0gbnVsbCkgeworCisgICAgICAgICAgICAgLy8gRmx1c2ggYW5kIGNsb3NlIHRoZSBvdXRwdXQgZmlsZQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgd3JpdGVyLmZsdXNoKCk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICB0aHJvdyAoZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICB3cml0ZXIuY2xvc2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgIHRocm93IChlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTdG9yZSB0aGUgc3BlY2lmaWVkIEVuZ2luZSBwcm9wZXJ0aWVzLgorICAgICAqCisgICAgICogQHBhcmFtIHdyaXRlciBQcmludFdyaXRlciB0byB3aGljaCB3ZSBhcmUgc3RvcmluZworICAgICAqIEBwYXJhbSBpbmRlbnQgTnVtYmVyIG9mIHNwYWNlcyB0byBpbmRlbnQgdGhpcyBlbGVtZW50CisgICAgICogQHBhcmFtIGVuZ2luZSAgT2JqZWN0IHdob3NlIHByb3BlcnRpZXMgYXJlIGJlaW5nIHN0b3JlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW4gZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBzdG9yaW5nCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHN0b3JlRW5naW5lKFByaW50V3JpdGVyIHdyaXRlciwgaW50IGluZGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5naW5lIGVuZ2luZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gU3RvcmUgdGhlIGJlZ2lubmluZyBvZiB0aGlzIGVsZW1lbnQKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRlbnQ7IGkrKykgeworICAgICAgICAgICAgd3JpdGVyLnByaW50KCcgJyk7CisgICAgICAgIH0KKyAgICAgICAgd3JpdGVyLnByaW50KCI8RW5naW5lIik7CisgICAgICAgIHN0b3JlQXR0cmlidXRlcyh3cml0ZXIsIGVuZ2luZSk7CisgICAgICAgIHdyaXRlci5wcmludGxuKCI+Iik7CisKKyAgICAgICAgLy8gU3RvcmUgbmVzdGVkIDxIb3N0PiBlbGVtZW50cyAob3Igb3RoZXIgcmVsZXZhbnQgY29udGFpbmVycykKKyAgICAgICAgQ29udGFpbmVyIGNoaWxkcmVuW10gPSBlbmdpbmUuZmluZENoaWxkcmVuKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChjaGlsZHJlbltpXSBpbnN0YW5jZW9mIENvbnRleHQpIHsKKyAgICAgICAgICAgICAgICBzdG9yZUNvbnRleHQod3JpdGVyLCBpbmRlbnQgKyAyLCAoQ29udGV4dCkgY2hpbGRyZW5baV0pOworICAgICAgICAgICAgfSBlbHNlIGlmIChjaGlsZHJlbltpXSBpbnN0YW5jZW9mIEVuZ2luZSkgeworICAgICAgICAgICAgICAgIHN0b3JlRW5naW5lKHdyaXRlciwgaW5kZW50ICsgMiwgKEVuZ2luZSkgY2hpbGRyZW5baV0pOworICAgICAgICAgICAgfSBlbHNlIGlmIChjaGlsZHJlbltpXSBpbnN0YW5jZW9mIEhvc3QpIHsKKyAgICAgICAgICAgICAgICBzdG9yZUhvc3Qod3JpdGVyLCBpbmRlbnQgKyAyLCAoSG9zdCkgY2hpbGRyZW5baV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gU3RvcmUgbmVzdGVkIDxMaXN0ZW5lcj4gZWxlbWVudHMKKyAgICAgICAgaWYgKGVuZ2luZSBpbnN0YW5jZW9mIExpZmVjeWNsZSkgeworICAgICAgICAgICAgTGlmZWN5Y2xlTGlzdGVuZXIgbGlzdGVuZXJzW10gPQorICAgICAgICAgICAgICAgICgoTGlmZWN5Y2xlKSBlbmdpbmUpLmZpbmRMaWZlY3ljbGVMaXN0ZW5lcnMoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGxpc3RlbmVyc1tpXS5nZXRDbGFzcygpLmdldE5hbWUoKS5lcXVhbHMKKyAgICAgICAgICAgICAgICAgICAgKFNFUlZFUl9MSVNURU5FUl9DTEFTU19OQU1FKSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RvcmVMaXN0ZW5lcih3cml0ZXIsIGluZGVudCArIDIsIGxpc3RlbmVyc1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBTdG9yZSBuZXN0ZWQgPFJlYWxtPiBlbGVtZW50CisgICAgICAgIFJlYWxtIHJlYWxtID0gZW5naW5lLmdldFJlYWxtKCk7CisgICAgICAgIGlmIChyZWFsbSAhPSBudWxsKSB7CisgICAgICAgICAgICBSZWFsbSBwYXJlbnRSZWFsbSA9IG51bGw7CisgICAgICAgICAgICBpZiAoZW5naW5lLmdldFBhcmVudCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBwYXJlbnRSZWFsbSA9IGVuZ2luZS5nZXRQYXJlbnQoKS5nZXRSZWFsbSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJlYWxtICE9IHBhcmVudFJlYWxtKSB7CisgICAgICAgICAgICAgICAgc3RvcmVSZWFsbSh3cml0ZXIsIGluZGVudCArIDIsIHJlYWxtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFN0b3JlIG5lc3RlZCA8VmFsdmU+IGVsZW1lbnRzCisgICAgICAgIGlmIChlbmdpbmUgaW5zdGFuY2VvZiBQaXBlbGluZSkgeworICAgICAgICAgICAgVmFsdmUgdmFsdmVzW10gPSAoKFBpcGVsaW5lKSBlbmdpbmUpLmdldFZhbHZlcygpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx2ZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBzdG9yZVZhbHZlKHdyaXRlciwgaW5kZW50ICsgMiwgdmFsdmVzW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFN0b3JlIHRoZSBlbmRpbmcgb2YgdGhpcyBlbGVtZW50CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5kZW50OyBpKyspIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgnICcpOworICAgICAgICB9CisgICAgICAgIHdyaXRlci5wcmludGxuKCI8L0VuZ2luZT4iKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU3RvcmUgdGhlIHNwZWNpZmllZCBIb3N0IHByb3BlcnRpZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gd3JpdGVyIFByaW50V3JpdGVyIHRvIHdoaWNoIHdlIGFyZSBzdG9yaW5nCisgICAgICogQHBhcmFtIGluZGVudCBOdW1iZXIgb2Ygc3BhY2VzIHRvIGluZGVudCB0aGlzIGVsZW1lbnQKKyAgICAgKiBAcGFyYW0gaG9zdCAgT2JqZWN0IHdob3NlIHByb3BlcnRpZXMgYXJlIGJlaW5nIHN0b3JlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW4gZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBzdG9yaW5nCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHN0b3JlSG9zdChQcmludFdyaXRlciB3cml0ZXIsIGludCBpbmRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBIb3N0IGhvc3QpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIC8vIFN0b3JlIHRoZSBiZWdpbm5pbmcgb2YgdGhpcyBlbGVtZW50CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5kZW50OyBpKyspIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgnICcpOworICAgICAgICB9CisgICAgICAgIHdyaXRlci5wcmludCgiPEhvc3QiKTsKKyAgICAgICAgc3RvcmVBdHRyaWJ1dGVzKHdyaXRlciwgaG9zdCk7CisgICAgICAgIHdyaXRlci5wcmludGxuKCI+Iik7CisKKyAgICAgICAgLy8gU3RvcmUgbmVzdGVkIDxBbGlhcz4gZWxlbWVudHMKKyAgICAgICAgU3RyaW5nIGFsaWFzZXNbXSA9IGhvc3QuZmluZEFsaWFzZXMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbGlhc2VzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGluZGVudDsgaisrKSB7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KCcgJyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoIjxBbGlhcz4iKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludChhbGlhc2VzW2ldKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCI8L0FsaWFzPiIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gU3RvcmUgbmVzdGVkIDxDbHVzdGVyPiBlbGVtZW50cworICAgICAgICA7IC8vIEZJWE1FIC0gQnV0IGl0J3Mgbm90IHN1cHBvcnRlZCBieSBhbnkgc3RhbmRhcmQgSG9zdCBpbXBsZW1lbnRhdGlvbgorCisgICAgICAgIC8vIFN0b3JlIG5lc3RlZCA8Q29udGV4dD4gZWxlbWVudHMgKG9yIG90aGVyIHJlbGV2YW50IGNvbnRhaW5lcnMpCisgICAgICAgIENvbnRhaW5lciBjaGlsZHJlbltdID0gaG9zdC5maW5kQ2hpbGRyZW4oKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKGNoaWxkcmVuW2ldIGluc3RhbmNlb2YgQ29udGV4dCkgeworICAgICAgICAgICAgICAgIHN0b3JlQ29udGV4dCh3cml0ZXIsIGluZGVudCArIDIsIChDb250ZXh0KSBjaGlsZHJlbltpXSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNoaWxkcmVuW2ldIGluc3RhbmNlb2YgRW5naW5lKSB7CisgICAgICAgICAgICAgICAgc3RvcmVFbmdpbmUod3JpdGVyLCBpbmRlbnQgKyAyLCAoRW5naW5lKSBjaGlsZHJlbltpXSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNoaWxkcmVuW2ldIGluc3RhbmNlb2YgSG9zdCkgeworICAgICAgICAgICAgICAgIHN0b3JlSG9zdCh3cml0ZXIsIGluZGVudCArIDIsIChIb3N0KSBjaGlsZHJlbltpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBTdG9yZSBuZXN0ZWQgPExpc3RlbmVyPiBlbGVtZW50cworICAgICAgICBpZiAoaG9zdCBpbnN0YW5jZW9mIExpZmVjeWNsZSkgeworICAgICAgICAgICAgTGlmZWN5Y2xlTGlzdGVuZXIgbGlzdGVuZXJzW10gPQorICAgICAgICAgICAgICAgICgoTGlmZWN5Y2xlKSBob3N0KS5maW5kTGlmZWN5Y2xlTGlzdGVuZXJzKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChsaXN0ZW5lcnNbaV0uZ2V0Q2xhc3MoKS5nZXROYW1lKCkuZXF1YWxzCisgICAgICAgICAgICAgICAgICAgIChTRVJWRVJfTElTVEVORVJfQ0xBU1NfTkFNRSkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0b3JlTGlzdGVuZXIod3JpdGVyLCBpbmRlbnQgKyAyLCBsaXN0ZW5lcnNbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gU3RvcmUgbmVzdGVkIDxSZWFsbT4gZWxlbWVudAorICAgICAgICBSZWFsbSByZWFsbSA9IGhvc3QuZ2V0UmVhbG0oKTsKKyAgICAgICAgaWYgKHJlYWxtICE9IG51bGwpIHsKKyAgICAgICAgICAgIFJlYWxtIHBhcmVudFJlYWxtID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChob3N0LmdldFBhcmVudCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBwYXJlbnRSZWFsbSA9IGhvc3QuZ2V0UGFyZW50KCkuZ2V0UmVhbG0oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChyZWFsbSAhPSBwYXJlbnRSZWFsbSkgeworICAgICAgICAgICAgICAgIHN0b3JlUmVhbG0od3JpdGVyLCBpbmRlbnQgKyAyLCByZWFsbSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBTdG9yZSBuZXN0ZWQgPFZhbHZlPiBlbGVtZW50cworICAgICAgICBpZiAoaG9zdCBpbnN0YW5jZW9mIFBpcGVsaW5lKSB7CisgICAgICAgICAgICBWYWx2ZSB2YWx2ZXNbXSA9ICgoUGlwZWxpbmUpIGhvc3QpLmdldFZhbHZlcygpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx2ZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBzdG9yZVZhbHZlKHdyaXRlciwgaW5kZW50ICsgMiwgdmFsdmVzW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFN0b3JlIHRoZSBlbmRpbmcgb2YgdGhpcyBlbGVtZW50CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5kZW50OyBpKyspIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgnICcpOworICAgICAgICB9CisgICAgICAgIHdyaXRlci5wcmludGxuKCI8L0hvc3Q+Iik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFN0b3JlIHRoZSBzcGVjaWZpZWQgTGlzdGVuZXIgcHJvcGVydGllcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB3cml0ZXIgUHJpbnRXcml0ZXIgdG8gd2hpY2ggd2UgYXJlIHN0b3JpbmcKKyAgICAgKiBAcGFyYW0gaW5kZW50IE51bWJlciBvZiBzcGFjZXMgdG8gaW5kZW50IHRoaXMgZWxlbWVudAorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBPYmplY3Qgd2hvc2UgcHJvcGVydGllcyBhcmUgYmVpbmcgc3RvcmVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBleGNlcHRpb24gb2NjdXJzIHdoaWxlIHN0b3JpbmcKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc3RvcmVMaXN0ZW5lcihQcmludFdyaXRlciB3cml0ZXIsIGludCBpbmRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlmZWN5Y2xlTGlzdGVuZXIgbGlzdGVuZXIpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIGlmIChpc1NraXBwYWJsZShsaXN0ZW5lci5nZXRDbGFzcygpLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5kZW50OyBpKyspIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgnICcpOworICAgICAgICB9CisgICAgICAgIHdyaXRlci5wcmludCgiPExpc3RlbmVyIik7CisgICAgICAgIHN0b3JlQXR0cmlidXRlcyh3cml0ZXIsIGxpc3RlbmVyKTsKKyAgICAgICAgd3JpdGVyLnByaW50bG4oIi8+Iik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFN0b3JlIHRoZSBzcGVjaWZpZWQgTG9hZGVyIHByb3BlcnRpZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gd3JpdGVyIFByaW50V3JpdGVyIHRvIHdoaWNoIHdlIGFyZSBzdG9yaW5nCisgICAgICogQHBhcmFtIGluZGVudCBOdW1iZXIgb2Ygc3BhY2VzIHRvIGluZGVudCB0aGlzIGVsZW1lbnQKKyAgICAgKiBAcGFyYW0gbG9hZGVyIE9iamVjdCB3aG9zZSBwcm9wZXJ0aWVzIGFyZSBiZWluZyBzdG9yZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgc3RvcmluZworICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzdG9yZUxvYWRlcihQcmludFdyaXRlciB3cml0ZXIsIGludCBpbmRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvYWRlciBsb2FkZXIpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIGlmIChpc0RlZmF1bHRMb2FkZXIobG9hZGVyKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5kZW50OyBpKyspIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgnICcpOworICAgICAgICB9CisgICAgICAgIHdyaXRlci5wcmludCgiPExvYWRlciIpOworICAgICAgICBzdG9yZUF0dHJpYnV0ZXMod3JpdGVyLCBsb2FkZXIpOworICAgICAgICB3cml0ZXIucHJpbnRsbigiLz4iKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU3RvcmUgdGhlIHNwZWNpZmllZCBNYW5hZ2VyIHByb3BlcnRpZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gd3JpdGVyIFByaW50V3JpdGVyIHRvIHdoaWNoIHdlIGFyZSBzdG9yaW5nCisgICAgICogQHBhcmFtIGluZGVudCBOdW1iZXIgb2Ygc3BhY2VzIHRvIGluZGVudCB0aGlzIGVsZW1lbnQKKyAgICAgKiBAcGFyYW0gbWFuYWdlciBPYmplY3Qgd2hvc2UgcHJvcGVydGllcyBhcmUgYmVpbmcgc3RvcmVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBleGNlcHRpb24gb2NjdXJzIHdoaWxlIHN0b3JpbmcKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc3RvcmVNYW5hZ2VyKFByaW50V3JpdGVyIHdyaXRlciwgaW50IGluZGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hbmFnZXIgbWFuYWdlcikgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKGlzRGVmYXVsdE1hbmFnZXIobWFuYWdlcikpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFN0b3JlIHRoZSBiZWdpbm5pbmcgb2YgdGhpcyBlbGVtZW50CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5kZW50OyBpKyspIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgnICcpOworICAgICAgICB9CisgICAgICAgIHdyaXRlci5wcmludCgiPE1hbmFnZXIiKTsKKyAgICAgICAgc3RvcmVBdHRyaWJ1dGVzKHdyaXRlciwgbWFuYWdlcik7CisgICAgICAgIHdyaXRlci5wcmludGxuKCI+Iik7CisKKyAgICAgICAgLy8gU3RvcmUgbmVzdGVkIDxTdG9yZT4gZWxlbWVudAorICAgICAgICBpZiAobWFuYWdlciBpbnN0YW5jZW9mIFBlcnNpc3RlbnRNYW5hZ2VyKSB7CisgICAgICAgICAgICBTdG9yZSBzdG9yZSA9ICgoUGVyc2lzdGVudE1hbmFnZXIpIG1hbmFnZXIpLmdldFN0b3JlKCk7CisgICAgICAgICAgICBpZiAoc3RvcmUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHN0b3JlU3RvcmUod3JpdGVyLCBpbmRlbnQgKyAyLCBzdG9yZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBTdG9yZSB0aGUgZW5kaW5nIG9mIHRoaXMgZWxlbWVudAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGluZGVudDsgaSsrKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoJyAnKTsKKyAgICAgICAgfQorICAgICAgICB3cml0ZXIucHJpbnRsbigiPC9NYW5hZ2VyPiIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTdG9yZSB0aGUgc3BlY2lmaWVkIE5hbWluZ1Jlc291cmNlcyBwcm9wZXJ0aWVzLgorICAgICAqCisgICAgICogQHBhcmFtIHdyaXRlciBQcmludFdyaXRlciB0byB3aGljaCB3ZSBhcmUgc3RvcmluZworICAgICAqIEBwYXJhbSBpbmRlbnQgTnVtYmVyIG9mIHNwYWNlcyB0byBpbmRlbnQgdGhpcyBlbGVtZW50CisgICAgICogQHBhcmFtIHJlc291cmNlcyBPYmplY3Qgd2hvc2UgcHJvcGVydGllcyBhcmUgYmVpbmcgc3RvcmVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBleGNlcHRpb24gb2NjdXJzIHdoaWxlIHN0b3JpbmcKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc3RvcmVOYW1pbmdSZXNvdXJjZXMoUHJpbnRXcml0ZXIgd3JpdGVyLCBpbnQgaW5kZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1pbmdSZXNvdXJjZXMgcmVzb3VyY2VzKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBGSVhNRTogU3RvcmUgZXh0cmEgYXR0cmlidXRlcyBmb3Igc29tZSBvZiB0aGVzZQorICAgICAgICAKKyAgICAgICAgLy8gU3RvcmUgbmVzdGVkIDxFamI+IGVsZW1lbnRzCisgICAgICAgIENvbnRleHRFamJbXSBlamJzID0gcmVzb3VyY2VzLmZpbmRFamJzKCk7CisgICAgICAgIGlmIChlamJzLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWpicy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgaW5kZW50OyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KCcgJyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdyaXRlci5wcmludCgiPEVqYiIpOworICAgICAgICAgICAgICAgIHN0b3JlQXR0cmlidXRlcyh3cml0ZXIsIGZhbHNlLCBlamJzW2ldKTsKKyAgICAgICAgICAgICAgICBJdGVyYXRvciBwcm9wZXJ0aWVzID0gZWpic1tpXS5saXN0UHJvcGVydGllcygpOworICAgICAgICAgICAgICAgIHdoaWxlIChwcm9wZXJ0aWVzLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIHByb3BlcnRpZXMubmV4dCgpOworICAgICAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQoJyAnKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KG5hbWUpOworICAgICAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQoIj1cIiIpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc3RyVmFsdWUgPSBjb252ZXJ0U3RyKChTdHJpbmcpIGVqYnNbaV0uZ2V0UHJvcGVydHkobmFtZSkpOworICAgICAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQoc3RyVmFsdWUpOworICAgICAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQoIlwiIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCIvPiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gU3RvcmUgbmVzdGVkIDxFbnZpcm9ubWVudD4gZWxlbWVudHMKKyAgICAgICAgQ29udGV4dEVudmlyb25tZW50W10gZW52cyA9IHJlc291cmNlcy5maW5kRW52aXJvbm1lbnRzKCk7CisgICAgICAgIGlmIChlbnZzLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW52cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgaW5kZW50OyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KCcgJyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdyaXRlci5wcmludCgiPEVudmlyb25tZW50Iik7CisgICAgICAgICAgICAgICAgc3RvcmVBdHRyaWJ1dGVzKHdyaXRlciwgZmFsc2UsIGVudnNbaV0pOworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCIvPiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gU3RvcmUgbmVzdGVkIDxMb2NhbEVqYj4gZWxlbWVudHMKKyAgICAgICAgQ29udGV4dExvY2FsRWpiW10gbGVqYnMgPSByZXNvdXJjZXMuZmluZExvY2FsRWpicygpOworICAgICAgICBpZiAobGVqYnMubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZWpicy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgaW5kZW50OyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KCcgJyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdyaXRlci5wcmludCgiPExvY2FsRWpiIik7CisgICAgICAgICAgICAgICAgc3RvcmVBdHRyaWJ1dGVzKHdyaXRlciwgZmFsc2UsIGxlamJzW2ldKTsKKyAgICAgICAgICAgICAgICBJdGVyYXRvciBwcm9wZXJ0aWVzID0gbGVqYnNbaV0ubGlzdFByb3BlcnRpZXMoKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAocHJvcGVydGllcy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBwcm9wZXJ0aWVzLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KCcgJyk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5wcmludChuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KCI9XCIiKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHN0clZhbHVlID0gY29udmVydFN0cigoU3RyaW5nKSBsZWpic1tpXS5nZXRQcm9wZXJ0eShuYW1lKSk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5wcmludChzdHJWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5wcmludCgiXCIiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIi8+Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBTdG9yZSBuZXN0ZWQgPFJlc291cmNlPiBlbGVtZW50cworICAgICAgICBDb250ZXh0UmVzb3VyY2VbXSBkcmVzb3VyY2VzID0gcmVzb3VyY2VzLmZpbmRSZXNvdXJjZXMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkcmVzb3VyY2VzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGluZGVudDsgaisrKSB7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KCcgJyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoIjxSZXNvdXJjZSIpOworICAgICAgICAgICAgc3RvcmVBdHRyaWJ1dGVzKHdyaXRlciwgZmFsc2UsIGRyZXNvdXJjZXNbaV0pOworICAgICAgICAgICAgSXRlcmF0b3IgcHJvcGVydGllcyA9IGRyZXNvdXJjZXNbaV0ubGlzdFByb3BlcnRpZXMoKTsKKyAgICAgICAgICAgIHdoaWxlIChwcm9wZXJ0aWVzLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZykgcHJvcGVydGllcy5uZXh0KCk7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KCcgJyk7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KG5hbWUpOworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludCgiPVwiIik7CisgICAgICAgICAgICAgICAgU3RyaW5nIHN0clZhbHVlID0gY29udmVydFN0cigoU3RyaW5nKSBkcmVzb3VyY2VzW2ldLmdldFByb3BlcnR5KG5hbWUpKTsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQoc3RyVmFsdWUpOworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludCgiXCIiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCIvPiIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gU3RvcmUgbmVzdGVkIDxSZXNvdXJjZUVudlJlZj4gZWxlbWVudHMKKyAgICAgICAgQ29udGV4dFJlc291cmNlRW52UmVmW10gZXJlc291cmNlcyA9IHJlc291cmNlcy5maW5kUmVzb3VyY2VFbnZSZWZzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXJlc291cmNlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBpbmRlbnQ7IGorKykgeworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludCgnICcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIjxSZXNvdXJjZUVudlJlZiIpOworICAgICAgICAgICAgc3RvcmVBdHRyaWJ1dGVzKHdyaXRlciwgZmFsc2UsIGVyZXNvdXJjZXNbaV0pOworICAgICAgICAgICAgSXRlcmF0b3IgcHJvcGVydGllcyA9IGVyZXNvdXJjZXNbaV0ubGlzdFByb3BlcnRpZXMoKTsKKyAgICAgICAgICAgIHdoaWxlIChwcm9wZXJ0aWVzLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZykgcHJvcGVydGllcy5uZXh0KCk7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KCcgJyk7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KG5hbWUpOworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludCgiPVwiIik7CisgICAgICAgICAgICAgICAgU3RyaW5nIHN0clZhbHVlID0gY29udmVydFN0cigoU3RyaW5nKSBlcmVzb3VyY2VzW2ldLmdldFByb3BlcnR5KG5hbWUpKTsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQoc3RyVmFsdWUpOworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludCgiXCIiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCIvPiIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gU3RvcmUgbmVzdGVkIDxSZXNvdXJjZUxpbms+IGVsZW1lbnRzCisgICAgICAgIENvbnRleHRSZXNvdXJjZUxpbmtbXSByZXNvdXJjZUxpbmtzID0gcmVzb3VyY2VzLmZpbmRSZXNvdXJjZUxpbmtzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VMaW5rcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBpbmRlbnQ7IGorKykgeworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludCgnICcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd3JpdGVyLnByaW50KCI8UmVzb3VyY2VMaW5rIik7CisgICAgICAgICAgICBzdG9yZUF0dHJpYnV0ZXMod3JpdGVyLCBmYWxzZSwgcmVzb3VyY2VMaW5rc1tpXSk7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiLz4iKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTdG9yZSB0aGUgc3BlY2lmaWVkIFJlYWxtIHByb3BlcnRpZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gd3JpdGVyIFByaW50V3JpdGVyIHRvIHdoaWNoIHdlIGFyZSBzdG9yaW5nCisgICAgICogQHBhcmFtIGluZGVudCBOdW1iZXIgb2Ygc3BhY2VzIHRvIGluZGVudCB0aGlzIGVsZW1lbnQKKyAgICAgKiBAcGFyYW0gcmVhbG0gT2JqZWN0IHdob3NlIHByb3BlcnRpZXMgYXJlIGJlaW5nIHN0b3JlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW4gZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBzdG9yaW5nCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHN0b3JlUmVhbG0oUHJpbnRXcml0ZXIgd3JpdGVyLCBpbnQgaW5kZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlYWxtIHJlYWxtKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGluZGVudDsgaSsrKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoJyAnKTsKKyAgICAgICAgfQorICAgICAgICB3cml0ZXIucHJpbnQoIjxSZWFsbSIpOworICAgICAgICBzdG9yZUF0dHJpYnV0ZXMod3JpdGVyLCByZWFsbSk7CisgICAgICAgIHdyaXRlci5wcmludGxuKCIvPiIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTdG9yZSB0aGUgc3BlY2lmaWVkIFJlc291cmNlcyBwcm9wZXJ0aWVzLgorICAgICAqCisgICAgICogQHBhcmFtIHdyaXRlciBQcmludFdyaXRlciB0byB3aGljaCB3ZSBhcmUgc3RvcmluZworICAgICAqIEBwYXJhbSBpbmRlbnQgTnVtYmVyIG9mIHNwYWNlcyB0byBpbmRlbnQgdGhpcyBlbGVtZW50CisgICAgICogQHBhcmFtIHJlc291cmNlcyBPYmplY3Qgd2hvc2UgcHJvcGVydGllcyBhcmUgYmVpbmcgc3RvcmVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBleGNlcHRpb24gb2NjdXJzIHdoaWxlIHN0b3JpbmcKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc3RvcmVSZXNvdXJjZXMoUHJpbnRXcml0ZXIgd3JpdGVyLCBpbnQgaW5kZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXJDb250ZXh0IHJlc291cmNlcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKHJlc291cmNlcyBpbnN0YW5jZW9mIG9yZy5hcGFjaGUubmFtaW5nLnJlc291cmNlcy5GaWxlRGlyQ29udGV4dCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChyZXNvdXJjZXMgaW5zdGFuY2VvZiBvcmcuYXBhY2hlLm5hbWluZy5yZXNvdXJjZXMuUHJveHlEaXJDb250ZXh0KSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlc291cmNlcyBpbnN0YW5jZW9mIG9yZy5hcGFjaGUubmFtaW5nLnJlc291cmNlcy5XQVJEaXJDb250ZXh0KSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGluZGVudDsgaSsrKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoJyAnKTsKKyAgICAgICAgfQorICAgICAgICB3cml0ZXIucHJpbnQoIjxSZXNvdXJjZXMiKTsKKyAgICAgICAgc3RvcmVBdHRyaWJ1dGVzKHdyaXRlciwgcmVzb3VyY2VzKTsKKyAgICAgICAgd3JpdGVyLnByaW50bG4oIi8+Iik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFN0b3JlIHRoZSBzcGVjaWZpZWQgU2VydmVyIHByb3BlcnRpZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gd3JpdGVyIFByaW50V3JpdGVyIHRvIHdoaWNoIHdlIGFyZSBzdG9yaW5nCisgICAgICogQHBhcmFtIGluZGVudCBOdW1iZXIgb2Ygc3BhY2VzIHRvIGluZGVudCB0aGlzIGVsZW1lbnQKKyAgICAgKiBAcGFyYW0gc2VydmVyIE9iamVjdCB0byBiZSBzdG9yZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgc3RvcmluZworICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzdG9yZVNlcnZlcihQcmludFdyaXRlciB3cml0ZXIsIGludCBpbmRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZlciBzZXJ2ZXIpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIC8vIFN0b3JlIHRoZSBiZWdpbm5pbmcgb2YgdGhpcyBlbGVtZW50CisgICAgICAgIHdyaXRlci5wcmludGxuKCI8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSd1dGYtOCc/PiIpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGluZGVudDsgaSsrKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoJyAnKTsKKyAgICAgICAgfQorICAgICAgICB3cml0ZXIucHJpbnQoIjxTZXJ2ZXIiKTsKKyAgICAgICAgc3RvcmVBdHRyaWJ1dGVzKHdyaXRlciwgc2VydmVyKTsKKyAgICAgICAgd3JpdGVyLnByaW50bG4oIj4iKTsKKworICAgICAgICAvLyBTdG9yZSBuZXN0ZWQgPExpc3RlbmVyPiBlbGVtZW50cworICAgICAgICBpZiAoc2VydmVyIGluc3RhbmNlb2YgTGlmZWN5Y2xlKSB7CisgICAgICAgICAgICBMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lcnNbXSA9CisgICAgICAgICAgICAgICAgKChMaWZlY3ljbGUpIHNlcnZlcikuZmluZExpZmVjeWNsZUxpc3RlbmVycygpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBzdG9yZUxpc3RlbmVyKHdyaXRlciwgaW5kZW50ICsgMiwgbGlzdGVuZXJzW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFN0b3JlIG5lc3RlZCA8R2xvYmFsTmFtaW5nUmVzb3VyY2VzPiBlbGVtZW50CisgICAgICAgIE5hbWluZ1Jlc291cmNlcyBnbG9iYWxOYW1pbmdSZXNvdXJjZXMgPQorICAgICAgICAgICAgc2VydmVyLmdldEdsb2JhbE5hbWluZ1Jlc291cmNlcygpOworICAgICAgICBpZiAoZ2xvYmFsTmFtaW5nUmVzb3VyY2VzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5kZW50ICsgMjsgaSsrKSB7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KCcgJyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiPEdsb2JhbE5hbWluZ1Jlc291cmNlcz4iKTsKKyAgICAgICAgICAgIHN0b3JlTmFtaW5nUmVzb3VyY2VzKHdyaXRlciwgaW5kZW50ICsgNCwgZ2xvYmFsTmFtaW5nUmVzb3VyY2VzKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5kZW50ICsgMjsgaSsrKSB7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KCcgJyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiPC9HbG9iYWxOYW1pbmdSZXNvdXJjZXM+Iik7CisgICAgICAgIH0KKworICAgICAgICAvLyBTdG9yZSBuZXN0ZWQgPFNlcnZpY2U+IGVsZW1lbnRzCisgICAgICAgIFNlcnZpY2Ugc2VydmljZXNbXSA9IHNlcnZlci5maW5kU2VydmljZXMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJ2aWNlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgc3RvcmVTZXJ2aWNlKHdyaXRlciwgaW5kZW50ICsgMiwgc2VydmljZXNbaV0pOworICAgICAgICB9CisKKyAgICAgICAgLy8gU3RvcmUgdGhlIGVuZGluZyBvZiB0aGlzIGVsZW1lbnQKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRlbnQ7IGkrKykgeworICAgICAgICAgICAgd3JpdGVyLnByaW50KCcgJyk7CisgICAgICAgIH0KKyAgICAgICAgd3JpdGVyLnByaW50bG4oIjwvU2VydmVyPiIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTdG9yZSB0aGUgc3BlY2lmaWVkIFNlcnZpY2UgcHJvcGVydGllcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB3cml0ZXIgUHJpbnRXcml0ZXIgdG8gd2hpY2ggd2UgYXJlIHN0b3JpbmcKKyAgICAgKiBAcGFyYW0gaW5kZW50IE51bWJlciBvZiBzcGFjZXMgdG8gaW5kZW50IHRoaXMgZWxlbWVudAorICAgICAqIEBwYXJhbSBzZXJ2aWNlIE9iamVjdCB0byBiZSBzdG9yZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgc3RvcmluZworICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzdG9yZVNlcnZpY2UoUHJpbnRXcml0ZXIgd3JpdGVyLCBpbnQgaW5kZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmljZSBzZXJ2aWNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBTdG9yZSB0aGUgYmVnaW5uaW5nIG9mIHRoaXMgZWxlbWVudAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGluZGVudDsgaSsrKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoJyAnKTsKKyAgICAgICAgfQorICAgICAgICB3cml0ZXIucHJpbnQoIjxTZXJ2aWNlIik7CisgICAgICAgIHN0b3JlQXR0cmlidXRlcyh3cml0ZXIsIHNlcnZpY2UpOworICAgICAgICB3cml0ZXIucHJpbnRsbigiPiIpOworCisgICAgICAgIC8vIFN0b3JlIG5lc3RlZCA8Q29ubmVjdG9yPiBlbGVtZW50cworICAgICAgICBDb25uZWN0b3IgY29ubmVjdG9yc1tdID0gc2VydmljZS5maW5kQ29ubmVjdG9ycygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbm5lY3RvcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHN0b3JlQ29ubmVjdG9yKHdyaXRlciwgaW5kZW50ICsgMiwgY29ubmVjdG9yc1tpXSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBTdG9yZSBuZXN0ZWQgPEVuZ2luZT4gZWxlbWVudCAob3Igb3RoZXIgYXBwcm9wcmlhdGUgY29udGFpbmVyKQorICAgICAgICBDb250YWluZXIgY29udGFpbmVyID0gc2VydmljZS5nZXRDb250YWluZXIoKTsKKyAgICAgICAgaWYgKGNvbnRhaW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgQ29udGV4dCkgeworICAgICAgICAgICAgICAgIHN0b3JlQ29udGV4dCh3cml0ZXIsIGluZGVudCArIDIsIChDb250ZXh0KSBjb250YWluZXIpOworICAgICAgICAgICAgfSBlbHNlIGlmIChjb250YWluZXIgaW5zdGFuY2VvZiBFbmdpbmUpIHsKKyAgICAgICAgICAgICAgICBzdG9yZUVuZ2luZSh3cml0ZXIsIGluZGVudCArIDIsIChFbmdpbmUpIGNvbnRhaW5lcik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIEhvc3QpIHsKKyAgICAgICAgICAgICAgICBzdG9yZUhvc3Qod3JpdGVyLCBpbmRlbnQgKyAyLCAoSG9zdCkgY29udGFpbmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFN0b3JlIG5lc3RlZCA8TGlzdGVuZXI+IGVsZW1lbnRzCisgICAgICAgIGlmIChzZXJ2aWNlIGluc3RhbmNlb2YgTGlmZWN5Y2xlKSB7CisgICAgICAgICAgICBMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lcnNbXSA9CisgICAgICAgICAgICAgICAgKChMaWZlY3ljbGUpIHNlcnZpY2UpLmZpbmRMaWZlY3ljbGVMaXN0ZW5lcnMoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGxpc3RlbmVyc1tpXS5nZXRDbGFzcygpLmdldE5hbWUoKS5lcXVhbHMKKyAgICAgICAgICAgICAgICAgICAgKFNFUlZFUl9MSVNURU5FUl9DTEFTU19OQU1FKSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RvcmVMaXN0ZW5lcih3cml0ZXIsIGluZGVudCArIDIsIGxpc3RlbmVyc1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBTdG9yZSB0aGUgZW5kaW5nIG9mIHRoaXMgZWxlbWVudAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGluZGVudDsgaSsrKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoJyAnKTsKKyAgICAgICAgfQorICAgICAgICB3cml0ZXIucHJpbnRsbigiPC9TZXJ2aWNlPiIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTdG9yZSB0aGUgc3BlY2lmaWVkIFN0b3JlIHByb3BlcnRpZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gd3JpdGVyIFByaW50V3JpdGVyIHRvIHdoaWNoIHdlIGFyZSBzdG9yaW5nCisgICAgICogQHBhcmFtIGluZGVudCBOdW1iZXIgb2Ygc3BhY2VzIHRvIGluZGVudCB0aGlzIGVsZW1lbnQKKyAgICAgKiBAcGFyYW0gc3RvcmUgT2JqZWN0IHdob3NlIHByb3BlcnRpZXMgYXJlIGJlaW5nIHN0b3JlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW4gZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBzdG9yaW5nCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHN0b3JlU3RvcmUoUHJpbnRXcml0ZXIgd3JpdGVyLCBpbnQgaW5kZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG9yZSBzdG9yZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRlbnQ7IGkrKykgeworICAgICAgICAgICAgd3JpdGVyLnByaW50KCcgJyk7CisgICAgICAgIH0KKyAgICAgICAgd3JpdGVyLnByaW50KCI8U3RvcmUiKTsKKyAgICAgICAgc3RvcmVBdHRyaWJ1dGVzKHdyaXRlciwgc3RvcmUpOworICAgICAgICB3cml0ZXIucHJpbnRsbigiLz4iKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU3RvcmUgdGhlIHNwZWNpZmllZCBWYWx2ZSBwcm9wZXJ0aWVzLgorICAgICAqCisgICAgICogQHBhcmFtIHdyaXRlciBQcmludFdyaXRlciB0byB3aGljaCB3ZSBhcmUgc3RvcmluZworICAgICAqIEBwYXJhbSBpbmRlbnQgTnVtYmVyIG9mIHNwYWNlcyB0byBpbmRlbnQgdGhpcyBlbGVtZW50CisgICAgICogQHBhcmFtIHZhbHZlIE9iamVjdCB3aG9zZSBwcm9wZXJ0aWVzIGFyZSBiZWluZyB2YWx2ZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgc3RvcmluZworICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzdG9yZVZhbHZlKFByaW50V3JpdGVyIHdyaXRlciwgaW50IGluZGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdmUgdmFsdmUpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIGlmIChpc1NraXBwYWJsZSh2YWx2ZS5nZXRDbGFzcygpLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5kZW50OyBpKyspIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgnICcpOworICAgICAgICB9CisgICAgICAgIHdyaXRlci5wcmludCgiPFZhbHZlIik7CisgICAgICAgIHN0b3JlQXR0cmlidXRlcyh3cml0ZXIsIHZhbHZlKTsKKyAgICAgICAgd3JpdGVyLnByaW50bG4oIi8+Iik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3BlY2lmaWVkIGNsaWVudCBhbmQgc2VydmVyIGFkZHJlc3NlcworICAgICAqIGFyZSB0aGUgc2FtZS4gIFRoaXMgbWV0aG9kIHdvcmtzIGFyb3VuZCBhIGJ1ZyBpbiB0aGUgSUJNIDEuMS44IEpWTSBvbgorICAgICAqIExpbnV4LCB3aGVyZSB0aGUgYWRkcmVzcyBieXRlcyBhcmUgcmV0dXJuZWQgcmV2ZXJzZWQgaW4gc29tZQorICAgICAqIGNpcmN1bXN0YW5jZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VydmVyIFRoZSBzZXJ2ZXIncyBJbmV0QWRkcmVzcworICAgICAqIEBwYXJhbSBjbGllbnQgVGhlIGNsaWVudCdzIEluZXRBZGRyZXNzCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGlzU2FtZUFkZHJlc3MoSW5ldEFkZHJlc3Mgc2VydmVyLCBJbmV0QWRkcmVzcyBjbGllbnQpIHsKKworICAgICAgICAvLyBDb21wYXJlIHRoZSBieXRlIGFycmF5IHZlcnNpb25zIG9mIHRoZSB0d28gYWRkcmVzc2VzCisgICAgICAgIGJ5dGUgc2VydmVyQWRkcltdID0gc2VydmVyLmdldEFkZHJlc3MoKTsKKyAgICAgICAgYnl0ZSBjbGllbnRBZGRyW10gPSBjbGllbnQuZ2V0QWRkcmVzcygpOworICAgICAgICBpZiAoc2VydmVyQWRkci5sZW5ndGggIT0gY2xpZW50QWRkci5sZW5ndGgpCisgICAgICAgICAgICByZXR1cm4gKGZhbHNlKTsKKyAgICAgICAgYm9vbGVhbiBtYXRjaCA9IHRydWU7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VydmVyQWRkci5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKHNlcnZlckFkZHJbaV0gIT0gY2xpZW50QWRkcltpXSkgeworICAgICAgICAgICAgICAgIG1hdGNoID0gZmFsc2U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1hdGNoKQorICAgICAgICAgICAgcmV0dXJuICh0cnVlKTsKKworICAgICAgICAvLyBDb21wYXJlIHRoZSByZXZlcnNlZCBmb3JtIG9mIHRoZSB0d28gYWRkcmVzc2VzCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VydmVyQWRkci5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKHNlcnZlckFkZHJbaV0gIT0gY2xpZW50QWRkclsoc2VydmVyQWRkci5sZW5ndGgtMSktaV0pCisgICAgICAgICAgICAgICAgcmV0dXJuIChmYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICh0cnVlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRydWUgaWYgbmFtaW5nIHNob3VsZCBiZSB1c2VkLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBpc1VzZU5hbWluZygpIHsKKyAgICAgICAgYm9vbGVhbiB1c2VOYW1pbmcgPSB0cnVlOworICAgICAgICAvLyBSZWFkaW5nIHRoZSAiY2F0YWxpbmEudXNlTmFtaW5nIiBlbnZpcm9ubWVudCB2YXJpYWJsZQorICAgICAgICBTdHJpbmcgdXNlTmFtaW5nUHJvcGVydHkgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImNhdGFsaW5hLnVzZU5hbWluZyIpOworICAgICAgICBpZiAoKHVzZU5hbWluZ1Byb3BlcnR5ICE9IG51bGwpCisgICAgICAgICAgICAmJiAodXNlTmFtaW5nUHJvcGVydHkuZXF1YWxzKCJmYWxzZSIpKSkgeworICAgICAgICAgICAgdXNlTmFtaW5nID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHVzZU5hbWluZzsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBMaWZlY3ljbGUgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBMaWZlY3ljbGVFdmVudCBsaXN0ZW5lciB0byB0aGlzIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgdG8gYWRkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkTGlmZWN5Y2xlTGlzdGVuZXIoTGlmZWN5Y2xlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKworICAgICAgICBsaWZlY3ljbGUuYWRkTGlmZWN5Y2xlTGlzdGVuZXIobGlzdGVuZXIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGxpZmVjeWNsZSBsaXN0ZW5lcnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbGlmZWN5Y2xlLiBJZiB0aGlzCisgICAgICogTGlmZWN5Y2xlIGhhcyBubyBsaXN0ZW5lcnMgcmVnaXN0ZXJlZCwgYSB6ZXJvLWxlbmd0aCBhcnJheSBpcyByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlmZWN5Y2xlTGlzdGVuZXJbXSBmaW5kTGlmZWN5Y2xlTGlzdGVuZXJzKCkgeworCisgICAgICAgIHJldHVybiBsaWZlY3ljbGUuZmluZExpZmVjeWNsZUxpc3RlbmVycygpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSBMaWZlY3ljbGVFdmVudCBsaXN0ZW5lciBmcm9tIHRoaXMgY29tcG9uZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciB0byByZW1vdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVMaWZlY3ljbGVMaXN0ZW5lcihMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lcikgeworCisgICAgICAgIGxpZmVjeWNsZS5yZW1vdmVMaWZlY3ljbGVMaXN0ZW5lcihsaXN0ZW5lcik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFByZXBhcmUgZm9yIHRoZSBiZWdpbm5pbmcgb2YgYWN0aXZlIHVzZSBvZiB0aGUgcHVibGljIG1ldGhvZHMgb2YgdGhpcworICAgICAqIGNvbXBvbmVudC4gIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlIGFueSBvZiB0aGUgcHVibGljCisgICAgICogbWV0aG9kcyBvZiB0aGlzIGNvbXBvbmVudCBhcmUgdXRpbGl6ZWQuICBJdCBzaG91bGQgYWxzbyBzZW5kIGEKKyAgICAgKiBMaWZlY3ljbGVFdmVudCBvZiB0eXBlIFNUQVJUX0VWRU5UIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTGlmZWN5Y2xlRXhjZXB0aW9uIGlmIHRoaXMgY29tcG9uZW50IGRldGVjdHMgYSBmYXRhbCBlcnJvcgorICAgICAqICB0aGF0IHByZXZlbnRzIHRoaXMgY29tcG9uZW50IGZyb20gYmVpbmcgdXNlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgdGhyb3dzIExpZmVjeWNsZUV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gVmFsaWRhdGUgYW5kIHVwZGF0ZSBvdXIgY3VycmVudCBjb21wb25lbnQgc3RhdGUKKyAgICAgICAgaWYgKHN0YXJ0ZWQpIHsKKyAgICAgICAgICAgIGxvZy5kZWJ1ZyhzbS5nZXRTdHJpbmcoInN0YW5kYXJkU2VydmVyLnN0YXJ0LnN0YXJ0ZWQiKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBOb3RpZnkgb3VyIGludGVyZXN0ZWQgTGlmZWN5Y2xlTGlzdGVuZXJzCisgICAgICAgIGxpZmVjeWNsZS5maXJlTGlmZWN5Y2xlRXZlbnQoQkVGT1JFX1NUQVJUX0VWRU5ULCBudWxsKTsKKworICAgICAgICBsaWZlY3ljbGUuZmlyZUxpZmVjeWNsZUV2ZW50KFNUQVJUX0VWRU5ULCBudWxsKTsKKyAgICAgICAgc3RhcnRlZCA9IHRydWU7CisKKyAgICAgICAgLy8gU3RhcnQgb3VyIGRlZmluZWQgU2VydmljZXMKKyAgICAgICAgc3luY2hyb25pemVkIChzZXJ2aWNlcykgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJ2aWNlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChzZXJ2aWNlc1tpXSBpbnN0YW5jZW9mIExpZmVjeWNsZSkKKyAgICAgICAgICAgICAgICAgICAgKChMaWZlY3ljbGUpIHNlcnZpY2VzW2ldKS5zdGFydCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gTm90aWZ5IG91ciBpbnRlcmVzdGVkIExpZmVjeWNsZUxpc3RlbmVycworICAgICAgICBsaWZlY3ljbGUuZmlyZUxpZmVjeWNsZUV2ZW50KEFGVEVSX1NUQVJUX0VWRU5ULCBudWxsKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogR3JhY2VmdWxseSB0ZXJtaW5hdGUgdGhlIGFjdGl2ZSB1c2Ugb2YgdGhlIHB1YmxpYyBtZXRob2RzIG9mIHRoaXMKKyAgICAgKiBjb21wb25lbnQuICBUaGlzIG1ldGhvZCBzaG91bGQgYmUgdGhlIGxhc3Qgb25lIGNhbGxlZCBvbiBhIGdpdmVuCisgICAgICogaW5zdGFuY2Ugb2YgdGhpcyBjb21wb25lbnQuICBJdCBzaG91bGQgYWxzbyBzZW5kIGEgTGlmZWN5Y2xlRXZlbnQKKyAgICAgKiBvZiB0eXBlIFNUT1BfRVZFTlQgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBMaWZlY3ljbGVFeGNlcHRpb24gaWYgdGhpcyBjb21wb25lbnQgZGV0ZWN0cyBhIGZhdGFsIGVycm9yCisgICAgICogIHRoYXQgbmVlZHMgdG8gYmUgcmVwb3J0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdG9wKCkgdGhyb3dzIExpZmVjeWNsZUV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gVmFsaWRhdGUgYW5kIHVwZGF0ZSBvdXIgY3VycmVudCBjb21wb25lbnQgc3RhdGUKKyAgICAgICAgaWYgKCFzdGFydGVkKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8vIE5vdGlmeSBvdXIgaW50ZXJlc3RlZCBMaWZlY3ljbGVMaXN0ZW5lcnMKKyAgICAgICAgbGlmZWN5Y2xlLmZpcmVMaWZlY3ljbGVFdmVudChCRUZPUkVfU1RPUF9FVkVOVCwgbnVsbCk7CisKKyAgICAgICAgbGlmZWN5Y2xlLmZpcmVMaWZlY3ljbGVFdmVudChTVE9QX0VWRU5ULCBudWxsKTsKKyAgICAgICAgc3RhcnRlZCA9IGZhbHNlOworCisgICAgICAgIC8vIFN0b3Agb3VyIGRlZmluZWQgU2VydmljZXMKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJ2aWNlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKHNlcnZpY2VzW2ldIGluc3RhbmNlb2YgTGlmZWN5Y2xlKQorICAgICAgICAgICAgICAgICgoTGlmZWN5Y2xlKSBzZXJ2aWNlc1tpXSkuc3RvcCgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gTm90aWZ5IG91ciBpbnRlcmVzdGVkIExpZmVjeWNsZUxpc3RlbmVycworICAgICAgICBsaWZlY3ljbGUuZmlyZUxpZmVjeWNsZUV2ZW50KEFGVEVSX1NUT1BfRVZFTlQsIG51bGwpOworCisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW5pdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpbml0aWFsaXplKCk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEludm9rZSBhIHByZS1zdGFydHVwIGluaXRpYWxpemF0aW9uLiBUaGlzIGlzIHVzZWQgdG8gYWxsb3cgY29ubmVjdG9ycworICAgICAqIHRvIGJpbmQgdG8gcmVzdHJpY3RlZCBwb3J0cyB1bmRlciBVbml4IG9wZXJhdGluZyBlbnZpcm9ubWVudHMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpCisgICAgICAgIHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb24gCisgICAgeworICAgICAgICBpZiAoaW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgICAgICAgICBsb2cuaW5mbyhzbS5nZXRTdHJpbmcoInN0YW5kYXJkU2VydmVyLmluaXRpYWxpemUuaW5pdGlhbGl6ZWQiKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaW5pdGlhbGl6ZWQgPSB0cnVlOworCisgICAgICAgIGlmKCBvbmFtZT09bnVsbCApIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgb25hbWU9bmV3IE9iamVjdE5hbWUoICJDYXRhbGluYTp0eXBlPVNlcnZlciIpOworICAgICAgICAgICAgICAgIFJlZ2lzdHJ5LmdldFJlZ2lzdHJ5KG51bGwsIG51bGwpCisgICAgICAgICAgICAgICAgICAgIC5yZWdpc3RlckNvbXBvbmVudCh0aGlzLCBvbmFtZSwgbnVsbCApOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkVycm9yIHJlZ2lzdGVyaW5nICIsZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIEluaXRpYWxpemUgb3VyIGRlZmluZWQgU2VydmljZXMKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJ2aWNlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgc2VydmljZXNbaV0uaW5pdGlhbGl6ZSgpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHByb3RlY3RlZCBTdHJpbmcgdHlwZTsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGRvbWFpbjsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHN1ZmZpeDsKKyAgICBwcm90ZWN0ZWQgT2JqZWN0TmFtZSBvbmFtZTsKKyAgICBwcm90ZWN0ZWQgTUJlYW5TZXJ2ZXIgbXNlcnZlcjsKKworICAgIHB1YmxpYyBPYmplY3ROYW1lIGdldE9iamVjdE5hbWUoKSB7CisgICAgICAgIHJldHVybiBvbmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldERvbWFpbigpIHsKKyAgICAgICAgcmV0dXJuIGRvbWFpbjsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0TmFtZSBwcmVSZWdpc3RlcihNQmVhblNlcnZlciBzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSBuYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgb25hbWU9bmFtZTsKKyAgICAgICAgbXNlcnZlcj1zZXJ2ZXI7CisgICAgICAgIGRvbWFpbj1uYW1lLmdldERvbWFpbigpOworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwb3N0UmVnaXN0ZXIoQm9vbGVhbiByZWdpc3RyYXRpb25Eb25lKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHJlRGVyZWdpc3RlcigpIHRocm93cyBFeGNlcHRpb24geworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHBvc3REZXJlZ2lzdGVyKCkgeworICAgIH0KKyAgICAKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb3JlL1N0YW5kYXJkU2VydmljZS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NvcmUvU3RhbmRhcmRTZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNkZWNmNAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb3JlL1N0YW5kYXJkU2VydmljZS5qYXZhCkBAIC0wLDAgKzEsNjI5IEBACisvKgorICogQ29weXJpZ2h0IDE5OTktMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZTsKKworCitpbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOworaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VTdXBwb3J0OworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5SZWdpc3RyYXRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Db250YWluZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5FbmdpbmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlNlcnZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlNlcnZpY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5TZXJ2ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLkNvbm5lY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuTGlmZWN5Y2xlU3VwcG9ydDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuU3RyaW5nTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubW9kZWxlci5SZWdpc3RyeTsKKworCisvKioKKyAqIFN0YW5kYXJkIGltcGxlbWVudGF0aW9uIG9mIHRoZSA8Y29kZT5TZXJ2aWNlPC9jb2RlPiBpbnRlcmZhY2UuICBUaGUKKyAqIGFzc29jaWF0ZWQgQ29udGFpbmVyIGlzIGdlbmVyYWxseSBhbiBpbnN0YW5jZSBvZiBFbmdpbmUsIGJ1dCB0aGlzIGlzCisgKiBub3QgcmVxdWlyZWQuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKi8KKworcHVibGljIGNsYXNzIFN0YW5kYXJkU2VydmljZQorICAgICAgICBpbXBsZW1lbnRzIExpZmVjeWNsZSwgU2VydmljZSwgTUJlYW5SZWdpc3RyYXRpb24gCisgeworICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhTdGFuZGFyZFNlcnZpY2UuY2xhc3MpOworICAgCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogRGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBjb21wb25lbnQgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGluZm8gPQorICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkU2VydmljZS8xLjAiOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgbmFtZSBvZiB0aGlzIHNlcnZpY2UuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZSA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBsaWZlY3ljbGUgZXZlbnQgc3VwcG9ydCBmb3IgdGhpcyBjb21wb25lbnQuCisgICAgICovCisgICAgcHJpdmF0ZSBMaWZlY3ljbGVTdXBwb3J0IGxpZmVjeWNsZSA9IG5ldyBMaWZlY3ljbGVTdXBwb3J0KHRoaXMpOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc3RyaW5nIG1hbmFnZXIgZm9yIHRoaXMgcGFja2FnZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdNYW5hZ2VyIHNtID0KKyAgICAgICAgU3RyaW5nTWFuYWdlci5nZXRNYW5hZ2VyKENvbnN0YW50cy5QYWNrYWdlKTsKKworICAgIC8qKgorICAgICAqIFRoZSA8Y29kZT5TZXJ2ZXI8L2NvZGU+IHRoYXQgb3ducyB0aGlzIFNlcnZpY2UsIGlmIGFueS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFNlcnZlciBzZXJ2ZXIgPSBudWxsOworCisgICAgLyoqCisgICAgICogSGFzIHRoaXMgY29tcG9uZW50IGJlZW4gc3RhcnRlZD8KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gc3RhcnRlZCA9IGZhbHNlOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgcHJvcGVydHkgY2hhbmdlIHN1cHBvcnQgZm9yIHRoaXMgY29tcG9uZW50LgorICAgICAqLworICAgIHByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZVN1cHBvcnQgc3VwcG9ydCA9IG5ldyBQcm9wZXJ0eUNoYW5nZVN1cHBvcnQodGhpcyk7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzZXQgb2YgQ29ubmVjdG9ycyBhc3NvY2lhdGVkIHdpdGggdGhpcyBTZXJ2aWNlLgorICAgICAqLworICAgIHByb3RlY3RlZCBDb25uZWN0b3IgY29ubmVjdG9yc1tdID0gbmV3IENvbm5lY3RvclswXTsKKworCisgICAgLyoqCisgICAgICogVGhlIENvbnRhaW5lciBhc3NvY2lhdGVkIHdpdGggdGhpcyBTZXJ2aWNlLiAoSW4gdGhlIGNhc2Ugb2YgdGhlCisgICAgICogb3JnLmFwYWNoZS5jYXRhbGluYS5zdGFydHVwLkVtYmVkZGVkIHN1YmNsYXNzLCB0aGlzIGhvbGRzIHRoZSBtb3N0CisgICAgICogcmVjZW50bHkgYWRkZWQgRW5naW5lLikKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ29udGFpbmVyIGNvbnRhaW5lciA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIEhhcyB0aGlzIGNvbXBvbmVudCBiZWVuIGluaXRpYWxpemVkPworICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGluaXRpYWxpemVkID0gZmFsc2U7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIDxjb2RlPkNvbnRhaW5lcjwvY29kZT4gdGhhdCBoYW5kbGVzIHJlcXVlc3RzIGZvciBhbGwKKyAgICAgKiA8Y29kZT5Db25uZWN0b3JzPC9jb2RlPiBhc3NvY2lhdGVkIHdpdGggdGhpcyBTZXJ2aWNlLgorICAgICAqLworICAgIHB1YmxpYyBDb250YWluZXIgZ2V0Q29udGFpbmVyKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5jb250YWluZXIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIDxjb2RlPkNvbnRhaW5lcjwvY29kZT4gdGhhdCBoYW5kbGVzIHJlcXVlc3RzIGZvciBhbGwKKyAgICAgKiA8Y29kZT5Db25uZWN0b3JzPC9jb2RlPiBhc3NvY2lhdGVkIHdpdGggdGhpcyBTZXJ2aWNlLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRhaW5lciBUaGUgbmV3IENvbnRhaW5lcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbnRhaW5lcihDb250YWluZXIgY29udGFpbmVyKSB7CisKKyAgICAgICAgQ29udGFpbmVyIG9sZENvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyOworICAgICAgICBpZiAoKG9sZENvbnRhaW5lciAhPSBudWxsKSAmJiAob2xkQ29udGFpbmVyIGluc3RhbmNlb2YgRW5naW5lKSkKKyAgICAgICAgICAgICgoRW5naW5lKSBvbGRDb250YWluZXIpLnNldFNlcnZpY2UobnVsbCk7CisgICAgICAgIHRoaXMuY29udGFpbmVyID0gY29udGFpbmVyOworICAgICAgICBpZiAoKHRoaXMuY29udGFpbmVyICE9IG51bGwpICYmICh0aGlzLmNvbnRhaW5lciBpbnN0YW5jZW9mIEVuZ2luZSkpCisgICAgICAgICAgICAoKEVuZ2luZSkgdGhpcy5jb250YWluZXIpLnNldFNlcnZpY2UodGhpcyk7CisgICAgICAgIGlmIChzdGFydGVkICYmICh0aGlzLmNvbnRhaW5lciAhPSBudWxsKSAmJgorICAgICAgICAgICAgKHRoaXMuY29udGFpbmVyIGluc3RhbmNlb2YgTGlmZWN5Y2xlKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAoKExpZmVjeWNsZSkgdGhpcy5jb250YWluZXIpLnN0YXJ0KCk7CisgICAgICAgICAgICB9IGNhdGNoIChMaWZlY3ljbGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzeW5jaHJvbml6ZWQgKGNvbm5lY3RvcnMpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29ubmVjdG9ycy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICBjb25uZWN0b3JzW2ldLnNldENvbnRhaW5lcih0aGlzLmNvbnRhaW5lcik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0YXJ0ZWQgJiYgKG9sZENvbnRhaW5lciAhPSBudWxsKSAmJgorICAgICAgICAgICAgKG9sZENvbnRhaW5lciBpbnN0YW5jZW9mIExpZmVjeWNsZSkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgKChMaWZlY3ljbGUpIG9sZENvbnRhaW5lcikuc3RvcCgpOworICAgICAgICAgICAgfSBjYXRjaCAoTGlmZWN5Y2xlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXBvcnQgdGhpcyBwcm9wZXJ0eSBjaGFuZ2UgdG8gaW50ZXJlc3RlZCBsaXN0ZW5lcnMKKyAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoImNvbnRhaW5lciIsIG9sZENvbnRhaW5lciwgdGhpcy5jb250YWluZXIpOworCisgICAgfQorCisgICAgcHVibGljIE9iamVjdE5hbWUgZ2V0Q29udGFpbmVyTmFtZSgpIHsKKyAgICAgICAgaWYoIGNvbnRhaW5lciBpbnN0YW5jZW9mIENvbnRhaW5lckJhc2UgKSB7CisgICAgICAgICAgICByZXR1cm4gKChDb250YWluZXJCYXNlKWNvbnRhaW5lcikuZ2V0Sm14TmFtZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgU2VydmljZSBpbXBsZW1lbnRhdGlvbiBhbmQKKyAgICAgKiB0aGUgY29ycmVzcG9uZGluZyB2ZXJzaW9uIG51bWJlciwgaW4gdGhlIGZvcm1hdAorICAgICAqIDxjb2RlPiZsdDtkZXNjcmlwdGlvbiZndDsvJmx0O3ZlcnNpb24mZ3Q7PC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEluZm8oKSB7CisKKyAgICAgICAgcmV0dXJuIChpbmZvKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoaXMgU2VydmljZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLm5hbWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG5hbWUgb2YgdGhpcyBTZXJ2aWNlLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgVGhlIG5ldyBzZXJ2aWNlIG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSA8Y29kZT5TZXJ2ZXI8L2NvZGU+IHdpdGggd2hpY2ggd2UgYXJlIGFzc29jaWF0ZWQgKGlmIGFueSkuCisgICAgICovCisgICAgcHVibGljIFNlcnZlciBnZXRTZXJ2ZXIoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLnNlcnZlcik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgPGNvZGU+U2VydmVyPC9jb2RlPiB3aXRoIHdoaWNoIHdlIGFyZSBhc3NvY2lhdGVkIChpZiBhbnkpLgorICAgICAqCisgICAgICogQHBhcmFtIHNlcnZlciBUaGUgc2VydmVyIHRoYXQgb3ducyB0aGlzIFNlcnZpY2UKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2ZXIoU2VydmVyIHNlcnZlcikgeworCisgICAgICAgIHRoaXMuc2VydmVyID0gc2VydmVyOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogQWRkIGEgbmV3IENvbm5lY3RvciB0byB0aGUgc2V0IG9mIGRlZmluZWQgQ29ubmVjdG9ycywgYW5kIGFzc29jaWF0ZSBpdAorICAgICAqIHdpdGggdGhpcyBTZXJ2aWNlJ3MgQ29udGFpbmVyLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3RvciBUaGUgQ29ubmVjdG9yIHRvIGJlIGFkZGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQ29ubmVjdG9yKENvbm5lY3RvciBjb25uZWN0b3IpIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKGNvbm5lY3RvcnMpIHsKKyAgICAgICAgICAgIGNvbm5lY3Rvci5zZXRDb250YWluZXIodGhpcy5jb250YWluZXIpOworICAgICAgICAgICAgY29ubmVjdG9yLnNldFNlcnZpY2UodGhpcyk7CisgICAgICAgICAgICBDb25uZWN0b3IgcmVzdWx0c1tdID0gbmV3IENvbm5lY3Rvcltjb25uZWN0b3JzLmxlbmd0aCArIDFdOworICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShjb25uZWN0b3JzLCAwLCByZXN1bHRzLCAwLCBjb25uZWN0b3JzLmxlbmd0aCk7CisgICAgICAgICAgICByZXN1bHRzW2Nvbm5lY3RvcnMubGVuZ3RoXSA9IGNvbm5lY3RvcjsKKyAgICAgICAgICAgIGNvbm5lY3RvcnMgPSByZXN1bHRzOworCisgICAgICAgICAgICBpZiAoaW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBjb25uZWN0b3IuaW5pdGlhbGl6ZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKExpZmVjeWNsZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiQ29ubmVjdG9yLmluaXRpYWxpemUiLCBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzdGFydGVkICYmIChjb25uZWN0b3IgaW5zdGFuY2VvZiBMaWZlY3ljbGUpKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgKChMaWZlY3ljbGUpIGNvbm5lY3Rvcikuc3RhcnQoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChMaWZlY3ljbGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkNvbm5lY3Rvci5zdGFydCIsIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gUmVwb3J0IHRoaXMgcHJvcGVydHkgY2hhbmdlIHRvIGludGVyZXN0ZWQgbGlzdGVuZXJzCisgICAgICAgICAgICBzdXBwb3J0LmZpcmVQcm9wZXJ0eUNoYW5nZSgiY29ubmVjdG9yIiwgbnVsbCwgY29ubmVjdG9yKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHVibGljIE9iamVjdE5hbWVbXSBnZXRDb25uZWN0b3JOYW1lcygpIHsKKyAgICAgICAgT2JqZWN0TmFtZSByZXN1bHRzW10gPSBuZXcgT2JqZWN0TmFtZVtjb25uZWN0b3JzLmxlbmd0aF07CisgICAgICAgIGZvciggaW50IGk9MDsgaTxyZXN1bHRzLmxlbmd0aDsgaSsrICkgeworICAgICAgICAgICAgLy8gaWYgaXQncyBhIGNveW90ZSBjb25uZWN0b3IKKyAgICAgICAgICAgIC8vaWYoIGNvbm5lY3RvcnNbaV0gaW5zdGFuY2VvZiBDb3lvdGVDb25uZWN0b3IgKSB7CisgICAgICAgICAgICAvLyAgICByZXN1bHRzW2ldPSgoQ295b3RlQ29ubmVjdG9yKWNvbm5lY3RvcnNbaV0pLmdldEpteE5hbWUoKTsKKyAgICAgICAgICAgIC8vfQorICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHRzOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQWRkIGEgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyIHRvIHRoaXMgY29tcG9uZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciB0byBhZGQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKworICAgICAgICBzdXBwb3J0LmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBGaW5kIGFuZCByZXR1cm4gdGhlIHNldCBvZiBDb25uZWN0b3JzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFNlcnZpY2UuCisgICAgICovCisgICAgcHVibGljIENvbm5lY3RvcltdIGZpbmRDb25uZWN0b3JzKCkgeworCisgICAgICAgIHJldHVybiAoY29ubmVjdG9ycyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIENvbm5lY3RvciBmcm9tIHRoZSBzZXQgYXNzb2NpYXRlZCBmcm9tIHRoaXMKKyAgICAgKiBTZXJ2aWNlLiAgVGhlIHJlbW92ZWQgQ29ubmVjdG9yIHdpbGwgYWxzbyBiZSBkaXNhc3NvY2lhdGVkIGZyb20gb3VyCisgICAgICogQ29udGFpbmVyLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3RvciBUaGUgQ29ubmVjdG9yIHRvIGJlIHJlbW92ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVDb25uZWN0b3IoQ29ubmVjdG9yIGNvbm5lY3RvcikgeworCisgICAgICAgIHN5bmNocm9uaXplZCAoY29ubmVjdG9ycykgeworICAgICAgICAgICAgaW50IGogPSAtMTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29ubmVjdG9ycy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChjb25uZWN0b3IgPT0gY29ubmVjdG9yc1tpXSkgeworICAgICAgICAgICAgICAgICAgICBqID0gaTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGogPCAwKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIGlmIChzdGFydGVkICYmIChjb25uZWN0b3JzW2pdIGluc3RhbmNlb2YgTGlmZWN5Y2xlKSkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICgoTGlmZWN5Y2xlKSBjb25uZWN0b3JzW2pdKS5zdG9wKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoTGlmZWN5Y2xlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJDb25uZWN0b3Iuc3RvcCIsIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbm5lY3RvcnNbal0uc2V0Q29udGFpbmVyKG51bGwpOworICAgICAgICAgICAgY29ubmVjdG9yLnNldFNlcnZpY2UobnVsbCk7CisgICAgICAgICAgICBpbnQgayA9IDA7CisgICAgICAgICAgICBDb25uZWN0b3IgcmVzdWx0c1tdID0gbmV3IENvbm5lY3Rvcltjb25uZWN0b3JzLmxlbmd0aCAtIDFdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb25uZWN0b3JzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGkgIT0gaikKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0c1trKytdID0gY29ubmVjdG9yc1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbm5lY3RvcnMgPSByZXN1bHRzOworCisgICAgICAgICAgICAvLyBSZXBvcnQgdGhpcyBwcm9wZXJ0eSBjaGFuZ2UgdG8gaW50ZXJlc3RlZCBsaXN0ZW5lcnMKKyAgICAgICAgICAgIHN1cHBvcnQuZmlyZVByb3BlcnR5Q2hhbmdlKCJjb25uZWN0b3IiLCBjb25uZWN0b3IsIG51bGwpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lciBmcm9tIHRoaXMgY29tcG9uZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciB0byByZW1vdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKworICAgICAgICBzdXBwb3J0LnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBjb21wb25lbnQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCJTdGFuZGFyZFNlcnZpY2VbIik7CisgICAgICAgIHNiLmFwcGVuZChnZXROYW1lKCkpOworICAgICAgICBzYi5hcHBlbmQoIl0iKTsKKyAgICAgICAgcmV0dXJuIChzYi50b1N0cmluZygpKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIExpZmVjeWNsZSBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIEFkZCBhIExpZmVjeWNsZUV2ZW50IGxpc3RlbmVyIHRvIHRoaXMgY29tcG9uZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciB0byBhZGQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRMaWZlY3ljbGVMaXN0ZW5lcihMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lcikgeworCisgICAgICAgIGxpZmVjeWNsZS5hZGRMaWZlY3ljbGVMaXN0ZW5lcihsaXN0ZW5lcik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbGlmZWN5Y2xlIGxpc3RlbmVycyBhc3NvY2lhdGVkIHdpdGggdGhpcyBsaWZlY3ljbGUuIElmIHRoaXMgCisgICAgICogTGlmZWN5Y2xlIGhhcyBubyBsaXN0ZW5lcnMgcmVnaXN0ZXJlZCwgYSB6ZXJvLWxlbmd0aCBhcnJheSBpcyByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlmZWN5Y2xlTGlzdGVuZXJbXSBmaW5kTGlmZWN5Y2xlTGlzdGVuZXJzKCkgeworCisgICAgICAgIHJldHVybiBsaWZlY3ljbGUuZmluZExpZmVjeWNsZUxpc3RlbmVycygpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSBMaWZlY3ljbGVFdmVudCBsaXN0ZW5lciBmcm9tIHRoaXMgY29tcG9uZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciB0byByZW1vdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVMaWZlY3ljbGVMaXN0ZW5lcihMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lcikgeworCisgICAgICAgIGxpZmVjeWNsZS5yZW1vdmVMaWZlY3ljbGVMaXN0ZW5lcihsaXN0ZW5lcik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFByZXBhcmUgZm9yIHRoZSBiZWdpbm5pbmcgb2YgYWN0aXZlIHVzZSBvZiB0aGUgcHVibGljIG1ldGhvZHMgb2YgdGhpcworICAgICAqIGNvbXBvbmVudC4gIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlIGFueSBvZiB0aGUgcHVibGljCisgICAgICogbWV0aG9kcyBvZiB0aGlzIGNvbXBvbmVudCBhcmUgdXRpbGl6ZWQuICBJdCBzaG91bGQgYWxzbyBzZW5kIGEKKyAgICAgKiBMaWZlY3ljbGVFdmVudCBvZiB0eXBlIFNUQVJUX0VWRU5UIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTGlmZWN5Y2xlRXhjZXB0aW9uIGlmIHRoaXMgY29tcG9uZW50IGRldGVjdHMgYSBmYXRhbCBlcnJvcgorICAgICAqICB0aGF0IHByZXZlbnRzIHRoaXMgY29tcG9uZW50IGZyb20gYmVpbmcgdXNlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgdGhyb3dzIExpZmVjeWNsZUV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gVmFsaWRhdGUgYW5kIHVwZGF0ZSBvdXIgY3VycmVudCBjb21wb25lbnQgc3RhdGUKKyAgICAgICAgaWYgKHN0YXJ0ZWQpIHsKKyAgICAgICAgICAgIGxvZy5pbmZvKHNtLmdldFN0cmluZygic3RhbmRhcmRTZXJ2aWNlLnN0YXJ0LnN0YXJ0ZWQiKSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmKCAhIGluaXRpYWxpemVkICkKKyAgICAgICAgICAgIGluaXQoKTsgCisKKyAgICAgICAgLy8gTm90aWZ5IG91ciBpbnRlcmVzdGVkIExpZmVjeWNsZUxpc3RlbmVycworICAgICAgICBsaWZlY3ljbGUuZmlyZUxpZmVjeWNsZUV2ZW50KEJFRk9SRV9TVEFSVF9FVkVOVCwgbnVsbCk7CisKKyAgICAgICAgbG9nLmluZm8oc20uZ2V0U3RyaW5nKCJzdGFuZGFyZFNlcnZpY2Uuc3RhcnQubmFtZSIsIHRoaXMubmFtZSkpOworICAgICAgICBsaWZlY3ljbGUuZmlyZUxpZmVjeWNsZUV2ZW50KFNUQVJUX0VWRU5ULCBudWxsKTsKKyAgICAgICAgc3RhcnRlZCA9IHRydWU7CisKKyAgICAgICAgLy8gU3RhcnQgb3VyIGRlZmluZWQgQ29udGFpbmVyIGZpcnN0CisgICAgICAgIGlmIChjb250YWluZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgc3luY2hyb25pemVkIChjb250YWluZXIpIHsKKyAgICAgICAgICAgICAgICBpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgTGlmZWN5Y2xlKSB7CisgICAgICAgICAgICAgICAgICAgICgoTGlmZWN5Y2xlKSBjb250YWluZXIpLnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gU3RhcnQgb3VyIGRlZmluZWQgQ29ubmVjdG9ycyBzZWNvbmQKKyAgICAgICAgc3luY2hyb25pemVkIChjb25uZWN0b3JzKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbm5lY3RvcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoY29ubmVjdG9yc1tpXSBpbnN0YW5jZW9mIExpZmVjeWNsZSkKKyAgICAgICAgICAgICAgICAgICAgKChMaWZlY3ljbGUpIGNvbm5lY3RvcnNbaV0pLnN0YXJ0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBOb3RpZnkgb3VyIGludGVyZXN0ZWQgTGlmZWN5Y2xlTGlzdGVuZXJzCisgICAgICAgIGxpZmVjeWNsZS5maXJlTGlmZWN5Y2xlRXZlbnQoQUZURVJfU1RBUlRfRVZFTlQsIG51bGwpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHcmFjZWZ1bGx5IHRlcm1pbmF0ZSB0aGUgYWN0aXZlIHVzZSBvZiB0aGUgcHVibGljIG1ldGhvZHMgb2YgdGhpcworICAgICAqIGNvbXBvbmVudC4gIFRoaXMgbWV0aG9kIHNob3VsZCBiZSB0aGUgbGFzdCBvbmUgY2FsbGVkIG9uIGEgZ2l2ZW4KKyAgICAgKiBpbnN0YW5jZSBvZiB0aGlzIGNvbXBvbmVudC4gIEl0IHNob3VsZCBhbHNvIHNlbmQgYSBMaWZlY3ljbGVFdmVudAorICAgICAqIG9mIHR5cGUgU1RPUF9FVkVOVCB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIExpZmVjeWNsZUV4Y2VwdGlvbiBpZiB0aGlzIGNvbXBvbmVudCBkZXRlY3RzIGEgZmF0YWwgZXJyb3IKKyAgICAgKiAgdGhhdCBuZWVkcyB0byBiZSByZXBvcnRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB0aHJvd3MgTGlmZWN5Y2xlRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBWYWxpZGF0ZSBhbmQgdXBkYXRlIG91ciBjdXJyZW50IGNvbXBvbmVudCBzdGF0ZQorICAgICAgICBpZiAoIXN0YXJ0ZWQpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE5vdGlmeSBvdXIgaW50ZXJlc3RlZCBMaWZlY3ljbGVMaXN0ZW5lcnMKKyAgICAgICAgbGlmZWN5Y2xlLmZpcmVMaWZlY3ljbGVFdmVudChCRUZPUkVfU1RPUF9FVkVOVCwgbnVsbCk7CisKKyAgICAgICAgLy8gU3RvcCBvdXIgZGVmaW5lZCBDb25uZWN0b3JzIGZpcnN0CisgICAgICAgIHN5bmNocm9uaXplZCAoY29ubmVjdG9ycykgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb25uZWN0b3JzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgY29ubmVjdG9yc1tpXS5wYXVzZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gSGV1cmlzdGljOiBTbGVlcCBmb3IgYSB3aGlsZSB0byBlbnN1cmUgcGF1c2Ugb2YgdGhlIGNvbm5lY3RvcgorICAgICAgICB0cnkgeworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOworICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBJZ25vcmUKKyAgICAgICAgfQorCisgICAgICAgIGxpZmVjeWNsZS5maXJlTGlmZWN5Y2xlRXZlbnQoU1RPUF9FVkVOVCwgbnVsbCk7CisKKyAgICAgICAgbG9nLmluZm8KKyAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInN0YW5kYXJkU2VydmljZS5zdG9wLm5hbWUiLCB0aGlzLm5hbWUpKTsKKyAgICAgICAgc3RhcnRlZCA9IGZhbHNlOworCisgICAgICAgIC8vIFN0b3Agb3VyIGRlZmluZWQgQ29udGFpbmVyIHNlY29uZAorICAgICAgICBpZiAoY29udGFpbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAoY29udGFpbmVyKSB7CisgICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIExpZmVjeWNsZSkgeworICAgICAgICAgICAgICAgICAgICAoKExpZmVjeWNsZSkgY29udGFpbmVyKS5zdG9wKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gU3RvcCBvdXIgZGVmaW5lZCBDb25uZWN0b3JzIGZpcnN0CisgICAgICAgIHN5bmNocm9uaXplZCAoY29ubmVjdG9ycykgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb25uZWN0b3JzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGNvbm5lY3RvcnNbaV0gaW5zdGFuY2VvZiBMaWZlY3ljbGUpCisgICAgICAgICAgICAgICAgICAgICgoTGlmZWN5Y2xlKSBjb25uZWN0b3JzW2ldKS5zdG9wKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiggb25hbWU9PWNvbnRyb2xsZXIgKSB7CisgICAgICAgICAgICAvLyB3ZSByZWdpc3RlcmVkIG91cnNlbGYgb24gaW5pdCgpLgorICAgICAgICAgICAgLy8gVGhhdCBzaG91bGQgYmUgdGhlIHR5cGljYWwgY2FzZSAtIHRoaXMgb2JqZWN0IGlzIGp1c3QgZm9yCisgICAgICAgICAgICAvLyBiYWNrd2FyZCBjb21wYXQsIG5vYm9keSBzaG91bGQgYm90aGVyIHRvIGxvYWQgaXQgZXhwbGljaXRlbHkKKyAgICAgICAgICAgIFJlZ2lzdHJ5LmdldFJlZ2lzdHJ5KG51bGwsIG51bGwpLnVucmVnaXN0ZXJDb21wb25lbnQob25hbWUpOworICAgICAgICB9CisgICAgICAgIAorCisgICAgICAgIC8vIE5vdGlmeSBvdXIgaW50ZXJlc3RlZCBMaWZlY3ljbGVMaXN0ZW5lcnMKKyAgICAgICAgbGlmZWN5Y2xlLmZpcmVMaWZlY3ljbGVFdmVudChBRlRFUl9TVE9QX0VWRU5ULCBudWxsKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogSW52b2tlIGEgcHJlLXN0YXJ0dXAgaW5pdGlhbGl6YXRpb24uIFRoaXMgaXMgdXNlZCB0byBhbGxvdyBjb25uZWN0b3JzCisgICAgICogdG8gYmluZCB0byByZXN0cmljdGVkIHBvcnRzIHVuZGVyIFVuaXggb3BlcmF0aW5nIGVudmlyb25tZW50cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKCkKKyAgICAgICAgICAgIHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb24KKyAgICB7CisgICAgICAgIC8vIFNlcnZpY2Ugc2hvdWxkbid0IGJlIHVzZWQgd2l0aCBlbWJlZGVkLCBzbyBpdCBkb2Vzbid0IG1hdHRlcgorICAgICAgICBpZiAoaW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgICAgIGxvZy5pbmZvKHNtLmdldFN0cmluZygic3RhbmRhcmRTZXJ2aWNlLmluaXRpYWxpemUuaW5pdGlhbGl6ZWQiKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaW5pdGlhbGl6ZWQgPSB0cnVlOworCisgICAgICAgIGlmKCBvbmFtZT09bnVsbCApIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgLy8gSGFjayAtIFNlcnZlciBzaG91bGQgYmUgZGVwcmVjYXRlZC4uLgorICAgICAgICAgICAgICAgIENvbnRhaW5lciBlbmdpbmU9dGhpcy5nZXRDb250YWluZXIoKTsKKyAgICAgICAgICAgICAgICBkb21haW49ZW5naW5lLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICBvbmFtZT1uZXcgT2JqZWN0TmFtZShkb21haW4gKyAiOnR5cGU9U2VydmljZSxzZXJ2aWNlTmFtZT0iK25hbWUpOworICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlcj1vbmFtZTsKKyAgICAgICAgICAgICAgICBSZWdpc3RyeS5nZXRSZWdpc3RyeShudWxsLCBudWxsKQorICAgICAgICAgICAgICAgICAgICAucmVnaXN0ZXJDb21wb25lbnQodGhpcywgb25hbWUsIG51bGwpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkVycm9yIHJlZ2lzdGVyaW5nICIsZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIAorICAgICAgICB9CisgICAgICAgIGlmKCBzZXJ2ZXI9PW51bGwgKSB7CisgICAgICAgICAgICAvLyBSZWdpc3RlciB3aXRoIHRoZSBzZXJ2ZXIgCisgICAgICAgICAgICAvLyBIQUNLOiBTZXJ2ZXJGYWN0b3J5IHNob3VsZCBiZSByZW1vdmVkLi4uCisgICAgICAgICAgICAKKyAgICAgICAgICAgIFNlcnZlckZhY3RvcnkuZ2V0U2VydmVyKCkuYWRkU2VydmljZSh0aGlzKTsKKyAgICAgICAgfQorICAgICAgICAgICAgICAgCisKKyAgICAgICAgLy8gSW5pdGlhbGl6ZSBvdXIgZGVmaW5lZCBDb25uZWN0b3JzCisgICAgICAgIHN5bmNocm9uaXplZCAoY29ubmVjdG9ycykgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29ubmVjdG9ycy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBjb25uZWN0b3JzW2ldLmluaXRpYWxpemUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgZGVzdHJveSgpIHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb24geworICAgICAgICBpZiggc3RhcnRlZCApIHN0b3AoKTsKKyAgICAgICAgLy8gdW5yZWdpc3RlciBzaG91bGQgYmUgaGVyZSBwcm9iYWJseQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGluaXQoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbml0aWFsaXplKCk7CisgICAgICAgIH0gY2F0Y2goIFRocm93YWJsZSB0ICkgeworICAgICAgICAgICAgdC5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBTdHJpbmcgdHlwZTsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGRvbWFpbjsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHN1ZmZpeDsKKyAgICBwcm90ZWN0ZWQgT2JqZWN0TmFtZSBvbmFtZTsKKyAgICBwcm90ZWN0ZWQgT2JqZWN0TmFtZSBjb250cm9sbGVyOworICAgIHByb3RlY3RlZCBNQmVhblNlcnZlciBtc2VydmVyOworCisgICAgcHVibGljIE9iamVjdE5hbWUgZ2V0T2JqZWN0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG9uYW1lOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RG9tYWluKCkgeworICAgICAgICByZXR1cm4gZG9tYWluOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3ROYW1lIHByZVJlZ2lzdGVyKE1CZWFuU2VydmVyIHNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3ROYW1lIG5hbWUpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBvbmFtZT1uYW1lOworICAgICAgICBtc2VydmVyPXNlcnZlcjsKKyAgICAgICAgZG9tYWluPW5hbWUuZ2V0RG9tYWluKCk7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHBvc3RSZWdpc3RlcihCb29sZWFuIHJlZ2lzdHJhdGlvbkRvbmUpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwcmVEZXJlZ2lzdGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcG9zdERlcmVnaXN0ZXIoKSB7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29yZS9TdGFuZGFyZFdyYXBwZXIuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb3JlL1N0YW5kYXJkV3JhcHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzZWY5MTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29yZS9TdGFuZGFyZFdyYXBwZXIuamF2YQpAQCAtMCwwICsxLDE3MjggQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OS0yMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlOworCisKK2ltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5TdGFjazsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXQ7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29uZmlnOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgamF2YXguc2VydmxldC5TaW5nbGVUaHJlYWRNb2RlbDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlVuYXZhaWxhYmxlRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTGlzdGVuZXJOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuTm90aWZpY2F0aW9uSW5mbzsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk5vdGlmaWNhdGlvbkJyb2FkY2FzdGVyU3VwcG9ydDsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk5vdGlmaWNhdGlvbkVtaXR0ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5Ob3RpZmljYXRpb25GaWx0ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5Ob3RpZmljYXRpb25MaXN0ZW5lcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRhaW5lclNlcnZsZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Db250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuSW5zdGFuY2VFdmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkluc3RhbmNlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Mb2FkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5XcmFwcGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuc2VjdXJpdHkuU2VjdXJpdHlVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5FbnVtZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5JbnN0YW5jZVN1cHBvcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5sb2cuU3lzdGVtTG9nSGFuZGxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubW9kZWxlci5SZWdpc3RyeTsKKworLyoqCisgKiBTdGFuZGFyZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgPGI+V3JhcHBlcjwvYj4gaW50ZXJmYWNlIHRoYXQgcmVwcmVzZW50cworICogYW4gaW5kaXZpZHVhbCBzZXJ2bGV0IGRlZmluaXRpb24uICBObyBjaGlsZCBDb250YWluZXJzIGFyZSBhbGxvd2VkLCBhbmQKKyAqIHRoZSBwYXJlbnQgQ29udGFpbmVyIG11c3QgYmUgYSBDb250ZXh0LgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQGF1dGhvciBSZW15IE1hdWNoZXJhdAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworcHVibGljIGNsYXNzIFN0YW5kYXJkV3JhcHBlcgorICAgIGV4dGVuZHMgQ29udGFpbmVyQmFzZQorICAgIGltcGxlbWVudHMgU2VydmxldENvbmZpZywgV3JhcHBlciwgTm90aWZpY2F0aW9uRW1pdHRlciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2cgbG9nPQorICAgICAgICBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5LmdldExvZyggU3RhbmRhcmRXcmFwcGVyLmNsYXNzICk7CisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBTdGFuZGFyZFdyYXBwZXIgY29tcG9uZW50IHdpdGggdGhlIGRlZmF1bHQgYmFzaWMgVmFsdmUuCisgICAgICovCisgICAgcHVibGljIFN0YW5kYXJkV3JhcHBlcigpIHsKKworICAgICAgICBzdXBlcigpOworICAgICAgICBzd1ZhbHZlPW5ldyBTdGFuZGFyZFdyYXBwZXJWYWx2ZSgpOworICAgICAgICBwaXBlbGluZS5zZXRCYXNpYyhzd1ZhbHZlKTsKKyAgICAgICAgYnJvYWRjYXN0ZXIgPSBuZXcgTm90aWZpY2F0aW9uQnJvYWRjYXN0ZXJTdXBwb3J0KCk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZGF0ZSBhbmQgdGltZSBhdCB3aGljaCB0aGlzIHNlcnZsZXQgd2lsbCBiZWNvbWUgYXZhaWxhYmxlIChpbgorICAgICAqIG1pbGxpc2Vjb25kcyBzaW5jZSB0aGUgZXBvY2gpLCBvciB6ZXJvIGlmIHRoZSBzZXJ2bGV0IGlzIGF2YWlsYWJsZS4KKyAgICAgKiBJZiB0aGlzIHZhbHVlIGVxdWFscyBMb25nLk1BWF9WQUxVRSwgdGhlIHVuYXZhaWxhYmlsaXR5IG9mIHRoaXMKKyAgICAgKiBzZXJ2bGV0IGlzIGNvbnNpZGVyZWQgcGVybWFuZW50LgorICAgICAqLworICAgIHByaXZhdGUgbG9uZyBhdmFpbGFibGUgPSAwTDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgYnJvYWRjYXN0ZXIgdGhhdCBzZW5kcyBqMmVlIG5vdGlmaWNhdGlvbnMuIAorICAgICAqLworICAgIHByaXZhdGUgTm90aWZpY2F0aW9uQnJvYWRjYXN0ZXJTdXBwb3J0IGJyb2FkY2FzdGVyID0gbnVsbDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgY291bnQgb2YgYWxsb2NhdGlvbnMgdGhhdCBhcmUgY3VycmVudGx5IGFjdGl2ZSAoZXZlbiBpZiB0aGV5CisgICAgICogYXJlIGZvciB0aGUgc2FtZSBpbnN0YW5jZSwgYXMgd2lsbCBiZSB0cnVlIG9uIGEgbm9uLVNUTSBzZXJ2bGV0KS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBjb3VudEFsbG9jYXRlZCA9IDA7CisKKworICAgIC8qKgorICAgICAqIFRoZSBmYWNhZGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgd3JhcHBlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0YW5kYXJkV3JhcHBlckZhY2FkZSBmYWNhZGUgPQorICAgICAgICBuZXcgU3RhbmRhcmRXcmFwcGVyRmFjYWRlKHRoaXMpOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gc3RyaW5nIGZvciB0aGlzIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBpbmZvID0KKyAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZFdyYXBwZXIvMS4wIjsKKworCisgICAgLyoqCisgICAgICogVGhlIChzaW5nbGUpIGluaXRpYWxpemVkIGluc3RhbmNlIG9mIHRoaXMgc2VydmxldC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFNlcnZsZXQgaW5zdGFuY2UgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc3VwcG9ydCBvYmplY3QgZm9yIG91ciBpbnN0YW5jZSBsaXN0ZW5lcnMuCisgICAgICovCisgICAgcHJpdmF0ZSBJbnN0YW5jZVN1cHBvcnQgaW5zdGFuY2VTdXBwb3J0ID0gbmV3IEluc3RhbmNlU3VwcG9ydCh0aGlzKTsKKworCisgICAgLyoqCisgICAgICogVGhlIGNvbnRleHQtcmVsYXRpdmUgVVJJIG9mIHRoZSBKU1AgZmlsZSBmb3IgdGhpcyBzZXJ2bGV0LgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGpzcEZpbGUgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgbG9hZC1vbi1zdGFydHVwIG9yZGVyIHZhbHVlIChuZWdhdGl2ZSB2YWx1ZSBtZWFucyBsb2FkIG9uCisgICAgICogZmlyc3QgY2FsbCkgZm9yIHRoaXMgc2VydmxldC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBsb2FkT25TdGFydHVwID0gLTE7CisKKworICAgIC8qKgorICAgICAqIE1hcHBpbmdzIGFzc29jaWF0ZWQgd2l0aCB0aGUgd3JhcHBlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIEFycmF5TGlzdCBtYXBwaW5ncyA9IG5ldyBBcnJheUxpc3QoKTsKKworCisgICAgLyoqCisgICAgICogVGhlIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMgZm9yIHRoaXMgc2VydmxldCwga2V5ZWQgYnkKKyAgICAgKiBwYXJhbWV0ZXIgbmFtZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIEhhc2hNYXAgcGFyYW1ldGVycyA9IG5ldyBIYXNoTWFwKCk7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzZWN1cml0eSByb2xlIHJlZmVyZW5jZXMgZm9yIHRoaXMgc2VydmxldCwga2V5ZWQgYnkgcm9sZSBuYW1lCisgICAgICogdXNlZCBpbiB0aGUgc2VydmxldC4gIFRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIGlzIHRoZSByb2xlIG5hbWUgb2YKKyAgICAgKiB0aGUgd2ViIGFwcGxpY2F0aW9uIGl0c2VsZi4KKyAgICAgKi8KKyAgICBwcml2YXRlIEhhc2hNYXAgcmVmZXJlbmNlcyA9IG5ldyBIYXNoTWFwKCk7CisKKworICAgIC8qKgorICAgICAqIFRoZSBydW4tYXMgaWRlbnRpdHkgZm9yIHRoaXMgc2VydmxldC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBydW5BcyA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbm90aWZpY2F0aW9uIHNlcXVlbmNlIG51bWJlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIGxvbmcgc2VxdWVuY2VOdW1iZXIgPSAwOworCisgICAgLyoqCisgICAgICogVGhlIGZ1bGx5IHF1YWxpZmllZCBzZXJ2bGV0IGNsYXNzIG5hbWUgZm9yIHRoaXMgc2VydmxldC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBzZXJ2bGV0Q2xhc3MgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBEb2VzIHRoaXMgc2VydmxldCBpbXBsZW1lbnQgdGhlIFNpbmdsZVRocmVhZE1vZGVsIGludGVyZmFjZT8KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gc2luZ2xlVGhyZWFkTW9kZWwgPSBmYWxzZTsKKworCisgICAgLyoqCisgICAgICogQXJlIHdlIHVubG9hZGluZyBvdXIgc2VydmxldCBpbnN0YW5jZSBhdCB0aGUgbW9tZW50PworICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiB1bmxvYWRpbmcgPSBmYWxzZTsKKworCisgICAgLyoqCisgICAgICogTWF4aW11bSBudW1iZXIgb2YgU1RNIGluc3RhbmNlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBtYXhJbnN0YW5jZXMgPSAyMDsKKworCisgICAgLyoqCisgICAgICogTnVtYmVyIG9mIGluc3RhbmNlcyBjdXJyZW50bHkgbG9hZGVkIGZvciBhIFNUTSBzZXJ2bGV0LgorICAgICAqLworICAgIHByaXZhdGUgaW50IG5JbnN0YW5jZXMgPSAwOworCisKKyAgICAvKioKKyAgICAgKiBTdGFjayBjb250YWluaW5nIHRoZSBTVE0gaW5zdGFuY2VzLgorICAgICAqLworICAgIHByaXZhdGUgU3RhY2sgaW5zdGFuY2VQb29sID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVHJ1ZSBpZiB0aGlzIFN0YW5kYXJkV3JhcHBlciBpcyBmb3IgdGhlIEpzcFNlcnZsZXQKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaXNKc3BTZXJ2bGV0OworCisKKyAgICAvKioKKyAgICAgKiBUaGUgT2JqZWN0TmFtZSBvZiB0aGUgSlNQIG1vbml0b3JpbmcgbWJlYW4KKyAgICAgKi8KKyAgICBwcml2YXRlIE9iamVjdE5hbWUganNwTW9uaXRvck9OOworCisKKyAgICAvKioKKyAgICAgKiBTaG91bGQgd2Ugc3dhbGxvdyBTeXN0ZW0ub3V0CisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHN3YWxsb3dPdXRwdXQgPSBmYWxzZTsKKworICAgIC8vIFRvIHN1cHBvcnQgam14IGF0dHJpYnV0ZXMKKyAgICBwcml2YXRlIFN0YW5kYXJkV3JhcHBlclZhbHZlIHN3VmFsdmU7CisgICAgcHJpdmF0ZSBsb25nIGxvYWRUaW1lPTA7CisgICAgcHJpdmF0ZSBpbnQgY2xhc3NMb2FkVGltZT0wOworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgYXZhaWxhYmxlIGRhdGUvdGltZSBmb3IgdGhpcyBzZXJ2bGV0LCBpbiBtaWxsaXNlY29uZHMgc2luY2UKKyAgICAgKiB0aGUgZXBvY2guICBJZiB0aGlzIGRhdGUvdGltZSBpcyBMb25nLk1BWF9WQUxVRSwgaXQgaXMgY29uc2lkZXJlZCB0byBtZWFuCisgICAgICogdGhhdCB1bmF2YWlsYWJpbGl0eSBpcyBwZXJtYW5lbnQgYW5kIGFueSByZXF1ZXN0IGZvciB0aGlzIHNlcnZsZXQgd2lsbCByZXR1cm4KKyAgICAgKiBhbiBTQ19OT1RfRk9VTkQgZXJyb3IuICBJZiB0aGlzIGRhdGUvdGltZSBpcyBpbiB0aGUgZnV0dXJlLCBhbnkgcmVxdWVzdCBmb3IKKyAgICAgKiB0aGlzIHNlcnZsZXQgd2lsbCByZXR1cm4gYW4gU0NfU0VSVklDRV9VTkFWQUlMQUJMRSBlcnJvci4gIElmIGl0IGlzIHplcm8sCisgICAgICogdGhlIHNlcnZsZXQgaXMgY3VycmVudGx5IGF2YWlsYWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRBdmFpbGFibGUoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLmF2YWlsYWJsZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYXZhaWxhYmxlIGRhdGUvdGltZSBmb3IgdGhpcyBzZXJ2bGV0LCBpbiBtaWxsaXNlY29uZHMgc2luY2UgdGhlCisgICAgICogZXBvY2guICBJZiB0aGlzIGRhdGUvdGltZSBpcyBMb25nLk1BWF9WQUxVRSwgaXQgaXMgY29uc2lkZXJlZCB0byBtZWFuCisgICAgICogdGhhdCB1bmF2YWlsYWJpbGl0eSBpcyBwZXJtYW5lbnQgYW5kIGFueSByZXF1ZXN0IGZvciB0aGlzIHNlcnZsZXQgd2lsbCByZXR1cm4KKyAgICAgKiBhbiBTQ19OT1RfRk9VTkQgZXJyb3IuIElmIHRoaXMgZGF0ZS90aW1lIGlzIGluIHRoZSBmdXR1cmUsIGFueSByZXF1ZXN0IGZvcgorICAgICAqIHRoaXMgc2VydmxldCB3aWxsIHJldHVybiBhbiBTQ19TRVJWSUNFX1VOQVZBSUxBQkxFIGVycm9yLgorICAgICAqCisgICAgICogQHBhcmFtIGF2YWlsYWJsZSBUaGUgbmV3IGF2YWlsYWJsZSBkYXRlL3RpbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBdmFpbGFibGUobG9uZyBhdmFpbGFibGUpIHsKKworICAgICAgICBsb25nIG9sZEF2YWlsYWJsZSA9IHRoaXMuYXZhaWxhYmxlOworICAgICAgICBpZiAoYXZhaWxhYmxlID4gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpCisgICAgICAgICAgICB0aGlzLmF2YWlsYWJsZSA9IGF2YWlsYWJsZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdGhpcy5hdmFpbGFibGUgPSAwTDsKKyAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoImF2YWlsYWJsZSIsIG5ldyBMb25nKG9sZEF2YWlsYWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBMb25nKHRoaXMuYXZhaWxhYmxlKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGFjdGl2ZSBhbGxvY2F0aW9ucyBvZiB0aGlzIHNlcnZsZXQsIGV2ZW4gaWYgdGhleQorICAgICAqIGFyZSBhbGwgZm9yIHRoZSBzYW1lIGluc3RhbmNlIChhcyB3aWxsIGJlIHRydWUgZm9yIHNlcnZsZXRzIHRoYXQgZG8KKyAgICAgKiBub3QgaW1wbGVtZW50IDxjb2RlPlNpbmdsZVRocmVhZE1vZGVsPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldENvdW50QWxsb2NhdGVkKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5jb3VudEFsbG9jYXRlZCk7CisKKyAgICB9CisKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW5naW5lTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICgoU3RhbmRhcmRDb250ZXh0KWdldFBhcmVudCgpKS5nZXRFbmdpbmVOYW1lKCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBDb250YWluZXIgaW1wbGVtZW50YXRpb24gYW5kCisgICAgICogdGhlIGNvcnJlc3BvbmRpbmcgdmVyc2lvbiBudW1iZXIsIGluIHRoZSBmb3JtYXQKKyAgICAgKiA8Y29kZT4mbHQ7ZGVzY3JpcHRpb24mZ3Q7LyZsdDt2ZXJzaW9uJmd0OzwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJbmZvKCkgeworCisgICAgICAgIHJldHVybiAoaW5mbyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgSW5zdGFuY2VTdXBwb3J0IG9iamVjdCBmb3IgdGhpcyBXcmFwcGVyIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBJbnN0YW5jZVN1cHBvcnQgZ2V0SW5zdGFuY2VTdXBwb3J0KCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5pbnN0YW5jZVN1cHBvcnQpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGNvbnRleHQtcmVsYXRpdmUgVVJJIG9mIHRoZSBKU1AgZmlsZSBmb3IgdGhpcyBzZXJ2bGV0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SnNwRmlsZSgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMuanNwRmlsZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY29udGV4dC1yZWxhdGl2ZSBVUkkgb2YgdGhlIEpTUCBmaWxlIGZvciB0aGlzIHNlcnZsZXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0ganNwRmlsZSBKU1AgZmlsZSBVUkkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRKc3BGaWxlKFN0cmluZyBqc3BGaWxlKSB7CisKKyAgICAgICAgU3RyaW5nIG9sZEpzcEZpbGUgPSB0aGlzLmpzcEZpbGU7CisgICAgICAgIHRoaXMuanNwRmlsZSA9IGpzcEZpbGU7CisgICAgICAgIHN1cHBvcnQuZmlyZVByb3BlcnR5Q2hhbmdlKCJqc3BGaWxlIiwgb2xkSnNwRmlsZSwgdGhpcy5qc3BGaWxlKTsKKyAgICAgICAgaXNKc3BTZXJ2bGV0ID0gdHJ1ZTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBsb2FkLW9uLXN0YXJ0dXAgb3JkZXIgdmFsdWUgKG5lZ2F0aXZlIHZhbHVlIG1lYW5zCisgICAgICogbG9hZCBvbiBmaXJzdCBjYWxsKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldExvYWRPblN0YXJ0dXAoKSB7CisKKyAgICAgICAgaWYgKGlzSnNwU2VydmxldCAmJiBsb2FkT25TdGFydHVwIDwgMCkgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIEpzcFNlcnZsZXQgbXVzdCBhbHdheXMgYmUgcHJlbG9hZGVkLCBiZWNhdXNlIGl0cyBpbnN0YW5jZSBpcworICAgICAgICAgICAgICogdXNlZCBkdXJpbmcgcmVnaXN0ZXJKTVggKHdoZW4gcmVnaXN0ZXJpbmcgdGhlIEpTUAorICAgICAgICAgICAgICogbW9uaXRvcmluZyBtYmVhbikKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLk1BWF9WQUxVRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAodGhpcy5sb2FkT25TdGFydHVwKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBsb2FkLW9uLXN0YXJ0dXAgb3JkZXIgdmFsdWUgKG5lZ2F0aXZlIHZhbHVlIG1lYW5zCisgICAgICogbG9hZCBvbiBmaXJzdCBjYWxsKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZSBOZXcgbG9hZC1vbi1zdGFydHVwIHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TG9hZE9uU3RhcnR1cChpbnQgdmFsdWUpIHsKKworICAgICAgICBpbnQgb2xkTG9hZE9uU3RhcnR1cCA9IHRoaXMubG9hZE9uU3RhcnR1cDsKKyAgICAgICAgdGhpcy5sb2FkT25TdGFydHVwID0gdmFsdWU7CisgICAgICAgIHN1cHBvcnQuZmlyZVByb3BlcnR5Q2hhbmdlKCJsb2FkT25TdGFydHVwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEludGVnZXIob2xkTG9hZE9uU3RhcnR1cCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbnRlZ2VyKHRoaXMubG9hZE9uU3RhcnR1cCkpOworCisgICAgfQorCisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbG9hZC1vbi1zdGFydHVwIG9yZGVyIHZhbHVlIGZyb20gYSAocG9zc2libHkgbnVsbCkgc3RyaW5nLgorICAgICAqIFBlciB0aGUgc3BlY2lmaWNhdGlvbiwgYW55IG1pc3Npbmcgb3Igbm9uLW51bWVyaWMgdmFsdWUgaXMgY29udmVydGVkCisgICAgICogdG8gYSB6ZXJvLCBzbyB0aGF0IHRoaXMgc2VydmxldCB3aWxsIHN0aWxsIGJlIGxvYWRlZCBhdCBzdGFydHVwCisgICAgICogdGltZSwgYnV0IGluIGFuIGFyYml0cmFyeSBvcmRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZSBOZXcgbG9hZC1vbi1zdGFydHVwIHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TG9hZE9uU3RhcnR1cFN0cmluZyhTdHJpbmcgdmFsdWUpIHsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgc2V0TG9hZE9uU3RhcnR1cChJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKSk7CisgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBzZXRMb2FkT25TdGFydHVwKDApOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRMb2FkT25TdGFydHVwU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gSW50ZWdlci50b1N0cmluZyggZ2V0TG9hZE9uU3RhcnR1cCgpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBtYXhpbXVtIG51bWJlciBvZiBpbnN0YW5jZXMgdGhhdCB3aWxsIGJlIGFsbG9jYXRlZCB3aGVuIGEgc2luZ2xlCisgICAgICogdGhyZWFkIG1vZGVsIHNlcnZsZXQgaXMgdXNlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldE1heEluc3RhbmNlcygpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMubWF4SW5zdGFuY2VzKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBpbnN0YW5jZXMgdGhhdCB3aWxsIGJlIGFsbG9jYXRlZCB3aGVuIGEgc2luZ2xlCisgICAgICogdGhyZWFkIG1vZGVsIHNlcnZsZXQgaXMgdXNlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXhJbnN0YW5jZXMgTmV3IHZhbHVlIG9mIG1heEluc3RhbmNlcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1heEluc3RhbmNlcyhpbnQgbWF4SW5zdGFuY2VzKSB7CisKKyAgICAgICAgaW50IG9sZE1heEluc3RhbmNlcyA9IHRoaXMubWF4SW5zdGFuY2VzOworICAgICAgICB0aGlzLm1heEluc3RhbmNlcyA9IG1heEluc3RhbmNlczsKKyAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoIm1heEluc3RhbmNlcyIsIG9sZE1heEluc3RhbmNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXhJbnN0YW5jZXMpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHBhcmVudCBDb250YWluZXIgb2YgdGhpcyBXcmFwcGVyLCBidXQgb25seSBpZiBpdCBpcyBhIENvbnRleHQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGFpbmVyIFByb3Bvc2VkIHBhcmVudCBDb250YWluZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXJlbnQoQ29udGFpbmVyIGNvbnRhaW5lcikgeworCisgICAgICAgIGlmICgoY29udGFpbmVyICE9IG51bGwpICYmCisgICAgICAgICAgICAhKGNvbnRhaW5lciBpbnN0YW5jZW9mIENvbnRleHQpKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInN0YW5kYXJkV3JhcHBlci5ub3RDb250ZXh0IikpOworICAgICAgICBpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgU3RhbmRhcmRDb250ZXh0KSB7CisgICAgICAgICAgICBzd2FsbG93T3V0cHV0ID0gKChTdGFuZGFyZENvbnRleHQpY29udGFpbmVyKS5nZXRTd2FsbG93T3V0cHV0KCk7CisgICAgICAgIH0KKyAgICAgICAgc3VwZXIuc2V0UGFyZW50KGNvbnRhaW5lcik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcnVuLWFzIGlkZW50aXR5IGZvciB0aGlzIHNlcnZsZXQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRSdW5BcygpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMucnVuQXMpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHJ1bi1hcyBpZGVudGl0eSBmb3IgdGhpcyBzZXJ2bGV0LgorICAgICAqCisgICAgICogQHBhcmFtIHJ1bkFzIE5ldyBydW4tYXMgaWRlbnRpdHkgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSdW5BcyhTdHJpbmcgcnVuQXMpIHsKKworICAgICAgICBTdHJpbmcgb2xkUnVuQXMgPSB0aGlzLnJ1bkFzOworICAgICAgICB0aGlzLnJ1bkFzID0gcnVuQXM7CisgICAgICAgIHN1cHBvcnQuZmlyZVByb3BlcnR5Q2hhbmdlKCJydW5BcyIsIG9sZFJ1bkFzLCB0aGlzLnJ1bkFzKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBmdWxseSBxdWFsaWZpZWQgc2VydmxldCBjbGFzcyBuYW1lIGZvciB0aGlzIHNlcnZsZXQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTZXJ2bGV0Q2xhc3MoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLnNlcnZsZXRDbGFzcyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZnVsbHkgcXVhbGlmaWVkIHNlcnZsZXQgY2xhc3MgbmFtZSBmb3IgdGhpcyBzZXJ2bGV0LgorICAgICAqCisgICAgICogQHBhcmFtIHNlcnZsZXRDbGFzcyBTZXJ2bGV0IGNsYXNzIG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2bGV0Q2xhc3MoU3RyaW5nIHNlcnZsZXRDbGFzcykgeworCisgICAgICAgIFN0cmluZyBvbGRTZXJ2bGV0Q2xhc3MgPSB0aGlzLnNlcnZsZXRDbGFzczsKKyAgICAgICAgdGhpcy5zZXJ2bGV0Q2xhc3MgPSBzZXJ2bGV0Q2xhc3M7CisgICAgICAgIHN1cHBvcnQuZmlyZVByb3BlcnR5Q2hhbmdlKCJzZXJ2bGV0Q2xhc3MiLCBvbGRTZXJ2bGV0Q2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VydmxldENsYXNzKTsKKyAgICAgICAgaWYgKENvbnN0YW50cy5KU1BfU0VSVkxFVF9DTEFTUy5lcXVhbHMoc2VydmxldENsYXNzKSkgeworICAgICAgICAgICAgaXNKc3BTZXJ2bGV0ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG5hbWUgb2YgdGhpcyBzZXJ2bGV0LiAgVGhpcyBpcyBhbiBhbGlhcyBmb3IgdGhlIG5vcm1hbAorICAgICAqIDxjb2RlPkNvbnRhaW5lci5zZXROYW1lKCk8L2NvZGU+IG1ldGhvZCwgYW5kIGNvbXBsZW1lbnRzIHRoZQorICAgICAqIDxjb2RlPmdldFNlcnZsZXROYW1lKCk8L2NvZGU+IG1ldGhvZCByZXF1aXJlZCBieSB0aGUKKyAgICAgKiA8Y29kZT5TZXJ2bGV0Q29uZmlnPC9jb2RlPiBpbnRlcmZhY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmV3IG5hbWUgb2YgdGhpcyBzZXJ2bGV0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2VydmxldE5hbWUoU3RyaW5nIG5hbWUpIHsKKworICAgICAgICBzZXROYW1lKG5hbWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNlcnZsZXQgY2xhc3MgcmVwcmVzZW50ZWQgYnkgdGhpcworICAgICAqIGNvbXBvbmVudCBpbXBsZW1lbnRzIHRoZSA8Y29kZT5TaW5nbGVUaHJlYWRNb2RlbDwvY29kZT4gaW50ZXJmYWNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzU2luZ2xlVGhyZWFkTW9kZWwoKSB7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGxvYWRTZXJ2bGV0KCk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChzaW5nbGVUaHJlYWRNb2RlbCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIElzIHRoaXMgc2VydmxldCBjdXJyZW50bHkgdW5hdmFpbGFibGU/CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNVbmF2YWlsYWJsZSgpIHsKKworICAgICAgICBpZiAoYXZhaWxhYmxlID09IDBMKQorICAgICAgICAgICAgcmV0dXJuIChmYWxzZSk7CisgICAgICAgIGVsc2UgaWYgKGF2YWlsYWJsZSA8PSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSkgeworICAgICAgICAgICAgYXZhaWxhYmxlID0gMEw7CisgICAgICAgICAgICByZXR1cm4gKGZhbHNlKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICByZXR1cm4gKHRydWUpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmVmdXNlIHRvIGFkZCBhIGNoaWxkIENvbnRhaW5lciwgYmVjYXVzZSBXcmFwcGVycyBhcmUgdGhlIGxvd2VzdCBsZXZlbAorICAgICAqIG9mIHRoZSBDb250YWluZXIgaGllcmFyY2h5LgorICAgICAqCisgICAgICogQHBhcmFtIGNoaWxkIENoaWxkIGNvbnRhaW5lciB0byBiZSBhZGRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZENoaWxkKENvbnRhaW5lciBjaGlsZCkgeworCisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInN0YW5kYXJkV3JhcHBlci5ub3RDaGlsZCIpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQWRkIGEgbmV3IHNlcnZsZXQgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyIGZvciB0aGlzIHNlcnZsZXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoaXMgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyIHRvIGFkZAorICAgICAqIEBwYXJhbSB2YWx1ZSBWYWx1ZSBvZiB0aGlzIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlciB0byBhZGQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRJbml0UGFyYW1ldGVyKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKHBhcmFtZXRlcnMpIHsKKyAgICAgICAgICAgIHBhcmFtZXRlcnMucHV0KG5hbWUsIHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBmaXJlQ29udGFpbmVyRXZlbnQoImFkZEluaXRQYXJhbWV0ZXIiLCBuYW1lKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQWRkIGEgbmV3IGxpc3RlbmVyIGludGVyZXN0ZWQgaW4gSW5zdGFuY2VFdmVudHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIG5ldyBsaXN0ZW5lcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEluc3RhbmNlTGlzdGVuZXIoSW5zdGFuY2VMaXN0ZW5lciBsaXN0ZW5lcikgeworCisgICAgICAgIGluc3RhbmNlU3VwcG9ydC5hZGRJbnN0YW5jZUxpc3RlbmVyKGxpc3RlbmVyKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQWRkIGEgbWFwcGluZyBhc3NvY2lhdGVkIHdpdGggdGhlIFdyYXBwZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgbmV3IHdyYXBwZXIgbWFwcGluZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZE1hcHBpbmcoU3RyaW5nIG1hcHBpbmcpIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKG1hcHBpbmdzKSB7CisgICAgICAgICAgICBtYXBwaW5ncy5hZGQobWFwcGluZyk7CisgICAgICAgIH0KKyAgICAgICAgZmlyZUNvbnRhaW5lckV2ZW50KCJhZGRNYXBwaW5nIiwgbWFwcGluZyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEFkZCBhIG5ldyBzZWN1cml0eSByb2xlIHJlZmVyZW5jZSByZWNvcmQgdG8gdGhlIHNldCBvZiByZWNvcmRzIGZvcgorICAgICAqIHRoaXMgc2VydmxldC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIFJvbGUgbmFtZSB1c2VkIHdpdGhpbiB0aGlzIHNlcnZsZXQKKyAgICAgKiBAcGFyYW0gbGluayBSb2xlIG5hbWUgdXNlZCB3aXRoaW4gdGhlIHdlYiBhcHBsaWNhdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFNlY3VyaXR5UmVmZXJlbmNlKFN0cmluZyBuYW1lLCBTdHJpbmcgbGluaykgeworCisgICAgICAgIHN5bmNocm9uaXplZCAocmVmZXJlbmNlcykgeworICAgICAgICAgICAgcmVmZXJlbmNlcy5wdXQobmFtZSwgbGluayk7CisgICAgICAgIH0KKyAgICAgICAgZmlyZUNvbnRhaW5lckV2ZW50KCJhZGRTZWN1cml0eVJlZmVyZW5jZSIsIG5hbWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBbGxvY2F0ZSBhbiBpbml0aWFsaXplZCBpbnN0YW5jZSBvZiB0aGlzIFNlcnZsZXQgdGhhdCBpcyByZWFkeSB0byBoYXZlCisgICAgICogaXRzIDxjb2RlPnNlcnZpY2UoKTwvY29kZT4gbWV0aG9kIGNhbGxlZC4gIElmIHRoZSBzZXJ2bGV0IGNsYXNzIGRvZXMKKyAgICAgKiBub3QgaW1wbGVtZW50IDxjb2RlPlNpbmdsZVRocmVhZE1vZGVsPC9jb2RlPiwgdGhlIChvbmx5KSBpbml0aWFsaXplZAorICAgICAqIGluc3RhbmNlIG1heSBiZSByZXR1cm5lZCBpbW1lZGlhdGVseS4gIElmIHRoZSBzZXJ2bGV0IGNsYXNzIGltcGxlbWVudHMKKyAgICAgKiA8Y29kZT5TaW5nbGVUaHJlYWRNb2RlbDwvY29kZT4sIHRoZSBXcmFwcGVyIGltcGxlbWVudGF0aW9uIG11c3QgZW5zdXJlCisgICAgICogdGhhdCB0aGlzIGluc3RhbmNlIGlzIG5vdCBhbGxvY2F0ZWQgYWdhaW4gdW50aWwgaXQgaXMgZGVhbGxvY2F0ZWQgYnkgYQorICAgICAqIGNhbGwgdG8gPGNvZGU+ZGVhbGxvY2F0ZSgpPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiB0aGUgc2VydmxldCBpbml0KCkgbWV0aG9kIHRocmV3CisgICAgICogIGFuIGV4Y2VwdGlvbgorICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIGxvYWRpbmcgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIFNlcnZsZXQgYWxsb2NhdGUoKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gSWYgd2UgYXJlIGN1cnJlbnRseSB1bmxvYWRpbmcgdGhpcyBzZXJ2bGV0LCB0aHJvdyBhbiBleGNlcHRpb24KKyAgICAgICAgaWYgKHVubG9hZGluZykKKyAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uCisgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInN0YW5kYXJkV3JhcHBlci51bmxvYWRpbmciLCBnZXROYW1lKCkpKTsKKworICAgICAgICAvLyBJZiBub3QgU2luZ2xlVGhyZWFkZWRNb2RlbCwgcmV0dXJuIHRoZSBzYW1lIGluc3RhbmNlIGV2ZXJ5IHRpbWUKKyAgICAgICAgaWYgKCFzaW5nbGVUaHJlYWRNb2RlbCkgeworCisgICAgICAgICAgICAvLyBMb2FkIGFuZCBpbml0aWFsaXplIG91ciBpbnN0YW5jZSBpZiBuZWNlc3NhcnkKKyAgICAgICAgICAgIGlmIChpbnN0YW5jZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJBbGxvY2F0aW5nIG5vbi1TVE0gaW5zdGFuY2UiKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlID0gbG9hZFNlcnZsZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNlcnZsZXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInN0YW5kYXJkV3JhcHBlci5hbGxvY2F0ZSIpLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFzaW5nbGVUaHJlYWRNb2RlbCkgeworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgbG9nLnRyYWNlKCIgIFJldHVybmluZyBub24tU1RNIGluc3RhbmNlIik7CisgICAgICAgICAgICAgICAgY291bnRBbGxvY2F0ZWQrKzsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGluc3RhbmNlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgc3luY2hyb25pemVkIChpbnN0YW5jZVBvb2wpIHsKKworICAgICAgICAgICAgd2hpbGUgKGNvdW50QWxsb2NhdGVkID49IG5JbnN0YW5jZXMpIHsKKyAgICAgICAgICAgICAgICAvLyBBbGxvY2F0ZSBhIG5ldyBpbnN0YW5jZSBpZiBwb3NzaWJsZSwgb3IgZWxzZSB3YWl0CisgICAgICAgICAgICAgICAgaWYgKG5JbnN0YW5jZXMgPCBtYXhJbnN0YW5jZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlUG9vbC5wdXNoKGxvYWRTZXJ2bGV0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgbkluc3RhbmNlcysrOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChTZXJ2bGV0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInN0YW5kYXJkV3JhcHBlci5hbGxvY2F0ZSIpLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZVBvb2wud2FpdCgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLnRyYWNlKCIgIFJldHVybmluZyBhbGxvY2F0ZWQgU1RNIGluc3RhbmNlIik7CisgICAgICAgICAgICBjb3VudEFsbG9jYXRlZCsrOworICAgICAgICAgICAgcmV0dXJuIChTZXJ2bGV0KSBpbnN0YW5jZVBvb2wucG9wKCk7CisKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhpcyBwcmV2aW91c2x5IGFsbG9jYXRlZCBzZXJ2bGV0IHRvIHRoZSBwb29sIG9mIGF2YWlsYWJsZQorICAgICAqIGluc3RhbmNlcy4gIElmIHRoaXMgc2VydmxldCBjbGFzcyBkb2VzIG5vdCBpbXBsZW1lbnQgU2luZ2xlVGhyZWFkTW9kZWwsCisgICAgICogbm8gYWN0aW9uIGlzIGFjdHVhbGx5IHJlcXVpcmVkLgorICAgICAqCisgICAgICogQHBhcmFtIHNlcnZsZXQgVGhlIHNlcnZsZXQgdG8gYmUgcmV0dXJuZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIGRlYWxsb2NhdGlvbiBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkZWFsbG9jYXRlKFNlcnZsZXQgc2VydmxldCkgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIElmIG5vdCBTaW5nbGVUaHJlYWRNb2RlbCwgbm8gYWN0aW9uIGlzIHJlcXVpcmVkCisgICAgICAgIGlmICghc2luZ2xlVGhyZWFkTW9kZWwpIHsKKyAgICAgICAgICAgIGNvdW50QWxsb2NhdGVkLS07CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBVbmxvY2sgYW5kIGZyZWUgdGhpcyBpbnN0YW5jZQorICAgICAgICBzeW5jaHJvbml6ZWQgKGluc3RhbmNlUG9vbCkgeworICAgICAgICAgICAgY291bnRBbGxvY2F0ZWQtLTsKKyAgICAgICAgICAgIGluc3RhbmNlUG9vbC5wdXNoKHNlcnZsZXQpOworICAgICAgICAgICAgaW5zdGFuY2VQb29sLm5vdGlmeSgpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyIG5hbWUsCisgICAgICogaWYgYW55OyBvdGhlcndpc2UgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgcmVxdWVzdGVkIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZmluZEluaXRQYXJhbWV0ZXIoU3RyaW5nIG5hbWUpIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKHBhcmFtZXRlcnMpIHsKKyAgICAgICAgICAgIHJldHVybiAoKFN0cmluZykgcGFyYW1ldGVycy5nZXQobmFtZSkpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbmFtZXMgb2YgYWxsIGRlZmluZWQgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycyBmb3IgdGhpcworICAgICAqIHNlcnZsZXQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGZpbmRJbml0UGFyYW1ldGVycygpIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKHBhcmFtZXRlcnMpIHsKKyAgICAgICAgICAgIFN0cmluZyByZXN1bHRzW10gPSBuZXcgU3RyaW5nW3BhcmFtZXRlcnMuc2l6ZSgpXTsKKyAgICAgICAgICAgIHJldHVybiAoKFN0cmluZ1tdKSBwYXJhbWV0ZXJzLmtleVNldCgpLnRvQXJyYXkocmVzdWx0cykpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbWFwcGluZ3MgYXNzb2NpYXRlZCB3aXRoIHRoaXMgd3JhcHBlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZmluZE1hcHBpbmdzKCkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAobWFwcGluZ3MpIHsKKyAgICAgICAgICAgIHJldHVybiAoU3RyaW5nW10pIG1hcHBpbmdzLnRvQXJyYXkobmV3IFN0cmluZ1ttYXBwaW5ncy5zaXplKCldKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNlY3VyaXR5IHJvbGUgbGluayBmb3IgdGhlIHNwZWNpZmllZCBzZWN1cml0eSByb2xlCisgICAgICogcmVmZXJlbmNlIG5hbWUsIGlmIGFueTsgb3RoZXJ3aXNlIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIFNlY3VyaXR5IHJvbGUgcmVmZXJlbmNlIHVzZWQgd2l0aGluIHRoaXMgc2VydmxldAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZmluZFNlY3VyaXR5UmVmZXJlbmNlKFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgc3luY2hyb25pemVkIChyZWZlcmVuY2VzKSB7CisgICAgICAgICAgICByZXR1cm4gKChTdHJpbmcpIHJlZmVyZW5jZXMuZ2V0KG5hbWUpKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNldCBvZiBzZWN1cml0eSByb2xlIHJlZmVyZW5jZSBuYW1lcyBhc3NvY2lhdGVkIHdpdGgKKyAgICAgKiB0aGlzIHNlcnZsZXQsIGlmIGFueTsgb3RoZXJ3aXNlIHJldHVybiBhIHplcm8tbGVuZ3RoIGFycmF5LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBmaW5kU2VjdXJpdHlSZWZlcmVuY2VzKCkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAocmVmZXJlbmNlcykgeworICAgICAgICAgICAgU3RyaW5nIHJlc3VsdHNbXSA9IG5ldyBTdHJpbmdbcmVmZXJlbmNlcy5zaXplKCldOworICAgICAgICAgICAgcmV0dXJuICgoU3RyaW5nW10pIHJlZmVyZW5jZXMua2V5U2V0KCkudG9BcnJheShyZXN1bHRzKSk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogRklYTUU6IEZvb2xpbmcgaW50cm9zcGVjdGlvbiAuLi4KKyAgICAgKi8KKyAgICBwdWJsaWMgV3JhcHBlciBmaW5kTWFwcGluZ09iamVjdCgpIHsKKyAgICAgICAgcmV0dXJuIChXcmFwcGVyKSBnZXRNYXBwaW5nT2JqZWN0KCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBMb2FkIGFuZCBpbml0aWFsaXplIGFuIGluc3RhbmNlIG9mIHRoaXMgc2VydmxldCwgaWYgdGhlcmUgaXMgbm90IGFscmVhZHkKKyAgICAgKiBhdCBsZWFzdCBvbmUgaW5pdGlhbGl6ZWQgaW5zdGFuY2UuICBUaGlzIGNhbiBiZSB1c2VkLCBmb3IgZXhhbXBsZSwgdG8KKyAgICAgKiBsb2FkIHNlcnZsZXRzIHRoYXQgYXJlIG1hcmtlZCBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIHRvIGJlIGxvYWRlZAorICAgICAqIGF0IHNlcnZlciBzdGFydHVwIHRpbWUuCisgICAgICogPHA+CisgICAgICogPGI+SU1QTEVNRU5UQVRJT04gTk9URTwvYj46ICBTZXJ2bGV0cyB3aG9zZSBjbGFzc25hbWVzIGJlZ2luIHdpdGgKKyAgICAgKiA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLjwvY29kZT4gKHNvLWNhbGxlZCAiY29udGFpbmVyIiBzZXJ2bGV0cykKKyAgICAgKiBhcmUgbG9hZGVkIGJ5IHRoZSBzYW1lIGNsYXNzbG9hZGVyIHRoYXQgbG9hZGVkIHRoaXMgY2xhc3MsIHJhdGhlciB0aGFuCisgICAgICogdGhlIGNsYXNzbG9hZGVyIGZvciB0aGUgY3VycmVudCB3ZWIgYXBwbGljYXRpb24uCisgICAgICogVGhpcyBnaXZlcyBzdWNoIGNsYXNzZXMgYWNjZXNzIHRvIENhdGFsaW5hIGludGVybmFscywgd2hpY2ggYXJlCisgICAgICogcHJldmVudGVkIGZvciBjbGFzc2VzIGxvYWRlZCBmb3Igd2ViIGFwcGxpY2F0aW9ucy4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiB0aGUgc2VydmxldCBpbml0KCkgbWV0aG9kIHRocmV3CisgICAgICogIGFuIGV4Y2VwdGlvbgorICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBzb21lIG90aGVyIGxvYWRpbmcgcHJvYmxlbSBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgbG9hZCgpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKKyAgICAgICAgaW5zdGFuY2UgPSBsb2FkU2VydmxldCgpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogTG9hZCBhbmQgaW5pdGlhbGl6ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIHNlcnZsZXQsIGlmIHRoZXJlIGlzIG5vdCBhbHJlYWR5CisgICAgICogYXQgbGVhc3Qgb25lIGluaXRpYWxpemVkIGluc3RhbmNlLiAgVGhpcyBjYW4gYmUgdXNlZCwgZm9yIGV4YW1wbGUsIHRvCisgICAgICogbG9hZCBzZXJ2bGV0cyB0aGF0IGFyZSBtYXJrZWQgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciB0byBiZSBsb2FkZWQKKyAgICAgKiBhdCBzZXJ2ZXIgc3RhcnR1cCB0aW1lLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU2VydmxldCBsb2FkU2VydmxldCgpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICAvLyBOb3RoaW5nIHRvIGRvIGlmIHdlIGFscmVhZHkgaGF2ZSBhbiBpbnN0YW5jZSBvciBhbiBpbnN0YW5jZSBwb29sCisgICAgICAgIGlmICghc2luZ2xlVGhyZWFkTW9kZWwgJiYgKGluc3RhbmNlICE9IG51bGwpKQorICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlOworCisgICAgICAgIFByaW50U3RyZWFtIG91dCA9IFN5c3RlbS5vdXQ7CisgICAgICAgIGlmIChzd2FsbG93T3V0cHV0KSB7CisgICAgICAgICAgICBTeXN0ZW1Mb2dIYW5kbGVyLnN0YXJ0Q2FwdHVyZSgpOworICAgICAgICB9CisKKyAgICAgICAgU2VydmxldCBzZXJ2bGV0OworICAgICAgICB0cnkgeworICAgICAgICAgICAgbG9uZyB0MT1TeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgIC8vIElmIHRoaXMgInNlcnZsZXQiIGlzIHJlYWxseSBhIEpTUCBmaWxlLCBnZXQgdGhlIHJpZ2h0IGNsYXNzLgorICAgICAgICAgICAgLy8gSE9MRCBZT1VSIE5PU0UgLSB0aGlzIGlzIGEga2x1ZGdlIHRoYXQgYXZvaWRzIGhhdmluZyB0byBkbyBzcGVjaWFsCisgICAgICAgICAgICAvLyBjYXNlIENhdGFsaW5hLXNwZWNpZmljIGNvZGUgaW4gSmFzcGVyIC0gaXQgYWxzbyByZXF1aXJlcyB0aGF0IHRoZQorICAgICAgICAgICAgLy8gc2VydmxldCBwYXRoIGJlIHJlcGxhY2VkIGJ5IHRoZSA8anNwLWZpbGU+IGVsZW1lbnQgY29udGVudCBpbgorICAgICAgICAgICAgLy8gb3JkZXIgdG8gYmUgY29tcGxldGVseSBlZmZlY3RpdmUKKyAgICAgICAgICAgIFN0cmluZyBhY3R1YWxDbGFzcyA9IHNlcnZsZXRDbGFzczsKKyAgICAgICAgICAgIGlmICgoYWN0dWFsQ2xhc3MgPT0gbnVsbCkgJiYgKGpzcEZpbGUgIT0gbnVsbCkpIHsKKyAgICAgICAgICAgICAgICBXcmFwcGVyIGpzcFdyYXBwZXIgPSAoV3JhcHBlcikKKyAgICAgICAgICAgICAgICAgICAgKChDb250ZXh0KSBnZXRQYXJlbnQoKSkuZmluZENoaWxkKENvbnN0YW50cy5KU1BfU0VSVkxFVF9OQU1FKTsKKyAgICAgICAgICAgICAgICBpZiAoanNwV3JhcHBlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGFjdHVhbENsYXNzID0ganNwV3JhcHBlci5nZXRTZXJ2bGV0Q2xhc3MoKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gTWVyZ2UgaW5pdCBwYXJhbWV0ZXJzCisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXJhbU5hbWVzW10gPSBqc3BXcmFwcGVyLmZpbmRJbml0UGFyYW1ldGVycygpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtTmFtZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbWV0ZXJzLmdldChwYXJhbU5hbWVzW2ldKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycy5wdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhcmFtTmFtZXNbaV0sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganNwV3JhcHBlci5maW5kSW5pdFBhcmFtZXRlcihwYXJhbU5hbWVzW2ldKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIENvbXBsYWluIGlmIG5vIHNlcnZsZXQgY2xhc3MgaGFzIGJlZW4gc3BlY2lmaWVkCisgICAgICAgICAgICBpZiAoYWN0dWFsQ2xhc3MgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHVuYXZhaWxhYmxlKG51bGwpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInN0YW5kYXJkV3JhcHBlci5ub3RDbGFzcyIsIGdldE5hbWUoKSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBBY3F1aXJlIGFuIGluc3RhbmNlIG9mIHRoZSBjbGFzcyBsb2FkZXIgdG8gYmUgdXNlZAorICAgICAgICAgICAgTG9hZGVyIGxvYWRlciA9IGdldExvYWRlcigpOworICAgICAgICAgICAgaWYgKGxvYWRlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdW5hdmFpbGFibGUobnVsbCk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygic3RhbmRhcmRXcmFwcGVyLm1pc3NpbmdMb2FkZXIiLCBnZXROYW1lKCkpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIgPSBsb2FkZXIuZ2V0Q2xhc3NMb2FkZXIoKTsKKworICAgICAgICAgICAgLy8gU3BlY2lhbCBjYXNlIGNsYXNzIGxvYWRlciBmb3IgYSBjb250YWluZXIgcHJvdmlkZWQgc2VydmxldAorICAgICAgICAgICAgLy8gIAorICAgICAgICAgICAgaWYgKGlzQ29udGFpbmVyUHJvdmlkZWRTZXJ2bGV0KGFjdHVhbENsYXNzKSAmJiAKKyAgICAgICAgICAgICAgICAgICAgISAoKENvbnRleHQpZ2V0UGFyZW50KCkpLmdldFByaXZpbGVnZWQoKSApIHsKKyAgICAgICAgICAgICAgICAvLyBJZiBpdCBpcyBhIHByaXZpbGVkZ2VkIGNvbnRleHQgLSB1c2luZyBpdHMgb3duCisgICAgICAgICAgICAgICAgLy8gY2xhc3MgbG9hZGVyIHdpbGwgd29yaywgc2luY2UgaXQncyBhIGNoaWxkIG9mIHRoZSBjb250YWluZXIKKyAgICAgICAgICAgICAgICAvLyBsb2FkZXIKKyAgICAgICAgICAgICAgICBjbGFzc0xvYWRlciA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBMb2FkIHRoZSBzcGVjaWZpZWQgc2VydmxldCBjbGFzcyBmcm9tIHRoZSBhcHByb3ByaWF0ZSBjbGFzcyBsb2FkZXIKKyAgICAgICAgICAgIENsYXNzIGNsYXNzQ2xhc3MgPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAoU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpICE9IG51bGwpeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBDbGFzc0xvYWRlciBmY2xhc3NMb2FkZXIgPSBjbGFzc0xvYWRlcjsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGZhY3R1YWxDbGFzcyA9IGFjdHVhbENsYXNzOworICAgICAgICAgICAgICAgICAgICB0cnl7CisgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc0NsYXNzID0gKENsYXNzKUFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgRXhjZXB0aW9ueworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmY2xhc3NMb2FkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmNsYXNzTG9hZGVyLmxvYWRDbGFzcyhmYWN0dWFsQ2xhc3MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKGZhY3R1YWxDbGFzcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2goUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBwYXgpeworICAgICAgICAgICAgICAgICAgICAgICAgRXhjZXB0aW9uIGV4ID0gcGF4LmdldEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbil7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgKENsYXNzTm90Rm91bmRFeGNlcHRpb24pZXg7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFNlcnZsZXRDb250ZXh0KCkubG9nKCAiRXJyb3IgbG9hZGluZyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZmNsYXNzTG9hZGVyICsgIiAiICsgZmFjdHVhbENsYXNzLCBleCApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsYXNzTG9hZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzQ2xhc3MgPSBjbGFzc0xvYWRlci5sb2FkQ2xhc3MoYWN0dWFsQ2xhc3MpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NDbGFzcyA9IENsYXNzLmZvck5hbWUoYWN0dWFsQ2xhc3MpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdW5hdmFpbGFibGUobnVsbCk7CisKKworICAgICAgICAgICAgICAgIGdldFNlcnZsZXRDb250ZXh0KCkubG9nKCAiRXJyb3IgbG9hZGluZyAiICsgY2xhc3NMb2FkZXIgKyAiICIgKyBhY3R1YWxDbGFzcywgZSApOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInN0YW5kYXJkV3JhcHBlci5taXNzaW5nQ2xhc3MiLCBhY3R1YWxDbGFzcyksCisgICAgICAgICAgICAgICAgICAgICBlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNsYXNzQ2xhc3MgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHVuYXZhaWxhYmxlKG51bGwpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInN0YW5kYXJkV3JhcHBlci5taXNzaW5nQ2xhc3MiLCBhY3R1YWxDbGFzcykpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBJbnN0YW50aWF0ZSBhbmQgaW5pdGlhbGl6ZSBhbiBpbnN0YW5jZSBvZiB0aGUgc2VydmxldCBjbGFzcyBpdHNlbGYKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc2VydmxldCA9IChTZXJ2bGV0KSBjbGFzc0NsYXNzLm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHVuYXZhaWxhYmxlKG51bGwpOworICAgICAgICAgICAgICAgIC8vIFJlc3RvcmUgdGhlIGNvbnRleHQgQ2xhc3NMb2FkZXIKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJzdGFuZGFyZFdyYXBwZXIubm90U2VydmxldCIsIGFjdHVhbENsYXNzKSwgZSk7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgeworICAgICAgICAgICAgICAgIHVuYXZhaWxhYmxlKG51bGwpOworICAgICAgICAgICAgICAgIC8vIFJlc3RvcmUgdGhlIGNvbnRleHQgQ2xhc3NMb2FkZXIKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJzdGFuZGFyZFdyYXBwZXIuaW5zdGFudGlhdGUiLCBhY3R1YWxDbGFzcyksIGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBDaGVjayBpZiBsb2FkaW5nIHRoZSBzZXJ2bGV0IGluIHRoaXMgd2ViIGFwcGxpY2F0aW9uIHNob3VsZCBiZQorICAgICAgICAgICAgLy8gYWxsb3dlZAorICAgICAgICAgICAgaWYgKCFpc1NlcnZsZXRBbGxvd2VkKHNlcnZsZXQpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInN0YW5kYXJkV3JhcHBlci5wcml2aWxlZ2VkU2VydmxldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsQ2xhc3MpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gU3BlY2lhbCBoYW5kbGluZyBmb3IgQ29udGFpbmVyU2VydmxldCBpbnN0YW5jZXMKKyAgICAgICAgICAgIGlmICgoc2VydmxldCBpbnN0YW5jZW9mIENvbnRhaW5lclNlcnZsZXQpICYmCisgICAgICAgICAgICAgICAgICAoaXNDb250YWluZXJQcm92aWRlZFNlcnZsZXQoYWN0dWFsQ2xhc3MpIHx8CisgICAgICAgICAgICAgICAgICAgICgoQ29udGV4dClnZXRQYXJlbnQoKSkuZ2V0UHJpdmlsZWdlZCgpICkpIHsKKyAgICAgICAgICAgICAgICAoKENvbnRhaW5lclNlcnZsZXQpIHNlcnZsZXQpLnNldFdyYXBwZXIodGhpcyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsYXNzTG9hZFRpbWU9KGludCkgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC10MSk7CisgICAgICAgICAgICAvLyBDYWxsIHRoZSBpbml0aWFsaXphdGlvbiBtZXRob2Qgb2YgdGhpcyBzZXJ2bGV0CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGluc3RhbmNlU3VwcG9ydC5maXJlSW5zdGFuY2VFdmVudChJbnN0YW5jZUV2ZW50LkJFRk9SRV9JTklUX0VWRU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2bGV0KTsKKworICAgICAgICAgICAgICAgIGlmKCBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBDbGFzc1tdIGNsYXNzVHlwZSA9IG5ldyBDbGFzc1tde1NlcnZsZXRDb25maWcuY2xhc3N9OworICAgICAgICAgICAgICAgICAgICBPYmplY3RbXSBhcmdzID0gbmV3IE9iamVjdFtdeygoU2VydmxldENvbmZpZylmYWNhZGUpfTsKKyAgICAgICAgICAgICAgICAgICAgU2VjdXJpdHlVdGlsLmRvQXNQcml2aWxlZ2UoImluaXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2bGV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHNlcnZsZXQuaW5pdChmYWNhZGUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIEludm9rZSBqc3BJbml0IG9uIEpTUCBwYWdlcworICAgICAgICAgICAgICAgIGlmICgobG9hZE9uU3RhcnR1cCA+PSAwKSAmJiAoanNwRmlsZSAhPSBudWxsKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBJbnZva2luZyBqc3BJbml0CisgICAgICAgICAgICAgICAgICAgIER1bW15UmVxdWVzdCByZXEgPSBuZXcgRHVtbXlSZXF1ZXN0KCk7CisgICAgICAgICAgICAgICAgICAgIHJlcS5zZXRTZXJ2bGV0UGF0aChqc3BGaWxlKTsKKyAgICAgICAgICAgICAgICAgICAgcmVxLnNldFF1ZXJ5U3RyaW5nKCJqc3BfcHJlY29tcGlsZT10cnVlIik7CisgICAgICAgICAgICAgICAgICAgIER1bW15UmVzcG9uc2UgcmVzID0gbmV3IER1bW15UmVzcG9uc2UoKTsKKworICAgICAgICAgICAgICAgICAgICBpZiggU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzW10gY2xhc3NUeXBlID0gbmV3IENsYXNzW117U2VydmxldFJlcXVlc3QuY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZsZXRSZXNwb25zZS5jbGFzc307CisgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RbXSBhcmdzID0gbmV3IE9iamVjdFtde3JlcSwgcmVzfTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNlY3VyaXR5VXRpbC5kb0FzUHJpdmlsZWdlKCJzZXJ2aWNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZsZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZsZXQuc2VydmljZShyZXEsIHJlcyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW5zdGFuY2VTdXBwb3J0LmZpcmVJbnN0YW5jZUV2ZW50KEluc3RhbmNlRXZlbnQuQUZURVJfSU5JVF9FVkVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmxldCk7CisgICAgICAgICAgICB9IGNhdGNoIChVbmF2YWlsYWJsZUV4Y2VwdGlvbiBmKSB7CisgICAgICAgICAgICAgICAgaW5zdGFuY2VTdXBwb3J0LmZpcmVJbnN0YW5jZUV2ZW50KEluc3RhbmNlRXZlbnQuQUZURVJfSU5JVF9FVkVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmxldCwgZik7CisgICAgICAgICAgICAgICAgdW5hdmFpbGFibGUoZik7CisgICAgICAgICAgICAgICAgdGhyb3cgZjsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFNlcnZsZXRFeGNlcHRpb24gZikgeworICAgICAgICAgICAgICAgIGluc3RhbmNlU3VwcG9ydC5maXJlSW5zdGFuY2VFdmVudChJbnN0YW5jZUV2ZW50LkFGVEVSX0lOSVRfRVZFTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZsZXQsIGYpOworICAgICAgICAgICAgICAgIC8vIElmIHRoZSBzZXJ2bGV0IHdhbnRlZCB0byBiZSB1bmF2YWlsYWJsZSBpdCB3b3VsZCBoYXZlCisgICAgICAgICAgICAgICAgLy8gc2FpZCBzbywgc28gZG8gbm90IGNhbGwgdW5hdmFpbGFibGUobnVsbCkuCisgICAgICAgICAgICAgICAgdGhyb3cgZjsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBmKSB7CisgICAgICAgICAgICAgICAgZ2V0U2VydmxldENvbnRleHQoKS5sb2coIlN0YW5kYXJkV3JhcHBlci5UaHJvd2FibGUiLCBmICk7CisgICAgICAgICAgICAgICAgaW5zdGFuY2VTdXBwb3J0LmZpcmVJbnN0YW5jZUV2ZW50KEluc3RhbmNlRXZlbnQuQUZURVJfSU5JVF9FVkVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmxldCwgZik7CisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHNlcnZsZXQgd2FudGVkIHRvIGJlIHVuYXZhaWxhYmxlIGl0IHdvdWxkIGhhdmUKKyAgICAgICAgICAgICAgICAvLyBzYWlkIHNvLCBzbyBkbyBub3QgY2FsbCB1bmF2YWlsYWJsZShudWxsKS4KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJzdGFuZGFyZFdyYXBwZXIuaW5pdEV4Y2VwdGlvbiIsIGdldE5hbWUoKSksIGYpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBSZWdpc3RlciBvdXIgbmV3bHkgaW5pdGlhbGl6ZWQgaW5zdGFuY2UKKyAgICAgICAgICAgIHNpbmdsZVRocmVhZE1vZGVsID0gc2VydmxldCBpbnN0YW5jZW9mIFNpbmdsZVRocmVhZE1vZGVsOworICAgICAgICAgICAgaWYgKHNpbmdsZVRocmVhZE1vZGVsKSB7CisgICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlUG9vbCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZVBvb2wgPSBuZXcgU3RhY2soKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpcmVDb250YWluZXJFdmVudCgibG9hZCIsIHRoaXMpOworCisgICAgICAgICAgICBsb2FkVGltZT1TeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtdDE7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoc3dhbGxvd091dHB1dCkgeworICAgICAgICAgICAgICAgIFN0cmluZyBsb2cgPSBTeXN0ZW1Mb2dIYW5kbGVyLnN0b3BDYXB0dXJlKCk7CisgICAgICAgICAgICAgICAgaWYgKGxvZyAhPSBudWxsICYmIGxvZy5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldFNlcnZsZXRDb250ZXh0KCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2VydmxldENvbnRleHQoKS5sb2cobG9nKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGxvZyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNlcnZsZXQ7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlciBmcm9tIHRoaXMgc2VydmxldC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlciB0byByZW1vdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVJbml0UGFyYW1ldGVyKFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgc3luY2hyb25pemVkIChwYXJhbWV0ZXJzKSB7CisgICAgICAgICAgICBwYXJhbWV0ZXJzLnJlbW92ZShuYW1lKTsKKyAgICAgICAgfQorICAgICAgICBmaXJlQ29udGFpbmVyRXZlbnQoInJlbW92ZUluaXRQYXJhbWV0ZXIiLCBuYW1lKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGEgbGlzdGVuZXIgbm8gbG9uZ2VyIGludGVyZXN0ZWQgaW4gSW5zdGFuY2VFdmVudHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRvIHJlbW92ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUluc3RhbmNlTGlzdGVuZXIoSW5zdGFuY2VMaXN0ZW5lciBsaXN0ZW5lcikgeworCisgICAgICAgIGluc3RhbmNlU3VwcG9ydC5yZW1vdmVJbnN0YW5jZUxpc3RlbmVyKGxpc3RlbmVyKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGEgbWFwcGluZyBhc3NvY2lhdGVkIHdpdGggdGhlIHdyYXBwZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgcGF0dGVybiB0byByZW1vdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVNYXBwaW5nKFN0cmluZyBtYXBwaW5nKSB7CisKKyAgICAgICAgc3luY2hyb25pemVkIChtYXBwaW5ncykgeworICAgICAgICAgICAgbWFwcGluZ3MucmVtb3ZlKG1hcHBpbmcpOworICAgICAgICB9CisgICAgICAgIGZpcmVDb250YWluZXJFdmVudCgicmVtb3ZlTWFwcGluZyIsIG1hcHBpbmcpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYW55IHNlY3VyaXR5IHJvbGUgcmVmZXJlbmNlIGZvciB0aGUgc3BlY2lmaWVkIHJvbGUgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIFNlY3VyaXR5IHJvbGUgdXNlZCB3aXRoaW4gdGhpcyBzZXJ2bGV0IHRvIGJlIHJlbW92ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVTZWN1cml0eVJlZmVyZW5jZShTdHJpbmcgbmFtZSkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAocmVmZXJlbmNlcykgeworICAgICAgICAgICAgcmVmZXJlbmNlcy5yZW1vdmUobmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgZmlyZUNvbnRhaW5lckV2ZW50KCJyZW1vdmVTZWN1cml0eVJlZmVyZW5jZSIsIG5hbWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBjb21wb25lbnQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGlmIChnZXRQYXJlbnQoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoZ2V0UGFyZW50KCkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICBzYi5hcHBlbmQoIi4iKTsKKyAgICAgICAgfQorICAgICAgICBzYi5hcHBlbmQoIlN0YW5kYXJkV3JhcHBlclsiKTsKKyAgICAgICAgc2IuYXBwZW5kKGdldE5hbWUoKSk7CisgICAgICAgIHNiLmFwcGVuZCgiXSIpOworICAgICAgICByZXR1cm4gKHNiLnRvU3RyaW5nKCkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIGFuIFVuYXZhaWxhYmxlRXhjZXB0aW9uLCBtYXJraW5nIHRoaXMgc2VydmxldCBhcyB1bmF2YWlsYWJsZQorICAgICAqIGZvciB0aGUgc3BlY2lmaWVkIGFtb3VudCBvZiB0aW1lLgorICAgICAqCisgICAgICogQHBhcmFtIHVuYXZhaWxhYmxlIFRoZSBleGNlcHRpb24gdGhhdCBvY2N1cnJlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KKyAgICAgKiAgdG8gbWFyayB0aGlzIHNlcnZsZXQgYXMgcGVybWFuZW50bHkgdW5hdmFpbGFibGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB1bmF2YWlsYWJsZShVbmF2YWlsYWJsZUV4Y2VwdGlvbiB1bmF2YWlsYWJsZSkgeworICAgICAgICBnZXRTZXJ2bGV0Q29udGV4dCgpLmxvZyhzbS5nZXRTdHJpbmcoInN0YW5kYXJkV3JhcHBlci51bmF2YWlsYWJsZSIsIGdldE5hbWUoKSkpOworICAgICAgICBpZiAodW5hdmFpbGFibGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHNldEF2YWlsYWJsZShMb25nLk1BWF9WQUxVRSk7CisgICAgICAgIGVsc2UgaWYgKHVuYXZhaWxhYmxlLmlzUGVybWFuZW50KCkpCisgICAgICAgICAgICBzZXRBdmFpbGFibGUoTG9uZy5NQVhfVkFMVUUpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGludCB1bmF2YWlsYWJsZVNlY29uZHMgPSB1bmF2YWlsYWJsZS5nZXRVbmF2YWlsYWJsZVNlY29uZHMoKTsKKyAgICAgICAgICAgIGlmICh1bmF2YWlsYWJsZVNlY29uZHMgPD0gMCkKKyAgICAgICAgICAgICAgICB1bmF2YWlsYWJsZVNlY29uZHMgPSA2MDsgICAgICAgIC8vIEFyYml0cmFyeSBkZWZhdWx0CisgICAgICAgICAgICBzZXRBdmFpbGFibGUoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICh1bmF2YWlsYWJsZVNlY29uZHMgKiAxMDAwTCkpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFVubG9hZCBhbGwgaW5pdGlhbGl6ZWQgaW5zdGFuY2VzIG9mIHRoaXMgc2VydmxldCwgYWZ0ZXIgY2FsbGluZyB0aGUKKyAgICAgKiA8Y29kZT5kZXN0cm95KCk8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBpbnN0YW5jZS4gIFRoaXMgY2FuIGJlIHVzZWQsCisgICAgICogZm9yIGV4YW1wbGUsIHByaW9yIHRvIHNodXR0aW5nIGRvd24gdGhlIGVudGlyZSBzZXJ2bGV0IGVuZ2luZSwgb3IKKyAgICAgKiBwcmlvciB0byByZWxvYWRpbmcgYWxsIG9mIHRoZSBjbGFzc2VzIGZyb20gdGhlIExvYWRlciBhc3NvY2lhdGVkIHdpdGgKKyAgICAgKiBvdXIgTG9hZGVyJ3MgcmVwb3NpdG9yeS4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhbiBleGNlcHRpb24gaXMgdGhyb3duIGJ5IHRoZQorICAgICAqICBkZXN0cm95KCkgbWV0aG9kCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHVubG9hZCgpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICAvLyBOb3RoaW5nIHRvIGRvIGlmIHdlIGhhdmUgbmV2ZXIgbG9hZGVkIHRoZSBpbnN0YW5jZQorICAgICAgICBpZiAoIXNpbmdsZVRocmVhZE1vZGVsICYmIChpbnN0YW5jZSA9PSBudWxsKSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgdW5sb2FkaW5nID0gdHJ1ZTsKKworICAgICAgICAvLyBMb2FmIGEgd2hpbGUgaWYgdGhlIGN1cnJlbnQgaW5zdGFuY2UgaXMgYWxsb2NhdGVkCisgICAgICAgIC8vIChwb3NzaWJseSBtb3JlIHRoYW4gb25jZSBpZiBub24tU1RNKQorICAgICAgICBpZiAoY291bnRBbGxvY2F0ZWQgPiAwKSB7CisgICAgICAgICAgICBpbnQgblJldHJpZXMgPSAwOworICAgICAgICAgICAgd2hpbGUgKChuUmV0cmllcyA8IDIxKSAmJiAoY291bnRBbGxvY2F0ZWQgPiAwKSkgeworICAgICAgICAgICAgICAgIGlmICgoblJldHJpZXMgJSAxMCkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbyhzbS5nZXRTdHJpbmcoInN0YW5kYXJkV3JhcHBlci53YWl0aW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbnRlZ2VyKGNvdW50QWxsb2NhdGVkKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgblJldHJpZXMrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIENsYXNzTG9hZGVyIG9sZEN0eENsYXNzTG9hZGVyID0KKyAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7CisgICAgICAgIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyID0gaW5zdGFuY2UuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpOworCisgICAgICAgIFByaW50U3RyZWFtIG91dCA9IFN5c3RlbS5vdXQ7CisgICAgICAgIGlmIChzd2FsbG93T3V0cHV0KSB7CisgICAgICAgICAgICBTeXN0ZW1Mb2dIYW5kbGVyLnN0YXJ0Q2FwdHVyZSgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2FsbCB0aGUgc2VydmxldCBkZXN0cm95KCkgbWV0aG9kCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnN0YW5jZVN1cHBvcnQuZmlyZUluc3RhbmNlRXZlbnQKKyAgICAgICAgICAgICAgKEluc3RhbmNlRXZlbnQuQkVGT1JFX0RFU1RST1lfRVZFTlQsIGluc3RhbmNlKTsKKworICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIoY2xhc3NMb2FkZXIpOworICAgICAgICAgICAgaWYoIFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgU2VjdXJpdHlVdGlsLmRvQXNQcml2aWxlZ2UoImRlc3Ryb3kiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlKTsKKyAgICAgICAgICAgICAgICBTZWN1cml0eVV0aWwucmVtb3ZlKGluc3RhbmNlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW5zdGFuY2UuZGVzdHJveSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnN0YW5jZVN1cHBvcnQuZmlyZUluc3RhbmNlRXZlbnQKKyAgICAgICAgICAgICAgKEluc3RhbmNlRXZlbnQuQUZURVJfREVTVFJPWV9FVkVOVCwgaW5zdGFuY2UpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgaW5zdGFuY2VTdXBwb3J0LmZpcmVJbnN0YW5jZUV2ZW50CisgICAgICAgICAgICAgIChJbnN0YW5jZUV2ZW50LkFGVEVSX0RFU1RST1lfRVZFTlQsIGluc3RhbmNlLCB0KTsKKyAgICAgICAgICAgIGluc3RhbmNlID0gbnVsbDsKKyAgICAgICAgICAgIGluc3RhbmNlUG9vbCA9IG51bGw7CisgICAgICAgICAgICBuSW5zdGFuY2VzID0gMDsKKyAgICAgICAgICAgIGZpcmVDb250YWluZXJFdmVudCgidW5sb2FkIiwgdGhpcyk7CisgICAgICAgICAgICB1bmxvYWRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygic3RhbmRhcmRXcmFwcGVyLmRlc3Ryb3lFeGNlcHRpb24iLCBnZXROYW1lKCkpLAorICAgICAgICAgICAgICAgICB0KTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIC8vIHJlc3RvcmUgdGhlIGNvbnRleHQgQ2xhc3NMb2FkZXIKKyAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKG9sZEN0eENsYXNzTG9hZGVyKTsKKyAgICAgICAgICAgIC8vIFdyaXRlIGNhcHR1cmVkIG91dHB1dAorICAgICAgICAgICAgaWYgKHN3YWxsb3dPdXRwdXQpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbG9nID0gU3lzdGVtTG9nSGFuZGxlci5zdG9wQ2FwdHVyZSgpOworICAgICAgICAgICAgICAgIGlmIChsb2cgIT0gbnVsbCAmJiBsb2cubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChnZXRTZXJ2bGV0Q29udGV4dCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldFNlcnZsZXRDb250ZXh0KCkubG9nKGxvZyk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihsb2cpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gRGVyZWdpc3RlciB0aGUgZGVzdHJveWVkIGluc3RhbmNlCisgICAgICAgIGluc3RhbmNlID0gbnVsbDsKKworICAgICAgICBpZiAoc2luZ2xlVGhyZWFkTW9kZWwgJiYgKGluc3RhbmNlUG9vbCAhPSBudWxsKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihjbGFzc0xvYWRlcik7CisgICAgICAgICAgICAgICAgd2hpbGUgKCFpbnN0YW5jZVBvb2wuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKCBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgU2VjdXJpdHlVdGlsLmRvQXNQcml2aWxlZ2UoImRlc3Ryb3kiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTZXJ2bGV0KSBpbnN0YW5jZVBvb2wucG9wKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNlY3VyaXR5VXRpbC5yZW1vdmUoaW5zdGFuY2UpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgKChTZXJ2bGV0KSBpbnN0YW5jZVBvb2wucG9wKCkpLmRlc3Ryb3koKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgaW5zdGFuY2VQb29sID0gbnVsbDsKKyAgICAgICAgICAgICAgICBuSW5zdGFuY2VzID0gMDsKKyAgICAgICAgICAgICAgICB1bmxvYWRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBmaXJlQ29udGFpbmVyRXZlbnQoInVubG9hZCIsIHRoaXMpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInN0YW5kYXJkV3JhcHBlci5kZXN0cm95RXhjZXB0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXROYW1lKCkpLCB0KTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgLy8gcmVzdG9yZSB0aGUgY29udGV4dCBDbGFzc0xvYWRlcgorICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyCisgICAgICAgICAgICAgICAgICAgIChvbGRDdHhDbGFzc0xvYWRlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnN0YW5jZVBvb2wgPSBudWxsOworICAgICAgICAgICAgbkluc3RhbmNlcyA9IDA7CisgICAgICAgIH0KKworICAgICAgICBzaW5nbGVUaHJlYWRNb2RlbCA9IGZhbHNlOworCisgICAgICAgIHVubG9hZGluZyA9IGZhbHNlOworICAgICAgICBmaXJlQ29udGFpbmVyRXZlbnQoInVubG9hZCIsIHRoaXMpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTZXJ2bGV0Q29uZmlnIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgbmFtZSwKKyAgICAgKiBpZiBhbnk7IG90aGVyd2lzZSByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIgdG8gcmV0cmlldmUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEluaXRQYXJhbWV0ZXIoU3RyaW5nIG5hbWUpIHsKKworICAgICAgICByZXR1cm4gKGZpbmRJbml0UGFyYW1ldGVyKG5hbWUpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXQgb2YgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyIG5hbWVzIGRlZmluZWQgZm9yIHRoaXMKKyAgICAgKiBzZXJ2bGV0LiAgSWYgbm9uZSBhcmUgZGVmaW5lZCwgYW4gZW1wdHkgRW51bWVyYXRpb24gaXMgcmV0dXJuZWQuCisgICAgICovCisgICAgcHVibGljIEVudW1lcmF0aW9uIGdldEluaXRQYXJhbWV0ZXJOYW1lcygpIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKHBhcmFtZXRlcnMpIHsKKyAgICAgICAgICAgIHJldHVybiAobmV3IEVudW1lcmF0b3IocGFyYW1ldGVycy5rZXlTZXQoKSkpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2VydmxldCBjb250ZXh0IHdpdGggd2hpY2ggdGhpcyBzZXJ2bGV0IGlzIGFzc29jaWF0ZWQuCisgICAgICovCisgICAgcHVibGljIFNlcnZsZXRDb250ZXh0IGdldFNlcnZsZXRDb250ZXh0KCkgeworCisgICAgICAgIGlmIChwYXJlbnQgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIGVsc2UgaWYgKCEocGFyZW50IGluc3RhbmNlb2YgQ29udGV4dCkpCisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gKCgoQ29udGV4dCkgcGFyZW50KS5nZXRTZXJ2bGV0Q29udGV4dCgpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoaXMgc2VydmxldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFNlcnZsZXROYW1lKCkgeworCisgICAgICAgIHJldHVybiAoZ2V0TmFtZSgpKTsKKworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGdldFByb2Nlc3NpbmdUaW1lKCkgeworICAgICAgICByZXR1cm4gc3dWYWx2ZS5nZXRQcm9jZXNzaW5nVGltZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFByb2Nlc3NpbmdUaW1lKGxvbmcgcHJvY2Vzc2luZ1RpbWUpIHsKKyAgICAgICAgc3dWYWx2ZS5zZXRQcm9jZXNzaW5nVGltZShwcm9jZXNzaW5nVGltZSk7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgZ2V0TWF4VGltZSgpIHsKKyAgICAgICAgcmV0dXJuIHN3VmFsdmUuZ2V0TWF4VGltZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1heFRpbWUobG9uZyBtYXhUaW1lKSB7CisgICAgICAgIHN3VmFsdmUuc2V0TWF4VGltZShtYXhUaW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBnZXRNaW5UaW1lKCkgeworICAgICAgICByZXR1cm4gc3dWYWx2ZS5nZXRNaW5UaW1lKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TWluVGltZShsb25nIG1pblRpbWUpIHsKKyAgICAgICAgc3dWYWx2ZS5zZXRNaW5UaW1lKG1pblRpbWUpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0UmVxdWVzdENvdW50KCkgeworICAgICAgICByZXR1cm4gc3dWYWx2ZS5nZXRSZXF1ZXN0Q291bnQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRSZXF1ZXN0Q291bnQoaW50IHJlcXVlc3RDb3VudCkgeworICAgICAgICBzd1ZhbHZlLnNldFJlcXVlc3RDb3VudChyZXF1ZXN0Q291bnQpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0RXJyb3JDb3VudCgpIHsKKyAgICAgICAgcmV0dXJuIHN3VmFsdmUuZ2V0RXJyb3JDb3VudCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEVycm9yQ291bnQoaW50IGVycm9yQ291bnQpIHsKKyAgICAgICAgICAgc3dWYWx2ZS5zZXRFcnJvckNvdW50KGVycm9yQ291bnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluY3JlbWVudCB0aGUgZXJyb3IgY291bnQgdXNlZCBmb3IgbW9uaXRvcmluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbmNyZW1lbnRFcnJvckNvdW50KCl7CisgICAgICAgIHN3VmFsdmUuc2V0RXJyb3JDb3VudChzd1ZhbHZlLmdldEVycm9yQ291bnQoKSArIDEpOworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGdldExvYWRUaW1lKCkgeworICAgICAgICByZXR1cm4gbG9hZFRpbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TG9hZFRpbWUobG9uZyBsb2FkVGltZSkgeworICAgICAgICB0aGlzLmxvYWRUaW1lID0gbG9hZFRpbWU7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRDbGFzc0xvYWRUaW1lKCkgeworICAgICAgICByZXR1cm4gY2xhc3NMb2FkVGltZTsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQYWNrYWdlIE1ldGhvZHMKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJpdmF0ZSBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIEFkZCBhIGRlZmF1bHQgTWFwcGVyIGltcGxlbWVudGF0aW9uIGlmIG5vbmUgaGF2ZSBiZWVuIGNvbmZpZ3VyZWQKKyAgICAgKiBleHBsaWNpdGx5LgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBlckNsYXNzIEphdmEgY2xhc3MgbmFtZSBvZiB0aGUgZGVmYXVsdCBNYXBwZXIKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBhZGREZWZhdWx0TWFwcGVyKFN0cmluZyBtYXBwZXJDbGFzcykgeworCisgICAgICAgIDsgICAgICAgLy8gTm8gbmVlZCBmb3IgYSBkZWZhdWx0IE1hcHBlciBvbiBhIFdyYXBwZXIKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgY2xhc3MgbmFtZSByZXByZXNlbnRzIGEKKyAgICAgKiBjb250YWluZXIgcHJvdmlkZWQgc2VydmxldCBjbGFzcyB0aGF0IHNob3VsZCBiZSBsb2FkZWQgYnkgdGhlCisgICAgICogc2VydmVyIGNsYXNzIGxvYWRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGFzc25hbWUgTmFtZSBvZiB0aGUgY2xhc3MgdG8gYmUgY2hlY2tlZAorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBpc0NvbnRhaW5lclByb3ZpZGVkU2VydmxldChTdHJpbmcgY2xhc3NuYW1lKSB7CisKKyAgICAgICAgaWYgKGNsYXNzbmFtZS5zdGFydHNXaXRoKCJvcmcuYXBhY2hlLmNhdGFsaW5hLiIpKSB7CisgICAgICAgICAgICByZXR1cm4gKHRydWUpOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDbGFzcyBjbGF6eiA9CisgICAgICAgICAgICAgICAgdGhpcy5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkubG9hZENsYXNzKGNsYXNzbmFtZSk7CisgICAgICAgICAgICByZXR1cm4gKENvbnRhaW5lclNlcnZsZXQuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShjbGF6eikpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgcmV0dXJuIChmYWxzZSk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGxvYWRpbmcgdGhpcyBzZXJ2bGV0IGlzIGFsbG93ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGlzU2VydmxldEFsbG93ZWQoT2JqZWN0IHNlcnZsZXQpIHsKKworICAgICAgICBpZiAoc2VydmxldCBpbnN0YW5jZW9mIENvbnRhaW5lclNlcnZsZXQpIHsKKyAgICAgICAgICAgIGlmICgoKENvbnRleHQpIGdldFBhcmVudCgpKS5nZXRQcml2aWxlZ2VkKCkKKyAgICAgICAgICAgICAgICB8fCAoc2VydmxldC5nZXRDbGFzcygpLmdldE5hbWUoKS5lcXVhbHMKKyAgICAgICAgICAgICAgICAgICAgKCJvcmcuYXBhY2hlLmNhdGFsaW5hLnNlcnZsZXRzLkludm9rZXJTZXJ2bGV0IikpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICh0cnVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKHRydWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBMb2cgdGhlIGFiYnJldmlhdGVkIG5hbWUgb2YgdGhpcyBDb250YWluZXIgZm9yIGxvZ2dpbmcgbWVzc2FnZXMuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBsb2dOYW1lKCkgeworCisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIlN0YW5kYXJkV3JhcHBlclsiKTsKKyAgICAgICAgaWYgKGdldFBhcmVudCgpICE9IG51bGwpCisgICAgICAgICAgICBzYi5hcHBlbmQoZ2V0UGFyZW50KCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc2IuYXBwZW5kKCJudWxsIik7CisgICAgICAgIHNiLmFwcGVuZCgnOicpOworICAgICAgICBzYi5hcHBlbmQoZ2V0TmFtZSgpKTsKKyAgICAgICAgc2IuYXBwZW5kKCddJyk7CisgICAgICAgIHJldHVybiAoc2IudG9TdHJpbmcoKSk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBMaWZlY3ljbGUgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBTdGFydCB0aGlzIGNvbXBvbmVudCwgcHJlLWxvYWRpbmcgdGhlIHNlcnZsZXQgaWYgdGhlIGxvYWQtb24tc3RhcnR1cAorICAgICAqIHZhbHVlIGlzIHNldCBhcHByb3ByaWF0ZWx5LgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBMaWZlY3ljbGVFeGNlcHRpb24gaWYgYSBmYXRhbCBlcnJvciBvY2N1cnMgZHVyaW5nIHN0YXJ0dXAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb24geworICAgIAorICAgICAgICAvLyBTZW5kIGoyZWUuc3RhdGUuc3RhcnRpbmcgbm90aWZpY2F0aW9uIAorICAgICAgICBpZiAodGhpcy5nZXRPYmplY3ROYW1lKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbiA9IG5ldyBOb3RpZmljYXRpb24oImoyZWUuc3RhdGUuc3RhcnRpbmciLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRPYmplY3ROYW1lKCksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZU51bWJlcisrKTsKKyAgICAgICAgICAgIGJyb2FkY2FzdGVyLnNlbmROb3RpZmljYXRpb24obm90aWZpY2F0aW9uKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gU3RhcnQgdXAgdGhpcyBjb21wb25lbnQKKyAgICAgICAgc3VwZXIuc3RhcnQoKTsKKworICAgICAgICBpZiggb25hbWUgIT0gbnVsbCApCisgICAgICAgICAgICByZWdpc3RlckpNWCgoU3RhbmRhcmRDb250ZXh0KWdldFBhcmVudCgpKTsKKyAgICAgICAgCisgICAgICAgIC8vIExvYWQgYW5kIGluaXRpYWxpemUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBzZXJ2bGV0IGlmIHJlcXVlc3RlZAorICAgICAgICAvLyBNT1ZFRCBUTyBTdGFuZGFyZENvbnRleHQgU1RBUlQoKSBNRVRIT0QKKworICAgICAgICBzZXRBdmFpbGFibGUoMEwpOworICAgICAgICAKKyAgICAgICAgLy8gU2VuZCBqMmVlLnN0YXRlLnJ1bm5pbmcgbm90aWZpY2F0aW9uIAorICAgICAgICBpZiAodGhpcy5nZXRPYmplY3ROYW1lKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbiA9IAorICAgICAgICAgICAgICAgIG5ldyBOb3RpZmljYXRpb24oImoyZWUuc3RhdGUucnVubmluZyIsIHRoaXMuZ2V0T2JqZWN0TmFtZSgpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VOdW1iZXIrKyk7CisgICAgICAgICAgICBicm9hZGNhc3Rlci5zZW5kTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbik7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU3RvcCB0aGlzIGNvbXBvbmVudCwgZ3JhY2VmdWxseSBzaHV0dGluZyBkb3duIHRoZSBzZXJ2bGV0IGlmIGl0IGhhcworICAgICAqIGJlZW4gaW5pdGlhbGl6ZWQuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIExpZmVjeWNsZUV4Y2VwdGlvbiBpZiBhIGZhdGFsIGVycm9yIG9jY3VycyBkdXJpbmcgc2h1dGRvd24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdG9wKCkgdGhyb3dzIExpZmVjeWNsZUV4Y2VwdGlvbiB7CisKKyAgICAgICAgc2V0QXZhaWxhYmxlKExvbmcuTUFYX1ZBTFVFKTsKKyAgICAgICAgCisgICAgICAgIC8vIFNlbmQgajJlZS5zdGF0ZS5zdG9wcGluZyBub3RpZmljYXRpb24gCisgICAgICAgIGlmICh0aGlzLmdldE9iamVjdE5hbWUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uID0gCisgICAgICAgICAgICAgICAgbmV3IE5vdGlmaWNhdGlvbigiajJlZS5zdGF0ZS5zdG9wcGluZyIsIHRoaXMuZ2V0T2JqZWN0TmFtZSgpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VOdW1iZXIrKyk7CisgICAgICAgICAgICBicm9hZGNhc3Rlci5zZW5kTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbik7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIFNodXQgZG93biBvdXIgc2VydmxldCBpbnN0YW5jZSAoaWYgaXQgaGFzIGJlZW4gaW5pdGlhbGl6ZWQpCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB1bmxvYWQoKTsKKyAgICAgICAgfSBjYXRjaCAoU2VydmxldEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBnZXRTZXJ2bGV0Q29udGV4dCgpLmxvZyhzbS5nZXRTdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAoInN0YW5kYXJkV3JhcHBlci51bmxvYWRFeGNlcHRpb24iLCBnZXROYW1lKCkpLCBlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFNodXQgZG93biB0aGlzIGNvbXBvbmVudAorICAgICAgICBzdXBlci5zdG9wKCk7CisKKyAgICAgICAgLy8gU2VuZCBqMmVlLnN0YXRlLnN0b3BwcGVkIG5vdGlmaWNhdGlvbiAKKyAgICAgICAgaWYgKHRoaXMuZ2V0T2JqZWN0TmFtZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24gPSAKKyAgICAgICAgICAgICAgICBuZXcgTm90aWZpY2F0aW9uKCJqMmVlLnN0YXRlLnN0b3BwZWQiLCB0aGlzLmdldE9iamVjdE5hbWUoKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlTnVtYmVyKyspOworICAgICAgICAgICAgYnJvYWRjYXN0ZXIuc2VuZE5vdGlmaWNhdGlvbihub3RpZmljYXRpb24pOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiggb25hbWUgIT0gbnVsbCApIHsKKyAgICAgICAgICAgIFJlZ2lzdHJ5LmdldFJlZ2lzdHJ5KG51bGwsIG51bGwpLnVucmVnaXN0ZXJDb21wb25lbnQob25hbWUpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBTZW5kIGoyZWUub2JqZWN0LmRlbGV0ZWQgbm90aWZpY2F0aW9uIAorICAgICAgICAgICAgTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbiA9IAorICAgICAgICAgICAgICAgIG5ldyBOb3RpZmljYXRpb24oImoyZWUub2JqZWN0LmRlbGV0ZWQiLCB0aGlzLmdldE9iamVjdE5hbWUoKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlTnVtYmVyKyspOworICAgICAgICAgICAgYnJvYWRjYXN0ZXIuc2VuZE5vdGlmaWNhdGlvbihub3RpZmljYXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGlzSnNwU2VydmxldCAmJiBqc3BNb25pdG9yT04gIT0gbnVsbCApIHsKKyAgICAgICAgICAgIFJlZ2lzdHJ5LmdldFJlZ2lzdHJ5KG51bGwsIG51bGwpLnVucmVnaXN0ZXJDb21wb25lbnQoanNwTW9uaXRvck9OKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJKTVgoU3RhbmRhcmRDb250ZXh0IGN0eCkgeworCisgICAgICAgIFN0cmluZyBwYXJlbnROYW1lID0gY3R4LmdldE5hbWUoKTsKKyAgICAgICAgcGFyZW50TmFtZSA9ICgiIi5lcXVhbHMocGFyZW50TmFtZSkpID8gIi8iIDogcGFyZW50TmFtZTsKKworICAgICAgICBTdHJpbmcgaG9zdE5hbWUgPSBjdHguZ2V0UGFyZW50KCkuZ2V0TmFtZSgpOworICAgICAgICBob3N0TmFtZSA9IChob3N0TmFtZT09bnVsbCkgPyAiREVGQVVMVCIgOiBob3N0TmFtZTsKKworICAgICAgICBTdHJpbmcgZG9tYWluID0gY3R4LmdldERvbWFpbigpOworCisgICAgICAgIFN0cmluZyB3ZWJNb2Q9ICIvLyIgKyBob3N0TmFtZSArIHBhcmVudE5hbWU7CisgICAgICAgIFN0cmluZyBvbmFtZVN0ciA9IGRvbWFpbiArICI6ajJlZVR5cGU9U2VydmxldCxuYW1lPSIgKyBnZXROYW1lKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAiLFdlYk1vZHVsZT0iICsgd2ViTW9kICsgIixKMkVFQXBwbGljYXRpb249IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5nZXRKMkVFQXBwbGljYXRpb24oKSArICIsSjJFRVNlcnZlcj0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LmdldEoyRUVTZXJ2ZXIoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9uYW1lPW5ldyBPYmplY3ROYW1lKG9uYW1lU3RyKTsKKyAgICAgICAgICAgIGNvbnRyb2xsZXI9b25hbWU7CisgICAgICAgICAgICBSZWdpc3RyeS5nZXRSZWdpc3RyeShudWxsLCBudWxsKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlckNvbXBvbmVudCh0aGlzLCBvbmFtZSwgbnVsbCApOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBTZW5kIGoyZWUub2JqZWN0LmNyZWF0ZWQgbm90aWZpY2F0aW9uIAorICAgICAgICAgICAgaWYgKHRoaXMuZ2V0T2JqZWN0TmFtZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uID0gbmV3IE5vdGlmaWNhdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJqMmVlLm9iamVjdC5jcmVhdGVkIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldE9iamVjdE5hbWUoKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZU51bWJlcisrKTsKKyAgICAgICAgICAgICAgICBicm9hZGNhc3Rlci5zZW5kTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2goIEV4Y2VwdGlvbiBleCApIHsKKyAgICAgICAgICAgIGxvZy5pbmZvKCJFcnJvciByZWdpc3RlcmluZyBzZXJ2bGV0IHdpdGggam14ICIgKyB0aGlzKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpc0pzcFNlcnZsZXQpIHsKKyAgICAgICAgICAgIC8vIFJlZ2lzdGVyIEpTUCBtb25pdG9yaW5nIG1iZWFuCisgICAgICAgICAgICBvbmFtZVN0ciA9IGRvbWFpbiArICI6dHlwZT1Kc3BNb25pdG9yLG5hbWU9IiArIGdldE5hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICArICIsV2ViTW9kdWxlPSIgKyB3ZWJNb2QKKyAgICAgICAgICAgICAgICAgICAgICAgKyAiLEoyRUVBcHBsaWNhdGlvbj0iICsgY3R4LmdldEoyRUVBcHBsaWNhdGlvbigpCisgICAgICAgICAgICAgICAgICAgICAgICsgIixKMkVFU2VydmVyPSIgKyBjdHguZ2V0SjJFRVNlcnZlcigpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBqc3BNb25pdG9yT04gPSBuZXcgT2JqZWN0TmFtZShvbmFtZVN0cik7CisgICAgICAgICAgICAgICAgUmVnaXN0cnkuZ2V0UmVnaXN0cnkobnVsbCwgbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgLnJlZ2lzdGVyQ29tcG9uZW50KGluc3RhbmNlLCBqc3BNb25pdG9yT04sIG51bGwpOworICAgICAgICAgICAgfSBjYXRjaCggRXhjZXB0aW9uIGV4ICkgeworICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJFcnJvciByZWdpc3RlcmluZyBKU1AgbW9uaXRvcmluZyB3aXRoIGpteCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCisKKyAgICAvKiBSZW1vdmUgYSBKTVggbm90ZmljYXRpb25MaXN0ZW5lciAKKyAgICAgKiBAc2VlIGphdmF4Lm1hbmFnZW1lbnQuTm90aWZpY2F0aW9uRW1pdHRlciNyZW1vdmVOb3RpZmljYXRpb25MaXN0ZW5lcihqYXZheC5tYW5hZ2VtZW50Lk5vdGlmaWNhdGlvbkxpc3RlbmVyLCBqYXZheC5tYW5hZ2VtZW50Lk5vdGlmaWNhdGlvbkZpbHRlciwgamF2YS5sYW5nLk9iamVjdCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVOb3RpZmljYXRpb25MaXN0ZW5lcihOb3RpZmljYXRpb25MaXN0ZW5lciBsaXN0ZW5lciwgCisgICAgCQlOb3RpZmljYXRpb25GaWx0ZXIgZmlsdGVyLCBPYmplY3Qgb2JqZWN0KSB0aHJvd3MgTGlzdGVuZXJOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgCWJyb2FkY2FzdGVyLnJlbW92ZU5vdGlmaWNhdGlvbkxpc3RlbmVyKGxpc3RlbmVyLGZpbHRlcixvYmplY3QpOworICAgIAkKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBNQmVhbk5vdGlmaWNhdGlvbkluZm9bXSBub3RpZmljYXRpb25JbmZvOworICAgIAorICAgIC8qIEdldCBKTVggQnJvYWRjYXN0ZXIgSW5mbworICAgICAqIEBUT0RPIHVzZSBTdHJpbmdNYW5hZ2VyIGZvciBpbnRlcm5hdGlvbmFsIHN1cHBvcnQhCisgICAgICogQFRPRE8gVGhpcyB0d28gZXZlbnRzIHdlIG5vdCBzZW5kIGoyZWUuc3RhdGUuZmFpbGVkIGFuZCBqMmVlLmF0dHJpYnV0ZS5jaGFuZ2VkIQorICAgICAqIEBzZWUgamF2YXgubWFuYWdlbWVudC5Ob3RpZmljYXRpb25Ccm9hZGNhc3RlciNnZXROb3RpZmljYXRpb25JbmZvKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgTUJlYW5Ob3RpZmljYXRpb25JbmZvW10gZ2V0Tm90aWZpY2F0aW9uSW5mbygpIHsKKyAgICAJCisgICAgCWlmKG5vdGlmaWNhdGlvbkluZm8gPT0gbnVsbCkgeworICAgIAkJbm90aWZpY2F0aW9uSW5mbyA9IG5ldyBNQmVhbk5vdGlmaWNhdGlvbkluZm9bXXsKKyAgICAJCQkJbmV3IE1CZWFuTm90aWZpY2F0aW9uSW5mbyhuZXcgU3RyaW5nW10geworICAgIAkJCQkiajJlZS5vYmplY3QuY3JlYXRlZCJ9LAorCQkJCQlOb3RpZmljYXRpb24uY2xhc3MuZ2V0TmFtZSgpLAorCQkJCQkic2VydmxldCBpcyBjcmVhdGVkIgorICAgIAkJCQkpLCAKKwkJCQkJbmV3IE1CZWFuTm90aWZpY2F0aW9uSW5mbyhuZXcgU3RyaW5nW10geworCQkJCQkiajJlZS5zdGF0ZS5zdGFydGluZyJ9LAorCQkJCQlOb3RpZmljYXRpb24uY2xhc3MuZ2V0TmFtZSgpLAorCQkJCQkic2VydmxldCBpcyBzdGFydGluZyIKKwkJCQkJKSwKKwkJCQkJbmV3IE1CZWFuTm90aWZpY2F0aW9uSW5mbyhuZXcgU3RyaW5nW10geworCQkJCQkiajJlZS5zdGF0ZS5ydW5uaW5nIn0sCisJCQkJCU5vdGlmaWNhdGlvbi5jbGFzcy5nZXROYW1lKCksCisJCQkJCSJzZXJ2bGV0IGlzIHJ1bm5pbmciCisJCQkJCSksCisJCQkJCW5ldyBNQmVhbk5vdGlmaWNhdGlvbkluZm8obmV3IFN0cmluZ1tdIHsKKwkJCQkJImoyZWUuc3RhdGUuc3RvcHBlZCJ9LAorCQkJCQlOb3RpZmljYXRpb24uY2xhc3MuZ2V0TmFtZSgpLAorCQkJCQkic2VydmxldCBzdGFydCB0byBzdG9wcGVkIgorCQkJCQkpLAorCQkJCQluZXcgTUJlYW5Ob3RpZmljYXRpb25JbmZvKG5ldyBTdHJpbmdbXSB7CisJCQkJCSJqMmVlLm9iamVjdC5zdG9wcGVkIn0sCisJCQkJCU5vdGlmaWNhdGlvbi5jbGFzcy5nZXROYW1lKCksCisJCQkJCSJzZXJ2bGV0IGlzIHN0b3BwZWQiCisJCQkJCSksCisJCQkJCW5ldyBNQmVhbk5vdGlmaWNhdGlvbkluZm8obmV3IFN0cmluZ1tdIHsKKwkJCQkJImoyZWUub2JqZWN0LmRlbGV0ZWQifSwKKwkJCQkJTm90aWZpY2F0aW9uLmNsYXNzLmdldE5hbWUoKSwKKwkJCQkJInNlcnZsZXQgaXMgZGVsZXRlZCIKKwkJCQkJKQorICAgIAkJfTsKKyAgICAJCQorICAgIAl9CisgICAgCQorICAgIAlyZXR1cm4gbm90aWZpY2F0aW9uSW5mbzsKKyAgICB9CisgICAgCisgICAgCisgICAgLyogQWRkIGEgSk1YLU5vdGlmaWNhdGlvbkxpc3RlbmVyCisgICAgICogQHNlZSBqYXZheC5tYW5hZ2VtZW50Lk5vdGlmaWNhdGlvbkJyb2FkY2FzdGVyI2FkZE5vdGlmaWNhdGlvbkxpc3RlbmVyKGphdmF4Lm1hbmFnZW1lbnQuTm90aWZpY2F0aW9uTGlzdGVuZXIsIGphdmF4Lm1hbmFnZW1lbnQuTm90aWZpY2F0aW9uRmlsdGVyLCBqYXZhLmxhbmcuT2JqZWN0KQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZE5vdGlmaWNhdGlvbkxpc3RlbmVyKE5vdGlmaWNhdGlvbkxpc3RlbmVyIGxpc3RlbmVyLCAKKyAgICAgICAgICAgIE5vdGlmaWNhdGlvbkZpbHRlciBmaWx0ZXIsIE9iamVjdCBvYmplY3QpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworICAgIAlicm9hZGNhc3Rlci5hZGROb3RpZmljYXRpb25MaXN0ZW5lcihsaXN0ZW5lcixmaWx0ZXIsb2JqZWN0KTsKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogUmVtb3ZlIGEgSk1YLU5vdGlmaWNhdGlvbkxpc3RlbmVyIAorICAgICAqIEBzZWUgamF2YXgubWFuYWdlbWVudC5Ob3RpZmljYXRpb25Ccm9hZGNhc3RlciNyZW1vdmVOb3RpZmljYXRpb25MaXN0ZW5lcihqYXZheC5tYW5hZ2VtZW50Lk5vdGlmaWNhdGlvbkxpc3RlbmVyKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZU5vdGlmaWNhdGlvbkxpc3RlbmVyKE5vdGlmaWNhdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSAKKyAgICAgICAgdGhyb3dzIExpc3RlbmVyTm90Rm91bmRFeGNlcHRpb24geworICAgIAlicm9hZGNhc3Rlci5yZW1vdmVOb3RpZmljYXRpb25MaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgfQorICAgIAorICAgIAorICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEF0dHJpYnV0ZXMKKyAgICAgICAgCisgICAgICAgIAorICAgIHB1YmxpYyBib29sZWFuIGlzRXZlbnRQcm92aWRlcigpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1N0YXRlTWFuYWdlYWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1N0YXRpc3RpY3NQcm92aWRlcigpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAgICAgCisgICAgICAgIAorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NvcmUvU3RhbmRhcmRXcmFwcGVyRmFjYWRlLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY29yZS9TdGFuZGFyZFdyYXBwZXJGYWNhZGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGJjMTU1Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NvcmUvU3RhbmRhcmRXcmFwcGVyRmFjYWRlLmphdmEKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlOworCisKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb25maWc7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKKworCisvKioKKyAqIEZhY2FkZSBmb3IgdGhlIDxiPlN0YW5kYXJkV3JhcHBlcjwvYj4gb2JqZWN0LgorICoKKyAqIEBhdXRob3IgUmVteSBNYXVjaGFyYXQKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIFN0YW5kYXJkV3JhcHBlckZhY2FkZQorICAgIGltcGxlbWVudHMgU2VydmxldENvbmZpZyB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgZmFjZWRlIGFyb3VuZCBhIFN0YW5kYXJkV3JhcHBlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RhbmRhcmRXcmFwcGVyRmFjYWRlKFN0YW5kYXJkV3JhcHBlciBjb25maWcpIHsKKworICAgICAgICBzdXBlcigpOworICAgICAgICB0aGlzLmNvbmZpZyA9IChTZXJ2bGV0Q29uZmlnKSBjb25maWc7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBXcmFwcGVkIGNvbmZpZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFNlcnZsZXRDb25maWcgY29uZmlnID0gbnVsbDsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU2VydmxldENvbmZpZyBNZXRob2RzCisKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmxldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBjb25maWcuZ2V0U2VydmxldE5hbWUoKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBTZXJ2bGV0Q29udGV4dCBnZXRTZXJ2bGV0Q29udGV4dCgpIHsKKyAgICAgICAgU2VydmxldENvbnRleHQgdGhlQ29udGV4dCA9IGNvbmZpZy5nZXRTZXJ2bGV0Q29udGV4dCgpOworICAgICAgICBpZiAoKHRoZUNvbnRleHQgIT0gbnVsbCkgJiYKKyAgICAgICAgICAgICh0aGVDb250ZXh0IGluc3RhbmNlb2YgQXBwbGljYXRpb25Db250ZXh0KSkKKyAgICAgICAgICAgIHRoZUNvbnRleHQgPSAoKEFwcGxpY2F0aW9uQ29udGV4dCkgdGhlQ29udGV4dCkuZ2V0RmFjYWRlKCk7CisgICAgICAgIHJldHVybiAodGhlQ29udGV4dCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEluaXRQYXJhbWV0ZXIoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIGNvbmZpZy5nZXRJbml0UGFyYW1ldGVyKG5hbWUpOworICAgIH0KKworCisgICAgcHVibGljIEVudW1lcmF0aW9uIGdldEluaXRQYXJhbWV0ZXJOYW1lcygpIHsKKyAgICAgICAgcmV0dXJuIGNvbmZpZy5nZXRJbml0UGFyYW1ldGVyTmFtZXMoKTsKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NvcmUvU3RhbmRhcmRXcmFwcGVyVmFsdmUuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb3JlL1N0YW5kYXJkV3JhcHBlclZhbHZlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJjMzlkZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb3JlL1N0YW5kYXJkV3JhcHBlclZhbHZlLmphdmEKQEAgLTAsMCArMSw0MDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OS0yMDAxLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlOworCisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NYWxmb3JtZWRPYmplY3ROYW1lRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXQ7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuVW5hdmFpbGFibGVFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5HbG9iYWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLkNsaWVudEFib3J0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLlJlcXVlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuUmVzcG9uc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLlN0cmluZ01hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS52YWx2ZXMuVmFsdmVCYXNlOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuSW50cm9zcGVjdGlvblV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuYnVmLk1lc3NhZ2VCeXRlczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvbWNhdC51dGlsLmxvZy5TeXN0ZW1Mb2dIYW5kbGVyOworCisvKioKKyAqIFZhbHZlIHRoYXQgaW1wbGVtZW50cyB0aGUgZGVmYXVsdCBiYXNpYyBiZWhhdmlvciBmb3IgdGhlCisgKiA8Y29kZT5TdGFuZGFyZFdyYXBwZXI8L2NvZGU+IGNvbnRhaW5lciBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworZmluYWwgY2xhc3MgU3RhbmRhcmRXcmFwcGVyVmFsdmUKKyAgICBleHRlbmRzIFZhbHZlQmFzZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coU3RhbmRhcmRXcmFwcGVyVmFsdmUuY2xhc3MpOworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8vIFNvbWUgSk1YIHN0YXRpc3RpY3MuIFRoaXMgdmF2bGUgaXMgYXNzb2NpYXRlZCB3aXRoIGEgU3RhbmRhcmRXcmFwcGVyLgorICAgIC8vIFdlIGV4cG9uc2UgdGhlIFN0YW5kYXJkV3JhcHBlciBhcyBKTVggKCBqMmVlVHlwZT1TZXJ2bGV0ICkuIFRoZSBmaWVsZHMKKyAgICAvLyBhcmUgaGVyZSBmb3IgcGVyZm9ybWFuY2UuCisgICAgcHJpdmF0ZSB2b2xhdGlsZSBsb25nIHByb2Nlc3NpbmdUaW1lOworICAgIHByaXZhdGUgdm9sYXRpbGUgbG9uZyBtYXhUaW1lOworICAgIHByaXZhdGUgdm9sYXRpbGUgbG9uZyBtaW5UaW1lID0gTG9uZy5NQVhfVkFMVUU7CisgICAgcHJpdmF0ZSB2b2xhdGlsZSBpbnQgcmVxdWVzdENvdW50OworICAgIHByaXZhdGUgdm9sYXRpbGUgaW50IGVycm9yQ291bnQ7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzdHJpbmcgbWFuYWdlciBmb3IgdGhpcyBwYWNrYWdlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ01hbmFnZXIgc20gPQorICAgICAgICBTdHJpbmdNYW5hZ2VyLmdldE1hbmFnZXIoQ29uc3RhbnRzLlBhY2thZ2UpOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogSW52b2tlIHRoZSBzZXJ2bGV0IHdlIGFyZSBtYW5hZ2luZywgcmVzcGVjdGluZyB0aGUgcnVsZXMgcmVnYXJkaW5nCisgICAgICogc2VydmxldCBsaWZlY3ljbGUgYW5kIFNpbmdsZVRocmVhZE1vZGVsIHN1cHBvcnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBSZXF1ZXN0IHRvIGJlIHByb2Nlc3NlZAorICAgICAqIEBwYXJhbSByZXNwb25zZSBSZXNwb25zZSB0byBiZSBwcm9kdWNlZAorICAgICAqIEBwYXJhbSB2YWx2ZUNvbnRleHQgVmFsdmUgY29udGV4dCB1c2VkIHRvIGZvcndhcmQgdG8gdGhlIG5leHQgVmFsdmUKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycmVkCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBlcnJvciBvY2N1cnJlZAorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGludm9rZShSZXF1ZXN0IHJlcXVlc3QsIFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIEluaXRpYWxpemUgbG9jYWwgdmFyaWFibGVzIHdlIG1heSBuZWVkCisgICAgICAgIGJvb2xlYW4gdW5hdmFpbGFibGUgPSBmYWxzZTsKKyAgICAgICAgVGhyb3dhYmxlIHRocm93YWJsZSA9IG51bGw7CisgICAgICAgIC8vIFRoaXMgc2hvdWxkIGJlIGEgUmVxdWVzdCBhdHRyaWJ1dGUuLi4KKyAgICAgICAgbG9uZyB0MT1TeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgcmVxdWVzdENvdW50Kys7CisgICAgICAgIFN0YW5kYXJkV3JhcHBlciB3cmFwcGVyID0gKFN0YW5kYXJkV3JhcHBlcikgZ2V0Q29udGFpbmVyKCk7CisgICAgICAgIFNlcnZsZXQgc2VydmxldCA9IG51bGw7CisgICAgICAgIENvbnRleHQgY29udGV4dCA9IChDb250ZXh0KSB3cmFwcGVyLmdldFBhcmVudCgpOworICAgICAgICAKKyAgICAgICAgLy8gQ2hlY2sgZm9yIHRoZSBhcHBsaWNhdGlvbiBiZWluZyBtYXJrZWQgdW5hdmFpbGFibGUKKyAgICAgICAgaWYgKCFjb250ZXh0LmdldEF2YWlsYWJsZSgpKSB7CisgICAgICAgIAlyZXNwb25zZS5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19TRVJWSUNFX1VOQVZBSUxBQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc20uZ2V0U3RyaW5nKCJzdGFuZGFyZENvbnRleHQuaXNVbmF2YWlsYWJsZSIpKTsKKyAgICAgICAgICAgIHVuYXZhaWxhYmxlID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENoZWNrIGZvciB0aGUgc2VydmxldCBiZWluZyBtYXJrZWQgdW5hdmFpbGFibGUKKyAgICAgICAgaWYgKCF1bmF2YWlsYWJsZSAmJiB3cmFwcGVyLmlzVW5hdmFpbGFibGUoKSkgeworICAgICAgICAgICAgY29udGFpbmVyLmdldExvZ2dlcigpLmluZm8oc20uZ2V0U3RyaW5nKCJzdGFuZGFyZFdyYXBwZXIuaXNVbmF2YWlsYWJsZSIsCisgICAgICAgICAgICAgICAgICAgIHdyYXBwZXIuZ2V0TmFtZSgpKSk7CisgICAgICAgICAgICBsb25nIGF2YWlsYWJsZSA9IHdyYXBwZXIuZ2V0QXZhaWxhYmxlKCk7CisgICAgICAgICAgICBpZiAoKGF2YWlsYWJsZSA+IDBMKSAmJiAoYXZhaWxhYmxlIDwgTG9uZy5NQVhfVkFMVUUpKSB7CisgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2V0RGF0ZUhlYWRlcigiUmV0cnktQWZ0ZXIiLCBhdmFpbGFibGUpOworICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcihIdHRwU2VydmxldFJlc3BvbnNlLlNDX1NFUlZJQ0VfVU5BVkFJTEFCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICBzbS5nZXRTdHJpbmcoInN0YW5kYXJkV3JhcHBlci5pc1VuYXZhaWxhYmxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlci5nZXROYW1lKCkpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYXZhaWxhYmxlID09IExvbmcuTUFYX1ZBTFVFKSB7CisgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfTk9UX0ZPVU5ELAorICAgICAgICAgICAgICAgICAgICAgICAgc20uZ2V0U3RyaW5nKCJzdGFuZGFyZFdyYXBwZXIubm90Rm91bmQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVyLmdldE5hbWUoKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdW5hdmFpbGFibGUgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8gQWxsb2NhdGUgYSBzZXJ2bGV0IGluc3RhbmNlIHRvIHByb2Nlc3MgdGhpcyByZXF1ZXN0CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoIXVuYXZhaWxhYmxlKSB7CisgICAgICAgICAgICAgICAgc2VydmxldCA9IHdyYXBwZXIuYWxsb2NhdGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoVW5hdmFpbGFibGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9uZyBhdmFpbGFibGUgPSB3cmFwcGVyLmdldEF2YWlsYWJsZSgpOworICAgICAgICAgICAgaWYgKChhdmFpbGFibGUgPiAwTCkgJiYgKGF2YWlsYWJsZSA8IExvbmcuTUFYX1ZBTFVFKSkgeworICAgICAgICAgICAgCXJlc3BvbnNlLnNldERhdGVIZWFkZXIoIlJldHJ5LUFmdGVyIiwgYXZhaWxhYmxlKTsKKyAgICAgICAgICAgIAlyZXNwb25zZS5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19TRVJWSUNFX1VOQVZBSUxBQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc20uZ2V0U3RyaW5nKCJzdGFuZGFyZFdyYXBwZXIuaXNVbmF2YWlsYWJsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlci5nZXROYW1lKCkpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYXZhaWxhYmxlID09IExvbmcuTUFYX1ZBTFVFKSB7CisgICAgICAgICAgICAJcmVzcG9uc2Uuc2VuZEVycm9yKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfTk9UX0ZPVU5ELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc20uZ2V0U3RyaW5nKCJzdGFuZGFyZFdyYXBwZXIubm90Rm91bmQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZXIuZ2V0TmFtZSgpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFNlcnZsZXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgY29udGFpbmVyLmdldExvZ2dlcigpLmVycm9yKHNtLmdldFN0cmluZygic3RhbmRhcmRXcmFwcGVyLmFsbG9jYXRlRXhjZXB0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlci5nZXROYW1lKCkpLCBlKTsKKyAgICAgICAgICAgIHRocm93YWJsZSA9IGU7CisgICAgICAgICAgICBleGNlcHRpb24ocmVxdWVzdCwgcmVzcG9uc2UsIGUpOworICAgICAgICAgICAgc2VydmxldCA9IG51bGw7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CisgICAgICAgICAgICBjb250YWluZXIuZ2V0TG9nZ2VyKCkuZXJyb3Ioc20uZ2V0U3RyaW5nKCJzdGFuZGFyZFdyYXBwZXIuYWxsb2NhdGVFeGNlcHRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVyLmdldE5hbWUoKSksIGUpOworICAgICAgICAgICAgdGhyb3dhYmxlID0gZTsKKyAgICAgICAgICAgIGV4Y2VwdGlvbihyZXF1ZXN0LCByZXNwb25zZSwgZSk7CisgICAgICAgICAgICBzZXJ2bGV0ID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEFja25vd2xlZ2UgdGhlIHJlcXVlc3QKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRBY2tub3dsZWRnZW1lbnQoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAJcmVxdWVzdC5yZW1vdmVBdHRyaWJ1dGUoR2xvYmFscy5KU1BfRklMRV9BVFRSKTsKKyAgICAgICAgICAgIGNvbnRhaW5lci5nZXRMb2dnZXIoKS53YXJuKHNtLmdldFN0cmluZygic3RhbmRhcmRXcmFwcGVyLmFja25vd2xlZGdlRXhjZXB0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlci5nZXROYW1lKCkpLCBlKTsKKyAgICAgICAgICAgIHRocm93YWJsZSA9IGU7CisgICAgICAgICAgICBleGNlcHRpb24ocmVxdWVzdCwgcmVzcG9uc2UsIGUpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgeworICAgICAgICAgICAgY29udGFpbmVyLmdldExvZ2dlcigpLmVycm9yKHNtLmdldFN0cmluZygic3RhbmRhcmRXcmFwcGVyLmFja25vd2xlZGdlRXhjZXB0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlci5nZXROYW1lKCkpLCBlKTsKKyAgICAgICAgICAgIHRocm93YWJsZSA9IGU7CisgICAgICAgICAgICBleGNlcHRpb24ocmVxdWVzdCwgcmVzcG9uc2UsIGUpOworICAgICAgICAgICAgc2VydmxldCA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgTWVzc2FnZUJ5dGVzIHJlcXVlc3RQYXRoTUIgPSBudWxsOworICAgICAgICBpZiAocmVxdWVzdCAhPSBudWxsKSB7CisgICAgICAgICAgICByZXF1ZXN0UGF0aE1CID0gcmVxdWVzdC5nZXRSZXF1ZXN0UGF0aE1CKCk7CisgICAgICAgIH0KKyAgICAgICAgcmVxdWVzdC5zZXRBdHRyaWJ1dGUKKyAgICAgICAgICAgIChBcHBsaWNhdGlvbkZpbHRlckZhY3RvcnkuRElTUEFUQ0hFUl9UWVBFX0FUVFIsCisgICAgICAgICAgICAgQXBwbGljYXRpb25GaWx0ZXJGYWN0b3J5LlJFUVVFU1RfSU5URUdFUik7CisgICAgICAgIHJlcXVlc3Quc2V0QXR0cmlidXRlCisgICAgICAgICAgICAoQXBwbGljYXRpb25GaWx0ZXJGYWN0b3J5LkRJU1BBVENIRVJfUkVRVUVTVF9QQVRIX0FUVFIsCisgICAgICAgICAgICAgcmVxdWVzdFBhdGhNQik7CisgICAgICAgIC8vIENyZWF0ZSB0aGUgZmlsdGVyIGNoYWluIGZvciB0aGlzIHJlcXVlc3QKKyAgICAgICAgQXBwbGljYXRpb25GaWx0ZXJGYWN0b3J5IGZhY3RvcnkgPQorICAgICAgICAgICAgQXBwbGljYXRpb25GaWx0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCk7CisgICAgICAgIEFwcGxpY2F0aW9uRmlsdGVyQ2hhaW4gZmlsdGVyQ2hhaW4gPQorICAgICAgICAgICAgZmFjdG9yeS5jcmVhdGVGaWx0ZXJDaGFpbihyZXF1ZXN0LCB3cmFwcGVyLCBzZXJ2bGV0KTsKKworICAgICAgICAvLyBDYWxsIHRoZSBmaWx0ZXIgY2hhaW4gZm9yIHRoaXMgcmVxdWVzdAorICAgICAgICAvLyBOT1RFOiBUaGlzIGFsc28gY2FsbHMgdGhlIHNlcnZsZXQncyBzZXJ2aWNlKCkgbWV0aG9kCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTdHJpbmcganNwRmlsZSA9IHdyYXBwZXIuZ2V0SnNwRmlsZSgpOworICAgICAgICAgICAgaWYgKGpzcEZpbGUgIT0gbnVsbCkKKyAgICAgICAgICAgIAlyZXF1ZXN0LnNldEF0dHJpYnV0ZShHbG9iYWxzLkpTUF9GSUxFX0FUVFIsIGpzcEZpbGUpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgCXJlcXVlc3QucmVtb3ZlQXR0cmlidXRlKEdsb2JhbHMuSlNQX0ZJTEVfQVRUUik7CisgICAgICAgICAgICBpZiAoKHNlcnZsZXQgIT0gbnVsbCkgJiYgKGZpbHRlckNoYWluICE9IG51bGwpKSB7CisKKyAgICAgICAgICAgICAgICAvLyBTd2FsbG93IG91dHB1dCBpZiBuZWVkZWQKKyAgICAgICAgICAgICAgICBpZiAoY29udGV4dC5nZXRTd2FsbG93T3V0cHV0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbUxvZ0hhbmRsZXIuc3RhcnRDYXB0dXJlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJDaGFpbi5kb0ZpbHRlcihyZXF1ZXN0LmdldFJlcXVlc3QoKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmdldFJlc3BvbnNlKCkpOworICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxvZyA9IFN5c3RlbUxvZ0hhbmRsZXIuc3RvcENhcHR1cmUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2cgIT0gbnVsbCAmJiBsb2cubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5nZXRMb2dnZXIoKS5pbmZvKGxvZyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmaWx0ZXJDaGFpbi5kb0ZpbHRlcgorICAgICAgICAgICAgICAgICAgICAgICAgKHJlcXVlc3QuZ2V0UmVxdWVzdCgpLCByZXNwb25zZS5nZXRSZXNwb25zZSgpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcXVlc3QucmVtb3ZlQXR0cmlidXRlKEdsb2JhbHMuSlNQX0ZJTEVfQVRUUik7CisgICAgICAgIH0gY2F0Y2ggKENsaWVudEFib3J0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgCXJlcXVlc3QucmVtb3ZlQXR0cmlidXRlKEdsb2JhbHMuSlNQX0ZJTEVfQVRUUik7CisgICAgICAgICAgICB0aHJvd2FibGUgPSBlOworICAgICAgICAgICAgZXhjZXB0aW9uKHJlcXVlc3QsIHJlc3BvbnNlLCBlKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAJcmVxdWVzdC5yZW1vdmVBdHRyaWJ1dGUoR2xvYmFscy5KU1BfRklMRV9BVFRSKTsKKyAgICAgICAgICAgIGNvbnRhaW5lci5nZXRMb2dnZXIoKS53YXJuKHNtLmdldFN0cmluZygic3RhbmRhcmRXcmFwcGVyLnNlcnZpY2VFeGNlcHRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVyLmdldE5hbWUoKSksIGUpOworICAgICAgICAgICAgdGhyb3dhYmxlID0gZTsKKyAgICAgICAgICAgIGV4Y2VwdGlvbihyZXF1ZXN0LCByZXNwb25zZSwgZSk7CisgICAgICAgIH0gY2F0Y2ggKFVuYXZhaWxhYmxlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgCXJlcXVlc3QucmVtb3ZlQXR0cmlidXRlKEdsb2JhbHMuSlNQX0ZJTEVfQVRUUik7CisgICAgICAgICAgICBjb250YWluZXIuZ2V0TG9nZ2VyKCkud2FybihzbS5nZXRTdHJpbmcoInN0YW5kYXJkV3JhcHBlci5zZXJ2aWNlRXhjZXB0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlci5nZXROYW1lKCkpLCBlKTsKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgdGhyb3dhYmxlID0gZTsKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgZXhjZXB0aW9uKHJlcXVlc3QsIHJlc3BvbnNlLCBlKTsKKyAgICAgICAgICAgIHdyYXBwZXIudW5hdmFpbGFibGUoZSk7CisgICAgICAgICAgICBsb25nIGF2YWlsYWJsZSA9IHdyYXBwZXIuZ2V0QXZhaWxhYmxlKCk7CisgICAgICAgICAgICBpZiAoKGF2YWlsYWJsZSA+IDBMKSAmJiAoYXZhaWxhYmxlIDwgTG9uZy5NQVhfVkFMVUUpKSB7CisgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2V0RGF0ZUhlYWRlcigiUmV0cnktQWZ0ZXIiLCBhdmFpbGFibGUpOworICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcihIdHRwU2VydmxldFJlc3BvbnNlLlNDX1NFUlZJQ0VfVU5BVkFJTEFCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzbS5nZXRTdHJpbmcoInN0YW5kYXJkV3JhcHBlci5pc1VuYXZhaWxhYmxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVyLmdldE5hbWUoKSkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChhdmFpbGFibGUgPT0gTG9uZy5NQVhfVkFMVUUpIHsKKyAgICAgICAgICAgIAlyZXNwb25zZS5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19OT1RfRk9VTkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc20uZ2V0U3RyaW5nKCJzdGFuZGFyZFdyYXBwZXIubm90Rm91bmQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZXIuZ2V0TmFtZSgpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBEbyBub3Qgc2F2ZSBleGNlcHRpb24gaW4gJ3Rocm93YWJsZScsIGJlY2F1c2Ugd2UKKyAgICAgICAgICAgIC8vIGRvIG5vdCB3YW50IHRvIGRvIGV4Y2VwdGlvbihyZXF1ZXN0LCByZXNwb25zZSwgZSkgcHJvY2Vzc2luZworICAgICAgICB9IGNhdGNoIChTZXJ2bGV0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgCXJlcXVlc3QucmVtb3ZlQXR0cmlidXRlKEdsb2JhbHMuSlNQX0ZJTEVfQVRUUik7CisgICAgICAgICAgICBUaHJvd2FibGUgcm9vdENhdXNlID0gZTsKKyAgICAgICAgICAgIFRocm93YWJsZSByb290Q2F1c2VDaGVjayA9IG51bGw7CisKKyAgICAgICAgICAgIC8vIEV4dHJhIGFnZ3Jlc3NpdmUgcm9vdENhdXNlIGZpbmRpbmcKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICByb290Q2F1c2VDaGVjayA9IChUaHJvd2FibGUpSW50cm9zcGVjdGlvblV0aWxzLmdldFByb3BlcnR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocm9vdENhdXNlLCAicm9vdENhdXNlIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChyb290Q2F1c2VDaGVjayE9bnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RDYXVzZSA9IHJvb3RDYXVzZUNoZWNrOworCisgICAgICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgIHJvb3RDYXVzZUNoZWNrID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IHdoaWxlIChyb290Q2F1c2VDaGVjayAhPSBudWxsKTsKKworICAgICAgICAgICAgaWYgKCEocm9vdENhdXNlIGluc3RhbmNlb2YgQ2xpZW50QWJvcnRFeGNlcHRpb24pKSB7CisgICAgICAgICAgICAgICAgY29udGFpbmVyLmdldExvZ2dlcigpLmVycm9yKHNtLmdldFN0cmluZygic3RhbmRhcmRXcmFwcGVyLnNlcnZpY2VFeGNlcHRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlci5nZXROYW1lKCkpLCByb290Q2F1c2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3dhYmxlID0gZTsKKyAgICAgICAgICAgIGV4Y2VwdGlvbihyZXF1ZXN0LCByZXNwb25zZSwgZSk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CisgICAgICAgICAgICByZXF1ZXN0LnJlbW92ZUF0dHJpYnV0ZShHbG9iYWxzLkpTUF9GSUxFX0FUVFIpOworICAgICAgICAgICAgY29udGFpbmVyLmdldExvZ2dlcigpLmVycm9yKHNtLmdldFN0cmluZygic3RhbmRhcmRXcmFwcGVyLnNlcnZpY2VFeGNlcHRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVyLmdldE5hbWUoKSksIGUpOworICAgICAgICAgICAgdGhyb3dhYmxlID0gZTsKKyAgICAgICAgICAgIGV4Y2VwdGlvbihyZXF1ZXN0LCByZXNwb25zZSwgZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZWxlYXNlIHRoZSBmaWx0ZXIgY2hhaW4gKGlmIGFueSkgZm9yIHRoaXMgcmVxdWVzdAorICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKGZpbHRlckNoYWluICE9IG51bGwpCisgICAgICAgICAgICAgICAgZmlsdGVyQ2hhaW4ucmVsZWFzZSgpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgeworICAgICAgICAgICAgY29udGFpbmVyLmdldExvZ2dlcigpLmVycm9yKHNtLmdldFN0cmluZygic3RhbmRhcmRXcmFwcGVyLnJlbGVhc2VGaWx0ZXJzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlci5nZXROYW1lKCkpLCBlKTsKKyAgICAgICAgICAgIGlmICh0aHJvd2FibGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93YWJsZSA9IGU7CisgICAgICAgICAgICAgICAgZXhjZXB0aW9uKHJlcXVlc3QsIHJlc3BvbnNlLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIERlYWxsb2NhdGUgdGhlIGFsbG9jYXRlZCBzZXJ2bGV0IGluc3RhbmNlCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoc2VydmxldCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgd3JhcHBlci5kZWFsbG9jYXRlKHNlcnZsZXQpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgeworICAgICAgICAgICAgY29udGFpbmVyLmdldExvZ2dlcigpLmVycm9yKHNtLmdldFN0cmluZygic3RhbmRhcmRXcmFwcGVyLmRlYWxsb2NhdGVFeGNlcHRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVyLmdldE5hbWUoKSksIGUpOworICAgICAgICAgICAgaWYgKHRocm93YWJsZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3dhYmxlID0gZTsKKyAgICAgICAgICAgICAgICBleGNlcHRpb24ocmVxdWVzdCwgcmVzcG9uc2UsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgdGhpcyBzZXJ2bGV0IGhhcyBiZWVuIG1hcmtlZCBwZXJtYW5lbnRseSB1bmF2YWlsYWJsZSwKKyAgICAgICAgLy8gdW5sb2FkIGl0IGFuZCByZWxlYXNlIHRoaXMgaW5zdGFuY2UKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICgoc2VydmxldCAhPSBudWxsKSAmJgorICAgICAgICAgICAgICAgICh3cmFwcGVyLmdldEF2YWlsYWJsZSgpID09IExvbmcuTUFYX1ZBTFVFKSkgeworICAgICAgICAgICAgICAgIHdyYXBwZXIudW5sb2FkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CisgICAgICAgICAgICBjb250YWluZXIuZ2V0TG9nZ2VyKCkuZXJyb3Ioc20uZ2V0U3RyaW5nKCJzdGFuZGFyZFdyYXBwZXIudW5sb2FkRXhjZXB0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlci5nZXROYW1lKCkpLCBlKTsKKyAgICAgICAgICAgIGlmICh0aHJvd2FibGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93YWJsZSA9IGU7CisgICAgICAgICAgICAgICAgZXhjZXB0aW9uKHJlcXVlc3QsIHJlc3BvbnNlLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBsb25nIHQyPVN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCisgICAgICAgIGxvbmcgdGltZT10Mi10MTsKKyAgICAgICAgcHJvY2Vzc2luZ1RpbWUgKz0gdGltZTsKKyAgICAgICAgaWYoIHRpbWUgPiBtYXhUaW1lKSBtYXhUaW1lPXRpbWU7CisgICAgICAgIGlmKCB0aW1lIDwgbWluVGltZSkgbWluVGltZT10aW1lOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcml2YXRlIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogSGFuZGxlIHRoZSBzcGVjaWZpZWQgU2VydmxldEV4Y2VwdGlvbiBlbmNvdW50ZXJlZCB3aGlsZSBwcm9jZXNzaW5nCisgICAgICogdGhlIHNwZWNpZmllZCBSZXF1ZXN0IHRvIHByb2R1Y2UgdGhlIHNwZWNpZmllZCBSZXNwb25zZS4gIEFueQorICAgICAqIGV4Y2VwdGlvbnMgdGhhdCBvY2N1ciBkdXJpbmcgZ2VuZXJhdGlvbiBvZiB0aGUgZXhjZXB0aW9uIHJlcG9ydCBhcmUKKyAgICAgKiBsb2dnZWQgYW5kIHN3YWxsb3dlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSByZXF1ZXN0IGJlaW5nIHByb2Nlc3NlZAorICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgcmVzcG9uc2UgYmVpbmcgZ2VuZXJhdGVkCisgICAgICogQHBhcmFtIGV4Y2VwdGlvbiBUaGUgZXhjZXB0aW9uIHRoYXQgb2NjdXJyZWQgKHdoaWNoIHBvc3NpYmx5IHdyYXBzCisgICAgICogIGEgcm9vdCBjYXVzZSBleGNlcHRpb24KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZXhjZXB0aW9uKFJlcXVlc3QgcmVxdWVzdCwgUmVzcG9uc2UgcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJvd2FibGUgZXhjZXB0aW9uKSB7CisgICAgCXJlcXVlc3Quc2V0QXR0cmlidXRlKEdsb2JhbHMuRVhDRVBUSU9OX0FUVFIsIGV4Y2VwdGlvbik7CisgICAgICAgIHJlc3BvbnNlLnNldFN0YXR1cyhIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUik7CisKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBnZXRQcm9jZXNzaW5nVGltZSgpIHsKKyAgICAgICAgcmV0dXJuIHByb2Nlc3NpbmdUaW1lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFByb2Nlc3NpbmdUaW1lKGxvbmcgcHJvY2Vzc2luZ1RpbWUpIHsKKyAgICAgICAgdGhpcy5wcm9jZXNzaW5nVGltZSA9IHByb2Nlc3NpbmdUaW1lOworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGdldE1heFRpbWUoKSB7CisgICAgICAgIHJldHVybiBtYXhUaW1lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1heFRpbWUobG9uZyBtYXhUaW1lKSB7CisgICAgICAgIHRoaXMubWF4VGltZSA9IG1heFRpbWU7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgZ2V0TWluVGltZSgpIHsKKyAgICAgICAgcmV0dXJuIG1pblRpbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TWluVGltZShsb25nIG1pblRpbWUpIHsKKyAgICAgICAgdGhpcy5taW5UaW1lID0gbWluVGltZTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFJlcXVlc3RDb3VudCgpIHsKKyAgICAgICAgcmV0dXJuIHJlcXVlc3RDb3VudDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRSZXF1ZXN0Q291bnQoaW50IHJlcXVlc3RDb3VudCkgeworICAgICAgICB0aGlzLnJlcXVlc3RDb3VudCA9IHJlcXVlc3RDb3VudDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldEVycm9yQ291bnQoKSB7CisgICAgICAgIHJldHVybiBlcnJvckNvdW50OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEVycm9yQ291bnQoaW50IGVycm9yQ291bnQpIHsKKyAgICAgICAgdGhpcy5lcnJvckNvdW50ID0gZXJyb3JDb3VudDsKKyAgICB9CisKKyAgICAvLyBEb24ndCByZWdpc3RlciBpbiBKTVgKKworICAgIHB1YmxpYyBPYmplY3ROYW1lIGNyZWF0ZU9iamVjdE5hbWUoU3RyaW5nIGRvbWFpbiwgT2JqZWN0TmFtZSBwYXJlbnQpCisgICAgICAgICAgICB0aHJvd3MgTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NvcmUvbWJlYW5zLWRlc2NyaXB0b3JzLnhtbCBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb3JlL21iZWFucy1kZXNjcmlwdG9ycy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNkYTdhNgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jb3JlL21iZWFucy1kZXNjcmlwdG9ycy54bWwKQEAgLTAsMCArMSw2NTAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPG1iZWFucy1kZXNjcmlwdG9ycz4KKworICA8bWJlYW4gbmFtZT0iTmFtaW5nQ29udGV4dExpc3RlbmVyIgorICAgICAgICAgZGVzY3JpcHRpb249IkhlbHBlciBjbGFzcyB1c2VkIHRvIGluaXRpYWxpemUgYW5kIHBvcHVsYXRlIHRoZSBKTkRJIGNvbnRleHQgYXNzb2NpYXRlZCB3aXRoIGVhY2ggY29udGV4dCBhbmQgc2VydmVyIgorICAgICAgICAgZG9tYWluPSJDYXRhbGluYSIKKyAgICAgICAgIGdyb3VwPSJMaXN0ZW5lciIKKyAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5OYW1pbmdDb250ZXh0TGlzdGVuZXIiPgorICAgIAorICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NOYW1lIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IkZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBtYW5hZ2VkIG9iamVjdCIKKyAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgICAKKyAgPC9tYmVhbj4KKworICA8bWJlYW4gbmFtZT0iU3RhbmRhcmRDb250ZXh0IgorICAgICAgICAgZGVzY3JpcHRpb249IlN0YW5kYXJkIENvbnRleHQgQ29tcG9uZW50IgorICAgICAgICAgZG9tYWluPSJDYXRhbGluYSIKKyAgICAgICAgIGdyb3VwPSJDb250ZXh0IgorICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkQ29udGV4dCI+CisgICAgCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJhbGxvd0xpbmtpbmciCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iQWxsb3cgc3ltbGlua2luZyB0byBvdXRzaWRlIHRoZSB3ZWJhcHAgcm9vdCBkaXJlY3RvcnksIGlmIHRoZSB3ZWJhcHAgaXMgYW4gZXhwbG9kZWQgZGlyZWN0b3J5IgorICAgICAgICAgICAgICAgaXM9InRydWUiCisgICAgICAgICAgICAgICB0eXBlPSJib29sZWFuIi8+CisgICAgICAKKyAgICA8YXR0cmlidXRlIG5hbWU9ImFudGlKQVJMb2NraW5nIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlRha2UgY2FyZSB0byBub3QgbG9jayBqYXIgZmlsZXMiCisgICAgICAgICAgICAgICB0eXBlPSJib29sZWFuIiAvPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJhbnRpUmVzb3VyY2VMb2NraW5nIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlRha2UgY2FyZSB0byBub3QgbG9jayByZXNvdXJjZXMiCisgICAgICAgICAgICAgICB0eXBlPSJib29sZWFuIiAvPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJjYWNoZU1heFNpemUiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iTWF4aW11bSBjYWNoZSBzaXplIGluIEtCIgorICAgICAgICAgICAgICAgdHlwZT0iaW50Ii8+CisgICAgICAKKyAgICA8YXR0cmlidXRlIG5hbWU9ImNhY2hlVFRMIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlRpbWUgaW50ZXJ2YWwgaW4gbXMgYmV0d2VlbiBjYWNoZSByZWZlc2hlcyIKKyAgICAgICAgICAgICAgIHR5cGU9ImludCIvPgorICAgICAgCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJjYWNoaW5nQWxsb3dlZCIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJTaG91bGQgd2UgY2FjaGUgc3RhdGljIHJlc291cmNlcyBmb3IgdGhpcyB3ZWJhcHAiCisgICAgICAgICAgICAgICBpcz0idHJ1ZSIKKyAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iLz4KKyAgICAgIAorICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2FzZVNlbnNpdGl2ZSIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJTaG91bGQgY2FzZSBzZW5zaXRpdml0eSBjaGVja3MgYmUgcGVyZm9ybWVkIgorICAgICAgICAgICAgICAgaXM9InRydWUiCisgICAgICAgICAgICAgICB0eXBlPSJib29sZWFuIi8+CisgICAgICAKKyAgICA8YXR0cmlidXRlIG5hbWU9ImNoaWxkcmVuIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249Ik9iamVjdCBuYW1lcyBvZiBhbGwgY2hpbGRyZW4iCisgICAgICAgICAgICAgICB0eXBlPSJbTGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsiLz4KKyAgICAgICAgICAgICAgIAorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJjb29raWVzIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlNob3VsZCB3ZSBhdHRlbXB0IHRvIHVzZSBjb29raWVzIGZvciBzZXNzaW9uIGlkCisgICAgICAgICAgICAgICBjb21tdW5pY2F0aW9uPyIKKyAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iLz4KKyAgICAgIAorICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29tcGlsZXJDbGFzc3BhdGgiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIGNvbXBpbGVyIGNsYXNzcGF0aCB0byB1c2UiCisgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgICAKKyAgICA8YXR0cmlidXRlIG5hbWU9ImNyb3NzQ29udGV4dCIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJTaG91bGQgd2UgYWxsb3cgdGhlIFNlcnZsZXRDb250ZXh0LmdldENvbnRleHQoKSBtZXRob2QgdG8gYWNjZXNzIHRoZSBjb250ZXh0IG9mIG90aGVyIHdlYiBhcHBsaWNhdGlvbnMgaW4gdGhpcyBzZXJ2ZXI/IgorICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIvPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZWZhdWx0Q29udGV4dFhtbCIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJMb2NhdGlvbiBvZiB0aGUgZGVmYXVsdCBjb250ZXh0LnhtbCByZXNvdXJjZSBvciBmaWxlIgorICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgICAgICAgICAgICAgCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZWZhdWx0V2ViWG1sIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IkxvY2F0aW9uIG9mIHRoZSBkZWZhdWx0IHdlYi54bWwgcmVzb3VyY2Ugb3IgZmlsZSIKKyAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICAgICAgICAgICAgIAorICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVsZWdhdGUiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iIgorICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIvPgorICAgICAgICAgICAgICAgCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXBsb3ltZW50RGVzY3JpcHRvciIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJTdHJpbmcgZGVwbG95bWVudCBkZXNjcmlwdG9yICIKKyAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICAgICAgICAgICAgICAgICAgIAorICAgIDxhdHRyaWJ1dGUgbmFtZT0iZG9jQmFzZSIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgZG9jdW1lbnQgcm9vdCBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24iCisgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgICAKKyAgICA8YXR0cmlidXRlIG5hbWU9ImVuZ2luZU5hbWUiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iTmFtZSBvZiB0aGUgZW5naW5lIGRvbWFpbiwgaWYgZGlmZmVyZW50IGZyb20gdGhlIGNvbnRleHQgZG9tYWluIgorICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJldmVudFByb3ZpZGVyIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IkV2ZW50IHByb3ZpZGVyIHN1cHBvcnQgZm9yIHRoaXMgbWFuYWdlZCBvYmplY3QiCisgICAgICAgICAgICAgICBpcz0idHJ1ZSIKKyAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIDxhdHRyaWJ1dGUgbmFtZT0iamF2YVZNcyIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgSmF2YSB2aXJ0dWFsIG1hY2hpbmVzIG9uIHdoaWNoIHRoaXMgbW9kdWxlIGlzIHJ1bm5pbmciCisgICAgICAgICAgICAgICB0eXBlPSJbTGphdmEubGFuZy5TdHJpbmc7Ii8+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9ImxvYWRlciIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJBc3NvY2lhdGVkIGxvYWRlci4iCisgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLkxvYWRlciIgLz4KKyAgICAgIAorICAgIDxhdHRyaWJ1dGUgbmFtZT0ibG9nZ2VyIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IkFzc29jaWF0ZWQgbG9nZ2VyLiIKKyAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZyIgLz4KKyAgICAgIAorICAgIDxhdHRyaWJ1dGUgbmFtZT0ibWFuYWdlZFJlc291cmNlIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBtYW5hZ2VkIHJlc291cmNlIHRoaXMgTUJlYW4gaXMgYXNzb2NpYXRlZCB3aXRoIgorICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLk9iamVjdCIvPgorICAgICAgCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJtYW5hZ2VyIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IkFzc29jaWF0ZWQgbWFuYWdlci4iCisgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLk1hbmFnZXIiIC8+CisgICAgICAKKyAgICA8YXR0cmlidXRlIG5hbWU9Im1hbmFnZXJDaGVja3NGcmVxdWVuY3kiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIGZyZXF1ZW5jeSBvZiB0aGUgbWFuYWdlciBjaGVja3MgKGV4cGlyYXRpb24gYW5kIHBhc3NpdmF0aW9uKSIKKyAgICAgICAgICAgICAgIHR5cGU9ImludCIvPgorICAgICAgICAgICAgICAgCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJtYXBwaW5nT2JqZWN0IgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBvYmplY3QgdXNlZCBmb3IgbWFwcGluZyIKKyAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5PYmplY3QiLz4KKyAgICAgIAorICAgIDxhdHRyaWJ1dGUgbmFtZT0ib2JqZWN0TmFtZSIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJOYW1lIG9mIHRoZSBvYmplY3QiCisgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgICAKKyAgICA8YXR0cmlidXRlIG5hbWU9Im92ZXJyaWRlIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBEZWZhdWx0Q29udGV4dCBvdmVycmlkZSBmbGFnIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbiIKKyAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iLz4KKyAgICAgIAorICAgIDxhdHRyaWJ1dGUgbmFtZT0icGFyZW50Q2xhc3NMb2FkZXIiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iUGFyZW50IGNsYXNzIGxvYWRlci4iCisgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuQ2xhc3NMb2FkZXIiIC8+CisgICAgICAKKyAgICA8YXR0cmlidXRlIG5hbWU9InBhdGgiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIGNvbnRleHQgcGF0aCBmb3IgdGhpcyBDb250ZXh0IgorICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgICAgICAgICAgICAgCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJwcml2aWxlZ2VkIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IkFjY2VzcyB0byB0b21jYXQgaW50ZXJuYWxzIgorICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIvPgorICAgICAgCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJyZWFsbSIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJBc3NvY2lhdGVkIHJlYWxtLiIKKyAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuUmVhbG0iIC8+CisgICAgICAKKyAgICA8YXR0cmlidXRlIG5hbWU9InJlbG9hZGFibGUiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIHJlbG9hZGFibGUgZmxhZyBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24iCisgICAgICAgICAgICAgICB0eXBlPSJib29sZWFuIi8+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9InNhdmVDb25maWciCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iU2hvdWxkIHRoZSBjb25maWd1cmF0aW9uIGJlIHdyaXR0ZW4gYXMgbmVlZGVkIG9uIHN0YXJ0dXAiCisgICAgICAgICAgICAgICBpcz0idHJ1ZSIKKyAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iLz4KKyAgICAgIAorICAgIDxhdHRyaWJ1dGUgbmFtZT0ic2VydmVyIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBKMkVFIFNlcnZlciB0aGlzIG1vZHVsZSBpcyBkZXBsb3llZCBvbiIKKyAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIDxhdHRyaWJ1dGUgbmFtZT0ic2VydmxldHMiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iSlNSNzcgbGlzdCBvZiBzZXJ2bGV0cyIKKyAgICAgICAgICAgICAgIHR5cGU9IltMamF2YS5sYW5nLlN0cmluZzsiCisgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgICAgICAgICAgICAKKyAgICA8YXR0cmlidXRlIG5hbWU9InN0YXJ0dXBUaW1lIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlRpbWUgKGluIG1pbGxpc2Vjb25kcykgaXQgdG9vayB0byBzdGFydCB0aGlzIGNvbnRleHQiCisgICAgICAgICAgICAgICB0eXBlPSJsb25nIi8+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9InN0YXJ0VGltZSIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaW1lIChpbiBtaWxsaXNlY29uZHMgc2luY2UgSmFudWFyeSAxLCAxOTcwLCAwMDowMDowMCkgd2hlbiB0aGlzIGNvbnRleHQgd2FzIHN0YXJ0ZWQiCisgICAgICAgICAgICAgICB0eXBlPSJsb25nIi8+CisgICAgICAgICAgICAgICAKKyAgICA8YXR0cmlidXRlIG5hbWU9InN0YXRlIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IkN1cnJlbnQgc3RhdGUgb2YgdGhpcyBjb21wb25lbnQiCisgICAgICAgICAgICAgICB0eXBlPSJpbnQiLz4KKyAgICAgICAgICAgICAgICAgICAgIAorICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3RhdGVNYW5hZ2VhYmxlIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlN0YXRlIG1hbmFnZW1lbnQgc3VwcG9ydCBmb3IgdGhpcyBtYW5hZ2VkIG9iamVjdCIKKyAgICAgICAgICAgICAgIGlzPSJ0cnVlIgorICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIvPgorICAgICAgICAgICAgICAgCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJzdGF0aXN0aWNzUHJvdmlkZXIiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iUGVyZm9ybWFuY2Ugc3RhdGlzdGljcyBzdXBwb3J0IGZvciB0aGlzIG1hbmFnZWQgb2JqZWN0IgorICAgICAgICAgICAgICAgaXM9InRydWUiCisgICAgICAgICAgICAgICB0eXBlPSJib29sZWFuIi8+CisgICAgICAgICAgICAgICAKKyAgICA8YXR0cmlidXRlIG5hbWU9InN0YXRpY1Jlc291cmNlcyIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJTdGF0aWMgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29udGV4dC4iCisgICAgICAgICAgICAgICB0eXBlPSJqYXZheC5uYW1pbmcuZGlyZWN0b3J5LkRpckNvbnRleHQiCisgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgICAKKyAgICA8YXR0cmlidXRlICAgbmFtZT0ic3dhbGxvd091dHB1dCIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJGbGFnIHRvIHNldCB0byBjYXVzZSB0aGUgc3lzdGVtLm91dCBhbmQgc3lzdGVtLmVyciB0byBiZSByZWRpcmVjdGVkIHRvIHRoZSBsb2dnZXIgd2hlbiBleGVjdXRpbmcgYSBzZXJ2bGV0IgorICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIvPgorICAgICAgICAgICAgICAgCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0bGRTY2FuVGltZSIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaW1lIHNwZW5kIHNjYW5uaW5nIGphcnMgZm9yIFRMRHMgZm9yIHRoaXMgY29udGV4dCIKKyAgICAgICAgICAgICAgIHR5cGU9ImxvbmciLz4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0idXNlTmFtaW5nIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBhIEpOREkgbmFtaW5nIGNvbnRleHQgZm9yIHRoaXMgYXBwbGljYXRpb24/IgorICAgICAgICAgICAgICAgaXM9InRydWUiCisgICAgICAgICAgICAgICB0eXBlPSJib29sZWFuIi8+CisgICAgICAgICAgICAgICAKKyAgICA8YXR0cmlidXRlIG5hbWU9InZhbHZlT2JqZWN0TmFtZXMiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iT2JqZWN0TmFtZXMgZm9yIHRoZSB2YWx2ZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29udGFpbmVyIgorICAgICAgICAgICAgICAgdHlwZT0iW0xqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7IgorICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJ3ZWxjb21lRmlsZXMiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIHdlbGNvbWUgZmlsZXMgZm9yIHRoaXMgY29udGV4dCIKKyAgICAgICAgICAgICAgIHR5cGU9IltMamF2YS5sYW5nLlN0cmluZzsiCisgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgICAKKyAgICA8YXR0cmlidXRlIG5hbWU9IndvcmtEaXIiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIHBhdGhuYW1lIHRvIHRoZSB3b3JrIGRpcmVjdG9yeSBmb3IgdGhpcyBjb250ZXh0IgorICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorCisgICAgPG9wZXJhdGlvbiAgIG5hbWU9ImFkZFZhbHZlIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IkFkZCBhIHZhbHZlIHRvIHRoaXMgQ29udGV4dCIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICAgICAgcmV0dXJuVHlwZT0idm9pZCI+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9InZhbHZlIgorICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iTmV3IHZhbHZlIHRvIGJlIGFkZGVkIgorICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLlZhbHZlIi8+CisgICAgPC9vcGVyYXRpb24+CisgICAgCisgICAgPG9wZXJhdGlvbiAgIG5hbWU9InJlbW92ZVZhbHZlIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlJlbW92ZSBhIHZhbHZlIGZyb20gdGhpcyBDb250ZXh0IgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgICAgICByZXR1cm5UeXBlPSJ2b2lkIj4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0idmFsdmUiCisgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJOZXcgdmFsdmUgdG8gYmUgcmVtb3ZlZCIKKyAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5WYWx2ZSIvPgorICAgIDwvb3BlcmF0aW9uPgorICAgIAorICAgIDxvcGVyYXRpb24gICBuYW1lPSJyZWxvYWQiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iUmVsb2FkIHRoZSB3ZWJhcHBsaWNhdGlvbiIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICAgICAgcmV0dXJuVHlwZT0idm9pZCI+CisgICAgPC9vcGVyYXRpb24+CisgICAgCisgICAgPG9wZXJhdGlvbiAgIG5hbWU9ImluaXQiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iUmVnaXN0ZXIgdGhlIGNvbnRleHQgaW50byB0aGUgcnVubmluZyBzZXJ2ZXIiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiPgorICAgIDwvb3BlcmF0aW9uPgorICAgIAorICAgIDxvcGVyYXRpb24gICBuYW1lPSJzdGFydCIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJTdGFydCB0aGUgY29udGV4IgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgICAgICByZXR1cm5UeXBlPSJ2b2lkIj4KKyAgICA8L29wZXJhdGlvbj4KKyAgICAKKyAgICA8b3BlcmF0aW9uIG5hbWU9InN0b3AiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iU3RvcCB0aGUgY29udGV4IgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgICAgICByZXR1cm5UeXBlPSJ2b2lkIj4KKyAgICA8L29wZXJhdGlvbj4KKyAgICAKKyAgICA8b3BlcmF0aW9uIG5hbWU9ImRlc3Ryb3kiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iRGVzdHJveSB0aGUgY29udGV4IgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgICAgICByZXR1cm5UeXBlPSJ2b2lkIj4KKyAgICA8L29wZXJhdGlvbj4KKyAgICAKKyAgICA8b3BlcmF0aW9uIG5hbWU9ImZpbmRNYXBwaW5nT2JqZWN0IgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlJldHVybiBhbiBvYmplY3Qgd2hpY2ggbWF5IGJlIHV0aWxpemVkIGZvciBtYXBwaW5nIHRvIHRoaXMgY29tcG9uZW50IgorICAgICAgICAgICAgICAgaW1wYWN0PSJJTkZPIgorICAgICAgICAgICAgICAgcmV0dXJuVHlwZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5Db250ZXh0Ij4gICAgCisgICAgPC9vcGVyYXRpb24+ICAgIAorICAgIAorICAgIDxvcGVyYXRpb24gbmFtZT0iZmluZFN0YXRpY1Jlc291cmNlcyIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJSZXR1cm4gdGhlIG5hbWluZyByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViIGFwcGxpY2F0aW9uIgorICAgICAgICAgICAgICAgaW1wYWN0PSJJTkZPIgorICAgICAgICAgICAgICAgcmV0dXJuVHlwZT0iamF2YXgubmFtaW5nLmRpcmVjdG9yeS5EaXJDb250ZXh0Ij4gICAgCisgICAgPC9vcGVyYXRpb24+CisgICAgCisgIDwvbWJlYW4+CisgIAorICA8bWJlYW4gbmFtZT0iU3RhbmRhcmRDb250ZXh0VmFsdmUiCisgICAgICAgICBkZXNjcmlwdGlvbj0iVmFsdmUgdGhhdCBpbXBsZW1lbnRzIHRoZSBkZWZhdWx0IGJhc2ljIGJlaGF2aW9yIGZvciB0aGUKKyAgICAgICAgIFN0YW5kYXJkQ29udGV4dCBjb250YWluZXIgaW1wbGVtZW50YXRpb24iCisgICAgICAgICBkb21haW49IkNhdGFsaW5hIgorICAgICAgICAgZ3JvdXA9IlZhbHZlIgorICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkQ29udGV4dFZhbHZlIj4KKyAgICAKKyAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzTmFtZSIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJGdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgbWFuYWdlZCBvYmplY3QiCisgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgICAgCisgIDwvbWJlYW4+CisgIAorICA8bWJlYW4gbmFtZT0iU3RhbmRhcmRFbmdpbmUiCisgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRFbmdpbmUiCisgICAgICAgICBkZXNjcmlwdGlvbj0iU3RhbmRhcmQgRW5naW5lIENvbXBvbmVudCIKKyAgICAgICAgIGRvbWFpbj0iQ2F0YWxpbmEiCisgICAgICAgICBncm91cD0iRW5naW5lIj4KKyAgICAKKyAgICA8YXR0cmlidXRlIG5hbWU9ImRlZmF1bHRIb3N0IgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249Ik5hbWUgb2YgdGhlIGRlZmF1bHQgSG9zdCBmb3IgdGhpcyBFbmdpbmUiCisgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgICAKKyAgICA8YXR0cmlidXRlICAgbmFtZT0ibWFuYWdlZFJlc291cmNlIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBtYW5hZ2VkIHJlc291cmNlIHRoaXMgTUJlYW4gaXMgYXNzb2NpYXRlZCB3aXRoIgorICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLk9iamVjdCIvPgorICAgICAgCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9Im5hbWUiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iVW5pcXVlIG5hbWUgb2YgdGhpcyBFbmdpbmUiCisgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgICAKKyAgICA8YXR0cmlidXRlICAgbmFtZT0iYmFzZURpciIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJCYXNlIGRpciBmb3IgdGhpcyBlbmdpbmUsIHR5cGljYWxseSBzYW1lIGFzIGNhdGFsaW5hLmJhc2Ugc3lzdGVtIHByb3BlcnR5IgorICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgICAgCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9Imp2bVJvdXRlIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlJvdXRlIHVzZWQgZm9yIGxvYWQgYmFsYW5jaW5nIgorICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgICAgCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJyZWFsbSIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJBc3NvY2lhdGVkIHJlYWxtLiIKKyAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuUmVhbG0iIC8+CisgICAgICAKKyAgICA8YXR0cmlidXRlIG5hbWU9InZhbHZlT2JqZWN0TmFtZXMiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iT2JqZWN0TmFtZXMgZm9yIHRoZSB2YWx2ZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29udGFpbmVyIgorICAgICAgICAgICAgICAgdHlwZT0iW0xqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7IgorICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorCisgICAgPG9wZXJhdGlvbiBuYW1lPSJhZGRDaGlsZCIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJBZGQgYSB2aXJ0dWFsIGhvc3QiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJjaGlsZCIKKyAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249Ikhvc3Qgb2JqZWN0IgorICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRhaW5lciIvPgorICAgIDwvb3BlcmF0aW9uPgorICAgIAorICAgIDxvcGVyYXRpb24gbmFtZT0ic3RhcnQiIGRlc2NyaXB0aW9uPSJTdGFydCIgaW1wYWN0PSJBQ1RJT04iIHJldHVyblR5cGU9InZvaWQiIC8+CisgICAgPG9wZXJhdGlvbiBuYW1lPSJzdG9wIiBkZXNjcmlwdGlvbj0iU3RvcCIgaW1wYWN0PSJBQ1RJT04iIHJldHVyblR5cGU9InZvaWQiIC8+CisgICAgICAKKyAgPC9tYmVhbj4KKworICAKKyAgPG1iZWFuIG5hbWU9IlN0YW5kYXJkRW5naW5lVmFsdmUiCisgICAgICAgICBkZXNjcmlwdGlvbj0iVmFsdmUgdGhhdCBpbXBsZW1lbnRzIHRoZSBkZWZhdWx0IGJhc2ljIGJlaGF2aW9yIGZvciB0aGUKKyAgICAgICAgIFN0YW5kYXJkRW5naW5lIGNvbnRhaW5lciBpbXBsZW1lbnRhdGlvbiIKKyAgICAgICAgIGRvbWFpbj0iQ2F0YWxpbmEiCisgICAgICAgICBncm91cD0iVmFsdmUiCisgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRFbmdpbmVWYWx2ZSI+CisgICAgCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImNsYXNzTmFtZSIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJGdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgbWFuYWdlZCBvYmplY3QiCisgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgICAgCisgIDwvbWJlYW4+CisgIAorICA8bWJlYW4gbmFtZT0iU3RhbmRhcmRIb3N0IgorICAgICAgICAgZGVzY3JpcHRpb249IlN0YW5kYXJkIEhvc3QgQ29tcG9uZW50IgorICAgICAgICAgZG9tYWluPSJDYXRhbGluYSIKKyAgICAgICAgIGdyb3VwPSJIb3N0IgorICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkSG9zdCI+CisgICAgCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJhcHBCYXNlIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBhcHBsaWNhdGlvbiByb290IGZvciB0aGlzIEhvc3QiCisgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgICAKKyAgICA8YXR0cmlidXRlIG5hbWU9ImF1dG9EZXBsb3kiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIGF1dG8gZGVwbG95IGZsYWcgZm9yIHRoaXMgSG9zdCIKKyAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iLz4KKyAgICAgICAgICAgICAgICAgCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXBsb3lPblN0YXJ0dXAiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIGRlcGxveSBvbiBzdGFydHVwIGZsYWcgZm9yIHRoaXMgSG9zdCIKKyAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iLz4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVwbG95WE1MIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249ImRlcGxveSBDb250ZXh0IFhNTCBjb25maWcgZmlsZXMgcHJvcGVydHkiCisgICAgICAgICAgICAgICBpcz0idHJ1ZSIKKyAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iLz4KKyAgICAgIAorICAgIDxhdHRyaWJ1dGUgbmFtZT0ibWFuYWdlZFJlc291cmNlIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBtYW5hZ2VkIHJlc291cmNlIHRoaXMgTUJlYW4gaXMgYXNzb2NpYXRlZCB3aXRoIgorICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLk9iamVjdCIvPgorICAgICAgCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlVuaXF1ZSBuYW1lIG9mIHRoaXMgSG9zdCIKKyAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICAgIAorICAgIDxhdHRyaWJ1dGUgbmFtZT0idW5wYWNrV0FScyIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJVbnBhY2sgV0FScyBwcm9wZXJ0eSIKKyAgICAgICAgICAgICAgIGlzPSJ0cnVlIgorICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIvPgorICAgICAgCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJ4bWxOYW1lc3BhY2VBd2FyZSIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJBdHRyaWJ1dGUgdmFsdWUgdXNlZCB0byB0dXJuIG9uL29mZiBYTUwgbmFtZXNwYWNlIGF3YXJlbmVzcyIKKyAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iLz4KKyAgICAgIAorICAgIDxhdHRyaWJ1dGUgbmFtZT0ieG1sVmFsaWRhdGlvbiIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJBdHRyaWJ1dGUgdmFsdWUgdXNlZCB0byB0dXJuIG9uL29mZiBYTUwgdmFsaWRhdGlvbiIKKyAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iLz4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2hpbGRyZW4iCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iT2JqZWN0IG5hbWVzIG9mIGFsbCBjaGlsZHJlbiIKKyAgICAgICAgICAgICAgIHR5cGU9IltMamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOyIvPgorICAgICAgCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJhbGlhc2VzIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249Ikhvc3QgYWxpYXNlcyIKKyAgICAgICAgICAgICAgIHR5cGU9IltMamF2YS5sYW5nLlN0cmluZzsiLz4KKyAgICAgIAorICAgIDxhdHRyaWJ1dGUgbmFtZT0icmVhbG0iCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iQXNzb2NpYXRlZCByZWFsbS4iCisgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLlJlYWxtIiAvPgorICAgICAgCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2YWx2ZU5hbWVzIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlJldHVybiB0aGUgTUJlYW4gTmFtZXMgb2YgdGhlIFZhbHZlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBIb3N0IgorICAgICAgICAgICAgICAgdHlwZT0iW0xqYXZhLmxhbmcuU3RyaW5nOyIvPgorICAgICAgCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2YWx2ZU9iamVjdE5hbWVzIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlJldHVybiB0aGUgTUJlYW4gT2JqZWN0TmFtZXMgb2YgdGhlIFZhbHZlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBIb3N0IgorICAgICAgICAgICAgICAgdHlwZT0iW0xqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7Ii8+CisgICAgICAKKyAgICA8b3BlcmF0aW9uIG5hbWU9ImFkZEFsaWFzIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IkFkZCBhbiBhbGlhcyBuYW1lIHRoYXQgc2hvdWxkIGJlIG1hcHBlZCB0byB0aGlzIEhvc3QiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJhbGlhcyIKKyAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBhbGlhcyB0byBiZSBhZGRlZCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgIDwvb3BlcmF0aW9uPgorICAgIAorICAgIDxvcGVyYXRpb24gbmFtZT0iZmluZEFsaWFzZXMiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iUmV0dXJuIHRoZSBzZXQgb2YgYWxpYXMgbmFtZXMgZm9yIHRoaXMgSG9zdCIKKyAgICAgICAgICAgICAgIGltcGFjdD0iSU5GTyIKKyAgICAgICAgICAgICAgIHJldHVyblR5cGU9IltMamF2YS5sYW5nLlN0cmluZzsiLz4KKworICAgIDxvcGVyYXRpb24gbmFtZT0iYWRkQ2hpbGQiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iQWRkIGEgY29udGV4dCIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIj4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iY2hpbGQiCisgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDb250ZXh0IHRvIGJlIGFkZGVkIgorICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRhaW5lciIvPgorICAgIDwvb3BlcmF0aW9uPgorICAgICAgCisgICAgPG9wZXJhdGlvbiAgIG5hbWU9InJlbW92ZUFsaWFzIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlJlbW92ZSB0aGUgc3BlY2lmaWVkIGFsaWFzIG5hbWUgZnJvbSB0aGUgYWxpYXNlcyBmb3IgdGhpcyAgSG9zdCIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICAgICAgcmV0dXJuVHlwZT0idm9pZCI+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9ImFsaWFzIgorICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iQWxpYXMgbmFtZSB0byBiZSByZW1vdmVkIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgPC9vcGVyYXRpb24+CisgICAgCisgICAgPG9wZXJhdGlvbiBuYW1lPSJzdGFydCIgZGVzY3JpcHRpb249IlN0YXJ0IiBpbXBhY3Q9IkFDVElPTiIgcmV0dXJuVHlwZT0idm9pZCIgLz4KKyAgICA8b3BlcmF0aW9uIG5hbWU9InN0b3AiIGRlc2NyaXB0aW9uPSJTdG9wIiBpbXBhY3Q9IkFDVElPTiIgcmV0dXJuVHlwZT0idm9pZCIgLz4KKyAgICA8b3BlcmF0aW9uIG5hbWU9ImluaXQiIGRlc2NyaXB0aW9uPSJJbml0IiBpbXBhY3Q9IkFDVElPTiIgcmV0dXJuVHlwZT0idm9pZCIgLz4KKyAgICA8b3BlcmF0aW9uIG5hbWU9ImRlc3Ryb3kiIGRlc2NyaXB0aW9uPSJEZXN0cm95IiBpbXBhY3Q9IkFDVElPTiIgcmV0dXJuVHlwZT0idm9pZCIgLz4KKyAgPC9tYmVhbj4KKyAgCisgIDxtYmVhbiBuYW1lPSJTdGFuZGFyZEhvc3RWYWx2ZSIKKyAgICAgICAgIGRlc2NyaXB0aW9uPSJWYWx2ZSB0aGF0IGltcGxlbWVudHMgdGhlIGRlZmF1bHQgYmFzaWMgYmVoYXZpb3IgZm9yIHRoZQorICAgICAgICAgU3RhbmRhcmRIb3N0IGNvbnRhaW5lciBpbXBsZW1lbnRhdGlvbiIKKyAgICAgICAgIGRvbWFpbj0iQ2F0YWxpbmEiCisgICAgICAgICBncm91cD0iVmFsdmUiCisgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRIb3N0VmFsdmUiPgorICAgIAorICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NOYW1lIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IkZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBtYW5hZ2VkIG9iamVjdCIKKyAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisKKyAgPC9tYmVhbj4KKworICA8bWJlYW4gbmFtZT0iU3RhbmRhcmRTZXJ2ZXIiCisgICAgICAgICBkZXNjcmlwdGlvbj0iU3RhbmRhcmQgU2VydmVyIENvbXBvbmVudCIKKyAgICAgICAgIGRvbWFpbj0iQ2F0YWxpbmEiCisgICAgICAgICBncm91cD0iU2VydmVyIgorICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkU2VydmVyIj4KKyAgICAKKyAgICA8YXR0cmlidXRlIG5hbWU9Im1hbmFnZWRSZXNvdXJjZSIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgbWFuYWdlZCByZXNvdXJjZSB0aGlzIE1CZWFuIGlzIGFzc29jaWF0ZWQgd2l0aCIKKyAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5PYmplY3QiLz4KKyAgICAgIAorICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9ydCIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJUQ1AgcG9ydCBmb3Igc2h1dGRvd24gbWVzc2FnZXMiCisgICAgICAgICAgICAgICB0eXBlPSJpbnQiLz4KKyAgICAgIAorICAgIDxhdHRyaWJ1dGUgbmFtZT0ic2h1dGRvd24iCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iU2h1dGRvd24gcGFzc3dvcmQiCisgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgICAKKyAgICA8YXR0cmlidXRlIG5hbWU9InNlcnZpY2VOYW1lcyIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJPYmplY3QgbmFtZXMgb2YgYWxsIHNlcnZpY2VzIHdlIGtub3cgYWJvdXQiCisgICAgICAgICAgICAgICB0eXBlPSJbTGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsiLz4KKyAgICAgIAorICAgIDxvcGVyYXRpb24gbmFtZT0iYXdhaXQiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iV2FpdCBmb3IgdGhlIHNodXRkb3duIG1lc3NhZ2UiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiIC8+CisKKyAgICA8b3BlcmF0aW9uIG5hbWU9InN0b3JlQ29uZmlnIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlNhdmUgY3VycmVudCBzdGF0ZSB0byBzZXJ2ZXIueG1sIGZpbGUiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiPgorCisgICAgPC9vcGVyYXRpb24+CisgICAgCisgIDwvbWJlYW4+CisKKyAgCisgIDxtYmVhbiBuYW1lPSJTdGFuZGFyZFNlcnZpY2UiCisgICAgICAgICBkZXNjcmlwdGlvbj0iU3RhbmRhcmQgU2VydmljZSBDb21wb25lbnQiCisgICAgICAgICBkb21haW49IkNhdGFsaW5hIgorICAgICAgICAgZ3JvdXA9IlNlcnZpY2UiCisgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRTZXJ2aWNlIj4KKyAgICAKKyAgICA8YXR0cmlidXRlIG5hbWU9Im1hbmFnZWRSZXNvdXJjZSIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgbWFuYWdlZCByZXNvdXJjZSB0aGlzIE1CZWFuIGlzIGFzc29jaWF0ZWQgd2l0aCIKKyAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5PYmplY3QiLz4KKyAgICAgIAorICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJVbmlxdWUgbmFtZSBvZiB0aGlzIFNlcnZpY2UiCisgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgICAKKyAgICA8YXR0cmlidXRlIG5hbWU9ImNvbm5lY3Rvck5hbWVzIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249Ik9iamVjdE5hbWVzIG9mIHRoZSBjb25uZWN0b3JzIgorICAgICAgICAgICAgICAgdHlwZT0iW0xqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7IgorICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIgLz4KKyAgICAgIAorICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29udGFpbmVyIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlNlcnZsZXQgZW5naW5lIHRoYXQgd2lsbCBwcm9jZXNzIHRoZSByZXF1ZXN0cyIKKyAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGFpbmVyIiAvPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb250YWluZXJOYW1lIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249Ik9iamVjdE5hbWVzIG9mIHRoZSBlbmdpbmUiCisgICAgICAgICAgICAgICB0eXBlPSJqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWUiCisgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIiAvPgorCisgICAgPG9wZXJhdGlvbiBuYW1lPSJhZGRDb25uZWN0b3IiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iQWRkIGEgbmV3IGNvbm5lY3RvciIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICAgICAgcmV0dXJuVHlwZT0idm9pZCI+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9ImNvbm5lY3RvciIKKyAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IkNvbm5lY3RvciBvYmplY3QiCisgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLkNvbm5lY3RvciIvPgorICAgIDwvb3BlcmF0aW9uPgorICAgIAorICAgIDxvcGVyYXRpb24gbmFtZT0ic3RhcnQiIGRlc2NyaXB0aW9uPSJTdGFydCIgaW1wYWN0PSJBQ1RJT04iIHJldHVyblR5cGU9InZvaWQiIC8+CisgICAgPG9wZXJhdGlvbiBuYW1lPSJzdG9wIiBkZXNjcmlwdGlvbj0iU3RvcCIgaW1wYWN0PSJBQ1RJT04iIHJldHVyblR5cGU9InZvaWQiIC8+CisgIDwvbWJlYW4+CisKKyAgPG1iZWFuIG5hbWU9IlN0YW5kYXJkV3JhcHBlciIKKyAgICAgICAgIGRlc2NyaXB0aW9uPSJXcmFwcGVyIHRoYXQgcmVwcmVzZW50cyBhbiBpbmRpdmlkdWFsIHNlcnZsZXQgZGVmaW5pdGlvbiIKKyAgICAgICAgIGRvbWFpbj0iQ2F0YWxpbmEiCisgICAgICAgICBncm91cD0iV3JhcHBlciIKKyAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZFdyYXBwZXIiPgorICAgICAgICAgICAgICAgCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJlbmdpbmVOYW1lIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IkZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBtYW5hZ2VkIG9iamVjdCIKKyAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgICAgICAgICAgICAKKyAgICA8YXR0cmlidXRlIG5hbWU9ImV2ZW50UHJvdmlkZXIiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iRXZlbnQgcHJvdmlkZXIgc3VwcG9ydCBmb3IgdGhpcyBtYW5hZ2VkIG9iamVjdCIKKyAgICAgICAgICAgICAgIGlzPSJ0cnVlIgorICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIvPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJvYmplY3ROYW1lIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249Ik5hbWUgb2YgdGhlIG9iamVjdCIKKyAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3RhdGVNYW5hZ2VhYmxlIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlN0YXRlIG1hbmFnZW1lbnQgc3VwcG9ydCBmb3IgdGhpcyBtYW5hZ2VkIG9iamVjdCIKKyAgICAgICAgICAgICAgIGlzPSJ0cnVlIgorICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIvPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJzdGF0aXN0aWNzUHJvdmlkZXIiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iUGVyZm9ybWFuY2Ugc3RhdGlzdGljcyBzdXBwb3J0IGZvciB0aGlzIG1hbmFnZWQgb2JqZWN0IgorICAgICAgICAgICAgICAgaXM9InRydWUiCisgICAgICAgICAgICAgICB0eXBlPSJib29sZWFuIi8+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9InByb2Nlc3NpbmdUaW1lIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IkN1bXVsYXRpdmUgcHJvY2Vzc2luZyB0aW1lIgorICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiIC8+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9Im1heFRpbWUiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iTWF4aW11bSBwcm9jZXNzaW5nIHRpbWUgb2YgYSByZXF1ZXN0IgorICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiIC8+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9Im1pblRpbWUiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iTWluaW11bSBwcm9jZXNzaW5nIHRpbWUgb2YgYSByZXF1ZXN0IgorICAgICAgICAgICAgICAgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiIC8+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9InJlcXVlc3RDb3VudCIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJOdW1iZXIgb2YgcmVxdWVzdHMgcHJvY2Vzc2VkIGJ5IHRoaXMgd3JhcHBlciIKKyAgICAgICAgICAgICAgIHR5cGU9ImludCIKKyAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiIC8+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9ImVycm9yQ291bnQiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iRXJyb3IgY291bnQiCisgICAgICAgICAgICAgICB0eXBlPSJpbnQiCisgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIiAvPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJsb2FkVGltZSIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJMb2FkIHRpbWUiCisgICAgICAgICAgICAgICB0eXBlPSJsb25nIgorICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIgLz4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NMb2FkVGltZSIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDbGFzcyBsb2FkaW5nIHRpbWUiCisgICAgICAgICAgICAgICB0eXBlPSJpbnQiCisgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIiAvPgorCisgICAgPG9wZXJhdGlvbiBuYW1lPSJmaW5kTWFwcGluZ3MiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iUmV0dXJuIHRoZSBtYXBwaW5ncyBhc3NvY2lhdGVkIHdpdGggdGhpcyB3cmFwcGVyIgorICAgICAgICAgICAgICAgaW1wYWN0PSJJTkZPIgorICAgICAgICAgICAgICAgcmV0dXJuVHlwZT0iW0xqYXZhLmxhbmcuU3RyaW5nOyI+CisgICAgPC9vcGVyYXRpb24+CisgICAgICAgICAgICAgICAKKyAgICA8b3BlcmF0aW9uIG5hbWU9ImZpbmRNYXBwaW5nT2JqZWN0IgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlJldHVybiBhbiBvYmplY3Qgd2hpY2ggbWF5IGJlIHV0aWxpemVkIGZvciBtYXBwaW5nIHRvIHRoaXMgY29tcG9uZW50IgorICAgICAgICAgICAgICAgaW1wYWN0PSJJTkZPIgorICAgICAgICAgICAgICAgcmV0dXJuVHlwZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5XcmFwcGVyIj4KKyAgICA8L29wZXJhdGlvbj4KKyAgICAKKyAgPC9tYmVhbj4KKyAgCisgIDxtYmVhbiBuYW1lPSJTdGFuZGFyZFdyYXBwZXJWYWx2ZSIKKyAgICAgICAgIGRlc2NyaXB0aW9uPSJWYWx2ZSB0aGF0IGltcGxlbWVudHMgdGhlIGRlZmF1bHQgYmFzaWMgYmVoYXZpb3IgZm9yIHRoZQorICAgICAgICAgU3RhbmRhcmRXcmFwcGVyIGNvbnRhaW5lciBpbXBsZW1lbnRhdGlvbiIKKyAgICAgICAgIGRvbWFpbj0iQ2F0YWxpbmEiCisgICAgICAgICBncm91cD0iVmFsdmUiCisgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRXcmFwcGVyVmFsdmUiPgorICAgICAgICAgCisgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NOYW1lIgorICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJGdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgbWFuYWdlZCBvYmplY3QiCisgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+ICAKKyAgICAgICAgICAgICAgICAgICAgCisgIDwvbWJlYW4+CisKKzwvbWJlYW5zLWRlc2NyaXB0b3JzPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2RlcGxveS9BcHBsaWNhdGlvblBhcmFtZXRlci5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2RlcGxveS9BcHBsaWNhdGlvblBhcmFtZXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5OGMzMDIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvZGVwbG95L0FwcGxpY2F0aW9uUGFyYW1ldGVyLmphdmEKQEAgLTAsMCArMSwxMjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95OworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CisKKworLyoqCisgKiBSZXByZXNlbnRhdGlvbiBvZiBhIGNvbnRleHQgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyIHRoYXQgaXMgY29uZmlndXJlZAorICogaW4gdGhlIHNlcnZlciBjb25maWd1cmF0aW9uIGZpbGUsIHJhdGhlciB0aGFuIHRoZSBhcHBsaWNhdGlvbiBkZXBsb3ltZW50CisgKiBkZXNjcmlwdG9yLiAgVGhpcyBpcyBjb252ZW5pZW50IGZvciBlc3RhYmxpc2hpbmcgZGVmYXVsdCB2YWx1ZXMgKHdoaWNoCisgKiBtYXkgYmUgY29uZmlndXJlZCB0byBhbGxvdyBhcHBsaWNhdGlvbiBvdmVycmlkZXMgb3Igbm90KSB3aXRob3V0IGhhdmluZworICogdG8gbW9kaWZ5IHRoZSBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IgaXRzZWxmLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgQXBwbGljYXRpb25QYXJhbWV0ZXIgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoaXMgZW52aXJvbm1lbnQgZW50cnkuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb24gPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLmRlc2NyaXB0aW9uKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKKyAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2YgdGhpcyBhcHBsaWNhdGlvbiBwYXJhbWV0ZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZSA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5uYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBEb2VzIHRoaXMgYXBwbGljYXRpb24gcGFyYW1ldGVyIGFsbG93IG92ZXJyaWRlcyBieSB0aGUgYXBwbGljYXRpb24KKyAgICAgKiBkZXBsb3ltZW50IGRlc2NyaXB0b3I/CisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIG92ZXJyaWRlID0gdHJ1ZTsKKworICAgIHB1YmxpYyBib29sZWFuIGdldE92ZXJyaWRlKCkgeworICAgICAgICByZXR1cm4gKHRoaXMub3ZlcnJpZGUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE92ZXJyaWRlKGJvb2xlYW4gb3ZlcnJpZGUpIHsKKyAgICAgICAgdGhpcy5vdmVycmlkZSA9IG92ZXJyaWRlOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIHZhbHVlIG9mIHRoaXMgYXBwbGljYXRpb24gcGFyYW1ldGVyLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHZhbHVlID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisgICAgICAgIHJldHVybiAodGhpcy52YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiQXBwbGljYXRpb25QYXJhbWV0ZXJbIik7CisgICAgICAgIHNiLmFwcGVuZCgibmFtZT0iKTsKKyAgICAgICAgc2IuYXBwZW5kKG5hbWUpOworICAgICAgICBpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIsIGRlc2NyaXB0aW9uPSIpOworICAgICAgICAgICAgc2IuYXBwZW5kKGRlc2NyaXB0aW9uKTsKKyAgICAgICAgfQorICAgICAgICBzYi5hcHBlbmQoIiwgdmFsdWU9Iik7CisgICAgICAgIHNiLmFwcGVuZCh2YWx1ZSk7CisgICAgICAgIHNiLmFwcGVuZCgiLCBvdmVycmlkZT0iKTsKKyAgICAgICAgc2IuYXBwZW5kKG92ZXJyaWRlKTsKKyAgICAgICAgc2IuYXBwZW5kKCJdIik7CisgICAgICAgIHJldHVybiAoc2IudG9TdHJpbmcoKSk7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2RlcGxveS9Db250ZXh0RWpiLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvZGVwbG95L0NvbnRleHRFamIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWU2NmVmCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2RlcGxveS9Db250ZXh0RWpiLmphdmEKQEAgLTAsMCArMSwxMTggQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95OworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CisKKworLyoqCisgKiBSZXByZXNlbnRhdGlvbiBvZiBhbiBFSkIgcmVzb3VyY2UgcmVmZXJlbmNlIGZvciBhIHdlYiBhcHBsaWNhdGlvbiwgYXMKKyAqIHJlcHJlc2VudGVkIGluIGEgPGNvZGU+Jmx0O2VqYi1yZWYmZ3Q7PC9jb2RlPiBlbGVtZW50IGluIHRoZQorICogZGVwbG95bWVudCBkZXNjcmlwdG9yLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQGF1dGhvciBQZXRlciBSb3NzYmFjaCAocGVyb0BhcGFjaGUub3JnKQorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgQ29udGV4dEVqYiBleHRlbmRzIFJlc291cmNlQmFzZSBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKworICAgIC8qKgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBFSkIgaG9tZSBpbXBsZW1lbnRhdGlvbiBjbGFzcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBob21lID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SG9tZSgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLmhvbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEhvbWUoU3RyaW5nIGhvbWUpIHsKKyAgICAgICAgdGhpcy5ob21lID0gaG9tZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSBsaW5rIHRvIGEgSjJFRSBFSkIgZGVmaW5pdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBsaW5rID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGluaygpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLmxpbmspOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldExpbmsoU3RyaW5nIGxpbmspIHsKKyAgICAgICAgdGhpcy5saW5rID0gbGluazsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgRUpCIHJlbW90ZSBpbXBsZW1lbnRhdGlvbiBjbGFzcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyByZW1vdGUgPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXRSZW1vdGUoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5yZW1vdGUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFJlbW90ZShTdHJpbmcgcmVtb3RlKSB7CisgICAgICAgIHRoaXMucmVtb3RlID0gcmVtb3RlOworICAgIH0KKworICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCJDb250ZXh0RWpiWyIpOworICAgICAgICBzYi5hcHBlbmQoIm5hbWU9Iik7CisgICAgICAgIHNiLmFwcGVuZChnZXROYW1lKCkpOworICAgICAgICBpZiAoZ2V0RGVzY3JpcHRpb24oKSAhPSBudWxsKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiwgZGVzY3JpcHRpb249Iik7CisgICAgICAgICAgICBzYi5hcHBlbmQoZ2V0RGVzY3JpcHRpb24oKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGdldFR5cGUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiwgdHlwZT0iKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChnZXRUeXBlKCkpOworICAgICAgICB9CisgICAgICAgIGlmIChob21lICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiLCBob21lPSIpOworICAgICAgICAgICAgc2IuYXBwZW5kKGhvbWUpOworICAgICAgICB9CisgICAgICAgIGlmIChyZW1vdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIsIHJlbW90ZT0iKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChyZW1vdGUpOworICAgICAgICB9CisgICAgICAgIGlmIChsaW5rICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiLCBsaW5rPSIpOworICAgICAgICAgICAgc2IuYXBwZW5kKGxpbmspOworICAgICAgICB9CisgICAgICAgIHNiLmFwcGVuZCgiXSIpOworICAgICAgICByZXR1cm4gKHNiLnRvU3RyaW5nKCkpOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9kZXBsb3kvQ29udGV4dEVudmlyb25tZW50LmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvZGVwbG95L0NvbnRleHRFbnZpcm9ubWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkYWI4ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvZGVwbG95L0NvbnRleHRFbnZpcm9ubWVudC5qYXZhCkBAIC0wLDAgKzEsMTU1IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveTsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworCisKKy8qKgorICogUmVwcmVzZW50YXRpb24gb2YgYW4gYXBwbGljYXRpb24gZW52aXJvbm1lbnQgZW50cnksIGFzIHJlcHJlc2VudGVkIGluCisgKiBhbiA8Y29kZT4mbHQ7ZW52LWVudHJ5Jmd0OzwvY29kZT4gZWxlbWVudCBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgQ29udGV4dEVudmlyb25tZW50IGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGlzIGVudmlyb25tZW50IGVudHJ5LgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisgICAgICAgIHJldHVybiAodGhpcy5kZXNjcmlwdGlvbik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7CisgICAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSBuYW1lIG9mIHRoaXMgZW52aXJvbm1lbnQgZW50cnkuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZSA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5uYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBEb2VzIHRoaXMgZW52aXJvbm1lbnQgZW50cnkgYWxsb3cgb3ZlcnJpZGVzIGJ5IHRoZSBhcHBsaWNhdGlvbgorICAgICAqIGRlcGxveW1lbnQgZGVzY3JpcHRvcj8KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gb3ZlcnJpZGUgPSB0cnVlOworCisgICAgcHVibGljIGJvb2xlYW4gZ2V0T3ZlcnJpZGUoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5vdmVycmlkZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0T3ZlcnJpZGUoYm9vbGVhbiBvdmVycmlkZSkgeworICAgICAgICB0aGlzLm92ZXJyaWRlID0gb3ZlcnJpZGU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBvZiB0aGlzIGVudmlyb25tZW50IGVudHJ5LgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHR5cGUgPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gKHRoaXMudHlwZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSkgeworICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIHZhbHVlIG9mIHRoaXMgZW52aXJvbm1lbnQgZW50cnkuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWUgPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLnZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCJDb250ZXh0RW52aXJvbm1lbnRbIik7CisgICAgICAgIHNiLmFwcGVuZCgibmFtZT0iKTsKKyAgICAgICAgc2IuYXBwZW5kKG5hbWUpOworICAgICAgICBpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIsIGRlc2NyaXB0aW9uPSIpOworICAgICAgICAgICAgc2IuYXBwZW5kKGRlc2NyaXB0aW9uKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodHlwZSAhPSBudWxsKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiwgdHlwZT0iKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCh0eXBlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIsIHZhbHVlPSIpOworICAgICAgICAgICAgc2IuYXBwZW5kKHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBzYi5hcHBlbmQoIiwgb3ZlcnJpZGU9Iik7CisgICAgICAgIHNiLmFwcGVuZChvdmVycmlkZSk7CisgICAgICAgIHNiLmFwcGVuZCgiXSIpOworICAgICAgICByZXR1cm4gKHNiLnRvU3RyaW5nKCkpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQYWNrYWdlIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogVGhlIE5hbWluZ1Jlc291cmNlcyB3aXRoIHdoaWNoIHdlIGFyZSBhc3NvY2lhdGVkIChpZiBhbnkpLgorICAgICAqLworICAgIHByb3RlY3RlZCBOYW1pbmdSZXNvdXJjZXMgcmVzb3VyY2VzID0gbnVsbDsKKworICAgIHB1YmxpYyBOYW1pbmdSZXNvdXJjZXMgZ2V0TmFtaW5nUmVzb3VyY2VzKCkgeworICAgICAgICByZXR1cm4gKHRoaXMucmVzb3VyY2VzKTsKKyAgICB9CisKKyAgICB2b2lkIHNldE5hbWluZ1Jlc291cmNlcyhOYW1pbmdSZXNvdXJjZXMgcmVzb3VyY2VzKSB7CisgICAgICAgIHRoaXMucmVzb3VyY2VzID0gcmVzb3VyY2VzOworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvZGVwbG95L0NvbnRleHRMb2NhbEVqYi5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2RlcGxveS9Db250ZXh0TG9jYWxFamIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjAzNDA1Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2RlcGxveS9Db250ZXh0TG9jYWxFamIuamF2YQpAQCAtMCwwICsxLDExNSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3k7CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKKworCisvKioKKyAqIFJlcHJlc2VudGF0aW9uIG9mIGEgbG9jYWwgRUpCIHJlc291cmNlIHJlZmVyZW5jZSBmb3IgYSB3ZWIgYXBwbGljYXRpb24sIGFzCisgKiByZXByZXNlbnRlZCBpbiBhIDxjb2RlPiZsdDtlamItbG9jYWwtcmVmJmd0OzwvY29kZT4gZWxlbWVudCBpbiB0aGUKKyAqIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEBhdXRob3IgUGV0ZXIgUm9zc2JhY2ggKHBlcm9AYXBhY2hlLm9yZykKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIENvbnRleHRMb2NhbEVqYiBleHRlbmRzIFJlc291cmNlQmFzZSBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2YgdGhlIEVKQiBob21lIGltcGxlbWVudGF0aW9uIGNsYXNzLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGhvbWUgPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXRIb21lKCkgeworICAgICAgICByZXR1cm4gKHRoaXMuaG9tZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SG9tZShTdHJpbmcgaG9tZSkgeworICAgICAgICB0aGlzLmhvbWUgPSBob21lOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIGxpbmsgdG8gYSBKMkVFIEVKQiBkZWZpbml0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGxpbmsgPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXRMaW5rKCkgeworICAgICAgICByZXR1cm4gKHRoaXMubGluayk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TGluayhTdHJpbmcgbGluaykgeworICAgICAgICB0aGlzLmxpbmsgPSBsaW5rOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2YgdGhlIEVKQiBsb2NhbCBpbXBsZW1lbnRhdGlvbiBjbGFzcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBsb2NhbCA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldExvY2FsKCkgeworICAgICAgICByZXR1cm4gKHRoaXMubG9jYWwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldExvY2FsKFN0cmluZyBsb2NhbCkgeworICAgICAgICB0aGlzLmxvY2FsID0gbG9jYWw7CisgICAgfQorCisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIkNvbnRleHRMb2NhbEVqYlsiKTsKKyAgICAgICAgc2IuYXBwZW5kKCJuYW1lPSIpOworICAgICAgICBzYi5hcHBlbmQoZ2V0TmFtZSgpKTsKKyAgICAgICAgaWYgKGdldERlc2NyaXB0aW9uKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIsIGRlc2NyaXB0aW9uPSIpOworICAgICAgICAgICAgc2IuYXBwZW5kKGdldERlc2NyaXB0aW9uKCkpOworICAgICAgICB9CisgICAgICAgIGlmIChnZXRUeXBlKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIsIHR5cGU9Iik7CisgICAgICAgICAgICBzYi5hcHBlbmQoZ2V0VHlwZSgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaG9tZSAhPSBudWxsKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiwgaG9tZT0iKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChob21lKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobGluayAhPSBudWxsKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiwgbGluaz0iKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChsaW5rKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobG9jYWwgIT0gbnVsbCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIsIGxvY2FsPSIpOworICAgICAgICAgICAgc2IuYXBwZW5kKGxvY2FsKTsKKyAgICAgICAgfQorICAgICAgICBzYi5hcHBlbmQoIl0iKTsKKyAgICAgICAgcmV0dXJuIChzYi50b1N0cmluZygpKTsKKworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9kZXBsb3kvQ29udGV4dFJlc291cmNlLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvZGVwbG95L0NvbnRleHRSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2ZGU1ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvZGVwbG95L0NvbnRleHRSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95OworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CisKKy8qKgorICogUmVwcmVzZW50YXRpb24gb2YgYSByZXNvdXJjZSByZWZlcmVuY2UgZm9yIGEgd2ViIGFwcGxpY2F0aW9uLCBhcworICogcmVwcmVzZW50ZWQgaW4gYSA8Y29kZT4mbHQ7cmVzb3VyY2UtcmVmJmd0OzwvY29kZT4gZWxlbWVudCBpbiB0aGUKKyAqIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEBhdXRob3IgUGV0ZXIgUm9zc2JhY2ggKHBlcm9AYXBhY2hlLm9yZykKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIENvbnRleHRSZXNvdXJjZSBleHRlbmRzIFJlc291cmNlQmFzZSBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgYXV0aG9yaXphdGlvbiByZXF1aXJlbWVudCBmb3IgdGhpcyByZXNvdXJjZQorICAgICAqICg8Y29kZT5BcHBsaWNhdGlvbjwvY29kZT4gb3IgPGNvZGU+Q29udGFpbmVyPC9jb2RlPikuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgYXV0aCA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEF1dGgoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5hdXRoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBdXRoKFN0cmluZyBhdXRoKSB7CisgICAgICAgIHRoaXMuYXV0aCA9IGF1dGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHNoYXJpbmcgc2NvcGUgb2YgdGhpcyByZXNvdXJjZSBmYWN0b3J5ICg8Y29kZT5TaGFyZWFibGU8L2NvZGU+CisgICAgICogb3IgPGNvZGU+VW5zaGFyZWFibGU8L2NvZGU+KS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBzY29wZSA9ICJTaGFyZWFibGUiOworCisgICAgcHVibGljIFN0cmluZyBnZXRTY29wZSgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLnNjb3BlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTY29wZShTdHJpbmcgc2NvcGUpIHsKKyAgICAgICAgdGhpcy5zY29wZSA9IHNjb3BlOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIkNvbnRleHRSZXNvdXJjZVsiKTsKKyAgICAgICAgc2IuYXBwZW5kKCJuYW1lPSIpOworICAgICAgICBzYi5hcHBlbmQoZ2V0TmFtZSgpKTsKKyAgICAgICAgaWYgKGdldERlc2NyaXB0aW9uKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIsIGRlc2NyaXB0aW9uPSIpOworICAgICAgICAgICAgc2IuYXBwZW5kKGdldERlc2NyaXB0aW9uKCkpOworICAgICAgICB9CisgICAgICAgIGlmIChnZXRUeXBlKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIsIHR5cGU9Iik7CisgICAgICAgICAgICBzYi5hcHBlbmQoZ2V0VHlwZSgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYXV0aCAhPSBudWxsKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiwgYXV0aD0iKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChhdXRoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2NvcGUgIT0gbnVsbCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIsIHNjb3BlPSIpOworICAgICAgICAgICAgc2IuYXBwZW5kKHNjb3BlKTsKKyAgICAgICAgfQorICAgICAgICBzYi5hcHBlbmQoIl0iKTsKKyAgICAgICAgcmV0dXJuIChzYi50b1N0cmluZygpKTsKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2RlcGxveS9Db250ZXh0UmVzb3VyY2VFbnZSZWYuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9kZXBsb3kvQ29udGV4dFJlc291cmNlRW52UmVmLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGYxMTFmMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9kZXBsb3kvQ29udGV4dFJlc291cmNlRW52UmVmLmphdmEKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3k7CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKKworCisvKioKKyAqIFJlcHJlc2VudGF0aW9uIG9mIGFuIGFwcGxpY2F0aW9uIHJlc291cmNlIHJlZmVyZW5jZSwgYXMgcmVwcmVzZW50ZWQgaW4KKyAqIGFuIDxjb2RlPiZsdDtyZXMtZW52LXJlZnkmZ3Q7PC9jb2RlPiBlbGVtZW50IGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAYXV0aG9yIFBldGVyIFJvc3NiYWNoIChwZXJvQGFwYWNoZS5vcmcpCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBDb250ZXh0UmVzb3VyY2VFbnZSZWYgZXh0ZW5kcyBSZXNvdXJjZUJhc2UgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworICAgIC8qKgorICAgICAqIERvZXMgdGhpcyBlbnZpcm9ubWVudCBlbnRyeSBhbGxvdyBvdmVycmlkZXMgYnkgdGhlIGFwcGxpY2F0aW9uCisgICAgICogZGVwbG95bWVudCBkZXNjcmlwdG9yPworICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBvdmVycmlkZSA9IHRydWU7CisKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRPdmVycmlkZSgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLm92ZXJyaWRlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRPdmVycmlkZShib29sZWFuIG92ZXJyaWRlKSB7CisgICAgICAgIHRoaXMub3ZlcnJpZGUgPSBvdmVycmlkZTsKKyAgICB9CisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIkNvbnRleHRSZXNvdXJjZUVudlJlZlsiKTsKKyAgICAgICAgc2IuYXBwZW5kKCJuYW1lPSIpOworICAgICAgICBzYi5hcHBlbmQoZ2V0TmFtZSgpKTsKKyAgICAgICAgaWYgKGdldFR5cGUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiwgdHlwZT0iKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChnZXRUeXBlKCkpOworICAgICAgICB9CisgICAgICAgIHNiLmFwcGVuZCgiLCBvdmVycmlkZT0iKTsKKyAgICAgICAgc2IuYXBwZW5kKG92ZXJyaWRlKTsKKyAgICAgICAgc2IuYXBwZW5kKCJdIik7CisgICAgICAgIHJldHVybiAoc2IudG9TdHJpbmcoKSk7CisKKyAgICB9CisKKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvZGVwbG95L0NvbnRleHRSZXNvdXJjZUxpbmsuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9kZXBsb3kvQ29udGV4dFJlc291cmNlTGluay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlNTk2NWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvZGVwbG95L0NvbnRleHRSZXNvdXJjZUxpbmsuamF2YQpAQCAtMCwwICsxLDc2IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveTsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworCisKKy8qKgorICogUmVwcmVzZW50YXRpb24gb2YgYSByZXNvdXJjZSBsaW5rIGZvciBhIHdlYiBhcHBsaWNhdGlvbiwgYXMKKyAqIHJlcHJlc2VudGVkIGluIGEgPGNvZGU+Jmx0O1Jlc291cmNlTGluayZndDs8L2NvZGU+IGVsZW1lbnQgaW4gdGhlCisgKiBzZXJ2ZXIgY29uZmlndXJhdGlvbiBmaWxlLgorICoKKyAqIEBhdXRob3IgUmVteSBNYXVjaGVyYXQKKyAqIEBhdXRob3IgUGV0ZXIgUm9zc2JhY2ggKFBldGVyIFJvc3NiYWNoIChwZXJvQGFwYWNoZS5vcmcpKQorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgQ29udGV4dFJlc291cmNlTGluayBleHRlbmRzIFJlc291cmNlQmFzZSBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisgICAvKioKKyAgICAgKiBUaGUgZ2xvYmFsIG5hbWUgb2YgdGhpcyByZXNvdXJjZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBnbG9iYWwgPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXRHbG9iYWwoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5nbG9iYWwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEdsb2JhbChTdHJpbmcgZ2xvYmFsKSB7CisgICAgICAgIHRoaXMuZ2xvYmFsID0gZ2xvYmFsOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIkNvbnRleHRSZXNvdXJjZUxpbmtbIik7CisgICAgICAgIHNiLmFwcGVuZCgibmFtZT0iKTsKKyAgICAgICAgc2IuYXBwZW5kKGdldE5hbWUoKSk7CisgICAgICAgIGlmIChnZXRUeXBlKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIsIHR5cGU9Iik7CisgICAgICAgICAgICBzYi5hcHBlbmQoZ2V0VHlwZSgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ2V0R2xvYmFsKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIsIGdsb2JhbD0iKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChnZXRHbG9iYWwoKSk7CisgICAgICAgIH0KKyAgICAgICAgc2IuYXBwZW5kKCJdIik7CisgICAgICAgIHJldHVybiAoc2IudG9TdHJpbmcoKSk7CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9kZXBsb3kvQ29udGV4dFRyYW5zYWN0aW9uLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvZGVwbG95L0NvbnRleHRUcmFuc2FjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxNDNhNzMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvZGVwbG95L0NvbnRleHRUcmFuc2FjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTA1IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveTsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworCisvKioKKyAqIFJlcHJlc2VudGF0aW9uIG9mIGFuIGFwcGxpY2F0aW9uIHJlc291cmNlIHJlZmVyZW5jZSwgYXMgcmVwcmVzZW50ZWQgaW4KKyAqIGFuIDxjb2RlPiZsdDtyZXMtZW52LXJlZnkmZ3Q7PC9jb2RlPiBlbGVtZW50IGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBDb250ZXh0VHJhbnNhY3Rpb24gaW1wbGVtZW50cyBTZXJpYWxpemFibGUgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogSG9sZGVyIGZvciBvdXIgY29uZmlndXJlZCBwcm9wZXJ0aWVzLgorICAgICAqLworICAgIHByaXZhdGUgSGFzaE1hcCBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXAoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIGNvbmZpZ3VyZWQgcHJvcGVydHkuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gcHJvcGVydGllcy5nZXQobmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IGEgY29uZmlndXJlZCBwcm9wZXJ0eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIHByb3BlcnRpZXMucHV0KG5hbWUsIHZhbHVlKTsKKyAgICB9CisKKyAgICAvKiogCisgICAgICogcmVtb3ZlIGEgY29uZmlndXJlZCBwcm9wZXJ0eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVQcm9wZXJ0eShTdHJpbmcgbmFtZSkgeworICAgICAgICBwcm9wZXJ0aWVzLnJlbW92ZShuYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMaXN0IHByb3BlcnRpZXMuCisgICAgICovCisgICAgcHVibGljIEl0ZXJhdG9yIGxpc3RQcm9wZXJ0aWVzKCkgeworICAgICAgICByZXR1cm4gcHJvcGVydGllcy5rZXlTZXQoKS5pdGVyYXRvcigpOworICAgIH0KKyAgICAKKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiVHJhbnNhY3Rpb25bIik7CisgICAgICAgIHNiLmFwcGVuZCgiXSIpOworICAgICAgICByZXR1cm4gKHNiLnRvU3RyaW5nKCkpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQYWNrYWdlIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogVGhlIE5hbWluZ1Jlc291cmNlcyB3aXRoIHdoaWNoIHdlIGFyZSBhc3NvY2lhdGVkIChpZiBhbnkpLgorICAgICAqLworICAgIHByb3RlY3RlZCBOYW1pbmdSZXNvdXJjZXMgcmVzb3VyY2VzID0gbnVsbDsKKworICAgIHB1YmxpYyBOYW1pbmdSZXNvdXJjZXMgZ2V0TmFtaW5nUmVzb3VyY2VzKCkgeworICAgICAgICByZXR1cm4gKHRoaXMucmVzb3VyY2VzKTsKKyAgICB9CisKKyAgICB2b2lkIHNldE5hbWluZ1Jlc291cmNlcyhOYW1pbmdSZXNvdXJjZXMgcmVzb3VyY2VzKSB7CisgICAgICAgIHRoaXMucmVzb3VyY2VzID0gcmVzb3VyY2VzOworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvZGVwbG95L0Vycm9yUGFnZS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2RlcGxveS9FcnJvclBhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmE1Nzk0Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2RlcGxveS9FcnJvclBhZ2UuamF2YQpAQCAtMCwwICsxLDE3MCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3k7CisKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5SZXF1ZXN0VXRpbDsKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKKworCisvKioKKyAqIFJlcHJlc2VudGF0aW9uIG9mIGFuIGVycm9yIHBhZ2UgZWxlbWVudCBmb3IgYSB3ZWIgYXBwbGljYXRpb24sCisgKiBhcyByZXByZXNlbnRlZCBpbiBhIDxjb2RlPiZsdDtlcnJvci1wYWdlJmd0OzwvY29kZT4gZWxlbWVudCBpbiB0aGUKKyAqIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEVycm9yUGFnZSBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZXJyb3IgKHN0YXR1cykgY29kZSBmb3Igd2hpY2ggdGhpcyBlcnJvciBwYWdlIGlzIGFjdGl2ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBlcnJvckNvZGUgPSAwOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZXhjZXB0aW9uIHR5cGUgZm9yIHdoaWNoIHRoaXMgZXJyb3IgcGFnZSBpcyBhY3RpdmUuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZXhjZXB0aW9uVHlwZSA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBjb250ZXh0LXJlbGF0aXZlIGxvY2F0aW9uIHRvIGhhbmRsZSB0aGlzIGVycm9yIG9yIGV4Y2VwdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBsb2NhdGlvbiA9IG51bGw7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGVycm9yIGNvZGUuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRFcnJvckNvZGUoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLmVycm9yQ29kZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZXJyb3IgY29kZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlcnJvckNvZGUgVGhlIG5ldyBlcnJvciBjb2RlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RXJyb3JDb2RlKGludCBlcnJvckNvZGUpIHsKKworICAgICAgICB0aGlzLmVycm9yQ29kZSA9IGVycm9yQ29kZTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBlcnJvciBjb2RlIChoYWNrIGZvciBkZWZhdWx0IFhtbE1hcHBlciBkYXRhIHR5cGUpLgorICAgICAqCisgICAgICogQHBhcmFtIGVycm9yQ29kZSBUaGUgbmV3IGVycm9yIGNvZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFcnJvckNvZGUoU3RyaW5nIGVycm9yQ29kZSkgeworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0aGlzLmVycm9yQ29kZSA9IEludGVnZXIucGFyc2VJbnQoZXJyb3JDb2RlKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIHRoaXMuZXJyb3JDb2RlID0gMDsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGV4Y2VwdGlvbiB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXhjZXB0aW9uVHlwZSgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMuZXhjZXB0aW9uVHlwZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZXhjZXB0aW9uIHR5cGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXhjZXB0aW9uVHlwZSBUaGUgbmV3IGV4Y2VwdGlvbiB0eXBlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RXhjZXB0aW9uVHlwZShTdHJpbmcgZXhjZXB0aW9uVHlwZSkgeworCisgICAgICAgIHRoaXMuZXhjZXB0aW9uVHlwZSA9IGV4Y2VwdGlvblR5cGU7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbG9jYXRpb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbigpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMubG9jYXRpb24pOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGxvY2F0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGxvY2F0aW9uIFRoZSBuZXcgbG9jYXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMb2NhdGlvbihTdHJpbmcgbG9jYXRpb24pIHsKKworICAgICAgICAvLyAgICAgICAgaWYgKChsb2NhdGlvbiA9PSBudWxsKSB8fCAhbG9jYXRpb24uc3RhcnRzV2l0aCgiLyIpKQorICAgICAgICAvLyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgLy8gICAgICAgICAgICAgICAgKCJFcnJvciBQYWdlIExvY2F0aW9uIG11c3Qgc3RhcnQgd2l0aCBhICcvJyIpOworICAgICAgICB0aGlzLmxvY2F0aW9uID0gUmVxdWVzdFV0aWwuVVJMRGVjb2RlKGxvY2F0aW9uKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJlbmRlciBhIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIkVycm9yUGFnZVsiKTsKKyAgICAgICAgaWYgKGV4Y2VwdGlvblR5cGUgPT0gbnVsbCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCJlcnJvckNvZGU9Iik7CisgICAgICAgICAgICBzYi5hcHBlbmQoZXJyb3JDb2RlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiZXhjZXB0aW9uVHlwZT0iKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChleGNlcHRpb25UeXBlKTsKKyAgICAgICAgfQorICAgICAgICBzYi5hcHBlbmQoIiwgbG9jYXRpb249Iik7CisgICAgICAgIHNiLmFwcGVuZChsb2NhdGlvbik7CisgICAgICAgIHNiLmFwcGVuZCgiXSIpOworICAgICAgICByZXR1cm4gKHNiLnRvU3RyaW5nKCkpOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9kZXBsb3kvRmlsdGVyRGVmLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvZGVwbG95L0ZpbHRlckRlZi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzZDAwMzMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvZGVwbG95L0ZpbHRlckRlZi5qYXZhCkBAIC0wLDAgKzEsMTcxIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveTsKKworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKKworCisvKioKKyAqIFJlcHJlc2VudGF0aW9uIG9mIGEgZmlsdGVyIGRlZmluaXRpb24gZm9yIGEgd2ViIGFwcGxpY2F0aW9uLCBhcyByZXByZXNlbnRlZAorICogaW4gYSA8Y29kZT4mbHQ7ZmlsdGVyJmd0OzwvY29kZT4gZWxlbWVudCBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgRmlsdGVyRGVmIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGlzIGZpbHRlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbiA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworICAgICAgICByZXR1cm4gKHRoaXMuZGVzY3JpcHRpb24pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgeworICAgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgZGlzcGxheSBuYW1lIG9mIHRoaXMgZmlsdGVyLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGRpc3BsYXlOYW1lID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5kaXNwbGF5TmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RGlzcGxheU5hbWUoU3RyaW5nIGRpc3BsYXlOYW1lKSB7CisgICAgICAgIHRoaXMuZGlzcGxheU5hbWUgPSBkaXNwbGF5TmFtZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgSmF2YSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhpcyBmaWx0ZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZmlsdGVyQ2xhc3MgPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXRGaWx0ZXJDbGFzcygpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLmZpbHRlckNsYXNzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRGaWx0ZXJDbGFzcyhTdHJpbmcgZmlsdGVyQ2xhc3MpIHsKKyAgICAgICAgdGhpcy5maWx0ZXJDbGFzcyA9IGZpbHRlckNsYXNzOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2YgdGhpcyBmaWx0ZXIsIHdoaWNoIG11c3QgYmUgdW5pcXVlIGFtb25nIHRoZSBmaWx0ZXJzCisgICAgICogZGVmaW5lZCBmb3IgYSBwYXJ0aWN1bGFyIHdlYiBhcHBsaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBmaWx0ZXJOYW1lID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmlsdGVyTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLmZpbHRlck5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEZpbHRlck5hbWUoU3RyaW5nIGZpbHRlck5hbWUpIHsKKyAgICAgICAgdGhpcy5maWx0ZXJOYW1lID0gZmlsdGVyTmFtZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSBsYXJnZSBpY29uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGZpbHRlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBsYXJnZUljb24gPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXRMYXJnZUljb24oKSB7CisgICAgICAgIHJldHVybiAodGhpcy5sYXJnZUljb24pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldExhcmdlSWNvbihTdHJpbmcgbGFyZ2VJY29uKSB7CisgICAgICAgIHRoaXMubGFyZ2VJY29uID0gbGFyZ2VJY29uOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIHNldCBvZiBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzIGZvciB0aGlzIGZpbHRlciwga2V5ZWQgYnkKKyAgICAgKiBwYXJhbWV0ZXIgbmFtZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1hcCBwYXJhbWV0ZXJzID0gbmV3IEhhc2hNYXAoKTsKKworICAgIHB1YmxpYyBNYXAgZ2V0UGFyYW1ldGVyTWFwKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5wYXJhbWV0ZXJzKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIHNtYWxsIGljb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgZmlsdGVyLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHNtYWxsSWNvbiA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFNtYWxsSWNvbigpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLnNtYWxsSWNvbik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U21hbGxJY29uKFN0cmluZyBzbWFsbEljb24pIHsKKyAgICAgICAgdGhpcy5zbWFsbEljb24gPSBzbWFsbEljb247CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogQWRkIGFuIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlciB0byB0aGUgc2V0IG9mIHBhcmFtZXRlcnMgYXNzb2NpYXRlZAorICAgICAqIHdpdGggdGhpcyBmaWx0ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBUaGUgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyIG5hbWUKKyAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlciB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEluaXRQYXJhbWV0ZXIoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgeworCisgICAgICAgIHBhcmFtZXRlcnMucHV0KG5hbWUsIHZhbHVlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVuZGVyIGEgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiRmlsdGVyRGVmWyIpOworICAgICAgICBzYi5hcHBlbmQoImZpbHRlck5hbWU9Iik7CisgICAgICAgIHNiLmFwcGVuZCh0aGlzLmZpbHRlck5hbWUpOworICAgICAgICBzYi5hcHBlbmQoIiwgZmlsdGVyQ2xhc3M9Iik7CisgICAgICAgIHNiLmFwcGVuZCh0aGlzLmZpbHRlckNsYXNzKTsKKyAgICAgICAgc2IuYXBwZW5kKCJdIik7CisgICAgICAgIHJldHVybiAoc2IudG9TdHJpbmcoKSk7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2RlcGxveS9GaWx0ZXJNYXAuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9kZXBsb3kvRmlsdGVyTWFwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY3NGNlYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9kZXBsb3kvRmlsdGVyTWFwLmphdmEKQEAgLTAsMCArMSwyMTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95OworCisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuUmVxdWVzdFV0aWw7CitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CisKKworLyoqCisgKiBSZXByZXNlbnRhdGlvbiBvZiBhIGZpbHRlciBtYXBwaW5nIGZvciBhIHdlYiBhcHBsaWNhdGlvbiwgYXMgcmVwcmVzZW50ZWQKKyAqIGluIGEgPGNvZGU+Jmx0O2ZpbHRlci1tYXBwaW5nJmd0OzwvY29kZT4gZWxlbWVudCBpbiB0aGUgZGVwbG95bWVudAorICogZGVzY3JpcHRvci4gIEVhY2ggZmlsdGVyIG1hcHBpbmcgbXVzdCBjb250YWluIGEgZmlsdGVyIG5hbWUgcGx1cyBlaXRoZXIKKyAqIGEgVVJMIHBhdHRlcm4gb3IgYSBzZXJ2bGV0IG5hbWUuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBGaWx0ZXJNYXAgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2YgdGhpcyBmaWx0ZXIgdG8gYmUgZXhlY3V0ZWQgd2hlbiB0aGlzIG1hcHBpbmcgbWF0Y2hlcworICAgICAqIGEgcGFydGljdWxhciByZXF1ZXN0LgorICAgICAqLworICAgIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SID0gMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JXQVJEID0gMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JXQVJEX0VSUk9SID0zOyAgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5DTFVERSA9IDQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5DTFVERV9FUlJPUiAgPSA1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOQ0xVREVfRVJST1JfRk9SV0FSRCAgPTY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5DTFVERV9GT1JXQVJEICA9IDc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVRVUVTVCA9IDg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVRVUVTVF9FUlJPUiA9IDk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVRVUVTVF9FUlJPUl9GT1JXQVJEID0gMTA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVRVUVTVF9FUlJPUl9GT1JXQVJEX0lOQ0xVREUgPSAxMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVFVRVNUX0VSUk9SX0lOQ0xVREUgPSAxMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVFVRVNUX0ZPUldBUkQgPSAxMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVFVRVNUX0lOQ0xVREUgPSAxNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVFVRVNUX0ZPUldBUkRfSU5DTFVERT0gMTU7CisgICAgCisgICAgLy8gcmVwcmVzZW50cyBub3RoaW5nIGhhdmluZyBiZWVuIHNldC4gVGhpcyB3aWxsIGJlIHNlZW4gCisgICAgLy8gYXMgZXF1YWwgdG8gYSBSRVFVRVNUCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5PVF9TRVQgPSAtMTsKKyAgICAKKyAgICBwcml2YXRlIGludCBkaXNwYXRjaGVyTWFwcGluZz1OT1RfU0VUOworICAgIAorICAgIHByaXZhdGUgU3RyaW5nIGZpbHRlck5hbWUgPSBudWxsOyAgICAKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmlsdGVyTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLmZpbHRlck5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEZpbHRlck5hbWUoU3RyaW5nIGZpbHRlck5hbWUpIHsKKyAgICAgICAgdGhpcy5maWx0ZXJOYW1lID0gZmlsdGVyTmFtZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSBzZXJ2bGV0IG5hbWUgdGhpcyBtYXBwaW5nIG1hdGNoZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgc2VydmxldE5hbWUgPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXRTZXJ2bGV0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLnNlcnZsZXROYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2bGV0TmFtZShTdHJpbmcgc2VydmxldE5hbWUpIHsKKyAgICAgICAgdGhpcy5zZXJ2bGV0TmFtZSA9IHNlcnZsZXROYW1lOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIFVSTCBwYXR0ZXJuIHRoaXMgbWFwcGluZyBtYXRjaGVzLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHVybFBhdHRlcm4gPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXRVUkxQYXR0ZXJuKCkgeworICAgICAgICByZXR1cm4gKHRoaXMudXJsUGF0dGVybik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VVJMUGF0dGVybihTdHJpbmcgdXJsUGF0dGVybikgeworICAgICAgICB0aGlzLnVybFBhdHRlcm4gPSBSZXF1ZXN0VXRpbC5VUkxEZWNvZGUodXJsUGF0dGVybik7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqCisgICAgICogVGhpcyBtZXRob2Qgd2lsbCBiZSB1c2VkIHRvIHNldCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgRmlsdGVyTWFwCisgICAgICogcmVwcmVzZW50aW5nIHRoZSBzdGF0ZSBvZiB3aGVuIGZpbHRlcnMgc2hvdWxkIGJlIGFwcGxpZWQ6CisgICAgICoKKyAgICAgKiAgICAgICAgRVJST1IKKyAgICAgKiAgICAgICAgRk9SV0FSRAorICAgICAqICAgICAgICBGT1JXQVJEX0VSUk9SCisgICAgICogICAgICAgIElOQ0xVREUKKyAgICAgKiAgICAgICAgSU5DTFVERV9FUlJPUgorICAgICAqICAgICAgICBJTkNMVURFX0VSUk9SX0ZPUldBUkQKKyAgICAgKiAgICAgICAgUkVRVUVTVAorICAgICAqICAgICAgICBSRVFVRVNUX0VSUk9SCisgICAgICogICAgICAgIFJFUVVFU1RfRVJST1JfSU5DTFVERQorICAgICAqICAgICAgICBSRVFVRVNUX0VSUk9SX0ZPUldBUkRfSU5DTFVERQorICAgICAqICAgICAgICBSRVFVRVNUX0lOQ0xVREUKKyAgICAgKiAgICAgICAgUkVRVUVTVF9GT1JXQVJELAorICAgICAqICAgICAgICBSRVFVRVNUX0ZPUldBUkRfSU5DTFVERQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGlzcGF0Y2hlcihTdHJpbmcgZGlzcGF0Y2hlclN0cmluZykgeworICAgICAgICBTdHJpbmcgZGlzcGF0Y2hlciA9IGRpc3BhdGNoZXJTdHJpbmcudG9VcHBlckNhc2UoKTsKKyAgICAgICAgCisgICAgICAgIGlmIChkaXNwYXRjaGVyLmVxdWFscygiRk9SV0FSRCIpKSB7CisKKyAgICAgICAgICAgIC8vIGFwcGx5IEZPUldBUkQgdG8gdGhlIGdsb2JhbCBkaXNwYXRjaGVyTWFwcGluZy4KKyAgICAgICAgICAgIHN3aXRjaCAoZGlzcGF0Y2hlck1hcHBpbmcpIHsKKyAgICAgICAgICAgICAgICBjYXNlIE5PVF9TRVQgIDogIGRpc3BhdGNoZXJNYXBwaW5nID0gRk9SV0FSRDsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBFUlJPUiA6IGRpc3BhdGNoZXJNYXBwaW5nID0gRk9SV0FSRF9FUlJPUjsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBJTkNMVURFICA6ICBkaXNwYXRjaGVyTWFwcGluZyA9IElOQ0xVREVfRk9SV0FSRDsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBJTkNMVURFX0VSUk9SICA6ICBkaXNwYXRjaGVyTWFwcGluZyA9IElOQ0xVREVfRVJST1JfRk9SV0FSRDsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBSRVFVRVNUIDogZGlzcGF0Y2hlck1hcHBpbmcgPSBSRVFVRVNUX0ZPUldBUkQ7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUkVRVUVTVF9FUlJPUiA6IGRpc3BhdGNoZXJNYXBwaW5nID0gUkVRVUVTVF9FUlJPUl9GT1JXQVJEOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFJFUVVFU1RfRVJST1JfSU5DTFVERSA6IGRpc3BhdGNoZXJNYXBwaW5nID0gUkVRVUVTVF9FUlJPUl9GT1JXQVJEX0lOQ0xVREU7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUkVRVUVTVF9JTkNMVURFIDogZGlzcGF0Y2hlck1hcHBpbmcgPSBSRVFVRVNUX0ZPUldBUkRfSU5DTFVERTsgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoZGlzcGF0Y2hlci5lcXVhbHMoIklOQ0xVREUiKSkgeworICAgICAgICAgICAgLy8gYXBwbHkgSU5DTFVERSB0byB0aGUgZ2xvYmFsIGRpc3BhdGNoZXJNYXBwaW5nLgorICAgICAgICAgICAgc3dpdGNoIChkaXNwYXRjaGVyTWFwcGluZykgeworICAgICAgICAgICAgICAgIGNhc2UgTk9UX1NFVCAgOiAgZGlzcGF0Y2hlck1hcHBpbmcgPSBJTkNMVURFOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEVSUk9SIDogZGlzcGF0Y2hlck1hcHBpbmcgPSBJTkNMVURFX0VSUk9SOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEZPUldBUkQgIDogIGRpc3BhdGNoZXJNYXBwaW5nID0gSU5DTFVERV9GT1JXQVJEOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEZPUldBUkRfRVJST1IgIDogIGRpc3BhdGNoZXJNYXBwaW5nID0gSU5DTFVERV9FUlJPUl9GT1JXQVJEOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFJFUVVFU1QgOiBkaXNwYXRjaGVyTWFwcGluZyA9IFJFUVVFU1RfSU5DTFVERTsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBSRVFVRVNUX0VSUk9SIDogZGlzcGF0Y2hlck1hcHBpbmcgPSBSRVFVRVNUX0VSUk9SX0lOQ0xVREU7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUkVRVUVTVF9FUlJPUl9GT1JXQVJEIDogZGlzcGF0Y2hlck1hcHBpbmcgPSBSRVFVRVNUX0VSUk9SX0ZPUldBUkRfSU5DTFVERTsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBSRVFVRVNUX0ZPUldBUkQgOiBkaXNwYXRjaGVyTWFwcGluZyA9IFJFUVVFU1RfRk9SV0FSRF9JTkNMVURFOyBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChkaXNwYXRjaGVyLmVxdWFscygiUkVRVUVTVCIpKSB7CisgICAgICAgICAgICAvLyBhcHBseSBSRVFVRVNUIHRvIHRoZSBnbG9iYWwgZGlzcGF0Y2hlck1hcHBpbmcuCisgICAgICAgICAgICBzd2l0Y2ggKGRpc3BhdGNoZXJNYXBwaW5nKSB7CisgICAgICAgICAgICAgICAgY2FzZSBOT1RfU0VUICA6ICBkaXNwYXRjaGVyTWFwcGluZyA9IFJFUVVFU1Q7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRVJST1IgOiBkaXNwYXRjaGVyTWFwcGluZyA9IFJFUVVFU1RfRVJST1I7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRk9SV0FSRCAgOiAgZGlzcGF0Y2hlck1hcHBpbmcgPSBSRVFVRVNUX0ZPUldBUkQ7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRk9SV0FSRF9FUlJPUiAgOiAgZGlzcGF0Y2hlck1hcHBpbmcgPSBSRVFVRVNUX0VSUk9SX0ZPUldBUkQ7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgSU5DTFVERSAgOiAgZGlzcGF0Y2hlck1hcHBpbmcgPSBSRVFVRVNUX0lOQ0xVREU7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgSU5DTFVERV9FUlJPUiAgOiAgZGlzcGF0Y2hlck1hcHBpbmcgPSBSRVFVRVNUX0VSUk9SX0lOQ0xVREU7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgSU5DTFVERV9GT1JXQVJEIDogZGlzcGF0Y2hlck1hcHBpbmcgPSBSRVFVRVNUX0ZPUldBUkRfSU5DTFVERTsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBJTkNMVURFX0VSUk9SX0ZPUldBUkQgOiBkaXNwYXRjaGVyTWFwcGluZyA9IFJFUVVFU1RfRVJST1JfRk9SV0FSRF9JTkNMVURFOyBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAgZWxzZSBpZiAoZGlzcGF0Y2hlci5lcXVhbHMoIkVSUk9SIikpIHsKKyAgICAgICAgICAgIC8vIGFwcGx5IEVSUk9SIHRvIHRoZSBnbG9iYWwgZGlzcGF0Y2hlck1hcHBpbmcuCisgICAgICAgICAgICBzd2l0Y2ggKGRpc3BhdGNoZXJNYXBwaW5nKSB7CisgICAgICAgICAgICAgICAgY2FzZSBOT1RfU0VUICA6ICBkaXNwYXRjaGVyTWFwcGluZyA9IEVSUk9SOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEZPUldBUkQgIDogIGRpc3BhdGNoZXJNYXBwaW5nID0gRk9SV0FSRF9FUlJPUjsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBJTkNMVURFICA6ICBkaXNwYXRjaGVyTWFwcGluZyA9IElOQ0xVREVfRVJST1I7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgSU5DTFVERV9GT1JXQVJEIDogZGlzcGF0Y2hlck1hcHBpbmcgPSBJTkNMVURFX0VSUk9SX0ZPUldBUkQ7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUkVRVUVTVCA6IGRpc3BhdGNoZXJNYXBwaW5nID0gUkVRVUVTVF9FUlJPUjsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBSRVFVRVNUX0lOQ0xVREUgOiBkaXNwYXRjaGVyTWFwcGluZyA9IFJFUVVFU1RfRVJST1JfSU5DTFVERTsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBSRVFVRVNUX0ZPUldBUkQgOiBkaXNwYXRjaGVyTWFwcGluZyA9IFJFUVVFU1RfRVJST1JfRk9SV0FSRDsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBSRVFVRVNUX0ZPUldBUkRfSU5DTFVERSA6IGRpc3BhdGNoZXJNYXBwaW5nID0gUkVRVUVTVF9FUlJPUl9GT1JXQVJEX0lOQ0xVREU7IGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyBpbnQgZ2V0RGlzcGF0Y2hlck1hcHBpbmcoKSB7CisgICAgICAgIC8vIHBlciB0aGUgU1JWLjYuMi41IGFic2VuY2Ugb2YgYW55IGRpc3BhdGNoZXIgZWxlbWVudHMgaXMKKyAgICAgICAgLy8gZXF1aXZlbGFudCB0byBhIFJFUVVFU1QgdmFsdWUKKyAgICAgICAgaWYgKGRpc3BhdGNoZXJNYXBwaW5nID09IE5PVF9TRVQpIHJldHVybiBSRVFVRVNUOworICAgICAgICBlbHNlIHJldHVybiBkaXNwYXRjaGVyTWFwcGluZzsgCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmVuZGVyIGEgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiRmlsdGVyTWFwWyIpOworICAgICAgICBzYi5hcHBlbmQoImZpbHRlck5hbWU9Iik7CisgICAgICAgIHNiLmFwcGVuZCh0aGlzLmZpbHRlck5hbWUpOworICAgICAgICBpZiAoc2VydmxldE5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIsIHNlcnZsZXROYW1lPSIpOworICAgICAgICAgICAgc2IuYXBwZW5kKHNlcnZsZXROYW1lKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodXJsUGF0dGVybiAhPSBudWxsKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiwgdXJsUGF0dGVybj0iKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCh1cmxQYXR0ZXJuKTsKKyAgICAgICAgfQorICAgICAgICBzYi5hcHBlbmQoIl0iKTsKKyAgICAgICAgcmV0dXJuIChzYi50b1N0cmluZygpKTsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvZGVwbG95L0xvZ2luQ29uZmlnLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvZGVwbG95L0xvZ2luQ29uZmlnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY0NzE4MQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9kZXBsb3kvTG9naW5Db25maWcuamF2YQpAQCAtMCwwICsxLDE2NiBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3k7CisKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5SZXF1ZXN0VXRpbDsKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKKworCisvKioKKyAqIFJlcHJlc2VudGF0aW9uIG9mIGEgbG9naW4gY29uZmlndXJhdGlvbiBlbGVtZW50IGZvciBhIHdlYiBhcHBsaWNhdGlvbiwKKyAqIGFzIHJlcHJlc2VudGVkIGluIGEgPGNvZGU+Jmx0O2xvZ2luLWNvbmZpZyZndDs8L2NvZGU+IGVsZW1lbnQgaW4gdGhlCisgKiBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBMb2dpbkNvbmZpZyBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgTG9naW5Db25maWcgd2l0aCBkZWZhdWx0IHByb3BlcnRpZXMuCisgICAgICovCisgICAgcHVibGljIExvZ2luQ29uZmlnKCkgeworCisgICAgICAgIHN1cGVyKCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBMb2dpbkNvbmZpZyB3aXRoIHRoZSBzcGVjaWZpZWQgcHJvcGVydGllcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhdXRoTWV0aG9kIFRoZSBhdXRoZW50aWNhdGlvbiBtZXRob2QKKyAgICAgKiBAcGFyYW0gcmVhbG1OYW1lIFRoZSByZWFsbSBuYW1lCisgICAgICogQHBhcmFtIGxvZ2luUGFnZSBUaGUgbG9naW4gcGFnZSBVUkkKKyAgICAgKiBAcGFyYW0gZXJyb3JQYWdlIFRoZSBlcnJvciBwYWdlIFVSSQorICAgICAqLworICAgIHB1YmxpYyBMb2dpbkNvbmZpZyhTdHJpbmcgYXV0aE1ldGhvZCwgU3RyaW5nIHJlYWxtTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxvZ2luUGFnZSwgU3RyaW5nIGVycm9yUGFnZSkgeworCisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIHNldEF1dGhNZXRob2QoYXV0aE1ldGhvZCk7CisgICAgICAgIHNldFJlYWxtTmFtZShyZWFsbU5hbWUpOworICAgICAgICBzZXRMb2dpblBhZ2UobG9naW5QYWdlKTsKKyAgICAgICAgc2V0RXJyb3JQYWdlKGVycm9yUGFnZSk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgYXV0aGVudGljYXRpb24gbWV0aG9kIHRvIHVzZSBmb3IgYXBwbGljYXRpb24gbG9naW4uICBNdXN0IGJlCisgICAgICogQkFTSUMsIERJR0VTVCwgRk9STSwgb3IgQ0xJRU5ULUNFUlQuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgYXV0aE1ldGhvZCA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEF1dGhNZXRob2QoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5hdXRoTWV0aG9kKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBdXRoTWV0aG9kKFN0cmluZyBhdXRoTWV0aG9kKSB7CisgICAgICAgIHRoaXMuYXV0aE1ldGhvZCA9IGF1dGhNZXRob2Q7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgY29udGV4dC1yZWxhdGl2ZSBVUkkgb2YgdGhlIGVycm9yIHBhZ2UgZm9yIGZvcm0gbG9naW4uCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZXJyb3JQYWdlID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JQYWdlKCkgeworICAgICAgICByZXR1cm4gKHRoaXMuZXJyb3JQYWdlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRFcnJvclBhZ2UoU3RyaW5nIGVycm9yUGFnZSkgeworICAgICAgICAvLyAgICAgICAgaWYgKChlcnJvclBhZ2UgPT0gbnVsbCkgfHwgIWVycm9yUGFnZS5zdGFydHNXaXRoKCIvIikpCisgICAgICAgIC8vICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAgICAvLyAgICAgICAgICAgICAgICAoIkVycm9yIFBhZ2UgcmVzb3VyY2UgcGF0aCBtdXN0IHN0YXJ0IHdpdGggYSAnLyciKTsKKyAgICAgICAgdGhpcy5lcnJvclBhZ2UgPSBSZXF1ZXN0VXRpbC5VUkxEZWNvZGUoZXJyb3JQYWdlKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSBjb250ZXh0LXJlbGF0aXZlIFVSSSBvZiB0aGUgbG9naW4gcGFnZSBmb3IgZm9ybSBsb2dpbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBsb2dpblBhZ2UgPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXRMb2dpblBhZ2UoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5sb2dpblBhZ2UpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldExvZ2luUGFnZShTdHJpbmcgbG9naW5QYWdlKSB7CisgICAgICAgIC8vICAgICAgICBpZiAoKGxvZ2luUGFnZSA9PSBudWxsKSB8fCAhbG9naW5QYWdlLnN0YXJ0c1dpdGgoIi8iKSkKKyAgICAgICAgLy8gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICAgIC8vICAgICAgICAgICAgICAgICgiTG9naW4gUGFnZSByZXNvdXJjZSBwYXRoIG11c3Qgc3RhcnQgd2l0aCBhICcvJyIpOworICAgICAgICB0aGlzLmxvZ2luUGFnZSA9IFJlcXVlc3RVdGlsLlVSTERlY29kZShsb2dpblBhZ2UpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIHJlYWxtIG5hbWUgdXNlZCB3aGVuIGNoYWxsZW5naW5nIHRoZSB1c2VyIGZvciBhdXRoZW50aWNhdGlvbgorICAgICAqIGNyZWRlbnRpYWxzLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHJlYWxtTmFtZSA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlYWxtTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLnJlYWxtTmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UmVhbG1OYW1lKFN0cmluZyByZWFsbU5hbWUpIHsKKyAgICAgICAgdGhpcy5yZWFsbU5hbWUgPSByZWFsbU5hbWU7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiTG9naW5Db25maWdbIik7CisgICAgICAgIHNiLmFwcGVuZCgiYXV0aE1ldGhvZD0iKTsKKyAgICAgICAgc2IuYXBwZW5kKGF1dGhNZXRob2QpOworICAgICAgICBpZiAocmVhbG1OYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiLCByZWFsbU5hbWU9Iik7CisgICAgICAgICAgICBzYi5hcHBlbmQocmVhbG1OYW1lKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobG9naW5QYWdlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiLCBsb2dpblBhZ2U9Iik7CisgICAgICAgICAgICBzYi5hcHBlbmQobG9naW5QYWdlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZXJyb3JQYWdlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiLCBlcnJvclBhZ2U9Iik7CisgICAgICAgICAgICBzYi5hcHBlbmQoZXJyb3JQYWdlKTsKKyAgICAgICAgfQorICAgICAgICBzYi5hcHBlbmQoIl0iKTsKKyAgICAgICAgcmV0dXJuIChzYi50b1N0cmluZygpKTsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvZGVwbG95L01lc3NhZ2VEZXN0aW5hdGlvbi5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2RlcGxveS9NZXNzYWdlRGVzdGluYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGEwZjZkCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2RlcGxveS9NZXNzYWdlRGVzdGluYXRpb24uamF2YQpAQCAtMCwwICsxLDE0MCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3k7CisKKworLyoqCisgKiA8cD5SZXByZXNlbnRhdGlvbiBvZiBhIG1lc3NhZ2UgZGVzdGluYXRpb24gZm9yIGEgd2ViIGFwcGxpY2F0aW9uLCBhcworICogcmVwcmVzZW50ZWQgaW4gYSA8Y29kZT4mbHQ7bWVzc2FnZS1kZXN0aW5hdGlvbiZndDs8L2NvZGU+IGVsZW1lbnQKKyAqIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuPC9wPgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqIEBzaW5jZSBUb21jYXQgNS4wCisgKi8KKworcHVibGljIGNsYXNzIE1lc3NhZ2VEZXN0aW5hdGlvbiB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhpcyBkZXN0aW5hdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbiA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworICAgICAgICByZXR1cm4gKHRoaXMuZGVzY3JpcHRpb24pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgeworICAgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgZGlzcGxheSBuYW1lIG9mIHRoaXMgZGVzdGluYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZGlzcGxheU5hbWUgPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXREaXNwbGF5TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLmRpc3BsYXlOYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREaXNwbGF5TmFtZShTdHJpbmcgZGlzcGxheU5hbWUpIHsKKyAgICAgICAgdGhpcy5kaXNwbGF5TmFtZSA9IGRpc3BsYXlOYW1lOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIGxhcmdlIGljb24gb2YgdGhpcyBkZXN0aW5hdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBsYXJnZUljb24gPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXRMYXJnZUljb24oKSB7CisgICAgICAgIHJldHVybiAodGhpcy5sYXJnZUljb24pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldExhcmdlSWNvbihTdHJpbmcgbGFyZ2VJY29uKSB7CisgICAgICAgIHRoaXMubGFyZ2VJY29uID0gbGFyZ2VJY29uOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2YgdGhpcyBkZXN0aW5hdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBuYW1lID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLm5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSBzbWFsbCBpY29uIG9mIHRoaXMgZGVzdGluYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgc21hbGxJY29uID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U21hbGxJY29uKCkgeworICAgICAgICByZXR1cm4gKHRoaXMuc21hbGxJY29uKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTbWFsbEljb24oU3RyaW5nIHNtYWxsSWNvbikgeworICAgICAgICB0aGlzLnNtYWxsSWNvbiA9IHNtYWxsSWNvbjsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCJNZXNzYWdlRGVzdGluYXRpb25bIik7CisgICAgICAgIHNiLmFwcGVuZCgibmFtZT0iKTsKKyAgICAgICAgc2IuYXBwZW5kKG5hbWUpOworICAgICAgICBpZiAoZGlzcGxheU5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIsIGRpc3BsYXlOYW1lPSIpOworICAgICAgICAgICAgc2IuYXBwZW5kKGRpc3BsYXlOYW1lKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobGFyZ2VJY29uICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiLCBsYXJnZUljb249Iik7CisgICAgICAgICAgICBzYi5hcHBlbmQobGFyZ2VJY29uKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc21hbGxJY29uICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiLCBzbWFsbEljb249Iik7CisgICAgICAgICAgICBzYi5hcHBlbmQoc21hbGxJY29uKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIsIGRlc2NyaXB0aW9uPSIpOworICAgICAgICAgICAgc2IuYXBwZW5kKGRlc2NyaXB0aW9uKTsKKyAgICAgICAgfQorICAgICAgICBzYi5hcHBlbmQoIl0iKTsKKyAgICAgICAgcmV0dXJuIChzYi50b1N0cmluZygpKTsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvZGVwbG95L01lc3NhZ2VEZXN0aW5hdGlvblJlZi5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2RlcGxveS9NZXNzYWdlRGVzdGluYXRpb25SZWYuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmNiNzcxCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2RlcGxveS9NZXNzYWdlRGVzdGluYXRpb25SZWYuamF2YQpAQCAtMCwwICsxLDE1OSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3k7CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKKworCisvKioKKyAqIDxwPlJlcHJlc2VudGF0aW9uIG9mIGEgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZlcmVuY2UgZm9yIGEgd2ViIGFwcGxpY2F0aW9uLAorICogYXMgcmVwcmVzZW50ZWQgaW4gYSA8Y29kZT4mbHQ7bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYmZ3Q7PC9jb2RlPiBlbGVtZW50CisgKiBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLjwvcD4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKiBAc2luY2UgVG9tY2F0IDUuMAorICovCisKK3B1YmxpYyBjbGFzcyBNZXNzYWdlRGVzdGluYXRpb25SZWYgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoaXMgZGVzdGluYXRpb24gcmVmLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisgICAgICAgIHJldHVybiAodGhpcy5kZXNjcmlwdGlvbik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7CisgICAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSBsaW5rIG9mIHRoaXMgZGVzdGluYXRpb24gcmVmLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGxpbmsgPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXRMaW5rKCkgeworICAgICAgICByZXR1cm4gKHRoaXMubGluayk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TGluayhTdHJpbmcgbGluaykgeworICAgICAgICB0aGlzLmxpbmsgPSBsaW5rOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2YgdGhpcyBkZXN0aW5hdGlvbiByZWYuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZSA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5uYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBvZiB0aGlzIGRlc3RpbmF0aW9uIHJlZi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyB0eXBlID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLnR5cGUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIHR5cGUpIHsKKyAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSB1c2FnZSBvZiB0aGlzIGRlc3RpbmF0aW9uIHJlZi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyB1c2FnZSA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFVzYWdlKCkgeworICAgICAgICByZXR1cm4gKHRoaXMudXNhZ2UpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVzYWdlKFN0cmluZyB1c2FnZSkgeworICAgICAgICB0aGlzLnVzYWdlID0gdXNhZ2U7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiTWVzc2FnZURlc3RpbmF0aW9uWyIpOworICAgICAgICBzYi5hcHBlbmQoIm5hbWU9Iik7CisgICAgICAgIHNiLmFwcGVuZChuYW1lKTsKKyAgICAgICAgaWYgKGxpbmsgIT0gbnVsbCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIsIGxpbms9Iik7CisgICAgICAgICAgICBzYi5hcHBlbmQobGluayk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIsIHR5cGU9Iik7CisgICAgICAgICAgICBzYi5hcHBlbmQodHlwZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHVzYWdlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiLCB1c2FnZT0iKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCh1c2FnZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRlc2NyaXB0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiLCBkZXNjcmlwdGlvbj0iKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChkZXNjcmlwdGlvbik7CisgICAgICAgIH0KKyAgICAgICAgc2IuYXBwZW5kKCJdIik7CisgICAgICAgIHJldHVybiAoc2IudG9TdHJpbmcoKSk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBhY2thZ2UgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgTmFtaW5nUmVzb3VyY2VzIHdpdGggd2hpY2ggd2UgYXJlIGFzc29jaWF0ZWQgKGlmIGFueSkuCisgICAgICovCisgICAgcHJvdGVjdGVkIE5hbWluZ1Jlc291cmNlcyByZXNvdXJjZXMgPSBudWxsOworCisgICAgcHVibGljIE5hbWluZ1Jlc291cmNlcyBnZXROYW1pbmdSZXNvdXJjZXMoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5yZXNvdXJjZXMpOworICAgIH0KKworICAgIHZvaWQgc2V0TmFtaW5nUmVzb3VyY2VzKE5hbWluZ1Jlc291cmNlcyByZXNvdXJjZXMpIHsKKyAgICAgICAgdGhpcy5yZXNvdXJjZXMgPSByZXNvdXJjZXM7CisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9kZXBsb3kvTmFtaW5nUmVzb3VyY2VzLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvZGVwbG95L05hbWluZ1Jlc291cmNlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5NDU0YjYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvZGVwbG95L05hbWluZ1Jlc291cmNlcy5qYXZhCkBAIC0wLDAgKzEsNzA1IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveTsKKworCitpbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOworaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VTdXBwb3J0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CisKKworLyoqCisgKiBIb2xkcyBhbmQgbWFuYWdlcyB0aGUgbmFtaW5nIHJlc291cmNlcyBkZWZpbmVkIGluIHRoZSBKMkVFIEVudGVycHJpc2UgCisgKiBOYW1pbmcgQ29udGV4dCBhbmQgdGhlaXIgYXNzb2NpYXRlZCBKTkRJIGNvbnRleHQuCisgKgorICogQGF1dGhvciBSZW15IE1hdWNoZXJhdAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgTmFtaW5nUmVzb3VyY2VzIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBOYW1pbmdSZXNvdXJjZXMgaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIE5hbWluZ1Jlc291cmNlcygpIHsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBBc3NvY2lhdGVkIGNvbnRhaW5lciBvYmplY3QuCisgICAgICovCisgICAgcHJpdmF0ZSBPYmplY3QgY29udGFpbmVyID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogTGlzdCBvZiBuYW1pbmcgZW50cmllcywga2V5ZWQgYnkgbmFtZS4gVGhlIHZhbHVlIGlzIHRoZSBlbnRyeSB0eXBlLCBhcworICAgICAqIGRlY2xhcmVkIGJ5IHRoZSB1c2VyLgorICAgICAqLworICAgIHByaXZhdGUgSGFzaHRhYmxlIGVudHJpZXMgPSBuZXcgSGFzaHRhYmxlKCk7CisKKworICAgIC8qKgorICAgICAqIFRoZSBFSkIgcmVzb3VyY2UgcmVmZXJlbmNlcyBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24sIGtleWVkIGJ5IG5hbWUuCisgICAgICovCisgICAgcHJpdmF0ZSBIYXNoTWFwIGVqYnMgPSBuZXcgSGFzaE1hcCgpOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZW52aXJvbm1lbnQgZW50cmllcyBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24sIGtleWVkIGJ5IG5hbWUuCisgICAgICovCisgICAgcHJpdmF0ZSBIYXNoTWFwIGVudnMgPSBuZXcgSGFzaE1hcCgpOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgbG9jYWwgIEVKQiByZXNvdXJjZSByZWZlcmVuY2VzIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbiwga2V5ZWQgYnkKKyAgICAgKiBuYW1lLgorICAgICAqLworICAgIHByaXZhdGUgSGFzaE1hcCBsb2NhbEVqYnMgPSBuZXcgSGFzaE1hcCgpOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZlcmVuY2VzcyBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24sCisgICAgICoga2V5ZWQgYnkgbmFtZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIEhhc2hNYXAgbWRycyA9IG5ldyBIYXNoTWFwKCk7CisKKworICAgIC8qKgorICAgICAqIFRoZSByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2VzIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbiwKKyAgICAgKiBrZXllZCBieSBuYW1lLgorICAgICAqLworICAgIHByaXZhdGUgSGFzaE1hcCByZXNvdXJjZUVudlJlZnMgPSBuZXcgSGFzaE1hcCgpOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgcmVzb3VyY2UgcmVmZXJlbmNlcyBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24sIGtleWVkIGJ5IG5hbWUuCisgICAgICovCisgICAgcHJpdmF0ZSBIYXNoTWFwIHJlc291cmNlcyA9IG5ldyBIYXNoTWFwKCk7CisKKworICAgIC8qKgorICAgICAqIFRoZSByZXNvdXJjZSBsaW5rcyBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24sIGtleWVkIGJ5IG5hbWUuCisgICAgICovCisgICAgcHJpdmF0ZSBIYXNoTWFwIHJlc291cmNlTGlua3MgPSBuZXcgSGFzaE1hcCgpOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgdHJhbnNhY3Rpb24gZm9yIHRoaXMgd2ViYXBwLgorICAgICAqLworICAgIHByaXZhdGUgQ29udGV4dFRyYW5zYWN0aW9uIHRyYW5zYWN0aW9uID0gbnVsbDsKKyAgICAKKworICAgIC8qKgorICAgICAqIFRoZSBwcm9wZXJ0eSBjaGFuZ2Ugc3VwcG9ydCBmb3IgdGhpcyBjb21wb25lbnQuCisgICAgICovCisgICAgcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlU3VwcG9ydCBzdXBwb3J0ID0gbmV3IFByb3BlcnR5Q2hhbmdlU3VwcG9ydCh0aGlzKTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgY29udGFpbmVyIHdpdGggd2hpY2ggdGhlIG5hbWluZyByZXNvdXJjZXMgYXJlIGFzc29jaWF0ZWQuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRDb250YWluZXIoKSB7CisgICAgICAgIHJldHVybiBjb250YWluZXI7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNvbnRhaW5lciB3aXRoIHdoaWNoIHRoZSBuYW1pbmcgcmVzb3VyY2VzIGFyZSBhc3NvY2lhdGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbnRhaW5lcihPYmplY3QgY29udGFpbmVyKSB7CisgICAgICAgIHRoaXMuY29udGFpbmVyID0gY29udGFpbmVyOworICAgIH0KKworICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgdHJhbnNhY3Rpb24gb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRyYW5zYWN0aW9uKENvbnRleHRUcmFuc2FjdGlvbiB0cmFuc2FjdGlvbikgeworICAgICAgICB0aGlzLnRyYW5zYWN0aW9uID0gdHJhbnNhY3Rpb247CisgICAgfQorICAgIAorCisgICAgLyoqCisgICAgICogR2V0IHRoZSB0cmFuc2FjdGlvbiBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIENvbnRleHRUcmFuc2FjdGlvbiBnZXRUcmFuc2FjdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHRyYW5zYWN0aW9uOworICAgIH0KKyAgICAKKworICAgIC8qKgorICAgICAqIEFkZCBhbiBFSkIgcmVzb3VyY2UgcmVmZXJlbmNlIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlamIgTmV3IEVKQiByZXNvdXJjZSByZWZlcmVuY2UKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRFamIoQ29udGV4dEVqYiBlamIpIHsKKworICAgICAgICBpZiAoZW50cmllcy5jb250YWluc0tleShlamIuZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZW50cmllcy5wdXQoZWpiLmdldE5hbWUoKSwgZWpiLmdldFR5cGUoKSk7CisgICAgICAgIH0KKworICAgICAgICBzeW5jaHJvbml6ZWQgKGVqYnMpIHsKKyAgICAgICAgICAgIGVqYi5zZXROYW1pbmdSZXNvdXJjZXModGhpcyk7CisgICAgICAgICAgICBlamJzLnB1dChlamIuZ2V0TmFtZSgpLCBlamIpOworICAgICAgICB9CisgICAgICAgIHN1cHBvcnQuZmlyZVByb3BlcnR5Q2hhbmdlKCJlamIiLCBudWxsLCBlamIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBZGQgYW4gZW52aXJvbm1lbnQgZW50cnkgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGVudmlyb25tZW50IE5ldyBlbnZpcm9ubWVudCBlbnRyeQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEVudmlyb25tZW50KENvbnRleHRFbnZpcm9ubWVudCBlbnZpcm9ubWVudCkgeworCisgICAgICAgIGlmIChlbnRyaWVzLmNvbnRhaW5zS2V5KGVudmlyb25tZW50LmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGVudHJpZXMucHV0KGVudmlyb25tZW50LmdldE5hbWUoKSwgZW52aXJvbm1lbnQuZ2V0VHlwZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHN5bmNocm9uaXplZCAoZW52cykgeworICAgICAgICAgICAgZW52aXJvbm1lbnQuc2V0TmFtaW5nUmVzb3VyY2VzKHRoaXMpOworICAgICAgICAgICAgZW52cy5wdXQoZW52aXJvbm1lbnQuZ2V0TmFtZSgpLCBlbnZpcm9ubWVudCk7CisgICAgICAgIH0KKyAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoImVudmlyb25tZW50IiwgbnVsbCwgZW52aXJvbm1lbnQpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBsb2NhbCBFSkIgcmVzb3VyY2UgcmVmZXJlbmNlIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlamIgTmV3IEVKQiByZXNvdXJjZSByZWZlcmVuY2UKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRMb2NhbEVqYihDb250ZXh0TG9jYWxFamIgZWpiKSB7CisKKyAgICAgICAgaWYgKGVudHJpZXMuY29udGFpbnNLZXkoZWpiLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGVudHJpZXMucHV0KGVqYi5nZXROYW1lKCksIGVqYi5nZXRUeXBlKCkpOworICAgICAgICB9CisKKyAgICAgICAgc3luY2hyb25pemVkIChsb2NhbEVqYnMpIHsKKyAgICAgICAgICAgIGVqYi5zZXROYW1pbmdSZXNvdXJjZXModGhpcyk7CisgICAgICAgICAgICBsb2NhbEVqYnMucHV0KGVqYi5nZXROYW1lKCksIGVqYik7CisgICAgICAgIH0KKyAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoImxvY2FsRWpiIiwgbnVsbCwgZWpiKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQWRkIGEgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZlcmVuY2UgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIG1kciBOZXcgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZlcmVuY2UKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRNZXNzYWdlRGVzdGluYXRpb25SZWYoTWVzc2FnZURlc3RpbmF0aW9uUmVmIG1kcikgeworCisgICAgICAgIGlmIChlbnRyaWVzLmNvbnRhaW5zS2V5KG1kci5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBlbnRyaWVzLnB1dChtZHIuZ2V0TmFtZSgpLCBtZHIuZ2V0VHlwZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHN5bmNocm9uaXplZCAobWRycykgeworICAgICAgICAgICAgbWRyLnNldE5hbWluZ1Jlc291cmNlcyh0aGlzKTsKKyAgICAgICAgICAgIG1kcnMucHV0KG1kci5nZXROYW1lKCksIG1kcik7CisgICAgICAgIH0KKyAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoIm1lc3NhZ2VEZXN0aW5hdGlvblJlZiIsIG51bGwsIG1kcik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEFkZCBhIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lciB0byB0aGlzIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgdG8gYWRkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisKKyAgICAgICAgc3VwcG9ydC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQWRkIGEgcmVzb3VyY2UgcmVmZXJlbmNlIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNvdXJjZSBOZXcgcmVzb3VyY2UgcmVmZXJlbmNlCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkUmVzb3VyY2UoQ29udGV4dFJlc291cmNlIHJlc291cmNlKSB7CisKKyAgICAgICAgaWYgKGVudHJpZXMuY29udGFpbnNLZXkocmVzb3VyY2UuZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZW50cmllcy5wdXQocmVzb3VyY2UuZ2V0TmFtZSgpLCByZXNvdXJjZS5nZXRUeXBlKCkpOworICAgICAgICB9CisKKyAgICAgICAgc3luY2hyb25pemVkIChyZXNvdXJjZXMpIHsKKyAgICAgICAgICAgIHJlc291cmNlLnNldE5hbWluZ1Jlc291cmNlcyh0aGlzKTsKKyAgICAgICAgICAgIHJlc291cmNlcy5wdXQocmVzb3VyY2UuZ2V0TmFtZSgpLCByZXNvdXJjZSk7CisgICAgICAgIH0KKyAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoInJlc291cmNlIiwgbnVsbCwgcmVzb3VyY2UpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2UgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHJlc291cmNlIFRoZSByZXNvdXJjZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFJlc291cmNlRW52UmVmKENvbnRleHRSZXNvdXJjZUVudlJlZiByZXNvdXJjZSkgeworCisgICAgICAgIGlmIChlbnRyaWVzLmNvbnRhaW5zS2V5KHJlc291cmNlLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGVudHJpZXMucHV0KHJlc291cmNlLmdldE5hbWUoKSwgcmVzb3VyY2UuZ2V0VHlwZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHN5bmNocm9uaXplZCAobG9jYWxFamJzKSB7CisgICAgICAgICAgICByZXNvdXJjZS5zZXROYW1pbmdSZXNvdXJjZXModGhpcyk7CisgICAgICAgICAgICByZXNvdXJjZUVudlJlZnMucHV0KHJlc291cmNlLmdldE5hbWUoKSwgcmVzb3VyY2UpOworICAgICAgICB9CisgICAgICAgIHN1cHBvcnQuZmlyZVByb3BlcnR5Q2hhbmdlKCJyZXNvdXJjZUVudlJlZiIsIG51bGwsIHJlc291cmNlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQWRkIGEgcmVzb3VyY2UgbGluayBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VMaW5rIE5ldyByZXNvdXJjZSBsaW5rCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkUmVzb3VyY2VMaW5rKENvbnRleHRSZXNvdXJjZUxpbmsgcmVzb3VyY2VMaW5rKSB7CisKKyAgICAgICAgaWYgKGVudHJpZXMuY29udGFpbnNLZXkocmVzb3VyY2VMaW5rLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IHJlc291cmNlTGluay5nZXRUeXBlKCk7CisgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHZhbHVlID0gIiI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbnRyaWVzLnB1dChyZXNvdXJjZUxpbmsuZ2V0TmFtZSgpLCB2YWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICBzeW5jaHJvbml6ZWQgKHJlc291cmNlTGlua3MpIHsKKyAgICAgICAgICAgIHJlc291cmNlTGluay5zZXROYW1pbmdSZXNvdXJjZXModGhpcyk7CisgICAgICAgICAgICByZXNvdXJjZUxpbmtzLnB1dChyZXNvdXJjZUxpbmsuZ2V0TmFtZSgpLCByZXNvdXJjZUxpbmspOworICAgICAgICB9CisgICAgICAgIHN1cHBvcnQuZmlyZVByb3BlcnR5Q2hhbmdlKCJyZXNvdXJjZUxpbmsiLCBudWxsLCByZXNvdXJjZUxpbmspOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIEVKQiByZXNvdXJjZSByZWZlcmVuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUsIGlmIGFueTsKKyAgICAgKiBvdGhlcndpc2UsIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIGRlc2lyZWQgRUpCIHJlc291cmNlIHJlZmVyZW5jZQorICAgICAqLworICAgIHB1YmxpYyBDb250ZXh0RWpiIGZpbmRFamIoU3RyaW5nIG5hbWUpIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKGVqYnMpIHsKKyAgICAgICAgICAgIHJldHVybiAoKENvbnRleHRFamIpIGVqYnMuZ2V0KG5hbWUpKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGRlZmluZWQgRUpCIHJlc291cmNlIHJlZmVyZW5jZXMgZm9yIHRoaXMgYXBwbGljYXRpb24uCisgICAgICogSWYgdGhlcmUgYXJlIG5vbmUsIGEgemVyby1sZW5ndGggYXJyYXkgaXMgcmV0dXJuZWQuCisgICAgICovCisgICAgcHVibGljIENvbnRleHRFamJbXSBmaW5kRWpicygpIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKGVqYnMpIHsKKyAgICAgICAgICAgIENvbnRleHRFamIgcmVzdWx0c1tdID0gbmV3IENvbnRleHRFamJbZWpicy5zaXplKCldOworICAgICAgICAgICAgcmV0dXJuICgoQ29udGV4dEVqYltdKSBlamJzLnZhbHVlcygpLnRvQXJyYXkocmVzdWx0cykpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZW52aXJvbm1lbnQgZW50cnkgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUsIGlmIGFueTsKKyAgICAgKiBvdGhlcndpc2UsIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIGRlc2lyZWQgZW52aXJvbm1lbnQgZW50cnkKKyAgICAgKi8KKyAgICBwdWJsaWMgQ29udGV4dEVudmlyb25tZW50IGZpbmRFbnZpcm9ubWVudChTdHJpbmcgbmFtZSkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAoZW52cykgeworICAgICAgICAgICAgcmV0dXJuICgoQ29udGV4dEVudmlyb25tZW50KSBlbnZzLmdldChuYW1lKSk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXQgb2YgZGVmaW5lZCBlbnZpcm9ubWVudCBlbnRyaWVzIGZvciB0aGlzIHdlYgorICAgICAqIGFwcGxpY2F0aW9uLiAgSWYgbm9uZSBoYXZlIGJlZW4gZGVmaW5lZCwgYSB6ZXJvLWxlbmd0aCBhcnJheQorICAgICAqIGlzIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBDb250ZXh0RW52aXJvbm1lbnRbXSBmaW5kRW52aXJvbm1lbnRzKCkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAoZW52cykgeworICAgICAgICAgICAgQ29udGV4dEVudmlyb25tZW50IHJlc3VsdHNbXSA9IG5ldyBDb250ZXh0RW52aXJvbm1lbnRbZW52cy5zaXplKCldOworICAgICAgICAgICAgcmV0dXJuICgoQ29udGV4dEVudmlyb25tZW50W10pIGVudnMudmFsdWVzKCkudG9BcnJheShyZXN1bHRzKSk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBsb2NhbCBFSkIgcmVzb3VyY2UgcmVmZXJlbmNlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLCBpZiBhbnk7CisgICAgICogb3RoZXJ3aXNlLCByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBkZXNpcmVkIEVKQiByZXNvdXJjZSByZWZlcmVuY2UKKyAgICAgKi8KKyAgICBwdWJsaWMgQ29udGV4dExvY2FsRWpiIGZpbmRMb2NhbEVqYihTdHJpbmcgbmFtZSkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAobG9jYWxFamJzKSB7CisgICAgICAgICAgICByZXR1cm4gKChDb250ZXh0TG9jYWxFamIpIGxvY2FsRWpicy5nZXQobmFtZSkpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZGVmaW5lZCBsb2NhbCBFSkIgcmVzb3VyY2UgcmVmZXJlbmNlcyBmb3IgdGhpcyBhcHBsaWNhdGlvbi4KKyAgICAgKiBJZiB0aGVyZSBhcmUgbm9uZSwgYSB6ZXJvLWxlbmd0aCBhcnJheSBpcyByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29udGV4dExvY2FsRWpiW10gZmluZExvY2FsRWpicygpIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKGxvY2FsRWpicykgeworICAgICAgICAgICAgQ29udGV4dExvY2FsRWpiIHJlc3VsdHNbXSA9IG5ldyBDb250ZXh0TG9jYWxFamJbbG9jYWxFamJzLnNpemUoKV07CisgICAgICAgICAgICByZXR1cm4gKChDb250ZXh0TG9jYWxFamJbXSkgbG9jYWxFamJzLnZhbHVlcygpLnRvQXJyYXkocmVzdWx0cykpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZlcmVuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUsCisgICAgICogaWYgYW55OyBvdGhlcndpc2UsIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIGRlc2lyZWQgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZlcmVuY2UKKyAgICAgKi8KKyAgICBwdWJsaWMgTWVzc2FnZURlc3RpbmF0aW9uUmVmIGZpbmRNZXNzYWdlRGVzdGluYXRpb25SZWYoU3RyaW5nIG5hbWUpIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKG1kcnMpIHsKKyAgICAgICAgICAgIHJldHVybiAoKE1lc3NhZ2VEZXN0aW5hdGlvblJlZikgbWRycy5nZXQobmFtZSkpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZGVmaW5lZCBtZXNzYWdlIGRlc3RpbmF0aW9uIHJlZmVyZW5jZXMgZm9yIHRoaXMgYXBwbGljYXRpb24uCisgICAgICogSWYgdGhlcmUgYXJlIG5vbmUsIGEgemVyby1sZW5ndGggYXJyYXkgaXMgcmV0dXJuZWQuCisgICAgICovCisgICAgcHVibGljIE1lc3NhZ2VEZXN0aW5hdGlvblJlZltdIGZpbmRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAobWRycykgeworICAgICAgICAgICAgTWVzc2FnZURlc3RpbmF0aW9uUmVmIHJlc3VsdHNbXSA9CisgICAgICAgICAgICAgICAgbmV3IE1lc3NhZ2VEZXN0aW5hdGlvblJlZlttZHJzLnNpemUoKV07CisgICAgICAgICAgICByZXR1cm4gKChNZXNzYWdlRGVzdGluYXRpb25SZWZbXSkgbWRycy52YWx1ZXMoKS50b0FycmF5KHJlc3VsdHMpKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHJlc291cmNlIHJlZmVyZW5jZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSwgaWYgYW55OworICAgICAqIG90aGVyd2lzZSByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBkZXNpcmVkIHJlc291cmNlIHJlZmVyZW5jZQorICAgICAqLworICAgIHB1YmxpYyBDb250ZXh0UmVzb3VyY2UgZmluZFJlc291cmNlKFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgc3luY2hyb25pemVkIChyZXNvdXJjZXMpIHsKKyAgICAgICAgICAgIHJldHVybiAoKENvbnRleHRSZXNvdXJjZSkgcmVzb3VyY2VzLmdldChuYW1lKSk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSByZXNvdXJjZSBsaW5rIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLCBpZiBhbnk7CisgICAgICogb3RoZXJ3aXNlIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIGRlc2lyZWQgcmVzb3VyY2UgbGluaworICAgICAqLworICAgIHB1YmxpYyBDb250ZXh0UmVzb3VyY2VMaW5rIGZpbmRSZXNvdXJjZUxpbmsoU3RyaW5nIG5hbWUpIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKHJlc291cmNlTGlua3MpIHsKKyAgICAgICAgICAgIHJldHVybiAoKENvbnRleHRSZXNvdXJjZUxpbmspIHJlc291cmNlTGlua3MuZ2V0KG5hbWUpKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGRlZmluZWQgcmVzb3VyY2UgbGlua3MgZm9yIHRoaXMgYXBwbGljYXRpb24uICBJZgorICAgICAqIG5vbmUgaGF2ZSBiZWVuIGRlZmluZWQsIGEgemVyby1sZW5ndGggYXJyYXkgaXMgcmV0dXJuZWQuCisgICAgICovCisgICAgcHVibGljIENvbnRleHRSZXNvdXJjZUxpbmtbXSBmaW5kUmVzb3VyY2VMaW5rcygpIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKHJlc291cmNlTGlua3MpIHsKKyAgICAgICAgICAgIENvbnRleHRSZXNvdXJjZUxpbmsgcmVzdWx0c1tdID0gCisgICAgICAgICAgICAgICAgbmV3IENvbnRleHRSZXNvdXJjZUxpbmtbcmVzb3VyY2VMaW5rcy5zaXplKCldOworICAgICAgICAgICAgcmV0dXJuICgoQ29udGV4dFJlc291cmNlTGlua1tdKSByZXNvdXJjZUxpbmtzLnZhbHVlcygpCisgICAgICAgICAgICAgICAgICAgIC50b0FycmF5KHJlc3VsdHMpKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGRlZmluZWQgcmVzb3VyY2UgcmVmZXJlbmNlcyBmb3IgdGhpcyBhcHBsaWNhdGlvbi4gIElmCisgICAgICogbm9uZSBoYXZlIGJlZW4gZGVmaW5lZCwgYSB6ZXJvLWxlbmd0aCBhcnJheSBpcyByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29udGV4dFJlc291cmNlW10gZmluZFJlc291cmNlcygpIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKHJlc291cmNlcykgeworICAgICAgICAgICAgQ29udGV4dFJlc291cmNlIHJlc3VsdHNbXSA9IG5ldyBDb250ZXh0UmVzb3VyY2VbcmVzb3VyY2VzLnNpemUoKV07CisgICAgICAgICAgICByZXR1cm4gKChDb250ZXh0UmVzb3VyY2VbXSkgcmVzb3VyY2VzLnZhbHVlcygpLnRvQXJyYXkocmVzdWx0cykpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlIHR5cGUgZm9yIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBuYW1lLCBpZiBhbnk7IG90aGVyd2lzZSByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBkZXNpcmVkIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZQorICAgICAqLworICAgIHB1YmxpYyBDb250ZXh0UmVzb3VyY2VFbnZSZWYgZmluZFJlc291cmNlRW52UmVmKFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgc3luY2hyb25pemVkIChyZXNvdXJjZUVudlJlZnMpIHsKKyAgICAgICAgICAgIHJldHVybiAoKENvbnRleHRSZXNvdXJjZUVudlJlZikgcmVzb3VyY2VFbnZSZWZzLmdldChuYW1lKSk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXQgb2YgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlIG5hbWVzIGZvciB0aGlzCisgICAgICogd2ViIGFwcGxpY2F0aW9uLiAgSWYgbm9uZSBoYXZlIGJlZW4gc3BlY2lmaWVkLCBhIHplcm8tbGVuZ3RoCisgICAgICogYXJyYXkgaXMgcmV0dXJuZWQuCisgICAgICovCisgICAgcHVibGljIENvbnRleHRSZXNvdXJjZUVudlJlZltdIGZpbmRSZXNvdXJjZUVudlJlZnMoKSB7CisKKyAgICAgICAgc3luY2hyb25pemVkIChyZXNvdXJjZUVudlJlZnMpIHsKKyAgICAgICAgICAgIENvbnRleHRSZXNvdXJjZUVudlJlZiByZXN1bHRzW10gPSBuZXcgQ29udGV4dFJlc291cmNlRW52UmVmW3Jlc291cmNlRW52UmVmcy5zaXplKCldOworICAgICAgICAgICAgcmV0dXJuICgoQ29udGV4dFJlc291cmNlRW52UmVmW10pIHJlc291cmNlRW52UmVmcy52YWx1ZXMoKS50b0FycmF5KHJlc3VsdHMpKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgbmFtZSBzcGVjaWZpZWQgYWxyZWFkeSBleGlzdHMuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZXhpc3RzKFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgcmV0dXJuIChlbnRyaWVzLmNvbnRhaW5zS2V5KG5hbWUpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGFueSBFSkIgcmVzb3VyY2UgcmVmZXJlbmNlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgRUpCIHJlc291cmNlIHJlZmVyZW5jZSB0byByZW1vdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVFamIoU3RyaW5nIG5hbWUpIHsKKworICAgICAgICBlbnRyaWVzLnJlbW92ZShuYW1lKTsKKworICAgICAgICBDb250ZXh0RWpiIGVqYiA9IG51bGw7CisgICAgICAgIHN5bmNocm9uaXplZCAoZWpicykgeworICAgICAgICAgICAgZWpiID0gKENvbnRleHRFamIpIGVqYnMucmVtb3ZlKG5hbWUpOworICAgICAgICB9CisgICAgICAgIGlmIChlamIgIT0gbnVsbCkgeworICAgICAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoImVqYiIsIGVqYiwgbnVsbCk7CisgICAgICAgICAgICBlamIuc2V0TmFtaW5nUmVzb3VyY2VzKG51bGwpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhbnkgZW52aXJvbm1lbnQgZW50cnkgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBlbnZpcm9ubWVudCBlbnRyeSB0byByZW1vdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVFbnZpcm9ubWVudChTdHJpbmcgbmFtZSkgeworCisgICAgICAgIGVudHJpZXMucmVtb3ZlKG5hbWUpOworCisgICAgICAgIENvbnRleHRFbnZpcm9ubWVudCBlbnZpcm9ubWVudCA9IG51bGw7CisgICAgICAgIHN5bmNocm9uaXplZCAoZW52cykgeworICAgICAgICAgICAgZW52aXJvbm1lbnQgPSAoQ29udGV4dEVudmlyb25tZW50KSBlbnZzLnJlbW92ZShuYW1lKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZW52aXJvbm1lbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoImVudmlyb25tZW50IiwgZW52aXJvbm1lbnQsIG51bGwpOworICAgICAgICAgICAgZW52aXJvbm1lbnQuc2V0TmFtaW5nUmVzb3VyY2VzKG51bGwpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhbnkgbG9jYWwgRUpCIHJlc291cmNlIHJlZmVyZW5jZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIEVKQiByZXNvdXJjZSByZWZlcmVuY2UgdG8gcmVtb3ZlCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlTG9jYWxFamIoU3RyaW5nIG5hbWUpIHsKKworICAgICAgICBlbnRyaWVzLnJlbW92ZShuYW1lKTsKKworICAgICAgICBDb250ZXh0TG9jYWxFamIgbG9jYWxFamIgPSBudWxsOworICAgICAgICBzeW5jaHJvbml6ZWQgKGxvY2FsRWpicykgeworICAgICAgICAgICAgbG9jYWxFamIgPSAoQ29udGV4dExvY2FsRWpiKSBlamJzLnJlbW92ZShuYW1lKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobG9jYWxFamIgIT0gbnVsbCkgeworICAgICAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoImxvY2FsRWpiIiwgbG9jYWxFamIsIG51bGwpOworICAgICAgICAgICAgbG9jYWxFamIuc2V0TmFtaW5nUmVzb3VyY2VzKG51bGwpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhbnkgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZlcmVuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBtZXNzYWdlIGRlc3RpbmF0aW9uIHJlc291cmNlIHJlZmVyZW5jZSB0byByZW1vdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVNZXNzYWdlRGVzdGluYXRpb25SZWYoU3RyaW5nIG5hbWUpIHsKKworICAgICAgICBlbnRyaWVzLnJlbW92ZShuYW1lKTsKKworICAgICAgICBNZXNzYWdlRGVzdGluYXRpb25SZWYgbWRyID0gbnVsbDsKKyAgICAgICAgc3luY2hyb25pemVkIChtZHJzKSB7CisgICAgICAgICAgICBtZHIgPSAoTWVzc2FnZURlc3RpbmF0aW9uUmVmKSBtZHJzLnJlbW92ZShuYW1lKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobWRyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHN1cHBvcnQuZmlyZVByb3BlcnR5Q2hhbmdlKCJtZXNzYWdlRGVzdGluYXRpb25SZWYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWRyLCBudWxsKTsKKyAgICAgICAgICAgIG1kci5zZXROYW1pbmdSZXNvdXJjZXMobnVsbCk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGEgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyIGZyb20gdGhpcyBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRvIHJlbW92ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgeworCisgICAgICAgIHN1cHBvcnQucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhbnkgcmVzb3VyY2UgcmVmZXJlbmNlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgcmVzb3VyY2UgcmVmZXJlbmNlIHRvIHJlbW92ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVJlc291cmNlKFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgZW50cmllcy5yZW1vdmUobmFtZSk7CisKKyAgICAgICAgQ29udGV4dFJlc291cmNlIHJlc291cmNlID0gbnVsbDsKKyAgICAgICAgc3luY2hyb25pemVkIChyZXNvdXJjZXMpIHsKKyAgICAgICAgICAgIHJlc291cmNlID0gKENvbnRleHRSZXNvdXJjZSkgcmVzb3VyY2VzLnJlbW92ZShuYW1lKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVzb3VyY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoInJlc291cmNlIiwgcmVzb3VyY2UsIG51bGwpOworICAgICAgICAgICAgcmVzb3VyY2Uuc2V0TmFtaW5nUmVzb3VyY2VzKG51bGwpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhbnkgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlIHRvIHJlbW92ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVJlc291cmNlRW52UmVmKFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgZW50cmllcy5yZW1vdmUobmFtZSk7CisKKyAgICAgICAgU3RyaW5nIHR5cGUgPSBudWxsOworICAgICAgICBzeW5jaHJvbml6ZWQgKHJlc291cmNlRW52UmVmcykgeworICAgICAgICAgICAgdHlwZSA9IChTdHJpbmcpIHJlc291cmNlRW52UmVmcy5yZW1vdmUobmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCkgeworICAgICAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoInJlc291cmNlRW52UmVmIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgKyAiOiIgKyB0eXBlLCBudWxsKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYW55IHJlc291cmNlIGxpbmsgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSByZXNvdXJjZSBsaW5rIHRvIHJlbW92ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVJlc291cmNlTGluayhTdHJpbmcgbmFtZSkgeworCisgICAgICAgIGVudHJpZXMucmVtb3ZlKG5hbWUpOworCisgICAgICAgIENvbnRleHRSZXNvdXJjZUxpbmsgcmVzb3VyY2VMaW5rID0gbnVsbDsKKyAgICAgICAgc3luY2hyb25pemVkIChyZXNvdXJjZUxpbmtzKSB7CisgICAgICAgICAgICByZXNvdXJjZUxpbmsgPSAoQ29udGV4dFJlc291cmNlTGluaykgcmVzb3VyY2VMaW5rcy5yZW1vdmUobmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlc291cmNlTGluayAhPSBudWxsKSB7CisgICAgICAgICAgICBzdXBwb3J0LmZpcmVQcm9wZXJ0eUNoYW5nZSgicmVzb3VyY2VMaW5rIiwgcmVzb3VyY2VMaW5rLCBudWxsKTsKKyAgICAgICAgICAgIHJlc291cmNlTGluay5zZXROYW1pbmdSZXNvdXJjZXMobnVsbCk7CisgICAgICAgIH0KKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvZGVwbG95L1Jlc291cmNlQmFzZS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2RlcGxveS9SZXNvdXJjZUJhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmVmN2E2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2RlcGxveS9SZXNvdXJjZUJhc2UuamF2YQpAQCAtMCwwICsxLDEzMiBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3k7CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CisKKworLyoqCisgKiBSZXByZXNlbnRhdGlvbiBvZiBhbiBDb250ZXh0IGVsZW1lbnQKKyAqCisgKiBAYXV0aG9yIFBldGVyIFJvc3NiYWNoIChwZXJvQGFwYWNoZS5vcmcpCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBSZXNvdXJjZUJhc2UgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoaXMgQ29udGV4dCBFbGVtZW50LgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisgICAgICAgIHJldHVybiAodGhpcy5kZXNjcmlwdGlvbik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7CisgICAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKKyAgICB9CisKKworCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2YgdGhpcyBjb250ZXh0IEVsZW1lbnQuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZSA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5uYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgRUpCIGJlYW4gaW1wbGVtZW50YXRpb24gY2xhc3MuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgdHlwZSA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiAodGhpcy50eXBlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKSB7CisgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBIb2xkZXIgZm9yIG91ciBjb25maWd1cmVkIHByb3BlcnRpZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBIYXNoTWFwIHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcCgpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgY29uZmlndXJlZCBwcm9wZXJ0eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHJldHVybiBwcm9wZXJ0aWVzLmdldChuYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgYSBjb25maWd1cmVkIHByb3BlcnR5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgcHJvcGVydGllcy5wdXQobmFtZSwgdmFsdWUpOworICAgIH0KKworICAgIC8qKiAKKyAgICAgKiByZW1vdmUgYSBjb25maWd1cmVkIHByb3BlcnR5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHByb3BlcnRpZXMucmVtb3ZlKG5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIExpc3QgcHJvcGVydGllcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgSXRlcmF0b3IgbGlzdFByb3BlcnRpZXMoKSB7CisgICAgICAgIHJldHVybiBwcm9wZXJ0aWVzLmtleVNldCgpLml0ZXJhdG9yKCk7CisgICAgfQorICAgIAorICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBhY2thZ2UgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgTmFtaW5nUmVzb3VyY2VzIHdpdGggd2hpY2ggd2UgYXJlIGFzc29jaWF0ZWQgKGlmIGFueSkuCisgICAgICovCisgICAgcHJvdGVjdGVkIE5hbWluZ1Jlc291cmNlcyByZXNvdXJjZXMgPSBudWxsOworCisgICAgcHVibGljIE5hbWluZ1Jlc291cmNlcyBnZXROYW1pbmdSZXNvdXJjZXMoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5yZXNvdXJjZXMpOworICAgIH0KKworICAgIHZvaWQgc2V0TmFtaW5nUmVzb3VyY2VzKE5hbWluZ1Jlc291cmNlcyByZXNvdXJjZXMpIHsKKyAgICAgICAgdGhpcy5yZXNvdXJjZXMgPSByZXNvdXJjZXM7CisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9kZXBsb3kvU2VjdXJpdHlDb2xsZWN0aW9uLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvZGVwbG95L1NlY3VyaXR5Q29sbGVjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwMTMyNjYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvZGVwbG95L1NlY3VyaXR5Q29sbGVjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzI5IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveTsKKworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLlJlcXVlc3RVdGlsOworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworCisKKy8qKgorICogUmVwcmVzZW50YXRpb24gb2YgYSB3ZWIgcmVzb3VyY2UgY29sbGVjdGlvbiBmb3IgYSB3ZWIgYXBwbGljYXRpb24ncyBzZWN1cml0eQorICogY29uc3RyYWludCwgYXMgcmVwcmVzZW50ZWQgaW4gYSA8Y29kZT4mbHQ7d2ViLXJlc291cmNlLWNvbGxlY3Rpb24mZ3Q7PC9jb2RlPgorICogZWxlbWVudCBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLgorICogPHA+CisgKiA8Yj5XQVJOSU5HPC9iPjogIEl0IGlzIGFzc3VtZWQgdGhhdCBpbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyB3aWxsIGJlIGNyZWF0ZWQKKyAqIGFuZCBtb2RpZmllZCBvbmx5IHdpdGhpbiB0aGUgY29udGV4dCBvZiBhIHNpbmdsZSB0aHJlYWQsIGJlZm9yZSB0aGUgaW5zdGFuY2UKKyAqIGlzIG1hZGUgdmlzaWJsZSB0byB0aGUgcmVtYWluZGVyIG9mIHRoZSBhcHBsaWNhdGlvbi4gIEFmdGVyIHRoYXQsIG9ubHkgcmVhZAorICogYWNjZXNzIGlzIGV4cGVjdGVkLiAgVGhlcmVmb3JlLCBub25lIG9mIHRoZSByZWFkIGFuZCB3cml0ZSBhY2Nlc3Mgd2l0aGluCisgKiB0aGlzIGNsYXNzIGlzIHN5bmNocm9uaXplZC4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIFNlY3VyaXR5Q29sbGVjdGlvbiBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgc2VjdXJpdHkgY29sbGVjdGlvbiBpbnN0YW5jZSB3aXRoIGRlZmF1bHQgdmFsdWVzLgorICAgICAqLworICAgIHB1YmxpYyBTZWN1cml0eUNvbGxlY3Rpb24oKSB7CisKKyAgICAgICAgdGhpcyhudWxsLCBudWxsKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IHNlY3VyaXR5IGNvbGxlY3Rpb24gaW5zdGFuY2Ugd2l0aCBzcGVjaWZpZWQgdmFsdWVzLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGlzIHNlY3VyaXR5IGNvbGxlY3Rpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgU2VjdXJpdHlDb2xsZWN0aW9uKFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgdGhpcyhuYW1lLCBudWxsKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IHNlY3VyaXR5IGNvbGxlY3Rpb24gaW5zdGFuY2Ugd2l0aCBzcGVjaWZpZWQgdmFsdWVzLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGlzIHNlY3VyaXR5IGNvbGxlY3Rpb24KKyAgICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gRGVzY3JpcHRpb24gb2YgdGhpcyBzZWN1cml0eSBjb2xsZWN0aW9uCisgICAgICovCisgICAgcHVibGljIFNlY3VyaXR5Q29sbGVjdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7CisKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgc2V0TmFtZShuYW1lKTsKKyAgICAgICAgc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24pOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogRGVzY3JpcHRpb24gb2YgdGhpcyB3ZWIgcmVzb3VyY2UgY29sbGVjdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbiA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBIVFRQIG1ldGhvZHMgY292ZXJlZCBieSB0aGlzIHdlYiByZXNvdXJjZSBjb2xsZWN0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIG1ldGhvZHNbXSA9IG5ldyBTdHJpbmdbMF07CisKKworICAgIC8qKgorICAgICAqIFRoZSBuYW1lIG9mIHRoaXMgd2ViIHJlc291cmNlIGNvbGxlY3Rpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZSA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBVUkwgcGF0dGVybnMgcHJvdGVjdGVkIGJ5IHRoaXMgc2VjdXJpdHkgY29sbGVjdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBwYXR0ZXJuc1tdID0gbmV3IFN0cmluZ1swXTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZGVzY3JpcHRpb24gb2YgdGhpcyB3ZWIgcmVzb3VyY2UgY29sbGVjdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5kZXNjcmlwdGlvbik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZGVzY3JpcHRpb24gb2YgdGhpcyB3ZWIgcmVzb3VyY2UgY29sbGVjdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZXNjcmlwdGlvbiBUaGUgbmV3IGRlc2NyaXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7CisKKyAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyB3ZWIgcmVzb3VyY2UgY29sbGVjdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLm5hbWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG5hbWUgb2YgdGhpcyB3ZWIgcmVzb3VyY2UgY29sbGVjdGlvbgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgVGhlIG5ldyBuYW1lCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworCisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBBZGQgYW4gSFRUUCByZXF1ZXN0IG1ldGhvZCB0byBiZSBwYXJ0IG9mIHRoaXMgd2ViIHJlc291cmNlIGNvbGxlY3Rpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkTWV0aG9kKFN0cmluZyBtZXRob2QpIHsKKworICAgICAgICBpZiAobWV0aG9kID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIFN0cmluZyByZXN1bHRzW10gPSBuZXcgU3RyaW5nW21ldGhvZHMubGVuZ3RoICsgMV07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIHJlc3VsdHNbaV0gPSBtZXRob2RzW2ldOworICAgICAgICByZXN1bHRzW21ldGhvZHMubGVuZ3RoXSA9IG1ldGhvZDsKKyAgICAgICAgbWV0aG9kcyA9IHJlc3VsdHM7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEFkZCBhIFVSTCBwYXR0ZXJuIHRvIGJlIHBhcnQgb2YgdGhpcyB3ZWIgcmVzb3VyY2UgY29sbGVjdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRQYXR0ZXJuKFN0cmluZyBwYXR0ZXJuKSB7CisKKyAgICAgICAgaWYgKHBhdHRlcm4gPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgcGF0dGVybiA9IFJlcXVlc3RVdGlsLlVSTERlY29kZShwYXR0ZXJuKTsKKyAgICAgICAgU3RyaW5nIHJlc3VsdHNbXSA9IG5ldyBTdHJpbmdbcGF0dGVybnMubGVuZ3RoICsgMV07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGF0dGVybnMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICByZXN1bHRzW2ldID0gcGF0dGVybnNbaV07CisgICAgICAgIHJlc3VsdHNbcGF0dGVybnMubGVuZ3RoXSA9IHBhdHRlcm47CisgICAgICAgIHBhdHRlcm5zID0gcmVzdWx0czsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgSFRUUCByZXF1ZXN0IG1ldGhvZCBpcworICAgICAqIHBhcnQgb2YgdGhpcyB3ZWIgcmVzb3VyY2UgY29sbGVjdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXRob2QgUmVxdWVzdCBtZXRob2QgdG8gY2hlY2sKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBmaW5kTWV0aG9kKFN0cmluZyBtZXRob2QpIHsKKworICAgICAgICBpZiAobWV0aG9kcy5sZW5ndGggPT0gMCkKKyAgICAgICAgICAgIHJldHVybiAodHJ1ZSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKG1ldGhvZHNbaV0uZXF1YWxzKG1ldGhvZCkpCisgICAgICAgICAgICAgICAgcmV0dXJuICh0cnVlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKGZhbHNlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXQgb2YgSFRUUCByZXF1ZXN0IG1ldGhvZHMgdGhhdCBhcmUgcGFydCBvZiB0aGlzIHdlYgorICAgICAqIHJlc291cmNlIGNvbGxlY3Rpb24sIG9yIGEgemVyby1sZW5ndGggYXJyYXkgaWYgYWxsIHJlcXVlc3QgbWV0aG9kcworICAgICAqIGFyZSBpbmNsdWRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZmluZE1ldGhvZHMoKSB7CisKKyAgICAgICAgcmV0dXJuIChtZXRob2RzKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogSXMgdGhlIHNwZWNpZmllZCBwYXR0ZXJuIHBhcnQgb2YgdGhpcyB3ZWIgcmVzb3VyY2UgY29sbGVjdGlvbj8KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXR0ZXJuIFBhdHRlcm4gdG8gYmUgY29tcGFyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBmaW5kUGF0dGVybihTdHJpbmcgcGF0dGVybikgeworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGF0dGVybnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChwYXR0ZXJuc1tpXS5lcXVhbHMocGF0dGVybikpCisgICAgICAgICAgICAgICAgcmV0dXJuICh0cnVlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKGZhbHNlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXQgb2YgVVJMIHBhdHRlcm5zIHRoYXQgYXJlIHBhcnQgb2YgdGhpcyB3ZWIgcmVzb3VyY2UKKyAgICAgKiBjb2xsZWN0aW9uLiAgSWYgbm9uZSBoYXZlIGJlZW4gc3BlY2lmaWVkLCBhIHplcm8tbGVuZ3RoIGFycmF5IGlzCisgICAgICogcmV0dXJuZWQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGZpbmRQYXR0ZXJucygpIHsKKworICAgICAgICByZXR1cm4gKHBhdHRlcm5zKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgSFRUUCByZXF1ZXN0IG1ldGhvZCBmcm9tIHRob3NlIHRoYXQgYXJlIHBhcnQKKyAgICAgKiBvZiB0aGlzIHdlYiByZXNvdXJjZSBjb2xsZWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIG1ldGhvZCBSZXF1ZXN0IG1ldGhvZCB0byBiZSByZW1vdmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlTWV0aG9kKFN0cmluZyBtZXRob2QpIHsKKworICAgICAgICBpZiAobWV0aG9kID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGludCBuID0gLTE7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKG1ldGhvZHNbaV0uZXF1YWxzKG1ldGhvZCkpIHsKKyAgICAgICAgICAgICAgICBuID0gaTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobiA+PSAwKSB7CisgICAgICAgICAgICBpbnQgaiA9IDA7CisgICAgICAgICAgICBTdHJpbmcgcmVzdWx0c1tdID0gbmV3IFN0cmluZ1ttZXRob2RzLmxlbmd0aCAtIDFdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGkgIT0gbikKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0c1tqKytdID0gbWV0aG9kc1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1ldGhvZHMgPSByZXN1bHRzOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIFVSTCBwYXR0ZXJuIGZyb20gdGhvc2UgdGhhdCBhcmUgcGFydCBvZiB0aGlzCisgICAgICogd2ViIHJlc291cmNlIGNvbGxlY3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0dGVybiBQYXR0ZXJuIHRvIGJlIHJlbW92ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVQYXR0ZXJuKFN0cmluZyBwYXR0ZXJuKSB7CisKKyAgICAgICAgaWYgKHBhdHRlcm4gPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaW50IG4gPSAtMTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXR0ZXJucy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKHBhdHRlcm5zW2ldLmVxdWFscyhwYXR0ZXJuKSkgeworICAgICAgICAgICAgICAgIG4gPSBpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChuID49IDApIHsKKyAgICAgICAgICAgIGludCBqID0gMDsKKyAgICAgICAgICAgIFN0cmluZyByZXN1bHRzW10gPSBuZXcgU3RyaW5nW3BhdHRlcm5zLmxlbmd0aCAtIDFdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXR0ZXJucy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChpICE9IG4pCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdHNbaisrXSA9IHBhdHRlcm5zW2ldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGF0dGVybnMgPSByZXN1bHRzOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHNlY3VyaXR5IGNvbGxlY3Rpb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCJTZWN1cml0eUNvbGxlY3Rpb25bIik7CisgICAgICAgIHNiLmFwcGVuZChuYW1lKTsKKyAgICAgICAgaWYgKGRlc2NyaXB0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChkZXNjcmlwdGlvbik7CisgICAgICAgIH0KKyAgICAgICAgc2IuYXBwZW5kKCJdIik7CisgICAgICAgIHJldHVybiAoc2IudG9TdHJpbmcoKSk7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2RlcGxveS9TZWN1cml0eUNvbnN0cmFpbnQuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9kZXBsb3kvU2VjdXJpdHlDb25zdHJhaW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM5OTJmMAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9kZXBsb3kvU2VjdXJpdHlDb25zdHJhaW50LmphdmEKQEAgLTAsMCArMSw0NTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95OworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CisKKworLyoqCisgKiBSZXByZXNlbnRhdGlvbiBvZiBhIHNlY3VyaXR5IGNvbnN0cmFpbnQgZWxlbWVudCBmb3IgYSB3ZWIgYXBwbGljYXRpb24sCisgKiBhcyByZXByZXNlbnRlZCBpbiBhIDxjb2RlPiZsdDtzZWN1cml0eS1jb25zdHJhaW50Jmd0OzwvY29kZT4gZWxlbWVudCBpbiB0aGUKKyAqIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KKyAqIDxwPgorICogPGI+V0FSTklORzwvYj46ICBJdCBpcyBhc3N1bWVkIHRoYXQgaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3Mgd2lsbCBiZSBjcmVhdGVkCisgKiBhbmQgbW9kaWZpZWQgb25seSB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYSBzaW5nbGUgdGhyZWFkLCBiZWZvcmUgdGhlIGluc3RhbmNlCisgKiBpcyBtYWRlIHZpc2libGUgdG8gdGhlIHJlbWFpbmRlciBvZiB0aGUgYXBwbGljYXRpb24uICBBZnRlciB0aGF0LCBvbmx5IHJlYWQKKyAqIGFjY2VzcyBpcyBleHBlY3RlZC4gIFRoZXJlZm9yZSwgbm9uZSBvZiB0aGUgcmVhZCBhbmQgd3JpdGUgYWNjZXNzIHdpdGhpbgorICogdGhpcyBjbGFzcyBpcyBzeW5jaHJvbml6ZWQuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBTZWN1cml0eUNvbnN0cmFpbnQgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IHNlY3VyaXR5IGNvbnN0cmFpbnQgaW5zdGFuY2Ugd2l0aCBkZWZhdWx0IHZhbHVlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2VjdXJpdHlDb25zdHJhaW50KCkgeworCisgICAgICAgIHN1cGVyKCk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBXYXMgdGhlICJhbGwgcm9sZXMiIHdpbGRjYXJkIGluY2x1ZGVkIGluIHRoZSBhdXRob3JpemF0aW9uIGNvbnN0cmFpbnRzCisgICAgICogZm9yIHRoaXMgc2VjdXJpdHkgY29uc3RyYWludD8KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gYWxsUm9sZXMgPSBmYWxzZTsKKworCisgICAgLyoqCisgICAgICogV2FzIGFuIGF1dGhvcml6YXRpb24gY29uc3RyYWludCBpbmNsdWRlZCBpbiB0aGlzIHNlY3VyaXR5IGNvbnN0cmFpbnQ/CisgICAgICogVGhpcyBpcyBuZWNlc3NhcnkgdG8gZGlzdGluZ3Vpc2ggdGhlIGNhc2Ugd2hlcmUgYW4gYXV0aC1jb25zdHJhaW50IHdpdGgKKyAgICAgKiBubyByb2xlcyAoc2lnbmlmeWluZyBubyBkaXJlY3QgYWNjZXNzIGF0IGFsbCkgd2FzIHJlcXVlc3RlZCwgdmVyc3VzCisgICAgICogYSBsYWNrIG9mIGF1dGgtY29uc3RyYWludCB3aGljaCBpbXBsaWVzIG5vIGFjY2VzcyBjb250cm9sIGNoZWNraW5nLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBhdXRoQ29uc3RyYWludCA9IGZhbHNlOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc2V0IG9mIHJvbGVzIHBlcm1pdHRlZCB0byBhY2Nlc3MgcmVzb3VyY2VzIHByb3RlY3RlZCBieSB0aGlzCisgICAgICogc2VjdXJpdHkgY29uc3RyYWludC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBhdXRoUm9sZXNbXSA9IG5ldyBTdHJpbmdbMF07CisKKworICAgIC8qKgorICAgICAqIFRoZSBzZXQgb2Ygd2ViIHJlc291cmNlIGNvbGxlY3Rpb25zIHByb3RlY3RlZCBieSB0aGlzIHNlY3VyaXR5CisgICAgICogY29uc3RyYWludC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFNlY3VyaXR5Q29sbGVjdGlvbiBjb2xsZWN0aW9uc1tdID0gbmV3IFNlY3VyaXR5Q29sbGVjdGlvblswXTsKKworCisgICAgLyoqCisgICAgICogVGhlIGRpc3BsYXkgbmFtZSBvZiB0aGlzIHNlY3VyaXR5IGNvbnN0cmFpbnQuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZGlzcGxheU5hbWUgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgdXNlciBkYXRhIGNvbnN0cmFpbnQgZm9yIHRoaXMgc2VjdXJpdHkgY29uc3RyYWludC4gIE11c3QgYmUgTk9ORSwKKyAgICAgKiBJTlRFR1JBTCwgb3IgQ09ORklERU5USUFMLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHVzZXJDb25zdHJhaW50ID0gIk5PTkUiOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogV2FzIHRoZSAiYWxsIHJvbGVzIiB3aWxkY2FyZCBpbmNsdWRlZCBpbiB0aGlzIGF1dGhlbnRpY2F0aW9uCisgICAgICogY29uc3RyYWludD8KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRBbGxSb2xlcygpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMuYWxsUm9sZXMpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGF1dGhvcml6YXRpb24gY29uc3RyYWludCBwcmVzZW50IGZsYWcgZm9yIHRoaXMgc2VjdXJpdHkKKyAgICAgKiBjb25zdHJhaW50LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldEF1dGhDb25zdHJhaW50KCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5hdXRoQ29uc3RyYWludCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYXV0aG9yaXphdGlvbiBjb25zdHJhaW50IHByZXNlbnQgZmxhZyBmb3IgdGhpcyBzZWN1cml0eQorICAgICAqIGNvbnN0cmFpbnQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QXV0aENvbnN0cmFpbnQoYm9vbGVhbiBhdXRoQ29uc3RyYWludCkgeworCisgICAgICAgIHRoaXMuYXV0aENvbnN0cmFpbnQgPSBhdXRoQ29uc3RyYWludDsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBkaXNwbGF5IG5hbWUgb2YgdGhpcyBzZWN1cml0eSBjb25zdHJhaW50LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLmRpc3BsYXlOYW1lKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBkaXNwbGF5IG5hbWUgb2YgdGhpcyBzZWN1cml0eSBjb25zdHJhaW50LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERpc3BsYXlOYW1lKFN0cmluZyBkaXNwbGF5TmFtZSkgeworCisgICAgICAgIHRoaXMuZGlzcGxheU5hbWUgPSBkaXNwbGF5TmFtZTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB1c2VyIGRhdGEgY29uc3RyYWludCBmb3IgdGhpcyBzZWN1cml0eSBjb25zdHJhaW50LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXNlckNvbnN0cmFpbnQoKSB7CisKKyAgICAgICAgcmV0dXJuICh1c2VyQ29uc3RyYWludCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdXNlciBkYXRhIGNvbnN0cmFpbnQgZm9yIHRoaXMgc2VjdXJpdHkgY29uc3RyYWludC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1c2VyQ29uc3RyYWludCBUaGUgbmV3IHVzZXIgZGF0YSBjb25zdHJhaW50CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VXNlckNvbnN0cmFpbnQoU3RyaW5nIHVzZXJDb25zdHJhaW50KSB7CisKKyAgICAgICAgaWYgKHVzZXJDb25zdHJhaW50ICE9IG51bGwpCisgICAgICAgICAgICB0aGlzLnVzZXJDb25zdHJhaW50ID0gdXNlckNvbnN0cmFpbnQ7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBBZGQgYW4gYXV0aG9yaXphdGlvbiByb2xlLCB3aGljaCBpcyBhIHJvbGUgbmFtZSB0aGF0IHdpbGwgYmUKKyAgICAgKiBwZXJtaXR0ZWQgYWNjZXNzIHRvIHRoZSByZXNvdXJjZXMgcHJvdGVjdGVkIGJ5IHRoaXMgc2VjdXJpdHkgY29uc3RyYWludC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhdXRoUm9sZSBSb2xlIG5hbWUgdG8gYmUgYWRkZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRBdXRoUm9sZShTdHJpbmcgYXV0aFJvbGUpIHsKKworICAgICAgICBpZiAoYXV0aFJvbGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKCIqIi5lcXVhbHMoYXV0aFJvbGUpKSB7CisgICAgICAgICAgICBhbGxSb2xlcyA9IHRydWU7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIHJlc3VsdHNbXSA9IG5ldyBTdHJpbmdbYXV0aFJvbGVzLmxlbmd0aCArIDFdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF1dGhSb2xlcy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIHJlc3VsdHNbaV0gPSBhdXRoUm9sZXNbaV07CisgICAgICAgIHJlc3VsdHNbYXV0aFJvbGVzLmxlbmd0aF0gPSBhdXRoUm9sZTsKKyAgICAgICAgYXV0aFJvbGVzID0gcmVzdWx0czsKKyAgICAgICAgYXV0aENvbnN0cmFpbnQgPSB0cnVlOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBuZXcgd2ViIHJlc291cmNlIGNvbGxlY3Rpb24gdG8gdGhvc2UgcHJvdGVjdGVkIGJ5IHRoaXMKKyAgICAgKiBzZWN1cml0eSBjb25zdHJhaW50LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbGxlY3Rpb24gVGhlIG5ldyB3ZWIgcmVzb3VyY2UgY29sbGVjdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZENvbGxlY3Rpb24oU2VjdXJpdHlDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKKworICAgICAgICBpZiAoY29sbGVjdGlvbiA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBTZWN1cml0eUNvbGxlY3Rpb24gcmVzdWx0c1tdID0KKyAgICAgICAgICAgIG5ldyBTZWN1cml0eUNvbGxlY3Rpb25bY29sbGVjdGlvbnMubGVuZ3RoICsgMV07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29sbGVjdGlvbnMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICByZXN1bHRzW2ldID0gY29sbGVjdGlvbnNbaV07CisgICAgICAgIHJlc3VsdHNbY29sbGVjdGlvbnMubGVuZ3RoXSA9IGNvbGxlY3Rpb247CisgICAgICAgIGNvbGxlY3Rpb25zID0gcmVzdWx0czsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgcm9sZSBpcyBwZXJtaXR0ZWQgYWNjZXNzIHRvCisgICAgICogdGhlIHJlc291cmNlcyBwcm90ZWN0ZWQgYnkgdGhpcyBzZWN1cml0eSBjb25zdHJhaW50LgorICAgICAqCisgICAgICogQHBhcmFtIHJvbGUgUm9sZSBuYW1lIHRvIGJlIGNoZWNrZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBmaW5kQXV0aFJvbGUoU3RyaW5nIHJvbGUpIHsKKworICAgICAgICBpZiAocm9sZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChmYWxzZSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXV0aFJvbGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAocm9sZS5lcXVhbHMoYXV0aFJvbGVzW2ldKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKHRydWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoZmFsc2UpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNldCBvZiByb2xlcyB0aGF0IGFyZSBwZXJtaXR0ZWQgYWNjZXNzIHRvIHRoZSByZXNvdXJjZXMKKyAgICAgKiBwcm90ZWN0ZWQgYnkgdGhpcyBzZWN1cml0eSBjb25zdHJhaW50LiAgSWYgbm9uZSBoYXZlIGJlZW4gZGVmaW5lZCwKKyAgICAgKiBhIHplcm8tbGVuZ3RoIGFycmF5IGlzIHJldHVybmVkICh3aGljaCBpbXBsaWVzIHRoYXQgYWxsIGF1dGhlbnRpY2F0ZWQKKyAgICAgKiB1c2VycyBhcmUgcGVybWl0dGVkIGFjY2VzcykuCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGZpbmRBdXRoUm9sZXMoKSB7CisKKyAgICAgICAgcmV0dXJuIChhdXRoUm9sZXMpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHdlYiByZXNvdXJjZSBjb2xsZWN0aW9uIGZvciB0aGUgc3BlY2lmaWVkIG5hbWUsIGlmIGFueTsKKyAgICAgKiBvdGhlcndpc2UsIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIFdlYiByZXNvdXJjZSBjb2xsZWN0aW9uIG5hbWUgdG8gcmV0dXJuCisgICAgICovCisgICAgcHVibGljIFNlY3VyaXR5Q29sbGVjdGlvbiBmaW5kQ29sbGVjdGlvbihTdHJpbmcgbmFtZSkgeworCisgICAgICAgIGlmIChuYW1lID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbGxlY3Rpb25zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMoY29sbGVjdGlvbnNbaV0uZ2V0TmFtZSgpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKGNvbGxlY3Rpb25zW2ldKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKG51bGwpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYWxsIG9mIHRoZSB3ZWIgcmVzb3VyY2UgY29sbGVjdGlvbnMgcHJvdGVjdGVkIGJ5IHRoaXMKKyAgICAgKiBzZWN1cml0eSBjb25zdHJhaW50LiAgSWYgdGhlcmUgYXJlIG5vbmUsIGEgemVyby1sZW5ndGggYXJyYXkgaXMKKyAgICAgKiByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2VjdXJpdHlDb2xsZWN0aW9uW10gZmluZENvbGxlY3Rpb25zKCkgeworCisgICAgICAgIHJldHVybiAoY29sbGVjdGlvbnMpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCBjb250ZXh0LXJlbGF0aXZlIFVSSSAoYW5kCisgICAgICogYXNzb2NpYXRlZCBIVFRQIG1ldGhvZCkgYXJlIHByb3RlY3RlZCBieSB0aGlzIHNlY3VyaXR5IGNvbnN0cmFpbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJpIENvbnRleHQtcmVsYXRpdmUgVVJJIHRvIGNoZWNrCisgICAgICogQHBhcmFtIG1ldGhvZCBSZXF1ZXN0IG1ldGhvZCBiZWluZyB1c2VkCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaW5jbHVkZWQoU3RyaW5nIHVyaSwgU3RyaW5nIG1ldGhvZCkgeworCisgICAgICAgIC8vIFdlIGNhbm5vdCBtYXRjaCB3aXRob3V0IGEgdmFsaWQgcmVxdWVzdCBtZXRob2QKKyAgICAgICAgaWYgKG1ldGhvZCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChmYWxzZSk7CisKKyAgICAgICAgLy8gQ2hlY2sgYWxsIG9mIHRoZSBjb2xsZWN0aW9ucyBpbmNsdWRlZCBpbiB0aGlzIGNvbnN0cmFpbnQKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2xsZWN0aW9ucy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKCFjb2xsZWN0aW9uc1tpXS5maW5kTWV0aG9kKG1ldGhvZCkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBTdHJpbmcgcGF0dGVybnNbXSA9IGNvbGxlY3Rpb25zW2ldLmZpbmRQYXR0ZXJucygpOworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBwYXR0ZXJucy5sZW5ndGg7IGorKykgeworICAgICAgICAgICAgICAgIGlmIChtYXRjaFBhdHRlcm4odXJpLCBwYXR0ZXJuc1tqXSkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAodHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBObyBjb2xsZWN0aW9uIGluY2x1ZGVkIGluIHRoaXMgY29uc3RyYWludCBtYXRjaGVzIHRoaXMgcmVxdWVzdAorICAgICAgICByZXR1cm4gKGZhbHNlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgcm9sZSBmcm9tIHRoZSBzZXQgb2Ygcm9sZXMgcGVybWl0dGVkIHRvIGFjY2VzcworICAgICAqIHRoZSByZXNvdXJjZXMgcHJvdGVjdGVkIGJ5IHRoaXMgc2VjdXJpdHkgY29uc3RyYWludC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhdXRoUm9sZSBSb2xlIG5hbWUgdG8gYmUgcmVtb3ZlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUF1dGhSb2xlKFN0cmluZyBhdXRoUm9sZSkgeworCisgICAgICAgIGlmIChhdXRoUm9sZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBpbnQgbiA9IC0xOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF1dGhSb2xlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKGF1dGhSb2xlc1tpXS5lcXVhbHMoYXV0aFJvbGUpKSB7CisgICAgICAgICAgICAgICAgbiA9IGk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4gPj0gMCkgeworICAgICAgICAgICAgaW50IGogPSAwOworICAgICAgICAgICAgU3RyaW5nIHJlc3VsdHNbXSA9IG5ldyBTdHJpbmdbYXV0aFJvbGVzLmxlbmd0aCAtIDFdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdXRoUm9sZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoaSAhPSBuKQorICAgICAgICAgICAgICAgICAgICByZXN1bHRzW2orK10gPSBhdXRoUm9sZXNbaV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdXRoUm9sZXMgPSByZXN1bHRzOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIHdlYiByZXNvdXJjZSBjb2xsZWN0aW9uIGZyb20gdGhvc2UgcHJvdGVjdGVkIGJ5CisgICAgICogdGhpcyBzZWN1cml0eSBjb25zdHJhaW50LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbGxlY3Rpb24gV2ViIHJlc291cmNlIGNvbGxlY3Rpb24gdG8gYmUgcmVtb3ZlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUNvbGxlY3Rpb24oU2VjdXJpdHlDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKKworICAgICAgICBpZiAoY29sbGVjdGlvbiA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBpbnQgbiA9IC0xOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbGxlY3Rpb25zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoY29sbGVjdGlvbnNbaV0uZXF1YWxzKGNvbGxlY3Rpb24pKSB7CisgICAgICAgICAgICAgICAgbiA9IGk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4gPj0gMCkgeworICAgICAgICAgICAgaW50IGogPSAwOworICAgICAgICAgICAgU2VjdXJpdHlDb2xsZWN0aW9uIHJlc3VsdHNbXSA9CisgICAgICAgICAgICAgICAgbmV3IFNlY3VyaXR5Q29sbGVjdGlvbltjb2xsZWN0aW9ucy5sZW5ndGggLSAxXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29sbGVjdGlvbnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoaSAhPSBuKQorICAgICAgICAgICAgICAgICAgICByZXN1bHRzW2orK10gPSBjb2xsZWN0aW9uc1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbGxlY3Rpb25zID0gcmVzdWx0czsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBzZWN1cml0eSBjb25zdHJhaW50LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiU2VjdXJpdHlDb25zdHJhaW50WyIpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbGxlY3Rpb25zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoaSA+IDApCisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIsICIpOworICAgICAgICAgICAgc2IuYXBwZW5kKGNvbGxlY3Rpb25zW2ldLmdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgc2IuYXBwZW5kKCJdIik7CisgICAgICAgIHJldHVybiAoc2IudG9TdHJpbmcoKSk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByaXZhdGUgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBEb2VzIHRoZSBzcGVjaWZpZWQgcmVxdWVzdCBwYXRoIG1hdGNoIHRoZSBzcGVjaWZpZWQgVVJMIHBhdHRlcm4/CisgICAgICogVGhpcyBtZXRob2QgZm9sbG93cyB0aGUgc2FtZSBydWxlcyAoaW4gdGhlIHNhbWUgb3JkZXIpIGFzIHRob3NlIHVzZWQKKyAgICAgKiBmb3IgbWFwcGluZyByZXF1ZXN0cyB0byBzZXJ2bGV0cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXRoIENvbnRleHQtcmVsYXRpdmUgcmVxdWVzdCBwYXRoIHRvIGJlIGNoZWNrZWQKKyAgICAgKiAgKG11c3Qgc3RhcnQgd2l0aCAnLycpCisgICAgICogQHBhcmFtIHBhdHRlcm4gVVJMIHBhdHRlcm4gdG8gYmUgY29tcGFyZWQgYWdhaW5zdAorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBtYXRjaFBhdHRlcm4oU3RyaW5nIHBhdGgsIFN0cmluZyBwYXR0ZXJuKSB7CisKKyAgICAgICAgLy8gTm9ybWFsaXplIHRoZSBhcmd1bWVudCBzdHJpbmdzCisgICAgICAgIGlmICgocGF0aCA9PSBudWxsKSB8fCAocGF0aC5sZW5ndGgoKSA9PSAwKSkKKyAgICAgICAgICAgIHBhdGggPSAiLyI7CisgICAgICAgIGlmICgocGF0dGVybiA9PSBudWxsKSB8fCAocGF0dGVybi5sZW5ndGgoKSA9PSAwKSkKKyAgICAgICAgICAgIHBhdHRlcm4gPSAiLyI7CisKKyAgICAgICAgLy8gQ2hlY2sgZm9yIGV4YWN0IG1hdGNoCisgICAgICAgIGlmIChwYXRoLmVxdWFscyhwYXR0ZXJuKSkKKyAgICAgICAgICAgIHJldHVybiAodHJ1ZSk7CisKKyAgICAgICAgLy8gQ2hlY2sgZm9yIHBhdGggcHJlZml4IG1hdGNoaW5nCisgICAgICAgIGlmIChwYXR0ZXJuLnN0YXJ0c1dpdGgoIi8iKSAmJiBwYXR0ZXJuLmVuZHNXaXRoKCIvKiIpKSB7CisgICAgICAgICAgICBwYXR0ZXJuID0gcGF0dGVybi5zdWJzdHJpbmcoMCwgcGF0dGVybi5sZW5ndGgoKSAtIDIpOworICAgICAgICAgICAgaWYgKHBhdHRlcm4ubGVuZ3RoKCkgPT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gKHRydWUpOyAgLy8gIi8qIiBpcyB0aGUgc2FtZSBhcyAiLyIKKyAgICAgICAgICAgIGlmIChwYXRoLmVuZHNXaXRoKCIvIikpCisgICAgICAgICAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKDAsIHBhdGgubGVuZ3RoKCkgLSAxKTsKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgICAgaWYgKHBhdHRlcm4uZXF1YWxzKHBhdGgpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHRydWUpOworICAgICAgICAgICAgICAgIGludCBzbGFzaCA9IHBhdGgubGFzdEluZGV4T2YoJy8nKTsKKyAgICAgICAgICAgICAgICBpZiAoc2xhc2ggPD0gMCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKDAsIHNsYXNoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAoZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2hlY2sgZm9yIHN1ZmZpeCBtYXRjaGluZworICAgICAgICBpZiAocGF0dGVybi5zdGFydHNXaXRoKCIqLiIpKSB7CisgICAgICAgICAgICBpbnQgc2xhc2ggPSBwYXRoLmxhc3RJbmRleE9mKCcvJyk7CisgICAgICAgICAgICBpbnQgcGVyaW9kID0gcGF0aC5sYXN0SW5kZXhPZignLicpOworICAgICAgICAgICAgaWYgKChzbGFzaCA+PSAwKSAmJiAocGVyaW9kID4gc2xhc2gpICYmCisgICAgICAgICAgICAgICAgcGF0aC5lbmRzV2l0aChwYXR0ZXJuLnN1YnN0cmluZygxKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIChmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBDaGVjayBmb3IgdW5pdmVyc2FsIG1hcHBpbmcKKyAgICAgICAgaWYgKHBhdHRlcm4uZXF1YWxzKCIvIikpCisgICAgICAgICAgICByZXR1cm4gKHRydWUpOworCisgICAgICAgIHJldHVybiAoZmFsc2UpOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9kZXBsb3kvbWJlYW5zLWRlc2NyaXB0b3JzLnhtbCBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9kZXBsb3kvbWJlYW5zLWRlc2NyaXB0b3JzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGMxM2IyCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2RlcGxveS9tYmVhbnMtZGVzY3JpcHRvcnMueG1sCkBAIC0wLDAgKzEsMTg1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzxtYmVhbnMtZGVzY3JpcHRvcnM+CisKKyAgPG1iZWFuIG5hbWU9IkNvbnRleHRFbnZpcm9ubWVudCIKKyAgICAgICAgIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5tYmVhbnMuQ29udGV4dEVudmlyb25tZW50TUJlYW4iCisgICAgICAgICBkZXNjcmlwdGlvbj0iUmVwcmVzZW50YXRpb24gb2YgYW4gYXBwbGljYXRpb24gZW52aXJvbm1lbnQgZW50cnkiCisgICAgICAgICBkb21haW49IkNhdGFsaW5hIgorICAgICAgICAgZ3JvdXA9IlJlc291cmNlcyIKKyAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkNvbnRleHRFbnZpcm9ubWVudCI+CisgICAgCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc05hbWUiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iRnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIG1hbmFnZWQgb2JqZWN0IgorICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKyAgICAgIAorICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVzY3JpcHRpb24iCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIGRlc2NyaXB0aW9uIG9mIHRoaXMgZW52aXJvbm1lbnQgZW50cnkiCisgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIG5hbWUgb2YgdGhpcyBlbnZpcm9ubWVudCBlbnRyeSIKKyAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICAgIAorICAgIDxhdHRyaWJ1dGUgbmFtZT0ib3ZlcnJpZGUiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iRG9lcyB0aGlzIGVudmlyb25tZW50IGVudHJ5IGFsbG93IG92ZXJyaWRlcyBieSB0aGUKKyAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQgZGVzY3JpcHRvciIKKyAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iLz4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZSIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgdHlwZSBvZiB0aGlzIGVudmlyb25tZW50IGVudHJ5IgorICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgdmFsdWUgb2YgdGhpcyBlbnZpcm9ubWVudCBlbnRyeSIKKyAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgPC9tYmVhbj4KKworCisgIDxtYmVhbiAgICAgICAgIG5hbWU9IkNvbnRleHRSZXNvdXJjZSIKKyAgICAgICAgIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5tYmVhbnMuQ29udGV4dFJlc291cmNlTUJlYW4iCisgICAgICAgICBkZXNjcmlwdGlvbj0iUmVwcmVzZW50YXRpb24gb2YgYSByZXNvdXJjZSByZWZlcmVuY2UgZm9yIGEgd2ViIGFwcGxpY2F0aW9uIgorICAgICAgICAgZG9tYWluPSJDYXRhbGluYSIKKyAgICAgICAgIGdyb3VwPSJSZXNvdXJjZXMiCisgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5Db250ZXh0UmVzb3VyY2UiPgorICAgIAorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJhdXRoIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBhdXRob3JpemF0aW9uIHJlcXVpcmVtZW50IGZvciB0aGlzIHJlc291cmNlIgorICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgICAgCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImRlc2NyaXB0aW9uIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBkZXNjcmlwdGlvbiBvZiB0aGlzIHJlc291cmNlIgorICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgICAgCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9Im5hbWUiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIG5hbWUgb2YgdGhpcyByZXNvdXJjZSIKKyAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICAgIAorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJzY29wZSIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgc2hhcmluZyBzY29wZSBvZiB0aGlzIHJlc291cmNlIGZhY3RvcnkiCisgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgICAKKyAgICA8YXR0cmlidXRlICAgbmFtZT0idHlwZSIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgdHlwZSBvZiB0aGlzIGVudmlyb25tZW50IGVudHJ5IgorICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICA8L21iZWFuPgorICAKKyAgCisgICA8bWJlYW4gICAgICAgICBuYW1lPSJDb250ZXh0UmVzb3VyY2VMaW5rIgorICAgICAgICAgIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5tYmVhbnMuQ29udGV4dFJlc291cmNlTGlua01CZWFuIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJSZXByZXNlbnRhdGlvbiBvZiBhIHJlc291cmNlIGxpbmsgZm9yIGEgd2ViIGFwcGxpY2F0aW9uIgorICAgICAgICAgIGRvbWFpbj0iQ2F0YWxpbmEiCisgICAgICAgICAgZ3JvdXA9IlJlc291cmNlcyIKKyAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5Db250ZXh0UmVzb3VyY2VMaW5rIj4KKyAgICAKKyAgICA8YXR0cmlidXRlICAgbmFtZT0iZ2xvYmFsIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBnbG9iYWwgbmFtZSBvZiB0aGlzIHJlc291cmNlIgorICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgICAgCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9Im5hbWUiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIG5hbWUgb2YgdGhpcyByZXNvdXJjZSIKKyAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICAgIAorICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJ0eXBlIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSB0eXBlIG9mIHRoaXMgcmVzb3VyY2UiCisgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgICAKKyAgPC9tYmVhbj4KKyAgCisgIDxtYmVhbiAgICAgICAgIG5hbWU9Ik5hbWluZ1Jlc291cmNlcyIKKyAgICAgICAgICAgIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5tYmVhbnMuTmFtaW5nUmVzb3VyY2VzTUJlYW4iCisgICAgICAgICAgZGVzY3JpcHRpb249IkhvbGRzIGFuZCBtYW5hZ2VzIHRoZSBuYW1pbmcgcmVzb3VyY2VzIGRlZmluZWQgaW4gdGhlCisgICAgICAgICAgICAgICAgICAgICAgIEoyRUUgRW50ZXJwcmlzZSBOYW1pbmcgQ29udGV4dCBhbmQgdGhlaXIgYXNzb2NpYXRlZCAKKyAgICAgICAgICAgICAgICAgICAgICAgSk5ESSBjb250ZXh0IgorICAgICAgICAgICAgICAgZG9tYWluPSJDYXRhbGluYSIKKyAgICAgICAgICAgICAgICBncm91cD0iUmVzb3VyY2VzIgorICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5OYW1pbmdSZXNvdXJjZXMiPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImVudmlyb25tZW50cyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iTUJlYW4gTmFtZXMgb2YgdGhlIHNldCBvZiBkZWZpbmVkIGVudmlyb25tZW50IGVudHJpZXMKKyAgICAgICAgICAgICAgICAgICAgICAgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uIgorICAgICAgICAgICAgICAgICB0eXBlPSJbTGphdmEubGFuZy5TdHJpbmc7IgorICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InJlc291cmNlcyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iTUJlYW4gTmFtZXMgb2YgYWxsIHRoZSBkZWZpbmVkIHJlc291cmNlIHJlZmVyZW5jZXMKKyAgICAgICAgICAgICAgICAgICAgICAgZm9yIHRoaXMgYXBwbGljYXRpb24uIgorICAgICAgICAgICAgICAgICB0eXBlPSJbTGphdmEubGFuZy5TdHJpbmc7IgorICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InJlc291cmNlTGlua3MiCisgICAgICAgICAgZGVzY3JpcHRpb249Ik1CZWFuIE5hbWVzIG9mIGFsbCB0aGUgZGVmaW5lZCByZXNvdXJjZSBsaW5rIHJlZmVyZW5jZXMKKyAgICAgICAgICAgICAgICAgICAgICAgZm9yIHRoaXMgYXBwbGljYXRpb24uIgorICAgICAgICAgICAgICAgICB0eXBlPSJbTGphdmEubGFuZy5TdHJpbmc7IgorICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorCisgICAgPG9wZXJhdGlvbiAgIG5hbWU9ImFkZEVudmlyb25tZW50IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJBZGQgYW4gZW52aXJvbm1lbnQgZW50cnkgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJlbnZOYW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJOZXcgZW52aXJvbm1lbnQgZW50cnkgbmFtZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJ0eXBlIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJOZXcgZW52aXJvbm1lbnQgZW50cnkgdHlwZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJ2YWx1ZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iTmV3IGVudmlyb25tZW50IGVudHJ5IHZhbHVlIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgPC9vcGVyYXRpb24+CisKKyAgICA8b3BlcmF0aW9uICAgbmFtZT0iYWRkUmVzb3VyY2UiCisgICAgICAgICAgZGVzY3JpcHRpb249IkFkZCBhIHJlc291cmNlIHJlZmVyZW5jZSBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24iCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgcmV0dXJuVHlwZT0idm9pZCI+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9InJlc291cmNlTmFtZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iTmV3IHJlc291cmNlIHJlZmVyZW5jZSBuYW1lIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9InR5cGUiCisgICAgICAgICAgZGVzY3JpcHRpb249Ik5ldyByZXNvdXJjZSByZWZlcmVuY2UgdHlwZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgIDwvb3BlcmF0aW9uPgorCisgICAgPG9wZXJhdGlvbiAgIG5hbWU9ImFkZFJlc291cmNlTGluayIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQWRkIGEgcmVzb3VyY2UgbGluayByZWZlcmVuY2UgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJyZXNvdXJjZUxpbmtOYW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJOZXcgcmVzb3VyY2UgcmVmZXJlbmNlIG5hbWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0idHlwZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iTmV3IHJlc291cmNlIHJlZmVyZW5jZSB0eXBlIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgPC9vcGVyYXRpb24+CisKKyAgICA8b3BlcmF0aW9uICAgbmFtZT0icmVtb3ZlRW52aXJvbm1lbnQiCisgICAgICAgICAgZGVzY3JpcHRpb249IlJlbW92ZSBhbnkgZW52aXJvbm1lbnQgZW50cnkgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgcmV0dXJuVHlwZT0idm9pZCI+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9ImVudk5hbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249Ik5hbWUgb2YgdGhlIGVudmlyb25tZW50IGVudHJ5IHRvIHJlbW92ZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgIDwvb3BlcmF0aW9uPgorCisgICAgPG9wZXJhdGlvbiAgIG5hbWU9InJlbW92ZVJlc291cmNlIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJSZW1vdmUgYW55IHJlc291cmNlIHJlZmVyZW5jZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICByZXR1cm5UeXBlPSJ2b2lkIj4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icmVzb3VyY2VOYW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJOYW1lIG9mIHRoZSByZXNvdXJjZSByZWZlcmVuY2UgdG8gcmVtb3ZlIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgPC9vcGVyYXRpb24+CisKKyAgICA8b3BlcmF0aW9uICAgbmFtZT0icmVtb3ZlUmVzb3VyY2VMaW5rIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJSZW1vdmUgYW55IHJlc291cmNlIGxpbmsgcmVmZXJlbmNlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJyZXNvdXJjZUxpbmtOYW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJOYW1lIG9mIHRoZSByZXNvdXJjZSByZWZlcmVuY2UgdG8gcmVtb3ZlIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgPC9vcGVyYXRpb24+CisKKyAgPC9tYmVhbj4KKworCis8L21iZWFucy1kZXNjcmlwdG9ycz4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9kZXBsb3kvcGFja2FnZS5odG1sIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2RlcGxveS9wYWNrYWdlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjYxMmZhMAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9kZXBsb3kvcGFja2FnZS5odG1sCkBAIC0wLDAgKzEsMTAgQEAKKzxib2R5PgorCis8cD5UaGlzIHBhY2thZ2UgY29udGFpbnMgSmF2YSBvYmplY3RzIHRoYXQgcmVwcmVzZW50IGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzCitmcm9tIHRoZSB3ZWIgYXBwbGljYXRpb24gZGVwbG95bWVudCBkZXNjcmlwdG9yIGZpbGUgKDxjb2RlPndlYi54bWw8L2NvZGU+KS4KK0l0IGlzIGFzc3VtZWQgdGhhdCB0aGVzZSBvYmplY3RzIHdpbGwgYmUgaW5pdGlhbGl6ZWQgd2l0aGluIHRoZSBjb250ZXh0IG9mCithIHNpbmdsZSB0aHJlYWQsIGFuZCB0aGVuIHJlZmVyZW5jZWQgaW4gYSByZWFkLW9ubHkgbWFubmVyIHN1YnNlcXVlbnQgdG8gdGhhdAordGltZS4gIFRoZXJlZm9yZSwgbm8gbXVsdGktdGhyZWFkIHN5bmNocm9uaXphdGlvbiBpcyB1dGlsaXplZCB3aXRoaW4gdGhlCitpbXBsZW1lbnRhdGlvbiBjbGFzc2VzLjwvcD4KKworPC9ib2R5PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2xhdW5jaGVyL0NhdGFsaW5hTGF1bmNoRmlsdGVyLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvbGF1bmNoZXIvQ2F0YWxpbmFMYXVuY2hGaWx0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2VkM2EzCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2xhdW5jaGVyL0NhdGFsaW5hTGF1bmNoRmlsdGVyLmphdmEKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5sYXVuY2hlcjsKKworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGF1bmNoZXIuTGF1bmNoQ29tbWFuZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGF1bmNoZXIuTGF1bmNoRmlsdGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworCisKKy8qKgorICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSBMYXVuY2hGaWx0ZXIgaW50ZXJmYWNlLiBUaGlzIGNsYXNzIGlzIGRlc2lnbmVkIHRvCisgKiB1bmNvbmRpdGlvbmFsbHkgZm9yY2UgdGhlICJ3YWl0Zm9yY2hpbGQiIGF0dHJpYnV0ZSBmb3IgY2VydGFpbiBDYXRhbGluYQorICogYXBwbGljYXRpb25zIHRvIHRydWUuCisgKgorICogQGF1dGhvciBQYXRyaWNrIEx1YnkKKyAqLworcHVibGljIGNsYXNzIENhdGFsaW5hTGF1bmNoRmlsdGVyIGltcGxlbWVudHMgTGF1bmNoRmlsdGVyIHsKKworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU3RhdGljIEZpZWxkcworCisgICAgLyoqCisgICAgICogVGhlIENhdGFsaW5hIGJvb3RzdHJhcCBjbGFzcyBuYW1lLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBDQVRBTElOQV9CT09UU1RSQVBfQ0xBU1NfTkFNRSA9ICJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0YXJ0dXAuQm9vdHN0cmFwIjsKKworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTWV0aG9kcworCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgYWxsb3dzIGR5bmFtaWMgY29uZmlndXJhdGlvbiBhbmQgZXJyb3IgY2hlY2tpbmcgb2YgdGhlCisgICAgICogYXR0cmlidXRlcyBhbmQgbmVzdGVkIGVsZW1lbnRzIGluIGEgImxhdW5jaCIgdGFzayB0aGF0IGlzIGxhdW5jaGluZyBhCisgICAgICogQ2F0YWxpbmEgYXBwbGljYXRpb24uIFRoaXMgbWV0aG9kIGV2YWx1YXRlcyB0aGUgbmVzdGVkIGNvbW1hbmQgbGluZQorICAgICAqIGFyZ3VtZW50cyBhbmQsIGRlcGVuZGluZyBvbiB3aGljaCBjbGFzcyBpcyBzcGVjaWZpZWQgaW4gdGhlIHRhc2sncworICAgICAqICJjbGFzc25hbWUiIGF0dHJpYnV0ZSwgbWF5IGZvcmNlIHRoZSBhcHBsaWNhdGlvbiB0byBydW4KKyAgICAgKiBpbiB0aGUgZm9yZWdyb3VuZCBieSBmb3JjaW5nIHRoZSAid2FpdGZvcmNoaWxkIiBhdHRyaWJ1dGUgdG8gInRydWUiLgorICAgICAqCisgICAgICogQHBhcmFtIGxhdW5jaENvbW1hbmQgYSBjb25maWd1cmVkIGluc3RhbmNlIG9mIHRoZSB7QGxpbmsgTGF1bmNoQ29tbWFuZH0KKyAgICAgKiAgY2xhc3MKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIGFueSBlcnJvcnMgb2NjdXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoTGF1bmNoQ29tbWFuZCBsYXVuY2hDb21tYW5kKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworCisgICAgICAgIC8vIEdldCBhdHRyaWJ1dGVzCisgICAgICAgIFN0cmluZyBtYWluQ2xhc3NOYW1lID0gbGF1bmNoQ29tbWFuZC5nZXRDbGFzc25hbWUoKTsKKyAgICAgICAgYm9vbGVhbiB3YWl0Rm9yQ2hpbGQgPSBsYXVuY2hDb21tYW5kLmdldFdhaXRmb3JjaGlsZCgpOworICAgICAgICBBcnJheUxpc3QgYXJnc0xpc3QgPSBsYXVuY2hDb21tYW5kLmdldEFyZ3MoKTsKKyAgICAgICAgU3RyaW5nW10gYXJncyA9IChTdHJpbmdbXSlhcmdzTGlzdC50b0FycmF5KG5ldyBTdHJpbmdbYXJnc0xpc3Quc2l6ZSgpXSk7CisKKyAgICAgICAgLy8gRXZhbHVhdGUgbWFpbiBjbGFzcworICAgICAgICBpZiAoQ2F0YWxpbmFMYXVuY2hGaWx0ZXIuQ0FUQUxJTkFfQk9PVFNUUkFQX0NMQVNTX05BTUUuZXF1YWxzKG1haW5DbGFzc05hbWUpKSB7CisgICAgICAgICAgICAvLyBJZiAic3RhcnQiIGlzIG5vdCB0aGUgbGFzdCBhcmd1bWVudCwgbWFrZSAid2FpdGZvcmNoaWxkIiB0cnVlCisgICAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPT0gMCB8fCAhInN0YXJ0Ii5lcXVhbHMoYXJnc1thcmdzLmxlbmd0aCAtIDFdKSkgeworICAgICAgICAgICAgICAgIGxhdW5jaENvbW1hbmQuc2V0V2FpdGZvcmNoaWxkKHRydWUpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSWYgInN0YXJ0IiBpcyB0aGUgbGFzdCBhcmd1bWVudCwgbWFrZSBzdXJlIHRoYXQgYWxsIG9mIHRoZQorICAgICAgICAgICAgLy8gcHJlY2VkaW5nIGFyZ3VtZW50cyBhcmUgT0sgZm9yIHJ1bm5pbmcgaW4gdGhlIGJhY2tncm91bmQKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGggLSAxOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoIi1jb25maWciLmVxdWFscyhhcmdzW2ldKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIG5leHQgYXJndW1lbnQgc2luY2UgaXQgc2hvdWxkIGJlIGEgZmlsZQorICAgICAgICAgICAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPiBpICsgMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbGF1bmNoQ29tbWFuZC5zZXRXYWl0Zm9yY2hpbGQodHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCItZGVidWciLmVxdWFscyhhcmdzW2ldKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBEbyBub3RoaW5nCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgiLW5vbmFtaW5nIi5lcXVhbHMoYXJnc1tpXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRG8gbm90aGluZworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICBsYXVuY2hDb21tYW5kLnNldFdhaXRmb3JjaGlsZCh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2xvYWRlci9Db25zdGFudHMuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9sb2FkZXIvQ29uc3RhbnRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNjYjc4YgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9sb2FkZXIvQ29uc3RhbnRzLmphdmEKQEAgLTAsMCArMSwyNSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5sb2FkZXI7CisKKworcHVibGljIGNsYXNzIENvbnN0YW50cyB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQYWNrYWdlID0gIm9yZy5hcGFjaGUuY2F0YWxpbmEubG9hZGVyIjsKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2xvYWRlci9Mb2NhU3RyaW5nc19mci5wcm9wZXJ0aWVzIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2xvYWRlci9Mb2NhU3RyaW5nc19mci5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjMTlhYmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvbG9hZGVyL0xvY2FTdHJpbmdzX2ZyLnByb3BlcnRpZXMKQEAgLTAsMCArMSwzMCBAQAorZmlsZUNsYXNzTG9hZGVyLmNhblJlYWQ9TGUgculjZXB0YWNsZSAocmVwb3NpdG9yeSkgezB9IG5lIHBldXQg6nRyZSBsdQorZmlsZUNsYXNzTG9hZGVyLmV4aXN0cz1MZSBy6WNlcHRhY2xlIChyZXBvc2l0b3J5KSB7MH0gbicnZXhpc3RlIHBhcworZmlsZUNsYXNzTG9hZGVyLmphckZpbGU9SW1wb3NzaWJsZSBkZSBsaXJlIGxlIGZpY2hpZXIgSkFSIHswfQorZmlsZUNsYXNzTG9hZGVyLnJlc3RyaWN0ZWQ9SW1wb3NzaWJsZSBkZSBjaGFyZ2VyIGxhIGNsYXNzZSByZXN0cmVpbnRlIChyZXN0cmljdGVkIGNsYXNzKSB7MH0KK3N0YW5kYXJkTG9hZGVyLmFkZFJlcG9zaXRvcnk9QWpvdXQgZHUgculjZXB0YWNsZSAocmVwb3NpdG9yeSkgezB9CitzdGFuZGFyZExvYWRlci5hbHJlYWR5U3RhcnRlZD1MZSBjaGFyZ2V1ciAobG9hZGVyKSBhIGTpauAg6XTpIGTpbWFycukKK3N0YW5kYXJkTG9hZGVyLmNoZWNrSW50ZXJ2YWw9SW1wb3NzaWJsZSBkZSBy6WdsZXIgbCcnaW50ZXJ2YWwgZGUgdulyaWZpY2F0aW9uIGRlIHJlY2hhcmdlbWVudCDgIHswfSBzZWNvbmRlcworc3RhbmRhcmRMb2FkZXIubm90Q29udGV4dD1JbXBvc3NpYmxlIGQnJ2F1dG8tcmVjaGFyZ2VyIHNhbnMgcXVlIGxlIGNvbnRlbmV1ciBuZSBzb2l0IHVuIGNvbnRleHRlCitzdGFuZGFyZExvYWRlci5ub3RSZWxvYWRhYmU9UHJvcHJp6XTpIGRlIHJlY2hhcmdlbWVudCAocmVsb2FkYWJsZSBwcm9wZXJ0eSkgbWlzZSDgIGZhdXgKK3N0YW5kYXJkTG9hZGVyLm5vdFN0YXJ0ZWQ9TGUgY2hhcmdldXIgKGxvYWRlcikgbicnYSBwYXMgZW5jb3JlIOl06SBk6W1hcnLpCitzdGFuZGFyZExvYWRlci5yZWxvYWRhYmxlPUltcG9zc2libGUgZGUgbWV0dHJlIGxhIHByb3Byael06SBkZSByZWNoYXJnZW1lbnQgKHJlbG9hZGFibGUgcHJvcGVydHkpIOAgezB9CitzdGFuZGFyZExvYWRlci5yZWxvYWRpbmc9TGVzIHbpcmlmaWNhdGlvbnMgZGUgcmVjaGFyZ2VtZW50IHNvbnQgYWN0aXbpZXMgcG91ciBjZSBjb250ZXh0ZQorc3RhbmRhcmRMb2FkZXIucmVtb3ZlUmVwb3NpdG9yeT1SZXRyYWl0IGR1IHLpY2VwdGFjbGUgKHJlcG9zaXRvcnkpIHswfQorc3RhbmRhcmRMb2FkZXIuc3RhcnRpbmc9ROltYXJyYWdlIGRlIGNlIGNoYXJnZXVyIChsb2FkZXIpCitzdGFuZGFyZExvYWRlci5zdG9wcGluZz1BcnLqdCBkZSBjZSBjaGFyZ2V1ciAobG9hZGVyKQord2ViYXBwTG9hZGVyLmFkZFJlcG9zaXRvcnk9QWpvdXQgZHUgculjZXB0YWNsZSAocmVwb3NpdG9yeSkgezB9Cit3ZWJhcHBMb2FkZXIuZGVwbG95PUTpcGxvaWVtZW50IGRlcyBjbGFzc2VzIGRlcyBy6WNlcHRhY2xlcyAoY2xhc3MgcmVwb3NpdG9yaWVzKSB2ZXJzIGxlIGRvc3NpZXIgZGUgdHJhdmFpbCAod29yayBkaXJlY3RvcnkpIHswfQord2ViYXBwTG9hZGVyLmphckRlcGxveT1E6XBsb2llbWVudCBkdSBKQVIgezB9IHZlcnMgezF9Cit3ZWJhcHBMb2FkZXIuY2xhc3NEZXBsb3k9ROlwbG9pZW1lbnQgZGVzIGZpY2hpZXJzIGNsYXNzZXMgezB9IHZlcnMgezF9Cit3ZWJhcHBMb2FkZXIuYWxyZWFkeVN0YXJ0ZWQ9TGUgY2hhcmdldXIgKGxvYWRlcikgYSBk6WrgIOl06SBk6W1hcnLpCit3ZWJhcHBMb2FkZXIuY2hlY2tJbnRlcnZhbD1JbXBvc3NpYmxlIGRlIHLpZ2xlciBsJydpbnRlcnZhbCBkZSB26XJpZmljYXRpb24gZGUgcmVjaGFyZ2VtZW50IOAgezB9IHNlY29uZGVzCit3ZWJhcHBMb2FkZXIubm90Q29udGV4dD1JbXBvc3NpYmxlIGQnJ2F1dG8tcmVjaGFyZ2VyIHNhbnMgcXVlIGxlIGNvbnRlbmV1ciBuZSBzb2l0IHVuIGNvbnRleHRlCit3ZWJhcHBMb2FkZXIubm90UmVsb2FkYWJlPVByb3Byael06SBkZSByZWNoYXJnZW1lbnQgKHJlbG9hZGFibGUgcHJvcGVydHkpIG1pc2Ug4CBmYXV4Cit3ZWJhcHBMb2FkZXIubm90U3RhcnRlZD1MZSBjaGFyZ2V1ciAobG9hZGVyKSBuJydhIHBhcyBlbmNvcmUg6XTpIGTpbWFycukKK3dlYmFwcExvYWRlci5yZWxvYWRhYmxlPUltcG9zc2libGUgZGUgbWV0dHJlIGxhIHByb3Byael06SBkZSByZWNoYXJnZW1lbnQgKHJlbG9hZGFibGUgcHJvcGVydHkpIOAgezB9Cit3ZWJhcHBMb2FkZXIucmVsb2FkaW5nPUxlcyB26XJpZmljYXRpb25zIGRlIHJlY2hhcmdlbWVudCBzb250IGFjdGl26WVzIHBvdXIgY2UgY29udGV4dGUKK3dlYmFwcExvYWRlci5yZW1vdmVSZXBvc2l0b3J5PVJldHJhaXQgZHUgculjZXB0YWNsZSAocmVwb3NpdG9yeSkgezB9Cit3ZWJhcHBMb2FkZXIuc3RhcnRpbmc9ROltYXJyYWdlIGRlIGNlIGNoYXJnZXVyIChsb2FkZXIpCit3ZWJhcHBMb2FkZXIuc3RvcHBpbmc9QXJy6nQgZGUgY2UgY2hhcmdldXIgKGxvYWRlcikKK3dlYmFwcExvYWRlci5mYWlsTW9kaWZpZWRDaGVjaz1FcnJldXIgZGFucyBsZSBzdWl2aSBkZXMgbW9kaWZpY2F0aW9ucwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2xvYWRlci9Mb2NhbFN0cmluZ3MucHJvcGVydGllcyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9sb2FkZXIvTG9jYWxTdHJpbmdzLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVlNTBmMAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9sb2FkZXIvTG9jYWxTdHJpbmdzLnByb3BlcnRpZXMKQEAgLTAsMCArMSwzMSBAQAorZmlsZUNsYXNzTG9hZGVyLmNhblJlYWQ9UmVwb3NpdG9yeSB7MH0gY2Fubm90IGJlIHJlYWQKK2ZpbGVDbGFzc0xvYWRlci5leGlzdHM9UmVwb3NpdG9yeSB7MH0gZG9lcyBub3QgZXhpc3QKK2ZpbGVDbGFzc0xvYWRlci5qYXJGaWxlPUNhbm5vdCByZWFkIEpBUiBmaWxlIHswfQorZmlsZUNsYXNzTG9hZGVyLnJlc3RyaWN0ZWQ9Q2Fubm90IGxvYWQgcmVzdHJpY3RlZCBjbGFzcyB7MH0KK3N0YW5kYXJkTG9hZGVyLmFkZFJlcG9zaXRvcnk9QWRkaW5nIHJlcG9zaXRvcnkgezB9CitzdGFuZGFyZExvYWRlci5hbHJlYWR5U3RhcnRlZD1Mb2FkZXIgaGFzIGFscmVhZHkgYmVlbiBzdGFydGVkCitzdGFuZGFyZExvYWRlci5jaGVja0ludGVydmFsPUNhbm5vdCBzZXQgcmVsb2FkIGNoZWNrIGludGVydmFsIHRvIHswfSBzZWNvbmRzCitzdGFuZGFyZExvYWRlci5ub3RDb250ZXh0PUNhbm5vdCBhdXRvLXJlbG9hZCB1bmxlc3Mgb3VyIENvbnRhaW5lciBpcyBhIENvbnRleHQKK3N0YW5kYXJkTG9hZGVyLm5vdFJlbG9hZGFiZT1SZWxvYWRhYmxlIHByb3BlcnR5IGlzIHNldCB0byBmYWxzZQorc3RhbmRhcmRMb2FkZXIubm90U3RhcnRlZD1Mb2FkZXIgaGFzIG5vdCB5ZXQgYmVlbiBzdGFydGVkCitzdGFuZGFyZExvYWRlci5yZWxvYWRhYmxlPUNhbm5vdCBzZXQgcmVsb2FkYWJsZSBwcm9wZXJ0eSB0byB7MH0KK3N0YW5kYXJkTG9hZGVyLnJlbG9hZGluZz1SZWxvYWRpbmcgY2hlY2tzIGFyZSBlbmFibGVkIGZvciB0aGlzIENvbnRleHQKK3N0YW5kYXJkTG9hZGVyLnJlbW92ZVJlcG9zaXRvcnk9UmVtb3ZpbmcgcmVwb3NpdG9yeSB7MH0KK3N0YW5kYXJkTG9hZGVyLnN0YXJ0aW5nPVN0YXJ0aW5nIHRoaXMgTG9hZGVyCitzdGFuZGFyZExvYWRlci5zdG9wcGluZz1TdG9wcGluZyB0aGlzIExvYWRlcgord2ViYXBwQ2xhc3NMb2FkZXIuc3RvcHBlZD1JbGxlZ2FsIGFjY2VzczogdGhpcyB3ZWIgYXBwbGljYXRpb24gaW5zdGFuY2UgaGFzIGJlZW4gc3RvcHBlZCBhbHJlYWR5LiAgQ291bGQgbm90IGxvYWQgezB9LiAgVGhlIGV2ZW50dWFsIGZvbGxvd2luZyBzdGFjayB0cmFjZSBpcyBjYXVzZWQgYnkgYW4gZXJyb3IgdGhyb3duIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMgYXMgd2VsbCBhcyB0byBhdHRlbXB0IHRvIHRlcm1pbmF0ZSB0aGUgdGhyZWFkIHdoaWNoIGNhdXNlZCB0aGUgaWxsZWdhbCBhY2Nlc3MsIGFuZCBoYXMgbm8gZnVuY3Rpb25hbCBpbXBhY3QuCit3ZWJhcHBMb2FkZXIuYWRkUmVwb3NpdG9yeT1BZGRpbmcgcmVwb3NpdG9yeSB7MH0KK3dlYmFwcExvYWRlci5kZXBsb3k9RGVwbG95aW5nIGNsYXNzIHJlcG9zaXRvcmllcyB0byB3b3JrIGRpcmVjdG9yeSB7MH0KK3dlYmFwcExvYWRlci5qYXJEZXBsb3k9RGVwbG95IEpBUiB7MH0gdG8gezF9Cit3ZWJhcHBMb2FkZXIuY2xhc3NEZXBsb3k9RGVwbG95IGNsYXNzIGZpbGVzIHswfSB0byB7MX0KK3dlYmFwcExvYWRlci5hbHJlYWR5U3RhcnRlZD1Mb2FkZXIgaGFzIGFscmVhZHkgYmVlbiBzdGFydGVkCit3ZWJhcHBMb2FkZXIuY2hlY2tJbnRlcnZhbD1DYW5ub3Qgc2V0IHJlbG9hZCBjaGVjayBpbnRlcnZhbCB0byB7MH0gc2Vjb25kcword2ViYXBwTG9hZGVyLm5vdENvbnRleHQ9Q2Fubm90IGF1dG8tcmVsb2FkIHVubGVzcyBvdXIgQ29udGFpbmVyIGlzIGEgQ29udGV4dAord2ViYXBwTG9hZGVyLm5vdFJlbG9hZGFiZT1SZWxvYWRhYmxlIHByb3BlcnR5IGlzIHNldCB0byBmYWxzZQord2ViYXBwTG9hZGVyLm5vdFN0YXJ0ZWQ9TG9hZGVyIGhhcyBub3QgeWV0IGJlZW4gc3RhcnRlZAord2ViYXBwTG9hZGVyLnJlbG9hZGFibGU9Q2Fubm90IHNldCByZWxvYWRhYmxlIHByb3BlcnR5IHRvIHswfQord2ViYXBwTG9hZGVyLnJlbG9hZGluZz1SZWxvYWRpbmcgY2hlY2tzIGFyZSBlbmFibGVkIGZvciB0aGlzIENvbnRleHQKK3dlYmFwcExvYWRlci5yZW1vdmVSZXBvc2l0b3J5PVJlbW92aW5nIHJlcG9zaXRvcnkgezB9Cit3ZWJhcHBMb2FkZXIuc3RhcnRpbmc9U3RhcnRpbmcgdGhpcyBMb2FkZXIKK3dlYmFwcExvYWRlci5zdG9wcGluZz1TdG9wcGluZyB0aGlzIExvYWRlcgord2ViYXBwTG9hZGVyLmZhaWxNb2RpZmllZENoZWNrPUVycm9yIHRyYWNraW5nIG1vZGlmaWNhdGlvbnMKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9sb2FkZXIvTG9jYWxTdHJpbmdzX2VzLnByb3BlcnRpZXMgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvbG9hZGVyL0xvY2FsU3RyaW5nc19lcy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlN2M5NWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvbG9hZGVyL0xvY2FsU3RyaW5nc19lcy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMzEgQEAKK2ZpbGVDbGFzc0xvYWRlci5jYW5SZWFkPU5vIHNlIHB1ZWRlIGxlZXIgZWwgUmVwb3NpdG9yaW8gezB9CitmaWxlQ2xhc3NMb2FkZXIuZXhpc3RzPU5vIGV4aXN0ZSBlbCBSZXBvc2l0b3JpbyB7MH0KK2ZpbGVDbGFzc0xvYWRlci5qYXJGaWxlPU5vIHB1ZWRvIGxlZXIgYXJjaGl2byBKQVIgezB9CitmaWxlQ2xhc3NMb2FkZXIucmVzdHJpY3RlZD1ObyBwdWVkbyBjYXJnYXIgY2xhc2UgcmVzdHJpbmdpZGEgezB9CitzdGFuZGFyZExvYWRlci5hZGRSZXBvc2l0b3J5PUHxYWRpZW5kbyByZXBvc2l0b3JpbyB7MH0KK3N0YW5kYXJkTG9hZGVyLmFscmVhZHlTdGFydGVkPVlhIGhhIHNpZG8gYXJyYW5jYWRvIGVsIENhcmdhZG9yCitzdGFuZGFyZExvYWRlci5jaGVja0ludGVydmFsPU5vIHB1ZWRvIHBvbmVyIGVsIGludGVydmFsbyBkZSByZXZpc2nzbiBkZSByZWNhcmdhIGEgezB9IHNlZ3VuZG9zCitzdGFuZGFyZExvYWRlci5ub3RDb250ZXh0PU5vIHB1ZWRvIGF1dG8tcmVjYXJnYXIgYSBtZW5vcyBxdWUgbnVlc3RybyBDb250ZW5lZG9yIHNlYSB1biBDb250ZXh0bworc3RhbmRhcmRMb2FkZXIubm90UmVsb2FkYWJlPUxhIHByb3BpZWRhZCBSZWNhcmdhYmxlIGVzdOEgcHVlc3RhIGEgZmFsc2EKK3N0YW5kYXJkTG9hZGVyLm5vdFN0YXJ0ZWQ9QfpuIG5vIHNlIGhhIGFycmFuY2FkbyBlbCBDYXJnYWRvcgorc3RhbmRhcmRMb2FkZXIucmVsb2FkYWJsZT1ObyBwdWVkbyBwb25lciBsYSBwcm9waWVkYWQgcmVjYXJnYWJsZSBhIHswfQorc3RhbmRhcmRMb2FkZXIucmVsb2FkaW5nPVNlIGhhbiBhY3RpdmFkbyBsYXMgcmV2aXNpb25lcyBkZSBSZWNhcmdhIHBhcmEgZXN0ZSBDb250ZXh0bworc3RhbmRhcmRMb2FkZXIucmVtb3ZlUmVwb3NpdG9yeT1RdWl0YW5kbyByZXBvc2l0b3JpbyB7MH0KK3N0YW5kYXJkTG9hZGVyLnN0YXJ0aW5nPUFycmFuY2FuZG8gZXN0ZSBDYXJnYWRvcgorc3RhbmRhcmRMb2FkZXIuc3RvcHBpbmc9UGFyYW5kbyBlc3RlIENhcmdhZG9yCit3ZWJhcHBDbGFzc0xvYWRlci5zdG9wcGVkPUFjY2VzbyBpbGVnYWw6IGVzdGEgaW5zdGFuY2lhIGRlIGFwbGljYWNp824gd2ViIHlhIGhhIHNpZG8gcGFyYWRhLiAgQ291bGQgbm90IGxvYWQgezB9LiAgTGEgZXZlbnR1YWwgdHJhemEgZGUgcGlsYSBxdWUgc2lndWUgaGEgc2lkbyBtb3RpdmFkYSBwb3IgdW4gZXJyb3IgbGFuemFkbyBjb24gbW90aXZvcyBkZSBkZXB1cmFjafNuIGFz7SBjb21vIHBhcmEgaW50ZW50YXIgdGVybWluYXIgZWwgaGlsbyBxdWUgbW90aXbzIGVsIGFjY2VzbyBpbGVnYWwgeSBubyB0aWVuZSBpbXBhY3RvIGZ1bmNpb25hbC4KK3dlYmFwcExvYWRlci5hZGRSZXBvc2l0b3J5PUHxYWRpZW5kbyByZXBvc2l0b3JpbyB7MH0KK3dlYmFwcExvYWRlci5kZXBsb3k9RGVzcGxlZ2FuZG8gcmVwb3NpdG9yaW9zIGRlIGNsYXNlIGVuIGRpcmVjdG9yaW8gZGUgdHJhYmFqbyB7MH0KK3dlYmFwcExvYWRlci5qYXJEZXBsb3k9RGVzcGxpZWd1ZSBkZWwgSkFSIHswfSBlbiB7MX0KK3dlYmFwcExvYWRlci5jbGFzc0RlcGxveT1EZXNwbGllZ3VlIGRlIGFyY2hpdm9zIGRlIGNsYXNlIHswfSBlbiB7MX0KK3dlYmFwcExvYWRlci5hbHJlYWR5U3RhcnRlZD1ZYSBzZSBoYSBhcnJhbmNhZG8gZWwgQ2FyZ2Fkb3IKK3dlYmFwcExvYWRlci5jaGVja0ludGVydmFsPU5vIHB1ZWRvIHBvbmVyIGVsIGludGVydmFsbyBkZSByZXZpc2nzbiBkZSByZWNhcmdhIGEgezB9IHNlZ3VuZG9zCit3ZWJhcHBMb2FkZXIubm90Q29udGV4dD1ObyBwdWVkbyBhdXRvLXJlY2FyZ2FyIGEgbWVub3MgcXVlIG51ZXN0cm8gQ29udGVuZWRvciBzZWEgdW4gQ29udGV4dG8KK3dlYmFwcExvYWRlci5ub3RSZWxvYWRhYmU9U2UgaGEgcHVlc3RvIGxhIHByb3BpZWRhZCBSZWNhcmdhYmxlIGEgZmFsc2EKK3dlYmFwcExvYWRlci5ub3RTdGFydGVkPUH6biBubyBzZSBoYSBhcnJhbmNhZG8gZWwgQ2FyZ2Fkb3IKK3dlYmFwcExvYWRlci5yZWxvYWRhYmxlPU5vIHB1ZWRvIHBvbmVyIGxhIHByb3BpZWRhZCByZWNhcmdhYmxlIGEgezB9Cit3ZWJhcHBMb2FkZXIucmVsb2FkaW5nPVNlIGhhbiBhY3RpdmFkbyBsb3MgY2hlcXVlb3MgZGUgUmVjYXJnYSBwYXJhIGVzdGUgQ29udGV4dG8KK3dlYmFwcExvYWRlci5yZW1vdmVSZXBvc2l0b3J5PVF1aXRhbmRvIHJlcG9zaXRvcmlvIHswfQord2ViYXBwTG9hZGVyLnN0YXJ0aW5nPUFycmFuY2FuZG8gZXN0ZSBDYXJnYWRvcgord2ViYXBwTG9hZGVyLnN0b3BwaW5nPVBhcmFuZG8gZXN0ZSBDYXJnYWRvcgord2ViYXBwTG9hZGVyLmZhaWxNb2RpZmllZENoZWNrPU1vZGlmaWNhY2lvbmVzIGRlIHBpc3RhIGRlIGVycm9yCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvbG9hZGVyL0xvY2FsU3RyaW5nc19qYS5wcm9wZXJ0aWVzIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2xvYWRlci9Mb2NhbFN0cmluZ3NfamEucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjFlNTZiCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2xvYWRlci9Mb2NhbFN0cmluZ3NfamEucHJvcGVydGllcwpAQCAtMCwwICsxLDMxIEBACitmaWxlQ2xhc3NMb2FkZXIuY2FuUmVhZD1cdTMwZWFcdTMwZGRcdTMwYjhcdTMwYzhcdTMwZWEgezB9IFx1MzA0Y1x1OGFhZFx1MzA4MVx1MzA3ZVx1MzA1Ylx1MzA5MworZmlsZUNsYXNzTG9hZGVyLmV4aXN0cz1cdTMwZWFcdTMwZGRcdTMwYjhcdTMwYzhcdTMwZWEgezB9IFx1MzA0Y1x1NWI1OFx1NTcyOFx1MzA1N1x1MzA3ZVx1MzA1Ylx1MzA5MworZmlsZUNsYXNzTG9hZGVyLmphckZpbGU9SkFSXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViIHswfSBcdTMwNGNcdThhYWRcdTMwODFcdTMwN2VcdTMwNWJcdTMwOTMKK2ZpbGVDbGFzc0xvYWRlci5yZXN0cmljdGVkPVx1NTIzNlx1OTY1MFx1MzA1NVx1MzA4Y1x1MzA1Zlx1MzBhZlx1MzBlOVx1MzBiOSB7MH0gXHUzMDkyXHUzMGVkXHUzMGZjXHUzMGM5XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzCitzdGFuZGFyZExvYWRlci5hZGRSZXBvc2l0b3J5PVx1MzBlYVx1MzBkZFx1MzBiOFx1MzBjOFx1MzBlYSB7MH0gXHUzMDkyXHU4ZmZkXHU1MmEwXHUzMDU3XHUzMDdlXHUzMDU5CitzdGFuZGFyZExvYWRlci5hbHJlYWR5U3RhcnRlZD1cdTMwZWRcdTMwZmNcdTMwYzBcdTMwNmZcdTY1ZTJcdTMwNmJcdThkNzdcdTUyZDVcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkKK3N0YW5kYXJkTG9hZGVyLmNoZWNrSW50ZXJ2YWw9XHU1MThkXHUzMGVkXHUzMGZjXHUzMGM5XHUzMGMxXHUzMGE3XHUzMGMzXHUzMGFmXHU5NTkzXHU5Njk0XHUzMDkyezB9XHU3OWQyXHUzMDZiXHU4YTJkXHU1YjlhXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzCitzdGFuZGFyZExvYWRlci5ub3RDb250ZXh0PVx1MzA1M1x1MzA2ZVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBjYVx1MzA0Y1x1MzBiM1x1MzBmM1x1MzBjNlx1MzBhZFx1MzBiOVx1MzBjOFx1MzA2N1x1MzA2YVx1MzA1MVx1MzA4Y1x1MzA3MFx1MzAwMVx1ODFlYVx1NTJkNVx1NTE4ZFx1MzBlZFx1MzBmY1x1MzBjOVx1MzA2Zlx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5Mworc3RhbmRhcmRMb2FkZXIubm90UmVsb2FkYWJlPXJlbG9hZGFibGVcdTMwZDdcdTMwZWRcdTMwZDFcdTMwYzZcdTMwYTNcdTMwNGNmYWxzZVx1MzA2Ylx1OGEyZFx1NWI5YVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OQorc3RhbmRhcmRMb2FkZXIubm90U3RhcnRlZD1cdTMwZWRcdTMwZmNcdTMwYzBcdTMwNmZcdTMwN2VcdTMwNjBcdThkNzdcdTUyZDVcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNWJcdTMwOTMKK3N0YW5kYXJkTG9hZGVyLnJlbG9hZGFibGU9cmVsb2FkYWJsZVx1MzBkN1x1MzBlZFx1MzBkMVx1MzBjNlx1MzBhM1x1MzA5MiB7MH0gXHUzMDZiXHU4YTJkXHU1YjlhXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzCitzdGFuZGFyZExvYWRlci5yZWxvYWRpbmc9XHUzMDUzXHUzMDZlXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4XHUzMDZlXHU1MThkXHUzMGVkXHUzMGZjXHUzMGM5XHUzMGMxXHUzMGE3XHUzMGMzXHUzMGFmXHUzMDZmXHU2NzA5XHU1MmI5XHUzMDY3XHUzMDU5CitzdGFuZGFyZExvYWRlci5yZW1vdmVSZXBvc2l0b3J5PVx1MzBlYVx1MzBkZFx1MzBiOFx1MzBjOFx1MzBlYSB7MH0gXHUzMDkyXHU1MjRhXHU5NjY0XHUzMDU3XHUzMDdlXHUzMDU5CitzdGFuZGFyZExvYWRlci5zdGFydGluZz1cdTMwNTNcdTMwNmVcdTMwZWRcdTMwZmNcdTMwYzBcdTMwOTJcdThkNzdcdTUyZDVcdTMwNTdcdTMwN2VcdTMwNTkKK3N0YW5kYXJkTG9hZGVyLnN0b3BwaW5nPVx1MzA1M1x1MzA2ZVx1MzBlZFx1MzBmY1x1MzBjMFx1MzA5Mlx1NTA1Y1x1NmI2Mlx1MzA1N1x1MzA3ZVx1MzA1OQord2ViYXBwQ2xhc3NMb2FkZXIuc3RvcHBlZD1cdTRlMGRcdTZiNjNcdTMwNmFcdTMwYTJcdTMwYWZcdTMwYmJcdTMwYjk6IFx1MzA1M1x1MzA2ZVdlYlx1MzBhMlx1MzBkN1x1MzBlYVx1MzBiMVx1MzBmY1x1MzBiN1x1MzBlN1x1MzBmM1x1MzA2ZVx1MzBhNFx1MzBmM1x1MzBiOVx1MzBiZlx1MzBmM1x1MzBiOVx1MzA2Zlx1NjVlMlx1MzA2Ylx1NTA1Y1x1NmI2Mlx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OSAgQ291bGQgbm90IGxvYWQgezB9LiBcdTRlMGRcdTZiNjNcdTMwNmFcdTMwYTJcdTMwYWZcdTMwYmJcdTMwYjlcdTMwOTJcdTVmMTVcdTMwNGRcdThkNzdcdTMwNTNcdTMwNTdcdTMwNWZcdTMwYjlcdTMwZWNcdTMwYzNcdTMwYzlcdTMwOTJcdTdkNDJcdTRlODZcdTMwNTVcdTMwNWJcdTMwMDFcdTYyOTVcdTMwNTJcdTMwODlcdTMwOGNcdTMwNWZcdTMwYThcdTMwZTlcdTMwZmNcdTMwNmJcdTMwODhcdTMwOGFcdTMwYzdcdTMwZDBcdTMwYzNcdTMwYjBcdTc1MjhcdTMwNmJcdTZiMjFcdTMwNmVcdTMwYjlcdTMwYmZcdTMwYzNcdTMwYWZcdTMwYzhcdTMwZWNcdTMwZmNcdTMwYjlcdTMwNGNcdTc1MWZcdTYyMTBcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNTdcdTMwNWZcdTMwNGNcdWZmMGNcdTZhNWZcdTgwZmRcdTMwNmJcdTVmNzFcdTk3ZmZcdTMwNmZcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTMKK3dlYmFwcExvYWRlci5hZGRSZXBvc2l0b3J5PVx1MzBlYVx1MzBkZFx1MzBiOFx1MzBjOFx1MzBlYSB7MH0gXHUzMDkyXHU4ZmZkXHU1MmEwXHUzMDU3XHUzMDdlXHUzMDU5Cit3ZWJhcHBMb2FkZXIuZGVwbG95PVx1MzBhZlx1MzBlOVx1MzBiOVx1MzBlYVx1MzBkZFx1MzBiOFx1MzBjOFx1MzBlYVx1MzA5Mlx1NGY1Y1x1Njk2ZFx1MzBjN1x1MzBhM1x1MzBlY1x1MzBhZlx1MzBjOFx1MzBlYSB7MH0gXHUzMDZiXHU5MTRkXHU1MDk5XHUzMDU3XHUzMDdlXHUzMDU5Cit3ZWJhcHBMb2FkZXIuamFyRGVwbG95PUpBUiB7MH0gXHUzMDkyIHsxfSBcdTMwNmJcdTkxNGRcdTUwOTlcdTMwNTdcdTMwN2VcdTMwNTkKK3dlYmFwcExvYWRlci5jbGFzc0RlcGxveT1cdTMwYWZcdTMwZTlcdTMwYjlcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWIgezB9IFx1MzA5MiB7MX0gXHUzMDZiXHU5MTRkXHU1MDk5XHUzMDU3XHUzMDdlXHUzMDU5Cit3ZWJhcHBMb2FkZXIuYWxyZWFkeVN0YXJ0ZWQ9XHUzMGVkXHUzMGZjXHUzMGMwXHUzMDZmXHU2NWUyXHUzMDZiXHU4ZDc3XHU1MmQ1XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5Cit3ZWJhcHBMb2FkZXIuY2hlY2tJbnRlcnZhbD1cdTUxOGRcdTMwZWRcdTMwZmNcdTMwYzlcdTMwYzFcdTMwYTdcdTMwYzNcdTMwYWZcdTk1OTNcdTk2OTRcdTMwOTJ7MH1cdTc5ZDJcdTMwNmJcdThhMmRcdTViOWFcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMKK3dlYmFwcExvYWRlci5ub3RDb250ZXh0PVx1MzA1M1x1MzA2ZVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBjYVx1MzA0Y1x1MzBiM1x1MzBmM1x1MzBjNlx1MzBhZFx1MzBiOVx1MzBjOFx1MzA2N1x1MzA2YVx1MzA1MVx1MzA4Y1x1MzA3MFx1MzAwMVx1ODFlYVx1NTJkNVx1NTE4ZFx1MzBlZFx1MzBmY1x1MzBjOVx1MzA2Zlx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5Mword2ViYXBwTG9hZGVyLm5vdFJlbG9hZGFiZT1yZWxvYWRhYmxlXHUzMGQ3XHUzMGVkXHUzMGQxXHUzMGM2XHUzMGEzXHUzMDRjZmFsc2VcdTMwNmJcdThhMmRcdTViOWFcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkKK3dlYmFwcExvYWRlci5ub3RTdGFydGVkPVx1MzBlZFx1MzBmY1x1MzBjMFx1MzA2Zlx1MzA3ZVx1MzA2MFx1OGQ3N1x1NTJkNVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5Mword2ViYXBwTG9hZGVyLnJlbG9hZGFibGU9cmVsb2FkYWJsZVx1MzBkN1x1MzBlZFx1MzBkMVx1MzBjNlx1MzBhM1x1MzA5MiB7MH0gXHUzMDZiXHU4YTJkXHU1YjlhXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzCit3ZWJhcHBMb2FkZXIucmVsb2FkaW5nPVx1MzA1M1x1MzA2ZVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBhZFx1MzBiOVx1MzBjOFx1MzA2ZVx1NTE4ZFx1MzBlZFx1MzBmY1x1MzBjOVx1MzBjMVx1MzBhN1x1MzBjM1x1MzBhZlx1MzA2Zlx1NjcwOVx1NTJiOVx1MzA2N1x1MzA1OQord2ViYXBwTG9hZGVyLnJlbW92ZVJlcG9zaXRvcnk9XHUzMGVhXHUzMGRkXHUzMGI4XHUzMGM4XHUzMGVhIHswfSBcdTMwOTJcdTUyNGFcdTk2NjRcdTMwNTdcdTMwN2VcdTMwNTkKK3dlYmFwcExvYWRlci5zdGFydGluZz1cdTMwNTNcdTMwNmVcdTMwZWRcdTMwZmNcdTMwYzBcdTMwOTJcdThkNzdcdTUyZDVcdTMwNTdcdTMwN2VcdTMwNTkKK3dlYmFwcExvYWRlci5zdG9wcGluZz1cdTMwNTNcdTMwNmVcdTMwZWRcdTMwZmNcdTMwYzBcdTMwOTJcdTUwNWNcdTZiNjJcdTMwNTdcdTMwN2VcdTMwNTkKK3dlYmFwcExvYWRlci5mYWlsTW9kaWZpZWRDaGVjaz1cdTU5MDlcdTY2ZjRcdThmZmRcdThkZTFcdTMwYThcdTMwZTlcdTMwZmNcdTMwNjdcdTMwNTkKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9sb2FkZXIvUmVsb2FkZXIuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9sb2FkZXIvUmVsb2FkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjE4YjUyCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2xvYWRlci9SZWxvYWRlci5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEubG9hZGVyOworCisKKy8qKgorICogSW50ZXJuYWwgaW50ZXJmYWNlIHRoYXQgPGNvZGU+Q2xhc3NMb2FkZXI8L2NvZGU+IGltcGxlbWVudGF0aW9ucyBtYXkKKyAqIG9wdGlvbmFsbHkgaW1wbGVtZW50IHRvIHN1cHBvcnQgdGhlIGF1dG8tcmVsb2FkIGZ1bmN0aW9uYWxpdHkgb2YKKyAqIHRoZSBjbGFzc2xvYWRlciBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbnRleHQuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBpbnRlcmZhY2UgUmVsb2FkZXIgeworCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBuZXcgcmVwb3NpdG9yeSB0byB0aGUgc2V0IG9mIHBsYWNlcyB0aGlzIENsYXNzTG9hZGVyIGNhbiBsb29rIGZvcgorICAgICAqIGNsYXNzZXMgdG8gYmUgbG9hZGVkLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcG9zaXRvcnkgTmFtZSBvZiBhIHNvdXJjZSBvZiBjbGFzc2VzIHRvIGJlIGxvYWRlZCwgc3VjaCBhcyBhCisgICAgICogIGRpcmVjdG9yeSBwYXRobmFtZSwgYSBKQVIgZmlsZSBwYXRobmFtZSwgb3IgYSBaSVAgZmlsZSBwYXRobmFtZQorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHNwZWNpZmllZCByZXBvc2l0b3J5IGlzCisgICAgICogIGludmFsaWQgb3IgZG9lcyBub3QgZXhpc3QKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRSZXBvc2l0b3J5KFN0cmluZyByZXBvc2l0b3J5KTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgU3RyaW5nIGFycmF5IG9mIHRoZSBjdXJyZW50IHJlcG9zaXRvcmllcyBmb3IgdGhpcyBjbGFzcworICAgICAqIGxvYWRlci4gIElmIHRoZXJlIGFyZSBubyByZXBvc2l0b3JpZXMsIGEgemVyby1sZW5ndGggYXJyYXkgaXMKKyAgICAgKiByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZmluZFJlcG9zaXRvcmllcygpOworCisKKyAgICAvKioKKyAgICAgKiBIYXZlIG9uZSBvciBtb3JlIGNsYXNzZXMgb3IgcmVzb3VyY2VzIGJlZW4gbW9kaWZpZWQgc28gdGhhdCBhIHJlbG9hZAorICAgICAqIGlzIGFwcHJvcHJpYXRlPworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIG1vZGlmaWVkKCk7CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2xvYWRlci9SZXNvdXJjZUVudHJ5LmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvbG9hZGVyL1Jlc291cmNlRW50cnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmRiNmM2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2xvYWRlci9SZXNvdXJjZUVudHJ5LmphdmEKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5sb2FkZXI7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlOworaW1wb3J0IGphdmEudXRpbC5qYXIuTWFuaWZlc3Q7CisKKy8qKgorICogUmVzb3VyY2UgZW50cnkuCisgKgorICogQGF1dGhvciBSZW15IE1hdWNoZXJhdAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworcHVibGljIGNsYXNzIFJlc291cmNlRW50cnkgeworCisKKyAgICAvKioKKyAgICAgKiBUaGUgImxhc3QgbW9kaWZpZWQiIHRpbWUgb2YgdGhlIG9yaWdpbiBmaWxlIGF0IHRoZSB0aW1lIHRoaXMgY2xhc3MKKyAgICAgKiB3YXMgbG9hZGVkLCBpbiBtaWxsaXNlY29uZHMgc2luY2UgdGhlIGVwb2NoLgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGxhc3RNb2RpZmllZCA9IC0xOworCisKKyAgICAvKioKKyAgICAgKiBCaW5hcnkgY29udGVudCBvZiB0aGUgcmVzb3VyY2UuCisgICAgICovCisgICAgcHVibGljIGJ5dGVbXSBiaW5hcnlDb250ZW50ID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogTG9hZGVkIGNsYXNzLgorICAgICAqLworICAgIHB1YmxpYyBDbGFzcyBsb2FkZWRDbGFzcyA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFVSTCBzb3VyY2UgZnJvbSB3aGVyZSB0aGUgb2JqZWN0IHdhcyBsb2FkZWQuCisgICAgICovCisgICAgcHVibGljIFVSTCBzb3VyY2UgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBVUkwgb2YgdGhlIGNvZGViYXNlIGZyb20gd2hlcmUgdGhlIG9iamVjdCB3YXMgbG9hZGVkLgorICAgICAqLworICAgIHB1YmxpYyBVUkwgY29kZUJhc2UgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBNYW5pZmVzdCAoaWYgdGhlIHJlc291cmNlIHdhcyBsb2FkZWQgZnJvbSBhIEpBUikuCisgICAgICovCisgICAgcHVibGljIE1hbmlmZXN0IG1hbmlmZXN0ID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogQ2VydGlmaWNhdGVzIChpZiB0aGUgcmVzb3VyY2Ugd2FzIGxvYWRlZCBmcm9tIGEgSkFSKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2VydGlmaWNhdGVbXSBjZXJ0aWZpY2F0ZXMgPSBudWxsOworCisKK30KKwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2xvYWRlci9TdGFuZGFyZENsYXNzTG9hZGVyLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvbG9hZGVyL1N0YW5kYXJkQ2xhc3NMb2FkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2E0ZmEyCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2xvYWRlci9TdGFuZGFyZENsYXNzTG9hZGVyLmphdmEKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5sb2FkZXI7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS5uZXQuVVJMQ2xhc3NMb2FkZXI7CisKKy8qKgorICogU3ViY2xhc3MgaW1wbGVtZW50YXRpb24gb2YgPGI+amF2YS5uZXQuVVJMQ2xhc3NMb2FkZXI8L2I+IHRoYXQga25vd3MgaG93CisgKiB0byBsb2FkIGNsYXNzZXMgZnJvbSBkaXNrIGRpcmVjdG9yaWVzLCBhcyB3ZWxsIGFzIGxvY2FsIGFuZCByZW1vdGUgSkFSCisgKiBmaWxlcy4gIEl0IGFsc28gaW1wbGVtZW50cyB0aGUgPGNvZGU+UmVsb2FkZXI8L2NvZGU+IGludGVyZmFjZSwgdG8gcHJvdmlkZQorICogYXV0b21hdGljIHJlbG9hZGluZyBzdXBwb3J0IHRvIHRoZSBhc3NvY2lhdGVkIGxvYWRlci4KKyAqIDxwPgorICogSW4gYWxsIGNhc2VzLCBVUkxzIG11c3QgY29uZm9ybSB0byB0aGUgY29udHJhY3Qgc3BlY2lmaWVkIGJ5CisgKiA8Y29kZT5VUkxDbGFzc0xvYWRlcjwvY29kZT4gLSBhbnkgVVJMIHRoYXQgZW5kcyB3aXRoIGEgIi8iIGNoYXJhY3RlciBpcworICogYXNzdW1lZCB0byByZXByZXNlbnQgYSBkaXJlY3Rvcnk7IGFsbCBvdGhlciBVUkxzIGFyZSBhc3N1bWVkIHRvIGJlIHRoZQorICogYWRkcmVzcyBvZiBhIEpBUiBmaWxlLgorICogPHA+CisgKiA8c3Ryb25nPklNUExFTUVOVEFUSU9OIE5PVEU8L3N0cm9uZz4gLSBMb2NhbCByZXBvc2l0b3JpZXMgYXJlIHNlYXJjaGVkIGluCisgKiB0aGUgb3JkZXIgdGhleSBhcmUgYWRkZWQgdmlhIHRoZSBpbml0aWFsIGNvbnN0cnVjdG9yIGFuZC9vciBhbnkgc3Vic2VxdWVudAorICogY2FsbHMgdG8gPGNvZGU+YWRkUmVwb3NpdG9yeSgpPC9jb2RlPi4KKyAqIDxwPgorICogPHN0cm9uZz5JTVBMRU1FTlRBVElPTiBOT1RFPC9zdHJvbmc+IC0gQXQgcHJlc2VudCwgdGhlcmUgYXJlIG5vIGRlcGVuZGVuY2llcworICogZnJvbSB0aGlzIGNsYXNzIHRvIGFueSBvdGhlciBDYXRhbGluYSBjbGFzcywgc28gdGhhdCBpdCBjb3VsZCBiZSB1c2VkCisgKiBpbmRlcGVuZGVudGx5LgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQGF1dGhvciBSZW15IE1hdWNoZXJhdAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgU3RhbmRhcmRDbGFzc0xvYWRlcgorICAgIGV4dGVuZHMgVVJMQ2xhc3NMb2FkZXIKKyAgICBpbXBsZW1lbnRzIFN0YW5kYXJkQ2xhc3NMb2FkZXJNQmVhbiB7CisKKwlwdWJsaWMgU3RhbmRhcmRDbGFzc0xvYWRlcihVUkwgcmVwb3NpdG9yaWVzW10pIHsKKyAgICAgICAgc3VwZXIocmVwb3NpdG9yaWVzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RhbmRhcmRDbGFzc0xvYWRlcihVUkwgcmVwb3NpdG9yaWVzW10sIENsYXNzTG9hZGVyIHBhcmVudCkgeworICAgICAgICBzdXBlcihyZXBvc2l0b3JpZXMsIHBhcmVudCk7CisgICAgfQorCit9CisKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9sb2FkZXIvU3RhbmRhcmRDbGFzc0xvYWRlck1CZWFuLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvbG9hZGVyL1N0YW5kYXJkQ2xhc3NMb2FkZXJNQmVhbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzNDVjMGQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvbG9hZGVyL1N0YW5kYXJkQ2xhc3NMb2FkZXJNQmVhbi5qYXZhCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEubG9hZGVyOworCisvKioKKyAqIE1CZWFuIGludGVyZmFjZSBmb3IgU3RhbmRhcmRDbGFzc0xvYWRlciwgdG8gYWxsb3cgSk1YIHJlbW90ZSBtYW5hZ2VtZW50LgorICoKKyAqIEBhdXRob3IgUmVteSBNYXVjaGVyYXQKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgU3RhbmRhcmRDbGFzc0xvYWRlck1CZWFuIHsKK30KKwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2xvYWRlci9XZWJhcHBDbGFzc0xvYWRlci5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2xvYWRlci9XZWJhcHBDbGFzc0xvYWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhZjU5ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvbG9hZGVyL1dlYmFwcENsYXNzTG9hZGVyLmphdmEKQEAgLTAsMCArMSwyMTMyIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmxvYWRlcjsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVQZXJtaXNzaW9uOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEubmV0LlVSTENsYXNzTG9hZGVyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5Db2RlU291cmNlOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb25Db2xsZWN0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUG9saWN5OworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwuamFyLkF0dHJpYnV0ZXM7CitpbXBvcnQgamF2YS51dGlsLmphci5KYXJFbnRyeTsKK2ltcG9ydCBqYXZhLnV0aWwuamFyLkphckZpbGU7CitpbXBvcnQgamF2YS51dGlsLmphci5NYW5pZmVzdDsKK2ltcG9ydCBqYXZhLnV0aWwuamFyLkF0dHJpYnV0ZXMuTmFtZTsKKworaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1lQ2xhc3NQYWlyOworaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1pbmdFbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm5hbWluZy5kaXJlY3RvcnkuRGlyQ29udGV4dDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLlN0cmluZ01hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5uYW1pbmcuSm5kaVBlcm1pc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5uYW1pbmcucmVzb3VyY2VzLlJlc291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUubmFtaW5nLnJlc291cmNlcy5SZXNvdXJjZUF0dHJpYnV0ZXM7CitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5jb21wYXQuSmRrQ29tcGF0OworCisvKioKKyAqIFNwZWNpYWxpemVkIHdlYiBhcHBsaWNhdGlvbiBjbGFzcyBsb2FkZXIuCisgKiA8cD4KKyAqIFRoaXMgY2xhc3MgbG9hZGVyIGlzIGEgZnVsbCByZWltcGxlbWVudGF0aW9uIG9mIHRoZSAKKyAqIDxjb2RlPlVSTENsYXNzTG9hZGVyPC9jb2RlPiBmcm9tIHRoZSBKREsuIEl0IGlzIGRlc2luZ2VkIHRvIGJlIGZ1bGx5CisgKiBjb21wYXRpYmxlIHdpdGggYSBub3JtYWwgPGNvZGU+VVJMQ2xhc3NMb2FkZXI8L2NvZGU+LCBhbHRob3VnaCBpdHMgaW50ZXJuYWwKKyAqIGJlaGF2aW9yIG1heSBiZSBjb21wbGV0ZWx5IGRpZmZlcmVudC4KKyAqIDxwPgorICogPHN0cm9uZz5JTVBMRU1FTlRBVElPTiBOT1RFPC9zdHJvbmc+IC0gVGhpcyBjbGFzcyBsb2FkZXIgZmFpdGhmdWxseSBmb2xsb3dzIAorICogdGhlIGRlbGVnYXRpb24gbW9kZWwgcmVjb21tZW5kZWQgaW4gdGhlIHNwZWNpZmljYXRpb24uIFRoZSBzeXN0ZW0gY2xhc3MgCisgKiBsb2FkZXIgd2lsbCBiZSBxdWVyaWVkIGZpcnN0LCB0aGVuIHRoZSBsb2NhbCByZXBvc2l0b3JpZXMsIGFuZCBvbmx5IHRoZW4gCisgKiBkZWxlZ2F0aW9uIHRvIHRoZSBwYXJlbnQgY2xhc3MgbG9hZGVyIHdpbGwgb2NjdXIuIFRoaXMgYWxsb3dzIHRoZSB3ZWIgCisgKiBhcHBsaWNhdGlvbiB0byBvdmVycmlkZSBhbnkgc2hhcmVkIGNsYXNzIGV4Y2VwdCB0aGUgY2xhc3NlcyBmcm9tIEoyU0UuCisgKiBTcGVjaWFsIGhhbmRsaW5nIGlzIHByb3ZpZGVkIGZyb20gdGhlIEpBWFAgWE1MIHBhcnNlciBpbnRlcmZhY2VzLCB0aGUgSk5ESQorICogaW50ZXJmYWNlcywgYW5kIHRoZSBjbGFzc2VzIGZyb20gdGhlIHNlcnZsZXQgQVBJLCB3aGljaCBhcmUgbmV2ZXIgbG9hZGVkIAorICogZnJvbSB0aGUgd2ViYXBwIHJlcG9zaXRvcnkuCisgKiA8cD4KKyAqIDxzdHJvbmc+SU1QTEVNRU5UQVRJT04gTk9URTwvc3Ryb25nPiAtIER1ZSB0byBsaW1pdGF0aW9ucyBpbiBKYXNwZXIgCisgKiBjb21waWxhdGlvbiB0ZWNobm9sb2d5LCBhbnkgcmVwb3NpdG9yeSB3aGljaCBjb250YWlucyBjbGFzc2VzIGZyb20gCisgKiB0aGUgc2VydmxldCBBUEkgd2lsbCBiZSBpZ25vcmVkIGJ5IHRoZSBjbGFzcyBsb2FkZXIuCisgKiA8cD4KKyAqIDxzdHJvbmc+SU1QTEVNRU5UQVRJT04gTk9URTwvc3Ryb25nPiAtIFRoZSBjbGFzcyBsb2FkZXIgZ2VuZXJhdGVzIHNvdXJjZQorICogVVJMcyB3aGljaCBpbmNsdWRlIHRoZSBmdWxsIEpBUiBVUkwgd2hlbiBhIGNsYXNzIGlzIGxvYWRlZCBmcm9tIGEgSkFSIGZpbGUsCisgKiB3aGljaCBhbGxvd3Mgc2V0dGluZyBzZWN1cml0eSBwZXJtaXNzaW9uIGF0IHRoZSBjbGFzcyBsZXZlbCwgZXZlbiB3aGVuIGEKKyAqIGNsYXNzIGlzIGNvbnRhaW5lZCBpbnNpZGUgYSBKQVIuCisgKiA8cD4KKyAqIDxzdHJvbmc+SU1QTEVNRU5UQVRJT04gTk9URTwvc3Ryb25nPiAtIExvY2FsIHJlcG9zaXRvcmllcyBhcmUgc2VhcmNoZWQgaW4KKyAqIHRoZSBvcmRlciB0aGV5IGFyZSBhZGRlZCB2aWEgdGhlIGluaXRpYWwgY29uc3RydWN0b3IgYW5kL29yIGFueSBzdWJzZXF1ZW50CisgKiBjYWxscyB0byA8Y29kZT5hZGRSZXBvc2l0b3J5KCk8L2NvZGU+IG9yIDxjb2RlPmFkZEphcigpPC9jb2RlPi4KKyAqIDxwPgorICogPHN0cm9uZz5JTVBMRU1FTlRBVElPTiBOT1RFPC9zdHJvbmc+IC0gTm8gY2hlY2sgZm9yIHNlYWxpbmcgdmlvbGF0aW9ucyBvcgorICogc2VjdXJpdHkgaXMgbWFkZSB1bmxlc3MgYSBzZWN1cml0eSBtYW5hZ2VyIGlzIHByZXNlbnQuCisgKgorICogQGF1dGhvciBSZW15IE1hdWNoZXJhdAorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCitwdWJsaWMgY2xhc3MgV2ViYXBwQ2xhc3NMb2FkZXIKKyAgICBleHRlbmRzIFVSTENsYXNzTG9hZGVyCisgICAgaW1wbGVtZW50cyBSZWxvYWRlciwgTGlmZWN5Y2xlCisgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGxvZz0KKyAgICAgICAgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeS5nZXRMb2coIFdlYmFwcENsYXNzTG9hZGVyLmNsYXNzICk7CisKKyAgICBwcm90ZWN0ZWQgY2xhc3MgUHJpdmlsZWdlZEZpbmRSZXNvdXJjZQorICAgICAgICBpbXBsZW1lbnRzIFByaXZpbGVnZWRBY3Rpb24geworCisgICAgICAgIHByaXZhdGUgRmlsZSBmaWxlOworICAgICAgICBwcml2YXRlIFN0cmluZyBwYXRoOworCisgICAgICAgIFByaXZpbGVnZWRGaW5kUmVzb3VyY2UoRmlsZSBmaWxlLCBTdHJpbmcgcGF0aCkgeworICAgICAgICAgICAgdGhpcy5maWxlID0gZmlsZTsKKyAgICAgICAgICAgIHRoaXMucGF0aCA9IHBhdGg7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKKyAgICAgICAgICAgIHJldHVybiBmaW5kUmVzb3VyY2VJbnRlcm5hbChmaWxlLCBwYXRoKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFN0YXRpYyBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIHNldCBvZiB0cmlnZ2VyIGNsYXNzZXMgdGhhdCB3aWxsIGNhdXNlIGEgcHJvcG9zZWQgcmVwb3NpdG9yeSBub3QKKyAgICAgKiB0byBiZSBhZGRlZCBpZiB0aGlzIGNsYXNzIGlzIHZpc2libGUgdG8gdGhlIGNsYXNzIGxvYWRlciB0aGF0IGxvYWRlZAorICAgICAqIHRoaXMgZmFjdG9yeSBjbGFzcy4gIFR5cGljYWxseSwgdHJpZ2dlciBjbGFzc2VzIHdpbGwgYmUgbGlzdGVkIGZvcgorICAgICAqIGNvbXBvbmVudHMgdGhhdCBoYXZlIGJlZW4gaW50ZWdyYXRlZCBpbnRvIHRoZSBKREsgZm9yIGxhdGVyIHZlcnNpb25zLAorICAgICAqIGJ1dCB3aGVyZSB0aGUgY29ycmVzcG9uZGluZyBKQVIgZmlsZXMgYXJlIHJlcXVpcmVkIHRvIHJ1biBvbgorICAgICAqIGVhcmxpZXIgdmVyc2lvbnMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gdHJpZ2dlcnMgPSB7CisgICAgICAgICJqYXZheC5zZXJ2bGV0LlNlcnZsZXQiICAgICAgICAgICAgICAgICAgICAgLy8gU2VydmxldCBBUEkKKyAgICB9OworCisgICAgLyoqIAorICAgICAqIEpkayBDb21wYXRpYmlsaXR5IFN1cHBvcnQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgSmRrQ29tcGF0IGpka0NvbXBhdCA9IEpka0NvbXBhdC5nZXRKZGtDb21wYXQoKTsKKworICAgIC8qKgorICAgICAqIFNldCBvZiBwYWNrYWdlIG5hbWVzIHdoaWNoIGFyZSBub3QgYWxsb3dlZCB0byBiZSBsb2FkZWQgZnJvbSBhIHdlYmFwcAorICAgICAqIGNsYXNzIGxvYWRlciB3aXRob3V0IGRlbGVnYXRpbmcgZmlyc3QuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gcGFja2FnZVRyaWdnZXJzID0geworICAgIH07CisKKworICAgIC8qKgorICAgICAqIFRoZSBzdHJpbmcgbWFuYWdlciBmb3IgdGhpcyBwYWNrYWdlLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nTWFuYWdlciBzbSA9CisgICAgICAgIFN0cmluZ01hbmFnZXIuZ2V0TWFuYWdlcihDb25zdGFudHMuUGFja2FnZSk7CisKKyAgICAKKyAgICAvKioKKyAgICAgKiBVc2UgYW50aSBKQVIgbG9ja2luZyBjb2RlLCB3aGljaCBkb2VzIFVSTCByZXJvdXRpbmcgd2hlbiBhY2Nlc3NpbmcKKyAgICAgKiByZXNvdXJjZXMuCisgICAgICovCisgICAgYm9vbGVhbiBhbnRpSkFSTG9ja2luZyA9IGZhbHNlOyAKKyAgICAKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgQ2xhc3NMb2FkZXIgd2l0aCBubyBkZWZpbmVkIHJlcG9zaXRvcmllcyBhbmQgbm8KKyAgICAgKiBwYXJlbnQgQ2xhc3NMb2FkZXIuCisgICAgICovCisgICAgcHVibGljIFdlYmFwcENsYXNzTG9hZGVyKCkgeworCisgICAgICAgIHN1cGVyKG5ldyBVUkxbMF0pOworICAgICAgICB0aGlzLnBhcmVudCA9IGdldFBhcmVudCgpOworICAgICAgICBzeXN0ZW0gPSBnZXRTeXN0ZW1DbGFzc0xvYWRlcigpOworICAgICAgICBzZWN1cml0eU1hbmFnZXIgPSBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCk7CisKKyAgICAgICAgaWYgKHNlY3VyaXR5TWFuYWdlciAhPSBudWxsKSB7CisgICAgICAgICAgICByZWZyZXNoUG9saWN5KCk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IENsYXNzTG9hZGVyIHdpdGggbm8gZGVmaW5lZCByZXBvc2l0b3JpZXMgYW5kIG5vCisgICAgICogcGFyZW50IENsYXNzTG9hZGVyLgorICAgICAqLworICAgIHB1YmxpYyBXZWJhcHBDbGFzc0xvYWRlcihDbGFzc0xvYWRlciBwYXJlbnQpIHsKKworICAgICAgICBzdXBlcihuZXcgVVJMWzBdLCBwYXJlbnQpOworICAgICAgICAgICAgICAgIAorICAgICAgICB0aGlzLnBhcmVudCA9IGdldFBhcmVudCgpOworICAgICAgICAKKyAgICAgICAgc3lzdGVtID0gZ2V0U3lzdGVtQ2xhc3NMb2FkZXIoKTsKKyAgICAgICAgc2VjdXJpdHlNYW5hZ2VyID0gU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpOworCisgICAgICAgIGlmIChzZWN1cml0eU1hbmFnZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgcmVmcmVzaFBvbGljeSgpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogQXNzb2NpYXRlZCBkaXJlY3RvcnkgY29udGV4dCBnaXZpbmcgYWNjZXNzIHRvIHRoZSByZXNvdXJjZXMgaW4gdGhpcworICAgICAqIHdlYmFwcC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRGlyQ29udGV4dCByZXNvdXJjZXMgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgY2FjaGUgb2YgUmVzb3VyY2VFbnRyeSBmb3IgY2xhc3NlcyBhbmQgcmVzb3VyY2VzIHdlIGhhdmUgbG9hZGVkLAorICAgICAqIGtleWVkIGJ5IHJlc291cmNlIG5hbWUuCisgICAgICovCisgICAgcHJvdGVjdGVkIEhhc2hNYXAgcmVzb3VyY2VFbnRyaWVzID0gbmV3IEhhc2hNYXAoKTsKKworCisgICAgLyoqCisgICAgICogVGhlIGxpc3Qgb2Ygbm90IGZvdW5kIHJlc291cmNlcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgSGFzaE1hcCBub3RGb3VuZFJlc291cmNlcyA9IG5ldyBIYXNoTWFwKCk7CisKKworICAgIC8qKgorICAgICAqIFNob3VsZCB0aGlzIGNsYXNzIGxvYWRlciBkZWxlZ2F0ZSB0byB0aGUgcGFyZW50IGNsYXNzIGxvYWRlcgorICAgICAqIDxzdHJvbmc+YmVmb3JlPC9zdHJvbmc+IHNlYXJjaGluZyBpdHMgb3duIHJlcG9zaXRvcmllcyAoaS5lLiB0aGUKKyAgICAgKiB1c3VhbCBKYXZhMiBkZWxlZ2F0aW9uIG1vZGVsKT8gIElmIHNldCB0byA8Y29kZT5mYWxzZTwvY29kZT4sCisgICAgICogdGhpcyBjbGFzcyBsb2FkZXIgd2lsbCBzZWFyY2ggaXRzIG93biByZXBvc2l0b3JpZXMgZmlyc3QsIGFuZAorICAgICAqIGRlbGVnYXRlIHRvIHRoZSBwYXJlbnQgb25seSBpZiB0aGUgY2xhc3Mgb3IgcmVzb3VyY2UgaXMgbm90CisgICAgICogZm91bmQgbG9jYWxseS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBkZWxlZ2F0ZSA9IGZhbHNlOworCisKKyAgICAvKioKKyAgICAgKiBMYXN0IHRpbWUgYSBKQVIgd2FzIGFjY2Vzc2VkLgorICAgICAqLworICAgIHByb3RlY3RlZCBsb25nIGxhc3RKYXJBY2Nlc3NlZCA9IDBMOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgbGlzdCBvZiBsb2NhbCByZXBvc2l0b3JpZXMsIGluIHRoZSBvcmRlciB0aGV5IHNob3VsZCBiZSBzZWFyY2hlZAorICAgICAqIGZvciBsb2NhbGx5IGxvYWRlZCBjbGFzc2VzIG9yIHJlc291cmNlcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nW10gcmVwb3NpdG9yaWVzID0gbmV3IFN0cmluZ1swXTsKKworCisgICAgIC8qKgorICAgICAgKiBSZXBvc2l0b3JpZXMgVVJMcywgdXNlZCB0byBjYWNoZSB0aGUgcmVzdWx0IG9mIGdldFVSTHMuCisgICAgICAqLworICAgICBwcm90ZWN0ZWQgVVJMW10gcmVwb3NpdG9yeVVSTHMgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBSZXBvc2l0b3JpZXMgdHJhbnNsYXRlZCBhcyBwYXRoIGluIHRoZSB3b3JrIGRpcmVjdG9yeSAoZm9yIEphc3BlcgorICAgICAqIG9yaWdpbmFsbHkpLCBidXQgd2hpY2ggaXMgdXNlZCB0byBnZW5lcmF0ZSBmYWtlIFVSTHMgc2hvdWxkIGdldFVSTHMgYmUKKyAgICAgKiBjYWxsZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIEZpbGVbXSBmaWxlcyA9IG5ldyBGaWxlWzBdOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgbGlzdCBvZiBKQVJzLCBpbiB0aGUgb3JkZXIgdGhleSBzaG91bGQgYmUgc2VhcmNoZWQKKyAgICAgKiBmb3IgbG9jYWxseSBsb2FkZWQgY2xhc3NlcyBvciByZXNvdXJjZXMuCisgICAgICovCisgICAgcHJvdGVjdGVkIEphckZpbGVbXSBqYXJGaWxlcyA9IG5ldyBKYXJGaWxlWzBdOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgbGlzdCBvZiBKQVJzLCBpbiB0aGUgb3JkZXIgdGhleSBzaG91bGQgYmUgc2VhcmNoZWQKKyAgICAgKiBmb3IgbG9jYWxseSBsb2FkZWQgY2xhc3NlcyBvciByZXNvdXJjZXMuCisgICAgICovCisgICAgcHJvdGVjdGVkIEZpbGVbXSBqYXJSZWFsRmlsZXMgPSBuZXcgRmlsZVswXTsKKworCisgICAgLyoqCisgICAgICogVGhlIHBhdGggd2hpY2ggd2lsbCBiZSBtb25pdG9yZWQgZm9yIGFkZGVkIEphciBmaWxlcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGphclBhdGggPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgbGlzdCBvZiBKQVJzLCBpbiB0aGUgb3JkZXIgdGhleSBzaG91bGQgYmUgc2VhcmNoZWQKKyAgICAgKiBmb3IgbG9jYWxseSBsb2FkZWQgY2xhc3NlcyBvciByZXNvdXJjZXMuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZ1tdIGphck5hbWVzID0gbmV3IFN0cmluZ1swXTsKKworCisgICAgLyoqCisgICAgICogVGhlIGxpc3Qgb2YgSkFScyBsYXN0IG1vZGlmaWVkIGRhdGVzLCBpbiB0aGUgb3JkZXIgdGhleSBzaG91bGQgYmUKKyAgICAgKiBzZWFyY2hlZCBmb3IgbG9jYWxseSBsb2FkZWQgY2xhc3NlcyBvciByZXNvdXJjZXMuCisgICAgICovCisgICAgcHJvdGVjdGVkIGxvbmdbXSBsYXN0TW9kaWZpZWREYXRlcyA9IG5ldyBsb25nWzBdOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgbGlzdCBvZiByZXNvdXJjZXMgd2hpY2ggc2hvdWxkIGJlIGNoZWNrZWQgd2hlbiBjaGVja2luZyBmb3IKKyAgICAgKiBtb2RpZmljYXRpb25zLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmdbXSBwYXRocyA9IG5ldyBTdHJpbmdbMF07CisKKworICAgIC8qKgorICAgICAqIEEgbGlzdCBvZiByZWFkIEZpbGUgYW5kIEpuZGkgUGVybWlzc2lvbidzIHJlcXVpcmVkIGlmIHRoaXMgbG9hZGVyCisgICAgICogaXMgZm9yIGEgd2ViIGFwcGxpY2F0aW9uIGNvbnRleHQuCisgICAgICovCisgICAgcHJpdmF0ZSBBcnJheUxpc3QgcGVybWlzc2lvbkxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisKKworICAgIC8qKgorICAgICAqIFBhdGggd2hlcmUgcmVzb3VyY2VzIGxvYWRlZCBmcm9tIEpBUnMgd2lsbCBiZSBleHRyYWN0ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBGaWxlIGxvYWRlckRpciA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBQZXJtaXNzaW9uQ29sbGVjdGlvbiBmb3IgZWFjaCBDb2RlU291cmNlIGZvciBhIHdlYgorICAgICAqIGFwcGxpY2F0aW9uIGNvbnRleHQuCisgICAgICovCisgICAgcHJpdmF0ZSBIYXNoTWFwIGxvYWRlclBDID0gbmV3IEhhc2hNYXAoKTsKKworCisgICAgLyoqCisgICAgICogSW5zdGFuY2Ugb2YgdGhlIFNlY3VyaXR5TWFuYWdlciBpbnN0YWxsZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBTZWN1cml0eU1hbmFnZXIgc2VjdXJpdHlNYW5hZ2VyID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIHBhcmVudCBjbGFzcyBsb2FkZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBDbGFzc0xvYWRlciBwYXJlbnQgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc3lzdGVtIGNsYXNzIGxvYWRlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIENsYXNzTG9hZGVyIHN5c3RlbSA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIEhhcyB0aGlzIGNvbXBvbmVudCBiZWVuIHN0YXJ0ZWQ/CisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gc3RhcnRlZCA9IGZhbHNlOworCisKKyAgICAvKioKKyAgICAgKiBIYXMgZXh0ZXJuYWwgcmVwb3NpdG9yaWVzLgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGhhc0V4dGVybmFsUmVwb3NpdG9yaWVzID0gZmFsc2U7CisKKworICAgIC8qKgorICAgICAqIEFsbCBwZXJtaXNzaW9uLgorICAgICAqLworICAgIHByaXZhdGUgUGVybWlzc2lvbiBhbGxQZXJtaXNzaW9uID0gbmV3IGphdmEuc2VjdXJpdHkuQWxsUGVybWlzc2lvbigpOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogR2V0IGFzc29jaWF0ZWQgcmVzb3VyY2VzLgorICAgICAqLworICAgIHB1YmxpYyBEaXJDb250ZXh0IGdldFJlc291cmNlcygpIHsKKworICAgICAgICByZXR1cm4gdGhpcy5yZXNvdXJjZXM7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCBhc3NvY2lhdGVkIHJlc291cmNlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZXMoRGlyQ29udGV4dCByZXNvdXJjZXMpIHsKKworICAgICAgICB0aGlzLnJlc291cmNlcyA9IHJlc291cmNlczsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSAiZGVsZWdhdGUgZmlyc3QiIGZsYWcgZm9yIHRoaXMgY2xhc3MgbG9hZGVyLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldERlbGVnYXRlKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5kZWxlZ2F0ZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgImRlbGVnYXRlIGZpcnN0IiBmbGFnIGZvciB0aGlzIGNsYXNzIGxvYWRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZWxlZ2F0ZSBUaGUgbmV3ICJkZWxlZ2F0ZSBmaXJzdCIgZmxhZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERlbGVnYXRlKGJvb2xlYW4gZGVsZWdhdGUpIHsKKworICAgICAgICB0aGlzLmRlbGVnYXRlID0gZGVsZWdhdGU7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgYW50aUpBUkxvY2tpbmcuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0QW50aUpBUkxvY2tpbmcoKSB7CisgICAgICAgIHJldHVybiBhbnRpSkFSTG9ja2luZzsKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogQHBhcmFtIGFudGlKQVJMb2NraW5nIFRoZSBhbnRpSkFSTG9ja2luZyB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QW50aUpBUkxvY2tpbmcoYm9vbGVhbiBhbnRpSkFSTG9ja2luZykgeworICAgICAgICB0aGlzLmFudGlKQVJMb2NraW5nID0gYW50aUpBUkxvY2tpbmc7CisgICAgfQorCisgICAgCisgICAgLyoqCisgICAgICogSWYgdGhlcmUgaXMgYSBKYXZhIFNlY3VyaXR5TWFuYWdlciBjcmVhdGUgYSByZWFkIEZpbGVQZXJtaXNzaW9uCisgICAgICogb3IgSm5kaVBlcm1pc3Npb24gZm9yIHRoZSBmaWxlIGRpcmVjdG9yeSBwYXRoLgorICAgICAqCisgICAgICogQHBhcmFtIHBhdGggZmlsZSBkaXJlY3RvcnkgcGF0aAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFBlcm1pc3Npb24oU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgaWYgKHBhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNlY3VyaXR5TWFuYWdlciAhPSBudWxsKSB7CisgICAgICAgICAgICBQZXJtaXNzaW9uIHBlcm1pc3Npb24gPSBudWxsOworICAgICAgICAgICAgaWYoIHBhdGguc3RhcnRzV2l0aCgiam5kaToiKSB8fCBwYXRoLnN0YXJ0c1dpdGgoImphcjpqbmRpOiIpICkgeworICAgICAgICAgICAgICAgIGlmICghcGF0aC5lbmRzV2l0aCgiLyIpKSB7CisgICAgICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoICsgIi8iOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwZXJtaXNzaW9uID0gbmV3IEpuZGlQZXJtaXNzaW9uKHBhdGggKyAiKiIpOworICAgICAgICAgICAgICAgIGFkZFBlcm1pc3Npb24ocGVybWlzc2lvbik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICghcGF0aC5lbmRzV2l0aChGaWxlLnNlcGFyYXRvcikpIHsKKyAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbiA9IG5ldyBGaWxlUGVybWlzc2lvbihwYXRoLCAicmVhZCIpOworICAgICAgICAgICAgICAgICAgICBhZGRQZXJtaXNzaW9uKHBlcm1pc3Npb24pOworICAgICAgICAgICAgICAgICAgICBwYXRoID0gcGF0aCArIEZpbGUuc2VwYXJhdG9yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwZXJtaXNzaW9uID0gbmV3IEZpbGVQZXJtaXNzaW9uKHBhdGggKyAiLSIsICJyZWFkIik7CisgICAgICAgICAgICAgICAgYWRkUGVybWlzc2lvbihwZXJtaXNzaW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogSWYgdGhlcmUgaXMgYSBKYXZhIFNlY3VyaXR5TWFuYWdlciBjcmVhdGUgYSByZWFkIEZpbGVQZXJtaXNzaW9uCisgICAgICogb3IgSm5kaVBlcm1pc3Npb24gZm9yIFVSTC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmwgVVJMIGZvciBhIGZpbGUgb3IgZGlyZWN0b3J5IG9uIGxvY2FsIHN5c3RlbQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFBlcm1pc3Npb24oVVJMIHVybCkgeworICAgICAgICBpZiAodXJsICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFkZFBlcm1pc3Npb24odXJsLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBJZiB0aGVyZSBpcyBhIEphdmEgU2VjdXJpdHlNYW5hZ2VyIGNyZWF0ZSBhIFBlcm1pc3Npb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGVybWlzc2lvbiBUaGUgcGVybWlzc2lvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFBlcm1pc3Npb24oUGVybWlzc2lvbiBwZXJtaXNzaW9uKSB7CisgICAgICAgIGlmICgoc2VjdXJpdHlNYW5hZ2VyICE9IG51bGwpICYmIChwZXJtaXNzaW9uICE9IG51bGwpKSB7CisgICAgICAgICAgICBwZXJtaXNzaW9uTGlzdC5hZGQocGVybWlzc2lvbik7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgSkFSIHBhdGguCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRKYXJQYXRoKCkgeworCisgICAgICAgIHJldHVybiB0aGlzLmphclBhdGg7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENoYW5nZSB0aGUgSmFyIHBhdGguCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SmFyUGF0aChTdHJpbmcgamFyUGF0aCkgeworCisgICAgICAgIHRoaXMuamFyUGF0aCA9IGphclBhdGg7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENoYW5nZSB0aGUgd29yayBkaXJlY3RvcnkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0V29ya0RpcihGaWxlIHdvcmtEaXIpIHsKKyAgICAgICAgdGhpcy5sb2FkZXJEaXIgPSBuZXcgRmlsZSh3b3JrRGlyLCAibG9hZGVyIik7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFJlbG9hZGVyIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogQWRkIGEgbmV3IHJlcG9zaXRvcnkgdG8gdGhlIHNldCBvZiBwbGFjZXMgdGhpcyBDbGFzc0xvYWRlciBjYW4gbG9vayBmb3IKKyAgICAgKiBjbGFzc2VzIHRvIGJlIGxvYWRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXBvc2l0b3J5IE5hbWUgb2YgYSBzb3VyY2Ugb2YgY2xhc3NlcyB0byBiZSBsb2FkZWQsIHN1Y2ggYXMgYQorICAgICAqICBkaXJlY3RvcnkgcGF0aG5hbWUsIGEgSkFSIGZpbGUgcGF0aG5hbWUsIG9yIGEgWklQIGZpbGUgcGF0aG5hbWUKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBzcGVjaWZpZWQgcmVwb3NpdG9yeSBpcworICAgICAqICBpbnZhbGlkIG9yIGRvZXMgbm90IGV4aXN0CisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkUmVwb3NpdG9yeShTdHJpbmcgcmVwb3NpdG9yeSkgeworCisgICAgICAgIC8vIElnbm9yZSBhbnkgb2YgdGhlIHN0YW5kYXJkIHJlcG9zaXRvcmllcywgYXMgdGhleSBhcmUgc2V0IHVwIHVzaW5nCisgICAgICAgIC8vIGVpdGhlciBhZGRKYXIgb3IgYWRkUmVwb3NpdG9yeQorICAgICAgICBpZiAocmVwb3NpdG9yeS5zdGFydHNXaXRoKCIvV0VCLUlORi9saWIiKQorICAgICAgICAgICAgfHwgcmVwb3NpdG9yeS5zdGFydHNXaXRoKCIvV0VCLUlORi9jbGFzc2VzIikpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgLy8gQWRkIHRoaXMgcmVwb3NpdG9yeSB0byBvdXIgdW5kZXJseWluZyBjbGFzcyBsb2FkZXIKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFVSTCB1cmwgPSBuZXcgVVJMKHJlcG9zaXRvcnkpOworICAgICAgICAgICAgc3VwZXIuYWRkVVJMKHVybCk7CisgICAgICAgICAgICBoYXNFeHRlcm5hbFJlcG9zaXRvcmllcyA9IHRydWU7CisgICAgICAgICAgICByZXBvc2l0b3J5VVJMcyA9IG51bGw7CisgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWFlID0gbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICgiSW52YWxpZCByZXBvc2l0b3J5OiAiICsgcmVwb3NpdG9yeSk7IAorICAgICAgICAgICAgamRrQ29tcGF0LmNoYWluRXhjZXB0aW9uKGlhZSwgZSk7CisgICAgICAgICAgICB0aHJvdyBpYWU7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQWRkIGEgbmV3IHJlcG9zaXRvcnkgdG8gdGhlIHNldCBvZiBwbGFjZXMgdGhpcyBDbGFzc0xvYWRlciBjYW4gbG9vayBmb3IKKyAgICAgKiBjbGFzc2VzIHRvIGJlIGxvYWRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXBvc2l0b3J5IE5hbWUgb2YgYSBzb3VyY2Ugb2YgY2xhc3NlcyB0byBiZSBsb2FkZWQsIHN1Y2ggYXMgYQorICAgICAqICBkaXJlY3RvcnkgcGF0aG5hbWUsIGEgSkFSIGZpbGUgcGF0aG5hbWUsIG9yIGEgWklQIGZpbGUgcGF0aG5hbWUKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBzcGVjaWZpZWQgcmVwb3NpdG9yeSBpcworICAgICAqICBpbnZhbGlkIG9yIGRvZXMgbm90IGV4aXN0CisgICAgICovCisgICAgc3luY2hyb25pemVkIHZvaWQgYWRkUmVwb3NpdG9yeShTdHJpbmcgcmVwb3NpdG9yeSwgRmlsZSBmaWxlKSB7CisKKyAgICAgICAgLy8gTm90ZSA6IFRoZXJlIHNob3VsZCBiZSBvbmx5IG9uZSAob2YgY291cnNlKSwgYnV0IEkgdGhpbmsgd2Ugc2hvdWxkCisgICAgICAgIC8vIGtlZXAgdGhpcyBhIGJpdCBnZW5lcmljCisKKyAgICAgICAgaWYgKHJlcG9zaXRvcnkgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoImFkZFJlcG9zaXRvcnkoIiArIHJlcG9zaXRvcnkgKyAiKSIpOworCisgICAgICAgIGludCBpOworCisgICAgICAgIC8vIEFkZCB0aGlzIHJlcG9zaXRvcnkgdG8gb3VyIGludGVybmFsIGxpc3QKKyAgICAgICAgU3RyaW5nW10gcmVzdWx0ID0gbmV3IFN0cmluZ1tyZXBvc2l0b3JpZXMubGVuZ3RoICsgMV07CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCByZXBvc2l0b3JpZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHJlc3VsdFtpXSA9IHJlcG9zaXRvcmllc1tpXTsKKyAgICAgICAgfQorICAgICAgICByZXN1bHRbcmVwb3NpdG9yaWVzLmxlbmd0aF0gPSByZXBvc2l0b3J5OworICAgICAgICByZXBvc2l0b3JpZXMgPSByZXN1bHQ7CisKKyAgICAgICAgLy8gQWRkIHRoZSBmaWxlIHRvIHRoZSBsaXN0CisgICAgICAgIEZpbGVbXSByZXN1bHQyID0gbmV3IEZpbGVbZmlsZXMubGVuZ3RoICsgMV07CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgcmVzdWx0MltpXSA9IGZpbGVzW2ldOworICAgICAgICB9CisgICAgICAgIHJlc3VsdDJbZmlsZXMubGVuZ3RoXSA9IGZpbGU7CisgICAgICAgIGZpbGVzID0gcmVzdWx0MjsKKworICAgIH0KKworCisgICAgc3luY2hyb25pemVkIHZvaWQgYWRkSmFyKFN0cmluZyBqYXIsIEphckZpbGUgamFyRmlsZSwgRmlsZSBmaWxlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIGlmIChqYXIgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKGphckZpbGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKGZpbGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoImFkZEphcigiICsgamFyICsgIikiKTsKKworICAgICAgICBpbnQgaTsKKworICAgICAgICBpZiAoKGphclBhdGggIT0gbnVsbCkgJiYgKGphci5zdGFydHNXaXRoKGphclBhdGgpKSkgeworCisgICAgICAgICAgICBTdHJpbmcgamFyTmFtZSA9IGphci5zdWJzdHJpbmcoamFyUGF0aC5sZW5ndGgoKSk7CisgICAgICAgICAgICB3aGlsZSAoamFyTmFtZS5zdGFydHNXaXRoKCIvIikpCisgICAgICAgICAgICAgICAgamFyTmFtZSA9IGphck5hbWUuc3Vic3RyaW5nKDEpOworCisgICAgICAgICAgICBTdHJpbmdbXSByZXN1bHQgPSBuZXcgU3RyaW5nW2phck5hbWVzLmxlbmd0aCArIDFdOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGphck5hbWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0W2ldID0gamFyTmFtZXNbaV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXN1bHRbamFyTmFtZXMubGVuZ3RoXSA9IGphck5hbWU7CisgICAgICAgICAgICBqYXJOYW1lcyA9IHJlc3VsdDsKKworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgLy8gUmVnaXN0ZXIgdGhlIEpBUiBmb3IgdHJhY2tpbmcKKworICAgICAgICAgICAgbG9uZyBsYXN0TW9kaWZpZWQgPQorICAgICAgICAgICAgICAgICgoUmVzb3VyY2VBdHRyaWJ1dGVzKSByZXNvdXJjZXMuZ2V0QXR0cmlidXRlcyhqYXIpKQorICAgICAgICAgICAgICAgIC5nZXRMYXN0TW9kaWZpZWQoKTsKKworICAgICAgICAgICAgU3RyaW5nW10gcmVzdWx0ID0gbmV3IFN0cmluZ1twYXRocy5sZW5ndGggKyAxXTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwYXRocy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIHJlc3VsdFtpXSA9IHBhdGhzW2ldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzdWx0W3BhdGhzLmxlbmd0aF0gPSBqYXI7CisgICAgICAgICAgICBwYXRocyA9IHJlc3VsdDsKKworICAgICAgICAgICAgbG9uZ1tdIHJlc3VsdDMgPSBuZXcgbG9uZ1tsYXN0TW9kaWZpZWREYXRlcy5sZW5ndGggKyAxXTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsYXN0TW9kaWZpZWREYXRlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIHJlc3VsdDNbaV0gPSBsYXN0TW9kaWZpZWREYXRlc1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3VsdDNbbGFzdE1vZGlmaWVkRGF0ZXMubGVuZ3RoXSA9IGxhc3RNb2RpZmllZDsKKyAgICAgICAgICAgIGxhc3RNb2RpZmllZERhdGVzID0gcmVzdWx0MzsKKworICAgICAgICB9IGNhdGNoIChOYW1pbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gSWdub3JlCisgICAgICAgIH0KKworICAgICAgICAvLyBJZiB0aGUgSkFSIGN1cnJlbnRseSBjb250YWlucyBpbnZhbGlkIGNsYXNzZXMsIGRvbid0IGFjdHVhbGx5IHVzZSBpdAorICAgICAgICAvLyBmb3IgY2xhc3Nsb2FkaW5nCisgICAgICAgIGlmICghdmFsaWRhdGVKYXJGaWxlKGZpbGUpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIEphckZpbGVbXSByZXN1bHQyID0gbmV3IEphckZpbGVbamFyRmlsZXMubGVuZ3RoICsgMV07CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBqYXJGaWxlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgcmVzdWx0MltpXSA9IGphckZpbGVzW2ldOworICAgICAgICB9CisgICAgICAgIHJlc3VsdDJbamFyRmlsZXMubGVuZ3RoXSA9IGphckZpbGU7CisgICAgICAgIGphckZpbGVzID0gcmVzdWx0MjsKKworICAgICAgICAvLyBBZGQgdGhlIGZpbGUgdG8gdGhlIGxpc3QKKyAgICAgICAgRmlsZVtdIHJlc3VsdDQgPSBuZXcgRmlsZVtqYXJSZWFsRmlsZXMubGVuZ3RoICsgMV07CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBqYXJSZWFsRmlsZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHJlc3VsdDRbaV0gPSBqYXJSZWFsRmlsZXNbaV07CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0NFtqYXJSZWFsRmlsZXMubGVuZ3RoXSA9IGZpbGU7CisgICAgICAgIGphclJlYWxGaWxlcyA9IHJlc3VsdDQ7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBTdHJpbmcgYXJyYXkgb2YgdGhlIGN1cnJlbnQgcmVwb3NpdG9yaWVzIGZvciB0aGlzIGNsYXNzCisgICAgICogbG9hZGVyLiAgSWYgdGhlcmUgYXJlIG5vIHJlcG9zaXRvcmllcywgYSB6ZXJvLWxlbmd0aCBhcnJheSBpcworICAgICAqIHJldHVybmVkLkZvciBzZWN1cml0eSByZWFzb24sIHJldHVybnMgYSBjbG9uZSBvZiB0aGUgQXJyYXkgKHNpbmNlIAorICAgICAqIFN0cmluZyBhcmUgaW1tdXRhYmxlKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZmluZFJlcG9zaXRvcmllcygpIHsKKworICAgICAgICByZXR1cm4gKChTdHJpbmdbXSlyZXBvc2l0b3JpZXMuY2xvbmUoKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEhhdmUgb25lIG9yIG1vcmUgY2xhc3NlcyBvciByZXNvdXJjZXMgYmVlbiBtb2RpZmllZCBzbyB0aGF0IGEgcmVsb2FkCisgICAgICogaXMgYXBwcm9wcmlhdGU/CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gbW9kaWZpZWQoKSB7CisKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmRlYnVnKCJtb2RpZmllZCgpIik7CisKKyAgICAgICAgLy8gQ2hlY2tpbmcgZm9yIG1vZGlmaWVkIGxvYWRlZCByZXNvdXJjZXMKKyAgICAgICAgaW50IGxlbmd0aCA9IHBhdGhzLmxlbmd0aDsKKworICAgICAgICAvLyBBIHJhcmUgcmFjZSBjb25kaXRpb24gY2FuIG9jY3VyIGluIHRoZSB1cGRhdGVzIG9mIHRoZSB0d28gYXJyYXlzCisgICAgICAgIC8vIEl0J3MgdG90YWxseSBvayBpZiB0aGUgbGF0ZXN0IGNsYXNzIGFkZGVkIGlzIG5vdCBjaGVja2VkIChpdCB3aWxsCisgICAgICAgIC8vIGJlIGNoZWNrZWQgdGhlIG5leHQgdGltZQorICAgICAgICBpbnQgbGVuZ3RoMiA9IGxhc3RNb2RpZmllZERhdGVzLmxlbmd0aDsKKyAgICAgICAgaWYgKGxlbmd0aCA+IGxlbmd0aDIpCisgICAgICAgICAgICBsZW5ndGggPSBsZW5ndGgyOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbG9uZyBsYXN0TW9kaWZpZWQgPQorICAgICAgICAgICAgICAgICAgICAoKFJlc291cmNlQXR0cmlidXRlcykgcmVzb3VyY2VzLmdldEF0dHJpYnV0ZXMocGF0aHNbaV0pKQorICAgICAgICAgICAgICAgICAgICAuZ2V0TGFzdE1vZGlmaWVkKCk7CisgICAgICAgICAgICAgICAgaWYgKGxhc3RNb2RpZmllZCAhPSBsYXN0TW9kaWZpZWREYXRlc1tpXSkgeworICAgICAgICAgICAgICAgICAgICBpZiggbG9nLmlzRGVidWdFbmFibGVkKCkgKSAKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiICBSZXNvdXJjZSAnIiArIHBhdGhzW2ldCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiJyB3YXMgbW9kaWZpZWQ7IERhdGUgaXMgbm93OiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBuZXcgamF2YS51dGlsLkRhdGUobGFzdE1vZGlmaWVkKSArICIgV2FzOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBuZXcgamF2YS51dGlsLkRhdGUobGFzdE1vZGlmaWVkRGF0ZXNbaV0pKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh0cnVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChOYW1pbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiICAgIFJlc291cmNlICciICsgcGF0aHNbaV0gKyAiJyBpcyBtaXNzaW5nIik7CisgICAgICAgICAgICAgICAgcmV0dXJuICh0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGxlbmd0aCA9IGphck5hbWVzLmxlbmd0aDsKKworICAgICAgICAvLyBDaGVjayBpZiBKQVJzIGhhdmUgYmVlbiBhZGRlZCBvciByZW1vdmVkCisgICAgICAgIGlmIChnZXRKYXJQYXRoKCkgIT0gbnVsbCkgeworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIE5hbWluZ0VudW1lcmF0aW9uIGVudW1lcmF0aW9uID0gcmVzb3VyY2VzLmxpc3RCaW5kaW5ncyhnZXRKYXJQYXRoKCkpOworICAgICAgICAgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoZW51bWVyYXRpb24uaGFzTW9yZUVsZW1lbnRzKCkgJiYgKGkgPCBsZW5ndGgpKSB7CisgICAgICAgICAgICAgICAgICAgIE5hbWVDbGFzc1BhaXIgbmNQYWlyID0gKE5hbWVDbGFzc1BhaXIpIGVudW1lcmF0aW9uLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gbmNQYWlyLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlIG5vbiBKQVJzIHByZXNlbnQgaW4gdGhlIGxpYiBmb2xkZXIKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFuYW1lLmVuZHNXaXRoKCIuamFyIikpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFuYW1lLmVxdWFscyhqYXJOYW1lc1tpXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1pc3NpbmcgSkFSCisgICAgICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbygiICAgIEFkZGl0aW9uYWwgSkFScyBoYXZlIGJlZW4gYWRkZWQgOiAnIiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbmFtZSArICInIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHRydWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGVudW1lcmF0aW9uLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChlbnVtZXJhdGlvbi5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTmFtZUNsYXNzUGFpciBuY1BhaXIgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTmFtZUNsYXNzUGFpcikgZW51bWVyYXRpb24ubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gbmNQYWlyLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFkZGl0aW9uYWwgbm9uLUpBUiBmaWxlcyBhcmUgYWxsb3dlZAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUuZW5kc1dpdGgoIi5qYXIiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlIHdhcyBtb3JlIEpBUnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbygiICAgIEFkZGl0aW9uYWwgSkFScyBoYXZlIGJlZW4gYWRkZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpIDwgamFyTmFtZXMubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlIHdhcyBsZXNzIEpBUnMKKyAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oIiAgICBBZGRpdGlvbmFsIEpBUnMgaGF2ZSBiZWVuIGFkZGVkIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAodHJ1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiICAgIEZhaWxlZCB0cmFja2luZyBtb2RpZmljYXRpb25zIG9mICciCisgICAgICAgICAgICAgICAgICAgICAgICArIGdldEphclBhdGgoKSArICInIik7CisgICAgICAgICAgICB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiICAgIEZhaWxlZCB0cmFja2luZyBtb2RpZmljYXRpb25zIG9mICciCisgICAgICAgICAgICAgICAgICAgICAgICAgICsgZ2V0SmFyUGF0aCgpICsgIicgOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICAvLyBObyBjbGFzc2VzIGhhdmUgYmVlbiBtb2RpZmllZAorICAgICAgICByZXR1cm4gKGZhbHNlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVuZGVyIGEgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiV2ViYXBwQ2xhc3NMb2FkZXJcclxuIik7CisgICAgICAgIHNiLmFwcGVuZCgiICBkZWxlZ2F0ZTogIik7CisgICAgICAgIHNiLmFwcGVuZChkZWxlZ2F0ZSk7CisgICAgICAgIHNiLmFwcGVuZCgiXHJcbiIpOworICAgICAgICBzYi5hcHBlbmQoIiAgcmVwb3NpdG9yaWVzOlxyXG4iKTsKKyAgICAgICAgaWYgKHJlcG9zaXRvcmllcyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcG9zaXRvcmllcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiICAgICIpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChyZXBvc2l0b3JpZXNbaV0pOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiXHJcbiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICh0aGlzLnBhcmVudCAhPSBudWxsKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIi0tLS0tLS0tLS0+IFBhcmVudCBDbGFzc2xvYWRlcjpcclxuIik7CisgICAgICAgICAgICBzYi5hcHBlbmQodGhpcy5wYXJlbnQudG9TdHJpbmcoKSk7CisgICAgICAgICAgICBzYi5hcHBlbmQoIlxyXG4iKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKHNiLnRvU3RyaW5nKCkpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENsYXNzTG9hZGVyIE1ldGhvZHMKKworCisgICAgIC8qKgorICAgICAgKiBBZGQgdGhlIHNwZWNpZmllZCBVUkwgdG8gdGhlIGNsYXNzbG9hZGVyLgorICAgICAgKi8KKyAgICAgcHJvdGVjdGVkIHZvaWQgYWRkVVJMKFVSTCB1cmwpIHsKKyAgICAgICAgIHN1cGVyLmFkZFVSTCh1cmwpOworICAgICAgICAgaGFzRXh0ZXJuYWxSZXBvc2l0b3JpZXMgPSB0cnVlOworICAgICAgICAgcmVwb3NpdG9yeVVSTHMgPSBudWxsOworICAgICB9CisKKworICAgIC8qKgorICAgICAqIEZpbmQgdGhlIHNwZWNpZmllZCBjbGFzcyBpbiBvdXIgbG9jYWwgcmVwb3NpdG9yaWVzLCBpZiBwb3NzaWJsZS4gIElmCisgICAgICogbm90IGZvdW5kLCB0aHJvdyA8Y29kZT5DbGFzc05vdEZvdW5kRXhjZXB0aW9uPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIGNsYXNzIHRvIGJlIGxvYWRlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGlmIHRoZSBjbGFzcyB3YXMgbm90IGZvdW5kCisgICAgICovCisgICAgcHVibGljIENsYXNzIGZpbmRDbGFzcyhTdHJpbmcgbmFtZSkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworCisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiICAgIGZpbmRDbGFzcygiICsgbmFtZSArICIpIik7CisKKyAgICAgICAgLy8gKDEpIFBlcm1pc3Npb24gdG8gZGVmaW5lIHRoaXMgY2xhc3Mgd2hlbiB1c2luZyBhIFNlY3VyaXR5TWFuYWdlcgorICAgICAgICBpZiAoc2VjdXJpdHlNYW5hZ2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGludCBpID0gbmFtZS5sYXN0SW5kZXhPZignLicpOworICAgICAgICAgICAgaWYgKGkgPj0gMCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy50cmFjZSgiICAgICAgc2VjdXJpdHlNYW5hZ2VyLmNoZWNrUGFja2FnZURlZmluaXRpb24iKTsKKyAgICAgICAgICAgICAgICAgICAgc2VjdXJpdHlNYW5hZ2VyLmNoZWNrUGFja2FnZURlZmluaXRpb24obmFtZS5zdWJzdHJpbmcoMCxpKSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIHNlKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy50cmFjZSgiICAgICAgLS0+RXhjZXB0aW9uLS0+Q2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiIsIHNlKTsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENsYXNzTm90Rm91bmRFeGNlcHRpb24obmFtZSwgc2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEFzayBvdXIgc3VwZXJjbGFzcyB0byBsb2NhdGUgdGhpcyBjbGFzcywgaWYgcG9zc2libGUKKyAgICAgICAgLy8gKHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGlmIGl0IGlzIG5vdCBmb3VuZCkKKyAgICAgICAgQ2xhc3MgY2xhenogPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy50cmFjZSgiICAgICAgZmluZENsYXNzSW50ZXJuYWwoIiArIG5hbWUgKyAiKSIpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjbGF6eiA9IGZpbmRDbGFzc0ludGVybmFsKG5hbWUpOworICAgICAgICAgICAgfSBjYXRjaChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGNuZmUpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWhhc0V4dGVybmFsUmVwb3NpdG9yaWVzKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IGNuZmU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaChBY2Nlc3NDb250cm9sRXhjZXB0aW9uIGFjZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKG5hbWUsIGFjZSk7CisgICAgICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIGxvZy50cmFjZSgiICAgICAgLS0+UnVudGltZUV4Y2VwdGlvbiBSZXRocm93biIsIGUpOworICAgICAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKGNsYXp6ID09IG51bGwpICYmIGhhc0V4dGVybmFsUmVwb3NpdG9yaWVzKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgY2xhenogPSBzdXBlci5maW5kQ2xhc3MobmFtZSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaChBY2Nlc3NDb250cm9sRXhjZXB0aW9uIGFjZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbihuYW1lLCBhY2UpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBsb2cudHJhY2UoIiAgICAgIC0tPlJ1bnRpbWVFeGNlcHRpb24gUmV0aHJvd24iLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2xhenogPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgICAgLS0+IFJldHVybmluZyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIik7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENsYXNzTm90Rm91bmRFeGNlcHRpb24obmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy50cmFjZSgiICAgIC0tPiBQYXNzaW5nIG9uIENsYXNzTm90Rm91bmRFeGNlcHRpb24iKTsKKyAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXR1cm4gdGhlIGNsYXNzIHdlIGhhdmUgbG9jYXRlZAorICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoIiAgICAgIFJldHVybmluZyBjbGFzcyAiICsgY2xhenopOworICAgICAgICBpZiAoKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSAmJiAoY2xhenogIT0gbnVsbCkpCisgICAgICAgICAgICBsb2cuZGVidWcoIiAgICAgIExvYWRlZCBieSAiICsgY2xhenouZ2V0Q2xhc3NMb2FkZXIoKSk7CisgICAgICAgIHJldHVybiAoY2xhenopOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBGaW5kIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UgaW4gb3VyIGxvY2FsIHJlcG9zaXRvcnksIGFuZCByZXR1cm4gYQorICAgICAqIDxjb2RlPlVSTDwvY29kZT4gcmVmZXJpbmcgdG8gaXQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgcmVzb3VyY2UKKyAgICAgKiBjYW5ub3QgYmUgZm91bmQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSByZXNvdXJjZSB0byBiZSBmb3VuZAorICAgICAqLworICAgIHB1YmxpYyBVUkwgZmluZFJlc291cmNlKGZpbmFsIFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmRlYnVnKCIgICAgZmluZFJlc291cmNlKCIgKyBuYW1lICsgIikiKTsKKworICAgICAgICBVUkwgdXJsID0gbnVsbDsKKworICAgICAgICBSZXNvdXJjZUVudHJ5IGVudHJ5ID0gKFJlc291cmNlRW50cnkpIHJlc291cmNlRW50cmllcy5nZXQobmFtZSk7CisgICAgICAgIGlmIChlbnRyeSA9PSBudWxsKSB7CisgICAgICAgICAgICBlbnRyeSA9IGZpbmRSZXNvdXJjZUludGVybmFsKG5hbWUsIG5hbWUpOworICAgICAgICB9CisgICAgICAgIGlmIChlbnRyeSAhPSBudWxsKSB7CisgICAgICAgICAgICB1cmwgPSBlbnRyeS5zb3VyY2U7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKHVybCA9PSBudWxsKSAmJiBoYXNFeHRlcm5hbFJlcG9zaXRvcmllcykKKyAgICAgICAgICAgIHVybCA9IHN1cGVyLmZpbmRSZXNvdXJjZShuYW1lKTsKKworICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIGlmICh1cmwgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiAgICAtLT4gUmV0dXJuaW5nICciICsgdXJsLnRvU3RyaW5nKCkgKyAiJyIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiICAgIC0tPiBSZXNvdXJjZSBub3QgZm91bmQsIHJldHVybmluZyBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICh1cmwpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYW4gZW51bWVyYXRpb24gb2YgPGNvZGU+VVJMczwvY29kZT4gcmVwcmVzZW50aW5nIGFsbCBvZiB0aGUKKyAgICAgKiByZXNvdXJjZXMgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4gIElmIG5vIHJlc291cmNlcyB3aXRoIHRoaXMgbmFtZSBhcmUKKyAgICAgKiBmb3VuZCwgcmV0dXJuIGFuIGVtcHR5IGVudW1lcmF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgcmVzb3VyY2VzIHRvIGJlIGZvdW5kCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgRW51bWVyYXRpb24gZmluZFJlc291cmNlcyhTdHJpbmcgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoIiAgICBmaW5kUmVzb3VyY2VzKCIgKyBuYW1lICsgIikiKTsKKworICAgICAgICBWZWN0b3IgcmVzdWx0ID0gbmV3IFZlY3RvcigpOworCisgICAgICAgIGludCBqYXJGaWxlc0xlbmd0aCA9IGphckZpbGVzLmxlbmd0aDsKKyAgICAgICAgaW50IHJlcG9zaXRvcmllc0xlbmd0aCA9IHJlcG9zaXRvcmllcy5sZW5ndGg7CisKKyAgICAgICAgaW50IGk7CisKKyAgICAgICAgLy8gTG9va2luZyBhdCB0aGUgcmVwb3NpdG9yaWVzCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCByZXBvc2l0b3JpZXNMZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZnVsbFBhdGggPSByZXBvc2l0b3JpZXNbaV0gKyBuYW1lOworICAgICAgICAgICAgICAgIHJlc291cmNlcy5sb29rdXAoZnVsbFBhdGgpOworICAgICAgICAgICAgICAgIC8vIE5vdGUgOiBOb3QgZ2V0dGluZyBhbiBleGNlcHRpb24gaGVyZSBtZWFucyB0aGUgcmVzb3VyY2Ugd2FzCisgICAgICAgICAgICAgICAgLy8gZm91bmQKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkRWxlbWVudChnZXRVUkkobmV3IEZpbGUoZmlsZXNbaV0sIG5hbWUpKSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIExvb2tpbmcgYXQgdGhlIEpBUiBmaWxlcworICAgICAgICBzeW5jaHJvbml6ZWQgKGphckZpbGVzKSB7CisgICAgICAgICAgICBvcGVuSkFScygpOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGphckZpbGVzTGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBKYXJFbnRyeSBqYXJFbnRyeSA9IGphckZpbGVzW2ldLmdldEphckVudHJ5KG5hbWUpOworICAgICAgICAgICAgICAgIGlmIChqYXJFbnRyeSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgamFyRmFrZVVybCA9IGdldFVSSShqYXJSZWFsRmlsZXNbaV0pLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBqYXJGYWtlVXJsID0gImphcjoiICsgamFyRmFrZVVybCArICIhLyIgKyBuYW1lOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEVsZW1lbnQobmV3IFVSTChqYXJGYWtlVXJsKSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEFkZGluZyB0aGUgcmVzdWx0cyBvZiBhIGNhbGwgdG8gdGhlIHN1cGVyY2xhc3MKKyAgICAgICAgaWYgKGhhc0V4dGVybmFsUmVwb3NpdG9yaWVzKSB7CisKKyAgICAgICAgICAgIEVudW1lcmF0aW9uIG90aGVyUmVzb3VyY2VQYXRocyA9IHN1cGVyLmZpbmRSZXNvdXJjZXMobmFtZSk7CisKKyAgICAgICAgICAgIHdoaWxlIChvdGhlclJlc291cmNlUGF0aHMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkRWxlbWVudChvdGhlclJlc291cmNlUGF0aHMubmV4dEVsZW1lbnQoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXN1bHQuZWxlbWVudHMoKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogRmluZCB0aGUgcmVzb3VyY2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4gIEEgcmVzb3VyY2UgaXMgc29tZSBkYXRhCisgICAgICogKGltYWdlcywgYXVkaW8sIHRleHQsIGV0Yy4pIHRoYXQgY2FuIGJlIGFjY2Vzc2VkIGJ5IGNsYXNzIGNvZGUgaW4gYQorICAgICAqIHdheSB0aGF0IGlzIGluZGVwZW5kZW50IG9mIHRoZSBsb2NhdGlvbiBvZiB0aGUgY29kZS4gIFRoZSBuYW1lIG9mIGEKKyAgICAgKiByZXNvdXJjZSBpcyBhICIvIi1zZXBhcmF0ZWQgcGF0aCBuYW1lIHRoYXQgaWRlbnRpZmllcyB0aGUgcmVzb3VyY2UuCisgICAgICogSWYgdGhlIHJlc291cmNlIGNhbm5vdCBiZSBmb3VuZCwgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIDxwPgorICAgICAqIFRoaXMgbWV0aG9kIHNlYXJjaGVzIGFjY29yZGluZyB0byB0aGUgZm9sbG93aW5nIGFsZ29yaXRobSwgcmV0dXJuaW5nCisgICAgICogYXMgc29vbiBhcyBpdCBmaW5kcyB0aGUgYXBwcm9wcmlhdGUgVVJMLiAgSWYgdGhlIHJlc291cmNlIGNhbm5vdCBiZQorICAgICAqIGZvdW5kLCByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+SWYgdGhlIDxjb2RlPmRlbGVnYXRlPC9jb2RlPiBwcm9wZXJ0eSBpcyBzZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4sCisgICAgICogICAgIGNhbGwgdGhlIDxjb2RlPmdldFJlc291cmNlKCk8L2NvZGU+IG1ldGhvZCBvZiB0aGUgcGFyZW50IGNsYXNzCisgICAgICogICAgIGxvYWRlciwgaWYgYW55LjwvbGk+CisgICAgICogPGxpPkNhbGwgPGNvZGU+ZmluZFJlc291cmNlKCk8L2NvZGU+IHRvIGZpbmQgdGhpcyByZXNvdXJjZSBpbiBvdXIKKyAgICAgKiAgICAgbG9jYWxseSBkZWZpbmVkIHJlcG9zaXRvcmllcy48L2xpPgorICAgICAqIDxsaT5DYWxsIHRoZSA8Y29kZT5nZXRSZXNvdXJjZSgpPC9jb2RlPiBtZXRob2Qgb2YgdGhlIHBhcmVudCBjbGFzcworICAgICAqICAgICBsb2FkZXIsIGlmIGFueS48L2xpPgorICAgICAqIDwvdWw+CisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSByZXNvdXJjZSB0byByZXR1cm4gYSBVUkwgZm9yCisgICAgICovCisgICAgcHVibGljIFVSTCBnZXRSZXNvdXJjZShTdHJpbmcgbmFtZSkgeworCisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiZ2V0UmVzb3VyY2UoIiArIG5hbWUgKyAiKSIpOworICAgICAgICBVUkwgdXJsID0gbnVsbDsKKworICAgICAgICAvLyAoMSkgRGVsZWdhdGUgdG8gcGFyZW50IGlmIHJlcXVlc3RlZAorICAgICAgICBpZiAoZGVsZWdhdGUpIHsKKyAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiAgRGVsZWdhdGluZyB0byBwYXJlbnQgY2xhc3Nsb2FkZXIgIiArIHBhcmVudCk7CisgICAgICAgICAgICBDbGFzc0xvYWRlciBsb2FkZXIgPSBwYXJlbnQ7CisgICAgICAgICAgICBpZiAobG9hZGVyID09IG51bGwpCisgICAgICAgICAgICAgICAgbG9hZGVyID0gc3lzdGVtOworICAgICAgICAgICAgdXJsID0gbG9hZGVyLmdldFJlc291cmNlKG5hbWUpOworICAgICAgICAgICAgaWYgKHVybCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiAgLS0+IFJldHVybmluZyAnIiArIHVybC50b1N0cmluZygpICsgIiciKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKHVybCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyAoMikgU2VhcmNoIGxvY2FsIHJlcG9zaXRvcmllcworICAgICAgICB1cmwgPSBmaW5kUmVzb3VyY2UobmFtZSk7CisgICAgICAgIGlmICh1cmwgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gTG9jYXRpbmcgdGhlIHJlcG9zaXRvcnkgZm9yIHNwZWNpYWwgaGFuZGxpbmcgaW4gdGhlIGNhc2UgCisgICAgICAgICAgICAvLyBvZiBhIEpBUgorICAgICAgICAgICAgaWYgKGFudGlKQVJMb2NraW5nKSB7CisgICAgICAgICAgICAgICAgUmVzb3VyY2VFbnRyeSBlbnRyeSA9IChSZXNvdXJjZUVudHJ5KSByZXNvdXJjZUVudHJpZXMuZ2V0KG5hbWUpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyByZXBvc2l0b3J5ID0gZW50cnkuY29kZUJhc2UudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChyZXBvc2l0b3J5LmVuZHNXaXRoKCIuamFyIikpIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICghKG5hbWUuZW5kc1dpdGgoIi5jbGFzcyIpKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvcHkgYmluYXJ5IGNvbnRlbnQgdG8gdGhlIHdvcmsgZGlyZWN0b3J5IGlmIG5vdCBwcmVzZW50CisgICAgICAgICAgICAgICAgICAgICAgICBGaWxlIHJlc291cmNlRmlsZSA9IG5ldyBGaWxlKGxvYWRlckRpciwgbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB1cmwgPSByZXNvdXJjZUZpbGUudG9VUkwoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiAgLS0+IFJldHVybmluZyAnIiArIHVybC50b1N0cmluZygpICsgIiciKTsKKyAgICAgICAgICAgIHJldHVybiAodXJsKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vICgzKSBEZWxlZ2F0ZSB0byBwYXJlbnQgdW5jb25kaXRpb25hbGx5IGlmIG5vdCBhbHJlYWR5IGF0dGVtcHRlZAorICAgICAgICBpZiggIWRlbGVnYXRlICkgeworICAgICAgICAgICAgQ2xhc3NMb2FkZXIgbG9hZGVyID0gcGFyZW50OworICAgICAgICAgICAgaWYgKGxvYWRlciA9PSBudWxsKQorICAgICAgICAgICAgICAgIGxvYWRlciA9IHN5c3RlbTsKKyAgICAgICAgICAgIHVybCA9IGxvYWRlci5nZXRSZXNvdXJjZShuYW1lKTsKKyAgICAgICAgICAgIGlmICh1cmwgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgIC0tPiBSZXR1cm5pbmcgJyIgKyB1cmwudG9TdHJpbmcoKSArICInIik7CisgICAgICAgICAgICAgICAgcmV0dXJuICh1cmwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gKDQpIFJlc291cmNlIHdhcyBub3QgZm91bmQKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmRlYnVnKCIgIC0tPiBSZXNvdXJjZSBub3QgZm91bmQsIHJldHVybmluZyBudWxsIik7CisgICAgICAgIHJldHVybiAobnVsbCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEZpbmQgdGhlIHJlc291cmNlIHdpdGggdGhlIGdpdmVuIG5hbWUsIGFuZCByZXR1cm4gYW4gaW5wdXQgc3RyZWFtCisgICAgICogdGhhdCBjYW4gYmUgdXNlZCBmb3IgcmVhZGluZyBpdC4gIFRoZSBzZWFyY2ggb3JkZXIgaXMgYXMgZGVzY3JpYmVkCisgICAgICogZm9yIDxjb2RlPmdldFJlc291cmNlKCk8L2NvZGU+LCBhZnRlciBjaGVja2luZyB0byBzZWUgaWYgdGhlIHJlc291cmNlCisgICAgICogZGF0YSBoYXMgYmVlbiBwcmV2aW91c2x5IGNhY2hlZC4gIElmIHRoZSByZXNvdXJjZSBjYW5ub3QgYmUgZm91bmQsCisgICAgICogcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgcmVzb3VyY2UgdG8gcmV0dXJuIGFuIGlucHV0IHN0cmVhbSBmb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0UmVzb3VyY2VBc1N0cmVhbShTdHJpbmcgbmFtZSkgeworCisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiZ2V0UmVzb3VyY2VBc1N0cmVhbSgiICsgbmFtZSArICIpIik7CisgICAgICAgIElucHV0U3RyZWFtIHN0cmVhbSA9IG51bGw7CisKKyAgICAgICAgLy8gKDApIENoZWNrIGZvciBhIGNhY2hlZCBjb3B5IG9mIHRoaXMgcmVzb3VyY2UKKyAgICAgICAgc3RyZWFtID0gZmluZExvYWRlZFJlc291cmNlKG5hbWUpOworICAgICAgICBpZiAoc3RyZWFtICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiAgLS0+IFJldHVybmluZyBzdHJlYW0gZnJvbSBjYWNoZSIpOworICAgICAgICAgICAgcmV0dXJuIChzdHJlYW0pOworICAgICAgICB9CisKKyAgICAgICAgLy8gKDEpIERlbGVnYXRlIHRvIHBhcmVudCBpZiByZXF1ZXN0ZWQKKyAgICAgICAgaWYgKGRlbGVnYXRlKSB7CisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgIERlbGVnYXRpbmcgdG8gcGFyZW50IGNsYXNzbG9hZGVyICIgKyBwYXJlbnQpOworICAgICAgICAgICAgQ2xhc3NMb2FkZXIgbG9hZGVyID0gcGFyZW50OworICAgICAgICAgICAgaWYgKGxvYWRlciA9PSBudWxsKQorICAgICAgICAgICAgICAgIGxvYWRlciA9IHN5c3RlbTsKKyAgICAgICAgICAgIHN0cmVhbSA9IGxvYWRlci5nZXRSZXNvdXJjZUFzU3RyZWFtKG5hbWUpOworICAgICAgICAgICAgaWYgKHN0cmVhbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gRklYTUUgLSBjYWNoZT8/PworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgIC0tPiBSZXR1cm5pbmcgc3RyZWFtIGZyb20gcGFyZW50Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIChzdHJlYW0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gKDIpIFNlYXJjaCBsb2NhbCByZXBvc2l0b3JpZXMKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmRlYnVnKCIgIFNlYXJjaGluZyBsb2NhbCByZXBvc2l0b3JpZXMiKTsKKyAgICAgICAgVVJMIHVybCA9IGZpbmRSZXNvdXJjZShuYW1lKTsKKyAgICAgICAgaWYgKHVybCAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBGSVhNRSAtIGNhY2hlPz8/CisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgIC0tPiBSZXR1cm5pbmcgc3RyZWFtIGZyb20gbG9jYWwiKTsKKyAgICAgICAgICAgIHN0cmVhbSA9IGZpbmRMb2FkZWRSZXNvdXJjZShuYW1lKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYgKGhhc0V4dGVybmFsUmVwb3NpdG9yaWVzICYmIChzdHJlYW0gPT0gbnVsbCkpCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA9IHVybC5vcGVuU3RyZWFtKCk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgOyAvLyBJZ25vcmUKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdHJlYW0gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gKHN0cmVhbSk7CisgICAgICAgIH0KKworICAgICAgICAvLyAoMykgRGVsZWdhdGUgdG8gcGFyZW50IHVuY29uZGl0aW9uYWxseQorICAgICAgICBpZiAoIWRlbGVnYXRlKSB7CisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgIERlbGVnYXRpbmcgdG8gcGFyZW50IGNsYXNzbG9hZGVyIHVuY29uZGl0aW9uYWxseSAiICsgcGFyZW50KTsKKyAgICAgICAgICAgIENsYXNzTG9hZGVyIGxvYWRlciA9IHBhcmVudDsKKyAgICAgICAgICAgIGlmIChsb2FkZXIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBsb2FkZXIgPSBzeXN0ZW07CisgICAgICAgICAgICBzdHJlYW0gPSBsb2FkZXIuZ2V0UmVzb3VyY2VBc1N0cmVhbShuYW1lKTsKKyAgICAgICAgICAgIGlmIChzdHJlYW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIEZJWE1FIC0gY2FjaGU/Pz8KKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiICAtLT4gUmV0dXJuaW5nIHN0cmVhbSBmcm9tIHBhcmVudCIpOworICAgICAgICAgICAgICAgIHJldHVybiAoc3RyZWFtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vICg0KSBSZXNvdXJjZSB3YXMgbm90IGZvdW5kCisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiICAtLT4gUmVzb3VyY2Ugbm90IGZvdW5kLCByZXR1cm5pbmcgbnVsbCIpOworICAgICAgICByZXR1cm4gKG51bGwpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBMb2FkIHRoZSBjbGFzcyB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4gIFRoaXMgbWV0aG9kIHNlYXJjaGVzIGZvcgorICAgICAqIGNsYXNzZXMgaW4gdGhlIHNhbWUgbWFubmVyIGFzIDxjb2RlPmxvYWRDbGFzcyhTdHJpbmcsIGJvb2xlYW4pPC9jb2RlPgorICAgICAqIHdpdGggPGNvZGU+ZmFsc2U8L2NvZGU+IGFzIHRoZSBzZWNvbmQgYXJndW1lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBjbGFzcyB0byBiZSBsb2FkZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBpZiB0aGUgY2xhc3Mgd2FzIG5vdCBmb3VuZAorICAgICAqLworICAgIHB1YmxpYyBDbGFzcyBsb2FkQ2xhc3MoU3RyaW5nIG5hbWUpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKworICAgICAgICByZXR1cm4gKGxvYWRDbGFzcyhuYW1lLCBmYWxzZSkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBMb2FkIHRoZSBjbGFzcyB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSwgc2VhcmNoaW5nIHVzaW5nIHRoZSBmb2xsb3dpbmcKKyAgICAgKiBhbGdvcml0aG0gdW50aWwgaXQgZmluZHMgYW5kIHJldHVybnMgdGhlIGNsYXNzLiAgSWYgdGhlIGNsYXNzIGNhbm5vdAorICAgICAqIGJlIGZvdW5kLCByZXR1cm5zIDxjb2RlPkNsYXNzTm90Rm91bmRFeGNlcHRpb248L2NvZGU+LgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+Q2FsbCA8Y29kZT5maW5kTG9hZGVkQ2xhc3MoU3RyaW5nKTwvY29kZT4gdG8gY2hlY2sgaWYgdGhlCisgICAgICogICAgIGNsYXNzIGhhcyBhbHJlYWR5IGJlZW4gbG9hZGVkLiAgSWYgaXQgaGFzLCB0aGUgc2FtZQorICAgICAqICAgICA8Y29kZT5DbGFzczwvY29kZT4gb2JqZWN0IGlzIHJldHVybmVkLjwvbGk+CisgICAgICogPGxpPklmIHRoZSA8Y29kZT5kZWxlZ2F0ZTwvY29kZT4gcHJvcGVydHkgaXMgc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+LAorICAgICAqICAgICBjYWxsIHRoZSA8Y29kZT5sb2FkQ2xhc3MoKTwvY29kZT4gbWV0aG9kIG9mIHRoZSBwYXJlbnQgY2xhc3MKKyAgICAgKiAgICAgbG9hZGVyLCBpZiBhbnkuPC9saT4KKyAgICAgKiA8bGk+Q2FsbCA8Y29kZT5maW5kQ2xhc3MoKTwvY29kZT4gdG8gZmluZCB0aGlzIGNsYXNzIGluIG91ciBsb2NhbGx5CisgICAgICogICAgIGRlZmluZWQgcmVwb3NpdG9yaWVzLjwvbGk+CisgICAgICogPGxpPkNhbGwgdGhlIDxjb2RlPmxvYWRDbGFzcygpPC9jb2RlPiBtZXRob2Qgb2Ygb3VyIHBhcmVudAorICAgICAqICAgICBjbGFzcyBsb2FkZXIsIGlmIGFueS48L2xpPgorICAgICAqIDwvdWw+CisgICAgICogSWYgdGhlIGNsYXNzIHdhcyBmb3VuZCB1c2luZyB0aGUgYWJvdmUgc3RlcHMsIGFuZCB0aGUKKyAgICAgKiA8Y29kZT5yZXNvbHZlPC9jb2RlPiBmbGFnIGlzIDxjb2RlPnRydWU8L2NvZGU+LCB0aGlzIG1ldGhvZCB3aWxsIHRoZW4KKyAgICAgKiBjYWxsIDxjb2RlPnJlc29sdmVDbGFzcyhDbGFzcyk8L2NvZGU+IG9uIHRoZSByZXN1bHRpbmcgQ2xhc3Mgb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgY2xhc3MgdG8gYmUgbG9hZGVkCisgICAgICogQHBhcmFtIHJlc29sdmUgSWYgPGNvZGU+dHJ1ZTwvY29kZT4gdGhlbiByZXNvbHZlIHRoZSBjbGFzcworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGlmIHRoZSBjbGFzcyB3YXMgbm90IGZvdW5kCisgICAgICovCisgICAgcHVibGljIENsYXNzIGxvYWRDbGFzcyhTdHJpbmcgbmFtZSwgYm9vbGVhbiByZXNvbHZlKQorICAgICAgICB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmRlYnVnKCJsb2FkQ2xhc3MoIiArIG5hbWUgKyAiLCAiICsgcmVzb2x2ZSArICIpIik7CisgICAgICAgIENsYXNzIGNsYXp6ID0gbnVsbDsKKworICAgICAgICAvLyBEb24ndCBsb2FkIGNsYXNzZXMgaWYgY2xhc3MgbG9hZGVyIGlzIHN0b3BwZWQKKyAgICAgICAgaWYgKCFzdGFydGVkKSB7CisgICAgICAgICAgICBsb2cuaW5mbyhzbS5nZXRTdHJpbmcoIndlYmFwcENsYXNzTG9hZGVyLnN0b3BwZWQiLCBuYW1lKSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgVGhyZWFkRGVhdGgoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vICgwKSBDaGVjayBvdXIgcHJldmlvdXNseSBsb2FkZWQgbG9jYWwgY2xhc3MgY2FjaGUKKyAgICAgICAgY2xhenogPSBmaW5kTG9hZGVkQ2xhc3MwKG5hbWUpOworICAgICAgICBpZiAoY2xhenogIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiICBSZXR1cm5pbmcgY2xhc3MgZnJvbSBjYWNoZSIpOworICAgICAgICAgICAgaWYgKHJlc29sdmUpCisgICAgICAgICAgICAgICAgcmVzb2x2ZUNsYXNzKGNsYXp6KTsKKyAgICAgICAgICAgIHJldHVybiAoY2xhenopOworICAgICAgICB9CisKKyAgICAgICAgLy8gKDAuMSkgQ2hlY2sgb3VyIHByZXZpb3VzbHkgbG9hZGVkIGNsYXNzIGNhY2hlCisgICAgICAgIGNsYXp6ID0gZmluZExvYWRlZENsYXNzKG5hbWUpOworICAgICAgICBpZiAoY2xhenogIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiICBSZXR1cm5pbmcgY2xhc3MgZnJvbSBjYWNoZSIpOworICAgICAgICAgICAgaWYgKHJlc29sdmUpCisgICAgICAgICAgICAgICAgcmVzb2x2ZUNsYXNzKGNsYXp6KTsKKyAgICAgICAgICAgIHJldHVybiAoY2xhenopOworICAgICAgICB9CisKKyAgICAgICAgLy8gKDAuMikgVHJ5IGxvYWRpbmcgdGhlIGNsYXNzIHdpdGggdGhlIHN5c3RlbSBjbGFzcyBsb2FkZXIsIHRvIHByZXZlbnQKKyAgICAgICAgLy8gICAgICAgdGhlIHdlYmFwcCBmcm9tIG92ZXJyaWRpbmcgSjJTRSBjbGFzc2VzCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjbGF6eiA9IHN5c3RlbS5sb2FkQ2xhc3MobmFtZSk7CisgICAgICAgICAgICBpZiAoY2xhenogIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlKQorICAgICAgICAgICAgICAgICAgICByZXNvbHZlQ2xhc3MoY2xhenopOworICAgICAgICAgICAgICAgIHJldHVybiAoY2xhenopOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIElnbm9yZQorICAgICAgICB9CisKKyAgICAgICAgLy8gKDAuNSkgUGVybWlzc2lvbiB0byBhY2Nlc3MgdGhpcyBjbGFzcyB3aGVuIHVzaW5nIGEgU2VjdXJpdHlNYW5hZ2VyCisgICAgICAgIGlmIChzZWN1cml0eU1hbmFnZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgaW50IGkgPSBuYW1lLmxhc3RJbmRleE9mKCcuJyk7CisgICAgICAgICAgICBpZiAoaSA+PSAwKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgc2VjdXJpdHlNYW5hZ2VyLmNoZWNrUGFja2FnZUFjY2VzcyhuYW1lLnN1YnN0cmluZygwLGkpKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBzZSkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZXJyb3IgPSAiU2VjdXJpdHkgVmlvbGF0aW9uLCBhdHRlbXB0IHRvIHVzZSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICJSZXN0cmljdGVkIENsYXNzOiAiICsgbmFtZTsKKyAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oZXJyb3IsIHNlKTsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENsYXNzTm90Rm91bmRFeGNlcHRpb24oZXJyb3IsIHNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBib29sZWFuIGRlbGVnYXRlTG9hZCA9IGRlbGVnYXRlIHx8IGZpbHRlcihuYW1lKTsKKworICAgICAgICAvLyAoMSkgRGVsZWdhdGUgdG8gb3VyIHBhcmVudCBpZiByZXF1ZXN0ZWQKKyAgICAgICAgaWYgKGRlbGVnYXRlTG9hZCkgeworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiICBEZWxlZ2F0aW5nIHRvIHBhcmVudCBjbGFzc2xvYWRlcjEgIiArIHBhcmVudCk7CisgICAgICAgICAgICBDbGFzc0xvYWRlciBsb2FkZXIgPSBwYXJlbnQ7CisgICAgICAgICAgICBpZiAobG9hZGVyID09IG51bGwpCisgICAgICAgICAgICAgICAgbG9hZGVyID0gc3lzdGVtOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjbGF6eiA9IGxvYWRlci5sb2FkQ2xhc3MobmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKGNsYXp6ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgIExvYWRpbmcgY2xhc3MgZnJvbSBwYXJlbnQiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdmUpCisgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlQ2xhc3MoY2xhenopOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGNsYXp6KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyAoMikgU2VhcmNoIGxvY2FsIHJlcG9zaXRvcmllcworICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoIiAgU2VhcmNoaW5nIGxvY2FsIHJlcG9zaXRvcmllcyIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgY2xhenogPSBmaW5kQ2xhc3MobmFtZSk7CisgICAgICAgICAgICBpZiAoY2xhenogIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgIExvYWRpbmcgY2xhc3MgZnJvbSBsb2NhbCByZXBvc2l0b3J5Iik7CisgICAgICAgICAgICAgICAgaWYgKHJlc29sdmUpCisgICAgICAgICAgICAgICAgICAgIHJlc29sdmVDbGFzcyhjbGF6eik7CisgICAgICAgICAgICAgICAgcmV0dXJuIChjbGF6eik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgOworICAgICAgICB9CisKKyAgICAgICAgLy8gKDMpIERlbGVnYXRlIHRvIHBhcmVudCB1bmNvbmRpdGlvbmFsbHkKKyAgICAgICAgaWYgKCFkZWxlZ2F0ZUxvYWQpIHsKKyAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiAgRGVsZWdhdGluZyB0byBwYXJlbnQgY2xhc3Nsb2FkZXIgYXQgZW5kOiAiICsgcGFyZW50KTsKKyAgICAgICAgICAgIENsYXNzTG9hZGVyIGxvYWRlciA9IHBhcmVudDsKKyAgICAgICAgICAgIGlmIChsb2FkZXIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBsb2FkZXIgPSBzeXN0ZW07CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNsYXp6ID0gbG9hZGVyLmxvYWRDbGFzcyhuYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAoY2xhenogIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiAgTG9hZGluZyBjbGFzcyBmcm9tIHBhcmVudCIpOworICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVDbGFzcyhjbGF6eik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoY2xhenopOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHRocm93IG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKG5hbWUpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBQZXJtaXNzaW9ucyBmb3IgYSBDb2RlU291cmNlLiAgSWYgdGhpcyBpbnN0YW5jZQorICAgICAqIG9mIFdlYmFwcENsYXNzTG9hZGVyIGlzIGZvciBhIHdlYiBhcHBsaWNhdGlvbiBjb250ZXh0LAorICAgICAqIGFkZCByZWFkIEZpbGVQZXJtaXNzaW9uIG9yIEpuZGlQZXJtaXNzaW9ucyBmb3IgdGhlIGJhc2UKKyAgICAgKiBkaXJlY3RvcnkgKGlmIHVucGFja2VkKSwKKyAgICAgKiB0aGUgY29udGV4dCBVUkwsIGFuZCBqYXIgZmlsZSByZXNvdXJjZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29kZVNvdXJjZSB3aGVyZSB0aGUgY29kZSB3YXMgbG9hZGVkIGZyb20KKyAgICAgKiBAcmV0dXJuIFBlcm1pc3Npb25Db2xsZWN0aW9uIGZvciBDb2RlU291cmNlCisgICAgICovCisgICAgcHJvdGVjdGVkIFBlcm1pc3Npb25Db2xsZWN0aW9uIGdldFBlcm1pc3Npb25zKENvZGVTb3VyY2UgY29kZVNvdXJjZSkgeworCisgICAgICAgIFN0cmluZyBjb2RlVXJsID0gY29kZVNvdXJjZS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCk7CisgICAgICAgIFBlcm1pc3Npb25Db2xsZWN0aW9uIHBjOworICAgICAgICBpZiAoKHBjID0gKFBlcm1pc3Npb25Db2xsZWN0aW9uKWxvYWRlclBDLmdldChjb2RlVXJsKSkgPT0gbnVsbCkgeworICAgICAgICAgICAgcGMgPSBzdXBlci5nZXRQZXJtaXNzaW9ucyhjb2RlU291cmNlKTsKKyAgICAgICAgICAgIGlmIChwYyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgSXRlcmF0b3IgcGVybXMgPSBwZXJtaXNzaW9uTGlzdC5pdGVyYXRvcigpOworICAgICAgICAgICAgICAgIHdoaWxlIChwZXJtcy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgUGVybWlzc2lvbiBwID0gKFBlcm1pc3Npb24pcGVybXMubmV4dCgpOworICAgICAgICAgICAgICAgICAgICBwYy5hZGQocCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxvYWRlclBDLnB1dChjb2RlVXJsLHBjKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKHBjKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc2VhcmNoIHBhdGggb2YgVVJMcyBmb3IgbG9hZGluZyBjbGFzc2VzIGFuZCByZXNvdXJjZXMuCisgICAgICogVGhpcyBpbmNsdWRlcyB0aGUgb3JpZ2luYWwgbGlzdCBvZiBVUkxzIHNwZWNpZmllZCB0byB0aGUgY29uc3RydWN0b3IsCisgICAgICogYWxvbmcgd2l0aCBhbnkgVVJMcyBzdWJzZXF1ZW50bHkgYXBwZW5kZWQgYnkgdGhlIGFkZFVSTCgpIG1ldGhvZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBzZWFyY2ggcGF0aCBvZiBVUkxzIGZvciBsb2FkaW5nIGNsYXNzZXMgYW5kIHJlc291cmNlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgVVJMW10gZ2V0VVJMcygpIHsKKworICAgICAgICBpZiAocmVwb3NpdG9yeVVSTHMgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHJlcG9zaXRvcnlVUkxzOworICAgICAgICB9CisKKyAgICAgICAgVVJMW10gZXh0ZXJuYWwgPSBzdXBlci5nZXRVUkxzKCk7CisKKyAgICAgICAgaW50IGZpbGVzTGVuZ3RoID0gZmlsZXMubGVuZ3RoOworICAgICAgICBpbnQgamFyRmlsZXNMZW5ndGggPSBqYXJSZWFsRmlsZXMubGVuZ3RoOworICAgICAgICBpbnQgbGVuZ3RoID0gZmlsZXNMZW5ndGggKyBqYXJGaWxlc0xlbmd0aCArIGV4dGVybmFsLmxlbmd0aDsKKyAgICAgICAgaW50IGk7CisKKyAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgVVJMW10gdXJscyA9IG5ldyBVUkxbbGVuZ3RoXTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChpIDwgZmlsZXNMZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgICAgdXJsc1tpXSA9IGdldFVSTChmaWxlc1tpXSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpIDwgZmlsZXNMZW5ndGggKyBqYXJGaWxlc0xlbmd0aCkgeworICAgICAgICAgICAgICAgICAgICB1cmxzW2ldID0gZ2V0VVJMKGphclJlYWxGaWxlc1tpIC0gZmlsZXNMZW5ndGhdKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB1cmxzW2ldID0gZXh0ZXJuYWxbaSAtIGZpbGVzTGVuZ3RoIC0gamFyRmlsZXNMZW5ndGhdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmVwb3NpdG9yeVVSTHMgPSB1cmxzOworCisgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXBvc2l0b3J5VVJMcyA9IG5ldyBVUkxbMF07CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVwb3NpdG9yeVVSTHM7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBMaWZlY3ljbGUgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBsaWZlY3ljbGUgZXZlbnQgbGlzdGVuZXIgdG8gdGhpcyBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRvIGFkZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZExpZmVjeWNsZUxpc3RlbmVyKExpZmVjeWNsZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGxpZmVjeWNsZSBsaXN0ZW5lcnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbGlmZWN5Y2xlLiBJZiB0aGlzIAorICAgICAqIExpZmVjeWNsZSBoYXMgbm8gbGlzdGVuZXJzIHJlZ2lzdGVyZWQsIGEgemVyby1sZW5ndGggYXJyYXkgaXMgcmV0dXJuZWQuCisgICAgICovCisgICAgcHVibGljIExpZmVjeWNsZUxpc3RlbmVyW10gZmluZExpZmVjeWNsZUxpc3RlbmVycygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBMaWZlY3ljbGVMaXN0ZW5lclswXTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhIGxpZmVjeWNsZSBldmVudCBsaXN0ZW5lciBmcm9tIHRoaXMgY29tcG9uZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciB0byByZW1vdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVMaWZlY3ljbGVMaXN0ZW5lcihMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgIH0KKworCisgICAgLyoqCisgICAgICogU3RhcnQgdGhlIGNsYXNzIGxvYWRlci4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTGlmZWN5Y2xlRXhjZXB0aW9uIGlmIGEgbGlmZWN5Y2xlIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgdGhyb3dzIExpZmVjeWNsZUV4Y2VwdGlvbiB7CisKKyAgICAgICAgc3RhcnRlZCA9IHRydWU7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFN0b3AgdGhlIGNsYXNzIGxvYWRlci4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTGlmZWN5Y2xlRXhjZXB0aW9uIGlmIGEgbGlmZWN5Y2xlIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB0aHJvd3MgTGlmZWN5Y2xlRXhjZXB0aW9uIHsKKworICAgICAgICBzdGFydGVkID0gZmFsc2U7CisKKyAgICAgICAgaW50IGxlbmd0aCA9IGZpbGVzLmxlbmd0aDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgICAgICAgZmlsZXNbaV0gPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgbGVuZ3RoID0gamFyRmlsZXMubGVuZ3RoOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmIChqYXJGaWxlc1tpXSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGphckZpbGVzW2ldLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIElnbm9yZQorICAgICAgICAgICAgfQorICAgICAgICAgICAgamFyRmlsZXNbaV0gPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgbm90Rm91bmRSZXNvdXJjZXMuY2xlYXIoKTsKKyAgICAgICAgcmVzb3VyY2VFbnRyaWVzLmNsZWFyKCk7CisgICAgICAgIHJlc291cmNlcyA9IG51bGw7CisgICAgICAgIHJlcG9zaXRvcmllcyA9IG51bGw7CisgICAgICAgIHJlcG9zaXRvcnlVUkxzID0gbnVsbDsKKyAgICAgICAgZmlsZXMgPSBudWxsOworICAgICAgICBqYXJGaWxlcyA9IG51bGw7CisgICAgICAgIGphclJlYWxGaWxlcyA9IG51bGw7CisgICAgICAgIGphclBhdGggPSBudWxsOworICAgICAgICBqYXJOYW1lcyA9IG51bGw7CisgICAgICAgIGxhc3RNb2RpZmllZERhdGVzID0gbnVsbDsKKyAgICAgICAgcGF0aHMgPSBudWxsOworICAgICAgICBoYXNFeHRlcm5hbFJlcG9zaXRvcmllcyA9IGZhbHNlOworICAgICAgICBwYXJlbnQgPSBudWxsOworCisgICAgICAgIHBlcm1pc3Npb25MaXN0LmNsZWFyKCk7CisgICAgICAgIGxvYWRlclBDLmNsZWFyKCk7CisKKyAgICAgICAgaWYgKGxvYWRlckRpciAhPSBudWxsKSB7CisgICAgICAgICAgICBkZWxldGVEaXIobG9hZGVyRGlyKTsKKyAgICAgICAgfQorCisgICAgICAgIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3RvcnkucmVsZWFzZSh0aGlzKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogVXNlZCB0byBwZXJpb2RpY2FsbHkgc2lnbmFsIHRvIHRoZSBjbGFzc2xvYWRlciB0byByZWxlYXNlIAorICAgICAqIEpBUiByZXNvdXJjZXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xvc2VKQVJzKGJvb2xlYW4gZm9yY2UpIHsKKyAgICAgICAgaWYgKGphckZpbGVzLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGphckZpbGVzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmb3JjZSB8fCAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPiAobGFzdEphckFjY2Vzc2VkICsgOTAwMDApKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBqYXJGaWxlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCWlmIChqYXJGaWxlc1tpXSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQlqYXJGaWxlc1tpXS5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJamFyRmlsZXNbaV0gPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cud2FybigiRmFpbGVkIHRvIGNsb3NlIEpBUiIsIGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3RlY3RlZCBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFVzZWQgdG8gcGVyaW9kaWNhbGx5IHNpZ25hbCB0byB0aGUgY2xhc3Nsb2FkZXIgdG8gcmVsZWFzZSBKQVIgcmVzb3VyY2VzLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIG9wZW5KQVJzKCkgeworICAgICAgICBpZiAoc3RhcnRlZCAmJiAoamFyRmlsZXMubGVuZ3RoID4gMCkpIHsKKyAgICAgICAgICAgIGxhc3RKYXJBY2Nlc3NlZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICAgICAgaWYgKGphckZpbGVzWzBdID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGphckZpbGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgCXRyeSB7CisgICAgICAgICAgICAgICAgCQlqYXJGaWxlc1tpXSA9IG5ldyBKYXJGaWxlKGphclJlYWxGaWxlc1tpXSk7CisgICAgICAgICAgICAgICAgCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAJCWxvZy53YXJuKCJGYWlsZWQgdG8gb3BlbiBKQVIiLCBlKTsKKyAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogRmluZCBzcGVjaWZpZWQgY2xhc3MgaW4gbG9jYWwgcmVwb3NpdG9yaWVzLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbG9hZGVkIGNsYXNzLCBvciBudWxsIGlmIHRoZSBjbGFzcyBpc24ndCBmb3VuZAorICAgICAqLworICAgIHByb3RlY3RlZCBDbGFzcyBmaW5kQ2xhc3NJbnRlcm5hbChTdHJpbmcgbmFtZSkKKyAgICAgICAgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworCisgICAgICAgIGlmICghdmFsaWRhdGUobmFtZSkpCisgICAgICAgICAgICB0aHJvdyBuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbihuYW1lKTsKKworICAgICAgICBTdHJpbmcgdGVtcFBhdGggPSBuYW1lLnJlcGxhY2UoJy4nLCAnLycpOworICAgICAgICBTdHJpbmcgY2xhc3NQYXRoID0gdGVtcFBhdGggKyAiLmNsYXNzIjsKKworICAgICAgICBSZXNvdXJjZUVudHJ5IGVudHJ5ID0gbnVsbDsKKworICAgICAgICBlbnRyeSA9IGZpbmRSZXNvdXJjZUludGVybmFsKG5hbWUsIGNsYXNzUGF0aCk7CisKKyAgICAgICAgaWYgKChlbnRyeSA9PSBudWxsKSB8fCAoZW50cnkuYmluYXJ5Q29udGVudCA9PSBudWxsKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKG5hbWUpOworCisgICAgICAgIENsYXNzIGNsYXp6ID0gZW50cnkubG9hZGVkQ2xhc3M7CisgICAgICAgIGlmIChjbGF6eiAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGNsYXp6OworCisgICAgICAgIC8vIExvb2tpbmcgdXAgdGhlIHBhY2thZ2UKKyAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gbnVsbDsKKyAgICAgICAgaW50IHBvcyA9IG5hbWUubGFzdEluZGV4T2YoJy4nKTsKKyAgICAgICAgaWYgKHBvcyAhPSAtMSkKKyAgICAgICAgICAgIHBhY2thZ2VOYW1lID0gbmFtZS5zdWJzdHJpbmcoMCwgcG9zKTsKKworICAgICAgICBQYWNrYWdlIHBrZyA9IG51bGw7CisKKyAgICAgICAgaWYgKHBhY2thZ2VOYW1lICE9IG51bGwpIHsKKworICAgICAgICAgICAgcGtnID0gZ2V0UGFja2FnZShwYWNrYWdlTmFtZSk7CisKKyAgICAgICAgICAgIC8vIERlZmluZSB0aGUgcGFja2FnZSAoaWYgbnVsbCkKKyAgICAgICAgICAgIGlmIChwa2cgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChlbnRyeS5tYW5pZmVzdCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGRlZmluZVBhY2thZ2UocGFja2FnZU5hbWUsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZGVmaW5lUGFja2FnZShwYWNrYWdlTmFtZSwgZW50cnkubWFuaWZlc3QsIGVudHJ5LmNvZGVCYXNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIC8vIENyZWF0ZSB0aGUgY29kZSBzb3VyY2Ugb2JqZWN0CisgICAgICAgIENvZGVTb3VyY2UgY29kZVNvdXJjZSA9CisgICAgICAgICAgICBuZXcgQ29kZVNvdXJjZShlbnRyeS5jb2RlQmFzZSwgZW50cnkuY2VydGlmaWNhdGVzKTsKKworICAgICAgICBpZiAoc2VjdXJpdHlNYW5hZ2VyICE9IG51bGwpIHsKKworICAgICAgICAgICAgLy8gQ2hlY2tpbmcgc2VhbGluZworICAgICAgICAgICAgaWYgKHBrZyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBzZWFsQ2hlY2sgPSB0cnVlOworICAgICAgICAgICAgICAgIGlmIChwa2cuaXNTZWFsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBzZWFsQ2hlY2sgPSBwa2cuaXNTZWFsZWQoZW50cnkuY29kZUJhc2UpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHNlYWxDaGVjayA9IChlbnRyeS5tYW5pZmVzdCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgIWlzUGFja2FnZVNlYWxlZChwYWNrYWdlTmFtZSwgZW50cnkubWFuaWZlc3QpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIXNlYWxDaGVjaykKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAoIlNlYWxpbmcgdmlvbGF0aW9uIGxvYWRpbmcgIiArIG5hbWUgKyAiIDogUGFja2FnZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgKyBwYWNrYWdlTmFtZSArICIgaXMgc2VhbGVkLiIpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICBpZiAoZW50cnkubG9hZGVkQ2xhc3MgPT0gbnVsbCkgeworICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICAgICAgaWYgKGVudHJ5LmxvYWRlZENsYXNzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgY2xhenogPSBkZWZpbmVDbGFzcyhuYW1lLCBlbnRyeS5iaW5hcnlDb250ZW50LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmJpbmFyeUNvbnRlbnQubGVuZ3RoLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlU291cmNlKTsKKyAgICAgICAgICAgICAgICAgICAgZW50cnkubG9hZGVkQ2xhc3MgPSBjbGF6ejsKKyAgICAgICAgICAgICAgICAgICAgZW50cnkuYmluYXJ5Q29udGVudCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIGVudHJ5LnNvdXJjZSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIGVudHJ5LmNvZGVCYXNlID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgZW50cnkubWFuaWZlc3QgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBlbnRyeS5jZXJ0aWZpY2F0ZXMgPSBudWxsOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNsYXp6ID0gZW50cnkubG9hZGVkQ2xhc3M7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2xhenogPSBlbnRyeS5sb2FkZWRDbGFzczsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBjbGF6ejsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmQgc3BlY2lmaWVkIHJlc291cmNlIGluIGxvY2FsIHJlcG9zaXRvcmllcy4gVGhpcyBibG9jaworICAgICAqIHdpbGwgZXhlY3V0ZSB1bmRlciBhbiBBY2Nlc3NDb250cm9sLmRvUHJpdmlsZWdlIGJsb2NrLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbG9hZGVkIHJlc291cmNlLCBvciBudWxsIGlmIHRoZSByZXNvdXJjZSBpc24ndCBmb3VuZAorICAgICAqLworICAgIHByaXZhdGUgUmVzb3VyY2VFbnRyeSBmaW5kUmVzb3VyY2VJbnRlcm5hbChGaWxlIGZpbGUsIFN0cmluZyBwYXRoKXsKKyAgICAgICAgUmVzb3VyY2VFbnRyeSBlbnRyeSA9IG5ldyBSZXNvdXJjZUVudHJ5KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBlbnRyeS5zb3VyY2UgPSBnZXRVUkkobmV3IEZpbGUoZmlsZSwgcGF0aCkpOworICAgICAgICAgICAgZW50cnkuY29kZUJhc2UgPSBnZXRVUkwobmV3IEZpbGUoZmlsZSwgcGF0aCkpOworICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0gICAKKyAgICAgICAgcmV0dXJuIGVudHJ5OworICAgIH0KKyAgICAKKworICAgIC8qKgorICAgICAqIEZpbmQgc3BlY2lmaWVkIHJlc291cmNlIGluIGxvY2FsIHJlcG9zaXRvcmllcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGxvYWRlZCByZXNvdXJjZSwgb3IgbnVsbCBpZiB0aGUgcmVzb3VyY2UgaXNuJ3QgZm91bmQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUmVzb3VyY2VFbnRyeSBmaW5kUmVzb3VyY2VJbnRlcm5hbChTdHJpbmcgbmFtZSwgU3RyaW5nIHBhdGgpIHsKKworICAgICAgICBpZiAoIXN0YXJ0ZWQpIHsKKyAgICAgICAgICAgIGxvZy5pbmZvKHNtLmdldFN0cmluZygid2ViYXBwQ2xhc3NMb2FkZXIuc3RvcHBlZCIsIG5hbWUpKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChuYW1lID09IG51bGwpIHx8IChwYXRoID09IG51bGwpKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgUmVzb3VyY2VFbnRyeSBlbnRyeSA9IChSZXNvdXJjZUVudHJ5KSByZXNvdXJjZUVudHJpZXMuZ2V0KG5hbWUpOworICAgICAgICBpZiAoZW50cnkgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBlbnRyeTsKKworICAgICAgICBpbnQgY29udGVudExlbmd0aCA9IC0xOworICAgICAgICBJbnB1dFN0cmVhbSBiaW5hcnlTdHJlYW0gPSBudWxsOworCisgICAgICAgIGludCBqYXJGaWxlc0xlbmd0aCA9IGphckZpbGVzLmxlbmd0aDsKKyAgICAgICAgaW50IHJlcG9zaXRvcmllc0xlbmd0aCA9IHJlcG9zaXRvcmllcy5sZW5ndGg7CisKKyAgICAgICAgaW50IGk7CisKKyAgICAgICAgUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOworCisgICAgICAgIGZvciAoaSA9IDA7IChlbnRyeSA9PSBudWxsKSAmJiAoaSA8IHJlcG9zaXRvcmllc0xlbmd0aCk7IGkrKykgeworICAgICAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgICAgIFN0cmluZyBmdWxsUGF0aCA9IHJlcG9zaXRvcmllc1tpXSArIHBhdGg7CisKKyAgICAgICAgICAgICAgICBPYmplY3QgbG9va3VwUmVzdWx0ID0gcmVzb3VyY2VzLmxvb2t1cChmdWxsUGF0aCk7CisgICAgICAgICAgICAgICAgaWYgKGxvb2t1cFJlc3VsdCBpbnN0YW5jZW9mIFJlc291cmNlKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc291cmNlID0gKFJlc291cmNlKSBsb29rdXBSZXN1bHQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gTm90ZSA6IE5vdCBnZXR0aW5nIGFuIGV4Y2VwdGlvbiBoZXJlIG1lYW5zIHRoZSByZXNvdXJjZSB3YXMKKyAgICAgICAgICAgICAgICAvLyBmb3VuZAorICAgICAgICAgICAgICAgICBpZiAoc2VjdXJpdHlNYW5hZ2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgUHJpdmlsZWdlZEFjdGlvbiBkcCA9CisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEZpbmRSZXNvdXJjZShmaWxlc1tpXSwgcGF0aCk7CisgICAgICAgICAgICAgICAgICAgIGVudHJ5ID0gKFJlc291cmNlRW50cnkpQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoZHApOworICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBlbnRyeSA9IGZpbmRSZXNvdXJjZUludGVybmFsKGZpbGVzW2ldLCBwYXRoKTsKKyAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgUmVzb3VyY2VBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMgPQorICAgICAgICAgICAgICAgICAgICAoUmVzb3VyY2VBdHRyaWJ1dGVzKSByZXNvdXJjZXMuZ2V0QXR0cmlidXRlcyhmdWxsUGF0aCk7CisgICAgICAgICAgICAgICAgY29udGVudExlbmd0aCA9IChpbnQpIGF0dHJpYnV0ZXMuZ2V0Q29udGVudExlbmd0aCgpOworICAgICAgICAgICAgICAgIGVudHJ5Lmxhc3RNb2RpZmllZCA9IGF0dHJpYnV0ZXMuZ2V0TGFzdE1vZGlmaWVkKCk7CisKKyAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2UgIT0gbnVsbCkgeworCisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBiaW5hcnlTdHJlYW0gPSByZXNvdXJjZS5zdHJlYW1Db250ZW50KCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gUmVnaXN0ZXIgdGhlIGZ1bGwgcGF0aCBmb3IgbW9kaWZpY2F0aW9uIGNoZWNraW5nCisgICAgICAgICAgICAgICAgICAgIC8vIE5vdGU6IE9ubHkgc3luY2luZyBvbiBhICdjb25zdGFudCcgb2JqZWN0IGlzIG5lZWRlZAorICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGFsbFBlcm1pc3Npb24pIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGo7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvbmdbXSByZXN1bHQyID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGxvbmdbbGFzdE1vZGlmaWVkRGF0ZXMubGVuZ3RoICsgMV07CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbGFzdE1vZGlmaWVkRGF0ZXMubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQyW2pdID0gbGFzdE1vZGlmaWVkRGF0ZXNbal07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQyW2xhc3RNb2RpZmllZERhdGVzLmxlbmd0aF0gPSBlbnRyeS5sYXN0TW9kaWZpZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICBsYXN0TW9kaWZpZWREYXRlcyA9IHJlc3VsdDI7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIHJlc3VsdCA9IG5ldyBTdHJpbmdbcGF0aHMubGVuZ3RoICsgMV07CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcGF0aHMubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbal0gPSBwYXRoc1tqXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtwYXRocy5sZW5ndGhdID0gZnVsbFBhdGg7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXRocyA9IHJlc3VsdDsKKworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoKGVudHJ5ID09IG51bGwpICYmIChub3RGb3VuZFJlc291cmNlcy5jb250YWluc0tleShuYW1lKSkpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBKYXJFbnRyeSBqYXJFbnRyeSA9IG51bGw7CisKKyAgICAgICAgc3luY2hyb25pemVkIChqYXJGaWxlcykgeworCisgICAgICAgICAgICBvcGVuSkFScygpOworICAgICAgICAgICAgZm9yIChpID0gMDsgKGVudHJ5ID09IG51bGwpICYmIChpIDwgamFyRmlsZXNMZW5ndGgpOyBpKyspIHsKKworICAgICAgICAgICAgICAgIGphckVudHJ5ID0gamFyRmlsZXNbaV0uZ2V0SmFyRW50cnkocGF0aCk7CisKKyAgICAgICAgICAgICAgICBpZiAoamFyRW50cnkgIT0gbnVsbCkgeworCisgICAgICAgICAgICAgICAgICAgIGVudHJ5ID0gbmV3IFJlc291cmNlRW50cnkoKTsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmNvZGVCYXNlID0gZ2V0VVJMKGphclJlYWxGaWxlc1tpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgamFyRmFrZVVybCA9IGdldFVSSShqYXJSZWFsRmlsZXNbaV0pLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBqYXJGYWtlVXJsID0gImphcjoiICsgamFyRmFrZVVybCArICIhLyIgKyBwYXRoOworICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuc291cmNlID0gbmV3IFVSTChqYXJGYWtlVXJsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5Lmxhc3RNb2RpZmllZCA9IGphclJlYWxGaWxlc1tpXS5sYXN0TW9kaWZpZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRMZW5ndGggPSAoaW50KSBqYXJFbnRyeS5nZXRTaXplKCk7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5tYW5pZmVzdCA9IGphckZpbGVzW2ldLmdldE1hbmlmZXN0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBiaW5hcnlTdHJlYW0gPSBqYXJGaWxlc1tpXS5nZXRJbnB1dFN0cmVhbShqYXJFbnRyeSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gRXh0cmFjdCByZXNvdXJjZXMgY29udGFpbmVkIGluIEpBUiB0byB0aGUgd29ya2RpcgorICAgICAgICAgICAgICAgICAgICBpZiAoYW50aUpBUkxvY2tpbmcgJiYgIShwYXRoLmVuZHNXaXRoKCIuY2xhc3MiKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVsxMDI0XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUgcmVzb3VyY2VGaWxlID0gbmV3IEZpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9hZGVyRGlyLCBqYXJFbnRyeS5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXNvdXJjZUZpbGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbnVtZXJhdGlvbiBlbnRyaWVzID0gamFyRmlsZXNbaV0uZW50cmllcygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChlbnRyaWVzLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEphckVudHJ5IGphckVudHJ5MiA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEphckVudHJ5KSBlbnRyaWVzLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGphckVudHJ5Mi5pc0RpcmVjdG9yeSgpKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICghamFyRW50cnkyLmdldE5hbWUoKS5lbmRzV2l0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiLmNsYXNzIikpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZUZpbGUgPSBuZXcgRmlsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb2FkZXJEaXIsIGphckVudHJ5Mi5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VGaWxlLmdldFBhcmVudEZpbGUoKS5ta2RpcnMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gb3MgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyA9IGphckZpbGVzW2ldLmdldElucHV0U3RyZWFtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChqYXJFbnRyeTIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlc291cmNlRmlsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG4gPSBpcy5yZWFkKGJ1Zik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuIDw9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLndyaXRlKGJ1ZiwgMCwgbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9zICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGVudHJ5ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG5vdEZvdW5kUmVzb3VyY2VzKSB7CisgICAgICAgICAgICAgICAgICAgIG5vdEZvdW5kUmVzb3VyY2VzLnB1dChuYW1lLCBuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChiaW5hcnlTdHJlYW0gIT0gbnVsbCkgeworCisgICAgICAgICAgICAgICAgYnl0ZVtdIGJpbmFyeUNvbnRlbnQgPSBuZXcgYnl0ZVtjb250ZW50TGVuZ3RoXTsKKworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGludCBwb3MgPSAwOworCisgICAgICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbiA9IGJpbmFyeVN0cmVhbS5yZWFkKGJpbmFyeUNvbnRlbnQsIHBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluYXJ5Q29udGVudC5sZW5ndGggLSBwb3MpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4gPD0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvcyArPSBuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJpbmFyeVN0cmVhbS5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZW50cnkuYmluYXJ5Q29udGVudCA9IGJpbmFyeUNvbnRlbnQ7CisKKyAgICAgICAgICAgICAgICAvLyBUaGUgY2VydGlmaWNhdGVzIGFyZSBvbmx5IGF2YWlsYWJsZSBhZnRlciB0aGUgSmFyRW50cnkgCisgICAgICAgICAgICAgICAgLy8gYXNzb2NpYXRlZCBpbnB1dCBzdHJlYW0gaGFzIGJlZW4gZnVsbHkgcmVhZAorICAgICAgICAgICAgICAgIGlmIChqYXJFbnRyeSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGVudHJ5LmNlcnRpZmljYXRlcyA9IGphckVudHJ5LmdldENlcnRpZmljYXRlcygpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICAvLyBBZGQgdGhlIGVudHJ5IGluIHRoZSBsb2NhbCByZXNvdXJjZSByZXBvc2l0b3J5CisgICAgICAgIHN5bmNocm9uaXplZCAocmVzb3VyY2VFbnRyaWVzKSB7CisgICAgICAgICAgICAvLyBFbnN1cmVzIHRoYXQgYWxsIHRoZSB0aHJlYWRzIHdoaWNoIG1heSBiZSBpbiBhIHJhY2UgdG8gbG9hZAorICAgICAgICAgICAgLy8gYSBwYXJ0aWN1bGFyIGNsYXNzIGFsbCBlbmQgdXAgd2l0aCB0aGUgc2FtZSBSZXNvdXJjZUVudHJ5CisgICAgICAgICAgICAvLyBpbnN0YW5jZQorICAgICAgICAgICAgUmVzb3VyY2VFbnRyeSBlbnRyeTIgPSAoUmVzb3VyY2VFbnRyeSkgcmVzb3VyY2VFbnRyaWVzLmdldChuYW1lKTsKKyAgICAgICAgICAgIGlmIChlbnRyeTIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJlc291cmNlRW50cmllcy5wdXQobmFtZSwgZW50cnkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBlbnRyeSA9IGVudHJ5MjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBlbnRyeTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgcGFja2FnZSBuYW1lIGlzIHNlYWxlZCBhY2NvcmRpbmcgdG8gdGhlCisgICAgICogZ2l2ZW4gbWFuaWZlc3QuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNQYWNrYWdlU2VhbGVkKFN0cmluZyBuYW1lLCBNYW5pZmVzdCBtYW4pIHsKKworICAgICAgICBTdHJpbmcgcGF0aCA9IG5hbWUucmVwbGFjZSgnLicsICcvJykgKyAnLyc7CisgICAgICAgIEF0dHJpYnV0ZXMgYXR0ciA9IG1hbi5nZXRBdHRyaWJ1dGVzKHBhdGgpOyAKKyAgICAgICAgU3RyaW5nIHNlYWxlZCA9IG51bGw7CisgICAgICAgIGlmIChhdHRyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNlYWxlZCA9IGF0dHIuZ2V0VmFsdWUoTmFtZS5TRUFMRUQpOworICAgICAgICB9CisgICAgICAgIGlmIChzZWFsZWQgPT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKChhdHRyID0gbWFuLmdldE1haW5BdHRyaWJ1dGVzKCkpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzZWFsZWQgPSBhdHRyLmdldFZhbHVlKE5hbWUuU0VBTEVEKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gInRydWUiLmVxdWFsc0lnbm9yZUNhc2Uoc2VhbGVkKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogRmluZHMgdGhlIHJlc291cmNlIHdpdGggdGhlIGdpdmVuIG5hbWUgaWYgaXQgaGFzIHByZXZpb3VzbHkgYmVlbgorICAgICAqIGxvYWRlZCBhbmQgY2FjaGVkIGJ5IHRoaXMgY2xhc3MgbG9hZGVyLCBhbmQgcmV0dXJuIGFuIGlucHV0IHN0cmVhbQorICAgICAqIHRvIHRoZSByZXNvdXJjZSBkYXRhLiAgSWYgdGhpcyByZXNvdXJjZSBoYXMgbm90IGJlZW4gY2FjaGVkLCByZXR1cm4KKyAgICAgKiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIHJlc291cmNlIHRvIHJldHVybgorICAgICAqLworICAgIHByb3RlY3RlZCBJbnB1dFN0cmVhbSBmaW5kTG9hZGVkUmVzb3VyY2UoU3RyaW5nIG5hbWUpIHsKKworICAgICAgICBSZXNvdXJjZUVudHJ5IGVudHJ5ID0gKFJlc291cmNlRW50cnkpIHJlc291cmNlRW50cmllcy5nZXQobmFtZSk7CisgICAgICAgIGlmIChlbnRyeSAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoZW50cnkuYmluYXJ5Q29udGVudCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oZW50cnkuYmluYXJ5Q29udGVudCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChudWxsKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogRmluZHMgdGhlIGNsYXNzIHdpdGggdGhlIGdpdmVuIG5hbWUgaWYgaXQgaGFzIHByZXZpb3VzbHkgYmVlbgorICAgICAqIGxvYWRlZCBhbmQgY2FjaGVkIGJ5IHRoaXMgY2xhc3MgbG9hZGVyLCBhbmQgcmV0dXJuIHRoZSBDbGFzcyBvYmplY3QuCisgICAgICogSWYgdGhpcyBjbGFzcyBoYXMgbm90IGJlZW4gY2FjaGVkLCByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSByZXNvdXJjZSB0byByZXR1cm4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ2xhc3MgZmluZExvYWRlZENsYXNzMChTdHJpbmcgbmFtZSkgeworCisgICAgICAgIFJlc291cmNlRW50cnkgZW50cnkgPSAoUmVzb3VyY2VFbnRyeSkgcmVzb3VyY2VFbnRyaWVzLmdldChuYW1lKTsKKyAgICAgICAgaWYgKGVudHJ5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBlbnRyeS5sb2FkZWRDbGFzczsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKG51bGwpOyAgLy8gRklYTUUgLSBmaW5kTG9hZGVkUmVzb3VyY2UoKQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZWZyZXNoIHRoZSBzeXN0ZW0gcG9saWN5IGZpbGUsIHRvIHBpY2sgdXAgZXZlbnR1YWwgY2hhbmdlcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCByZWZyZXNoUG9saWN5KCkgeworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBUaGUgcG9saWN5IGZpbGUgbWF5IGhhdmUgYmVlbiBtb2RpZmllZCB0byBhZGp1c3QgCisgICAgICAgICAgICAvLyBwZXJtaXNzaW9ucywgc28gd2UncmUgcmVsb2FkaW5nIGl0IHdoZW4gbG9hZGluZyBvciAKKyAgICAgICAgICAgIC8vIHJlbG9hZGluZyBhIENvbnRleHQKKyAgICAgICAgICAgIFBvbGljeSBwb2xpY3kgPSBQb2xpY3kuZ2V0UG9saWN5KCk7CisgICAgICAgICAgICBwb2xpY3kucmVmcmVzaCgpOworICAgICAgICB9IGNhdGNoIChBY2Nlc3NDb250cm9sRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIFNvbWUgcG9saWN5IGZpbGVzIG1heSByZXN0cmljdCB0aGlzLCBldmVuIGZvciB0aGUgY29yZSwKKyAgICAgICAgICAgIC8vIHNvIHRoaXMgZXhjZXB0aW9uIGlzIGlnbm9yZWQKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBGaWx0ZXIgY2xhc3Nlcy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSBjbGFzcyBuYW1lCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjbGFzcyBzaG91bGQgYmUgZmlsdGVyZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBmaWx0ZXIoU3RyaW5nIG5hbWUpIHsKKworICAgICAgICBpZiAobmFtZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIC8vIExvb2tpbmcgdXAgdGhlIHBhY2thZ2UKKyAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gbnVsbDsKKyAgICAgICAgaW50IHBvcyA9IG5hbWUubGFzdEluZGV4T2YoJy4nKTsKKyAgICAgICAgaWYgKHBvcyAhPSAtMSkKKyAgICAgICAgICAgIHBhY2thZ2VOYW1lID0gbmFtZS5zdWJzdHJpbmcoMCwgcG9zKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFja2FnZVRyaWdnZXJzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAocGFja2FnZU5hbWUuc3RhcnRzV2l0aChwYWNrYWdlVHJpZ2dlcnNbaV0pKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBWYWxpZGF0ZSBhIGNsYXNzbmFtZS4gQXMgcGVyIFNSVi45LjcuMiwgd2UgbXVzdCByZXN0aWN0IGxvYWRpbmcgb2YgCisgICAgICogY2xhc3NlcyBmcm9tIEoyU0UgKGphdmEuKikgYW5kIGNsYXNzZXMgb2YgdGhlIHNlcnZsZXQgQVBJIAorICAgICAqIChqYXZheC5zZXJ2bGV0LiopLiBUaGF0IHNob3VsZCBlbmhhbmNlIHJvYnVzdG5lc3MgYW5kIHByZXZlbnQgYSBudW1iZXIKKyAgICAgKiBvZiB1c2VyIGVycm9yICh3aGVyZSBhbiBvbGRlciB2ZXJzaW9uIG9mIHNlcnZsZXQuamFyIHdvdWxkIGJlIHByZXNlbnQKKyAgICAgKiBpbiAvV0VCLUlORi9saWIpLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIGNsYXNzIG5hbWUKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG5hbWUgaXMgdmFsaWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZShTdHJpbmcgbmFtZSkgeworCisgICAgICAgIGlmIChuYW1lID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoImphdmEuIikpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENoZWNrIHRoZSBzcGVjaWZpZWQgSkFSIGZpbGUsIGFuZCByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgaXQgZG9lcworICAgICAqIG5vdCBjb250YWluIGFueSBvZiB0aGUgdHJpZ2dlciBjbGFzc2VzLgorICAgICAqCisgICAgICogQHBhcmFtIGphcmZpbGUgVGhlIEpBUiBmaWxlIHRvIGJlIGNoZWNrZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZUphckZpbGUoRmlsZSBqYXJmaWxlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIGlmICh0cmlnZ2VycyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuICh0cnVlKTsKKyAgICAgICAgSmFyRmlsZSBqYXJGaWxlID0gbmV3IEphckZpbGUoamFyZmlsZSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHJpZ2dlcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIENsYXNzIGNsYXp6ID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGNsYXp6ID0gcGFyZW50LmxvYWRDbGFzcyh0cmlnZ2Vyc1tpXSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY2xhenogPSBDbGFzcy5mb3JOYW1lKHRyaWdnZXJzW2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgIGNsYXp6ID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjbGF6eiA9PSBudWxsKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSB0cmlnZ2Vyc1tpXS5yZXBsYWNlKCcuJywgJy8nKSArICIuY2xhc3MiOworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiIENoZWNraW5nIGZvciAiICsgbmFtZSk7CisgICAgICAgICAgICBKYXJFbnRyeSBqYXJFbnRyeSA9IGphckZpbGUuZ2V0SmFyRW50cnkobmFtZSk7CisgICAgICAgICAgICBpZiAoamFyRW50cnkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJ2YWxpZGF0ZUphckZpbGUoIiArIGphcmZpbGUgKyAKKyAgICAgICAgICAgICAgICAgICAgIikgLSBqYXIgbm90IGxvYWRlZC4gU2VlIFNlcnZsZXQgU3BlYyAyLjMsICIKKyAgICAgICAgICAgICAgICAgICAgKyAic2VjdGlvbiA5LjcuMi4gT2ZmZW5kaW5nIGNsYXNzOiAiICsgbmFtZSk7CisgICAgICAgICAgICAgICAgamFyRmlsZS5jbG9zZSgpOworICAgICAgICAgICAgICAgIHJldHVybiAoZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGphckZpbGUuY2xvc2UoKTsKKyAgICAgICAgcmV0dXJuICh0cnVlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0IFVSTC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgVVJMIGdldFVSTChGaWxlIGZpbGUpCisgICAgICAgIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24geworCisgICAgICAgIEZpbGUgcmVhbEZpbGUgPSBmaWxlOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhbEZpbGUgPSByZWFsRmlsZS5nZXRDYW5vbmljYWxGaWxlKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIElnbm9yZQorICAgICAgICB9CisgICAgICAgIHJldHVybiByZWFsRmlsZS50b1VSTCgpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHZXQgVVJMLgorICAgICAqLworICAgIHByb3RlY3RlZCBVUkwgZ2V0VVJJKEZpbGUgZmlsZSkKKyAgICAgICAgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7CisKKyAgICAgICAgcmV0dXJuIGpka0NvbXBhdC5nZXRVUkkoZmlsZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIERlbGV0ZSB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSwgaW5jbHVkaW5nIGFsbCBvZiBpdHMgY29udGVudHMgYW5kCisgICAgICogc3ViZGlyZWN0b3JpZXMgcmVjdXJzaXZlbHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGlyIEZpbGUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZGlyZWN0b3J5IHRvIGJlIGRlbGV0ZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgZGVsZXRlRGlyKEZpbGUgZGlyKSB7CisKKyAgICAgICAgU3RyaW5nIGZpbGVzW10gPSBkaXIubGlzdCgpOworICAgICAgICBpZiAoZmlsZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgZmlsZXMgPSBuZXcgU3RyaW5nWzBdOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGRpciwgZmlsZXNbaV0pOworICAgICAgICAgICAgaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgICAgIGRlbGV0ZURpcihmaWxlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZmlsZS5kZWxldGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBkaXIuZGVsZXRlKCk7CisKKyAgICB9CisKKworfQorCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvbG9hZGVyL1dlYmFwcExvYWRlci5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2xvYWRlci9XZWJhcHBMb2FkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTJiOWRiCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2xvYWRlci9XZWJhcHBMb2FkZXIuamF2YQpAQCAtMCwwICsxLDEyMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEubG9hZGVyOworCisKK2ltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlRXZlbnQ7CitpbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOworaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VTdXBwb3J0OworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlUGVybWlzc2lvbjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS5uZXQuVVJMQ2xhc3NMb2FkZXI7CitpbXBvcnQgamF2YS5uZXQuVVJMU3RyZWFtSGFuZGxlckZhY3Rvcnk7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuamFyLkphckZpbGU7CisKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuUmVnaXN0cmF0aW9uOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworaW1wb3J0IGphdmF4Lm5hbWluZy5CaW5kaW5nOworaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1lQ2xhc3NQYWlyOworaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1pbmdFbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm5hbWluZy5kaXJlY3RvcnkuRGlyQ29udGV4dDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Db250YWluZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Db250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuRW5naW5lOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuR2xvYmFsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZUxpc3RlbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTG9hZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZENvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLkxpZmVjeWNsZVN1cHBvcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLlN0cmluZ01hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLm1vZGVsZXIuUmVnaXN0cnk7CitpbXBvcnQgb3JnLmFwYWNoZS5uYW1pbmcucmVzb3VyY2VzLkRpckNvbnRleHRVUkxTdHJlYW1IYW5kbGVyOworaW1wb3J0IG9yZy5hcGFjaGUubmFtaW5nLnJlc291cmNlcy5EaXJDb250ZXh0VVJMU3RyZWFtSGFuZGxlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5uYW1pbmcucmVzb3VyY2VzLlJlc291cmNlOworCisKKy8qKgorICogQ2xhc3Nsb2FkZXIgaW1wbGVtZW50YXRpb24gd2hpY2ggaXMgc3BlY2lhbGl6ZWQgZm9yIGhhbmRsaW5nIHdlYgorICogYXBwbGljYXRpb25zIGluIHRoZSBtb3N0IGVmZmljaWVudCB3YXksIHdoaWxlIGJlaW5nIENhdGFsaW5hIGF3YXJlIChhbGwKKyAqIGFjY2Vzc2VzIHRvIHJlc291cmNlcyBhcmUgbWFkZSB0aHJvdWdoIHRoZSBEaXJDb250ZXh0IGludGVyZmFjZSkuCisgKiBUaGlzIGNsYXNzIGxvYWRlciBzdXBwb3J0cyBkZXRlY3Rpb24gb2YgbW9kaWZpZWQKKyAqIEphdmEgY2xhc3Nlcywgd2hpY2ggY2FuIGJlIHVzZWQgdG8gaW1wbGVtZW50IGF1dG8tcmVsb2FkIHN1cHBvcnQuCisgKiA8cD4KKyAqIFRoaXMgY2xhc3MgbG9hZGVyIGlzIGNvbmZpZ3VyZWQgYnkgYWRkaW5nIHRoZSBwYXRobmFtZXMgb2YgZGlyZWN0b3JpZXMsCisgKiBKQVIgZmlsZXMsIGFuZCBaSVAgZmlsZXMgd2l0aCB0aGUgPGNvZGU+YWRkUmVwb3NpdG9yeSgpPC9jb2RlPiBtZXRob2QsCisgKiBwcmlvciB0byBjYWxsaW5nIDxjb2RlPnN0YXJ0KCk8L2NvZGU+LiAgV2hlbiBhIG5ldyBjbGFzcyBpcyByZXF1aXJlZCwKKyAqIHRoZXNlIHJlcG9zaXRvcmllcyB3aWxsIGJlIGNvbnN1bHRlZCBmaXJzdCB0byBsb2NhdGUgdGhlIGNsYXNzLiAgSWYgaXQKKyAqIGlzIG5vdCBwcmVzZW50LCB0aGUgc3lzdGVtIGNsYXNzIGxvYWRlciB3aWxsIGJlIHVzZWQgaW5zdGVhZC4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEBhdXRob3IgUmVteSBNYXVjaGVyYXQKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIFdlYmFwcExvYWRlcgorICAgIGltcGxlbWVudHMgTGlmZWN5Y2xlLCBMb2FkZXIsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIsIE1CZWFuUmVnaXN0cmF0aW9uICB7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IFdlYmFwcExvYWRlciB3aXRoIG5vIGRlZmluZWQgcGFyZW50IGNsYXNzIGxvYWRlcgorICAgICAqIChzbyB0aGF0IHRoZSBhY3R1YWwgcGFyZW50IHdpbGwgYmUgdGhlIHN5c3RlbSBjbGFzcyBsb2FkZXIpLgorICAgICAqLworICAgIHB1YmxpYyBXZWJhcHBMb2FkZXIoKSB7CisKKyAgICAgICAgdGhpcyhudWxsKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IFdlYmFwcExvYWRlciB3aXRoIHRoZSBzcGVjaWZpZWQgY2xhc3MgbG9hZGVyCisgICAgICogdG8gYmUgZGVmaW5lZCBhcyB0aGUgcGFyZW50IG9mIHRoZSBDbGFzc0xvYWRlciB3ZSB1bHRpbWF0ZWx5IGNyZWF0ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjbGFzcyBsb2FkZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgV2ViYXBwTG9hZGVyKENsYXNzTG9hZGVyIHBhcmVudCkgeworICAgICAgICBzdXBlcigpOworICAgICAgICB0aGlzLnBhcmVudENsYXNzTG9hZGVyID0gcGFyZW50OworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIEZpcnN0IGxvYWQgb2YgdGhlIGNsYXNzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gZmlyc3QgPSB0cnVlOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgY2xhc3MgbG9hZGVyIGJlaW5nIG1hbmFnZWQgYnkgdGhpcyBMb2FkZXIgY29tcG9uZW50LgorICAgICAqLworICAgIHByaXZhdGUgV2ViYXBwQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgQ29udGFpbmVyIHdpdGggd2hpY2ggdGhpcyBMb2FkZXIgaGFzIGJlZW4gYXNzb2NpYXRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIENvbnRhaW5lciBjb250YWluZXIgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgImZvbGxvdyBzdGFuZGFyZCBkZWxlZ2F0aW9uIG1vZGVsIiBmbGFnIHRoYXQgd2lsbCBiZSB1c2VkIHRvCisgICAgICogY29uZmlndXJlIG91ciBDbGFzc0xvYWRlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gZGVsZWdhdGUgPSBmYWxzZTsKKworCisgICAgLyoqCisgICAgICogVGhlIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgTG9hZGVyIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBpbmZvID0KKyAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEubG9hZGVyLldlYmFwcExvYWRlci8xLjAiOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgbGlmZWN5Y2xlIGV2ZW50IHN1cHBvcnQgZm9yIHRoaXMgY29tcG9uZW50LgorICAgICAqLworICAgIHByb3RlY3RlZCBMaWZlY3ljbGVTdXBwb3J0IGxpZmVjeWNsZSA9IG5ldyBMaWZlY3ljbGVTdXBwb3J0KHRoaXMpOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgSmF2YSBjbGFzcyBuYW1lIG9mIHRoZSBDbGFzc0xvYWRlciBpbXBsZW1lbnRhdGlvbiB0byBiZSB1c2VkLgorICAgICAqIFRoaXMgY2xhc3Mgc2hvdWxkIGV4dGVuZCBXZWJhcHBDbGFzc0xvYWRlciwgb3RoZXJ3aXNlLCBhIGRpZmZlcmVudCAKKyAgICAgKiBsb2FkZXIgaW1wbGVtZW50YXRpb24gbXVzdCBiZSB1c2VkLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGxvYWRlckNsYXNzID0KKyAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEubG9hZGVyLldlYmFwcENsYXNzTG9hZGVyIjsKKworCisgICAgLyoqCisgICAgICogVGhlIHBhcmVudCBjbGFzcyBsb2FkZXIgb2YgdGhlIGNsYXNzIGxvYWRlciB3ZSB3aWxsIGNyZWF0ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIENsYXNzTG9hZGVyIHBhcmVudENsYXNzTG9hZGVyID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIHJlbG9hZGFibGUgZmxhZyBmb3IgdGhpcyBMb2FkZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHJlbG9hZGFibGUgPSBmYWxzZTsKKworCisgICAgLyoqCisgICAgICogVGhlIHNldCBvZiByZXBvc2l0b3JpZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY2xhc3MgbG9hZGVyLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHJlcG9zaXRvcmllc1tdID0gbmV3IFN0cmluZ1swXTsKKworCisgICAgLyoqCisgICAgICogVGhlIHN0cmluZyBtYW5hZ2VyIGZvciB0aGlzIHBhY2thZ2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdNYW5hZ2VyIHNtID0KKyAgICAgICAgU3RyaW5nTWFuYWdlci5nZXRNYW5hZ2VyKENvbnN0YW50cy5QYWNrYWdlKTsKKworCisgICAgLyoqCisgICAgICogSGFzIHRoaXMgY29tcG9uZW50IGJlZW4gc3RhcnRlZD8KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gc3RhcnRlZCA9IGZhbHNlOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgcHJvcGVydHkgY2hhbmdlIHN1cHBvcnQgZm9yIHRoaXMgY29tcG9uZW50LgorICAgICAqLworICAgIHByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZVN1cHBvcnQgc3VwcG9ydCA9IG5ldyBQcm9wZXJ0eUNoYW5nZVN1cHBvcnQodGhpcyk7CisKKworICAgIC8qKgorICAgICAqIENsYXNzcGF0aCBzZXQgaW4gdGhlIGxvYWRlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBjbGFzc3BhdGggPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBSZXBvc2l0b3JpZXMgdGhhdCBhcmUgc2V0IGluIHRoZSBsb2FkZXIsIGZvciBKTVguCisgICAgICovCisgICAgcHJpdmF0ZSBBcnJheUxpc3QgbG9hZGVyUmVwb3NpdG9yaWVzID0gbnVsbDsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgSmF2YSBjbGFzcyBsb2FkZXIgdG8gYmUgdXNlZCBieSB0aGlzIENvbnRhaW5lci4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3NMb2FkZXIgZ2V0Q2xhc3NMb2FkZXIoKSB7CisKKyAgICAgICAgcmV0dXJuICgoQ2xhc3NMb2FkZXIpIGNsYXNzTG9hZGVyKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBDb250YWluZXIgd2l0aCB3aGljaCB0aGlzIExvZ2dlciBoYXMgYmVlbiBhc3NvY2lhdGVkLgorICAgICAqLworICAgIHB1YmxpYyBDb250YWluZXIgZ2V0Q29udGFpbmVyKCkgeworCisgICAgICAgIHJldHVybiAoY29udGFpbmVyKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBDb250YWluZXIgd2l0aCB3aGljaCB0aGlzIExvZ2dlciBoYXMgYmVlbiBhc3NvY2lhdGVkLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRhaW5lciBUaGUgYXNzb2NpYXRlZCBDb250YWluZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb250YWluZXIoQ29udGFpbmVyIGNvbnRhaW5lcikgeworCisgICAgICAgIC8vIERlcmVnaXN0ZXIgZnJvbSB0aGUgb2xkIENvbnRhaW5lciAoaWYgYW55KQorICAgICAgICBpZiAoKHRoaXMuY29udGFpbmVyICE9IG51bGwpICYmICh0aGlzLmNvbnRhaW5lciBpbnN0YW5jZW9mIENvbnRleHQpKQorICAgICAgICAgICAgKChDb250ZXh0KSB0aGlzLmNvbnRhaW5lcikucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKKworICAgICAgICAvLyBQcm9jZXNzIHRoaXMgcHJvcGVydHkgY2hhbmdlCisgICAgICAgIENvbnRhaW5lciBvbGRDb250YWluZXIgPSB0aGlzLmNvbnRhaW5lcjsKKyAgICAgICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7CisgICAgICAgIHN1cHBvcnQuZmlyZVByb3BlcnR5Q2hhbmdlKCJjb250YWluZXIiLCBvbGRDb250YWluZXIsIHRoaXMuY29udGFpbmVyKTsKKworICAgICAgICAvLyBSZWdpc3RlciB3aXRoIHRoZSBuZXcgQ29udGFpbmVyIChpZiBhbnkpCisgICAgICAgIGlmICgodGhpcy5jb250YWluZXIgIT0gbnVsbCkgJiYgKHRoaXMuY29udGFpbmVyIGluc3RhbmNlb2YgQ29udGV4dCkpIHsKKyAgICAgICAgICAgIHNldFJlbG9hZGFibGUoICgoQ29udGV4dCkgdGhpcy5jb250YWluZXIpLmdldFJlbG9hZGFibGUoKSApOworICAgICAgICAgICAgKChDb250ZXh0KSB0aGlzLmNvbnRhaW5lcikuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlICJmb2xsb3cgc3RhbmRhcmQgZGVsZWdhdGlvbiBtb2RlbCIgZmxhZyB1c2VkIHRvIGNvbmZpZ3VyZQorICAgICAqIG91ciBDbGFzc0xvYWRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXREZWxlZ2F0ZSgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMuZGVsZWdhdGUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlICJmb2xsb3cgc3RhbmRhcmQgZGVsZWdhdGlvbiBtb2RlbCIgZmxhZyB1c2VkIHRvIGNvbmZpZ3VyZQorICAgICAqIG91ciBDbGFzc0xvYWRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZWxlZ2F0ZSBUaGUgbmV3IGZsYWcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREZWxlZ2F0ZShib29sZWFuIGRlbGVnYXRlKSB7CisKKyAgICAgICAgYm9vbGVhbiBvbGREZWxlZ2F0ZSA9IHRoaXMuZGVsZWdhdGU7CisgICAgICAgIHRoaXMuZGVsZWdhdGUgPSBkZWxlZ2F0ZTsKKyAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoImRlbGVnYXRlIiwgbmV3IEJvb2xlYW4ob2xkRGVsZWdhdGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQm9vbGVhbih0aGlzLmRlbGVnYXRlKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIExvYWRlciBpbXBsZW1lbnRhdGlvbiBhbmQKKyAgICAgKiB0aGUgY29ycmVzcG9uZGluZyB2ZXJzaW9uIG51bWJlciwgaW4gdGhlIGZvcm1hdAorICAgICAqIDxjb2RlPiZsdDtkZXNjcmlwdGlvbiZndDsvJmx0O3ZlcnNpb24mZ3Q7PC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEluZm8oKSB7CisKKyAgICAgICAgcmV0dXJuIChpbmZvKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBDbGFzc0xvYWRlciBjbGFzcyBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9hZGVyQ2xhc3MoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLmxvYWRlckNsYXNzKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBDbGFzc0xvYWRlciBjbGFzcyBuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIGxvYWRlckNsYXNzIFRoZSBuZXcgQ2xhc3NMb2FkZXIgY2xhc3MgbmFtZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExvYWRlckNsYXNzKFN0cmluZyBsb2FkZXJDbGFzcykgeworCisgICAgICAgIHRoaXMubG9hZGVyQ2xhc3MgPSBsb2FkZXJDbGFzczsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSByZWxvYWRhYmxlIGZsYWcgZm9yIHRoaXMgTG9hZGVyLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldFJlbG9hZGFibGUoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLnJlbG9hZGFibGUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHJlbG9hZGFibGUgZmxhZyBmb3IgdGhpcyBMb2FkZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVsb2FkYWJsZSBUaGUgbmV3IHJlbG9hZGFibGUgZmxhZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlbG9hZGFibGUoYm9vbGVhbiByZWxvYWRhYmxlKSB7CisKKyAgICAgICAgLy8gUHJvY2VzcyB0aGlzIHByb3BlcnR5IGNoYW5nZQorICAgICAgICBib29sZWFuIG9sZFJlbG9hZGFibGUgPSB0aGlzLnJlbG9hZGFibGU7CisgICAgICAgIHRoaXMucmVsb2FkYWJsZSA9IHJlbG9hZGFibGU7CisgICAgICAgIHN1cHBvcnQuZmlyZVByb3BlcnR5Q2hhbmdlKCJyZWxvYWRhYmxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJvb2xlYW4ob2xkUmVsb2FkYWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCb29sZWFuKHRoaXMucmVsb2FkYWJsZSkpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogQWRkIGEgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyIHRvIHRoaXMgY29tcG9uZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciB0byBhZGQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKworICAgICAgICBzdXBwb3J0LmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBuZXcgcmVwb3NpdG9yeSB0byB0aGUgc2V0IG9mIHJlcG9zaXRvcmllcyBmb3IgdGhpcyBjbGFzcyBsb2FkZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVwb3NpdG9yeSBSZXBvc2l0b3J5IHRvIGJlIGFkZGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkUmVwb3NpdG9yeShTdHJpbmcgcmVwb3NpdG9yeSkgeworCisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZyhzbS5nZXRTdHJpbmcoIndlYmFwcExvYWRlci5hZGRSZXBvc2l0b3J5IiwgcmVwb3NpdG9yeSkpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwb3NpdG9yaWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAocmVwb3NpdG9yeS5lcXVhbHMocmVwb3NpdG9yaWVzW2ldKSkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIHJlc3VsdHNbXSA9IG5ldyBTdHJpbmdbcmVwb3NpdG9yaWVzLmxlbmd0aCArIDFdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcG9zaXRvcmllcy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIHJlc3VsdHNbaV0gPSByZXBvc2l0b3JpZXNbaV07CisgICAgICAgIHJlc3VsdHNbcmVwb3NpdG9yaWVzLmxlbmd0aF0gPSByZXBvc2l0b3J5OworICAgICAgICByZXBvc2l0b3JpZXMgPSByZXN1bHRzOworCisgICAgICAgIGlmIChzdGFydGVkICYmIChjbGFzc0xvYWRlciAhPSBudWxsKSkgeworICAgICAgICAgICAgY2xhc3NMb2FkZXIuYWRkUmVwb3NpdG9yeShyZXBvc2l0b3J5KTsKKyAgICAgICAgICAgIGlmKCBsb2FkZXJSZXBvc2l0b3JpZXMgIT0gbnVsbCApIGxvYWRlclJlcG9zaXRvcmllcy5hZGQocmVwb3NpdG9yeSk7CisgICAgICAgICAgICBzZXRDbGFzc1BhdGgoKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNldCBvZiByZXBvc2l0b3JpZXMgZGVmaW5lZCBmb3IgdGhpcyBjbGFzcyBsb2FkZXIuCisgICAgICogSWYgbm9uZSBhcmUgZGVmaW5lZCwgYSB6ZXJvLWxlbmd0aCBhcnJheSBpcyByZXR1cm5lZC4KKyAgICAgKiBGb3Igc2VjdXJpdHkgcmVhc29uLCByZXR1cm5zIGEgY2xvbmUgb2YgdGhlIEFycmF5IChzaW5jZSAKKyAgICAgKiBTdHJpbmcgYXJlIGltbXV0YWJsZSkuCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGZpbmRSZXBvc2l0b3JpZXMoKSB7CisKKyAgICAgICAgcmV0dXJuICgoU3RyaW5nW10pcmVwb3NpdG9yaWVzLmNsb25lKCkpOworCisgICAgfQorCisgICAgcHVibGljIFN0cmluZ1tdIGdldFJlcG9zaXRvcmllcygpIHsKKyAgICAgICAgcmV0dXJuICgoU3RyaW5nW10pcmVwb3NpdG9yaWVzLmNsb25lKCkpOworICAgIH0KKworICAgIC8qKiBFeHRyYSByZXBvc2l0b3JpZXMgZm9yIHRoaXMgbG9hZGVyCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRSZXBvc2l0b3JpZXNTdHJpbmcoKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBzYj1uZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGZvciggaW50IGk9MDsgaTxyZXBvc2l0b3JpZXMubGVuZ3RoIDsgaSsrICkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCByZXBvc2l0b3JpZXNbaV0pLmFwcGVuZCgiOiIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRMb2FkZXJSZXBvc2l0b3JpZXMoKSB7CisgICAgICAgIGlmKCBsb2FkZXJSZXBvc2l0b3JpZXM9PW51bGwgKSByZXR1cm4gIG51bGw7CisgICAgICAgIFN0cmluZyByZXNbXT1uZXcgU3RyaW5nWyBsb2FkZXJSZXBvc2l0b3JpZXMuc2l6ZSgpXTsKKyAgICAgICAgbG9hZGVyUmVwb3NpdG9yaWVzLnRvQXJyYXkocmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldExvYWRlclJlcG9zaXRvcmllc1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nIHJlcG9zaXRvcmllc1tdPWdldExvYWRlclJlcG9zaXRvcmllcygpOworICAgICAgICBTdHJpbmdCdWZmZXIgc2I9bmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBmb3IoIGludCBpPTA7IGk8cmVwb3NpdG9yaWVzLmxlbmd0aCA7IGkrKyApIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCggcmVwb3NpdG9yaWVzW2ldKS5hcHBlbmQoIjoiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICB9CisKKworICAgIC8qKiAKKyAgICAgKiBDbGFzc3BhdGgsIGFzIHNldCBpbiBvcmcuYXBhY2hlLmNhdGFsaW5hLmpzcF9jbGFzc3BhdGggY29udGV4dAorICAgICAqIHByb3BlcnR5CisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBjbGFzc3BhdGgKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzcGF0aCgpIHsKKyAgICAgICAgcmV0dXJuIGNsYXNzcGF0aDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEhhcyB0aGUgaW50ZXJuYWwgcmVwb3NpdG9yeSBhc3NvY2lhdGVkIHdpdGggdGhpcyBMb2FkZXIgYmVlbiBtb2RpZmllZCwKKyAgICAgKiBzdWNoIHRoYXQgdGhlIGxvYWRlZCBjbGFzc2VzIHNob3VsZCBiZSByZWxvYWRlZD8KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBtb2RpZmllZCgpIHsKKworICAgICAgICByZXR1cm4gKGNsYXNzTG9hZGVyLm1vZGlmaWVkKCkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBVc2VkIHRvIHBlcmlvZGljYWxseSBzaWduYWwgdG8gdGhlIGNsYXNzbG9hZGVyIHRvIHJlbGVhc2UgSkFSIHJlc291cmNlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbG9zZUpBUnMoYm9vbGVhbiBmb3JjZSkgeworICAgICAgICBpZiAoY2xhc3NMb2FkZXIgIT1udWxsKXsKKyAgICAgICAgICAgIGNsYXNzTG9hZGVyLmNsb3NlSkFScyhmb3JjZSk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lciBmcm9tIHRoaXMgY29tcG9uZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciB0byByZW1vdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKworICAgICAgICBzdXBwb3J0LnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBjb21wb25lbnQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCJXZWJhcHBMb2FkZXJbIik7CisgICAgICAgIGlmIChjb250YWluZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIHNiLmFwcGVuZChjb250YWluZXIuZ2V0TmFtZSgpKTsKKyAgICAgICAgc2IuYXBwZW5kKCJdIik7CisgICAgICAgIHJldHVybiAoc2IudG9TdHJpbmcoKSk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBMaWZlY3ljbGUgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBsaWZlY3ljbGUgZXZlbnQgbGlzdGVuZXIgdG8gdGhpcyBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRvIGFkZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZExpZmVjeWNsZUxpc3RlbmVyKExpZmVjeWNsZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisKKyAgICAgICAgbGlmZWN5Y2xlLmFkZExpZmVjeWNsZUxpc3RlbmVyKGxpc3RlbmVyKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBsaWZlY3ljbGUgbGlzdGVuZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGxpZmVjeWNsZS4gSWYgdGhpcyAKKyAgICAgKiBMaWZlY3ljbGUgaGFzIG5vIGxpc3RlbmVycyByZWdpc3RlcmVkLCBhIHplcm8tbGVuZ3RoIGFycmF5IGlzIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBMaWZlY3ljbGVMaXN0ZW5lcltdIGZpbmRMaWZlY3ljbGVMaXN0ZW5lcnMoKSB7CisKKyAgICAgICAgcmV0dXJuIGxpZmVjeWNsZS5maW5kTGlmZWN5Y2xlTGlzdGVuZXJzKCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhIGxpZmVjeWNsZSBldmVudCBsaXN0ZW5lciBmcm9tIHRoaXMgY29tcG9uZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciB0byByZW1vdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVMaWZlY3ljbGVMaXN0ZW5lcihMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lcikgeworCisgICAgICAgIGxpZmVjeWNsZS5yZW1vdmVMaWZlY3ljbGVMaXN0ZW5lcihsaXN0ZW5lcik7CisKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaW5pdGlhbGl6ZWQ9ZmFsc2U7CisKKyAgICBwdWJsaWMgdm9pZCBpbml0KCkgeworICAgICAgICBpbml0aWFsaXplZD10cnVlOworCisgICAgICAgIGlmKCBvbmFtZT09bnVsbCApIHsKKyAgICAgICAgICAgIC8vIG5vdCByZWdpc3RlcmVkIHlldCAtIHN0YW5kYWxvbmUgb3IgQVBJCisgICAgICAgICAgICBpZiggY29udGFpbmVyIGluc3RhbmNlb2YgU3RhbmRhcmRDb250ZXh0KSB7CisgICAgICAgICAgICAgICAgLy8gUmVnaXN0ZXIgb3Vyc2VsZi4gVGhlIGNvbnRhaW5lciBtdXN0IGJlIGEgd2ViYXBwCisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgU3RhbmRhcmRDb250ZXh0IGN0eD0oU3RhbmRhcmRDb250ZXh0KWNvbnRhaW5lcjsKKyAgICAgICAgICAgICAgICAgICAgRW5naW5lIGVuZz0oRW5naW5lKWN0eC5nZXRQYXJlbnQoKS5nZXRQYXJlbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBjdHguZ2V0UGF0aCgpOworICAgICAgICAgICAgICAgICAgICBpZiAocGF0aC5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXRoID0gIi8iOworICAgICAgICAgICAgICAgICAgICB9ICAgCisgICAgICAgICAgICAgICAgICAgIG9uYW1lPW5ldyBPYmplY3ROYW1lKGN0eC5nZXRFbmdpbmVOYW1lKCkgKyAiOnR5cGU9TG9hZGVyLHBhdGg9IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGggKyAiLGhvc3Q9IiArIGN0eC5nZXRQYXJlbnQoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICBSZWdpc3RyeS5nZXRSZWdpc3RyeShudWxsLCBudWxsKS5yZWdpc3RlckNvbXBvbmVudCh0aGlzLCBvbmFtZSwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXI9b25hbWU7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJFcnJvciByZWdpc3RlcmluZyBsb2FkZXIiLCBlICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYoIGNvbnRhaW5lciA9PSBudWxsICkgeworICAgICAgICAgICAgLy8gSk1YIGNyZWF0ZWQgdGhlIGxvYWRlcgorICAgICAgICAgICAgLy8gVE9ETworCisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkZXN0cm95KCkgeworICAgICAgICBpZiggY29udHJvbGxlcj09b25hbWUgKSB7CisgICAgICAgICAgICAvLyBTZWxmLXJlZ2lzdHJhdGlvbiwgdW5kbyBpdAorICAgICAgICAgICAgUmVnaXN0cnkuZ2V0UmVnaXN0cnkobnVsbCwgbnVsbCkudW5yZWdpc3RlckNvbXBvbmVudChvbmFtZSk7CisgICAgICAgICAgICBvbmFtZSA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgaW5pdGlhbGl6ZWQgPSBmYWxzZTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0IHRoaXMgY29tcG9uZW50LCBpbml0aWFsaXppbmcgb3VyIGFzc29jaWF0ZWQgY2xhc3MgbG9hZGVyLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBMaWZlY3ljbGVFeGNlcHRpb24gaWYgYSBsaWZlY3ljbGUgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnQoKSB0aHJvd3MgTGlmZWN5Y2xlRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gVmFsaWRhdGUgYW5kIHVwZGF0ZSBvdXIgY3VycmVudCBjb21wb25lbnQgc3RhdGUKKyAgICAgICAgaWYoICEgaW5pdGlhbGl6ZWQgKSBpbml0KCk7CisgICAgICAgIGlmIChzdGFydGVkKQorICAgICAgICAgICAgdGhyb3cgbmV3IExpZmVjeWNsZUV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoIndlYmFwcExvYWRlci5hbHJlYWR5U3RhcnRlZCIpKTsKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmRlYnVnKHNtLmdldFN0cmluZygid2ViYXBwTG9hZGVyLnN0YXJ0aW5nIikpOworICAgICAgICBsaWZlY3ljbGUuZmlyZUxpZmVjeWNsZUV2ZW50KFNUQVJUX0VWRU5ULCBudWxsKTsKKyAgICAgICAgc3RhcnRlZCA9IHRydWU7CisKKyAgICAgICAgaWYgKGNvbnRhaW5lci5nZXRSZXNvdXJjZXMoKSA9PSBudWxsKSB7CisgICAgICAgICAgICBsb2cuaW5mbygiTm8gcmVzb3VyY2VzIGZvciAiICsgY29udGFpbmVyKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAvLyBSZWdpc3RlciBhIHN0cmVhbSBoYW5kbGVyIGZhY3RvcnkgZm9yIHRoZSBKTkRJIHByb3RvY29sCisgICAgICAgIFVSTFN0cmVhbUhhbmRsZXJGYWN0b3J5IHN0cmVhbUhhbmRsZXJGYWN0b3J5ID0KKyAgICAgICAgICAgIG5ldyBEaXJDb250ZXh0VVJMU3RyZWFtSGFuZGxlckZhY3RvcnkoKTsKKyAgICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBVUkwuc2V0VVJMU3RyZWFtSGFuZGxlckZhY3Rvcnkoc3RyZWFtSGFuZGxlckZhY3RvcnkpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBMb2cgYW5kIGNvbnRpbnVlIGFueXdheSwgdGhpcyBpcyBub3QgY3JpdGljYWwKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkVycm9yIHJlZ2lzdGVyaW5nIGpuZGkgc3RyZWFtIGhhbmRsZXIiLCBlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBsaWtlbHkgYSBkdWFsIHJlZ2lzdHJhdGlvbgorICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJEdWFsIHJlZ2lzdHJhdGlvbiBvZiBqbmRpIHN0cmVhbSBoYW5kbGVyOiAiIAorICAgICAgICAgICAgICAgICAgICAgICAgICsgdC5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gQ29uc3RydWN0IGEgY2xhc3MgbG9hZGVyIGJhc2VkIG9uIG91ciBjdXJyZW50IHJlcG9zaXRvcmllcyBsaXN0CisgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgIGNsYXNzTG9hZGVyID0gY3JlYXRlQ2xhc3NMb2FkZXIoKTsKKyAgICAgICAgICAgIGNsYXNzTG9hZGVyLnNldFJlc291cmNlcyhjb250YWluZXIuZ2V0UmVzb3VyY2VzKCkpOworICAgICAgICAgICAgY2xhc3NMb2FkZXIuc2V0RGVsZWdhdGUodGhpcy5kZWxlZ2F0ZSk7CisgICAgICAgICAgICBpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgU3RhbmRhcmRDb250ZXh0KQorICAgICAgICAgICAgICAgIGNsYXNzTG9hZGVyLnNldEFudGlKQVJMb2NraW5nKCgoU3RhbmRhcmRDb250ZXh0KSBjb250YWluZXIpLmdldEFudGlKQVJMb2NraW5nKCkpOworCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcG9zaXRvcmllcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGNsYXNzTG9hZGVyLmFkZFJlcG9zaXRvcnkocmVwb3NpdG9yaWVzW2ldKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQ29uZmlndXJlIG91ciByZXBvc2l0b3JpZXMKKyAgICAgICAgICAgIHNldFJlcG9zaXRvcmllcygpOworICAgICAgICAgICAgc2V0Q2xhc3NQYXRoKCk7CisKKyAgICAgICAgICAgIHNldFBlcm1pc3Npb25zKCk7CisKKyAgICAgICAgICAgIGlmIChjbGFzc0xvYWRlciBpbnN0YW5jZW9mIExpZmVjeWNsZSkKKyAgICAgICAgICAgICAgICAoKExpZmVjeWNsZSkgY2xhc3NMb2FkZXIpLnN0YXJ0KCk7CisKKyAgICAgICAgICAgIC8vIEJpbmRpbmcgdGhlIFdlYmFwcCBjbGFzcyBsb2FkZXIgdG8gdGhlIGRpcmVjdG9yeSBjb250ZXh0CisgICAgICAgICAgICBEaXJDb250ZXh0VVJMU3RyZWFtSGFuZGxlci5iaW5kCisgICAgICAgICAgICAgICAgKChDbGFzc0xvYWRlcikgY2xhc3NMb2FkZXIsIHRoaXMuY29udGFpbmVyLmdldFJlc291cmNlcygpKTsKKworICAgICAgICAgICAgU3RhbmRhcmRDb250ZXh0IGN0eD0oU3RhbmRhcmRDb250ZXh0KWNvbnRhaW5lcjsKKyAgICAgICAgICAgIEVuZ2luZSBlbmc9KEVuZ2luZSljdHguZ2V0UGFyZW50KCkuZ2V0UGFyZW50KCk7CisgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IGN0eC5nZXRQYXRoKCk7CisgICAgICAgICAgICBpZiAocGF0aC5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICAgICAgcGF0aCA9ICIvIjsKKyAgICAgICAgICAgIH0gICAKKyAgICAgICAgICAgIE9iamVjdE5hbWUgY2xvbmFtZSA9IG5ldyBPYmplY3ROYW1lCisgICAgICAgICAgICAgICAgKGN0eC5nZXRFbmdpbmVOYW1lKCkgKyAiOnR5cGU9V2ViYXBwQ2xhc3NMb2FkZXIscGF0aD0iCisgICAgICAgICAgICAgICAgICsgcGF0aCArICIsaG9zdD0iICsgY3R4LmdldFBhcmVudCgpLmdldE5hbWUoKSk7CisgICAgICAgICAgICBSZWdpc3RyeS5nZXRSZWdpc3RyeShudWxsLCBudWxsKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlckNvbXBvbmVudChjbGFzc0xvYWRlciwgY2xvbmFtZSwgbnVsbCk7CisKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIGxvZy5lcnJvciggIkxpZmVjeWNsZUV4Y2VwdGlvbiAiLCB0ICk7CisgICAgICAgICAgICB0aHJvdyBuZXcgTGlmZWN5Y2xlRXhjZXB0aW9uKCJzdGFydDogIiwgdCk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU3RvcCB0aGlzIGNvbXBvbmVudCwgZmluYWxpemluZyBvdXIgYXNzb2NpYXRlZCBjbGFzcyBsb2FkZXIuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIExpZmVjeWNsZUV4Y2VwdGlvbiBpZiBhIGxpZmVjeWNsZSBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdG9wKCkgdGhyb3dzIExpZmVjeWNsZUV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gVmFsaWRhdGUgYW5kIHVwZGF0ZSBvdXIgY3VycmVudCBjb21wb25lbnQgc3RhdGUKKyAgICAgICAgaWYgKCFzdGFydGVkKQorICAgICAgICAgICAgdGhyb3cgbmV3IExpZmVjeWNsZUV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoIndlYmFwcExvYWRlci5ub3RTdGFydGVkIikpOworICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoc20uZ2V0U3RyaW5nKCJ3ZWJhcHBMb2FkZXIuc3RvcHBpbmciKSk7CisgICAgICAgIGxpZmVjeWNsZS5maXJlTGlmZWN5Y2xlRXZlbnQoU1RPUF9FVkVOVCwgbnVsbCk7CisgICAgICAgIHN0YXJ0ZWQgPSBmYWxzZTsKKworICAgICAgICAvLyBSZW1vdmUgY29udGV4dCBhdHRyaWJ1dGVzIGFzIGFwcHJvcHJpYXRlCisgICAgICAgIGlmIChjb250YWluZXIgaW5zdGFuY2VvZiBDb250ZXh0KSB7CisgICAgICAgICAgICBTZXJ2bGV0Q29udGV4dCBzZXJ2bGV0Q29udGV4dCA9CisgICAgICAgICAgICAgICAgKChDb250ZXh0KSBjb250YWluZXIpLmdldFNlcnZsZXRDb250ZXh0KCk7CisgICAgICAgICAgICBzZXJ2bGV0Q29udGV4dC5yZW1vdmVBdHRyaWJ1dGUoR2xvYmFscy5DTEFTU19QQVRIX0FUVFIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gVGhyb3cgYXdheSBvdXIgY3VycmVudCBjbGFzcyBsb2FkZXIKKyAgICAgICAgaWYgKGNsYXNzTG9hZGVyIGluc3RhbmNlb2YgTGlmZWN5Y2xlKQorICAgICAgICAgICAgKChMaWZlY3ljbGUpIGNsYXNzTG9hZGVyKS5zdG9wKCk7CisgICAgICAgIERpckNvbnRleHRVUkxTdHJlYW1IYW5kbGVyLnVuYmluZCgoQ2xhc3NMb2FkZXIpIGNsYXNzTG9hZGVyKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3RhbmRhcmRDb250ZXh0IGN0eD0oU3RhbmRhcmRDb250ZXh0KWNvbnRhaW5lcjsKKyAgICAgICAgICAgIEVuZ2luZSBlbmc9KEVuZ2luZSljdHguZ2V0UGFyZW50KCkuZ2V0UGFyZW50KCk7CisgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IGN0eC5nZXRQYXRoKCk7CisgICAgICAgICAgICBpZiAocGF0aC5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICAgICAgcGF0aCA9ICIvIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE9iamVjdE5hbWUgY2xvbmFtZSA9IG5ldyBPYmplY3ROYW1lCisgICAgICAgICAgICAgICAgKGN0eC5nZXRFbmdpbmVOYW1lKCkgKyAiOnR5cGU9V2ViYXBwQ2xhc3NMb2FkZXIscGF0aD0iCisgICAgICAgICAgICAgICAgICsgcGF0aCArICIsaG9zdD0iICsgY3R4LmdldFBhcmVudCgpLmdldE5hbWUoKSk7CisgICAgICAgICAgICBSZWdpc3RyeS5nZXRSZWdpc3RyeShudWxsLCBudWxsKS51bnJlZ2lzdGVyQ29tcG9uZW50KGNsb25hbWUpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgbG9nLmVycm9yKCAiTGlmZWN5Y2xlRXhjZXB0aW9uICIsIHQgKTsKKyAgICAgICAgfQorCisgICAgICAgIGNsYXNzTG9hZGVyID0gbnVsbDsKKworICAgICAgICBkZXN0cm95KCk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHByb3BlcnR5IGNoYW5nZSBldmVudHMgZnJvbSBvdXIgYXNzb2NpYXRlZCBDb250ZXh0LgorICAgICAqCisgICAgICogQHBhcmFtIGV2ZW50IFRoZSBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQgdGhhdCBoYXMgb2NjdXJyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7CisKKyAgICAgICAgLy8gVmFsaWRhdGUgdGhlIHNvdXJjZSBvZiB0aGlzIGV2ZW50CisgICAgICAgIGlmICghKGV2ZW50LmdldFNvdXJjZSgpIGluc3RhbmNlb2YgQ29udGV4dCkpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIENvbnRleHQgY29udGV4dCA9IChDb250ZXh0KSBldmVudC5nZXRTb3VyY2UoKTsKKworICAgICAgICAvLyBQcm9jZXNzIGEgcmVsZXZhbnQgcHJvcGVydHkgY2hhbmdlCisgICAgICAgIGlmIChldmVudC5nZXRQcm9wZXJ0eU5hbWUoKS5lcXVhbHMoInJlbG9hZGFibGUiKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBzZXRSZWxvYWRhYmxlCisgICAgICAgICAgICAgICAgICAgICggKChCb29sZWFuKSBldmVudC5nZXROZXdWYWx1ZSgpKS5ib29sZWFuVmFsdWUoKSApOworICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3Ioc20uZ2V0U3RyaW5nKCJ3ZWJhcHBMb2FkZXIucmVsb2FkYWJsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5nZXROZXdWYWx1ZSgpLnRvU3RyaW5nKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByaXZhdGUgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYXNzb2NpYXRlZCBjbGFzc0xvYWRlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIFdlYmFwcENsYXNzTG9hZGVyIGNyZWF0ZUNsYXNzTG9hZGVyKCkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgQ2xhc3MgY2xhenogPSBDbGFzcy5mb3JOYW1lKGxvYWRlckNsYXNzKTsKKyAgICAgICAgV2ViYXBwQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIgPSBudWxsOworCisgICAgICAgIGlmIChwYXJlbnRDbGFzc0xvYWRlciA9PSBudWxsKSB7CisgICAgICAgICAgICBwYXJlbnRDbGFzc0xvYWRlciA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7CisgICAgICAgIH0KKyAgICAgICAgQ2xhc3NbXSBhcmdUeXBlcyA9IHsgQ2xhc3NMb2FkZXIuY2xhc3MgfTsKKyAgICAgICAgT2JqZWN0W10gYXJncyA9IHsgcGFyZW50Q2xhc3NMb2FkZXIgfTsKKyAgICAgICAgQ29uc3RydWN0b3IgY29uc3RyID0gY2xhenouZ2V0Q29uc3RydWN0b3IoYXJnVHlwZXMpOworICAgICAgICBjbGFzc0xvYWRlciA9IChXZWJhcHBDbGFzc0xvYWRlcikgY29uc3RyLm5ld0luc3RhbmNlKGFyZ3MpOworCisgICAgICAgIHJldHVybiBjbGFzc0xvYWRlcjsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29uZmlndXJlIGFzc29jaWF0ZWQgY2xhc3MgbG9hZGVyIHBlcm1pc3Npb25zLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZXRQZXJtaXNzaW9ucygpIHsKKworICAgICAgICBpZiAoU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGlmICghKGNvbnRhaW5lciBpbnN0YW5jZW9mIENvbnRleHQpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8vIFRlbGwgdGhlIGNsYXNzIGxvYWRlciB0aGUgcm9vdCBvZiB0aGUgY29udGV4dAorICAgICAgICBTZXJ2bGV0Q29udGV4dCBzZXJ2bGV0Q29udGV4dCA9CisgICAgICAgICAgICAoKENvbnRleHQpIGNvbnRhaW5lcikuZ2V0U2VydmxldENvbnRleHQoKTsKKworICAgICAgICAvLyBBc3NpZ25pbmcgcGVybWlzc2lvbnMgZm9yIHRoZSB3b3JrIGRpcmVjdG9yeQorICAgICAgICBGaWxlIHdvcmtEaXIgPQorICAgICAgICAgICAgKEZpbGUpIHNlcnZsZXRDb250ZXh0LmdldEF0dHJpYnV0ZShHbG9iYWxzLldPUktfRElSX0FUVFIpOworICAgICAgICBpZiAod29ya0RpciAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFN0cmluZyB3b3JrRGlyUGF0aCA9IHdvcmtEaXIuZ2V0Q2Fub25pY2FsUGF0aCgpOworICAgICAgICAgICAgICAgIGNsYXNzTG9hZGVyLmFkZFBlcm1pc3Npb24KKyAgICAgICAgICAgICAgICAgICAgKG5ldyBGaWxlUGVybWlzc2lvbih3b3JrRGlyUGF0aCwgInJlYWQsd3JpdGUiKSk7CisgICAgICAgICAgICAgICAgY2xhc3NMb2FkZXIuYWRkUGVybWlzc2lvbgorICAgICAgICAgICAgICAgICAgICAobmV3IEZpbGVQZXJtaXNzaW9uKHdvcmtEaXJQYXRoICsgRmlsZS5zZXBhcmF0b3IgKyAiLSIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkLHdyaXRlLGRlbGV0ZSIpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBJZ25vcmUKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgIFVSTCByb290VVJMID0gc2VydmxldENvbnRleHQuZ2V0UmVzb3VyY2UoIi8iKTsKKyAgICAgICAgICAgIGNsYXNzTG9hZGVyLmFkZFBlcm1pc3Npb24ocm9vdFVSTCk7CisKKyAgICAgICAgICAgIFN0cmluZyBjb250ZXh0Um9vdCA9IHNlcnZsZXRDb250ZXh0LmdldFJlYWxQYXRoKCIvIik7CisgICAgICAgICAgICBpZiAoY29udGV4dFJvb3QgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRleHRSb290ID0gKG5ldyBGaWxlKGNvbnRleHRSb290KSkuZ2V0Q2Fub25pY2FsUGF0aCgpOworICAgICAgICAgICAgICAgICAgICBjbGFzc0xvYWRlci5hZGRQZXJtaXNzaW9uKGNvbnRleHRSb290KTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgVVJMIGNsYXNzZXNVUkwgPSBzZXJ2bGV0Q29udGV4dC5nZXRSZXNvdXJjZSgiL1dFQi1JTkYvY2xhc3Nlcy8iKTsKKyAgICAgICAgICAgIGNsYXNzTG9hZGVyLmFkZFBlcm1pc3Npb24oY2xhc3Nlc1VSTCk7CisgICAgICAgICAgICBVUkwgbGliVVJMID0gc2VydmxldENvbnRleHQuZ2V0UmVzb3VyY2UoIi9XRUItSU5GL2xpYi8iKTsKKyAgICAgICAgICAgIGNsYXNzTG9hZGVyLmFkZFBlcm1pc3Npb24obGliVVJMKTsKKworICAgICAgICAgICAgaWYgKGNvbnRleHRSb290ICE9IG51bGwpIHsKKworICAgICAgICAgICAgICAgIGlmIChsaWJVUkwgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBGaWxlIHJvb3REaXIgPSBuZXcgRmlsZShjb250ZXh0Um9vdCk7CisgICAgICAgICAgICAgICAgICAgIEZpbGUgbGliRGlyID0gbmV3IEZpbGUocm9vdERpciwgIldFQi1JTkYvbGliLyIpOworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBsaWJEaXIuZ2V0Q2Fub25pY2FsUGF0aCgpOworICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NMb2FkZXIuYWRkUGVybWlzc2lvbihwYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAgICAgaWYgKHdvcmtEaXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpZiAobGliVVJMICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUgbGliRGlyID0gbmV3IEZpbGUod29ya0RpciwgIldFQi1JTkYvbGliLyIpOworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IGxpYkRpci5nZXRDYW5vbmljYWxQYXRoKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NMb2FkZXIuYWRkUGVybWlzc2lvbihwYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoY2xhc3Nlc1VSTCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBGaWxlIGNsYXNzZXNEaXIgPSBuZXcgRmlsZSh3b3JrRGlyLCAiV0VCLUlORi9jbGFzc2VzLyIpOworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IGNsYXNzZXNEaXIuZ2V0Q2Fub25pY2FsUGF0aCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTG9hZGVyLmFkZFBlcm1pc3Npb24ocGF0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvbmZpZ3VyZSB0aGUgcmVwb3NpdG9yaWVzIGZvciBvdXIgY2xhc3MgbG9hZGVyLCBiYXNlZCBvbiB0aGUKKyAgICAgKiBhc3NvY2lhdGVkIENvbnRleHQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNldFJlcG9zaXRvcmllcygpIHsKKworICAgICAgICBpZiAoIShjb250YWluZXIgaW5zdGFuY2VvZiBDb250ZXh0KSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgU2VydmxldENvbnRleHQgc2VydmxldENvbnRleHQgPQorICAgICAgICAgICAgKChDb250ZXh0KSBjb250YWluZXIpLmdldFNlcnZsZXRDb250ZXh0KCk7CisgICAgICAgIGlmIChzZXJ2bGV0Q29udGV4dCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGxvYWRlclJlcG9zaXRvcmllcz1uZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIC8vIExvYWRpbmcgdGhlIHdvcmsgZGlyZWN0b3J5CisgICAgICAgIEZpbGUgd29ya0RpciA9CisgICAgICAgICAgICAoRmlsZSkgc2VydmxldENvbnRleHQuZ2V0QXR0cmlidXRlKEdsb2JhbHMuV09SS19ESVJfQVRUUik7CisgICAgICAgIGlmICh3b3JrRGlyID09IG51bGwpIHsKKyAgICAgICAgICAgIGxvZy5pbmZvKCJObyB3b3JrIGRpciBmb3IgIiArIHNlcnZsZXRDb250ZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgCisgICAgICAgICAgICBsb2cuZGVidWcoc20uZ2V0U3RyaW5nKCJ3ZWJhcHBMb2FkZXIuZGVwbG95Iiwgd29ya0Rpci5nZXRBYnNvbHV0ZVBhdGgoKSkpOworCisgICAgICAgIGNsYXNzTG9hZGVyLnNldFdvcmtEaXIod29ya0Rpcik7CisKKyAgICAgICAgRGlyQ29udGV4dCByZXNvdXJjZXMgPSBjb250YWluZXIuZ2V0UmVzb3VyY2VzKCk7CisKKyAgICAgICAgLy8gU2V0dGluZyB1cCB0aGUgY2xhc3MgcmVwb3NpdG9yeSAoL1dFQi1JTkYvY2xhc3NlcyksIGlmIGl0IGV4aXN0cworCisgICAgICAgIFN0cmluZyBjbGFzc2VzUGF0aCA9ICIvV0VCLUlORi9jbGFzc2VzIjsKKyAgICAgICAgRGlyQ29udGV4dCBjbGFzc2VzID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgT2JqZWN0IG9iamVjdCA9IHJlc291cmNlcy5sb29rdXAoY2xhc3Nlc1BhdGgpOworICAgICAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIERpckNvbnRleHQpIHsKKyAgICAgICAgICAgICAgICBjbGFzc2VzID0gKERpckNvbnRleHQpIG9iamVjdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaChOYW1pbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gU2lsZW50IGNhdGNoOiBpdCdzIHZhbGlkIHRoYXQgbm8gL1dFQi1JTkYvY2xhc3NlcyBjb2xsZWN0aW9uCisgICAgICAgICAgICAvLyBleGlzdHMKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjbGFzc2VzICE9IG51bGwpIHsKKworICAgICAgICAgICAgRmlsZSBjbGFzc1JlcG9zaXRvcnkgPSBudWxsOworCisgICAgICAgICAgICBTdHJpbmcgYWJzb2x1dGVDbGFzc2VzUGF0aCA9CisgICAgICAgICAgICAgICAgc2VydmxldENvbnRleHQuZ2V0UmVhbFBhdGgoY2xhc3Nlc1BhdGgpOworCisgICAgICAgICAgICBpZiAoYWJzb2x1dGVDbGFzc2VzUGF0aCAhPSBudWxsKSB7CisKKyAgICAgICAgICAgICAgICBjbGFzc1JlcG9zaXRvcnkgPSBuZXcgRmlsZShhYnNvbHV0ZUNsYXNzZXNQYXRoKTsKKworICAgICAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgICAgIGNsYXNzUmVwb3NpdG9yeSA9IG5ldyBGaWxlKHdvcmtEaXIsIGNsYXNzZXNQYXRoKTsKKyAgICAgICAgICAgICAgICBjbGFzc1JlcG9zaXRvcnkubWtkaXJzKCk7CisgICAgICAgICAgICAgICAgY29weURpcihjbGFzc2VzLCBjbGFzc1JlcG9zaXRvcnkpOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhzbS5nZXRTdHJpbmcoIndlYmFwcExvYWRlci5jbGFzc0RlcGxveSIsIGNsYXNzZXNQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc1JlcG9zaXRvcnkuZ2V0QWJzb2x1dGVQYXRoKCkpKTsKKworCisgICAgICAgICAgICAvLyBBZGRpbmcgdGhlIHJlcG9zaXRvcnkgdG8gdGhlIGNsYXNzIGxvYWRlcgorICAgICAgICAgICAgY2xhc3NMb2FkZXIuYWRkUmVwb3NpdG9yeShjbGFzc2VzUGF0aCArICIvIiwgY2xhc3NSZXBvc2l0b3J5KTsKKyAgICAgICAgICAgIGxvYWRlclJlcG9zaXRvcmllcy5hZGQoY2xhc3Nlc1BhdGggKyAiLyIgKTsKKworICAgICAgICB9CisKKyAgICAgICAgLy8gU2V0dGluZyB1cCB0aGUgSkFSIHJlcG9zaXRvcnkgKC9XRUItSU5GL2xpYiksIGlmIGl0IGV4aXN0cworCisgICAgICAgIFN0cmluZyBsaWJQYXRoID0gIi9XRUItSU5GL2xpYiI7CisKKyAgICAgICAgY2xhc3NMb2FkZXIuc2V0SmFyUGF0aChsaWJQYXRoKTsKKworICAgICAgICBEaXJDb250ZXh0IGxpYkRpciA9IG51bGw7CisgICAgICAgIC8vIExvb2tpbmcgdXAgZGlyZWN0b3J5IC9XRUItSU5GL2xpYiBpbiB0aGUgY29udGV4dAorICAgICAgICB0cnkgeworICAgICAgICAgICAgT2JqZWN0IG9iamVjdCA9IHJlc291cmNlcy5sb29rdXAobGliUGF0aCk7CisgICAgICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgRGlyQ29udGV4dCkKKyAgICAgICAgICAgICAgICBsaWJEaXIgPSAoRGlyQ29udGV4dCkgb2JqZWN0OworICAgICAgICB9IGNhdGNoKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBTaWxlbnQgY2F0Y2g6IGl0J3MgdmFsaWQgdGhhdCBubyAvV0VCLUlORi9saWIgY29sbGVjdGlvbgorICAgICAgICAgICAgLy8gZXhpc3RzCisgICAgICAgIH0KKworICAgICAgICBpZiAobGliRGlyICE9IG51bGwpIHsKKworICAgICAgICAgICAgYm9vbGVhbiBjb3B5SmFycyA9IGZhbHNlOworICAgICAgICAgICAgU3RyaW5nIGFic29sdXRlTGliUGF0aCA9IHNlcnZsZXRDb250ZXh0LmdldFJlYWxQYXRoKGxpYlBhdGgpOworCisgICAgICAgICAgICBGaWxlIGRlc3REaXIgPSBudWxsOworCisgICAgICAgICAgICBpZiAoYWJzb2x1dGVMaWJQYXRoICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBkZXN0RGlyID0gbmV3IEZpbGUoYWJzb2x1dGVMaWJQYXRoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY29weUphcnMgPSB0cnVlOworICAgICAgICAgICAgICAgIGRlc3REaXIgPSBuZXcgRmlsZSh3b3JrRGlyLCBsaWJQYXRoKTsKKyAgICAgICAgICAgICAgICBkZXN0RGlyLm1rZGlycygpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBMb29raW5nIHVwIGRpcmVjdG9yeSAvV0VCLUlORi9saWIgaW4gdGhlIGNvbnRleHQKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgTmFtaW5nRW51bWVyYXRpb24gZW51bWVyYXRpb24gPSByZXNvdXJjZXMubGlzdEJpbmRpbmdzKGxpYlBhdGgpOworICAgICAgICAgICAgICAgIHdoaWxlIChlbnVtZXJhdGlvbi5oYXNNb3JlRWxlbWVudHMoKSkgeworCisgICAgICAgICAgICAgICAgICAgIEJpbmRpbmcgYmluZGluZyA9IChCaW5kaW5nKSBlbnVtZXJhdGlvbi5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPSBsaWJQYXRoICsgIi8iICsgYmluZGluZy5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghZmlsZW5hbWUuZW5kc1dpdGgoIi5qYXIiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgICAgIC8vIENvcHkgSkFSIGluIHRoZSB3b3JrIGRpcmVjdG9yeSwgYWx3YXlzICh0aGUgSkFSIGZpbGUKKyAgICAgICAgICAgICAgICAgICAgLy8gd291bGQgZ2V0IGxvY2tlZCBvdGhlcndpc2UsIHdoaWNoIHdvdWxkIG1ha2UgaXQKKyAgICAgICAgICAgICAgICAgICAgLy8gaW1wb3NzaWJsZSB0byB1cGRhdGUgaXQgb3IgcmVtb3ZlIGl0IGF0IHJ1bnRpbWUpCisgICAgICAgICAgICAgICAgICAgIEZpbGUgZGVzdEZpbGUgPSBuZXcgRmlsZShkZXN0RGlyLCBiaW5kaW5nLmdldE5hbWUoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYoIGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoc20uZ2V0U3RyaW5nKCJ3ZWJhcHBMb2FkZXIuamFyRGVwbG95IiwgZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpKTsKKworICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZSBqYXJSZXNvdXJjZSA9IChSZXNvdXJjZSkgYmluZGluZy5nZXRPYmplY3QoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvcHlKYXJzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvcHkoamFyUmVzb3VyY2Uuc3RyZWFtQ29udGVudCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlT3V0cHV0U3RyZWFtKGRlc3RGaWxlKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgSmFyRmlsZSBqYXJGaWxlID0gbmV3IEphckZpbGUoZGVzdEZpbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NMb2FkZXIuYWRkSmFyKGZpbGVuYW1lLCBqYXJGaWxlLCBkZXN0RmlsZSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2F0Y2ggdGhlIGV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbiBlbXB0eSBqYXIgZmlsZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2hvdWxkIGlnbm9yZSBhbmQgY29udGludXRlIGxvYWRpbmcgb3RoZXIgamFyIGZpbGVzIAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gdGhlIGRpcgorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBsb2FkZXJSZXBvc2l0b3JpZXMuYWRkKCBmaWxlbmFtZSApOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBTaWxlbnQgY2F0Y2g6IGl0J3MgdmFsaWQgdGhhdCBubyAvV0VCLUlORi9saWIgZGlyZWN0b3J5CisgICAgICAgICAgICAgICAgLy8gZXhpc3RzCisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYXBwcm9wcmlhdGUgY29udGV4dCBhdHRyaWJ1dGUgZm9yIG91ciBjbGFzcyBwYXRoLiAgVGhpcworICAgICAqIGlzIHJlcXVpcmVkIG9ubHkgYmVjYXVzZSBKYXNwZXIgZGVwZW5kcyBvbiBpdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2V0Q2xhc3NQYXRoKCkgeworCisgICAgICAgIC8vIFZhbGlkYXRlIG91ciBjdXJyZW50IHN0YXRlIGluZm9ybWF0aW9uCisgICAgICAgIGlmICghKGNvbnRhaW5lciBpbnN0YW5jZW9mIENvbnRleHQpKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBTZXJ2bGV0Q29udGV4dCBzZXJ2bGV0Q29udGV4dCA9CisgICAgICAgICAgICAoKENvbnRleHQpIGNvbnRhaW5lcikuZ2V0U2VydmxldENvbnRleHQoKTsKKyAgICAgICAgaWYgKHNlcnZsZXRDb250ZXh0ID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFN0YW5kYXJkQ29udGV4dCkgeworICAgICAgICAgICAgU3RyaW5nIGJhc2VDbGFzc3BhdGggPSAKKyAgICAgICAgICAgICAgICAoKFN0YW5kYXJkQ29udGV4dCkgY29udGFpbmVyKS5nZXRDb21waWxlckNsYXNzcGF0aCgpOworICAgICAgICAgICAgaWYgKGJhc2VDbGFzc3BhdGggIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNlcnZsZXRDb250ZXh0LnNldEF0dHJpYnV0ZShHbG9iYWxzLkNMQVNTX1BBVEhfQVRUUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZUNsYXNzcGF0aCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIGNsYXNzcGF0aCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKworICAgICAgICAvLyBBc3NlbWJsZSB0aGUgY2xhc3MgcGF0aCBpbmZvcm1hdGlvbiBmcm9tIG91ciBjbGFzcyBsb2FkZXIgY2hhaW4KKyAgICAgICAgQ2xhc3NMb2FkZXIgbG9hZGVyID0gZ2V0Q2xhc3NMb2FkZXIoKTsKKyAgICAgICAgaW50IGxheWVycyA9IDA7CisgICAgICAgIGludCBuID0gMDsKKyAgICAgICAgd2hpbGUgKGxvYWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoIShsb2FkZXIgaW5zdGFuY2VvZiBVUkxDbGFzc0xvYWRlcikpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgY3A9Z2V0Q2xhc3NwYXRoKCBsb2FkZXIgKTsKKyAgICAgICAgICAgICAgICBpZiggY3A9PW51bGwgKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKCAiVW5rbm93biBsb2FkZXIgIiArIGxvYWRlciArICIgIiArIGxvYWRlci5nZXRDbGFzcygpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG4gPiAwKSAKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzcGF0aC5hcHBlbmQoRmlsZS5wYXRoU2VwYXJhdG9yKTsKKyAgICAgICAgICAgICAgICAgICAgY2xhc3NwYXRoLmFwcGVuZChjcCk7CisgICAgICAgICAgICAgICAgICAgIG4rKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgLy9jb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFVSTCByZXBvc2l0b3JpZXNbXSA9CisgICAgICAgICAgICAgICAgKChVUkxDbGFzc0xvYWRlcikgbG9hZGVyKS5nZXRVUkxzKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcG9zaXRvcmllcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIFN0cmluZyByZXBvc2l0b3J5ID0gcmVwb3NpdG9yaWVzW2ldLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgaWYgKHJlcG9zaXRvcnkuc3RhcnRzV2l0aCgiZmlsZTovLyIpKQorICAgICAgICAgICAgICAgICAgICByZXBvc2l0b3J5ID0gcmVwb3NpdG9yeS5zdWJzdHJpbmcoNyk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAocmVwb3NpdG9yeS5zdGFydHNXaXRoKCJmaWxlOiIpKQorICAgICAgICAgICAgICAgICAgICByZXBvc2l0b3J5ID0gcmVwb3NpdG9yeS5zdWJzdHJpbmcoNSk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAocmVwb3NpdG9yeS5zdGFydHNXaXRoKCJqbmRpOiIpKQorICAgICAgICAgICAgICAgICAgICByZXBvc2l0b3J5ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZsZXRDb250ZXh0LmdldFJlYWxQYXRoKHJlcG9zaXRvcnkuc3Vic3RyaW5nKDUpKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGlmIChyZXBvc2l0b3J5ID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGlmIChuID4gMCkKKyAgICAgICAgICAgICAgICAgICAgY2xhc3NwYXRoLmFwcGVuZChGaWxlLnBhdGhTZXBhcmF0b3IpOworICAgICAgICAgICAgICAgIGNsYXNzcGF0aC5hcHBlbmQocmVwb3NpdG9yeSk7CisgICAgICAgICAgICAgICAgbisrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9hZGVyID0gbG9hZGVyLmdldFBhcmVudCgpOworICAgICAgICAgICAgbGF5ZXJzKys7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLmNsYXNzcGF0aD1jbGFzc3BhdGgudG9TdHJpbmcoKTsKKworICAgICAgICAvLyBTdG9yZSB0aGUgYXNzZW1ibGVkIGNsYXNzIHBhdGggYXMgYSBzZXJ2bGV0IGNvbnRleHQgYXR0cmlidXRlCisgICAgICAgIHNlcnZsZXRDb250ZXh0LnNldEF0dHJpYnV0ZShHbG9iYWxzLkNMQVNTX1BBVEhfQVRUUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzcGF0aC50b1N0cmluZygpKTsKKworICAgIH0KKworICAgIC8vIHRyeSB0byBleHRyYWN0IHRoZSBjbGFzc3BhdGggZnJvbSBhIGxvYWRlciB0aGF0IGlzIG5vdCBVUkxDbGFzc0xvYWRlcgorICAgIHByaXZhdGUgU3RyaW5nIGdldENsYXNzcGF0aCggQ2xhc3NMb2FkZXIgbG9hZGVyICkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgTWV0aG9kIG09bG9hZGVyLmdldENsYXNzKCkuZ2V0TWV0aG9kKCJnZXRDbGFzc3BhdGgiLCBuZXcgQ2xhc3NbXSB7fSk7CisgICAgICAgICAgICBpZiggbG9nLmlzVHJhY2VFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLnRyYWNlKCJnZXRDbGFzc3BhdGggIiArIG0gKTsKKyAgICAgICAgICAgIGlmKCBtPT1udWxsICkgcmV0dXJuIG51bGw7CisgICAgICAgICAgICBPYmplY3Qgbz1tLmludm9rZSggbG9hZGVyLCBuZXcgT2JqZWN0W10ge30gKTsKKyAgICAgICAgICAgIGlmKCBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSApCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJnb3RDbGFzc3BhdGggIiArIG8pOworICAgICAgICAgICAgaWYoIG8gaW5zdGFuY2VvZiBTdHJpbmcgKQorICAgICAgICAgICAgICAgIHJldHVybiAoU3RyaW5nKW87CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfSBjYXRjaCggRXhjZXB0aW9uIGV4ICkgeworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiZ2V0Q2xhc3NwYXRoICIsIGV4KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb3B5IGRpcmVjdG9yeS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gY29weURpcihEaXJDb250ZXh0IHNyY0RpciwgRmlsZSBkZXN0RGlyKSB7CisKKyAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgTmFtaW5nRW51bWVyYXRpb24gZW51bWVyYXRpb24gPSBzcmNEaXIubGlzdCgiIik7CisgICAgICAgICAgICB3aGlsZSAoZW51bWVyYXRpb24uaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICBOYW1lQ2xhc3NQYWlyIG5jUGFpciA9CisgICAgICAgICAgICAgICAgICAgIChOYW1lQ2xhc3NQYWlyKSBlbnVtZXJhdGlvbi5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gbmNQYWlyLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICBPYmplY3Qgb2JqZWN0ID0gc3JjRGlyLmxvb2t1cChuYW1lKTsKKyAgICAgICAgICAgICAgICBGaWxlIGN1cnJlbnRGaWxlID0gbmV3IEZpbGUoZGVzdERpciwgbmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFJlc291cmNlKSB7CisgICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGlzID0gKChSZXNvdXJjZSkgb2JqZWN0KS5zdHJlYW1Db250ZW50KCk7CisgICAgICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGN1cnJlbnRGaWxlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFjb3B5KGlzLCBvcykpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJbnB1dFN0cmVhbSkgeworICAgICAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW0gb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShjdXJyZW50RmlsZSk7CisgICAgICAgICAgICAgICAgICAgIGlmICghY29weSgoSW5wdXRTdHJlYW0pIG9iamVjdCwgb3MpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgRGlyQ29udGV4dCkgeworICAgICAgICAgICAgICAgICAgICBjdXJyZW50RmlsZS5ta2RpcigpOworICAgICAgICAgICAgICAgICAgICBjb3B5RGlyKChEaXJDb250ZXh0KSBvYmplY3QsIGN1cnJlbnRGaWxlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvcHkgYSBmaWxlIHRvIHRoZSBzcGVjaWZpZWQgdGVtcCBkaXJlY3RvcnkuIFRoaXMgaXMgcmVxdWlyZWQgb25seQorICAgICAqIGJlY2F1c2UgSmFzcGVyIGRlcGVuZHMgb24gaXQuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGNvcHkoSW5wdXRTdHJlYW0gaXMsIE91dHB1dFN0cmVhbSBvcykgeworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbNDA5Nl07CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgIGludCBsZW4gPSBpcy5yZWFkKGJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKGxlbiA8IDApCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIG9zLndyaXRlKGJ1ZiwgMCwgbGVuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlzLmNsb3NlKCk7CisgICAgICAgICAgICBvcy5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIH0KKworCisgICAgcHJpdmF0ZSBzdGF0aWMgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGxvZz0KKyAgICAgICAgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeS5nZXRMb2coIFdlYmFwcExvYWRlci5jbGFzcyApOworCisgICAgcHJpdmF0ZSBPYmplY3ROYW1lIG9uYW1lOworICAgIHByaXZhdGUgTUJlYW5TZXJ2ZXIgbXNlcnZlcjsKKyAgICBwcml2YXRlIFN0cmluZyBkb21haW47CisgICAgcHJpdmF0ZSBPYmplY3ROYW1lIGNvbnRyb2xsZXI7CisKKyAgICBwdWJsaWMgT2JqZWN0TmFtZSBwcmVSZWdpc3RlcihNQmVhblNlcnZlciBzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSBuYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgb25hbWU9bmFtZTsKKyAgICAgICAgbXNlcnZlcj1zZXJ2ZXI7CisgICAgICAgIGRvbWFpbj1uYW1lLmdldERvbWFpbigpOworCisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHBvc3RSZWdpc3RlcihCb29sZWFuIHJlZ2lzdHJhdGlvbkRvbmUpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwcmVEZXJlZ2lzdGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcG9zdERlcmVnaXN0ZXIoKSB7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdE5hbWUgZ2V0Q29udHJvbGxlcigpIHsKKyAgICAgICAgcmV0dXJuIGNvbnRyb2xsZXI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q29udHJvbGxlcihPYmplY3ROYW1lIGNvbnRyb2xsZXIpIHsKKyAgICAgICAgdGhpcy5jb250cm9sbGVyID0gY29udHJvbGxlcjsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9sb2FkZXIvbWJlYW5zLWRlc2NyaXB0b3JzLnhtbCBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9sb2FkZXIvbWJlYW5zLWRlc2NyaXB0b3JzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2JjNjJjCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2xvYWRlci9tYmVhbnMtZGVzY3JpcHRvcnMueG1sCkBAIC0wLDAgKzEsNTkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPG1iZWFucy1kZXNjcmlwdG9ycz4KKworICA8bWJlYW4gICAgICAgICBuYW1lPSJXZWJhcHBMb2FkZXIiCisgICAgICAgICAgZGVzY3JpcHRpb249IkNsYXNzbG9hZGVyIGltcGxlbWVudGF0aW9uIHdoaWNoIGlzIHNwZWNpYWxpemVkIGZvcgorICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGluZyB3ZWIgYXBwbGljYXRpb25zIgorICAgICAgICAgICAgICAgZG9tYWluPSJDYXRhbGluYSIKKyAgICAgICAgICAgICAgICBncm91cD0iTG9hZGVyIgorICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmxvYWRlci5XZWJhcHBMb2FkZXIiPgorICAgICAgICAgICAgICAgICAKKyAgICA8YXR0cmlidXRlICAgbmFtZT0iY2xhc3NOYW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJGdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgbWFuYWdlZCBvYmplY3QiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0iZGVsZWdhdGUiCisgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSAnZm9sbG93IHN0YW5kYXJkIGRlbGVnYXRpb24gbW9kZWwnIGZsYWcgdGhhdCB3aWxsIGJlCisgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgdG8gY29uZmlndXJlIG91ciBDbGFzc0xvYWRlciIKKyAgICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InJlbG9hZGFibGUiCisgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSByZWxvYWRhYmxlIGZsYWcgZm9yIHRoaXMgTG9hZGVyIgorICAgICAgICAgICAgICAgICB0eXBlPSJib29sZWFuIi8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0icmVwb3NpdG9yaWVzIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJFeHRyYSByZXBvc2l0b3JpZXMgbWFuYWdlZCBieSB0aGlzIGxvYWRlciIKKyAgICAgICAgICAgICAgICAgdHlwZT0iW0xqYXZhLmxhbmcuU3RyaW5nOyIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InJlcG9zaXRvcmllc1N0cmluZyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iRXh0cmEgcmVwb3NpdG9yaWVzIG1hbmFnZWQgYnkgdGhpcyBsb2FkZXIiCisgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIgCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJsb2FkZXJSZXBvc2l0b3JpZXMiCisgICAgICAgICAgZGVzY3JpcHRpb249IlJlcG9zaXRvcmllcyBzZXQgaW4gdGhlIHJlYWwgbG9hZGVyIgorICAgICAgICAgICAgICAgICB0eXBlPSJbTGphdmEubGFuZy5TdHJpbmc7IgorICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIgLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJsb2FkZXJSZXBvc2l0b3JpZXNTdHJpbmciCisgICAgICAgICAgZGVzY3JpcHRpb249IlJlcG9zaXRvcmllcyBzZXQgaW4gdGhlIHJlYWwgbG9hZGVyIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiIC8+CisKKyAgICA8b3BlcmF0aW9uICAgbmFtZT0idG9TdHJpbmciCisgICAgICAgICAgZGVzY3JpcHRpb249IkluZm8gYWJvdXQgdGhlIGxvYWRlciIKKyAgICAgICAgICAgICAgIGltcGFjdD0iSU5GTyIKKyAgICAgICAgICAgcmV0dXJuVHlwZT0iU3RyaW5nIj4KKyAgICA8L29wZXJhdGlvbj4KKyAgPC9tYmVhbj4KKworCisgIDxtYmVhbiAgICAgICAgIG5hbWU9IldlYmFwcENsYXNzTG9hZGVyIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJDbGFzc2xvYWRlciBpbXBsZW1lbnRhdGlvbiB3aGljaCBpcyBzcGVjaWFsaXplZCBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxpbmcgd2ViIGFwcGxpY2F0aW9ucyIKKyAgICAgICAgICAgICAgIGRvbWFpbj0iQ2F0YWxpbmEiCisgICAgICAgICAgICAgICAgZ3JvdXA9IkxvYWRlciIKKyAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5sb2FkZXIuV2ViYXBwQ2xhc3NMb2FkZXIiIC8+CisKKzwvbWJlYW5zLWRlc2NyaXB0b3JzPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL21iZWFucy1kZXNjcmlwdG9ycy54bWwgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvbWJlYW5zLWRlc2NyaXB0b3JzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGRhZjFjCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL21iZWFucy1kZXNjcmlwdG9ycy54bWwKQEAgLTAsMCArMSwxNTAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPG1iZWFucy1kZXNjcmlwdG9ycz4KKworICA8bWJlYW4gbmFtZT0iR3JvdXAiCisgICAgICAgICBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEubWJlYW5zLkdyb3VwTUJlYW4iCisgICAgICAgICAgZGVzY3JpcHRpb249Ikdyb3VwIGZyb20gYSB1c2VyIGRhdGFiYXNlIgorICAgICAgICAgICAgICAgZG9tYWluPSJVc2VycyIKKyAgICAgICAgICAgICAgICBncm91cD0iR3JvdXAiCisgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuR3JvdXAiPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImRlc2NyaXB0aW9uIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJEZXNjcmlwdGlvbiBvZiB0aGlzIGdyb3VwIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0iZ3JvdXBuYW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJHcm91cCBuYW1lIG9mIHRoaXMgZ3JvdXAiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJyb2xlcyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iTUJlYW4gTmFtZXMgb2Ygcm9sZXMgZm9yIHRoaXMgZ3JvdXAiCisgICAgICAgICAgICAgICAgIHR5cGU9IltMamF2YS5sYW5nLlN0cmluZzsiCisgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0idXNlcnMiCisgICAgICAgICAgZGVzY3JpcHRpb249Ik1CZWFuIE5hbWVzIG9mIHVzZXIgbWVtYmVycyBvZiB0aGlzIGdyb3VwIgorICAgICAgICAgICAgICAgICB0eXBlPSJbTGphdmEubGFuZy5TdHJpbmc7IgorICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorCisgICAgPG9wZXJhdGlvbiAgIG5hbWU9ImFkZFJvbGUiCisgICAgICAgICAgZGVzY3JpcHRpb249IkFkZCBhIG5ldyBhdXRob3JpemVkIHJvbGUgZm9yIHRoaXMgZ3JvdXAiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgcmV0dXJuVHlwZT0idm9pZCI+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9InJvbGUiCisgICAgICAgICAgZGVzY3JpcHRpb249IlJvbGUgdG8gYmUgYWRkZWQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICA8L29wZXJhdGlvbj4KKworICAgIDxvcGVyYXRpb24gICBuYW1lPSJyZW1vdmVSb2xlIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJSZW1vdmUgYW4gb2xkIGF1dGhvcml6ZWQgcm9sZSBmb3IgdGhpcyBncm91cCIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICByZXR1cm5UeXBlPSJ2b2lkIj4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icm9sZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iUm9sZSB0byBiZSByZW1vdmVkIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgPC9vcGVyYXRpb24+CisKKyAgICA8b3BlcmF0aW9uICAgbmFtZT0icmVtb3ZlUm9sZXMiCisgICAgICAgICAgZGVzY3JpcHRpb249IlJlbW92ZSBhbGwgYXV0aG9yaXplZCByb2xlcyBmb3IgdGhpcyBncm91cCIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICByZXR1cm5UeXBlPSJ2b2lkIj4KKyAgICA8L29wZXJhdGlvbj4KKworICA8L21iZWFuPgorCisgIDxtYmVhbiAgICAgICAgIG5hbWU9IlJvbGUiCisgICAgICAgICAgICBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEubWJlYW5zLlJvbGVNQmVhbiIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iU2VjdXJpdHkgcm9sZSBmcm9tIGEgdXNlciBkYXRhYmFzZSIKKyAgICAgICAgICAgICAgIGRvbWFpbj0iVXNlcnMiCisgICAgICAgICAgICAgICAgZ3JvdXA9IlJvbGUiCisgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuUm9sZSI+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0iZGVzY3JpcHRpb24iCisgICAgICAgICAgZGVzY3JpcHRpb249IkRlc2NyaXB0aW9uIG9mIHRoaXMgcm9sZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InJvbGVuYW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJSb2xlIG5hbWUgb2YgdGhpcyByb2xlIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisKKyAgPC9tYmVhbj4KKworICA8bWJlYW4gICAgICAgICBuYW1lPSJVc2VyIgorICAgICAgICAgICAgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLm1iZWFucy5Vc2VyTUJlYW4iCisgICAgICAgICAgZGVzY3JpcHRpb249IlVzZXIgZnJvbSBhIHVzZXIgZGF0YWJhc2UiCisgICAgICAgICAgICAgICBkb21haW49IlVzZXJzIgorICAgICAgICAgICAgICAgIGdyb3VwPSJVc2VyIgorICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLlVzZXIiPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImZ1bGxOYW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJGdWxsIG5hbWUgb2YgdGhpcyB1c2VyIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0iZ3JvdXBzIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJNQmVhbiBOYW1lcyBvZiBncm91cHMgdGhpcyB1c2VyIGlzIGEgbWVtYmVyIG9mIgorICAgICAgICAgICAgICAgICB0eXBlPSJbTGphdmEubGFuZy5TdHJpbmc7Ii8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0icGFzc3dvcmQiCisgICAgICAgICAgZGVzY3JpcHRpb249IlBhc3N3b3JkIG9mIHRoaXMgdXNlciIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InJvbGVzIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJNQmVhbiBOYW1lcyBvZiByb2xlcyBmb3IgdGhpcyB1c2VyIgorICAgICAgICAgICAgICAgICB0eXBlPSJbTGphdmEubGFuZy5TdHJpbmc7IgorICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InVzZXJuYW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJVc2VyIG5hbWUgb2YgdGhpcyB1c2VyIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisKKyAgICA8b3BlcmF0aW9uICAgbmFtZT0iYWRkR3JvdXAiCisgICAgICAgICAgZGVzY3JpcHRpb249IkFkZCBhIG5ldyBncm91cCBtZW1iZXJzaGlwIGZvciB0aGlzIHVzZXIiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgcmV0dXJuVHlwZT0idm9pZCI+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9Imdyb3VwbmFtZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iR3JvdXAgbmFtZSBvZiB0aGUgbmV3IGdyb3VwIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgPC9vcGVyYXRpb24+CisKKyAgICA8b3BlcmF0aW9uICAgbmFtZT0iYWRkUm9sZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQWRkIGEgbmV3IGF1dGhvcml6ZWQgcm9sZSBmb3IgdGhpcyB1c2VyIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJyb2xlIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJSb2xlIHRvIGJlIGFkZGVkIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgPC9vcGVyYXRpb24+CisKKyAgICA8b3BlcmF0aW9uICAgbmFtZT0icmVtb3ZlR3JvdXAiCisgICAgICAgICAgZGVzY3JpcHRpb249IlJlbW92ZSBhbiBvbGQgZ3JvdXAgbWVtYmVyc2hpcCBmb3IgdGhpcyB1c2VyIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJncm91cG5hbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249Ikdyb3VwIG5hbWUgb2YgdGhlIG9sZCBncm91cCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgIDwvb3BlcmF0aW9uPgorCisgICAgPG9wZXJhdGlvbiAgIG5hbWU9InJlbW92ZUdyb3VwcyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iUmVtb3ZlIGFsbCBncm91cCBtZW1iZXJzaGlwcyBmb3IgdGhpcyB1c2VyIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiPgorICAgIDwvb3BlcmF0aW9uPgorCisgICAgPG9wZXJhdGlvbiAgIG5hbWU9InJlbW92ZVJvbGUiCisgICAgICAgICAgZGVzY3JpcHRpb249IlJlbW92ZSBhbiBvbGQgYXV0aG9yaXplZCByb2xlIGZvciB0aGlzIHVzZXIiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgcmV0dXJuVHlwZT0idm9pZCI+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9InJvbGUiCisgICAgICAgICAgZGVzY3JpcHRpb249IlJvbGUgdG8gYmUgcmVtb3ZlZCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgIDwvb3BlcmF0aW9uPgorCisgICAgPG9wZXJhdGlvbiAgIG5hbWU9InJlbW92ZVJvbGVzIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJSZW1vdmUgYWxsIGF1dGhvcml6ZWQgcm9sZXMgZm9yIHRoaXMgdXNlciIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICByZXR1cm5UeXBlPSJ2b2lkIj4KKyAgICA8L29wZXJhdGlvbj4KKworICA8L21iZWFuPgorCis8L21iZWFucy1kZXNjcmlwdG9ycz4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9tYmVhbnMvQ2xhc3NOYW1lTUJlYW4uamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9tYmVhbnMvQ2xhc3NOYW1lTUJlYW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDIzYTYyCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL21iZWFucy9DbGFzc05hbWVNQmVhbi5qYXZhCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLm1iZWFuczsKKworCitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LlJ1bnRpbWVPcGVyYXRpb25zRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5tb2RlbGVyLkJhc2VNb2RlbE1CZWFuOworCisKKy8qKgorICogPHA+QSBjb252ZW5pZW5jZSBiYXNlIGNsYXNzIGZvciA8c3Ryb25nPk1vZGVsTUJlYW48L3N0cm9uZz4gaW1wbGVtZW50YXRpb25zCisgKiB3aGVyZSB0aGUgdW5kZXJseWluZyBiYXNlIGNsYXNzIChhbmQgdGhlcmVmb3JlIHRoZSBzZXQgb2Ygc3VwcG9ydGVkCisgKiBwcm9wZXJ0aWVzKSBpcyBkaWZmZXJlbnQgZm9yIHZhcnlpbmcgaW1wbGVtZW50YXRpb25zIG9mIGEgc3RhbmRhcmQKKyAqIGludGVyZmFjZS4gIEZvciBDYXRhbGluYSwgdGhhdCBpbmNsdWRlcyBhdCBsZWFzdCB0aGUgZm9sbG93aW5nOgorICogQ29ubmVjdG9yLCBMb2dnZXIsIFJlYWxtLCBhbmQgVmFsdmUuICBUaGlzIGNsYXNzIGNyZWF0ZXMgYW4gYXJ0aWZpY2lhbAorICogTUJlYW4gYXR0cmlidXRlIG5hbWVkIDxjb2RlPmNsYXNzTmFtZTwvY29kZT4sIHdoaWNoIHJlcG9ydHMgdGhlIGZ1bGx5CisgKiBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgbWFuYWdlZCBvYmplY3QgYXMgaXRzIHZhbHVlLjwvcD4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIENsYXNzTmFtZU1CZWFuIGV4dGVuZHMgQmFzZU1vZGVsTUJlYW4geworCisKKyAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgIC8qKgorICAgICAgKiBDb25zdHJ1Y3QgYSA8Y29kZT5Nb2RlbE1CZWFuPC9jb2RlPiB3aXRoIGRlZmF1bHQKKyAgICAgICogPGNvZGU+TW9kZWxNQmVhbkluZm88L2NvZGU+IGluZm9ybWF0aW9uLgorICAgICAgKgorICAgICAgKiBAZXhjZXB0aW9uIE1CZWFuRXhjZXB0aW9uIGlmIHRoZSBpbml0aWFsaXplIG9mIGFuIG9iamVjdAorICAgICAgKiAgdGhyb3dzIGFuIGV4Y2VwdGlvbgorICAgICAgKiBAZXhjZXB0aW9uIFJ1bnRpbWVPcGVyYXRpb25zRXhjZXB0aW9uIGlmIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAgKiAgb2NjdXJzCisgICAgICAqLworICAgICBwdWJsaWMgQ2xhc3NOYW1lTUJlYW4oKQorICAgICAgICAgdGhyb3dzIE1CZWFuRXhjZXB0aW9uLCBSdW50aW1lT3BlcmF0aW9uc0V4Y2VwdGlvbiB7CisKKyAgICAgICAgIHN1cGVyKCk7CisKKyAgICAgfQorCisKKyAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgIC8qKgorICAgICAgKiBSZXR1cm4gdGhlIGZ1bGx5IHF1YWxpZmllZCBKYXZhIGNsYXNzIG5hbWUgb2YgdGhlIG1hbmFnZWQgb2JqZWN0CisgICAgICAqIGZvciB0aGlzIE1CZWFuLgorICAgICAgKi8KKyAgICAgcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7CisKKyAgICAgICAgIHJldHVybiAodGhpcy5yZXNvdXJjZS5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisKKyAgICAgfQorCisKKyB9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvbWJlYW5zL0Nvbm5lY3Rvck1CZWFuLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvbWJlYW5zL0Nvbm5lY3Rvck1CZWFuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg3YTRhZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9tYmVhbnMvQ29ubmVjdG9yTUJlYW4uamF2YQpAQCAtMCwwICsxLDE0MCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEubWJlYW5zOworCitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5BdHRyaWJ1dGU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5BdHRyaWJ1dGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lkluc3RhbmNlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LlJlZmxlY3Rpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5SdW50aW1lT3BlcmF0aW9uc0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lm1vZGVsbWJlYW4uSW52YWxpZFRhcmdldE9iamVjdFR5cGVFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3Rvci5Db25uZWN0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5JbnRyb3NwZWN0aW9uVXRpbHM7CisKKworLyoqCisgKiA8cD5BIDxzdHJvbmc+TW9kZWxNQmVhbjwvc3Ryb25nPiBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlCisgKiA8Y29kZT5vcmcuYXBhY2hlLmNveW90ZS50b21jYXQ1LkNveW90ZUNvbm5lY3RvcjwvY29kZT4gY29tcG9uZW50LjwvcD4KKyAqCisgKiBAYXV0aG9yIEFteSBSb2gKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIENvbm5lY3Rvck1CZWFuIGV4dGVuZHMgQ2xhc3NOYW1lTUJlYW4geworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgPGNvZGU+TW9kZWxNQmVhbjwvY29kZT4gd2l0aCBkZWZhdWx0CisgICAgICogPGNvZGU+TW9kZWxNQmVhbkluZm88L2NvZGU+IGluZm9ybWF0aW9uLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBNQmVhbkV4Y2VwdGlvbiBpZiB0aGUgaW5pdGlhbGl6ZXIgb2YgYW4gb2JqZWN0CisgICAgICogIHRocm93cyBhbiBleGNlcHRpb24KKyAgICAgKiBAZXhjZXB0aW9uIFJ1bnRpbWVPcGVyYXRpb25zRXhjZXB0aW9uIGlmIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgQ29ubmVjdG9yTUJlYW4oKQorICAgICAgICB0aHJvd3MgTUJlYW5FeGNlcHRpb24sIFJ1bnRpbWVPcGVyYXRpb25zRXhjZXB0aW9uIHsKKworICAgICAgICBzdXBlcigpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEF0dHJpYnV0ZXMKKworCisgICAgLyoqCisgICAgICogT2J0YWluIGFuZCByZXR1cm4gdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWMgYXR0cmlidXRlIG9mIHRoaXMgTUJlYW4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSByZXF1ZXN0ZWQgYXR0cmlidXRlCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEF0dHJpYnV0ZU5vdEZvdW5kRXhjZXB0aW9uIGlmIHRoaXMgYXR0cmlidXRlIGlzIG5vdAorICAgICAqICBzdXBwb3J0ZWQgYnkgdGhpcyBNQmVhbgorICAgICAqIEBleGNlcHRpb24gTUJlYW5FeGNlcHRpb24gaWYgdGhlIGluaXRpYWxpemVyIG9mIGFuIG9iamVjdAorICAgICAqICB0aHJvd3MgYW4gZXhjZXB0aW9uCisgICAgICogQGV4Y2VwdGlvbiBSZWZsZWN0aW9uRXhjZXB0aW9uIGlmIGEgSmF2YSByZWZsZWN0aW9uIGV4Y2VwdGlvbgorICAgICAqICBvY2N1cnMgd2hlbiBpbnZva2luZyB0aGUgZ2V0dGVyCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHRocm93cyBBdHRyaWJ1dGVOb3RGb3VuZEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIE1CZWFuRXhjZXB0aW9uLCBSZWZsZWN0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICBPYmplY3QgYXR0cmlidXRlID0gbnVsbDsKKyAgICAgICAgLy8gVmFsaWRhdGUgdGhlIGlucHV0IHBhcmFtZXRlcnMKKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lT3BlcmF0aW9uc0V4Y2VwdGlvbihuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiQXR0cmlidXRlIG5hbWUgaXMgbnVsbCIpLCAiQXR0cmlidXRlIG5hbWUgaXMgbnVsbCIpOworCisgICAgICAgIE9iamVjdCByZXN1bHQgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ29ubmVjdG9yIGNvbm5lY3RvciA9IChDb25uZWN0b3IpIGdldE1hbmFnZWRSZXNvdXJjZSgpOworICAgICAgICAgICAgcmVzdWx0ID0gSW50cm9zcGVjdGlvblV0aWxzLmdldFByb3BlcnR5KGNvbm5lY3RvciwgbmFtZSk7CisgICAgICAgIH0gY2F0Y2ggKEluc3RhbmNlTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE1CZWFuRXhjZXB0aW9uKGUpOworICAgICAgICB9IGNhdGNoIChJbnZhbGlkVGFyZ2V0T2JqZWN0VHlwZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTUJlYW5FeGNlcHRpb24oZSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVzdWx0OworCisgICAgfQorCisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmljIGF0dHJpYnV0ZSBvZiB0aGlzIE1CZWFuLgorICAgICAqCisgICAgICogQHBhcmFtIGF0dHJpYnV0ZSBUaGUgaWRlbnRpZmljYXRpb24gb2YgdGhlIGF0dHJpYnV0ZSB0byBiZSBzZXQKKyAgICAgKiAgYW5kIHRoZSBuZXcgdmFsdWUKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gQXR0cmlidXRlTm90Rm91bmRFeGNlcHRpb24gaWYgdGhpcyBhdHRyaWJ1dGUgaXMgbm90CisgICAgICogIHN1cHBvcnRlZCBieSB0aGlzIE1CZWFuCisgICAgICogQGV4Y2VwdGlvbiBNQmVhbkV4Y2VwdGlvbiBpZiB0aGUgaW5pdGlhbGl6ZXIgb2YgYW4gb2JqZWN0CisgICAgICogIHRocm93cyBhbiBleGNlcHRpb24KKyAgICAgKiBAZXhjZXB0aW9uIFJlZmxlY3Rpb25FeGNlcHRpb24gaWYgYSBKYXZhIHJlZmxlY3Rpb24gZXhjZXB0aW9uCisgICAgICogIG9jY3VycyB3aGVuIGludm9raW5nIHRoZSBnZXR0ZXIKKyAgICAgKi8KKyAgICAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKEF0dHJpYnV0ZSBhdHRyaWJ1dGUpCisgICAgICAgICAgICB0aHJvd3MgQXR0cmlidXRlTm90Rm91bmRFeGNlcHRpb24sIE1CZWFuRXhjZXB0aW9uLAorICAgICAgICAgICAgUmVmbGVjdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gVmFsaWRhdGUgdGhlIGlucHV0IHBhcmFtZXRlcnMKKyAgICAgICAgaWYgKGF0dHJpYnV0ZSA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVPcGVyYXRpb25zRXhjZXB0aW9uKG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJBdHRyaWJ1dGUgaXMgbnVsbCIpLCAiQXR0cmlidXRlIGlzIG51bGwiKTsKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBhdHRyaWJ1dGUuZ2V0TmFtZSgpOworICAgICAgICBPYmplY3QgdmFsdWUgPSBhdHRyaWJ1dGUuZ2V0VmFsdWUoKTsKKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lT3BlcmF0aW9uc0V4Y2VwdGlvbihuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiQXR0cmlidXRlIG5hbWUgaXMgbnVsbCIpLCAiQXR0cmlidXRlIG5hbWUgaXMgbnVsbCIpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDb25uZWN0b3IgY29ubmVjdG9yID0gKENvbm5lY3RvcikgZ2V0TWFuYWdlZFJlc291cmNlKCk7CisgICAgICAgICAgICBJbnRyb3NwZWN0aW9uVXRpbHMuc2V0UHJvcGVydHkoY29ubmVjdG9yLCBuYW1lLCBTdHJpbmcudmFsdWVPZih2YWx1ZSkpOworICAgICAgICB9IGNhdGNoIChJbnN0YW5jZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBNQmVhbkV4Y2VwdGlvbihlKTsKKyAgICAgICAgfSBjYXRjaCAoSW52YWxpZFRhcmdldE9iamVjdFR5cGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE1CZWFuRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgIAorICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvbWJlYW5zL0NvbnRleHRFbnZpcm9ubWVudE1CZWFuLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvbWJlYW5zL0NvbnRleHRFbnZpcm9ubWVudE1CZWFuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjViMzlhMAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9tYmVhbnMvQ29udGV4dEVudmlyb25tZW50TUJlYW4uamF2YQpAQCAtMCwwICsxLDEwNSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEubWJlYW5zOworCisKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LkF0dHJpYnV0ZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LkF0dHJpYnV0ZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuSW5zdGFuY2VOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuUmVmbGVjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LlJ1bnRpbWVPcGVyYXRpb25zRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQubW9kZWxtYmVhbi5JbnZhbGlkVGFyZ2V0T2JqZWN0VHlwZUV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkNvbnRleHRFbnZpcm9ubWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5OYW1pbmdSZXNvdXJjZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLm1vZGVsZXIuQmFzZU1vZGVsTUJlYW47CisKKworLyoqCisgKiA8cD5BIDxzdHJvbmc+TW9kZWxNQmVhbjwvc3Ryb25nPiBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlCisgKiA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5Db250ZXh0RW52aXJvbm1lbnQ8L2NvZGU+IGNvbXBvbmVudC48L3A+CisgKgorICogQGF1dGhvciBBbXkgUm9oCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBDb250ZXh0RW52aXJvbm1lbnRNQmVhbiBleHRlbmRzIEJhc2VNb2RlbE1CZWFuIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIDxjb2RlPk1vZGVsTUJlYW48L2NvZGU+IHdpdGggZGVmYXVsdAorICAgICAqIDxjb2RlPk1vZGVsTUJlYW5JbmZvPC9jb2RlPiBpbmZvcm1hdGlvbi4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTUJlYW5FeGNlcHRpb24gaWYgdGhlIGluaXRpYWxpemVyIG9mIGFuIG9iamVjdAorICAgICAqICB0aHJvd3MgYW4gZXhjZXB0aW9uCisgICAgICogQGV4Y2VwdGlvbiBSdW50aW1lT3BlcmF0aW9uc0V4Y2VwdGlvbiBpZiBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgb2NjdXJzCisgICAgICovCisgICAgcHVibGljIENvbnRleHRFbnZpcm9ubWVudE1CZWFuKCkKKyAgICAgICAgdGhyb3dzIE1CZWFuRXhjZXB0aW9uLCBSdW50aW1lT3BlcmF0aW9uc0V4Y2VwdGlvbiB7CisKKyAgICAgICAgc3VwZXIoKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQXR0cmlidXRlcworCisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmljIGF0dHJpYnV0ZSBvZiB0aGlzIE1CZWFuLgorICAgICAqCisgICAgICogQHBhcmFtIGF0dHJpYnV0ZSBUaGUgaWRlbnRpZmljYXRpb24gb2YgdGhlIGF0dHJpYnV0ZSB0byBiZSBzZXQKKyAgICAgKiAgYW5kIHRoZSBuZXcgdmFsdWUKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gQXR0cmlidXRlTm90Rm91bmRFeGNlcHRpb24gaWYgdGhpcyBhdHRyaWJ1dGUgaXMgbm90CisgICAgICogIHN1cHBvcnRlZCBieSB0aGlzIE1CZWFuCisgICAgICogQGV4Y2VwdGlvbiBNQmVhbkV4Y2VwdGlvbiBpZiB0aGUgaW5pdGlhbGl6ZXIgb2YgYW4gb2JqZWN0CisgICAgICogIHRocm93cyBhbiBleGNlcHRpb24KKyAgICAgKiBAZXhjZXB0aW9uIFJlZmxlY3Rpb25FeGNlcHRpb24gaWYgYSBKYXZhIHJlZmxlY3Rpb24gZXhjZXB0aW9uCisgICAgICogIG9jY3VycyB3aGVuIGludm9raW5nIHRoZSBnZXR0ZXIKKyAgICAgKi8KKyAgICAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKEF0dHJpYnV0ZSBhdHRyaWJ1dGUpCisgICAgICAgIHRocm93cyBBdHRyaWJ1dGVOb3RGb3VuZEV4Y2VwdGlvbiwgTUJlYW5FeGNlcHRpb24sCisgICAgICAgIFJlZmxlY3Rpb25FeGNlcHRpb24geworCisgICAgICAgIHN1cGVyLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGUpOworICAgICAgICAKKyAgICAgICAgQ29udGV4dEVudmlyb25tZW50IGNlID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNlID0gKENvbnRleHRFbnZpcm9ubWVudCkgZ2V0TWFuYWdlZFJlc291cmNlKCk7CisgICAgICAgIH0gY2F0Y2ggKEluc3RhbmNlTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE1CZWFuRXhjZXB0aW9uKGUpOworICAgICAgICB9IGNhdGNoIChJbnZhbGlkVGFyZ2V0T2JqZWN0VHlwZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgdGhyb3cgbmV3IE1CZWFuRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBjYW5ub3QgdXNlIHNpZGUtZWZlY3RzLiAgSXQncyByZW1vdmVkIGFuZCBhZGRlZCBiYWNrIGVhY2ggdGltZSAKKyAgICAgICAgLy8gdGhlcmUgaXMgYSBtb2RpZmljYXRpb24gaW4gYSByZXNvdXJjZS4KKyAgICAgICAgTmFtaW5nUmVzb3VyY2VzIG5yID0gY2UuZ2V0TmFtaW5nUmVzb3VyY2VzKCk7CisgICAgICAgIG5yLnJlbW92ZUVudmlyb25tZW50KGNlLmdldE5hbWUoKSk7CisgICAgICAgIG5yLmFkZEVudmlyb25tZW50KGNlKTsKKyAgICB9CisgICAgCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvbWJlYW5zL0NvbnRleHRSZXNvdXJjZUxpbmtNQmVhbi5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL21iZWFucy9Db250ZXh0UmVzb3VyY2VMaW5rTUJlYW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjdhYzBkCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL21iZWFucy9Db250ZXh0UmVzb3VyY2VMaW5rTUJlYW4uamF2YQpAQCAtMCwwICsxLDEwNSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEubWJlYW5zOworCisKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LkF0dHJpYnV0ZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LkF0dHJpYnV0ZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuSW5zdGFuY2VOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuUmVmbGVjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LlJ1bnRpbWVPcGVyYXRpb25zRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQubW9kZWxtYmVhbi5JbnZhbGlkVGFyZ2V0T2JqZWN0VHlwZUV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkNvbnRleHRSZXNvdXJjZUxpbms7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuTmFtaW5nUmVzb3VyY2VzOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5tb2RlbGVyLkJhc2VNb2RlbE1CZWFuOworCisKKy8qKgorICogPHA+QSA8c3Ryb25nPk1vZGVsTUJlYW48L3N0cm9uZz4gaW1wbGVtZW50YXRpb24gZm9yIHRoZQorICogPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuQ29udGV4dFJlc291cmNlTGluazwvY29kZT4gY29tcG9uZW50LjwvcD4KKyAqCisgKiBAYXV0aG9yIEFteSBSb2gKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIENvbnRleHRSZXNvdXJjZUxpbmtNQmVhbiBleHRlbmRzIEJhc2VNb2RlbE1CZWFuIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIDxjb2RlPk1vZGVsTUJlYW48L2NvZGU+IHdpdGggZGVmYXVsdAorICAgICAqIDxjb2RlPk1vZGVsTUJlYW5JbmZvPC9jb2RlPiBpbmZvcm1hdGlvbi4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTUJlYW5FeGNlcHRpb24gaWYgdGhlIGluaXRpYWxpemVyIG9mIGFuIG9iamVjdAorICAgICAqICB0aHJvd3MgYW4gZXhjZXB0aW9uCisgICAgICogQGV4Y2VwdGlvbiBSdW50aW1lT3BlcmF0aW9uc0V4Y2VwdGlvbiBpZiBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgb2NjdXJzCisgICAgICovCisgICAgcHVibGljIENvbnRleHRSZXNvdXJjZUxpbmtNQmVhbigpCisgICAgICAgIHRocm93cyBNQmVhbkV4Y2VwdGlvbiwgUnVudGltZU9wZXJhdGlvbnNFeGNlcHRpb24geworCisgICAgICAgIHN1cGVyKCk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEF0dHJpYnV0ZXMKKworICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpYyBhdHRyaWJ1dGUgb2YgdGhpcyBNQmVhbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhdHRyaWJ1dGUgVGhlIGlkZW50aWZpY2F0aW9uIG9mIHRoZSBhdHRyaWJ1dGUgdG8gYmUgc2V0CisgICAgICogIGFuZCB0aGUgbmV3IHZhbHVlCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEF0dHJpYnV0ZU5vdEZvdW5kRXhjZXB0aW9uIGlmIHRoaXMgYXR0cmlidXRlIGlzIG5vdAorICAgICAqICBzdXBwb3J0ZWQgYnkgdGhpcyBNQmVhbgorICAgICAqIEBleGNlcHRpb24gTUJlYW5FeGNlcHRpb24gaWYgdGhlIGluaXRpYWxpemVyIG9mIGFuIG9iamVjdAorICAgICAqICB0aHJvd3MgYW4gZXhjZXB0aW9uCisgICAgICogQGV4Y2VwdGlvbiBSZWZsZWN0aW9uRXhjZXB0aW9uIGlmIGEgSmF2YSByZWZsZWN0aW9uIGV4Y2VwdGlvbgorICAgICAqICBvY2N1cnMgd2hlbiBpbnZva2luZyB0aGUgZ2V0dGVyCisgICAgICovCisgICAgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShBdHRyaWJ1dGUgYXR0cmlidXRlKQorICAgICAgICB0aHJvd3MgQXR0cmlidXRlTm90Rm91bmRFeGNlcHRpb24sIE1CZWFuRXhjZXB0aW9uLAorICAgICAgICBSZWZsZWN0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICBzdXBlci5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlKTsKKyAgICAgICAgCisgICAgICAgIENvbnRleHRSZXNvdXJjZUxpbmsgY3JsID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNybCA9IChDb250ZXh0UmVzb3VyY2VMaW5rKSBnZXRNYW5hZ2VkUmVzb3VyY2UoKTsKKyAgICAgICAgfSBjYXRjaCAoSW5zdGFuY2VOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTUJlYW5FeGNlcHRpb24oZSk7CisgICAgICAgIH0gY2F0Y2ggKEludmFsaWRUYXJnZXRPYmplY3RUeXBlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICB0aHJvdyBuZXcgTUJlYW5FeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIGNhbm5vdCB1c2Ugc2lkZS1lZmVjdHMuICBJdCdzIHJlbW92ZWQgYW5kIGFkZGVkIGJhY2sgZWFjaCB0aW1lIAorICAgICAgICAvLyB0aGVyZSBpcyBhIG1vZGlmaWNhdGlvbiBpbiBhIHJlc291cmNlLgorICAgICAgICBOYW1pbmdSZXNvdXJjZXMgbnIgPSBjcmwuZ2V0TmFtaW5nUmVzb3VyY2VzKCk7CisgICAgICAgIG5yLnJlbW92ZVJlc291cmNlTGluayhjcmwuZ2V0TmFtZSgpKTsKKyAgICAgICAgbnIuYWRkUmVzb3VyY2VMaW5rKGNybCk7CisgICAgfQorICAgIAorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL21iZWFucy9Db250ZXh0UmVzb3VyY2VNQmVhbi5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL21iZWFucy9Db250ZXh0UmVzb3VyY2VNQmVhbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0YjhmNTgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvbWJlYW5zL0NvbnRleHRSZXNvdXJjZU1CZWFuLmphdmEKQEAgLTAsMCArMSwxODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLm1iZWFuczsKKworCitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5BdHRyaWJ1dGU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5BdHRyaWJ1dGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lkluc3RhbmNlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LlJlZmxlY3Rpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5SdW50aW1lT3BlcmF0aW9uc0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lm1vZGVsbWJlYW4uSW52YWxpZFRhcmdldE9iamVjdFR5cGVFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5Db250ZXh0UmVzb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuTmFtaW5nUmVzb3VyY2VzOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5tb2RlbGVyLkJhc2VNb2RlbE1CZWFuOworCisKKy8qKgorICogPHA+QSA8c3Ryb25nPk1vZGVsTUJlYW48L3N0cm9uZz4gaW1wbGVtZW50YXRpb24gZm9yIHRoZQorICogPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuQ29udGV4dFJlc291cmNlPC9jb2RlPiBjb21wb25lbnQuPC9wPgorICoKKyAqIEBhdXRob3IgQW15IFJvaAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgQ29udGV4dFJlc291cmNlTUJlYW4gZXh0ZW5kcyBCYXNlTW9kZWxNQmVhbiB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSA8Y29kZT5Nb2RlbE1CZWFuPC9jb2RlPiB3aXRoIGRlZmF1bHQKKyAgICAgKiA8Y29kZT5Nb2RlbE1CZWFuSW5mbzwvY29kZT4gaW5mb3JtYXRpb24uCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIE1CZWFuRXhjZXB0aW9uIGlmIHRoZSBpbml0aWFsaXplciBvZiBhbiBvYmplY3QKKyAgICAgKiAgdGhyb3dzIGFuIGV4Y2VwdGlvbgorICAgICAqIEBleGNlcHRpb24gUnVudGltZU9wZXJhdGlvbnNFeGNlcHRpb24gaWYgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBDb250ZXh0UmVzb3VyY2VNQmVhbigpCisgICAgICAgIHRocm93cyBNQmVhbkV4Y2VwdGlvbiwgUnVudGltZU9wZXJhdGlvbnNFeGNlcHRpb24geworCisgICAgICAgIHN1cGVyKCk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEF0dHJpYnV0ZXMKKworCisgICAgLyoqCisgICAgICogT2J0YWluIGFuZCByZXR1cm4gdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWMgYXR0cmlidXRlIG9mIHRoaXMgTUJlYW4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSByZXF1ZXN0ZWQgYXR0cmlidXRlCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEF0dHJpYnV0ZU5vdEZvdW5kRXhjZXB0aW9uIGlmIHRoaXMgYXR0cmlidXRlIGlzIG5vdAorICAgICAqICBzdXBwb3J0ZWQgYnkgdGhpcyBNQmVhbgorICAgICAqIEBleGNlcHRpb24gTUJlYW5FeGNlcHRpb24gaWYgdGhlIGluaXRpYWxpemVyIG9mIGFuIG9iamVjdAorICAgICAqICB0aHJvd3MgYW4gZXhjZXB0aW9uCisgICAgICogQGV4Y2VwdGlvbiBSZWZsZWN0aW9uRXhjZXB0aW9uIGlmIGEgSmF2YSByZWZsZWN0aW9uIGV4Y2VwdGlvbgorICAgICAqICBvY2N1cnMgd2hlbiBpbnZva2luZyB0aGUgZ2V0dGVyCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpCisgICAgICAgIHRocm93cyBBdHRyaWJ1dGVOb3RGb3VuZEV4Y2VwdGlvbiwgTUJlYW5FeGNlcHRpb24sCisgICAgICAgIFJlZmxlY3Rpb25FeGNlcHRpb24geworIAorICAgICAgICAvLyBWYWxpZGF0ZSB0aGUgaW5wdXQgcGFyYW1ldGVycworICAgICAgICBpZiAobmFtZSA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVPcGVyYXRpb25zRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkF0dHJpYnV0ZSBuYW1lIGlzIG51bGwiKSwKKyAgICAgICAgICAgICAgICAgIkF0dHJpYnV0ZSBuYW1lIGlzIG51bGwiKTsKKworICAgICAgICBDb250ZXh0UmVzb3VyY2UgY3IgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgY3IgPSAoQ29udGV4dFJlc291cmNlKSBnZXRNYW5hZ2VkUmVzb3VyY2UoKTsKKyAgICAgICAgfSBjYXRjaCAoSW5zdGFuY2VOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTUJlYW5FeGNlcHRpb24oZSk7CisgICAgICAgIH0gY2F0Y2ggKEludmFsaWRUYXJnZXRPYmplY3RUeXBlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICB0aHJvdyBuZXcgTUJlYW5FeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIFN0cmluZyB2YWx1ZSA9IG51bGw7CisgICAgICAgIGlmICgiYXV0aCIuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gKGNyLmdldEF1dGgoKSk7CisgICAgICAgIH0gZWxzZSBpZiAoImRlc2NyaXB0aW9uIi5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiAoY3IuZ2V0RGVzY3JpcHRpb24oKSk7CisgICAgICAgIH0gZWxzZSBpZiAoIm5hbWUiLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgcmV0dXJuIChjci5nZXROYW1lKCkpOyAgICAgICAgICAgICAgCisgICAgICAgIH0gZWxzZSBpZiAoInNjb3BlIi5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiAoY3IuZ2V0U2NvcGUoKSk7ICAKKyAgICAgICAgfSBlbHNlIGlmICgidHlwZSIuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gKGNyLmdldFR5cGUoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2YWx1ZSA9IChTdHJpbmcpIGNyLmdldFByb3BlcnR5KG5hbWUpOworICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXR0cmlidXRlTm90Rm91bmRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgKCJDYW5ub3QgZmluZCBhdHRyaWJ1dGUgIituYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICAKKyAgICB9CisKKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWMgYXR0cmlidXRlIG9mIHRoaXMgTUJlYW4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXR0cmlidXRlIFRoZSBpZGVudGlmaWNhdGlvbiBvZiB0aGUgYXR0cmlidXRlIHRvIGJlIHNldAorICAgICAqICBhbmQgdGhlIG5ldyB2YWx1ZQorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBBdHRyaWJ1dGVOb3RGb3VuZEV4Y2VwdGlvbiBpZiB0aGlzIGF0dHJpYnV0ZSBpcyBub3QKKyAgICAgKiAgc3VwcG9ydGVkIGJ5IHRoaXMgTUJlYW4KKyAgICAgKiBAZXhjZXB0aW9uIE1CZWFuRXhjZXB0aW9uIGlmIHRoZSBpbml0aWFsaXplciBvZiBhbiBvYmplY3QKKyAgICAgKiAgdGhyb3dzIGFuIGV4Y2VwdGlvbgorICAgICAqIEBleGNlcHRpb24gUmVmbGVjdGlvbkV4Y2VwdGlvbiBpZiBhIEphdmEgcmVmbGVjdGlvbiBleGNlcHRpb24KKyAgICAgKiAgb2NjdXJzIHdoZW4gaW52b2tpbmcgdGhlIGdldHRlcgorICAgICAqLworICAgICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoQXR0cmlidXRlIGF0dHJpYnV0ZSkKKyAgICAgICAgdGhyb3dzIEF0dHJpYnV0ZU5vdEZvdW5kRXhjZXB0aW9uLCBNQmVhbkV4Y2VwdGlvbiwKKyAgICAgICAgUmVmbGVjdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gVmFsaWRhdGUgdGhlIGlucHV0IHBhcmFtZXRlcnMKKyAgICAgICAgaWYgKGF0dHJpYnV0ZSA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVPcGVyYXRpb25zRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkF0dHJpYnV0ZSBpcyBudWxsIiksCisgICAgICAgICAgICAgICAgICJBdHRyaWJ1dGUgaXMgbnVsbCIpOworICAgICAgICBTdHJpbmcgbmFtZSA9IGF0dHJpYnV0ZS5nZXROYW1lKCk7CisgICAgICAgIE9iamVjdCB2YWx1ZSA9IGF0dHJpYnV0ZS5nZXRWYWx1ZSgpOworICAgICAgICBpZiAobmFtZSA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVPcGVyYXRpb25zRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkF0dHJpYnV0ZSBuYW1lIGlzIG51bGwiKSwKKyAgICAgICAgICAgICAgICAgIkF0dHJpYnV0ZSBuYW1lIGlzIG51bGwiKTsgCisgICAgICAgIAorICAgICAgICBDb250ZXh0UmVzb3VyY2UgY3IgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgY3IgPSAoQ29udGV4dFJlc291cmNlKSBnZXRNYW5hZ2VkUmVzb3VyY2UoKTsKKyAgICAgICAgfSBjYXRjaCAoSW5zdGFuY2VOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTUJlYW5FeGNlcHRpb24oZSk7CisgICAgICAgIH0gY2F0Y2ggKEludmFsaWRUYXJnZXRPYmplY3RUeXBlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICB0aHJvdyBuZXcgTUJlYW5FeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmICgiYXV0aCIuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICBjci5zZXRBdXRoKChTdHJpbmcpdmFsdWUpOworICAgICAgICB9IGVsc2UgaWYgKCJkZXNjcmlwdGlvbiIuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICBjci5zZXREZXNjcmlwdGlvbigoU3RyaW5nKXZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmICgibmFtZSIuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICBjci5zZXROYW1lKChTdHJpbmcpdmFsdWUpOyAgICAgICAgICAgICAgCisgICAgICAgIH0gZWxzZSBpZiAoInNjb3BlIi5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgIGNyLnNldFNjb3BlKChTdHJpbmcpdmFsdWUpOyAgCisgICAgICAgIH0gZWxzZSBpZiAoInR5cGUiLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgY3Iuc2V0VHlwZSgoU3RyaW5nKXZhbHVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNyLnNldFByb3BlcnR5KG5hbWUsICIiK3ZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gY2Fubm90IHVzZSBzaWRlLWVmZWN0cy4gIEl0J3MgcmVtb3ZlZCBhbmQgYWRkZWQgYmFjayBlYWNoIHRpbWUgCisgICAgICAgIC8vIHRoZXJlIGlzIGEgbW9kaWZpY2F0aW9uIGluIGEgcmVzb3VyY2UuCisgICAgICAgIE5hbWluZ1Jlc291cmNlcyBuciA9IGNyLmdldE5hbWluZ1Jlc291cmNlcygpOworICAgICAgICBuci5yZW1vdmVSZXNvdXJjZShjci5nZXROYW1lKCkpOworICAgICAgICBuci5hZGRSZXNvdXJjZShjcik7CisgICAgfQorICAgIAorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL21iZWFucy9EZWZhdWx0Q29udGV4dE1CZWFuLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvbWJlYW5zL0RlZmF1bHRDb250ZXh0TUJlYW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjE5ZmJlCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL21iZWFucy9EZWZhdWx0Q29udGV4dE1CZWFuLmphdmEKQEAgLTAsMCArMSwzMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLm1iZWFuczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5SdW50aW1lT3BlcmF0aW9uc0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5Db250ZXh0RW52aXJvbm1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuQ29udGV4dFJlc291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkNvbnRleHRSZXNvdXJjZUxpbms7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuTmFtaW5nUmVzb3VyY2VzOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5tb2RlbGVyLkJhc2VNb2RlbE1CZWFuOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5tb2RlbGVyLk1hbmFnZWRCZWFuOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5tb2RlbGVyLlJlZ2lzdHJ5OworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuY29tcGF0Lkpka0NvbXBhdDsKKworLyoqCisgKiA8cD5BIDxzdHJvbmc+TW9kZWxNQmVhbjwvc3Ryb25nPiBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlCisgKiA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmREZWZhdWx0Q29udGV4dDwvY29kZT4gY29tcG9uZW50LjwvcD4KKyAqCisgKiBAYXV0aG9yIEFteSBSb2gKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIERlZmF1bHRDb250ZXh0TUJlYW4gZXh0ZW5kcyBCYXNlTW9kZWxNQmVhbiB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSA8Y29kZT5Nb2RlbE1CZWFuPC9jb2RlPiB3aXRoIGRlZmF1bHQKKyAgICAgKiA8Y29kZT5Nb2RlbE1CZWFuSW5mbzwvY29kZT4gaW5mb3JtYXRpb24uCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIE1CZWFuRXhjZXB0aW9uIGlmIHRoZSBpbml0aWFsaXplciBvZiBhbiBvYmplY3QKKyAgICAgKiAgdGhyb3dzIGFuIGV4Y2VwdGlvbgorICAgICAqIEBleGNlcHRpb24gUnVudGltZU9wZXJhdGlvbnNFeGNlcHRpb24gaWYgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBEZWZhdWx0Q29udGV4dE1CZWFuKCkKKyAgICAgICAgdGhyb3dzIE1CZWFuRXhjZXB0aW9uLCBSdW50aW1lT3BlcmF0aW9uc0V4Y2VwdGlvbiB7CisKKyAgICAgICAgc3VwZXIoKTsKKworICAgIH0KKyAgICAKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENsYXNzIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBKREsgY29tcGF0aWJpbGl0eSBzdXBwb3J0CisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmRrQ29tcGF0IGpka0NvbXBhdCA9IEpka0NvbXBhdC5nZXRKZGtDb21wYXQoKTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisgICAgCisgICAgCisgICAgLyoqCisgICAgICogVGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gcmVnaXN0cnkgZm9yIG91ciBtYW5hZ2VkIGJlYW5zLgorICAgICAqLworICAgIHByb3RlY3RlZCBSZWdpc3RyeSByZWdpc3RyeSA9IE1CZWFuVXRpbHMuY3JlYXRlUmVnaXN0cnkoKTsKKworICAgIC8qKgorICAgICAqIFRoZSA8Y29kZT5NYW5hZ2VkQmVhbjwvY29kZT4gaW5mb3JtYXRpb24gZGVzY3JpYmluZyB0aGlzIE1CZWFuLgorICAgICAqLworICAgIHByb3RlY3RlZCBNYW5hZ2VkQmVhbiBtYW5hZ2VkID0KKyAgICAgICAgcmVnaXN0cnkuZmluZE1hbmFnZWRCZWFuKCJEZWZhdWx0Q29udGV4dCIpOworCisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBBdHRyaWJ1dGVzCisKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG5hbWluZyByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgTmFtaW5nUmVzb3VyY2VzIGdldE5hbWluZ1Jlc291cmNlcygpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiAoKENvbnRleHQpdGhpcy5yZXNvdXJjZSkuZ2V0TmFtaW5nUmVzb3VyY2VzKCk7CisgICAgCisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgTUJlYW4gTmFtZXMgb2YgdGhlIHNldCBvZiBkZWZpbmVkIGVudmlyb25tZW50IGVudHJpZXMgZm9yICAKKyAgICAgKiB0aGlzIHdlYiBhcHBsaWNhdGlvbgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRFbnZpcm9ubWVudHMoKSB7CisgICAgICAgIENvbnRleHRFbnZpcm9ubWVudFtdIGVudnMgPSBnZXROYW1pbmdSZXNvdXJjZXMoKS5maW5kRW52aXJvbm1lbnRzKCk7CisgICAgICAgIEFycmF5TGlzdCByZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVudnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9CisgICAgICAgICAgICAgICAgICAgIE1CZWFuVXRpbHMuY3JlYXRlT2JqZWN0TmFtZShtYW5hZ2VkLmdldERvbWFpbigpLCBlbnZzW2ldKTsKKyAgICAgICAgICAgICAgICByZXN1bHRzLmFkZChvbmFtZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZE9iamVjdE5hbWVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUgPSBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgICgiQ2Fubm90IGNyZWF0ZSBvYmplY3QgbmFtZSBmb3IgZW52aXJvbm1lbnQgIiArIGVudnNbaV0pOworICAgICAgICAgICAgICAgIGpka0NvbXBhdC5jaGFpbkV4Y2VwdGlvbihpYWUsIGUpOworICAgICAgICAgICAgICAgIHRocm93IGlhZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKChTdHJpbmdbXSkgcmVzdWx0cy50b0FycmF5KG5ldyBTdHJpbmdbcmVzdWx0cy5zaXplKCldKSk7CisKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBNQmVhbiBOYW1lcyBvZiBhbGwgdGhlIGRlZmluZWQgcmVzb3VyY2UgcmVmZXJlbmNlcyBmb3IgdGhpcworICAgICAqIGFwcGxpY2F0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRSZXNvdXJjZXMoKSB7CisgICAgICAgIAorICAgICAgICBDb250ZXh0UmVzb3VyY2VbXSByZXNvdXJjZXMgPSBnZXROYW1pbmdSZXNvdXJjZXMoKS5maW5kUmVzb3VyY2VzKCk7CisgICAgICAgIEFycmF5TGlzdCByZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0KKyAgICAgICAgICAgICAgICAgICAgTUJlYW5VdGlscy5jcmVhdGVPYmplY3ROYW1lKG1hbmFnZWQuZ2V0RG9tYWluKCksIHJlc291cmNlc1tpXSk7CisgICAgICAgICAgICAgICAgcmVzdWx0cy5hZGQob25hbWUudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRPYmplY3ROYW1lRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWFlID0gbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAoIkNhbm5vdCBjcmVhdGUgb2JqZWN0IG5hbWUgZm9yIHJlc291cmNlICIgKyByZXNvdXJjZXNbaV0pOworICAgICAgICAgICAgICAgIGpka0NvbXBhdC5jaGFpbkV4Y2VwdGlvbihpYWUsIGUpOworICAgICAgICAgICAgICAgIHRocm93IGlhZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKChTdHJpbmdbXSkgcmVzdWx0cy50b0FycmF5KG5ldyBTdHJpbmdbcmVzdWx0cy5zaXplKCldKSk7CisKKyAgICB9CisKKyAgICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgTUJlYW4gTmFtZXMgb2YgYWxsIHRoZSBkZWZpbmVkIHJlc291cmNlIGxpbmtzIGZvciB0aGlzIAorICAgICAqIGFwcGxpY2F0aW9uCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGdldFJlc291cmNlTGlua3MoKSB7CisgICAgICAgIAorICAgICAgICBDb250ZXh0UmVzb3VyY2VMaW5rW10gbGlua3MgPSBnZXROYW1pbmdSZXNvdXJjZXMoKS5maW5kUmVzb3VyY2VMaW5rcygpOworICAgICAgICBBcnJheUxpc3QgcmVzdWx0cyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaW5rcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0KKyAgICAgICAgICAgICAgICAgICAgTUJlYW5VdGlscy5jcmVhdGVPYmplY3ROYW1lKG1hbmFnZWQuZ2V0RG9tYWluKCksIGxpbmtzW2ldKTsKKyAgICAgICAgICAgICAgICByZXN1bHRzLmFkZChvbmFtZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZE9iamVjdE5hbWVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUgPSBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgICgiQ2Fubm90IGNyZWF0ZSBvYmplY3QgbmFtZSBmb3IgcmVzb3VyY2UgIiArIGxpbmtzW2ldKTsKKyAgICAgICAgICAgICAgICBqZGtDb21wYXQuY2hhaW5FeGNlcHRpb24oaWFlLCBlKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBpYWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICgoU3RyaW5nW10pIHJlc3VsdHMudG9BcnJheShuZXcgU3RyaW5nW3Jlc3VsdHMuc2l6ZSgpXSkpOworCisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBPcGVyYXRpb25zCisKKworICAgIC8qKgorICAgICAqIEFkZCBhbiBlbnZpcm9ubWVudCBlbnRyeSBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZW52TmFtZSBOZXcgZW52aXJvbm1lbnQgZW50cnkgbmFtZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgYWRkRW52aXJvbm1lbnQoU3RyaW5nIGVudk5hbWUsIFN0cmluZyB0eXBlKSAKKyAgICAgICAgdGhyb3dzIE1hbGZvcm1lZE9iamVjdE5hbWVFeGNlcHRpb24geworCisgICAgICAgIE5hbWluZ1Jlc291cmNlcyBucmVzb3VyY2VzID0gZ2V0TmFtaW5nUmVzb3VyY2VzKCk7CisgICAgICAgIGlmIChucmVzb3VyY2VzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIENvbnRleHRFbnZpcm9ubWVudCBlbnYgPSBucmVzb3VyY2VzLmZpbmRFbnZpcm9ubWVudChlbnZOYW1lKTsKKyAgICAgICAgaWYgKGVudiAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKCJJbnZhbGlkIGVudmlyb25tZW50IG5hbWUgLSBhbHJlYWR5IGV4aXN0cyAnIiArIGVudk5hbWUgKyAiJyIpOworICAgICAgICB9CisgICAgICAgIGVudiA9IG5ldyBDb250ZXh0RW52aXJvbm1lbnQoKTsKKyAgICAgICAgZW52LnNldE5hbWUoZW52TmFtZSk7CisgICAgICAgIGVudi5zZXRUeXBlKHR5cGUpOworICAgICAgICBucmVzb3VyY2VzLmFkZEVudmlyb25tZW50KGVudik7CisgICAgICAgIAorICAgICAgICAvLyBSZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgTUJlYW4gbmFtZQorICAgICAgICBNYW5hZ2VkQmVhbiBtYW5hZ2VkID0gcmVnaXN0cnkuZmluZE1hbmFnZWRCZWFuKCJDb250ZXh0RW52aXJvbm1lbnQiKTsKKyAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9CisgICAgICAgICAgICBNQmVhblV0aWxzLmNyZWF0ZU9iamVjdE5hbWUobWFuYWdlZC5nZXREb21haW4oKSwgZW52KTsKKyAgICAgICAgcmV0dXJuIChvbmFtZS50b1N0cmluZygpKTsKKyAgICAgICAgCisgICAgfQorCisgICAgCisgICAgLyoqCisgICAgICogQWRkIGEgcmVzb3VyY2UgcmVmZXJlbmNlIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNvdXJjZU5hbWUgTmV3IHJlc291cmNlIHJlZmVyZW5jZSBuYW1lCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBhZGRSZXNvdXJjZShTdHJpbmcgcmVzb3VyY2VOYW1lLCBTdHJpbmcgdHlwZSkgCisgICAgICAgIHRocm93cyBNYWxmb3JtZWRPYmplY3ROYW1lRXhjZXB0aW9uIHsKKyAgICAgICAgCisgICAgICAgIE5hbWluZ1Jlc291cmNlcyBucmVzb3VyY2VzID0gZ2V0TmFtaW5nUmVzb3VyY2VzKCk7CisgICAgICAgIGlmIChucmVzb3VyY2VzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIENvbnRleHRSZXNvdXJjZSByZXNvdXJjZSA9IG5yZXNvdXJjZXMuZmluZFJlc291cmNlKHJlc291cmNlTmFtZSk7CisgICAgICAgIGlmIChyZXNvdXJjZSAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKCJJbnZhbGlkIHJlc291cmNlIG5hbWUgLSBhbHJlYWR5IGV4aXN0cyciICsgcmVzb3VyY2VOYW1lICsgIiciKTsKKyAgICAgICAgfQorICAgICAgICByZXNvdXJjZSA9IG5ldyBDb250ZXh0UmVzb3VyY2UoKTsKKyAgICAgICAgcmVzb3VyY2Uuc2V0TmFtZShyZXNvdXJjZU5hbWUpOworICAgICAgICByZXNvdXJjZS5zZXRUeXBlKHR5cGUpOworICAgICAgICBucmVzb3VyY2VzLmFkZFJlc291cmNlKHJlc291cmNlKTsKKyAgICAgICAgCisgICAgICAgIC8vIFJldHVybiB0aGUgY29ycmVzcG9uZGluZyBNQmVhbiBuYW1lCisgICAgICAgIE1hbmFnZWRCZWFuIG1hbmFnZWQgPSByZWdpc3RyeS5maW5kTWFuYWdlZEJlYW4oIkNvbnRleHRSZXNvdXJjZSIpOworICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0KKyAgICAgICAgICAgIE1CZWFuVXRpbHMuY3JlYXRlT2JqZWN0TmFtZShtYW5hZ2VkLmdldERvbWFpbigpLCByZXNvdXJjZSk7CisgICAgICAgIAorICAgICAgICByZXR1cm4gKG9uYW1lLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIAorICAgIC8qKgorICAgICAqIEFkZCBhIHJlc291cmNlIGxpbmsgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHJlc291cmNlTGlua05hbWUgTmV3IHJlc291cmNlIGxpbmsgbmFtZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgYWRkUmVzb3VyY2VMaW5rKFN0cmluZyByZXNvdXJjZUxpbmtOYW1lLCBTdHJpbmcgZ2xvYmFsLCAKKyAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSwgU3RyaW5nIHR5cGUpIHRocm93cyBNYWxmb3JtZWRPYmplY3ROYW1lRXhjZXB0aW9uIHsKKyAgICAgICAgCisgICAgICAgIE5hbWluZ1Jlc291cmNlcyBucmVzb3VyY2VzID0gZ2V0TmFtaW5nUmVzb3VyY2VzKCk7CisgICAgICAgIGlmIChucmVzb3VyY2VzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIENvbnRleHRSZXNvdXJjZUxpbmsgcmVzb3VyY2VMaW5rID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5yZXNvdXJjZXMuZmluZFJlc291cmNlTGluayhyZXNvdXJjZUxpbmtOYW1lKTsKKyAgICAgICAgaWYgKHJlc291cmNlTGluayAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKCJJbnZhbGlkIHJlc291cmNlIGxpbmsgbmFtZSAtIGFscmVhZHkgZXhpc3RzJyIgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VMaW5rTmFtZSArICInIik7CisgICAgICAgIH0KKyAgICAgICAgcmVzb3VyY2VMaW5rID0gbmV3IENvbnRleHRSZXNvdXJjZUxpbmsoKTsKKyAgICAgICAgcmVzb3VyY2VMaW5rLnNldEdsb2JhbChnbG9iYWwpOworICAgICAgICByZXNvdXJjZUxpbmsuc2V0TmFtZShyZXNvdXJjZUxpbmtOYW1lKTsKKyAgICAgICAgcmVzb3VyY2VMaW5rLnNldFR5cGUodHlwZSk7CisgICAgICAgIG5yZXNvdXJjZXMuYWRkUmVzb3VyY2VMaW5rKHJlc291cmNlTGluayk7CisgICAgICAgIAorICAgICAgICAvLyBSZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgTUJlYW4gbmFtZQorICAgICAgICBNYW5hZ2VkQmVhbiBtYW5hZ2VkID0gcmVnaXN0cnkuZmluZE1hbmFnZWRCZWFuKCJDb250ZXh0UmVzb3VyY2VMaW5rIik7CisgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPQorICAgICAgICAgICAgTUJlYW5VdGlscy5jcmVhdGVPYmplY3ROYW1lKG1hbmFnZWQuZ2V0RG9tYWluKCksIHJlc291cmNlTGluayk7CisgICAgICAgIHJldHVybiAob25hbWUudG9TdHJpbmcoKSk7CisgICAgfSAgICAKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYW55IGVudmlyb25tZW50IGVudHJ5IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIGVudk5hbWUgTmFtZSBvZiB0aGUgZW52aXJvbm1lbnQgZW50cnkgdG8gcmVtb3ZlCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlRW52aXJvbm1lbnQoU3RyaW5nIGVudk5hbWUpIHsKKworICAgICAgICBOYW1pbmdSZXNvdXJjZXMgbnJlc291cmNlcyA9IGdldE5hbWluZ1Jlc291cmNlcygpOworICAgICAgICBpZiAobnJlc291cmNlcyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgQ29udGV4dEVudmlyb25tZW50IGVudiA9IG5yZXNvdXJjZXMuZmluZEVudmlyb25tZW50KGVudk5hbWUpOworICAgICAgICBpZiAoZW52ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoIkludmFsaWQgZW52aXJvbm1lbnQgbmFtZSAnIiArIGVudk5hbWUgKyAiJyIpOworICAgICAgICB9CisgICAgICAgIG5yZXNvdXJjZXMucmVtb3ZlRW52aXJvbm1lbnQoZW52TmFtZSk7CisKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogUmVtb3ZlIGFueSByZXNvdXJjZSByZWZlcmVuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VOYW1lIE5hbWUgb2YgdGhlIHJlc291cmNlIHJlZmVyZW5jZSB0byByZW1vdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVSZXNvdXJjZShTdHJpbmcgcmVzb3VyY2VOYW1lKSB7CisKKyAgICAgICAgcmVzb3VyY2VOYW1lID0gT2JqZWN0TmFtZS51bnF1b3RlKHJlc291cmNlTmFtZSk7CisgICAgICAgIE5hbWluZ1Jlc291cmNlcyBucmVzb3VyY2VzID0gZ2V0TmFtaW5nUmVzb3VyY2VzKCk7CisgICAgICAgIGlmIChucmVzb3VyY2VzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBDb250ZXh0UmVzb3VyY2UgcmVzb3VyY2UgPSBucmVzb3VyY2VzLmZpbmRSZXNvdXJjZShyZXNvdXJjZU5hbWUpOworICAgICAgICBpZiAocmVzb3VyY2UgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICgiSW52YWxpZCByZXNvdXJjZSBuYW1lICciICsgcmVzb3VyY2VOYW1lICsgIiciKTsKKyAgICAgICAgfQorICAgICAgICBucmVzb3VyY2VzLnJlbW92ZVJlc291cmNlKHJlc291cmNlTmFtZSk7CisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFJlbW92ZSBhbnkgcmVzb3VyY2UgbGluayB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNvdXJjZUxpbmtOYW1lIE5hbWUgb2YgdGhlIHJlc291cmNlIHJlZmVyZW5jZSB0byByZW1vdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVSZXNvdXJjZUxpbmsoU3RyaW5nIHJlc291cmNlTGlua05hbWUpIHsKKworICAgICAgICByZXNvdXJjZUxpbmtOYW1lID0gT2JqZWN0TmFtZS51bnF1b3RlKHJlc291cmNlTGlua05hbWUpOworICAgICAgICBOYW1pbmdSZXNvdXJjZXMgbnJlc291cmNlcyA9IGdldE5hbWluZ1Jlc291cmNlcygpOworICAgICAgICBpZiAobnJlc291cmNlcyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgQ29udGV4dFJlc291cmNlTGluayByZXNvdXJjZSA9IG5yZXNvdXJjZXMuZmluZFJlc291cmNlTGluayhyZXNvdXJjZUxpbmtOYW1lKTsKKyAgICAgICAgaWYgKHJlc291cmNlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoIkludmFsaWQgcmVzb3VyY2UgbmFtZSAnIiArIHJlc291cmNlTGlua05hbWUgKyAiJyIpOworICAgICAgICB9CisgICAgICAgIG5yZXNvdXJjZXMucmVtb3ZlUmVzb3VyY2VMaW5rKHJlc291cmNlTGlua05hbWUpOworICAgIH0KKyAKKyAgICAKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9tYmVhbnMvR2xvYmFsUmVzb3VyY2VzTGlmZWN5Y2xlTGlzdGVuZXIuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9tYmVhbnMvR2xvYmFsUmVzb3VyY2VzTGlmZWN5Y2xlTGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTU5YzUyCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL21iZWFucy9HbG9iYWxSZXNvdXJjZXNMaWZlY3ljbGVMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsMjM2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5tYmVhbnM7CisKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuQmluZGluZzsKK2ltcG9ydCBqYXZheC5uYW1pbmcuQ29udGV4dDsKK2ltcG9ydCBqYXZheC5uYW1pbmcuSW5pdGlhbENvbnRleHQ7CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWluZ0VudW1lcmF0aW9uOworaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1pbmdFeGNlcHRpb247CitpbXBvcnQgamF2YXgubmFtaW5nLk9wZXJhdGlvbk5vdFN1cHBvcnRlZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkdyb3VwOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlRXZlbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlJvbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Vc2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuVXNlckRhdGFiYXNlOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5tb2RlbGVyLlJlZ2lzdHJ5OworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OworCisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgPGNvZGU+TGlmZWN5Y2xlTGlzdGVuZXI8L2NvZGU+IHRoYXQgaW5zdGFudGlhdGVzIHRoZQorICogc2V0IG9mIE1CZWFucyBhc3NvY2lhdGVkIHdpdGggZ2xvYmFsIEpOREkgcmVzb3VyY2VzIHRoYXQgYXJlIHN1YmplY3QgdG8KKyAqIG1hbmFnZW1lbnQuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICogQHNpbmNlIDQuMQorICovCisKK3B1YmxpYyBjbGFzcyBHbG9iYWxSZXNvdXJjZXNMaWZlY3ljbGVMaXN0ZW5lcgorICAgIGltcGxlbWVudHMgTGlmZWN5Y2xlTGlzdGVuZXIgeworICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhHbG9iYWxSZXNvdXJjZXNMaWZlY3ljbGVMaXN0ZW5lci5jbGFzcyk7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIG93bmluZyBDYXRhbGluYSBjb21wb25lbnQgdGhhdCB3ZSBhcmUgYXR0YWNoZWQgdG8uCisgICAgICovCisgICAgcHJvdGVjdGVkIExpZmVjeWNsZSBjb21wb25lbnQgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiByZWdpc3RyeSBmb3Igb3VyIG1hbmFnZWQgYmVhbnMuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBSZWdpc3RyeSByZWdpc3RyeSA9IE1CZWFuVXRpbHMuY3JlYXRlUmVnaXN0cnkoKTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBMaWZlY3ljbGVMaXN0ZW5lciBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFByaW1hcnkgZW50cnkgcG9pbnQgZm9yIHN0YXJ0dXAgYW5kIHNodXRkb3duIGV2ZW50cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgdGhhdCBoYXMgb2NjdXJyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBsaWZlY3ljbGVFdmVudChMaWZlY3ljbGVFdmVudCBldmVudCkgeworCisgICAgICAgIGlmIChMaWZlY3ljbGUuU1RBUlRfRVZFTlQuZXF1YWxzKGV2ZW50LmdldFR5cGUoKSkpIHsKKyAgICAgICAgICAgIGNvbXBvbmVudCA9IGV2ZW50LmdldExpZmVjeWNsZSgpOworICAgICAgICAgICAgY3JlYXRlTUJlYW5zKCk7CisgICAgICAgIH0gZWxzZSBpZiAoTGlmZWN5Y2xlLlNUT1BfRVZFTlQuZXF1YWxzKGV2ZW50LmdldFR5cGUoKSkpIHsKKyAgICAgICAgICAgIGRlc3Ryb3lNQmVhbnMoKTsKKyAgICAgICAgICAgIGNvbXBvbmVudCA9IG51bGw7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3RlY3RlZCBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIENyZWF0ZSB0aGUgTUJlYW5zIGZvciB0aGUgaW50ZXJlc3RpbmcgZ2xvYmFsIEpOREkgcmVzb3VyY2VzLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZU1CZWFucygpIHsKKworICAgICAgICAvLyBMb29rIHVwIG91ciBnbG9iYWwgbmFtaW5nIGNvbnRleHQKKyAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNvbnRleHQgPSAoQ29udGV4dCkgKG5ldyBJbml0aWFsQ29udGV4dCgpKS5sb29rdXAoImphdmE6LyIpOworICAgICAgICB9IGNhdGNoIChOYW1pbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9nLmVycm9yKCJObyBnbG9iYWwgbmFtaW5nIGNvbnRleHQgZGVmaW5lZCBmb3Igc2VydmVyIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBSZWN1cnNlIHRocm91Z2ggdGhlIGRlZmluZWQgZ2xvYmFsIEpOREkgcmVzb3VyY2VzIGNvbnRleHQKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNyZWF0ZU1CZWFucygiIiwgY29udGV4dCk7CisgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2cuZXJyb3IoIkV4Y2VwdGlvbiBwcm9jZXNzaW5nIEdsb2JhbCBKTkRJIFJlc291cmNlcyIsIGUpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENyZWF0ZSB0aGUgTUJlYW5zIGZvciB0aGUgaW50ZXJlc3RpbmcgZ2xvYmFsIEpOREkgcmVzb3VyY2VzIGluCisgICAgICogdGhlIHNwZWNpZmllZCBuYW1pbmcgY29udGV4dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcmVmaXggUHJlZml4IGZvciBjb21wbGV0ZSBvYmplY3QgbmFtZSBwYXRocworICAgICAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgdG8gYmUgc2Nhbm5lZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBKTkRJIGV4Y2VwdGlvbiBvY2N1cnMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVNQmVhbnMoU3RyaW5nIHByZWZpeCwgQ29udGV4dCBjb250ZXh0KQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ3JlYXRpbmcgTUJlYW5zIGZvciBHbG9iYWwgSk5ESSBSZXNvdXJjZXMgaW4gQ29udGV4dCAnIiArCisgICAgICAgICAgICAgICAgcHJlZml4ICsgIiciKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBOYW1pbmdFbnVtZXJhdGlvbiBiaW5kaW5ncyA9IGNvbnRleHQubGlzdEJpbmRpbmdzKCIiKTsKKyAgICAgICAgICAgIHdoaWxlIChiaW5kaW5ncy5oYXNNb3JlKCkpIHsKKyAgICAgICAgICAgICAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZykgYmluZGluZ3MubmV4dCgpOworICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gcHJlZml4ICsgYmluZGluZy5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gY29udGV4dC5sb29rdXAoYmluZGluZy5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkNoZWNraW5nIHJlc291cmNlICIgKyBuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgQ29udGV4dCkgeworICAgICAgICAgICAgICAgICAgICBjcmVhdGVNQmVhbnMobmFtZSArICIvIiwgKENvbnRleHQpIHZhbHVlKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgVXNlckRhdGFiYXNlKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVNQmVhbnMobmFtZSwgKFVzZXJEYXRhYmFzZSkgdmFsdWUpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJFeGNlcHRpb24gY3JlYXRpbmcgVXNlckRhdGFiYXNlIE1CZWFucyBmb3IgIiArIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoKCBSdW50aW1lRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBsb2cuZXJyb3IoIlJ1bnRpbWVFeGNlcHRpb24gIiArIGV4KTsKKyAgICAgICAgfSBjYXRjaCggT3BlcmF0aW9uTm90U3VwcG9ydGVkRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBsb2cuZXJyb3IoIk9wZXJhdGlvbiBub3Qgc3VwcG9ydGVkICIgKyBleCk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ3JlYXRlIHRoZSBNQmVhbnMgZm9yIHRoZSBzcGVjaWZpZWQgVXNlckRhdGFiYXNlIGFuZCBpdHMgY29udGVudHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBDb21wbGV0ZSByZXNvdXJjZSBuYW1lIG9mIHRoaXMgVXNlckRhdGFiYXNlCisgICAgICogQHBhcmFtIGRhdGFiYXNlIFRoZSBVc2VyRGF0YWJhc2UgdG8gYmUgcHJvY2Vzc2VkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBleGNlcHRpb24gb2NjdXJzIHdoaWxlIGNyZWF0aW5nIE1CZWFucworICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZU1CZWFucyhTdHJpbmcgbmFtZSwgVXNlckRhdGFiYXNlIGRhdGFiYXNlKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBDcmVhdGUgdGhlIE1CZWFuIGZvciB0aGUgVXNlckRhdGFiYXNlIGl0c2VsZgorICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ3JlYXRpbmcgVXNlckRhdGFiYXNlIE1CZWFucyBmb3IgcmVzb3VyY2UgIiArIG5hbWUpOworICAgICAgICAgICAgbG9nLmRlYnVnKCJEYXRhYmFzZT0iICsgZGF0YWJhc2UpOworICAgICAgICB9CisgICAgICAgIGlmIChNQmVhblV0aWxzLmNyZWF0ZU1CZWFuKGRhdGFiYXNlKSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKCJDYW5ub3QgY3JlYXRlIFVzZXJEYXRhYmFzZSBNQmVhbiBmb3IgcmVzb3VyY2UgIiArIG5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ3JlYXRlIHRoZSBNQmVhbnMgZm9yIGVhY2ggZGVmaW5lZCBSb2xlCisgICAgICAgIEl0ZXJhdG9yIHJvbGVzID0gZGF0YWJhc2UuZ2V0Um9sZXMoKTsKKyAgICAgICAgd2hpbGUgKHJvbGVzLmhhc05leHQoKSkgeworICAgICAgICAgICAgUm9sZSByb2xlID0gKFJvbGUpIHJvbGVzLm5leHQoKTsKKyAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiICBDcmVhdGluZyBSb2xlIE1CZWFuIGZvciByb2xlICIgKyByb2xlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChNQmVhblV0aWxzLmNyZWF0ZU1CZWFuKHJvbGUpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgICgiQ2Fubm90IGNyZWF0ZSBSb2xlIE1CZWFuIGZvciByb2xlICIgKyByb2xlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIENyZWF0ZSB0aGUgTUJlYW5zIGZvciBlYWNoIGRlZmluZWQgR3JvdXAKKyAgICAgICAgSXRlcmF0b3IgZ3JvdXBzID0gZGF0YWJhc2UuZ2V0R3JvdXBzKCk7CisgICAgICAgIHdoaWxlIChncm91cHMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBHcm91cCBncm91cCA9IChHcm91cCkgZ3JvdXBzLm5leHQoKTsKKyAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiICBDcmVhdGluZyBHcm91cCBNQmVhbiBmb3IgZ3JvdXAgIiArIGdyb3VwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChNQmVhblV0aWxzLmNyZWF0ZU1CZWFuKGdyb3VwKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAoIkNhbm5vdCBjcmVhdGUgR3JvdXAgTUJlYW4gZm9yIGdyb3VwICIgKyBncm91cCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBDcmVhdGUgdGhlIE1CZWFucyBmb3IgZWFjaCBkZWZpbmVkIFVzZXIKKyAgICAgICAgSXRlcmF0b3IgdXNlcnMgPSBkYXRhYmFzZS5nZXRVc2VycygpOworICAgICAgICB3aGlsZSAodXNlcnMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBVc2VyIHVzZXIgPSAoVXNlcikgdXNlcnMubmV4dCgpOworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgIENyZWF0aW5nIFVzZXIgTUJlYW4gZm9yIHVzZXIgIiArIHVzZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKE1CZWFuVXRpbHMuY3JlYXRlTUJlYW4odXNlcikgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgKCJDYW5ub3QgY3JlYXRlIFVzZXIgTUJlYW4gZm9yIHVzZXIgIiArIHVzZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIERlc3Ryb3kgdGhlIE1CZWFucyBmb3IgdGhlIGludGVyZXN0aW5nIGdsb2JhbCBKTkRJIHJlc291cmNlcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBkZXN0cm95TUJlYW5zKCkgeworCisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgbG9nLmRlYnVnKCJEZXN0cm95aW5nIE1CZWFucyBmb3IgR2xvYmFsIEpOREkgUmVzb3VyY2VzIik7CisgICAgICAgIH0KKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL21iZWFucy9Hcm91cE1CZWFuLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvbWJlYW5zL0dyb3VwTUJlYW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmZjODA5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL21iZWFucy9Hcm91cE1CZWFuLmphdmEKQEAgLTAsMCArMSwyMDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLm1iZWFuczsKKworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NYWxmb3JtZWRPYmplY3ROYW1lRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LlJ1bnRpbWVPcGVyYXRpb25zRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Hcm91cDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlJvbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Vc2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5tb2RlbGVyLkJhc2VNb2RlbE1CZWFuOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5tb2RlbGVyLk1hbmFnZWRCZWFuOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5tb2RlbGVyLlJlZ2lzdHJ5OworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuY29tcGF0Lkpka0NvbXBhdDsKKworLyoqCisgKiA8cD5BIDxzdHJvbmc+TW9kZWxNQmVhbjwvc3Ryb25nPiBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlCisgKiA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLkdyb3VwPC9jb2RlPiBjb21wb25lbnQuPC9wPgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgR3JvdXBNQmVhbiBleHRlbmRzIEJhc2VNb2RlbE1CZWFuIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIDxjb2RlPk1vZGVsTUJlYW48L2NvZGU+IHdpdGggZGVmYXVsdAorICAgICAqIDxjb2RlPk1vZGVsTUJlYW5JbmZvPC9jb2RlPiBpbmZvcm1hdGlvbi4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTUJlYW5FeGNlcHRpb24gaWYgdGhlIGluaXRpYWxpemVyIG9mIGFuIG9iamVjdAorICAgICAqICB0aHJvd3MgYW4gZXhjZXB0aW9uCisgICAgICogQGV4Y2VwdGlvbiBSdW50aW1lT3BlcmF0aW9uc0V4Y2VwdGlvbiBpZiBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgb2NjdXJzCisgICAgICovCisgICAgcHVibGljIEdyb3VwTUJlYW4oKQorICAgICAgICB0aHJvd3MgTUJlYW5FeGNlcHRpb24sIFJ1bnRpbWVPcGVyYXRpb25zRXhjZXB0aW9uIHsKKworICAgICAgICBzdXBlcigpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDbGFzcyBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogSkRLIGNvbXBhdGliaWxpdHkgc3VwcG9ydAorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEpka0NvbXBhdCBqZGtDb21wYXQgPSBKZGtDb21wYXQuZ2V0SmRrQ29tcGF0KCk7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiByZWdpc3RyeSBmb3Igb3VyIG1hbmFnZWQgYmVhbnMuCisgICAgICovCisgICAgcHJvdGVjdGVkIFJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gTUJlYW5VdGlscy5jcmVhdGVSZWdpc3RyeSgpOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgPGNvZGU+TUJlYW5TZXJ2ZXI8L2NvZGU+IGluIHdoaWNoIHdlIGFyZSByZWdpc3RlcmVkLgorICAgICAqLworICAgIHByb3RlY3RlZCBNQmVhblNlcnZlciBtc2VydmVyID0gTUJlYW5VdGlscy5jcmVhdGVTZXJ2ZXIoKTsKKworCisgICAgLyoqCisgICAgICogVGhlIDxjb2RlPk1hbmFnZWRCZWFuPC9jb2RlPiBpbmZvcm1hdGlvbiBkZXNjcmliaW5nIHRoaXMgTUJlYW4uCisgICAgICovCisgICAgcHJvdGVjdGVkIE1hbmFnZWRCZWFuIG1hbmFnZWQgPQorICAgICAgICByZWdpc3RyeS5maW5kTWFuYWdlZEJlYW4oIkdyb3VwIik7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQXR0cmlidXRlcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIE1CZWFuIE5hbWVzIG9mIGFsbCBhdXRob3JpemVkIHJvbGVzIGZvciB0aGlzIGdyb3VwLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRSb2xlcygpIHsKKworICAgICAgICBHcm91cCBncm91cCA9IChHcm91cCkgdGhpcy5yZXNvdXJjZTsKKyAgICAgICAgQXJyYXlMaXN0IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIEl0ZXJhdG9yIHJvbGVzID0gZ3JvdXAuZ2V0Um9sZXMoKTsKKyAgICAgICAgd2hpbGUgKHJvbGVzLmhhc05leHQoKSkgeworICAgICAgICAgICAgUm9sZSByb2xlID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcm9sZSA9IChSb2xlKSByb2xlcy5uZXh0KCk7CisgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9CisgICAgICAgICAgICAgICAgICAgIE1CZWFuVXRpbHMuY3JlYXRlT2JqZWN0TmFtZShtYW5hZ2VkLmdldERvbWFpbigpLCByb2xlKTsKKyAgICAgICAgICAgICAgICByZXN1bHRzLmFkZChvbmFtZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZE9iamVjdE5hbWVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUgPSBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgICgiQ2Fubm90IGNyZWF0ZSBvYmplY3QgbmFtZSBmb3Igcm9sZSAiICsgcm9sZSk7CisgICAgICAgICAgICAgICAgamRrQ29tcGF0LmNoYWluRXhjZXB0aW9uKGlhZSwgZSk7CisgICAgICAgICAgICAgICAgdGhyb3cgaWFlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAoKFN0cmluZ1tdKSByZXN1bHRzLnRvQXJyYXkobmV3IFN0cmluZ1tyZXN1bHRzLnNpemUoKV0pKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBNQmVhbiBOYW1lcyBvZiBhbGwgdXNlcnMgdGhhdCBhcmUgbWVtYmVycyBvZiB0aGlzIGdyb3VwLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRVc2VycygpIHsKKworICAgICAgICBHcm91cCBncm91cCA9IChHcm91cCkgdGhpcy5yZXNvdXJjZTsKKyAgICAgICAgQXJyYXlMaXN0IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIEl0ZXJhdG9yIHVzZXJzID0gZ3JvdXAuZ2V0VXNlcnMoKTsKKyAgICAgICAgd2hpbGUgKHVzZXJzLmhhc05leHQoKSkgeworICAgICAgICAgICAgVXNlciB1c2VyID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdXNlciA9IChVc2VyKSB1c2Vycy5uZXh0KCk7CisgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9CisgICAgICAgICAgICAgICAgICAgIE1CZWFuVXRpbHMuY3JlYXRlT2JqZWN0TmFtZShtYW5hZ2VkLmdldERvbWFpbigpLCB1c2VyKTsKKyAgICAgICAgICAgICAgICByZXN1bHRzLmFkZChvbmFtZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZE9iamVjdE5hbWVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUgPSBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgICgiQ2Fubm90IGNyZWF0ZSBvYmplY3QgbmFtZSBmb3IgdXNlciAiICsgdXNlcik7CisgICAgICAgICAgICAgICAgamRrQ29tcGF0LmNoYWluRXhjZXB0aW9uKGlhZSwgZSk7CisgICAgICAgICAgICAgICAgdGhyb3cgaWFlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAoKFN0cmluZ1tdKSByZXN1bHRzLnRvQXJyYXkobmV3IFN0cmluZ1tyZXN1bHRzLnNpemUoKV0pKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBPcGVyYXRpb25zCisKKworICAgIC8qKgorICAgICAqIEFkZCBhIG5ldyB7QGxpbmsgUm9sZX0gdG8gdGhvc2UgdGhpcyBncm91cCBiZWxvbmdzIHRvLgorICAgICAqCisgICAgICogQHBhcmFtIHJvbGVuYW1lIFJvbGUgbmFtZSBvZiB0aGUgbmV3IHJvbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRSb2xlKFN0cmluZyByb2xlbmFtZSkgeworCisgICAgICAgIEdyb3VwIGdyb3VwID0gKEdyb3VwKSB0aGlzLnJlc291cmNlOworICAgICAgICBpZiAoZ3JvdXAgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIFJvbGUgcm9sZSA9IGdyb3VwLmdldFVzZXJEYXRhYmFzZSgpLmZpbmRSb2xlKHJvbGVuYW1lKTsKKyAgICAgICAgaWYgKHJvbGUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICgiSW52YWxpZCByb2xlIG5hbWUgJyIgKyByb2xlbmFtZSArICInIik7CisgICAgICAgIH0KKyAgICAgICAgZ3JvdXAuYWRkUm9sZShyb2xlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGEge0BsaW5rIFJvbGV9IGZyb20gdGhvc2UgdGhpcyBncm91cCBiZWxvbmdzIHRvLgorICAgICAqCisgICAgICogQHBhcmFtIHJvbGVuYW1lIFJvbGUgbmFtZSBvZiB0aGUgb2xkIHJvbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVSb2xlKFN0cmluZyByb2xlbmFtZSkgeworCisgICAgICAgIEdyb3VwIGdyb3VwID0gKEdyb3VwKSB0aGlzLnJlc291cmNlOworICAgICAgICBpZiAoZ3JvdXAgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIFJvbGUgcm9sZSA9IGdyb3VwLmdldFVzZXJEYXRhYmFzZSgpLmZpbmRSb2xlKHJvbGVuYW1lKTsKKyAgICAgICAgaWYgKHJvbGUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICgiSW52YWxpZCByb2xlIG5hbWUgJyIgKyByb2xlbmFtZSArICInIik7CisgICAgICAgIH0KKyAgICAgICAgZ3JvdXAucmVtb3ZlUm9sZShyb2xlKTsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvbWJlYW5zL01CZWFuRmFjdG9yeS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL21iZWFucy9NQmVhbkZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzFlYTA4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL21iZWFucy9NQmVhbkZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDExMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OS0yMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEubWJlYW5zOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuUnVudGltZU9wZXJhdGlvbnNFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5FbmdpbmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Ib3N0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuU2VydmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuU2VydmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlNlcnZpY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5WYWx2ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmF1dGhlbnRpY2F0b3IuU2luZ2xlU2lnbk9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLkNvbm5lY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuQ29udGFpbmVyQmFzZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRDb250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZEVuZ2luZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRIb3N0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZFNlcnZpY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5sb2FkZXIuV2ViYXBwTG9hZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEucmVhbG0uRGF0YVNvdXJjZVJlYWxtOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEucmVhbG0uSkRCQ1JlYWxtOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEucmVhbG0uSk5ESVJlYWxtOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEucmVhbG0uTWVtb3J5UmVhbG07CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5yZWFsbS5Vc2VyRGF0YWJhc2VSZWFsbTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnNlc3Npb24uU3RhbmRhcmRNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cC5Db250ZXh0Q29uZmlnOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cC5Ib3N0Q29uZmlnOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudmFsdmVzLkFjY2Vzc0xvZ1ZhbHZlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudmFsdmVzLlJlbW90ZUFkZHJWYWx2ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcy5SZW1vdGVIb3N0VmFsdmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS52YWx2ZXMuUmVxdWVzdER1bXBlclZhbHZlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudmFsdmVzLlZhbHZlQmFzZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubW9kZWxlci5CYXNlTW9kZWxNQmVhbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubW9kZWxlci5SZWdpc3RyeTsKKworCisvKioKKyAqIDxwPkEgPHN0cm9uZz5Nb2RlbE1CZWFuPC9zdHJvbmc+IGltcGxlbWVudGF0aW9uIGZvciB0aGUKKyAqIDxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZFNlcnZlcjwvY29kZT4gY29tcG9uZW50LjwvcD4KKyAqCisgKiBAYXV0aG9yIEFteSBSb2gKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIE1CZWFuRmFjdG9yeSBleHRlbmRzIEJhc2VNb2RlbE1CZWFuIHsKKworICAgIHByaXZhdGUgc3RhdGljIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZyBsb2cgPSAKKyAgICAgICAgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeS5nZXRMb2coTUJlYW5GYWN0b3J5LmNsYXNzKTsKKworICAgIC8qKgorICAgICAqIFRoZSA8Y29kZT5NQmVhblNlcnZlcjwvY29kZT4gZm9yIHRoaXMgYXBwbGljYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgTUJlYW5TZXJ2ZXIgbXNlcnZlciA9IE1CZWFuVXRpbHMuY3JlYXRlU2VydmVyKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiByZWdpc3RyeSBmb3Igb3VyIG1hbmFnZWQgYmVhbnMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgUmVnaXN0cnkgcmVnaXN0cnkgPSBNQmVhblV0aWxzLmNyZWF0ZVJlZ2lzdHJ5KCk7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSA8Y29kZT5Nb2RlbE1CZWFuPC9jb2RlPiB3aXRoIGRlZmF1bHQKKyAgICAgKiA8Y29kZT5Nb2RlbE1CZWFuSW5mbzwvY29kZT4gaW5mb3JtYXRpb24uCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIE1CZWFuRXhjZXB0aW9uIGlmIHRoZSBpbml0aWFsaXplciBvZiBhbiBvYmplY3QKKyAgICAgKiAgdGhyb3dzIGFuIGV4Y2VwdGlvbgorICAgICAqIEBleGNlcHRpb24gUnVudGltZU9wZXJhdGlvbnNFeGNlcHRpb24gaWYgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBNQmVhbkZhY3RvcnkoKQorICAgICAgICB0aHJvd3MgTUJlYW5FeGNlcHRpb24sIFJ1bnRpbWVPcGVyYXRpb25zRXhjZXB0aW9uIHsKKworICAgICAgICBzdXBlcigpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEF0dHJpYnV0ZXMKKworCisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gT3BlcmF0aW9ucworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG1hbmFnZWQgYmVhbiBkZWZpbml0aW9uIGZvciB0aGUgc3BlY2lmaWVkIGJlYW4gdHlwZQorICAgICAqCisgICAgICogQHBhcmFtIHR5cGUgTUJlYW4gdHlwZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZmluZE9iamVjdE5hbWUoU3RyaW5nIHR5cGUpIHsKKworICAgICAgICBpZiAodHlwZS5lcXVhbHMoIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZENvbnRleHQiKSkgeworICAgICAgICAgICAgcmV0dXJuICJTdGFuZGFyZENvbnRleHQiOworICAgICAgICB9IGVsc2UgaWYgKHR5cGUuZXF1YWxzKCJvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmREZWZhdWx0Q29udGV4dCIpKSB7CisgICAgICAgICAgICByZXR1cm4gIkRlZmF1bHRDb250ZXh0IjsKKyAgICAgICAgfSBlbHNlIGlmICh0eXBlLmVxdWFscygib3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkRW5naW5lIikpIHsKKyAgICAgICAgICAgIHJldHVybiAiRW5naW5lIjsKKyAgICAgICAgfSBlbHNlIGlmICh0eXBlLmVxdWFscygib3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkSG9zdCIpKSB7CisgICAgICAgICAgICByZXR1cm4gIkhvc3QiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogTGl0dGxlIGNvbnZlbmllbmNlIG1ldGhvZCB0byByZW1vdmUgcmVkdW5kYW50IGNvZGUKKyAgICAgKiB3aGVuIHJldHJpZXZpbmcgdGhlIHBhdGggc3RyaW5nCisgICAgICoKKyAgICAgKiBAcGFyYW0gdCBwYXRoIHN0cmluZworICAgICAqIEByZXR1cm4gZW1wdHkgc3RyaW5nIGlmIHQ9PW51bGwgfHwgdC5lcXVhbHMoIi8iKQorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGdldFBhdGhTdHIoU3RyaW5nIHQpIHsKKyAgICAgICAgaWYgKHQgPT0gbnVsbCB8fCB0LmVxdWFscygiLyIpKSB7CisgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHQ7CisgICAgfQorCisgICAgCisgICAvKioKKyAgICAgKiBHZXQgUGFyZW50IERlZmF1bHRDb250ZXh0IHRvIGFkZCBpdHMgY2hpbGQgY29tcG9uZW50IAorICAgICAqIGZyb20gcGFyZW50J3MgT2JqZWN0TmFtZQorICAgICAqLworICAgIC8qCisgICAgcHJpdmF0ZSBEZWZhdWx0Q29udGV4dCBnZXREZWZhdWx0Q29udGV4dChPYmplY3ROYW1lIHBuYW1lKSAKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIAorICAgICAgICBTdHJpbmcgdHlwZSA9IHBuYW1lLmdldEtleVByb3BlcnR5KCJ0eXBlIik7CisgICAgICAgIGlmICh0eXBlLmVxdWFscygiRGVmYXVsdENvbnRleHQiKSkgeworICAgICAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gZ2V0U2VydmljZShwbmFtZSk7CisgICAgICAgICAgICBTdGFuZGFyZEVuZ2luZSBlbmdpbmUgPSAoU3RhbmRhcmRFbmdpbmUpIHNlcnZpY2UuZ2V0Q29udGFpbmVyKCk7CisgICAgICAgICAgICBTdHJpbmcgaG9zdE5hbWUgPSBwbmFtZS5nZXRLZXlQcm9wZXJ0eSgiaG9zdCIpOworICAgICAgICAgICAgaWYgKGhvc3ROYW1lIT1udWxsKSB7CisgICAgICAgICAgICAgICAgU3RhbmRhcmRIb3N0IGhvc3QgPSAKKyAgICAgICAgICAgICAgICAgICAgKFN0YW5kYXJkSG9zdCkgZW5naW5lLmZpbmRDaGlsZChob3N0TmFtZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGhvc3QuZ2V0RGVmYXVsdENvbnRleHQoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVuZ2luZS5nZXREZWZhdWx0Q29udGV4dCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICAqLworICAgIAorCisgICAgLyoqCisgICAgICogR2V0IFBhcmVudCBDb250YWluZXJCYXNlIHRvIGFkZCBpdHMgY2hpbGQgY29tcG9uZW50IAorICAgICAqIGZyb20gcGFyZW50J3MgT2JqZWN0TmFtZQorICAgICAqLworICAgIHByaXZhdGUgQ29udGFpbmVyQmFzZSBnZXRQYXJlbnRDb250YWluZXJGcm9tUGFyZW50KE9iamVjdE5hbWUgcG5hbWUpIAorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgCisgICAgICAgIFN0cmluZyB0eXBlID0gcG5hbWUuZ2V0S2V5UHJvcGVydHkoInR5cGUiKTsKKyAgICAgICAgU3RyaW5nIGoyZWVUeXBlID0gcG5hbWUuZ2V0S2V5UHJvcGVydHkoImoyZWVUeXBlIik7CisgICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IGdldFNlcnZpY2UocG5hbWUpOworICAgICAgICBTdGFuZGFyZEVuZ2luZSBlbmdpbmUgPSAoU3RhbmRhcmRFbmdpbmUpIHNlcnZpY2UuZ2V0Q29udGFpbmVyKCk7CisgICAgICAgIGlmICgoajJlZVR5cGUhPW51bGwpICYmIChqMmVlVHlwZS5lcXVhbHMoIldlYk1vZHVsZSIpKSkgeworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBwbmFtZS5nZXRLZXlQcm9wZXJ0eSgibmFtZSIpOworICAgICAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDIpOworICAgICAgICAgICAgaW50IGkgPSBuYW1lLmluZGV4T2YoIi8iKTsKKyAgICAgICAgICAgIFN0cmluZyBob3N0TmFtZSA9IG5hbWUuc3Vic3RyaW5nKDAsaSk7CisgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IG5hbWUuc3Vic3RyaW5nKGkpOworICAgICAgICAgICAgSG9zdCBob3N0ID0gKEhvc3QpIGVuZ2luZS5maW5kQ2hpbGQoaG9zdE5hbWUpOworICAgICAgICAgICAgU3RyaW5nIHBhdGhTdHIgPSBnZXRQYXRoU3RyKHBhdGgpOworICAgICAgICAgICAgU3RhbmRhcmRDb250ZXh0IGNvbnRleHQgPSAoU3RhbmRhcmRDb250ZXh0KWhvc3QuZmluZENoaWxkKHBhdGhTdHIpOworICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQ7CisgICAgICAgIH0gZWxzZSBpZiAodHlwZSAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAodHlwZS5lcXVhbHMoIkVuZ2luZSIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVuZ2luZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZS5lcXVhbHMoIkhvc3QiKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBob3N0TmFtZSA9IHBuYW1lLmdldEtleVByb3BlcnR5KCJob3N0Iik7CisgICAgICAgICAgICAgICAgU3RhbmRhcmRIb3N0IGhvc3QgPSAoU3RhbmRhcmRIb3N0KSBlbmdpbmUuZmluZENoaWxkKGhvc3ROYW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gaG9zdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHZXQgUGFyZW50IENvbnRhaW5lckJhc2UgdG8gYWRkIGl0cyBjaGlsZCBjb21wb25lbnQgCisgICAgICogZnJvbSBjaGlsZCBjb21wb25lbnQncyBPYmplY3ROYW1lICBhcyBhIFN0cmluZworICAgICAqLyAgICAKKyAgICBwcml2YXRlIENvbnRhaW5lckJhc2UgZ2V0UGFyZW50Q29udGFpbmVyRnJvbUNoaWxkKE9iamVjdE5hbWUgb25hbWUpIAorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgCisgICAgICAgIFN0cmluZyBob3N0TmFtZSA9IG9uYW1lLmdldEtleVByb3BlcnR5KCJob3N0Iik7CisgICAgICAgIFN0cmluZyBwYXRoID0gb25hbWUuZ2V0S2V5UHJvcGVydHkoInBhdGgiKTsKKyAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gZ2V0U2VydmljZShvbmFtZSk7CisgICAgICAgIFN0YW5kYXJkRW5naW5lIGVuZ2luZSA9IChTdGFuZGFyZEVuZ2luZSkgc2VydmljZS5nZXRDb250YWluZXIoKTsKKyAgICAgICAgaWYgKGhvc3ROYW1lID09IG51bGwpIHsgICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBjaGlsZCdzIGNvbnRhaW5lciBpcyBFbmdpbmUKKyAgICAgICAgICAgIHJldHVybiBlbmdpbmU7CisgICAgICAgIH0gZWxzZSBpZiAocGF0aCA9PSBudWxsKSB7ICAgICAgCisgICAgICAgICAgICAvLyBjaGlsZCdzIGNvbnRhaW5lciBpcyBIb3N0CisgICAgICAgICAgICBTdGFuZGFyZEhvc3QgaG9zdCA9IChTdGFuZGFyZEhvc3QpIGVuZ2luZS5maW5kQ2hpbGQoaG9zdE5hbWUpOworICAgICAgICAgICAgcmV0dXJuIGhvc3Q7CisgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gY2hpbGQncyBjb250YWluZXIgaXMgQ29udGV4dAorICAgICAgICAgICAgU3RhbmRhcmRIb3N0IGhvc3QgPSAoU3RhbmRhcmRIb3N0KSBlbmdpbmUuZmluZENoaWxkKGhvc3ROYW1lKTsKKyAgICAgICAgICAgIHBhdGggPSBnZXRQYXRoU3RyKHBhdGgpOworICAgICAgICAgICAgU3RhbmRhcmRDb250ZXh0IGNvbnRleHQgPSAoU3RhbmRhcmRDb250ZXh0KSBob3N0LmZpbmRDaGlsZChwYXRoKTsKKyAgICAgICAgICAgIHJldHVybiBjb250ZXh0OworICAgICAgICB9CisgICAgfQorCisgICAgCisgICAgcHJpdmF0ZSBTZXJ2aWNlIGdldFNlcnZpY2UoT2JqZWN0TmFtZSBvbmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgCisgICAgICAgIFN0cmluZyBkb21haW4gPSBvbmFtZS5nZXREb21haW4oKTsKKyAgICAgICAgU2VydmVyIHNlcnZlciA9IFNlcnZlckZhY3RvcnkuZ2V0U2VydmVyKCk7CisgICAgICAgIFNlcnZpY2VbXSBzZXJ2aWNlcyA9IHNlcnZlci5maW5kU2VydmljZXMoKTsKKyAgICAgICAgU3RhbmRhcmRTZXJ2aWNlIHNlcnZpY2UgPSBudWxsOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlcnZpY2VzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBzZXJ2aWNlID0gKFN0YW5kYXJkU2VydmljZSkgc2VydmljZXNbaV07CisgICAgICAgICAgICBpZiAoZG9tYWluLmVxdWFscyhzZXJ2aWNlLmdldE9iamVjdE5hbWUoKS5nZXREb21haW4oKSkpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIXNlcnZpY2UuZ2V0T2JqZWN0TmFtZSgpLmdldERvbWFpbigpLmVxdWFscyhkb21haW4pKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJTZXJ2aWNlIHdpdGggdGhlIGRvbWFpbiBpcyBub3QgZm91bmQiKTsKKyAgICAgICAgfSAgICAgICAgCisgICAgICAgIHJldHVybiBzZXJ2aWNlOworCisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBBY2Nlc3NMb2dnZXJWYWx2ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJlbnQgTUJlYW4gTmFtZSBvZiB0aGUgYXNzb2NpYXRlZCBwYXJlbnQgY29tcG9uZW50CisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBNQmVhbiBjYW5ub3QgYmUgY3JlYXRlZCBvciByZWdpc3RlcmVkCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBjcmVhdGVBY2Nlc3NMb2dnZXJWYWx2ZShTdHJpbmcgcGFyZW50KQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBPYmplY3ROYW1lIHBuYW1lID0gbmV3IE9iamVjdE5hbWUocGFyZW50KTsKKyAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IEFjY2Vzc0xvZ1ZhbHZlIGluc3RhbmNlCisgICAgICAgIEFjY2Vzc0xvZ1ZhbHZlIGFjY2Vzc0xvZ2dlciA9IG5ldyBBY2Nlc3NMb2dWYWx2ZSgpOworICAgICAgICBDb250YWluZXJCYXNlIGNvbnRhaW5lckJhc2UgPSBnZXRQYXJlbnRDb250YWluZXJGcm9tUGFyZW50KHBuYW1lKTsKKyAgICAgICAgLy8gQWRkIHRoZSBuZXcgaW5zdGFuY2UgdG8gaXRzIHBhcmVudCBjb21wb25lbnQKKyAgICAgICAgY29udGFpbmVyQmFzZS5hZGRWYWx2ZShhY2Nlc3NMb2dnZXIpOworICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0gYWNjZXNzTG9nZ2VyLmdldE9iamVjdE5hbWUoKTsKKyAgICAgICAgcmV0dXJuIChvbmFtZS50b1N0cmluZygpKTsKKworICAgIH0KKyAgICAgICAgCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgQWpwQ29ubmVjdG9yCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyZW50IE1CZWFuIE5hbWUgb2YgdGhlIGFzc29jaWF0ZWQgcGFyZW50IGNvbXBvbmVudAorICAgICAqIEBwYXJhbSBhZGRyZXNzIFRoZSBJUCBhZGRyZXNzIG9uIHdoaWNoIHRvIGJpbmQKKyAgICAgKiBAcGFyYW0gcG9ydCBUQ1AgcG9ydCBudW1iZXIgdG8gbGlzdGVuIG9uCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBNQmVhbiBjYW5ub3QgYmUgY3JlYXRlZCBvciByZWdpc3RlcmVkCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBjcmVhdGVBanBDb25uZWN0b3IoU3RyaW5nIHBhcmVudCwgU3RyaW5nIGFkZHJlc3MsIGludCBwb3J0KQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICByZXR1cm4gY3JlYXRlQ29ubmVjdG9yKHBhcmVudCwgYWRkcmVzcywgcG9ydCwgdHJ1ZSwgZmFsc2UpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgRGF0YVNvdXJjZSBSZWFsbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJlbnQgTUJlYW4gTmFtZSBvZiB0aGUgYXNzb2NpYXRlZCBwYXJlbnQgY29tcG9uZW50CisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBNQmVhbiBjYW5ub3QgYmUgY3JlYXRlZCBvciByZWdpc3RlcmVkCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBjcmVhdGVEYXRhU291cmNlUmVhbG0oU3RyaW5nIHBhcmVudCwgU3RyaW5nIGRhdGFTb3VyY2VOYW1lLCAKKyAgICAgICAgU3RyaW5nIHJvbGVOYW1lQ29sLCBTdHJpbmcgdXNlckNyZWRDb2wsIFN0cmluZyB1c2VyTmFtZUNvbCwgCisgICAgICAgIFN0cmluZyB1c2VyUm9sZVRhYmxlLCBTdHJpbmcgdXNlclRhYmxlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBDcmVhdGUgYSBuZXcgRGF0YVNvdXJjZVJlYWxtIGluc3RhbmNlCisgICAgICAgIERhdGFTb3VyY2VSZWFsbSByZWFsbSA9IG5ldyBEYXRhU291cmNlUmVhbG0oKTsKKwlyZWFsbS5zZXREYXRhU291cmNlTmFtZShkYXRhU291cmNlTmFtZSk7CisJcmVhbG0uc2V0Um9sZU5hbWVDb2wocm9sZU5hbWVDb2wpOworCXJlYWxtLnNldFVzZXJDcmVkQ29sKHVzZXJDcmVkQ29sKTsKKwlyZWFsbS5zZXRVc2VyTmFtZUNvbCh1c2VyTmFtZUNvbCk7CisgICAgICAgIHJlYWxtLnNldFVzZXJSb2xlVGFibGUodXNlclJvbGVUYWJsZSk7CisgICAgICAgIHJlYWxtLnNldFVzZXJUYWJsZSh1c2VyVGFibGUpOworCisgICAgICAgIC8vIEFkZCB0aGUgbmV3IGluc3RhbmNlIHRvIGl0cyBwYXJlbnQgY29tcG9uZW50CisgICAgICAgIE9iamVjdE5hbWUgcG5hbWUgPSBuZXcgT2JqZWN0TmFtZShwYXJlbnQpOworICAgICAgICBDb250YWluZXJCYXNlIGNvbnRhaW5lckJhc2UgPSBnZXRQYXJlbnRDb250YWluZXJGcm9tUGFyZW50KHBuYW1lKTsKKyAgICAgICAgLy8gQWRkIHRoZSBuZXcgaW5zdGFuY2UgdG8gaXRzIHBhcmVudCBjb21wb25lbnQKKyAgICAgICAgY29udGFpbmVyQmFzZS5zZXRSZWFsbShyZWFsbSk7CisgICAgICAgIC8vIFJldHVybiB0aGUgY29ycmVzcG9uZGluZyBNQmVhbiBuYW1lCisgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPSByZWFsbS5nZXRPYmplY3ROYW1lKCk7CisgICAgICAgIGlmIChvbmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gKG9uYW1lLnRvU3RyaW5nKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0gICAKKworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBEZWZhdWx0Q29udGV4dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJlbnQgTUJlYW4gTmFtZSBvZiB0aGUgYXNzb2NpYXRlZCBwYXJlbnQgY29tcG9uZW50CisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBNQmVhbiBjYW5ub3QgYmUgY3JlYXRlZCBvciByZWdpc3RlcmVkCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBjcmVhdGVEZWZhdWx0Q29udGV4dChTdHJpbmcgcGFyZW50KQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gWFhYIEZJWE1FCisgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBTdGFuZGFyZERlZmF1bHRDb250ZXh0IGluc3RhbmNlCisgICAgICAgIC8qCisgICAgICAgIFN0YW5kYXJkRGVmYXVsdENvbnRleHQgY29udGV4dCA9IG5ldyBTdGFuZGFyZERlZmF1bHRDb250ZXh0KCk7CisKKyAgICAgICAgLy8gQWRkIHRoZSBuZXcgaW5zdGFuY2UgdG8gaXRzIHBhcmVudCBjb21wb25lbnQKKyAgICAgICAgT2JqZWN0TmFtZSBwbmFtZSA9IG5ldyBPYmplY3ROYW1lKHBhcmVudCk7CisgICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IGdldFNlcnZpY2UocG5hbWUpOyAgICAgICAKKyAgICAgICAgRW5naW5lIGVuZ2luZSA9IChFbmdpbmUpIHNlcnZpY2UuZ2V0Q29udGFpbmVyKCk7CisgICAgICAgIFN0cmluZyBob3N0TmFtZSA9IHBuYW1lLmdldEtleVByb3BlcnR5KCJob3N0Iik7CisgICAgICAgIGlmIChob3N0TmFtZSA9PSBudWxsKSB7IC8vaWYgRGVmYXVsdENvbnRleHQgaXMgbmVzdGVkIGluIEVuZ2luZQorICAgICAgICAgICAgY29udGV4dC5zZXRQYXJlbnQoZW5naW5lKTsKKyAgICAgICAgICAgIGVuZ2luZS5hZGREZWZhdWx0Q29udGV4dChjb250ZXh0KTsKKyAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgLy8gaWYgRGVmYXVsdENvbnRleHQgaXMgbmVzdGVkIGluIEhvc3QKKyAgICAgICAgICAgIEhvc3QgaG9zdCA9IChIb3N0KSBlbmdpbmUuZmluZENoaWxkKGhvc3ROYW1lKTsKKyAgICAgICAgICAgIGNvbnRleHQuc2V0UGFyZW50KGhvc3QpOworICAgICAgICAgICAgaG9zdC5hZGREZWZhdWx0Q29udGV4dChjb250ZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJldHVybiB0aGUgY29ycmVzcG9uZGluZyBNQmVhbiBuYW1lCisgICAgICAgIE1hbmFnZWRCZWFuIG1hbmFnZWQgPSByZWdpc3RyeS5maW5kTWFuYWdlZEJlYW4oIkRlZmF1bHRDb250ZXh0Iik7CisgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPQorICAgICAgICAgICAgTUJlYW5VdGlscy5jcmVhdGVPYmplY3ROYW1lKG1hbmFnZWQuZ2V0RG9tYWluKCksIGNvbnRleHQpOworICAgICAgICByZXR1cm4gKG9uYW1lLnRvU3RyaW5nKCkpOworICAgICAgICAqLworICAgICAgICByZXR1cm4gbnVsbDsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IEh0dHBDb25uZWN0b3IKKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJlbnQgTUJlYW4gTmFtZSBvZiB0aGUgYXNzb2NpYXRlZCBwYXJlbnQgY29tcG9uZW50CisgICAgICogQHBhcmFtIGFkZHJlc3MgVGhlIElQIGFkZHJlc3Mgb24gd2hpY2ggdG8gYmluZAorICAgICAqIEBwYXJhbSBwb3J0IFRDUCBwb3J0IG51bWJlciB0byBsaXN0ZW4gb24KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIE1CZWFuIGNhbm5vdCBiZSBjcmVhdGVkIG9yIHJlZ2lzdGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZUh0dHBDb25uZWN0b3IoU3RyaW5nIHBhcmVudCwgU3RyaW5nIGFkZHJlc3MsIGludCBwb3J0KQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKwlyZXR1cm4gY3JlYXRlQ29ubmVjdG9yKHBhcmVudCwgYWRkcmVzcywgcG9ydCwgZmFsc2UsIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgQ29ubmVjdG9yCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyZW50IE1CZWFuIE5hbWUgb2YgdGhlIGFzc29jaWF0ZWQgcGFyZW50IGNvbXBvbmVudAorICAgICAqIEBwYXJhbSBhZGRyZXNzIFRoZSBJUCBhZGRyZXNzIG9uIHdoaWNoIHRvIGJpbmQKKyAgICAgKiBAcGFyYW0gcG9ydCBUQ1AgcG9ydCBudW1iZXIgdG8gbGlzdGVuIG9uCisgICAgICogQHBhcmFtIGlzQWpwIENyZWF0ZSBhIEFKUC8xLjMgQ29ubmVjdG9yCisgICAgICogQHBhcmFtIGlzU1NMIENyZWF0ZSBhIHNlY3VyZSBDb25uZWN0b3IKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIE1CZWFuIGNhbm5vdCBiZSBjcmVhdGVkIG9yIHJlZ2lzdGVyZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBjcmVhdGVDb25uZWN0b3IoU3RyaW5nIHBhcmVudCwgU3RyaW5nIGFkZHJlc3MsIGludCBwb3J0LCBib29sZWFuIGlzQWpwLCBib29sZWFuIGlzU1NMKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQ29ubmVjdG9yIHJldG9iaiA9IG5ldyBDb25uZWN0b3IoKTsKKyAgICAgICAgaWYgKChhZGRyZXNzIT1udWxsKSAmJiAoYWRkcmVzcy5sZW5ndGgoKT4wKSkgeworICAgICAgICAgICAgcmV0b2JqLnNldFByb3BlcnR5KCJhZGRyZXNzIiwgYWRkcmVzcyk7CisgICAgICAgIH0KKyAgICAgICAgLy8gU2V0IHBvcnQgbnVtYmVyCisgICAgICAgIHJldG9iai5zZXRQb3J0KHBvcnQpOworICAgICAgICAvLyBTZXQgdGhlIHByb3RvY29sCisgICAgICAgIHJldG9iai5zZXRQcm90b2NvbChpc0FqcCA/ICJBSlAvMS4zIiA6ICJIVFRQLzEuMSIpOworICAgICAgICAvLyBTZXQgU1NMCisgICAgICAgIHJldG9iai5zZXRTZWN1cmUoaXNTU0wpOworICAgICAgICByZXRvYmouc2V0U2NoZW1lKGlzU1NMID8gImh0dHBzIiA6ICJodHRwIik7CisgICAgICAgIC8vIEFkZCB0aGUgbmV3IGluc3RhbmNlIHRvIGl0cyBwYXJlbnQgY29tcG9uZW50CisgICAgICAgIC8vIEZJWCBNRSAtIGFkZENvbm5lY3RvciB3aWxsIGZhaWwKKyAgICAgICAgT2JqZWN0TmFtZSBwbmFtZSA9IG5ldyBPYmplY3ROYW1lKHBhcmVudCk7CisgICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IGdldFNlcnZpY2UocG5hbWUpOworICAgICAgICBzZXJ2aWNlLmFkZENvbm5lY3RvcihyZXRvYmopOworICAgICAgICAKKyAgICAgICAgLy8gUmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIE1CZWFuIG5hbWUKKyAgICAgICAgT2JqZWN0TmFtZSBjb25hbWUgPSByZXRvYmouZ2V0T2JqZWN0TmFtZSgpOworICAgICAgICAKKyAgICAgICAgcmV0dXJuIChjb25hbWUudG9TdHJpbmcoKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgSHR0cHNDb25uZWN0b3IKKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJlbnQgTUJlYW4gTmFtZSBvZiB0aGUgYXNzb2NpYXRlZCBwYXJlbnQgY29tcG9uZW50CisgICAgICogQHBhcmFtIGFkZHJlc3MgVGhlIElQIGFkZHJlc3Mgb24gd2hpY2ggdG8gYmluZAorICAgICAqIEBwYXJhbSBwb3J0IFRDUCBwb3J0IG51bWJlciB0byBsaXN0ZW4gb24KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIE1CZWFuIGNhbm5vdCBiZSBjcmVhdGVkIG9yIHJlZ2lzdGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZUh0dHBzQ29ubmVjdG9yKFN0cmluZyBwYXJlbnQsIFN0cmluZyBhZGRyZXNzLCBpbnQgcG9ydCkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBjcmVhdGVDb25uZWN0b3IocGFyZW50LCBhZGRyZXNzLCBwb3J0LCBmYWxzZSwgdHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IEpEQkMgUmVhbG0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyZW50IE1CZWFuIE5hbWUgb2YgdGhlIGFzc29jaWF0ZWQgcGFyZW50IGNvbXBvbmVudAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW4gTUJlYW4gY2Fubm90IGJlIGNyZWF0ZWQgb3IgcmVnaXN0ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlSkRCQ1JlYWxtKFN0cmluZyBwYXJlbnQsIFN0cmluZyBkcml2ZXJOYW1lLCAKKyAgICAJU3RyaW5nIGNvbm5lY3Rpb25OYW1lLCBTdHJpbmcgY29ubmVjdGlvblBhc3N3b3JkLCBTdHJpbmcgY29ubmVjdGlvblVSTCkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IEpEQkNSZWFsbSBpbnN0YW5jZQorICAgICAgICBKREJDUmVhbG0gcmVhbG0gPSBuZXcgSkRCQ1JlYWxtKCk7CisJcmVhbG0uc2V0RHJpdmVyTmFtZShkcml2ZXJOYW1lKTsKKwlyZWFsbS5zZXRDb25uZWN0aW9uTmFtZShjb25uZWN0aW9uTmFtZSk7CisJcmVhbG0uc2V0Q29ubmVjdGlvblBhc3N3b3JkKGNvbm5lY3Rpb25QYXNzd29yZCk7CisJcmVhbG0uc2V0Q29ubmVjdGlvblVSTChjb25uZWN0aW9uVVJMKTsKKworICAgICAgICAvLyBBZGQgdGhlIG5ldyBpbnN0YW5jZSB0byBpdHMgcGFyZW50IGNvbXBvbmVudAorICAgICAgICBPYmplY3ROYW1lIHBuYW1lID0gbmV3IE9iamVjdE5hbWUocGFyZW50KTsKKyAgICAgICAgQ29udGFpbmVyQmFzZSBjb250YWluZXJCYXNlID0gZ2V0UGFyZW50Q29udGFpbmVyRnJvbVBhcmVudChwbmFtZSk7CisgICAgICAgIC8vIEFkZCB0aGUgbmV3IGluc3RhbmNlIHRvIGl0cyBwYXJlbnQgY29tcG9uZW50CisgICAgICAgIGNvbnRhaW5lckJhc2Uuc2V0UmVhbG0ocmVhbG0pOworICAgICAgICAvLyBSZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgTUJlYW4gbmFtZQorICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0gcmVhbG0uZ2V0T2JqZWN0TmFtZSgpOworCisgICAgICAgIGlmIChvbmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gKG9uYW1lLnRvU3RyaW5nKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0gICAKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IEpOREkgUmVhbG0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyZW50IE1CZWFuIE5hbWUgb2YgdGhlIGFzc29jaWF0ZWQgcGFyZW50IGNvbXBvbmVudAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW4gTUJlYW4gY2Fubm90IGJlIGNyZWF0ZWQgb3IgcmVnaXN0ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlSk5ESVJlYWxtKFN0cmluZyBwYXJlbnQpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgSk5ESVJlYWxtIGluc3RhbmNlCisgICAgICAgIEpORElSZWFsbSByZWFsbSA9IG5ldyBKTkRJUmVhbG0oKTsKKworICAgICAgICAvLyBBZGQgdGhlIG5ldyBpbnN0YW5jZSB0byBpdHMgcGFyZW50IGNvbXBvbmVudAorICAgICAgICBPYmplY3ROYW1lIHBuYW1lID0gbmV3IE9iamVjdE5hbWUocGFyZW50KTsKKyAgICAgICAgQ29udGFpbmVyQmFzZSBjb250YWluZXJCYXNlID0gZ2V0UGFyZW50Q29udGFpbmVyRnJvbVBhcmVudChwbmFtZSk7CisgICAgICAgIC8vIEFkZCB0aGUgbmV3IGluc3RhbmNlIHRvIGl0cyBwYXJlbnQgY29tcG9uZW50CisgICAgICAgIGNvbnRhaW5lckJhc2Uuc2V0UmVhbG0ocmVhbG0pOworICAgICAgICAvLyBSZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgTUJlYW4gbmFtZQorICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0gcmVhbG0uZ2V0T2JqZWN0TmFtZSgpOworCisgICAgICAgIGlmIChvbmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gKG9uYW1lLnRvU3RyaW5nKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0gICAKKworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgTWVtb3J5IFJlYWxtLgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmVudCBNQmVhbiBOYW1lIG9mIHRoZSBhc3NvY2lhdGVkIHBhcmVudCBjb21wb25lbnQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIE1CZWFuIGNhbm5vdCBiZSBjcmVhdGVkIG9yIHJlZ2lzdGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZU1lbW9yeVJlYWxtKFN0cmluZyBwYXJlbnQpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgTWVtb3J5UmVhbG0gaW5zdGFuY2UKKyAgICAgICAgTWVtb3J5UmVhbG0gcmVhbG0gPSBuZXcgTWVtb3J5UmVhbG0oKTsKKworICAgICAgICAvLyBBZGQgdGhlIG5ldyBpbnN0YW5jZSB0byBpdHMgcGFyZW50IGNvbXBvbmVudAorICAgICAgICBPYmplY3ROYW1lIHBuYW1lID0gbmV3IE9iamVjdE5hbWUocGFyZW50KTsKKyAgICAgICAgQ29udGFpbmVyQmFzZSBjb250YWluZXJCYXNlID0gZ2V0UGFyZW50Q29udGFpbmVyRnJvbVBhcmVudChwbmFtZSk7CisgICAgICAgIC8vIEFkZCB0aGUgbmV3IGluc3RhbmNlIHRvIGl0cyBwYXJlbnQgY29tcG9uZW50CisgICAgICAgIGNvbnRhaW5lckJhc2Uuc2V0UmVhbG0ocmVhbG0pOworICAgICAgICAvLyBSZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgTUJlYW4gbmFtZQorICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0gcmVhbG0uZ2V0T2JqZWN0TmFtZSgpOworICAgICAgICBpZiAob25hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIChvbmFtZS50b1N0cmluZygpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9ICAgCisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBSZW1vdGUgQWRkcmVzcyBGaWx0ZXIgVmFsdmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyZW50IE1CZWFuIE5hbWUgb2YgdGhlIGFzc29jaWF0ZWQgcGFyZW50IGNvbXBvbmVudAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW4gTUJlYW4gY2Fubm90IGJlIGNyZWF0ZWQgb3IgcmVnaXN0ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlUmVtb3RlQWRkclZhbHZlKFN0cmluZyBwYXJlbnQpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBSZW1vdGVBZGRyVmFsdmUgaW5zdGFuY2UKKyAgICAgICAgUmVtb3RlQWRkclZhbHZlIHZhbHZlID0gbmV3IFJlbW90ZUFkZHJWYWx2ZSgpOworCisgICAgICAgIC8vIEFkZCB0aGUgbmV3IGluc3RhbmNlIHRvIGl0cyBwYXJlbnQgY29tcG9uZW50CisgICAgICAgIE9iamVjdE5hbWUgcG5hbWUgPSBuZXcgT2JqZWN0TmFtZShwYXJlbnQpOworICAgICAgICBDb250YWluZXJCYXNlIGNvbnRhaW5lckJhc2UgPSBnZXRQYXJlbnRDb250YWluZXJGcm9tUGFyZW50KHBuYW1lKTsKKyAgICAgICAgY29udGFpbmVyQmFzZS5hZGRWYWx2ZSh2YWx2ZSk7CisgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPSB2YWx2ZS5nZXRPYmplY3ROYW1lKCk7CisgICAgICAgIHJldHVybiAob25hbWUudG9TdHJpbmcoKSk7CisKKyAgICB9CisKKworICAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgUmVtb3RlIEhvc3QgRmlsdGVyIFZhbHZlLgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmVudCBNQmVhbiBOYW1lIG9mIHRoZSBhc3NvY2lhdGVkIHBhcmVudCBjb21wb25lbnQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIE1CZWFuIGNhbm5vdCBiZSBjcmVhdGVkIG9yIHJlZ2lzdGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZVJlbW90ZUhvc3RWYWx2ZShTdHJpbmcgcGFyZW50KQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBDcmVhdGUgYSBuZXcgUmVtb3RlSG9zdFZhbHZlIGluc3RhbmNlCisgICAgICAgIFJlbW90ZUhvc3RWYWx2ZSB2YWx2ZSA9IG5ldyBSZW1vdGVIb3N0VmFsdmUoKTsKKworICAgICAgICAvLyBBZGQgdGhlIG5ldyBpbnN0YW5jZSB0byBpdHMgcGFyZW50IGNvbXBvbmVudAorICAgICAgICBPYmplY3ROYW1lIHBuYW1lID0gbmV3IE9iamVjdE5hbWUocGFyZW50KTsKKyAgICAgICAgQ29udGFpbmVyQmFzZSBjb250YWluZXJCYXNlID0gZ2V0UGFyZW50Q29udGFpbmVyRnJvbVBhcmVudChwbmFtZSk7CisgICAgICAgIGNvbnRhaW5lckJhc2UuYWRkVmFsdmUodmFsdmUpOworICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0gdmFsdmUuZ2V0T2JqZWN0TmFtZSgpOworICAgICAgICByZXR1cm4gKG9uYW1lLnRvU3RyaW5nKCkpOworICAgICAgICAKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBSZXF1ZXN0IER1bXBlciBWYWx2ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJlbnQgTUJlYW4gTmFtZSBvZiB0aGUgYXNzb2NpYXRlZCBwYXJlbnQgY29tcG9uZW50CisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBNQmVhbiBjYW5ub3QgYmUgY3JlYXRlZCBvciByZWdpc3RlcmVkCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBjcmVhdGVSZXF1ZXN0RHVtcGVyVmFsdmUoU3RyaW5nIHBhcmVudCkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IFJlcXVlc3REdW1wZXJWYWx2ZSBpbnN0YW5jZQorICAgICAgICBSZXF1ZXN0RHVtcGVyVmFsdmUgdmFsdmUgPSBuZXcgUmVxdWVzdER1bXBlclZhbHZlKCk7CisKKyAgICAgICAgLy8gQWRkIHRoZSBuZXcgaW5zdGFuY2UgdG8gaXRzIHBhcmVudCBjb21wb25lbnQKKyAgICAgICAgT2JqZWN0TmFtZSBwbmFtZSA9IG5ldyBPYmplY3ROYW1lKHBhcmVudCk7CisgICAgICAgIENvbnRhaW5lckJhc2UgY29udGFpbmVyQmFzZSA9IGdldFBhcmVudENvbnRhaW5lckZyb21QYXJlbnQocG5hbWUpOworICAgICAgICBjb250YWluZXJCYXNlLmFkZFZhbHZlKHZhbHZlKTsKKyAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9IHZhbHZlLmdldE9iamVjdE5hbWUoKTsKKyAgICAgICAgcmV0dXJuIChvbmFtZS50b1N0cmluZygpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IFNpbmdsZSBTaWduIE9uIFZhbHZlLgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmVudCBNQmVhbiBOYW1lIG9mIHRoZSBhc3NvY2lhdGVkIHBhcmVudCBjb21wb25lbnQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIE1CZWFuIGNhbm5vdCBiZSBjcmVhdGVkIG9yIHJlZ2lzdGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZVNpbmdsZVNpZ25PbihTdHJpbmcgcGFyZW50KQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBDcmVhdGUgYSBuZXcgU2luZ2xlU2lnbk9uIGluc3RhbmNlCisgICAgICAgIFNpbmdsZVNpZ25PbiB2YWx2ZSA9IG5ldyBTaW5nbGVTaWduT24oKTsKKworICAgICAgICAvLyBBZGQgdGhlIG5ldyBpbnN0YW5jZSB0byBpdHMgcGFyZW50IGNvbXBvbmVudAorICAgICAgICBPYmplY3ROYW1lIHBuYW1lID0gbmV3IE9iamVjdE5hbWUocGFyZW50KTsKKyAgICAgICAgQ29udGFpbmVyQmFzZSBjb250YWluZXJCYXNlID0gZ2V0UGFyZW50Q29udGFpbmVyRnJvbVBhcmVudChwbmFtZSk7CisgICAgICAgIGNvbnRhaW5lckJhc2UuYWRkVmFsdmUodmFsdmUpOworICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0gdmFsdmUuZ2V0T2JqZWN0TmFtZSgpOworICAgICAgICByZXR1cm4gKG9uYW1lLnRvU3RyaW5nKCkpOworCisgICAgfQorICAgIAorICAgIAorICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IFN0YW5kYXJkQ29udGV4dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJlbnQgTUJlYW4gTmFtZSBvZiB0aGUgYXNzb2NpYXRlZCBwYXJlbnQgY29tcG9uZW50CisgICAgICogQHBhcmFtIHBhdGggVGhlIGNvbnRleHQgcGF0aCBmb3IgdGhpcyBDb250ZXh0CisgICAgICogQHBhcmFtIGRvY0Jhc2UgRG9jdW1lbnQgYmFzZSBkaXJlY3RvcnkgKG9yIFdBUikgZm9yIHRoaXMgQ29udGV4dAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW4gTUJlYW4gY2Fubm90IGJlIGNyZWF0ZWQgb3IgcmVnaXN0ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlU3RhbmRhcmRDb250ZXh0KFN0cmluZyBwYXJlbnQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBkb2NCYXNlKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIC8vIFhYWCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4gUmVtb3ZlIGl0IG9uY2Ugc3VwcG9ydGVkIGJ5IHRoZSBhZG1pbgorICAgICAgICByZXR1cm4gCisgICAgICAgICAgICBjcmVhdGVTdGFuZGFyZENvbnRleHQocGFyZW50LHBhdGgsZG9jQmFzZSxmYWxzZSxmYWxzZSxmYWxzZSxmYWxzZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIH0KKworICAgIC8qKgorICAgICAqIEdpdmVuIGEgY29udGV4dCBwYXRoLCBnZXQgdGhlIGNvbmZpZyBmaWxlIG5hbWUuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0Q29uZmlnRmlsZShTdHJpbmcgcGF0aCkgeworICAgICAgICBTdHJpbmcgYmFzZW5hbWUgPSBudWxsOworICAgICAgICBpZiAocGF0aC5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICBiYXNlbmFtZSA9ICJST09UIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJhc2VuYW1lID0gcGF0aC5zdWJzdHJpbmcoMSkucmVwbGFjZSgnLycsICcjJyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChiYXNlbmFtZSk7CisgICAgfQorCisgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgU3RhbmRhcmRDb250ZXh0LgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmVudCBNQmVhbiBOYW1lIG9mIHRoZSBhc3NvY2lhdGVkIHBhcmVudCBjb21wb25lbnQKKyAgICAgKiBAcGFyYW0gcGF0aCBUaGUgY29udGV4dCBwYXRoIGZvciB0aGlzIENvbnRleHQKKyAgICAgKiBAcGFyYW0gZG9jQmFzZSBEb2N1bWVudCBiYXNlIGRpcmVjdG9yeSAob3IgV0FSKSBmb3IgdGhpcyBDb250ZXh0CisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBNQmVhbiBjYW5ub3QgYmUgY3JlYXRlZCBvciByZWdpc3RlcmVkCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBjcmVhdGVTdGFuZGFyZENvbnRleHQoU3RyaW5nIHBhcmVudCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRvY0Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB4bWxWYWxpZGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4geG1sTmFtZXNwYWNlQXdhcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB0bGRWYWxpZGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gdGxkTmFtZXNwYWNlQXdhcmUpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBTdGFuZGFyZENvbnRleHQgaW5zdGFuY2UKKyAgICAgICAgU3RhbmRhcmRDb250ZXh0IGNvbnRleHQgPSBuZXcgU3RhbmRhcmRDb250ZXh0KCk7CisgICAgICAgIHBhdGggPSBnZXRQYXRoU3RyKHBhdGgpOworICAgICAgICBjb250ZXh0LnNldFBhdGgocGF0aCk7CisgICAgICAgIGNvbnRleHQuc2V0RG9jQmFzZShkb2NCYXNlKTsKKyAgICAgICAgY29udGV4dC5zZXRYbWxWYWxpZGF0aW9uKHhtbFZhbGlkYXRpb24pOworICAgICAgICBjb250ZXh0LnNldFhtbE5hbWVzcGFjZUF3YXJlKHhtbE5hbWVzcGFjZUF3YXJlKTsKKyAgICAgICAgY29udGV4dC5zZXRUbGRWYWxpZGF0aW9uKHRsZFZhbGlkYXRpb24pOworICAgICAgICBjb250ZXh0LnNldFRsZE5hbWVzcGFjZUF3YXJlKHRsZE5hbWVzcGFjZUF3YXJlKTsKKyAgICAgICAgCisgICAgICAgIENvbnRleHRDb25maWcgY29udGV4dENvbmZpZyA9IG5ldyBDb250ZXh0Q29uZmlnKCk7CisgICAgICAgIGNvbnRleHQuYWRkTGlmZWN5Y2xlTGlzdGVuZXIoY29udGV4dENvbmZpZyk7CisKKyAgICAgICAgLy8gQWRkIHRoZSBuZXcgaW5zdGFuY2UgdG8gaXRzIHBhcmVudCBjb21wb25lbnQKKyAgICAgICAgT2JqZWN0TmFtZSBwbmFtZSA9IG5ldyBPYmplY3ROYW1lKHBhcmVudCk7CisgICAgICAgIE9iamVjdE5hbWUgZGVwbG95ZXIgPSBuZXcgT2JqZWN0TmFtZShwbmFtZS5nZXREb21haW4oKSsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI6dHlwZT1EZXBsb3llcixob3N0PSIrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbmFtZS5nZXRLZXlQcm9wZXJ0eSgiaG9zdCIpKTsKKyAgICAgICAgaWYobXNlcnZlci5pc1JlZ2lzdGVyZWQoZGVwbG95ZXIpKSB7CisgICAgICAgICAgICBTdHJpbmcgY29udGV4dFBhdGggPSBjb250ZXh0LmdldFBhdGgoKTsKKyAgICAgICAgICAgIG1zZXJ2ZXIuaW52b2tlKGRlcGxveWVyLCAiYWRkU2VydmljZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdCBbXSB7Y29udGV4dFBhdGh9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZyBbXSB7ImphdmEubGFuZy5TdHJpbmcifSk7CisgICAgICAgICAgICBTdHJpbmcgY29uZmlnUGF0aCA9IChTdHJpbmcpbXNlcnZlci5nZXRBdHRyaWJ1dGUoZGVwbG95ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbmZpZ0Jhc2VOYW1lIik7CisgICAgICAgICAgICBTdHJpbmcgYmFzZU5hbWUgPSBnZXRDb25maWdGaWxlKGNvbnRleHRQYXRoKTsKKyAgICAgICAgICAgIEZpbGUgY29uZmlnRmlsZSA9IG5ldyBGaWxlKG5ldyBGaWxlKGNvbmZpZ1BhdGgpLCBiYXNlTmFtZSsiLnhtbCIpOworICAgICAgICAgICAgY29udGV4dC5zZXRDb25maWdGaWxlKGNvbmZpZ0ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICAgICAgbXNlcnZlci5pbnZva2UoZGVwbG95ZXIsICJtYW5hZ2VBcHAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHtjb250ZXh0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7Im9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGV4dCJ9KTsKKyAgICAgICAgICAgIG1zZXJ2ZXIuaW52b2tlKGRlcGxveWVyLCAicmVtb3ZlU2VydmljZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdCBbXSB7Y29udGV4dFBhdGh9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZyBbXSB7ImphdmEubGFuZy5TdHJpbmcifSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsb2cud2FybigiRGVwbG95ZXIgbm90IGZvdW5kIGZvciAiK3BuYW1lLmdldEtleVByb3BlcnR5KCJob3N0IikpOworICAgICAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gZ2V0U2VydmljZShwbmFtZSk7CisgICAgICAgICAgICBFbmdpbmUgZW5naW5lID0gKEVuZ2luZSkgc2VydmljZS5nZXRDb250YWluZXIoKTsKKyAgICAgICAgICAgIEhvc3QgaG9zdCA9IChIb3N0KSBlbmdpbmUuZmluZENoaWxkKHBuYW1lLmdldEtleVByb3BlcnR5KCJob3N0IikpOworICAgICAgICAgICAgaG9zdC5hZGRDaGlsZChjb250ZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJldHVybiB0aGUgY29ycmVzcG9uZGluZyBNQmVhbiBuYW1lCisgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPSBjb250ZXh0LmdldEpteE5hbWUoKTsKKworICAgICAgICByZXR1cm4gKG9uYW1lLnRvU3RyaW5nKCkpOworCisgICAgfQorCisKKyAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBTdGFuZGFyZEVuZ2luZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJlbnQgTUJlYW4gTmFtZSBvZiB0aGUgYXNzb2NpYXRlZCBwYXJlbnQgY29tcG9uZW50CisgICAgICogQHBhcmFtIGVuZ2luZU5hbWUgVW5pcXVlIG5hbWUgb2YgdGhpcyBFbmdpbmUKKyAgICAgKiBAcGFyYW0gZGVmYXVsdEhvc3QgRGVmYXVsdCBob3N0bmFtZSBvZiB0aGlzIEVuZ2luZQorICAgICAqIEBwYXJhbSBzZXJ2aWNlTmFtZSBVbmlxdWUgbmFtZSBvZiB0aGlzIFNlcnZpY2UKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIE1CZWFuIGNhbm5vdCBiZSBjcmVhdGVkIG9yIHJlZ2lzdGVyZWQKKyAgICAgKi8KKworICAgIHB1YmxpYyBWZWN0b3IgY3JlYXRlU3RhbmRhcmRFbmdpbmVTZXJ2aWNlKFN0cmluZyBwYXJlbnQsIAorICAgICAgICAgICAgU3RyaW5nIGVuZ2luZU5hbWUsIFN0cmluZyBkZWZhdWx0SG9zdCwgU3RyaW5nIHNlcnZpY2VOYW1lKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBDcmVhdGUgYSBuZXcgU3RhbmRhcmRTZXJ2aWNlIGluc3RhbmNlCisgICAgICAgIFN0YW5kYXJkU2VydmljZSBzZXJ2aWNlID0gbmV3IFN0YW5kYXJkU2VydmljZSgpOworICAgICAgICBzZXJ2aWNlLnNldE5hbWUoc2VydmljZU5hbWUpOworICAgICAgICAvLyBDcmVhdGUgYSBuZXcgU3RhbmRhcmRFbmdpbmUgaW5zdGFuY2UKKyAgICAgICAgU3RhbmRhcmRFbmdpbmUgZW5naW5lID0gbmV3IFN0YW5kYXJkRW5naW5lKCk7CisgICAgICAgIGVuZ2luZS5zZXROYW1lKGVuZ2luZU5hbWUpOworICAgICAgICBlbmdpbmUuc2V0RGVmYXVsdEhvc3QoZGVmYXVsdEhvc3QpOworICAgICAgICAvLyBOZWVkIHRvIHNldCBlbmdpbmUgYmVmb3JlIGFkZGluZyBpdCB0byBzZXJ2ZXIgaW4gb3JkZXIgdG8gc2V0IGRvbWFpbgorICAgICAgICBzZXJ2aWNlLnNldENvbnRhaW5lcihlbmdpbmUpOworICAgICAgICAvLyBBZGQgdGhlIG5ldyBpbnN0YW5jZSB0byBpdHMgcGFyZW50IGNvbXBvbmVudAorICAgICAgICBTZXJ2ZXIgc2VydmVyID0gU2VydmVyRmFjdG9yeS5nZXRTZXJ2ZXIoKTsKKyAgICAgICAgc2VydmVyLmFkZFNlcnZpY2Uoc2VydmljZSk7CisgICAgICAgIFZlY3RvciBvbmFtZXMgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIC8vIEZJWE1FIHNlcnZpY2UgJiBlbmdpbmUuZ2V0T2JqZWN0TmFtZQorICAgICAgICAvL09iamVjdE5hbWUgb25hbWUgPSBlbmdpbmUuZ2V0T2JqZWN0TmFtZSgpOworICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0gCisgICAgICAgICAgICBNQmVhblV0aWxzLmNyZWF0ZU9iamVjdE5hbWUoZW5naW5lTmFtZSwgZW5naW5lKTsKKyAgICAgICAgb25hbWVzLmFkZCgwLCBvbmFtZSk7CisgICAgICAgIC8vb25hbWUgPSBzZXJ2aWNlLmdldE9iamVjdE5hbWUoKTsKKyAgICAgICAgb25hbWUgPSAKKyAgICAgICAgICAgIE1CZWFuVXRpbHMuY3JlYXRlT2JqZWN0TmFtZShlbmdpbmVOYW1lLCBzZXJ2aWNlKTsKKyAgICAgICAgb25hbWVzLmFkZCgxLCBvbmFtZSk7CisgICAgICAgIHJldHVybiAob25hbWVzKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IFN0YW5kYXJkSG9zdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJlbnQgTUJlYW4gTmFtZSBvZiB0aGUgYXNzb2NpYXRlZCBwYXJlbnQgY29tcG9uZW50CisgICAgICogQHBhcmFtIG5hbWUgVW5pcXVlIG5hbWUgb2YgdGhpcyBIb3N0CisgICAgICogQHBhcmFtIGFwcEJhc2UgQXBwbGljYXRpb24gYmFzZSBkaXJlY3RvcnkgbmFtZQorICAgICAqIEBwYXJhbSBhdXRvRGVwbG95IFNob3VsZCB3ZSBhdXRvIGRlcGxveT8KKyAgICAgKiBAcGFyYW0gZGVwbG95WE1MIFNob3VsZCB3ZSBkZXBsb3kgQ29udGV4dCBYTUwgY29uZmlnIGZpbGVzIHByb3BlcnR5PworICAgICAqIEBwYXJhbSBsaXZlRGVwbG95IFNob3VsZCB3ZSBsaXZlIGRlcGxveT8gICAgIAorICAgICAqIEBwYXJhbSB1bnBhY2tXQVJzIFNob3VsZCB3ZSB1bnBhY2sgV0FScyB3aGVuIGF1dG8gZGVwbG95aW5nPworICAgICAqIEBwYXJhbSB4bWxOYW1lc3BhY2VBd2FyZSBTaG91bGQgd2UgdHVybiBvbi9vZmYgWE1MIG5hbWVzcGFjZSBhd2FyZW5lc3M/CisgICAgICogQHBhcmFtIHhtbFZhbGlkYXRpb24gU2hvdWxkIHdlIHR1cm4gb24vb2ZmIFhNTCB2YWxpZGF0aW9uPyAgICAgICAgCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBNQmVhbiBjYW5ub3QgYmUgY3JlYXRlZCBvciByZWdpc3RlcmVkCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBjcmVhdGVTdGFuZGFyZEhvc3QoU3RyaW5nIHBhcmVudCwgU3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFwcEJhc2UsIGJvb2xlYW4gYXV0b0RlcGxveSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGRlcGxveVhNTCwgYm9vbGVhbiBsaXZlRGVwbG95LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB1bnBhY2tXQVJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4geG1sTmFtZXNwYWNlQXdhcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB4bWxWYWxpZGF0aW9uKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBDcmVhdGUgYSBuZXcgU3RhbmRhcmRIb3N0IGluc3RhbmNlCisgICAgICAgIFN0YW5kYXJkSG9zdCBob3N0ID0gbmV3IFN0YW5kYXJkSG9zdCgpOworICAgICAgICBob3N0LnNldE5hbWUobmFtZSk7CisgICAgICAgIGhvc3Quc2V0QXBwQmFzZShhcHBCYXNlKTsKKyAgICAgICAgaG9zdC5zZXRBdXRvRGVwbG95KGF1dG9EZXBsb3kpOworICAgICAgICBob3N0LnNldERlcGxveVhNTChkZXBsb3lYTUwpOworICAgICAgICBob3N0LnNldExpdmVEZXBsb3kobGl2ZURlcGxveSk7CisgICAgICAgIGhvc3Quc2V0VW5wYWNrV0FScyh1bnBhY2tXQVJzKTsKKyAgICAgICAgaG9zdC5zZXRYbWxOYW1lc3BhY2VBd2FyZSh4bWxOYW1lc3BhY2VBd2FyZSk7CisgICAgICAgIGhvc3Quc2V0WG1sVmFsaWRhdGlvbih4bWxWYWxpZGF0aW9uKTsKKwkKKyAgICAgICAgLy8gYWRkIEhvc3RDb25maWcgZm9yIGFjdGl2ZSByZWxvYWRpbmcKKyAgICAgICAgSG9zdENvbmZpZyBob3N0Q29uZmlnID0gbmV3IEhvc3RDb25maWcoKTsKKyAgICAgICAgaG9zdC5hZGRMaWZlY3ljbGVMaXN0ZW5lcihob3N0Q29uZmlnKTsKKworICAgICAgICAvLyBBZGQgdGhlIG5ldyBpbnN0YW5jZSB0byBpdHMgcGFyZW50IGNvbXBvbmVudAorICAgICAgICBPYmplY3ROYW1lIHBuYW1lID0gbmV3IE9iamVjdE5hbWUocGFyZW50KTsKKyAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gZ2V0U2VydmljZShwbmFtZSk7CisgICAgICAgIEVuZ2luZSBlbmdpbmUgPSAoRW5naW5lKSBzZXJ2aWNlLmdldENvbnRhaW5lcigpOworICAgICAgICBlbmdpbmUuYWRkQ2hpbGQoaG9zdCk7CisKKyAgICAgICAgLy8gUmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIE1CZWFuIG5hbWUKKyAgICAgICAgcmV0dXJuIChob3N0LmdldE9iamVjdE5hbWUoKS50b1N0cmluZygpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IFN0YW5kYXJkTWFuYWdlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJlbnQgTUJlYW4gTmFtZSBvZiB0aGUgYXNzb2NpYXRlZCBwYXJlbnQgY29tcG9uZW50CisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBNQmVhbiBjYW5ub3QgYmUgY3JlYXRlZCBvciByZWdpc3RlcmVkCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBjcmVhdGVTdGFuZGFyZE1hbmFnZXIoU3RyaW5nIHBhcmVudCkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IFN0YW5kYXJkTWFuYWdlciBpbnN0YW5jZQorICAgICAgICBTdGFuZGFyZE1hbmFnZXIgbWFuYWdlciA9IG5ldyBTdGFuZGFyZE1hbmFnZXIoKTsKKworICAgICAgICAvLyBBZGQgdGhlIG5ldyBpbnN0YW5jZSB0byBpdHMgcGFyZW50IGNvbXBvbmVudAorICAgICAgICBPYmplY3ROYW1lIHBuYW1lID0gbmV3IE9iamVjdE5hbWUocGFyZW50KTsKKyAgICAgICAgQ29udGFpbmVyQmFzZSBjb250YWluZXJCYXNlID0gZ2V0UGFyZW50Q29udGFpbmVyRnJvbVBhcmVudChwbmFtZSk7CisgICAgICAgIGlmIChjb250YWluZXJCYXNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNvbnRhaW5lckJhc2Uuc2V0TWFuYWdlcihtYW5hZ2VyKTsKKyAgICAgICAgfSAKKyAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9IG1hbmFnZXIuZ2V0T2JqZWN0TmFtZSgpOworICAgICAgICBpZiAob25hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIChvbmFtZS50b1N0cmluZygpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIAorICAgIH0KKworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IFN0YW5kYXJkU2VydmljZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJlbnQgTUJlYW4gTmFtZSBvZiB0aGUgYXNzb2NpYXRlZCBwYXJlbnQgY29tcG9uZW50CisgICAgICogQHBhcmFtIG5hbWUgVW5pcXVlIG5hbWUgb2YgdGhpcyBTdGFuZGFyZFNlcnZpY2UKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIE1CZWFuIGNhbm5vdCBiZSBjcmVhdGVkIG9yIHJlZ2lzdGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZVN0YW5kYXJkU2VydmljZShTdHJpbmcgcGFyZW50LCBTdHJpbmcgbmFtZSwgU3RyaW5nIGRvbWFpbikKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IFN0YW5kYXJkU2VydmljZSBpbnN0YW5jZQorICAgICAgICBTdGFuZGFyZFNlcnZpY2Ugc2VydmljZSA9IG5ldyBTdGFuZGFyZFNlcnZpY2UoKTsKKyAgICAgICAgc2VydmljZS5zZXROYW1lKG5hbWUpOworCisgICAgICAgIC8vIEFkZCB0aGUgbmV3IGluc3RhbmNlIHRvIGl0cyBwYXJlbnQgY29tcG9uZW50CisgICAgICAgIFNlcnZlciBzZXJ2ZXIgPSBTZXJ2ZXJGYWN0b3J5LmdldFNlcnZlcigpOworICAgICAgICBzZXJ2ZXIuYWRkU2VydmljZShzZXJ2aWNlKTsKKworICAgICAgICAvLyBSZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgTUJlYW4gbmFtZQorICAgICAgICByZXR1cm4gKHNlcnZpY2UuZ2V0T2JqZWN0TmFtZSgpLnRvU3RyaW5nKCkpOworCisgICAgfQorCisKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyAgVXNlckRhdGFiYXNlUmVhbG0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyZW50IE1CZWFuIE5hbWUgb2YgdGhlIGFzc29jaWF0ZWQgcGFyZW50IGNvbXBvbmVudAorICAgICAqIEBwYXJhbSByZXNvdXJjZU5hbWUgR2xvYmFsIEpOREkgcmVzb3VyY2UgbmFtZSBvZiB0aGUgYXNzb2NpYXRlZAorICAgICAqICBVc2VyRGF0YWJhc2UKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIE1CZWFuIGNhbm5vdCBiZSBjcmVhdGVkIG9yIHJlZ2lzdGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZVVzZXJEYXRhYmFzZVJlYWxtKFN0cmluZyBwYXJlbnQsIFN0cmluZyByZXNvdXJjZU5hbWUpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgVXNlckRhdGFiYXNlUmVhbG0gaW5zdGFuY2UKKyAgICAgICAgVXNlckRhdGFiYXNlUmVhbG0gcmVhbG0gPSBuZXcgVXNlckRhdGFiYXNlUmVhbG0oKTsKKyAgICAgICAgcmVhbG0uc2V0UmVzb3VyY2VOYW1lKHJlc291cmNlTmFtZSk7CisgICAgICAgIAorICAgICAgICAvLyBBZGQgdGhlIG5ldyBpbnN0YW5jZSB0byBpdHMgcGFyZW50IGNvbXBvbmVudAorICAgICAgICBPYmplY3ROYW1lIHBuYW1lID0gbmV3IE9iamVjdE5hbWUocGFyZW50KTsKKyAgICAgICAgQ29udGFpbmVyQmFzZSBjb250YWluZXJCYXNlID0gZ2V0UGFyZW50Q29udGFpbmVyRnJvbVBhcmVudChwbmFtZSk7CisgICAgICAgIC8vIEFkZCB0aGUgbmV3IGluc3RhbmNlIHRvIGl0cyBwYXJlbnQgY29tcG9uZW50CisgICAgICAgIGNvbnRhaW5lckJhc2Uuc2V0UmVhbG0ocmVhbG0pOworICAgICAgICAvLyBSZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgTUJlYW4gbmFtZQorICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0gcmVhbG0uZ2V0T2JqZWN0TmFtZSgpOworICAgICAgICAvLyBGSVhNRSBnZXRPYmplY3ROYW1lKCkgcmV0dXJucyBudWxsCisgICAgICAgIC8vT2JqZWN0TmFtZSBvbmFtZSA9IAorICAgICAgICAvLyAgICBNQmVhblV0aWxzLmNyZWF0ZU9iamVjdE5hbWUocG5hbWUuZ2V0RG9tYWluKCksIHJlYWxtKTsKKyAgICAgICAgaWYgKG9uYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiAob25hbWUudG9TdHJpbmcoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfSAgIAorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgV2ViIEFwcGxpY2F0aW9uIExvYWRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJlbnQgTUJlYW4gTmFtZSBvZiB0aGUgYXNzb2NpYXRlZCBwYXJlbnQgY29tcG9uZW50CisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBNQmVhbiBjYW5ub3QgYmUgY3JlYXRlZCBvciByZWdpc3RlcmVkCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBjcmVhdGVXZWJhcHBMb2FkZXIoU3RyaW5nIHBhcmVudCkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IFdlYmFwcExvYWRlciBpbnN0YW5jZQorICAgICAgICBXZWJhcHBMb2FkZXIgbG9hZGVyID0gbmV3IFdlYmFwcExvYWRlcigpOworCisgICAgICAgIC8vIEFkZCB0aGUgbmV3IGluc3RhbmNlIHRvIGl0cyBwYXJlbnQgY29tcG9uZW50CisgICAgICAgIE9iamVjdE5hbWUgcG5hbWUgPSBuZXcgT2JqZWN0TmFtZShwYXJlbnQpOworICAgICAgICBDb250YWluZXJCYXNlIGNvbnRhaW5lckJhc2UgPSBnZXRQYXJlbnRDb250YWluZXJGcm9tUGFyZW50KHBuYW1lKTsKKyAgICAgICAgaWYgKGNvbnRhaW5lckJhc2UgIT0gbnVsbCkgeworICAgICAgICAgICAgY29udGFpbmVyQmFzZS5zZXRMb2FkZXIobG9hZGVyKTsKKyAgICAgICAgfSAKKyAgICAgICAgLy8gRklYTUUgYWRkIExvYWRlci5nZXRPYmplY3ROYW1lCisgICAgICAgIC8vT2JqZWN0TmFtZSBvbmFtZSA9IGxvYWRlci5nZXRPYmplY3ROYW1lKCk7CisgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPSAKKyAgICAgICAgICAgIE1CZWFuVXRpbHMuY3JlYXRlT2JqZWN0TmFtZShwbmFtZS5nZXREb21haW4oKSwgbG9hZGVyKTsKKyAgICAgICAgcmV0dXJuIChvbmFtZS50b1N0cmluZygpKTsKKyAgICAgICAgCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYW4gZXhpc3RpbmcgQ29ubmVjdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTUJlYW4gTmFtZSBvZiB0aGUgY29tcG9uZW50IHRvIHJlbW92ZQorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYSBjb21wb25lbnQgY2Fubm90IGJlIHJlbW92ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVDb25uZWN0b3IoU3RyaW5nIG5hbWUpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIC8vIEFjcXVpcmUgYSByZWZlcmVuY2UgdG8gdGhlIGNvbXBvbmVudCB0byBiZSByZW1vdmVkCisgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPSBuZXcgT2JqZWN0TmFtZShuYW1lKTsKKyAgICAgICAgU2VydmVyIHNlcnZlciA9IFNlcnZlckZhY3RvcnkuZ2V0U2VydmVyKCk7CisgICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IGdldFNlcnZpY2Uob25hbWUpOworICAgICAgICBTdHJpbmcgcG9ydCA9IG9uYW1lLmdldEtleVByb3BlcnR5KCJwb3J0Iik7CisgICAgICAgIC8vU3RyaW5nIGFkZHJlc3MgPSBvbmFtZS5nZXRLZXlQcm9wZXJ0eSgiYWRkcmVzcyIpOworCisgICAgICAgIENvbm5lY3RvciBjb25uc1tdID0gKENvbm5lY3RvcltdKSBzZXJ2aWNlLmZpbmRDb25uZWN0b3JzKCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb25ucy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgU3RyaW5nIGNvbm5BZGRyZXNzID0gU3RyaW5nLnZhbHVlT2YoY29ubnNbaV0uZ2V0UHJvcGVydHkoImFkZHJlc3MiKSk7CisgICAgICAgICAgICBTdHJpbmcgY29ublBvcnQgPSAiIitjb25uc1tpXS5nZXRQb3J0KCk7CisKKyAgICAgICAgICAgIC8vIGlmICgoKGFkZHJlc3MuZXF1YWxzKCJudWxsIikpICYmCisgICAgICAgICAgICBpZiAoKGNvbm5BZGRyZXNzPT1udWxsKSAmJiBwb3J0LmVxdWFscyhjb25uUG9ydCkpIHsKKyAgICAgICAgICAgICAgICBzZXJ2aWNlLnJlbW92ZUNvbm5lY3Rvcihjb25uc1tpXSk7CisgICAgICAgICAgICAgICAgY29ubnNbaV0uZGVzdHJveSgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gfSBlbHNlIGlmIChhZGRyZXNzLmVxdWFscyhjb25uQWRkcmVzcykpCisgICAgICAgICAgICBpZiAocG9ydC5lcXVhbHMoY29ublBvcnQpKSB7CisgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHRoaXMgY29tcG9uZW50IGZyb20gaXRzIHBhcmVudCBjb21wb25lbnQKKyAgICAgICAgICAgICAgICBzZXJ2aWNlLnJlbW92ZUNvbm5lY3Rvcihjb25uc1tpXSk7CisgICAgICAgICAgICAgICAgY29ubnNbaV0uZGVzdHJveSgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhbiBleGlzdGluZyBDb250ZXh0LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHROYW1lIE1CZWFuIE5hbWUgb2YgdGhlIGNvbW9uZW50IHRvIHJlbW92ZQorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYSBjb21wb25lbnQgY2Fubm90IGJlIHJlbW92ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVDb250ZXh0KFN0cmluZyBjb250ZXh0TmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gQWNxdWlyZSBhIHJlZmVyZW5jZSB0byB0aGUgY29tcG9uZW50IHRvIGJlIHJlbW92ZWQKKyAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9IG5ldyBPYmplY3ROYW1lKGNvbnRleHROYW1lKTsKKyAgICAgICAgU3RyaW5nIGRvbWFpbiA9IG9uYW1lLmdldERvbWFpbigpOworICAgICAgICBTdGFuZGFyZFNlcnZpY2Ugc2VydmljZSA9IChTdGFuZGFyZFNlcnZpY2UpIGdldFNlcnZpY2Uob25hbWUpOworCisgICAgICAgIEVuZ2luZSBlbmdpbmUgPSAoRW5naW5lKSBzZXJ2aWNlLmdldENvbnRhaW5lcigpOworICAgICAgICBTdHJpbmcgbmFtZSA9IG9uYW1lLmdldEtleVByb3BlcnR5KCJuYW1lIik7CisgICAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZygyKTsKKyAgICAgICAgaW50IGkgPSBuYW1lLmluZGV4T2YoIi8iKTsKKyAgICAgICAgU3RyaW5nIGhvc3ROYW1lID0gbmFtZS5zdWJzdHJpbmcoMCxpKTsKKyAgICAgICAgU3RyaW5nIHBhdGggPSBuYW1lLnN1YnN0cmluZyhpKTsKKyAgICAgICAgT2JqZWN0TmFtZSBkZXBsb3llciA9IG5ldyBPYmplY3ROYW1lKGRvbWFpbisiOnR5cGU9RGVwbG95ZXIsaG9zdD0iKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdE5hbWUpOworICAgICAgICBTdHJpbmcgcGF0aFN0ciA9IGdldFBhdGhTdHIocGF0aCk7CisgICAgICAgIGlmKG1zZXJ2ZXIuaXNSZWdpc3RlcmVkKGRlcGxveWVyKSkgeworICAgICAgICAgICAgbXNlcnZlci5pbnZva2UoZGVwbG95ZXIsImFkZFNlcnZpY2VkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXXtwYXRoU3RyfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7ImphdmEubGFuZy5TdHJpbmcifSk7CisgICAgICAgICAgICBtc2VydmVyLmludm9rZShkZXBsb3llciwidW5tYW5hZ2VBcHAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHtwYXRoU3RyfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7ImphdmEubGFuZy5TdHJpbmcifSk7CisgICAgICAgICAgICBtc2VydmVyLmludm9rZShkZXBsb3llciwicmVtb3ZlU2VydmljZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHtwYXRoU3RyfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7ImphdmEubGFuZy5TdHJpbmcifSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsb2cud2FybigiRGVwbG95ZXIgbm90IGZvdW5kIGZvciAiK2hvc3ROYW1lKTsKKyAgICAgICAgICAgIEhvc3QgaG9zdCA9IChIb3N0KSBlbmdpbmUuZmluZENoaWxkKGhvc3ROYW1lKTsKKyAgICAgICAgICAgIENvbnRleHQgY29udGV4dCA9IChDb250ZXh0KSBob3N0LmZpbmRDaGlsZChwYXRoU3RyKTsKKyAgICAgICAgICAgIC8vIFJlbW92ZSB0aGlzIGNvbXBvbmVudCBmcm9tIGl0cyBwYXJlbnQgY29tcG9uZW50CisgICAgICAgICAgICBob3N0LnJlbW92ZUNoaWxkKGNvbnRleHQpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhbiBleGlzdGluZyBIb3N0LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTUJlYW4gTmFtZSBvZiB0aGUgY29tb25lbnQgdG8gcmVtb3ZlCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhIGNvbXBvbmVudCBjYW5ub3QgYmUgcmVtb3ZlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUhvc3QoU3RyaW5nIG5hbWUpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIC8vIEFjcXVpcmUgYSByZWZlcmVuY2UgdG8gdGhlIGNvbXBvbmVudCB0byBiZSByZW1vdmVkCisgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPSBuZXcgT2JqZWN0TmFtZShuYW1lKTsKKyAgICAgICAgU3RyaW5nIGhvc3ROYW1lID0gb25hbWUuZ2V0S2V5UHJvcGVydHkoImhvc3QiKTsKKyAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gZ2V0U2VydmljZShvbmFtZSk7CisgICAgICAgIEVuZ2luZSBlbmdpbmUgPSAoRW5naW5lKSBzZXJ2aWNlLmdldENvbnRhaW5lcigpOworICAgICAgICBIb3N0IGhvc3QgPSAoSG9zdCkgZW5naW5lLmZpbmRDaGlsZChob3N0TmFtZSk7CisKKyAgICAgICAgLy8gUmVtb3ZlIHRoaXMgY29tcG9uZW50IGZyb20gaXRzIHBhcmVudCBjb21wb25lbnQKKyAgICAgICAgZW5naW5lLnJlbW92ZUNoaWxkKGhvc3QpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYW4gZXhpc3RpbmcgTG9hZGVyLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTUJlYW4gTmFtZSBvZiB0aGUgY29tb25lbnQgdG8gcmVtb3ZlCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhIGNvbXBvbmVudCBjYW5ub3QgYmUgcmVtb3ZlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUxvYWRlcihTdHJpbmcgbmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9IG5ldyBPYmplY3ROYW1lKG5hbWUpOworICAgICAgICAvLyBBY3F1aXJlIGEgcmVmZXJlbmNlIHRvIHRoZSBjb21wb25lbnQgdG8gYmUgcmVtb3ZlZAorICAgICAgICBDb250YWluZXJCYXNlIGNvbnRhaW5lciA9IGdldFBhcmVudENvbnRhaW5lckZyb21DaGlsZChvbmFtZSk7ICAgIAorICAgICAgICBjb250YWluZXIuc2V0TG9hZGVyKG51bGwpOworICAgICAgICAKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhbiBleGlzdGluZyBNYW5hZ2VyLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTUJlYW4gTmFtZSBvZiB0aGUgY29tb25lbnQgdG8gcmVtb3ZlCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhIGNvbXBvbmVudCBjYW5ub3QgYmUgcmVtb3ZlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZU1hbmFnZXIoU3RyaW5nIG5hbWUpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPSBuZXcgT2JqZWN0TmFtZShuYW1lKTsKKyAgICAgICAgLy8gQWNxdWlyZSBhIHJlZmVyZW5jZSB0byB0aGUgY29tcG9uZW50IHRvIGJlIHJlbW92ZWQKKyAgICAgICAgQ29udGFpbmVyQmFzZSBjb250YWluZXIgPSBnZXRQYXJlbnRDb250YWluZXJGcm9tQ2hpbGQob25hbWUpOyAgICAKKyAgICAgICAgY29udGFpbmVyLnNldE1hbmFnZXIobnVsbCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhbiBleGlzdGluZyBSZWFsbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE1CZWFuIE5hbWUgb2YgdGhlIGNvbW9uZW50IHRvIHJlbW92ZQorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYSBjb21wb25lbnQgY2Fubm90IGJlIHJlbW92ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVSZWFsbShTdHJpbmcgbmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9IG5ldyBPYmplY3ROYW1lKG5hbWUpOworICAgICAgICAvLyBBY3F1aXJlIGEgcmVmZXJlbmNlIHRvIHRoZSBjb21wb25lbnQgdG8gYmUgcmVtb3ZlZAorICAgICAgICBDb250YWluZXJCYXNlIGNvbnRhaW5lciA9IGdldFBhcmVudENvbnRhaW5lckZyb21DaGlsZChvbmFtZSk7IAorICAgICAgICBjb250YWluZXIuc2V0UmVhbG0obnVsbCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYW4gZXhpc3RpbmcgU2VydmljZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE1CZWFuIE5hbWUgb2YgdGhlIGNvbXBvbmVudCB0byByZW1vdmUKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGEgY29tcG9uZW50IGNhbm5vdCBiZSByZW1vdmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlU2VydmljZShTdHJpbmcgbmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gQWNxdWlyZSBhIHJlZmVyZW5jZSB0byB0aGUgY29tcG9uZW50IHRvIGJlIHJlbW92ZWQKKyAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9IG5ldyBPYmplY3ROYW1lKG5hbWUpOworICAgICAgICBTdHJpbmcgc2VydmljZU5hbWUgPSBvbmFtZS5nZXRLZXlQcm9wZXJ0eSgic2VydmljZU5hbWUiKTsKKyAgICAgICAgU2VydmVyIHNlcnZlciA9IFNlcnZlckZhY3RvcnkuZ2V0U2VydmVyKCk7CisgICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IHNlcnZlci5maW5kU2VydmljZShzZXJ2aWNlTmFtZSk7CisKKyAgICAgICAgLy8gUmVtb3ZlIHRoaXMgY29tcG9uZW50IGZyb20gaXRzIHBhcmVudCBjb21wb25lbnQKKyAgICAgICAgc2VydmVyLnJlbW92ZVNlcnZpY2Uoc2VydmljZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhbiBleGlzdGluZyBWYWx2ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE1CZWFuIE5hbWUgb2YgdGhlIGNvbW9uZW50IHRvIHJlbW92ZQorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYSBjb21wb25lbnQgY2Fubm90IGJlIHJlbW92ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVWYWx2ZShTdHJpbmcgbmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gQWNxdWlyZSBhIHJlZmVyZW5jZSB0byB0aGUgY29tcG9uZW50IHRvIGJlIHJlbW92ZWQKKyAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9IG5ldyBPYmplY3ROYW1lKG5hbWUpOworICAgICAgICBDb250YWluZXJCYXNlIGNvbnRhaW5lciA9IGdldFBhcmVudENvbnRhaW5lckZyb21DaGlsZChvbmFtZSk7CisgICAgICAgIFN0cmluZyBzZXF1ZW5jZSA9IG9uYW1lLmdldEtleVByb3BlcnR5KCJzZXEiKTsKKyAgICAgICAgVmFsdmVbXSB2YWx2ZXMgPSAoVmFsdmVbXSljb250YWluZXIuZ2V0VmFsdmVzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsdmVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBPYmplY3ROYW1lIHZvbmFtZSA9ICgoVmFsdmVCYXNlKSB2YWx2ZXNbaV0pLmdldE9iamVjdE5hbWUoKTsKKyAgICAgICAgICAgIGlmICh2b25hbWUuZXF1YWxzKG9uYW1lKSkgeworICAgICAgICAgICAgICAgIGNvbnRhaW5lci5yZW1vdmVWYWx2ZSh2YWx2ZXNbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCit9CisKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9tYmVhbnMvTUJlYW5VdGlscy5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL21iZWFucy9NQmVhblV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y0Y2RmNQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9tYmVhbnMvTUJlYW5VdGlscy5qYXZhCkBAIC0wLDAgKzEsMjE3MSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEubWJlYW5zOworCisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKKworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuQXR0cmlidXRlOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5FeGNlcHRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1hbGZvcm1lZE9iamVjdE5hbWVFeGNlcHRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQubW9kZWxtYmVhbi5Nb2RlbE1CZWFuOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Db250YWluZWQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Db250YWluZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Db250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuRW5naW5lOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuR3JvdXA7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Ib3N0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTG9hZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlJlYWxtOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuUm9sZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlNlcnZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlNlcnZpY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Vc2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuVXNlckRhdGFiYXNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuVmFsdmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuQ29ubmVjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkNvbnRleHRFbnZpcm9ubWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5Db250ZXh0UmVzb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuQ29udGV4dFJlc291cmNlTGluazsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5OYW1pbmdSZXNvdXJjZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS52YWx2ZXMuVmFsdmVCYXNlOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5tb2RlbGVyLk1hbmFnZWRCZWFuOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5tb2RlbGVyLlJlZ2lzdHJ5OworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuSW50cm9zcGVjdGlvblV0aWxzOworCisKKy8qKgorICogUHVibGljIHV0aWxpdHkgbWV0aG9kcyBpbiBzdXBwb3J0IG9mIHRoZSBzZXJ2ZXIgc2lkZSBNQmVhbnMgaW1wbGVtZW50YXRpb24uCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAYXV0aG9yIEFteSBSb2gKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIE1CZWFuVXRpbHMgeworICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhNQmVhblV0aWxzLmNsYXNzKTsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU3RhdGljIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc2V0IG9mIGV4Y2VwdGlvbnMgdG8gdGhlIG5vcm1hbCBydWxlcyB1c2VkIGJ5CisgICAgICogPGNvZGU+Y3JlYXRlTWFuYWdlZEJlYW4oKTwvY29kZT4uICBUaGUgZmlyc3QgZWxlbWVudCBvZiBlYWNoIHBhaXIKKyAgICAgKiBpcyBhIGNsYXNzIG5hbWUsIGFuZCB0aGUgc2Vjb25kIGVsZW1lbnQgaXMgdGhlIG1hbmFnZWQgYmVhbiBuYW1lLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBleGNlcHRpb25zW11bXSA9IHsKKyAgICAgICAgeyAib3JnLmFwYWNoZS5hanAudG9tY2F0NC5BanAxM0Nvbm5lY3RvciIsCisgICAgICAgICAgIkFqcDEzQ29ubmVjdG9yIiB9LAorICAgICAgICB7ICJvcmcuYXBhY2hlLmNveW90ZS50b21jYXQ0LkFqcDEzQ29ubmVjdG9yIiwKKyAgICAgICAgICAiQ295b3RlQ29ubmVjdG9yIiB9LAorICAgICAgICB7ICJvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmREZWZhdWx0Q29udGV4dCIsCisgICAgICAgICAgIkRlZmF1bHRDb250ZXh0IiB9LAorICAgICAgICB7ICJvcmcuYXBhY2hlLmNhdGFsaW5hLnVzZXJzLkpEQkNHcm91cCIsCisgICAgICAgICAgIkdyb3VwIiB9LAorICAgICAgICB7ICJvcmcuYXBhY2hlLmNhdGFsaW5hLnVzZXJzLkpEQkNSb2xlIiwKKyAgICAgICAgICAiUm9sZSIgfSwKKyAgICAgICAgeyAib3JnLmFwYWNoZS5jYXRhbGluYS51c2Vycy5KREJDVXNlciIsCisgICAgICAgICAgIlVzZXIiIH0sCisgICAgICAgIHsgIm9yZy5hcGFjaGUuY2F0YWxpbmEudXNlcnMuTWVtb3J5R3JvdXAiLAorICAgICAgICAgICJHcm91cCIgfSwKKyAgICAgICAgeyAib3JnLmFwYWNoZS5jYXRhbGluYS51c2Vycy5NZW1vcnlSb2xlIiwKKyAgICAgICAgICAiUm9sZSIgfSwKKyAgICAgICAgeyAib3JnLmFwYWNoZS5jYXRhbGluYS51c2Vycy5NZW1vcnlVc2VyIiwKKyAgICAgICAgICAiVXNlciIgfSwKKyAgICB9OworCisKKyAgICAvKioKKyAgICAgKiBUaGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiByZWdpc3RyeSBmb3Igb3VyIG1hbmFnZWQgYmVhbnMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgUmVnaXN0cnkgcmVnaXN0cnkgPSBjcmVhdGVSZWdpc3RyeSgpOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgPGNvZGU+TUJlYW5TZXJ2ZXI8L2NvZGU+IGZvciB0aGlzIGFwcGxpY2F0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIE1CZWFuU2VydmVyIG1zZXJ2ZXIgPSBjcmVhdGVTZXJ2ZXIoKTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFN0YXRpYyBNZXRob2RzCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW5kIHJldHVybiB0aGUgbmFtZSBvZiB0aGUgPGNvZGU+TWFuYWdlZEJlYW48L2NvZGU+IHRoYXQKKyAgICAgKiBjb3JyZXNwb25kcyB0byB0aGlzIENhdGFsaW5hIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb21wb25lbnQgVGhlIGNvbXBvbmVudCBmb3Igd2hpY2ggdG8gY3JlYXRlIGEgbmFtZQorICAgICAqLworICAgIHN0YXRpYyBTdHJpbmcgY3JlYXRlTWFuYWdlZE5hbWUoT2JqZWN0IGNvbXBvbmVudCkgeworCisgICAgICAgIC8vIERlYWwgd2l0aCBleGNlcHRpb25zIHRvIHRoZSBzdGFuZGFyZCBydWxlCisgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBjb21wb25lbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhjZXB0aW9ucy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKGNsYXNzTmFtZS5lcXVhbHMoZXhjZXB0aW9uc1tpXVswXSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGV4Y2VwdGlvbnNbaV1bMV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gUGVyZm9ybSB0aGUgc3RhbmRhcmQgdHJhbnNmb3JtYXRpb24KKyAgICAgICAgaW50IHBlcmlvZCA9IGNsYXNzTmFtZS5sYXN0SW5kZXhPZignLicpOworICAgICAgICBpZiAocGVyaW9kID49IDApCisgICAgICAgICAgICBjbGFzc05hbWUgPSBjbGFzc05hbWUuc3Vic3RyaW5nKHBlcmlvZCArIDEpOworICAgICAgICByZXR1cm4gKGNsYXNzTmFtZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENyZWF0ZSwgcmVnaXN0ZXIsIGFuZCByZXR1cm4gYW4gTUJlYW4gZm9yIHRoaXMKKyAgICAgKiA8Y29kZT5Db25uZWN0b3I8L2NvZGU+IG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0b3IgVGhlIENvbm5lY3RvciB0byBiZSBtYW5hZ2VkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBNQmVhbiBjYW5ub3QgYmUgY3JlYXRlZCBvciByZWdpc3RlcmVkCisgICAgICovCisgICAgc3RhdGljIE1vZGVsTUJlYW4gY3JlYXRlTUJlYW4oQ29ubmVjdG9yIGNvbm5lY3RvcikKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgU3RyaW5nIG1uYW1lID0gY3JlYXRlTWFuYWdlZE5hbWUoY29ubmVjdG9yKTsKKyAgICAgICAgTWFuYWdlZEJlYW4gbWFuYWdlZCA9IHJlZ2lzdHJ5LmZpbmRNYW5hZ2VkQmVhbihtbmFtZSk7CisgICAgICAgIGlmIChtYW5hZ2VkID09IG51bGwpIHsKKyAgICAgICAgICAgIEV4Y2VwdGlvbiBlID0gbmV3IEV4Y2VwdGlvbigiTWFuYWdlZEJlYW4gaXMgbm90IGZvdW5kIHdpdGggIittbmFtZSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgTUJlYW5FeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIGRvbWFpbiA9IG1hbmFnZWQuZ2V0RG9tYWluKCk7CisgICAgICAgIGlmIChkb21haW4gPT0gbnVsbCkKKyAgICAgICAgICAgIGRvbWFpbiA9IG1zZXJ2ZXIuZ2V0RGVmYXVsdERvbWFpbigpOworICAgICAgICBNb2RlbE1CZWFuIG1iZWFuID0gbWFuYWdlZC5jcmVhdGVNQmVhbihjb25uZWN0b3IpOworICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0gY3JlYXRlT2JqZWN0TmFtZShkb21haW4sIGNvbm5lY3Rvcik7CisgICAgICAgIGlmKCBtc2VydmVyLmlzUmVnaXN0ZXJlZCggb25hbWUgKSkgIHsKKyAgICAgICAgICAgIG1zZXJ2ZXIudW5yZWdpc3Rlck1CZWFuKG9uYW1lKTsKKyAgICAgICAgfQorICAgICAgICBtc2VydmVyLnJlZ2lzdGVyTUJlYW4obWJlYW4sIG9uYW1lKTsKKyAgICAgICAgcmV0dXJuIChtYmVhbik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENyZWF0ZSwgcmVnaXN0ZXIsIGFuZCByZXR1cm4gYW4gTUJlYW4gZm9yIHRoaXMKKyAgICAgKiA8Y29kZT5Db250ZXh0PC9jb2RlPiBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgQ29udGV4dCB0byBiZSBtYW5hZ2VkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBNQmVhbiBjYW5ub3QgYmUgY3JlYXRlZCBvciByZWdpc3RlcmVkCisgICAgICovCisgICAgc3RhdGljIE1vZGVsTUJlYW4gY3JlYXRlTUJlYW4oQ29udGV4dCBjb250ZXh0KQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBTdHJpbmcgbW5hbWUgPSBjcmVhdGVNYW5hZ2VkTmFtZShjb250ZXh0KTsKKyAgICAgICAgTWFuYWdlZEJlYW4gbWFuYWdlZCA9IHJlZ2lzdHJ5LmZpbmRNYW5hZ2VkQmVhbihtbmFtZSk7CisgICAgICAgIGlmIChtYW5hZ2VkID09IG51bGwpIHsKKyAgICAgICAgICAgIEV4Y2VwdGlvbiBlID0gbmV3IEV4Y2VwdGlvbigiTWFuYWdlZEJlYW4gaXMgbm90IGZvdW5kIHdpdGggIittbmFtZSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgTUJlYW5FeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIGRvbWFpbiA9IG1hbmFnZWQuZ2V0RG9tYWluKCk7CisgICAgICAgIGlmIChkb21haW4gPT0gbnVsbCkKKyAgICAgICAgICAgIGRvbWFpbiA9IG1zZXJ2ZXIuZ2V0RGVmYXVsdERvbWFpbigpOworICAgICAgICBNb2RlbE1CZWFuIG1iZWFuID0gbWFuYWdlZC5jcmVhdGVNQmVhbihjb250ZXh0KTsKKyAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9IGNyZWF0ZU9iamVjdE5hbWUoZG9tYWluLCBjb250ZXh0KTsKKyAgICAgICAgaWYoIG1zZXJ2ZXIuaXNSZWdpc3RlcmVkKG9uYW1lKSkgeworICAgICAgICAgICAgbG9nLmRlYnVnKCJBbHJlYWR5IHJlZ2lzdGVyZWQgIiArIG9uYW1lKTsKKyAgICAgICAgICAgIG1zZXJ2ZXIudW5yZWdpc3Rlck1CZWFuKG9uYW1lKTsKKyAgICAgICAgfQorICAgICAgICBtc2VydmVyLnJlZ2lzdGVyTUJlYW4obWJlYW4sIG9uYW1lKTsKKyAgICAgICAgcmV0dXJuIChtYmVhbik7CisKKyAgICB9CisKKyAgICAKKyAgICAvKioKKyAgICAgKiBDcmVhdGUsIHJlZ2lzdGVyLCBhbmQgcmV0dXJuIGFuIE1CZWFuIGZvciB0aGlzCisgICAgICogPGNvZGU+Q29udGV4dEVudmlyb25tZW50PC9jb2RlPiBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZW52aXJvbm1lbnQgVGhlIENvbnRleHRFbnZpcm9ubWVudCB0byBiZSBtYW5hZ2VkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBNQmVhbiBjYW5ub3QgYmUgY3JlYXRlZCBvciByZWdpc3RlcmVkCisgICAgICovCisgICAgc3RhdGljIE1vZGVsTUJlYW4gY3JlYXRlTUJlYW4oQ29udGV4dEVudmlyb25tZW50IGVudmlyb25tZW50KQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBTdHJpbmcgbW5hbWUgPSBjcmVhdGVNYW5hZ2VkTmFtZShlbnZpcm9ubWVudCk7CisgICAgICAgIE1hbmFnZWRCZWFuIG1hbmFnZWQgPSByZWdpc3RyeS5maW5kTWFuYWdlZEJlYW4obW5hbWUpOworICAgICAgICBpZiAobWFuYWdlZCA9PSBudWxsKSB7CisgICAgICAgICAgICBFeGNlcHRpb24gZSA9IG5ldyBFeGNlcHRpb24oIk1hbmFnZWRCZWFuIGlzIG5vdCBmb3VuZCB3aXRoICIrbW5hbWUpOworICAgICAgICAgICAgdGhyb3cgbmV3IE1CZWFuRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBkb21haW4gPSBtYW5hZ2VkLmdldERvbWFpbigpOworICAgICAgICBpZiAoZG9tYWluID09IG51bGwpCisgICAgICAgICAgICBkb21haW4gPSBtc2VydmVyLmdldERlZmF1bHREb21haW4oKTsKKyAgICAgICAgTW9kZWxNQmVhbiBtYmVhbiA9IG1hbmFnZWQuY3JlYXRlTUJlYW4oZW52aXJvbm1lbnQpOworICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0gY3JlYXRlT2JqZWN0TmFtZShkb21haW4sIGVudmlyb25tZW50KTsKKyAgICAgICAgaWYoIG1zZXJ2ZXIuaXNSZWdpc3RlcmVkKCBvbmFtZSApKSAgeworICAgICAgICAgICAgbXNlcnZlci51bnJlZ2lzdGVyTUJlYW4ob25hbWUpOworICAgICAgICB9CisgICAgICAgIG1zZXJ2ZXIucmVnaXN0ZXJNQmVhbihtYmVhbiwgb25hbWUpOworICAgICAgICByZXR1cm4gKG1iZWFuKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ3JlYXRlLCByZWdpc3RlciwgYW5kIHJldHVybiBhbiBNQmVhbiBmb3IgdGhpcworICAgICAqIDxjb2RlPkNvbnRleHRSZXNvdXJjZTwvY29kZT4gb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIHJlc291cmNlIFRoZSBDb250ZXh0UmVzb3VyY2UgdG8gYmUgbWFuYWdlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW4gTUJlYW4gY2Fubm90IGJlIGNyZWF0ZWQgb3IgcmVnaXN0ZXJlZAorICAgICAqLworICAgIHN0YXRpYyBNb2RlbE1CZWFuIGNyZWF0ZU1CZWFuKENvbnRleHRSZXNvdXJjZSByZXNvdXJjZSkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgU3RyaW5nIG1uYW1lID0gY3JlYXRlTWFuYWdlZE5hbWUocmVzb3VyY2UpOworICAgICAgICBNYW5hZ2VkQmVhbiBtYW5hZ2VkID0gcmVnaXN0cnkuZmluZE1hbmFnZWRCZWFuKG1uYW1lKTsKKyAgICAgICAgaWYgKG1hbmFnZWQgPT0gbnVsbCkgeworICAgICAgICAgICAgRXhjZXB0aW9uIGUgPSBuZXcgRXhjZXB0aW9uKCJNYW5hZ2VkQmVhbiBpcyBub3QgZm91bmQgd2l0aCAiK21uYW1lKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBNQmVhbkV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgZG9tYWluID0gbWFuYWdlZC5nZXREb21haW4oKTsKKyAgICAgICAgaWYgKGRvbWFpbiA9PSBudWxsKQorICAgICAgICAgICAgZG9tYWluID0gbXNlcnZlci5nZXREZWZhdWx0RG9tYWluKCk7CisgICAgICAgIE1vZGVsTUJlYW4gbWJlYW4gPSBtYW5hZ2VkLmNyZWF0ZU1CZWFuKHJlc291cmNlKTsKKyAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9IGNyZWF0ZU9iamVjdE5hbWUoZG9tYWluLCByZXNvdXJjZSk7CisgICAgICAgIGlmKCBtc2VydmVyLmlzUmVnaXN0ZXJlZCggb25hbWUgKSkgIHsKKyAgICAgICAgICAgIG1zZXJ2ZXIudW5yZWdpc3Rlck1CZWFuKG9uYW1lKTsKKyAgICAgICAgfQorICAgICAgICBtc2VydmVyLnJlZ2lzdGVyTUJlYW4obWJlYW4sIG9uYW1lKTsKKyAgICAgICAgcmV0dXJuIChtYmVhbik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENyZWF0ZSwgcmVnaXN0ZXIsIGFuZCByZXR1cm4gYW4gTUJlYW4gZm9yIHRoaXMKKyAgICAgKiA8Y29kZT5Db250ZXh0UmVzb3VyY2VMaW5rPC9jb2RlPiBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VMaW5rIFRoZSBDb250ZXh0UmVzb3VyY2VMaW5rIHRvIGJlIG1hbmFnZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIE1CZWFuIGNhbm5vdCBiZSBjcmVhdGVkIG9yIHJlZ2lzdGVyZWQKKyAgICAgKi8KKyAgICBzdGF0aWMgTW9kZWxNQmVhbiBjcmVhdGVNQmVhbihDb250ZXh0UmVzb3VyY2VMaW5rIHJlc291cmNlTGluaykKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgU3RyaW5nIG1uYW1lID0gY3JlYXRlTWFuYWdlZE5hbWUocmVzb3VyY2VMaW5rKTsKKyAgICAgICAgTWFuYWdlZEJlYW4gbWFuYWdlZCA9IHJlZ2lzdHJ5LmZpbmRNYW5hZ2VkQmVhbihtbmFtZSk7CisgICAgICAgIGlmIChtYW5hZ2VkID09IG51bGwpIHsKKyAgICAgICAgICAgIEV4Y2VwdGlvbiBlID0gbmV3IEV4Y2VwdGlvbigiTWFuYWdlZEJlYW4gaXMgbm90IGZvdW5kIHdpdGggIittbmFtZSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgTUJlYW5FeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIGRvbWFpbiA9IG1hbmFnZWQuZ2V0RG9tYWluKCk7CisgICAgICAgIGlmIChkb21haW4gPT0gbnVsbCkKKyAgICAgICAgICAgIGRvbWFpbiA9IG1zZXJ2ZXIuZ2V0RGVmYXVsdERvbWFpbigpOworICAgICAgICBNb2RlbE1CZWFuIG1iZWFuID0gbWFuYWdlZC5jcmVhdGVNQmVhbihyZXNvdXJjZUxpbmspOworICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0gY3JlYXRlT2JqZWN0TmFtZShkb21haW4sIHJlc291cmNlTGluayk7CisgICAgICAgIGlmKCBtc2VydmVyLmlzUmVnaXN0ZXJlZCggb25hbWUgKSkgIHsKKyAgICAgICAgICAgIG1zZXJ2ZXIudW5yZWdpc3Rlck1CZWFuKG9uYW1lKTsKKyAgICAgICAgfQorICAgICAgICBtc2VydmVyLnJlZ2lzdGVyTUJlYW4obWJlYW4sIG9uYW1lKTsKKyAgICAgICAgcmV0dXJuIChtYmVhbik7CisKKyAgICB9ICAgIAorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIENyZWF0ZSwgcmVnaXN0ZXIsIGFuZCByZXR1cm4gYW4gTUJlYW4gZm9yIHRoaXMKKyAgICAgKiA8Y29kZT5EZWZhdWx0Q29udGV4dDwvY29kZT4gb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIERlZmF1bHRDb250ZXh0IHRvIGJlIG1hbmFnZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIE1CZWFuIGNhbm5vdCBiZSBjcmVhdGVkIG9yIHJlZ2lzdGVyZWQKKyAgICAgKi8KKyAgICAvLyBGSVhNRQorICAgIC8qCisgICAgc3RhdGljIE1vZGVsTUJlYW4gY3JlYXRlTUJlYW4oRGVmYXVsdENvbnRleHQgY29udGV4dCkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgU3RyaW5nIG1uYW1lID0gY3JlYXRlTWFuYWdlZE5hbWUoY29udGV4dCk7CisgICAgICAgIE1hbmFnZWRCZWFuIG1hbmFnZWQgPSByZWdpc3RyeS5maW5kTWFuYWdlZEJlYW4obW5hbWUpOworICAgICAgICBpZiAobWFuYWdlZCA9PSBudWxsKSB7CisgICAgICAgICAgICBFeGNlcHRpb24gZSA9IG5ldyBFeGNlcHRpb24oIk1hbmFnZWRCZWFuIGlzIG5vdCBmb3VuZCB3aXRoICIrbW5hbWUpOworICAgICAgICAgICAgdGhyb3cgbmV3IE1CZWFuRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBkb21haW4gPSBtYW5hZ2VkLmdldERvbWFpbigpOworICAgICAgICBpZiAoZG9tYWluID09IG51bGwpCisgICAgICAgICAgICBkb21haW4gPSBtc2VydmVyLmdldERlZmF1bHREb21haW4oKTsKKyAgICAgICAgTW9kZWxNQmVhbiBtYmVhbiA9IG1hbmFnZWQuY3JlYXRlTUJlYW4oY29udGV4dCk7CisgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPSBjcmVhdGVPYmplY3ROYW1lKGRvbWFpbiwgY29udGV4dCk7CisgICAgICAgIGlmKCBtc2VydmVyLmlzUmVnaXN0ZXJlZCggb25hbWUgKSkgIHsKKyAgICAgICAgICAgIG1zZXJ2ZXIudW5yZWdpc3Rlck1CZWFuKG9uYW1lKTsKKyAgICAgICAgfQorICAgICAgICBtc2VydmVyLnJlZ2lzdGVyTUJlYW4obWJlYW4sIG9uYW1lKTsKKyAgICAgICAgcmV0dXJuIChtYmVhbik7CisKKyAgICB9CisgICAgKi8KKworCisgICAgLyoqCisgICAgICogQ3JlYXRlLCByZWdpc3RlciwgYW5kIHJldHVybiBhbiBNQmVhbiBmb3IgdGhpcworICAgICAqIDxjb2RlPkVuZ2luZTwvY29kZT4gb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIGVuZ2luZSBUaGUgRW5naW5lIHRvIGJlIG1hbmFnZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIE1CZWFuIGNhbm5vdCBiZSBjcmVhdGVkIG9yIHJlZ2lzdGVyZWQKKyAgICAgKi8KKyAgICBzdGF0aWMgTW9kZWxNQmVhbiBjcmVhdGVNQmVhbihFbmdpbmUgZW5naW5lKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBTdHJpbmcgbW5hbWUgPSBjcmVhdGVNYW5hZ2VkTmFtZShlbmdpbmUpOworICAgICAgICBNYW5hZ2VkQmVhbiBtYW5hZ2VkID0gcmVnaXN0cnkuZmluZE1hbmFnZWRCZWFuKG1uYW1lKTsKKyAgICAgICAgaWYgKG1hbmFnZWQgPT0gbnVsbCkgeworICAgICAgICAgICAgRXhjZXB0aW9uIGUgPSBuZXcgRXhjZXB0aW9uKCJNYW5hZ2VkQmVhbiBpcyBub3QgZm91bmQgd2l0aCAiK21uYW1lKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBNQmVhbkV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgZG9tYWluID0gbWFuYWdlZC5nZXREb21haW4oKTsKKyAgICAgICAgaWYgKGRvbWFpbiA9PSBudWxsKQorICAgICAgICAgICAgZG9tYWluID0gbXNlcnZlci5nZXREZWZhdWx0RG9tYWluKCk7CisgICAgICAgIE1vZGVsTUJlYW4gbWJlYW4gPSBtYW5hZ2VkLmNyZWF0ZU1CZWFuKGVuZ2luZSk7CisgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPSBjcmVhdGVPYmplY3ROYW1lKGRvbWFpbiwgZW5naW5lKTsKKyAgICAgICAgaWYoIG1zZXJ2ZXIuaXNSZWdpc3RlcmVkKCBvbmFtZSApKSAgeworICAgICAgICAgICAgbXNlcnZlci51bnJlZ2lzdGVyTUJlYW4ob25hbWUpOworICAgICAgICB9CisgICAgICAgIG1zZXJ2ZXIucmVnaXN0ZXJNQmVhbihtYmVhbiwgb25hbWUpOworICAgICAgICByZXR1cm4gKG1iZWFuKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ3JlYXRlLCByZWdpc3RlciwgYW5kIHJldHVybiBhbiBNQmVhbiBmb3IgdGhpcworICAgICAqIDxjb2RlPkdyb3VwPC9jb2RlPiBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZ3JvdXAgVGhlIEdyb3VwIHRvIGJlIG1hbmFnZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIE1CZWFuIGNhbm5vdCBiZSBjcmVhdGVkIG9yIHJlZ2lzdGVyZWQKKyAgICAgKi8KKyAgICBzdGF0aWMgTW9kZWxNQmVhbiBjcmVhdGVNQmVhbihHcm91cCBncm91cCkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgU3RyaW5nIG1uYW1lID0gY3JlYXRlTWFuYWdlZE5hbWUoZ3JvdXApOworICAgICAgICBNYW5hZ2VkQmVhbiBtYW5hZ2VkID0gcmVnaXN0cnkuZmluZE1hbmFnZWRCZWFuKG1uYW1lKTsKKyAgICAgICAgaWYgKG1hbmFnZWQgPT0gbnVsbCkgeworICAgICAgICAgICAgRXhjZXB0aW9uIGUgPSBuZXcgRXhjZXB0aW9uKCJNYW5hZ2VkQmVhbiBpcyBub3QgZm91bmQgd2l0aCAiK21uYW1lKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBNQmVhbkV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgZG9tYWluID0gbWFuYWdlZC5nZXREb21haW4oKTsKKyAgICAgICAgaWYgKGRvbWFpbiA9PSBudWxsKQorICAgICAgICAgICAgZG9tYWluID0gbXNlcnZlci5nZXREZWZhdWx0RG9tYWluKCk7CisgICAgICAgIE1vZGVsTUJlYW4gbWJlYW4gPSBtYW5hZ2VkLmNyZWF0ZU1CZWFuKGdyb3VwKTsKKyAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9IGNyZWF0ZU9iamVjdE5hbWUoZG9tYWluLCBncm91cCk7CisgICAgICAgIGlmKCBtc2VydmVyLmlzUmVnaXN0ZXJlZCggb25hbWUgKSkgIHsKKyAgICAgICAgICAgIG1zZXJ2ZXIudW5yZWdpc3Rlck1CZWFuKG9uYW1lKTsKKyAgICAgICAgfQorICAgICAgICBtc2VydmVyLnJlZ2lzdGVyTUJlYW4obWJlYW4sIG9uYW1lKTsKKyAgICAgICAgcmV0dXJuIChtYmVhbik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENyZWF0ZSwgcmVnaXN0ZXIsIGFuZCByZXR1cm4gYW4gTUJlYW4gZm9yIHRoaXMKKyAgICAgKiA8Y29kZT5Ib3N0PC9jb2RlPiBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaG9zdCBUaGUgSG9zdCB0byBiZSBtYW5hZ2VkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBNQmVhbiBjYW5ub3QgYmUgY3JlYXRlZCBvciByZWdpc3RlcmVkCisgICAgICovCisgICAgc3RhdGljIE1vZGVsTUJlYW4gY3JlYXRlTUJlYW4oSG9zdCBob3N0KQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBTdHJpbmcgbW5hbWUgPSBjcmVhdGVNYW5hZ2VkTmFtZShob3N0KTsKKyAgICAgICAgTWFuYWdlZEJlYW4gbWFuYWdlZCA9IHJlZ2lzdHJ5LmZpbmRNYW5hZ2VkQmVhbihtbmFtZSk7CisgICAgICAgIGlmIChtYW5hZ2VkID09IG51bGwpIHsKKyAgICAgICAgICAgIEV4Y2VwdGlvbiBlID0gbmV3IEV4Y2VwdGlvbigiTWFuYWdlZEJlYW4gaXMgbm90IGZvdW5kIHdpdGggIittbmFtZSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgTUJlYW5FeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIGRvbWFpbiA9IG1hbmFnZWQuZ2V0RG9tYWluKCk7CisgICAgICAgIGlmIChkb21haW4gPT0gbnVsbCkKKyAgICAgICAgICAgIGRvbWFpbiA9IG1zZXJ2ZXIuZ2V0RGVmYXVsdERvbWFpbigpOworICAgICAgICBNb2RlbE1CZWFuIG1iZWFuID0gbWFuYWdlZC5jcmVhdGVNQmVhbihob3N0KTsKKyAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9IGNyZWF0ZU9iamVjdE5hbWUoZG9tYWluLCBob3N0KTsKKyAgICAgICAgaWYoIG1zZXJ2ZXIuaXNSZWdpc3RlcmVkKCBvbmFtZSApKSAgeworICAgICAgICAgICAgbXNlcnZlci51bnJlZ2lzdGVyTUJlYW4ob25hbWUpOworICAgICAgICB9CisgICAgICAgIG1zZXJ2ZXIucmVnaXN0ZXJNQmVhbihtYmVhbiwgb25hbWUpOworICAgICAgICByZXR1cm4gKG1iZWFuKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ3JlYXRlLCByZWdpc3RlciwgYW5kIHJldHVybiBhbiBNQmVhbiBmb3IgdGhpcworICAgICAqIDxjb2RlPkxvYWRlcjwvY29kZT4gb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIGxvYWRlciBUaGUgTG9hZGVyIHRvIGJlIG1hbmFnZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIE1CZWFuIGNhbm5vdCBiZSBjcmVhdGVkIG9yIHJlZ2lzdGVyZWQKKyAgICAgKi8KKyAgICBzdGF0aWMgTW9kZWxNQmVhbiBjcmVhdGVNQmVhbihMb2FkZXIgbG9hZGVyKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBTdHJpbmcgbW5hbWUgPSBjcmVhdGVNYW5hZ2VkTmFtZShsb2FkZXIpOworICAgICAgICBNYW5hZ2VkQmVhbiBtYW5hZ2VkID0gcmVnaXN0cnkuZmluZE1hbmFnZWRCZWFuKG1uYW1lKTsKKyAgICAgICAgaWYgKG1hbmFnZWQgPT0gbnVsbCkgeworICAgICAgICAgICAgRXhjZXB0aW9uIGUgPSBuZXcgRXhjZXB0aW9uKCJNYW5hZ2VkQmVhbiBpcyBub3QgZm91bmQgd2l0aCAiK21uYW1lKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBNQmVhbkV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgZG9tYWluID0gbWFuYWdlZC5nZXREb21haW4oKTsKKyAgICAgICAgaWYgKGRvbWFpbiA9PSBudWxsKQorICAgICAgICAgICAgZG9tYWluID0gbXNlcnZlci5nZXREZWZhdWx0RG9tYWluKCk7CisgICAgICAgIE1vZGVsTUJlYW4gbWJlYW4gPSBtYW5hZ2VkLmNyZWF0ZU1CZWFuKGxvYWRlcik7CisgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPSBjcmVhdGVPYmplY3ROYW1lKGRvbWFpbiwgbG9hZGVyKTsKKyAgICAgICAgaWYoIG1zZXJ2ZXIuaXNSZWdpc3RlcmVkKCBvbmFtZSApKSAgeworICAgICAgICAgICAgLy8gc2lkZSBlZmZlY3Q6IHN0b3AgaXQKKyAgICAgICAgICAgIG1zZXJ2ZXIudW5yZWdpc3Rlck1CZWFuKCBvbmFtZSApOworICAgICAgICB9CisgICAgICAgIG1zZXJ2ZXIucmVnaXN0ZXJNQmVhbihtYmVhbiwgb25hbWUpOworICAgICAgICByZXR1cm4gKG1iZWFuKTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSwgcmVnaXN0ZXIsIGFuZCByZXR1cm4gYW4gTUJlYW4gZm9yIHRoaXMKKyAgICAgKiA8Y29kZT5NYW5hZ2VyPC9jb2RlPiBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFuYWdlciBUaGUgTWFuYWdlciB0byBiZSBtYW5hZ2VkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBNQmVhbiBjYW5ub3QgYmUgY3JlYXRlZCBvciByZWdpc3RlcmVkCisgICAgICovCisgICAgc3RhdGljIE1vZGVsTUJlYW4gY3JlYXRlTUJlYW4oTWFuYWdlciBtYW5hZ2VyKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBTdHJpbmcgbW5hbWUgPSBjcmVhdGVNYW5hZ2VkTmFtZShtYW5hZ2VyKTsKKyAgICAgICAgTWFuYWdlZEJlYW4gbWFuYWdlZCA9IHJlZ2lzdHJ5LmZpbmRNYW5hZ2VkQmVhbihtbmFtZSk7CisgICAgICAgIGlmIChtYW5hZ2VkID09IG51bGwpIHsKKyAgICAgICAgICAgIEV4Y2VwdGlvbiBlID0gbmV3IEV4Y2VwdGlvbigiTWFuYWdlZEJlYW4gaXMgbm90IGZvdW5kIHdpdGggIittbmFtZSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgTUJlYW5FeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIGRvbWFpbiA9IG1hbmFnZWQuZ2V0RG9tYWluKCk7CisgICAgICAgIGlmIChkb21haW4gPT0gbnVsbCkKKyAgICAgICAgICAgIGRvbWFpbiA9IG1zZXJ2ZXIuZ2V0RGVmYXVsdERvbWFpbigpOworICAgICAgICBNb2RlbE1CZWFuIG1iZWFuID0gbWFuYWdlZC5jcmVhdGVNQmVhbihtYW5hZ2VyKTsKKyAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9IGNyZWF0ZU9iamVjdE5hbWUoZG9tYWluLCBtYW5hZ2VyKTsKKyAgICAgICAgaWYoIG1zZXJ2ZXIuaXNSZWdpc3RlcmVkKCBvbmFtZSApKSAgeworICAgICAgICAgICAgbXNlcnZlci51bnJlZ2lzdGVyTUJlYW4ob25hbWUpOworICAgICAgICB9CisgICAgICAgIG1zZXJ2ZXIucmVnaXN0ZXJNQmVhbihtYmVhbiwgb25hbWUpOworICAgICAgICByZXR1cm4gKG1iZWFuKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ3JlYXRlLCByZWdpc3RlciwgYW5kIHJldHVybiBhbiBNQmVhbiBmb3IgdGhpcworICAgICAqIDxjb2RlPk1CZWFuRmFjdG9yeTwvY29kZT4gb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIGZhY3RvcnkgVGhlIE1CZWFuRmFjdG9yeSB0byBiZSBtYW5hZ2VkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBNQmVhbiBjYW5ub3QgYmUgY3JlYXRlZCBvciByZWdpc3RlcmVkCisgICAgICovCisgICAgc3RhdGljIE1vZGVsTUJlYW4gY3JlYXRlTUJlYW4oTUJlYW5GYWN0b3J5IGZhY3RvcnkpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIFN0cmluZyBtbmFtZSA9IGNyZWF0ZU1hbmFnZWROYW1lKGZhY3RvcnkpOworICAgICAgICBNYW5hZ2VkQmVhbiBtYW5hZ2VkID0gcmVnaXN0cnkuZmluZE1hbmFnZWRCZWFuKG1uYW1lKTsKKyAgICAgICAgaWYgKG1hbmFnZWQgPT0gbnVsbCkgeworICAgICAgICAgICAgRXhjZXB0aW9uIGUgPSBuZXcgRXhjZXB0aW9uKCJNYW5hZ2VkQmVhbiBpcyBub3QgZm91bmQgd2l0aCAiK21uYW1lKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBNQmVhbkV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgZG9tYWluID0gbWFuYWdlZC5nZXREb21haW4oKTsKKyAgICAgICAgaWYgKGRvbWFpbiA9PSBudWxsKQorICAgICAgICAgICAgZG9tYWluID0gbXNlcnZlci5nZXREZWZhdWx0RG9tYWluKCk7CisgICAgICAgIE1vZGVsTUJlYW4gbWJlYW4gPSBtYW5hZ2VkLmNyZWF0ZU1CZWFuKGZhY3RvcnkpOworICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0gY3JlYXRlT2JqZWN0TmFtZShkb21haW4sIGZhY3RvcnkpOworICAgICAgICBpZiggbXNlcnZlci5pc1JlZ2lzdGVyZWQob25hbWUgKSkgeworICAgICAgICAgICAgbXNlcnZlci51bnJlZ2lzdGVyTUJlYW4ob25hbWUpOworICAgICAgICB9CisgICAgICAgIG1zZXJ2ZXIucmVnaXN0ZXJNQmVhbihtYmVhbiwgb25hbWUpOworICAgICAgICByZXR1cm4gKG1iZWFuKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ3JlYXRlLCByZWdpc3RlciwgYW5kIHJldHVybiBhbiBNQmVhbiBmb3IgdGhpcworICAgICAqIDxjb2RlPk5hbWluZ1Jlc291cmNlczwvY29kZT4gb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIHJlc291cmNlIFRoZSBOYW1pbmdSZXNvdXJjZXMgdG8gYmUgbWFuYWdlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW4gTUJlYW4gY2Fubm90IGJlIGNyZWF0ZWQgb3IgcmVnaXN0ZXJlZAorICAgICAqLworICAgIHN0YXRpYyBNb2RlbE1CZWFuIGNyZWF0ZU1CZWFuKE5hbWluZ1Jlc291cmNlcyByZXNvdXJjZSkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgU3RyaW5nIG1uYW1lID0gY3JlYXRlTWFuYWdlZE5hbWUocmVzb3VyY2UpOworICAgICAgICBNYW5hZ2VkQmVhbiBtYW5hZ2VkID0gcmVnaXN0cnkuZmluZE1hbmFnZWRCZWFuKG1uYW1lKTsKKyAgICAgICAgaWYgKG1hbmFnZWQgPT0gbnVsbCkgeworICAgICAgICAgICAgRXhjZXB0aW9uIGUgPSBuZXcgRXhjZXB0aW9uKCJNYW5hZ2VkQmVhbiBpcyBub3QgZm91bmQgd2l0aCAiK21uYW1lKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBNQmVhbkV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgZG9tYWluID0gbWFuYWdlZC5nZXREb21haW4oKTsKKyAgICAgICAgaWYgKGRvbWFpbiA9PSBudWxsKQorICAgICAgICAgICAgZG9tYWluID0gbXNlcnZlci5nZXREZWZhdWx0RG9tYWluKCk7CisgICAgICAgIE1vZGVsTUJlYW4gbWJlYW4gPSBtYW5hZ2VkLmNyZWF0ZU1CZWFuKHJlc291cmNlKTsKKyAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9IGNyZWF0ZU9iamVjdE5hbWUoZG9tYWluLCByZXNvdXJjZSk7CisgICAgICAgIGlmKCBtc2VydmVyLmlzUmVnaXN0ZXJlZCggb25hbWUgKSkgIHsKKyAgICAgICAgICAgIG1zZXJ2ZXIudW5yZWdpc3Rlck1CZWFuKG9uYW1lKTsKKyAgICAgICAgfQorICAgICAgICBtc2VydmVyLnJlZ2lzdGVyTUJlYW4obWJlYW4sIG9uYW1lKTsKKyAgICAgICAgcmV0dXJuIChtYmVhbik7CisKKyAgICB9CisKKyAgICAKKyAgICAvKioKKyAgICAgKiBDcmVhdGUsIHJlZ2lzdGVyLCBhbmQgcmV0dXJuIGFuIE1CZWFuIGZvciB0aGlzCisgICAgICogPGNvZGU+UmVhbG08L2NvZGU+IG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWFsbSBUaGUgUmVhbG0gdG8gYmUgbWFuYWdlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW4gTUJlYW4gY2Fubm90IGJlIGNyZWF0ZWQgb3IgcmVnaXN0ZXJlZAorICAgICAqLworICAgIHN0YXRpYyBNb2RlbE1CZWFuIGNyZWF0ZU1CZWFuKFJlYWxtIHJlYWxtKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBTdHJpbmcgbW5hbWUgPSBjcmVhdGVNYW5hZ2VkTmFtZShyZWFsbSk7CisgICAgICAgIE1hbmFnZWRCZWFuIG1hbmFnZWQgPSByZWdpc3RyeS5maW5kTWFuYWdlZEJlYW4obW5hbWUpOworICAgICAgICBpZiAobWFuYWdlZCA9PSBudWxsKSB7CisgICAgICAgICAgICBFeGNlcHRpb24gZSA9IG5ldyBFeGNlcHRpb24oIk1hbmFnZWRCZWFuIGlzIG5vdCBmb3VuZCB3aXRoICIrbW5hbWUpOworICAgICAgICAgICAgdGhyb3cgbmV3IE1CZWFuRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBkb21haW4gPSBtYW5hZ2VkLmdldERvbWFpbigpOworICAgICAgICBpZiAoZG9tYWluID09IG51bGwpCisgICAgICAgICAgICBkb21haW4gPSBtc2VydmVyLmdldERlZmF1bHREb21haW4oKTsKKyAgICAgICAgTW9kZWxNQmVhbiBtYmVhbiA9IG1hbmFnZWQuY3JlYXRlTUJlYW4ocmVhbG0pOworICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0gY3JlYXRlT2JqZWN0TmFtZShkb21haW4sIHJlYWxtKTsKKyAgICAgICAgaWYoIG1zZXJ2ZXIuaXNSZWdpc3RlcmVkKCBvbmFtZSApKSAgeworICAgICAgICAgICAgbXNlcnZlci51bnJlZ2lzdGVyTUJlYW4ob25hbWUpOworICAgICAgICB9CisgICAgICAgIG1zZXJ2ZXIucmVnaXN0ZXJNQmVhbihtYmVhbiwgb25hbWUpOworICAgICAgICByZXR1cm4gKG1iZWFuKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ3JlYXRlLCByZWdpc3RlciwgYW5kIHJldHVybiBhbiBNQmVhbiBmb3IgdGhpcworICAgICAqIDxjb2RlPlJvbGU8L2NvZGU+IG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByb2xlIFRoZSBSb2xlIHRvIGJlIG1hbmFnZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIE1CZWFuIGNhbm5vdCBiZSBjcmVhdGVkIG9yIHJlZ2lzdGVyZWQKKyAgICAgKi8KKyAgICBzdGF0aWMgTW9kZWxNQmVhbiBjcmVhdGVNQmVhbihSb2xlIHJvbGUpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIFN0cmluZyBtbmFtZSA9IGNyZWF0ZU1hbmFnZWROYW1lKHJvbGUpOworICAgICAgICBNYW5hZ2VkQmVhbiBtYW5hZ2VkID0gcmVnaXN0cnkuZmluZE1hbmFnZWRCZWFuKG1uYW1lKTsKKyAgICAgICAgaWYgKG1hbmFnZWQgPT0gbnVsbCkgeworICAgICAgICAgICAgRXhjZXB0aW9uIGUgPSBuZXcgRXhjZXB0aW9uKCJNYW5hZ2VkQmVhbiBpcyBub3QgZm91bmQgd2l0aCAiK21uYW1lKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBNQmVhbkV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgZG9tYWluID0gbWFuYWdlZC5nZXREb21haW4oKTsKKyAgICAgICAgaWYgKGRvbWFpbiA9PSBudWxsKQorICAgICAgICAgICAgZG9tYWluID0gbXNlcnZlci5nZXREZWZhdWx0RG9tYWluKCk7CisgICAgICAgIE1vZGVsTUJlYW4gbWJlYW4gPSBtYW5hZ2VkLmNyZWF0ZU1CZWFuKHJvbGUpOworICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0gY3JlYXRlT2JqZWN0TmFtZShkb21haW4sIHJvbGUpOworICAgICAgICBpZiggbXNlcnZlci5pc1JlZ2lzdGVyZWQoIG9uYW1lICkpICB7CisgICAgICAgICAgICBtc2VydmVyLnVucmVnaXN0ZXJNQmVhbihvbmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgbXNlcnZlci5yZWdpc3Rlck1CZWFuKG1iZWFuLCBvbmFtZSk7CisgICAgICAgIHJldHVybiAobWJlYW4pOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUsIHJlZ2lzdGVyLCBhbmQgcmV0dXJuIGFuIE1CZWFuIGZvciB0aGlzCisgICAgICogPGNvZGU+U2VydmVyPC9jb2RlPiBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VydmVyIFRoZSBTZXJ2ZXIgdG8gYmUgbWFuYWdlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW4gTUJlYW4gY2Fubm90IGJlIGNyZWF0ZWQgb3IgcmVnaXN0ZXJlZAorICAgICAqLworICAgIHN0YXRpYyBNb2RlbE1CZWFuIGNyZWF0ZU1CZWFuKFNlcnZlciBzZXJ2ZXIpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIFN0cmluZyBtbmFtZSA9IGNyZWF0ZU1hbmFnZWROYW1lKHNlcnZlcik7CisgICAgICAgIE1hbmFnZWRCZWFuIG1hbmFnZWQgPSByZWdpc3RyeS5maW5kTWFuYWdlZEJlYW4obW5hbWUpOworICAgICAgICBpZiAobWFuYWdlZCA9PSBudWxsKSB7CisgICAgICAgICAgICBFeGNlcHRpb24gZSA9IG5ldyBFeGNlcHRpb24oIk1hbmFnZWRCZWFuIGlzIG5vdCBmb3VuZCB3aXRoICIrbW5hbWUpOworICAgICAgICAgICAgdGhyb3cgbmV3IE1CZWFuRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBkb21haW4gPSBtYW5hZ2VkLmdldERvbWFpbigpOworICAgICAgICBpZiAoZG9tYWluID09IG51bGwpCisgICAgICAgICAgICBkb21haW4gPSBtc2VydmVyLmdldERlZmF1bHREb21haW4oKTsKKyAgICAgICAgTW9kZWxNQmVhbiBtYmVhbiA9IG1hbmFnZWQuY3JlYXRlTUJlYW4oc2VydmVyKTsKKyAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9IGNyZWF0ZU9iamVjdE5hbWUoZG9tYWluLCBzZXJ2ZXIpOworICAgICAgICBpZiggbXNlcnZlci5pc1JlZ2lzdGVyZWQoIG9uYW1lICkpICB7CisgICAgICAgICAgICBtc2VydmVyLnVucmVnaXN0ZXJNQmVhbihvbmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgbXNlcnZlci5yZWdpc3Rlck1CZWFuKG1iZWFuLCBvbmFtZSk7CisgICAgICAgIHJldHVybiAobWJlYW4pOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUsIHJlZ2lzdGVyLCBhbmQgcmV0dXJuIGFuIE1CZWFuIGZvciB0aGlzCisgICAgICogPGNvZGU+U2VydmljZTwvY29kZT4gb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIHNlcnZpY2UgVGhlIFNlcnZpY2UgdG8gYmUgbWFuYWdlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW4gTUJlYW4gY2Fubm90IGJlIGNyZWF0ZWQgb3IgcmVnaXN0ZXJlZAorICAgICAqLworICAgIHN0YXRpYyBNb2RlbE1CZWFuIGNyZWF0ZU1CZWFuKFNlcnZpY2Ugc2VydmljZSkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgU3RyaW5nIG1uYW1lID0gY3JlYXRlTWFuYWdlZE5hbWUoc2VydmljZSk7CisgICAgICAgIE1hbmFnZWRCZWFuIG1hbmFnZWQgPSByZWdpc3RyeS5maW5kTWFuYWdlZEJlYW4obW5hbWUpOworICAgICAgICBpZiAobWFuYWdlZCA9PSBudWxsKSB7CisgICAgICAgICAgICBFeGNlcHRpb24gZSA9IG5ldyBFeGNlcHRpb24oIk1hbmFnZWRCZWFuIGlzIG5vdCBmb3VuZCB3aXRoICIrbW5hbWUpOworICAgICAgICAgICAgdGhyb3cgbmV3IE1CZWFuRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBkb21haW4gPSBtYW5hZ2VkLmdldERvbWFpbigpOworICAgICAgICBpZiAoZG9tYWluID09IG51bGwpCisgICAgICAgICAgICBkb21haW4gPSBtc2VydmVyLmdldERlZmF1bHREb21haW4oKTsKKyAgICAgICAgTW9kZWxNQmVhbiBtYmVhbiA9IG1hbmFnZWQuY3JlYXRlTUJlYW4oc2VydmljZSk7CisgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPSBjcmVhdGVPYmplY3ROYW1lKGRvbWFpbiwgc2VydmljZSk7CisgICAgICAgIGlmKCBtc2VydmVyLmlzUmVnaXN0ZXJlZCggb25hbWUgKSkgIHsKKyAgICAgICAgICAgIG1zZXJ2ZXIudW5yZWdpc3Rlck1CZWFuKG9uYW1lKTsKKyAgICAgICAgfQorICAgICAgICBtc2VydmVyLnJlZ2lzdGVyTUJlYW4obWJlYW4sIG9uYW1lKTsKKyAgICAgICAgcmV0dXJuIChtYmVhbik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENyZWF0ZSwgcmVnaXN0ZXIsIGFuZCByZXR1cm4gYW4gTUJlYW4gZm9yIHRoaXMKKyAgICAgKiA8Y29kZT5Vc2VyPC9jb2RlPiBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXNlciBUaGUgVXNlciB0byBiZSBtYW5hZ2VkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBNQmVhbiBjYW5ub3QgYmUgY3JlYXRlZCBvciByZWdpc3RlcmVkCisgICAgICovCisgICAgc3RhdGljIE1vZGVsTUJlYW4gY3JlYXRlTUJlYW4oVXNlciB1c2VyKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBTdHJpbmcgbW5hbWUgPSBjcmVhdGVNYW5hZ2VkTmFtZSh1c2VyKTsKKyAgICAgICAgTWFuYWdlZEJlYW4gbWFuYWdlZCA9IHJlZ2lzdHJ5LmZpbmRNYW5hZ2VkQmVhbihtbmFtZSk7CisgICAgICAgIGlmIChtYW5hZ2VkID09IG51bGwpIHsKKyAgICAgICAgICAgIEV4Y2VwdGlvbiBlID0gbmV3IEV4Y2VwdGlvbigiTWFuYWdlZEJlYW4gaXMgbm90IGZvdW5kIHdpdGggIittbmFtZSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgTUJlYW5FeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIGRvbWFpbiA9IG1hbmFnZWQuZ2V0RG9tYWluKCk7CisgICAgICAgIGlmIChkb21haW4gPT0gbnVsbCkKKyAgICAgICAgICAgIGRvbWFpbiA9IG1zZXJ2ZXIuZ2V0RGVmYXVsdERvbWFpbigpOworICAgICAgICBNb2RlbE1CZWFuIG1iZWFuID0gbWFuYWdlZC5jcmVhdGVNQmVhbih1c2VyKTsKKyAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9IGNyZWF0ZU9iamVjdE5hbWUoZG9tYWluLCB1c2VyKTsKKyAgICAgICAgaWYoIG1zZXJ2ZXIuaXNSZWdpc3RlcmVkKCBvbmFtZSApKSAgeworICAgICAgICAgICAgbXNlcnZlci51bnJlZ2lzdGVyTUJlYW4ob25hbWUpOworICAgICAgICB9CisgICAgICAgIG1zZXJ2ZXIucmVnaXN0ZXJNQmVhbihtYmVhbiwgb25hbWUpOworICAgICAgICByZXR1cm4gKG1iZWFuKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ3JlYXRlLCByZWdpc3RlciwgYW5kIHJldHVybiBhbiBNQmVhbiBmb3IgdGhpcworICAgICAqIDxjb2RlPlVzZXJEYXRhYmFzZTwvY29kZT4gb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIHVzZXJEYXRhYmFzZSBUaGUgVXNlckRhdGFiYXNlIHRvIGJlIG1hbmFnZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIE1CZWFuIGNhbm5vdCBiZSBjcmVhdGVkIG9yIHJlZ2lzdGVyZWQKKyAgICAgKi8KKyAgICBzdGF0aWMgTW9kZWxNQmVhbiBjcmVhdGVNQmVhbihVc2VyRGF0YWJhc2UgdXNlckRhdGFiYXNlKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBTdHJpbmcgbW5hbWUgPSBjcmVhdGVNYW5hZ2VkTmFtZSh1c2VyRGF0YWJhc2UpOworICAgICAgICBNYW5hZ2VkQmVhbiBtYW5hZ2VkID0gcmVnaXN0cnkuZmluZE1hbmFnZWRCZWFuKG1uYW1lKTsKKyAgICAgICAgaWYgKG1hbmFnZWQgPT0gbnVsbCkgeworICAgICAgICAgICAgRXhjZXB0aW9uIGUgPSBuZXcgRXhjZXB0aW9uKCJNYW5hZ2VkQmVhbiBpcyBub3QgZm91bmQgd2l0aCAiK21uYW1lKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBNQmVhbkV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgZG9tYWluID0gbWFuYWdlZC5nZXREb21haW4oKTsKKyAgICAgICAgaWYgKGRvbWFpbiA9PSBudWxsKQorICAgICAgICAgICAgZG9tYWluID0gbXNlcnZlci5nZXREZWZhdWx0RG9tYWluKCk7CisgICAgICAgIE1vZGVsTUJlYW4gbWJlYW4gPSBtYW5hZ2VkLmNyZWF0ZU1CZWFuKHVzZXJEYXRhYmFzZSk7CisgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPSBjcmVhdGVPYmplY3ROYW1lKGRvbWFpbiwgdXNlckRhdGFiYXNlKTsKKyAgICAgICAgaWYoIG1zZXJ2ZXIuaXNSZWdpc3RlcmVkKCBvbmFtZSApKSAgeworICAgICAgICAgICAgbXNlcnZlci51bnJlZ2lzdGVyTUJlYW4ob25hbWUpOworICAgICAgICB9CisgICAgICAgIG1zZXJ2ZXIucmVnaXN0ZXJNQmVhbihtYmVhbiwgb25hbWUpOworICAgICAgICByZXR1cm4gKG1iZWFuKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ3JlYXRlLCByZWdpc3RlciwgYW5kIHJldHVybiBhbiBNQmVhbiBmb3IgdGhpcworICAgICAqIDxjb2RlPlZhbHZlPC9jb2RlPiBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdmUgVGhlIFZhbHZlIHRvIGJlIG1hbmFnZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIE1CZWFuIGNhbm5vdCBiZSBjcmVhdGVkIG9yIHJlZ2lzdGVyZWQKKyAgICAgKi8KKyAgICBzdGF0aWMgTW9kZWxNQmVhbiBjcmVhdGVNQmVhbihWYWx2ZSB2YWx2ZSkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgU3RyaW5nIG1uYW1lID0gY3JlYXRlTWFuYWdlZE5hbWUodmFsdmUpOworICAgICAgICBNYW5hZ2VkQmVhbiBtYW5hZ2VkID0gcmVnaXN0cnkuZmluZE1hbmFnZWRCZWFuKG1uYW1lKTsKKyAgICAgICAgaWYgKG1hbmFnZWQgPT0gbnVsbCkgeworICAgICAgICAgICAgRXhjZXB0aW9uIGUgPSBuZXcgRXhjZXB0aW9uKCJNYW5hZ2VkQmVhbiBpcyBub3QgZm91bmQgd2l0aCAiK21uYW1lKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBNQmVhbkV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgZG9tYWluID0gbWFuYWdlZC5nZXREb21haW4oKTsKKyAgICAgICAgaWYgKGRvbWFpbiA9PSBudWxsKQorICAgICAgICAgICAgZG9tYWluID0gbXNlcnZlci5nZXREZWZhdWx0RG9tYWluKCk7CisgICAgICAgIE1vZGVsTUJlYW4gbWJlYW4gPSBtYW5hZ2VkLmNyZWF0ZU1CZWFuKHZhbHZlKTsKKyAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9IGNyZWF0ZU9iamVjdE5hbWUoZG9tYWluLCB2YWx2ZSk7CisgICAgICAgIGlmKCBtc2VydmVyLmlzUmVnaXN0ZXJlZCggb25hbWUgKSkgIHsKKyAgICAgICAgICAgIG1zZXJ2ZXIudW5yZWdpc3Rlck1CZWFuKG9uYW1lKTsKKyAgICAgICAgfQorICAgICAgICBtc2VydmVyLnJlZ2lzdGVyTUJlYW4obWJlYW4sIG9uYW1lKTsKKyAgICAgICAgcmV0dXJuIChtYmVhbik7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW4gPGNvZGU+T2JqZWN0TmFtZTwvY29kZT4gZm9yIHRoaXMKKyAgICAgKiA8Y29kZT5Db25uZWN0b3I8L2NvZGU+IG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkb21haW4gRG9tYWluIGluIHdoaWNoIHRoaXMgbmFtZSBpcyB0byBiZSBjcmVhdGVkCisgICAgICogQHBhcmFtIGNvbm5lY3RvciBUaGUgQ29ubmVjdG9yIHRvIGJlIG5hbWVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIE1hbGZvcm1lZE9iamVjdE5hbWVFeGNlcHRpb24gaWYgYSBuYW1lIGNhbm5vdCBiZSBjcmVhdGVkCisgICAgICovCisgICAgc3RhdGljIE9iamVjdE5hbWUgY3JlYXRlT2JqZWN0TmFtZShTdHJpbmcgZG9tYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3RvciBjb25uZWN0b3IpCisgICAgICAgIHRocm93cyBNYWxmb3JtZWRPYmplY3ROYW1lRXhjZXB0aW9uIHsKKworICAgICAgICBPYmplY3ROYW1lIG5hbWUgPSBudWxsOworICAgICAgICBpZiAoY29ubmVjdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpLmluZGV4T2YoIkNveW90ZUNvbm5lY3RvciIpID49IDAgKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFN0cmluZyBhZGRyZXNzID0gKFN0cmluZykKKyAgICAgICAgICAgICAgICAgICAgSW50cm9zcGVjdGlvblV0aWxzLmdldFByb3BlcnR5KGNvbm5lY3RvciwgImFkZHJlc3MiKTsKKyAgICAgICAgICAgICAgICBJbnRlZ2VyIHBvcnQgPSAoSW50ZWdlcikKKyAgICAgICAgICAgICAgICAgICAgSW50cm9zcGVjdGlvblV0aWxzLmdldFByb3BlcnR5KGNvbm5lY3RvciwgInBvcnQiKTsKKyAgICAgICAgICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBjb25uZWN0b3IuZ2V0U2VydmljZSgpOworICAgICAgICAgICAgICAgIFN0cmluZyBzZXJ2aWNlTmFtZSA9IG51bGw7CisgICAgICAgICAgICAgICAgaWYgKHNlcnZpY2UgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgc2VydmljZU5hbWUgPSBzZXJ2aWNlLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKGRvbWFpbik7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCI6dHlwZT1Db25uZWN0b3IiKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIixwb3J0PSIgKyBwb3J0KTsKKyAgICAgICAgICAgICAgICBpZiAoKGFkZHJlc3MgIT0gbnVsbCkgJiYgKGFkZHJlc3MubGVuZ3RoKCk+MCkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIsYWRkcmVzcz0iICsgYWRkcmVzcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG5hbWUgPSBuZXcgT2JqZWN0TmFtZShzYi50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKG5hbWUpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAoIkNhbm5vdCBjcmVhdGUgb2JqZWN0IG5hbWUgZm9yICIgKyBjb25uZWN0b3IrZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICgiQ2Fubm90IGNyZWF0ZSBvYmplY3QgbmFtZSBmb3IgIiArIGNvbm5lY3Rvcik7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuIDxjb2RlPk9iamVjdE5hbWU8L2NvZGU+IGZvciB0aGlzCisgICAgICogPGNvZGU+Q29udGV4dDwvY29kZT4gb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIGRvbWFpbiBEb21haW4gaW4gd2hpY2ggdGhpcyBuYW1lIGlzIHRvIGJlIGNyZWF0ZWQKKyAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgQ29udGV4dCB0byBiZSBuYW1lZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBNYWxmb3JtZWRPYmplY3ROYW1lRXhjZXB0aW9uIGlmIGEgbmFtZSBjYW5ub3QgYmUgY3JlYXRlZAorICAgICAqLworICAgIHN0YXRpYyBPYmplY3ROYW1lIGNyZWF0ZU9iamVjdE5hbWUoU3RyaW5nIGRvbWFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHRocm93cyBNYWxmb3JtZWRPYmplY3ROYW1lRXhjZXB0aW9uIHsKKworICAgICAgICBPYmplY3ROYW1lIG5hbWUgPSBudWxsOworICAgICAgICBIb3N0IGhvc3QgPSAoSG9zdCljb250ZXh0LmdldFBhcmVudCgpOworICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSAoKEVuZ2luZSlob3N0LmdldFBhcmVudCgpKS5nZXRTZXJ2aWNlKCk7CisgICAgICAgIFN0cmluZyBwYXRoID0gY29udGV4dC5nZXRQYXRoKCk7CisgICAgICAgIGlmIChwYXRoLmxlbmd0aCgpIDwgMSkKKyAgICAgICAgICAgIHBhdGggPSAiLyI7CisgICAgICAgIC8vIEZJWE1FIAorICAgICAgICBuYW1lID0gbmV3IE9iamVjdE5hbWUoZG9tYWluICsgIjpqMmVlVHlwZT1XZWJNb2R1bGUsbmFtZT0vLyIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdC5nZXROYW1lKCkrIHBhdGggKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIixKMkVFQXBwbGljYXRpb249bm9uZSxKMkVFU2VydmVyPW5vbmUiKTsKKyAgICAKKyAgICAgICAgcmV0dXJuIChuYW1lKTsKKworICAgIH0KKworICAgIAorICAgIC8qKgorICAgICAqIENyZWF0ZSBhbiA8Y29kZT5PYmplY3ROYW1lPC9jb2RlPiBmb3IgdGhpcworICAgICAqIDxjb2RlPlNlcnZpY2U8L2NvZGU+IG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkb21haW4gRG9tYWluIGluIHdoaWNoIHRoaXMgbmFtZSBpcyB0byBiZSBjcmVhdGVkCisgICAgICogQHBhcmFtIGVudmlyb25tZW50IFRoZSBDb250ZXh0RW52aXJvbm1lbnQgdG8gYmUgbmFtZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbiBpZiBhIG5hbWUgY2Fubm90IGJlIGNyZWF0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdE5hbWUgY3JlYXRlT2JqZWN0TmFtZShTdHJpbmcgZG9tYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHRFbnZpcm9ubWVudCBlbnZpcm9ubWVudCkKKyAgICAgICAgdGhyb3dzIE1hbGZvcm1lZE9iamVjdE5hbWVFeGNlcHRpb24geworCisgICAgICAgIE9iamVjdE5hbWUgbmFtZSA9IG51bGw7CisgICAgICAgIE9iamVjdCBjb250YWluZXIgPSAKKyAgICAgICAgICAgICAgICBlbnZpcm9ubWVudC5nZXROYW1pbmdSZXNvdXJjZXMoKS5nZXRDb250YWluZXIoKTsKKyAgICAgICAgaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFNlcnZlcikgeworICAgICAgICAgICAgbmFtZSA9IG5ldyBPYmplY3ROYW1lKGRvbWFpbiArICI6dHlwZT1FbnZpcm9ubWVudCIgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICIscmVzb3VyY2V0eXBlPUdsb2JhbCxuYW1lPSIgKyBlbnZpcm9ubWVudC5nZXROYW1lKCkpOworICAgICAgICB9IGVsc2UgaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIENvbnRleHQpIHsgICAgICAgIAorICAgICAgICAgICAgU3RyaW5nIHBhdGggPSAoKENvbnRleHQpY29udGFpbmVyKS5nZXRQYXRoKCk7CisgICAgICAgICAgICBpZiAocGF0aC5sZW5ndGgoKSA8IDEpCisgICAgICAgICAgICAgICAgcGF0aCA9ICIvIjsKKyAgICAgICAgICAgIEhvc3QgaG9zdCA9IChIb3N0KSAoKENvbnRleHQpY29udGFpbmVyKS5nZXRQYXJlbnQoKTsKKyAgICAgICAgICAgIEVuZ2luZSBlbmdpbmUgPSAoRW5naW5lKSBob3N0LmdldFBhcmVudCgpOworICAgICAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gZW5naW5lLmdldFNlcnZpY2UoKTsKKyAgICAgICAgICAgIG5hbWUgPSBuZXcgT2JqZWN0TmFtZShkb21haW4gKyAiOnR5cGU9RW52aXJvbm1lbnQiICsgCisgICAgICAgICAgICAgICAgICAgICAgICAiLHJlc291cmNldHlwZT1Db250ZXh0LHBhdGg9IiArIHBhdGggKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICIsaG9zdD0iICsgaG9zdC5nZXROYW1lKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgIixuYW1lPSIgKyBlbnZpcm9ubWVudC5nZXROYW1lKCkpOworICAgICAgICB9LyogZWxzZSBpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgRGVmYXVsdENvbnRleHQpIHsKKyAgICAgICAgICAgIGNvbnRhaW5lciA9ICgoRGVmYXVsdENvbnRleHQpY29udGFpbmVyKS5nZXRQYXJlbnQoKTsKKyAgICAgICAgICAgIGlmIChjb250YWluZXIgaW5zdGFuY2VvZiBIb3N0KSB7CisgICAgICAgICAgICAgICAgSG9zdCBob3N0ID0gKEhvc3QpIGNvbnRhaW5lcjsKKyAgICAgICAgICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSAoKEVuZ2luZSlob3N0LmdldFBhcmVudCgpKS5nZXRTZXJ2aWNlKCk7CisgICAgICAgICAgICAgICAgbmFtZSA9IG5ldyBPYmplY3ROYW1lKGRvbWFpbiArICI6dHlwZT1FbnZpcm9ubWVudCIgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICIscmVzb3VyY2V0eXBlPUhvc3REZWZhdWx0Q29udGV4dCxob3N0PSIgKyBob3N0LmdldE5hbWUoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAiLG5hbWU9IiArIGVudmlyb25tZW50LmdldE5hbWUoKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIEVuZ2luZSkgeworICAgICAgICAgICAgICAgIEVuZ2luZSBlbmdpbmUgPSAoRW5naW5lKSBjb250YWluZXI7CisgICAgICAgICAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gZW5naW5lLmdldFNlcnZpY2UoKTsKKyAgICAgICAgICAgICAgICBuYW1lID0gbmV3IE9iamVjdE5hbWUoZG9tYWluICsgIjp0eXBlPUVudmlyb25tZW50IiArIAorICAgICAgICAgICAgICAgICAgICAgICAgIixyZXNvdXJjZXR5cGU9U2VydmljZURlZmF1bHRDb250ZXh0LG5hbWU9IiArIGVudmlyb25tZW50LmdldE5hbWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0qLworICAgICAgICAKKyAgICAgICAgcmV0dXJuIChuYW1lKTsKKworICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW4gPGNvZGU+T2JqZWN0TmFtZTwvY29kZT4gZm9yIHRoaXMKKyAgICAgKiA8Y29kZT5Db250ZXh0UmVzb3VyY2U8L2NvZGU+IG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkb21haW4gRG9tYWluIGluIHdoaWNoIHRoaXMgbmFtZSBpcyB0byBiZSBjcmVhdGVkCisgICAgICogQHBhcmFtIHJlc291cmNlIFRoZSBDb250ZXh0UmVzb3VyY2UgdG8gYmUgbmFtZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbiBpZiBhIG5hbWUgY2Fubm90IGJlIGNyZWF0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdE5hbWUgY3JlYXRlT2JqZWN0TmFtZShTdHJpbmcgZG9tYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHRSZXNvdXJjZSByZXNvdXJjZSkKKyAgICAgICAgdGhyb3dzIE1hbGZvcm1lZE9iamVjdE5hbWVFeGNlcHRpb24geworCisgICAgICAgIE9iamVjdE5hbWUgbmFtZSA9IG51bGw7CisgICAgICAgIFN0cmluZyBxdW90ZWRSZXNvdXJjZU5hbWUgPSBPYmplY3ROYW1lLnF1b3RlKHJlc291cmNlLmdldE5hbWUoKSk7CisgICAgICAgIE9iamVjdCBjb250YWluZXIgPSAKKyAgICAgICAgICAgICAgICByZXNvdXJjZS5nZXROYW1pbmdSZXNvdXJjZXMoKS5nZXRDb250YWluZXIoKTsKKyAgICAgICAgaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFNlcnZlcikgeyAgICAgICAgCisgICAgICAgICAgICBuYW1lID0gbmV3IE9iamVjdE5hbWUoZG9tYWluICsgIjp0eXBlPVJlc291cmNlIiArCisgICAgICAgICAgICAgICAgICAgICAgICAiLHJlc291cmNldHlwZT1HbG9iYWwsY2xhc3M9IiArIHJlc291cmNlLmdldFR5cGUoKSArIAorICAgICAgICAgICAgICAgICAgICAgICAgIixuYW1lPSIgKyBxdW90ZWRSZXNvdXJjZU5hbWUpOworICAgICAgICB9IGVsc2UgaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIENvbnRleHQpIHsgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgU3RyaW5nIHBhdGggPSAoKENvbnRleHQpY29udGFpbmVyKS5nZXRQYXRoKCk7CisgICAgICAgICAgICBpZiAocGF0aC5sZW5ndGgoKSA8IDEpCisgICAgICAgICAgICAgICAgcGF0aCA9ICIvIjsKKyAgICAgICAgICAgIEhvc3QgaG9zdCA9IChIb3N0KSAoKENvbnRleHQpY29udGFpbmVyKS5nZXRQYXJlbnQoKTsKKyAgICAgICAgICAgIEVuZ2luZSBlbmdpbmUgPSAoRW5naW5lKSBob3N0LmdldFBhcmVudCgpOworICAgICAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gZW5naW5lLmdldFNlcnZpY2UoKTsKKyAgICAgICAgICAgIG5hbWUgPSBuZXcgT2JqZWN0TmFtZShkb21haW4gKyAiOnR5cGU9UmVzb3VyY2UiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIscmVzb3VyY2V0eXBlPUNvbnRleHQscGF0aD0iICsgcGF0aCArIAorICAgICAgICAgICAgICAgICAgICAgICAgIixob3N0PSIgKyBob3N0LmdldE5hbWUoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAiLGNsYXNzPSIgKyByZXNvdXJjZS5nZXRUeXBlKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgIixuYW1lPSIgKyBxdW90ZWRSZXNvdXJjZU5hbWUpOworICAgICAgICB9LyogZWxzZSBpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgRGVmYXVsdENvbnRleHQpIHsgICAgICAgICAgICAKKyAgICAgICAgICAgIGNvbnRhaW5lciA9ICgoRGVmYXVsdENvbnRleHQpY29udGFpbmVyKS5nZXRQYXJlbnQoKTsKKyAgICAgICAgICAgIGlmIChjb250YWluZXIgaW5zdGFuY2VvZiBIb3N0KSB7CisgICAgICAgICAgICAgICAgSG9zdCBob3N0ID0gKEhvc3QpIGNvbnRhaW5lcjsKKyAgICAgICAgICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSAoKEVuZ2luZSlob3N0LmdldFBhcmVudCgpKS5nZXRTZXJ2aWNlKCk7CisgICAgICAgICAgICAgICAgbmFtZSA9IG5ldyBPYmplY3ROYW1lKGRvbWFpbiArICI6dHlwZT1SZXNvdXJjZSIgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICIscmVzb3VyY2V0eXBlPUhvc3REZWZhdWx0Q29udGV4dCxob3N0PSIgKyBob3N0LmdldE5hbWUoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAiLGNsYXNzPSIgKyByZXNvdXJjZS5nZXRUeXBlKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgIixuYW1lPSIgKyBxdW90ZWRSZXNvdXJjZU5hbWUpOworICAgICAgICAgICAgfSBlbHNlIGlmIChjb250YWluZXIgaW5zdGFuY2VvZiBFbmdpbmUpIHsKKyAgICAgICAgICAgICAgICBFbmdpbmUgZW5naW5lID0gKEVuZ2luZSkgY29udGFpbmVyOworICAgICAgICAgICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IGVuZ2luZS5nZXRTZXJ2aWNlKCk7CisgICAgICAgICAgICAgICAgbmFtZSA9IG5ldyBPYmplY3ROYW1lKGRvbWFpbiArICI6dHlwZT1SZXNvdXJjZSIgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICIscmVzb3VyY2V0eXBlPVNlcnZpY2VEZWZhdWx0Q29udGV4dCxjbGFzcz0iICsgcmVzb3VyY2UuZ2V0VHlwZSgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIsbmFtZT0iICsgcXVvdGVkUmVzb3VyY2VOYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSovCisgICAgICAgIAorICAgICAgICByZXR1cm4gKG5hbWUpOworCisgICAgfQorICAKKyAgICAKKyAgICAgLyoqCisgICAgICogQ3JlYXRlIGFuIDxjb2RlPk9iamVjdE5hbWU8L2NvZGU+IGZvciB0aGlzCisgICAgICogPGNvZGU+Q29udGV4dFJlc291cmNlTGluazwvY29kZT4gb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIGRvbWFpbiBEb21haW4gaW4gd2hpY2ggdGhpcyBuYW1lIGlzIHRvIGJlIGNyZWF0ZWQKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VMaW5rIFRoZSBDb250ZXh0UmVzb3VyY2VMaW5rIHRvIGJlIG5hbWVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIE1hbGZvcm1lZE9iamVjdE5hbWVFeGNlcHRpb24gaWYgYSBuYW1lIGNhbm5vdCBiZSBjcmVhdGVkCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBPYmplY3ROYW1lIGNyZWF0ZU9iamVjdE5hbWUoU3RyaW5nIGRvbWFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0UmVzb3VyY2VMaW5rIHJlc291cmNlTGluaykKKyAgICAgICAgdGhyb3dzIE1hbGZvcm1lZE9iamVjdE5hbWVFeGNlcHRpb24geworCisgICAgICAgIE9iamVjdE5hbWUgbmFtZSA9IG51bGw7CisgICAgICAgIFN0cmluZyBxdW90ZWRSZXNvdXJjZUxpbmtOYW1lCisgICAgICAgICAgICAgICAgPSBPYmplY3ROYW1lLnF1b3RlKHJlc291cmNlTGluay5nZXROYW1lKCkpOyAgICAgICAgCisgICAgICAgIE9iamVjdCBjb250YWluZXIgPSAKKyAgICAgICAgICAgICAgICByZXNvdXJjZUxpbmsuZ2V0TmFtaW5nUmVzb3VyY2VzKCkuZ2V0Q29udGFpbmVyKCk7CisgICAgICAgIGlmIChjb250YWluZXIgaW5zdGFuY2VvZiBTZXJ2ZXIpIHsgICAgICAgIAorICAgICAgICAgICAgbmFtZSA9IG5ldyBPYmplY3ROYW1lKGRvbWFpbiArICI6dHlwZT1SZXNvdXJjZUxpbmsiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIscmVzb3VyY2V0eXBlPUdsb2JhbCIgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICIsbmFtZT0iICsgcXVvdGVkUmVzb3VyY2VMaW5rTmFtZSk7CisgICAgICAgIH0gZWxzZSBpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgQ29udGV4dCkgeyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBTdHJpbmcgcGF0aCA9ICgoQ29udGV4dCljb250YWluZXIpLmdldFBhdGgoKTsKKyAgICAgICAgICAgIGlmIChwYXRoLmxlbmd0aCgpIDwgMSkKKyAgICAgICAgICAgICAgICBwYXRoID0gIi8iOworICAgICAgICAgICAgSG9zdCBob3N0ID0gKEhvc3QpICgoQ29udGV4dCljb250YWluZXIpLmdldFBhcmVudCgpOworICAgICAgICAgICAgRW5naW5lIGVuZ2luZSA9IChFbmdpbmUpIGhvc3QuZ2V0UGFyZW50KCk7CisgICAgICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBlbmdpbmUuZ2V0U2VydmljZSgpOworICAgICAgICAgICAgbmFtZSA9IG5ldyBPYmplY3ROYW1lKGRvbWFpbiArICI6dHlwZT1SZXNvdXJjZUxpbmsiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIscmVzb3VyY2V0eXBlPUNvbnRleHQscGF0aD0iICsgcGF0aCArIAorICAgICAgICAgICAgICAgICAgICAgICAgIixob3N0PSIgKyBob3N0LmdldE5hbWUoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAiLG5hbWU9IiArIHF1b3RlZFJlc291cmNlTGlua05hbWUpOworICAgICAgICB9LyogZWxzZSBpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgRGVmYXVsdENvbnRleHQpIHsgICAgICAgICAgICAKKyAgICAgICAgICAgIGNvbnRhaW5lciA9ICgoRGVmYXVsdENvbnRleHQpY29udGFpbmVyKS5nZXRQYXJlbnQoKTsKKyAgICAgICAgICAgIGlmIChjb250YWluZXIgaW5zdGFuY2VvZiBIb3N0KSB7CisgICAgICAgICAgICAgICAgSG9zdCBob3N0ID0gKEhvc3QpIGNvbnRhaW5lcjsKKyAgICAgICAgICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSAoKEVuZ2luZSlob3N0LmdldFBhcmVudCgpKS5nZXRTZXJ2aWNlKCk7CisgICAgICAgICAgICAgICAgbmFtZSA9IG5ldyBPYmplY3ROYW1lKGRvbWFpbiArICI6dHlwZT1SZXNvdXJjZUxpbmsiICsgCisgICAgICAgICAgICAgICAgICAgICAgICAiLHJlc291cmNldHlwZT1Ib3N0RGVmYXVsdENvbnRleHQsaG9zdD0iICsgaG9zdC5nZXROYW1lKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgIixuYW1lPSIgKyBxdW90ZWRSZXNvdXJjZUxpbmtOYW1lKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgRW5naW5lKSB7CisgICAgICAgICAgICAgICAgRW5naW5lIGVuZ2luZSA9IChFbmdpbmUpIGNvbnRhaW5lcjsKKyAgICAgICAgICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBlbmdpbmUuZ2V0U2VydmljZSgpOworICAgICAgICAgICAgICAgIG5hbWUgPSBuZXcgT2JqZWN0TmFtZShkb21haW4gKyAiOnR5cGU9UmVzb3VyY2VMaW5rIiArIAorICAgICAgICAgICAgICAgICAgICAgICAgIixyZXNvdXJjZXR5cGU9U2VydmljZURlZmF1bHRDb250ZXh0LG5hbWU9IiArIHF1b3RlZFJlc291cmNlTGlua05hbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9Ki8KKyAgICAgICAgCisgICAgICAgIHJldHVybiAobmFtZSk7CisKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuIDxjb2RlPk9iamVjdE5hbWU8L2NvZGU+IGZvciB0aGlzCisgICAgICogPGNvZGU+RGVmYXVsdENvbnRleHQ8L2NvZGU+IG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkb21haW4gRG9tYWluIGluIHdoaWNoIHRoaXMgbmFtZSBpcyB0byBiZSBjcmVhdGVkCisgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIERlZmF1bHRDb250ZXh0IHRvIGJlIG5hbWVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIE1hbGZvcm1lZE9iamVjdE5hbWVFeGNlcHRpb24gaWYgYSBuYW1lIGNhbm5vdCBiZSBjcmVhdGVkCisgICAgICovCisgICAgLyoKKyAgICBzdGF0aWMgT2JqZWN0TmFtZSBjcmVhdGVPYmplY3ROYW1lKFN0cmluZyBkb21haW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdENvbnRleHQgY29udGV4dCkKKyAgICAgICAgdGhyb3dzIE1hbGZvcm1lZE9iamVjdE5hbWVFeGNlcHRpb24geworCisgICAgICAgIE9iamVjdE5hbWUgbmFtZSA9IG51bGw7CisgICAgICAgIENvbnRhaW5lciBjb250YWluZXIgPSBjb250ZXh0LmdldFBhcmVudCgpOworICAgICAgICBpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgSG9zdCkgeworICAgICAgICAgICAgSG9zdCBob3N0ID0gKEhvc3QpIGNvbnRhaW5lcjsKKyAgICAgICAgICAgIFNlcnZpY2Ugc2VydmljZSA9ICgoRW5naW5lKWhvc3QuZ2V0UGFyZW50KCkpLmdldFNlcnZpY2UoKTsKKyAgICAgICAgICAgIG5hbWUgPSBuZXcgT2JqZWN0TmFtZShkb21haW4gKyAiOnR5cGU9RGVmYXVsdENvbnRleHQsaG9zdD0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3QuZ2V0TmFtZSgpKTsKKyAgICAgICAgfSBlbHNlIGlmIChjb250YWluZXIgaW5zdGFuY2VvZiBFbmdpbmUpIHsKKyAgICAgICAgICAgIEVuZ2luZSBlbmdpbmUgPSAoRW5naW5lKSBjb250YWluZXI7CisgICAgICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBlbmdpbmUuZ2V0U2VydmljZSgpOworICAgICAgICAgICAgbmFtZSA9IG5ldyBPYmplY3ROYW1lKGRvbWFpbiArICI6dHlwZT1EZWZhdWx0Q29udGV4dCIpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIChuYW1lKTsKKworICAgIH0KKyAgICAqLworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuIDxjb2RlPk9iamVjdE5hbWU8L2NvZGU+IGZvciB0aGlzCisgICAgICogPGNvZGU+RW5naW5lPC9jb2RlPiBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZG9tYWluIERvbWFpbiBpbiB3aGljaCB0aGlzIG5hbWUgaXMgdG8gYmUgY3JlYXRlZAorICAgICAqIEBwYXJhbSBlbmdpbmUgVGhlIEVuZ2luZSB0byBiZSBuYW1lZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBNYWxmb3JtZWRPYmplY3ROYW1lRXhjZXB0aW9uIGlmIGEgbmFtZSBjYW5ub3QgYmUgY3JlYXRlZAorICAgICAqLworICAgIHN0YXRpYyBPYmplY3ROYW1lIGNyZWF0ZU9iamVjdE5hbWUoU3RyaW5nIGRvbWFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmdpbmUgZW5naW5lKQorICAgICAgICB0aHJvd3MgTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbiB7CisKKyAgICAgICAgT2JqZWN0TmFtZSBuYW1lID0gbnVsbDsKKyAgICAgICAgbmFtZSA9IG5ldyBPYmplY3ROYW1lKGRvbWFpbiArICI6dHlwZT1FbmdpbmUiKTsKKyAgICAgICAgcmV0dXJuIChuYW1lKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuIDxjb2RlPk9iamVjdE5hbWU8L2NvZGU+IGZvciB0aGlzCisgICAgICogPGNvZGU+R3JvdXA8L2NvZGU+IG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkb21haW4gRG9tYWluIGluIHdoaWNoIHRoaXMgbmFtZSBpcyB0byBiZSBjcmVhdGVkCisgICAgICogQHBhcmFtIGdyb3VwIFRoZSBHcm91cCB0byBiZSBuYW1lZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBNYWxmb3JtZWRPYmplY3ROYW1lRXhjZXB0aW9uIGlmIGEgbmFtZSBjYW5ub3QgYmUgY3JlYXRlZAorICAgICAqLworICAgIHN0YXRpYyBPYmplY3ROYW1lIGNyZWF0ZU9iamVjdE5hbWUoU3RyaW5nIGRvbWFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcm91cCBncm91cCkKKyAgICAgICAgdGhyb3dzIE1hbGZvcm1lZE9iamVjdE5hbWVFeGNlcHRpb24geworCisgICAgICAgIE9iamVjdE5hbWUgbmFtZSA9IG51bGw7CisgICAgICAgIG5hbWUgPSBuZXcgT2JqZWN0TmFtZShkb21haW4gKyAiOnR5cGU9R3JvdXAsZ3JvdXBuYW1lPSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0TmFtZS5xdW90ZShncm91cC5nZXRHcm91cG5hbWUoKSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIixkYXRhYmFzZT0iICsgZ3JvdXAuZ2V0VXNlckRhdGFiYXNlKCkuZ2V0SWQoKSk7CisgICAgICAgIHJldHVybiAobmFtZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhbiA8Y29kZT5PYmplY3ROYW1lPC9jb2RlPiBmb3IgdGhpcworICAgICAqIDxjb2RlPkhvc3Q8L2NvZGU+IG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkb21haW4gRG9tYWluIGluIHdoaWNoIHRoaXMgbmFtZSBpcyB0byBiZSBjcmVhdGVkCisgICAgICogQHBhcmFtIGhvc3QgVGhlIEhvc3QgdG8gYmUgbmFtZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbiBpZiBhIG5hbWUgY2Fubm90IGJlIGNyZWF0ZWQKKyAgICAgKi8KKyAgICBzdGF0aWMgT2JqZWN0TmFtZSBjcmVhdGVPYmplY3ROYW1lKFN0cmluZyBkb21haW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSG9zdCBob3N0KQorICAgICAgICB0aHJvd3MgTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbiB7CisKKyAgICAgICAgT2JqZWN0TmFtZSBuYW1lID0gbnVsbDsKKyAgICAgICAgRW5naW5lIGVuZ2luZSA9IChFbmdpbmUpaG9zdC5nZXRQYXJlbnQoKTsKKyAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gZW5naW5lLmdldFNlcnZpY2UoKTsKKyAgICAgICAgbmFtZSA9IG5ldyBPYmplY3ROYW1lKGRvbWFpbiArICI6dHlwZT1Ib3N0LGhvc3Q9IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3N0LmdldE5hbWUoKSk7CisgICAgICAgIHJldHVybiAobmFtZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhbiA8Y29kZT5PYmplY3ROYW1lPC9jb2RlPiBmb3IgdGhpcworICAgICAqIDxjb2RlPkxvYWRlcjwvY29kZT4gb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIGRvbWFpbiBEb21haW4gaW4gd2hpY2ggdGhpcyBuYW1lIGlzIHRvIGJlIGNyZWF0ZWQKKyAgICAgKiBAcGFyYW0gbG9hZGVyIFRoZSBMb2FkZXIgdG8gYmUgbmFtZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbiBpZiBhIG5hbWUgY2Fubm90IGJlIGNyZWF0ZWQKKyAgICAgKi8KKyAgICBzdGF0aWMgT2JqZWN0TmFtZSBjcmVhdGVPYmplY3ROYW1lKFN0cmluZyBkb21haW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9hZGVyIGxvYWRlcikKKyAgICAgICAgdGhyb3dzIE1hbGZvcm1lZE9iamVjdE5hbWVFeGNlcHRpb24geworCisgICAgICAgIE9iamVjdE5hbWUgbmFtZSA9IG51bGw7CisgICAgICAgIENvbnRhaW5lciBjb250YWluZXIgPSBsb2FkZXIuZ2V0Q29udGFpbmVyKCk7CisKKyAgICAgICAgaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIEVuZ2luZSkgeworICAgICAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gKChFbmdpbmUpY29udGFpbmVyKS5nZXRTZXJ2aWNlKCk7CisgICAgICAgICAgICBuYW1lID0gbmV3IE9iamVjdE5hbWUoZG9tYWluICsgIjp0eXBlPUxvYWRlciIpOworICAgICAgICB9IGVsc2UgaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIEhvc3QpIHsKKyAgICAgICAgICAgIEVuZ2luZSBlbmdpbmUgPSAoRW5naW5lKSBjb250YWluZXIuZ2V0UGFyZW50KCk7CisgICAgICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBlbmdpbmUuZ2V0U2VydmljZSgpOworICAgICAgICAgICAgbmFtZSA9IG5ldyBPYmplY3ROYW1lKGRvbWFpbiArICI6dHlwZT1Mb2FkZXIsaG9zdD0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lci5nZXROYW1lKCkpOworICAgICAgICB9IGVsc2UgaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIENvbnRleHQpIHsKKyAgICAgICAgICAgIFN0cmluZyBwYXRoID0gKChDb250ZXh0KWNvbnRhaW5lcikuZ2V0UGF0aCgpOworICAgICAgICAgICAgaWYgKHBhdGgubGVuZ3RoKCkgPCAxKSB7CisgICAgICAgICAgICAgICAgcGF0aCA9ICIvIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEhvc3QgaG9zdCA9IChIb3N0KSBjb250YWluZXIuZ2V0UGFyZW50KCk7CisgICAgICAgICAgICBFbmdpbmUgZW5naW5lID0gKEVuZ2luZSkgaG9zdC5nZXRQYXJlbnQoKTsKKyAgICAgICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IGVuZ2luZS5nZXRTZXJ2aWNlKCk7CisgICAgICAgICAgICBuYW1lID0gbmV3IE9iamVjdE5hbWUoZG9tYWluICsgIjp0eXBlPUxvYWRlcixwYXRoPSIgKyBwYXRoICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsaG9zdD0iICsgaG9zdC5nZXROYW1lKCkpOworICAgICAgICB9LyogZWxzZSBpZiAoY29udGFpbmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIFdoYXQgaXMgdGhhdCA/Pz8KKyAgICAgICAgICAgIERlZmF1bHRDb250ZXh0IGRlZmF1bHRDb250ZXh0ID0gbG9hZGVyLmdldERlZmF1bHRDb250ZXh0KCk7CisgICAgICAgICAgICBpZiAoZGVmYXVsdENvbnRleHQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIENvbnRhaW5lciBwYXJlbnQgPSBkZWZhdWx0Q29udGV4dC5nZXRQYXJlbnQoKTsKKyAgICAgICAgICAgICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgRW5naW5lKSB7CisgICAgICAgICAgICAgICAgICAgIFNlcnZpY2Ugc2VydmljZSA9ICgoRW5naW5lKXBhcmVudCkuZ2V0U2VydmljZSgpOworICAgICAgICAgICAgICAgICAgICBuYW1lID0gbmV3IE9iamVjdE5hbWUoZG9tYWluICsgIjp0eXBlPURlZmF1bHRMb2FkZXIiKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmVudCBpbnN0YW5jZW9mIEhvc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgRW5naW5lIGVuZ2luZSA9IChFbmdpbmUpIHBhcmVudC5nZXRQYXJlbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gZW5naW5lLmdldFNlcnZpY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgbmFtZSA9IG5ldyBPYmplY3ROYW1lKGRvbWFpbiArICI6dHlwZT1EZWZhdWx0TG9hZGVyLGhvc3Q9IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50LmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9Ki8KKworICAgICAgICByZXR1cm4gKG5hbWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW4gPGNvZGU+T2JqZWN0TmFtZTwvY29kZT4gZm9yIHRoaXMKKyAgICAgKiA8Y29kZT5NYW5hZ2VyPC9jb2RlPiBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZG9tYWluIERvbWFpbiBpbiB3aGljaCB0aGlzIG5hbWUgaXMgdG8gYmUgY3JlYXRlZAorICAgICAqIEBwYXJhbSBtYW5hZ2VyIFRoZSBNYW5hZ2VyIHRvIGJlIG5hbWVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIE1hbGZvcm1lZE9iamVjdE5hbWVFeGNlcHRpb24gaWYgYSBuYW1lIGNhbm5vdCBiZSBjcmVhdGVkCisgICAgICovCisgICAgc3RhdGljIE9iamVjdE5hbWUgY3JlYXRlT2JqZWN0TmFtZShTdHJpbmcgZG9tYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hbmFnZXIgbWFuYWdlcikKKyAgICAgICAgdGhyb3dzIE1hbGZvcm1lZE9iamVjdE5hbWVFeGNlcHRpb24geworCisgICAgICAgIE9iamVjdE5hbWUgbmFtZSA9IG51bGw7CisgICAgICAgIENvbnRhaW5lciBjb250YWluZXIgPSBtYW5hZ2VyLmdldENvbnRhaW5lcigpOworCisgICAgICAgIGlmIChjb250YWluZXIgaW5zdGFuY2VvZiBFbmdpbmUpIHsKKyAgICAgICAgICAgIFNlcnZpY2Ugc2VydmljZSA9ICgoRW5naW5lKWNvbnRhaW5lcikuZ2V0U2VydmljZSgpOworICAgICAgICAgICAgbmFtZSA9IG5ldyBPYmplY3ROYW1lKGRvbWFpbiArICI6dHlwZT1NYW5hZ2VyIik7CisgICAgICAgIH0gZWxzZSBpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgSG9zdCkgeworICAgICAgICAgICAgRW5naW5lIGVuZ2luZSA9IChFbmdpbmUpIGNvbnRhaW5lci5nZXRQYXJlbnQoKTsKKyAgICAgICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IGVuZ2luZS5nZXRTZXJ2aWNlKCk7CisgICAgICAgICAgICBuYW1lID0gbmV3IE9iamVjdE5hbWUoZG9tYWluICsgIjp0eXBlPU1hbmFnZXIsaG9zdD0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lci5nZXROYW1lKCkpOworICAgICAgICB9IGVsc2UgaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIENvbnRleHQpIHsKKyAgICAgICAgICAgIFN0cmluZyBwYXRoID0gKChDb250ZXh0KWNvbnRhaW5lcikuZ2V0UGF0aCgpOworICAgICAgICAgICAgaWYgKHBhdGgubGVuZ3RoKCkgPCAxKSB7CisgICAgICAgICAgICAgICAgcGF0aCA9ICIvIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEhvc3QgaG9zdCA9IChIb3N0KSBjb250YWluZXIuZ2V0UGFyZW50KCk7CisgICAgICAgICAgICBFbmdpbmUgZW5naW5lID0gKEVuZ2luZSkgaG9zdC5nZXRQYXJlbnQoKTsKKyAgICAgICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IGVuZ2luZS5nZXRTZXJ2aWNlKCk7CisgICAgICAgICAgICBuYW1lID0gbmV3IE9iamVjdE5hbWUoZG9tYWluICsgIjp0eXBlPU1hbmFnZXIscGF0aD0iICsgcGF0aCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLGhvc3Q9IiArIGhvc3QuZ2V0TmFtZSgpKTsKKyAgICAgICAgfS8qIGVsc2UgaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7CisgICAgICAgICAgICBEZWZhdWx0Q29udGV4dCBkZWZhdWx0Q29udGV4dCA9IG1hbmFnZXIuZ2V0RGVmYXVsdENvbnRleHQoKTsKKyAgICAgICAgICAgIGlmIChkZWZhdWx0Q29udGV4dCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgQ29udGFpbmVyIHBhcmVudCA9IGRlZmF1bHRDb250ZXh0LmdldFBhcmVudCgpOworICAgICAgICAgICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBFbmdpbmUpIHsKKyAgICAgICAgICAgICAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gKChFbmdpbmUpcGFyZW50KS5nZXRTZXJ2aWNlKCk7CisgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBuZXcgT2JqZWN0TmFtZShkb21haW4gKyAiOnR5cGU9RGVmYXVsdE1hbmFnZXIiKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmVudCBpbnN0YW5jZW9mIEhvc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgRW5naW5lIGVuZ2luZSA9IChFbmdpbmUpIHBhcmVudC5nZXRQYXJlbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gZW5naW5lLmdldFNlcnZpY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgbmFtZSA9IG5ldyBPYmplY3ROYW1lKGRvbWFpbiArICI6dHlwZT1EZWZhdWx0TWFuYWdlcixob3N0PSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSovCisKKyAgICAgICAgcmV0dXJuIChuYW1lKTsKKworICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW4gPGNvZGU+T2JqZWN0TmFtZTwvY29kZT4gZm9yIHRoaXMKKyAgICAgKiA8Y29kZT5TZXJ2ZXI8L2NvZGU+IG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkb21haW4gRG9tYWluIGluIHdoaWNoIHRoaXMgbmFtZSBpcyB0byBiZSBjcmVhdGVkCisgICAgICogQHBhcmFtIHJlc291cmNlcyBUaGUgTmFtaW5nUmVzb3VyY2VzIHRvIGJlIG5hbWVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIE1hbGZvcm1lZE9iamVjdE5hbWVFeGNlcHRpb24gaWYgYSBuYW1lIGNhbm5vdCBiZSBjcmVhdGVkCisgICAgICovCisgICAgc3RhdGljIE9iamVjdE5hbWUgY3JlYXRlT2JqZWN0TmFtZShTdHJpbmcgZG9tYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWluZ1Jlc291cmNlcyByZXNvdXJjZXMpCisgICAgICAgIHRocm93cyBNYWxmb3JtZWRPYmplY3ROYW1lRXhjZXB0aW9uIHsKKworICAgICAgICBPYmplY3ROYW1lIG5hbWUgPSBudWxsOworICAgICAgICBPYmplY3QgY29udGFpbmVyID0gcmVzb3VyY2VzLmdldENvbnRhaW5lcigpOyAgICAgICAgCisgICAgICAgIGlmIChjb250YWluZXIgaW5zdGFuY2VvZiBTZXJ2ZXIpIHsgICAgICAgIAorICAgICAgICAgICAgbmFtZSA9IG5ldyBPYmplY3ROYW1lKGRvbWFpbiArICI6dHlwZT1OYW1pbmdSZXNvdXJjZXMiICsgCisgICAgICAgICAgICAgICAgICAgICAgICAiLHJlc291cmNldHlwZT1HbG9iYWwiKTsKKyAgICAgICAgfSBlbHNlIGlmIChjb250YWluZXIgaW5zdGFuY2VvZiBDb250ZXh0KSB7ICAgICAgICAKKyAgICAgICAgICAgIFN0cmluZyBwYXRoID0gKChDb250ZXh0KWNvbnRhaW5lcikuZ2V0UGF0aCgpOworICAgICAgICAgICAgaWYgKHBhdGgubGVuZ3RoKCkgPCAxKQorICAgICAgICAgICAgICAgIHBhdGggPSAiLyI7CisgICAgICAgICAgICBIb3N0IGhvc3QgPSAoSG9zdCkgKChDb250ZXh0KWNvbnRhaW5lcikuZ2V0UGFyZW50KCk7CisgICAgICAgICAgICBFbmdpbmUgZW5naW5lID0gKEVuZ2luZSkgaG9zdC5nZXRQYXJlbnQoKTsKKyAgICAgICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IGVuZ2luZS5nZXRTZXJ2aWNlKCk7CisgICAgICAgICAgICBuYW1lID0gbmV3IE9iamVjdE5hbWUoZG9tYWluICsgIjp0eXBlPU5hbWluZ1Jlc291cmNlcyIgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICIscmVzb3VyY2V0eXBlPUNvbnRleHQscGF0aD0iICsgcGF0aCArIAorICAgICAgICAgICAgICAgICAgICAgICAgIixob3N0PSIgKyBob3N0LmdldE5hbWUoKSk7CisgICAgICAgIH0vKiBlbHNlIGlmIChjb250YWluZXIgaW5zdGFuY2VvZiBEZWZhdWx0Q29udGV4dCkgeworICAgICAgICAgICAgY29udGFpbmVyID0gKChEZWZhdWx0Q29udGV4dCljb250YWluZXIpLmdldFBhcmVudCgpOworICAgICAgICAgICAgaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIEhvc3QpIHsKKyAgICAgICAgICAgICAgICBIb3N0IGhvc3QgPSAoSG9zdCkgY29udGFpbmVyOworICAgICAgICAgICAgICAgIFNlcnZpY2Ugc2VydmljZSA9ICgoRW5naW5lKWhvc3QuZ2V0UGFyZW50KCkpLmdldFNlcnZpY2UoKTsKKyAgICAgICAgICAgICAgICBuYW1lID0gbmV3IE9iamVjdE5hbWUoZG9tYWluICsgIjp0eXBlPU5hbWluZ1Jlc291cmNlcyIgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICIscmVzb3VyY2V0eXBlPUhvc3REZWZhdWx0Q29udGV4dCxob3N0PSIgKyBob3N0LmdldE5hbWUoKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIEVuZ2luZSkgeworICAgICAgICAgICAgICAgIEVuZ2luZSBlbmdpbmUgPSAoRW5naW5lKSBjb250YWluZXI7CisgICAgICAgICAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gZW5naW5lLmdldFNlcnZpY2UoKTsKKyAgICAgICAgICAgICAgICBuYW1lID0gbmV3IE9iamVjdE5hbWUoZG9tYWluICsgIjp0eXBlPU5hbWluZ1Jlc291cmNlcyIgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICIscmVzb3VyY2V0eXBlPVNlcnZpY2VEZWZhdWx0Q29udGV4dCIpOworICAgICAgICAgICAgfQorICAgICAgICB9Ki8KKyAgICAgICAgCisgICAgICAgIHJldHVybiAobmFtZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhbiA8Y29kZT5PYmplY3ROYW1lPC9jb2RlPiBmb3IgdGhpcworICAgICAqIDxjb2RlPk1CZWFuRmFjdG9yeTwvY29kZT4gb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIGRvbWFpbiBEb21haW4gaW4gd2hpY2ggdGhpcyBuYW1lIGlzIHRvIGJlIGNyZWF0ZWQKKyAgICAgKiBAcGFyYW0gZmFjdG9yeSBUaGUgTUJlYW5GYWN0b3J5IHRvIGJlIG5hbWVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIE1hbGZvcm1lZE9iamVjdE5hbWVFeGNlcHRpb24gaWYgYSBuYW1lIGNhbm5vdCBiZSBjcmVhdGVkCisgICAgICovCisgICAgc3RhdGljIE9iamVjdE5hbWUgY3JlYXRlT2JqZWN0TmFtZShTdHJpbmcgZG9tYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1CZWFuRmFjdG9yeSBmYWN0b3J5KQorICAgICAgICB0aHJvd3MgTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbiB7CisKKyAgICAgICAgT2JqZWN0TmFtZSBuYW1lID0gbmV3IE9iamVjdE5hbWUoZG9tYWluICsgIjp0eXBlPU1CZWFuRmFjdG9yeSIpOworCisgICAgICAgIHJldHVybiAobmFtZSk7CisKKyAgICB9CisKKyAgICAKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW4gPGNvZGU+T2JqZWN0TmFtZTwvY29kZT4gZm9yIHRoaXMKKyAgICAgKiA8Y29kZT5SZWFsbTwvY29kZT4gb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIGRvbWFpbiBEb21haW4gaW4gd2hpY2ggdGhpcyBuYW1lIGlzIHRvIGJlIGNyZWF0ZWQKKyAgICAgKiBAcGFyYW0gcmVhbG0gVGhlIFJlYWxtIHRvIGJlIG5hbWVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIE1hbGZvcm1lZE9iamVjdE5hbWVFeGNlcHRpb24gaWYgYSBuYW1lIGNhbm5vdCBiZSBjcmVhdGVkCisgICAgICovCisgICAgc3RhdGljIE9iamVjdE5hbWUgY3JlYXRlT2JqZWN0TmFtZShTdHJpbmcgZG9tYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlYWxtIHJlYWxtKQorICAgICAgICB0aHJvd3MgTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbiB7CisKKyAgICAgICAgT2JqZWN0TmFtZSBuYW1lID0gbnVsbDsKKyAgICAgICAgQ29udGFpbmVyIGNvbnRhaW5lciA9IHJlYWxtLmdldENvbnRhaW5lcigpOworCisgICAgICAgIGlmIChjb250YWluZXIgaW5zdGFuY2VvZiBFbmdpbmUpIHsKKyAgICAgICAgICAgIFNlcnZpY2Ugc2VydmljZSA9ICgoRW5naW5lKWNvbnRhaW5lcikuZ2V0U2VydmljZSgpOworICAgICAgICAgICAgbmFtZSA9IG5ldyBPYmplY3ROYW1lKGRvbWFpbiArICI6dHlwZT1SZWFsbSIpOworICAgICAgICB9IGVsc2UgaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIEhvc3QpIHsKKyAgICAgICAgICAgIEVuZ2luZSBlbmdpbmUgPSAoRW5naW5lKSBjb250YWluZXIuZ2V0UGFyZW50KCk7CisgICAgICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBlbmdpbmUuZ2V0U2VydmljZSgpOworICAgICAgICAgICAgbmFtZSA9IG5ldyBPYmplY3ROYW1lKGRvbWFpbiArICI6dHlwZT1SZWFsbSxob3N0PSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLmdldE5hbWUoKSk7CisgICAgICAgIH0gZWxzZSBpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgQ29udGV4dCkgeworICAgICAgICAgICAgU3RyaW5nIHBhdGggPSAoKENvbnRleHQpY29udGFpbmVyKS5nZXRQYXRoKCk7CisgICAgICAgICAgICBpZiAocGF0aC5sZW5ndGgoKSA8IDEpIHsKKyAgICAgICAgICAgICAgICBwYXRoID0gIi8iOworICAgICAgICAgICAgfQorICAgICAgICAgICAgSG9zdCBob3N0ID0gKEhvc3QpIGNvbnRhaW5lci5nZXRQYXJlbnQoKTsKKyAgICAgICAgICAgIEVuZ2luZSBlbmdpbmUgPSAoRW5naW5lKSBob3N0LmdldFBhcmVudCgpOworICAgICAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gZW5naW5lLmdldFNlcnZpY2UoKTsKKyAgICAgICAgICAgIG5hbWUgPSBuZXcgT2JqZWN0TmFtZShkb21haW4gKyAiOnR5cGU9UmVhbG0scGF0aD0iICsgcGF0aCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLGhvc3Q9IiArIGhvc3QuZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAobmFtZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhbiA8Y29kZT5PYmplY3ROYW1lPC9jb2RlPiBmb3IgdGhpcworICAgICAqIDxjb2RlPlJvbGU8L2NvZGU+IG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkb21haW4gRG9tYWluIGluIHdoaWNoIHRoaXMgbmFtZSBpcyB0byBiZSBjcmVhdGVkCisgICAgICogQHBhcmFtIHJvbGUgVGhlIFJvbGUgdG8gYmUgbmFtZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbiBpZiBhIG5hbWUgY2Fubm90IGJlIGNyZWF0ZWQKKyAgICAgKi8KKyAgICBzdGF0aWMgT2JqZWN0TmFtZSBjcmVhdGVPYmplY3ROYW1lKFN0cmluZyBkb21haW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUm9sZSByb2xlKQorICAgICAgICB0aHJvd3MgTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbiB7CisKKyAgICAgICAgT2JqZWN0TmFtZSBuYW1lID0gbnVsbDsKKyAgICAgICAgbmFtZSA9IG5ldyBPYmplY3ROYW1lKGRvbWFpbiArICI6dHlwZT1Sb2xlLHJvbGVuYW1lPSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZS5nZXRSb2xlbmFtZSgpICsgIixkYXRhYmFzZT0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGUuZ2V0VXNlckRhdGFiYXNlKCkuZ2V0SWQoKSk7CisgICAgICAgIHJldHVybiAobmFtZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhbiA8Y29kZT5PYmplY3ROYW1lPC9jb2RlPiBmb3IgdGhpcworICAgICAqIDxjb2RlPlNlcnZlcjwvY29kZT4gb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIGRvbWFpbiBEb21haW4gaW4gd2hpY2ggdGhpcyBuYW1lIGlzIHRvIGJlIGNyZWF0ZWQKKyAgICAgKiBAcGFyYW0gc2VydmVyIFRoZSBTZXJ2ZXIgdG8gYmUgbmFtZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbiBpZiBhIG5hbWUgY2Fubm90IGJlIGNyZWF0ZWQKKyAgICAgKi8KKyAgICBzdGF0aWMgT2JqZWN0TmFtZSBjcmVhdGVPYmplY3ROYW1lKFN0cmluZyBkb21haW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmVyIHNlcnZlcikKKyAgICAgICAgdGhyb3dzIE1hbGZvcm1lZE9iamVjdE5hbWVFeGNlcHRpb24geworCisgICAgICAgIE9iamVjdE5hbWUgbmFtZSA9IG51bGw7CisgICAgICAgIG5hbWUgPSBuZXcgT2JqZWN0TmFtZShkb21haW4gKyAiOnR5cGU9U2VydmVyIik7CisgICAgICAgIHJldHVybiAobmFtZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhbiA8Y29kZT5PYmplY3ROYW1lPC9jb2RlPiBmb3IgdGhpcworICAgICAqIDxjb2RlPlNlcnZpY2U8L2NvZGU+IG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkb21haW4gRG9tYWluIGluIHdoaWNoIHRoaXMgbmFtZSBpcyB0byBiZSBjcmVhdGVkCisgICAgICogQHBhcmFtIHNlcnZpY2UgVGhlIFNlcnZpY2UgdG8gYmUgbmFtZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbiBpZiBhIG5hbWUgY2Fubm90IGJlIGNyZWF0ZWQKKyAgICAgKi8KKyAgICBzdGF0aWMgT2JqZWN0TmFtZSBjcmVhdGVPYmplY3ROYW1lKFN0cmluZyBkb21haW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmljZSBzZXJ2aWNlKQorICAgICAgICB0aHJvd3MgTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbiB7CisKKyAgICAgICAgT2JqZWN0TmFtZSBuYW1lID0gbnVsbDsKKyAgICAgICAgbmFtZSA9IG5ldyBPYmplY3ROYW1lKGRvbWFpbiArICI6dHlwZT1TZXJ2aWNlLHNlcnZpY2VOYW1lPSIgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLmdldE5hbWUoKSk7CisgICAgICAgIHJldHVybiAobmFtZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhbiA8Y29kZT5PYmplY3ROYW1lPC9jb2RlPiBmb3IgdGhpcworICAgICAqIDxjb2RlPlVzZXI8L2NvZGU+IG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkb21haW4gRG9tYWluIGluIHdoaWNoIHRoaXMgbmFtZSBpcyB0byBiZSBjcmVhdGVkCisgICAgICogQHBhcmFtIHVzZXIgVGhlIFVzZXIgdG8gYmUgbmFtZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbiBpZiBhIG5hbWUgY2Fubm90IGJlIGNyZWF0ZWQKKyAgICAgKi8KKyAgICBzdGF0aWMgT2JqZWN0TmFtZSBjcmVhdGVPYmplY3ROYW1lKFN0cmluZyBkb21haW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlciB1c2VyKQorICAgICAgICB0aHJvd3MgTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbiB7CisKKyAgICAgICAgT2JqZWN0TmFtZSBuYW1lID0gbnVsbDsKKyAgICAgICAgbmFtZSA9IG5ldyBPYmplY3ROYW1lKGRvbWFpbiArICI6dHlwZT1Vc2VyLHVzZXJuYW1lPSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0TmFtZS5xdW90ZSh1c2VyLmdldFVzZXJuYW1lKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsZGF0YWJhc2U9IiArIHVzZXIuZ2V0VXNlckRhdGFiYXNlKCkuZ2V0SWQoKSk7CisgICAgICAgIHJldHVybiAobmFtZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhbiA8Y29kZT5PYmplY3ROYW1lPC9jb2RlPiBmb3IgdGhpcworICAgICAqIDxjb2RlPlVzZXJEYXRhYmFzZTwvY29kZT4gb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIGRvbWFpbiBEb21haW4gaW4gd2hpY2ggdGhpcyBuYW1lIGlzIHRvIGJlIGNyZWF0ZWQKKyAgICAgKiBAcGFyYW0gdXNlckRhdGFiYXNlIFRoZSBVc2VyRGF0YWJhc2UgdG8gYmUgbmFtZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbiBpZiBhIG5hbWUgY2Fubm90IGJlIGNyZWF0ZWQKKyAgICAgKi8KKyAgICBzdGF0aWMgT2JqZWN0TmFtZSBjcmVhdGVPYmplY3ROYW1lKFN0cmluZyBkb21haW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlckRhdGFiYXNlIHVzZXJEYXRhYmFzZSkKKyAgICAgICAgdGhyb3dzIE1hbGZvcm1lZE9iamVjdE5hbWVFeGNlcHRpb24geworCisgICAgICAgIE9iamVjdE5hbWUgbmFtZSA9IG51bGw7CisgICAgICAgIG5hbWUgPSBuZXcgT2JqZWN0TmFtZShkb21haW4gKyAiOnR5cGU9VXNlckRhdGFiYXNlLGRhdGFiYXNlPSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckRhdGFiYXNlLmdldElkKCkpOworICAgICAgICByZXR1cm4gKG5hbWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW4gPGNvZGU+T2JqZWN0TmFtZTwvY29kZT4gZm9yIHRoaXMKKyAgICAgKiA8Y29kZT5WYWx2ZTwvY29kZT4gb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIGRvbWFpbiBEb21haW4gaW4gd2hpY2ggdGhpcyBuYW1lIGlzIHRvIGJlIGNyZWF0ZWQKKyAgICAgKiBAcGFyYW0gdmFsdmUgVGhlIFZhbHZlIHRvIGJlIG5hbWVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIE1hbGZvcm1lZE9iamVjdE5hbWVFeGNlcHRpb24gaWYgYSBuYW1lIGNhbm5vdCBiZSBjcmVhdGVkCisgICAgICovCisgICAgc3RhdGljIE9iamVjdE5hbWUgY3JlYXRlT2JqZWN0TmFtZShTdHJpbmcgZG9tYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdmUgdmFsdmUpCisgICAgICAgIHRocm93cyBNYWxmb3JtZWRPYmplY3ROYW1lRXhjZXB0aW9uIHsKKyAgICAgICAgaWYoIHZhbHZlIGluc3RhbmNlb2YgVmFsdmVCYXNlICkgeworICAgICAgICAgICAgT2JqZWN0TmFtZSBuYW1lPSgoVmFsdmVCYXNlKXZhbHZlKS5nZXRPYmplY3ROYW1lKCk7CisgICAgICAgICAgICBpZiggbmFtZSAhPSBudWxsICkKKyAgICAgICAgICAgICAgICByZXR1cm4gbmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIE9iamVjdE5hbWUgbmFtZSA9IG51bGw7CisgICAgICAgIENvbnRhaW5lciBjb250YWluZXIgPSBudWxsOworICAgICAgICBTdHJpbmcgY2xhc3NOYW1lPXZhbHZlLmdldENsYXNzKCkuZ2V0TmFtZSgpOworICAgICAgICBpbnQgcGVyaW9kID0gY2xhc3NOYW1lLmxhc3RJbmRleE9mKCcuJyk7CisgICAgICAgIGlmIChwZXJpb2QgPj0gMCkKKyAgICAgICAgICAgIGNsYXNzTmFtZSA9IGNsYXNzTmFtZS5zdWJzdHJpbmcocGVyaW9kICsgMSk7CisgICAgICAgIGlmKCB2YWx2ZSBpbnN0YW5jZW9mIENvbnRhaW5lZCApIHsKKyAgICAgICAgICAgIGNvbnRhaW5lciA9ICgoQ29udGFpbmVkKXZhbHZlKS5nZXRDb250YWluZXIoKTsKKyAgICAgICAgfQorICAgICAgICBpZiggY29udGFpbmVyID09IG51bGwgKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IGNyZWF0ZSBtYmVhbiBmb3Igbm9uLWNvbnRhaW5lZCB2YWx2ZSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx2ZSk7CisgICAgICAgIH0gICAgICAgIAorICAgICAgICBpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgRW5naW5lKSB7CisgICAgICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSAoKEVuZ2luZSljb250YWluZXIpLmdldFNlcnZpY2UoKTsKKyAgICAgICAgICAgIFN0cmluZyBsb2NhbD0iIjsKKyAgICAgICAgICAgIGludCBzZXEgPSBnZXRTZXEobG9jYWwpOworICAgICAgICAgICAgU3RyaW5nIGV4dD0iIjsKKyAgICAgICAgICAgIGlmKCBzZXEgPiAwICkgeworICAgICAgICAgICAgICAgIGV4dD0iLHNlcT0iICsgc2VxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbmFtZSA9IG5ldyBPYmplY3ROYW1lKGRvbWFpbiArICI6dHlwZT1WYWx2ZSxuYW1lPSIgKyBjbGFzc05hbWUgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dCArIGxvY2FsICk7CisgICAgICAgIH0gZWxzZSBpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgSG9zdCkgeworICAgICAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gKChFbmdpbmUpY29udGFpbmVyLmdldFBhcmVudCgpKS5nZXRTZXJ2aWNlKCk7CisgICAgICAgICAgICBTdHJpbmcgbG9jYWw9Iixob3N0PSIgK2NvbnRhaW5lci5nZXROYW1lKCk7CisgICAgICAgICAgICBpbnQgc2VxID0gZ2V0U2VxKGxvY2FsKTsKKyAgICAgICAgICAgIFN0cmluZyBleHQ9IiI7CisgICAgICAgICAgICBpZiggc2VxID4gMCApIHsKKyAgICAgICAgICAgICAgICBleHQ9IixzZXE9IiArIHNlcTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5hbWUgPSBuZXcgT2JqZWN0TmFtZShkb21haW4gKyAiOnR5cGU9VmFsdmUsbmFtZT0iICsgY2xhc3NOYW1lICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHQgKyBsb2NhbCApOworICAgICAgICB9IGVsc2UgaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIENvbnRleHQpIHsKKyAgICAgICAgICAgIFN0cmluZyBwYXRoID0gKChDb250ZXh0KWNvbnRhaW5lcikuZ2V0UGF0aCgpOworICAgICAgICAgICAgaWYgKHBhdGgubGVuZ3RoKCkgPCAxKSB7CisgICAgICAgICAgICAgICAgcGF0aCA9ICIvIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEhvc3QgaG9zdCA9IChIb3N0KSBjb250YWluZXIuZ2V0UGFyZW50KCk7CisgICAgICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSAoKEVuZ2luZSkgaG9zdC5nZXRQYXJlbnQoKSkuZ2V0U2VydmljZSgpOworICAgICAgICAgICAgU3RyaW5nIGxvY2FsPSIscGF0aD0iICsgcGF0aCArICIsaG9zdD0iICsKKyAgICAgICAgICAgICAgICAgICAgaG9zdC5nZXROYW1lKCk7CisgICAgICAgICAgICBpbnQgc2VxID0gZ2V0U2VxKGxvY2FsKTsKKyAgICAgICAgICAgIFN0cmluZyBleHQ9IiI7CisgICAgICAgICAgICBpZiggc2VxID4gMCApIHsKKyAgICAgICAgICAgICAgICBleHQ9IixzZXE9IiArIHNlcTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5hbWUgPSBuZXcgT2JqZWN0TmFtZShkb21haW4gKyAiOnR5cGU9VmFsdmUsbmFtZT0iICsgY2xhc3NOYW1lICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHQgKyBsb2NhbCApOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIChuYW1lKTsKKworICAgIH0KKworICAgIHN0YXRpYyBIYXNodGFibGUgc2VxPW5ldyBIYXNodGFibGUoKTsKKyAgICBzdGF0aWMgaW50IGdldFNlcSggU3RyaW5nIGtleSApIHsKKyAgICAgICAgaW50IGlbXT0oaW50IFtdKXNlcS5nZXQoIGtleSApOworICAgICAgICBpZiAoaSA9PSBudWxsICkgeworICAgICAgICAgICAgaT1uZXcgaW50WzFdOworICAgICAgICAgICAgaVswXT0wOworICAgICAgICAgICAgc2VxLnB1dCgga2V5LCBpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlbMF0rKzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaVswXTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW5kIGNvbmZpZ3VyZSAoaWYgbmVjZXNzYXJ5KSBhbmQgcmV0dXJuIHRoZSByZWdpc3RyeSBvZgorICAgICAqIG1hbmFnZWQgb2JqZWN0IGRlc2NyaXB0aW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBSZWdpc3RyeSBjcmVhdGVSZWdpc3RyeSgpIHsKKworICAgICAgICBpZiAocmVnaXN0cnkgPT0gbnVsbCkgeworICAgICAgICAgICAgcmVnaXN0cnkgPSBSZWdpc3RyeS5nZXRSZWdpc3RyeShudWxsLCBudWxsKTsKKyAgICAgICAgICAgIENsYXNzTG9hZGVyIGNsPVNlcnZlckxpZmVjeWNsZUxpc3RlbmVyLmNsYXNzLmdldENsYXNzTG9hZGVyKCk7CisKKyAgICAgICAgICAgIHJlZ2lzdHJ5LmxvYWREZXNjcmlwdG9ycygib3JnLmFwYWNoZS5jYXRhbGluYS5tYmVhbnMiLCAgY2wpOworICAgICAgICAgICAgcmVnaXN0cnkubG9hZERlc2NyaXB0b3JzKCJvcmcuYXBhY2hlLmNhdGFsaW5hLmF1dGhlbnRpY2F0b3IiLCBjbCk7CisgICAgICAgICAgICByZWdpc3RyeS5sb2FkRGVzY3JpcHRvcnMoIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZSIsIGNsKTsKKyAgICAgICAgICAgIHJlZ2lzdHJ5LmxvYWREZXNjcmlwdG9ycygib3JnLmFwYWNoZS5jYXRhbGluYSIsIGNsKTsKKyAgICAgICAgICAgIHJlZ2lzdHJ5LmxvYWREZXNjcmlwdG9ycygib3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kiLCBjbCk7CisgICAgICAgICAgICByZWdpc3RyeS5sb2FkRGVzY3JpcHRvcnMoIm9yZy5hcGFjaGUuY2F0YWxpbmEubG9hZGVyIiwgY2wpOworICAgICAgICAgICAgcmVnaXN0cnkubG9hZERlc2NyaXB0b3JzKCJvcmcuYXBhY2hlLmNhdGFsaW5hLmxvZ2dlciIsIGNsKTsKKyAgICAgICAgICAgIHJlZ2lzdHJ5LmxvYWREZXNjcmlwdG9ycygib3JnLmFwYWNoZS5jYXRhbGluYS5yZWFsbSIsIGNsKTsKKyAgICAgICAgICAgIHJlZ2lzdHJ5LmxvYWREZXNjcmlwdG9ycygib3JnLmFwYWNoZS5jYXRhbGluYS5zZXNzaW9uIiwgY2wpOworICAgICAgICAgICAgcmVnaXN0cnkubG9hZERlc2NyaXB0b3JzKCJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0YXJ0dXAiLCBjbCk7CisgICAgICAgICAgICByZWdpc3RyeS5sb2FkRGVzY3JpcHRvcnMoIm9yZy5hcGFjaGUuY2F0YWxpbmEudXNlcnMiLCBjbCk7CisgICAgICAgICAgICByZWdpc3RyeS5sb2FkRGVzY3JpcHRvcnMoIm9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3RlciIsIGNsKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgcmVnaXN0cnkubG9hZERlc2NyaXB0b3JzKCJvcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcyIsICBjbCk7CisgICAgICAgICAgICByZWdpc3RyeS5sb2FkRGVzY3JpcHRvcnMoIm9yZy5hcGFjaGUuY295b3RlLnRvbWNhdDUiLCBjbCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChyZWdpc3RyeSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhbmQgY29uZmlndXJlIChpZiBuZWNlc3NhcnkpIGFuZCByZXR1cm4gdGhlCisgICAgICogPGNvZGU+TUJlYW5TZXJ2ZXI8L2NvZGU+IHdpdGggd2hpY2ggd2Ugd2lsbCBiZQorICAgICAqIHJlZ2lzdGVyaW5nIG91ciA8Y29kZT5Nb2RlbE1CZWFuPC9jb2RlPiBpbXBsZW1lbnRhdGlvbnMuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgTUJlYW5TZXJ2ZXIgY3JlYXRlU2VydmVyKCkgeworCisgICAgICAgIGlmIChtc2VydmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgLy9UcmFjZS5wYXJzZVRyYWNlUHJvcGVydGllcygpOworICAgICAgICAgICAgICAgIC8vbXNlcnZlciA9IE1CZWFuU2VydmVyRmFjdG9yeS5jcmVhdGVNQmVhblNlcnZlcigpOworICAgICAgICAgICAgICAgIG1zZXJ2ZXIgPSBSZWdpc3RyeS5nZXRSZWdpc3RyeShudWxsLCBudWxsKS5nZXRNQmVhblNlcnZlcigpOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICB0LnByaW50U3RhY2tUcmFjZShTeXN0ZW0ub3V0KTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKG1zZXJ2ZXIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBSTUkgYWRhcHRlciBbTVg0SiBzcGVjaWZpY10uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZVJNSUFkYXB0b3IoU3RyaW5nIGFkYXB0b3JUeXBlLCBTdHJpbmcgaG9zdCwgaW50IHBvcnQpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIFN0cmluZyBuYW1pbmdQcm92aWRlck9iamVjdE5hbWUgPSBudWxsOworICAgICAgICBTdHJpbmcgbmFtaW5nUHJvdmlkZXJDbGFzc05hbWUgPSBudWxsOworICAgICAgICBTdHJpbmcgYWRhcHRvck9iamVjdE5hbWUgPSBudWxsOworICAgICAgICBTdHJpbmcgYWRhcHRvckNsYXNzTmFtZSA9IG51bGw7CisgICAgICAgIFN0cmluZyBhZGFwdG9yTWJlYW5DbGFzc05hbWUgPSBudWxsOworICAgICAgICBib29sZWFuIGRlbGF5ID0gZmFsc2U7CisgICAgICAgIFN0cmluZyBqbmRpTmFtZSA9ICJqcm1wIjsKKyAgICAgICAgU3RyaW5nIGNvbnRleHRGYWN0b3J5ID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIHByb3ZpZGVyVXJsID0gbnVsbDsKKworCQlpZiAoKGhvc3QgPT0gbnVsbCkgfHwgKGhvc3QudHJpbSgpLmxlbmd0aCgpID09IDApKQorCQkJaG9zdCA9ICJsb2NhbGhvc3QiOworCisgICAgICAgIGlmIChhZGFwdG9yVHlwZS5lcXVhbHMoImpybXAiKSkgeworICAgICAgICAgICAgbmFtaW5nUHJvdmlkZXJPYmplY3ROYW1lID0gIk5hbWluZzp0eXBlPXJtaXJlZ2lzdHJ5IjsKKyAgICAgICAgICAgIG5hbWluZ1Byb3ZpZGVyQ2xhc3NOYW1lID0gIm14NGoudG9vbHMubmFtaW5nLk5hbWluZ1NlcnZpY2UiOworICAgICAgICAgICAgYWRhcHRvck9iamVjdE5hbWUgPSAiQWRhcHRvcjpwcm90b2NvbD1KUk1QIjsKKyAgICAgICAgICAgIGFkYXB0b3JDbGFzc05hbWUgPSAibXg0ai5hZGFwdG9yLnJtaS5qcm1wLkpSTVBBZGFwdG9yIjsKKyAgICAgICAgICAgIGFkYXB0b3JNYmVhbkNsYXNzTmFtZSA9ICJteDRqLmFkYXB0b3Iucm1pLmpybXAuSlJNUEFkYXB0b3JNQmVhbiI7CisgICAgICAgICAgICBjb250ZXh0RmFjdG9yeSA9IAorICAgICAgICAgICAgICAgICJjb20uc3VuLmpuZGkucm1pLnJlZ2lzdHJ5LlJlZ2lzdHJ5Q29udGV4dEZhY3RvcnkiOworICAgICAgICAgICAgICAgIAorCQkJaWYgKHBvcnQgPT0gLTEpCisJCQkJcG9ydCA9IDEwOTk7CisJCQkJICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgIHByb3ZpZGVyVXJsID0gInJtaTovLyIgKyBob3N0ICsgIjoiICsgSW50ZWdlci50b1N0cmluZyhwb3J0KTsKKyAgICAgICAgICAgIAorICAgICAgICB9IGVsc2UgaWYgKGFkYXB0b3JUeXBlLmVxdWFscygiaWlvcCIpKSB7CisgICAgICAgICAgICBuYW1pbmdQcm92aWRlck9iamVjdE5hbWUgPSAiTmFtaW5nOnR5cGU9dG5hbWVzZXJ2IjsKKyAgICAgICAgICAgIG5hbWluZ1Byb3ZpZGVyQ2xhc3NOYW1lID0gIm14NGoudG9vbHMubmFtaW5nLkNvc05hbWluZ1NlcnZpY2UiOworICAgICAgICAgICAgZGVsYXkgPSB0cnVlOworICAgICAgICAgICAgYWRhcHRvck9iamVjdE5hbWUgPSAiQWRhcHRvcjpwcm90b2NvbD1JSU9QIjsKKyAgICAgICAgICAgIGFkYXB0b3JDbGFzc05hbWUgPSAibXg0ai5hZGFwdG9yLnJtaS5paW9wLklJT1BBZGFwdG9yIjsKKyAgICAgICAgICAgIGFkYXB0b3JNYmVhbkNsYXNzTmFtZSA9ICJteDRqLmFkYXB0b3Iucm1pLmlpb3AuSUlPUEFkYXB0b3JNQmVhbiI7CisgICAgICAgICAgICBjb250ZXh0RmFjdG9yeSA9ICJjb20uc3VuLmpuZGkuY29zbmFtaW5nLkNOQ3R4RmFjdG9yeSI7CisKKwkJCWlmIChwb3J0ID09IC0xKQorCQkJCXBvcnQgPSA5MDA7CisJCQkJICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgIHByb3ZpZGVyVXJsID0gImlpb3A6Ly8iICsgaG9zdCArICI6IiArIEludGVnZXIudG9TdHJpbmcocG9ydCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIGFkYXB0b3IgdHlwZSIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ3JlYXRlIGFuZCBzdGFydCB0aGUgbmFtaW5nIHNlcnZpY2UKKyAgICAgICAgT2JqZWN0TmFtZSBuYW1pbmcgPSBuZXcgT2JqZWN0TmFtZShuYW1pbmdQcm92aWRlck9iamVjdE5hbWUpOworICAgICAgICBtc2VydmVyLmNyZWF0ZU1CZWFuKG5hbWluZ1Byb3ZpZGVyQ2xhc3NOYW1lLCBuYW1pbmcsIG51bGwpOworICAgICAgICBpZiAoZGVsYXkpIHsKKyAgICAgICAgICAgIG1zZXJ2ZXIuc2V0QXR0cmlidXRlKG5hbWluZywgbmV3IEF0dHJpYnV0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJEZWxheSIsIG5ldyBJbnRlZ2VyKDUwMDApKSk7CisgICAgICAgIH0KKyAgICAgICAgbXNlcnZlci5pbnZva2UobmFtaW5nLCAic3RhcnQiLCBudWxsLCBudWxsKTsKKworICAgICAgICAvLyBDcmVhdGUgdGhlIEpSTVAgYWRhcHRvcgorICAgICAgICBPYmplY3ROYW1lIGFkYXB0b3IgPSBuZXcgT2JqZWN0TmFtZShhZGFwdG9yT2JqZWN0TmFtZSk7CisgICAgICAgIG1zZXJ2ZXIuY3JlYXRlTUJlYW4oYWRhcHRvckNsYXNzTmFtZSwgYWRhcHRvciwgbnVsbCk7CisKKyAgICAgICAgQ2xhc3MgcHJveHlDbGFzcyA9IENsYXNzLmZvck5hbWUoIm14NGoudXRpbC5TdGFuZGFyZE1CZWFuUHJveHkiKTsKKworICAgICAgICBPYmplY3QgYXJnc1tdID0gbnVsbDsKKyAgICAgICAgQ2xhc3MgdHlwZXNbXSA9IG51bGw7CisgICAgICAgIE1ldGhvZCBtZXRob2QgPSBudWxsOworCisgICAgICAgIHR5cGVzID0gbmV3IENsYXNzWzNdOworICAgICAgICB0eXBlc1swXSA9IENsYXNzLmNsYXNzOworICAgICAgICB0eXBlc1sxXSA9IE1CZWFuU2VydmVyLmNsYXNzOworICAgICAgICB0eXBlc1syXSA9IE9iamVjdE5hbWUuY2xhc3M7CisgICAgICAgIGFyZ3MgPSBuZXcgT2JqZWN0WzNdOworICAgICAgICBhcmdzWzBdID0gQ2xhc3MuZm9yTmFtZShhZGFwdG9yTWJlYW5DbGFzc05hbWUpOworICAgICAgICBhcmdzWzFdID0gbXNlcnZlcjsKKyAgICAgICAgYXJnc1syXSA9IGFkYXB0b3I7CisgICAgICAgIG1ldGhvZCA9IHByb3h5Q2xhc3MuZ2V0TWV0aG9kKCJjcmVhdGUiLCB0eXBlcyk7CisgICAgICAgIE9iamVjdCBiZWFuID0gbWV0aG9kLmludm9rZShudWxsLCBhcmdzKTsKKworICAgICAgICBDbGFzcyBiZWFuQ2xhc3MgPSBiZWFuLmdldENsYXNzKCk7CisKKyAgICAgICAgYXJncyA9IG5ldyBPYmplY3RbMV07CisgICAgICAgIGFyZ3NbMF0gPSBqbmRpTmFtZTsKKyAgICAgICAgdHlwZXMgPSBuZXcgQ2xhc3NbMV07CisgICAgICAgIHR5cGVzWzBdID0gU3RyaW5nLmNsYXNzOworICAgICAgICBtZXRob2QgPSBiZWFuQ2xhc3MuZ2V0TWV0aG9kKCJzZXRKTkRJTmFtZSIsIHR5cGVzKTsKKyAgICAgICAgbWV0aG9kLmludm9rZShiZWFuLCBhcmdzKTsKKworICAgICAgICBhcmdzID0gbmV3IE9iamVjdFsyXTsKKyAgICAgICAgdHlwZXMgPSBuZXcgQ2xhc3NbMl07CisgICAgICAgIHR5cGVzWzBdID0gT2JqZWN0LmNsYXNzOworICAgICAgICB0eXBlc1sxXSA9IE9iamVjdC5jbGFzczsKKyAgICAgICAgbWV0aG9kID0gYmVhbkNsYXNzLmdldE1ldGhvZCgicHV0Sk5ESVByb3BlcnR5IiwgdHlwZXMpOworCisgICAgICAgIGFyZ3NbMF0gPSBqYXZheC5uYW1pbmcuQ29udGV4dC5JTklUSUFMX0NPTlRFWFRfRkFDVE9SWTsKKyAgICAgICAgYXJnc1sxXSA9IGNvbnRleHRGYWN0b3J5OworICAgICAgICBtZXRob2QuaW52b2tlKGJlYW4sIGFyZ3MpOworCisgICAgICAgIGFyZ3NbMF0gPSBqYXZheC5uYW1pbmcuQ29udGV4dC5QUk9WSURFUl9VUkw7CisgICAgICAgIGFyZ3NbMV0gPSBwcm92aWRlclVybDsKKyAgICAgICAgbWV0aG9kLmludm9rZShiZWFuLCBhcmdzKTsKKworICAgICAgICBtZXRob2QgPSBiZWFuQ2xhc3MuZ2V0TWV0aG9kKCJzdGFydCIsIG51bGwpOworICAgICAgICBtZXRob2QuaW52b2tlKGJlYW4sIG51bGwpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBEZXJlZ2lzdGVyIHRoZSBNQmVhbiBmb3IgdGhpcworICAgICAqIDxjb2RlPkNvbm5lY3RvcjwvY29kZT4gb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3RvciBUaGUgQ29ubmVjdG9yIHRvIGJlIG1hbmFnZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIE1CZWFuIGNhbm5vdCBiZSBkZXJlZ2lzdGVyZWQKKyAgICAgKi8KKyAgICBzdGF0aWMgdm9pZCBkZXN0cm95TUJlYW4oQ29ubmVjdG9yIGNvbm5lY3RvciwgU2VydmljZSBzZXJ2aWNlKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBjb25uZWN0b3Iuc2V0U2VydmljZShzZXJ2aWNlKTsKKyAgICAgICAgU3RyaW5nIG1uYW1lID0gY3JlYXRlTWFuYWdlZE5hbWUoY29ubmVjdG9yKTsKKyAgICAgICAgTWFuYWdlZEJlYW4gbWFuYWdlZCA9IHJlZ2lzdHJ5LmZpbmRNYW5hZ2VkQmVhbihtbmFtZSk7CisgICAgICAgIGlmIChtYW5hZ2VkID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgZG9tYWluID0gbWFuYWdlZC5nZXREb21haW4oKTsKKyAgICAgICAgaWYgKGRvbWFpbiA9PSBudWxsKQorICAgICAgICAgICAgZG9tYWluID0gbXNlcnZlci5nZXREZWZhdWx0RG9tYWluKCk7CisgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPSBjcmVhdGVPYmplY3ROYW1lKGRvbWFpbiwgY29ubmVjdG9yKTsKKyAgICAgICAgY29ubmVjdG9yLnNldFNlcnZpY2UobnVsbCk7CisgICAgICAgIGlmKCBtc2VydmVyLmlzUmVnaXN0ZXJlZCggb25hbWUgKSkgIHsKKyAgICAgICAgICAgIG1zZXJ2ZXIudW5yZWdpc3Rlck1CZWFuKG9uYW1lKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogRGVyZWdpc3RlciB0aGUgTUJlYW4gZm9yIHRoaXMKKyAgICAgKiA8Y29kZT5Db250ZXh0PC9jb2RlPiBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgQ29udGV4dCB0byBiZSBtYW5hZ2VkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBNQmVhbiBjYW5ub3QgYmUgZGVyZWdpc3RlcmVkCisgICAgICovCisgICAgc3RhdGljIHZvaWQgZGVzdHJveU1CZWFuKENvbnRleHQgY29udGV4dCkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgU3RyaW5nIG1uYW1lID0gY3JlYXRlTWFuYWdlZE5hbWUoY29udGV4dCk7CisgICAgICAgIE1hbmFnZWRCZWFuIG1hbmFnZWQgPSByZWdpc3RyeS5maW5kTWFuYWdlZEJlYW4obW5hbWUpOworICAgICAgICBpZiAobWFuYWdlZCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIGRvbWFpbiA9IG1hbmFnZWQuZ2V0RG9tYWluKCk7CisgICAgICAgIGlmIChkb21haW4gPT0gbnVsbCkKKyAgICAgICAgICAgIGRvbWFpbiA9IG1zZXJ2ZXIuZ2V0RGVmYXVsdERvbWFpbigpOworICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0gY3JlYXRlT2JqZWN0TmFtZShkb21haW4sIGNvbnRleHQpOworICAgICAgICBpZiggbXNlcnZlci5pc1JlZ2lzdGVyZWQob25hbWUpICkKKyAgICAgICAgICAgIG1zZXJ2ZXIudW5yZWdpc3Rlck1CZWFuKG9uYW1lKTsKKworICAgIH0KKworICAgIAorICAgIC8qKgorICAgICAqIERlcmVnaXN0ZXIgdGhlIE1CZWFuIGZvciB0aGlzCisgICAgICogPGNvZGU+Q29udGV4dEVudmlyb25tZW50PC9jb2RlPiBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZW52aXJvbm1lbnQgVGhlIENvbnRleHRFbnZpcm9ubWVudCB0byBiZSBtYW5hZ2VkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBNQmVhbiBjYW5ub3QgYmUgZGVyZWdpc3RlcmVkCisgICAgICovCisgICAgc3RhdGljIHZvaWQgZGVzdHJveU1CZWFuKENvbnRleHRFbnZpcm9ubWVudCBlbnZpcm9ubWVudCkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgU3RyaW5nIG1uYW1lID0gY3JlYXRlTWFuYWdlZE5hbWUoZW52aXJvbm1lbnQpOworICAgICAgICBNYW5hZ2VkQmVhbiBtYW5hZ2VkID0gcmVnaXN0cnkuZmluZE1hbmFnZWRCZWFuKG1uYW1lKTsKKyAgICAgICAgaWYgKG1hbmFnZWQgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBkb21haW4gPSBtYW5hZ2VkLmdldERvbWFpbigpOworICAgICAgICBpZiAoZG9tYWluID09IG51bGwpCisgICAgICAgICAgICBkb21haW4gPSBtc2VydmVyLmdldERlZmF1bHREb21haW4oKTsKKyAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9IGNyZWF0ZU9iamVjdE5hbWUoZG9tYWluLCBlbnZpcm9ubWVudCk7CisgICAgICAgIGlmKCBtc2VydmVyLmlzUmVnaXN0ZXJlZChvbmFtZSkgKQorICAgICAgICAgICAgbXNlcnZlci51bnJlZ2lzdGVyTUJlYW4ob25hbWUpOworCisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIERlcmVnaXN0ZXIgdGhlIE1CZWFuIGZvciB0aGlzCisgICAgICogPGNvZGU+Q29udGV4dFJlc291cmNlPC9jb2RlPiBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2UgVGhlIENvbnRleHRSZXNvdXJjZSB0byBiZSBtYW5hZ2VkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBNQmVhbiBjYW5ub3QgYmUgZGVyZWdpc3RlcmVkCisgICAgICovCisgICAgc3RhdGljIHZvaWQgZGVzdHJveU1CZWFuKENvbnRleHRSZXNvdXJjZSByZXNvdXJjZSkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgU3RyaW5nIG1uYW1lID0gY3JlYXRlTWFuYWdlZE5hbWUocmVzb3VyY2UpOworICAgICAgICBNYW5hZ2VkQmVhbiBtYW5hZ2VkID0gcmVnaXN0cnkuZmluZE1hbmFnZWRCZWFuKG1uYW1lKTsKKyAgICAgICAgaWYgKG1hbmFnZWQgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBkb21haW4gPSBtYW5hZ2VkLmdldERvbWFpbigpOworICAgICAgICBpZiAoZG9tYWluID09IG51bGwpCisgICAgICAgICAgICBkb21haW4gPSBtc2VydmVyLmdldERlZmF1bHREb21haW4oKTsKKyAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9IGNyZWF0ZU9iamVjdE5hbWUoZG9tYWluLCByZXNvdXJjZSk7CisgICAgICAgIGlmKCBtc2VydmVyLmlzUmVnaXN0ZXJlZChvbmFtZSApKQorICAgICAgICAgICAgbXNlcnZlci51bnJlZ2lzdGVyTUJlYW4ob25hbWUpOworCisgICAgfQorICAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBEZXJlZ2lzdGVyIHRoZSBNQmVhbiBmb3IgdGhpcworICAgICAqIDxjb2RlPkNvbnRleHRSZXNvdXJjZUxpbms8L2NvZGU+IG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNvdXJjZUxpbmsgVGhlIENvbnRleHRSZXNvdXJjZUxpbmsgdG8gYmUgbWFuYWdlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW4gTUJlYW4gY2Fubm90IGJlIGRlcmVnaXN0ZXJlZAorICAgICAqLworICAgIHN0YXRpYyB2b2lkIGRlc3Ryb3lNQmVhbihDb250ZXh0UmVzb3VyY2VMaW5rIHJlc291cmNlTGluaykKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgU3RyaW5nIG1uYW1lID0gY3JlYXRlTWFuYWdlZE5hbWUocmVzb3VyY2VMaW5rKTsKKyAgICAgICAgTWFuYWdlZEJlYW4gbWFuYWdlZCA9IHJlZ2lzdHJ5LmZpbmRNYW5hZ2VkQmVhbihtbmFtZSk7CisgICAgICAgIGlmIChtYW5hZ2VkID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgZG9tYWluID0gbWFuYWdlZC5nZXREb21haW4oKTsKKyAgICAgICAgaWYgKGRvbWFpbiA9PSBudWxsKQorICAgICAgICAgICAgZG9tYWluID0gbXNlcnZlci5nZXREZWZhdWx0RG9tYWluKCk7CisgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPSBjcmVhdGVPYmplY3ROYW1lKGRvbWFpbiwgcmVzb3VyY2VMaW5rKTsKKyAgICAgICAgaWYoIG1zZXJ2ZXIuaXNSZWdpc3RlcmVkKG9uYW1lKSApCisgICAgICAgICAgICBtc2VydmVyLnVucmVnaXN0ZXJNQmVhbihvbmFtZSk7CisKKyAgICB9ICAgCisgICAgCisgICAgCisgICAgLyoqCisgICAgICogRGVyZWdpc3RlciB0aGUgTUJlYW4gZm9yIHRoaXMKKyAgICAgKiA8Y29kZT5EZWZhdWx0Q29udGV4dDwvY29kZT4gb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIERlZmF1bHRDb250ZXh0IHRvIGJlIG1hbmFnZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIE1CZWFuIGNhbm5vdCBiZSBkZXJlZ2lzdGVyZWQKKyAgICAgKi8KKyAgICAvKgorICAgIHN0YXRpYyB2b2lkIGRlc3Ryb3lNQmVhbihEZWZhdWx0Q29udGV4dCBjb250ZXh0KQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBTdHJpbmcgbW5hbWUgPSBjcmVhdGVNYW5hZ2VkTmFtZShjb250ZXh0KTsKKyAgICAgICAgTWFuYWdlZEJlYW4gbWFuYWdlZCA9IHJlZ2lzdHJ5LmZpbmRNYW5hZ2VkQmVhbihtbmFtZSk7CisgICAgICAgIGlmIChtYW5hZ2VkID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgZG9tYWluID0gbWFuYWdlZC5nZXREb21haW4oKTsKKyAgICAgICAgaWYgKGRvbWFpbiA9PSBudWxsKQorICAgICAgICAgICAgZG9tYWluID0gbXNlcnZlci5nZXREZWZhdWx0RG9tYWluKCk7CisgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPSBjcmVhdGVPYmplY3ROYW1lKGRvbWFpbiwgY29udGV4dCk7CisgICAgICAgIGlmKCBtc2VydmVyLmlzUmVnaXN0ZXJlZChvbmFtZSkgKQorICAgICAgICAgICAgbXNlcnZlci51bnJlZ2lzdGVyTUJlYW4ob25hbWUpOworCisgICAgfQorICAgICovCisKKworICAgIC8qKgorICAgICAqIERlcmVnaXN0ZXIgdGhlIE1CZWFuIGZvciB0aGlzCisgICAgICogPGNvZGU+RW5naW5lPC9jb2RlPiBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZW5naW5lIFRoZSBFbmdpbmUgdG8gYmUgbWFuYWdlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW4gTUJlYW4gY2Fubm90IGJlIGRlcmVnaXN0ZXJlZAorICAgICAqLworICAgIHN0YXRpYyB2b2lkIGRlc3Ryb3lNQmVhbihFbmdpbmUgZW5naW5lKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBTdHJpbmcgbW5hbWUgPSBjcmVhdGVNYW5hZ2VkTmFtZShlbmdpbmUpOworICAgICAgICBNYW5hZ2VkQmVhbiBtYW5hZ2VkID0gcmVnaXN0cnkuZmluZE1hbmFnZWRCZWFuKG1uYW1lKTsKKyAgICAgICAgaWYgKG1hbmFnZWQgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBkb21haW4gPSBtYW5hZ2VkLmdldERvbWFpbigpOworICAgICAgICBpZiAoZG9tYWluID09IG51bGwpCisgICAgICAgICAgICBkb21haW4gPSBtc2VydmVyLmdldERlZmF1bHREb21haW4oKTsKKyAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9IGNyZWF0ZU9iamVjdE5hbWUoZG9tYWluLCBlbmdpbmUpOworICAgICAgICBpZiggbXNlcnZlci5pc1JlZ2lzdGVyZWQob25hbWUpICkKKyAgICAgICAgICAgIG1zZXJ2ZXIudW5yZWdpc3Rlck1CZWFuKG9uYW1lKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogRGVyZWdpc3RlciB0aGUgTUJlYW4gZm9yIHRoaXMKKyAgICAgKiA8Y29kZT5Hcm91cDwvY29kZT4gb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIGdyb3VwIFRoZSBHcm91cCB0byBiZSBtYW5hZ2VkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBNQmVhbiBjYW5ub3QgYmUgZGVyZWdpc3RlcmVkCisgICAgICovCisgICAgc3RhdGljIHZvaWQgZGVzdHJveU1CZWFuKEdyb3VwIGdyb3VwKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBTdHJpbmcgbW5hbWUgPSBjcmVhdGVNYW5hZ2VkTmFtZShncm91cCk7CisgICAgICAgIE1hbmFnZWRCZWFuIG1hbmFnZWQgPSByZWdpc3RyeS5maW5kTWFuYWdlZEJlYW4obW5hbWUpOworICAgICAgICBpZiAobWFuYWdlZCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIGRvbWFpbiA9IG1hbmFnZWQuZ2V0RG9tYWluKCk7CisgICAgICAgIGlmIChkb21haW4gPT0gbnVsbCkKKyAgICAgICAgICAgIGRvbWFpbiA9IG1zZXJ2ZXIuZ2V0RGVmYXVsdERvbWFpbigpOworICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0gY3JlYXRlT2JqZWN0TmFtZShkb21haW4sIGdyb3VwKTsKKyAgICAgICAgaWYoIG1zZXJ2ZXIuaXNSZWdpc3RlcmVkKG9uYW1lKSApCisgICAgICAgICAgICBtc2VydmVyLnVucmVnaXN0ZXJNQmVhbihvbmFtZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIERlcmVnaXN0ZXIgdGhlIE1CZWFuIGZvciB0aGlzCisgICAgICogPGNvZGU+SG9zdDwvY29kZT4gb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIGhvc3QgVGhlIEhvc3QgdG8gYmUgbWFuYWdlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW4gTUJlYW4gY2Fubm90IGJlIGRlcmVnaXN0ZXJlZAorICAgICAqLworICAgIHN0YXRpYyB2b2lkIGRlc3Ryb3lNQmVhbihIb3N0IGhvc3QpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIFN0cmluZyBtbmFtZSA9IGNyZWF0ZU1hbmFnZWROYW1lKGhvc3QpOworICAgICAgICBNYW5hZ2VkQmVhbiBtYW5hZ2VkID0gcmVnaXN0cnkuZmluZE1hbmFnZWRCZWFuKG1uYW1lKTsKKyAgICAgICAgaWYgKG1hbmFnZWQgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBkb21haW4gPSBtYW5hZ2VkLmdldERvbWFpbigpOworICAgICAgICBpZiAoZG9tYWluID09IG51bGwpCisgICAgICAgICAgICBkb21haW4gPSBtc2VydmVyLmdldERlZmF1bHREb21haW4oKTsKKyAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9IGNyZWF0ZU9iamVjdE5hbWUoZG9tYWluLCBob3N0KTsKKyAgICAgICAgaWYoIG1zZXJ2ZXIuaXNSZWdpc3RlcmVkKG9uYW1lKSApCisgICAgICAgICAgICBtc2VydmVyLnVucmVnaXN0ZXJNQmVhbihvbmFtZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIERlcmVnaXN0ZXIgdGhlIE1CZWFuIGZvciB0aGlzCisgICAgICogPGNvZGU+TG9hZGVyPC9jb2RlPiBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbG9hZGVyIFRoZSBMb2FkZXIgdG8gYmUgbWFuYWdlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW4gTUJlYW4gY2Fubm90IGJlIGRlcmVnaXN0ZXJlZAorICAgICAqLworICAgIHN0YXRpYyB2b2lkIGRlc3Ryb3lNQmVhbihMb2FkZXIgbG9hZGVyKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBTdHJpbmcgbW5hbWUgPSBjcmVhdGVNYW5hZ2VkTmFtZShsb2FkZXIpOworICAgICAgICBNYW5hZ2VkQmVhbiBtYW5hZ2VkID0gcmVnaXN0cnkuZmluZE1hbmFnZWRCZWFuKG1uYW1lKTsKKyAgICAgICAgaWYgKG1hbmFnZWQgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBkb21haW4gPSBtYW5hZ2VkLmdldERvbWFpbigpOworICAgICAgICBpZiAoZG9tYWluID09IG51bGwpCisgICAgICAgICAgICBkb21haW4gPSBtc2VydmVyLmdldERlZmF1bHREb21haW4oKTsKKyAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9IGNyZWF0ZU9iamVjdE5hbWUoZG9tYWluLCBsb2FkZXIpOworICAgICAgICBpZiggbXNlcnZlci5pc1JlZ2lzdGVyZWQob25hbWUpICkKKyAgICAgICAgICAgIG1zZXJ2ZXIudW5yZWdpc3Rlck1CZWFuKG9uYW1lKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogRGVyZWdpc3RlciB0aGUgTUJlYW4gZm9yIHRoaXMKKyAgICAgKiA8Y29kZT5NYW5hZ2VyPC9jb2RlPiBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFuYWdlciBUaGUgTWFuYWdlciB0byBiZSBtYW5hZ2VkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBNQmVhbiBjYW5ub3QgYmUgZGVyZWdpc3RlcmVkCisgICAgICovCisgICAgc3RhdGljIHZvaWQgZGVzdHJveU1CZWFuKE1hbmFnZXIgbWFuYWdlcikKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgU3RyaW5nIG1uYW1lID0gY3JlYXRlTWFuYWdlZE5hbWUobWFuYWdlcik7CisgICAgICAgIE1hbmFnZWRCZWFuIG1hbmFnZWQgPSByZWdpc3RyeS5maW5kTWFuYWdlZEJlYW4obW5hbWUpOworICAgICAgICBpZiAobWFuYWdlZCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIGRvbWFpbiA9IG1hbmFnZWQuZ2V0RG9tYWluKCk7CisgICAgICAgIGlmIChkb21haW4gPT0gbnVsbCkKKyAgICAgICAgICAgIGRvbWFpbiA9IG1zZXJ2ZXIuZ2V0RGVmYXVsdERvbWFpbigpOworICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0gY3JlYXRlT2JqZWN0TmFtZShkb21haW4sIG1hbmFnZXIpOworICAgICAgICBpZiggbXNlcnZlci5pc1JlZ2lzdGVyZWQob25hbWUpICkKKyAgICAgICAgICAgIG1zZXJ2ZXIudW5yZWdpc3Rlck1CZWFuKG9uYW1lKTsKKworICAgIH0KKyAgICAKKyAgICAKKyAgIC8qKgorICAgICAqIERlcmVnaXN0ZXIgdGhlIE1CZWFuIGZvciB0aGlzCisgICAgICogPGNvZGU+TmFtaW5nUmVzb3VyY2VzPC9jb2RlPiBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VzIFRoZSBOYW1pbmdSZXNvdXJjZXMgdG8gYmUgbWFuYWdlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW4gTUJlYW4gY2Fubm90IGJlIGRlcmVnaXN0ZXJlZAorICAgICAqLworICAgIHN0YXRpYyB2b2lkIGRlc3Ryb3lNQmVhbihOYW1pbmdSZXNvdXJjZXMgcmVzb3VyY2VzKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBTdHJpbmcgbW5hbWUgPSBjcmVhdGVNYW5hZ2VkTmFtZShyZXNvdXJjZXMpOworICAgICAgICBNYW5hZ2VkQmVhbiBtYW5hZ2VkID0gcmVnaXN0cnkuZmluZE1hbmFnZWRCZWFuKG1uYW1lKTsKKyAgICAgICAgaWYgKG1hbmFnZWQgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBkb21haW4gPSBtYW5hZ2VkLmdldERvbWFpbigpOworICAgICAgICBpZiAoZG9tYWluID09IG51bGwpCisgICAgICAgICAgICBkb21haW4gPSBtc2VydmVyLmdldERlZmF1bHREb21haW4oKTsKKyAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9IGNyZWF0ZU9iamVjdE5hbWUoZG9tYWluLCByZXNvdXJjZXMpOworICAgICAgIGlmKCBtc2VydmVyLmlzUmVnaXN0ZXJlZChvbmFtZSkgKQorICAgICAgICAgICAgbXNlcnZlci51bnJlZ2lzdGVyTUJlYW4ob25hbWUpOworCisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIERlcmVnaXN0ZXIgdGhlIE1CZWFuIGZvciB0aGlzCisgICAgICogPGNvZGU+UmVhbG08L2NvZGU+IG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWFsbSBUaGUgUmVhbG0gdG8gYmUgbWFuYWdlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW4gTUJlYW4gY2Fubm90IGJlIGRlcmVnaXN0ZXJlZAorICAgICAqLworICAgIHN0YXRpYyB2b2lkIGRlc3Ryb3lNQmVhbihSZWFsbSByZWFsbSkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgU3RyaW5nIG1uYW1lID0gY3JlYXRlTWFuYWdlZE5hbWUocmVhbG0pOworICAgICAgICBNYW5hZ2VkQmVhbiBtYW5hZ2VkID0gcmVnaXN0cnkuZmluZE1hbmFnZWRCZWFuKG1uYW1lKTsKKyAgICAgICAgaWYgKG1hbmFnZWQgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBkb21haW4gPSBtYW5hZ2VkLmdldERvbWFpbigpOworICAgICAgICBpZiAoZG9tYWluID09IG51bGwpCisgICAgICAgICAgICBkb21haW4gPSBtc2VydmVyLmdldERlZmF1bHREb21haW4oKTsKKyAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9IGNyZWF0ZU9iamVjdE5hbWUoZG9tYWluLCByZWFsbSk7CisgICAgICAgIGlmKCBtc2VydmVyLmlzUmVnaXN0ZXJlZChvbmFtZSkgKQorICAgICAgICAgICAgbXNlcnZlci51bnJlZ2lzdGVyTUJlYW4ob25hbWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBEZXJlZ2lzdGVyIHRoZSBNQmVhbiBmb3IgdGhpcworICAgICAqIDxjb2RlPlJvbGU8L2NvZGU+IG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByb2xlIFRoZSBSb2xlIHRvIGJlIG1hbmFnZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIE1CZWFuIGNhbm5vdCBiZSBkZXJlZ2lzdGVyZWQKKyAgICAgKi8KKyAgICBzdGF0aWMgdm9pZCBkZXN0cm95TUJlYW4oUm9sZSByb2xlKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBTdHJpbmcgbW5hbWUgPSBjcmVhdGVNYW5hZ2VkTmFtZShyb2xlKTsKKyAgICAgICAgTWFuYWdlZEJlYW4gbWFuYWdlZCA9IHJlZ2lzdHJ5LmZpbmRNYW5hZ2VkQmVhbihtbmFtZSk7CisgICAgICAgIGlmIChtYW5hZ2VkID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgZG9tYWluID0gbWFuYWdlZC5nZXREb21haW4oKTsKKyAgICAgICAgaWYgKGRvbWFpbiA9PSBudWxsKQorICAgICAgICAgICAgZG9tYWluID0gbXNlcnZlci5nZXREZWZhdWx0RG9tYWluKCk7CisgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPSBjcmVhdGVPYmplY3ROYW1lKGRvbWFpbiwgcm9sZSk7CisgICAgICAgIGlmKCBtc2VydmVyLmlzUmVnaXN0ZXJlZChvbmFtZSkgKQorICAgICAgICAgICAgbXNlcnZlci51bnJlZ2lzdGVyTUJlYW4ob25hbWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBEZXJlZ2lzdGVyIHRoZSBNQmVhbiBmb3IgdGhpcworICAgICAqIDxjb2RlPlNlcnZlcjwvY29kZT4gb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIHNlcnZlciBUaGUgU2VydmVyIHRvIGJlIG1hbmFnZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIE1CZWFuIGNhbm5vdCBiZSBkZXJlZ2lzdGVyZWQKKyAgICAgKi8KKyAgICBzdGF0aWMgdm9pZCBkZXN0cm95TUJlYW4oU2VydmVyIHNlcnZlcikKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgU3RyaW5nIG1uYW1lID0gY3JlYXRlTWFuYWdlZE5hbWUoc2VydmVyKTsKKyAgICAgICAgTWFuYWdlZEJlYW4gbWFuYWdlZCA9IHJlZ2lzdHJ5LmZpbmRNYW5hZ2VkQmVhbihtbmFtZSk7CisgICAgICAgIGlmIChtYW5hZ2VkID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgZG9tYWluID0gbWFuYWdlZC5nZXREb21haW4oKTsKKyAgICAgICAgaWYgKGRvbWFpbiA9PSBudWxsKQorICAgICAgICAgICAgZG9tYWluID0gbXNlcnZlci5nZXREZWZhdWx0RG9tYWluKCk7CisgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPSBjcmVhdGVPYmplY3ROYW1lKGRvbWFpbiwgc2VydmVyKTsKKyAgICAgICAgaWYoIG1zZXJ2ZXIuaXNSZWdpc3RlcmVkKG9uYW1lKSApCisgICAgICAgICAgICBtc2VydmVyLnVucmVnaXN0ZXJNQmVhbihvbmFtZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIERlcmVnaXN0ZXIgdGhlIE1CZWFuIGZvciB0aGlzCisgICAgICogPGNvZGU+U2VydmljZTwvY29kZT4gb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIHNlcnZpY2UgVGhlIFNlcnZpY2UgdG8gYmUgbWFuYWdlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW4gTUJlYW4gY2Fubm90IGJlIGRlcmVnaXN0ZXJlZAorICAgICAqLworICAgIHN0YXRpYyB2b2lkIGRlc3Ryb3lNQmVhbihTZXJ2aWNlIHNlcnZpY2UpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIFN0cmluZyBtbmFtZSA9IGNyZWF0ZU1hbmFnZWROYW1lKHNlcnZpY2UpOworICAgICAgICBNYW5hZ2VkQmVhbiBtYW5hZ2VkID0gcmVnaXN0cnkuZmluZE1hbmFnZWRCZWFuKG1uYW1lKTsKKyAgICAgICAgaWYgKG1hbmFnZWQgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBkb21haW4gPSBtYW5hZ2VkLmdldERvbWFpbigpOworICAgICAgICBpZiAoZG9tYWluID09IG51bGwpCisgICAgICAgICAgICBkb21haW4gPSBtc2VydmVyLmdldERlZmF1bHREb21haW4oKTsKKyAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9IGNyZWF0ZU9iamVjdE5hbWUoZG9tYWluLCBzZXJ2aWNlKTsKKyAgICAgICAgaWYoIG1zZXJ2ZXIuaXNSZWdpc3RlcmVkKG9uYW1lKSApCisgICAgICAgICAgICBtc2VydmVyLnVucmVnaXN0ZXJNQmVhbihvbmFtZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIERlcmVnaXN0ZXIgdGhlIE1CZWFuIGZvciB0aGlzCisgICAgICogPGNvZGU+VXNlcjwvY29kZT4gb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIHVzZXIgVGhlIFVzZXIgdG8gYmUgbWFuYWdlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW4gTUJlYW4gY2Fubm90IGJlIGRlcmVnaXN0ZXJlZAorICAgICAqLworICAgIHN0YXRpYyB2b2lkIGRlc3Ryb3lNQmVhbihVc2VyIHVzZXIpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIFN0cmluZyBtbmFtZSA9IGNyZWF0ZU1hbmFnZWROYW1lKHVzZXIpOworICAgICAgICBNYW5hZ2VkQmVhbiBtYW5hZ2VkID0gcmVnaXN0cnkuZmluZE1hbmFnZWRCZWFuKG1uYW1lKTsKKyAgICAgICAgaWYgKG1hbmFnZWQgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBkb21haW4gPSBtYW5hZ2VkLmdldERvbWFpbigpOworICAgICAgICBpZiAoZG9tYWluID09IG51bGwpCisgICAgICAgICAgICBkb21haW4gPSBtc2VydmVyLmdldERlZmF1bHREb21haW4oKTsKKyAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9IGNyZWF0ZU9iamVjdE5hbWUoZG9tYWluLCB1c2VyKTsKKyAgICAgICAgaWYoIG1zZXJ2ZXIuaXNSZWdpc3RlcmVkKG9uYW1lKSApCisgICAgICAgICAgICBtc2VydmVyLnVucmVnaXN0ZXJNQmVhbihvbmFtZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIERlcmVnaXN0ZXIgdGhlIE1CZWFuIGZvciB0aGlzCisgICAgICogPGNvZGU+VXNlckRhdGFiYXNlPC9jb2RlPiBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXNlckRhdGFiYXNlIFRoZSBVc2VyRGF0YWJhc2UgdG8gYmUgbWFuYWdlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW4gTUJlYW4gY2Fubm90IGJlIGRlcmVnaXN0ZXJlZAorICAgICAqLworICAgIHN0YXRpYyB2b2lkIGRlc3Ryb3lNQmVhbihVc2VyRGF0YWJhc2UgdXNlckRhdGFiYXNlKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBTdHJpbmcgbW5hbWUgPSBjcmVhdGVNYW5hZ2VkTmFtZSh1c2VyRGF0YWJhc2UpOworICAgICAgICBNYW5hZ2VkQmVhbiBtYW5hZ2VkID0gcmVnaXN0cnkuZmluZE1hbmFnZWRCZWFuKG1uYW1lKTsKKyAgICAgICAgaWYgKG1hbmFnZWQgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBkb21haW4gPSBtYW5hZ2VkLmdldERvbWFpbigpOworICAgICAgICBpZiAoZG9tYWluID09IG51bGwpCisgICAgICAgICAgICBkb21haW4gPSBtc2VydmVyLmdldERlZmF1bHREb21haW4oKTsKKyAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9IGNyZWF0ZU9iamVjdE5hbWUoZG9tYWluLCB1c2VyRGF0YWJhc2UpOworICAgICAgICBpZiggbXNlcnZlci5pc1JlZ2lzdGVyZWQob25hbWUpICkKKyAgICAgICAgICAgIG1zZXJ2ZXIudW5yZWdpc3Rlck1CZWFuKG9uYW1lKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogRGVyZWdpc3RlciB0aGUgTUJlYW4gZm9yIHRoaXMKKyAgICAgKiA8Y29kZT5WYWx2ZTwvY29kZT4gb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHZlIFRoZSBWYWx2ZSB0byBiZSBtYW5hZ2VkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBNQmVhbiBjYW5ub3QgYmUgZGVyZWdpc3RlcmVkCisgICAgICovCisgICAgc3RhdGljIHZvaWQgZGVzdHJveU1CZWFuKFZhbHZlIHZhbHZlLCBDb250YWluZXIgY29udGFpbmVyKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICAoKENvbnRhaW5lZCl2YWx2ZSkuc2V0Q29udGFpbmVyKGNvbnRhaW5lcik7CisgICAgICAgIFN0cmluZyBtbmFtZSA9IGNyZWF0ZU1hbmFnZWROYW1lKHZhbHZlKTsKKyAgICAgICAgTWFuYWdlZEJlYW4gbWFuYWdlZCA9IHJlZ2lzdHJ5LmZpbmRNYW5hZ2VkQmVhbihtbmFtZSk7CisgICAgICAgIGlmIChtYW5hZ2VkID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgZG9tYWluID0gbWFuYWdlZC5nZXREb21haW4oKTsKKyAgICAgICAgaWYgKGRvbWFpbiA9PSBudWxsKQorICAgICAgICAgICAgZG9tYWluID0gbXNlcnZlci5nZXREZWZhdWx0RG9tYWluKCk7CisgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPSBjcmVhdGVPYmplY3ROYW1lKGRvbWFpbiwgdmFsdmUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgKChDb250YWluZWQpdmFsdmUpLnNldENvbnRhaW5lcihudWxsKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgOworICAgICAgICB9CisgICAgICAgIGlmKCBtc2VydmVyLmlzUmVnaXN0ZXJlZChvbmFtZSkgKSB7CisgICAgICAgICAgICBtc2VydmVyLnVucmVnaXN0ZXJNQmVhbihvbmFtZSk7CisgICAgICAgIH0KKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL21iZWFucy9NZW1vcnlVc2VyRGF0YWJhc2VNQmVhbi5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL21iZWFucy9NZW1vcnlVc2VyRGF0YWJhc2VNQmVhbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4MmQ5OTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvbWJlYW5zL01lbW9yeVVzZXJEYXRhYmFzZU1CZWFuLmphdmEKQEAgLTAsMCArMSw0MDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLm1iZWFuczsKKworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NYWxmb3JtZWRPYmplY3ROYW1lRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5FeGNlcHRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5SdW50aW1lT3BlcmF0aW9uc0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkdyb3VwOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuUm9sZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlVzZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Vc2VyRGF0YWJhc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLm1vZGVsZXIuQmFzZU1vZGVsTUJlYW47CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLm1vZGVsZXIuTWFuYWdlZEJlYW47CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLm1vZGVsZXIuUmVnaXN0cnk7CitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5jb21wYXQuSmRrQ29tcGF0OworCisvKioKKyAqIDxwPkEgPHN0cm9uZz5Nb2RlbE1CZWFuPC9zdHJvbmc+IGltcGxlbWVudGF0aW9uIGZvciB0aGUKKyAqIDxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEudXNlcnMuTWVtb3J5VXNlckRhdGFiYXNlPC9jb2RlPiBjb21wb25lbnQuPC9wPgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgTWVtb3J5VXNlckRhdGFiYXNlTUJlYW4gZXh0ZW5kcyBCYXNlTW9kZWxNQmVhbiB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSA8Y29kZT5Nb2RlbE1CZWFuPC9jb2RlPiB3aXRoIGRlZmF1bHQKKyAgICAgKiA8Y29kZT5Nb2RlbE1CZWFuSW5mbzwvY29kZT4gaW5mb3JtYXRpb24uCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIE1CZWFuRXhjZXB0aW9uIGlmIHRoZSBpbml0aWFsaXplciBvZiBhbiBvYmplY3QKKyAgICAgKiAgdGhyb3dzIGFuIGV4Y2VwdGlvbgorICAgICAqIEBleGNlcHRpb24gUnVudGltZU9wZXJhdGlvbnNFeGNlcHRpb24gaWYgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBNZW1vcnlVc2VyRGF0YWJhc2VNQmVhbigpCisgICAgICAgIHRocm93cyBNQmVhbkV4Y2VwdGlvbiwgUnVudGltZU9wZXJhdGlvbnNFeGNlcHRpb24geworCisgICAgICAgIHN1cGVyKCk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENsYXNzIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBKREsgY29tcGF0aWJpbGl0eSBzdXBwb3J0CisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmRrQ29tcGF0IGpka0NvbXBhdCA9IEpka0NvbXBhdC5nZXRKZGtDb21wYXQoKTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIHJlZ2lzdHJ5IGZvciBvdXIgbWFuYWdlZCBiZWFucy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUmVnaXN0cnkgcmVnaXN0cnkgPSBNQmVhblV0aWxzLmNyZWF0ZVJlZ2lzdHJ5KCk7CisKKworICAgIC8qKgorICAgICAqIFRoZSA8Y29kZT5NQmVhblNlcnZlcjwvY29kZT4gaW4gd2hpY2ggd2UgYXJlIHJlZ2lzdGVyZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIE1CZWFuU2VydmVyIG1zZXJ2ZXIgPSBNQmVhblV0aWxzLmNyZWF0ZVNlcnZlcigpOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgPGNvZGU+TWFuYWdlZEJlYW48L2NvZGU+IGluZm9ybWF0aW9uIGRlc2NyaWJpbmcgdGhpcyBNQmVhbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTWFuYWdlZEJlYW4gbWFuYWdlZCA9CisgICAgICAgIHJlZ2lzdHJ5LmZpbmRNYW5hZ2VkQmVhbigiTWVtb3J5VXNlckRhdGFiYXNlIik7CisKKworICAgIC8qKgorICAgICAqIFRoZSA8Y29kZT5NYW5hZ2VkQmVhbjwvY29kZT4gaW5mb3JtYXRpb24gZGVzY3JpYmluZyBHcm91cCBNQmVhbnMuCisgICAgICovCisgICAgcHJvdGVjdGVkIE1hbmFnZWRCZWFuIG1hbmFnZWRHcm91cCA9CisgICAgICAgIHJlZ2lzdHJ5LmZpbmRNYW5hZ2VkQmVhbigiR3JvdXAiKTsKKworCisgICAgLyoqCisgICAgICogVGhlIDxjb2RlPk1hbmFnZWRCZWFuPC9jb2RlPiBpbmZvcm1hdGlvbiBkZXNjcmliaW5nIEdyb3VwIE1CZWFucy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTWFuYWdlZEJlYW4gbWFuYWdlZFJvbGUgPQorICAgICAgICByZWdpc3RyeS5maW5kTWFuYWdlZEJlYW4oIlJvbGUiKTsKKworCisgICAgLyoqCisgICAgICogVGhlIDxjb2RlPk1hbmFnZWRCZWFuPC9jb2RlPiBpbmZvcm1hdGlvbiBkZXNjcmliaW5nIFVzZXIgTUJlYW5zLgorICAgICAqLworICAgIHByb3RlY3RlZCBNYW5hZ2VkQmVhbiBtYW5hZ2VkVXNlciA9CisgICAgICAgIHJlZ2lzdHJ5LmZpbmRNYW5hZ2VkQmVhbigiVXNlciIpOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEF0dHJpYnV0ZXMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBNQmVhbiBOYW1lcyBvZiBhbGwgZ3JvdXBzIGRlZmluZWQgaW4gdGhpcyBkYXRhYmFzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0R3JvdXBzKCkgeworCisgICAgICAgIFVzZXJEYXRhYmFzZSBkYXRhYmFzZSA9IChVc2VyRGF0YWJhc2UpIHRoaXMucmVzb3VyY2U7CisgICAgICAgIEFycmF5TGlzdCByZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBJdGVyYXRvciBncm91cHMgPSBkYXRhYmFzZS5nZXRHcm91cHMoKTsKKyAgICAgICAgd2hpbGUgKGdyb3Vwcy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIEdyb3VwIGdyb3VwID0gKEdyb3VwKSBncm91cHMubmV4dCgpOworICAgICAgICAgICAgcmVzdWx0cy5hZGQoZmluZEdyb3VwKGdyb3VwLmdldEdyb3VwbmFtZSgpKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICgoU3RyaW5nW10pIHJlc3VsdHMudG9BcnJheShuZXcgU3RyaW5nW3Jlc3VsdHMuc2l6ZSgpXSkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIE1CZWFuIE5hbWVzIG9mIGFsbCByb2xlcyBkZWZpbmVkIGluIHRoaXMgZGF0YWJhc2UuCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGdldFJvbGVzKCkgeworCisgICAgICAgIFVzZXJEYXRhYmFzZSBkYXRhYmFzZSA9IChVc2VyRGF0YWJhc2UpIHRoaXMucmVzb3VyY2U7CisgICAgICAgIEFycmF5TGlzdCByZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBJdGVyYXRvciByb2xlcyA9IGRhdGFiYXNlLmdldFJvbGVzKCk7CisgICAgICAgIHdoaWxlIChyb2xlcy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIFJvbGUgcm9sZSA9IChSb2xlKSByb2xlcy5uZXh0KCk7CisgICAgICAgICAgICByZXN1bHRzLmFkZChmaW5kUm9sZShyb2xlLmdldFJvbGVuYW1lKCkpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKChTdHJpbmdbXSkgcmVzdWx0cy50b0FycmF5KG5ldyBTdHJpbmdbcmVzdWx0cy5zaXplKCldKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgTUJlYW4gTmFtZXMgb2YgYWxsIHVzZXJzIGRlZmluZWQgaW4gdGhpcyBkYXRhYmFzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VXNlcnMoKSB7CisKKyAgICAgICAgVXNlckRhdGFiYXNlIGRhdGFiYXNlID0gKFVzZXJEYXRhYmFzZSkgdGhpcy5yZXNvdXJjZTsKKyAgICAgICAgQXJyYXlMaXN0IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIEl0ZXJhdG9yIHVzZXJzID0gZGF0YWJhc2UuZ2V0VXNlcnMoKTsKKyAgICAgICAgd2hpbGUgKHVzZXJzLmhhc05leHQoKSkgeworICAgICAgICAgICAgVXNlciB1c2VyID0gKFVzZXIpIHVzZXJzLm5leHQoKTsKKyAgICAgICAgICAgIHJlc3VsdHMuYWRkKGZpbmRVc2VyKHVzZXIuZ2V0VXNlcm5hbWUoKSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoKFN0cmluZ1tdKSByZXN1bHRzLnRvQXJyYXkobmV3IFN0cmluZ1tyZXN1bHRzLnNpemUoKV0pKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBPcGVyYXRpb25zCisKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBHcm91cCBhbmQgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIE1CZWFuIE5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZ3JvdXBuYW1lIEdyb3VwIG5hbWUgb2YgdGhlIG5ldyBncm91cAorICAgICAqIEBwYXJhbSBkZXNjcmlwdGlvbiBEZXNjcmlwdGlvbiBvZiB0aGUgbmV3IGdyb3VwCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBjcmVhdGVHcm91cChTdHJpbmcgZ3JvdXBuYW1lLCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKKworICAgICAgICBVc2VyRGF0YWJhc2UgZGF0YWJhc2UgPSAoVXNlckRhdGFiYXNlKSB0aGlzLnJlc291cmNlOworICAgICAgICBHcm91cCBncm91cCA9IGRhdGFiYXNlLmNyZWF0ZUdyb3VwKGdyb3VwbmFtZSwgZGVzY3JpcHRpb24pOworICAgICAgICB0cnkgeworICAgICAgICAgICAgTUJlYW5VdGlscy5jcmVhdGVNQmVhbihncm91cCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWFlID0gbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICgiRXhjZXB0aW9uIGNyZWF0aW5nIGdyb3VwICIgKyBncm91cCArICIgTUJlYW4iKTsKKyAgICAgICAgICAgIGpka0NvbXBhdC5jaGFpbkV4Y2VwdGlvbihpYWUsIGUpOworICAgICAgICAgICAgdGhyb3cgaWFlOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoZmluZEdyb3VwKGdyb3VwbmFtZSkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgUm9sZSBhbmQgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIE1CZWFuIE5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcm9sZW5hbWUgR3JvdXAgbmFtZSBvZiB0aGUgbmV3IGdyb3VwCisgICAgICogQHBhcmFtIGRlc2NyaXB0aW9uIERlc2NyaXB0aW9uIG9mIHRoZSBuZXcgZ3JvdXAKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZVJvbGUoU3RyaW5nIHJvbGVuYW1lLCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKKworICAgICAgICBVc2VyRGF0YWJhc2UgZGF0YWJhc2UgPSAoVXNlckRhdGFiYXNlKSB0aGlzLnJlc291cmNlOworICAgICAgICBSb2xlIHJvbGUgPSBkYXRhYmFzZS5jcmVhdGVSb2xlKHJvbGVuYW1lLCBkZXNjcmlwdGlvbik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBNQmVhblV0aWxzLmNyZWF0ZU1CZWFuKHJvbGUpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlhZSA9IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoIkV4Y2VwdGlvbiBjcmVhdGluZyByb2xlICIgKyByb2xlICsgIiBNQmVhbiIpOworICAgICAgICAgICAgamRrQ29tcGF0LmNoYWluRXhjZXB0aW9uKGlhZSwgZSk7CisgICAgICAgICAgICB0aHJvdyBpYWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChmaW5kUm9sZShyb2xlbmFtZSkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgVXNlciBhbmQgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIE1CZWFuIE5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXNlcm5hbWUgVXNlciBuYW1lIG9mIHRoZSBuZXcgdXNlcgorICAgICAqIEBwYXJhbSBwYXNzd29yZCBQYXNzd29yZCBmb3IgdGhlIG5ldyB1c2VyCisgICAgICogQHBhcmFtIGZ1bGxOYW1lIEZ1bGwgbmFtZSBmb3IgdGhlIG5ldyB1c2VyCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBjcmVhdGVVc2VyKFN0cmluZyB1c2VybmFtZSwgU3RyaW5nIHBhc3N3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZnVsbE5hbWUpIHsKKworICAgICAgICBVc2VyRGF0YWJhc2UgZGF0YWJhc2UgPSAoVXNlckRhdGFiYXNlKSB0aGlzLnJlc291cmNlOworICAgICAgICBVc2VyIHVzZXIgPSBkYXRhYmFzZS5jcmVhdGVVc2VyKHVzZXJuYW1lLCBwYXNzd29yZCwgZnVsbE5hbWUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgTUJlYW5VdGlscy5jcmVhdGVNQmVhbih1c2VyKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUgPSBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKCJFeGNlcHRpb24gY3JlYXRpbmcgdXNlciAiICsgdXNlciArICIgTUJlYW4iKTsKKyAgICAgICAgICAgIGpka0NvbXBhdC5jaGFpbkV4Y2VwdGlvbihpYWUsIGUpOworICAgICAgICAgICAgdGhyb3cgaWFlOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoZmluZFVzZXIodXNlcm5hbWUpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBNQmVhbiBOYW1lIGZvciB0aGUgc3BlY2lmaWVkIGdyb3VwIG5hbWUgKGlmIGFueSk7CisgICAgICogb3RoZXJ3aXNlIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBncm91cG5hbWUgR3JvdXAgbmFtZSB0byBsb29rIHVwCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBmaW5kR3JvdXAoU3RyaW5nIGdyb3VwbmFtZSkgeworCisgICAgICAgIFVzZXJEYXRhYmFzZSBkYXRhYmFzZSA9IChVc2VyRGF0YWJhc2UpIHRoaXMucmVzb3VyY2U7CisgICAgICAgIEdyb3VwIGdyb3VwID0gZGF0YWJhc2UuZmluZEdyb3VwKGdyb3VwbmFtZSk7CisgICAgICAgIGlmIChncm91cCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0KKyAgICAgICAgICAgICAgICBNQmVhblV0aWxzLmNyZWF0ZU9iamVjdE5hbWUobWFuYWdlZEdyb3VwLmdldERvbWFpbigpLCBncm91cCk7CisgICAgICAgICAgICByZXR1cm4gKG9uYW1lLnRvU3RyaW5nKCkpOworICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRPYmplY3ROYW1lRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUgPSBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKCJDYW5ub3QgY3JlYXRlIG9iamVjdCBuYW1lIGZvciBncm91cCAiICsgZ3JvdXApOworICAgICAgICAgICAgamRrQ29tcGF0LmNoYWluRXhjZXB0aW9uKGlhZSwgZSk7CisgICAgICAgICAgICB0aHJvdyBpYWU7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBNQmVhbiBOYW1lIGZvciB0aGUgc3BlY2lmaWVkIHJvbGUgbmFtZSAoaWYgYW55KTsKKyAgICAgKiBvdGhlcndpc2UgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIHJvbGVuYW1lIFJvbGUgbmFtZSB0byBsb29rIHVwCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBmaW5kUm9sZShTdHJpbmcgcm9sZW5hbWUpIHsKKworICAgICAgICBVc2VyRGF0YWJhc2UgZGF0YWJhc2UgPSAoVXNlckRhdGFiYXNlKSB0aGlzLnJlc291cmNlOworICAgICAgICBSb2xlIHJvbGUgPSBkYXRhYmFzZS5maW5kUm9sZShyb2xlbmFtZSk7CisgICAgICAgIGlmIChyb2xlID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPQorICAgICAgICAgICAgICAgIE1CZWFuVXRpbHMuY3JlYXRlT2JqZWN0TmFtZShtYW5hZ2VkUm9sZS5nZXREb21haW4oKSwgcm9sZSk7CisgICAgICAgICAgICByZXR1cm4gKG9uYW1lLnRvU3RyaW5nKCkpOworICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRPYmplY3ROYW1lRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUgPSBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKCJDYW5ub3QgY3JlYXRlIG9iamVjdCBuYW1lIGZvciByb2xlICIgKyByb2xlKTsKKyAgICAgICAgICAgIGpka0NvbXBhdC5jaGFpbkV4Y2VwdGlvbihpYWUsIGUpOworICAgICAgICAgICAgdGhyb3cgaWFlOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgTUJlYW4gTmFtZSBmb3IgdGhlIHNwZWNpZmllZCB1c2VyIG5hbWUgKGlmIGFueSk7CisgICAgICogb3RoZXJ3aXNlIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1c2VybmFtZSBVc2VyIG5hbWUgdG8gbG9vayB1cAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZmluZFVzZXIoU3RyaW5nIHVzZXJuYW1lKSB7CisKKyAgICAgICAgVXNlckRhdGFiYXNlIGRhdGFiYXNlID0gKFVzZXJEYXRhYmFzZSkgdGhpcy5yZXNvdXJjZTsKKyAgICAgICAgVXNlciB1c2VyID0gZGF0YWJhc2UuZmluZFVzZXIodXNlcm5hbWUpOworICAgICAgICBpZiAodXNlciA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0KKyAgICAgICAgICAgICAgICBNQmVhblV0aWxzLmNyZWF0ZU9iamVjdE5hbWUobWFuYWdlZFVzZXIuZ2V0RG9tYWluKCksIHVzZXIpOworICAgICAgICAgICAgcmV0dXJuIChvbmFtZS50b1N0cmluZygpKTsKKyAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWFlID0gbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICgiQ2Fubm90IGNyZWF0ZSBvYmplY3QgbmFtZSBmb3IgdXNlciAiICsgdXNlcik7CisgICAgICAgICAgICBqZGtDb21wYXQuY2hhaW5FeGNlcHRpb24oaWFlLCBlKTsKKyAgICAgICAgICAgIHRocm93IGlhZTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYW4gZXhpc3RpbmcgZ3JvdXAgYW5kIGRlc3Ryb3kgdGhlIGNvcnJlc3BvbmRpbmcgTUJlYW4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZ3JvdXBuYW1lIEdyb3VwIG5hbWUgdG8gcmVtb3ZlCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlR3JvdXAoU3RyaW5nIGdyb3VwbmFtZSkgeworCisgICAgICAgIFVzZXJEYXRhYmFzZSBkYXRhYmFzZSA9IChVc2VyRGF0YWJhc2UpIHRoaXMucmVzb3VyY2U7CisgICAgICAgIEdyb3VwIGdyb3VwID0gZGF0YWJhc2UuZmluZEdyb3VwKGdyb3VwbmFtZSk7CisgICAgICAgIGlmIChncm91cCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE1CZWFuVXRpbHMuZGVzdHJveU1CZWFuKGdyb3VwKTsKKyAgICAgICAgICAgIGRhdGFiYXNlLnJlbW92ZUdyb3VwKGdyb3VwKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUgPSBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKCJFeGNlcHRpb24gZGVzdHJveWluZyBncm91cCAiICsgZ3JvdXAgKyAiIE1CZWFuIik7CisgICAgICAgICAgICBqZGtDb21wYXQuY2hhaW5FeGNlcHRpb24oaWFlLCBlKTsKKyAgICAgICAgICAgIHRocm93IGlhZTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYW4gZXhpc3Rpbmcgcm9sZSBhbmQgZGVzdHJveSB0aGUgY29ycmVzcG9uZGluZyBNQmVhbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSByb2xlbmFtZSBSb2xlIG5hbWUgdG8gcmVtb3ZlCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlUm9sZShTdHJpbmcgcm9sZW5hbWUpIHsKKworICAgICAgICBVc2VyRGF0YWJhc2UgZGF0YWJhc2UgPSAoVXNlckRhdGFiYXNlKSB0aGlzLnJlc291cmNlOworICAgICAgICBSb2xlIHJvbGUgPSBkYXRhYmFzZS5maW5kUm9sZShyb2xlbmFtZSk7CisgICAgICAgIGlmIChyb2xlID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgTUJlYW5VdGlscy5kZXN0cm95TUJlYW4ocm9sZSk7CisgICAgICAgICAgICBkYXRhYmFzZS5yZW1vdmVSb2xlKHJvbGUpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlhZSA9IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoIkV4Y2VwdGlvbiBkZXN0cm95aW5nIHJvbGUgIiArIHJvbGUgKyAiIE1CZWFuIik7CisgICAgICAgICAgICBqZGtDb21wYXQuY2hhaW5FeGNlcHRpb24oaWFlLCBlKTsKKyAgICAgICAgICAgIHRocm93IGlhZTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYW4gZXhpc3RpbmcgdXNlciBhbmQgZGVzdHJveSB0aGUgY29ycmVzcG9uZGluZyBNQmVhbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1c2VybmFtZSBVc2VyIG5hbWUgdG8gcmVtb3ZlCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlVXNlcihTdHJpbmcgdXNlcm5hbWUpIHsKKworICAgICAgICBVc2VyRGF0YWJhc2UgZGF0YWJhc2UgPSAoVXNlckRhdGFiYXNlKSB0aGlzLnJlc291cmNlOworICAgICAgICBVc2VyIHVzZXIgPSBkYXRhYmFzZS5maW5kVXNlcih1c2VybmFtZSk7CisgICAgICAgIGlmICh1c2VyID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgTUJlYW5VdGlscy5kZXN0cm95TUJlYW4odXNlcik7CisgICAgICAgICAgICBkYXRhYmFzZS5yZW1vdmVVc2VyKHVzZXIpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlhZSA9IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoIkV4Y2VwdGlvbiBkZXN0cm95aW5nIHVzZXIgIiArIHVzZXIgKyAiIE1CZWFuIik7CisgICAgICAgICAgICBqZGtDb21wYXQuY2hhaW5FeGNlcHRpb24oaWFlLCBlKTsKKyAgICAgICAgICAgIHRocm93IGlhZTsKKyAgICAgICAgfQorCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9tYmVhbnMvTmFtaW5nUmVzb3VyY2VzTUJlYW4uamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9tYmVhbnMvTmFtaW5nUmVzb3VyY2VzTUJlYW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDA4NGZkCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL21iZWFucy9OYW1pbmdSZXNvdXJjZXNNQmVhbi5qYXZhCkBAIC0wLDAgKzEsMzMzIEBACisvKgorICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5tYmVhbnM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1hbGZvcm1lZE9iamVjdE5hbWVFeGNlcHRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuUnVudGltZU9wZXJhdGlvbnNFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5Db250ZXh0RW52aXJvbm1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuQ29udGV4dFJlc291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkNvbnRleHRSZXNvdXJjZUxpbms7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuTmFtaW5nUmVzb3VyY2VzOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5tb2RlbGVyLkJhc2VNb2RlbE1CZWFuOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5tb2RlbGVyLk1hbmFnZWRCZWFuOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5tb2RlbGVyLlJlZ2lzdHJ5OworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuY29tcGF0Lkpka0NvbXBhdDsKKworLyoqCisgKiA8cD5BIDxzdHJvbmc+TW9kZWxNQmVhbjwvc3Ryb25nPiBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlCisgKiA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5OYW1pbmdSZXNvdXJjZXM8L2NvZGU+IGNvbXBvbmVudC48L3A+CisgKgorICogQGF1dGhvciBBbXkgUm9oCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBOYW1pbmdSZXNvdXJjZXNNQmVhbiBleHRlbmRzIEJhc2VNb2RlbE1CZWFuIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIDxjb2RlPk1vZGVsTUJlYW48L2NvZGU+IHdpdGggZGVmYXVsdAorICAgICAqIDxjb2RlPk1vZGVsTUJlYW5JbmZvPC9jb2RlPiBpbmZvcm1hdGlvbi4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTUJlYW5FeGNlcHRpb24gaWYgdGhlIGluaXRpYWxpemVyIG9mIGFuIG9iamVjdAorICAgICAqICB0aHJvd3MgYW4gZXhjZXB0aW9uCisgICAgICogQGV4Y2VwdGlvbiBSdW50aW1lT3BlcmF0aW9uc0V4Y2VwdGlvbiBpZiBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgb2NjdXJzCisgICAgICovCisgICAgcHVibGljIE5hbWluZ1Jlc291cmNlc01CZWFuKCkKKyAgICAgICAgdGhyb3dzIE1CZWFuRXhjZXB0aW9uLCBSdW50aW1lT3BlcmF0aW9uc0V4Y2VwdGlvbiB7CisKKyAgICAgICAgc3VwZXIoKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ2xhc3MgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIEpESyBjb21wYXRpYmlsaXR5IHN1cHBvcnQKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBKZGtDb21wYXQgamRrQ29tcGF0ID0gSmRrQ29tcGF0LmdldEpka0NvbXBhdCgpOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiByZWdpc3RyeSBmb3Igb3VyIG1hbmFnZWQgYmVhbnMuCisgICAgICovCisgICAgcHJvdGVjdGVkIFJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gTUJlYW5VdGlscy5jcmVhdGVSZWdpc3RyeSgpOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgPGNvZGU+TWFuYWdlZEJlYW48L2NvZGU+IGluZm9ybWF0aW9uIGRlc2NyaWJpbmcgdGhpcyBNQmVhbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTWFuYWdlZEJlYW4gbWFuYWdlZCA9CisgICAgICAgIHJlZ2lzdHJ5LmZpbmRNYW5hZ2VkQmVhbigiTmFtaW5nUmVzb3VyY2VzIik7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEF0dHJpYnV0ZXMKKyAgICAKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgTUJlYW4gTmFtZXMgb2YgdGhlIHNldCBvZiBkZWZpbmVkIGVudmlyb25tZW50IGVudHJpZXMgZm9yICAKKyAgICAgKiB0aGlzIHdlYiBhcHBsaWNhdGlvbgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRFbnZpcm9ubWVudHMoKSB7CisgICAgICAgIENvbnRleHRFbnZpcm9ubWVudFtdIGVudnMgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE5hbWluZ1Jlc291cmNlcyl0aGlzLnJlc291cmNlKS5maW5kRW52aXJvbm1lbnRzKCk7CisgICAgICAgIEFycmF5TGlzdCByZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVudnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9CisgICAgICAgICAgICAgICAgICAgIE1CZWFuVXRpbHMuY3JlYXRlT2JqZWN0TmFtZShtYW5hZ2VkLmdldERvbWFpbigpLCBlbnZzW2ldKTsKKyAgICAgICAgICAgICAgICByZXN1bHRzLmFkZChvbmFtZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZE9iamVjdE5hbWVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUgPSBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgICgiQ2Fubm90IGNyZWF0ZSBvYmplY3QgbmFtZSBmb3IgZW52aXJvbm1lbnQgIiArIGVudnNbaV0pOworICAgICAgICAgICAgICAgIGpka0NvbXBhdC5jaGFpbkV4Y2VwdGlvbihpYWUsIGUpOworICAgICAgICAgICAgICAgIHRocm93IGlhZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKChTdHJpbmdbXSkgcmVzdWx0cy50b0FycmF5KG5ldyBTdHJpbmdbcmVzdWx0cy5zaXplKCldKSk7CisKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBNQmVhbiBOYW1lcyBvZiBhbGwgdGhlIGRlZmluZWQgcmVzb3VyY2UgcmVmZXJlbmNlcyBmb3IgdGhpcworICAgICAqIGFwcGxpY2F0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRSZXNvdXJjZXMoKSB7CisgICAgICAgIAorICAgICAgICBDb250ZXh0UmVzb3VyY2VbXSByZXNvdXJjZXMgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE5hbWluZ1Jlc291cmNlcyl0aGlzLnJlc291cmNlKS5maW5kUmVzb3VyY2VzKCk7CisgICAgICAgIEFycmF5TGlzdCByZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0KKyAgICAgICAgICAgICAgICAgICAgTUJlYW5VdGlscy5jcmVhdGVPYmplY3ROYW1lKG1hbmFnZWQuZ2V0RG9tYWluKCksIHJlc291cmNlc1tpXSk7CisgICAgICAgICAgICAgICAgcmVzdWx0cy5hZGQob25hbWUudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRPYmplY3ROYW1lRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWFlID0gbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAoIkNhbm5vdCBjcmVhdGUgb2JqZWN0IG5hbWUgZm9yIHJlc291cmNlICIgKyByZXNvdXJjZXNbaV0pOworICAgICAgICAgICAgICAgIGpka0NvbXBhdC5jaGFpbkV4Y2VwdGlvbihpYWUsIGUpOworICAgICAgICAgICAgICAgIHRocm93IGlhZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKChTdHJpbmdbXSkgcmVzdWx0cy50b0FycmF5KG5ldyBTdHJpbmdbcmVzdWx0cy5zaXplKCldKSk7CisKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBNQmVhbiBOYW1lcyBvZiBhbGwgdGhlIGRlZmluZWQgcmVzb3VyY2UgbGluayByZWZlcmVuY2VzIGZvciAKKyAgICAgKiB0aGlzIGFwcGxpY2F0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRSZXNvdXJjZUxpbmtzKCkgeworICAgICAgICAKKyAgICAgICAgQ29udGV4dFJlc291cmNlTGlua1tdIHJlc291cmNlTGlua3MgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE5hbWluZ1Jlc291cmNlcyl0aGlzLnJlc291cmNlKS5maW5kUmVzb3VyY2VMaW5rcygpOworICAgICAgICBBcnJheUxpc3QgcmVzdWx0cyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXNvdXJjZUxpbmtzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPQorICAgICAgICAgICAgICAgICAgICBNQmVhblV0aWxzLmNyZWF0ZU9iamVjdE5hbWUobWFuYWdlZC5nZXREb21haW4oKSwgcmVzb3VyY2VMaW5rc1tpXSk7CisgICAgICAgICAgICAgICAgcmVzdWx0cy5hZGQob25hbWUudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRPYmplY3ROYW1lRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWFlID0gbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAoIkNhbm5vdCBjcmVhdGUgb2JqZWN0IG5hbWUgZm9yIHJlc291cmNlICIgKyByZXNvdXJjZUxpbmtzW2ldKTsKKyAgICAgICAgICAgICAgICBqZGtDb21wYXQuY2hhaW5FeGNlcHRpb24oaWFlLCBlKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBpYWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICgoU3RyaW5nW10pIHJlc3VsdHMudG9BcnJheShuZXcgU3RyaW5nW3Jlc3VsdHMuc2l6ZSgpXSkpOworCisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBPcGVyYXRpb25zCisKKworICAgIC8qKgorICAgICAqIEFkZCBhbiBlbnZpcm9ubWVudCBlbnRyeSBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZW52TmFtZSBOZXcgZW52aXJvbm1lbnQgZW50cnkgbmFtZQorICAgICAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIG9mIHRoZSBuZXcgZW52aXJvbm1lbnQgZW50cnkKKyAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBuZXcgZW52aXJvbm1lbnQgZW50cnkgCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBhZGRFbnZpcm9ubWVudChTdHJpbmcgZW52TmFtZSwgU3RyaW5nIHR5cGUsIFN0cmluZyB2YWx1ZSkgCisgICAgICAgIHRocm93cyBNYWxmb3JtZWRPYmplY3ROYW1lRXhjZXB0aW9uIHsKKworICAgICAgICBOYW1pbmdSZXNvdXJjZXMgbnJlc291cmNlcyA9IChOYW1pbmdSZXNvdXJjZXMpIHRoaXMucmVzb3VyY2U7CisgICAgICAgIGlmIChucmVzb3VyY2VzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIENvbnRleHRFbnZpcm9ubWVudCBlbnYgPSBucmVzb3VyY2VzLmZpbmRFbnZpcm9ubWVudChlbnZOYW1lKTsKKyAgICAgICAgaWYgKGVudiAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKCJJbnZhbGlkIGVudmlyb25tZW50IG5hbWUgLSBhbHJlYWR5IGV4aXN0cyAnIiArIGVudk5hbWUgKyAiJyIpOworICAgICAgICB9CisgICAgICAgIGVudiA9IG5ldyBDb250ZXh0RW52aXJvbm1lbnQoKTsKKyAgICAgICAgZW52LnNldE5hbWUoZW52TmFtZSk7CisgICAgICAgIGVudi5zZXRUeXBlKHR5cGUpOworICAgICAgICBlbnYuc2V0VmFsdWUodmFsdWUpOworICAgICAgICBucmVzb3VyY2VzLmFkZEVudmlyb25tZW50KGVudik7CisgICAgICAgIAorICAgICAgICAvLyBSZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgTUJlYW4gbmFtZQorICAgICAgICBNYW5hZ2VkQmVhbiBtYW5hZ2VkID0gcmVnaXN0cnkuZmluZE1hbmFnZWRCZWFuKCJDb250ZXh0RW52aXJvbm1lbnQiKTsKKyAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9CisgICAgICAgICAgICBNQmVhblV0aWxzLmNyZWF0ZU9iamVjdE5hbWUobWFuYWdlZC5nZXREb21haW4oKSwgZW52KTsKKyAgICAgICAgcmV0dXJuIChvbmFtZS50b1N0cmluZygpKTsKKyAgICAgICAgCisgICAgfQorCisgICAgCisgICAgLyoqCisgICAgICogQWRkIGEgcmVzb3VyY2UgcmVmZXJlbmNlIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNvdXJjZU5hbWUgTmV3IHJlc291cmNlIHJlZmVyZW5jZSBuYW1lCisgICAgICogQHBhcmFtIHR5cGUgTmV3IHJlc291cmNlIHJlZmVyZW5jZSB0eXBlCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBhZGRSZXNvdXJjZShTdHJpbmcgcmVzb3VyY2VOYW1lLCBTdHJpbmcgdHlwZSkgCisgICAgICAgIHRocm93cyBNYWxmb3JtZWRPYmplY3ROYW1lRXhjZXB0aW9uIHsKKyAgICAgICAgCisgICAgICAgIE5hbWluZ1Jlc291cmNlcyBucmVzb3VyY2VzID0gKE5hbWluZ1Jlc291cmNlcykgdGhpcy5yZXNvdXJjZTsKKyAgICAgICAgaWYgKG5yZXNvdXJjZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgQ29udGV4dFJlc291cmNlIHJlc291cmNlID0gbnJlc291cmNlcy5maW5kUmVzb3VyY2UocmVzb3VyY2VOYW1lKTsKKyAgICAgICAgaWYgKHJlc291cmNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoIkludmFsaWQgcmVzb3VyY2UgbmFtZSAtIGFscmVhZHkgZXhpc3RzJyIgKyByZXNvdXJjZU5hbWUgKyAiJyIpOworICAgICAgICB9CisgICAgICAgIHJlc291cmNlID0gbmV3IENvbnRleHRSZXNvdXJjZSgpOworICAgICAgICByZXNvdXJjZS5zZXROYW1lKHJlc291cmNlTmFtZSk7CisgICAgICAgIHJlc291cmNlLnNldFR5cGUodHlwZSk7CisgICAgICAgIG5yZXNvdXJjZXMuYWRkUmVzb3VyY2UocmVzb3VyY2UpOworICAgICAgICAKKyAgICAgICAgLy8gUmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIE1CZWFuIG5hbWUKKyAgICAgICAgTWFuYWdlZEJlYW4gbWFuYWdlZCA9IHJlZ2lzdHJ5LmZpbmRNYW5hZ2VkQmVhbigiQ29udGV4dFJlc291cmNlIik7CisgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPQorICAgICAgICAgICAgTUJlYW5VdGlscy5jcmVhdGVPYmplY3ROYW1lKG1hbmFnZWQuZ2V0RG9tYWluKCksIHJlc291cmNlKTsKKyAgICAgICAgcmV0dXJuIChvbmFtZS50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICAKKyAgICAvKioKKyAgICAgKiBBZGQgYSByZXNvdXJjZSBsaW5rIHJlZmVyZW5jZSBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VMaW5rTmFtZSBOZXcgcmVzb3VyY2UgbGluayByZWZlcmVuY2UgbmFtZQorICAgICAqIEBwYXJhbSB0eXBlIE5ldyByZXNvdXJjZSBsaW5rIHJlZmVyZW5jZSB0eXBlCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBhZGRSZXNvdXJjZUxpbmsoU3RyaW5nIHJlc291cmNlTGlua05hbWUsIFN0cmluZyB0eXBlKQorICAgICAgICB0aHJvd3MgTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbiB7CisgICAgICAgIAorICAgICAgICBOYW1pbmdSZXNvdXJjZXMgbnJlc291cmNlcyA9IChOYW1pbmdSZXNvdXJjZXMpIHRoaXMucmVzb3VyY2U7CisgICAgICAgIGlmIChucmVzb3VyY2VzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIENvbnRleHRSZXNvdXJjZUxpbmsgcmVzb3VyY2VMaW5rID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnJlc291cmNlcy5maW5kUmVzb3VyY2VMaW5rKHJlc291cmNlTGlua05hbWUpOworICAgICAgICBpZiAocmVzb3VyY2VMaW5rICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoIkludmFsaWQgcmVzb3VyY2UgbGluayBuYW1lIC0gYWxyZWFkeSBleGlzdHMnIiArIAorICAgICAgICAgICAgICAgIHJlc291cmNlTGlua05hbWUgKyAiJyIpOworICAgICAgICB9CisgICAgICAgIHJlc291cmNlTGluayA9IG5ldyBDb250ZXh0UmVzb3VyY2VMaW5rKCk7CisgICAgICAgIHJlc291cmNlTGluay5zZXROYW1lKHJlc291cmNlTGlua05hbWUpOworICAgICAgICByZXNvdXJjZUxpbmsuc2V0VHlwZSh0eXBlKTsKKyAgICAgICAgbnJlc291cmNlcy5hZGRSZXNvdXJjZUxpbmsocmVzb3VyY2VMaW5rKTsKKyAgICAgICAgCisgICAgICAgIC8vIFJldHVybiB0aGUgY29ycmVzcG9uZGluZyBNQmVhbiBuYW1lCisgICAgICAgIE1hbmFnZWRCZWFuIG1hbmFnZWQgPSByZWdpc3RyeS5maW5kTWFuYWdlZEJlYW4oIkNvbnRleHRSZXNvdXJjZUxpbmsiKTsKKyAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9CisgICAgICAgICAgICBNQmVhblV0aWxzLmNyZWF0ZU9iamVjdE5hbWUobWFuYWdlZC5nZXREb21haW4oKSwgcmVzb3VyY2VMaW5rKTsKKyAgICAgICAgcmV0dXJuIChvbmFtZS50b1N0cmluZygpKTsKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogUmVtb3ZlIGFueSBlbnZpcm9ubWVudCBlbnRyeSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbnZOYW1lIE5hbWUgb2YgdGhlIGVudmlyb25tZW50IGVudHJ5IHRvIHJlbW92ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUVudmlyb25tZW50KFN0cmluZyBlbnZOYW1lKSB7CisKKyAgICAgICAgTmFtaW5nUmVzb3VyY2VzIG5yZXNvdXJjZXMgPSAoTmFtaW5nUmVzb3VyY2VzKSB0aGlzLnJlc291cmNlOworICAgICAgICBpZiAobnJlc291cmNlcyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgQ29udGV4dEVudmlyb25tZW50IGVudiA9IG5yZXNvdXJjZXMuZmluZEVudmlyb25tZW50KGVudk5hbWUpOworICAgICAgICBpZiAoZW52ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoIkludmFsaWQgZW52aXJvbm1lbnQgbmFtZSAnIiArIGVudk5hbWUgKyAiJyIpOworICAgICAgICB9CisgICAgICAgIG5yZXNvdXJjZXMucmVtb3ZlRW52aXJvbm1lbnQoZW52TmFtZSk7CisKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogUmVtb3ZlIGFueSByZXNvdXJjZSByZWZlcmVuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VOYW1lIE5hbWUgb2YgdGhlIHJlc291cmNlIHJlZmVyZW5jZSB0byByZW1vdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVSZXNvdXJjZShTdHJpbmcgcmVzb3VyY2VOYW1lKSB7CisKKyAgICAgICAgcmVzb3VyY2VOYW1lID0gT2JqZWN0TmFtZS51bnF1b3RlKHJlc291cmNlTmFtZSk7CisgICAgICAgIE5hbWluZ1Jlc291cmNlcyBucmVzb3VyY2VzID0gKE5hbWluZ1Jlc291cmNlcykgdGhpcy5yZXNvdXJjZTsKKyAgICAgICAgaWYgKG5yZXNvdXJjZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIENvbnRleHRSZXNvdXJjZSByZXNvdXJjZSA9IG5yZXNvdXJjZXMuZmluZFJlc291cmNlKHJlc291cmNlTmFtZSk7CisgICAgICAgIGlmIChyZXNvdXJjZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKCJJbnZhbGlkIHJlc291cmNlIG5hbWUgJyIgKyByZXNvdXJjZU5hbWUgKyAiJyIpOworICAgICAgICB9CisgICAgICAgIG5yZXNvdXJjZXMucmVtb3ZlUmVzb3VyY2UocmVzb3VyY2VOYW1lKTsKKyAgICAKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogUmVtb3ZlIGFueSByZXNvdXJjZSBsaW5rIHJlZmVyZW5jZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNvdXJjZUxpbmtOYW1lIE5hbWUgb2YgdGhlIHJlc291cmNlIGxpbmsgcmVmZXJlbmNlIHRvIHJlbW92ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVJlc291cmNlTGluayhTdHJpbmcgcmVzb3VyY2VMaW5rTmFtZSkgeworCisgICAgICAgIHJlc291cmNlTGlua05hbWUgPSBPYmplY3ROYW1lLnVucXVvdGUocmVzb3VyY2VMaW5rTmFtZSk7CisgICAgICAgIE5hbWluZ1Jlc291cmNlcyBucmVzb3VyY2VzID0gKE5hbWluZ1Jlc291cmNlcykgdGhpcy5yZXNvdXJjZTsKKyAgICAgICAgaWYgKG5yZXNvdXJjZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIENvbnRleHRSZXNvdXJjZUxpbmsgcmVzb3VyY2VMaW5rID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnJlc291cmNlcy5maW5kUmVzb3VyY2VMaW5rKHJlc291cmNlTGlua05hbWUpOworICAgICAgICBpZiAocmVzb3VyY2VMaW5rID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoIkludmFsaWQgcmVzb3VyY2UgTGluayBuYW1lICciICsgcmVzb3VyY2VMaW5rTmFtZSArICInIik7CisgICAgICAgIH0KKyAgICAgICAgbnJlc291cmNlcy5yZW1vdmVSZXNvdXJjZUxpbmsocmVzb3VyY2VMaW5rTmFtZSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvbWJlYW5zL1JvbGVNQmVhbi5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL21iZWFucy9Sb2xlTUJlYW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjBhMWEwCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL21iZWFucy9Sb2xlTUJlYW4uamF2YQpAQCAtMCwwICsxLDg4IEBACisvKgorICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5tYmVhbnM7CisKKworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5FeGNlcHRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LlJ1bnRpbWVPcGVyYXRpb25zRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLm1vZGVsZXIuQmFzZU1vZGVsTUJlYW47CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLm1vZGVsZXIuTWFuYWdlZEJlYW47CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLm1vZGVsZXIuUmVnaXN0cnk7CisKKworLyoqCisgKiA8cD5BIDxzdHJvbmc+TW9kZWxNQmVhbjwvc3Ryb25nPiBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlCisgKiA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLlJvbGU8L2NvZGU+IGNvbXBvbmVudC48L3A+CisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBSb2xlTUJlYW4gZXh0ZW5kcyBCYXNlTW9kZWxNQmVhbiB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSA8Y29kZT5Nb2RlbE1CZWFuPC9jb2RlPiB3aXRoIGRlZmF1bHQKKyAgICAgKiA8Y29kZT5Nb2RlbE1CZWFuSW5mbzwvY29kZT4gaW5mb3JtYXRpb24uCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIE1CZWFuRXhjZXB0aW9uIGlmIHRoZSBpbml0aWFsaXplciBvZiBhbiBvYmplY3QKKyAgICAgKiAgdGhyb3dzIGFuIGV4Y2VwdGlvbgorICAgICAqIEBleGNlcHRpb24gUnVudGltZU9wZXJhdGlvbnNFeGNlcHRpb24gaWYgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBSb2xlTUJlYW4oKQorICAgICAgICB0aHJvd3MgTUJlYW5FeGNlcHRpb24sIFJ1bnRpbWVPcGVyYXRpb25zRXhjZXB0aW9uIHsKKworICAgICAgICBzdXBlcigpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gcmVnaXN0cnkgZm9yIG91ciBtYW5hZ2VkIGJlYW5zLgorICAgICAqLworICAgIHByb3RlY3RlZCBSZWdpc3RyeSByZWdpc3RyeSA9IE1CZWFuVXRpbHMuY3JlYXRlUmVnaXN0cnkoKTsKKworCisgICAgLyoqCisgICAgICogVGhlIDxjb2RlPk1CZWFuU2VydmVyPC9jb2RlPiBpbiB3aGljaCB3ZSBhcmUgcmVnaXN0ZXJlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTUJlYW5TZXJ2ZXIgbXNlcnZlciA9IE1CZWFuVXRpbHMuY3JlYXRlU2VydmVyKCk7CisKKworICAgIC8qKgorICAgICAqIFRoZSA8Y29kZT5NYW5hZ2VkQmVhbjwvY29kZT4gaW5mb3JtYXRpb24gZGVzY3JpYmluZyB0aGlzIE1CZWFuLgorICAgICAqLworICAgIHByb3RlY3RlZCBNYW5hZ2VkQmVhbiBtYW5hZ2VkID0KKyAgICAgICAgcmVnaXN0cnkuZmluZE1hbmFnZWRCZWFuKCJSb2xlIik7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQXR0cmlidXRlcworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE9wZXJhdGlvbnMKKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvbWJlYW5zL1NlcnZlckxpZmVjeWNsZUxpc3RlbmVyLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvbWJlYW5zL1NlcnZlckxpZmVjeWNsZUxpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA0M2EzNgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9tYmVhbnMvU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDE0NjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OS0yMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEubWJlYW5zOworCisKK2ltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlRXZlbnQ7CitpbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRhaW5lckV2ZW50OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGFpbmVyTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Db250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuRW5naW5lOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuR2xvYmFsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkhvc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVFdmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZUxpc3RlbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTG9hZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlJlYWxtOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuU2VydmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuU2VydmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlNlcnZpY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuQ29ubmVjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZENvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkRW5naW5lOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZEhvc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkU2VydmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZFNlcnZpY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuQ29udGV4dEVudmlyb25tZW50OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkNvbnRleHRSZXNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5Db250ZXh0UmVzb3VyY2VMaW5rOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95Lk5hbWluZ1Jlc291cmNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKKworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIDxjb2RlPkxpZmVjeWNsZUxpc3RlbmVyPC9jb2RlPiB0aGF0CisgKiBpbnN0YW50aWF0ZXMgdGhlIHNldCBvZiBNQmVhbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb21wb25lbnRzIG9mIGEKKyAqIHJ1bm5pbmcgaW5zdGFuY2Ugb2YgQ2F0YWxpbmEuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAYXV0aG9yIEFteSBSb2gKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIFNlcnZlckxpZmVjeWNsZUxpc3RlbmVyCisgICAgaW1wbGVtZW50cyBDb250YWluZXJMaXN0ZW5lciwgTGlmZWN5Y2xlTGlzdGVuZXIsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFNlcnZlckxpZmVjeWNsZUxpc3RlbmVyLmNsYXNzKTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFNlbWljb2xvbiBzZXBhcmF0ZWQgbGlzdCBvZiBwYXRocyBjb250YWluaW5nIE1CZWFuIGRlc2NpcHRvciByZXNvdXJjZXMuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBkZXNjcmlwdG9ycyA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0b3JzKCkgeworICAgICAgICByZXR1cm4gKHRoaXMuZGVzY3JpcHRvcnMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0b3JzKFN0cmluZyBkZXNjcmlwdG9ycykgeworICAgICAgICB0aGlzLmRlc2NyaXB0b3JzID0gZGVzY3JpcHRvcnM7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBNWDRKIGFkYXB0b3IgbmFtZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGFkYXB0b3IgPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXRBZGFwdG9yKCkgeworICAgICAgICByZXR1cm4gKHRoaXMuYWRhcHRvcik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QWRhcHRvcihTdHJpbmcgYWRhcHRvcikgeworICAgICAgICB0aGlzLmFkYXB0b3IgPSBhZGFwdG9yOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1YNEoganJtcC9paW9wIGxpc3RlbiBob3N0CisgICAgICovIAorICAgIHByb3RlY3RlZCBTdHJpbmcgYWRhcHRvckhvc3QgPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXRBZGFwdG9ySG9zdCgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLmFkYXB0b3JIb3N0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBZGFwdG9ySG9zdChTdHJpbmcgYWRhcHRvckhvc3QpIHsKKyAgICAgICAgdGhpcy5hZGFwdG9ySG9zdCA9IGFkYXB0b3JIb3N0OworICAgIH0KKworICAgIC8qKgorICAgICAqIE1YNEoganJtcC9paW9wIGxpc3RlbiBwb3J0CisgICAgICovIAorICAgIHByb3RlY3RlZCBpbnQgYWRhcHRvclBvcnQgPSAtMTsKKworICAgIHB1YmxpYyBpbnQgZ2V0QWRhcHRvclBvcnQoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5hZGFwdG9yUG9ydCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QWRhcHRvclBvcnQoaW50IGFkYXB0b3JQb3J0KSB7CisgICAgICAgIHRoaXMuYWRhcHRvclBvcnQgPSBhZGFwdG9yUG9ydDsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29udGFpbmVyTGlzdGVuZXIgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBIYW5kbGUgYSA8Y29kZT5Db250YWluZXJFdmVudDwvY29kZT4gZnJvbSBvbmUgb2YgdGhlIENvbnRhaW5lcnMgd2UgYXJlCisgICAgICogaW50ZXJlc3RlZCBpbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgdGhhdCBoYXMgb2NjdXJyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjb250YWluZXJFdmVudChDb250YWluZXJFdmVudCBldmVudCkgeworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTdHJpbmcgdHlwZSA9IGV2ZW50LmdldFR5cGUoKTsKKyAgICAgICAgICAgIGlmIChDb250YWluZXIuQUREX0NISUxEX0VWRU5ULmVxdWFscyh0eXBlKSkgeworICAgICAgICAgICAgICAgIHByb2Nlc3NDb250YWluZXJBZGRDaGlsZChldmVudC5nZXRDb250YWluZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENvbnRhaW5lcikgZXZlbnQuZ2V0RGF0YSgpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoQ29udGFpbmVyLlJFTU9WRV9DSElMRF9FVkVOVC5lcXVhbHModHlwZSkpIHsKKyAgICAgICAgICAgICAgICBwcm9jZXNzQ29udGFpbmVyUmVtb3ZlQ2hpbGQoZXZlbnQuZ2V0Q29udGFpbmVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDb250YWluZXIpIGV2ZW50LmdldERhdGEoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2cuZXJyb3IoIkV4Y2VwdGlvbiBwcm9jZXNzaW5nIGV2ZW50ICIgKyBldmVudCwgZSk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBMaWZlY3ljbGVMaXN0ZW5lciBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFByaW1hcnkgZW50cnkgcG9pbnQgZm9yIHN0YXJ0dXAgYW5kIHNodXRkb3duIGV2ZW50cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgdGhhdCBoYXMgb2NjdXJyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBsaWZlY3ljbGVFdmVudChMaWZlY3ljbGVFdmVudCBldmVudCkgeworCisgICAgICAgIExpZmVjeWNsZSBsaWZlY3ljbGUgPSBldmVudC5nZXRMaWZlY3ljbGUoKTsKKyAgICAgICAgaWYgKExpZmVjeWNsZS5TVEFSVF9FVkVOVC5lcXVhbHMoZXZlbnQuZ2V0VHlwZSgpKSkgeworCisgICAgICAgICAgICBpZiAobGlmZWN5Y2xlIGluc3RhbmNlb2YgU2VydmVyKSB7CisKKyAgICAgICAgICAgICAgICBjcmVhdGVNQmVhbnMoKTsKKworICAgICAgICAgICAgICAgIGlmIChhZGFwdG9yICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1CZWFuVXRpbHMuY3JlYXRlUk1JQWRhcHRvcihhZGFwdG9yLCBhZGFwdG9ySG9zdCwgYWRhcHRvclBvcnQpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJjcmVhdGVBZGFwdG9yOiBFeGNlcHRpb24iLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBXZSBhcmUgZW1iZWRkZWQuCisgICAgICAgICAgICBpZiggbGlmZWN5Y2xlIGluc3RhbmNlb2YgU2VydmljZSApIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBNQmVhbkZhY3RvcnkgZmFjdG9yeSA9IG5ldyBNQmVhbkZhY3RvcnkoKTsKKyAgICAgICAgICAgICAgICAgICAgY3JlYXRlTUJlYW5zKGZhY3RvcnkpOworICAgICAgICAgICAgICAgICAgICBjcmVhdGVNQmVhbnMoKFNlcnZpY2UpbGlmZWN5Y2xlKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoKCBFeGNlcHRpb24gZXggKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiQ3JlYXRlIG1iZWFuIGZhY3RvcnkiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAvLyBJZ25vcmUgZXZlbnRzIGZyb20gU3RhbmRhcmRDb250ZXh0IG9iamVjdHMgdG8gYXZvaWQKKyAgICAgICAgICAgIC8vIHJlcmVnaXN0ZXJpbmcgdGhlIGNvbnRleHQKKyAgICAgICAgICAgIGlmIChsaWZlY3ljbGUgaW5zdGFuY2VvZiBTdGFuZGFyZENvbnRleHQpCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgY3JlYXRlTUJlYW5zKCk7CisgICAgICAgICAgICAqLworCisgICAgICAgIH0gZWxzZSBpZiAoTGlmZWN5Y2xlLlNUT1BfRVZFTlQuZXF1YWxzKGV2ZW50LmdldFR5cGUoKSkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYgKGxpZmVjeWNsZSBpbnN0YW5jZW9mIFNlcnZlcikgeworICAgICAgICAgICAgICAgICAgICBkZXN0cm95TUJlYW5zKChTZXJ2ZXIpbGlmZWN5Y2xlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGxpZmVjeWNsZSBpbnN0YW5jZW9mIFNlcnZpY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVzdHJveU1CZWFucygoU2VydmljZSlsaWZlY3ljbGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKE1CZWFuRXhjZXB0aW9uIHQpIHsKKworICAgICAgICAgICAgICAgIEV4Y2VwdGlvbiBlID0gdC5nZXRUYXJnZXRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICBpZiAoZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGUgPSB0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsb2cuZXJyb3IoImRlc3Ryb3lNQmVhbnM6IE1CZWFuRXhjZXB0aW9uIiwgZSk7CisKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3IoImRlc3Ryb3lNQmVhbnM6IFRocm93YWJsZSIsIHQpOworCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBGSVhNRTogUk1JIGFkYXB0b3Igc2hvdWxkIGJlIHN0b3BwZWQ7IGhvd2V2ZXIsIHRoaXMgaXMKKyAgICAgICAgICAgIC8vIHVuZG9jdW1lbnRlZCBpbiBNWDRKLCBhbmQgcmVwb3J0cyBleGlzdCBpbiB0aGUgTVg0SiBidWcgREIgdGhhdAorICAgICAgICAgICAgLy8gdGhpcyBkb2Vzbid0IHdvcmsKKworICAgICAgICB9CisKKyAgICAgICAgaWYgKChDb250ZXh0LlJFTE9BRF9FVkVOVC5lcXVhbHMoZXZlbnQuZ2V0VHlwZSgpKSkKKyAgICAgICAgICAgIHx8IChMaWZlY3ljbGUuU1RBUlRfRVZFTlQuZXF1YWxzKGV2ZW50LmdldFR5cGUoKSkpKSB7CisKKyAgICAgICAgICAgIC8vIEdpdmUgY29udGV4dCBhIG5ldyBoYW5kbGUgdG8gdGhlIE1CZWFuIHNlcnZlciBpZiB0aGUKKyAgICAgICAgICAgIC8vIGNvbnRleHQgaGFzIGJlZW4gcmVsb2FkZWQgc2luY2UgcmVsb2FkaW5nIGNhdXNlcyB0aGUKKyAgICAgICAgICAgIC8vIGNvbnRleHQgdG8gbG9zZSBpdHMgcHJldmlvdXMgaGFuZGxlIHRvIHRoZSBzZXJ2ZXIKKyAgICAgICAgICAgIGlmIChsaWZlY3ljbGUgaW5zdGFuY2VvZiBTdGFuZGFyZENvbnRleHQpIHsKKyAgICAgICAgICAgICAgICAvLyBJZiB0aGUgY29udGV4dCBpcyBwcml2aWxlZ2VkLCBnaXZlIGEgcmVmZXJlbmNlIHRvIGl0CisgICAgICAgICAgICAgICAgLy8gaW4gYSBzZXJ2bGV0IGNvbnRleHQgYXR0cmlidXRlCisgICAgICAgICAgICAgICAgU3RhbmRhcmRDb250ZXh0IGNvbnRleHQgPSAoU3RhbmRhcmRDb250ZXh0KWxpZmVjeWNsZTsKKyAgICAgICAgICAgICAgICBpZiAoY29udGV4dC5nZXRQcml2aWxlZ2VkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dC5nZXRTZXJ2bGV0Q29udGV4dCgpLnNldEF0dHJpYnV0ZQorICAgICAgICAgICAgICAgICAgICAgICAgKEdsb2JhbHMuTUJFQU5fUkVHSVNUUllfQVRUUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNQmVhblV0aWxzLmNyZWF0ZVJlZ2lzdHJ5KCkpOworICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmdldFNlcnZsZXRDb250ZXh0KCkuc2V0QXR0cmlidXRlCisgICAgICAgICAgICAgICAgICAgICAgICAoR2xvYmFscy5NQkVBTl9TRVJWRVJfQVRUUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNQmVhblV0aWxzLmNyZWF0ZVNlcnZlcigpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogSGFuZGxlIGEgPGNvZGU+UHJvcGVydHlDaGFuZ2VFdmVudDwvY29kZT4gZnJvbSBvbmUgb2YgdGhlIENvbnRhaW5lcnMKKyAgICAgKiB3ZSBhcmUgaW50ZXJlc3RlZCBpbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgdGhhdCBoYXMgb2NjdXJyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7CisKKyAgICAgICAgaWYgKGV2ZW50LmdldFNvdXJjZSgpIGluc3RhbmNlb2YgQ29udGFpbmVyKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHByb2Nlc3NDb250YWluZXJQcm9wZXJ0eUNoYW5nZSgoQ29udGFpbmVyKSBldmVudC5nZXRTb3VyY2UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmdldE9sZFZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmdldE5ld1ZhbHVlKCkpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkV4Y2VwdGlvbiBoYW5kbGluZyBDb250YWluZXIgcHJvcGVydHkgY2hhbmdlIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0vKiBlbHNlIGlmIChldmVudC5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIERlZmF1bHRDb250ZXh0KSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHByb2Nlc3NEZWZhdWx0Q29udGV4dFByb3BlcnR5Q2hhbmdlCisgICAgICAgICAgICAgICAgICAgICgoRGVmYXVsdENvbnRleHQpIGV2ZW50LmdldFNvdXJjZSgpLAorICAgICAgICAgICAgICAgICAgICAgZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCksCisgICAgICAgICAgICAgICAgICAgICBldmVudC5nZXRPbGRWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgZXZlbnQuZ2V0TmV3VmFsdWUoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiRXhjZXB0aW9uIGhhbmRsaW5nIERlZmF1bHRDb250ZXh0IHByb3BlcnR5IGNoYW5nZSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9Ki8gZWxzZSBpZiAoZXZlbnQuZ2V0U291cmNlKCkgaW5zdGFuY2VvZiBOYW1pbmdSZXNvdXJjZXMpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcHJvY2Vzc05hbWluZ1Jlc291cmNlc1Byb3BlcnR5Q2hhbmdlCisgICAgICAgICAgICAgICAgICAgICgoTmFtaW5nUmVzb3VyY2VzKSBldmVudC5nZXRTb3VyY2UoKSwKKyAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmdldFByb3BlcnR5TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgZXZlbnQuZ2V0T2xkVmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmdldE5ld1ZhbHVlKCkpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkV4Y2VwdGlvbiBoYW5kbGluZyBOYW1pbmdSZXNvdXJjZXMgcHJvcGVydHkgY2hhbmdlIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQuZ2V0U291cmNlKCkgaW5zdGFuY2VvZiBTZXJ2ZXIpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcHJvY2Vzc1NlcnZlclByb3BlcnR5Q2hhbmdlKChTZXJ2ZXIpIGV2ZW50LmdldFNvdXJjZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuZ2V0T2xkVmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuZ2V0TmV3VmFsdWUoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiRXhjZXB0aW9uIGhhbmRpbmcgU2VydmVyIHByb3BlcnR5IGNoYW5nZSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmdldFNvdXJjZSgpIGluc3RhbmNlb2YgU2VydmljZSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBwcm9jZXNzU2VydmljZVByb3BlcnR5Q2hhbmdlKChTZXJ2aWNlKSBldmVudC5nZXRTb3VyY2UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmdldFByb3BlcnR5TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuZ2V0T2xkVmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmdldE5ld1ZhbHVlKCkpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkV4Y2VwdGlvbiBoYW5kaW5nIFNlcnZpY2UgcHJvcGVydHkgY2hhbmdlIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3RlY3RlZCBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIENyZWF0ZSB0aGUgTUJlYW5zIHRoYXQgY29ycmVzcG9uZCB0byBldmVyeSBleGlzdGluZyBub2RlIG9mIG91ciB0cmVlLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZU1CZWFucygpIHsKKworICAgICAgICB0cnkgeworCisgICAgICAgICAgICBNQmVhbkZhY3RvcnkgZmFjdG9yeSA9IG5ldyBNQmVhbkZhY3RvcnkoKTsKKyAgICAgICAgICAgIGNyZWF0ZU1CZWFucyhmYWN0b3J5KTsKKyAgICAgICAgICAgIGNyZWF0ZU1CZWFucyhTZXJ2ZXJGYWN0b3J5LmdldFNlcnZlcigpKTsKKworICAgICAgICB9IGNhdGNoIChNQmVhbkV4Y2VwdGlvbiB0KSB7CisKKyAgICAgICAgICAgIEV4Y2VwdGlvbiBlID0gdC5nZXRUYXJnZXRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIGlmIChlID09IG51bGwpCisgICAgICAgICAgICAgICAgZSA9IHQ7CisgICAgICAgICAgICBsb2cuZXJyb3IoImNyZWF0ZU1CZWFuczogTUJlYW5FeGNlcHRpb24iLCBlKTsKKworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworCisgICAgICAgICAgICBsb2cuZXJyb3IoImNyZWF0ZU1CZWFuczogVGhyb3dhYmxlIiwgdCk7CisKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgdGhlIE1CZWFucyBmb3IgdGhlIHNwZWNpZmllZCBDb25uZWN0b3IgYW5kIGl0cyBuZXN0ZWQgY29tcG9uZW50cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0b3IgQ29ubmVjdG9yIGZvciB3aGljaCB0byBjcmVhdGUgTUJlYW5zCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBleGNlcHRpb24gaXMgdGhyb3duIGR1cmluZyBNQmVhbiBjcmVhdGlvbgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZU1CZWFucyhDb25uZWN0b3IgY29ubmVjdG9yKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBDcmVhdGUgdGhlIE1CZWFuIGZvciB0aGUgQ29ubm5lY3RvciBpdHNlbGYKKy8vICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisvLyAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ3JlYXRpbmcgTUJlYW4gZm9yIENvbm5lY3RvciAiICsgY29ubmVjdG9yKTsKKy8vICAgICAgICBNQmVhblV0aWxzLmNyZWF0ZU1CZWFuKGNvbm5lY3Rvcik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENyZWF0ZSB0aGUgTUJlYW5zIGZvciB0aGUgc3BlY2lmaWVkIENvbnRleHQgYW5kIGl0cyBuZXN0ZWQgY29tcG9uZW50cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgZm9yIHdoaWNoIHRvIGNyZWF0ZSBNQmVhbnMKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gZHVyaW5nIE1CZWFuIGNyZWF0aW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlTUJlYW5zKENvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gQ3JlYXRlIHRoZSBNQmVhbiBmb3IgdGhlIENvbnRleHQgaXRzZWxmCisvLyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorLy8gICAgICAgICAgICBsb2cuZGVidWcoIkNyZWF0aW5nIE1CZWFuIGZvciBDb250ZXh0ICIgKyBjb250ZXh0KTsKKy8vICAgICAgICBNQmVhblV0aWxzLmNyZWF0ZU1CZWFuKGNvbnRleHQpOworICAgICAgICBjb250ZXh0LmFkZENvbnRhaW5lckxpc3RlbmVyKHRoaXMpOworICAgICAgICBpZiAoY29udGV4dCBpbnN0YW5jZW9mIFN0YW5kYXJkQ29udGV4dCkgeworICAgICAgICAgICAgKChTdGFuZGFyZENvbnRleHQpIGNvbnRleHQpLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7CisgICAgICAgICAgICAoKFN0YW5kYXJkQ29udGV4dCkgY29udGV4dCkuYWRkTGlmZWN5Y2xlTGlzdGVuZXIodGhpcyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBJZiB0aGUgY29udGV4dCBpcyBwcml2aWxlZ2VkLCBnaXZlIGEgcmVmZXJlbmNlIHRvIGl0CisgICAgICAgIC8vIGluIGEgc2VydmxldCBjb250ZXh0IGF0dHJpYnV0ZQorICAgICAgICBpZiAoY29udGV4dC5nZXRQcml2aWxlZ2VkKCkpIHsKKyAgICAgICAgICAgIGNvbnRleHQuZ2V0U2VydmxldENvbnRleHQoKS5zZXRBdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICAoR2xvYmFscy5NQkVBTl9SRUdJU1RSWV9BVFRSLAorICAgICAgICAgICAgICAgICBNQmVhblV0aWxzLmNyZWF0ZVJlZ2lzdHJ5KCkpOworICAgICAgICAgICAgY29udGV4dC5nZXRTZXJ2bGV0Q29udGV4dCgpLnNldEF0dHJpYnV0ZQorICAgICAgICAgICAgICAgIChHbG9iYWxzLk1CRUFOX1NFUlZFUl9BVFRSLAorICAgICAgICAgICAgICAgICBNQmVhblV0aWxzLmNyZWF0ZVNlcnZlcigpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENyZWF0ZSB0aGUgTUJlYW5zIGZvciB0aGUgYXNzb2NpYXRlZCBuZXN0ZWQgY29tcG9uZW50cworICAgICAgICBMb2FkZXIgY0xvYWRlciA9IGNvbnRleHQuZ2V0TG9hZGVyKCk7CisgICAgICAgIGlmIChjTG9hZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkNyZWF0aW5nIE1CZWFuIGZvciBMb2FkZXIgIiArIGNMb2FkZXIpOworICAgICAgICAgICAgLy9NQmVhblV0aWxzLmNyZWF0ZU1CZWFuKGNMb2FkZXIpOworICAgICAgICB9CisgICAgICAgIE1hbmFnZXIgY01hbmFnZXIgPSBjb250ZXh0LmdldE1hbmFnZXIoKTsKKyAgICAgICAgaWYgKGNNYW5hZ2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkNyZWF0aW5nIE1CZWFuIGZvciBNYW5hZ2VyICIgKyBjTWFuYWdlcik7CisgICAgICAgICAgICAvL01CZWFuVXRpbHMuY3JlYXRlTUJlYW4oY01hbmFnZXIpOworICAgICAgICB9CisgICAgICAgIFJlYWxtIGhSZWFsbSA9IGNvbnRleHQuZ2V0UGFyZW50KCkuZ2V0UmVhbG0oKTsKKyAgICAgICAgUmVhbG0gY1JlYWxtID0gY29udGV4dC5nZXRSZWFsbSgpOworICAgICAgICBpZiAoKGNSZWFsbSAhPSBudWxsKSAmJiAoY1JlYWxtICE9IGhSZWFsbSkpIHsKKyAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkNyZWF0aW5nIE1CZWFuIGZvciBSZWFsbSAiICsgY1JlYWxtKTsKKyAgICAgICAgICAgIC8vTUJlYW5VdGlscy5jcmVhdGVNQmVhbihjUmVhbG0pOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ3JlYXRlIHRoZSBNQmVhbnMgZm9yIHRoZSBOYW1pbmdSZXNvdXJjZXMgKGlmIGFueSkKKyAgICAgICAgTmFtaW5nUmVzb3VyY2VzIHJlc291cmNlcyA9IGNvbnRleHQuZ2V0TmFtaW5nUmVzb3VyY2VzKCk7CisgICAgICAgIGNyZWF0ZU1CZWFucyhyZXNvdXJjZXMpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgdGhlIE1CZWFucyBmb3IgdGhlIHNwZWNpZmllZCBDb250ZXh0RW52aXJvbm1lbnQgZW50cnkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZW52aXJvbm1lbnQgQ29udGV4dEVudmlyb25tZW50IGZvciB3aGljaCB0byBjcmVhdGUgTUJlYW5zCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBleGNlcHRpb24gaXMgdGhyb3duIGR1cmluZyBNQmVhbiBjcmVhdGlvbgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZU1CZWFucyhDb250ZXh0RW52aXJvbm1lbnQgZW52aXJvbm1lbnQpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIC8vIENyZWF0ZSB0aGUgTUJlYW4gZm9yIHRoZSBDb250ZXh0RW52aXJvbm1lbnQgaXRzZWxmCisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgbG9nLmRlYnVnKCJDcmVhdGluZyBNQmVhbiBmb3IgQ29udGV4dEVudmlyb25tZW50ICIgKyBlbnZpcm9ubWVudCk7CisgICAgICAgIH0KKyAgICAgICAgTUJlYW5VdGlscy5jcmVhdGVNQmVhbihlbnZpcm9ubWVudCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENyZWF0ZSB0aGUgTUJlYW5zIGZvciB0aGUgc3BlY2lmaWVkIENvbnRleHRSZXNvdXJjZSBlbnRyeS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNvdXJjZSBDb250ZXh0UmVzb3VyY2UgZm9yIHdoaWNoIHRvIGNyZWF0ZSBNQmVhbnMKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gZHVyaW5nIE1CZWFuIGNyZWF0aW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlTUJlYW5zKENvbnRleHRSZXNvdXJjZSByZXNvdXJjZSkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gQ3JlYXRlIHRoZSBNQmVhbiBmb3IgdGhlIENvbnRleHRSZXNvdXJjZSBpdHNlbGYKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICBsb2cuZGVidWcoIkNyZWF0aW5nIE1CZWFuIGZvciBDb250ZXh0UmVzb3VyY2UgIiArIHJlc291cmNlKTsKKyAgICAgICAgfQorICAgICAgICBNQmVhblV0aWxzLmNyZWF0ZU1CZWFuKHJlc291cmNlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ3JlYXRlIHRoZSBNQmVhbnMgZm9yIHRoZSBzcGVjaWZpZWQgQ29udGV4dFJlc291cmNlTGluayBlbnRyeS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNvdXJjZUxpbmsgQ29udGV4dFJlc291cmNlTGluayBmb3Igd2hpY2ggdG8gY3JlYXRlIE1CZWFucworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW4gZXhjZXB0aW9uIGlzIHRocm93biBkdXJpbmcgTUJlYW4gY3JlYXRpb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVNQmVhbnMoQ29udGV4dFJlc291cmNlTGluayByZXNvdXJjZUxpbmspCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIC8vIENyZWF0ZSB0aGUgTUJlYW4gZm9yIHRoZSBDb250ZXh0UmVzb3VyY2VMaW5rIGl0c2VsZgorICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ3JlYXRpbmcgTUJlYW4gZm9yIENvbnRleHRSZXNvdXJjZUxpbmsgIiArIHJlc291cmNlTGluayk7CisgICAgICAgIH0KKyAgICAgICAgTUJlYW5VdGlscy5jcmVhdGVNQmVhbihyZXNvdXJjZUxpbmspOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgdGhlIE1CZWFucyBmb3IgdGhlIHNwZWNpZmllZCBEZWZhdWx0Q29udGV4dCBhbmQgaXRzIG5lc3RlZCBjb21wb25lbnRzLgorICAgICAqCisgICAgICogQHBhcmFtIGRjb250ZXh0IERlZmF1bHRDb250ZXh0IGZvciB3aGljaCB0byBjcmVhdGUgTUJlYW5zCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBleGNlcHRpb24gaXMgdGhyb3duIGR1cmluZyBNQmVhbiBjcmVhdGlvbgorICAgICAqLworICAgIC8qCisgICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlTUJlYW5zKERlZmF1bHRDb250ZXh0IGRjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBDcmVhdGUgdGhlIE1CZWFuIGZvciB0aGUgRGVmYXVsdENvbnRleHQgaXRzZWxmCisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ3JlYXRpbmcgTUJlYW4gZm9yIERlZmF1bHRDb250ZXh0ICIgKyBkY29udGV4dCk7CisgICAgICAgIE1CZWFuVXRpbHMuY3JlYXRlTUJlYW4oZGNvbnRleHQpOworCisgICAgICAgIGRjb250ZXh0LmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7CisKKyAgICAgICAgLy8gQ3JlYXRlIHRoZSBNQmVhbnMgZm9yIHRoZSBhc3NvY2lhdGVkIG5lc3RlZCBjb21wb25lbnRzCisgICAgICAgIExvYWRlciBkTG9hZGVyID0gZGNvbnRleHQuZ2V0TG9hZGVyKCk7CisgICAgICAgIGlmIChkTG9hZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkNyZWF0aW5nIE1CZWFuIGZvciBMb2FkZXIgIiArIGRMb2FkZXIpOworICAgICAgICAgICAgLy9NQmVhblV0aWxzLmNyZWF0ZU1CZWFuKGRMb2FkZXIpOworICAgICAgICB9CisKKyAgICAgICAgTWFuYWdlciBkTWFuYWdlciA9IGRjb250ZXh0LmdldE1hbmFnZXIoKTsKKyAgICAgICAgaWYgKGRNYW5hZ2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkNyZWF0aW5nIE1CZWFuIGZvciBNYW5hZ2VyICIgKyBkTWFuYWdlcik7CisgICAgICAgICAgICAvL01CZWFuVXRpbHMuY3JlYXRlTUJlYW4oZE1hbmFnZXIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ3JlYXRlIHRoZSBNQmVhbnMgZm9yIHRoZSBOYW1pbmdSZXNvdXJjZXMgKGlmIGFueSkKKyAgICAgICAgTmFtaW5nUmVzb3VyY2VzIHJlc291cmNlcyA9IGRjb250ZXh0LmdldE5hbWluZ1Jlc291cmNlcygpOworICAgICAgICBjcmVhdGVNQmVhbnMocmVzb3VyY2VzKTsKKworICAgIH0KKyAgICAqLworCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgdGhlIE1CZWFucyBmb3IgdGhlIHNwZWNpZmllZCBFbmdpbmUgYW5kIGl0cyBuZXN0ZWQgY29tcG9uZW50cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbmdpbmUgRW5naW5lIGZvciB3aGljaCB0byBjcmVhdGUgTUJlYW5zCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBleGNlcHRpb24gaXMgdGhyb3duIGR1cmluZyBNQmVhbiBjcmVhdGlvbgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZU1CZWFucyhFbmdpbmUgZW5naW5lKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBDcmVhdGUgdGhlIE1CZWFuIGZvciB0aGUgRW5naW5lIGl0c2VsZgorICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ3JlYXRpbmcgTUJlYW4gZm9yIEVuZ2luZSAiICsgZW5naW5lKTsKKyAgICAgICAgfQorICAgICAgICAvL01CZWFuVXRpbHMuY3JlYXRlTUJlYW4oZW5naW5lKTsKKyAgICAgICAgZW5naW5lLmFkZENvbnRhaW5lckxpc3RlbmVyKHRoaXMpOworICAgICAgICBpZiAoZW5naW5lIGluc3RhbmNlb2YgU3RhbmRhcmRFbmdpbmUpIHsKKyAgICAgICAgICAgICgoU3RhbmRhcmRFbmdpbmUpIGVuZ2luZSkuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENyZWF0ZSB0aGUgTUJlYW5zIGZvciB0aGUgYXNzb2NpYXRlZCBuZXN0ZWQgY29tcG9uZW50cworICAgICAgICBSZWFsbSBlUmVhbG0gPSBlbmdpbmUuZ2V0UmVhbG0oKTsKKyAgICAgICAgaWYgKGVSZWFsbSAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJDcmVhdGluZyBNQmVhbiBmb3IgUmVhbG0gIiArIGVSZWFsbSk7CisgICAgICAgICAgICAvL01CZWFuVXRpbHMuY3JlYXRlTUJlYW4oZVJlYWxtKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENyZWF0ZSB0aGUgTUJlYW5zIGZvciBlYWNoIGNoaWxkIEhvc3QKKyAgICAgICAgQ29udGFpbmVyIGhvc3RzW10gPSBlbmdpbmUuZmluZENoaWxkcmVuKCk7CisgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgaG9zdHMubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgIGNyZWF0ZU1CZWFucygoSG9zdCkgaG9zdHNbal0pOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENyZWF0ZSB0aGUgTUJlYW5zIGZvciB0aGUgc3BlY2lmaWVkIEhvc3QgYW5kIGl0cyBuZXN0ZWQgY29tcG9uZW50cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBob3N0IEhvc3QgZm9yIHdoaWNoIHRvIGNyZWF0ZSBNQmVhbnMKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gZHVyaW5nIE1CZWFuIGNyZWF0aW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlTUJlYW5zKEhvc3QgaG9zdCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gQ3JlYXRlIHRoZSBNQmVhbiBmb3IgdGhlIEhvc3QgaXRzZWxmCisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgbG9nLmRlYnVnKCJDcmVhdGluZyBNQmVhbiBmb3IgSG9zdCAiICsgaG9zdCk7CisgICAgICAgIH0KKyAgICAgICAgLy9NQmVhblV0aWxzLmNyZWF0ZU1CZWFuKGhvc3QpOworICAgICAgICBob3N0LmFkZENvbnRhaW5lckxpc3RlbmVyKHRoaXMpOworICAgICAgICBpZiAoaG9zdCBpbnN0YW5jZW9mIFN0YW5kYXJkSG9zdCkgeworICAgICAgICAgICAgKChTdGFuZGFyZEhvc3QpIGhvc3QpLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBDcmVhdGUgdGhlIE1CZWFucyBmb3IgdGhlIGFzc29jaWF0ZWQgbmVzdGVkIGNvbXBvbmVudHMKKyAgICAgICAgUmVhbG0gZVJlYWxtID0gaG9zdC5nZXRQYXJlbnQoKS5nZXRSZWFsbSgpOworICAgICAgICBSZWFsbSBoUmVhbG0gPSBob3N0LmdldFJlYWxtKCk7CisgICAgICAgIGlmICgoaFJlYWxtICE9IG51bGwpICYmIChoUmVhbG0gIT0gZVJlYWxtKSkgeworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ3JlYXRpbmcgTUJlYW4gZm9yIFJlYWxtICIgKyBoUmVhbG0pOworICAgICAgICAgICAgLy9NQmVhblV0aWxzLmNyZWF0ZU1CZWFuKGhSZWFsbSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBDcmVhdGUgdGhlIE1CZWFucyBmb3IgZWFjaCBjaGlsZCBDb250ZXh0CisgICAgICAgIENvbnRhaW5lciBjb250ZXh0c1tdID0gaG9zdC5maW5kQ2hpbGRyZW4oKTsKKyAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBjb250ZXh0cy5sZW5ndGg7IGsrKykgeworICAgICAgICAgICAgY3JlYXRlTUJlYW5zKChDb250ZXh0KSBjb250ZXh0c1trXSk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ3JlYXRlIHRoZSBNQmVhbnMgZm9yIE1CZWFuRmFjdG9yeS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmYWN0b3J5IE1CZWFuRmFjdG9yeSBmb3Igd2hpY2ggdG8gY3JlYXRlIE1CZWFuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBleGNlcHRpb24gaXMgdGhyb3duIGR1cmluZyBNQmVhbiBjcmVhdGlvbgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZU1CZWFucyhNQmVhbkZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gQ3JlYXRlIHRoZSBNQmVhbiBmb3IgdGhlIE1CZWFuRmFjdG9yeQorICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoIkNyZWF0aW5nIE1CZWFuIGZvciBNQmVhbkZhY3RvcnkgIiArIGZhY3RvcnkpOworICAgICAgICBNQmVhblV0aWxzLmNyZWF0ZU1CZWFuKGZhY3RvcnkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgdGhlIE1CZWFucyBmb3IgdGhlIHNwZWNpZmllZCBOYW1pbmdSZXNvdXJjZXMgYW5kIGl0cworICAgICAqIG5lc3RlZCBjb21wb25lbnRzLgorICAgICAqCisgICAgICogQHBhcmFtIHJlc291cmNlcyBOYW1pbmdSZXNvdXJjZXMgZm9yIHdoaWNoIHRvIGNyZWF0ZSBNQmVhbnMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVNQmVhbnMoTmFtaW5nUmVzb3VyY2VzIHJlc291cmNlcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gQ3JlYXRlIHRoZSBNQmVhbiBmb3IgdGhlIE5hbWluZ1Jlc291cmNlcyBpdHNlbGYKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICBsb2cuZGVidWcoIkNyZWF0aW5nIE1CZWFuIGZvciBOYW1pbmdSZXNvdXJjZXMgIiArIHJlc291cmNlcyk7CisgICAgICAgIH0KKyAgICAgICAgTUJlYW5VdGlscy5jcmVhdGVNQmVhbihyZXNvdXJjZXMpOworICAgICAgICByZXNvdXJjZXMuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKKworICAgICAgICAvLyBDcmVhdGUgdGhlIE1CZWFucyBmb3IgZWFjaCBjaGlsZCBlbnZpcm9ubWVudCBlbnRyeQorICAgICAgICBDb250ZXh0RW52aXJvbm1lbnQgZW52aXJvbm1lbnRzW10gPSByZXNvdXJjZXMuZmluZEVudmlyb25tZW50cygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVudmlyb25tZW50cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgY3JlYXRlTUJlYW5zKGVudmlyb25tZW50c1tpXSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBDcmVhdGUgdGhlIE1CZWFucyBmb3IgZWFjaCBjaGlsZCByZXNvdXJjZSBlbnRyeQorICAgICAgICBDb250ZXh0UmVzb3VyY2UgY3Jlc291cmNlc1tdID0gcmVzb3VyY2VzLmZpbmRSZXNvdXJjZXMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjcmVzb3VyY2VzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBjcmVhdGVNQmVhbnMoY3Jlc291cmNlc1tpXSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBDcmVhdGUgdGhlIE1CZWFucyBmb3IgZWFjaCBjaGlsZCByZXNvdXJjZSBsaW5rIGVudHJ5CisgICAgICAgIENvbnRleHRSZXNvdXJjZUxpbmsgY3Jlc291cmNlbGlua3NbXSA9IHJlc291cmNlcy5maW5kUmVzb3VyY2VMaW5rcygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNyZXNvdXJjZWxpbmtzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBjcmVhdGVNQmVhbnMoY3Jlc291cmNlbGlua3NbaV0pOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENyZWF0ZSB0aGUgTUJlYW5zIGZvciB0aGUgc3BlY2lmaWVkIFNlcnZlciBhbmQgaXRzIG5lc3RlZCBjb21wb25lbnRzLgorICAgICAqCisgICAgICogQHBhcmFtIHNlcnZlciBTZXJ2ZXIgZm9yIHdoaWNoIHRvIGNyZWF0ZSBNQmVhbnMKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gZHVyaW5nIE1CZWFuIGNyZWF0aW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlTUJlYW5zKFNlcnZlciBzZXJ2ZXIpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIC8vIENyZWF0ZSB0aGUgTUJlYW4gZm9yIHRoZSBTZXJ2ZXIgaXRzZWxmCisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ3JlYXRpbmcgTUJlYW4gZm9yIFNlcnZlciAiICsgc2VydmVyKTsKKyAgICAgICAgLy9NQmVhblV0aWxzLmNyZWF0ZU1CZWFuKHNlcnZlcik7CisgICAgICAgIGlmIChzZXJ2ZXIgaW5zdGFuY2VvZiBTdGFuZGFyZFNlcnZlcikgeworICAgICAgICAgICAgKChTdGFuZGFyZFNlcnZlcikgc2VydmVyKS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRoaXMpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ3JlYXRlIHRoZSBNQmVhbnMgZm9yIHRoZSBnbG9iYWwgTmFtaW5nUmVzb3VyY2VzIChpZiBhbnkpCisgICAgICAgIE5hbWluZ1Jlc291cmNlcyByZXNvdXJjZXMgPSBzZXJ2ZXIuZ2V0R2xvYmFsTmFtaW5nUmVzb3VyY2VzKCk7CisgICAgICAgIGlmIChyZXNvdXJjZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgY3JlYXRlTUJlYW5zKHJlc291cmNlcyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBDcmVhdGUgdGhlIE1CZWFucyBmb3IgZWFjaCBjaGlsZCBTZXJ2aWNlCisgICAgICAgIFNlcnZpY2Ugc2VydmljZXNbXSA9IHNlcnZlci5maW5kU2VydmljZXMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJ2aWNlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgLy8gRklYTUUgLSBXYXJwIG9iamVjdCBoaWVyYXJjaHkgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQKKyAgICAgICAgICAgIGlmIChzZXJ2aWNlc1tpXS5nZXRDb250YWluZXIoKS5nZXRDbGFzcygpLmdldE5hbWUoKS5lcXVhbHMKKyAgICAgICAgICAgICAgICAoIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLndhcnAuV2FycEVuZ2luZSIpKSB7CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiU2tpcHBpbmcgTUJlYW4gZm9yIFNlcnZpY2UgIiArIHNlcnZpY2VzW2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjcmVhdGVNQmVhbnMoc2VydmljZXNbaV0pOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENyZWF0ZSB0aGUgTUJlYW5zIGZvciB0aGUgc3BlY2lmaWVkIFNlcnZpY2UgYW5kIGl0cyBuZXN0ZWQgY29tcG9uZW50cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXJ2aWNlIFNlcnZpY2UgZm9yIHdoaWNoIHRvIGNyZWF0ZSBNQmVhbnMKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gZHVyaW5nIE1CZWFuIGNyZWF0aW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlTUJlYW5zKFNlcnZpY2Ugc2VydmljZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gQ3JlYXRlIHRoZSBNQmVhbiBmb3IgdGhlIFNlcnZpY2UgaXRzZWxmCisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ3JlYXRpbmcgTUJlYW4gZm9yIFNlcnZpY2UgIiArIHNlcnZpY2UpOworICAgICAgICAvL01CZWFuVXRpbHMuY3JlYXRlTUJlYW4oc2VydmljZSk7CisgICAgICAgIGlmIChzZXJ2aWNlIGluc3RhbmNlb2YgU3RhbmRhcmRTZXJ2aWNlKSB7CisgICAgICAgICAgICAoKFN0YW5kYXJkU2VydmljZSkgc2VydmljZSkuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENyZWF0ZSB0aGUgTUJlYW5zIGZvciB0aGUgY29ycmVzcG9uZGluZyBDb25uZWN0b3JzCisgICAgICAgIENvbm5lY3RvciBjb25uZWN0b3JzW10gPSBzZXJ2aWNlLmZpbmRDb25uZWN0b3JzKCk7CisgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgY29ubmVjdG9ycy5sZW5ndGg7IGorKykgeworICAgICAgICAgICAgY3JlYXRlTUJlYW5zKGNvbm5lY3RvcnNbal0pOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ3JlYXRlIHRoZSBNQmVhbiBmb3IgdGhlIGFzc29jaWF0ZWQgRW5naW5lIGFuZCBmcmllbmRzCisgICAgICAgIEVuZ2luZSBlbmdpbmUgPSAoRW5naW5lKSBzZXJ2aWNlLmdldENvbnRhaW5lcigpOworICAgICAgICBpZiAoZW5naW5lICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNyZWF0ZU1CZWFucyhlbmdpbmUpOworICAgICAgICB9CisKKyAgICB9CisKKworCisKKyAgICAvKioKKyAgICAgKiBEZXJlZ2lzdGVyIHRoZSBNQmVhbnMgZm9yIHRoZSBzcGVjaWZpZWQgQ29ubmVjdG9yIGFuZCBpdHMgbmVzdGVkCisgICAgICogY29tcG9uZW50cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0b3IgQ29ubmVjdG9yIGZvciB3aGljaCB0byBkZXJlZ2lzdGVyIE1CZWFucworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW4gZXhjZXB0aW9uIGlzIHRocm93biBkdXJpbmcgTUJlYW4gZGVzdHJ1Y3Rpb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBkZXN0cm95TUJlYW5zKENvbm5lY3RvciBjb25uZWN0b3IsIFNlcnZpY2Ugc2VydmljZSkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKy8vICAgICAgICAvLyBkZXJlZ2lzdGVyIHRoZSBNQmVhbiBmb3IgdGhlIENvbm5lY3RvciBpdHNlbGYKKy8vICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisvLyAgICAgICAgICAgIGxvZy5kZWJ1ZygiRGVzdHJveWluZyBNQmVhbiBmb3IgQ29ubmVjdG9yICIgKyBjb25uZWN0b3IpOworLy8gICAgICAgIE1CZWFuVXRpbHMuZGVzdHJveU1CZWFuKGNvbm5lY3Rvciwgc2VydmljZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIERlcmVnaXN0ZXIgdGhlIE1CZWFucyBmb3IgdGhlIHNwZWNpZmllZCBDb250ZXh0IGFuZCBpdHMgbmVzdGVkCisgICAgICogY29tcG9uZW50cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgZm9yIHdoaWNoIHRvIGRlcmVnaXN0ZXIgTUJlYW5zCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBleGNlcHRpb24gaXMgdGhyb3duIGR1cmluZyBNQmVhbiBkZXN0cnVjdGlvbgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGRlc3Ryb3lNQmVhbnMoQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBEZXJlZ2lzdGVyIG91cnNlbHZlcyBhcyBhIENvbnRhaW5lckxpc3RlbmVyCisgICAgICAgIGNvbnRleHQucmVtb3ZlQ29udGFpbmVyTGlzdGVuZXIodGhpcyk7CisKKyAgICAgICAgLy8gRGVzdHJveSB0aGUgTUJlYW5zIGZvciB0aGUgYXNzb2NpYXRlZCBuZXN0ZWQgY29tcG9uZW50cworICAgICAgICBSZWFsbSBoUmVhbG0gPSBjb250ZXh0LmdldFBhcmVudCgpLmdldFJlYWxtKCk7CisgICAgICAgIFJlYWxtIGNSZWFsbSA9IGNvbnRleHQuZ2V0UmVhbG0oKTsKKyAgICAgICAgaWYgKChjUmVhbG0gIT0gbnVsbCkgJiYgKGNSZWFsbSAhPSBoUmVhbG0pKSB7CisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJEZXN0cm95aW5nIE1CZWFuIGZvciBSZWFsbSAiICsgY1JlYWxtKTsKKyAgICAgICAgICAgIC8vTUJlYW5VdGlscy5kZXN0cm95TUJlYW4oY1JlYWxtKTsKKyAgICAgICAgfQorICAgICAgICBNYW5hZ2VyIGNNYW5hZ2VyID0gY29udGV4dC5nZXRNYW5hZ2VyKCk7CisgICAgICAgIGlmIChjTWFuYWdlciAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJEZXN0cm95aW5nIE1CZWFuIGZvciBNYW5hZ2VyICIgKyBjTWFuYWdlcik7CisgICAgICAgICAgICAvL01CZWFuVXRpbHMuZGVzdHJveU1CZWFuKGNNYW5hZ2VyKTsKKyAgICAgICAgfQorICAgICAgICBMb2FkZXIgY0xvYWRlciA9IGNvbnRleHQuZ2V0TG9hZGVyKCk7CisgICAgICAgIGlmIChjTG9hZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkRlc3Ryb3lpbmcgTUJlYW4gZm9yIExvYWRlciAiICsgY0xvYWRlcik7CisgICAgICAgICAgICAvL01CZWFuVXRpbHMuZGVzdHJveU1CZWFuKGNMb2FkZXIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gRGVzdHJveSB0aGUgTUJlYW5zIGZvciB0aGUgTmFtaW5nUmVzb3VyY2VzIChpZiBhbnkpCisgICAgICAgIE5hbWluZ1Jlc291cmNlcyByZXNvdXJjZXMgPSBjb250ZXh0LmdldE5hbWluZ1Jlc291cmNlcygpOworICAgICAgICBpZiAocmVzb3VyY2VzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGRlc3Ryb3lNQmVhbnMocmVzb3VyY2VzKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGRlcmVnaXN0ZXIgdGhlIE1CZWFuIGZvciB0aGUgQ29udGV4dCBpdHNlbGYKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmRlYnVnKCJEZXN0cm95aW5nIE1CZWFuIGZvciBDb250ZXh0ICIgKyBjb250ZXh0KTsKKyAgICAgICAgLy9NQmVhblV0aWxzLmRlc3Ryb3lNQmVhbihjb250ZXh0KTsKKyAgICAgICAgaWYgKGNvbnRleHQgaW5zdGFuY2VvZiBTdGFuZGFyZENvbnRleHQpIHsKKyAgICAgICAgICAgICgoU3RhbmRhcmRDb250ZXh0KSBjb250ZXh0KS4KKyAgICAgICAgICAgICAgICByZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRoaXMpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIERlcmVnaXN0ZXIgdGhlIE1CZWFucyBmb3IgdGhlIHNwZWNpZmllZCBDb250ZXh0RW52aXJvbm1lbnQgZW50cnkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZW52aXJvbm1lbnQgQ29udGV4dEVudmlyb25tZW50IGZvciB3aGljaCB0byBkZXN0cm95IE1CZWFucworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW4gZXhjZXB0aW9uIGlzIHRocm93biBkdXJpbmcgTUJlYW4gZGVzdHJ1Y3Rpb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBkZXN0cm95TUJlYW5zKENvbnRleHRFbnZpcm9ubWVudCBlbnZpcm9ubWVudCkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gRGVzdHJveSB0aGUgTUJlYW4gZm9yIHRoZSBDb250ZXh0RW52aXJvbm1lbnQgaXRzZWxmCisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgbG9nLmRlYnVnKCJEZXN0cm95aW5nIE1CZWFuIGZvciBDb250ZXh0RW52aXJvbm1lbnQgIiArIGVudmlyb25tZW50KTsKKyAgICAgICAgfQorICAgICAgICBNQmVhblV0aWxzLmRlc3Ryb3lNQmVhbihlbnZpcm9ubWVudCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIERlcmVnaXN0ZXIgdGhlIE1CZWFucyBmb3IgdGhlIHNwZWNpZmllZCBDb250ZXh0UmVzb3VyY2UgZW50cnkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2UgQ29udGV4dFJlc291cmNlIGZvciB3aGljaCB0byBkZXN0cm95IE1CZWFucworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW4gZXhjZXB0aW9uIGlzIHRocm93biBkdXJpbmcgTUJlYW4gZGVzdHJ1Y3Rpb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBkZXN0cm95TUJlYW5zKENvbnRleHRSZXNvdXJjZSByZXNvdXJjZSkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gRGVzdHJveSB0aGUgTUJlYW4gZm9yIHRoZSBDb250ZXh0UmVzb3VyY2UgaXRzZWxmCisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgbG9nLmRlYnVnKCJEZXN0cm95aW5nIE1CZWFuIGZvciBDb250ZXh0UmVzb3VyY2UgIiArIHJlc291cmNlKTsKKyAgICAgICAgfQorICAgICAgICBNQmVhblV0aWxzLmRlc3Ryb3lNQmVhbihyZXNvdXJjZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIERlcmVnaXN0ZXIgdGhlIE1CZWFucyBmb3IgdGhlIHNwZWNpZmllZCBDb250ZXh0UmVzb3VyY2VMaW5rIGVudHJ5LgorICAgICAqCisgICAgICogQHBhcmFtIHJlc291cmNlTGluayBDb250ZXh0UmVzb3VyY2VMaW5rIGZvciB3aGljaCB0byBkZXN0cm95IE1CZWFucworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW4gZXhjZXB0aW9uIGlzIHRocm93biBkdXJpbmcgTUJlYW4gZGVzdHJ1Y3Rpb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBkZXN0cm95TUJlYW5zKENvbnRleHRSZXNvdXJjZUxpbmsgcmVzb3VyY2VMaW5rKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBEZXN0cm95IHRoZSBNQmVhbiBmb3IgdGhlIENvbnRleHRSZXNvdXJjZUxpbmsgaXRzZWxmCisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgbG9nLmRlYnVnKCJEZXN0cm95aW5nIE1CZWFuIGZvciBDb250ZXh0UmVzb3VyY2VMaW5rICIgKyByZXNvdXJjZUxpbmspOworICAgICAgICB9CisgICAgICAgIE1CZWFuVXRpbHMuZGVzdHJveU1CZWFuKHJlc291cmNlTGluayk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIERlcmVnaXN0ZXIgdGhlIE1CZWFucyBmb3IgdGhlIHNwZWNpZmllZCBEZWZhdWx0Q29udGV4dCBhbmQgaXRzIG5lc3RlZAorICAgICAqIGNvbXBvbmVudHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGNvbnRleHQgRGVmYXVsdENvbnRleHQgZm9yIHdoaWNoIHRvIGRlcmVnaXN0ZXIgTUJlYW5zCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBleGNlcHRpb24gaXMgdGhyb3duIGR1cmluZyBNQmVhbiBkZXN0cnVjdGlvbgorICAgICAqLworICAgIC8qCisgICAgcHJvdGVjdGVkIHZvaWQgZGVzdHJveU1CZWFucyhEZWZhdWx0Q29udGV4dCBkY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgTWFuYWdlciBkTWFuYWdlciA9IGRjb250ZXh0LmdldE1hbmFnZXIoKTsKKyAgICAgICAgaWYgKGRNYW5hZ2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkRlc3Ryb3lpbmcgTUJlYW4gZm9yIE1hbmFnZXIgIiArIGRNYW5hZ2VyKTsKKyAgICAgICAgICAgIC8vTUJlYW5VdGlscy5kZXN0cm95TUJlYW4oZE1hbmFnZXIpOworICAgICAgICB9CisKKyAgICAgICAgTG9hZGVyIGRMb2FkZXIgPSBkY29udGV4dC5nZXRMb2FkZXIoKTsKKyAgICAgICAgaWYgKGRMb2FkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRGVzdHJveWluZyBNQmVhbiBmb3IgTG9hZGVyICIgKyBkTG9hZGVyKTsKKyAgICAgICAgICAgIC8vTUJlYW5VdGlscy5kZXN0cm95TUJlYW4oZExvYWRlcik7CisgICAgICAgIH0KKworICAgICAgICAvLyBEZXN0cm95IHRoZSBNQmVhbnMgZm9yIHRoZSBOYW1pbmdSZXNvdXJjZXMgKGlmIGFueSkKKyAgICAgICAgTmFtaW5nUmVzb3VyY2VzIHJlc291cmNlcyA9IGRjb250ZXh0LmdldE5hbWluZ1Jlc291cmNlcygpOworICAgICAgICBpZiAocmVzb3VyY2VzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGRlc3Ryb3lNQmVhbnMocmVzb3VyY2VzKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGRlcmVnaXN0ZXIgdGhlIE1CZWFuIGZvciB0aGUgRGVmYXVsdENvbnRleHQgaXRzZWxmCisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiRGVzdHJveWluZyBNQmVhbiBmb3IgQ29udGV4dCAiICsgZGNvbnRleHQpOworICAgICAgICBNQmVhblV0aWxzLmRlc3Ryb3lNQmVhbihkY29udGV4dCk7CisgICAgICAgIGRjb250ZXh0LnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7CisKKyAgICB9CisgICAgKi8KKworCisgICAgLyoqCisgICAgICogRGVyZWdpc3RlciB0aGUgTUJlYW5zIGZvciB0aGUgc3BlY2lmaWVkIEVuZ2luZSBhbmQgaXRzIG5lc3RlZAorICAgICAqIGNvbXBvbmVudHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZW5naW5lIEVuZ2luZSBmb3Igd2hpY2ggdG8gZGVzdHJveSBNQmVhbnMKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gZHVyaW5nIE1CZWFuIGRlc3RydWN0aW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZGVzdHJveU1CZWFucyhFbmdpbmUgZW5naW5lKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBEZXJlZ2lzdGVyIG91cnNlbHZlcyBhcyBhIENvbnRhaW5lckxpc3RlbmVyCisgICAgICAgIGVuZ2luZS5yZW1vdmVDb250YWluZXJMaXN0ZW5lcih0aGlzKTsKKworICAgICAgICAvLyBEZXJlZ2lzdGVyIHRoZSBNQmVhbnMgZm9yIGVhY2ggY2hpbGQgSG9zdAorICAgICAgICBDb250YWluZXIgaG9zdHNbXSA9IGVuZ2luZS5maW5kQ2hpbGRyZW4oKTsKKyAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBob3N0cy5sZW5ndGg7IGsrKykgeworICAgICAgICAgICAgZGVzdHJveU1CZWFucygoSG9zdCkgaG9zdHNba10pOworICAgICAgICB9CisKKyAgICAgICAgLy8gRGVyZWdpc3RlciB0aGUgTUJlYW5zIGZvciB0aGUgYXNzb2NpYXRlZCBuZXN0ZWQgY29tcG9uZW50cworICAgICAgICBSZWFsbSBlUmVhbG0gPSBlbmdpbmUuZ2V0UmVhbG0oKTsKKyAgICAgICAgaWYgKGVSZWFsbSAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJEZXN0cm95aW5nIE1CZWFuIGZvciBSZWFsbSAiICsgZVJlYWxtKTsKKyAgICAgICAgICAgIC8vTUJlYW5VdGlscy5kZXN0cm95TUJlYW4oZVJlYWxtKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIERlcmVnaXN0ZXIgdGhlIE1CZWFuIGZvciB0aGUgRW5naW5lIGl0c2VsZgorICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiRGVzdHJveWluZyBNQmVhbiBmb3IgRW5naW5lICIgKyBlbmdpbmUpOworICAgICAgICB9CisgICAgICAgIC8vTUJlYW5VdGlscy5kZXN0cm95TUJlYW4oZW5naW5lKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogRGVyZWdpc3RlciB0aGUgTUJlYW5zIGZvciB0aGUgc3BlY2lmaWVkIEhvc3QgYW5kIGl0cyBuZXN0ZWQgY29tcG9uZW50cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBob3N0IEhvc3QgZm9yIHdoaWNoIHRvIGRlc3Ryb3kgTUJlYW5zCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBleGNlcHRpb24gaXMgdGhyb3duIGR1cmluZyBNQmVhbiBkZXN0cnVjdGlvbgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGRlc3Ryb3lNQmVhbnMoSG9zdCBob3N0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBEZXJlZ2lzdGVyIG91cnNlbHZlcyBhcyBhIENvbnRhaW5lckxpc3RlbmVyCisgICAgICAgIGhvc3QucmVtb3ZlQ29udGFpbmVyTGlzdGVuZXIodGhpcyk7CisKKyAgICAgICAgLy8gRGVyZWdpc3RlciB0aGUgTUJlYW5zIGZvciBlYWNoIGNoaWxkIENvbnRleHQKKyAgICAgICAgQ29udGFpbmVyIGNvbnRleHRzW10gPSBob3N0LmZpbmRDaGlsZHJlbigpOworICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IGNvbnRleHRzLmxlbmd0aDsgaysrKSB7CisgICAgICAgICAgICBkZXN0cm95TUJlYW5zKChDb250ZXh0KSBjb250ZXh0c1trXSk7CisgICAgICAgIH0KKworCisgICAgICAgIC8vIERlcmVnaXN0ZXIgdGhlIE1CZWFucyBmb3IgdGhlIGFzc29jaWF0ZWQgbmVzdGVkIGNvbXBvbmVudHMKKyAgICAgICAgUmVhbG0gZVJlYWxtID0gaG9zdC5nZXRQYXJlbnQoKS5nZXRSZWFsbSgpOworICAgICAgICBSZWFsbSBoUmVhbG0gPSBob3N0LmdldFJlYWxtKCk7CisgICAgICAgIGlmICgoaFJlYWxtICE9IG51bGwpICYmIChoUmVhbG0gIT0gZVJlYWxtKSkgeworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRGVzdHJveWluZyBNQmVhbiBmb3IgUmVhbG0gIiArIGhSZWFsbSk7CisgICAgICAgICAgICAvL01CZWFuVXRpbHMuZGVzdHJveU1CZWFuKGhSZWFsbSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBEZXJlZ2lzdGVyIHRoZSBNQmVhbiBmb3IgdGhlIEhvc3QgaXRzZWxmCisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgbG9nLmRlYnVnKCJEZXN0cm95aW5nIE1CZWFuIGZvciBIb3N0ICIgKyBob3N0KTsKKyAgICAgICAgfQorICAgICAgICAvL01CZWFuVXRpbHMuZGVzdHJveU1CZWFuKGhvc3QpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBEZXJlZ2lzdGVyIHRoZSBNQmVhbnMgZm9yIHRoZSBzcGVjaWZpZWQgTmFtaW5nUmVzb3VyY2VzIGFuZCBpdHMKKyAgICAgKiBuZXN0ZWQgY29tcG9uZW50cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNvdXJjZXMgTmFtaW5nUmVzb3VyY2VzIGZvciB3aGljaCB0byBkZXN0cm95IE1CZWFucworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW4gZXhjZXB0aW9uIGlzIHRocm93biBkdXJpbmcgTUJlYW4gZGVzdHJ1Y3Rpb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBkZXN0cm95TUJlYW5zKE5hbWluZ1Jlc291cmNlcyByZXNvdXJjZXMpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIC8vIERlc3Ryb3kgdGhlIE1CZWFucyBmb3IgZWFjaCBjaGlsZCByZXNvdXJjZSBlbnRyeQorICAgICAgICBDb250ZXh0UmVzb3VyY2UgY3Jlc291cmNlc1tdID0gcmVzb3VyY2VzLmZpbmRSZXNvdXJjZXMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjcmVzb3VyY2VzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBkZXN0cm95TUJlYW5zKGNyZXNvdXJjZXNbaV0pOworICAgICAgICB9CisKKyAgICAgICAgLy8gRGVzdHJveSB0aGUgTUJlYW5zIGZvciBlYWNoIGNoaWxkIHJlc291cmNlIGxpbmsgZW50cnkKKyAgICAgICAgQ29udGV4dFJlc291cmNlTGluayBjcmVzb3VyY2VsaW5rc1tdID0gcmVzb3VyY2VzLmZpbmRSZXNvdXJjZUxpbmtzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY3Jlc291cmNlbGlua3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGRlc3Ryb3lNQmVhbnMoY3Jlc291cmNlbGlua3NbaV0pOworICAgICAgICB9CisKKyAgICAgICAgLy8gRGVzdHJveSB0aGUgTUJlYW5zIGZvciBlYWNoIGNoaWxkIGVudmlyb25tZW50IGVudHJ5CisgICAgICAgIENvbnRleHRFbnZpcm9ubWVudCBlbnZpcm9ubWVudHNbXSA9IHJlc291cmNlcy5maW5kRW52aXJvbm1lbnRzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW52aXJvbm1lbnRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBkZXN0cm95TUJlYW5zKGVudmlyb25tZW50c1tpXSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBEZXN0cm95IHRoZSBNQmVhbiBmb3IgdGhlIE5hbWluZ1Jlc291cmNlcyBpdHNlbGYKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICBsb2cuZGVidWcoIkRlc3Ryb3lpbmcgTUJlYW4gZm9yIE5hbWluZ1Jlc291cmNlcyAiICsgcmVzb3VyY2VzKTsKKyAgICAgICAgfQorICAgICAgICBNQmVhblV0aWxzLmRlc3Ryb3lNQmVhbihyZXNvdXJjZXMpOworICAgICAgICByZXNvdXJjZXMucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogRGVyZWdpc3RlciB0aGUgTUJlYW5zIGZvciB0aGUgc3BlY2lmaWVkIFNlcnZlciBhbmQgaXRzIHJlbGF0ZWQKKyAgICAgKiBjb21wb25lbnRzLgorICAgICAqCisgICAgICogQHBhcmFtIHNlcnZlciBTZXJ2ZXIgZm9yIHdoaWNoIHRvIGRlc3Ryb3kgTUJlYW5zCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBleGNlcHRpb24gaXMgdGhyb3duIGR1cmluZyBNQmVhbiBkZXN0cnVjdGlvbgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGRlc3Ryb3lNQmVhbnMoU2VydmVyIHNlcnZlcikgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gRGVzdHJveSB0aGUgTUJlYW5zIGZvciB0aGUgZ2xvYmFsIE5hbWluZ1Jlc291cmNlcyAoaWYgYW55KQorICAgICAgICBOYW1pbmdSZXNvdXJjZXMgcmVzb3VyY2VzID0gc2VydmVyLmdldEdsb2JhbE5hbWluZ1Jlc291cmNlcygpOworICAgICAgICBpZiAocmVzb3VyY2VzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGRlc3Ryb3lNQmVhbnMocmVzb3VyY2VzKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIERlc3Ryb3kgdGhlIE1CZWFucyBmb3IgZWFjaCBjaGlsZCBTZXJ2aWNlCisgICAgICAgIFNlcnZpY2Ugc2VydmljZXNbXSA9IHNlcnZlci5maW5kU2VydmljZXMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJ2aWNlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgLy8gRklYTUUgLSBXYXJwIG9iamVjdCBoaWVyYXJjaHkgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQKKyAgICAgICAgICAgIGlmIChzZXJ2aWNlc1tpXS5nZXRDb250YWluZXIoKS5nZXRDbGFzcygpLmdldE5hbWUoKS5lcXVhbHMKKyAgICAgICAgICAgICAgICAoIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLndhcnAuV2FycEVuZ2luZSIpKSB7CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiU2tpcHBpbmcgTUJlYW4gZm9yIFNlcnZpY2UgIiArIHNlcnZpY2VzW2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZXN0cm95TUJlYW5zKHNlcnZpY2VzW2ldKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIERlc3Ryb3kgdGhlIE1CZWFuIGZvciB0aGUgU2VydmVyIGl0c2VsZgorICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiRGVzdHJveWluZyBNQmVhbiBmb3IgU2VydmVyICIgKyBzZXJ2ZXIpOworICAgICAgICB9CisgICAgICAgIC8vTUJlYW5VdGlscy5kZXN0cm95TUJlYW4oc2VydmVyKTsKKyAgICAgICAgaWYgKHNlcnZlciBpbnN0YW5jZW9mIFN0YW5kYXJkU2VydmVyKSB7CisgICAgICAgICAgICAoKFN0YW5kYXJkU2VydmVyKSBzZXJ2ZXIpLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogRGVyZWdpc3RlciB0aGUgTUJlYW5zIGZvciB0aGUgc3BlY2lmaWVkIFNlcnZpY2UgYW5kIGl0cyBuZXN0ZWQKKyAgICAgKiBjb21wb25lbnRzLgorICAgICAqCisgICAgICogQHBhcmFtIHNlcnZpY2UgU2VydmljZSBmb3Igd2hpY2ggdG8gZGVzdHJveSBNQmVhbnMKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gZHVyaW5nIE1CZWFuIGRlc3RydWN0aW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZGVzdHJveU1CZWFucyhTZXJ2aWNlIHNlcnZpY2UpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIC8vIERlcmVnaXN0ZXIgdGhlIE1CZWFucyBmb3IgdGhlIGFzc29jaWF0ZWQgRW5naW5lCisgICAgICAgIEVuZ2luZSBlbmdpbmUgPSAoRW5naW5lKSBzZXJ2aWNlLmdldENvbnRhaW5lcigpOworICAgICAgICBpZiAoZW5naW5lICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vZGVzdHJveU1CZWFucyhlbmdpbmUpOworICAgICAgICB9CisKKy8vICAgICAgICAvLyBEZXJlZ2lzdGVyIHRoZSBNQmVhbnMgZm9yIHRoZSBjb3JyZXNwb25kaW5nIENvbm5lY3RvcnMKKy8vICAgICAgICBDb25uZWN0b3IgY29ubmVjdG9yc1tdID0gc2VydmljZS5maW5kQ29ubmVjdG9ycygpOworLy8gICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgY29ubmVjdG9ycy5sZW5ndGg7IGorKykgeworLy8gICAgICAgICAgICBkZXN0cm95TUJlYW5zKGNvbm5lY3RvcnNbal0sIHNlcnZpY2UpOworLy8gICAgICAgIH0KKworICAgICAgICAvLyBEZXJlZ2lzdGVyIHRoZSBNQmVhbiBmb3IgdGhlIFNlcnZpY2UgaXRzZWxmCisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgbG9nLmRlYnVnKCJEZXN0cm95aW5nIE1CZWFuIGZvciBTZXJ2aWNlICIgKyBzZXJ2aWNlKTsKKyAgICAgICAgfQorICAgICAgICAvL01CZWFuVXRpbHMuZGVzdHJveU1CZWFuKHNlcnZpY2UpOworICAgICAgICBpZiAoc2VydmljZSBpbnN0YW5jZW9mIFN0YW5kYXJkU2VydmljZSkgeworICAgICAgICAgICAgKChTdGFuZGFyZFNlcnZpY2UpIHNlcnZpY2UpLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUHJvY2VzcyB0aGUgYWRkaXRpb24gb2YgYSBuZXcgY2hpbGQgQ29udGFpbmVyIHRvIGEgcGFyZW50IENvbnRhaW5lci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJlbnQgUGFyZW50IGNvbnRhaW5lcgorICAgICAqIEBwYXJhbSBjaGlsZCBDaGlsZCBjb250YWluZXIKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzQ29udGFpbmVyQWRkQ2hpbGQoQ29udGFpbmVyIHBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGFpbmVyIGNoaWxkKSB7CisKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmRlYnVnKCJQcm9jZXNzIGFkZENoaWxkW3BhcmVudD0iICsgcGFyZW50ICsgIixjaGlsZD0iICsgY2hpbGQgKyAiXSIpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBDb250ZXh0KSB7CisgICAgICAgICAgICAgICAgY3JlYXRlTUJlYW5zKChDb250ZXh0KSBjaGlsZCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNoaWxkIGluc3RhbmNlb2YgRW5naW5lKSB7CisgICAgICAgICAgICAgICAgY3JlYXRlTUJlYW5zKChFbmdpbmUpIGNoaWxkKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hpbGQgaW5zdGFuY2VvZiBIb3N0KSB7CisgICAgICAgICAgICAgICAgY3JlYXRlTUJlYW5zKChIb3N0KSBjaGlsZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKE1CZWFuRXhjZXB0aW9uIHQpIHsKKyAgICAgICAgICAgIEV4Y2VwdGlvbiBlID0gdC5nZXRUYXJnZXRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIGlmIChlID09IG51bGwpCisgICAgICAgICAgICAgICAgZSA9IHQ7CisgICAgICAgICAgICBsb2cuZXJyb3IoInByb2Nlc3NDb250YWluZXJBZGRDaGlsZDogTUJlYW5FeGNlcHRpb24iLCBlKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcigicHJvY2Vzc0NvbnRhaW5lckFkZENoaWxkOiBUaHJvd2FibGUiLCB0KTsKKyAgICAgICAgfQorCisgICAgfQorCisKKworCisgICAgLyoqCisgICAgICogUHJvY2VzcyBhIHByb3BlcnR5IGNoYW5nZSBldmVudCBvbiBhIENvbnRhaW5lci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250YWluZXIgVGhlIGNvbnRhaW5lciBvbiB3aGljaCB0aGlzIGV2ZW50IG9jY3VycmVkCisgICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdGhhdCBjaGFuZ2VkCisgICAgICogQHBhcmFtIG9sZFZhbHVlIFRoZSBwcmV2aW91cyB2YWx1ZSAobWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+KQorICAgICAqIEBwYXJhbSBuZXdWYWx1ZSBUaGUgbmV3IHZhbHVlIChtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4pCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBleGNlcHRpb24gaXMgdGhyb3duCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0NvbnRhaW5lclByb3BlcnR5Q2hhbmdlKENvbnRhaW5lciBjb250YWluZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBvbGRWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG5ld1ZhbHVlKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIGxvZy50cmFjZSgicHJvcGVydHlDaGFuZ2VbY29udGFpbmVyPSIgKyBjb250YWluZXIgKworICAgICAgICAgICAgICAgICIscHJvcGVydHlOYW1lPSIgKyBwcm9wZXJ0eU5hbWUgKworICAgICAgICAgICAgICAgICIsb2xkVmFsdWU9IiArIG9sZFZhbHVlICsKKyAgICAgICAgICAgICAgICAiLG5ld1ZhbHVlPSIgKyBuZXdWYWx1ZSArICJdIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCJsb2FkZXIiLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7CisgICAgICAgICAgICBpZiAob2xkVmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlJlbW92aW5nIE1CZWFuIGZvciBMb2FkZXIgIiArIG9sZFZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgTUJlYW5VdGlscy5kZXN0cm95TUJlYW4oKExvYWRlcikgb2xkVmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG5ld1ZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJDcmVhdGluZyBNQmVhbiBmb3IgTG9hZGVyICIgKyBuZXdWYWx1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIE1CZWFuVXRpbHMuY3JlYXRlTUJlYW4oKExvYWRlcikgbmV3VmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKCJsb2dnZXIiLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7CisgICAgICAgICAgICBpZiAob2xkVmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlJlbW92aW5nIE1CZWFuIGZvciBMb2dnZXIgIiArIG9sZFZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAvLyBNQmVhblV0aWxzLmRlc3Ryb3lNQmVhbigoTG9nZ2VyKSBvbGRWYWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobmV3VmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkNyZWF0aW5nIE1CZWFuIGZvciBMb2dnZXIgIiArIG5ld1ZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy9NQmVhblV0aWxzLmNyZWF0ZU1CZWFuKChMb2dnZXIpIG5ld1ZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICgibWFuYWdlciIuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKKyAgICAgICAgICAgIGlmIChvbGRWYWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiUmVtb3ZpbmcgTUJlYW4gZm9yIE1hbmFnZXIgIiArIG9sZFZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy9NQmVhblV0aWxzLmRlc3Ryb3lNQmVhbigoTWFuYWdlcikgb2xkVmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG5ld1ZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJDcmVhdGluZyBNQmVhbiBmb3IgTWFuYWdlciAiICsgbmV3VmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvL01CZWFuVXRpbHMuY3JlYXRlTUJlYW4oKE1hbmFnZXIpIG5ld1ZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICgicmVhbG0iLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7CisgICAgICAgICAgICBpZiAob2xkVmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlJlbW92aW5nIE1CZWFuIGZvciBSZWFsbSAiICsgb2xkVmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBNQmVhblV0aWxzLmRlc3Ryb3lNQmVhbigoUmVhbG0pIG9sZFZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChuZXdWYWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ3JlYXRpbmcgTUJlYW4gZm9yIFJlYWxtICIgKyBuZXdWYWx1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vTUJlYW5VdGlscy5jcmVhdGVNQmVhbigoUmVhbG0pIG5ld1ZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICgic2VydmljZSIuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKKyAgICAgICAgICAgIGlmIChvbGRWYWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZGVzdHJveU1CZWFucygoU2VydmljZSkgb2xkVmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG5ld1ZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjcmVhdGVNQmVhbnMoKFNlcnZpY2UpIG5ld1ZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIGEgcHJvcGVydHkgY2hhbmdlIGV2ZW50IG9uIGEgRGVmYXVsdENvbnRleHQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGVmYXVsdENvbnRleHQgVGhlIERlZmF1bHRDb250ZXh0IG9uIHdoaWNoIHRoaXMgZXZlbnQgb2NjdXJyZWQKKyAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0aGF0IGNoYW5nZWQKKyAgICAgKiBAcGFyYW0gb2xkVmFsdWUgVGhlIHByZXZpb3VzIHZhbHVlIChtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4pCisgICAgICogQHBhcmFtIG5ld1ZhbHVlIFRoZSBuZXcgdmFsdWUgKG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPikKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24KKyAgICAgKi8KKyAgICAvKgorICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NEZWZhdWx0Q29udGV4dFByb3BlcnR5Q2hhbmdlKERlZmF1bHRDb250ZXh0IGRlZmF1bHRDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJvcGVydHlOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qgb2xkVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBuZXdWYWx1ZSkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7CisgICAgICAgICAgICBsb2cudHJhY2UoInByb3BlcnR5Q2hhbmdlW2RlZmF1bHRDb250ZXh0PSIgKyBkZWZhdWx0Q29udGV4dCArCisgICAgICAgICAgICAgICAgIixwcm9wZXJ0eU5hbWU9IiArIHByb3BlcnR5TmFtZSArCisgICAgICAgICAgICAgICAgIixvbGRWYWx1ZT0iICsgb2xkVmFsdWUgKworICAgICAgICAgICAgICAgICIsbmV3VmFsdWU9IiArIG5ld1ZhbHVlICsgIl0iKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoImxvYWRlciIuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKKyAgICAgICAgICAgIGlmIChvbGRWYWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiUmVtb3ZpbmcgTUJlYW4gZm9yIExvYWRlciAiICsgb2xkVmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBNQmVhblV0aWxzLmRlc3Ryb3lNQmVhbigoTG9hZGVyKSBvbGRWYWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobmV3VmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkNyZWF0aW5nIE1CZWFuIGZvciBMb2FkZXIgIiArIG5ld1ZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgTUJlYW5VdGlscy5jcmVhdGVNQmVhbigoTG9hZGVyKSBuZXdWYWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoImxvZ2dlciIuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKKyAgICAgICAgICAgIGlmIChvbGRWYWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiUmVtb3ZpbmcgTUJlYW4gZm9yIExvZ2dlciAiICsgb2xkVmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvL01CZWFuVXRpbHMuZGVzdHJveU1CZWFuKChMb2dnZXIpIG9sZFZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChuZXdWYWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ3JlYXRpbmcgTUJlYW4gZm9yIExvZ2dlciAiICsgbmV3VmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvL01CZWFuVXRpbHMuY3JlYXRlTUJlYW4oKExvZ2dlcikgbmV3VmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKCJtYW5hZ2VyIi5lcXVhbHMocHJvcGVydHlOYW1lKSkgeworICAgICAgICAgICAgaWYgKG9sZFZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJSZW1vdmluZyBNQmVhbiBmb3IgTWFuYWdlciAiICsgb2xkVmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBNQmVhblV0aWxzLmRlc3Ryb3lNQmVhbigoTWFuYWdlcikgb2xkVmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG5ld1ZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJDcmVhdGluZyBNQmVhbiBmb3IgTWFuYWdlciAiICsgbmV3VmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBNQmVhblV0aWxzLmNyZWF0ZU1CZWFuKChNYW5hZ2VyKSBuZXdWYWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoInJlYWxtIi5lcXVhbHMocHJvcGVydHlOYW1lKSkgeworICAgICAgICAgICAgaWYgKG9sZFZhbHVlICE9IG51bGwpIHsKKy8vICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworLy8gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiUmVtb3ZpbmcgTUJlYW4gZm9yIFJlYWxtICIgKyBvbGRWYWx1ZSk7CisvLyAgICAgICAgICAgICAgICB9CisvLyAgICAgICAgICAgICAgICAvL01CZWFuVXRpbHMuZGVzdHJveU1CZWFuKChSZWFsbSkgb2xkVmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG5ld1ZhbHVlICE9IG51bGwpIHsKKy8vICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworLy8gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ3JlYXRpbmcgTUJlYW4gZm9yIFJlYWxtICIgKyBuZXdWYWx1ZSk7CisvLyAgICAgICAgICAgICAgICB9CisvLyAgICAgICAgICAgICAgICAvL01CZWFuVXRpbHMuY3JlYXRlTUJlYW4oKFJlYWxtKSBuZXdWYWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoInNlcnZpY2UiLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7CisgICAgICAgICAgICBpZiAob2xkVmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGRlc3Ryb3lNQmVhbnMoKFNlcnZpY2UpIG9sZFZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChuZXdWYWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY3JlYXRlTUJlYW5zKChTZXJ2aWNlKSBuZXdWYWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0qLworCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSByZW1vdmFsIG9mIGEgY2hpbGQgQ29udGFpbmVyIGZyb20gYSBwYXJlbnQgQ29udGFpbmVyLgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmVudCBQYXJlbnQgY29udGFpbmVyCisgICAgICogQHBhcmFtIGNoaWxkIENoaWxkIGNvbnRhaW5lcgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NDb250YWluZXJSZW1vdmVDaGlsZChDb250YWluZXIgcGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250YWluZXIgY2hpbGQpIHsKKworICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoIlByb2Nlc3MgcmVtb3ZlQ2hpbGRbcGFyZW50PSIgKyBwYXJlbnQgKyAiLGNoaWxkPSIgKworICAgICAgICAgICAgICAgIGNoaWxkICsgIl0iKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgQ29udGV4dCkgeworICAgICAgICAgICAgICAgIENvbnRleHQgY29udGV4dCA9IChDb250ZXh0KSBjaGlsZDsKKyAgICAgICAgICAgICAgICBpZiAoY29udGV4dC5nZXRQcml2aWxlZ2VkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dC5nZXRTZXJ2bGV0Q29udGV4dCgpLnJlbW92ZUF0dHJpYnV0ZQorICAgICAgICAgICAgICAgICAgICAgICAgKEdsb2JhbHMuTUJFQU5fUkVHSVNUUllfQVRUUik7CisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0U2VydmxldENvbnRleHQoKS5yZW1vdmVBdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICAgICAgICAgIChHbG9iYWxzLk1CRUFOX1NFUlZFUl9BVFRSKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiAgUmVtb3ZpbmcgTUJlYW4gZm9yIENvbnRleHQgIiArIGNvbnRleHQpOworICAgICAgICAgICAgICAgIGRlc3Ryb3lNQmVhbnMoY29udGV4dCk7CisgICAgICAgICAgICAgICAgaWYgKGNvbnRleHQgaW5zdGFuY2VvZiBTdGFuZGFyZENvbnRleHQpIHsKKyAgICAgICAgICAgICAgICAgICAgKChTdGFuZGFyZENvbnRleHQpIGNvbnRleHQpLgorICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNoaWxkIGluc3RhbmNlb2YgSG9zdCkgeworICAgICAgICAgICAgICAgIEhvc3QgaG9zdCA9IChIb3N0KSBjaGlsZDsKKyAgICAgICAgICAgICAgICBkZXN0cm95TUJlYW5zKGhvc3QpOworICAgICAgICAgICAgICAgIGlmIChob3N0IGluc3RhbmNlb2YgU3RhbmRhcmRIb3N0KSB7CisgICAgICAgICAgICAgICAgICAgICgoU3RhbmRhcmRIb3N0KSBob3N0KS4KKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChNQmVhbkV4Y2VwdGlvbiB0KSB7CisgICAgICAgICAgICBFeGNlcHRpb24gZSA9IHQuZ2V0VGFyZ2V0RXhjZXB0aW9uKCk7CisgICAgICAgICAgICBpZiAoZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIGUgPSB0OworICAgICAgICAgICAgbG9nLmVycm9yKCJwcm9jZXNzQ29udGFpbmVyUmVtb3ZlQ2hpbGQ6IE1CZWFuRXhjZXB0aW9uIiwgZSk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICBsb2cuZXJyb3IoInByb2Nlc3NDb250YWluZXJSZW1vdmVDaGlsZDogVGhyb3dhYmxlIiwgdCk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUHJvY2VzcyBhIHByb3BlcnR5IGNoYW5nZSBldmVudCBvbiBhIE5hbWluZ1Jlc291cmNlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNvdXJjZXMgVGhlIGdsb2JhbCBuYW1pbmcgcmVzb3VyY2VzIG9uIHdoaWNoIHRoaXMKKyAgICAgKiAgZXZlbnQgb2NjdXJyZWQKKyAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0aGF0IGNoYW5nZWQKKyAgICAgKiBAcGFyYW0gb2xkVmFsdWUgVGhlIHByZXZpb3VzIHZhbHVlIChtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4pCisgICAgICogQHBhcmFtIG5ld1ZhbHVlIFRoZSBuZXcgdmFsdWUgKG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPikKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzTmFtaW5nUmVzb3VyY2VzUHJvcGVydHlDaGFuZ2UKKyAgICAgICAgKE5hbWluZ1Jlc291cmNlcyByZXNvdXJjZXMsIFN0cmluZyBwcm9wZXJ0eU5hbWUsCisgICAgICAgICBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7CisgICAgICAgICAgICBsb2cudHJhY2UoInByb3BlcnR5Q2hhbmdlW25hbWluZ1Jlc291cmNlcz0iICsgcmVzb3VyY2VzICsKKyAgICAgICAgICAgICAgICAiLHByb3BlcnR5TmFtZT0iICsgcHJvcGVydHlOYW1lICsKKyAgICAgICAgICAgICAgICAiLG9sZFZhbHVlPSIgKyBvbGRWYWx1ZSArCisgICAgICAgICAgICAgICAgIixuZXdWYWx1ZT0iICsgbmV3VmFsdWUgKyAiXSIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gRklYTUUgLSBBZGQgb3RoZXIgcmVzb3VyY2UgdHlwZXMgd2hlbiBzdXBwb3J0ZWQgYnkgYWRtaW4gdG9vbAorICAgICAgICBpZiAoImVudmlyb25tZW50Ii5lcXVhbHMocHJvcGVydHlOYW1lKSkgeworICAgICAgICAgICAgaWYgKG9sZFZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBkZXN0cm95TUJlYW5zKChDb250ZXh0RW52aXJvbm1lbnQpIG9sZFZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChuZXdWYWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY3JlYXRlTUJlYW5zKChDb250ZXh0RW52aXJvbm1lbnQpIG5ld1ZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICgicmVzb3VyY2UiLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7CisgICAgICAgICAgICBpZiAob2xkVmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGRlc3Ryb3lNQmVhbnMoKENvbnRleHRSZXNvdXJjZSkgb2xkVmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG5ld1ZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjcmVhdGVNQmVhbnMoKENvbnRleHRSZXNvdXJjZSkgbmV3VmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKCJyZXNvdXJjZUxpbmsiLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7CisgICAgICAgICAgICBpZiAob2xkVmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGRlc3Ryb3lNQmVhbnMoKENvbnRleHRSZXNvdXJjZUxpbmspIG9sZFZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChuZXdWYWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY3JlYXRlTUJlYW5zKChDb250ZXh0UmVzb3VyY2VMaW5rKSBuZXdWYWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUHJvY2VzcyBhIHByb3BlcnR5IGNoYW5nZSBldmVudCBvbiBhIFNlcnZlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXJ2ZXIgVGhlIHNlcnZlciBvbiB3aGljaCB0aGlzIGV2ZW50IG9jY3VycmVkCisgICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdGhhdCBjaGFuZ2VkCisgICAgICogQHBhcmFtIG9sZFZhbHVlIFRoZSBwcmV2aW91cyB2YWx1ZSAobWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+KQorICAgICAqIEBwYXJhbSBuZXdWYWx1ZSBUaGUgbmV3IHZhbHVlIChtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4pCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBleGNlcHRpb24gaXMgdGhyb3duCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1NlcnZlclByb3BlcnR5Q2hhbmdlKFNlcnZlciBzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBvbGRWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG5ld1ZhbHVlKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIGxvZy50cmFjZSgicHJvcGVydHlDaGFuZ2Vbc2VydmVyPSIgKyBzZXJ2ZXIgKworICAgICAgICAgICAgICAgICIscHJvcGVydHlOYW1lPSIgKyBwcm9wZXJ0eU5hbWUgKworICAgICAgICAgICAgICAgICIsb2xkVmFsdWU9IiArIG9sZFZhbHVlICsKKyAgICAgICAgICAgICAgICAiLG5ld1ZhbHVlPSIgKyBuZXdWYWx1ZSArICJdIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCJnbG9iYWxOYW1pbmdSZXNvdXJjZXMiLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7CisgICAgICAgICAgICBpZiAob2xkVmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGRlc3Ryb3lNQmVhbnMoKE5hbWluZ1Jlc291cmNlcykgb2xkVmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG5ld1ZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjcmVhdGVNQmVhbnMoKE5hbWluZ1Jlc291cmNlcykgbmV3VmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKCJzZXJ2aWNlIi5lcXVhbHMocHJvcGVydHlOYW1lKSkgeworICAgICAgICAgICAgaWYgKG9sZFZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBkZXN0cm95TUJlYW5zKChTZXJ2aWNlKSBvbGRWYWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobmV3VmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNyZWF0ZU1CZWFucygoU2VydmljZSkgbmV3VmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgYSBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQgb24gYSBTZXJ2aWNlLgorICAgICAqCisgICAgICogQHBhcmFtIHNlcnZpY2UgVGhlIHNlcnZpY2Ugb24gd2hpY2ggdGhpcyBldmVudCBvY2N1cnJlZAorICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRoYXQgY2hhbmdlZAorICAgICAqIEBwYXJhbSBvbGRWYWx1ZSBUaGUgcHJldmlvdXMgdmFsdWUgKG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPikKKyAgICAgKiBAcGFyYW0gbmV3VmFsdWUgVGhlIG5ldyB2YWx1ZSAobWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+KQorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW4gZXhjZXB0aW9uIGlzIHRocm93bgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NTZXJ2aWNlUHJvcGVydHlDaGFuZ2UoU2VydmljZSBzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBvbGRWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBuZXdWYWx1ZSkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7CisgICAgICAgICAgICBsb2cudHJhY2UoInByb3BlcnR5Q2hhbmdlW3NlcnZpY2U9IiArIHNlcnZpY2UgKworICAgICAgICAgICAgICAgICIscHJvcGVydHlOYW1lPSIgKyBwcm9wZXJ0eU5hbWUgKworICAgICAgICAgICAgICAgICIsb2xkVmFsdWU9IiArIG9sZFZhbHVlICsKKyAgICAgICAgICAgICAgICAiLG5ld1ZhbHVlPSIgKyBuZXdWYWx1ZSArICJdIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCJjb25uZWN0b3IiLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7CisgICAgICAgICAgICBpZiAob2xkVmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGRlc3Ryb3lNQmVhbnMoKENvbm5lY3Rvcikgb2xkVmFsdWUsIHNlcnZpY2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG5ld1ZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjcmVhdGVNQmVhbnMoKENvbm5lY3RvcikgbmV3VmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKCJjb250YWluZXIiLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7CisgICAgICAgICAgICBpZiAob2xkVmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGRlc3Ryb3lNQmVhbnMoKEVuZ2luZSkgb2xkVmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG5ld1ZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjcmVhdGVNQmVhbnMoKEVuZ2luZSkgbmV3VmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL21iZWFucy9TdGFuZGFyZENvbnRleHRNQmVhbi5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL21iZWFucy9TdGFuZGFyZENvbnRleHRNQmVhbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3MTQyMmQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvbWJlYW5zL1N0YW5kYXJkQ29udGV4dE1CZWFuLmphdmEKQEAgLTAsMCArMSwzNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLm1iZWFuczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5SdW50aW1lT3BlcmF0aW9uc0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZENvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuQ29udGV4dEVudmlyb25tZW50OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkNvbnRleHRSZXNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5Db250ZXh0UmVzb3VyY2VMaW5rOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95Lk5hbWluZ1Jlc291cmNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubW9kZWxlci5CYXNlTW9kZWxNQmVhbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubW9kZWxlci5NYW5hZ2VkQmVhbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubW9kZWxlci5SZWdpc3RyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvbWNhdC51dGlsLmNvbXBhdC5KZGtDb21wYXQ7CisKKy8qKgorICogPHA+QSA8c3Ryb25nPk1vZGVsTUJlYW48L3N0cm9uZz4gaW1wbGVtZW50YXRpb24gZm9yIHRoZQorICogPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkQ29udGV4dDwvY29kZT4gY29tcG9uZW50LjwvcD4KKyAqCisgKiBAYXV0aG9yIEFteSBSb2gKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIFN0YW5kYXJkQ29udGV4dE1CZWFuIGV4dGVuZHMgQmFzZU1vZGVsTUJlYW4geworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgPGNvZGU+TW9kZWxNQmVhbjwvY29kZT4gd2l0aCBkZWZhdWx0CisgICAgICogPGNvZGU+TW9kZWxNQmVhbkluZm88L2NvZGU+IGluZm9ybWF0aW9uLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBNQmVhbkV4Y2VwdGlvbiBpZiB0aGUgaW5pdGlhbGl6ZXIgb2YgYW4gb2JqZWN0CisgICAgICogIHRocm93cyBhbiBleGNlcHRpb24KKyAgICAgKiBAZXhjZXB0aW9uIFJ1bnRpbWVPcGVyYXRpb25zRXhjZXB0aW9uIGlmIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RhbmRhcmRDb250ZXh0TUJlYW4oKQorICAgICAgICB0aHJvd3MgTUJlYW5FeGNlcHRpb24sIFJ1bnRpbWVPcGVyYXRpb25zRXhjZXB0aW9uIHsKKworICAgICAgICBzdXBlcigpOworCisgICAgfQorICAgIAorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ2xhc3MgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIEpESyBjb21wYXRpYmlsaXR5IHN1cHBvcnQKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBKZGtDb21wYXQgamRrQ29tcGF0ID0gSmRrQ29tcGF0LmdldEpka0NvbXBhdCgpOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiByZWdpc3RyeSBmb3Igb3VyIG1hbmFnZWQgYmVhbnMuCisgICAgICovCisgICAgcHJvdGVjdGVkIFJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gTUJlYW5VdGlscy5jcmVhdGVSZWdpc3RyeSgpOworCisgICAgLyoqCisgICAgICogVGhlIDxjb2RlPk1hbmFnZWRCZWFuPC9jb2RlPiBpbmZvcm1hdGlvbiBkZXNjcmliaW5nIHRoaXMgTUJlYW4uCisgICAgICovCisgICAgcHJvdGVjdGVkIE1hbmFnZWRCZWFuIG1hbmFnZWQgPQorICAgICAgICByZWdpc3RyeS5maW5kTWFuYWdlZEJlYW4oIlN0YW5kYXJkQ29udGV4dCIpOworCisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBBdHRyaWJ1dGVzCisKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG5hbWluZyByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgTmFtaW5nUmVzb3VyY2VzIGdldE5hbWluZ1Jlc291cmNlcygpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiAoKFN0YW5kYXJkQ29udGV4dCl0aGlzLnJlc291cmNlKS5nZXROYW1pbmdSZXNvdXJjZXMoKTsKKyAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBuYW1pbmcgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWxvYWQoKSB7CisgICAgICAgIAorICAgICAgICAoKFN0YW5kYXJkQ29udGV4dCl0aGlzLnJlc291cmNlKS5yZWxvYWQoKTsKKyAgICAKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBNQmVhbiBOYW1lcyBvZiB0aGUgc2V0IG9mIGRlZmluZWQgZW52aXJvbm1lbnQgZW50cmllcyBmb3IgIAorICAgICAqIHRoaXMgd2ViIGFwcGxpY2F0aW9uCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGdldEVudmlyb25tZW50cygpIHsKKyAgICAgICAgQ29udGV4dEVudmlyb25tZW50W10gZW52cyA9IGdldE5hbWluZ1Jlc291cmNlcygpLmZpbmRFbnZpcm9ubWVudHMoKTsKKyAgICAgICAgQXJyYXlMaXN0IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW52cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0KKyAgICAgICAgICAgICAgICAgICAgTUJlYW5VdGlscy5jcmVhdGVPYmplY3ROYW1lKG1hbmFnZWQuZ2V0RG9tYWluKCksIGVudnNbaV0pOworICAgICAgICAgICAgICAgIHJlc3VsdHMuYWRkKG9uYW1lLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlhZSA9IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgKCJDYW5ub3QgY3JlYXRlIG9iamVjdCBuYW1lIGZvciBlbnZpcm9ubWVudCAiICsgZW52c1tpXSk7CisgICAgICAgICAgICAgICAgamRrQ29tcGF0LmNoYWluRXhjZXB0aW9uKGlhZSwgZSk7CisgICAgICAgICAgICAgICAgdGhyb3cgaWFlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAoKFN0cmluZ1tdKSByZXN1bHRzLnRvQXJyYXkobmV3IFN0cmluZ1tyZXN1bHRzLnNpemUoKV0pKTsKKworICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIE1CZWFuIE5hbWVzIG9mIGFsbCB0aGUgZGVmaW5lZCByZXNvdXJjZSByZWZlcmVuY2VzIGZvciB0aGlzCisgICAgICogYXBwbGljYXRpb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGdldFJlc291cmNlcygpIHsKKyAgICAgICAgCisgICAgICAgIENvbnRleHRSZXNvdXJjZVtdIHJlc291cmNlcyA9IGdldE5hbWluZ1Jlc291cmNlcygpLmZpbmRSZXNvdXJjZXMoKTsKKyAgICAgICAgQXJyYXlMaXN0IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPQorICAgICAgICAgICAgICAgICAgICBNQmVhblV0aWxzLmNyZWF0ZU9iamVjdE5hbWUobWFuYWdlZC5nZXREb21haW4oKSwgcmVzb3VyY2VzW2ldKTsKKyAgICAgICAgICAgICAgICByZXN1bHRzLmFkZChvbmFtZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZE9iamVjdE5hbWVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUgPSBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgICgiQ2Fubm90IGNyZWF0ZSBvYmplY3QgbmFtZSBmb3IgcmVzb3VyY2UgIiArIHJlc291cmNlc1tpXSk7CisgICAgICAgICAgICAgICAgamRrQ29tcGF0LmNoYWluRXhjZXB0aW9uKGlhZSwgZSk7CisgICAgICAgICAgICAgICAgdGhyb3cgaWFlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAoKFN0cmluZ1tdKSByZXN1bHRzLnRvQXJyYXkobmV3IFN0cmluZ1tyZXN1bHRzLnNpemUoKV0pKTsKKworICAgIH0KKworICAgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBNQmVhbiBOYW1lcyBvZiBhbGwgdGhlIGRlZmluZWQgcmVzb3VyY2UgbGlua3MgZm9yIHRoaXMgCisgICAgICogYXBwbGljYXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0UmVzb3VyY2VMaW5rcygpIHsKKyAgICAgICAgCisgICAgICAgIENvbnRleHRSZXNvdXJjZUxpbmtbXSBsaW5rcyA9IGdldE5hbWluZ1Jlc291cmNlcygpLmZpbmRSZXNvdXJjZUxpbmtzKCk7CisgICAgICAgIEFycmF5TGlzdCByZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpbmtzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPQorICAgICAgICAgICAgICAgICAgICBNQmVhblV0aWxzLmNyZWF0ZU9iamVjdE5hbWUobWFuYWdlZC5nZXREb21haW4oKSwgbGlua3NbaV0pOworICAgICAgICAgICAgICAgIHJlc3VsdHMuYWRkKG9uYW1lLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlhZSA9IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgKCJDYW5ub3QgY3JlYXRlIG9iamVjdCBuYW1lIGZvciByZXNvdXJjZSAiICsgbGlua3NbaV0pOworICAgICAgICAgICAgICAgIGpka0NvbXBhdC5jaGFpbkV4Y2VwdGlvbihpYWUsIGUpOworICAgICAgICAgICAgICAgIHRocm93IGlhZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKChTdHJpbmdbXSkgcmVzdWx0cy50b0FycmF5KG5ldyBTdHJpbmdbcmVzdWx0cy5zaXplKCldKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbmFtaW5nIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWIgYXBwbGljYXRpb24uCisgICAgICovCisgICAgcHVibGljIGphdmF4Lm5hbWluZy5kaXJlY3RvcnkuRGlyQ29udGV4dCBnZXRTdGF0aWNSZXNvdXJjZXMoKSB7CisKKyAgICAgICAgcmV0dXJuICgoU3RhbmRhcmRDb250ZXh0KXRoaXMucmVzb3VyY2UpLmdldFJlc291cmNlcygpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG5hbWluZyByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRXZWxjb21lRmlsZXMoKSB7CisKKyAgICAgICAgcmV0dXJuICgoU3RhbmRhcmRDb250ZXh0KXRoaXMucmVzb3VyY2UpLmZpbmRXZWxjb21lRmlsZXMoKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBPcGVyYXRpb25zCisKKworICAgIC8qKgorICAgICAqIEFkZCBhbiBlbnZpcm9ubWVudCBlbnRyeSBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZW52TmFtZSBOZXcgZW52aXJvbm1lbnQgZW50cnkgbmFtZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgYWRkRW52aXJvbm1lbnQoU3RyaW5nIGVudk5hbWUsIFN0cmluZyB0eXBlKSAKKyAgICAgICAgdGhyb3dzIE1hbGZvcm1lZE9iamVjdE5hbWVFeGNlcHRpb24geworCisgICAgICAgIE5hbWluZ1Jlc291cmNlcyBucmVzb3VyY2VzID0gZ2V0TmFtaW5nUmVzb3VyY2VzKCk7CisgICAgICAgIGlmIChucmVzb3VyY2VzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIENvbnRleHRFbnZpcm9ubWVudCBlbnYgPSBucmVzb3VyY2VzLmZpbmRFbnZpcm9ubWVudChlbnZOYW1lKTsKKyAgICAgICAgaWYgKGVudiAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKCJJbnZhbGlkIGVudmlyb25tZW50IG5hbWUgLSBhbHJlYWR5IGV4aXN0cyAnIiArIGVudk5hbWUgKyAiJyIpOworICAgICAgICB9CisgICAgICAgIGVudiA9IG5ldyBDb250ZXh0RW52aXJvbm1lbnQoKTsKKyAgICAgICAgZW52LnNldE5hbWUoZW52TmFtZSk7CisgICAgICAgIGVudi5zZXRUeXBlKHR5cGUpOworICAgICAgICBucmVzb3VyY2VzLmFkZEVudmlyb25tZW50KGVudik7CisgICAgICAgIAorICAgICAgICAvLyBSZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgTUJlYW4gbmFtZQorICAgICAgICBNYW5hZ2VkQmVhbiBtYW5hZ2VkID0gcmVnaXN0cnkuZmluZE1hbmFnZWRCZWFuKCJDb250ZXh0RW52aXJvbm1lbnQiKTsKKyAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9CisgICAgICAgICAgICBNQmVhblV0aWxzLmNyZWF0ZU9iamVjdE5hbWUobWFuYWdlZC5nZXREb21haW4oKSwgZW52KTsKKyAgICAgICAgcmV0dXJuIChvbmFtZS50b1N0cmluZygpKTsKKyAgICAgICAgCisgICAgfQorCisgICAgCisgICAgLyoqCisgICAgICogQWRkIGEgcmVzb3VyY2UgcmVmZXJlbmNlIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNvdXJjZU5hbWUgTmV3IHJlc291cmNlIHJlZmVyZW5jZSBuYW1lCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBhZGRSZXNvdXJjZShTdHJpbmcgcmVzb3VyY2VOYW1lLCBTdHJpbmcgdHlwZSkgCisgICAgICAgIHRocm93cyBNYWxmb3JtZWRPYmplY3ROYW1lRXhjZXB0aW9uIHsKKyAgICAgICAgCisgICAgICAgIE5hbWluZ1Jlc291cmNlcyBucmVzb3VyY2VzID0gZ2V0TmFtaW5nUmVzb3VyY2VzKCk7CisgICAgICAgIGlmIChucmVzb3VyY2VzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIENvbnRleHRSZXNvdXJjZSByZXNvdXJjZSA9IG5yZXNvdXJjZXMuZmluZFJlc291cmNlKHJlc291cmNlTmFtZSk7CisgICAgICAgIGlmIChyZXNvdXJjZSAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKCJJbnZhbGlkIHJlc291cmNlIG5hbWUgLSBhbHJlYWR5IGV4aXN0cyciICsgcmVzb3VyY2VOYW1lICsgIiciKTsKKyAgICAgICAgfQorICAgICAgICByZXNvdXJjZSA9IG5ldyBDb250ZXh0UmVzb3VyY2UoKTsKKyAgICAgICAgcmVzb3VyY2Uuc2V0TmFtZShyZXNvdXJjZU5hbWUpOworICAgICAgICByZXNvdXJjZS5zZXRUeXBlKHR5cGUpOworICAgICAgICBucmVzb3VyY2VzLmFkZFJlc291cmNlKHJlc291cmNlKTsKKyAgICAgICAgCisgICAgICAgIC8vIFJldHVybiB0aGUgY29ycmVzcG9uZGluZyBNQmVhbiBuYW1lCisgICAgICAgIE1hbmFnZWRCZWFuIG1hbmFnZWQgPSByZWdpc3RyeS5maW5kTWFuYWdlZEJlYW4oIkNvbnRleHRSZXNvdXJjZSIpOworICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0KKyAgICAgICAgICAgIE1CZWFuVXRpbHMuY3JlYXRlT2JqZWN0TmFtZShtYW5hZ2VkLmdldERvbWFpbigpLCByZXNvdXJjZSk7CisgICAgICAgIHJldHVybiAob25hbWUudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgCisgICAgLyoqCisgICAgICogQWRkIGEgcmVzb3VyY2UgbGluayBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VMaW5rTmFtZSBOZXcgcmVzb3VyY2UgbGluayBuYW1lCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBhZGRSZXNvdXJjZUxpbmsoU3RyaW5nIHJlc291cmNlTGlua05hbWUsIFN0cmluZyBnbG9iYWwsIAorICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lLCBTdHJpbmcgdHlwZSkgdGhyb3dzIE1hbGZvcm1lZE9iamVjdE5hbWVFeGNlcHRpb24geworICAgICAgICAKKyAgICAgICAgTmFtaW5nUmVzb3VyY2VzIG5yZXNvdXJjZXMgPSBnZXROYW1pbmdSZXNvdXJjZXMoKTsKKyAgICAgICAgaWYgKG5yZXNvdXJjZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgQ29udGV4dFJlc291cmNlTGluayByZXNvdXJjZUxpbmsgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnJlc291cmNlcy5maW5kUmVzb3VyY2VMaW5rKHJlc291cmNlTGlua05hbWUpOworICAgICAgICBpZiAocmVzb3VyY2VMaW5rICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoIkludmFsaWQgcmVzb3VyY2UgbGluayBuYW1lIC0gYWxyZWFkeSBleGlzdHMnIiArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZUxpbmtOYW1lICsgIiciKTsKKyAgICAgICAgfQorICAgICAgICByZXNvdXJjZUxpbmsgPSBuZXcgQ29udGV4dFJlc291cmNlTGluaygpOworICAgICAgICByZXNvdXJjZUxpbmsuc2V0R2xvYmFsKGdsb2JhbCk7CisgICAgICAgIHJlc291cmNlTGluay5zZXROYW1lKHJlc291cmNlTGlua05hbWUpOworICAgICAgICByZXNvdXJjZUxpbmsuc2V0VHlwZSh0eXBlKTsKKyAgICAgICAgbnJlc291cmNlcy5hZGRSZXNvdXJjZUxpbmsocmVzb3VyY2VMaW5rKTsKKyAgICAgICAgCisgICAgICAgIC8vIFJldHVybiB0aGUgY29ycmVzcG9uZGluZyBNQmVhbiBuYW1lCisgICAgICAgIE1hbmFnZWRCZWFuIG1hbmFnZWQgPSByZWdpc3RyeS5maW5kTWFuYWdlZEJlYW4oIkNvbnRleHRSZXNvdXJjZUxpbmsiKTsKKyAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9CisgICAgICAgICAgICBNQmVhblV0aWxzLmNyZWF0ZU9iamVjdE5hbWUobWFuYWdlZC5nZXREb21haW4oKSwgcmVzb3VyY2VMaW5rKTsKKyAgICAgICAgcmV0dXJuIChvbmFtZS50b1N0cmluZygpKTsKKyAgICB9ICAgIAorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFJlbW92ZSBhbnkgZW52aXJvbm1lbnQgZW50cnkgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZW52TmFtZSBOYW1lIG9mIHRoZSBlbnZpcm9ubWVudCBlbnRyeSB0byByZW1vdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVFbnZpcm9ubWVudChTdHJpbmcgZW52TmFtZSkgeworCisgICAgICAgIE5hbWluZ1Jlc291cmNlcyBucmVzb3VyY2VzID0gZ2V0TmFtaW5nUmVzb3VyY2VzKCk7CisgICAgICAgIGlmIChucmVzb3VyY2VzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBDb250ZXh0RW52aXJvbm1lbnQgZW52ID0gbnJlc291cmNlcy5maW5kRW52aXJvbm1lbnQoZW52TmFtZSk7CisgICAgICAgIGlmIChlbnYgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICgiSW52YWxpZCBlbnZpcm9ubWVudCBuYW1lICciICsgZW52TmFtZSArICInIik7CisgICAgICAgIH0KKyAgICAgICAgbnJlc291cmNlcy5yZW1vdmVFbnZpcm9ubWVudChlbnZOYW1lKTsKKworICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYW55IHJlc291cmNlIHJlZmVyZW5jZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNvdXJjZU5hbWUgTmFtZSBvZiB0aGUgcmVzb3VyY2UgcmVmZXJlbmNlIHRvIHJlbW92ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVJlc291cmNlKFN0cmluZyByZXNvdXJjZU5hbWUpIHsKKworICAgICAgICByZXNvdXJjZU5hbWUgPSBPYmplY3ROYW1lLnVucXVvdGUocmVzb3VyY2VOYW1lKTsKKyAgICAgICAgTmFtaW5nUmVzb3VyY2VzIG5yZXNvdXJjZXMgPSBnZXROYW1pbmdSZXNvdXJjZXMoKTsKKyAgICAgICAgaWYgKG5yZXNvdXJjZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIENvbnRleHRSZXNvdXJjZSByZXNvdXJjZSA9IG5yZXNvdXJjZXMuZmluZFJlc291cmNlKHJlc291cmNlTmFtZSk7CisgICAgICAgIGlmIChyZXNvdXJjZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKCJJbnZhbGlkIHJlc291cmNlIG5hbWUgJyIgKyByZXNvdXJjZU5hbWUgKyAiJyIpOworICAgICAgICB9CisgICAgICAgIG5yZXNvdXJjZXMucmVtb3ZlUmVzb3VyY2UocmVzb3VyY2VOYW1lKTsKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogUmVtb3ZlIGFueSByZXNvdXJjZSBsaW5rIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIHJlc291cmNlTGlua05hbWUgTmFtZSBvZiB0aGUgcmVzb3VyY2UgcmVmZXJlbmNlIHRvIHJlbW92ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVJlc291cmNlTGluayhTdHJpbmcgcmVzb3VyY2VMaW5rTmFtZSkgeworCisgICAgICAgIHJlc291cmNlTGlua05hbWUgPSBPYmplY3ROYW1lLnVucXVvdGUocmVzb3VyY2VMaW5rTmFtZSk7CisgICAgICAgIE5hbWluZ1Jlc291cmNlcyBucmVzb3VyY2VzID0gZ2V0TmFtaW5nUmVzb3VyY2VzKCk7CisgICAgICAgIGlmIChucmVzb3VyY2VzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBDb250ZXh0UmVzb3VyY2VMaW5rIHJlc291cmNlID0gbnJlc291cmNlcy5maW5kUmVzb3VyY2VMaW5rKHJlc291cmNlTGlua05hbWUpOworICAgICAgICBpZiAocmVzb3VyY2UgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICgiSW52YWxpZCByZXNvdXJjZSBuYW1lICciICsgcmVzb3VyY2VMaW5rTmFtZSArICInIik7CisgICAgICAgIH0KKyAgICAgICAgbnJlc291cmNlcy5yZW1vdmVSZXNvdXJjZUxpbmsocmVzb3VyY2VMaW5rTmFtZSk7CisgICAgfQorIAorICAgIAorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL21iZWFucy9TdGFuZGFyZEVuZ2luZU1CZWFuLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvbWJlYW5zL1N0YW5kYXJkRW5naW5lTUJlYW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzY5YzI3Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL21iZWFucy9TdGFuZGFyZEVuZ2luZU1CZWFuLmphdmEKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEubWJlYW5zOworCisKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5SdW50aW1lT3BlcmF0aW9uc0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5tb2RlbGVyLkJhc2VNb2RlbE1CZWFuOworCisKKy8qKgorICogPHA+QSA8c3Ryb25nPk1vZGVsTUJlYW48L3N0cm9uZz4gaW1wbGVtZW50YXRpb24gZm9yIHRoZQorICogPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkRW5naW5lPC9jb2RlPiBjb21wb25lbnQuPC9wPgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgU3RhbmRhcmRFbmdpbmVNQmVhbiBleHRlbmRzIEJhc2VNb2RlbE1CZWFuIHsKKworICAgIC8qKgorICAgICAqIFRoZSA8Y29kZT5NQmVhblNlcnZlcjwvY29kZT4gZm9yIHRoaXMgYXBwbGljYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgTUJlYW5TZXJ2ZXIgbXNlcnZlciA9IE1CZWFuVXRpbHMuY3JlYXRlU2VydmVyKCk7CisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIDxjb2RlPk1vZGVsTUJlYW48L2NvZGU+IHdpdGggZGVmYXVsdAorICAgICAqIDxjb2RlPk1vZGVsTUJlYW5JbmZvPC9jb2RlPiBpbmZvcm1hdGlvbi4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTUJlYW5FeGNlcHRpb24gaWYgdGhlIGluaXRpYWxpemVyIG9mIGFuIG9iamVjdAorICAgICAqICB0aHJvd3MgYW4gZXhjZXB0aW9uCisgICAgICogQGV4Y2VwdGlvbiBSdW50aW1lT3BlcmF0aW9uc0V4Y2VwdGlvbiBpZiBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgb2NjdXJzCisgICAgICovCisgICAgcHVibGljIFN0YW5kYXJkRW5naW5lTUJlYW4oKQorICAgICAgICB0aHJvd3MgTUJlYW5FeGNlcHRpb24sIFJ1bnRpbWVPcGVyYXRpb25zRXhjZXB0aW9uIHsKKworICAgICAgICBzdXBlcigpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEF0dHJpYnV0ZXMKKworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE9wZXJhdGlvbnMKKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvbWJlYW5zL1N0YW5kYXJkSG9zdE1CZWFuLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvbWJlYW5zL1N0YW5kYXJkSG9zdE1CZWFuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM3MTVmYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9tYmVhbnMvU3RhbmRhcmRIb3N0TUJlYW4uamF2YQpAQCAtMCwwICsxLDE0OSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEubWJlYW5zOworCisKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5SdW50aW1lT3BlcmF0aW9uc0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuVmFsdmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkSG9zdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubW9kZWxlci5CYXNlTW9kZWxNQmVhbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubW9kZWxlci5NYW5hZ2VkQmVhbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubW9kZWxlci5SZWdpc3RyeTsKKworCisvKioKKyAqIDxwPkEgPHN0cm9uZz5Nb2RlbE1CZWFuPC9zdHJvbmc+IGltcGxlbWVudGF0aW9uIGZvciB0aGUKKyAqIDxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZEhvc3Q8L2NvZGU+IGNvbXBvbmVudC48L3A+CisgKgorICogQGF1dGhvciBBbXkgUm9oCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBTdGFuZGFyZEhvc3RNQmVhbiBleHRlbmRzIEJhc2VNb2RlbE1CZWFuIHsKKworICAgIC8qKgorICAgICAqIFRoZSA8Y29kZT5NQmVhblNlcnZlcjwvY29kZT4gZm9yIHRoaXMgYXBwbGljYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgTUJlYW5TZXJ2ZXIgbXNlcnZlciA9IE1CZWFuVXRpbHMuY3JlYXRlU2VydmVyKCk7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgPGNvZGU+TW9kZWxNQmVhbjwvY29kZT4gd2l0aCBkZWZhdWx0CisgICAgICogPGNvZGU+TW9kZWxNQmVhbkluZm88L2NvZGU+IGluZm9ybWF0aW9uLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBNQmVhbkV4Y2VwdGlvbiBpZiB0aGUgaW5pdGlhbGl6ZXIgb2YgYW4gb2JqZWN0CisgICAgICogIHRocm93cyBhbiBleGNlcHRpb24KKyAgICAgKiBAZXhjZXB0aW9uIFJ1bnRpbWVPcGVyYXRpb25zRXhjZXB0aW9uIGlmIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RhbmRhcmRIb3N0TUJlYW4oKQorICAgICAgICB0aHJvd3MgTUJlYW5FeGNlcHRpb24sIFJ1bnRpbWVPcGVyYXRpb25zRXhjZXB0aW9uIHsKKworICAgICAgICBzdXBlcigpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEF0dHJpYnV0ZXMKKworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE9wZXJhdGlvbnMKKworCisgICAvKioKKyAgICAgKiBBZGQgYW4gYWxpYXMgbmFtZSB0aGF0IHNob3VsZCBiZSBtYXBwZWQgdG8gdGhpcyBIb3N0CisgICAgICoKKyAgICAgKiBAcGFyYW0gYWxpYXMgVGhlIGFsaWFzIHRvIGJlIGFkZGVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBNQmVhbiBjYW5ub3QgYmUgY3JlYXRlZCBvciByZWdpc3RlcmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQWxpYXMoU3RyaW5nIGFsaWFzKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBTdGFuZGFyZEhvc3QgaG9zdCA9IChTdGFuZGFyZEhvc3QpIHRoaXMucmVzb3VyY2U7CisgICAgICAgIGhvc3QuYWRkQWxpYXMoYWxpYXMpOworCisgICAgfQorCisKKyAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2V0IG9mIGFsaWFzIG5hbWVzIGZvciB0aGlzIEhvc3QKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIE1CZWFuIGNhbm5vdCBiZSBjcmVhdGVkIG9yIHJlZ2lzdGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIFtdIGZpbmRBbGlhc2VzKCkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgU3RhbmRhcmRIb3N0IGhvc3QgPSAoU3RhbmRhcmRIb3N0KSB0aGlzLnJlc291cmNlOworICAgICAgICByZXR1cm4gaG9zdC5maW5kQWxpYXNlcygpOworCisgICAgfQorCisKKyAgIC8qKgorICAgICAqIFJldHVybiB0aGUgTUJlYW4gTmFtZXMgb2YgdGhlIFZhbHZlcyBhc3NvaWNhdGVkIHdpdGggdGhpcyBIb3N0CisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBNQmVhbiBjYW5ub3QgYmUgY3JlYXRlZCBvciByZWdpc3RlcmVkCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBbXSBnZXRWYWx2ZXMoKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBSZWdpc3RyeSByZWdpc3RyeSA9IE1CZWFuVXRpbHMuY3JlYXRlUmVnaXN0cnkoKTsKKyAgICAgICAgU3RhbmRhcmRIb3N0IGhvc3QgPSAoU3RhbmRhcmRIb3N0KSB0aGlzLnJlc291cmNlOworICAgICAgICBTdHJpbmcgbW5hbWUgPSBNQmVhblV0aWxzLmNyZWF0ZU1hbmFnZWROYW1lKGhvc3QpOworICAgICAgICBNYW5hZ2VkQmVhbiBtYW5hZ2VkID0gcmVnaXN0cnkuZmluZE1hbmFnZWRCZWFuKG1uYW1lKTsKKyAgICAgICAgU3RyaW5nIGRvbWFpbiA9IG51bGw7CisgICAgICAgIGlmIChtYW5hZ2VkICE9IG51bGwpIHsKKyAgICAgICAgICAgIGRvbWFpbiA9IG1hbmFnZWQuZ2V0RG9tYWluKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRvbWFpbiA9PSBudWxsKQorICAgICAgICAgICAgZG9tYWluID0gbXNlcnZlci5nZXREZWZhdWx0RG9tYWluKCk7CisgICAgICAgIFZhbHZlIFtdIHZhbHZlcyA9IGhvc3QuZ2V0VmFsdmVzKCk7CisgICAgICAgIFN0cmluZyBbXSBtYmVhbk5hbWVzID0gbmV3IFN0cmluZ1t2YWx2ZXMubGVuZ3RoXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx2ZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIG1iZWFuTmFtZXNbaV0gPQorICAgICAgICAgICAgICAgIE1CZWFuVXRpbHMuY3JlYXRlT2JqZWN0TmFtZShkb21haW4sIHZhbHZlc1tpXSkudG9TdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBtYmVhbk5hbWVzOworCisgICAgfQorCisKKyAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc3BlY2lmaWVkIGFsaWFzIG5hbWUgZnJvbSB0aGUgYWxpYXNlcyBmb3IgdGhpcyBIb3N0CisgICAgICoKKyAgICAgKiBAcGFyYW0gYWxpYXMgQWxpYXMgbmFtZSB0byBiZSByZW1vdmVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBNQmVhbiBjYW5ub3QgYmUgY3JlYXRlZCBvciByZWdpc3RlcmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlQWxpYXMoU3RyaW5nIGFsaWFzKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBTdGFuZGFyZEhvc3QgaG9zdCA9IChTdGFuZGFyZEhvc3QpIHRoaXMucmVzb3VyY2U7CisgICAgICAgIGhvc3QucmVtb3ZlQWxpYXMoYWxpYXMpOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9tYmVhbnMvU3RhbmRhcmRTZXJ2ZXJNQmVhbi5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL21iZWFucy9TdGFuZGFyZFNlcnZlck1CZWFuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdlMDRjNgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9tYmVhbnMvU3RhbmRhcmRTZXJ2ZXJNQmVhbi5qYXZhCkBAIC0wLDAgKzEsMTAyIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5tYmVhbnM7CisKKworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuSW5zdGFuY2VOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5SdW50aW1lT3BlcmF0aW9uc0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlNlcnZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlNlcnZlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkU2VydmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5tb2RlbGVyLkJhc2VNb2RlbE1CZWFuOworCisKKy8qKgorICogPHA+QSA8c3Ryb25nPk1vZGVsTUJlYW48L3N0cm9uZz4gaW1wbGVtZW50YXRpb24gZm9yIHRoZQorICogPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkU2VydmVyPC9jb2RlPiBjb21wb25lbnQuPC9wPgorICoKKyAqIEBhdXRob3IgQW15IFJvaAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgU3RhbmRhcmRTZXJ2ZXJNQmVhbiBleHRlbmRzIEJhc2VNb2RlbE1CZWFuIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTdGF0aWMgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSA8Y29kZT5NQmVhblNlcnZlcjwvY29kZT4gZm9yIHRoaXMgYXBwbGljYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgTUJlYW5TZXJ2ZXIgbXNlcnZlciA9IE1CZWFuVXRpbHMuY3JlYXRlU2VydmVyKCk7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSA8Y29kZT5Nb2RlbE1CZWFuPC9jb2RlPiB3aXRoIGRlZmF1bHQKKyAgICAgKiA8Y29kZT5Nb2RlbE1CZWFuSW5mbzwvY29kZT4gaW5mb3JtYXRpb24uCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIE1CZWFuRXhjZXB0aW9uIGlmIHRoZSBpbml0aWFsaXplciBvZiBhbiBvYmplY3QKKyAgICAgKiAgdGhyb3dzIGFuIGV4Y2VwdGlvbgorICAgICAqIEBleGNlcHRpb24gUnVudGltZU9wZXJhdGlvbnNFeGNlcHRpb24gaWYgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBTdGFuZGFyZFNlcnZlck1CZWFuKCkKKyAgICAgICAgdGhyb3dzIE1CZWFuRXhjZXB0aW9uLCBSdW50aW1lT3BlcmF0aW9uc0V4Y2VwdGlvbiB7CisKKyAgICAgICAgc3VwZXIoKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBBdHRyaWJ1dGVzCisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gT3BlcmF0aW9ucworCisKKyAgICAvKioKKyAgICAgKiBXcml0ZSB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhpcyBlbnRpcmUgPGNvZGU+U2VydmVyPC9jb2RlPgorICAgICAqIG91dCB0byB0aGUgc2VydmVyLnhtbCBjb25maWd1cmF0aW9uIGZpbGUuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEluc3RhbmNlTm90Rm91bmRFeGNlcHRpb24gaWYgdGhlIG1hbmFnZWQgcmVzb3VyY2Ugb2JqZWN0CisgICAgICogIGNhbm5vdCBiZSBmb3VuZAorICAgICAqIEBleGNlcHRpb24gTUJlYW5FeGNlcHRpb24gaWYgdGhlIGluaXRpYWxpemVyIG9mIHRoZSBvYmplY3QgdGhyb3dzCisgICAgICogIGFuIGV4Y2VwdGlvbiwgb3IgcGVyc2lzdGVuY2UgaXMgbm90IHN1cHBvcnRlZAorICAgICAqIEBleGNlcHRpb24gUnVudGltZU9wZXJhdGlvbnNFeGNlcHRpb24gaWYgYW4gZXhjZXB0aW9uIGlzIHJlcG9ydGVkCisgICAgICogIGJ5IHRoZSBwZXJzaXN0ZW5jZSBtZWNoYW5pc20KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc3RvcmUoKSB0aHJvd3MgSW5zdGFuY2VOb3RGb3VuZEV4Y2VwdGlvbiwKKyAgICAgICAgTUJlYW5FeGNlcHRpb24sIFJ1bnRpbWVPcGVyYXRpb25zRXhjZXB0aW9uIHsKKworICAgICAgICBTZXJ2ZXIgc2VydmVyID0gU2VydmVyRmFjdG9yeS5nZXRTZXJ2ZXIoKTsKKyAgICAgICAgaWYgKHNlcnZlciBpbnN0YW5jZW9mIFN0YW5kYXJkU2VydmVyKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICgoU3RhbmRhcmRTZXJ2ZXIpIHNlcnZlcikuc3RvcmVDb25maWcoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1CZWFuRXhjZXB0aW9uKGUsICJFcnJvciB1cGRhdGluZyBjb25mL3NlcnZlci54bWwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9tYmVhbnMvU3RhbmRhcmRTZXJ2aWNlTUJlYW4uamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9tYmVhbnMvU3RhbmRhcmRTZXJ2aWNlTUJlYW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDI2ZGMzCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL21iZWFucy9TdGFuZGFyZFNlcnZpY2VNQmVhbi5qYXZhCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLm1iZWFuczsKKworCitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuUnVudGltZU9wZXJhdGlvbnNFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubW9kZWxlci5CYXNlTW9kZWxNQmVhbjsKKworCisvKioKKyAqIDxwPkEgPHN0cm9uZz5Nb2RlbE1CZWFuPC9zdHJvbmc+IGltcGxlbWVudGF0aW9uIGZvciB0aGUKKyAqIDxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZFNlcnZpY2U8L2NvZGU+IGNvbXBvbmVudC48L3A+CisgKgorICogQGF1dGhvciBBbXkgUm9oCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBTdGFuZGFyZFNlcnZpY2VNQmVhbiBleHRlbmRzIEJhc2VNb2RlbE1CZWFuIHsKKworICAgIC8qKgorICAgICAqIFRoZSA8Y29kZT5NQmVhblNlcnZlcjwvY29kZT4gZm9yIHRoaXMgYXBwbGljYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgTUJlYW5TZXJ2ZXIgbXNlcnZlciA9IE1CZWFuVXRpbHMuY3JlYXRlU2VydmVyKCk7CisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIDxjb2RlPk1vZGVsTUJlYW48L2NvZGU+IHdpdGggZGVmYXVsdAorICAgICAqIDxjb2RlPk1vZGVsTUJlYW5JbmZvPC9jb2RlPiBpbmZvcm1hdGlvbi4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTUJlYW5FeGNlcHRpb24gaWYgdGhlIGluaXRpYWxpemVyIG9mIGFuIG9iamVjdAorICAgICAqICB0aHJvd3MgYW4gZXhjZXB0aW9uCisgICAgICogQGV4Y2VwdGlvbiBSdW50aW1lT3BlcmF0aW9uc0V4Y2VwdGlvbiBpZiBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgb2NjdXJzCisgICAgICovCisgICAgcHVibGljIFN0YW5kYXJkU2VydmljZU1CZWFuKCkKKyAgICAgICAgdGhyb3dzIE1CZWFuRXhjZXB0aW9uLCBSdW50aW1lT3BlcmF0aW9uc0V4Y2VwdGlvbiB7CisKKyAgICAgICAgc3VwZXIoKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBBdHRyaWJ1dGVzCisKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBPcGVyYXRpb25zCisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL21iZWFucy9Vc2VyTUJlYW4uamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9tYmVhbnMvVXNlck1CZWFuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhjM2U0MwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9tYmVhbnMvVXNlck1CZWFuLmphdmEKQEAgLTAsMCArMSwyNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLm1iZWFuczsKKworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NYWxmb3JtZWRPYmplY3ROYW1lRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LlJ1bnRpbWVPcGVyYXRpb25zRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Hcm91cDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlJvbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Vc2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5tb2RlbGVyLkJhc2VNb2RlbE1CZWFuOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5tb2RlbGVyLk1hbmFnZWRCZWFuOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5tb2RlbGVyLlJlZ2lzdHJ5OworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuY29tcGF0Lkpka0NvbXBhdDsKKworLyoqCisgKiA8cD5BIDxzdHJvbmc+TW9kZWxNQmVhbjwvc3Ryb25nPiBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlCisgKiA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLlVzZXI8L2NvZGU+IGNvbXBvbmVudC48L3A+CisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBVc2VyTUJlYW4gZXh0ZW5kcyBCYXNlTW9kZWxNQmVhbiB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSA8Y29kZT5Nb2RlbE1CZWFuPC9jb2RlPiB3aXRoIGRlZmF1bHQKKyAgICAgKiA8Y29kZT5Nb2RlbE1CZWFuSW5mbzwvY29kZT4gaW5mb3JtYXRpb24uCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIE1CZWFuRXhjZXB0aW9uIGlmIHRoZSBpbml0aWFsaXplciBvZiBhbiBvYmplY3QKKyAgICAgKiAgdGhyb3dzIGFuIGV4Y2VwdGlvbgorICAgICAqIEBleGNlcHRpb24gUnVudGltZU9wZXJhdGlvbnNFeGNlcHRpb24gaWYgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBVc2VyTUJlYW4oKQorICAgICAgICB0aHJvd3MgTUJlYW5FeGNlcHRpb24sIFJ1bnRpbWVPcGVyYXRpb25zRXhjZXB0aW9uIHsKKworICAgICAgICBzdXBlcigpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDbGFzcyBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogSkRLIGNvbXBhdGliaWxpdHkgc3VwcG9ydAorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEpka0NvbXBhdCBqZGtDb21wYXQgPSBKZGtDb21wYXQuZ2V0SmRrQ29tcGF0KCk7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiByZWdpc3RyeSBmb3Igb3VyIG1hbmFnZWQgYmVhbnMuCisgICAgICovCisgICAgcHJvdGVjdGVkIFJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gTUJlYW5VdGlscy5jcmVhdGVSZWdpc3RyeSgpOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgPGNvZGU+TUJlYW5TZXJ2ZXI8L2NvZGU+IGluIHdoaWNoIHdlIGFyZSByZWdpc3RlcmVkLgorICAgICAqLworICAgIHByb3RlY3RlZCBNQmVhblNlcnZlciBtc2VydmVyID0gTUJlYW5VdGlscy5jcmVhdGVTZXJ2ZXIoKTsKKworCisgICAgLyoqCisgICAgICogVGhlIDxjb2RlPk1hbmFnZWRCZWFuPC9jb2RlPiBpbmZvcm1hdGlvbiBkZXNjcmliaW5nIHRoaXMgTUJlYW4uCisgICAgICovCisgICAgcHJvdGVjdGVkIE1hbmFnZWRCZWFuIG1hbmFnZWQgPQorICAgICAgICByZWdpc3RyeS5maW5kTWFuYWdlZEJlYW4oIlVzZXIiKTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBBdHRyaWJ1dGVzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgTUJlYW4gTmFtZXMgb2YgYWxsIGdyb3VwcyB0aGlzIHVzZXIgaXMgYSBtZW1iZXIgb2YuCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGdldEdyb3VwcygpIHsKKworICAgICAgICBVc2VyIHVzZXIgPSAoVXNlcikgdGhpcy5yZXNvdXJjZTsKKyAgICAgICAgQXJyYXlMaXN0IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIEl0ZXJhdG9yIGdyb3VwcyA9IHVzZXIuZ2V0R3JvdXBzKCk7CisgICAgICAgIHdoaWxlIChncm91cHMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBHcm91cCBncm91cCA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGdyb3VwID0gKEdyb3VwKSBncm91cHMubmV4dCgpOworICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPQorICAgICAgICAgICAgICAgICAgICBNQmVhblV0aWxzLmNyZWF0ZU9iamVjdE5hbWUobWFuYWdlZC5nZXREb21haW4oKSwgZ3JvdXApOworICAgICAgICAgICAgICAgIHJlc3VsdHMuYWRkKG9uYW1lLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlhZSA9IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgKCJDYW5ub3QgY3JlYXRlIG9iamVjdCBuYW1lIGZvciBncm91cCAiICsgZ3JvdXApOworICAgICAgICAgICAgICAgIGpka0NvbXBhdC5jaGFpbkV4Y2VwdGlvbihpYWUsIGUpOworICAgICAgICAgICAgICAgIHRocm93IGlhZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKChTdHJpbmdbXSkgcmVzdWx0cy50b0FycmF5KG5ldyBTdHJpbmdbcmVzdWx0cy5zaXplKCldKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgTUJlYW4gTmFtZXMgb2YgYWxsIHJvbGVzIGFzc2lnbmVkIHRvIHRoaXMgdXNlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0Um9sZXMoKSB7CisKKyAgICAgICAgVXNlciB1c2VyID0gKFVzZXIpIHRoaXMucmVzb3VyY2U7CisgICAgICAgIEFycmF5TGlzdCByZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBJdGVyYXRvciByb2xlcyA9IHVzZXIuZ2V0Um9sZXMoKTsKKyAgICAgICAgd2hpbGUgKHJvbGVzLmhhc05leHQoKSkgeworICAgICAgICAgICAgUm9sZSByb2xlID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcm9sZSA9IChSb2xlKSByb2xlcy5uZXh0KCk7CisgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9CisgICAgICAgICAgICAgICAgICAgIE1CZWFuVXRpbHMuY3JlYXRlT2JqZWN0TmFtZShtYW5hZ2VkLmdldERvbWFpbigpLCByb2xlKTsKKyAgICAgICAgICAgICAgICByZXN1bHRzLmFkZChvbmFtZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZE9iamVjdE5hbWVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUgPSBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgICgiQ2Fubm90IGNyZWF0ZSBvYmplY3QgbmFtZSBmb3Igcm9sZSAiICsgcm9sZSk7CisgICAgICAgICAgICAgICAgamRrQ29tcGF0LmNoYWluRXhjZXB0aW9uKGlhZSwgZSk7CisgICAgICAgICAgICAgICAgdGhyb3cgaWFlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAoKFN0cmluZ1tdKSByZXN1bHRzLnRvQXJyYXkobmV3IFN0cmluZ1tyZXN1bHRzLnNpemUoKV0pKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBPcGVyYXRpb25zCisKKworICAgIC8qKgorICAgICAqIEFkZCBhIG5ldyB7QGxpbmsgR3JvdXB9IHRvIHRob3NlIHRoaXMgdXNlciBiZWxvbmdzIHRvLgorICAgICAqCisgICAgICogQHBhcmFtIGdyb3VwbmFtZSBHcm91cCBuYW1lIG9mIHRoZSBuZXcgZ3JvdXAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRHcm91cChTdHJpbmcgZ3JvdXBuYW1lKSB7CisKKyAgICAgICAgVXNlciB1c2VyID0gKFVzZXIpIHRoaXMucmVzb3VyY2U7CisgICAgICAgIGlmICh1c2VyID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBHcm91cCBncm91cCA9IHVzZXIuZ2V0VXNlckRhdGFiYXNlKCkuZmluZEdyb3VwKGdyb3VwbmFtZSk7CisgICAgICAgIGlmIChncm91cCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKCJJbnZhbGlkIGdyb3VwIG5hbWUgJyIgKyBncm91cG5hbWUgKyAiJyIpOworICAgICAgICB9CisgICAgICAgIHVzZXIuYWRkR3JvdXAoZ3JvdXApOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBuZXcge0BsaW5rIFJvbGV9IHRvIHRob3NlIHRoaXMgdXNlciBiZWxvbmdzIHRvLgorICAgICAqCisgICAgICogQHBhcmFtIHJvbGVuYW1lIFJvbGUgbmFtZSBvZiB0aGUgbmV3IHJvbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRSb2xlKFN0cmluZyByb2xlbmFtZSkgeworCisgICAgICAgIFVzZXIgdXNlciA9IChVc2VyKSB0aGlzLnJlc291cmNlOworICAgICAgICBpZiAodXNlciA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgUm9sZSByb2xlID0gdXNlci5nZXRVc2VyRGF0YWJhc2UoKS5maW5kUm9sZShyb2xlbmFtZSk7CisgICAgICAgIGlmIChyb2xlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoIkludmFsaWQgcm9sZSBuYW1lICciICsgcm9sZW5hbWUgKyAiJyIpOworICAgICAgICB9CisgICAgICAgIHVzZXIuYWRkUm9sZShyb2xlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGEge0BsaW5rIEdyb3VwfSBmcm9tIHRob3NlIHRoaXMgdXNlciBiZWxvbmdzIHRvLgorICAgICAqCisgICAgICogQHBhcmFtIGdyb3VwbmFtZSBHcm91cCBuYW1lIG9mIHRoZSBvbGQgZ3JvdXAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVHcm91cChTdHJpbmcgZ3JvdXBuYW1lKSB7CisKKyAgICAgICAgVXNlciB1c2VyID0gKFVzZXIpIHRoaXMucmVzb3VyY2U7CisgICAgICAgIGlmICh1c2VyID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBHcm91cCBncm91cCA9IHVzZXIuZ2V0VXNlckRhdGFiYXNlKCkuZmluZEdyb3VwKGdyb3VwbmFtZSk7CisgICAgICAgIGlmIChncm91cCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKCJJbnZhbGlkIGdyb3VwIG5hbWUgJyIgKyBncm91cG5hbWUgKyAiJyIpOworICAgICAgICB9CisgICAgICAgIHVzZXIucmVtb3ZlR3JvdXAoZ3JvdXApOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSB7QGxpbmsgUm9sZX0gZnJvbSB0aG9zZSB0aGlzIHVzZXIgYmVsb25ncyB0by4KKyAgICAgKgorICAgICAqIEBwYXJhbSByb2xlbmFtZSBSb2xlIG5hbWUgb2YgdGhlIG9sZCByb2xlCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlUm9sZShTdHJpbmcgcm9sZW5hbWUpIHsKKworICAgICAgICBVc2VyIHVzZXIgPSAoVXNlcikgdGhpcy5yZXNvdXJjZTsKKyAgICAgICAgaWYgKHVzZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIFJvbGUgcm9sZSA9IHVzZXIuZ2V0VXNlckRhdGFiYXNlKCkuZmluZFJvbGUocm9sZW5hbWUpOworICAgICAgICBpZiAocm9sZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKCJJbnZhbGlkIHJvbGUgbmFtZSAnIiArIHJvbGVuYW1lICsgIiciKTsKKyAgICAgICAgfQorICAgICAgICB1c2VyLnJlbW92ZVJvbGUocm9sZSk7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL21iZWFucy9tYmVhbnMtZGVzY3JpcHRvcnMueG1sIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL21iZWFucy9tYmVhbnMtZGVzY3JpcHRvcnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzNDEyNTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvbWJlYW5zL21iZWFucy1kZXNjcmlwdG9ycy54bWwKQEAgLTAsMCArMSwzOTYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPG1iZWFucy1kZXNjcmlwdG9ycz4KKworICA8bWJlYW4gICAgICAgICBuYW1lPSJNQmVhbkZhY3RvcnkiCisgICAgICAgICAgICBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEubWJlYW5zLk1CZWFuRmFjdG9yeSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iRmFjdG9yeSBmb3IgTUJlYW5zIGFuZCBjb3JyZXNwb25kaW5nIGNvbXBvbmVudHMiCisgICAgICAgICAgICAgICBkb21haW49IkNhdGFsaW5hIj4KKworICAgIDwhLS0gSU1QTEVNRU5UQVRJT04gTk9URSAtIGFsbCBvZiB0aGUgY3JlYXRlWHh4eHggbWV0aG9kcyBjcmVhdGUgYSBuZXcgIC0tPgorICAgIDwhLS0gY29tcG9uZW50IGFuZCBhdHRhY2ggaXQgdG8gQ2F0YWxpbmEncyBjb21wb25lbnQgdHJlZS4gIFRoZSByZXR1cm4gIC0tPgorICAgIDwhLS0gdmFsdWUgaXMgdGhlIG9iamVjdCBuYW1lIG9mIHRoZSBjb3JyZXNwb25kaW5nIE1CZWFuIGZvciB0aGUgbmV3ICAgIC0tPgorICAgIDwhLS0gY29tcG9uZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorCisgICAgPG9wZXJhdGlvbiAgIG5hbWU9ImNyZWF0ZUFjY2Vzc0xvZ2dlclZhbHZlIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgYSBuZXcgQWNjZXNzTG9nZ2VyVmFsdmUiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgcmV0dXJuVHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9InBhcmVudCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iTUJlYW4gTmFtZSBvZiB0aGUgYXNzb2NpYXRlZCBwYXJlbnQgY29tcG9uZW50IgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgPC9vcGVyYXRpb24+CisKKyAgICA8b3BlcmF0aW9uICAgbmFtZT0iY3JlYXRlQWpwQ29ubmVjdG9yIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgYSBuZXcgQWpwQ29ubmVjdG9yIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgIHJldHVyblR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJlbnQiCisgICAgICAgICAgZGVzY3JpcHRpb249Ik1CZWFuIE5hbWUgb2YgdGhlIGFzc29jaWF0ZWQgcGFyZW50IGNvbXBvbmVudCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJhZGRyZXNzIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgSVAgYWRkcmVzcyBvbiB3aGljaCB0byBiaW5kIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9InBvcnQiCisgICAgICAgICAgZGVzY3JpcHRpb249IlRDUCBwb3J0IG51bWJlciB0byBsaXN0ZW4gb24iCisgICAgICAgICAgICAgICAgIHR5cGU9ImludCIvPgorICAgIDwvb3BlcmF0aW9uPgorCisgICAgPG9wZXJhdGlvbiAgIG5hbWU9ImNyZWF0ZURhdGFTb3VyY2VSZWFsbSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIGEgbmV3IERhdGFTb3VyY2UgUmVhbG0iCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgcmV0dXJuVHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9InBhcmVudCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iTUJlYW4gTmFtZSBvZiB0aGUgYXNzb2NpYXRlZCBwYXJlbnQgY29tcG9uZW50IgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9ImRhdGFTb3VyY2VOYW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgSk5ESSBuYW1lZCBKREJDIERhdGFTb3VyY2UiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icm9sZU5hbWVDb2wiCisgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBjb2x1bW4gaW4gdGhlIHVzZXIgcm9sZSB0YWJsZSB0aGF0IG5hbWVzIGEgcm9sZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJ1c2VyQ3JlZENvbCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIGNvbHVtbiBpbiB0aGUgdXNlciB0YWJsZSB0aGF0IGhvbGRzIHRoZSB1c2VyJ3MKKyAgICAgICAgICAgICAgICAgICAgICAgIGNyZWRlbnRpYWxzIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9InVzZXJOYW1lQ29sIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgY29sdW1uIGluIHRoZSB1c2VyIHRhYmxlIHRoYXQgaG9sZHMgdGhlIHVzZXIncworICAgICAgICAgICAgICAgICAgICAgICAgdXNlcm5hbWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0idXNlclJvbGVUYWJsZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIHRhYmxlIHRoYXQgaG9sZHMgdGhlIHJlbGF0aW9uIGJldHdlZW4gdXNlcidzIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgcm9sZXMiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0idXNlclRhYmxlIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgdGFibGUgdGhhdCBob2xkcyB1c2VyIGRhdGEiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICA8L29wZXJhdGlvbj4KKworICAgIDxvcGVyYXRpb24gICBuYW1lPSJjcmVhdGVEZWZhdWx0Q29udGV4dCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIGEgbmV3IERlZmF1bHRDb250ZXh0IgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgIHJldHVyblR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJlbnQiCisgICAgICAgICAgZGVzY3JpcHRpb249Ik1CZWFuIE5hbWUgb2YgdGhlIGFzc29jaWF0ZWQgcGFyZW50IGNvbXBvbmVudCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgIDwvb3BlcmF0aW9uPgorCisgICAgPG9wZXJhdGlvbiAgIG5hbWU9ImNyZWF0ZUZpbGVMb2dnZXIiCisgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBhIG5ldyBGaWxlTG9nZ2VyIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgIHJldHVyblR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJlbnQiCisgICAgICAgICAgZGVzY3JpcHRpb249Ik1CZWFuIE5hbWUgb2YgdGhlIGFzc29jaWF0ZWQgcGFyZW50IGNvbXBvbmVudCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgIDwvb3BlcmF0aW9uPgorCisgICAgPG9wZXJhdGlvbiAgIG5hbWU9ImNyZWF0ZUh0dHBDb25uZWN0b3IiCisgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBhIG5ldyBIdHRwQ29ubmVjdG9yIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgIHJldHVyblR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJlbnQiCisgICAgICAgICAgZGVzY3JpcHRpb249Ik1CZWFuIE5hbWUgb2YgdGhlIGFzc29jaWF0ZWQgcGFyZW50IGNvbXBvbmVudCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgICA8cGFyYW1ldGVyIG5hbWU9ImFkZHJlc3MiCisgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBJUCBhZGRyZXNzIG9uIHdoaWNoIHRvIGJpbmQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icG9ydCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVENQIHBvcnQgbnVtYmVyIHRvIGxpc3RlbiBvbiIKKyAgICAgICAgICAgICAgICAgdHlwZT0iaW50Ii8+CisgICAgPC9vcGVyYXRpb24+CisKKyAgICA8b3BlcmF0aW9uICAgbmFtZT0iY3JlYXRlSHR0cHNDb25uZWN0b3IiCisgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBhIG5ldyBIdHRwc0Nvbm5lY3RvciIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICByZXR1cm5UeXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyZW50IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJNQmVhbiBOYW1lIG9mIHRoZSBhc3NvY2lhdGVkIHBhcmVudCBjb21wb25lbnQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iYWRkcmVzcyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIElQIGFkZHJlc3Mgb24gd2hpY2ggdG8gYmluZCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJwb3J0IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJUQ1AgcG9ydCBudW1iZXIgdG8gbGlzdGVuIG9uIgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiLz4KKyAgICA8L29wZXJhdGlvbj4KKworICAgIDxvcGVyYXRpb24gICBuYW1lPSJjcmVhdGVKREJDUmVhbG0iCisgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBhIG5ldyBKREJDIFJlYWxtIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgIHJldHVyblR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJlbnQiCisgICAgICAgICAgZGVzY3JpcHRpb249Ik1CZWFuIE5hbWUgb2YgdGhlIGFzc29jaWF0ZWQgcGFyZW50IGNvbXBvbmVudCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgIDwvb3BlcmF0aW9uPgorCisgICAgPG9wZXJhdGlvbiAgIG5hbWU9ImNyZWF0ZUpORElSZWFsbSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIGEgbmV3IEpOREkgUmVhbG0iCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgcmV0dXJuVHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9InBhcmVudCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iTUJlYW4gTmFtZSBvZiB0aGUgYXNzb2NpYXRlZCBwYXJlbnQgY29tcG9uZW50IgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgPC9vcGVyYXRpb24+CisKKyAgICA8b3BlcmF0aW9uICAgbmFtZT0iY3JlYXRlTWVtb3J5UmVhbG0iCisgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBhIG5ldyBNZW1vcnkgUmVhbG0iCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgcmV0dXJuVHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9InBhcmVudCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iTUJlYW4gTmFtZSBvZiB0aGUgYXNzb2NpYXRlZCBwYXJlbnQgY29tcG9uZW50IgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgPC9vcGVyYXRpb24+CisKKyAgICA8b3BlcmF0aW9uICAgbmFtZT0iY3JlYXRlUmVtb3RlQWRkclZhbHZlIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgYSBuZXcgUmVtb3RlIEFkZHJlc3MgRmlsdGVyIFZhbHZlIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgIHJldHVyblR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJlbnQiCisgICAgICAgICAgZGVzY3JpcHRpb249Ik1CZWFuIE5hbWUgb2YgdGhlIGFzc29jaWF0ZWQgcGFyZW50IGNvbXBvbmVudCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgIDwvb3BlcmF0aW9uPgorCisgICAgPG9wZXJhdGlvbiAgIG5hbWU9ImNyZWF0ZVJlbW90ZUhvc3RWYWx2ZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIGEgbmV3IFJlbW90ZSBIb3N0IEZpbHRlciBWYWx2ZSIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICByZXR1cm5UeXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyZW50IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJNQmVhbiBOYW1lIG9mIHRoZSBhc3NvY2lhdGVkIHBhcmVudCBjb21wb25lbnQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICA8L29wZXJhdGlvbj4KKworICAgIDxvcGVyYXRpb24gICBuYW1lPSJjcmVhdGVSZXF1ZXN0RHVtcGVyVmFsdmUiCisgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBhIG5ldyBSZXF1ZXN0IER1bXBlciBWYWx2ZSIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICByZXR1cm5UeXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyZW50IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJNQmVhbiBOYW1lIG9mIHRoZSBhc3NvY2lhdGVkIHBhcmVudCBjb21wb25lbnQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICA8L29wZXJhdGlvbj4KKworICAgIDxvcGVyYXRpb24gICBuYW1lPSJjcmVhdGVTaW5nbGVTaWduT24iCisgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBhIG5ldyBTaW5nbGUgU2lnbiBPbiBWYWx2ZSIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICByZXR1cm5UeXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyZW50IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJNQmVhbiBOYW1lIG9mIHRoZSBhc3NvY2lhdGVkIHBhcmVudCBjb21wb25lbnQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICA8L29wZXJhdGlvbj4KKworICAgIDxvcGVyYXRpb24gICBuYW1lPSJjcmVhdGVTdGFuZGFyZENvbnRleHQiCisgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBhIG5ldyBTdGFuZGFyZENvbnRleHQiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgcmV0dXJuVHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9InBhcmVudCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iTUJlYW4gTmFtZSBvZiB0aGUgYXNzb2NpYXRlZCBwYXJlbnQgY29tcG9uZW50IgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9InBhdGgiCisgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBjb250ZXh0IHBhdGggZm9yIHRoaXMgQ29udGV4dCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJkb2NCYXNlIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJEb2N1bWVudCBiYXNlIGRpcmVjdG9yeSAob3IgV0FSKSBmb3IgdGhzIENvbnRleHQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICA8L29wZXJhdGlvbj4KKworICAgIDxvcGVyYXRpb24gICBuYW1lPSJjcmVhdGVTdGFuZGFyZEVuZ2luZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIGEgbmV3IFN0YW5kYXJkRW5naW5lIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgIHJldHVyblR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJlbnQiCisgICAgICAgICAgZGVzY3JpcHRpb249Ik1CZWFuIE5hbWUgb2YgdGhlIGFzc29jaWF0ZWQgcGFyZW50IGNvbXBvbmVudCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJuYW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJVbmlxdWUgbmFtZSBvZiB0aGlzIEVuZ2luZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJkZWZhdWx0SG9zdCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iRGVmYXVsdCBob3N0IG5hbWUgZm9yIHRoaXMgRW5naW5lIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgPC9vcGVyYXRpb24+CisKKyAgICA8b3BlcmF0aW9uICAgbmFtZT0iY3JlYXRlU3RhbmRhcmRFbmdpbmVTZXJ2aWNlIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgYSBuZXcgU3RhbmRhcmRFbmdpbmUgYW5kIFN0YW5kYXJkU2VydmljZSIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICByZXR1cm5UeXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyZW50IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJNQmVhbiBOYW1lIG9mIHRoZSBhc3NvY2lhdGVkIHBhcmVudCBTZXJ2aWNlIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9ImVuZ2luZU5hbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249IlVuaXF1ZSBuYW1lIG9mIHRoaXMgRW5naW5lIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9ImRlZmF1bHRIb3N0IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJEZWZhdWx0IGhvc3QgbmFtZSBmb3IgdGhpcyBFbmdpbmUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0ic2VydmljZU5hbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249IlVuaXF1ZSBuYW1lIG9mIHRoaXMgU2VydmljZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgIDwvb3BlcmF0aW9uPgorCisgICAgPG9wZXJhdGlvbiAgIG5hbWU9ImNyZWF0ZVN0YW5kYXJkSG9zdCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIGEgbmV3IFN0YW5kYXJkSG9zdCIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICByZXR1cm5UeXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyZW50IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJNQmVhbiBOYW1lIG9mIHRoZSBhc3NvY2lhdGVkIHBhcmVudCBjb21wb25lbnQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0ibmFtZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVW5pcXVlIG5hbWUgb2YgdGhpcyBIb3N0IgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9ImFwcEJhc2UiCisgICAgICAgICAgZGVzY3JpcHRpb249IkFwcGxpY2F0aW9uIGJhc2UgZGlyZWN0b3J5IGZvciB0aGlzIEhvc3QiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0idW5wYWNrV0FScyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iU2hvdWxkIHdlIHVucGFjayBXQVJzIHdoZW4gYXV0by1kZXBsb3lpbmc/IgorICAgICAgICAgICAgICAgICB0eXBlPSJib29sZWFuIi8+CisgICAgPC9vcGVyYXRpb24+CisKKyAgICA8b3BlcmF0aW9uICAgbmFtZT0iY3JlYXRlU3RhbmRhcmRNYW5hZ2VyIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgYSBuZXcgU3RhbmRhcmRNYW5hZ2VyIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgIHJldHVyblR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJlbnQiCisgICAgICAgICAgZGVzY3JpcHRpb249Ik1CZWFuIE5hbWUgb2YgdGhlIGFzc29jaWF0ZWQgcGFyZW50IGNvbXBvbmVudCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgIDwvb3BlcmF0aW9uPgorCisgICAgPG9wZXJhdGlvbiAgIG5hbWU9ImNyZWF0ZVN0YW5kYXJkU2VydmljZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIGEgbmV3IFN0YW5kYXJkU2VydmljZSIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICByZXR1cm5UeXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyZW50IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJNQmVhbiBOYW1lIG9mIHRoZSBhc3NvY2lhdGVkIHBhcmVudCBjb21wb25lbnQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0ibmFtZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVW5pcXVlIG5hbWUgb2YgdGhpcyBTZXJ2aWNlIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9ImRvbWFpbiIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIGRvbWFpbiBvZiB0aGlzIFNlcnZpY2UiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICA8L29wZXJhdGlvbj4KKworICAgIDxvcGVyYXRpb24gICBuYW1lPSJjcmVhdGVTeXN0ZW1FcnJMb2dnZXIiCisgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBhIG5ldyBTeXN0ZW0gRXJyb3IgTG9nZ2VyIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgIHJldHVyblR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJlbnQiCisgICAgICAgICAgZGVzY3JpcHRpb249Ik1CZWFuIE5hbWUgb2YgdGhlIGFzc29jaWF0ZWQgcGFyZW50IGNvbXBvbmVudCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgIDwvb3BlcmF0aW9uPgorCisgICAgPG9wZXJhdGlvbiAgIG5hbWU9ImNyZWF0ZVN5c3RlbU91dExvZ2dlciIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIGEgbmV3IFN5c3RlbSBPdXRwdXQgTG9nZ2VyIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgIHJldHVyblR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJlbnQiCisgICAgICAgICAgZGVzY3JpcHRpb249Ik1CZWFuIE5hbWUgb2YgdGhlIGFzc29jaWF0ZWQgcGFyZW50IGNvbXBvbmVudCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgIDwvb3BlcmF0aW9uPgorCisgICAgPG9wZXJhdGlvbiAgIG5hbWU9ImNyZWF0ZVVzZXJEYXRhYmFzZVJlYWxtIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgYSBuZXcgVXNlckRhdGFiYXNlIFJlYWxtIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgIHJldHVyblR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJlbnQiCisgICAgICAgICAgZGVzY3JpcHRpb249Ik1CZWFuIE5hbWUgb2YgdGhlIGFzc29jaWF0ZWQgcGFyZW50IGNvbXBvbmVudCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJyZXNvdXJjZU5hbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249Ikdsb2JhbCBKTkRJIHJlc291cmNlIG5hbWUgb2Ygb3VyIFVzZXJEYXRhYmFzZSBpbnN0YW5jZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgIDwvb3BlcmF0aW9uPgorCisgICAgPG9wZXJhdGlvbiAgIG5hbWU9ImNyZWF0ZVdlYmFwcExvYWRlciIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIGEgbmV3IFdlYiBBcHBsaWNhdGlvbiBMb2FkZXIiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgcmV0dXJuVHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9InBhcmVudCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iTUJlYW4gTmFtZSBvZiB0aGUgYXNzb2NpYXRlZCBwYXJlbnQgY29tcG9uZW50IgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgPC9vcGVyYXRpb24+CisKKyAgICA8IS0tIElNUExFTUVOVEFUSU9OIE5PVEUgLSBhbGwgb2YgdGhlIHJlbW92ZVh4eHh4IG1ldGhvZHMgY2F1c2UgdGhlICAgICAtLT4KKyAgICA8IS0tIGNvcnJlc3BvbmRpbmcgQ2F0YWxpbmEgY29tcG9uZW50IChhbmQgYW55IHJlbGF0ZWQgY2hpbGQgICAgICAgICAgICAtLT4KKyAgICA8IS0tIGNvbXBvbmVudHMgdG8gYmUgc3RvcHBlZCAoaWYgbmVjZXNzYXJ5KSBhbmQgcmVtb3ZlZCwgYW5kIHRoZSAgICAgICAtLT4KKyAgICA8IS0tIGNvcnJlc3BvbmRpbmcgTUJlYW5zIHRvIGJlIGRlc3Ryb3llZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKworICAgIDxvcGVyYXRpb24gICBuYW1lPSJyZW1vdmVDb25uZWN0b3IiCisgICAgICAgICAgZGVzY3JpcHRpb249IlJlbW92ZSBhbiBleGlzdGluZyBDb25uZWN0b3IiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgcmV0dXJuVHlwZT0idm9pZCI+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9Im5hbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249Ik1CZWFuIE5hbWUgb2YgdGhlIGNvbXBvbmVudCB0byBiZSByZW1vdmVkIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgPC9vcGVyYXRpb24+CisKKyAgICA8b3BlcmF0aW9uICAgbmFtZT0icmVtb3ZlQ29udGV4dCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iUmVtb3ZlIGFuIGV4aXN0aW5nIENvbnRleHQiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgcmV0dXJuVHlwZT0idm9pZCI+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9Im5hbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249Ik1CZWFuIE5hbWUgb2YgdGhlIGNvbXBvbmVudCB0byBiZSByZW1vdmVkIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgPC9vcGVyYXRpb24+CisKKyAgICA8b3BlcmF0aW9uICAgbmFtZT0icmVtb3ZlSG9zdCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iUmVtb3ZlIGFuIGV4aXN0aW5nIEhvc3QiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgcmV0dXJuVHlwZT0idm9pZCI+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9Im5hbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249Ik1CZWFuIE5hbWUgb2YgdGhlIGNvbXBvbmVudCB0byBiZSByZW1vdmVkIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgPC9vcGVyYXRpb24+CisKKyAgICA8b3BlcmF0aW9uICAgbmFtZT0icmVtb3ZlTG9hZGVyIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJSZW1vdmUgYW4gZXhpc3RpbmcgTG9hZGVyIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJuYW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJNQmVhbiBOYW1lIG9mIHRoZSBjb21wb25lbnQgdG8gYmUgcmVtb3ZlZCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgIDwvb3BlcmF0aW9uPgorCisgICAgPG9wZXJhdGlvbiAgIG5hbWU9InJlbW92ZUxvZ2dlciIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iUmVtb3ZlIGFuIGV4aXN0aW5nIExvZ2dlciIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICByZXR1cm5UeXBlPSJ2b2lkIj4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0ibmFtZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iTUJlYW4gTmFtZSBvZiB0aGUgY29tcG9uZW50IHRvIGJlIHJlbW92ZWQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICA8L29wZXJhdGlvbj4KKworICAgIDxvcGVyYXRpb24gICBuYW1lPSJyZW1vdmVNYW5hZ2VyIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJSZW1vdmUgYW4gZXhpc3RpbmcgTWFuYWdlciIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICByZXR1cm5UeXBlPSJ2b2lkIj4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0ibmFtZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iTUJlYW4gTmFtZSBvZiB0aGUgY29tcG9uZW50IHRvIGJlIHJlbW92ZWQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICA8L29wZXJhdGlvbj4KKworICAgIDxvcGVyYXRpb24gICBuYW1lPSJyZW1vdmVSZWFsbSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iUmVtb3ZlIGFuIGV4aXN0aW5nIFJlYWxtIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJuYW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJNQmVhbiBOYW1lIG9mIHRoZSBjb21wb25lbnQgdG8gYmUgcmVtb3ZlZCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgIDwvb3BlcmF0aW9uPgorCisgICAgPG9wZXJhdGlvbiAgIG5hbWU9InJlbW92ZVNlcnZpY2UiCisgICAgICAgICAgZGVzY3JpcHRpb249IlJlbW92ZSBhbiBleGlzdGluZyBTZXJ2aWNlIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJuYW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJNQmVhbiBOYW1lIG9mIHRoZSBjb21wb25lbnQgdG8gYmUgcmVtb3ZlZCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgIDwvb3BlcmF0aW9uPgorCisgICAgPG9wZXJhdGlvbiAgIG5hbWU9InJlbW92ZVZhbHZlIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJSZW1vdmUgYW4gZXhpc3RpbmcgVmFsdmUiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgcmV0dXJuVHlwZT0idm9pZCI+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9Im5hbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249Ik1CZWFuIE5hbWUgb2YgdGhlIGNvbXBvbmVudCB0byBiZSByZW1vdmVkIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgPC9vcGVyYXRpb24+CisKKyAgPC9tYmVhbj4KKworPC9tYmVhbnMtZGVzY3JpcHRvcnM+CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvcmVhbG0vQ29uc3RhbnRzLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvcmVhbG0vQ29uc3RhbnRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBmZjEzNgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9yZWFsbS9Db25zdGFudHMuamF2YQpAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtOworCisKKy8qKgorICogTWFuaWZlc3QgY29uc3RhbnRzIGZvciB0aGlzIEphdmEgcGFja2FnZS4KKyAqCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBDb25zdGFudHMgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUGFja2FnZSA9ICJvcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtIjsKKyAgICAKKyAgICAgICAgLy8gQXV0aGVudGljYXRpb24gbWV0aG9kcyBmb3IgbG9naW4gY29uZmlndXJhdGlvbgorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fTUVUSE9EID0gIkZPUk0iOworCisgICAgLy8gRm9ybSBiYXNlZCBhdXRoZW50aWNhdGlvbiBjb25zdGFudHMKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX0FDVElPTiA9ICIval9zZWN1cml0eV9jaGVjayI7CisKKyAgICAvLyBVc2VyIGRhdGEgY29uc3RyYWludHMgZm9yIHRyYW5zcG9ydCBndWFyYW50ZWUKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT05FX1RSQU5TUE9SVCA9ICJOT05FIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlRFR1JBTF9UUkFOU1BPUlQgPSAiSU5URUdSQUwiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJREVOVElBTF9UUkFOU1BPUlQgPSAiQ09ORklERU5USUFMIjsKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3JlYWxtL0RhdGFTb3VyY2VSZWFsbS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3JlYWxtL0RhdGFTb3VyY2VSZWFsbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ZDBkNjkKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvcmVhbG0vRGF0YVNvdXJjZVJlYWxtLmphdmEKQEAgLTAsMCArMSw1NzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEucmVhbG07CisKKworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsOworaW1wb3J0IGphdmEuc3FsLkNvbm5lY3Rpb247CitpbXBvcnQgamF2YS5zcWwuUHJlcGFyZWRTdGF0ZW1lbnQ7CitpbXBvcnQgamF2YS5zcWwuUmVzdWx0U2V0OworaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCitpbXBvcnQgamF2YXgubmFtaW5nLkNvbnRleHQ7CitpbXBvcnQgamF2YXguc3FsLkRhdGFTb3VyY2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm5hbWluZy5Db250ZXh0QmluZGluZ3M7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5TZXJ2ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZFNlcnZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuU3RyaW5nTWFuYWdlcjsKKworLyoqCisqCisqIEltcGxtZW50YXRpb24gb2YgPGI+UmVhbG08L2I+IHRoYXQgd29ya3Mgd2l0aCBhbnkgSkRCQyBKTkRJIERhdGFTb3VyY2UuCisqIFNlZSB0aGUgSkRCQ1JlYWxtLmhvd3RvIGZvciBtb3JlIGRldGFpbHMgb24gaG93IHRvIHNldCB1cCB0aGUgZGF0YWJhc2UgYW5kCisqIGZvciBjb25maWd1cmF0aW9uIG9wdGlvbnMuCisqCisqIEBhdXRob3IgR2xlbm4gTC4gTmllbHNlbgorKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyogQGF1dGhvciBDYXJzb24gTWNEb25hbGQKKyogQGF1dGhvciBJZ25hY2lvIE9ydGVnYQorKiBAdmVyc2lvbiAkUmV2aXNpb24kCisqLworCitwdWJsaWMgY2xhc3MgRGF0YVNvdXJjZVJlYWxtCisgICAgZXh0ZW5kcyBSZWFsbUJhc2UgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIGdlbmVyYXRlZCBzdHJpbmcgZm9yIHRoZSByb2xlcyBQcmVwYXJlZFN0YXRlbWVudAorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nQnVmZmVyIHByZXBhcmVkUm9sZXMgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZ2VuZXJhdGVkIHN0cmluZyBmb3IgdGhlIGNyZWRlbnRpYWxzIFByZXBhcmVkU3RhdGVtZW50CisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmdCdWZmZXIgcHJlcGFyZWRDcmVkZW50aWFscyA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBKTkRJIEpEQkMgRGF0YVNvdXJjZQorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZGF0YVNvdXJjZU5hbWUgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBEZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIFJlYWxtIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIGluZm8gPQorICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5yZWFsbS5EYXRhU291cmNlUmVhbG0vMS4wIjsKKworCisgICAgLyoqCisgICAgICogQ29udGV4dCBsb2NhbCBkYXRhc291cmNlLgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGxvY2FsRGF0YVNvdXJjZSA9IGZhbHNlOworCisKKyAgICAvKioKKyAgICAgKiBEZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIFJlYWxtIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIG5hbWUgPSAiRGF0YVNvdXJjZVJlYWxtIjsKKworCisgICAgLyoqCisgICAgICogVGhlIGNvbHVtbiBpbiB0aGUgdXNlciByb2xlIHRhYmxlIHRoYXQgbmFtZXMgYSByb2xlCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyByb2xlTmFtZUNvbCA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzdHJpbmcgbWFuYWdlciBmb3IgdGhpcyBwYWNrYWdlLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nTWFuYWdlciBzbSA9CisgICAgICAgIFN0cmluZ01hbmFnZXIuZ2V0TWFuYWdlcihDb25zdGFudHMuUGFja2FnZSk7CisKKworICAgIC8qKgorICAgICAqIFRoZSBjb2x1bW4gaW4gdGhlIHVzZXIgdGFibGUgdGhhdCBob2xkcyB0aGUgdXNlcidzIGNyZWRpbnRpYWxzCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyB1c2VyQ3JlZENvbCA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBjb2x1bW4gaW4gdGhlIHVzZXIgdGFibGUgdGhhdCBob2xkcyB0aGUgdXNlcidzIG5hbWUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHVzZXJOYW1lQ29sID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIHRhYmxlIHRoYXQgaG9sZHMgdGhlIHJlbGF0aW9uIGJldHdlZW4gdXNlcidzIGFuZCByb2xlcworICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgdXNlclJvbGVUYWJsZSA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSB0YWJsZSB0aGF0IGhvbGRzIHVzZXIgZGF0YS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHVzZXJUYWJsZSA9IG51bGw7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIEpOREkgSkRCQyBEYXRhU291cmNlLgorICAgICAqCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXREYXRhU291cmNlTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIGRhdGFTb3VyY2VOYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbmFtZSBvZiB0aGUgSk5ESSBKREJDIERhdGFTb3VyY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGF0YVNvdXJjZU5hbWUgdGhlIG5hbWUgb2YgdGhlIEpOREkgSkRCQyBEYXRhU291cmNlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGF0YVNvdXJjZU5hbWUoIFN0cmluZyBkYXRhU291cmNlTmFtZSkgeworICAgICAgdGhpcy5kYXRhU291cmNlTmFtZSA9IGRhdGFTb3VyY2VOYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBpZiB0aGUgZGF0YXNvdXJjZSB3aWxsIGJlIGxvb2tlZCB1cCBpbiB0aGUgd2ViYXBwIEpOREkgQ29udGV4dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRMb2NhbERhdGFTb3VyY2UoKSB7CisgICAgICAgIHJldHVybiBsb2NhbERhdGFTb3VyY2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRvIHRydWUgdG8gY2F1c2UgdGhlIGRhdGFzb3VyY2UgdG8gYmUgbG9va2VkIHVwIGluIHRoZSB3ZWJhcHAgSk5ESQorICAgICAqIENvbnRleHQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbG9jYWxEYXRhU291cmNlIHRoZSBuZXcgZmxhZyB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExvY2FsRGF0YVNvdXJjZShib29sZWFuIGxvY2FsRGF0YVNvdXJjZSkgeworICAgICAgdGhpcy5sb2NhbERhdGFTb3VyY2UgPSBsb2NhbERhdGFTb3VyY2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjb2x1bW4gaW4gdGhlIHVzZXIgcm9sZSB0YWJsZSB0aGF0IG5hbWVzIGEgcm9sZS4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Um9sZU5hbWVDb2woKSB7CisgICAgICAgIHJldHVybiByb2xlTmFtZUNvbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNvbHVtbiBpbiB0aGUgdXNlciByb2xlIHRhYmxlIHRoYXQgbmFtZXMgYSByb2xlLgorICAgICAqCisgICAgICogQHBhcmFtIHJvbGVOYW1lQ29sIFRoZSBjb2x1bW4gbmFtZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJvbGVOYW1lQ29sKCBTdHJpbmcgcm9sZU5hbWVDb2wgKSB7CisgICAgICAgIHRoaXMucm9sZU5hbWVDb2wgPSByb2xlTmFtZUNvbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGNvbHVtbiBpbiB0aGUgdXNlciB0YWJsZSB0aGF0IGhvbGRzIHRoZSB1c2VyJ3MgY3JlZGVudGlhbHMuCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFVzZXJDcmVkQ29sKCkgeworICAgICAgICByZXR1cm4gdXNlckNyZWRDb2w7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjb2x1bW4gaW4gdGhlIHVzZXIgdGFibGUgdGhhdCBob2xkcyB0aGUgdXNlcidzIGNyZWRlbnRpYWxzLgorICAgICAqCisgICAgICogQHBhcmFtIHVzZXJDcmVkQ29sIFRoZSBjb2x1bW4gbmFtZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVzZXJDcmVkQ29sKCBTdHJpbmcgdXNlckNyZWRDb2wgKSB7CisgICAgICAgdGhpcy51c2VyQ3JlZENvbCA9IHVzZXJDcmVkQ29sOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY29sdW1uIGluIHRoZSB1c2VyIHRhYmxlIHRoYXQgaG9sZHMgdGhlIHVzZXIncyBuYW1lLgorICAgICAqCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRVc2VyTmFtZUNvbCgpIHsKKyAgICAgICAgcmV0dXJuIHVzZXJOYW1lQ29sOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY29sdW1uIGluIHRoZSB1c2VyIHRhYmxlIHRoYXQgaG9sZHMgdGhlIHVzZXIncyBuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIHVzZXJOYW1lQ29sIFRoZSBjb2x1bW4gbmFtZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVzZXJOYW1lQ29sKCBTdHJpbmcgdXNlck5hbWVDb2wgKSB7CisgICAgICAgdGhpcy51c2VyTmFtZUNvbCA9IHVzZXJOYW1lQ29sOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdGFibGUgdGhhdCBob2xkcyB0aGUgcmVsYXRpb24gYmV0d2VlbiB1c2VyJ3MgYW5kIHJvbGVzLgorICAgICAqCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRVc2VyUm9sZVRhYmxlKCkgeworICAgICAgICByZXR1cm4gdXNlclJvbGVUYWJsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHRhYmxlIHRoYXQgaG9sZHMgdGhlIHJlbGF0aW9uIGJldHdlZW4gdXNlcidzIGFuZCByb2xlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1c2VyUm9sZVRhYmxlIFRoZSB0YWJsZSBuYW1lCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VXNlclJvbGVUYWJsZSggU3RyaW5nIHVzZXJSb2xlVGFibGUgKSB7CisgICAgICAgIHRoaXMudXNlclJvbGVUYWJsZSA9IHVzZXJSb2xlVGFibGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB0YWJsZSB0aGF0IGhvbGRzIHVzZXIgZGF0YS4uCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFVzZXJUYWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIHVzZXJUYWJsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHRhYmxlIHRoYXQgaG9sZHMgdXNlciBkYXRhLgorICAgICAqCisgICAgICogQHBhcmFtIHVzZXJUYWJsZSBUaGUgdGFibGUgbmFtZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVzZXJUYWJsZSggU3RyaW5nIHVzZXJUYWJsZSApIHsKKyAgICAgIHRoaXMudXNlclRhYmxlID0gdXNlclRhYmxlOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgUHJpbmNpcGFsIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIHVzZXJuYW1lIGFuZAorICAgICAqIGNyZWRlbnRpYWxzLCBpZiB0aGVyZSBpcyBvbmU7IG90aGVyd2lzZSByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBJZiB0aGVyZSBhcmUgYW55IGVycm9ycyB3aXRoIHRoZSBKREJDIGNvbm5lY3Rpb24sIGV4ZWN1dGluZworICAgICAqIHRoZSBxdWVyeSBvciBhbnl0aGluZyB3ZSByZXR1cm4gbnVsbCAoZG9uJ3QgYXV0aGVudGljYXRlKS4gVGhpcworICAgICAqIGV2ZW50IGlzIGFsc28gbG9nZ2VkLCBhbmQgdGhlIGNvbm5lY3Rpb24gd2lsbCBiZSBjbG9zZWQgc28gdGhhdAorICAgICAqIGEgc3Vic2VxdWVudCByZXF1ZXN0IHdpbGwgYXV0b21hdGljYWxseSByZS1vcGVuIGl0LgorICAgICAqCisgICAgICogQHBhcmFtIHVzZXJuYW1lIFVzZXJuYW1lIG9mIHRoZSBQcmluY2lwYWwgdG8gbG9vayB1cAorICAgICAqIEBwYXJhbSBjcmVkZW50aWFscyBQYXNzd29yZCBvciBvdGhlciBjcmVkZW50aWFscyB0byB1c2UgaW4KKyAgICAgKiAgYXV0aGVudGljYXRpbmcgdGhpcyB1c2VybmFtZQorICAgICAqLworICAgIHB1YmxpYyBQcmluY2lwYWwgYXV0aGVudGljYXRlKFN0cmluZyB1c2VybmFtZSwgU3RyaW5nIGNyZWRlbnRpYWxzKSB7CisKKyAgICAgICAgQ29ubmVjdGlvbiBkYkNvbm5lY3Rpb24gPSBudWxsOworCisgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgIC8vIEVuc3VyZSB0aGF0IHdlIGhhdmUgYW4gb3BlbiBkYXRhYmFzZSBjb25uZWN0aW9uCisgICAgICAgICAgICBkYkNvbm5lY3Rpb24gPSBvcGVuKCk7CisgICAgICAgICAgICBpZiAoZGJDb25uZWN0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBJZiB0aGUgZGIgY29ubmVjdGlvbiBvcGVuIGZhaWxzLCByZXR1cm4gIm5vdCBhdXRoZW50aWNhdGVkIgorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBBY3F1aXJlIGEgUHJpbmNpcGFsIG9iamVjdCBmb3IgdGhpcyB1c2VyCisgICAgICAgICAgICBQcmluY2lwYWwgcHJpbmNpcGFsID0gYXV0aGVudGljYXRlKGRiQ29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcm5hbWUsIGNyZWRlbnRpYWxzKTsKKworICAgICAgICAgICAgaWYoICFkYkNvbm5lY3Rpb24uZ2V0QXV0b0NvbW1pdCgpICkgeworICAgICAgICAgICAgICAgIGRiQ29ubmVjdGlvbi5jb21taXQoKTsgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFJlbGVhc2UgdGhlIGRhdGFiYXNlIGNvbm5lY3Rpb24gd2UganVzdCB1c2VkCisgICAgICAgICAgICBjbG9zZShkYkNvbm5lY3Rpb24pOworICAgICAgICAgICAgZGJDb25uZWN0aW9uID0gbnVsbDsKKworICAgICAgICAgICAgLy8gUmV0dXJuIHRoZSBQcmluY2lwYWwgKGlmIGFueSkKKyAgICAgICAgICAgIHJldHVybiAocHJpbmNpcGFsKTsKKworICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZSkgeworCisgICAgICAgICAgICAvLyBMb2cgdGhlIHByb2JsZW0gZm9yIHBvc3Rlcml0eQorICAgICAgICAgICAgY29udGFpbmVyLmdldExvZ2dlcigpLmVycm9yKHNtLmdldFN0cmluZygiZGF0YVNvdXJjZVJlYWxtLmV4Y2VwdGlvbiIpLCBlKTsKKworICAgICAgICAgICAgLy8gQ2xvc2UgdGhlIGNvbm5lY3Rpb24gc28gdGhhdCBpdCBnZXRzIHJlb3BlbmVkIG5leHQgdGltZQorICAgICAgICAgICAgaWYgKGRiQ29ubmVjdGlvbiAhPSBudWxsKQorICAgICAgICAgICAgICAgIGNsb3NlKGRiQ29ubmVjdGlvbik7CisKKyAgICAgICAgICAgIC8vIFJldHVybiAibm90IGF1dGhlbnRpY2F0ZWQiIGZvciB0aGlzIHJlcXVlc3QKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQYWNrYWdlIE1ldGhvZHMKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3RlY3RlZCBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgUHJpbmNpcGFsIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIHVzZXJuYW1lIGFuZAorICAgICAqIGNyZWRlbnRpYWxzLCBpZiB0aGVyZSBpcyBvbmU7IG90aGVyd2lzZSByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGJDb25uZWN0aW9uIFRoZSBkYXRhYmFzZSBjb25uZWN0aW9uIHRvIGJlIHVzZWQKKyAgICAgKiBAcGFyYW0gdXNlcm5hbWUgVXNlcm5hbWUgb2YgdGhlIFByaW5jaXBhbCB0byBsb29rIHVwCisgICAgICogQHBhcmFtIGNyZWRlbnRpYWxzIFBhc3N3b3JkIG9yIG90aGVyIGNyZWRlbnRpYWxzIHRvIHVzZSBpbgorICAgICAqICBhdXRoZW50aWNhdGluZyB0aGlzIHVzZXJuYW1lCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIFNRTEV4Y2VwdGlvbiBpZiBhIGRhdGFiYXNlIGVycm9yIG9jY3VycworICAgICAqLworICAgIHByb3RlY3RlZCBQcmluY2lwYWwgYXV0aGVudGljYXRlKENvbm5lY3Rpb24gZGJDb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdXNlcm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjcmVkZW50aWFscykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisKKyAgICAgICAgUmVzdWx0U2V0IHJzID0gbnVsbDsKKyAgICAgICAgUHJlcGFyZWRTdGF0ZW1lbnQgc3RtdCA9IG51bGw7CisgICAgICAgIEFycmF5TGlzdCBsaXN0ID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gTG9vayB1cCB0aGUgdXNlcidzIGNyZWRlbnRpYWxzCisgICAgICAgICAgICBTdHJpbmcgZGJDcmVkZW50aWFscyA9IG51bGw7CisgICAgICAgICAgICBzdG10ID0gY3JlZGVudGlhbHMoZGJDb25uZWN0aW9uLCB1c2VybmFtZSk7CisgICAgICAgICAgICBycyA9IHN0bXQuZXhlY3V0ZVF1ZXJ5KCk7CisgICAgICAgICAgICB3aGlsZSAocnMubmV4dCgpKSB7CisgICAgICAgICAgICAgICAgZGJDcmVkZW50aWFscyA9IHJzLmdldFN0cmluZygxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJzLmNsb3NlKCk7CisgICAgICAgICAgICBycyA9IG51bGw7CisgICAgICAgICAgICBzdG10LmNsb3NlKCk7CisgICAgICAgICAgICBzdG10ID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChkYkNyZWRlbnRpYWxzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGJDcmVkZW50aWFscyA9IGRiQ3JlZGVudGlhbHMudHJpbSgpOworICAgIAorICAgICAgICAgICAgLy8gVmFsaWRhdGUgdGhlIHVzZXIncyBjcmVkZW50aWFscworICAgICAgICAgICAgYm9vbGVhbiB2YWxpZGF0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmIChoYXNNZXNzYWdlRGlnZXN0KCkpIHsKKyAgICAgICAgICAgICAgICAvLyBIZXggaGFzaGVzIHNob3VsZCBiZSBjb21wYXJlZCBjYXNlLWluc2Vuc2l0aXZlCisgICAgICAgICAgICAgICAgdmFsaWRhdGVkID0gKGRpZ2VzdChjcmVkZW50aWFscykuZXF1YWxzSWdub3JlQ2FzZShkYkNyZWRlbnRpYWxzKSk7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICB2YWxpZGF0ZWQgPSAoZGlnZXN0KGNyZWRlbnRpYWxzKS5lcXVhbHMoZGJDcmVkZW50aWFscykpOworICAgIAorICAgICAgICAgICAgaWYgKHZhbGlkYXRlZCkgeworICAgICAgICAgICAgICAgIGlmIChjb250YWluZXIuZ2V0TG9nZ2VyKCkuaXNUcmFjZUVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLmdldExvZ2dlcigpLnRyYWNlKHNtLmdldFN0cmluZygiZGF0YVNvdXJjZVJlYWxtLmF1dGhlbnRpY2F0ZVN1Y2Nlc3MiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJuYW1lKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChjb250YWluZXIuZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLmdldExvZ2dlcigpLnRyYWNlKHNtLmdldFN0cmluZygiZGF0YVNvdXJjZVJlYWxtLmF1dGhlbnRpY2F0ZUZhaWx1cmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJuYW1lKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAKKyAgICAgICAgICAgIC8vIEFjY3VtdWxhdGUgdGhlIHVzZXIncyByb2xlcworICAgICAgICAgICAgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgICAgIHN0bXQgPSByb2xlcyhkYkNvbm5lY3Rpb24sIHVzZXJuYW1lKTsKKyAgICAgICAgICAgIHJzID0gc3RtdC5leGVjdXRlUXVlcnkoKTsKKyAgICAgICAgICAgIHdoaWxlIChycy5uZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBsaXN0LmFkZChycy5nZXRTdHJpbmcoMSkudHJpbSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChycyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcnMuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdG10ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzdG10LmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBDcmVhdGUgYW5kIHJldHVybiBhIHN1aXRhYmxlIFByaW5jaXBhbCBmb3IgdGhpcyB1c2VyCisgICAgICAgIHJldHVybiAobmV3IEdlbmVyaWNQcmluY2lwYWwodGhpcywgdXNlcm5hbWUsIGNyZWRlbnRpYWxzLCBsaXN0KSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENsb3NlIHRoZSBzcGVjaWZpZWQgZGF0YWJhc2UgY29ubmVjdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkYkNvbm5lY3Rpb24gVGhlIGNvbm5lY3Rpb24gdG8gYmUgY2xvc2VkCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgY2xvc2UoQ29ubmVjdGlvbiBkYkNvbm5lY3Rpb24pIHsKKworICAgICAgICAvLyBEbyBub3RoaW5nIGlmIHRoZSBkYXRhYmFzZSBjb25uZWN0aW9uIGlzIGFscmVhZHkgY2xvc2VkCisgICAgICAgIGlmIChkYkNvbm5lY3Rpb24gPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvLyBDbG9zZSB0aGlzIGRhdGFiYXNlIGNvbm5lY3Rpb24sIGFuZCBsb2cgYW55IGVycm9ycworICAgICAgICB0cnkgeworICAgICAgICAgICAgZGJDb25uZWN0aW9uLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBjb250YWluZXIuZ2V0TG9nZ2VyKCkuZXJyb3Ioc20uZ2V0U3RyaW5nKCJkYXRhU291cmNlUmVhbG0uY2xvc2UiKSwgZSk7IC8vIEp1c3QgbG9nIGl0IGhlcmUKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBPcGVuIHRoZSBzcGVjaWZpZWQgZGF0YWJhc2UgY29ubmVjdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gQ29ubmVjdGlvbiB0byB0aGUgZGF0YWJhc2UKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ29ubmVjdGlvbiBvcGVuKCkgeworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBudWxsOworICAgICAgICAgICAgaWYgKGxvY2FsRGF0YVNvdXJjZSkgeworICAgICAgICAgICAgICAgIGNvbnRleHQgPSBDb250ZXh0QmluZGluZ3MuZ2V0Q2xhc3NMb2FkZXIoKTsKKyAgICAgICAgICAgICAgICBjb250ZXh0ID0gKENvbnRleHQpIGNvbnRleHQubG9va3VwKCJjb21wL2VudiIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBTdGFuZGFyZFNlcnZlciBzZXJ2ZXIgPSAKKyAgICAgICAgICAgICAgICAgICAgKFN0YW5kYXJkU2VydmVyKSBTZXJ2ZXJGYWN0b3J5LmdldFNlcnZlcigpOworICAgICAgICAgICAgICAgIGNvbnRleHQgPSBzZXJ2ZXIuZ2V0R2xvYmFsTmFtaW5nQ29udGV4dCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRGF0YVNvdXJjZSBkYXRhU291cmNlID0gKERhdGFTb3VyY2UpY29udGV4dC5sb29rdXAoZGF0YVNvdXJjZU5hbWUpOworCSAgICByZXR1cm4gZGF0YVNvdXJjZS5nZXRDb25uZWN0aW9uKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBMb2cgdGhlIHByb2JsZW0gZm9yIHBvc3Rlcml0eQorICAgICAgICAgICAgY29udGFpbmVyLmdldExvZ2dlcigpLmVycm9yKHNtLmdldFN0cmluZygiZGF0YVNvdXJjZVJlYWxtLmV4Y2VwdGlvbiIpLCBlKTsKKyAgICAgICAgfSAgCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgUHJlcGFyZWRTdGF0ZW1lbnQgY29uZmlndXJlZCB0byBwZXJmb3JtIHRoZSBTRUxFQ1QgcmVxdWlyZWQKKyAgICAgKiB0byByZXRyaWV2ZSB1c2VyIGNyZWRlbnRpYWxzIGZvciB0aGUgc3BlY2lmaWVkIHVzZXJuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIGRiQ29ubmVjdGlvbiBUaGUgZGF0YWJhc2UgY29ubmVjdGlvbiB0byBiZSB1c2VkCisgICAgICogQHBhcmFtIHVzZXJuYW1lIFVzZXJuYW1lIGZvciB3aGljaCBjcmVkZW50aWFscyBzaG91bGQgYmUgcmV0cmlldmVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIFNRTEV4Y2VwdGlvbiBpZiBhIGRhdGFiYXNlIGVycm9yIG9jY3VycworICAgICAqLworICAgIHByaXZhdGUgUHJlcGFyZWRTdGF0ZW1lbnQgY3JlZGVudGlhbHMoQ29ubmVjdGlvbiBkYkNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB1c2VybmFtZSkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisKKyAgICAgICAgUHJlcGFyZWRTdGF0ZW1lbnQgY3JlZGVudGlhbHMgPQorICAgICAgICAgICAgZGJDb25uZWN0aW9uLnByZXBhcmVTdGF0ZW1lbnQocHJlcGFyZWRDcmVkZW50aWFscy50b1N0cmluZygpKTsKKworICAgICAgICBjcmVkZW50aWFscy5zZXRTdHJpbmcoMSwgdXNlcm5hbWUpOworICAgICAgICByZXR1cm4gKGNyZWRlbnRpYWxzKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgc2hvcnQgbmFtZSBmb3IgdGhpcyBSZWFsbSBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldE5hbWUoKSB7CisKKyAgICAgICAgcmV0dXJuIChuYW1lKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBwYXNzd29yZCBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHByaW5jaXBhbCdzIHVzZXIgbmFtZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFBhc3N3b3JkKFN0cmluZyB1c2VybmFtZSkgeworCisgICAgICAgIHJldHVybiAobnVsbCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgUHJpbmNpcGFsIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gdXNlciBuYW1lLgorICAgICAqLworICAgIHByb3RlY3RlZCBQcmluY2lwYWwgZ2V0UHJpbmNpcGFsKFN0cmluZyB1c2VybmFtZSkgeworCisgICAgICAgIHJldHVybiAobnVsbCk7CisKKyAgICB9CisKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgUHJlcGFyZWRTdGF0ZW1lbnQgY29uZmlndXJlZCB0byBwZXJmb3JtIHRoZSBTRUxFQ1QgcmVxdWlyZWQKKyAgICAgKiB0byByZXRyaWV2ZSB1c2VyIHJvbGVzIGZvciB0aGUgc3BlY2lmaWVkIHVzZXJuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIGRiQ29ubmVjdGlvbiBUaGUgZGF0YWJhc2UgY29ubmVjdGlvbiB0byBiZSB1c2VkCisgICAgICogQHBhcmFtIHVzZXJuYW1lIFVzZXJuYW1lIGZvciB3aGljaCByb2xlcyBzaG91bGQgYmUgcmV0cmlldmVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIFNRTEV4Y2VwdGlvbiBpZiBhIGRhdGFiYXNlIGVycm9yIG9jY3VycworICAgICAqLworICAgIHByaXZhdGUgUHJlcGFyZWRTdGF0ZW1lbnQgcm9sZXMoQ29ubmVjdGlvbiBkYkNvbm5lY3Rpb24sIFN0cmluZyB1c2VybmFtZSkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisKKyAgICAgICAgUHJlcGFyZWRTdGF0ZW1lbnQgcm9sZXMgPSAKKyAgICAgICAgICAgIGRiQ29ubmVjdGlvbi5wcmVwYXJlU3RhdGVtZW50KHByZXBhcmVkUm9sZXMudG9TdHJpbmcoKSk7CisKKyAgICAgICAgcm9sZXMuc2V0U3RyaW5nKDEsIHVzZXJuYW1lKTsKKyAgICAgICAgcmV0dXJuIChyb2xlcyk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBMaWZlY3ljbGUgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKgorICAgICAqIFByZXBhcmUgZm9yIGFjdGl2ZSB1c2Ugb2YgdGhlIHB1YmxpYyBtZXRob2RzIG9mIHRoaXMgQ29tcG9uZW50LgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBMaWZlY3ljbGVFeGNlcHRpb24gaWYgdGhpcyBjb21wb25lbnQgZGV0ZWN0cyBhIGZhdGFsIGVycm9yCisgICAgICogIHRoYXQgcHJldmVudHMgaXQgZnJvbSBiZWluZyBzdGFydGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnQoKSB0aHJvd3MgTGlmZWN5Y2xlRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBDcmVhdGUgdGhlIHJvbGVzIFByZXBhcmVkU3RhdGVtZW50IHN0cmluZworICAgICAgICBwcmVwYXJlZFJvbGVzID0gbmV3IFN0cmluZ0J1ZmZlcigiU0VMRUNUICIpOworICAgICAgICBwcmVwYXJlZFJvbGVzLmFwcGVuZChyb2xlTmFtZUNvbCk7CisgICAgICAgIHByZXBhcmVkUm9sZXMuYXBwZW5kKCIgRlJPTSAiKTsKKyAgICAgICAgcHJlcGFyZWRSb2xlcy5hcHBlbmQodXNlclJvbGVUYWJsZSk7CisgICAgICAgIHByZXBhcmVkUm9sZXMuYXBwZW5kKCIgV0hFUkUgIik7CisgICAgICAgIHByZXBhcmVkUm9sZXMuYXBwZW5kKHVzZXJOYW1lQ29sKTsKKyAgICAgICAgcHJlcGFyZWRSb2xlcy5hcHBlbmQoIiA9ID8iKTsKKworICAgICAgICAvLyBDcmVhdGUgdGhlIGNyZWRlbnRpYWxzIFByZXBhcmVkU3RhdGVtZW50IHN0cmluZworICAgICAgICBwcmVwYXJlZENyZWRlbnRpYWxzID0gbmV3IFN0cmluZ0J1ZmZlcigiU0VMRUNUICIpOworICAgICAgICBwcmVwYXJlZENyZWRlbnRpYWxzLmFwcGVuZCh1c2VyQ3JlZENvbCk7CisgICAgICAgIHByZXBhcmVkQ3JlZGVudGlhbHMuYXBwZW5kKCIgRlJPTSAiKTsKKyAgICAgICAgcHJlcGFyZWRDcmVkZW50aWFscy5hcHBlbmQodXNlclRhYmxlKTsKKyAgICAgICAgcHJlcGFyZWRDcmVkZW50aWFscy5hcHBlbmQoIiBXSEVSRSAiKTsKKyAgICAgICAgcHJlcGFyZWRDcmVkZW50aWFscy5hcHBlbmQodXNlck5hbWVDb2wpOworICAgICAgICBwcmVwYXJlZENyZWRlbnRpYWxzLmFwcGVuZCgiID0gPyIpOworCisgICAgICAgIC8vIFBlcmZvcm0gbm9ybWFsIHN1cGVyY2xhc3MgaW5pdGlhbGl6YXRpb24KKyAgICAgICAgc3VwZXIuc3RhcnQoKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogR3JhY2VmdWxseSBzaHV0IGRvd24gYWN0aXZlIHVzZSBvZiB0aGUgcHVibGljIG1ldGhvZHMgb2YgdGhpcyBDb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIExpZmVjeWNsZUV4Y2VwdGlvbiBpZiB0aGlzIGNvbXBvbmVudCBkZXRlY3RzIGEgZmF0YWwgZXJyb3IKKyAgICAgKiAgdGhhdCBuZWVkcyB0byBiZSByZXBvcnRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB0aHJvd3MgTGlmZWN5Y2xlRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBQZXJmb3JtIG5vcm1hbCBzdXBlcmNsYXNzIGZpbmFsaXphdGlvbgorICAgICAgICBzdXBlci5zdG9wKCk7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3JlYWxtL0dlbmVyaWNQcmluY2lwYWwuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9yZWFsbS9HZW5lcmljUHJpbmNpcGFsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE2Y2Q4OQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9yZWFsbS9HZW5lcmljUHJpbmNpcGFsLmphdmEKQEAgLTAsMCArMSwxODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEucmVhbG07CisKKworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5SZWFsbTsKKworCisvKioKKyAqIEdlbmVyaWMgaW1wbGVtZW50YXRpb24gb2YgPHN0cm9uZz5qYXZhLnNlY3VyaXR5LlByaW5jaXBhbDwvc3Ryb25nPiB0aGF0CisgKiBpcyBhdmFpbGFibGUgZm9yIHVzZSBieSA8Y29kZT5SZWFsbTwvY29kZT4gaW1wbGVtZW50YXRpb25zLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgR2VuZXJpY1ByaW5jaXBhbCBpbXBsZW1lbnRzIFByaW5jaXBhbCB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgUHJpbmNpcGFsLCBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBSZWFsbSwgZm9yIHRoZQorICAgICAqIHNwZWNpZmllZCB1c2VybmFtZSBhbmQgcGFzc3dvcmQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVhbG0gVGhlIFJlYWxtIHRoYXQgb3ducyB0aGlzIFByaW5jaXBhbAorICAgICAqIEBwYXJhbSBuYW1lIFRoZSB1c2VybmFtZSBvZiB0aGUgdXNlciByZXByZXNlbnRlZCBieSB0aGlzIFByaW5jaXBhbAorICAgICAqIEBwYXJhbSBwYXNzd29yZCBDcmVkZW50aWFscyB1c2VkIHRvIGF1dGhlbnRpY2F0ZSB0aGlzIHVzZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgR2VuZXJpY1ByaW5jaXBhbChSZWFsbSByZWFsbSwgU3RyaW5nIG5hbWUsIFN0cmluZyBwYXNzd29yZCkgeworCisgICAgICAgIHRoaXMocmVhbG0sIG5hbWUsIHBhc3N3b3JkLCBudWxsKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IFByaW5jaXBhbCwgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgUmVhbG0sIGZvciB0aGUKKyAgICAgKiBzcGVjaWZpZWQgdXNlcm5hbWUgYW5kIHBhc3N3b3JkLCB3aXRoIHRoZSBzcGVjaWZpZWQgcm9sZSBuYW1lcworICAgICAqIChhcyBTdHJpbmdzKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWFsbSBUaGUgUmVhbG0gdGhhdCBvd25zIHRoaXMgcHJpbmNpcGFsCisgICAgICogQHBhcmFtIG5hbWUgVGhlIHVzZXJuYW1lIG9mIHRoZSB1c2VyIHJlcHJlc2VudGVkIGJ5IHRoaXMgUHJpbmNpcGFsCisgICAgICogQHBhcmFtIHBhc3N3b3JkIENyZWRlbnRpYWxzIHVzZWQgdG8gYXV0aGVudGljYXRlIHRoaXMgdXNlcgorICAgICAqIEBwYXJhbSByb2xlcyBMaXN0IG9mIHJvbGVzIChtdXN0IGJlIFN0cmluZ3MpIHBvc3Nlc3NlZCBieSB0aGlzIHVzZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgR2VuZXJpY1ByaW5jaXBhbChSZWFsbSByZWFsbSwgU3RyaW5nIG5hbWUsIFN0cmluZyBwYXNzd29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0IHJvbGVzKSB7CisKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgdGhpcy5yZWFsbSA9IHJlYWxtOworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB0aGlzLnBhc3N3b3JkID0gcGFzc3dvcmQ7CisgICAgICAgIGlmIChyb2xlcyAhPSBudWxsKSB7CisgICAgICAgICAgICB0aGlzLnJvbGVzID0gbmV3IFN0cmluZ1tyb2xlcy5zaXplKCldOworICAgICAgICAgICAgdGhpcy5yb2xlcyA9IChTdHJpbmdbXSkgcm9sZXMudG9BcnJheSh0aGlzLnJvbGVzKTsKKyAgICAgICAgICAgIGlmICh0aGlzLnJvbGVzLmxlbmd0aCA+IDApCisgICAgICAgICAgICAgICAgQXJyYXlzLnNvcnQodGhpcy5yb2xlcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgR2VuZXJpY1ByaW5jaXBhbChTdHJpbmcgbmFtZSwgU3RyaW5nIHBhc3N3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Qgcm9sZXMpIHsKKworICAgICAgICBzdXBlcigpOworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB0aGlzLnBhc3N3b3JkID0gcGFzc3dvcmQ7CisgICAgICAgIGlmIChyb2xlcyAhPSBudWxsKSB7CisgICAgICAgICAgICB0aGlzLnJvbGVzID0gbmV3IFN0cmluZ1tyb2xlcy5zaXplKCldOworICAgICAgICAgICAgdGhpcy5yb2xlcyA9IChTdHJpbmdbXSkgcm9sZXMudG9BcnJheSh0aGlzLnJvbGVzKTsKKyAgICAgICAgICAgIGlmICh0aGlzLnJvbGVzLmxlbmd0aCA+IDApCisgICAgICAgICAgICAgICAgQXJyYXlzLnNvcnQodGhpcy5yb2xlcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogVGhlIHVzZXJuYW1lIG9mIHRoZSB1c2VyIHJlcHJlc2VudGVkIGJ5IHRoaXMgUHJpbmNpcGFsLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5uYW1lKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSBhdXRoZW50aWNhdGlvbiBjcmVkZW50aWFscyBmb3IgdGhlIHVzZXIgcmVwcmVzZW50ZWQgYnkKKyAgICAgKiB0aGlzIFByaW5jaXBhbC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHBhc3N3b3JkID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFzc3dvcmQoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5wYXNzd29yZCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgUmVhbG0gd2l0aCB3aGljaCB0aGlzIFByaW5jaXBhbCBpcyBhc3NvY2lhdGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCBSZWFsbSByZWFsbSA9IG51bGw7CisKKyAgICBwdWJsaWMgUmVhbG0gZ2V0UmVhbG0oKSB7CisgICAgICAgIHJldHVybiAodGhpcy5yZWFsbSk7CisgICAgfQorCisgICAgdm9pZCBzZXRSZWFsbSggUmVhbG0gcmVhbG0gKSB7CisgICAgICAgIHRoaXMucmVhbG09cmVhbG07CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgc2V0IG9mIHJvbGVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHVzZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyByb2xlc1tdID0gbmV3IFN0cmluZ1swXTsKKworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRSb2xlcygpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLnJvbGVzKTsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBEb2VzIHRoZSB1c2VyIHJlcHJlc2VudGVkIGJ5IHRoaXMgUHJpbmNpcGFsIHBvc3Nlc3MgdGhlIHNwZWNpZmllZCByb2xlPworICAgICAqCisgICAgICogQHBhcmFtIHJvbGUgUm9sZSB0byBiZSB0ZXN0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNSb2xlKFN0cmluZyByb2xlKSB7CisKKyAgICAgICAgaWYoIioiLmVxdWFscyhyb2xlKSkgLy8gU3BlY2lhbCAyLjQgcm9sZSBtZWFuaW5nIGV2ZXJ5b25lCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKHJvbGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAoZmFsc2UpOworICAgICAgICByZXR1cm4gKEFycmF5cy5iaW5hcnlTZWFyY2gocm9sZXMsIHJvbGUpID49IDApOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QsIHdoaWNoIGV4cG9zZXMgb25seQorICAgICAqIGluZm9ybWF0aW9uIHRoYXQgc2hvdWxkIGJlIHB1YmxpYy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIkdlbmVyaWNQcmluY2lwYWxbIik7CisgICAgICAgIHNiLmFwcGVuZCh0aGlzLm5hbWUpOworICAgICAgICBzYi5hcHBlbmQoIigiKTsKKyAgICAgICAgZm9yKCBpbnQgaT0wO2k8cm9sZXMubGVuZ3RoOyBpKysgKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIHJvbGVzW2ldKS5hcHBlbmQoIiwiKTsKKyAgICAgICAgfQorICAgICAgICBzYi5hcHBlbmQoIildIik7CisgICAgICAgIHJldHVybiAoc2IudG9TdHJpbmcoKSk7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3JlYWxtL0pBQVNDYWxsYmFja0hhbmRsZXIuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9yZWFsbS9KQUFTQ2FsbGJhY2tIYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZkZmNlOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9yZWFsbS9KQUFTQ2FsbGJhY2tIYW5kbGVyLmphdmEKQEAgLTAsMCArMSwxNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEucmVhbG07CisKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VjdXJpdHkuYXV0aC5jYWxsYmFjay5DYWxsYmFjazsKK2ltcG9ydCBqYXZheC5zZWN1cml0eS5hdXRoLmNhbGxiYWNrLkNhbGxiYWNrSGFuZGxlcjsKK2ltcG9ydCBqYXZheC5zZWN1cml0eS5hdXRoLmNhbGxiYWNrLk5hbWVDYWxsYmFjazsKK2ltcG9ydCBqYXZheC5zZWN1cml0eS5hdXRoLmNhbGxiYWNrLlBhc3N3b3JkQ2FsbGJhY2s7CitpbXBvcnQgamF2YXguc2VjdXJpdHkuYXV0aC5jYWxsYmFjay5VbnN1cHBvcnRlZENhbGxiYWNrRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLlN0cmluZ01hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7CisKKy8qKgorICogPHA+SW1wbGVtZW50YXRpb24gb2YgdGhlIEpBQVMgPGNvZGU+Q2FsbGJhY2tIYW5kbGVyPC9jb2RlPiBpbnRlcmZhY2UsCisgKiB1c2VkIHRvIG5lZ290aWF0ZSBkZWxpdmVyeSBvZiB0aGUgdXNlcm5hbWUgYW5kIGNyZWRlbnRpYWxzIHRoYXQgd2VyZQorICogc3BlY2lmaWVkIHRvIG91ciBjb25zdHJ1Y3Rvci4gIE5vIGludGVyYWN0aW9uIHdpdGggdGhlIHVzZXIgaXMgcmVxdWlyZWQKKyAqIChvciBwb3NzaWJsZSkuPC9wPgorICoKKyAqIDxwPlRoaXMgPGNvZGU+Q2FsbGJhY2tIYW5kbGVyPC9jb2RlPiB3aWxsIHByZS1kaWdlc3QgdGhlIHN1cHBsaWVkCisgKiBwYXNzd29yZCwgaWYgcmVxdWlyZWQgYnkgdGhlIDxjb2RlPiZsdDtSZWFsbSZndDs8L2NvZGU+IGVsZW1lbnQgaW4gCisgKiA8Y29kZT5zZXJ2ZXIueG1sPC9jb2RlPi48L3A+CisgKiA8cD5BdCBwcmVzZW50LCA8Y29kZT5KQUFTQ2FsbGJhY2tIYW5kbGVyPC9jb2RlPiBrbm93cyBob3cgdG8gaGFuZGxlIGNhbGxiYWNrcyBvZgorICogdHlwZSA8Y29kZT5qYXZheC5zZWN1cml0eS5hdXRoLmNhbGxiYWNrLk5hbWVDYWxsYmFjazwvY29kZT4gYW5kCisgKiA8Y29kZT5qYXZheC5zZWN1cml0eS5hdXRoLmNhbGxiYWNrLlBhc3N3b3JkQ2FsbGJhY2s8L2NvZGU+LjwvcD4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEBhdXRob3IgQW5kcmV3IFIuIEphcXVpdGgKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEpBQVNDYWxsYmFja0hhbmRsZXIgaW1wbGVtZW50cyBDYWxsYmFja0hhbmRsZXIgeworICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhKQUFTQ2FsbGJhY2tIYW5kbGVyLmNsYXNzKTsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcgorCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBjYWxsYmFjayBoYW5kbGVyIGNvbmZpZ3VyZWQgd2l0aCB0aGUgc3BlY2lmaWVkIHZhbHVlcy4KKyAgICAgKiBOb3RlIHRoYXQgaWYgdGhlIDxjb2RlPkpBQVNSZWFsbTwvY29kZT4gaW5zdGFuY2Ugc3BlY2lmaWVzIGRpZ2VzdGVkIHBhc3N3b3JkcywKKyAgICAgKiB0aGUgPGNvZGU+cGFzc3dvcmQ8L2NvZGU+IHBhcmFtZXRlciB3aWxsIGJlIHByZS1kaWdlc3RlZCBoZXJlLgorICAgICAqCisgICAgICogQHBhcmFtIHJlYWxtIE91ciBhc3NvY2lhdGVkIEpBQVNSZWFsbSBpbnN0YW5jZQorICAgICAqIEBwYXJhbSB1c2VybmFtZSBVc2VybmFtZSB0byBiZSBhdXRoZW50aWNhdGVkIHdpdGgKKyAgICAgKiBAcGFyYW0gcGFzc3dvcmQgUGFzc3dvcmQgdG8gYmUgYXV0aGVudGljYXRlZCB3aXRoCisgICAgICovCisgICAgcHVibGljIEpBQVNDYWxsYmFja0hhbmRsZXIoSkFBU1JlYWxtIHJlYWxtLCBTdHJpbmcgdXNlcm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhc3N3b3JkKSB7CisKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgdGhpcy5yZWFsbSA9IHJlYWxtOworICAgICAgICB0aGlzLnVzZXJuYW1lID0gdXNlcm5hbWU7CisKKyAgICAgICAgaWYgKHJlYWxtLmhhc01lc3NhZ2VEaWdlc3QoKSkgeworICAgICAgICAgICAgdGhpcy5wYXNzd29yZCA9IHJlYWxtLmRpZ2VzdChwYXNzd29yZCk7CisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoc20uZ2V0U3RyaW5nKCJqYWFzQ2FsbGJhY2suZGlnZXN0cGFzc3dvcmQiLCBwYXNzd29yZCwgdGhpcy5wYXNzd29yZCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgdGhpcy5wYXNzd29yZCA9IHBhc3N3b3JkOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworICAgIC8qKgorICAgICAqIFRoZSBzdHJpbmcgbWFuYWdlciBmb3IgdGhpcyBwYWNrYWdlLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nTWFuYWdlciBzbSA9CisgICAgICAgIFN0cmluZ01hbmFnZXIuZ2V0TWFuYWdlcihDb25zdGFudHMuUGFja2FnZSk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgcGFzc3dvcmQgdG8gYmUgYXV0aGVudGljYXRlZCB3aXRoLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgcGFzc3dvcmQgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgYXNzb2NpYXRlZCA8Y29kZT5KQUFTUmVhbG08L2NvZGU+IGluc3RhbmNlLgorICAgICAqLworICAgIHByb3RlY3RlZCBKQUFTUmVhbG0gcmVhbG0gPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgdXNlcm5hbWUgdG8gYmUgYXV0aGVudGljYXRlZCB3aXRoLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgdXNlcm5hbWUgPSBudWxsOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmV0cmlldmUgdGhlIGluZm9ybWF0aW9uIHJlcXVlc3RlZCBpbiB0aGUgcHJvdmlkZWQgPGNvZGU+Q2FsbGJhY2tzPC9jb2RlPi4KKyAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIG9ubHkgcmVjb2duaXplcyA8Y29kZT5OYW1lQ2FsbGJhY2s8L2NvZGU+IGFuZAorICAgICAqIDxjb2RlPlBhc3N3b3JkQ2FsbGJhY2s8L2NvZGU+IGluc3RhbmNlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjYWxsYmFja3MgVGhlIHNldCBvZiA8Y29kZT5DYWxsYmFjazwvY29kZT5zIHRvIGJlIHByb2Nlc3NlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBVbnN1cHBvcnRlZENhbGxiYWNrRXhjZXB0aW9uIGlmIHRoZSBsb2dpbiBtZXRob2QgcmVxdWVzdHMKKyAgICAgKiAgYW4gdW5zdXBwb3J0ZWQgY2FsbGJhY2sgdHlwZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGhhbmRsZShDYWxsYmFjayBjYWxsYmFja3NbXSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBVbnN1cHBvcnRlZENhbGxiYWNrRXhjZXB0aW9uIHsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNhbGxiYWNrcy5sZW5ndGg7IGkrKykgeworCisgICAgICAgICAgICBpZiAoY2FsbGJhY2tzW2ldIGluc3RhbmNlb2YgTmFtZUNhbGxiYWNrKSB7CisgICAgICAgICAgICAgICAgaWYgKHJlYWxtLmdldENvbnRhaW5lcigpLmdldExvZ2dlcigpLmlzVHJhY2VFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIHJlYWxtLmdldENvbnRhaW5lcigpLmdldExvZ2dlcigpLnRyYWNlKHNtLmdldFN0cmluZygiamFhc0NhbGxiYWNrLnVzZXJuYW1lIiwgdXNlcm5hbWUpKTsKKyAgICAgICAgICAgICAgICAoKE5hbWVDYWxsYmFjaykgY2FsbGJhY2tzW2ldKS5zZXROYW1lKHVzZXJuYW1lKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY2FsbGJhY2tzW2ldIGluc3RhbmNlb2YgUGFzc3dvcmRDYWxsYmFjaykgeworICAgICAgICAgICAgICAgIGlmIChyZWFsbS5nZXRDb250YWluZXIoKS5nZXRMb2dnZXIoKS5pc1RyYWNlRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICByZWFsbS5nZXRDb250YWluZXIoKS5nZXRMb2dnZXIoKS50cmFjZShzbS5nZXRTdHJpbmcoImphYXNDYWxsYmFjay5wYXNzd29yZCIsIHBhc3N3b3JkKSk7CisgICAgICAgICAgICAgICAgZmluYWwgY2hhcltdIHBhc3N3b3JkY29udGVudHM7CisgICAgICAgICAgICAgICAgaWYgKHBhc3N3b3JkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmRjb250ZW50cyA9IHBhc3N3b3JkLnRvQ2hhckFycmF5KCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmRjb250ZW50cyA9IG5ldyBjaGFyWzBdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAoKFBhc3N3b3JkQ2FsbGJhY2spIGNhbGxiYWNrc1tpXSkuc2V0UGFzc3dvcmQKKyAgICAgICAgICAgICAgICAgICAgKHBhc3N3b3JkY29udGVudHMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRDYWxsYmFja0V4Y2VwdGlvbihjYWxsYmFja3NbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3JlYWxtL0pBQVNNZW1vcnlMb2dpbk1vZHVsZS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3JlYWxtL0pBQVNNZW1vcnlMb2dpbk1vZHVsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyYjJhZTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvcmVhbG0vSkFBU01lbW9yeUxvZ2luTW9kdWxlLmphdmEKQEAgLTAsMCArMSwzODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEucmVhbG07CisKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LnNlY3VyaXR5LmF1dGguU3ViamVjdDsKK2ltcG9ydCBqYXZheC5zZWN1cml0eS5hdXRoLmNhbGxiYWNrLkNhbGxiYWNrOworaW1wb3J0IGphdmF4LnNlY3VyaXR5LmF1dGguY2FsbGJhY2suQ2FsbGJhY2tIYW5kbGVyOworaW1wb3J0IGphdmF4LnNlY3VyaXR5LmF1dGguY2FsbGJhY2suTmFtZUNhbGxiYWNrOworaW1wb3J0IGphdmF4LnNlY3VyaXR5LmF1dGguY2FsbGJhY2suUGFzc3dvcmRDYWxsYmFjazsKK2ltcG9ydCBqYXZheC5zZWN1cml0eS5hdXRoLmNhbGxiYWNrLlVuc3VwcG9ydGVkQ2FsbGJhY2tFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VjdXJpdHkuYXV0aC5sb2dpbi5GYWlsZWRMb2dpbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZWN1cml0eS5hdXRoLmxvZ2luLkxvZ2luRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlY3VyaXR5LmF1dGguc3BpLkxvZ2luTW9kdWxlOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Db250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuUmVhbG07CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuUmVxdWVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5TZWN1cml0eUNvbnN0cmFpbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLlJlcXVlc3RVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5TdHJpbmdNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuZGlnZXN0ZXIuRGlnZXN0ZXI7CisKKworLyoqCisgKiA8cD5JbXBsZW1lbnRhdGlvbiBvZiB0aGUgSkFBUyA8c3Ryb25nPkxvZ2luTW9kdWxlPC9zdHJvbmc+IGludGVyZmFjZSwKKyAqIHByaW1hcmlseSBmb3IgdXNlIGluIHRlc3RpbmcgPGNvZGU+SkFBU1JlYWxtPC9jb2RlPi4gIEl0IHV0aWxpemVzIGFuCisgKiBYTUwtZm9ybWF0IGRhdGEgZmlsZSBvZiB1c2VybmFtZS9wYXNzd29yZC9yb2xlIGluZm9ybWF0aW9uIGlkZW50aWNhbCB0bworICogdGhhdCBzdXBwb3J0ZWQgYnkgPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5yZWFsbS5NZW1vcnlSZWFsbTwvY29kZT4KKyAqIChleGNlcHQgdGhhdCBkaWdlc3RlZCBwYXNzd29yZHMgYXJlIG5vdCBzdXBwb3J0ZWQpLjwvcD4KKyAqCisgKiA8cD5UaGlzIGNsYXNzIHJlY29nbml6ZXMgdGhlIGZvbGxvd2luZyBzdHJpbmctdmFsdWVkIG9wdGlvbnMsIHdoaWNoIGFyZQorICogc3BlY2lmaWVkIGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgKGFuZCBwYXNzZWQgdG8gb3VyIGNvbnN0cnVjdG9yIGluCisgKiB0aGUgPGNvZGU+b3B0aW9uczwvY29kZT4gYXJndW1lbnQ6PC9wPgorICogPHVsPgorICogPGxpPjxzdHJvbmc+ZGVidWc8L3N0cm9uZz4gLSBTZXQgdG8gInRydWUiIHRvIGdldCBkZWJ1Z2dpbmcgbWVzc2FnZXMKKyAqICAgICBnZW5lcmF0ZWQgdG8gU3lzdGVtLm91dC4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPmZhbHNlPC9jb2RlPi48L2xpPgorICogPGxpPjxzdHJvbmc+cGF0aG5hbWU8L3N0cm9uZz4gLSBSZWxhdGl2ZSAodG8gdGhlIHBhdGhuYW1lIHNwZWNpZmllZCBieSB0aGUKKyAqICAgICAiY2F0YWxpbmEuYmFzZSIgc3lzdGVtIHByb3BlcnR5KSBvciBhYnNvbHV0ZSBwYWh0bmFtZSB0byB0aGUKKyAqICAgICBYTUwgZmlsZSBjb250YWluaW5nIG91ciB1c2VyIGluZm9ybWF0aW9uLCBpbiB0aGUgZm9ybWF0IHN1cHBvcnRlZCBieQorICogICAgIHtAbGluayBNZW1vcnlSZWFsbX0uICBUaGUgZGVmYXVsdCB2YWx1ZSBtYXRjaGVzIHRoZSBNZW1vcnlSZWFsbQorICogICAgIGRlZmF1bHQuPC9saT4KKyAqIDwvdWw+CisgKgorICogPHA+PHN0cm9uZz5JTVBMRU1FTlRBVElPTiBOT1RFPC9zdHJvbmc+IC0gVGhpcyBjbGFzcyBpbXBsZW1lbnRzCisgKiA8Y29kZT5SZWFsbTwvY29kZT4gb25seSB0byBzYXRpc2Z5IHRoZSBjYWxsaW5nIHJlcXVpcmVtZW50cyBvZiB0aGUKKyAqIDxjb2RlPkdlbmVyaWNQcmluY2lwYWw8L2NvZGU+IGNvbnN0cnVjdG9yLiAgSXQgZG9lcyBub3QgYWN0dWFsbHkgcGVyZm9ybQorICogdGhlIGZ1bmN0aW9uYWxpdHkgcmVxdWlyZWQgb2YgYSA8Y29kZT5SZWFsbTwvY29kZT4gaW1wbGVtZW50YXRpb24uPC9wPgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgSkFBU01lbW9yeUxvZ2luTW9kdWxlIGV4dGVuZHMgTWVtb3J5UmVhbG0gaW1wbGVtZW50cyBMb2dpbk1vZHVsZSwgUmVhbG0geworICAgIC8vIFdlIG5lZWQgdG8gZXh0ZW5kIE1lbW9yeVJlYWxtIHRvIGF2b2lkIGNsYXNzIGNhc3QKKworICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhKQUFTTWVtb3J5TG9naW5Nb2R1bGUuY2xhc3MpOworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBjYWxsYmFjayBoYW5kbGVyIHJlc3BvbnNpYmxlIGZvciBhbnN3ZXJpbmcgb3VyIHJlcXVlc3RzLgorICAgICAqLworICAgIHByb3RlY3RlZCBDYWxsYmFja0hhbmRsZXIgY2FsbGJhY2tIYW5kbGVyID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogSGFzIG91ciBvd24gPGNvZGU+Y29tbWl0KCk8L2NvZGU+IHJldHVybmVkIHN1Y2Nlc3NmdWxseT8KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjb21taXR0ZWQgPSBmYWxzZTsKKworCisgICAgLyoqCisgICAgICogVGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoaXMgPGNvZGU+TG9naW5Nb2R1bGU8L2NvZGU+LgorICAgICAqLworICAgIHByb3RlY3RlZCBNYXAgb3B0aW9ucyA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBhYnNvbHV0ZSBvciByZWxhdGl2ZSBwYXRobmFtZSB0byB0aGUgWE1MIGNvbmZpZ3VyYXRpb24gZmlsZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHBhdGhuYW1lID0gImNvbmYvdG9tY2F0LXVzZXJzLnhtbCI7CisKKworICAgIC8qKgorICAgICAqIFRoZSA8Y29kZT5QcmluY2lwYWw8L2NvZGU+IGlkZW50aWZpZWQgYnkgb3VyIHZhbGlkYXRpb24sIG9yCisgICAgICogPGNvZGU+bnVsbDwvY29kZT4gaWYgdmFsaWRhdGlvbiBmYWxpZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIFByaW5jaXBhbCBwcmluY2lwYWwgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc2V0IG9mIDxjb2RlPlByaW5jaXBhbHM8L2NvZGU+IGxvYWRlZCBmcm9tIG91ciBjb25maWd1cmF0aW9uIGZpbGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIEhhc2hNYXAgcHJpbmNpcGFscyA9IG5ldyBIYXNoTWFwKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgc3RyaW5nIG1hbmFnZXIgZm9yIHRoaXMgcGFja2FnZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZ01hbmFnZXIgc20gPQorICAgICAgICBTdHJpbmdNYW5hZ2VyLmdldE1hbmFnZXIoQ29uc3RhbnRzLlBhY2thZ2UpOworCisgICAgLyoqCisgICAgICogVGhlIHN0YXRlIGluZm9ybWF0aW9uIHRoYXQgaXMgc2hhcmVkIHdpdGggb3RoZXIgY29uZmlndXJlZAorICAgICAqIDxjb2RlPkxvZ2luTW9kdWxlPC9jb2RlPiBpbnN0YW5jZXMuCisgICAgICovCisgICAgcHJvdGVjdGVkIE1hcCBzaGFyZWRTdGF0ZSA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzdWJqZWN0IGZvciB3aGljaCB3ZSBhcmUgcGVyZm9ybWluZyBhdXRoZW50aWNhdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3ViamVjdCBzdWJqZWN0ID0gbnVsbDsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKyAgICBwdWJsaWMgSkFBU01lbW9yeUxvZ2luTW9kdWxlKCkgeworICAgICAgICBsb2cuZGVidWcoIk1FTU9SWSBMT0dJTiBNT0RVTEUiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQaGFzZSAyIG9mIGF1dGhlbnRpY2F0aW5nIGEgPGNvZGU+U3ViamVjdDwvY29kZT4gd2hlbiBQaGFzZSAxCisgICAgICogZmFpbHMuICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgaWYgdGhlIDxjb2RlPkxvZ2luQ29udGV4dDwvY29kZT4KKyAgICAgKiBmYWlsZWQgc29tZXdoZXJlIGluIHRoZSBvdmVyYWxsIGF1dGhlbnRpY2F0aW9uIGNoYWluLgorICAgICAqCisgICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIG1ldGhvZCBzdWNjZWVkZWQsIG9yCisgICAgICogIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGlzIDxjb2RlPkxvZ2luTW9kdWxlPC9jb2RlPiBzaG91bGQgYmUKKyAgICAgKiAgaWdub3JlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBMb2dpbkV4Y2VwdGlvbiBpZiB0aGUgYWJvcnQgZmFpbHMKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBhYm9ydCgpIHRocm93cyBMb2dpbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gSWYgb3VyIGF1dGhlbnRpY2F0aW9uIHdhcyBub3Qgc3VjY2Vzc2Z1bCwganVzdCByZXR1cm4gZmFsc2UKKyAgICAgICAgaWYgKHByaW5jaXBhbCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChmYWxzZSk7CisKKyAgICAgICAgLy8gQ2xlYW4gdXAgaWYgb3ZlcmFsbCBhdXRoZW50aWNhdGlvbiBmYWlsZWQKKyAgICAgICAgaWYgKGNvbW1pdHRlZCkKKyAgICAgICAgICAgIGxvZ291dCgpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGNvbW1pdHRlZCA9IGZhbHNlOworICAgICAgICAgICAgcHJpbmNpcGFsID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBsb2cuZGVidWcoIkFib3J0Iik7CisgICAgICAgIHJldHVybiAodHJ1ZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFBoYXNlIDIgb2YgYXV0aGVudGljYXRpbmcgYSA8Y29kZT5TdWJqZWN0PC9jb2RlPiB3aGVuIFBoYXNlIDEKKyAgICAgKiB3YXMgc3VjY2Vzc2Z1bC4gIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBpZiB0aGUgPGNvZGU+TG9naW5Db250ZXh0PC9jb2RlPgorICAgICAqIHN1Y2NlZWRlZCBpbiB0aGUgb3ZlcmFsbCBhdXRoZW50aWNhdGlvbiBjaGFpbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGF1dGhlbnRpY2F0aW9uIHN1Y2NlZWRlZCwgb3IKKyAgICAgKiAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoaXMgPGNvZGU+TG9naW5Nb2R1bGU8L2NvZGU+IHNob3VsZCBiZQorICAgICAqICBpZ25vcmVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIExvZ2luRXhjZXB0aW9uIGlmIHRoZSBjb21taXQgZmFpbHMKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBjb21taXQoKSB0aHJvd3MgTG9naW5FeGNlcHRpb24geworICAgICAgICBsb2cuZGVidWcoImNvbW1pdCAiICsgcHJpbmNpcGFsKTsKKworICAgICAgICAvLyBJZiBhdXRoZW50aWNhdGlvbiB3YXMgbm90IHN1Y2Nlc3NmdWwsIGp1c3QgcmV0dXJuIGZhbHNlCisgICAgICAgIGlmIChwcmluY2lwYWwgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAoZmFsc2UpOworCisgICAgICAgIC8vIEFkZCBvdXIgUHJpbmNpcGFsIHRvIHRoZSBTdWJqZWN0IGlmIG5lZWRlZAorICAgICAgICBpZiAoIXN1YmplY3QuZ2V0UHJpbmNpcGFscygpLmNvbnRhaW5zKHByaW5jaXBhbCkpCisgICAgICAgICAgICBzdWJqZWN0LmdldFByaW5jaXBhbHMoKS5hZGQocHJpbmNpcGFsKTsKKworICAgICAgICBjb21taXR0ZWQgPSB0cnVlOworICAgICAgICByZXR1cm4gKHRydWUpOworCisgICAgfQorCisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBTZWN1cml0eUNvbnN0cmFpbnRzIGNvbmZpZ3VyZWQgdG8gZ3VhcmQgdGhlIHJlcXVlc3QgVVJJIGZvcgorICAgICAqIHRoaXMgcmVxdWVzdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gc3VjaCBjb25zdHJhaW50LgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgUmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgdGhlIFJlcXVlc3QgaXMgbWFwcGVkIHRvCisgICAgICovCisgICAgcHVibGljIFNlY3VyaXR5Q29uc3RyYWludCBbXSBmaW5kU2VjdXJpdHlDb25zdHJhaW50cyhSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQgY29udGV4dCkgeworICAgICAgICBBcnJheUxpc3QgcmVzdWx0cyA9IG51bGw7CisgICAgICAgIC8vIEFyZSB0aGVyZSBhbnkgZGVmaW5lZCBzZWN1cml0eSBjb25zdHJhaW50cz8KKyAgICAgICAgU2VjdXJpdHlDb25zdHJhaW50IGNvbnN0cmFpbnRzW10gPSBjb250ZXh0LmZpbmRDb25zdHJhaW50cygpOworICAgICAgICBpZiAoKGNvbnN0cmFpbnRzID09IG51bGwpIHx8IChjb25zdHJhaW50cy5sZW5ndGggPT0gMCkpIHsKKyAgICAgICAgICAgIGlmIChjb250ZXh0LmdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgY29udGV4dC5nZXRMb2dnZXIoKS5kZWJ1ZygiICBObyBhcHBsaWNhYmxlIGNvbnN0cmFpbnRzIGRlZmluZWQiKTsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBDaGVjayBlYWNoIGRlZmluZWQgc2VjdXJpdHkgY29uc3RyYWludAorICAgICAgICBTdHJpbmcgdXJpID0gcmVxdWVzdC5nZXREZWNvZGVkUmVxdWVzdFVSSSgpOworICAgICAgICBTdHJpbmcgY29udGV4dFBhdGggPSByZXF1ZXN0LmdldENvbnRleHRQYXRoKCk7CisgICAgICAgIGlmIChjb250ZXh0UGF0aC5sZW5ndGgoKSA+IDApCisgICAgICAgICAgICB1cmkgPSB1cmkuc3Vic3RyaW5nKGNvbnRleHRQYXRoLmxlbmd0aCgpKTsKKyAgICAgICAgdXJpID0gUmVxdWVzdFV0aWwuVVJMRGVjb2RlKHVyaSk7IC8vIEJlZm9yZSBjaGVja2luZyBjb25zdHJhaW50cworICAgICAgICBTdHJpbmcgbWV0aG9kID0gcmVxdWVzdC5nZXRNZXRob2QoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb25zdHJhaW50cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKGNvbnRleHQuZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBjb250ZXh0LmdldExvZ2dlcigpLmRlYnVnKCIgIENoZWNraW5nIGNvbnN0cmFpbnQgJyIgKyBjb25zdHJhaW50c1tpXSArCisgICAgICAgICAgICAgICAgICAgICInIGFnYWluc3QgIiArIG1ldGhvZCArICIgIiArIHVyaSArICIgLS0+ICIgKworICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW50c1tpXS5pbmNsdWRlZCh1cmksIG1ldGhvZCkpOworICAgICAgICAgICAgaWYgKGNvbnN0cmFpbnRzW2ldLmluY2x1ZGVkKHVyaSwgbWV0aG9kKSkgeworICAgICAgICAgICAgICAgIGlmKHJlc3VsdHMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXN1bHRzLmFkZChjb25zdHJhaW50c1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBObyBhcHBsaWNhYmxlIHNlY3VyaXR5IGNvbnN0cmFpbnQgd2FzIGZvdW5kCisgICAgICAgIGlmIChjb250ZXh0LmdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBjb250ZXh0LmdldExvZ2dlcigpLmRlYnVnKCIgIE5vIGFwcGxpY2FibGUgY29uc3RyYWludCBsb2NhdGVkIik7CisgICAgICAgIGlmKHJlc3VsdHMgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBTZWN1cml0eUNvbnN0cmFpbnQgW10gYXJyYXkgPSBuZXcgU2VjdXJpdHlDb25zdHJhaW50W3Jlc3VsdHMuc2l6ZSgpXTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShyZXN1bHRzLnRvQXJyYXkoKSwgMCwgYXJyYXksIDAsIGFycmF5Lmxlbmd0aCk7CisgICAgICAgIHJldHVybiBhcnJheTsKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSB0aGlzIDxjb2RlPkxvZ2luTW9kdWxlPC9jb2RlPiB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHN1YmplY3QgVGhlIDxjb2RlPlN1YmplY3Q8L2NvZGU+IHRvIGJlIGF1dGhlbnRpY2F0ZWQKKyAgICAgKiBAcGFyYW0gY2FsbGJhY2tIYW5kbGVyIEEgPGNvZGU+Q2FsbGJhY2tIYW5kbGVyPC9jb2RlPiBmb3IgY29tbXVuaWNhdGluZworICAgICAqICB3aXRoIHRoZSBlbmQgdXNlciBhcyBuZWNlc3NhcnkKKyAgICAgKiBAcGFyYW0gc2hhcmVkU3RhdGUgU3RhdGUgaW5mb3JtYXRpb24gc2hhcmVkIHdpdGggb3RoZXIKKyAgICAgKiAgPGNvZGU+TG9naW5Nb2R1bGU8L2NvZGU+IGluc3RhbmNlcworICAgICAqIEBwYXJhbSBvcHRpb25zIENvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoaXMgc3BlY2lmaWMKKyAgICAgKiAgPGNvZGU+TG9naW5Nb2R1bGU8L2NvZGU+IGluc3RhbmNlCisgICAgICovCisgICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShTdWJqZWN0IHN1YmplY3QsIENhbGxiYWNrSGFuZGxlciBjYWxsYmFja0hhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXAgc2hhcmVkU3RhdGUsIE1hcCBvcHRpb25zKSB7CisgICAgICAgIGxvZy5kZWJ1ZygiSW5pdCIpOworCisgICAgICAgIC8vIFNhdmUgY29uZmlndXJhdGlvbiB2YWx1ZXMKKyAgICAgICAgdGhpcy5zdWJqZWN0ID0gc3ViamVjdDsKKyAgICAgICAgdGhpcy5jYWxsYmFja0hhbmRsZXIgPSBjYWxsYmFja0hhbmRsZXI7CisgICAgICAgIHRoaXMuc2hhcmVkU3RhdGUgPSBzaGFyZWRTdGF0ZTsKKyAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKKworICAgICAgICAvLyBQZXJmb3JtIGluc3RhbmNlLXNwZWNpZmljIGluaXRpYWxpemF0aW9uCisgICAgICAgIGlmIChvcHRpb25zLmdldCgicGF0aG5hbWUiKSAhPSBudWxsKQorICAgICAgICAgICAgdGhpcy5wYXRobmFtZSA9IChTdHJpbmcpIG9wdGlvbnMuZ2V0KCJwYXRobmFtZSIpOworCisgICAgICAgIC8vIExvYWQgb3VyIGRlZmluZWQgUHJpbmNpcGFscworICAgICAgICBsb2FkKCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFBoYXNlIDEgb2YgYXV0aGVudGljYXRpbmcgYSA8Y29kZT5TdWJqZWN0PC9jb2RlPi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGF1dGhlbnRpY2F0aW9uIHN1Y2NlZWRlZCwgb3IKKyAgICAgKiAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoaXMgPGNvZGU+TG9naW5Nb2R1bGU8L2NvZGU+IHNob3VsZCBiZQorICAgICAqICBpZ25vcmVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIExvZ2luRXhjZXB0aW9uIGlmIHRoZSBhdXRoZW50aWNhdGlvbiBmYWlscworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGxvZ2luKCkgdGhyb3dzIExvZ2luRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBTZXQgdXAgb3VyIENhbGxiYWNrSGFuZGxlciByZXF1ZXN0cworICAgICAgICBpZiAoY2FsbGJhY2tIYW5kbGVyID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgTG9naW5FeGNlcHRpb24oIk5vIENhbGxiYWNrSGFuZGxlciBzcGVjaWZpZWQiKTsKKyAgICAgICAgQ2FsbGJhY2sgY2FsbGJhY2tzW10gPSBuZXcgQ2FsbGJhY2tbMl07CisgICAgICAgIGNhbGxiYWNrc1swXSA9IG5ldyBOYW1lQ2FsbGJhY2soIlVzZXJuYW1lOiAiKTsKKyAgICAgICAgY2FsbGJhY2tzWzFdID0gbmV3IFBhc3N3b3JkQ2FsbGJhY2soIlBhc3N3b3JkOiAiLCBmYWxzZSk7CisKKyAgICAgICAgLy8gSW50ZXJhY3Qgd2l0aCB0aGUgdXNlciB0byByZXRyaWV2ZSB0aGUgdXNlcm5hbWUgYW5kIHBhc3N3b3JkCisgICAgICAgIFN0cmluZyB1c2VybmFtZSA9IG51bGw7CisgICAgICAgIFN0cmluZyBwYXNzd29yZCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjYWxsYmFja0hhbmRsZXIuaGFuZGxlKGNhbGxiYWNrcyk7CisgICAgICAgICAgICB1c2VybmFtZSA9ICgoTmFtZUNhbGxiYWNrKSBjYWxsYmFja3NbMF0pLmdldE5hbWUoKTsKKyAgICAgICAgICAgIHBhc3N3b3JkID0KKyAgICAgICAgICAgICAgICBuZXcgU3RyaW5nKCgoUGFzc3dvcmRDYWxsYmFjaykgY2FsbGJhY2tzWzFdKS5nZXRQYXNzd29yZCgpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IExvZ2luRXhjZXB0aW9uKGUudG9TdHJpbmcoKSk7CisgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkQ2FsbGJhY2tFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IExvZ2luRXhjZXB0aW9uKGUudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBWYWxpZGF0ZSB0aGUgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIHdlIGhhdmUgcmVjZWl2ZWQKKyAgICAgICAgcHJpbmNpcGFsID0gc3VwZXIuYXV0aGVudGljYXRlKHVzZXJuYW1lLCBwYXNzd29yZCk7CisKKyAgICAgICAgbG9nLmRlYnVnKCJsb2dpbiAiICsgdXNlcm5hbWUgKyAiICIgKyBwcmluY2lwYWwpOworCisgICAgICAgIC8vIFJlcG9ydCByZXN1bHRzIGJhc2VkIG9uIHN1Y2Nlc3Mgb3IgZmFpbHVyZQorICAgICAgICBpZiAocHJpbmNpcGFsICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiAodHJ1ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcKKyAgICAgICAgICAgICAgICBGYWlsZWRMb2dpbkV4Y2VwdGlvbigiVXNlcm5hbWUgb3IgcGFzc3dvcmQgaXMgaW5jb3JyZWN0Iik7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogTG9nIG91dCB0aGlzIHVzZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGluIGFsbCBjYXNlcyBiZWNhdXNlIHRoaWUKKyAgICAgKiAgPGNvZGU+TG9naW5Nb2R1bGU8L2NvZGU+IHNob3VsZCBub3QgYmUgaWdub3JlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBMb2dpbkV4Y2VwdGlvbiBpZiBsb2dnaW5nIG91dCBmYWlsZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBsb2dvdXQoKSB0aHJvd3MgTG9naW5FeGNlcHRpb24geworCisgICAgICAgIHN1YmplY3QuZ2V0UHJpbmNpcGFscygpLnJlbW92ZShwcmluY2lwYWwpOworICAgICAgICBjb21taXR0ZWQgPSBmYWxzZTsKKyAgICAgICAgcHJpbmNpcGFsID0gbnVsbDsKKyAgICAgICAgcmV0dXJuICh0cnVlKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBSZWFsbSBNZXRob2RzCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3RlY3RlZCBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIExvYWQgdGhlIGNvbnRlbnRzIG9mIG91ciBjb25maWd1cmF0aW9uIGZpbGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgbG9hZCgpIHsKKworICAgICAgICAvLyBWYWxpZGF0ZSB0aGUgZXhpc3RlbmNlIG9mIG91ciBjb25maWd1cmF0aW9uIGZpbGUKKyAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUocGF0aG5hbWUpOworICAgICAgICBpZiAoIWZpbGUuaXNBYnNvbHV0ZSgpKQorICAgICAgICAgICAgZmlsZSA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2F0YWxpbmEuYmFzZSIpLCBwYXRobmFtZSk7CisgICAgICAgIGlmICghZmlsZS5leGlzdHMoKSB8fCAhZmlsZS5jYW5SZWFkKCkpIHsKKyAgICAgICAgICAgIGxvZy53YXJuKCJDYW5ub3QgbG9hZCBjb25maWd1cmF0aW9uIGZpbGUgIiArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gTG9hZCB0aGUgY29udGVudHMgb2Ygb3VyIGNvbmZpZ3VyYXRpb24gZmlsZQorICAgICAgICBEaWdlc3RlciBkaWdlc3RlciA9IG5ldyBEaWdlc3RlcigpOworICAgICAgICBkaWdlc3Rlci5zZXRWYWxpZGF0aW5nKGZhbHNlKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkUnVsZVNldChuZXcgTWVtb3J5UnVsZVNldCgpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGRpZ2VzdGVyLnB1c2godGhpcyk7CisgICAgICAgICAgICBkaWdlc3Rlci5wYXJzZShmaWxlKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZy53YXJuKCJFcnJvciBwcm9jZXNzaW5nIGNvbmZpZ3VyYXRpb24gZmlsZSAiICsKKyAgICAgICAgICAgICAgICBmaWxlLmdldEFic29sdXRlUGF0aCgpLCBlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGRpZ2VzdGVyLnJlc2V0KCk7CisgICAgICAgIH0KKworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9yZWFsbS9KQUFTUmVhbG0uamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9yZWFsbS9KQUFTUmVhbG0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTc5NTcxCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3JlYWxtL0pBQVNSZWFsbS5qYXZhCkBAIC0wLDAgKzEsNjMzIEBACisvKgorICogQ29weXJpZ2h0IDIwMDEtMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEucmVhbG07CisKKworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsOworaW1wb3J0IGphdmEuc2VjdXJpdHkuYWNsLkdyb3VwOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXguc2VjdXJpdHkuYXV0aC5TdWJqZWN0OworaW1wb3J0IGphdmF4LnNlY3VyaXR5LmF1dGgubG9naW4uQWNjb3VudEV4cGlyZWRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VjdXJpdHkuYXV0aC5sb2dpbi5DcmVkZW50aWFsRXhwaXJlZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZWN1cml0eS5hdXRoLmxvZ2luLkZhaWxlZExvZ2luRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlY3VyaXR5LmF1dGgubG9naW4uTG9naW5Db250ZXh0OworaW1wb3J0IGphdmF4LnNlY3VyaXR5LmF1dGgubG9naW4uTG9naW5FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuU3RyaW5nTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKKworCisvKioKKyAqIDxwPkltcGxtZW50YXRpb24gb2YgPGI+UmVhbG08L2I+IHRoYXQgYXV0aGVudGljYXRlcyB1c2VycyB2aWEgdGhlIDxlbT5KYXZhCisgKiBBdXRoZW50aWNhdGlvbiBhbmQgQXV0aG9yaXphdGlvbiBTZXJ2aWNlPC9lbT4gKEpBQVMpLiAgSkFBUyBzdXBwb3J0IHJlcXVpcmVzCisgKiBlaXRoZXIgSkRLIDEuNCAod2hpY2ggaW5jbHVkZXMgaXQgYXMgcGFydCBvZiB0aGUgc3RhbmRhcmQgcGxhdGZvcm0pIG9yCisgKiBKREsgMS4zICh3aXRoIHRoZSBwbHVnLWluIDxjb2RlPmphYXMuamFyPC9jb2RlPiBmaWxlKS48L3A+CisgKgorICogPHA+VGhlIHZhbHVlIGNvbmZpZ3VyZWQgZm9yIHRoZSA8Y29kZT5hcHBOYW1lPC9jb2RlPiBwcm9wZXJ0eSBpcyBwYXNzZWQgdG8KKyAqIHRoZSA8Y29kZT5qYXZheC5zZWN1cml0eS5hdXRoLmxvZ2luLkxvZ2luQ29udGV4dDwvY29kZT4gY29uc3RydWN0b3IsIHRvCisgKiBzcGVjaWZ5IHRoZSA8ZW0+YXBwbGljYXRpb24gbmFtZTwvZW0+IHVzZWQgdG8gc2VsZWN0IHRoZSBzZXQgb2YgcmVsZXZhbnQKKyAqIDxjb2RlPkxvZ2luTW9kdWxlczwvY29kZT4gcmVxdWlyZWQuPC9wPgorICoKKyAqIDxwPlRoZSBKQUFTIFNwZWNpZmljYXRpb24gZGVzY3JpYmVzIHRoZSByZXN1bHQgb2YgYSBzdWNjZXNzZnVsIGxvZ2luIGFzIGEKKyAqIDxjb2RlPmphdmF4LnNlY3VyaXR5LmF1dGguU3ViamVjdDwvY29kZT4gaW5zdGFuY2UsIHdoaWNoIGNhbiBjb250YWluIHplcm8KKyAqIG9yIG1vcmUgPGNvZGU+amF2YS5zZWN1cml0eS5QcmluY2lwYWw8L2NvZGU+IG9iamVjdHMgaW4gdGhlIHJldHVybiB2YWx1ZQorICogb2YgdGhlIDxjb2RlPlN1YmplY3QuZ2V0UHJpbmNpcGFscygpPC9jb2RlPiBtZXRob2QuICBIb3dldmVyLCBpdCBwcm92aWRlcworICogbm8gZ3VpZGFuY2Ugb24gaG93IHRvIGRpc3Rpbmd1aXNoIFByaW5jaXBhbHMgdGhhdCBkZXNjcmliZSB0aGUgaW5kaXZpZHVhbAorICogdXNlciAoYW5kIGFyZSB0aHVzIGFwcHJvcHJpYXRlIHRvIHJldHVybiBhcyB0aGUgdmFsdWUgb2YKKyAqIHJlcXVlc3QuZ2V0VXNlclByaW5jaXBhbCgpIGluIGEgd2ViIGFwcGxpY2F0aW9uKSBmcm9tIHRoZSBQcmluY2lwYWwocykKKyAqIHRoYXQgZGVzY3JpYmUgdGhlIGF1dGhvcml6ZWQgcm9sZXMgZm9yIHRoaXMgdXNlci4gIFRvIG1haW50YWluIGFzIG11Y2gKKyAqIGluZGVwZW5kZW5jZSBhcyBwb3NzaWJsZSBmcm9tIHRoZSB1bmRlcmx5aW5nIDxjb2RlPkxvZ2luTWV0aG9kPC9jb2RlPgorICogaW1wbGVtZW50YXRpb24gZXhlY3V0ZWQgYnkgSkFBUywgdGhlIGZvbGxvd2luZyBwb2xpY3kgaXMgaW1wbGVtZW50ZWQgYnkKKyAqIHRoaXMgUmVhbG06PC9wPgorICogPHVsPgorICogPGxpPlRoZSBKQUFTIDxjb2RlPkxvZ2luTW9kdWxlPC9jb2RlPiBpcyBhc3N1bWVkIHRvIHJldHVybiBhCisgKiAgICAgPGNvZGU+U3ViamVjdDwvY29kZT4gd2l0aCBhdCBsZWFzdCBvbmUgPGNvZGU+UHJpbmNpcGFsPC9jb2RlPiBpbnN0YW5jZQorICogICAgIHJlcHJlc2VudGluZyB0aGUgdXNlciBoaW1zZWxmIG9yIGhlcnNlbGYsIGFuZCB6ZXJvIG9yIG1vcmUgc2VwYXJhdGUKKyAqICAgICA8Y29kZT5QcmluY2lwYWxzPC9jb2RlPiByZXByZXNlbnRpbmcgdGhlIHNlY3VyaXR5IHJvbGVzIGF1dGhvcml6ZWQKKyAqICAgICBmb3IgdGhpcyB1c2VyLjwvbGk+CisgKiA8bGk+T24gdGhlIDxjb2RlPlByaW5jaXBhbDwvY29kZT4gcmVwcmVzZW50aW5nIHRoZSB1c2VyLCB0aGUgUHJpbmNpcGFsCisgKiAgICAgbmFtZSBpcyBhbiBhcHByb3ByaWF0ZSB2YWx1ZSB0byByZXR1cm4gdmlhIHRoZSBTZXJ2bGV0IEFQSSBtZXRob2QKKyAqICAgICA8Y29kZT5IdHRwU2VydmxldFJlcXVlc3QuZ2V0UmVtb3RlVXNlcigpPC9jb2RlPi48L2xpPgorICogPGxpPk9uIHRoZSA8Y29kZT5QcmluY2lwYWxzPC9jb2RlPiByZXByZXNlbnRpbmcgdGhlIHNlY3VyaXR5IHJvbGVzLCB0aGUKKyAqICAgICBuYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBhdXRob3JpemVkIHNlY3VyaXR5IHJvbGUuPC9saT4KKyAqIDxsaT5UaGlzIFJlYWxtIHdpbGwgYmUgY29uZmlndXJlZCB3aXRoIHR3byBsaXN0cyBvZiBmdWxseSBxdWFsaWZpZWQgSmF2YQorICogICAgIGNsYXNzIG5hbWVzIG9mIGNsYXNzZXMgdGhhdCBpbXBsZW1lbnQKKyAqICAgICA8Y29kZT5qYXZhLnNlY3VyaXR5LlByaW5jaXBhbDwvY29kZT4gLSBvbmUgdGhhdCBpZGVudGlmaWVzIGNsYXNzKGVzKQorICogICAgIHJlcHJlc2VudGluZyBhIHVzZXIsIGFuZCBvbmUgdGhhdCBpZGVudGlmaWVzIGNsYXNzKGVzKSByZXByZXNlbnRpbmcKKyAqICAgICBhIHNlY3VyaXR5IHJvbGUuPC9saT4KKyAqIDxsaT5BcyB0aGlzIFJlYWxtIGl0ZXJhdGVzIG92ZXIgdGhlIDxjb2RlPlByaW5jaXBhbHM8L2NvZGU+IHJldHVybmVkIGJ5CisgKiAgICAgPGNvZGU+U3ViamVjdC5nZXRQcmluY2lwYWxzKCk8L2NvZGU+LCBpdCB3aWxsIGlkZW50aWZ5IHRoZSBmaXJzdAorICogICAgIDxjb2RlPlByaW5jaXBhbDwvY29kZT4gdGhhdCBtYXRjaGVzIHRoZSAidXNlciBjbGFzc2VzIiBsaXN0IGFzIHRoZQorICogICAgIDxjb2RlPlByaW5jaXBhbDwvY29kZT4gZm9yIHRoaXMgdXNlci48L2xpPgorICogPGxpPkFzIHRoaXMgUmVhbG0gaXRlcmF0ZXMgb3ZlciB0aGUgPGNvZGU+UHJpbmNwYWxzPC9jb2RlPiByZXR1cm5lZCBieQorICogICAgIDxjb2RlPlN1YmplY3QuZ2V0UHJpbmNpcGFscygpPC9jb2RlPiwgaXQgd2lsbCBhY2N1bXVsYXRlIHRoZSBzZXQgb2YKKyAqICAgICBhbGwgPGNvZGU+UHJpbmNpcGFsczwvY29kZT4gbWF0Y2hpbmcgdGhlICJyb2xlIGNsYXNzZXMiIGxpc3QgYXMKKyAqICAgICBpZGVudGlmeWluZyB0aGUgc2VjdXJpdHkgcm9sZXMgZm9yIHRoaXMgdXNlci48L2xpPgorICogPGxpPkl0IGlzIGEgY29uZmlndXJhdGlvbiBlcnJvciBmb3IgdGhlIEpBQVMgbG9naW4gbWV0aG9kIHRvIHJldHVybiBhCisgKiAgICAgdmFsaWRhdGVkIDxjb2RlPlN1YmplY3Q8L2NvZGU+IHdpdGhvdXQgYSA8Y29kZT5QcmluY2lwYWw8L2NvZGU+IHRoYXQKKyAqICAgICBtYXRjaGVzIHRoZSAidXNlciBjbGFzc2VzIiBsaXN0LjwvbGk+CisgKiA8bGk+QnkgZGVmYXVsdCwgdGhlIGVuY2xvc2luZyBDb250YWluZXIncyBuYW1lIHNlcnZlcyBhcyB0aGUKKyAqICAgICBhcHBsaWNhdGlvbiBuYW1lIHVzZWQgdG8gb2J0YWluIHRoZSBKQUFTIExvZ2luQ29udGV4dCAoIkNhdGFsaW5hIiBpbgorICogICAgIGEgZGVmYXVsdCBpbnN0YWxsYXRpb24pLiBUb21jYXQgbXVzdCBiZSBhYmxlIHRvIGZpbmQgYW4gYXBwbGljYXRpb24KKyAqICAgICB3aXRoIHRoaXMgbmFtZSBpbiB0aGUgSkFBUyBjb25maWd1cmF0aW9uIGZpbGUuIEhlcmUgaXMgYSBoeXBvdGhldGljYWwKKyAqICAgICBKQUFTIGNvbmZpZ3VyYXRpb24gZmlsZSBlbnRyeSBmb3IgYSBkYXRhYmFzZS1vcmllbnRlZCBsb2dpbiBtb2R1bGUgdGhhdCB1c2VzIAorICogICAgIGEgVG9tY2F0LW1hbmFnZWQgSk5ESSBkYXRhYmFzZSByZXNvdXJjZToKKyAqICAgICA8YmxvY2txdW90ZT48cHJlPkNhdGFsaW5hIHsKK29yZy5mb29iYXIuYXV0aC5EYXRhYmFzZUxvZ2luTW9kdWxlIFJFUVVJUkVECisgICAgSk5ESV9SRVNPVVJDRT1qZGJjL0F1dGhEQgorICBVU0VSX1RBQkxFPXVzZXJzCisgIFVTRVJfSURfQ09MVU1OPWlkCisgIFVTRVJfTkFNRV9DT0xVTU49bmFtZQorICBVU0VSX0NSRURFTlRJQUxfQ09MVU1OPXBhc3N3b3JkCisgIFJPTEVfVEFCTEU9cm9sZXMKKyAgUk9MRV9OQU1FX0NPTFVNTj1uYW1lCisgIFBSSU5DSVBBTF9GQUNUT1JZPW9yZy5mb29iYXIuYXV0aC5pbXBsLlNpbXBsZVByaW5jaXBhbEZhY3Rvcnk7Cit9OzwvcHJlPjwvYmxvY2txdW90ZT48L2xpPgorICogPGxpPlRvIHNldCB0aGUgSkFBUyBjb25maWd1cmF0aW9uIGZpbGUKKyAqICAgICBsb2NhdGlvbiwgc2V0IHRoZSA8Y29kZT5DQVRBTElOQV9PUFRTPC9jb2RlPiBlbnZpcm9ubWVudCB2YXJpYWJsZQorICogICAgIHNpbWlsYXIgdG8gdGhlIGZvbGxvd2luZzoKKzxibG9ja3F1b3RlPjxjb2RlPkNBVEFMSU5BX09QVFM9Ii1EamF2YS5zZWN1cml0eS5hdXRoLmxvZ2luLmNvbmZpZz0kQ0FUQUxJTkFfSE9NRS9jb25mL2phYXMuY29uZmlnIjwvY29kZT48L2Jsb2NrcXVvdGU+CisgKiA8L2xpPgorICogPGxpPkFzIHBhcnQgb2YgdGhlIGxvZ2luIHByb2Nlc3MsIEpBQVNSZWFsbSByZWdpc3RlcnMgaXRzIG93biA8Y29kZT5DYWxsYmFja0hhbmRsZXI8L2NvZGU+LAorICogICAgIGNhbGxlZCAodW5zdXJwcmlzaW5nbHkpIDxjb2RlPkpBQVNDYWxsYmFja0hhbmRsZXI8L2NvZGU+LiBUaGlzIGhhbmRsZXIgc3VwcGxpZXMgdGhlIAorICogICAgIEhUVFAgcmVxdWVzdHMncyB1c2VybmFtZSBhbmQgY3JlZGVudGlhbHMgdG8gdGhlIHVzZXItc3VwcGxpZWQgPGNvZGU+TG9naW5Nb2R1bGU8L2NvZGU+PC9saT4KKyAqIDxsaT5BcyB3aXRoIG90aGVyIDxjb2RlPlJlYWxtPC9jb2RlPiBpbXBsZW1lbnRhdGlvbnMsIGRpZ2VzdGVkIHBhc3N3b3JkcyBhcmUgc3VwcG9ydGVkIGlmCisgKiAgICAgdGhlIDxjb2RlPiZsdDtSZWFsbSZndDs8L2NvZGU+IGVsZW1lbnQgaW4gPGNvZGU+c2VydmVyLnhtbDwvY29kZT4gY29udGFpbnMgYSAKKyAqICAgICA8Y29kZT5kaWdlc3Q8L2NvZGU+IGF0dHJpYnV0ZTsgPGNvZGU+SkFBU0NhbGxiYWNrSGFuZGxlcjwvY29kZT4gd2lsbCBkaWdlc3QgdGhlIHBhc3N3b3JkCisgKiAgICAgcHJpb3IgdG8gcGFzc2luZyBpdCBiYWNrIHRvIHRoZSA8Y29kZT5Mb2dpbk1vZHVsZTwvY29kZT48L2xpPiAgCisqIDwvdWw+CisqCisqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorKiBAYXV0aG9yIFlvYXYgU2hhcGlyYQorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgSkFBU1JlYWxtCisgICAgZXh0ZW5kcyBSZWFsbUJhc2UKKyB7CisgICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEpBQVNSZWFsbS5jbGFzcyk7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIGFwcGxpY2F0aW9uIG5hbWUgcGFzc2VkIHRvIHRoZSBKQUFTIDxjb2RlPkxvZ2luQ29udGV4dDwvY29kZT4sCisgICAgICogd2hpY2ggdXNlcyBpdCB0byBzZWxlY3QgdGhlIHNldCBvZiByZWxldmFudCA8Y29kZT5Mb2dpbk1vZHVsZTwvY29kZT5zLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgYXBwTmFtZSA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIERlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgPGNvZGU+UmVhbG08L2NvZGU+IGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIGluZm8gPQorICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5yZWFsbS5KQUFTUmVhbG0vMS4wIjsKKworCisgICAgLyoqCisgICAgICogRGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyA8Y29kZT5SZWFsbTwvY29kZT4gaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgbmFtZSA9ICJKQUFTUmVhbG0iOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgbGlzdCBvZiByb2xlIGNsYXNzIG5hbWVzLCBzcGxpdCBvdXQgZm9yIGVhc3kgcHJvY2Vzc2luZy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTGlzdCByb2xlQ2xhc3NlcyA9IG5ldyBBcnJheUxpc3QoKTsKKworCisgICAgLyoqCisgICAgICogVGhlIHN0cmluZyBtYW5hZ2VyIGZvciB0aGlzIHBhY2thZ2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdNYW5hZ2VyIHNtID0KKyAgICAgICAgU3RyaW5nTWFuYWdlci5nZXRNYW5hZ2VyKENvbnN0YW50cy5QYWNrYWdlKTsKKworCisgICAgLyoqCisgICAgICogVGhlIHNldCBvZiB1c2VyIGNsYXNzIG5hbWVzLCBzcGxpdCBvdXQgZm9yIGVhc3kgcHJvY2Vzc2luZy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTGlzdCB1c2VyQ2xhc3NlcyA9IG5ldyBBcnJheUxpc3QoKTsKKworICAgICAvKioKKyAgICAgICogTWFwIGFzc29jaWF0aW5nIGVhY2ggdXNlciA8Y29kZT5QcmluY2lwYWw8L2NvZGU+IG9iamVjdAorICAgICAgKiB3aXRoIGFuIGFycmF5IG9mIHJvbGUgPGNvZGU+UHJpbmNpcGFsPC9jb2RlPnMuIAorICAgICAgKiBUaGlzIE1hcCBpcyByZWFkIHdoZW4gPGNvZGU+aGFzUm9sZTwvY29kZT4gaXMgY2FsbGVkLgorICAgICAgKi8KKyAgICAgcHJvdGVjdGVkIE1hcCByb2xlTWFwID0gbmV3IEhhc2hNYXAoKTsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gdXNlIGNvbnRleHQgQ2xhc3NMb2FkZXIgb3IgZGVmYXVsdCBDbGFzc0xvYWRlci4KKyAgICAgKiBUcnVlIG1lYW5zIHVzZSBjb250ZXh0IENsYXNzTG9hZGVyLCBhbmQgVHJ1ZSBpcyB0aGUgZGVmYXVsdAorICAgICAqIHZhbHVlLgorICAgICAqLworICAgICBwcm90ZWN0ZWQgYm9vbGVhbiB1c2VDb250ZXh0Q2xhc3NMb2FkZXIgPSB0cnVlOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworICAgIAorICAgIC8qKgorICAgICAqIHNldHRlciBmb3IgdGhlIDxjb2RlPmFwcE5hbWU8L2NvZGU+IG1lbWJlciB2YXJpYWJsZQorICAgICAqIEBkZXByZWNhdGVkIEpBQVMgc2hvdWxkIHVzZSB0aGUgPGNvZGU+RW5naW5lPC9jb2RlPiAoZG9tYWluKSBuYW1lIGFuZCB3ZWJwcC9ob3N0IG92ZXJyaWRlcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEFwcE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgYXBwTmFtZSA9IG5hbWU7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIGdldHRlciBmb3IgdGhlIDxjb2RlPmFwcE5hbWU8L2NvZGU+IG1lbWJlciB2YXJpYWJsZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXBwTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIGFwcE5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB3aGV0aGVyIHRvIHVzZSB0aGUgY29udGV4dCBvciBkZWZhdWx0IENsYXNzTG9hZGVyLgorICAgICAqIFRydWUgbWVhbnMgdXNlIGNvbnRleHQgQ2xhc3NMb2FkZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXNlQ29udGV4dCBUcnVlIG1lYW5zIHVzZSBjb250ZXh0IENsYXNzTG9hZGVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VXNlQ29udGV4dENsYXNzTG9hZGVyKGJvb2xlYW4gdXNlQ29udGV4dCkgeworICAgICAgdXNlQ29udGV4dENsYXNzTG9hZGVyID0gdXNlQ29udGV4dDsKKyAgICAgIGxvZy5pbmZvKCJTZXR0aW5nIHVzZUNvbnRleHRDbGFzc0xvYWRlciA9ICIgKyB1c2VDb250ZXh0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdG8gdXNlIHRoZSBjb250ZXh0IG9yIGRlZmF1bHQgQ2xhc3NMb2FkZXIuCisgICAgICogVHJ1ZSBtZWFucyB0byB1c2UgdGhlIGNvbnRleHQgQ2xhc3NMb2FkZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB1c2VDb250ZXh0Q2xhc3NMb2FkZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1VzZUNvbnRleHRDbGFzc0xvYWRlcigpIHsKKwlyZXR1cm4gdXNlQ29udGV4dENsYXNzTG9hZGVyOworICAgIH0gCisKKyAgICBwdWJsaWMgdm9pZCBzZXRDb250YWluZXIoQ29udGFpbmVyIGNvbnRhaW5lcikgeworICAgICAgICBzdXBlci5zZXRDb250YWluZXIoY29udGFpbmVyKTsKKworICAgICAgICBpZiggYXBwTmFtZT09bnVsbCAgKSB7CisgICAgICAgICAgICBTdHJpbmcgbmFtZT1jb250YWluZXIuZ2V0TmFtZSgpOworICAgICAgICAgICAgbmFtZSA9IG1ha2VMZWdhbEZvckpBQVMobmFtZSk7CisKKyAgICAgICAgICAgIGFwcE5hbWU9bmFtZTsKKworICAgICAgICAgICAgbG9nLmluZm8oIlNldCBKQUFTIGFwcCBuYW1lICIgKyBhcHBOYW1lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENvbW1hLWRlbGltaXRlZCBsaXN0IG9mIDxjb2RlPmphdmEuc2VjdXJpdHkuUHJpbmNpcGFsPC9jb2RlPiBjbGFzc2VzCisgICAgICogdGhhdCByZXByZXNlbnQgc2VjdXJpdHkgcm9sZXMuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyByb2xlQ2xhc3NOYW1lcyA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFJvbGVDbGFzc05hbWVzKCkgeworICAgICAgICByZXR1cm4gKHRoaXMucm9sZUNsYXNzTmFtZXMpOworICAgIH0KKworICAgICAvKioKKyAgICAgICogU2V0cyB0aGUgbGlzdCBvZiBjb21tYS1kZWxpbWl0ZWQgY2xhc3NlcyB0aGF0IHJlcHJlc2VudCAKKyAgICAgICogcm9sZXMuIFRoZSBjbGFzc2VzIGluIHRoZSBsaXN0IG11c3QgaW1wbGVtZW50IDxjb2RlPmphdmEuc2VjdXJpdHkuUHJpbmNpcGFsPC9jb2RlPi4KKyAgICAgICogV2hlbiB0aGlzIGFjY2Vzc29yIGlzIGNhbGxlZCAoZm9yIGV4YW1wbGUsIGJ5IGEgPGNvZGU+RGlnZXN0ZXI8L2NvZGU+CisgICAgICAqIGluc3RhbmNlIHBhcnNpbmcgdGhlCisgICAgICAqIGNvbmZpZ3VyYXRpb24gZmlsZSksIGl0IHdpbGwgcGFyc2UgdGhlIGNsYXNzIG5hbWVzIGFuZCBzdG9yZSB0aGUgcmVzdWx0aW5nCisgICAgICAqIHN0cmluZyhzKSBpbnRvIHRoZSA8Y29kZT5BcnJheUxpc3Q8L2NvZGU+IGZpZWxkIDwvY29kZT5yb2xlQ2xhc3NlczwvY29kZT4uCisgICAgICAqLworICAgICBwdWJsaWMgdm9pZCBzZXRSb2xlQ2xhc3NOYW1lcyhTdHJpbmcgcm9sZUNsYXNzTmFtZXMpIHsKKyAgICAgICAgIHRoaXMucm9sZUNsYXNzTmFtZXMgPSByb2xlQ2xhc3NOYW1lczsKKyAgICAgICAgcm9sZUNsYXNzZXMuY2xlYXIoKTsKKyAgICAgICAgU3RyaW5nIHRlbXAgPSB0aGlzLnJvbGVDbGFzc05hbWVzOworICAgICAgICBpZiAodGVtcCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIGludCBjb21tYSA9IHRlbXAuaW5kZXhPZignLCcpOworICAgICAgICAgICAgaWYgKGNvbW1hIDwgMCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcm9sZUNsYXNzZXMuYWRkKHRlbXAuc3Vic3RyaW5nKDAsIGNvbW1hKS50cmltKCkpOworICAgICAgICAgICAgdGVtcCA9IHRlbXAuc3Vic3RyaW5nKGNvbW1hICsgMSk7CisgICAgICAgIH0KKyAgICAgICAgdGVtcCA9IHRlbXAudHJpbSgpOworICAgICAgICBpZiAodGVtcC5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgIHJvbGVDbGFzc2VzLmFkZCh0ZW1wKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29tbWEtZGVsaW1pdGVkIGxpc3Qgb2YgPGNvZGU+amF2YS5zZWN1cml0eS5QcmluY2lwYWw8L2NvZGU+IGNsYXNzZXMKKyAgICAgKiB0aGF0IHJlcHJlc2VudCBpbmRpdmlkdWFsIHVzZXJzLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgdXNlckNsYXNzTmFtZXMgPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXRVc2VyQ2xhc3NOYW1lcygpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLnVzZXJDbGFzc05hbWVzKTsKKyAgICB9CisKKyAgICAgLyoqCisgICAgICogU2V0cyB0aGUgbGlzdCBvZiBjb21tYS1kZWxpbWl0ZWQgY2xhc3NlcyB0aGF0IHJlcHJlc2VudCBpbmRpdmlkdWFsCisgICAgICogdXNlcnMuIFRoZSBjbGFzc2VzIGluIHRoZSBsaXN0IG11c3QgaW1wbGVtZW50IDxjb2RlPmphdmEuc2VjdXJpdHkuUHJpbmNpcGFsPC9jb2RlPi4KKyAgICAgKiBXaGVuIHRoaXMgYWNjZXNzb3IgaXMgY2FsbGVkIChmb3IgZXhhbXBsZSwgYnkgYSA8Y29kZT5EaWdlc3RlcjwvY29kZT4KKyAgICAgKiBpbnN0YW5jZSBwYXJzaW5nIHRoZQorICAgICAqIGNvbmZpZ3VyYXRpb24gZmlsZSksIGl0IHdpbGwgcGFyc2UgdGhlIGNsYXNzIG5hbWVzIGFuZCBzdG9yZSB0aGUgcmVzdWx0aW5nCisgICAgICogc3RyaW5nKHMpIGludG8gdGhlIDxjb2RlPkFycmF5TGlzdDwvY29kZT4gZmllbGQgPC9jb2RlPnVzZXJDbGFzc2VzPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVc2VyQ2xhc3NOYW1lcyhTdHJpbmcgdXNlckNsYXNzTmFtZXMpIHsKKyAgICAgICAgdGhpcy51c2VyQ2xhc3NOYW1lcyA9IHVzZXJDbGFzc05hbWVzOworICAgICAgICB1c2VyQ2xhc3Nlcy5jbGVhcigpOworICAgICAgICBTdHJpbmcgdGVtcCA9IHRoaXMudXNlckNsYXNzTmFtZXM7CisgICAgICAgIGlmICh0ZW1wID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgaW50IGNvbW1hID0gdGVtcC5pbmRleE9mKCcsJyk7CisgICAgICAgICAgICBpZiAoY29tbWEgPCAwKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1c2VyQ2xhc3Nlcy5hZGQodGVtcC5zdWJzdHJpbmcoMCwgY29tbWEpLnRyaW0oKSk7CisgICAgICAgICAgICB0ZW1wID0gdGVtcC5zdWJzdHJpbmcoY29tbWEgKyAxKTsKKyAgICAgICAgfQorICAgICAgICB0ZW1wID0gdGVtcC50cmltKCk7CisgICAgICAgIGlmICh0ZW1wLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgdXNlckNsYXNzZXMuYWRkKHRlbXApOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSA8Y29kZT5QcmluY2lwYWw8L2NvZGU+IGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIHVzZXJuYW1lIGFuZAorICAgICAqIGNyZWRlbnRpYWxzLCBpZiB0aGVyZSBpcyBvbmU7IG90aGVyd2lzZSByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBJZiB0aGVyZSBhcmUgYW55IGVycm9ycyB3aXRoIHRoZSBKREJDIGNvbm5lY3Rpb24sIGV4ZWN1dGluZworICAgICAqIHRoZSBxdWVyeSBvciBhbnl0aGluZyB3ZSByZXR1cm4gbnVsbCAoZG9uJ3QgYXV0aGVudGljYXRlKS4gVGhpcworICAgICAqIGV2ZW50IGlzIGFsc28gbG9nZ2VkLCBhbmQgdGhlIGNvbm5lY3Rpb24gd2lsbCBiZSBjbG9zZWQgc28gdGhhdAorICAgICAqIGEgc3Vic2VxdWVudCByZXF1ZXN0IHdpbGwgYXV0b21hdGljYWxseSByZS1vcGVuIGl0LgorICAgICAqCisgICAgICogQHBhcmFtIHVzZXJuYW1lIFVzZXJuYW1lIG9mIHRoZSA8Y29kZT5QcmluY2lwYWw8L2NvZGU+IHRvIGxvb2sgdXAKKyAgICAgKiBAcGFyYW0gY3JlZGVudGlhbHMgUGFzc3dvcmQgb3Igb3RoZXIgY3JlZGVudGlhbHMgdG8gdXNlIGluCisgICAgICogIGF1dGhlbnRpY2F0aW5nIHRoaXMgdXNlcm5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgUHJpbmNpcGFsIGF1dGhlbnRpY2F0ZShTdHJpbmcgdXNlcm5hbWUsIFN0cmluZyBjcmVkZW50aWFscykgeworCisgICAgICAgIC8vIEVzdGFibGlzaCBhIExvZ2luQ29udGV4dCB0byB1c2UgZm9yIGF1dGhlbnRpY2F0aW9uCisgICAgICAgIHRyeSB7CisgICAgICAgIExvZ2luQ29udGV4dCBsb2dpbkNvbnRleHQgPSBudWxsOworICAgICAgICBpZiggYXBwTmFtZT09bnVsbCApIGFwcE5hbWU9IlRvbWNhdCI7CisKKyAgICAgICAgaWYoIGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmRlYnVnKHNtLmdldFN0cmluZygiamFhc1JlYWxtLmJlZ2luTG9naW4iLCB1c2VybmFtZSwgYXBwTmFtZSkpOworCisgICAgICAgIC8vIFdoYXQgaWYgdGhlIExvZ2luTW9kdWxlIGlzIGluIHRoZSBjb250YWluZXIgY2xhc3MgbG9hZGVyID8KKyAgICAgICAgQ2xhc3NMb2FkZXIgb2NsID0gbnVsbDsKKworICAgICAgICBpZiAoaXNVc2VDb250ZXh0Q2xhc3NMb2FkZXIoKSkgeworICAgICAgICAgIG9jbD1UaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOworICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKHRoaXMuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBsb2dpbkNvbnRleHQgPSBuZXcgTG9naW5Db250ZXh0CisgICAgICAgICAgICAgICAgKGFwcE5hbWUsIG5ldyBKQUFTQ2FsbGJhY2tIYW5kbGVyKHRoaXMsIHVzZXJuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVkZW50aWFscykpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgeworICAgICAgICAgICAgbG9nLmVycm9yKHNtLmdldFN0cmluZygiamFhc1JlYWxtLnVuZXhwZWN0ZWRFcnJvciIpLCBlKTsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiggaXNVc2VDb250ZXh0Q2xhc3NMb2FkZXIoKSkgeworICAgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihvY2wpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYoIGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmRlYnVnKCJMb2dpbiBjb250ZXh0IGNyZWF0ZWQgIiArIHVzZXJuYW1lKTsKKworICAgICAgICAvLyBOZWdvdGlhdGUgYSBsb2dpbiB2aWEgdGhpcyBMb2dpbkNvbnRleHQKKyAgICAgICAgU3ViamVjdCBzdWJqZWN0ID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGxvZ2luQ29udGV4dC5sb2dpbigpOworICAgICAgICAgICAgc3ViamVjdCA9IGxvZ2luQ29udGV4dC5nZXRTdWJqZWN0KCk7CisgICAgICAgICAgICBpZiAoc3ViamVjdCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYoIGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoc20uZ2V0U3RyaW5nKCJqYWFzUmVhbG0uZmFpbGVkTG9naW4iLCB1c2VybmFtZSkpOworICAgICAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEFjY291bnRFeHBpcmVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoc20uZ2V0U3RyaW5nKCJqYWFzUmVhbG0uYWNjb3VudEV4cGlyZWQiLCB1c2VybmFtZSkpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgfSBjYXRjaCAoQ3JlZGVudGlhbEV4cGlyZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhzbS5nZXRTdHJpbmcoImphYXNSZWFsbS5jcmVkZW50aWFsRXhwaXJlZCIsIHVzZXJuYW1lKSk7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICB9IGNhdGNoIChGYWlsZWRMb2dpbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKHNtLmdldFN0cmluZygiamFhc1JlYWxtLmZhaWxlZExvZ2luIiwgdXNlcm5hbWUpKTsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIH0gY2F0Y2ggKExvZ2luRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZy53YXJuKHNtLmdldFN0cmluZygiamFhc1JlYWxtLmxvZ2luRXhjZXB0aW9uIiwgdXNlcm5hbWUpLCBlKTsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CisgICAgICAgICAgICBsb2cuZXJyb3Ioc20uZ2V0U3RyaW5nKCJqYWFzUmVhbG0udW5leHBlY3RlZEVycm9yIiksIGUpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZyhzbS5nZXRTdHJpbmcoImphYXNSZWFsbS5sb2dpbkNvbnRleHRDcmVhdGVkIiwgdXNlcm5hbWUpKTsKKworICAgICAgICAvLyBSZXR1cm4gdGhlIGFwcHJvcHJpYXRlIFByaW5jaXBhbCBmb3IgdGhpcyBhdXRoZW50aWNhdGVkIFN1YmplY3QKKyAgICAgICAgUHJpbmNpcGFsIHByaW5jaXBhbCA9IGNyZWF0ZVByaW5jaXBhbCh1c2VybmFtZSwgc3ViamVjdCk7CisgICAgICAgIGlmIChwcmluY2lwYWwgPT0gbnVsbCkgeworICAgICAgICAgICAgbG9nLmRlYnVnKHNtLmdldFN0cmluZygiamFhc1JlYWxtLmF1dGhlbnRpY2F0ZUZhaWx1cmUiLCB1c2VybmFtZSkpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIGxvZy5kZWJ1ZyhzbS5nZXRTdHJpbmcoImphYXNSZWFsbS5hdXRoZW50aWNhdGVTdWNjZXNzIiwgdXNlcm5hbWUpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAocHJpbmNpcGFsKTsKKyAgICAgICAgfSBjYXRjaCggVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIGxvZy5lcnJvciggImVycm9yICIsIHQpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisgICAgIAorICAgICAvKioKKyAgICAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3BlY2lmaWVkIHVzZXIgPGNvZGU+UHJpbmNpcGFsPC9jb2RlPiBoYXMgdGhlIHNwZWNpZmllZAorICAgICAgKiBzZWN1cml0eSByb2xlLCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgdGhpcyA8Y29kZT5SZWFsbTwvY29kZT47IG90aGVyd2lzZSByZXR1cm4KKyAgICAgICogPGNvZGU+ZmFsc2U8L2NvZGU+LiBUaGlzIHdpbGwgYmUgdHJ1ZSB3aGVuIAorICAgICAgKiBhbiBhc3NvY2lhdGVkIHJvbGUgPGNvZGU+UHJpbmNpcGFsPC9jb2RlPiBjYW4gYmUgZm91bmQgd2hvc2UgPGNvZGU+Z2V0TmFtZTwvY29kZT4KKyAgICAgICogbWV0aG9kIHJldHVybnMgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IGVxdWFsbGluZyB0aGUgc3BlY2lmaWVkIHJvbGUuCisgICAgICAqIEBwYXJhbSBwcmluY2lwYWwgPGNvZGU+UHJpbmNpcGFsPC9jb2RlPiBmb3Igd2hvbSB0aGUgcm9sZSBpcyB0byBiZSBjaGVja2VkCisgICAgICAqIEBwYXJhbSByb2xlIFNlY3VyaXR5IHJvbGUgdG8gYmUgY2hlY2tlZAorICAgICAgKi8KKyAgICAgcHVibGljIGJvb2xlYW4gaGFzUm9sZShQcmluY2lwYWwgcHJpbmNpcGFsLCBTdHJpbmcgcm9sZSkgeworICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgbG9nLmRlYnVnKHNtLmdldFN0cmluZygiamFhc1JlYWxtLmlzSW5Sb2xlLnN0YXJ0IiwgcHJpbmNpcGFsLmdldE5hbWUoKSwgcm9sZSkpOworICAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICBpZiAoKHByaW5jaXBhbCA9PSBudWxsKSB8fCAocm9sZSA9PSBudWxsKSB8fAorICAgICAgICAgICAgIChyb2xlTWFwLmdldChwcmluY2lwYWwpID09IG51bGwpKSB7CisgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhzbS5nZXRTdHJpbmcoImphYXNSZWFsbS5pc0luUm9sZS5ub1ByaW5jaXBhbE9yUm9sZSIpKTsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICBMaXN0IHJvbGVzID0gKExpc3Qpcm9sZU1hcC5nZXQocHJpbmNpcGFsKTsKKyAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgIGxvZy5kZWJ1ZyhzbS5nZXRTdHJpbmcoImphYXNSZWFsbS5pc0luUm9sZS5wcmluY2lwYWxDYWNoZWQiLCBTdHJpbmcudmFsdWVPZihyb2xlcy5zaXplKCkpKSk7CisgICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSByb2xlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgUHJpbmNpcGFsIHBvc3Nlc3NlZFJvbGUgPSAoUHJpbmNpcGFsKWl0Lm5leHQoKTsKKyAgICAgICAgICAgICBTdHJpbmcgcG9zc2Vzc2VkUm9sZU5hbWUgPSBwb3NzZXNzZWRSb2xlLmdldE5hbWUoKTsKKyAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKHNtLmdldFN0cmluZygiamFhc1JlYWxtLmlzSW5Sb2xlLnBvc3Nlc3Nlc1JvbGUiLCBwb3NzZXNzZWRSb2xlLmdldE5hbWUoKSkpOworICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAKKyAgICAgICAgICAgICBpZiAocG9zc2Vzc2VkUm9sZU5hbWUuZXF1YWxzKHJvbGUpKSB7CisgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKHNtLmdldFN0cmluZygiamFhc1JlYWxtLmlzSW5Sb2xlLm1hdGNoIikpOworICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgIGxvZy5kZWJ1ZyhzbS5nZXRTdHJpbmcoImphYXNSZWFsbS5pc0luUm9sZS5ub01hdGNoIikpOworICAgICAgICAgfQorICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQYWNrYWdlIE1ldGhvZHMKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3RlY3RlZCBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIHNob3J0IG5hbWUgZm9yIHRoaXMgPGNvZGU+UmVhbG08L2NvZGU+IGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0TmFtZSgpIHsKKworICAgICAgICByZXR1cm4gKG5hbWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHBhc3N3b3JkIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gcHJpbmNpcGFsJ3MgdXNlciBuYW1lLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UGFzc3dvcmQoU3RyaW5nIHVzZXJuYW1lKSB7CisKKyAgICAgICAgcmV0dXJuIChudWxsKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSA8Y29kZT5QcmluY2lwYWw8L2NvZGU+IGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gdXNlciBuYW1lLgorICAgICAqLworICAgIHByb3RlY3RlZCBQcmluY2lwYWwgZ2V0UHJpbmNpcGFsKFN0cmluZyB1c2VybmFtZSkgeworCisgICAgICAgIHJldHVybiAobnVsbCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIElkZW50aWZ5IGFuZCByZXR1cm4gYSA8Y29kZT5qYXZhLnNlY3VyaXR5LlByaW5jaXBhbDwvY29kZT4gaW5zdGFuY2UKKyAgICAgKiByZXByZXNlbnRpbmcgdGhlIGF1dGhlbnRpY2F0ZWQgdXNlciBmb3IgdGhlIHNwZWNpZmllZCA8Y29kZT5TdWJqZWN0PC9jb2RlPi4KKyAgICAgKiBUaGUgUHJpbmNpcGFsIGlzIGNvbnN0cnVjdGVkIGJ5IHNjYW5uaW5nIHRoZSBsaXN0IG9mIFByaW5jaXBhbHMgcmV0dXJuZWQKKyAgICAgKiBieSB0aGUgSkFBU0xvZ2luTW9kdWxlLiBUaGUgZmlyc3QgPGNvZGU+UHJpbmNpcGFsPC9jb2RlPiBvYmplY3QgdGhhdCBtYXRjaGVzCisgICAgICogb25lIG9mIHRoZSBjbGFzcyBuYW1lcyBzdXBwbGllZCBhcyBhICJ1c2VyIGNsYXNzIiBpcyB0aGUgdXNlciBQcmluY2lwYWwuCisgICAgICogVGhpcyBvYmplY3QgaXMgcmV0dXJuZWQgdG8gdGhhIGNhbGxlci4KKyAgICAgKiBBbnkgcmVtYWluaW5nIHByaW5jaXBhbCBvYmplY3RzIHJldHVybmVkIGJ5IHRoZSBMb2dpbk1vZHVsZXMgYXJlIG1hcHBlZCB0byAgCisgICAgICogcm9sZXMsIGJ1dCBvbmx5IGlmIHRoZWlyIHJlc3BlY3RpdmUgY2xhc3NlcyBtYXRjaCBvbmUgb2YgdGhlICJyb2xlIGNsYXNzIiBjbGFzc2VzLiAKKyAgICAgKiBJZiBhIHVzZXIgUHJpbmNpcGFsIGNhbm5vdCBiZSBjb25zdHJ1Y3RlZCwgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSBzdWJqZWN0IFRoZSA8Y29kZT5TdWJqZWN0PC9jb2RlPiByZXByZXNlbnRpbmcgdGhlIGxvZ2dlZC1pbiB1c2VyCisgICAgICovCisgICAgcHJvdGVjdGVkIFByaW5jaXBhbCBjcmVhdGVQcmluY2lwYWwoU3RyaW5nIHVzZXJuYW1lLCBTdWJqZWN0IHN1YmplY3QpIHsKKyAgICAgICAgLy8gUHJlcGFyZSB0byBzY2FuIHRoZSBQcmluY2lwYWxzIGZvciB0aGlzIFN1YmplY3QKKyAgICAgICAgU3RyaW5nIHBhc3N3b3JkID0gbnVsbDsgLy8gV2lsbCBub3QgYmUgY2FycmllZCBmb3J3YXJkCisKKyAgICAgICAgTGlzdCByb2xlcyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgUHJpbmNpcGFsIHVzZXJQcmluY2lwYWwgPSBudWxsOworCisgICAgICAgIC8vIFNjYW4gdGhlIFByaW5jaXBhbHMgZm9yIHRoaXMgU3ViamVjdAorICAgICAgICBJdGVyYXRvciBwcmluY2lwYWxzID0gc3ViamVjdC5nZXRQcmluY2lwYWxzKCkuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKHByaW5jaXBhbHMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBQcmluY2lwYWwgcHJpbmNpcGFsID0gKFByaW5jaXBhbCkgcHJpbmNpcGFscy5uZXh0KCk7CisKKyAgICAgICAgICAgIFN0cmluZyBwcmluY2lwYWxDbGFzcyA9IHByaW5jaXBhbC5nZXRDbGFzcygpLmdldE5hbWUoKTsKKworICAgICAgICAgICAgaWYoIGxvZy5pc0RlYnVnRW5hYmxlZCgpICkgeworICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhzbS5nZXRTdHJpbmcoImphYXNSZWFsbS5jaGVja1ByaW5jaXBhbCIsIHByaW5jaXBhbCwgcHJpbmNpcGFsQ2xhc3MpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHVzZXJQcmluY2lwYWwgPT0gbnVsbCAmJiB1c2VyQ2xhc3Nlcy5jb250YWlucyhwcmluY2lwYWxDbGFzcykpIHsKKyAgICAgICAgICAgICAgICB1c2VyUHJpbmNpcGFsID0gcHJpbmNpcGFsOworICAgICAgICAgICAgICAgIGlmKCBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSApIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKHNtLmdldFN0cmluZygiamFhc1JlYWxtLnVzZXJQcmluY2lwYWxTdWNjZXNzIiwgcHJpbmNpcGFsLmdldE5hbWUoKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKHJvbGVDbGFzc2VzLmNvbnRhaW5zKHByaW5jaXBhbENsYXNzKSkgeworICAgICAgICAgICAgICAgIHJvbGVzLmFkZChwcmluY2lwYWwpOworICAgICAgICAgICAgICAgIGlmKCBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSApIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKHNtLmdldFN0cmluZygiamFhc1JlYWxtLnJvbGVQcmluY2lwYWxBZGQiLCBwcmluY2lwYWwuZ2V0TmFtZSgpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gUHJpbnQgZmFpbHVyZSBtZXNzYWdlIGlmIG5lZWRlZAorICAgICAgICBpZiAodXNlclByaW5jaXBhbCA9PSBudWxsKSB7CisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoc20uZ2V0U3RyaW5nKCJqYWFzUmVhbG0udXNlclByaW5jaXBhbEZhaWx1cmUiKSk7CisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKHNtLmdldFN0cmluZygiamFhc1JlYWxtLnJvbGVQcmluY2lwYWxGYWlsdXJlIikpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHJvbGVzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhzbS5nZXRTdHJpbmcoImphYXNSZWFsbS5yb2xlUHJpbmNpcGFsRmFpbHVyZSIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJvbGVNYXAucHV0KHVzZXJQcmluY2lwYWwsIHJvbGVzKTsKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKHNtLmdldFN0cmluZygiamFhc1JlYWxtLnJvbGVQcmluY2lwYWxTdWNjZXNzIiwgU3RyaW5nLnZhbHVlT2Yocm9sZXMuc2l6ZSgpKSkpOworICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoc20uZ2V0U3RyaW5nKCJqYWFzUmVhbG0uY2FjaGVQcmluY2lwYWwiLCB1c2VyUHJpbmNpcGFsLmdldE5hbWUoKSwgU3RyaW5nLnZhbHVlT2Yocm9sZXMuc2l6ZSgpKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFJldHVybiB0aGUgcmVzdWx0aW5nIFByaW5jaXBhbCBmb3Igb3VyIGF1dGhlbnRpY2F0ZWQgdXNlcgorICAgICAgICByZXR1cm4gdXNlclByaW5jaXBhbDsKKyAgICB9CisKKyAgICAgLyoqCisgICAgICAqIEVuc3VyZSB0aGUgZ2l2ZW4gbmFtZSBpcyBsZWdhbCBmb3IgSkFBUyBjb25maWd1cmF0aW9uLgorICAgICAgKiBBZGRlZCBmb3IgQnVnemlsbGEgMzA4NjksIG1hZGUgcHJvdGVjdGVkIGZvciBlYXN5IGN1c3RvbWl6YXRpb24KKyAgICAgICogaW4gY2FzZSBteSBpbXBsZW1lbnRhdGlvbiBpcyBpbnN1ZmZpY2llbnQsIHdoaWNoIEkgdGhpbmsgaXMKKyAgICAgICogdmVyeSBsaWtlbHkuCisgICAgICAqCisgICAgICAqIEBwYXJhbSBzcmMgVGhlIG5hbWUgdG8gdmFsaWRhdGUKKyAgICAgICogQHJldHVybiBBIHN0cmluZyB0aGF0J3MgYSB2YWxpZCBKQUFTIHJlYWxtIG5hbWUKKyAgICAgICovCisgICAgIHByb3RlY3RlZCBTdHJpbmcgbWFrZUxlZ2FsRm9ySkFBUyhmaW5hbCBTdHJpbmcgc3JjKSB7CisgICAgICAgICBTdHJpbmcgcmVzdWx0ID0gc3JjOworICAgICAgICAgCisgICAgICAgICAvLyBEZWZhdWx0IG5hbWUgaXMgIm90aGVyIiBwZXIgSkFBUyBzcGVjCisgICAgICAgICBpZihyZXN1bHQgPT0gbnVsbCkgeworICAgICAgICAgICAgIHJlc3VsdCA9ICJvdGhlciI7CisgICAgICAgICB9CisKKyAgICAgICAgIC8vIFN0cmlwIGxlYWRpbmcgc2xhc2ggaWYgcHJlc2VudCwgYXMgU3VuIEpBQVMgaW1wbAorICAgICAgICAgLy8gYmFyZnMgb24gaXQgKHNlZSBCdWd6aWxsYSAzMDg2OSBidWcgcmVwb3J0KS4KKyAgICAgICAgIGlmKHJlc3VsdC5zdGFydHNXaXRoKCIvIikpIHsKKyAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQuc3Vic3RyaW5nKDEpOworICAgICAgICAgfQorCisgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBMaWZlY3ljbGUgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKgorICAgICAqIFByZXBhcmUgZm9yIGFjdGl2ZSB1c2Ugb2YgdGhlIHB1YmxpYyBtZXRob2RzIG9mIHRoaXMgPGNvZGU+Q29tcG9uZW50PC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTGlmZWN5Y2xlRXhjZXB0aW9uIGlmIHRoaXMgY29tcG9uZW50IGRldGVjdHMgYSBmYXRhbCBlcnJvcgorICAgICAqICB0aGF0IHByZXZlbnRzIGl0IGZyb20gYmVpbmcgc3RhcnRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgdGhyb3dzIExpZmVjeWNsZUV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gUGVyZm9ybSBub3JtYWwgc3VwZXJjbGFzcyBpbml0aWFsaXphdGlvbgorICAgICAgICBzdXBlci5zdGFydCgpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHcmFjZWZ1bGx5IHNodXQgZG93biBhY3RpdmUgdXNlIG9mIHRoZSBwdWJsaWMgbWV0aG9kcyBvZiB0aGlzIDxjb2RlPkNvbXBvbmVudDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIExpZmVjeWNsZUV4Y2VwdGlvbiBpZiB0aGlzIGNvbXBvbmVudCBkZXRlY3RzIGEgZmF0YWwgZXJyb3IKKyAgICAgKiAgdGhhdCBuZWVkcyB0byBiZSByZXBvcnRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB0aHJvd3MgTGlmZWN5Y2xlRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBQZXJmb3JtIG5vcm1hbCBzdXBlcmNsYXNzIGZpbmFsaXphdGlvbgorICAgICAgICBzdXBlci5zdG9wKCk7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3JlYWxtL0pEQkNSZWFsbS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3JlYWxtL0pEQkNSZWFsbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2YmYzZWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvcmVhbG0vSkRCQ1JlYWxtLmphdmEKQEAgLTAsMCArMSw2OTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEucmVhbG07CisKKworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsOworaW1wb3J0IGphdmEuc3FsLkNvbm5lY3Rpb247CitpbXBvcnQgamF2YS5zcWwuRHJpdmVyOworaW1wb3J0IGphdmEuc3FsLlByZXBhcmVkU3RhdGVtZW50OworaW1wb3J0IGphdmEuc3FsLlJlc3VsdFNldDsKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5TdHJpbmdNYW5hZ2VyOworCisKKy8qKgorKgorKiBJbXBsbWVudGF0aW9uIG9mIDxiPlJlYWxtPC9iPiB0aGF0IHdvcmtzIHdpdGggYW55IEpEQkMgc3VwcG9ydGVkIGRhdGFiYXNlLgorKiBTZWUgdGhlIEpEQkNSZWFsbS5ob3d0byBmb3IgbW9yZSBkZXRhaWxzIG9uIGhvdyB0byBzZXQgdXAgdGhlIGRhdGFiYXNlIGFuZAorKiBmb3IgY29uZmlndXJhdGlvbiBvcHRpb25zLgorKgorKiA8cD48c3Ryb25nPlRPRE88L3N0cm9uZz4gLSBTdXBwb3J0IGNvbm5lY3Rpb24gcG9vbGluZyAoaW5jbHVkaW5nIG1lc3NhZ2UKKyogZm9ybWF0IG9iamVjdHMpIHNvIHRoYXQgPGNvZGU+YXV0aGVudGljYXRlKCk8L2NvZGU+IGRvZXMgbm90IGhhdmUgdG8gYmUKKyogc3luY2hyb25pemVkIGFuZCB3b3VsZCBmaXggdGhlIHVnbHkgY29ubmVjdGlvbiBsb2dpYy4gPC9wPgorKgorKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyogQGF1dGhvciBDYXJzb24gTWNEb25hbGQKKyogQGF1dGhvciBJZ25hY2lvIE9ydGVnYQorKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorKi8KKworcHVibGljIGNsYXNzIEpEQkNSZWFsbQorICAgIGV4dGVuZHMgUmVhbG1CYXNlIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBjb25uZWN0aW9uIHVzZXJuYW1lIHRvIHVzZSB3aGVuIHRyeWluZyB0byBjb25uZWN0IHRvIHRoZSBkYXRhYmFzZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGNvbm5lY3Rpb25OYW1lID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIGNvbm5lY3Rpb24gVVJMIHRvIHVzZSB3aGVuIHRyeWluZyB0byBjb25uZWN0IHRvIHRoZSBkYXRhYmFzZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGNvbm5lY3Rpb25QYXNzd29yZCA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBjb25uZWN0aW9uIFVSTCB0byB1c2Ugd2hlbiB0cnlpbmcgdG8gY29ubmVjdCB0byB0aGUgZGF0YWJhc2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBjb25uZWN0aW9uVVJMID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIGNvbm5lY3Rpb24gdG8gdGhlIGRhdGFiYXNlLgorICAgICAqLworICAgIHByb3RlY3RlZCBDb25uZWN0aW9uIGRiQ29ubmVjdGlvbiA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIEluc3RhbmNlIG9mIHRoZSBKREJDIERyaXZlciBjbGFzcyB3ZSB1c2UgYXMgYSBjb25uZWN0aW9uIGZhY3RvcnkuCisgICAgICovCisgICAgcHJvdGVjdGVkIERyaXZlciBkcml2ZXIgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgSkRCQyBkcml2ZXIgdG8gdXNlLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZHJpdmVyTmFtZSA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIERlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgUmVhbG0gaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgaW5mbyA9CisgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtLkpEQkNSZWFsbS8xLjAiOworCisKKyAgICAvKioKKyAgICAgKiBEZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIFJlYWxtIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIG5hbWUgPSAiSkRCQ1JlYWxtIjsKKworCisgICAgLyoqCisgICAgICogVGhlIFByZXBhcmVkU3RhdGVtZW50IHRvIHVzZSBmb3IgYXV0aGVudGljYXRpbmcgdXNlcnMuCisgICAgICovCisgICAgcHJvdGVjdGVkIFByZXBhcmVkU3RhdGVtZW50IHByZXBhcmVkQ3JlZGVudGlhbHMgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgUHJlcGFyZWRTdGF0ZW1lbnQgdG8gdXNlIGZvciBpZGVudGlmeWluZyB0aGUgcm9sZXMgZm9yCisgICAgICogYSBzcGVjaWZpZWQgdXNlci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUHJlcGFyZWRTdGF0ZW1lbnQgcHJlcGFyZWRSb2xlcyA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBjb2x1bW4gaW4gdGhlIHVzZXIgcm9sZSB0YWJsZSB0aGF0IG5hbWVzIGEgcm9sZQorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgcm9sZU5hbWVDb2wgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc3RyaW5nIG1hbmFnZXIgZm9yIHRoaXMgcGFja2FnZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZ01hbmFnZXIgc20gPQorICAgICAgICBTdHJpbmdNYW5hZ2VyLmdldE1hbmFnZXIoQ29uc3RhbnRzLlBhY2thZ2UpOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgY29sdW1uIGluIHRoZSB1c2VyIHRhYmxlIHRoYXQgaG9sZHMgdGhlIHVzZXIncyBjcmVkaW50aWFscworICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgdXNlckNyZWRDb2wgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgY29sdW1uIGluIHRoZSB1c2VyIHRhYmxlIHRoYXQgaG9sZHMgdGhlIHVzZXIncyBuYW1lCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyB1c2VyTmFtZUNvbCA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSB0YWJsZSB0aGF0IGhvbGRzIHRoZSByZWxhdGlvbiBiZXR3ZWVuIHVzZXIncyBhbmQgcm9sZXMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHVzZXJSb2xlVGFibGUgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgdGFibGUgdGhhdCBob2xkcyB1c2VyIGRhdGEuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyB1c2VyVGFibGUgPSBudWxsOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdXNlcm5hbWUgdG8gdXNlIHRvIGNvbm5lY3QgdG8gdGhlIGRhdGFiYXNlLgorICAgICAqCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDb25uZWN0aW9uTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb25OYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdXNlcm5hbWUgdG8gdXNlIHRvIGNvbm5lY3QgdG8gdGhlIGRhdGFiYXNlLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25OYW1lIFVzZXJuYW1lCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29ubmVjdGlvbk5hbWUoU3RyaW5nIGNvbm5lY3Rpb25OYW1lKSB7CisgICAgICAgIHRoaXMuY29ubmVjdGlvbk5hbWUgPSBjb25uZWN0aW9uTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHBhc3N3b3JkIHRvIHVzZSB0byBjb25uZWN0IHRvIHRoZSBkYXRhYmFzZS4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29ubmVjdGlvblBhc3N3b3JkKCkgeworICAgICAgICByZXR1cm4gY29ubmVjdGlvblBhc3N3b3JkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcGFzc3dvcmQgdG8gdXNlIHRvIGNvbm5lY3QgdG8gdGhlIGRhdGFiYXNlLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25QYXNzd29yZCBVc2VyIHBhc3N3b3JkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29ubmVjdGlvblBhc3N3b3JkKFN0cmluZyBjb25uZWN0aW9uUGFzc3dvcmQpIHsKKyAgICAgICAgdGhpcy5jb25uZWN0aW9uUGFzc3dvcmQgPSBjb25uZWN0aW9uUGFzc3dvcmQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBVUkwgdG8gdXNlIHRvIGNvbm5lY3QgdG8gdGhlIGRhdGFiYXNlLgorICAgICAqCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDb25uZWN0aW9uVVJMKCkgeworICAgICAgICByZXR1cm4gY29ubmVjdGlvblVSTDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIFVSTCB0byB1c2UgdG8gY29ubmVjdCB0byB0aGUgZGF0YWJhc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvblVSTCBUaGUgbmV3IGNvbm5lY3Rpb24gVVJMCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29ubmVjdGlvblVSTCggU3RyaW5nIGNvbm5lY3Rpb25VUkwgKSB7CisgICAgICB0aGlzLmNvbm5lY3Rpb25VUkwgPSBjb25uZWN0aW9uVVJMOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgSkRCQyBkcml2ZXIgdGhhdCB3aWxsIGJlIHVzZWQuCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldERyaXZlck5hbWUoKSB7CisgICAgICAgIHJldHVybiBkcml2ZXJOYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgSkRCQyBkcml2ZXIgdGhhdCB3aWxsIGJlIHVzZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZHJpdmVyTmFtZSBUaGUgZHJpdmVyIG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREcml2ZXJOYW1lKCBTdHJpbmcgZHJpdmVyTmFtZSApIHsKKyAgICAgIHRoaXMuZHJpdmVyTmFtZSA9IGRyaXZlck5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjb2x1bW4gaW4gdGhlIHVzZXIgcm9sZSB0YWJsZSB0aGF0IG5hbWVzIGEgcm9sZS4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Um9sZU5hbWVDb2woKSB7CisgICAgICAgIHJldHVybiByb2xlTmFtZUNvbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNvbHVtbiBpbiB0aGUgdXNlciByb2xlIHRhYmxlIHRoYXQgbmFtZXMgYSByb2xlLgorICAgICAqCisgICAgICogQHBhcmFtIHJvbGVOYW1lQ29sIFRoZSBjb2x1bW4gbmFtZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJvbGVOYW1lQ29sKCBTdHJpbmcgcm9sZU5hbWVDb2wgKSB7CisgICAgICAgIHRoaXMucm9sZU5hbWVDb2wgPSByb2xlTmFtZUNvbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGNvbHVtbiBpbiB0aGUgdXNlciB0YWJsZSB0aGF0IGhvbGRzIHRoZSB1c2VyJ3MgY3JlZGVudGlhbHMuCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFVzZXJDcmVkQ29sKCkgeworICAgICAgICByZXR1cm4gdXNlckNyZWRDb2w7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjb2x1bW4gaW4gdGhlIHVzZXIgdGFibGUgdGhhdCBob2xkcyB0aGUgdXNlcidzIGNyZWRlbnRpYWxzLgorICAgICAqCisgICAgICogQHBhcmFtIHVzZXJDcmVkQ29sIFRoZSBjb2x1bW4gbmFtZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVzZXJDcmVkQ29sKCBTdHJpbmcgdXNlckNyZWRDb2wgKSB7CisgICAgICAgdGhpcy51c2VyQ3JlZENvbCA9IHVzZXJDcmVkQ29sOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY29sdW1uIGluIHRoZSB1c2VyIHRhYmxlIHRoYXQgaG9sZHMgdGhlIHVzZXIncyBuYW1lLgorICAgICAqCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRVc2VyTmFtZUNvbCgpIHsKKyAgICAgICAgcmV0dXJuIHVzZXJOYW1lQ29sOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY29sdW1uIGluIHRoZSB1c2VyIHRhYmxlIHRoYXQgaG9sZHMgdGhlIHVzZXIncyBuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIHVzZXJOYW1lQ29sIFRoZSBjb2x1bW4gbmFtZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVzZXJOYW1lQ29sKCBTdHJpbmcgdXNlck5hbWVDb2wgKSB7CisgICAgICAgdGhpcy51c2VyTmFtZUNvbCA9IHVzZXJOYW1lQ29sOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdGFibGUgdGhhdCBob2xkcyB0aGUgcmVsYXRpb24gYmV0d2VlbiB1c2VyJ3MgYW5kIHJvbGVzLgorICAgICAqCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRVc2VyUm9sZVRhYmxlKCkgeworICAgICAgICByZXR1cm4gdXNlclJvbGVUYWJsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHRhYmxlIHRoYXQgaG9sZHMgdGhlIHJlbGF0aW9uIGJldHdlZW4gdXNlcidzIGFuZCByb2xlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1c2VyUm9sZVRhYmxlIFRoZSB0YWJsZSBuYW1lCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VXNlclJvbGVUYWJsZSggU3RyaW5nIHVzZXJSb2xlVGFibGUgKSB7CisgICAgICAgIHRoaXMudXNlclJvbGVUYWJsZSA9IHVzZXJSb2xlVGFibGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB0YWJsZSB0aGF0IGhvbGRzIHVzZXIgZGF0YS4uCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFVzZXJUYWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIHVzZXJUYWJsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHRhYmxlIHRoYXQgaG9sZHMgdXNlciBkYXRhLgorICAgICAqCisgICAgICogQHBhcmFtIHVzZXJUYWJsZSBUaGUgdGFibGUgbmFtZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVzZXJUYWJsZSggU3RyaW5nIHVzZXJUYWJsZSApIHsKKyAgICAgIHRoaXMudXNlclRhYmxlID0gdXNlclRhYmxlOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgUHJpbmNpcGFsIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIHVzZXJuYW1lIGFuZAorICAgICAqIGNyZWRlbnRpYWxzLCBpZiB0aGVyZSBpcyBvbmU7IG90aGVyd2lzZSByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBJZiB0aGVyZSBhcmUgYW55IGVycm9ycyB3aXRoIHRoZSBKREJDIGNvbm5lY3Rpb24sIGV4ZWN1dGluZworICAgICAqIHRoZSBxdWVyeSBvciBhbnl0aGluZyB3ZSByZXR1cm4gbnVsbCAoZG9uJ3QgYXV0aGVudGljYXRlKS4gVGhpcworICAgICAqIGV2ZW50IGlzIGFsc28gbG9nZ2VkLCBhbmQgdGhlIGNvbm5lY3Rpb24gd2lsbCBiZSBjbG9zZWQgc28gdGhhdAorICAgICAqIGEgc3Vic2VxdWVudCByZXF1ZXN0IHdpbGwgYXV0b21hdGljYWxseSByZS1vcGVuIGl0LgorICAgICAqCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXNlcm5hbWUgVXNlcm5hbWUgb2YgdGhlIFByaW5jaXBhbCB0byBsb29rIHVwCisgICAgICogQHBhcmFtIGNyZWRlbnRpYWxzIFBhc3N3b3JkIG9yIG90aGVyIGNyZWRlbnRpYWxzIHRvIHVzZSBpbgorICAgICAqICBhdXRoZW50aWNhdGluZyB0aGlzIHVzZXJuYW1lCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBQcmluY2lwYWwgYXV0aGVudGljYXRlKFN0cmluZyB1c2VybmFtZSwgU3RyaW5nIGNyZWRlbnRpYWxzKSB7CisKKyAgICAgICAgLy8gTnVtYmVyIG9mIHRyaWVzIGlzIHRoZSBudW1lYnIgb2YgYXR0ZW1wdHMgdG8gY29ubmVjdCB0byB0aGUgZGF0YWJhc2UKKyAgICAgICAgLy8gZHVyaW5nIHRoaXMgbG9naW4gYXR0ZW1wdCAoaWYgd2UgbmVlZCB0byBvcGVuIHRoZSBkYXRhYmFzZSkKKyAgICAgICAgLy8gVGhpcyBuZWVkcyByZXdyaXR0ZW4gd3V0aCBiZXR0ZXIgcG9vbGluZyBzdXBwb3J0LCB0aGUgZXhpc3RpbmcgY29kZQorICAgICAgICAvLyBuZWVkcyBzaWduYXR1cmUgY2hhbmdlcyBzaW5jZSB0aGUgUHJlcGFyZWQgc3RhdGVtZW50cyBuZWVkcyBjYWNoZWQKKyAgICAgICAgLy8gd2l0aCB0aGUgY29ubmVjdGlvbnMuCisgICAgICAgIC8vIFRoZSBjb2RlIGJlbG93IHdpbGwgdHJ5IHR3aWNlIGlmIHRoZXJlIGlzIGEgU1FMRXhjZXB0aW9uIHNvIHRoZQorICAgICAgICAvLyBjb25uZWN0aW9uIG1heSB0cnkgdG8gYmUgb3BlbmVkIGFnYWluLiBPbiBub3JtYWwgY29uZGl0aW9ucyAoaW5jbHVkaW5nCisgICAgICAgIC8vIGludmFsaWQgbG9naW4gLSB0aGUgYWJvdmUgaXMgb25seSB1c2VkIG9uY2UuCisgICAgICAgIGludCBudW1iZXJPZlRyaWVzID0gMjsKKyAgICAgICAgd2hpbGUgKG51bWJlck9mVHJpZXM+MCkgeworICAgICAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgICAgIC8vIEVuc3VyZSB0aGF0IHdlIGhhdmUgYW4gb3BlbiBkYXRhYmFzZSBjb25uZWN0aW9uCisgICAgICAgICAgICAgICAgb3BlbigpOworCisgICAgICAgICAgICAgICAgLy8gQWNxdWlyZSBhIFByaW5jaXBhbCBvYmplY3QgZm9yIHRoaXMgdXNlcgorICAgICAgICAgICAgICAgIFByaW5jaXBhbCBwcmluY2lwYWwgPSBhdXRoZW50aWNhdGUoZGJDb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcm5hbWUsIGNyZWRlbnRpYWxzKTsKKworCisgICAgICAgICAgICAgICAgLy8gUmV0dXJuIHRoZSBQcmluY2lwYWwgKGlmIGFueSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKHByaW5jaXBhbCk7CisKKyAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKSB7CisKKyAgICAgICAgICAgICAgICAvLyBMb2cgdGhlIHByb2JsZW0gZm9yIHBvc3Rlcml0eQorICAgICAgICAgICAgICAgIGNvbnRhaW5lci5nZXRMb2dnZXIoKS5lcnJvcihzbS5nZXRTdHJpbmcoImpkYmNSZWFsbS5leGNlcHRpb24iKSwgZSk7CisKKyAgICAgICAgICAgICAgICAvLyBDbG9zZSB0aGUgY29ubmVjdGlvbiBzbyB0aGF0IGl0IGdldHMgcmVvcGVuZWQgbmV4dCB0aW1lCisgICAgICAgICAgICAgICAgaWYgKGRiQ29ubmVjdGlvbiAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBjbG9zZShkYkNvbm5lY3Rpb24pOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG51bWJlck9mVHJpZXMtLTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFdvcnN0IGNhc2Ugc2NlbmFyaW8KKyAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBhY2thZ2UgTWV0aG9kcworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvdGVjdGVkIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBQcmluY2lwYWwgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgdXNlcm5hbWUgYW5kCisgICAgICogY3JlZGVudGlhbHMsIGlmIHRoZXJlIGlzIG9uZTsgb3RoZXJ3aXNlIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkYkNvbm5lY3Rpb24gVGhlIGRhdGFiYXNlIGNvbm5lY3Rpb24gdG8gYmUgdXNlZAorICAgICAqIEBwYXJhbSB1c2VybmFtZSBVc2VybmFtZSBvZiB0aGUgUHJpbmNpcGFsIHRvIGxvb2sgdXAKKyAgICAgKiBAcGFyYW0gY3JlZGVudGlhbHMgUGFzc3dvcmQgb3Igb3RoZXIgY3JlZGVudGlhbHMgdG8gdXNlIGluCisgICAgICogIGF1dGhlbnRpY2F0aW5nIHRoaXMgdXNlcm5hbWUKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gU1FMRXhjZXB0aW9uIGlmIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBQcmluY2lwYWwgYXV0aGVudGljYXRlKENvbm5lY3Rpb24gZGJDb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdXNlcm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjcmVkZW50aWFscykKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gTG9vayB1cCB0aGUgdXNlcidzIGNyZWRlbnRpYWxzCisgICAgICAgIFN0cmluZyBkYkNyZWRlbnRpYWxzID0gbnVsbDsKKyAgICAgICAgUHJlcGFyZWRTdGF0ZW1lbnQgc3RtdCA9IG51bGw7CisgICAgICAgIFJlc3VsdFNldCBycyA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN0bXQgPSBjcmVkZW50aWFscyhkYkNvbm5lY3Rpb24sIHVzZXJuYW1lKTsKKyAgICAgICAgICAgIHJzID0gc3RtdC5leGVjdXRlUXVlcnkoKTsKKworICAgICAgICAgICAgaWYgKHJzLm5leHQoKSkgeworICAgICAgICAgICAgICAgIGRiQ3JlZGVudGlhbHMgPSBycy5nZXRTdHJpbmcoMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBycy5jbG9zZSgpOworICAgICAgICAgICAgcnMgPSBudWxsOworICAgICAgICAgICAgaWYgKGRiQ3JlZGVudGlhbHMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRiQ3JlZGVudGlhbHMgPSBkYkNyZWRlbnRpYWxzLnRyaW0oKTsKKworCisgICAgICAgICAgICAvLyBWYWxpZGF0ZSB0aGUgdXNlcidzIGNyZWRlbnRpYWxzCisgICAgICAgICAgICBib29sZWFuIHZhbGlkYXRlZCA9IGZhbHNlOworICAgICAgICAgICAgaWYgKGhhc01lc3NhZ2VEaWdlc3QoKSkgeworICAgICAgICAgICAgICAgIC8vIEhleCBoYXNoZXMgc2hvdWxkIGJlIGNvbXBhcmVkIGNhc2UtaW5zZW5zaXRpdmUKKyAgICAgICAgICAgICAgICB2YWxpZGF0ZWQgPSAoZGlnZXN0KGNyZWRlbnRpYWxzKS5lcXVhbHNJZ25vcmVDYXNlKGRiQ3JlZGVudGlhbHMpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdmFsaWRhdGVkID0gKGRpZ2VzdChjcmVkZW50aWFscykuZXF1YWxzKGRiQ3JlZGVudGlhbHMpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHZhbGlkYXRlZCkgeworICAgICAgICAgICAgICAgIGlmIChjb250YWluZXIuZ2V0TG9nZ2VyKCkuaXNUcmFjZUVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLmdldExvZ2dlcigpLnRyYWNlKHNtLmdldFN0cmluZygiamRiY1JlYWxtLmF1dGhlbnRpY2F0ZVN1Y2Nlc3MiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJuYW1lKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChjb250YWluZXIuZ2V0TG9nZ2VyKCkuaXNUcmFjZUVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLmdldExvZ2dlcigpLnRyYWNlKHNtLmdldFN0cmluZygiamRiY1JlYWxtLmF1dGhlbnRpY2F0ZUZhaWx1cmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJuYW1lKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQWNjdW11bGF0ZSB0aGUgdXNlcidzIHJvbGVzCisgICAgICAgICAgICBBcnJheUxpc3Qgcm9sZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgICAgICBzdG10ID0gcm9sZXMoZGJDb25uZWN0aW9uLCB1c2VybmFtZSk7CisgICAgICAgICAgICBycyA9IHN0bXQuZXhlY3V0ZVF1ZXJ5KCk7CisgICAgICAgICAgICB3aGlsZSAocnMubmV4dCgpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHJvbGUgPSBycy5nZXRTdHJpbmcoMSk7CisgICAgICAgICAgICAgICAgaWYgKG51bGwhPXJvbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgcm9sZUxpc3QuYWRkKHJvbGUudHJpbSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBycy5jbG9zZSgpOworICAgICAgICAgICAgcnMgPSBudWxsOworCisgICAgICAgICAgICAvLyBDcmVhdGUgYW5kIHJldHVybiBhIHN1aXRhYmxlIFByaW5jaXBhbCBmb3IgdGhpcyB1c2VyCisgICAgICAgICAgICByZXR1cm4gKG5ldyBHZW5lcmljUHJpbmNpcGFsKHRoaXMsIHVzZXJuYW1lLCBjcmVkZW50aWFscywgcm9sZUxpc3QpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChycyE9bnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHJzLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaChTUUxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBjb250YWluZXIuZ2V0TG9nZ2VyKCkud2FybihzbS5nZXRTdHJpbmcoImpkYmNSZWFsbS5hYm5vcm1hbENsb3NlUmVzdWx0U2V0IikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRiQ29ubmVjdGlvbi5jb21taXQoKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDbG9zZSB0aGUgc3BlY2lmaWVkIGRhdGFiYXNlIGNvbm5lY3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGJDb25uZWN0aW9uIFRoZSBjb25uZWN0aW9uIHRvIGJlIGNsb3NlZAorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGNsb3NlKENvbm5lY3Rpb24gZGJDb25uZWN0aW9uKSB7CisKKyAgICAgICAgLy8gRG8gbm90aGluZyBpZiB0aGUgZGF0YWJhc2UgY29ubmVjdGlvbiBpcyBhbHJlYWR5IGNsb3NlZAorICAgICAgICBpZiAoZGJDb25uZWN0aW9uID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgLy8gQ2xvc2Ugb3VyIHByZXBhcmVkIHN0YXRlbWVudHMgKGlmIGFueSkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByZXBhcmVkQ3JlZGVudGlhbHMuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGYpIHsKKyAgICAgICAgICAgIDsKKyAgICAgICAgfQorICAgICAgICB0aGlzLnByZXBhcmVkQ3JlZGVudGlhbHMgPSBudWxsOworCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByZXBhcmVkUm9sZXMuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGYpIHsKKyAgICAgICAgICAgIDsKKyAgICAgICAgfQorICAgICAgICB0aGlzLnByZXBhcmVkUm9sZXMgPSBudWxsOworCisKKyAgICAgICAgLy8gQ2xvc2UgdGhpcyBkYXRhYmFzZSBjb25uZWN0aW9uLCBhbmQgbG9nIGFueSBlcnJvcnMKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGRiQ29ubmVjdGlvbi5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgY29udGFpbmVyLmdldExvZ2dlcigpLndhcm4oc20uZ2V0U3RyaW5nKCJqZGJjUmVhbG0uY2xvc2UiKSwgZSk7IC8vIEp1c3QgbG9nIGl0IGhlcmUKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgdGhpcy5kYkNvbm5lY3Rpb24gPSBudWxsOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIFByZXBhcmVkU3RhdGVtZW50IGNvbmZpZ3VyZWQgdG8gcGVyZm9ybSB0aGUgU0VMRUNUIHJlcXVpcmVkCisgICAgICogdG8gcmV0cmlldmUgdXNlciBjcmVkZW50aWFscyBmb3IgdGhlIHNwZWNpZmllZCB1c2VybmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkYkNvbm5lY3Rpb24gVGhlIGRhdGFiYXNlIGNvbm5lY3Rpb24gdG8gYmUgdXNlZAorICAgICAqIEBwYXJhbSB1c2VybmFtZSBVc2VybmFtZSBmb3Igd2hpY2ggY3JlZGVudGlhbHMgc2hvdWxkIGJlIHJldHJpZXZlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBTUUxFeGNlcHRpb24gaWYgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUHJlcGFyZWRTdGF0ZW1lbnQgY3JlZGVudGlhbHMoQ29ubmVjdGlvbiBkYkNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB1c2VybmFtZSkKKyAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKHByZXBhcmVkQ3JlZGVudGlhbHMgPT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiU0VMRUNUICIpOworICAgICAgICAgICAgc2IuYXBwZW5kKHVzZXJDcmVkQ29sKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiIEZST00gIik7CisgICAgICAgICAgICBzYi5hcHBlbmQodXNlclRhYmxlKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiIFdIRVJFICIpOworICAgICAgICAgICAgc2IuYXBwZW5kKHVzZXJOYW1lQ29sKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiID0gPyIpOworICAgICAgICAgICAgcHJlcGFyZWRDcmVkZW50aWFscyA9CisgICAgICAgICAgICAgICAgZGJDb25uZWN0aW9uLnByZXBhcmVTdGF0ZW1lbnQoc2IudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAodXNlcm5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgcHJlcGFyZWRDcmVkZW50aWFscy5zZXROdWxsKDEsamF2YS5zcWwuVHlwZXMuVkFSQ0hBUik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmVwYXJlZENyZWRlbnRpYWxzLnNldFN0cmluZygxLCB1c2VybmFtZSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKHByZXBhcmVkQ3JlZGVudGlhbHMpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgc2hvcnQgbmFtZSBmb3IgdGhpcyBSZWFsbSBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldE5hbWUoKSB7CisKKyAgICAgICAgcmV0dXJuIChuYW1lKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBwYXNzd29yZCBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHByaW5jaXBhbCdzIHVzZXIgbmFtZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFBhc3N3b3JkKFN0cmluZyB1c2VybmFtZSkgeworCisgICAgICAgIHJldHVybiAobnVsbCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgUHJpbmNpcGFsIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gdXNlciBuYW1lLgorICAgICAqLworICAgIHByb3RlY3RlZCBQcmluY2lwYWwgZ2V0UHJpbmNpcGFsKFN0cmluZyB1c2VybmFtZSkgeworCisgICAgICAgIHJldHVybiAobnVsbCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIE9wZW4gKGlmIG5lY2Vzc2FyeSkgYW5kIHJldHVybiBhIGRhdGFiYXNlIGNvbm5lY3Rpb24gZm9yIHVzZSBieQorICAgICAqIHRoaXMgUmVhbG0uCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIFNRTEV4Y2VwdGlvbiBpZiBhIGRhdGFiYXNlIGVycm9yIG9jY3VycworICAgICAqLworICAgIHByb3RlY3RlZCBDb25uZWN0aW9uIG9wZW4oKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBEbyBub3RoaW5nIGlmIHRoZXJlIGlzIGEgZGF0YWJhc2UgY29ubmVjdGlvbiBhbHJlYWR5IG9wZW4KKyAgICAgICAgaWYgKGRiQ29ubmVjdGlvbiAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChkYkNvbm5lY3Rpb24pOworCisgICAgICAgIC8vIEluc3RhbnRpYXRlIG91ciBkYXRhYmFzZSBkcml2ZXIgaWYgbmVjZXNzYXJ5CisgICAgICAgIGlmIChkcml2ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBDbGFzcyBjbGF6eiA9IENsYXNzLmZvck5hbWUoZHJpdmVyTmFtZSk7CisgICAgICAgICAgICAgICAgZHJpdmVyID0gKERyaXZlcikgY2xhenoubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNRTEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBPcGVuIGEgbmV3IGNvbm5lY3Rpb24KKyAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgIGlmIChjb25uZWN0aW9uTmFtZSAhPSBudWxsKQorICAgICAgICAgICAgcHJvcHMucHV0KCJ1c2VyIiwgY29ubmVjdGlvbk5hbWUpOworICAgICAgICBpZiAoY29ubmVjdGlvblBhc3N3b3JkICE9IG51bGwpCisgICAgICAgICAgICBwcm9wcy5wdXQoInBhc3N3b3JkIiwgY29ubmVjdGlvblBhc3N3b3JkKTsKKyAgICAgICAgZGJDb25uZWN0aW9uID0gZHJpdmVyLmNvbm5lY3QoY29ubmVjdGlvblVSTCwgcHJvcHMpOworICAgICAgICBkYkNvbm5lY3Rpb24uc2V0QXV0b0NvbW1pdChmYWxzZSk7CisgICAgICAgIHJldHVybiAoZGJDb25uZWN0aW9uKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVsZWFzZSBvdXIgdXNlIG9mIHRoaXMgY29ubmVjdGlvbiBzbyB0aGF0IGl0IGNhbiBiZSByZWN5Y2xlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkYkNvbm5lY3Rpb24gVGhlIGNvbm5lY3Rpb24gdG8gYmUgcmVsZWFzZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCByZWxlYXNlKENvbm5lY3Rpb24gZGJDb25uZWN0aW9uKSB7CisKKyAgICAgICAgOyAvLyBOTy1PUCBzaW5jZSB3ZSBhcmUgbm90IHBvb2xpbmcgYW55dGhpbmcKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgUHJlcGFyZWRTdGF0ZW1lbnQgY29uZmlndXJlZCB0byBwZXJmb3JtIHRoZSBTRUxFQ1QgcmVxdWlyZWQKKyAgICAgKiB0byByZXRyaWV2ZSB1c2VyIHJvbGVzIGZvciB0aGUgc3BlY2lmaWVkIHVzZXJuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIGRiQ29ubmVjdGlvbiBUaGUgZGF0YWJhc2UgY29ubmVjdGlvbiB0byBiZSB1c2VkCisgICAgICogQHBhcmFtIHVzZXJuYW1lIFVzZXJuYW1lIGZvciB3aGljaCByb2xlcyBzaG91bGQgYmUgcmV0cmlldmVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIFNRTEV4Y2VwdGlvbiBpZiBhIGRhdGFiYXNlIGVycm9yIG9jY3VycworICAgICAqLworICAgIHByb3RlY3RlZCBQcmVwYXJlZFN0YXRlbWVudCByb2xlcyhDb25uZWN0aW9uIGRiQ29ubmVjdGlvbiwgU3RyaW5nIHVzZXJuYW1lKQorICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAocHJlcGFyZWRSb2xlcyA9PSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCJTRUxFQ1QgIik7CisgICAgICAgICAgICBzYi5hcHBlbmQocm9sZU5hbWVDb2wpOworICAgICAgICAgICAgc2IuYXBwZW5kKCIgRlJPTSAiKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCh1c2VyUm9sZVRhYmxlKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiIFdIRVJFICIpOworICAgICAgICAgICAgc2IuYXBwZW5kKHVzZXJOYW1lQ29sKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiID0gPyIpOworICAgICAgICAgICAgcHJlcGFyZWRSb2xlcyA9CisgICAgICAgICAgICAgICAgZGJDb25uZWN0aW9uLnByZXBhcmVTdGF0ZW1lbnQoc2IudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKworICAgICAgICBwcmVwYXJlZFJvbGVzLnNldFN0cmluZygxLCB1c2VybmFtZSk7CisgICAgICAgIHJldHVybiAocHJlcGFyZWRSb2xlcyk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBMaWZlY3ljbGUgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKgorICAgICAqIFByZXBhcmUgZm9yIGFjdGl2ZSB1c2Ugb2YgdGhlIHB1YmxpYyBtZXRob2RzIG9mIHRoaXMgQ29tcG9uZW50LgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBMaWZlY3ljbGVFeGNlcHRpb24gaWYgdGhpcyBjb21wb25lbnQgZGV0ZWN0cyBhIGZhdGFsIGVycm9yCisgICAgICogIHRoYXQgcHJldmVudHMgaXQgZnJvbSBiZWluZyBzdGFydGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnQoKSB0aHJvd3MgTGlmZWN5Y2xlRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBWYWxpZGF0ZSB0aGF0IHdlIGNhbiBvcGVuIG91ciBjb25uZWN0aW9uIC0gYnV0IGxldCB0b21jYXQKKyAgICAgICAgLy8gc3RhcnR1cCBpbiBjYXNlIHRoZSBkYXRhYmFzZSBpcyB0ZW1wb3JhcmlseSB1bmF2YWlsYWJsZQorICAgICAgICB0cnkgeworICAgICAgICAgICAgb3BlbigpOworICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgY29udGFpbmVyLmdldExvZ2dlcigpLmVycm9yKHNtLmdldFN0cmluZygiamRiY1JlYWxtLm9wZW4iKSwgZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBQZXJmb3JtIG5vcm1hbCBzdXBlcmNsYXNzIGluaXRpYWxpemF0aW9uCisgICAgICAgIHN1cGVyLnN0YXJ0KCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdyYWNlZnVsbHkgc2h1dCBkb3duIGFjdGl2ZSB1c2Ugb2YgdGhlIHB1YmxpYyBtZXRob2RzIG9mIHRoaXMgQ29tcG9uZW50LgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBMaWZlY3ljbGVFeGNlcHRpb24gaWYgdGhpcyBjb21wb25lbnQgZGV0ZWN0cyBhIGZhdGFsIGVycm9yCisgICAgICogIHRoYXQgbmVlZHMgdG8gYmUgcmVwb3J0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdG9wKCkgdGhyb3dzIExpZmVjeWNsZUV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gUGVyZm9ybSBub3JtYWwgc3VwZXJjbGFzcyBmaW5hbGl6YXRpb24KKyAgICAgICAgc3VwZXIuc3RvcCgpOworCisgICAgICAgIC8vIENsb3NlIGFueSBvcGVuIERCIGNvbm5lY3Rpb24KKyAgICAgICAgY2xvc2UodGhpcy5kYkNvbm5lY3Rpb24pOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9yZWFsbS9KTkRJUmVhbG0uamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9yZWFsbS9KTkRJUmVhbG0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTE2MWNlCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3JlYWxtL0pORElSZWFsbS5qYXZhCkBAIC0wLDAgKzEsMTY3NiBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LTIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5yZWFsbTsKKworCitpbXBvcnQgamF2YS5zZWN1cml0eS5QcmluY2lwYWw7CitpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgubmFtaW5nLkNvbnRleHQ7CitpbXBvcnQgamF2YXgubmFtaW5nLkNvbW11bmljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgubmFtaW5nLkludmFsaWROYW1lRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1lTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWluZ0VudW1lcmF0aW9uOworaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1pbmdFeGNlcHRpb247CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWVQYXJzZXI7CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWU7CitpbXBvcnQgamF2YXgubmFtaW5nLkF1dGhlbnRpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm5hbWluZy5kaXJlY3RvcnkuQXR0cmlidXRlOworaW1wb3J0IGphdmF4Lm5hbWluZy5kaXJlY3RvcnkuQXR0cmlidXRlczsKK2ltcG9ydCBqYXZheC5uYW1pbmcuZGlyZWN0b3J5LkRpckNvbnRleHQ7CitpbXBvcnQgamF2YXgubmFtaW5nLmRpcmVjdG9yeS5Jbml0aWFsRGlyQ29udGV4dDsKK2ltcG9ydCBqYXZheC5uYW1pbmcuZGlyZWN0b3J5LlNlYXJjaENvbnRyb2xzOworaW1wb3J0IGphdmF4Lm5hbWluZy5kaXJlY3RvcnkuU2VhcmNoUmVzdWx0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5CYXNlNjQ7CisKKworLyoqCisgKiA8cD5JbXBsZW1lbnRhdGlvbiBvZiA8c3Ryb25nPlJlYWxtPC9zdHJvbmc+IHRoYXQgd29ya3Mgd2l0aCBhIGRpcmVjdG9yeQorICogc2VydmVyIGFjY2Vzc2VkIHZpYSB0aGUgSmF2YSBOYW1pbmcgYW5kIERpcmVjdG9yeSBJbnRlcmZhY2UgKEpOREkpIEFQSXMuCisgKiBUaGUgZm9sbG93aW5nIGNvbnN0cmFpbnRzIGFyZSBpbXBvc2VkIG9uIHRoZSBkYXRhIHN0cnVjdHVyZSBpbiB0aGUKKyAqIHVuZGVybHlpbmcgZGlyZWN0b3J5IHNlcnZlcjo8L3A+CisgKiA8dWw+CisgKgorICogPGxpPkVhY2ggdXNlciB0aGF0IGNhbiBiZSBhdXRoZW50aWNhdGVkIGlzIHJlcHJlc2VudGVkIGJ5IGFuIGluZGl2aWR1YWwKKyAqICAgICBlbGVtZW50IGluIHRoZSB0b3AgbGV2ZWwgPGNvZGU+RGlyQ29udGV4dDwvY29kZT4gdGhhdCBpcyBhY2Nlc3NlZAorICogICAgIHZpYSB0aGUgPGNvZGU+Y29ubmVjdGlvblVSTDwvY29kZT4gcHJvcGVydHkuPC9saT4KKyAqCisgKiA8bGk+SWYgYSBzb2NrZXQgY29ubmVjdGlvbiBjYW4gbm90IGJlIG1hZGUgdG8gdGhlIDxjb2RlPmNvbm5lY3RVUkw8L2NvZGU+CisgKiAgICAgYW4gYXR0ZW1wdCB3aWxsIGJlIG1hZGUgdG8gdXNlIHRoZSA8Y29kZT5hbHRlcm5hdGVVUkw8L2NvZGU+IGlmIGl0CisgKiAgICAgZXhpc3RzLjwvbGk+CisgKgorICogPGxpPkVhY2ggdXNlciBlbGVtZW50IGhhcyBhIGRpc3Rpbmd1aXNoZWQgbmFtZSB0aGF0IGNhbiBiZSBmb3JtZWQgYnkKKyAqICAgICBzdWJzdGl0dXRpbmcgdGhlIHByZXNlbnRlZCB1c2VybmFtZSBpbnRvIGEgcGF0dGVybiBjb25maWd1cmVkIGJ5IHRoZQorICogICAgIDxjb2RlPnVzZXJQYXR0ZXJuPC9jb2RlPiBwcm9wZXJ0eS48L2xpPgorICoKKyAqIDxsaT5BbHRlcm5hdGl2ZWx5LCBpZiB0aGUgPGNvZGU+dXNlclBhdHRlcm48L2NvZGU+IHByb3BlcnR5IGlzIG5vdAorICogICAgIHNwZWNpZmllZCwgYSB1bmlxdWUgZWxlbWVudCBjYW4gYmUgbG9jYXRlZCBieSBzZWFyY2hpbmcgdGhlIGRpcmVjdG9yeQorICogICAgIGNvbnRleHQuIEluIHRoaXMgY2FzZToKKyAqICAgICA8dWw+CisgKiAgICAgPGxpPlRoZSA8Y29kZT51c2VyU2VhcmNoPC9jb2RlPiBwYXR0ZXJuIHNwZWNpZmllcyB0aGUgc2VhcmNoIGZpbHRlcgorICogICAgICAgICBhZnRlciBzdWJzdGl0dXRpb24gb2YgdGhlIHVzZXJuYW1lLjwvbGk+CisgKiAgICAgPGxpPlRoZSA8Y29kZT51c2VyQmFzZTwvY29kZT4gcHJvcGVydHkgY2FuIGJlIHNldCB0byB0aGUgZWxlbWVudCB0aGF0CisgKiAgICAgICAgIGlzIHRoZSBiYXNlIG9mIHRoZSBzdWJ0cmVlIGNvbnRhaW5pbmcgdXNlcnMuICBJZiBub3Qgc3BlY2lmaWVkLAorICogICAgICAgICB0aGUgc2VhcmNoIGJhc2UgaXMgdGhlIHRvcC1sZXZlbCBjb250ZXh0LjwvbGk+CisgKiAgICAgPGxpPlRoZSA8Y29kZT51c2VyU3VidHJlZTwvY29kZT4gcHJvcGVydHkgY2FuIGJlIHNldCB0bworICogICAgICAgICA8Y29kZT50cnVlPC9jb2RlPiBpZiB5b3Ugd2lzaCB0byBzZWFyY2ggdGhlIGVudGlyZSBzdWJ0cmVlIG9mIHRoZQorICogICAgICAgICBkaXJlY3RvcnkgY29udGV4dC4gIFRoZSBkZWZhdWx0IHZhbHVlIG9mIDxjb2RlPmZhbHNlPC9jb2RlPgorICogICAgICAgICByZXF1ZXN0cyBhIHNlYXJjaCBvZiBvbmx5IHRoZSBjdXJyZW50IGxldmVsLjwvbGk+CisgKiAgICA8L3VsPgorICogPC9saT4KKyAqCisgKiA8bGk+VGhlIHVzZXIgbWF5IGJlIGF1dGhlbnRpY2F0ZWQgYnkgYmluZGluZyB0byB0aGUgZGlyZWN0b3J5IHdpdGggdGhlCisgKiAgICAgIHVzZXJuYW1lIGFuZCBwYXNzd29yZCBwcmVzZW50ZWQuIFRoaXMgbWV0aG9kIGlzIHVzZWQgd2hlbiB0aGUKKyAqICAgICAgPGNvZGU+dXNlclBhc3N3b3JkPC9jb2RlPiBwcm9wZXJ0eSBpcyBub3Qgc3BlY2lmaWVkLjwvbGk+CisgKgorICogPGxpPlRoZSB1c2VyIG1heSBiZSBhdXRoZW50aWNhdGVkIGJ5IHJldHJpZXZpbmcgdGhlIHZhbHVlIG9mIGFuIGF0dHJpYnV0ZQorICogICAgIGZyb20gdGhlIGRpcmVjdG9yeSBhbmQgY29tcGFyaW5nIGl0IGV4cGxpY2l0bHkgd2l0aCB0aGUgdmFsdWUgcHJlc2VudGVkCisgKiAgICAgYnkgdGhlIHVzZXIuIFRoaXMgbWV0aG9kIGlzIHVzZWQgd2hlbiB0aGUgPGNvZGU+dXNlclBhc3N3b3JkPC9jb2RlPgorICogICAgIHByb3BlcnR5IGlzIHNwZWNpZmllZCwgaW4gd2hpY2ggY2FzZToKKyAqICAgICA8dWw+CisgKiAgICAgPGxpPlRoZSBlbGVtZW50IGZvciB0aGlzIHVzZXIgbXVzdCBjb250YWluIGFuIGF0dHJpYnV0ZSBuYW1lZCBieSB0aGUKKyAqICAgICAgICAgPGNvZGU+dXNlclBhc3N3b3JkPC9jb2RlPiBwcm9wZXJ0eS4KKyAqICAgICA8bGk+VGhlIHZhbHVlIG9mIHRoZSB1c2VyIHBhc3N3b3JkIGF0dHJpYnV0ZSBpcyBlaXRoZXIgYSBjbGVhcnRleHQKKyAqICAgICAgICAgU3RyaW5nLCBvciB0aGUgcmVzdWx0IG9mIHBhc3NpbmcgYSBjbGVhcnRleHQgU3RyaW5nIHRocm91Z2ggdGhlCisgKiAgICAgICAgIDxjb2RlPlJlYWxtQmFzZS5kaWdlc3QoKTwvY29kZT4gbWV0aG9kICh1c2luZyB0aGUgc3RhbmRhcmQgZGlnZXN0CisgKiAgICAgICAgIHN1cHBvcnQgaW5jbHVkZWQgaW4gPGNvZGU+UmVhbG1CYXNlPC9jb2RlPikuCisgKiAgICAgPGxpPlRoZSB1c2VyIGlzIGNvbnNpZGVyZWQgdG8gYmUgYXV0aGVudGljYXRlZCBpZiB0aGUgcHJlc2VudGVkCisgKiAgICAgICAgIGNyZWRlbnRpYWxzIChhZnRlciBiZWluZyBwYXNzZWQgdGhyb3VnaAorICogICAgICAgICA8Y29kZT5SZWFsbUJhc2UuZGlnZXN0KCk8L2NvZGU+KSBhcmUgZXF1YWwgdG8gdGhlIHJldHJpZXZlZCB2YWx1ZQorICogICAgICAgICBmb3IgdGhlIHVzZXIgcGFzc3dvcmQgYXR0cmlidXRlLjwvbGk+CisgKiAgICAgPC91bD48L2xpPgorICoKKyAqIDxsaT5FYWNoIGdyb3VwIG9mIHVzZXJzIHRoYXQgaGFzIGJlZW4gYXNzaWduZWQgYSBwYXJ0aWN1bGFyIHJvbGUgbWF5IGJlCisgKiAgICAgcmVwcmVzZW50ZWQgYnkgYW4gaW5kaXZpZHVhbCBlbGVtZW50IGluIHRoZSB0b3AgbGV2ZWwKKyAqICAgICA8Y29kZT5EaXJDb250ZXh0PC9jb2RlPiB0aGF0IGlzIGFjY2Vzc2VkIHZpYSB0aGUKKyAqICAgICA8Y29kZT5jb25uZWN0aW9uVVJMPC9jb2RlPiBwcm9wZXJ0eS4gIFRoaXMgZWxlbWVudCBoYXMgdGhlIGZvbGxvd2luZworICogICAgIGNoYXJhY3RlcmlzdGljczoKKyAqICAgICA8dWw+CisgKiAgICAgPGxpPlRoZSBzZXQgb2YgYWxsIHBvc3NpYmxlIGdyb3VwcyBvZiBpbnRlcmVzdCBjYW4gYmUgc2VsZWN0ZWQgYnkgYQorICogICAgICAgICBzZWFyY2ggcGF0dGVybiBjb25maWd1cmVkIGJ5IHRoZSA8Y29kZT5yb2xlU2VhcmNoPC9jb2RlPgorICogICAgICAgICBwcm9wZXJ0eS48L2xpPgorICogICAgIDxsaT5UaGUgPGNvZGU+cm9sZVNlYXJjaDwvY29kZT4gcGF0dGVybiBvcHRpb25hbGx5IGluY2x1ZGVzIHBhdHRlcm4KKyAqICAgICAgICAgcmVwbGFjZW1lbnRzICJ7MH0iIGZvciB0aGUgZGlzdGluZ3Vpc2hlZCBuYW1lLCBhbmQvb3IgInsxfSIgZm9yCisgKiAgICAgICAgIHRoZSB1c2VybmFtZSwgb2YgdGhlIGF1dGhlbnRpY2F0ZWQgdXNlciBmb3Igd2hpY2ggcm9sZXMgd2lsbCBiZQorICogICAgICAgICByZXRyaWV2ZWQuPC9saT4KKyAqICAgICA8bGk+VGhlIDxjb2RlPnJvbGVCYXNlPC9jb2RlPiBwcm9wZXJ0eSBjYW4gYmUgc2V0IHRvIHRoZSBlbGVtZW50IHRoYXQKKyAqICAgICAgICAgaXMgdGhlIGJhc2Ugb2YgdGhlIHNlYXJjaCBmb3IgbWF0Y2hpbmcgcm9sZXMuICBJZiBub3Qgc3BlY2lmaWVkLAorICogICAgICAgICB0aGUgZW50aXJlIGNvbnRleHQgd2lsbCBiZSBzZWFyY2hlZC48L2xpPgorICogICAgIDxsaT5UaGUgPGNvZGU+cm9sZVN1YnRyZWU8L2NvZGU+IHByb3BlcnR5IGNhbiBiZSBzZXQgdG8KKyAqICAgICAgICAgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgeW91IHdpc2ggdG8gc2VhcmNoIHRoZSBlbnRpcmUgc3VidHJlZSBvZiB0aGUKKyAqICAgICAgICAgZGlyZWN0b3J5IGNvbnRleHQuICBUaGUgZGVmYXVsdCB2YWx1ZSBvZiA8Y29kZT5mYWxzZTwvY29kZT4KKyAqICAgICAgICAgcmVxdWVzdHMgYSBzZWFyY2ggb2Ygb25seSB0aGUgY3VycmVudCBsZXZlbC48L2xpPgorICogICAgIDxsaT5UaGUgZWxlbWVudCBpbmNsdWRlcyBhbiBhdHRyaWJ1dGUgKHdob3NlIG5hbWUgaXMgY29uZmlndXJlZCBieQorICogICAgICAgICB0aGUgPGNvZGU+cm9sZU5hbWU8L2NvZGU+IHByb3BlcnR5KSBjb250YWluaW5nIHRoZSBuYW1lIG9mIHRoZQorICogICAgICAgICByb2xlIHJlcHJlc2VudGVkIGJ5IHRoaXMgZWxlbWVudC48L2xpPgorICogICAgIDwvdWw+PC9saT4KKyAqCisgKiA8bGk+SW4gYWRkaXRpb24sIHJvbGVzIG1heSBiZSByZXByZXNlbnRlZCBieSB0aGUgdmFsdWVzIG9mIGFuIGF0dHJpYnV0ZQorICogaW4gdGhlIHVzZXIncyBlbGVtZW50IHdob3NlIG5hbWUgaXMgY29uZmlndXJlZCBieSB0aGUKKyAqIDxjb2RlPnVzZXJSb2xlTmFtZTwvY29kZT4gcHJvcGVydHkuPC9saT4KKyAqCisgKiA8bGk+Tm90ZSB0aGF0IHRoZSBzdGFuZGFyZCA8Y29kZT4mbHQ7c2VjdXJpdHktcm9sZS1yZWYmZ3Q7PC9jb2RlPiBlbGVtZW50IGluCisgKiAgICAgdGhlIHdlYiBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IgYWxsb3dzIGFwcGxpY2F0aW9ucyB0byByZWZlcgorICogICAgIHRvIHJvbGVzIHByb2dyYW1tYXRpY2FsbHkgYnkgbmFtZXMgb3RoZXIgdGhhbiB0aG9zZSB1c2VkIGluIHRoZQorICogICAgIGRpcmVjdG9yeSBzZXJ2ZXIgaXRzZWxmLjwvbGk+CisgKiA8L3VsPgorICoKKyAqIDxwPjxzdHJvbmc+VE9ETzwvc3Ryb25nPiAtIFN1cHBvcnQgY29ubmVjdGlvbiBwb29saW5nIChpbmNsdWRpbmcgbWVzc2FnZQorICogZm9ybWF0IG9iamVjdHMpIHNvIHRoYXQgPGNvZGU+YXV0aGVudGljYXRlKCk8L2NvZGU+IGRvZXMgbm90IGhhdmUgdG8gYmUKKyAqIHN5bmNocm9uaXplZC48L3A+CisgKgorICogPHA+PHN0cm9uZz5XQVJOSU5HPC9zdHJvbmc+IC0gVGhlcmUgaXMgYSByZXBvcnRlZCBidWcgYWdhaW5zdCB0aGUgTmV0c2NhcGUKKyAqIHByb3ZpZGVyIGNvZGUgKGNvbS5uZXRzY2FwZS5qbmRpLmxkYXAuTGRhcENvbnRleHRGYWN0b3J5KSB3aXRoIHJlc3BlY3QgdG8KKyAqIHN1Y2Nlc3NmdWxseSBhdXRoZW50aWNhdGVkIGEgbm9uLWV4aXN0aW5nIHVzZXIuIFRoZQorICogcmVwb3J0IGlzIGhlcmU6IGh0dHA6Ly9uYWdveWEuYXBhY2hlLm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MTEyMTAgLgorICogV2l0aCBsdWNrLCBOZXRzY2FwZSBoYXMgdXBkYXRlZCB0aGVpciBwcm92aWRlciBjb2RlIGFuZCB0aGlzIGlzIG5vdCBhbgorICogaXNzdWUuIDwvcD4KKyAqCisgKiBAYXV0aG9yIEpvaG4gSG9sbWFuCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEpORElSZWFsbSBleHRlbmRzIFJlYWxtQmFzZSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisgICAgLyoqCisgICAgICogIFRoZSB0eXBlIG9mIGF1dGhlbnRpY2F0aW9uIHRvIHVzZQorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgYXV0aGVudGljYXRpb24gPSBudWxsOworCisgICAgLyoqCisgICAgICogVGhlIGNvbm5lY3Rpb24gdXNlcm5hbWUgZm9yIHRoZSBzZXJ2ZXIgd2Ugd2lsbCBjb250YWN0LgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgY29ubmVjdGlvbk5hbWUgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgY29ubmVjdGlvbiBwYXNzd29yZCBmb3IgdGhlIHNlcnZlciB3ZSB3aWxsIGNvbnRhY3QuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBjb25uZWN0aW9uUGFzc3dvcmQgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgY29ubmVjdGlvbiBVUkwgZm9yIHRoZSBzZXJ2ZXIgd2Ugd2lsbCBjb250YWN0LgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgY29ubmVjdGlvblVSTCA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBkaXJlY3RvcnkgY29udGV4dCBsaW5raW5nIHVzIHRvIG91ciBkaXJlY3Rvcnkgc2VydmVyLgorICAgICAqLworICAgIHByb3RlY3RlZCBEaXJDb250ZXh0IGNvbnRleHQgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgSk5ESSBjb250ZXh0IGZhY3RvcnkgdXNlZCB0byBhY3F1aXJlIG91ciBJbml0aWFsQ29udGV4dC4gIEJ5CisgICAgICogZGVmYXVsdCwgYXNzdW1lcyB1c2Ugb2YgYW4gTERBUCBzZXJ2ZXIgdXNpbmcgdGhlIHN0YW5kYXJkIEpOREkgTERBUAorICAgICAqIHByb3ZpZGVyLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgY29udGV4dEZhY3RvcnkgPSAiY29tLnN1bi5qbmRpLmxkYXAuTGRhcEN0eEZhY3RvcnkiOworCisKKyAgICAvKioKKyAgICAgKiBEZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIFJlYWxtIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIGluZm8gPQorICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5yZWFsbS5KTkRJUmVhbG0vMS4wIjsKKworCisgICAgLyoqCisgICAgICogRGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBSZWFsbSBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBuYW1lID0gIkpORElSZWFsbSI7CisKKworICAgIC8qKgorICAgICAqIFRoZSBwcm90b2NvbCB0aGF0IHdpbGwgYmUgdXNlZCBpbiB0aGUgY29tbXVuaWNhdGlvbiB3aXRoIHRoZQorICAgICAqIGRpcmVjdG9yeSBzZXJ2ZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBwcm90b2NvbCA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIEhvdyBzaG91bGQgd2UgaGFuZGxlIHJlZmVycmFscz8gIE1pY3Jvc29mdCBBY3RpdmUgRGlyZWN0b3J5IGNhbid0IGhhbmRsZQorICAgICAqIHRoZSBkZWZhdWx0IGNhc2UsIHNvIGFuIGFwcGxpY2F0aW9uIGF1dGhlbnRpY2F0aW5nIGFnYWluc3QgQUQgbXVzdAorICAgICAqIHNldCByZWZlcnJhbHMgdG8gImZvbGxvdyIuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyByZWZlcnJhbHMgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgYmFzZSBlbGVtZW50IGZvciB1c2VyIHNlYXJjaGVzLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgdXNlckJhc2UgPSAiIjsKKworCisgICAgLyoqCisgICAgICogVGhlIG1lc3NhZ2UgZm9ybWF0IHVzZWQgdG8gc2VhcmNoIGZvciBhIHVzZXIsIHdpdGggInswfSIgbWFya2luZworICAgICAqIHRoZSBzcG90IHdoZXJlIHRoZSB1c2VybmFtZSBnb2VzLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgdXNlclNlYXJjaCA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBNZXNzYWdlRm9ybWF0IG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQKKyAgICAgKiA8Y29kZT51c2VyU2VhcmNoPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTWVzc2FnZUZvcm1hdCB1c2VyU2VhcmNoRm9ybWF0ID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogU2hvdWxkIHdlIHNlYXJjaCB0aGUgZW50aXJlIHN1YnRyZWUgZm9yIG1hdGNoaW5nIHVzZXJzPworICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIHVzZXJTdWJ0cmVlID0gZmFsc2U7CisKKworICAgIC8qKgorICAgICAqIFRoZSBhdHRyaWJ1dGUgbmFtZSB1c2VkIHRvIHJldHJpZXZlIHRoZSB1c2VyIHBhc3N3b3JkLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgdXNlclBhc3N3b3JkID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogQSBzdHJpbmcgb2YgTERBUCB1c2VyIHBhdHRlcm5zIG9yIHBhdGhzLCAiOiItc2VwYXJhdGVkCisgICAgICogVGhlc2Ugd2lsbCBiZSB1c2VkIHRvIGZvcm0gdGhlIGRpc3Rpbmd1aXNoZWQgbmFtZSBvZiBhCisgICAgICogdXNlciwgd2l0aCAiezB9IiBtYXJraW5nIHRoZSBzcG90IHdoZXJlIHRoZSBzcGVjaWZpZWQgdXNlcm5hbWUKKyAgICAgKiBnb2VzLgorICAgICAqIFRoaXMgaXMgc2ltaWxhciB0byB1c2VyUGF0dGVybiwgYnV0IGFsbG93cyBmb3IgbXVsdGlwbGUgc2VhcmNoZXMKKyAgICAgKiBmb3IgYSB1c2VyLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmdbXSB1c2VyUGF0dGVybkFycmF5ID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIG1lc3NhZ2UgZm9ybWF0IHVzZWQgdG8gZm9ybSB0aGUgZGlzdGluZ3Vpc2hlZCBuYW1lIG9mIGEKKyAgICAgKiB1c2VyLCB3aXRoICJ7MH0iIG1hcmtpbmcgdGhlIHNwb3Qgd2hlcmUgdGhlIHNwZWNpZmllZCB1c2VybmFtZQorICAgICAqIGdvZXMuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyB1c2VyUGF0dGVybiA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIEFuIGFycmF5IG9mIE1lc3NhZ2VGb3JtYXQgb2JqZWN0cyBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQKKyAgICAgKiA8Y29kZT51c2VyUGF0dGVybkFycmF5PC9jb2RlPi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTWVzc2FnZUZvcm1hdFtdIHVzZXJQYXR0ZXJuRm9ybWF0QXJyYXkgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgYmFzZSBlbGVtZW50IGZvciByb2xlIHNlYXJjaGVzLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgcm9sZUJhc2UgPSAiIjsKKworCisgICAgLyoqCisgICAgICogVGhlIE1lc3NhZ2VGb3JtYXQgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudAorICAgICAqIDxjb2RlPnJvbGVTZWFyY2g8L2NvZGU+LgorICAgICAqLworICAgIHByb3RlY3RlZCBNZXNzYWdlRm9ybWF0IHJvbGVGb3JtYXQgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgbmFtZSBvZiBhbiBhdHRyaWJ1dGUgaW4gdGhlIHVzZXIncyBlbnRyeSBjb250YWluaW5nCisgICAgICogcm9sZXMgZm9yIHRoYXQgdXNlcgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgdXNlclJvbGVOYW1lID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSBjb250YWluaW5nIHJvbGVzIGhlbGQgZWxzZXdoZXJlCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyByb2xlTmFtZSA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBtZXNzYWdlIGZvcm1hdCB1c2VkIHRvIHNlbGVjdCByb2xlcyBmb3IgYSB1c2VyLCB3aXRoICJ7MH0iIG1hcmtpbmcKKyAgICAgKiB0aGUgc3BvdCB3aGVyZSB0aGUgZGlzdGluZ3Vpc2hlZCBuYW1lIG9mIHRoZSB1c2VyIGdvZXMuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyByb2xlU2VhcmNoID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogU2hvdWxkIHdlIHNlYXJjaCB0aGUgZW50aXJlIHN1YnRyZWUgZm9yIG1hdGNoaW5nIG1lbWJlcnNoaXBzPworICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIHJvbGVTdWJ0cmVlID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBBbiBhbHRlcm5hdGUgVVJMLCB0byB3aGljaCwgd2Ugc2hvdWxkIGNvbm5lY3QgaWYgY29ubmVjdGlvblVSTCBmYWlscy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGFsdGVybmF0ZVVSTDsKKworICAgIC8qKgorICAgICAqIFRoZSBudW1iZXIgb2YgY29ubmVjdGlvbiBhdHRlbXB0cy4gIElmIGdyZWF0ZXIgdGhhbiB6ZXJvIHdlIHVzZSB0aGUKKyAgICAgKiBhbHRlcm5hdGUgdXJsLgorICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgY29ubmVjdGlvbkF0dGVtcHQgPSAwOworCisgICAgLyoqCisgICAgICogVGhlIGN1cnJlbnQgdXNlciBwYXR0ZXJuIHRvIGJlIHVzZWQgZm9yIGxvb2t1cCBhbmQgYmluZGluZyBvZiBhIHVzZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIGludCBjdXJVc2VyUGF0dGVybiA9IDA7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdHlwZSBvZiBhdXRoZW50aWNhdGlvbiB0byB1c2UuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRBdXRoZW50aWNhdGlvbigpIHsKKworICAgICAgICByZXR1cm4gYXV0aGVudGljYXRpb247CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHR5cGUgb2YgYXV0aGVudGljYXRpb24gdG8gdXNlLgorICAgICAqCisgICAgICogQHBhcmFtIGF1dGhlbnRpY2F0aW9uIFRoZSBhdXRoZW50aWNhdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEF1dGhlbnRpY2F0aW9uKFN0cmluZyBhdXRoZW50aWNhdGlvbikgeworCisgICAgICAgIHRoaXMuYXV0aGVudGljYXRpb24gPSBhdXRoZW50aWNhdGlvbjsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY29ubmVjdGlvbiB1c2VybmFtZSBmb3IgdGhpcyBSZWFsbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbm5lY3Rpb25OYW1lKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5jb25uZWN0aW9uTmFtZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY29ubmVjdGlvbiB1c2VybmFtZSBmb3IgdGhpcyBSZWFsbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uTmFtZSBUaGUgbmV3IGNvbm5lY3Rpb24gdXNlcm5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb25uZWN0aW9uTmFtZShTdHJpbmcgY29ubmVjdGlvbk5hbWUpIHsKKworICAgICAgICB0aGlzLmNvbm5lY3Rpb25OYW1lID0gY29ubmVjdGlvbk5hbWU7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY29ubmVjdGlvbiBwYXNzd29yZCBmb3IgdGhpcyBSZWFsbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbm5lY3Rpb25QYXNzd29yZCgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMuY29ubmVjdGlvblBhc3N3b3JkKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjb25uZWN0aW9uIHBhc3N3b3JkIGZvciB0aGlzIFJlYWxtLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25QYXNzd29yZCBUaGUgbmV3IGNvbm5lY3Rpb24gcGFzc3dvcmQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb25uZWN0aW9uUGFzc3dvcmQoU3RyaW5nIGNvbm5lY3Rpb25QYXNzd29yZCkgeworCisgICAgICAgIHRoaXMuY29ubmVjdGlvblBhc3N3b3JkID0gY29ubmVjdGlvblBhc3N3b3JkOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGNvbm5lY3Rpb24gVVJMIGZvciB0aGlzIFJlYWxtLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29ubmVjdGlvblVSTCgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMuY29ubmVjdGlvblVSTCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY29ubmVjdGlvbiBVUkwgZm9yIHRoaXMgUmVhbG0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvblVSTCBUaGUgbmV3IGNvbm5lY3Rpb24gVVJMCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29ubmVjdGlvblVSTChTdHJpbmcgY29ubmVjdGlvblVSTCkgeworCisgICAgICAgIHRoaXMuY29ubmVjdGlvblVSTCA9IGNvbm5lY3Rpb25VUkw7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgSk5ESSBjb250ZXh0IGZhY3RvcnkgZm9yIHRoaXMgUmVhbG0uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDb250ZXh0RmFjdG9yeSgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMuY29udGV4dEZhY3RvcnkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIEpOREkgY29udGV4dCBmYWN0b3J5IGZvciB0aGlzIFJlYWxtLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHRGYWN0b3J5IFRoZSBuZXcgY29udGV4dCBmYWN0b3J5CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29udGV4dEZhY3RvcnkoU3RyaW5nIGNvbnRleHRGYWN0b3J5KSB7CisKKyAgICAgICAgdGhpcy5jb250ZXh0RmFjdG9yeSA9IGNvbnRleHRGYWN0b3J5OworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHByb3RvY29sIHRvIGJlIHVzZWQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRQcm90b2NvbCgpIHsKKworICAgICAgICByZXR1cm4gcHJvdG9jb2w7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHByb3RvY29sIGZvciB0aGlzIFJlYWxtLgorICAgICAqCisgICAgICogQHBhcmFtIHByb3RvY29sIFRoZSBuZXcgcHJvdG9jb2wuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJvdG9jb2woU3RyaW5nIHByb3RvY29sKSB7CisKKyAgICAgICAgdGhpcy5wcm90b2NvbCA9IHByb3RvY29sOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHNldHRpbmdzIGZvciBoYW5kbGluZyBKTkRJIHJlZmVycmFscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlZmVycmFscyAoKSB7CisgICAgICAgIHJldHVybiByZWZlcnJhbHM7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBIb3cgZG8gd2UgaGFuZGxlIEpOREkgcmVmZXJyYWxzPyBpZ25vcmUsIGZvbGxvdywgb3IgdGhyb3cKKyAgICAgKiAoc2VlIGphdmF4Lm5hbWluZy5Db250ZXh0LlJFRkVSUkFMIGZvciBtb3JlIGluZm9ybWF0aW9uKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZWZlcnJhbHMgKFN0cmluZyByZWZlcnJhbHMpIHsKKyAgICAgICAgdGhpcy5yZWZlcnJhbHMgPSByZWZlcnJhbHM7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGJhc2UgZWxlbWVudCBmb3IgdXNlciBzZWFyY2hlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFVzZXJCYXNlKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy51c2VyQmFzZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYmFzZSBlbGVtZW50IGZvciB1c2VyIHNlYXJjaGVzLgorICAgICAqCisgICAgICogQHBhcmFtIHVzZXJCYXNlIFRoZSBuZXcgYmFzZSBlbGVtZW50CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VXNlckJhc2UoU3RyaW5nIHVzZXJCYXNlKSB7CisKKyAgICAgICAgdGhpcy51c2VyQmFzZSA9IHVzZXJCYXNlOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG1lc3NhZ2UgZm9ybWF0IHBhdHRlcm4gZm9yIHNlbGVjdGluZyB1c2VycyBpbiB0aGlzIFJlYWxtLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXNlclNlYXJjaCgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMudXNlclNlYXJjaCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbWVzc2FnZSBmb3JtYXQgcGF0dGVybiBmb3Igc2VsZWN0aW5nIHVzZXJzIGluIHRoaXMgUmVhbG0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXNlclNlYXJjaCBUaGUgbmV3IHVzZXIgc2VhcmNoIHBhdHRlcm4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVc2VyU2VhcmNoKFN0cmluZyB1c2VyU2VhcmNoKSB7CisKKyAgICAgICAgdGhpcy51c2VyU2VhcmNoID0gdXNlclNlYXJjaDsKKyAgICAgICAgaWYgKHVzZXJTZWFyY2ggPT0gbnVsbCkKKyAgICAgICAgICAgIHVzZXJTZWFyY2hGb3JtYXQgPSBudWxsOworICAgICAgICBlbHNlCisgICAgICAgICAgICB1c2VyU2VhcmNoRm9ybWF0ID0gbmV3IE1lc3NhZ2VGb3JtYXQodXNlclNlYXJjaCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgInNlYXJjaCBzdWJ0cmVlIGZvciB1c2VycyIgZmxhZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRVc2VyU3VidHJlZSgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMudXNlclN1YnRyZWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlICJzZWFyY2ggc3VidHJlZSBmb3IgdXNlcnMiIGZsYWcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXNlclN1YnRyZWUgVGhlIG5ldyBzZWFyY2ggZmxhZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVzZXJTdWJ0cmVlKGJvb2xlYW4gdXNlclN1YnRyZWUpIHsKKworICAgICAgICB0aGlzLnVzZXJTdWJ0cmVlID0gdXNlclN1YnRyZWU7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdXNlciByb2xlIG5hbWUgYXR0cmlidXRlIG5hbWUgZm9yIHRoaXMgUmVhbG0uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRVc2VyUm9sZU5hbWUoKSB7CisKKyAgICAgICAgcmV0dXJuIHVzZXJSb2xlTmFtZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdXNlciByb2xlIG5hbWUgYXR0cmlidXRlIG5hbWUgZm9yIHRoaXMgUmVhbG0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXNlclJvbGVOYW1lIFRoZSBuZXcgdXNlclJvbGUgbmFtZSBhdHRyaWJ1dGUgbmFtZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVzZXJSb2xlTmFtZShTdHJpbmcgdXNlclJvbGVOYW1lKSB7CisKKyAgICAgICAgdGhpcy51c2VyUm9sZU5hbWUgPSB1c2VyUm9sZU5hbWU7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgYmFzZSBlbGVtZW50IGZvciByb2xlIHNlYXJjaGVzLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Um9sZUJhc2UoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLnJvbGVCYXNlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBiYXNlIGVsZW1lbnQgZm9yIHJvbGUgc2VhcmNoZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcm9sZUJhc2UgVGhlIG5ldyBiYXNlIGVsZW1lbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSb2xlQmFzZShTdHJpbmcgcm9sZUJhc2UpIHsKKworICAgICAgICB0aGlzLnJvbGVCYXNlID0gcm9sZUJhc2U7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcm9sZSBuYW1lIGF0dHJpYnV0ZSBuYW1lIGZvciB0aGlzIFJlYWxtLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Um9sZU5hbWUoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLnJvbGVOYW1lKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSByb2xlIG5hbWUgYXR0cmlidXRlIG5hbWUgZm9yIHRoaXMgUmVhbG0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcm9sZU5hbWUgVGhlIG5ldyByb2xlIG5hbWUgYXR0cmlidXRlIG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSb2xlTmFtZShTdHJpbmcgcm9sZU5hbWUpIHsKKworICAgICAgICB0aGlzLnJvbGVOYW1lID0gcm9sZU5hbWU7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbWVzc2FnZSBmb3JtYXQgcGF0dGVybiBmb3Igc2VsZWN0aW5nIHJvbGVzIGluIHRoaXMgUmVhbG0uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRSb2xlU2VhcmNoKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5yb2xlU2VhcmNoKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBtZXNzYWdlIGZvcm1hdCBwYXR0ZXJuIGZvciBzZWxlY3Rpbmcgcm9sZXMgaW4gdGhpcyBSZWFsbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByb2xlU2VhcmNoIFRoZSBuZXcgcm9sZSBzZWFyY2ggcGF0dGVybgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJvbGVTZWFyY2goU3RyaW5nIHJvbGVTZWFyY2gpIHsKKworICAgICAgICB0aGlzLnJvbGVTZWFyY2ggPSByb2xlU2VhcmNoOworICAgICAgICBpZiAocm9sZVNlYXJjaCA9PSBudWxsKQorICAgICAgICAgICAgcm9sZUZvcm1hdCA9IG51bGw7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJvbGVGb3JtYXQgPSBuZXcgTWVzc2FnZUZvcm1hdChyb2xlU2VhcmNoKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSAic2VhcmNoIHN1YnRyZWUgZm9yIHJvbGVzIiBmbGFnLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldFJvbGVTdWJ0cmVlKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5yb2xlU3VidHJlZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgInNlYXJjaCBzdWJ0cmVlIGZvciByb2xlcyIgZmxhZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSByb2xlU3VidHJlZSBUaGUgbmV3IHNlYXJjaCBmbGFnCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Um9sZVN1YnRyZWUoYm9vbGVhbiByb2xlU3VidHJlZSkgeworCisgICAgICAgIHRoaXMucm9sZVN1YnRyZWUgPSByb2xlU3VidHJlZTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBwYXNzd29yZCBhdHRyaWJ1dGUgdXNlZCB0byByZXRyaWV2ZSB0aGUgdXNlciBwYXNzd29yZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFVzZXJQYXNzd29yZCgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMudXNlclBhc3N3b3JkKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBwYXNzd29yZCBhdHRyaWJ1dGUgdXNlZCB0byByZXRyaWV2ZSB0aGUgdXNlciBwYXNzd29yZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1c2VyUGFzc3dvcmQgVGhlIG5ldyBwYXNzd29yZCBhdHRyaWJ1dGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVc2VyUGFzc3dvcmQoU3RyaW5nIHVzZXJQYXNzd29yZCkgeworCisgICAgICAgIHRoaXMudXNlclBhc3N3b3JkID0gdXNlclBhc3N3b3JkOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG1lc3NhZ2UgZm9ybWF0IHBhdHRlcm4gZm9yIHNlbGVjdGluZyB1c2VycyBpbiB0aGlzIFJlYWxtLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXNlclBhdHRlcm4oKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLnVzZXJQYXR0ZXJuKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBtZXNzYWdlIGZvcm1hdCBwYXR0ZXJuIGZvciBzZWxlY3RpbmcgdXNlcnMgaW4gdGhpcyBSZWFsbS4KKyAgICAgKiBUaGlzIG1heSBiZSBvbmUgc2ltcGxlIHBhdHRlcm4sIG9yIG11bHRpcGxlIHBhdHRlcm5zIHRvIGJlIHRyaWVkLAorICAgICAqIHNlcGFyYXRlZCBieSBwYXJlbnRoZXNlcy4gKGZvciBleGFtcGxlLCBlaXRoZXIgImNuPXswfSIsIG9yCisgICAgICogIihjbj17MH0pKGNuPXswfSxvPW15b3JnKSIgRnVsbCBMREFQIHNlYXJjaCBzdHJpbmdzIGFyZSBhbHNvIHN1cHBvcnRlZCwKKyAgICAgKiBidXQgb25seSB0aGUgIk9SIiwgInwiIHN5bnRheCwgc28gIih8KGNuPXswfSkoY249ezB9LG89bXlvcmcpKSIgaXMKKyAgICAgKiBhbHNvIHZhbGlkLiBDb21wbGV4IHNlYXJjaCBzdHJpbmdzIHdpdGggJiwgZXRjIGFyZSBOT1Qgc3VwcG9ydGVkLgorICAgICAqCisgICAgICogQHBhcmFtIHVzZXJQYXR0ZXJuIFRoZSBuZXcgdXNlciBwYXR0ZXJuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VXNlclBhdHRlcm4oU3RyaW5nIHVzZXJQYXR0ZXJuKSB7CisKKyAgICAgICAgdGhpcy51c2VyUGF0dGVybiA9IHVzZXJQYXR0ZXJuOworICAgICAgICBpZiAodXNlclBhdHRlcm4gPT0gbnVsbCkKKyAgICAgICAgICAgIHVzZXJQYXR0ZXJuQXJyYXkgPSBudWxsOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHVzZXJQYXR0ZXJuQXJyYXkgPSBwYXJzZVVzZXJQYXR0ZXJuU3RyaW5nKHVzZXJQYXR0ZXJuKTsKKyAgICAgICAgICAgIGludCBsZW4gPSB0aGlzLnVzZXJQYXR0ZXJuQXJyYXkubGVuZ3RoOworICAgICAgICAgICAgdXNlclBhdHRlcm5Gb3JtYXRBcnJheSA9IG5ldyBNZXNzYWdlRm9ybWF0W2xlbl07CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBsZW47IGkrKykgeworICAgICAgICAgICAgICAgIHVzZXJQYXR0ZXJuRm9ybWF0QXJyYXlbaV0gPQorICAgICAgICAgICAgICAgICAgICBuZXcgTWVzc2FnZUZvcm1hdCh1c2VyUGF0dGVybkFycmF5W2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0dGVyIGZvciBwcm9wZXJ0eSBhbHRlcm5hdGVVUkwuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFZhbHVlIG9mIHByb3BlcnR5IGFsdGVybmF0ZVVSTC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEFsdGVybmF0ZVVSTCgpIHsKKworICAgICAgICByZXR1cm4gdGhpcy5hbHRlcm5hdGVVUkw7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldHRlciBmb3IgcHJvcGVydHkgYWx0ZXJuYXRlVVJMLgorICAgICAqCisgICAgICogQHBhcmFtIGFsdGVybmF0ZVVSTCBOZXcgdmFsdWUgb2YgcHJvcGVydHkgYWx0ZXJuYXRlVVJMLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEFsdGVybmF0ZVVSTChTdHJpbmcgYWx0ZXJuYXRlVVJMKSB7CisKKyAgICAgICAgdGhpcy5hbHRlcm5hdGVVUkwgPSBhbHRlcm5hdGVVUkw7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUmVhbG0gTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIFByaW5jaXBhbCBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCB1c2VybmFtZSBhbmQKKyAgICAgKiBjcmVkZW50aWFscywgaWYgdGhlcmUgaXMgb25lOyBvdGhlcndpc2UgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogSWYgdGhlcmUgYXJlIGFueSBlcnJvcnMgd2l0aCB0aGUgSkRCQyBjb25uZWN0aW9uLCBleGVjdXRpbmcKKyAgICAgKiB0aGUgcXVlcnkgb3IgYW55dGhpbmcgd2UgcmV0dXJuIG51bGwgKGRvbid0IGF1dGhlbnRpY2F0ZSkuIFRoaXMKKyAgICAgKiBldmVudCBpcyBhbHNvIGxvZ2dlZCwgYW5kIHRoZSBjb25uZWN0aW9uIHdpbGwgYmUgY2xvc2VkIHNvIHRoYXQKKyAgICAgKiBhIHN1YnNlcXVlbnQgcmVxdWVzdCB3aWxsIGF1dG9tYXRpY2FsbHkgcmUtb3BlbiBpdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1c2VybmFtZSBVc2VybmFtZSBvZiB0aGUgUHJpbmNpcGFsIHRvIGxvb2sgdXAKKyAgICAgKiBAcGFyYW0gY3JlZGVudGlhbHMgUGFzc3dvcmQgb3Igb3RoZXIgY3JlZGVudGlhbHMgdG8gdXNlIGluCisgICAgICogIGF1dGhlbnRpY2F0aW5nIHRoaXMgdXNlcm5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgUHJpbmNpcGFsIGF1dGhlbnRpY2F0ZShTdHJpbmcgdXNlcm5hbWUsIFN0cmluZyBjcmVkZW50aWFscykgeworCisgICAgICAgIERpckNvbnRleHQgY29udGV4dCA9IG51bGw7CisgICAgICAgIFByaW5jaXBhbCBwcmluY2lwYWwgPSBudWxsOworCisgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgIC8vIEVuc3VyZSB0aGF0IHdlIGhhdmUgYSBkaXJlY3RvcnkgY29udGV4dCBhdmFpbGFibGUKKyAgICAgICAgICAgIGNvbnRleHQgPSBvcGVuKCk7CisKKyAgICAgICAgICAgIC8vIE9jY2Fzc2lvbmFsbHkgdGhlIGRpcmVjdG9yeSBjb250ZXh0IHdpbGwgdGltZW91dC4gIFRyeSBvbmUgbW9yZQorICAgICAgICAgICAgLy8gdGltZSBiZWZvcmUgZ2l2aW5nIHVwLgorICAgICAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgICAgIC8vIEF1dGhlbnRpY2F0ZSB0aGUgc3BlY2lmaWVkIHVzZXJuYW1lIGlmIHBvc3NpYmxlCisgICAgICAgICAgICAgICAgcHJpbmNpcGFsID0gYXV0aGVudGljYXRlKGNvbnRleHQsIHVzZXJuYW1lLCBjcmVkZW50aWFscyk7CisKKyAgICAgICAgICAgIH0gY2F0Y2ggKENvbW11bmljYXRpb25FeGNlcHRpb24gZSkgeworCisKKyAgICAgICAgICAgICAgICAvLyBJZiBjb250YWlucyB0aGUgd29yayBjbG9zZWQuIFRoZW4gYXNzdW1lIHNvY2tldCBpcyBjbG9zZWQuCisgICAgICAgICAgICAgICAgLy8gSWYgbWVzc2FnZSBpcyBudWxsLCBhc3N1bWUgdGhlIHdvcnN0IGFuZCBhbGxvdyB0aGUKKyAgICAgICAgICAgICAgICAvLyBjb25uZWN0aW9uIHRvIGJlIGNsb3NlZC4KKyAgICAgICAgICAgICAgICBpZiAoZS5nZXRNZXNzYWdlKCkhPW51bGwgJiYKKyAgICAgICAgICAgICAgICAgICAgZS5nZXRNZXNzYWdlKCkuaW5kZXhPZigiY2xvc2VkIikgPCAwKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyhlKTsKKworICAgICAgICAgICAgICAgIC8vIGxvZyB0aGUgZXhjZXB0aW9uIHNvIHdlIGtub3cgaXQncyB0aGVyZS4KKyAgICAgICAgICAgICAgICBjb250YWluZXIuZ2V0TG9nZ2VyKCkuZXJyb3Ioc20uZ2V0U3RyaW5nKCJqbmRpUmVhbG0uZXhjZXB0aW9uIiksIGUpOworCisgICAgICAgICAgICAgICAgLy8gY2xvc2UgdGhlIGNvbm5lY3Rpb24gc28gd2Uga25vdyBpdCB3aWxsIGJlIHJlb3BlbmVkLgorICAgICAgICAgICAgICAgIGlmIChjb250ZXh0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGNsb3NlKGNvbnRleHQpOworCisgICAgICAgICAgICAgICAgLy8gb3BlbiBhIG5ldyBkaXJlY3RvcnkgY29udGV4dC4KKyAgICAgICAgICAgICAgICBjb250ZXh0ID0gb3BlbigpOworCisgICAgICAgICAgICAgICAgLy8gVHJ5IHRoZSBhdXRoZW50aWNhdGlvbiBhZ2Fpbi4KKyAgICAgICAgICAgICAgICBwcmluY2lwYWwgPSBhdXRoZW50aWNhdGUoY29udGV4dCwgdXNlcm5hbWUsIGNyZWRlbnRpYWxzKTsKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIC8vIFJlbGVhc2UgdGhpcyBjb250ZXh0CisgICAgICAgICAgICByZWxlYXNlKGNvbnRleHQpOworCisgICAgICAgICAgICAvLyBSZXR1cm4gdGhlIGF1dGhlbnRpY2F0ZWQgUHJpbmNpcGFsIChpZiBhbnkpCisgICAgICAgICAgICByZXR1cm4gKHByaW5jaXBhbCk7CisKKyAgICAgICAgfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGUpIHsKKworICAgICAgICAgICAgLy8gTG9nIHRoZSBwcm9ibGVtIGZvciBwb3N0ZXJpdHkKKyAgICAgICAgICAgIGNvbnRhaW5lci5nZXRMb2dnZXIoKS5lcnJvcihzbS5nZXRTdHJpbmcoImpuZGlSZWFsbS5leGNlcHRpb24iKSwgZSk7CisKKyAgICAgICAgICAgIC8vIENsb3NlIHRoZSBjb25uZWN0aW9uIHNvIHRoYXQgaXQgZ2V0cyByZW9wZW5lZCBuZXh0IHRpbWUKKyAgICAgICAgICAgIGlmIChjb250ZXh0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgY2xvc2UoY29udGV4dCk7CisKKyAgICAgICAgICAgIC8vIFJldHVybiAibm90IGF1dGhlbnRpY2F0ZWQiIGZvciB0aGlzIHJlcXVlc3QKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQYWNrYWdlIE1ldGhvZHMKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3RlY3RlZCBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgUHJpbmNpcGFsIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIHVzZXJuYW1lIGFuZAorICAgICAqIGNyZWRlbnRpYWxzLCBpZiB0aGVyZSBpcyBvbmU7IG90aGVyd2lzZSByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgZGlyZWN0b3J5IGNvbnRleHQKKyAgICAgKiBAcGFyYW0gdXNlcm5hbWUgVXNlcm5hbWUgb2YgdGhlIFByaW5jaXBhbCB0byBsb29rIHVwCisgICAgICogQHBhcmFtIGNyZWRlbnRpYWxzIFBhc3N3b3JkIG9yIG90aGVyIGNyZWRlbnRpYWxzIHRvIHVzZSBpbgorICAgICAqICBhdXRoZW50aWNhdGluZyB0aGlzIHVzZXJuYW1lCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIGRpcmVjdG9yeSBzZXJ2ZXIgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBQcmluY2lwYWwgYXV0aGVudGljYXRlKERpckNvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVzZXJuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY3JlZGVudGlhbHMpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworCisgICAgICAgIGlmICh1c2VybmFtZSA9PSBudWxsIHx8IHVzZXJuYW1lLmVxdWFscygiIikKKyAgICAgICAgICAgIHx8IGNyZWRlbnRpYWxzID09IG51bGwgfHwgY3JlZGVudGlhbHMuZXF1YWxzKCIiKSkKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisKKyAgICAgICAgaWYgKHVzZXJQYXR0ZXJuQXJyYXkgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChjdXJVc2VyUGF0dGVybiA9IDA7CisgICAgICAgICAgICAgICAgIGN1clVzZXJQYXR0ZXJuIDwgdXNlclBhdHRlcm5Gb3JtYXRBcnJheS5sZW5ndGg7CisgICAgICAgICAgICAgICAgIGN1clVzZXJQYXR0ZXJuKyspIHsKKyAgICAgICAgICAgICAgICAvLyBSZXRyaWV2ZSB1c2VyIGluZm9ybWF0aW9uCisgICAgICAgICAgICAgICAgVXNlciB1c2VyID0gZ2V0VXNlcihjb250ZXh0LCB1c2VybmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKHVzZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgdGhlIHVzZXIncyBjcmVkZW50aWFscworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoZWNrQ3JlZGVudGlhbHMoY29udGV4dCwgdXNlciwgY3JlZGVudGlhbHMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2VhcmNoIGZvciBhZGRpdGlvbmFsIHJvbGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdCByb2xlcyA9IGdldFJvbGVzKGNvbnRleHQsIHVzZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAobmV3IEdlbmVyaWNQcmluY2lwYWwodGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlZGVudGlhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2xlcykpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnZhbGlkTmFtZUV4Y2VwdGlvbiBpbmUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIExvZyB0aGUgcHJvYmxlbSBmb3IgcG9zdGVyaXR5CisgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXIuZ2V0TG9nZ2VyKCkud2FybihzbS5nZXRTdHJpbmcoImpuZGlSZWFsbS5leGNlcHRpb24iKSwgaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZTsgdGhpcyBpcyBwcm9iYWJseSBkdWUgdG8gYSBuYW1lIG5vdCBmaXR0aW5nCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc2VhcmNoIHBhdGggZm9ybWF0IGV4YWN0bHksIGFzIGluIGEgZnVsbHktCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBxdWFsaWZpZWQgbmFtZSBiZWluZyBtdW5nZWQgaW50byBhIHNlYXJjaCBwYXRoCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGF0IGFscmVhZHkgY29udGFpbnMgY249IG9yIHZpY2UtdmVyc2EKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gUmV0cmlldmUgdXNlciBpbmZvcm1hdGlvbgorICAgICAgICAgICAgVXNlciB1c2VyID0gZ2V0VXNlcihjb250ZXh0LCB1c2VybmFtZSk7CisgICAgICAgICAgICBpZiAodXNlciA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisKKyAgICAgICAgICAgIC8vIENoZWNrIHRoZSB1c2VyJ3MgY3JlZGVudGlhbHMKKyAgICAgICAgICAgIGlmICghY2hlY2tDcmVkZW50aWFscyhjb250ZXh0LCB1c2VyLCBjcmVkZW50aWFscykpCisgICAgICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKworICAgICAgICAgICAgLy8gU2VhcmNoIGZvciBhZGRpdGlvbmFsIHJvbGVzCisgICAgICAgICAgICBMaXN0IHJvbGVzID0gZ2V0Um9sZXMoY29udGV4dCwgdXNlcik7CisKKyAgICAgICAgICAgIC8vIENyZWF0ZSBhbmQgcmV0dXJuIGEgc3VpdGFibGUgUHJpbmNpcGFsIGZvciB0aGlzIHVzZXIKKyAgICAgICAgICAgIHJldHVybiAobmV3IEdlbmVyaWNQcmluY2lwYWwodGhpcywgdXNlcm5hbWUsIGNyZWRlbnRpYWxzLCByb2xlcykpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBVc2VyIG9iamVjdCBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSB1c2VyCisgICAgICogd2l0aCB0aGUgc3BlY2lmaWVkIHVzZXJuYW1lLCBpZiBmb3VuZCBpbiB0aGUgZGlyZWN0b3J5OworICAgICAqIG90aGVyd2lzZSByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBJZiB0aGUgPGNvZGU+dXNlclBhc3N3b3JkPC9jb2RlPiBjb25maWd1cmF0aW9uIGF0dHJpYnV0ZSBpcworICAgICAqIHNwZWNpZmllZCwgdGhlIHZhbHVlIG9mIHRoYXQgYXR0cmlidXRlIGlzIHJldHJpZXZlZCBmcm9tIHRoZQorICAgICAqIHVzZXIncyBkaXJlY3RvcnkgZW50cnkuIElmIHRoZSA8Y29kZT51c2VyUm9sZU5hbWU8L2NvZGU+CisgICAgICogY29uZmlndXJhdGlvbiBhdHRyaWJ1dGUgaXMgc3BlY2lmaWVkLCBhbGwgdmFsdWVzIG9mIHRoYXQKKyAgICAgKiBhdHRyaWJ1dGUgYXJlIHJldHJpZXZlZCBmcm9tIHRoZSBkaXJlY3RvcnkgZW50cnkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgZGlyZWN0b3J5IGNvbnRleHQKKyAgICAgKiBAcGFyYW0gdXNlcm5hbWUgVXNlcm5hbWUgdG8gYmUgbG9va2VkIHVwCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIGRpcmVjdG9yeSBzZXJ2ZXIgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHJvdGVjdGVkIFVzZXIgZ2V0VXNlcihEaXJDb250ZXh0IGNvbnRleHQsIFN0cmluZyB1c2VybmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisKKyAgICAgICAgVXNlciB1c2VyID0gbnVsbDsKKworICAgICAgICAvLyBHZXQgYXR0cmlidXRlcyB0byByZXRyaWV2ZSBmcm9tIHVzZXIgZW50cnkKKyAgICAgICAgQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIGlmICh1c2VyUGFzc3dvcmQgIT0gbnVsbCkKKyAgICAgICAgICAgIGxpc3QuYWRkKHVzZXJQYXNzd29yZCk7CisgICAgICAgIGlmICh1c2VyUm9sZU5hbWUgIT0gbnVsbCkKKyAgICAgICAgICAgIGxpc3QuYWRkKHVzZXJSb2xlTmFtZSk7CisgICAgICAgIFN0cmluZ1tdIGF0dHJJZHMgPSBuZXcgU3RyaW5nW2xpc3Quc2l6ZSgpXTsKKyAgICAgICAgbGlzdC50b0FycmF5KGF0dHJJZHMpOworCisgICAgICAgIC8vIFVzZSBwYXR0ZXJuIG9yIHNlYXJjaCBmb3IgdXNlciBlbnRyeQorICAgICAgICBpZiAodXNlclBhdHRlcm5Gb3JtYXRBcnJheSAhPSBudWxsKSB7CisgICAgICAgICAgICB1c2VyID0gZ2V0VXNlckJ5UGF0dGVybihjb250ZXh0LCB1c2VybmFtZSwgYXR0cklkcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1c2VyID0gZ2V0VXNlckJ5U2VhcmNoKGNvbnRleHQsIHVzZXJuYW1lLCBhdHRySWRzKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB1c2VyOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVXNlIHRoZSA8Y29kZT5Vc2VyUGF0dGVybjwvY29kZT4gY29uZmlndXJhdGlvbiBhdHRyaWJ1dGUgdG8KKyAgICAgKiBsb2NhdGUgdGhlIGRpcmVjdG9yeSBlbnRyeSBmb3IgdGhlIHVzZXIgd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgICogdXNlcm5hbWUgYW5kIHJldHVybiBhIFVzZXIgb2JqZWN0OyBvdGhlcndpc2UgcmV0dXJuCisgICAgICogPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgZGlyZWN0b3J5IGNvbnRleHQKKyAgICAgKiBAcGFyYW0gdXNlcm5hbWUgVGhlIHVzZXJuYW1lCisgICAgICogQHBhcmFtIGF0dHJJZHMgU3RyaW5nW11jb250YWluaW5nIG5hbWVzIG9mIGF0dHJpYnV0ZXMgdG8KKyAgICAgKiByZXRyaWV2ZS4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgZGlyZWN0b3J5IHNlcnZlciBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgVXNlciBnZXRVc2VyQnlQYXR0ZXJuKERpckNvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdXNlcm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gYXR0cklkcykKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKHVzZXJuYW1lID09IG51bGwgfHwgdXNlclBhdHRlcm5Gb3JtYXRBcnJheVtjdXJVc2VyUGF0dGVybl0gPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisKKyAgICAgICAgLy8gRm9ybSB0aGUgZG4gZnJvbSB0aGUgdXNlciBwYXR0ZXJuCisgICAgICAgIFN0cmluZyBkbiA9IHVzZXJQYXR0ZXJuRm9ybWF0QXJyYXlbY3VyVXNlclBhdHRlcm5dLmZvcm1hdChuZXcgU3RyaW5nW10geyB1c2VybmFtZSB9KTsKKworICAgICAgICAvLyBSZXR1cm4gaWYgbm8gYXR0cmlidXRlcyB0byByZXRyaWV2ZQorICAgICAgICBpZiAoYXR0cklkcyA9PSBudWxsIHx8IGF0dHJJZHMubGVuZ3RoID09IDApCisgICAgICAgICAgICByZXR1cm4gbmV3IFVzZXIodXNlcm5hbWUsIGRuLCBudWxsLCBudWxsKTsKKworICAgICAgICAvLyBHZXQgcmVxdWlyZWQgYXR0cmlidXRlcyBmcm9tIHVzZXIgZW50cnkKKyAgICAgICAgQXR0cmlidXRlcyBhdHRycyA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhdHRycyA9IGNvbnRleHQuZ2V0QXR0cmlidXRlcyhkbiwgYXR0cklkcyk7CisgICAgICAgIH0gY2F0Y2ggKE5hbWVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICB9CisgICAgICAgIGlmIChhdHRycyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKworICAgICAgICAvLyBSZXRyaWV2ZSB2YWx1ZSBvZiB1c2VyUGFzc3dvcmQKKyAgICAgICAgU3RyaW5nIHBhc3N3b3JkID0gbnVsbDsKKyAgICAgICAgaWYgKHVzZXJQYXNzd29yZCAhPSBudWxsKQorICAgICAgICAgICAgcGFzc3dvcmQgPSBnZXRBdHRyaWJ1dGVWYWx1ZSh1c2VyUGFzc3dvcmQsIGF0dHJzKTsKKworICAgICAgICAvLyBSZXRyaWV2ZSB2YWx1ZXMgb2YgdXNlclJvbGVOYW1lIGF0dHJpYnV0ZQorICAgICAgICBBcnJheUxpc3Qgcm9sZXMgPSBudWxsOworICAgICAgICBpZiAodXNlclJvbGVOYW1lICE9IG51bGwpCisgICAgICAgICAgICByb2xlcyA9IGFkZEF0dHJpYnV0ZVZhbHVlcyh1c2VyUm9sZU5hbWUsIGF0dHJzLCByb2xlcyk7CisKKyAgICAgICAgcmV0dXJuIG5ldyBVc2VyKHVzZXJuYW1lLCBkbiwgcGFzc3dvcmQsIHJvbGVzKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNlYXJjaCB0aGUgZGlyZWN0b3J5IHRvIHJldHVybiBhIFVzZXIgb2JqZWN0IGNvbnRhaW5pbmcKKyAgICAgKiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdXNlciB3aXRoIHRoZSBzcGVjaWZpZWQgdXNlcm5hbWUsIGlmCisgICAgICogZm91bmQgaW4gdGhlIGRpcmVjdG9yeTsgb3RoZXJ3aXNlIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBkaXJlY3RvcnkgY29udGV4dAorICAgICAqIEBwYXJhbSB1c2VybmFtZSBUaGUgdXNlcm5hbWUKKyAgICAgKiBAcGFyYW0gYXR0cklkcyBTdHJpbmdbXWNvbnRhaW5pbmcgbmFtZXMgb2YgYXR0cmlidXRlcyB0byByZXRyaWV2ZS4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgZGlyZWN0b3J5IHNlcnZlciBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgVXNlciBnZXRVc2VyQnlTZWFyY2goRGlyQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB1c2VybmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBhdHRySWRzKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAodXNlcm5hbWUgPT0gbnVsbCB8fCB1c2VyU2VhcmNoRm9ybWF0ID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworCisgICAgICAgIC8vIEZvcm0gdGhlIHNlYXJjaCBmaWx0ZXIKKyAgICAgICAgU3RyaW5nIGZpbHRlciA9IHVzZXJTZWFyY2hGb3JtYXQuZm9ybWF0KG5ldyBTdHJpbmdbXSB7IHVzZXJuYW1lIH0pOworCisgICAgICAgIC8vIFNldCB1cCB0aGUgc2VhcmNoIGNvbnRyb2xzCisgICAgICAgIFNlYXJjaENvbnRyb2xzIGNvbnN0cmFpbnRzID0gbmV3IFNlYXJjaENvbnRyb2xzKCk7CisKKyAgICAgICAgaWYgKHVzZXJTdWJ0cmVlKSB7CisgICAgICAgICAgICBjb25zdHJhaW50cy5zZXRTZWFyY2hTY29wZShTZWFyY2hDb250cm9scy5TVUJUUkVFX1NDT1BFKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGNvbnN0cmFpbnRzLnNldFNlYXJjaFNjb3BlKFNlYXJjaENvbnRyb2xzLk9ORUxFVkVMX1NDT1BFKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFNwZWNpZnkgdGhlIGF0dHJpYnV0ZXMgdG8gYmUgcmV0cmlldmVkCisgICAgICAgIGlmIChhdHRySWRzID09IG51bGwpCisgICAgICAgICAgICBhdHRySWRzID0gbmV3IFN0cmluZ1swXTsKKyAgICAgICAgY29uc3RyYWludHMuc2V0UmV0dXJuaW5nQXR0cmlidXRlcyhhdHRySWRzKTsKKworICAgICAgICBOYW1pbmdFbnVtZXJhdGlvbiByZXN1bHRzID0KKyAgICAgICAgICAgIGNvbnRleHQuc2VhcmNoKHVzZXJCYXNlLCBmaWx0ZXIsIGNvbnN0cmFpbnRzKTsKKworCisgICAgICAgIC8vIEZhaWwgaWYgbm8gZW50cmllcyBmb3VuZAorICAgICAgICBpZiAocmVzdWx0cyA9PSBudWxsIHx8ICFyZXN1bHRzLmhhc01vcmUoKSkgeworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEdldCByZXN1bHQgZm9yIHRoZSBmaXJzdCBlbnRyeSBmb3VuZAorICAgICAgICBTZWFyY2hSZXN1bHQgcmVzdWx0ID0gKFNlYXJjaFJlc3VsdClyZXN1bHRzLm5leHQoKTsKKworICAgICAgICAvLyBDaGVjayBubyBmdXJ0aGVyIGVudHJpZXMgd2VyZSBmb3VuZAorICAgICAgICBpZiAocmVzdWx0cy5oYXNNb3JlKCkpIHsKKyAgICAgICAgICAgIGNvbnRhaW5lci5nZXRMb2dnZXIoKS5pbmZvKCJ1c2VybmFtZSAiICsgdXNlcm5hbWUgKyAiIGhhcyBtdWx0aXBsZSBlbnRyaWVzIik7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgLy8gR2V0IHRoZSBlbnRyeSdzIGRpc3Rpbmd1aXNoZWQgbmFtZQorICAgICAgICBOYW1lUGFyc2VyIHBhcnNlciA9IGNvbnRleHQuZ2V0TmFtZVBhcnNlcigiIik7CisgICAgICAgIE5hbWUgY29udGV4dE5hbWUgPSBwYXJzZXIucGFyc2UoY29udGV4dC5nZXROYW1lSW5OYW1lc3BhY2UoKSk7CisgICAgICAgIE5hbWUgYmFzZU5hbWUgPSBwYXJzZXIucGFyc2UodXNlckJhc2UpOworICAgICAgICBOYW1lIGVudHJ5TmFtZSA9IHBhcnNlci5wYXJzZShyZXN1bHQuZ2V0TmFtZSgpKTsKKyAgICAgICAgTmFtZSBuYW1lID0gY29udGV4dE5hbWUuYWRkQWxsKGJhc2VOYW1lKTsKKyAgICAgICAgbmFtZSA9IG5hbWUuYWRkQWxsKGVudHJ5TmFtZSk7CisgICAgICAgIFN0cmluZyBkbiA9IG5hbWUudG9TdHJpbmcoKTsKKworICAgICAgICBpZiAoY29udGFpbmVyLmdldExvZ2dlcigpLmlzVHJhY2VFbmFibGVkKCkpCisgICAgICAgICAgICBjb250YWluZXIuZ2V0TG9nZ2VyKCkudHJhY2UoIiAgZW50cnkgZm91bmQgZm9yICIgKyB1c2VybmFtZSArICIgd2l0aCBkbiAiICsgZG4pOworCisgICAgICAgIC8vIEdldCB0aGUgZW50cnkncyBhdHRyaWJ1dGVzCisgICAgICAgIEF0dHJpYnV0ZXMgYXR0cnMgPSByZXN1bHQuZ2V0QXR0cmlidXRlcygpOworICAgICAgICBpZiAoYXR0cnMgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIC8vIFJldHJpZXZlIHZhbHVlIG9mIHVzZXJQYXNzd29yZAorICAgICAgICBTdHJpbmcgcGFzc3dvcmQgPSBudWxsOworICAgICAgICBpZiAodXNlclBhc3N3b3JkICE9IG51bGwpCisgICAgICAgICAgICBwYXNzd29yZCA9IGdldEF0dHJpYnV0ZVZhbHVlKHVzZXJQYXNzd29yZCwgYXR0cnMpOworCisgICAgICAgIC8vIFJldHJpZXZlIHZhbHVlcyBvZiB1c2VyUm9sZU5hbWUgYXR0cmlidXRlCisgICAgICAgIEFycmF5TGlzdCByb2xlcyA9IG51bGw7CisgICAgICAgIGlmICh1c2VyUm9sZU5hbWUgIT0gbnVsbCkKKyAgICAgICAgICAgIHJvbGVzID0gYWRkQXR0cmlidXRlVmFsdWVzKHVzZXJSb2xlTmFtZSwgYXR0cnMsIHJvbGVzKTsKKworICAgICAgICByZXR1cm4gbmV3IFVzZXIodXNlcm5hbWUsIGRuLCBwYXNzd29yZCwgcm9sZXMpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4gVXNlciBjYW4gYmUgYXV0aGVudGljYXRlZCB3aXRoIHRoZQorICAgICAqIGdpdmVuIGNyZWRlbnRpYWxzLiBJZiB0aGUgPGNvZGU+dXNlclBhc3N3b3JkPC9jb2RlPgorICAgICAqIGNvbmZpZ3VyYXRpb24gYXR0cmlidXRlIGlzIHNwZWNpZmllZCwgdGhlIGNyZWRlbnRpYWxzCisgICAgICogcHJldmlvdXNseSByZXRyaWV2ZWQgZnJvbSB0aGUgZGlyZWN0b3J5IGFyZSBjb21wYXJlZCBleHBsaWNpdGx5CisgICAgICogd2l0aCB0aG9zZSBwcmVzZW50ZWQgYnkgdGhlIHVzZXIuIE90aGVyd2lzZSB0aGUgcHJlc2VudGVkCisgICAgICogY3JlZGVudGlhbHMgYXJlIGNoZWNrZWQgYnkgYmluZGluZyB0byB0aGUgZGlyZWN0b3J5IGFzIHRoZQorICAgICAqIHVzZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgZGlyZWN0b3J5IGNvbnRleHQKKyAgICAgKiBAcGFyYW0gdXNlciBUaGUgVXNlciB0byBiZSBhdXRoZW50aWNhdGVkCisgICAgICogQHBhcmFtIGNyZWRlbnRpYWxzIFRoZSBjcmVkZW50aWFscyBwcmVzZW50ZWQgYnkgdGhlIHVzZXIKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgZGlyZWN0b3J5IHNlcnZlciBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjaGVja0NyZWRlbnRpYWxzKERpckNvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VyIHVzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNyZWRlbnRpYWxzKQorICAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisKKyAgICAgICAgIGJvb2xlYW4gdmFsaWRhdGVkID0gZmFsc2U7CisKKyAgICAgICAgIGlmICh1c2VyUGFzc3dvcmQgPT0gbnVsbCkgeworICAgICAgICAgICAgIHZhbGlkYXRlZCA9IGJpbmRBc1VzZXIoY29udGV4dCwgdXNlciwgY3JlZGVudGlhbHMpOworICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICB2YWxpZGF0ZWQgPSBjb21wYXJlQ3JlZGVudGlhbHMoY29udGV4dCwgdXNlciwgY3JlZGVudGlhbHMpOworICAgICAgICAgfQorCisgICAgICAgICBpZiAoY29udGFpbmVyLmdldExvZ2dlcigpLmlzVHJhY2VFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICBpZiAodmFsaWRhdGVkKSB7CisgICAgICAgICAgICAgICAgIGNvbnRhaW5lci5nZXRMb2dnZXIoKS50cmFjZShzbS5nZXRTdHJpbmcoImpuZGlSZWFsbS5hdXRoZW50aWNhdGVTdWNjZXNzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLnVzZXJuYW1lKSk7CisgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgY29udGFpbmVyLmdldExvZ2dlcigpLnRyYWNlKHNtLmdldFN0cmluZygiam5kaVJlYWxtLmF1dGhlbnRpY2F0ZUZhaWx1cmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIudXNlcm5hbWUpKTsKKyAgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICAgICByZXR1cm4gKHZhbGlkYXRlZCk7CisgICAgIH0KKworCisKKyAgICAvKioKKyAgICAgKiBDaGVjayB3aGV0aGVyIHRoZSBjcmVkZW50aWFscyBwcmVzZW50ZWQgYnkgdGhlIHVzZXIgbWF0Y2ggdGhvc2UKKyAgICAgKiByZXRyaWV2ZWQgZnJvbSB0aGUgZGlyZWN0b3J5LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGRpcmVjdG9yeSBjb250ZXh0CisgICAgICogQHBhcmFtIGluZm8gVGhlIFVzZXIgdG8gYmUgYXV0aGVudGljYXRlZAorICAgICAqIEBwYXJhbSBjcmVkZW50aWFscyBBdXRoZW50aWNhdGlvbiBjcmVkZW50aWFscworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBkaXJlY3Rvcnkgc2VydmVyIGVycm9yIG9jY3VycworICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGNvbXBhcmVDcmVkZW50aWFscyhEaXJDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXIgaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNyZWRlbnRpYWxzKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAoaW5mbyA9PSBudWxsIHx8IGNyZWRlbnRpYWxzID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKGZhbHNlKTsKKworICAgICAgICBTdHJpbmcgcGFzc3dvcmQgPSBpbmZvLnBhc3N3b3JkOworICAgICAgICBpZiAocGFzc3dvcmQgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAoZmFsc2UpOworCisgICAgICAgIC8vIFZhbGlkYXRlIHRoZSBjcmVkZW50aWFscyBzcGVjaWZpZWQgYnkgdGhlIHVzZXIKKyAgICAgICAgaWYgKGNvbnRhaW5lci5nZXRMb2dnZXIoKS5pc1RyYWNlRW5hYmxlZCgpKQorICAgICAgICAgICAgY29udGFpbmVyLmdldExvZ2dlcigpLnRyYWNlKCIgIHZhbGlkYXRpbmcgY3JlZGVudGlhbHMiKTsKKworICAgICAgICBib29sZWFuIHZhbGlkYXRlZCA9IGZhbHNlOworICAgICAgICBpZiAoaGFzTWVzc2FnZURpZ2VzdCgpKSB7CisgICAgICAgICAgICAvLyBpUGxhbmV0IHN1cHBvcnQgaWYgdGhlIHZhbHVlcyBzdGFydHMgd2l0aCB7U0hBMX0KKyAgICAgICAgICAgIC8vIFRoZSBzdHJpbmcgaXMgaW4gYSBmb3JtYXQgY29tcGF0aWJsZSB3aXRoIEJhc2U2NC5lbmNvZGUgbm90CisgICAgICAgICAgICAvLyB0aGUgSGV4IGVuY29kaW5nIG9mIHRoZSBwYXJlbnQgY2xhc3MuCisgICAgICAgICAgICBpZiAocGFzc3dvcmQuc3RhcnRzV2l0aCgie1NIQX0iKSkgeworICAgICAgICAgICAgICAgIC8qIHN5bmMgc2luY2Ugc3VwZXIuZGlnZXN0KCkgZG9lcyB0aGlzIHNhbWUgdGhpbmcgKi8KKyAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmQgPSBwYXNzd29yZC5zdWJzdHJpbmcoNSk7CisgICAgICAgICAgICAgICAgICAgIG1kLnJlc2V0KCk7CisgICAgICAgICAgICAgICAgICAgIG1kLnVwZGF0ZShjcmVkZW50aWFscy5nZXRCeXRlcygpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRpZ2VzdGVkUGFzc3dvcmQgPQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZyhCYXNlNjQuZW5jb2RlKG1kLmRpZ2VzdCgpKSk7CisgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlZCA9IHBhc3N3b3JkLmVxdWFscyhkaWdlc3RlZFBhc3N3b3JkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIEhleCBoYXNoZXMgc2hvdWxkIGJlIGNvbXBhcmVkIGNhc2UtaW5zZW5zaXRpdmUKKyAgICAgICAgICAgICAgICB2YWxpZGF0ZWQgPSAoZGlnZXN0KGNyZWRlbnRpYWxzKS5lcXVhbHNJZ25vcmVDYXNlKHBhc3N3b3JkKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgdmFsaWRhdGVkID0gKGRpZ2VzdChjcmVkZW50aWFscykuZXF1YWxzKHBhc3N3b3JkKSk7CisgICAgICAgIHJldHVybiAodmFsaWRhdGVkKTsKKworICAgIH0KKworCisKKyAgICAvKioKKyAgICAgKiBDaGVjayBjcmVkZW50aWFscyBieSBiaW5kaW5nIHRvIHRoZSBkaXJlY3RvcnkgYXMgdGhlIHVzZXIKKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBkaXJlY3RvcnkgY29udGV4dAorICAgICAqIEBwYXJhbSB1c2VyIFRoZSBVc2VyIHRvIGJlIGF1dGhlbnRpY2F0ZWQKKyAgICAgKiBAcGFyYW0gY3JlZGVudGlhbHMgQXV0aGVudGljYXRpb24gY3JlZGVudGlhbHMKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgZGlyZWN0b3J5IHNlcnZlciBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICAgcHJvdGVjdGVkIGJvb2xlYW4gYmluZEFzVXNlcihEaXJDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlciB1c2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjcmVkZW50aWFscykKKyAgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICAgQXR0cmlidXRlcyBhdHRyOworCisgICAgICAgICBpZiAoY3JlZGVudGlhbHMgPT0gbnVsbCB8fCB1c2VyID09IG51bGwpCisgICAgICAgICAgICAgcmV0dXJuIChmYWxzZSk7CisKKyAgICAgICAgIFN0cmluZyBkbiA9IHVzZXIuZG47CisgICAgICAgICBpZiAoZG4gPT0gbnVsbCkKKyAgICAgICAgICAgICByZXR1cm4gKGZhbHNlKTsKKworICAgICAgICAgLy8gVmFsaWRhdGUgdGhlIGNyZWRlbnRpYWxzIHNwZWNpZmllZCBieSB0aGUgdXNlcgorICAgICAgICAgaWYgKGNvbnRhaW5lci5nZXRMb2dnZXIoKS5pc1RyYWNlRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgY29udGFpbmVyLmdldExvZ2dlcigpLnRyYWNlKCIgIHZhbGlkYXRpbmcgY3JlZGVudGlhbHMgYnkgYmluZGluZyBhcyB0aGUgdXNlciIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gU2V0IHVwIHNlY3VyaXR5IGVudmlyb25tZW50IHRvIGJpbmQgYXMgdGhlIHVzZXIKKyAgICAgICAgY29udGV4dC5hZGRUb0Vudmlyb25tZW50KENvbnRleHQuU0VDVVJJVFlfUFJJTkNJUEFMLCBkbik7CisgICAgICAgIGNvbnRleHQuYWRkVG9FbnZpcm9ubWVudChDb250ZXh0LlNFQ1VSSVRZX0NSRURFTlRJQUxTLCBjcmVkZW50aWFscyk7CisKKyAgICAgICAgLy8gRWxpY2l0IGFuIExEQVAgYmluZCBvcGVyYXRpb24KKyAgICAgICAgYm9vbGVhbiB2YWxpZGF0ZWQgPSBmYWxzZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChjb250YWluZXIuZ2V0TG9nZ2VyKCkuaXNUcmFjZUVuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgIGNvbnRhaW5lci5nZXRMb2dnZXIoKS50cmFjZSgiICBiaW5kaW5nIGFzICIgICsgZG4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXR0ciA9IGNvbnRleHQuZ2V0QXR0cmlidXRlcygiIiwgbnVsbCk7CisgICAgICAgICAgICB2YWxpZGF0ZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBpZiAoY29udGFpbmVyLmdldExvZ2dlcigpLmlzVHJhY2VFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICBjb250YWluZXIuZ2V0TG9nZ2VyKCkudHJhY2UoIiAgYmluZCBhdHRlbXB0IGZhaWxlZCIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gUmVzdG9yZSB0aGUgb3JpZ2luYWwgc2VjdXJpdHkgZW52aXJvbm1lbnQKKyAgICAgICAgaWYgKGNvbm5lY3Rpb25OYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNvbnRleHQuYWRkVG9FbnZpcm9ubWVudChDb250ZXh0LlNFQ1VSSVRZX1BSSU5DSVBBTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uTmFtZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb250ZXh0LnJlbW92ZUZyb21FbnZpcm9ubWVudChDb250ZXh0LlNFQ1VSSVRZX1BSSU5DSVBBTCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY29ubmVjdGlvblBhc3N3b3JkICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNvbnRleHQuYWRkVG9FbnZpcm9ubWVudChDb250ZXh0LlNFQ1VSSVRZX0NSRURFTlRJQUxTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25QYXNzd29yZCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBjb250ZXh0LnJlbW92ZUZyb21FbnZpcm9ubWVudChDb250ZXh0LlNFQ1VSSVRZX0NSRURFTlRJQUxTKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAodmFsaWRhdGVkKTsKKyAgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBMaXN0IG9mIHJvbGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gVXNlci4gIEFueQorICAgICAqIHJvbGVzIHByZXNlbnQgaW4gdGhlIHVzZXIncyBkaXJlY3RvcnkgZW50cnkgYXJlIHN1cHBsZW1lbnRlZCBieQorICAgICAqIGEgZGlyZWN0b3J5IHNlYXJjaC4gSWYgbm8gcm9sZXMgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHVzZXIsCisgICAgICogYSB6ZXJvLWxlbmd0aCBMaXN0IGlzIHJldHVybmVkLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGRpcmVjdG9yeSBjb250ZXh0IHdlIGFyZSBzZWFyY2hpbmcKKyAgICAgKiBAcGFyYW0gdXNlciBUaGUgVXNlciB0byBiZSBjaGVja2VkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIGRpcmVjdG9yeSBzZXJ2ZXIgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHJvdGVjdGVkIExpc3QgZ2V0Um9sZXMoRGlyQ29udGV4dCBjb250ZXh0LCBVc2VyIHVzZXIpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworCisgICAgICAgIGlmICh1c2VyID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworCisgICAgICAgIFN0cmluZyBkbiA9IHVzZXIuZG47CisgICAgICAgIFN0cmluZyB1c2VybmFtZSA9IHVzZXIudXNlcm5hbWU7CisKKyAgICAgICAgaWYgKGRuID09IG51bGwgfHwgdXNlcm5hbWUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisKKyAgICAgICAgaWYgKGNvbnRhaW5lci5nZXRMb2dnZXIoKS5pc1RyYWNlRW5hYmxlZCgpKQorICAgICAgICAgICAgY29udGFpbmVyLmdldExvZ2dlcigpLnRyYWNlKCIgIGdldFJvbGVzKCIgKyBkbiArICIpIik7CisKKyAgICAgICAgLy8gU3RhcnQgd2l0aCByb2xlcyByZXRyaWV2ZWQgZnJvbSB0aGUgdXNlciBlbnRyeQorICAgICAgICBBcnJheUxpc3QgbGlzdCA9IHVzZXIucm9sZXM7CisgICAgICAgIGlmIChsaXN0ID09IG51bGwpIHsKKyAgICAgICAgICAgIGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBBcmUgd2UgY29uZmlndXJlZCB0byBkbyByb2xlIHNlYXJjaGVzPworICAgICAgICBpZiAoKHJvbGVGb3JtYXQgPT0gbnVsbCkgfHwgKHJvbGVOYW1lID09IG51bGwpKQorICAgICAgICAgICAgcmV0dXJuIChsaXN0KTsKKworICAgICAgICAvLyBTZXQgdXAgcGFyYW1ldGVycyBmb3IgYW4gYXBwcm9wcmlhdGUgc2VhcmNoCisgICAgICAgIFN0cmluZyBmaWx0ZXIgPSByb2xlRm9ybWF0LmZvcm1hdChuZXcgU3RyaW5nW10geyBkb1JGQzIyNTRFbmNvZGluZyhkbiksIHVzZXJuYW1lIH0pOworICAgICAgICBTZWFyY2hDb250cm9scyBjb250cm9scyA9IG5ldyBTZWFyY2hDb250cm9scygpOworICAgICAgICBpZiAocm9sZVN1YnRyZWUpCisgICAgICAgICAgICBjb250cm9scy5zZXRTZWFyY2hTY29wZShTZWFyY2hDb250cm9scy5TVUJUUkVFX1NDT1BFKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgY29udHJvbHMuc2V0U2VhcmNoU2NvcGUoU2VhcmNoQ29udHJvbHMuT05FTEVWRUxfU0NPUEUpOworICAgICAgICBjb250cm9scy5zZXRSZXR1cm5pbmdBdHRyaWJ1dGVzKG5ldyBTdHJpbmdbXSB7cm9sZU5hbWV9KTsKKworICAgICAgICAvLyBQZXJmb3JtIHRoZSBjb25maWd1cmVkIHNlYXJjaCBhbmQgcHJvY2VzcyB0aGUgcmVzdWx0cworICAgICAgICBOYW1pbmdFbnVtZXJhdGlvbiByZXN1bHRzID0KKyAgICAgICAgICAgIGNvbnRleHQuc2VhcmNoKHJvbGVCYXNlLCBmaWx0ZXIsIGNvbnRyb2xzKTsKKyAgICAgICAgaWYgKHJlc3VsdHMgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAobGlzdCk7ICAvLyBTaG91bGQgbmV2ZXIgaGFwcGVuLCBidXQganVzdCBpbiBjYXNlIC4uLgorICAgICAgICB3aGlsZSAocmVzdWx0cy5oYXNNb3JlKCkpIHsKKyAgICAgICAgICAgIFNlYXJjaFJlc3VsdCByZXN1bHQgPSAoU2VhcmNoUmVzdWx0KSByZXN1bHRzLm5leHQoKTsKKyAgICAgICAgICAgIEF0dHJpYnV0ZXMgYXR0cnMgPSByZXN1bHQuZ2V0QXR0cmlidXRlcygpOworICAgICAgICAgICAgaWYgKGF0dHJzID09IG51bGwpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBsaXN0ID0gYWRkQXR0cmlidXRlVmFsdWVzKHJvbGVOYW1lLCBhdHRycywgbGlzdCk7CisgICAgICAgIH0KKworCisgICAgICAgIGlmIChjb250YWluZXIuZ2V0TG9nZ2VyKCkuaXNUcmFjZUVuYWJsZWQoKSkgeworICAgICAgICAgICAgaWYgKGxpc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNvbnRhaW5lci5nZXRMb2dnZXIoKS50cmFjZSgiICBSZXR1cm5pbmcgIiArIGxpc3Quc2l6ZSgpICsgIiByb2xlcyIpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxsaXN0LnNpemUoKTsgaSsrKQorICAgICAgICAgICAgICAgICAgICBjb250YWluZXIuZ2V0TG9nZ2VyKCkudHJhY2UoICAiICBGb3VuZCByb2xlICIgKyBsaXN0LmdldChpKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNvbnRhaW5lci5nZXRMb2dnZXIoKS50cmFjZSgiICBnZXRSb2xlcyBhYm91dCB0byByZXR1cm4gbnVsbCAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAobGlzdCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBTdHJpbmcgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhdHRySWQgQXR0cmlidXRlIG5hbWUKKyAgICAgKiBAcGFyYW0gYXR0cnMgQXR0cmlidXRlcyBjb250YWluaW5nIHRoZSByZXF1aXJlZCB2YWx1ZQorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBkaXJlY3Rvcnkgc2VydmVyIGVycm9yIG9jY3VycworICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGdldEF0dHJpYnV0ZVZhbHVlKFN0cmluZyBhdHRySWQsIEF0dHJpYnV0ZXMgYXR0cnMpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworCisgICAgICAgIGlmIChjb250YWluZXIuZ2V0TG9nZ2VyKCkuaXNUcmFjZUVuYWJsZWQoKSkKKyAgICAgICAgICAgIGNvbnRhaW5lci5nZXRMb2dnZXIoKS50cmFjZSgiICByZXRyaWV2aW5nIGF0dHJpYnV0ZSAiICsgYXR0cklkKTsKKworICAgICAgICBpZiAoYXR0cklkID09IG51bGwgfHwgYXR0cnMgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIEF0dHJpYnV0ZSBhdHRyID0gYXR0cnMuZ2V0KGF0dHJJZCk7CisgICAgICAgIGlmIChhdHRyID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICBPYmplY3QgdmFsdWUgPSBhdHRyLmdldCgpOworICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIFN0cmluZyB2YWx1ZVN0cmluZyA9IG51bGw7CisgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIGJ5dGVbXSkKKyAgICAgICAgICAgIHZhbHVlU3RyaW5nID0gbmV3IFN0cmluZygoYnl0ZVtdKSB2YWx1ZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHZhbHVlU3RyaW5nID0gdmFsdWUudG9TdHJpbmcoKTsKKworICAgICAgICByZXR1cm4gdmFsdWVTdHJpbmc7CisgICAgfQorCisKKworICAgIC8qKgorICAgICAqIEFkZCB2YWx1ZXMgb2YgYSBzcGVjaWZpZWQgYXR0cmlidXRlIHRvIGEgbGlzdAorICAgICAqCisgICAgICogQHBhcmFtIGF0dHJJZCBBdHRyaWJ1dGUgbmFtZQorICAgICAqIEBwYXJhbSBhdHRycyBBdHRyaWJ1dGVzIGNvbnRhaW5pbmcgdGhlIG5ldyB2YWx1ZXMKKyAgICAgKiBAcGFyYW0gdmFsdWVzIEFycmF5TGlzdCBjb250YWluaW5nIHZhbHVlcyBmb3VuZCBzbyBmYXIKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgZGlyZWN0b3J5IHNlcnZlciBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwcml2YXRlIEFycmF5TGlzdCBhZGRBdHRyaWJ1dGVWYWx1ZXMoU3RyaW5nIGF0dHJJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlcyBhdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlMaXN0IHZhbHVlcykKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbnsKKworICAgICAgICBpZiAoY29udGFpbmVyLmdldExvZ2dlcigpLmlzVHJhY2VFbmFibGVkKCkpCisgICAgICAgICAgICBjb250YWluZXIuZ2V0TG9nZ2VyKCkudHJhY2UoIiAgcmV0cmlldmluZyB2YWx1ZXMgZm9yIGF0dHJpYnV0ZSAiICsgYXR0cklkKTsKKyAgICAgICAgaWYgKGF0dHJJZCA9PSBudWxsIHx8IGF0dHJzID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gdmFsdWVzOworICAgICAgICBpZiAodmFsdWVzID09IG51bGwpCisgICAgICAgICAgICB2YWx1ZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIEF0dHJpYnV0ZSBhdHRyID0gYXR0cnMuZ2V0KGF0dHJJZCk7CisgICAgICAgIGlmIChhdHRyID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKHZhbHVlcyk7CisgICAgICAgIE5hbWluZ0VudW1lcmF0aW9uIGUgPSBhdHRyLmdldEFsbCgpOworICAgICAgICB3aGlsZShlLmhhc01vcmUoKSkgeworICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gKFN0cmluZyllLm5leHQoKTsKKyAgICAgICAgICAgIHZhbHVlcy5hZGQodmFsdWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB2YWx1ZXM7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDbG9zZSBhbnkgb3BlbiBjb25uZWN0aW9uIHRvIHRoZSBkaXJlY3Rvcnkgc2VydmVyIGZvciB0aGlzIFJlYWxtLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGRpcmVjdG9yeSBjb250ZXh0IHRvIGJlIGNsb3NlZAorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGNsb3NlKERpckNvbnRleHQgY29udGV4dCkgeworCisgICAgICAgIC8vIERvIG5vdGhpbmcgaWYgdGhlcmUgaXMgbm8gb3BlbmVkIGNvbm5lY3Rpb24KKyAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvLyBDbG9zZSBvdXIgb3BlbmVkIGNvbm5lY3Rpb24KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChjb250YWluZXIuZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBjb250YWluZXIuZ2V0TG9nZ2VyKCkuZGVidWcoIkNsb3NpbmcgZGlyZWN0b3J5IGNvbnRleHQiKTsKKyAgICAgICAgICAgIGNvbnRleHQuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGNvbnRhaW5lci5nZXRMb2dnZXIoKS5lcnJvcihzbS5nZXRTdHJpbmcoImpuZGlSZWFsbS5jbG9zZSIpLCBlKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmNvbnRleHQgPSBudWxsOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBzaG9ydCBuYW1lIGZvciB0aGlzIFJlYWxtIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0TmFtZSgpIHsKKworICAgICAgICByZXR1cm4gKG5hbWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHBhc3N3b3JkIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gcHJpbmNpcGFsJ3MgdXNlciBuYW1lLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UGFzc3dvcmQoU3RyaW5nIHVzZXJuYW1lKSB7CisKKyAgICAgICAgcmV0dXJuIChudWxsKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBQcmluY2lwYWwgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiB1c2VyIG5hbWUuCisgICAgICovCisgICAgcHJvdGVjdGVkIFByaW5jaXBhbCBnZXRQcmluY2lwYWwoU3RyaW5nIHVzZXJuYW1lKSB7CisKKyAgICAgICAgcmV0dXJuIChudWxsKTsKKworICAgIH0KKworCisKKyAgICAvKioKKyAgICAgKiBPcGVuIChpZiBuZWNlc3NhcnkpIGFuZCByZXR1cm4gYSBjb25uZWN0aW9uIHRvIHRoZSBjb25maWd1cmVkCisgICAgICogZGlyZWN0b3J5IHNlcnZlciBmb3IgdGhpcyBSZWFsbS4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgZGlyZWN0b3J5IHNlcnZlciBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRGlyQ29udGV4dCBvcGVuKCkgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gRG8gbm90aGluZyBpZiB0aGVyZSBpcyBhIGRpcmVjdG9yeSBzZXJ2ZXIgY29ubmVjdGlvbiBhbHJlYWR5IG9wZW4KKyAgICAgICAgaWYgKGNvbnRleHQgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAoY29udGV4dCk7CisKKyAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgLy8gRW5zdXJlIHRoYXQgd2UgaGF2ZSBhIGRpcmVjdG9yeSBjb250ZXh0IGF2YWlsYWJsZQorICAgICAgICAgICAgY29udGV4dCA9IG5ldyBJbml0aWFsRGlyQ29udGV4dChnZXREaXJlY3RvcnlDb250ZXh0RW52aXJvbm1lbnQoKSk7CisKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKworICAgICAgICAgICAgY29ubmVjdGlvbkF0dGVtcHQgPSAxOworCisgICAgICAgICAgICAvLyBsb2cgdGhlIGZpcnN0IGV4Y2VwdGlvbi4KKyAgICAgICAgICAgIGNvbnRhaW5lci5nZXRMb2dnZXIoKS53YXJuKHNtLmdldFN0cmluZygiam5kaVJlYWxtLmV4Y2VwdGlvbiIpLCBlKTsKKworICAgICAgICAgICAgLy8gVHJ5IGNvbm5lY3RpbmcgdG8gdGhlIGFsdGVybmF0ZSB1cmwuCisgICAgICAgICAgICBjb250ZXh0ID0gbmV3IEluaXRpYWxEaXJDb250ZXh0KGdldERpcmVjdG9yeUNvbnRleHRFbnZpcm9ubWVudCgpKTsKKworICAgICAgICB9IGZpbmFsbHkgeworCisgICAgICAgICAgICAvLyByZXNldCBpdCBpbiBjYXNlIHRoZSBjb25uZWN0aW9uIHRpbWVzIG91dC4KKyAgICAgICAgICAgIC8vIHRoZSBwcmltYXJ5IG1heSBjb21lIGJhY2suCisgICAgICAgICAgICBjb25uZWN0aW9uQXR0ZW1wdCA9IDA7CisKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAoY29udGV4dCk7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgb3VyIGRpcmVjdG9yeSBjb250ZXh0IGNvbmZpZ3VyYXRpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGphdmEudXRpbC5IYXNodGFibGUgdGhlIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBkaXJlY3RvcnkgY29udGV4dC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgSGFzaHRhYmxlIGdldERpcmVjdG9yeUNvbnRleHRFbnZpcm9ubWVudCgpIHsKKworICAgICAgICBIYXNodGFibGUgZW52ID0gbmV3IEhhc2h0YWJsZSgpOworCisgICAgICAgIC8vIENvbmZpZ3VyZSBvdXIgZGlyZWN0b3J5IGNvbnRleHQgZW52aXJvbm1lbnQuCisgICAgICAgIGlmIChjb250YWluZXIuZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSAmJiBjb25uZWN0aW9uQXR0ZW1wdCA9PSAwKQorICAgICAgICAgICAgY29udGFpbmVyLmdldExvZ2dlcigpLmRlYnVnKCJDb25uZWN0aW5nIHRvIFVSTCAiICsgY29ubmVjdGlvblVSTCk7CisgICAgICAgIGVsc2UgaWYgKGNvbnRhaW5lci5nZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpICYmIGNvbm5lY3Rpb25BdHRlbXB0ID4gMCkKKyAgICAgICAgICAgIGNvbnRhaW5lci5nZXRMb2dnZXIoKS5kZWJ1ZygiQ29ubmVjdGluZyB0byBVUkwgIiArIGFsdGVybmF0ZVVSTCk7CisgICAgICAgIGVudi5wdXQoQ29udGV4dC5JTklUSUFMX0NPTlRFWFRfRkFDVE9SWSwgY29udGV4dEZhY3RvcnkpOworICAgICAgICBpZiAoY29ubmVjdGlvbk5hbWUgIT0gbnVsbCkKKyAgICAgICAgICAgIGVudi5wdXQoQ29udGV4dC5TRUNVUklUWV9QUklOQ0lQQUwsIGNvbm5lY3Rpb25OYW1lKTsKKyAgICAgICAgaWYgKGNvbm5lY3Rpb25QYXNzd29yZCAhPSBudWxsKQorICAgICAgICAgICAgZW52LnB1dChDb250ZXh0LlNFQ1VSSVRZX0NSRURFTlRJQUxTLCBjb25uZWN0aW9uUGFzc3dvcmQpOworICAgICAgICBpZiAoY29ubmVjdGlvblVSTCAhPSBudWxsICYmIGNvbm5lY3Rpb25BdHRlbXB0ID09IDApCisgICAgICAgICAgICBlbnYucHV0KENvbnRleHQuUFJPVklERVJfVVJMLCBjb25uZWN0aW9uVVJMKTsKKyAgICAgICAgZWxzZSBpZiAoYWx0ZXJuYXRlVVJMICE9IG51bGwgJiYgY29ubmVjdGlvbkF0dGVtcHQgPiAwKQorICAgICAgICAgICAgZW52LnB1dChDb250ZXh0LlBST1ZJREVSX1VSTCwgYWx0ZXJuYXRlVVJMKTsKKyAgICAgICAgaWYgKGF1dGhlbnRpY2F0aW9uICE9IG51bGwpCisgICAgICAgICAgICBlbnYucHV0KENvbnRleHQuU0VDVVJJVFlfQVVUSEVOVElDQVRJT04sIGF1dGhlbnRpY2F0aW9uKTsKKyAgICAgICAgaWYgKHByb3RvY29sICE9IG51bGwpCisgICAgICAgICAgICBlbnYucHV0KENvbnRleHQuU0VDVVJJVFlfUFJPVE9DT0wsIHByb3RvY29sKTsKKyAgICAgICAgaWYgKHJlZmVycmFscyAhPSBudWxsKQorICAgICAgICAgICAgZW52LnB1dChDb250ZXh0LlJFRkVSUkFMLCByZWZlcnJhbHMpOworCisgICAgICAgIHJldHVybiBlbnY7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbGVhc2Ugb3VyIHVzZSBvZiB0aGlzIGNvbm5lY3Rpb24gc28gdGhhdCBpdCBjYW4gYmUgcmVjeWNsZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgZGlyZWN0b3J5IGNvbnRleHQgdG8gcmVsZWFzZQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHJlbGVhc2UoRGlyQ29udGV4dCBjb250ZXh0KSB7CisKKyAgICAgICAgOyAvLyBOTy1PUCBzaW5jZSB3ZSBhcmUgbm90IHBvb2xpbmcgYW55dGhpbmcKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIExpZmVjeWNsZSBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFByZXBhcmUgZm9yIGFjdGl2ZSB1c2Ugb2YgdGhlIHB1YmxpYyBtZXRob2RzIG9mIHRoaXMgQ29tcG9uZW50LgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBMaWZlY3ljbGVFeGNlcHRpb24gaWYgdGhpcyBjb21wb25lbnQgZGV0ZWN0cyBhIGZhdGFsIGVycm9yCisgICAgICogIHRoYXQgcHJldmVudHMgaXQgZnJvbSBiZWluZyBzdGFydGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnQoKSB0aHJvd3MgTGlmZWN5Y2xlRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBWYWxpZGF0ZSB0aGF0IHdlIGNhbiBvcGVuIG91ciBjb25uZWN0aW9uCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvcGVuKCk7CisgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTGlmZWN5Y2xlRXhjZXB0aW9uKHNtLmdldFN0cmluZygiam5kaVJlYWxtLm9wZW4iKSwgZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBQZXJmb3JtIG5vcm1hbCBzdXBlcmNsYXNzIGluaXRpYWxpemF0aW9uCisgICAgICAgIHN1cGVyLnN0YXJ0KCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdyYWNlZnVsbHkgc2h1dCBkb3duIGFjdGl2ZSB1c2Ugb2YgdGhlIHB1YmxpYyBtZXRob2RzIG9mIHRoaXMgQ29tcG9uZW50LgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBMaWZlY3ljbGVFeGNlcHRpb24gaWYgdGhpcyBjb21wb25lbnQgZGV0ZWN0cyBhIGZhdGFsIGVycm9yCisgICAgICogIHRoYXQgbmVlZHMgdG8gYmUgcmVwb3J0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdG9wKCkgdGhyb3dzIExpZmVjeWNsZUV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gUGVyZm9ybSBub3JtYWwgc3VwZXJjbGFzcyBmaW5hbGl6YXRpb24KKyAgICAgICAgc3VwZXIuc3RvcCgpOworCisgICAgICAgIC8vIENsb3NlIGFueSBvcGVuIGRpcmVjdG9yeSBzZXJ2ZXIgY29ubmVjdGlvbgorICAgICAgICBjbG9zZSh0aGlzLmNvbnRleHQpOworCisgICAgfQorCisgICAgLyoqCisgICAgICogR2l2ZW4gYSBzdHJpbmcgY29udGFpbmluZyBMREFQIHBhdHRlcm5zIGZvciB1c2VyIGxvY2F0aW9ucyAoc2VwYXJhdGVkIGJ5CisgICAgICogcGFyZW50aGVzZXMgaW4gYSBwc2V1ZG8tTERBUCBzZWFyY2ggc3RyaW5nIGZvcm1hdCAtCisgICAgICogIihsb2NhdGlvbjEpKGxvY2F0aW9uMikiLCByZXR1cm5zIGFuIGFycmF5IG9mIHRob3NlIHBhdGhzLiAgUmVhbCBMREFQCisgICAgICogc2VhcmNoIHN0cmluZ3MgYXJlIHN1cHBvcnRlZCBhcyB3ZWxsICh0aG91Z2ggb25seSB0aGUgInwiICJPUiIgdHlwZSkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXNlclBhdHRlcm5TdHJpbmcgLSBhIHN0cmluZyBMREFQIHNlYXJjaCBwYXRocyBzdXJyb3VuZGVkIGJ5CisgICAgICogcGFyZW50aGVzZXMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nW10gcGFyc2VVc2VyUGF0dGVyblN0cmluZyhTdHJpbmcgdXNlclBhdHRlcm5TdHJpbmcpIHsKKworICAgICAgICBpZiAodXNlclBhdHRlcm5TdHJpbmcgIT0gbnVsbCkgeworICAgICAgICAgICAgQXJyYXlMaXN0IHBhdGhMaXN0ID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICAgICAgaW50IHN0YXJ0UGFyZW5Mb2MgPSB1c2VyUGF0dGVyblN0cmluZy5pbmRleE9mKCcoJyk7CisgICAgICAgICAgICBpZiAoc3RhcnRQYXJlbkxvYyA9PSAtMSkgeworICAgICAgICAgICAgICAgIC8vIG5vIHBhcmVucyBoZXJlOyByZXR1cm4gd2hvbGUgdGhpbmcKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHt1c2VyUGF0dGVyblN0cmluZ307CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgc3RhcnRpbmdQb2ludCA9IDA7CisgICAgICAgICAgICB3aGlsZSAoc3RhcnRQYXJlbkxvYyA+IC0xKSB7CisgICAgICAgICAgICAgICAgaW50IGVuZFBhcmVuTG9jID0gMDsKKyAgICAgICAgICAgICAgICAvLyB3ZWVkIG91dCBlc2NhcGVkIG9wZW4gcGFyZW5zIGFuZCBwYXJlbnMgZW5jbG9zaW5nIHRoZQorICAgICAgICAgICAgICAgIC8vIHdob2xlIHN0YXRlbWVudCAoaW4gdGhlIGNhc2Ugb2YgdmFsaWQgTERBUCBzZWFyY2gKKyAgICAgICAgICAgICAgICAvLyBzdHJpbmdzOiAofChzb21ldGhpbmcpKHNvbWV0aGluZ2Vsc2UpKQorICAgICAgICAgICAgICAgIHdoaWxlICggKHVzZXJQYXR0ZXJuU3RyaW5nLmNoYXJBdChzdGFydFBhcmVuTG9jICsgMSkgPT0gJ3wnKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXJ0UGFyZW5Mb2MgIT0gMCAmJiB1c2VyUGF0dGVyblN0cmluZy5jaGFyQXQoc3RhcnRQYXJlbkxvYyAtIDEpID09ICdcXCcpICkgeworICAgICAgICAgICAgICAgICAgICBzdGFydFBhcmVuTG9jID0gdXNlclBhdHRlcm5TdHJpbmcuaW5kZXhPZigiKCIsIHN0YXJ0UGFyZW5Mb2MrMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVuZFBhcmVuTG9jID0gdXNlclBhdHRlcm5TdHJpbmcuaW5kZXhPZigiKSIsIHN0YXJ0UGFyZW5Mb2MrMSk7CisgICAgICAgICAgICAgICAgLy8gd2VlZCBvdXQgZXNjYXBlZCBlbmQtcGFyZW5zCisgICAgICAgICAgICAgICAgd2hpbGUgKHVzZXJQYXR0ZXJuU3RyaW5nLmNoYXJBdChlbmRQYXJlbkxvYyAtIDEpID09ICdcXCcpIHsKKyAgICAgICAgICAgICAgICAgICAgZW5kUGFyZW5Mb2MgPSB1c2VyUGF0dGVyblN0cmluZy5pbmRleE9mKCIpIiwgZW5kUGFyZW5Mb2MrMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFN0cmluZyBuZXh0UGF0aFBhcnQgPSB1c2VyUGF0dGVyblN0cmluZy5zdWJzdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgKHN0YXJ0UGFyZW5Mb2MrMSwgZW5kUGFyZW5Mb2MpOworICAgICAgICAgICAgICAgIHBhdGhMaXN0LmFkZChuZXh0UGF0aFBhcnQpOworICAgICAgICAgICAgICAgIHN0YXJ0aW5nUG9pbnQgPSBlbmRQYXJlbkxvYysxOworICAgICAgICAgICAgICAgIHN0YXJ0UGFyZW5Mb2MgPSB1c2VyUGF0dGVyblN0cmluZy5pbmRleE9mKCcoJywgc3RhcnRpbmdQb2ludCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gKFN0cmluZ1tdKXBhdGhMaXN0LnRvQXJyYXkobmV3IFN0cmluZ1tdIHt9KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2l2ZW4gYW4gTERBUCBzZWFyY2ggc3RyaW5nLCByZXR1cm5zIHRoZSBzdHJpbmcgd2l0aCBjZXJ0YWluIGNoYXJhY3RlcnMKKyAgICAgKiBlc2NhcGVkIGFjY29yZGluZyB0byBSRkMgMjI1NCBndWlkZWxpbmVzLgorICAgICAqIFRoZSBjaGFyYWN0ZXIgbWFwcGluZyBpcyBhcyBmb2xsb3dzOgorICAgICAqICAgICBjaGFyIC0+ICBSZXBsYWNlbWVudAorICAgICAqICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAqICAgICAqICAtPiBcMmEKKyAgICAgKiAgICAgKCAgLT4gXDI4CisgICAgICogICAgICkgIC0+IFwyOQorICAgICAqICAgICBcICAtPiBcNWMKKyAgICAgKiAgICAgXDAgLT4gXDAwCisgICAgICogQHBhcmFtIGluU3RyaW5nIHN0cmluZyB0byBlc2NhcGUgYWNjb3JkaW5nIHRvIFJGQyAyMjU0IGd1aWRlbGluZXMKKyAgICAgKiBAcmV0dXJuIFN0cmluZyB0aGUgZXNjYXBlZC9lbmNvZGVkIHJlc3VsdAorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZG9SRkMyMjU0RW5jb2RpbmcoU3RyaW5nIGluU3RyaW5nKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKGluU3RyaW5nLmxlbmd0aCgpKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpblN0cmluZy5sZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICBjaGFyIGMgPSBpblN0cmluZy5jaGFyQXQoaSk7CisgICAgICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgICAgICAgICBjYXNlICdcXCc6CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIlxcNWMiKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnKic6CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIlxcMmEiKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnKCc6CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIlxcMjgiKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnKSc6CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIlxcMjkiKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnXDAnOgorICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCJcXDAwIik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoYyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKKyAgICB9CisKKworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJpdmF0ZSBDbGFzc2VzCisKKy8qKgorICogQSBwcml2YXRlIGNsYXNzIHJlcHJlc2VudGluZyBhIFVzZXIKKyAqLworY2xhc3MgVXNlciB7CisgICAgU3RyaW5nIHVzZXJuYW1lID0gbnVsbDsKKyAgICBTdHJpbmcgZG4gPSBudWxsOworICAgIFN0cmluZyBwYXNzd29yZCA9IG51bGw7CisgICAgQXJyYXlMaXN0IHJvbGVzID0gbnVsbDsKKworCisgICAgVXNlcihTdHJpbmcgdXNlcm5hbWUsIFN0cmluZyBkbiwgU3RyaW5nIHBhc3N3b3JkLCBBcnJheUxpc3Qgcm9sZXMpIHsKKyAgICAgICAgdGhpcy51c2VybmFtZSA9IHVzZXJuYW1lOworICAgICAgICB0aGlzLmRuID0gZG47CisgICAgICAgIHRoaXMucGFzc3dvcmQgPSBwYXNzd29yZDsKKyAgICAgICAgdGhpcy5yb2xlcyA9IHJvbGVzOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3JlYWxtL0xvY2FsU3RyaW5ncy5wcm9wZXJ0aWVzIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3JlYWxtL0xvY2FsU3RyaW5ncy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkMjc2ODcKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvcmVhbG0vTG9jYWxTdHJpbmdzLnByb3BlcnRpZXMKQEAgLTAsMCArMSw2OCBAQAorIyAkSWQkCisKKyMgbGFuZ3VhZ2UKKworIyBwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEucmVhbG0KKworamFhc1JlYWxtLmJlZ2luTG9naW49SkFBU1JlYWxtIGxvZ2luIHJlcXVlc3RlZCBmb3IgdXNlcm5hbWUgInswfSIgdXNpbmcgTG9naW5Db250ZXh0IGZvciBhcHBsaWNhdGlvbiAiezF9IgoramFhc1JlYWxtLmFjY291bnRFeHBpcmVkPVVzZXJuYW1lICJ7MH0iIE5PVCBhdXRoZW50aWNhdGVkIGR1ZSB0byBleHBpcmVkIGFjY291bnQKK2phYXNSZWFsbS5hdXRoZW50aWNhdGVGYWlsdXJlPVVzZXJuYW1lICJ7MH0iIE5PVCBzdWNjZXNzZnVsbHkgYXV0aGVudGljYXRlZAoramFhc1JlYWxtLmF1dGhlbnRpY2F0ZVN1Y2Nlc3M9VXNlcm5hbWUgInswfSIgc3VjY2Vzc2Z1bGx5IGF1dGhlbnRpY2F0ZWQgYXMgUHJpbmNpcGFsICJ7MX0iIC0tIFN1YmplY3Qgd2FzIGNyZWF0ZWQgdG9vCitqYWFzUmVhbG0uY3JlZGVudGlhbEV4cGlyZWQ9VXNlcm5hbWUgInswfSIgTk9UIGF1dGhlbnRpY2F0ZWQgZHVlIHRvIGV4cGlyZWQgY3JlZGVudGlhbAoramFhc1JlYWxtLmZhaWxlZExvZ2luPVVzZXJuYW1lICJ7MH0iIE5PVCBhdXRoZW50aWNhdGVkIGR1ZSB0byBmYWlsZWQgbG9naW4KK2phYXNSZWFsbS5sb2dpbkV4Y2VwdGlvbj1Mb2dpbiBleGNlcHRpb24gYXV0aGVudGljYXRpbmcgdXNlcm5hbWUgInswfSIKK2phYXNSZWFsbS51bmV4cGVjdGVkRXJyb3I9VW5leHBlY3RlZCBlcnJvcgoramFhc1JlYWxtLmxvZ2luQ29udGV4dENyZWF0ZWQ9SkFBUyBMb2dpbkNvbnRleHQgY3JlYXRlZCBmb3IgdXNlcm5hbWUgInswfSIKK2phYXNSZWFsbS51c2VyUHJpbmNpcGFsU3VjY2Vzcz1TdWJqZWN0IGZvciB1c2VybmFtZSAiezB9IiByZXR1cm5lZCB1c2VyIFByaW5jaXBhbCAiezF9IgoramFhc1JlYWxtLnVzZXJQcmluY2lwYWxGYWlsdXJlPVN1YmplY3QgZm9yIHVzZXJuYW1lICJ7MH0iIGRpZCBub3QgcmV0dXJuIGEgdmFsaWQgdXNlciBQcmluY2lwYWwKK2phYXNSZWFsbS5jYWNoZVByaW5jaXBhbD1Vc2VyIFByaW5jaXBhbCAiezB9IiBjYWNoZWQ7IGhhcyB7MX0gcm9sZSBQcmluY2lwYWwocykKK2phYXNSZWFsbS5jaGVja1ByaW5jaXBhbD1DaGVja2luZyBQcmluY2lwYWwgInswfSIgW3sxfV0KK2phYXNSZWFsbS51c2VyUHJpbmNpcGFsU3VjY2Vzcz1QcmluY2lwYWwgInswfSIgaXMgYSB2YWxpZCB1c2VyIGNsYXNzLiBXZSB3aWxsIHVzZSB0aGlzIGFzIHRoZSB1c2VyIFByaW5jaXBhbC4KK2phYXNSZWFsbS51c2VyUHJpbmNpcGFsRmFpbHVyZT1ObyB2YWxpZCB1c2VyIFByaW5jaXBhbCBmb3VuZAoramFhc1JlYWxtLnJvbGVQcmluY2lwYWxBZGQ9QWRkaW5nIHJvbGUgUHJpbmNpcGFsICJ7MH0iIHRvIHRoaXMgdXNlciBQcmluY2lwYWxcJ3Mgcm9sZXMKK2phYXNSZWFsbS5yb2xlUHJpbmNpcGFsU3VjY2Vzcz17MH0gcm9sZSBQcmluY2lwYWwocykgZm91bmQKK2phYXNSZWFsbS5yb2xlUHJpbmNpcGFsRmFpbHVyZT1ObyB2YWxpZCByb2xlIFByaW5jaXBhbHMgZm91bmQuCitqYWFzUmVhbG0uaXNJblJvbGUuc3RhcnQ9Q2hlY2tpbmcgaWYgdXNlciBQcmluY2lwYWwgInswfSIgcG9zc2Vzc2VzIHJvbGUgInsxfSIKK2phYXNSZWFsbS5pc0luUm9sZS5ub1ByaW5jaXBhbE9yUm9sZT1ObyByb2xlcyBQcmluY2lwYWxzIGZvdW5kLiBVc2VyIFByaW5jaXBhbCBvciBTdWJqZWN0IGlzIG51bGwsIG9yIHVzZXIgUHJpbmNpcGFsIG5vdCBpbiBjYWNoZQoramFhc1JlYWxtLmlzSW5Sb2xlLnByaW5jaXBhbENhY2hlZD1Vc2VyIFByaW5jaXBhbCBoYXMgezB9IHJvbGUgUHJpbmNpcGFsKHMpCitqYWFzUmVhbG0uaXNJblJvbGUucG9zc2Vzc2VzUm9sZT1Vc2VyIFByaW5jaXBhbCBoYXMgYSByb2xlIFByaW5jaXBhbCBjYWxsZWQgInswfSIKK2phYXNSZWFsbS5pc0luUm9sZS5tYXRjaD1NYXRjaGluZyByb2xlIFByaW5jaXBhbCBmb3VuZC4KK2phYXNSZWFsbS5pc0luUm9sZS5ub01hdGNoPU1hdGNoaW5nIHJvbGUgUHJpbmNpcGFsIE5PVCBmb3VuZC4KK2phYXNDYWxsYmFjay5kaWdlc3RwYXNzd29yZD1EaWdlc3RlZCBwYXNzd29yZCAiezB9IiBhcyAiezF9IgoramFhc0NhbGxiYWNrLnVzZXJuYW1lPVJldHVybmVkIHVzZXJuYW1lICJ7MH0iCitqYWFzQ2FsbGJhY2sucGFzc3dvcmQ9UmV0dXJuZWQgcGFzc3dvcmQgInswfSIKK2pkYmNSZWFsbS5hdXRoZW50aWNhdGVGYWlsdXJlPVVzZXJuYW1lIHswfSBOT1Qgc3VjY2Vzc2Z1bGx5IGF1dGhlbnRpY2F0ZWQKK2pkYmNSZWFsbS5hdXRoZW50aWNhdGVTdWNjZXNzPVVzZXJuYW1lIHswfSBzdWNjZXNzZnVsbHkgYXV0aGVudGljYXRlZAoramRiY1JlYWxtLmNsb3NlPUV4Y2VwdGlvbiBjbG9zaW5nIGRhdGFiYXNlIGNvbm5lY3Rpb24KK2pkYmNSZWFsbS5leGNlcHRpb249RXhjZXB0aW9uIHBlcmZvcm1pbmcgYXV0aGVudGljYXRpb24KK2pkYmNSZWFsbS5vcGVuPUV4Y2VwdGlvbiBvcGVuaW5nIGRhdGFiYXNlIGNvbm5lY3Rpb24KK2puZGlSZWFsbS5hdXRoZW50aWNhdGVGYWlsdXJlPVVzZXJuYW1lIHswfSBOT1Qgc3VjY2Vzc2Z1bGx5IGF1dGhlbnRpY2F0ZWQKK2puZGlSZWFsbS5hdXRoZW50aWNhdGVTdWNjZXNzPVVzZXJuYW1lIHswfSBzdWNjZXNzZnVsbHkgYXV0aGVudGljYXRlZAoram5kaVJlYWxtLmNsb3NlPUV4Y2VwdGlvbiBjbG9zaW5nIGRpcmVjdG9yeSBzZXJ2ZXIgY29ubmVjdGlvbgoram5kaVJlYWxtLmV4Y2VwdGlvbj1FeGNlcHRpb24gcGVyZm9ybWluZyBhdXRoZW50aWNhdGlvbgoram5kaVJlYWxtLm9wZW49RXhjZXB0aW9uIG9wZW5pbmcgZGlyZWN0b3J5IHNlcnZlciBjb25uZWN0aW9uCittZW1vcnlSZWFsbS5hdXRoZW50aWNhdGVGYWlsdXJlPVVzZXJuYW1lIHswfSBOT1Qgc3VjY2Vzc2Z1bGx5IGF1dGhlbnRpY2F0ZWQKK21lbW9yeVJlYWxtLmF1dGhlbnRpY2F0ZVN1Y2Nlc3M9VXNlcm5hbWUgezB9IHN1Y2Nlc3NmdWxseSBhdXRoZW50aWNhdGVkCittZW1vcnlSZWFsbS5sb2FkRXhpc3Q9TWVtb3J5IGRhdGFiYXNlIGZpbGUgezB9IGNhbm5vdCBiZSByZWFkCittZW1vcnlSZWFsbS5sb2FkUGF0aD1Mb2FkaW5nIHVzZXJzIGZyb20gbWVtb3J5IGRhdGFiYXNlIGZpbGUgezB9CittZW1vcnlSZWFsbS5yZWFkWG1sPUV4Y2VwdGlvbiB3aGlsZSByZWFkaW5nIG1lbW9yeSBkYXRhYmFzZSBmaWxlCityZWFsbUJhc2UuYWxnb3JpdGhtPUludmFsaWQgbWVzc2FnZSBkaWdlc3QgYWxnb3JpdGhtIHswfSBzcGVjaWZpZWQKK3JlYWxtQmFzZS5hbHJlYWR5U3RhcnRlZD1UaGlzIFJlYWxtIGhhcyBhbHJlYWR5IGJlZW4gc3RhcnRlZAorcmVhbG1CYXNlLmRpZ2VzdD1FcnJvciBkaWdlc3RpbmcgdXNlciBjcmVkZW50aWFscworcmVhbG1CYXNlLmZvcmJpZGRlbj1BY2Nlc3MgdG8gdGhlIHJlcXVlc3RlZCByZXNvdXJjZSBoYXMgYmVlbiBkZW5pZWQKK3JlYWxtQmFzZS5oYXNSb2xlRmFpbHVyZT1Vc2VybmFtZSB7MH0gZG9lcyBOT1QgaGF2ZSByb2xlIHsxfQorcmVhbG1CYXNlLmhhc1JvbGVTdWNjZXNzPVVzZXJuYW1lIHswfSBoYXMgcm9sZSB7MX0KK3JlYWxtQmFzZS5ub3RBdXRoZW50aWNhdGVkPUNvbmZpZ3VyYXRpb24gZXJyb3I6ICBDYW5ub3QgcGVyZm9ybSBhY2Nlc3MgY29udHJvbCB3aXRob3V0IGFuIGF1dGhlbnRpY2F0ZWQgcHJpbmNpcGFsCityZWFsbUJhc2Uubm90U3RhcnRlZD1UaGlzIFJlYWxtIGhhcyBub3QgeWV0IGJlZW4gc3RhcnRlZAorcmVhbG1CYXNlLmF1dGhlbnRpY2F0ZUZhaWx1cmU9VXNlcm5hbWUgezB9IE5PVCBzdWNjZXNzZnVsbHkgYXV0aGVudGljYXRlZAorcmVhbG1CYXNlLmF1dGhlbnRpY2F0ZVN1Y2Nlc3M9VXNlcm5hbWUgezB9IHN1Y2Nlc3NmdWxseSBhdXRoZW50aWNhdGVkCit1c2VyRGF0YWJhc2VSZWFsbS5hdXRoZW50aWNhdGVFcnJvcj1Mb2dpbiBjb25maWd1cmF0aW9uIGVycm9yIGF1dGhlbnRpY2F0aW5nIHVzZXJuYW1lIHswfQordXNlckRhdGFiYXNlUmVhbG0ubG9va3VwPUV4Y2VwdGlvbiBsb29raW5nIHVwIFVzZXJEYXRhYmFzZSB1bmRlciBrZXkgezB9Cit1c2VyRGF0YWJhc2VSZWFsbS5ub0RhdGFiYXNlPU5vIFVzZXJEYXRhYmFzZSBjb21wb25lbnQgZm91bmQgdW5kZXIga2V5IHswfQordXNlckRhdGFiYXNlUmVhbG0ubm9FbmdpbmU9Tm8gRW5naW5lIGNvbXBvbmVudCBmb3VuZCBpbiBjb250YWluZXIgaGllcmFyY2h5Cit1c2VyRGF0YWJhc2VSZWFsbS5ub0dsb2JhbD1ObyBnbG9iYWwgSk5ESSByZXNvdXJjZXMgY29udGV4dCBmb3VuZAorZGF0YVNvdXJjZVJlYWxtLmF1dGhlbnRpY2F0ZUZhaWx1cmU9VXNlcm5hbWUgezB9IE5PVCBzdWNjZXNzZnVsbHkgYXV0aGVudGljYXRlZAorZGF0YVNvdXJjZVJlYWxtLmF1dGhlbnRpY2F0ZVN1Y2Nlc3M9VXNlcm5hbWUgezB9IHN1Y2Nlc3NmdWxseSBhdXRoZW50aWNhdGVkCitkYXRhU291cmNlUmVhbG0uY2xvc2U9RXhjZXB0aW9uIGNsb3NpbmcgZGF0YWJhc2UgY29ubmVjdGlvbgorZGF0YVNvdXJjZVJlYWxtLmV4Y2VwdGlvbj1FeGNlcHRpb24gcGVyZm9ybWluZyBhdXRoZW50aWNhdGlvbgorZGF0YVNvdXJjZVJlYWxtLm9wZW49RXhjZXB0aW9uIG9wZW5pbmcgZGF0YWJhc2UgY29ubmVjdGlvbgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3JlYWxtL0xvY2FsU3RyaW5nc19lcy5wcm9wZXJ0aWVzIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3JlYWxtL0xvY2FsU3RyaW5nc19lcy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwNWYzNDgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvcmVhbG0vTG9jYWxTdHJpbmdzX2VzLnByb3BlcnRpZXMKQEAgLTAsMCArMSw0NyBAQAorIyAkSWQkCisKKyMgbGFuZ3VhZ2UgZXMKKworIyBwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEucmVhbG0KKworamFhc1JlYWxtLmFjY291bnRFeHBpcmVkPUVsIHVzdWFyaW8gezB9IE5PIGhhIHNpZG8gYXV0ZW50aWZpY2FkbyBwb3JxdWUgaGEgZXhwaXJhZG8gc3UgY3VlbnRhCitqYWFzUmVhbG0uYXV0aGVudGljYXRlZFN1Y2Nlc3M9RWwgdXN1YXJpbyB7MH0gaGEgc2lkbyBhdXRlbnRpZmljYWRvIGNvbiDpeGl0bworamFhc1JlYWxtLmNyZWRlbnRpYWxFeHBpcmVkPUVsIHVzdWFyaW8gezB9IE5PIGhhIHNpZG8gYXV0ZW50aWZpY2FkbyBwb3JxdWUgaGEgZXhwaXJhZG8gc3UgY3JlZGVuY2lhbAoramFhc1JlYWxtLmZhaWxlZExvZ2luPUVsIHVzdWFyaW8gezB9IE5PIGhhIHNpZG8gYXV0ZW50aWZpY2FkbyBwb3JxdWUgaGEgZmFsbGFkbyBlbCBsb2dpbgoramFhc1JlYWxtLmxvZ2luRXhjZXB0aW9uPUV4Y2VwY2nzbiBkZSBMb2dpbiBhdXRlbnRpY2FuZG8gbm9tYnJlIGRlIHVzdWFyaW8gezB9CitqYWFzUmVhbG0udW5leHBlY3RlZEVycm9yPUVycm9yIGluZXNwZXJhZG8KK2pkYmNSZWFsbS5hdXRoZW50aWNhdGVGYWlsdXJlPUVsIHVzdWFyaW8gezB9IE5PIGhhIHNpZG8gYXV0ZW50aWZpY2FkbyBjb3JyZWN0YW1lbnRlCitqZGJjUmVhbG0uYXV0aGVudGljYXRlU3VjY2Vzcz1FbCB1c3VhcmlvIHswfSBoYSBzaWRvIGF1dGVudGlmaWNhZG8gY29ycmVjdGFtZW50ZQoramRiY1JlYWxtLmNsb3NlPUV4Y2VwY2nzbiBhbCBjZXJyYXIgbGEgY29uZXhp824gYSBsYSBiYXNlIGRlIGRhdG9zCitqZGJjUmVhbG0uZXhjZXB0aW9uPUV4Y2VwY2nzbiBhbCByZWFsaXphciBsYSBhdXRlbnRpZmljYWNp824KK2pkYmNSZWFsbS5vcGVuPUV4Y2VwY2nzbiBhYnJpZW5kbyBsYSBjb25leGnzbiBhIGxhIGJhc2UgZGUgZGF0b3MKK2puZGlSZWFsbS5hdXRoZW50aWNhdGVGYWlsdXJlPUF1dGVudGlmaWNhY2nzbiBmYWxsaWRhIHBhcmEgZWwgdXN1YXJpbyB7MH0KK2puZGlSZWFsbS5hdXRoZW50aWNhdGVTdWNjZXNzPUF1dGVudGlmaWNhY2nzbiBjb3JyZWN0YSBwYXJhIGVsIHVzdWFyaW8gezB9CitqbmRpUmVhbG0uY2xvc2U9RXhjZXBjafNuIGFsIGNlcnJhciBsYSBjb25leGnzbiBhbCBzZXJ2aWRvciBkZSBkaXJlY3RvcmlvCitqbmRpUmVhbG0uZXhjZXB0aW9uPUV4Y2VwY2nzbiBhbCByZWFsaXphciBsYSBhdXRlbnRpZmljYWNp824KK2puZGlSZWFsbS5vcGVuPUV4Y2VwY2nzbiBhbCBhYnJpciBsYSBjb25leGnzbiBhbCBzZXJ2aWRvciBkZSBkaXJlY3RvcmlvCittZW1vcnlSZWFsbS5hdXRoZW50aWNhdGVGYWlsdXJlPUF1dGVudGlmaWNhY2nzbiBmYWxsaWRhIHBhcmEgZWwgdXN1YXJpbyB7MH0KK21lbW9yeVJlYWxtLmF1dGhlbnRpY2F0ZVN1Y2Nlc3M9QXV0ZW50aWZpY2FjafNuIGNvcnJlY3RhIHBhcmEgZWwgdXN1YXJpbyB7MH0KK21lbW9yeVJlYWxtLmxvYWRFeGlzdD1FbCBmaWNoZXJvIGRlIHVzdWFyaW9zIHswfSBubyBoYSBwb2RpZG8gc2VyIGxl7WRvCittZW1vcnlSZWFsbS5sb2FkUGF0aD1DYXJnYW5kbyBsb3MgdXN1YXJpb3MgZGVzZGUgZWwgZmljaGVybyB7MH0KK21lbW9yeVJlYWxtLnJlYWRYbWw9RXhjZXBjafNuIG1pZW50cmFzIHNlIGxl7WEgZWwgZmljaGVybyBkZSB1c3VhcmlvcworcmVhbG1CYXNlLmFsZ29yaXRobT1FbCBhbGdvcml0bW8gcmVzdW1lbiAoZGlnZXN0KSB7MH0gZXMgaW524WxpZG8KK3JlYWxtQmFzZS5hbHJlYWR5U3RhcnRlZD1Fc3RlIGRvbWluaW8geWEgaGEgc2lkbyBpbmljaWFsaXphZG8KK3JlYWxtQmFzZS5kaWdlc3Q9RXJyb3IgcHJvY2VzYW5kbyBsYXMgY3JlZGVuY2lhbGVzIGRlbCB1c3VhcmlvCityZWFsbUJhc2UuZm9yYmlkZGVuPUVsIGFjY2VzbyBhbCByZWN1cnNvIHBlZGlkbyBoYSBzaWRvIGRlbmVnYWRvCityZWFsbUJhc2UuaGFzUm9sZUZhaWx1cmU9RWwgdXN1YXJpbyB7MH0gTk8gZGVzZW1wZfFhIGVsIHBhcGVsIGRlIHsxfQorcmVhbG1CYXNlLmhhc1JvbGVTdWNjZXNzPUVsIHVzdWFyaW8gezB9IGRlc2VtcGXxYSBlbCBwYXBlbCBkZSB7MX0KK3JlYWxtQmFzZS5ub3RBdXRoZW50aWNhdGVkPUVycm9yIGRlIENvbmZpZ3VyYWNp8246IE5vIHNlIHB1ZWRlbiByZWFsaXphciBmdW5jaW9uZXMgZGUgY29udHJvbCBkZSBhY2Nlc28gc2luIHVuIHByaW5jaXBhbCBhdXRlbnRpZmljYWRvCityZWFsbUJhc2Uubm90U3RhcnRlZD1Fc3RlIGRvbWluaW8gYfpuIG5vIGhhIHNpZG8gaW5pY2lhbGl6YWRvCityZWFsbUJhc2UuYXV0aGVudGljYXRlRmFpbHVyZT1Ob21icmUgZGUgdXN1YXJpbyB7MH0gTk8gYXV0ZW50aWNhZG8gY29uIOl4aXRvCityZWFsbUJhc2UuYXV0aGVudGljYXRlU3VjY2Vzcz1Ob21icmUgZGUgdXN1YXJpbyB7MH0gYXV0ZW50aWNhZG8gY29uIOl4aXRvCit1c2VyRGF0YWJhc2VSZWFsbS5hdXRoZW50aWNhdGVFcnJvcj1FcnJvciBkZSBjb25maWd1cmFjafNuIGRlIExvZ2luIGF1dGVudGljYW5kbyBub21icmUgZGUgdXN1YXJpbyB7MH0KK3VzZXJEYXRhYmFzZVJlYWxtLmxvb2t1cD1FeGNlcGNp824gYnVzY2FuZG8gZW4gQmFzZSBkZSBkYXRvcyBkZSBVc3VhcmlvIG1lZGlhbnRlIGxhIGNsYXZlIHswfQordXNlckRhdGFiYXNlUmVhbG0ubm9EYXRhYmFzZT1ObyBzZSBoYSBoYWxsYWRvIGNvbXBvbmVudGUgZGUgQmFzZSBkZSBkYXRvcyBkZSBVc3VhcmlvIG1lZGlhbnRlIGxhIGNsYXZlIHswfQordXNlckRhdGFiYXNlUmVhbG0ubm9FbmdpbmU9Tm8gc2UgaGEgaGFsbGFkbyBjb21wb25lbnRlIGRlIE1vdG9yIGVuIGplcmFycXXtYSBkZSBjb250ZW5lZG9yCit1c2VyRGF0YWJhc2VSZWFsbS5ub0dsb2JhbD1ObyBzZSBoYSBoYWxsYWRvIGNvbnRleHRvIGRlIHJlY3Vyc29zIGdsb2JhbGVzIEpOREkKK2RhdGFTb3VyY2VSZWFsbS5hdXRoZW50aWNhdGVGYWlsdXJlPU5vbWJyZSBkZSB1c3VhcmlvIHswfSBOTyBhdXRlbnRpY2FkbyBjb24g6XhpdG8KK2RhdGFTb3VyY2VSZWFsbS5hdXRoZW50aWNhdGVTdWNjZXNzPU5vbWJyZSBkZSB1c3VhcmlvIHswfSBhdXRlbnRpY2FkbyBjb24g6XhpdG8KK2RhdGFTb3VyY2VSZWFsbS5jbG9zZT1FeGNlcGNp824gY2VycmFuZG8gY29uZXhp824gYSBiYXNlIGRlIGRhdG9zCitkYXRhU291cmNlUmVhbG0uZXhjZXB0aW9uPUV4Y2VwY2nzbiByZWFsaXphbmRvIGF1dGVudGljYWNp824KK2RhdGFTb3VyY2VSZWFsbS5vcGVuPUV4Y2VwY2nzbiBhYnJpZW5kbyBjb25leGnzbiBhIGJhc2UgZGUgZGF0b3MKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9yZWFsbS9Mb2NhbFN0cmluZ3NfZnIucHJvcGVydGllcyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9yZWFsbS9Mb2NhbFN0cmluZ3NfZnIucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmIzYmEwCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3JlYWxtL0xvY2FsU3RyaW5nc19mci5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNDEgQEAKKyMgJElkJAorCisjIGxhbmd1YWdlCisKKyMgcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtCisKK2phYXNSZWFsbS5hY2NvdW50RXhwaXJlZD1sZSBub20gZCcndXRpbGlzYXRldXIgezB9IE4nJ0EgUEFTIOl06SBhdXRoZW50aWZp6SBjYXIgbGUgY29tcHRlIGEgZXhwaXLpCitqYWFzUmVhbG0uYXV0aGVudGljYXRlU3VjY2Vzcz1sZSBub20gZCcndXRpbGlzYXRldXIgezB9IGEg6XTpIGF1dGhlbnRpZmnpIGF2ZWMgc3VjY+hzCitqYWFzUmVhbG0uY3JlZGVudGlhbEV4cGlyZWQ9bGUgbm9tIGQnJ3V0aWxpc2F0ZXVyIHswfSBOJydBIFBBUyDpdOkgYXV0aGVudGlmaekgY2FyIHNvbiBjculkaXQgYSBleHBpcukgKGV4cGlyZWQgY3JlZGVudGlhbCkKK2phYXNSZWFsbS5mYWlsZWRMb2dpbj1sZSBub20gZCcndXRpbGlzYXRldXIgezB9IE4nJ0EgUEFTIOl06SBhdXRoZW50aWZp6SBjYXIgc29uIGNvbnRy9GxlIGQnJ2FjY+hzIChsb2dpbikgYSDpY2hvdekKK2phYXNSZWFsbS5sb2dpbkV4Y2VwdGlvbj1FeGNlcHRpb24gbG9ycyBkZSBsJydhdXRoZW50aWZpY2F0aW9uIHBhciBsb2dpbiBkdSBub20gZCcndXRpbGlzYXRldXIgezB9CitqZGJjUmVhbG0uYXV0aGVudGljYXRlRmFpbHVyZT1sZSBub20gZCcndXRpbGlzYXRldXIgezB9IE4nJ0EgUEFTIOl06SBhdXRoZW50aWZp6QoramRiY1JlYWxtLmF1dGhlbnRpY2F0ZVN1Y2Nlc3M9bGUgbm9tIGQnJ3V0aWxpc2F0ZXVyIHswfSBhIOl06SBhdXRoZW50aWZp6SBhdmVjIHN1Y2PocworamRiY1JlYWxtLmNsb3NlPUV4Y2VwdGlvbiBsb3JzIGRlIGxhIGZlcm1ldHVyZSBkZSBsYSBjb25uZXhpb24g4CBsYSBiYXNlIGRlIGRvbm7pZXMKK2pkYmNSZWFsbS5leGNlcHRpb249RXhjZXB0aW9uIHBlbmRhbnQgbGUgdHJhaXRlbWVudCBkZSBsJydhdXRoZW50aWZpY2F0aW9uCitqZGJjUmVhbG0ub3Blbj1FeGNlcHRpb24gbG9ycyBkZSBsJydvdXZlcnR1cmUgZGUgbGEgYmFzZSBkZSBkb25u6WVzCitqbmRpUmVhbG0uYXV0aGVudGljYXRlRmFpbHVyZT1MZSBub20gZCcndXRpbGlzYXRldXIgezB9IE4nJ0EgUEFTIOl06SBhdXRoZW50aWZp6Qoram5kaVJlYWxtLmF1dGhlbnRpY2F0ZVN1Y2Nlc3M9TGUgbm9tIGQnJ3V0aWxpc2F0ZXVyIHswfSBhIOl06SBhdXRoZW50aWZp6SBhdmVjIHN1Y2Pocworam5kaVJlYWxtLmNsb3NlPUV4Y2VwdGlvbiBsb3JzIGRlIGxhIGZlcm1ldHVyZSBkZSBsYSBjb25uZXhpb24gYXUgc2VydmV1ciBkJydhY2PocyAoZGlyZWN0b3J5IHNlcnZlcikKK2puZGlSZWFsbS5leGNlcHRpb249RXhjZXB0aW9uIHBlbmRhbnQgbGUgdHJhaXRlbWVudCBkZSBsJydhdXRoZW50aWZpY2F0aW9uCitqbmRpUmVhbG0ub3Blbj1FeGNlcHRpb24gbG9ycyBkZSBsJydvdXZlcnR1cmUgZGUgbGEgY29ubmV4aW9uIGF1IHNlcnZldXIgZCcnYWNj6HMgKGRpcmVjdG9yeSBzZXJ2ZXIpCittZW1vcnlSZWFsbS5hdXRoZW50aWNhdGVGYWlsdXJlPWxlIG5vbSBkJyd1dGlsaXNhdGV1ciB7MH0gTicnQSBQQVMg6XTpIGF1dGhlbnRpZmnpCittZW1vcnlSZWFsbS5hdXRoZW50aWNhdGVTdWNjZXNzPWxlIG5vbSBkJyd1dGlsaXNhdGV1ciB7MH0gYSDpdOkgYXV0aGVudGlmaekgYXZlYyBzdWNj6HMKK21lbW9yeVJlYWxtLmxvYWRFeGlzdD1MZSBmaWNoaWVyIGJhc2UgZGUgZG9ubullcyBt6W1vaXJlIChtZW1vcnkgZGF0YWJhc2UpIHswfSBuZSBwZXV0IOp0cmUgbHUKK21lbW9yeVJlYWxtLmxvYWRQYXRoPUNoYXJnZW1lbnQgZGVzIHV0aWxpc2F0ZXVycyBkZXB1aXMgbGUgZmljaGllciBiYXNlIGRlIGRvbm7pZXMgbeltb2lyZSAobWVtb3J5IGRhdGFiYXNlKSB7MH0KK21lbW9yeVJlYWxtLnJlYWRYbWw9RXhjZXB0aW9uIGxvcnMgZGUgbGEgbGVjdHVyZSBkdSBmaWNoaWVyIGJhc2UgZGUgZG9ubullcyBt6W1vaXJlIChtZW1vcnkgZGF0YWJhc2UpCityZWFsbUJhc2UuYWxnb3JpdGhtPUwnJ2FsZ29yaXRobWUgZCcnZW1wcmVpbnRlIGRlIG1lc3NhZ2UgKG1lc3NhZ2UgZGlnZXN0KSB7MH0gaW5kaXF16SBlc3QgaW52YWxpZGUKK3JlYWxtQmFzZS5hbHJlYWR5U3RhcnRlZD1DZSByb3lhdW1lIChSZWFsbSkgYSBk6WrgIOl06SBk6W1hcnLpCityZWFsbUJhc2UuZGlnZXN0PUVycmV1ciBsb3JzIGR1IHRyYWl0ZW1lbnQgZGVzIGVtcHJlaW50ZXMgKGRpZ2VzdCkgZGVzIGNy6WRpdHMgdXRpbGlzYXRldXIgKHVzZXIgY3JlZGVudGlhbHMpCityZWFsbUJhc2UuZm9yYmlkZGVuPUwnJ2FjY+hzIOAgbGEgcmVzc291cmNlIGRlbWFuZOllIGEg6XTpIGludGVyZGl0CityZWFsbUJhc2UuaGFzUm9sZUZhaWx1cmU9TGUgbm9tIGQnJ3V0aWxpc2F0ZXVyIHswfSBOJydBIFBBUyBkZSBy9GxlIHsxfQorcmVhbG1CYXNlLmhhc1JvbGVTdWNjZXNzPUxlIG5vbSBkJyd1dGlsaXNhdGV1ciB7MH0gYSBwb3VyIHL0bGUgezF9CityZWFsbUJhc2Uubm90QXV0aGVudGljYXRlZD1FcnJldXIgZGUgY29uZmlndXJhdGlvbjogIEltcG9zc2libGUgZGUgY29uZHVpcmUgdW4gY29udHL0bGUgZCcnYWNj6HMgc2FucyB1biBhdXRoZW50aWZp6SBwcmluY2lwYWwgKGF1dGhlbnRpY2F0ZWQgcHJpbmNpcGFsKQorcmVhbG1CYXNlLm5vdFN0YXJ0ZWQ9Q2Ugcm95YXVtZSAoUmVhbG0pIG4nJ2EgcGFzIGVuY29yZSDpdOkgZOltYXJy6QorcmVhbG1CYXNlLmF1dGhlbnRpY2F0ZUZhaWx1cmU9TGUgbm9tIGQnJ3V0aWxpc2F0ZXVyIHswfSBOJydBIFBBUyDpdOkgYXV0aGVudGlmaekKK3JlYWxtQmFzZS5hdXRoZW50aWNhdGVTdWNjZXNzPUxlIG5vbSBkJyd1dGlsaXNhdGV1ciB7MH0gYSDpdOkgYXV0aGVudGlmaekgYXZlYyBzdWNj6HMKK3VzZXJEYXRhYmFzZVJlYWxtLmF1dGhlbnRpY2F0ZUVycm9yPUVycmV1ciBkZSBjb25maWd1cmF0aW9uIGR1IGNvbnRy9GxlIGQnJ2FjY+hzIChsb2dpbikgbG9ycyBkZSBsJydhdXRoZW50aWZpY2F0aW9uIGR1IG5vbSBkJyd1dGlsaXNhdGV1ciB7MH0KK3VzZXJEYXRhYmFzZVJlYWxtLmxvb2t1cD1FeGNlcHRpb24gbG9ycyBkZSBsYSByZWNoZXJjaGUgZGFucyBsYSBiYXNlIGRlIGRvbm7pZXMgdXRpbGlzYXRldXJzIGF2ZWMgbGEgY2xlZiB7MH0KK3VzZXJEYXRhYmFzZVJlYWxtLm5vRGF0YWJhc2U9QXVjdW4gY29tcG9zYW50IGJhc2UgZGUgZG9ubullcyB1dGlsaXNhdGV1cnMgdHJvdXbpIHBvdXIgbGEgY2xlZiB7MH0KK3VzZXJEYXRhYmFzZVJlYWxtLm5vRW5naW5lPUF1Y3VuIGNvbXBvc2FudCBtb3RldXIgKGVuZ2luZSBjb21wb25lbnQpIHRyb3V26SBkYW5zIGxhIGhp6XJhcmNoaWUgZGVzIGNvbnRlbmV1cnMKK3VzZXJEYXRhYmFzZVJlYWxtLm5vR2xvYmFsPUF1Y3VuZSByZXNzb3VyY2UgZ2xvYmFsZSBKTkRJIHRyb3V26WUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9yZWFsbS9Mb2NhbFN0cmluZ3NfamEucHJvcGVydGllcyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9yZWFsbS9Mb2NhbFN0cmluZ3NfamEucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGNmMjA5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3JlYWxtL0xvY2FsU3RyaW5nc19qYS5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNDcgQEAKKyMgJElkJAorCisjIGxhbmd1YWdlIGphCisKKyMgcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtCisKK2phYXNSZWFsbS5hY2NvdW50RXhwaXJlZD1cdTMwZTZcdTMwZmNcdTMwYjZcdTU0MGQgezB9IFx1MzA2Zlx1MzBhMlx1MzBhYlx1MzBhNlx1MzBmM1x1MzBjOFx1MzA2ZVx1NjcxZlx1OTY1MFx1MzA0Y1x1NTIwN1x1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA4Ylx1MzA1Zlx1MzA4MVx1MzA2Ylx1OGE4ZFx1OGEzY1x1MzA1NVx1MzA4Y1x1MzA3ZVx1MzA1Ylx1MzA5MworamFhc1JlYWxtLmF1dGhlbnRpY2F0ZVN1Y2Nlc3M9XHUzMGU2XHUzMGZjXHUzMGI2XHU1NDBkIHswfSBcdTMwNmZcdThhOGRcdThhM2NcdTMwNmJcdTYyMTBcdTUyOWZcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWYKK2phYXNSZWFsbS5jcmVkZW50aWFsRXhwaXJlZD1cdTMwZTZcdTMwZmNcdTMwYjZcdTU0MGQgezB9IFx1MzA2Zlx1OGEzY1x1NjYwZVx1NjZmOFx1MzA2ZVx1NjcxZlx1OTY1MFx1MzA0Y1x1NTIwN1x1MzA4Y1x1MzA1Zlx1MzA1Zlx1MzA4MVx1MzA2Ylx1OGE4ZFx1OGEzY1x1MzA1NVx1MzA4Y1x1MzA3ZVx1MzA1Ylx1MzA5MworamFhc1JlYWxtLmZhaWxlZExvZ2luPVx1MzBlNlx1MzBmY1x1MzBiNlx1NTQwZCB7MH0gXHUzMDZmXHUzMGVkXHUzMGIwXHUzMGE0XHUzMGYzXHUzMDZiXHU1OTMxXHU2NTU3XHUzMDU3XHUzMDVmXHUzMDVmXHUzMDgxXHUzMDZiXHU4YThkXHU4YTNjXHUzMDU1XHUzMDhjXHUzMDdlXHUzMDViXHUzMDkzXHUzMDY3XHUzMDU3XHUzMDVmCitqYWFzUmVhbG0ubG9naW5FeGNlcHRpb249XHUzMGU2XHUzMGZjXHUzMGI2XHU1NDBkIHswfSBcdTMwNmVcdThhOGRcdThhM2NcdTRlMmRcdTMwNmJcdTMwZWRcdTMwYjBcdTMwYTRcdTMwZjNcdTRmOGJcdTU5MTZcdTMwNGNcdTc2N2FcdTc1MWZcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWYKK2phYXNSZWFsbS51bmV4cGVjdGVkRXJyb3I9XHU0ZTg4XHU2ZTJjXHUzMDU3XHUzMDZhXHUzMDQ0XHUzMGE4XHUzMGU5XHUzMGZjXHUzMDY3XHUzMDU5CitqZGJjUmVhbG0uYXV0aGVudGljYXRlRmFpbHVyZT1cdTMwZTZcdTMwZmNcdTMwYjZcdTU0MGQgezB9IFx1MzA2Zlx1OGE4ZFx1OGEzY1x1MzA2Ylx1NTkzMVx1NjU1N1x1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1ZgoramRiY1JlYWxtLmF1dGhlbnRpY2F0ZVN1Y2Nlc3M9XHUzMGU2XHUzMGZjXHUzMGI2XHU1NDBkIHswfSBcdTMwNmZcdThhOGRcdThhM2NcdTMwNmJcdTYyMTBcdTUyOWZcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWYKK2pkYmNSZWFsbS5jbG9zZT1cdTMwYzdcdTMwZmNcdTMwYmZcdTMwZDlcdTMwZmNcdTMwYjlcdTYzYTVcdTdkOWFcdTMwYWZcdTMwZWRcdTMwZmNcdTMwYmFcdTRlMmRcdTMwNmVcdTRmOGJcdTU5MTZcdTMwNjdcdTMwNTkKK2pkYmNSZWFsbS5leGNlcHRpb249XHU4YThkXHU4YTNjXHU1YjlmXHU4ODRjXHU0ZTJkXHUzMDZlXHU0ZjhiXHU1OTE2XHUzMDY3XHUzMDU5CitqZGJjUmVhbG0ub3Blbj1cdTMwYzdcdTMwZmNcdTMwYmZcdTMwZDlcdTMwZmNcdTMwYjlcdTYzYTVcdTdkOWFcdTMwYWFcdTMwZmNcdTMwZDdcdTMwZjNcdTRlMmRcdTMwNmJcdTRmOGJcdTU5MTZcdTMwNGNcdTc2N2FcdTc1MWZcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWYKK2puZGlSZWFsbS5hdXRoZW50aWNhdGVGYWlsdXJlPVx1MzBlNlx1MzBmY1x1MzBiNlx1NTQwZCB7MH0gXHUzMDZmXHU4YThkXHU4YTNjXHUzMDZiXHU1OTMxXHU2NTU3XHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmCitqbmRpUmVhbG0uYXV0aGVudGljYXRlU3VjY2Vzcz1cdTMwZTZcdTMwZmNcdTMwYjZcdTU0MGQgezB9IFx1MzA2Zlx1OGE4ZFx1OGEzY1x1MzA2Ylx1NjIxMFx1NTI5Zlx1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1Zgoram5kaVJlYWxtLmNsb3NlPVx1MzBjN1x1MzBhM1x1MzBlY1x1MzBhZlx1MzBjOFx1MzBlYVx1MzBiNVx1MzBmY1x1MzBkMFx1NjNhNVx1N2Q5YVx1MzBhZlx1MzBlZFx1MzBmY1x1MzBiYVx1NGUyZFx1MzA2ZVx1NGY4Ylx1NTkxNlx1MzA2N1x1MzA1OQoram5kaVJlYWxtLmV4Y2VwdGlvbj1cdThhOGRcdThhM2NcdTViOWZcdTg4NGNcdTRlMmRcdTMwNmVcdTRmOGJcdTU5MTZcdTMwNjdcdTMwNTkKK2puZGlSZWFsbS5vcGVuPVx1MzBjN1x1MzBhM1x1MzBlY1x1MzBhZlx1MzBjOFx1MzBlYVx1MzBiNVx1MzBmY1x1MzBkMFx1NjNhNVx1N2Q5YVx1MzBhYVx1MzBmY1x1MzBkN1x1MzBmM1x1NGUyZFx1MzA2ZVx1NGY4Ylx1NTkxNlx1MzA2N1x1MzA1OQorbWVtb3J5UmVhbG0uYXV0aGVudGljYXRlRmFpbHVyZT1cdTMwZTZcdTMwZmNcdTMwYjZcdTU0MGQgezB9IFx1MzA2Zlx1OGE4ZFx1OGEzY1x1MzA2Ylx1NTkzMVx1NjU1N1x1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1ZgorbWVtb3J5UmVhbG0uYXV0aGVudGljYXRlU3VjY2Vzcz1cdTMwZTZcdTMwZmNcdTMwYjZcdTU0MGQgezB9IFx1MzA2Zlx1OGE4ZFx1OGEzY1x1MzA2Ylx1NjIxMFx1NTI5Zlx1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1ZgorbWVtb3J5UmVhbG0ubG9hZEV4aXN0PVx1MzBlMVx1MzBlMlx1MzBlYVx1MzBjN1x1MzBmY1x1MzBiZlx1MzBkOVx1MzBmY1x1MzBiOVx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYiB7MH0gXHUzMDkyXHU4YWFkXHUzMDgwXHUzMDUzXHUzMDY4XHUzMDRjXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzCittZW1vcnlSZWFsbS5sb2FkUGF0aD1cdTMwZTFcdTMwZTJcdTMwZWFcdTMwYzdcdTMwZmNcdTMwYmZcdTMwZDlcdTMwZmNcdTMwYjlcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWIgezB9IFx1MzA0Ylx1MzA4OVx1MzBlNlx1MzBmY1x1MzBiNlx1MzA5Mlx1MzBlZFx1MzBmY1x1MzBjOVx1MzA1N1x1MzA3ZVx1MzA1OQorbWVtb3J5UmVhbG0ucmVhZFhtbD1cdTMwZTFcdTMwZTJcdTMwZWFcdTMwYzdcdTMwZmNcdTMwYmZcdTMwZDlcdTMwZmNcdTMwYjlcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTMwOTJcdThhYWRcdTMwN2ZcdThmYmNcdTMwN2ZcdTRlMmRcdTMwNmVcdTRmOGJcdTU5MTZcdTMwNjdcdTMwNTkKK3JlYWxtQmFzZS5hbGdvcml0aG09XHU3MTIxXHU1MmI5XHUzMDZhXHUzMGUxXHUzMGMzXHUzMGJiXHUzMGZjXHUzMGI4XHUzMGMwXHUzMGE0XHUzMGI4XHUzMGE3XHUzMGI5XHUzMGM4XHUzMGEyXHUzMGViXHUzMGI0XHUzMGVhXHUzMGJhXHUzMGUwIHswfSBcdTMwNGNcdTYzMDdcdTViOWFcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkKK3JlYWxtQmFzZS5hbHJlYWR5U3RhcnRlZD1cdTMwNTNcdTMwNmVcdTMwZWNcdTMwZWJcdTMwZTBcdTMwNmZcdTY1ZTJcdTMwNmJcdThkNzdcdTUyZDVcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkKK3JlYWxtQmFzZS5kaWdlc3Q9XHUzMGU2XHUzMGZjXHUzMGI2XHUzMDZlXHU4YTNjXHU2NjBlXHU2NmY4XHUzMDZlXHUzMGMwXHUzMGE0XHUzMGI4XHUzMGE3XHUzMGI5XHUzMGM4XHUzMGE4XHUzMGU5XHUzMGZjCityZWFsbUJhc2UuZm9yYmlkZGVuPVx1ODk4MVx1NmM0Mlx1MzA1NVx1MzA4Y1x1MzA1Zlx1MzBlYVx1MzBiZFx1MzBmY1x1MzBiOVx1MzA3OFx1MzA2ZVx1MzBhMlx1MzBhZlx1MzBiYlx1MzBiOVx1MzA0Y1x1NjJkMlx1NTQyNlx1MzA1NVx1MzA4Y1x1MzA3ZVx1MzA1N1x1MzA1ZgorcmVhbG1CYXNlLmhhc1JvbGVGYWlsdXJlPVx1MzBlNlx1MzBmY1x1MzBiNlx1NTQwZCB7MH0gXHUzMDZmXHUzMGVkXHUzMGZjXHUzMGViIHsxfSBcdTMwOTJcdTYzMDFcdTMwNjNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNWJcdTMwOTMKK3JlYWxtQmFzZS5oYXNSb2xlU3VjY2Vzcz1cdTMwZTZcdTMwZmNcdTMwYjZcdTU0MGQgezB9IFx1MzA2Zlx1MzBlZFx1MzBmY1x1MzBlYiB7MX0gXHUzMDkyXHU2MzAxXHUzMDYzXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5CityZWFsbUJhc2Uubm90QXV0aGVudGljYXRlZD1cdThhMmRcdTViOWFcdTMwYThcdTMwZTlcdTMwZmM6ICBcdThhOGRcdThhM2NcdTMwNTVcdTMwOGNcdTMwNWZcdTRlM2JcdTRmNTNcdTMwNmFcdTMwNTdcdTMwNjdcdTMwNmZcdTMwYTJcdTMwYWZcdTMwYmJcdTMwYjlcdTUyMzZcdTVmYTFcdTMwNGNcdTViOWZcdTg4NGNcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMKK3JlYWxtQmFzZS5ub3RTdGFydGVkPVx1MzA1M1x1MzA2ZVx1MzBlY1x1MzBlYlx1MzBlMFx1MzA2Zlx1MzA3ZVx1MzA2MFx1OGQ3N1x1NTJkNVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5MworcmVhbG1CYXNlLmF1dGhlbnRpY2F0ZUZhaWx1cmU9XHUzMGU2XHUzMGZjXHUzMGI2XHU1NDBkIHswfSBcdTMwNmZcdThhOGRcdThhM2NcdTMwNmJcdTU5MzFcdTY1NTdcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWYKK3JlYWxtQmFzZS5hdXRoZW50aWNhdGVTdWNjZXNzPVx1MzBlNlx1MzBmY1x1MzBiNlx1NTQwZCB7MH0gXHUzMDZmXHU4YThkXHU4YTNjXHUzMDZiXHU2MjEwXHU1MjlmXHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmCit1c2VyRGF0YWJhc2VSZWFsbS5hdXRoZW50aWNhdGVFcnJvcj1cdTMwZTZcdTMwZmNcdTMwYjZcdTU0MGQgezB9IFx1MzA5Mlx1OGE4ZFx1OGEzY1x1NGUyZFx1MzA2Ylx1MzBlZFx1MzBiMFx1MzBhNFx1MzBmM1x1OGEyZFx1NWI5YVx1MzBhOFx1MzBlOVx1MzBmY1x1MzA0Y1x1NzY3YVx1NzUxZlx1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1ZgordXNlckRhdGFiYXNlUmVhbG0ubG9va3VwPVx1MzBhZFx1MzBmYyB7MH0gXHUzMDY3XHUzMGU2XHUzMGZjXHUzMGI2XHUzMGM3XHUzMGZjXHUzMGJmXHUzMGQ5XHUzMGZjXHUzMGI5XHUzMDkyXHU2OTFjXHU3ZDIyXHU0ZTJkXHUzMDZlXHU0ZjhiXHU1OTE2XHUzMDY3XHUzMDU5Cit1c2VyRGF0YWJhc2VSZWFsbS5ub0RhdGFiYXNlPVx1MzBhZFx1MzBmYyB7MH0gXHUzMDY3XHUzMGU2XHUzMGZjXHUzMGI2XHUzMGM3XHUzMGZjXHUzMGJmXHUzMGQ5XHUzMGZjXHUzMGI5XHUzMGIzXHUzMGYzXHUzMGRkXHUzMGZjXHUzMGNkXHUzMGYzXHUzMGM4XHUzMDRjXHU4OThiXHUzMDY0XHUzMDRiXHUzMDhhXHUzMDdlXHUzMDViXHUzMDkzCit1c2VyRGF0YWJhc2VSZWFsbS5ub0VuZ2luZT1cdTMwYjNcdTMwZjNcdTMwYzZcdTMwY2FcdTk2OGVcdTVjNjRcdTRlMmRcdTMwNmJcdTMwYThcdTMwZjNcdTMwYjhcdTMwZjNcdTMwYjNcdTMwZjNcdTMwZGRcdTMwZmNcdTMwY2RcdTMwZjNcdTMwYzhcdTMwNGNcdTg5OGJcdTMwNjRcdTMwNGJcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTMKK3VzZXJEYXRhYmFzZVJlYWxtLm5vR2xvYmFsPVx1MzBiMFx1MzBlZFx1MzBmY1x1MzBkMFx1MzBlYlx1MzA2YUpORElcdTMwZWFcdTMwYmRcdTMwZmNcdTMwYjlcdTMwYjNcdTMwZjNcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzhcdTMwNGNcdTg5OGJcdTMwNjRcdTMwNGJcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTMKK2RhdGFTb3VyY2VSZWFsbS5hdXRoZW50aWNhdGVGYWlsdXJlPVx1MzBlNlx1MzBmY1x1MzBiNlx1NTQwZCB7MH0gXHUzMDZmXHU4YThkXHU4YTNjXHUzMDZiXHU1OTMxXHU2NTU3XHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmCitkYXRhU291cmNlUmVhbG0uYXV0aGVudGljYXRlU3VjY2Vzcz1cdTMwZTZcdTMwZmNcdTMwYjZcdTU0MGQgezB9IFx1MzA2Zlx1OGE4ZFx1OGEzY1x1MzA2Ylx1NjIxMFx1NTI5Zlx1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1ZgorZGF0YVNvdXJjZVJlYWxtLmNsb3NlPVx1MzBjN1x1MzBmY1x1MzBiZlx1MzBkOVx1MzBmY1x1MzBiOVx1NjNhNVx1N2Q5YVx1MzA5Mlx1MzBhZlx1MzBlZFx1MzBmY1x1MzBiYVx1NGUyZFx1MzA2ZVx1NGY4Ylx1NTkxNlx1MzA2N1x1MzA1OQorZGF0YVNvdXJjZVJlYWxtLmV4Y2VwdGlvbj1cdThhOGRcdThhM2NcdTMwOTJcdTViOWZcdTg4NGNcdTRlMmRcdTMwNmVcdTRmOGJcdTU5MTZcdTMwNjdcdTMwNTkKK2RhdGFTb3VyY2VSZWFsbS5vcGVuPVx1MzBjN1x1MzBmY1x1MzBiZlx1MzBkOVx1MzBmY1x1MzBiOVx1NjNhNVx1N2Q5YVx1MzA5Mlx1MzBhYVx1MzBmY1x1MzBkN1x1MzBmM1x1NGUyZFx1MzA2ZVx1NGY4Ylx1NTkxNlx1MzA2N1x1MzA1OQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3JlYWxtL01lbW9yeVJlYWxtLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvcmVhbG0vTWVtb3J5UmVhbG0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmNiMTM5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3JlYWxtL01lbW9yeVJlYWxtLmphdmEKQEAgLTAsMCArMSwzMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEucmVhbG07CisKKworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGFpbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5TdHJpbmdNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuZGlnZXN0ZXIuRGlnZXN0ZXI7CisKKworLyoqCisgKiBTaW1wbGUgaW1wbGVtZW50YXRpb24gb2YgPGI+UmVhbG08L2I+IHRoYXQgcmVhZHMgYW4gWE1MIGZpbGUgdG8gY29uZmlndXJlCisgKiB0aGUgdmFsaWQgdXNlcnMsIHBhc3N3b3JkcywgYW5kIHJvbGVzLiAgVGhlIGZpbGUgZm9ybWF0IChhbmQgZGVmYXVsdCBmaWxlCisgKiBsb2NhdGlvbikgYXJlIGlkZW50aWNhbCB0byB0aG9zZSBjdXJyZW50bHkgc3VwcG9ydGVkIGJ5IFRvbWNhdCAzLlguCisgKiA8cD4KKyAqIDxzdHJvbmc+SU1QTEVNRU5UQVRJT04gTk9URTwvc3Ryb25nPjogSXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBpbi1tZW1vcnkKKyAqIGNvbGxlY3Rpb24gcmVwcmVzZW50aW5nIG91ciBkZWZpbmVkIHVzZXJzIChhbmQgdGhlaXIgcm9sZXMpIGlzIGluaXRpYWxpemVkCisgKiBhdCBhcHBsaWNhdGlvbiBzdGFydHVwIGFuZCBuZXZlciBtb2RpZmllZCBhZ2Fpbi4gIFRoZXJlZm9yZSwgbm8gdGhyZWFkCisgKiBzeW5jaHJvbml6YXRpb24gaXMgcGVyZm9ybWVkIGFyb3VuZCBhY2Nlc3NlcyB0byB0aGUgcHJpbmNpcGFscyBjb2xsZWN0aW9uLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgTWVtb3J5UmVhbG0gIGV4dGVuZHMgUmVhbG1CYXNlIHsKKworICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhNZW1vcnlSZWFsbS5jbGFzcyk7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIENvbnRhaW5lciB3aXRoIHdoaWNoIHRoaXMgUmVhbG0gaXMgYXNzb2NpYXRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIENvbnRhaW5lciBjb250YWluZXIgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgRGlnZXN0ZXIgd2Ugd2lsbCB1c2UgdG8gcHJvY2VzcyBpbi1tZW1vcnkgZGF0YWJhc2UgZmlsZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgRGlnZXN0ZXIgZGlnZXN0ZXIgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBEZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIFJlYWxtIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgaW5mbyA9CisgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtLk1lbW9yeVJlYWxtLzEuMCI7CisKKworICAgIC8qKgorICAgICAqIERlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgUmVhbG0gaW1wbGVtZW50YXRpb24uCisgICAgICovCisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBuYW1lID0gIk1lbW9yeVJlYWxtIjsKKworCisgICAgLyoqCisgICAgICogVGhlIHBhdGhuYW1lIChhYnNvbHV0ZSBvciByZWxhdGl2ZSB0byBDYXRhbGluYSdzIGN1cnJlbnQgd29ya2luZworICAgICAqIGRpcmVjdG9yeSkgb2YgdGhlIFhNTCBmaWxlIGNvbnRhaW5pbmcgb3VyIGRhdGFiYXNlIGluZm9ybWF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHBhdGhuYW1lID0gImNvbmYvdG9tY2F0LXVzZXJzLnhtbCI7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzZXQgb2YgdmFsaWQgUHJpbmNpcGFscyBmb3IgdGhpcyBSZWFsbSwga2V5ZWQgYnkgdXNlciBuYW1lLgorICAgICAqLworICAgIHByaXZhdGUgSGFzaE1hcCBwcmluY2lwYWxzID0gbmV3IEhhc2hNYXAoKTsKKworCisgICAgLyoqCisgICAgICogVGhlIHN0cmluZyBtYW5hZ2VyIGZvciB0aGlzIHBhY2thZ2UuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nTWFuYWdlciBzbSA9CisgICAgICAgIFN0cmluZ01hbmFnZXIuZ2V0TWFuYWdlcihDb25zdGFudHMuUGFja2FnZSk7CisKKworICAgIC8qKgorICAgICAqIEhhcyB0aGlzIGNvbXBvbmVudCBiZWVuIHN0YXJ0ZWQ/CisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHN0YXJ0ZWQgPSBmYWxzZTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIFJlYWxtIGltcGxlbWVudGF0aW9uIGFuZAorICAgICAqIHRoZSBjb3JyZXNwb25kaW5nIHZlcnNpb24gbnVtYmVyLCBpbiB0aGUgZm9ybWF0CisgICAgICogPGNvZGU+Jmx0O2Rlc2NyaXB0aW9uJmd0Oy8mbHQ7dmVyc2lvbiZndDs8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5mbygpIHsKKworICAgICAgICByZXR1cm4gaW5mbzsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBwYXRobmFtZSBvZiBvdXIgWE1MIGZpbGUgY29udGFpbmluZyB1c2VyIGRlZmluaXRpb25zLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aG5hbWUoKSB7CisKKyAgICAgICAgcmV0dXJuIHBhdGhuYW1lOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHBhdGhuYW1lIG9mIG91ciBYTUwgZmlsZSBjb250YWluaW5nIHVzZXIgZGVmaW5pdGlvbnMuICBJZiBhCisgICAgICogcmVsYXRpdmUgcGF0aG5hbWUgaXMgc3BlY2lmaWVkLCBpdCBpcyByZXNvbHZlZCBhZ2FpbnN0ICJjYXRhbGluYS5iYXNlIi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXRobmFtZSBUaGUgbmV3IHBhdGhuYW1lCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGF0aG5hbWUoU3RyaW5nIHBhdGhuYW1lKSB7CisKKyAgICAgICAgdGhpcy5wYXRobmFtZSA9IHBhdGhuYW1lOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBQcmluY2lwYWwgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgdXNlcm5hbWUgYW5kCisgICAgICogY3JlZGVudGlhbHMsIGlmIHRoZXJlIGlzIG9uZTsgb3RoZXJ3aXNlIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1c2VybmFtZSBVc2VybmFtZSBvZiB0aGUgUHJpbmNpcGFsIHRvIGxvb2sgdXAKKyAgICAgKiBAcGFyYW0gY3JlZGVudGlhbHMgUGFzc3dvcmQgb3Igb3RoZXIgY3JlZGVudGlhbHMgdG8gdXNlIGluCisgICAgICogIGF1dGhlbnRpY2F0aW5nIHRoaXMgdXNlcm5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgUHJpbmNpcGFsIGF1dGhlbnRpY2F0ZShTdHJpbmcgdXNlcm5hbWUsIFN0cmluZyBjcmVkZW50aWFscykgeworCisgICAgICAgIEdlbmVyaWNQcmluY2lwYWwgcHJpbmNpcGFsID0KKyAgICAgICAgICAgIChHZW5lcmljUHJpbmNpcGFsKSBwcmluY2lwYWxzLmdldCh1c2VybmFtZSk7CisKKyAgICAgICAgYm9vbGVhbiB2YWxpZGF0ZWQgPSBmYWxzZTsKKyAgICAgICAgaWYgKHByaW5jaXBhbCAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoaGFzTWVzc2FnZURpZ2VzdCgpKSB7CisgICAgICAgICAgICAgICAgLy8gSGV4IGhhc2hlcyBzaG91bGQgYmUgY29tcGFyZWQgY2FzZS1pbnNlbnNpdGl2ZQorICAgICAgICAgICAgICAgIHZhbGlkYXRlZCA9IChkaWdlc3QoY3JlZGVudGlhbHMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5lcXVhbHNJZ25vcmVDYXNlKHByaW5jaXBhbC5nZXRQYXNzd29yZCgpKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHZhbGlkYXRlZCA9CisgICAgICAgICAgICAgICAgICAgIChkaWdlc3QoY3JlZGVudGlhbHMpLmVxdWFscyhwcmluY2lwYWwuZ2V0UGFzc3dvcmQoKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHZhbGlkYXRlZCkgeworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhzbS5nZXRTdHJpbmcoIm1lbW9yeVJlYWxtLmF1dGhlbnRpY2F0ZVN1Y2Nlc3MiLCB1c2VybmFtZSkpOworICAgICAgICAgICAgcmV0dXJuIChwcmluY2lwYWwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhzbS5nZXRTdHJpbmcoIm1lbW9yeVJlYWxtLmF1dGhlbnRpY2F0ZUZhaWx1cmUiLCB1c2VybmFtZSkpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQYWNrYWdlIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogQWRkIGEgbmV3IHVzZXIgdG8gdGhlIGluLW1lbW9yeSBkYXRhYmFzZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1c2VybmFtZSBVc2VyJ3MgdXNlcm5hbWUKKyAgICAgKiBAcGFyYW0gcGFzc3dvcmQgVXNlcidzIHBhc3N3b3JkIChjbGVhciB0ZXh0KQorICAgICAqIEBwYXJhbSByb2xlcyBDb21tYS1kZWxpbWl0ZWQgc2V0IG9mIHJvbGVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHVzZXIKKyAgICAgKi8KKyAgICB2b2lkIGFkZFVzZXIoU3RyaW5nIHVzZXJuYW1lLCBTdHJpbmcgcGFzc3dvcmQsIFN0cmluZyByb2xlcykgeworCisgICAgICAgIC8vIEFjY3VtdWxhdGUgdGhlIGxpc3Qgb2Ygcm9sZXMgZm9yIHRoaXMgdXNlcgorICAgICAgICBBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgcm9sZXMgKz0gIiwiOworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgaW50IGNvbW1hID0gcm9sZXMuaW5kZXhPZignLCcpOworICAgICAgICAgICAgaWYgKGNvbW1hIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIFN0cmluZyByb2xlID0gcm9sZXMuc3Vic3RyaW5nKDAsIGNvbW1hKS50cmltKCk7CisgICAgICAgICAgICBsaXN0LmFkZChyb2xlKTsKKyAgICAgICAgICAgIHJvbGVzID0gcm9sZXMuc3Vic3RyaW5nKGNvbW1hICsgMSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBDb25zdHJ1Y3QgYW5kIGNhY2hlIHRoZSBQcmluY2lwYWwgZm9yIHRoaXMgdXNlcgorICAgICAgICBHZW5lcmljUHJpbmNpcGFsIHByaW5jaXBhbCA9CisgICAgICAgICAgICBuZXcgR2VuZXJpY1ByaW5jaXBhbCh0aGlzLCB1c2VybmFtZSwgcGFzc3dvcmQsIGxpc3QpOworICAgICAgICBwcmluY2lwYWxzLnB1dCh1c2VybmFtZSwgcHJpbmNpcGFsKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3RlY3RlZCBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIGNvbmZpZ3VyZWQgPGNvZGU+RGlnZXN0ZXI8L2NvZGU+IHRvIHVzZSBmb3IgcHJvY2Vzc2luZworICAgICAqIHRoZSBYTUwgaW5wdXQgZmlsZSwgY3JlYXRpbmcgYSBuZXcgb25lIGlmIG5lY2Vzc2FyeS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIERpZ2VzdGVyIGdldERpZ2VzdGVyKCkgeworCisgICAgICAgIGlmIChkaWdlc3RlciA9PSBudWxsKSB7CisgICAgICAgICAgICBkaWdlc3RlciA9IG5ldyBEaWdlc3RlcigpOworICAgICAgICAgICAgZGlnZXN0ZXIuc2V0VmFsaWRhdGluZyhmYWxzZSk7CisgICAgICAgICAgICBkaWdlc3Rlci5hZGRSdWxlU2V0KG5ldyBNZW1vcnlSdWxlU2V0KCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoZGlnZXN0ZXIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBzaG9ydCBuYW1lIGZvciB0aGlzIFJlYWxtIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0TmFtZSgpIHsKKworICAgICAgICByZXR1cm4gKG5hbWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHBhc3N3b3JkIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gcHJpbmNpcGFsJ3MgdXNlciBuYW1lLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UGFzc3dvcmQoU3RyaW5nIHVzZXJuYW1lKSB7CisKKyAgICAgICAgR2VuZXJpY1ByaW5jaXBhbCBwcmluY2lwYWwgPQorICAgICAgICAgICAgKEdlbmVyaWNQcmluY2lwYWwpIHByaW5jaXBhbHMuZ2V0KHVzZXJuYW1lKTsKKyAgICAgICAgaWYgKHByaW5jaXBhbCAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gKHByaW5jaXBhbC5nZXRQYXNzd29yZCgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBQcmluY2lwYWwgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiB1c2VyIG5hbWUuCisgICAgICovCisgICAgcHJvdGVjdGVkIFByaW5jaXBhbCBnZXRQcmluY2lwYWwoU3RyaW5nIHVzZXJuYW1lKSB7CisKKyAgICAgICAgcmV0dXJuIChQcmluY2lwYWwpIHByaW5jaXBhbHMuZ2V0KHVzZXJuYW1lKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIExpZmVjeWNsZSBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFByZXBhcmUgZm9yIGFjdGl2ZSB1c2Ugb2YgdGhlIHB1YmxpYyBtZXRob2RzIG9mIHRoaXMgQ29tcG9uZW50LgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBMaWZlY3ljbGVFeGNlcHRpb24gaWYgdGhpcyBjb21wb25lbnQgZGV0ZWN0cyBhIGZhdGFsIGVycm9yCisgICAgICogIHRoYXQgcHJldmVudHMgaXQgZnJvbSBiZWluZyBzdGFydGVkCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHN0YXJ0KCkgdGhyb3dzIExpZmVjeWNsZUV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gVmFsaWRhdGUgdGhlIGV4aXN0ZW5jZSBvZiBvdXIgZGF0YWJhc2UgZmlsZQorICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShwYXRobmFtZSk7CisgICAgICAgIGlmICghZmlsZS5pc0Fic29sdXRlKCkpCisgICAgICAgICAgICBmaWxlID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJjYXRhbGluYS5iYXNlIiksIHBhdGhuYW1lKTsKKyAgICAgICAgaWYgKCFmaWxlLmV4aXN0cygpIHx8ICFmaWxlLmNhblJlYWQoKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBMaWZlY3ljbGVFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJtZW1vcnlSZWFsbS5sb2FkRXhpc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSkpOworCisgICAgICAgIC8vIExvYWQgdGhlIGNvbnRlbnRzIG9mIHRoZSBkYXRhYmFzZSBmaWxlCisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZyhzbS5nZXRTdHJpbmcoIm1lbW9yeVJlYWxtLmxvYWRQYXRoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSkpOworICAgICAgICBEaWdlc3RlciBkaWdlc3RlciA9IGdldERpZ2VzdGVyKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGRpZ2VzdGVyKSB7CisgICAgICAgICAgICAgICAgZGlnZXN0ZXIucHVzaCh0aGlzKTsKKyAgICAgICAgICAgICAgICBkaWdlc3Rlci5wYXJzZShmaWxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBMaWZlY3ljbGVFeGNlcHRpb24oIm1lbW9yeVJlYWxtLnJlYWRYbWwiLCBlKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGRpZ2VzdGVyLnJlc2V0KCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBQZXJmb3JtIG5vcm1hbCBzdXBlcmNsYXNzIGluaXRpYWxpemF0aW9uCisgICAgICAgIHN1cGVyLnN0YXJ0KCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdyYWNlZnVsbHkgc2h1dCBkb3duIGFjdGl2ZSB1c2Ugb2YgdGhlIHB1YmxpYyBtZXRob2RzIG9mIHRoaXMgQ29tcG9uZW50LgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBMaWZlY3ljbGVFeGNlcHRpb24gaWYgdGhpcyBjb21wb25lbnQgZGV0ZWN0cyBhIGZhdGFsIGVycm9yCisgICAgICogIHRoYXQgbmVlZHMgdG8gYmUgcmVwb3J0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc3RvcCgpIHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb24geworCisgICAgICAgIC8vIFBlcmZvcm0gbm9ybWFsIHN1cGVyY2xhc3MgZmluYWxpemF0aW9uCisgICAgICAgIHN1cGVyLnN0b3AoKTsKKworICAgICAgICAvLyBObyBzaHV0ZG93biBhY3Rpdml0aWVzIHJlcXVpcmVkCisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3JlYWxtL01lbW9yeVJ1bGVTZXQuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9yZWFsbS9NZW1vcnlSdWxlU2V0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRkYjVjOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9yZWFsbS9NZW1vcnlSdWxlU2V0LmphdmEKQEAgLTAsMCArMSwxMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OS0yMDAxLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5yZWFsbTsKKworCitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5kaWdlc3Rlci5EaWdlc3RlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvbWNhdC51dGlsLmRpZ2VzdGVyLlJ1bGU7CitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5kaWdlc3Rlci5SdWxlU2V0QmFzZTsKK2ltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOworCisKKy8qKgorICogPHA+PHN0cm9uZz5SdWxlU2V0PC9zdHJvbmc+IGZvciByZWNvZ25pemluZyB0aGUgdXNlcnMgZGVmaW5lZCBpbiB0aGUKKyAqIFhNTCBmaWxlIHByb2Nlc3NlZCBieSA8Y29kZT5NZW1vcnlSZWFsbTwvY29kZT4uPC9wPgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgTWVtb3J5UnVsZVNldCBleHRlbmRzIFJ1bGVTZXRCYXNlIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBtYXRjaGluZyBwYXR0ZXJuIHByZWZpeCB0byB1c2UgZm9yIHJlY29nbml6aW5nIG91ciBlbGVtZW50cy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHByZWZpeCA9IG51bGw7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcgorCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYW4gaW5zdGFuY2Ugb2YgdGhpcyA8Y29kZT5SdWxlU2V0PC9jb2RlPiB3aXRoIHRoZSBkZWZhdWx0CisgICAgICogbWF0Y2hpbmcgcGF0dGVybiBwcmVmaXguCisgICAgICovCisgICAgcHVibGljIE1lbW9yeVJ1bGVTZXQoKSB7CisKKyAgICAgICAgdGhpcygidG9tY2F0LXVzZXJzLyIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYW4gaW5zdGFuY2Ugb2YgdGhpcyA8Y29kZT5SdWxlU2V0PC9jb2RlPiB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBtYXRjaGluZyBwYXR0ZXJuIHByZWZpeC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcmVmaXggUHJlZml4IGZvciBtYXRjaGluZyBwYXR0ZXJuIHJ1bGVzIChpbmNsdWRpbmcgdGhlCisgICAgICogIHRyYWlsaW5nIHNsYXNoIGNoYXJhY3RlcikKKyAgICAgKi8KKyAgICBwdWJsaWMgTWVtb3J5UnVsZVNldChTdHJpbmcgcHJlZml4KSB7CisKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgdGhpcy5uYW1lc3BhY2VVUkkgPSBudWxsOworICAgICAgICB0aGlzLnByZWZpeCA9IHByZWZpeDsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIDxwPkFkZCB0aGUgc2V0IG9mIFJ1bGUgaW5zdGFuY2VzIGRlZmluZWQgaW4gdGhpcyBSdWxlU2V0IHRvIHRoZQorICAgICAqIHNwZWNpZmllZCA8Y29kZT5EaWdlc3RlcjwvY29kZT4gaW5zdGFuY2UsIGFzc29jaWF0aW5nIHRoZW0gd2l0aAorICAgICAqIG91ciBuYW1lc3BhY2UgVVJJIChpZiBhbnkpLiAgVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgY2FsbGVkCisgICAgICogYnkgYSBEaWdlc3RlciBpbnN0YW5jZS48L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gZGlnZXN0ZXIgRGlnZXN0ZXIgaW5zdGFuY2UgdG8gd2hpY2ggdGhlIG5ldyBSdWxlIGluc3RhbmNlcworICAgICAqICBzaG91bGQgYmUgYWRkZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkUnVsZUluc3RhbmNlcyhEaWdlc3RlciBkaWdlc3RlcikgeworCisgICAgICAgIGRpZ2VzdGVyLmFkZFJ1bGUocHJlZml4ICsgInVzZXIiLCBuZXcgTWVtb3J5VXNlclJ1bGUoKSk7CisKKyAgICB9CisKKworfQorCisKKy8qKgorICogUHJpdmF0ZSBjbGFzcyB1c2VkIHdoZW4gcGFyc2luZyB0aGUgWE1MIGRhdGFiYXNlIGZpbGUuCisgKi8KK2ZpbmFsIGNsYXNzIE1lbW9yeVVzZXJSdWxlIGV4dGVuZHMgUnVsZSB7CisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIDxjb2RlPlJ1bGU8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBNZW1vcnlVc2VyUnVsZSgpIHsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgYSA8Y29kZT4mbHQ7dXNlciZndDs8L2NvZGU+IGVsZW1lbnQgZnJvbSB0aGUgWE1MIGRhdGFiYXNlIGZpbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXR0cmlidXRlcyBUaGUgYXR0cmlidXRlIGxpc3QgZm9yIHRoaXMgZWxlbWVudAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGJlZ2luKFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBuYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIFN0cmluZyB1c2VybmFtZSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoIm5hbWUiKTsKKyAgICAgICAgaWYgKHVzZXJuYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgIHVzZXJuYW1lID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgidXNlcm5hbWUiKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgcGFzc3dvcmQgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJwYXNzd29yZCIpOworICAgICAgICBTdHJpbmcgcm9sZXMgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJyb2xlcyIpOworCisgICAgICAgIE1lbW9yeVJlYWxtIHJlYWxtID0KKyAgICAgICAgICAgIChNZW1vcnlSZWFsbSkgZGlnZXN0ZXIucGVlayhkaWdlc3Rlci5nZXRDb3VudCgpIC0gMSk7CisgICAgICAgIHJlYWxtLmFkZFVzZXIodXNlcm5hbWUsIHBhc3N3b3JkLCByb2xlcyk7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3JlYWxtL1JlYWxtQmFzZS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3JlYWxtL1JlYWxtQmFzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjMDkwYzMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvcmVhbG0vUmVhbG1CYXNlLmphdmEKQEAgLTAsMCArMSwxMTg5IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtOworCisKK2ltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7CitpbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZVN1cHBvcnQ7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3Q7CitpbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5QcmluY2lwYWw7CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5BdHRyaWJ1dGU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblJlZ2lzdHJhdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGFpbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZUxpc3RlbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuUmVhbG07CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuUmVxdWVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3Rvci5SZXNwb25zZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuQ29udGFpbmVyQmFzZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5Mb2dpbkNvbmZpZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5TZWN1cml0eUNvbnN0cmFpbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuU2VjdXJpdHlDb2xsZWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5IZXhVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuTGlmZWN5Y2xlU3VwcG9ydDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuTUQ1RW5jb2RlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuU3RyaW5nTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubW9kZWxlci5SZWdpc3RyeTsKKworLyoqCisgKiBTaW1wbGUgaW1wbGVtZW50YXRpb24gb2YgPGI+UmVhbG08L2I+IHRoYXQgcmVhZHMgYW4gWE1MIGZpbGUgdG8gY29uZmlndXJlCisgKiB0aGUgdmFsaWQgdXNlcnMsIHBhc3N3b3JkcywgYW5kIHJvbGVzLiAgVGhlIGZpbGUgZm9ybWF0IChhbmQgZGVmYXVsdCBmaWxlCisgKiBsb2NhdGlvbikgYXJlIGlkZW50aWNhbCB0byB0aG9zZSBjdXJyZW50bHkgc3VwcG9ydGVkIGJ5IFRvbWNhdCAzLlguCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBSZWFsbUJhc2UKKyAgICBpbXBsZW1lbnRzIExpZmVjeWNsZSwgUmVhbG0sIE1CZWFuUmVnaXN0cmF0aW9uIHsKKworICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhSZWFsbUJhc2UuY2xhc3MpOworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBDb250YWluZXIgd2l0aCB3aGljaCB0aGlzIFJlYWxtIGlzIGFzc29jaWF0ZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIENvbnRhaW5lciBjb250YWluZXIgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBEaWdlc3QgYWxnb3JpdGhtIHVzZWQgaW4gc3RvcmluZyBwYXNzd29yZHMgaW4gYSBub24tcGxhaW50ZXh0IGZvcm1hdC4KKyAgICAgKiBWYWxpZCB2YWx1ZXMgYXJlIHRob3NlIGFjY2VwdGVkIGZvciB0aGUgYWxnb3JpdGhtIG5hbWUgYnkgdGhlCisgICAgICogTWVzc2FnZURpZ2VzdCBjbGFzcywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gZGlnZXN0aW5nIHNob3VsZAorICAgICAqIGJlIHBlcmZvcm1lZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGRpZ2VzdCA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIERlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgUmVhbG0gaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgaW5mbyA9CisgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtLlJlYWxtQmFzZS8xLjAiOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgbGlmZWN5Y2xlIGV2ZW50IHN1cHBvcnQgZm9yIHRoaXMgY29tcG9uZW50LgorICAgICAqLworICAgIHByb3RlY3RlZCBMaWZlY3ljbGVTdXBwb3J0IGxpZmVjeWNsZSA9IG5ldyBMaWZlY3ljbGVTdXBwb3J0KHRoaXMpOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgTWVzc2FnZURpZ2VzdCBvYmplY3QgZm9yIGRpZ2VzdGluZyB1c2VyIGNyZWRlbnRpYWxzIChwYXNzd29yZHMpLgorICAgICAqLworICAgIHByb3RlY3RlZCBNZXNzYWdlRGlnZXN0IG1kID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIE1ENSBoZWxwZXIgb2JqZWN0IGZvciB0aGlzIGNsYXNzLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgTUQ1RW5jb2RlciBtZDVFbmNvZGVyID0gbmV3IE1ENUVuY29kZXIoKTsKKworCisgICAgLyoqCisgICAgICogTUQ1IG1lc3NhZ2UgZGlnZXN0IHByb3ZpZGVyLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgTWVzc2FnZURpZ2VzdCBtZDVIZWxwZXI7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzdHJpbmcgbWFuYWdlciBmb3IgdGhpcyBwYWNrYWdlLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nTWFuYWdlciBzbSA9CisgICAgICAgIFN0cmluZ01hbmFnZXIuZ2V0TWFuYWdlcihDb25zdGFudHMuUGFja2FnZSk7CisKKworICAgIC8qKgorICAgICAqIEhhcyB0aGlzIGNvbXBvbmVudCBiZWVuIHN0YXJ0ZWQ/CisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gc3RhcnRlZCA9IGZhbHNlOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgcHJvcGVydHkgY2hhbmdlIHN1cHBvcnQgZm9yIHRoaXMgY29tcG9uZW50LgorICAgICAqLworICAgIHByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZVN1cHBvcnQgc3VwcG9ydCA9IG5ldyBQcm9wZXJ0eUNoYW5nZVN1cHBvcnQodGhpcyk7CisKKworICAgIC8qKgorICAgICAqIFNob3VsZCB3ZSB2YWxpZGF0ZSBjbGllbnQgY2VydGlmaWNhdGUgY2hhaW5zIHdoZW4gdGhleSBhcmUgcHJlc2VudGVkPworICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlID0gdHJ1ZTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgQ29udGFpbmVyIHdpdGggd2hpY2ggdGhpcyBSZWFsbSBoYXMgYmVlbiBhc3NvY2lhdGVkLgorICAgICAqLworICAgIHB1YmxpYyBDb250YWluZXIgZ2V0Q29udGFpbmVyKCkgeworCisgICAgICAgIHJldHVybiAoY29udGFpbmVyKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBDb250YWluZXIgd2l0aCB3aGljaCB0aGlzIFJlYWxtIGhhcyBiZWVuIGFzc29jaWF0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBhc3NvY2lhdGVkIENvbnRhaW5lcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbnRhaW5lcihDb250YWluZXIgY29udGFpbmVyKSB7CisKKyAgICAgICAgQ29udGFpbmVyIG9sZENvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyOworICAgICAgICB0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lcjsKKyAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoImNvbnRhaW5lciIsIG9sZENvbnRhaW5lciwgdGhpcy5jb250YWluZXIpOworCisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBkaWdlc3QgYWxnb3JpdGhtICB1c2VkIGZvciBzdG9yaW5nIGNyZWRlbnRpYWxzLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGlnZXN0KCkgeworCisgICAgICAgIHJldHVybiBkaWdlc3Q7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZGlnZXN0IGFsZ29yaXRobSB1c2VkIGZvciBzdG9yaW5nIGNyZWRlbnRpYWxzLgorICAgICAqCisgICAgICogQHBhcmFtIGRpZ2VzdCBUaGUgbmV3IGRpZ2VzdCBhbGdvcml0aG0KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREaWdlc3QoU3RyaW5nIGRpZ2VzdCkgeworCisgICAgICAgIHRoaXMuZGlnZXN0ID0gZGlnZXN0OworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBSZWFsbSBpbXBsZW1lbnRhdGlvbiBhbmQKKyAgICAgKiB0aGUgY29ycmVzcG9uZGluZyB2ZXJzaW9uIG51bWJlciwgaW4gdGhlIGZvcm1hdAorICAgICAqIDxjb2RlPiZsdDtkZXNjcmlwdGlvbiZndDsvJmx0O3ZlcnNpb24mZ3Q7PC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEluZm8oKSB7CisKKyAgICAgICAgcmV0dXJuIGluZm87CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgInZhbGlkYXRlIGNlcnRpZmljYXRlIGNoYWlucyIgZmxhZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRWYWxpZGF0ZSgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMudmFsaWRhdGUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlICJ2YWxpZGF0ZSBjZXJ0aWZpY2F0ZSBjaGFpbnMiIGZsYWcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsaWRhdGUgVGhlIG5ldyB2YWxpZGF0ZSBjZXJ0aWZpY2F0ZSBjaGFpbnMgZmxhZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFZhbGlkYXRlKGJvb2xlYW4gdmFsaWRhdGUpIHsKKworICAgICAgICB0aGlzLnZhbGlkYXRlID0gdmFsaWRhdGU7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAKKyAgICAvKioKKyAgICAgKiBBZGQgYSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIgdG8gdGhpcyBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRvIGFkZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgeworCisgICAgICAgIHN1cHBvcnQuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgUHJpbmNpcGFsIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIHVzZXJuYW1lIGFuZAorICAgICAqIGNyZWRlbnRpYWxzLCBpZiB0aGVyZSBpcyBvbmU7IG90aGVyd2lzZSByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXNlcm5hbWUgVXNlcm5hbWUgb2YgdGhlIFByaW5jaXBhbCB0byBsb29rIHVwCisgICAgICogQHBhcmFtIGNyZWRlbnRpYWxzIFBhc3N3b3JkIG9yIG90aGVyIGNyZWRlbnRpYWxzIHRvIHVzZSBpbgorICAgICAqICBhdXRoZW50aWNhdGluZyB0aGlzIHVzZXJuYW1lCisgICAgICovCisgICAgcHVibGljIFByaW5jaXBhbCBhdXRoZW50aWNhdGUoU3RyaW5nIHVzZXJuYW1lLCBTdHJpbmcgY3JlZGVudGlhbHMpIHsKKworICAgICAgICBTdHJpbmcgc2VydmVyQ3JlZGVudGlhbHMgPSBnZXRQYXNzd29yZCh1c2VybmFtZSk7CisKKyAgICAgICAgYm9vbGVhbiB2YWxpZGF0ZWQgOworICAgICAgICBpZiAoIHNlcnZlckNyZWRlbnRpYWxzID09IG51bGwgKSB7CisgICAgICAgICAgICB2YWxpZGF0ZWQgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIGlmKGhhc01lc3NhZ2VEaWdlc3QoKSkgeworICAgICAgICAgICAgdmFsaWRhdGVkID0gc2VydmVyQ3JlZGVudGlhbHMuZXF1YWxzSWdub3JlQ2FzZShkaWdlc3QoY3JlZGVudGlhbHMpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHZhbGlkYXRlZCA9IHNlcnZlckNyZWRlbnRpYWxzLmVxdWFscyhjcmVkZW50aWFscyk7CisgICAgICAgIH0KKyAgICAgICAgaWYoISB2YWxpZGF0ZWQgKSB7CisgICAgICAgICAgICBpZiAoY29udGFpbmVyLmdldExvZ2dlcigpLmlzVHJhY2VFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICBjb250YWluZXIuZ2V0TG9nZ2VyKCkuCisgICAgICAgICAgICAgICAgICAgIHRyYWNlKHNtLmdldFN0cmluZygicmVhbG1CYXNlLmF1dGhlbnRpY2F0ZUZhaWx1cmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcm5hbWUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIGlmIChjb250YWluZXIuZ2V0TG9nZ2VyKCkuaXNUcmFjZUVuYWJsZWQoKSkgeworICAgICAgICAgICAgY29udGFpbmVyLmdldExvZ2dlcigpLgorICAgICAgICAgICAgICAgIHRyYWNlKHNtLmdldFN0cmluZygicmVhbG1CYXNlLmF1dGhlbnRpY2F0ZVN1Y2Nlc3MiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VybmFtZSkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGdldFByaW5jaXBhbCh1c2VybmFtZSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIFByaW5jaXBhbCBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCB1c2VybmFtZSBhbmQKKyAgICAgKiBjcmVkZW50aWFscywgaWYgdGhlcmUgaXMgb25lOyBvdGhlcndpc2UgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIHVzZXJuYW1lIFVzZXJuYW1lIG9mIHRoZSBQcmluY2lwYWwgdG8gbG9vayB1cAorICAgICAqIEBwYXJhbSBjcmVkZW50aWFscyBQYXNzd29yZCBvciBvdGhlciBjcmVkZW50aWFscyB0byB1c2UgaW4KKyAgICAgKiAgYXV0aGVudGljYXRpbmcgdGhpcyB1c2VybmFtZQorICAgICAqLworICAgIHB1YmxpYyBQcmluY2lwYWwgYXV0aGVudGljYXRlKFN0cmluZyB1c2VybmFtZSwgYnl0ZVtdIGNyZWRlbnRpYWxzKSB7CisKKyAgICAgICAgcmV0dXJuIChhdXRoZW50aWNhdGUodXNlcm5hbWUsIGNyZWRlbnRpYWxzLnRvU3RyaW5nKCkpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBQcmluY2lwYWwgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgdXNlcm5hbWUsIHdoaWNoCisgICAgICogbWF0Y2hlcyB0aGUgZGlnZXN0IGNhbGN1bGF0ZWQgdXNpbmcgdGhlIGdpdmVuIHBhcmFtZXRlcnMgdXNpbmcgdGhlCisgICAgICogbWV0aG9kIGRlc2NyaWJlZCBpbiBSRkMgMjA2OTsgb3RoZXJ3aXNlIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1c2VybmFtZSBVc2VybmFtZSBvZiB0aGUgUHJpbmNpcGFsIHRvIGxvb2sgdXAKKyAgICAgKiBAcGFyYW0gY2xpZW50RGlnZXN0IERpZ2VzdCB3aGljaCBoYXMgYmVlbiBzdWJtaXR0ZWQgYnkgdGhlIGNsaWVudAorICAgICAqIEBwYXJhbSBuT25jZSBVbmlxdWUgKG9yIHN1cHBvc2VkbHkgdW5pcXVlKSB0b2tlbiB3aGljaCBoYXMgYmVlbiB1c2VkCisgICAgICogZm9yIHRoaXMgcmVxdWVzdAorICAgICAqIEBwYXJhbSByZWFsbSBSZWFsbSBuYW1lCisgICAgICogQHBhcmFtIG1kNWEyIFNlY29uZCBNRDUgZGlnZXN0IHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBkaWdlc3QgOgorICAgICAqIE1ENShNZXRob2QgKyAiOiIgKyB1cmkpCisgICAgICovCisgICAgcHVibGljIFByaW5jaXBhbCBhdXRoZW50aWNhdGUoU3RyaW5nIHVzZXJuYW1lLCBTdHJpbmcgY2xpZW50RGlnZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuT25jZSwgU3RyaW5nIG5jLCBTdHJpbmcgY25vbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBxb3AsIFN0cmluZyByZWFsbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbWQ1YTIpIHsKKworICAgICAgICBTdHJpbmcgbWQ1YTEgPSBnZXREaWdlc3QodXNlcm5hbWUsIHJlYWxtKTsKKyAgICAgICAgaWYgKG1kNWExID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgU3RyaW5nIHNlcnZlckRpZ2VzdFZhbHVlID0gbWQ1YTEgKyAiOiIgKyBuT25jZSArICI6IiArIG5jICsgIjoiCisgICAgICAgICAgICArIGNub25jZSArICI6IiArIHFvcCArICI6IiArIG1kNWEyOworICAgICAgICBTdHJpbmcgc2VydmVyRGlnZXN0ID0KKyAgICAgICAgICAgIG1kNUVuY29kZXIuZW5jb2RlKG1kNUhlbHBlci5kaWdlc3Qoc2VydmVyRGlnZXN0VmFsdWUuZ2V0Qnl0ZXMoKSkpOworICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiRGlnZXN0IDogIiArIGNsaWVudERpZ2VzdCArICIgVXNlcm5hbWU6IiArIHVzZXJuYW1lIAorICAgICAgICAgICAgICAgICAgICArICIgQ2xpZW50U2lnZXN0OiIgKyBjbGllbnREaWdlc3QgKyAiIG5PbmNlOiIgKyBuT25jZSAKKyAgICAgICAgICAgICAgICAgICAgKyAiIG5jOiIgKyBuYyArICIgY25vbmNlOiIgKyBjbm9uY2UgKyAiIHFvcDoiICsgcW9wIAorICAgICAgICAgICAgICAgICAgICArICIgcmVhbG06IiArIHJlYWxtICsgIm1kNWEyOiIgKyBtZDVhMiAKKyAgICAgICAgICAgICAgICAgICAgKyAiIFNlcnZlciBkaWdlc3Q6IiArIHNlcnZlckRpZ2VzdCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChzZXJ2ZXJEaWdlc3QuZXF1YWxzKGNsaWVudERpZ2VzdCkpCisgICAgICAgICAgICByZXR1cm4gZ2V0UHJpbmNpcGFsKHVzZXJuYW1lKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgUHJpbmNpcGFsIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGNoYWluIG9mIFg1MDkKKyAgICAgKiBjbGllbnQgY2VydGlmaWNhdGVzLiAgSWYgdGhlcmUgaXMgbm9uZSwgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIGNlcnRzIEFycmF5IG9mIGNsaWVudCBjZXJ0aWZpY2F0ZXMsIHdpdGggdGhlIGZpcnN0IG9uZSBpbgorICAgICAqICB0aGUgYXJyYXkgYmVpbmcgdGhlIGNlcnRpZmljYXRlIG9mIHRoZSBjbGllbnQgaXRzZWxmLgorICAgICAqLworICAgIHB1YmxpYyBQcmluY2lwYWwgYXV0aGVudGljYXRlKFg1MDlDZXJ0aWZpY2F0ZSBjZXJ0c1tdKSB7CisKKyAgICAgICAgaWYgKChjZXJ0cyA9PSBudWxsKSB8fCAoY2VydHMubGVuZ3RoIDwgMSkpCisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworCisgICAgICAgIC8vIENoZWNrIHRoZSB2YWxpZGl0eSBvZiBlYWNoIGNlcnRpZmljYXRlIGluIHRoZSBjaGFpbgorICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoIkF1dGhlbnRpY2F0aW5nIGNsaWVudCBjZXJ0aWZpY2F0ZSBjaGFpbiIpOworICAgICAgICBpZiAodmFsaWRhdGUpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2VydHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiIENoZWNraW5nIHZhbGlkaXR5IGZvciAnIiArCisgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0c1tpXS5nZXRTdWJqZWN0RE4oKS5nZXROYW1lKCkgKyAiJyIpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGNlcnRzW2ldLmNoZWNrVmFsaWRpdHkoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiAgVmFsaWRpdHkgZXhjZXB0aW9uIiwgZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gQ2hlY2sgdGhlIGV4aXN0ZW5jZSBvZiB0aGUgY2xpZW50IFByaW5jaXBhbCBpbiBvdXIgZGF0YWJhc2UKKyAgICAgICAgcmV0dXJuIChnZXRQcmluY2lwYWwoY2VydHNbMF0uZ2V0U3ViamVjdEROKCkuZ2V0TmFtZSgpKSk7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIFNlY3VyaXR5Q29uc3RyYWludHMgY29uZmlndXJlZCB0byBndWFyZCB0aGUgcmVxdWVzdCBVUkkgZm9yCisgICAgICogdGhpcyByZXF1ZXN0LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBubyBzdWNoIGNvbnN0cmFpbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBSZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCB0aGUgUmVxdWVzdCBpcyBtYXBwZWQgdG8KKyAgICAgKi8KKyAgICBwdWJsaWMgU2VjdXJpdHlDb25zdHJhaW50IFtdIGZpbmRTZWN1cml0eUNvbnN0cmFpbnRzKFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQgY29udGV4dCkgeworCisgICAgICAgIEFycmF5TGlzdCByZXN1bHRzID0gbnVsbDsKKyAgICAgICAgLy8gQXJlIHRoZXJlIGFueSBkZWZpbmVkIHNlY3VyaXR5IGNvbnN0cmFpbnRzPworICAgICAgICBTZWN1cml0eUNvbnN0cmFpbnQgY29uc3RyYWludHNbXSA9IGNvbnRleHQuZmluZENvbnN0cmFpbnRzKCk7CisgICAgICAgIGlmICgoY29uc3RyYWludHMgPT0gbnVsbCkgfHwgKGNvbnN0cmFpbnRzLmxlbmd0aCA9PSAwKSkgeworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiICBObyBhcHBsaWNhYmxlIGNvbnN0cmFpbnRzIGRlZmluZWQiKTsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBDaGVjayBlYWNoIGRlZmluZWQgc2VjdXJpdHkgY29uc3RyYWludAorICAgICAgICBTdHJpbmcgdXJpID0gcmVxdWVzdC5nZXRSZXF1ZXN0UGF0aE1CKCkudG9TdHJpbmcoKTsKKyAgICAgICAgCisgICAgICAgIFN0cmluZyBtZXRob2QgPSByZXF1ZXN0LmdldE1ldGhvZCgpOworICAgICAgICBpbnQgaTsKKyAgICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29uc3RyYWludHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIFNlY3VyaXR5Q29sbGVjdGlvbiBbXSBjb2xsZWN0aW9uID0gY29uc3RyYWludHNbaV0uZmluZENvbGxlY3Rpb25zKCk7CisgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIElmIGNvbGxlY3Rpb24gaXMgbnVsbCwgY29udGludWUgdG8gYXZvaWQgYW4gTlBFCisgICAgICAgICAgICAvLyBTZWUgQnVnemlsbGEgMzA2MjQKKyAgICAgICAgICAgIGlmICggY29sbGVjdGlvbiA9PSBudWxsKSB7CisJCWNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiAgQ2hlY2tpbmcgY29uc3RyYWludCAnIiArIGNvbnN0cmFpbnRzW2ldICsKKyAgICAgICAgICAgICAgICAgICAgIicgYWdhaW5zdCAiICsgbWV0aG9kICsgIiAiICsgdXJpICsgIiAtLT4gIiArCisgICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRzW2ldLmluY2x1ZGVkKHVyaSwgbWV0aG9kKSk7CisJICAgIH0KKworICAgICAgICAgICAgZm9yKGludCBqPTA7IGogPCBjb2xsZWN0aW9uLmxlbmd0aDsgaisrKXsKKyAgICAgICAgICAgICAgICBTdHJpbmcgW10gcGF0dGVybnMgPSBjb2xsZWN0aW9uW2pdLmZpbmRQYXR0ZXJucygpOworIAorICAgICAgICAgICAgICAgIC8vIElmIHBhdHRlcm5zIGlzIG51bGwsIGNvbnRpbnVlIHRvIGF2b2lkIGFuIE5QRQorICAgICAgICAgICAgICAgIC8vIFNlZSBCdWd6aWxsYSAzMDYyNAorICAgICAgICAgICAgICAgIGlmICggcGF0dGVybnMgPT0gbnVsbCkgeworCQkgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yKGludCBrPTA7IGsgPCBwYXR0ZXJucy5sZW5ndGg7IGsrKykgeworICAgICAgICAgICAgICAgICAgICBpZih1cmkuZXF1YWxzKHBhdHRlcm5zW2tdKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoY29sbGVjdGlvbltqXS5maW5kTWV0aG9kKG1ldGhvZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihyZXN1bHRzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5hZGQoY29uc3RyYWludHNbaV0pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYoZm91bmQpIHsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHRzVG9BcnJheShyZXN1bHRzKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBsb25nZXN0ID0gLTE7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvbnN0cmFpbnRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBTZWN1cml0eUNvbGxlY3Rpb24gW10gY29sbGVjdGlvbiA9IGNvbnN0cmFpbnRzW2ldLmZpbmRDb2xsZWN0aW9ucygpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBJZiBjb2xsZWN0aW9uIGlzIG51bGwsIGNvbnRpbnVlIHRvIGF2b2lkIGFuIE5QRQorICAgICAgICAgICAgLy8gU2VlIEJ1Z3ppbGxhIDMwNjI0CisgICAgICAgICAgICBpZiAoIGNvbGxlY3Rpb24gPT0gbnVsbCkgeworCQljb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgIENoZWNraW5nIGNvbnN0cmFpbnQgJyIgKyBjb25zdHJhaW50c1tpXSArCisgICAgICAgICAgICAgICAgICAgICInIGFnYWluc3QgIiArIG1ldGhvZCArICIgIiArIHVyaSArICIgLS0+ICIgKworICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW50c1tpXS5pbmNsdWRlZCh1cmksIG1ldGhvZCkpOworCSAgICB9CisKKyAgICAgICAgICAgIGZvcihpbnQgaj0wOyBqIDwgY29sbGVjdGlvbi5sZW5ndGg7IGorKyl7CisgICAgICAgICAgICAgICAgU3RyaW5nIFtdIHBhdHRlcm5zID0gY29sbGVjdGlvbltqXS5maW5kUGF0dGVybnMoKTsKKworICAgICAgICAgICAgICAgIC8vIElmIHBhdHRlcm5zIGlzIG51bGwsIGNvbnRpbnVlIHRvIGF2b2lkIGFuIE5QRQorICAgICAgICAgICAgICAgIC8vIFNlZSBCdWd6aWxsYSAzMDYyNAorICAgICAgICAgICAgICAgIGlmICggcGF0dGVybnMgPT0gbnVsbCkgeworCQkgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYm9vbGVhbiBtYXRjaGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgaW50IGxlbmd0aCA9IC0xOworICAgICAgICAgICAgICAgIGZvcihpbnQgaz0wOyBrIDwgcGF0dGVybnMubGVuZ3RoOyBrKyspIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhdHRlcm4gPSBwYXR0ZXJuc1trXTsKKyAgICAgICAgICAgICAgICAgICAgaWYocGF0dGVybi5zdGFydHNXaXRoKCIvIikgJiYgcGF0dGVybi5lbmRzV2l0aCgiLyoiKSAmJiAKKyAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybi5sZW5ndGgoKSA+PSBsb25nZXN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpZihwYXR0ZXJuLmxlbmd0aCgpID09IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBwYXR0ZXJuLmxlbmd0aCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmKHBhdHRlcm4ucmVnaW9uTWF0Y2hlcygwLHVyaSwwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuLmxlbmd0aCgpLTEpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhdHRlcm4ubGVuZ3RoKCktMiA9PSB1cmkubGVuZ3RoKCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybi5yZWdpb25NYXRjaGVzKDAsdXJpLDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4ubGVuZ3RoKCktMikpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gcGF0dGVybi5sZW5ndGgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZihtYXRjaGVkKSB7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgaWYobGVuZ3RoID4gbG9uZ2VzdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzdWx0cyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbG9uZ2VzdCA9IGxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZihjb2xsZWN0aW9uW2pdLmZpbmRNZXRob2QobWV0aG9kKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzdWx0cyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMuYWRkKGNvbnN0cmFpbnRzW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmKGZvdW5kKSB7CisgICAgICAgICAgICByZXR1cm4gIHJlc3VsdHNUb0FycmF5KHJlc3VsdHMpOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvbnN0cmFpbnRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBTZWN1cml0eUNvbGxlY3Rpb24gW10gY29sbGVjdGlvbiA9IGNvbnN0cmFpbnRzW2ldLmZpbmRDb2xsZWN0aW9ucygpOworCisgICAgICAgICAgICAvLyBJZiBjb2xsZWN0aW9uIGlzIG51bGwsIGNvbnRpbnVlIHRvIGF2b2lkIGFuIE5QRQorICAgICAgICAgICAgLy8gU2VlIEJ1Z3ppbGxhIDMwNjI0CisgICAgICAgICAgICBpZiAoIGNvbGxlY3Rpb24gPT0gbnVsbCkgeworCQljb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgIENoZWNraW5nIGNvbnN0cmFpbnQgJyIgKyBjb25zdHJhaW50c1tpXSArCisgICAgICAgICAgICAgICAgICAgICInIGFnYWluc3QgIiArIG1ldGhvZCArICIgIiArIHVyaSArICIgLS0+ICIgKworICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW50c1tpXS5pbmNsdWRlZCh1cmksIG1ldGhvZCkpOworCSAgICB9CisKKyAgICAgICAgICAgIGJvb2xlYW4gbWF0Y2hlZCA9IGZhbHNlOworICAgICAgICAgICAgaW50IHBvcyA9IC0xOworICAgICAgICAgICAgZm9yKGludCBqPTA7IGogPCBjb2xsZWN0aW9uLmxlbmd0aDsgaisrKXsKKyAgICAgICAgICAgICAgICBTdHJpbmcgW10gcGF0dGVybnMgPSBjb2xsZWN0aW9uW2pdLmZpbmRQYXR0ZXJucygpOworCisgICAgICAgICAgICAgICAgLy8gSWYgcGF0dGVybnMgaXMgbnVsbCwgY29udGludWUgdG8gYXZvaWQgYW4gTlBFCisgICAgICAgICAgICAgICAgLy8gU2VlIEJ1Z3ppbGxhIDMwNjI0CisgICAgICAgICAgICAgICAgaWYgKCBwYXR0ZXJucyA9PSBudWxsKSB7CisJCSAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IoaW50IGs9MDsgayA8IHBhdHRlcm5zLmxlbmd0aCAmJiAhbWF0Y2hlZDsgaysrKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXR0ZXJuID0gcGF0dGVybnNba107CisgICAgICAgICAgICAgICAgICAgIGlmKHBhdHRlcm4uc3RhcnRzV2l0aCgiKi4iKSl7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2xhc2ggPSB1cmkubGFzdEluZGV4T2YoIi8iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBkb3QgPSB1cmkubGFzdEluZGV4T2YoIi4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKHNsYXNoID49IDAgJiYgZG90ID4gc2xhc2ggJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdCAhPSB1cmkubGVuZ3RoKCktMSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJpLmxlbmd0aCgpLWRvdCA9PSBwYXR0ZXJuLmxlbmd0aCgpLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwYXR0ZXJuLnJlZ2lvbk1hdGNoZXMoMSx1cmksZG90LHVyaS5sZW5ndGgoKS1kb3QpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3MgPSBqOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKG1hdGNoZWQpIHsKKyAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgaWYoY29sbGVjdGlvbltwb3NdLmZpbmRNZXRob2QobWV0aG9kKSkgeworICAgICAgICAgICAgICAgICAgICBpZihyZXN1bHRzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5hZGQoY29uc3RyYWludHNbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmKGZvdW5kKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0c1RvQXJyYXkocmVzdWx0cyk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29uc3RyYWludHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIFNlY3VyaXR5Q29sbGVjdGlvbiBbXSBjb2xsZWN0aW9uID0gY29uc3RyYWludHNbaV0uZmluZENvbGxlY3Rpb25zKCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIElmIGNvbGxlY3Rpb24gaXMgbnVsbCwgY29udGludWUgdG8gYXZvaWQgYW4gTlBFCisgICAgICAgICAgICAvLyBTZWUgQnVnemlsbGEgMzA2MjQKKyAgICAgICAgICAgIGlmICggY29sbGVjdGlvbiA9PSBudWxsKSB7CisJCWNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiAgQ2hlY2tpbmcgY29uc3RyYWludCAnIiArIGNvbnN0cmFpbnRzW2ldICsKKyAgICAgICAgICAgICAgICAgICAgIicgYWdhaW5zdCAiICsgbWV0aG9kICsgIiAiICsgdXJpICsgIiAtLT4gIiArCisgICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRzW2ldLmluY2x1ZGVkKHVyaSwgbWV0aG9kKSk7CisJICAgIH0KKworICAgICAgICAgICAgZm9yKGludCBqPTA7IGogPCBjb2xsZWN0aW9uLmxlbmd0aDsgaisrKXsKKyAgICAgICAgICAgICAgICBTdHJpbmcgW10gcGF0dGVybnMgPSBjb2xsZWN0aW9uW2pdLmZpbmRQYXR0ZXJucygpOworCisgICAgICAgICAgICAgICAgLy8gSWYgcGF0dGVybnMgaXMgbnVsbCwgY29udGludWUgdG8gYXZvaWQgYW4gTlBFCisgICAgICAgICAgICAgICAgLy8gU2VlIEJ1Z3ppbGxhIDMwNjI0CisgICAgICAgICAgICAgICAgaWYgKCBwYXR0ZXJucyA9PSBudWxsKSB7CisJCSAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBib29sZWFuIG1hdGNoZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBmb3IoaW50IGs9MDsgayA8IHBhdHRlcm5zLmxlbmd0aCAmJiAhbWF0Y2hlZDsgaysrKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXR0ZXJuID0gcGF0dGVybnNba107CisgICAgICAgICAgICAgICAgICAgIGlmKHBhdHRlcm4uZXF1YWxzKCIvIikpeworICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYobWF0Y2hlZCkgeworICAgICAgICAgICAgICAgICAgICBpZihyZXN1bHRzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICByZXN1bHRzLmFkZChjb25zdHJhaW50c1tpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYocmVzdWx0cyA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBObyBhcHBsaWNhYmxlIHNlY3VyaXR5IGNvbnN0cmFpbnQgd2FzIGZvdW5kCisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgIE5vIGFwcGxpY2FibGUgY29uc3RyYWludCBsb2NhdGVkIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdHNUb0FycmF5KHJlc3VsdHMpOworICAgIH0KKyAKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IGFuIEFycmF5TGlzdCB0byBhIFNlY3VyaXR5Q29udHJhaW50IFtdLgorICAgICAqLworICAgIHByaXZhdGUgU2VjdXJpdHlDb25zdHJhaW50IFtdIHJlc3VsdHNUb0FycmF5KEFycmF5TGlzdCByZXN1bHRzKSB7CisgICAgICAgIGlmKHJlc3VsdHMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgU2VjdXJpdHlDb25zdHJhaW50IFtdIGFycmF5ID0gbmV3IFNlY3VyaXR5Q29uc3RyYWludFtyZXN1bHRzLnNpemUoKV07CisgICAgICAgIHJlc3VsdHMudG9BcnJheShhcnJheSk7CisgICAgICAgIHJldHVybiBhcnJheTsKKyAgICB9CisKKyAgICAKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtIGFjY2VzcyBjb250cm9sIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgYXV0aG9yaXphdGlvbiBjb25zdHJhaW50LgorICAgICAqIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGNvbnN0cmFpbnQgaXMgc2F0aXNmaWVkIGFuZCBwcm9jZXNzaW5nCisgICAgICogc2hvdWxkIGNvbnRpbnVlLCBvciA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgUmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBSZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKiBAcGFyYW0gY29uc3RyYWludHMgU2VjdXJpdHkgY29uc3RyYWludCB3ZSBhcmUgZW5mb3JjaW5nCisgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIENvbnRleHQgdG8gd2hpY2ggY2xpZW50IG9mIHRoaXMgY2xhc3MgaXMgYXR0YWNoZWQuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNSZXNvdXJjZVBlcm1pc3Npb24oUmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNwb25zZSByZXNwb25zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VjdXJpdHlDb25zdHJhaW50IFtdY29uc3RyYWludHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQgY29udGV4dCkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAoY29uc3RyYWludHMgPT0gbnVsbCB8fCBjb25zdHJhaW50cy5sZW5ndGggPT0gMCkKKyAgICAgICAgICAgIHJldHVybiAodHJ1ZSk7CisKKyAgICAgICAgLy8gU3BlY2lmaWNhbGx5IGFsbG93IGFjY2VzcyB0byB0aGUgZm9ybSBsb2dpbiBhbmQgZm9ybSBlcnJvciBwYWdlcworICAgICAgICAvLyBhbmQgdGhlICJqX3NlY3VyaXR5X2NoZWNrIiBhY3Rpb24KKyAgICAgICAgTG9naW5Db25maWcgY29uZmlnID0gY29udGV4dC5nZXRMb2dpbkNvbmZpZygpOworICAgICAgICBpZiAoKGNvbmZpZyAhPSBudWxsKSAmJgorICAgICAgICAgICAgKENvbnN0YW50cy5GT1JNX01FVEhPRC5lcXVhbHMoY29uZmlnLmdldEF1dGhNZXRob2QoKSkpKSB7CisgICAgICAgICAgICBTdHJpbmcgcmVxdWVzdFVSSSA9IHJlcXVlc3QuZ2V0RGVjb2RlZFJlcXVlc3RVUkkoKTsKKyAgICAgICAgICAgIFN0cmluZyBsb2dpblBhZ2UgPSBjb250ZXh0LmdldFBhdGgoKSArIGNvbmZpZy5nZXRMb2dpblBhZ2UoKTsKKyAgICAgICAgICAgIGlmIChsb2dpblBhZ2UuZXF1YWxzKHJlcXVlc3RVUkkpKSB7CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiBBbGxvdyBhY2Nlc3MgdG8gbG9naW4gcGFnZSAiICsgbG9naW5QYWdlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nIGVycm9yUGFnZSA9IGNvbnRleHQuZ2V0UGF0aCgpICsgY29uZmlnLmdldEVycm9yUGFnZSgpOworICAgICAgICAgICAgaWYgKGVycm9yUGFnZS5lcXVhbHMocmVxdWVzdFVSSSkpIHsKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiIEFsbG93IGFjY2VzcyB0byBlcnJvciBwYWdlICIgKyBlcnJvclBhZ2UpOworICAgICAgICAgICAgICAgIHJldHVybiAodHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocmVxdWVzdFVSSS5lbmRzV2l0aChDb25zdGFudHMuRk9STV9BQ1RJT04pKSB7CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiBBbGxvdyBhY2Nlc3MgdG8gdXNlcm5hbWUvcGFzc3dvcmQgc3VibWlzc2lvbiIpOworICAgICAgICAgICAgICAgIHJldHVybiAodHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBXaGljaCB1c2VyIHByaW5jaXBhbCBoYXZlIHdlIGFscmVhZHkgYXV0aGVudGljYXRlZD8KKyAgICAgICAgUHJpbmNpcGFsIHByaW5jaXBhbCA9IHJlcXVlc3QuZ2V0VXNlclByaW5jaXBhbCgpOworICAgICAgICBmb3IoaW50IGk9MDsgaSA8IGNvbnN0cmFpbnRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBTZWN1cml0eUNvbnN0cmFpbnQgY29uc3RyYWludCA9IGNvbnN0cmFpbnRzW2ldOworICAgICAgICAgICAgU3RyaW5nIHJvbGVzW10gPSBjb25zdHJhaW50LmZpbmRBdXRoUm9sZXMoKTsKKyAgICAgICAgICAgIGlmIChyb2xlcyA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJvbGVzID0gbmV3IFN0cmluZ1swXTsKKworICAgICAgICAgICAgaWYgKGNvbnN0cmFpbnQuZ2V0QWxsUm9sZXMoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKHRydWUpOworCisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgIENoZWNraW5nIHJvbGVzICIgKyBwcmluY2lwYWwpOworCisgICAgICAgICAgICBpZiAocm9sZXMubGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgICAgICBpZihjb25zdHJhaW50LmdldEF1dGhDb25zdHJhaW50KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19GT1JCSURERU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgc20uZ2V0U3RyaW5nKCJyZWFsbUJhc2UuZm9yYmlkZGVuIikpOworICAgICAgICAgICAgICAgICAgICBpZiggbG9nLmlzRGVidWdFbmFibGVkKCkgKSBsb2cuZGVidWcoIk5vIHJvbGVzICIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGZhbHNlKTsgLy8gTm8gbGlzdGVkIHJvbGVzIG1lYW5zIG5vIGFjY2VzcyBhdCBhbGwKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlBhc3NpbmcgYWxsIGFjY2VzcyIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHRydWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAocHJpbmNpcGFsID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiICBObyB1c2VyIGF1dGhlbnRpY2F0ZWQsIGNhbm5vdCBncmFudCBhY2Nlc3MiKTsKKyAgICAgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfRk9SQklEREVOLAorICAgICAgICAgICAgICAgICAgICAgc20uZ2V0U3RyaW5nKCJyZWFsbUJhc2Uubm90QXV0aGVudGljYXRlZCIpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGZhbHNlKTsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHJvbGVzLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgaWYgKGhhc1JvbGUocHJpbmNpcGFsLCByb2xlc1tqXSkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAodHJ1ZSk7CisgICAgICAgICAgICAgICAgaWYoIGxvZy5pc0RlYnVnRW5hYmxlZCgpICkKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCAiTm8gcm9sZSBmb3VuZDogICIgKyByb2xlc1tqXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gUmV0dXJuIGEgIkZvcmJpZGRlbiIgbWVzc2FnZSBkZW55aW5nIGFjY2VzcyB0byB0aGlzIHJlc291cmNlCisgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfRk9SQklEREVOLAorICAgICAgICAgICAgIHNtLmdldFN0cmluZygicmVhbG1CYXNlLmZvcmJpZGRlbiIpKTsKKyAgICAgICAgcmV0dXJuIChmYWxzZSk7CisKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgUHJpbmNpcGFsIGhhcyB0aGUgc3BlY2lmaWVkCisgICAgICogc2VjdXJpdHkgcm9sZSwgd2l0aGluIHRoZSBjb250ZXh0IG9mIHRoaXMgUmVhbG07IG90aGVyd2lzZSByZXR1cm4KKyAgICAgKiA8Y29kZT5mYWxzZTwvY29kZT4uICBUaGlzIG1ldGhvZCBjYW4gYmUgb3ZlcnJpZGRlbiBieSBSZWFsbQorICAgICAqIGltcGxlbWVudGF0aW9ucywgYnV0IHRoZSBkZWZhdWx0IGlzIGFkZXF1YXRlIHdoZW4gYW4gaW5zdGFuY2Ugb2YKKyAgICAgKiA8Y29kZT5HZW5lcmljUHJpbmNpcGFsPC9jb2RlPiBpcyB1c2VkIHRvIHJlcHJlc2VudCBhdXRoZW50aWNhdGVkCisgICAgICogUHJpbmNpcGFscyBmcm9tIHRoaXMgUmVhbG0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJpbmNpcGFsIFByaW5jaXBhbCBmb3Igd2hvbSB0aGUgcm9sZSBpcyB0byBiZSBjaGVja2VkCisgICAgICogQHBhcmFtIHJvbGUgU2VjdXJpdHkgcm9sZSB0byBiZSBjaGVja2VkCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaGFzUm9sZShQcmluY2lwYWwgcHJpbmNpcGFsLCBTdHJpbmcgcm9sZSkgeworCisgICAgICAgIC8vIFNob3VsZCBiZSBvdmVycml0ZW4gaW4gSkFBU1JlYWxtIC0gdG8gYXZvaWQgcHJldHR5IGluZWZmaWNpZW50IGNvbnZlcnNpb25zCisgICAgICAgIGlmICgocHJpbmNpcGFsID09IG51bGwpIHx8IChyb2xlID09IG51bGwpIHx8CisgICAgICAgICAgICAhKHByaW5jaXBhbCBpbnN0YW5jZW9mIEdlbmVyaWNQcmluY2lwYWwpKQorICAgICAgICAgICAgcmV0dXJuIChmYWxzZSk7CisKKyAgICAgICAgR2VuZXJpY1ByaW5jaXBhbCBncCA9IChHZW5lcmljUHJpbmNpcGFsKSBwcmluY2lwYWw7CisgICAgICAgIGlmICghKGdwLmdldFJlYWxtKCkgPT0gdGhpcykpIHsKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiRGlmZmVyZW50IHJlYWxtICIgKyB0aGlzICsgIiAiICsgZ3AuZ2V0UmVhbG0oKSk7Ly8gICAgcmV0dXJuIChmYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgYm9vbGVhbiByZXN1bHQgPSBncC5oYXNSb2xlKHJvbGUpOworICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gcHJpbmNpcGFsLmdldE5hbWUoKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQpCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKHNtLmdldFN0cmluZygicmVhbG1CYXNlLmhhc1JvbGVTdWNjZXNzIiwgbmFtZSwgcm9sZSkpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhzbS5nZXRTdHJpbmcoInJlYWxtQmFzZS5oYXNSb2xlRmFpbHVyZSIsIG5hbWUsIHJvbGUpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKHJlc3VsdCk7CisKKyAgICB9CisKKyAgICAKKyAgICAvKioKKyAgICAgKiBFbmZvcmNlIGFueSB1c2VyIGRhdGEgY29uc3RyYWludCByZXF1aXJlZCBieSB0aGUgc2VjdXJpdHkgY29uc3RyYWludAorICAgICAqIGd1YXJkaW5nIHRoaXMgcmVxdWVzdCBVUkkuICBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBjb25zdHJhaW50CisgICAgICogd2FzIG5vdCB2aW9sYXRlZCBhbmQgcHJvY2Vzc2luZyBzaG91bGQgY29udGludWUsIG9yIDxjb2RlPmZhbHNlPC9jb2RlPgorICAgICAqIGlmIHdlIGhhdmUgY3JlYXRlZCBhIHJlc3BvbnNlIGFscmVhZHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBSZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqIEBwYXJhbSBjb25zdHJhaW50cyBTZWN1cml0eSBjb25zdHJhaW50IGJlaW5nIGNoZWNrZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc1VzZXJEYXRhUGVybWlzc2lvbihSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWN1cml0eUNvbnN0cmFpbnQgW11jb25zdHJhaW50cykKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBJcyB0aGVyZSBhIHJlbGV2YW50IHVzZXIgZGF0YSBjb25zdHJhaW50PworICAgICAgICBpZiAoY29uc3RyYWludHMgPT0gbnVsbCB8fCBjb25zdHJhaW50cy5sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiICBObyBhcHBsaWNhYmxlIHNlY3VyaXR5IGNvbnN0cmFpbnQgZGVmaW5lZCIpOworICAgICAgICAgICAgcmV0dXJuICh0cnVlKTsKKyAgICAgICAgfQorICAgICAgICBmb3IoaW50IGk9MDsgaSA8IGNvbnN0cmFpbnRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBTZWN1cml0eUNvbnN0cmFpbnQgY29uc3RyYWludCA9IGNvbnN0cmFpbnRzW2ldOworICAgICAgICAgICAgU3RyaW5nIHVzZXJDb25zdHJhaW50ID0gY29uc3RyYWludC5nZXRVc2VyQ29uc3RyYWludCgpOworICAgICAgICAgICAgaWYgKHVzZXJDb25zdHJhaW50ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiICBObyBhcHBsaWNhYmxlIHVzZXIgZGF0YSBjb25zdHJhaW50IGRlZmluZWQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHVzZXJDb25zdHJhaW50LmVxdWFscyhDb25zdGFudHMuTk9ORV9UUkFOU1BPUlQpKSB7CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiAgVXNlciBkYXRhIGNvbnN0cmFpbnQgaGFzIG5vIHJlc3RyaWN0aW9ucyIpOworICAgICAgICAgICAgICAgIHJldHVybiAodHJ1ZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICAvLyBWYWxpZGF0ZSB0aGUgcmVxdWVzdCBhZ2FpbnN0IHRoZSB1c2VyIGRhdGEgY29uc3RyYWludAorICAgICAgICBpZiAocmVxdWVzdC5nZXRSZXF1ZXN0KCkuaXNTZWN1cmUoKSkgeworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiICBVc2VyIGRhdGEgY29uc3RyYWludCBhbHJlYWR5IHNhdGlzZmllZCIpOworICAgICAgICAgICAgcmV0dXJuICh0cnVlKTsKKyAgICAgICAgfQorICAgICAgICAvLyBJbml0aWFsaXplIHZhcmlhYmxlcyB3ZSBuZWVkIHRvIGRldGVybWluZSB0aGUgYXBwcm9wcmlhdGUgYWN0aW9uCisgICAgICAgIGludCByZWRpcmVjdFBvcnQgPSByZXF1ZXN0LmdldENvbm5lY3RvcigpLmdldFJlZGlyZWN0UG9ydCgpOworCisgICAgICAgIC8vIElzIHJlZGlyZWN0aW5nIGRpc2FibGVkPworICAgICAgICBpZiAocmVkaXJlY3RQb3J0IDw9IDApIHsKKyAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiAgU1NMIHJlZGlyZWN0IGlzIGRpc2FibGVkIik7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19GT1JCSURERU4sCisgICAgICAgICAgICAgICAgIHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpKTsKKyAgICAgICAgICAgIHJldHVybiAoZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmVkaXJlY3QgdG8gdGhlIGNvcnJlc3BvbmRpbmcgU1NMIHBvcnQKKyAgICAgICAgU3RyaW5nQnVmZmVyIGZpbGUgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIFN0cmluZyBwcm90b2NvbCA9ICJodHRwcyI7CisgICAgICAgIFN0cmluZyBob3N0ID0gcmVxdWVzdC5nZXRTZXJ2ZXJOYW1lKCk7CisgICAgICAgIC8vIFByb3RvY29sCisgICAgICAgIGZpbGUuYXBwZW5kKHByb3RvY29sKS5hcHBlbmQoIjovLyIpOworICAgICAgICAvLyBIb3N0IHdpdGggcG9ydAorICAgICAgICBmaWxlLmFwcGVuZChob3N0KS5hcHBlbmQoIjoiKS5hcHBlbmQocmVkaXJlY3RQb3J0KTsKKyAgICAgICAgLy8gVVJJCisgICAgICAgIGZpbGUuYXBwZW5kKHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpKTsKKyAgICAgICAgU3RyaW5nIHJlcXVlc3RlZFNlc3Npb25JZCA9IHJlcXVlc3QuZ2V0UmVxdWVzdGVkU2Vzc2lvbklkKCk7CisgICAgICAgIGlmICgocmVxdWVzdGVkU2Vzc2lvbklkICE9IG51bGwpICYmCisgICAgICAgICAgICByZXF1ZXN0LmlzUmVxdWVzdGVkU2Vzc2lvbklkRnJvbVVSTCgpKSB7CisgICAgICAgICAgICBmaWxlLmFwcGVuZCgiO2pzZXNzaW9uaWQ9Iik7CisgICAgICAgICAgICBmaWxlLmFwcGVuZChyZXF1ZXN0ZWRTZXNzaW9uSWQpOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBxdWVyeVN0cmluZyA9IHJlcXVlc3QuZ2V0UXVlcnlTdHJpbmcoKTsKKyAgICAgICAgaWYgKHF1ZXJ5U3RyaW5nICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZpbGUuYXBwZW5kKCc/Jyk7CisgICAgICAgICAgICBmaWxlLmFwcGVuZChxdWVyeVN0cmluZyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmRlYnVnKCIgIFJlZGlyZWN0aW5nIHRvICIgKyBmaWxlLnRvU3RyaW5nKCkpOworICAgICAgICByZXNwb25zZS5zZW5kUmVkaXJlY3QoZmlsZS50b1N0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIChmYWxzZSk7CisKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogUmVtb3ZlIGEgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyIGZyb20gdGhpcyBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRvIHJlbW92ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgeworCisgICAgICAgIHN1cHBvcnQucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBMaWZlY3ljbGUgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBsaWZlY3ljbGUgZXZlbnQgbGlzdGVuZXIgdG8gdGhpcyBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRvIGFkZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZExpZmVjeWNsZUxpc3RlbmVyKExpZmVjeWNsZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisKKyAgICAgICAgbGlmZWN5Y2xlLmFkZExpZmVjeWNsZUxpc3RlbmVyKGxpc3RlbmVyKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBsaWZlY3ljbGUgbGlzdGVuZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGxpZmVjeWNsZS4gSWYgdGhpcyAKKyAgICAgKiBMaWZlY3ljbGUgaGFzIG5vIGxpc3RlbmVycyByZWdpc3RlcmVkLCBhIHplcm8tbGVuZ3RoIGFycmF5IGlzIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBMaWZlY3ljbGVMaXN0ZW5lcltdIGZpbmRMaWZlY3ljbGVMaXN0ZW5lcnMoKSB7CisKKyAgICAgICAgcmV0dXJuIGxpZmVjeWNsZS5maW5kTGlmZWN5Y2xlTGlzdGVuZXJzKCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhIGxpZmVjeWNsZSBldmVudCBsaXN0ZW5lciBmcm9tIHRoaXMgY29tcG9uZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciB0byByZW1vdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVMaWZlY3ljbGVMaXN0ZW5lcihMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lcikgeworCisgICAgICAgIGxpZmVjeWNsZS5yZW1vdmVMaWZlY3ljbGVMaXN0ZW5lcihsaXN0ZW5lcik7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcmVwYXJlIGZvciB0aGUgYmVnaW5uaW5nIG9mIGFjdGl2ZSB1c2Ugb2YgdGhlIHB1YmxpYyBtZXRob2RzIG9mIHRoaXMKKyAgICAgKiBjb21wb25lbnQuICBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSBhbnkgb2YgdGhlIHB1YmxpYworICAgICAqIG1ldGhvZHMgb2YgdGhpcyBjb21wb25lbnQgYXJlIHV0aWxpemVkLiAgSXQgc2hvdWxkIGFsc28gc2VuZCBhCisgICAgICogTGlmZWN5Y2xlRXZlbnQgb2YgdHlwZSBTVEFSVF9FVkVOVCB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIExpZmVjeWNsZUV4Y2VwdGlvbiBpZiB0aGlzIGNvbXBvbmVudCBkZXRlY3RzIGEgZmF0YWwgZXJyb3IKKyAgICAgKiAgdGhhdCBwcmV2ZW50cyB0aGlzIGNvbXBvbmVudCBmcm9tIGJlaW5nIHVzZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb24geworCisgICAgICAgIC8vIFZhbGlkYXRlIGFuZCB1cGRhdGUgb3VyIGN1cnJlbnQgY29tcG9uZW50IHN0YXRlCisgICAgICAgIGlmIChzdGFydGVkKSB7CisgICAgICAgICAgICBsb2cuaW5mbyhzbS5nZXRTdHJpbmcoInJlYWxtQmFzZS5hbHJlYWR5U3RhcnRlZCIpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiggIWluaXRpYWxpemVkICkgeworICAgICAgICAgICAgaW5pdCgpOworICAgICAgICB9CisgICAgICAgIGxpZmVjeWNsZS5maXJlTGlmZWN5Y2xlRXZlbnQoU1RBUlRfRVZFTlQsIG51bGwpOworICAgICAgICBzdGFydGVkID0gdHJ1ZTsKKworICAgICAgICAvLyBDcmVhdGUgYSBNZXNzYWdlRGlnZXN0IGluc3RhbmNlIGZvciBjcmVkZW50aWFscywgaWYgZGVzaXJlZAorICAgICAgICBpZiAoZGlnZXN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbWQgPSBNZXNzYWdlRGlnZXN0LmdldEluc3RhbmNlKGRpZ2VzdCk7CisgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBMaWZlY3ljbGVFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygicmVhbG1CYXNlLmFsZ29yaXRobSIsIGRpZ2VzdCksIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdyYWNlZnVsbHkgdGVybWluYXRlIHRoZSBhY3RpdmUgdXNlIG9mIHRoZSBwdWJsaWMgbWV0aG9kcyBvZiB0aGlzCisgICAgICogY29tcG9uZW50LiAgVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHRoZSBsYXN0IG9uZSBjYWxsZWQgb24gYSBnaXZlbgorICAgICAqIGluc3RhbmNlIG9mIHRoaXMgY29tcG9uZW50LiAgSXQgc2hvdWxkIGFsc28gc2VuZCBhIExpZmVjeWNsZUV2ZW50CisgICAgICogb2YgdHlwZSBTVE9QX0VWRU5UIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTGlmZWN5Y2xlRXhjZXB0aW9uIGlmIHRoaXMgY29tcG9uZW50IGRldGVjdHMgYSBmYXRhbCBlcnJvcgorICAgICAqICB0aGF0IG5lZWRzIHRvIGJlIHJlcG9ydGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcCgpCisgICAgICAgIHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb24geworCisgICAgICAgIC8vIFZhbGlkYXRlIGFuZCB1cGRhdGUgb3VyIGN1cnJlbnQgY29tcG9uZW50IHN0YXRlCisgICAgICAgIGlmICghc3RhcnRlZCkgeworICAgICAgICAgICAgbG9nLmluZm8oc20uZ2V0U3RyaW5nKCJyZWFsbUJhc2Uubm90U3RhcnRlZCIpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBsaWZlY3ljbGUuZmlyZUxpZmVjeWNsZUV2ZW50KFNUT1BfRVZFTlQsIG51bGwpOworICAgICAgICBzdGFydGVkID0gZmFsc2U7CisKKyAgICAgICAgLy8gQ2xlYW4gdXAgYWxsb2NhdGVkIHJlc291cmNlcworICAgICAgICBtZCA9IG51bGw7CisgICAgICAgIAorICAgICAgICBkZXN0cm95KCk7CisgICAgCisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3koKSB7CisgICAgCisgICAgICAgIC8vIHVucmVnaXN0ZXIgdGhpcyByZWFsbQorICAgICAgICBpZiAoIG9uYW1lIT1udWxsICkgeyAgIAorICAgICAgICAgICAgdHJ5IHsgICAKKyAgICAgICAgICAgICAgICBSZWdpc3RyeS5nZXRSZWdpc3RyeShudWxsLCBudWxsKS51bnJlZ2lzdGVyQ29tcG9uZW50KG9uYW1lKTsgCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCAidW5yZWdpc3RlcmluZyByZWFsbSAiICsgb25hbWUgKTsgICAKKyAgICAgICAgICAgIH0gY2F0Y2goIEV4Y2VwdGlvbiBleCApIHsgICAKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3IoICJDYW4ndCB1bnJlZ2lzdGVyIHJlYWxtICIgKyBvbmFtZSwgZXgpOyAgIAorICAgICAgICAgICAgfSAgICAgIAorICAgICAgICB9CisgICAgICAgICAgCisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3RlY3RlZCBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIERpZ2VzdCB0aGUgcGFzc3dvcmQgdXNpbmcgdGhlIHNwZWNpZmllZCBhbGdvcml0aG0gYW5kCisgICAgICogY29udmVydCB0aGUgcmVzdWx0IHRvIGEgY29ycmVzcG9uZGluZyBoZXhhZGVjaW1hbCBzdHJpbmcuCisgICAgICogSWYgZXhjZXB0aW9uLCB0aGUgcGxhaW4gY3JlZGVudGlhbHMgc3RyaW5nIGlzIHJldHVybmVkLgorICAgICAqCisgICAgICogPHN0cm9uZz5JTVBMRU1FTlRBVElPTiBOT1RFPC9zdHJvbmc+IC0gVGhpcyBpbXBsZW1lbnRhdGlvbiBpcworICAgICAqIHN5bmNocm9uaXplZCBiZWNhdXNlIGl0IHJldXNlcyB0aGUgTWVzc2FnZURpZ2VzdCBpbnN0YW5jZS4KKyAgICAgKiBUaGlzIHNob3VsZCBiZSBmYXN0ZXIgdGhhbiBjbG9uaW5nIHRoZSBpbnN0YW5jZSBvbiBldmVyeSByZXF1ZXN0LgorICAgICAqCisgICAgICogQHBhcmFtIGNyZWRlbnRpYWxzIFBhc3N3b3JkIG9yIG90aGVyIGNyZWRlbnRpYWxzIHRvIHVzZSBpbgorICAgICAqICBhdXRoZW50aWNhdGluZyB0aGlzIHVzZXJuYW1lCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBkaWdlc3QoU3RyaW5nIGNyZWRlbnRpYWxzKSAgeworCisgICAgICAgIC8vIElmIG5vIE1lc3NhZ2VEaWdlc3QgaW5zdGFuY2UgaXMgc3BlY2lmaWVkLCByZXR1cm4gdW5jaGFuZ2VkCisgICAgICAgIGlmIChoYXNNZXNzYWdlRGlnZXN0KCkgPT0gZmFsc2UpCisgICAgICAgICAgICByZXR1cm4gKGNyZWRlbnRpYWxzKTsKKworICAgICAgICAvLyBEaWdlc3QgdGhlIHVzZXIgY3JlZGVudGlhbHMgYW5kIHJldHVybiBhcyBoZXhhZGVjaW1hbAorICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbWQucmVzZXQoKTsKKyAgICAgICAgICAgICAgICBtZC51cGRhdGUoY3JlZGVudGlhbHMuZ2V0Qnl0ZXMoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIChIZXhVdGlscy5jb252ZXJ0KG1kLmRpZ2VzdCgpKSk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxvZy5lcnJvcihzbS5nZXRTdHJpbmcoInJlYWxtQmFzZS5kaWdlc3QiKSwgZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIChjcmVkZW50aWFscyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworICAgIHByb3RlY3RlZCBib29sZWFuIGhhc01lc3NhZ2VEaWdlc3QoKSB7CisgICAgICAgIHJldHVybiAhKG1kID09IG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZGlnZXN0IGFzc29jaWF0ZWQgd2l0aCBnaXZlbiBwcmluY2lwYWwncyB1c2VyIG5hbWUuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXREaWdlc3QoU3RyaW5nIHVzZXJuYW1lLCBTdHJpbmcgcmVhbG1OYW1lKSB7CisgICAgICAgIGlmIChtZDVIZWxwZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtZDVIZWxwZXIgPSBNZXNzYWdlRGlnZXN0LmdldEluc3RhbmNlKCJNRDUiKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIGRpZ2VzdFZhbHVlID0gdXNlcm5hbWUgKyAiOiIgKyByZWFsbU5hbWUgKyAiOiIKKyAgICAgICAgICAgICsgZ2V0UGFzc3dvcmQodXNlcm5hbWUpOworICAgICAgICBieXRlW10gZGlnZXN0ID0KKyAgICAgICAgICAgIG1kNUhlbHBlci5kaWdlc3QoZGlnZXN0VmFsdWUuZ2V0Qnl0ZXMoKSk7CisgICAgICAgIHJldHVybiBtZDVFbmNvZGVyLmVuY29kZShkaWdlc3QpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgc2hvcnQgbmFtZSBmb3IgdGhpcyBSZWFsbSBpbXBsZW1lbnRhdGlvbiwgZm9yIHVzZSBpbgorICAgICAqIGxvZyBtZXNzYWdlcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldE5hbWUoKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBwYXNzd29yZCBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHByaW5jaXBhbCdzIHVzZXIgbmFtZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFBhc3N3b3JkKFN0cmluZyB1c2VybmFtZSk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgUHJpbmNpcGFsIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gdXNlciBuYW1lLgorICAgICAqLworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBQcmluY2lwYWwgZ2V0UHJpbmNpcGFsKFN0cmluZyB1c2VybmFtZSk7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTdGF0aWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBEaWdlc3QgcGFzc3dvcmQgdXNpbmcgdGhlIGFsZ29yaXRobSBlc3BlY2lmaWNpZWQgYW5kCisgICAgICogY29udmVydCB0aGUgcmVzdWx0IHRvIGEgY29ycmVzcG9uZGluZyBoZXggc3RyaW5nLgorICAgICAqIElmIGV4Y2VwdGlvbiwgdGhlIHBsYWluIGNyZWRlbnRpYWxzIHN0cmluZyBpcyByZXR1cm5lZAorICAgICAqCisgICAgICogQHBhcmFtIGNyZWRlbnRpYWxzIFBhc3N3b3JkIG9yIG90aGVyIGNyZWRlbnRpYWxzIHRvIHVzZSBpbgorICAgICAqICBhdXRoZW50aWNhdGluZyB0aGlzIHVzZXJuYW1lCisgICAgICogQHBhcmFtIGFsZ29yaXRobSBBbGdvcml0aG0gdXNlZCB0byBkbyB0aCBkaWdlc3QKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBEaWdlc3QoU3RyaW5nIGNyZWRlbnRpYWxzLCBTdHJpbmcgYWxnb3JpdGhtKSB7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIE9idGFpbiBhIG5ldyBtZXNzYWdlIGRpZ2VzdCB3aXRoICJkaWdlc3QiIGVuY3J5cHRpb24KKyAgICAgICAgICAgIE1lc3NhZ2VEaWdlc3QgbWQgPQorICAgICAgICAgICAgICAgIChNZXNzYWdlRGlnZXN0KSBNZXNzYWdlRGlnZXN0LmdldEluc3RhbmNlKGFsZ29yaXRobSkuY2xvbmUoKTsKKyAgICAgICAgICAgIC8vIGVuY29kZSB0aGUgY3JlZGVudGlhbHMKKyAgICAgICAgICAgIG1kLnVwZGF0ZShjcmVkZW50aWFscy5nZXRCeXRlcygpKTsKKyAgICAgICAgICAgIC8vIERpZ2VzdCB0aGUgY3JlZGVudGlhbHMgYW5kIHJldHVybiBhcyBoZXhhZGVjaW1hbAorICAgICAgICAgICAgcmV0dXJuIChIZXhVdGlscy5jb252ZXJ0KG1kLmRpZ2VzdCgpKSk7CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBleC5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHJldHVybiBjcmVkZW50aWFsczsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBEaWdlc3QgcGFzc3dvcmQgdXNpbmcgdGhlIGFsZ29yaXRobSBlc3BlY2lmaWNpZWQgYW5kCisgICAgICogY29udmVydCB0aGUgcmVzdWx0IHRvIGEgY29ycmVzcG9uZGluZyBoZXggc3RyaW5nLgorICAgICAqIElmIGV4Y2VwdGlvbiwgdGhlIHBsYWluIGNyZWRlbnRpYWxzIHN0cmluZyBpcyByZXR1cm5lZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pIHsKKworICAgICAgICBpZihhcmdzLmxlbmd0aCA+IDIgJiYgYXJnc1swXS5lcXVhbHNJZ25vcmVDYXNlKCItYSIpKSB7CisgICAgICAgICAgICBmb3IoaW50IGk9MjsgaSA8IGFyZ3MubGVuZ3RoIDsgaSsrKXsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KGFyZ3NbaV0rIjoiKTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oRGlnZXN0KGFyZ3NbaV0sIGFyZ3NbMV0pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbgorICAgICAgICAgICAgICAgICgiVXNhZ2U6IFJlYWxtQmFzZSAtYSA8YWxnb3JpdGhtPiA8Y3JlZGVudGlhbHM+Iik7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0gSk1YIGFuZCBSZWdpc3RyYXRpb24gIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgcHJvdGVjdGVkIFN0cmluZyB0eXBlOworICAgIHByb3RlY3RlZCBTdHJpbmcgZG9tYWluOworICAgIHByb3RlY3RlZCBTdHJpbmcgaG9zdDsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHBhdGg7CisgICAgcHJvdGVjdGVkIE9iamVjdE5hbWUgb25hbWU7CisgICAgcHJvdGVjdGVkIE9iamVjdE5hbWUgY29udHJvbGxlcjsKKyAgICBwcm90ZWN0ZWQgTUJlYW5TZXJ2ZXIgbXNlcnZlcjsKKworICAgIHB1YmxpYyBPYmplY3ROYW1lIGdldENvbnRyb2xsZXIoKSB7CisgICAgICAgIHJldHVybiBjb250cm9sbGVyOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENvbnRyb2xsZXIoT2JqZWN0TmFtZSBjb250cm9sbGVyKSB7CisgICAgICAgIHRoaXMuY29udHJvbGxlciA9IGNvbnRyb2xsZXI7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdE5hbWUgZ2V0T2JqZWN0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG9uYW1lOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RG9tYWluKCkgeworICAgICAgICByZXR1cm4gZG9tYWluOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdE5hbWUgcHJlUmVnaXN0ZXIoTUJlYW5TZXJ2ZXIgc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgbmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG9uYW1lPW5hbWU7CisgICAgICAgIG1zZXJ2ZXI9c2VydmVyOworICAgICAgICBkb21haW49bmFtZS5nZXREb21haW4oKTsKKworICAgICAgICB0eXBlPW5hbWUuZ2V0S2V5UHJvcGVydHkoInR5cGUiKTsKKyAgICAgICAgaG9zdD1uYW1lLmdldEtleVByb3BlcnR5KCJob3N0Iik7CisgICAgICAgIHBhdGg9bmFtZS5nZXRLZXlQcm9wZXJ0eSgicGF0aCIpOworCisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHBvc3RSZWdpc3RlcihCb29sZWFuIHJlZ2lzdHJhdGlvbkRvbmUpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwcmVEZXJlZ2lzdGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcG9zdERlcmVnaXN0ZXIoKSB7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaW5pdGlhbGl6ZWQ9ZmFsc2U7CisgICAgCisgICAgcHVibGljIHZvaWQgaW5pdCgpIHsKKyAgICAgICAgaWYoIGluaXRpYWxpemVkICYmIGNvbnRhaW5lciAhPSBudWxsICkgcmV0dXJuOworICAgICAgICAKKyAgICAgICAgaW5pdGlhbGl6ZWQ9dHJ1ZTsKKyAgICAgICAgaWYoIGNvbnRhaW5lcj09IG51bGwgKSB7CisgICAgICAgICAgICBPYmplY3ROYW1lIHBhcmVudD1udWxsOworICAgICAgICAgICAgLy8gUmVnaXN0ZXIgd2l0aCB0aGUgcGFyZW50CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmKCBob3N0ID09IG51bGwgKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGdsb2JhbAorICAgICAgICAgICAgICAgICAgICBwYXJlbnQ9bmV3IE9iamVjdE5hbWUoZG9tYWluICsiOnR5cGU9RW5naW5lIik7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmKCBwYXRoPT1udWxsICkgeworICAgICAgICAgICAgICAgICAgICBwYXJlbnQ9bmV3IE9iamVjdE5hbWUoZG9tYWluICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOnR5cGU9SG9zdCxob3N0PSIgKyBob3N0KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBwYXJlbnQ9bmV3IE9iamVjdE5hbWUoZG9tYWluICsiOmoyZWVUeXBlPVdlYk1vZHVsZSxuYW1lPS8vIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdCArIHBhdGgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiggbXNlcnZlci5pc1JlZ2lzdGVyZWQocGFyZW50ICkpICB7CisgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiUmVnaXN0ZXIgd2l0aCAiICsgcGFyZW50KTsKKyAgICAgICAgICAgICAgICAgICAgbXNlcnZlci5zZXRBdHRyaWJ1dGUocGFyZW50LCBuZXcgQXR0cmlidXRlKCJyZWFsbSIsIHRoaXMpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJQYXJlbnQgbm90IGF2YWlsYWJsZSB5ZXQ6ICIgKyBwYXJlbnQpOyAgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmKCBvbmFtZT09bnVsbCApIHsKKyAgICAgICAgICAgIC8vIHJlZ2lzdGVyCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIENvbnRhaW5lckJhc2UgY2I9KENvbnRhaW5lckJhc2UpY29udGFpbmVyOworICAgICAgICAgICAgICAgIG9uYW1lPW5ldyBPYmplY3ROYW1lKGNiLmdldERvbWFpbigpKyI6dHlwZT1SZWFsbSIgKyBjYi5nZXRDb250YWluZXJTdWZmaXgoKSk7CisgICAgICAgICAgICAgICAgUmVnaXN0cnkuZ2V0UmVnaXN0cnkobnVsbCwgbnVsbCkucmVnaXN0ZXJDb21wb25lbnQodGhpcywgb25hbWUsIG51bGwgKTsKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlJlZ2lzdGVyIFJlYWxtICIrb25hbWUpOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3IoICJDYW4ndCByZWdpc3RlciAiICsgb25hbWUsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9yZWFsbS9Vc2VyRGF0YWJhc2VSZWFsbS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3JlYWxtL1VzZXJEYXRhYmFzZVJlYWxtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGYzZjQ3OAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9yZWFsbS9Vc2VyRGF0YWJhc2VSZWFsbS5qYXZhCkBAIC0wLDAgKzEsMjU1IEBACisvKgorICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtOworCisKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaW5jaXBhbDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKK2ltcG9ydCBqYXZheC5uYW1pbmcuQ29udGV4dDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuR3JvdXA7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Sb2xlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuU2VydmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlVzZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Vc2VyRGF0YWJhc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkU2VydmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5TdHJpbmdNYW5hZ2VyOworCisKKy8qKgorICogPHA+SW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIG9yZy5hcGFjaGUuY2F0YWxpbmEuUmVhbG19IHRoYXQgaXMgYmFzZWQgb24gYW4gaW1wbGVtZW50YXRpb24gb2YKKyAqIHtAbGluayBVc2VyRGF0YWJhc2V9IG1hZGUgYXZhaWxhYmxlIHRocm91Z2ggdGhlIGdsb2JhbCBKTkRJIHJlc291cmNlcworICogY29uZmlndXJlZCBmb3IgdGhpcyBpbnN0YW5jZSBvZiBDYXRhbGluYS4gIFNldCB0aGUgPGNvZGU+cmVzb3VyY2VOYW1lPC9jb2RlPgorICogcGFyYW1ldGVyIHRvIHRoZSBnbG9iYWwgSk5ESSByZXNvdXJjZXMgbmFtZSBmb3IgdGhlIGNvbmZpZ3VyZWQgaW5zdGFuY2UKKyAqIG9mIDxjb2RlPlVzZXJEYXRhYmFzZTwvY29kZT4gdGhhdCB3ZSBzaG91bGQgY29uc3VsdC48L3A+CisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICogQHNpbmNlIDQuMQorICovCisKK3B1YmxpYyBjbGFzcyBVc2VyRGF0YWJhc2VSZWFsbQorICAgIGV4dGVuZHMgUmVhbG1CYXNlIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSA8Y29kZT5Vc2VyRGF0YWJhc2U8L2NvZGU+IHdlIHdpbGwgdXNlIHRvIGF1dGhlbnRpY2F0ZSB1c2VycworICAgICAqIGFuZCBpZGVudGlmeSBhc3NvY2lhdGVkIHJvbGVzLgorICAgICAqLworICAgIHByb3RlY3RlZCBVc2VyRGF0YWJhc2UgZGF0YWJhc2UgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBEZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIFJlYWxtIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgaW5mbyA9CisgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtLlVzZXJEYXRhYmFzZVJlYWxtLzEuMCI7CisKKworICAgIC8qKgorICAgICAqIERlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgUmVhbG0gaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgbmFtZSA9ICJVc2VyRGF0YWJhc2VSZWFsbSI7CisKKworICAgIC8qKgorICAgICAqIFRoZSBnbG9iYWwgSk5ESSBuYW1lIG9mIHRoZSA8Y29kZT5Vc2VyRGF0YWJhc2U8L2NvZGU+IHJlc291cmNlCisgICAgICogd2Ugd2lsbCBiZSB1dGlsaXppbmcuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyByZXNvdXJjZU5hbWUgPSAiVXNlckRhdGFiYXNlIjsKKworCisgICAgLyoqCisgICAgICogVGhlIHN0cmluZyBtYW5hZ2VyIGZvciB0aGlzIHBhY2thZ2UuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nTWFuYWdlciBzbSA9CisgICAgICAgIFN0cmluZ01hbmFnZXIuZ2V0TWFuYWdlcihDb25zdGFudHMuUGFja2FnZSk7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBSZWFsbSBpbXBsZW1lbnRhdGlvbiBhbmQKKyAgICAgKiB0aGUgY29ycmVzcG9uZGluZyB2ZXJzaW9uIG51bWJlciwgaW4gdGhlIGZvcm1hdAorICAgICAqIDxjb2RlPiZsdDtkZXNjcmlwdGlvbiZndDsvJmx0O3ZlcnNpb24mZ3Q7PC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEluZm8oKSB7CisKKyAgICAgICAgcmV0dXJuIGluZm87CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZ2xvYmFsIEpOREkgbmFtZSBvZiB0aGUgPGNvZGU+VXNlckRhdGFiYXNlPC9jb2RlPiByZXNvdXJjZQorICAgICAqIHdlIHdpbGwgYmUgdXNpbmcuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZU5hbWUoKSB7CisKKyAgICAgICAgcmV0dXJuIHJlc291cmNlTmFtZTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBnbG9iYWwgSk5ESSBuYW1lIG9mIHRoZSA8Y29kZT5Vc2VyRGF0YWJhc2U8L2NvZGU+IHJlc291cmNlCisgICAgICogd2Ugd2lsbCBiZSB1c2luZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNvdXJjZU5hbWUgVGhlIG5ldyBnbG9iYWwgSk5ESSBuYW1lCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVzb3VyY2VOYW1lKFN0cmluZyByZXNvdXJjZU5hbWUpIHsKKworICAgICAgICB0aGlzLnJlc291cmNlTmFtZSA9IHJlc291cmNlTmFtZTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3BlY2lmaWVkIFByaW5jaXBhbCBoYXMgdGhlIHNwZWNpZmllZAorICAgICAqIHNlY3VyaXR5IHJvbGUsIHdpdGhpbiB0aGUgY29udGV4dCBvZiB0aGlzIFJlYWxtOyBvdGhlcndpc2UgcmV0dXJuCisgICAgICogPGNvZGU+ZmFsc2U8L2NvZGU+LiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4KKyAgICAgKiBpZiB0aGUgPGNvZGU+VXNlcjwvY29kZT4gaGFzIHRoZSByb2xlLCBvciBpZiBhbnkgPGNvZGU+R3JvdXA8L2NvZGU+CisgICAgICogdGhhdCB0aGUgPGNvZGU+VXNlcjwvY29kZT4gaXMgYSBtZW1iZXIgb2YgaGFzIHRoZSByb2xlLiAKKyAgICAgKgorICAgICAqIEBwYXJhbSBwcmluY2lwYWwgUHJpbmNpcGFsIGZvciB3aG9tIHRoZSByb2xlIGlzIHRvIGJlIGNoZWNrZWQKKyAgICAgKiBAcGFyYW0gcm9sZSBTZWN1cml0eSByb2xlIHRvIGJlIGNoZWNrZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNSb2xlKFByaW5jaXBhbCBwcmluY2lwYWwsIFN0cmluZyByb2xlKSB7CisgICAgICAgIGlmKCEgKHByaW5jaXBhbCBpbnN0YW5jZW9mIFVzZXIpICkgeworICAgICAgICAgICAgLy9QbGF5IG5pY2Ugd2l0aCBTU08gYW5kIG1peGVkIFJlYWxtcworICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmhhc1JvbGUocHJpbmNpcGFsLCByb2xlKTsKKyAgICAgICAgfQorICAgICAgICBpZigiKiIuZXF1YWxzKHJvbGUpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmKHJvbGUgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIFVzZXIgdXNlciA9IChVc2VyKXByaW5jaXBhbDsKKyAgICAgICAgUm9sZSBkYnJvbGUgPSBkYXRhYmFzZS5maW5kUm9sZShyb2xlKTsKKyAgICAgICAgaWYoZGJyb2xlID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsgCisgICAgICAgIH0KKyAgICAgICAgaWYodXNlci5pc0luUm9sZShkYnJvbGUpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBJdGVyYXRvciBncm91cHMgPSB1c2VyLmdldEdyb3VwcygpOworICAgICAgICB3aGlsZShncm91cHMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBHcm91cCBncm91cCA9IChHcm91cClncm91cHMubmV4dCgpOworICAgICAgICAgICAgaWYoZ3JvdXAuaXNJblJvbGUoZGJyb2xlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisJCQorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm90ZWN0ZWQgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBzaG9ydCBuYW1lIGZvciB0aGlzIFJlYWxtIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0TmFtZSgpIHsKKworICAgICAgICByZXR1cm4gKG5hbWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHBhc3N3b3JkIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gcHJpbmNpcGFsJ3MgdXNlciBuYW1lLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UGFzc3dvcmQoU3RyaW5nIHVzZXJuYW1lKSB7CisKKyAgICAgICAgVXNlciB1c2VyID0gZGF0YWJhc2UuZmluZFVzZXIodXNlcm5hbWUpOworCisgICAgICAgIGlmICh1c2VyID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9IAorCisgICAgICAgIHJldHVybiAodXNlci5nZXRQYXNzd29yZCgpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBQcmluY2lwYWwgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiB1c2VyIG5hbWUuCisgICAgICovCisgICAgcHJvdGVjdGVkIFByaW5jaXBhbCBnZXRQcmluY2lwYWwoU3RyaW5nIHVzZXJuYW1lKSB7CisKKyAgICAgICAgcmV0dXJuIChkYXRhYmFzZS5maW5kVXNlcih1c2VybmFtZSkpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTGlmZWN5Y2xlIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUHJlcGFyZSBmb3IgYWN0aXZlIHVzZSBvZiB0aGUgcHVibGljIG1ldGhvZHMgb2YgdGhpcyBDb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIExpZmVjeWNsZUV4Y2VwdGlvbiBpZiB0aGlzIGNvbXBvbmVudCBkZXRlY3RzIGEgZmF0YWwgZXJyb3IKKyAgICAgKiAgdGhhdCBwcmV2ZW50cyBpdCBmcm9tIGJlaW5nIHN0YXJ0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc3RhcnQoKSB0aHJvd3MgTGlmZWN5Y2xlRXhjZXB0aW9uIHsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3RhbmRhcmRTZXJ2ZXIgc2VydmVyID0gKFN0YW5kYXJkU2VydmVyKSBTZXJ2ZXJGYWN0b3J5LmdldFNlcnZlcigpOworICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gc2VydmVyLmdldEdsb2JhbE5hbWluZ0NvbnRleHQoKTsKKyAgICAgICAgICAgIGRhdGFiYXNlID0gKFVzZXJEYXRhYmFzZSkgY29udGV4dC5sb29rdXAocmVzb3VyY2VOYW1lKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKKyAgICAgICAgICAgIGNvbnRhaW5lci5nZXRMb2dnZXIoKS5lcnJvcihzbS5nZXRTdHJpbmcoInVzZXJEYXRhYmFzZVJlYWxtLmxvb2t1cCIsIHJlc291cmNlTmFtZSksIGUpOworICAgICAgICAgICAgZGF0YWJhc2UgPSBudWxsOworICAgICAgICB9CisgICAgICAgIGlmIChkYXRhYmFzZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTGlmZWN5Y2xlRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygidXNlckRhdGFiYXNlUmVhbG0ubm9EYXRhYmFzZSIsIHJlc291cmNlTmFtZSkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUGVyZm9ybSBub3JtYWwgc3VwZXJjbGFzcyBpbml0aWFsaXphdGlvbgorICAgICAgICBzdXBlci5zdGFydCgpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHcmFjZWZ1bGx5IHNodXQgZG93biBhY3RpdmUgdXNlIG9mIHRoZSBwdWJsaWMgbWV0aG9kcyBvZiB0aGlzIENvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTGlmZWN5Y2xlRXhjZXB0aW9uIGlmIHRoaXMgY29tcG9uZW50IGRldGVjdHMgYSBmYXRhbCBlcnJvcgorICAgICAqICB0aGF0IG5lZWRzIHRvIGJlIHJlcG9ydGVkCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHN0b3AoKSB0aHJvd3MgTGlmZWN5Y2xlRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBQZXJmb3JtIG5vcm1hbCBzdXBlcmNsYXNzIGZpbmFsaXphdGlvbgorICAgICAgICBzdXBlci5zdG9wKCk7CisKKyAgICAgICAgLy8gUmVsZWFzZSByZWZlcmVuY2UgdG8gb3VyIHVzZXIgZGF0YWJhc2UKKyAgICAgICAgZGF0YWJhc2UgPSBudWxsOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9yZWFsbS9tYmVhbnMtZGVzY3JpcHRvcnMueG1sIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3JlYWxtL21iZWFucy1kZXNjcmlwdG9ycy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFlYjNiNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9yZWFsbS9tYmVhbnMtZGVzY3JpcHRvcnMueG1sCkBAIC0wLDAgKzEsMjk4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzxtYmVhbnMtZGVzY3JpcHRvcnM+CisKKyAgPG1iZWFuICAgICAgICAgbmFtZT0iRGF0YVNvdXJjZVJlYWxtIgorICAgICAgICAgICAgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLm1iZWFucy5DbGFzc05hbWVNQmVhbiIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iSW1wbGVtZW50YXRpb24gb2YgUmVhbG0gdGhhdCB3b3JrcyB3aXRoIGFueSBKTkRJIGNvbmZpZ3VyZWQgRGF0YVNvdXJjZSIKKyAgICAgICAgICAgICAgIGRvbWFpbj0iQ2F0YWxpbmEiCisgICAgICAgICAgICAgICAgZ3JvdXA9IlJlYWxtIgorICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtLkRhdGFTb3VyY2VSZWFsbSI+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0iY2xhc3NOYW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJGdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgbWFuYWdlZCBvYmplY3QiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0iZGF0YVNvdXJjZU5hbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBKTkRJIG5hbWVkIEpEQkMgRGF0YVNvdXJjZSBmb3IgeW91ciBkYXRhYmFzZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImRpZ2VzdCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iRGlnZXN0IGFsZ29yaXRobSB1c2VkIGluIHN0b3JpbmcgcGFzc3dvcmRzIGluIGEKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vbi1wbGFpbnRleHQgZm9ybWF0IgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0ibG9jYWxEYXRhU291cmNlIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJDb25maWd1cmVzIGlmIHRoZSBEYXRhU291cmNlIGlzIGxvY2FsIHRvIHRoZSB3ZWJhcHAiCisgICAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJyb2xlTmFtZUNvbCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIGNvbHVtbiBpbiB0aGUgdXNlciByb2xlIHRhYmxlIHRoYXQgbmFtZXMgYSByb2xlIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0idXNlckNyZWRDb2wiCisgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBjb2x1bW4gaW4gdGhlIHVzZXIgdGFibGUgdGhhdCBob2xkcyB0aGUgdXNlcidzCisgICAgICAgICAgICAgICAgICAgICAgICBjcmVkZW50aWFscyIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InVzZXJOYW1lQ29sIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgY29sdW1uIGluIHRoZSB1c2VyIHRhYmxlIHRoYXQgaG9sZHMgdGhlIHVzZXIncworICAgICAgICAgICAgICAgICAgICAgICAgdXNlcm5hbWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJ1c2VyUm9sZVRhYmxlIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgdGFibGUgdGhhdCBob2xkcyB0aGUgcmVsYXRpb24gYmV0d2VlbiB1c2VyJ3MgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICByb2xlcyIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InVzZXJUYWJsZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIHRhYmxlIHRoYXQgaG9sZHMgdXNlciBkYXRhIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisKKworICAgIDxvcGVyYXRpb24gbmFtZT0ic3RhcnQiIGRlc2NyaXB0aW9uPSJTdGFydCIgaW1wYWN0PSJBQ1RJT04iIHJldHVyblR5cGU9InZvaWQiIC8+CisgICAgPG9wZXJhdGlvbiBuYW1lPSJzdG9wIiBkZXNjcmlwdGlvbj0iU3RvcCIgaW1wYWN0PSJBQ1RJT04iIHJldHVyblR5cGU9InZvaWQiIC8+CisgICAgPG9wZXJhdGlvbiBuYW1lPSJpbml0IiBkZXNjcmlwdGlvbj0iSW5pdCIgaW1wYWN0PSJBQ1RJT04iIHJldHVyblR5cGU9InZvaWQiIC8+CisgICAgPG9wZXJhdGlvbiBuYW1lPSJkZXN0cm95IiBkZXNjcmlwdGlvbj0iRGVzdHJveSIgaW1wYWN0PSJBQ1RJT04iIHJldHVyblR5cGU9InZvaWQiIC8+CisKKyAgPC9tYmVhbj4KKworICA8bWJlYW4gICAgICAgICBuYW1lPSJKQUFTUmVhbG0iCisgICAgICAgICAgZGVzY3JpcHRpb249IkltcGxtZW50YXRpb24gb2YgUmVhbG0gdGhhdCBhdXRoZW50aWNhdGVzIHVzZXJzIHZpYSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgSmF2YSBBdXRoZW50aWNhdGlvbiBhbmQgQXV0aG9yaXphdGlvbiBTZXJ2aWNlIChKQUFTKSIKKyAgICAgICAgICAgICAgIGRvbWFpbj0iQ2F0YWxpbmEiCisgICAgICAgICAgICAgICAgZ3JvdXA9IlJlYWxtIgorICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtLkpBQVNSZWFsbSI+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0iYXBwTmFtZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIGFwcGxpY2F0aW9uIG5hbWUgcGFzc2VkIHRvIHRoZSBKQUFTIExvZ2luQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgd2hpY2ggdXNlcyBpdCB0byBzZWxlY3QgdGhlIHNldCBvZiByZWxldmFudAorICAgICAgICAgICAgICAgICAgICAgICBMb2dpbk1vZHVsZXMiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJjbGFzc05hbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249IkZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBtYW5hZ2VkIG9iamVjdCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJkaWdlc3QiCisgICAgICAgICAgZGVzY3JpcHRpb249IkRpZ2VzdCBhbGdvcml0aG0gdXNlZCBpbiBzdG9yaW5nIHBhc3N3b3JkcyBpbiBhCisgICAgICAgICAgICAgICAgICAgICAgIG5vbi1wbGFpbnRleHQgZm9ybWF0IgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0icm9sZUNsYXNzTmFtZXMiCisgICAgICAgICAgZGVzY3JpcHRpb249IkNvbW1hLWRlbGltaXRlZCBsaXN0IG9mIGphdmF4LnNlY3VyaXR5LlByaW5jaXBhbCBjbGFzc2VzCisgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgcmVwcmVzZW50IHNlY3VyaXR5IHJvbGVzIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0idXNlckNsYXNzTmFtZXMiCisgICAgICAgICAgZGVzY3JpcHRpb249IkNvbW1hLWRlbGltaXRlZCBsaXN0IG9mIGphdmF4LnNlY3VyaXR5LlByaW5jaXBhbCBjbGFzc2VzCisgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgcmVwcmVzZW50IGluZGl2aWR1YWwgdXNlcnMiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJ2YWxpZGF0ZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iU2hvdWxkIHdlIHZhbGlkYXRlIGNsaWVudCBjZXJ0aWZpY2F0ZSBjaGFpbnMgd2hlbiB0aGV5CisgICAgICAgICAgICAgICAgICAgICAgIGFyZSBwcmVzZW50ZWQ/IgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisKKworICAgIDxvcGVyYXRpb24gbmFtZT0ic3RhcnQiIGRlc2NyaXB0aW9uPSJTdGFydCIgaW1wYWN0PSJBQ1RJT04iIHJldHVyblR5cGU9InZvaWQiIC8+CisgICAgPG9wZXJhdGlvbiBuYW1lPSJzdG9wIiBkZXNjcmlwdGlvbj0iU3RvcCIgaW1wYWN0PSJBQ1RJT04iIHJldHVyblR5cGU9InZvaWQiIC8+CisgICAgPG9wZXJhdGlvbiBuYW1lPSJpbml0IiBkZXNjcmlwdGlvbj0iSW5pdCIgaW1wYWN0PSJBQ1RJT04iIHJldHVyblR5cGU9InZvaWQiIC8+CisgICAgPG9wZXJhdGlvbiBuYW1lPSJkZXN0cm95IiBkZXNjcmlwdGlvbj0iRGVzdHJveSIgaW1wYWN0PSJBQ1RJT04iIHJldHVyblR5cGU9InZvaWQiIC8+CisgIDwvbWJlYW4+CisKKworICA8bWJlYW4gICAgICAgICBuYW1lPSJKREJDUmVhbG0iCisgICAgICAgICAgZGVzY3JpcHRpb249IkltcGxlbWVudGF0aW9uIG9mIFJlYWxtIHRoYXQgd29ya3Mgd2l0aCBhbnkgSkRCQworICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWQgZGF0YWJhc2UiCisgICAgICAgICAgICAgICBkb21haW49IkNhdGFsaW5hIgorICAgICAgICAgICAgICAgIGdyb3VwPSJSZWFsbSIKKyAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5yZWFsbS5KREJDUmVhbG0iPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImNsYXNzTmFtZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iRnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIG1hbmFnZWQgb2JqZWN0IgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImNvbm5lY3Rpb25OYW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgY29ubmVjdGlvbiB1c2VybmFtZSB0byB1c2Ugd2hlbiB0cnlpbmcgdG8gY29ubmVjdCB0bworICAgICAgICAgICAgICAgICAgICAgICB0aGUgZGF0YWJhc2UiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJjb25uZWN0aW9uUGFzc3dvcmQiCisgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBjb25uZWN0aW9uIFVSTCB0byB1c2Ugd2hlbiB0cnlpbmcgdG8gY29ubmVjdCB0byB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgZGF0YWJhc2UiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJjb25uZWN0aW9uVVJMIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgY29ubmVjdGlvbiBVUkwgdG8gdXNlIHdoZW4gdHJ5aW5nIHRvIGNvbm5lY3QgdG8gdGhlCisgICAgICAgICAgICAgICAgICAgICAgIGRhdGFiYXNlIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0iZGlnZXN0IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJEaWdlc3QgYWxnb3JpdGhtIHVzZWQgaW4gc3RvcmluZyBwYXNzd29yZHMgaW4gYQorICAgICAgICAgICAgICAgICAgICAgICBub24tcGxhaW50ZXh0IGZvcm1hdCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImRyaXZlck5hbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBKREJDIGRyaXZlciB0byB1c2UiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJyb2xlTmFtZUNvbCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIGNvbHVtbiBpbiB0aGUgdXNlciByb2xlIHRhYmxlIHRoYXQgbmFtZXMgYSByb2xlIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0idXNlckNyZWRDb2wiCisgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBjb2x1bW4gaW4gdGhlIHVzZXIgdGFibGUgdGhhdCBob2xkcyB0aGUgdXNlcidzCisgICAgICAgICAgICAgICAgICAgICAgIGNyZWRlbnRpYWxzIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0idXNlck5hbWVDb2wiCisgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBjb2x1bW4gaW4gdGhlIHVzZXIgdGFibGUgdGhhdCBob2xkcyB0aGUgdXNlcidzCisgICAgICAgICAgICAgICAgICAgICAgIHVzZXJuYW1lIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0idXNlclJvbGVUYWJsZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIHRhYmxlIHRoYXQgaG9sZHMgdGhlIHJlbGF0aW9uIGJldHdlZW4gdXNlcidzIGFuZAorICAgICAgICAgICAgICAgICAgICAgICByb2xlcyIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InVzZXJUYWJsZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIHRhYmxlIHRoYXQgaG9sZHMgdXNlciBkYXRhIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisKKworICAgIDxvcGVyYXRpb24gbmFtZT0ic3RhcnQiIGRlc2NyaXB0aW9uPSJTdGFydCIgaW1wYWN0PSJBQ1RJT04iIHJldHVyblR5cGU9InZvaWQiIC8+CisgICAgPG9wZXJhdGlvbiBuYW1lPSJzdG9wIiBkZXNjcmlwdGlvbj0iU3RvcCIgaW1wYWN0PSJBQ1RJT04iIHJldHVyblR5cGU9InZvaWQiIC8+CisgICAgPG9wZXJhdGlvbiBuYW1lPSJpbml0IiBkZXNjcmlwdGlvbj0iSW5pdCIgaW1wYWN0PSJBQ1RJT04iIHJldHVyblR5cGU9InZvaWQiIC8+CisgICAgPG9wZXJhdGlvbiBuYW1lPSJkZXN0cm95IiBkZXNjcmlwdGlvbj0iRGVzdHJveSIgaW1wYWN0PSJBQ1RJT04iIHJldHVyblR5cGU9InZvaWQiIC8+CisgIDwvbWJlYW4+CisKKyAgPG1iZWFuICAgICAgICAgbmFtZT0iSk5ESVJlYWxtIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJJbXBsZW1lbnRhdGlvbiBvZiBSZWFsbSB0aGF0IHdvcmtzIHdpdGggYSBkaXJlY3RvcnkKKyAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyIGFjY2Vzc2VkIHZpYSB0aGUgSmF2YSBOYW1pbmcgYW5kIERpcmVjdG9yeQorICAgICAgICAgICAgICAgICAgICAgICBJbnRlcmZhY2UgKEpOREkpIEFQSXMiCisgICAgICAgICAgICAgICBkb21haW49IkNhdGFsaW5hIgorICAgICAgICAgICAgICAgIGdyb3VwPSJSZWFsbSIKKyAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5yZWFsbS5KTkRJUmVhbG0iPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImNsYXNzTmFtZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iRnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIG1hbmFnZWQgb2JqZWN0IgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImNvbm5lY3Rpb25OYW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgY29ubmVjdGlvbiB1c2VybmFtZSBmb3IgdGhlIHNlcnZlciB3ZSB3aWxsIGNvbnRhY3QiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJjb25uZWN0aW9uUGFzc3dvcmQiCisgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBjb25uZWN0aW9uIHBhc3N3b3JkIGZvciB0aGUgc2VydmVyIHdlIHdpbGwgY29udGFjdCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImNvbm5lY3Rpb25VUkwiCisgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBjb25uZWN0aW9uIFVSTCBmb3IgdGhlIHNlcnZlciB3ZSB3aWxsIGNvbnRhY3QiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJjb250ZXh0RmFjdG9yeSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIEpOREkgY29udGV4dCBmYWN0b3J5IGZvciB0aGlzIFJlYWxtIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0iZGlnZXN0IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJEaWdlc3QgYWxnb3JpdGhtIHVzZWQgaW4gc3RvcmluZyBwYXNzd29yZHMgaW4gYQorICAgICAgICAgICAgICAgICAgICAgICBub24tcGxhaW50ZXh0IGZvcm1hdCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InJvbGVCYXNlIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgYmFzZSBlbGVtZW50IGZvciByb2xlIHNlYXJjaGVzIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0icm9sZU5hbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgY29udGFpbmluZyByb2xlcyBoZWxkIGVsc2V3aGVyZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InJvbGVTZWFyY2giCisgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBtZXNzYWdlIGZvcm1hdCB1c2VkIHRvIHNlbGVjdCByb2xlcyBmb3IgYSB1c2VyIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0icm9sZVN1YnRyZWUiCisgICAgICAgICAgZGVzY3JpcHRpb249IlNob3VsZCB3ZSBzZWFyY2ggdGhlIGVudGlyZSBzdWJ0cmVlIGZvciBtYXRjaGluZworICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXJzaGlwcz8iCisgICAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJ1c2VyQmFzZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIGJhc2UgZWxlbWVudCBmb3IgdXNlciBzZWFyY2hlcyIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InVzZXJQYXNzd29yZCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIGF0dHJpYnV0ZSBuYW1lIHVzZWQgdG8gcmV0cmlldmUgdGhlIHVzZXIgcGFzc3dvcmQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJ1c2VyUGF0dGVybiIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIG1lc3NhZ2UgZm9ybWF0IHVzZWQgdG8gc2VsZWN0IGEgdXNlciIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorCisgICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJ1c2VyUm9sZU5hbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgaW4gdGhlIHVzZXIncyBlbnRyeSBjb250YWluaW5nCisgICAgICAgICAgICAgICAgICAgICAgIHJvbGVzIGZvciB0aGF0IHVzZXIiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKworICAgPGF0dHJpYnV0ZSAgIG5hbWU9InVzZXJTZWFyY2giCisgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIG1lc3NhZ2UgZm9ybWF0IHVzZWQgdG8gc2VhcmNoIGZvciBhIHVzZXIiCisgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InVzZXJTdWJ0cmVlIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJTaG91bGQgd2Ugc2VhcmNoIHRoZSBlbnRpcmUgc3VidHJlZSBmb3IgbWF0Y2hpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgdXNlcnM/IgorICAgICAgICAgICAgICAgICB0eXBlPSJib29sZWFuIi8+CisKKworICAgIDxvcGVyYXRpb24gbmFtZT0ic3RhcnQiIGRlc2NyaXB0aW9uPSJTdGFydCIgaW1wYWN0PSJBQ1RJT04iIHJldHVyblR5cGU9InZvaWQiIC8+CisgICAgPG9wZXJhdGlvbiBuYW1lPSJzdG9wIiBkZXNjcmlwdGlvbj0iU3RvcCIgaW1wYWN0PSJBQ1RJT04iIHJldHVyblR5cGU9InZvaWQiIC8+CisgICAgPG9wZXJhdGlvbiBuYW1lPSJpbml0IiBkZXNjcmlwdGlvbj0iSW5pdCIgaW1wYWN0PSJBQ1RJT04iIHJldHVyblR5cGU9InZvaWQiIC8+CisgICAgPG9wZXJhdGlvbiBuYW1lPSJkZXN0cm95IiBkZXNjcmlwdGlvbj0iRGVzdHJveSIgaW1wYWN0PSJBQ1RJT04iIHJldHVyblR5cGU9InZvaWQiIC8+CisgIDwvbWJlYW4+CisKKyAgPG1iZWFuICAgICAgICAgbmFtZT0iTWVtb3J5UmVhbG0iCisgICAgICAgICAgZGVzY3JpcHRpb249IlNpbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiBSZWFsbSB0aGF0IHJlYWRzIGFuIFhNTCBmaWxlIHRvCisgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyZSB0aGUgdmFsaWQgdXNlcnMsIHBhc3N3b3JkcywgYW5kIHJvbGVzIgorICAgICAgICAgICAgICAgZG9tYWluPSJDYXRhbGluYSIKKyAgICAgICAgICAgICAgICBncm91cD0iUmVhbG0iCisgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUuY2F0YWxpbmEucmVhbG0uTWVtb3J5UmVhbG0iPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImNsYXNzTmFtZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iRnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIG1hbmFnZWQgb2JqZWN0IgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InBhdGhuYW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgcGF0aG5hbWUgb2YgdGhlIFhNTCBmaWxlIGNvbnRhaW5pbmcgb3VyIGRhdGFiYXNlCisgICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWF0aW9uIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisKKyAgICA8b3BlcmF0aW9uIG5hbWU9InN0YXJ0IiBkZXNjcmlwdGlvbj0iU3RhcnQiIGltcGFjdD0iQUNUSU9OIiByZXR1cm5UeXBlPSJ2b2lkIiAvPgorICAgIDxvcGVyYXRpb24gbmFtZT0ic3RvcCIgZGVzY3JpcHRpb249IlN0b3AiIGltcGFjdD0iQUNUSU9OIiByZXR1cm5UeXBlPSJ2b2lkIiAvPgorICAgIDxvcGVyYXRpb24gbmFtZT0iaW5pdCIgZGVzY3JpcHRpb249IkluaXQiIGltcGFjdD0iQUNUSU9OIiByZXR1cm5UeXBlPSJ2b2lkIiAvPgorICAgIDxvcGVyYXRpb24gbmFtZT0iZGVzdHJveSIgZGVzY3JpcHRpb249IkRlc3Ryb3kiIGltcGFjdD0iQUNUSU9OIiByZXR1cm5UeXBlPSJ2b2lkIiAvPgorCisgIDwvbWJlYW4+CisKKyAgPG1iZWFuICAgICAgICAgbmFtZT0iVXNlckRhdGFiYXNlUmVhbG0iCisgICAgICAgICAgZGVzY3JpcHRpb249IlJlYWxtIGNvbm5lY3RlZCB0byBhIFVzZXJEYXRhYmFzZSBhcyBhIGdsb2JhbCBKTkRJCisgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlIgorICAgICAgICAgICAgICAgZG9tYWluPSJDYXRhbGluYSIKKyAgICAgICAgICAgICAgICBncm91cD0iUmVhbG0iCisgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUuY2F0YWxpbmEucmVhbG0uVXNlckRhdGFiYXNlUmVhbG0iPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImNsYXNzTmFtZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iRnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIG1hbmFnZWQgb2JqZWN0IgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InJlc291cmNlTmFtZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIGdsb2JhbCBKTkRJIG5hbWUgb2YgdGhlIFVzZXJEYXRhYmFzZSByZXNvdXJjZSB0byB1c2UiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKworICA8L21iZWFuPgorCis8L21iZWFucy1kZXNjcmlwdG9ycz4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9yZWFsbS9wYWNrYWdlLmh0bWwgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvcmVhbG0vcGFja2FnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ZWZjZmUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvcmVhbG0vcGFja2FnZS5odG1sCkBAIC0wLDAgKzEsNjQgQEAKKzxib2R5PgorCis8cD5UaGlzIHBhY2thZ2UgY29udGFpbnMgPGNvZGU+UmVhbG08L2NvZGU+IGltcGxlbWVudGF0aW9ucyBmb3IgdGhlCit2YXJpb3VzIHN1cHBvcnRlZCByZWFsbSB0ZWNobm9sb2dpZXMgZm9yIGF1dGhlbnRpY2F0aW5nIHVzZXJzIGFuZAoraWRlbnRpZnlpbmcgdGhlaXIgYXNzb2NpYXRlZCByb2xlcy4gIFRoZSA8Y29kZT5SZWFsbTwvY29kZT4gdGhhdCBpcworYXNzb2NpYXRlZCB3aXRoIGEgd2ViIGFwcGxpY2F0aW9uJ3MgPGNvZGU+Q29udGV4dDwvY29kZT4gKG9yIGEgaGllcmFyY2hpY2FsbHkKK3N1cGVyaW9yIENvbnRhaW5lcikgaXMgdXNlZCB0byByZXNvbHZlIGF1dGhlbnRpY2F0aW9uIGFuZCByb2xlIHByZXNlbmNlCitxdWVzdGlvbnMgd2hlbiBhIHdlYiBhcHBsaWNhdGlvbiB1c2VzIGNvbnRhaW5lciBtYW5hZ2VkIHNlY3VyaXR5IGFzIGRlc2NyaWJlZAoraW4gdGhlIFNlcnZsZXQgQVBJIFNwZWNpZmljYXRpb24sIHZlcnNpb24gMi4yLjwvcD4KKworPHA+VGhlIGltcGxlbWVudGF0aW9ucyBzaGFyZSBhIGNvbW1vbiBiYXNlIGNsYXNzIHRoYXQgc3VwcG9ydHMgYmFzaWMKK2Z1bmN0aW9uYWxpdHkgZm9yIGFsbCBvZiB0aGUgc3RhbmRhcmQgPGNvZGU+UmVhbG08L2NvZGU+IGltcGxlbWVudGF0aW9ucywKK2FuZCBjYW4gYmUgY29uZmlndXJlZCBieSBzZXR0aW5nIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllcyAoZGVmYXVsdCB2YWx1ZXMKK2FyZSBpbiBzcXVhcmUgYnJhY2tldHMpOjwvcD4KKzx1bD4KKzxsaT48Yj5kZWJ1ZzwvYj4gLSBEZWJ1Z2dpbmcgZGV0YWlsIGxldmVsIGZvciB0aGlzIGNvbXBvbmVudC4gWzBdPC9saT4KKzwvdWw+CisKKzxwPlRoZSBzdGFuZGFyZCA8Y29kZT5SZWFsbTwvY29kZT4gaW1wbGVtZW50YXRpb25zIHRoYXQgYXJlIGN1cnJlbnRseQorYXZhaWxhYmxlIGluY2x1ZGUgdGhlIGZvbGxvd2luZyAod2l0aCBhZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcworYXMgc3BlY2lmaWVkKTo8L3A+Cis8dWw+Cis8bGk+PGI+SkRCQ1JlYWxtPC9iPiAtIEltcGxlbWVudGF0aW9uIG9mIDxjb2RlPlJlYWxtPC9jb2RlPiB0aGF0IG9wZXJhdGVzCisgICAgZnJvbSBkYXRhIHN0b3JlZCBpbiBhIHJlbGF0aW9uYWwgZGF0YWJhc2UgdGhhdCBpcyBhY2Nlc3NlZCB2aWEgYSBKREJDCisgICAgZHJpdmVyLiAgVGhlIG5hbWUgb2YgdGhlIGRyaXZlciwgZGF0YWJhc2UgY29ubmVjdGlvbiBpbmZvcm1hdGlvbiwgYW5kCisgICAgdGhlIG5hbWVzIG9mIHRoZSByZWxldmFudCB0YWJsZXMgYW5kIGNvbHVtbnMgYXJlIGNvbmZpZ3VyZWQgd2l0aCB0aGUKKyAgICBmb2xsb3dpbmcgYWRkaXRpb25hbCBwcm9wZXJ0aWVzOgorICAgIDx1bD4KKyAgICA8bGk+PGI+Y29ubmVjdGlvblVSTDwvYj4gLSBUaGUgVVJMIHRvIHVzZSB3aGVuIGNvbm5lY3RpbmcgdG8gdGhpcyBkYXRhYmFzZS4KKyAgICAgICAgW1JFUVVJUkVEIC0gTk8gREVGQVVMVF08L2xpPgorICAgIDxsaT48Yj5kcml2ZXJOYW1lPC9iPiAtIEZ1bGx5IHF1YWxpZmllZCBKYXZhIGNsYXNzIG5hbWUgb2YgdGhlIEpEQkMgZHJpdmVyCisgICAgICAgIHRvIGJlIHVzZWQuICBbUkVRVUlSRUQgLSBOTyBERUZBVUxUXTwvbGk+CisgICAgPGxpPjxiPnJvbGVOYW1lQ29sPC9iPiAtIE5hbWUgb2YgdGhlIGRhdGFiYXNlIGNvbHVtbiB0aGF0IGNvbnRhaW5zIHJvbGUKKyAgICAgICAgbmFtZXMuICBbUkVRVUlSRUQgLSBOTyBERUZBVUxUXTwvbGk+CisgICAgPGxpPjxiPnVzZXJDcmVkQ29sPC9iPiAtIE5hbWUgb2YgdGhlIGRhdGFiYXNlIGNvbHVtbiB0aGF0IGNvbnRhaW5zIHRoZQorICAgICAgICB1c2VyJ3MgY3JlZGVudGlhbHMgKGkuZS4gcGFzc3dvcmQpIGluIGNsZWFydGV4dC4gIFtSRVFVSVJFRCAtCisgICAgICAgIE5PIERFRkFVTFRdPC9saT4KKyAgICA8bGk+PGI+dXNlck5hbWVDb2w8L2I+IC0gTmFtZSBvZiB0aGUgZGF0YWJhc2UgY29sdW1uIHRoYXQgY29udGFpbnMgdGhlCisgICAgICAgIHVzZXIncyBsb2dvbiB1c2VybmFtZS4gIFtSRVFVSVJFRCAtIE5PIERFRkFVTFRdPC9saT4KKyAgICA8bGk+PGI+dXNlclJvbGVUYWJsZTwvYj4gLSBOYW1lIG9mIHRoZSBkYXRhYmFzZSB0YWJsZSBjb250YWluaW5nIHVzZXIKKyAgICAgICAgcm9sZSBpbmZvcm1hdGlvbi4gIFRoaXMgdGFibGUgbXVzdCBpbmNsdWRlIHRoZSBjb2x1bW5zIHNwZWNpZmllZCBieQorICAgICAgICB0aGUgPGNvZGU+dXNlck5hbWVDb2w8L2NvZGU+IGFuZCA8Y29kZT5yb2xlTmFtZUNvbDwvY29kZT4gcHJvcGVydGllcy4KKyAgICAgICAgW1JFUVVJUkVEIC0gTk8gREVGQVVMVF08L2xpPgorICAgIDxsaT48Yj51c2VyVGFibGU8L2I+IC0gTmFtZSBvZiB0aGUgZGF0YWJhc2UgdGFibGUgY29udGFpbmluZyB1c2VyCisgICAgICAgIGluZm9ybWF0aW9uLiAgVGhpcyB0YWJsZSBtdXN0IGluY2x1ZGUgdGhlIGNvbHVtbnMgc3BlY2lmaWVkIGJ5IHRoZQorICAgICAgICA8Y29kZT51c2VyTmFtZUNvbDwvY29kZT4gYW5kIDxjb2RlPnVzZXJDcmVkQ29sPC9jb2RlPiBwcm9wZXJ0aWVzLgorICAgICAgICBbUkVRVUlSRUQgLSBOTyBERUZBVUxUXTwvbGk+CisgICAgPC91bD4KKyAgICA8L2xpPgorPGxpPjxiPk1lbW9yeVJlYWxtPC9iPiAtIEltcGxlbWVudGF0aW9uIG9mIDxjb2RlPlJlYWxtPC9jb2RlPiB0aGF0IHVzZXMgdGhlCisgICAgY29udGVudHMgb2YgYSBzaW1wbGUgWE1MIGZpbGUgKDxjb2RlPmNvbmYvdG9tY2F0LXVzZXJzLnhtbDwvY29kZT4pIGFzIHRoZQorICAgIGxpc3Qgb2YgdmFsaWQgdXNlcnMgYW5kIHRoZWlyIHJvbGVzLiAgVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBwcmltYXJpbHkgdG8KKyAgICBkZW1vbnN0cmF0ZSB0aGF0IHRoZSBhdXRoZW50aWNhdGlvbiB0ZWNobm9sb2d5IGZ1bmN0aW9ucyBjb3JyZWN0bHksIGFuZCBpcworICAgIG5vdCBhbnRpY2lwYXRlZCBhcyBhZGVxdWF0ZSBmb3IgZ2VuZXJhbCBwdXJwb3NlIHVzZS4gIFRoaXMgY29tcG9uZW50CisgICAgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIHByb3BlcnRpZXM6CisgICAgPHVsPgorICAgIDxsaT48Yj5wYXRobmFtZTwvYj4gLSBQYXRobmFtZSBvZiB0aGUgWE1MIGZpbGUgY29udGFpbmluZyBvdXIgdXNlciBhbmQKKyAgICAgICAgcm9sZSBpbmZvcm1hdGlvbi4gIElmIGEgcmVsYXRpdmUgcGF0aG5hbWUgaXMgc3BlY2lmaWVkLCBpdCBpcyByZXNvbHZlZAorICAgICAgICBhZ2FpbnN0IHRoZSBwYXRobmFtZSBzcGVjaWZpZWQgYnkgdGhlICJjYXRhbGluYS5ob21lIiBzeXN0ZW0gcHJvcGVydHkuCisgICAgICAgIFtjb25mL3RvbWNhdC11c2Vycy54bWxdPC9saT4KKyAgICA8L3VsPgorPC91bD4KKworPC9ib2R5PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NlY3VyaXR5L0xvY2FsU3RyaW5ncy5wcm9wZXJ0aWVzIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NlY3VyaXR5L0xvY2FsU3RyaW5ncy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0M2ZkMzkKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc2VjdXJpdHkvTG9jYWxTdHJpbmdzLnByb3BlcnRpZXMKQEAgLTAsMCArMSwyIEBACitTZWN1cml0eVV0aWwuZG9Bc1ByaXZpbGVnZT1BbiBleGNlcHRpb24gb2NjdXJzIHdoZW4gcnVubmluZyB0aGUgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbiBibG9jay4KKwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NlY3VyaXR5L0xvY2FsU3RyaW5nc19lcy5wcm9wZXJ0aWVzIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NlY3VyaXR5L0xvY2FsU3RyaW5nc19lcy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwNWFhZjEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc2VjdXJpdHkvTG9jYWxTdHJpbmdzX2VzLnByb3BlcnRpZXMKQEAgLTAsMCArMSwyIEBACitTZWN1cml0eVV0aWwuZG9Bc1ByaXZpbGVnZT1IYSB0ZW5pZG8gbHVnYXIgdW5hIGV4Y2VwY2nzbiBhbCBlamVjdXRhciBlbCBibG9xdWUgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbi4KKwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NlY3VyaXR5L0xvY2FsU3RyaW5nc19mci5wcm9wZXJ0aWVzIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NlY3VyaXR5L0xvY2FsU3RyaW5nc19mci5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxOTkwMzUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc2VjdXJpdHkvTG9jYWxTdHJpbmdzX2ZyLnByb3BlcnRpZXMKQEAgLTAsMCArMSwyIEBACitTZWN1cml0eVV0aWwuZG9Bc1ByaXZpbGVnZT1VbmUgZXhjZXB0aW9uIHMnJ2VzdCBwcm9kdWl0ZSBsb3JzIGRlIGwnJ2V46WN1dGlvbiBkdSBibG9jICJQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uIi4KKwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NlY3VyaXR5L0xvY2FsU3RyaW5nc19qYS5wcm9wZXJ0aWVzIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NlY3VyaXR5L0xvY2FsU3RyaW5nc19qYS5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlNGFmMzAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc2VjdXJpdHkvTG9jYWxTdHJpbmdzX2phLnByb3BlcnRpZXMKQEAgLTAsMCArMSwyIEBACitTZWN1cml0eVV0aWwuZG9Bc1ByaXZpbGVnZT1Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uXHUzMGQ2XHUzMGVkXHUzMGMzXHUzMGFmXHUzMDkyXHU1YjlmXHU4ODRjXHU0ZTJkXHUzMDZiXHU0ZjhiXHU1OTE2XHUzMDRjXHU3NjdhXHU3NTFmXHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmXHUzMDAyCisKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zZWN1cml0eS9TZWN1cml0eUNsYXNzTG9hZC5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NlY3VyaXR5L1NlY3VyaXR5Q2xhc3NMb2FkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjliZjFjYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zZWN1cml0eS9TZWN1cml0eUNsYXNzTG9hZC5qYXZhCkBAIC0wLDAgKzEsMjEyIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnNlY3VyaXR5OworCisvKioKKyAqIFN0YXRpYyBjbGFzcyB1c2VkIHRvIHByZWxvYWQgamF2YSBjbGFzc2VzIHdoZW4gdXNpbmcgdGhlCisgKiBKYXZhIFNlY3VyaXR5TWFuYWdlciBzbyB0aGF0IHRoZSBkZWZpbmVDbGFzc0luUGFja2FnZQorICogUnVudGltZVBlcm1pc3Npb24gZG9lcyBub3QgdHJpZ2dlciBhbiBBY2Nlc3NDb250cm9sRXhjZXB0aW9uLgorICoKKyAqIEBhdXRob3IgR2xlbm4gTC4gTmllbHNlbgorICogQGF1dGhvciBKZWFuLUZyYW5jb2lzIEFyY2FuZAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgU2VjdXJpdHlDbGFzc0xvYWQgeworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNlY3VyaXR5Q2xhc3NMb2FkKENsYXNzTG9hZGVyIGxvYWRlcikKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYoIFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSA9PSBudWxsICl7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGxvYWRDb3JlUGFja2FnZShsb2FkZXIpOworICAgICAgICBsb2FkTG9hZGVyUGFja2FnZShsb2FkZXIpOworICAgICAgICBsb2FkU2Vzc2lvblBhY2thZ2UobG9hZGVyKTsKKyAgICAgICAgbG9hZFV0aWxQYWNrYWdlKGxvYWRlcik7CisgICAgICAgIGxvYWRKYXZheFBhY2thZ2UobG9hZGVyKTsKKyAgICAgICAgbG9hZENveW90ZVBhY2thZ2UobG9hZGVyKTsgICAgICAgIAorICAgICAgICBsb2FkSHR0cDExUGFja2FnZShsb2FkZXIpOyAgICAgICAgCisgICAgICAgIGxvYWRKa1BhY2thZ2UobG9hZGVyKTsKKyAgICB9CisgICAgCisgICAgCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgdm9pZCBsb2FkQ29yZVBhY2thZ2UoQ2xhc3NMb2FkZXIgbG9hZGVyKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGJhc2VQYWNrYWdlID0gIm9yZy5hcGFjaGUuY2F0YWxpbmEuIjsKKyAgICAgICAgbG9hZGVyLmxvYWRDbGFzcworICAgICAgICAgICAgKGJhc2VQYWNrYWdlICsKKyAgICAgICAgICAgICAiY29yZS5BcHBsaWNhdGlvbkNvbnRleHRGYWNhZGUkMSIpOworICAgICAgICBsb2FkZXIubG9hZENsYXNzCisgICAgICAgICAgICAoYmFzZVBhY2thZ2UgKworICAgICAgICAgICAgICJjb3JlLkFwcGxpY2F0aW9uRGlzcGF0Y2hlciRQcml2aWxlZ2VkRm9yd2FyZCIpOworICAgICAgICBsb2FkZXIubG9hZENsYXNzCisgICAgICAgICAgICAoYmFzZVBhY2thZ2UgKworICAgICAgICAgICAgICJjb3JlLkFwcGxpY2F0aW9uRGlzcGF0Y2hlciRQcml2aWxlZ2VkSW5jbHVkZSIpOworICAgICAgICBsb2FkZXIubG9hZENsYXNzCisgICAgICAgICAgICAoYmFzZVBhY2thZ2UgKworICAgICAgICAgICAgICJjb3JlLkNvbnRhaW5lckJhc2UkUHJpdmlsZWdlZEFkZENoaWxkIik7CisgICAgICAgIGxvYWRlci5sb2FkQ2xhc3MKKyAgICAgICAgICAgIChiYXNlUGFja2FnZSArCisgICAgICAgICAgICAgImNvcmUuU3RhbmRhcmRXcmFwcGVyJDEiKTsKKyAgICB9CisgICAgCisgICAgCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgdm9pZCBsb2FkTG9hZGVyUGFja2FnZShDbGFzc0xvYWRlciBsb2FkZXIpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgYmFzZVBhY2thZ2UgPSAib3JnLmFwYWNoZS5jYXRhbGluYS4iOworICAgICAgICBsb2FkZXIubG9hZENsYXNzCisgICAgICAgICAgICAoYmFzZVBhY2thZ2UgKworICAgICAgICAgICAgICJsb2FkZXIuV2ViYXBwQ2xhc3NMb2FkZXIkUHJpdmlsZWdlZEZpbmRSZXNvdXJjZSIpOworICAgIH0KKyAgICAKKyAgICAKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyB2b2lkIGxvYWRTZXNzaW9uUGFja2FnZShDbGFzc0xvYWRlciBsb2FkZXIpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgYmFzZVBhY2thZ2UgPSAib3JnLmFwYWNoZS5jYXRhbGluYS4iOworICAgICAgICBsb2FkZXIubG9hZENsYXNzCisgICAgICAgICAgICAoYmFzZVBhY2thZ2UgKyAic2Vzc2lvbi5TdGFuZGFyZFNlc3Npb24iKTsKKyAgICAgICAgbG9hZGVyLmxvYWRDbGFzcworICAgICAgICAgICAgKGJhc2VQYWNrYWdlICsKKyAgICAgICAgICAgICAic2Vzc2lvbi5TdGFuZGFyZFNlc3Npb24kMSIpOworICAgICAgICBsb2FkZXIubG9hZENsYXNzCisgICAgICAgICAgICAoYmFzZVBhY2thZ2UgKworICAgICAgICAgICAgICJzZXNzaW9uLlN0YW5kYXJkTWFuYWdlciRQcml2aWxlZ2VkRG9VbmxvYWQiKTsKKyAgICB9CisgICAgCisgICAgCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgdm9pZCBsb2FkVXRpbFBhY2thZ2UoQ2xhc3NMb2FkZXIgbG9hZGVyKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGJhc2VQYWNrYWdlID0gIm9yZy5hcGFjaGUuY2F0YWxpbmEuIjsKKyAgICAgICAgbG9hZGVyLmxvYWRDbGFzcworICAgICAgICAgICAgKGJhc2VQYWNrYWdlICsgInV0aWwuVVJMIik7CisgICAgICAgIGxvYWRlci5sb2FkQ2xhc3MoYmFzZVBhY2thZ2UgKyAidXRpbC5FbnVtZXJhdG9yIik7CisgICAgfQorICAgIAorICAgIAorICAgIHByaXZhdGUgZmluYWwgc3RhdGljIHZvaWQgbG9hZEphdmF4UGFja2FnZShDbGFzc0xvYWRlciBsb2FkZXIpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBsb2FkZXIubG9hZENsYXNzKCJqYXZheC5zZXJ2bGV0Lmh0dHAuQ29va2llIik7CisgICAgfQorICAgIAorCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgdm9pZCBsb2FkSHR0cDExUGFja2FnZShDbGFzc0xvYWRlciBsb2FkZXIpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgYmFzZVBhY2thZ2UgPSAib3JnLmFwYWNoZS5jb3lvdGUuaHR0cDExLiI7CisgICAgICAgIGxvYWRlci5sb2FkQ2xhc3MoYmFzZVBhY2thZ2UgKyAiSHR0cDExUHJvY2Vzc29yJDEiKTsKKyAgICAgICAgbG9hZGVyLmxvYWRDbGFzcyhiYXNlUGFja2FnZSArICJJbnRlcm5hbE91dHB1dEJ1ZmZlciQxIik7CisgICAgICAgIGxvYWRlci5sb2FkQ2xhc3MoYmFzZVBhY2thZ2UgKyAiSW50ZXJuYWxPdXRwdXRCdWZmZXIkMiIpOworICAgIH0KKyAgICAKKyAgICAKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyB2b2lkIGxvYWRDb3lvdGVQYWNrYWdlKENsYXNzTG9hZGVyIGxvYWRlcikKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBiYXNlUGFja2FnZSA9ICJvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3Rvci4iOworICAgICAgICBsb2FkZXIubG9hZENsYXNzCisgICAgICAgICAgICAoYmFzZVBhY2thZ2UgKworICAgICAgICAgICAgICJSZXF1ZXN0RmFjYWRlJEdldEF0dHJpYnV0ZVByaXZpbGVnZWRBY3Rpb24iKTsKKyAgICAgICAgbG9hZGVyLmxvYWRDbGFzcworICAgICAgICAgICAgKGJhc2VQYWNrYWdlICsKKyAgICAgICAgICAgICAiUmVxdWVzdEZhY2FkZSRHZXRQYXJhbWV0ZXJNYXBQcml2aWxlZ2VkQWN0aW9uIik7CisgICAgICAgIGxvYWRlci5sb2FkQ2xhc3MKKyAgICAgICAgICAgIChiYXNlUGFja2FnZSArCisgICAgICAgICAgICAgIlJlcXVlc3RGYWNhZGUkR2V0UmVxdWVzdERpc3BhdGNoZXJQcml2aWxlZ2VkQWN0aW9uIik7CisgICAgICAgIGxvYWRlci5sb2FkQ2xhc3MKKyAgICAgICAgICAgIChiYXNlUGFja2FnZSArCisgICAgICAgICAgICAgIlJlcXVlc3RGYWNhZGUkR2V0UGFyYW1ldGVyUHJpdmlsZWdlZEFjdGlvbiIpOworICAgICAgICBsb2FkZXIubG9hZENsYXNzCisgICAgICAgICAgICAoYmFzZVBhY2thZ2UgKworICAgICAgICAgICAgICJSZXF1ZXN0RmFjYWRlJEdldFBhcmFtZXRlck5hbWVzUHJpdmlsZWdlZEFjdGlvbiIpOworICAgICAgICBsb2FkZXIubG9hZENsYXNzCisgICAgICAgICAgICAoYmFzZVBhY2thZ2UgKworICAgICAgICAgICAgICJSZXF1ZXN0RmFjYWRlJEdldFBhcmFtZXRlclZhbHVlUHJpdmlsZWdlZEFjdGlvbiIpOworICAgICAgICBsb2FkZXIubG9hZENsYXNzCisgICAgICAgICAgICAoYmFzZVBhY2thZ2UgKworICAgICAgICAgICAgICJSZXF1ZXN0RmFjYWRlJEdldENoYXJhY3RlckVuY29kaW5nUHJpdmlsZWdlZEFjdGlvbiIpOworICAgICAgICBsb2FkZXIubG9hZENsYXNzCisgICAgICAgICAgICAoYmFzZVBhY2thZ2UgKworICAgICAgICAgICAgICJSZXF1ZXN0RmFjYWRlJEdldEhlYWRlcnNQcml2aWxlZ2VkQWN0aW9uIik7CisgICAgICAgIGxvYWRlci5sb2FkQ2xhc3MKKyAgICAgICAgICAgIChiYXNlUGFja2FnZSArCisgICAgICAgICAgICAgIlJlcXVlc3RGYWNhZGUkR2V0SGVhZGVyTmFtZXNQcml2aWxlZ2VkQWN0aW9uIik7ICAKKyAgICAgICAgbG9hZGVyLmxvYWRDbGFzcworICAgICAgICAgICAgKGJhc2VQYWNrYWdlICsKKyAgICAgICAgICAgICAiUmVxdWVzdEZhY2FkZSRHZXRDb29raWVzUHJpdmlsZWdlZEFjdGlvbiIpOworICAgICAgICBsb2FkZXIubG9hZENsYXNzCisgICAgICAgICAgICAoYmFzZVBhY2thZ2UgKworICAgICAgICAgICAgICJSZXF1ZXN0RmFjYWRlJEdldExvY2FsZVByaXZpbGVnZWRBY3Rpb24iKTsKKyAgICAgICAgbG9hZGVyLmxvYWRDbGFzcworICAgICAgICAgICAgKGJhc2VQYWNrYWdlICsKKyAgICAgICAgICAgICAiUmVxdWVzdEZhY2FkZSRHZXRMb2NhbGVzUHJpdmlsZWdlZEFjdGlvbiIpOworICAgICAgICBsb2FkZXIubG9hZENsYXNzCisgICAgICAgICAgICAoYmFzZVBhY2thZ2UgKworICAgICAgICAgICAgICJSZXNwb25zZUZhY2FkZSRTZXRDb250ZW50VHlwZVByaXZpbGVnZWRBY3Rpb24iKTsKKyAgICAgICAgbG9hZGVyLmxvYWRDbGFzcworICAgICAgICAgICAgKGJhc2VQYWNrYWdlICsgCisgICAgICAgICAgICAgIlJlc3BvbnNlRmFjYWRlJERhdGVIZWFkZXJQcml2aWxlZ2VkQWN0aW9uIik7CisgICAgICAgIGxvYWRlci5sb2FkQ2xhc3MKKyAgICAgICAgICAgIChiYXNlUGFja2FnZSArCisgICAgICAgICAgICAgIlJlcXVlc3RGYWNhZGUkR2V0U2Vzc2lvblByaXZpbGVnZWRBY3Rpb24iKTsKKyAgICAgICAgbG9hZGVyLmxvYWRDbGFzcworICAgICAgICAgICAgKGJhc2VQYWNrYWdlICsKKyAgICAgICAgICAgICAiUmVzcG9uc2VGYWNhZGUkMSIpOworICAgICAgICBsb2FkZXIubG9hZENsYXNzCisgICAgICAgICAgICAoYmFzZVBhY2thZ2UgKworICAgICAgICAgICAgICJPdXRwdXRCdWZmZXIkMSIpOworICAgICAgICBsb2FkZXIubG9hZENsYXNzCisgICAgICAgICAgICAoYmFzZVBhY2thZ2UgKworICAgICAgICAgICAgICJDb3lvdGVJbnB1dFN0cmVhbSQxIik7CisgICAgICAgIGxvYWRlci5sb2FkQ2xhc3MKKyAgICAgICAgICAgIChiYXNlUGFja2FnZSArCisgICAgICAgICAgICAgIkNveW90ZUlucHV0U3RyZWFtJDIiKTsKKyAgICAgICAgbG9hZGVyLmxvYWRDbGFzcworICAgICAgICAgICAgKGJhc2VQYWNrYWdlICsKKyAgICAgICAgICAgICAiQ295b3RlSW5wdXRTdHJlYW0kMyIpOworICAgICAgICBsb2FkZXIubG9hZENsYXNzCisgICAgICAgICAgICAoYmFzZVBhY2thZ2UgKworICAgICAgICAgICAgICJDb3lvdGVJbnB1dFN0cmVhbSQ0Iik7CisgICAgICAgIGxvYWRlci5sb2FkQ2xhc3MKKyAgICAgICAgICAgIChiYXNlUGFja2FnZSArCisgICAgICAgICAgICAgIkNveW90ZUlucHV0U3RyZWFtJDUiKTsKKyAgICAgICAgbG9hZGVyLmxvYWRDbGFzcworICAgICAgICAgICAgKGJhc2VQYWNrYWdlICsKKyAgICAgICAgICAgICAiSW5wdXRCdWZmZXIkMSIpOworICAgICAgICBsb2FkZXIubG9hZENsYXNzCisgICAgICAgICAgICAoYmFzZVBhY2thZ2UgKworICAgICAgICAgICAgICJSZXNwb25zZSQxIik7CisgICAgICAgIGxvYWRlci5sb2FkQ2xhc3MKKyAgICAgICAgICAgIChiYXNlUGFja2FnZSArCisgICAgICAgICAgICAgIlJlc3BvbnNlJDIiKTsKKyAgICAgICAgbG9hZGVyLmxvYWRDbGFzcworICAgICAgICAgICAgKGJhc2VQYWNrYWdlICsKKyAgICAgICAgICAgICAiUmVzcG9uc2UkMyIpOworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIHZvaWQgbG9hZEprUGFja2FnZShDbGFzc0xvYWRlciBsb2FkZXIpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgYmFzZVBhY2thZ2UgPSAib3JnLmFwYWNoZS5qay4iOworICAgICAgICBsb2FkZXIubG9hZENsYXNzCisgICAgICAgICAgICAoYmFzZVBhY2thZ2UgKworICAgICAgICAgICAgICJzZXJ2ZXIuSmtDb3lvdGVIYW5kbGVyJDEiKTsKKyAgICAgICAgbG9hZGVyLmxvYWRDbGFzcworICAgICAgICAgICAgKGJhc2VQYWNrYWdlICsKKyAgICAgICAgICAgICAic2VydmVyLkprQ295b3RlSGFuZGxlciRTdGF0dXNMaW5lUHJpdmlsZWdlZEFjdGlvbiIpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NlY3VyaXR5L1NlY3VyaXR5Q29uZmlnLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc2VjdXJpdHkvU2VjdXJpdHlDb25maWcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDY2YWNkCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NlY3VyaXR5L1NlY3VyaXR5Q29uZmlnLmphdmEKQEAgLTAsMCArMSwxMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5zZWN1cml0eTsKKworaW1wb3J0IGphdmEuc2VjdXJpdHkuU2VjdXJpdHk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5zdGFydHVwLkNhdGFsaW5hUHJvcGVydGllczsKKworLyoqCisgKiBVdGlsIGNsYXNzIHRvIHByb3RlY3QgQ2F0YWxpbmEgYWdhaW5zdCBwYWNrYWdlIGFjY2VzcyBhbmQgaW5zZXJ0aW9uLgorICogVGhlIGNvZGUgYXJlIGJlZW4gbW92ZWQgZnJvbSBDYXRhbGluYS5qYXZhCisgKiBAYXV0aG9yIHRoZSBDYXRhbGluYS5qYXZhIGF1dGhvcnMKKyAqIEBhdXRob3IgSmVhbi1GcmFuY29pcyBBcmNhbmQKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFNlY3VyaXR5Q29uZmlneworICAgIHByaXZhdGUgc3RhdGljIFNlY3VyaXR5Q29uZmlnIHNpbmdsZXRvbiA9IG51bGw7CisKKyAgICBwcml2YXRlIHN0YXRpYyBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2cgbG9nPQorICAgICAgICBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5LmdldExvZyggU2VjdXJpdHlDb25maWcuY2xhc3MgKTsKKworICAgIAorICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBQQUNLQUdFX0FDQ0VTUyA9ICAic3VuLiwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJvcmcuYXBhY2hlLmNhdGFsaW5hLiIgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsb3JnLmFwYWNoZS5qYXNwZXIuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLG9yZy5hcGFjaGUuY295b3RlLiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIixvcmcuYXBhY2hlLnRvbWNhdC4iOworICAgIAorICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBQQUNLQUdFX0RFRklOSVRJT049ICJqYXZhLixzdW4uIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLG9yZy5hcGFjaGUuY2F0YWxpbmEuIiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIixvcmcuYXBhY2hlLmNveW90ZS4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsb3JnLmFwYWNoZS50b21jYXQuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLG9yZy5hcGFjaGUuamFzcGVyLiI7CisgICAgLyoqCisgICAgICogTGlzdCBvZiBwcm90ZWN0ZWQgcGFja2FnZSBmcm9tIGNvbmYvY2F0YWxpbmEucHJvcGVydGllcworICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHBhY2thZ2VEZWZpbml0aW9uOworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIExpc3Qgb2YgcHJvdGVjdGVkIHBhY2thZ2UgZnJvbSBjb25mL2NhdGFsaW5hLnByb3BlcnRpZXMKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBwYWNrYWdlQWNjZXNzOyAKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBzaW5nbGUgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFNlY3VyaXR5Q29uZmlnKCl7ICAKKyAgICAgICAgdHJ5eworICAgICAgICAgICAgcGFja2FnZURlZmluaXRpb24gPSBDYXRhbGluYVByb3BlcnRpZXMuZ2V0UHJvcGVydHkoInBhY2thZ2UuZGVmaW5pdGlvbiIpOworICAgICAgICAgICAgcGFja2FnZUFjY2VzcyA9IENhdGFsaW5hUHJvcGVydGllcy5nZXRQcm9wZXJ0eSgicGFja2FnZS5hY2Nlc3MiKTsKKyAgICAgICAgfSBjYXRjaCAoamF2YS5sYW5nLkV4Y2VwdGlvbiBleCl7CisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpeworICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiVW5hYmxlIHRvIGxvYWQgcHJvcGVydGllcyB1c2luZyBDYXRhbGluYVByb3BlcnRpZXMiLCBleCk7IAorICAgICAgICAgICAgfSAgICAgICAgICAgIAorICAgICAgICB9CisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGF0IGNsYXNzLgorICAgICAqIEByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgdGhhdCBjbGFzcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFNlY3VyaXR5Q29uZmlnIG5ld0luc3RhbmNlKCl7CisgICAgICAgIGlmIChzaW5nbGV0b24gPT0gbnVsbCl7CisgICAgICAgICAgICBzaW5nbGV0b24gPSBuZXcgU2VjdXJpdHlDb25maWcoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2luZ2xldG9uOworICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHNlY3VyaXR5IHBhY2thZ2UuYWNjZXNzIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhY2thZ2VBY2Nlc3MoKXsKKyAgICAgICAgLy8gSWYgY2F0YWxpbmEucHJvcGVydGllcyBpcyBtaXNzaW5nLCBwcm90ZWN0IGFsbCBieSBkZWZhdWx0LgorICAgICAgICBpZiAocGFja2FnZUFjY2VzcyA9PSBudWxsKXsKKyAgICAgICAgICAgIHNldFNlY3VyaXR5UHJvcGVydHkoInBhY2thZ2UuYWNjZXNzIiwgUEFDS0FHRV9BQ0NFU1MpOyAgIAorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2V0U2VjdXJpdHlQcm9wZXJ0eSgicGFja2FnZS5hY2Nlc3MiLCBwYWNrYWdlQWNjZXNzKTsgICAKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHNlY3VyaXR5IHBhY2thZ2UuZGVmaW5pdGlvbiB2YWx1ZS4KKyAgICAgKi8KKyAgICAgcHVibGljIHZvaWQgc2V0UGFja2FnZURlZmluaXRpb24oKXsKKyAgICAgICAgLy8gSWYgY2F0YWxpbmEucHJvcGVydGllcyBpcyBtaXNzaW5nLCBwcm90ZWN0IGFsbCBieSBkZWZhdWx0LgorICAgICAgICAgaWYgKHBhY2thZ2VEZWZpbml0aW9uID09IG51bGwpeworICAgICAgICAgICAgc2V0U2VjdXJpdHlQcm9wZXJ0eSgicGFja2FnZS5kZWZpbml0aW9uIiwgUEFDS0FHRV9ERUZJTklUSU9OKTsKKyAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZXRTZWN1cml0eVByb3BlcnR5KCJwYWNrYWdlLmRlZmluaXRpb24iLCBwYWNrYWdlRGVmaW5pdGlvbik7CisgICAgICAgICB9CisgICAgfQorICAgICAKKyAgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBwcm9wZXIgc2VjdXJpdHkgcHJvcGVydHkKKyAgICAgKiBAcGFyYW0gcHJvcGVydGllcyB0aGUgcGFja2FnZS4qIHByb3BlcnR5LgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgdm9pZCBzZXRTZWN1cml0eVByb3BlcnR5KFN0cmluZyBwcm9wZXJ0aWVzLCBTdHJpbmcgcGFja2FnZUxpc3QpeworICAgICAgICBpZiAoU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpICE9IG51bGwpeworICAgICAgICAgICAgU3RyaW5nIGRlZmluaXRpb24gPSBTZWN1cml0eS5nZXRQcm9wZXJ0eShwcm9wZXJ0aWVzKTsKKyAgICAgICAgICAgIGlmKCBkZWZpbml0aW9uICE9IG51bGwgJiYgZGVmaW5pdGlvbi5sZW5ndGgoKSA+IDAgKXsKKyAgICAgICAgICAgICAgICBkZWZpbml0aW9uICs9ICIsIjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU2VjdXJpdHkuc2V0UHJvcGVydHkocHJvcGVydGllcywKKyAgICAgICAgICAgICAgICAvLyBGSVggTUUgcGFja2FnZSAiamF2YXguIiB3YXMgcmVtb3ZlZCB0byBwcmV2ZW50IEhvdFNwb3QKKyAgICAgICAgICAgICAgICAvLyBmYXRhbCBpbnRlcm5hbCBlcnJvcnMKKyAgICAgICAgICAgICAgICBkZWZpbml0aW9uICsgcGFja2FnZUxpc3QpOyAgICAgIAorICAgICAgICB9CisgICAgfQorICAgIAorICAgIAorfQorCisKKworCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc2VjdXJpdHkvU2VjdXJpdHlVdGlsLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc2VjdXJpdHkvU2VjdXJpdHlVdGlsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE5ZThhMAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zZWN1cml0eS9TZWN1cml0eVV0aWwuamF2YQpAQCAtMCwwICsxLDM2MyBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LTIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc2VjdXJpdHk7CisKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS5zZWN1cml0eS5QcmluY2lwYWw7CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKKworaW1wb3J0IGphdmF4LnNlY3VyaXR5LmF1dGguU3ViamVjdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LkZpbHRlcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXQ7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuVW5hdmFpbGFibGVFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkdsb2JhbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLlN0cmluZ01hbmFnZXI7CisvKioKKyAqIFRoaXMgdXRpbGl0eSBjbGFzcyBhc3NvY2lhdGVzIGEgPGNvZGU+U3ViamVjdDwvY29kZT4gdG8gdGhlIGN1cnJlbnQgCisgKiA8Y29kZT5BY2Nlc3NDb250cm9sQ29udGV4dDwvY29kZT4uIFdoZW4gYSA8Y29kZT5TZWN1cml0eU1hbmFnZXI8L2NvZGU+IGlzCisgKiB1c2VkLCAqIHRoZSBjb250YWluZXIgd2lsbCBhbHdheXMgYXNzb2NpYXRlIHRoZSBjYWxsZWQgdGhyZWFkIHdpdGggYW4gCisgKiBBY2Nlc3NDb250cm9sQ29udGV4dCAqIGNvbnRhaW5pbmcgb25seSB0aGUgcHJpbmNpcGFsIG9mIHRoZSByZXF1ZXN0ZWQKKyAqIFNlcnZsZXQvRmlsdGVyLgorICoKKyAqIFRoaXMgY2xhc3MgdXNlcyByZWZsZWN0aW9uIHRvIGludm9rZSB0aGUgaW52b2tlIG1ldGhvZHMuCisgKgorICogQGF1dGhvciBKZWFuLUZyYW5jb2lzIEFyY2FuZAorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBTZWN1cml0eVV0aWx7CisgICAgCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IElOSVQ9IDA7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFNFUlZJQ0UgPSAxOworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBET0ZJTFRFUiA9IDE7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IERFU1RST1kgPSAyOworICAgIAorICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBJTklUX01FVEhPRCA9ICJpbml0IjsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgRE9GSUxURVJfTUVUSE9EID0gImRvRmlsdGVyIjsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgU0VSVklDRV9NRVRIT0QgPSAic2VydmljZSI7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIERFU1RST1lfTUVUSE9EID0gImRlc3Ryb3kiOworICAgCisgICAgLyoqCisgICAgICogQ2FjaGUgZXZlcnkgb2JqZWN0IGZvciB3aGljaCB3ZSBhcmUgY3JlYXRpbmcgbWV0aG9kIG9uIGl0LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIEhhc2hNYXAgb2JqZWN0Q2FjaGUgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2cgbG9nPQorICAgICAgICBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5LmdldExvZyggU2VjdXJpdHlVdGlsLmNsYXNzICk7CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFBBQ0tBR0UgPSAib3JnLmFwYWNoZS5jYXRhbGluYS5zZWN1cml0eSI7CisgICAgCisgICAgLyoqCisgICAgICogVGhlIHN0cmluZyByZXNvdXJjZXMgZm9yIHRoaXMgcGFja2FnZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdNYW5hZ2VyIHNtID0KKyAgICAgICAgU3RyaW5nTWFuYWdlci5nZXRNYW5hZ2VyKFBBQ0tBR0UpOyAgICAKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtIHdvcmsgYXMgYSBwYXJ0aWN1bGFyIDwvY29kZT5TdWJqZWN0PC9jb2RlPi4gSGVyZSB0aGUgd29yaworICAgICAqIHdpbGwgYmUgZ3JhbnRlZCB0byBhIDxjb2RlPm51bGw8L2NvZGU+IHN1YmplY3QuIAorICAgICAqCisgICAgICogQHBhcmFtIG1ldGhvZE5hbWUgdGhlIG1ldGhvZCB0byBhcHBseSB0aGUgc2VjdXJpdHkgcmVzdHJpY3Rpb24KKyAgICAgKiBAcGFyYW0gdGFyZ2V0T2JqZWN0IHRoZSA8Y29kZT5TZXJ2bGV0PC9jb2RlPiBvbiB3aGljaCB0aGUgbWV0aG9kIHdpbGwKKyAgICAgKiBiZSBjYWxsZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGRvQXNQcml2aWxlZ2UoZmluYWwgU3RyaW5nIG1ldGhvZE5hbWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFNlcnZsZXQgdGFyZ2V0T2JqZWN0KSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsKKyAgICAgICAgIGRvQXNQcml2aWxlZ2UobWV0aG9kTmFtZSwgdGFyZ2V0T2JqZWN0LCBudWxsLCBudWxsLCBudWxsKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIH0KKworICAgIAorICAgIC8qKgorICAgICAqIFBlcmZvcm0gd29yayBhcyBhIHBhcnRpY3VsYXIgPC9jb2RlPlN1YmplY3Q8L2NvZGU+LiBIZXJlIHRoZSB3b3JrCisgICAgICogd2lsbCBiZSBncmFudGVkIHRvIGEgPGNvZGU+bnVsbDwvY29kZT4gc3ViamVjdC4gCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWV0aG9kTmFtZSB0aGUgbWV0aG9kIHRvIGFwcGx5IHRoZSBzZWN1cml0eSByZXN0cmljdGlvbgorICAgICAqIEBwYXJhbSB0YXJnZXRPYmplY3QgdGhlIDxjb2RlPlNlcnZsZXQ8L2NvZGU+IG9uIHdoaWNoIHRoZSBtZXRob2Qgd2lsbAorICAgICAqIGJlIGNhbGxlZC4KKyAgICAgKiBAcGFyYW0gdGFyZ2V0VHlwZSA8Y29kZT5DbGFzczwvY29kZT4gYXJyYXkgdXNlZCB0byBpbnN0YW5jaWF0ZSBhIGkKKyAgICAgKiA8Y29kZT5NZXRob2Q8L2NvZGU+IG9iamVjdC4KKyAgICAgKiBAcGFyYW0gdGFyZ2V0QXJndW1lbnRzIDxjb2RlPk9iamVjdDwvY29kZT4gYXJyYXkgY29udGFpbnMgdGhlIHJ1bnRpbWUgCisgICAgICogcGFyYW1ldGVycyBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZG9Bc1ByaXZpbGVnZShmaW5hbCBTdHJpbmcgbWV0aG9kTmFtZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU2VydmxldCB0YXJnZXRPYmplY3QsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzW10gdGFyZ2V0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3RbXSB0YXJnZXRBcmd1bWVudHMpIAorICAgICAgICB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsgICAgCisKKyAgICAgICAgIGRvQXNQcml2aWxlZ2UobWV0aG9kTmFtZSwgCisgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldE9iamVjdCwgCisgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFR5cGUsIAorICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRBcmd1bWVudHMsIAorICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtIHdvcmsgYXMgYSBwYXJ0aWN1bGFyIDwvY29kZT5TdWJqZWN0PC9jb2RlPi4gSGVyZSB0aGUgd29yaworICAgICAqIHdpbGwgYmUgZ3JhbnRlZCB0byBhIDxjb2RlPm51bGw8L2NvZGU+IHN1YmplY3QuIAorICAgICAqCisgICAgICogQHBhcmFtIG1ldGhvZE5hbWUgdGhlIG1ldGhvZCB0byBhcHBseSB0aGUgc2VjdXJpdHkgcmVzdHJpY3Rpb24KKyAgICAgKiBAcGFyYW0gdGFyZ2V0T2JqZWN0IHRoZSA8Y29kZT5TZXJ2bGV0PC9jb2RlPiBvbiB3aGljaCB0aGUgbWV0aG9kIHdpbGwKKyAgICAgKiBiZSBjYWxsZWQuCisgICAgICogQHBhcmFtIHRhcmdldFR5cGUgPGNvZGU+Q2xhc3M8L2NvZGU+IGFycmF5IHVzZWQgdG8gaW5zdGFuY2lhdGUgYSAKKyAgICAgKiA8Y29kZT5NZXRob2Q8L2NvZGU+IG9iamVjdC4KKyAgICAgKiBAcGFyYW0gdGFyZ2V0QXJndW1lbnRzIDxjb2RlPk9iamVjdDwvY29kZT4gYXJyYXkgY29udGFpbnMgdGhlIAorICAgICAqIHJ1bnRpbWUgcGFyYW1ldGVycyBpbnN0YW5jZS4KKyAgICAgKiBAcGFyYW0gcHJpbmNpcGFsIHRoZSA8Y29kZT5QcmluY2lwYWw8L2NvZGU+IHRvIHdoaWNoIHRoZSBzZWN1cml0eSAKKyAgICAgKiBwcml2aWxlZ2UgYXBwbHkuLgorICAgICAqLyAgICAKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZG9Bc1ByaXZpbGVnZShmaW5hbCBTdHJpbmcgbWV0aG9kTmFtZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU2VydmxldCB0YXJnZXRPYmplY3QsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzW10gdGFyZ2V0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3RbXSB0YXJnZXRBcmd1bWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbmNpcGFsIHByaW5jaXBhbCkgCisgICAgICAgIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9ueworCisgICAgICAgIE1ldGhvZCBtZXRob2QgPSBudWxsOworICAgICAgICBNZXRob2RbXSBtZXRob2RzQ2FjaGUgPSBudWxsOworICAgICAgICBpZihvYmplY3RDYWNoZS5jb250YWluc0tleSh0YXJnZXRPYmplY3QpKXsKKyAgICAgICAgICAgIG1ldGhvZHNDYWNoZSA9IChNZXRob2RbXSlvYmplY3RDYWNoZS5nZXQodGFyZ2V0T2JqZWN0KTsKKyAgICAgICAgICAgIG1ldGhvZCA9IGZpbmRNZXRob2QobWV0aG9kc0NhY2hlLCBtZXRob2ROYW1lKTsKKyAgICAgICAgICAgIGlmIChtZXRob2QgPT0gbnVsbCl7CisgICAgICAgICAgICAgICAgbWV0aG9kID0gY3JlYXRlTWV0aG9kQW5kQ2FjaGVJdChtZXRob2RzQ2FjaGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0T2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0VHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtZXRob2QgPSBjcmVhdGVNZXRob2RBbmRDYWNoZUl0KG1ldGhvZHNDYWNoZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0T2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRUeXBlKTsgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgfQorCisgICAgICAgIGV4ZWN1dGUobWV0aG9kLCB0YXJnZXRPYmplY3QsIHRhcmdldEFyZ3VtZW50cywgcHJpbmNpcGFsKTsKKyAgICB9CisgCisgICAgCisgICAgLyoqCisgICAgICogUGVyZm9ybSB3b3JrIGFzIGEgcGFydGljdWxhciA8L2NvZGU+U3ViamVjdDwvY29kZT4uIEhlcmUgdGhlIHdvcmsKKyAgICAgKiB3aWxsIGJlIGdyYW50ZWQgdG8gYSA8Y29kZT5udWxsPC9jb2RlPiBzdWJqZWN0LiAKKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXRob2ROYW1lIHRoZSBtZXRob2QgdG8gYXBwbHkgdGhlIHNlY3VyaXR5IHJlc3RyaWN0aW9uCisgICAgICogQHBhcmFtIHRhcmdldE9iamVjdCB0aGUgPGNvZGU+RmlsdGVyPC9jb2RlPiBvbiB3aGljaCB0aGUgbWV0aG9kIHdpbGwgCisgICAgICogYmUgY2FsbGVkLgorICAgICAqLyAgICAKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZG9Bc1ByaXZpbGVnZShmaW5hbCBTdHJpbmcgbWV0aG9kTmFtZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRmlsdGVyIHRhcmdldE9iamVjdCkgCisgICAgICAgIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9ueworCisgICAgICAgICBkb0FzUHJpdmlsZWdlKG1ldGhvZE5hbWUsIHRhcmdldE9iamVjdCwgbnVsbCwgbnVsbCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICB9CisgCisgICAgCisgICAgLyoqCisgICAgICogUGVyZm9ybSB3b3JrIGFzIGEgcGFydGljdWxhciA8L2NvZGU+U3ViamVjdDwvY29kZT4uIEhlcmUgdGhlIHdvcmsKKyAgICAgKiB3aWxsIGJlIGdyYW50ZWQgdG8gYSA8Y29kZT5udWxsPC9jb2RlPiBzdWJqZWN0LiAKKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXRob2ROYW1lIHRoZSBtZXRob2QgdG8gYXBwbHkgdGhlIHNlY3VyaXR5IHJlc3RyaWN0aW9uCisgICAgICogQHBhcmFtIHRhcmdldE9iamVjdCB0aGUgPGNvZGU+RmlsdGVyPC9jb2RlPiBvbiB3aGljaCB0aGUgbWV0aG9kIHdpbGwgCisgICAgICogYmUgY2FsbGVkLgorICAgICAqIEBwYXJhbSB0YXJnZXRUeXBlIDxjb2RlPkNsYXNzPC9jb2RlPiBhcnJheSB1c2VkIHRvIGluc3RhbmNpYXRlIGEKKyAgICAgKiA8Y29kZT5NZXRob2Q8L2NvZGU+IG9iamVjdC4KKyAgICAgKiBAcGFyYW0gdGFyZ2V0QXJndW1lbnRzIDxjb2RlPk9iamVjdDwvY29kZT4gYXJyYXkgY29udGFpbnMgdGhlIAorICAgICAqIHJ1bnRpbWUgcGFyYW1ldGVycyBpbnN0YW5jZS4KKyAgICAgKi8gICAgCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGRvQXNQcml2aWxlZ2UoZmluYWwgU3RyaW5nIG1ldGhvZE5hbWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEZpbHRlciB0YXJnZXRPYmplY3QsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzW10gdGFyZ2V0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3RbXSB0YXJnZXRBcmd1bWVudHMpIAorICAgICAgICB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsKKyAgICAgICAgTWV0aG9kIG1ldGhvZCA9IG51bGw7CisKKyAgICAgICAgTWV0aG9kW10gbWV0aG9kc0NhY2hlID0gbnVsbDsKKyAgICAgICAgaWYob2JqZWN0Q2FjaGUuY29udGFpbnNLZXkodGFyZ2V0T2JqZWN0KSl7CisgICAgICAgICAgICBtZXRob2RzQ2FjaGUgPSAoTWV0aG9kW10pb2JqZWN0Q2FjaGUuZ2V0KHRhcmdldE9iamVjdCk7CisgICAgICAgICAgICBtZXRob2QgPSBmaW5kTWV0aG9kKG1ldGhvZHNDYWNoZSwgbWV0aG9kTmFtZSk7CisgICAgICAgICAgICBpZiAobWV0aG9kID09IG51bGwpeworICAgICAgICAgICAgICAgIG1ldGhvZCA9IGNyZWF0ZU1ldGhvZEFuZENhY2hlSXQobWV0aG9kc0NhY2hlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldE9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWV0aG9kID0gY3JlYXRlTWV0aG9kQW5kQ2FjaGVJdChtZXRob2RzQ2FjaGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldE9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0VHlwZSk7ICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIH0KKworICAgICAgICBleGVjdXRlKG1ldGhvZCwgdGFyZ2V0T2JqZWN0LCB0YXJnZXRBcmd1bWVudHMsIG51bGwpOworICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtIHdvcmsgYXMgYSBwYXJ0aWN1bGFyIDwvY29kZT5TdWJqZWN0PC9jb2RlPi4gSGVyZSB0aGUgd29yaworICAgICAqIHdpbGwgYmUgZ3JhbnRlZCB0byBhIDxjb2RlPm51bGw8L2NvZGU+IHN1YmplY3QuIAorICAgICAqCisgICAgICogQHBhcmFtIG1ldGhvZE5hbWUgdGhlIG1ldGhvZCB0byBhcHBseSB0aGUgc2VjdXJpdHkgcmVzdHJpY3Rpb24KKyAgICAgKiBAcGFyYW0gdGFyZ2V0T2JqZWN0IHRoZSA8Y29kZT5TZXJ2bGV0PC9jb2RlPiBvbiB3aGljaCB0aGUgbWV0aG9kIHdpbGwKKyAgICAgKiBiZSBjYWxsZWQuCisgICAgICogQHBhcmFtIHRhcmdldEFyZ3VtZW50cyA8Y29kZT5PYmplY3Q8L2NvZGU+IGFycmF5IGNvbnRhaW5zIHRoZSAKKyAgICAgKiBydW50aW1lIHBhcmFtZXRlcnMgaW5zdGFuY2UuCisgICAgICogQHBhcmFtIHByaW5jaXBhbCB0aGUgPGNvZGU+UHJpbmNpcGFsPC9jb2RlPiB0byB3aGljaCB0aGUgc2VjdXJpdHkgCisgICAgICogcHJpdmlsZWdlIGFwcGx5Li4KKyAgICAgKi8gICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBleGVjdXRlKGZpbmFsIE1ldGhvZCBtZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCB0YXJnZXRPYmplY3QsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3RbXSB0YXJnZXRBcmd1bWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW5jaXBhbCBwcmluY2lwYWwpIAorICAgICAgICB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsKKyAgICAgICAKKyAgICAgICAgdHJ5eyAgIAorICAgICAgICAgICAgU3ViamVjdCBzdWJqZWN0ID0gbnVsbDsKKyAgICAgICAgICAgIFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24gcGVhID0gbmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oKXsKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgRXhjZXB0aW9ueworICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QuaW52b2tlKHRhcmdldE9iamVjdCwgdGFyZ2V0QXJndW1lbnRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIC8vIFRoZSBmaXJzdCBhcmd1bWVudCBpcyBhbHdheXMgdGhlIHJlcXVlc3Qgb2JqZWN0CisgICAgICAgICAgICBpZiAodGFyZ2V0QXJndW1lbnRzICE9IG51bGwgCisgICAgICAgICAgICAgICAgICAgICYmIHRhcmdldEFyZ3VtZW50c1swXSBpbnN0YW5jZW9mIEh0dHBTZXJ2bGV0UmVxdWVzdCl7CisgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QgPSAKKyAgICAgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVxdWVzdCl0YXJnZXRBcmd1bWVudHNbMF07CisKKyAgICAgICAgICAgICAgICBIdHRwU2Vzc2lvbiBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uKGZhbHNlKTsKKyAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbiAhPSBudWxsKXsKKyAgICAgICAgICAgICAgICAgICAgc3ViamVjdCA9IAorICAgICAgICAgICAgICAgICAgICAgICAgKFN1YmplY3Qpc2Vzc2lvbi5nZXRBdHRyaWJ1dGUoR2xvYmFscy5TVUJKRUNUX0FUVFIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChzdWJqZWN0ID09IG51bGwpeworICAgICAgICAgICAgICAgICAgICBzdWJqZWN0ID0gbmV3IFN1YmplY3QoKTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGlmIChwcmluY2lwYWwgIT0gbnVsbCl7CisgICAgICAgICAgICAgICAgICAgICAgICBzdWJqZWN0LmdldFByaW5jaXBhbHMoKS5hZGQocHJpbmNpcGFsKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uc2V0QXR0cmlidXRlKEdsb2JhbHMuU1VCSkVDVF9BVFRSLCBzdWJqZWN0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3ViamVjdC5kb0FzUHJpdmlsZWdlZChzdWJqZWN0LCBwZWEsIG51bGwpOyAgICAgICAKKyAgICAgICB9IGNhdGNoKCBQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIHBlKSB7CisgICAgICAgICAgICBUaHJvd2FibGUgZSA9ICgoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbilwZS5nZXRFeGNlcHRpb24oKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFRhcmdldEV4Y2VwdGlvbigpOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpeworICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhzbS5nZXRTdHJpbmcoIlNlY3VyaXR5VXRpbC5kb0FzUHJpdmlsZWdlIiksIGUpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBVbmF2YWlsYWJsZUV4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICB0aHJvdyAoVW5hdmFpbGFibGVFeGNlcHRpb24pIGU7CisgICAgICAgICAgICBlbHNlIGlmIChlIGluc3RhbmNlb2YgU2VydmxldEV4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICB0aHJvdyAoU2VydmxldEV4Y2VwdGlvbikgZTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBJT0V4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICB0aHJvdyAoSU9FeGNlcHRpb24pIGU7CisgICAgICAgICAgICBlbHNlIGlmIChlIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbikgZTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICAgIH0gIAorICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBGaW5kIGEgbWV0aG9kIHN0b3JlZCB3aXRoaW4gdGhlIGNhY2hlLgorICAgICAqIEBwYXJhbSBtZXRob2RzQ2FjaGUgdGhlIGNhY2hlIHVzZWQgdG8gc3RvcmUgbWV0aG9kIGluc3RhbmNlCisgICAgICogQHBhcmFtIG1ldGhvZE5hbWUgdGhlIG1ldGhvZCB0byBhcHBseSB0aGUgc2VjdXJpdHkgcmVzdHJpY3Rpb24KKyAgICAgKiBAcmV0dXJuIHRoZSBtZXRob2QgaW5zdGFuY2UsIG51bGwgaWYgbm90IHlldCBjcmVhdGVkLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIE1ldGhvZCBmaW5kTWV0aG9kKE1ldGhvZFtdIG1ldGhvZHNDYWNoZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbWV0aG9kTmFtZSl7CisgICAgICAgIGlmIChtZXRob2ROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSU5JVF9NRVRIT0QpIAorICAgICAgICAgICAgICAgICYmIG1ldGhvZHNDYWNoZVtJTklUXSAhPSBudWxsKXsKKyAgICAgICAgICAgIHJldHVybiBtZXRob2RzQ2FjaGVbSU5JVF07CisgICAgICAgIH0gZWxzZSBpZiAobWV0aG9kTmFtZS5lcXVhbHNJZ25vcmVDYXNlKERFU1RST1lfTUVUSE9EKSAKKyAgICAgICAgICAgICAgICAmJiBtZXRob2RzQ2FjaGVbREVTVFJPWV0gIT0gbnVsbCl7CisgICAgICAgICAgICByZXR1cm4gbWV0aG9kc0NhY2hlW0RFU1RST1ldOyAgICAgICAgICAgIAorICAgICAgICB9IGVsc2UgaWYgKG1ldGhvZE5hbWUuZXF1YWxzSWdub3JlQ2FzZShTRVJWSUNFX01FVEhPRCkgCisgICAgICAgICAgICAgICAgJiYgbWV0aG9kc0NhY2hlW1NFUlZJQ0VdICE9IG51bGwpeworICAgICAgICAgICAgcmV0dXJuIG1ldGhvZHNDYWNoZVtTRVJWSUNFXTsKKyAgICAgICAgfSBlbHNlIGlmIChtZXRob2ROYW1lLmVxdWFsc0lnbm9yZUNhc2UoRE9GSUxURVJfTUVUSE9EKSAKKyAgICAgICAgICAgICAgICAmJiBtZXRob2RzQ2FjaGVbRE9GSUxURVJdICE9IG51bGwpeworICAgICAgICAgICAgcmV0dXJuIG1ldGhvZHNDYWNoZVtET0ZJTFRFUl07ICAgICAgICAgIAorICAgICAgICB9IAorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogQ3JlYXRlIHRoZSBtZXRob2QgYW5kIGNhY2hlIGl0IGZvciBmdXJ0aGVyIHJlLXVzZS4KKyAgICAgKiBAcGFyYW0gbWV0aG9kc0NhY2hlIHRoZSBjYWNoZSB1c2VkIHRvIHN0b3JlIG1ldGhvZCBpbnN0YW5jZQorICAgICAqIEBwYXJhbSBtZXRob2ROYW1lIHRoZSBtZXRob2QgdG8gYXBwbHkgdGhlIHNlY3VyaXR5IHJlc3RyaWN0aW9uCisgICAgICogQHBhcmFtIHRhcmdldE9iamVjdCB0aGUgPGNvZGU+U2VydmxldDwvY29kZT4gb24gd2hpY2ggdGhlIG1ldGhvZCB3aWxsCisgICAgICogYmUgY2FsbGVkLgorICAgICAqIEBwYXJhbSB0YXJnZXRUeXBlIDxjb2RlPkNsYXNzPC9jb2RlPiBhcnJheSB1c2VkIHRvIGluc3RhbmNpYXRlIGEgCisgICAgICogPGNvZGU+TWV0aG9kPC9jb2RlPiBvYmplY3QuCisgICAgICogQHJldHVybiB0aGUgbWV0aG9kIGluc3RhbmNlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIE1ldGhvZCBjcmVhdGVNZXRob2RBbmRDYWNoZUl0KE1ldGhvZFtdIG1ldGhvZHNDYWNoZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbWV0aG9kTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgdGFyZ2V0T2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzW10gdGFyZ2V0VHlwZSkgCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9ueworICAgICAgICAKKyAgICAgICAgaWYgKCBtZXRob2RzQ2FjaGUgPT0gbnVsbCl7CisgICAgICAgICAgICBtZXRob2RzQ2FjaGUgPSBuZXcgTWV0aG9kWzNdOworICAgICAgICB9ICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgCisgICAgICAgIE1ldGhvZCBtZXRob2QgPSAKKyAgICAgICAgICAgIHRhcmdldE9iamVjdC5nZXRDbGFzcygpLmdldE1ldGhvZChtZXRob2ROYW1lLCB0YXJnZXRUeXBlKTsgCisKKyAgICAgICAgaWYgKG1ldGhvZE5hbWUuZXF1YWxzSWdub3JlQ2FzZShJTklUX01FVEhPRCkpeworICAgICAgICAgICAgbWV0aG9kc0NhY2hlW0lOSVRdID0gbWV0aG9kOworICAgICAgICB9IGVsc2UgaWYgKG1ldGhvZE5hbWUuZXF1YWxzSWdub3JlQ2FzZShERVNUUk9ZX01FVEhPRCkpeworICAgICAgICAgICAgbWV0aG9kc0NhY2hlW0RFU1RST1ldID0gbWV0aG9kOworICAgICAgICB9IGVsc2UgaWYgKG1ldGhvZE5hbWUuZXF1YWxzSWdub3JlQ2FzZShTRVJWSUNFX01FVEhPRCkpeworICAgICAgICAgICAgbWV0aG9kc0NhY2hlW1NFUlZJQ0VdID0gbWV0aG9kOworICAgICAgICB9IGVsc2UgaWYgKG1ldGhvZE5hbWUuZXF1YWxzSWdub3JlQ2FzZShET0ZJTFRFUl9NRVRIT0QpKXsKKyAgICAgICAgICAgIG1ldGhvZHNDYWNoZVtET0ZJTFRFUl0gPSBtZXRob2Q7CisgICAgICAgIH0gCisgICAgICAgICAKKyAgICAgICAgb2JqZWN0Q2FjaGUucHV0KHRhcmdldE9iamVjdCwgbWV0aG9kc0NhY2hlICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIHJldHVybiBtZXRob2Q7CisgICAgfQorCisgICAgCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBvYmplY3QgZnJvbSB0aGUgY2FjaGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2FjaGVkT2JqZWN0IFRoZSBvYmplY3QgdG8gcmVtb3ZlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZShPYmplY3QgY2FjaGVkT2JqZWN0KXsKKyAgICAgICAgb2JqZWN0Q2FjaGUucmVtb3ZlKGNhY2hlZE9iamVjdCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NlcnZsZXRzL0NHSVNlcnZsZXQuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zZXJ2bGV0cy9DR0lTZXJ2bGV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE0NzcxOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zZXJ2bGV0cy9DR0lTZXJ2bGV0LmphdmEKQEAgLTAsMCArMSwyMDA1IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnNlcnZsZXRzOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKK2ltcG9ydCBqYXZhLm5ldC5VUkxFbmNvZGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb25maWc7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmF4LnNlcnZsZXQuVW5hdmFpbGFibGVFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkNvb2tpZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXQ7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkdsb2JhbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLklPVG9vbHM7CisKKworLyoqCisgKiAgQ0dJLWludm9raW5nIHNlcnZsZXQgZm9yIHdlYiBhcHBsaWNhdGlvbnMsIHVzZWQgdG8gZXhlY3V0ZSBzY3JpcHRzIHdoaWNoCisgKiAgY29tcGx5IHRvIHRoZSBDb21tb24gR2F0ZXdheSBJbnRlcmZhY2UgKENHSSkgc3BlY2lmaWNhdGlvbiBhbmQgYXJlIG5hbWVkCisgKiAgaW4gdGhlIHBhdGgtaW5mbyB1c2VkIHRvIGludm9rZSB0aGlzIHNlcnZsZXQuCisgKgorICogPHA+CisgKiA8aT5Ob3RlOiBUaGlzIGNvZGUgY29tcGlsZXMgYW5kIGV2ZW4gd29ya3MgZm9yIHNpbXBsZSBDR0kgY2FzZXMuCisgKiAgICAgICAgICBFeGhhdXN0aXZlIHRlc3RpbmcgaGFzIG5vdCBiZWVuIGRvbmUuICBQbGVhc2UgY29uc2lkZXIgaXQgYmV0YQorICogICAgICAgICAgcXVhbGl0eS4gIEZlZWRiYWNrIGlzIGFwcHJlY2lhdGVkIHRvIHRoZSBhdXRob3IgKHNlZSBiZWxvdykuPC9pPgorICogPC9wPgorICogPHA+CisgKgorICogPGI+RXhhbXBsZTwvYj46PGJyPgorICogSWYgYW4gaW5zdGFuY2Ugb2YgdGhpcyBzZXJ2bGV0IHdhcyBtYXBwZWQgKHVzaW5nCisgKiAgICAgICA8Y29kZT4mbHQ7d2ViLWFwcCZndDsvV0VCLUlORi93ZWIueG1sPC9jb2RlPikgdG86CisgKiA8L3A+CisgKiA8cD4KKyAqIDxjb2RlPgorICogJmx0O3dlYi1hcHAmZ3Q7L2NnaS1iaW4vKgorICogPC9jb2RlPgorICogPC9wPgorICogPHA+CisgKiB0aGVuIHRoZSBmb2xsb3dpbmcgcmVxdWVzdDoKKyAqIDwvcD4KKyAqIDxwPgorICogPGNvZGU+CisgKiBodHRwOi8vbG9jYWxob3N0OjgwODAvJmx0O3dlYi1hcHAmZ3Q7L2NnaS1iaW4vZGlyMS9zY3JpcHQvcGF0aGluZm8xCisgKiA8L2NvZGU+CisgKiA8L3A+CisgKiA8cD4KKyAqIHdvdWxkIHJlc3VsdCBpbiB0aGUgZXhlY3V0aW9uIG9mIHRoZSBzY3JpcHQKKyAqIDwvcD4KKyAqIDxwPgorICogPGNvZGU+CisgKiAmbHQ7d2ViLWFwcC1yb290Jmd0Oy9XRUItSU5GL2NnaS9kaXIxL3NjcmlwdAorICogPC9jb2RlPgorICogPC9wPgorICogPHA+CisgKiB3aXRoIHRoZSBzY3JpcHQncyA8Y29kZT5QQVRIX0lORk88L2NvZGU+IHNldCB0byA8Y29kZT4vcGF0aGluZm8xPC9jb2RlPi4KKyAqIDwvcD4KKyAqIDxwPgorICogUmVjb21tZW5kYXRpb246ICBIb3VzZSBhbGwgeW91ciBDR0kgc2NyaXB0cyB1bmRlcgorICogPGNvZGU+Jmx0O3dlYmFwcCZndDsvV0VCLUlORi9jZ2k8L2NvZGU+LiAgVGhpcyB3aWxsIGVuc3VyZSB0aGF0IHlvdSBkbyBub3QKKyAqIGFjY2lkZW50YWxseSBleHBvc2UgeW91ciBjZ2kgc2NyaXB0cycgY29kZSB0byB0aGUgb3V0c2lkZSB3b3JsZCBhbmQgdGhhdAorICogeW91ciBjZ2lzIHdpbGwgYmUgY2xlYW5seSBlbnNjb25jZWQgdW5kZXJuZWF0aCB0aGUgV0VCLUlORiAoaS5lLiwKKyAqIG5vbi1jb250ZW50KSBhcmVhLgorICogPC9wPgorICogPHA+CisgKiBUaGUgZGVmYXVsdCBDR0kgbG9jYXRpb24gaXMgbWVudGlvbmVkIGFib3ZlLiAgWW91IGhhdmUgdGhlIGZsZXhpYmlsaXR5IHRvCisgKiBwdXQgQ0dJcyB3aGVyZXZlciB5b3Ugd2FudCwgaG93ZXZlcjoKKyAqIDwvcD4KKyAqIDxwPgorICogICBUaGUgQ0dJIHNlYXJjaCBwYXRoIHdpbGwgc3RhcnQgYXQKKyAqICAgd2ViQXBwUm9vdERpciArIEZpbGUuc2VwYXJhdG9yICsgY2dpUGF0aFByZWZpeAorICogICAob3Igd2ViQXBwUm9vdERpciBhbG9uZSBpZiBjZ2lQYXRoUHJlZml4IGlzCisgKiAgIG51bGwpLgorICogPC9wPgorICogPHA+CisgKiAgIGNnaVBhdGhQcmVmaXggaXMgZGVmaW5lZCBieSBzZXR0aW5nCisgKiAgIHRoaXMgc2VydmxldCdzIGNnaVBhdGhQcmVmaXggaW5pdCBwYXJhbWV0ZXIKKyAqIDwvcD4KKyAqCisgKiA8cD4KKyAqCisgKiA8Qj5DR0kgU3BlY2lmaWNhdGlvbjwvQj46PGJyPiBkZXJpdmVkIGZyb20KKyAqIDxhIGhyZWY9Imh0dHA6Ly9jZ2ktc3BlYy5nb2x1eC5jb20iPmh0dHA6Ly9jZ2ktc3BlYy5nb2x1eC5jb208L2E+LgorICogQSB3b3JrLWluLXByb2dyZXNzICYgZXhwaXJlZCBJbnRlcm5ldCBEcmFmdC4gIE5vdGUgbm8gYWN0dWFsIFJGQyBkZXNjcmliaW5nCisgKiB0aGUgQ0dJIHNwZWNpZmljYXRpb24gZXhpc3RzLiAgV2hlcmUgdGhlIGJlaGF2aW9yIG9mIHRoaXMgc2VydmxldCBkaWZmZXJzCisgKiBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uIGNpdGVkIGFib3ZlLCBpdCBpcyBlaXRoZXIgZG9jdW1lbnRlZCBoZXJlLCBhIGJ1ZywKKyAqIG9yIGFuIGluc3RhbmNlIHdoZXJlIHRoZSBzcGVjaWZpY2F0aW9uIGNpdGVkIGRpZmZlcnMgZnJvbSBCZXN0CisgKiBDb21tdW5pdHkgUHJhY3RpY2UgKEJDUCkuCisgKiBTdWNoIGluc3RhbmNlcyBzaG91bGQgYmUgd2VsbC1kb2N1bWVudGVkIGhlcmUuICBQbGVhc2UgZW1haWwgdGhlCisgKiA8YSBocmVmPSJtYWlsdG86dG9tY2F0LWRldkBqYWthcnRhLmFwYWNoZS5vcmciPkpha2FydGEgVG9tY2F0IGdyb3VwIFt0b21jYXQtZGV2QGpha2FydGEuYXBhY2hlLm9yZ108L2E+CisgKiB3aXRoIGFtZW5kbWVudHMuCisgKgorICogPC9wPgorICogPHA+CisgKgorICogPGI+Q2Fub25pY2FsIG1ldGF2YXJpYWJsZXM8L2I+Ojxicj4KKyAqIFRoZSBDR0kgc3BlY2lmaWNhdGlvbiBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgY2Fub25pY2FsIG1ldGF2YXJpYWJsZXM6CisgKiA8YnI+CisgKiBbZXhjZXJwdCBmcm9tIENHSSBzcGVjaWZpY2F0aW9uXQorICogPFBSRT4KKyAqICBBVVRIX1RZUEUKKyAqICBDT05URU5UX0xFTkdUSAorICogIENPTlRFTlRfVFlQRQorICogIEdBVEVXQVlfSU5URVJGQUNFCisgKiAgUEFUSF9JTkZPCisgKiAgUEFUSF9UUkFOU0xBVEVECisgKiAgUVVFUllfU1RSSU5HCisgKiAgUkVNT1RFX0FERFIKKyAqICBSRU1PVEVfSE9TVAorICogIFJFTU9URV9JREVOVAorICogIFJFTU9URV9VU0VSCisgKiAgUkVRVUVTVF9NRVRIT0QKKyAqICBTQ1JJUFRfTkFNRQorICogIFNFUlZFUl9OQU1FCisgKiAgU0VSVkVSX1BPUlQKKyAqICBTRVJWRVJfUFJPVE9DT0wKKyAqICBTRVJWRVJfU09GVFdBUkUKKyAqIDwvUFJFPgorICogPHA+CisgKiBNZXRhdmFyaWFibGVzIHdpdGggbmFtZXMgYmVnaW5uaW5nIHdpdGggdGhlIHByb3RvY29sIG5hbWUgKDxFTT5lLmcuPC9FTT4sCisgKiAiSFRUUF9BQ0NFUFQiKSBhcmUgYWxzbyBjYW5vbmljYWwgaW4gdGhlaXIgZGVzY3JpcHRpb24gb2YgcmVxdWVzdCBoZWFkZXIKKyAqIGZpZWxkcy4gIFRoZSBudW1iZXIgYW5kIG1lYW5pbmcgb2YgdGhlc2UgZmllbGRzIG1heSBjaGFuZ2UgaW5kZXBlbmRlbnRseQorICogb2YgdGhpcyBzcGVjaWZpY2F0aW9uLiAgKFNlZSBhbHNvIHNlY3Rpb24gNi4xLjUgW29mIHRoZSBDR0kgc3BlY2lmaWNhdGlvbl0uKQorICogPC9wPgorICogW2VuZCBleGNlcnB0XQorICoKKyAqIDwvcD4KKyAqIDxoMj4gSW1wbGVtZW50YXRpb24gbm90ZXM8L2gyPgorICogPHA+CisgKgorICogPGI+c3RhbmRhcmQgaW5wdXQgaGFuZGxpbmc8L2I+OiBJZiB5b3VyIHNjcmlwdCBhY2NlcHRzIHN0YW5kYXJkIGlucHV0LAorICogdGhlbiB0aGUgY2xpZW50IG11c3Qgc3RhcnQgc2VuZGluZyBpbnB1dCB3aXRoaW4gYSBjZXJ0YWluIHRpbWVvdXQgcGVyaW9kLAorICogb3RoZXJ3aXNlIHRoZSBzZXJ2bGV0IHdpbGwgYXNzdW1lIG5vIGlucHV0IGlzIGNvbWluZyBhbmQgY2Fycnkgb24gcnVubmluZworICogdGhlIHNjcmlwdC4gIFRoZSBzY3JpcHQncyB0aGUgc3RhbmRhcmQgaW5wdXQgd2lsbCBiZSBjbG9zZWQgYW5kIGhhbmRsaW5nIG9mCisgKiBhbnkgZnVydGhlciBpbnB1dCBmcm9tIHRoZSBjbGllbnQgaXMgdW5kZWZpbmVkLiAgTW9zdCBsaWtlbHkgaXQgd2lsbCBiZQorICogaWdub3JlZC4gIElmIHRoaXMgYmVoYXZpb3IgYmVjb21lcyB1bmRlc2lyYWJsZSwgdGhlbiB0aGlzIHNlcnZsZXQgbmVlZHMKKyAqIHRvIGJlIGVuaGFuY2VkIHRvIGhhbmRsZSB0aHJlYWRpbmcgb2YgdGhlIHNwYXduZWQgcHJvY2Vzcycgc3RkaW4sIHN0ZG91dCwKKyAqIGFuZCBzdGRlcnIgKHdoaWNoIHNob3VsZCBub3QgYmUgdG9vIGhhcmQpLgorICogPGJyPgorICogSWYgeW91IGZpbmQgeW91ciBjZ2kgc2NyaXB0cyBhcmUgdGltaW5nIG91dCByZWNlaXZpbmcgaW5wdXQsIHlvdSBjYW4gc2V0CisgKiB0aGUgaW5pdCBwYXJhbWV0ZXIgPGNvZGU+PC9jb2RlPiBvZiB5b3VyIHdlYmFwcHMnIGNnaS1oYW5kbGluZyBzZXJ2bGV0CisgKiB0byBiZQorICogPC9wPgorICogPHA+CisgKgorICogPGI+TWV0YXZhcmlhYmxlIFZhbHVlczwvYj46IEFjY29yZGluZyB0byB0aGUgQ0dJIHNwZWNpZmljaW9uLAorICogaW1wbGVtZW50YXRpb25zIG1heSBjaG9vc2UgdG8gcmVwcmVzZW50IGJvdGggbnVsbCBvciBtaXNzaW5nIHZhbHVlcyBpbiBhbgorICogaW1wbGVtZW50YXRpb24tc3BlY2lmaWMgbWFubmVyLCBidXQgbXVzdCBkZWZpbmUgdGhhdCBtYW5uZXIuICBUaGlzCisgKiBpbXBsZW1lbnRhdGlvbiBjaG9vc2VzIHRvIGFsd2F5cyBkZWZpbmUgYWxsIHJlcXVpcmVkIG1ldGF2YXJpYWJsZXMsIGJ1dAorICogc2V0IHRoZSB2YWx1ZSB0byAiIiBmb3IgYWxsIG1ldGF2YXJpYWJsZXMgd2hvc2UgdmFsdWUgaXMgZWl0aGVyIG51bGwgb3IKKyAqIHVuZGVmaW5lZC4gIFBBVEhfVFJBTlNMQVRFRCBpcyB0aGUgc29sZSBleGNlcHRpb24gdG8gdGhpcyBydWxlLCBhcyBwZXIgdGhlCisgKiBDR0kgU3BlY2lmaWNhdGlvbi4KKyAqCisgKiA8L3A+CisgKiA8cD4KKyAqCisgKiA8Yj5OUEggLS0gIE5vbi1wYXJzZWQtaGVhZGVyIGltcGxlbWVudGF0aW9uPC9iPjogIFRoaXMgaW1wbGVtZW50YXRpb24gZG9lcworICogbm90IHN1cHBvcnQgdGhlIENHSSBOUEggY29uY2VwdCwgd2hlcmVieSBzZXJ2ZXIgZW5zdXJlcyB0aGF0IHRoZSBkYXRhCisgKiBzdXBwbGllZCB0byB0aGUgc2NyaXB0IGFyZSBwcmVjZWlzZWx5IGFzIHN1cHBsaWVkIGJ5IHRoZSBjbGllbnQgYW5kCisgKiB1bmFsdGVyZWQgYnkgdGhlIHNlcnZlci4KKyAqIDwvcD4KKyAqIDxwPgorICogVGhlIGZ1bmN0aW9uIG9mIGEgc2VydmxldCBjb250YWluZXIgKGluY2x1ZGluZyBUb21jYXQpIGlzIHNwZWNpZmljYWxseQorICogZGVzaWduZWQgdG8gcGFyc2UgYW5kIHBvc3NpYmxlIGFsdGVyIENHSS1zcGVjaWZpYyB2YXJpYWJsZXMsIGFuZCBhcworICogc3VjaCBtYWtlcyBOUEggZnVuY3Rpb25hbGl0eSBkaWZmaWN1bHQgdG8gc3VwcG9ydC4KKyAqIDwvcD4KKyAqIDxwPgorICogVGhlIENHSSBzcGVjaWZpY2F0aW9uIHN0YXRlcyB0aGF0IGNvbXBsaWFudCBzZXJ2ZXJzIE1BWSBzdXBwb3J0IE5QSCBvdXRwdXQuCisgKiBJdCBkb2VzIG5vdCBzdGF0ZSBzZXJ2ZXJzIE1VU1Qgc3VwcG9ydCBOUEggb3V0cHV0IHRvIGJlIHVuY29uZGl0aW9uYWxseQorICogY29tcGxpYW50LiAgVGh1cywgdGhpcyBpbXBsZW1lbnRhdGlvbiBtYWludGFpbnMgdW5jb25kaXRpb25hbCBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBzcGVjaWZpY2F0aW9uIHRob3VnaCBOUEggc3VwcG9ydCBpcyBub3QgcHJlc2VudC4KKyAqIDwvcD4KKyAqIDxwPgorICoKKyAqIFRoZSBDR0kgc3BlY2lmaWNhdGlvbiBpcyBsb2NhdGVkIGF0CisgKiA8YSBocmVmPSJodHRwOi8vY2dpLXNwZWMuZ29sdXguY29tIj5odHRwOi8vY2dpLXNwZWMuZ29sdXguY29tPC9hPi4KKyAqCisgKiA8L3A+CisgKiA8cD4KKyAqIDxoMz5UT0RPOjwvaDM+CisgKiA8dWw+CisgKiA8bGk+IFN1cHBvcnQgZm9yIHNldHRpbmcgaGVhZGVycyAoZm9yIGV4YW1wbGUsIExvY2F0aW9uIGhlYWRlcnMgZG9uJ3Qgd29yaykKKyAqIDxsaT4gU3VwcG9ydCBmb3IgY29sbGFwc2luZyBtdWx0aXBsZSBoZWFkZXIgbGluZXMgKHBlciBSRkMgMjYxNikKKyAqIDxsaT4gRW5zdXJlIGhhbmRsaW5nIG9mIFBPU1QgbWV0aG9kIGRvZXMgbm90IGludGVyZmVyZSB3aXRoIDIuMyBGaWx0ZXJzCisgKiA8bGk+IFJlZmFjdG9yIHNvbWUgZGVidWcgY29kZSBvdXQgb2YgY29yZQorICogPGxpPiBFbnN1cmUgaGVhZGVyIGhhbmRsaW5nIHByZXNlcnZlcyBlbmNvZGluZworICogPGxpPiBQb3NzaWJseSByZXdyaXRlIENHSVJ1bm5lci5ydW4oKT8KKyAqIDxsaT4gUG9zc2libHkgcmVmYWN0b3IgQ0dJUnVubmVyIGFuZCBDR0lFbnZpcm9ubWVudCBhcyBub24taW5uZXIgY2xhc3Nlcz8KKyAqIDxsaT4gRG9jdW1lbnQgaGFuZGxpbmcgb2YgY2dpIHN0ZGluIHdoZW4gdGhlcmUgaXMgbm8gc3RkaW4KKyAqIDxsaT4gUmV2aXNpdCBJT0V4Y2VwdGlvbiBoYW5kbGluZyBpbiBDR0lSdW5uZXIucnVuKCkKKyAqIDxsaT4gQmV0dGVyIGRvY3VtZW50YXRpb24KKyAqIDxsaT4gQ29uZmlybSB1c2Ugb2YgU2VydmxldElucHV0U3RyZWFtLmF2YWlsYWJsZSgpIGluIENHSVJ1bm5lci5ydW4oKSBpcworICogICAgICBub3QgbmVlZGVkCisgKiA8bGk+IE1ha2UgY2hlY2tpbmcgZm9yICIuIiBhbmQgIi4uIiBpbiBzZXJ2bGV0ICYgY2dpIFBBVEhfSU5GTyBsZXNzCisgKiAgICAgIGRyYWNvbmlhbgorICogPGxpPiBbYWRkIG1vcmUgdG8gdGhpcyBUT0RPIGxpc3RdCisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBhdXRob3IgTWFydGluIFQgRGVuZ2xlciBbcm9vdEBtYXJ0aW5kZW5nbGVyLmNvbV0KKyAqIEBhdXRob3IgQW15IFJvaAorICogQHZlcnNpb24gJFJldmlzaW9uJCwgJERhdGUkCisgKiBAc2luY2UgVG9tY2F0IDQuMAorICoKKyAqLworCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBDR0lTZXJ2bGV0IGV4dGVuZHMgSHR0cFNlcnZsZXQgeworCisgICAgLyogc29tZSB2YXJzIGJlbG93IGNvcGllZCBmcm9tIENyYWlnIFIuIE1jQ2xhbmFoYW4ncyBJbnZva2VyU2VydmxldCAqLworCisgICAgLyoqIHRoZSBDb250ZXh0IGNvbnRhaW5lciBhc3NvY2lhdGVkIHdpdGggb3VyIHdlYiBhcHBsaWNhdGlvbi4gKi8KKyAgICBwcml2YXRlIFNlcnZsZXRDb250ZXh0IGNvbnRleHQgPSBudWxsOworCisgICAgLyoqIHRoZSBkZWJ1Z2dpbmcgZGV0YWlsIGxldmVsIGZvciB0aGlzIHNlcnZsZXQuICovCisgICAgcHJpdmF0ZSBpbnQgZGVidWcgPSAwOworCisgICAgLyoqCisgICAgICogIFRoZSBDR0kgc2VhcmNoIHBhdGggd2lsbCBzdGFydCBhdAorICAgICAqICAgIHdlYkFwcFJvb3REaXIgKyBGaWxlLnNlcGFyYXRvciArIGNnaVBhdGhQcmVmaXgKKyAgICAgKiAgICAob3Igd2ViQXBwUm9vdERpciBhbG9uZSBpZiBjZ2lQYXRoUHJlZml4IGlzCisgICAgICogICAgbnVsbCkKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBjZ2lQYXRoUHJlZml4ID0gbnVsbDsKKworICAgIC8qKiB0aGUgZXhlY3V0YWJsZSB0byB1c2Ugd2l0aCB0aGUgc2NyaXB0ICovCisgICAgcHJpdmF0ZSBTdHJpbmcgY2dpRXhlY3V0YWJsZSA9ICJwZXJsIjsKKyAgICAKKyAgICAvKiogdGhlIGVuY29kaW5nIHRvIHVzZSBmb3IgcGFyYW1ldGVycyAqLworICAgIHByaXZhdGUgU3RyaW5nIHBhcmFtZXRlckVuY29kaW5nID0gU3lzdGVtLmdldFByb3BlcnR5KCJmaWxlLmVuY29kaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVVRGLTgiKTsKKworICAgIC8qKiBvYmplY3QgdXNlZCB0byBlbnN1cmUgbXVsdGlwbGUgdGhyZWFkcyBkb24ndCB0cnkgdG8gZXhwYW5kIHNhbWUgZmlsZSAqLworICAgIHN0YXRpYyBPYmplY3QgZXhwYW5kRmlsZUxvY2sgPSBuZXcgT2JqZWN0KCk7CisKKyAgICAvKiogdGhlIHNoZWxsIGVudmlyb25tZW50IHZhcmlhYmxlcyB0byBiZSBwYXNzZWQgdG8gdGhlIENHSSBzY3JpcHQgKi8KKyAgICBzdGF0aWMgSGFzaHRhYmxlIHNoZWxsRW52ID0gbmV3IEhhc2h0YWJsZSgpOworCisgICAgLyoqCisgICAgICogU2V0cyBpbnN0YW5jZSB2YXJpYWJsZXMuCisgICAgICogPFA+CisgICAgICogTW9kaWZpZWQgZnJvbSBDcmFpZyBSLiBNY0NsYW5haGFuJ3MgSW52b2tlclNlcnZsZXQKKyAgICAgKiA8L1A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gY29uZmlnICAgICAgICAgICAgICAgICAgICBhIDxjb2RlPlNlcnZsZXRDb25maWc8L2NvZGU+IG9iamVjdAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5pbmcgdGhlIHNlcnZsZXQncworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gYW5kIGluaXRpYWxpemF0aW9uCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uICAgICAgaWYgYW4gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZCB0aGF0CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmZXJlcyB3aXRoIHRoZSBzZXJ2bGV0J3Mgbm9ybWFsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgaW5pdChTZXJ2bGV0Q29uZmlnIGNvbmZpZykgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIHN1cGVyLmluaXQoY29uZmlnKTsKKworICAgICAgICAvLyBWZXJpZnkgdGhhdCB3ZSB3ZXJlIG5vdCBhY2Nlc3NlZCB1c2luZyB0aGUgaW52b2tlciBzZXJ2bGV0CisgICAgICAgIFN0cmluZyBzZXJ2bGV0TmFtZSA9IGdldFNlcnZsZXRDb25maWcoKS5nZXRTZXJ2bGV0TmFtZSgpOworICAgICAgICBpZiAoc2VydmxldE5hbWUgPT0gbnVsbCkKKyAgICAgICAgICAgIHNlcnZsZXROYW1lID0gIiI7CisgICAgICAgIGlmIChzZXJ2bGV0TmFtZS5zdGFydHNXaXRoKCJvcmcuYXBhY2hlLmNhdGFsaW5hLklOVk9LRVIuIikpCisgICAgICAgICAgICB0aHJvdyBuZXcgVW5hdmFpbGFibGVFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoIkNhbm5vdCBpbnZva2UgQ0dJU2VydmxldCB0aHJvdWdoIHRoZSBpbnZva2VyIik7CisKKyAgICAgICAgYm9vbGVhbiBwYXNzU2hlbGxFbnZpcm9ubWVudCA9IGZhbHNlOworICAgICAgICAKKyAgICAgICAgLy8gU2V0IG91ciBwcm9wZXJ0aWVzIGZyb20gdGhlIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMKKyAgICAgICAgU3RyaW5nIHZhbHVlID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHZhbHVlID0gZ2V0U2VydmxldENvbmZpZygpLmdldEluaXRQYXJhbWV0ZXIoImRlYnVnIik7CisgICAgICAgICAgICBkZWJ1ZyA9IEludGVnZXIucGFyc2VJbnQodmFsdWUpOworICAgICAgICAgICAgY2dpUGF0aFByZWZpeCA9CisgICAgICAgICAgICAgICAgZ2V0U2VydmxldENvbmZpZygpLmdldEluaXRQYXJhbWV0ZXIoImNnaVBhdGhQcmVmaXgiKTsKKyAgICAgICAgICAgIHZhbHVlID0gZ2V0U2VydmxldENvbmZpZygpLmdldEluaXRQYXJhbWV0ZXIoInBhc3NTaGVsbEVudmlyb25tZW50Iik7CisgICAgICAgICAgICBwYXNzU2hlbGxFbnZpcm9ubWVudCA9IEJvb2xlYW4udmFsdWVPZih2YWx1ZSkuYm9vbGVhblZhbHVlKCk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAvL05PT1AKKyAgICAgICAgfQorICAgICAgICBsb2coImluaXQ6IGxvZ2xldmVsIHNldCB0byAiICsgZGVidWcpOworCisgICAgICAgIGlmIChwYXNzU2hlbGxFbnZpcm9ubWVudCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBzaGVsbEVudi5wdXRBbGwoZ2V0U2hlbGxFbnZpcm9ubWVudCgpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgICAgIFNlcnZsZXRFeGNlcHRpb24gZSA9IG5ldyBTZXJ2bGV0RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byByZWFkIHNoZWxsIGVudmlyb25tZW50IHZhcmlhYmxlcyIsIGlvZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2YWx1ZSA9IGdldFNlcnZsZXRDb25maWcoKS5nZXRJbml0UGFyYW1ldGVyKCJleGVjdXRhYmxlIik7CisgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBjZ2lFeGVjdXRhYmxlID0gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICB2YWx1ZSA9IGdldFNlcnZsZXRDb25maWcoKS5nZXRJbml0UGFyYW1ldGVyKCJwYXJhbWV0ZXJFbmNvZGluZyIpOworICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgcGFyYW1ldGVyRW5jb2RpbmcgPSB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIElkZW50aWZ5IHRoZSBpbnRlcm5hbCBjb250YWluZXIgcmVzb3VyY2VzIHdlIG5lZWQKKyAgICAgICAgY29udGV4dCA9IGNvbmZpZy5nZXRTZXJ2bGV0Q29udGV4dCgpOworCisgICAgfQorCisKKworICAgIC8qKgorICAgICAqIFByaW50cyBvdXQgaW1wb3J0YW50IFNlcnZsZXQgQVBJIGFuZCBjb250YWluZXIgaW5mb3JtYXRpb24KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIENvcGllZCBmcm9tIFNub29wQWxsU2VydmxldCBieSBDcmFpZyBSLiBNY0NsYW5haGFuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtICBvdXQgICAgU2VydmxldE91dHB1dFN0cmVhbSBhcyB0YXJnZXQgb2YgdGhlIGluZm9ybWF0aW9uCisgICAgICogQHBhcmFtICByZXEgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IG9iamVjdCB1c2VkIGFzIHNvdXJjZSBvZiBpbmZvcm1hdGlvbgorICAgICAqIEBwYXJhbSAgcmVzICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2Ugb2JqZWN0IGN1cnJlbnRseSBub3QgdXNlZCBidXQgY291bGQKKyAgICAgKiAgICAgICAgICAgICAgICBwcm92aWRlIGZ1dHVyZSBpbmZvcm1hdGlvbgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiAgSU9FeGNlcHRpb24gIGlmIGEgd3JpdGUgb3BlcmF0aW9uIGV4Y2VwdGlvbiBvY2N1cnMKKyAgICAgKgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHByaW50U2VydmxldEVudmlyb25tZW50KFNlcnZsZXRPdXRwdXRTdHJlYW0gb3V0LAorICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBEb2N1bWVudCB0aGUgcHJvcGVydGllcyBmcm9tIFNlcnZsZXRSZXF1ZXN0CisgICAgICAgIG91dC5wcmludGxuKCI8aDE+U2VydmxldFJlcXVlc3QgUHJvcGVydGllczwvaDE+Iik7CisgICAgICAgIG91dC5wcmludGxuKCI8dWw+Iik7CisgICAgICAgIEVudW1lcmF0aW9uIGF0dHJzID0gcmVxLmdldEF0dHJpYnV0ZU5hbWVzKCk7CisgICAgICAgIHdoaWxlIChhdHRycy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgU3RyaW5nIGF0dHIgPSAoU3RyaW5nKSBhdHRycy5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgb3V0LnByaW50bG4oIjxsaT48Yj5hdHRyaWJ1dGU8L2I+ICIgKyBhdHRyICsgIiA9ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxLmdldEF0dHJpYnV0ZShhdHRyKSk7CisgICAgICAgIH0KKyAgICAgICAgb3V0LnByaW50bG4oIjxsaT48Yj5jaGFyYWN0ZXJFbmNvZGluZzwvYj4gPSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgcmVxLmdldENoYXJhY3RlckVuY29kaW5nKCkpOworICAgICAgICBvdXQucHJpbnRsbigiPGxpPjxiPmNvbnRlbnRMZW5ndGg8L2I+ID0gIiArCisgICAgICAgICAgICAgICAgICAgICAgIHJlcS5nZXRDb250ZW50TGVuZ3RoKCkpOworICAgICAgICBvdXQucHJpbnRsbigiPGxpPjxiPmNvbnRlbnRUeXBlPC9iPiA9ICIgKworICAgICAgICAgICAgICAgICAgICAgICByZXEuZ2V0Q29udGVudFR5cGUoKSk7CisgICAgICAgIEVudW1lcmF0aW9uIGxvY2FsZXMgPSByZXEuZ2V0TG9jYWxlcygpOworICAgICAgICB3aGlsZSAobG9jYWxlcy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgTG9jYWxlIGxvY2FsZSA9IChMb2NhbGUpIGxvY2FsZXMubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgIG91dC5wcmludGxuKCI8bGk+PGI+bG9jYWxlPC9iPiA9ICIgKyBsb2NhbGUpOworICAgICAgICB9CisgICAgICAgIEVudW1lcmF0aW9uIHBhcmFtcyA9IHJlcS5nZXRQYXJhbWV0ZXJOYW1lcygpOworICAgICAgICB3aGlsZSAocGFyYW1zLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICBTdHJpbmcgcGFyYW0gPSAoU3RyaW5nKSBwYXJhbXMubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgIFN0cmluZyB2YWx1ZXNbXSA9IHJlcS5nZXRQYXJhbWV0ZXJWYWx1ZXMocGFyYW0pOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIjxsaT48Yj5wYXJhbWV0ZXI8L2I+ICIgKyBwYXJhbSArICIgPSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXNbaV0pOworICAgICAgICB9CisgICAgICAgIG91dC5wcmludGxuKCI8bGk+PGI+cHJvdG9jb2w8L2I+ID0gIiArIHJlcS5nZXRQcm90b2NvbCgpKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjxsaT48Yj5yZW1vdGVBZGRyPC9iPiA9ICIgKyByZXEuZ2V0UmVtb3RlQWRkcigpKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjxsaT48Yj5yZW1vdGVIb3N0PC9iPiA9ICIgKyByZXEuZ2V0UmVtb3RlSG9zdCgpKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjxsaT48Yj5zY2hlbWU8L2I+ID0gIiArIHJlcS5nZXRTY2hlbWUoKSk7CisgICAgICAgIG91dC5wcmludGxuKCI8bGk+PGI+c2VjdXJlPC9iPiA9ICIgKyByZXEuaXNTZWN1cmUoKSk7CisgICAgICAgIG91dC5wcmludGxuKCI8bGk+PGI+c2VydmVyTmFtZTwvYj4gPSAiICsgcmVxLmdldFNlcnZlck5hbWUoKSk7CisgICAgICAgIG91dC5wcmludGxuKCI8bGk+PGI+c2VydmVyUG9ydDwvYj4gPSAiICsgcmVxLmdldFNlcnZlclBvcnQoKSk7CisgICAgICAgIG91dC5wcmludGxuKCI8L3VsPiIpOworICAgICAgICBvdXQucHJpbnRsbigiPGhyPiIpOworCisgICAgICAgIC8vIERvY3VtZW50IHRoZSBwcm9wZXJ0aWVzIGZyb20gSHR0cFNlcnZsZXRSZXF1ZXN0CisgICAgICAgIG91dC5wcmludGxuKCI8aDE+SHR0cFNlcnZsZXRSZXF1ZXN0IFByb3BlcnRpZXM8L2gxPiIpOworICAgICAgICBvdXQucHJpbnRsbigiPHVsPiIpOworICAgICAgICBvdXQucHJpbnRsbigiPGxpPjxiPmF1dGhUeXBlPC9iPiA9ICIgKyByZXEuZ2V0QXV0aFR5cGUoKSk7CisgICAgICAgIG91dC5wcmludGxuKCI8bGk+PGI+Y29udGV4dFBhdGg8L2I+ID0gIiArCisgICAgICAgICAgICAgICAgICAgICAgIHJlcS5nZXRDb250ZXh0UGF0aCgpKTsKKyAgICAgICAgQ29va2llIGNvb2tpZXNbXSA9IHJlcS5nZXRDb29raWVzKCk7CisgICAgICAgIGlmIChjb29raWVzIT1udWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvb2tpZXMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIjxsaT48Yj5jb29raWU8L2I+ICIgKyBjb29raWVzW2ldLmdldE5hbWUoKSArIiA9ICIgK2Nvb2tpZXNbaV0uZ2V0VmFsdWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgRW51bWVyYXRpb24gaGVhZGVycyA9IHJlcS5nZXRIZWFkZXJOYW1lcygpOworICAgICAgICB3aGlsZSAoaGVhZGVycy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgU3RyaW5nIGhlYWRlciA9IChTdHJpbmcpIGhlYWRlcnMubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgIG91dC5wcmludGxuKCI8bGk+PGI+aGVhZGVyPC9iPiAiICsgaGVhZGVyICsgIiA9ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxLmdldEhlYWRlcihoZWFkZXIpKTsKKyAgICAgICAgfQorICAgICAgICBvdXQucHJpbnRsbigiPGxpPjxiPm1ldGhvZDwvYj4gPSAiICsgcmVxLmdldE1ldGhvZCgpKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjxsaT48YSBuYW1lPVwicGF0aEluZm9cIj48Yj5wYXRoSW5mbzwvYj48L2E+ID0gIgorICAgICAgICAgICAgICAgICAgICArIHJlcS5nZXRQYXRoSW5mbygpKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjxsaT48Yj5wYXRoVHJhbnNsYXRlZDwvYj4gPSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgcmVxLmdldFBhdGhUcmFuc2xhdGVkKCkpOworICAgICAgICBvdXQucHJpbnRsbigiPGxpPjxiPnF1ZXJ5U3RyaW5nPC9iPiA9ICIgKworICAgICAgICAgICAgICAgICAgICAgICByZXEuZ2V0UXVlcnlTdHJpbmcoKSk7CisgICAgICAgIG91dC5wcmludGxuKCI8bGk+PGI+cmVtb3RlVXNlcjwvYj4gPSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgcmVxLmdldFJlbW90ZVVzZXIoKSk7CisgICAgICAgIG91dC5wcmludGxuKCI8bGk+PGI+cmVxdWVzdGVkU2Vzc2lvbklkPC9iPiA9ICIgKworICAgICAgICAgICAgICAgICAgICAgICByZXEuZ2V0UmVxdWVzdGVkU2Vzc2lvbklkKCkpOworICAgICAgICBvdXQucHJpbnRsbigiPGxpPjxiPnJlcXVlc3RlZFNlc3Npb25JZEZyb21Db29raWU8L2I+ID0gIiArCisgICAgICAgICAgICAgICAgICAgICAgIHJlcS5pc1JlcXVlc3RlZFNlc3Npb25JZEZyb21Db29raWUoKSk7CisgICAgICAgIG91dC5wcmludGxuKCI8bGk+PGI+cmVxdWVzdGVkU2Vzc2lvbklkRnJvbVVSTDwvYj4gPSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgcmVxLmlzUmVxdWVzdGVkU2Vzc2lvbklkRnJvbVVSTCgpKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjxsaT48Yj5yZXF1ZXN0ZWRTZXNzaW9uSWRWYWxpZDwvYj4gPSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgcmVxLmlzUmVxdWVzdGVkU2Vzc2lvbklkVmFsaWQoKSk7CisgICAgICAgIG91dC5wcmludGxuKCI8bGk+PGI+cmVxdWVzdFVSSTwvYj4gPSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgcmVxLmdldFJlcXVlc3RVUkkoKSk7CisgICAgICAgIG91dC5wcmludGxuKCI8bGk+PGI+c2VydmxldFBhdGg8L2I+ID0gIiArCisgICAgICAgICAgICAgICAgICAgICAgIHJlcS5nZXRTZXJ2bGV0UGF0aCgpKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjxsaT48Yj51c2VyUHJpbmNpcGFsPC9iPiA9ICIgKworICAgICAgICAgICAgICAgICAgICAgICByZXEuZ2V0VXNlclByaW5jaXBhbCgpKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjwvdWw+Iik7CisgICAgICAgIG91dC5wcmludGxuKCI8aHI+Iik7CisKKyAgICAgICAgLy8gRG9jdW1lbnQgdGhlIHNlcnZsZXQgcmVxdWVzdCBhdHRyaWJ1dGVzCisgICAgICAgIG91dC5wcmludGxuKCI8aDE+U2VydmxldFJlcXVlc3QgQXR0cmlidXRlczwvaDE+Iik7CisgICAgICAgIG91dC5wcmludGxuKCI8dWw+Iik7CisgICAgICAgIGF0dHJzID0gcmVxLmdldEF0dHJpYnV0ZU5hbWVzKCk7CisgICAgICAgIHdoaWxlIChhdHRycy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgU3RyaW5nIGF0dHIgPSAoU3RyaW5nKSBhdHRycy5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgb3V0LnByaW50bG4oIjxsaT48Yj4iICsgYXR0ciArICI8L2I+ID0gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZXEuZ2V0QXR0cmlidXRlKGF0dHIpKTsKKyAgICAgICAgfQorICAgICAgICBvdXQucHJpbnRsbigiPC91bD4iKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjxocj4iKTsKKworICAgICAgICAvLyBQcm9jZXNzIHRoZSBjdXJyZW50IHNlc3Npb24gKGlmIHRoZXJlIGlzIG9uZSkKKyAgICAgICAgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IHJlcS5nZXRTZXNzaW9uKGZhbHNlKTsKKyAgICAgICAgaWYgKHNlc3Npb24gIT0gbnVsbCkgeworCisgICAgICAgICAgICAvLyBEb2N1bWVudCB0aGUgc2Vzc2lvbiBwcm9wZXJ0aWVzCisgICAgICAgICAgICBvdXQucHJpbnRsbigiPGgxPkh0dHBTZXNzaW9uIFByb3BlcnRpZXM8L2gxPiIpOworICAgICAgICAgICAgb3V0LnByaW50bG4oIjx1bD4iKTsKKyAgICAgICAgICAgIG91dC5wcmludGxuKCI8bGk+PGI+aWQ8L2I+ID0gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldElkKCkpOworICAgICAgICAgICAgb3V0LnByaW50bG4oIjxsaT48Yj5jcmVhdGlvblRpbWU8L2I+ID0gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGF0ZShzZXNzaW9uLmdldENyZWF0aW9uVGltZSgpKSk7CisgICAgICAgICAgICBvdXQucHJpbnRsbigiPGxpPjxiPmxhc3RBY2Nlc3NlZFRpbWU8L2I+ID0gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGF0ZShzZXNzaW9uLmdldExhc3RBY2Nlc3NlZFRpbWUoKSkpOworICAgICAgICAgICAgb3V0LnByaW50bG4oIjxsaT48Yj5tYXhJbmFjdGl2ZUludGVydmFsPC9iPiA9ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRNYXhJbmFjdGl2ZUludGVydmFsKCkpOworICAgICAgICAgICAgb3V0LnByaW50bG4oIjwvdWw+Iik7CisgICAgICAgICAgICBvdXQucHJpbnRsbigiPGhyPiIpOworCisgICAgICAgICAgICAvLyBEb2N1bWVudCB0aGUgc2Vzc2lvbiBhdHRyaWJ1dGVzCisgICAgICAgICAgICBvdXQucHJpbnRsbigiPGgxPkh0dHBTZXNzaW9uIEF0dHJpYnV0ZXM8L2gxPiIpOworICAgICAgICAgICAgb3V0LnByaW50bG4oIjx1bD4iKTsKKyAgICAgICAgICAgIGF0dHJzID0gc2Vzc2lvbi5nZXRBdHRyaWJ1dGVOYW1lcygpOworICAgICAgICAgICAgd2hpbGUgKGF0dHJzLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGF0dHIgPSAoU3RyaW5nKSBhdHRycy5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCI8bGk+PGI+IiArIGF0dHIgKyAiPC9iPiA9ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0QXR0cmlidXRlKGF0dHIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dC5wcmludGxuKCI8L3VsPiIpOworICAgICAgICAgICAgb3V0LnByaW50bG4oIjxocj4iKTsKKworICAgICAgICB9CisKKyAgICAgICAgLy8gRG9jdW1lbnQgdGhlIHNlcnZsZXQgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzCisgICAgICAgIG91dC5wcmludGxuKCI8aDE+U2VydmxldENvbmZpZyBQcm9wZXJ0aWVzPC9oMT4iKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjx1bD4iKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjxsaT48Yj5zZXJ2bGV0TmFtZTwvYj4gPSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2VydmxldENvbmZpZygpLmdldFNlcnZsZXROYW1lKCkpOworICAgICAgICBvdXQucHJpbnRsbigiPC91bD4iKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjxocj4iKTsKKworICAgICAgICAvLyBEb2N1bWVudCB0aGUgc2VydmxldCBjb25maWd1cmF0aW9uIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMKKyAgICAgICAgb3V0LnByaW50bG4oIjxoMT5TZXJ2bGV0Q29uZmlnIEluaXRpYWxpemF0aW9uIFBhcmFtZXRlcnM8L2gxPiIpOworICAgICAgICBvdXQucHJpbnRsbigiPHVsPiIpOworICAgICAgICBwYXJhbXMgPSBnZXRTZXJ2bGV0Q29uZmlnKCkuZ2V0SW5pdFBhcmFtZXRlck5hbWVzKCk7CisgICAgICAgIHdoaWxlIChwYXJhbXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBwYXJhbSA9IChTdHJpbmcpIHBhcmFtcy5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gZ2V0U2VydmxldENvbmZpZygpLmdldEluaXRQYXJhbWV0ZXIocGFyYW0pOworICAgICAgICAgICAgb3V0LnByaW50bG4oIjxsaT48Yj4iICsgcGFyYW0gKyAiPC9iPiA9ICIgKyB2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgb3V0LnByaW50bG4oIjwvdWw+Iik7CisgICAgICAgIG91dC5wcmludGxuKCI8aHI+Iik7CisKKyAgICAgICAgLy8gRG9jdW1lbnQgdGhlIHNlcnZsZXQgY29udGV4dCBwcm9wZXJ0aWVzCisgICAgICAgIG91dC5wcmludGxuKCI8aDE+U2VydmxldENvbnRleHQgUHJvcGVydGllczwvaDE+Iik7CisgICAgICAgIG91dC5wcmludGxuKCI8dWw+Iik7CisgICAgICAgIG91dC5wcmludGxuKCI8bGk+PGI+bWFqb3JWZXJzaW9uPC9iPiA9ICIgKworICAgICAgICAgICAgICAgICAgICAgICBnZXRTZXJ2bGV0Q29udGV4dCgpLmdldE1ham9yVmVyc2lvbigpKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjxsaT48Yj5taW5vclZlcnNpb248L2I+ID0gIiArCisgICAgICAgICAgICAgICAgICAgICAgIGdldFNlcnZsZXRDb250ZXh0KCkuZ2V0TWlub3JWZXJzaW9uKCkpOworICAgICAgICBvdXQucHJpbnRsbigiPGxpPjxiPnJlYWxQYXRoKCcvJyk8L2I+ID0gIiArCisgICAgICAgICAgICAgICAgICAgICAgIGdldFNlcnZsZXRDb250ZXh0KCkuZ2V0UmVhbFBhdGgoIi8iKSk7CisgICAgICAgIG91dC5wcmludGxuKCI8bGk+PGI+c2VydmVySW5mbzwvYj4gPSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2VydmxldENvbnRleHQoKS5nZXRTZXJ2ZXJJbmZvKCkpOworICAgICAgICBvdXQucHJpbnRsbigiPC91bD4iKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjxocj4iKTsKKworICAgICAgICAvLyBEb2N1bWVudCB0aGUgc2VydmxldCBjb250ZXh0IGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMKKyAgICAgICAgb3V0LnByaW50bG4oIjxoMT5TZXJ2bGV0Q29udGV4dCBJbml0aWFsaXphdGlvbiBQYXJhbWV0ZXJzPC9oMT4iKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjx1bD4iKTsKKyAgICAgICAgcGFyYW1zID0gZ2V0U2VydmxldENvbnRleHQoKS5nZXRJbml0UGFyYW1ldGVyTmFtZXMoKTsKKyAgICAgICAgd2hpbGUgKHBhcmFtcy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgU3RyaW5nIHBhcmFtID0gKFN0cmluZykgcGFyYW1zLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBnZXRTZXJ2bGV0Q29udGV4dCgpLmdldEluaXRQYXJhbWV0ZXIocGFyYW0pOworICAgICAgICAgICAgb3V0LnByaW50bG4oIjxsaT48Yj4iICsgcGFyYW0gKyAiPC9iPiA9ICIgKyB2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgb3V0LnByaW50bG4oIjwvdWw+Iik7CisgICAgICAgIG91dC5wcmludGxuKCI8aHI+Iik7CisKKyAgICAgICAgLy8gRG9jdW1lbnQgdGhlIHNlcnZsZXQgY29udGV4dCBhdHRyaWJ1dGVzCisgICAgICAgIG91dC5wcmludGxuKCI8aDE+U2VydmxldENvbnRleHQgQXR0cmlidXRlczwvaDE+Iik7CisgICAgICAgIG91dC5wcmludGxuKCI8dWw+Iik7CisgICAgICAgIGF0dHJzID0gZ2V0U2VydmxldENvbnRleHQoKS5nZXRBdHRyaWJ1dGVOYW1lcygpOworICAgICAgICB3aGlsZSAoYXR0cnMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBhdHRyID0gKFN0cmluZykgYXR0cnMubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgIG91dC5wcmludGxuKCI8bGk+PGI+IiArIGF0dHIgKyAiPC9iPiA9ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2VydmxldENvbnRleHQoKS5nZXRBdHRyaWJ1dGUoYXR0cikpOworICAgICAgICB9CisgICAgICAgIG91dC5wcmludGxuKCI8L3VsPiIpOworICAgICAgICBvdXQucHJpbnRsbigiPGhyPiIpOworCisKKworICAgIH0KKworCisKKyAgICAvKioKKyAgICAgKiBQcm92aWRlcyBDR0kgR2F0ZXdheSBzZXJ2aWNlIC0tIGRlbGVnYXRlcyB0byA8Y29kZT5kb0dldDwvY29kZT4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgcmVxICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHBhc3NlZCBpbiBieSBzZXJ2bGV0IGNvbnRhaW5lcgorICAgICAqIEBwYXJhbSAgcmVzICAgSHR0cFNlcnZsZXRSZXNwb25zZSBwYXNzZWQgaW4gYnkgc2VydmxldCBjb250YWluZXIKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gIFNlcnZsZXRFeGNlcHRpb24gIGlmIGEgc2VydmxldC1zcGVjaWZpYyBleGNlcHRpb24gb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiAgSU9FeGNlcHRpb24gIGlmIGEgcmVhZC93cml0ZSBleGNlcHRpb24gb2NjdXJzCisgICAgICoKKyAgICAgKiBAc2VlIGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldAorICAgICAqCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZG9Qb3N0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworICAgICAgICBkb0dldChyZXEsIHJlcyk7CisgICAgfQorCisKKworICAgIC8qKgorICAgICAqIFByb3ZpZGVzIENHSSBHYXRld2F5IHNlcnZpY2UKKyAgICAgKgorICAgICAqIEBwYXJhbSAgcmVxICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHBhc3NlZCBpbiBieSBzZXJ2bGV0IGNvbnRhaW5lcgorICAgICAqIEBwYXJhbSAgcmVzICAgSHR0cFNlcnZsZXRSZXNwb25zZSBwYXNzZWQgaW4gYnkgc2VydmxldCBjb250YWluZXIKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gIFNlcnZsZXRFeGNlcHRpb24gIGlmIGEgc2VydmxldC1zcGVjaWZpYyBleGNlcHRpb24gb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiAgSU9FeGNlcHRpb24gIGlmIGEgcmVhZC93cml0ZSBleGNlcHRpb24gb2NjdXJzCisgICAgICoKKyAgICAgKiBAc2VlIGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldAorICAgICAqCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpCisgICAgICAgIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gVmVyaWZ5IHRoYXQgd2Ugd2VyZSBub3QgYWNjZXNzZWQgdXNpbmcgdGhlIGludm9rZXIgc2VydmxldAorICAgICAgICBpZiAocmVxLmdldEF0dHJpYnV0ZShHbG9iYWxzLklOVk9LRURfQVRUUikgIT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBVbmF2YWlsYWJsZUV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICgiQ2Fubm90IGludm9rZSBDR0lTZXJ2bGV0IHRocm91Z2ggdGhlIGludm9rZXIiKTsKKworICAgICAgICBDR0lFbnZpcm9ubWVudCBjZ2lFbnYgPSBuZXcgQ0dJRW52aXJvbm1lbnQocmVxLCBnZXRTZXJ2bGV0Q29udGV4dCgpKTsKKworICAgICAgICBpZiAoY2dpRW52LmlzVmFsaWQoKSkgeworICAgICAgICAgICAgQ0dJUnVubmVyIGNnaSA9IG5ldyBDR0lSdW5uZXIoY2dpRW52LmdldENvbW1hbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNnaUVudi5nZXRFbnZpcm9ubWVudCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2dpRW52LmdldFdvcmtpbmdEaXJlY3RvcnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNnaUVudi5nZXRQYXJhbWV0ZXJzKCkpOworICAgICAgICAgICAgLy9pZiBQT1NULCB3ZSBuZWVkIHRvIGNnaS5zZXRJbnB1dAorICAgICAgICAgICAgLy9SRU1JTkQ6IGhvdyBkb2VzIHRoaXMgaW50ZXJhY3Qgd2l0aCBTZXJ2bGV0IEFQSSAyLjMncyBGaWx0ZXJzPyEKKyAgICAgICAgICAgIGlmICgiUE9TVCIuZXF1YWxzKHJlcS5nZXRNZXRob2QoKSkpIHsKKyAgICAgICAgICAgICAgICBjZ2kuc2V0SW5wdXQocmVxLmdldElucHV0U3RyZWFtKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2dpLnNldFJlc3BvbnNlKHJlcyk7CisgICAgICAgICAgICBjZ2kucnVuKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWNnaUVudi5pc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgIHJlcy5zZXRTdGF0dXMoNDA0KTsKKyAgICAgICAgfQorIAorICAgICAgICBpZiAoZGVidWcgPj0gMTApIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgU2VydmxldE91dHB1dFN0cmVhbSBvdXQgPSByZXMuZ2V0T3V0cHV0U3RyZWFtKCk7CisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIjxIVE1MPjxIRUFEPjxUSVRMRT4kTmFtZSQ8L1RJVExFPjwvSEVBRD4iKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiPEJPRFk+JEhlYWRlciQ8cD4iKTsKKworICAgICAgICAgICAgICAgIGlmIChjZ2lFbnYuaXNWYWxpZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGNnaUVudi50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiPEgzPiIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiQ0dJIHNjcmlwdCBub3QgZm91bmQgb3Igbm90IHNwZWNpZmllZC4iKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIjwvSDM+Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCI8SDQ+Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCJDaGVjayB0aGUgPGI+SHR0cFNlcnZsZXRSZXF1ZXN0ICIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiPGEgaHJlZj1cIiNwYXRoSW5mb1wiPnBhdGhJbmZvPC9hPjwvYj4gIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCJwcm9wZXJ0eSB0byBzZWUgaWYgaXQgaXMgd2hhdCB5b3UgbWVhbnQgIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCJpdCB0byBiZS4gIFlvdSBtdXN0IHNwZWNpZnkgYW4gZXhpc3RhbnQgIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCJhbmQgZXhlY3V0YWJsZSBmaWxlIGFzIHBhcnQgb2YgdGhlICIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigicGF0aC1pbmZvLiIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiPC9IND4iKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIjxIND4iKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIkZvciBhIGdvb2QgZGlzY3Vzc2lvbiBvZiBob3cgQ0dJIHNjcmlwdHMgIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCJ3b3JrIGFuZCB3aGF0IHRoZWlyIGVudmlyb25tZW50IHZhcmlhYmxlcyAiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIm1lYW4sIHBsZWFzZSB2aXNpdCB0aGUgPGEgIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCJocmVmPVwiaHR0cDovL2NnaS1zcGVjLmdvbHV4LmNvbVwiPkNHSSAiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIlNwZWNpZmljYXRpb24gcGFnZTwvYT4uIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCI8L0g0PiIpOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJpbnRTZXJ2bGV0RW52aXJvbm1lbnQob3V0LCByZXEsIHJlcyk7CisKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiPC9CT0RZPjwvSFRNTD4iKTsKKworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaWdub3JlZCkgeworICAgICAgICAgICAgfQorCisgICAgICAgIH0gLy9kZWJ1Z2dpbmcKKworCisgICAgfSAvL2RvR2V0CisKKworCisgICAgLyoqIEZvciBmdXR1cmUgdGVzdGluZyB1c2Ugb25seTsgZG9lcyBub3RoaW5nIHJpZ2h0IG5vdyAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIkSGVhZGVyJCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhbGwgc2hlbGwgZW52aXJvbm1lbnQgdmFyaWFibGVzLiBIYXZlIHRvIGRvIGl0IHRoaXMgcmF0aGVyIHVnbHkgd2F5CisgICAgICogYXMgdGhlIEFQSSB0byBvYnRhaW4gaXMgbm90IGF2YWlsYWJsZSBpbiAxLjQgYW5kIGVhcmxpZXIgQVBJcy4KKyAgICAgKgorICAgICAqIFNlZSA8YSBocmVmPSJodHRwOi8vd3d3LnJnYWdub24uY29tL2phdmFkZXRhaWxzL2phdmEtMDE1MC5odG1sIj5SZWFkIGVudmlyb25tZW50CisgICAgICogdmFyaWFibGVzIGZyb20gYW4gYXBwbGljYXRpb248L2E+IGZvciBvcmlnaW5hbCBzb3VyY2UgYW5kIGFydGljbGUuCisgICAgICovCisgICAgcHJpdmF0ZSBIYXNodGFibGUgZ2V0U2hlbGxFbnZpcm9ubWVudCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEhhc2h0YWJsZSBlbnZWYXJzID0gbmV3IEhhc2h0YWJsZSgpOworICAgICAgICBQcm9jZXNzIHAgPSBudWxsOworICAgICAgICBSdW50aW1lIHIgPSBSdW50aW1lLmdldFJ1bnRpbWUoKTsKKyAgICAgICAgU3RyaW5nIE9TID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIikudG9Mb3dlckNhc2UoKTsKKyAgICAgICAgYm9vbGVhbiBpZ25vcmVDYXNlOworCisgICAgICAgIGlmIChPUy5pbmRleE9mKCJ3aW5kb3dzIDkiKSA+IC0xKSB7CisgICAgICAgICAgICBwID0gci5leGVjKCAiY29tbWFuZC5jb20gL2Mgc2V0IiApOworICAgICAgICAgICAgaWdub3JlQ2FzZSA9IHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAoIChPUy5pbmRleE9mKCJudCIpID4gLTEpCisgICAgICAgICAgICAgICAgfHwgKE9TLmluZGV4T2YoIndpbmRvd3MgMjAwMCIpID4gLTEpCisgICAgICAgICAgICAgICAgfHwgKE9TLmluZGV4T2YoIndpbmRvd3MgeHAiKSA+IC0xKSApIHsKKyAgICAgICAgICAgIC8vIHRoYW5rcyB0byBKdWFuRnJhbiBmb3IgdGhlIHhwIGZpeCEKKyAgICAgICAgICAgIHAgPSByLmV4ZWMoICJjbWQuZXhlIC9jIHNldCIgKTsKKyAgICAgICAgICAgIGlnbm9yZUNhc2UgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gb3VyIGxhc3QgaG9wZSwgd2UgYXNzdW1lIFVuaXggKHRoYW5rcyB0byBILiBXYXJlIGZvciB0aGUgZml4KQorICAgICAgICAgICAgcCA9IHIuZXhlYyggImVudiIgKTsKKyAgICAgICAgICAgIGlnbm9yZUNhc2UgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyCisgICAgICAgICAgICAoIG5ldyBJbnB1dFN0cmVhbVJlYWRlciggcC5nZXRJbnB1dFN0cmVhbSgpICkgKTsKKyAgICAgICAgU3RyaW5nIGxpbmU7CisgICAgICAgIHdoaWxlKCAobGluZSA9IGJyLnJlYWRMaW5lKCkpICE9IG51bGwgKSB7CisgICAgICAgICAgICBpbnQgaWR4ID0gbGluZS5pbmRleE9mKCAnPScgKTsKKyAgICAgICAgICAgIFN0cmluZyBrZXkgPSBsaW5lLnN1YnN0cmluZyggMCwgaWR4ICk7CisgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBsaW5lLnN1YnN0cmluZyggaWR4KzEgKTsKKyAgICAgICAgICAgIGlmIChpZ25vcmVDYXNlKSB7CisgICAgICAgICAgICAgICAga2V5ID0ga2V5LnRvVXBwZXJDYXNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbnZWYXJzLnB1dChrZXksIHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZW52VmFyczsKKyAgICB9CisKKworCisKKworCisKKyAgICAvKioKKyAgICAgKiBFbmNhcHN1bGF0ZXMgdGhlIENHSSBlbnZpcm9ubWVudCBhbmQgcnVsZXMgdG8gZGVyaXZlCisgICAgICogdGhhdCBlbnZpcm9ubWVudCBmcm9tIHRoZSBzZXJ2bGV0IGNvbnRhaW5lciBhbmQgcmVxdWVzdCBpbmZvcm1hdGlvbi4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEB2ZXJzaW9uICAkUmV2aXNpb24kLCAkRGF0ZSQKKyAgICAgKiBAc2luY2UgICAgVG9tY2F0IDQuMAorICAgICAqCisgICAgICovCisgICAgcHJvdGVjdGVkIGNsYXNzIENHSUVudmlyb25tZW50IHsKKworCisgICAgICAgIC8qKiBjb250ZXh0IG9mIHRoZSBlbmNsb3Npbmcgc2VydmxldCAqLworICAgICAgICBwcml2YXRlIFNlcnZsZXRDb250ZXh0IGNvbnRleHQgPSBudWxsOworCisgICAgICAgIC8qKiBjb250ZXh0IHBhdGggb2YgZW5jbG9zaW5nIHNlcnZsZXQgKi8KKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgY29udGV4dFBhdGggPSBudWxsOworCisgICAgICAgIC8qKiBzZXJ2bGV0IFVSSSBvZiB0aGUgZW5jbG9zaW5nIHNlcnZsZXQgKi8KKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgc2VydmxldFBhdGggPSBudWxsOworCisgICAgICAgIC8qKiBwYXRoSW5mbyBmb3IgdGhlIGN1cnJlbnQgcmVxdWVzdCAqLworICAgICAgICBwcml2YXRlIFN0cmluZyBwYXRoSW5mbyA9IG51bGw7CisKKyAgICAgICAgLyoqIHJlYWwgZmlsZSBzeXN0ZW0gZGlyZWN0b3J5IG9mIHRoZSBlbmNsb3Npbmcgc2VydmxldCdzIHdlYiBhcHAgKi8KKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgd2ViQXBwUm9vdERpciA9IG51bGw7CisKKyAgICAgICAgLyoqIHRlbXBkaXIgZm9yIGNvbnRleHQgLSB1c2VkIHRvIGV4cGFuZCBzY3JpcHRzIGluIHVuZXhwYW5kZWQgd2FycyAqLworICAgICAgICBwcml2YXRlIEZpbGUgdG1wRGlyID0gbnVsbDsKKworICAgICAgICAvKiogZGVyaXZlZCBjZ2kgZW52aXJvbm1lbnQgKi8KKyAgICAgICAgcHJpdmF0ZSBIYXNodGFibGUgZW52ID0gbnVsbDsKKworICAgICAgICAvKiogY2dpIGNvbW1hbmQgdG8gYmUgaW52b2tlZCAqLworICAgICAgICBwcml2YXRlIFN0cmluZyBjb21tYW5kID0gbnVsbDsKKworICAgICAgICAvKiogY2dpIGNvbW1hbmQncyBkZXNpcmVkIHdvcmtpbmcgZGlyZWN0b3J5ICovCisgICAgICAgIHByaXZhdGUgRmlsZSB3b3JraW5nRGlyZWN0b3J5ID0gbnVsbDsKKworICAgICAgICAvKiogY2dpIGNvbW1hbmQncyBxdWVyeSBwYXJhbWV0ZXJzICovCisgICAgICAgIHByaXZhdGUgQXJyYXlMaXN0IHF1ZXJ5UGFyYW1ldGVycyA9IG5ldyBBcnJheUxpc3QoKTsKKworICAgICAgICAvKiogd2hldGhlciBvciBub3QgdGhpcyBvYmplY3QgaXMgdmFsaWQgb3Igbm90ICovCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiB2YWxpZCA9IGZhbHNlOworCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYSBDR0lFbnZpcm9ubWVudCBhbmQgZGVyaXZlcyB0aGUgbmVjZXNzYXJ5IGVudmlyb25tZW50LAorICAgICAgICAgKiBxdWVyeSBwYXJhbWV0ZXJzLCB3b3JraW5nIGRpcmVjdG9yeSwgY2dpIGNvbW1hbmQsIGV0Yy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtICByZXEgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IGZvciBpbmZvcm1hdGlvbiBwcm92aWRlZCBieQorICAgICAgICAgKiAgICAgICAgICAgICAgICAgICB0aGUgU2VydmxldCBBUEkKKyAgICAgICAgICogQHBhcmFtICBjb250ZXh0ICAgU2VydmxldENvbnRleHQgZm9yIGluZm9ybWF0aW9uIHByb3ZpZGVkIGJ5IHRoZQorICAgICAgICAgKiAgICAgICAgICAgICAgICAgICBTZXJ2bGV0IEFQSQorICAgICAgICAgKgorICAgICAgICAgKi8KKyAgICAgICAgcHJvdGVjdGVkIENHSUVudmlyb25tZW50KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2bGV0Q29udGV4dCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgc2V0dXBGcm9tQ29udGV4dChjb250ZXh0KTsKKyAgICAgICAgICAgIHNldHVwRnJvbVJlcXVlc3QocmVxKTsKKworICAgICAgICAgICAgRW51bWVyYXRpb24gcGFyYW1OYW1lcyA9IHJlcS5nZXRQYXJhbWV0ZXJOYW1lcygpOworICAgICAgICAgICAgd2hpbGUgKHBhcmFtTmFtZXMgIT0gbnVsbCAmJiBwYXJhbU5hbWVzLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHBhcmFtID0gcGFyYW1OYW1lcy5uZXh0RWxlbWVudCgpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgaWYgKHBhcmFtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlc1tdID0gcmVxLmdldFBhcmFtZXRlclZhbHVlcyhwYXJhbSk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gVVJMRW5jb2Rlci5lbmNvZGUodmFsdWVzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyRW5jb2RpbmcpOworICAgICAgICAgICAgICAgICAgICAgICAgTmFtZVZhbHVlUGFpciBudnAgPSBuZXcgTmFtZVZhbHVlUGFpcihwYXJhbSwgdmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQYXJhbWV0ZXJzLmFkZChudnApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0aGlzLnZhbGlkID0gc2V0Q0dJRW52aXJvbm1lbnQocmVxKTsKKworICAgICAgICAgICAgaWYgKHRoaXMudmFsaWQpIHsKKyAgICAgICAgICAgICAgICB3b3JraW5nRGlyZWN0b3J5ID0gbmV3IEZpbGUoY29tbWFuZC5zdWJzdHJpbmcoMCwKKyAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLmxhc3RJbmRleE9mKEZpbGUuc2VwYXJhdG9yKSkpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFVzZXMgdGhlIFNlcnZsZXRDb250ZXh0IHRvIHNldCBzb21lIENHSSB2YXJpYWJsZXMKKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtICBjb250ZXh0ICAgU2VydmxldENvbnRleHQgZm9yIGluZm9ybWF0aW9uIHByb3ZpZGVkIGJ5IHRoZQorICAgICAgICAgKiAgICAgICAgICAgICAgICAgICBTZXJ2bGV0IEFQSQorICAgICAgICAgKi8KKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgc2V0dXBGcm9tQ29udGV4dChTZXJ2bGV0Q29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0OworICAgICAgICAgICAgdGhpcy53ZWJBcHBSb290RGlyID0gY29udGV4dC5nZXRSZWFsUGF0aCgiLyIpOworICAgICAgICAgICAgdGhpcy50bXBEaXIgPSAoRmlsZSkgY29udGV4dC5nZXRBdHRyaWJ1dGUoR2xvYmFscy5XT1JLX0RJUl9BVFRSKTsKKyAgICAgICAgfQorCisKKworICAgICAgICAvKioKKyAgICAgICAgICogVXNlcyB0aGUgSHR0cFNlcnZsZXRSZXF1ZXN0IHRvIHNldCBtb3N0IENHSSB2YXJpYWJsZXMKKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtICByZXEgICBIdHRwU2VydmxldFJlcXVlc3QgZm9yIGluZm9ybWF0aW9uIHByb3ZpZGVkIGJ5CisgICAgICAgICAqICAgICAgICAgICAgICAgdGhlIFNlcnZsZXQgQVBJCisgICAgICAgICAqLworICAgICAgICBwcm90ZWN0ZWQgdm9pZCBzZXR1cEZyb21SZXF1ZXN0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEpIHsKKyAgICAgICAgICAgIHRoaXMuY29udGV4dFBhdGggPSByZXEuZ2V0Q29udGV4dFBhdGgoKTsKKyAgICAgICAgICAgIHRoaXMuc2VydmxldFBhdGggPSByZXEuZ2V0U2VydmxldFBhdGgoKTsKKyAgICAgICAgICAgIHRoaXMucGF0aEluZm8gPSByZXEuZ2V0UGF0aEluZm8oKTsKKyAgICAgICAgICAgIC8vIElmIGdldFBhdGhJbmZvKCkgcmV0dXJucyBudWxsLCBtdXN0IGJlIHVzaW5nIGV4dGVuc2lvbiBtYXBwaW5nCisgICAgICAgICAgICAvLyBJbiB0aGlzIGNhc2UsIHBhdGhJbmZvIHNob3VsZCBiZSBzYW1lIGFzIHNlcnZsZXRQYXRoCisgICAgICAgICAgICBpZiAodGhpcy5wYXRoSW5mbyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhpcy5wYXRoSW5mbyA9IHRoaXMuc2VydmxldFBhdGg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlc29sdmVzIGNvcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNnaSBzY3JpcHQuCisgICAgICAgICAqCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBFeGFtcGxlIFVSSToKKyAgICAgICAgICogPFBSRT4gL3NlcnZsZXQvY2dpZ2F0ZXdheS9kaXIxL3JlYWxDR0lzY3JpcHQvcGF0aGluZm8xIDwvUFJFPgorICAgICAgICAgKiA8dWw+CisgICAgICAgICAqIDxMST48Yj5wYXRoPC9iPiA9ICRDQVRBTElOQV9IT01FL215d2ViYXBwL2RpcjEvcmVhbENHSXNjcmlwdAorICAgICAgICAgKiA8TEk+PGI+c2NyaXB0TmFtZTwvYj4gPSAvc2VydmxldC9jZ2lnYXRld2F5L2RpcjEvcmVhbENHSXNjcmlwdAorICAgICAgICAgKiA8TEk+PGI+Y2dpTmFtZTwvYj4gPSAvZGlyMS9yZWFsQ0dJc2NyaXB0CisgICAgICAgICAqIDxMST48Yj5uYW1lPC9iPiA9IHJlYWxDR0lzY3JpcHQKKyAgICAgICAgICogPC91bD4KKyAgICAgICAgICogPC9wPgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogQ0dJIHNlYXJjaCBhbGdvcml0aG06IHNlYXJjaCB0aGUgcmVhbCBwYXRoIGJlbG93CisgICAgICAgICAqICAgICZsdDtteS13ZWJhcHAtcm9vdCZndDsgYW5kIGZpbmQgdGhlIGZpcnN0IG5vbi1kaXJlY3RvcnkgaW4KKyAgICAgICAgICogICAgdGhlIGdldFBhdGhUcmFuc2xhdGVkKCIvIiksIHJlYWRpbmcvc2VhcmNoaW5nIGZyb20gbGVmdC10by1yaWdodC4KKyAgICAgICAgICo8L3A+CisgICAgICAgICAqPHA+CisgICAgICAgICAqICAgVGhlIENHSSBzZWFyY2ggcGF0aCB3aWxsIHN0YXJ0IGF0CisgICAgICAgICAqICAgd2ViQXBwUm9vdERpciArIEZpbGUuc2VwYXJhdG9yICsgY2dpUGF0aFByZWZpeAorICAgICAgICAgKiAgIChvciB3ZWJBcHBSb290RGlyIGFsb25lIGlmIGNnaVBhdGhQcmVmaXggaXMKKyAgICAgICAgICogICBudWxsKS4KKyAgICAgICAgICo8L3A+CisgICAgICAgICAqPHA+CisgICAgICAgICAqICAgY2dpUGF0aFByZWZpeCBpcyBkZWZpbmVkIGJ5IHNldHRpbmcKKyAgICAgICAgICogICB0aGlzIHNlcnZsZXQncyBjZ2lQYXRoUHJlZml4IGluaXQgcGFyYW1ldGVyCisgICAgICAgICAqCisgICAgICAgICAqPC9wPgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcGF0aEluZm8gICAgICAgU3RyaW5nIGZyb20gSHR0cFNlcnZsZXRSZXF1ZXN0LmdldFBhdGhJbmZvKCkKKyAgICAgICAgICogQHBhcmFtIHdlYkFwcFJvb3REaXIgIFN0cmluZyBmcm9tIGNvbnRleHQuZ2V0UmVhbFBhdGgoIi8iKQorICAgICAgICAgKiBAcGFyYW0gY29udGV4dFBhdGggICAgU3RyaW5nIGFzIGZyb20KKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdC5nZXRDb250ZXh0UGF0aCgpCisgICAgICAgICAqIEBwYXJhbSBzZXJ2bGV0UGF0aCAgICBTdHJpbmcgYXMgZnJvbQorICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0LmdldFNlcnZsZXRQYXRoKCkKKyAgICAgICAgICogQHBhcmFtIGNnaVBhdGhQcmVmaXggIHN1YmRpcmVjdG9yeSBvZiB3ZWJBcHBSb290RGlyIGJlbG93IHdoaWNoCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICB0aGUgd2ViIGFwcCdzIENHSXMgbWF5IGJlIHN0b3JlZDsgY2FuIGJlIG51bGwuCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICBUaGUgQ0dJIHNlYXJjaCBwYXRoIHdpbGwgc3RhcnQgYXQKKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgIHdlYkFwcFJvb3REaXIgKyBGaWxlLnNlcGFyYXRvciArIGNnaVBhdGhQcmVmaXgKKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgIChvciB3ZWJBcHBSb290RGlyIGFsb25lIGlmIGNnaVBhdGhQcmVmaXggaXMKKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgIG51bGwpLiAgY2dpUGF0aFByZWZpeCBpcyBkZWZpbmVkIGJ5IHNldHRpbmcKKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgIHRoZSBzZXJ2bGV0J3MgY2dpUGF0aFByZWZpeCBpbml0IHBhcmFtZXRlci4KKyAgICAgICAgICoKKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybgorICAgICAgICAgKiA8dWw+CisgICAgICAgICAqIDxsaT4KKyAgICAgICAgICogPGNvZGU+cGF0aDwvY29kZT4gLSAgICBmdWxsIGZpbGUtc3lzdGVtIHBhdGggdG8gdmFsaWQgY2dpIHNjcmlwdCwKKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICBvciBudWxsIGlmIG5vIGNnaSB3YXMgZm91bmQKKyAgICAgICAgICogPGxpPgorICAgICAgICAgKiA8Y29kZT5zY3JpcHROYW1lPC9jb2RlPiAtCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgQ0dJIHZhcmlhYmxlIFNDUklQVF9OQU1FOyB0aGUgZnVsbCBVUkwgcGF0aAorICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIHRvIHZhbGlkIGNnaSBzY3JpcHQgb3IgbnVsbCBpZiBubyBjZ2kgd2FzCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQKKyAgICAgICAgICogPGxpPgorICAgICAgICAgKiA8Y29kZT5jZ2lOYW1lPC9jb2RlPiAtIHNlcnZsZXQgcGF0aEluZm8gZnJhZ21lbnQgY29ycmVzcG9uZGluZyB0bworICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjZ2kgc2NyaXB0IGl0c2VsZiwgb3IgbnVsbCBpZiBub3QgZm91bmQKKyAgICAgICAgICogPGxpPgorICAgICAgICAgKiA8Y29kZT5uYW1lPC9jb2RlPiAtICAgIHNpbXBsZSBuYW1lIChubyBkaXJlY3Rvcmllcykgb2YgdGhlCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgY2dpIHNjcmlwdCwgb3IgbnVsbCBpZiBubyBjZ2kgd2FzIGZvdW5kCisgICAgICAgICAqIDwvdWw+CisgICAgICAgICAqCisgICAgICAgICAqIEBzaW5jZSBUb21jYXQgNC4wCisgICAgICAgICAqLworICAgICAgICBwcm90ZWN0ZWQgU3RyaW5nW10gZmluZENHSShTdHJpbmcgcGF0aEluZm8sIFN0cmluZyB3ZWJBcHBSb290RGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY29udGV4dFBhdGgsIFN0cmluZyBzZXJ2bGV0UGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNnaVBhdGhQcmVmaXgpIHsKKyAgICAgICAgICAgIFN0cmluZyBwYXRoID0gbnVsbDsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gbnVsbDsKKyAgICAgICAgICAgIFN0cmluZyBzY3JpcHRuYW1lID0gbnVsbDsKKyAgICAgICAgICAgIFN0cmluZyBjZ2luYW1lID0gbnVsbDsKKworICAgICAgICAgICAgaWYgKCh3ZWJBcHBSb290RGlyICE9IG51bGwpCisgICAgICAgICAgICAgICAgJiYgKHdlYkFwcFJvb3REaXIubGFzdEluZGV4T2YoRmlsZS5zZXBhcmF0b3IpID09CisgICAgICAgICAgICAgICAgICAgICh3ZWJBcHBSb290RGlyLmxlbmd0aCgpIC0gMSkpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vc3RyaXAgdGhlIHRyYWlsaW5nICIvIiBmcm9tIHRoZSB3ZWJBcHBSb290RGlyCisgICAgICAgICAgICAgICAgICAgIHdlYkFwcFJvb3REaXIgPQorICAgICAgICAgICAgICAgICAgICB3ZWJBcHBSb290RGlyLnN1YnN0cmluZygwLCAod2ViQXBwUm9vdERpci5sZW5ndGgoKSAtIDEpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNnaVBhdGhQcmVmaXggIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHdlYkFwcFJvb3REaXIgPSB3ZWJBcHBSb290RGlyICsgRmlsZS5zZXBhcmF0b3IKKyAgICAgICAgICAgICAgICAgICAgKyBjZ2lQYXRoUHJlZml4OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZGVidWcgPj0gMikgeworICAgICAgICAgICAgICAgIGxvZygiZmluZENHSTogcGF0aD0iICsgcGF0aEluZm8gKyAiLCAiICsgd2ViQXBwUm9vdERpcik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEZpbGUgY3VycmVudExvY2F0aW9uID0gbmV3IEZpbGUod2ViQXBwUm9vdERpcik7CisgICAgICAgICAgICBTdHJpbmdUb2tlbml6ZXIgZGlyV2Fsa2VyID0KKyAgICAgICAgICAgIG5ldyBTdHJpbmdUb2tlbml6ZXIocGF0aEluZm8sICIvIik7CisgICAgICAgICAgICBpZiAoZGVidWcgPj0gMykgeworICAgICAgICAgICAgICAgIGxvZygiZmluZENHSTogY3VycmVudExvYz0iICsgY3VycmVudExvY2F0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlICghY3VycmVudExvY2F0aW9uLmlzRmlsZSgpICYmIGRpcldhbGtlci5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgIGlmIChkZWJ1ZyA+PSAzKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZygiZmluZENHSTogY3VycmVudExvYz0iICsgY3VycmVudExvY2F0aW9uKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY3VycmVudExvY2F0aW9uID0gbmV3IEZpbGUoY3VycmVudExvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTdHJpbmcpIGRpcldhbGtlci5uZXh0RWxlbWVudCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghY3VycmVudExvY2F0aW9uLmlzRmlsZSgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7IG51bGwsIG51bGwsIG51bGwsIG51bGwgfTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGRlYnVnID49IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nKCJmaW5kQ0dJOiBGT1VORCBjZ2kgYXQgIiArIGN1cnJlbnRMb2NhdGlvbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBhdGggPSBjdXJyZW50TG9jYXRpb24uZ2V0QWJzb2x1dGVQYXRoKCk7CisgICAgICAgICAgICAgICAgbmFtZSA9IGN1cnJlbnRMb2NhdGlvbi5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgY2dpbmFtZSA9CisgICAgICAgICAgICAgICAgY3VycmVudExvY2F0aW9uLmdldFBhcmVudCgpLnN1YnN0cmluZyh3ZWJBcHBSb290RGlyLmxlbmd0aCgpKQorICAgICAgICAgICAgICAgICsgRmlsZS5zZXBhcmF0b3IKKyAgICAgICAgICAgICAgICArIG5hbWU7CisKKyAgICAgICAgICAgICAgICBpZiAoIi4iLmVxdWFscyhjb250ZXh0UGF0aCkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2NyaXB0bmFtZSA9IHNlcnZsZXRQYXRoICsgY2dpbmFtZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzY3JpcHRuYW1lID0gY29udGV4dFBhdGggKyBzZXJ2bGV0UGF0aCArIGNnaW5hbWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZGVidWcgPj0gMSkgeworICAgICAgICAgICAgICAgIGxvZygiZmluZENHSSBjYWxjOiBuYW1lPSIgKyBuYW1lICsgIiwgcGF0aD0iICsgcGF0aAorICAgICAgICAgICAgICAgICAgICArICIsIHNjcmlwdG5hbWU9IiArIHNjcmlwdG5hbWUgKyAiLCBjZ2luYW1lPSIgKyBjZ2luYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nW10geyBwYXRoLCBzY3JpcHRuYW1lLCBjZ2luYW1lLCBuYW1lIH07CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ29uc3RydWN0cyB0aGUgQ0dJIGVudmlyb25tZW50IHRvIGJlIHN1cHBsaWVkIHRvIHRoZSBpbnZva2VkIENHSQorICAgICAgICAgKiBzY3JpcHQ7IHJlbGllcyBoZWF2bGl5IG9uIFNlcnZsZXQgQVBJIG1ldGhvZHMgYW5kIGZpbmRDR0kKKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtICAgIHJlcSByZXF1ZXN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgQ0dJCisgICAgICAgICAqICAgICAgICAgICBpbnZva2F0aW9uCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gICB0cnVlIGlmIGVudmlyb25tZW50IHdhcyBzZXQgT0ssIGZhbHNlIGlmIHRoZXJlCisgICAgICAgICAqICAgICAgICAgICB3YXMgYSBwcm9ibGVtIGFuZCBubyBlbnZpcm9ubWVudCB3YXMgc2V0CisgICAgICAgICAqLworICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzZXRDR0lFbnZpcm9ubWVudChIdHRwU2VydmxldFJlcXVlc3QgcmVxKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogVGhpcyBtZXRob2QgaXMgc2xpZ2h0bHkgdWdseTsgYydlc3QgbGEgdmllLgorICAgICAgICAgICAgICogIllvdSBjYW5ub3Qgc3RvcCBbdWdsaW5lc3NdLCB5b3UgY2FuIG9ubHkgaG9wZSB0byBjb250YWluIFtpdF0iCisgICAgICAgICAgICAgKiAoYXBvbG9naWVzIHRvIE1hcnYgQWxiZXJ0IHJlZ2FyZGluZyBNSikKKyAgICAgICAgICAgICAqLworCisgICAgICAgICAgICBIYXNodGFibGUgZW52cCA9IG5ldyBIYXNodGFibGUoKTsKKworICAgICAgICAgICAgLy8gQWRkIHRoZSBzaGVsbCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgKGlmIGFueSkKKyAgICAgICAgICAgIGVudnAucHV0QWxsKHNoZWxsRW52KTsKKworICAgICAgICAgICAgLy8gQWRkIHRoZSBDR0kgZW52aXJvbm1lbnQgdmFyaWFibGVzCisgICAgICAgICAgICBTdHJpbmcgc1BhdGhJbmZvT3JpZyA9IG51bGw7CisgICAgICAgICAgICBTdHJpbmcgc1BhdGhUcmFuc2xhdGVkT3JpZyA9IG51bGw7CisgICAgICAgICAgICBTdHJpbmcgc1BhdGhJbmZvQ0dJID0gbnVsbDsKKyAgICAgICAgICAgIFN0cmluZyBzUGF0aFRyYW5zbGF0ZWRDR0kgPSBudWxsOworICAgICAgICAgICAgU3RyaW5nIHNDR0lGdWxsUGF0aCA9IG51bGw7CisgICAgICAgICAgICBTdHJpbmcgc0NHSVNjcmlwdE5hbWUgPSBudWxsOworICAgICAgICAgICAgU3RyaW5nIHNDR0lGdWxsTmFtZSA9IG51bGw7CisgICAgICAgICAgICBTdHJpbmcgc0NHSU5hbWUgPSBudWxsOworICAgICAgICAgICAgU3RyaW5nW10gc0NHSU5hbWVzOworCisKKyAgICAgICAgICAgIHNQYXRoSW5mb09yaWcgPSB0aGlzLnBhdGhJbmZvOworICAgICAgICAgICAgc1BhdGhJbmZvT3JpZyA9IHNQYXRoSW5mb09yaWcgPT0gbnVsbCA/ICIiIDogc1BhdGhJbmZvT3JpZzsKKworICAgICAgICAgICAgc1BhdGhUcmFuc2xhdGVkT3JpZyA9IHJlcS5nZXRQYXRoVHJhbnNsYXRlZCgpOworICAgICAgICAgICAgc1BhdGhUcmFuc2xhdGVkT3JpZyA9CisgICAgICAgICAgICAgICAgc1BhdGhUcmFuc2xhdGVkT3JpZyA9PSBudWxsID8gIiIgOiBzUGF0aFRyYW5zbGF0ZWRPcmlnOworCisgICAgICAgICAgICBpZiAod2ViQXBwUm9vdERpciA9PSBudWxsICkgeworICAgICAgICAgICAgICAgIC8vIFRoZSBhcHAgaGFzIG5vdCBiZWVuIGRlcGxveWVkIGluIGV4cGxvZGVkIGZvcm0KKyAgICAgICAgICAgICAgICB3ZWJBcHBSb290RGlyID0gdG1wRGlyLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgZXhwYW5kQ0dJU2NyaXB0KCk7CisgICAgICAgICAgICB9IAorICAgICAgICAgICAgCisgICAgICAgICAgICBzQ0dJTmFtZXMgPSBmaW5kQ0dJKHNQYXRoSW5mb09yaWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlYkFwcFJvb3REaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2bGV0UGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2dpUGF0aFByZWZpeCk7CisKKyAgICAgICAgICAgIHNDR0lGdWxsUGF0aCA9IHNDR0lOYW1lc1swXTsKKyAgICAgICAgICAgIHNDR0lTY3JpcHROYW1lID0gc0NHSU5hbWVzWzFdOworICAgICAgICAgICAgc0NHSUZ1bGxOYW1lID0gc0NHSU5hbWVzWzJdOworICAgICAgICAgICAgc0NHSU5hbWUgPSBzQ0dJTmFtZXNbM107CisKKyAgICAgICAgICAgIGlmIChzQ0dJRnVsbFBhdGggPT0gbnVsbAorICAgICAgICAgICAgICAgIHx8IHNDR0lTY3JpcHROYW1lID09IG51bGwKKyAgICAgICAgICAgICAgICB8fCBzQ0dJRnVsbE5hbWUgPT0gbnVsbAorICAgICAgICAgICAgICAgIHx8IHNDR0lOYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGVudnAucHV0KCJTRVJWRVJfU09GVFdBUkUiLCAiVE9NQ0FUIik7CisKKyAgICAgICAgICAgIGVudnAucHV0KCJTRVJWRVJfTkFNRSIsIG51bGxzVG9CbGFua3MocmVxLmdldFNlcnZlck5hbWUoKSkpOworCisgICAgICAgICAgICBlbnZwLnB1dCgiR0FURVdBWV9JTlRFUkZBQ0UiLCAiQ0dJLzEuMSIpOworCisgICAgICAgICAgICBlbnZwLnB1dCgiU0VSVkVSX1BST1RPQ09MIiwgbnVsbHNUb0JsYW5rcyhyZXEuZ2V0UHJvdG9jb2woKSkpOworCisgICAgICAgICAgICBpbnQgcG9ydCA9IHJlcS5nZXRTZXJ2ZXJQb3J0KCk7CisgICAgICAgICAgICBJbnRlZ2VyIGlQb3J0ID0gKHBvcnQgPT0gMCA/IG5ldyBJbnRlZ2VyKC0xKSA6IG5ldyBJbnRlZ2VyKHBvcnQpKTsKKyAgICAgICAgICAgIGVudnAucHV0KCJTRVJWRVJfUE9SVCIsIGlQb3J0LnRvU3RyaW5nKCkpOworCisgICAgICAgICAgICBlbnZwLnB1dCgiUkVRVUVTVF9NRVRIT0QiLCBudWxsc1RvQmxhbmtzKHJlcS5nZXRNZXRob2QoKSkpOworCisKKworICAgICAgICAgICAgLyotCisgICAgICAgICAgICAgKiBQQVRIX0lORk8gc2hvdWxkIGJlIGRldGVybWluZWQgYnkgdXNpbmcgc0NHSUZ1bGxOYW1lOgorICAgICAgICAgICAgICogMSkgTGV0IHNDR0lGdWxsTmFtZSBub3QgZW5kIGluIGEgIi8iIChzZWUgbWV0aG9kIGZpbmRDR0kpCisgICAgICAgICAgICAgKiAyKSBMZXQgc0NHSUZ1bGxOYW1lIGVxdWFsIHRoZSBwYXRoSW5mbyBmcmFnbWVudCB3aGljaAorICAgICAgICAgICAgICogICAgY29ycmVzcG9uZHMgdG8gdGhlIGFjdHVhbCBjZ2kgc2NyaXB0LgorICAgICAgICAgICAgICogMykgVGh1cywgUEFUSF9JTkZPID0gcmVxdWVzdC5nZXRQYXRoSW5mbygpLnN1YnN0cmluZygKKyAgICAgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgIHNDR0lGdWxsTmFtZS5sZW5ndGgoKSkKKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiAoc2VlIG1ldGhvZCBmaW5kQ0dJLCB3aGVyZSB0aGUgcmVhbCB3b3JrIGlzIGRvbmUpCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAocGF0aEluZm8gPT0gbnVsbAorICAgICAgICAgICAgICAgIHx8IChwYXRoSW5mby5zdWJzdHJpbmcoc0NHSUZ1bGxOYW1lLmxlbmd0aCgpKS5sZW5ndGgoKSA8PSAwKSkgeworICAgICAgICAgICAgICAgIHNQYXRoSW5mb0NHSSA9ICIiOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzUGF0aEluZm9DR0kgPSBwYXRoSW5mby5zdWJzdHJpbmcoc0NHSUZ1bGxOYW1lLmxlbmd0aCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVudnAucHV0KCJQQVRIX0lORk8iLCBzUGF0aEluZm9DR0kpOworCisKKyAgICAgICAgICAgIC8qLQorICAgICAgICAgICAgICogUEFUSF9UUkFOU0xBVEVEIG11c3QgYmUgZGV0ZXJtaW5lZCBhZnRlciBQQVRIX0lORk8gKGFuZCB0aGUKKyAgICAgICAgICAgICAqIGltcGxpZWQgcmVhbCBjZ2ktc2NyaXB0KSBoYXMgYmVlbiB0YWtlbiBpbnRvIGFjY291bnQuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogVGhlIGZvbGxvd2luZyBleGFtcGxlIGRlbW9uc3RyYXRlczoKKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBzZXJ2bGV0IGluZm8gICA9IC9zZXJ2bGV0L2NnaWd3L2RpcjEvZGlyMi9jZ2kxL3RyYW5zMS90cmFuczIKKyAgICAgICAgICAgICAqIGNnaWZ1bGxwYXRoICAgID0gL3NlcnZsZXQvY2dpZ3cvZGlyMS9kaXIyL2NnaTEKKyAgICAgICAgICAgICAqIHBhdGhfaW5mbyAgICAgID0gL3RyYW5zMS90cmFuczIKKyAgICAgICAgICAgICAqIHdlYkFwcFJvb3REaXIgID0gc2VydmxldENvbnRleHQuZ2V0UmVhbFBhdGgoIi8iKQorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIHBhdGhfdHJhbnNsYXRlZCA9IHNlcnZsZXRDb250ZXh0LmdldFJlYWxQYXRoKCIvdHJhbnMxL3RyYW5zMiIpCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogVGhhdCBpcywgUEFUSF9UUkFOU0xBVEVEID0gd2ViQXBwUm9vdERpciArIHNQYXRoSW5mb0NHSQorICAgICAgICAgICAgICogKHVubGVzcyBzUGF0aEluZm9DR0kgaXMgbnVsbCBvciBibGFuaywgdGhlbiB0aGUgQ0dJCisgICAgICAgICAgICAgKiBzcGVjaWZpY2F0aW9uIGRpY3RhdGVzIHRoYXQgdGhlIFBBVEhfVFJBTlNMQVRFRCBtZXRhdmFyaWFibGUKKyAgICAgICAgICAgICAqIFNIT1VMRCBOT1QgYmUgZGVmaW5lZC4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChzUGF0aEluZm9DR0kgIT0gbnVsbCAmJiAhKCIiLmVxdWFscyhzUGF0aEluZm9DR0kpKSkgeworICAgICAgICAgICAgICAgIHNQYXRoVHJhbnNsYXRlZENHSSA9IGNvbnRleHQuZ2V0UmVhbFBhdGgoc1BhdGhJbmZvQ0dJKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc1BhdGhUcmFuc2xhdGVkQ0dJID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzUGF0aFRyYW5zbGF0ZWRDR0kgPT0gbnVsbCB8fCAiIi5lcXVhbHMoc1BhdGhUcmFuc2xhdGVkQ0dJKSkgeworICAgICAgICAgICAgICAgIC8vTk9PUAorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBlbnZwLnB1dCgiUEFUSF9UUkFOU0xBVEVEIiwgbnVsbHNUb0JsYW5rcyhzUGF0aFRyYW5zbGF0ZWRDR0kpKTsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBlbnZwLnB1dCgiU0NSSVBUX05BTUUiLCBudWxsc1RvQmxhbmtzKHNDR0lTY3JpcHROYW1lKSk7CisKKyAgICAgICAgICAgIGVudnAucHV0KCJRVUVSWV9TVFJJTkciLCBudWxsc1RvQmxhbmtzKHJlcS5nZXRRdWVyeVN0cmluZygpKSk7CisKKyAgICAgICAgICAgIGVudnAucHV0KCJSRU1PVEVfSE9TVCIsIG51bGxzVG9CbGFua3MocmVxLmdldFJlbW90ZUhvc3QoKSkpOworCisgICAgICAgICAgICBlbnZwLnB1dCgiUkVNT1RFX0FERFIiLCBudWxsc1RvQmxhbmtzKHJlcS5nZXRSZW1vdGVBZGRyKCkpKTsKKworICAgICAgICAgICAgZW52cC5wdXQoIkFVVEhfVFlQRSIsIG51bGxzVG9CbGFua3MocmVxLmdldEF1dGhUeXBlKCkpKTsKKworICAgICAgICAgICAgZW52cC5wdXQoIlJFTU9URV9VU0VSIiwgbnVsbHNUb0JsYW5rcyhyZXEuZ2V0UmVtb3RlVXNlcigpKSk7CisKKyAgICAgICAgICAgIGVudnAucHV0KCJSRU1PVEVfSURFTlQiLCAiIik7IC8vbm90IG5lY2Vzc2FyeSBmb3IgZnVsbCBjb21wbGlhbmNlCisKKyAgICAgICAgICAgIGVudnAucHV0KCJDT05URU5UX1RZUEUiLCBudWxsc1RvQmxhbmtzKHJlcS5nZXRDb250ZW50VHlwZSgpKSk7CisKKworICAgICAgICAgICAgLyogTm90ZSBDR0kgc3BlYyBzYXlzIENPTlRFTlRfTEVOR1RIIG11c3QgYmUgTlVMTCAoIiIpIG9yIHVuZGVmaW5lZAorICAgICAgICAgICAgICogaWYgdGhlcmUgaXMgbm8gY29udGVudCwgc28gd2UgY2Fubm90IHB1dCAwIG9yIC0xIGluIGFzIHBlciB0aGUKKyAgICAgICAgICAgICAqIFNlcnZsZXQgQVBJIHNwZWMuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGludCBjb250ZW50TGVuZ3RoID0gcmVxLmdldENvbnRlbnRMZW5ndGgoKTsKKyAgICAgICAgICAgIFN0cmluZyBzQ29udGVudExlbmd0aCA9IChjb250ZW50TGVuZ3RoIDw9IDAgPyAiIiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5ldyBJbnRlZ2VyKGNvbnRlbnRMZW5ndGgpKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIGVudnAucHV0KCJDT05URU5UX0xFTkdUSCIsIHNDb250ZW50TGVuZ3RoKTsKKworCisgICAgICAgICAgICBFbnVtZXJhdGlvbiBoZWFkZXJzID0gcmVxLmdldEhlYWRlck5hbWVzKCk7CisgICAgICAgICAgICBTdHJpbmcgaGVhZGVyID0gbnVsbDsKKyAgICAgICAgICAgIHdoaWxlIChoZWFkZXJzLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgaGVhZGVyID0gbnVsbDsKKyAgICAgICAgICAgICAgICBoZWFkZXIgPSAoKFN0cmluZykgaGVhZGVycy5uZXh0RWxlbWVudCgpKS50b1VwcGVyQ2FzZSgpOworICAgICAgICAgICAgICAgIC8vUkVNSU5EOiByZXdyaXRlIG11bHRpcGxlIGhlYWRlcnMgYXMgaWYgcmVjZWl2ZWQgYXMgc2luZ2xlCisgICAgICAgICAgICAgICAgLy9SRU1JTkQ6IGNoYW5nZSBjaGFyYWN0ZXIgc2V0CisgICAgICAgICAgICAgICAgLy9SRU1JTkQ6IEkgZm9yZ290IHdoYXQgdGhlIHByZXZpb3VzIFJFTUlORCBtZWFucworICAgICAgICAgICAgICAgIGlmICgiQVVUSE9SSVpBVElPTiIuZXF1YWxzSWdub3JlQ2FzZShoZWFkZXIpIHx8CisgICAgICAgICAgICAgICAgICAgICJQUk9YWV9BVVRIT1JJWkFUSU9OIi5lcXVhbHNJZ25vcmVDYXNlKGhlYWRlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgLy9OT09QIHBlciBDR0kgc3BlY2lmaWNhdGlvbiBzZWN0aW9uIDExLjIKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBlbnZwLnB1dCgiSFRUUF8iICsgaGVhZGVyLnJlcGxhY2UoJy0nLCAnXycpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXEuZ2V0SGVhZGVyKGhlYWRlcikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgRmlsZSBmQ0dJRnVsbFBhdGggPSBuZXcgRmlsZShzQ0dJRnVsbFBhdGgpOworICAgICAgICAgICAgY29tbWFuZCA9IGZDR0lGdWxsUGF0aC5nZXRDYW5vbmljYWxQYXRoKCk7CisKKyAgICAgICAgICAgIGVudnAucHV0KCJYX1RPTUNBVF9TQ1JJUFRfUEFUSCIsIGNvbW1hbmQpOyAgLy9mb3Iga2lja3MKKworICAgICAgICAgICAgdGhpcy5lbnYgPSBlbnZwOworCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEV4dHJhY3RzIHJlcXVlc3RlZCByZXNvdXJjZSBmcm9tIHdlYiBhcHAgYXJjaGl2ZSB0byBjb250ZXh0IHdvcmsgCisgICAgICAgICAqIGRpcmVjdG9yeSB0byBlbmFibGUgQ0dJIHNjcmlwdCB0byBiZSBleGVjdXRlZC4KKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGV4cGFuZENHSVNjcmlwdCgpIHsKKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzcmNQYXRoID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGRlc3RQYXRoID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBudWxsOworCisgICAgICAgICAgICAvLyBwYXRocyBkZXBlbmQgb24gbWFwcGluZworICAgICAgICAgICAgaWYgKGNnaVBhdGhQcmVmaXggPT0gbnVsbCApIHsKKyAgICAgICAgICAgICAgICBzcmNQYXRoLmFwcGVuZChwYXRoSW5mbyk7CisgICAgICAgICAgICAgICAgaXMgPSBjb250ZXh0LmdldFJlc291cmNlQXNTdHJlYW0oc3JjUGF0aC50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICBkZXN0UGF0aC5hcHBlbmQodG1wRGlyKTsKKyAgICAgICAgICAgICAgICBkZXN0UGF0aC5hcHBlbmQocGF0aEluZm8pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBlc3NlbnRpYWxseSBzYW1lIHNlYXJjaCBhbGdvcml0aG0gYXMgZmluZENHSSgpCisgICAgICAgICAgICAgICAgc3JjUGF0aC5hcHBlbmQoY2dpUGF0aFByZWZpeCk7CisgICAgICAgICAgICAgICAgU3RyaW5nVG9rZW5pemVyIHBhdGhXYWxrZXIgPQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1Rva2VuaXplciAocGF0aEluZm8sICIvIik7CisgICAgICAgICAgICAgICAgLy8gc3RhcnQgd2l0aCBmaXJzdCBlbGVtZW50CisgICAgICAgICAgICAgICAgd2hpbGUgKHBhdGhXYWxrZXIuaGFzTW9yZUVsZW1lbnRzKCkgJiYgKGlzID09IG51bGwpKSB7CisgICAgICAgICAgICAgICAgICAgIHNyY1BhdGguYXBwZW5kKCIvIik7CisgICAgICAgICAgICAgICAgICAgIHNyY1BhdGguYXBwZW5kKHBhdGhXYWxrZXIubmV4dEVsZW1lbnQoKSk7CisgICAgICAgICAgICAgICAgICAgIGlzID0gY29udGV4dC5nZXRSZXNvdXJjZUFzU3RyZWFtKHNyY1BhdGgudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRlc3RQYXRoLmFwcGVuZCh0bXBEaXIpOworICAgICAgICAgICAgICAgIGRlc3RQYXRoLmFwcGVuZCgiLyIpOworICAgICAgICAgICAgICAgIGRlc3RQYXRoLmFwcGVuZChzcmNQYXRoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGlzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBkaWRuJ3QgZmluZCBhbnl0aGluZywgZ2l2ZSB1cCBub3cKKyAgICAgICAgICAgICAgICBpZiAoZGVidWcgPj0gMikgeworICAgICAgICAgICAgICAgICAgICBsb2coImV4cGFuZENHSVNjcmlwdDogc291cmNlICciICsgc3JjUGF0aCArICInIG5vdCBmb3VuZCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShkZXN0UGF0aC50b1N0cmluZygpKTsKKyAgICAgICAgICAgIGlmIChmLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgLy8gRG9uJ3QgbmVlZCB0byBleHBhbmQgaWYgaXQgYWxyZWFkeSBleGlzdHMKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9IAorCisgICAgICAgICAgICAvLyBjcmVhdGUgZGlyZWN0b3JpZXMKKyAgICAgICAgICAgIFN0cmluZyBkaXJQYXRoID0gbmV3IFN0cmluZyAoZGVzdFBhdGgudG9TdHJpbmcoKS5zdWJzdHJpbmcoCisgICAgICAgICAgICAgICAgICAgIDAsZGVzdFBhdGgudG9TdHJpbmcoKS5sYXN0SW5kZXhPZigiLyIpKSk7CisgICAgICAgICAgICBGaWxlIGRpciA9IG5ldyBGaWxlKGRpclBhdGgpOworICAgICAgICAgICAgZGlyLm1rZGlycygpOworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoZXhwYW5kRmlsZUxvY2spIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIGZpbGUgZG9lc24ndCBleGlzdAorICAgICAgICAgICAgICAgICAgICBpZiAoZi5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGZpbGUKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmLmNyZWF0ZU5ld0ZpbGUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZik7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gY29weSBkYXRhCisgICAgICAgICAgICAgICAgICAgIElPVG9vbHMuZmxvdyhpcywgZm9zKTsKKyAgICAgICAgICAgICAgICAgICAgaXMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgZm9zLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1ZyA+PSAyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2coImV4cGFuZENHSVNjcmlwdDogZXhwYW5kZWQgJyIgKyBzcmNQYXRoICsgIicgdG8gJyIgKyBkZXN0UGF0aCArICInIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgICAgICAvLyBkZWxldGUgaW4gY2FzZSBmaWxlIGlzIGNvcnJ1cHRlZCAKKyAgICAgICAgICAgICAgICBpZiAoZi5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgICAgICBmLmRlbGV0ZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFByaW50IGltcG9ydGFudCBDR0kgZW52aXJvbm1lbnQgaW5mb3JtYXRpb24gaW4gYSBlYXN5LXRvLXJlYWQgSFRNTAorICAgICAgICAgKiB0YWJsZQorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuICBIVE1MIHN0cmluZyBjb250YWluaW5nIENHSSBlbnZpcm9ubWVudCBpbmZvCisgICAgICAgICAqCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCisgICAgICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiPFRBQkxFIGJvcmRlcj0yPiIpOworCisgICAgICAgICAgICBzYi5hcHBlbmQoIjx0cj48dGggY29sc3Bhbj0yIGJnY29sb3I9Z3JleT4iKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiQ0dJRW52aXJvbm1lbnQgSW5mbzwvdGg+PC90cj4iKTsKKworICAgICAgICAgICAgc2IuYXBwZW5kKCI8dHI+PHRkPkRlYnVnIExldmVsPC90ZD48dGQ+Iik7CisgICAgICAgICAgICBzYi5hcHBlbmQoZGVidWcpOworICAgICAgICAgICAgc2IuYXBwZW5kKCI8L3RkPjwvdHI+Iik7CisKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiPHRyPjx0ZD5WYWxpZGl0eTo8L3RkPjx0ZD4iKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChpc1ZhbGlkKCkpOworICAgICAgICAgICAgc2IuYXBwZW5kKCI8L3RkPjwvdHI+Iik7CisKKyAgICAgICAgICAgIGlmIChpc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgICAgICBFbnVtZXJhdGlvbiBlbnZrID0gZW52LmtleXMoKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoZW52ay5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcyA9IChTdHJpbmcpIGVudmsubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCI8dHI+PHRkPiIpOworICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQocyk7CisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiPC90ZD48dGQ+Iik7CisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChibGFua3NUb1N0cmluZygoU3RyaW5nKSBlbnYuZ2V0KHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlt3aWxsIGJlIHNldCB0byBibGFua10iKSk7CisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiPC90ZD48L3RyPiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2IuYXBwZW5kKCI8dHI+PHRkIGNvbHNwYW49Mj48SFI+PC90ZD48L3RyPiIpOworCisgICAgICAgICAgICBzYi5hcHBlbmQoIjx0cj48dGQ+RGVyaXZlZCBDb21tYW5kPC90ZD48dGQ+Iik7CisgICAgICAgICAgICBzYi5hcHBlbmQobnVsbHNUb0JsYW5rcyhjb21tYW5kKSk7CisgICAgICAgICAgICBzYi5hcHBlbmQoIjwvdGQ+PC90cj4iKTsKKworICAgICAgICAgICAgc2IuYXBwZW5kKCI8dHI+PHRkPldvcmtpbmcgRGlyZWN0b3J5PC90ZD48dGQ+Iik7CisgICAgICAgICAgICBpZiAod29ya2luZ0RpcmVjdG9yeSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKHdvcmtpbmdEaXJlY3RvcnkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzYi5hcHBlbmQoIjwvdGQ+PC90cj4iKTsKKworICAgICAgICAgICAgc2IuYXBwZW5kKCI8dHI+PHRkIGNvbHNwYW49Mj5RdWVyeSBQYXJhbXM8L3RkPjwvdHI+Iik7CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBxdWVyeVBhcmFtZXRlcnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBOYW1lVmFsdWVQYWlyIG52cCA9IChOYW1lVmFsdWVQYWlyKSBxdWVyeVBhcmFtZXRlcnMuZ2V0KGkpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiPHRyPjx0ZD4iKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQobnZwLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCI8L3RkPjx0ZD4iKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQobnZwLmdldFZhbHVlKCkpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiPC90ZD48L3RyPiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzYi5hcHBlbmQoIjwvVEFCTEU+PHA+ZW5kLiIpOworCisgICAgICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICAgICAgfQorCisKKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0cyBkZXJpdmVkIGNvbW1hbmQgc3RyaW5nCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gIGNvbW1hbmQgc3RyaW5nCisgICAgICAgICAqCisgICAgICAgICAqLworICAgICAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENvbW1hbmQoKSB7CisgICAgICAgICAgICByZXR1cm4gY29tbWFuZDsKKyAgICAgICAgfQorCisKKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0cyBkZXJpdmVkIENHSSB3b3JraW5nIGRpcmVjdG9yeQorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuICB3b3JraW5nIGRpcmVjdG9yeQorICAgICAgICAgKgorICAgICAgICAgKi8KKyAgICAgICAgcHJvdGVjdGVkIEZpbGUgZ2V0V29ya2luZ0RpcmVjdG9yeSgpIHsKKyAgICAgICAgICAgIHJldHVybiB3b3JraW5nRGlyZWN0b3J5OworICAgICAgICB9CisKKworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXRzIGRlcml2ZWQgQ0dJIGVudmlyb25tZW50CisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gICBDR0kgZW52aXJvbm1lbnQKKyAgICAgICAgICoKKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCBIYXNodGFibGUgZ2V0RW52aXJvbm1lbnQoKSB7CisgICAgICAgICAgICByZXR1cm4gZW52OworICAgICAgICB9CisKKworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXRzIGRlcml2ZWQgQ0dJIHF1ZXJ5IHBhcmFtZXRlcnMKKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiAgIENHSSBxdWVyeSBwYXJhbWV0ZXJzCisgICAgICAgICAqCisgICAgICAgICAqLworICAgICAgICBwcm90ZWN0ZWQgQXJyYXlMaXN0IGdldFBhcmFtZXRlcnMoKSB7CisgICAgICAgICAgICByZXR1cm4gcXVlcnlQYXJhbWV0ZXJzOworICAgICAgICB9CisKKworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXRzIHZhbGlkaXR5IHN0YXR1cworICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuICAgdHJ1ZSBpZiB0aGlzIGVudmlyb25tZW50IGlzIHZhbGlkLCBmYWxzZQorICAgICAgICAgKiAgICAgICAgICAgb3RoZXJ3aXNlCisgICAgICAgICAqCisgICAgICAgICAqLworICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1ZhbGlkKCkgeworICAgICAgICAgICAgcmV0dXJuIHZhbGlkOworICAgICAgICB9CisKKworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb252ZXJ0cyBudWxsIHN0cmluZ3MgdG8gYmxhbmsgc3RyaW5ncyAoIiIpCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSAgICBzIHN0cmluZyB0byBiZSBjb252ZXJ0ZWQgaWYgbmVjZXNzYXJ5CisgICAgICAgICAqIEByZXR1cm4gICBhIG5vbi1udWxsIHN0cmluZywgZWl0aGVyIHRoZSBvcmlnaW5hbCBvciB0aGUgZW1wdHkgc3RyaW5nCisgICAgICAgICAqICAgICAgICAgICAoIiIpIGlmIHRoZSBvcmlnaW5hbCB3YXMgPGNvZGU+bnVsbDwvY29kZT4KKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCBTdHJpbmcgbnVsbHNUb0JsYW5rcyhTdHJpbmcgcykgeworICAgICAgICAgICAgcmV0dXJuIG51bGxzVG9TdHJpbmcocywgIiIpOworICAgICAgICB9CisKKworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb252ZXJ0cyBudWxsIHN0cmluZ3MgdG8gYW5vdGhlciBzdHJpbmcKKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtICAgIGNvdWxkQmVOdWxsIHN0cmluZyB0byBiZSBjb252ZXJ0ZWQgaWYgbmVjZXNzYXJ5CisgICAgICAgICAqIEBwYXJhbSAgICBzdWJGb3JOdWxscyBzdHJpbmcgdG8gcmV0dXJuIGluc3RlYWQgb2YgYSBudWxsIHN0cmluZworICAgICAgICAgKiBAcmV0dXJuICAgYSBub24tbnVsbCBzdHJpbmcsIGVpdGhlciB0aGUgb3JpZ2luYWwgb3IgdGhlIHN1YnN0aXR1dGUKKyAgICAgICAgICogICAgICAgICAgIHN0cmluZyBpZiB0aGUgb3JpZ2luYWwgd2FzIDxjb2RlPm51bGw8L2NvZGU+CisgICAgICAgICAqLworICAgICAgICBwcm90ZWN0ZWQgU3RyaW5nIG51bGxzVG9TdHJpbmcoU3RyaW5nIGNvdWxkQmVOdWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHN1YkZvck51bGxzKSB7CisgICAgICAgICAgICByZXR1cm4gKGNvdWxkQmVOdWxsID09IG51bGwgPyBzdWJGb3JOdWxscyA6IGNvdWxkQmVOdWxsKTsKKyAgICAgICAgfQorCisKKworICAgICAgICAvKioKKyAgICAgICAgICogQ29udmVydHMgYmxhbmsgc3RyaW5ncyB0byBhbm90aGVyIHN0cmluZworICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gICAgY291bGRCZUJsYW5rIHN0cmluZyB0byBiZSBjb252ZXJ0ZWQgaWYgbmVjZXNzYXJ5CisgICAgICAgICAqIEBwYXJhbSAgICBzdWJGb3JCbGFua3Mgc3RyaW5nIHRvIHJldHVybiBpbnN0ZWFkIG9mIGEgYmxhbmsgc3RyaW5nCisgICAgICAgICAqIEByZXR1cm4gICBhIG5vbi1udWxsIHN0cmluZywgZWl0aGVyIHRoZSBvcmlnaW5hbCBvciB0aGUgc3Vic3RpdHV0ZQorICAgICAgICAgKiAgICAgICAgICAgc3RyaW5nIGlmIHRoZSBvcmlnaW5hbCB3YXMgPGNvZGU+bnVsbDwvY29kZT4gb3IgZW1wdHkgKCIiKQorICAgICAgICAgKi8KKyAgICAgICAgcHJvdGVjdGVkIFN0cmluZyBibGFua3NUb1N0cmluZyhTdHJpbmcgY291bGRCZUJsYW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc3ViRm9yQmxhbmtzKSB7CisgICAgICAgICAgICByZXR1cm4gKCgiIi5lcXVhbHMoY291bGRCZUJsYW5rKSB8fCBjb3VsZEJlQmxhbmsgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgPyBzdWJGb3JCbGFua3MKKyAgICAgICAgICAgICAgICAgICAgOiBjb3VsZEJlQmxhbmspOworICAgICAgICB9CisKKworCisgICAgfSAvL2NsYXNzIENHSUVudmlyb25tZW50CisKKworCisKKworCisgICAgLyoqCisgICAgICogRW5jYXBzdWxhdGVzIHRoZSBrbm93bGVkZ2Ugb2YgaG93IHRvIHJ1biBhIENHSSBzY3JpcHQsIGdpdmVuIHRoZQorICAgICAqIHNjcmlwdCdzIGRlc2lyZWQgZW52aXJvbm1lbnQgYW5kIChvcHRpb25hbGx5KSBpbnB1dC9vdXRwdXQgc3RyZWFtcworICAgICAqCisgICAgICogPHA+CisgICAgICoKKyAgICAgKiBFeHBvc2VzIGEgPGNvZGU+cnVuPC9jb2RlPiBtZXRob2QgdXNlZCB0byBhY3R1YWxseSBpbnZva2UgdGhlCisgICAgICogQ0dJLgorICAgICAqCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqCisgICAgICogVGhlIENHSSBlbnZpcm9ubWVudCBhbmQgc2V0dGluZ3MgYXJlIGRlcml2ZWQgZnJvbSB0aGUgaW5mb3JtYXRpb24KKyAgICAgKiBwYXNzZWQgdG8gdGhlIGNvbnN0dWN0b3IuCisgICAgICoKKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICoKKyAgICAgKiBUaGUgaW5wdXQgYW5kIG91dHB1dCBzdHJlYW1zIGNhbiBiZSBzZXQgYnkgdGhlIDxjb2RlPnNldElucHV0PC9jb2RlPgorICAgICAqIGFuZCA8Y29kZT5zZXRSZXNwb25zZTwvY29kZT4gbWV0aG9kcywgcmVzcGVjdGl2ZWx5LgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEB2ZXJzaW9uICAgJFJldmlzaW9uJCwgJERhdGUkCisgICAgICovCisKKyAgICBwcm90ZWN0ZWQgY2xhc3MgQ0dJUnVubmVyIHsKKworICAgICAgICAvKiogc2NyaXB0L2NvbW1hbmQgdG8gYmUgZXhlY3V0ZWQgKi8KKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgY29tbWFuZCA9IG51bGw7CisKKyAgICAgICAgLyoqIGVudmlyb25tZW50IHVzZWQgd2hlbiBpbnZva2luZyB0aGUgY2dpIHNjcmlwdCAqLworICAgICAgICBwcml2YXRlIEhhc2h0YWJsZSBlbnYgPSBudWxsOworCisgICAgICAgIC8qKiB3b3JraW5nIGRpcmVjdG9yeSB1c2VkIHdoZW4gaW52b2tpbmcgdGhlIGNnaSBzY3JpcHQgKi8KKyAgICAgICAgcHJpdmF0ZSBGaWxlIHdkID0gbnVsbDsKKworICAgICAgICAvKiogcXVlcnkgcGFyYW1ldGVycyB0byBiZSBwYXNzZWQgdG8gdGhlIGludm9rZWQgc2NyaXB0ICovCisgICAgICAgIHByaXZhdGUgQXJyYXlMaXN0IHBhcmFtcyA9IG51bGw7CisKKyAgICAgICAgLyoqIHN0ZGluIHRvIGJlIHBhc3NlZCB0byBjZ2kgc2NyaXB0ICovCisgICAgICAgIHByaXZhdGUgSW5wdXRTdHJlYW0gc3RkaW4gPSBudWxsOworCisgICAgICAgIC8qKiByZXNwb25zZSBvYmplY3QgdXNlZCB0byBzZXQgaGVhZGVycyAmIGdldCBvdXRwdXQgc3RyZWFtICovCisgICAgICAgIHByaXZhdGUgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSA9IG51bGw7CisKKyAgICAgICAgLyoqIGJvb2xlYW4gdHJhY2tpbmcgd2hldGhlciB0aGlzIG9iamVjdCBoYXMgZW5vdWdoIGluZm8gdG8gcnVuKCkgKi8KKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIHJlYWR5VG9SdW4gPSBmYWxzZTsKKworCisKKworICAgICAgICAvKioKKyAgICAgICAgICogIENyZWF0ZXMgYSBDR0lSdW5uZXIgYW5kIGluaXRpYWxpemVzIGl0cyBlbnZpcm9ubWVudCwgd29ya2luZworICAgICAgICAgKiAgZGlyZWN0b3J5LCBhbmQgcXVlcnkgcGFyYW1ldGVycy4KKyAgICAgICAgICogIDxCUj4KKyAgICAgICAgICogIElucHV0L291dHB1dCBzdHJlYW1zIChvcHRpb25hbCkgYXJlIHNldCB1c2luZyB0aGUKKyAgICAgICAgICogIDxjb2RlPnNldElucHV0PC9jb2RlPiBhbmQgPGNvZGU+c2V0UmVzcG9uc2U8L2NvZGU+IG1ldGhvZHMsCisgICAgICAgICAqICByZXNwZWN0aXZlbHkuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSAgY29tbWFuZCAgc3RyaW5nIGZ1bGwgcGF0aCB0byBjb21tYW5kIHRvIGJlIGV4ZWN1dGVkCisgICAgICAgICAqIEBwYXJhbSAgZW52ICAgICAgSGFzaHRhYmxlIHdpdGggdGhlIGRlc2lyZWQgc2NyaXB0IGVudmlyb25tZW50CisgICAgICAgICAqIEBwYXJhbSAgd2QgICAgICAgRmlsZSB3aXRoIHRoZSBzY3JpcHQncyBkZXNpcmVkIHdvcmtpbmcgZGlyZWN0b3J5CisgICAgICAgICAqIEBwYXJhbSAgcGFyYW1zICAgQXJyYXlMaXN0IHdpdGggdGhlIHNjcmlwdCdzIHF1ZXJ5IHBhcmFtZXRlcnMgYXMKKyAgICAgICAgICogICAgICAgICAgICAgICAgICBOYW1lVmFsdWVQYWlycworICAgICAgICAgKi8KKyAgICAgICAgcHJvdGVjdGVkIENHSVJ1bm5lcihTdHJpbmcgY29tbWFuZCwgSGFzaHRhYmxlIGVudiwgRmlsZSB3ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheUxpc3QgcGFyYW1zKSB7CisgICAgICAgICAgICB0aGlzLmNvbW1hbmQgPSBjb21tYW5kOworICAgICAgICAgICAgdGhpcy5lbnYgPSBlbnY7CisgICAgICAgICAgICB0aGlzLndkID0gd2Q7CisgICAgICAgICAgICB0aGlzLnBhcmFtcyA9IHBhcmFtczsKKyAgICAgICAgICAgIHVwZGF0ZVJlYWR5U3RhdHVzKCk7CisgICAgICAgIH0KKworCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENoZWNrcyAmIHNldHMgcmVhZHkgc3RhdHVzCisgICAgICAgICAqLworICAgICAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVSZWFkeVN0YXR1cygpIHsKKyAgICAgICAgICAgIGlmIChjb21tYW5kICE9IG51bGwKKyAgICAgICAgICAgICAgICAmJiBlbnYgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmIHdkICE9IG51bGwKKyAgICAgICAgICAgICAgICAmJiBwYXJhbXMgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmIHJlc3BvbnNlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZWFkeVRvUnVuID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmVhZHlUb1J1biA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXRzIHJlYWR5IHN0YXR1cworICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuICAgZmFsc2UgaWYgbm90IHJlYWR5ICg8Y29kZT5ydW48L2NvZGU+IHdpbGwgdGhyb3cKKyAgICAgICAgICogICAgICAgICAgIGFuIGV4Y2VwdGlvbiksIHRydWUgaWYgcmVhZHkKKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCBib29sZWFuIGlzUmVhZHkoKSB7CisgICAgICAgICAgICByZXR1cm4gcmVhZHlUb1J1bjsKKyAgICAgICAgfQorCisKKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyBIdHRwU2VydmxldFJlc3BvbnNlIG9iamVjdCB1c2VkIHRvIHNldCBoZWFkZXJzIGFuZCBzZW5kCisgICAgICAgICAqIG91dHB1dCB0bworICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gIHJlc3BvbnNlICAgSHR0cFNlcnZsZXRSZXNwb25zZSB0byBiZSB1c2VkCisgICAgICAgICAqCisgICAgICAgICAqLworICAgICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRSZXNwb25zZShIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB7CisgICAgICAgICAgICB0aGlzLnJlc3BvbnNlID0gcmVzcG9uc2U7CisgICAgICAgICAgICB1cGRhdGVSZWFkeVN0YXR1cygpOworICAgICAgICB9CisKKworCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIHN0YW5kYXJkIGlucHV0IHRvIGJlIHBhc3NlZCBvbiB0byB0aGUgaW52b2tlZCBjZ2kgc2NyaXB0CisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSAgc3RkaW4gICBJbnB1dFN0cmVhbSB0byBiZSB1c2VkCisgICAgICAgICAqCisgICAgICAgICAqLworICAgICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRJbnB1dChJbnB1dFN0cmVhbSBzdGRpbikgeworICAgICAgICAgICAgdGhpcy5zdGRpbiA9IHN0ZGluOworICAgICAgICAgICAgdXBkYXRlUmVhZHlTdGF0dXMoKTsKKyAgICAgICAgfQorCisKKworICAgICAgICAvKioKKyAgICAgICAgICogQ29udmVydHMgYSBIYXNodGFibGUgdG8gYSBTdHJpbmcgYXJyYXkgYnkgY29udmVydGluZyBlYWNoCisgICAgICAgICAqIGtleS92YWx1ZSBwYWlyIGluIHRoZSBIYXNodGFibGUgdG8gYSBTdHJpbmcgaW4gdGhlIGZvcm0KKyAgICAgICAgICogImtleT12YWx1ZSIgKGhhc2hrZXkgKyAiPSIgKyBoYXNoLmdldChoYXNoa2V5KS50b1N0cmluZygpKQorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gIGggICBIYXNodGFibGUgdG8gY29udmVydAorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuICAgICBjb252ZXJ0ZWQgc3RyaW5nIGFycmF5CisgICAgICAgICAqCisgICAgICAgICAqIEBleGNlcHRpb24gIE51bGxQb2ludGVyRXhjZXB0aW9uICAgaWYgYSBoYXNoIGtleSBoYXMgYSBudWxsIHZhbHVlCisgICAgICAgICAqCisgICAgICAgICAqLworICAgICAgICBwcm90ZWN0ZWQgU3RyaW5nW10gaGFzaFRvU3RyaW5nQXJyYXkoSGFzaHRhYmxlIGgpCisgICAgICAgICAgICB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24geworICAgICAgICAgICAgVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgICAgICBFbnVtZXJhdGlvbiBlID0gaC5rZXlzKCk7CisgICAgICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBrID0gZS5uZXh0RWxlbWVudCgpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgdi5hZGQoayArICI9IiArIGguZ2V0KGspKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0cmluZ1tdIHN0ckFyciA9IG5ldyBTdHJpbmdbdi5zaXplKCldOworICAgICAgICAgICAgdi5jb3B5SW50byhzdHJBcnIpOworICAgICAgICAgICAgcmV0dXJuIHN0ckFycjsKKyAgICAgICAgfQorCisKKworICAgICAgICAvKioKKyAgICAgICAgICogRXhlY3V0ZXMgYSBDR0kgc2NyaXB0IHdpdGggdGhlIGRlc2lyZWQgZW52aXJvbm1lbnQsIGN1cnJlbnQgd29ya2luZworICAgICAgICAgKiBkaXJlY3RvcnksIGFuZCBpbnB1dC9vdXRwdXQgc3RyZWFtcworICAgICAgICAgKgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogVGhpcyBpbXBsZW1lbnRzIHRoZSBmb2xsb3dpbmcgQ0dJIHNwZWNpZmljYXRpb24gcmVjb21tZWRhdGlvbnM6CisgICAgICAgICAqIDxVTD4KKyAgICAgICAgICogPExJPiBTZXJ2ZXJzIFNIT1VMRCBwcm92aWRlIHRoZSAiPGNvZGU+cXVlcnk8L2NvZGU+IiBjb21wb25lbnQgb2YKKyAgICAgICAgICogICAgICB0aGUgc2NyaXB0LVVSSSBhcyBjb21tYW5kLWxpbmUgYXJndW1lbnRzIHRvIHNjcmlwdHMgaWYgaXQKKyAgICAgICAgICogICAgICBkb2VzIG5vdCBjb250YWluIGFueSB1bmVuY29kZWQgIj0iIGNoYXJhY3RlcnMgYW5kIHRoZQorICAgICAgICAgKiAgICAgIGNvbW1hbmQtbGluZSBhcmd1bWVudHMgY2FuIGJlIGdlbmVyYXRlZCBpbiBhbiB1bmFtYmlndW91cworICAgICAgICAgKiAgICAgIG1hbm5lci4KKyAgICAgICAgICogPExJPiBTZXJ2ZXJzIFNIT1VMRCBzZXQgdGhlIEFVVEhfVFlQRSBtZXRhdmFyaWFibGUgdG8gdGhlIHZhbHVlCisgICAgICAgICAqICAgICAgb2YgdGhlICI8Y29kZT5hdXRoLXNjaGVtZTwvY29kZT4iIHRva2VuIG9mIHRoZQorICAgICAgICAgKiAgICAgICI8Y29kZT5BdXRob3JpemF0aW9uPC9jb2RlPiIgaWYgaXQgd2FzIHN1cHBsaWVkIGFzIHBhcnQgb2YgdGhlCisgICAgICAgICAqICAgICAgcmVxdWVzdCBoZWFkZXIuICBTZWUgPGNvZGU+Z2V0Q0dJRW52aXJvbm1lbnQ8L2NvZGU+IG1ldGhvZC4KKyAgICAgICAgICogPExJPiBXaGVyZSBhcHBsaWNhYmxlLCBzZXJ2ZXJzIFNIT1VMRCBzZXQgdGhlIGN1cnJlbnQgd29ya2luZworICAgICAgICAgKiAgICAgIGRpcmVjdG9yeSB0byB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIHRoZSBzY3JpcHQgaXMgbG9jYXRlZAorICAgICAgICAgKiAgICAgIGJlZm9yZSBpbnZva2luZyBpdC4KKyAgICAgICAgICogPExJPiBTZXJ2ZXIgaW1wbGVtZW50YXRpb25zIFNIT1VMRCBkZWZpbmUgdGhlaXIgYmVoYXZpb3IgZm9yIHRoZQorICAgICAgICAgKiAgICAgIGZvbGxvd2luZyBjYXNlczoKKyAgICAgICAgICogICAgIDx1bD4KKyAgICAgICAgICogICAgIDxMST4gPHU+QWxsb3dlZCBjaGFyYWN0ZXJzIGluIHBhdGhJbmZvPC91PjogIFRoaXMgaW1wbGVtZW50YXRpb24KKyAgICAgICAgICogICAgICAgICAgICAgZG9lcyBub3QgYWxsb3cgQVNDSUkgTlVMIG5vciBhbnkgY2hhcmFjdGVyIHdoaWNoIGNhbm5vdAorICAgICAgICAgKiAgICAgICAgICAgICBiZSBVUkwtZW5jb2RlZCBhY2NvcmRpbmcgdG8gaW50ZXJuZXQgc3RhbmRhcmRzOworICAgICAgICAgKiAgICAgPExJPiA8dT5BbGxvd2VkIGNoYXJhY3RlcnMgaW4gcGF0aCBzZWdtZW50czwvdT46IFRoaXMKKyAgICAgICAgICogICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgYWxsb3cgbm9uLXRlcm1pbmFsIE5VTEwKKyAgICAgICAgICogICAgICAgICAgICAgc2VnbWVudHMgaW4gdGhlIHRoZSBwYXRoIC0tIElPRXhjZXB0aW9ucyBtYXkgYmUgdGhyb3duOworICAgICAgICAgKiAgICAgPExJPiA8dT4iPGNvZGU+LjwvY29kZT4iIGFuZCAiPGNvZGU+Li48L2NvZGU+IiBwYXRoCisgICAgICAgICAqICAgICAgICAgICAgIHNlZ21lbnRzPC91PjoKKyAgICAgICAgICogICAgICAgICAgICAgVGhpcyBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBhbGxvdyAiPGNvZGU+LjwvY29kZT4iIGFuZAorICAgICAgICAgKiAgICAgICAgICAgICAiPGNvZGU+Li48L2NvZGU+IiBpbiB0aGUgdGhlIHBhdGgsIGFuZCBzdWNoIGNoYXJhY3RlcnMKKyAgICAgICAgICogICAgICAgICAgICAgd2lsbCByZXN1bHQgaW4gYW4gSU9FeGNlcHRpb24gYmVpbmcgdGhyb3duOworICAgICAgICAgKiAgICAgPExJPiA8dT5JbXBsZW1lbnRhdGlvbiBsaW1pdGF0aW9uczwvdT46IFRoaXMgaW1wbGVtZW50YXRpb24KKyAgICAgICAgICogICAgICAgICAgICAgZG9lcyBub3QgaW1wb3NlIGFueSBsaW1pdGF0aW9ucyBleGNlcHQgYXMgZG9jdW1lbnRlZAorICAgICAgICAgKiAgICAgICAgICAgICBhYm92ZS4gIFRoaXMgaW1wbGVtZW50YXRpb24gbWF5IGJlIGxpbWl0ZWQgYnkgdGhlCisgICAgICAgICAqICAgICAgICAgICAgIHNlcnZsZXQgY29udGFpbmVyIHVzZWQgdG8gaG91c2UgdGhpcyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgICAgICogICAgICAgICAgICAgSW4gcGFydGljdWxhciwgYWxsIHRoZSBwcmltYXJ5IENHSSB2YXJpYWJsZSB2YWx1ZXMKKyAgICAgICAgICogICAgICAgICAgICAgYXJlIGRlcml2ZWQgZWl0aGVyIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgZnJvbSB0aGUKKyAgICAgICAgICogICAgICAgICAgICAgY29udGFpbmVyJ3MgaW1wbGVtZW50YXRpb24gb2YgdGhlIFNlcnZsZXQgQVBJIG1ldGhvZHMuCisgICAgICAgICAqICAgICA8L3VsPgorICAgICAgICAgKiA8L1VMPgorICAgICAgICAgKiA8L3A+CisgICAgICAgICAqCisgICAgICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgcHJvYmxlbXMgZHVyaW5nIHJlYWRpbmcvd3JpdGluZyBvY2N1cgorICAgICAgICAgKgorICAgICAgICAgKiBAc2VlICAgIGphdmEubGFuZy5SdW50aW1lI2V4ZWMoU3RyaW5nIGNvbW1hbmQsIFN0cmluZ1tdIGVudnAsCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlIGRpcikKKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCB2b2lkIHJ1bigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBSRU1JTkQ6ICB0aGlzIG1ldGhvZCBmZWVscyB0b28gYmlnOyBzaG91bGQgaXQgYmUgcmUtd3JpdHRlbj8KKyAgICAgICAgICAgICAqLworCisgICAgICAgICAgICBpZiAoIWlzUmVhZHkoKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbih0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjogbm90IHJlYWR5IHRvIHJ1bi4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGRlYnVnID49IDEgKSB7CisgICAgICAgICAgICAgICAgbG9nKCJydW5DR0koZW52cD1bIiArIGVudiArICJdLCBjb21tYW5kPSIgKyBjb21tYW5kICsgIikiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChjb21tYW5kLmluZGV4T2YoRmlsZS5zZXBhcmF0b3IgKyAiLiIgKyBGaWxlLnNlcGFyYXRvcikgPj0gMCkKKyAgICAgICAgICAgICAgICB8fCAoY29tbWFuZC5pbmRleE9mKEZpbGUuc2VwYXJhdG9yICsgIi4uIikgPj0gMCkKKyAgICAgICAgICAgICAgICB8fCAoY29tbWFuZC5pbmRleE9mKCIuLiIgKyBGaWxlLnNlcGFyYXRvcikgPj0gMCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24odGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJJbGxlZ2FsIENoYXJhY3RlciBpbiBDR0kgY29tbWFuZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInBhdGggKCcuJyBvciAnLi4nKSBkZXRlY3RlZC4gIE5vdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInJ1bm5pbmcgQ0dJIFsiICsgY29tbWFuZCArICJdLiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBvcmlnaW5hbCBjb250ZW50L3N0cnVjdHVyZSBvZiB0aGlzIHNlY3Rpb24gdGFrZW4gZnJvbQorICAgICAgICAgICAgICogaHR0cDovL2RldmVsb3Blci5qYXZhLnN1bi5jb20vZGV2ZWxvcGVyLworICAgICAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVnUGFyYWRlL2J1Z3MvNDIxNjg4NC5odG1sCisgICAgICAgICAgICAgKiB3aXRoIG1ham9yIG1vZGlmaWNhdGlvbnMgYnkgTWFydGluIERlbmdsZXIKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgUnVudGltZSBydCA9IG51bGw7CisgICAgICAgICAgICBCdWZmZXJlZFJlYWRlciBjb21tYW5kc1N0ZE91dCA9IG51bGw7CisgICAgICAgICAgICBJbnB1dFN0cmVhbSBjZ2lPdXRwdXQgPSBudWxsOworICAgICAgICAgICAgQnVmZmVyZWRSZWFkZXIgY29tbWFuZHNTdGRFcnIgPSBudWxsOworICAgICAgICAgICAgQnVmZmVyZWRPdXRwdXRTdHJlYW0gY29tbWFuZHNTdGRJbiA9IG51bGw7CisgICAgICAgICAgICBQcm9jZXNzIHByb2MgPSBudWxsOworICAgICAgICAgICAgaW50IGJ1ZlJlYWQgPSAtMTsKKworICAgICAgICAgICAgLy9jcmVhdGUgcXVlcnkgYXJndW1lbnRzCisgICAgICAgICAgICBTdHJpbmdCdWZmZXIgY21kQW5kQXJncyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgICAgIGlmIChjb21tYW5kLmluZGV4T2YoIiAiKSA8IDApIHsKKyAgICAgICAgICAgICAgICBjbWRBbmRBcmdzLmFwcGVuZChjb21tYW5kKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gU3BhY2VzIHVzZWQgYXMgZGVsaW1pdGVyLCBzbyBuZWVkIHRvIHVzZSBxdW90ZXMKKyAgICAgICAgICAgICAgICBjbWRBbmRBcmdzLmFwcGVuZCgiXCIiKTsKKyAgICAgICAgICAgICAgICBjbWRBbmRBcmdzLmFwcGVuZChjb21tYW5kKTsKKyAgICAgICAgICAgICAgICBjbWRBbmRBcmdzLmFwcGVuZCgiXCIiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgcGFyYW1zLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgY21kQW5kQXJncy5hcHBlbmQoIiAiKTsKKyAgICAgICAgICAgICAgICBOYW1lVmFsdWVQYWlyIG52cCA9IChOYW1lVmFsdWVQYWlyKSBwYXJhbXMuZ2V0KGkpOyAKKyAgICAgICAgICAgICAgICBTdHJpbmcgayA9IG52cC5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIHYgPSBudnAuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgICAgICBpZiAoKGsuaW5kZXhPZigiPSIpIDwgMCkgJiYgKHYuaW5kZXhPZigiPSIpIDwgMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGFyZyA9IG5ldyBTdHJpbmdCdWZmZXIoayk7CisgICAgICAgICAgICAgICAgICAgIGFyZy5hcHBlbmQoIj0iKTsKKyAgICAgICAgICAgICAgICAgICAgYXJnLmFwcGVuZCh2KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFyZy50b1N0cmluZygpLmluZGV4T2YoIiAiKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNtZEFuZEFyZ3MuYXBwZW5kKGFyZyk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBTcGFjZXMgdXNlZCBhcyBkZWxpbWl0ZXIsIHNvIG5lZWQgdG8gdXNlIHF1b3RlcworICAgICAgICAgICAgICAgICAgICAgICAgY21kQW5kQXJncy5hcHBlbmQoIlwiIik7CisgICAgICAgICAgICAgICAgICAgICAgICBjbWRBbmRBcmdzLmFwcGVuZChhcmcpOworICAgICAgICAgICAgICAgICAgICAgICAgY21kQW5kQXJncy5hcHBlbmQoIlwiIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBjb21tYW5kID0gbmV3IFN0cmluZ0J1ZmZlcihjZ2lFeGVjdXRhYmxlKTsKKyAgICAgICAgICAgIGNvbW1hbmQuYXBwZW5kKCIgIik7CisgICAgICAgICAgICBjb21tYW5kLmFwcGVuZChjbWRBbmRBcmdzLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgY21kQW5kQXJncyA9IGNvbW1hbmQ7CisKKyAgICAgICAgICAgIFN0cmluZyBzQ29udGVudExlbmd0aCA9IChTdHJpbmcpIGVudi5nZXQoIkNPTlRFTlRfTEVOR1RIIik7CisgICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gY29udGVudFN0cmVhbSA9IG51bGw7CisgICAgICAgICAgICBpZighIiIuZXF1YWxzKHNDb250ZW50TGVuZ3RoKSkgeworICAgICAgICAgICAgICAgIGJ5dGVbXSBjb250ZW50ID0gbmV3IGJ5dGVbSW50ZWdlci5wYXJzZUludChzQ29udGVudExlbmd0aCldOworICAgICAgICAgICAgICAgIGludCBsZW5SZWFkID0gc3RkaW4ucmVhZChjb250ZW50KTsKKyAgICAgICAgICAgICAgICBjb250ZW50U3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgKKyAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIucGFyc2VJbnQoc0NvbnRlbnRMZW5ndGgpKTsKKyAgICAgICAgICAgICAgICBpZiAoIlBPU1QiLmVxdWFscyhlbnYuZ2V0KCJSRVFVRVNUX01FVEhPRCIpKSkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFyYW1TdHIgPSBnZXRQb3N0SW5wdXQocGFyYW1zKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtU3RyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBwYXJhbUJ5dGVzID0gcGFyYW1TdHIuZ2V0Qnl0ZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRTdHJlYW0ud3JpdGUocGFyYW1CeXRlcyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb250ZW50TGVuZ3RoID0gcGFyYW1CeXRlcy5sZW5ndGg7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGVuUmVhZCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGluZVNlcCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50U3RyZWFtLndyaXRlKGxpbmVTZXAuZ2V0Qnl0ZXMoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudExlbmd0aCA9IGxpbmVTZXAubGVuZ3RoKCkgKyBsZW5SZWFkOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZW52LnB1dCgiQ09OVEVOVF9MRU5HVEgiLCBuZXcgSW50ZWdlcihjb250ZW50TGVuZ3RoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuUmVhZCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGVudFN0cmVhbS53cml0ZShjb250ZW50LCAwLCBsZW5SZWFkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29udGVudFN0cmVhbS5jbG9zZSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBydCA9IFJ1bnRpbWUuZ2V0UnVudGltZSgpOworICAgICAgICAgICAgcHJvYyA9IHJ0LmV4ZWMoY21kQW5kQXJncy50b1N0cmluZygpLCBoYXNoVG9TdHJpbmdBcnJheShlbnYpLCB3ZCk7CisKKyAgICAgICAgICAgIGlmKGNvbnRlbnRTdHJlYW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNvbW1hbmRzU3RkSW4gPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0ocHJvYy5nZXRPdXRwdXRTdHJlYW0oKSk7CisgICAgICAgICAgICAgICAgcHJvYy5nZXRPdXRwdXRTdHJlYW0oKS53cml0ZShjb250ZW50U3RyZWFtLnRvQnl0ZUFycmF5KCkpOworICAgICAgICAgICAgICAgIGNvbW1hbmRzU3RkSW4uZmx1c2goKTsKKyAgICAgICAgICAgICAgICBjb21tYW5kc1N0ZEluLmNsb3NlKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIHdlIHdhbnQgdG8gd2FpdCBmb3IgdGhlIHByb2Nlc3MgdG8gZXhpdCwgIFByb2Nlc3Mud2FpdEZvcigpCisgICAgICAgICAgICAgKiBpcyB1c2VsZXNzIGluIG91ciBzaXR1YXRpb247IHNlZQorICAgICAgICAgICAgICogaHR0cDovL2RldmVsb3Blci5qYXZhLnN1bi5jb20vZGV2ZWxvcGVyLworICAgICAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVnUGFyYWRlL2J1Z3MvNDIyMzY1MC5odG1sCisgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgYm9vbGVhbiBpc1J1bm5pbmcgPSB0cnVlOworICAgICAgICAgICAgY29tbWFuZHNTdGRFcnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIKKyAgICAgICAgICAgICAgICAobmV3IElucHV0U3RyZWFtUmVhZGVyKHByb2MuZ2V0RXJyb3JTdHJlYW0oKSkpOworICAgICAgICAgICAgQnVmZmVyZWRXcml0ZXIgc2VydmxldENvbnRhaW5lclN0ZG91dCA9IG51bGw7CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmdldE91dHB1dFN0cmVhbSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgc2VydmxldENvbnRhaW5lclN0ZG91dCA9CisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZXNwb25zZS5nZXRPdXRwdXRTdHJlYW0oKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlnbm9yZWQpIHsKKyAgICAgICAgICAgICAgICAvL05PT1A6IG5vIG91dHB1dCB3aWxsIGJlIHdyaXR0ZW4KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsIEJ1ZmZlcmVkUmVhZGVyIHN0ZEVyclJkciA9IGNvbW1hbmRzU3RkRXJyIDsKKworICAgICAgICAgICAgbmV3IFRocmVhZCgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4gKCkgeworICAgICAgICAgICAgICAgICAgICBzZW5kVG9Mb2coc3RkRXJyUmRyKSA7CisgICAgICAgICAgICAgICAgfSA7CisgICAgICAgICAgICB9LnN0YXJ0KCkgOworCisgICAgICAgICAgICBJbnB1dFN0cmVhbSBjZ2lIZWFkZXJTdHJlYW0gPQorICAgICAgICAgICAgICAgIG5ldyBIVFRQSGVhZGVySW5wdXRTdHJlYW0ocHJvYy5nZXRJbnB1dFN0cmVhbSgpKTsKKyAgICAgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGNnaUhlYWRlclJlYWRlciA9CisgICAgICAgICAgICAgICAgbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihjZ2lIZWFkZXJTdHJlYW0pKTsKKyAgICAgICAgICAgIGJvb2xlYW4gaXNCaW5hcnlDb250ZW50ID0gZmFsc2U7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHdoaWxlIChpc1J1bm5pbmcpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAvL3NldCBoZWFkZXJzCisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsaW5lID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCgobGluZSA9IGNnaUhlYWRlclJlYWRlci5yZWFkTGluZSgpKSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgISgiIi5lcXVhbHMobGluZSkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVidWcgPj0gMikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZygicnVuQ0dJOiBhZGRIZWFkZXIoXCIiICsgbGluZSArICJcIikiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lLnN0YXJ0c1dpdGgoIkhUVFAiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vVE9ETzogc2hvdWxkIHNldCBzdGF0dXMgY29kZXMgKE5QSCBzdXBwb3J0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcmVzcG9uc2Uuc2V0U3RhdHVzKGdldFN0YXR1c0NvZGUobGluZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsaW5lLmluZGV4T2YoIjoiKSA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlYWRlciA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUuc3Vic3RyaW5nKDAsIGxpbmUuaW5kZXhPZigiOiIpKS50cmltKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZS5zdWJzdHJpbmcobGluZS5pbmRleE9mKCI6IikgKyAxKS50cmltKCk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmFkZEhlYWRlcihoZWFkZXIgLCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChoZWFkZXIudG9Mb3dlckNhc2UoKS5lcXVhbHMoImNvbnRlbnQtdHlwZSIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoIXZhbHVlLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgidGV4dCIpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0JpbmFyeUNvbnRlbnQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJydW5DR0k6IGJhZCBoZWFkZXIgbGluZSBcIiIgKyBsaW5lICsgIlwiIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvL3dyaXRlIG91dHB1dAorICAgICAgICAgICAgICAgICAgICBpZiAoaXNCaW5hcnlDb250ZW50KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gYkJ1ZiA9IG5ldyBieXRlWzIwNDhdOworICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG91dCA9IHJlc3BvbnNlLmdldE91dHB1dFN0cmVhbSgpOworICAgICAgICAgICAgICAgICAgICAgICAgY2dpT3V0cHV0ID0gcHJvYy5nZXRJbnB1dFN0cmVhbSgpOworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChidWZSZWFkID0gY2dpT3V0cHV0LnJlYWQoYkJ1ZikpICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlYnVnID49IDQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJydW5DR0k6IG91dHB1dCAiICsgYnVmUmVhZCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGJ5dGVzIG9mIGJpbmFyeSBkYXRhIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZShiQnVmLCAwLCBidWZSZWFkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRzU3RkT3V0ID0gbmV3IEJ1ZmZlcmVkUmVhZGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihwcm9jLmdldElucHV0U3RyZWFtKCkpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgY2hhcltdIGNCdWYgPSBuZXcgY2hhclsxMDI0XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgoYnVmUmVhZCA9IGNvbW1hbmRzU3RkT3V0LnJlYWQoY0J1ZikpICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZsZXRDb250YWluZXJTdGRvdXQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVidWcgPj0gNCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJydW5DR0k6IHdyaXRlKFwiIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZyhjQnVmLCAwLCBidWZSZWFkKSArICJcIikiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2bGV0Q29udGFpbmVyU3Rkb3V0LndyaXRlKGNCdWYsIDAsIGJ1ZlJlYWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXJ2bGV0Q29udGFpbmVyU3Rkb3V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2bGV0Q29udGFpbmVyU3Rkb3V0LmZsdXNoKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBwcm9jLmV4aXRWYWx1ZSgpOyAvLyBUaHJvd3MgZXhjZXB0aW9uIGlmIGFsaXZlCisKKyAgICAgICAgICAgICAgICAgICAgaXNSdW5uaW5nID0gZmFsc2U7CisKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsVGhyZWFkU3RhdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDUwMCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGlnbm9yZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gLy9yZXBsYWNlbWVudCBmb3IgUHJvY2Vzcy53YWl0Rm9yKCkKKyAgICAgICAgICAgIC8vIENsb3NlIHRoZSBvdXRwdXQgc3RyZWFtIHVzZWQKKyAgICAgICAgICAgIGlmIChpc0JpbmFyeUNvbnRlbnQpIHsKKyAgICAgICAgICAgICAgICBjZ2lPdXRwdXQuY2xvc2UoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY29tbWFuZHNTdGRPdXQuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBzZW5kVG9Mb2coQnVmZmVyZWRSZWFkZXIgcmRyKSB7CisgICAgICAgICAgICBTdHJpbmcgbGluZSA9IG51bGw7CisgICAgICAgICAgICBpbnQgbGluZUNvdW50ID0gMCA7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHdoaWxlICgobGluZSA9IHJkci5yZWFkTGluZSgpKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZygicnVuQ0dJIChzdGRlcnIpOiIgKyAgbGluZSkgOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsaW5lQ291bnQrKyA7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgbG9nKCJzZW5kVG9Mb2cgZXJyb3IiLCBlKSA7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHJkci5jbG9zZSgpIDsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBjZSkgeworICAgICAgICAgICAgICAgICAgICBsb2coInNlbmRUb0xvZyBlcnJvciIsIGNlKSA7CisgICAgICAgICAgICAgICAgfSA7CisgICAgICAgICAgICB9IDsKKyAgICAgICAgICAgIGlmICggbGluZUNvdW50ID4gMCAmJiBkZWJ1ZyA+IDIpIHsKKyAgICAgICAgICAgICAgICBsb2coInJ1bkNHSTogIiArIGxpbmVDb3VudCArICIgbGluZXMgcmVjZWl2ZWQgb24gc3RkZXJyIikgOworICAgICAgICAgICAgfSA7CisgICAgICAgIH0KKworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXRzIGEgc3RyaW5nIGZvciBpbnB1dCB0byBhIFBPU1QgY2dpIHNjcmlwdAorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gIHBhcmFtcyAgIEFycmF5TGlzdCBvZiBxdWVyeSBwYXJhbWV0ZXJzIHRvIGJlIHBhc3NlZCB0bworICAgICAgICAgKiAgICAgICAgICAgICAgICAgIHRoZSBDR0kgc2NyaXB0CisgICAgICAgICAqIEByZXR1cm4gICAgICAgICAgZm9yIHVzZSBhcyBpbnB1dCB0byB0aGUgQ0dJIHNjcmlwdAorICAgICAgICAgKi8KKworICAgICAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFBvc3RJbnB1dChBcnJheUxpc3QgcGFyYW1zKSB7CisgICAgICAgICAgICBTdHJpbmcgbGluZVNlcGFyYXRvciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBxcyA9IG5ldyBTdHJpbmdCdWZmZXIoIiIpOworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgcGFyYW1zLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgTmFtZVZhbHVlUGFpciBudnAgPSAoTmFtZVZhbHVlUGFpcikgdGhpcy5wYXJhbXMuZ2V0KGkpOyAKKyAgICAgICAgICAgICAgICBTdHJpbmcgayA9IG52cC5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIHYgPSBudnAuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgICAgICBpZiAoKGsuaW5kZXhPZigiPSIpIDwgMCkgJiYgKHYuaW5kZXhPZigiPSIpIDwgMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcXMuYXBwZW5kKGspOworICAgICAgICAgICAgICAgICAgICBxcy5hcHBlbmQoIj0iKTsKKyAgICAgICAgICAgICAgICAgICAgcXMuYXBwZW5kKHYpOworICAgICAgICAgICAgICAgICAgICBxcy5hcHBlbmQoIiYiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocXMubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIGxhc3QgIiYiCisgICAgICAgICAgICAgICAgcXMuc2V0TGVuZ3RoKHFzLmxlbmd0aCgpIC0gMSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHFzLnRvU3RyaW5nKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSAvL2NsYXNzIENHSVJ1bm5lcgorCisgICAgLyoqCisgICAgICogVGhpcyBpcyBhIHNpbXBsZSBjbGFzcyBmb3Igc3RvcmluZyBuYW1lLXZhbHVlIHBhaXJzLgorICAgICAqIAorICAgICAqIFRPRE86IEl0IG1pZ2h0IGJlIHdvcnRoIG1vdmluZyB0aGlzIHRvIHRoZSB1dGlscyBwYWNrYWdlIHRoZXJlIGlzIGEKKyAgICAgKiB3aWRlciByZXF1aXJlbWVudCBmb3IgdGhpcyBmdW5jdGlvbmFsaXR5LgorICAgICAqLworICAgIHByb3RlY3RlZCBjbGFzcyBOYW1lVmFsdWVQYWlyIHsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWU7CisgICAgICAgIAorICAgICAgICBOYW1lVmFsdWVQYWlyKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuYW1lOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbHVlKCkgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBpcyBhbiBpbnB1dCBzdHJlYW0gc3BlY2lmaWNhbGx5IGZvciByZWFkaW5nIEhUVFAgaGVhZGVycy4gSXQgcmVhZHMKKyAgICAgKiB1cHRvIGFuZCBpbmNsdWRpbmcgdGhlIHR3byBibGFuayBsaW5lcyB0ZXJtaW5hdGluZyB0aGUgaGVhZGVycy4gSXQKKyAgICAgKiBhbGxvd3MgdGhlIGNvbnRlbnQgdG8gYmUgcmVhZCB1c2luZyBieXRlcyBvciBjaGFyYWN0ZXJzIGFzIGFwcHJvcHJpYXRlLgorICAgICAqLworICAgIHByb3RlY3RlZCBjbGFzcyBIVFRQSGVhZGVySW5wdXRTdHJlYW0gZXh0ZW5kcyBJbnB1dFN0cmVhbSB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9DSEFSQUNURVIgPSAwOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfRklSU1RfQ1IgPSAxOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfRklSU1RfTEYgPSAyOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfU0VDT05EX0NSID0gMzsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0hFQURFUl9FTkQgPSA0OworICAgICAgICAKKyAgICAgICAgcHJpdmF0ZSBJbnB1dFN0cmVhbSBpbnB1dDsKKyAgICAgICAgcHJpdmF0ZSBpbnQgc3RhdGU7CisgICAgICAgIAorICAgICAgICBIVFRQSGVhZGVySW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gdGhlSW5wdXQpIHsKKyAgICAgICAgICAgIGlucHV0ID0gdGhlSW5wdXQ7CisgICAgICAgICAgICBzdGF0ZSA9IFNUQVRFX0NIQVJBQ1RFUjsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIGphdmEuaW8uSW5wdXRTdHJlYW0jcmVhZCgpCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgaWYgKHN0YXRlID09IFNUQVRFX0hFQURFUl9FTkQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludCBpID0gaW5wdXQucmVhZCgpOworCisgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIHN0YXRlCisgICAgICAgICAgICAvLyBTdGF0ZSBtYWNoaW5lIGxvb2tzIGxpa2UgdGhpcworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vICAgIC0tLS0tLS0tPi0tLS0tLS0tCisgICAgICAgICAgICAvLyAgIHwgICAgICAoQ1IpICAgICAgIHwKKyAgICAgICAgICAgIC8vICAgfCAgICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgLy8gIENSMS0tLT4tLS0gICAgICAgICB8CisgICAgICAgICAgICAvLyAgIHwgICAgICAgIHwgICAgICAgIHwKKyAgICAgICAgICAgIC8vICAgXihDUikgICAgfChMRikgICAgfAorICAgICAgICAgICAgLy8gICB8ICAgICAgICB8ICAgICAgICB8CisgICAgICAgICAgICAvLyBDSEFSLS0tPi0tTEYxLS0tPi0tRU9ICisgICAgICAgICAgICAvLyAgICAgIChMRikgIHwgIChMRikgIHwKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgfChDUikgICAgXihMRikKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgfCAgICAgICAgfAorICAgICAgICAgICAgLy8gICAgICAgICAgKENSMiktLT4tLS0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKGkgPT0gMTApIHsKKyAgICAgICAgICAgICAgICAvLyBMRgorICAgICAgICAgICAgICAgIHN3aXRjaChzdGF0ZSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX0NIQVJBQ1RFUjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gU1RBVEVfRklSU1RfTEY7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTVEFURV9GSVJTVF9DUjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gU1RBVEVfRklSU1RfTEY7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTVEFURV9GSVJTVF9MRjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTVEFURV9TRUNPTkRfQ1I6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IFNUQVRFX0hFQURFUl9FTkQ7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaSA9PSAxMykgeworICAgICAgICAgICAgICAgIC8vIENSCisgICAgICAgICAgICAgICAgc3dpdGNoKHN0YXRlKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVfQ0hBUkFDVEVSOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBTVEFURV9GSVJTVF9DUjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX0ZJUlNUX0NSOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBTVEFURV9IRUFERVJfRU5EOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVfRklSU1RfTEY6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IFNUQVRFX1NFQ09ORF9DUjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdGF0ZSA9IFNUQVRFX0NIQVJBQ1RFUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgcmV0dXJuIGk7ICAgICAgICAgICAgCisgICAgICAgIH0KKyAgICB9ICAvLyBjbGFzcyBIVFRQSGVhZGVySW5wdXRTdHJlYW0KKworfSAvL2NsYXNzIENHSVNlcnZsZXQKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zZXJ2bGV0cy9Db25zdGFudHMuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zZXJ2bGV0cy9Db25zdGFudHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTA5ZjlmCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NlcnZsZXRzL0NvbnN0YW50cy5qYXZhCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc2VydmxldHM7CisKKworcHVibGljIGNsYXNzIENvbnN0YW50cyB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQYWNrYWdlID0gIm9yZy5hcGFjaGUuY2F0YWxpbmEuc2VydmxldHMiOworCit9CisKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zZXJ2bGV0cy9EZWZhdWx0U2VydmxldC5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NlcnZsZXRzL0RlZmF1bHRTZXJ2bGV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQxZDliMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zZXJ2bGV0cy9EZWZhdWx0U2VydmxldC5qYXZhCkBAIC0wLDAgKzEsMjA4NyBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5zZXJ2bGV0czsKKworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5SYW5kb21BY2Nlc3NGaWxlOworaW1wb3J0IGphdmEuaW8uUmVhZGVyOworaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOworaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKK2ltcG9ydCBqYXZheC5uYW1pbmcuSW5pdGlhbENvbnRleHQ7CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWVDbGFzc1BhaXI7CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWluZ0VudW1lcmF0aW9uOworaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1pbmdFeGNlcHRpb247CitpbXBvcnQgamF2YXgubmFtaW5nLmRpcmVjdG9yeS5EaXJDb250ZXh0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YXguc2VydmxldC5VbmF2YWlsYWJsZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXQ7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5OworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1Tb3VyY2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkdsb2JhbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLlNlcnZlckluZm87CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLlN0cmluZ01hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLlVSTEVuY29kZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5uYW1pbmcucmVzb3VyY2VzLkNhY2hlRW50cnk7CitpbXBvcnQgb3JnLmFwYWNoZS5uYW1pbmcucmVzb3VyY2VzLlByb3h5RGlyQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLm5hbWluZy5yZXNvdXJjZXMuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5uYW1pbmcucmVzb3VyY2VzLlJlc291cmNlQXR0cmlidXRlczsKKworCisvKioKKyAqIFRoZSBkZWZhdWx0IHJlc291cmNlLXNlcnZpbmcgc2VydmxldCBmb3IgbW9zdCB3ZWIgYXBwbGljYXRpb25zLAorICogdXNlZCB0byBzZXJ2ZSBzdGF0aWMgcmVzb3VyY2VzIHN1Y2ggYXMgSFRNTCBwYWdlcyBhbmQgaW1hZ2VzLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQGF1dGhvciBSZW15IE1hdWNoZXJhdAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgRGVmYXVsdFNlcnZsZXQKKyAgICBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBkZWJ1Z2dpbmcgZGV0YWlsIGxldmVsIGZvciB0aGlzIHNlcnZsZXQuCisgICAgICovCisgICAgcHJvdGVjdGVkIGludCBkZWJ1ZyA9IDA7CisKKworICAgIC8qKgorICAgICAqIFRoZSBpbnB1dCBidWZmZXIgc2l6ZSB0byB1c2Ugd2hlbiBzZXJ2aW5nIHJlc291cmNlcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IGlucHV0ID0gMjA0ODsKKworCisgICAgLyoqCisgICAgICogU2hvdWxkIHdlIGdlbmVyYXRlIGRpcmVjdG9yeSBsaXN0aW5ncz8KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBsaXN0aW5ncyA9IHRydWU7CisKKworICAgIC8qKgorICAgICAqIFJlYWQgb25seSBmbGFnLiBCeSBkZWZhdWx0LCBpdCdzIHNldCB0byB0cnVlLgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIHJlYWRPbmx5ID0gdHJ1ZTsKKworCisgICAgLyoqCisgICAgICogVGhlIG91dHB1dCBidWZmZXIgc2l6ZSB0byB1c2Ugd2hlbiBzZXJ2aW5nIHJlc291cmNlcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IG91dHB1dCA9IDIwNDg7CisKKworICAgIC8qKgorICAgICAqIEFycmF5IGNvbnRhaW5pbmcgdGhlIHNhZmUgY2hhcmFjdGVycyBzZXQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBVUkxFbmNvZGVyIHVybEVuY29kZXI7CisKKworICAgIC8qKgorICAgICAqIEFsbG93IGN1c3RvbWl6ZWQgZGlyZWN0b3J5IGxpc3RpbmcgcGVyIGRpcmVjdG9yeS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nICBsb2NhbFhzbHRGaWxlID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogQWxsb3cgY3VzdG9taXplZCBkaXJlY3RvcnkgbGlzdGluZyBwZXIgaW5zdGFuY2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyAgZ2xvYmFsWHNsdEZpbGUgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBBbGxvdyBhIHJlYWRtZSBmaWxlIHRvIGJlIGluY2x1ZGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgcmVhZG1lRmlsZSA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFByb3h5IGRpcmVjdG9yeSBjb250ZXh0LgorICAgICAqLworICAgIHByb3RlY3RlZCBQcm94eURpckNvbnRleHQgcmVzb3VyY2VzID0gbnVsbDsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU3RhdGljIEluaXRpYWxpemVyCisKKworICAgIC8qKgorICAgICAqIEdNVCB0aW1lem9uZSAtIGFsbCBIVFRQIGRhdGVzIGFyZSBvbiBHTVQKKyAgICAgKi8KKyAgICBzdGF0aWMgeworICAgICAgICB1cmxFbmNvZGVyID0gbmV3IFVSTEVuY29kZXIoKTsKKyAgICAgICAgdXJsRW5jb2Rlci5hZGRTYWZlQ2hhcmFjdGVyKCctJyk7CisgICAgICAgIHVybEVuY29kZXIuYWRkU2FmZUNoYXJhY3RlcignXycpOworICAgICAgICB1cmxFbmNvZGVyLmFkZFNhZmVDaGFyYWN0ZXIoJy4nKTsKKyAgICAgICAgdXJsRW5jb2Rlci5hZGRTYWZlQ2hhcmFjdGVyKCcqJyk7CisgICAgICAgIHVybEVuY29kZXIuYWRkU2FmZUNoYXJhY3RlcignLycpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogTUlNRSBtdWx0aXBhcnQgc2VwYXJhdGlvbiBzdHJpbmcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBtaW1lU2VwYXJhdGlvbiA9ICJDQVRBTElOQV9NSU1FX0JPVU5EQVJZIjsKKworCisgICAgLyoqCisgICAgICogSk5ESSByZXNvdXJjZXMgbmFtZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPVVJDRVNfSk5ESV9OQU1FID0gImphdmE6L2NvbXAvUmVzb3VyY2VzIjsKKworCisgICAgLyoqCisgICAgICogVGhlIHN0cmluZyBtYW5hZ2VyIGZvciB0aGlzIHBhY2thZ2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmdNYW5hZ2VyIHNtID0KKyAgICAgICAgU3RyaW5nTWFuYWdlci5nZXRNYW5hZ2VyKENvbnN0YW50cy5QYWNrYWdlKTsKKworCisgICAgLyoqCisgICAgICogU2l6ZSBvZiBmaWxlIHRyYW5zZmVyIGJ1ZmZlciBpbiBieXRlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQlVGRkVSX1NJWkUgPSA0MDk2OworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogRmluYWxpemUgdGhpcyBzZXJ2bGV0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3koKSB7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIHRoaXMgc2VydmxldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbml0KCkgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIFNldCBvdXIgcHJvcGVydGllcyBmcm9tIHRoZSBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzCisgICAgICAgIFN0cmluZyB2YWx1ZSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB2YWx1ZSA9IGdldFNlcnZsZXRDb25maWcoKS5nZXRJbml0UGFyYW1ldGVyKCJkZWJ1ZyIpOworICAgICAgICAgICAgZGVidWcgPSBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIDsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgdmFsdWUgPSBnZXRTZXJ2bGV0Q29uZmlnKCkuZ2V0SW5pdFBhcmFtZXRlcigiaW5wdXQiKTsKKyAgICAgICAgICAgIGlucHV0ID0gSW50ZWdlci5wYXJzZUludCh2YWx1ZSk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICA7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHZhbHVlID0gZ2V0U2VydmxldENvbmZpZygpLmdldEluaXRQYXJhbWV0ZXIoImxpc3RpbmdzIik7CisgICAgICAgICAgICBsaXN0aW5ncyA9IChuZXcgQm9vbGVhbih2YWx1ZSkpLmJvb2xlYW5WYWx1ZSgpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB2YWx1ZSA9IGdldFNlcnZsZXRDb25maWcoKS5nZXRJbml0UGFyYW1ldGVyKCJyZWFkb25seSIpOworICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVhZE9ubHkgPSAobmV3IEJvb2xlYW4odmFsdWUpKS5ib29sZWFuVmFsdWUoKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIDsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgdmFsdWUgPSBnZXRTZXJ2bGV0Q29uZmlnKCkuZ2V0SW5pdFBhcmFtZXRlcigib3V0cHV0Iik7CisgICAgICAgICAgICBvdXRwdXQgPSBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIDsKKyAgICAgICAgfQorCisgICAgICAgIGdsb2JhbFhzbHRGaWxlID0gZ2V0U2VydmxldENvbmZpZygpLmdldEluaXRQYXJhbWV0ZXIoImdsb2JhbFhzbHRGaWxlIik7CisgICAgICAgIGxvY2FsWHNsdEZpbGUgPSBnZXRTZXJ2bGV0Q29uZmlnKCkuZ2V0SW5pdFBhcmFtZXRlcigibG9jYWxYc2x0RmlsZSIpOworICAgICAgICByZWFkbWVGaWxlID0gZ2V0U2VydmxldENvbmZpZygpLmdldEluaXRQYXJhbWV0ZXIoInJlYWRtZUZpbGUiKTsKKworICAgICAgICAvLyBTYW5pdHkgY2hlY2sgb24gdGhlIHNwZWNpZmllZCBidWZmZXIgc2l6ZXMKKyAgICAgICAgaWYgKGlucHV0IDwgMjU2KQorICAgICAgICAgICAgaW5wdXQgPSAyNTY7CisgICAgICAgIGlmIChvdXRwdXQgPCAyNTYpCisgICAgICAgICAgICBvdXRwdXQgPSAyNTY7CisKKyAgICAgICAgaWYgKGRlYnVnID4gMCkgeworICAgICAgICAgICAgbG9nKCJEZWZhdWx0U2VydmxldC5pbml0OiAgaW5wdXQgYnVmZmVyIHNpemU9IiArIGlucHV0ICsKKyAgICAgICAgICAgICAgICAiLCBvdXRwdXQgYnVmZmVyIHNpemU9IiArIG91dHB1dCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBMb2FkIHRoZSBwcm94eSBkaXIgY29udGV4dC4KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlc291cmNlcyA9IChQcm94eURpckNvbnRleHQpIGdldFNlcnZsZXRDb250ZXh0KCkKKyAgICAgICAgICAgICAgICAuZ2V0QXR0cmlidXRlKEdsb2JhbHMuUkVTT1VSQ0VTX0FUVFIpOworICAgICAgICB9IGNhdGNoKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBGYWlsZWQgOiBOb3QgdGhlIHJpZ2h0IHR5cGUKKyAgICAgICAgfQorICAgICAgICBpZiAocmVzb3VyY2VzID09IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmVzb3VyY2VzID0KKyAgICAgICAgICAgICAgICAgICAgKFByb3h5RGlyQ29udGV4dCkgbmV3IEluaXRpYWxDb250ZXh0KCkKKyAgICAgICAgICAgICAgICAgICAgLmxvb2t1cChSRVNPVVJDRVNfSk5ESV9OQU1FKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gRmFpbGVkCisgICAgICAgICAgICB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIEZhaWxlZCA6IE5vdCB0aGUgcmlnaHQgdHlwZQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHJlc291cmNlcyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5hdmFpbGFibGVFeGNlcHRpb24oIk5vIHJlc291cmNlcyIpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm90ZWN0ZWQgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHJlbGF0aXZlIHBhdGggYXNzb2NpYXRlZCB3aXRoIHRoaXMgc2VydmxldC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFJlbGF0aXZlUGF0aChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworCisgICAgICAgIC8vIEFyZSB3ZSBiZWluZyBwcm9jZXNzZWQgYnkgYSBSZXF1ZXN0RGlzcGF0Y2hlci5pbmNsdWRlKCk/CisgICAgICAgIGlmIChyZXF1ZXN0LmdldEF0dHJpYnV0ZSgiamF2YXguc2VydmxldC5pbmNsdWRlLnJlcXVlc3RfdXJpIikhPW51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZyByZXN1bHQgPSAoU3RyaW5nKQorICAgICAgICAgICAgICAgIHJlcXVlc3QuZ2V0QXR0cmlidXRlKCJqYXZheC5zZXJ2bGV0LmluY2x1ZGUucGF0aF9pbmZvIik7CisgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKFN0cmluZykKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5nZXRBdHRyaWJ1dGUoImphdmF4LnNlcnZsZXQuaW5jbHVkZS5zZXJ2bGV0X3BhdGgiKTsKKyAgICAgICAgICAgIGlmICgocmVzdWx0ID09IG51bGwpIHx8IChyZXN1bHQuZXF1YWxzKCIiKSkpCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gIi8iOworICAgICAgICAgICAgcmV0dXJuIChyZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgLy8gTm8sIGV4dHJhY3QgdGhlIGRlc2lyZWQgcGF0aCBkaXJlY3RseSBmcm9tIHRoZSByZXF1ZXN0CisgICAgICAgIFN0cmluZyByZXN1bHQgPSByZXF1ZXN0LmdldFBhdGhJbmZvKCk7CisgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgeworICAgICAgICAgICAgcmVzdWx0ID0gcmVxdWVzdC5nZXRTZXJ2bGV0UGF0aCgpOworICAgICAgICB9CisgICAgICAgIGlmICgocmVzdWx0ID09IG51bGwpIHx8IChyZXN1bHQuZXF1YWxzKCIiKSkpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9ICIvIjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKHJlc3VsdCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgYSBHRVQgcmVxdWVzdCBmb3IgdGhlIHNwZWNpZmllZCByZXNvdXJjZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIHNlcnZsZXQgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0LXNwZWNpZmllZCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIFNlcnZlIHRoZSByZXF1ZXN0ZWQgcmVzb3VyY2UsIGluY2x1ZGluZyB0aGUgZGF0YSBjb250ZW50CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzZXJ2ZVJlc291cmNlKHJlcXVlc3QsIHJlc3BvbnNlLCB0cnVlKTsKKyAgICAgICAgfSBjYXRjaCggSU9FeGNlcHRpb24gZXggKSB7CisgICAgICAgICAgICAvLyB3ZSBwcm9iYWJseSBoYXZlIHRoaXMgY2hlY2sgc29tZXdoZXJlIGVsc2UgdG9vLgorICAgICAgICAgICAgaWYoIGV4LmdldE1lc3NhZ2UoKSAhPSBudWxsCisgICAgICAgICAgICAgICAgJiYgZXguZ2V0TWVzc2FnZSgpLmluZGV4T2YoIkJyb2tlbiBwaXBlIikgPj0gMCApIHsKKyAgICAgICAgICAgICAgICAvLyBpZ25vcmUgaXQuCisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBleDsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIGEgSEVBRCByZXF1ZXN0IGZvciB0aGUgc3BlY2lmaWVkIHJlc291cmNlLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgc2VydmxldCByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQtc3BlY2lmaWVkIGVycm9yIG9jY3VycworICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGRvSGVhZChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICAvLyBTZXJ2ZSB0aGUgcmVxdWVzdGVkIHJlc291cmNlLCB3aXRob3V0IHRoZSBkYXRhIGNvbnRlbnQKKyAgICAgICAgc2VydmVSZXNvdXJjZShyZXF1ZXN0LCByZXNwb25zZSwgZmFsc2UpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIGEgUE9TVCByZXF1ZXN0IGZvciB0aGUgc3BlY2lmaWVkIHJlc291cmNlLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgc2VydmxldCByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQtc3BlY2lmaWVkIGVycm9yIG9jY3VycworICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGRvUG9zdChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKyAgICAgICAgZG9HZXQocmVxdWVzdCwgcmVzcG9uc2UpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUHJvY2VzcyBhIFBPU1QgcmVxdWVzdCBmb3IgdGhlIHNwZWNpZmllZCByZXNvdXJjZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXEgVGhlIHNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwIFRoZSBzZXJ2bGV0IHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldC1zcGVjaWZpZWQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZG9QdXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwKQorICAgICAgICB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCisgICAgICAgIGlmIChyZWFkT25seSkgeworICAgICAgICAgICAgcmVzcC5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19GT1JCSURERU4pOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIHBhdGggPSBnZXRSZWxhdGl2ZVBhdGgocmVxKTsKKworICAgICAgICBib29sZWFuIGV4aXN0cyA9IHRydWU7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXNvdXJjZXMubG9va3VwKHBhdGgpOworICAgICAgICB9IGNhdGNoIChOYW1pbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZXhpc3RzID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBib29sZWFuIHJlc3VsdCA9IHRydWU7CisKKyAgICAgICAgLy8gVGVtcC4gY29udGVudCBmaWxlIHVzZWQgdG8gc3VwcG9ydCBwYXJ0aWFsIFBVVAorICAgICAgICBGaWxlIGNvbnRlbnRGaWxlID0gbnVsbDsKKworICAgICAgICAvLyBJbnB1dCBzdHJlYW0gZm9yIHRlbXAuIGNvbnRlbnQgZmlsZSB1c2VkIHRvIHN1cHBvcnQgcGFydGlhbCBQVVQKKyAgICAgICAgRmlsZUlucHV0U3RyZWFtIGNvbnRlbnRGaWxlSW5TdHJlYW0gPSBudWxsOworCisgICAgICAgIFJhbmdlIHJhbmdlID0gcGFyc2VDb250ZW50UmFuZ2UocmVxLCByZXNwKTsKKworICAgICAgICBJbnB1dFN0cmVhbSByZXNvdXJjZUlucHV0U3RyZWFtID0gbnVsbDsKKworICAgICAgICAvLyBBcHBlbmQgZGF0YSBzcGVjaWZpZWQgaW4gcmFuZ2VzIHRvIGV4aXN0aW5nIGNvbnRlbnQgZm9yIHRoaXMKKyAgICAgICAgLy8gcmVzb3VyY2UgLSBjcmVhdGUgYSB0ZW1wLiBmaWxlIG9uIHRoZSBsb2NhbCBmaWxlc3lzdGVtIHRvCisgICAgICAgIC8vIHBlcmZvcm0gdGhpcyBvcGVyYXRpb24KKyAgICAgICAgLy8gQXNzdW1lIGp1c3Qgb25lIHJhbmdlIGlzIHNwZWNpZmllZCBmb3Igbm93CisgICAgICAgIGlmIChyYW5nZSAhPSBudWxsKSB7CisgICAgICAgICAgICBjb250ZW50RmlsZSA9IGV4ZWN1dGVQYXJ0aWFsUHV0KHJlcSwgcmFuZ2UsIHBhdGgpOworICAgICAgICAgICAgcmVzb3VyY2VJbnB1dFN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oY29udGVudEZpbGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzb3VyY2VJbnB1dFN0cmVhbSA9IHJlcS5nZXRJbnB1dFN0cmVhbSgpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFJlc291cmNlIG5ld1Jlc291cmNlID0gbmV3IFJlc291cmNlKHJlc291cmNlSW5wdXRTdHJlYW0pOworICAgICAgICAgICAgLy8gRklYTUU6IEFkZCBhdHRyaWJ1dGVzCisgICAgICAgICAgICBpZiAoZXhpc3RzKSB7CisgICAgICAgICAgICAgICAgcmVzb3VyY2VzLnJlYmluZChwYXRoLCBuZXdSZXNvdXJjZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlc291cmNlcy5iaW5kKHBhdGgsIG5ld1Jlc291cmNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaChOYW1pbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVzdWx0KSB7CisgICAgICAgICAgICBpZiAoZXhpc3RzKSB7CisgICAgICAgICAgICAgICAgcmVzcC5zZXRTdGF0dXMoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19OT19DT05URU5UKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmVzcC5zZXRTdGF0dXMoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19DUkVBVEVEKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlc3Auc2VuZEVycm9yKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfQ09ORkxJQ1QpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEhhbmRsZSBhIHBhcnRpYWwgUFVULiAgTmV3IGNvbnRlbnQgc3BlY2lmaWVkIGluIHJlcXVlc3QgaXMgYXBwZW5kZWQgdG8KKyAgICAgKiBleGlzdGluZyBjb250ZW50IGluIG9sZFJldmlzaW9uQ29udGVudCAoaWYgcHJlc2VudCkuIFRoaXMgY29kZSBkb2VzCisgICAgICogbm90IHN1cHBvcnQgc2ltdWx0YW5lb3VzIHBhcnRpYWwgdXBkYXRlcyB0byB0aGUgc2FtZSByZXNvdXJjZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRmlsZSBleGVjdXRlUGFydGlhbFB1dChIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBSYW5nZSByYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGF0aCkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBBcHBlbmQgZGF0YSBzcGVjaWZpZWQgaW4gcmFuZ2VzIHRvIGV4aXN0aW5nIGNvbnRlbnQgZm9yIHRoaXMKKyAgICAgICAgLy8gcmVzb3VyY2UgLSBjcmVhdGUgYSB0ZW1wLiBmaWxlIG9uIHRoZSBsb2NhbCBmaWxlc3lzdGVtIHRvCisgICAgICAgIC8vIHBlcmZvcm0gdGhpcyBvcGVyYXRpb24KKyAgICAgICAgRmlsZSB0ZW1wRGlyID0gKEZpbGUpIGdldFNlcnZsZXRDb250ZXh0KCkuZ2V0QXR0cmlidXRlCisgICAgICAgICAgICAoImphdmF4LnNlcnZsZXQuY29udGV4dC50ZW1wZGlyIik7CisgICAgICAgIC8vIENvbnZlcnQgYWxsICcvJyBjaGFyYWN0ZXJzIHRvICcuJyBpbiByZXNvdXJjZVBhdGgKKyAgICAgICAgU3RyaW5nIGNvbnZlcnRlZFJlc291cmNlUGF0aCA9IHBhdGgucmVwbGFjZSgnLycsICcuJyk7CisgICAgICAgIEZpbGUgY29udGVudEZpbGUgPSBuZXcgRmlsZSh0ZW1wRGlyLCBjb252ZXJ0ZWRSZXNvdXJjZVBhdGgpOworICAgICAgICBpZiAoY29udGVudEZpbGUuY3JlYXRlTmV3RmlsZSgpKSB7CisgICAgICAgICAgICAvLyBDbGVhbiB1cCBjb250ZW50RmlsZSB3aGVuIFRvbWNhdCBpcyB0ZXJtaW5hdGVkCisgICAgICAgICAgICBjb250ZW50RmlsZS5kZWxldGVPbkV4aXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIFJhbmRvbUFjY2Vzc0ZpbGUgcmFuZEFjY2Vzc0NvbnRlbnRGaWxlID0KKyAgICAgICAgICAgIG5ldyBSYW5kb21BY2Nlc3NGaWxlKGNvbnRlbnRGaWxlLCAicnciKTsKKworICAgICAgICBSZXNvdXJjZSBvbGRSZXNvdXJjZSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBPYmplY3Qgb2JqID0gcmVzb3VyY2VzLmxvb2t1cChwYXRoKTsKKyAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBSZXNvdXJjZSkKKyAgICAgICAgICAgICAgICBvbGRSZXNvdXJjZSA9IChSZXNvdXJjZSkgb2JqOworICAgICAgICB9IGNhdGNoIChOYW1pbmdFeGNlcHRpb24gZSkgeworICAgICAgICB9CisKKyAgICAgICAgLy8gQ29weSBkYXRhIGluIG9sZFJldmlzaW9uQ29udGVudCB0byBjb250ZW50RmlsZQorICAgICAgICBpZiAob2xkUmVzb3VyY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgQnVmZmVyZWRJbnB1dFN0cmVhbSBidWZPbGRSZXZTdHJlYW0gPQorICAgICAgICAgICAgICAgIG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG9sZFJlc291cmNlLnN0cmVhbUNvbnRlbnQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVUZGRVJfU0laRSk7CisKKyAgICAgICAgICAgIGludCBudW1CeXRlc1JlYWQ7CisgICAgICAgICAgICBieXRlW10gY29weUJ1ZmZlciA9IG5ldyBieXRlW0JVRkZFUl9TSVpFXTsKKyAgICAgICAgICAgIHdoaWxlICgobnVtQnl0ZXNSZWFkID0gYnVmT2xkUmV2U3RyZWFtLnJlYWQoY29weUJ1ZmZlcikpICE9IC0xKSB7CisgICAgICAgICAgICAgICAgcmFuZEFjY2Vzc0NvbnRlbnRGaWxlLndyaXRlKGNvcHlCdWZmZXIsIDAsIG51bUJ5dGVzUmVhZCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJ1Zk9sZFJldlN0cmVhbS5jbG9zZSgpOworICAgICAgICB9CisKKyAgICAgICAgcmFuZEFjY2Vzc0NvbnRlbnRGaWxlLnNldExlbmd0aChyYW5nZS5sZW5ndGgpOworCisgICAgICAgIC8vIEFwcGVuZCBkYXRhIGluIHJlcXVlc3QgaW5wdXQgc3RyZWFtIHRvIGNvbnRlbnRGaWxlCisgICAgICAgIHJhbmRBY2Nlc3NDb250ZW50RmlsZS5zZWVrKHJhbmdlLnN0YXJ0KTsKKyAgICAgICAgaW50IG51bUJ5dGVzUmVhZDsKKyAgICAgICAgYnl0ZVtdIHRyYW5zZmVyQnVmZmVyID0gbmV3IGJ5dGVbQlVGRkVSX1NJWkVdOworICAgICAgICBCdWZmZXJlZElucHV0U3RyZWFtIHJlcXVlc3RCdWZJblN0cmVhbSA9CisgICAgICAgICAgICBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShyZXEuZ2V0SW5wdXRTdHJlYW0oKSwgQlVGRkVSX1NJWkUpOworICAgICAgICB3aGlsZSAoKG51bUJ5dGVzUmVhZCA9IHJlcXVlc3RCdWZJblN0cmVhbS5yZWFkKHRyYW5zZmVyQnVmZmVyKSkgIT0gLTEpIHsKKyAgICAgICAgICAgIHJhbmRBY2Nlc3NDb250ZW50RmlsZS53cml0ZSh0cmFuc2ZlckJ1ZmZlciwgMCwgbnVtQnl0ZXNSZWFkKTsKKyAgICAgICAgfQorICAgICAgICByYW5kQWNjZXNzQ29udGVudEZpbGUuY2xvc2UoKTsKKyAgICAgICAgcmVxdWVzdEJ1ZkluU3RyZWFtLmNsb3NlKCk7CisKKyAgICAgICAgcmV0dXJuIGNvbnRlbnRGaWxlOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIGEgUE9TVCByZXF1ZXN0IGZvciB0aGUgc3BlY2lmaWVkIHJlc291cmNlLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcSBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3AgVGhlIHNlcnZsZXQgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0LXNwZWNpZmllZCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBkb0RlbGV0ZShIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3ApCisgICAgICAgIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKHJlYWRPbmx5KSB7CisgICAgICAgICAgICByZXNwLnNlbmRFcnJvcihIdHRwU2VydmxldFJlc3BvbnNlLlNDX0ZPUkJJRERFTik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgcGF0aCA9IGdldFJlbGF0aXZlUGF0aChyZXEpOworCisgICAgICAgIGJvb2xlYW4gZXhpc3RzID0gdHJ1ZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlc291cmNlcy5sb29rdXAocGF0aCk7CisgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBleGlzdHMgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChleGlzdHMpIHsKKyAgICAgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmVzb3VyY2VzLnVuYmluZChwYXRoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocmVzdWx0KSB7CisgICAgICAgICAgICAgICAgcmVzcC5zZXRTdGF0dXMoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19OT19DT05URU5UKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmVzcC5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19NRVRIT0RfTk9UX0FMTE9XRUQpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzcC5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19OT1RfRk9VTkQpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENoZWNrIGlmIHRoZSBjb25kaXRpb25zIHNwZWNpZmllZCBpbiB0aGUgb3B0aW9uYWwgSWYgaGVhZGVycyBhcmUKKyAgICAgKiBzYXRpc2ZpZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBzZXJ2bGV0IHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqIEBwYXJhbSByZXNvdXJjZUF0dHJpYnV0ZXMgVGhlIHJlc291cmNlIGluZm9ybWF0aW9uCisgICAgICogQHJldHVybiBib29sZWFuIHRydWUgaWYgdGhlIHJlc291cmNlIG1lZXRzIGFsbCB0aGUgc3BlY2lmaWVkIGNvbmRpdGlvbnMsCisgICAgICogYW5kIGZhbHNlIGlmIGFueSBvZiB0aGUgY29uZGl0aW9ucyBpcyBub3Qgc2F0aXNmaWVkLCBpbiB3aGljaCBjYXNlCisgICAgICogcmVxdWVzdCBwcm9jZXNzaW5nIGlzIHN0b3BwZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjaGVja0lmSGVhZGVycyhIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlQXR0cmlidXRlcyByZXNvdXJjZUF0dHJpYnV0ZXMpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgcmV0dXJuIGNoZWNrSWZNYXRjaChyZXF1ZXN0LCByZXNwb25zZSwgcmVzb3VyY2VBdHRyaWJ1dGVzKQorICAgICAgICAgICAgJiYgY2hlY2tJZk1vZGlmaWVkU2luY2UocmVxdWVzdCwgcmVzcG9uc2UsIHJlc291cmNlQXR0cmlidXRlcykKKyAgICAgICAgICAgICYmIGNoZWNrSWZOb25lTWF0Y2gocmVxdWVzdCwgcmVzcG9uc2UsIHJlc291cmNlQXR0cmlidXRlcykKKyAgICAgICAgICAgICYmIGNoZWNrSWZVbm1vZGlmaWVkU2luY2UocmVxdWVzdCwgcmVzcG9uc2UsIHJlc291cmNlQXR0cmlidXRlcyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgRVRhZyBhc3NvY2lhdGVkIHdpdGggYSBmaWxlLgorICAgICAqCisgICAgICogQHBhcmFtIHJlc291cmNlQXR0cmlidXRlcyBUaGUgcmVzb3VyY2UgaW5mb3JtYXRpb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEVUYWcoUmVzb3VyY2VBdHRyaWJ1dGVzIHJlc291cmNlQXR0cmlidXRlcykgeworICAgICAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKKyAgICAgICAgaWYgKChyZXN1bHQgPSByZXNvdXJjZUF0dHJpYnV0ZXMuZ2V0RVRhZyh0cnVlKSkgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfSBlbHNlIGlmICgocmVzdWx0ID0gcmVzb3VyY2VBdHRyaWJ1dGVzLmdldEVUYWcoKSkgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAiVy9cIiIgKyByZXNvdXJjZUF0dHJpYnV0ZXMuZ2V0Q29udGVudExlbmd0aCgpICsgIi0iCisgICAgICAgICAgICAgICAgKyByZXNvdXJjZUF0dHJpYnV0ZXMuZ2V0TGFzdE1vZGlmaWVkKCkgKyAiXCIiOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBVUkwgcmV3cml0ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0aCBQYXRoIHdoaWNoIGhhcyB0byBiZSByZXdpdGVuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyByZXdyaXRlVXJsKFN0cmluZyBwYXRoKSB7CisgICAgICAgIHJldHVybiB1cmxFbmNvZGVyLmVuY29kZSggcGF0aCApOworICAgIH0KKworCisgICAgLyoqCisgICAgICogRGlzcGxheSB0aGUgc2l6ZSBvZiBhIGZpbGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZGlzcGxheVNpemUoU3RyaW5nQnVmZmVyIGJ1ZiwgaW50IGZpbGVzaXplKSB7CisKKyAgICAgICAgaW50IGxlZnRzaWRlID0gZmlsZXNpemUgLyAxMDI0OworICAgICAgICBpbnQgcmlnaHRzaWRlID0gKGZpbGVzaXplICUgMTAyNCkgLyAxMDM7ICAvLyBtYWtlcyAxIGRpZ2l0CisgICAgICAgIC8vIFRvIGF2b2lkIDAuMCBmb3Igbm9uLXplcm8gZmlsZSwgd2UgYnVtcCB0byAwLjEKKyAgICAgICAgaWYgKGxlZnRzaWRlID09IDAgJiYgcmlnaHRzaWRlID09IDAgJiYgZmlsZXNpemUgIT0gMCkKKyAgICAgICAgICAgIHJpZ2h0c2lkZSA9IDE7CisgICAgICAgIGJ1Zi5hcHBlbmQobGVmdHNpZGUpLmFwcGVuZCgiLiIpLmFwcGVuZChyaWdodHNpZGUpOworICAgICAgICBidWYuYXBwZW5kKCIgS0IiKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2VydmUgdGhlIHNwZWNpZmllZCByZXNvdXJjZSwgb3B0aW9uYWxseSBpbmNsdWRpbmcgdGhlIGRhdGEgY29udGVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIHNlcnZsZXQgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICogQHBhcmFtIGNvbnRlbnQgU2hvdWxkIHRoZSBjb250ZW50IGJlIGluY2x1ZGVkPworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldC1zcGVjaWZpZWQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2VydmVSZXNvdXJjZShIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGNvbnRlbnQpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gSWRlbnRpZnkgdGhlIHJlcXVlc3RlZCByZXNvdXJjZSBwYXRoCisgICAgICAgIFN0cmluZyBwYXRoID0gZ2V0UmVsYXRpdmVQYXRoKHJlcXVlc3QpOworICAgICAgICBpZiAoZGVidWcgPiAwKSB7CisgICAgICAgICAgICBpZiAoY29udGVudCkKKyAgICAgICAgICAgICAgICBsb2coIkRlZmF1bHRTZXJ2bGV0LnNlcnZlUmVzb3VyY2U6ICBTZXJ2aW5nIHJlc291cmNlICciICsKKyAgICAgICAgICAgICAgICAgICAgcGF0aCArICInIGhlYWRlcnMgYW5kIGRhdGEiKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBsb2coIkRlZmF1bHRTZXJ2bGV0LnNlcnZlUmVzb3VyY2U6ICBTZXJ2aW5nIHJlc291cmNlICciICsKKyAgICAgICAgICAgICAgICAgICAgcGF0aCArICInIGhlYWRlcnMgb25seSIpOworICAgICAgICB9CisKKyAgICAgICAgQ2FjaGVFbnRyeSBjYWNoZUVudHJ5ID0gcmVzb3VyY2VzLmxvb2t1cENhY2hlKHBhdGgpOworCisgICAgICAgIGlmICghY2FjaGVFbnRyeS5leGlzdHMpIHsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcihIdHRwU2VydmxldFJlc3BvbnNlLlNDX05PVF9GT1VORCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBJZiB0aGUgcmVzb3VyY2UgaXMgbm90IGEgY29sbGVjdGlvbiwgYW5kIHRoZSByZXNvdXJjZSBwYXRoCisgICAgICAgIC8vIGVuZHMgd2l0aCAiLyIgb3IgIlwiLCByZXR1cm4gTk9UIEZPVU5ECisgICAgICAgIGlmIChjYWNoZUVudHJ5LmNvbnRleHQgPT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKHBhdGguZW5kc1dpdGgoIi8iKSB8fCAocGF0aC5lbmRzV2l0aCgiXFwiKSkpIHsKKyAgICAgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19OT1RfRk9VTkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBDaGVjayBpZiB0aGUgY29uZGl0aW9ucyBzcGVjaWZpZWQgaW4gdGhlIG9wdGlvbmFsIElmIGhlYWRlcnMgYXJlCisgICAgICAgIC8vIHNhdGlzZmllZC4KKyAgICAgICAgaWYgKGNhY2hlRW50cnkuY29udGV4dCA9PSBudWxsKSB7CisKKyAgICAgICAgICAgIC8vIENoZWNraW5nIElmIGhlYWRlcnMKKyAgICAgICAgICAgIGJvb2xlYW4gaW5jbHVkZWQgPQorICAgICAgICAgICAgICAgIChyZXF1ZXN0LmdldEF0dHJpYnV0ZShHbG9iYWxzLklOQ0xVREVfQ09OVEVYVF9QQVRIX0FUVFIpICE9IG51bGwpOworICAgICAgICAgICAgaWYgKCFpbmNsdWRlZAorICAgICAgICAgICAgICAgICYmICFjaGVja0lmSGVhZGVycyhyZXF1ZXN0LCByZXNwb25zZSwgY2FjaGVFbnRyeS5hdHRyaWJ1dGVzKSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgLy8gRmluZCBjb250ZW50IHR5cGUuCisgICAgICAgIFN0cmluZyBjb250ZW50VHlwZSA9IGNhY2hlRW50cnkuYXR0cmlidXRlcy5nZXRNaW1lVHlwZSgpOworICAgICAgICBpZiAoY29udGVudFR5cGUgPT0gbnVsbCkgeworICAgICAgICAgICAgY29udGVudFR5cGUgPSBnZXRTZXJ2bGV0Q29udGV4dCgpLmdldE1pbWVUeXBlKGNhY2hlRW50cnkubmFtZSk7CisgICAgICAgICAgICBjYWNoZUVudHJ5LmF0dHJpYnV0ZXMuc2V0TWltZVR5cGUoY29udGVudFR5cGUpOworICAgICAgICB9CisKKyAgICAgICAgVmVjdG9yIHJhbmdlcyA9IG51bGw7CisgICAgICAgIGxvbmcgY29udGVudExlbmd0aCA9IC0xTDsKKworICAgICAgICBpZiAoY2FjaGVFbnRyeS5jb250ZXh0ICE9IG51bGwpIHsKKworICAgICAgICAgICAgLy8gU2tpcCBkaXJlY3RvcnkgbGlzdGluZ3MgaWYgd2UgaGF2ZSBiZWVuIGNvbmZpZ3VyZWQgdG8KKyAgICAgICAgICAgIC8vIHN1cHByZXNzIHRoZW0KKyAgICAgICAgICAgIGlmICghbGlzdGluZ3MpIHsKKyAgICAgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19OT1RfRk9VTkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250ZW50VHlwZSA9ICJ0ZXh0L2h0bWw7Y2hhcnNldD1VVEYtOCI7CisKKyAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgLy8gUGFyc2UgcmFuZ2Ugc3BlY2lmaWVyCisKKyAgICAgICAgICAgIHJhbmdlcyA9IHBhcnNlUmFuZ2UocmVxdWVzdCwgcmVzcG9uc2UsIGNhY2hlRW50cnkuYXR0cmlidXRlcyk7CisKKyAgICAgICAgICAgIC8vIEVUYWcgaGVhZGVyCisgICAgICAgICAgICByZXNwb25zZS5zZXRIZWFkZXIoIkVUYWciLCBnZXRFVGFnKGNhY2hlRW50cnkuYXR0cmlidXRlcykpOworCisgICAgICAgICAgICAvLyBMYXN0LU1vZGlmaWVkIGhlYWRlcgorICAgICAgICAgICAgcmVzcG9uc2Uuc2V0SGVhZGVyKCJMYXN0LU1vZGlmaWVkIiwKKyAgICAgICAgICAgICAgICAgICAgY2FjaGVFbnRyeS5hdHRyaWJ1dGVzLmdldExhc3RNb2RpZmllZEh0dHAoKSk7CisKKyAgICAgICAgICAgIC8vIEdldCBjb250ZW50IGxlbmd0aAorICAgICAgICAgICAgY29udGVudExlbmd0aCA9IGNhY2hlRW50cnkuYXR0cmlidXRlcy5nZXRDb250ZW50TGVuZ3RoKCk7CisgICAgICAgICAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIHplcm8gbGVuZ3RoIGZpbGVzLCB3aGljaCB3b3VsZCBjYXVzZSBhCisgICAgICAgICAgICAvLyAoc2lsZW50KSBJU0Ugd2hlbiBzZXR0aW5nIHRoZSBvdXRwdXQgYnVmZmVyIHNpemUKKyAgICAgICAgICAgIGlmIChjb250ZW50TGVuZ3RoID09IDBMKSB7CisgICAgICAgICAgICAgICAgY29udGVudCA9IGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICBTZXJ2bGV0T3V0cHV0U3RyZWFtIG9zdHJlYW0gPSBudWxsOworICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSBudWxsOworCisgICAgICAgIGlmIChjb250ZW50KSB7CisKKyAgICAgICAgICAgIC8vIFRyeWluZyB0byByZXRyaWV2ZSB0aGUgc2VydmxldCBvdXRwdXQgc3RyZWFtCisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgb3N0cmVhbSA9IHJlc3BvbnNlLmdldE91dHB1dFN0cmVhbSgpOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBJZiBpdCBmYWlscywgd2UgdHJ5IHRvIGdldCBhIFdyaXRlciBpbnN0ZWFkIGlmIHdlJ3JlCisgICAgICAgICAgICAgICAgLy8gdHJ5aW5nIHRvIHNlcnZlIGEgdGV4dCBmaWxlCisgICAgICAgICAgICAgICAgaWYgKCAoY29udGVudFR5cGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgIHx8IChjb250ZW50VHlwZS5zdGFydHNXaXRoKCJ0ZXh0IikpICkgeworICAgICAgICAgICAgICAgICAgICB3cml0ZXIgPSByZXNwb25zZS5nZXRXcml0ZXIoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgaWYgKCAoY2FjaGVFbnRyeS5jb250ZXh0ICE9IG51bGwpIHx8CisgICAgICAgICAgICAgKCAoKHJhbmdlcyA9PSBudWxsKSB8fCAocmFuZ2VzLmlzRW1wdHkoKSkpCisgICAgICAgICAgICAgICAmJiAocmVxdWVzdC5nZXRIZWFkZXIoIlJhbmdlIikgPT0gbnVsbCkgKSApIHsKKworICAgICAgICAgICAgLy8gU2V0IHRoZSBhcHByb3ByaWF0ZSBvdXRwdXQgaGVhZGVycworICAgICAgICAgICAgaWYgKGNvbnRlbnRUeXBlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAoZGVidWcgPiAwKQorICAgICAgICAgICAgICAgICAgICBsb2coIkRlZmF1bHRTZXJ2bGV0LnNlcnZlRmlsZTogIGNvbnRlbnRUeXBlPSciICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlICsgIiciKTsKKyAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZShjb250ZW50VHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKGNhY2hlRW50cnkucmVzb3VyY2UgIT0gbnVsbCkgJiYgKGNvbnRlbnRMZW5ndGggPj0gMCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoZGVidWcgPiAwKQorICAgICAgICAgICAgICAgICAgICBsb2coIkRlZmF1bHRTZXJ2bGV0LnNlcnZlRmlsZTogIGNvbnRlbnRMZW5ndGg9IiArCisgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50TGVuZ3RoKTsKKyAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRDb250ZW50TGVuZ3RoKChpbnQpIGNvbnRlbnRMZW5ndGgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBJbnB1dFN0cmVhbSByZW5kZXJSZXN1bHQgPSBudWxsOworICAgICAgICAgICAgaWYgKGNhY2hlRW50cnkuY29udGV4dCAhPSBudWxsKSB7CisKKyAgICAgICAgICAgICAgICBpZiAoY29udGVudCkgeworICAgICAgICAgICAgICAgICAgICAvLyBTZXJ2ZSB0aGUgZGlyZWN0b3J5IGJyb3dzZXIKKyAgICAgICAgICAgICAgICAgICAgcmVuZGVyUmVzdWx0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcihyZXF1ZXN0LmdldENvbnRleHRQYXRoKCksIGNhY2hlRW50cnkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBDb3B5IHRoZSBpbnB1dCBzdHJlYW0gdG8gb3VyIG91dHB1dCBzdHJlYW0gKGlmIHJlcXVlc3RlZCkKKyAgICAgICAgICAgIGlmIChjb250ZW50KSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2V0QnVmZmVyU2l6ZShvdXRwdXQpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFNpbGVudCBjYXRjaAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAob3N0cmVhbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGNvcHkoY2FjaGVFbnRyeSwgcmVuZGVyUmVzdWx0LCBvc3RyZWFtKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjb3B5KGNhY2hlRW50cnksIHJlbmRlclJlc3VsdCwgd3JpdGVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgaWYgKChyYW5nZXMgPT0gbnVsbCkgfHwgKHJhbmdlcy5pc0VtcHR5KCkpKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgLy8gUGFydGlhbCBjb250ZW50IHJlc3BvbnNlLgorCisgICAgICAgICAgICByZXNwb25zZS5zZXRTdGF0dXMoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19QQVJUSUFMX0NPTlRFTlQpOworCisgICAgICAgICAgICBpZiAocmFuZ2VzLnNpemUoKSA9PSAxKSB7CisKKyAgICAgICAgICAgICAgICBSYW5nZSByYW5nZSA9IChSYW5nZSkgcmFuZ2VzLmVsZW1lbnRBdCgwKTsKKyAgICAgICAgICAgICAgICByZXNwb25zZS5hZGRIZWFkZXIoIkNvbnRlbnQtUmFuZ2UiLCAiYnl0ZXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHJhbmdlLnN0YXJ0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIi0iICsgcmFuZ2UuZW5kICsgIi8iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcmFuZ2UubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRDb250ZW50TGVuZ3RoKChpbnQpIChyYW5nZS5lbmQgLSByYW5nZS5zdGFydCArIDEpKTsKKworICAgICAgICAgICAgICAgIGlmIChjb250ZW50VHlwZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1ZyA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICBsb2coIkRlZmF1bHRTZXJ2bGV0LnNlcnZlRmlsZTogIGNvbnRlbnRUeXBlPSciICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50VHlwZSArICInIik7CisgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKGNvbnRlbnRUeXBlKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoY29udGVudCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2V0QnVmZmVyU2l6ZShvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2lsZW50IGNhdGNoCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG9zdHJlYW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29weShjYWNoZUVudHJ5LCBvc3RyZWFtLCByYW5nZSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb3B5KGNhY2hlRW50cnksIHdyaXRlciwgcmFuZ2UpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoIm11bHRpcGFydC9ieXRlcmFuZ2VzOyBib3VuZGFyeT0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtaW1lU2VwYXJhdGlvbik7CisKKyAgICAgICAgICAgICAgICBpZiAoY29udGVudCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2V0QnVmZmVyU2l6ZShvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2lsZW50IGNhdGNoCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG9zdHJlYW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29weShjYWNoZUVudHJ5LCBvc3RyZWFtLCByYW5nZXMuZWxlbWVudHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFR5cGUpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgY29weShjYWNoZUVudHJ5LCB3cml0ZXIsIHJhbmdlcy5lbGVtZW50cygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50VHlwZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFBhcnNlIHRoZSBjb250ZW50LXJhbmdlIGhlYWRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIHNlcnZsZXQgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICogQHJldHVybiBSYW5nZQorICAgICAqLworICAgIHByb3RlY3RlZCBSYW5nZSBwYXJzZUNvbnRlbnRSYW5nZShIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBSZXRyaWV2aW5nIHRoZSBjb250ZW50LXJhbmdlIGhlYWRlciAoaWYgYW55IGlzIHNwZWNpZmllZAorICAgICAgICBTdHJpbmcgcmFuZ2VIZWFkZXIgPSByZXF1ZXN0LmdldEhlYWRlcigiQ29udGVudC1SYW5nZSIpOworCisgICAgICAgIGlmIChyYW5nZUhlYWRlciA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgLy8gYnl0ZXMgaXMgdGhlIG9ubHkgcmFuZ2UgdW5pdCBzdXBwb3J0ZWQKKyAgICAgICAgaWYgKCFyYW5nZUhlYWRlci5zdGFydHNXaXRoKCJieXRlcyIpKSB7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19CQURfUkVRVUVTVCk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHJhbmdlSGVhZGVyID0gcmFuZ2VIZWFkZXIuc3Vic3RyaW5nKDYpLnRyaW0oKTsKKworICAgICAgICBpbnQgZGFzaFBvcyA9IHJhbmdlSGVhZGVyLmluZGV4T2YoJy0nKTsKKyAgICAgICAgaW50IHNsYXNoUG9zID0gcmFuZ2VIZWFkZXIuaW5kZXhPZignLycpOworCisgICAgICAgIGlmIChkYXNoUG9zID09IC0xKSB7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19CQURfUkVRVUVTVCk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzbGFzaFBvcyA9PSAtMSkgeworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfQkFEX1JFUVVFU1QpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBSYW5nZSByYW5nZSA9IG5ldyBSYW5nZSgpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByYW5nZS5zdGFydCA9IExvbmcucGFyc2VMb25nKHJhbmdlSGVhZGVyLnN1YnN0cmluZygwLCBkYXNoUG9zKSk7CisgICAgICAgICAgICByYW5nZS5lbmQgPQorICAgICAgICAgICAgICAgIExvbmcucGFyc2VMb25nKHJhbmdlSGVhZGVyLnN1YnN0cmluZyhkYXNoUG9zICsgMSwgc2xhc2hQb3MpKTsKKyAgICAgICAgICAgIHJhbmdlLmxlbmd0aCA9IExvbmcucGFyc2VMb25nCisgICAgICAgICAgICAgICAgKHJhbmdlSGVhZGVyLnN1YnN0cmluZyhzbGFzaFBvcyArIDEsIHJhbmdlSGVhZGVyLmxlbmd0aCgpKSk7CisgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19CQURfUkVRVUVTVCk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghcmFuZ2UudmFsaWRhdGUoKSkgeworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfQkFEX1JFUVVFU1QpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmFuZ2U7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFBhcnNlIHRoZSByYW5nZSBoZWFkZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBzZXJ2bGV0IHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqIEByZXR1cm4gVmVjdG9yIG9mIHJhbmdlcworICAgICAqLworICAgIHByb3RlY3RlZCBWZWN0b3IgcGFyc2VSYW5nZShIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VBdHRyaWJ1dGVzIHJlc291cmNlQXR0cmlidXRlcykKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBDaGVja2luZyBJZi1SYW5nZQorICAgICAgICBTdHJpbmcgaGVhZGVyVmFsdWUgPSByZXF1ZXN0LmdldEhlYWRlcigiSWYtUmFuZ2UiKTsKKworICAgICAgICBpZiAoaGVhZGVyVmFsdWUgIT0gbnVsbCkgeworCisgICAgICAgICAgICBsb25nIGhlYWRlclZhbHVlVGltZSA9ICgtMUwpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBoZWFkZXJWYWx1ZVRpbWUgPSByZXF1ZXN0LmdldERhdGVIZWFkZXIoIklmLVJhbmdlIik7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RyaW5nIGVUYWcgPSBnZXRFVGFnKHJlc291cmNlQXR0cmlidXRlcyk7CisgICAgICAgICAgICBsb25nIGxhc3RNb2RpZmllZCA9IHJlc291cmNlQXR0cmlidXRlcy5nZXRMYXN0TW9kaWZpZWQoKTsKKworICAgICAgICAgICAgaWYgKGhlYWRlclZhbHVlVGltZSA9PSAoLTFMKSkgeworCisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIEVUYWcgdGhlIGNsaWVudCBnYXZlIGRvZXMgbm90IG1hdGNoIHRoZSBlbnRpdHkKKyAgICAgICAgICAgICAgICAvLyBldGFnLCB0aGVuIHRoZSBlbnRpcmUgZW50aXR5IGlzIHJldHVybmVkLgorICAgICAgICAgICAgICAgIGlmICghZVRhZy5lcXVhbHMoaGVhZGVyVmFsdWUudHJpbSgpKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgICAgICAvLyBJZiB0aGUgdGltZXN0YW1wIG9mIHRoZSBlbnRpdHkgdGhlIGNsaWVudCBnb3QgaXMgb2xkZXIgdGhhbgorICAgICAgICAgICAgICAgIC8vIHRoZSBsYXN0IG1vZGlmaWNhdGlvbiBkYXRlIG9mIHRoZSBlbnRpdHksIHRoZSBlbnRpcmUgZW50aXR5CisgICAgICAgICAgICAgICAgLy8gaXMgcmV0dXJuZWQuCisgICAgICAgICAgICAgICAgaWYgKGxhc3RNb2RpZmllZCA+IChoZWFkZXJWYWx1ZVRpbWUgKyAxMDAwKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgbG9uZyBmaWxlTGVuZ3RoID0gcmVzb3VyY2VBdHRyaWJ1dGVzLmdldENvbnRlbnRMZW5ndGgoKTsKKworICAgICAgICBpZiAoZmlsZUxlbmd0aCA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgLy8gUmV0cmlldmluZyB0aGUgcmFuZ2UgaGVhZGVyIChpZiBhbnkgaXMgc3BlY2lmaWVkCisgICAgICAgIFN0cmluZyByYW5nZUhlYWRlciA9IHJlcXVlc3QuZ2V0SGVhZGVyKCJSYW5nZSIpOworCisgICAgICAgIGlmIChyYW5nZUhlYWRlciA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIC8vIGJ5dGVzIGlzIHRoZSBvbmx5IHJhbmdlIHVuaXQgc3VwcG9ydGVkIChhbmQgSSBkb24ndCBzZWUgdGhlIHBvaW50CisgICAgICAgIC8vIG9mIGFkZGluZyBuZXcgb25lcykuCisgICAgICAgIGlmICghcmFuZ2VIZWFkZXIuc3RhcnRzV2l0aCgiYnl0ZXMiKSkgeworICAgICAgICAgICAgcmVzcG9uc2UuYWRkSGVhZGVyKCJDb250ZW50LVJhbmdlIiwgImJ5dGVzICovIiArIGZpbGVMZW5ndGgpOworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfUkVRVUVTVEVEX1JBTkdFX05PVF9TQVRJU0ZJQUJMRSk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHJhbmdlSGVhZGVyID0gcmFuZ2VIZWFkZXIuc3Vic3RyaW5nKDYpOworCisgICAgICAgIC8vIFZlY3RvciB3aGljaCB3aWxsIGNvbnRhaW4gYWxsIHRoZSByYW5nZXMgd2hpY2ggYXJlIHN1Y2Nlc3NmdWxseQorICAgICAgICAvLyBwYXJzZWQuCisgICAgICAgIFZlY3RvciByZXN1bHQgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIFN0cmluZ1Rva2VuaXplciBjb21tYVRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocmFuZ2VIZWFkZXIsICIsIik7CisKKyAgICAgICAgLy8gUGFyc2luZyB0aGUgcmFuZ2UgbGlzdAorICAgICAgICB3aGlsZSAoY29tbWFUb2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7CisgICAgICAgICAgICBTdHJpbmcgcmFuZ2VEZWZpbml0aW9uID0gY29tbWFUb2tlbml6ZXIubmV4dFRva2VuKCkudHJpbSgpOworCisgICAgICAgICAgICBSYW5nZSBjdXJyZW50UmFuZ2UgPSBuZXcgUmFuZ2UoKTsKKyAgICAgICAgICAgIGN1cnJlbnRSYW5nZS5sZW5ndGggPSBmaWxlTGVuZ3RoOworCisgICAgICAgICAgICBpbnQgZGFzaFBvcyA9IHJhbmdlRGVmaW5pdGlvbi5pbmRleE9mKCctJyk7CisKKyAgICAgICAgICAgIGlmIChkYXNoUG9zID09IC0xKSB7CisgICAgICAgICAgICAgICAgcmVzcG9uc2UuYWRkSGVhZGVyKCJDb250ZW50LVJhbmdlIiwgImJ5dGVzICovIiArIGZpbGVMZW5ndGgpOworICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19SRVFVRVNURURfUkFOR0VfTk9UX1NBVElTRklBQkxFKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGRhc2hQb3MgPT0gMCkgeworCisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgbG9uZyBvZmZzZXQgPSBMb25nLnBhcnNlTG9uZyhyYW5nZURlZmluaXRpb24pOworICAgICAgICAgICAgICAgICAgICBjdXJyZW50UmFuZ2Uuc3RhcnQgPSBmaWxlTGVuZ3RoICsgb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICBjdXJyZW50UmFuZ2UuZW5kID0gZmlsZUxlbmd0aCAtIDE7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuYWRkSGVhZGVyKCJDb250ZW50LVJhbmdlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJieXRlcyAqLyIgKyBmaWxlTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZQorICAgICAgICAgICAgICAgICAgICAgICAgIC5TQ19SRVFVRVNURURfUkFOR0VfTk9UX1NBVElTRklBQkxFKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudFJhbmdlLnN0YXJ0ID0gTG9uZy5wYXJzZUxvbmcKKyAgICAgICAgICAgICAgICAgICAgICAgIChyYW5nZURlZmluaXRpb24uc3Vic3RyaW5nKDAsIGRhc2hQb3MpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRhc2hQb3MgPCByYW5nZURlZmluaXRpb24ubGVuZ3RoKCkgLSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFJhbmdlLmVuZCA9IExvbmcucGFyc2VMb25nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJhbmdlRGVmaW5pdGlvbi5zdWJzdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRhc2hQb3MgKyAxLCByYW5nZURlZmluaXRpb24ubGVuZ3RoKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFJhbmdlLmVuZCA9IGZpbGVMZW5ndGggLSAxOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmFkZEhlYWRlcigiQ29udGVudC1SYW5nZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnl0ZXMgKi8iICsgZmlsZUxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAuU0NfUkVRVUVTVEVEX1JBTkdFX05PVF9TQVRJU0ZJQUJMRSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIWN1cnJlbnRSYW5nZS52YWxpZGF0ZSgpKSB7CisgICAgICAgICAgICAgICAgcmVzcG9uc2UuYWRkSGVhZGVyKCJDb250ZW50LVJhbmdlIiwgImJ5dGVzICovIiArIGZpbGVMZW5ndGgpOworICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19SRVFVRVNURURfUkFOR0VfTk9UX1NBVElTRklBQkxFKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmVzdWx0LmFkZEVsZW1lbnQoY3VycmVudFJhbmdlKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisKKworICAgIC8qKgorICAgICAqICBEZWNpZGUgd2hpY2ggd2F5IHRvIHJlbmRlci4gSFRNTCBvciBYTUwuCisgICAgICovCisgICAgcHJvdGVjdGVkIElucHV0U3RyZWFtIHJlbmRlcgorICAgICAgICAoU3RyaW5nIGNvbnRleHRQYXRoLCBDYWNoZUVudHJ5IGNhY2hlRW50cnkpIHsKKyAgICAgICAgSW5wdXRTdHJlYW0geHNsdElucHV0U3RyZWFtID0KKyAgICAgICAgICAgIGZpbmRYc2x0SW5wdXRTdHJlYW0oY2FjaGVFbnRyeS5jb250ZXh0KTsKKworICAgICAgICBpZiAoeHNsdElucHV0U3RyZWFtPT1udWxsKSB7CisgICAgICAgICAgICByZXR1cm4gcmVuZGVySHRtbChjb250ZXh0UGF0aCwgY2FjaGVFbnRyeSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gcmVuZGVyWG1sKGNvbnRleHRQYXRoLCBjYWNoZUVudHJ5LCB4c2x0SW5wdXRTdHJlYW0pOworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYW4gSW5wdXRTdHJlYW0gdG8gYW4gSFRNTCByZXByZXNlbnRhdGlvbiBvZiB0aGUgY29udGVudHMKKyAgICAgKiBvZiB0aGlzIGRpcmVjdG9yeS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0UGF0aCBDb250ZXh0IHBhdGggdG8gd2hpY2ggb3VyIGludGVybmFsIHBhdGhzIGFyZQorICAgICAqICByZWxhdGl2ZQorICAgICAqLworICAgIHByb3RlY3RlZCBJbnB1dFN0cmVhbSByZW5kZXJYbWwoU3RyaW5nIGNvbnRleHRQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FjaGVFbnRyeSBjYWNoZUVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0geHNsdElucHV0U3RyZWFtKSB7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCisgICAgICAgIHNiLmFwcGVuZCgiPD94bWwgdmVyc2lvbj1cIjEuMFwiPz4iKTsKKyAgICAgICAgc2IuYXBwZW5kKCI8bGlzdGluZyAiKTsKKyAgICAgICAgc2IuYXBwZW5kKCIgY29udGV4dFBhdGg9JyIpOworICAgICAgICBzYi5hcHBlbmQoY29udGV4dFBhdGgpOworICAgICAgICBzYi5hcHBlbmQoIiciKTsKKyAgICAgICAgc2IuYXBwZW5kKCIgZGlyZWN0b3J5PSciKTsKKyAgICAgICAgc2IuYXBwZW5kKGNhY2hlRW50cnkubmFtZSk7CisgICAgICAgIHNiLmFwcGVuZCgiJyAiKTsKKyAgICAgICAgc2IuYXBwZW5kKCIgaGFzUGFyZW50PSciKS5hcHBlbmQoIWNhY2hlRW50cnkubmFtZS5lcXVhbHMoIi8iKSk7CisgICAgICAgIHNiLmFwcGVuZCgiJz4iKTsKKworICAgICAgICBzYi5hcHBlbmQoIjxlbnRyaWVzPiIpOworCisgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgIC8vIFJlbmRlciB0aGUgZGlyZWN0b3J5IGVudHJpZXMgd2l0aGluIHRoaXMgZGlyZWN0b3J5CisgICAgICAgICAgICBEaXJDb250ZXh0IGRpcmVjdG9yeSA9IGNhY2hlRW50cnkuY29udGV4dDsKKyAgICAgICAgICAgIE5hbWluZ0VudW1lcmF0aW9uIGVudW1lcmF0aW9uID0gcmVzb3VyY2VzLmxpc3QoY2FjaGVFbnRyeS5uYW1lKTsKKyAgICAgICAgICAgIHdoaWxlIChlbnVtZXJhdGlvbi5oYXNNb3JlRWxlbWVudHMoKSkgeworCisgICAgICAgICAgICAgICAgTmFtZUNsYXNzUGFpciBuY1BhaXIgPSAoTmFtZUNsYXNzUGFpcikgZW51bWVyYXRpb24ubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcmVzb3VyY2VOYW1lID0gbmNQYWlyLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICBDYWNoZUVudHJ5IGNoaWxkQ2FjaGVFbnRyeSA9CisgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcy5sb29rdXBDYWNoZShjYWNoZUVudHJ5Lm5hbWUgKyByZXNvdXJjZU5hbWUpOworCisgICAgICAgICAgICAgICAgU3RyaW5nIHRyaW1tZWQgPSByZXNvdXJjZU5hbWUvKi5zdWJzdHJpbmcodHJpbSkqLzsKKyAgICAgICAgICAgICAgICBpZiAodHJpbW1lZC5lcXVhbHNJZ25vcmVDYXNlKCJXRUItSU5GIikgfHwKKyAgICAgICAgICAgICAgICAgICAgdHJpbW1lZC5lcXVhbHNJZ25vcmVDYXNlKCJNRVRBLUlORiIpIHx8CisgICAgICAgICAgICAgICAgICAgIHRyaW1tZWQuZXF1YWxzSWdub3JlQ2FzZShsb2NhbFhzbHRGaWxlKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIjxlbnRyeSIpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiIHR5cGU9JyIpCisgICAgICAgICAgICAgICAgICAuYXBwZW5kKChjaGlsZENhY2hlRW50cnkuY29udGV4dCAhPSBudWxsKT8iZGlyIjoiZmlsZSIpCisgICAgICAgICAgICAgICAgICAuYXBwZW5kKCInIik7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgdXJsUGF0aD0nIikKKyAgICAgICAgICAgICAgICAgIC5hcHBlbmQocmV3cml0ZVVybChjb250ZXh0UGF0aCkpCisgICAgICAgICAgICAgICAgICAuYXBwZW5kKHJld3JpdGVVcmwoY2FjaGVFbnRyeS5uYW1lICsgcmVzb3VyY2VOYW1lKSkKKyAgICAgICAgICAgICAgICAgIC5hcHBlbmQoKGNoaWxkQ2FjaGVFbnRyeS5jb250ZXh0ICE9IG51bGwpPyIvIjoiIikKKyAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIiciKTsKKyAgICAgICAgICAgICAgICBpZiAoY2hpbGRDYWNoZUVudHJ5LnJlc291cmNlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgc2l6ZT0nIikKKyAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKHJlbmRlclNpemUoY2hpbGRDYWNoZUVudHJ5LmF0dHJpYnV0ZXMuZ2V0Q29udGVudExlbmd0aCgpKSkKKyAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCInIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiIGRhdGU9JyIpCisgICAgICAgICAgICAgICAgICAuYXBwZW5kKGNoaWxkQ2FjaGVFbnRyeS5hdHRyaWJ1dGVzLmdldExhc3RNb2RpZmllZEh0dHAoKSkKKyAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIiciKTsKKworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiPiIpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCh0cmltbWVkKTsKKyAgICAgICAgICAgICAgICBpZiAoY2hpbGRDYWNoZUVudHJ5LmNvbnRleHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIvIik7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCI8L2VudHJ5PiIpOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIFNvbWV0aGluZyB3ZW50IHdyb25nCisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisKKyAgICAgICAgc2IuYXBwZW5kKCI8L2VudHJpZXM+Iik7CisKKyAgICAgICAgU3RyaW5nIHJlYWRtZSA9IGdldFJlYWRtZShjYWNoZUVudHJ5LmNvbnRleHQpOworCisgICAgICAgIGlmIChyZWFkbWUhPW51bGwpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiPHJlYWRtZT48IVtDREFUQVsiKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChyZWFkbWUpOworICAgICAgICAgICAgc2IuYXBwZW5kKCJdXT48L3JlYWRtZT4iKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgc2IuYXBwZW5kKCI8L2xpc3Rpbmc+Iik7CisKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgVHJhbnNmb3JtZXJGYWN0b3J5IHRGYWN0b3J5ID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICBTb3VyY2UgeG1sU291cmNlID0gbmV3IFN0cmVhbVNvdXJjZShuZXcgU3RyaW5nUmVhZGVyKHNiLnRvU3RyaW5nKCkpKTsKKyAgICAgICAgICAgIFNvdXJjZSB4c2xTb3VyY2UgPSBuZXcgU3RyZWFtU291cmNlKHhzbHRJbnB1dFN0cmVhbSk7CisgICAgICAgICAgICBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKHhzbFNvdXJjZSk7CisKKyAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgICAgICBPdXRwdXRTdHJlYW1Xcml0ZXIgb3NXcml0ZXIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKHN0cmVhbSwgIlVURjgiKTsKKyAgICAgICAgICAgIFN0cmVhbVJlc3VsdCBvdXQgPSBuZXcgU3RyZWFtUmVzdWx0KG9zV3JpdGVyKTsKKyAgICAgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybSh4bWxTb3VyY2UsIG91dCk7CisgICAgICAgICAgICBvc1dyaXRlci5mbHVzaCgpOworICAgICAgICAgICAgcmV0dXJuIChuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oc3RyZWFtLnRvQnl0ZUFycmF5KCkpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZygiZGlyZWN0b3J5IHRyYW5zZm9ybSBmYWlsdXJlOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgcmV0dXJuIHJlbmRlckh0bWwoY29udGV4dFBhdGgsIGNhY2hlRW50cnkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGFuIElucHV0U3RyZWFtIHRvIGFuIEhUTUwgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNvbnRlbnRzCisgICAgICogb2YgdGhpcyBkaXJlY3RvcnkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dFBhdGggQ29udGV4dCBwYXRoIHRvIHdoaWNoIG91ciBpbnRlcm5hbCBwYXRocyBhcmUKKyAgICAgKiAgcmVsYXRpdmUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgSW5wdXRTdHJlYW0gcmVuZGVySHRtbAorICAgICAgICAoU3RyaW5nIGNvbnRleHRQYXRoLCBDYWNoZUVudHJ5IGNhY2hlRW50cnkpIHsKKworICAgICAgICBTdHJpbmcgbmFtZSA9IGNhY2hlRW50cnkubmFtZTsKKworICAgICAgICAvLyBOdW1iZXIgb2YgY2hhcmFjdGVycyB0byB0cmltIGZyb20gdGhlIGJlZ2lubmluZ3Mgb2YgZmlsZW5hbWVzCisgICAgICAgIGludCB0cmltID0gbmFtZS5sZW5ndGgoKTsKKyAgICAgICAgaWYgKCFuYW1lLmVuZHNXaXRoKCIvIikpCisgICAgICAgICAgICB0cmltICs9IDE7CisgICAgICAgIGlmIChuYW1lLmVxdWFscygiLyIpKQorICAgICAgICAgICAgdHJpbSA9IDE7CisKKyAgICAgICAgLy8gUHJlcGFyZSBhIHdyaXRlciB0byBhIGJ1ZmZlcmVkIGFyZWEKKyAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgT3V0cHV0U3RyZWFtV3JpdGVyIG9zV3JpdGVyID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9zV3JpdGVyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihzdHJlYW0sICJVVEY4Iik7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBTaG91bGQgbmV2ZXIgaGFwcGVuCisgICAgICAgICAgICBvc1dyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoc3RyZWFtKTsKKyAgICAgICAgfQorICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIob3NXcml0ZXIpOworCisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKworICAgICAgICAvLyBSZW5kZXIgdGhlIHBhZ2UgaGVhZGVyCisgICAgICAgIHNiLmFwcGVuZCgiPGh0bWw+XHJcbiIpOworICAgICAgICBzYi5hcHBlbmQoIjxoZWFkPlxyXG4iKTsKKyAgICAgICAgc2IuYXBwZW5kKCI8dGl0bGU+Iik7CisgICAgICAgIHNiLmFwcGVuZChzbS5nZXRTdHJpbmcoImRpcmVjdG9yeS50aXRsZSIsIG5hbWUpKTsKKyAgICAgICAgc2IuYXBwZW5kKCI8L3RpdGxlPlxyXG4iKTsKKyAgICAgICAgc2IuYXBwZW5kKCI8U1RZTEU+PCEtLSIpOworICAgICAgICBzYi5hcHBlbmQob3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLlRvbWNhdENTUy5UT01DQVRfQ1NTKTsKKyAgICAgICAgc2IuYXBwZW5kKCItLT48L1NUWUxFPiAiKTsKKyAgICAgICAgc2IuYXBwZW5kKCI8L2hlYWQ+XHJcbiIpOworICAgICAgICBzYi5hcHBlbmQoIjxib2R5PiIpOworICAgICAgICBzYi5hcHBlbmQoIjxoMT4iKTsKKyAgICAgICAgc2IuYXBwZW5kKHNtLmdldFN0cmluZygiZGlyZWN0b3J5LnRpdGxlIiwgbmFtZSkpOworCisgICAgICAgIC8vIFJlbmRlciB0aGUgbGluayB0byBvdXIgcGFyZW50IChpZiByZXF1aXJlZCkKKyAgICAgICAgU3RyaW5nIHBhcmVudERpcmVjdG9yeSA9IG5hbWU7CisgICAgICAgIGlmIChwYXJlbnREaXJlY3RvcnkuZW5kc1dpdGgoIi8iKSkgeworICAgICAgICAgICAgcGFyZW50RGlyZWN0b3J5ID0KKyAgICAgICAgICAgICAgICBwYXJlbnREaXJlY3Rvcnkuc3Vic3RyaW5nKDAsIHBhcmVudERpcmVjdG9yeS5sZW5ndGgoKSAtIDEpOworICAgICAgICB9CisgICAgICAgIGludCBzbGFzaCA9IHBhcmVudERpcmVjdG9yeS5sYXN0SW5kZXhPZignLycpOworICAgICAgICBpZiAoc2xhc2ggPj0gMCkgeworICAgICAgICAgICAgU3RyaW5nIHBhcmVudCA9IG5hbWUuc3Vic3RyaW5nKDAsIHNsYXNoKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiIC0gPGEgaHJlZj1cIiIpOworICAgICAgICAgICAgc2IuYXBwZW5kKHJld3JpdGVVcmwoY29udGV4dFBhdGgpKTsKKyAgICAgICAgICAgIGlmIChwYXJlbnQuZXF1YWxzKCIiKSkKKyAgICAgICAgICAgICAgICBwYXJlbnQgPSAiLyI7CisgICAgICAgICAgICBzYi5hcHBlbmQocmV3cml0ZVVybChwYXJlbnQpKTsKKyAgICAgICAgICAgIGlmICghcGFyZW50LmVuZHNXaXRoKCIvIikpCisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIvIik7CisgICAgICAgICAgICBzYi5hcHBlbmQoIlwiPiIpOworICAgICAgICAgICAgc2IuYXBwZW5kKCI8Yj4iKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChzbS5nZXRTdHJpbmcoImRpcmVjdG9yeS5wYXJlbnQiLCBwYXJlbnQpKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiPC9iPiIpOworICAgICAgICAgICAgc2IuYXBwZW5kKCI8L2E+Iik7CisgICAgICAgIH0KKworICAgICAgICBzYi5hcHBlbmQoIjwvaDE+Iik7CisgICAgICAgIHNiLmFwcGVuZCgiPEhSIHNpemU9XCIxXCIgbm9zaGFkZT1cIm5vc2hhZGVcIj4iKTsKKworICAgICAgICBzYi5hcHBlbmQoIjx0YWJsZSB3aWR0aD1cIjEwMCVcIiBjZWxsc3BhY2luZz1cIjBcIiIgKworICAgICAgICAgICAgICAgICAgICAgIiBjZWxscGFkZGluZz1cIjVcIiBhbGlnbj1cImNlbnRlclwiPlxyXG4iKTsKKworICAgICAgICAvLyBSZW5kZXIgdGhlIGNvbHVtbiBoZWFkaW5ncworICAgICAgICBzYi5hcHBlbmQoIjx0cj5cclxuIik7CisgICAgICAgIHNiLmFwcGVuZCgiPHRkIGFsaWduPVwibGVmdFwiPjxmb250IHNpemU9XCIrMVwiPjxzdHJvbmc+Iik7CisgICAgICAgIHNiLmFwcGVuZChzbS5nZXRTdHJpbmcoImRpcmVjdG9yeS5maWxlbmFtZSIpKTsKKyAgICAgICAgc2IuYXBwZW5kKCI8L3N0cm9uZz48L2ZvbnQ+PC90ZD5cclxuIik7CisgICAgICAgIHNiLmFwcGVuZCgiPHRkIGFsaWduPVwiY2VudGVyXCI+PGZvbnQgc2l6ZT1cIisxXCI+PHN0cm9uZz4iKTsKKyAgICAgICAgc2IuYXBwZW5kKHNtLmdldFN0cmluZygiZGlyZWN0b3J5LnNpemUiKSk7CisgICAgICAgIHNiLmFwcGVuZCgiPC9zdHJvbmc+PC9mb250PjwvdGQ+XHJcbiIpOworICAgICAgICBzYi5hcHBlbmQoIjx0ZCBhbGlnbj1cInJpZ2h0XCI+PGZvbnQgc2l6ZT1cIisxXCI+PHN0cm9uZz4iKTsKKyAgICAgICAgc2IuYXBwZW5kKHNtLmdldFN0cmluZygiZGlyZWN0b3J5Lmxhc3RNb2RpZmllZCIpKTsKKyAgICAgICAgc2IuYXBwZW5kKCI8L3N0cm9uZz48L2ZvbnQ+PC90ZD5cclxuIik7CisgICAgICAgIHNiLmFwcGVuZCgiPC90cj4iKTsKKworICAgICAgICB0cnkgeworCisgICAgICAgICAgICAvLyBSZW5kZXIgdGhlIGRpcmVjdG9yeSBlbnRyaWVzIHdpdGhpbiB0aGlzIGRpcmVjdG9yeQorICAgICAgICAgICAgRGlyQ29udGV4dCBkaXJlY3RvcnkgPSBjYWNoZUVudHJ5LmNvbnRleHQ7CisgICAgICAgICAgICBOYW1pbmdFbnVtZXJhdGlvbiBlbnVtZXJhdGlvbiA9IHJlc291cmNlcy5saXN0KGNhY2hlRW50cnkubmFtZSk7CisgICAgICAgICAgICBib29sZWFuIHNoYWRlID0gZmFsc2U7CisgICAgICAgICAgICB3aGlsZSAoZW51bWVyYXRpb24uaGFzTW9yZUVsZW1lbnRzKCkpIHsKKworICAgICAgICAgICAgICAgIE5hbWVDbGFzc1BhaXIgbmNQYWlyID0gKE5hbWVDbGFzc1BhaXIpIGVudW1lcmF0aW9uLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIHJlc291cmNlTmFtZSA9IG5jUGFpci5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgQ2FjaGVFbnRyeSBjaGlsZENhY2hlRW50cnkgPQorICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMubG9va3VwQ2FjaGUoY2FjaGVFbnRyeS5uYW1lICsgcmVzb3VyY2VOYW1lKTsKKworICAgICAgICAgICAgICAgIFN0cmluZyB0cmltbWVkID0gcmVzb3VyY2VOYW1lLyouc3Vic3RyaW5nKHRyaW0pKi87CisgICAgICAgICAgICAgICAgaWYgKHRyaW1tZWQuZXF1YWxzSWdub3JlQ2FzZSgiV0VCLUlORiIpIHx8CisgICAgICAgICAgICAgICAgICAgIHRyaW1tZWQuZXF1YWxzSWdub3JlQ2FzZSgiTUVUQS1JTkYiKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIjx0ciIpOworICAgICAgICAgICAgICAgIGlmIChzaGFkZSkKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgYmdjb2xvcj1cIiNlZWVlZWVcIiIpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiPlxyXG4iKTsKKyAgICAgICAgICAgICAgICBzaGFkZSA9ICFzaGFkZTsKKworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiPHRkIGFsaWduPVwibGVmdFwiPiZuYnNwOyZuYnNwO1xyXG4iKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIjxhIGhyZWY9XCIiKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQocmV3cml0ZVVybChjb250ZXh0UGF0aCkpOworICAgICAgICAgICAgICAgIHJlc291cmNlTmFtZSA9IHJld3JpdGVVcmwobmFtZSArIHJlc291cmNlTmFtZSk7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKHJlc291cmNlTmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKGNoaWxkQ2FjaGVFbnRyeS5jb250ZXh0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiLyIpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiXCI+PHR0PiIpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCh0cmltbWVkKTsKKyAgICAgICAgICAgICAgICBpZiAoY2hpbGRDYWNoZUVudHJ5LmNvbnRleHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIvIik7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCI8L3R0PjwvYT48L3RkPlxyXG4iKTsKKworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiPHRkIGFsaWduPVwicmlnaHRcIj48dHQ+Iik7CisgICAgICAgICAgICAgICAgaWYgKGNoaWxkQ2FjaGVFbnRyeS5jb250ZXh0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiJm5ic3A7Iik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQocmVuZGVyU2l6ZShjaGlsZENhY2hlRW50cnkuYXR0cmlidXRlcy5nZXRDb250ZW50TGVuZ3RoKCkpKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIjwvdHQ+PC90ZD5cclxuIik7CisKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIjx0ZCBhbGlnbj1cInJpZ2h0XCI+PHR0PiIpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChjaGlsZENhY2hlRW50cnkuYXR0cmlidXRlcy5nZXRMYXN0TW9kaWZpZWRIdHRwKCkpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiPC90dD48L3RkPlxyXG4iKTsKKworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiPC90cj5cclxuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIFNvbWV0aGluZyB3ZW50IHdyb25nCisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmVuZGVyIHRoZSBwYWdlIGZvb3RlcgorICAgICAgICBzYi5hcHBlbmQoIjwvdGFibGU+XHJcbiIpOworCisgICAgICAgIHNiLmFwcGVuZCgiPEhSIHNpemU9XCIxXCIgbm9zaGFkZT1cIm5vc2hhZGVcIj4iKTsKKworICAgICAgICBTdHJpbmcgcmVhZG1lID0gZ2V0UmVhZG1lKGNhY2hlRW50cnkuY29udGV4dCk7CisgICAgICAgIGlmIChyZWFkbWUhPW51bGwpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZChyZWFkbWUpOworICAgICAgICAgICAgc2IuYXBwZW5kKCI8SFIgc2l6ZT1cIjFcIiBub3NoYWRlPVwibm9zaGFkZVwiPiIpOworICAgICAgICB9CisKKyAgICAgICAgc2IuYXBwZW5kKCI8aDM+IikuYXBwZW5kKFNlcnZlckluZm8uZ2V0U2VydmVySW5mbygpKS5hcHBlbmQoIjwvaDM+Iik7CisgICAgICAgIHNiLmFwcGVuZCgiPC9ib2R5PlxyXG4iKTsKKyAgICAgICAgc2IuYXBwZW5kKCI8L2h0bWw+XHJcbiIpOworCisgICAgICAgIC8vIFJldHVybiBhbiBpbnB1dCBzdHJlYW0gdG8gdGhlIHVuZGVybHlpbmcgYnl0ZXMKKyAgICAgICAgd3JpdGVyLndyaXRlKHNiLnRvU3RyaW5nKCkpOworICAgICAgICB3cml0ZXIuZmx1c2goKTsKKyAgICAgICAgcmV0dXJuIChuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oc3RyZWFtLnRvQnl0ZUFycmF5KCkpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVuZGVyIHRoZSBzcGVjaWZpZWQgZmlsZSBzaXplIChpbiBieXRlcykuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2l6ZSBGaWxlIHNpemUgKGluIGJ5dGVzKQorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgcmVuZGVyU2l6ZShsb25nIHNpemUpIHsKKworICAgICAgICBsb25nIGxlZnRTaWRlID0gc2l6ZSAvIDEwMjQ7CisgICAgICAgIGxvbmcgcmlnaHRTaWRlID0gKHNpemUgJSAxMDI0KSAvIDEwMzsgICAvLyBNYWtlcyAxIGRpZ2l0CisgICAgICAgIGlmICgobGVmdFNpZGUgPT0gMCkgJiYgKHJpZ2h0U2lkZSA9PSAwKSAmJiAoc2l6ZSA+IDApKQorICAgICAgICAgICAgcmlnaHRTaWRlID0gMTsKKworICAgICAgICByZXR1cm4gKCIiICsgbGVmdFNpZGUgKyAiLiIgKyByaWdodFNpZGUgKyAiIGtiIik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgcmVhZG1lIGZpbGUgYXMgYSBzdHJpbmcuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRSZWFkbWUoRGlyQ29udGV4dCBkaXJlY3RvcnkpIHsKKyAgICAgICAgaWYgKHJlYWRtZUZpbGUhPW51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgT2JqZWN0IG9iaiA9IGRpcmVjdG9yeS5sb29rdXAocmVhZG1lRmlsZSk7CisKKyAgICAgICAgICAgICAgICBpZiAob2JqIT1udWxsICYmIG9iaiBpbnN0YW5jZW9mIFJlc291cmNlKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZ1dyaXRlciBidWZmZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGlzID0gKChSZXNvdXJjZSlvYmopLnN0cmVhbUNvbnRlbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgY29weVJhbmdlKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUHJpbnRXcml0ZXIoYnVmZmVyKSk7CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOworICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgfSBjYXRjaChUaHJvd2FibGUgZSkgeworICAgICAgICAgICAgICAgICA7IC8qIFNob3VsZCBvbmx5IGJlIElPRXhjZXB0aW9uIG9yIE5hbWluZ0V4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAqIGNhbiBiZSBpZ25vcmVkCisgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHhzbCB0ZW1wbGF0ZSBpbnB1dHN0cmVhbSAoaWYgcG9zc2libGUpCisgICAgICovCisgICAgcHJvdGVjdGVkIElucHV0U3RyZWFtIGZpbmRYc2x0SW5wdXRTdHJlYW0oRGlyQ29udGV4dCBkaXJlY3RvcnkpIHsKKworICAgICAgICBpZiAobG9jYWxYc2x0RmlsZSE9bnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBPYmplY3Qgb2JqID0gZGlyZWN0b3J5Lmxvb2t1cChsb2NhbFhzbHRGaWxlKTsKKyAgICAgICAgICAgICAgICBpZiAob2JqIT1udWxsICYmIG9iaiBpbnN0YW5jZW9mIFJlc291cmNlKSB7CisgICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGlzID0gKChSZXNvdXJjZSlvYmopLnN0cmVhbUNvbnRlbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzIT1udWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICB9IGNhdGNoKFRocm93YWJsZSBlKSB7CisgICAgICAgICAgICAgICAgIDsgLyogU2hvdWxkIG9ubHkgYmUgSU9FeGNlcHRpb24gb3IgTmFtaW5nRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgICogY2FuIGJlIGlnbm9yZWQKKyAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiAgT3BlbiBhbmQgcmVhZCBpbiBmaWxlIGluIG9uZSBmZWxsIHN3b29wIHRvIHJlZHVjZSBjaGFuY2UKKyAgICAgICAgICogIGNoYW5jZSBvZiBsZWF2aW5nIGhhbmRsZSBvcGVuLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKGdsb2JhbFhzbHRGaWxlIT1udWxsKSB7CisgICAgICAgICAgICBGaWxlSW5wdXRTdHJlYW0gZmlzID0gbnVsbDsKKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShnbG9iYWxYc2x0RmlsZSk7CisgICAgICAgICAgICAgICAgaWYgKGYuZXhpc3RzKCkpeworICAgICAgICAgICAgICAgICAgICBmaXMgPW5ldyBGaWxlSW5wdXRTdHJlYW0oZik7CisgICAgICAgICAgICAgICAgICAgIGJ5dGUgYltdID0gbmV3IGJ5dGVbKGludClmLmxlbmd0aCgpXTsgLyogZGFuZ2VyISAqLworICAgICAgICAgICAgICAgICAgICBmaXMucmVhZChiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoKFRocm93YWJsZSBlKSB7CisgICAgICAgICAgICAgICAgbG9nKCJUaGlzIHNob3VsZG4ndCBoYXBwZW4gKD8pLi4uIiwgZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmaXMhPW51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBmaXMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoKFRocm93YWJsZSBlKXsKKyAgICAgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBudWxsOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcml2YXRlIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogQ2hlY2sgaWYgdGhlIGlmLW1hdGNoIGNvbmRpdGlvbiBpcyBzYXRpc2ZpZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBzZXJ2bGV0IHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqIEBwYXJhbSByZXNvdXJjZUluZm8gRmlsZSBvYmplY3QKKyAgICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiB0aGUgcmVzb3VyY2UgbWVldHMgdGhlIHNwZWNpZmllZCBjb25kaXRpb24sCisgICAgICogYW5kIGZhbHNlIGlmIHRoZSBjb25kaXRpb24gaXMgbm90IHNhdGlzZmllZCwgaW4gd2hpY2ggY2FzZSByZXF1ZXN0CisgICAgICogcHJvY2Vzc2luZyBpcyBzdG9wcGVkCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrSWZNYXRjaChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZUF0dHJpYnV0ZXMgcmVzb3VyY2VBdHRyaWJ1dGVzKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIFN0cmluZyBlVGFnID0gZ2V0RVRhZyhyZXNvdXJjZUF0dHJpYnV0ZXMpOworICAgICAgICBTdHJpbmcgaGVhZGVyVmFsdWUgPSByZXF1ZXN0LmdldEhlYWRlcigiSWYtTWF0Y2giKTsKKyAgICAgICAgaWYgKGhlYWRlclZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChoZWFkZXJWYWx1ZS5pbmRleE9mKCcqJykgPT0gLTEpIHsKKworICAgICAgICAgICAgICAgIFN0cmluZ1Rva2VuaXplciBjb21tYVRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIKKyAgICAgICAgICAgICAgICAgICAgKGhlYWRlclZhbHVlLCAiLCIpOworICAgICAgICAgICAgICAgIGJvb2xlYW4gY29uZGl0aW9uU2F0aXNmaWVkID0gZmFsc2U7CisKKyAgICAgICAgICAgICAgICB3aGlsZSAoIWNvbmRpdGlvblNhdGlzZmllZCAmJiBjb21tYVRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGN1cnJlbnRUb2tlbiA9IGNvbW1hVG9rZW5pemVyLm5leHRUb2tlbigpOworICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudFRva2VuLnRyaW0oKS5lcXVhbHMoZVRhZykpCisgICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25TYXRpc2ZpZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIElmIG5vbmUgb2YgdGhlIGdpdmVuIEVUYWdzIG1hdGNoLCA0MTIgUHJlY29kaXRpb24gZmFpbGVkIGlzCisgICAgICAgICAgICAgICAgLy8gc2VudCBiYWNrCisgICAgICAgICAgICAgICAgaWYgKCFjb25kaXRpb25TYXRpc2ZpZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19QUkVDT05ESVRJT05fRkFJTEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDaGVjayBpZiB0aGUgaWYtbW9kaWZpZWQtc2luY2UgY29uZGl0aW9uIGlzIHNhdGlzZmllZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIHNlcnZsZXQgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICogQHBhcmFtIHJlc291cmNlSW5mbyBGaWxlIG9iamVjdAorICAgICAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIHRoZSByZXNvdXJjZSBtZWV0cyB0aGUgc3BlY2lmaWVkIGNvbmRpdGlvbiwKKyAgICAgKiBhbmQgZmFsc2UgaWYgdGhlIGNvbmRpdGlvbiBpcyBub3Qgc2F0aXNmaWVkLCBpbiB3aGljaCBjYXNlIHJlcXVlc3QKKyAgICAgKiBwcm9jZXNzaW5nIGlzIHN0b3BwZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gY2hlY2tJZk1vZGlmaWVkU2luY2UoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlQXR0cmlidXRlcyByZXNvdXJjZUF0dHJpYnV0ZXMpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBsb25nIGhlYWRlclZhbHVlID0gcmVxdWVzdC5nZXREYXRlSGVhZGVyKCJJZi1Nb2RpZmllZC1TaW5jZSIpOworICAgICAgICAgICAgbG9uZyBsYXN0TW9kaWZpZWQgPSByZXNvdXJjZUF0dHJpYnV0ZXMuZ2V0TGFzdE1vZGlmaWVkKCk7CisgICAgICAgICAgICBpZiAoaGVhZGVyVmFsdWUgIT0gLTEpIHsKKworICAgICAgICAgICAgICAgIC8vIElmIGFuIElmLU5vbmUtTWF0Y2ggaGVhZGVyIGhhcyBiZWVuIHNwZWNpZmllZCwgaWYgbW9kaWZpZWQgc2luY2UKKyAgICAgICAgICAgICAgICAvLyBpcyBpZ25vcmVkLgorICAgICAgICAgICAgICAgIGlmICgocmVxdWVzdC5nZXRIZWFkZXIoIklmLU5vbmUtTWF0Y2giKSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAmJiAobGFzdE1vZGlmaWVkIDw9IGhlYWRlclZhbHVlICsgMTAwMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGVudGl0eSBoYXMgbm90IGJlZW4gbW9kaWZpZWQgc2luY2UgdGhlIGRhdGUKKyAgICAgICAgICAgICAgICAgICAgLy8gc3BlY2lmaWVkIGJ5IHRoZSBjbGllbnQuIFRoaXMgaXMgbm90IGFuIGVycm9yIGNhc2UuCisgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldFN0YXR1cyhIdHRwU2VydmxldFJlc3BvbnNlLlNDX05PVF9NT0RJRklFRCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2goSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlsbGVnYWxBcmd1bWVudCkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENoZWNrIGlmIHRoZSBpZi1ub25lLW1hdGNoIGNvbmRpdGlvbiBpcyBzYXRpc2ZpZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBzZXJ2bGV0IHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqIEBwYXJhbSByZXNvdXJjZUluZm8gRmlsZSBvYmplY3QKKyAgICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiB0aGUgcmVzb3VyY2UgbWVldHMgdGhlIHNwZWNpZmllZCBjb25kaXRpb24sCisgICAgICogYW5kIGZhbHNlIGlmIHRoZSBjb25kaXRpb24gaXMgbm90IHNhdGlzZmllZCwgaW4gd2hpY2ggY2FzZSByZXF1ZXN0CisgICAgICogcHJvY2Vzc2luZyBpcyBzdG9wcGVkCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrSWZOb25lTWF0Y2goSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZUF0dHJpYnV0ZXMgcmVzb3VyY2VBdHRyaWJ1dGVzKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIFN0cmluZyBlVGFnID0gZ2V0RVRhZyhyZXNvdXJjZUF0dHJpYnV0ZXMpOworICAgICAgICBTdHJpbmcgaGVhZGVyVmFsdWUgPSByZXF1ZXN0LmdldEhlYWRlcigiSWYtTm9uZS1NYXRjaCIpOworICAgICAgICBpZiAoaGVhZGVyVmFsdWUgIT0gbnVsbCkgeworCisgICAgICAgICAgICBib29sZWFuIGNvbmRpdGlvblNhdGlzZmllZCA9IGZhbHNlOworCisgICAgICAgICAgICBpZiAoIWhlYWRlclZhbHVlLmVxdWFscygiKiIpKSB7CisKKyAgICAgICAgICAgICAgICBTdHJpbmdUb2tlbml6ZXIgY29tbWFUb2tlbml6ZXIgPQorICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nVG9rZW5pemVyKGhlYWRlclZhbHVlLCAiLCIpOworCisgICAgICAgICAgICAgICAgd2hpbGUgKCFjb25kaXRpb25TYXRpc2ZpZWQgJiYgY29tbWFUb2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjdXJyZW50VG9rZW4gPSBjb21tYVRva2VuaXplci5uZXh0VG9rZW4oKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRUb2tlbi50cmltKCkuZXF1YWxzKGVUYWcpKQorICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uU2F0aXNmaWVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY29uZGl0aW9uU2F0aXNmaWVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNvbmRpdGlvblNhdGlzZmllZCkgeworCisgICAgICAgICAgICAgICAgLy8gRm9yIEdFVCBhbmQgSEVBRCwgd2Ugc2hvdWxkIHJlc3BvbmQgd2l0aAorICAgICAgICAgICAgICAgIC8vIDMwNCBOb3QgTW9kaWZpZWQuCisgICAgICAgICAgICAgICAgLy8gRm9yIGV2ZXJ5IG90aGVyIG1ldGhvZCwgNDEyIFByZWNvbmRpdGlvbiBGYWlsZWQgaXMgc2VudAorICAgICAgICAgICAgICAgIC8vIGJhY2suCisgICAgICAgICAgICAgICAgaWYgKCAoIkdFVCIuZXF1YWxzKHJlcXVlc3QuZ2V0TWV0aG9kKCkpKQorICAgICAgICAgICAgICAgICAgICAgfHwgKCJIRUFEIi5lcXVhbHMocmVxdWVzdC5nZXRNZXRob2QoKSkpICkgeworICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRTdGF0dXMoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19OT1RfTU9ESUZJRUQpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19QUkVDT05ESVRJT05fRkFJTEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ2hlY2sgaWYgdGhlIGlmLXVubW9kaWZpZWQtc2luY2UgY29uZGl0aW9uIGlzIHNhdGlzZmllZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIHNlcnZsZXQgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICogQHBhcmFtIHJlc291cmNlSW5mbyBGaWxlIG9iamVjdAorICAgICAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIHRoZSByZXNvdXJjZSBtZWV0cyB0aGUgc3BlY2lmaWVkIGNvbmRpdGlvbiwKKyAgICAgKiBhbmQgZmFsc2UgaWYgdGhlIGNvbmRpdGlvbiBpcyBub3Qgc2F0aXNmaWVkLCBpbiB3aGljaCBjYXNlIHJlcXVlc3QKKyAgICAgKiBwcm9jZXNzaW5nIGlzIHN0b3BwZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gY2hlY2tJZlVubW9kaWZpZWRTaW5jZShIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlQXR0cmlidXRlcyByZXNvdXJjZUF0dHJpYnV0ZXMpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBsb25nIGxhc3RNb2RpZmllZCA9IHJlc291cmNlQXR0cmlidXRlcy5nZXRMYXN0TW9kaWZpZWQoKTsKKyAgICAgICAgICAgIGxvbmcgaGVhZGVyVmFsdWUgPSByZXF1ZXN0LmdldERhdGVIZWFkZXIoIklmLVVubW9kaWZpZWQtU2luY2UiKTsKKyAgICAgICAgICAgIGlmIChoZWFkZXJWYWx1ZSAhPSAtMSkgeworICAgICAgICAgICAgICAgIGlmICggbGFzdE1vZGlmaWVkID4gKGhlYWRlclZhbHVlICsgMTAwMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGVudGl0eSBoYXMgbm90IGJlZW4gbW9kaWZpZWQgc2luY2UgdGhlIGRhdGUKKyAgICAgICAgICAgICAgICAgICAgLy8gc3BlY2lmaWVkIGJ5IHRoZSBjbGllbnQuIFRoaXMgaXMgbm90IGFuIGVycm9yIGNhc2UuCisgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcihIdHRwU2VydmxldFJlc3BvbnNlLlNDX1BSRUNPTkRJVElPTl9GQUlMRUQpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpbGxlZ2FsQXJndW1lbnQpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDb3B5IHRoZSBjb250ZW50cyBvZiB0aGUgc3BlY2lmaWVkIGlucHV0IHN0cmVhbSB0byB0aGUgc3BlY2lmaWVkCisgICAgICogb3V0cHV0IHN0cmVhbSwgYW5kIGVuc3VyZSB0aGF0IGJvdGggc3RyZWFtcyBhcmUgY2xvc2VkIGJlZm9yZSByZXR1cm5pbmcKKyAgICAgKiAoZXZlbiBpbiB0aGUgZmFjZSBvZiBhbiBleGNlcHRpb24pLgorICAgICAqCisgICAgICogQHBhcmFtIHJlc291cmNlSW5mbyBUaGUgcmVzb3VyY2UgaW5mb3JtYXRpb24KKyAgICAgKiBAcGFyYW0gb3N0cmVhbSBUaGUgb3V0cHV0IHN0cmVhbSB0byB3cml0ZSB0bworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGNvcHkoQ2FjaGVFbnRyeSBjYWNoZUVudHJ5LCBJbnB1dFN0cmVhbSBpcywKKyAgICAgICAgICAgICAgICAgICAgICBTZXJ2bGV0T3V0cHV0U3RyZWFtIG9zdHJlYW0pCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgSU9FeGNlcHRpb24gZXhjZXB0aW9uID0gbnVsbDsKKyAgICAgICAgSW5wdXRTdHJlYW0gcmVzb3VyY2VJbnB1dFN0cmVhbSA9IG51bGw7CisKKyAgICAgICAgLy8gT3B0aW1pemF0aW9uOiBJZiB0aGUgYmluYXJ5IGNvbnRlbnQgaGFzIGFscmVhZHkgYmVlbiBsb2FkZWQsIHNlbmQKKyAgICAgICAgLy8gaXQgZGlyZWN0bHkKKyAgICAgICAgaWYgKGNhY2hlRW50cnkucmVzb3VyY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgYnl0ZSBidWZmZXJbXSA9IGNhY2hlRW50cnkucmVzb3VyY2UuZ2V0Q29udGVudCgpOworICAgICAgICAgICAgaWYgKGJ1ZmZlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgb3N0cmVhbS53cml0ZShidWZmZXIsIDAsIGJ1ZmZlci5sZW5ndGgpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc291cmNlSW5wdXRTdHJlYW0gPSBjYWNoZUVudHJ5LnJlc291cmNlLnN0cmVhbUNvbnRlbnQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlc291cmNlSW5wdXRTdHJlYW0gPSBpczsKKyAgICAgICAgfQorCisgICAgICAgIElucHV0U3RyZWFtIGlzdHJlYW0gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbQorICAgICAgICAgICAgKHJlc291cmNlSW5wdXRTdHJlYW0sIGlucHV0KTsKKworICAgICAgICAvLyBDb3B5IHRoZSBpbnB1dCBzdHJlYW0gdG8gdGhlIG91dHB1dCBzdHJlYW0KKyAgICAgICAgZXhjZXB0aW9uID0gY29weVJhbmdlKGlzdHJlYW0sIG9zdHJlYW0pOworCisgICAgICAgIC8vIENsZWFuIHVwIHRoZSBpbnB1dCBzdHJlYW0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlzdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJldGhyb3cgYW55IGV4Y2VwdGlvbiB0aGF0IGhhcyBvY2N1cnJlZAorICAgICAgICBpZiAoZXhjZXB0aW9uICE9IG51bGwpCisgICAgICAgICAgICB0aHJvdyBleGNlcHRpb247CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvcHkgdGhlIGNvbnRlbnRzIG9mIHRoZSBzcGVjaWZpZWQgaW5wdXQgc3RyZWFtIHRvIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBvdXRwdXQgc3RyZWFtLCBhbmQgZW5zdXJlIHRoYXQgYm90aCBzdHJlYW1zIGFyZSBjbG9zZWQgYmVmb3JlIHJldHVybmluZworICAgICAqIChldmVuIGluIHRoZSBmYWNlIG9mIGFuIGV4Y2VwdGlvbikuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VJbmZvIFRoZSByZXNvdXJjZSBpbmZvCisgICAgICogQHBhcmFtIHdyaXRlciBUaGUgd3JpdGVyIHRvIHdyaXRlIHRvCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgY29weShDYWNoZUVudHJ5IGNhY2hlRW50cnksIElucHV0U3RyZWFtIGlzLCBQcmludFdyaXRlciB3cml0ZXIpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgSU9FeGNlcHRpb24gZXhjZXB0aW9uID0gbnVsbDsKKworICAgICAgICBJbnB1dFN0cmVhbSByZXNvdXJjZUlucHV0U3RyZWFtID0gbnVsbDsKKyAgICAgICAgaWYgKGNhY2hlRW50cnkucmVzb3VyY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgcmVzb3VyY2VJbnB1dFN0cmVhbSA9IGNhY2hlRW50cnkucmVzb3VyY2Uuc3RyZWFtQ29udGVudCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzb3VyY2VJbnB1dFN0cmVhbSA9IGlzOworICAgICAgICB9CisgICAgICAgIC8vIEZJWE1FIDogaTE4biA/CisgICAgICAgIFJlYWRlciByZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIocmVzb3VyY2VJbnB1dFN0cmVhbSk7CisKKyAgICAgICAgLy8gQ29weSB0aGUgaW5wdXQgc3RyZWFtIHRvIHRoZSBvdXRwdXQgc3RyZWFtCisgICAgICAgIGV4Y2VwdGlvbiA9IGNvcHlSYW5nZShyZWFkZXIsIHdyaXRlcik7CisKKyAgICAgICAgLy8gQ2xlYW4gdXAgdGhlIHJlYWRlcgorICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICA7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXRocm93IGFueSBleGNlcHRpb24gdGhhdCBoYXMgb2NjdXJyZWQKKyAgICAgICAgaWYgKGV4Y2VwdGlvbiAhPSBudWxsKQorICAgICAgICAgICAgdGhyb3cgZXhjZXB0aW9uOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDb3B5IHRoZSBjb250ZW50cyBvZiB0aGUgc3BlY2lmaWVkIGlucHV0IHN0cmVhbSB0byB0aGUgc3BlY2lmaWVkCisgICAgICogb3V0cHV0IHN0cmVhbSwgYW5kIGVuc3VyZSB0aGF0IGJvdGggc3RyZWFtcyBhcmUgY2xvc2VkIGJlZm9yZSByZXR1cm5pbmcKKyAgICAgKiAoZXZlbiBpbiB0aGUgZmFjZSBvZiBhbiBleGNlcHRpb24pLgorICAgICAqCisgICAgICogQHBhcmFtIHJlc291cmNlSW5mbyBUaGUgUmVzb3VyY2VJbmZvIG9iamVjdAorICAgICAqIEBwYXJhbSBvc3RyZWFtIFRoZSBvdXRwdXQgc3RyZWFtIHRvIHdyaXRlIHRvCisgICAgICogQHBhcmFtIHJhbmdlIFJhbmdlIHRoZSBjbGllbnQgd2FudGVkIHRvIHJldHJpZXZlCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGNvcHkoQ2FjaGVFbnRyeSBjYWNoZUVudHJ5LCBTZXJ2bGV0T3V0cHV0U3RyZWFtIG9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgUmFuZ2UgcmFuZ2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgSU9FeGNlcHRpb24gZXhjZXB0aW9uID0gbnVsbDsKKworICAgICAgICBJbnB1dFN0cmVhbSByZXNvdXJjZUlucHV0U3RyZWFtID0gY2FjaGVFbnRyeS5yZXNvdXJjZS5zdHJlYW1Db250ZW50KCk7CisgICAgICAgIElucHV0U3RyZWFtIGlzdHJlYW0gPQorICAgICAgICAgICAgbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0ocmVzb3VyY2VJbnB1dFN0cmVhbSwgaW5wdXQpOworICAgICAgICBleGNlcHRpb24gPSBjb3B5UmFuZ2UoaXN0cmVhbSwgb3N0cmVhbSwgcmFuZ2Uuc3RhcnQsIHJhbmdlLmVuZCk7CisKKyAgICAgICAgLy8gQ2xlYW4gdXAgdGhlIGlucHV0IHN0cmVhbQorICAgICAgICB0cnkgeworICAgICAgICAgICAgaXN0cmVhbS5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmV0aHJvdyBhbnkgZXhjZXB0aW9uIHRoYXQgaGFzIG9jY3VycmVkCisgICAgICAgIGlmIChleGNlcHRpb24gIT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IGV4Y2VwdGlvbjsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29weSB0aGUgY29udGVudHMgb2YgdGhlIHNwZWNpZmllZCBpbnB1dCBzdHJlYW0gdG8gdGhlIHNwZWNpZmllZAorICAgICAqIG91dHB1dCBzdHJlYW0sIGFuZCBlbnN1cmUgdGhhdCBib3RoIHN0cmVhbXMgYXJlIGNsb3NlZCBiZWZvcmUgcmV0dXJuaW5nCisgICAgICogKGV2ZW4gaW4gdGhlIGZhY2Ugb2YgYW4gZXhjZXB0aW9uKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNvdXJjZUluZm8gVGhlIFJlc291cmNlSW5mbyBvYmplY3QKKyAgICAgKiBAcGFyYW0gd3JpdGVyIFRoZSB3cml0ZXIgdG8gd3JpdGUgdG8KKyAgICAgKiBAcGFyYW0gcmFuZ2UgUmFuZ2UgdGhlIGNsaWVudCB3YW50ZWQgdG8gcmV0cmlldmUKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgY29weShDYWNoZUVudHJ5IGNhY2hlRW50cnksIFByaW50V3JpdGVyIHdyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICBSYW5nZSByYW5nZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICBJT0V4Y2VwdGlvbiBleGNlcHRpb24gPSBudWxsOworCisgICAgICAgIElucHV0U3RyZWFtIHJlc291cmNlSW5wdXRTdHJlYW0gPSBjYWNoZUVudHJ5LnJlc291cmNlLnN0cmVhbUNvbnRlbnQoKTsKKyAgICAgICAgUmVhZGVyIHJlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihyZXNvdXJjZUlucHV0U3RyZWFtKTsKKyAgICAgICAgZXhjZXB0aW9uID0gY29weVJhbmdlKHJlYWRlciwgd3JpdGVyLCByYW5nZS5zdGFydCwgcmFuZ2UuZW5kKTsKKworICAgICAgICAvLyBDbGVhbiB1cCB0aGUgaW5wdXQgc3RyZWFtCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkZXIuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJldGhyb3cgYW55IGV4Y2VwdGlvbiB0aGF0IGhhcyBvY2N1cnJlZAorICAgICAgICBpZiAoZXhjZXB0aW9uICE9IG51bGwpCisgICAgICAgICAgICB0aHJvdyBleGNlcHRpb247CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvcHkgdGhlIGNvbnRlbnRzIG9mIHRoZSBzcGVjaWZpZWQgaW5wdXQgc3RyZWFtIHRvIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBvdXRwdXQgc3RyZWFtLCBhbmQgZW5zdXJlIHRoYXQgYm90aCBzdHJlYW1zIGFyZSBjbG9zZWQgYmVmb3JlIHJldHVybmluZworICAgICAqIChldmVuIGluIHRoZSBmYWNlIG9mIGFuIGV4Y2VwdGlvbikuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VJbmZvIFRoZSBSZXNvdXJjZUluZm8gb2JqZWN0CisgICAgICogQHBhcmFtIG9zdHJlYW0gVGhlIG91dHB1dCBzdHJlYW0gdG8gd3JpdGUgdG8KKyAgICAgKiBAcGFyYW0gcmFuZ2VzIEVudW1lcmF0aW9uIG9mIHRoZSByYW5nZXMgdGhlIGNsaWVudCB3YW50ZWQgdG8gcmV0cmlldmUKKyAgICAgKiBAcGFyYW0gY29udGVudFR5cGUgQ29udGVudCB0eXBlIG9mIHRoZSByZXNvdXJjZQorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqLworICAgIHByaXZhdGUgdm9pZCBjb3B5KENhY2hlRW50cnkgY2FjaGVFbnRyeSwgU2VydmxldE91dHB1dFN0cmVhbSBvc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgIEVudW1lcmF0aW9uIHJhbmdlcywgU3RyaW5nIGNvbnRlbnRUeXBlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIElPRXhjZXB0aW9uIGV4Y2VwdGlvbiA9IG51bGw7CisKKyAgICAgICAgd2hpbGUgKCAoZXhjZXB0aW9uID09IG51bGwpICYmIChyYW5nZXMuaGFzTW9yZUVsZW1lbnRzKCkpICkgeworCisgICAgICAgICAgICBJbnB1dFN0cmVhbSByZXNvdXJjZUlucHV0U3RyZWFtID0gY2FjaGVFbnRyeS5yZXNvdXJjZS5zdHJlYW1Db250ZW50KCk7CisgICAgICAgICAgICBJbnB1dFN0cmVhbSBpc3RyZWFtID0KKyAgICAgICAgICAgICAgICBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShyZXNvdXJjZUlucHV0U3RyZWFtLCBpbnB1dCk7CisKKyAgICAgICAgICAgIFJhbmdlIGN1cnJlbnRSYW5nZSA9IChSYW5nZSkgcmFuZ2VzLm5leHRFbGVtZW50KCk7CisKKyAgICAgICAgICAgIC8vIFdyaXRpbmcgTUlNRSBoZWFkZXIuCisgICAgICAgICAgICBvc3RyZWFtLnByaW50bG4oKTsKKyAgICAgICAgICAgIG9zdHJlYW0ucHJpbnRsbigiLS0iICsgbWltZVNlcGFyYXRpb24pOworICAgICAgICAgICAgaWYgKGNvbnRlbnRUeXBlICE9IG51bGwpCisgICAgICAgICAgICAgICAgb3N0cmVhbS5wcmludGxuKCJDb250ZW50LVR5cGU6ICIgKyBjb250ZW50VHlwZSk7CisgICAgICAgICAgICBvc3RyZWFtLnByaW50bG4oIkNvbnRlbnQtUmFuZ2U6IGJ5dGVzICIgKyBjdXJyZW50UmFuZ2Uuc3RhcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIi0iICsgY3VycmVudFJhbmdlLmVuZCArICIvIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjdXJyZW50UmFuZ2UubGVuZ3RoKTsKKyAgICAgICAgICAgIG9zdHJlYW0ucHJpbnRsbigpOworCisgICAgICAgICAgICAvLyBQcmludGluZyBjb250ZW50CisgICAgICAgICAgICBleGNlcHRpb24gPSBjb3B5UmFuZ2UoaXN0cmVhbSwgb3N0cmVhbSwgY3VycmVudFJhbmdlLnN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRSYW5nZS5lbmQpOworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlzdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICBvc3RyZWFtLnByaW50bG4oKTsKKyAgICAgICAgb3N0cmVhbS5wcmludCgiLS0iICsgbWltZVNlcGFyYXRpb24gKyAiLS0iKTsKKworICAgICAgICAvLyBSZXRocm93IGFueSBleGNlcHRpb24gdGhhdCBoYXMgb2NjdXJyZWQKKyAgICAgICAgaWYgKGV4Y2VwdGlvbiAhPSBudWxsKQorICAgICAgICAgICAgdGhyb3cgZXhjZXB0aW9uOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDb3B5IHRoZSBjb250ZW50cyBvZiB0aGUgc3BlY2lmaWVkIGlucHV0IHN0cmVhbSB0byB0aGUgc3BlY2lmaWVkCisgICAgICogb3V0cHV0IHN0cmVhbSwgYW5kIGVuc3VyZSB0aGF0IGJvdGggc3RyZWFtcyBhcmUgY2xvc2VkIGJlZm9yZSByZXR1cm5pbmcKKyAgICAgKiAoZXZlbiBpbiB0aGUgZmFjZSBvZiBhbiBleGNlcHRpb24pLgorICAgICAqCisgICAgICogQHBhcmFtIHJlc291cmNlSW5mbyBUaGUgUmVzb3VyY2VJbmZvIG9iamVjdAorICAgICAqIEBwYXJhbSB3cml0ZXIgVGhlIHdyaXRlciB0byB3cml0ZSB0bworICAgICAqIEBwYXJhbSByYW5nZXMgRW51bWVyYXRpb24gb2YgdGhlIHJhbmdlcyB0aGUgY2xpZW50IHdhbnRlZCB0byByZXRyaWV2ZQorICAgICAqIEBwYXJhbSBjb250ZW50VHlwZSBDb250ZW50IHR5cGUgb2YgdGhlIHJlc291cmNlCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGNvcHkoQ2FjaGVFbnRyeSBjYWNoZUVudHJ5LCBQcmludFdyaXRlciB3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgRW51bWVyYXRpb24gcmFuZ2VzLCBTdHJpbmcgY29udGVudFR5cGUpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgSU9FeGNlcHRpb24gZXhjZXB0aW9uID0gbnVsbDsKKworICAgICAgICB3aGlsZSAoIChleGNlcHRpb24gPT0gbnVsbCkgJiYgKHJhbmdlcy5oYXNNb3JlRWxlbWVudHMoKSkgKSB7CisKKyAgICAgICAgICAgIElucHV0U3RyZWFtIHJlc291cmNlSW5wdXRTdHJlYW0gPSBjYWNoZUVudHJ5LnJlc291cmNlLnN0cmVhbUNvbnRlbnQoKTsKKyAgICAgICAgICAgIFJlYWRlciByZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIocmVzb3VyY2VJbnB1dFN0cmVhbSk7CisKKyAgICAgICAgICAgIFJhbmdlIGN1cnJlbnRSYW5nZSA9IChSYW5nZSkgcmFuZ2VzLm5leHRFbGVtZW50KCk7CisKKyAgICAgICAgICAgIC8vIFdyaXRpbmcgTUlNRSBoZWFkZXIuCisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigpOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIi0tIiArIG1pbWVTZXBhcmF0aW9uKTsKKyAgICAgICAgICAgIGlmIChjb250ZW50VHlwZSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJDb250ZW50LVR5cGU6ICIgKyBjb250ZW50VHlwZSk7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiQ29udGVudC1SYW5nZTogYnl0ZXMgIiArIGN1cnJlbnRSYW5nZS5zdGFydAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLSIgKyBjdXJyZW50UmFuZ2UuZW5kICsgIi8iCisgICAgICAgICAgICAgICAgICAgICAgICAgICArIGN1cnJlbnRSYW5nZS5sZW5ndGgpOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oKTsKKworICAgICAgICAgICAgLy8gUHJpbnRpbmcgY29udGVudAorICAgICAgICAgICAgZXhjZXB0aW9uID0gY29weVJhbmdlKHJlYWRlciwgd3JpdGVyLCBjdXJyZW50UmFuZ2Uuc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFJhbmdlLmVuZCk7CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmVhZGVyLmNsb3NlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgd3JpdGVyLnByaW50bG4oKTsKKyAgICAgICAgd3JpdGVyLnByaW50KCItLSIgKyBtaW1lU2VwYXJhdGlvbiArICItLSIpOworCisgICAgICAgIC8vIFJldGhyb3cgYW55IGV4Y2VwdGlvbiB0aGF0IGhhcyBvY2N1cnJlZAorICAgICAgICBpZiAoZXhjZXB0aW9uICE9IG51bGwpCisgICAgICAgICAgICB0aHJvdyBleGNlcHRpb247CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvcHkgdGhlIGNvbnRlbnRzIG9mIHRoZSBzcGVjaWZpZWQgaW5wdXQgc3RyZWFtIHRvIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBvdXRwdXQgc3RyZWFtLCBhbmQgZW5zdXJlIHRoYXQgYm90aCBzdHJlYW1zIGFyZSBjbG9zZWQgYmVmb3JlIHJldHVybmluZworICAgICAqIChldmVuIGluIHRoZSBmYWNlIG9mIGFuIGV4Y2VwdGlvbikuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaXN0cmVhbSBUaGUgaW5wdXQgc3RyZWFtIHRvIHJlYWQgZnJvbQorICAgICAqIEBwYXJhbSBvc3RyZWFtIFRoZSBvdXRwdXQgc3RyZWFtIHRvIHdyaXRlIHRvCisgICAgICogQHJldHVybiBFeGNlcHRpb24gd2hpY2ggb2NjdXJyZWQgZHVyaW5nIHByb2Nlc3NpbmcKKyAgICAgKi8KKyAgICBwcml2YXRlIElPRXhjZXB0aW9uIGNvcHlSYW5nZShJbnB1dFN0cmVhbSBpc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZsZXRPdXRwdXRTdHJlYW0gb3N0cmVhbSkgeworCisgICAgICAgIC8vIENvcHkgdGhlIGlucHV0IHN0cmVhbSB0byB0aGUgb3V0cHV0IHN0cmVhbQorICAgICAgICBJT0V4Y2VwdGlvbiBleGNlcHRpb24gPSBudWxsOworICAgICAgICBieXRlIGJ1ZmZlcltdID0gbmV3IGJ5dGVbaW5wdXRdOworICAgICAgICBpbnQgbGVuID0gYnVmZmVyLmxlbmd0aDsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbGVuID0gaXN0cmVhbS5yZWFkKGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgaWYgKGxlbiA9PSAtMSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgb3N0cmVhbS53cml0ZShidWZmZXIsIDAsIGxlbik7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZXhjZXB0aW9uID0gZTsKKyAgICAgICAgICAgICAgICBsZW4gPSAtMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZXhjZXB0aW9uOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDb3B5IHRoZSBjb250ZW50cyBvZiB0aGUgc3BlY2lmaWVkIGlucHV0IHN0cmVhbSB0byB0aGUgc3BlY2lmaWVkCisgICAgICogb3V0cHV0IHN0cmVhbSwgYW5kIGVuc3VyZSB0aGF0IGJvdGggc3RyZWFtcyBhcmUgY2xvc2VkIGJlZm9yZSByZXR1cm5pbmcKKyAgICAgKiAoZXZlbiBpbiB0aGUgZmFjZSBvZiBhbiBleGNlcHRpb24pLgorICAgICAqCisgICAgICogQHBhcmFtIHJlYWRlciBUaGUgcmVhZGVyIHRvIHJlYWQgZnJvbQorICAgICAqIEBwYXJhbSB3cml0ZXIgVGhlIHdyaXRlciB0byB3cml0ZSB0bworICAgICAqIEByZXR1cm4gRXhjZXB0aW9uIHdoaWNoIG9jY3VycmVkIGR1cmluZyBwcm9jZXNzaW5nCisgICAgICovCisgICAgcHJpdmF0ZSBJT0V4Y2VwdGlvbiBjb3B5UmFuZ2UoUmVhZGVyIHJlYWRlciwgUHJpbnRXcml0ZXIgd3JpdGVyKSB7CisKKyAgICAgICAgLy8gQ29weSB0aGUgaW5wdXQgc3RyZWFtIHRvIHRoZSBvdXRwdXQgc3RyZWFtCisgICAgICAgIElPRXhjZXB0aW9uIGV4Y2VwdGlvbiA9IG51bGw7CisgICAgICAgIGNoYXIgYnVmZmVyW10gPSBuZXcgY2hhcltpbnB1dF07CisgICAgICAgIGludCBsZW4gPSBidWZmZXIubGVuZ3RoOworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBsZW4gPSByZWFkZXIucmVhZChidWZmZXIpOworICAgICAgICAgICAgICAgIGlmIChsZW4gPT0gLTEpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZShidWZmZXIsIDAsIGxlbik7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZXhjZXB0aW9uID0gZTsKKyAgICAgICAgICAgICAgICBsZW4gPSAtMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZXhjZXB0aW9uOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDb3B5IHRoZSBjb250ZW50cyBvZiB0aGUgc3BlY2lmaWVkIGlucHV0IHN0cmVhbSB0byB0aGUgc3BlY2lmaWVkCisgICAgICogb3V0cHV0IHN0cmVhbSwgYW5kIGVuc3VyZSB0aGF0IGJvdGggc3RyZWFtcyBhcmUgY2xvc2VkIGJlZm9yZSByZXR1cm5pbmcKKyAgICAgKiAoZXZlbiBpbiB0aGUgZmFjZSBvZiBhbiBleGNlcHRpb24pLgorICAgICAqCisgICAgICogQHBhcmFtIGlzdHJlYW0gVGhlIGlucHV0IHN0cmVhbSB0byByZWFkIGZyb20KKyAgICAgKiBAcGFyYW0gb3N0cmVhbSBUaGUgb3V0cHV0IHN0cmVhbSB0byB3cml0ZSB0bworICAgICAqIEBwYXJhbSBzdGFydCBTdGFydCBvZiB0aGUgcmFuZ2Ugd2hpY2ggd2lsbCBiZSBjb3BpZWQKKyAgICAgKiBAcGFyYW0gZW5kIEVuZCBvZiB0aGUgcmFuZ2Ugd2hpY2ggd2lsbCBiZSBjb3BpZWQKKyAgICAgKiBAcmV0dXJuIEV4Y2VwdGlvbiB3aGljaCBvY2N1cnJlZCBkdXJpbmcgcHJvY2Vzc2luZworICAgICAqLworICAgIHByaXZhdGUgSU9FeGNlcHRpb24gY29weVJhbmdlKElucHV0U3RyZWFtIGlzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmxldE91dHB1dFN0cmVhbSBvc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgc3RhcnQsIGxvbmcgZW5kKSB7CisKKyAgICAgICAgaWYgKGRlYnVnID4gMTApCisgICAgICAgICAgICBsb2coIlNlcnZpbmcgYnl0ZXM6IiArIHN0YXJ0ICsgIi0iICsgZW5kKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgaXN0cmVhbS5za2lwKHN0YXJ0KTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIGU7CisgICAgICAgIH0KKworICAgICAgICBJT0V4Y2VwdGlvbiBleGNlcHRpb24gPSBudWxsOworICAgICAgICBsb25nIGJ5dGVzVG9SZWFkID0gZW5kIC0gc3RhcnQgKyAxOworCisgICAgICAgIGJ5dGUgYnVmZmVyW10gPSBuZXcgYnl0ZVtpbnB1dF07CisgICAgICAgIGludCBsZW4gPSBidWZmZXIubGVuZ3RoOworICAgICAgICB3aGlsZSAoIChieXRlc1RvUmVhZCA+IDApICYmIChsZW4gPj0gYnVmZmVyLmxlbmd0aCkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbGVuID0gaXN0cmVhbS5yZWFkKGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgaWYgKGJ5dGVzVG9SZWFkID49IGxlbikgeworICAgICAgICAgICAgICAgICAgICBvc3RyZWFtLndyaXRlKGJ1ZmZlciwgMCwgbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgYnl0ZXNUb1JlYWQgLT0gbGVuOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG9zdHJlYW0ud3JpdGUoYnVmZmVyLCAwLCAoaW50KSBieXRlc1RvUmVhZCk7CisgICAgICAgICAgICAgICAgICAgIGJ5dGVzVG9SZWFkID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZXhjZXB0aW9uID0gZTsKKyAgICAgICAgICAgICAgICBsZW4gPSAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsZW4gPCBidWZmZXIubGVuZ3RoKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGV4Y2VwdGlvbjsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29weSB0aGUgY29udGVudHMgb2YgdGhlIHNwZWNpZmllZCBpbnB1dCBzdHJlYW0gdG8gdGhlIHNwZWNpZmllZAorICAgICAqIG91dHB1dCBzdHJlYW0sIGFuZCBlbnN1cmUgdGhhdCBib3RoIHN0cmVhbXMgYXJlIGNsb3NlZCBiZWZvcmUgcmV0dXJuaW5nCisgICAgICogKGV2ZW4gaW4gdGhlIGZhY2Ugb2YgYW4gZXhjZXB0aW9uKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWFkZXIgVGhlIHJlYWRlciB0byByZWFkIGZyb20KKyAgICAgKiBAcGFyYW0gd3JpdGVyIFRoZSB3cml0ZXIgdG8gd3JpdGUgdG8KKyAgICAgKiBAcGFyYW0gc3RhcnQgU3RhcnQgb2YgdGhlIHJhbmdlIHdoaWNoIHdpbGwgYmUgY29waWVkCisgICAgICogQHBhcmFtIGVuZCBFbmQgb2YgdGhlIHJhbmdlIHdoaWNoIHdpbGwgYmUgY29waWVkCisgICAgICogQHJldHVybiBFeGNlcHRpb24gd2hpY2ggb2NjdXJyZWQgZHVyaW5nIHByb2Nlc3NpbmcKKyAgICAgKi8KKyAgICBwcml2YXRlIElPRXhjZXB0aW9uIGNvcHlSYW5nZShSZWFkZXIgcmVhZGVyLCBQcmludFdyaXRlciB3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBzdGFydCwgbG9uZyBlbmQpIHsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyLnNraXAoc3RhcnQpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gZTsKKyAgICAgICAgfQorCisgICAgICAgIElPRXhjZXB0aW9uIGV4Y2VwdGlvbiA9IG51bGw7CisgICAgICAgIGxvbmcgYnl0ZXNUb1JlYWQgPSBlbmQgLSBzdGFydCArIDE7CisKKyAgICAgICAgY2hhciBidWZmZXJbXSA9IG5ldyBjaGFyW2lucHV0XTsKKyAgICAgICAgaW50IGxlbiA9IGJ1ZmZlci5sZW5ndGg7CisgICAgICAgIHdoaWxlICggKGJ5dGVzVG9SZWFkID4gMCkgJiYgKGxlbiA+PSBidWZmZXIubGVuZ3RoKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBsZW4gPSByZWFkZXIucmVhZChidWZmZXIpOworICAgICAgICAgICAgICAgIGlmIChieXRlc1RvUmVhZCA+PSBsZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKGJ1ZmZlciwgMCwgbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgYnl0ZXNUb1JlYWQgLT0gbGVuOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZShidWZmZXIsIDAsIChpbnQpIGJ5dGVzVG9SZWFkKTsKKyAgICAgICAgICAgICAgICAgICAgYnl0ZXNUb1JlYWQgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBleGNlcHRpb24gPSBlOworICAgICAgICAgICAgICAgIGxlbiA9IC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGxlbiA8IGJ1ZmZlci5sZW5ndGgpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZXhjZXB0aW9uOworCisgICAgfQorCisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBSYW5nZSBJbm5lciBDbGFzcworCisKKyAgICBwcml2YXRlIGNsYXNzIFJhbmdlIHsKKworICAgICAgICBwdWJsaWMgbG9uZyBzdGFydDsKKyAgICAgICAgcHVibGljIGxvbmcgZW5kOworICAgICAgICBwdWJsaWMgbG9uZyBsZW5ndGg7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFZhbGlkYXRlIHJhbmdlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gdmFsaWRhdGUoKSB7CisgICAgICAgICAgICBpZiAoZW5kID49IGxlbmd0aCkKKyAgICAgICAgICAgICAgICBlbmQgPSBsZW5ndGggLSAxOworICAgICAgICAgICAgcmV0dXJuICggKHN0YXJ0ID49IDApICYmIChlbmQgPj0gMCkgJiYgKHN0YXJ0IDw9IGVuZCkKKyAgICAgICAgICAgICAgICAgICAgICYmIChsZW5ndGggPiAwKSApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcmVjeWNsZSgpIHsKKyAgICAgICAgICAgIHN0YXJ0ID0gMDsKKyAgICAgICAgICAgIGVuZCA9IDA7CisgICAgICAgICAgICBsZW5ndGggPSAwOworICAgICAgICB9CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NlcnZsZXRzL0ludm9rZXJIdHRwUmVxdWVzdC5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NlcnZsZXRzL0ludm9rZXJIdHRwUmVxdWVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2OTE1YzMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc2VydmxldHMvSW52b2tlckh0dHBSZXF1ZXN0LmphdmEKQEAgLTAsMCArMSwxOTggQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc2VydmxldHM7CisKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXI7CisKKworLyoqCisgKiBXcmFwcGVyIGFyb3VuZCBhIDxjb2RlPmphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q8L2NvZGU+CisgKiB1dGlsaXplZCB3aGVuIDxjb2RlPkludm9rZXJTZXJ2bGV0PC9jb2RlPiBwcm9jZXNzZXMgdGhlIGluaXRpYWwgcmVxdWVzdAorICogZm9yIGFuIGludm9rZWQgc2VydmxldC4gIFN1YnNlcXVlbnQgcmVxdWVzdHMgd2lsbCBiZSBtYXBwZWQgZGlyZWN0bHkKKyAqIHRvIHRoZSBzZXJ2bGV0LCBiZWNhdXNlIGEgbmV3IHNlcnZsZXQgbWFwcGluZyB3aWxsIGhhdmUgYmVlbiBjcmVhdGVkLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitjbGFzcyBJbnZva2VySHR0cFJlcXVlc3QgZXh0ZW5kcyBIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyB3cmFwcGVkIHJlcXVlc3QgYXJvdW5kIHRoZSBzcGVjaWZpZWQgc2VydmxldCByZXF1ZXN0LgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCBiZWluZyB3cmFwcGVkCisgICAgICovCisgICAgcHVibGljIEludm9rZXJIdHRwUmVxdWVzdChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworCisgICAgICAgIHN1cGVyKHJlcXVlc3QpOworICAgICAgICB0aGlzLnBhdGhJbmZvID0gcmVxdWVzdC5nZXRQYXRoSW5mbygpOworICAgICAgICB0aGlzLnBhdGhUcmFuc2xhdGVkID0gcmVxdWVzdC5nZXRQYXRoVHJhbnNsYXRlZCgpOworICAgICAgICB0aGlzLnJlcXVlc3RVUkkgPSByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKTsKKyAgICAgICAgdGhpcy5zZXJ2bGV0UGF0aCA9IHJlcXVlc3QuZ2V0U2VydmxldFBhdGgoKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIERlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgaW5mbyA9CisgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLnNlcnZsZXRzLkludm9rZXJIdHRwUmVxdWVzdC8xLjAiOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgcGF0aCBpbmZvcm1hdGlvbiBmb3IgdGhpcyByZXF1ZXN0LgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgcGF0aEluZm8gPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgdHJhbnNsYXRlZCBwYXRoIGluZm9ybWF0aW9uIGZvciB0aGlzIHJlcXVlc3QuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBwYXRoVHJhbnNsYXRlZCA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSByZXF1ZXN0IFVSSSBmb3IgdGhpcyByZXF1ZXN0LgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgcmVxdWVzdFVSSSA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzZXJ2bGV0IHBhdGggZm9yIHRoaXMgcmVxdWVzdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHNlcnZsZXRQYXRoID0gbnVsbDsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEh0dHBTZXJ2bGV0UmVxdWVzdCBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIE92ZXJyaWRlIHRoZSA8Y29kZT5nZXRQYXRoSW5mbygpPC9jb2RlPiBtZXRob2Qgb2YgdGhlIHdyYXBwZWQgcmVxdWVzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhdGhJbmZvKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5wYXRoSW5mbyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIE92ZXJyaWRlIHRoZSA8Y29kZT5nZXRQYXRoVHJhbnNsYXRlZCgpPC9jb2RlPiBtZXRob2Qgb2YgdGhlCisgICAgICogd3JhcHBlZCByZXF1ZXN0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aFRyYW5zbGF0ZWQoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLnBhdGhUcmFuc2xhdGVkKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogT3ZlcnJpZGUgdGhlIDxjb2RlPmdldFJlcXVlc3RVUkkoKTwvY29kZT4gbWV0aG9kIG9mIHRoZSB3cmFwcGVkIHJlcXVlc3QuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRSZXF1ZXN0VVJJKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5yZXF1ZXN0VVJJKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogT3ZlcnJpZGUgdGhlIDxjb2RlPmdldFNlcnZsZXRQYXRoKCk8L2NvZGU+IG1ldGhvZCBvZiB0aGUgd3JhcHBlZAorICAgICAqIHJlcXVlc3QuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTZXJ2bGV0UGF0aCgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMuc2VydmxldFBhdGgpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQYWNrYWdlIE1ldGhvZHMKKworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEluZm8oKSB7CisKKyAgICAgICAgcmV0dXJuIChpbmZvKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBwYXRoIGluZm9ybWF0aW9uIGZvciB0aGlzIHJlcXVlc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0aEluZm8gVGhlIG5ldyBwYXRoIGluZm8KKyAgICAgKi8KKyAgICB2b2lkIHNldFBhdGhJbmZvKFN0cmluZyBwYXRoSW5mbykgeworCisgICAgICAgIHRoaXMucGF0aEluZm8gPSBwYXRoSW5mbzsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSB0cmFuc2xhdGVkIHBhdGggaW5mbyBmb3IgdGhpcyByZXF1ZXN0LgorICAgICAqCisgICAgICogQHBhcmFtIHBhdGhUcmFuc2xhdGVkIFRoZSBuZXcgdHJhbnNsYXRlZCBwYXRoIGluZm8KKyAgICAgKi8KKyAgICB2b2lkIHNldFBhdGhUcmFuc2xhdGVkKFN0cmluZyBwYXRoVHJhbnNsYXRlZCkgeworCisgICAgICAgIHRoaXMucGF0aFRyYW5zbGF0ZWQgPSBwYXRoVHJhbnNsYXRlZDsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSByZXF1ZXN0IFVSSSBmb3IgdGhpcyByZXF1ZXN0LgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3RVUkkgVGhlIG5ldyByZXF1ZXN0IFVSSQorICAgICAqLworICAgIHZvaWQgc2V0UmVxdWVzdFVSSShTdHJpbmcgcmVxdWVzdFVSSSkgeworCisgICAgICAgIHRoaXMucmVxdWVzdFVSSSA9IHJlcXVlc3RVUkk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgc2VydmxldCBwYXRoIGZvciB0aGlzIHJlcXVlc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VydmxldFBhdGggVGhlIG5ldyBzZXJ2bGV0IHBhdGgKKyAgICAgKi8KKyAgICB2b2lkIHNldFNlcnZsZXRQYXRoKFN0cmluZyBzZXJ2bGV0UGF0aCkgeworCisgICAgICAgIHRoaXMuc2VydmxldFBhdGggPSBzZXJ2bGV0UGF0aDsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc2VydmxldHMvSW52b2tlclNlcnZsZXQuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zZXJ2bGV0cy9JbnZva2VyU2VydmxldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhMjlmZGIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc2VydmxldHMvSW52b2tlclNlcnZsZXQuamF2YQpAQCAtMCwwICsxLDQ5NyBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5zZXJ2bGV0czsKKworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5VbmF2YWlsYWJsZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXQ7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGFpbmVyU2VydmxldDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5HbG9iYWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuV3JhcHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuU3RyaW5nTWFuYWdlcjsKKworCisvKioKKyAqIFRoZSBkZWZhdWx0IHNlcnZsZXQtaW52b2tpbmcgc2VydmxldCBmb3IgbW9zdCB3ZWIgYXBwbGljYXRpb25zLAorICogdXNlZCB0byBzZXJ2ZSByZXF1ZXN0cyB0byBzZXJ2bGV0cyB0aGF0IGhhdmUgbm90IGJlZW4gcmVnaXN0ZXJlZAorICogaW4gdGhlIHdlYiBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBJbnZva2VyU2VydmxldAorICAgIGV4dGVuZHMgSHR0cFNlcnZsZXQgaW1wbGVtZW50cyBDb250YWluZXJTZXJ2bGV0IHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBDb250ZXh0IGNvbnRhaW5lciBhc3NvY2lhdGVkIHdpdGggb3VyIHdlYiBhcHBsaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIENvbnRleHQgY29udGV4dCA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBkZWJ1Z2dpbmcgZGV0YWlsIGxldmVsIGZvciB0aGlzIHNlcnZsZXQuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgZGVidWcgPSAwOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc3RyaW5nIG1hbmFnZXIgZm9yIHRoaXMgcGFja2FnZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmdNYW5hZ2VyIHNtID0KKyAgICAgICAgU3RyaW5nTWFuYWdlci5nZXRNYW5hZ2VyKENvbnN0YW50cy5QYWNrYWdlKTsKKworCisgICAgLyoqCisgICAgICogVGhlIFdyYXBwZXIgY29udGFpbmVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNlcnZsZXQuCisgICAgICovCisgICAgcHJpdmF0ZSBXcmFwcGVyIHdyYXBwZXIgPSBudWxsOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb250YWluZXJTZXJ2bGV0IE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBXcmFwcGVyIHdpdGggd2hpY2ggd2UgYXJlIGFzc29jaWF0ZWQuCisgICAgICovCisgICAgcHVibGljIFdyYXBwZXIgZ2V0V3JhcHBlcigpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMud3JhcHBlcik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgV3JhcHBlciB3aXRoIHdoaWNoIHdlIGFyZSBhc3NvY2lhdGVkLgorICAgICAqCisgICAgICogQHBhcmFtIHdyYXBwZXIgVGhlIG5ldyB3cmFwcGVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0V3JhcHBlcihXcmFwcGVyIHdyYXBwZXIpIHsKKworICAgICAgICB0aGlzLndyYXBwZXIgPSB3cmFwcGVyOworICAgICAgICBpZiAod3JhcHBlciA9PSBudWxsKQorICAgICAgICAgICAgY29udGV4dCA9IG51bGw7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGNvbnRleHQgPSAoQ29udGV4dCkgd3JhcHBlci5nZXRQYXJlbnQoKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIEZpbmFsaXplIHRoaXMgc2VydmxldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkZXN0cm95KCkgeworCisgICAgICAgIDsgICAgICAgLy8gTm8gYWN0aW9ucyBuZWNlc3NhcnkKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUHJvY2VzcyBhIEdFVCByZXF1ZXN0IGZvciB0aGUgc3BlY2lmaWVkIHJlc291cmNlLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgc2VydmxldCByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQtc3BlY2lmaWVkIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgc2VydmVSZXF1ZXN0KHJlcXVlc3QsIHJlc3BvbnNlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUHJvY2VzcyBhIEhFQUQgcmVxdWVzdCBmb3IgdGhlIHNwZWNpZmllZCByZXNvdXJjZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIHNlcnZsZXQgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0LXNwZWNpZmllZCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkb0hlYWQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgc2VydmVSZXF1ZXN0KHJlcXVlc3QsIHJlc3BvbnNlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUHJvY2VzcyBhIFBPU1QgcmVxdWVzdCBmb3IgdGhlIHNwZWNpZmllZCByZXNvdXJjZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIHNlcnZsZXQgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0LXNwZWNpZmllZCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkb1Bvc3QoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgc2VydmVSZXF1ZXN0KHJlcXVlc3QsIHJlc3BvbnNlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSB0aGlzIHNlcnZsZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgaW5pdCgpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICAvLyBFbnN1cmUgdGhhdCBvdXIgQ29udGFpbmVyU2VydmxldCBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBzZXQKKyAgICAgICAgaWYgKCh3cmFwcGVyID09IG51bGwpIHx8IChjb250ZXh0ID09IG51bGwpKQorICAgICAgICAgICAgdGhyb3cgbmV3IFVuYXZhaWxhYmxlRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygiaW52b2tlclNlcnZsZXQubm9XcmFwcGVyIikpOworCisgICAgICAgIC8vIFNldCBvdXIgcHJvcGVydGllcyBmcm9tIHRoZSBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzCisgICAgICAgIFN0cmluZyB2YWx1ZSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB2YWx1ZSA9IGdldFNlcnZsZXRDb25maWcoKS5nZXRJbml0UGFyYW1ldGVyKCJkZWJ1ZyIpOworICAgICAgICAgICAgZGVidWcgPSBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIDsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGVidWcgPj0gMSkKKyAgICAgICAgICAgIGxvZygiaW5pdDogQXNzb2NpYXRlZCB3aXRoIENvbnRleHQgJyIgKyBjb250ZXh0LmdldFBhdGgoKSArICInIik7CisKKyAgICB9CisKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJpdmF0ZSBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFNlcnZlIHRoZSBzcGVjaWZpZWQgcmVxdWVzdCwgY3JlYXRpbmcgdGhlIGNvcnJlc3BvbmRpbmcgcmVzcG9uc2UuCisgICAgICogQWZ0ZXIgdGhlIGZpcnN0IHRpbWUgYSBwYXJ0aWN1bGFyIHNlcnZsZXQgY2xhc3MgaXMgcmVxdWVzdGVkLCBpdCB3aWxsCisgICAgICogYmUgc2VydmVkIGRpcmVjdGx5IChsaWtlIGFueSByZWdpc3RlcmVkIHNlcnZsZXQpIGJlY2F1c2UgaXQgd2lsbCBoYXZlCisgICAgICogYmVlbiByZWdpc3RlcmVkIGFuZCBtYXBwZWQgaW4gb3VyIGFzc29jaWF0ZWQgQ29udGV4dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIHNlcnZsZXQgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0LXNwZWNpZmllZCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXJ2ZVJlcXVlc3QoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gRGlzYWxsb3cgY2FsbGluZyB0aGlzIHNlcnZsZXQgdmlhIGEgbmFtZWQgZGlzcGF0Y2hlcgorICAgICAgICBpZiAocmVxdWVzdC5nZXRBdHRyaWJ1dGUoR2xvYmFscy5OQU1FRF9ESVNQQVRDSEVSX0FUVFIpICE9IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoImludm9rZXJTZXJ2bGV0Lm5vdE5hbWVkIikpOworCisgICAgICAgIC8vIElkZW50aWZ5IHRoZSBpbnB1dCBwYXJhbWV0ZXJzIGFuZCBvdXIgImluY2x1ZGVkIiBzdGF0ZQorICAgICAgICBTdHJpbmcgaW5SZXF1ZXN0VVJJID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIGluU2VydmxldFBhdGggPSBudWxsOworICAgICAgICBTdHJpbmcgaW5QYXRoSW5mbyA9IG51bGw7CisgICAgICAgIGJvb2xlYW4gaW5jbHVkZWQgPQorICAgICAgICAgICAgKHJlcXVlc3QuZ2V0QXR0cmlidXRlKEdsb2JhbHMuSU5DTFVERV9SRVFVRVNUX1VSSV9BVFRSKSAhPSBudWxsKTsKKworICAgICAgICBpZiAoaW5jbHVkZWQpIHsKKyAgICAgICAgICAgIGluUmVxdWVzdFVSSSA9CisgICAgICAgICAgICAgICAgKFN0cmluZykgcmVxdWVzdC5nZXRBdHRyaWJ1dGUoR2xvYmFscy5JTkNMVURFX1JFUVVFU1RfVVJJX0FUVFIpOworICAgICAgICAgICAgaW5TZXJ2bGV0UGF0aCA9CisgICAgICAgICAgICAgICAgKFN0cmluZykgcmVxdWVzdC5nZXRBdHRyaWJ1dGUoR2xvYmFscy5JTkNMVURFX1NFUlZMRVRfUEFUSF9BVFRSKTsKKyAgICAgICAgICAgIGluUGF0aEluZm8gPQorICAgICAgICAgICAgICAgIChTdHJpbmcpIHJlcXVlc3QuZ2V0QXR0cmlidXRlKEdsb2JhbHMuSU5DTFVERV9QQVRIX0lORk9fQVRUUik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpblJlcXVlc3RVUkkgPSByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKTsKKyAgICAgICAgICAgIGluU2VydmxldFBhdGggPSByZXF1ZXN0LmdldFNlcnZsZXRQYXRoKCk7CisgICAgICAgICAgICBpblBhdGhJbmZvID0gcmVxdWVzdC5nZXRQYXRoSW5mbygpOworICAgICAgICB9CisgICAgICAgIGlmIChkZWJ1ZyA+PSAxKSB7CisgICAgICAgICAgICBsb2coImluY2x1ZGVkPSciICsgaW5jbHVkZWQgKyAiJywgcmVxdWVzdFVSST0nIiArCisgICAgICAgICAgICAgICAgaW5SZXF1ZXN0VVJJICsgIiciKTsKKyAgICAgICAgICAgIGxvZygiICBzZXJ2bGV0UGF0aD0nIiArIGluU2VydmxldFBhdGggKyAiJywgcGF0aEluZm89JyIgKworICAgICAgICAgICAgICAgIGluUGF0aEluZm8gKyAiJyIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIGEgc2VydmxldCBuYW1lIG9yIGNsYXNzIG5hbWUgd2FzIHNwZWNpZmllZAorICAgICAgICBpZiAoaW5QYXRoSW5mbyA9PSBudWxsKSB7CisgICAgICAgICAgICBpZiAoZGVidWcgPj0gMSkKKyAgICAgICAgICAgICAgICBsb2coIkludmFsaWQgcGF0aEluZm8gJyIgKyBpblBhdGhJbmZvICsgIiciKTsKKyAgICAgICAgICAgIGlmIChpbmNsdWRlZCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJpbnZva2VyU2VydmxldC5pbnZhbGlkUGF0aCIsIGluUmVxdWVzdFVSSSkpOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfTk9UX0ZPVU5ELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblJlcXVlc3RVUkkpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIElkZW50aWZ5IHRoZSBvdXRnb2luZyBzZXJ2bGV0IG5hbWUgb3IgY2xhc3MsIGFuZCBvdXRnb2luZyBwYXRoIGluZm8KKyAgICAgICAgU3RyaW5nIHBhdGhJbmZvID0gaW5QYXRoSW5mbzsKKyAgICAgICAgU3RyaW5nIHNlcnZsZXRDbGFzcyA9IHBhdGhJbmZvLnN1YnN0cmluZygxKTsKKyAgICAgICAgaW50IHNsYXNoID0gc2VydmxldENsYXNzLmluZGV4T2YoJy8nKTsKKyAgICAgICAgLy8gICAgICAgIGlmIChkZWJ1ZyA+PSAyKQorICAgICAgICAvLyAgICAgICAgICAgIGxvZygiICBDYWxjdWxhdGluZyB3aXRoIHNlcnZsZXRDbGFzcz0nIiArIHNlcnZsZXRDbGFzcyArCisgICAgICAgIC8vICAgICAgICAgICAgICAgICInLCBwYXRoSW5mbz0nIiArIHBhdGhJbmZvICsgIicsIHNsYXNoPSIgKyBzbGFzaCk7CisgICAgICAgIGlmIChzbGFzaCA+PSAwKSB7CisgICAgICAgICAgICBwYXRoSW5mbyA9IHNlcnZsZXRDbGFzcy5zdWJzdHJpbmcoc2xhc2gpOworICAgICAgICAgICAgc2VydmxldENsYXNzID0gc2VydmxldENsYXNzLnN1YnN0cmluZygwLCBzbGFzaCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwYXRoSW5mbyA9ICIiOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNlcnZsZXRDbGFzcy5zdGFydHNXaXRoKCJvcmcuYXBhY2hlLmNhdGFsaW5hIikpIHsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcihIdHRwU2VydmxldFJlc3BvbnNlLlNDX05PVF9GT1VORCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblJlcXVlc3RVUkkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRlYnVnID49IDEpCisgICAgICAgICAgICBsb2coIlByb2Nlc3Npbmcgc2VydmxldCAnIiArIHNlcnZsZXRDbGFzcyArCisgICAgICAgICAgICAgICAgIicgd2l0aCBwYXRoIGluZm8gJyIgKyBwYXRoSW5mbyArICInIik7CisgICAgICAgIFN0cmluZyBuYW1lID0gIm9yZy5hcGFjaGUuY2F0YWxpbmEuSU5WT0tFUi4iICsgc2VydmxldENsYXNzOworICAgICAgICBTdHJpbmcgcGF0dGVybiA9IGluU2VydmxldFBhdGggKyAiLyIgKyBzZXJ2bGV0Q2xhc3MgKyAiLyoiOworICAgICAgICBXcmFwcGVyIHdyYXBwZXIgPSBudWxsOworCisgICAgICAgIC8vIFN5bmNocm9uaXplIHRvIGF2b2lkIHJhY2UgY29uZGl0aW9ucyB3aGVuIG11bHRpcGxlIHJlcXVlc3RzCisgICAgICAgIC8vIHRyeSB0byBpbml0aWFsaXplIHRoZSBzYW1lIHNlcnZsZXQgYXQgdGhlIHNhbWUgdGltZQorICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKworICAgICAgICAgICAgLy8gQXJlIHdlIHJlZmVyZW5jaW5nIGFuIGV4aXN0aW5nIHNlcnZsZXQgY2xhc3Mgb3IgbmFtZT8KKyAgICAgICAgICAgIHdyYXBwZXIgPSAoV3JhcHBlcikgY29udGV4dC5maW5kQ2hpbGQoc2VydmxldENsYXNzKTsKKyAgICAgICAgICAgIGlmICh3cmFwcGVyID09IG51bGwpCisgICAgICAgICAgICAgICAgd3JhcHBlciA9IChXcmFwcGVyKSBjb250ZXh0LmZpbmRDaGlsZChuYW1lKTsKKyAgICAgICAgICAgIGlmICh3cmFwcGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgYWN0dWFsU2VydmxldENsYXNzID0gd3JhcHBlci5nZXRTZXJ2bGV0Q2xhc3MoKTsKKyAgICAgICAgICAgICAgICBpZiAoKGFjdHVhbFNlcnZsZXRDbGFzcyAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAmJiAoYWN0dWFsU2VydmxldENsYXNzLnN0YXJ0c1dpdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICgib3JnLmFwYWNoZS5jYXRhbGluYSIpKSkgeworICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19OT1RfRk9VTkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblJlcXVlc3RVUkkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChkZWJ1ZyA+PSAxKQorICAgICAgICAgICAgICAgICAgICBsb2coIlVzaW5nIHdyYXBwZXIgZm9yIHNlcnZsZXQgJyIgKworICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlci5nZXROYW1lKCkgKyAiJyB3aXRoIG1hcHBpbmcgJyIgKworICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybiArICInIik7CisgICAgICAgICAgICAgICAgY29udGV4dC5hZGRTZXJ2bGV0TWFwcGluZyhwYXR0ZXJuLCB3cmFwcGVyLmdldE5hbWUoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIE5vLCBjcmVhdGUgYSBuZXcgd3JhcHBlciBmb3IgdGhlIHNwZWNpZmllZCBzZXJ2bGV0IGNsYXNzCisgICAgICAgICAgICBlbHNlIHsKKworICAgICAgICAgICAgICAgIGlmIChkZWJ1ZyA+PSAxKQorICAgICAgICAgICAgICAgICAgICBsb2coIkNyZWF0aW5nIHdyYXBwZXIgZm9yICciICsgc2VydmxldENsYXNzICsKKyAgICAgICAgICAgICAgICAgICAgICAgICInIHdpdGggbWFwcGluZyAnIiArIHBhdHRlcm4gKyAiJyIpOworCisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgd3JhcHBlciA9IGNvbnRleHQuY3JlYXRlV3JhcHBlcigpOworICAgICAgICAgICAgICAgICAgICB3cmFwcGVyLnNldE5hbWUobmFtZSk7CisgICAgICAgICAgICAgICAgICAgIHdyYXBwZXIuc2V0TG9hZE9uU3RhcnR1cCgxKTsKKyAgICAgICAgICAgICAgICAgICAgd3JhcHBlci5zZXRTZXJ2bGV0Q2xhc3Moc2VydmxldENsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dC5hZGRDaGlsZCh3cmFwcGVyKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dC5hZGRTZXJ2bGV0TWFwcGluZyhwYXR0ZXJuLCBuYW1lKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgICAgICBsb2coc20uZ2V0U3RyaW5nKCJpbnZva2VyU2VydmxldC5jYW5ub3RDcmVhdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluUmVxdWVzdFVSSSksIHQpOworICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnJlbW92ZVNlcnZsZXRNYXBwaW5nKHBhdHRlcm4pOworICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnJlbW92ZUNoaWxkKHdyYXBwZXIpOworICAgICAgICAgICAgICAgICAgICBpZiAoaW5jbHVkZWQpCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoImludm9rZXJTZXJ2bGV0LmNhbm5vdENyZWF0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblJlcXVlc3RVUkkpLCB0KTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19OT1RfRk9VTkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5SZXF1ZXN0VVJJKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgLy8gQ3JlYXRlIGEgcmVxdWVzdCB3cmFwcGVyIHRvIHBhc3Mgb24gdG8gdGhlIGludm9rZWQgc2VydmxldAorICAgICAgICBJbnZva2VySHR0cFJlcXVlc3Qgd3JlcXVlc3QgPQorICAgICAgICAgICAgbmV3IEludm9rZXJIdHRwUmVxdWVzdChyZXF1ZXN0KTsKKyAgICAgICAgd3JlcXVlc3Quc2V0UmVxdWVzdFVSSShpblJlcXVlc3RVUkkpOworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKGluU2VydmxldFBhdGgpOworICAgICAgICBzYi5hcHBlbmQoIi8iKTsKKyAgICAgICAgc2IuYXBwZW5kKHNlcnZsZXRDbGFzcyk7CisgICAgICAgIHdyZXF1ZXN0LnNldFNlcnZsZXRQYXRoKHNiLnRvU3RyaW5nKCkpOworICAgICAgICBpZiAoKHBhdGhJbmZvID09IG51bGwpIHx8IChwYXRoSW5mby5sZW5ndGgoKSA8IDEpKSB7CisgICAgICAgICAgICB3cmVxdWVzdC5zZXRQYXRoSW5mbyhudWxsKTsKKyAgICAgICAgICAgIHdyZXF1ZXN0LnNldFBhdGhUcmFuc2xhdGVkKG51bGwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgd3JlcXVlc3Quc2V0UGF0aEluZm8ocGF0aEluZm8pOworICAgICAgICAgICAgd3JlcXVlc3Quc2V0UGF0aFRyYW5zbGF0ZWQKKyAgICAgICAgICAgICAgICAoZ2V0U2VydmxldENvbnRleHQoKS5nZXRSZWFsUGF0aChwYXRoSW5mbykpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQWxsb2NhdGUgYSBzZXJ2bGV0IGluc3RhbmNlIHRvIHBlcmZvcm0gdGhpcyByZXF1ZXN0CisgICAgICAgIFNlcnZsZXQgaW5zdGFuY2UgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gICAgICAgICAgICBpZiAoZGVidWcgPj0gMikKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIGxvZygiICBBbGxvY2F0aW5nIHNlcnZsZXQgaW5zdGFuY2UiKTsKKyAgICAgICAgICAgIGluc3RhbmNlID0gd3JhcHBlci5hbGxvY2F0ZSgpOworICAgICAgICB9IGNhdGNoIChTZXJ2bGV0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZyhzbS5nZXRTdHJpbmcoImludm9rZXJTZXJ2bGV0LmFsbG9jYXRlIiwgaW5SZXF1ZXN0VVJJKSwgZSk7CisgICAgICAgICAgICBjb250ZXh0LnJlbW92ZVNlcnZsZXRNYXBwaW5nKHBhdHRlcm4pOworICAgICAgICAgICAgY29udGV4dC5yZW1vdmVDaGlsZCh3cmFwcGVyKTsKKyAgICAgICAgICAgIFRocm93YWJsZSByb290Q2F1c2UgPSBlLmdldFJvb3RDYXVzZSgpOworICAgICAgICAgICAgaWYgKHJvb3RDYXVzZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJvb3RDYXVzZSA9IGU7CisgICAgICAgICAgICBpZiAocm9vdENhdXNlIGluc3RhbmNlb2YgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcihIdHRwU2VydmxldFJlc3BvbnNlLlNDX05PVF9GT1VORCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5SZXF1ZXN0VVJJKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9IGVsc2UgaWYgKHJvb3RDYXVzZSBpbnN0YW5jZW9mIElPRXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgKElPRXhjZXB0aW9uKSByb290Q2F1c2U7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHJvb3RDYXVzZSBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbikgcm9vdENhdXNlOworICAgICAgICAgICAgfSBlbHNlIGlmIChyb290Q2F1c2UgaW5zdGFuY2VvZiBTZXJ2bGV0RXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgKFNlcnZsZXRFeGNlcHRpb24pIHJvb3RDYXVzZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygiaW52b2tlclNlcnZsZXQuYWxsb2NhdGUiLCBpblJlcXVlc3RVUkkpLAorICAgICAgICAgICAgICAgICAgICAgcm9vdENhdXNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKKyAgICAgICAgICAgIGxvZyhzbS5nZXRTdHJpbmcoImludm9rZXJTZXJ2bGV0LmFsbG9jYXRlIiwgaW5SZXF1ZXN0VVJJKSwgZSk7CisgICAgICAgICAgICBjb250ZXh0LnJlbW92ZVNlcnZsZXRNYXBwaW5nKHBhdHRlcm4pOworICAgICAgICAgICAgY29udGV4dC5yZW1vdmVDaGlsZCh3cmFwcGVyKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygiaW52b2tlclNlcnZsZXQuYWxsb2NhdGUiLCBpblJlcXVlc3RVUkkpLCBlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEFmdGVyIGxvYWRpbmcgdGhlIHdyYXBwZXIsIHJlc3RvcmUgc29tZSBvZiB0aGUgZmllbGRzIHdoZW4gaW5jbHVkaW5nCisgICAgICAgIGlmIChpbmNsdWRlZCkgeworICAgICAgICAgICAgd3JlcXVlc3Quc2V0UmVxdWVzdFVSSShyZXF1ZXN0LmdldFJlcXVlc3RVUkkoKSk7CisgICAgICAgICAgICB3cmVxdWVzdC5zZXRQYXRoSW5mbyhyZXF1ZXN0LmdldFBhdGhJbmZvKCkpOworICAgICAgICAgICAgd3JlcXVlc3Quc2V0U2VydmxldFBhdGgocmVxdWVzdC5nZXRTZXJ2bGV0UGF0aCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEludm9rZSB0aGUgc2VydmljZSgpIG1ldGhvZCBvZiB0aGUgYWxsb2NhdGVkIHNlcnZsZXQKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN0cmluZyBqc3BGaWxlID0gd3JhcHBlci5nZXRKc3BGaWxlKCk7CisgICAgICAgICAgICBpZiAoanNwRmlsZSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlcXVlc3Quc2V0QXR0cmlidXRlKEdsb2JhbHMuSlNQX0ZJTEVfQVRUUiwganNwRmlsZSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmVxdWVzdC5yZW1vdmVBdHRyaWJ1dGUoR2xvYmFscy5KU1BfRklMRV9BVFRSKTsKKyAgICAgICAgICAgIHJlcXVlc3Quc2V0QXR0cmlidXRlKEdsb2JhbHMuSU5WT0tFRF9BVFRSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5nZXRTZXJ2bGV0UGF0aCgpKTsKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgaWYgKGRlYnVnID49IDIpCisgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICBsb2coIiAgQ2FsbGluZyBzZXJ2aWNlKCkgbWV0aG9kLCBqc3BGaWxlPSIgKworICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgIGpzcEZpbGUpOworICAgICAgICAgICAgaW5zdGFuY2Uuc2VydmljZSh3cmVxdWVzdCwgcmVzcG9uc2UpOworICAgICAgICAgICAgcmVxdWVzdC5yZW1vdmVBdHRyaWJ1dGUoR2xvYmFscy5JTlZPS0VEX0FUVFIpOworICAgICAgICAgICAgcmVxdWVzdC5yZW1vdmVBdHRyaWJ1dGUoR2xvYmFscy5KU1BfRklMRV9BVFRSKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gICAgICAgICAgICBpZiAoZGVidWcgPj0gMikKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIGxvZygiICBzZXJ2aWNlKCkgbWV0aG9kIElPRXhjZXB0aW9uIiwgZSk7CisgICAgICAgICAgICByZXF1ZXN0LnJlbW92ZUF0dHJpYnV0ZShHbG9iYWxzLklOVk9LRURfQVRUUik7CisgICAgICAgICAgICByZXF1ZXN0LnJlbW92ZUF0dHJpYnV0ZShHbG9iYWxzLkpTUF9GSUxFX0FUVFIpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB3cmFwcGVyLmRlYWxsb2NhdGUoaW5zdGFuY2UpOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGYpIHsKKyAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9IGNhdGNoIChVbmF2YWlsYWJsZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyAgICAgICAgICAgIGlmIChkZWJ1ZyA+PSAyKQorICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgbG9nKCIgIHNlcnZpY2UoKSBtZXRob2QgVW5hdmFpbGFibGVFeGNlcHRpb24iLCBlKTsKKyAgICAgICAgICAgIGNvbnRleHQucmVtb3ZlU2VydmxldE1hcHBpbmcocGF0dGVybik7CisgICAgICAgICAgICByZXF1ZXN0LnJlbW92ZUF0dHJpYnV0ZShHbG9iYWxzLklOVk9LRURfQVRUUik7CisgICAgICAgICAgICByZXF1ZXN0LnJlbW92ZUF0dHJpYnV0ZShHbG9iYWxzLkpTUF9GSUxFX0FUVFIpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB3cmFwcGVyLmRlYWxsb2NhdGUoaW5zdGFuY2UpOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGYpIHsKKyAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9IGNhdGNoIChTZXJ2bGV0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgaWYgKGRlYnVnID49IDIpCisgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICBsb2coIiAgc2VydmljZSgpIG1ldGhvZCBTZXJ2bGV0RXhjZXB0aW9uIiwgZSk7CisgICAgICAgICAgICByZXF1ZXN0LnJlbW92ZUF0dHJpYnV0ZShHbG9iYWxzLklOVk9LRURfQVRUUik7CisgICAgICAgICAgICByZXF1ZXN0LnJlbW92ZUF0dHJpYnV0ZShHbG9iYWxzLkpTUF9GSUxFX0FUVFIpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB3cmFwcGVyLmRlYWxsb2NhdGUoaW5zdGFuY2UpOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGYpIHsKKyAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgaWYgKGRlYnVnID49IDIpCisgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICBsb2coIiAgc2VydmljZSgpIG1ldGhvZCBSdW50aW1lRXhjZXB0aW9uIiwgZSk7CisgICAgICAgICAgICByZXF1ZXN0LnJlbW92ZUF0dHJpYnV0ZShHbG9iYWxzLklOVk9LRURfQVRUUik7CisgICAgICAgICAgICByZXF1ZXN0LnJlbW92ZUF0dHJpYnV0ZShHbG9iYWxzLkpTUF9GSUxFX0FUVFIpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB3cmFwcGVyLmRlYWxsb2NhdGUoaW5zdGFuY2UpOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGYpIHsKKyAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgeworICAgICAgICAgICAgLy8gICAgICAgICAgICBpZiAoZGVidWcgPj0gMikKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIGxvZygiICBzZXJ2aWNlKCkgbWV0aG9kIFRocm93YWJsZSIsIGUpOworICAgICAgICAgICAgcmVxdWVzdC5yZW1vdmVBdHRyaWJ1dGUoR2xvYmFscy5JTlZPS0VEX0FUVFIpOworICAgICAgICAgICAgcmVxdWVzdC5yZW1vdmVBdHRyaWJ1dGUoR2xvYmFscy5KU1BfRklMRV9BVFRSKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgd3JhcHBlci5kZWFsbG9jYXRlKGluc3RhbmNlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBmKSB7CisgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24oIkludm9rZXIgc2VydmljZSgpIGV4Y2VwdGlvbiIsIGUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gRGVhbGxvY2F0ZSB0aGUgYWxsb2NhdGVkIHNlcnZsZXQgaW5zdGFuY2UKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgaWYgKGRlYnVnID49IDIpCisgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICBsb2coIiAgZGVhbGxvY2F0ZSBzZXJ2bGV0IGluc3RhbmNlIik7CisgICAgICAgICAgICB3cmFwcGVyLmRlYWxsb2NhdGUoaW5zdGFuY2UpOworICAgICAgICB9IGNhdGNoIChTZXJ2bGV0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZyhzbS5nZXRTdHJpbmcoImludm9rZXJTZXJ2bGV0LmRlYWxsb2NhdGUiLCBpblJlcXVlc3RVUkkpLCBlKTsKKyAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CisgICAgICAgICAgICBsb2coc20uZ2V0U3RyaW5nKCJpbnZva2VyU2VydmxldC5kZWFsbG9jYXRlIiwgaW5SZXF1ZXN0VVJJKSwgZSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoImludm9rZXJTZXJ2bGV0LmRlYWxsb2NhdGUiLCBpblJlcXVlc3RVUkkpLCBlKTsKKyAgICAgICAgfQorCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zZXJ2bGV0cy9Mb2NhbFN0cmluZ3MucHJvcGVydGllcyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zZXJ2bGV0cy9Mb2NhbFN0cmluZ3MucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzljMjFiCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NlcnZsZXRzL0xvY2FsU3RyaW5ncy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTggQEAKK2RlZmF1bHRzZXJ2bGV0LmRpcmVjdG9yeWxpc3Rpbmdmb3I9RGlyZWN0b3J5IExpc3RpbmcgZm9yOgorZGVmYXVsdHNlcnZsZXQudXB0bz1VcCB0bzoKK2RlZmF1bHRzZXJ2bGV0LnN1YmRpcmVjdG9yaWVzPVN1YmRpcmVjdG9yaWVzOgorZGVmYXVsdHNlcnZsZXQuZmlsZXM9RmlsZXM6CitpbnZva2VyU2VydmxldC5hbGxvY2F0ZT1DYW5ub3QgYWxsb2NhdGUgc2VydmxldCBpbnN0YW5jZSBmb3IgcGF0aCB7MH0KK2ludm9rZXJTZXJ2bGV0LmNhbm5vdENyZWF0ZT1DYW5ub3QgY3JlYXRlIHNlcnZsZXQgd3JhcHBlciBmb3IgcGF0aCB7MH0KK2ludm9rZXJTZXJ2bGV0LmRlYWxsb2NhdGU9Q2Fubm90IGRlYWxsb2NhdGUgc2VydmxldCBpbnN0YW5jZSBmb3IgcGF0aCB7MH0KK2ludm9rZXJTZXJ2bGV0LmludmFsaWRQYXRoPU5vIHNlcnZsZXQgbmFtZSBvciBjbGFzcyB3YXMgc3BlY2lmaWVkIGluIHBhdGggezB9CitpbnZva2VyU2VydmxldC5ub3ROYW1lZD1DYW5ub3QgY2FsbCBpbnZva2VyIHNlcnZsZXQgd2l0aCBhIG5hbWVkIGRpc3BhdGNoZXIKK2ludm9rZXJTZXJ2bGV0Lm5vV3JhcHBlcj1Db250YWluZXIgaGFzIG5vdCBjYWxsZWQgc2V0V3JhcHBlcigpIGZvciB0aGlzIHNlcnZsZXQKK3dlYmRhdnNlcnZsZXQuamF4cGZhaWxlZD1KQVhQIGluaXRpYWxpemF0aW9uIGZhaWxlZAorZGlyZWN0b3J5LmZpbGVuYW1lPUZpbGVuYW1lCitkaXJlY3RvcnkubGFzdE1vZGlmaWVkPUxhc3QgTW9kaWZpZWQKK2RpcmVjdG9yeS5wYXJlbnQ9VXAgVG8gezB9CitkaXJlY3Rvcnkuc2l6ZT1TaXplCitkaXJlY3RvcnkudGl0bGU9RGlyZWN0b3J5IExpc3RpbmcgRm9yIHswfQorZGlyZWN0b3J5LnZlcnNpb249VG9tY2F0IENhdGFsaW5hIHZlcnNpb24gNC4wCisKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zZXJ2bGV0cy9Mb2NhbFN0cmluZ3NfZXMucHJvcGVydGllcyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zZXJ2bGV0cy9Mb2NhbFN0cmluZ3NfZXMucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjU1ZjYzCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NlcnZsZXRzL0xvY2FsU3RyaW5nc19lcy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTggQEAKK2RlZmF1bHRzZXJ2bGV0LmRpcmVjdG9yeWxpc3Rpbmdmb3I9TGlzdGFkbyBkZSBEaXJlY3RvcmlvIHBhcmE6CitkZWZhdWx0c2VydmxldC51cHRvPUF0cuFzIGE6CitkZWZhdWx0c2VydmxldC5zdWJkaXJlY3Rvcmllcz1TdWJkaXJlY3RvcmlvczoKK2RlZmF1bHRzZXJ2bGV0LmZpbGVzPUFyY2hpdm9zOgoraW52b2tlclNlcnZsZXQuYWxsb2NhdGU9Tm8gcHVlZG8gcmVzZXJ2YXIgZXNwYWNpbyBwYXJhIGluc3RhbmNpYSBkZSBzZXJ2bGV0IHBhcmEgdHJheWVjdG9yaWEgezB9CitpbnZva2VyU2VydmxldC5jYW5ub3RDcmVhdGU9Tm8gcHVlZG8gY3JlYXIgYXJyb3BhZG9yICh3cmFwcGVyKSBkZSBzZXJ2bGV0IHBhcmEgdHJheWVjdG9yaWEgezB9CitpbnZva2VyU2VydmxldC5kZWFsbG9jYXRlPU5vIHB1ZWRvIHJlY3VwZXJhciBpbnN0YW5jaWEgZGUgc2VydmxldCBwYXJhIHRyYXllY3RvcmlhIHswfQoraW52b2tlclNlcnZsZXQuaW52YWxpZFBhdGg9Tm8gc2UgaGEgZXNwZWNpZmljYWRvIG5vbWJyZSBkZSBzZXJ2bGV0IG8gY2xhc2UgZW4gdHJheWVjdG9yaWEgezB9CitpbnZva2VyU2VydmxldC5ub3ROYW1lZD1ObyBwdWVkbyBsbGFtYXIgYSBzZXJ2bGV0IGludm9jYWRvciBtZWRpYW50ZSB1biBkZXNwYWNoYWRvciBub21icmFkbyAobmFtZWQpCitpbnZva2VyU2VydmxldC5ub1dyYXBwZXI9RWwgQ29udGVuZWRvciBubyBoYSBsbGFtYWRvIGEgc2V0V3JhcHBlcigpIHBhcmEgZXN0ZSBzZXJ2bGV0Cit3ZWJkYXZzZXJ2bGV0LmpheHBmYWlsZWQ9RmFsbPMgbGEgaW5pY2lhbGl6YWNp824gZGUgSkFYUAorZGlyZWN0b3J5LmZpbGVuYW1lPU5vbWJyZSBkZSBBcmNoaXZvCitkaXJlY3RvcnkubGFzdE1vZGlmaWVkPdpsdGltYSBNb2RpZmljYWNp824KK2RpcmVjdG9yeS5wYXJlbnQ9QXRy4XMgQSB7MH0KK2RpcmVjdG9yeS5zaXplPU1lZGlkYQorZGlyZWN0b3J5LnRpdGxlPUxpc3RhZG8gZGUgRGlyZWN0b3JpbyBQYXJhIHswfQorZGlyZWN0b3J5LnZlcnNpb249VG9tY2F0IENhdGFsaW5hIHZlcnNp824gNC4wCisKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zZXJ2bGV0cy9Mb2NhbFN0cmluZ3NfZnIucHJvcGVydGllcyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zZXJ2bGV0cy9Mb2NhbFN0cmluZ3NfZnIucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjFhMWIyCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NlcnZsZXRzL0xvY2FsU3RyaW5nc19mci5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTggQEAKK2RlZmF1bHRzZXJ2bGV0LmRpcmVjdG9yeWxpc3Rpbmdmb3I9TGlzdGUgZHUgculwZXJ0b2lyZSBwb3VyIDoKK2RlZmF1bHRzZXJ2bGV0LnVwdG89SnVzcXUnJ+A6CitkZWZhdWx0c2VydmxldC5zdWJkaXJlY3Rvcmllcz1Tb3VzLXLpcGVydG9pcmVzOgorZGVmYXVsdHNlcnZsZXQuZmlsZXM9RmljaGllcnM6CitpbnZva2VyU2VydmxldC5hbGxvY2F0ZT1JbXBvc3NpYmxlIGQnJ2FsbG91ZXIgdW5lIGluc3RhbmNlIGRlIHNlcnZsZXQgcG91ciBsZSBjaGVtaW4gezB9CitpbnZva2VyU2VydmxldC5jYW5ub3RDcmVhdGU9SW1wb3NzaWJsZSBkZSBjcullciB1biBlbnJvYmV1ciAod3JhcHBlcikgZGUgc2VydmxldCBwb3VyIGxlIGNoZW1pbiB7MH0KK2ludm9rZXJTZXJ2bGV0LmRlYWxsb2NhdGU9SW1wb3NzaWJsZSBkZSBk6XNhbGxvdWVyIHVuZSBpbnN0YW5jZSBkZSBzZXJ2bGV0IHBvdXIgbGUgY2hlbWluIHswfQoraW52b2tlclNlcnZsZXQuaW52YWxpZFBhdGg9QXVjdW4gbm9tIGRlIHNlcnZsZXQgb3UgZGUgY2xhc3NlIG4nJ2Eg6XTpIHNw6WNpZmnpIHBvdXIgbGUgY2hlbWluIHswfQoraW52b2tlclNlcnZsZXQubm90TmFtZWQ9SW1wb3NzaWJsZSBkJ2FwcGVsZXIgbGUgZOls6Wd16SAoaW52b2tlcikgZGUgc2VydmxldCBhdmVjIHVuIGFpZ3VpbGxldXIgKGRpc3BhdGNoZXIpIG5vbW3pCitpbnZva2VyU2VydmxldC5ub1dyYXBwZXI9TGUgY29udGVuZXVyIG4nJ2EgcGFzIGFwcGVs6SAic2V0V3JhcHBlcigpIiBwb3VyIGNldHRlIHNlcnZsZXQKK3dlYmRhdnNlcnZsZXQuamF4cGZhaWxlZD1FcnJldXIgZCcnaW5pdGlhbGlzYXRpb24gZGUgSkFYUAorZGlyZWN0b3J5LmZpbGVuYW1lPU5vbSBkZSBmaWNoaWVyCitkaXJlY3RvcnkubGFzdE1vZGlmaWVkPURlcm5p6HJlIG1vZGlmaWNhdGlvbgorZGlyZWN0b3J5LnBhcmVudD1KdXNxdScn4CB7MH0KK2RpcmVjdG9yeS5zaXplPVRhaWxsZQorZGlyZWN0b3J5LnRpdGxlPUxpc3RlIGR1IHLpcGVydG9pcmUgcG91ciB7MH0KK2RpcmVjdG9yeS52ZXJzaW9uPVRvbWNhdCBDYXRhbGluYSB2ZXJzaW9uIDQuMAorCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc2VydmxldHMvTG9jYWxTdHJpbmdzX2phLnByb3BlcnRpZXMgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc2VydmxldHMvTG9jYWxTdHJpbmdzX2phLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ4MDJjMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zZXJ2bGV0cy9Mb2NhbFN0cmluZ3NfamEucHJvcGVydGllcwpAQCAtMCwwICsxLDE4IEBACitkZWZhdWx0c2VydmxldC5kaXJlY3RvcnlsaXN0aW5nZm9yPVx1MzBjN1x1MzBhM1x1MzBlY1x1MzBhZlx1MzBjOFx1MzBlYVx1MzA2ZVx1NGUwMFx1ODlhNzogCitkZWZhdWx0c2VydmxldC51cHRvPVx1ODlhYVx1MzBjN1x1MzBhM1x1MzBlY1x1MzBhZlx1MzBjOFx1MzBlYTogCitkZWZhdWx0c2VydmxldC5zdWJkaXJlY3Rvcmllcz1cdTMwYjVcdTMwZDZcdTMwYzdcdTMwYTNcdTMwZWNcdTMwYWZcdTMwYzhcdTMwZWE6CitkZWZhdWx0c2VydmxldC5maWxlcz1cdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWI6CitpbnZva2VyU2VydmxldC5hbGxvY2F0ZT1cdTMwZDFcdTMwYjkgezB9IFx1MzA2Ylx1MzBiNVx1MzBmY1x1MzBkNlx1MzBlY1x1MzBjM1x1MzBjOFx1MzBhNFx1MzBmM1x1MzBiOVx1MzBiZlx1MzBmM1x1MzBiOVx1MzA5Mlx1NTI3Mlx1MzA4YVx1NWY1M1x1MzA2Nlx1MzA4OVx1MzA4Y1x1MzA3ZVx1MzA1Ylx1MzA5MworaW52b2tlclNlcnZsZXQuY2Fubm90Q3JlYXRlPVx1MzBkMVx1MzBiOSB7MH0gXHUzMDZiXHUzMGI1XHUzMGZjXHUzMGQ2XHUzMGVjXHUzMGMzXHUzMGM4XHUzMGU5XHUzMGMzXHUzMGQxXHUzMDkyXHU0ZjVjXHU2MjEwXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzCitpbnZva2VyU2VydmxldC5kZWFsbG9jYXRlPVx1MzBkMVx1MzBiOSB7MH0gXHUzMDZlXHUzMGI1XHUzMGZjXHUzMGQ2XHUzMGVjXHUzMGMzXHUzMGM4XHUzMGE0XHUzMGYzXHUzMGI5XHUzMGJmXHUzMGYzXHUzMGI5XHUzMDZlXHU1MjcyXHUzMDhhXHU1ZjUzXHUzMDY2XHUzMDkyXHU4OWUzXHU5NjY0XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzCitpbnZva2VyU2VydmxldC5pbnZhbGlkUGF0aD1cdTMwZDFcdTMwYjkgezB9IFx1MzA2Ylx1MzBiNVx1MzBmY1x1MzBkNlx1MzBlY1x1MzBjM1x1MzBjOFx1NTQwZFx1NTNjOFx1MzA2Zlx1MzBhZlx1MzBlOVx1MzBiOVx1MzA0Y1x1NjMwN1x1NWI5YVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5MworaW52b2tlclNlcnZsZXQubm90TmFtZWQ9XHUzMDVkXHUzMDZlXHU1NDBkXHU1MjRkXHUzMDZlXHUzMGM3XHUzMGEzXHUzMGI5XHUzMGQxXHUzMGMzXHUzMGMxXHUzMGUzXHUzMDY3XHUzMGE0XHUzMGYzXHUzMGRjXHUzMGZjXHUzMGFiXHUzMGI1XHUzMGZjXHUzMGQ2XHUzMGVjXHUzMGMzXHUzMGM4XHUzMDkyXHU1NDdjXHUzMDczXHU1MWZhXHUzMDViXHUzMDdlXHUzMDViXHUzMDkzCitpbnZva2VyU2VydmxldC5ub1dyYXBwZXI9XHUzMGIzXHUzMGYzXHUzMGM2XHUzMGNhXHUzMDZmXHUzMDUzXHUzMDZlXHUzMGI1XHUzMGZjXHUzMGQ2XHUzMGVjXHUzMGMzXHUzMGM4XHUzMDZiXHU1YmZlXHUzMDU3XHUzMDY2XHU1NDdjXHUzMDczXHU1MWZhXHUzMDU1XHUzMDhjXHUzMDVmc2V0V3JhcHBlcigpXHUzMDkyXHU2MzAxXHUzMDYzXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzCit3ZWJkYXZzZXJ2bGV0LmpheHBmYWlsZWQ9SkFYUFx1MzA2ZVx1NTIxZFx1NjcxZlx1NTMxNlx1MzA2Ylx1NTkzMVx1NjU1N1x1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1ZgorZGlyZWN0b3J5LmZpbGVuYW1lPVx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1NTQwZAorZGlyZWN0b3J5Lmxhc3RNb2RpZmllZD1cdTY3MDBcdTdkNDJcdTY2ZjRcdTY1YjAKK2RpcmVjdG9yeS5wYXJlbnQ9ezB9IFx1MzA2Ylx1NzlmYlx1NTJkNQorZGlyZWN0b3J5LnNpemU9XHUzMGI1XHUzMGE0XHUzMGJhCitkaXJlY3RvcnkudGl0bGU9ezB9IFx1MzA2ZVx1MzBjN1x1MzBhM1x1MzBlY1x1MzBhZlx1MzBjOFx1MzBlYVx1MzA2ZVx1NGUwMFx1ODlhNworZGlyZWN0b3J5LnZlcnNpb249VG9tY2F0IENhdGFsaW5hIFx1MzBkMFx1MzBmY1x1MzBiOFx1MzBlN1x1MzBmMyA0LjAKKwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NlcnZsZXRzL1dlYmRhdlNlcnZsZXQuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zZXJ2bGV0cy9XZWJkYXZTZXJ2bGV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE1N2E2NAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zZXJ2bGV0cy9XZWJkYXZTZXJ2bGV0LmphdmEKQEAgLTAsMCArMSwzMDgyIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnNlcnZsZXRzOworCisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOworaW1wb3J0IGphdmEuaW8uV3JpdGVyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuTWVzc2FnZURpZ2VzdDsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5Lk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CitpbXBvcnQgamF2YS51dGlsLlRpbWVab25lOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtZUNsYXNzUGFpcjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtaW5nRW51bWVyYXRpb247CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuZGlyZWN0b3J5LkRpckNvbnRleHQ7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuVW5hdmFpbGFibGVFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLkRPTVdyaXRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuTUQ1RW5jb2RlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuUmVxdWVzdFV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLlhNTFdyaXRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm5hbWluZy5yZXNvdXJjZXMuQ2FjaGVFbnRyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm5hbWluZy5yZXNvdXJjZXMuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5uYW1pbmcucmVzb3VyY2VzLlJlc291cmNlQXR0cmlidXRlczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvbWNhdC51dGlsLmh0dHAuRmFzdEh0dHBEYXRlRm9ybWF0OworaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKK2ltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CisKKworCisvKioKKyAqIFNlcnZsZXQgd2hpY2ggYWRkcyBzdXBwb3J0IGZvciBXZWJEQVYgbGV2ZWwgMi4gQWxsIHRoZSBiYXNpYyBIVFRQIHJlcXVlc3RzCisgKiBhcmUgaGFuZGxlZCBieSB0aGUgRGVmYXVsdFNlcnZsZXQuCisgKgorICogQGF1dGhvciBSZW15IE1hdWNoZXJhdAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgV2ViZGF2U2VydmxldAorICAgIGV4dGVuZHMgRGVmYXVsdFNlcnZsZXQgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdGFudHMKKworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRF9IRUFEID0gIkhFQUQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfUFJPUEZJTkQgPSAiUFJPUEZJTkQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfUFJPUFBBVENIID0gIlBST1BQQVRDSCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRF9NS0NPTCA9ICJNS0NPTCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRF9DT1BZID0gIkNPUFkiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfTU9WRSA9ICJNT1ZFIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9EX0xPQ0sgPSAiTE9DSyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRF9VTkxPQ0sgPSAiVU5MT0NLIjsKKworCisgICAgLyoqCisgICAgICogRGVmYXVsdCBkZXB0aCBpcyBpbmZpdGUuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElORklOSVRZID0gMzsgLy8gVG8gbGltaXQgdHJlZSBicm93c2luZyBhIGJpdAorCisKKyAgICAvKioKKyAgICAgKiBQUk9QRklORCAtIFNwZWNpZnkgYSBwcm9wZXJ0eSBtYXNrLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGSU5EX0JZX1BST1BFUlRZID0gMDsKKworCisgICAgLyoqCisgICAgICogUFJPUEZJTkQgLSBEaXNwbGF5IGFsbCBwcm9wZXJ0aWVzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGSU5EX0FMTF9QUk9QID0gMTsKKworCisgICAgLyoqCisgICAgICogUFJPUEZJTkQgLSBSZXR1cm4gcHJvcGVydHkgbmFtZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZJTkRfUFJPUEVSVFlfTkFNRVMgPSAyOworCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgbG9jay4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTE9DS19DUkVBVElPTiA9IDA7CisKKworICAgIC8qKgorICAgICAqIFJlZnJlc2ggbG9jay4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTE9DS19SRUZSRVNIID0gMTsKKworCisgICAgLyoqCisgICAgICogRGVmYXVsdCBsb2NrIHRpbWVvdXQgdmFsdWUuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfVElNRU9VVCA9IDM2MDA7CisKKworICAgIC8qKgorICAgICAqIE1heGltdW0gbG9jayB0aW1lb3V0LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfVElNRU9VVCA9IDYwNDgwMDsKKworCisgICAgLyoqCisgICAgICogRGVmYXVsdCBuYW1lc3BhY2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9OQU1FU1BBQ0UgPSAiREFWOiI7CisKKworICAgIC8qKgorICAgICAqIFNpbXBsZSBkYXRlIGZvcm1hdCBmb3IgdGhlIGNyZWF0aW9uIGRhdGUgSVNPIHJlcHJlc2VudGF0aW9uIChwYXJ0aWFsKS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFNpbXBsZURhdGVGb3JtYXQgY3JlYXRpb25EYXRlRm9ybWF0ID0KKyAgICAgICAgbmV3IFNpbXBsZURhdGVGb3JtYXQoInl5eXktTU0tZGQnVCdISDptbTpzcydaJyIpOworCisKKyAgICAgLyoqCisgICAgICogTUQ1IG1lc3NhZ2UgZGlnZXN0IHByb3ZpZGVyLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgTWVzc2FnZURpZ2VzdCBtZDVIZWxwZXI7CisKKworICAgIC8qKgorICAgICAqIFRoZSBNRDUgaGVscGVyIG9iamVjdCBmb3IgdGhpcyBjbGFzcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE1ENUVuY29kZXIgbWQ1RW5jb2RlciA9IG5ldyBNRDVFbmNvZGVyKCk7CisKKworCisgICAgc3RhdGljIHsKKyAgICAgICAgY3JlYXRpb25EYXRlRm9ybWF0LnNldFRpbWVab25lKFRpbWVab25lLmdldFRpbWVab25lKCJHTVQiKSk7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogUmVwb3NpdG9yeSBvZiB0aGUgbG9ja3MgcHV0IG9uIHNpbmdsZSByZXNvdXJjZXMuCisgICAgICogPHA+CisgICAgICogS2V5IDogcGF0aCA8YnI+CisgICAgICogVmFsdWUgOiBMb2NrSW5mbworICAgICAqLworICAgIHByaXZhdGUgSGFzaHRhYmxlIHJlc291cmNlTG9ja3MgPSBuZXcgSGFzaHRhYmxlKCk7CisKKworICAgIC8qKgorICAgICAqIFJlcG9zaXRvcnkgb2YgdGhlIGxvY2stbnVsbCByZXNvdXJjZXMuCisgICAgICogPHA+CisgICAgICogS2V5IDogcGF0aCBvZiB0aGUgY29sbGVjdGlvbiBjb250YWluaW5nIHRoZSBsb2NrLW51bGwgcmVzb3VyY2U8YnI+CisgICAgICogVmFsdWUgOiBWZWN0b3Igb2YgbG9jay1udWxsIHJlc291cmNlIHdoaWNoIGFyZSBtZW1iZXJzIG9mIHRoZQorICAgICAqIGNvbGxlY3Rpb24uIEVhY2ggZWxlbWVudCBvZiB0aGUgVmVjdG9yIGlzIHRoZSBwYXRoIGFzc29jaWF0ZWQgd2l0aAorICAgICAqIHRoZSBsb2NrLW51bGwgcmVzb3VyY2UuCisgICAgICovCisgICAgcHJpdmF0ZSBIYXNodGFibGUgbG9ja051bGxSZXNvdXJjZXMgPSBuZXcgSGFzaHRhYmxlKCk7CisKKworICAgIC8qKgorICAgICAqIFZlY3RvciBvZiB0aGUgaGVyaXRhYmxlIGxvY2tzLgorICAgICAqIDxwPgorICAgICAqIEtleSA6IHBhdGggPGJyPgorICAgICAqIFZhbHVlIDogTG9ja0luZm8KKyAgICAgKi8KKyAgICBwcml2YXRlIFZlY3RvciBjb2xsZWN0aW9uTG9ja3MgPSBuZXcgVmVjdG9yKCk7CisKKworICAgIC8qKgorICAgICAqIFNlY3JldCBpbmZvcm1hdGlvbiB1c2VkIHRvIGdlbmVyYXRlIHJlYXNvbmFibHkgc2VjdXJlIGxvY2sgaWRzLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHNlY3JldCA9ICJjYXRhbGluYSI7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIHRoaXMgc2VydmxldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbml0KCkKKyAgICAgICAgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIHN1cGVyLmluaXQoKTsKKworICAgICAgICBTdHJpbmcgdmFsdWUgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdmFsdWUgPSBnZXRTZXJ2bGV0Q29uZmlnKCkuZ2V0SW5pdFBhcmFtZXRlcigic2VjcmV0Iik7CisgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBzZWNyZXQgPSB2YWx1ZTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIDsKKyAgICAgICAgfQorCisKKyAgICAgICAgLy8gTG9hZCB0aGUgTUQ1IGhlbHBlciB1c2VkIHRvIGNhbGN1bGF0ZSBzaWduYXR1cmVzLgorICAgICAgICB0cnkgeworICAgICAgICAgICAgbWQ1SGVscGVyID0gTWVzc2FnZURpZ2VzdC5nZXRJbnN0YW5jZSgiTUQ1Iik7CisgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5hdmFpbGFibGVFeGNlcHRpb24oIk5vIE1ENSIpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm90ZWN0ZWQgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gSkFYUCBkb2N1bWVudCBidWlsZGVyIGluc3RhbmNlLgorICAgICAqLworICAgIHByb3RlY3RlZCBEb2N1bWVudEJ1aWxkZXIgZ2V0RG9jdW1lbnRCdWlsZGVyKCkKKyAgICAgICAgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24geworICAgICAgICBEb2N1bWVudEJ1aWxkZXIgZG9jdW1lbnRCdWlsZGVyID0gbnVsbDsKKyAgICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkb2N1bWVudEJ1aWxkZXJGYWN0b3J5ID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGRvY3VtZW50QnVpbGRlckZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICBkb2N1bWVudEJ1aWxkZXJGYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOworICAgICAgICAgICAgZG9jdW1lbnRCdWlsZGVyID0gZG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKKyAgICAgICAgfSBjYXRjaChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygid2ViZGF2c2VydmxldC5qYXhwZmFpbGVkIikpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBkb2N1bWVudEJ1aWxkZXI7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBIYW5kbGVzIHRoZSBzcGVjaWFsIFdlYkRBViBtZXRob2RzLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNlcnZpY2UoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwKQorICAgICAgICB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCisgICAgICAgIFN0cmluZyBtZXRob2QgPSByZXEuZ2V0TWV0aG9kKCk7CisKKyAgICAgICAgaWYgKGRlYnVnID4gMCkgeworICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBnZXRSZWxhdGl2ZVBhdGgocmVxKTsKKyAgICAgICAgICAgIGxvZygiWyIgKyBtZXRob2QgKyAiXSAiICsgcGF0aCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobWV0aG9kLmVxdWFscyhNRVRIT0RfUFJPUEZJTkQpKSB7CisgICAgICAgICAgICBkb1Byb3BmaW5kKHJlcSwgcmVzcCk7CisgICAgICAgIH0gZWxzZSBpZiAobWV0aG9kLmVxdWFscyhNRVRIT0RfUFJPUFBBVENIKSkgeworICAgICAgICAgICAgZG9Qcm9wcGF0Y2gocmVxLCByZXNwKTsKKyAgICAgICAgfSBlbHNlIGlmIChtZXRob2QuZXF1YWxzKE1FVEhPRF9NS0NPTCkpIHsKKyAgICAgICAgICAgIGRvTWtjb2wocmVxLCByZXNwKTsKKyAgICAgICAgfSBlbHNlIGlmIChtZXRob2QuZXF1YWxzKE1FVEhPRF9DT1BZKSkgeworICAgICAgICAgICAgZG9Db3B5KHJlcSwgcmVzcCk7CisgICAgICAgIH0gZWxzZSBpZiAobWV0aG9kLmVxdWFscyhNRVRIT0RfTU9WRSkpIHsKKyAgICAgICAgICAgIGRvTW92ZShyZXEsIHJlc3ApOworICAgICAgICB9IGVsc2UgaWYgKG1ldGhvZC5lcXVhbHMoTUVUSE9EX0xPQ0spKSB7CisgICAgICAgICAgICBkb0xvY2socmVxLCByZXNwKTsKKyAgICAgICAgfSBlbHNlIGlmIChtZXRob2QuZXF1YWxzKE1FVEhPRF9VTkxPQ0spKSB7CisgICAgICAgICAgICBkb1VubG9jayhyZXEsIHJlc3ApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gRGVmYXVsdFNlcnZsZXQgcHJvY2Vzc2luZworICAgICAgICAgICAgc3VwZXIuc2VydmljZShyZXEsIHJlc3ApOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENoZWNrIGlmIHRoZSBjb25kaXRpb25zIHNwZWNpZmllZCBpbiB0aGUgb3B0aW9uYWwgSWYgaGVhZGVycyBhcmUKKyAgICAgKiBzYXRpc2ZpZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBzZXJ2bGV0IHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqIEBwYXJhbSByZXNvdXJjZUF0dHJpYnV0ZXMgVGhlIHJlc291cmNlIGluZm9ybWF0aW9uCisgICAgICogQHJldHVybiBib29sZWFuIHRydWUgaWYgdGhlIHJlc291cmNlIG1lZXRzIGFsbCB0aGUgc3BlY2lmaWVkIGNvbmRpdGlvbnMsCisgICAgICogYW5kIGZhbHNlIGlmIGFueSBvZiB0aGUgY29uZGl0aW9ucyBpcyBub3Qgc2F0aXNmaWVkLCBpbiB3aGljaCBjYXNlCisgICAgICogcmVxdWVzdCBwcm9jZXNzaW5nIGlzIHN0b3BwZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjaGVja0lmSGVhZGVycyhIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlQXR0cmlidXRlcyByZXNvdXJjZUF0dHJpYnV0ZXMpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKCFzdXBlci5jaGVja0lmSGVhZGVycyhyZXF1ZXN0LCByZXNwb25zZSwgcmVzb3VyY2VBdHRyaWJ1dGVzKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAvLyBUT0RPIDogQ2hlY2tpbmcgdGhlIFdlYkRBViBJZiBoZWFkZXIKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIE9QVElPTlMgTWV0aG9kLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcSBUaGUgcmVxdWVzdAorICAgICAqIEBwYXJhbSByZXNwIFRoZSByZXNwb25zZQorICAgICAqIEB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiBJZiBhbiBlcnJvciBvY2N1cnMKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIElmIGFuIElPIGVycm9yIG9jY3VycworICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGRvT3B0aW9ucyhIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3ApCisgICAgICAgIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgcmVzcC5hZGRIZWFkZXIoIkRBViIsICIxLDIiKTsKKworICAgICAgICBTdHJpbmdCdWZmZXIgbWV0aG9kc0FsbG93ZWQgPSBkZXRlcm1pbmVNZXRob2RzQWxsb3dlZChyZXNvdXJjZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcSk7CisKKyAgICAgICAgcmVzcC5hZGRIZWFkZXIoIkFsbG93IiwgbWV0aG9kc0FsbG93ZWQudG9TdHJpbmcoKSk7CisgICAgICAgIHJlc3AuYWRkSGVhZGVyKCJNUy1BdXRob3ItVmlhIiwgIkRBViIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBQUk9QRklORCBNZXRob2QuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZG9Qcm9wZmluZChIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3ApCisgICAgICAgIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKCFsaXN0aW5ncykgeworICAgICAgICAgICAgLy8gR2V0IGFsbG93ZWQgbWV0aG9kcworICAgICAgICAgICAgU3RyaW5nQnVmZmVyIG1ldGhvZHNBbGxvd2VkID0gZGV0ZXJtaW5lTWV0aG9kc0FsbG93ZWQocmVzb3VyY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxKTsKKworICAgICAgICAgICAgcmVzcC5hZGRIZWFkZXIoIkFsbG93IiwgbWV0aG9kc0FsbG93ZWQudG9TdHJpbmcoKSk7CisgICAgICAgICAgICByZXNwLnNlbmRFcnJvcihXZWJkYXZTdGF0dXMuU0NfTUVUSE9EX05PVF9BTExPV0VEKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBwYXRoID0gZ2V0UmVsYXRpdmVQYXRoKHJlcSk7CisgICAgICAgIGlmIChwYXRoLmVuZHNXaXRoKCIvIikpCisgICAgICAgICAgICBwYXRoID0gcGF0aC5zdWJzdHJpbmcoMCwgcGF0aC5sZW5ndGgoKSAtIDEpOworCisgICAgICAgIGlmICgocGF0aC50b1VwcGVyQ2FzZSgpLnN0YXJ0c1dpdGgoIi9XRUItSU5GIikpIHx8CisgICAgICAgICAgICAocGF0aC50b1VwcGVyQ2FzZSgpLnN0YXJ0c1dpdGgoIi9NRVRBLUlORiIpKSkgeworICAgICAgICAgICAgcmVzcC5zZW5kRXJyb3IoV2ViZGF2U3RhdHVzLlNDX0ZPUkJJRERFTik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBQcm9wZXJ0aWVzIHdoaWNoIGFyZSB0byBiZSBkaXNwbGF5ZWQuCisgICAgICAgIFZlY3RvciBwcm9wZXJ0aWVzID0gbnVsbDsKKyAgICAgICAgLy8gUHJvcGZpbmQgZGVwdGgKKyAgICAgICAgaW50IGRlcHRoID0gSU5GSU5JVFk7CisgICAgICAgIC8vIFByb3BmaW5kIHR5cGUKKyAgICAgICAgaW50IHR5cGUgPSBGSU5EX0FMTF9QUk9QOworCisgICAgICAgIFN0cmluZyBkZXB0aFN0ciA9IHJlcS5nZXRIZWFkZXIoIkRlcHRoIik7CisKKyAgICAgICAgaWYgKGRlcHRoU3RyID09IG51bGwpIHsKKyAgICAgICAgICAgIGRlcHRoID0gSU5GSU5JVFk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoZGVwdGhTdHIuZXF1YWxzKCIwIikpIHsKKyAgICAgICAgICAgICAgICBkZXB0aCA9IDA7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGRlcHRoU3RyLmVxdWFscygiMSIpKSB7CisgICAgICAgICAgICAgICAgZGVwdGggPSAxOworICAgICAgICAgICAgfSBlbHNlIGlmIChkZXB0aFN0ci5lcXVhbHMoImluZmluaXR5IikpIHsKKyAgICAgICAgICAgICAgICBkZXB0aCA9IElORklOSVRZOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgTm9kZSBwcm9wTm9kZSA9IG51bGw7CisKKyAgICAgICAgRG9jdW1lbnRCdWlsZGVyIGRvY3VtZW50QnVpbGRlciA9IGdldERvY3VtZW50QnVpbGRlcigpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IGRvY3VtZW50QnVpbGRlci5wYXJzZQorICAgICAgICAgICAgICAgIChuZXcgSW5wdXRTb3VyY2UocmVxLmdldElucHV0U3RyZWFtKCkpKTsKKworICAgICAgICAgICAgLy8gR2V0IHRoZSByb290IGVsZW1lbnQgb2YgdGhlIGRvY3VtZW50CisgICAgICAgICAgICBFbGVtZW50IHJvb3RFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCk7CisgICAgICAgICAgICBOb2RlTGlzdCBjaGlsZExpc3QgPSByb290RWxlbWVudC5nZXRDaGlsZE5vZGVzKCk7CisKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaSA8IGNoaWxkTGlzdC5nZXRMZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgTm9kZSBjdXJyZW50Tm9kZSA9IGNoaWxkTGlzdC5pdGVtKGkpOworICAgICAgICAgICAgICAgIHN3aXRjaCAoY3VycmVudE5vZGUuZ2V0Tm9kZVR5cGUoKSkgeworICAgICAgICAgICAgICAgIGNhc2UgTm9kZS5URVhUX05PREU6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTm9kZS5FTEVNRU5UX05PREU6CisgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Tm9kZS5nZXROb2RlTmFtZSgpLmVuZHNXaXRoKCJwcm9wIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBGSU5EX0JZX1BST1BFUlRZOworICAgICAgICAgICAgICAgICAgICAgICAgcHJvcE5vZGUgPSBjdXJyZW50Tm9kZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudE5vZGUuZ2V0Tm9kZU5hbWUoKS5lbmRzV2l0aCgicHJvcG5hbWUiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IEZJTkRfUFJPUEVSVFlfTkFNRVM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnROb2RlLmdldE5vZGVOYW1lKCkuZW5kc1dpdGgoImFsbHByb3AiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IEZJTkRfQUxMX1BST1A7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBNb3N0IGxpa2VseSB0aGVyZSB3YXMgbm8gY29udGVudCA6IHdlIHVzZSB0aGUgZGVmYXVsdHMuCisgICAgICAgICAgICAvLyBUT0RPIDogRW5oYW5jZSB0aGF0ICEKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0eXBlID09IEZJTkRfQllfUFJPUEVSVFkpIHsKKyAgICAgICAgICAgIHByb3BlcnRpZXMgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgICAgICBOb2RlTGlzdCBjaGlsZExpc3QgPSBwcm9wTm9kZS5nZXRDaGlsZE5vZGVzKCk7CisKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaSA8IGNoaWxkTGlzdC5nZXRMZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgTm9kZSBjdXJyZW50Tm9kZSA9IGNoaWxkTGlzdC5pdGVtKGkpOworICAgICAgICAgICAgICAgIHN3aXRjaCAoY3VycmVudE5vZGUuZ2V0Tm9kZVR5cGUoKSkgeworICAgICAgICAgICAgICAgIGNhc2UgTm9kZS5URVhUX05PREU6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTm9kZS5FTEVNRU5UX05PREU6CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBub2RlTmFtZSA9IGN1cnJlbnROb2RlLmdldE5vZGVOYW1lKCk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBpZiAobm9kZU5hbWUuaW5kZXhPZignOicpICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWUgPSBub2RlTmFtZS5zdWJzdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobm9kZU5hbWUuaW5kZXhPZignOicpICsgMSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWUgPSBub2RlTmFtZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBocmVmIGlzIGEgbGl2ZSBwcm9wZXJ0eSB3aGljaCBpcyBoYW5kbGVkIGRpZmZlcmVudGx5CisgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMuYWRkRWxlbWVudChwcm9wZXJ0eU5hbWUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIGJvb2xlYW4gZXhpc3RzID0gdHJ1ZTsKKyAgICAgICAgT2JqZWN0IG9iamVjdCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvYmplY3QgPSByZXNvdXJjZXMubG9va3VwKHBhdGgpOworICAgICAgICB9IGNhdGNoIChOYW1pbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZXhpc3RzID0gZmFsc2U7CisgICAgICAgICAgICBpbnQgc2xhc2ggPSBwYXRoLmxhc3RJbmRleE9mKCcvJyk7CisgICAgICAgICAgICBpZiAoc2xhc2ggIT0gLTEpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcGFyZW50UGF0aCA9IHBhdGguc3Vic3RyaW5nKDAsIHNsYXNoKTsKKyAgICAgICAgICAgICAgICBWZWN0b3IgY3VycmVudExvY2tOdWxsUmVzb3VyY2VzID0KKyAgICAgICAgICAgICAgICAgICAgKFZlY3RvcikgbG9ja051bGxSZXNvdXJjZXMuZ2V0KHBhcmVudFBhdGgpOworICAgICAgICAgICAgICAgIGlmIChjdXJyZW50TG9ja051bGxSZXNvdXJjZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBFbnVtZXJhdGlvbiBsb2NrTnVsbFJlc291cmNlc0xpc3QgPQorICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudExvY2tOdWxsUmVzb3VyY2VzLmVsZW1lbnRzKCk7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChsb2NrTnVsbFJlc291cmNlc0xpc3QuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsb2NrTnVsbFBhdGggPSAoU3RyaW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2tOdWxsUmVzb3VyY2VzTGlzdC5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2tOdWxsUGF0aC5lcXVhbHMocGF0aCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwLnNldFN0YXR1cyhXZWJkYXZTdGF0dXMuU0NfTVVMVElfU1RBVFVTKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3htbDsgY2hhcnNldD1VVEYtOCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBtdWx0aXN0YXR1cyBvYmplY3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxXcml0ZXIgZ2VuZXJhdGVkWE1MID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhNTFdyaXRlcihyZXNwLmdldFdyaXRlcigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVYTUxIZWFkZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChudWxsLCAibXVsdGlzdGF0dXMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGdlbmVyYXRlTmFtZXNwYWNlRGVjbGFyYXRpb25zKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxXcml0ZXIuT1BFTklORyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VMb2NrTnVsbFByb3BlcnRpZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlcSwgZ2VuZXJhdGVkWE1MLCBsb2NrTnVsbFBhdGgsIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJtdWx0aXN0YXR1cyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxXcml0ZXIuQ0xPU0lORyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLnNlbmREYXRhKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCFleGlzdHMpIHsKKyAgICAgICAgICAgIHJlc3Auc2VuZEVycm9yKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfTk9UX0ZPVU5ELCBwYXRoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHJlc3Auc2V0U3RhdHVzKFdlYmRhdlN0YXR1cy5TQ19NVUxUSV9TVEFUVVMpOworCisgICAgICAgIHJlc3Auc2V0Q29udGVudFR5cGUoInRleHQveG1sOyBjaGFyc2V0PVVURi04Iik7CisKKyAgICAgICAgLy8gQ3JlYXRlIG11bHRpc3RhdHVzIG9iamVjdAorICAgICAgICBYTUxXcml0ZXIgZ2VuZXJhdGVkWE1MID0gbmV3IFhNTFdyaXRlcihyZXNwLmdldFdyaXRlcigpKTsKKyAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlWE1MSGVhZGVyKCk7CisKKyAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAibXVsdGlzdGF0dXMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBnZW5lcmF0ZU5hbWVzcGFjZURlY2xhcmF0aW9ucygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFdyaXRlci5PUEVOSU5HKTsKKworICAgICAgICBpZiAoZGVwdGggPT0gMCkgeworICAgICAgICAgICAgcGFyc2VQcm9wZXJ0aWVzKHJlcSwgZ2VuZXJhdGVkWE1MLCBwYXRoLCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gVGhlIHN0YWNrIGFsd2F5cyBjb250YWlucyB0aGUgb2JqZWN0IG9mIHRoZSBjdXJyZW50IGxldmVsCisgICAgICAgICAgICBTdGFjayBzdGFjayA9IG5ldyBTdGFjaygpOworICAgICAgICAgICAgc3RhY2sucHVzaChwYXRoKTsKKworICAgICAgICAgICAgLy8gU3RhY2sgb2YgdGhlIG9iamVjdHMgb25lIGxldmVsIGJlbG93CisgICAgICAgICAgICBTdGFjayBzdGFja0JlbG93ID0gbmV3IFN0YWNrKCk7CisKKyAgICAgICAgICAgIHdoaWxlICgoIXN0YWNrLmlzRW1wdHkoKSkgJiYgKGRlcHRoID49IDApKSB7CisKKyAgICAgICAgICAgICAgICBTdHJpbmcgY3VycmVudFBhdGggPSAoU3RyaW5nKSBzdGFjay5wb3AoKTsKKyAgICAgICAgICAgICAgICBwYXJzZVByb3BlcnRpZXMocmVxLCBnZW5lcmF0ZWRYTUwsIGN1cnJlbnRQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLCBwcm9wZXJ0aWVzKTsKKworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIG9iamVjdCA9IHJlc291cmNlcy5sb29rdXAoY3VycmVudFBhdGgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgob2JqZWN0IGluc3RhbmNlb2YgRGlyQ29udGV4dCkgJiYgKGRlcHRoID4gMCkpIHsKKworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgTmFtaW5nRW51bWVyYXRpb24gZW51bWVyYXRpb24gPSByZXNvdXJjZXMubGlzdChjdXJyZW50UGF0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoZW51bWVyYXRpb24uaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lQ2xhc3NQYWlyIG5jUGFpciA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChOYW1lQ2xhc3NQYWlyKSBlbnVtZXJhdGlvbi5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuZXdQYXRoID0gY3VycmVudFBhdGg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEobmV3UGF0aC5lbmRzV2l0aCgiLyIpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGF0aCArPSAiLyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGF0aCArPSBuY1BhaXIuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrQmVsb3cucHVzaChuZXdQYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3Auc2VuZEVycm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIERpc3BsYXlpbmcgdGhlIGxvY2stbnVsbCByZXNvdXJjZXMgcHJlc2VudCBpbiB0aGF0CisgICAgICAgICAgICAgICAgICAgIC8vIGNvbGxlY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxvY2tQYXRoID0gY3VycmVudFBhdGg7CisgICAgICAgICAgICAgICAgICAgIGlmIChsb2NrUGF0aC5lbmRzV2l0aCgiLyIpKQorICAgICAgICAgICAgICAgICAgICAgICAgbG9ja1BhdGggPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2tQYXRoLnN1YnN0cmluZygwLCBsb2NrUGF0aC5sZW5ndGgoKSAtIDEpOworICAgICAgICAgICAgICAgICAgICBWZWN0b3IgY3VycmVudExvY2tOdWxsUmVzb3VyY2VzID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChWZWN0b3IpIGxvY2tOdWxsUmVzb3VyY2VzLmdldChsb2NrUGF0aCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50TG9ja051bGxSZXNvdXJjZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgRW51bWVyYXRpb24gbG9ja051bGxSZXNvdXJjZXNMaXN0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50TG9ja051bGxSZXNvdXJjZXMuZWxlbWVudHMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChsb2NrTnVsbFJlc291cmNlc0xpc3QuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbG9ja051bGxQYXRoID0gKFN0cmluZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9ja051bGxSZXNvdXJjZXNMaXN0Lm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VMb2NrTnVsbFByb3BlcnRpZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlcSwgZ2VuZXJhdGVkWE1MLCBsb2NrTnVsbFBhdGgsIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHN0YWNrLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICBkZXB0aC0tOworICAgICAgICAgICAgICAgICAgICBzdGFjayA9IHN0YWNrQmVsb3c7CisgICAgICAgICAgICAgICAgICAgIHN0YWNrQmVsb3cgPSBuZXcgU3RhY2soKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBnZW5lcmF0ZWRYTUwuc2VuZERhdGEoKTsKKworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAibXVsdGlzdGF0dXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFdyaXRlci5DTE9TSU5HKTsKKworICAgICAgICBnZW5lcmF0ZWRYTUwuc2VuZERhdGEoKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUFJPUFBBVENIIE1ldGhvZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBkb1Byb3BwYXRjaChIdHRwU2VydmxldFJlcXVlc3QgcmVxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcCkKKyAgICAgICAgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAocmVhZE9ubHkpIHsKKyAgICAgICAgICAgIHJlc3Auc2VuZEVycm9yKFdlYmRhdlN0YXR1cy5TQ19GT1JCSURERU4pOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGlzTG9ja2VkKHJlcSkpIHsKKyAgICAgICAgICAgIHJlc3Auc2VuZEVycm9yKFdlYmRhdlN0YXR1cy5TQ19MT0NLRUQpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgcmVzcC5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19OT1RfSU1QTEVNRU5URUQpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBNS0NPTCBNZXRob2QuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZG9Na2NvbChIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3ApCisgICAgICAgIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKHJlYWRPbmx5KSB7CisgICAgICAgICAgICByZXNwLnNlbmRFcnJvcihXZWJkYXZTdGF0dXMuU0NfRk9SQklEREVOKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpc0xvY2tlZChyZXEpKSB7CisgICAgICAgICAgICByZXNwLnNlbmRFcnJvcihXZWJkYXZTdGF0dXMuU0NfTE9DS0VEKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBwYXRoID0gZ2V0UmVsYXRpdmVQYXRoKHJlcSk7CisKKyAgICAgICAgaWYgKChwYXRoLnRvVXBwZXJDYXNlKCkuc3RhcnRzV2l0aCgiL1dFQi1JTkYiKSkgfHwKKyAgICAgICAgICAgIChwYXRoLnRvVXBwZXJDYXNlKCkuc3RhcnRzV2l0aCgiL01FVEEtSU5GIikpKSB7CisgICAgICAgICAgICByZXNwLnNlbmRFcnJvcihXZWJkYXZTdGF0dXMuU0NfRk9SQklEREVOKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2xlYW4gZXhpc3RzID0gdHJ1ZTsKKyAgICAgICAgT2JqZWN0IG9iamVjdCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvYmplY3QgPSByZXNvdXJjZXMubG9va3VwKHBhdGgpOworICAgICAgICB9IGNhdGNoIChOYW1pbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZXhpc3RzID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBDYW4ndCBjcmVhdGUgYSBjb2xsZWN0aW9uIGlmIGEgcmVzb3VyY2UgYWxyZWFkeSBleGlzdHMgYXQgdGhlIGdpdmVuCisgICAgICAgIC8vIHBhdGgKKyAgICAgICAgaWYgKGV4aXN0cykgeworICAgICAgICAgICAgLy8gR2V0IGFsbG93ZWQgbWV0aG9kcworICAgICAgICAgICAgU3RyaW5nQnVmZmVyIG1ldGhvZHNBbGxvd2VkID0gZGV0ZXJtaW5lTWV0aG9kc0FsbG93ZWQocmVzb3VyY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxKTsKKworICAgICAgICAgICAgcmVzcC5hZGRIZWFkZXIoIkFsbG93IiwgbWV0aG9kc0FsbG93ZWQudG9TdHJpbmcoKSk7CisKKyAgICAgICAgICAgIHJlc3Auc2VuZEVycm9yKFdlYmRhdlN0YXR1cy5TQ19NRVRIT0RfTk9UX0FMTE9XRUQpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJlcS5nZXRJbnB1dFN0cmVhbSgpLmF2YWlsYWJsZSgpID4gMCkgeworICAgICAgICAgICAgRG9jdW1lbnRCdWlsZGVyIGRvY3VtZW50QnVpbGRlciA9IGdldERvY3VtZW50QnVpbGRlcigpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IGRvY3VtZW50QnVpbGRlci5wYXJzZQorICAgICAgICAgICAgICAgICAgICAobmV3IElucHV0U291cmNlKHJlcS5nZXRJbnB1dFN0cmVhbSgpKSk7CisgICAgICAgICAgICAgICAgLy8gVE9ETyA6IFByb2Nlc3MgdGhpcyByZXF1ZXN0IGJvZHkKKyAgICAgICAgICAgICAgICByZXNwLnNlbmRFcnJvcihXZWJkYXZTdGF0dXMuU0NfTk9UX0lNUExFTUVOVEVEKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIH0gY2F0Y2goU0FYRXhjZXB0aW9uIHNheGUpIHsKKyAgICAgICAgICAgICAgICAvLyBQYXJzZSBlcnJvciAtIGFzc3VtZSBpbnZhbGlkIGNvbnRlbnQKKyAgICAgICAgICAgICAgICByZXNwLnNlbmRFcnJvcihXZWJkYXZTdGF0dXMuU0NfQkFEX1JFUVVFU1QpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlc291cmNlcy5jcmVhdGVTdWJjb250ZXh0KHBhdGgpOworICAgICAgICB9IGNhdGNoIChOYW1pbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXJlc3VsdCkgeworICAgICAgICAgICAgcmVzcC5zZW5kRXJyb3IoV2ViZGF2U3RhdHVzLlNDX0NPTkZMSUNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViZGF2U3RhdHVzLmdldFN0YXR1c1RleHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChXZWJkYXZTdGF0dXMuU0NfQ09ORkxJQ1QpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlc3Auc2V0U3RhdHVzKFdlYmRhdlN0YXR1cy5TQ19DUkVBVEVEKTsKKyAgICAgICAgICAgIC8vIFJlbW92aW5nIGFueSBsb2NrLW51bGwgcmVzb3VyY2Ugd2hpY2ggd291bGQgYmUgcHJlc2VudAorICAgICAgICAgICAgbG9ja051bGxSZXNvdXJjZXMucmVtb3ZlKHBhdGgpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIERFTEVURSBNZXRob2QuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZG9EZWxldGUoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwKQorICAgICAgICB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCisgICAgICAgIGlmIChyZWFkT25seSkgeworICAgICAgICAgICAgcmVzcC5zZW5kRXJyb3IoV2ViZGF2U3RhdHVzLlNDX0ZPUkJJRERFTik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoaXNMb2NrZWQocmVxKSkgeworICAgICAgICAgICAgcmVzcC5zZW5kRXJyb3IoV2ViZGF2U3RhdHVzLlNDX0xPQ0tFRCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBkZWxldGVSZXNvdXJjZShyZXEsIHJlc3ApOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIGEgUE9TVCByZXF1ZXN0IGZvciB0aGUgc3BlY2lmaWVkIHJlc291cmNlLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcSBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3AgVGhlIHNlcnZsZXQgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0LXNwZWNpZmllZCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBkb1B1dChIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3ApCisgICAgICAgIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKGlzTG9ja2VkKHJlcSkpIHsKKyAgICAgICAgICAgIHJlc3Auc2VuZEVycm9yKFdlYmRhdlN0YXR1cy5TQ19MT0NLRUQpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgc3VwZXIuZG9QdXQocmVxLCByZXNwKTsKKworICAgICAgICBTdHJpbmcgcGF0aCA9IGdldFJlbGF0aXZlUGF0aChyZXEpOworCisgICAgICAgIC8vIFJlbW92aW5nIGFueSBsb2NrLW51bGwgcmVzb3VyY2Ugd2hpY2ggd291bGQgYmUgcHJlc2VudAorICAgICAgICBsb2NrTnVsbFJlc291cmNlcy5yZW1vdmUocGF0aCk7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDT1BZIE1ldGhvZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBkb0NvcHkoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwKQorICAgICAgICB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCisgICAgICAgIGlmIChyZWFkT25seSkgeworICAgICAgICAgICAgcmVzcC5zZW5kRXJyb3IoV2ViZGF2U3RhdHVzLlNDX0ZPUkJJRERFTik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBjb3B5UmVzb3VyY2UocmVxLCByZXNwKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogTU9WRSBNZXRob2QuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZG9Nb3ZlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcCkKKyAgICAgICAgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAocmVhZE9ubHkpIHsKKyAgICAgICAgICAgIHJlc3Auc2VuZEVycm9yKFdlYmRhdlN0YXR1cy5TQ19GT1JCSURERU4pOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGlzTG9ja2VkKHJlcSkpIHsKKyAgICAgICAgICAgIHJlc3Auc2VuZEVycm9yKFdlYmRhdlN0YXR1cy5TQ19MT0NLRUQpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIHBhdGggPSBnZXRSZWxhdGl2ZVBhdGgocmVxKTsKKworICAgICAgICBpZiAoY29weVJlc291cmNlKHJlcSwgcmVzcCkpIHsKKyAgICAgICAgICAgIGRlbGV0ZVJlc291cmNlKHBhdGgsIHJlcSwgcmVzcCwgZmFsc2UpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIExPQ0sgTWV0aG9kLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGRvTG9jayhIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3ApCisgICAgICAgIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKHJlYWRPbmx5KSB7CisgICAgICAgICAgICByZXNwLnNlbmRFcnJvcihXZWJkYXZTdGF0dXMuU0NfRk9SQklEREVOKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpc0xvY2tlZChyZXEpKSB7CisgICAgICAgICAgICByZXNwLnNlbmRFcnJvcihXZWJkYXZTdGF0dXMuU0NfTE9DS0VEKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIExvY2tJbmZvIGxvY2sgPSBuZXcgTG9ja0luZm8oKTsKKworICAgICAgICAvLyBQYXJzaW5nIGxvY2sgcmVxdWVzdAorCisgICAgICAgIC8vIFBhcnNpbmcgZGVwdGggaGVhZGVyCisKKyAgICAgICAgU3RyaW5nIGRlcHRoU3RyID0gcmVxLmdldEhlYWRlcigiRGVwdGgiKTsKKworICAgICAgICBpZiAoZGVwdGhTdHIgPT0gbnVsbCkgeworICAgICAgICAgICAgbG9jay5kZXB0aCA9IElORklOSVRZOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGRlcHRoU3RyLmVxdWFscygiMCIpKSB7CisgICAgICAgICAgICAgICAgbG9jay5kZXB0aCA9IDA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGxvY2suZGVwdGggPSBJTkZJTklUWTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFBhcnNpbmcgdGltZW91dCBoZWFkZXIKKworICAgICAgICBpbnQgbG9ja0R1cmF0aW9uID0gREVGQVVMVF9USU1FT1VUOworICAgICAgICBTdHJpbmcgbG9ja0R1cmF0aW9uU3RyID0gcmVxLmdldEhlYWRlcigiVGltZW91dCIpOworICAgICAgICBpZiAobG9ja0R1cmF0aW9uU3RyID09IG51bGwpIHsKKyAgICAgICAgICAgIGxvY2tEdXJhdGlvbiA9IERFRkFVTFRfVElNRU9VVDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludCBjb21tYVBvcyA9IGxvY2tEdXJhdGlvblN0ci5pbmRleE9mKCIsIik7CisgICAgICAgICAgICAvLyBJZiBtdWx0aXBsZSB0aW1lb3V0cywganVzdCB1c2UgdGhlIGZpcnN0CisgICAgICAgICAgICBpZiAoY29tbWFQb3MgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICBsb2NrRHVyYXRpb25TdHIgPSBsb2NrRHVyYXRpb25TdHIuc3Vic3RyaW5nKDAsY29tbWFQb3MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGxvY2tEdXJhdGlvblN0ci5zdGFydHNXaXRoKCJTZWNvbmQtIikpIHsKKyAgICAgICAgICAgICAgICBsb2NrRHVyYXRpb24gPQorICAgICAgICAgICAgICAgICAgICAobmV3IEludGVnZXIobG9ja0R1cmF0aW9uU3RyLnN1YnN0cmluZyg3KSkpLmludFZhbHVlKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChsb2NrRHVyYXRpb25TdHIuZXF1YWxzSWdub3JlQ2FzZSgiaW5maW5pdHkiKSkgeworICAgICAgICAgICAgICAgICAgICBsb2NrRHVyYXRpb24gPSBNQVhfVElNRU9VVDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9ja0R1cmF0aW9uID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmV3IEludGVnZXIobG9ja0R1cmF0aW9uU3RyKSkuaW50VmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvY2tEdXJhdGlvbiA9IE1BWF9USU1FT1VUOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGxvY2tEdXJhdGlvbiA9PSAwKSB7CisgICAgICAgICAgICAgICAgbG9ja0R1cmF0aW9uID0gREVGQVVMVF9USU1FT1VUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGxvY2tEdXJhdGlvbiA+IE1BWF9USU1FT1VUKSB7CisgICAgICAgICAgICAgICAgbG9ja0R1cmF0aW9uID0gTUFYX1RJTUVPVVQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbG9jay5leHBpcmVzQXQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArIChsb2NrRHVyYXRpb24gKiAxMDAwKTsKKworICAgICAgICBpbnQgbG9ja1JlcXVlc3RUeXBlID0gTE9DS19DUkVBVElPTjsKKworICAgICAgICBOb2RlIGxvY2tJbmZvTm9kZSA9IG51bGw7CisKKyAgICAgICAgRG9jdW1lbnRCdWlsZGVyIGRvY3VtZW50QnVpbGRlciA9IGdldERvY3VtZW50QnVpbGRlcigpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IGRvY3VtZW50QnVpbGRlci5wYXJzZShuZXcgSW5wdXRTb3VyY2UKKyAgICAgICAgICAgICAgICAocmVxLmdldElucHV0U3RyZWFtKCkpKTsKKworICAgICAgICAgICAgLy8gR2V0IHRoZSByb290IGVsZW1lbnQgb2YgdGhlIGRvY3VtZW50CisgICAgICAgICAgICBFbGVtZW50IHJvb3RFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCk7CisgICAgICAgICAgICBsb2NrSW5mb05vZGUgPSByb290RWxlbWVudDsKKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9ja1JlcXVlc3RUeXBlID0gTE9DS19SRUZSRVNIOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGxvY2tJbmZvTm9kZSAhPSBudWxsKSB7CisKKyAgICAgICAgICAgIC8vIFJlYWRpbmcgbG9jayBpbmZvcm1hdGlvbgorCisgICAgICAgICAgICBOb2RlTGlzdCBjaGlsZExpc3QgPSBsb2NrSW5mb05vZGUuZ2V0Q2hpbGROb2RlcygpOworICAgICAgICAgICAgU3RyaW5nV3JpdGVyIHN0cldyaXRlciA9IG51bGw7CisgICAgICAgICAgICBET01Xcml0ZXIgZG9tV3JpdGVyID0gbnVsbDsKKworICAgICAgICAgICAgTm9kZSBsb2NrU2NvcGVOb2RlID0gbnVsbDsKKyAgICAgICAgICAgIE5vZGUgbG9ja1R5cGVOb2RlID0gbnVsbDsKKyAgICAgICAgICAgIE5vZGUgbG9ja093bmVyTm9kZSA9IG51bGw7CisKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaSA8IGNoaWxkTGlzdC5nZXRMZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgTm9kZSBjdXJyZW50Tm9kZSA9IGNoaWxkTGlzdC5pdGVtKGkpOworICAgICAgICAgICAgICAgIHN3aXRjaCAoY3VycmVudE5vZGUuZ2V0Tm9kZVR5cGUoKSkgeworICAgICAgICAgICAgICAgIGNhc2UgTm9kZS5URVhUX05PREU6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTm9kZS5FTEVNRU5UX05PREU6CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBub2RlTmFtZSA9IGN1cnJlbnROb2RlLmdldE5vZGVOYW1lKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChub2RlTmFtZS5lbmRzV2l0aCgibG9ja3Njb3BlIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvY2tTY29wZU5vZGUgPSBjdXJyZW50Tm9kZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobm9kZU5hbWUuZW5kc1dpdGgoImxvY2t0eXBlIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvY2tUeXBlTm9kZSA9IGN1cnJlbnROb2RlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChub2RlTmFtZS5lbmRzV2l0aCgib3duZXIiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9ja093bmVyTm9kZSA9IGN1cnJlbnROb2RlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGxvY2tTY29wZU5vZGUgIT0gbnVsbCkgeworCisgICAgICAgICAgICAgICAgY2hpbGRMaXN0ID0gbG9ja1Njb3BlTm9kZS5nZXRDaGlsZE5vZGVzKCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgY2hpbGRMaXN0LmdldExlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgTm9kZSBjdXJyZW50Tm9kZSA9IGNoaWxkTGlzdC5pdGVtKGkpOworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGN1cnJlbnROb2RlLmdldE5vZGVUeXBlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBOb2RlLlRFWFRfTk9ERToKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIE5vZGUuRUxFTUVOVF9OT0RFOgorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRlbXBTY29wZSA9IGN1cnJlbnROb2RlLmdldE5vZGVOYW1lKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGVtcFNjb3BlLmluZGV4T2YoJzonKSAhPSAtMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2suc2NvcGUgPSB0ZW1wU2NvcGUuc3Vic3RyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0ZW1wU2NvcGUuaW5kZXhPZignOicpICsgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2suc2NvcGUgPSB0ZW1wU2NvcGU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsb2NrLnNjb3BlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQmFkIHJlcXVlc3QKKyAgICAgICAgICAgICAgICAgICAgcmVzcC5zZXRTdGF0dXMoV2ViZGF2U3RhdHVzLlNDX0JBRF9SRVFVRVNUKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gQmFkIHJlcXVlc3QKKyAgICAgICAgICAgICAgICByZXNwLnNldFN0YXR1cyhXZWJkYXZTdGF0dXMuU0NfQkFEX1JFUVVFU1QpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobG9ja1R5cGVOb2RlICE9IG51bGwpIHsKKworICAgICAgICAgICAgICAgIGNoaWxkTGlzdCA9IGxvY2tUeXBlTm9kZS5nZXRDaGlsZE5vZGVzKCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgY2hpbGRMaXN0LmdldExlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgTm9kZSBjdXJyZW50Tm9kZSA9IGNoaWxkTGlzdC5pdGVtKGkpOworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGN1cnJlbnROb2RlLmdldE5vZGVUeXBlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBOb2RlLlRFWFRfTk9ERToKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIE5vZGUuRUxFTUVOVF9OT0RFOgorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRlbXBUeXBlID0gY3VycmVudE5vZGUuZ2V0Tm9kZU5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wVHlwZS5pbmRleE9mKCc6JykgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NrLnR5cGUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wVHlwZS5zdWJzdHJpbmcodGVtcFR5cGUuaW5kZXhPZignOicpICsgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2sudHlwZSA9IHRlbXBUeXBlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobG9jay50eXBlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQmFkIHJlcXVlc3QKKyAgICAgICAgICAgICAgICAgICAgcmVzcC5zZXRTdGF0dXMoV2ViZGF2U3RhdHVzLlNDX0JBRF9SRVFVRVNUKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gQmFkIHJlcXVlc3QKKyAgICAgICAgICAgICAgICByZXNwLnNldFN0YXR1cyhXZWJkYXZTdGF0dXMuU0NfQkFEX1JFUVVFU1QpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobG9ja093bmVyTm9kZSAhPSBudWxsKSB7CisKKyAgICAgICAgICAgICAgICBjaGlsZExpc3QgPSBsb2NrT3duZXJOb2RlLmdldENoaWxkTm9kZXMoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBjaGlsZExpc3QuZ2V0TGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBOb2RlIGN1cnJlbnROb2RlID0gY2hpbGRMaXN0Lml0ZW0oaSk7CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoY3VycmVudE5vZGUuZ2V0Tm9kZVR5cGUoKSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIE5vZGUuVEVYVF9OT0RFOgorICAgICAgICAgICAgICAgICAgICAgICAgbG9jay5vd25lciArPSBjdXJyZW50Tm9kZS5nZXROb2RlVmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIE5vZGUuRUxFTUVOVF9OT0RFOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RyV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICAgICAgICAgICAgICAgICAgZG9tV3JpdGVyID0gbmV3IERPTVdyaXRlcihzdHJXcml0ZXIsIHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgZG9tV3JpdGVyLnNldFF1YWxpZmllZE5hbWVzKGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvbVdyaXRlci5wcmludChjdXJyZW50Tm9kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2NrLm93bmVyICs9IHN0cldyaXRlci50b1N0cmluZygpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobG9jay5vd25lciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEJhZCByZXF1ZXN0CisgICAgICAgICAgICAgICAgICAgIHJlc3Auc2V0U3RhdHVzKFdlYmRhdlN0YXR1cy5TQ19CQURfUkVRVUVTVCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGxvY2sub3duZXIgPSBuZXcgU3RyaW5nKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBwYXRoID0gZ2V0UmVsYXRpdmVQYXRoKHJlcSk7CisKKyAgICAgICAgbG9jay5wYXRoID0gcGF0aDsKKworICAgICAgICBib29sZWFuIGV4aXN0cyA9IHRydWU7CisgICAgICAgIE9iamVjdCBvYmplY3QgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgb2JqZWN0ID0gcmVzb3VyY2VzLmxvb2t1cChwYXRoKTsKKyAgICAgICAgfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGV4aXN0cyA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgRW51bWVyYXRpb24gbG9ja3NMaXN0ID0gbnVsbDsKKworICAgICAgICBpZiAobG9ja1JlcXVlc3RUeXBlID09IExPQ0tfQ1JFQVRJT04pIHsKKworICAgICAgICAgICAgLy8gR2VuZXJhdGluZyBsb2NrIGlkCisgICAgICAgICAgICBTdHJpbmcgbG9ja1Rva2VuU3RyID0gcmVxLmdldFNlcnZsZXRQYXRoKCkgKyAiLSIgKyBsb2NrLnR5cGUgKyAiLSIKKyAgICAgICAgICAgICAgICArIGxvY2suc2NvcGUgKyAiLSIgKyByZXEuZ2V0VXNlclByaW5jaXBhbCgpICsgIi0iCisgICAgICAgICAgICAgICAgKyBsb2NrLmRlcHRoICsgIi0iICsgbG9jay5vd25lciArICItIiArIGxvY2sudG9rZW5zICsgIi0iCisgICAgICAgICAgICAgICAgKyBsb2NrLmV4cGlyZXNBdCArICItIiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgIi0iCisgICAgICAgICAgICAgICAgKyBzZWNyZXQ7CisgICAgICAgICAgICBTdHJpbmcgbG9ja1Rva2VuID0KKyAgICAgICAgICAgICAgICBtZDVFbmNvZGVyLmVuY29kZShtZDVIZWxwZXIuZGlnZXN0KGxvY2tUb2tlblN0ci5nZXRCeXRlcygpKSk7CisKKyAgICAgICAgICAgIGlmICggKGV4aXN0cykgJiYgKG9iamVjdCBpbnN0YW5jZW9mIERpckNvbnRleHQpICYmCisgICAgICAgICAgICAgICAgIChsb2NrLmRlcHRoID09IElORklOSVRZKSApIHsKKworICAgICAgICAgICAgICAgIC8vIExvY2tpbmcgYSBjb2xsZWN0aW9uIChhbmQgYWxsIGl0cyBtZW1iZXIgcmVzb3VyY2VzKQorCisgICAgICAgICAgICAgICAgLy8gQ2hlY2tpbmcgaWYgYSBjaGlsZCByZXNvdXJjZSBvZiB0aGlzIGNvbGxlY3Rpb24gaXMKKyAgICAgICAgICAgICAgICAvLyBhbHJlYWR5IGxvY2tlZAorICAgICAgICAgICAgICAgIFZlY3RvciBsb2NrUGF0aHMgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgICAgICAgICAgbG9ja3NMaXN0ID0gY29sbGVjdGlvbkxvY2tzLmVsZW1lbnRzKCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKGxvY2tzTGlzdC5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgICAgICBMb2NrSW5mbyBjdXJyZW50TG9jayA9IChMb2NrSW5mbykgbG9ja3NMaXN0Lm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50TG9jay5oYXNFeHBpcmVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlTG9ja3MucmVtb3ZlKGN1cnJlbnRMb2NrLnBhdGgpOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoY3VycmVudExvY2sucGF0aC5zdGFydHNXaXRoKGxvY2sucGF0aCkpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgKChjdXJyZW50TG9jay5pc0V4Y2x1c2l2ZSgpKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAobG9jay5pc0V4Y2x1c2l2ZSgpKSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIGNoaWxkIGNvbGxlY3Rpb24gb2YgdGhpcyBjb2xsZWN0aW9uIGlzIGxvY2tlZAorICAgICAgICAgICAgICAgICAgICAgICAgbG9ja1BhdGhzLmFkZEVsZW1lbnQoY3VycmVudExvY2sucGF0aCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbG9ja3NMaXN0ID0gcmVzb3VyY2VMb2Nrcy5lbGVtZW50cygpOworICAgICAgICAgICAgICAgIHdoaWxlIChsb2Nrc0xpc3QuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9ja0luZm8gY3VycmVudExvY2sgPSAoTG9ja0luZm8pIGxvY2tzTGlzdC5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudExvY2suaGFzRXhwaXJlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZUxvY2tzLnJlbW92ZShjdXJyZW50TG9jay5wYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICggKGN1cnJlbnRMb2NrLnBhdGguc3RhcnRzV2l0aChsb2NrLnBhdGgpKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICgoY3VycmVudExvY2suaXNFeGNsdXNpdmUoKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvY2suaXNFeGNsdXNpdmUoKSkpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBjaGlsZCByZXNvdXJjZSBvZiB0aGlzIGNvbGxlY3Rpb24gaXMgbG9ja2VkCisgICAgICAgICAgICAgICAgICAgICAgICBsb2NrUGF0aHMuYWRkRWxlbWVudChjdXJyZW50TG9jay5wYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghbG9ja1BhdGhzLmlzRW1wdHkoKSkgeworCisgICAgICAgICAgICAgICAgICAgIC8vIE9uZSBvZiB0aGUgY2hpbGQgcGF0aHMgd2FzIGxvY2tlZAorICAgICAgICAgICAgICAgICAgICAvLyBXZSBnZW5lcmF0ZSBhIG11bHRpc3RhdHVzIGVycm9yIHJlcG9ydAorCisgICAgICAgICAgICAgICAgICAgIEVudW1lcmF0aW9uIGxvY2tQYXRoc0xpc3QgPSBsb2NrUGF0aHMuZWxlbWVudHMoKTsKKworICAgICAgICAgICAgICAgICAgICByZXNwLnNldFN0YXR1cyhXZWJkYXZTdGF0dXMuU0NfQ09ORkxJQ1QpOworCisgICAgICAgICAgICAgICAgICAgIFhNTFdyaXRlciBnZW5lcmF0ZWRYTUwgPSBuZXcgWE1MV3JpdGVyKCk7CisgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZVhNTEhlYWRlcigpOworCisgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgIChudWxsLCAibXVsdGlzdGF0dXMiICsgZ2VuZXJhdGVOYW1lc3BhY2VEZWNsYXJhdGlvbnMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBYTUxXcml0ZXIuT1BFTklORyk7CisKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGxvY2tQYXRoc0xpc3QuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgInJlc3BvbnNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MV3JpdGVyLk9QRU5JTkcpOworICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAiaHJlZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFdyaXRlci5PUEVOSU5HKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZFhNTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53cml0ZVRleHQoKFN0cmluZykgbG9ja1BhdGhzTGlzdC5uZXh0RWxlbWVudCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgImhyZWYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxXcml0ZXIuQ0xPU0lORyk7CisgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJzdGF0dXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxXcml0ZXIuT1BFTklORyk7CisgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWRYTUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAud3JpdGVUZXh0KCJIVFRQLzEuMSAiICsgV2ViZGF2U3RhdHVzLlNDX0xPQ0tFRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiICIgKyBXZWJkYXZTdGF0dXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRTdGF0dXNUZXh0KFdlYmRhdlN0YXR1cy5TQ19MT0NLRUQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgInN0YXR1cyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFdyaXRlci5DTE9TSU5HKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAicmVzcG9uc2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxXcml0ZXIuQ0xPU0lORyk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJtdWx0aXN0YXR1cyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxXcml0ZXIuQ0xPU0lORyk7CisKKyAgICAgICAgICAgICAgICAgICAgV3JpdGVyIHdyaXRlciA9IHJlc3AuZ2V0V3JpdGVyKCk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZShnZW5lcmF0ZWRYTUwudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5jbG9zZSgpOworCisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJvb2xlYW4gYWRkTG9jayA9IHRydWU7CisKKyAgICAgICAgICAgICAgICAvLyBDaGVja2luZyBpZiB0aGVyZSBpcyBhbHJlYWR5IGEgc2hhcmVkIGxvY2sgb24gdGhpcyBwYXRoCisgICAgICAgICAgICAgICAgbG9ja3NMaXN0ID0gY29sbGVjdGlvbkxvY2tzLmVsZW1lbnRzKCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKGxvY2tzTGlzdC5oYXNNb3JlRWxlbWVudHMoKSkgeworCisgICAgICAgICAgICAgICAgICAgIExvY2tJbmZvIGN1cnJlbnRMb2NrID0gKExvY2tJbmZvKSBsb2Nrc0xpc3QubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRMb2NrLnBhdGguZXF1YWxzKGxvY2sucGF0aCkpIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRMb2NrLmlzRXhjbHVzaXZlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwLnNlbmRFcnJvcihXZWJkYXZTdGF0dXMuU0NfTE9DS0VEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NrLmlzRXhjbHVzaXZlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcC5zZW5kRXJyb3IoV2ViZGF2U3RhdHVzLlNDX0xPQ0tFRCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRMb2NrLnRva2Vucy5hZGRFbGVtZW50KGxvY2tUb2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2NrID0gY3VycmVudExvY2s7CisgICAgICAgICAgICAgICAgICAgICAgICBhZGRMb2NrID0gZmFsc2U7CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGFkZExvY2spIHsKKyAgICAgICAgICAgICAgICAgICAgbG9jay50b2tlbnMuYWRkRWxlbWVudChsb2NrVG9rZW4pOworICAgICAgICAgICAgICAgICAgICBjb2xsZWN0aW9uTG9ja3MuYWRkRWxlbWVudChsb2NrKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgICAgICAvLyBMb2NraW5nIGEgc2luZ2xlIHJlc291cmNlCisKKyAgICAgICAgICAgICAgICAvLyBSZXRyaWV2aW5nIGFuIGFscmVhZHkgZXhpc3RpbmcgbG9jayBvbiB0aGF0IHJlc291cmNlCisgICAgICAgICAgICAgICAgTG9ja0luZm8gcHJlc2VudExvY2sgPSAoTG9ja0luZm8pIHJlc291cmNlTG9ja3MuZ2V0KGxvY2sucGF0aCk7CisgICAgICAgICAgICAgICAgaWYgKHByZXNlbnRMb2NrICE9IG51bGwpIHsKKworICAgICAgICAgICAgICAgICAgICBpZiAoKHByZXNlbnRMb2NrLmlzRXhjbHVzaXZlKCkpIHx8IChsb2NrLmlzRXhjbHVzaXZlKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBlaXRoZXIgbG9jayBpcyBleGNsdXNpdmUsIHRoZSBsb2NrIGNhbid0IGJlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBncmFudGVkCisgICAgICAgICAgICAgICAgICAgICAgICByZXNwLnNlbmRFcnJvcihXZWJkYXZTdGF0dXMuU0NfUFJFQ09ORElUSU9OX0ZBSUxFRCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmVzZW50TG9jay50b2tlbnMuYWRkRWxlbWVudChsb2NrVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgbG9jayA9IHByZXNlbnRMb2NrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAgICAgICAgIGxvY2sudG9rZW5zLmFkZEVsZW1lbnQobG9ja1Rva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VMb2Nrcy5wdXQobG9jay5wYXRoLCBsb2NrKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBDaGVja2luZyBpZiBhIHJlc291cmNlIGV4aXN0cyBhdCB0aGlzIHBhdGgKKyAgICAgICAgICAgICAgICAgICAgZXhpc3RzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCA9IHJlc291cmNlcy5sb29rdXAocGF0aCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBleGlzdHMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoIWV4aXN0cykgeworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyAiQ3JlYXRpbmciIGEgbG9jay1udWxsIHJlc291cmNlCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2xhc2ggPSBsb2NrLnBhdGgubGFzdEluZGV4T2YoJy8nKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXJlbnRQYXRoID0gbG9jay5wYXRoLnN1YnN0cmluZygwLCBzbGFzaCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIFZlY3RvciBsb2NrTnVsbHMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChWZWN0b3IpIGxvY2tOdWxsUmVzb3VyY2VzLmdldChwYXJlbnRQYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NrTnVsbHMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2tOdWxscyA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NrTnVsbFJlc291cmNlcy5wdXQocGFyZW50UGF0aCwgbG9ja051bGxzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgbG9ja051bGxzLmFkZEVsZW1lbnQobG9jay5wYXRoKTsKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgTG9jay1Ub2tlbiBoZWFkZXIgYXMgYnkgUkZDIDI1MTggOC4xMC4xCisgICAgICAgICAgICAgICAgICAgIC8vIC0gb25seSBkbyB0aGlzIGZvciBuZXdseSBjcmVhdGVkIGxvY2tzCisgICAgICAgICAgICAgICAgICAgIHJlc3AuYWRkSGVhZGVyKCJMb2NrLVRva2VuIiwgIjxvcGFxdWVsb2NrdG9rZW46IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGxvY2tUb2tlbiArICI+Iik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIGlmIChsb2NrUmVxdWVzdFR5cGUgPT0gTE9DS19SRUZSRVNIKSB7CisKKyAgICAgICAgICAgIFN0cmluZyBpZkhlYWRlciA9IHJlcS5nZXRIZWFkZXIoIklmIik7CisgICAgICAgICAgICBpZiAoaWZIZWFkZXIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBpZkhlYWRlciA9ICIiOworCisgICAgICAgICAgICAvLyBDaGVja2luZyByZXNvdXJjZSBsb2NrcworCisgICAgICAgICAgICBMb2NrSW5mbyB0b1JlbmV3ID0gKExvY2tJbmZvKSByZXNvdXJjZUxvY2tzLmdldChwYXRoKTsKKyAgICAgICAgICAgIEVudW1lcmF0aW9uIHRva2VuTGlzdCA9IG51bGw7CisgICAgICAgICAgICBpZiAobG9jayAhPSBudWxsKSB7CisKKyAgICAgICAgICAgICAgICAvLyBBdCBsZWFzdCBvbmUgb2YgdGhlIHRva2VucyBvZiB0aGUgbG9ja3MgbXVzdCBoYXZlIGJlZW4gZ2l2ZW4KKworICAgICAgICAgICAgICAgIHRva2VuTGlzdCA9IHRvUmVuZXcudG9rZW5zLmVsZW1lbnRzKCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKHRva2VuTGlzdC5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdG9rZW4gPSAoU3RyaW5nKSB0b2tlbkxpc3QubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlmSGVhZGVyLmluZGV4T2YodG9rZW4pICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0b1JlbmV3LmV4cGlyZXNBdCA9IGxvY2suZXhwaXJlc0F0OworICAgICAgICAgICAgICAgICAgICAgICAgbG9jayA9IHRvUmVuZXc7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQ2hlY2tpbmcgaW5oZXJpdGFibGUgY29sbGVjdGlvbiBsb2NrcworCisgICAgICAgICAgICBFbnVtZXJhdGlvbiBjb2xsZWN0aW9uTG9ja3NMaXN0ID0gY29sbGVjdGlvbkxvY2tzLmVsZW1lbnRzKCk7CisgICAgICAgICAgICB3aGlsZSAoY29sbGVjdGlvbkxvY2tzTGlzdC5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgIHRvUmVuZXcgPSAoTG9ja0luZm8pIGNvbGxlY3Rpb25Mb2Nrc0xpc3QubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICBpZiAocGF0aC5lcXVhbHModG9SZW5ldy5wYXRoKSkgeworCisgICAgICAgICAgICAgICAgICAgIHRva2VuTGlzdCA9IHRvUmVuZXcudG9rZW5zLmVsZW1lbnRzKCk7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlICh0b2tlbkxpc3QuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0b2tlbiA9IChTdHJpbmcpIHRva2VuTGlzdC5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlmSGVhZGVyLmluZGV4T2YodG9rZW4pICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9SZW5ldy5leHBpcmVzQXQgPSBsb2NrLmV4cGlyZXNBdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NrID0gdG9SZW5ldzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICAvLyBTZXQgdGhlIHN0YXR1cywgdGhlbiBnZW5lcmF0ZSB0aGUgWE1MIHJlc3BvbnNlIGNvbnRhaW5pbmcKKyAgICAgICAgLy8gdGhlIGxvY2sgaW5mb3JtYXRpb24KKyAgICAgICAgWE1MV3JpdGVyIGdlbmVyYXRlZFhNTCA9IG5ldyBYTUxXcml0ZXIoKTsKKyAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlWE1MSGVhZGVyKCk7CisgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgInByb3AiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBnZW5lcmF0ZU5hbWVzcGFjZURlY2xhcmF0aW9ucygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFdyaXRlci5PUEVOSU5HKTsKKworICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJsb2NrZGlzY292ZXJ5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxXcml0ZXIuT1BFTklORyk7CisKKyAgICAgICAgbG9jay50b1hNTChnZW5lcmF0ZWRYTUwpOworCisgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgImxvY2tkaXNjb3ZlcnkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFdyaXRlci5DTE9TSU5HKTsKKworICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJwcm9wIiwgWE1MV3JpdGVyLkNMT1NJTkcpOworCisgICAgICAgIHJlc3Auc2V0U3RhdHVzKFdlYmRhdlN0YXR1cy5TQ19PSyk7CisgICAgICAgIHJlc3Auc2V0Q29udGVudFR5cGUoInRleHQveG1sOyBjaGFyc2V0PVVURi04Iik7CisgICAgICAgIFdyaXRlciB3cml0ZXIgPSByZXNwLmdldFdyaXRlcigpOworICAgICAgICB3cml0ZXIud3JpdGUoZ2VuZXJhdGVkWE1MLnRvU3RyaW5nKCkpOworICAgICAgICB3cml0ZXIuY2xvc2UoKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogVU5MT0NLIE1ldGhvZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBkb1VubG9jayhIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3ApCisgICAgICAgIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKHJlYWRPbmx5KSB7CisgICAgICAgICAgICByZXNwLnNlbmRFcnJvcihXZWJkYXZTdGF0dXMuU0NfRk9SQklEREVOKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpc0xvY2tlZChyZXEpKSB7CisgICAgICAgICAgICByZXNwLnNlbmRFcnJvcihXZWJkYXZTdGF0dXMuU0NfTE9DS0VEKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBwYXRoID0gZ2V0UmVsYXRpdmVQYXRoKHJlcSk7CisKKyAgICAgICAgU3RyaW5nIGxvY2tUb2tlbkhlYWRlciA9IHJlcS5nZXRIZWFkZXIoIkxvY2stVG9rZW4iKTsKKyAgICAgICAgaWYgKGxvY2tUb2tlbkhlYWRlciA9PSBudWxsKQorICAgICAgICAgICAgbG9ja1Rva2VuSGVhZGVyID0gIiI7CisKKyAgICAgICAgLy8gQ2hlY2tpbmcgcmVzb3VyY2UgbG9ja3MKKworICAgICAgICBMb2NrSW5mbyBsb2NrID0gKExvY2tJbmZvKSByZXNvdXJjZUxvY2tzLmdldChwYXRoKTsKKyAgICAgICAgRW51bWVyYXRpb24gdG9rZW5MaXN0ID0gbnVsbDsKKyAgICAgICAgaWYgKGxvY2sgIT0gbnVsbCkgeworCisgICAgICAgICAgICAvLyBBdCBsZWFzdCBvbmUgb2YgdGhlIHRva2VucyBvZiB0aGUgbG9ja3MgbXVzdCBoYXZlIGJlZW4gZ2l2ZW4KKworICAgICAgICAgICAgdG9rZW5MaXN0ID0gbG9jay50b2tlbnMuZWxlbWVudHMoKTsKKyAgICAgICAgICAgIHdoaWxlICh0b2tlbkxpc3QuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdG9rZW4gPSAoU3RyaW5nKSB0b2tlbkxpc3QubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICBpZiAobG9ja1Rva2VuSGVhZGVyLmluZGV4T2YodG9rZW4pICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIGxvY2sudG9rZW5zLnJlbW92ZUVsZW1lbnQodG9rZW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGxvY2sudG9rZW5zLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIHJlc291cmNlTG9ja3MucmVtb3ZlKHBhdGgpOworICAgICAgICAgICAgICAgIC8vIFJlbW92aW5nIGFueSBsb2NrLW51bGwgcmVzb3VyY2Ugd2hpY2ggd291bGQgYmUgcHJlc2VudAorICAgICAgICAgICAgICAgIGxvY2tOdWxsUmVzb3VyY2VzLnJlbW92ZShwYXRoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2hlY2tpbmcgaW5oZXJpdGFibGUgY29sbGVjdGlvbiBsb2NrcworCisgICAgICAgIEVudW1lcmF0aW9uIGNvbGxlY3Rpb25Mb2Nrc0xpc3QgPSBjb2xsZWN0aW9uTG9ja3MuZWxlbWVudHMoKTsKKyAgICAgICAgd2hpbGUgKGNvbGxlY3Rpb25Mb2Nrc0xpc3QuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgIGxvY2sgPSAoTG9ja0luZm8pIGNvbGxlY3Rpb25Mb2Nrc0xpc3QubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgIGlmIChwYXRoLmVxdWFscyhsb2NrLnBhdGgpKSB7CisKKyAgICAgICAgICAgICAgICB0b2tlbkxpc3QgPSBsb2NrLnRva2Vucy5lbGVtZW50cygpOworICAgICAgICAgICAgICAgIHdoaWxlICh0b2tlbkxpc3QuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRva2VuID0gKFN0cmluZykgdG9rZW5MaXN0Lm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChsb2NrVG9rZW5IZWFkZXIuaW5kZXhPZih0b2tlbikgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvY2sudG9rZW5zLnJlbW92ZUVsZW1lbnQodG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobG9jay50b2tlbnMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbGxlY3Rpb25Mb2Nrcy5yZW1vdmVFbGVtZW50KGxvY2spOworICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmluZyBhbnkgbG9jay1udWxsIHJlc291cmNlIHdoaWNoIHdvdWxkIGJlIHByZXNlbnQKKyAgICAgICAgICAgICAgICAgICAgbG9ja051bGxSZXNvdXJjZXMucmVtb3ZlKHBhdGgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmVzcC5zZXRTdGF0dXMoV2ViZGF2U3RhdHVzLlNDX05PX0NPTlRFTlQpOworCisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgY29udGV4dC1yZWxhdGl2ZSBwYXRoLCBiZWdpbm5pbmcgd2l0aCBhICIvIiwgdGhhdCByZXByZXNlbnRzCisgICAgICogdGhlIGNhbm9uaWNhbCB2ZXJzaW9uIG9mIHRoZSBzcGVjaWZpZWQgcGF0aCBhZnRlciAiLi4iIGFuZCAiLiIgZWxlbWVudHMKKyAgICAgKiBhcmUgcmVzb2x2ZWQgb3V0LiAgSWYgdGhlIHNwZWNpZmllZCBwYXRoIGF0dGVtcHRzIHRvIGdvIG91dHNpZGUgdGhlCisgICAgICogYm91bmRhcmllcyBvZiB0aGUgY3VycmVudCBjb250ZXh0IChpLmUuIHRvbyBtYW55ICIuLiIgcGF0aCBlbGVtZW50cworICAgICAqIGFyZSBwcmVzZW50KSwgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGluc3RlYWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0aCBQYXRoIHRvIGJlIG5vcm1hbGl6ZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIG5vcm1hbGl6ZShTdHJpbmcgcGF0aCkgeworCisgICAgICAgIGlmIChwYXRoID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAvLyBDcmVhdGUgYSBwbGFjZSBmb3IgdGhlIG5vcm1hbGl6ZWQgcGF0aAorICAgICAgICBTdHJpbmcgbm9ybWFsaXplZCA9IHBhdGg7CisKKyAgICAgICAgaWYgKG5vcm1hbGl6ZWQgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisKKyAgICAgICAgaWYgKG5vcm1hbGl6ZWQuZXF1YWxzKCIvLiIpKQorICAgICAgICAgICAgcmV0dXJuICIvIjsKKworICAgICAgICAvLyBOb3JtYWxpemUgdGhlIHNsYXNoZXMgYW5kIGFkZCBsZWFkaW5nIHNsYXNoIGlmIG5lY2Vzc2FyeQorICAgICAgICBpZiAobm9ybWFsaXplZC5pbmRleE9mKCdcXCcpID49IDApCisgICAgICAgICAgICBub3JtYWxpemVkID0gbm9ybWFsaXplZC5yZXBsYWNlKCdcXCcsICcvJyk7CisgICAgICAgIGlmICghbm9ybWFsaXplZC5zdGFydHNXaXRoKCIvIikpCisgICAgICAgICAgICBub3JtYWxpemVkID0gIi8iICsgbm9ybWFsaXplZDsKKworICAgICAgICAvLyBSZXNvbHZlIG9jY3VycmVuY2VzIG9mICIvLyIgaW4gdGhlIG5vcm1hbGl6ZWQgcGF0aAorICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgaW50IGluZGV4ID0gbm9ybWFsaXplZC5pbmRleE9mKCIvLyIpOworICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIG5vcm1hbGl6ZWQgPSBub3JtYWxpemVkLnN1YnN0cmluZygwLCBpbmRleCkgKworICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWQuc3Vic3RyaW5nKGluZGV4ICsgMSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXNvbHZlIG9jY3VycmVuY2VzIG9mICIvLi8iIGluIHRoZSBub3JtYWxpemVkIHBhdGgKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIGludCBpbmRleCA9IG5vcm1hbGl6ZWQuaW5kZXhPZigiLy4vIik7CisgICAgICAgICAgICBpZiAoaW5kZXggPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZWQuc3Vic3RyaW5nKDAsIGluZGV4KSArCisgICAgICAgICAgICAgICAgbm9ybWFsaXplZC5zdWJzdHJpbmcoaW5kZXggKyAyKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlc29sdmUgb2NjdXJyZW5jZXMgb2YgIi8uLi8iIGluIHRoZSBub3JtYWxpemVkIHBhdGgKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIGludCBpbmRleCA9IG5vcm1hbGl6ZWQuaW5kZXhPZigiLy4uLyIpOworICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGlmIChpbmRleCA9PSAwKQorICAgICAgICAgICAgICAgIHJldHVybiAobnVsbCk7ICAvLyBUcnlpbmcgdG8gZ28gb3V0c2lkZSBvdXIgY29udGV4dAorICAgICAgICAgICAgaW50IGluZGV4MiA9IG5vcm1hbGl6ZWQubGFzdEluZGV4T2YoJy8nLCBpbmRleCAtIDEpOworICAgICAgICAgICAgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZWQuc3Vic3RyaW5nKDAsIGluZGV4MikgKworICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWQuc3Vic3RyaW5nKGluZGV4ICsgMyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXR1cm4gdGhlIG5vcm1hbGl6ZWQgcGF0aCB0aGF0IHdlIGhhdmUgY29tcGxldGVkCisgICAgICAgIHJldHVybiAobm9ybWFsaXplZCk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByaXZhdGUgTWV0aG9kcworCisgICAgLyoqCisgICAgICogR2VuZXJhdGUgdGhlIG5hbWVzcGFjZSBkZWNsYXJhdGlvbnMuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2VuZXJhdGVOYW1lc3BhY2VEZWNsYXJhdGlvbnMoKSB7CisgICAgICAgIHJldHVybiAiIHhtbG5zPVwiIiArIERFRkFVTFRfTkFNRVNQQUNFICsgIlwiIjsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENoZWNrIHRvIHNlZSBpZiBhIHJlc291cmNlIGlzIGN1cnJlbnRseSB3cml0ZSBsb2NrZWQuIFRoZSBtZXRob2QKKyAgICAgKiB3aWxsIGxvb2sgYXQgdGhlICJJZiIgaGVhZGVyIHRvIG1ha2Ugc3VyZSB0aGUgY2xpZW50CisgICAgICogaGFzIGdpdmUgdGhlIGFwcHJvcHJpYXRlIGxvY2sgdG9rZW5zLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcSBTZXJ2bGV0IHJlcXVlc3QKKyAgICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiB0aGUgcmVzb3VyY2UgaXMgbG9ja2VkIChhbmQgbm8gYXBwcm9wcmlhdGUKKyAgICAgKiBsb2NrIHRva2VuIGhhcyBiZWVuIGZvdW5kIGZvciBhdCBsZWFzdCBvbmUgb2YgdGhlIG5vbi1zaGFyZWQgbG9ja3Mgd2hpY2gKKyAgICAgKiBhcmUgcHJlc2VudCBvbiB0aGUgcmVzb3VyY2UpLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBpc0xvY2tlZChIdHRwU2VydmxldFJlcXVlc3QgcmVxKSB7CisKKyAgICAgICAgU3RyaW5nIHBhdGggPSBnZXRSZWxhdGl2ZVBhdGgocmVxKTsKKworICAgICAgICBTdHJpbmcgaWZIZWFkZXIgPSByZXEuZ2V0SGVhZGVyKCJJZiIpOworICAgICAgICBpZiAoaWZIZWFkZXIgPT0gbnVsbCkKKyAgICAgICAgICAgIGlmSGVhZGVyID0gIiI7CisKKyAgICAgICAgU3RyaW5nIGxvY2tUb2tlbkhlYWRlciA9IHJlcS5nZXRIZWFkZXIoIkxvY2stVG9rZW4iKTsKKyAgICAgICAgaWYgKGxvY2tUb2tlbkhlYWRlciA9PSBudWxsKQorICAgICAgICAgICAgbG9ja1Rva2VuSGVhZGVyID0gIiI7CisKKyAgICAgICAgcmV0dXJuIGlzTG9ja2VkKHBhdGgsIGlmSGVhZGVyICsgbG9ja1Rva2VuSGVhZGVyKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ2hlY2sgdG8gc2VlIGlmIGEgcmVzb3VyY2UgaXMgY3VycmVudGx5IHdyaXRlIGxvY2tlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXRoIFBhdGggb2YgdGhlIHJlc291cmNlCisgICAgICogQHBhcmFtIGlmSGVhZGVyICJJZiIgSFRUUCBoZWFkZXIgd2hpY2ggd2FzIGluY2x1ZGVkIGluIHRoZSByZXF1ZXN0CisgICAgICogQHJldHVybiBib29sZWFuIHRydWUgaWYgdGhlIHJlc291cmNlIGlzIGxvY2tlZCAoYW5kIG5vIGFwcHJvcHJpYXRlCisgICAgICogbG9jayB0b2tlbiBoYXMgYmVlbiBmb3VuZCBmb3IgYXQgbGVhc3Qgb25lIG9mIHRoZSBub24tc2hhcmVkIGxvY2tzIHdoaWNoCisgICAgICogYXJlIHByZXNlbnQgb24gdGhlIHJlc291cmNlKS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaXNMb2NrZWQoU3RyaW5nIHBhdGgsIFN0cmluZyBpZkhlYWRlcikgeworCisgICAgICAgIC8vIENoZWNraW5nIHJlc291cmNlIGxvY2tzCisKKyAgICAgICAgTG9ja0luZm8gbG9jayA9IChMb2NrSW5mbykgcmVzb3VyY2VMb2Nrcy5nZXQocGF0aCk7CisgICAgICAgIEVudW1lcmF0aW9uIHRva2VuTGlzdCA9IG51bGw7CisgICAgICAgIGlmICgobG9jayAhPSBudWxsKSAmJiAobG9jay5oYXNFeHBpcmVkKCkpKSB7CisgICAgICAgICAgICByZXNvdXJjZUxvY2tzLnJlbW92ZShwYXRoKTsKKyAgICAgICAgfSBlbHNlIGlmIChsb2NrICE9IG51bGwpIHsKKworICAgICAgICAgICAgLy8gQXQgbGVhc3Qgb25lIG9mIHRoZSB0b2tlbnMgb2YgdGhlIGxvY2tzIG11c3QgaGF2ZSBiZWVuIGdpdmVuCisKKyAgICAgICAgICAgIHRva2VuTGlzdCA9IGxvY2sudG9rZW5zLmVsZW1lbnRzKCk7CisgICAgICAgICAgICBib29sZWFuIHRva2VuTWF0Y2ggPSBmYWxzZTsKKyAgICAgICAgICAgIHdoaWxlICh0b2tlbkxpc3QuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdG9rZW4gPSAoU3RyaW5nKSB0b2tlbkxpc3QubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICBpZiAoaWZIZWFkZXIuaW5kZXhPZih0b2tlbikgIT0gLTEpCisgICAgICAgICAgICAgICAgICAgIHRva2VuTWF0Y2ggPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCF0b2tlbk1hdGNoKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgIH0KKworICAgICAgICAvLyBDaGVja2luZyBpbmhlcml0YWJsZSBjb2xsZWN0aW9uIGxvY2tzCisKKyAgICAgICAgRW51bWVyYXRpb24gY29sbGVjdGlvbkxvY2tzTGlzdCA9IGNvbGxlY3Rpb25Mb2Nrcy5lbGVtZW50cygpOworICAgICAgICB3aGlsZSAoY29sbGVjdGlvbkxvY2tzTGlzdC5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgbG9jayA9IChMb2NrSW5mbykgY29sbGVjdGlvbkxvY2tzTGlzdC5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgaWYgKGxvY2suaGFzRXhwaXJlZCgpKSB7CisgICAgICAgICAgICAgICAgY29sbGVjdGlvbkxvY2tzLnJlbW92ZUVsZW1lbnQobG9jayk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHBhdGguc3RhcnRzV2l0aChsb2NrLnBhdGgpKSB7CisKKyAgICAgICAgICAgICAgICB0b2tlbkxpc3QgPSBsb2NrLnRva2Vucy5lbGVtZW50cygpOworICAgICAgICAgICAgICAgIGJvb2xlYW4gdG9rZW5NYXRjaCA9IGZhbHNlOworICAgICAgICAgICAgICAgIHdoaWxlICh0b2tlbkxpc3QuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRva2VuID0gKFN0cmluZykgdG9rZW5MaXN0Lm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChpZkhlYWRlci5pbmRleE9mKHRva2VuKSAhPSAtMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuTWF0Y2ggPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIXRva2VuTWF0Y2gpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvcHkgYSByZXNvdXJjZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXEgU2VydmxldCByZXF1ZXN0CisgICAgICogQHBhcmFtIHJlc3AgU2VydmxldCByZXNwb25zZQorICAgICAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIHRoZSBjb3B5IGlzIHN1Y2Nlc3NmdWwKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gY29weVJlc291cmNlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3ApCisgICAgICAgIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gUGFyc2luZyBkZXN0aW5hdGlvbiBoZWFkZXIKKworICAgICAgICBTdHJpbmcgZGVzdGluYXRpb25QYXRoID0gcmVxLmdldEhlYWRlcigiRGVzdGluYXRpb24iKTsKKworICAgICAgICBpZiAoZGVzdGluYXRpb25QYXRoID09IG51bGwpIHsKKyAgICAgICAgICAgIHJlc3Auc2VuZEVycm9yKFdlYmRhdlN0YXR1cy5TQ19CQURfUkVRVUVTVCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZW1vdmUgdXJsIGVuY29kaW5nIGZyb20gZGVzdGluYXRpb24KKyAgICAgICAgZGVzdGluYXRpb25QYXRoID0gUmVxdWVzdFV0aWwuVVJMRGVjb2RlKGRlc3RpbmF0aW9uUGF0aCwgIlVURjgiKTsKKworICAgICAgICBpbnQgcHJvdG9jb2xJbmRleCA9IGRlc3RpbmF0aW9uUGF0aC5pbmRleE9mKCI6Ly8iKTsKKyAgICAgICAgaWYgKHByb3RvY29sSW5kZXggPj0gMCkgeworICAgICAgICAgICAgLy8gaWYgdGhlIERlc3RpbmF0aW9uIFVSTCBjb250YWlucyB0aGUgcHJvdG9jb2wsIHdlIGNhbiBzYWZlbHkKKyAgICAgICAgICAgIC8vIHRyaW0gZXZlcnl0aGluZyB1cHRvIHRoZSBmaXJzdCAiLyIgY2hhcmFjdGVyIGFmdGVyICI6Ly8iCisgICAgICAgICAgICBpbnQgZmlyc3RTZXBhcmF0b3IgPQorICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uUGF0aC5pbmRleE9mKCIvIiwgcHJvdG9jb2xJbmRleCArIDQpOworICAgICAgICAgICAgaWYgKGZpcnN0U2VwYXJhdG9yIDwgMCkgeworICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uUGF0aCA9ICIvIjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZGVzdGluYXRpb25QYXRoID0gZGVzdGluYXRpb25QYXRoLnN1YnN0cmluZyhmaXJzdFNlcGFyYXRvcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBTdHJpbmcgaG9zdE5hbWUgPSByZXEuZ2V0U2VydmVyTmFtZSgpOworICAgICAgICAgICAgaWYgKChob3N0TmFtZSAhPSBudWxsKSAmJiAoZGVzdGluYXRpb25QYXRoLnN0YXJ0c1dpdGgoaG9zdE5hbWUpKSkgeworICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uUGF0aCA9IGRlc3RpbmF0aW9uUGF0aC5zdWJzdHJpbmcoaG9zdE5hbWUubGVuZ3RoKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgcG9ydEluZGV4ID0gZGVzdGluYXRpb25QYXRoLmluZGV4T2YoIjoiKTsKKyAgICAgICAgICAgIGlmIChwb3J0SW5kZXggPj0gMCkgeworICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uUGF0aCA9IGRlc3RpbmF0aW9uUGF0aC5zdWJzdHJpbmcocG9ydEluZGV4KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGRlc3RpbmF0aW9uUGF0aC5zdGFydHNXaXRoKCI6IikpIHsKKyAgICAgICAgICAgICAgICBpbnQgZmlyc3RTZXBhcmF0b3IgPSBkZXN0aW5hdGlvblBhdGguaW5kZXhPZigiLyIpOworICAgICAgICAgICAgICAgIGlmIChmaXJzdFNlcGFyYXRvciA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb25QYXRoID0gIi8iOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uUGF0aCA9CisgICAgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvblBhdGguc3Vic3RyaW5nKGZpcnN0U2VwYXJhdG9yKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBOb3JtYWxpc2UgZGVzdGluYXRpb24gcGF0aCAocmVtb3ZlICcuJyBhbmQgJy4uJykKKyAgICAgICAgZGVzdGluYXRpb25QYXRoID0gbm9ybWFsaXplKGRlc3RpbmF0aW9uUGF0aCk7CisKKyAgICAgICAgU3RyaW5nIGNvbnRleHRQYXRoID0gcmVxLmdldENvbnRleHRQYXRoKCk7CisgICAgICAgIGlmICgoY29udGV4dFBhdGggIT0gbnVsbCkgJiYKKyAgICAgICAgICAgIChkZXN0aW5hdGlvblBhdGguc3RhcnRzV2l0aChjb250ZXh0UGF0aCkpKSB7CisgICAgICAgICAgICBkZXN0aW5hdGlvblBhdGggPSBkZXN0aW5hdGlvblBhdGguc3Vic3RyaW5nKGNvbnRleHRQYXRoLmxlbmd0aCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBwYXRoSW5mbyA9IHJlcS5nZXRQYXRoSW5mbygpOworICAgICAgICBpZiAocGF0aEluZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nIHNlcnZsZXRQYXRoID0gcmVxLmdldFNlcnZsZXRQYXRoKCk7CisgICAgICAgICAgICBpZiAoKHNlcnZsZXRQYXRoICE9IG51bGwpICYmCisgICAgICAgICAgICAgICAgKGRlc3RpbmF0aW9uUGF0aC5zdGFydHNXaXRoKHNlcnZsZXRQYXRoKSkpIHsKKyAgICAgICAgICAgICAgICBkZXN0aW5hdGlvblBhdGggPSBkZXN0aW5hdGlvblBhdGgKKyAgICAgICAgICAgICAgICAgICAgLnN1YnN0cmluZyhzZXJ2bGV0UGF0aC5sZW5ndGgoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoZGVidWcgPiAwKQorICAgICAgICAgICAgbG9nKCJEZXN0IHBhdGggOiIgKyBkZXN0aW5hdGlvblBhdGgpOworCisgICAgICAgIGlmICgoZGVzdGluYXRpb25QYXRoLnRvVXBwZXJDYXNlKCkuc3RhcnRzV2l0aCgiL1dFQi1JTkYiKSkgfHwKKyAgICAgICAgICAgIChkZXN0aW5hdGlvblBhdGgudG9VcHBlckNhc2UoKS5zdGFydHNXaXRoKCIvTUVUQS1JTkYiKSkpIHsKKyAgICAgICAgICAgIHJlc3Auc2VuZEVycm9yKFdlYmRhdlN0YXR1cy5TQ19GT1JCSURERU4pOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIHBhdGggPSBnZXRSZWxhdGl2ZVBhdGgocmVxKTsKKworICAgICAgICBpZiAoKHBhdGgudG9VcHBlckNhc2UoKS5zdGFydHNXaXRoKCIvV0VCLUlORiIpKSB8fAorICAgICAgICAgICAgKHBhdGgudG9VcHBlckNhc2UoKS5zdGFydHNXaXRoKCIvTUVUQS1JTkYiKSkpIHsKKyAgICAgICAgICAgIHJlc3Auc2VuZEVycm9yKFdlYmRhdlN0YXR1cy5TQ19GT1JCSURERU4pOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRlc3RpbmF0aW9uUGF0aC5lcXVhbHMocGF0aCkpIHsKKyAgICAgICAgICAgIHJlc3Auc2VuZEVycm9yKFdlYmRhdlN0YXR1cy5TQ19GT1JCSURERU4pOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gUGFyc2luZyBvdmVyd3JpdGUgaGVhZGVyCisKKyAgICAgICAgYm9vbGVhbiBvdmVyd3JpdGUgPSB0cnVlOworICAgICAgICBTdHJpbmcgb3ZlcndyaXRlSGVhZGVyID0gcmVxLmdldEhlYWRlcigiT3ZlcndyaXRlIik7CisKKyAgICAgICAgaWYgKG92ZXJ3cml0ZUhlYWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAob3ZlcndyaXRlSGVhZGVyLmVxdWFsc0lnbm9yZUNhc2UoIlQiKSkgeworICAgICAgICAgICAgICAgIG92ZXJ3cml0ZSA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG92ZXJ3cml0ZSA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gT3ZlcndyaXRpbmcgdGhlIGRlc3RpbmF0aW9uCisKKyAgICAgICAgYm9vbGVhbiBleGlzdHMgPSB0cnVlOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVzb3VyY2VzLmxvb2t1cChkZXN0aW5hdGlvblBhdGgpOworICAgICAgICB9IGNhdGNoIChOYW1pbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZXhpc3RzID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBpZiAob3ZlcndyaXRlKSB7CisKKyAgICAgICAgICAgIC8vIERlbGV0ZSBkZXN0aW5hdGlvbiByZXNvdXJjZSwgaWYgaXQgZXhpc3RzCisgICAgICAgICAgICBpZiAoZXhpc3RzKSB7CisgICAgICAgICAgICAgICAgaWYgKCFkZWxldGVSZXNvdXJjZShkZXN0aW5hdGlvblBhdGgsIHJlcSwgcmVzcCwgdHJ1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmVzcC5zZXRTdGF0dXMoV2ViZGF2U3RhdHVzLlNDX0NSRUFURUQpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgIC8vIElmIHRoZSBkZXN0aW5hdGlvbiBleGlzdHMsIHRoZW4gaXQncyBhIGNvbmZsaWN0CisgICAgICAgICAgICBpZiAoZXhpc3RzKSB7CisgICAgICAgICAgICAgICAgcmVzcC5zZW5kRXJyb3IoV2ViZGF2U3RhdHVzLlNDX1BSRUNPTkRJVElPTl9GQUlMRUQpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgLy8gQ29weWluZyBzb3VyY2UgdG8gZGVzdGluYXRpb24KKworICAgICAgICBIYXNodGFibGUgZXJyb3JMaXN0ID0gbmV3IEhhc2h0YWJsZSgpOworCisgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gY29weVJlc291cmNlKHJlc291cmNlcywgZXJyb3JMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLCBkZXN0aW5hdGlvblBhdGgpOworCisgICAgICAgIGlmICgoIXJlc3VsdCkgfHwgKCFlcnJvckxpc3QuaXNFbXB0eSgpKSkgeworCisgICAgICAgICAgICBzZW5kUmVwb3J0KHJlcSwgcmVzcCwgZXJyb3JMaXN0KTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICB9CisKKyAgICAgICAgLy8gUmVtb3ZpbmcgYW55IGxvY2stbnVsbCByZXNvdXJjZSB3aGljaCB3b3VsZCBiZSBwcmVzZW50IGF0CisgICAgICAgIC8vIHRoZSBkZXN0aW5hdGlvbiBwYXRoCisgICAgICAgIGxvY2tOdWxsUmVzb3VyY2VzLnJlbW92ZShkZXN0aW5hdGlvblBhdGgpOworCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDb3B5IGEgY29sbGVjdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNvdXJjZXMgUmVzb3VyY2VzIGltcGxlbWVudGF0aW9uIHRvIGJlIHVzZWQKKyAgICAgKiBAcGFyYW0gZXJyb3JMaXN0IEhhc2h0YWJsZSBjb250YWluaW5nIHRoZSBsaXN0IG9mIGVycm9ycyB3aGljaCBvY2N1cnJlZAorICAgICAqIGR1cmluZyB0aGUgY29weSBvcGVyYXRpb24KKyAgICAgKiBAcGFyYW0gc291cmNlIFBhdGggb2YgdGhlIHJlc291cmNlIHRvIGJlIGNvcGllZAorICAgICAqIEBwYXJhbSBkZXN0IERlc3RpbmF0aW9uIHBhdGgKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gY29weVJlc291cmNlKERpckNvbnRleHQgcmVzb3VyY2VzLCBIYXNodGFibGUgZXJyb3JMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNvdXJjZSwgU3RyaW5nIGRlc3QpIHsKKworICAgICAgICBpZiAoZGVidWcgPiAxKQorICAgICAgICAgICAgbG9nKCJDb3B5OiAiICsgc291cmNlICsgIiBUbzogIiArIGRlc3QpOworCisgICAgICAgIE9iamVjdCBvYmplY3QgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgb2JqZWN0ID0gcmVzb3VyY2VzLmxvb2t1cChzb3VyY2UpOworICAgICAgICB9IGNhdGNoIChOYW1pbmdFeGNlcHRpb24gZSkgeworICAgICAgICB9CisKKyAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIERpckNvbnRleHQpIHsKKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXNvdXJjZXMuY3JlYXRlU3ViY29udGV4dChkZXN0KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZXJyb3JMaXN0LnB1dAorICAgICAgICAgICAgICAgICAgICAoZGVzdCwgbmV3IEludGVnZXIoV2ViZGF2U3RhdHVzLlNDX0NPTkZMSUNUKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIE5hbWluZ0VudW1lcmF0aW9uIGVudW1lcmF0aW9uID0gcmVzb3VyY2VzLmxpc3Qoc291cmNlKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoZW51bWVyYXRpb24uaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgTmFtZUNsYXNzUGFpciBuY1BhaXIgPSAoTmFtZUNsYXNzUGFpcikgZW51bWVyYXRpb24ubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNoaWxkRGVzdCA9IGRlc3Q7CisgICAgICAgICAgICAgICAgICAgIGlmICghY2hpbGREZXN0LmVxdWFscygiLyIpKQorICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGREZXN0ICs9ICIvIjsKKyAgICAgICAgICAgICAgICAgICAgY2hpbGREZXN0ICs9IG5jUGFpci5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjaGlsZFNyYyA9IHNvdXJjZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGlsZFNyYy5lcXVhbHMoIi8iKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkU3JjICs9ICIvIjsKKyAgICAgICAgICAgICAgICAgICAgY2hpbGRTcmMgKz0gbmNQYWlyLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgY29weVJlc291cmNlKHJlc291cmNlcywgZXJyb3JMaXN0LCBjaGlsZFNyYywgY2hpbGREZXN0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChOYW1pbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGVycm9yTGlzdC5wdXQKKyAgICAgICAgICAgICAgICAgICAgKGRlc3QsIG5ldyBJbnRlZ2VyKFdlYmRhdlN0YXR1cy5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFJlc291cmNlKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmJpbmQoZGVzdCwgb2JqZWN0KTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChOYW1pbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBlcnJvckxpc3QucHV0CisgICAgICAgICAgICAgICAgICAgICAgICAoc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbnRlZ2VyKFdlYmRhdlN0YXR1cy5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZXJyb3JMaXN0LnB1dAorICAgICAgICAgICAgICAgICAgICAoc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgbmV3IEludGVnZXIoV2ViZGF2U3RhdHVzLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUikpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIERlbGV0ZSBhIHJlc291cmNlLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcSBTZXJ2bGV0IHJlcXVlc3QKKyAgICAgKiBAcGFyYW0gcmVzcCBTZXJ2bGV0IHJlc3BvbnNlCisgICAgICogQHJldHVybiBib29sZWFuIHRydWUgaWYgdGhlIGNvcHkgaXMgc3VjY2Vzc2Z1bAorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBkZWxldGVSZXNvdXJjZShIdHRwU2VydmxldFJlcXVlc3QgcmVxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3ApCisgICAgICAgIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgU3RyaW5nIHBhdGggPSBnZXRSZWxhdGl2ZVBhdGgocmVxKTsKKworICAgICAgICByZXR1cm4gZGVsZXRlUmVzb3VyY2UocGF0aCwgcmVxLCByZXNwLCB0cnVlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogRGVsZXRlIGEgcmVzb3VyY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0aCBQYXRoIG9mIHRoZSByZXNvdXJjZSB3aGljaCBpcyB0byBiZSBkZWxldGVkCisgICAgICogQHBhcmFtIHJlcSBTZXJ2bGV0IHJlcXVlc3QKKyAgICAgKiBAcGFyYW0gcmVzcCBTZXJ2bGV0IHJlc3BvbnNlCisgICAgICogQHBhcmFtIHNldFN0YXR1cyBTaG91bGQgdGhlIHJlc3BvbnNlIHN0YXR1cyBiZSBzZXQgb24gc3VjY2Vzc2Z1bAorICAgICAqICAgICAgICAgICAgICAgICAgY29tcGxldGlvbgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBkZWxldGVSZXNvdXJjZShTdHJpbmcgcGF0aCwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwLCBib29sZWFuIHNldFN0YXR1cykKKyAgICAgICAgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAoKHBhdGgudG9VcHBlckNhc2UoKS5zdGFydHNXaXRoKCIvV0VCLUlORiIpKSB8fAorICAgICAgICAgICAgKHBhdGgudG9VcHBlckNhc2UoKS5zdGFydHNXaXRoKCIvTUVUQS1JTkYiKSkpIHsKKyAgICAgICAgICAgIHJlc3Auc2VuZEVycm9yKFdlYmRhdlN0YXR1cy5TQ19GT1JCSURERU4pOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIGlmSGVhZGVyID0gcmVxLmdldEhlYWRlcigiSWYiKTsKKyAgICAgICAgaWYgKGlmSGVhZGVyID09IG51bGwpCisgICAgICAgICAgICBpZkhlYWRlciA9ICIiOworCisgICAgICAgIFN0cmluZyBsb2NrVG9rZW5IZWFkZXIgPSByZXEuZ2V0SGVhZGVyKCJMb2NrLVRva2VuIik7CisgICAgICAgIGlmIChsb2NrVG9rZW5IZWFkZXIgPT0gbnVsbCkKKyAgICAgICAgICAgIGxvY2tUb2tlbkhlYWRlciA9ICIiOworCisgICAgICAgIGlmIChpc0xvY2tlZChwYXRoLCBpZkhlYWRlciArIGxvY2tUb2tlbkhlYWRlcikpIHsKKyAgICAgICAgICAgIHJlc3Auc2VuZEVycm9yKFdlYmRhdlN0YXR1cy5TQ19MT0NLRUQpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiBleGlzdHMgPSB0cnVlOworICAgICAgICBPYmplY3Qgb2JqZWN0ID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9iamVjdCA9IHJlc291cmNlcy5sb29rdXAocGF0aCk7CisgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBleGlzdHMgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghZXhpc3RzKSB7CisgICAgICAgICAgICByZXNwLnNlbmRFcnJvcihXZWJkYXZTdGF0dXMuU0NfTk9UX0ZPVU5EKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2xlYW4gY29sbGVjdGlvbiA9IChvYmplY3QgaW5zdGFuY2VvZiBEaXJDb250ZXh0KTsKKworICAgICAgICBpZiAoIWNvbGxlY3Rpb24pIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmVzb3VyY2VzLnVuYmluZChwYXRoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgcmVzcC5zZW5kRXJyb3IoV2ViZGF2U3RhdHVzLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICBIYXNodGFibGUgZXJyb3JMaXN0ID0gbmV3IEhhc2h0YWJsZSgpOworCisgICAgICAgICAgICBkZWxldGVDb2xsZWN0aW9uKHJlcSwgcmVzb3VyY2VzLCBwYXRoLCBlcnJvckxpc3QpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXNvdXJjZXMudW5iaW5kKHBhdGgpOworICAgICAgICAgICAgfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBlcnJvckxpc3QucHV0KHBhdGgsIG5ldyBJbnRlZ2VyCisgICAgICAgICAgICAgICAgICAgIChXZWJkYXZTdGF0dXMuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghZXJyb3JMaXN0LmlzRW1wdHkoKSkgeworCisgICAgICAgICAgICAgICAgc2VuZFJlcG9ydChyZXEsIHJlc3AsIGVycm9yTGlzdCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBpZiAoc2V0U3RhdHVzKSB7CisgICAgICAgICAgICByZXNwLnNldFN0YXR1cyhXZWJkYXZTdGF0dXMuU0NfTk9fQ09OVEVOVCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIERlbGV0ZXMgYSBjb2xsZWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHJlc291cmNlcyBSZXNvdXJjZXMgaW1wbGVtZW50YXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBjb250ZXh0CisgICAgICogQHBhcmFtIHBhdGggUGF0aCB0byB0aGUgY29sbGVjdGlvbiB0byBiZSBkZWxldGVkCisgICAgICogQHBhcmFtIGVycm9yTGlzdCBDb250YWlucyB0aGUgbGlzdCBvZiB0aGUgZXJyb3JzIHdoaWNoIG9jY3VycmVkCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGRlbGV0ZUNvbGxlY3Rpb24oSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXJDb250ZXh0IHJlc291cmNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGF0aCwgSGFzaHRhYmxlIGVycm9yTGlzdCkgeworCisgICAgICAgIGlmIChkZWJ1ZyA+IDEpCisgICAgICAgICAgICBsb2coIkRlbGV0ZToiICsgcGF0aCk7CisKKyAgICAgICAgaWYgKChwYXRoLnRvVXBwZXJDYXNlKCkuc3RhcnRzV2l0aCgiL1dFQi1JTkYiKSkgfHwKKyAgICAgICAgICAgIChwYXRoLnRvVXBwZXJDYXNlKCkuc3RhcnRzV2l0aCgiL01FVEEtSU5GIikpKSB7CisgICAgICAgICAgICBlcnJvckxpc3QucHV0KHBhdGgsIG5ldyBJbnRlZ2VyKFdlYmRhdlN0YXR1cy5TQ19GT1JCSURERU4pKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBpZkhlYWRlciA9IHJlcS5nZXRIZWFkZXIoIklmIik7CisgICAgICAgIGlmIChpZkhlYWRlciA9PSBudWxsKQorICAgICAgICAgICAgaWZIZWFkZXIgPSAiIjsKKworICAgICAgICBTdHJpbmcgbG9ja1Rva2VuSGVhZGVyID0gcmVxLmdldEhlYWRlcigiTG9jay1Ub2tlbiIpOworICAgICAgICBpZiAobG9ja1Rva2VuSGVhZGVyID09IG51bGwpCisgICAgICAgICAgICBsb2NrVG9rZW5IZWFkZXIgPSAiIjsKKworICAgICAgICBFbnVtZXJhdGlvbiBlbnVtZXJhdGlvbiA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBlbnVtZXJhdGlvbiA9IHJlc291cmNlcy5saXN0KHBhdGgpOworICAgICAgICB9IGNhdGNoIChOYW1pbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZXJyb3JMaXN0LnB1dChwYXRoLCBuZXcgSW50ZWdlcgorICAgICAgICAgICAgICAgIChXZWJkYXZTdGF0dXMuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICB3aGlsZSAoZW51bWVyYXRpb24uaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgIE5hbWVDbGFzc1BhaXIgbmNQYWlyID0gKE5hbWVDbGFzc1BhaXIpIGVudW1lcmF0aW9uLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICBTdHJpbmcgY2hpbGROYW1lID0gcGF0aDsKKyAgICAgICAgICAgIGlmICghY2hpbGROYW1lLmVxdWFscygiLyIpKQorICAgICAgICAgICAgICAgIGNoaWxkTmFtZSArPSAiLyI7CisgICAgICAgICAgICBjaGlsZE5hbWUgKz0gbmNQYWlyLmdldE5hbWUoKTsKKworICAgICAgICAgICAgaWYgKGlzTG9ja2VkKGNoaWxkTmFtZSwgaWZIZWFkZXIgKyBsb2NrVG9rZW5IZWFkZXIpKSB7CisKKyAgICAgICAgICAgICAgICBlcnJvckxpc3QucHV0KGNoaWxkTmFtZSwgbmV3IEludGVnZXIoV2ViZGF2U3RhdHVzLlNDX0xPQ0tFRCkpOworCisgICAgICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG9iamVjdCA9IHJlc291cmNlcy5sb29rdXAoY2hpbGROYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIERpckNvbnRleHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZUNvbGxlY3Rpb24ocmVxLCByZXNvdXJjZXMsIGNoaWxkTmFtZSwgZXJyb3JMaXN0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMudW5iaW5kKGNoaWxkTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShvYmplY3QgaW5zdGFuY2VvZiBEaXJDb250ZXh0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGl0J3Mgbm90IGEgY29sbGVjdGlvbiwgdGhlbiBpdCdzIGFuIHVua25vd24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlcnJvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTGlzdC5wdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoaWxkTmFtZSwgbmV3IEludGVnZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXZWJkYXZTdGF0dXMuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChOYW1pbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBlcnJvckxpc3QucHV0CisgICAgICAgICAgICAgICAgICAgICAgICAoY2hpbGROYW1lLCBuZXcgSW50ZWdlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXZWJkYXZTdGF0dXMuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2VuZCBhIG11bHRpc3RhdHVzIGVsZW1lbnQgY29udGFpbmluZyBhIGNvbXBsZXRlIGVycm9yIHJlcG9ydCB0byB0aGUKKyAgICAgKiBjbGllbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxIFNlcnZsZXQgcmVxdWVzdAorICAgICAqIEBwYXJhbSByZXNwIFNlcnZsZXQgcmVzcG9uc2UKKyAgICAgKiBAcGFyYW0gZXJyb3JMaXN0IExpc3Qgb2YgZXJyb3IgdG8gYmUgZGlzcGxheWVkCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNlbmRSZXBvcnQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhc2h0YWJsZSBlcnJvckxpc3QpCisgICAgICAgIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgcmVzcC5zZXRTdGF0dXMoV2ViZGF2U3RhdHVzLlNDX01VTFRJX1NUQVRVUyk7CisKKyAgICAgICAgU3RyaW5nIGFic29sdXRlVXJpID0gcmVxLmdldFJlcXVlc3RVUkkoKTsKKyAgICAgICAgU3RyaW5nIHJlbGF0aXZlUGF0aCA9IGdldFJlbGF0aXZlUGF0aChyZXEpOworCisgICAgICAgIFhNTFdyaXRlciBnZW5lcmF0ZWRYTUwgPSBuZXcgWE1MV3JpdGVyKCk7CisgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZVhNTEhlYWRlcigpOworCisgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgIm11bHRpc3RhdHVzIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZ2VuZXJhdGVOYW1lc3BhY2VEZWNsYXJhdGlvbnMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxXcml0ZXIuT1BFTklORyk7CisKKyAgICAgICAgRW51bWVyYXRpb24gcGF0aExpc3QgPSBlcnJvckxpc3Qua2V5cygpOworICAgICAgICB3aGlsZSAocGF0aExpc3QuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKworICAgICAgICAgICAgU3RyaW5nIGVycm9yUGF0aCA9IChTdHJpbmcpIHBhdGhMaXN0Lm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICBpbnQgZXJyb3JDb2RlID0gKChJbnRlZ2VyKSBlcnJvckxpc3QuZ2V0KGVycm9yUGF0aCkpLmludFZhbHVlKCk7CisKKyAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgInJlc3BvbnNlIiwgWE1MV3JpdGVyLk9QRU5JTkcpOworCisgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJocmVmIiwgWE1MV3JpdGVyLk9QRU5JTkcpOworICAgICAgICAgICAgU3RyaW5nIHRvQXBwZW5kID0gZXJyb3JQYXRoLnN1YnN0cmluZyhyZWxhdGl2ZVBhdGgubGVuZ3RoKCkpOworICAgICAgICAgICAgaWYgKCF0b0FwcGVuZC5zdGFydHNXaXRoKCIvIikpCisgICAgICAgICAgICAgICAgdG9BcHBlbmQgPSAiLyIgKyB0b0FwcGVuZDsKKyAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZVRleHQoYWJzb2x1dGVVcmkgKyB0b0FwcGVuZCk7CisgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJocmVmIiwgWE1MV3JpdGVyLkNMT1NJTkcpOworICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAic3RhdHVzIiwgWE1MV3JpdGVyLk9QRU5JTkcpOworICAgICAgICAgICAgZ2VuZXJhdGVkWE1MCisgICAgICAgICAgICAgICAgLndyaXRlVGV4dCgiSFRUUC8xLjEgIiArIGVycm9yQ29kZSArICIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBXZWJkYXZTdGF0dXMuZ2V0U3RhdHVzVGV4dChlcnJvckNvZGUpKTsKKyAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgInN0YXR1cyIsIFhNTFdyaXRlci5DTE9TSU5HKTsKKworICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAicmVzcG9uc2UiLCBYTUxXcml0ZXIuQ0xPU0lORyk7CisKKyAgICAgICAgfQorCisgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgIm11bHRpc3RhdHVzIiwgWE1MV3JpdGVyLkNMT1NJTkcpOworCisgICAgICAgIFdyaXRlciB3cml0ZXIgPSByZXNwLmdldFdyaXRlcigpOworICAgICAgICB3cml0ZXIud3JpdGUoZ2VuZXJhdGVkWE1MLnRvU3RyaW5nKCkpOworICAgICAgICB3cml0ZXIuY2xvc2UoKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUHJvcGZpbmQgaGVscGVyIG1ldGhvZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXEgVGhlIHNlcnZsZXQgcmVxdWVzdAorICAgICAqIEBwYXJhbSByZXNvdXJjZXMgUmVzb3VyY2VzIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb250ZXh0CisgICAgICogQHBhcmFtIGdlbmVyYXRlZFhNTCBYTUwgcmVzcG9uc2UgdG8gdGhlIFByb3BmaW5kIHJlcXVlc3QKKyAgICAgKiBAcGFyYW0gcGF0aCBQYXRoIG9mIHRoZSBjdXJyZW50IHJlc291cmNlCisgICAgICogQHBhcmFtIHR5cGUgUHJvcGZpbmQgdHlwZQorICAgICAqIEBwYXJhbSBwcm9wZXJ0aWVzVmVjdG9yIElmIHRoZSBwcm9wZmluZCB0eXBlIGlzIGZpbmQgcHJvcGVydGllcyBieQorICAgICAqIG5hbWUsIHRoZW4gdGhpcyBWZWN0b3IgY29udGFpbnMgdGhvc2UgcHJvcGVydGllcworICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwYXJzZVByb3BlcnRpZXMoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFdyaXRlciBnZW5lcmF0ZWRYTUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGF0aCwgaW50IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3IgcHJvcGVydGllc1ZlY3RvcikgeworCisgICAgICAgIC8vIEV4Y2x1ZGUgYW55IHJlc291cmNlIGluIHRoZSAvV0VCLUlORiBhbmQgL01FVEEtSU5GIHN1YmRpcmVjdG9yaWVzCisgICAgICAgIC8vICh0aGUgInRvVXBwZXJDYXNlKCkiIGF2b2lkcyBwcm9ibGVtcyBvbiBXaW5kb3dzIHN5c3RlbXMpCisgICAgICAgIGlmIChwYXRoLnRvVXBwZXJDYXNlKCkuc3RhcnRzV2l0aCgiL1dFQi1JTkYiKSB8fAorICAgICAgICAgICAgcGF0aC50b1VwcGVyQ2FzZSgpLnN0YXJ0c1dpdGgoIi9NRVRBLUlORiIpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIENhY2hlRW50cnkgY2FjaGVFbnRyeSA9IHJlc291cmNlcy5sb29rdXBDYWNoZShwYXRoKTsKKworICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJyZXNwb25zZSIsIFhNTFdyaXRlci5PUEVOSU5HKTsKKyAgICAgICAgU3RyaW5nIHN0YXR1cyA9IG5ldyBTdHJpbmcoIkhUVFAvMS4xICIgKyBXZWJkYXZTdGF0dXMuU0NfT0sgKyAiICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBXZWJkYXZTdGF0dXMuZ2V0U3RhdHVzVGV4dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV2ViZGF2U3RhdHVzLlNDX09LKSk7CisKKyAgICAgICAgLy8gR2VuZXJhdGluZyBocmVmIGVsZW1lbnQKKyAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAiaHJlZiIsIFhNTFdyaXRlci5PUEVOSU5HKTsKKworICAgICAgICBTdHJpbmcgaHJlZiA9IHJlcS5nZXRDb250ZXh0UGF0aCgpOworICAgICAgICBpZiAoKGhyZWYuZW5kc1dpdGgoIi8iKSkgJiYgKHBhdGguc3RhcnRzV2l0aCgiLyIpKSkKKyAgICAgICAgICAgIGhyZWYgKz0gcGF0aC5zdWJzdHJpbmcoMSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGhyZWYgKz0gcGF0aDsKKyAgICAgICAgaWYgKChjYWNoZUVudHJ5LmNvbnRleHQgIT0gbnVsbCkgJiYgKCFocmVmLmVuZHNXaXRoKCIvIikpKQorICAgICAgICAgICAgaHJlZiArPSAiLyI7CisKKyAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlVGV4dChyZXdyaXRlVXJsKGhyZWYpKTsKKworICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJocmVmIiwgWE1MV3JpdGVyLkNMT1NJTkcpOworCisgICAgICAgIFN0cmluZyByZXNvdXJjZU5hbWUgPSBwYXRoOworICAgICAgICBpbnQgbGFzdFNsYXNoID0gcGF0aC5sYXN0SW5kZXhPZignLycpOworICAgICAgICBpZiAobGFzdFNsYXNoICE9IC0xKQorICAgICAgICAgICAgcmVzb3VyY2VOYW1lID0gcmVzb3VyY2VOYW1lLnN1YnN0cmluZyhsYXN0U2xhc2ggKyAxKTsKKworICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKworICAgICAgICBjYXNlIEZJTkRfQUxMX1BST1AgOgorCisgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJwcm9wc3RhdCIsIFhNTFdyaXRlci5PUEVOSU5HKTsKKyAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgInByb3AiLCBYTUxXcml0ZXIuT1BFTklORyk7CisKKyAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZVByb3BlcnR5CisgICAgICAgICAgICAgICAgKG51bGwsICJjcmVhdGlvbmRhdGUiLAorICAgICAgICAgICAgICAgICBnZXRJU09DcmVhdGlvbkRhdGUoY2FjaGVFbnRyeS5hdHRyaWJ1dGVzLmdldENyZWF0aW9uKCkpKTsKKyAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgImRpc3BsYXluYW1lIiwgWE1MV3JpdGVyLk9QRU5JTkcpOworICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRGF0YShyZXNvdXJjZU5hbWUpOworICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAiZGlzcGxheW5hbWUiLCBYTUxXcml0ZXIuQ0xPU0lORyk7CisgICAgICAgICAgICBpZiAoY2FjaGVFbnRyeS5yZXNvdXJjZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlUHJvcGVydHkKKyAgICAgICAgICAgICAgICAgICAgKG51bGwsICJnZXRsYXN0bW9kaWZpZWQiLCBGYXN0SHR0cERhdGVGb3JtYXQuZm9ybWF0RGF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNhY2hlRW50cnkuYXR0cmlidXRlcy5nZXRMYXN0TW9kaWZpZWQoKSwgbnVsbCkpOworICAgICAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZVByb3BlcnR5CisgICAgICAgICAgICAgICAgICAgIChudWxsLCAiZ2V0Y29udGVudGxlbmd0aCIsCisgICAgICAgICAgICAgICAgICAgICBTdHJpbmcudmFsdWVPZihjYWNoZUVudHJ5LmF0dHJpYnV0ZXMuZ2V0Q29udGVudExlbmd0aCgpKSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIGNvbnRlbnRUeXBlID0gZ2V0U2VydmxldENvbnRleHQoKS5nZXRNaW1lVHlwZQorICAgICAgICAgICAgICAgICAgICAoY2FjaGVFbnRyeS5uYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAoY29udGVudFR5cGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVQcm9wZXJ0eShudWxsLCAiZ2V0Y29udGVudHR5cGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50VHlwZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZVByb3BlcnR5KG51bGwsICJnZXRldGFnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRFVGFnKGNhY2hlRW50cnkuYXR0cmlidXRlcykpOworICAgICAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgInJlc291cmNldHlwZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxXcml0ZXIuTk9fQ09OVEVOVCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgInJlc291cmNldHlwZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxXcml0ZXIuT1BFTklORyk7CisgICAgICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAiY29sbGVjdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxXcml0ZXIuTk9fQ09OVEVOVCk7CisgICAgICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAicmVzb3VyY2V0eXBlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFdyaXRlci5DTE9TSU5HKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlUHJvcGVydHkobnVsbCwgInNvdXJjZSIsICIiKTsKKworICAgICAgICAgICAgU3RyaW5nIHN1cHBvcnRlZExvY2tzID0gIjxsb2NrZW50cnk+IgorICAgICAgICAgICAgICAgICsgIjxsb2Nrc2NvcGU+PGV4Y2x1c2l2ZS8+PC9sb2Nrc2NvcGU+IgorICAgICAgICAgICAgICAgICsgIjxsb2NrdHlwZT48d3JpdGUvPjwvbG9ja3R5cGU+IgorICAgICAgICAgICAgICAgICsgIjwvbG9ja2VudHJ5PiIgKyAiPGxvY2tlbnRyeT4iCisgICAgICAgICAgICAgICAgKyAiPGxvY2tzY29wZT48c2hhcmVkLz48L2xvY2tzY29wZT4iCisgICAgICAgICAgICAgICAgKyAiPGxvY2t0eXBlPjx3cml0ZS8+PC9sb2NrdHlwZT4iCisgICAgICAgICAgICAgICAgKyAiPC9sb2NrZW50cnk+IjsKKyAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgInN1cHBvcnRlZGxvY2siLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxXcml0ZXIuT1BFTklORyk7CisgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVUZXh0KHN1cHBvcnRlZExvY2tzKTsKKyAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgInN1cHBvcnRlZGxvY2siLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxXcml0ZXIuQ0xPU0lORyk7CisKKyAgICAgICAgICAgIGdlbmVyYXRlTG9ja0Rpc2NvdmVyeShwYXRoLCBnZW5lcmF0ZWRYTUwpOworCisgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJwcm9wIiwgWE1MV3JpdGVyLkNMT1NJTkcpOworICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAic3RhdHVzIiwgWE1MV3JpdGVyLk9QRU5JTkcpOworICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlVGV4dChzdGF0dXMpOworICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAic3RhdHVzIiwgWE1MV3JpdGVyLkNMT1NJTkcpOworICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAicHJvcHN0YXQiLCBYTUxXcml0ZXIuQ0xPU0lORyk7CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgRklORF9QUk9QRVJUWV9OQU1FUyA6CisKKyAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgInByb3BzdGF0IiwgWE1MV3JpdGVyLk9QRU5JTkcpOworICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAicHJvcCIsIFhNTFdyaXRlci5PUEVOSU5HKTsKKworICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAiY3JlYXRpb25kYXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MV3JpdGVyLk5PX0NPTlRFTlQpOworICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAiZGlzcGxheW5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxXcml0ZXIuTk9fQ09OVEVOVCk7CisgICAgICAgICAgICBpZiAoY2FjaGVFbnRyeS5yZXNvdXJjZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAiZ2V0Y29udGVudGxhbmd1YWdlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFdyaXRlci5OT19DT05URU5UKTsKKyAgICAgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJnZXRjb250ZW50bGVuZ3RoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFdyaXRlci5OT19DT05URU5UKTsKKyAgICAgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJnZXRjb250ZW50dHlwZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxXcml0ZXIuTk9fQ09OVEVOVCk7CisgICAgICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAiZ2V0ZXRhZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxXcml0ZXIuTk9fQ09OVEVOVCk7CisgICAgICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAiZ2V0bGFzdG1vZGlmaWVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFdyaXRlci5OT19DT05URU5UKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgInJlc291cmNldHlwZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFdyaXRlci5OT19DT05URU5UKTsKKyAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgInNvdXJjZSIsIFhNTFdyaXRlci5OT19DT05URU5UKTsKKyAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgImxvY2tkaXNjb3ZlcnkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxXcml0ZXIuTk9fQ09OVEVOVCk7CisKKyAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgInByb3AiLCBYTUxXcml0ZXIuQ0xPU0lORyk7CisgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJzdGF0dXMiLCBYTUxXcml0ZXIuT1BFTklORyk7CisgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVUZXh0KHN0YXR1cyk7CisgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJzdGF0dXMiLCBYTUxXcml0ZXIuQ0xPU0lORyk7CisgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJwcm9wc3RhdCIsIFhNTFdyaXRlci5DTE9TSU5HKTsKKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBGSU5EX0JZX1BST1BFUlRZIDoKKworICAgICAgICAgICAgVmVjdG9yIHByb3BlcnRpZXNOb3RGb3VuZCA9IG5ldyBWZWN0b3IoKTsKKworICAgICAgICAgICAgLy8gUGFyc2UgdGhlIGxpc3Qgb2YgcHJvcGVydGllcworCisgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJwcm9wc3RhdCIsIFhNTFdyaXRlci5PUEVOSU5HKTsKKyAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgInByb3AiLCBYTUxXcml0ZXIuT1BFTklORyk7CisKKyAgICAgICAgICAgIEVudW1lcmF0aW9uIHByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzVmVjdG9yLmVsZW1lbnRzKCk7CisKKyAgICAgICAgICAgIHdoaWxlIChwcm9wZXJ0aWVzLmhhc01vcmVFbGVtZW50cygpKSB7CisKKyAgICAgICAgICAgICAgICBTdHJpbmcgcHJvcGVydHkgPSAoU3RyaW5nKSBwcm9wZXJ0aWVzLm5leHRFbGVtZW50KCk7CisKKyAgICAgICAgICAgICAgICBpZiAocHJvcGVydHkuZXF1YWxzKCJjcmVhdGlvbmRhdGUiKSkgeworICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVQcm9wZXJ0eQorICAgICAgICAgICAgICAgICAgICAgICAgKG51bGwsICJjcmVhdGlvbmRhdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGdldElTT0NyZWF0aW9uRGF0ZShjYWNoZUVudHJ5LmF0dHJpYnV0ZXMuZ2V0Q3JlYXRpb24oKSkpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHkuZXF1YWxzKCJkaXNwbGF5bmFtZSIpKSB7CisgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgIChudWxsLCAiZGlzcGxheW5hbWUiLCBYTUxXcml0ZXIuT1BFTklORyk7CisgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZURhdGEocmVzb3VyY2VOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgKG51bGwsICJkaXNwbGF5bmFtZSIsIFhNTFdyaXRlci5DTE9TSU5HKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5LmVxdWFscygiZ2V0Y29udGVudGxhbmd1YWdlIikpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNhY2hlRW50cnkuY29udGV4dCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzTm90Rm91bmQuYWRkRWxlbWVudChwcm9wZXJ0eSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJnZXRjb250ZW50bGFuZ3VhZ2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxXcml0ZXIuTk9fQ09OVEVOVCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5LmVxdWFscygiZ2V0Y29udGVudGxlbmd0aCIpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjYWNoZUVudHJ5LmNvbnRleHQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllc05vdEZvdW5kLmFkZEVsZW1lbnQocHJvcGVydHkpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlUHJvcGVydHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobnVsbCwgImdldGNvbnRlbnRsZW5ndGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU3RyaW5nLnZhbHVlT2YoY2FjaGVFbnRyeS5hdHRyaWJ1dGVzLmdldENvbnRlbnRMZW5ndGgoKSkpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHkuZXF1YWxzKCJnZXRjb250ZW50dHlwZSIpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjYWNoZUVudHJ5LmNvbnRleHQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllc05vdEZvdW5kLmFkZEVsZW1lbnQocHJvcGVydHkpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlUHJvcGVydHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobnVsbCwgImdldGNvbnRlbnR0eXBlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2VydmxldENvbnRleHQoKS5nZXRNaW1lVHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2FjaGVFbnRyeS5uYW1lKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5LmVxdWFscygiZ2V0ZXRhZyIpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjYWNoZUVudHJ5LmNvbnRleHQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllc05vdEZvdW5kLmFkZEVsZW1lbnQocHJvcGVydHkpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlUHJvcGVydHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobnVsbCwgImdldGV0YWciLCBnZXRFVGFnKGNhY2hlRW50cnkuYXR0cmlidXRlcykpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eS5lcXVhbHMoImdldGxhc3Rtb2RpZmllZCIpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjYWNoZUVudHJ5LmNvbnRleHQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllc05vdEZvdW5kLmFkZEVsZW1lbnQocHJvcGVydHkpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlUHJvcGVydHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobnVsbCwgImdldGxhc3Rtb2RpZmllZCIsIEZhc3RIdHRwRGF0ZUZvcm1hdC5mb3JtYXREYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2FjaGVFbnRyeS5hdHRyaWJ1dGVzLmdldExhc3RNb2RpZmllZCgpLCBudWxsKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5LmVxdWFscygicmVzb3VyY2V0eXBlIikpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNhY2hlRW50cnkuY29udGV4dCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJyZXNvdXJjZXR5cGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxXcml0ZXIuT1BFTklORyk7CisgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJjb2xsZWN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MV3JpdGVyLk5PX0NPTlRFTlQpOworICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAicmVzb3VyY2V0eXBlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MV3JpdGVyLkNMT1NJTkcpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAicmVzb3VyY2V0eXBlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MV3JpdGVyLk5PX0NPTlRFTlQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eS5lcXVhbHMoInNvdXJjZSIpKSB7CisgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZVByb3BlcnR5KG51bGwsICJzb3VyY2UiLCAiIik7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eS5lcXVhbHMoInN1cHBvcnRlZGxvY2siKSkgeworICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWRMb2NrcyA9ICI8bG9ja2VudHJ5PiIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIjxsb2Nrc2NvcGU+PGV4Y2x1c2l2ZS8+PC9sb2Nrc2NvcGU+IgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiPGxvY2t0eXBlPjx3cml0ZS8+PC9sb2NrdHlwZT4iCisgICAgICAgICAgICAgICAgICAgICAgICArICI8L2xvY2tlbnRyeT4iICsgIjxsb2NrZW50cnk+IgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiPGxvY2tzY29wZT48c2hhcmVkLz48L2xvY2tzY29wZT4iCisgICAgICAgICAgICAgICAgICAgICAgICArICI8bG9ja3R5cGU+PHdyaXRlLz48L2xvY2t0eXBlPiIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIjwvbG9ja2VudHJ5PiI7CisgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgInN1cHBvcnRlZGxvY2siLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFdyaXRlci5PUEVOSU5HKTsKKyAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlVGV4dChzdXBwb3J0ZWRMb2Nrcyk7CisgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgInN1cHBvcnRlZGxvY2siLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFdyaXRlci5DTE9TSU5HKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5LmVxdWFscygibG9ja2Rpc2NvdmVyeSIpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghZ2VuZXJhdGVMb2NrRGlzY292ZXJ5KHBhdGgsIGdlbmVyYXRlZFhNTCkpCisgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzTm90Rm91bmQuYWRkRWxlbWVudChwcm9wZXJ0eSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllc05vdEZvdW5kLmFkZEVsZW1lbnQocHJvcGVydHkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJwcm9wIiwgWE1MV3JpdGVyLkNMT1NJTkcpOworICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAic3RhdHVzIiwgWE1MV3JpdGVyLk9QRU5JTkcpOworICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlVGV4dChzdGF0dXMpOworICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAic3RhdHVzIiwgWE1MV3JpdGVyLkNMT1NJTkcpOworICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAicHJvcHN0YXQiLCBYTUxXcml0ZXIuQ0xPU0lORyk7CisKKyAgICAgICAgICAgIEVudW1lcmF0aW9uIHByb3BlcnRpZXNOb3RGb3VuZExpc3QgPSBwcm9wZXJ0aWVzTm90Rm91bmQuZWxlbWVudHMoKTsKKworICAgICAgICAgICAgaWYgKHByb3BlcnRpZXNOb3RGb3VuZExpc3QuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKworICAgICAgICAgICAgICAgIHN0YXR1cyA9IG5ldyBTdHJpbmcoIkhUVFAvMS4xICIgKyBXZWJkYXZTdGF0dXMuU0NfTk9UX0ZPVU5ECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgIiArIFdlYmRhdlN0YXR1cy5nZXRTdGF0dXNUZXh0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV2ViZGF2U3RhdHVzLlNDX05PVF9GT1VORCkpOworCisgICAgICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAicHJvcHN0YXQiLCBYTUxXcml0ZXIuT1BFTklORyk7CisgICAgICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAicHJvcCIsIFhNTFdyaXRlci5PUEVOSU5HKTsKKworICAgICAgICAgICAgICAgIHdoaWxlIChwcm9wZXJ0aWVzTm90Rm91bmRMaXN0Lmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgIChudWxsLCAoU3RyaW5nKSBwcm9wZXJ0aWVzTm90Rm91bmRMaXN0Lm5leHRFbGVtZW50KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgWE1MV3JpdGVyLk5PX0NPTlRFTlQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgInByb3AiLCBYTUxXcml0ZXIuQ0xPU0lORyk7CisgICAgICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAic3RhdHVzIiwgWE1MV3JpdGVyLk9QRU5JTkcpOworICAgICAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZVRleHQoc3RhdHVzKTsKKyAgICAgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJzdGF0dXMiLCBYTUxXcml0ZXIuQ0xPU0lORyk7CisgICAgICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAicHJvcHN0YXQiLCBYTUxXcml0ZXIuQ0xPU0lORyk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgfQorCisgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgInJlc3BvbnNlIiwgWE1MV3JpdGVyLkNMT1NJTkcpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBQcm9wZmluZCBoZWxwZXIgbWV0aG9kLiBEaXNwYXlzIHRoZSBwcm9wZXJ0aWVzIG9mIGEgbG9jay1udWxsIHJlc291cmNlLgorICAgICAqCisgICAgICogQHBhcmFtIHJlc291cmNlcyBSZXNvdXJjZXMgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbnRleHQKKyAgICAgKiBAcGFyYW0gZ2VuZXJhdGVkWE1MIFhNTCByZXNwb25zZSB0byB0aGUgUHJvcGZpbmQgcmVxdWVzdAorICAgICAqIEBwYXJhbSBwYXRoIFBhdGggb2YgdGhlIGN1cnJlbnQgcmVzb3VyY2UKKyAgICAgKiBAcGFyYW0gdHlwZSBQcm9wZmluZCB0eXBlCisgICAgICogQHBhcmFtIHByb3BlcnRpZXNWZWN0b3IgSWYgdGhlIHByb3BmaW5kIHR5cGUgaXMgZmluZCBwcm9wZXJ0aWVzIGJ5CisgICAgICogbmFtZSwgdGhlbiB0aGlzIFZlY3RvciBjb250YWlucyB0aG9zZSBwcm9wZXJ0aWVzCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHBhcnNlTG9ja051bGxQcm9wZXJ0aWVzKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFdyaXRlciBnZW5lcmF0ZWRYTUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXRoLCBpbnQgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yIHByb3BlcnRpZXNWZWN0b3IpIHsKKworICAgICAgICAvLyBFeGNsdWRlIGFueSByZXNvdXJjZSBpbiB0aGUgL1dFQi1JTkYgYW5kIC9NRVRBLUlORiBzdWJkaXJlY3RvcmllcworICAgICAgICAvLyAodGhlICJ0b1VwcGVyQ2FzZSgpIiBhdm9pZHMgcHJvYmxlbXMgb24gV2luZG93cyBzeXN0ZW1zKQorICAgICAgICBpZiAocGF0aC50b1VwcGVyQ2FzZSgpLnN0YXJ0c1dpdGgoIi9XRUItSU5GIikgfHwKKyAgICAgICAgICAgIHBhdGgudG9VcHBlckNhc2UoKS5zdGFydHNXaXRoKCIvTUVUQS1JTkYiKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvLyBSZXRyaWV2aW5nIHRoZSBsb2NrIGFzc29jaWF0ZWQgd2l0aCB0aGUgbG9jay1udWxsIHJlc291cmNlCisgICAgICAgIExvY2tJbmZvIGxvY2sgPSAoTG9ja0luZm8pIHJlc291cmNlTG9ja3MuZ2V0KHBhdGgpOworCisgICAgICAgIGlmIChsb2NrID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAicmVzcG9uc2UiLCBYTUxXcml0ZXIuT1BFTklORyk7CisgICAgICAgIFN0cmluZyBzdGF0dXMgPSBuZXcgU3RyaW5nKCJIVFRQLzEuMSAiICsgV2ViZGF2U3RhdHVzLlNDX09LICsgIiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgV2ViZGF2U3RhdHVzLmdldFN0YXR1c1RleHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdlYmRhdlN0YXR1cy5TQ19PSykpOworCisgICAgICAgIC8vIEdlbmVyYXRpbmcgaHJlZiBlbGVtZW50CisgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgImhyZWYiLCBYTUxXcml0ZXIuT1BFTklORyk7CisKKyAgICAgICAgU3RyaW5nIGFic29sdXRlVXJpID0gcmVxLmdldFJlcXVlc3RVUkkoKTsKKyAgICAgICAgU3RyaW5nIHJlbGF0aXZlUGF0aCA9IGdldFJlbGF0aXZlUGF0aChyZXEpOworICAgICAgICBTdHJpbmcgdG9BcHBlbmQgPSBwYXRoLnN1YnN0cmluZyhyZWxhdGl2ZVBhdGgubGVuZ3RoKCkpOworICAgICAgICBpZiAoIXRvQXBwZW5kLnN0YXJ0c1dpdGgoIi8iKSkKKyAgICAgICAgICAgIHRvQXBwZW5kID0gIi8iICsgdG9BcHBlbmQ7CisKKyAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlVGV4dChyZXdyaXRlVXJsKG5vcm1hbGl6ZShhYnNvbHV0ZVVyaSArIHRvQXBwZW5kKSkpOworCisgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgImhyZWYiLCBYTUxXcml0ZXIuQ0xPU0lORyk7CisKKyAgICAgICAgU3RyaW5nIHJlc291cmNlTmFtZSA9IHBhdGg7CisgICAgICAgIGludCBsYXN0U2xhc2ggPSBwYXRoLmxhc3RJbmRleE9mKCcvJyk7CisgICAgICAgIGlmIChsYXN0U2xhc2ggIT0gLTEpCisgICAgICAgICAgICByZXNvdXJjZU5hbWUgPSByZXNvdXJjZU5hbWUuc3Vic3RyaW5nKGxhc3RTbGFzaCArIDEpOworCisgICAgICAgIHN3aXRjaCAodHlwZSkgeworCisgICAgICAgIGNhc2UgRklORF9BTExfUFJPUCA6CisKKyAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgInByb3BzdGF0IiwgWE1MV3JpdGVyLk9QRU5JTkcpOworICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAicHJvcCIsIFhNTFdyaXRlci5PUEVOSU5HKTsKKworICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlUHJvcGVydHkKKyAgICAgICAgICAgICAgICAobnVsbCwgImNyZWF0aW9uZGF0ZSIsCisgICAgICAgICAgICAgICAgIGdldElTT0NyZWF0aW9uRGF0ZShsb2NrLmNyZWF0aW9uRGF0ZS5nZXRUaW1lKCkpKTsKKyAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQKKyAgICAgICAgICAgICAgICAobnVsbCwgImRpc3BsYXluYW1lIiwgWE1MV3JpdGVyLk9QRU5JTkcpOworICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRGF0YShyZXNvdXJjZU5hbWUpOworICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudAorICAgICAgICAgICAgICAgIChudWxsLCAiZGlzcGxheW5hbWUiLCBYTUxXcml0ZXIuQ0xPU0lORyk7CisgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVQcm9wZXJ0eShudWxsLCAiZ2V0bGFzdG1vZGlmaWVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhc3RIdHRwRGF0ZUZvcm1hdC5mb3JtYXREYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9jay5jcmVhdGlvbkRhdGUuZ2V0VGltZSgpLCBudWxsKSk7CisgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVQcm9wZXJ0eQorICAgICAgICAgICAgICAgIChudWxsLCAiZ2V0Y29udGVudGxlbmd0aCIsIFN0cmluZy52YWx1ZU9mKDApKTsKKyAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZVByb3BlcnR5KG51bGwsICJnZXRjb250ZW50dHlwZSIsICIiKTsKKyAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZVByb3BlcnR5KG51bGwsICJnZXRldGFnIiwgIiIpOworICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAicmVzb3VyY2V0eXBlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MV3JpdGVyLk9QRU5JTkcpOworICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAibG9jay1udWxsIiwgWE1MV3JpdGVyLk5PX0NPTlRFTlQpOworICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAicmVzb3VyY2V0eXBlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MV3JpdGVyLkNMT1NJTkcpOworCisgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVQcm9wZXJ0eShudWxsLCAic291cmNlIiwgIiIpOworCisgICAgICAgICAgICBTdHJpbmcgc3VwcG9ydGVkTG9ja3MgPSAiPGxvY2tlbnRyeT4iCisgICAgICAgICAgICAgICAgKyAiPGxvY2tzY29wZT48ZXhjbHVzaXZlLz48L2xvY2tzY29wZT4iCisgICAgICAgICAgICAgICAgKyAiPGxvY2t0eXBlPjx3cml0ZS8+PC9sb2NrdHlwZT4iCisgICAgICAgICAgICAgICAgKyAiPC9sb2NrZW50cnk+IiArICI8bG9ja2VudHJ5PiIKKyAgICAgICAgICAgICAgICArICI8bG9ja3Njb3BlPjxzaGFyZWQvPjwvbG9ja3Njb3BlPiIKKyAgICAgICAgICAgICAgICArICI8bG9ja3R5cGU+PHdyaXRlLz48L2xvY2t0eXBlPiIKKyAgICAgICAgICAgICAgICArICI8L2xvY2tlbnRyeT4iOworICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAic3VwcG9ydGVkbG9jayIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFdyaXRlci5PUEVOSU5HKTsKKyAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZVRleHQoc3VwcG9ydGVkTG9ja3MpOworICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAic3VwcG9ydGVkbG9jayIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFdyaXRlci5DTE9TSU5HKTsKKworICAgICAgICAgICAgZ2VuZXJhdGVMb2NrRGlzY292ZXJ5KHBhdGgsIGdlbmVyYXRlZFhNTCk7CisKKyAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgInByb3AiLCBYTUxXcml0ZXIuQ0xPU0lORyk7CisgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJzdGF0dXMiLCBYTUxXcml0ZXIuT1BFTklORyk7CisgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVUZXh0KHN0YXR1cyk7CisgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJzdGF0dXMiLCBYTUxXcml0ZXIuQ0xPU0lORyk7CisgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJwcm9wc3RhdCIsIFhNTFdyaXRlci5DTE9TSU5HKTsKKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBGSU5EX1BST1BFUlRZX05BTUVTIDoKKworICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAicHJvcHN0YXQiLCBYTUxXcml0ZXIuT1BFTklORyk7CisgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJwcm9wIiwgWE1MV3JpdGVyLk9QRU5JTkcpOworCisgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJjcmVhdGlvbmRhdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxXcml0ZXIuTk9fQ09OVEVOVCk7CisgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJkaXNwbGF5bmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFdyaXRlci5OT19DT05URU5UKTsKKyAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgImdldGNvbnRlbnRsYW5ndWFnZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFdyaXRlci5OT19DT05URU5UKTsKKyAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgImdldGNvbnRlbnRsZW5ndGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxXcml0ZXIuTk9fQ09OVEVOVCk7CisgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJnZXRjb250ZW50dHlwZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFdyaXRlci5OT19DT05URU5UKTsKKyAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgImdldGV0YWciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxXcml0ZXIuTk9fQ09OVEVOVCk7CisgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJnZXRsYXN0bW9kaWZpZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxXcml0ZXIuTk9fQ09OVEVOVCk7CisgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJyZXNvdXJjZXR5cGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxXcml0ZXIuTk9fQ09OVEVOVCk7CisgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJzb3VyY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxXcml0ZXIuTk9fQ09OVEVOVCk7CisgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJsb2NrZGlzY292ZXJ5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MV3JpdGVyLk5PX0NPTlRFTlQpOworCisgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJwcm9wIiwgWE1MV3JpdGVyLkNMT1NJTkcpOworICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAic3RhdHVzIiwgWE1MV3JpdGVyLk9QRU5JTkcpOworICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlVGV4dChzdGF0dXMpOworICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAic3RhdHVzIiwgWE1MV3JpdGVyLkNMT1NJTkcpOworICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAicHJvcHN0YXQiLCBYTUxXcml0ZXIuQ0xPU0lORyk7CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgRklORF9CWV9QUk9QRVJUWSA6CisKKyAgICAgICAgICAgIFZlY3RvciBwcm9wZXJ0aWVzTm90Rm91bmQgPSBuZXcgVmVjdG9yKCk7CisKKyAgICAgICAgICAgIC8vIFBhcnNlIHRoZSBsaXN0IG9mIHByb3BlcnRpZXMKKworICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAicHJvcHN0YXQiLCBYTUxXcml0ZXIuT1BFTklORyk7CisgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJwcm9wIiwgWE1MV3JpdGVyLk9QRU5JTkcpOworCisgICAgICAgICAgICBFbnVtZXJhdGlvbiBwcm9wZXJ0aWVzID0gcHJvcGVydGllc1ZlY3Rvci5lbGVtZW50cygpOworCisgICAgICAgICAgICB3aGlsZSAocHJvcGVydGllcy5oYXNNb3JlRWxlbWVudHMoKSkgeworCisgICAgICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5ID0gKFN0cmluZykgcHJvcGVydGllcy5uZXh0RWxlbWVudCgpOworCisgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5LmVxdWFscygiY3JlYXRpb25kYXRlIikpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlUHJvcGVydHkKKyAgICAgICAgICAgICAgICAgICAgICAgIChudWxsLCAiY3JlYXRpb25kYXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBnZXRJU09DcmVhdGlvbkRhdGUobG9jay5jcmVhdGlvbkRhdGUuZ2V0VGltZSgpKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eS5lcXVhbHMoImRpc3BsYXluYW1lIikpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgKG51bGwsICJkaXNwbGF5bmFtZSIsIFhNTFdyaXRlci5PUEVOSU5HKTsKKyAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRGF0YShyZXNvdXJjZU5hbWUpOworICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAobnVsbCwgImRpc3BsYXluYW1lIiwgWE1MV3JpdGVyLkNMT1NJTkcpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHkuZXF1YWxzKCJnZXRjb250ZW50bGFuZ3VhZ2UiKSkgeworICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJnZXRjb250ZW50bGFuZ3VhZ2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFdyaXRlci5OT19DT05URU5UKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5LmVxdWFscygiZ2V0Y29udGVudGxlbmd0aCIpKSB7CisgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZVByb3BlcnR5CisgICAgICAgICAgICAgICAgICAgICAgICAobnVsbCwgImdldGNvbnRlbnRsZW5ndGgiLCAoU3RyaW5nLnZhbHVlT2YoMCkpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5LmVxdWFscygiZ2V0Y29udGVudHR5cGUiKSkgeworICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVQcm9wZXJ0eQorICAgICAgICAgICAgICAgICAgICAgICAgKG51bGwsICJnZXRjb250ZW50dHlwZSIsICIiKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5LmVxdWFscygiZ2V0ZXRhZyIpKSB7CisgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZVByb3BlcnR5KG51bGwsICJnZXRldGFnIiwgIiIpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHkuZXF1YWxzKCJnZXRsYXN0bW9kaWZpZWQiKSkgeworICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVQcm9wZXJ0eQorICAgICAgICAgICAgICAgICAgICAgICAgKG51bGwsICJnZXRsYXN0bW9kaWZpZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGYXN0SHR0cERhdGVGb3JtYXQuZm9ybWF0RGF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgIChsb2NrLmNyZWF0aW9uRGF0ZS5nZXRUaW1lKCksIG51bGwpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5LmVxdWFscygicmVzb3VyY2V0eXBlIikpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAicmVzb3VyY2V0eXBlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxXcml0ZXIuT1BFTklORyk7CisgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgImxvY2stbnVsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MV3JpdGVyLk5PX0NPTlRFTlQpOworICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJyZXNvdXJjZXR5cGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFdyaXRlci5DTE9TSU5HKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5LmVxdWFscygic291cmNlIikpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlUHJvcGVydHkobnVsbCwgInNvdXJjZSIsICIiKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5LmVxdWFscygic3VwcG9ydGVkbG9jayIpKSB7CisgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZExvY2tzID0gIjxsb2NrZW50cnk+IgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiPGxvY2tzY29wZT48ZXhjbHVzaXZlLz48L2xvY2tzY29wZT4iCisgICAgICAgICAgICAgICAgICAgICAgICArICI8bG9ja3R5cGU+PHdyaXRlLz48L2xvY2t0eXBlPiIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIjwvbG9ja2VudHJ5PiIgKyAiPGxvY2tlbnRyeT4iCisgICAgICAgICAgICAgICAgICAgICAgICArICI8bG9ja3Njb3BlPjxzaGFyZWQvPjwvbG9ja3Njb3BlPiIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIjxsb2NrdHlwZT48d3JpdGUvPjwvbG9ja3R5cGU+IgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiPC9sb2NrZW50cnk+IjsKKyAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAic3VwcG9ydGVkbG9jayIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MV3JpdGVyLk9QRU5JTkcpOworICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVUZXh0KHN1cHBvcnRlZExvY2tzKTsKKyAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAic3VwcG9ydGVkbG9jayIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MV3JpdGVyLkNMT1NJTkcpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHkuZXF1YWxzKCJsb2NrZGlzY292ZXJ5IikpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFnZW5lcmF0ZUxvY2tEaXNjb3ZlcnkocGF0aCwgZ2VuZXJhdGVkWE1MKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXNOb3RGb3VuZC5hZGRFbGVtZW50KHByb3BlcnR5KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzTm90Rm91bmQuYWRkRWxlbWVudChwcm9wZXJ0eSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgInByb3AiLCBYTUxXcml0ZXIuQ0xPU0lORyk7CisgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJzdGF0dXMiLCBYTUxXcml0ZXIuT1BFTklORyk7CisgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVUZXh0KHN0YXR1cyk7CisgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJzdGF0dXMiLCBYTUxXcml0ZXIuQ0xPU0lORyk7CisgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJwcm9wc3RhdCIsIFhNTFdyaXRlci5DTE9TSU5HKTsKKworICAgICAgICAgICAgRW51bWVyYXRpb24gcHJvcGVydGllc05vdEZvdW5kTGlzdCA9IHByb3BlcnRpZXNOb3RGb3VuZC5lbGVtZW50cygpOworCisgICAgICAgICAgICBpZiAocHJvcGVydGllc05vdEZvdW5kTGlzdC5oYXNNb3JlRWxlbWVudHMoKSkgeworCisgICAgICAgICAgICAgICAgc3RhdHVzID0gbmV3IFN0cmluZygiSFRUUC8xLjEgIiArIFdlYmRhdlN0YXR1cy5TQ19OT1RfRk9VTkQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiAiICsgV2ViZGF2U3RhdHVzLmdldFN0YXR1c1RleHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXZWJkYXZTdGF0dXMuU0NfTk9UX0ZPVU5EKSk7CisKKyAgICAgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJwcm9wc3RhdCIsIFhNTFdyaXRlci5PUEVOSU5HKTsKKyAgICAgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJwcm9wIiwgWE1MV3JpdGVyLk9QRU5JTkcpOworCisgICAgICAgICAgICAgICAgd2hpbGUgKHByb3BlcnRpZXNOb3RGb3VuZExpc3QuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgKG51bGwsIChTdHJpbmcpIHByb3BlcnRpZXNOb3RGb3VuZExpc3QubmV4dEVsZW1lbnQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBYTUxXcml0ZXIuTk9fQ09OVEVOVCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAicHJvcCIsIFhNTFdyaXRlci5DTE9TSU5HKTsKKyAgICAgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJzdGF0dXMiLCBYTUxXcml0ZXIuT1BFTklORyk7CisgICAgICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlVGV4dChzdGF0dXMpOworICAgICAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgInN0YXR1cyIsIFhNTFdyaXRlci5DTE9TSU5HKTsKKyAgICAgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJwcm9wc3RhdCIsIFhNTFdyaXRlci5DTE9TSU5HKTsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICB9CisKKyAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAicmVzcG9uc2UiLCBYTUxXcml0ZXIuQ0xPU0lORyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFByaW50IHRoZSBsb2NrIGRpc2NvdmVyeSBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggYSBwYXRoLgorICAgICAqCisgICAgICogQHBhcmFtIHBhdGggUGF0aAorICAgICAqIEBwYXJhbSBnZW5lcmF0ZWRYTUwgWE1MIGRhdGEgdG8gd2hpY2ggdGhlIGxvY2tzIGluZm8gd2lsbCBiZSBhcHBlbmRlZAorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhdCBsZWFzdCBvbmUgbG9jayB3YXMgZGlzcGxheWVkCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGdlbmVyYXRlTG9ja0Rpc2NvdmVyeQorICAgICAgICAoU3RyaW5nIHBhdGgsIFhNTFdyaXRlciBnZW5lcmF0ZWRYTUwpIHsKKworICAgICAgICBMb2NrSW5mbyByZXNvdXJjZUxvY2sgPSAoTG9ja0luZm8pIHJlc291cmNlTG9ja3MuZ2V0KHBhdGgpOworICAgICAgICBFbnVtZXJhdGlvbiBjb2xsZWN0aW9uTG9ja3NMaXN0ID0gY29sbGVjdGlvbkxvY2tzLmVsZW1lbnRzKCk7CisKKyAgICAgICAgYm9vbGVhbiB3cm90ZVN0YXJ0ID0gZmFsc2U7CisKKyAgICAgICAgaWYgKHJlc291cmNlTG9jayAhPSBudWxsKSB7CisgICAgICAgICAgICB3cm90ZVN0YXJ0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgImxvY2tkaXNjb3ZlcnkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxXcml0ZXIuT1BFTklORyk7CisgICAgICAgICAgICByZXNvdXJjZUxvY2sudG9YTUwoZ2VuZXJhdGVkWE1MKTsKKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlIChjb2xsZWN0aW9uTG9ja3NMaXN0Lmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICBMb2NrSW5mbyBjdXJyZW50TG9jayA9CisgICAgICAgICAgICAgICAgKExvY2tJbmZvKSBjb2xsZWN0aW9uTG9ja3NMaXN0Lm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICBpZiAocGF0aC5zdGFydHNXaXRoKGN1cnJlbnRMb2NrLnBhdGgpKSB7CisgICAgICAgICAgICAgICAgaWYgKCF3cm90ZVN0YXJ0KSB7CisgICAgICAgICAgICAgICAgICAgIHdyb3RlU3RhcnQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJsb2NrZGlzY292ZXJ5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxXcml0ZXIuT1BFTklORyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGN1cnJlbnRMb2NrLnRvWE1MKGdlbmVyYXRlZFhNTCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAod3JvdGVTdGFydCkgeworICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAibG9ja2Rpc2NvdmVyeSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFdyaXRlci5DTE9TSU5HKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHZXQgY3JlYXRpb24gZGF0ZSBpbiBJU08gZm9ybWF0LgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGdldElTT0NyZWF0aW9uRGF0ZShsb25nIGNyZWF0aW9uRGF0ZSkgeworICAgICAgICBTdHJpbmdCdWZmZXIgY3JlYXRpb25EYXRlVmFsdWUgPSBuZXcgU3RyaW5nQnVmZmVyCisgICAgICAgICAgICAoY3JlYXRpb25EYXRlRm9ybWF0LmZvcm1hdAorICAgICAgICAgICAgIChuZXcgRGF0ZShjcmVhdGlvbkRhdGUpKSk7CisgICAgICAgIC8qCisgICAgICAgIGludCBvZmZzZXQgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpLmdldFRpbWVab25lKCkuZ2V0UmF3T2Zmc2V0KCkKKyAgICAgICAgICAgIC8gMzYwMDAwMDsgLy8gRklYTUUgPworICAgICAgICBpZiAob2Zmc2V0IDwgMCkgeworICAgICAgICAgICAgY3JlYXRpb25EYXRlVmFsdWUuYXBwZW5kKCItIik7CisgICAgICAgICAgICBvZmZzZXQgPSAtb2Zmc2V0OworICAgICAgICB9IGVsc2UgaWYgKG9mZnNldCA+IDApIHsKKyAgICAgICAgICAgIGNyZWF0aW9uRGF0ZVZhbHVlLmFwcGVuZCgiKyIpOworICAgICAgICB9CisgICAgICAgIGlmIChvZmZzZXQgIT0gMCkgeworICAgICAgICAgICAgaWYgKG9mZnNldCA8IDEwKQorICAgICAgICAgICAgICAgIGNyZWF0aW9uRGF0ZVZhbHVlLmFwcGVuZCgiMCIpOworICAgICAgICAgICAgY3JlYXRpb25EYXRlVmFsdWUuYXBwZW5kKG9mZnNldCArICI6MDAiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNyZWF0aW9uRGF0ZVZhbHVlLmFwcGVuZCgiWiIpOworICAgICAgICB9CisgICAgICAgICovCisgICAgICAgIHJldHVybiBjcmVhdGlvbkRhdGVWYWx1ZS50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERldGVybWluZXMgdGhlIG1ldGhvZHMgbm9ybWFsbHkgYWxsb3dlZCBmb3IgdGhlIHJlc291cmNlLgorICAgICAqCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmdCdWZmZXIgZGV0ZXJtaW5lTWV0aG9kc0FsbG93ZWQoRGlyQ29udGV4dCByZXNvdXJjZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkgeworCisgICAgICAgIFN0cmluZ0J1ZmZlciBtZXRob2RzQWxsb3dlZCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgYm9vbGVhbiBleGlzdHMgPSB0cnVlOworICAgICAgICBPYmplY3Qgb2JqZWN0ID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN0cmluZyBwYXRoID0gZ2V0UmVsYXRpdmVQYXRoKHJlcSk7CisKKyAgICAgICAgICAgIG9iamVjdCA9IHJlc291cmNlcy5sb29rdXAocGF0aCk7CisgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBleGlzdHMgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghZXhpc3RzKSB7CisgICAgICAgICAgICBtZXRob2RzQWxsb3dlZC5hcHBlbmQoIk9QVElPTlMsIE1LQ09MLCBQVVQsIExPQ0siKTsKKyAgICAgICAgICAgIHJldHVybiBtZXRob2RzQWxsb3dlZDsKKyAgICAgICAgfQorCisgICAgICAgIG1ldGhvZHNBbGxvd2VkLmFwcGVuZCgiT1BUSU9OUywgR0VULCBIRUFELCBQT1NULCBERUxFVEUsIFRSQUNFIik7CisgICAgICAgIG1ldGhvZHNBbGxvd2VkLmFwcGVuZCgiLCBQUk9QUEFUQ0gsIENPUFksIE1PVkUsIExPQ0ssIFVOTE9DSyIpOworCisgICAgICAgIGlmIChsaXN0aW5ncykgeworICAgICAgICAgICAgbWV0aG9kc0FsbG93ZWQuYXBwZW5kKCIsIFBST1BGSU5EIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIShvYmplY3QgaW5zdGFuY2VvZiBEaXJDb250ZXh0KSkgeworICAgICAgICAgICAgbWV0aG9kc0FsbG93ZWQuYXBwZW5kKCIsIFBVVCIpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG1ldGhvZHNBbGxvd2VkOworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBMb2NrSW5mbyBJbm5lciBDbGFzcworCisKKyAgICAvKioKKyAgICAgKiBIb2xkcyBhIGxvY2sgaW5mb3JtYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBjbGFzcyBMb2NrSW5mbyB7CisKKworICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcgorCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnN0cnVjdG9yLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIExvY2tJbmZvKCkgeworCisgICAgICAgIH0KKworCisgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgICAgICBTdHJpbmcgcGF0aCA9ICIvIjsKKyAgICAgICAgU3RyaW5nIHR5cGUgPSAid3JpdGUiOworICAgICAgICBTdHJpbmcgc2NvcGUgPSAiZXhjbHVzaXZlIjsKKyAgICAgICAgaW50IGRlcHRoID0gMDsKKyAgICAgICAgU3RyaW5nIG93bmVyID0gIiI7CisgICAgICAgIFZlY3RvciB0b2tlbnMgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIGxvbmcgZXhwaXJlc0F0ID0gMDsKKyAgICAgICAgRGF0ZSBjcmVhdGlvbkRhdGUgPSBuZXcgRGF0ZSgpOworCisKKyAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgYSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBsb2NrIHRva2VuLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKworICAgICAgICAgICAgU3RyaW5nIHJlc3VsdCA9ICAiVHlwZToiICsgdHlwZSArICJcbiI7CisgICAgICAgICAgICByZXN1bHQgKz0gIlNjb3BlOiIgKyBzY29wZSArICJcbiI7CisgICAgICAgICAgICByZXN1bHQgKz0gIkRlcHRoOiIgKyBkZXB0aCArICJcbiI7CisgICAgICAgICAgICByZXN1bHQgKz0gIk93bmVyOiIgKyBvd25lciArICJcbiI7CisgICAgICAgICAgICByZXN1bHQgKz0gIkV4cGlyYXRpb246IgorICAgICAgICAgICAgICAgICsgRmFzdEh0dHBEYXRlRm9ybWF0LmZvcm1hdERhdGUoZXhwaXJlc0F0LCBudWxsKSArICJcbiI7CisgICAgICAgICAgICBFbnVtZXJhdGlvbiB0b2tlbnNMaXN0ID0gdG9rZW5zLmVsZW1lbnRzKCk7CisgICAgICAgICAgICB3aGlsZSAodG9rZW5zTGlzdC5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgIHJlc3VsdCArPSAiVG9rZW46IiArIHRva2Vuc0xpc3QubmV4dEVsZW1lbnQoKSArICJcbiI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworCisgICAgICAgIH0KKworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgbG9jayBoYXMgZXhwaXJlZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc0V4cGlyZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpID4gZXhwaXJlc0F0KTsKKyAgICAgICAgfQorCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSBsb2NrIGlzIGV4Y2x1c2l2ZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzRXhjbHVzaXZlKCkgeworCisgICAgICAgICAgICByZXR1cm4gKHNjb3BlLmVxdWFscygiZXhjbHVzaXZlIikpOworCisgICAgICAgIH0KKworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgbG9jayB0b2tlbi4gVGhpcyBtZXRob2Qgd2lsbAorICAgICAgICAgKiBhcHBlbmQgYW4gWE1MIGZyYWdtZW50IHRvIHRoZSBnaXZlbiBYTUwgd3JpdGVyLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgdG9YTUwoWE1MV3JpdGVyIGdlbmVyYXRlZFhNTCkgeworCisgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJhY3RpdmVsb2NrIiwgWE1MV3JpdGVyLk9QRU5JTkcpOworCisgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJsb2NrdHlwZSIsIFhNTFdyaXRlci5PUEVOSU5HKTsKKyAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgdHlwZSwgWE1MV3JpdGVyLk5PX0NPTlRFTlQpOworICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAibG9ja3R5cGUiLCBYTUxXcml0ZXIuQ0xPU0lORyk7CisKKyAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgImxvY2tzY29wZSIsIFhNTFdyaXRlci5PUEVOSU5HKTsKKyAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgc2NvcGUsIFhNTFdyaXRlci5OT19DT05URU5UKTsKKyAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgImxvY2tzY29wZSIsIFhNTFdyaXRlci5DTE9TSU5HKTsKKworICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAiZGVwdGgiLCBYTUxXcml0ZXIuT1BFTklORyk7CisgICAgICAgICAgICBpZiAoZGVwdGggPT0gSU5GSU5JVFkpIHsKKyAgICAgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVUZXh0KCJJbmZpbml0eSIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVUZXh0KCIwIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJkZXB0aCIsIFhNTFdyaXRlci5DTE9TSU5HKTsKKworICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAib3duZXIiLCBYTUxXcml0ZXIuT1BFTklORyk7CisgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVUZXh0KG93bmVyKTsKKyAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgIm93bmVyIiwgWE1MV3JpdGVyLkNMT1NJTkcpOworCisgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJ0aW1lb3V0IiwgWE1MV3JpdGVyLk9QRU5JTkcpOworICAgICAgICAgICAgbG9uZyB0aW1lb3V0ID0gKGV4cGlyZXNBdCAtIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKSAvIDEwMDA7CisgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVUZXh0KCJTZWNvbmQtIiArIHRpbWVvdXQpOworICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAidGltZW91dCIsIFhNTFdyaXRlci5DTE9TSU5HKTsKKworICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAibG9ja3Rva2VuIiwgWE1MV3JpdGVyLk9QRU5JTkcpOworICAgICAgICAgICAgRW51bWVyYXRpb24gdG9rZW5zTGlzdCA9IHRva2Vucy5lbGVtZW50cygpOworICAgICAgICAgICAgd2hpbGUgKHRva2Vuc0xpc3QuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICBnZW5lcmF0ZWRYTUwud3JpdGVFbGVtZW50KG51bGwsICJocmVmIiwgWE1MV3JpdGVyLk9QRU5JTkcpOworICAgICAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZVRleHQoIm9wYXF1ZWxvY2t0b2tlbjoiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHRva2Vuc0xpc3QubmV4dEVsZW1lbnQoKSk7CisgICAgICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAiaHJlZiIsIFhNTFdyaXRlci5DTE9TSU5HKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdlbmVyYXRlZFhNTC53cml0ZUVsZW1lbnQobnVsbCwgImxvY2t0b2tlbiIsIFhNTFdyaXRlci5DTE9TSU5HKTsKKworICAgICAgICAgICAgZ2VuZXJhdGVkWE1MLndyaXRlRWxlbWVudChudWxsLCAiYWN0aXZlbG9jayIsIFhNTFdyaXRlci5DTE9TSU5HKTsKKworICAgICAgICB9CisKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnR5IElubmVyIENsYXNzCisKKworICAgIHByaXZhdGUgY2xhc3MgUHJvcGVydHkgeworCisgICAgICAgIHB1YmxpYyBTdHJpbmcgbmFtZTsKKyAgICAgICAgcHVibGljIFN0cmluZyB2YWx1ZTsKKyAgICAgICAgcHVibGljIFN0cmluZyBuYW1lc3BhY2U7CisgICAgICAgIHB1YmxpYyBTdHJpbmcgbmFtZXNwYWNlQWJicmV2OworICAgICAgICBwdWJsaWMgaW50IHN0YXR1cyA9IFdlYmRhdlN0YXR1cy5TQ19PSzsKKworICAgIH0KKworCit9OworCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBXZWJkYXZTdGF0dXMgQ2xhc3MKKworCisvKioKKyAqIFdyYXBzIHRoZSBIdHRwU2VydmxldFJlc3BvbnNlIGNsYXNzIHRvIGFic3RyYWN0IHRoZQorICogc3BlY2lmaWMgcHJvdG9jb2wgdXNlZC4gIFRvIHN1cHBvcnQgb3RoZXIgcHJvdG9jb2xzCisgKiB3ZSB3b3VsZCBvbmx5IG5lZWQgdG8gbW9kaWZ5IHRoaXMgY2xhc3MgYW5kIHRoZQorICogV2ViRGF2UmV0Q29kZSBjbGFzc2VzLgorICoKKyAqIEBhdXRob3IgICAgICAgICAgICAgIE1hcmMgRWFkZHkKKyAqIEB2ZXJzaW9uICAgICAgICAgICAgIDEuMCwgMTYgTm92IDE5OTcKKyAqLworY2xhc3MgV2ViZGF2U3RhdHVzIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoaXMgSGFzaHRhYmxlIGNvbnRhaW5zIHRoZSBtYXBwaW5nIG9mIEhUVFAgYW5kIFdlYkRBVgorICAgICAqIHN0YXR1cyBjb2RlcyB0byBkZXNjcmlwdGl2ZSB0ZXh0LiAgVGhpcyBpcyBhIHN0YXRpYworICAgICAqIHZhcmlhYmxlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIEhhc2h0YWJsZSBtYXBTdGF0dXNDb2RlcyA9IG5ldyBIYXNodGFibGUoKTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEhUVFAgU3RhdHVzIENvZGVzCisKKworICAgIC8qKgorICAgICAqIFN0YXR1cyBjb2RlICgyMDApIGluZGljYXRpbmcgdGhlIHJlcXVlc3Qgc3VjY2VlZGVkIG5vcm1hbGx5LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDX09LID0gSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19PSzsKKworCisgICAgLyoqCisgICAgICogU3RhdHVzIGNvZGUgKDIwMSkgaW5kaWNhdGluZyB0aGUgcmVxdWVzdCBzdWNjZWVkZWQgYW5kIGNyZWF0ZWQKKyAgICAgKiBhIG5ldyByZXNvdXJjZSBvbiB0aGUgc2VydmVyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDX0NSRUFURUQgPSBIdHRwU2VydmxldFJlc3BvbnNlLlNDX0NSRUFURUQ7CisKKworICAgIC8qKgorICAgICAqIFN0YXR1cyBjb2RlICgyMDIpIGluZGljYXRpbmcgdGhhdCBhIHJlcXVlc3Qgd2FzIGFjY2VwdGVkIGZvcgorICAgICAqIHByb2Nlc3NpbmcsIGJ1dCB3YXMgbm90IGNvbXBsZXRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ19BQ0NFUFRFRCA9IEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfQUNDRVBURUQ7CisKKworICAgIC8qKgorICAgICAqIFN0YXR1cyBjb2RlICgyMDQpIGluZGljYXRpbmcgdGhhdCB0aGUgcmVxdWVzdCBzdWNjZWVkZWQgYnV0IHRoYXQKKyAgICAgKiB0aGVyZSB3YXMgbm8gbmV3IGluZm9ybWF0aW9uIHRvIHJldHVybi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ19OT19DT05URU5UID0gSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19OT19DT05URU5UOworCisKKyAgICAvKioKKyAgICAgKiBTdGF0dXMgY29kZSAoMzAxKSBpbmRpY2F0aW5nIHRoYXQgdGhlIHJlc291cmNlIGhhcyBwZXJtYW5lbnRseQorICAgICAqIG1vdmVkIHRvIGEgbmV3IGxvY2F0aW9uLCBhbmQgdGhhdCBmdXR1cmUgcmVmZXJlbmNlcyBzaG91bGQgdXNlIGEKKyAgICAgKiBuZXcgVVJJIHdpdGggdGhlaXIgcmVxdWVzdHMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NfTU9WRURfUEVSTUFORU5UTFkgPQorICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlLlNDX01PVkVEX1BFUk1BTkVOVExZOworCisKKyAgICAvKioKKyAgICAgKiBTdGF0dXMgY29kZSAoMzAyKSBpbmRpY2F0aW5nIHRoYXQgdGhlIHJlc291cmNlIGhhcyB0ZW1wb3JhcmlseQorICAgICAqIG1vdmVkIHRvIGFub3RoZXIgbG9jYXRpb24sIGJ1dCB0aGF0IGZ1dHVyZSByZWZlcmVuY2VzIHNob3VsZAorICAgICAqIHN0aWxsIHVzZSB0aGUgb3JpZ2luYWwgVVJJIHRvIGFjY2VzcyB0aGUgcmVzb3VyY2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NfTU9WRURfVEVNUE9SQVJJTFkgPQorICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlLlNDX01PVkVEX1RFTVBPUkFSSUxZOworCisKKyAgICAvKioKKyAgICAgKiBTdGF0dXMgY29kZSAoMzA0KSBpbmRpY2F0aW5nIHRoYXQgYSBjb25kaXRpb25hbCBHRVQgb3BlcmF0aW9uCisgICAgICogZm91bmQgdGhhdCB0aGUgcmVzb3VyY2Ugd2FzIGF2YWlsYWJsZSBhbmQgbm90IG1vZGlmaWVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDX05PVF9NT0RJRklFRCA9CisgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfTk9UX01PRElGSUVEOworCisKKyAgICAvKioKKyAgICAgKiBTdGF0dXMgY29kZSAoNDAwKSBpbmRpY2F0aW5nIHRoZSByZXF1ZXN0IHNlbnQgYnkgdGhlIGNsaWVudCB3YXMKKyAgICAgKiBzeW50YWN0aWNhbGx5IGluY29ycmVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ19CQURfUkVRVUVTVCA9CisgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfQkFEX1JFUVVFU1Q7CisKKworICAgIC8qKgorICAgICAqIFN0YXR1cyBjb2RlICg0MDEpIGluZGljYXRpbmcgdGhhdCB0aGUgcmVxdWVzdCByZXF1aXJlcyBIVFRQCisgICAgICogYXV0aGVudGljYXRpb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NfVU5BVVRIT1JJWkVEID0KKyAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19VTkFVVEhPUklaRUQ7CisKKworICAgIC8qKgorICAgICAqIFN0YXR1cyBjb2RlICg0MDMpIGluZGljYXRpbmcgdGhlIHNlcnZlciB1bmRlcnN0b29kIHRoZSByZXF1ZXN0CisgICAgICogYnV0IHJlZnVzZWQgdG8gZnVsZmlsbCBpdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ19GT1JCSURERU4gPSBIdHRwU2VydmxldFJlc3BvbnNlLlNDX0ZPUkJJRERFTjsKKworCisgICAgLyoqCisgICAgICogU3RhdHVzIGNvZGUgKDQwNCkgaW5kaWNhdGluZyB0aGF0IHRoZSByZXF1ZXN0ZWQgcmVzb3VyY2UgaXMgbm90CisgICAgICogYXZhaWxhYmxlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDX05PVF9GT1VORCA9IEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfTk9UX0ZPVU5EOworCisKKyAgICAvKioKKyAgICAgKiBTdGF0dXMgY29kZSAoNTAwKSBpbmRpY2F0aW5nIGFuIGVycm9yIGluc2lkZSB0aGUgSFRUUCBzZXJ2aWNlCisgICAgICogd2hpY2ggcHJldmVudGVkIGl0IGZyb20gZnVsZmlsbGluZyB0aGUgcmVxdWVzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IgPQorICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKKworCisgICAgLyoqCisgICAgICogU3RhdHVzIGNvZGUgKDUwMSkgaW5kaWNhdGluZyB0aGUgSFRUUCBzZXJ2aWNlIGRvZXMgbm90IHN1cHBvcnQKKyAgICAgKiB0aGUgZnVuY3Rpb25hbGl0eSBuZWVkZWQgdG8gZnVsZmlsbCB0aGUgcmVxdWVzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ19OT1RfSU1QTEVNRU5URUQgPQorICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlLlNDX05PVF9JTVBMRU1FTlRFRDsKKworCisgICAgLyoqCisgICAgICogU3RhdHVzIGNvZGUgKDUwMikgaW5kaWNhdGluZyB0aGF0IHRoZSBIVFRQIHNlcnZlciByZWNlaXZlZCBhbgorICAgICAqIGludmFsaWQgcmVzcG9uc2UgZnJvbSBhIHNlcnZlciBpdCBjb25zdWx0ZWQgd2hlbiBhY3RpbmcgYXMgYQorICAgICAqIHByb3h5IG9yIGdhdGV3YXkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NfQkFEX0dBVEVXQVkgPQorICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlLlNDX0JBRF9HQVRFV0FZOworCisKKyAgICAvKioKKyAgICAgKiBTdGF0dXMgY29kZSAoNTAzKSBpbmRpY2F0aW5nIHRoYXQgdGhlIEhUVFAgc2VydmljZSBpcworICAgICAqIHRlbXBvcmFyaWx5IG92ZXJsb2FkZWQsIGFuZCB1bmFibGUgdG8gaGFuZGxlIHRoZSByZXF1ZXN0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDX1NFUlZJQ0VfVU5BVkFJTEFCTEUgPQorICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlLlNDX1NFUlZJQ0VfVU5BVkFJTEFCTEU7CisKKworICAgIC8qKgorICAgICAqIFN0YXR1cyBjb2RlICgxMDApIGluZGljYXRpbmcgdGhlIGNsaWVudCBtYXkgY29udGludWUgd2l0aAorICAgICAqIGl0cyByZXF1ZXN0LiAgVGhpcyBpbnRlcmltIHJlc3BvbnNlIGlzIHVzZWQgdG8gaW5mb3JtIHRoZQorICAgICAqIGNsaWVudCB0aGF0IHRoZSBpbml0aWFsIHBhcnQgb2YgdGhlIHJlcXVlc3QgaGFzIGJlZW4KKyAgICAgKiByZWNlaXZlZCBhbmQgaGFzIG5vdCB5ZXQgYmVlbiByZWplY3RlZCBieSB0aGUgc2VydmVyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDX0NPTlRJTlVFID0gMTAwOworCisKKyAgICAvKioKKyAgICAgKiBTdGF0dXMgY29kZSAoNDA1KSBpbmRpY2F0aW5nIHRoZSBtZXRob2Qgc3BlY2lmaWVkIGlzIG5vdAorICAgICAqIGFsbG93ZWQgZm9yIHRoZSByZXNvdXJjZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ19NRVRIT0RfTk9UX0FMTE9XRUQgPSA0MDU7CisKKworICAgIC8qKgorICAgICAqIFN0YXR1cyBjb2RlICg0MDkpIGluZGljYXRpbmcgdGhhdCB0aGUgcmVxdWVzdCBjb3VsZCBub3QgYmUKKyAgICAgKiBjb21wbGV0ZWQgZHVlIHRvIGEgY29uZmxpY3Qgd2l0aCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUKKyAgICAgKiByZXNvdXJjZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ19DT05GTElDVCA9IDQwOTsKKworCisgICAgLyoqCisgICAgICogU3RhdHVzIGNvZGUgKDQxMikgaW5kaWNhdGluZyB0aGUgcHJlY29uZGl0aW9uIGdpdmVuIGluIG9uZQorICAgICAqIG9yIG1vcmUgb2YgdGhlIHJlcXVlc3QtaGVhZGVyIGZpZWxkcyBldmFsdWF0ZWQgdG8gZmFsc2UKKyAgICAgKiB3aGVuIGl0IHdhcyB0ZXN0ZWQgb24gdGhlIHNlcnZlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ19QUkVDT05ESVRJT05fRkFJTEVEID0gNDEyOworCisKKyAgICAvKioKKyAgICAgKiBTdGF0dXMgY29kZSAoNDEzKSBpbmRpY2F0aW5nIHRoZSBzZXJ2ZXIgaXMgcmVmdXNpbmcgdG8KKyAgICAgKiBwcm9jZXNzIGEgcmVxdWVzdCBiZWNhdXNlIHRoZSByZXF1ZXN0IGVudGl0eSBpcyBsYXJnZXIKKyAgICAgKiB0aGFuIHRoZSBzZXJ2ZXIgaXMgd2lsbGluZyBvciBhYmxlIHRvIHByb2Nlc3MuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NfUkVRVUVTVF9UT09fTE9ORyA9IDQxMzsKKworCisgICAgLyoqCisgICAgICogU3RhdHVzIGNvZGUgKDQxNSkgaW5kaWNhdGluZyB0aGUgc2VydmVyIGlzIHJlZnVzaW5nIHRvIHNlcnZpY2UKKyAgICAgKiB0aGUgcmVxdWVzdCBiZWNhdXNlIHRoZSBlbnRpdHkgb2YgdGhlIHJlcXVlc3QgaXMgaW4gYSBmb3JtYXQKKyAgICAgKiBub3Qgc3VwcG9ydGVkIGJ5IHRoZSByZXF1ZXN0ZWQgcmVzb3VyY2UgZm9yIHRoZSByZXF1ZXN0ZWQKKyAgICAgKiBtZXRob2QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NfVU5TVVBQT1JURURfTUVESUFfVFlQRSA9IDQxNTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRXh0ZW5kZWQgV2ViRGF2IHN0YXR1cyBjb2RlCisKKworICAgIC8qKgorICAgICAqIFN0YXR1cyBjb2RlICgyMDcpIGluZGljYXRpbmcgdGhhdCB0aGUgcmVzcG9uc2UgcmVxdWlyZXMKKyAgICAgKiBwcm92aWRpbmcgc3RhdHVzIGZvciBtdWx0aXBsZSBpbmRlcGVuZGVudCBvcGVyYXRpb25zLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDX01VTFRJX1NUQVRVUyA9IDIwNzsKKyAgICAvLyBUaGlzIG9uZSBjb2xpZGVzIHdpdGggSFRUUCAxLjEKKyAgICAvLyAiMjA3IFBhcml0YWwgVXBkYXRlIE9LIgorCisKKyAgICAvKioKKyAgICAgKiBTdGF0dXMgY29kZSAoNDE4KSBpbmRpY2F0aW5nIHRoZSBlbnRpdHkgYm9keSBzdWJtaXR0ZWQgd2l0aAorICAgICAqIHRoZSBQQVRDSCBtZXRob2Qgd2FzIG5vdCB1bmRlcnN0b29kIGJ5IHRoZSByZXNvdXJjZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ19VTlBST0NFU1NBQkxFX0VOVElUWSA9IDQxODsKKyAgICAvLyBUaGlzIG9uZSBjb2xpZGVzIHdpdGggSFRUUCAxLjEKKyAgICAvLyAiNDE4IFJlYXV0aGVudGljYXRpb24gUmVxdWlyZWQiCisKKworICAgIC8qKgorICAgICAqIFN0YXR1cyBjb2RlICg0MTkpIGluZGljYXRpbmcgdGhhdCB0aGUgcmVzb3VyY2UgZG9lcyBub3QgaGF2ZQorICAgICAqIHN1ZmZpY2llbnQgc3BhY2UgdG8gcmVjb3JkIHRoZSBzdGF0ZSBvZiB0aGUgcmVzb3VyY2UgYWZ0ZXIgdGhlCisgICAgICogZXhlY3V0aW9uIG9mIHRoaXMgbWV0aG9kLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDX0lOU1VGRklDSUVOVF9TUEFDRV9PTl9SRVNPVVJDRSA9IDQxOTsKKyAgICAvLyBUaGlzIG9uZSBjb2xpZGVzIHdpdGggSFRUUCAxLjEKKyAgICAvLyAiNDE5IFByb3h5IFJlYXV0aGVudGljYXRpb24gUmVxdWlyZWQiCisKKworICAgIC8qKgorICAgICAqIFN0YXR1cyBjb2RlICg0MjApIGluZGljYXRpbmcgdGhlIG1ldGhvZCB3YXMgbm90IGV4ZWN1dGVkIG9uCisgICAgICogYSBwYXJ0aWN1bGFyIHJlc291cmNlIHdpdGhpbiBpdHMgc2NvcGUgYmVjYXVzZSBzb21lIHBhcnQgb2YKKyAgICAgKiB0aGUgbWV0aG9kJ3MgZXhlY3V0aW9uIGZhaWxlZCBjYXVzaW5nIHRoZSBlbnRpcmUgbWV0aG9kIHRvIGJlCisgICAgICogYWJvcnRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ19NRVRIT0RfRkFJTFVSRSA9IDQyMDsKKworCisgICAgLyoqCisgICAgICogU3RhdHVzIGNvZGUgKDQyMykgaW5kaWNhdGluZyB0aGUgZGVzdGluYXRpb24gcmVzb3VyY2Ugb2YgYQorICAgICAqIG1ldGhvZCBpcyBsb2NrZWQsIGFuZCBlaXRoZXIgdGhlIHJlcXVlc3QgZGlkIG5vdCBjb250YWluIGEKKyAgICAgKiB2YWxpZCBMb2NrLUluZm8gaGVhZGVyLCBvciB0aGUgTG9jay1JbmZvIGhlYWRlciBpZGVudGlmaWVzCisgICAgICogYSBsb2NrIGhlbGQgYnkgYW5vdGhlciBwcmluY2lwYWwuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NfTE9DS0VEID0gNDIzOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5pdGlhbGl6ZXIKKworCisgICAgc3RhdGljIHsKKyAgICAgICAgLy8gSFRUUCAxLjAgdGF0dXMgQ29kZQorICAgICAgICBhZGRTdGF0dXNDb2RlTWFwKFNDX09LLCAiT0siKTsKKyAgICAgICAgYWRkU3RhdHVzQ29kZU1hcChTQ19DUkVBVEVELCAiQ3JlYXRlZCIpOworICAgICAgICBhZGRTdGF0dXNDb2RlTWFwKFNDX0FDQ0VQVEVELCAiQWNjZXB0ZWQiKTsKKyAgICAgICAgYWRkU3RhdHVzQ29kZU1hcChTQ19OT19DT05URU5ULCAiTm8gQ29udGVudCIpOworICAgICAgICBhZGRTdGF0dXNDb2RlTWFwKFNDX01PVkVEX1BFUk1BTkVOVExZLCAiTW92ZWQgUGVybWFuZW50bHkiKTsKKyAgICAgICAgYWRkU3RhdHVzQ29kZU1hcChTQ19NT1ZFRF9URU1QT1JBUklMWSwgIk1vdmVkIFRlbXBvcmFyaWx5Iik7CisgICAgICAgIGFkZFN0YXR1c0NvZGVNYXAoU0NfTk9UX01PRElGSUVELCAiTm90IE1vZGlmaWVkIik7CisgICAgICAgIGFkZFN0YXR1c0NvZGVNYXAoU0NfQkFEX1JFUVVFU1QsICJCYWQgUmVxdWVzdCIpOworICAgICAgICBhZGRTdGF0dXNDb2RlTWFwKFNDX1VOQVVUSE9SSVpFRCwgIlVuYXV0aG9yaXplZCIpOworICAgICAgICBhZGRTdGF0dXNDb2RlTWFwKFNDX0ZPUkJJRERFTiwgIkZvcmJpZGRlbiIpOworICAgICAgICBhZGRTdGF0dXNDb2RlTWFwKFNDX05PVF9GT1VORCwgIk5vdCBGb3VuZCIpOworICAgICAgICBhZGRTdGF0dXNDb2RlTWFwKFNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwgIkludGVybmFsIFNlcnZlciBFcnJvciIpOworICAgICAgICBhZGRTdGF0dXNDb2RlTWFwKFNDX05PVF9JTVBMRU1FTlRFRCwgIk5vdCBJbXBsZW1lbnRlZCIpOworICAgICAgICBhZGRTdGF0dXNDb2RlTWFwKFNDX0JBRF9HQVRFV0FZLCAiQmFkIEdhdGV3YXkiKTsKKyAgICAgICAgYWRkU3RhdHVzQ29kZU1hcChTQ19TRVJWSUNFX1VOQVZBSUxBQkxFLCAiU2VydmljZSBVbmF2YWlsYWJsZSIpOworICAgICAgICBhZGRTdGF0dXNDb2RlTWFwKFNDX0NPTlRJTlVFLCAiQ29udGludWUiKTsKKyAgICAgICAgYWRkU3RhdHVzQ29kZU1hcChTQ19NRVRIT0RfTk9UX0FMTE9XRUQsICJNZXRob2QgTm90IEFsbG93ZWQiKTsKKyAgICAgICAgYWRkU3RhdHVzQ29kZU1hcChTQ19DT05GTElDVCwgIkNvbmZsaWN0Iik7CisgICAgICAgIGFkZFN0YXR1c0NvZGVNYXAoU0NfUFJFQ09ORElUSU9OX0ZBSUxFRCwgIlByZWNvbmRpdGlvbiBGYWlsZWQiKTsKKyAgICAgICAgYWRkU3RhdHVzQ29kZU1hcChTQ19SRVFVRVNUX1RPT19MT05HLCAiUmVxdWVzdCBUb28gTG9uZyIpOworICAgICAgICBhZGRTdGF0dXNDb2RlTWFwKFNDX1VOU1VQUE9SVEVEX01FRElBX1RZUEUsICJVbnN1cHBvcnRlZCBNZWRpYSBUeXBlIik7CisgICAgICAgIC8vIFdlYkRhdiBTdGF0dXMgQ29kZXMKKyAgICAgICAgYWRkU3RhdHVzQ29kZU1hcChTQ19NVUxUSV9TVEFUVVMsICJNdWx0aS1TdGF0dXMiKTsKKyAgICAgICAgYWRkU3RhdHVzQ29kZU1hcChTQ19VTlBST0NFU1NBQkxFX0VOVElUWSwgIlVucHJvY2Vzc2FibGUgRW50aXR5Iik7CisgICAgICAgIGFkZFN0YXR1c0NvZGVNYXAoU0NfSU5TVUZGSUNJRU5UX1NQQUNFX09OX1JFU09VUkNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICJJbnN1ZmZpY2llbnQgU3BhY2UgT24gUmVzb3VyY2UiKTsKKyAgICAgICAgYWRkU3RhdHVzQ29kZU1hcChTQ19NRVRIT0RfRkFJTFVSRSwgIk1ldGhvZCBGYWlsdXJlIik7CisgICAgICAgIGFkZFN0YXR1c0NvZGVNYXAoU0NfTE9DS0VELCAiTG9ja2VkIik7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgSFRUUCBzdGF0dXMgdGV4dCBmb3IgdGhlIEhUVFAgb3IgV2ViRGF2IHN0YXR1cyBjb2RlCisgICAgICogc3BlY2lmaWVkIGJ5IGxvb2tpbmcgaXQgdXAgaW4gdGhlIHN0YXRpYyBtYXBwaW5nLiAgVGhpcyBpcyBhCisgICAgICogc3RhdGljIGZ1bmN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtICAgbkh0dHBTdGF0dXNDb2RlIFtJTl0gSFRUUCBvciBXZWJEQVYgc3RhdHVzIGNvZGUKKyAgICAgKiBAcmV0dXJuICBBIHN0cmluZyB3aXRoIGEgc2hvcnQgZGVzY3JpcHRpdmUgcGhyYXNlIGZvciB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgIEhUVFAgc3RhdHVzIGNvZGUgKGUuZy4sICJPSyIpLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0YXR1c1RleHQoaW50IG5IdHRwU3RhdHVzQ29kZSkgeworICAgICAgICBJbnRlZ2VyIGludEtleSA9IG5ldyBJbnRlZ2VyKG5IdHRwU3RhdHVzQ29kZSk7CisKKyAgICAgICAgaWYgKCFtYXBTdGF0dXNDb2Rlcy5jb250YWluc0tleShpbnRLZXkpKSB7CisgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gKFN0cmluZykgbWFwU3RhdHVzQ29kZXMuZ2V0KGludEtleSk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByaXZhdGUgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgbmV3IHN0YXR1cyBjb2RlIC0+IHN0YXR1cyB0ZXh0IG1hcHBpbmcuICBUaGlzIGlzIGEgc3RhdGljCisgICAgICogbWV0aG9kIGJlY2F1c2UgdGhlIG1hcHBpbmcgaXMgYSBzdGF0aWMgdmFyaWFibGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gICBuS2V5ICAgIFtJTl0gSFRUUCBvciBXZWJEQVYgc3RhdHVzIGNvZGUKKyAgICAgKiBAcGFyYW0gICBzdHJWYWwgIFtJTl0gSFRUUCBzdGF0dXMgdGV4dAorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYWRkU3RhdHVzQ29kZU1hcChpbnQgbktleSwgU3RyaW5nIHN0clZhbCkgeworICAgICAgICBtYXBTdGF0dXNDb2Rlcy5wdXQobmV3IEludGVnZXIobktleSksIHN0clZhbCk7CisgICAgfQorCit9OworCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc2VydmxldHMvcGFja2FnZS5odG1sIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NlcnZsZXRzL3BhY2thZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzkyODQzCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NlcnZsZXRzL3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDE3IEBACis8Ym9keT4KKworPHA+VGhpcyBwYWNrYWdlIGNvbnRhaW5zIDxjb2RlPlNlcnZsZXRzPC9jb2RlPiB0aGF0IGltcGxlbWVudCBzb21lIG9mIHRoZQorc3RhbmRhcmQgZnVuY3Rpb25hbGl0eSBwcm92aWRlZCBieSB0aGUgQ2F0YWxpbmEgc2VydmxldCBjb250YWluZXIuICBCZWNhdXNlCit0aGVzZSBzZXJ2bGV0cyBhcmUgaW4gdGhlIDxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmE8L2NvZGU+IHBhY2thZ2UgaGllcmFyY2h5LAordGhleSBhcmUgaW4gdGhlIHByaXZpbGVnZWQgcG9zaXRpb24gb2YgYmVpbmcgYWJsZSB0byByZWZlcmVuY2UgaW50ZXJuYWwgc2VydmVyCitkYXRhIHN0cnVjdHVyZXMsIHdoaWNoIGFwcGxpY2F0aW9uIGxldmVsIHNlcnZsZXRzIGFyZSBwcmV2ZW50ZWQgZnJvbQorYWNjZXNzaW5nIChieSB0aGUgYXBwbGljYXRpb24gY2xhc3MgbG9hZGVyIGltcGxlbWVudGF0aW9uKS48L3A+CisKKzxwPlRvIHRoZSBleHRlbnQgdGhhdCB0aGVzZSBzZXJ2bGV0cyBkZXBlbmQgdXBvbiBpbnRlcm5hbCBDYXRhbGluYSBkYXRhCitzdHJ1Y3R1cmVzLCB0aGV5IGFyZSBvYnZpb3VzbHkgbm90IHBvcnRhYmxlIHRvIG90aGVyIHNlcnZsZXQgY29udGFpbmVyCitlbnZpcm9ubWVudHMuICBIb3dldmVyLCB0aGV5IGNhbiBiZSB1c2VkIGFzIG1vZGVscyBmb3IgY3JlYXRpbmcgYXBwbGljYXRpb24KK2xldmVsIHNlcnZsZXRzIHRoYXQgcHJvdmlkZSBzaW1pbGFyIGNhcGFiaWxpdGllcyAtLSBtb3N0IG9idmlvdXNseSB0aGUKKzxhIGhyZWY9IkRlZmF1bHRTZXJ2bGV0Lmh0bWwiPkRlZmF1bHRTZXJ2bGV0PC9hPiBpbXBsZW1lbnRhdGlvbiwgd2hpY2gKK3NlcnZlcyBzdGF0aWMgcmVzb3VyY2VzIHdoZW4gQ2F0YWxpbmEgcnVucyBzdGFuZC1hbG9uZS48L3A+CisKKzwvYm9keT4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zZXNzaW9uL0NvbnN0YW50cy5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3Nlc3Npb24vQ29uc3RhbnRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjcxOTg1MgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zZXNzaW9uL0NvbnN0YW50cy5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc2Vzc2lvbjsKKworLyoqCisgKiBNYW5pZmVzdCBjb25zdGFudHMgZm9yIHRoZSA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLnNlc3Npb248L2NvZGU+CisgKiBwYWNrYWdlLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICovCisKK3B1YmxpYyBjbGFzcyBDb25zdGFudHMgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUGFja2FnZSA9ICJvcmcuYXBhY2hlLmNhdGFsaW5hLnNlc3Npb24iOworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc2Vzc2lvbi9GaWxlU3RvcmUuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zZXNzaW9uL0ZpbGVTdG9yZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0NTBjYmQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc2Vzc2lvbi9GaWxlU3RvcmUuamF2YQpAQCAtMCwwICsxLDQzMyBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5zZXNzaW9uOworCisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGFpbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkdsb2JhbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Mb2FkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5TZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuU3RvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLkN1c3RvbU9iamVjdElucHV0U3RyZWFtOworCisKKy8qKgorICogQ29uY3JldGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIDxiPlN0b3JlPC9iPiBpbnRlcmZhY2UgdGhhdCB1dGlsaXplcworICogYSBmaWxlIHBlciBzYXZlZCBTZXNzaW9uIGluIGEgY29uZmlndXJlZCBkaXJlY3RvcnkuICBTZXNzaW9ucyB0aGF0IGFyZQorICogc2F2ZWQgYXJlIHN0aWxsIHN1YmplY3QgdG8gYmVpbmcgZXhwaXJlZCBiYXNlZCBvbiBpbmFjdGl2aXR5LgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgRmlsZVN0b3JlCisgICAgZXh0ZW5kcyBTdG9yZUJhc2UgaW1wbGVtZW50cyBTdG9yZSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0YW50cworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZXh0ZW5zaW9uIHRvIHVzZSBmb3Igc2VyaWFsaXplZCBzZXNzaW9uIGZpbGVuYW1lcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9FWFQgPSAiLnNlc3Npb24iOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIHBhdGhuYW1lIG9mIHRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggU2Vzc2lvbnMgYXJlIHN0b3JlZC4KKyAgICAgKiBUaGlzIG1heSBiZSBhbiBhYnNvbHV0ZSBwYXRobmFtZSwgb3IgYSByZWxhdGl2ZSBwYXRoIHRoYXQgaXMKKyAgICAgKiByZXNvbHZlZCBhZ2FpbnN0IHRoZSB0ZW1wb3Jhcnkgd29yayBkaXJlY3RvcnkgZm9yIHRoaXMgYXBwbGljYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZGlyZWN0b3J5ID0gIi4iOworCisKKyAgICAvKioKKyAgICAgKiBBIEZpbGUgcmVwcmVzZW50aW5nIHRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggU2Vzc2lvbnMgYXJlIHN0b3JlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIEZpbGUgZGlyZWN0b3J5RmlsZSA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBpbmZvID0gIkZpbGVTdG9yZS8xLjAiOworCisgICAgLyoqCisgICAgICogTmFtZSB0byByZWdpc3RlciBmb3IgdGhpcyBTdG9yZSwgdXNlZCBmb3IgbG9nZ2luZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgc3RvcmVOYW1lID0gImZpbGVTdG9yZSI7CisKKyAgICAvKioKKyAgICAgKiBOYW1lIHRvIHJlZ2lzdGVyIGZvciB0aGUgYmFja2dyb3VuZCB0aHJlYWQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHRocmVhZE5hbWUgPSAiRmlsZVN0b3JlIjsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZGlyZWN0b3J5IHBhdGggZm9yIHRoaXMgU3RvcmUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXREaXJlY3RvcnkoKSB7CisKKyAgICAgICAgcmV0dXJuIChkaXJlY3RvcnkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGRpcmVjdG9yeSBwYXRoIGZvciB0aGlzIFN0b3JlLgorICAgICAqCisgICAgICogQHBhcmFtIHBhdGggVGhlIG5ldyBkaXJlY3RvcnkgcGF0aAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERpcmVjdG9yeShTdHJpbmcgcGF0aCkgeworCisgICAgICAgIFN0cmluZyBvbGREaXJlY3RvcnkgPSB0aGlzLmRpcmVjdG9yeTsKKyAgICAgICAgdGhpcy5kaXJlY3RvcnkgPSBwYXRoOworICAgICAgICB0aGlzLmRpcmVjdG9yeUZpbGUgPSBudWxsOworICAgICAgICBzdXBwb3J0LmZpcmVQcm9wZXJ0eUNoYW5nZSgiZGlyZWN0b3J5Iiwgb2xkRGlyZWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpcmVjdG9yeSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIFN0b3JlIGltcGxlbWVudGF0aW9uIGFuZAorICAgICAqIHRoZSBjb3JyZXNwb25kaW5nIHZlcnNpb24gbnVtYmVyLCBpbiB0aGUgZm9ybWF0CisgICAgICogPGNvZGU+Jmx0O2Rlc2NyaXB0aW9uJmd0Oy8mbHQ7dmVyc2lvbiZndDs8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5mbygpIHsKKworICAgICAgICByZXR1cm4gKGluZm8pOworCisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB0aHJlYWQgbmFtZSBmb3IgdGhpcyBTdG9yZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFRocmVhZE5hbWUoKSB7CisgICAgICAgIHJldHVybih0aHJlYWROYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG5hbWUgZm9yIHRoaXMgU3RvcmUsIHVzZWQgZm9yIGxvZ2dpbmcuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTdG9yZU5hbWUoKSB7CisgICAgICAgIHJldHVybihzdG9yZU5hbWUpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBudW1iZXIgb2YgU2Vzc2lvbnMgcHJlc2VudCBpbiB0aGlzIFN0b3JlLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIGludCBnZXRTaXplKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBBY3F1aXJlIHRoZSBsaXN0IG9mIGZpbGVzIGluIG91ciBzdG9yYWdlIGRpcmVjdG9yeQorICAgICAgICBGaWxlIGZpbGUgPSBkaXJlY3RvcnkoKTsKKyAgICAgICAgaWYgKGZpbGUgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuICgwKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgZmlsZXNbXSA9IGZpbGUubGlzdCgpOworCisgICAgICAgIC8vIEZpZ3VyZSBvdXQgd2hpY2ggZmlsZXMgYXJlIHNlc3Npb25zCisgICAgICAgIGludCBrZXljb3VudCA9IDA7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChmaWxlc1tpXS5lbmRzV2l0aChGSUxFX0VYVCkpIHsKKyAgICAgICAgICAgICAgICBrZXljb3VudCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAoa2V5Y291bnQpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGFsbCBvZiB0aGUgU2Vzc2lvbnMgaW4gdGhpcyBTdG9yZS4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICBTdHJpbmdbXSBrZXlzID0ga2V5cygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHJlbW92ZShrZXlzW2ldKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyB0aGUgc2Vzc2lvbiBpZGVudGlmaWVycyBvZiBhbGwgU2Vzc2lvbnMKKyAgICAgKiBjdXJyZW50bHkgc2F2ZWQgaW4gdGhpcyBTdG9yZS4gIElmIHRoZXJlIGFyZSBubyBzdWNoIFNlc3Npb25zLCBhCisgICAgICogemVyby1sZW5ndGggYXJyYXkgaXMgcmV0dXJuZWQuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnJlZAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBrZXlzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBBY3F1aXJlIHRoZSBsaXN0IG9mIGZpbGVzIGluIG91ciBzdG9yYWdlIGRpcmVjdG9yeQorICAgICAgICBGaWxlIGZpbGUgPSBkaXJlY3RvcnkoKTsKKyAgICAgICAgaWYgKGZpbGUgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIChuZXcgU3RyaW5nWzBdKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgZmlsZXNbXSA9IGZpbGUubGlzdCgpOworCisgICAgICAgIC8vIEJ1aWxkIGFuZCByZXR1cm4gdGhlIGxpc3Qgb2Ygc2Vzc2lvbiBpZGVudGlmaWVycworICAgICAgICBBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgaW50IG4gPSBGSUxFX0VYVC5sZW5ndGgoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKGZpbGVzW2ldLmVuZHNXaXRoKEZJTEVfRVhUKSkgeworICAgICAgICAgICAgICAgIGxpc3QuYWRkKGZpbGVzW2ldLnN1YnN0cmluZygwLCBmaWxlc1tpXS5sZW5ndGgoKSAtIG4pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKChTdHJpbmdbXSkgbGlzdC50b0FycmF5KG5ldyBTdHJpbmdbbGlzdC5zaXplKCldKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIExvYWQgYW5kIHJldHVybiB0aGUgU2Vzc2lvbiBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBzZXNzaW9uCisgICAgICogaWRlbnRpZmllciBmcm9tIHRoaXMgU3RvcmUsIHdpdGhvdXQgcmVtb3ZpbmcgaXQuICBJZiB0aGVyZSBpcyBubworICAgICAqIHN1Y2ggc3RvcmVkIFNlc3Npb24sIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpZCBTZXNzaW9uIGlkZW50aWZpZXIgb2YgdGhlIHNlc3Npb24gdG8gbG9hZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGlmIGEgZGVzZXJpYWxpemF0aW9uIGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBTZXNzaW9uIGxvYWQoU3RyaW5nIGlkKQorICAgICAgICB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCisgICAgICAgIC8vIE9wZW4gYW4gaW5wdXQgc3RyZWFtIHRvIHRoZSBzcGVjaWZpZWQgcGF0aG5hbWUsIGlmIGFueQorICAgICAgICBGaWxlIGZpbGUgPSBmaWxlKGlkKTsKKyAgICAgICAgaWYgKGZpbGUgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghIGZpbGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1hbmFnZXIuZ2V0Q29udGFpbmVyKCkuZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgbWFuYWdlci5nZXRDb250YWluZXIoKS5nZXRMb2dnZXIoKS5kZWJ1ZyhzbS5nZXRTdHJpbmcoZ2V0U3RvcmVOYW1lKCkrIi5sb2FkaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQsIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpKTsKKyAgICAgICAgfQorCisgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBmaXMgPSBudWxsOworICAgICAgICBPYmplY3RJbnB1dFN0cmVhbSBvaXMgPSBudWxsOworICAgICAgICBMb2FkZXIgbG9hZGVyID0gbnVsbDsKKyAgICAgICAgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgICAgIEJ1ZmZlcmVkSW5wdXRTdHJlYW0gYmlzID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oZmlzKTsKKyAgICAgICAgICAgIENvbnRhaW5lciBjb250YWluZXIgPSBtYW5hZ2VyLmdldENvbnRhaW5lcigpOworICAgICAgICAgICAgaWYgKGNvbnRhaW5lciAhPSBudWxsKQorICAgICAgICAgICAgICAgIGxvYWRlciA9IGNvbnRhaW5lci5nZXRMb2FkZXIoKTsKKyAgICAgICAgICAgIGlmIChsb2FkZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBjbGFzc0xvYWRlciA9IGxvYWRlci5nZXRDbGFzc0xvYWRlcigpOworICAgICAgICAgICAgaWYgKGNsYXNzTG9hZGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgb2lzID0gbmV3IEN1c3RvbU9iamVjdElucHV0U3RyZWFtKGJpcywgY2xhc3NMb2FkZXIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG9pcyA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShiaXMpOworICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgaWYgKG1hbmFnZXIuZ2V0Q29udGFpbmVyKCkuZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBtYW5hZ2VyLmdldENvbnRhaW5lcigpLmdldExvZ2dlcigpLmRlYnVnKCJObyBwZXJzaXN0ZWQgZGF0YSBmaWxlIGZvdW5kIik7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBpZiAob2lzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBvaXMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBmKSB7CisgICAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb2lzID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3RhbmRhcmRTZXNzaW9uIHNlc3Npb24gPQorICAgICAgICAgICAgICAgIChTdGFuZGFyZFNlc3Npb24pIG1hbmFnZXIuY3JlYXRlRW1wdHlTZXNzaW9uKCk7CisgICAgICAgICAgICBzZXNzaW9uLnJlYWRPYmplY3REYXRhKG9pcyk7CisgICAgICAgICAgICBzZXNzaW9uLnNldE1hbmFnZXIobWFuYWdlcik7CisgICAgICAgICAgICByZXR1cm4gKHNlc3Npb24pOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgLy8gQ2xvc2UgdGhlIGlucHV0IHN0cmVhbQorICAgICAgICAgICAgaWYgKG9pcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgb2lzLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZikgeworICAgICAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgdGhlIFNlc3Npb24gd2l0aCB0aGUgc3BlY2lmaWVkIHNlc3Npb24gaWRlbnRpZmllciBmcm9tCisgICAgICogdGhpcyBTdG9yZSwgaWYgcHJlc2VudC4gIElmIG5vIHN1Y2ggU2Vzc2lvbiBpcyBwcmVzZW50LCB0aGlzIG1ldGhvZAorICAgICAqIHRha2VzIG5vIGFjdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpZCBTZXNzaW9uIGlkZW50aWZpZXIgb2YgdGhlIFNlc3Npb24gdG8gYmUgcmVtb3ZlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlKFN0cmluZyBpZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICBGaWxlIGZpbGUgPSBmaWxlKGlkKTsKKyAgICAgICAgaWYgKGZpbGUgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChtYW5hZ2VyLmdldENvbnRhaW5lcigpLmdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIG1hbmFnZXIuZ2V0Q29udGFpbmVyKCkuZ2V0TG9nZ2VyKCkuZGVidWcoc20uZ2V0U3RyaW5nKGdldFN0b3JlTmFtZSgpKyIucmVtb3ZpbmciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCwgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSkpOworICAgICAgICB9CisgICAgICAgIGZpbGUuZGVsZXRlKCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNhdmUgdGhlIHNwZWNpZmllZCBTZXNzaW9uIGludG8gdGhpcyBTdG9yZS4gIEFueSBwcmV2aW91c2x5IHNhdmVkCisgICAgICogaW5mb3JtYXRpb24gZm9yIHRoZSBhc3NvY2lhdGVkIHNlc3Npb24gaWRlbnRpZmllciBpcyByZXBsYWNlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXNzaW9uIFNlc3Npb24gdG8gYmUgc2F2ZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNhdmUoU2Vzc2lvbiBzZXNzaW9uKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIC8vIE9wZW4gYW4gb3V0cHV0IHN0cmVhbSB0byB0aGUgc3BlY2lmaWVkIHBhdGhuYW1lLCBpZiBhbnkKKyAgICAgICAgRmlsZSBmaWxlID0gZmlsZShzZXNzaW9uLmdldElkKCkpOworICAgICAgICBpZiAoZmlsZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1hbmFnZXIuZ2V0Q29udGFpbmVyKCkuZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgbWFuYWdlci5nZXRDb250YWluZXIoKS5nZXRMb2dnZXIoKS5kZWJ1ZyhzbS5nZXRTdHJpbmcoZ2V0U3RvcmVOYW1lKCkrIi5zYXZpbmciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldElkKCksIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpKTsKKyAgICAgICAgfQorICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG51bGw7CisgICAgICAgIE9iamVjdE91dHB1dFN0cmVhbSBvb3MgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgICAgICBvb3MgPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShmb3MpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgaWYgKG9vcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgb29zLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZikgeworICAgICAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAoKFN0YW5kYXJkU2Vzc2lvbilzZXNzaW9uKS53cml0ZU9iamVjdERhdGEob29zKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIG9vcy5jbG9zZSgpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByaXZhdGUgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBGaWxlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHBhdGhuYW1lIHRvIG91cgorICAgICAqIHNlc3Npb24gcGVyc2lzdGVuY2UgZGlyZWN0b3J5LCBpZiBhbnkuICBUaGUgZGlyZWN0b3J5IHdpbGwgYmUKKyAgICAgKiBjcmVhdGVkIGlmIGl0IGRvZXMgbm90IGFscmVhZHkgZXhpc3QuCisgICAgICovCisgICAgcHJpdmF0ZSBGaWxlIGRpcmVjdG9yeSgpIHsKKworICAgICAgICBpZiAodGhpcy5kaXJlY3RvcnkgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGhpcy5kaXJlY3RvcnlGaWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIE5PVEU6ICBSYWNlIGNvbmRpdGlvbiBpcyBoYXJtbGVzcywgc28gZG8gbm90IHN5bmNocm9uaXplCisgICAgICAgICAgICByZXR1cm4gKHRoaXMuZGlyZWN0b3J5RmlsZSk7CisgICAgICAgIH0KKyAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUodGhpcy5kaXJlY3RvcnkpOworICAgICAgICBpZiAoIWZpbGUuaXNBYnNvbHV0ZSgpKSB7CisgICAgICAgICAgICBDb250YWluZXIgY29udGFpbmVyID0gbWFuYWdlci5nZXRDb250YWluZXIoKTsKKyAgICAgICAgICAgIGlmIChjb250YWluZXIgaW5zdGFuY2VvZiBDb250ZXh0KSB7CisgICAgICAgICAgICAgICAgU2VydmxldENvbnRleHQgc2VydmxldENvbnRleHQgPQorICAgICAgICAgICAgICAgICAgICAoKENvbnRleHQpIGNvbnRhaW5lcikuZ2V0U2VydmxldENvbnRleHQoKTsKKyAgICAgICAgICAgICAgICBGaWxlIHdvcmsgPSAoRmlsZSkKKyAgICAgICAgICAgICAgICAgICAgc2VydmxldENvbnRleHQuZ2V0QXR0cmlidXRlKEdsb2JhbHMuV09SS19ESVJfQVRUUik7CisgICAgICAgICAgICAgICAgZmlsZSA9IG5ldyBGaWxlKHdvcmssIHRoaXMuZGlyZWN0b3J5KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAoIlBhcmVudCBDb250YWluZXIgaXMgbm90IGEgQ29udGV4dCIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghZmlsZS5leGlzdHMoKSB8fCAhZmlsZS5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICBmaWxlLmRlbGV0ZSgpOworICAgICAgICAgICAgZmlsZS5ta2RpcnMoKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmRpcmVjdG9yeUZpbGUgPSBmaWxlOworICAgICAgICByZXR1cm4gKGZpbGUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBGaWxlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHBhdGhuYW1lIHRvIG91cgorICAgICAqIHNlc3Npb24gcGVyc2lzdGVuY2UgZmlsZSwgaWYgYW55LgorICAgICAqCisgICAgICogQHBhcmFtIGlkIFRoZSBJRCBvZiB0aGUgU2Vzc2lvbiB0byBiZSByZXRyaWV2ZWQuIFRoaXMgaXMKKyAgICAgKiAgICB1c2VkIGluIHRoZSBmaWxlIG5hbWluZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIEZpbGUgZmlsZShTdHJpbmcgaWQpIHsKKworICAgICAgICBpZiAodGhpcy5kaXJlY3RvcnkgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPSBpZCArIEZJTEVfRVhUOworICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShkaXJlY3RvcnkoKSwgZmlsZW5hbWUpOworICAgICAgICByZXR1cm4gKGZpbGUpOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zZXNzaW9uL0pEQkNTdG9yZS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3Nlc3Npb24vSkRCQ1N0b3JlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RmODFjYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zZXNzaW9uL0pEQkNTdG9yZS5qYXZhCkBAIC0wLDAgKzEsOTc5IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5zZXNzaW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Db250YWluZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Mb2FkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5TZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuU3RvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLkN1c3RvbU9iamVjdElucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5zcWwuQ29ubmVjdGlvbjsKK2ltcG9ydCBqYXZhLnNxbC5Ecml2ZXI7CitpbXBvcnQgamF2YS5zcWwuUHJlcGFyZWRTdGF0ZW1lbnQ7CitpbXBvcnQgamF2YS5zcWwuUmVzdWx0U2V0OworaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSA8Y29kZT5TdG9yZTwvY29kZT4gaW50ZXJmYWNlIHRoYXQgc3RvcmVzCisgKiBzZXJpYWxpemVkIHNlc3Npb24gb2JqZWN0cyBpbiBhIGRhdGFiYXNlLiAgU2Vzc2lvbnMgdGhhdCBhcmUKKyAqIHNhdmVkIGFyZSBzdGlsbCBzdWJqZWN0IHRvIGJlaW5nIGV4cGlyZWQgYmFzZWQgb24gaW5hY3Rpdml0eS4KKyAqCisgKiBAYXV0aG9yIEJpcCBUaGVsaW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQsICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBKREJDU3RvcmUKKyAgICAgICAgZXh0ZW5kcyBTdG9yZUJhc2UgaW1wbGVtZW50cyBTdG9yZSB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBpbmZvID0gIkpEQkNTdG9yZS8xLjAiOworCisgICAgLyoqCisgICAgICogQ29udGV4dCBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFN0b3JlCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZSA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBOYW1lIHRvIHJlZ2lzdGVyIGZvciB0aGlzIFN0b3JlLCB1c2VkIGZvciBsb2dnaW5nLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIHN0b3JlTmFtZSA9ICJKREJDU3RvcmUiOworCisgICAgLyoqCisgICAgICogTmFtZSB0byByZWdpc3RlciBmb3IgdGhlIGJhY2tncm91bmQgdGhyZWFkLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgdGhyZWFkTmFtZSA9ICJKREJDU3RvcmUiOworCisgICAgLyoqCisgICAgICogVGhlIGNvbm5lY3Rpb24gdXNlcm5hbWUgdG8gdXNlIHdoZW4gdHJ5aW5nIHRvIGNvbm5lY3QgdG8gdGhlIGRhdGFiYXNlLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgY29ubmVjdGlvbk5hbWUgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgY29ubmVjdGlvbiBVUkwgdG8gdXNlIHdoZW4gdHJ5aW5nIHRvIGNvbm5lY3QgdG8gdGhlIGRhdGFiYXNlLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgY29ubmVjdGlvblBhc3N3b3JkID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIENvbm5lY3Rpb24gc3RyaW5nIHRvIHVzZSB3aGVuIGNvbm5lY3RpbmcgdG8gdGhlIERCLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgY29ubmVjdGlvblVSTCA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGF0YWJhc2UgY29ubmVjdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIENvbm5lY3Rpb24gZGJDb25uZWN0aW9uID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIEluc3RhbmNlIG9mIHRoZSBKREJDIERyaXZlciBjbGFzcyB3ZSB1c2UgYXMgYSBjb25uZWN0aW9uIGZhY3RvcnkuCisgICAgICovCisgICAgcHJvdGVjdGVkIERyaXZlciBkcml2ZXIgPSBudWxsOworCisgICAgLyoqCisgICAgICogRHJpdmVyIHRvIHVzZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGRyaXZlck5hbWUgPSBudWxsOworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBUYWJsZSAmIGNvbHMKKworICAgIC8qKgorICAgICAqIFRhYmxlIHRvIHVzZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHNlc3Npb25UYWJsZSA9ICJ0b21jYXQkc2Vzc2lvbnMiOworCisgICAgLyoqCisgICAgICogQ29sdW1uIHRvIHVzZSBmb3IgL0VuZ2luZS9Ib3N0L0NvbnRleHQgbmFtZQorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgc2Vzc2lvbkFwcENvbCA9ICJhcHAiOworCisgICAgLyoqCisgICAgICogSWQgY29sdW1uIHRvIHVzZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHNlc3Npb25JZENvbCA9ICJpZCI7CisKKyAgICAvKioKKyAgICAgKiBEYXRhIGNvbHVtbiB0byB1c2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBzZXNzaW9uRGF0YUNvbCA9ICJkYXRhIjsKKworICAgIC8qKgorICAgICAqIElzIFZhbGlkIGNvbHVtbiB0byB1c2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBzZXNzaW9uVmFsaWRDb2wgPSAidmFsaWQiOworCisgICAgLyoqCisgICAgICogTWF4IEluYWN0aXZlIGNvbHVtbiB0byB1c2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBzZXNzaW9uTWF4SW5hY3RpdmVDb2wgPSAibWF4aW5hY3RpdmUiOworCisgICAgLyoqCisgICAgICogTGFzdCBBY2Nlc3NlZCBjb2x1bW4gdG8gdXNlLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgc2Vzc2lvbkxhc3RBY2Nlc3NlZENvbCA9ICJsYXN0YWNjZXNzIjsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU1FMIFZhcmlhYmxlcworCisgICAgLyoqCisgICAgICogVmFyaWFibGUgdG8gaG9sZCB0aGUgPGNvZGU+Z2V0U2l6ZSgpPC9jb2RlPiBwcmVwYXJlZCBzdGF0ZW1lbnQuCisgICAgICovCisgICAgcHJvdGVjdGVkIFByZXBhcmVkU3RhdGVtZW50IHByZXBhcmVkU2l6ZVNxbCA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBWYXJpYWJsZSB0byBob2xkIHRoZSA8Y29kZT5rZXlzKCk8L2NvZGU+IHByZXBhcmVkIHN0YXRlbWVudC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUHJlcGFyZWRTdGF0ZW1lbnQgcHJlcGFyZWRLZXlzU3FsID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFZhcmlhYmxlIHRvIGhvbGQgdGhlIDxjb2RlPnNhdmUoKTwvY29kZT4gcHJlcGFyZWQgc3RhdGVtZW50LgorICAgICAqLworICAgIHByb3RlY3RlZCBQcmVwYXJlZFN0YXRlbWVudCBwcmVwYXJlZFNhdmVTcWwgPSBudWxsOworCisgICAgLyoqCisgICAgICogVmFyaWFibGUgdG8gaG9sZCB0aGUgPGNvZGU+Y2xlYXIoKTwvY29kZT4gcHJlcGFyZWQgc3RhdGVtZW50LgorICAgICAqLworICAgIHByb3RlY3RlZCBQcmVwYXJlZFN0YXRlbWVudCBwcmVwYXJlZENsZWFyU3FsID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFZhcmlhYmxlIHRvIGhvbGQgdGhlIDxjb2RlPnJlbW92ZSgpPC9jb2RlPiBwcmVwYXJlZCBzdGF0ZW1lbnQuCisgICAgICovCisgICAgcHJvdGVjdGVkIFByZXBhcmVkU3RhdGVtZW50IHByZXBhcmVkUmVtb3ZlU3FsID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFZhcmlhYmxlIHRvIGhvbGQgdGhlIDxjb2RlPmxvYWQoKTwvY29kZT4gcHJlcGFyZWQgc3RhdGVtZW50LgorICAgICAqLworICAgIHByb3RlY3RlZCBQcmVwYXJlZFN0YXRlbWVudCBwcmVwYXJlZExvYWRTcWwgPSBudWxsOworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGluZm8gZm9yIHRoaXMgU3RvcmUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJbmZvKCkgeworICAgICAgICByZXR1cm4gKGluZm8pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbmFtZSBmb3IgdGhpcyBpbnN0YW5jZSAoYnVpbHQgZnJvbSBjb250YWluZXIgbmFtZSkKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIGlmIChuYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgIENvbnRhaW5lciBjb250YWluZXIgPSBtYW5hZ2VyLmdldENvbnRhaW5lcigpOworICAgICAgICAgICAgU3RyaW5nIGNvbnRleHROYW1lID0gY29udGFpbmVyLmdldE5hbWUoKTsKKyAgICAgICAgICAgIFN0cmluZyBob3N0TmFtZSA9ICIiOworICAgICAgICAgICAgU3RyaW5nIGVuZ2luZU5hbWUgPSAiIjsKKworICAgICAgICAgICAgaWYgKGNvbnRhaW5lci5nZXRQYXJlbnQoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgQ29udGFpbmVyIGhvc3QgPSBjb250YWluZXIuZ2V0UGFyZW50KCk7CisgICAgICAgICAgICAgICAgaG9zdE5hbWUgPSBob3N0LmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICBpZiAoaG9zdC5nZXRQYXJlbnQoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGVuZ2luZU5hbWUgPSBob3N0LmdldFBhcmVudCgpLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuYW1lID0gIi8iICsgZW5naW5lTmFtZSArICIvIiArIGhvc3ROYW1lICsgY29udGV4dE5hbWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB0aHJlYWQgbmFtZSBmb3IgdGhpcyBTdG9yZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFRocmVhZE5hbWUoKSB7CisgICAgICAgIHJldHVybiAodGhyZWFkTmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBuYW1lIGZvciB0aGlzIFN0b3JlLCB1c2VkIGZvciBsb2dnaW5nLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RvcmVOYW1lKCkgeworICAgICAgICByZXR1cm4gKHN0b3JlTmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBkcml2ZXIgZm9yIHRoaXMgU3RvcmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZHJpdmVyTmFtZSBUaGUgbmV3IGRyaXZlcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERyaXZlck5hbWUoU3RyaW5nIGRyaXZlck5hbWUpIHsKKyAgICAgICAgU3RyaW5nIG9sZERyaXZlck5hbWUgPSB0aGlzLmRyaXZlck5hbWU7CisgICAgICAgIHRoaXMuZHJpdmVyTmFtZSA9IGRyaXZlck5hbWU7CisgICAgICAgIHN1cHBvcnQuZmlyZVByb3BlcnR5Q2hhbmdlKCJkcml2ZXJOYW1lIiwKKyAgICAgICAgICAgICAgICBvbGREcml2ZXJOYW1lLAorICAgICAgICAgICAgICAgIHRoaXMuZHJpdmVyTmFtZSk7CisgICAgICAgIHRoaXMuZHJpdmVyTmFtZSA9IGRyaXZlck5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBkcml2ZXIgZm9yIHRoaXMgU3RvcmUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXREcml2ZXJOYW1lKCkgeworICAgICAgICByZXR1cm4gKHRoaXMuZHJpdmVyTmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB1c2VybmFtZSB0byB1c2UgdG8gY29ubmVjdCB0byB0aGUgZGF0YWJhc2UuCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbm5lY3Rpb25OYW1lKCkgeworICAgICAgICByZXR1cm4gY29ubmVjdGlvbk5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSB1c2VybmFtZSB0byB1c2UgdG8gY29ubmVjdCB0byB0aGUgZGF0YWJhc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbk5hbWUgVXNlcm5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb25uZWN0aW9uTmFtZShTdHJpbmcgY29ubmVjdGlvbk5hbWUpIHsKKyAgICAgICAgdGhpcy5jb25uZWN0aW9uTmFtZSA9IGNvbm5lY3Rpb25OYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcGFzc3dvcmQgdG8gdXNlIHRvIGNvbm5lY3QgdG8gdGhlIGRhdGFiYXNlLgorICAgICAqCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDb25uZWN0aW9uUGFzc3dvcmQoKSB7CisgICAgICAgIHJldHVybiBjb25uZWN0aW9uUGFzc3dvcmQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBwYXNzd29yZCB0byB1c2UgdG8gY29ubmVjdCB0byB0aGUgZGF0YWJhc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvblBhc3N3b3JkIFVzZXIgcGFzc3dvcmQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb25uZWN0aW9uUGFzc3dvcmQoU3RyaW5nIGNvbm5lY3Rpb25QYXNzd29yZCkgeworICAgICAgICB0aGlzLmNvbm5lY3Rpb25QYXNzd29yZCA9IGNvbm5lY3Rpb25QYXNzd29yZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIENvbm5lY3Rpb24gVVJMIGZvciB0aGlzIFN0b3JlLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25VUkwgVGhlIG5ldyBDb25uZWN0aW9uIFVSTAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbm5lY3Rpb25VUkwoU3RyaW5nIGNvbm5lY3Rpb25VUkwpIHsKKyAgICAgICAgU3RyaW5nIG9sZENvbm5TdHJpbmcgPSB0aGlzLmNvbm5lY3Rpb25VUkw7CisgICAgICAgIHRoaXMuY29ubmVjdGlvblVSTCA9IGNvbm5lY3Rpb25VUkw7CisgICAgICAgIHN1cHBvcnQuZmlyZVByb3BlcnR5Q2hhbmdlKCJjb25uZWN0aW9uVVJMIiwKKyAgICAgICAgICAgICAgICBvbGRDb25uU3RyaW5nLAorICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvblVSTCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBDb25uZWN0aW9uIFVSTCBmb3IgdGhpcyBTdG9yZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbm5lY3Rpb25VUkwoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5jb25uZWN0aW9uVVJMKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHRhYmxlIGZvciB0aGlzIFN0b3JlLgorICAgICAqCisgICAgICogQHBhcmFtIHNlc3Npb25UYWJsZSBUaGUgbmV3IHRhYmxlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2Vzc2lvblRhYmxlKFN0cmluZyBzZXNzaW9uVGFibGUpIHsKKyAgICAgICAgU3RyaW5nIG9sZFNlc3Npb25UYWJsZSA9IHRoaXMuc2Vzc2lvblRhYmxlOworICAgICAgICB0aGlzLnNlc3Npb25UYWJsZSA9IHNlc3Npb25UYWJsZTsKKyAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoInNlc3Npb25UYWJsZSIsCisgICAgICAgICAgICAgICAgb2xkU2Vzc2lvblRhYmxlLAorICAgICAgICAgICAgICAgIHRoaXMuc2Vzc2lvblRhYmxlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHRhYmxlIGZvciB0aGlzIFN0b3JlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2Vzc2lvblRhYmxlKCkgeworICAgICAgICByZXR1cm4gKHRoaXMuc2Vzc2lvblRhYmxlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIEFwcCBjb2x1bW4gZm9yIHRoZSB0YWJsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXNzaW9uQXBwQ29sIHRoZSBjb2x1bW4gbmFtZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNlc3Npb25BcHBDb2woU3RyaW5nIHNlc3Npb25BcHBDb2wpIHsKKyAgICAgICAgU3RyaW5nIG9sZFNlc3Npb25BcHBDb2wgPSB0aGlzLnNlc3Npb25BcHBDb2w7CisgICAgICAgIHRoaXMuc2Vzc2lvbkFwcENvbCA9IHNlc3Npb25BcHBDb2w7CisgICAgICAgIHN1cHBvcnQuZmlyZVByb3BlcnR5Q2hhbmdlKCJzZXNzaW9uQXBwQ29sIiwKKyAgICAgICAgICAgICAgICBvbGRTZXNzaW9uQXBwQ29sLAorICAgICAgICAgICAgICAgIHRoaXMuc2Vzc2lvbkFwcENvbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB3ZWIgYXBwbGljYXRpb24gbmFtZSBjb2x1bW4gZm9yIHRoZSB0YWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFNlc3Npb25BcHBDb2woKSB7CisgICAgICAgIHJldHVybiAodGhpcy5zZXNzaW9uQXBwQ29sKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIElkIGNvbHVtbiBmb3IgdGhlIHRhYmxlLgorICAgICAqCisgICAgICogQHBhcmFtIHNlc3Npb25JZENvbCB0aGUgY29sdW1uIG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTZXNzaW9uSWRDb2woU3RyaW5nIHNlc3Npb25JZENvbCkgeworICAgICAgICBTdHJpbmcgb2xkU2Vzc2lvbklkQ29sID0gdGhpcy5zZXNzaW9uSWRDb2w7CisgICAgICAgIHRoaXMuc2Vzc2lvbklkQ29sID0gc2Vzc2lvbklkQ29sOworICAgICAgICBzdXBwb3J0LmZpcmVQcm9wZXJ0eUNoYW5nZSgic2Vzc2lvbklkQ29sIiwKKyAgICAgICAgICAgICAgICBvbGRTZXNzaW9uSWRDb2wsCisgICAgICAgICAgICAgICAgdGhpcy5zZXNzaW9uSWRDb2wpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgSWQgY29sdW1uIGZvciB0aGUgdGFibGUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTZXNzaW9uSWRDb2woKSB7CisgICAgICAgIHJldHVybiAodGhpcy5zZXNzaW9uSWRDb2wpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgRGF0YSBjb2x1bW4gZm9yIHRoZSB0YWJsZQorICAgICAqCisgICAgICogQHBhcmFtIHNlc3Npb25EYXRhQ29sIHRoZSBjb2x1bW4gbmFtZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNlc3Npb25EYXRhQ29sKFN0cmluZyBzZXNzaW9uRGF0YUNvbCkgeworICAgICAgICBTdHJpbmcgb2xkU2Vzc2lvbkRhdGFDb2wgPSB0aGlzLnNlc3Npb25EYXRhQ29sOworICAgICAgICB0aGlzLnNlc3Npb25EYXRhQ29sID0gc2Vzc2lvbkRhdGFDb2w7CisgICAgICAgIHN1cHBvcnQuZmlyZVByb3BlcnR5Q2hhbmdlKCJzZXNzaW9uRGF0YUNvbCIsCisgICAgICAgICAgICAgICAgb2xkU2Vzc2lvbkRhdGFDb2wsCisgICAgICAgICAgICAgICAgdGhpcy5zZXNzaW9uRGF0YUNvbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBkYXRhIGNvbHVtbiBmb3IgdGhlIHRhYmxlCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTZXNzaW9uRGF0YUNvbCgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLnNlc3Npb25EYXRhQ29sKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIElzIFZhbGlkIGNvbHVtbiBmb3IgdGhlIHRhYmxlCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2Vzc2lvblZhbGlkQ29sIFRoZSBjb2x1bW4gbmFtZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNlc3Npb25WYWxpZENvbChTdHJpbmcgc2Vzc2lvblZhbGlkQ29sKSB7CisgICAgICAgIFN0cmluZyBvbGRTZXNzaW9uVmFsaWRDb2wgPSB0aGlzLnNlc3Npb25WYWxpZENvbDsKKyAgICAgICAgdGhpcy5zZXNzaW9uVmFsaWRDb2wgPSBzZXNzaW9uVmFsaWRDb2w7CisgICAgICAgIHN1cHBvcnQuZmlyZVByb3BlcnR5Q2hhbmdlKCJzZXNzaW9uVmFsaWRDb2wiLAorICAgICAgICAgICAgICAgIG9sZFNlc3Npb25WYWxpZENvbCwKKyAgICAgICAgICAgICAgICB0aGlzLnNlc3Npb25WYWxpZENvbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBJcyBWYWxpZCBjb2x1bW4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFNlc3Npb25WYWxpZENvbCgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLnNlc3Npb25WYWxpZENvbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBNYXggSW5hY3RpdmUgY29sdW1uIGZvciB0aGUgdGFibGUKKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXNzaW9uTWF4SW5hY3RpdmVDb2wgVGhlIGNvbHVtbiBuYW1lCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2Vzc2lvbk1heEluYWN0aXZlQ29sKFN0cmluZyBzZXNzaW9uTWF4SW5hY3RpdmVDb2wpIHsKKyAgICAgICAgU3RyaW5nIG9sZFNlc3Npb25NYXhJbmFjdGl2ZUNvbCA9IHRoaXMuc2Vzc2lvbk1heEluYWN0aXZlQ29sOworICAgICAgICB0aGlzLnNlc3Npb25NYXhJbmFjdGl2ZUNvbCA9IHNlc3Npb25NYXhJbmFjdGl2ZUNvbDsKKyAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoInNlc3Npb25NYXhJbmFjdGl2ZUNvbCIsCisgICAgICAgICAgICAgICAgb2xkU2Vzc2lvbk1heEluYWN0aXZlQ29sLAorICAgICAgICAgICAgICAgIHRoaXMuc2Vzc2lvbk1heEluYWN0aXZlQ29sKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIE1heCBJbmFjdGl2ZSBjb2x1bW4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFNlc3Npb25NYXhJbmFjdGl2ZUNvbCgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLnNlc3Npb25NYXhJbmFjdGl2ZUNvbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBMYXN0IEFjY2Vzc2VkIGNvbHVtbiBmb3IgdGhlIHRhYmxlCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2Vzc2lvbkxhc3RBY2Nlc3NlZENvbCBUaGUgY29sdW1uIG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTZXNzaW9uTGFzdEFjY2Vzc2VkQ29sKFN0cmluZyBzZXNzaW9uTGFzdEFjY2Vzc2VkQ29sKSB7CisgICAgICAgIFN0cmluZyBvbGRTZXNzaW9uTGFzdEFjY2Vzc2VkQ29sID0gdGhpcy5zZXNzaW9uTGFzdEFjY2Vzc2VkQ29sOworICAgICAgICB0aGlzLnNlc3Npb25MYXN0QWNjZXNzZWRDb2wgPSBzZXNzaW9uTGFzdEFjY2Vzc2VkQ29sOworICAgICAgICBzdXBwb3J0LmZpcmVQcm9wZXJ0eUNoYW5nZSgic2Vzc2lvbkxhc3RBY2Nlc3NlZENvbCIsCisgICAgICAgICAgICAgICAgb2xkU2Vzc2lvbkxhc3RBY2Nlc3NlZENvbCwKKyAgICAgICAgICAgICAgICB0aGlzLnNlc3Npb25MYXN0QWNjZXNzZWRDb2wpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgTGFzdCBBY2Nlc3NlZCBjb2x1bW4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFNlc3Npb25MYXN0QWNjZXNzZWRDb2woKSB7CisgICAgICAgIHJldHVybiAodGhpcy5zZXNzaW9uTGFzdEFjY2Vzc2VkQ29sKTsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworICAgIC8qKgorICAgICAqIFJldHVybiBhbiBhcnJheSBjb250YWluaW5nIHRoZSBzZXNzaW9uIGlkZW50aWZpZXJzIG9mIGFsbCBTZXNzaW9ucworICAgICAqIGN1cnJlbnRseSBzYXZlZCBpbiB0aGlzIFN0b3JlLiAgSWYgdGhlcmUgYXJlIG5vIHN1Y2ggU2Vzc2lvbnMsIGEKKyAgICAgKiB6ZXJvLWxlbmd0aCBhcnJheSBpcyByZXR1cm5lZC4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycmVkCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGtleXMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmcga2V5c1NxbCA9CisgICAgICAgICAgICAgICAgIlNFTEVDVCAiICsgc2Vzc2lvbklkQ29sICsgIiBGUk9NICIgKyBzZXNzaW9uVGFibGUgKworICAgICAgICAgICAgICAgICIgV0hFUkUgIiArIHNlc3Npb25BcHBDb2wgKyAiID0gPyI7CisgICAgICAgIFJlc3VsdFNldCByc3QgPSBudWxsOworICAgICAgICBTdHJpbmcga2V5c1tdID0gbnVsbDsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBpbnQgbnVtYmVyT2ZUcmllcyA9IDI7CisgICAgICAgICAgICB3aGlsZSAobnVtYmVyT2ZUcmllcyA+IDApIHsKKworICAgICAgICAgICAgICAgIENvbm5lY3Rpb24gX2Nvbm4gPSBnZXRDb25uZWN0aW9uKCk7CisgICAgICAgICAgICAgICAgaWYgKF9jb25uID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChuZXcgU3RyaW5nWzBdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByZXBhcmVkS2V5c1NxbCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmVwYXJlZEtleXNTcWwgPSBfY29ubi5wcmVwYXJlU3RhdGVtZW50KGtleXNTcWwpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcHJlcGFyZWRLZXlzU3FsLnNldFN0cmluZygxLCBnZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICByc3QgPSBwcmVwYXJlZEtleXNTcWwuZXhlY3V0ZVF1ZXJ5KCk7CisgICAgICAgICAgICAgICAgICAgIEFycmF5TGlzdCB0bXBrZXlzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICAgICAgICAgICAgICBpZiAocnN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChyc3QubmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wa2V5cy5hZGQocnN0LmdldFN0cmluZygxKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAga2V5cyA9IChTdHJpbmdbXSkgdG1wa2V5cy50b0FycmF5KG5ldyBTdHJpbmdbdG1wa2V5cy5zaXplKCldKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBtYW5hZ2VyLmdldENvbnRhaW5lcigpLmdldExvZ2dlcigpLmVycm9yKHNtLmdldFN0cmluZyhnZXRTdG9yZU5hbWUoKSArICIuU1FMRXhjZXB0aW9uIiwgZSkpOworICAgICAgICAgICAgICAgICAgICBrZXlzID0gbmV3IFN0cmluZ1swXTsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ2xvc2UgdGhlIGNvbm5lY3Rpb24gc28gdGhhdCBpdCBnZXRzIHJlb3BlbmVkIG5leHQgdGltZQorICAgICAgICAgICAgICAgICAgICBpZiAoZGJDb25uZWN0aW9uICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZShkYkNvbm5lY3Rpb24pOworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocnN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByc3QuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHJlbGVhc2UoX2Nvbm4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBudW1iZXJPZlRyaWVzLS07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKGtleXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhbiBpbnRlZ2VyIGNvbnRhaW5pbmcgYSBjb3VudCBvZiBhbGwgU2Vzc2lvbnMKKyAgICAgKiBjdXJyZW50bHkgc2F2ZWQgaW4gdGhpcyBTdG9yZS4gIElmIHRoZXJlIGFyZSBubyBTZXNzaW9ucywKKyAgICAgKiA8Y29kZT4wPC9jb2RlPiBpcyByZXR1cm5lZC4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycmVkCisgICAgICovCisgICAgcHVibGljIGludCBnZXRTaXplKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaW50IHNpemUgPSAwOworICAgICAgICBTdHJpbmcgc2l6ZVNxbCA9CisgICAgICAgICAgICAgICAgIlNFTEVDVCBDT1VOVCgiICsgc2Vzc2lvbklkQ29sICsgIikgRlJPTSAiICsgc2Vzc2lvblRhYmxlICsKKyAgICAgICAgICAgICAgICAiIFdIRVJFICIgKyBzZXNzaW9uQXBwQ29sICsgIiA9ID8iOworICAgICAgICBSZXN1bHRTZXQgcnN0ID0gbnVsbDsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGludCBudW1iZXJPZlRyaWVzID0gMjsKKyAgICAgICAgICAgIHdoaWxlIChudW1iZXJPZlRyaWVzID4gMCkgeworICAgICAgICAgICAgICAgIENvbm5lY3Rpb24gX2Nvbm4gPSBnZXRDb25uZWN0aW9uKCk7CisKKyAgICAgICAgICAgICAgICBpZiAoX2Nvbm4gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHNpemUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwcmVwYXJlZFNpemVTcWwgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJlcGFyZWRTaXplU3FsID0gX2Nvbm4ucHJlcGFyZVN0YXRlbWVudChzaXplU3FsKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHByZXBhcmVkU2l6ZVNxbC5zZXRTdHJpbmcoMSwgZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgcnN0ID0gcHJlcGFyZWRTaXplU3FsLmV4ZWN1dGVRdWVyeSgpOworICAgICAgICAgICAgICAgICAgICBpZiAocnN0Lm5leHQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IHJzdC5nZXRJbnQoMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBtYW5hZ2VyLmdldENvbnRhaW5lcigpLmdldExvZ2dlcigpLmVycm9yKHNtLmdldFN0cmluZyhnZXRTdG9yZU5hbWUoKSArICIuU1FMRXhjZXB0aW9uIiwgZSkpOworICAgICAgICAgICAgICAgICAgICBpZiAoZGJDb25uZWN0aW9uICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZShkYkNvbm5lY3Rpb24pOworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocnN0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnN0LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICByZWxlYXNlKF9jb25uKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbnVtYmVyT2ZUcmllcy0tOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAoc2l6ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9hZCB0aGUgU2Vzc2lvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGlkIDxjb2RlPmlkPC9jb2RlPi4KKyAgICAgKiBJZiBubyBzdWNoIHNlc3Npb24gaXMgZm91bmQgPGNvZGU+bnVsbDwvY29kZT4gaXMgcmV0dXJuZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaWQgYSB2YWx1ZSBvZiB0eXBlIDxjb2RlPlN0cmluZzwvY29kZT4KKyAgICAgKiBAcmV0dXJuIHRoZSBzdG9yZWQgPGNvZGU+U2Vzc2lvbjwvY29kZT4KKyAgICAgKiBAZXhjZXB0aW9uIENsYXNzTm90Rm91bmRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgU2Vzc2lvbiBsb2FkKFN0cmluZyBpZCkKKyAgICAgICAgICAgIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFJlc3VsdFNldCByc3QgPSBudWxsOworICAgICAgICBTdGFuZGFyZFNlc3Npb24gX3Nlc3Npb24gPSBudWxsOworICAgICAgICBMb2FkZXIgbG9hZGVyID0gbnVsbDsKKyAgICAgICAgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIgPSBudWxsOworICAgICAgICBPYmplY3RJbnB1dFN0cmVhbSBvaXMgPSBudWxsOworICAgICAgICBCdWZmZXJlZElucHV0U3RyZWFtIGJpcyA9IG51bGw7CisgICAgICAgIENvbnRhaW5lciBjb250YWluZXIgPSBtYW5hZ2VyLmdldENvbnRhaW5lcigpOworICAgICAgICBTdHJpbmcgbG9hZFNxbCA9CisgICAgICAgICAgICAgICAgIlNFTEVDVCAiICsgc2Vzc2lvbklkQ29sICsgIiwgIiArIHNlc3Npb25EYXRhQ29sICsgIiBGUk9NICIgKworICAgICAgICAgICAgICAgIHNlc3Npb25UYWJsZSArICIgV0hFUkUgIiArIHNlc3Npb25JZENvbCArICIgPSA/IEFORCAiICsKKyAgICAgICAgICAgICAgICBzZXNzaW9uQXBwQ29sICsgIiA9ID8iOworCisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgaW50IG51bWJlck9mVHJpZXMgPSAyOworICAgICAgICAgICAgd2hpbGUgKG51bWJlck9mVHJpZXMgPiAwKSB7CisgICAgICAgICAgICAgICAgQ29ubmVjdGlvbiBfY29ubiA9IGdldENvbm5lY3Rpb24oKTsKKyAgICAgICAgICAgICAgICBpZiAoX2Nvbm4gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwcmVwYXJlZExvYWRTcWwgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJlcGFyZWRMb2FkU3FsID0gX2Nvbm4ucHJlcGFyZVN0YXRlbWVudChsb2FkU3FsKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHByZXBhcmVkTG9hZFNxbC5zZXRTdHJpbmcoMSwgaWQpOworICAgICAgICAgICAgICAgICAgICBwcmVwYXJlZExvYWRTcWwuc2V0U3RyaW5nKDIsIGdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIHJzdCA9IHByZXBhcmVkTG9hZFNxbC5leGVjdXRlUXVlcnkoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJzdC5uZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJpcyA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKHJzdC5nZXRCaW5hcnlTdHJlYW0oMikpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGFpbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZXIgPSBjb250YWluZXIuZ2V0TG9hZGVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9hZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc0xvYWRlciA9IGxvYWRlci5nZXRDbGFzc0xvYWRlcigpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsYXNzTG9hZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvaXMgPSBuZXcgQ3VzdG9tT2JqZWN0SW5wdXRTdHJlYW0oYmlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NMb2FkZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvaXMgPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0oYmlzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hbmFnZXIuZ2V0Q29udGFpbmVyKCkuZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZXIuZ2V0Q29udGFpbmVyKCkuZ2V0TG9nZ2VyKCkuZGVidWcoc20uZ2V0U3RyaW5nKGdldFN0b3JlTmFtZSgpICsgIi5sb2FkaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLCBzZXNzaW9uVGFibGUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgX3Nlc3Npb24gPSAoU3RhbmRhcmRTZXNzaW9uKSBtYW5hZ2VyLmNyZWF0ZUVtcHR5U2Vzc2lvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgX3Nlc3Npb24ucmVhZE9iamVjdERhdGEob2lzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9zZXNzaW9uLnNldE1hbmFnZXIobWFuYWdlcik7CisKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtYW5hZ2VyLmdldENvbnRhaW5lcigpLmdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZXIuZ2V0Q29udGFpbmVyKCkuZ2V0TG9nZ2VyKCkuZGVidWcoZ2V0U3RvcmVOYW1lKCkgKyAiOiBObyBwZXJzaXN0ZWQgZGF0YSBvYmplY3QgZm91bmQiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIG1hbmFnZXIuZ2V0Q29udGFpbmVyKCkuZ2V0TG9nZ2VyKCkuZXJyb3Ioc20uZ2V0U3RyaW5nKGdldFN0b3JlTmFtZSgpICsgIi5TUUxFeGNlcHRpb24iLCBlKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChkYkNvbm5lY3Rpb24gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlKGRiQ29ubmVjdGlvbik7CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJzdC5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChvaXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvaXMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmVsZWFzZShfY29ubik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG51bWJlck9mVHJpZXMtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAoX3Nlc3Npb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGUgU2Vzc2lvbiB3aXRoIHRoZSBzcGVjaWZpZWQgc2Vzc2lvbiBpZGVudGlmaWVyIGZyb20KKyAgICAgKiB0aGlzIFN0b3JlLCBpZiBwcmVzZW50LiAgSWYgbm8gc3VjaCBTZXNzaW9uIGlzIHByZXNlbnQsIHRoaXMgbWV0aG9kCisgICAgICogdGFrZXMgbm8gYWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGlkIFNlc3Npb24gaWRlbnRpZmllciBvZiB0aGUgU2Vzc2lvbiB0byBiZSByZW1vdmVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmUoU3RyaW5nIGlkKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmcgcmVtb3ZlU3FsID0KKyAgICAgICAgICAgICAgICAiREVMRVRFIEZST00gIiArIHNlc3Npb25UYWJsZSArICIgV0hFUkUgIiArIHNlc3Npb25JZENvbCArCisgICAgICAgICAgICAgICAgIiA9ID8gIEFORCAiICsgc2Vzc2lvbkFwcENvbCArICIgPSA/IjsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGludCBudW1iZXJPZlRyaWVzID0gMjsKKyAgICAgICAgICAgIHdoaWxlIChudW1iZXJPZlRyaWVzID4gMCkgeworICAgICAgICAgICAgICAgIENvbm5lY3Rpb24gX2Nvbm4gPSBnZXRDb25uZWN0aW9uKCk7CisKKyAgICAgICAgICAgICAgICBpZiAoX2Nvbm4gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByZXBhcmVkUmVtb3ZlU3FsID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZXBhcmVkUmVtb3ZlU3FsID0gX2Nvbm4ucHJlcGFyZVN0YXRlbWVudChyZW1vdmVTcWwpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcHJlcGFyZWRSZW1vdmVTcWwuc2V0U3RyaW5nKDEsIGlkKTsKKyAgICAgICAgICAgICAgICAgICAgcHJlcGFyZWRSZW1vdmVTcWwuc2V0U3RyaW5nKDIsIGdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIHByZXBhcmVkUmVtb3ZlU3FsLmV4ZWN1dGUoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBtYW5hZ2VyLmdldENvbnRhaW5lcigpLmdldExvZ2dlcigpLmVycm9yKHNtLmdldFN0cmluZyhnZXRTdG9yZU5hbWUoKSArICIuU1FMRXhjZXB0aW9uIiwgZSkpOworICAgICAgICAgICAgICAgICAgICBpZiAoZGJDb25uZWN0aW9uICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZShkYkNvbm5lY3Rpb24pOworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIHJlbGVhc2UoX2Nvbm4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBudW1iZXJPZlRyaWVzLS07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAobWFuYWdlci5nZXRDb250YWluZXIoKS5nZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICBtYW5hZ2VyLmdldENvbnRhaW5lcigpLmdldExvZ2dlcigpLmRlYnVnKHNtLmdldFN0cmluZyhnZXRTdG9yZU5hbWUoKSArICIucmVtb3ZpbmciLCBpZCwgc2Vzc2lvblRhYmxlKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYWxsIG9mIHRoZSBTZXNzaW9ucyBpbiB0aGlzIFN0b3JlLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xlYXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmcgY2xlYXJTcWwgPQorICAgICAgICAgICAgICAgICJERUxFVEUgRlJPTSAiICsgc2Vzc2lvblRhYmxlICsgIiBXSEVSRSAiICsgc2Vzc2lvbkFwcENvbCArICIgPSA/IjsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGludCBudW1iZXJPZlRyaWVzID0gMjsKKyAgICAgICAgICAgIHdoaWxlIChudW1iZXJPZlRyaWVzID4gMCkgeworICAgICAgICAgICAgICAgIENvbm5lY3Rpb24gX2Nvbm4gPSBnZXRDb25uZWN0aW9uKCk7CisgICAgICAgICAgICAgICAgaWYgKF9jb25uID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwcmVwYXJlZENsZWFyU3FsID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZXBhcmVkQ2xlYXJTcWwgPSBfY29ubi5wcmVwYXJlU3RhdGVtZW50KGNsZWFyU3FsKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHByZXBhcmVkQ2xlYXJTcWwuc2V0U3RyaW5nKDEsIGdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIHByZXBhcmVkQ2xlYXJTcWwuZXhlY3V0ZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIG1hbmFnZXIuZ2V0Q29udGFpbmVyKCkuZ2V0TG9nZ2VyKCkuZXJyb3Ioc20uZ2V0U3RyaW5nKGdldFN0b3JlTmFtZSgpICsgIi5TUUxFeGNlcHRpb24iLCBlKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChkYkNvbm5lY3Rpb24gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlKGRiQ29ubmVjdGlvbik7CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgcmVsZWFzZShfY29ubik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG51bWJlck9mVHJpZXMtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNhdmUgYSBzZXNzaW9uIHRvIHRoZSBTdG9yZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXNzaW9uIHRoZSBzZXNzaW9uIHRvIGJlIHN0b3JlZAorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNhdmUoU2Vzc2lvbiBzZXNzaW9uKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmcgc2F2ZVNxbCA9CisgICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPICIgKyBzZXNzaW9uVGFibGUgKyAiICgiICsgc2Vzc2lvbklkQ29sICsgIiwgIiArCisgICAgICAgICAgICAgICAgc2Vzc2lvbkFwcENvbCArICIsICIgKworICAgICAgICAgICAgICAgIHNlc3Npb25EYXRhQ29sICsgIiwgIiArCisgICAgICAgICAgICAgICAgc2Vzc2lvblZhbGlkQ29sICsgIiwgIiArCisgICAgICAgICAgICAgICAgc2Vzc2lvbk1heEluYWN0aXZlQ29sICsgIiwgIiArCisgICAgICAgICAgICAgICAgc2Vzc2lvbkxhc3RBY2Nlc3NlZENvbCArICIpIFZBTFVFUyAoPywgPywgPywgPywgPywgPykiOworICAgICAgICBPYmplY3RPdXRwdXRTdHJlYW0gb29zID0gbnVsbDsKKyAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJvcyA9IG51bGw7CisgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGJpcyA9IG51bGw7CisgICAgICAgIElucHV0U3RyZWFtIGluID0gbnVsbDsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGludCBudW1iZXJPZlRyaWVzID0gMjsKKyAgICAgICAgICAgIHdoaWxlIChudW1iZXJPZlRyaWVzID4gMCkgeworICAgICAgICAgICAgICAgIENvbm5lY3Rpb24gX2Nvbm4gPSBnZXRDb25uZWN0aW9uKCk7CisgICAgICAgICAgICAgICAgaWYgKF9jb25uID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIElmIHNlc3Npb25zIGFscmVhZHkgZXhpc3QgaW4gREIsIHJlbW92ZSBhbmQgaW5zZXJ0IGFnYWluLgorICAgICAgICAgICAgICAgIC8vIFRPRE86CisgICAgICAgICAgICAgICAgLy8gKiBDaGVjayBpZiBJRCBleGlzdHMgaW4gZGF0YWJhc2UgYW5kIGlmIHNvIHVzZSBVUERBVEUuCisgICAgICAgICAgICAgICAgcmVtb3ZlKHNlc3Npb24uZ2V0SWQoKSk7CisKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBib3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgICAgICAgICAgICAgIG9vcyA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0obmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKGJvcykpOworCisgICAgICAgICAgICAgICAgICAgICgoU3RhbmRhcmRTZXNzaW9uKSBzZXNzaW9uKS53cml0ZU9iamVjdERhdGEob29zKTsKKyAgICAgICAgICAgICAgICAgICAgb29zLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIG9vcyA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBvYnMgPSBib3MudG9CeXRlQXJyYXkoKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IHNpemUgPSBvYnMubGVuZ3RoOworICAgICAgICAgICAgICAgICAgICBiaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob2JzLCAwLCBzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgaW4gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShiaXMsIHNpemUpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChwcmVwYXJlZFNhdmVTcWwgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJlcGFyZWRTYXZlU3FsID0gX2Nvbm4ucHJlcGFyZVN0YXRlbWVudChzYXZlU3FsKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHByZXBhcmVkU2F2ZVNxbC5zZXRTdHJpbmcoMSwgc2Vzc2lvbi5nZXRJZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgcHJlcGFyZWRTYXZlU3FsLnNldFN0cmluZygyLCBnZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICBwcmVwYXJlZFNhdmVTcWwuc2V0QmluYXJ5U3RyZWFtKDMsIGluLCBzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgcHJlcGFyZWRTYXZlU3FsLnNldFN0cmluZyg0LCBzZXNzaW9uLmlzVmFsaWQoKSA/ICIxIiA6ICIwIik7CisgICAgICAgICAgICAgICAgICAgIHByZXBhcmVkU2F2ZVNxbC5zZXRJbnQoNSwgc2Vzc2lvbi5nZXRNYXhJbmFjdGl2ZUludGVydmFsKCkpOworICAgICAgICAgICAgICAgICAgICBwcmVwYXJlZFNhdmVTcWwuc2V0TG9uZyg2LCBzZXNzaW9uLmdldExhc3RBY2Nlc3NlZFRpbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIHByZXBhcmVkU2F2ZVNxbC5leGVjdXRlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgbWFuYWdlci5nZXRDb250YWluZXIoKS5nZXRMb2dnZXIoKS5lcnJvcihzbS5nZXRTdHJpbmcoZ2V0U3RvcmVOYW1lKCkgKyAiLlNRTEV4Y2VwdGlvbiIsIGUpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRiQ29ubmVjdGlvbiAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2UoZGJDb25uZWN0aW9uKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICBpZiAob29zICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9vcy5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChiaXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYmlzLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGluICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICByZWxlYXNlKF9jb25uKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbnVtYmVyT2ZUcmllcy0tOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKG1hbmFnZXIuZ2V0Q29udGFpbmVyKCkuZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgbWFuYWdlci5nZXRDb250YWluZXIoKS5nZXRMb2dnZXIoKS5kZWJ1ZyhzbS5nZXRTdHJpbmcoZ2V0U3RvcmVOYW1lKCkgKyAiLnNhdmluZyIsCisgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0SWQoKSwgc2Vzc2lvblRhYmxlKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvdGVjdGVkIE1ldGhvZHMKKworICAgIC8qKgorICAgICAqIENoZWNrIHRoZSBjb25uZWN0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHN0b3JlLCBpZiBpdCdzCisgICAgICogPGNvZGU+bnVsbDwvY29kZT4gb3IgY2xvc2VkIHRyeSB0byByZW9wZW4gaXQuCisgICAgICogUmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgY29ubmVjdGlvbiBjb3VsZCBub3QgYmUgZXN0YWJsaXNoZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIDxjb2RlPkNvbm5lY3Rpb248L2NvZGU+IGlmIHRoZSBjb25uZWN0aW9uIHN1Y2VlZGVkCisgICAgICovCisgICAgcHJvdGVjdGVkIENvbm5lY3Rpb24gZ2V0Q29ubmVjdGlvbigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChkYkNvbm5lY3Rpb24gPT0gbnVsbCB8fCBkYkNvbm5lY3Rpb24uaXNDbG9zZWQoKSkgeworICAgICAgICAgICAgICAgIG1hbmFnZXIuZ2V0Q29udGFpbmVyKCkuZ2V0TG9nZ2VyKCkuaW5mbyhzbS5nZXRTdHJpbmcoZ2V0U3RvcmVOYW1lKCkgKyAiLmNoZWNrQ29ubmVjdGlvbkRCQ2xvc2VkIikpOworICAgICAgICAgICAgICAgIG9wZW4oKTsKKyAgICAgICAgICAgICAgICBpZiAoZGJDb25uZWN0aW9uID09IG51bGwgfHwgZGJDb25uZWN0aW9uLmlzQ2xvc2VkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbWFuYWdlci5nZXRDb250YWluZXIoKS5nZXRMb2dnZXIoKS5pbmZvKHNtLmdldFN0cmluZyhnZXRTdG9yZU5hbWUoKSArICIuY2hlY2tDb25uZWN0aW9uREJSZU9wZW5GYWlsIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBtYW5hZ2VyLmdldENvbnRhaW5lcigpLmdldExvZ2dlcigpLmVycm9yKHNtLmdldFN0cmluZyhnZXRTdG9yZU5hbWUoKSArICIuY2hlY2tDb25uZWN0aW9uU1FMRXhjZXB0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgZXgudG9TdHJpbmcoKSkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGRiQ29ubmVjdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPcGVuIChpZiBuZWNlc3NhcnkpIGFuZCByZXR1cm4gYSBkYXRhYmFzZSBjb25uZWN0aW9uIGZvciB1c2UgYnkKKyAgICAgKiB0aGlzIFJlYWxtLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBTUUxFeGNlcHRpb24gaWYgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ29ubmVjdGlvbiBvcGVuKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gRG8gbm90aGluZyBpZiB0aGVyZSBpcyBhIGRhdGFiYXNlIGNvbm5lY3Rpb24gYWxyZWFkeSBvcGVuCisgICAgICAgIGlmIChkYkNvbm5lY3Rpb24gIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAoZGJDb25uZWN0aW9uKTsKKworICAgICAgICAvLyBJbnN0YW50aWF0ZSBvdXIgZGF0YWJhc2UgZHJpdmVyIGlmIG5lY2Vzc2FyeQorICAgICAgICBpZiAoZHJpdmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgQ2xhc3MgY2xhenogPSBDbGFzcy5mb3JOYW1lKGRyaXZlck5hbWUpOworICAgICAgICAgICAgICAgIGRyaXZlciA9IChEcml2ZXIpIGNsYXp6Lm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgbWFuYWdlci5nZXRDb250YWluZXIoKS5nZXRMb2dnZXIoKS5lcnJvcihzbS5nZXRTdHJpbmcoZ2V0U3RvcmVOYW1lKCkgKyAiLmNoZWNrQ29ubmVjdGlvbkNsYXNzTm90Rm91bmRFeGNlcHRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgZXgudG9TdHJpbmcoKSkpOworICAgICAgICAgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIG1hbmFnZXIuZ2V0Q29udGFpbmVyKCkuZ2V0TG9nZ2VyKCkuZXJyb3Ioc20uZ2V0U3RyaW5nKGdldFN0b3JlTmFtZSgpICsgIi5jaGVja0Nvbm5lY3Rpb25DbGFzc05vdEZvdW5kRXhjZXB0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4LnRvU3RyaW5nKCkpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICBtYW5hZ2VyLmdldENvbnRhaW5lcigpLmdldExvZ2dlcigpLmVycm9yKHNtLmdldFN0cmluZyhnZXRTdG9yZU5hbWUoKSArICIuY2hlY2tDb25uZWN0aW9uQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBleC50b1N0cmluZygpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBPcGVuIGEgbmV3IGNvbm5lY3Rpb24KKyAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgIGlmIChjb25uZWN0aW9uTmFtZSAhPSBudWxsKQorICAgICAgICAgICAgcHJvcHMucHV0KCJ1c2VyIiwgY29ubmVjdGlvbk5hbWUpOworICAgICAgICBpZiAoY29ubmVjdGlvblBhc3N3b3JkICE9IG51bGwpCisgICAgICAgICAgICBwcm9wcy5wdXQoInBhc3N3b3JkIiwgY29ubmVjdGlvblBhc3N3b3JkKTsKKyAgICAgICAgZGJDb25uZWN0aW9uID0gZHJpdmVyLmNvbm5lY3QoY29ubmVjdGlvblVSTCwgcHJvcHMpOworICAgICAgICBkYkNvbm5lY3Rpb24uc2V0QXV0b0NvbW1pdCh0cnVlKTsKKyAgICAgICAgcmV0dXJuIChkYkNvbm5lY3Rpb24pOworCisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvc2UgdGhlIHNwZWNpZmllZCBkYXRhYmFzZSBjb25uZWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGRiQ29ubmVjdGlvbiBUaGUgY29ubmVjdGlvbiB0byBiZSBjbG9zZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBjbG9zZShDb25uZWN0aW9uIGRiQ29ubmVjdGlvbikgeworCisgICAgICAgIC8vIERvIG5vdGhpbmcgaWYgdGhlIGRhdGFiYXNlIGNvbm5lY3Rpb24gaXMgYWxyZWFkeSBjbG9zZWQKKyAgICAgICAgaWYgKGRiQ29ubmVjdGlvbiA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8vIENsb3NlIG91ciBwcmVwYXJlZCBzdGF0ZW1lbnRzIChpZiBhbnkpCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwcmVwYXJlZFNpemVTcWwuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGYpIHsKKyAgICAgICAgICAgIDsKKyAgICAgICAgfQorICAgICAgICB0aGlzLnByZXBhcmVkU2l6ZVNxbCA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByZXBhcmVkS2V5c1NxbC5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZikgeworICAgICAgICAgICAgOworICAgICAgICB9CisgICAgICAgIHRoaXMucHJlcGFyZWRLZXlzU3FsID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJlcGFyZWRTYXZlU3FsLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBmKSB7CisgICAgICAgICAgICA7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5wcmVwYXJlZFNhdmVTcWwgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwcmVwYXJlZENsZWFyU3FsLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBmKSB7CisgICAgICAgICAgICA7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5wcmVwYXJlZENsZWFyU3FsID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJlcGFyZWRSZW1vdmVTcWwuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGYpIHsKKyAgICAgICAgICAgIDsKKyAgICAgICAgfQorICAgICAgICB0aGlzLnByZXBhcmVkUmVtb3ZlU3FsID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJlcGFyZWRMb2FkU3FsLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBmKSB7CisgICAgICAgICAgICA7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5wcmVwYXJlZExvYWRTcWwgPSBudWxsOworCisgICAgICAgIC8vIENsb3NlIHRoaXMgZGF0YWJhc2UgY29ubmVjdGlvbiwgYW5kIGxvZyBhbnkgZXJyb3JzCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBkYkNvbm5lY3Rpb24uY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIG1hbmFnZXIuZ2V0Q29udGFpbmVyKCkuZ2V0TG9nZ2VyKCkuZXJyb3Ioc20uZ2V0U3RyaW5nKGdldFN0b3JlTmFtZSgpICsgIi5jbG9zZSIsIGUudG9TdHJpbmcoKSkpOyAvLyBKdXN0IGxvZyBpdCBoZXJlCisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB0aGlzLmRiQ29ubmVjdGlvbiA9IG51bGw7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbGVhc2UgdGhlIGNvbm5lY3Rpb24sIG5vdCBuZWVkZWQgaGVyZSBzaW5jZSB0aGUKKyAgICAgKiBjb25uZWN0aW9uIGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggYSBjb25uZWN0aW9uIHBvb2wuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubiBUaGUgY29ubmVjdGlvbiB0byBiZSByZWxlYXNlZAorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHJlbGVhc2UoQ29ubmVjdGlvbiBjb25uKSB7CisgICAgICAgIDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgb25jZSB3aGVuIHRoaXMgU3RvcmUgaXMgZmlyc3Qgc3RhcnRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb24geworICAgICAgICBzdXBlci5zdGFydCgpOworCisgICAgICAgIC8vIE9wZW4gY29ubmVjdGlvbiB0byB0aGUgZGF0YWJhc2UKKyAgICAgICAgdGhpcy5kYkNvbm5lY3Rpb24gPSBnZXRDb25uZWN0aW9uKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR3JhY2VmdWxseSB0ZXJtaW5hdGUgZXZlcnl0aGluZyBhc3NvY2lhdGVkIHdpdGggb3VyIGRiLgorICAgICAqIENhbGxlZCBvbmNlIHdoZW4gdGhpcyBTdG9yZSBpcyBzdG9waW5nLgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcCgpIHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb24geworICAgICAgICBzdXBlci5zdG9wKCk7CisKKyAgICAgICAgLy8gQ2xvc2UgYW5kIHJlbGVhc2UgZXZlcnl0aGluZyBhc3NvY2lhdGVkIHdpdGggb3VyIGRiLgorICAgICAgICBpZiAoZGJDb25uZWN0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZGJDb25uZWN0aW9uLmNvbW1pdCgpOworICAgICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjbG9zZShkYkNvbm5lY3Rpb24pOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3Nlc3Npb24vTG9jYWxTdHJpbmdzLnByb3BlcnRpZXMgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc2Vzc2lvbi9Mb2NhbFN0cmluZ3MucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDRlYzVkCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3Nlc3Npb24vTG9jYWxTdHJpbmdzLnByb3BlcnRpZXMKQEAgLTAsMCArMSw2NiBAQAorYXBwbGljYXRpb25TZXNzaW9uLnNlc3Npb24uaXNlPWludmFsaWQgc2Vzc2lvbiBzdGF0ZQorYXBwbGljYXRpb25TZXNzaW9uLnZhbHVlLmlhZT1udWxsIHZhbHVlCitmaWxlU3RvcmUuYWxyZWFkeVN0YXJ0ZWQ9RmlsZSBTdG9yZSBoYXMgYWxyZWFkeSBiZWVuIHN0YXJ0ZWQKK2ZpbGVTdG9yZS5ub3RTdGFydGVkPUZpbGUgU3RvcmUgaGFzIG5vdCB5ZXQgYmVlbiBzdGFydGVkCitmaWxlU3RvcmUuc2F2aW5nPVNhdmluZyBTZXNzaW9uIHswfSB0byBmaWxlIHsxfQorZmlsZVN0b3JlLmxvYWRpbmc9TG9hZGluZyBTZXNzaW9uIHswfSBmcm9tIGZpbGUgezF9CitmaWxlU3RvcmUucmVtb3Zpbmc9UmVtb3ZpbmcgU2Vzc2lvbiB7MH0gYXQgZmlsZSB7MX0KK0pEQkNTdG9yZS5hbHJlYWR5U3RhcnRlZD1KREJDIFN0b3JlIGhhcyBhbHJlYWR5IGJlZW4gc3RhcnRlZAorSkRCQ1N0b3JlLmNsb3NlPUV4Y2VwdGlvbiBjbG9zaW5nIGRhdGFiYXNlIGNvbm5lY3Rpb24gezB9CitKREJDU3RvcmUubm90U3RhcnRlZD1KREJDIFN0b3JlIGhhcyBub3QgeWV0IGJlZW4gc3RhcnRlZAorSkRCQ1N0b3JlLnNhdmluZz1TYXZpbmcgU2Vzc2lvbiB7MH0gdG8gZGF0YWJhc2UgezF9CitKREJDU3RvcmUubG9hZGluZz1Mb2FkaW5nIFNlc3Npb24gezB9IGZyb20gZGF0YWJhc2UgezF9CitKREJDU3RvcmUucmVtb3Zpbmc9UmVtb3ZpbmcgU2Vzc2lvbiB7MH0gYXQgZGF0YWJhc2UgezF9CitKREJDU3RvcmUuU1FMRXhjZXB0aW9uPVNRTCBFcnJvciB7MH0KK0pEQkNTdG9yZS5jaGVja0Nvbm5lY3Rpb25EQkNsb3NlZD1UaGUgZGF0YWJhc2UgY29ubmVjdGlvbiBpcyBudWxsIG9yIHdhcyBmb3VuZCB0byBiZSBjbG9zZWQuIFRyeWluZyB0byByZS1vcGVuIGl0LgorSkRCQ1N0b3JlLmNoZWNrQ29ubmVjdGlvbkRCUmVPcGVuRmFpbD1UaGUgcmUtb3BlbiBvbiB0aGUgZGF0YWJhc2UgZmFpbGVkLiBUaGUgZGF0YWJhc2UgY291bGQgYmUgZG93bi4KK0pEQkNTdG9yZS5jaGVja0Nvbm5lY3Rpb25TUUxFeGNlcHRpb249QSBTUUwgZXhjZXB0aW9uIG9jY3VycmVkIHswfQorSkRCQ1N0b3JlLmNoZWNrQ29ubmVjdGlvbkNsYXNzTm90Rm91bmRFeGNlcHRpb249SkRCQyBkcml2ZXIgY2xhc3Mgbm90IGZvdW5kIHswfQorbWFuYWdlckJhc2UuY29tcGxldGU9U2VlZGluZyBvZiByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBoYXMgYmVlbiBjb21wbGV0ZWQKK21hbmFnZXJCYXNlLmdldHRpbmc9R2V0dGluZyBtZXNzYWdlIGRpZ2VzdCBjb21wb25lbnQgZm9yIGFsZ29yaXRobSB7MH0KK21hbmFnZXJCYXNlLmdvdHRlbj1Db21wbGV0ZWQgZ2V0dGluZyBtZXNzYWdlIGRpZ2VzdCBjb21wb25lbnQKK21hbmFnZXJCYXNlLnJhbmRvbT1FeGNlcHRpb24gaW5pdGlhbGl6aW5nIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIG9mIGNsYXNzIHswfQorbWFuYWdlckJhc2Uuc2VlZGluZz1TZWVkaW5nIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGNsYXNzIHswfQorc2VydmVyU2Vzc2lvbi52YWx1ZS5pYWU9bnVsbCB2YWx1ZQorc3RhbmRhcmRNYW5hZ2VyLmFscmVhZHlTdGFydGVkPU1hbmFnZXIgaGFzIGFscmVhZHkgYmVlbiBzdGFydGVkCitzdGFuZGFyZE1hbmFnZXIuY3JlYXRlU2Vzc2lvbi5pc2U9Y3JlYXRlU2Vzc2lvbjogVG9vIG1hbnkgYWN0aXZlIHNlc3Npb25zCitzdGFuZGFyZE1hbmFnZXIuZXhwaXJlRXhjZXB0aW9uPXByb2Nlc3NzRXhwaXJlOiAgRXhjZXB0aW9uIGR1cmluZyBzZXNzaW9uIGV4cGlyYXRpb24KK3N0YW5kYXJkTWFuYWdlci5sb2FkaW5nPUxvYWRpbmcgcGVyc2lzdGVkIHNlc3Npb25zIGZyb20gezB9CitzdGFuZGFyZE1hbmFnZXIubG9hZGluZy5jbmZlPUNsYXNzTm90Rm91bmRFeGNlcHRpb24gd2hpbGUgbG9hZGluZyBwZXJzaXN0ZWQgc2Vzc2lvbnM6IHswfQorc3RhbmRhcmRNYW5hZ2VyLmxvYWRpbmcuaW9lPUlPRXhjZXB0aW9uIHdoaWxlIGxvYWRpbmcgcGVyc2lzdGVkIHNlc3Npb25zOiB7MH0KK3N0YW5kYXJkTWFuYWdlci5ub3RTdGFydGVkPU1hbmFnZXIgaGFzIG5vdCB5ZXQgYmVlbiBzdGFydGVkCitzdGFuZGFyZE1hbmFnZXIuc2Vzc2lvblRpbWVvdXQ9SW52YWxpZCBzZXNzaW9uIHRpbWVvdXQgc2V0dGluZyB7MH0KK3N0YW5kYXJkTWFuYWdlci51bmxvYWRpbmc9U2F2aW5nIHBlcnNpc3RlZCBzZXNzaW9ucyB0byB7MH0KK3N0YW5kYXJkTWFuYWdlci51bmxvYWRpbmcuaW9lPUlPRXhjZXB0aW9uIHdoaWxlIHNhdmluZyBwZXJzaXN0ZWQgc2Vzc2lvbnM6IHswfQorc3RhbmRhcmRNYW5hZ2VyLm1hbmFnZXJMb2FkPUV4Y2VwdGlvbiBsb2FkaW5nIHNlc3Npb25zIGZyb20gcGVyc2lzdGVudCBzdG9yYWdlCitzdGFuZGFyZE1hbmFnZXIubWFuYWdlclVubG9hZD1FeGNlcHRpb24gdW5sb2FkaW5nIHNlc3Npb25zIHRvIHBlcnNpc3RlbnQgc3RvcmFnZQorc3RhbmRhcmRTZXNzaW9uLmF0dHJpYnV0ZUV2ZW50PVNlc3Npb24gYXR0cmlidXRlIGV2ZW50IGxpc3RlbmVyIHRocmV3IGV4Y2VwdGlvbgorc3RhbmRhcmRTZXNzaW9uLmJpbmRpbmdFdmVudD1TZXNzaW9uIGJpbmRpbmcgZXZlbnQgbGlzdGVuZXIgdGhyZXcgZXhjZXB0aW9uCitzdGFuZGFyZFNlc3Npb24uaW52YWxpZGF0ZS5pc2U9aW52YWxpZGF0ZTogU2Vzc2lvbiBhbHJlYWR5IGludmFsaWRhdGVkCitzdGFuZGFyZFNlc3Npb24uaXNOZXcuaXNlPWlzTmV3OiBTZXNzaW9uIGFscmVhZHkgaW52YWxpZGF0ZWQKK3N0YW5kYXJkU2Vzc2lvbi5nZXRBdHRyaWJ1dGUuaXNlPWdldEF0dHJpYnV0ZTogU2Vzc2lvbiBhbHJlYWR5IGludmFsaWRhdGVkCitzdGFuZGFyZFNlc3Npb24uZ2V0QXR0cmlidXRlTmFtZXMuaXNlPWdldEF0dHJpYnV0ZU5hbWVzOiBTZXNzaW9uIGFscmVhZHkgaW52YWxpZGF0ZWQKK3N0YW5kYXJkU2Vzc2lvbi5nZXRDcmVhdGlvblRpbWUuaXNlPWdldENyZWF0aW9uVGltZTogU2Vzc2lvbiBhbHJlYWR5IGludmFsaWRhdGVkCitzdGFuZGFyZFNlc3Npb24uZ2V0TGFzdEFjY2Vzc2VkVGltZS5pc2U9Z2V0TGFzdEFjY2Vzc2VkVGltZTogU2Vzc2lvbiBhbHJlYWR5IGludmFsaWRhdGVkCitzdGFuZGFyZFNlc3Npb24uZ2V0TWF4SW5hY3RpdmVJbnRlcnZhbC5pc2U9Z2V0TWF4SW5hY3RpdmVJbnRlcnZhbDogU2Vzc2lvbiBhbHJlYWR5IGludmFsaWRhdGVkCitzdGFuZGFyZFNlc3Npb24uZ2V0VmFsdWVOYW1lcy5pc2U9Z2V0QXR0cmlidXRlTmFtZXM6IFNlc3Npb24gYWxyZWFkeSBpbnZhbGlkYXRlZAorc3RhbmRhcmRTZXNzaW9uLm5vdFNlcmlhbGl6YWJsZT1DYW5ub3Qgc2VyaWFsaXplIHNlc3Npb24gYXR0cmlidXRlIHswfSBmb3Igc2Vzc2lvbiB7MX0KK3N0YW5kYXJkU2Vzc2lvbi5yZW1vdmVBdHRyaWJ1dGUuaXNlPXJlbW92ZUF0dHJpYnV0ZTogU2Vzc2lvbiBhbHJlYWR5IGludmFsaWRhdGVkCitzdGFuZGFyZFNlc3Npb24uc2Vzc2lvbkV2ZW50PVNlc3Npb24gZXZlbnQgbGlzdGVuZXIgdGhyZXcgZXhjZXB0aW9uCitzdGFuZGFyZFNlc3Npb24uc2V0QXR0cmlidXRlLmlhZT1zZXRBdHRyaWJ1dGU6IE5vbi1zZXJpYWxpemFibGUgYXR0cmlidXRlCitzdGFuZGFyZFNlc3Npb24uc2V0QXR0cmlidXRlLmlzZT1zZXRBdHRyaWJ1dGU6IFNlc3Npb24gYWxyZWFkeSBpbnZhbGlkYXRlZAorc3RhbmRhcmRTZXNzaW9uLnNldEF0dHJpYnV0ZS5uYW1lbnVsbD1zZXRBdHRyaWJ1dGU6IG5hbWUgcGFyYW1ldGVyIGNhbm5vdCBiZSBudWxsCitzdGFuZGFyZFNlc3Npb24uc2Vzc2lvbkNyZWF0ZWQ9Q3JlYXRlZCBTZXNzaW9uIGlkID0gezB9CitwZXJzaXN0ZW50TWFuYWdlci5sb2FkaW5nPUxvYWRpbmcgezB9IHBlcnNpc3RlZCBzZXNzaW9ucworcGVyc2lzdGVudE1hbmFnZXIudW5sb2FkaW5nPVNhdmluZyB7MH0gcGVyc2lzdGVkIHNlc3Npb25zCitwZXJzaXN0ZW50TWFuYWdlci5leHBpcmluZz1FeHBpcmluZyB7MH0gc2Vzc2lvbnMgYmVmb3JlIHNhdmluZyB0aGVtCitwZXJzaXN0ZW50TWFuYWdlci5kZXNlcmlhbGl6ZUVycm9yPUVycm9yIGRlc2VyaWFsaXppbmcgU2Vzc2lvbiB7MH06IHsxfQorcGVyc2lzdGVudE1hbmFnZXIuc2VyaWFsaXplRXJyb3I9RXJyb3Igc2VyaWFsaXppbmcgU2Vzc2lvbiB7MH06IHsxfQorcGVyc2lzdGVudE1hbmFnZXIuc3dhcE1heElkbGU9U3dhcHBpbmcgc2Vzc2lvbiB7MH0gdG8gU3RvcmUsIGlkbGUgZm9yIHsxfSBzZWNvbmRzCitwZXJzaXN0ZW50TWFuYWdlci5iYWNrdXBNYXhJZGxlPUJhY2tpbmcgdXAgc2Vzc2lvbiB7MH0gdG8gU3RvcmUsIGlkbGUgZm9yIHsxfSBzZWNvbmRzCitwZXJzaXN0ZW50TWFuYWdlci5iYWNrdXBFeGNlcHRpb249RXhjZXB0aW9uIG9jY3VycmVkIHdoZW4gYmFja2luZyB1cCBTZXNzaW9uIHswfTogezF9CitwZXJzaXN0ZW50TWFuYWdlci50b29NYW55QWN0aXZlPVRvbyBtYW55IGFjdGl2ZSBzZXNzaW9ucywgezB9LCBsb29raW5nIGZvciBpZGxlIHNlc3Npb25zIHRvIHN3YXAgb3V0CitwZXJzaXN0ZW50TWFuYWdlci5zd2FwVG9vTWFueUFjdGl2ZT1Td2FwcGluZyBvdXQgc2Vzc2lvbiB7MH0sIGlkbGUgZm9yIHsxfSBzZWNvbmRzIHRvbyBtYW55IHNlc3Npb25zIGFjdGl2ZQorcGVyc2lzdGVudE1hbmFnZXIucHJvY2Vzc1N3YXBzPUNoZWNraW5nIGZvciBzZXNzaW9ucyB0byBzd2FwIG91dCwgezB9IGFjdGl2ZSBzZXNzaW9ucyBpbiBtZW1vcnkKK3BlcnNpc3RlbnRNYW5hZ2VyLmFjdGl2ZVNlc3Npb249U2Vzc2lvbiB7MH0gaGFzIGJlZW4gaWRsZSBmb3IgezF9IHNlY29uZHMKK3BlcnNpc3RlbnRNYW5hZ2VyLnN3YXBJbj1Td2FwcGluZyBzZXNzaW9uIHswfSBpbiBmcm9tIFN0b3JlCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc2Vzc2lvbi9Mb2NhbFN0cmluZ3NfZXMucHJvcGVydGllcyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zZXNzaW9uL0xvY2FsU3RyaW5nc19lcy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzZTY2MDAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc2Vzc2lvbi9Mb2NhbFN0cmluZ3NfZXMucHJvcGVydGllcwpAQCAtMCwwICsxLDY1IEBACithcHBsaWNhdGlvblNlc3Npb24uc2Vzc2lvbi5pc2U9ZXN0YWRvIGluduFsaWRvIGRlIHNlc2nzbgorYXBwbGljYXRpb25TZXNzaW9uLnZhbHVlLmlhZT12YWxvciBudWxvCitmaWxlU3RvcmUuYWxyZWFkeVN0YXJ0ZWQ9WWEgaGEgc2lkbyBhcnJhbmNhZG8gZWwgQWxtYWPpbiBkZSBBcmNoaXZvcworZmlsZVN0b3JlLm5vdFN0YXJ0ZWQ9QfpuIG5vIHNlIGhhIGFycmFuY2FkbyBlbCBBbG1hY+luIGRlIEFyY2hpdm9zCitmaWxlU3RvcmUuc2F2aW5nPVNhbHZhbmRvIFNlc2nzbiB7MH0gZW4gYXJjaGl2byB7MX0KK2ZpbGVTdG9yZS5sb2FkaW5nPUNhcmdhbmRvIFNlc2nzbiB7MH0gZGVzZGUgYXJjaGl2byB7MX0KK2ZpbGVTdG9yZS5yZW1vdmluZz1RdWl0YW5kbyBTZXNp824gezB9IGVuIGFyY2hpdm8gezF9CitKREJDU3RvcmUuYWxyZWFkeVN0YXJ0ZWQ9WWEgaGEgc2lkbyBhcnJhbmNhZG8gZWwgQWxtYWPpbiBKREJDCitKREJDU3RvcmUuY2xvc2U9RXhjZXBjafNuIGNlcnJhbmRvIGNvbmV4afNuIGEgYmFzZSBkZSBkYXRvcyB7MH0KK0pEQkNTdG9yZS5ub3RTdGFydGVkPUH6biBubyBzZSBoYSBhcnJhbmNhZG8gZWwgQWxtYWPpbiBKREJDCitKREJDU3RvcmUuc2F2aW5nPVNhbHZhbmRvIFNlc2nzbiB7MH0gZW4gYmFzZSBkZSBkYXRvcyB7MX0KK0pEQkNTdG9yZS5sb2FkaW5nPUNhcmdhbmRvIFNlc2nzbiB7MH0gZGVzZGUgYmFzZSBkZSBkYXRvcyB7MX0KK0pEQkNTdG9yZS5yZW1vdmluZz1RdWl0YW5kbyBTZXNp824gezB9IGVuIGJhc2UgZGUgZGF0b3MgezF9CitKREJDU3RvcmUuU1FMRXhjZXB0aW9uPUVycm9yIFNRTCB7MH0KK0pEQkNTdG9yZS5jaGVja0Nvbm5lY3Rpb25EQkNsb3NlZD1MYSBjb25leGnzbmEgYSBiYXNlIGRlIGRhdG9zIGVzIG51bGEgbyBlc3ThIGNlcnJhZGEuIEludGVudGFuZG8gcmVhYnJpcmxhLgorSkRCQ1N0b3JlLmNoZWNrQ29ubmVjdGlvbkRCUmVPcGVuRmFpbD1GYWxs8yBsYSByZWFwZXJ0dXJhIGRlIGxhIGJhc2UgZGUgZGF0b3MuIFB1ZWRlIHF1ZSBsYSBiYXNlIGRlIGRhdG9zIGVzdOkgY2HtZGEuCitKREJDU3RvcmUuY2hlY2tDb25uZWN0aW9uU1FMRXhjZXB0aW9uPUhhIHRlbmlkbyBsdWdhciB1bmEgZXhjZXBjafNuIFNRTCB7MH0KK0pEQkNTdG9yZS5jaGVja0Nvbm5lY3Rpb25DbGFzc05vdEZvdW5kRXhjZXB0aW9uPU5vIHNlIGhhIGhhbGxhZG8gbGEgY2xhc2UgZGVsIG1hbmVqYWRvciAoZHJpdmVyKSBKREJDIHswfQorbWFuYWdlckJhc2UuY29tcGxldGU9U2UgaGEgY29tcGxldGFkbyBsYSBzaWVtYnJhIGRlbCBnZW5lcmFkb3IgZGUgbvptZXJvcyBhbGVhdG9yaW9zCittYW5hZ2VyQmFzZS5nZXR0aW5nPU9idGVuaWVuZG8gbWVuc2FqZSBkZSBjb21wb25lbnRlIGRlIHJlc3VtZW4gKGRpZ2VzdCkgcGFyYSBhbGdvcml0bW8gezB9CittYW5hZ2VyQmFzZS5nb3R0ZW49Q29tcGxldGFkYSBsYSBvYnRlbmNp824gZGUgbWVuc2FqZSBkZSBjb21wb25lbnRlIGRlIHJlc3VtZW4gKGRpZ2VzdCkKK21hbmFnZXJCYXNlLnJhbmRvbT1FeGNlcGNp824gaW5pY2lhbGl6YW5kbyBnZW5lcmFkb3IgZGUgbvptZXJvcyBhbGVhdG9yaW9zIGRlIGNsYXNlIHswfQorbWFuYWdlckJhc2Uuc2VlZGluZz1TZW1icmFuZG8gY2xhc2UgZGUgZ2VuZXJhZG9yIGRlIG76bWVyb3MgYWxlYXRvcmlvcyB7MH0KK3NlcnZlclNlc3Npb24udmFsdWUuaWFlPXZhbG9yIG51bG8KK3N0YW5kYXJkTWFuYWdlci5hbHJlYWR5U3RhcnRlZD1ZYSBoYSBzaWRvIGFycmFuY2FkbyBlbCBHZXN0b3IKK3N0YW5kYXJkTWFuYWdlci5jcmVhdGVTZXNzaW9uLmlzZT1jcmVhdGVTZXNzaW9uOiBEZW1hc2lhZGFzIHNlc2lvbmVzIGFjdGl2YXMKK3N0YW5kYXJkTWFuYWdlci5leHBpcmVFeGNlcHRpb249cHJvY2Vzc3NFeHBpcmU6IEV4Y2VwY2nzbiBkdXJhbnRlIGxhIGV4cGlyYWNp824gZGUgc2VzafNuCitzdGFuZGFyZE1hbmFnZXIubG9hZGluZz1DYXJnYW5kbyBzZXNpb25lcyBwZXJzaXN0aWRhcyBkZXNkZSB7MH0KK3N0YW5kYXJkTWFuYWdlci5sb2FkaW5nLmNuZmU9Q2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBhbCBjYXJnYXIgc2VzaW9uZXMgcGVyc2lzdGlkYXM6IHswfQorc3RhbmRhcmRNYW5hZ2VyLmxvYWRpbmcuaW9lPUlPRXhjZXB0aW9uIGFsIGNhcmdhciBzZXNpb25lcyBwZXJzaXN0aWRhczogezB9CitzdGFuZGFyZE1hbmFnZXIubm90U3RhcnRlZD1B+m4gbm8gc2UgaGEgYXJyYW5jYWRvIGVsIEdlc3Rvcgorc3RhbmRhcmRNYW5hZ2VyLnNlc3Npb25UaW1lb3V0PVZhbG9yIGluduFsaWRvIGRlIFRpZW1wbyBBZ290YWRvIGRlIHNlc2nzbiB7MH0KK3N0YW5kYXJkTWFuYWdlci51bmxvYWRpbmc9U2FsdmFuZG8gc2VzaW9uZXMgcGVyc2lzdGlkYXMgYSB7MH0KK3N0YW5kYXJkTWFuYWdlci51bmxvYWRpbmcuaW9lPUlPRXhjZXB0aW9uIGFsIHNhbHZhciBzZXNpb25lcyBwZXJzaXN0aWRhczogezB9CitzdGFuZGFyZE1hbmFnZXIubWFuYWdlckxvYWQ9RXhjZXBjafNuIGNhcmdhbmRvIHNlc2lvbmVzIGRlc2RlIGFsbWFjZW5hbWllbnRvIHBlcnNpc3RlbnRlCitzdGFuZGFyZE1hbmFnZXIubWFuYWdlclVubG9hZD1FeGNlcGNp824gZGVzY2FyZ2FuZG8gc2VzaW9uZXMgYSBhbG1hY2VuYW1pZW50byBwZXJzaXN0ZW50ZQorc3RhbmRhcmRTZXNzaW9uLmF0dHJpYnV0ZUV2ZW50PUVsIGVzY3VjaGFkb3IgZGUgZXZlbnRvcyBkZSBhdHJpYnV0byBkZSBTZXNp824gbGFuevMgdW5hIGV4Y2VwY2nzbgorc3RhbmRhcmRTZXNzaW9uLmludmFsaWRhdGUuaXNlPWludmFsaWRhdGU6IExhIFNlc2nzbiB5YSBoYSBzaWRvIGludmFsaWRhZGEKK3N0YW5kYXJkU2Vzc2lvbi5pc05ldy5pc2U9aXNOZXc6IExhIFNlc2nzbiB5YSBoYSBzaWRvIGludmFsaWRhZGEKK3N0YW5kYXJkU2Vzc2lvbi5nZXRBdHRyaWJ1dGUuaXNlPWdldEF0dHJpYnV0ZTogTGEgU2VzafNuIHlhIGhhIHNpZG8gaW52YWxpZGFkYQorc3RhbmRhcmRTZXNzaW9uLmdldEF0dHJpYnV0ZU5hbWVzLmlzZT1nZXRBdHRyaWJ1dGVOYW1lczogTGEgU2VzafNuIHlhIGhhIHNpZG8gaW52YWxpZGFkYQorc3RhbmRhcmRTZXNzaW9uLmdldENyZWF0aW9uVGltZS5pc2U9Z2V0Q3JlYXRpb25UaW1lOiBMYSBTZXNp824geWEgaGEgc2lkbyBpbnZhbGlkYWRhCitzdGFuZGFyZFNlc3Npb24uZ2V0TGFzdEFjY2Vzc2VkVGltZS5pc2U9Z2V0TGFzdEFjY2Vzc2VkVGltZTogTGEgU2VzafNuIHlhIGhhIHNpZG8gaW52YWxpZGFkYQorc3RhbmRhcmRTZXNzaW9uLmdldE1heEluYWN0aXZlSW50ZXJ2YWwuaXNlPWdldE1heEluYWN0aXZlSW50ZXJ2YWw6IExhIFNlc2nzbiB5YSBoYSBzaWRvIGludmFsaWRhZGEKK3N0YW5kYXJkU2Vzc2lvbi5nZXRWYWx1ZU5hbWVzLmlzZT1nZXRBdHRyaWJ1dGVOYW1lczogTGEgU2VzafNuIHlhIGhhIHNpZG8gaW52YWxpZGFkYQorc3RhbmRhcmRTZXNzaW9uLm5vdFNlcmlhbGl6YWJsZT1ObyBwdWVkbyBzZXJpYWxpemFyIGF0cmlidXRvIGRlIHNlc2nzbiB7MH0gcGFyYSBzZXNp824gezF9CitzdGFuZGFyZFNlc3Npb24ucmVtb3ZlQXR0cmlidXRlLmlzZT1yZW1vdmVBdHRyaWJ1dGU6IExhIFNlc2nzbiB5YSBoYSBzaWRvIGludmFsaWRhZGEKK3N0YW5kYXJkU2Vzc2lvbi5zZXNzaW9uRXZlbnQ9RWwgZXNjdWNoYWRvciBkZSBldmVudG8gZGUgU2VzafNuIGxhbnrzIHVuYSBleGVjcGNp824KK3N0YW5kYXJkU2Vzc2lvbi5zZXRBdHRyaWJ1dGUuaWFlPXNldEF0dHJpYnV0ZTogQXRyaWJ1dG8gbm8gc2VyaWFsaXphYmxlCitzdGFuZGFyZFNlc3Npb24uc2V0QXR0cmlidXRlLmlzZT1zZXRBdHRyaWJ1dGU6IExhIFNlc2nzbiB5YSBoYSBzaWRvIGludmFsaWRhZGEKK3N0YW5kYXJkU2Vzc2lvbi5zZXRBdHRyaWJ1dGUubmFtZW51bGw9c2V0QXR0cmlidXRlOiBlbCBudWV2byBwYXLhbWV0cm8gbm8gcHVlZGUgc2VyIG51bG8KK3N0YW5kYXJkU2Vzc2lvbi5zZXNzaW9uQ3JlYXRlZD1DcmVhZGEgU2VzafNuIGlkID0gezB9CitwZXJzaXN0ZW50TWFuYWdlci5sb2FkaW5nPUNhcmdhbmRvIHswfSBzZXNpb25lcyBwZXJzaXN0aWRhcworcGVyc2lzdGVudE1hbmFnZXIudW5sb2FkaW5nPVNhbHZhbmRvIHswfSBzZXNpb25lcyBwZXJzaXN0aWRhcworcGVyc2lzdGVudE1hbmFnZXIuZXhwaXJpbmc9RXhwaXJhbmRvIHswfSBzZXNpb25lcyBhbnRlcyBkZSBzYWx2YXJsYXMKK3BlcnNpc3RlbnRNYW5hZ2VyLmRlc2VyaWFsaXplRXJyb3I9RXJyb3IgZGVzLXNlcmlhbGl6YW5kbyBTZXNp824gezB9OiB7MX0KK3BlcnNpc3RlbnRNYW5hZ2VyLnNlcmlhbGl6ZUVycm9yPUVycm9yIHNlcmlhbGl6YW5kbyBTZXNp824gezB9OiB7MX0KK3BlcnNpc3RlbnRNYW5hZ2VyLnN3YXBNYXhJZGxlPUludGVyY2FtYmlhbmRvIHNlc2nzbiB7MH0gYSBmdWVyYSBhIEFsbWFj6W4sIG9jaW9zYSBkdXJhbnRlIHsxfSBzZWd1bmRvcworcGVyc2lzdGVudE1hbmFnZXIuYmFja3VwTWF4SWRsZT1SZXNwYWxkYW5kbyBzZXNp824gezB9IGEgQWxtYWPpbiwgb2Npb3NhIGR1cmFudGUgezF9IHNlZ3VuZG9zCitwZXJzaXN0ZW50TWFuYWdlci5iYWNrdXBFeGNlcHRpb249SGEgdGVuaWRvIGx1Z2FyIHVuYSBleGNlcGNp824gYWwgcmVzcGFsZGFyIGxhIFNlc2nzbiB7MH06IHsxfQorcGVyc2lzdGVudE1hbmFnZXIudG9vTWFueUFjdGl2ZT1EZW1hc2lhZGFzIHNlc2lvbmVzIGFjdGl2YXMsIHswfSwgYnVzY2FuZG8gc2VzaW9uZXMgb2Npb3NhcyBwYXJhIGludGVyY2FtYmlhcgorcGVyc2lzdGVudE1hbmFnZXIuc3dhcFRvb01hbnlBY3RpdmU9SW50ZXJjYW1iaWFuZG8gc2VzafNuIHswfSBhIGZ1ZXJhLCBvY2lvc2EgZHVyYW50ZSB7MX0gc2VndW5kb3M6IERlbWFzaWFkYXMgc2VzaW9uZXMgYWN0aXZhcworcGVyc2lzdGVudE1hbmFnZXIucHJvY2Vzc1N3YXBzPU1pcmFuZG8gcXXpIHNlc2lvbmVzIGludGVyY2FtYmlhciBhIGZ1ZXJhLCB7MH0gc2VzaW9uZXMgYWN0aXZhcyBlbiBtZW1vcmlhCitwZXJzaXN0ZW50TWFuYWdlci5hY3RpdmVTZXNzaW9uPUxhIHNlc2nzbiB7MH0gaGEgZXN0YWRvIG9jaW9zYSBkdXJhbnRlIHsxfSBzZWd1bmRvcworcGVyc2lzdGVudE1hbmFnZXIuc3dhcEluPUludGVyY2FtYmlhbmRvIHNlc2nzbiB7MH0gYSBkZW50cm8gZGVzZGUgQWxtYWPpbgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3Nlc3Npb24vTG9jYWxTdHJpbmdzX2ZyLnByb3BlcnRpZXMgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc2Vzc2lvbi9Mb2NhbFN0cmluZ3NfZnIucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjY5NzRhCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3Nlc3Npb24vTG9jYWxTdHJpbmdzX2ZyLnByb3BlcnRpZXMKQEAgLTAsMCArMSw2NSBAQAorYXBwbGljYXRpb25TZXNzaW9uLnNlc3Npb24uaXNlPel0YXQgZGUgc2Vzc2lvbiBpbnZhbGlkZQorYXBwbGljYXRpb25TZXNzaW9uLnZhbHVlLmlhZT12YWxldXIgbnVsbGUKK2ZpbGVTdG9yZS5hbHJlYWR5U3RhcnRlZD1MZSAiRmlsZSBTdG9yZSIgYSBk6WrgIOl06SBk6W1hcnLpCitmaWxlU3RvcmUubm90U3RhcnRlZD1MZSAiRmlsZSBTdG9yZSIgbicnYSBwYXMgZW5jb3JlIOl06SBk6W1hcnLpCitmaWxlU3RvcmUuc2F2aW5nPVNhdXZlZ2FyZGUgZGUgbGEgU2Vzc2lvbiB7MH0gdmVycyBsZSBmaWNoaWVyIHsxfQorZmlsZVN0b3JlLmxvYWRpbmc9Q2hhcmdlbWVudCBkZSBsYSBTZXNzaW9uIHswfSBkZXB1aXMgbGUgZmljaGllciB7MX0KK2ZpbGVTdG9yZS5yZW1vdmluZz1SZXRyYWl0IGRlIGxhIFNlc3Npb24gezB9IGR1IGZpY2hpZXIgezF9CitKREJDU3RvcmUuYWxyZWFkeVN0YXJ0ZWQ9TGUgIkpEQkMgU3RvcmUiIGEgZOlq4CDpdOkgZOltYXJy6QorSkRCQ1N0b3JlLm5vdFN0YXJ0ZWQ9TGUgIkpEQkMgU3RvcmUiIG4nJ2EgcGFzIGVuY29yZSDpdOkgZOltYXJy6QorSkRCQ1N0b3JlLnNhdmluZz1TYXV2ZWdhcmRlIGRlIGxhIFNlc3Npb24gezB9IHZlcnMgbGEgYmFzZSBkZSBkb25u6WVzIHsxfQorSkRCQ1N0b3JlLmxvYWRpbmc9Q2hhcmdlbWVudCBkZSBsYSBTZXNzaW9uIHswfSBkZXB1aXMgbGEgYmFzZSBkZSBkb25u6WVzIHsxfQorSkRCQ1N0b3JlLnJlbW92aW5nPVJldHJhaXQgZGUgbGEgU2Vzc2lvbiB7MH0gZGUgbGEgYmFzZSBkZSBkb25u6WVzIHsxfQorSkRCQ1N0b3JlLlNRTEV4Y2VwdGlvbj1FcnJldXIgU1FMIHswfQorSkRCQ1N0b3JlLmNoZWNrQ29ubmVjdGlvbkRCQ2xvc2VkPUxhIGNvbm5leGlvbiDgIGxhIGJhc2UgZGUgZG9ubullcyBlc3QgbnVsbGUgb3UgYSDpdOkgdHJvdXbpIGZlcm3pLiBUZW50YXRpdmUgZGUgculvdXZlcnR1cmUuCitKREJDU3RvcmUuY2hlY2tDb25uZWN0aW9uREJSZU9wZW5GYWlsPUxhIHRlbnRhdGl2ZSBkZSBy6W91dmVydHVyZSByZS1vcGVuIGRlIGxhIGJhc2UgZGUgZG9ubullcyBhIOljaG916S4gTGEgYmFzZSBkZSBkb25u6WVzIGVzdCBwZXV0IOp0cmUgYXJy6XTpZS4KK0pEQkNTdG9yZS5jaGVja0Nvbm5lY3Rpb25TUUxFeGNlcHRpb249VW5lIGV4Y2VwdGlvbiBTUUwgcycnZXN0IHByb2R1aXRlIHswfQorSkRCQ1N0b3JlLmNoZWNrQ29ubmVjdGlvbkNsYXNzTm90Rm91bmRFeGNlcHRpb249TGEgY2xhc3NlIGR1IGRyaXZlciBKREJDIG4nJ2EgcGFzIOl06SB0cm91dullIHswfQorbWFuYWdlckJhc2UuY29tcGxldGU9TCcnYWxpbWVudGF0aW9uIGR1IGfpbulyYXRldXIgZGUgbm9tYnJlIGFs6WF0b2lyZSBlc3QgdGVybWlu6QorbWFuYWdlckJhc2UuZ2V0dGluZz1QcmlzZSBkdSBjb21wb3NhbnQgZCcnYWxnb3JpdGhtZSBlbXByZWludGUgZGUgbWVzc2FnZSAobWVzc2FnZSBkaWdlc3QpIHBvdXIgbCcnYWxnb3JpdGhtZSB7MH0KK21hbmFnZXJCYXNlLmdvdHRlbj1QcmlzZSBkdSBjb21wb3NhbnQgZCcnYWxnb3JpdGhtZSBlbXByZWludGUgZGUgbWVzc2FnZSAobWVzc2FnZSBkaWdlc3QpIHRlcm1pbullCittYW5hZ2VyQmFzZS5yYW5kb209RXhjZXB0aW9uIGR1cmFudCBsJydpbml0aWFsaXNhdGlvbiBkZSBsYSBjbGFzc2UgZHUgZ+lu6XJhdGV1ciBkZSBub21icmUgYWzpYXRvaXJlIHswfQorbWFuYWdlckJhc2Uuc2VlZGluZz1BbGltZW50YXRpb24gZGUgbGEgY2xhc3NlIGR1IGfpbulyYXRldXIgZGUgbm9tYnJlIGFs6WF0b2lyZSB7MH0KK3NlcnZlclNlc3Npb24udmFsdWUuaWFlPXZhbGV1ciBudWxsZQorc3RhbmRhcmRNYW5hZ2VyLmFscmVhZHlTdGFydGVkPUxlICJNYW5hZ2VyIiBhIOl06SBk6W1hcnLpCitzdGFuZGFyZE1hbmFnZXIuY3JlYXRlU2Vzc2lvbi5pc2U9ImNyZWF0ZVNlc3Npb24iOiBUcm9wIGRlIHNlc3Npb25zIGFjdGl2ZXMKK3N0YW5kYXJkTWFuYWdlci5leHBpcmVFeGNlcHRpb249InByb2Nlc3NzRXhwaXJlIjogIEV4Y2VwdGlvbiBsb3JzIGRlIGwnJ2V4cGlyYXRpb24gZGUgbGEgc2Vzc2lvbgorc3RhbmRhcmRNYW5hZ2VyLmxvYWRpbmc9Q2hhcmdlbWVudCBkZXMgc2Vzc2lvbnMgcXVpIG9udCBwZXJzaXN06XMgZGVwdWlzIHswfQorc3RhbmRhcmRNYW5hZ2VyLmxvYWRpbmcuY25mZT0iQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiIgbG9ycyBkdSBjaGFyZ2VtZW50IGRlIHNlc3Npb25zIHBlcnNpc3RhbnRlczogezB9CitzdGFuZGFyZE1hbmFnZXIubG9hZGluZy5pb2U9IklPRXhjZXB0aW9uIiBsb3JzIGR1IGNoYXJnZW1lbnQgZGVzIHNlc3Npb25zIHBlcnNpc3RhbnRlczogezB9CitzdGFuZGFyZE1hbmFnZXIubm90U3RhcnRlZD1MZSAiTWFuYWdlciIgbicnYSBwYXMgZW5jb3JlIOl06SBk6W1hcnLpCitzdGFuZGFyZE1hbmFnZXIuc2Vzc2lvblRpbWVvdXQ9UulnbGFnZSBkdSBk6WxhaSBkJydpbmFjdGl2aXTpICh0aW1lb3V0KSBkZSBzZXNzaW9uIGludmFsaWRlIHswfQorc3RhbmRhcmRNYW5hZ2VyLnVubG9hZGluZz1TYXV2ZWdhcmRlIGRlcyBzZXNzaW9ucyBheWFudCBwZXJzaXN06WVzIHZlcnMgezB9CitzdGFuZGFyZE1hbmFnZXIudW5sb2FkaW5nLmlvZT0iSU9FeGNlcHRpb24iIGxvcnMgZGUgbGEgc2F1dmVnYXJkZSBkZSBzZXNzaW9ucyBwZXJzaXN0YW50ZXM6IHswfQorc3RhbmRhcmRNYW5hZ2VyLm1hbmFnZXJMb2FkPUV4Y2VwdGlvbiBhdSBjaGFyZ2VtZW50IGRlcyBzZXNzaW9ucyBkZXB1aXMgbGUgc3RvY2thZ2UgcGVyc2lzdGFudCAocGVyc2lzdGVudCBzdG9yYWdlKQorc3RhbmRhcmRNYW5hZ2VyLm1hbmFnZXJVbmxvYWQ9RXhjZXB0aW9uIGF1IGTpY2hhcmdlbWVudCBkZXMgc2Vzc2lvbnMgdmVycyBsZSBzdG9ja2FnZSBwZXJzaXN0YW50IChwZXJzaXN0ZW50IHN0b3JhZ2UpCitzdGFuZGFyZFNlc3Npb24uYXR0cmlidXRlRXZlbnQ9TCcn6WNvdXRldXIgZCcn6XbobmVtZW50IEF0dHJpYnV0IGRlIFNlc3Npb24gKGF0dHJpYnV0ZSBldmVudCBsaXN0ZW5lcikgYSBn6W7pcukgdW5lIGV4Y2VwdGlvbgorc3RhbmRhcmRTZXNzaW9uLmludmFsaWRhdGUuaXNlPSJpbnZhbGlkYXRlIjogU2Vzc2lvbiBk6WrgIGludmFsaWTpZQorc3RhbmRhcmRTZXNzaW9uLmlzTmV3LmlzZT0iaXNOZXciOiBTZXNzaW9uIGTpauAgaW52YWxpZOllCitzdGFuZGFyZFNlc3Npb24uZ2V0QXR0cmlidXRlLmlzZT0iZ2V0QXR0cmlidXRlIjogU2Vzc2lvbiBk6WrgIGludmFsaWTpZQorc3RhbmRhcmRTZXNzaW9uLmdldEF0dHJpYnV0ZU5hbWVzLmlzZT0iZ2V0QXR0cmlidXRlTmFtZXMiOiBTZXNzaW9uIGTpauAgaW52YWxpZOllCitzdGFuZGFyZFNlc3Npb24uZ2V0Q3JlYXRpb25UaW1lLmlzZT0iZ2V0Q3JlYXRpb25UaW1lIjogU2Vzc2lvbiBk6WrgIGludmFsaWTpZQorc3RhbmRhcmRTZXNzaW9uLmdldE1heEluYWN0aXZlSW50ZXJ2YWwuaXNlPSJnZXRNYXhJbmFjdGl2ZUludGVydmFsIjogU2Vzc2lvbiBk6WrgIGludmFsaWTpZQorc3RhbmRhcmRTZXNzaW9uLmdldFZhbHVlTmFtZXMuaXNlPSJnZXRBdHRyaWJ1dGVOYW1lcyI6IFNlc3Npb24gZOlq4CBpbnZhbGlk6WUKK3N0YW5kYXJkU2Vzc2lvbi5ub3RTZXJpYWxpemFibGU9SW1wb3NzaWJsZSBkZSBz6XJpYWxpc2VyIGwnJ2F0dHJpYnV0IGRlIHNlc3Npb24gezB9IHBvdXIgbGEgc2Vzc2lvbiB7MX0KK3N0YW5kYXJkU2Vzc2lvbi5yZW1vdmVBdHRyaWJ1dGUuaXNlPSJyZW1vdmVBdHRyaWJ1dGUiOiBTZXNzaW9uIGTpauAgaW52YWxpZOllCitzdGFuZGFyZFNlc3Npb24uc2Vzc2lvbkV2ZW50PUwnJ+ljb3V0ZXVyIGQnJ+l26G5lbWVudCBkZSBzZXNzaW9uIChzZXNzaW9uIGV2ZW50IGxpc3RlbmVyKSBhIGfpbuly6SB1bmUgZXhjZXB0aW9uCitzdGFuZGFyZFNlc3Npb24uc2V0QXR0cmlidXRlLmlhZT0ic2V0QXR0cmlidXRlIjogYXR0cmlidXQgbm9uIHPpcmlhbGlzYWJsZQorc3RhbmRhcmRTZXNzaW9uLnNldEF0dHJpYnV0ZS5pc2U9InNldEF0dHJpYnV0ZSI6IFNlc3Npb24gZOlq4CBpbnZhbGlk6WUKK3N0YW5kYXJkU2Vzc2lvbi5zZXRBdHRyaWJ1dGUubmFtZW51bGw9InNldEF0dHJpYnV0ZSI6IGxlIG5vbSBkZSBwYXJhbeh0cmUgbmUgcGV1dCDqdHJlIG51bAorc3RhbmRhcmRTZXNzaW9uLnNlc3Npb25DcmVhdGVkPUNy6WF0aW9uIGRlIGwnSWQgZGUgU2Vzc2lvbiA9IHswfQorcGVyc2lzdGVudE1hbmFnZXIubG9hZGluZz1DaGFyZ2VtZW50IGRlIHswfSBzZXNzaW9ucyBwZXJzaXN0YW50ZXMKK3BlcnNpc3RlbnRNYW5hZ2VyLnVubG9hZGluZz1TYXV2ZWdhcmRlIGRlIHswfSBzZXNzaW9ucyBwZXJzaXN0YW50ZXMKK3BlcnNpc3RlbnRNYW5hZ2VyLmV4cGlyaW5nPUV4cGlyYXRpb24gZGUgezB9IHNlc3Npb25zIGF2YW50IGxldXIgc2F1dmVnYXJkZQorcGVyc2lzdGVudE1hbmFnZXIuZGVzZXJpYWxpemVFcnJvcj1FcnJldXIgbG9ycyBkZSBsYSBk6XPpcmlhbGlzYXRpb24gZGUgbGEgc2Vzc2lvbiB7MH06IHsxfQorcGVyc2lzdGVudE1hbmFnZXIuc2VyaWFsaXplRXJyb3I9RXJyZXVyIGxvcnMgZGUgbGEgc+lyaWFsaXNhdGlvbiBkZSBsYSBzZXNzaW9uIHswfTogezF9CitwZXJzaXN0ZW50TWFuYWdlci5zd2FwTWF4SWRsZT1CYXNjdWxlbWVudCBkZSBsYSBzZXNzaW9uIHswfSB2ZXJzIGxlIHN0b2NrYWdlIChTdG9yZSksIGVuIGF0dGVudGUgcG91ciB7MX0gc2Vjb25kZXMKK3BlcnNpc3RlbnRNYW5hZ2VyLmJhY2t1cE1heElkbGU9U2F1dmVnYXJkZSBkZSBsYSBzZXNzaW9uIHswfSB2ZXJzIGxlIHN0b2NrYWdlIChTdG9yZSksIGVuIGF0dGVudGUgcG91ciB7MX0gc2Vjb25kZXMKK3BlcnNpc3RlbnRNYW5hZ2VyLmJhY2t1cEV4Y2VwdGlvbj1FeGNlcHRpb24gbG9ycyBkZSBsYSBzYXV2ZWdhcmRlIGRlIGxhIHNlc3Npb24gezB9OiB7MX0KK3BlcnNpc3RlbnRNYW5hZ2VyLnRvb01hbnlBY3RpdmU9VHJvcCBkZSBzZXNzaW9ucyBhY3RpdmVzLCB7MH0sIOAgbGEgcmVjaGVyY2hlIGRlIHNlc3Npb25zIGVuIGF0dGVudGUgcG91ciBiYXNjdWxlbWVudCB2ZXJzIHN0b2NrYWdlIChzd2FwIG91dCkKK3BlcnNpc3RlbnRNYW5hZ2VyLnN3YXBUb29NYW55QWN0aXZlPUJhc2N1bGVtZW50IHZlcnMgc3RvY2thZ2UgKHN3YXAgb3V0KSBkZSBsYSBzZXNzaW9uIHswfSwgZW4gYXR0ZW50ZSBwb3VyIHsxfSBzZWNvbmRlcyB0cm9wIGRlIHNlc3Npb25zIGFjdGl2ZXMKK3BlcnNpc3RlbnRNYW5hZ2VyLnByb2Nlc3NTd2Fwcz1SZWNoZXJjaGUgZGUgc2Vzc2lvbnMg4CBiYXNjdWxlciB2ZXJzIHN0b2NrYWdlIChzd2FwIG91dCksIHswfSBzZXNzaW9ucyBhY3RpdmVzIGVuIG3pbW9pcmUKK3BlcnNpc3RlbnRNYW5hZ2VyLmFjdGl2ZVNlc3Npb249TGEgc2Vzc2lvbiB7MH0gYSDpdOkgZW4gYXR0ZW50ZSBkdXJhbnQgezF9IHNlY29uZGVzCitwZXJzaXN0ZW50TWFuYWdlci5zd2FwSW49QmFzY3VsZW1lbnQgZGVwdWlzIGxlIHN0b2NrYWdlIChzd2FwIGluKSBkZSBsYSBzZXNzaW9uIHswfQorCitzdGFuZGFyZFNlc3Npb24uZ2V0TGFzdEFjY2Vzc2VkVGltZS5pc2U9ImdldExhc3RBY2Nlc3NlZFRpbWUiOiBTZXNzaW9uIGRcdTAwRTlqXHUwMEUwIGludmFsaWRcdTAwRTllCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc2Vzc2lvbi9Mb2NhbFN0cmluZ3NfamEucHJvcGVydGllcyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zZXNzaW9uL0xvY2FsU3RyaW5nc19qYS5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxYWFhMGEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc2Vzc2lvbi9Mb2NhbFN0cmluZ3NfamEucHJvcGVydGllcwpAQCAtMCwwICsxLDY2IEBACithcHBsaWNhdGlvblNlc3Npb24uc2Vzc2lvbi5pc2U9XHU3MTIxXHU1MmI5XHUzMDZhXHUzMGJiXHUzMGMzXHUzMGI3XHUzMGU3XHUzMGYzXHU3MmI2XHU2MTRiXHUzMDY3XHUzMDU5CithcHBsaWNhdGlvblNlc3Npb24udmFsdWUuaWFlPW51bGxcdTUwMjRcdTMwNjdcdTMwNTkKK2ZpbGVTdG9yZS5hbHJlYWR5U3RhcnRlZD1cdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTMwYjlcdTMwYzhcdTMwYTJcdTMwNGNcdTY1ZTJcdTMwNmJcdThkNzdcdTUyZDVcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkKK2ZpbGVTdG9yZS5ub3RTdGFydGVkPVx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzBiOVx1MzBjOFx1MzBhMlx1MzA0Y1x1MzA3ZVx1MzA2MFx1OGQ3N1x1NTJkNVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5MworZmlsZVN0b3JlLnNhdmluZz1cdTMwYmJcdTMwYzNcdTMwYjdcdTMwZTdcdTMwZjMgezB9IFx1MzA5Mlx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYiB7MX0gXHUzMDZiXHU0ZmRkXHU1YjU4XHUzMDU3XHUzMDdlXHUzMDU5CitmaWxlU3RvcmUubG9hZGluZz1cdTMwYmJcdTMwYzNcdTMwYjdcdTMwZTdcdTMwZjMgezB9IFx1MzA5Mlx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYiB7MX0gXHUzMDRiXHUzMDg5XHUzMGVkXHUzMGZjXHUzMGM5XHUzMDU3XHUzMDdlXHUzMDU5CitmaWxlU3RvcmUucmVtb3Zpbmc9XHUzMGJiXHUzMGMzXHUzMGI3XHUzMGU3XHUzMGYzIHswfSBcdTMwOTJcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWIgezF9IFx1MzA0Ylx1MzA4OVx1NTI0YVx1OTY2NFx1MzA1N1x1MzA3ZVx1MzA1OQorSkRCQ1N0b3JlLmFscmVhZHlTdGFydGVkPUpEQkNcdTMwYjlcdTMwYzhcdTMwYTJcdTMwNmZcdTY1ZTJcdTMwNmJcdThkNzdcdTUyZDVcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkKK0pEQkNTdG9yZS5jbG9zZT1cdTMwYzdcdTMwZmNcdTMwYmZcdTMwZDlcdTMwZmNcdTMwYjlcdTYzYTVcdTdkOWEgezB9IFx1MzA5Mlx1MzBhZlx1MzBlZFx1MzBmY1x1MzBiYVx1NGUyZFx1MzA2ZVx1NGY4Ylx1NTkxNlx1MzA2N1x1MzA1OQorSkRCQ1N0b3JlLm5vdFN0YXJ0ZWQ9SkRCQ1x1MzBiOVx1MzBjOFx1MzBhMlx1MzA2Zlx1MzA3ZVx1MzA2MFx1OGQ3N1x1NTJkNVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA3ZVx1MzA1Ylx1MzA5MworSkRCQ1N0b3JlLnNhdmluZz1cdTMwYmJcdTMwYzNcdTMwYjdcdTMwZTdcdTMwZjMgezB9IFx1MzA5Mlx1MzBjN1x1MzBmY1x1MzBiZlx1MzBkOVx1MzBmY1x1MzBiOSB7MX0gXHUzMDZiXHU0ZmRkXHU1YjU4XHUzMDU3XHUzMDdlXHUzMDU5CitKREJDU3RvcmUubG9hZGluZz1cdTMwYmJcdTMwYzNcdTMwYjdcdTMwZTdcdTMwZjMgezB9IFx1MzA5Mlx1MzBjN1x1MzBmY1x1MzBiZlx1MzBkOVx1MzBmY1x1MzBiOSB7MX0gXHUzMDRiXHUzMDg5XHUzMGVkXHUzMGZjXHUzMGM5XHUzMDU3XHUzMDdlXHUzMDU5CitKREJDU3RvcmUucmVtb3Zpbmc9IFx1MzBiYlx1MzBjM1x1MzBiN1x1MzBlN1x1MzBmMyB7MH0gXHUzMDkyXHUzMGM3XHUzMGZjXHUzMGJmXHUzMGQ5XHUzMGZjXHUzMGI5IHsxfSBcdTMwNGJcdTMwODlcdTUyNGFcdTk2NjRcdTMwNTdcdTMwN2VcdTMwNTkKK0pEQkNTdG9yZS5TUUxFeGNlcHRpb249U1FMXHUzMGE4XHUzMGU5XHUzMGZjIHswfQorSkRCQ1N0b3JlLmNoZWNrQ29ubmVjdGlvbkRCQ2xvc2VkPVx1MzBjN1x1MzBmY1x1MzBiZlx1MzBkOVx1MzBmY1x1MzBiOVx1NjNhNVx1N2Q5YVx1MzA0Y251bGxcdTMwNjdcdTMwNDJcdTMwOGJcdTMwNGJcdTMwMDFcdTMwYWZcdTMwZWRcdTMwZmNcdTMwYmFcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwOGJcdTMwNmVcdTMwNGNcdTg5OGJcdTMwNjRcdTMwNGJcdTMwOGFcdTMwN2VcdTMwNTdcdTMwNWZcdTMwMDJcdTUxOGRcdTMwYWFcdTMwZmNcdTMwZDdcdTMwZjNcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDIKK0pEQkNTdG9yZS5jaGVja0Nvbm5lY3Rpb25EQlJlT3BlbkZhaWw9XHUzMGM3XHUzMGZjXHUzMGJmXHUzMGQ5XHUzMGZjXHUzMGI5XHUzMDZlXHU1MThkXHUzMGFhXHUzMGZjXHUzMGQ3XHUzMGYzXHUzMDRjXHU1OTMxXHU2NTU3XHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmXHUzMDAyXHUzMGM3XHUzMGZjXHUzMGJmXHUzMGQ5XHUzMGZjXHUzMGI5XHUzMDRjXHUzMGMwXHUzMGE2XHUzMGYzXHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDhiXHUzMDRiXHUzMDgyXHUzMDU3XHUzMDhjXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyCitKREJDU3RvcmUuY2hlY2tDb25uZWN0aW9uU1FMRXhjZXB0aW9uPVNRTFx1NGY4Ylx1NTkxNlx1MzA0Y1x1NzY3YVx1NzUxZlx1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1ZiB7MH0KK0pEQkNTdG9yZS5jaGVja0Nvbm5lY3Rpb25DbGFzc05vdEZvdW5kRXhjZXB0aW9uPUpEQkNcdTMwYzlcdTMwZTlcdTMwYTRcdTMwZDBcdTMwYWZcdTMwZTlcdTMwYjlcdTMwNGNcdTg5OGJcdTMwNjRcdTMwNGJcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTMgezB9CittYW5hZ2VyQmFzZS5jb21wbGV0ZT1cdTRlNzFcdTY1NzBcdTc2N2FcdTc1MWZcdTU2NjhcdTMwNmVcdTMwYjdcdTMwZmNcdTMwYzlcdTMwNmVcdTc1MWZcdTYyMTBcdTMwNGNcdTViOGNcdTRlODZcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWYKK21hbmFnZXJCYXNlLmdldHRpbmc9XHUzMGEyXHUzMGViXHUzMGI0XHUzMGVhXHUzMGJhXHUzMGUwIHswfSBcdTMwNmVcdTMwZTFcdTMwYzNcdTMwYmJcdTMwZmNcdTMwYjhcdTMwYzBcdTMwYTRcdTMwYjhcdTMwYTdcdTMwYjlcdTMwYzhcdTMwYjNcdTMwZjNcdTMwZGRcdTMwZmNcdTMwY2RcdTMwZjNcdTMwYzhcdTMwOTJcdTUzZDZcdTVmOTdcdTMwNTdcdTMwN2VcdTMwNTkKK21hbmFnZXJCYXNlLmdvdHRlbj1cdTMwZTFcdTMwYzNcdTMwYmJcdTMwZmNcdTMwYjhcdTMwYzBcdTMwYTRcdTMwYjhcdTMwYTdcdTMwYjlcdTMwYzhcdTMwYjNcdTMwZjNcdTMwZGRcdTMwZmNcdTMwY2RcdTMwZjNcdTMwYzhcdTMwNmVcdTUzZDZcdTVmOTdcdTMwOTJcdTViOGNcdTRlODZcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWYKK21hbmFnZXJCYXNlLnJhbmRvbT1cdTMwYWZcdTMwZTlcdTMwYjkgezB9IFx1MzA2ZVx1NGU3MVx1NjU3MFx1NzY3YVx1NzUxZlx1NTY2OFx1MzA2ZVx1NTIxZFx1NjcxZlx1NTMxNlx1MzA2ZVx1NGY4Ylx1NTkxNlx1MzA2N1x1MzA1OQorbWFuYWdlckJhc2Uuc2VlZGluZz1cdTRlNzFcdTY1NzBcdTc2N2FcdTc1MWZcdTU2NjhcdTMwYWZcdTMwZTlcdTMwYjkgezB9IFx1MzA2ZVx1MzBiN1x1MzBmY1x1MzBjOVx1MzA5Mlx1NzUxZlx1NjIxMFx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OQorc2VydmVyU2Vzc2lvbi52YWx1ZS5pYWU9bnVsbFx1NTAyNFx1MzA2N1x1MzA1OQorc3RhbmRhcmRNYW5hZ2VyLmFscmVhZHlTdGFydGVkPVx1MzBkZVx1MzBjZFx1MzBmY1x1MzBiOFx1MzBlM1x1MzA2Zlx1NjVlMlx1MzA2Ylx1OGQ3N1x1NTJkNVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OQorc3RhbmRhcmRNYW5hZ2VyLmNyZWF0ZVNlc3Npb24uaXNlPWNyZWF0ZVNlc3Npb246IFx1MzBhMlx1MzBhZlx1MzBjNlx1MzBhM1x1MzBkNlx1MzBiYlx1MzBjM1x1MzBiN1x1MzBlN1x1MzBmM1x1MzA0Y1x1NTkxYVx1MzA1OVx1MzA0ZVx1MzA3ZVx1MzA1OQorc3RhbmRhcmRNYW5hZ2VyLmV4cGlyZUV4Y2VwdGlvbj1wcm9jZXNzc0V4cGlyZTogXHUzMGJiXHUzMGMzXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDZlXHU3ZDQyXHU0ZTg2XHU1MWU2XHU3NDA2XHU0ZTJkXHUzMDZlXHU0ZjhiXHU1OTE2XHUzMDY3XHUzMDU5CitzdGFuZGFyZE1hbmFnZXIubG9hZGluZz17MH0gXHUzMDRiXHUzMDg5XHU2MzAxXHU3ZDlhXHUzMDU1XHUzMDhjXHUzMDVmXHUzMGJiXHUzMGMzXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDkyXHUzMGVkXHUzMGZjXHUzMGM5XHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5CitzdGFuZGFyZE1hbmFnZXIubG9hZGluZy5jbmZlPVx1NjMwMVx1N2Q5YVx1MzA1NVx1MzA4Y1x1MzA1Zlx1MzBiYlx1MzBjM1x1MzBiN1x1MzBlN1x1MzBmM1x1MzA5Mlx1MzBlZFx1MzBmY1x1MzBjOVx1NGUyZFx1MzA2YkNsYXNzTm90Rm91bmRFeGNlcHRpb25cdTMwNGNcdTc2N2FcdTc1MWZcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWY6IHswfQorc3RhbmRhcmRNYW5hZ2VyLmxvYWRpbmcuaW9lPVx1NjMwMVx1N2Q5YVx1MzA1NVx1MzA4Y1x1MzA1Zlx1MzBiYlx1MzBjM1x1MzBiN1x1MzBlN1x1MzBmM1x1MzA5Mlx1MzBlZFx1MzBmY1x1MzBjOVx1NGUyZFx1MzA2ZUlPRXhjZXB0aW9uXHUzMDY3XHUzMDU5OiB7MH0KK3N0YW5kYXJkTWFuYWdlci5ub3RTdGFydGVkPVx1MzBkZVx1MzBjZFx1MzBmY1x1MzBiOFx1MzBlM1x1MzA2Zlx1MzA3ZVx1MzA2MFx1OGQ3N1x1NTJkNVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5Mworc3RhbmRhcmRNYW5hZ2VyLnNlc3Npb25UaW1lb3V0PVx1NzEyMVx1NTJiOVx1MzA2YVx1MzBiYlx1MzBjM1x1MzBiN1x1MzBlN1x1MzBmM1x1MzBiZlx1MzBhNFx1MzBlMFx1MzBhMlx1MzBhNlx1MzBjOFx1OGEyZFx1NWI5YVx1MzA2N1x1MzA1OSB7MH0KK3N0YW5kYXJkTWFuYWdlci51bmxvYWRpbmc9XHU2MzAxXHU3ZDlhXHUzMDU1XHUzMDhjXHUzMDVmXHUzMGJiXHUzMGMzXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDkyIHswfSBcdTMwNmJcdTRmZGRcdTViNThcdTMwNTdcdTMwN2VcdTMwNTkKK3N0YW5kYXJkTWFuYWdlci51bmxvYWRpbmcuaW9lPVx1NjMwMVx1N2Q5YVx1MzA1NVx1MzA4Y1x1MzA1Zlx1MzBiYlx1MzBjM1x1MzBiN1x1MzBlN1x1MzBmM1x1MzA2ZVx1NGZkZFx1NWI1OFx1NGUyZFx1MzA2ZUlPRXhjZXB0aW9uXHUzMDY3XHUzMDU5OiB7MH0KK3N0YW5kYXJkTWFuYWdlci5tYW5hZ2VyTG9hZD1cdTZjMzhcdTdkOWFcdThhMThcdTYxYjZcdTg4YzVcdTdmNmVcdTMwNGJcdTMwODlcdTMwYmJcdTMwYzNcdTMwYjdcdTMwZTdcdTMwZjNcdTMwOTJcdTMwZWRcdTMwZmNcdTMwYzlcdTRlMmRcdTMwNmVcdTRmOGJcdTU5MTZcdTMwNjdcdTMwNTkKK3N0YW5kYXJkTWFuYWdlci5tYW5hZ2VyVW5sb2FkPVx1NmMzOFx1N2Q5YVx1OGExOFx1NjFiNlx1ODhjNVx1N2Y2ZVx1MzA2Ylx1MzBiYlx1MzBjM1x1MzBiN1x1MzBlN1x1MzBmM1x1MzA5Mlx1MzBhMlx1MzBmM1x1MzBlZFx1MzBmY1x1MzBjOVx1NGUyZFx1MzA2ZVx1NGY4Ylx1NTkxNlx1MzA2N1x1MzA1OQorc3RhbmRhcmRTZXNzaW9uLmF0dHJpYnV0ZUV2ZW50PVx1MzBiYlx1MzBjM1x1MzBiN1x1MzBlN1x1MzBmM1x1NWM1ZVx1NjAyN1x1MzBhNFx1MzBkOVx1MzBmM1x1MzBjOFx1MzBlYVx1MzBiOVx1MzBjYVx1MzA0Y1x1NGY4Ylx1NTkxNlx1MzA5Mlx1NjI5NVx1MzA1Mlx1MzA3ZVx1MzA1N1x1MzA1Zgorc3RhbmRhcmRTZXNzaW9uLmJpbmRpbmdFdmVudD1cdTMwYmJcdTMwYzNcdTMwYjdcdTMwZTdcdTMwZjNcdTMwZDBcdTMwYTRcdTMwZjNcdTMwYzdcdTMwYTNcdTMwZjNcdTMwYjBcdTMwYTRcdTMwZDlcdTMwZjNcdTMwYzhcdTMwZWFcdTMwYjlcdTMwY2FcdTMwNGNcdTRmOGJcdTU5MTZcdTMwOTJcdTYyOTVcdTMwNTJcdTMwN2VcdTMwNTdcdTMwNWYKK3N0YW5kYXJkU2Vzc2lvbi5pbnZhbGlkYXRlLmlzZT1pbnZhbGlkYXRlOiBcdTMwYmJcdTMwYzNcdTMwYjdcdTMwZTdcdTMwZjNcdTMwNmZcdTY1ZTJcdTMwNmJcdTcxMjFcdTUyYjlcdTUzMTZcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkKK3N0YW5kYXJkU2Vzc2lvbi5pc05ldy5pc2U9aXNOZXc6IFx1MzBiYlx1MzBjM1x1MzBiN1x1MzBlN1x1MzBmM1x1MzA2Zlx1NjVlMlx1MzA2Ylx1NzEyMVx1NTJiOVx1NTMxNlx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OQorc3RhbmRhcmRTZXNzaW9uLmdldEF0dHJpYnV0ZS5pc2U9Z2V0QXR0cmlidXRlOiBcdTMwYmJcdTMwYzNcdTMwYjdcdTMwZTdcdTMwZjNcdTMwNmZcdTY1ZTJcdTMwNmJcdTcxMjFcdTUyYjlcdTUzMTZcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkKK3N0YW5kYXJkU2Vzc2lvbi5nZXRBdHRyaWJ1dGVOYW1lcy5pc2U9Z2V0QXR0cmlidXRlTmFtZXM6IFx1MzBiYlx1MzBjM1x1MzBiN1x1MzBlN1x1MzBmM1x1MzA2Zlx1NjVlMlx1MzA2Ylx1NzEyMVx1NTJiOVx1NTMxNlx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OQorc3RhbmRhcmRTZXNzaW9uLmdldENyZWF0aW9uVGltZS5pc2U9Z2V0Q3JlYXRpb25UaW1lOiBcdTMwYmJcdTMwYzNcdTMwYjdcdTMwZTdcdTMwZjNcdTMwNmZcdTY1ZTJcdTMwNmJcdTcxMjFcdTUyYjlcdTUzMTZcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkKK3N0YW5kYXJkU2Vzc2lvbi5nZXRMYXN0QWNjZXNzZWRUaW1lLmlzZT1nZXRMYXN0QWNjZXNzZWRUaW1lOiBcdTMwYmJcdTMwYzNcdTMwYjdcdTMwZTdcdTMwZjNcdTMwNmZcdTY1ZTJcdTMwNmJcdTcxMjFcdTUyYjlcdTUzMTZcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkKK3N0YW5kYXJkU2Vzc2lvbi5nZXRNYXhJbmFjdGl2ZUludGVydmFsLmlzZT1nZXRNYXhJbmFjdGl2ZUludGVydmFsOiBcdTMwYmJcdTMwYzNcdTMwYjdcdTMwZTdcdTMwZjNcdTMwNmZcdTY1ZTJcdTMwNmJcdTcxMjFcdTUyYjlcdTUzMTZcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkKK3N0YW5kYXJkU2Vzc2lvbi5nZXRWYWx1ZU5hbWVzLmlzZT1nZXRBdHRyaWJ1dGVOYW1lczogXHUzMGJiXHUzMGMzXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDZmXHU2NWUyXHUzMDZiXHU3MTIxXHU1MmI5XHU1MzE2XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5CitzdGFuZGFyZFNlc3Npb24ubm90U2VyaWFsaXphYmxlPVx1MzBiYlx1MzBjM1x1MzBiN1x1MzBlN1x1MzBmMyB7MX0gXHUzMDZlXHUzMDVmXHUzMDgxXHUzMDZiXHUzMGJiXHUzMGMzXHUzMGI3XHUzMGU3XHUzMGYzXHU1YzVlXHU2MDI3IHswfSBcdTMwOTJcdTMwYjdcdTMwZWFcdTMwYTJcdTMwZTlcdTMwYTRcdTMwYmFcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMKK3N0YW5kYXJkU2Vzc2lvbi5yZW1vdmVBdHRyaWJ1dGUuaXNlPXJlbW92ZUF0dHJpYnV0ZTogXHUzMGJiXHUzMGMzXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDZmXHU2NWUyXHUzMDZiXHU3MTIxXHU1MmI5XHU1MzE2XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5CitzdGFuZGFyZFNlc3Npb24uc2Vzc2lvbkV2ZW50PVx1MzBiYlx1MzBjM1x1MzBiN1x1MzBlN1x1MzBmM1x1MzBhNFx1MzBkOVx1MzBmM1x1MzBjOFx1MzBlYVx1MzBiOVx1MzBjYVx1MzA0Y1x1NGY4Ylx1NTkxNlx1MzA5Mlx1NjI5NVx1MzA1Mlx1MzA3ZVx1MzA1N1x1MzA1Zgorc3RhbmRhcmRTZXNzaW9uLnNldEF0dHJpYnV0ZS5pYWU9c2V0QXR0cmlidXRlOiBcdTMwYjdcdTMwZWFcdTMwYTJcdTMwZTlcdTMwYTRcdTMwYmFcdTMwNjdcdTMwNGRcdTMwNmFcdTMwNDRcdTVjNWVcdTYwMjdcdTMwNjdcdTMwNTkKK3N0YW5kYXJkU2Vzc2lvbi5zZXRBdHRyaWJ1dGUuaXNlPXNldEF0dHJpYnV0ZTogXHUzMGJiXHUzMGMzXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDZmXHU2NWUyXHUzMDZiXHU3MTIxXHU1MmI5XHU1MzE2XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5CitzdGFuZGFyZFNlc3Npb24uc2V0QXR0cmlidXRlLm5hbWVudWxsPXNldEF0dHJpYnV0ZTogbmFtZVx1MzBkMVx1MzBlOVx1MzBlMVx1MzBiZlx1MzA2Zm51bGxcdTMwNjdcdTMwNDJcdTMwNjNcdTMwNjZcdTMwNmZcdTMwNDRcdTMwNTFcdTMwN2VcdTMwNWJcdTMwOTMKK3N0YW5kYXJkU2Vzc2lvbi5zZXNzaW9uQ3JlYXRlZD1cdTMwYmJcdTMwYzNcdTMwYjdcdTMwZTdcdTMwZjNJRCA9IHswfSBcdTMwOTJcdTc1MWZcdTYyMTBcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWYKK3BlcnNpc3RlbnRNYW5hZ2VyLmxvYWRpbmc9ezB9IFx1MzA2ZVx1NjMwMVx1N2Q5YVx1MzA1NVx1MzA4Y1x1MzA1Zlx1MzBiYlx1MzBjM1x1MzBiN1x1MzBlN1x1MzBmM1x1MzA5Mlx1MzBlZFx1MzBmY1x1MzBjOVx1MzA1N1x1MzA3ZVx1MzA1OQorcGVyc2lzdGVudE1hbmFnZXIudW5sb2FkaW5nPXswfSBcdTMwNmVcdTYzMDFcdTdkOWFcdTMwNTVcdTMwOGNcdTMwNWZcdTMwYmJcdTMwYzNcdTMwYjdcdTMwZTdcdTMwZjNcdTMwOTJcdTRmZGRcdTViNThcdTMwNTdcdTMwN2VcdTMwNTkKK3BlcnNpc3RlbnRNYW5hZ2VyLmV4cGlyaW5nPSB7MH0gXHUzMDZlXHUzMGJiXHUzMGMzXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDkyXHU0ZmRkXHU1YjU4XHUzMDU5XHUzMDhiXHU1MjRkXHUzMDZiXHU2NzFmXHU5NjUwXHU1MjA3XHUzMDhjXHUzMDZiXHUzMDZhXHUzMDhhXHUzMDdlXHUzMDU3XHUzMDVmCitwZXJzaXN0ZW50TWFuYWdlci5kZXNlcmlhbGl6ZUVycm9yPVx1MzBiYlx1MzBjM1x1MzBiN1x1MzBlN1x1MzBmMyB7MH0gXHUzMDkyXHUzMGM3XHUzMGI3XHUzMGVhXHUzMGEyXHUzMGU5XHUzMGE0XHUzMGJhXHU0ZTJkXHUzMDZlXHUzMGE4XHUzMGU5XHUzMGZjXHUzMDY3XHUzMDU5OiB7MX0KK3BlcnNpc3RlbnRNYW5hZ2VyLnNlcmlhbGl6ZUVycm9yPVx1MzBiYlx1MzBjM1x1MzBiN1x1MzBlN1x1MzBmMyB7MH0gXHUzMDkyXHUzMGI3XHUzMGVhXHUzMGEyXHUzMGU5XHUzMGE0XHUzMGJhXHU0ZTJkXHUzMDZlXHUzMGE4XHUzMGU5XHUzMGZjXHUzMDY3XHUzMDU5OiB7MX0KK3BlcnNpc3RlbnRNYW5hZ2VyLnN3YXBNYXhJZGxlPXsxfVx1NzlkMlx1OTU5M1x1MzBhMlx1MzBhNFx1MzBjOVx1MzBlYlx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA4Ylx1MzBiYlx1MzBjM1x1MzBiN1x1MzBlN1x1MzBmMyB7MH0gXHUzMDkyXHU0ZmRkXHU1YjU4XHUzMDU5XHUzMDhiXHUzMDVmXHUzMDgxXHUzMDZiXHUzMGI5XHUzMGVmXHUzMGMzXHUzMGQ3XHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5CitwZXJzaXN0ZW50TWFuYWdlci5iYWNrdXBNYXhJZGxlPXsxfVx1NzlkMlx1OTU5M1x1MzBhMlx1MzBhNFx1MzBjOVx1MzBlYlx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA4Ylx1MzBiYlx1MzBjM1x1MzBiN1x1MzBlN1x1MzBmMyB7MH0gXHUzMDkyXHU0ZmRkXHU1YjU4XHUzMDU5XHUzMDhiXHUzMDVmXHUzMDgxXHUzMDZiXHUzMGQwXHUzMGMzXHUzMGFmXHUzMGEyXHUzMGMzXHUzMGQ3XHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5CitwZXJzaXN0ZW50TWFuYWdlci5iYWNrdXBFeGNlcHRpb249XHUzMGJiXHUzMGMzXHUzMGI3XHUzMGU3XHUzMGYzIHswfSBcdTMwOTJcdTMwZDBcdTMwYzNcdTMwYWZcdTMwYTJcdTMwYzNcdTMwZDdcdTMwNTlcdTMwOGJcdTY2NDJcdTMwNmJcdTRmOGJcdTU5MTZcdTMwNGNcdTc2N2FcdTc1MWZcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWY6IHsxfQorcGVyc2lzdGVudE1hbmFnZXIudG9vTWFueUFjdGl2ZT1cdTMwYTJcdTMwYWZcdTMwYzZcdTMwYTNcdTMwZDZcdTMwYmJcdTMwYzNcdTMwYjdcdTMwZTdcdTMwZjNcdTMwNGNcdTU5MWFcdTMwNTlcdTMwNGVcdTMwN2VcdTMwNTlcdTMwMDF7MH1cdTMwMDFcdTMwYjlcdTMwZWZcdTMwYzNcdTMwZDdcdTMwYTJcdTMwYTZcdTMwYzhcdTMwNTlcdTMwOGJcdTMwNWZcdTMwODFcdTMwNmJcdTMwYTJcdTMwYTRcdTMwYzlcdTMwZWJcdTMwYmJcdTMwYzNcdTMwYjdcdTMwZTdcdTMwZjNcdTMwOTJcdTYzYTJcdTMwNTdcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkKK3BlcnNpc3RlbnRNYW5hZ2VyLnN3YXBUb29NYW55QWN0aXZlPVx1MzBiYlx1MzBjM1x1MzBiN1x1MzBlN1x1MzBmM1x1MzA0Y1x1NTkxYVx1MzA1OVx1MzA0ZVx1MzA4Ylx1MzA2ZVx1MzA2N1x1MzAwMXsxfVx1NzlkMlx1MzBhMlx1MzBhNFx1MzBjOVx1MzBlYlx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA4Ylx1MzBiYlx1MzBjM1x1MzBiN1x1MzBlN1x1MzBmMyB7MH0gXHUzMDkyXHUzMGI5XHUzMGVmXHUzMGMzXHUzMGQ3XHUzMGEyXHUzMGE2XHUzMGM4XHUzMDU3XHUzMDdlXHUzMDU5CitwZXJzaXN0ZW50TWFuYWdlci5wcm9jZXNzU3dhcHM9XHUzMGJiXHUzMGMzXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDkyXHUzMGI5XHUzMGVmXHUzMGMzXHUzMGQ3XHUzMDU5XHUzMDhiXHUzMDVmXHUzMDgxXHUzMDZiXHUzMGMxXHUzMGE3XHUzMGMzXHUzMGFmXHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5LCBcdTMwZTFcdTMwZTJcdTMwZWFcdTRlMmRcdTMwNmIgezB9IFx1MzBhMlx1MzBhZlx1MzBjNlx1MzBhM1x1MzBkNlx1MzBiYlx1MzBjM1x1MzBiN1x1MzBlN1x1MzBmM1x1MzA0Y1x1NWI1OFx1NTcyOFx1MzA1N1x1MzA3ZVx1MzA1OQorcGVyc2lzdGVudE1hbmFnZXIuYWN0aXZlU2Vzc2lvbj1cdTMwYmJcdTMwYzNcdTMwYjdcdTMwZTdcdTMwZjMgezB9IFx1MzA2ZnsxfVx1NzlkMlx1OTU5M1x1MzBhMlx1MzBhNFx1MzBjOVx1MzBlYlx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OQorcGVyc2lzdGVudE1hbmFnZXIuc3dhcEluPVx1MzBiYlx1MzBjM1x1MzBiN1x1MzBlN1x1MzBmMyB7MH0gXHUzMDkyXHUzMGI5XHUzMGVmXHUzMGMzXHUzMGQ3XHUzMGE0XHUzMGYzXHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc2Vzc2lvbi9NYW5hZ2VyQmFzZS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3Nlc3Npb24vTWFuYWdlckJhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDg0ODZmCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3Nlc3Npb24vTWFuYWdlckJhc2UuamF2YQpAQCAtMCwwICsxLDEwNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc2Vzc2lvbjsKKworCitpbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOworaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VTdXBwb3J0OworaW1wb3J0IGphdmEuaW8uRGF0YUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3Q7CitpbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOworCitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblJlZ2lzdHJhdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGFpbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuRW5naW5lOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlNlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRIb3N0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5TdHJpbmdNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5tb2RlbGVyLlJlZ2lzdHJ5OworCisKKy8qKgorICogTWluaW1hbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgPGI+TWFuYWdlcjwvYj4gaW50ZXJmYWNlIHRoYXQgc3VwcG9ydHMKKyAqIG5vIHNlc3Npb24gcGVyc2lzdGVuY2Ugb3IgZGlzdHJpYnV0YWJsZSBjYXBhYmlsaXRpZXMuICBUaGlzIGNsYXNzIG1heQorICogYmUgc3ViY2xhc3NlZCB0byBjcmVhdGUgbW9yZSBzb3BoaXN0aWNhdGVkIE1hbmFnZXIgaW1wbGVtZW50YXRpb25zLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTWFuYWdlckJhc2UgaW1wbGVtZW50cyBNYW5hZ2VyLCBNQmVhblJlZ2lzdHJhdGlvbiB7CisgICAgcHJvdGVjdGVkIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhNYW5hZ2VyQmFzZS5jbGFzcyk7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworICAgIHByb3RlY3RlZCBEYXRhSW5wdXRTdHJlYW0gcmFuZG9tSVM9bnVsbDsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGRldlJhbmRvbVNvdXJjZT0iL2Rldi91cmFuZG9tIjsKKworICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IG1lc3NhZ2UgZGlnZXN0IGFsZ29yaXRobSB0byB1c2UgaWYgd2UgY2Fubm90IHVzZQorICAgICAqIHRoZSByZXF1ZXN0ZWQgb25lLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQUxHT1JJVEhNID0gIk1ENSI7CisKKworICAgIC8qKgorICAgICAqIFRoZSBtZXNzYWdlIGRpZ2VzdCBhbGdvcml0aG0gdG8gYmUgdXNlZCB3aGVuIGdlbmVyYXRpbmcgc2Vzc2lvbgorICAgICAqIGlkZW50aWZpZXJzLiAgVGhpcyBtdXN0IGJlIGFuIGFsZ29yaXRobSBzdXBwb3J0ZWQgYnkgdGhlCisgICAgICogPGNvZGU+amF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0PC9jb2RlPiBjbGFzcyBvbiB5b3VyIHBsYXRmb3JtLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgYWxnb3JpdGhtID0gREVGQVVMVF9BTEdPUklUSE07CisKKworICAgIC8qKgorICAgICAqIFRoZSBDb250YWluZXIgd2l0aCB3aGljaCB0aGlzIE1hbmFnZXIgaXMgYXNzb2NpYXRlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ29udGFpbmVyIGNvbnRhaW5lcjsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBNZXNzYWdlRGlnZXN0IGltcGxlbWVudGF0aW9uIHRvIGJlIHVzZWQgd2hlbgorICAgICAqIGNyZWF0aW5nIHNlc3Npb24gaWRlbnRpZmllcnMuCisgICAgICovCisgICAgcHJvdGVjdGVkIE1lc3NhZ2VEaWdlc3QgZGlnZXN0ID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIGRpc3RyaWJ1dGFibGUgZmxhZyBmb3IgU2Vzc2lvbnMgY3JlYXRlZCBieSB0aGlzIE1hbmFnZXIuICBJZiB0aGlzCisgICAgICogZmxhZyBpcyBzZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4sIGFueSB1c2VyIGF0dHJpYnV0ZXMgYWRkZWQgdG8gYQorICAgICAqIHNlc3Npb24gY29udHJvbGxlZCBieSB0aGlzIE1hbmFnZXIgbXVzdCBiZSBTZXJpYWxpemFibGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gZGlzdHJpYnV0YWJsZTsKKworCisgICAgLyoqCisgICAgICogQSBTdHJpbmcgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyIHVzZWQgdG8gaW5jcmVhc2UgdGhlIGVudHJvcHkgb2YKKyAgICAgKiB0aGUgaW5pdGlhbGl6YXRpb24gb2Ygb3VyIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZW50cm9weSA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBzdHJpbmcgZm9yIHRoaXMgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGluZm8gPSAiTWFuYWdlckJhc2UvMS4wIjsKKworCisgICAgLyoqCisgICAgICogVGhlIGRlZmF1bHQgbWF4aW11bSBpbmFjdGl2ZSBpbnRlcnZhbCBmb3IgU2Vzc2lvbnMgY3JlYXRlZCBieQorICAgICAqIHRoaXMgTWFuYWdlci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IG1heEluYWN0aXZlSW50ZXJ2YWwgPSA2MDsKKworCisgICAgLyoqCisgICAgICogVGhlIHNlc3Npb24gaWQgbGVuZ3RoIG9mIFNlc3Npb25zIGNyZWF0ZWQgYnkgdGhpcyBNYW5hZ2VyLgorICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgc2Vzc2lvbklkTGVuZ3RoID0gMTY7CisKKworICAgIC8qKgorICAgICAqIFRoZSBkZXNjcmlwdGl2ZSBuYW1lIG9mIHRoaXMgTWFuYWdlciBpbXBsZW1lbnRhdGlvbiAoZm9yIGxvZ2dpbmcpLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIG5hbWUgPSAiTWFuYWdlckJhc2UiOworCisKKyAgICAvKioKKyAgICAgKiBBIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIHRvIHVzZSB3aGVuIGdlbmVyYXRpbmcgc2Vzc2lvbiBpZGVudGlmaWVycy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUmFuZG9tIHJhbmRvbSA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBKYXZhIGNsYXNzIG5hbWUgb2YgdGhlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGNsYXNzIHRvIGJlIHVzZWQKKyAgICAgKiB3aGVuIGdlbmVyYXRpbmcgc2Vzc2lvbiBpZGVudGlmaWVycy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHJhbmRvbUNsYXNzID0gImphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tIjsKKworCisgICAgLyoqCisgICAgICogVGhlIGxvbmdlc3QgdGltZSAoaW4gc2Vjb25kcykgdGhhdCBhbiBleHBpcmVkIHNlc3Npb24gaGFkIGJlZW4gYWxpdmUuCisgICAgICovCisgICAgcHJvdGVjdGVkIGludCBzZXNzaW9uTWF4QWxpdmVUaW1lOworCisKKyAgICAvKioKKyAgICAgKiBBdmVyYWdlIHRpbWUgKGluIHNlY29uZHMpIHRoYXQgZXhwaXJlZCBzZXNzaW9ucyBoYWQgYmVlbiBhbGl2ZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IHNlc3Npb25BdmVyYWdlQWxpdmVUaW1lOworCisKKyAgICAvKioKKyAgICAgKiBOdW1iZXIgb2Ygc2Vzc2lvbnMgdGhhdCBoYXZlIGV4cGlyZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIGludCBleHBpcmVkU2Vzc2lvbnMgPSAwOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc2V0IG9mIGN1cnJlbnRseSBhY3RpdmUgU2Vzc2lvbnMgZm9yIHRoaXMgTWFuYWdlciwga2V5ZWQgYnkKKyAgICAgKiBzZXNzaW9uIGlkZW50aWZpZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIEhhc2hNYXAgc2Vzc2lvbnMgPSBuZXcgSGFzaE1hcCgpOworCisgICAgLy8gTnVtYmVyIG9mIHNlc3Npb25zIGNyZWF0ZWQgYnkgdGhpcyBtYW5hZ2VyCisgICAgcHJvdGVjdGVkIGludCBzZXNzaW9uQ291bnRlcj0wOworCisgICAgcHJvdGVjdGVkIGludCBtYXhBY3RpdmU9MDsKKworICAgIC8vIG51bWJlciBvZiBkdXBsaWNhdGVkIHNlc3Npb24gaWRzIC0gYW55dGhpbmcgPjAgbWVhbnMgd2UgaGF2ZSBwcm9ibGVtcworICAgIHByb3RlY3RlZCBpbnQgZHVwbGljYXRlcz0wOworCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaW5pdGlhbGl6ZWQ9ZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBUaGUgc3RyaW5nIG1hbmFnZXIgZm9yIHRoaXMgcGFja2FnZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZ01hbmFnZXIgc20gPQorICAgICAgICBTdHJpbmdNYW5hZ2VyLmdldE1hbmFnZXIoQ29uc3RhbnRzLlBhY2thZ2UpOworCisgICAgLyoqCisgICAgICogVGhlIHByb3BlcnR5IGNoYW5nZSBzdXBwb3J0IGZvciB0aGlzIGNvbXBvbmVudC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VTdXBwb3J0IHN1cHBvcnQgPSBuZXcgUHJvcGVydHlDaGFuZ2VTdXBwb3J0KHRoaXMpOworICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU2VjdXJpdHkgY2xhc3NlcworICAgIHByaXZhdGUgY2xhc3MgUHJpdmlsZWdlZFNldFJhbmRvbUZpbGUgaW1wbGVtZW50cyBQcml2aWxlZ2VkQWN0aW9ueworICAgICAgICAKKyAgICAgICAgcHVibGljIE9iamVjdCBydW4oKXsgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgRmlsZSBmPW5ldyBGaWxlKCBkZXZSYW5kb21Tb3VyY2UgKTsKKyAgICAgICAgICAgICAgICBpZiggISBmLmV4aXN0cygpICkgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgcmFuZG9tSVM9IG5ldyBEYXRhSW5wdXRTdHJlYW0oIG5ldyBGaWxlSW5wdXRTdHJlYW0oZikpOworICAgICAgICAgICAgICAgIHJhbmRvbUlTLnJlYWRMb25nKCk7CisgICAgICAgICAgICAgICAgaWYoIGxvZy5pc0RlYnVnRW5hYmxlZCgpICkKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCAiT3BlbmluZyAiICsgZGV2UmFuZG9tU291cmNlICk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJhbmRvbUlTOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbWVzc2FnZSBkaWdlc3QgYWxnb3JpdGhtIGZvciB0aGlzIE1hbmFnZXIuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRBbGdvcml0aG0oKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLmFsZ29yaXRobSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbWVzc2FnZSBkaWdlc3QgYWxnb3JpdGhtIGZvciB0aGlzIE1hbmFnZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWxnb3JpdGhtIFRoZSBuZXcgbWVzc2FnZSBkaWdlc3QgYWxnb3JpdGhtCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QWxnb3JpdGhtKFN0cmluZyBhbGdvcml0aG0pIHsKKworICAgICAgICBTdHJpbmcgb2xkQWxnb3JpdGhtID0gdGhpcy5hbGdvcml0aG07CisgICAgICAgIHRoaXMuYWxnb3JpdGhtID0gYWxnb3JpdGhtOworICAgICAgICBzdXBwb3J0LmZpcmVQcm9wZXJ0eUNoYW5nZSgiYWxnb3JpdGhtIiwgb2xkQWxnb3JpdGhtLCB0aGlzLmFsZ29yaXRobSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgQ29udGFpbmVyIHdpdGggd2hpY2ggdGhpcyBNYW5hZ2VyIGlzIGFzc29jaWF0ZWQuCisgICAgICovCisgICAgcHVibGljIENvbnRhaW5lciBnZXRDb250YWluZXIoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLmNvbnRhaW5lcik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgQ29udGFpbmVyIHdpdGggd2hpY2ggdGhpcyBNYW5hZ2VyIGlzIGFzc29jaWF0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBuZXdseSBhc3NvY2lhdGVkIENvbnRhaW5lcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbnRhaW5lcihDb250YWluZXIgY29udGFpbmVyKSB7CisKKyAgICAgICAgQ29udGFpbmVyIG9sZENvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyOworICAgICAgICB0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lcjsKKyAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoImNvbnRhaW5lciIsIG9sZENvbnRhaW5lciwgdGhpcy5jb250YWluZXIpOworICAgICAgICAvLyBUT0RPOiBmaW5kIGEgZ29vZCBzY2hlbWUgZm9yIHRoZSBsb2cgbmFtZXMKKyAgICAgICAgLy9sb2c9TG9nRmFjdG9yeS5nZXRMb2coInRvbWNhdC5tYW5hZ2VyLiIgKyBjb250YWluZXIuZ2V0TmFtZSgpKTsKKyAgICB9CisKKworICAgIC8qKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIE1lc3NhZ2VEaWdlc3Qgb2JqZWN0IHRvIGJlIHVzZWQgZm9yIGNhbGN1bGF0aW5nCisgICAgICogc2Vzc2lvbiBpZGVudGlmaWVycy4gIElmIG5vbmUgaGFzIGJlZW4gY3JlYXRlZCB5ZXQsIGluaXRpYWxpemUKKyAgICAgKiBvbmUgdGhlIGZpcnN0IHRpbWUgdGhpcyBtZXRob2QgaXMgY2FsbGVkLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgTWVzc2FnZURpZ2VzdCBnZXREaWdlc3QoKSB7CisKKyAgICAgICAgaWYgKHRoaXMuZGlnZXN0ID09IG51bGwpIHsKKyAgICAgICAgICAgIGxvbmcgdDE9U3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKHNtLmdldFN0cmluZygibWFuYWdlckJhc2UuZ2V0dGluZyIsIGFsZ29yaXRobSkpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB0aGlzLmRpZ2VzdCA9IE1lc3NhZ2VEaWdlc3QuZ2V0SW5zdGFuY2UoYWxnb3JpdGhtKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKHNtLmdldFN0cmluZygibWFuYWdlckJhc2UuZGlnZXN0IiwgYWxnb3JpdGhtKSwgZSk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5kaWdlc3QgPSBNZXNzYWdlRGlnZXN0LmdldEluc3RhbmNlKERFRkFVTFRfQUxHT1JJVEhNKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gZikgeworICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3Ioc20uZ2V0U3RyaW5nKCJtYW5hZ2VyQmFzZS5kaWdlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfQUxHT1JJVEhNKSwgZSk7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuZGlnZXN0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKHNtLmdldFN0cmluZygibWFuYWdlckJhc2UuZ290dGVuIikpOworICAgICAgICAgICAgbG9uZyB0Mj1TeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgIGlmKCBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSApCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJnZXREaWdlc3QoKSAiICsgKHQyLXQxKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKHRoaXMuZGlnZXN0KTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBkaXN0cmlidXRhYmxlIGZsYWcgZm9yIHRoZSBzZXNzaW9ucyBzdXBwb3J0ZWQgYnkKKyAgICAgKiB0aGlzIE1hbmFnZXIuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0RGlzdHJpYnV0YWJsZSgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMuZGlzdHJpYnV0YWJsZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZGlzdHJpYnV0YWJsZSBmbGFnIGZvciB0aGUgc2Vzc2lvbnMgc3VwcG9ydGVkIGJ5IHRoaXMKKyAgICAgKiBNYW5hZ2VyLiAgSWYgdGhpcyBmbGFnIGlzIHNldCwgYWxsIHVzZXIgZGF0YSBvYmplY3RzIGFkZGVkIHRvCisgICAgICogc2Vzc2lvbnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbWFuYWdlciBtdXN0IGltcGxlbWVudCBTZXJpYWxpemFibGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGlzdHJpYnV0YWJsZSBUaGUgbmV3IGRpc3RyaWJ1dGFibGUgZmxhZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERpc3RyaWJ1dGFibGUoYm9vbGVhbiBkaXN0cmlidXRhYmxlKSB7CisKKyAgICAgICAgYm9vbGVhbiBvbGREaXN0cmlidXRhYmxlID0gdGhpcy5kaXN0cmlidXRhYmxlOworICAgICAgICB0aGlzLmRpc3RyaWJ1dGFibGUgPSBkaXN0cmlidXRhYmxlOworICAgICAgICBzdXBwb3J0LmZpcmVQcm9wZXJ0eUNoYW5nZSgiZGlzdHJpYnV0YWJsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCb29sZWFuKG9sZERpc3RyaWJ1dGFibGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQm9vbGVhbih0aGlzLmRpc3RyaWJ1dGFibGUpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBlbnRyb3B5IGluY3JlYXNlciB2YWx1ZSwgb3IgY29tcHV0ZSBhIHNlbWktdXNlZnVsIHZhbHVlCisgICAgICogaWYgdGhpcyBTdHJpbmcgaGFzIG5vdCB5ZXQgYmVlbiBzZXQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRFbnRyb3B5KCkgeworCisgICAgICAgIC8vIENhbGN1bGF0ZSBhIHNlbWktdXNlZnVsIHZhbHVlIGlmIHRoaXMgaGFzIG5vdCBiZWVuIHNldAorICAgICAgICBpZiAodGhpcy5lbnRyb3B5ID09IG51bGwpCisgICAgICAgICAgICBzZXRFbnRyb3B5KHRoaXMudG9TdHJpbmcoKSk7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLmVudHJvcHkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGVudHJvcHkgaW5jcmVhc2VyIHZhbHVlLgorICAgICAqCisgICAgICogQHBhcmFtIGVudHJvcHkgVGhlIG5ldyBlbnRyb3B5IGluY3JlYXNlciB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEVudHJvcHkoU3RyaW5nIGVudHJvcHkpIHsKKworICAgICAgICBTdHJpbmcgb2xkRW50cm9weSA9IGVudHJvcHk7CisgICAgICAgIHRoaXMuZW50cm9weSA9IGVudHJvcHk7CisgICAgICAgIHN1cHBvcnQuZmlyZVByb3BlcnR5Q2hhbmdlKCJlbnRyb3B5Iiwgb2xkRW50cm9weSwgdGhpcy5lbnRyb3B5KTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgTWFuYWdlciBpbXBsZW1lbnRhdGlvbiBhbmQKKyAgICAgKiB0aGUgY29ycmVzcG9uZGluZyB2ZXJzaW9uIG51bWJlciwgaW4gdGhlIGZvcm1hdAorICAgICAqIDxjb2RlPiZsdDtkZXNjcmlwdGlvbiZndDsvJmx0O3ZlcnNpb24mZ3Q7PC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEluZm8oKSB7CisKKyAgICAgICAgcmV0dXJuIChpbmZvKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBkZWZhdWx0IG1heGltdW0gaW5hY3RpdmUgaW50ZXJ2YWwgKGluIHNlY29uZHMpCisgICAgICogZm9yIFNlc3Npb25zIGNyZWF0ZWQgYnkgdGhpcyBNYW5hZ2VyLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0TWF4SW5hY3RpdmVJbnRlcnZhbCgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMubWF4SW5hY3RpdmVJbnRlcnZhbCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZGVmYXVsdCBtYXhpbXVtIGluYWN0aXZlIGludGVydmFsIChpbiBzZWNvbmRzKQorICAgICAqIGZvciBTZXNzaW9ucyBjcmVhdGVkIGJ5IHRoaXMgTWFuYWdlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnRlcnZhbCBUaGUgbmV3IGRlZmF1bHQgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNYXhJbmFjdGl2ZUludGVydmFsKGludCBpbnRlcnZhbCkgeworCisgICAgICAgIGludCBvbGRNYXhJbmFjdGl2ZUludGVydmFsID0gdGhpcy5tYXhJbmFjdGl2ZUludGVydmFsOworICAgICAgICB0aGlzLm1heEluYWN0aXZlSW50ZXJ2YWwgPSBpbnRlcnZhbDsKKyAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoIm1heEluYWN0aXZlSW50ZXJ2YWwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSW50ZWdlcihvbGRNYXhJbmFjdGl2ZUludGVydmFsKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEludGVnZXIodGhpcy5tYXhJbmFjdGl2ZUludGVydmFsKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHNlc3Npb24gaWQgbGVuZ3RoIChpbiBieXRlcykgb2YgU2Vzc2lvbnMgY3JlYXRlZCBieQorICAgICAqIHRoaXMgTWFuYWdlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIHNlc3Npb24gaWQgbGVuZ3RoCisgICAgICovCisgICAgcHVibGljIGludCBnZXRTZXNzaW9uSWRMZW5ndGgoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLnNlc3Npb25JZExlbmd0aCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHNlc3Npb24gaWQgbGVuZ3RoIChpbiBieXRlcykgZm9yIFNlc3Npb25zIGNyZWF0ZWQgYnkgdGhpcworICAgICAqIE1hbmFnZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaWRMZW5ndGggVGhlIHNlc3Npb24gaWQgbGVuZ3RoCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2Vzc2lvbklkTGVuZ3RoKGludCBpZExlbmd0aCkgeworCisgICAgICAgIGludCBvbGRTZXNzaW9uSWRMZW5ndGggPSB0aGlzLnNlc3Npb25JZExlbmd0aDsKKyAgICAgICAgdGhpcy5zZXNzaW9uSWRMZW5ndGggPSBpZExlbmd0aDsKKyAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoInNlc3Npb25JZExlbmd0aCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbnRlZ2VyKG9sZFNlc3Npb25JZExlbmd0aCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbnRlZ2VyKHRoaXMuc2Vzc2lvbklkTGVuZ3RoKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZGVzY3JpcHRpdmUgc2hvcnQgbmFtZSBvZiB0aGlzIE1hbmFnZXIgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCisgICAgICAgIHJldHVybiAobmFtZSk7CisKKyAgICB9CisKKyAgICAvKiogCisgICAgICogVXNlIC9kZXYvcmFuZG9tLXR5cGUgc3BlY2lhbCBkZXZpY2UuIFRoaXMgaXMgbmV3IGNvZGUsIGJ1dCBtYXkgcmVkdWNlCisgICAgICogdGhlIGJpZyBkZWxheSBpbiBnZW5lcmF0aW5nIHRoZSByYW5kb20uCisgICAgICoKKyAgICAgKiAgWW91IG11c3Qgc3BlY2lmeSBhIHBhdGggdG8gYSByYW5kb20gZ2VuZXJhdG9yIGZpbGUuIFVzZSAvZGV2L3VyYW5kb20KKyAgICAgKiAgZm9yIGxpbnV4ICggb3Igc2ltaWxhciApIHN5c3RlbXMuIFVzZSAvZGV2L3JhbmRvbSBmb3IgbWF4aW11bSBzZWN1cml0eQorICAgICAqICAoIGl0IG1heSBibG9jayBpZiBub3QgZW5vdWdoICJyYW5kb20iIGV4aXN0ICkuIFlvdSBjYW4gYWxzbyB1c2UKKyAgICAgKiAgYSBwaXBlIHRoYXQgZ2VuZXJhdGVzIHJhbmRvbS4KKyAgICAgKgorICAgICAqICBUaGUgY29kZSB3aWxsIGNoZWNrIGlmIHRoZSBmaWxlIGV4aXN0cywgYW5kIGRlZmF1bHQgdG8gamF2YSBSYW5kb20KKyAgICAgKiAgaWYgbm90IGZvdW5kLiBUaGVyZSBpcyBhIHNpZ25pZmljYW50IHBlcmZvcm1hbmNlIGRpZmZlcmVuY2UsIHZlcnkKKyAgICAgKiAgdmlzaWJsZSBvbiB0aGUgZmlyc3QgY2FsbCB0byBnZXRTZXNzaW9uICggbGlrZSBpbiB0aGUgZmlyc3QgSlNQICkKKyAgICAgKiAgLSBzbyB1c2UgaXQgaWYgYXZhaWxhYmxlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJhbmRvbUZpbGUoIFN0cmluZyBzICkgeworICAgIC8vIGFzIGEgaGFjaywgeW91IGNhbiB1c2UgYSBzdGF0aWMgZmlsZSAtIGFuZCBnZW5hcmF0ZSB0aGUgc2FtZQorICAgIC8vIHNlc3Npb24gaWRzICggZ29vZCBmb3Igc3RyYW5nZSBkZWJ1Z2dpbmcgKQorICAgICAgICBpZiAoU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpICE9IG51bGwpeworICAgICAgICAgICAgICAgIHJhbmRvbUlTID0gKERhdGFJbnB1dFN0cmVhbSlBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZFNldFJhbmRvbUZpbGUoKSk7ICAgICAgICAgIAorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0cnl7CisgICAgICAgICAgICAgICAgICAgIGRldlJhbmRvbVNvdXJjZT1zOworICAgICAgICAgICAgICAgICAgICBGaWxlIGY9bmV3IEZpbGUoIGRldlJhbmRvbVNvdXJjZSApOworICAgICAgICAgICAgICAgICAgICBpZiggISBmLmV4aXN0cygpICkgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICByYW5kb21JUz0gbmV3IERhdGFJbnB1dFN0cmVhbSggbmV3IEZpbGVJbnB1dFN0cmVhbShmKSk7CisgICAgICAgICAgICAgICAgICAgIHJhbmRvbUlTLnJlYWRMb25nKCk7CisgICAgICAgICAgICAgICAgICAgIGlmKCBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSApCisgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoICJPcGVuaW5nICIgKyBkZXZSYW5kb21Tb3VyY2UgKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoKCBJT0V4Y2VwdGlvbiBleCApIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKwkJCXJhbmRvbUlTLmNsb3NlKCk7CisJCSAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oIkZhaWxlZCB0byBjbG9zZSByYW5kb21JUy4iKTsKKwkJICAgIH0KKworICAgICAgICAgICAgICAgICAgICByYW5kb21JUz1udWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFJhbmRvbUZpbGUoKSB7CisgICAgICAgIHJldHVybiBkZXZSYW5kb21Tb3VyY2U7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGluc3RhbmNlIHdlIHNob3VsZCB1c2UgZm9yCisgICAgICogZ2VuZXJhdGluZyBzZXNzaW9uIGlkZW50aWZpZXJzLiAgSWYgdGhlcmUgaXMgbm8gc3VjaCBnZW5lcmF0b3IKKyAgICAgKiBjdXJyZW50bHkgZGVmaW5lZCwgY29uc3RydWN0IGFuZCBzZWVkIGEgbmV3IG9uZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIFJhbmRvbSBnZXRSYW5kb20oKSB7CisgICAgICAgIGlmICh0aGlzLnJhbmRvbSA9PSBudWxsKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy5yYW5kb20gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIG5ldyByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBzZWVkCisgICAgICAgICAgICAgICAgICAgIGxvbmcgc2VlZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICAgICAgICAgICAgICBsb25nIHQxID0gc2VlZDsKKyAgICAgICAgICAgICAgICAgICAgY2hhciBlbnRyb3B5W10gPSBnZXRFbnRyb3B5KCkudG9DaGFyQXJyYXkoKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyb3B5Lmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb25nIHVwZGF0ZSA9ICgoYnl0ZSkgZW50cm9weVtpXSkgPDwgKChpICUgOCkgKiA4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlZWQgXj0gdXBkYXRlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb25zdHJ1Y3QgYW5kIHNlZWQgYSBuZXcgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzIGNsYXp6ID0gQ2xhc3MuZm9yTmFtZShyYW5kb21DbGFzcyk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJhbmRvbSA9IChSYW5kb20pIGNsYXp6Lm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJhbmRvbS5zZXRTZWVkKHNlZWQpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmFsbCBiYWNrIHRvIHRoZSBzaW1wbGUgY2FzZQorICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKHNtLmdldFN0cmluZygibWFuYWdlckJhc2UucmFuZG9tIiwgcmFuZG9tQ2xhc3MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yYW5kb20gPSBuZXcgamF2YS51dGlsLlJhbmRvbSgpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yYW5kb20uc2V0U2VlZChzZWVkKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBsb25nIHQyPVN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICAgICAgICAgICAgICBpZiggKHQyLXQxKSA+IDEwMCApCisgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoc20uZ2V0U3RyaW5nKCJtYW5hZ2VyQmFzZS5zZWVkaW5nIiwgcmFuZG9tQ2xhc3MpICsgIiAiICsgKHQyLXQxKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICh0aGlzLnJhbmRvbSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgY2xhc3MgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFJhbmRvbUNsYXNzKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5yYW5kb21DbGFzcyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgY2xhc3MgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByYW5kb21DbGFzcyBUaGUgbmV3IHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGNsYXNzIG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSYW5kb21DbGFzcyhTdHJpbmcgcmFuZG9tQ2xhc3MpIHsKKworICAgICAgICBTdHJpbmcgb2xkUmFuZG9tQ2xhc3MgPSB0aGlzLnJhbmRvbUNsYXNzOworICAgICAgICB0aGlzLnJhbmRvbUNsYXNzID0gcmFuZG9tQ2xhc3M7CisgICAgICAgIHN1cHBvcnQuZmlyZVByb3BlcnR5Q2hhbmdlKCJyYW5kb21DbGFzcyIsIG9sZFJhbmRvbUNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJhbmRvbUNsYXNzKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbnVtYmVyIG9mIHNlc3Npb25zIHRoYXQgaGF2ZSBleHBpcmVkLgorICAgICAqCisgICAgICogQHJldHVybiBOdW1iZXIgb2Ygc2Vzc2lvbnMgdGhhdCBoYXZlIGV4cGlyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEV4cGlyZWRTZXNzaW9ucygpIHsKKyAgICAgICAgcmV0dXJuIGV4cGlyZWRTZXNzaW9uczsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG51bWJlciBvZiBzZXNzaW9ucyB0aGF0IGhhdmUgZXhwaXJlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBleHBpcmVkU2Vzc2lvbnMgTnVtYmVyIG9mIHNlc3Npb25zIHRoYXQgaGF2ZSBleHBpcmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RXhwaXJlZFNlc3Npb25zKGludCBleHBpcmVkU2Vzc2lvbnMpIHsKKyAgICAgICAgdGhpcy5leHBpcmVkU2Vzc2lvbnMgPSBleHBpcmVkU2Vzc2lvbnM7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogSW1wbGVtZW50cyB0aGUgTWFuYWdlciBpbnRlcmZhY2UsIGRpcmVjdCBjYWxsIHRvIHByb2Nlc3NFeHBpcmVzCisgICAgICovCisgICAgcHVibGljIHZvaWQgYmFja2dyb3VuZFByb2Nlc3MoKSB7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBkZXN0cm95KCkgeworICAgICAgICBpZiggb25hbWUgIT0gbnVsbCApCisgICAgICAgICAgICBSZWdpc3RyeS5nZXRSZWdpc3RyeShudWxsLCBudWxsKS51bnJlZ2lzdGVyQ29tcG9uZW50KG9uYW1lKTsKKyAgICAgICAgaW5pdGlhbGl6ZWQ9ZmFsc2U7CisgICAgICAgIG9uYW1lID0gbnVsbDsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgaW5pdCgpIHsKKyAgICAgICAgaWYoIGluaXRpYWxpemVkICkgcmV0dXJuOworICAgICAgICBpbml0aWFsaXplZD10cnVlOyAgICAgICAgCisgICAgICAgIAorICAgICAgICBpZiggb25hbWU9PW51bGwgKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFN0YW5kYXJkQ29udGV4dCBjdHg9KFN0YW5kYXJkQ29udGV4dCl0aGlzLmdldENvbnRhaW5lcigpOworICAgICAgICAgICAgICAgIEVuZ2luZSBlbmc9KEVuZ2luZSljdHguZ2V0UGFyZW50KCkuZ2V0UGFyZW50KCk7CisgICAgICAgICAgICAgICAgZG9tYWluPWN0eC5nZXRFbmdpbmVOYW1lKCk7CisgICAgICAgICAgICAgICAgU3RhbmRhcmRIb3N0IGhzdD0oU3RhbmRhcmRIb3N0KWN0eC5nZXRQYXJlbnQoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IGN0eC5nZXRQYXRoKCk7CisgICAgICAgICAgICAgICAgaWYgKHBhdGguZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgICAgICAgICBwYXRoID0gIi8iOworICAgICAgICAgICAgICAgIH0gICAKKyAgICAgICAgICAgICAgICBvbmFtZT1uZXcgT2JqZWN0TmFtZShkb21haW4gKyAiOnR5cGU9TWFuYWdlcixwYXRoPSIKKyAgICAgICAgICAgICAgICArIHBhdGggKyAiLGhvc3Q9IiArIGhzdC5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIFJlZ2lzdHJ5LmdldFJlZ2lzdHJ5KG51bGwsIG51bGwpLnJlZ2lzdGVyQ29tcG9uZW50KHRoaXMsIG9uYW1lLCBudWxsICk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiRXJyb3IgcmVnaXN0ZXJpbmcgIixlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBsb2cuZGVidWcoIlJlZ2lzdGVyaW5nICIgKyBvbmFtZSApOworICAgICAgICAgICAgICAgCisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIHRoaXMgU2Vzc2lvbiB0byB0aGUgc2V0IG9mIGFjdGl2ZSBTZXNzaW9ucyBmb3IgdGhpcyBNYW5hZ2VyLgorICAgICAqCisgICAgICogQHBhcmFtIHNlc3Npb24gU2Vzc2lvbiB0byBiZSBhZGRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZChTZXNzaW9uIHNlc3Npb24pIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKHNlc3Npb25zKSB7CisgICAgICAgICAgICBzZXNzaW9ucy5wdXQoc2Vzc2lvbi5nZXRJZCgpLCBzZXNzaW9uKTsKKyAgICAgICAgICAgIGlmKCBzZXNzaW9ucy5zaXplKCkgPiBtYXhBY3RpdmUgKSB7CisgICAgICAgICAgICAgICAgbWF4QWN0aXZlPXNlc3Npb25zLnNpemUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogQWRkIGEgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyIHRvIHRoaXMgY29tcG9uZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciB0byBhZGQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKworICAgICAgICBzdXBwb3J0LmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYW5kIHJldHVybiBhIG5ldyBzZXNzaW9uIG9iamVjdCwgYmFzZWQgb24gdGhlIGRlZmF1bHQKKyAgICAgKiBzZXR0aW5ncyBzcGVjaWZpZWQgYnkgdGhpcyBNYW5hZ2VyJ3MgcHJvcGVydGllcy4gIFRoZSBzZXNzaW9uCisgICAgICogaWQgd2lsbCBiZSBhc3NpZ25lZCBieSB0aGlzIG1ldGhvZCwgYW5kIGF2YWlsYWJsZSB2aWEgdGhlIGdldElkKCkKKyAgICAgKiBtZXRob2Qgb2YgdGhlIHJldHVybmVkIHNlc3Npb24uICBJZiBhIG5ldyBzZXNzaW9uIGNhbm5vdCBiZSBjcmVhdGVkCisgICAgICogZm9yIGFueSByZWFzb24sIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIGEgbmV3IHNlc3Npb24gY2Fubm90IGJlCisgICAgICogIGluc3RhbnRpYXRlZCBmb3IgYW55IHJlYXNvbgorICAgICAqLworICAgIHB1YmxpYyBTZXNzaW9uIGNyZWF0ZVNlc3Npb24oKSB7CisKKyAgICAgICAgLy8gUmVjeWNsZSBvciBjcmVhdGUgYSBTZXNzaW9uIGluc3RhbmNlCisgICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IGNyZWF0ZUVtcHR5U2Vzc2lvbigpOworCisgICAgICAgIC8vIEluaXRpYWxpemUgdGhlIHByb3BlcnRpZXMgb2YgdGhlIG5ldyBzZXNzaW9uIGFuZCByZXR1cm4gaXQKKyAgICAgICAgc2Vzc2lvbi5zZXROZXcodHJ1ZSk7CisgICAgICAgIHNlc3Npb24uc2V0VmFsaWQodHJ1ZSk7CisgICAgICAgIHNlc3Npb24uc2V0Q3JlYXRpb25UaW1lKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKKyAgICAgICAgc2Vzc2lvbi5zZXRNYXhJbmFjdGl2ZUludGVydmFsKHRoaXMubWF4SW5hY3RpdmVJbnRlcnZhbCk7CisgICAgICAgIFN0cmluZyBzZXNzaW9uSWQgPSBnZW5lcmF0ZVNlc3Npb25JZCgpOworICAgICAgICBzZXNzaW9uLnNldElkKHNlc3Npb25JZCk7CisgICAgICAgIHNlc3Npb25Db3VudGVyKys7CisKKyAgICAgICAgcmV0dXJuIChzZXNzaW9uKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0IGEgc2Vzc2lvbiBmcm9tIHRoZSByZWN5Y2xlZCBvbmVzIG9yIGNyZWF0ZSBhIG5ldyBlbXB0eSBvbmUuCisgICAgICogVGhlIFBlcnNpc3RlbnRNYW5hZ2VyIG1hbmFnZXIgZG9lcyBub3QgbmVlZCB0byBjcmVhdGUgc2Vzc2lvbiBkYXRhCisgICAgICogYmVjYXVzZSBpdCByZWFkcyBpdCBmcm9tIHRoZSBTdG9yZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2Vzc2lvbiBjcmVhdGVFbXB0eVNlc3Npb24oKSB7CisgICAgICAgIHJldHVybiAoZ2V0TmV3U2Vzc2lvbigpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgYWN0aXZlIFNlc3Npb24sIGFzc29jaWF0ZWQgd2l0aCB0aGlzIE1hbmFnZXIsIHdpdGggdGhlCisgICAgICogc3BlY2lmaWVkIHNlc3Npb24gaWQgKGlmIGFueSk7IG90aGVyd2lzZSByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gaWQgVGhlIHNlc3Npb24gaWQgZm9yIHRoZSBzZXNzaW9uIHRvIGJlIHJldHVybmVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiBhIG5ldyBzZXNzaW9uIGNhbm5vdCBiZQorICAgICAqICBpbnN0YW50aWF0ZWQgZm9yIGFueSByZWFzb24KKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMgd2hpbGUKKyAgICAgKiAgcHJvY2Vzc2luZyB0aGlzIHJlcXVlc3QKKyAgICAgKi8KKyAgICBwdWJsaWMgU2Vzc2lvbiBmaW5kU2Vzc2lvbihTdHJpbmcgaWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKGlkID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICBzeW5jaHJvbml6ZWQgKHNlc3Npb25zKSB7CisgICAgICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSAoU2Vzc2lvbikgc2Vzc2lvbnMuZ2V0KGlkKTsKKyAgICAgICAgICAgIHJldHVybiAoc2Vzc2lvbik7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXQgb2YgYWN0aXZlIFNlc3Npb25zIGFzc29jaWF0ZWQgd2l0aCB0aGlzIE1hbmFnZXIuCisgICAgICogSWYgdGhpcyBNYW5hZ2VyIGhhcyBubyBhY3RpdmUgU2Vzc2lvbnMsIGEgemVyby1sZW5ndGggYXJyYXkgaXMgcmV0dXJuZWQuCisgICAgICovCisgICAgcHVibGljIFNlc3Npb25bXSBmaW5kU2Vzc2lvbnMoKSB7CisKKyAgICAgICAgU2Vzc2lvbiByZXN1bHRzW10gPSBudWxsOworICAgICAgICBzeW5jaHJvbml6ZWQgKHNlc3Npb25zKSB7CisgICAgICAgICAgICByZXN1bHRzID0gbmV3IFNlc3Npb25bc2Vzc2lvbnMuc2l6ZSgpXTsKKyAgICAgICAgICAgIHJlc3VsdHMgPSAoU2Vzc2lvbltdKSBzZXNzaW9ucy52YWx1ZXMoKS50b0FycmF5KHJlc3VsdHMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAocmVzdWx0cyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGlzIFNlc3Npb24gZnJvbSB0aGUgYWN0aXZlIFNlc3Npb25zIGZvciB0aGlzIE1hbmFnZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2Vzc2lvbiBTZXNzaW9uIHRvIGJlIHJlbW92ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmUoU2Vzc2lvbiBzZXNzaW9uKSB7CisKKyAgICAgICAgc3luY2hyb25pemVkIChzZXNzaW9ucykgeworICAgICAgICAgICAgc2Vzc2lvbnMucmVtb3ZlKHNlc3Npb24uZ2V0SWQoKSk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGEgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyIGZyb20gdGhpcyBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRvIHJlbW92ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgeworCisgICAgICAgIHN1cHBvcnQucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm90ZWN0ZWQgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBHZXQgbmV3IHNlc3Npb24gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZG9Mb2FkKCkgbWV0aG9kLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdGFuZGFyZFNlc3Npb24gZ2V0TmV3U2Vzc2lvbigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTdGFuZGFyZFNlc3Npb24odGhpcyk7CisgICAgfQorCisKKyAgICBwcm90ZWN0ZWQgdm9pZCBnZXRSYW5kb21CeXRlcyggYnl0ZSBieXRlc1tdICkgeworICAgICAgICAvLyBHZW5lcmF0ZSBhIGJ5dGUgYXJyYXkgY29udGFpbmluZyBhIHNlc3Npb24gaWRlbnRpZmllcgorICAgICAgICBpZiggZGV2UmFuZG9tU291cmNlIT1udWxsICYmIHJhbmRvbUlTPT1udWxsICkgeworICAgICAgICAgICAgc2V0UmFuZG9tRmlsZSggZGV2UmFuZG9tU291cmNlICk7CisgICAgICAgIH0KKyAgICAgICAgaWYocmFuZG9tSVMhPW51bGwgKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGludCBsZW49cmFuZG9tSVMucmVhZCggYnl0ZXMgKTsKKyAgICAgICAgICAgICAgICBpZiggbGVuPT1ieXRlcy5sZW5ndGggKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJHb3QgIiArIGxlbiArICIgIiArIGJ5dGVzLmxlbmd0aCApOworICAgICAgICAgICAgfSBjYXRjaCggRXhjZXB0aW9uIGV4ICkgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGV2UmFuZG9tU291cmNlPW51bGw7CisgCisgICAgICAgICAgICB0cnkgeworCQlyYW5kb21JUy5jbG9zZSgpOworCSAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxvZy53YXJuKCJGYWlsZWQgdG8gY2xvc2UgcmFuZG9tSVMuIik7CisJICAgIH0KKworICAgICAgICAgICAgcmFuZG9tSVM9bnVsbDsKKyAgICAgICAgfQorICAgICAgICBSYW5kb20gcmFuZG9tID0gZ2V0UmFuZG9tKCk7CisgICAgICAgIGdldFJhbmRvbSgpLm5leHRCeXRlcyhieXRlcyk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZSBhbmQgcmV0dXJuIGEgbmV3IHNlc3Npb24gaWRlbnRpZmllci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIFN0cmluZyBnZW5lcmF0ZVNlc3Npb25JZCgpIHsKKworICAgICAgICBieXRlIHJhbmRvbVtdID0gbmV3IGJ5dGVbMTZdOworICAgICAgICBTdHJpbmcganZtUm91dGUgPSBnZXRKdm1Sb3V0ZSgpOworICAgICAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKKworICAgICAgICAvLyBSZW5kZXIgdGhlIHJlc3VsdCBhcyBhIFN0cmluZyBvZiBoZXhhZGVjaW1hbCBkaWdpdHMKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgZG8geworICAgICAgICAgICAgaW50IHJlc3VsdExlbkJ5dGVzID0gMDsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgICAgICAgICBkdXBsaWNhdGVzKys7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdoaWxlIChyZXN1bHRMZW5CeXRlcyA8IHRoaXMuc2Vzc2lvbklkTGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgZ2V0UmFuZG9tQnl0ZXMocmFuZG9tKTsKKyAgICAgICAgICAgICAgICByYW5kb20gPSBnZXREaWdlc3QoKS5kaWdlc3QocmFuZG9tKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsKKyAgICAgICAgICAgICAgICBqIDwgcmFuZG9tLmxlbmd0aCAmJiByZXN1bHRMZW5CeXRlcyA8IHRoaXMuc2Vzc2lvbklkTGVuZ3RoOworICAgICAgICAgICAgICAgIGorKykgeworICAgICAgICAgICAgICAgICAgICBieXRlIGIxID0gKGJ5dGUpICgocmFuZG9tW2pdICYgMHhmMCkgPj4gNCk7CisgICAgICAgICAgICAgICAgICAgIGJ5dGUgYjIgPSAoYnl0ZSkgKHJhbmRvbVtqXSAmIDB4MGYpOworICAgICAgICAgICAgICAgICAgICBpZiAoYjEgPCAxMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoKGNoYXIpICgnMCcgKyBiMSkpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKChjaGFyKSAoJ0EnICsgKGIxIC0gMTApKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChiMiA8IDEwKQorICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgoY2hhcikgKCcwJyArIGIyKSk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoKGNoYXIpICgnQScgKyAoYjIgLSAxMCkpKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0TGVuQnl0ZXMrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoanZtUm91dGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoJy4nKS5hcHBlbmQoanZtUm91dGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzdWx0ID0gYnVmZmVyLnRvU3RyaW5nKCk7CisgICAgICAgIH0gd2hpbGUgKHNlc3Npb25zLmdldChyZXN1bHQpICE9IG51bGwpOworICAgICAgICByZXR1cm4gKHJlc3VsdCk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm90ZWN0ZWQgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZSB0aGUgZW5jbG9zaW5nIEVuZ2luZSBmb3IgdGhpcyBNYW5hZ2VyLgorICAgICAqCisgICAgICogQHJldHVybiBhbiBFbmdpbmUgb2JqZWN0IChvciBudWxsKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRW5naW5lIGdldEVuZ2luZSgpIHsKKyAgICAgICAgRW5naW5lIGUgPSBudWxsOworICAgICAgICBmb3IgKENvbnRhaW5lciBjID0gZ2V0Q29udGFpbmVyKCk7IGUgPT0gbnVsbCAmJiBjICE9IG51bGwgOyBjID0gYy5nZXRQYXJlbnQoKSkgeworICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCAmJiBjIGluc3RhbmNlb2YgRW5naW5lKSB7CisgICAgICAgICAgICAgICAgZSA9IChFbmdpbmUpYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlIHRoZSBKdm1Sb3V0ZSBmb3IgdGhlIGVuY2xvc2luZyBFbmdpbmUuCisgICAgICogQHJldHVybiB0aGUgSnZtUm91dGUgb3IgbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEp2bVJvdXRlKCkgeworICAgICAgICBFbmdpbmUgZSA9IGdldEVuZ2luZSgpOworICAgICAgICByZXR1cm4gZSA9PSBudWxsID8gbnVsbCA6IGUuZ2V0SnZtUm91dGUoKTsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBhY2thZ2UgTWV0aG9kcworCisKKyAgICBwdWJsaWMgdm9pZCBzZXRTZXNzaW9uQ291bnRlcihpbnQgc2Vzc2lvbkNvdW50ZXIpIHsKKyAgICAgICAgdGhpcy5zZXNzaW9uQ291bnRlciA9IHNlc3Npb25Db3VudGVyOworICAgIH0KKworCisgICAgLyoqIAorICAgICAqIFRvdGFsIHNlc3Npb25zIGNyZWF0ZWQgYnkgdGhpcyBtYW5hZ2VyLgorICAgICAqCisgICAgICogQHJldHVybiBzZXNzaW9ucyBjcmVhdGVkCisgICAgICovCisgICAgcHVibGljIGludCBnZXRTZXNzaW9uQ291bnRlcigpIHsKKyAgICAgICAgcmV0dXJuIHNlc3Npb25Db3VudGVyOworICAgIH0KKworCisgICAgLyoqIAorICAgICAqIE51bWJlciBvZiBkdXBsaWNhdGVkIHNlc3Npb24gSURzIGdlbmVyYXRlZCBieSB0aGUgcmFuZG9tIHNvdXJjZS4KKyAgICAgKiBBbnl0aGluZyBiaWdnZXIgdGhhbiAwIG1lYW5zIHByb2JsZW1zLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgY291bnQgb2YgZHVwbGljYXRlcworICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0RHVwbGljYXRlcygpIHsKKyAgICAgICAgcmV0dXJuIGR1cGxpY2F0ZXM7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXREdXBsaWNhdGVzKGludCBkdXBsaWNhdGVzKSB7CisgICAgICAgIHRoaXMuZHVwbGljYXRlcyA9IGR1cGxpY2F0ZXM7CisgICAgfQorCisKKyAgICAvKiogCisgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGFjdGl2ZSBzZXNzaW9ucworICAgICAqCisgICAgICogQHJldHVybiBudW1iZXIgb2Ygc2Vzc2lvbnMgYWN0aXZlCisgICAgICovCisgICAgcHVibGljIGludCBnZXRBY3RpdmVTZXNzaW9ucygpIHsKKyAgICAgICAgcmV0dXJuIHNlc3Npb25zLnNpemUoKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIE1heCBudW1iZXIgb2YgY29uY3VycmVudCBhY3RpdmUgc2Vzc2lvbnMKKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGhpZ2hlc3QgbnVtYmVyIG9mIGNvbmN1cnJlbnQgYWN0aXZlIHNlc3Npb25zCisgICAgICovCisgICAgcHVibGljIGludCBnZXRNYXhBY3RpdmUoKSB7CisgICAgICAgIHJldHVybiBtYXhBY3RpdmU7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXRNYXhBY3RpdmUoaW50IG1heEFjdGl2ZSkgeworICAgICAgICB0aGlzLm1heEFjdGl2ZSA9IG1heEFjdGl2ZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGxvbmdlc3QgdGltZSAoaW4gc2Vjb25kcykgdGhhdCBhbiBleHBpcmVkIHNlc3Npb24gaGFkIGJlZW4KKyAgICAgKiBhbGl2ZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gTG9uZ2VzdCB0aW1lIChpbiBzZWNvbmRzKSB0aGF0IGFuIGV4cGlyZWQgc2Vzc2lvbiBoYWQgYmVlbgorICAgICAqIGFsaXZlLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0U2Vzc2lvbk1heEFsaXZlVGltZSgpIHsKKyAgICAgICAgcmV0dXJuIHNlc3Npb25NYXhBbGl2ZVRpbWU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBsb25nZXN0IHRpbWUgKGluIHNlY29uZHMpIHRoYXQgYW4gZXhwaXJlZCBzZXNzaW9uIGhhZCBiZWVuCisgICAgICogYWxpdmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2Vzc2lvbk1heEFsaXZlVGltZSBMb25nZXN0IHRpbWUgKGluIHNlY29uZHMpIHRoYXQgYW4gZXhwaXJlZAorICAgICAqIHNlc3Npb24gaGFkIGJlZW4gYWxpdmUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2Vzc2lvbk1heEFsaXZlVGltZShpbnQgc2Vzc2lvbk1heEFsaXZlVGltZSkgeworICAgICAgICB0aGlzLnNlc3Npb25NYXhBbGl2ZVRpbWUgPSBzZXNzaW9uTWF4QWxpdmVUaW1lOworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgYXZlcmFnZSB0aW1lIChpbiBzZWNvbmRzKSB0aGF0IGV4cGlyZWQgc2Vzc2lvbnMgaGFkIGJlZW4KKyAgICAgKiBhbGl2ZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gQXZlcmFnZSB0aW1lIChpbiBzZWNvbmRzKSB0aGF0IGV4cGlyZWQgc2Vzc2lvbnMgaGFkIGJlZW4KKyAgICAgKiBhbGl2ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFNlc3Npb25BdmVyYWdlQWxpdmVUaW1lKCkgeworICAgICAgICByZXR1cm4gc2Vzc2lvbkF2ZXJhZ2VBbGl2ZVRpbWU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBhdmVyYWdlIHRpbWUgKGluIHNlY29uZHMpIHRoYXQgZXhwaXJlZCBzZXNzaW9ucyBoYWQgYmVlbgorICAgICAqIGFsaXZlLgorICAgICAqCisgICAgICogQHBhcmFtIHNlc3Npb25BdmVyYWdlQWxpdmVUaW1lIEF2ZXJhZ2UgdGltZSAoaW4gc2Vjb25kcykgdGhhdCBleHBpcmVkCisgICAgICogc2Vzc2lvbnMgaGFkIGJlZW4gYWxpdmUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2Vzc2lvbkF2ZXJhZ2VBbGl2ZVRpbWUoaW50IHNlc3Npb25BdmVyYWdlQWxpdmVUaW1lKSB7CisgICAgICAgIHRoaXMuc2Vzc2lvbkF2ZXJhZ2VBbGl2ZVRpbWUgPSBzZXNzaW9uQXZlcmFnZUFsaXZlVGltZTsKKyAgICB9CisKKworICAgIC8qKiAKKyAgICAgKiBGb3IgZGVidWdnaW5nOiByZXR1cm4gYSBsaXN0IG9mIGFsbCBzZXNzaW9uIGlkcyBjdXJyZW50bHkgYWN0aXZlCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGxpc3RTZXNzaW9uSWRzKCkgeworICAgICAgICBTdHJpbmdCdWZmZXIgc2I9bmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBJdGVyYXRvciBrZXlzPXNlc3Npb25zLmtleVNldCgpLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlKCBrZXlzLmhhc05leHQoKSApIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZChrZXlzLm5leHQoKSkuYXBwZW5kKCIgIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorCisKKyAgICAvKiogCisgICAgICogRm9yIGRlYnVnZ2luZzogZ2V0IGEgc2Vzc2lvbiBhdHRyaWJ1dGUKKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXNzaW9uSWQKKyAgICAgKiBAcGFyYW0ga2V5CisgICAgICogQHJldHVybiBUaGUgYXR0cmlidXRlIHZhbHVlLCBpZiBmb3VuZCwgbnVsbCBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFNlc3Npb25BdHRyaWJ1dGUoIFN0cmluZyBzZXNzaW9uSWQsIFN0cmluZyBrZXkgKSB7CisgICAgICAgIFNlc3Npb24gcz0oU2Vzc2lvbilzZXNzaW9ucy5nZXQoc2Vzc2lvbklkKTsKKyAgICAgICAgaWYoIHM9PW51bGwgKSB7CisgICAgICAgICAgICBsb2cuaW5mbygiU2Vzc2lvbiBub3QgZm91bmQgIiArIHNlc3Npb25JZCk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBPYmplY3Qgbz1zLmdldFNlc3Npb24oKS5nZXRBdHRyaWJ1dGUoa2V5KTsKKyAgICAgICAgaWYoIG89PW51bGwgKSByZXR1cm4gbnVsbDsKKyAgICAgICAgcmV0dXJuIG8udG9TdHJpbmcoKTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIGV4cGlyZVNlc3Npb24oIFN0cmluZyBzZXNzaW9uSWQgKSB7CisgICAgICAgIFNlc3Npb24gcz0oU2Vzc2lvbilzZXNzaW9ucy5nZXQoc2Vzc2lvbklkKTsKKyAgICAgICAgaWYoIHM9PW51bGwgKSB7CisgICAgICAgICAgICBsb2cuaW5mbygiU2Vzc2lvbiBub3QgZm91bmQgIiArIHNlc3Npb25JZCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgcy5leHBpcmUoKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFzdEFjY2Vzc2VkVGltZSggU3RyaW5nIHNlc3Npb25JZCApIHsKKyAgICAgICAgU2Vzc2lvbiBzPShTZXNzaW9uKXNlc3Npb25zLmdldChzZXNzaW9uSWQpOworICAgICAgICBpZiggcz09bnVsbCApIHsKKyAgICAgICAgICAgIGxvZy5pbmZvKCJTZXNzaW9uIG5vdCBmb3VuZCAiICsgc2Vzc2lvbklkKTsKKyAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IERhdGUocy5nZXRMYXN0QWNjZXNzZWRUaW1lKCkpLnRvU3RyaW5nKCk7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLSBKTVggYW5kIFJlZ2lzdHJhdGlvbiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGRvbWFpbjsKKyAgICBwcm90ZWN0ZWQgT2JqZWN0TmFtZSBvbmFtZTsKKyAgICBwcm90ZWN0ZWQgTUJlYW5TZXJ2ZXIgbXNlcnZlcjsKKworICAgIHB1YmxpYyBPYmplY3ROYW1lIGdldE9iamVjdE5hbWUoKSB7CisgICAgICAgIHJldHVybiBvbmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldERvbWFpbigpIHsKKyAgICAgICAgcmV0dXJuIGRvbWFpbjsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0TmFtZSBwcmVSZWdpc3RlcihNQmVhblNlcnZlciBzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSBuYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgb25hbWU9bmFtZTsKKyAgICAgICAgbXNlcnZlcj1zZXJ2ZXI7CisgICAgICAgIGRvbWFpbj1uYW1lLmdldERvbWFpbigpOworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwb3N0UmVnaXN0ZXIoQm9vbGVhbiByZWdpc3RyYXRpb25Eb25lKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHJlRGVyZWdpc3RlcigpIHRocm93cyBFeGNlcHRpb24geworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHBvc3REZXJlZ2lzdGVyKCkgeworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3Nlc3Npb24vUGVyc2lzdGVudE1hbmFnZXIuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zZXNzaW9uL1BlcnNpc3RlbnRNYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzAwMjgyYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zZXNzaW9uL1BlcnNpc3RlbnRNYW5hZ2VyLmphdmEKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5zZXNzaW9uOworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSA8Yj5NYW5hZ2VyPC9iPiBpbnRlcmZhY2UgdGhhdCBtYWtlcyB1c2Ugb2YKKyAqIGEgU3RvcmUgdG8gc3dhcCBhY3RpdmUgU2Vzc2lvbnMgdG8gZGlzay4gSXQgY2FuIGJlIGNvbmZpZ3VyZWQgdG8KKyAqIGFjaGlldmUgc2V2ZXJhbCBkaWZmZXJlbnQgZ29hbHM6CisgKgorICogPGxpPlBlcnNpc3Qgc2Vzc2lvbnMgYWNyb3NzIHJlc3RhcnRzIG9mIHRoZSBDb250YWluZXI8L2xpPgorICogPGxpPkZhdWx0IHRvbGVyYW5jZSwga2VlcCBzZXNzaW9ucyBiYWNrZWQgdXAgb24gZGlzayB0byBhbGxvdworICogICAgIHJlY292ZXJ5IGluIHRoZSBldmVudCBvZiB1bnBsYW5uZWQgcmVzdGFydHMuPC9saT4KKyAqIDxsaT5MaW1pdCB0aGUgbnVtYmVyIG9mIGFjdGl2ZSBzZXNzaW9ucyBrZXB0IGluIG1lbW9yeSBieQorICogICAgIHN3YXBwaW5nIGxlc3MgYWN0aXZlIHNlc3Npb25zIG91dCB0byBkaXNrLjwvbGk+CisgKgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogQGF1dGhvciBLaWVmIE1vcnJpcyAoa2llZkBraWVmLmNvbSkKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgUGVyc2lzdGVudE1hbmFnZXIgZXh0ZW5kcyBQZXJzaXN0ZW50TWFuYWdlckJhc2UgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGluZm8gPSAiUGVyc2lzdGVudE1hbmFnZXIvMS4wIjsKKworCisgICAgLyoqCisgICAgICogVGhlIGRlc2NyaXB0aXZlIG5hbWUgb2YgdGhpcyBNYW5hZ2VyIGltcGxlbWVudGF0aW9uIChmb3IgbG9nZ2luZykuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgbmFtZSA9ICJQZXJzaXN0ZW50TWFuYWdlciI7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBNYW5hZ2VyIGltcGxlbWVudGF0aW9uIGFuZAorICAgICAqIHRoZSBjb3JyZXNwb25kaW5nIHZlcnNpb24gbnVtYmVyLCBpbiB0aGUgZm9ybWF0CisgICAgICogPGNvZGU+Jmx0O2Rlc2NyaXB0aW9uJmd0Oy8mbHQ7dmVyc2lvbiZndDs8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5mbygpIHsKKworICAgICAgICByZXR1cm4gKGluZm8pOworCisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBkZXNjcmlwdGl2ZSBzaG9ydCBuYW1lIG9mIHRoaXMgTWFuYWdlciBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisKKyAgICAgICAgcmV0dXJuIChuYW1lKTsKKworICAgIH0KKyB9CisKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zZXNzaW9uL1BlcnNpc3RlbnRNYW5hZ2VyQmFzZS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3Nlc3Npb24vUGVyc2lzdGVudE1hbmFnZXJCYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NhNzgyZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zZXNzaW9uL1BlcnNpc3RlbnRNYW5hZ2VyQmFzZS5qYXZhCkBAIC0wLDAgKzEsMTEzNyBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5zZXNzaW9uOworCitpbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUV2ZW50OworaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGFpbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZUxpc3RlbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuU2Vzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlN0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5MaWZlY3ljbGVTdXBwb3J0OworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OworCisKKy8qKgorICogRXh0ZW5kcyB0aGUgPGI+TWFuYWdlckJhc2U8L2I+IGNsYXNzIHRvIGltcGxlbWVudCBtb3N0IG9mIHRoZQorICogZnVuY3Rpb25hbGl0eSByZXF1aXJlZCBieSBhIE1hbmFnZXIgd2hpY2ggc3VwcG9ydHMgYW55IGtpbmQgb2YKKyAqIHBlcnNpc3RlbmNlLCBldmVuIGlmIG9ubHlmb3IgIHJlc3RhcnRzLgorICogPHA+CisgKiA8Yj5JTVBMRU1FTlRBVElPTiBOT1RFPC9iPjogIENvcnJlY3QgYmVoYXZpb3Igb2Ygc2Vzc2lvbiBzdG9yaW5nIGFuZAorICogcmVsb2FkaW5nIGRlcGVuZHMgdXBvbiBleHRlcm5hbCBjYWxscyB0byB0aGUgPGNvZGU+c3RhcnQoKTwvY29kZT4gYW5kCisgKiA8Y29kZT5zdG9wKCk8L2NvZGU+IG1ldGhvZHMgb2YgdGhpcyBjbGFzcyBhdCB0aGUgY29ycmVjdCB0aW1lcy4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEBhdXRob3IgSmVhbi1GcmFuY29pcyBBcmNhbmQKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGFic3RyYWN0IGNsYXNzIFBlcnNpc3RlbnRNYW5hZ2VyQmFzZQorICAgIGV4dGVuZHMgTWFuYWdlckJhc2UKKyAgICBpbXBsZW1lbnRzIExpZmVjeWNsZSwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coUGVyc2lzdGVudE1hbmFnZXJCYXNlLmNsYXNzKTsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU2VjdXJpdHkgQ2xhc3NlcworCisgICAgcHJpdmF0ZSBjbGFzcyBQcml2aWxlZ2VkU3RvcmVDbGVhcgorICAgICAgICBpbXBsZW1lbnRzIFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24geworCisgICAgICAgIFByaXZpbGVnZWRTdG9yZUNsZWFyKCkgeyAgICAgICAgICAgIAorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgRXhjZXB0aW9ueworICAgICAgICAgICBzdG9yZS5jbGVhcigpOworICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgCisgICAgfSAgIAorICAgICAKKyAgICBwcml2YXRlIGNsYXNzIFByaXZpbGVnZWRTdG9yZVJlbW92ZQorICAgICAgICBpbXBsZW1lbnRzIFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24geworCisgICAgICAgIHByaXZhdGUgU3RyaW5nIGlkOyAgICAKKyAgICAgICAgICAgIAorICAgICAgICBQcml2aWxlZ2VkU3RvcmVSZW1vdmUoU3RyaW5nIGlkKSB7ICAgICAKKyAgICAgICAgICAgIHRoaXMuaWQgPSBpZDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbnsKKyAgICAgICAgICAgc3RvcmUucmVtb3ZlKGlkKTsKKyAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgIAorICAgIH0gICAKKyAgICAgCisgICAgcHJpdmF0ZSBjbGFzcyBQcml2aWxlZ2VkU3RvcmVMb2FkCisgICAgICAgIGltcGxlbWVudHMgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbiB7CisKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgaWQ7ICAgIAorICAgICAgICAgICAgCisgICAgICAgIFByaXZpbGVnZWRTdG9yZUxvYWQoU3RyaW5nIGlkKSB7ICAgICAKKyAgICAgICAgICAgIHRoaXMuaWQgPSBpZDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbnsKKyAgICAgICAgICAgcmV0dXJuIHN0b3JlLmxvYWQoaWQpOworICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAKKyAgICB9ICAgCisgICAgICAgICAgCisgICAgcHJpdmF0ZSBjbGFzcyBQcml2aWxlZ2VkU3RvcmVTYXZlCisgICAgICAgIGltcGxlbWVudHMgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbiB7CisKKyAgICAgICAgcHJpdmF0ZSBTZXNzaW9uIHNlc3Npb247ICAgIAorICAgICAgICAgICAgCisgICAgICAgIFByaXZpbGVnZWRTdG9yZVNhdmUoU2Vzc2lvbiBzZXNzaW9uKSB7ICAgICAKKyAgICAgICAgICAgIHRoaXMuc2Vzc2lvbiA9IHNlc3Npb247CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHRocm93cyBFeGNlcHRpb257CisgICAgICAgICAgIHN0b3JlLnNhdmUoc2Vzc2lvbik7CisgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAKKyAgICB9ICAgCisgICAgIAorICAgIHByaXZhdGUgY2xhc3MgUHJpdmlsZWdlZFN0b3JlS2V5cworICAgICAgICBpbXBsZW1lbnRzIFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24geworCisgICAgICAgIFByaXZpbGVnZWRTdG9yZUtleXMoKSB7ICAgICAKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbnsKKyAgICAgICAgICAgcmV0dXJuIHN0b3JlLmtleXMoKTsKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgCisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBpbmZvID0gIlBlcnNpc3RlbnRNYW5hZ2VyQmFzZS8xLjAiOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgbGlmZWN5Y2xlIGV2ZW50IHN1cHBvcnQgZm9yIHRoaXMgY29tcG9uZW50LgorICAgICAqLworICAgIHByb3RlY3RlZCBMaWZlY3ljbGVTdXBwb3J0IGxpZmVjeWNsZSA9IG5ldyBMaWZlY3ljbGVTdXBwb3J0KHRoaXMpOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgYWN0aXZlIFNlc3Npb25zIGFsbG93ZWQsIG9yIC0xIGZvciBubyBsaW1pdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IG1heEFjdGl2ZVNlc3Npb25zID0gLTE7CisKKworICAgIC8qKgorICAgICAqIFRoZSBkZXNjcmlwdGl2ZSBuYW1lIG9mIHRoaXMgTWFuYWdlciBpbXBsZW1lbnRhdGlvbiAoZm9yIGxvZ2dpbmcpLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBuYW1lID0gIlBlcnNpc3RlbnRNYW5hZ2VyQmFzZSI7CisKKworICAgIC8qKgorICAgICAqIEhhcyB0aGlzIGNvbXBvbmVudCBiZWVuIHN0YXJ0ZWQgeWV0PworICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIHN0YXJ0ZWQgPSBmYWxzZTsKKworCisgICAgLyoqCisgICAgICogU3RvcmUgb2JqZWN0IHdoaWNoIHdpbGwgbWFuYWdlIHRoZSBTZXNzaW9uIHN0b3JlLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdG9yZSBzdG9yZSA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gc2F2ZSBhbmQgcmVsb2FkIHNlc3Npb25zIHdoZW4gdGhlIE1hbmFnZXIgPGNvZGU+dW5sb2FkPC9jb2RlPgorICAgICAqIGFuZCA8Y29kZT5sb2FkPC9jb2RlPiBtZXRob2RzIGFyZSBjYWxsZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gc2F2ZU9uUmVzdGFydCA9IHRydWU7CisKKworICAgIC8qKgorICAgICAqIEhvdyBsb25nIGEgc2Vzc2lvbiBtdXN0IGJlIGlkbGUgYmVmb3JlIGl0IHNob3VsZCBiZSBiYWNrZWQgdXAuCisgICAgICogLTEgbWVhbnMgc2Vzc2lvbnMgd29uJ3QgYmUgYmFja2VkIHVwLgorICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgbWF4SWRsZUJhY2t1cCA9IC0xOworCisKKyAgICAvKioKKyAgICAgKiBNaW5pbXVtIHRpbWUgYSBzZXNzaW9uIG11c3QgYmUgaWRsZSBiZWZvcmUgaXQgaXMgc3dhcHBlZCB0byBkaXNrLgorICAgICAqIFRoaXMgb3ZlcnJpZGVzIG1heEFjdGl2ZVNlc3Npb25zLCB0byBwcmV2ZW50IHRocmFzaGluZyBpZiB0aGVyZSBhcmUgbG90cworICAgICAqIG9mIGFjdGl2ZSBzZXNzaW9ucy4gU2V0dGluZyB0byAtMSBtZWFucyBpdCdzIGlnbm9yZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIGludCBtaW5JZGxlU3dhcCA9IC0xOworCisgICAgLyoqCisgICAgICogVGhlIG1heGltdW0gdGltZSBhIHNlc3Npb24gbWF5IGJlIGlkbGUgYmVmb3JlIGl0IHNob3VsZCBiZSBzd2FwcGVkCisgICAgICogdG8gZmlsZSBqdXN0IG9uIGdlbmVyYWwgcHJpbmNpcGxlLiBTZXR0aW5nIHRoaXMgdG8gLTEgbWVhbnMgc2Vzc2lvbnMKKyAgICAgKiBzaG91bGQgbm90IGJlIGZvcmNlZCBvdXQuCisgICAgICovCisgICAgcHJvdGVjdGVkIGludCBtYXhJZGxlU3dhcCA9IC0xOworCisKKyAgICAvKioKKyAgICAgKiBOdW1iZXIgb2Ygc2Vzc2lvbiBjcmVhdGlvbnMgdGhhdCBmYWlsZWQgZHVlIHRvIG1heEFjdGl2ZVNlc3Npb25zLgorICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgcmVqZWN0ZWRTZXNzaW9ucyA9IDA7CisKKworICAgIC8qKgorICAgICAqIFByb2Nlc3NpbmcgdGltZSBkdXJpbmcgc2Vzc2lvbiBleHBpcmF0aW9uIGFuZCBwYXNzaXZhdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgbG9uZyBwcm9jZXNzaW5nVGltZSA9IDA7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtIHRoZSBiYWNrZ3JvdW5kIHByb2Nlc3NlcyBmb3IgdGhpcyBNYW5hZ2VyCisgICAgICovCisgICAgcHVibGljIHZvaWQgYmFja2dyb3VuZFByb2Nlc3MoKSB7CisKKyAgICAgICAgbG9uZyB0aW1lTm93ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisKKyAgICAgICAgdGhpcy5wcm9jZXNzRXhwaXJlcygpOworICAgICAgICB0aGlzLnByb2Nlc3NQZXJzaXN0ZW5jZUNoZWNrcygpOworICAgICAgICBpZiAoKHRoaXMuZ2V0U3RvcmUoKSAhPSBudWxsKQorICAgICAgICAgICAgJiYgKHRoaXMuZ2V0U3RvcmUoKSBpbnN0YW5jZW9mIFN0b3JlQmFzZSkpIHsKKyAgICAgICAgICAgICgoU3RvcmVCYXNlKSB0aGlzLmdldFN0b3JlKCkpLnByb2Nlc3NFeHBpcmVzKCk7CisgICAgICAgIH0KKworICAgICAgICBsb25nIHRpbWVFbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgcHJvY2Vzc2luZ1RpbWUgKz0gKCB0aW1lRW5kIC0gdGltZU5vdyApOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgaG93IG1hbnkgc2Vjb25kcyBvbGQgYSBzZXNzaW9uIGNhbiBnZXQsIGFmdGVyIGl0cyBsYXN0CisgICAgICogdXNlIGluIGEgcmVxdWVzdCwgYmVmb3JlIGl0IHNob3VsZCBiZSBiYWNrZWQgdXAgdG8gdGhlIHN0b3JlLiAtMQorICAgICAqIG1lYW5zIHNlc3Npb25zIGFyZSBub3QgYmFja2VkIHVwLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0TWF4SWRsZUJhY2t1cCgpIHsKKworICAgICAgICByZXR1cm4gbWF4SWRsZUJhY2t1cDsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgb3B0aW9uIHRvIGJhY2sgc2Vzc2lvbnMgdXAgdG8gdGhlIFN0b3JlIGFmdGVyIHRoZXkKKyAgICAgKiBhcmUgdXNlZCBpbiBhIHJlcXVlc3QuIFNlc3Npb25zIHJlbWFpbiBhdmFpbGFibGUgaW4gbWVtb3J5CisgICAgICogYWZ0ZXIgYmVpbmcgYmFja2VkIHVwLCBzbyB0aGV5IGFyZSBub3QgcGFzc2l2YXRlZCBhcyB0aGV5IGFyZQorICAgICAqIHdoZW4gc3dhcHBlZCBvdXQuIFRoZSB2YWx1ZSBzZXQgaW5kaWNhdGVzIGhvdyBvbGQgYSBzZXNzaW9uCisgICAgICogbWF5IGdldCAoc2luY2UgaXRzIGxhc3QgdXNlKSBiZWZvcmUgaXQgbXVzdCBiZSBiYWNrZWQgdXA6IC0xCisgICAgICogbWVhbnMgc2Vzc2lvbnMgYXJlIG5vdCBiYWNrZWQgdXAuCisgICAgICogPHA+CisgICAgICogTm90ZSB0aGF0IHRoaXMgaXMgbm90IGEgaGFyZCBsaW1pdDogc2Vzc2lvbnMgYXJlIGNoZWNrZWQKKyAgICAgKiBhZ2FpbnN0IHRoaXMgYWdlIGxpbWl0IHBlcmlvZGljYWxseSBhY2NvcmRpbmcgdG8gPGI+Y2hlY2tJbnRlcnZhbDwvYj4uCisgICAgICogVGhpcyB2YWx1ZSBzaG91bGQgYmUgY29uc2lkZXJlZCB0byBpbmRpY2F0ZSB3aGVuIGEgc2Vzc2lvbiBpcworICAgICAqIHJpcGUgZm9yIGJhY2tpbmcgdXAuCisgICAgICogPHA+CisgICAgICogU28gaXQgaXMgcG9zc2libGUgdGhhdCBhIHNlc3Npb24gbWF5IGJlIGlkbGUgZm9yIG1heElkbGVCYWNrdXAgKworICAgICAqIGNoZWNrSW50ZXJ2YWwgc2Vjb25kcywgcGx1cyB0aGUgdGltZSBpdCB0YWtlcyB0byBoYW5kbGUgb3RoZXIKKyAgICAgKiBzZXNzaW9uIGV4cGlyYXRpb24sIHN3YXBwaW5nLCBldGMuIHRhc2tzLgorICAgICAqCisgICAgICogQHBhcmFtIGJhY2t1cCBUaGUgbnVtYmVyIG9mIHNlY29uZHMgYWZ0ZXIgdGhlaXIgbGFzdCBhY2Nlc3NlZAorICAgICAqIHRpbWUgd2hlbiB0aGV5IHNob3VsZCBiZSB3cml0dGVuIHRvIHRoZSBTdG9yZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNYXhJZGxlQmFja3VwIChpbnQgYmFja3VwKSB7CisKKyAgICAgICAgaWYgKGJhY2t1cCA9PSB0aGlzLm1heElkbGVCYWNrdXApCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGludCBvbGRCYWNrdXAgPSB0aGlzLm1heElkbGVCYWNrdXA7CisgICAgICAgIHRoaXMubWF4SWRsZUJhY2t1cCA9IGJhY2t1cDsKKyAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoIm1heElkbGVCYWNrdXAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSW50ZWdlcihvbGRCYWNrdXApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSW50ZWdlcih0aGlzLm1heElkbGVCYWNrdXApKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIHRpbWUgaW4gc2Vjb25kcyBhZnRlciB3aGljaCBhIHNlc3Npb24gc2hvdWxkIGJlIHN3YXBwZWQgb3V0IG9mCisgICAgICogbWVtb3J5IHRvIGRpc2suCisgICAgICovCisgICAgcHVibGljIGludCBnZXRNYXhJZGxlU3dhcCgpIHsKKworICAgICAgICByZXR1cm4gbWF4SWRsZVN3YXA7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHRpbWUgaW4gc2Vjb25kcyBhZnRlciB3aGljaCBhIHNlc3Npb24gc2hvdWxkIGJlIHN3YXBwZWQgb3V0IG9mCisgICAgICogbWVtb3J5IHRvIGRpc2suCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWF4SWRsZVN3YXAoaW50IG1heCkgeworCisgICAgICAgIGlmIChtYXggPT0gdGhpcy5tYXhJZGxlU3dhcCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaW50IG9sZE1heElkbGVTd2FwID0gdGhpcy5tYXhJZGxlU3dhcDsKKyAgICAgICAgdGhpcy5tYXhJZGxlU3dhcCA9IG1heDsKKyAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoIm1heElkbGVTd2FwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEludGVnZXIob2xkTWF4SWRsZVN3YXApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSW50ZWdlcih0aGlzLm1heElkbGVTd2FwKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSBtaW5pbXVtIHRpbWUgaW4gc2Vjb25kcyB0aGF0IGEgc2Vzc2lvbiBtdXN0IGJlIGlkbGUgYmVmb3JlCisgICAgICogaXQgY2FuIGJlIHN3YXBwZWQgb3V0IG9mIG1lbW9yeSwgb3IgLTEgaWYgaXQgY2FuIGJlIHN3YXBwZWQgb3V0CisgICAgICogYXQgYW55IHRpbWUuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRNaW5JZGxlU3dhcCgpIHsKKworICAgICAgICByZXR1cm4gbWluSWRsZVN3YXA7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG1pbmltdW0gdGltZSBpbiBzZWNvbmRzIHRoYXQgYSBzZXNzaW9uIG11c3QgYmUgaWRsZSBiZWZvcmUKKyAgICAgKiBpdCBjYW4gYmUgc3dhcHBlZCBvdXQgb2YgbWVtb3J5IGR1ZSB0byBtYXhBY3RpdmVTZXNzaW9uLiBTZXQgaXQgdG8gLTEKKyAgICAgKiBpZiBpdCBjYW4gYmUgc3dhcHBlZCBvdXQgYXQgYW55IHRpbWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWluSWRsZVN3YXAoaW50IG1pbikgeworCisgICAgICAgIGlmICh0aGlzLm1pbklkbGVTd2FwID09IG1pbikKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaW50IG9sZE1pbklkbGVTd2FwID0gdGhpcy5taW5JZGxlU3dhcDsKKyAgICAgICAgdGhpcy5taW5JZGxlU3dhcCA9IG1pbjsKKyAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoIm1pbklkbGVTd2FwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEludGVnZXIob2xkTWluSWRsZVN3YXApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSW50ZWdlcih0aGlzLm1pbklkbGVTd2FwKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgQ29udGFpbmVyIHdpdGggd2hpY2ggdGhpcyBNYW5hZ2VyIGhhcyBiZWVuIGFzc29jaWF0ZWQuICBJZgorICAgICAqIGl0IGlzIGEgQ29udGV4dCAodGhlIHVzdWFsIGNhc2UpLCBsaXN0ZW4gZm9yIGNoYW5nZXMgdG8gdGhlIHNlc3Npb24KKyAgICAgKiB0aW1lb3V0IHByb3BlcnR5LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRhaW5lciBUaGUgYXNzb2NpYXRlZCBDb250YWluZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb250YWluZXIoQ29udGFpbmVyIGNvbnRhaW5lcikgeworCisgICAgICAgIC8vIERlLXJlZ2lzdGVyIGZyb20gdGhlIG9sZCBDb250YWluZXIgKGlmIGFueSkKKyAgICAgICAgaWYgKCh0aGlzLmNvbnRhaW5lciAhPSBudWxsKSAmJiAodGhpcy5jb250YWluZXIgaW5zdGFuY2VvZiBDb250ZXh0KSkKKyAgICAgICAgICAgICgoQ29udGV4dCkgdGhpcy5jb250YWluZXIpLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7CisKKyAgICAgICAgLy8gRGVmYXVsdCBwcm9jZXNzaW5nIHByb3ZpZGVkIGJ5IG91ciBzdXBlcmNsYXNzCisgICAgICAgIHN1cGVyLnNldENvbnRhaW5lcihjb250YWluZXIpOworCisgICAgICAgIC8vIFJlZ2lzdGVyIHdpdGggdGhlIG5ldyBDb250YWluZXIgKGlmIGFueSkKKyAgICAgICAgaWYgKCh0aGlzLmNvbnRhaW5lciAhPSBudWxsKSAmJiAodGhpcy5jb250YWluZXIgaW5zdGFuY2VvZiBDb250ZXh0KSkgeworICAgICAgICAgICAgc2V0TWF4SW5hY3RpdmVJbnRlcnZhbAorICAgICAgICAgICAgICAgICggKChDb250ZXh0KSB0aGlzLmNvbnRhaW5lcikuZ2V0U2Vzc2lvblRpbWVvdXQoKSo2MCApOworICAgICAgICAgICAgKChDb250ZXh0KSB0aGlzLmNvbnRhaW5lcikuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBNYW5hZ2VyIGltcGxlbWVudGF0aW9uIGFuZAorICAgICAqIHRoZSBjb3JyZXNwb25kaW5nIHZlcnNpb24gbnVtYmVyLCBpbiB0aGUgZm9ybWF0CisgICAgICogPGNvZGU+Jmx0O2Rlc2NyaXB0aW9uJmd0Oy8mbHQ7dmVyc2lvbiZndDs8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5mbygpIHsKKworICAgICAgICByZXR1cm4gKGluZm8pOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdHJ1ZSwgaWYgdGhlIHNlc3Npb24gaWQgaXMgbG9hZGVkIGluIG1lbW9yeQorICAgICAqIG90aGVyd2lzZSBmYWxzZSBpcyByZXR1cm5lZAorICAgICAqCisgICAgICogQHBhcmFtIGlkIFRoZSBzZXNzaW9uIGlkIGZvciB0aGUgc2Vzc2lvbiB0byBiZSBzZWFyY2hlZCBmb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0xvYWRlZCggU3RyaW5nIGlkICl7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoIHN1cGVyLmZpbmRTZXNzaW9uKGlkKSAhPSBudWxsICkKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9nLmVycm9yKCJjaGVja2luZyBpc0xvYWRlZCBmb3IgaWQsICIgKyBpZCArICIsICIrZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbWF4aW11bSBudW1iZXIgb2YgYWN0aXZlIFNlc3Npb25zIGFsbG93ZWQsIG9yIC0xIGZvcgorICAgICAqIG5vIGxpbWl0LgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0TWF4QWN0aXZlU2Vzc2lvbnMoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLm1heEFjdGl2ZVNlc3Npb25zKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBhY3RpdmVzIFNlc3Npb25zIGFsbG93ZWQsIG9yIC0xIGZvcgorICAgICAqIG5vIGxpbWl0LgorICAgICAqCisgICAgICogQHBhcmFtIG1heCBUaGUgbmV3IG1heGltdW0gbnVtYmVyIG9mIHNlc3Npb25zCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWF4QWN0aXZlU2Vzc2lvbnMoaW50IG1heCkgeworCisgICAgICAgIGludCBvbGRNYXhBY3RpdmVTZXNzaW9ucyA9IHRoaXMubWF4QWN0aXZlU2Vzc2lvbnM7CisgICAgICAgIHRoaXMubWF4QWN0aXZlU2Vzc2lvbnMgPSBtYXg7CisgICAgICAgIHN1cHBvcnQuZmlyZVByb3BlcnR5Q2hhbmdlKCJtYXhBY3RpdmVTZXNzaW9ucyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbnRlZ2VyKG9sZE1heEFjdGl2ZVNlc3Npb25zKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEludGVnZXIodGhpcy5tYXhBY3RpdmVTZXNzaW9ucykpOworCisgICAgfQorCisKKyAgICAvKiogCisgICAgICogTnVtYmVyIG9mIHNlc3Npb24gY3JlYXRpb25zIHRoYXQgZmFpbGVkIGR1ZSB0byBtYXhBY3RpdmVTZXNzaW9ucy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGNvdW50CisgICAgICovCisgICAgcHVibGljIGludCBnZXRSZWplY3RlZFNlc3Npb25zKCkgeworICAgICAgICByZXR1cm4gcmVqZWN0ZWRTZXNzaW9uczsKKyAgICB9CisKKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRSZWplY3RlZFNlc3Npb25zKGludCByZWplY3RlZFNlc3Npb25zKSB7CisgICAgICAgIHRoaXMucmVqZWN0ZWRTZXNzaW9ucyA9IHJlamVjdGVkU2Vzc2lvbnM7CisgICAgfQorCisKKyAgICBwdWJsaWMgbG9uZyBnZXRQcm9jZXNzaW5nVGltZSgpIHsKKyAgICAgICAgcmV0dXJuIHByb2Nlc3NpbmdUaW1lOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgc2V0UHJvY2Vzc2luZ1RpbWUobG9uZyBwcm9jZXNzaW5nVGltZSkgeworICAgICAgICB0aGlzLnByb2Nlc3NpbmdUaW1lID0gcHJvY2Vzc2luZ1RpbWU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGRlc2NyaXB0aXZlIHNob3J0IG5hbWUgb2YgdGhpcyBNYW5hZ2VyIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKworICAgICAgICByZXR1cm4gKG5hbWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHN0YXJ0ZWQgc3RhdHVzLgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGlzU3RhcnRlZCgpIHsKKworICAgICAgICByZXR1cm4gc3RhcnRlZDsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzdGFydGVkIGZsYWcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRTdGFydGVkKGJvb2xlYW4gc3RhcnRlZCkgeworCisgICAgICAgIHRoaXMuc3RhcnRlZCA9IHN0YXJ0ZWQ7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgU3RvcmUgb2JqZWN0IHdoaWNoIHdpbGwgbWFuYWdlIHBlcnNpc3RlbnQgU2Vzc2lvbgorICAgICAqIHN0b3JhZ2UgZm9yIHRoaXMgTWFuYWdlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdG9yZSB0aGUgYXNzb2NpYXRlZCBTdG9yZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFN0b3JlKFN0b3JlIHN0b3JlKSB7CisgICAgICAgIHRoaXMuc3RvcmUgPSBzdG9yZTsKKyAgICAgICAgc3RvcmUuc2V0TWFuYWdlcih0aGlzKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBTdG9yZSBvYmplY3Qgd2hpY2ggbWFuYWdlcyBwZXJzaXN0ZW50IFNlc3Npb24KKyAgICAgKiBzdG9yYWdlIGZvciB0aGlzIE1hbmFnZXIuCisgICAgICovCisgICAgcHVibGljIFN0b3JlIGdldFN0b3JlKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5zdG9yZSk7CisKKyAgICB9CisKKworCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgc2Vzc2lvbnMgYXJlIHNhdmVkIHdoZW4gdGhlIE1hbmFnZXIgaXMgc2h1dCBkb3duCisgICAgICogcHJvcGVybHkuIFRoaXMgcmVxdWlyZXMgdGhlIHVubG9hZCgpIG1ldGhvZCB0byBiZSBjYWxsZWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0U2F2ZU9uUmVzdGFydCgpIHsKKworICAgICAgICByZXR1cm4gc2F2ZU9uUmVzdGFydDsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBvcHRpb24gdG8gc2F2ZSBzZXNzaW9ucyB0byB0aGUgU3RvcmUgd2hlbiB0aGUgTWFuYWdlciBpcworICAgICAqIHNodXQgZG93biwgdGhlbiBsb2FkZWQgd2hlbiB0aGUgTWFuYWdlciBzdGFydHMgYWdhaW4uIElmIHNldCB0bworICAgICAqIGZhbHNlLCBhbnkgc2Vzc2lvbnMgZm91bmQgaW4gdGhlIFN0b3JlIG1heSBzdGlsbCBiZSBwaWNrZWQgdXAgd2hlbgorICAgICAqIHRoZSBNYW5hZ2VyIGlzIHN0YXJ0ZWQgYWdhaW4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2F2ZU9uUmVzdGFydCB0cnVlIGlmIHNlc3Npb25zIHNob3VsZCBiZSBzYXZlZCBvbiByZXN0YXJ0LCBmYWxzZSBpZgorICAgICAqICAgICB0aGV5IHNob3VsZCBiZSBpZ25vcmVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNhdmVPblJlc3RhcnQoYm9vbGVhbiBzYXZlT25SZXN0YXJ0KSB7CisKKyAgICAgICAgaWYgKHNhdmVPblJlc3RhcnQgPT0gdGhpcy5zYXZlT25SZXN0YXJ0KQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGJvb2xlYW4gb2xkU2F2ZU9uUmVzdGFydCA9IHRoaXMuc2F2ZU9uUmVzdGFydDsKKyAgICAgICAgdGhpcy5zYXZlT25SZXN0YXJ0ID0gc2F2ZU9uUmVzdGFydDsKKyAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoInNhdmVPblJlc3RhcnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQm9vbGVhbihvbGRTYXZlT25SZXN0YXJ0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJvb2xlYW4odGhpcy5zYXZlT25SZXN0YXJ0KSk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBDbGVhciBhbGwgc2Vzc2lvbnMgZnJvbSB0aGUgU3RvcmUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xlYXJTdG9yZSgpIHsKKworICAgICAgICBpZiAoc3RvcmUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICB0cnkgeyAgICAgCisgICAgICAgICAgICBpZiAoU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpICE9IG51bGwpeworICAgICAgICAgICAgICAgIHRyeXsKKyAgICAgICAgICAgICAgICAgICAgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRTdG9yZUNsZWFyKCkpOworICAgICAgICAgICAgICAgIH1jYXRjaChQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIGV4KXsKKyAgICAgICAgICAgICAgICAgICAgRXhjZXB0aW9uIGV4Y2VwdGlvbiA9IGV4LmdldEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkV4Y2VwdGlvbiBjbGVhcmluZyB0aGUgU3RvcmU6ICIgKyBleGNlcHRpb24pOworICAgICAgICAgICAgICAgICAgICBleGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKCk7ICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdG9yZS5jbGVhcigpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2cuZXJyb3IoIkV4Y2VwdGlvbiBjbGVhcmluZyB0aGUgU3RvcmU6ICIgKyBlKTsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogSW52YWxpZGF0ZSBhbGwgc2Vzc2lvbnMgdGhhdCBoYXZlIGV4cGlyZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHJvY2Vzc0V4cGlyZXMoKSB7CisKKyAgICAgICAgU2Vzc2lvbiBzZXNzaW9uc1tdID0gZmluZFNlc3Npb25zKCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXNzaW9ucy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgc2Vzc2lvbnNbaV0uaXNWYWxpZCgpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYnkgdGhlIGJhY2tncm91bmQgdGhyZWFkIGFmdGVyIGFjdGl2ZSBzZXNzaW9ucyBoYXZlCisgICAgICogYmVlbiBjaGVja2VkIGZvciBleHBpcmF0aW9uLCB0byBhbGxvdyBzZXNzaW9ucyB0byBiZQorICAgICAqIHN3YXBwZWQgb3V0LCBiYWNrZWQgdXAsIGV0Yy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwcm9jZXNzUGVyc2lzdGVuY2VDaGVja3MoKSB7CisKKyAgICAgICAgcHJvY2Vzc01heElkbGVTd2FwcygpOworICAgICAgICBwcm9jZXNzTWF4QWN0aXZlU3dhcHMoKTsKKyAgICAgICAgcHJvY2Vzc01heElkbGVCYWNrdXBzKCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgYWN0aXZlIFNlc3Npb24sIGFzc29jaWF0ZWQgd2l0aCB0aGlzIE1hbmFnZXIsIHdpdGggdGhlCisgICAgICogc3BlY2lmaWVkIHNlc3Npb24gaWQgKGlmIGFueSk7IG90aGVyd2lzZSByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogVGhpcyBtZXRob2QgY2hlY2tzIHRoZSBwZXJzaXN0ZW5jZSBzdG9yZSBpZiBwZXJzaXN0ZW5jZSBpcyBlbmFibGVkLAorICAgICAqIG90aGVyd2lzZSBqdXN0IHVzZXMgdGhlIGZ1bmN0aW9uYWxpdHkgZnJvbSBNYW5hZ2VyQmFzZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpZCBUaGUgc2Vzc2lvbiBpZCBmb3IgdGhlIHNlc3Npb24gdG8gYmUgcmV0dXJuZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIGEgbmV3IHNlc3Npb24gY2Fubm90IGJlCisgICAgICogIGluc3RhbnRpYXRlZCBmb3IgYW55IHJlYXNvbgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycyB3aGlsZQorICAgICAqICBwcm9jZXNzaW5nIHRoaXMgcmVxdWVzdAorICAgICAqLworICAgIHB1YmxpYyBTZXNzaW9uIGZpbmRTZXNzaW9uKFN0cmluZyBpZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSBzdXBlci5maW5kU2Vzc2lvbihpZCk7CisgICAgICAgIGlmIChzZXNzaW9uICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKHNlc3Npb24pOworCisgICAgICAgIC8vIFNlZSBpZiB0aGUgU2Vzc2lvbiBpcyBpbiB0aGUgU3RvcmUKKyAgICAgICAgc2Vzc2lvbiA9IHN3YXBJbihpZCk7CisgICAgICAgIHJldHVybiAoc2Vzc2lvbik7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgdGhpcyBTZXNzaW9uIGZyb20gdGhlIGFjdGl2ZSBTZXNzaW9ucyBmb3IgdGhpcyBNYW5hZ2VyLAorICAgICAqIGJ1dCBub3QgZnJvbSB0aGUgU3RvcmUuIChVc2VkIGJ5IHRoZSBQZXJzaXN0ZW50VmFsdmUpCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2Vzc2lvbiBTZXNzaW9uIHRvIGJlIHJlbW92ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVTdXBlcihTZXNzaW9uIHNlc3Npb24pIHsKKyAgICAgICAgc3VwZXIucmVtb3ZlIChzZXNzaW9uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2FkIGFsbCBzZXNzaW9ucyBmb3VuZCBpbiB0aGUgcGVyc2lzdGVuY2UgbWVjaGFuaXNtLCBhc3N1bWluZworICAgICAqIHRoZXkgYXJlIG1hcmtlZCBhcyB2YWxpZCBhbmQgaGF2ZSBub3QgcGFzc2VkIHRoZWlyIGV4cGlyYXRpb24KKyAgICAgKiBsaW1pdC4gSWYgcGVyc2lzdGVuY2UgaXMgbm90IHN1cHBvcnRlZCwgdGhpcyBtZXRob2QgcmV0dXJucworICAgICAqIHdpdGhvdXQgZG9pbmcgYW55dGhpbmcuCisgICAgICogPHA+CisgICAgICogTm90ZSB0aGF0IGJ5IGRlZmF1bHQsIHRoaXMgbWV0aG9kIGlzIG5vdCBjYWxsZWQgYnkgdGhlIE1pZGRsZU1hbmFnZXIKKyAgICAgKiBjbGFzcy4gSW4gb3JkZXIgdG8gdXNlIGl0LCBhIHN1YmNsYXNzIG11c3Qgc3BlY2lmaWNhbGx5IGNhbGwgaXQsCisgICAgICogZm9yIGV4YW1wbGUgaW4gdGhlIHN0YXJ0KCkgYW5kL29yIHByb2Nlc3NQZXJzaXN0ZW5jZUNoZWNrcygpIG1ldGhvZHMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgbG9hZCgpIHsKKworICAgICAgICAvLyBJbml0aWFsaXplIG91ciBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMKKyAgICAgICAgc2Vzc2lvbnMuY2xlYXIoKTsKKworICAgICAgICBpZiAoc3RvcmUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBTdHJpbmdbXSBpZHMgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSAhPSBudWxsKXsKKyAgICAgICAgICAgICAgICB0cnl7CisgICAgICAgICAgICAgICAgICAgIGlkcyA9IChTdHJpbmdbXSlBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZFN0b3JlS2V5cygpKTsKKyAgICAgICAgICAgICAgICB9Y2F0Y2goUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBleCl7CisgICAgICAgICAgICAgICAgICAgIEV4Y2VwdGlvbiBleGNlcHRpb24gPSBleC5nZXRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJFeGNlcHRpb24gY2xlYXJpbmcgdGhlIFN0b3JlOiAiICsgZXhjZXB0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uLnByaW50U3RhY2tUcmFjZSgpOyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWRzID0gc3RvcmUua2V5cygpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2cuZXJyb3IoIkNhbid0IGxvYWQgc2Vzc2lvbnMgZnJvbSBzdG9yZSwgIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGludCBuID0gaWRzLmxlbmd0aDsKKyAgICAgICAgaWYgKG4gPT0gMCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoc20uZ2V0U3RyaW5nKCJwZXJzaXN0ZW50TWFuYWdlci5sb2FkaW5nIiwgU3RyaW5nLnZhbHVlT2YobikpKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc3dhcEluKGlkc1tpXSk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJGYWlsZWQgbG9hZCBzZXNzaW9uIGZyb20gc3RvcmUsICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGlzIFNlc3Npb24gZnJvbSB0aGUgYWN0aXZlIFNlc3Npb25zIGZvciB0aGlzIE1hbmFnZXIsCisgICAgICogYW5kIGZyb20gdGhlIFN0b3JlLgorICAgICAqCisgICAgICogQHBhcmFtIHNlc3Npb24gU2Vzc2lvbiB0byBiZSByZW1vdmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlKFNlc3Npb24gc2Vzc2lvbikgeworCisgICAgICAgIHN1cGVyLnJlbW92ZSAoc2Vzc2lvbik7CisKKyAgICAgICAgaWYgKHN0b3JlICE9IG51bGwpeworICAgICAgICAgICAgcmVtb3ZlU2Vzc2lvbihzZXNzaW9uLmdldElkKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoaXMgU2Vzc2lvbiBmcm9tIHRoZSBhY3RpdmUgU2Vzc2lvbnMgZm9yIHRoaXMgTWFuYWdlciwKKyAgICAgKiBhbmQgZnJvbSB0aGUgU3RvcmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaWQgU2Vzc2lvbidzIGlkIHRvIGJlIHJlbW92ZWQKKyAgICAgKi8gICAgCisgICAgcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU2Vzc2lvbihTdHJpbmcgaWQpeworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSAhPSBudWxsKXsKKyAgICAgICAgICAgICAgICB0cnl7CisgICAgICAgICAgICAgICAgICAgIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkU3RvcmVSZW1vdmUoaWQpKTsKKyAgICAgICAgICAgICAgICB9Y2F0Y2goUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBleCl7CisgICAgICAgICAgICAgICAgICAgIEV4Y2VwdGlvbiBleGNlcHRpb24gPSBleC5nZXRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJFeGNlcHRpb24gY2xlYXJpbmcgdGhlIFN0b3JlOiAiICsgZXhjZXB0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uLnByaW50U3RhY2tUcmFjZSgpOyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgIHN0b3JlLnJlbW92ZShpZCk7CisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgCisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcigiRXhjZXB0aW9uIHJlbW92aW5nIHNlc3Npb24gICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9ICAgICAgICAKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTYXZlIGFsbCBjdXJyZW50bHkgYWN0aXZlIHNlc3Npb25zIGluIHRoZSBhcHByb3ByaWF0ZSBwZXJzaXN0ZW5jZQorICAgICAqIG1lY2hhbmlzbSwgaWYgYW55LiAgSWYgcGVyc2lzdGVuY2UgaXMgbm90IHN1cHBvcnRlZCwgdGhpcyBtZXRob2QKKyAgICAgKiByZXR1cm5zIHdpdGhvdXQgZG9pbmcgYW55dGhpbmcuCisgICAgICogPHA+CisgICAgICogTm90ZSB0aGF0IGJ5IGRlZmF1bHQsIHRoaXMgbWV0aG9kIGlzIG5vdCBjYWxsZWQgYnkgdGhlIE1pZGRsZU1hbmFnZXIKKyAgICAgKiBjbGFzcy4gSW4gb3JkZXIgdG8gdXNlIGl0LCBhIHN1YmNsYXNzIG11c3Qgc3BlY2lmaWNhbGx5IGNhbGwgaXQsCisgICAgICogZm9yIGV4YW1wbGUgaW4gdGhlIHN0b3AoKSBhbmQvb3IgcHJvY2Vzc1BlcnNpc3RlbmNlQ2hlY2tzKCkgbWV0aG9kcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB1bmxvYWQoKSB7CisKKyAgICAgICAgaWYgKHN0b3JlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgU2Vzc2lvbiBzZXNzaW9uc1tdID0gZmluZFNlc3Npb25zKCk7CisgICAgICAgIGludCBuID0gc2Vzc2lvbnMubGVuZ3RoOworICAgICAgICBpZiAobiA9PSAwKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZyhzbS5nZXRTdHJpbmcoInBlcnNpc3RlbnRNYW5hZ2VyLnVubG9hZGluZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKG4pKSk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHN3YXBPdXQoc2Vzc2lvbnNbaV0pOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIDsgICAvLyBUaGlzIGlzIGxvZ2dlZCBpbiB3cml0ZVNlc3Npb24oKQorICAgICAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvdGVjdGVkIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogTG9vayBmb3IgYSBzZXNzaW9uIGluIHRoZSBTdG9yZSBhbmQsIGlmIGZvdW5kLCByZXN0b3JlCisgICAgICogaXQgaW4gdGhlIE1hbmFnZXIncyBsaXN0IG9mIGFjdGl2ZSBzZXNzaW9ucyBpZiBhcHByb3ByaWF0ZS4KKyAgICAgKiBUaGUgc2Vzc2lvbiB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgU3RvcmUgYWZ0ZXIgc3dhcHBpbmcKKyAgICAgKiBpbiwgYnV0IHdpbGwgbm90IGJlIGFkZGVkIHRvIHRoZSBhY3RpdmUgc2Vzc2lvbiBsaXN0IGlmIGl0CisgICAgICogaXMgaW52YWxpZCBvciBwYXN0IGl0cyBleHBpcmF0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCBTZXNzaW9uIHN3YXBJbihTdHJpbmcgaWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKHN0b3JlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSAhPSBudWxsKXsKKyAgICAgICAgICAgICAgICB0cnl7CisgICAgICAgICAgICAgICAgICAgIHNlc3Npb24gPSAoU2Vzc2lvbikgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRTdG9yZUxvYWQoaWQpKTsKKyAgICAgICAgICAgICAgICB9Y2F0Y2goUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBleCl7CisgICAgICAgICAgICAgICAgICAgIEV4Y2VwdGlvbiBleGNlcHRpb24gPSBleC5nZXRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJFeGNlcHRpb24gY2xlYXJpbmcgdGhlIFN0b3JlOiAiICsgZXhjZXB0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4Y2VwdGlvbiBpbnN0YW5jZW9mIElPRXhjZXB0aW9uKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IChJT0V4Y2VwdGlvbilleGNlcHRpb247CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXhjZXB0aW9uIGluc3RhbmNlb2YgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgKENsYXNzTm90Rm91bmRFeGNlcHRpb24pZXhjZXB0aW9uOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgc2Vzc2lvbiA9IHN0b3JlLmxvYWQoaWQpOworICAgICAgICAgICAgfSAgIAorICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcihzbS5nZXRTdHJpbmcoInBlcnNpc3RlbnRNYW5hZ2VyLmRlc2VyaWFsaXplRXJyb3IiLCBpZCwgZSkpOworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInBlcnNpc3RlbnRNYW5hZ2VyLmRlc2VyaWFsaXplRXJyb3IiLCBpZCwgZSkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNlc3Npb24gPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisKKyAgICAgICAgaWYgKCFzZXNzaW9uLmlzVmFsaWQoKSkgeworICAgICAgICAgICAgbG9nLmVycm9yKCJzZXNzaW9uIHN3YXBwZWQgaW4gaXMgaW52YWxpZCBvciBleHBpcmVkIik7CisgICAgICAgICAgICBzZXNzaW9uLmV4cGlyZSgpOworICAgICAgICAgICAgcmVtb3ZlU2Vzc2lvbihpZCk7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoc20uZ2V0U3RyaW5nKCJwZXJzaXN0ZW50TWFuYWdlci5zd2FwSW4iLCBpZCkpOworCisgICAgICAgIHNlc3Npb24uc2V0TWFuYWdlcih0aGlzKTsKKyAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSBsaXN0ZW5lcnMga25vdyBhYm91dCBpdC4KKyAgICAgICAgKChTdGFuZGFyZFNlc3Npb24pc2Vzc2lvbikudGVsbE5ldygpOworICAgICAgICBhZGQoc2Vzc2lvbik7CisgICAgICAgICgoU3RhbmRhcmRTZXNzaW9uKXNlc3Npb24pLmFjdGl2YXRlKCk7CisgICAgICAgIHNlc3Npb24uZW5kQWNjZXNzKCk7CisKKyAgICAgICAgcmV0dXJuIChzZXNzaW9uKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBzZXNzaW9uIGZyb20gdGhlIE1hbmFnZXIncyBsaXN0IG9mIGFjdGl2ZQorICAgICAqIHNlc3Npb25zIGFuZCB3cml0ZSBpdCBvdXQgdG8gdGhlIFN0b3JlLiBJZiB0aGUgc2Vzc2lvbgorICAgICAqIGlzIHBhc3QgaXRzIGV4cGlyYXRpb24gb3IgaW52YWxpZCwgdGhpcyBtZXRob2QgZG9lcworICAgICAqIG5vdGhpbmcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2Vzc2lvbiBUaGUgU2Vzc2lvbiB0byB3cml0ZSBvdXQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc3dhcE91dChTZXNzaW9uIHNlc3Npb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKHN0b3JlID09IG51bGwgfHwgIXNlc3Npb24uaXNWYWxpZCgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAoKFN0YW5kYXJkU2Vzc2lvbilzZXNzaW9uKS5wYXNzaXZhdGUoKTsKKyAgICAgICAgd3JpdGVTZXNzaW9uKHNlc3Npb24pOworICAgICAgICBzdXBlci5yZW1vdmUoc2Vzc2lvbik7CisgICAgICAgIHNlc3Npb24ucmVjeWNsZSgpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBXcml0ZSB0aGUgcHJvdmlkZWQgc2Vzc2lvbiB0byB0aGUgU3RvcmUgd2l0aG91dCBtb2RpZnlpbmcKKyAgICAgKiB0aGUgY29weSBpbiBtZW1vcnkgb3IgdHJpZ2dlcmluZyBwYXNzaXZhdGlvbiBldmVudHMuIERvZXMKKyAgICAgKiBub3RoaW5nIGlmIHRoZSBzZXNzaW9uIGlzIGludmFsaWQgb3IgcGFzdCBpdHMgZXhwaXJhdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZVNlc3Npb24oU2Vzc2lvbiBzZXNzaW9uKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIGlmIChzdG9yZSA9PSBudWxsIHx8ICFzZXNzaW9uLmlzVmFsaWQoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCkgIT0gbnVsbCl7CisgICAgICAgICAgICAgICAgdHJ5eworICAgICAgICAgICAgICAgICAgICBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZFN0b3JlU2F2ZShzZXNzaW9uKSk7CisgICAgICAgICAgICAgICAgfWNhdGNoKFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24gZXgpeworICAgICAgICAgICAgICAgICAgICBFeGNlcHRpb24gZXhjZXB0aW9uID0gZXguZ2V0RXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiRXhjZXB0aW9uIGNsZWFyaW5nIHRoZSBTdG9yZTogIiArIGV4Y2VwdGlvbik7CisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2UoKTsgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICBzdG9yZS5zYXZlKHNlc3Npb24pOworICAgICAgICAgICAgfSAgIAorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2cuZXJyb3Ioc20uZ2V0U3RyaW5nCisgICAgICAgICAgICAgICAgKCJwZXJzaXN0ZW50TWFuYWdlci5zZXJpYWxpemVFcnJvciIsIHNlc3Npb24uZ2V0SWQoKSwgZSkpOworICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTGlmZWN5Y2xlIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogQWRkIGEgbGlmZWN5Y2xlIGV2ZW50IGxpc3RlbmVyIHRvIHRoaXMgY29tcG9uZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciB0byBhZGQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRMaWZlY3ljbGVMaXN0ZW5lcihMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lcikgeworCisgICAgICAgIGxpZmVjeWNsZS5hZGRMaWZlY3ljbGVMaXN0ZW5lcihsaXN0ZW5lcik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbGlmZWN5Y2xlIGxpc3RlbmVycyBhc3NvY2lhdGVkIHdpdGggdGhpcyBsaWZlY3ljbGUuIElmIHRoaXMgCisgICAgICogTGlmZWN5Y2xlIGhhcyBubyBsaXN0ZW5lcnMgcmVnaXN0ZXJlZCwgYSB6ZXJvLWxlbmd0aCBhcnJheSBpcyByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlmZWN5Y2xlTGlzdGVuZXJbXSBmaW5kTGlmZWN5Y2xlTGlzdGVuZXJzKCkgeworCisgICAgICAgIHJldHVybiBsaWZlY3ljbGUuZmluZExpZmVjeWNsZUxpc3RlbmVycygpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSBsaWZlY3ljbGUgZXZlbnQgbGlzdGVuZXIgZnJvbSB0aGlzIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgdG8gcmVtb3ZlCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlTGlmZWN5Y2xlTGlzdGVuZXIoTGlmZWN5Y2xlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKworICAgICAgICBsaWZlY3ljbGUucmVtb3ZlTGlmZWN5Y2xlTGlzdGVuZXIobGlzdGVuZXIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBQcmVwYXJlIGZvciB0aGUgYmVnaW5uaW5nIG9mIGFjdGl2ZSB1c2Ugb2YgdGhlIHB1YmxpYyBtZXRob2RzIG9mIHRoaXMKKyAgICAgKiBjb21wb25lbnQuICBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIDxjb2RlPmNvbmZpZ3VyZSgpPC9jb2RlPiwKKyAgICAgKiBhbmQgYmVmb3JlIGFueSBvZiB0aGUgcHVibGljIG1ldGhvZHMgb2YgdGhlIGNvbXBvbmVudCBhcmUgdXRpbGl6ZWQuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIExpZmVjeWNsZUV4Y2VwdGlvbiBpZiB0aGlzIGNvbXBvbmVudCBkZXRlY3RzIGEgZmF0YWwgZXJyb3IKKyAgICAgKiAgdGhhdCBwcmV2ZW50cyB0aGlzIGNvbXBvbmVudCBmcm9tIGJlaW5nIHVzZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb24geworCisgICAgICAgIC8vIFZhbGlkYXRlIGFuZCB1cGRhdGUgb3VyIGN1cnJlbnQgY29tcG9uZW50IHN0YXRlCisgICAgICAgIGlmIChzdGFydGVkKSB7CisgICAgICAgICAgICBsb2cuaW5mbyhzbS5nZXRTdHJpbmcoInN0YW5kYXJkTWFuYWdlci5hbHJlYWR5U3RhcnRlZCIpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiggISBpbml0aWFsaXplZCApCisgICAgICAgICAgICBpbml0KCk7CisgICAgICAgIAorICAgICAgICBsaWZlY3ljbGUuZmlyZUxpZmVjeWNsZUV2ZW50KFNUQVJUX0VWRU5ULCBudWxsKTsKKyAgICAgICAgc3RhcnRlZCA9IHRydWU7CisKKyAgICAgICAgLy8gRm9yY2UgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiRm9yY2UgcmFuZG9tIG51bWJlciBpbml0aWFsaXphdGlvbiBzdGFydGluZyIpOworICAgICAgICBTdHJpbmcgZHVtbXkgPSBnZW5lcmF0ZVNlc3Npb25JZCgpOworICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoIkZvcmNlIHJhbmRvbSBudW1iZXIgaW5pdGlhbGl6YXRpb24gY29tcGxldGVkIik7CisKKyAgICAgICAgaWYgKHN0b3JlID09IG51bGwpCisgICAgICAgICAgICBsb2cuZXJyb3IoIk5vIFN0b3JlIGNvbmZpZ3VyZWQsIHBlcnNpc3RlbmNlIGRpc2FibGVkIik7CisgICAgICAgIGVsc2UgaWYgKHN0b3JlIGluc3RhbmNlb2YgTGlmZWN5Y2xlKQorICAgICAgICAgICAgKChMaWZlY3ljbGUpc3RvcmUpLnN0YXJ0KCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdyYWNlZnVsbHkgdGVybWluYXRlIHRoZSBhY3RpdmUgdXNlIG9mIHRoZSBwdWJsaWMgbWV0aG9kcyBvZiB0aGlzCisgICAgICogY29tcG9uZW50LiAgVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHRoZSBsYXN0IG9uZSBjYWxsZWQgb24gYSBnaXZlbgorICAgICAqIGluc3RhbmNlIG9mIHRoaXMgY29tcG9uZW50LgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBMaWZlY3ljbGVFeGNlcHRpb24gaWYgdGhpcyBjb21wb25lbnQgZGV0ZWN0cyBhIGZhdGFsIGVycm9yCisgICAgICogIHRoYXQgbmVlZHMgdG8gYmUgcmVwb3J0ZWQKKyAgICAgKi8KKyAgIHB1YmxpYyB2b2lkIHN0b3AoKSB0aHJvd3MgTGlmZWN5Y2xlRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoIlN0b3BwaW5nIik7CisKKyAgICAgICAgLy8gVmFsaWRhdGUgYW5kIHVwZGF0ZSBvdXIgY3VycmVudCBjb21wb25lbnQgc3RhdGUKKyAgICAgICAgaWYgKCFpc1N0YXJ0ZWQoKSkgeworICAgICAgICAgICAgbG9nLmluZm8oc20uZ2V0U3RyaW5nKCJzdGFuZGFyZE1hbmFnZXIubm90U3RhcnRlZCIpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgbGlmZWN5Y2xlLmZpcmVMaWZlY3ljbGVFdmVudChTVE9QX0VWRU5ULCBudWxsKTsKKyAgICAgICAgc2V0U3RhcnRlZChmYWxzZSk7CisKKyAgICAgICAgaWYgKGdldFN0b3JlKCkgIT0gbnVsbCAmJiBzYXZlT25SZXN0YXJ0KSB7CisgICAgICAgICAgICB1bmxvYWQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIEV4cGlyZSBhbGwgYWN0aXZlIHNlc3Npb25zCisgICAgICAgICAgICBTZXNzaW9uIHNlc3Npb25zW10gPSBmaW5kU2Vzc2lvbnMoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2Vzc2lvbnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBTdGFuZGFyZFNlc3Npb24gc2Vzc2lvbiA9IChTdGFuZGFyZFNlc3Npb24pIHNlc3Npb25zW2ldOworICAgICAgICAgICAgICAgIGlmICghc2Vzc2lvbi5pc1ZhbGlkKCkpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIHNlc3Npb24uZXhwaXJlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoZ2V0U3RvcmUoKSAhPSBudWxsICYmIGdldFN0b3JlKCkgaW5zdGFuY2VvZiBMaWZlY3ljbGUpCisgICAgICAgICAgICAoKExpZmVjeWNsZSlnZXRTdG9yZSgpKS5zdG9wKCk7CisKKyAgICAgICAgLy8gUmVxdWlyZSBhIG5ldyByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBpZiB3ZSBhcmUgcmVzdGFydGVkCisgICAgICAgIHRoaXMucmFuZG9tID0gbnVsbDsKKworICAgICAgICBpZiggaW5pdGlhbGl6ZWQgKQorICAgICAgICAgICAgZGVzdHJveSgpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUHJvY2VzcyBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnRzIGZyb20gb3VyIGFzc29jaWF0ZWQgQ29udGV4dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudCBUaGUgcHJvcGVydHkgY2hhbmdlIGV2ZW50IHRoYXQgaGFzIG9jY3VycmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgeworCisgICAgICAgIC8vIFZhbGlkYXRlIHRoZSBzb3VyY2Ugb2YgdGhpcyBldmVudAorICAgICAgICBpZiAoIShldmVudC5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIENvbnRleHQpKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBDb250ZXh0IGNvbnRleHQgPSAoQ29udGV4dCkgZXZlbnQuZ2V0U291cmNlKCk7CisKKyAgICAgICAgLy8gUHJvY2VzcyBhIHJlbGV2YW50IHByb3BlcnR5IGNoYW5nZQorICAgICAgICBpZiAoZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkuZXF1YWxzKCJzZXNzaW9uVGltZW91dCIpKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHNldE1heEluYWN0aXZlSW50ZXJ2YWwKKyAgICAgICAgICAgICAgICAgICAgKCAoKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCkpLmludFZhbHVlKCkqNjAgKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKHNtLmdldFN0cmluZygic3RhbmRhcmRNYW5hZ2VyLnNlc3Npb25UaW1lb3V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmdldE5ld1ZhbHVlKCkudG9TdHJpbmcoKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm90ZWN0ZWQgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBTd2FwIGlkbGUgc2Vzc2lvbnMgb3V0IHRvIFN0b3JlIGlmIHRoZXkgYXJlIGlkbGUgdG9vIGxvbmcuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc01heElkbGVTd2FwcygpIHsKKworICAgICAgICBpZiAoIWlzU3RhcnRlZCgpIHx8IG1heElkbGVTd2FwIDwgMCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBTZXNzaW9uIHNlc3Npb25zW10gPSBmaW5kU2Vzc2lvbnMoKTsKKyAgICAgICAgbG9uZyB0aW1lTm93ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisKKyAgICAgICAgLy8gU3dhcCBvdXQgYWxsIHNlc3Npb25zIGlkbGUgbG9uZ2VyIHRoYW4gbWF4SWRsZVN3YXAKKyAgICAgICAgLy8gRklYTUU6IFdoYXQncyBwcmV2ZW50aW5nIHVzIGZyb20gbWFuZ2xpbmcgYSBzZXNzaW9uIGR1cmluZworICAgICAgICAvLyBhIHJlcXVlc3Q/CisgICAgICAgIGlmIChtYXhJZGxlU3dhcCA+PSAwKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlc3Npb25zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgU3RhbmRhcmRTZXNzaW9uIHNlc3Npb24gPSAoU3RhbmRhcmRTZXNzaW9uKSBzZXNzaW9uc1tpXTsKKyAgICAgICAgICAgICAgICBpZiAoIXNlc3Npb24uaXNWYWxpZCgpKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBpbnQgdGltZUlkbGUgPSAvLyBUcnVuY2F0ZSwgZG8gbm90IHJvdW5kIHVwCisgICAgICAgICAgICAgICAgICAgIChpbnQpICgodGltZU5vdyAtIHNlc3Npb24uZ2V0TGFzdEFjY2Vzc2VkVGltZSgpKSAvIDEwMDBMKTsKKyAgICAgICAgICAgICAgICBpZiAodGltZUlkbGUgPiBtYXhJZGxlU3dhcCAmJiB0aW1lSWRsZSA+IG1pbklkbGVTd2FwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhzbS5nZXRTdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoInBlcnNpc3RlbnRNYW5hZ2VyLnN3YXBNYXhJZGxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRJZCgpLCBuZXcgSW50ZWdlcih0aW1lSWRsZSkpKTsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBPdXQoc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIDsgICAvLyBUaGlzIGlzIGxvZ2dlZCBpbiB3cml0ZVNlc3Npb24oKQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFN3YXAgaWRsZSBzZXNzaW9ucyBvdXQgdG8gU3RvcmUgaWYgdG9vIG1hbnkgYXJlIGFjdGl2ZQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NNYXhBY3RpdmVTd2FwcygpIHsKKworICAgICAgICBpZiAoIWlzU3RhcnRlZCgpIHx8IGdldE1heEFjdGl2ZVNlc3Npb25zKCkgPCAwKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIFNlc3Npb24gc2Vzc2lvbnNbXSA9IGZpbmRTZXNzaW9ucygpOworCisgICAgICAgIC8vIEZJWE1FOiBTbWFydGVyIGFsZ29yaXRobSAoTFJVKQorICAgICAgICBpZiAoZ2V0TWF4QWN0aXZlU2Vzc2lvbnMoKSA+PSBzZXNzaW9ucy5sZW5ndGgpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoc20uZ2V0U3RyaW5nCisgICAgICAgICAgICAgICAgKCJwZXJzaXN0ZW50TWFuYWdlci50b29NYW55QWN0aXZlIiwKKyAgICAgICAgICAgICAgICAgbmV3IEludGVnZXIoc2Vzc2lvbnMubGVuZ3RoKSkpOworCisgICAgICAgIGludCB0b3N3YXAgPSBzZXNzaW9ucy5sZW5ndGggLSBnZXRNYXhBY3RpdmVTZXNzaW9ucygpOworICAgICAgICBsb25nIHRpbWVOb3cgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlc3Npb25zLmxlbmd0aCAmJiB0b3N3YXAgPiAwOyBpKyspIHsKKyAgICAgICAgICAgIGludCB0aW1lSWRsZSA9IC8vIFRydW5jYXRlLCBkbyBub3Qgcm91bmQgdXAKKyAgICAgICAgICAgICAgICAoaW50KSAoKHRpbWVOb3cgLSBzZXNzaW9uc1tpXS5nZXRMYXN0QWNjZXNzZWRUaW1lKCkpIC8gMTAwMEwpOworICAgICAgICAgICAgaWYgKHRpbWVJZGxlID4gbWluSWRsZVN3YXApIHsKKyAgICAgICAgICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKHNtLmdldFN0cmluZworICAgICAgICAgICAgICAgICAgICAgICAgKCJwZXJzaXN0ZW50TWFuYWdlci5zd2FwVG9vTWFueUFjdGl2ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbnNbaV0uZ2V0SWQoKSwgbmV3IEludGVnZXIodGltZUlkbGUpKSk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgc3dhcE91dChzZXNzaW9uc1tpXSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICA7ICAgLy8gVGhpcyBpcyBsb2dnZWQgaW4gd3JpdGVTZXNzaW9uKCkKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdG9zd2FwLS07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQmFjayB1cCBpZGxlIHNlc3Npb25zLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NNYXhJZGxlQmFja3VwcygpIHsKKworICAgICAgICBpZiAoIWlzU3RhcnRlZCgpIHx8IG1heElkbGVCYWNrdXAgPCAwKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIFNlc3Npb24gc2Vzc2lvbnNbXSA9IGZpbmRTZXNzaW9ucygpOworICAgICAgICBsb25nIHRpbWVOb3cgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKworICAgICAgICAvLyBCYWNrIHVwIGFsbCBzZXNzaW9ucyBpZGxlIGxvbmdlciB0aGFuIG1heElkbGVCYWNrdXAKKyAgICAgICAgaWYgKG1heElkbGVCYWNrdXAgPj0gMCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXNzaW9ucy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIFN0YW5kYXJkU2Vzc2lvbiBzZXNzaW9uID0gKFN0YW5kYXJkU2Vzc2lvbikgc2Vzc2lvbnNbaV07CisgICAgICAgICAgICAgICAgaWYgKCFzZXNzaW9uLmlzVmFsaWQoKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgaW50IHRpbWVJZGxlID0gLy8gVHJ1bmNhdGUsIGRvIG5vdCByb3VuZCB1cAorICAgICAgICAgICAgICAgICAgICAoaW50KSAoKHRpbWVOb3cgLSBzZXNzaW9uLmdldExhc3RBY2Nlc3NlZFRpbWUoKSkgLyAxMDAwTCk7CisgICAgICAgICAgICAgICAgaWYgKHRpbWVJZGxlID4gbWF4SWRsZUJhY2t1cCkgeworICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoc20uZ2V0U3RyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJwZXJzaXN0ZW50TWFuYWdlci5iYWNrdXBNYXhJZGxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldElkKCksIG5ldyBJbnRlZ2VyKHRpbWVJZGxlKSkpOworCisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVNlc3Npb24oc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIDsgICAvLyBUaGlzIGlzIGxvZ2dlZCBpbiB3cml0ZVNlc3Npb24oKQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3Nlc3Npb24vU3RhbmRhcmRNYW5hZ2VyLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc2Vzc2lvbi9TdGFuZGFyZE1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmYzMWI4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3Nlc3Npb24vU3RhbmRhcmRNYW5hZ2VyLmphdmEKQEAgLTAsMCArMSw3ODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc2Vzc2lvbjsKKworaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VFdmVudDsKK2ltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7CitpbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5HbG9iYWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Mb2FkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5TZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5DdXN0b21PYmplY3RJbnB1dFN0cmVhbTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuTGlmZWN5Y2xlU3VwcG9ydDsKKworCisvKioKKyAqIFN0YW5kYXJkIGltcGxlbWVudGF0aW9uIG9mIHRoZSA8Yj5NYW5hZ2VyPC9iPiBpbnRlcmZhY2UgdGhhdCBwcm92aWRlcworICogc2ltcGxlIHNlc3Npb24gcGVyc2lzdGVuY2UgYWNyb3NzIHJlc3RhcnRzIG9mIHRoaXMgY29tcG9uZW50IChzdWNoIGFzCisgKiB3aGVuIHRoZSBlbnRpcmUgc2VydmVyIGlzIHNodXQgZG93biBhbmQgcmVzdGFydGVkLCBvciB3aGVuIGEgcGFydGljdWxhcgorICogd2ViIGFwcGxpY2F0aW9uIGlzIHJlbG9hZGVkLgorICogPHA+CisgKiA8Yj5JTVBMRU1FTlRBVElPTiBOT1RFPC9iPjogIENvcnJlY3QgYmVoYXZpb3Igb2Ygc2Vzc2lvbiBzdG9yaW5nIGFuZAorICogcmVsb2FkaW5nIGRlcGVuZHMgdXBvbiBleHRlcm5hbCBjYWxscyB0byB0aGUgPGNvZGU+c3RhcnQoKTwvY29kZT4gYW5kCisgKiA8Y29kZT5zdG9wKCk8L2NvZGU+IG1ldGhvZHMgb2YgdGhpcyBjbGFzcyBhdCB0aGUgY29ycmVjdCB0aW1lcy4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEBhdXRob3IgSmVhbi1GcmFuY29pcyBBcmNhbmQKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIFN0YW5kYXJkTWFuYWdlcgorICAgIGV4dGVuZHMgTWFuYWdlckJhc2UKKyAgICBpbXBsZW1lbnRzIExpZmVjeWNsZSwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNlY3VyaXR5IENsYXNzZXMKKyAgICBwcml2YXRlIGNsYXNzIFByaXZpbGVnZWREb0xvYWQKKyAgICAgICAgaW1wbGVtZW50cyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uIHsKKworICAgICAgICBQcml2aWxlZ2VkRG9Mb2FkKCkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgRXhjZXB0aW9ueworICAgICAgICAgICBkb0xvYWQoKTsKKyAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFByaXZpbGVnZWREb1VubG9hZAorICAgICAgICBpbXBsZW1lbnRzIFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24geworCisgICAgICAgIFByaXZpbGVnZWREb1VubG9hZCgpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbnsKKyAgICAgICAgICAgIGRvVW5sb2FkKCk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgaW5mbyA9ICJTdGFuZGFyZE1hbmFnZXIvMS4wIjsKKworCisgICAgLyoqCisgICAgICogVGhlIGxpZmVjeWNsZSBldmVudCBzdXBwb3J0IGZvciB0aGlzIGNvbXBvbmVudC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTGlmZWN5Y2xlU3VwcG9ydCBsaWZlY3ljbGUgPSBuZXcgTGlmZWN5Y2xlU3VwcG9ydCh0aGlzKTsKKworCisgICAgLyoqCisgICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGFjdGl2ZSBTZXNzaW9ucyBhbGxvd2VkLCBvciAtMSBmb3Igbm8gbGltaXQuCisgICAgICovCisgICAgcHJvdGVjdGVkIGludCBtYXhBY3RpdmVTZXNzaW9ucyA9IC0xOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVzY3JpcHRpdmUgbmFtZSBvZiB0aGlzIE1hbmFnZXIgaW1wbGVtZW50YXRpb24gKGZvciBsb2dnaW5nKS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBuYW1lID0gIlN0YW5kYXJkTWFuYWdlciI7CisKKworICAgIC8qKgorICAgICAqIFBhdGggbmFtZSBvZiB0aGUgZGlzayBmaWxlIGluIHdoaWNoIGFjdGl2ZSBzZXNzaW9ucyBhcmUgc2F2ZWQKKyAgICAgKiB3aGVuIHdlIHN0b3AsIGFuZCBmcm9tIHdoaWNoIHRoZXNlIHNlc3Npb25zIGFyZSBsb2FkZWQgd2hlbiB3ZSBzdGFydC4KKyAgICAgKiBBIDxjb2RlPm51bGw8L2NvZGU+IHZhbHVlIGluZGljYXRlcyB0aGF0IG5vIHBlcnNpc3RlbmNlIGlzIGRlc2lyZWQuCisgICAgICogSWYgdGhpcyBwYXRobmFtZSBpcyByZWxhdGl2ZSwgaXQgd2lsbCBiZSByZXNvbHZlZCBhZ2FpbnN0IHRoZQorICAgICAqIHRlbXBvcmFyeSB3b3JraW5nIGRpcmVjdG9yeSBwcm92aWRlZCBieSBvdXIgY29udGV4dCwgYXZhaWxhYmxlIHZpYQorICAgICAqIHRoZSA8Y29kZT5qYXZheC5zZXJ2bGV0LmNvbnRleHQudGVtcGRpcjwvY29kZT4gY29udGV4dCBhdHRyaWJ1dGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBwYXRobmFtZSA9ICJTRVNTSU9OUy5zZXIiOworCisKKyAgICAvKioKKyAgICAgKiBIYXMgdGhpcyBjb21wb25lbnQgYmVlbiBzdGFydGVkIHlldD8KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzdGFydGVkID0gZmFsc2U7CisKKworICAgIC8qKgorICAgICAqIE51bWJlciBvZiBzZXNzaW9uIGNyZWF0aW9ucyB0aGF0IGZhaWxlZCBkdWUgdG8gbWF4QWN0aXZlU2Vzc2lvbnMuCisgICAgICovCisgICAgcHJvdGVjdGVkIGludCByZWplY3RlZFNlc3Npb25zID0gMDsKKworCisgICAgLyoqCisgICAgICogUHJvY2Vzc2luZyB0aW1lIGR1cmluZyBzZXNzaW9uIGV4cGlyYXRpb24uCisgICAgICovCisgICAgcHJvdGVjdGVkIGxvbmcgcHJvY2Vzc2luZ1RpbWUgPSAwOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBDb250YWluZXIgd2l0aCB3aGljaCB0aGlzIE1hbmFnZXIgaGFzIGJlZW4gYXNzb2NpYXRlZC4gIElmCisgICAgICogaXQgaXMgYSBDb250ZXh0ICh0aGUgdXN1YWwgY2FzZSksIGxpc3RlbiBmb3IgY2hhbmdlcyB0byB0aGUgc2Vzc2lvbgorICAgICAqIHRpbWVvdXQgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBhc3NvY2lhdGVkIENvbnRhaW5lcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbnRhaW5lcihDb250YWluZXIgY29udGFpbmVyKSB7CisKKyAgICAgICAgLy8gRGUtcmVnaXN0ZXIgZnJvbSB0aGUgb2xkIENvbnRhaW5lciAoaWYgYW55KQorICAgICAgICBpZiAoKHRoaXMuY29udGFpbmVyICE9IG51bGwpICYmICh0aGlzLmNvbnRhaW5lciBpbnN0YW5jZW9mIENvbnRleHQpKQorICAgICAgICAgICAgKChDb250ZXh0KSB0aGlzLmNvbnRhaW5lcikucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKKworICAgICAgICAvLyBEZWZhdWx0IHByb2Nlc3NpbmcgcHJvdmlkZWQgYnkgb3VyIHN1cGVyY2xhc3MKKyAgICAgICAgc3VwZXIuc2V0Q29udGFpbmVyKGNvbnRhaW5lcik7CisKKyAgICAgICAgLy8gUmVnaXN0ZXIgd2l0aCB0aGUgbmV3IENvbnRhaW5lciAoaWYgYW55KQorICAgICAgICBpZiAoKHRoaXMuY29udGFpbmVyICE9IG51bGwpICYmICh0aGlzLmNvbnRhaW5lciBpbnN0YW5jZW9mIENvbnRleHQpKSB7CisgICAgICAgICAgICBzZXRNYXhJbmFjdGl2ZUludGVydmFsCisgICAgICAgICAgICAgICAgKCAoKENvbnRleHQpIHRoaXMuY29udGFpbmVyKS5nZXRTZXNzaW9uVGltZW91dCgpKjYwICk7CisgICAgICAgICAgICAoKENvbnRleHQpIHRoaXMuY29udGFpbmVyKS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRoaXMpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIE1hbmFnZXIgaW1wbGVtZW50YXRpb24gYW5kCisgICAgICogdGhlIGNvcnJlc3BvbmRpbmcgdmVyc2lvbiBudW1iZXIsIGluIHRoZSBmb3JtYXQKKyAgICAgKiA8Y29kZT4mbHQ7ZGVzY3JpcHRpb24mZ3Q7LyZsdDt2ZXJzaW9uJmd0OzwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJbmZvKCkgeworCisgICAgICAgIHJldHVybiAoaW5mbyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbWF4aW11bSBudW1iZXIgb2YgYWN0aXZlIFNlc3Npb25zIGFsbG93ZWQsIG9yIC0xIGZvcgorICAgICAqIG5vIGxpbWl0LgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0TWF4QWN0aXZlU2Vzc2lvbnMoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLm1heEFjdGl2ZVNlc3Npb25zKTsKKworICAgIH0KKworCisgICAgLyoqIE51bWJlciBvZiBzZXNzaW9uIGNyZWF0aW9ucyB0aGF0IGZhaWxlZCBkdWUgdG8gbWF4QWN0aXZlU2Vzc2lvbnMKKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGNvdW50CisgICAgICovCisgICAgcHVibGljIGludCBnZXRSZWplY3RlZFNlc3Npb25zKCkgeworICAgICAgICByZXR1cm4gcmVqZWN0ZWRTZXNzaW9uczsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldFJlamVjdGVkU2Vzc2lvbnMoaW50IHJlamVjdGVkU2Vzc2lvbnMpIHsKKyAgICAgICAgdGhpcy5yZWplY3RlZFNlc3Npb25zID0gcmVqZWN0ZWRTZXNzaW9uczsKKyAgICB9CisKKworICAgIHB1YmxpYyBsb25nIGdldFByb2Nlc3NpbmdUaW1lKCkgeworICAgICAgICByZXR1cm4gcHJvY2Vzc2luZ1RpbWU7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9jZXNzaW5nVGltZShsb25nIHByb2Nlc3NpbmdUaW1lKSB7CisgICAgICAgIHRoaXMucHJvY2Vzc2luZ1RpbWUgPSBwcm9jZXNzaW5nVGltZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbWF4aW11bSBudW1iZXIgb2YgYWN0aXZlcyBTZXNzaW9ucyBhbGxvd2VkLCBvciAtMSBmb3IKKyAgICAgKiBubyBsaW1pdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXggVGhlIG5ldyBtYXhpbXVtIG51bWJlciBvZiBzZXNzaW9ucworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1heEFjdGl2ZVNlc3Npb25zKGludCBtYXgpIHsKKworICAgICAgICBpbnQgb2xkTWF4QWN0aXZlU2Vzc2lvbnMgPSB0aGlzLm1heEFjdGl2ZVNlc3Npb25zOworICAgICAgICB0aGlzLm1heEFjdGl2ZVNlc3Npb25zID0gbWF4OworICAgICAgICBzdXBwb3J0LmZpcmVQcm9wZXJ0eUNoYW5nZSgibWF4QWN0aXZlU2Vzc2lvbnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSW50ZWdlcihvbGRNYXhBY3RpdmVTZXNzaW9ucyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbnRlZ2VyKHRoaXMubWF4QWN0aXZlU2Vzc2lvbnMpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBkZXNjcmlwdGl2ZSBzaG9ydCBuYW1lIG9mIHRoaXMgTWFuYWdlciBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisKKyAgICAgICAgcmV0dXJuIChuYW1lKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXNzaW9uIHBlcnNpc3RlbmNlIHBhdGhuYW1lLCBpZiBhbnkuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRQYXRobmFtZSgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMucGF0aG5hbWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHNlc3Npb24gcGVyc2lzdGVuY2UgcGF0aG5hbWUgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4gIElmIG5vCisgICAgICogcGVyc2lzdGVuY2Ugc3VwcG9ydCBpcyBkZXNpcmVkLCBzZXQgdGhlIHBhdGhuYW1lIHRvIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIHBhdGhuYW1lIE5ldyBzZXNzaW9uIHBlcnNpc3RlbmNlIHBhdGhuYW1lCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGF0aG5hbWUoU3RyaW5nIHBhdGhuYW1lKSB7CisKKyAgICAgICAgU3RyaW5nIG9sZFBhdGhuYW1lID0gdGhpcy5wYXRobmFtZTsKKyAgICAgICAgdGhpcy5wYXRobmFtZSA9IHBhdGhuYW1lOworICAgICAgICBzdXBwb3J0LmZpcmVQcm9wZXJ0eUNoYW5nZSgicGF0aG5hbWUiLCBvbGRQYXRobmFtZSwgdGhpcy5wYXRobmFtZSk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGFuZCByZXR1cm4gYSBuZXcgc2Vzc2lvbiBvYmplY3QsIGJhc2VkIG9uIHRoZSBkZWZhdWx0CisgICAgICogc2V0dGluZ3Mgc3BlY2lmaWVkIGJ5IHRoaXMgTWFuYWdlcidzIHByb3BlcnRpZXMuICBUaGUgc2Vzc2lvbgorICAgICAqIGlkIHdpbGwgYmUgYXNzaWduZWQgYnkgdGhpcyBtZXRob2QsIGFuZCBhdmFpbGFibGUgdmlhIHRoZSBnZXRJZCgpCisgICAgICogbWV0aG9kIG9mIHRoZSByZXR1cm5lZCBzZXNzaW9uLiAgSWYgYSBuZXcgc2Vzc2lvbiBjYW5ub3QgYmUgY3JlYXRlZAorICAgICAqIGZvciBhbnkgcmVhc29uLCByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiBhIG5ldyBzZXNzaW9uIGNhbm5vdCBiZQorICAgICAqICBpbnN0YW50aWF0ZWQgZm9yIGFueSByZWFzb24KKyAgICAgKi8KKyAgICBwdWJsaWMgU2Vzc2lvbiBjcmVhdGVTZXNzaW9uKCkgeworCisgICAgICAgIGlmICgobWF4QWN0aXZlU2Vzc2lvbnMgPj0gMCkgJiYKKyAgICAgICAgICAgIChzZXNzaW9ucy5zaXplKCkgPj0gbWF4QWN0aXZlU2Vzc2lvbnMpKSB7CisgICAgICAgICAgICByZWplY3RlZFNlc3Npb25zKys7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygic3RhbmRhcmRNYW5hZ2VyLmNyZWF0ZVNlc3Npb24uaXNlIikpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIChzdXBlci5jcmVhdGVTZXNzaW9uKCkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBMb2FkIGFueSBjdXJyZW50bHkgYWN0aXZlIHNlc3Npb25zIHRoYXQgd2VyZSBwcmV2aW91c2x5IHVubG9hZGVkCisgICAgICogdG8gdGhlIGFwcHJvcHJpYXRlIHBlcnNpc3RlbmNlIG1lY2hhbmlzbSwgaWYgYW55LiAgSWYgcGVyc2lzdGVuY2UgaXMgbm90CisgICAgICogc3VwcG9ydGVkLCB0aGlzIG1ldGhvZCByZXR1cm5zIHdpdGhvdXQgZG9pbmcgYW55dGhpbmcuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIENsYXNzTm90Rm91bmRFeGNlcHRpb24gaWYgYSBzZXJpYWxpemVkIGNsYXNzIGNhbm5vdCBiZQorICAgICAqICBmb3VuZCBkdXJpbmcgdGhlIHJlbG9hZAorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGxvYWQoKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpICE9IG51bGwpeworICAgICAgICAgICAgdHJ5eworICAgICAgICAgICAgICAgIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKCBuZXcgUHJpdmlsZWdlZERvTG9hZCgpICk7CisgICAgICAgICAgICB9IGNhdGNoIChQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIGV4KXsKKyAgICAgICAgICAgICAgICBFeGNlcHRpb24gZXhjZXB0aW9uID0gZXguZ2V0RXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgaWYgKGV4Y2VwdGlvbiBpbnN0YW5jZW9mIENsYXNzTm90Rm91bmRFeGNlcHRpb24peworICAgICAgICAgICAgICAgICAgICB0aHJvdyAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbilleGNlcHRpb247CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChleGNlcHRpb24gaW5zdGFuY2VvZiBJT0V4Y2VwdGlvbil7CisgICAgICAgICAgICAgICAgICAgIHRocm93IChJT0V4Y2VwdGlvbilleGNlcHRpb247CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJVbnJlcG9ydGVkIGV4Y2VwdGlvbiBpbiBsb2FkKCkgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBleGNlcHRpb24pOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZG9Mb2FkKCk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIExvYWQgYW55IGN1cnJlbnRseSBhY3RpdmUgc2Vzc2lvbnMgdGhhdCB3ZXJlIHByZXZpb3VzbHkgdW5sb2FkZWQKKyAgICAgKiB0byB0aGUgYXBwcm9wcmlhdGUgcGVyc2lzdGVuY2UgbWVjaGFuaXNtLCBpZiBhbnkuICBJZiBwZXJzaXN0ZW5jZSBpcyBub3QKKyAgICAgKiBzdXBwb3J0ZWQsIHRoaXMgbWV0aG9kIHJldHVybnMgd2l0aG91dCBkb2luZyBhbnl0aGluZy4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBpZiBhIHNlcmlhbGl6ZWQgY2xhc3MgY2Fubm90IGJlCisgICAgICogIGZvdW5kIGR1cmluZyB0aGUgcmVsb2FkCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZG9Mb2FkKCkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmRlYnVnKCJTdGFydDogTG9hZGluZyBwZXJzaXN0ZWQgc2Vzc2lvbnMiKTsKKworICAgICAgICAvLyBJbml0aWFsaXplIG91ciBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMKKyAgICAgICAgc2Vzc2lvbnMuY2xlYXIoKTsKKworICAgICAgICAvLyBPcGVuIGFuIGlucHV0IHN0cmVhbSB0byB0aGUgc3BlY2lmaWVkIHBhdGhuYW1lLCBpZiBhbnkKKyAgICAgICAgRmlsZSBmaWxlID0gZmlsZSgpOworICAgICAgICBpZiAoZmlsZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoc20uZ2V0U3RyaW5nKCJzdGFuZGFyZE1hbmFnZXIubG9hZGluZyIsIHBhdGhuYW1lKSk7CisgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBmaXMgPSBudWxsOworICAgICAgICBPYmplY3RJbnB1dFN0cmVhbSBvaXMgPSBudWxsOworICAgICAgICBMb2FkZXIgbG9hZGVyID0gbnVsbDsKKyAgICAgICAgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgICAgIEJ1ZmZlcmVkSW5wdXRTdHJlYW0gYmlzID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oZmlzKTsKKyAgICAgICAgICAgIGlmIChjb250YWluZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBsb2FkZXIgPSBjb250YWluZXIuZ2V0TG9hZGVyKCk7CisgICAgICAgICAgICBpZiAobG9hZGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgY2xhc3NMb2FkZXIgPSBsb2FkZXIuZ2V0Q2xhc3NMb2FkZXIoKTsKKyAgICAgICAgICAgIGlmIChjbGFzc0xvYWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkNyZWF0aW5nIGN1c3RvbSBvYmplY3QgaW5wdXQgc3RyZWFtIGZvciBjbGFzcyBsb2FkZXIgIik7CisgICAgICAgICAgICAgICAgb2lzID0gbmV3IEN1c3RvbU9iamVjdElucHV0U3RyZWFtKGJpcywgY2xhc3NMb2FkZXIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ3JlYXRpbmcgc3RhbmRhcmQgb2JqZWN0IGlucHV0IHN0cmVhbSIpOworICAgICAgICAgICAgICAgIG9pcyA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShiaXMpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiTm8gcGVyc2lzdGVkIGRhdGEgZmlsZSBmb3VuZCIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2cuZXJyb3Ioc20uZ2V0U3RyaW5nKCJzdGFuZGFyZE1hbmFnZXIubG9hZGluZy5pb2UiLCBlKSwgZSk7CisgICAgICAgICAgICBpZiAob2lzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBvaXMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBmKSB7CisgICAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb2lzID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgIH0KKworICAgICAgICAvLyBMb2FkIHRoZSBwcmV2aW91c2x5IHVubG9hZGVkIGFjdGl2ZSBzZXNzaW9ucworICAgICAgICBzeW5jaHJvbml6ZWQgKHNlc3Npb25zKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIEludGVnZXIgY291bnQgPSAoSW50ZWdlcikgb2lzLnJlYWRPYmplY3QoKTsKKyAgICAgICAgICAgICAgICBpbnQgbiA9IGNvdW50LmludFZhbHVlKCk7CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkxvYWRpbmcgIiArIG4gKyAiIHBlcnNpc3RlZCBzZXNzaW9ucyIpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIFN0YW5kYXJkU2Vzc2lvbiBzZXNzaW9uID0gZ2V0TmV3U2Vzc2lvbigpOworICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLnJlYWRPYmplY3REYXRhKG9pcyk7CisgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uc2V0TWFuYWdlcih0aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbnMucHV0KHNlc3Npb24uZ2V0SWQoKSwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uYWN0aXZhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5lbmRBY2Nlc3MoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgbG9nLmVycm9yKHNtLmdldFN0cmluZygic3RhbmRhcmRNYW5hZ2VyLmxvYWRpbmcuY25mZSIsIGUpLCBlKTsKKyAgICAgICAgICAgICAgICBpZiAob2lzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9pcy5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgb2lzID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgbG9nLmVycm9yKHNtLmdldFN0cmluZygic3RhbmRhcmRNYW5hZ2VyLmxvYWRpbmcuaW9lIiwgZSksIGUpOworICAgICAgICAgICAgICAgIGlmIChvaXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgb2lzLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBvaXMgPSBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAvLyBDbG9zZSB0aGUgaW5wdXQgc3RyZWFtCisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9pcyAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgb2lzLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZikgeworICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmVkCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gRGVsZXRlIHRoZSBwZXJzaXN0ZW50IHN0b3JhZ2UgZmlsZQorICAgICAgICAgICAgICAgIGlmIChmaWxlICE9IG51bGwgJiYgZmlsZS5leGlzdHMoKSApCisgICAgICAgICAgICAgICAgICAgIGZpbGUuZGVsZXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoIkZpbmlzaDogTG9hZGluZyBwZXJzaXN0ZWQgc2Vzc2lvbnMiKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNhdmUgYW55IGN1cnJlbnRseSBhY3RpdmUgc2Vzc2lvbnMgaW4gdGhlIGFwcHJvcHJpYXRlIHBlcnNpc3RlbmNlCisgICAgICogbWVjaGFuaXNtLCBpZiBhbnkuICBJZiBwZXJzaXN0ZW5jZSBpcyBub3Qgc3VwcG9ydGVkLCB0aGlzIG1ldGhvZAorICAgICAqIHJldHVybnMgd2l0aG91dCBkb2luZyBhbnl0aGluZy4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHVubG9hZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCkgIT0gbnVsbCl7CisgICAgICAgICAgICB0cnl7CisgICAgICAgICAgICAgICAgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoIG5ldyBQcml2aWxlZ2VkRG9VbmxvYWQoKSApOworICAgICAgICAgICAgfSBjYXRjaCAoUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBleCl7CisgICAgICAgICAgICAgICAgRXhjZXB0aW9uIGV4Y2VwdGlvbiA9IGV4LmdldEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgIGlmIChleGNlcHRpb24gaW5zdGFuY2VvZiBJT0V4Y2VwdGlvbil7CisgICAgICAgICAgICAgICAgICAgIHRocm93IChJT0V4Y2VwdGlvbilleGNlcHRpb247CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJVbnJlcG9ydGVkIGV4Y2VwdGlvbiBpbiB1bkxvYWQoKSAiCisgICAgICAgICAgICAgICAgICAgICAgICArIGV4Y2VwdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkb1VubG9hZCgpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTYXZlIGFueSBjdXJyZW50bHkgYWN0aXZlIHNlc3Npb25zIGluIHRoZSBhcHByb3ByaWF0ZSBwZXJzaXN0ZW5jZQorICAgICAqIG1lY2hhbmlzbSwgaWYgYW55LiAgSWYgcGVyc2lzdGVuY2UgaXMgbm90IHN1cHBvcnRlZCwgdGhpcyBtZXRob2QKKyAgICAgKiByZXR1cm5zIHdpdGhvdXQgZG9pbmcgYW55dGhpbmcuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBkb1VubG9hZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmRlYnVnKCJVbmxvYWRpbmcgcGVyc2lzdGVkIHNlc3Npb25zIik7CisKKyAgICAgICAgLy8gT3BlbiBhbiBvdXRwdXQgc3RyZWFtIHRvIHRoZSBzcGVjaWZpZWQgcGF0aG5hbWUsIGlmIGFueQorICAgICAgICBGaWxlIGZpbGUgPSBmaWxlKCk7CisgICAgICAgIGlmIChmaWxlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZyhzbS5nZXRTdHJpbmcoInN0YW5kYXJkTWFuYWdlci51bmxvYWRpbmciLCBwYXRobmFtZSkpOworICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG51bGw7CisgICAgICAgIE9iamVjdE91dHB1dFN0cmVhbSBvb3MgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgICAgICBvb3MgPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShmb3MpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9nLmVycm9yKHNtLmdldFN0cmluZygic3RhbmRhcmRNYW5hZ2VyLnVubG9hZGluZy5pb2UiLCBlKSwgZSk7CisgICAgICAgICAgICBpZiAob29zICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBvb3MuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBmKSB7CisgICAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb29zID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgIH0KKworICAgICAgICAvLyBXcml0ZSB0aGUgbnVtYmVyIG9mIGFjdGl2ZSBzZXNzaW9ucywgZm9sbG93ZWQgYnkgdGhlIGRldGFpbHMKKyAgICAgICAgQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIHN5bmNocm9uaXplZCAoc2Vzc2lvbnMpIHsKKyAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlVubG9hZGluZyAiICsgc2Vzc2lvbnMuc2l6ZSgpICsgIiBzZXNzaW9ucyIpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBvb3Mud3JpdGVPYmplY3QobmV3IEludGVnZXIoc2Vzc2lvbnMuc2l6ZSgpKSk7CisgICAgICAgICAgICAgICAgSXRlcmF0b3IgZWxlbWVudHMgPSBzZXNzaW9ucy52YWx1ZXMoKS5pdGVyYXRvcigpOworICAgICAgICAgICAgICAgIHdoaWxlIChlbGVtZW50cy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RhbmRhcmRTZXNzaW9uIHNlc3Npb24gPQorICAgICAgICAgICAgICAgICAgICAgICAgKFN0YW5kYXJkU2Vzc2lvbikgZWxlbWVudHMubmV4dCgpOworICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZChzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgKChTdGFuZGFyZFNlc3Npb24pIHNlc3Npb24pLnBhc3NpdmF0ZSgpOworICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLndyaXRlT2JqZWN0RGF0YShvb3MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3Ioc20uZ2V0U3RyaW5nKCJzdGFuZGFyZE1hbmFnZXIudW5sb2FkaW5nLmlvZSIsIGUpLCBlKTsKKyAgICAgICAgICAgICAgICBpZiAob29zICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9vcy5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgb29zID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEZsdXNoIGFuZCBjbG9zZSB0aGUgb3V0cHV0IHN0cmVhbQorICAgICAgICB0cnkgeworICAgICAgICAgICAgb29zLmZsdXNoKCk7CisgICAgICAgICAgICBvb3MuY2xvc2UoKTsKKyAgICAgICAgICAgIG9vcyA9IG51bGw7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGlmIChvb3MgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIG9vcy5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGYpIHsKKyAgICAgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvb3MgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEV4cGlyZSBhbGwgdGhlIHNlc3Npb25zIHdlIGp1c3Qgd3JvdGUKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmRlYnVnKCJFeHBpcmluZyAiICsgbGlzdC5zaXplKCkgKyAiIHBlcnNpc3RlZCBzZXNzaW9ucyIpOworICAgICAgICBJdGVyYXRvciBleHBpcmVzID0gbGlzdC5pdGVyYXRvcigpOworICAgICAgICB3aGlsZSAoZXhwaXJlcy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIFN0YW5kYXJkU2Vzc2lvbiBzZXNzaW9uID0gKFN0YW5kYXJkU2Vzc2lvbikgZXhwaXJlcy5uZXh0KCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHNlc3Npb24uZXhwaXJlKGZhbHNlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmRlYnVnKCJVbmxvYWRpbmcgY29tcGxldGUiKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIExpZmVjeWNsZSBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIEFkZCBhIGxpZmVjeWNsZSBldmVudCBsaXN0ZW5lciB0byB0aGlzIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgdG8gYWRkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkTGlmZWN5Y2xlTGlzdGVuZXIoTGlmZWN5Y2xlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKworICAgICAgICBsaWZlY3ljbGUuYWRkTGlmZWN5Y2xlTGlzdGVuZXIobGlzdGVuZXIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGxpZmVjeWNsZSBsaXN0ZW5lcnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbGlmZWN5Y2xlLiBJZiB0aGlzCisgICAgICogTGlmZWN5Y2xlIGhhcyBubyBsaXN0ZW5lcnMgcmVnaXN0ZXJlZCwgYSB6ZXJvLWxlbmd0aCBhcnJheSBpcyByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlmZWN5Y2xlTGlzdGVuZXJbXSBmaW5kTGlmZWN5Y2xlTGlzdGVuZXJzKCkgeworCisgICAgICAgIHJldHVybiBsaWZlY3ljbGUuZmluZExpZmVjeWNsZUxpc3RlbmVycygpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSBsaWZlY3ljbGUgZXZlbnQgbGlzdGVuZXIgZnJvbSB0aGlzIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgdG8gcmVtb3ZlCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlTGlmZWN5Y2xlTGlzdGVuZXIoTGlmZWN5Y2xlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKworICAgICAgICBsaWZlY3ljbGUucmVtb3ZlTGlmZWN5Y2xlTGlzdGVuZXIobGlzdGVuZXIpOworCisgICAgfQorCisgICAgLyoqCisgICAgICogUHJlcGFyZSBmb3IgdGhlIGJlZ2lubmluZyBvZiBhY3RpdmUgdXNlIG9mIHRoZSBwdWJsaWMgbWV0aG9kcyBvZiB0aGlzCisgICAgICogY29tcG9uZW50LiAgVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBhZnRlciA8Y29kZT5jb25maWd1cmUoKTwvY29kZT4sCisgICAgICogYW5kIGJlZm9yZSBhbnkgb2YgdGhlIHB1YmxpYyBtZXRob2RzIG9mIHRoZSBjb21wb25lbnQgYXJlIHV0aWxpemVkLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBMaWZlY3ljbGVFeGNlcHRpb24gaWYgdGhpcyBjb21wb25lbnQgZGV0ZWN0cyBhIGZhdGFsIGVycm9yCisgICAgICogIHRoYXQgcHJldmVudHMgdGhpcyBjb21wb25lbnQgZnJvbSBiZWluZyB1c2VkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnQoKSB0aHJvd3MgTGlmZWN5Y2xlRXhjZXB0aW9uIHsKKworICAgICAgICBpZiggISBpbml0aWFsaXplZCApCisgICAgICAgICAgICBpbml0KCk7CisKKyAgICAgICAgLy8gVmFsaWRhdGUgYW5kIHVwZGF0ZSBvdXIgY3VycmVudCBjb21wb25lbnQgc3RhdGUKKyAgICAgICAgaWYgKHN0YXJ0ZWQpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBsaWZlY3ljbGUuZmlyZUxpZmVjeWNsZUV2ZW50KFNUQVJUX0VWRU5ULCBudWxsKTsKKyAgICAgICAgc3RhcnRlZCA9IHRydWU7CisKKyAgICAgICAgLy8gRm9yY2UgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiRm9yY2UgcmFuZG9tIG51bWJlciBpbml0aWFsaXphdGlvbiBzdGFydGluZyIpOworICAgICAgICBTdHJpbmcgZHVtbXkgPSBnZW5lcmF0ZVNlc3Npb25JZCgpOworICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoIkZvcmNlIHJhbmRvbSBudW1iZXIgaW5pdGlhbGl6YXRpb24gY29tcGxldGVkIik7CisKKyAgICAgICAgLy8gTG9hZCB1bmxvYWRlZCBzZXNzaW9ucywgaWYgYW55CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBsb2FkKCk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICBsb2cuZXJyb3Ioc20uZ2V0U3RyaW5nKCJzdGFuZGFyZE1hbmFnZXIubWFuYWdlckxvYWQiKSwgdCk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogR3JhY2VmdWxseSB0ZXJtaW5hdGUgdGhlIGFjdGl2ZSB1c2Ugb2YgdGhlIHB1YmxpYyBtZXRob2RzIG9mIHRoaXMKKyAgICAgKiBjb21wb25lbnQuICBUaGlzIG1ldGhvZCBzaG91bGQgYmUgdGhlIGxhc3Qgb25lIGNhbGxlZCBvbiBhIGdpdmVuCisgICAgICogaW5zdGFuY2Ugb2YgdGhpcyBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIExpZmVjeWNsZUV4Y2VwdGlvbiBpZiB0aGlzIGNvbXBvbmVudCBkZXRlY3RzIGEgZmF0YWwgZXJyb3IKKyAgICAgKiAgdGhhdCBuZWVkcyB0byBiZSByZXBvcnRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB0aHJvd3MgTGlmZWN5Y2xlRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoIlN0b3BwaW5nIik7CisKKyAgICAgICAgLy8gVmFsaWRhdGUgYW5kIHVwZGF0ZSBvdXIgY3VycmVudCBjb21wb25lbnQgc3RhdGUKKyAgICAgICAgaWYgKCFzdGFydGVkKQorICAgICAgICAgICAgdGhyb3cgbmV3IExpZmVjeWNsZUV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInN0YW5kYXJkTWFuYWdlci5ub3RTdGFydGVkIikpOworICAgICAgICBsaWZlY3ljbGUuZmlyZUxpZmVjeWNsZUV2ZW50KFNUT1BfRVZFTlQsIG51bGwpOworICAgICAgICBzdGFydGVkID0gZmFsc2U7CisKKyAgICAgICAgLy8gV3JpdGUgb3V0IHNlc3Npb25zCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB1bmxvYWQoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9nLmVycm9yKHNtLmdldFN0cmluZygic3RhbmRhcmRNYW5hZ2VyLm1hbmFnZXJVbmxvYWQiKSwgZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBFeHBpcmUgYWxsIGFjdGl2ZSBzZXNzaW9ucworICAgICAgICBTZXNzaW9uIHNlc3Npb25zW10gPSBmaW5kU2Vzc2lvbnMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXNzaW9ucy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgU3RhbmRhcmRTZXNzaW9uIHNlc3Npb24gPSAoU3RhbmRhcmRTZXNzaW9uKSBzZXNzaW9uc1tpXTsKKyAgICAgICAgICAgIGlmICghc2Vzc2lvbi5pc1ZhbGlkKCkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHNlc3Npb24uZXhwaXJlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlcXVpcmUgYSBuZXcgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgaWYgd2UgYXJlIHJlc3RhcnRlZAorICAgICAgICB0aGlzLnJhbmRvbSA9IG51bGw7CisKKyAgICAgICAgaWYoIGluaXRpYWxpemVkICkgeworICAgICAgICAgICAgZGVzdHJveSgpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUHJvY2VzcyBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnRzIGZyb20gb3VyIGFzc29jaWF0ZWQgQ29udGV4dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudCBUaGUgcHJvcGVydHkgY2hhbmdlIGV2ZW50IHRoYXQgaGFzIG9jY3VycmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgeworCisgICAgICAgIC8vIFZhbGlkYXRlIHRoZSBzb3VyY2Ugb2YgdGhpcyBldmVudAorICAgICAgICBpZiAoIShldmVudC5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIENvbnRleHQpKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBDb250ZXh0IGNvbnRleHQgPSAoQ29udGV4dCkgZXZlbnQuZ2V0U291cmNlKCk7CisKKyAgICAgICAgLy8gUHJvY2VzcyBhIHJlbGV2YW50IHByb3BlcnR5IGNoYW5nZQorICAgICAgICBpZiAoZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkuZXF1YWxzKCJzZXNzaW9uVGltZW91dCIpKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHNldE1heEluYWN0aXZlSW50ZXJ2YWwKKyAgICAgICAgICAgICAgICAgICAgKCAoKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCkpLmludFZhbHVlKCkqNjAgKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKHNtLmdldFN0cmluZygic3RhbmRhcmRNYW5hZ2VyLnNlc3Npb25UaW1lb3V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmdldE5ld1ZhbHVlKCkudG9TdHJpbmcoKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm90ZWN0ZWQgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBGaWxlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHBhdGhuYW1lIHRvIG91cgorICAgICAqIHBlcnNpc3RlbmNlIGZpbGUsIGlmIGFueS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRmlsZSBmaWxlKCkgeworCisgICAgICAgIGlmICgocGF0aG5hbWUgPT0gbnVsbCkgfHwgKHBhdGhuYW1lLmxlbmd0aCgpID09IDApKQorICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUocGF0aG5hbWUpOworICAgICAgICBpZiAoIWZpbGUuaXNBYnNvbHV0ZSgpKSB7CisgICAgICAgICAgICBpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgQ29udGV4dCkgeworICAgICAgICAgICAgICAgIFNlcnZsZXRDb250ZXh0IHNlcnZsZXRDb250ZXh0ID0KKyAgICAgICAgICAgICAgICAgICAgKChDb250ZXh0KSBjb250YWluZXIpLmdldFNlcnZsZXRDb250ZXh0KCk7CisgICAgICAgICAgICAgICAgRmlsZSB0ZW1wZGlyID0gKEZpbGUpCisgICAgICAgICAgICAgICAgICAgIHNlcnZsZXRDb250ZXh0LmdldEF0dHJpYnV0ZShHbG9iYWxzLldPUktfRElSX0FUVFIpOworICAgICAgICAgICAgICAgIGlmICh0ZW1wZGlyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGZpbGUgPSBuZXcgRmlsZSh0ZW1wZGlyLCBwYXRobmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKy8vICAgICAgICBpZiAoIWZpbGUuaXNBYnNvbHV0ZSgpKQorLy8gICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICByZXR1cm4gKGZpbGUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBJbnZhbGlkYXRlIGFsbCBzZXNzaW9ucyB0aGF0IGhhdmUgZXhwaXJlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwcm9jZXNzRXhwaXJlcygpIHsKKworICAgICAgICBsb25nIHRpbWVOb3cgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgU2Vzc2lvbiBzZXNzaW9uc1tdID0gZmluZFNlc3Npb25zKCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXNzaW9ucy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgc2Vzc2lvbnNbaV0uaXNWYWxpZCgpOworICAgICAgICB9CisgICAgICAgIGxvbmcgdGltZUVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICBwcm9jZXNzaW5nVGltZSArPSAoIHRpbWVFbmQgLSB0aW1lTm93ICk7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnRzIHRoZSBNYW5hZ2VyIGludGVyZmFjZSwgZGlyZWN0IGNhbGwgdG8gcHJvY2Vzc0V4cGlyZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBiYWNrZ3JvdW5kUHJvY2VzcygpIHsKKyAgICAgICAgcHJvY2Vzc0V4cGlyZXMoKTsKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3Nlc3Npb24vU3RhbmRhcmRTZXNzaW9uLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc2Vzc2lvbi9TdGFuZGFyZFNlc3Npb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjQzNDNiCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3Nlc3Npb24vU3RhbmRhcmRTZXNzaW9uLmphdmEKQEAgLTAsMCArMSwxNjgyIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnNlc3Npb247CisKKworaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VTdXBwb3J0OworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5Ob3RTZXJpYWxpemFibGVFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb25BY3RpdmF0aW9uTGlzdGVuZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uQXR0cmlidXRlTGlzdGVuZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uQmluZGluZ0V2ZW50OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbkJpbmRpbmdMaXN0ZW5lcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb25Db250ZXh0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbkV2ZW50OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbkxpc3RlbmVyOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Db250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuR2xvYmFsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLk1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5TZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuU2Vzc2lvbkV2ZW50OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuU2Vzc2lvbkxpc3RlbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5FbnVtZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5TdHJpbmdNYW5hZ2VyOworCisKKy8qKgorICogU3RhbmRhcmQgaW1wbGVtZW50YXRpb24gb2YgdGhlIDxiPlNlc3Npb248L2I+IGludGVyZmFjZS4gIFRoaXMgb2JqZWN0IGlzCisgKiBzZXJpYWxpemFibGUsIHNvIHRoYXQgaXQgY2FuIGJlIHN0b3JlZCBpbiBwZXJzaXN0ZW50IHN0b3JhZ2Ugb3IgdHJhbnNmZXJyZWQKKyAqIHRvIGEgZGlmZmVyZW50IEpWTSBmb3IgZGlzdHJpYnV0YWJsZSBzZXNzaW9uIHN1cHBvcnQuCisgKiA8cD4KKyAqIDxiPklNUExFTUVOVEFUSU9OIE5PVEU8L2I+OiAgQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyByZXByZXNlbnRzIGJvdGggdGhlCisgKiBpbnRlcm5hbCAoU2Vzc2lvbikgYW5kIGFwcGxpY2F0aW9uIGxldmVsIChIdHRwU2Vzc2lvbikgdmlldyBvZiB0aGUgc2Vzc2lvbi4KKyAqIEhvd2V2ZXIsIGJlY2F1c2UgdGhlIGNsYXNzIGl0c2VsZiBpcyBub3QgZGVjbGFyZWQgcHVibGljLCBKYXZhIGxvZ2ljIG91dHNpZGUKKyAqIG9mIHRoZSA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLnNlc3Npb248L2NvZGU+IHBhY2thZ2UgY2Fubm90IGNhc3QgYW4KKyAqIEh0dHBTZXNzaW9uIHZpZXcgb2YgdGhpcyBpbnN0YW5jZSBiYWNrIHRvIGEgU2Vzc2lvbiB2aWV3LgorICogPHA+CisgKiA8Yj5JTVBMRU1FTlRBVElPTiBOT1RFPC9iPjogIElmIHlvdSBhZGQgZmllbGRzIHRvIHRoaXMgY2xhc3MsIHlvdSBtdXN0CisgKiBtYWtlIHN1cmUgdGhhdCB5b3UgY2FycnkgdGhlbSBvdmVyIGluIHRoZSByZWFkL3dyaXRlT2JqZWN0IG1ldGhvZHMgc28KKyAqIHRoYXQgdGhpcyBjbGFzcyBpcyBwcm9wZXJseSBzZXJpYWxpemVkLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQGF1dGhvciBTZWFuIExlZ2Fzc2ljaworICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86am9uQGxhdGNoa2V5LmNvbSI+Sm9uIFMuIFN0ZXZlbnM8L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBTdGFuZGFyZFNlc3Npb24KKyAgICBpbXBsZW1lbnRzIEh0dHBTZXNzaW9uLCBTZXNzaW9uLCBTZXJpYWxpemFibGUgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IFNlc3Npb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgTWFuYWdlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYW5hZ2VyIFRoZSBtYW5hZ2VyIHdpdGggd2hpY2ggdGhpcyBTZXNzaW9uIGlzIGFzc29jaWF0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RhbmRhcmRTZXNzaW9uKE1hbmFnZXIgbWFuYWdlcikgeworCisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIHRoaXMubWFuYWdlciA9IG1hbmFnZXI7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUeXBlIGFycmF5LgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVNUFRZX0FSUkFZW10gPSBuZXcgU3RyaW5nWzBdOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZHVtbXkgYXR0cmlidXRlIHZhbHVlIHNlcmlhbGl6ZWQgd2hlbiBhIE5vdFNlcmlhbGl6YWJsZUV4Y2VwdGlvbiBpcworICAgICAqIGVuY291bnRlcmVkIGluIDxjb2RlPndyaXRlT2JqZWN0KCk8L2NvZGU+LgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVF9TRVJJQUxJWkVEID0KKyAgICAgICAgIl9fX05PVF9TRVJJQUxJWkFCTEVfRVhDRVBUSU9OX19fIjsKKworCisgICAgLyoqCisgICAgICogVGhlIGNvbGxlY3Rpb24gb2YgdXNlciBkYXRhIGF0dHJpYnV0ZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgU2Vzc2lvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgSGFzaE1hcCBhdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXAoKTsKKworCisgICAgLyoqCisgICAgICogVGhlIGF1dGhlbnRpY2F0aW9uIHR5cGUgdXNlZCB0byBhdXRoZW50aWNhdGUgb3VyIGNhY2hlZCBQcmluY2lwYWwsCisgICAgICogaWYgYW55LiAgTk9URTogIFRoaXMgdmFsdWUgaXMgbm90IGluY2x1ZGVkIGluIHRoZSBzZXJpYWxpemVkCisgICAgICogdmVyc2lvbiBvZiB0aGlzIG9iamVjdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdHJhbnNpZW50IFN0cmluZyBhdXRoVHlwZSA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSA8Y29kZT5qYXZhLmxhbmcuTWV0aG9kPC9jb2RlPiBmb3IgdGhlCisgICAgICogPGNvZGU+ZmlyZUNvbnRhaW5lckV2ZW50KCk8L2NvZGU+IG1ldGhvZCBvZiB0aGUKKyAgICAgKiA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRDb250ZXh0PC9jb2RlPiBtZXRob2QsCisgICAgICogaWYgb3VyIENvbnRleHQgaW1wbGVtZW50YXRpb24gaXMgb2YgdGhpcyBjbGFzcy4gIFRoaXMgdmFsdWUgaXMKKyAgICAgKiBjb21wdXRlZCBkeW5hbWljYWxseSB0aGUgZmlyc3QgdGltZSBpdCBpcyBuZWVkZWQsIG9yIGFmdGVyCisgICAgICogYSBzZXNzaW9uIHJlbG9hZCAoc2luY2UgaXQgaXMgZGVjbGFyZWQgdHJhbnNpZW50KS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdHJhbnNpZW50IE1ldGhvZCBjb250YWluZXJFdmVudE1ldGhvZCA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBtZXRob2Qgc2lnbmF0dXJlIGZvciB0aGUgPGNvZGU+ZmlyZUNvbnRhaW5lckV2ZW50PC9jb2RlPiBtZXRob2QuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzcyBjb250YWluZXJFdmVudFR5cGVzW10gPQorICAgIHsgU3RyaW5nLmNsYXNzLCBPYmplY3QuY2xhc3MgfTsKKworCisgICAgLyoqCisgICAgICogVGhlIHRpbWUgdGhpcyBzZXNzaW9uIHdhcyBjcmVhdGVkLCBpbiBtaWxsaXNlY29uZHMgc2luY2UgbWlkbmlnaHQsCisgICAgICogSmFudWFyeSAxLCAxOTcwIEdNVC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgbG9uZyBjcmVhdGlvblRpbWUgPSAwTDsKKworCisgICAgLyoqCisgICAgICogU2V0IG9mIGF0dHJpYnV0ZSBuYW1lcyB3aGljaCBhcmUgbm90IGFsbG93ZWQgdG8gYmUgcGVyc2lzdGVkLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGV4Y2x1ZGVkQXR0cmlidXRlcyA9IHsKKyAgICAgICAgR2xvYmFscy5TVUJKRUNUX0FUVFIKKyAgICB9OworCisKKyAgICAvKioKKyAgICAgKiBXZSBhcmUgY3VycmVudGx5IHByb2Nlc3NpbmcgYSBzZXNzaW9uIGV4cGlyYXRpb24sIHNvIGJ5cGFzcworICAgICAqIGNlcnRhaW4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHRlc3RzLiAgTk9URTogIFRoaXMgdmFsdWUgaXMgbm90CisgICAgICogaW5jbHVkZWQgaW4gdGhlIHNlcmlhbGl6ZWQgdmVyc2lvbiBvZiB0aGlzIG9iamVjdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdHJhbnNpZW50IGJvb2xlYW4gZXhwaXJpbmcgPSBmYWxzZTsKKworCisgICAgLyoqCisgICAgICogVGhlIGZhY2FkZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBzZXNzaW9uLiAgTk9URTogIFRoaXMgdmFsdWUgaXMgbm90CisgICAgICogaW5jbHVkZWQgaW4gdGhlIHNlcmlhbGl6ZWQgdmVyc2lvbiBvZiB0aGlzIG9iamVjdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdHJhbnNpZW50IFN0YW5kYXJkU2Vzc2lvbkZhY2FkZSBmYWNhZGUgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc2Vzc2lvbiBpZGVudGlmaWVyIG9mIHRoaXMgU2Vzc2lvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGlkID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogRGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gZGVzY3JpYmluZyB0aGlzIFNlc3Npb24gaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgaW5mbyA9ICJTdGFuZGFyZFNlc3Npb24vMS4wIjsKKworCisgICAgLyoqCisgICAgICogVGhlIGxhc3QgYWNjZXNzZWQgdGltZSBmb3IgdGhpcyBTZXNzaW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCBsb25nIGxhc3RBY2Nlc3NlZFRpbWUgPSBjcmVhdGlvblRpbWU7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzZXNzaW9uIGV2ZW50IGxpc3RlbmVycyBmb3IgdGhpcyBTZXNzaW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCB0cmFuc2llbnQgQXJyYXlMaXN0IGxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3QoKTsKKworCisgICAgLyoqCisgICAgICogVGhlIE1hbmFnZXIgd2l0aCB3aGljaCB0aGlzIFNlc3Npb24gaXMgYXNzb2NpYXRlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdHJhbnNpZW50IE1hbmFnZXIgbWFuYWdlciA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBtYXhpbXVtIHRpbWUgaW50ZXJ2YWwsIGluIHNlY29uZHMsIGJldHdlZW4gY2xpZW50IHJlcXVlc3RzIGJlZm9yZQorICAgICAqIHRoZSBzZXJ2bGV0IGNvbnRhaW5lciBtYXkgaW52YWxpZGF0ZSB0aGlzIHNlc3Npb24uICBBIG5lZ2F0aXZlIHRpbWUKKyAgICAgKiBpbmRpY2F0ZXMgdGhhdCB0aGUgc2Vzc2lvbiBzaG91bGQgbmV2ZXIgdGltZSBvdXQuCisgICAgICovCisgICAgcHJvdGVjdGVkIGludCBtYXhJbmFjdGl2ZUludGVydmFsID0gLTE7CisKKworICAgIC8qKgorICAgICAqIEZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoaXMgc2Vzc2lvbiBpcyBuZXcgb3Igbm90LgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGlzTmV3ID0gZmFsc2U7CisKKworICAgIC8qKgorICAgICAqIEZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoaXMgc2Vzc2lvbiBpcyB2YWxpZCBvciBub3QuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWxpZCA9IGZhbHNlOworCisgICAgCisgICAgLyoqCisgICAgICogSW50ZXJuYWwgbm90ZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc2Vzc2lvbiBieSBDYXRhbGluYSBjb21wb25lbnRzCisgICAgICogYW5kIGV2ZW50IGxpc3RlbmVycy4gIDxiPklNUExFTUVOVEFUSU9OIE5PVEU6PC9iPiBUaGlzIG9iamVjdCBpcworICAgICAqIDxlbT5ub3Q8L2VtPiBzYXZlZCBhbmQgcmVzdG9yZWQgYWNyb3NzIHNlc3Npb24gc2VyaWFsaXphdGlvbnMhCisgICAgICovCisgICAgcHJvdGVjdGVkIHRyYW5zaWVudCBIYXNoTWFwIG5vdGVzID0gbmV3IEhhc2hNYXAoKTsKKworCisgICAgLyoqCisgICAgICogVGhlIGF1dGhlbnRpY2F0ZWQgUHJpbmNpcGFsIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNlc3Npb24sIGlmIGFueS4KKyAgICAgKiA8Yj5JTVBMRU1FTlRBVElPTiBOT1RFOjwvYj4gIFRoaXMgb2JqZWN0IGlzIDxpPm5vdDwvaT4gc2F2ZWQgYW5kCisgICAgICogcmVzdG9yZWQgYWNyb3NzIHNlc3Npb24gc2VyaWFsaXphdGlvbnMhCisgICAgICovCisgICAgcHJvdGVjdGVkIHRyYW5zaWVudCBQcmluY2lwYWwgcHJpbmNpcGFsID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIHN0cmluZyBtYW5hZ2VyIGZvciB0aGlzIHBhY2thZ2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmdNYW5hZ2VyIHNtID0KKyAgICAgICAgU3RyaW5nTWFuYWdlci5nZXRNYW5hZ2VyKENvbnN0YW50cy5QYWNrYWdlKTsKKworCisgICAgLyoqCisgICAgICogVGhlIEhUVFAgc2Vzc2lvbiBjb250ZXh0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNlc3Npb24uCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBIdHRwU2Vzc2lvbkNvbnRleHQgc2Vzc2lvbkNvbnRleHQgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgcHJvcGVydHkgY2hhbmdlIHN1cHBvcnQgZm9yIHRoaXMgY29tcG9uZW50LiAgTk9URTogIFRoaXMgdmFsdWUKKyAgICAgKiBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIHNlcmlhbGl6ZWQgdmVyc2lvbiBvZiB0aGlzIG9iamVjdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdHJhbnNpZW50IFByb3BlcnR5Q2hhbmdlU3VwcG9ydCBzdXBwb3J0ID0KKyAgICAgICAgbmV3IFByb3BlcnR5Q2hhbmdlU3VwcG9ydCh0aGlzKTsKKworCisgICAgLyoqCisgICAgICogVGhlIGN1cnJlbnQgYWNjZXNzZWQgdGltZSBmb3IgdGhpcyBzZXNzaW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCBsb25nIHRoaXNBY2Nlc3NlZFRpbWUgPSBjcmVhdGlvblRpbWU7CisKKworICAgIC8qKgorICAgICAqIFRoZSBhY2Nlc3MgY291bnQgZm9yIHRoaXMgc2Vzc2lvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdHJhbnNpZW50IGludCBhY2Nlc3NDb3VudCA9IDA7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNlc3Npb24gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGF1dGhlbnRpY2F0aW9uIHR5cGUgdXNlZCB0byBhdXRoZW50aWNhdGUgb3VyIGNhY2hlZAorICAgICAqIFByaW5jaXBhbCwgaWYgYW55LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXV0aFR5cGUoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLmF1dGhUeXBlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBhdXRoZW50aWNhdGlvbiB0eXBlIHVzZWQgdG8gYXV0aGVudGljYXRlIG91ciBjYWNoZWQKKyAgICAgKiBQcmluY2lwYWwsIGlmIGFueS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhdXRoVHlwZSBUaGUgbmV3IGNhY2hlZCBhdXRoZW50aWNhdGlvbiB0eXBlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QXV0aFR5cGUoU3RyaW5nIGF1dGhUeXBlKSB7CisKKyAgICAgICAgU3RyaW5nIG9sZEF1dGhUeXBlID0gdGhpcy5hdXRoVHlwZTsKKyAgICAgICAgdGhpcy5hdXRoVHlwZSA9IGF1dGhUeXBlOworICAgICAgICBzdXBwb3J0LmZpcmVQcm9wZXJ0eUNoYW5nZSgiYXV0aFR5cGUiLCBvbGRBdXRoVHlwZSwgdGhpcy5hdXRoVHlwZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY3JlYXRpb24gdGltZSBmb3IgdGhpcyBzZXNzaW9uLiAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZQorICAgICAqIE1hbmFnZXIgd2hlbiBhbiBleGlzdGluZyBTZXNzaW9uIGluc3RhbmNlIGlzIHJldXNlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0aW1lIFRoZSBuZXcgY3JlYXRpb24gdGltZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENyZWF0aW9uVGltZShsb25nIHRpbWUpIHsKKworICAgICAgICB0aGlzLmNyZWF0aW9uVGltZSA9IHRpbWU7CisgICAgICAgIHRoaXMubGFzdEFjY2Vzc2VkVGltZSA9IHRpbWU7CisgICAgICAgIHRoaXMudGhpc0FjY2Vzc2VkVGltZSA9IHRpbWU7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2Vzc2lvbiBpZGVudGlmaWVyIGZvciB0aGlzIHNlc3Npb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJZCgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMuaWQpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHNlc3Npb24gaWRlbnRpZmllciBmb3IgdGhpcyBzZXNzaW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGlkIFRoZSBuZXcgc2Vzc2lvbiBpZGVudGlmaWVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIGlkKSB7CisKKyAgICAgICAgaWYgKCh0aGlzLmlkICE9IG51bGwpICYmIChtYW5hZ2VyICE9IG51bGwpKQorICAgICAgICAgICAgbWFuYWdlci5yZW1vdmUodGhpcyk7CisKKyAgICAgICAgdGhpcy5pZCA9IGlkOworCisgICAgICAgIGlmIChtYW5hZ2VyICE9IG51bGwpCisgICAgICAgICAgICBtYW5hZ2VyLmFkZCh0aGlzKTsKKyAgICAgICAgdGVsbE5ldygpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogSW5mb3JtIHRoZSBsaXN0ZW5lcnMgYWJvdXQgdGhlIG5ldyBzZXNzaW9uLgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVsbE5ldygpIHsKKworICAgICAgICAvLyBOb3RpZnkgaW50ZXJlc3RlZCBzZXNzaW9uIGV2ZW50IGxpc3RlbmVycworICAgICAgICBmaXJlU2Vzc2lvbkV2ZW50KFNlc3Npb24uU0VTU0lPTl9DUkVBVEVEX0VWRU5ULCBudWxsKTsKKworICAgICAgICAvLyBOb3RpZnkgaW50ZXJlc3RlZCBhcHBsaWNhdGlvbiBldmVudCBsaXN0ZW5lcnMKKyAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gKENvbnRleHQpIG1hbmFnZXIuZ2V0Q29udGFpbmVyKCk7CisgICAgICAgIE9iamVjdCBsaXN0ZW5lcnNbXSA9IGNvbnRleHQuZ2V0QXBwbGljYXRpb25MaWZlY3ljbGVMaXN0ZW5lcnMoKTsKKyAgICAgICAgaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7CisgICAgICAgICAgICBIdHRwU2Vzc2lvbkV2ZW50IGV2ZW50ID0KKyAgICAgICAgICAgICAgICBuZXcgSHR0cFNlc3Npb25FdmVudChnZXRTZXNzaW9uKCkpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoIShsaXN0ZW5lcnNbaV0gaW5zdGFuY2VvZiBIdHRwU2Vzc2lvbkxpc3RlbmVyKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgSHR0cFNlc3Npb25MaXN0ZW5lciBsaXN0ZW5lciA9CisgICAgICAgICAgICAgICAgICAgIChIdHRwU2Vzc2lvbkxpc3RlbmVyKSBsaXN0ZW5lcnNbaV07CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgZmlyZUNvbnRhaW5lckV2ZW50KGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmVmb3JlU2Vzc2lvbkNyZWF0ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIpOworICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5zZXNzaW9uQ3JlYXRlZChldmVudCk7CisgICAgICAgICAgICAgICAgICAgIGZpcmVDb250YWluZXJFdmVudChjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFmdGVyU2Vzc2lvbkNyZWF0ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaXJlQ29udGFpbmVyRXZlbnQoY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWZ0ZXJTZXNzaW9uQ3JlYXRlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1hbmFnZXIuZ2V0Q29udGFpbmVyKCkuZ2V0TG9nZ2VyKCkuZXJyb3IKKyAgICAgICAgICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInN0YW5kYXJkU2Vzc2lvbi5zZXNzaW9uRXZlbnQiKSwgdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIFNlc3Npb24gaW1wbGVtZW50YXRpb24gYW5kCisgICAgICogdGhlIGNvcnJlc3BvbmRpbmcgdmVyc2lvbiBudW1iZXIsIGluIHRoZSBmb3JtYXQKKyAgICAgKiA8Y29kZT4mbHQ7ZGVzY3JpcHRpb24mZ3Q7LyZsdDt2ZXJzaW9uJmd0OzwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJbmZvKCkgeworCisgICAgICAgIHJldHVybiAoaW5mbyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbGFzdCB0aW1lIHRoZSBjbGllbnQgc2VudCBhIHJlcXVlc3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMKKyAgICAgKiBzZXNzaW9uLCBhcyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBzaW5jZSBtaWRuaWdodCwgSmFudWFyeSAxLCAxOTcwCisgICAgICogR01ULiAgQWN0aW9ucyB0aGF0IHlvdXIgYXBwbGljYXRpb24gdGFrZXMsIHN1Y2ggYXMgZ2V0dGluZyBvciBzZXR0aW5nCisgICAgICogYSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNlc3Npb24sIGRvIG5vdCBhZmZlY3QgdGhlIGFjY2VzcyB0aW1lLgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldExhc3RBY2Nlc3NlZFRpbWUoKSB7CisgICAgICAgIGlmICggIWlzVmFsaWQoKSApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJzdGFuZGFyZFNlc3Npb24uZ2V0TGFzdEFjY2Vzc2VkVGltZS5pc2UiKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICh0aGlzLmxhc3RBY2Nlc3NlZFRpbWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIE1hbmFnZXIgd2l0aGluIHdoaWNoIHRoaXMgU2Vzc2lvbiBpcyB2YWxpZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWFuYWdlciBnZXRNYW5hZ2VyKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5tYW5hZ2VyKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBNYW5hZ2VyIHdpdGhpbiB3aGljaCB0aGlzIFNlc3Npb24gaXMgdmFsaWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFuYWdlciBUaGUgbmV3IE1hbmFnZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNYW5hZ2VyKE1hbmFnZXIgbWFuYWdlcikgeworCisgICAgICAgIHRoaXMubWFuYWdlciA9IG1hbmFnZXI7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbWF4aW11bSB0aW1lIGludGVydmFsLCBpbiBzZWNvbmRzLCBiZXR3ZWVuIGNsaWVudCByZXF1ZXN0cworICAgICAqIGJlZm9yZSB0aGUgc2VydmxldCBjb250YWluZXIgd2lsbCBpbnZhbGlkYXRlIHRoZSBzZXNzaW9uLiAgQSBuZWdhdGl2ZQorICAgICAqIHRpbWUgaW5kaWNhdGVzIHRoYXQgdGhlIHNlc3Npb24gc2hvdWxkIG5ldmVyIHRpbWUgb3V0LgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0TWF4SW5hY3RpdmVJbnRlcnZhbCgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMubWF4SW5hY3RpdmVJbnRlcnZhbCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbWF4aW11bSB0aW1lIGludGVydmFsLCBpbiBzZWNvbmRzLCBiZXR3ZWVuIGNsaWVudCByZXF1ZXN0cworICAgICAqIGJlZm9yZSB0aGUgc2VydmxldCBjb250YWluZXIgd2lsbCBpbnZhbGlkYXRlIHRoZSBzZXNzaW9uLiAgQSBuZWdhdGl2ZQorICAgICAqIHRpbWUgaW5kaWNhdGVzIHRoYXQgdGhlIHNlc3Npb24gc2hvdWxkIG5ldmVyIHRpbWUgb3V0LgorICAgICAqCisgICAgICogQHBhcmFtIGludGVydmFsIFRoZSBuZXcgbWF4aW11bSBpbnRlcnZhbAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1heEluYWN0aXZlSW50ZXJ2YWwoaW50IGludGVydmFsKSB7CisKKyAgICAgICAgdGhpcy5tYXhJbmFjdGl2ZUludGVydmFsID0gaW50ZXJ2YWw7CisgICAgICAgIGlmIChpc1ZhbGlkICYmIGludGVydmFsID09IDApIHsKKyAgICAgICAgICAgIGV4cGlyZSgpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgPGNvZGU+aXNOZXc8L2NvZGU+IGZsYWcgZm9yIHRoaXMgc2Vzc2lvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpc05ldyBUaGUgbmV3IHZhbHVlIGZvciB0aGUgPGNvZGU+aXNOZXc8L2NvZGU+IGZsYWcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXROZXcoYm9vbGVhbiBpc05ldykgeworCisgICAgICAgIHRoaXMuaXNOZXcgPSBpc05ldzsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBhdXRoZW50aWNhdGVkIFByaW5jaXBhbCB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFNlc3Npb24uCisgICAgICogVGhpcyBwcm92aWRlcyBhbiA8Y29kZT5BdXRoZW50aWNhdG9yPC9jb2RlPiB3aXRoIGEgbWVhbnMgdG8gY2FjaGUgYQorICAgICAqIHByZXZpb3VzbHkgYXV0aGVudGljYXRlZCBQcmluY2lwYWwsIGFuZCBhdm9pZCBwb3RlbnRpYWxseSBleHBlbnNpdmUKKyAgICAgKiA8Y29kZT5SZWFsbS5hdXRoZW50aWNhdGUoKTwvY29kZT4gY2FsbHMgb24gZXZlcnkgcmVxdWVzdC4gIElmIHRoZXJlCisgICAgICogaXMgbm8gY3VycmVudCBhc3NvY2lhdGVkIFByaW5jaXBhbCwgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBQcmluY2lwYWwgZ2V0UHJpbmNpcGFsKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5wcmluY2lwYWwpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGF1dGhlbnRpY2F0ZWQgUHJpbmNpcGFsIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgU2Vzc2lvbi4KKyAgICAgKiBUaGlzIHByb3ZpZGVzIGFuIDxjb2RlPkF1dGhlbnRpY2F0b3I8L2NvZGU+IHdpdGggYSBtZWFucyB0byBjYWNoZSBhCisgICAgICogcHJldmlvdXNseSBhdXRoZW50aWNhdGVkIFByaW5jaXBhbCwgYW5kIGF2b2lkIHBvdGVudGlhbGx5IGV4cGVuc2l2ZQorICAgICAqIDxjb2RlPlJlYWxtLmF1dGhlbnRpY2F0ZSgpPC9jb2RlPiBjYWxscyBvbiBldmVyeSByZXF1ZXN0LgorICAgICAqCisgICAgICogQHBhcmFtIHByaW5jaXBhbCBUaGUgbmV3IFByaW5jaXBhbCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByaW5jaXBhbChQcmluY2lwYWwgcHJpbmNpcGFsKSB7CisKKyAgICAgICAgUHJpbmNpcGFsIG9sZFByaW5jaXBhbCA9IHRoaXMucHJpbmNpcGFsOworICAgICAgICB0aGlzLnByaW5jaXBhbCA9IHByaW5jaXBhbDsKKyAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoInByaW5jaXBhbCIsIG9sZFByaW5jaXBhbCwgdGhpcy5wcmluY2lwYWwpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIDxjb2RlPkh0dHBTZXNzaW9uPC9jb2RlPiBmb3Igd2hpY2ggdGhpcyBvYmplY3QKKyAgICAgKiBpcyB0aGUgZmFjYWRlLgorICAgICAqLworICAgIHB1YmxpYyBIdHRwU2Vzc2lvbiBnZXRTZXNzaW9uKCkgeworCisgICAgICAgIGlmIChmYWNhZGUgPT0gbnVsbCl7CisgICAgICAgICAgICBpZiAoU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpICE9IG51bGwpeworICAgICAgICAgICAgICAgIGZpbmFsIFN0YW5kYXJkU2Vzc2lvbiBmc2Vzc2lvbiA9IHRoaXM7CisgICAgICAgICAgICAgICAgZmFjYWRlID0gKFN0YW5kYXJkU2Vzc2lvbkZhY2FkZSlBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbigpeworICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdGFuZGFyZFNlc3Npb25GYWNhZGUoZnNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZhY2FkZSA9IG5ldyBTdGFuZGFyZFNlc3Npb25GYWNhZGUodGhpcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChmYWNhZGUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIDxjb2RlPmlzVmFsaWQ8L2NvZGU+IGZsYWcgZm9yIHRoaXMgc2Vzc2lvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgeworCisgICAgICAgIGlmICh0aGlzLmV4cGlyaW5nKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghdGhpcy5pc1ZhbGlkICkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGFjY2Vzc0NvdW50ID4gMCkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAobWF4SW5hY3RpdmVJbnRlcnZhbCA+PSAwKSB7IAorICAgICAgICAgICAgbG9uZyB0aW1lTm93ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICBpbnQgdGltZUlkbGUgPSAoaW50KSAoKHRpbWVOb3cgLSB0aGlzQWNjZXNzZWRUaW1lKSAvIDEwMDBMKTsKKyAgICAgICAgICAgIGlmICh0aW1lSWRsZSA+PSBtYXhJbmFjdGl2ZUludGVydmFsKSB7CisgICAgICAgICAgICAgICAgZXhwaXJlKHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICh0aGlzLmlzVmFsaWQpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSA8Y29kZT5pc1ZhbGlkPC9jb2RlPiBmbGFnIGZvciB0aGlzIHNlc3Npb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gaXNWYWxpZCBUaGUgbmV3IHZhbHVlIGZvciB0aGUgPGNvZGU+aXNWYWxpZDwvY29kZT4gZmxhZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFZhbGlkKGJvb2xlYW4gaXNWYWxpZCkgeworCisgICAgICAgIHRoaXMuaXNWYWxpZCA9IGlzVmFsaWQ7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNlc3Npb24gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogVXBkYXRlIHRoZSBhY2Nlc3NlZCB0aW1lIGluZm9ybWF0aW9uIGZvciB0aGlzIHNlc3Npb24uICBUaGlzIG1ldGhvZAorICAgICAqIHNob3VsZCBiZSBjYWxsZWQgYnkgdGhlIGNvbnRleHQgd2hlbiBhIHJlcXVlc3QgY29tZXMgaW4gZm9yIGEgcGFydGljdWxhcgorICAgICAqIHNlc3Npb24sIGV2ZW4gaWYgdGhlIGFwcGxpY2F0aW9uIGRvZXMgbm90IHJlZmVyZW5jZSBpdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhY2Nlc3MoKSB7CisKKyAgICAgICAgdGhpcy5sYXN0QWNjZXNzZWRUaW1lID0gdGhpcy50aGlzQWNjZXNzZWRUaW1lOworICAgICAgICB0aGlzLnRoaXNBY2Nlc3NlZFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKworICAgICAgICBldmFsdWF0ZUlmVmFsaWQoKTsKKworICAgICAgICBhY2Nlc3NDb3VudCsrOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBFbmQgdGhlIGFjY2Vzcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBlbmRBY2Nlc3MoKSB7CisKKyAgICAgICAgaXNOZXcgPSBmYWxzZTsKKyAgICAgICAgYWNjZXNzQ291bnQtLTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQWRkIGEgc2Vzc2lvbiBldmVudCBsaXN0ZW5lciB0byB0aGlzIGNvbXBvbmVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRTZXNzaW9uTGlzdGVuZXIoU2Vzc2lvbkxpc3RlbmVyIGxpc3RlbmVyKSB7CisKKyAgICAgICAgbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFBlcmZvcm0gdGhlIGludGVybmFsIHByb2Nlc3NpbmcgcmVxdWlyZWQgdG8gaW52YWxpZGF0ZSB0aGlzIHNlc3Npb24sCisgICAgICogd2l0aG91dCB0cmlnZ2VyaW5nIGFuIGV4Y2VwdGlvbiBpZiB0aGUgc2Vzc2lvbiBoYXMgYWxyZWFkeSBleHBpcmVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4cGlyZSgpIHsKKworICAgICAgICBleHBpcmUodHJ1ZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFBlcmZvcm0gdGhlIGludGVybmFsIHByb2Nlc3NpbmcgcmVxdWlyZWQgdG8gaW52YWxpZGF0ZSB0aGlzIHNlc3Npb24sCisgICAgICogd2l0aG91dCB0cmlnZ2VyaW5nIGFuIGV4Y2VwdGlvbiBpZiB0aGUgc2Vzc2lvbiBoYXMgYWxyZWFkeSBleHBpcmVkLgorICAgICAqCisgICAgICogQHBhcmFtIG5vdGlmeSBTaG91bGQgd2Ugbm90aWZ5IGxpc3RlbmVycyBhYm91dCB0aGUgZGVtaXNlIG9mCisgICAgICogIHRoaXMgc2Vzc2lvbj8KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleHBpcmUoYm9vbGVhbiBub3RpZnkpIHsKKworICAgICAgICAvLyBNYXJrIHRoaXMgc2Vzc2lvbiBhcyAiYmVpbmcgZXhwaXJlZCIgaWYgbmVlZGVkCisgICAgICAgIGlmIChleHBpcmluZykKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKworICAgICAgICAgICAgaWYgKG1hbmFnZXIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIGV4cGlyaW5nID0gdHJ1ZTsKKyAgICAgICAgCisgICAgICAgICAgICAvLyBOb3RpZnkgaW50ZXJlc3RlZCBhcHBsaWNhdGlvbiBldmVudCBsaXN0ZW5lcnMKKyAgICAgICAgICAgIC8vIEZJWE1FIC0gQXNzdW1lcyB3ZSBjYWxsIGxpc3RlbmVycyBpbiByZXZlcnNlIG9yZGVyCisgICAgICAgICAgICBDb250ZXh0IGNvbnRleHQgPSAoQ29udGV4dCkgbWFuYWdlci5nZXRDb250YWluZXIoKTsKKyAgICAgICAgICAgIE9iamVjdCBsaXN0ZW5lcnNbXSA9IGNvbnRleHQuZ2V0QXBwbGljYXRpb25MaWZlY3ljbGVMaXN0ZW5lcnMoKTsKKyAgICAgICAgICAgIGlmIChub3RpZnkgJiYgKGxpc3RlbmVycyAhPSBudWxsKSkgeworICAgICAgICAgICAgICAgIEh0dHBTZXNzaW9uRXZlbnQgZXZlbnQgPQorICAgICAgICAgICAgICAgICAgICBuZXcgSHR0cFNlc3Npb25FdmVudChnZXRTZXNzaW9uKCkpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBqID0gKGxpc3RlbmVycy5sZW5ndGggLSAxKSAtIGk7CisgICAgICAgICAgICAgICAgICAgIGlmICghKGxpc3RlbmVyc1tqXSBpbnN0YW5jZW9mIEh0dHBTZXNzaW9uTGlzdGVuZXIpKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIEh0dHBTZXNzaW9uTGlzdGVuZXIgbGlzdGVuZXIgPQorICAgICAgICAgICAgICAgICAgICAgICAgKEh0dHBTZXNzaW9uTGlzdGVuZXIpIGxpc3RlbmVyc1tqXTsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpcmVDb250YWluZXJFdmVudChjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZWZvcmVTZXNzaW9uRGVzdHJveWVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5zZXNzaW9uRGVzdHJveWVkKGV2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpcmVDb250YWluZXJFdmVudChjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZnRlclNlc3Npb25EZXN0cm95ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyZUNvbnRhaW5lckV2ZW50KGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZnRlclNlc3Npb25EZXN0cm95ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZXIuZ2V0Q29udGFpbmVyKCkuZ2V0TG9nZ2VyKCkuZXJyb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJzdGFuZGFyZFNlc3Npb24uc2Vzc2lvbkV2ZW50IiksIHQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYWNjZXNzQ291bnQgPSAwOworICAgICAgICAgICAgc2V0VmFsaWQoZmFsc2UpOworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQ29tcHV0ZSBob3cgbG9uZyB0aGlzIHNlc3Npb24gaGFzIGJlZW4gYWxpdmUsIGFuZCB1cGRhdGUKKyAgICAgICAgICAgICAqIHNlc3Npb24gbWFuYWdlcidzIHJlbGF0ZWQgcHJvcGVydGllcyBhY2NvcmRpbmdseQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBsb25nIHRpbWVOb3cgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgIGludCB0aW1lQWxpdmUgPSAoaW50KSAoKHRpbWVOb3cgLSBjcmVhdGlvblRpbWUpLzEwMDApOworICAgICAgICAgICAgc3luY2hyb25pemVkIChtYW5hZ2VyKSB7CisgICAgICAgICAgICAgICAgaWYgKHRpbWVBbGl2ZSA+IG1hbmFnZXIuZ2V0U2Vzc2lvbk1heEFsaXZlVGltZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIG1hbmFnZXIuc2V0U2Vzc2lvbk1heEFsaXZlVGltZSh0aW1lQWxpdmUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnQgbnVtRXhwaXJlZCA9IG1hbmFnZXIuZ2V0RXhwaXJlZFNlc3Npb25zKCk7CisgICAgICAgICAgICAgICAgbnVtRXhwaXJlZCsrOworICAgICAgICAgICAgICAgIG1hbmFnZXIuc2V0RXhwaXJlZFNlc3Npb25zKG51bUV4cGlyZWQpOworICAgICAgICAgICAgICAgIGludCBhdmVyYWdlID0gbWFuYWdlci5nZXRTZXNzaW9uQXZlcmFnZUFsaXZlVGltZSgpOworICAgICAgICAgICAgICAgIGF2ZXJhZ2UgPSAoKGF2ZXJhZ2UgKiAobnVtRXhwaXJlZC0xKSkgKyB0aW1lQWxpdmUpL251bUV4cGlyZWQ7CisgICAgICAgICAgICAgICAgbWFuYWdlci5zZXRTZXNzaW9uQXZlcmFnZUFsaXZlVGltZShhdmVyYWdlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gUmVtb3ZlIHRoaXMgc2Vzc2lvbiBmcm9tIG91ciBtYW5hZ2VyJ3MgYWN0aXZlIHNlc3Npb25zCisgICAgICAgICAgICBtYW5hZ2VyLnJlbW92ZSh0aGlzKTsKKworICAgICAgICAgICAgLy8gTm90aWZ5IGludGVyZXN0ZWQgc2Vzc2lvbiBldmVudCBsaXN0ZW5lcnMKKyAgICAgICAgICAgIGlmIChub3RpZnkpIHsKKyAgICAgICAgICAgICAgICBmaXJlU2Vzc2lvbkV2ZW50KFNlc3Npb24uU0VTU0lPTl9ERVNUUk9ZRURfRVZFTlQsIG51bGwpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBXZSBoYXZlIGNvbXBsZXRlZCBleHBpcmUgb2YgdGhpcyBzZXNzaW9uCisgICAgICAgICAgICBleHBpcmluZyA9IGZhbHNlOworCisgICAgICAgICAgICAvLyBVbmJpbmQgYW55IG9iamVjdHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc2Vzc2lvbgorICAgICAgICAgICAgU3RyaW5nIGtleXNbXSA9IGtleXMoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICByZW1vdmVBdHRyaWJ1dGVJbnRlcm5hbChrZXlzW2ldLCBub3RpZnkpOworCisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUGVyZm9ybSB0aGUgaW50ZXJuYWwgcHJvY2Vzc2luZyByZXF1aXJlZCB0byBwYXNzaXZhdGUKKyAgICAgKiB0aGlzIHNlc3Npb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgcGFzc2l2YXRlKCkgeworCisgICAgICAgIC8vIE5vdGlmeSBBY3RpdmF0aW9uTGlzdGVuZXJzCisgICAgICAgIEh0dHBTZXNzaW9uRXZlbnQgZXZlbnQgPSBudWxsOworICAgICAgICBTdHJpbmcga2V5c1tdID0ga2V5cygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIE9iamVjdCBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLmdldChrZXlzW2ldKTsKKyAgICAgICAgICAgIGlmIChhdHRyaWJ1dGUgaW5zdGFuY2VvZiBIdHRwU2Vzc2lvbkFjdGl2YXRpb25MaXN0ZW5lcikgeworICAgICAgICAgICAgICAgIGlmIChldmVudCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBldmVudCA9IG5ldyBIdHRwU2Vzc2lvbkV2ZW50KGdldFNlc3Npb24oKSk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgKChIdHRwU2Vzc2lvbkFjdGl2YXRpb25MaXN0ZW5lcilhdHRyaWJ1dGUpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2Vzc2lvbldpbGxQYXNzaXZhdGUoZXZlbnQpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgICAgIG1hbmFnZXIuZ2V0Q29udGFpbmVyKCkuZ2V0TG9nZ2VyKCkuZXJyb3IKKyAgICAgICAgICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInN0YW5kYXJkU2Vzc2lvbi5hdHRyaWJ1dGVFdmVudCIpLCB0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUGVyZm9ybSBpbnRlcm5hbCBwcm9jZXNzaW5nIHJlcXVpcmVkIHRvIGFjdGl2YXRlIHRoaXMKKyAgICAgKiBzZXNzaW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFjdGl2YXRlKCkgeworCisgICAgICAgIC8vIE5vdGlmeSBBY3RpdmF0aW9uTGlzdGVuZXJzCisgICAgICAgIEh0dHBTZXNzaW9uRXZlbnQgZXZlbnQgPSBudWxsOworICAgICAgICBTdHJpbmcga2V5c1tdID0ga2V5cygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIE9iamVjdCBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLmdldChrZXlzW2ldKTsKKyAgICAgICAgICAgIGlmIChhdHRyaWJ1dGUgaW5zdGFuY2VvZiBIdHRwU2Vzc2lvbkFjdGl2YXRpb25MaXN0ZW5lcikgeworICAgICAgICAgICAgICAgIGlmIChldmVudCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBldmVudCA9IG5ldyBIdHRwU2Vzc2lvbkV2ZW50KGdldFNlc3Npb24oKSk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgKChIdHRwU2Vzc2lvbkFjdGl2YXRpb25MaXN0ZW5lcilhdHRyaWJ1dGUpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2Vzc2lvbkRpZEFjdGl2YXRlKGV2ZW50KTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgICAgICBtYW5hZ2VyLmdldENvbnRhaW5lcigpLmdldExvZ2dlcigpLmVycm9yCisgICAgICAgICAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJzdGFuZGFyZFNlc3Npb24uYXR0cmlidXRlRXZlbnQiKSwgdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgb2JqZWN0IGJvdW5kIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIHRvIHRoZSBpbnRlcm5hbCBub3RlcworICAgICAqIGZvciB0aGlzIHNlc3Npb24sIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHN1Y2ggYmluZGluZyBleGlzdHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBub3RlIHRvIGJlIHJldHVybmVkCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXROb3RlKFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgcmV0dXJuIChub3Rlcy5nZXQobmFtZSkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYW4gSXRlcmF0b3IgY29udGFpbmluZyB0aGUgU3RyaW5nIG5hbWVzIG9mIGFsbCBub3RlcyBiaW5kaW5ncworICAgICAqIHRoYXQgZXhpc3QgZm9yIHRoaXMgc2Vzc2lvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgSXRlcmF0b3IgZ2V0Tm90ZU5hbWVzKCkgeworCisgICAgICAgIHJldHVybiAobm90ZXMua2V5U2V0KCkuaXRlcmF0b3IoKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbGVhc2UgYWxsIG9iamVjdCByZWZlcmVuY2VzLCBhbmQgaW5pdGlhbGl6ZSBpbnN0YW5jZSB2YXJpYWJsZXMsIGluCisgICAgICogcHJlcGFyYXRpb24gZm9yIHJldXNlIG9mIHRoaXMgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlY3ljbGUoKSB7CisKKyAgICAgICAgLy8gUmVzZXQgdGhlIGluc3RhbmNlIHZhcmlhYmxlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBTZXNzaW9uCisgICAgICAgIGF0dHJpYnV0ZXMuY2xlYXIoKTsKKyAgICAgICAgc2V0QXV0aFR5cGUobnVsbCk7CisgICAgICAgIGNyZWF0aW9uVGltZSA9IDBMOworICAgICAgICBleHBpcmluZyA9IGZhbHNlOworICAgICAgICBpZCA9IG51bGw7CisgICAgICAgIGxhc3RBY2Nlc3NlZFRpbWUgPSAwTDsKKyAgICAgICAgbWF4SW5hY3RpdmVJbnRlcnZhbCA9IC0xOworICAgICAgICBhY2Nlc3NDb3VudCA9IDA7CisgICAgICAgIG5vdGVzLmNsZWFyKCk7CisgICAgICAgIHNldFByaW5jaXBhbChudWxsKTsKKyAgICAgICAgaXNOZXcgPSBmYWxzZTsKKyAgICAgICAgaXNWYWxpZCA9IGZhbHNlOworICAgICAgICBtYW5hZ2VyID0gbnVsbDsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGFueSBvYmplY3QgYm91bmQgdG8gdGhlIHNwZWNpZmllZCBuYW1lIGluIHRoZSBpbnRlcm5hbCBub3RlcworICAgICAqIGZvciB0aGlzIHNlc3Npb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBub3RlIHRvIGJlIHJlbW92ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVOb3RlKFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgbm90ZXMucmVtb3ZlKG5hbWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSBzZXNzaW9uIGV2ZW50IGxpc3RlbmVyIGZyb20gdGhpcyBjb21wb25lbnQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlU2Vzc2lvbkxpc3RlbmVyKFNlc3Npb25MaXN0ZW5lciBsaXN0ZW5lcikgeworCisgICAgICAgIGxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBCaW5kIGFuIG9iamVjdCB0byBhIHNwZWNpZmllZCBuYW1lIGluIHRoZSBpbnRlcm5hbCBub3RlcyBhc3NvY2lhdGVkCisgICAgICogd2l0aCB0aGlzIHNlc3Npb24sIHJlcGxhY2luZyBhbnkgZXhpc3RpbmcgYmluZGluZyBmb3IgdGhpcyBuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSB0byB3aGljaCB0aGUgb2JqZWN0IHNob3VsZCBiZSBib3VuZAorICAgICAqIEBwYXJhbSB2YWx1ZSBPYmplY3QgdG8gYmUgYm91bmQgdG8gdGhlIHNwZWNpZmllZCBuYW1lCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Tm90ZShTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKSB7CisKKyAgICAgICAgbm90ZXMucHV0KG5hbWUsIHZhbHVlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBzYi5hcHBlbmQoIlN0YW5kYXJkU2Vzc2lvblsiKTsKKyAgICAgICAgc2IuYXBwZW5kKGlkKTsKKyAgICAgICAgc2IuYXBwZW5kKCJdIik7CisgICAgICAgIHJldHVybiAoc2IudG9TdHJpbmcoKSk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTZXNzaW9uIFBhY2thZ2UgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZWFkIGEgc2VyaWFsaXplZCB2ZXJzaW9uIG9mIHRoZSBjb250ZW50cyBvZiB0aGlzIHNlc3Npb24gb2JqZWN0IGZyb20KKyAgICAgKiB0aGUgc3BlY2lmaWVkIG9iamVjdCBpbnB1dCBzdHJlYW0sIHdpdGhvdXQgcmVxdWlyaW5nIHRoYXQgdGhlCisgICAgICogU3RhbmRhcmRTZXNzaW9uIGl0c2VsZiBoYXZlIGJlZW4gc2VyaWFsaXplZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJlYW0gVGhlIG9iamVjdCBpbnB1dCBzdHJlYW0gdG8gcmVhZCBmcm9tCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIENsYXNzTm90Rm91bmRFeGNlcHRpb24gaWYgYW4gdW5rbm93biBjbGFzcyBpcyBzcGVjaWZpZWQKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWFkT2JqZWN0RGF0YShPYmplY3RJbnB1dFN0cmVhbSBzdHJlYW0pCisgICAgICAgIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgcmVhZE9iamVjdChzdHJlYW0pOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBXcml0ZSBhIHNlcmlhbGl6ZWQgdmVyc2lvbiBvZiB0aGUgY29udGVudHMgb2YgdGhpcyBzZXNzaW9uIG9iamVjdCB0bworICAgICAqIHRoZSBzcGVjaWZpZWQgb2JqZWN0IG91dHB1dCBzdHJlYW0sIHdpdGhvdXQgcmVxdWlyaW5nIHRoYXQgdGhlCisgICAgICogU3RhbmRhcmRTZXNzaW9uIGl0c2VsZiBoYXZlIGJlZW4gc2VyaWFsaXplZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJlYW0gVGhlIG9iamVjdCBvdXRwdXQgc3RyZWFtIHRvIHdyaXRlIHRvCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3cml0ZU9iamVjdERhdGEoT2JqZWN0T3V0cHV0U3RyZWFtIHN0cmVhbSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICB3cml0ZU9iamVjdChzdHJlYW0pOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEh0dHBTZXNzaW9uIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB0aW1lIHdoZW4gdGhpcyBzZXNzaW9uIHdhcyBjcmVhdGVkLCBpbiBtaWxsaXNlY29uZHMgc2luY2UKKyAgICAgKiBtaWRuaWdodCwgSmFudWFyeSAxLCAxOTcwIEdNVC4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbiBhbgorICAgICAqICBpbnZhbGlkYXRlZCBzZXNzaW9uCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0Q3JlYXRpb25UaW1lKCkgeworCisgICAgICAgIGlmICghaXNWYWxpZCgpKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInN0YW5kYXJkU2Vzc2lvbi5nZXRDcmVhdGlvblRpbWUuaXNlIikpOworCisgICAgICAgIHJldHVybiAodGhpcy5jcmVhdGlvblRpbWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIFNlcnZsZXRDb250ZXh0IHRvIHdoaWNoIHRoaXMgc2Vzc2lvbiBiZWxvbmdzLgorICAgICAqLworICAgIHB1YmxpYyBTZXJ2bGV0Q29udGV4dCBnZXRTZXJ2bGV0Q29udGV4dCgpIHsKKworICAgICAgICBpZiAobWFuYWdlciA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gKENvbnRleHQpIG1hbmFnZXIuZ2V0Q29udGFpbmVyKCk7CisgICAgICAgIGlmIChjb250ZXh0ID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gKGNvbnRleHQuZ2V0U2VydmxldENvbnRleHQoKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2Vzc2lvbiBjb250ZXh0IHdpdGggd2hpY2ggdGhpcyBzZXNzaW9uIGlzIGFzc29jaWF0ZWQuCisgICAgICoKKyAgICAgKiBAZGVwcmVjYXRlZCBBcyBvZiBWZXJzaW9uIDIuMSwgdGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZCBhbmQgaGFzIG5vCisgICAgICogIHJlcGxhY2VtZW50LiAgSXQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHZlcnNpb24gb2YgdGhlCisgICAgICogIEphdmEgU2VydmxldCBBUEkuCisgICAgICovCisgICAgcHVibGljIEh0dHBTZXNzaW9uQ29udGV4dCBnZXRTZXNzaW9uQ29udGV4dCgpIHsKKworICAgICAgICBpZiAoc2Vzc2lvbkNvbnRleHQgPT0gbnVsbCkKKyAgICAgICAgICAgIHNlc3Npb25Db250ZXh0ID0gbmV3IFN0YW5kYXJkU2Vzc2lvbkNvbnRleHQoKTsKKyAgICAgICAgcmV0dXJuIChzZXNzaW9uQ29udGV4dCk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1IdHRwU2Vzc2lvbiBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG9iamVjdCBib3VuZCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBpbiB0aGlzIHNlc3Npb24sIG9yCisgICAgICogPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gb2JqZWN0IGlzIGJvdW5kIHdpdGggdGhhdCBuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgYXR0cmlidXRlIHRvIGJlIHJldHVybmVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgb24gYW4KKyAgICAgKiAgaW52YWxpZGF0ZWQgc2Vzc2lvbgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0QXR0cmlidXRlKFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgaWYgKCFpc1ZhbGlkKCkpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygic3RhbmRhcmRTZXNzaW9uLmdldEF0dHJpYnV0ZS5pc2UiKSk7CisKKyAgICAgICAgcmV0dXJuIChhdHRyaWJ1dGVzLmdldChuYW1lKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhbiA8Y29kZT5FbnVtZXJhdGlvbjwvY29kZT4gb2YgPGNvZGU+U3RyaW5nPC9jb2RlPiBvYmplY3RzCisgICAgICogY29udGFpbmluZyB0aGUgbmFtZXMgb2YgdGhlIG9iamVjdHMgYm91bmQgdG8gdGhpcyBzZXNzaW9uLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIG9uIGFuCisgICAgICogIGludmFsaWRhdGVkIHNlc3Npb24KKyAgICAgKi8KKyAgICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0QXR0cmlidXRlTmFtZXMoKSB7CisKKyAgICAgICAgaWYgKCFpc1ZhbGlkKCkpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygic3RhbmRhcmRTZXNzaW9uLmdldEF0dHJpYnV0ZU5hbWVzLmlzZSIpKTsKKworICAgICAgICByZXR1cm4gKG5ldyBFbnVtZXJhdG9yKGF0dHJpYnV0ZXMua2V5U2V0KCksIHRydWUpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBvYmplY3QgYm91bmQgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgaW4gdGhpcyBzZXNzaW9uLCBvcgorICAgICAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIG9iamVjdCBpcyBib3VuZCB3aXRoIHRoYXQgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIHZhbHVlIHRvIGJlIHJldHVybmVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgb24gYW4KKyAgICAgKiAgaW52YWxpZGF0ZWQgc2Vzc2lvbgorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQgQXMgb2YgVmVyc2lvbiAyLjIsIHRoaXMgbWV0aG9kIGlzIHJlcGxhY2VkIGJ5CisgICAgICogIDxjb2RlPmdldEF0dHJpYnV0ZSgpPC9jb2RlPgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoU3RyaW5nIG5hbWUpIHsKKworICAgICAgICByZXR1cm4gKGdldEF0dHJpYnV0ZShuYW1lKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2V0IG9mIG5hbWVzIG9mIG9iamVjdHMgYm91bmQgdG8gdGhpcyBzZXNzaW9uLiAgSWYgdGhlcmUKKyAgICAgKiBhcmUgbm8gc3VjaCBvYmplY3RzLCBhIHplcm8tbGVuZ3RoIGFycmF5IGlzIHJldHVybmVkLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIG9uIGFuCisgICAgICogIGludmFsaWRhdGVkIHNlc3Npb24KKyAgICAgKgorICAgICAqIEBkZXByZWNhdGVkIEFzIG9mIFZlcnNpb24gMi4yLCB0aGlzIG1ldGhvZCBpcyByZXBsYWNlZCBieQorICAgICAqICA8Y29kZT5nZXRBdHRyaWJ1dGVOYW1lcygpPC9jb2RlPgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWx1ZU5hbWVzKCkgeworCisgICAgICAgIGlmICghaXNWYWxpZCgpKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInN0YW5kYXJkU2Vzc2lvbi5nZXRWYWx1ZU5hbWVzLmlzZSIpKTsKKworICAgICAgICByZXR1cm4gKGtleXMoKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEludmFsaWRhdGVzIHRoaXMgc2Vzc2lvbiBhbmQgdW5iaW5kcyBhbnkgb2JqZWN0cyBib3VuZCB0byBpdC4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbgorICAgICAqICBhbiBpbnZhbGlkYXRlZCBzZXNzaW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgaW52YWxpZGF0ZSgpIHsKKworICAgICAgICBpZiAoIWlzVmFsaWQoKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJzdGFuZGFyZFNlc3Npb24uaW52YWxpZGF0ZS5pc2UiKSk7CisKKyAgICAgICAgLy8gQ2F1c2UgdGhpcyBzZXNzaW9uIHRvIGV4cGlyZQorICAgICAgICBleHBpcmUoKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjbGllbnQgZG9lcyBub3QgeWV0IGtub3cgYWJvdXQgdGhlCisgICAgICogc2Vzc2lvbiwgb3IgaWYgdGhlIGNsaWVudCBjaG9vc2VzIG5vdCB0byBqb2luIHRoZSBzZXNzaW9uLiAgRm9yCisgICAgICogZXhhbXBsZSwgaWYgdGhlIHNlcnZlciB1c2VkIG9ubHkgY29va2llLWJhc2VkIHNlc3Npb25zLCBhbmQgdGhlIGNsaWVudAorICAgICAqIGhhcyBkaXNhYmxlZCB0aGUgdXNlIG9mIGNvb2tpZXMsIHRoZW4gYSBzZXNzaW9uIHdvdWxkIGJlIG5ldyBvbiBlYWNoCisgICAgICogcmVxdWVzdC4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbiBhbgorICAgICAqICBpbnZhbGlkYXRlZCBzZXNzaW9uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNOZXcoKSB7CisKKyAgICAgICAgaWYgKCFpc1ZhbGlkKCkpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygic3RhbmRhcmRTZXNzaW9uLmlzTmV3LmlzZSIpKTsKKworICAgICAgICByZXR1cm4gKHRoaXMuaXNOZXcpOworCisgICAgfQorCisKKworICAgIC8qKgorICAgICAqIEJpbmQgYW4gb2JqZWN0IHRvIHRoaXMgc2Vzc2lvbiwgdXNpbmcgdGhlIHNwZWNpZmllZCBuYW1lLiAgSWYgYW4gb2JqZWN0CisgICAgICogb2YgdGhlIHNhbWUgbmFtZSBpcyBhbHJlYWR5IGJvdW5kIHRvIHRoaXMgc2Vzc2lvbiwgdGhlIG9iamVjdCBpcworICAgICAqIHJlcGxhY2VkLgorICAgICAqIDxwPgorICAgICAqIEFmdGVyIHRoaXMgbWV0aG9kIGV4ZWN1dGVzLCBhbmQgaWYgdGhlIG9iamVjdCBpbXBsZW1lbnRzCisgICAgICogPGNvZGU+SHR0cFNlc3Npb25CaW5kaW5nTGlzdGVuZXI8L2NvZGU+LCB0aGUgY29udGFpbmVyIGNhbGxzCisgICAgICogPGNvZGU+dmFsdWVCb3VuZCgpPC9jb2RlPiBvbiB0aGUgb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSB0byB3aGljaCB0aGUgb2JqZWN0IGlzIGJvdW5kLCBjYW5ub3QgYmUgbnVsbAorICAgICAqIEBwYXJhbSB2YWx1ZSBPYmplY3QgdG8gYmUgYm91bmQsIGNhbm5vdCBiZSBudWxsCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgb24gYW4KKyAgICAgKiAgaW52YWxpZGF0ZWQgc2Vzc2lvbgorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQgQXMgb2YgVmVyc2lvbiAyLjIsIHRoaXMgbWV0aG9kIGlzIHJlcGxhY2VkIGJ5CisgICAgICogIDxjb2RlPnNldEF0dHJpYnV0ZSgpPC9jb2RlPgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHB1dFZhbHVlKFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsKKworICAgICAgICBzZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgdGhlIG9iamVjdCBib3VuZCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBmcm9tIHRoaXMgc2Vzc2lvbi4gIElmCisgICAgICogdGhlIHNlc3Npb24gZG9lcyBub3QgaGF2ZSBhbiBvYmplY3QgYm91bmQgd2l0aCB0aGlzIG5hbWUsIHRoaXMgbWV0aG9kCisgICAgICogZG9lcyBub3RoaW5nLgorICAgICAqIDxwPgorICAgICAqIEFmdGVyIHRoaXMgbWV0aG9kIGV4ZWN1dGVzLCBhbmQgaWYgdGhlIG9iamVjdCBpbXBsZW1lbnRzCisgICAgICogPGNvZGU+SHR0cFNlc3Npb25CaW5kaW5nTGlzdGVuZXI8L2NvZGU+LCB0aGUgY29udGFpbmVyIGNhbGxzCisgICAgICogPGNvZGU+dmFsdWVVbmJvdW5kKCk8L2NvZGU+IG9uIHRoZSBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBvYmplY3QgdG8gcmVtb3ZlIGZyb20gdGhpcyBzZXNzaW9uLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIG9uIGFuCisgICAgICogIGludmFsaWRhdGVkIHNlc3Npb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHsKKworICAgICAgICByZW1vdmVBdHRyaWJ1dGUobmFtZSwgdHJ1ZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGUgb2JqZWN0IGJvdW5kIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGZyb20gdGhpcyBzZXNzaW9uLiAgSWYKKyAgICAgKiB0aGUgc2Vzc2lvbiBkb2VzIG5vdCBoYXZlIGFuIG9iamVjdCBib3VuZCB3aXRoIHRoaXMgbmFtZSwgdGhpcyBtZXRob2QKKyAgICAgKiBkb2VzIG5vdGhpbmcuCisgICAgICogPHA+CisgICAgICogQWZ0ZXIgdGhpcyBtZXRob2QgZXhlY3V0ZXMsIGFuZCBpZiB0aGUgb2JqZWN0IGltcGxlbWVudHMKKyAgICAgKiA8Y29kZT5IdHRwU2Vzc2lvbkJpbmRpbmdMaXN0ZW5lcjwvY29kZT4sIHRoZSBjb250YWluZXIgY2FsbHMKKyAgICAgKiA8Y29kZT52YWx1ZVVuYm91bmQoKTwvY29kZT4gb24gdGhlIG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIG9iamVjdCB0byByZW1vdmUgZnJvbSB0aGlzIHNlc3Npb24uCisgICAgICogQHBhcmFtIG5vdGlmeSBTaG91bGQgd2Ugbm90aWZ5IGludGVyZXN0ZWQgbGlzdGVuZXJzIHRoYXQgdGhpcworICAgICAqICBhdHRyaWJ1dGUgaXMgYmVpbmcgcmVtb3ZlZD8KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbiBhbgorICAgICAqICBpbnZhbGlkYXRlZCBzZXNzaW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlQXR0cmlidXRlKFN0cmluZyBuYW1lLCBib29sZWFuIG5vdGlmeSkgeworCisgICAgICAgIC8vIFZhbGlkYXRlIG91ciBjdXJyZW50IHN0YXRlCisgICAgICAgIGlmICghaXNWYWxpZCgpKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInN0YW5kYXJkU2Vzc2lvbi5yZW1vdmVBdHRyaWJ1dGUuaXNlIikpOworCisgICAgICAgIHJlbW92ZUF0dHJpYnV0ZUludGVybmFsKG5hbWUsIG5vdGlmeSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGUgb2JqZWN0IGJvdW5kIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGZyb20gdGhpcyBzZXNzaW9uLiAgSWYKKyAgICAgKiB0aGUgc2Vzc2lvbiBkb2VzIG5vdCBoYXZlIGFuIG9iamVjdCBib3VuZCB3aXRoIHRoaXMgbmFtZSwgdGhpcyBtZXRob2QKKyAgICAgKiBkb2VzIG5vdGhpbmcuCisgICAgICogPHA+CisgICAgICogQWZ0ZXIgdGhpcyBtZXRob2QgZXhlY3V0ZXMsIGFuZCBpZiB0aGUgb2JqZWN0IGltcGxlbWVudHMKKyAgICAgKiA8Y29kZT5IdHRwU2Vzc2lvbkJpbmRpbmdMaXN0ZW5lcjwvY29kZT4sIHRoZSBjb250YWluZXIgY2FsbHMKKyAgICAgKiA8Y29kZT52YWx1ZVVuYm91bmQoKTwvY29kZT4gb24gdGhlIG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIG9iamVjdCB0byByZW1vdmUgZnJvbSB0aGlzIHNlc3Npb24uCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgb24gYW4KKyAgICAgKiAgaW52YWxpZGF0ZWQgc2Vzc2lvbgorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQgQXMgb2YgVmVyc2lvbiAyLjIsIHRoaXMgbWV0aG9kIGlzIHJlcGxhY2VkIGJ5CisgICAgICogIDxjb2RlPnJlbW92ZUF0dHJpYnV0ZSgpPC9jb2RlPgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVZhbHVlKFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgcmVtb3ZlQXR0cmlidXRlKG5hbWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBCaW5kIGFuIG9iamVjdCB0byB0aGlzIHNlc3Npb24sIHVzaW5nIHRoZSBzcGVjaWZpZWQgbmFtZS4gIElmIGFuIG9iamVjdAorICAgICAqIG9mIHRoZSBzYW1lIG5hbWUgaXMgYWxyZWFkeSBib3VuZCB0byB0aGlzIHNlc3Npb24sIHRoZSBvYmplY3QgaXMKKyAgICAgKiByZXBsYWNlZC4KKyAgICAgKiA8cD4KKyAgICAgKiBBZnRlciB0aGlzIG1ldGhvZCBleGVjdXRlcywgYW5kIGlmIHRoZSBvYmplY3QgaW1wbGVtZW50cworICAgICAqIDxjb2RlPkh0dHBTZXNzaW9uQmluZGluZ0xpc3RlbmVyPC9jb2RlPiwgdGhlIGNvbnRhaW5lciBjYWxscworICAgICAqIDxjb2RlPnZhbHVlQm91bmQoKTwvY29kZT4gb24gdGhlIG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgdG8gd2hpY2ggdGhlIG9iamVjdCBpcyBib3VuZCwgY2Fubm90IGJlIG51bGwKKyAgICAgKiBAcGFyYW0gdmFsdWUgT2JqZWN0IHRvIGJlIGJvdW5kLCBjYW5ub3QgYmUgbnVsbAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIGFkZCBhCisgICAgICogIG5vbi1zZXJpYWxpemFibGUgb2JqZWN0IGluIGFuIGVudmlyb25tZW50IG1hcmtlZCBkaXN0cmlidXRhYmxlLgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbiBhbgorICAgICAqICBpbnZhbGlkYXRlZCBzZXNzaW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsKKworICAgICAgICAvLyBOYW1lIGNhbm5vdCBiZSBudWxsCisgICAgICAgIGlmIChuYW1lID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygic3RhbmRhcmRTZXNzaW9uLnNldEF0dHJpYnV0ZS5uYW1lbnVsbCIpKTsKKworICAgICAgICAvLyBOdWxsIHZhbHVlIGlzIHRoZSBzYW1lIGFzIHJlbW92ZUF0dHJpYnV0ZSgpCisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZW1vdmVBdHRyaWJ1dGUobmFtZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBWYWxpZGF0ZSBvdXIgY3VycmVudCBzdGF0ZQorICAgICAgICBpZiAoIWlzVmFsaWQoKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJzdGFuZGFyZFNlc3Npb24uc2V0QXR0cmlidXRlLmlzZSIpKTsKKyAgICAgICAgaWYgKChtYW5hZ2VyICE9IG51bGwpICYmIG1hbmFnZXIuZ2V0RGlzdHJpYnV0YWJsZSgpICYmCisgICAgICAgICAgISh2YWx1ZSBpbnN0YW5jZW9mIFNlcmlhbGl6YWJsZSkpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygic3RhbmRhcmRTZXNzaW9uLnNldEF0dHJpYnV0ZS5pYWUiKSk7CisKKyAgICAgICAgLy8gQ29uc3RydWN0IGFuIGV2ZW50IHdpdGggdGhlIG5ldyB2YWx1ZQorICAgICAgICBIdHRwU2Vzc2lvbkJpbmRpbmdFdmVudCBldmVudCA9IG51bGw7CisKKyAgICAgICAgLy8gQ2FsbCB0aGUgdmFsdWVCb3VuZCgpIG1ldGhvZCBpZiBuZWNlc3NhcnkKKyAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgSHR0cFNlc3Npb25CaW5kaW5nTGlzdGVuZXIpIHsKKyAgICAgICAgICAgIC8vIERvbid0IGNhbGwgYW55IG5vdGlmaWNhdGlvbiBpZiByZXBsYWNpbmcgd2l0aCB0aGUgc2FtZSB2YWx1ZQorICAgICAgICAgICAgT2JqZWN0IG9sZFZhbHVlID0gYXR0cmlidXRlcy5nZXQobmFtZSk7CisgICAgICAgICAgICBpZiAodmFsdWUgIT0gb2xkVmFsdWUpIHsKKyAgICAgICAgICAgICAgICBldmVudCA9IG5ldyBIdHRwU2Vzc2lvbkJpbmRpbmdFdmVudChnZXRTZXNzaW9uKCksIG5hbWUsIHZhbHVlKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAoKEh0dHBTZXNzaW9uQmluZGluZ0xpc3RlbmVyKSB2YWx1ZSkudmFsdWVCb3VuZChldmVudCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpeworICAgICAgICAgICAgICAgICAgICBtYW5hZ2VyLmdldENvbnRhaW5lcigpLmdldExvZ2dlcigpLmVycm9yCisgICAgICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInN0YW5kYXJkU2Vzc2lvbi5iaW5kaW5nRXZlbnQiKSwgdCk7IAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlcGxhY2Ugb3IgYWRkIHRoaXMgYXR0cmlidXRlCisgICAgICAgIE9iamVjdCB1bmJvdW5kID0gbnVsbDsKKyAgICAgICAgc3luY2hyb25pemVkIChhdHRyaWJ1dGVzKSB7CisgICAgICAgICAgICB1bmJvdW5kID0gYXR0cmlidXRlcy5wdXQobmFtZSwgdmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2FsbCB0aGUgdmFsdWVVbmJvdW5kKCkgbWV0aG9kIGlmIG5lY2Vzc2FyeQorICAgICAgICBpZiAoKHVuYm91bmQgIT0gbnVsbCkgJiYgKHVuYm91bmQgIT0gdmFsdWUpICYmCisgICAgICAgICAgICAodW5ib3VuZCBpbnN0YW5jZW9mIEh0dHBTZXNzaW9uQmluZGluZ0xpc3RlbmVyKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAoKEh0dHBTZXNzaW9uQmluZGluZ0xpc3RlbmVyKSB1bmJvdW5kKS52YWx1ZVVuYm91bmQKKyAgICAgICAgICAgICAgICAgICAgKG5ldyBIdHRwU2Vzc2lvbkJpbmRpbmdFdmVudChnZXRTZXNzaW9uKCksIG5hbWUpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgbWFuYWdlci5nZXRDb250YWluZXIoKS5nZXRMb2dnZXIoKS5lcnJvcgorICAgICAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJzdGFuZGFyZFNlc3Npb24uYmluZGluZ0V2ZW50IiksIHQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gTm90aWZ5IGludGVyZXN0ZWQgYXBwbGljYXRpb24gZXZlbnQgbGlzdGVuZXJzCisgICAgICAgIENvbnRleHQgY29udGV4dCA9IChDb250ZXh0KSBtYW5hZ2VyLmdldENvbnRhaW5lcigpOworICAgICAgICBPYmplY3QgbGlzdGVuZXJzW10gPSBjb250ZXh0LmdldEFwcGxpY2F0aW9uRXZlbnRMaXN0ZW5lcnMoKTsKKyAgICAgICAgaWYgKGxpc3RlbmVycyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKCEobGlzdGVuZXJzW2ldIGluc3RhbmNlb2YgSHR0cFNlc3Npb25BdHRyaWJ1dGVMaXN0ZW5lcikpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBIdHRwU2Vzc2lvbkF0dHJpYnV0ZUxpc3RlbmVyIGxpc3RlbmVyID0KKyAgICAgICAgICAgICAgICAoSHR0cFNlc3Npb25BdHRyaWJ1dGVMaXN0ZW5lcikgbGlzdGVuZXJzW2ldOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAodW5ib3VuZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGZpcmVDb250YWluZXJFdmVudChjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJlZm9yZVNlc3Npb25BdHRyaWJ1dGVSZXBsYWNlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgICAgIGlmIChldmVudCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBldmVudCA9IG5ldyBIdHRwU2Vzc2lvbkJpbmRpbmdFdmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnZXRTZXNzaW9uKCksIG5hbWUsIHVuYm91bmQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLmF0dHJpYnV0ZVJlcGxhY2VkKGV2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgZmlyZUNvbnRhaW5lckV2ZW50KGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWZ0ZXJTZXNzaW9uQXR0cmlidXRlUmVwbGFjZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZpcmVDb250YWluZXJFdmVudChjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJlZm9yZVNlc3Npb25BdHRyaWJ1dGVBZGRlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgICAgIGlmIChldmVudCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBldmVudCA9IG5ldyBIdHRwU2Vzc2lvbkJpbmRpbmdFdmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnZXRTZXNzaW9uKCksIG5hbWUsIHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5hdHRyaWJ1dGVBZGRlZChldmVudCk7CisgICAgICAgICAgICAgICAgICAgIGZpcmVDb250YWluZXJFdmVudChjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFmdGVyU2Vzc2lvbkF0dHJpYnV0ZUFkZGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh1bmJvdW5kICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpcmVDb250YWluZXJFdmVudChjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZnRlclNlc3Npb25BdHRyaWJ1dGVSZXBsYWNlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZmlyZUNvbnRhaW5lckV2ZW50KGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFmdGVyU2Vzc2lvbkF0dHJpYnV0ZUFkZGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1hbmFnZXIuZ2V0Q29udGFpbmVyKCkuZ2V0TG9nZ2VyKCkuZXJyb3IKKyAgICAgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygic3RhbmRhcmRTZXNzaW9uLmF0dHJpYnV0ZUV2ZW50IiksIHQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBIdHRwU2Vzc2lvbiBQcm90ZWN0ZWQgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZWFkIGEgc2VyaWFsaXplZCB2ZXJzaW9uIG9mIHRoaXMgc2Vzc2lvbiBvYmplY3QgZnJvbSB0aGUgc3BlY2lmaWVkCisgICAgICogb2JqZWN0IGlucHV0IHN0cmVhbS4KKyAgICAgKiA8cD4KKyAgICAgKiA8Yj5JTVBMRU1FTlRBVElPTiBOT1RFPC9iPjogIFRoZSByZWZlcmVuY2UgdG8gdGhlIG93bmluZyBNYW5hZ2VyCisgICAgICogaXMgbm90IHJlc3RvcmVkIGJ5IHRoaXMgbWV0aG9kLCBhbmQgbXVzdCBiZSBzZXQgZXhwbGljaXRseS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJlYW0gVGhlIGlucHV0IHN0cmVhbSB0byByZWFkIGZyb20KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBpZiBhbiB1bmtub3duIGNsYXNzIGlzIHNwZWNpZmllZAorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHJlYWRPYmplY3QoT2JqZWN0SW5wdXRTdHJlYW0gc3RyZWFtKQorICAgICAgICB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCisgICAgICAgIC8vIERlc2VyaWFsaXplIHRoZSBzY2FsYXIgaW5zdGFuY2UgdmFyaWFibGVzIChleGNlcHQgTWFuYWdlcikKKyAgICAgICAgYXV0aFR5cGUgPSBudWxsOyAgICAgICAgLy8gVHJhbnNpZW50IG9ubHkKKyAgICAgICAgY3JlYXRpb25UaW1lID0gKChMb25nKSBzdHJlYW0ucmVhZE9iamVjdCgpKS5sb25nVmFsdWUoKTsKKyAgICAgICAgbGFzdEFjY2Vzc2VkVGltZSA9ICgoTG9uZykgc3RyZWFtLnJlYWRPYmplY3QoKSkubG9uZ1ZhbHVlKCk7CisgICAgICAgIG1heEluYWN0aXZlSW50ZXJ2YWwgPSAoKEludGVnZXIpIHN0cmVhbS5yZWFkT2JqZWN0KCkpLmludFZhbHVlKCk7CisgICAgICAgIGlzTmV3ID0gKChCb29sZWFuKSBzdHJlYW0ucmVhZE9iamVjdCgpKS5ib29sZWFuVmFsdWUoKTsKKyAgICAgICAgaXNWYWxpZCA9ICgoQm9vbGVhbikgc3RyZWFtLnJlYWRPYmplY3QoKSkuYm9vbGVhblZhbHVlKCk7CisgICAgICAgIHRoaXNBY2Nlc3NlZFRpbWUgPSAoKExvbmcpIHN0cmVhbS5yZWFkT2JqZWN0KCkpLmxvbmdWYWx1ZSgpOworICAgICAgICBwcmluY2lwYWwgPSBudWxsOyAgICAgICAgLy8gVHJhbnNpZW50IG9ubHkKKyAgICAgICAgLy8gICAgICAgIHNldElkKChTdHJpbmcpIHN0cmVhbS5yZWFkT2JqZWN0KCkpOworICAgICAgICBpZCA9IChTdHJpbmcpIHN0cmVhbS5yZWFkT2JqZWN0KCk7CisgICAgICAgIGlmIChtYW5hZ2VyLmdldENvbnRhaW5lcigpLmdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBtYW5hZ2VyLmdldENvbnRhaW5lcigpLmdldExvZ2dlcigpLmRlYnVnCisgICAgICAgICAgICAgICAgKCJyZWFkT2JqZWN0KCkgbG9hZGluZyBzZXNzaW9uICIgKyBpZCk7CisKKyAgICAgICAgLy8gRGVzZXJpYWxpemUgdGhlIGF0dHJpYnV0ZSBjb3VudCBhbmQgYXR0cmlidXRlIHZhbHVlcworICAgICAgICBpZiAoYXR0cmlidXRlcyA9PSBudWxsKQorICAgICAgICAgICAgYXR0cmlidXRlcyA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgIGludCBuID0gKChJbnRlZ2VyKSBzdHJlYW0ucmVhZE9iamVjdCgpKS5pbnRWYWx1ZSgpOworICAgICAgICBib29sZWFuIGlzVmFsaWRTYXZlID0gaXNWYWxpZDsKKyAgICAgICAgaXNWYWxpZCA9IHRydWU7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIHN0cmVhbS5yZWFkT2JqZWN0KCk7CisgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSAoT2JqZWN0KSBzdHJlYW0ucmVhZE9iamVjdCgpOworICAgICAgICAgICAgaWYgKCh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgJiYgKHZhbHVlLmVxdWFscyhOT1RfU0VSSUFMSVpFRCkpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKG1hbmFnZXIuZ2V0Q29udGFpbmVyKCkuZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBtYW5hZ2VyLmdldENvbnRhaW5lcigpLmdldExvZ2dlcigpLmRlYnVnKCIgIGxvYWRpbmcgYXR0cmlidXRlICciICsgbmFtZSArCisgICAgICAgICAgICAgICAgICAgICInIHdpdGggdmFsdWUgJyIgKyB2YWx1ZSArICInIik7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGF0dHJpYnV0ZXMpIHsKKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLnB1dChuYW1lLCB2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaXNWYWxpZCA9IGlzVmFsaWRTYXZlOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBXcml0ZSBhIHNlcmlhbGl6ZWQgdmVyc2lvbiBvZiB0aGlzIHNlc3Npb24gb2JqZWN0IHRvIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBvYmplY3Qgb3V0cHV0IHN0cmVhbS4KKyAgICAgKiA8cD4KKyAgICAgKiA8Yj5JTVBMRU1FTlRBVElPTiBOT1RFPC9iPjogIFRoZSBvd25pbmcgTWFuYWdlciB3aWxsIG5vdCBiZSBzdG9yZWQKKyAgICAgKiBpbiB0aGUgc2VyaWFsaXplZCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIFNlc3Npb24uICBBZnRlciBjYWxsaW5nCisgICAgICogPGNvZGU+cmVhZE9iamVjdCgpPC9jb2RlPiwgeW91IG11c3Qgc2V0IHRoZSBhc3NvY2lhdGVkIE1hbmFnZXIKKyAgICAgKiBleHBsaWNpdGx5LgorICAgICAqIDxwPgorICAgICAqIDxiPklNUExFTUVOVEFUSU9OIE5PVEU8L2I+OiAgQW55IGF0dHJpYnV0ZSB0aGF0IGlzIG5vdCBTZXJpYWxpemFibGUKKyAgICAgKiB3aWxsIGJlIHVuYm91bmQgZnJvbSB0aGUgc2Vzc2lvbiwgd2l0aCBhcHByb3ByaWF0ZSBhY3Rpb25zIGlmIGl0CisgICAgICogaW1wbGVtZW50cyBIdHRwU2Vzc2lvbkJpbmRpbmdMaXN0ZW5lci4gIElmIHlvdSBkbyBub3Qgd2FudCBhbnkgc3VjaAorICAgICAqIGF0dHJpYnV0ZXMsIGJlIHN1cmUgdGhlIDxjb2RlPmRpc3RyaWJ1dGFibGU8L2NvZGU+IHByb3BlcnR5IG9mIHRoZQorICAgICAqIGFzc29jaWF0ZWQgTWFuYWdlciBpcyBzZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyZWFtIFRoZSBvdXRwdXQgc3RyZWFtIHRvIHdyaXRlIHRvCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZU9iamVjdChPYmplY3RPdXRwdXRTdHJlYW0gc3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIC8vIFdyaXRlIHRoZSBzY2FsYXIgaW5zdGFuY2UgdmFyaWFibGVzIChleGNlcHQgTWFuYWdlcikKKyAgICAgICAgc3RyZWFtLndyaXRlT2JqZWN0KG5ldyBMb25nKGNyZWF0aW9uVGltZSkpOworICAgICAgICBzdHJlYW0ud3JpdGVPYmplY3QobmV3IExvbmcobGFzdEFjY2Vzc2VkVGltZSkpOworICAgICAgICBzdHJlYW0ud3JpdGVPYmplY3QobmV3IEludGVnZXIobWF4SW5hY3RpdmVJbnRlcnZhbCkpOworICAgICAgICBzdHJlYW0ud3JpdGVPYmplY3QobmV3IEJvb2xlYW4oaXNOZXcpKTsKKyAgICAgICAgc3RyZWFtLndyaXRlT2JqZWN0KG5ldyBCb29sZWFuKGlzVmFsaWQpKTsKKyAgICAgICAgc3RyZWFtLndyaXRlT2JqZWN0KG5ldyBMb25nKHRoaXNBY2Nlc3NlZFRpbWUpKTsKKyAgICAgICAgc3RyZWFtLndyaXRlT2JqZWN0KGlkKTsKKyAgICAgICAgaWYgKG1hbmFnZXIuZ2V0Q29udGFpbmVyKCkuZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIG1hbmFnZXIuZ2V0Q29udGFpbmVyKCkuZ2V0TG9nZ2VyKCkuZGVidWcKKyAgICAgICAgICAgICAgICAoIndyaXRlT2JqZWN0KCkgc3RvcmluZyBzZXNzaW9uICIgKyBpZCk7CisKKyAgICAgICAgLy8gQWNjdW11bGF0ZSB0aGUgbmFtZXMgb2Ygc2VyaWFsaXphYmxlIGFuZCBub24tc2VyaWFsaXphYmxlIGF0dHJpYnV0ZXMKKyAgICAgICAgU3RyaW5nIGtleXNbXSA9IGtleXMoKTsKKyAgICAgICAgQXJyYXlMaXN0IHNhdmVOYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgQXJyYXlMaXN0IHNhdmVWYWx1ZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gbnVsbDsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAoYXR0cmlidXRlcykgeworICAgICAgICAgICAgICAgIHZhbHVlID0gYXR0cmlidXRlcy5nZXQoa2V5c1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCAodmFsdWUgaW5zdGFuY2VvZiBTZXJpYWxpemFibGUpIAorICAgICAgICAgICAgICAgICAgICAmJiAoIWV4Y2x1ZGUoa2V5c1tpXSkgKSkgeworICAgICAgICAgICAgICAgIHNhdmVOYW1lcy5hZGQoa2V5c1tpXSk7CisgICAgICAgICAgICAgICAgc2F2ZVZhbHVlcy5hZGQodmFsdWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZW1vdmVBdHRyaWJ1dGUoa2V5c1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBTZXJpYWxpemUgdGhlIGF0dHJpYnV0ZSBjb3VudCBhbmQgdGhlIFNlcmlhbGl6YWJsZSBhdHRyaWJ1dGVzCisgICAgICAgIGludCBuID0gc2F2ZU5hbWVzLnNpemUoKTsKKyAgICAgICAgc3RyZWFtLndyaXRlT2JqZWN0KG5ldyBJbnRlZ2VyKG4pKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgIHN0cmVhbS53cml0ZU9iamVjdCgoU3RyaW5nKSBzYXZlTmFtZXMuZ2V0KGkpKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc3RyZWFtLndyaXRlT2JqZWN0KHNhdmVWYWx1ZXMuZ2V0KGkpKTsKKyAgICAgICAgICAgICAgICBpZiAobWFuYWdlci5nZXRDb250YWluZXIoKS5nZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBtYW5hZ2VyLmdldENvbnRhaW5lcigpLmdldExvZ2dlcigpLmRlYnVnCisgICAgICAgICAgICAgICAgICAgICAgICAoIiAgc3RvcmluZyBhdHRyaWJ1dGUgJyIgKyBzYXZlTmFtZXMuZ2V0KGkpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICInIHdpdGggdmFsdWUgJyIgKyBzYXZlVmFsdWVzLmdldChpKSArICInIik7CisgICAgICAgICAgICB9IGNhdGNoIChOb3RTZXJpYWxpemFibGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIG1hbmFnZXIuZ2V0Q29udGFpbmVyKCkuZ2V0TG9nZ2VyKCkud2FybgorICAgICAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJzdGFuZGFyZFNlc3Npb24ubm90U2VyaWFsaXphYmxlIiwKKyAgICAgICAgICAgICAgICAgICAgIHNhdmVOYW1lcy5nZXQoaSksIGlkKSwgZSk7CisgICAgICAgICAgICAgICAgc3RyZWFtLndyaXRlT2JqZWN0KE5PVF9TRVJJQUxJWkVEKTsKKyAgICAgICAgICAgICAgICBpZiAobWFuYWdlci5nZXRDb250YWluZXIoKS5nZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBtYW5hZ2VyLmdldENvbnRhaW5lcigpLmdldExvZ2dlcigpLmRlYnVnCisgICAgICAgICAgICAgICAgICAgICAgICgiICBzdG9yaW5nIGF0dHJpYnV0ZSAnIiArIHNhdmVOYW1lcy5nZXQoaSkgKworICAgICAgICAgICAgICAgICAgICAgICAgIicgd2l0aCB2YWx1ZSBOT1RfU0VSSUFMSVpFRCIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEV4Y2x1ZGUgYXR0cmlidXRlIHRoYXQgY2Fubm90IGJlIHNlcmlhbGl6ZWQuCisgICAgICogQHBhcmFtIG5hbWUgdGhlIGF0dHJpYnV0ZSdzIG5hbWUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBleGNsdWRlKFN0cmluZyBuYW1lKXsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4Y2x1ZGVkQXR0cmlidXRlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZShleGNsdWRlZEF0dHJpYnV0ZXNbaV0pKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworCisgICAgcHJvdGVjdGVkIHZvaWQgZXZhbHVhdGVJZlZhbGlkKCkgeworICAgICAgICAvKgorICAgICAqIElmIHRoaXMgc2Vzc2lvbiBoYXMgZXhwaXJlZCBvciBpcyBpbiB0aGUgcHJvY2VzcyBvZiBleHBpcmluZyBvcgorICAgICAqIHdpbGwgbmV2ZXIgZXhwaXJlLCByZXR1cm4KKyAgICAgKi8KKyAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQgfHwgZXhwaXJpbmcgfHwgbWF4SW5hY3RpdmVJbnRlcnZhbCA8IDApCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgaXNWYWxpZCgpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvdGVjdGVkIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogRmlyZSBjb250YWluZXIgZXZlbnRzIGlmIHRoZSBDb250ZXh0IGltcGxlbWVudGF0aW9uIGlzIHRoZQorICAgICAqIDxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZENvbnRleHQ8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCBmb3Igd2hpY2ggdG8gZmlyZSBldmVudHMKKyAgICAgKiBAcGFyYW0gdHlwZSBFdmVudCB0eXBlCisgICAgICogQHBhcmFtIGRhdGEgRXZlbnQgZGF0YQorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gb2NjdXJyZWQgZHVyaW5nIGV2ZW50IGZpcmluZworICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGZpcmVDb250YWluZXJFdmVudChDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdHlwZSwgT2JqZWN0IGRhdGEpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIGlmICghIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZENvbnRleHQiLmVxdWFscworICAgICAgICAgICAgKGNvbnRleHQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICByZXR1cm47IC8vIENvbnRhaW5lciBldmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQKKyAgICAgICAgfQorICAgICAgICAvLyBOT1RFOiAgUmFjZSBjb25kaXRpb24gaXMgaGFybWxlc3MsIHNvIGRvIG5vdCBzeW5jaHJvbml6ZQorICAgICAgICBpZiAoY29udGFpbmVyRXZlbnRNZXRob2QgPT0gbnVsbCkgeworICAgICAgICAgICAgY29udGFpbmVyRXZlbnRNZXRob2QgPQorICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0Q2xhc3MoKS5nZXRNZXRob2QoImZpcmVDb250YWluZXJFdmVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJFdmVudFR5cGVzKTsKKyAgICAgICAgfQorICAgICAgICBPYmplY3QgY29udGFpbmVyRXZlbnRQYXJhbXNbXSA9IG5ldyBPYmplY3RbMl07CisgICAgICAgIGNvbnRhaW5lckV2ZW50UGFyYW1zWzBdID0gdHlwZTsKKyAgICAgICAgY29udGFpbmVyRXZlbnRQYXJhbXNbMV0gPSBkYXRhOworICAgICAgICBjb250YWluZXJFdmVudE1ldGhvZC5pbnZva2UoY29udGV4dCwgY29udGFpbmVyRXZlbnRQYXJhbXMpOworCisgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworCisgICAgLyoqCisgICAgICogTm90aWZ5IGFsbCBzZXNzaW9uIGV2ZW50IGxpc3RlbmVycyB0aGF0IGEgcGFydGljdWxhciBldmVudCBoYXMKKyAgICAgKiBvY2N1cnJlZCBmb3IgdGhpcyBTZXNzaW9uLiAgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcGVyZm9ybXMKKyAgICAgKiB0aGlzIG5vdGlmaWNhdGlvbiBzeW5jaHJvbm91c2x5IHVzaW5nIHRoZSBjYWxsaW5nIHRocmVhZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0eXBlIEV2ZW50IHR5cGUKKyAgICAgKiBAcGFyYW0gZGF0YSBFdmVudCBkYXRhCisgICAgICovCisgICAgcHVibGljIHZvaWQgZmlyZVNlc3Npb25FdmVudChTdHJpbmcgdHlwZSwgT2JqZWN0IGRhdGEpIHsKKyAgICAgICAgaWYgKGxpc3RlbmVycy5zaXplKCkgPCAxKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBTZXNzaW9uRXZlbnQgZXZlbnQgPSBuZXcgU2Vzc2lvbkV2ZW50KHRoaXMsIHR5cGUsIGRhdGEpOworICAgICAgICBTZXNzaW9uTGlzdGVuZXIgbGlzdFtdID0gbmV3IFNlc3Npb25MaXN0ZW5lclswXTsKKyAgICAgICAgc3luY2hyb25pemVkIChsaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgIGxpc3QgPSAoU2Vzc2lvbkxpc3RlbmVyW10pIGxpc3RlbmVycy50b0FycmF5KGxpc3QpOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKXsKKyAgICAgICAgICAgICgoU2Vzc2lvbkxpc3RlbmVyKSBsaXN0W2ldKS5zZXNzaW9uRXZlbnQoZXZlbnQpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbmFtZXMgb2YgYWxsIGN1cnJlbnRseSBkZWZpbmVkIHNlc3Npb24gYXR0cmlidXRlcworICAgICAqIGFzIGFuIGFycmF5IG9mIFN0cmluZ3MuICBJZiB0aGVyZSBhcmUgbm8gZGVmaW5lZCBhdHRyaWJ1dGVzLCBhCisgICAgICogemVyby1sZW5ndGggYXJyYXkgaXMgcmV0dXJuZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZ1tdIGtleXMoKSB7CisKKyAgICAgICAgcmV0dXJuICgoU3RyaW5nW10pIGF0dHJpYnV0ZXMua2V5U2V0KCkudG9BcnJheShFTVBUWV9BUlJBWSkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgdGhlIG9iamVjdCBib3VuZCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBmcm9tIHRoaXMgc2Vzc2lvbi4gIElmCisgICAgICogdGhlIHNlc3Npb24gZG9lcyBub3QgaGF2ZSBhbiBvYmplY3QgYm91bmQgd2l0aCB0aGlzIG5hbWUsIHRoaXMgbWV0aG9kCisgICAgICogZG9lcyBub3RoaW5nLgorICAgICAqIDxwPgorICAgICAqIEFmdGVyIHRoaXMgbWV0aG9kIGV4ZWN1dGVzLCBhbmQgaWYgdGhlIG9iamVjdCBpbXBsZW1lbnRzCisgICAgICogPGNvZGU+SHR0cFNlc3Npb25CaW5kaW5nTGlzdGVuZXI8L2NvZGU+LCB0aGUgY29udGFpbmVyIGNhbGxzCisgICAgICogPGNvZGU+dmFsdWVVbmJvdW5kKCk8L2NvZGU+IG9uIHRoZSBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBvYmplY3QgdG8gcmVtb3ZlIGZyb20gdGhpcyBzZXNzaW9uLgorICAgICAqIEBwYXJhbSBub3RpZnkgU2hvdWxkIHdlIG5vdGlmeSBpbnRlcmVzdGVkIGxpc3RlbmVycyB0aGF0IHRoaXMKKyAgICAgKiAgYXR0cmlidXRlIGlzIGJlaW5nIHJlbW92ZWQ/CisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQXR0cmlidXRlSW50ZXJuYWwoU3RyaW5nIG5hbWUsIGJvb2xlYW4gbm90aWZ5KSB7CisKKyAgICAgICAgLy8gUmVtb3ZlIHRoaXMgYXR0cmlidXRlIGZyb20gb3VyIGNvbGxlY3Rpb24KKyAgICAgICAgT2JqZWN0IHZhbHVlID0gbnVsbDsKKyAgICAgICAgc3luY2hyb25pemVkIChhdHRyaWJ1dGVzKSB7CisgICAgICAgICAgICB2YWx1ZSA9IGF0dHJpYnV0ZXMucmVtb3ZlKG5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gRG8gd2UgbmVlZCB0byBkbyB2YWx1ZVVuYm91bmQoKSBhbmQgYXR0cmlidXRlUmVtb3ZlZCgpIG5vdGlmaWNhdGlvbj8KKyAgICAgICAgaWYgKCFub3RpZnkgfHwgKHZhbHVlID09IG51bGwpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBDYWxsIHRoZSB2YWx1ZVVuYm91bmQoKSBtZXRob2QgaWYgbmVjZXNzYXJ5CisgICAgICAgIEh0dHBTZXNzaW9uQmluZGluZ0V2ZW50IGV2ZW50ID0gbnVsbDsKKyAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgSHR0cFNlc3Npb25CaW5kaW5nTGlzdGVuZXIpIHsKKyAgICAgICAgICAgIGV2ZW50ID0gbmV3IEh0dHBTZXNzaW9uQmluZGluZ0V2ZW50KGdldFNlc3Npb24oKSwgbmFtZSwgdmFsdWUpOworICAgICAgICAgICAgKChIdHRwU2Vzc2lvbkJpbmRpbmdMaXN0ZW5lcikgdmFsdWUpLnZhbHVlVW5ib3VuZChldmVudCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBOb3RpZnkgaW50ZXJlc3RlZCBhcHBsaWNhdGlvbiBldmVudCBsaXN0ZW5lcnMKKyAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gKENvbnRleHQpIG1hbmFnZXIuZ2V0Q29udGFpbmVyKCk7CisgICAgICAgIE9iamVjdCBsaXN0ZW5lcnNbXSA9IGNvbnRleHQuZ2V0QXBwbGljYXRpb25FdmVudExpc3RlbmVycygpOworICAgICAgICBpZiAobGlzdGVuZXJzID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoIShsaXN0ZW5lcnNbaV0gaW5zdGFuY2VvZiBIdHRwU2Vzc2lvbkF0dHJpYnV0ZUxpc3RlbmVyKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIEh0dHBTZXNzaW9uQXR0cmlidXRlTGlzdGVuZXIgbGlzdGVuZXIgPQorICAgICAgICAgICAgICAgIChIdHRwU2Vzc2lvbkF0dHJpYnV0ZUxpc3RlbmVyKSBsaXN0ZW5lcnNbaV07CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGZpcmVDb250YWluZXJFdmVudChjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmVmb3JlU2Vzc2lvbkF0dHJpYnV0ZVJlbW92ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgaWYgKGV2ZW50ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZXZlbnQgPSBuZXcgSHR0cFNlc3Npb25CaW5kaW5nRXZlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgIChnZXRTZXNzaW9uKCksIG5hbWUsIHZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbGlzdGVuZXIuYXR0cmlidXRlUmVtb3ZlZChldmVudCk7CisgICAgICAgICAgICAgICAgZmlyZUNvbnRhaW5lckV2ZW50KGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZnRlclNlc3Npb25BdHRyaWJ1dGVSZW1vdmVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIpOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBmaXJlQ29udGFpbmVyRXZlbnQoY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZnRlclNlc3Npb25BdHRyaWJ1dGVSZW1vdmVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1hbmFnZXIuZ2V0Q29udGFpbmVyKCkuZ2V0TG9nZ2VyKCkuZXJyb3IKKyAgICAgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygic3RhbmRhcmRTZXNzaW9uLmF0dHJpYnV0ZUV2ZW50IiksIHQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKworfQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm90ZWN0ZWQgQ2xhc3MKKworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgYSBkdW1teSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgPGNvZGU+SHR0cFNlc3Npb25Db250ZXh0PC9jb2RlPgorICogaW50ZXJmYWNlLCB0byBjb25mb3JtIHRvIHRoZSByZXF1aXJlbWVudCB0aGF0IHN1Y2ggYW4gb2JqZWN0IGJlIHJldHVybmVkCisgKiB3aGVuIDxjb2RlPkh0dHBTZXNzaW9uLmdldFNlc3Npb25Db250ZXh0KCk8L2NvZGU+IGlzIGNhbGxlZC4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqCisgKiBAZGVwcmVjYXRlZCBBcyBvZiBKYXZhIFNlcnZsZXQgQVBJIDIuMSB3aXRoIG5vIHJlcGxhY2VtZW50LiAgVGhlCisgKiAgaW50ZXJmYWNlIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uIG9mIHRoaXMgQVBJLgorICovCisKK2ZpbmFsIGNsYXNzIFN0YW5kYXJkU2Vzc2lvbkNvbnRleHQgaW1wbGVtZW50cyBIdHRwU2Vzc2lvbkNvbnRleHQgeworCisKKyAgICBwcm90ZWN0ZWQgSGFzaE1hcCBkdW1teSA9IG5ldyBIYXNoTWFwKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNlc3Npb24gaWRlbnRpZmllcnMgb2YgYWxsIHNlc3Npb25zIGRlZmluZWQKKyAgICAgKiB3aXRoaW4gdGhpcyBjb250ZXh0LgorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQgQXMgb2YgSmF2YSBTZXJ2bGV0IEFQSSAyLjEgd2l0aCBubyByZXBsYWNlbWVudC4KKyAgICAgKiAgVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gYW4gZW1wdHkgPGNvZGU+RW51bWVyYXRpb248L2NvZGU+CisgICAgICogIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgdmVyc2lvbiBvZiB0aGUgQVBJLgorICAgICAqLworICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRJZHMoKSB7CisKKyAgICAgICAgcmV0dXJuIChuZXcgRW51bWVyYXRvcihkdW1teSkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIDxjb2RlPkh0dHBTZXNzaW9uPC9jb2RlPiBhc3NvY2lhdGVkIHdpdGggdGhlCisgICAgICogc3BlY2lmaWVkIHNlc3Npb24gaWRlbnRpZmllci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpZCBTZXNzaW9uIGlkZW50aWZpZXIgZm9yIHdoaWNoIHRvIGxvb2sgdXAgYSBzZXNzaW9uCisgICAgICoKKyAgICAgKiBAZGVwcmVjYXRlZCBBcyBvZiBKYXZhIFNlcnZsZXQgQVBJIDIuMSB3aXRoIG5vIHJlcGxhY2VtZW50LgorICAgICAqICBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiBudWxsIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYQorICAgICAqICBmdXR1cmUgdmVyc2lvbiBvZiB0aGUgQVBJLgorICAgICAqLworICAgIHB1YmxpYyBIdHRwU2Vzc2lvbiBnZXRTZXNzaW9uKFN0cmluZyBpZCkgeworCisgICAgICAgIHJldHVybiAobnVsbCk7CisKKyAgICB9CisKKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc2Vzc2lvbi9TdGFuZGFyZFNlc3Npb25GYWNhZGUuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zZXNzaW9uL1N0YW5kYXJkU2Vzc2lvbkZhY2FkZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlMzZlMjMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc2Vzc2lvbi9TdGFuZGFyZFNlc3Npb25GYWNhZGUuamF2YQpAQCAtMCwwICsxLDE1OCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5zZXNzaW9uOworCisKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb25Db250ZXh0OworCisKKy8qKgorICogRmFjYWRlIGZvciB0aGUgU3RhbmRhcmRTZXNzaW9uIG9iamVjdC4KKyAqCisgKiBAYXV0aG9yIFJlbXkgTWF1Y2hlcmF0CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBTdGFuZGFyZFNlc3Npb25GYWNhZGUKKyAgICBpbXBsZW1lbnRzIEh0dHBTZXNzaW9uIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBzZXNzaW9uIGZhY2FkZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RhbmRhcmRTZXNzaW9uRmFjYWRlKFN0YW5kYXJkU2Vzc2lvbiBzZXNzaW9uKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIHRoaXMuc2Vzc2lvbiA9IChIdHRwU2Vzc2lvbikgc2Vzc2lvbjsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBzZXNzaW9uIGZhY2FkZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RhbmRhcmRTZXNzaW9uRmFjYWRlKEh0dHBTZXNzaW9uIHNlc3Npb24pIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgdGhpcy5zZXNzaW9uID0gc2Vzc2lvbjsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBXcmFwcGVkIHNlc3Npb24gb2JqZWN0LgorICAgICAqLworICAgIHByaXZhdGUgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IG51bGw7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSHR0cFNlc3Npb24gTWV0aG9kcworCisKKyAgICBwdWJsaWMgbG9uZyBnZXRDcmVhdGlvblRpbWUoKSB7CisgICAgICAgIHJldHVybiBzZXNzaW9uLmdldENyZWF0aW9uVGltZSgpOworICAgIH0KKworCisgICAgcHVibGljIFN0cmluZyBnZXRJZCgpIHsKKyAgICAgICAgcmV0dXJuIHNlc3Npb24uZ2V0SWQoKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBsb25nIGdldExhc3RBY2Nlc3NlZFRpbWUoKSB7CisgICAgICAgIHJldHVybiBzZXNzaW9uLmdldExhc3RBY2Nlc3NlZFRpbWUoKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBTZXJ2bGV0Q29udGV4dCBnZXRTZXJ2bGV0Q29udGV4dCgpIHsKKyAgICAgICAgLy8gRklYTUUgOiBGYWNhZGUgdGhpcyBvYmplY3QgPworICAgICAgICByZXR1cm4gc2Vzc2lvbi5nZXRTZXJ2bGV0Q29udGV4dCgpOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgc2V0TWF4SW5hY3RpdmVJbnRlcnZhbChpbnQgaW50ZXJ2YWwpIHsKKyAgICAgICAgc2Vzc2lvbi5zZXRNYXhJbmFjdGl2ZUludGVydmFsKGludGVydmFsKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBpbnQgZ2V0TWF4SW5hY3RpdmVJbnRlcnZhbCgpIHsKKyAgICAgICAgcmV0dXJuIHNlc3Npb24uZ2V0TWF4SW5hY3RpdmVJbnRlcnZhbCgpOworICAgIH0KKworCisgICAgcHVibGljIEh0dHBTZXNzaW9uQ29udGV4dCBnZXRTZXNzaW9uQ29udGV4dCgpIHsKKyAgICAgICAgcmV0dXJuIHNlc3Npb24uZ2V0U2Vzc2lvbkNvbnRleHQoKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBPYmplY3QgZ2V0QXR0cmlidXRlKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHJldHVybiBzZXNzaW9uLmdldEF0dHJpYnV0ZShuYW1lKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIHNlc3Npb24uZ2V0QXR0cmlidXRlKG5hbWUpOworICAgIH0KKworCisgICAgcHVibGljIEVudW1lcmF0aW9uIGdldEF0dHJpYnV0ZU5hbWVzKCkgeworICAgICAgICByZXR1cm4gc2Vzc2lvbi5nZXRBdHRyaWJ1dGVOYW1lcygpOworICAgIH0KKworCisgICAgcHVibGljIFN0cmluZ1tdIGdldFZhbHVlTmFtZXMoKSB7CisgICAgICAgIHJldHVybiBzZXNzaW9uLmdldFZhbHVlTmFtZXMoKTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIHNlc3Npb24uc2V0QXR0cmlidXRlKG5hbWUsIHZhbHVlKTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHB1dFZhbHVlKFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgc2Vzc2lvbi5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgcmVtb3ZlQXR0cmlidXRlKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHNlc3Npb24ucmVtb3ZlQXR0cmlidXRlKG5hbWUpOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgcmVtb3ZlVmFsdWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc2Vzc2lvbi5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBpbnZhbGlkYXRlKCkgeworICAgICAgICBzZXNzaW9uLmludmFsaWRhdGUoKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBib29sZWFuIGlzTmV3KCkgeworICAgICAgICByZXR1cm4gc2Vzc2lvbi5pc05ldygpOworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc2Vzc2lvbi9TdG9yZUJhc2UuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zZXNzaW9uL1N0b3JlQmFzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzZGViMjAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc2Vzc2lvbi9TdG9yZUJhc2UuamF2YQpAQCAtMCwwICsxLDI1OSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc2Vzc2lvbjsKKworaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKK2ltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlU3VwcG9ydDsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLk1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5TdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuTGlmZWN5Y2xlU3VwcG9ydDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuU3RyaW5nTWFuYWdlcjsKKworLyoqCisgKiBBYnN0cmFjdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgU3RvcmUgaW50ZXJmYWNlIHRvCisgKiBzdXBwb3J0IG1vc3Qgb2YgdGhlIGZ1bmN0aW9uYWxpdHkgcmVxdWlyZWQgYnkgYSBTdG9yZS4KKyAqCisgKiBAYXV0aG9yIEJpcCBUaGVsaW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQsICREYXRlJAorICovCisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBTdG9yZUJhc2UKKyAgICBpbXBsZW1lbnRzIExpZmVjeWNsZSwgU3RvcmUgeworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBpbmZvID0gIlN0b3JlQmFzZS8xLjAiOworCisgICAgLyoqCisgICAgICogTmFtZSB0byByZWdpc3RlciBmb3IgdGhpcyBTdG9yZSwgdXNlZCBmb3IgbG9nZ2luZy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBzdG9yZU5hbWUgPSAiU3RvcmVCYXNlIjsKKworICAgIC8qKgorICAgICAqIEhhcyB0aGlzIGNvbXBvbmVudCBiZWVuIHN0YXJ0ZWQgeWV0PworICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIHN0YXJ0ZWQgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIFRoZSBsaWZlY3ljbGUgZXZlbnQgc3VwcG9ydCBmb3IgdGhpcyBjb21wb25lbnQuCisgICAgICovCisgICAgcHJvdGVjdGVkIExpZmVjeWNsZVN1cHBvcnQgbGlmZWN5Y2xlID0gbmV3IExpZmVjeWNsZVN1cHBvcnQodGhpcyk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgcHJvcGVydHkgY2hhbmdlIHN1cHBvcnQgZm9yIHRoaXMgY29tcG9uZW50LgorICAgICAqLworICAgIHByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZVN1cHBvcnQgc3VwcG9ydCA9IG5ldyBQcm9wZXJ0eUNoYW5nZVN1cHBvcnQodGhpcyk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgc3RyaW5nIG1hbmFnZXIgZm9yIHRoaXMgcGFja2FnZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nTWFuYWdlciBzbSA9IFN0cmluZ01hbmFnZXIuZ2V0TWFuYWdlcihDb25zdGFudHMuUGFja2FnZSk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgTWFuYWdlciB3aXRoIHdoaWNoIHRoaXMgSkRCQ1N0b3JlIGlzIGFzc29jaWF0ZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIE1hbmFnZXIgbWFuYWdlcjsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBpbmZvIGZvciB0aGlzIFN0b3JlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5mbygpIHsKKyAgICAgICAgcmV0dXJuKGluZm8pOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBuYW1lIGZvciB0aGlzIFN0b3JlLCB1c2VkIGZvciBsb2dnaW5nLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RvcmVOYW1lKCkgeworICAgICAgICByZXR1cm4oc3RvcmVOYW1lKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgTWFuYWdlciB3aXRoIHdoaWNoIHRoaXMgU3RvcmUgaXMgYXNzb2NpYXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYW5hZ2VyIFRoZSBuZXdseSBhc3NvY2lhdGVkIE1hbmFnZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNYW5hZ2VyKE1hbmFnZXIgbWFuYWdlcikgeworICAgICAgICBNYW5hZ2VyIG9sZE1hbmFnZXIgPSB0aGlzLm1hbmFnZXI7CisgICAgICAgIHRoaXMubWFuYWdlciA9IG1hbmFnZXI7CisgICAgICAgIHN1cHBvcnQuZmlyZVByb3BlcnR5Q2hhbmdlKCJtYW5hZ2VyIiwgb2xkTWFuYWdlciwgdGhpcy5tYW5hZ2VyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIE1hbmFnZXIgd2l0aCB3aGljaCB0aGUgU3RvcmUgaXMgYXNzb2NpYXRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWFuYWdlciBnZXRNYW5hZ2VyKCkgeworICAgICAgICByZXR1cm4odGhpcy5tYW5hZ2VyKTsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisgICAgLyoqCisgICAgICogQWRkIGEgbGlmZWN5Y2xlIGV2ZW50IGxpc3RlbmVyIHRvIHRoaXMgY29tcG9uZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciB0byBhZGQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRMaWZlY3ljbGVMaXN0ZW5lcihMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBsaWZlY3ljbGUuYWRkTGlmZWN5Y2xlTGlzdGVuZXIobGlzdGVuZXIpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBsaWZlY3ljbGUgbGlzdGVuZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGxpZmVjeWNsZS4gSWYgdGhpcyAKKyAgICAgKiBMaWZlY3ljbGUgaGFzIG5vIGxpc3RlbmVycyByZWdpc3RlcmVkLCBhIHplcm8tbGVuZ3RoIGFycmF5IGlzIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBMaWZlY3ljbGVMaXN0ZW5lcltdIGZpbmRMaWZlY3ljbGVMaXN0ZW5lcnMoKSB7CisKKyAgICAgICAgcmV0dXJuIGxpZmVjeWNsZS5maW5kTGlmZWN5Y2xlTGlzdGVuZXJzKCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhIGxpZmVjeWNsZSBldmVudCBsaXN0ZW5lciBmcm9tIHRoaXMgY29tcG9uZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciB0byBhZGQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVMaWZlY3ljbGVMaXN0ZW5lcihMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBsaWZlY3ljbGUucmVtb3ZlTGlmZWN5Y2xlTGlzdGVuZXIobGlzdGVuZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lciB0byB0aGlzIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBhIHZhbHVlIG9mIHR5cGUgJ1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXInCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIHN1cHBvcnQuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlIGEgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyIGZyb20gdGhpcyBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRvIHJlbW92ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBzdXBwb3J0LnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm90ZWN0ZWQgTWV0aG9kcworCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IG91ciBiYWNrZ3JvdW5kIHJlYXBlciB0aHJlYWQgdG8gY2hlY2sgaWYgU2Vzc2lvbnMKKyAgICAgKiBzYXZlZCBpbiBvdXIgc3RvcmUgYXJlIHN1YmplY3Qgb2YgYmVpbmcgZXhwaXJlZC4gSWYgc28gZXhwaXJlCisgICAgICogdGhlIFNlc3Npb24gYW5kIHJlbW92ZSBpdCBmcm9tIHRoZSBTdG9yZS4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NFeHBpcmVzKCkgeworICAgICAgICBsb25nIHRpbWVOb3cgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgU3RyaW5nW10ga2V5cyA9IG51bGw7CisKKyAgICAgICAgaWYoIXN0YXJ0ZWQpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBrZXlzID0ga2V5cygpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBtYW5hZ2VyLmdldENvbnRhaW5lcigpLmdldExvZ2dlcigpLmVycm9yKCJFcnJvciBnZXR0aW5nIGtleXMiLCBlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBTdGFuZGFyZFNlc3Npb24gc2Vzc2lvbiA9IChTdGFuZGFyZFNlc3Npb24pIGxvYWQoa2V5c1tpXSk7CisgICAgICAgICAgICAgICAgaWYgKHNlc3Npb24gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHNlc3Npb24uaXNWYWxpZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoICggKFBlcnNpc3RlbnRNYW5hZ2VyQmFzZSkgbWFuYWdlcikuaXNMb2FkZWQoIGtleXNbaV0gKSkgeworICAgICAgICAgICAgICAgICAgICAvLyByZWN5Y2xlIG9sZCBiYWNrdXAgc2Vzc2lvbgorICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLnJlY3ljbGUoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBleHBpcmUgc3dhcHBlZCBvdXQgc2Vzc2lvbgorICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmV4cGlyZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZW1vdmUoc2Vzc2lvbi5nZXRJZCgpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgbWFuYWdlci5nZXRDb250YWluZXIoKS5nZXRMb2dnZXIoKS5lcnJvcigiU2Vzc2lvbjogIitrZXlzW2ldKyI7ICIsIGUpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHJlbW92ZShrZXlzW2ldKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlMikgeworICAgICAgICAgICAgICAgICAgICBtYW5hZ2VyLmdldENvbnRhaW5lcigpLmdldExvZ2dlcigpLmVycm9yKCJFcnJvciByZW1vdmluZyBrZXkiLCBlMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVGhyZWFkIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUHJlcGFyZSBmb3IgdGhlIGJlZ2lubmluZyBvZiBhY3RpdmUgdXNlIG9mIHRoZSBwdWJsaWMgbWV0aG9kcyBvZiB0aGlzCisgICAgICogY29tcG9uZW50LiAgVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBhZnRlciA8Y29kZT5jb25maWd1cmUoKTwvY29kZT4sCisgICAgICogYW5kIGJlZm9yZSBhbnkgb2YgdGhlIHB1YmxpYyBtZXRob2RzIG9mIHRoZSBjb21wb25lbnQgYXJlIHV0aWxpemVkLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBMaWZlY3ljbGVFeGNlcHRpb24gaWYgdGhpcyBjb21wb25lbnQgZGV0ZWN0cyBhIGZhdGFsIGVycm9yCisgICAgICogIHRoYXQgcHJldmVudHMgdGhpcyBjb21wb25lbnQgZnJvbSBiZWluZyB1c2VkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnQoKSB0aHJvd3MgTGlmZWN5Y2xlRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gVmFsaWRhdGUgYW5kIHVwZGF0ZSBvdXIgY3VycmVudCBjb21wb25lbnQgc3RhdGUKKyAgICAgICAgaWYgKHN0YXJ0ZWQpCisgICAgICAgICAgICB0aHJvdyBuZXcgTGlmZWN5Y2xlRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZyhnZXRTdG9yZU5hbWUoKSsiLmFscmVhZHlTdGFydGVkIikpOworICAgICAgICBsaWZlY3ljbGUuZmlyZUxpZmVjeWNsZUV2ZW50KFNUQVJUX0VWRU5ULCBudWxsKTsKKyAgICAgICAgc3RhcnRlZCA9IHRydWU7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdyYWNlZnVsbHkgdGVybWluYXRlIHRoZSBhY3RpdmUgdXNlIG9mIHRoZSBwdWJsaWMgbWV0aG9kcyBvZiB0aGlzCisgICAgICogY29tcG9uZW50LiAgVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHRoZSBsYXN0IG9uZSBjYWxsZWQgb24gYSBnaXZlbgorICAgICAqIGluc3RhbmNlIG9mIHRoaXMgY29tcG9uZW50LgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBMaWZlY3ljbGVFeGNlcHRpb24gaWYgdGhpcyBjb21wb25lbnQgZGV0ZWN0cyBhIGZhdGFsIGVycm9yCisgICAgICogIHRoYXQgbmVlZHMgdG8gYmUgcmVwb3J0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdG9wKCkgdGhyb3dzIExpZmVjeWNsZUV4Y2VwdGlvbiB7CisgICAgICAgIC8vIFZhbGlkYXRlIGFuZCB1cGRhdGUgb3VyIGN1cnJlbnQgY29tcG9uZW50IHN0YXRlCisgICAgICAgIGlmICghc3RhcnRlZCkKKyAgICAgICAgICAgIHRocm93IG5ldyBMaWZlY3ljbGVFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKGdldFN0b3JlTmFtZSgpKyIubm90U3RhcnRlZCIpKTsKKyAgICAgICAgbGlmZWN5Y2xlLmZpcmVMaWZlY3ljbGVFdmVudChTVE9QX0VWRU5ULCBudWxsKTsKKyAgICAgICAgc3RhcnRlZCA9IGZhbHNlOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zZXNzaW9uL21iZWFucy1kZXNjcmlwdG9ycy54bWwgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc2Vzc2lvbi9tYmVhbnMtZGVzY3JpcHRvcnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiZDI1OTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc2Vzc2lvbi9tYmVhbnMtZGVzY3JpcHRvcnMueG1sCkBAIC0wLDAgKzEsMjc1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzxtYmVhbnMtZGVzY3JpcHRvcnM+CisKKyAgPG1iZWFuICAgICAgICAgbmFtZT0iU3RhbmRhcmRNYW5hZ2VyIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJTdGFuZGFyZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgTWFuYWdlciBpbnRlcmZhY2UiCisgICAgICAgICAgICAgICBkb21haW49IkNhdGFsaW5hIgorICAgICAgICAgICAgICAgIGdyb3VwPSJNYW5hZ2VyIgorICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnNlc3Npb24uU3RhbmRhcmRNYW5hZ2VyIj4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJhbGdvcml0aG0iCisgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBtZXNzYWdlIGRpZ2VzdCBhbGdvcml0aG0gdG8gYmUgdXNlZCB3aGVuIGdlbmVyYXRpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbiBpZGVudGlmaWVycyIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorCisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0icmFuZG9tRmlsZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iRmlsZSBzb3VyY2Ugb2YgcmFuZG9tIC0gL2Rldi91cmFuZG9tIG9yIGEgcGlwZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImNsYXNzTmFtZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iRnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIG1hbmFnZWQgb2JqZWN0IgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImRpc3RyaWJ1dGFibGUiCisgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBkaXN0cmlidXRhYmxlIGZsYWcgZm9yIFNlc3Npb25zIGNyZWF0ZWQgYnkgdGhpcworICAgICAgICAgICAgICAgICAgICAgICBNYW5hZ2VyIgorICAgICAgICAgICAgICAgICB0eXBlPSJib29sZWFuIi8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0iZW50cm9weSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQSBTdHJpbmcgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyIHVzZWQgdG8gaW5jcmVhc2UgdGhlCisgICAgICAgICAgICAgICAgICAgICAgIGVudHJvcHkgb2YgdGhlIGluaXRpYWxpemF0aW9uIG9mIG91ciByYW5kb20gbnVtYmVyCisgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRvciIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9Im1heEFjdGl2ZVNlc3Npb25zIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgbWF4aW11bSBudW1iZXIgb2YgYWN0aXZlIFNlc3Npb25zIGFsbG93ZWQsIG9yIC0xCisgICAgICAgICAgICAgICAgICAgICAgIGZvciBubyBsaW1pdCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iaW50Ii8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0ibWF4SW5hY3RpdmVJbnRlcnZhbCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIGRlZmF1bHQgbWF4aW11bSBpbmFjdGl2ZSBpbnRlcnZhbCBmb3IgU2Vzc2lvbnMKKyAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlZCBieSB0aGlzIE1hbmFnZXIiCisgICAgICAgICAgICAgICAgIHR5cGU9ImludCIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InNlc3Npb25JZExlbmd0aCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIHNlc3Npb24gaWQgbGVuZ3RoIChpbiBieXRlcykgb2YgU2Vzc2lvbnMKKyAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlZCBieSB0aGlzIE1hbmFnZXIiCisgICAgICAgICAgICAgICAgIHR5cGU9ImludCIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9Im5hbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBkZXNjcmlwdGl2ZSBuYW1lIG9mIHRoaXMgTWFuYWdlciBpbXBsZW1lbnRhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAoZm9yIGxvZ2dpbmcpIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InBhdGhuYW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJQYXRoIG5hbWUgb2YgdGhlIGRpc2sgZmlsZSBpbiB3aGljaCBhY3RpdmUgc2Vzc2lvbnMiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJhY3RpdmVTZXNzaW9ucyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iTnVtYmVyIG9mIGFjdGl2ZSBzZXNzaW9ucyBhdCB0aGlzIG1vbWVudCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iaW50IiAKKyAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJzZXNzaW9uQ291bnRlciIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVG90YWwgbnVtYmVyIG9mIHNlc3Npb25zIGNyZWF0ZWQgYnkgdGhpcyBtYW5hZ2VyIgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiIC8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0ibWF4QWN0aXZlIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJNYXhpbXVtIG51bWJlciBvZiBhY3RpdmUgc2Vzc2lvbnMgc28gZmFyIgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiIC8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0ic2Vzc2lvbk1heEFsaXZlVGltZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iTG9uZ2VzdCB0aW1lIGFuIGV4cGlyZWQgc2Vzc2lvbiBoYWQgYmVlbiBhbGl2ZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iaW50IiAvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InNlc3Npb25BdmVyYWdlQWxpdmVUaW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJBdmVyYWdlIHRpbWUgYW4gZXhwaXJlZCBzZXNzaW9uIGhhZCBiZWVuIGFsaXZlIgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiIC8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0icmVqZWN0ZWRTZXNzaW9ucyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iTnVtYmVyIG9mIHNlc3Npb25zIHdlIHJlamVjdGVkIGR1ZSB0byBtYXhBY3RpdmUgYmVlaW5nIHJlYWNoZWQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImludCIgLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJleHBpcmVkU2Vzc2lvbnMiCisgICAgICAgICAgZGVzY3JpcHRpb249Ik51bWJlciBvZiBzZXNzaW9ucyB0aGF0IGV4cGlyZWQgKCBkb2Vzbid0IGluY2x1ZGUgZXhwbGljaXQgaW52YWxpZGF0aW9ucyApIgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiIC8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0icHJvY2Vzc2luZ1RpbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249IlRpbWUgc3BlbnQgZG9pbmcgaG91c2VrZWVwaW5nIGFuZCBleHBpcmF0aW9uIgorICAgICAgICAgICAgICAgICB0eXBlPSJsb25nIiAvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImR1cGxpY2F0ZXMiCisgICAgICAgICAgZGVzY3JpcHRpb249Ik51bWJlciBvZiBkdXBsaWNhdGVkIHNlc3Npb24gaWRzIGdlbmVyYXRlZCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iaW50IiAvPgorCisgICAgPG9wZXJhdGlvbiAgIG5hbWU9Imxpc3RTZXNzaW9uSWRzIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJSZXR1cm4gdGhlIGxpc3Qgb2YgYWN0aXZlIHNlc3Npb24gaWRzIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgIHJldHVyblR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorICAgIDwvb3BlcmF0aW9uPgorCisgICAgPG9wZXJhdGlvbiAgIG5hbWU9ImdldFNlc3Npb25BdHRyaWJ1dGUiCisgICAgICAgICAgZGVzY3JpcHRpb249IlJldHVybiBhIHNlc3Npb24gYXR0cmlidXRlIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgIHJldHVyblR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJzZXNzaW9uSWQiCisgICAgICAgICAgZGVzY3JpcHRpb249IklkIG9mIHRoZSBzZXNzaW9uIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9ImtleSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ia2V5IG9mIHRoZSBhdHRyaWJ1dGUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICA8L29wZXJhdGlvbj4KKworICAgIDxvcGVyYXRpb24gICBuYW1lPSJleHBpcmVTZXNzaW9uIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJFeHBpcmUgYSBzZXNzaW9uIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJzZXNzaW9uSWQiCisgICAgICAgICAgZGVzY3JpcHRpb249IklkIG9mIHRoZSBzZXNzaW9uIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgPC9vcGVyYXRpb24+CisKKyAgICA8b3BlcmF0aW9uICAgbmFtZT0iZ2V0TGFzdEFjY2Vzc2VkVGltZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iR2V0IHRoZSBsYXN0IGFjY2VzcyB0aW1lIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgIHJldHVyblR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJzZXNzaW9uSWQiCisgICAgICAgICAgZGVzY3JpcHRpb249IklkIG9mIHRoZSBzZXNzaW9uIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgPC9vcGVyYXRpb24+CisKKyAgPC9tYmVhbj4KKworICA8bWJlYW4gICAgICAgICBuYW1lPSJQZXJzaXN0ZW50TWFuYWdlciIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iUGVyc2lzdGVudCBNYW5hZ2VyIgorICAgICAgICAgICAgICAgZG9tYWluPSJDYXRhbGluYSIKKyAgICAgICAgICAgICAgICBncm91cD0iTWFuYWdlciIKKyAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5zZXNzaW9uLlBlcnNpc3RlbnRNYW5hZ2VyIj4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJhbGdvcml0aG0iCisgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBtZXNzYWdlIGRpZ2VzdCBhbGdvcml0aG0gdG8gYmUgdXNlZCB3aGVuIGdlbmVyYXRpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbiBpZGVudGlmaWVycyIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InJhbmRvbUZpbGUiCisgICAgICAgICAgZGVzY3JpcHRpb249IkZpbGUgc291cmNlIG9mIHJhbmRvbSAtIC9kZXYvdXJhbmRvbSBvciBhIHBpcGUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJjbGFzc05hbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249IkZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBtYW5hZ2VkIG9iamVjdCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJkaXN0cmlidXRhYmxlIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgZGlzdHJpYnV0YWJsZSBmbGFnIGZvciBTZXNzaW9ucyBjcmVhdGVkIGJ5IHRoaXMKKyAgICAgICAgICAgICAgICAgICAgICAgTWFuYWdlciIKKyAgICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImVudHJvcHkiCisgICAgICAgICAgZGVzY3JpcHRpb249IkEgU3RyaW5nIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlciB1c2VkIHRvIGluY3JlYXNlIHRoZQorICAgICAgICAgICAgICAgICAgICAgICBlbnRyb3B5IG9mIHRoZSBpbml0aWFsaXphdGlvbiBvZiBvdXIgcmFuZG9tIG51bWJlcgorICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0b3IiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAKKyAgICA8YXR0cmlidXRlICAgbmFtZT0ibWFuYWdlZFJlc291cmNlIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgbWFuYWdlZCByZXNvdXJjZSB0aGlzIE1CZWFuIGlzIGFzc29jaWF0ZWQgd2l0aCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLk9iamVjdCIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9Im1heEFjdGl2ZVNlc3Npb25zIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgbWF4aW11bSBudW1iZXIgb2YgYWN0aXZlIFNlc3Npb25zIGFsbG93ZWQsIG9yIC0xCisgICAgICAgICAgICAgICAgICAgICAgIGZvciBubyBsaW1pdCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iaW50Ii8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0ibWF4SW5hY3RpdmVJbnRlcnZhbCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIGRlZmF1bHQgbWF4aW11bSBpbmFjdGl2ZSBpbnRlcnZhbCBmb3IgU2Vzc2lvbnMKKyAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlZCBieSB0aGlzIE1hbmFnZXIiCisgICAgICAgICAgICAgICAgIHR5cGU9ImludCIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InNlc3Npb25JZExlbmd0aCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIHNlc3Npb24gaWQgbGVuZ3RoIChpbiBieXRlcykgb2YgU2Vzc2lvbnMKKyAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlZCBieSB0aGlzIE1hbmFnZXIiCisgICAgICAgICAgICAgICAgIHR5cGU9ImludCIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9Im5hbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBkZXNjcmlwdGl2ZSBuYW1lIG9mIHRoaXMgTWFuYWdlciBpbXBsZW1lbnRhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAoZm9yIGxvZ2dpbmcpIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InBhdGhuYW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJQYXRoIG5hbWUgb2YgdGhlIGRpc2sgZmlsZSBpbiB3aGljaCBhY3RpdmUgc2Vzc2lvbnMiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJhY3RpdmVTZXNzaW9ucyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iTnVtYmVyIG9mIGFjdGl2ZSBzZXNzaW9ucyBhdCB0aGlzIG1vbWVudCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iaW50IiAKKyAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJzZXNzaW9uQ291bnRlciIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVG90YWwgbnVtYmVyIG9mIHNlc3Npb25zIGNyZWF0ZWQgYnkgdGhpcyBtYW5hZ2VyIgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiIC8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0ibWF4QWN0aXZlIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJNYXhpbXVtIG51bWJlciBvZiBhY3RpdmUgc2Vzc2lvbnMgc28gZmFyIgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiIC8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0ibWF4SWRsZUJhY2t1cCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iSG93IGxvbmcgYSBzZXNzaW9uIG11c3QgYmUgaWRsZSBiZWZvcmUgaXQgc2hvdWxkIGJlIGJhY2tlZCB1cCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iaW50IiAvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9Im1pbklkbGVTd2FwIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJNaW5pbXVtIHRpbWUgYSBzZXNzaW9uIG11c3QgYmUgaWRsZSBiZWZvcmUgaXQgaXMgc3dhcHBlZCB0byBkaXNrIgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiIC8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0ibWF4SWRsZVN3YXAiCisgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBtYXhpbXVtIHRpbWUgYSBzZXNzaW9uIG1heSBiZSBpZGxlIGJlZm9yZSBpdCBzaG91bGQgYmUgc3dhcHBlZCB0byBmaWxlIGp1c3Qgb24gZ2VuZXJhbCBwcmluY2lwbGUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImludCIgLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJyZWplY3RlZFNlc3Npb25zIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJOdW1iZXIgb2Ygc2Vzc2lvbnMgd2UgcmVqZWN0ZWQgZHVlIHRvIG1heEFjdGl2ZSBiZWVpbmcgcmVhY2hlZCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iaW50IiAvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImV4cGlyZWRTZXNzaW9ucyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iTnVtYmVyIG9mIHNlc3Npb25zIHRoYXQgZXhwaXJlZCAoIGRvZXNuJ3QgaW5jbHVkZSBleHBsaWNpdCBpbnZhbGlkYXRpb25zICkiCisgICAgICAgICAgICAgICAgIHR5cGU9ImludCIgLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJwcm9jZXNzaW5nVGltZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVGltZSBzcGVudCBkb2luZyBob3VzZWtlZXBpbmcgYW5kIGV4cGlyYXRpb24iCisgICAgICAgICAgICAgICAgIHR5cGU9ImxvbmciIC8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0iZHVwbGljYXRlcyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iTnVtYmVyIG9mIGR1cGxpY2F0ZWQgc2Vzc2lvbiBpZHMgZ2VuZXJhdGVkIgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiIC8+CisKKyAgICA8b3BlcmF0aW9uICAgbmFtZT0ibGlzdFNlc3Npb25JZHMiCisgICAgICAgICAgZGVzY3JpcHRpb249IlJldHVybiB0aGUgbGlzdCBvZiBhY3RpdmUgc2Vzc2lvbiBpZHMiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgcmV0dXJuVHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CisgICAgPC9vcGVyYXRpb24+CisKKyAgICA8b3BlcmF0aW9uICAgbmFtZT0iZ2V0U2Vzc2lvbkF0dHJpYnV0ZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iUmV0dXJuIGEgc2Vzc2lvbiBhdHRyaWJ1dGUiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgcmV0dXJuVHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9InNlc3Npb25JZCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iSWQgb2YgdGhlIHNlc3Npb24iCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0ia2V5IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJrZXkgb2YgdGhlIGF0dHJpYnV0ZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgIDwvb3BlcmF0aW9uPgorCisgICAgPG9wZXJhdGlvbiAgIG5hbWU9ImV4cGlyZVNlc3Npb24iCisgICAgICAgICAgZGVzY3JpcHRpb249IkV4cGlyZSBhIHNlc3Npb24iCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgcmV0dXJuVHlwZT0idm9pZCI+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9InNlc3Npb25JZCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iSWQgb2YgdGhlIHNlc3Npb24iCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICA8L29wZXJhdGlvbj4KKworICAgIDxvcGVyYXRpb24gICBuYW1lPSJnZXRMYXN0QWNjZXNzZWRUaW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJHZXQgdGhlIGxhc3QgYWNjZXNzIHRpbWUiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgcmV0dXJuVHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9InNlc3Npb25JZCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iSWQgb2YgdGhlIHNlc3Npb24iCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICA8L29wZXJhdGlvbj4KKworICA8L21iZWFuPgorCis8L21iZWFucy1kZXNjcmlwdG9ycz4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zZXNzaW9uL3BhY2thZ2UuaHRtbCBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zZXNzaW9uL3BhY2thZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzNkOWE4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3Nlc3Npb24vcGFja2FnZS5odG1sCkBAIC0wLDAgKzEsNTIgQEAKKzxib2R5PgorCis8cD5UaGlzIHBhY2thZ2UgY29udGFpbnMgdGhlIHN0YW5kYXJkIDxjb2RlPk1hbmFnZXI8L2NvZGU+IGFuZAorPGNvZGU+U2Vzc2lvbjwvY29kZT4gaW1wbGVtZW50YXRpb25zIHRoYXQgcmVwcmVzZW50IHRoZSBjb2xsZWN0aW9uIG9mCithY3RpdmUgc2Vzc2lvbnMgYW5kIHRoZSBpbmRpdmlkdWFsIHNlc3Npb25zIHRoZW1zZWx2ZXMsIHJlc3BlY3RpdmVseSwKK3RoYXQgYXJlIGFzc29jaWF0ZWQgd2l0aCBhIDxjb2RlPkNvbnRleHQ8L2NvZGU+LiAgQWRkaXRpb25hbCBpbXBsZW1lbnRhdGlvbnMKK29mIHRoZSA8Y29kZT5NYW5hZ2VyPC9jb2RlPiBpbnRlcmZhY2UgY2FuIGJlIGJhc2VkIHVwb24gdGhlIHN1cHBsaWVkCitjb252ZW5pZW5jZSBiYXNlIGNsYXNzICg8Y29kZT5NYW5hZ2VyQmFzZTwvY29kZT4pLCBpZiBkZXNpcmVkLiAgRGlmZmVyZW50CitpbXBsZW1lbnRhdGlvbnMgb2YgPGNvZGU+U2Vzc2lvbjwvY29kZT4gYXJlIHBvc3NpYmxlLCBidXQgYSBuZWVkIGZvcgorZnVuY3Rpb25hbGl0eSBiZXlvbmQgd2hhdCBpcyBwcm92aWRlZCBieSB0aGUgc3RhbmRhcmQgaW1wbGVtZW50YXRpb24KKyg8Y29kZT5TdGFuZGFyZFNlc3Npb248L2NvZGU+KSBpcyBub3QgZXhwZWN0ZWQuPC9wPgorCis8cD5UaGUgY29udmVuaWVuY2UgPGNvZGU+TWFuYWdlckJhc2U8L2NvZGU+IGJhc2UgY2xhc3MgaXMgY29uZmlndXJlZCBieQorc2V0dGluZyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6PC9wPgorPHVsPgorPGxpPjxiPmFsZ29yaXRobTwvYj4gLSBNZXNzYWdlIGRpZ2VzdCBhbGdvcml0aG0gdG8gYmUgdXNlZCB3aGVuCisgICAgZ2VuZXJhdGluZyBzZXNzaW9uIGlkZW50aWZpZXJzLiAgVGhpcyBtdXN0IGJlIHRoZSBuYW1lIG9mIGFuCisgICAgYWxnb3JpdGhtIHN1cHBvcnRlZCBieSB0aGUgPGNvZGU+amF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0PC9jb2RlPgorICAgIGNsYXNzIG9uIHlvdXIgcGxhdGZvcm0uICBbREVGQVVMVF9BTEdPUklUSE1dPC9saT4KKzxsaT48Yj5kZWJ1ZzwvYj4gLSBEZWJ1Z2dpbmcgZGV0YWlsIGxldmVsIGZvciB0aGlzIGNvbXBvbmVudC4gWzBdPC9saT4KKzxsaT48Yj5kaXN0cmlidXRhYmxlPC9iPiAtIEhhcyB0aGUgd2ViIGFwcGxpY2F0aW9uIHdlIGFyZSBhc3NvY2lhdGVkIHdpdGgKKyAgICBiZWVuIG1hcmtlZCBhcyAiZGlzdHJpYnV0YWJsZSI/ICBJZiBpdCBoYXMsIGF0dGVtcHRzIHRvIGFkZCBvciByZXBsYWNlCisgICAgYSBzZXNzaW9uIGF0dHJpYnV0ZSBvYmplY3QgdGhhdCBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlCisgICAgPGNvZGU+amF2YS5pby5TZXJpYWxpemFibGU8L2NvZGU+IGludGVyZmFjZSB3aWxsIGJlIHJlamVjdGVkLgorICAgIFtmYWxzZV08L2xpPgorPGxpPjxiPmVudHJvcHk8L2I+IC0gQSBzdHJpbmcgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyIHRoYXQgaXMgdXNlZCB0bworICAgIGluY3JlYXNlIHRoZSBlbnRyb3B5IG9mIHRoZSBzZWVkaW5nIG9mIHRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgorICAgIHVzZWQgaW4gY3JlYXRpb24gb2Ygc2Vzc2lvbiBpZGVudGlmaWVycy4gIFtOT05FXTwvbGk+Cis8bGk+PGI+bWF4SW5hY3RpdmVJbnRlcnZhbDwvYj4gLSBUaGUgZGVmYXVsdCBtYXhpbXVtIGluYWN0aXZlIGludGVydmFsLAorICAgIGluIG1pbnV0ZXMsIGZvciBzZXNzaW9ucyBjcmVhdGVkIGJ5IHRoaXMgTWFuYWdlci4gIFRoZSBzdGFuZGFyZAorICAgIGltcGxlbWVudGF0aW9uIGF1dG9tYXRpY2FsbHkgdXBkYXRlcyB0aGlzIHZhbHVlIGJhc2VkIG9uIHRoZSBjb25maWd1cmF0aW9uCisgICAgc2V0dGluZ3MgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IuICBbNjBdPC9saT4KKzxsaT48Yj5yYW5kb21DbGFzczwvYj4gLSBUaGUgSmF2YSBjbGFzcyBuYW1lIG9mIHRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgorICAgIHRvIGJlIHVzZWQgd2hlbiBjcmVhdGluZyBzZXNzaW9uIGlkZW50aWZpZXJzIGZvciB0aGlzIE1hbmFnZXIuCisgICAgW2phdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tXTwvbGk+Cis8L3VsPgorCis8cD5UaGUgc3RhbmRhcmQgaW1wbGVtZW50YXRpb24gb2YgdGhlIDxjb2RlPk1hbmFnZXI8L2NvZGU+IGludGVyZmFjZQorKDxjb2RlPlN0YW5kYXJkTWFuYWdlcjwvY29kZT4pIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBjb25maWd1cmF0aW9uCitwcm9wZXJ0aWVzOjwvcD4KKzx1bD4KKzxsaT48Yj5jaGVja0ludGVydmFsPC9iPiAtIFRoZSBpbnRlcnZhbCwgaW4gc2Vjb25kcywgYmV0d2VlbiBjaGVja3MgZm9yCisgICAgc2Vzc2lvbnMgdGhhdCBoYXZlIGV4cGlyZWQgYW5kIHNob3VsZCBiZSBpbnZhbGlkYXRlZC4gIFs2MF08L2xpPgorPGxpPjxiPm1heEFjdGl2ZVNlc3Npb25zPC9iPiAtIFRoZSBtYXhpbXVtIG51bWJlciBvZiBhY3RpdmUgc2Vzc2lvbnMgdGhhdAorICAgIHdpbGwgYmUgYWxsb3dlZCwgb3IgLTEgZm9yIG5vIGxpbWl0LiAgWy0xXTwvbGk+Cis8bGk+PGI+cGF0aG5hbWU8L2I+IC0gUGF0aG5hbWUgdG8gdGhlIGZpbGUgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHNlc3Npb24KKyAgICBkYXRhIHBlcnNpc3RlbnRseSBhY3Jvc3MgY29udGFpbmVyIHJlc3RhcnRzLiAgSWYgdGhpcyBwYXRobmFtZSBpcyByZWxhdGl2ZSwKKyAgICBpdCBpcyByZXNvbHZlZCBhZ2FpbnN0IHRoZSB0ZW1wb3Jhcnkgd29ya2luZyBkaXJlY3RvcnkgcHJvdmlkZWQgYnkgb3VyCisgICAgYXNzb2NpYXRlZCBDb250ZXh0LCBpZiBhbnkuICBbInNlc3Npb25zLnNlciJdPC9saT4KKzwvdWw+CisKKzwvYm9keT4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zc2kvQnl0ZUFycmF5U2VydmxldE91dHB1dFN0cmVhbS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NzaS9CeXRlQXJyYXlTZXJ2bGV0T3V0cHV0U3RyZWFtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZjZjhlOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zc2kvQnl0ZUFycmF5U2VydmxldE91dHB1dFN0cmVhbS5qYXZhCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gTGljZW5zZWQgdW5kZXIgdGhlCisgKiBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisgKiBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UKKyAqIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZQorICogbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcworICogZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZQorICogZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnNzaTsKKworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRPdXRwdXRTdHJlYW07CisvKioKKyAqIENsYXNzIHRoYXQgZXh0ZW5kcyBTZXJ2bGV0T3VwdXRTdHJlYW0sIHVzZWQgYXMgYSB3cmFwcGVyIGZyb20gd2l0aGluCisgKiA8Y29kZT5Tc2lJbmNsdWRlPC9jb2RlPgorICoKKyAqIEBhdXRob3IgQmlwIFRoZWxpbgorICogQHZlcnNpb24gJFJldmlzaW9uJCwgJERhdGUkCisgKiBAc2VlIFNlcnZsZXRPdXRwdXRTdHJlYW0gYW5kIEJ5dGVBcnJheU91dHB1dFN0cmVhbQorICovCitwdWJsaWMgY2xhc3MgQnl0ZUFycmF5U2VydmxldE91dHB1dFN0cmVhbSBleHRlbmRzIFNlcnZsZXRPdXRwdXRTdHJlYW0geworICAgIC8qKgorICAgICAqIE91ciBidWZmZXIgdG8gaG9sZCB0aGUgc3RyZWFtCisgICAgICovCisgICAgcHJvdGVjdGVkIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBfYnVmID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IFNlcnZsZXRPdXRwdXRTdHJlYW0KKyAgICAgKi8KKyAgICBwdWJsaWMgQnl0ZUFycmF5U2VydmxldE91dHB1dFN0cmVhbSgpIHsKKyAgICAgICAgX2J1ZiA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFdyaXRlIG91ciBzdHJlYW0gdG8gdGhlIDxjb2RlPk91dHB1dFN0cmVhbTwvY29kZT4gcHJvdmlkZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3V0CisgICAgICogICAgICAgICAgICB0aGUgT3V0cHV0U3RyZWFtIHRvIHdyaXRlIHRoaXMgc3RyZWFtIHRvCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgYnl0ZVtdIHRvQnl0ZUFycmF5KCkgeworICAgICAgICByZXR1cm4gX2J1Zi50b0J5dGVBcnJheSgpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogV3JpdGUgdG8gb3VyIGJ1ZmZlcgorICAgICAqCisgICAgICogQHBhcmFtIGIKKyAgICAgKiAgICAgICAgICAgIFRoZSBwYXJhbWV0ZXIgdG8gd3JpdGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3cml0ZShpbnQgYikgeworICAgICAgICBfYnVmLndyaXRlKGIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zc2kvRXhwcmVzc2lvblBhcnNlVHJlZS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NzaS9FeHByZXNzaW9uUGFyc2VUcmVlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjMyOGY0MwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zc2kvRXhwcmVzc2lvblBhcnNlVHJlZS5qYXZhCkBAIC0wLDAgKzEsMzgzIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uIExpY2Vuc2VkIHVuZGVyIHRoZQorICogQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorICogZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlCisgKiBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUKKyAqIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMKKyAqIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UKKyAqIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5zc2k7CisKKworaW1wb3J0IGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKy8qKgorICogUmVwcmVzZW50cyBhIHBhcnNlZCBleHByZXNzaW9uLgorICogCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiBAYXV0aG9yIFBhdWwgU3BlZWQKKyAqLworcHVibGljIGNsYXNzIEV4cHJlc3Npb25QYXJzZVRyZWUgeworICAgIC8qKgorICAgICAqIENvbnRhaW5zIHRoZSBjdXJyZW50IHNldCBvZiBjb21wbGV0ZWQgbm9kZXMuIFRoaXMgaXMgYSB3b3Jrc3BhY2UgZm9yIHRoZQorICAgICAqIHBhcnNlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIExpbmtlZExpc3Qgbm9kZVN0YWNrID0gbmV3IExpbmtlZExpc3QoKTsKKyAgICAvKioKKyAgICAgKiBDb250YWlucyBvcGVyYXRvciBub2RlcyB0aGF0IGRvbid0IHlldCBoYXZlIHZhbHVlcy4gVGhpcyBpcyBhIHdvcmtzcGFjZQorICAgICAqIGZvciB0aGUgcGFyc2VyLgorICAgICAqLworICAgIHByaXZhdGUgTGlua2VkTGlzdCBvcHBTdGFjayA9IG5ldyBMaW5rZWRMaXN0KCk7CisgICAgLyoqCisgICAgICogVGhlIHJvb3Qgbm9kZSBhZnRlciB0aGUgZXhwcmVzc2lvbiBoYXMgYmVlbiBwYXJzZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBOb2RlIHJvb3Q7CisgICAgLyoqCisgICAgICogVGhlIFNTSU1lZGlhdG9yIHRvIHVzZSB3aGVuIGV2YWx1YXRpbmcgdGhlIGV4cHJlc3Npb25zLgorICAgICAqLworICAgIHByaXZhdGUgU1NJTWVkaWF0b3Igc3NpTWVkaWF0b3I7CisKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgcGFyc2UgdHJlZSBmb3IgdGhlIHNwZWNpZmllZCBleHByZXNzaW9uLgorICAgICAqLworICAgIHB1YmxpYyBFeHByZXNzaW9uUGFyc2VUcmVlKFN0cmluZyBleHByLCBTU0lNZWRpYXRvciBzc2lNZWRpYXRvcikKKyAgICAgICAgICAgIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMuc3NpTWVkaWF0b3IgPSBzc2lNZWRpYXRvcjsKKyAgICAgICAgcGFyc2VFeHByZXNzaW9uKGV4cHIpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogRXZhbHVhdGVzIHRoZSB0cmVlIGFuZCByZXR1cm5zIHRydWUgb3IgZmFsc2UuIFRoZSBzcGVjaWZpZWQgU1NJTWVkaWF0b3IKKyAgICAgKiBpcyB1c2VkIHRvIHJlc29sdmUgdmFyaWFibGUgcmVmZXJlbmNlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBldmFsdWF0ZVRyZWUoKSB7CisgICAgICAgIHJldHVybiByb290LmV2YWx1YXRlKCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBQdXNoZXMgYSBuZXcgb3BlcmF0b3Igb250byB0aGUgb3BwIHN0YWNrLCByZXNvbHZpbmcgZXhpc3Rpbmcgb3BwcyBhcworICAgICAqIG5lZWRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcHVzaE9wcChPcHBOb2RlIG5vZGUpIHsKKyAgICAgICAgLy8gSWYgbm9kZSBpcyBudWxsIHRoZW4gaXQncyBqdXN0IGEgZ3JvdXAgbWFya2VyCisgICAgICAgIGlmIChub2RlID09IG51bGwpIHsKKyAgICAgICAgICAgIG9wcFN0YWNrLmFkZCgwLCBub2RlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgaWYgKG9wcFN0YWNrLnNpemUoKSA9PSAwKSBicmVhazsKKyAgICAgICAgICAgIE9wcE5vZGUgdG9wID0gKE9wcE5vZGUpb3BwU3RhY2suZ2V0KDApOworICAgICAgICAgICAgLy8gSWYgdGhlIHRvcCBpcyBhIHNwYWNlciB0aGVuIGRvbid0IHBvcAorICAgICAgICAgICAgLy8gYW55dGhpbmcKKyAgICAgICAgICAgIGlmICh0b3AgPT0gbnVsbCkgYnJlYWs7CisgICAgICAgICAgICAvLyBJZiB0aGUgdG9wIG5vZGUgaGFzIGEgbG93ZXIgcHJlY2VkZW5jZSB0aGVuCisgICAgICAgICAgICAvLyBsZXQgaXQgc3RheQorICAgICAgICAgICAgaWYgKHRvcC5nZXRQcmVjZWRlbmNlKCkgPCBub2RlLmdldFByZWNlZGVuY2UoKSkgYnJlYWs7CisgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIHRvcCBub2RlCisgICAgICAgICAgICBvcHBTdGFjay5yZW1vdmUoMCk7CisgICAgICAgICAgICAvLyBMZXQgaXQgZmlsbCBpdHMgYnJhbmNoZXMKKyAgICAgICAgICAgIHRvcC5wb3BWYWx1ZXMobm9kZVN0YWNrKTsKKyAgICAgICAgICAgIC8vIFN0aWNrIGl0IG9uIHRoZSByZXNvbHZlZCBub2RlIHN0YWNrCisgICAgICAgICAgICBub2RlU3RhY2suYWRkKDAsIHRvcCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gQWRkIHRoZSBuZXcgbm9kZSB0byB0aGUgb3BwIHN0YWNrCisgICAgICAgIG9wcFN0YWNrLmFkZCgwLCBub2RlKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlc29sdmVzIGFsbCBwZW5kaW5nIG9wcCBub2RlcyBvbiB0aGUgc3RhY2sgdW50aWwgdGhlIG5leHQgZ3JvdXAgbWFya2VyCisgICAgICogaXMgcmVhY2hlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcmVzb2x2ZUdyb3VwKCkgeworICAgICAgICBPcHBOb2RlIHRvcCA9IG51bGw7CisgICAgICAgIHdoaWxlICgodG9wID0gKE9wcE5vZGUpb3BwU3RhY2sucmVtb3ZlKDApKSAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBMZXQgaXQgZmlsbCBpdHMgYnJhbmNoZXMKKyAgICAgICAgICAgIHRvcC5wb3BWYWx1ZXMobm9kZVN0YWNrKTsKKyAgICAgICAgICAgIC8vIFN0aWNrIGl0IG9uIHRoZSByZXNvbHZlZCBub2RlIHN0YWNrCisgICAgICAgICAgICBub2RlU3RhY2suYWRkKDAsIHRvcCk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFBhcnNlcyB0aGUgc3BlY2lmaWVkIGV4cHJlc3Npb24gaW50byBhIHRyZWUgb2YgcGFyc2Ugbm9kZXMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHBhcnNlRXhwcmVzc2lvbihTdHJpbmcgZXhwcikgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nTm9kZSBjdXJyU3RyaW5nTm9kZSA9IG51bGw7CisgICAgICAgIC8vIFdlIGNoZWF0IGEgbGl0dGxlIGFuZCBzdGFydCBhbiBhcnRpZmljaWFsCisgICAgICAgIC8vIGdyb3VwIHJpZ2h0IGF3YXkuIEl0IG1ha2VzIGZpbmlzaGluZyBlYXNpZXIuCisgICAgICAgIHB1c2hPcHAobnVsbCk7CisgICAgICAgIEV4cHJlc3Npb25Ub2tlbml6ZXIgZXQgPSBuZXcgRXhwcmVzc2lvblRva2VuaXplcihleHByKTsKKyAgICAgICAgd2hpbGUgKGV0Lmhhc01vcmVUb2tlbnMoKSkgeworICAgICAgICAgICAgaW50IHRva2VuID0gZXQubmV4dFRva2VuKCk7CisgICAgICAgICAgICBpZiAodG9rZW4gIT0gRXhwcmVzc2lvblRva2VuaXplci5UT0tFTl9TVFJJTkcpCisgICAgICAgICAgICAgICAgY3VyclN0cmluZ05vZGUgPSBudWxsOworICAgICAgICAgICAgc3dpdGNoICh0b2tlbikgeworICAgICAgICAgICAgICAgIGNhc2UgRXhwcmVzc2lvblRva2VuaXplci5UT0tFTl9TVFJJTkcgOgorICAgICAgICAgICAgICAgICAgICBpZiAoY3VyclN0cmluZ05vZGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY3VyclN0cmluZ05vZGUgPSBuZXcgU3RyaW5nTm9kZShldC5nZXRUb2tlblZhbHVlKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgbm9kZVN0YWNrLmFkZCgwLCBjdXJyU3RyaW5nTm9kZSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBBZGQgdG8gdGhlIGV4aXN0aW5nCisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyU3RyaW5nTm9kZS52YWx1ZS5hcHBlbmQoIiAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJTdHJpbmdOb2RlLnZhbHVlLmFwcGVuZChldC5nZXRUb2tlblZhbHVlKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRXhwcmVzc2lvblRva2VuaXplci5UT0tFTl9BTkQgOgorICAgICAgICAgICAgICAgICAgICBwdXNoT3BwKG5ldyBBbmROb2RlKCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEV4cHJlc3Npb25Ub2tlbml6ZXIuVE9LRU5fT1IgOgorICAgICAgICAgICAgICAgICAgICBwdXNoT3BwKG5ldyBPck5vZGUoKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRXhwcmVzc2lvblRva2VuaXplci5UT0tFTl9OT1QgOgorICAgICAgICAgICAgICAgICAgICBwdXNoT3BwKG5ldyBOb3ROb2RlKCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEV4cHJlc3Npb25Ub2tlbml6ZXIuVE9LRU5fRVEgOgorICAgICAgICAgICAgICAgICAgICBwdXNoT3BwKG5ldyBFcXVhbE5vZGUoKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRXhwcmVzc2lvblRva2VuaXplci5UT0tFTl9OT1RfRVEgOgorICAgICAgICAgICAgICAgICAgICBwdXNoT3BwKG5ldyBOb3ROb2RlKCkpOworICAgICAgICAgICAgICAgICAgICAvLyBTbmVhayB0aGUgcmVndWxhciBub2RlIGluLiBUaGUgTk9UIHdpbGwKKyAgICAgICAgICAgICAgICAgICAgLy8gYmUgcmVzb2x2ZWQgd2hlbiB0aGUgbmV4dCBvcHAgY29tZXMgYWxvbmcuCisgICAgICAgICAgICAgICAgICAgIG9wcFN0YWNrLmFkZCgwLCBuZXcgRXF1YWxOb2RlKCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEV4cHJlc3Npb25Ub2tlbml6ZXIuVE9LRU5fUkJSQUNFIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gQ2xvc2VvdXQgdGhlIGN1cnJlbnQgZ3JvdXAKKyAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZUdyb3VwKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRXhwcmVzc2lvblRva2VuaXplci5UT0tFTl9MQlJBQ0UgOgorICAgICAgICAgICAgICAgICAgICAvLyBQdXNoIGEgZ3JvdXAgbWFya2VyCisgICAgICAgICAgICAgICAgICAgIHB1c2hPcHAobnVsbCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRXhwcmVzc2lvblRva2VuaXplci5UT0tFTl9HRSA6CisgICAgICAgICAgICAgICAgICAgIHB1c2hPcHAobmV3IE5vdE5vZGUoKSk7CisgICAgICAgICAgICAgICAgICAgIC8vIFNpbWlsYXIgc3RhdGVneSB0byBOT1RfRVEgYWJvdmUsIGV4Y2VwdCB0aGlzCisgICAgICAgICAgICAgICAgICAgIC8vIGlzIE5PVCBsZXNzIHRoYW4KKyAgICAgICAgICAgICAgICAgICAgb3BwU3RhY2suYWRkKDAsIG5ldyBMZXNzVGhhbk5vZGUoKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRXhwcmVzc2lvblRva2VuaXplci5UT0tFTl9MRSA6CisgICAgICAgICAgICAgICAgICAgIHB1c2hPcHAobmV3IE5vdE5vZGUoKSk7CisgICAgICAgICAgICAgICAgICAgIC8vIFNpbWlsYXIgc3RhdGVneSB0byBOT1RfRVEgYWJvdmUsIGV4Y2VwdCB0aGlzCisgICAgICAgICAgICAgICAgICAgIC8vIGlzIE5PVCBncmVhdGVyIHRoYW4KKyAgICAgICAgICAgICAgICAgICAgb3BwU3RhY2suYWRkKDAsIG5ldyBHcmVhdGVyVGhhbk5vZGUoKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRXhwcmVzc2lvblRva2VuaXplci5UT0tFTl9HVCA6CisgICAgICAgICAgICAgICAgICAgIHB1c2hPcHAobmV3IEdyZWF0ZXJUaGFuTm9kZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBFeHByZXNzaW9uVG9rZW5pemVyLlRPS0VOX0xUIDoKKyAgICAgICAgICAgICAgICAgICAgcHVzaE9wcChuZXcgTGVzc1RoYW5Ob2RlKCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEV4cHJlc3Npb25Ub2tlbml6ZXIuVE9LRU5fRU5EIDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gRmluaXNoIG9mZiB0aGUgcmVzdCBvZiB0aGUgb3BwcworICAgICAgICByZXNvbHZlR3JvdXAoKTsKKyAgICAgICAgaWYgKG5vZGVTdGFjay5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCJObyBub2RlcyBjcmVhdGVkLiIsIGV0LmdldEluZGV4KCkpOworICAgICAgICB9CisgICAgICAgIGlmIChub2RlU3RhY2suc2l6ZSgpID4gMSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCJFeHRyYSBub2RlcyBjcmVhdGVkLiIsIGV0LmdldEluZGV4KCkpOworICAgICAgICB9CisgICAgICAgIGlmIChvcHBTdGFjay5zaXplKCkgIT0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCJVbnVzZWQgb3BwIG5vZGVzIGV4aXN0LiIsIGV0LmdldEluZGV4KCkpOworICAgICAgICB9CisgICAgICAgIHJvb3QgPSAoTm9kZSlub2RlU3RhY2suZ2V0KDApOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgbm9kZSBpbiB0aGUgZXhwcmVzc2lvbiBwYXJzZSB0cmVlLgorICAgICAqLworICAgIHByaXZhdGUgYWJzdHJhY3QgY2xhc3MgTm9kZSB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgbm9kZSBldmFsdWF0ZXMgdG8gdHJ1ZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGV2YWx1YXRlKCk7CisgICAgfQorICAgIC8qKgorICAgICAqIEEgbm9kZSB0aGUgcmVwcmVzZW50cyBhIFN0cmluZyB2YWx1ZQorICAgICAqLworICAgIHByaXZhdGUgY2xhc3MgU3RyaW5nTm9kZSBleHRlbmRzIE5vZGUgeworICAgICAgICBTdHJpbmdCdWZmZXIgdmFsdWU7CisgICAgICAgIFN0cmluZyByZXNvbHZlZCA9IG51bGw7CisKKworICAgICAgICBwdWJsaWMgU3RyaW5nTm9kZShTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgIHRoaXMudmFsdWUgPSBuZXcgU3RyaW5nQnVmZmVyKHZhbHVlKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlc29sdmVzIGFueSB2YXJpYWJsZSByZWZlcmVuY2VzIGFuZCByZXR1cm5zIHRoZSB2YWx1ZSBzdHJpbmcuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgeworICAgICAgICAgICAgaWYgKHJlc29sdmVkID09IG51bGwpCisgICAgICAgICAgICAgICAgcmVzb2x2ZWQgPSBzc2lNZWRpYXRvci5zdWJzdGl0dXRlVmFyaWFibGVzKHZhbHVlLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVkOworICAgICAgICB9CisKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzdHJpbmcgaXMgbm90IGVtcHR5LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXZhbHVhdGUoKSB7CisgICAgICAgICAgICByZXR1cm4gIShnZXRWYWx1ZSgpLmxlbmd0aCgpID09IDApOworICAgICAgICB9CisKKworICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUFJFQ0VERU5DRV9OT1QgPSA1OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQUkVDRURFTkNFX0NPTVBBUkUgPSA0OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQUkVDRURFTkNFX0xPR0lDQUwgPSAxOworCisgICAgLyoqCisgICAgICogQSBub2RlIGltcGxlbWVudGF0aW9uIHRoYXQgcmVwcmVzZW50cyBhbiBvcGVyYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBhYnN0cmFjdCBjbGFzcyBPcHBOb2RlIGV4dGVuZHMgTm9kZSB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbGVmdCBicmFuY2guCisgICAgICAgICAqLworICAgICAgICBOb2RlIGxlZnQ7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgcmlnaHQgYnJhbmNoLgorICAgICAgICAgKi8KKyAgICAgICAgTm9kZSByaWdodDsKKworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIGEgcHJlZmVyZW5jZSBsZXZlbCBzdWl0YWJsZSBmb3IgY29tcGFyaXNvbiB0byBvdGhlciBPcHBOb2RlCisgICAgICAgICAqIHByZWZlcmVuY2UgbGV2ZWxzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGFic3RyYWN0IGludCBnZXRQcmVjZWRlbmNlKCk7CisKKworICAgICAgICAvKioKKyAgICAgICAgICogTGV0cyB0aGUgbm9kZSBwb3AgaXRzIG93biBicmFuY2ggbm9kZXMgb2ZmIHRoZSBmcm9udCBvZiB0aGUKKyAgICAgICAgICogc3BlY2lmaWVkIGxpc3QuIFRoZSBkZWZhdWx0IHB1bGxzIHR3by4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHBvcFZhbHVlcyhMaXN0IHZhbHVlcykgeworICAgICAgICAgICAgcmlnaHQgPSAoTm9kZSl2YWx1ZXMucmVtb3ZlKDApOworICAgICAgICAgICAgbGVmdCA9IChOb2RlKXZhbHVlcy5yZW1vdmUoMCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBOb3ROb2RlIGV4dGVuZHMgT3BwTm9kZSB7CisgICAgICAgIHB1YmxpYyBib29sZWFuIGV2YWx1YXRlKCkgeworICAgICAgICAgICAgcmV0dXJuICFsZWZ0LmV2YWx1YXRlKCk7CisgICAgICAgIH0KKworCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0UHJlY2VkZW5jZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBQUkVDRURFTkNFX05PVDsKKyAgICAgICAgfQorCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE92ZXJyaWRkZW4gdG8gcG9wIG9ubHkgb25lIHZhbHVlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgcG9wVmFsdWVzKExpc3QgdmFsdWVzKSB7CisgICAgICAgICAgICBsZWZ0ID0gKE5vZGUpdmFsdWVzLnJlbW92ZSgwKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiBsZWZ0ICsgIiBOT1QiOworICAgICAgICB9CisgICAgfQorICAgIHByaXZhdGUgZmluYWwgY2xhc3MgQW5kTm9kZSBleHRlbmRzIE9wcE5vZGUgeworICAgICAgICBwdWJsaWMgYm9vbGVhbiBldmFsdWF0ZSgpIHsKKyAgICAgICAgICAgIGlmICghbGVmdC5ldmFsdWF0ZSgpKSAvLyBTaG9ydCBjaXJjdWl0CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIHJpZ2h0LmV2YWx1YXRlKCk7CisgICAgICAgIH0KKworCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0UHJlY2VkZW5jZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBQUkVDRURFTkNFX0xPR0lDQUw7CisgICAgICAgIH0KKworCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gbGVmdCArICIgIiArIHJpZ2h0ICsgIiBBTkQiOworICAgICAgICB9CisgICAgfQorICAgIHByaXZhdGUgZmluYWwgY2xhc3MgT3JOb2RlIGV4dGVuZHMgT3BwTm9kZSB7CisgICAgICAgIHB1YmxpYyBib29sZWFuIGV2YWx1YXRlKCkgeworICAgICAgICAgICAgaWYgKGxlZnQuZXZhbHVhdGUoKSkgLy8gU2hvcnQgY2lyY3VpdAorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgcmV0dXJuIHJpZ2h0LmV2YWx1YXRlKCk7CisgICAgICAgIH0KKworCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0UHJlY2VkZW5jZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBQUkVDRURFTkNFX0xPR0lDQUw7CisgICAgICAgIH0KKworCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gbGVmdCArICIgIiArIHJpZ2h0ICsgIiBPUiI7CisgICAgICAgIH0KKyAgICB9CisgICAgcHJpdmF0ZSBhYnN0cmFjdCBjbGFzcyBDb21wYXJlTm9kZSBleHRlbmRzIE9wcE5vZGUgeworICAgICAgICBwcm90ZWN0ZWQgaW50IGNvbXBhcmVCcmFuY2hlcygpIHsKKyAgICAgICAgICAgIFN0cmluZyB2YWwxID0gKChTdHJpbmdOb2RlKWxlZnQpLmdldFZhbHVlKCk7CisgICAgICAgICAgICBTdHJpbmcgdmFsMiA9ICgoU3RyaW5nTm9kZSlyaWdodCkuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgIHJldHVybiB2YWwxLmNvbXBhcmVUbyh2YWwyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBwcml2YXRlIGZpbmFsIGNsYXNzIEVxdWFsTm9kZSBleHRlbmRzIENvbXBhcmVOb2RlIHsKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXZhbHVhdGUoKSB7CisgICAgICAgICAgICByZXR1cm4gKGNvbXBhcmVCcmFuY2hlcygpID09IDApOworICAgICAgICB9CisKKworICAgICAgICBwdWJsaWMgaW50IGdldFByZWNlZGVuY2UoKSB7CisgICAgICAgICAgICByZXR1cm4gUFJFQ0VERU5DRV9DT01QQVJFOworICAgICAgICB9CisKKworICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuIGxlZnQgKyAiICIgKyByaWdodCArICIgRVEiOworICAgICAgICB9CisgICAgfQorICAgIHByaXZhdGUgZmluYWwgY2xhc3MgR3JlYXRlclRoYW5Ob2RlIGV4dGVuZHMgQ29tcGFyZU5vZGUgeworICAgICAgICBwdWJsaWMgYm9vbGVhbiBldmFsdWF0ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiAoY29tcGFyZUJyYW5jaGVzKCkgPiAwKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgcHVibGljIGludCBnZXRQcmVjZWRlbmNlKCkgeworICAgICAgICAgICAgcmV0dXJuIFBSRUNFREVOQ0VfQ09NUEFSRTsKKyAgICAgICAgfQorCisKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiBsZWZ0ICsgIiAiICsgcmlnaHQgKyAiIEdUIjsKKyAgICAgICAgfQorICAgIH0KKyAgICBwcml2YXRlIGZpbmFsIGNsYXNzIExlc3NUaGFuTm9kZSBleHRlbmRzIENvbXBhcmVOb2RlIHsKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXZhbHVhdGUoKSB7CisgICAgICAgICAgICByZXR1cm4gKGNvbXBhcmVCcmFuY2hlcygpIDwgMCk7CisgICAgICAgIH0KKworCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0UHJlY2VkZW5jZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBQUkVDRURFTkNFX0NPTVBBUkU7CisgICAgICAgIH0KKworCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gbGVmdCArICIgIiArIHJpZ2h0ICsgIiBMVCI7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NzaS9FeHByZXNzaW9uVG9rZW5pemVyLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3NpL0V4cHJlc3Npb25Ub2tlbml6ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGNhNTBlCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NzaS9FeHByZXNzaW9uVG9rZW5pemVyLmphdmEKQEAgLTAsMCArMSwxNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gTGljZW5zZWQgdW5kZXIgdGhlCisgKiBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisgKiBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UKKyAqIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZQorICogbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcworICogZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZQorICogZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnNzaTsKKworCisvKioKKyAqIFBhcnNlcyBhbiBleHByZXNzaW9uIHN0cmluZyB0byByZXR1cm4gdGhlIGluZGl2aWR1YWwgdG9rZW5zLiBUaGlzIGlzCisgKiBwYXR0ZXJuZWQgc2ltaWxhciB0byB0aGUgU3RyZWFtVG9rZW5pemVyIGluIHRoZSBKREsgYnV0IGN1c3RvbWl6ZWQgZm9yIFNTSQorICogY29uZGl0aW9uYWwgZXhwcmVzc2lvbiBwYXJzaW5nLgorICogCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiBAYXV0aG9yIFBhdWwgU3BlZWQKKyAqLworcHVibGljIGNsYXNzIEV4cHJlc3Npb25Ub2tlbml6ZXIgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRPS0VOX1NUUklORyA9IDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVE9LRU5fQU5EID0gMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUT0tFTl9PUiA9IDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVE9LRU5fTk9UID0gMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUT0tFTl9FUSA9IDQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVE9LRU5fTk9UX0VRID0gNTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUT0tFTl9SQlJBQ0UgPSA2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRPS0VOX0xCUkFDRSA9IDc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVE9LRU5fR0UgPSA4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRPS0VOX0xFID0gOTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUT0tFTl9HVCA9IDEwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRPS0VOX0xUID0gMTE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVE9LRU5fRU5EID0gMTI7CisgICAgcHJpdmF0ZSBjaGFyW10gZXhwcjsKKyAgICBwcml2YXRlIGludCB0b2tlblR5cGUgPSBUT0tFTl9TVFJJTkc7CisgICAgcHJpdmF0ZSBTdHJpbmcgdG9rZW5WYWwgPSBudWxsOworICAgIHByaXZhdGUgaW50IGluZGV4OworICAgIHByaXZhdGUgaW50IGxlbmd0aDsKKworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBwYXJzZXIgZm9yIHRoZSBzcGVjaWZpZWQgZXhwcmVzc2lvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgRXhwcmVzc2lvblRva2VuaXplcihTdHJpbmcgZXhwcikgeworICAgICAgICB0aGlzLmV4cHIgPSBleHByLnRyaW0oKS50b0NoYXJBcnJheSgpOworICAgICAgICB0aGlzLmxlbmd0aCA9IHRoaXMuZXhwci5sZW5ndGg7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIG1vcmUgdG9rZW5zLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc01vcmVUb2tlbnMoKSB7CisgICAgICAgIHJldHVybiBpbmRleCA8IGxlbmd0aDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgaW5kZXggZm9yIGVycm9yIHJlcG9ydGluZyBwdXJwb3Nlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEluZGV4KCkgeworICAgICAgICByZXR1cm4gaW5kZXg7CisgICAgfQorCisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc01ldGFDaGFyKGNoYXIgYykgeworICAgICAgICByZXR1cm4gQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjKSB8fCBjID09ICcoJyB8fCBjID09ICcpJyB8fCBjID09ICchJworICAgICAgICAgICAgICAgIHx8IGMgPT0gJzwnIHx8IGMgPT0gJz4nIHx8IGMgPT0gJ3wnIHx8IGMgPT0gJyYnIHx8IGMgPT0gJz0nOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmV4dCB0b2tlbiB0eXBlIGFuZCBpbml0aWFsaXplcyBhbnkgc3RhdGUgdmFyaWFibGVzCisgICAgICogYWNjb3JkaW5nbHkuCisgICAgICovCisgICAgcHVibGljIGludCBuZXh0VG9rZW4oKSB7CisgICAgICAgIC8vIFNraXAgYW55IGxlYWRpbmcgd2hpdGUgc3BhY2UKKyAgICAgICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoICYmIENoYXJhY3Rlci5pc1doaXRlc3BhY2UoZXhwcltpbmRleF0pKQorICAgICAgICAgICAgaW5kZXgrKzsKKyAgICAgICAgLy8gQ2xlYXIgdGhlIGN1cnJlbnQgdG9rZW4gdmFsCisgICAgICAgIHRva2VuVmFsID0gbnVsbDsKKyAgICAgICAgaWYgKGluZGV4ID09IGxlbmd0aCkgcmV0dXJuIFRPS0VOX0VORDsgLy8gRW5kIG9mIHN0cmluZworICAgICAgICBpbnQgc3RhcnQgPSBpbmRleDsKKyAgICAgICAgY2hhciBjdXJyZW50Q2hhciA9IGV4cHJbaW5kZXhdOworICAgICAgICBjaGFyIG5leHRDaGFyID0gKGNoYXIpMDsKKyAgICAgICAgaW5kZXgrKzsKKyAgICAgICAgaWYgKGluZGV4IDwgbGVuZ3RoKSBuZXh0Q2hhciA9IGV4cHJbaW5kZXhdOworICAgICAgICAvLyBDaGVjayBmb3IgYSBrbm93biB0b2tlbiBzdGFydAorICAgICAgICBzd2l0Y2ggKGN1cnJlbnRDaGFyKSB7CisgICAgICAgICAgICBjYXNlICcoJyA6CisgICAgICAgICAgICAgICAgcmV0dXJuIFRPS0VOX0xCUkFDRTsKKyAgICAgICAgICAgIGNhc2UgJyknIDoKKyAgICAgICAgICAgICAgICByZXR1cm4gVE9LRU5fUkJSQUNFOworICAgICAgICAgICAgY2FzZSAnPScgOgorICAgICAgICAgICAgICAgIHJldHVybiBUT0tFTl9FUTsKKyAgICAgICAgICAgIGNhc2UgJyEnIDoKKyAgICAgICAgICAgICAgICBpZiAobmV4dENoYXIgPT0gJz0nKSB7CisgICAgICAgICAgICAgICAgICAgIGluZGV4Kys7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUT0tFTl9OT1RfRVE7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRPS0VOX05PVDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlICd8JyA6CisgICAgICAgICAgICAgICAgaWYgKG5leHRDaGFyID09ICd8JykgeworICAgICAgICAgICAgICAgICAgICBpbmRleCsrOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gVE9LRU5fT1I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnJicgOgorICAgICAgICAgICAgICAgIGlmIChuZXh0Q2hhciA9PSAnJicpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5kZXgrKzsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRPS0VOX0FORDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICc+JyA6CisgICAgICAgICAgICAgICAgaWYgKG5leHRDaGFyID09ICc9JykgeworICAgICAgICAgICAgICAgICAgICBpbmRleCsrOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gVE9LRU5fR0U7IC8vIEdyZWF0ZXIgdGhhbiBvciBlcXVhbAorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUT0tFTl9HVDsgLy8gR3JlYXRlciB0aGFuCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSAnPCcgOgorICAgICAgICAgICAgICAgIGlmIChuZXh0Q2hhciA9PSAnPScpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5kZXgrKzsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRPS0VOX0xFOyAvLyBMZXNzIHRoYW4gb3IgZXF1YWwKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gVE9LRU5fTFQ7IC8vIExlc3MgdGhhbgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmF1bHQgOgorICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSBpdCdzIGEgc3RyaW5nCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaW50IGVuZCA9IGluZGV4OworICAgICAgICAvLyBJZiBpdCdzIGEgcXVvdGVkIHN0cmluZyB0aGVuIGVuZCBpcyB0aGUgbmV4dCB1bmVzY2FwZWQgcXVvdGUKKyAgICAgICAgaWYgKGN1cnJlbnRDaGFyID09ICciJyB8fCBjdXJyZW50Q2hhciA9PSAnXCcnKSB7CisgICAgICAgICAgICBjaGFyIGVuZENoYXIgPSBjdXJyZW50Q2hhcjsKKyAgICAgICAgICAgIGJvb2xlYW4gZXNjYXBlZCA9IGZhbHNlOworICAgICAgICAgICAgc3RhcnQrKzsKKyAgICAgICAgICAgIGZvciAoOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykgeworICAgICAgICAgICAgICAgIGlmIChleHByW2luZGV4XSA9PSAnXFwnICYmICFlc2NhcGVkKSB7CisgICAgICAgICAgICAgICAgICAgIGVzY2FwZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGV4cHJbaW5kZXhdID09IGVuZENoYXIgJiYgIWVzY2FwZWQpIGJyZWFrOworICAgICAgICAgICAgICAgIGVzY2FwZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVuZCA9IGluZGV4OworICAgICAgICAgICAgaW5kZXgrKzsgLy8gU2tpcCB0aGUgZW5kIHF1b3RlCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBFbmQgaXMgdGhlIG5leHQgd2hpdGVzcGFjZSBjaGFyYWN0ZXIKKyAgICAgICAgICAgIGZvciAoOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykgeworICAgICAgICAgICAgICAgIGlmIChpc01ldGFDaGFyKGV4cHJbaW5kZXhdKSkgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbmQgPSBpbmRleDsKKyAgICAgICAgfQorICAgICAgICAvLyBFeHRyYWN0IHRoZSBzdHJpbmcgZnJvbSB0aGUgYXJyYXkKKyAgICAgICAgdGhpcy50b2tlblZhbCA9IG5ldyBTdHJpbmcoZXhwciwgc3RhcnQsIGVuZCAtIHN0YXJ0KTsKKyAgICAgICAgcmV0dXJuIFRPS0VOX1NUUklORzsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIFN0cmluZyB2YWx1ZSBvZiB0aGUgdG9rZW4gaWYgaXQgd2FzIHR5cGUgVE9LRU5fU1RSSU5HLgorICAgICAqIE90aGVyd2lzZSBudWxsIGlzIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VG9rZW5WYWx1ZSgpIHsKKyAgICAgICAgcmV0dXJuIHRva2VuVmFsOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3NpL1Jlc3BvbnNlSW5jbHVkZVdyYXBwZXIuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zc2kvUmVzcG9uc2VJbmNsdWRlV3JhcHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMmQ5ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3NpL1Jlc3BvbnNlSW5jbHVkZVdyYXBwZXIuamF2YQpAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBMaWNlbnNlZCB1bmRlciB0aGUKKyAqIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyAqIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZQorICogYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlCisgKiBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzCisgKiBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlCisgKiBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3NpOworCisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlV3JhcHBlcjsKKy8qKgorICogQSBIdHRwU2VydmxldFJlc3BvbnNlV3JhcHBlciwgdXNlZCBmcm9tCisgKiA8Y29kZT5TU0lTZXJ2bGV0RXh0ZXJuYWxSZXNvbHZlcjwvY29kZT4KKyAqIAorICogQGF1dGhvciBCaXAgVGhlbGluCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kLCAkRGF0ZSQKKyAqLworcHVibGljIGNsYXNzIFJlc3BvbnNlSW5jbHVkZVdyYXBwZXIgZXh0ZW5kcyBIdHRwU2VydmxldFJlc3BvbnNlV3JhcHBlciB7CisgICAgLyoqCisgICAgICogT3VyIFNlcnZsZXRPdXRwdXRTdHJlYW0KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU2VydmxldE91dHB1dFN0cmVhbSBvcmlnaW5hbFNlcnZsZXRPdXRwdXRTdHJlYW07CisgICAgcHJvdGVjdGVkIFNlcnZsZXRPdXRwdXRTdHJlYW0gc2VydmxldE91dHB1dFN0cmVhbTsKKyAgICBwcm90ZWN0ZWQgUHJpbnRXcml0ZXIgcHJpbnRXcml0ZXI7CisKKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemUgb3VyIHdyYXBwZXIgd2l0aCB0aGUgY3VycmVudCBIdHRwU2VydmxldFJlc3BvbnNlIGFuZAorICAgICAqIFNlcnZsZXRPdXRwdXRTdHJlYW0uCisgICAgICogCisgICAgICogQHBhcmFtIHJlcworICAgICAqICAgICAgICAgICAgVGhlIEh0dHBTZXJ2bGV0UmVzcG9uc2UgdG8gdXNlCisgICAgICogQHBhcmFtIG91dAorICAgICAqICAgICAgICAgICAgVGhlIFNlcnZsZXRPdXRwdXRTdHJlYW0nIHRvIHVzZQorICAgICAqLworICAgIHB1YmxpYyBSZXNwb25zZUluY2x1ZGVXcmFwcGVyKEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzLAorICAgICAgICAgICAgU2VydmxldE91dHB1dFN0cmVhbSBvcmlnaW5hbFNlcnZsZXRPdXRwdXRTdHJlYW0pIHsKKyAgICAgICAgc3VwZXIocmVzKTsKKyAgICAgICAgdGhpcy5vcmlnaW5hbFNlcnZsZXRPdXRwdXRTdHJlYW0gPSBvcmlnaW5hbFNlcnZsZXRPdXRwdXRTdHJlYW07CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBGbHVzaCB0aGUgc2VydmxldE91dHB1dFN0cmVhbSBvciBwcmludFdyaXRlciAoIG9ubHkgb25lIHdpbGwgYmUgbm9uLW51bGwgKQorICAgICAqIFRoaXMgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgYSByZXF1ZXN0RGlzcGF0Y2hlci5pbmNsdWRlLCBzaW5jZSB3ZSBjYW4ndAorICAgICAqIGFzc3VtZSB0aGF0IHRoZSBpbmNsdWRlZCBzZXJ2bGV0IGZsdXNoZWQgaXRzIHN0cmVhbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBmbHVzaE91dHB1dFN0cmVhbU9yV3JpdGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHNlcnZsZXRPdXRwdXRTdHJlYW0gIT0gbnVsbCkgeworICAgICAgICAgICAgc2VydmxldE91dHB1dFN0cmVhbS5mbHVzaCgpOworICAgICAgICB9CisgICAgICAgIGlmIChwcmludFdyaXRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBwcmludFdyaXRlci5mbHVzaCgpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBwcmludHdyaXRlciwgdGhyb3dzIGFuZCBleGNlcHRpb24gaWYgYSBPdXRwdXRTdHJlYW0gYWxyZWFkeQorICAgICAqIGJlZW4gcmV0dXJuZWQuCisgICAgICogCisgICAgICogQHJldHVybiBhIFByaW50V3JpdGVyIG9iamVjdAorICAgICAqIEBleGNlcHRpb24gamF2YS5pby5JT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBvdXRwdXRzdHJlYW0gYWxyZWFkeSBiZWVuIGNhbGxlZAorICAgICAqLworICAgIHB1YmxpYyBQcmludFdyaXRlciBnZXRXcml0ZXIoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChzZXJ2bGV0T3V0cHV0U3RyZWFtID09IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChwcmludFdyaXRlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcHJpbnRXcml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIob3JpZ2luYWxTZXJ2bGV0T3V0cHV0U3RyZWFtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBwcmludFdyaXRlcjsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBPdXRwdXRTdHJlYW0sIHRocm93cyBhbmQgZXhjZXB0aW9uIGlmIGEgcHJpbnR3cml0ZXIgYWxyZWFkeQorICAgICAqIGJlZW4gcmV0dXJuZWQuCisgICAgICogCisgICAgICogQHJldHVybiBhIE91dHB1dFN0cmVhbSBvYmplY3QKKyAgICAgKiBAZXhjZXB0aW9uIGphdmEuaW8uSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgcHJpbnR3cml0ZXIgYWxyZWFkeSBiZWVuIGNhbGxlZAorICAgICAqLworICAgIHB1YmxpYyBTZXJ2bGV0T3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHByaW50V3JpdGVyID09IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChzZXJ2bGV0T3V0cHV0U3RyZWFtID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzZXJ2bGV0T3V0cHV0U3RyZWFtID0gb3JpZ2luYWxTZXJ2bGV0T3V0cHV0U3RyZWFtOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHNlcnZsZXRPdXRwdXRTdHJlYW07CisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3NpL1NTSUNvbW1hbmQuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zc2kvU1NJQ29tbWFuZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkYjZmOWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3NpL1NTSUNvbW1hbmQuamF2YQpAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uIExpY2Vuc2VkIHVuZGVyIHRoZQorICogQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorICogZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlCisgKiBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUKKyAqIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMKKyAqIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UKKyAqIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5zc2k7CisKKworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CisvKioKKyAqIFRoZSBpbnRlcmZhY2UgdGhhdCBhbGwgU1NJIGNvbW1hbmRzICggU1NJRWNobywgU1NJSW5jbHVkZSwgLi4uKSBtdXN0CisgKiBpbXBsZW1lbnQuCisgKiAKKyAqIEBhdXRob3IgQmlwIFRoZWxpbgorICogQGF1dGhvciBEYW4gU2FuZGJlcmcKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQsICREYXRlJAorICovCitwdWJsaWMgaW50ZXJmYWNlIFNTSUNvbW1hbmQgeworICAgIC8qKgorICAgICAqIFdyaXRlIHRoZSBvdXRwdXQgb2YgdGhlIGNvbW1hbmQgdG8gdGhlIHdyaXRlci4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc3NpTWVkaWF0b3IKKyAgICAgKiAgICAgICAgICAgIHRoZSBzc2kgbWVkaWF0b3IKKyAgICAgKiBAcGFyYW0gY29tbWFuZE5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBhY3R1YWwgY29tbWFuZCAoIGllLiBlY2hvICkKKyAgICAgKiBAcGFyYW0gcGFyYW1OYW1lcworICAgICAqICAgICAgICAgICAgVGhlIHBhcmFtZXRlciBuYW1lcworICAgICAqIEBwYXJhbSBwYXJhbVZhbHVlcworICAgICAqICAgICAgICAgICAgVGhlIHBhcmFtZXRlciB2YWx1ZXMKKyAgICAgKiBAcGFyYW0gd3JpdGVyCisgICAgICogICAgICAgICAgICB0aGUgd3JpdGVyIHRvIG91dHB1dCB0bworICAgICAqIEB0aHJvd3MgU1NJU3RvcFByb2Nlc3NpbmdFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBTU0kgcHJvY2Vzc2luZyBzaG91bGQgYmUgYWJvcnRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHByb2Nlc3MoU1NJTWVkaWF0b3Igc3NpTWVkaWF0b3IsIFN0cmluZyBjb21tYW5kTmFtZSwKKyAgICAgICAgICAgIFN0cmluZ1tdIHBhcmFtTmFtZXMsIFN0cmluZ1tdIHBhcmFtVmFsdWVzLCBQcmludFdyaXRlciB3cml0ZXIpCisgICAgICAgICAgICB0aHJvd3MgU1NJU3RvcFByb2Nlc3NpbmdFeGNlcHRpb247Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NzaS9TU0lDb25kaXRpb25hbC5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NzaS9TU0lDb25kaXRpb25hbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmZTFkZDgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3NpL1NTSUNvbmRpdGlvbmFsLmphdmEKQEAgLTAsMCArMSwxMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gTGljZW5zZWQgdW5kZXIgdGhlCisgKiBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisgKiBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UKKyAqIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZQorICogbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcworICogZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZQorICogZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnNzaTsKKworCitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLnRleHQuUGFyc2VFeGNlcHRpb247CisvKioKKyAqIFNTSSBjb21tYW5kIHRoYXQgaGFuZGxlcyBhbGwgY29uZGl0aW9uYWwgZGlyZWN0aXZlcy4KKyAqIAorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogQGF1dGhvciBQYXVsIFNwZWVkCisgKi8KK3B1YmxpYyBjbGFzcyBTU0lDb25kaXRpb25hbCBpbXBsZW1lbnRzIFNTSUNvbW1hbmQgeworICAgIC8qKgorICAgICAqIEBzZWUgU1NJQ29tbWFuZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHByb2Nlc3MoU1NJTWVkaWF0b3Igc3NpTWVkaWF0b3IsIFN0cmluZyBjb21tYW5kTmFtZSwKKyAgICAgICAgICAgIFN0cmluZ1tdIHBhcmFtTmFtZXMsIFN0cmluZ1tdIHBhcmFtVmFsdWVzLCBQcmludFdyaXRlciB3cml0ZXIpCisgICAgICAgICAgICB0aHJvd3MgU1NJU3RvcFByb2Nlc3NpbmdFeGNlcHRpb24geworICAgICAgICAvLyBSZXRyaWV2ZSB0aGUgY3VycmVudCBzdGF0ZSBpbmZvcm1hdGlvbgorICAgICAgICBTU0lDb25kaXRpb25hbFN0YXRlIHN0YXRlID0gc3NpTWVkaWF0b3IuZ2V0Q29uZGl0aW9uYWxTdGF0ZSgpOworICAgICAgICBpZiAoImlmIi5lcXVhbHNJZ25vcmVDYXNlKGNvbW1hbmROYW1lKSkgeworICAgICAgICAgICAgLy8gRG8gbm90aGluZyBpZiB3ZSBhcmUgbmVzdGVkIGluIGEgZmFsc2UgYnJhbmNoCisgICAgICAgICAgICAvLyBleGNlcHQgY291bnQgaXQKKyAgICAgICAgICAgIGlmIChzdGF0ZS5wcm9jZXNzQ29uZGl0aW9uYWxDb21tYW5kc09ubHkpIHsKKyAgICAgICAgICAgICAgICBzdGF0ZS5uZXN0aW5nQ291bnQrKzsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0ZS5uZXN0aW5nQ291bnQgPSAwOworICAgICAgICAgICAgLy8gRXZhbHVhdGUgdGhlIGV4cHJlc3Npb24KKyAgICAgICAgICAgIGlmIChldmFsdWF0ZUFyZ3VtZW50cyhwYXJhbU5hbWVzLCBwYXJhbVZhbHVlcywgc3NpTWVkaWF0b3IpKSB7CisgICAgICAgICAgICAgICAgLy8gTm8gbW9yZSBicmFuY2hlcyBjYW4gYmUgdGFrZW4gZm9yIHRoaXMgaWYgYmxvY2sKKyAgICAgICAgICAgICAgICBzdGF0ZS5icmFuY2hUYWtlbiA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIERvIG5vdCBwcm9jZXNzIHRoaXMgYnJhbmNoCisgICAgICAgICAgICAgICAgc3RhdGUucHJvY2Vzc0NvbmRpdGlvbmFsQ29tbWFuZHNPbmx5ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBzdGF0ZS5icmFuY2hUYWtlbiA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKCJlbGlmIi5lcXVhbHNJZ25vcmVDYXNlKGNvbW1hbmROYW1lKSkgeworICAgICAgICAgICAgLy8gTm8gbmVlZCB0byBldmVuIGV4ZWN1dGUgaWYgd2UgYXJlIG5lc3RlZCBpbgorICAgICAgICAgICAgLy8gYSBmYWxzZSBicmFuY2gKKyAgICAgICAgICAgIGlmIChzdGF0ZS5uZXN0aW5nQ291bnQgPiAwKSByZXR1cm47CisgICAgICAgICAgICAvLyBJZiBhIGJyYW5jaCB3YXMgYWxyZWFkeSB0YWtlbiBpbiB0aGlzIGlmIGJsb2NrCisgICAgICAgICAgICAvLyB0aGVuIGRpc2FibGUgb3V0cHV0IGFuZCByZXR1cm4KKyAgICAgICAgICAgIGlmIChzdGF0ZS5icmFuY2hUYWtlbikgeworICAgICAgICAgICAgICAgIHN0YXRlLnByb2Nlc3NDb25kaXRpb25hbENvbW1hbmRzT25seSA9IHRydWU7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gRXZhbHVhdGUgdGhlIGV4cHJlc3Npb24KKyAgICAgICAgICAgIGlmIChldmFsdWF0ZUFyZ3VtZW50cyhwYXJhbU5hbWVzLCBwYXJhbVZhbHVlcywgc3NpTWVkaWF0b3IpKSB7CisgICAgICAgICAgICAgICAgLy8gVHVybiBiYWNrIG9uIG91dHB1dCBhbmQgbWFyayB0aGUgYnJhbmNoCisgICAgICAgICAgICAgICAgc3RhdGUucHJvY2Vzc0NvbmRpdGlvbmFsQ29tbWFuZHNPbmx5ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgc3RhdGUuYnJhbmNoVGFrZW4gPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBEbyBub3QgcHJvY2VzcyB0aGlzIGJyYW5jaAorICAgICAgICAgICAgICAgIHN0YXRlLnByb2Nlc3NDb25kaXRpb25hbENvbW1hbmRzT25seSA9IHRydWU7CisgICAgICAgICAgICAgICAgc3RhdGUuYnJhbmNoVGFrZW4gPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICgiZWxzZSIuZXF1YWxzSWdub3JlQ2FzZShjb21tYW5kTmFtZSkpIHsKKyAgICAgICAgICAgIC8vIE5vIG5lZWQgdG8gZXZlbiBleGVjdXRlIGlmIHdlIGFyZSBuZXN0ZWQgaW4KKyAgICAgICAgICAgIC8vIGEgZmFsc2UgYnJhbmNoCisgICAgICAgICAgICBpZiAoc3RhdGUubmVzdGluZ0NvdW50ID4gMCkgcmV0dXJuOworICAgICAgICAgICAgLy8gSWYgd2UndmUgYWxyZWFkeSB0YWtlbiBhbm90aGVyIGJyYW5jaCB0aGVuCisgICAgICAgICAgICAvLyBkaXNhYmxlIG91dHB1dCBvdGhlcndpc2UgZW5hYmxlIGl0LgorICAgICAgICAgICAgc3RhdGUucHJvY2Vzc0NvbmRpdGlvbmFsQ29tbWFuZHNPbmx5ID0gc3RhdGUuYnJhbmNoVGFrZW47CisgICAgICAgICAgICAvLyBBbmQgaW4gYW55IGNhc2UsIGl0J3Mgc2FmZSB0byBzYXkgYSBicmFuY2gKKyAgICAgICAgICAgIC8vIGhhcyBiZWVuIHRha2VuLgorICAgICAgICAgICAgc3RhdGUuYnJhbmNoVGFrZW4gPSB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKCJlbmRpZiIuZXF1YWxzSWdub3JlQ2FzZShjb21tYW5kTmFtZSkpIHsKKyAgICAgICAgICAgIC8vIElmIHdlIGFyZSBuZXN0ZWQgaW5zaWRlIGEgZmFsc2UgYnJhbmNoIHRoZW4gcG9wIG91dAorICAgICAgICAgICAgLy8gb25lIGxldmVsIG9uIHRoZSBuZXN0aW5nIGNvdW50CisgICAgICAgICAgICBpZiAoc3RhdGUubmVzdGluZ0NvdW50ID4gMCkgeworICAgICAgICAgICAgICAgIHN0YXRlLm5lc3RpbmdDb3VudC0tOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFR1cm4gb3V0cHV0IGJhY2sgb24KKyAgICAgICAgICAgIHN0YXRlLnByb2Nlc3NDb25kaXRpb25hbENvbW1hbmRzT25seSA9IGZhbHNlOworICAgICAgICAgICAgLy8gUmVzZXQgdGhlIGJyYW5jaCBzdGF0dXMgZm9yIGFueSBvdXRlciBpZiBibG9ja3MsCisgICAgICAgICAgICAvLyBzaW5jZSBjbGVhcmx5IHdlIHRvb2sgYSBicmFuY2ggdG8gaGF2ZSBnb3R0ZW4gaGVyZQorICAgICAgICAgICAgLy8gaW4gdGhlIGZpcnN0IHBsYWNlLgorICAgICAgICAgICAgc3RhdGUuYnJhbmNoVGFrZW4gPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNTSVN0b3BQcm9jZXNzaW5nRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAvL3Rocm93IG5ldyBTc2lDb21tYW5kRXhjZXB0aW9uKCAiTm90IGEgY29uZGl0aW9uYWwgY29tbWFuZDoiICsKKyAgICAgICAgICAgIC8vIGNtZE5hbWUgKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSBleHByZXNzaW9uIGZyb20gdGhlIHNwZWNpZmllZCBhcmd1bWVudHMgYW5kIHBlZm9ybXMgdGhlCisgICAgICogbmVjZXNzYXJ5IGV2YWx1YXRpb24gc3RlcHMuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGV2YWx1YXRlQXJndW1lbnRzKFN0cmluZ1tdIG5hbWVzLCBTdHJpbmdbXSB2YWx1ZXMsCisgICAgICAgICAgICBTU0lNZWRpYXRvciBzc2lNZWRpYXRvcikgdGhyb3dzIFNTSVN0b3BQcm9jZXNzaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGV4cHIgPSBnZXRFeHByZXNzaW9uKG5hbWVzLCB2YWx1ZXMpOworICAgICAgICBpZiAoZXhwciA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgU1NJU3RvcFByb2Nlc3NpbmdFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIC8vdGhyb3cgbmV3IFNzaUNvbW1hbmRFeGNlcHRpb24oICJObyBleHByZXNzaW9uIHNwZWNpZmllZC4iICk7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEV4cHJlc3Npb25QYXJzZVRyZWUgdHJlZSA9IG5ldyBFeHByZXNzaW9uUGFyc2VUcmVlKGV4cHIsCisgICAgICAgICAgICAgICAgICAgIHNzaU1lZGlhdG9yKTsKKyAgICAgICAgICAgIHJldHVybiB0cmVlLmV2YWx1YXRlVHJlZSgpOworICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvL3Rocm93IG5ldyBTc2lDb21tYW5kRXhjZXB0aW9uKCAiRXJyb3IgcGFyc2luZyBleHByZXNzaW9uLiIgKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBTU0lTdG9wUHJvY2Vzc2luZ0V4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSAiZXhwciIgaWYgdGhlIGFyZyBuYW1lIGlzIGFwcHJvcHJpYXRlLCBvdGhlcndpc2UgcmV0dXJucworICAgICAqIG51bGwuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0RXhwcmVzc2lvbihTdHJpbmdbXSBwYXJhbU5hbWVzLCBTdHJpbmdbXSBwYXJhbVZhbHVlcykgeworICAgICAgICBpZiAoImV4cHIiLmVxdWFsc0lnbm9yZUNhc2UocGFyYW1OYW1lc1swXSkpIHJldHVybiBwYXJhbVZhbHVlc1swXTsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zc2kvU1NJQ29uZGl0aW9uYWxTdGF0ZS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NzaS9TU0lDb25kaXRpb25hbFN0YXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFjMWRiNgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zc2kvU1NJQ29uZGl0aW9uYWxTdGF0ZS5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gTGljZW5zZWQgdW5kZXIgdGhlCisgKiBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisgKiBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UKKyAqIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZQorICogbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcworICogZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZQorICogZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnNzaTsKKworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgdXNlZCBieSBTU0lNZWRpYXRvciBhbmQgU1NJQ29uZGl0aW9uYWwgdG8ga2VlcCB0cmFjayBvZiBzdGF0ZQorICogaW5mb3JtYXRpb24gbmVjZXNzYXJ5IHRvIHByb2Nlc3MgdGhlIG5lc3RlZCBjb25kaXRpb25hbCBjb21tYW5kcyAoIGlmLCBlbGlmLAorICogZWxzZSwgZW5kaWYgKS4KKyAqIAorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogQGF1dGhvciBEYW4gU2FuZGJlcmcKKyAqIEBhdXRob3IgUGF1bCBTcGVlZAorICovCitjbGFzcyBTU0lDb25kaXRpb25hbFN0YXRlIHsKKyAgICAvKioKKyAgICAgKiBTZXQgdG8gdHJ1ZSBpZiB0aGUgY3VycmVudCBjb25kaXRpb25hbCBoYXMgYWxyZWFkeSBiZWVuIGNvbXBsZXRlZCwgaS5lLjoKKyAgICAgKiBhIGJyYW5jaCB3YXMgdGFrZW4uCisgICAgICovCisgICAgYm9vbGVhbiBicmFuY2hUYWtlbiA9IGZhbHNlOworICAgIC8qKgorICAgICAqIENvdW50cyB0aGUgbnVtYmVyIG9mIG5lc3RlZCBmYWxzZSBicmFuY2hlcy4KKyAgICAgKi8KKyAgICBpbnQgbmVzdGluZ0NvdW50ID0gMDsKKyAgICAvKioKKyAgICAgKiBTZXQgdG8gdHJ1ZSBpZiBvbmx5IGNvbmRpdGlvbmFsIGNvbW1hbmRzICggaWYsIGVsaWYsIGVsc2UsIGVuZGlmICkKKyAgICAgKiBzaG91bGQgYmUgcHJvY2Vzc2VkLgorICAgICAqLworICAgIGJvb2xlYW4gcHJvY2Vzc0NvbmRpdGlvbmFsQ29tbWFuZHNPbmx5ID0gZmFsc2U7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NzaS9TU0lDb25maWcuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zc2kvU1NJQ29uZmlnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBiODE3ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zc2kvU1NJQ29uZmlnLmphdmEKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBMaWNlbnNlZCB1bmRlciB0aGUKKyAqIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyAqIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZQorICogYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlCisgKiBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzCisgKiBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlCisgKiBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3NpOworCisKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworLyoqCisgKiBJbXBsZW1lbnRzIHRoZSBTZXJ2ZXItc2lkZSAjZXhlYyBjb21tYW5kCisgKiAKKyAqIEBhdXRob3IgQmlwIFRoZWxpbgorICogQGF1dGhvciBQYXVsIFNwZWVkCisgKiBAYXV0aG9yIERhbiBTYW5kYmVyZworICogQHZlcnNpb24gJFJldmlzaW9uJCwgJERhdGUkCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBTU0lDb25maWcgaW1wbGVtZW50cyBTU0lDb21tYW5kIHsKKyAgICAvKioKKyAgICAgKiBAc2VlIFNTSUNvbW1hbmQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwcm9jZXNzKFNTSU1lZGlhdG9yIHNzaU1lZGlhdG9yLCBTdHJpbmcgY29tbWFuZE5hbWUsCisgICAgICAgICAgICBTdHJpbmdbXSBwYXJhbU5hbWVzLCBTdHJpbmdbXSBwYXJhbVZhbHVlcywgUHJpbnRXcml0ZXIgd3JpdGVyKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1OYW1lcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgU3RyaW5nIHBhcmFtTmFtZSA9IHBhcmFtTmFtZXNbaV07CisgICAgICAgICAgICBTdHJpbmcgcGFyYW1WYWx1ZSA9IHBhcmFtVmFsdWVzW2ldOworICAgICAgICAgICAgU3RyaW5nIHN1YnN0aXR1dGVkVmFsdWUgPSBzc2lNZWRpYXRvcgorICAgICAgICAgICAgICAgICAgICAuc3Vic3RpdHV0ZVZhcmlhYmxlcyhwYXJhbVZhbHVlKTsKKyAgICAgICAgICAgIGlmIChwYXJhbU5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiZXJybXNnIikpIHsKKyAgICAgICAgICAgICAgICBzc2lNZWRpYXRvci5zZXRDb25maWdFcnJNc2coc3Vic3RpdHV0ZWRWYWx1ZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJzaXplZm10IikpIHsKKyAgICAgICAgICAgICAgICBzc2lNZWRpYXRvci5zZXRDb25maWdTaXplRm10KHN1YnN0aXR1dGVkVmFsdWUpOworICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbU5hbWUuZXF1YWxzSWdub3JlQ2FzZSgidGltZWZtdCIpKSB7CisgICAgICAgICAgICAgICAgc3NpTWVkaWF0b3Iuc2V0Q29uZmlnVGltZUZtdChzdWJzdGl0dXRlZFZhbHVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3NpTWVkaWF0b3IubG9nKCIjY29uZmlnLS1JbnZhbGlkIGF0dHJpYnV0ZTogIiArIHBhcmFtTmFtZSk7CisgICAgICAgICAgICAgICAgLy9XZSBuZWVkIHRvIGZldGNoIHRoaXMgdmFsdWUgZWFjaCB0aW1lLCBzaW5jZSBpdCBtYXkgY2hhbmdlCisgICAgICAgICAgICAgICAgLy8gZHVyaW5nIHRoZQorICAgICAgICAgICAgICAgIC8vIGxvb3AKKyAgICAgICAgICAgICAgICBTdHJpbmcgY29uZmlnRXJyTXNnID0gc3NpTWVkaWF0b3IuZ2V0Q29uZmlnRXJyTXNnKCk7CisgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKGNvbmZpZ0Vyck1zZyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NzaS9TU0lFY2hvLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3NpL1NTSUVjaG8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzcxYzgwCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NzaS9TU0lFY2hvLmphdmEKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBMaWNlbnNlZCB1bmRlciB0aGUKKyAqIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyAqIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZQorICogYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlCisgKiBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzCisgKiBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlCisgKiBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3NpOworCisKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworLyoqCisgKiBSZXR1cm4gdGhlIHJlc3VsdCBhc3NvY2lhdGVkIHdpdGggdGhlIHN1cHBsaWVkIFNlcnZlciBWYXJpYWJsZS4KKyAqIAorICogQGF1dGhvciBCaXAgVGhlbGluCisgKiBAYXV0aG9yIFBhdWwgU3BlZWQKKyAqIEBhdXRob3IgRGFuIFNhbmRiZXJnCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kLCAkRGF0ZSQKKyAqLworcHVibGljIGNsYXNzIFNTSUVjaG8gaW1wbGVtZW50cyBTU0lDb21tYW5kIHsKKyAgICBwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBERUZBVUxUX0VOQ09ESU5HID0gImVudGl0eSI7CisgICAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgTUlTU0lOR19WQVJJQUJMRV9WQUxVRSA9ICIobm9uZSkiOworCisKKyAgICAvKioKKyAgICAgKiBAc2VlIFNTSUNvbW1hbmQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwcm9jZXNzKFNTSU1lZGlhdG9yIHNzaU1lZGlhdG9yLCBTdHJpbmcgY29tbWFuZE5hbWUsCisgICAgICAgICAgICBTdHJpbmdbXSBwYXJhbU5hbWVzLCBTdHJpbmdbXSBwYXJhbVZhbHVlcywgUHJpbnRXcml0ZXIgd3JpdGVyKSB7CisgICAgICAgIFN0cmluZyBlbmNvZGluZyA9IERFRkFVTFRfRU5DT0RJTkc7CisgICAgICAgIFN0cmluZyBlcnJvck1lc3NhZ2UgPSBzc2lNZWRpYXRvci5nZXRDb25maWdFcnJNc2coKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbU5hbWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBTdHJpbmcgcGFyYW1OYW1lID0gcGFyYW1OYW1lc1tpXTsKKyAgICAgICAgICAgIFN0cmluZyBwYXJhbVZhbHVlID0gcGFyYW1WYWx1ZXNbaV07CisgICAgICAgICAgICBpZiAocGFyYW1OYW1lLmVxdWFsc0lnbm9yZUNhc2UoInZhciIpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHZhcmlhYmxlVmFsdWUgPSBzc2lNZWRpYXRvci5nZXRWYXJpYWJsZVZhbHVlKAorICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1WYWx1ZSwgZW5jb2RpbmcpOworICAgICAgICAgICAgICAgIGlmICh2YXJpYWJsZVZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVWYWx1ZSA9IE1JU1NJTkdfVkFSSUFCTEVfVkFMVUU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZSh2YXJpYWJsZVZhbHVlKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW1OYW1lLmVxdWFsc0lnbm9yZUNhc2UoImVuY29kaW5nIikpIHsKKyAgICAgICAgICAgICAgICBpZiAoaXNWYWxpZEVuY29kaW5nKHBhcmFtVmFsdWUpKSB7CisgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nID0gcGFyYW1WYWx1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzc2lNZWRpYXRvci5sb2coIiNlY2hvLS1JbnZhbGlkIGVuY29kaW5nOiAiICsgcGFyYW1WYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZShlcnJvck1lc3NhZ2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3NpTWVkaWF0b3IubG9nKCIjZWNoby0tSW52YWxpZCBhdHRyaWJ1dGU6ICIgKyBwYXJhbU5hbWUpOworICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZShlcnJvck1lc3NhZ2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1ZhbGlkRW5jb2RpbmcoU3RyaW5nIGVuY29kaW5nKSB7CisgICAgICAgIHJldHVybiBlbmNvZGluZy5lcXVhbHNJZ25vcmVDYXNlKCJ1cmwiKQorICAgICAgICAgICAgICAgIHx8IGVuY29kaW5nLmVxdWFsc0lnbm9yZUNhc2UoImVudGl0eSIpCisgICAgICAgICAgICAgICAgfHwgZW5jb2RpbmcuZXF1YWxzSWdub3JlQ2FzZSgibm9uZSIpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3NpL1NTSUV4ZWMuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zc2kvU1NJRXhlYy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5YTAzNjYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3NpL1NTSUV4ZWMuamF2YQpAQCAtMCwwICsxLDcyIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uIExpY2Vuc2VkIHVuZGVyIHRoZQorICogQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorICogZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlCisgKiBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUKKyAqIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMKKyAqIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UKKyAqIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5zc2k7CisKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLklPVG9vbHM7CisvKioKKyAqIEltcGxlbWVudHMgdGhlIFNlcnZlci1zaWRlICNleGVjIGNvbW1hbmQKKyAqIAorICogQGF1dGhvciBCaXAgVGhlbGluCisgKiBAYXV0aG9yIEFteSBSb2gKKyAqIEBhdXRob3IgUGF1bCBTcGVlZAorICogQGF1dGhvciBEYW4gU2FuZGJlcmcKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQsICREYXRlJAorICovCitwdWJsaWMgY2xhc3MgU1NJRXhlYyBpbXBsZW1lbnRzIFNTSUNvbW1hbmQgeworICAgIHByb3RlY3RlZCBTU0lJbmNsdWRlIHNzaUluY2x1ZGUgPSBuZXcgU1NJSW5jbHVkZSgpOworICAgIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgaW50IEJVRkZFUl9TSVpFID0gMTAyNDsKKworCisgICAgLyoqCisgICAgICogQHNlZSBTU0lDb21tYW5kCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHJvY2VzcyhTU0lNZWRpYXRvciBzc2lNZWRpYXRvciwgU3RyaW5nIGNvbW1hbmROYW1lLAorICAgICAgICAgICAgU3RyaW5nW10gcGFyYW1OYW1lcywgU3RyaW5nW10gcGFyYW1WYWx1ZXMsIFByaW50V3JpdGVyIHdyaXRlcikgeworICAgICAgICBTdHJpbmcgY29uZmlnRXJyTXNnID0gc3NpTWVkaWF0b3IuZ2V0Q29uZmlnRXJyTXNnKCk7CisgICAgICAgIFN0cmluZyBwYXJhbU5hbWUgPSBwYXJhbU5hbWVzWzBdOworICAgICAgICBTdHJpbmcgcGFyYW1WYWx1ZSA9IHBhcmFtVmFsdWVzWzBdOworICAgICAgICBTdHJpbmcgc3Vic3RpdHV0ZWRWYWx1ZSA9IHNzaU1lZGlhdG9yLnN1YnN0aXR1dGVWYXJpYWJsZXMocGFyYW1WYWx1ZSk7CisgICAgICAgIGlmIChwYXJhbU5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiY2dpIikpIHsKKyAgICAgICAgICAgIHNzaUluY2x1ZGUucHJvY2Vzcyhzc2lNZWRpYXRvciwgImluY2x1ZGUiLAorICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW117InZpcnR1YWwifSwgbmV3IFN0cmluZ1tde3N1YnN0aXR1dGVkVmFsdWV9LAorICAgICAgICAgICAgICAgICAgICB3cml0ZXIpOworICAgICAgICB9IGVsc2UgaWYgKHBhcmFtTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJjbWQiKSkgeworICAgICAgICAgICAgYm9vbGVhbiBmb3VuZFByb2dyYW0gPSBmYWxzZTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgUnVudGltZSBydCA9IFJ1bnRpbWUuZ2V0UnVudGltZSgpOworICAgICAgICAgICAgICAgIFByb2Nlc3MgcHJvYyA9IHJ0LmV4ZWMoc3Vic3RpdHV0ZWRWYWx1ZSk7CisgICAgICAgICAgICAgICAgZm91bmRQcm9ncmFtID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBCdWZmZXJlZFJlYWRlciBzdGRPdXRSZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSW5wdXRTdHJlYW1SZWFkZXIocHJvYy5nZXRJbnB1dFN0cmVhbSgpKSk7CisgICAgICAgICAgICAgICAgQnVmZmVyZWRSZWFkZXIgc3RkRXJyUmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IElucHV0U3RyZWFtUmVhZGVyKHByb2MuZ2V0RXJyb3JTdHJlYW0oKSkpOworICAgICAgICAgICAgICAgIGNoYXJbXSBidWYgPSBuZXcgY2hhcltCVUZGRVJfU0laRV07CisgICAgICAgICAgICAgICAgSU9Ub29scy5mbG93KHN0ZEVyclJlYWRlciwgd3JpdGVyLCBidWYpOworICAgICAgICAgICAgICAgIElPVG9vbHMuZmxvdyhzdGRPdXRSZWFkZXIsIHdyaXRlciwgYnVmKTsKKyAgICAgICAgICAgICAgICBwcm9jLndhaXRGb3IoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBzc2lNZWRpYXRvci5sb2coIkNvdWxkbid0IGV4ZWMgZmlsZTogIiArIHN1YnN0aXR1dGVkVmFsdWUsIGUpOworICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZShjb25maWdFcnJNc2cpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGlmICghZm91bmRQcm9ncmFtKSB7CisgICAgICAgICAgICAgICAgICAgIC8vYXBhY2hlIGRvZXNuJ3Qgb3V0cHV0IGFuIGVycm9yIG1lc3NhZ2UgaWYgaXQgY2FuJ3QgZmluZAorICAgICAgICAgICAgICAgICAgICAvLyBhIHByb2dyYW0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3NpTWVkaWF0b3IubG9nKCJDb3VsZG4ndCBleGVjIGZpbGU6ICIgKyBzdWJzdGl0dXRlZFZhbHVlLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3NpL1NTSUV4dGVybmFsUmVzb2x2ZXIuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zc2kvU1NJRXh0ZXJuYWxSZXNvbHZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzNjRkOGQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3NpL1NTSUV4dGVybmFsUmVzb2x2ZXIuamF2YQpAQCAtMCwwICsxLDcxIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uIExpY2Vuc2VkIHVuZGVyIHRoZQorICogQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorICogZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlCisgKiBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUKKyAqIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMKKyAqIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UKKyAqIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5zc2k7CisKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CisvKioKKyAqIEludGVyZmFjZSB1c2VkIGJ5IFNTSU1lZGlhdG9yIHRvIHRhbGsgdG8gdGhlICdvdXRzaWRlIHdvcmxkJyAoIHVzdWFsbHkgYQorICogc2VydmxldCApCisgKiAKKyAqIEBhdXRob3IgRGFuIFNhbmRiZXJnCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kLCAkRGF0ZSQKKyAqLworcHVibGljIGludGVyZmFjZSBTU0lFeHRlcm5hbFJlc29sdmVyIHsKKyAgICAvKioKKyAgICAgKiBBZGRzIGFueSBleHRlcm5hbCB2YXJpYWJsZXMgdG8gdGhlIHZhcmlhYmxlTmFtZXMgY29sbGVjdGlvbi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdmFyaWFibGVOYW1lcworICAgICAqICAgICAgICAgICAgdGhlIGNvbGxlY3Rpb24gdG8gYWRkIHRvCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkVmFyaWFibGVOYW1lcyhDb2xsZWN0aW9uIHZhcmlhYmxlTmFtZXMpOworCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFZhcmlhYmxlVmFsdWUoU3RyaW5nIG5hbWUpOworCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG5hbWVkIHZhcmlhYmxlIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuIElmIHZhbHVlIGlzIG51bGwsIHRoZW4KKyAgICAgKiB0aGUgdmFyaWFibGUgd2lsbCBiZSByZW1vdmVkICggaWUuIGEgY2FsbCB0byBnZXRWYXJpYWJsZVZhbHVlIHdpbGwKKyAgICAgKiByZXR1cm4gbnVsbCApCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKiAgICAgICAgICAgIG9mIHRoZSB2YXJpYWJsZQorICAgICAqIEBwYXJhbSB2YWx1ZQorICAgICAqICAgICAgICAgICAgb2YgdGhlIHZhcmlhYmxlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VmFyaWFibGVWYWx1ZShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY3VycmVudCBkYXRlLiBUaGlzIGlzIHVzZWZ1bCBmb3IgcHV0dGluZyB0aGUgU1NJIHN0dWZmIGluIGEKKyAgICAgKiByZWdyZXNzaW9uIHRlc3QuIFNpbmNlIHlvdSBjYW4gbWFrZSB0aGUgY3VycmVudCBkYXRlIGEgY29uc3RhbnQsIGl0CisgICAgICogbWFrZXMgdGVzdGluZyBlYXNpZXIgc2luY2UgdGhlIG91dHB1dCB3b24ndCBjaGFuZ2UuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgZGF0YQorICAgICAqLworICAgIHB1YmxpYyBEYXRlIGdldEN1cnJlbnREYXRlKCk7CisKKworICAgIHB1YmxpYyBsb25nIGdldEZpbGVTaXplKFN0cmluZyBwYXRoLCBib29sZWFuIHZpcnR1YWwpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworCisgICAgcHVibGljIGxvbmcgZ2V0RmlsZUxhc3RNb2RpZmllZChTdHJpbmcgcGF0aCwgYm9vbGVhbiB2aXJ0dWFsKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uOworCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEZpbGVUZXh0KFN0cmluZyBwYXRoLCBib29sZWFuIHZpcnR1YWwpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworCisgICAgcHVibGljIHZvaWQgbG9nKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgdGhyb3dhYmxlKTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3NpL1NTSUZsYXN0bW9kLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3NpL1NTSUZsYXN0bW9kLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk1OTUxNQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zc2kvU1NJRmxhc3Rtb2QuamF2YQpAQCAtMCwwICsxLDY4IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uIExpY2Vuc2VkIHVuZGVyIHRoZQorICogQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorICogZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlCisgKiBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUKKyAqIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMKKyAqIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UKKyAqIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5zc2k7CisKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuRGF0ZVRvb2w7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLlN0cmZ0aW1lOworLyoqCisgKiBJbXBsZW1lbnRzIHRoZSBTZXJ2ZXItc2lkZSAjZmxhc3Rtb2QgY29tbWFuZAorICogCisgKiBAYXV0aG9yIEJpcCBUaGVsaW4KKyAqIEBhdXRob3IgUGF1bCBTcGVlZAorICogQGF1dGhvciBEYW4gU2FuZGJlcmcKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQsICREYXRlJAorICovCitwdWJsaWMgZmluYWwgY2xhc3MgU1NJRmxhc3Rtb2QgaW1wbGVtZW50cyBTU0lDb21tYW5kIHsKKyAgICAvKioKKyAgICAgKiBAc2VlIFNTSUNvbW1hbmQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwcm9jZXNzKFNTSU1lZGlhdG9yIHNzaU1lZGlhdG9yLCBTdHJpbmcgY29tbWFuZE5hbWUsCisgICAgICAgICAgICBTdHJpbmdbXSBwYXJhbU5hbWVzLCBTdHJpbmdbXSBwYXJhbVZhbHVlcywgUHJpbnRXcml0ZXIgd3JpdGVyKSB7CisgICAgICAgIFN0cmluZyBjb25maWdFcnJNc2cgPSBzc2lNZWRpYXRvci5nZXRDb25maWdFcnJNc2coKTsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbU5hbWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBTdHJpbmcgcGFyYW1OYW1lID0gcGFyYW1OYW1lc1tpXTsKKyAgICAgICAgICAgIFN0cmluZyBwYXJhbVZhbHVlID0gcGFyYW1WYWx1ZXNbaV07CisgICAgICAgICAgICBTdHJpbmcgc3Vic3RpdHV0ZWRWYWx1ZSA9IHNzaU1lZGlhdG9yCisgICAgICAgICAgICAgICAgICAgIC5zdWJzdGl0dXRlVmFyaWFibGVzKHBhcmFtVmFsdWUpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAocGFyYW1OYW1lLmVxdWFsc0lnbm9yZUNhc2UoImZpbGUiKQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgcGFyYW1OYW1lLmVxdWFsc0lnbm9yZUNhc2UoInZpcnR1YWwiKSkgeworICAgICAgICAgICAgICAgICAgICBib29sZWFuIHZpcnR1YWwgPSBwYXJhbU5hbWUuZXF1YWxzSWdub3JlQ2FzZSgidmlydHVhbCIpOworICAgICAgICAgICAgICAgICAgICBsb25nIGxhc3RNb2RpZmllZCA9IHNzaU1lZGlhdG9yLmdldEZpbGVMYXN0TW9kaWZpZWQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic3RpdHV0ZWRWYWx1ZSwgdmlydHVhbCk7CisgICAgICAgICAgICAgICAgICAgIERhdGUgZGF0ZSA9IG5ldyBEYXRlKGxhc3RNb2RpZmllZCk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjb25maWdUaW1lRm10ID0gc3NpTWVkaWF0b3IuZ2V0Q29uZmlnVGltZUZtdCgpOworICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoZm9ybWF0RGF0ZShkYXRlLCBjb25maWdUaW1lRm10KSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc3NpTWVkaWF0b3IubG9nKCIjZmxhc3Rtb2QtLUludmFsaWQgYXR0cmlidXRlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwYXJhbU5hbWUpOworICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoY29uZmlnRXJyTXNnKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgc3NpTWVkaWF0b3IubG9nKAorICAgICAgICAgICAgICAgICAgICAgICAgIiNmbGFzdG1vZC0tQ291bGRuJ3QgZ2V0IGxhc3QgbW9kaWZpZWQgZm9yIGZpbGU6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzdWJzdGl0dXRlZFZhbHVlLCBlKTsKKyAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoY29uZmlnRXJyTXNnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHJvdGVjdGVkIFN0cmluZyBmb3JtYXREYXRlKERhdGUgZGF0ZSwgU3RyaW5nIGNvbmZpZ1RpbWVGbXQpIHsKKyAgICAgICAgU3RyZnRpbWUgc3RyZnRpbWUgPSBuZXcgU3RyZnRpbWUoY29uZmlnVGltZUZtdCwgRGF0ZVRvb2wuTE9DQUxFX1VTKTsKKyAgICAgICAgcmV0dXJuIHN0cmZ0aW1lLmZvcm1hdChkYXRlKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NzaS9TU0lGc2l6ZS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NzaS9TU0lGc2l6ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExZDcxNzYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3NpL1NTSUZzaXplLmphdmEKQEAgLTAsMCArMSwxMTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gTGljZW5zZWQgdW5kZXIgdGhlCisgKiBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisgKiBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UKKyAqIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZQorICogbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcworICogZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZQorICogZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnNzaTsKKworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEudGV4dC5EZWNpbWFsRm9ybWF0OworLyoqCisgKiBJbXBsZW1lbnRzIHRoZSBTZXJ2ZXItc2lkZSAjZnNpemUgY29tbWFuZAorICogCisgKiBAYXV0aG9yIEJpcCBUaGVsaW4KKyAqIEBhdXRob3IgUGF1bCBTcGVlZAorICogQGF1dGhvciBEYW4gU2FuZGJlcmcKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQsICREYXRlJAorICovCitwdWJsaWMgZmluYWwgY2xhc3MgU1NJRnNpemUgaW1wbGVtZW50cyBTU0lDb21tYW5kIHsKKyAgICBwcm90ZWN0ZWQgZmluYWwgc3RhdGljIGludCBPTkVfS0lMT0JZVEUgPSAxMDI0OworICAgIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgaW50IE9ORV9NRUdBQllURSA9IDEwMjQgKiAxMDI0OworCisKKyAgICAvKioKKyAgICAgKiBAc2VlIFNTSUNvbW1hbmQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwcm9jZXNzKFNTSU1lZGlhdG9yIHNzaU1lZGlhdG9yLCBTdHJpbmcgY29tbWFuZE5hbWUsCisgICAgICAgICAgICBTdHJpbmdbXSBwYXJhbU5hbWVzLCBTdHJpbmdbXSBwYXJhbVZhbHVlcywgUHJpbnRXcml0ZXIgd3JpdGVyKSB7CisgICAgICAgIFN0cmluZyBjb25maWdFcnJNc2cgPSBzc2lNZWRpYXRvci5nZXRDb25maWdFcnJNc2coKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbU5hbWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBTdHJpbmcgcGFyYW1OYW1lID0gcGFyYW1OYW1lc1tpXTsKKyAgICAgICAgICAgIFN0cmluZyBwYXJhbVZhbHVlID0gcGFyYW1WYWx1ZXNbaV07CisgICAgICAgICAgICBTdHJpbmcgc3Vic3RpdHV0ZWRWYWx1ZSA9IHNzaU1lZGlhdG9yCisgICAgICAgICAgICAgICAgICAgIC5zdWJzdGl0dXRlVmFyaWFibGVzKHBhcmFtVmFsdWUpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAocGFyYW1OYW1lLmVxdWFsc0lnbm9yZUNhc2UoImZpbGUiKQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgcGFyYW1OYW1lLmVxdWFsc0lnbm9yZUNhc2UoInZpcnR1YWwiKSkgeworICAgICAgICAgICAgICAgICAgICBib29sZWFuIHZpcnR1YWwgPSBwYXJhbU5hbWUuZXF1YWxzSWdub3JlQ2FzZSgidmlydHVhbCIpOworICAgICAgICAgICAgICAgICAgICBsb25nIHNpemUgPSBzc2lNZWRpYXRvci5nZXRGaWxlU2l6ZShzdWJzdGl0dXRlZFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpcnR1YWwpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY29uZmlnU2l6ZUZtdCA9IHNzaU1lZGlhdG9yLmdldENvbmZpZ1NpemVGbXQoKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKGZvcm1hdFNpemUoc2l6ZSwgY29uZmlnU2l6ZUZtdCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHNzaU1lZGlhdG9yLmxvZygiI2ZzaXplLS1JbnZhbGlkIGF0dHJpYnV0ZTogIiArIHBhcmFtTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZShjb25maWdFcnJNc2cpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBzc2lNZWRpYXRvci5sb2coIiNmc2l6ZS0tQ291bGRuJ3QgZ2V0IHNpemUgZm9yIGZpbGU6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgc3Vic3RpdHV0ZWRWYWx1ZSwgZSk7CisgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKGNvbmZpZ0Vyck1zZyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHB1YmxpYyBTdHJpbmcgcmVwZWF0KGNoYXIgYUNoYXIsIGludCBudW1DaGFycykgeworICAgICAgICBpZiAobnVtQ2hhcnMgPCAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJOdW0gY2hhcnMgY2FuJ3QgYmUgbmVnYXRpdmUiKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUNoYXJzOyBpKyspIHsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoYUNoYXIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBTdHJpbmcgcGFkTGVmdChTdHJpbmcgc3RyLCBpbnQgbWF4Q2hhcnMpIHsKKyAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHN0cjsKKyAgICAgICAgaW50IGNoYXJzVG9BZGQgPSBtYXhDaGFycyAtIHN0ci5sZW5ndGgoKTsKKyAgICAgICAgaWYgKGNoYXJzVG9BZGQgPiAwKSB7CisgICAgICAgICAgICByZXN1bHQgPSByZXBlYXQoJyAnLCBjaGFyc1RvQWRkKSArIHN0cjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworCisgICAgLy9XZSB0cnkgdG8gbWltaWNrIEFwYWNoZSBoZXJlLCBhcyB3ZSBkbyBldmVyeXdoZXJlCisgICAgLy9BbGwgdGhlICdtYWdpYycgbnVtYmVycyBhcmUgZnJvbSB0aGUgdXRpbF9zY3JpcHQuYyBBcGFjaGUgc291cmNlIGZpbGUuCisgICAgcHJvdGVjdGVkIFN0cmluZyBmb3JtYXRTaXplKGxvbmcgc2l6ZSwgU3RyaW5nIGZvcm1hdCkgeworICAgICAgICBTdHJpbmcgcmV0U3RyaW5nID0gIiI7CisgICAgICAgIGlmIChmb3JtYXQuZXF1YWxzSWdub3JlQ2FzZSgiYnl0ZXMiKSkgeworICAgICAgICAgICAgRGVjaW1hbEZvcm1hdCBkZWNpbWFsRm9ybWF0ID0gbmV3IERlY2ltYWxGb3JtYXQoIiMsIyMwIik7CisgICAgICAgICAgICByZXRTdHJpbmcgPSBkZWNpbWFsRm9ybWF0LmZvcm1hdChzaXplKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChzaXplID09IDApIHsKKyAgICAgICAgICAgICAgICByZXRTdHJpbmcgPSAiMGsiOworICAgICAgICAgICAgfSBlbHNlIGlmIChzaXplIDwgT05FX0tJTE9CWVRFKSB7CisgICAgICAgICAgICAgICAgcmV0U3RyaW5nID0gIjFrIjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc2l6ZSA8IE9ORV9NRUdBQllURSkgeworICAgICAgICAgICAgICAgIHJldFN0cmluZyA9IExvbmcudG9TdHJpbmcoKHNpemUgKyA1MTIpIC8gT05FX0tJTE9CWVRFKTsKKyAgICAgICAgICAgICAgICByZXRTdHJpbmcgKz0gImsiOworICAgICAgICAgICAgfSBlbHNlIGlmIChzaXplIDwgOTkgKiBPTkVfTUVHQUJZVEUpIHsKKyAgICAgICAgICAgICAgICBEZWNpbWFsRm9ybWF0IGRlY2ltYWxGb3JtYXQgPSBuZXcgRGVjaW1hbEZvcm1hdCgiMC4wTSIpOworICAgICAgICAgICAgICAgIHJldFN0cmluZyA9IGRlY2ltYWxGb3JtYXQuZm9ybWF0KHNpemUgLyAoZG91YmxlKU9ORV9NRUdBQllURSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldFN0cmluZyA9IExvbmcudG9TdHJpbmcoKHNpemUgKyAoNTI5ICogT05FX0tJTE9CWVRFKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8gT05FX01FR0FCWVRFKTsKKyAgICAgICAgICAgICAgICByZXRTdHJpbmcgKz0gIk0iOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0U3RyaW5nID0gcGFkTGVmdChyZXRTdHJpbmcsIDUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXRTdHJpbmc7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zc2kvU1NJSW5jbHVkZS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NzaS9TU0lJbmNsdWRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFjNWFkOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zc2kvU1NJSW5jbHVkZS5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gTGljZW5zZWQgdW5kZXIgdGhlCisgKiBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisgKiBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UKKyAqIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZQorICogbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcworICogZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZQorICogZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnNzaTsKKworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworLyoqCisgKiBJbXBsZW1lbnRzIHRoZSBTZXJ2ZXItc2lkZSAjaW5jbHVkZSBjb21tYW5kCisgKiAKKyAqIEBhdXRob3IgQmlwIFRoZWxpbgorICogQGF1dGhvciBQYXVsIFNwZWVkCisgKiBAYXV0aG9yIERhbiBTYW5kYmVyZworICogQHZlcnNpb24gJFJldmlzaW9uJCwgJERhdGUkCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBTU0lJbmNsdWRlIGltcGxlbWVudHMgU1NJQ29tbWFuZCB7CisgICAgLyoqCisgICAgICogQHNlZSBTU0lDb21tYW5kCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHJvY2VzcyhTU0lNZWRpYXRvciBzc2lNZWRpYXRvciwgU3RyaW5nIGNvbW1hbmROYW1lLAorICAgICAgICAgICAgU3RyaW5nW10gcGFyYW1OYW1lcywgU3RyaW5nW10gcGFyYW1WYWx1ZXMsIFByaW50V3JpdGVyIHdyaXRlcikgeworICAgICAgICBTdHJpbmcgY29uZmlnRXJyTXNnID0gc3NpTWVkaWF0b3IuZ2V0Q29uZmlnRXJyTXNnKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1OYW1lcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgU3RyaW5nIHBhcmFtTmFtZSA9IHBhcmFtTmFtZXNbaV07CisgICAgICAgICAgICBTdHJpbmcgcGFyYW1WYWx1ZSA9IHBhcmFtVmFsdWVzW2ldOworICAgICAgICAgICAgU3RyaW5nIHN1YnN0aXR1dGVkVmFsdWUgPSBzc2lNZWRpYXRvcgorICAgICAgICAgICAgICAgICAgICAuc3Vic3RpdHV0ZVZhcmlhYmxlcyhwYXJhbVZhbHVlKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYgKHBhcmFtTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJmaWxlIikKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IHBhcmFtTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJ2aXJ0dWFsIikpIHsKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB2aXJ0dWFsID0gcGFyYW1OYW1lLmVxdWFsc0lnbm9yZUNhc2UoInZpcnR1YWwiKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRleHQgPSBzc2lNZWRpYXRvci5nZXRGaWxlVGV4dChzdWJzdGl0dXRlZFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpcnR1YWwpOworICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUodGV4dCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc3NpTWVkaWF0b3IubG9nKCIjaW5jbHVkZS0tSW52YWxpZCBhdHRyaWJ1dGU6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHBhcmFtTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZShjb25maWdFcnJNc2cpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBzc2lNZWRpYXRvci5sb2coIiNpbmNsdWRlLS1Db3VsZG4ndCBpbmNsdWRlIGZpbGU6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgc3Vic3RpdHV0ZWRWYWx1ZSwgZSk7CisgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKGNvbmZpZ0Vyck1zZyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NzaS9TU0lNZWRpYXRvci5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NzaS9TU0lNZWRpYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxYmEzMzQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3NpL1NTSU1lZGlhdG9yLmphdmEKQEAgLTAsMCArMSwzMjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gTGljZW5zZWQgdW5kZXIgdGhlCisgKiBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisgKiBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UKKyAqIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZQorICogbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcworICogZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZQorICogZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnNzaTsKKworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuVGltZVpvbmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLkRhdGVUb29sOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5TdHJmdGltZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuVVJMRW5jb2RlcjsKKy8qKgorICogQWxsb3dzIHRoZSBkaWZmZXJlbnQgU1NJQ29tbWFuZCBpbXBsZW1lbnRhdGlvbnMgdG8gc2hhcmUgZGF0YS90YWxrIHRvIGVhY2gKKyAqIG90aGVyCisgKiAKKyAqIEBhdXRob3IgQmlwIFRoZWxpbgorICogQGF1dGhvciBBbXkgUm9oCisgKiBAYXV0aG9yIFBhdWwgU3BlZWQKKyAqIEBhdXRob3IgRGFuIFNhbmRiZXJnCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kLCAkRGF0ZSQKKyAqLworcHVibGljIGNsYXNzIFNTSU1lZGlhdG9yIHsKKyAgICBwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBERUZBVUxUX0NPTkZJR19FUlJfTVNHID0gIlthbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBwcm9jZXNzaW5nIHRoaXMgZGlyZWN0aXZlXSI7CisgICAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgREVGQVVMVF9DT05GSUdfVElNRV9GTVQgPSAiJUEsICVkLSViLSVZICVUICVaIjsKKyAgICBwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBERUZBVUxUX0NPTkZJR19TSVpFX0ZNVCA9ICJhYmJyZXYiOworICAgIHByb3RlY3RlZCBzdGF0aWMgVVJMRW5jb2RlciB1cmxFbmNvZGVyOworICAgIHByb3RlY3RlZCBTdHJpbmcgY29uZmlnRXJyTXNnID0gREVGQVVMVF9DT05GSUdfRVJSX01TRzsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGNvbmZpZ1RpbWVGbXQgPSBERUZBVUxUX0NPTkZJR19USU1FX0ZNVDsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGNvbmZpZ1NpemVGbXQgPSBERUZBVUxUX0NPTkZJR19TSVpFX0ZNVDsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGNsYXNzTmFtZSA9IGdldENsYXNzKCkuZ2V0TmFtZSgpOworICAgIHByb3RlY3RlZCBTU0lFeHRlcm5hbFJlc29sdmVyIHNzaUV4dGVybmFsUmVzb2x2ZXI7CisgICAgcHJvdGVjdGVkIERhdGUgbGFzdE1vZGlmaWVkRGF0ZTsKKyAgICBwcm90ZWN0ZWQgaW50IGRlYnVnOworICAgIHByb3RlY3RlZCBTdHJmdGltZSBzdHJmdGltZTsKKyAgICBwcm90ZWN0ZWQgU1NJQ29uZGl0aW9uYWxTdGF0ZSBjb25kaXRpb25hbFN0YXRlID0gbmV3IFNTSUNvbmRpdGlvbmFsU3RhdGUoKTsKKyAgICBzdGF0aWMgeworICAgICAgICAvL1dlIHRyeSB0byBlbmNvZGUgb25seSB0aGUgc2FtZSBjaGFyYWN0ZXJzIHRoYXQgYXBhY2hlIGRvZXMKKyAgICAgICAgdXJsRW5jb2RlciA9IG5ldyBVUkxFbmNvZGVyKCk7CisgICAgICAgIHVybEVuY29kZXIuYWRkU2FmZUNoYXJhY3RlcignLCcpOworICAgICAgICB1cmxFbmNvZGVyLmFkZFNhZmVDaGFyYWN0ZXIoJzonKTsKKyAgICAgICAgdXJsRW5jb2Rlci5hZGRTYWZlQ2hhcmFjdGVyKCctJyk7CisgICAgICAgIHVybEVuY29kZXIuYWRkU2FmZUNoYXJhY3RlcignXycpOworICAgICAgICB1cmxFbmNvZGVyLmFkZFNhZmVDaGFyYWN0ZXIoJy4nKTsKKyAgICAgICAgdXJsRW5jb2Rlci5hZGRTYWZlQ2hhcmFjdGVyKCcqJyk7CisgICAgICAgIHVybEVuY29kZXIuYWRkU2FmZUNoYXJhY3RlcignLycpOworICAgICAgICB1cmxFbmNvZGVyLmFkZFNhZmVDaGFyYWN0ZXIoJyEnKTsKKyAgICAgICAgdXJsRW5jb2Rlci5hZGRTYWZlQ2hhcmFjdGVyKCd+Jyk7CisgICAgICAgIHVybEVuY29kZXIuYWRkU2FmZUNoYXJhY3RlcignXCcnKTsKKyAgICAgICAgdXJsRW5jb2Rlci5hZGRTYWZlQ2hhcmFjdGVyKCcoJyk7CisgICAgICAgIHVybEVuY29kZXIuYWRkU2FmZUNoYXJhY3RlcignKScpOworICAgIH0KKworCisgICAgcHVibGljIFNTSU1lZGlhdG9yKFNTSUV4dGVybmFsUmVzb2x2ZXIgc3NpRXh0ZXJuYWxSZXNvbHZlciwKKyAgICAgICAgICAgIERhdGUgbGFzdE1vZGlmaWVkRGF0ZSwgaW50IGRlYnVnKSB7CisgICAgICAgIHRoaXMuc3NpRXh0ZXJuYWxSZXNvbHZlciA9IHNzaUV4dGVybmFsUmVzb2x2ZXI7CisgICAgICAgIHRoaXMubGFzdE1vZGlmaWVkRGF0ZSA9IGxhc3RNb2RpZmllZERhdGU7CisgICAgICAgIHRoaXMuZGVidWcgPSBkZWJ1ZzsKKyAgICAgICAgc2V0Q29uZmlnVGltZUZtdChERUZBVUxUX0NPTkZJR19USU1FX0ZNVCwgdHJ1ZSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXRDb25maWdFcnJNc2coU3RyaW5nIGNvbmZpZ0Vyck1zZykgeworICAgICAgICB0aGlzLmNvbmZpZ0Vyck1zZyA9IGNvbmZpZ0Vyck1zZzsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldENvbmZpZ1RpbWVGbXQoU3RyaW5nIGNvbmZpZ1RpbWVGbXQpIHsKKyAgICAgICAgc2V0Q29uZmlnVGltZUZtdChjb25maWdUaW1lRm10LCBmYWxzZSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXRDb25maWdUaW1lRm10KFN0cmluZyBjb25maWdUaW1lRm10LCBib29sZWFuIGZyb21Db25zdHJ1Y3RvcikgeworICAgICAgICB0aGlzLmNvbmZpZ1RpbWVGbXQgPSBjb25maWdUaW1lRm10OworICAgICAgICAvL1doYXQncyB0aGUgc3RvcnkgaGVyZSB3aXRoIERhdGVUb29sLkxPQ0FMRV9VUz8/IFdoeT8/CisgICAgICAgIHRoaXMuc3RyZnRpbWUgPSBuZXcgU3RyZnRpbWUoY29uZmlnVGltZUZtdCwgRGF0ZVRvb2wuTE9DQUxFX1VTKTsKKyAgICAgICAgLy9WYXJpYWJsZXMgbGlrZSBEQVRFX0xPQ0FMLCBEQVRFX0dNVCwgYW5kIExBU1RfTU9ESUZJRUQgbmVlZCB0byBiZQorICAgICAgICAvLyB1cGRhdGVkIHdoZW4KKyAgICAgICAgLy90aGUgdGltZWZtdCBjaGFuZ2VzLiBUaGlzIGlzIHdoYXQgQXBhY2hlIFNTSSBkb2VzLgorICAgICAgICBzZXREYXRlVmFyaWFibGVzKGZyb21Db25zdHJ1Y3Rvcik7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXRDb25maWdTaXplRm10KFN0cmluZyBjb25maWdTaXplRm10KSB7CisgICAgICAgIHRoaXMuY29uZmlnU2l6ZUZtdCA9IGNvbmZpZ1NpemVGbXQ7CisgICAgfQorCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbmZpZ0Vyck1zZygpIHsKKyAgICAgICAgcmV0dXJuIGNvbmZpZ0Vyck1zZzsKKyAgICB9CisKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29uZmlnVGltZUZtdCgpIHsKKyAgICAgICAgcmV0dXJuIGNvbmZpZ1RpbWVGbXQ7CisgICAgfQorCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbmZpZ1NpemVGbXQoKSB7CisgICAgICAgIHJldHVybiBjb25maWdTaXplRm10OworICAgIH0KKworCisgICAgcHVibGljIFNTSUNvbmRpdGlvbmFsU3RhdGUgZ2V0Q29uZGl0aW9uYWxTdGF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIGNvbmRpdGlvbmFsU3RhdGU7CisgICAgfQorCisKKyAgICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRWYXJpYWJsZU5hbWVzKCkgeworICAgICAgICBTZXQgdmFyaWFibGVOYW1lcyA9IG5ldyBIYXNoU2V0KCk7CisgICAgICAgIC8vVGhlc2UgYnVpbHQtaW4gdmFyaWFibGVzIGFyZSBzdXBwbGllZCBieSB0aGUgbWVkaWF0b3IgKCBpZiBub3QKKyAgICAgICAgLy8gb3Zlci13cml0dGVuIGJ5CisgICAgICAgIC8vIHRoZSB1c2VyICkgYW5kIGFsd2F5cyBleGlzdAorICAgICAgICB2YXJpYWJsZU5hbWVzLmFkZCgiREFURV9HTVQiKTsKKyAgICAgICAgdmFyaWFibGVOYW1lcy5hZGQoIkRBVEVfTE9DQUwiKTsKKyAgICAgICAgdmFyaWFibGVOYW1lcy5hZGQoIkxBU1RfTU9ESUZJRUQiKTsKKyAgICAgICAgc3NpRXh0ZXJuYWxSZXNvbHZlci5hZGRWYXJpYWJsZU5hbWVzKHZhcmlhYmxlTmFtZXMpOworICAgICAgICAvL1JlbW92ZSBhbnkgdmFyaWFibGVzIHRoYXQgYXJlIHJlc2VydmVkIGJ5IHRoaXMgY2xhc3MKKyAgICAgICAgSXRlcmF0b3IgaXRlciA9IHZhcmlhYmxlTmFtZXMuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpaXRlci5uZXh0KCk7CisgICAgICAgICAgICBpZiAoaXNOYW1lUmVzZXJ2ZWQobmFtZSkpIHsKKyAgICAgICAgICAgICAgICBpdGVyLnJlbW92ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB2YXJpYWJsZU5hbWVzOworICAgIH0KKworCisgICAgcHVibGljIGxvbmcgZ2V0RmlsZVNpemUoU3RyaW5nIHBhdGgsIGJvb2xlYW4gdmlydHVhbCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHNzaUV4dGVybmFsUmVzb2x2ZXIuZ2V0RmlsZVNpemUocGF0aCwgdmlydHVhbCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgbG9uZyBnZXRGaWxlTGFzdE1vZGlmaWVkKFN0cmluZyBwYXRoLCBib29sZWFuIHZpcnR1YWwpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gc3NpRXh0ZXJuYWxSZXNvbHZlci5nZXRGaWxlTGFzdE1vZGlmaWVkKHBhdGgsIHZpcnR1YWwpOworICAgIH0KKworCisgICAgcHVibGljIFN0cmluZyBnZXRGaWxlVGV4dChTdHJpbmcgcGF0aCwgYm9vbGVhbiB2aXJ0dWFsKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gc3NpRXh0ZXJuYWxSZXNvbHZlci5nZXRGaWxlVGV4dChwYXRoLCB2aXJ0dWFsKTsKKyAgICB9CisKKworICAgIHByb3RlY3RlZCBib29sZWFuIGlzTmFtZVJlc2VydmVkKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHJldHVybiBuYW1lLnN0YXJ0c1dpdGgoY2xhc3NOYW1lICsgIi4iKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFyaWFibGVWYWx1ZShTdHJpbmcgdmFyaWFibGVOYW1lKSB7CisgICAgICAgIHJldHVybiBnZXRWYXJpYWJsZVZhbHVlKHZhcmlhYmxlTmFtZSwgIm5vbmUiKTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldFZhcmlhYmxlVmFsdWUoU3RyaW5nIHZhcmlhYmxlTmFtZSwgU3RyaW5nIHZhcmlhYmxlVmFsdWUpIHsKKyAgICAgICAgaWYgKCFpc05hbWVSZXNlcnZlZCh2YXJpYWJsZU5hbWUpKSB7CisgICAgICAgICAgICBzc2lFeHRlcm5hbFJlc29sdmVyLnNldFZhcmlhYmxlVmFsdWUodmFyaWFibGVOYW1lLCB2YXJpYWJsZVZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHVibGljIFN0cmluZyBnZXRWYXJpYWJsZVZhbHVlKFN0cmluZyB2YXJpYWJsZU5hbWUsIFN0cmluZyBlbmNvZGluZykgeworICAgICAgICBTdHJpbmcgbG93ZXJDYXNlVmFyaWFibGVOYW1lID0gdmFyaWFibGVOYW1lLnRvTG93ZXJDYXNlKCk7CisgICAgICAgIFN0cmluZyB2YXJpYWJsZVZhbHVlID0gbnVsbDsKKyAgICAgICAgaWYgKCFpc05hbWVSZXNlcnZlZChsb3dlckNhc2VWYXJpYWJsZU5hbWUpKSB7CisgICAgICAgICAgICAvL1RyeSBnZXR0aW5nIGl0IGV4dGVybmFsbHkgZmlyc3QsIGlmIGl0IGZhaWxzLCB0cnkgZ2V0dGluZyB0aGUKKyAgICAgICAgICAgIC8vICdidWlsdC1pbicKKyAgICAgICAgICAgIC8vIHZhbHVlCisgICAgICAgICAgICB2YXJpYWJsZVZhbHVlID0gc3NpRXh0ZXJuYWxSZXNvbHZlci5nZXRWYXJpYWJsZVZhbHVlKHZhcmlhYmxlTmFtZSk7CisgICAgICAgICAgICBpZiAodmFyaWFibGVWYWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdmFyaWFibGVOYW1lID0gdmFyaWFibGVOYW1lLnRvVXBwZXJDYXNlKCk7CisgICAgICAgICAgICAgICAgdmFyaWFibGVWYWx1ZSA9IChTdHJpbmcpc3NpRXh0ZXJuYWxSZXNvbHZlcgorICAgICAgICAgICAgICAgICAgICAgICAgLmdldFZhcmlhYmxlVmFsdWUoY2xhc3NOYW1lICsgIi4iICsgdmFyaWFibGVOYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh2YXJpYWJsZVZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB2YXJpYWJsZVZhbHVlID0gZW5jb2RlKHZhcmlhYmxlVmFsdWUsIGVuY29kaW5nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdmFyaWFibGVWYWx1ZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEFwcGxpZXMgdmFyaWFibGUgc3Vic3RpdHV0aW9uIHRvIHRoZSBzcGVjaWZpZWQgU3RyaW5nIGFuZCByZXR1cm5zIHRoZQorICAgICAqIG5ldyByZXNvbHZlZCBzdHJpbmcuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBzdWJzdGl0dXRlVmFyaWFibGVzKFN0cmluZyB2YWwpIHsKKyAgICAgICAgLy8gSWYgaXQgaGFzIG5vIHZhcmlhYmxlIHJlZmVyZW5jZXMgdGhlbiBubyB3b3JrCisgICAgICAgIC8vIG5lZWQgdG8gYmUgZG9uZQorICAgICAgICBpZiAodmFsLmluZGV4T2YoJyQnKSA8IDApIHJldHVybiB2YWw7CisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIodmFsKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzYi5sZW5ndGgoKTspIHsKKyAgICAgICAgICAgIC8vIEZpbmQgdGhlIG5leHQgJAorICAgICAgICAgICAgZm9yICg7IGkgPCBzYi5sZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKHNiLmNoYXJBdChpKSA9PSAnJCcpIHsKKyAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaSA9PSBzYi5sZW5ndGgoKSkgYnJlYWs7CisgICAgICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlICQgaXMgZXNjYXBlZAorICAgICAgICAgICAgaWYgKGkgPiAxICYmIHNiLmNoYXJBdChpIC0gMikgPT0gJ1xcJykgeworICAgICAgICAgICAgICAgIHNiLmRlbGV0ZUNoYXJBdChpIC0gMik7CisgICAgICAgICAgICAgICAgaS0tOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IG5hbWVTdGFydCA9IGk7CisgICAgICAgICAgICBpbnQgc3RhcnQgPSBpIC0gMTsKKyAgICAgICAgICAgIGludCBlbmQgPSAtMTsKKyAgICAgICAgICAgIGludCBuYW1lRW5kID0gLTE7CisgICAgICAgICAgICBjaGFyIGVuZENoYXIgPSAnICc7CisgICAgICAgICAgICAvLyBDaGVjayBmb3Ige30gd3JhcHBlZCB2YXIKKyAgICAgICAgICAgIGlmIChzYi5jaGFyQXQoaSkgPT0gJ3snKSB7CisgICAgICAgICAgICAgICAgbmFtZVN0YXJ0Kys7CisgICAgICAgICAgICAgICAgZW5kQ2hhciA9ICd9JzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEZpbmQgdGhlIGVuZCBvZiB0aGUgdmFyIHJlZmVyZW5jZQorICAgICAgICAgICAgZm9yICg7IGkgPCBzYi5sZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKHNiLmNoYXJBdChpKSA9PSBlbmRDaGFyKSBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVuZCA9IGk7CisgICAgICAgICAgICBuYW1lRW5kID0gZW5kOworICAgICAgICAgICAgaWYgKGVuZENoYXIgPT0gJ30nKSBlbmQrKzsKKyAgICAgICAgICAgIC8vIFdlIHNob3VsZCBub3cgaGF2ZSBlbm91Z2ggdG8gZXh0cmFjdCB0aGUgdmFyIG5hbWUKKyAgICAgICAgICAgIFN0cmluZyB2YXJOYW1lID0gc2Iuc3Vic3RyaW5nKG5hbWVTdGFydCwgbmFtZUVuZCk7CisgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBnZXRWYXJpYWJsZVZhbHVlKHZhck5hbWUpOworICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHZhbHVlID0gIiI7CisgICAgICAgICAgICAvLyBSZXBsYWNlIHRoZSB2YXIgbmFtZSB3aXRoIGl0cyB2YWx1ZQorICAgICAgICAgICAgc2IucmVwbGFjZShzdGFydCwgZW5kLCB2YWx1ZSk7CisgICAgICAgICAgICAvLyBTdGFydCBzZWFyY2hpbmcgZm9yIHRoZSBuZXh0ICQgYWZ0ZXIgdGhlIHZhbHVlCisgICAgICAgICAgICAvLyB0aGF0IHdhcyBqdXN0IHN1YnN0aXR1dGVkLgorICAgICAgICAgICAgaSA9IHN0YXJ0ICsgdmFsdWUubGVuZ3RoKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorCisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGZvcm1hdERhdGUoRGF0ZSBkYXRlLCBUaW1lWm9uZSB0aW1lWm9uZSkgeworICAgICAgICBTdHJpbmcgcmV0VmFsOworICAgICAgICBpZiAodGltZVpvbmUgIT0gbnVsbCkgeworICAgICAgICAgICAgLy93ZSB0ZW1wb3JhcmlseSBjaGFuZ2Ugc3RyZnRpbWUuIFNpbmNlIFNTSU1lZGlhdG9yIGlzIGluaGVyZW50bHkKKyAgICAgICAgICAgIC8vIHNpbmdsZS10aHJlYWRlZCwgdGhpcworICAgICAgICAgICAgLy9pc24ndCBhIHByb2JsZW0KKyAgICAgICAgICAgIFRpbWVab25lIG9sZFRpbWVab25lID0gc3RyZnRpbWUuZ2V0VGltZVpvbmUoKTsKKyAgICAgICAgICAgIHN0cmZ0aW1lLnNldFRpbWVab25lKHRpbWVab25lKTsKKyAgICAgICAgICAgIHJldFZhbCA9IHN0cmZ0aW1lLmZvcm1hdChkYXRlKTsKKyAgICAgICAgICAgIHN0cmZ0aW1lLnNldFRpbWVab25lKG9sZFRpbWVab25lKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldFZhbCA9IHN0cmZ0aW1lLmZvcm1hdChkYXRlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0VmFsOworICAgIH0KKworCisgICAgcHJvdGVjdGVkIFN0cmluZyBlbmNvZGUoU3RyaW5nIHZhbHVlLCBTdHJpbmcgZW5jb2RpbmcpIHsKKyAgICAgICAgU3RyaW5nIHJldFZhbCA9IG51bGw7CisgICAgICAgIGlmIChlbmNvZGluZy5lcXVhbHNJZ25vcmVDYXNlKCJ1cmwiKSkgeworICAgICAgICAgICAgcmV0VmFsID0gdXJsRW5jb2Rlci5lbmNvZGUodmFsdWUpOworICAgICAgICB9IGVsc2UgaWYgKGVuY29kaW5nLmVxdWFsc0lnbm9yZUNhc2UoIm5vbmUiKSkgeworICAgICAgICAgICAgcmV0VmFsID0gdmFsdWU7CisgICAgICAgIH0gZWxzZSBpZiAoZW5jb2RpbmcuZXF1YWxzSWdub3JlQ2FzZSgiZW50aXR5IikpIHsKKyAgICAgICAgICAgIC8vTm90IHN1cmUgaG93IHRoaXMgaXMgcmVhbGx5IGRpZmZlcmVudCB0aGFuIG5vbmUKKyAgICAgICAgICAgIHJldFZhbCA9IHZhbHVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy9UaGlzIHNob3VsZG4ndCBiZSBwb3NzaWJsZQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biBlbmNvZGluZzogIiArIGVuY29kaW5nKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0VmFsOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgbG9nKFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgIHNzaUV4dGVybmFsUmVzb2x2ZXIubG9nKG1lc3NhZ2UsIG51bGwpOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgbG9nKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgdGhyb3dhYmxlKSB7CisgICAgICAgIHNzaUV4dGVybmFsUmVzb2x2ZXIubG9nKG1lc3NhZ2UsIHRocm93YWJsZSk7CisgICAgfQorCisKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXREYXRlVmFyaWFibGVzKGJvb2xlYW4gZnJvbUNvbnN0cnVjdG9yKSB7CisgICAgICAgIGJvb2xlYW4gYWxyZWFkeVNldCA9IHNzaUV4dGVybmFsUmVzb2x2ZXIuZ2V0VmFyaWFibGVWYWx1ZShjbGFzc05hbWUKKyAgICAgICAgICAgICAgICArICIuYWxyZWFkeXNldCIpICE9IG51bGw7CisgICAgICAgIC8vc2tpcCB0aGlzIGlmIHdlIGFyZSBiZWluZyBjYWxsZWQgZnJvbSB0aGUgY29uc3RydWN0b3IsIGFuZCB0aGlzIGhhcworICAgICAgICAvLyBhbHJlYWR5CisgICAgICAgIC8vIGJlZW4gc2V0CisgICAgICAgIGlmICghKGZyb21Db25zdHJ1Y3RvciAmJiBhbHJlYWR5U2V0KSkgeworICAgICAgICAgICAgc3NpRXh0ZXJuYWxSZXNvbHZlci5zZXRWYXJpYWJsZVZhbHVlKGNsYXNzTmFtZSArICIuYWxyZWFkeXNldCIsCisgICAgICAgICAgICAgICAgICAgICJ0cnVlIik7CisgICAgICAgICAgICBEYXRlIGRhdGUgPSBuZXcgRGF0ZSgpOworICAgICAgICAgICAgVGltZVpvbmUgdGltZVpvbmUgPSBUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01UIik7CisgICAgICAgICAgICBTdHJpbmcgcmV0VmFsID0gZm9ybWF0RGF0ZShkYXRlLCB0aW1lWm9uZSk7CisgICAgICAgICAgICAvL0lmIHdlIGFyZSBzZXR0aW5nIG9uIG9mIHRoZSBkYXRlIHZhcmlhYmxlcywgd2Ugd2FudCB0byByZW1vdmUKKyAgICAgICAgICAgIC8vIHRoZW0gZnJvbSB0aGUKKyAgICAgICAgICAgIC8vIHVzZXIKKyAgICAgICAgICAgIC8vZGVmaW5lZCBsaXN0IG9mIHZhcmlhYmxlcywgYmVjYXVzZSB0aGlzIGlzIHdoYXQgQXBhY2hlIGRvZXMKKyAgICAgICAgICAgIHNldFZhcmlhYmxlVmFsdWUoIkRBVEVfR01UIiwgbnVsbCk7CisgICAgICAgICAgICBzc2lFeHRlcm5hbFJlc29sdmVyLnNldFZhcmlhYmxlVmFsdWUoY2xhc3NOYW1lICsgIi5EQVRFX0dNVCIsCisgICAgICAgICAgICAgICAgICAgIHJldFZhbCk7CisgICAgICAgICAgICByZXRWYWwgPSBmb3JtYXREYXRlKGRhdGUsIG51bGwpOworICAgICAgICAgICAgc2V0VmFyaWFibGVWYWx1ZSgiREFURV9MT0NBTCIsIG51bGwpOworICAgICAgICAgICAgc3NpRXh0ZXJuYWxSZXNvbHZlci5zZXRWYXJpYWJsZVZhbHVlKGNsYXNzTmFtZSArICIuREFURV9MT0NBTCIsCisgICAgICAgICAgICAgICAgICAgIHJldFZhbCk7CisgICAgICAgICAgICByZXRWYWwgPSBmb3JtYXREYXRlKGxhc3RNb2RpZmllZERhdGUsIG51bGwpOworICAgICAgICAgICAgc2V0VmFyaWFibGVWYWx1ZSgiTEFTVF9NT0RJRklFRCIsIG51bGwpOworICAgICAgICAgICAgc3NpRXh0ZXJuYWxSZXNvbHZlci5zZXRWYXJpYWJsZVZhbHVlKGNsYXNzTmFtZSArICIuTEFTVF9NT0RJRklFRCIsCisgICAgICAgICAgICAgICAgICAgIHJldFZhbCk7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NzaS9TU0lQcmludGVudi5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NzaS9TU0lQcmludGVudi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlY2E4YWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3NpL1NTSVByaW50ZW52LmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBMaWNlbnNlZCB1bmRlciB0aGUKKyAqIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyAqIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZQorICogYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlCisgKiBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzCisgKiBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlCisgKiBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3NpOworCisKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKy8qKgorICogSW1wbGVtZW50cyB0aGUgU2VydmVyLXNpZGUgI3ByaW50ZW52IGNvbW1hbmQKKyAqIAorICogQGF1dGhvciBEYW4gU2FuZGJlcmcKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQsICREYXRlJAorICovCitwdWJsaWMgY2xhc3MgU1NJUHJpbnRlbnYgaW1wbGVtZW50cyBTU0lDb21tYW5kIHsKKyAgICAvKioKKyAgICAgKiBAc2VlIFNTSUNvbW1hbmQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwcm9jZXNzKFNTSU1lZGlhdG9yIHNzaU1lZGlhdG9yLCBTdHJpbmcgY29tbWFuZE5hbWUsCisgICAgICAgICAgICBTdHJpbmdbXSBwYXJhbU5hbWVzLCBTdHJpbmdbXSBwYXJhbVZhbHVlcywgUHJpbnRXcml0ZXIgd3JpdGVyKSB7CisgICAgICAgIC8vYW55IGFyZ3VtZW50cyBzaG91bGQgcHJvZHVjZSBhbiBlcnJvcgorICAgICAgICBpZiAocGFyYW1OYW1lcy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICBTdHJpbmcgZXJyb3JNZXNzYWdlID0gc3NpTWVkaWF0b3IuZ2V0Q29uZmlnRXJyTXNnKCk7CisgICAgICAgICAgICB3cml0ZXIud3JpdGUoZXJyb3JNZXNzYWdlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIENvbGxlY3Rpb24gdmFyaWFibGVOYW1lcyA9IHNzaU1lZGlhdG9yLmdldFZhcmlhYmxlTmFtZXMoKTsKKyAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSB2YXJpYWJsZU5hbWVzLml0ZXJhdG9yKCk7CisgICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdmFyaWFibGVOYW1lID0gKFN0cmluZylpdGVyLm5leHQoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdmFyaWFibGVWYWx1ZSA9IHNzaU1lZGlhdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0VmFyaWFibGVWYWx1ZSh2YXJpYWJsZU5hbWUpOworICAgICAgICAgICAgICAgIC8vVGhpcyBzaG91bGRuJ3QgaGFwcGVuLCBzaW5jZSBhbGwgdGhlIHZhcmlhYmxlIG5hbWVzIG11c3QKKyAgICAgICAgICAgICAgICAvLyBoYXZlIHZhbHVlcworICAgICAgICAgICAgICAgIGlmICh2YXJpYWJsZVZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVWYWx1ZSA9ICIobm9uZSkiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUodmFyaWFibGVOYW1lKTsKKyAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoJz0nKTsKKyAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUodmFyaWFibGVWYWx1ZSk7CisgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKCdcbicpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zc2kvU1NJUHJvY2Vzc29yLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3NpL1NTSVByb2Nlc3Nvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ZDcxMTcKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3NpL1NTSVByb2Nlc3Nvci5qYXZhCkBAIC0wLDAgKzEsMzA4IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uIExpY2Vuc2VkIHVuZGVyIHRoZQorICogQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorICogZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlCisgKiBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUKKyAqIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMKKyAqIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UKKyAqIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5zc2k7CisKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLlJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5JT1Rvb2xzOworLyoqCisgKiBUaGUgZW50cnkgcG9pbnQgdG8gU1NJIHByb2Nlc3NpbmcuIFRoaXMgY2xhc3MgZG9lcyB0aGUgYWN0dWFsIHBhcnNpbmcsCisgKiBkZWxlZ2F0aW5nIHRvIHRoZSBTU0lNZWRpYXRvciwgU1NJQ29tbWFuZCwgYW5kIFNTSUV4dGVybmFsUmVzb2x2ZXIgYXMKKyAqIG5lY2Vzc2FyeVsKKyAqIAorICogQGF1dGhvciBEYW4gU2FuZGJlcmcKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQsICREYXRlJAorICovCitwdWJsaWMgY2xhc3MgU1NJUHJvY2Vzc29yIHsKKyAgICAvKiogVGhlIHN0YXJ0IHBhdHRlcm4gKi8KKyAgICBwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBDT01NQU5EX1NUQVJUID0gIjwhLS0jIjsKKyAgICAvKiogVGhlIGVuZCBwYXR0ZXJuICovCisgICAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ09NTUFORF9FTkQgPSAiLS0+IjsKKyAgICBwcm90ZWN0ZWQgZmluYWwgc3RhdGljIGludCBCVUZGRVJfU0laRSA9IDQwOTY7CisgICAgcHJvdGVjdGVkIFNTSUV4dGVybmFsUmVzb2x2ZXIgc3NpRXh0ZXJuYWxSZXNvbHZlcjsKKyAgICBwcm90ZWN0ZWQgSGFzaE1hcCBjb21tYW5kcyA9IG5ldyBIYXNoTWFwKCk7CisgICAgcHJvdGVjdGVkIGludCBkZWJ1ZzsKKworCisgICAgcHVibGljIFNTSVByb2Nlc3NvcihTU0lFeHRlcm5hbFJlc29sdmVyIHNzaUV4dGVybmFsUmVzb2x2ZXIsIGludCBkZWJ1ZykgeworICAgICAgICB0aGlzLnNzaUV4dGVybmFsUmVzb2x2ZXIgPSBzc2lFeHRlcm5hbFJlc29sdmVyOworICAgICAgICB0aGlzLmRlYnVnID0gZGVidWc7CisgICAgICAgIGFkZEJ1aWx0aW5Db21tYW5kcygpOworICAgIH0KKworCisgICAgcHJvdGVjdGVkIHZvaWQgYWRkQnVpbHRpbkNvbW1hbmRzKCkgeworICAgICAgICBhZGRDb21tYW5kKCJjb25maWciLCBuZXcgU1NJQ29uZmlnKCkpOworICAgICAgICBhZGRDb21tYW5kKCJlY2hvIiwgbmV3IFNTSUVjaG8oKSk7CisgICAgICAgIGFkZENvbW1hbmQoImV4ZWMiLCBuZXcgU1NJRXhlYygpKTsKKyAgICAgICAgYWRkQ29tbWFuZCgiaW5jbHVkZSIsIG5ldyBTU0lJbmNsdWRlKCkpOworICAgICAgICBhZGRDb21tYW5kKCJmbGFzdG1vZCIsIG5ldyBTU0lGbGFzdG1vZCgpKTsKKyAgICAgICAgYWRkQ29tbWFuZCgiZnNpemUiLCBuZXcgU1NJRnNpemUoKSk7CisgICAgICAgIGFkZENvbW1hbmQoInByaW50ZW52IiwgbmV3IFNTSVByaW50ZW52KCkpOworICAgICAgICBhZGRDb21tYW5kKCJzZXQiLCBuZXcgU1NJU2V0KCkpOworICAgICAgICBTU0lDb25kaXRpb25hbCBzc2lDb25kaXRpb25hbCA9IG5ldyBTU0lDb25kaXRpb25hbCgpOworICAgICAgICBhZGRDb21tYW5kKCJpZiIsIHNzaUNvbmRpdGlvbmFsKTsKKyAgICAgICAgYWRkQ29tbWFuZCgiZWxpZiIsIHNzaUNvbmRpdGlvbmFsKTsKKyAgICAgICAgYWRkQ29tbWFuZCgiZW5kaWYiLCBzc2lDb25kaXRpb25hbCk7CisgICAgICAgIGFkZENvbW1hbmQoImVsc2UiLCBzc2lDb25kaXRpb25hbCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBhZGRDb21tYW5kKFN0cmluZyBuYW1lLCBTU0lDb21tYW5kIGNvbW1hbmQpIHsKKyAgICAgICAgY29tbWFuZHMucHV0KG5hbWUsIGNvbW1hbmQpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUHJvY2VzcyBhIGZpbGUgd2l0aCBzZXJ2ZXItc2lkZSBjb21tYW5kcywgcmVhZGluZyBmcm9tIHJlYWRlciBhbmQKKyAgICAgKiB3cml0aW5nIHRoZSBwcm9jZXNzZWQgdmVyc2lvbiB0byB3cml0ZXIuIE5PVEU6IFdlIHJlYWxseSBzaG91bGQgYmUgZG9pbmcKKyAgICAgKiB0aGlzIGluIGEgc3RyZWFtaW5nIHdheSByYXRoZXIgdGhhbiBjb252ZXJ0aW5nIGl0IHRvIGFuIGFycmF5IGZpcnN0LgorICAgICAqIAorICAgICAqIEBwYXJhbSByZWFkZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSByZWFkZXIgdG8gcmVhZCB0aGUgZmlsZSBjb250YWluaW5nIFNTSXMgZnJvbQorICAgICAqIEBwYXJhbSB3cml0ZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSB3cml0ZXIgdG8gd3JpdGUgdGhlIGZpbGUgd2l0aCB0aGUgU1NJcyBwcm9jZXNzZWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIHdoZW4gdGhpbmdzIGdvIGhvcnJpYmx5IGF3cnkuIFNob3VsZCBiZSB1bmxpa2VseSBzaW5jZSB0aGUKKyAgICAgKiAgICAgICAgICAgICBTU0lDb21tYW5kIHVzdWFsbHkgY2F0Y2hlcyAnbm9ybWFsJyBJT0V4Y2VwdGlvbnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHJvY2VzcyhSZWFkZXIgcmVhZGVyLCBEYXRlIGxhc3RNb2RpZmllZERhdGUsCisgICAgICAgICAgICBQcmludFdyaXRlciB3cml0ZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFNTSU1lZGlhdG9yIHNzaU1lZGlhdG9yID0gbmV3IFNTSU1lZGlhdG9yKHNzaUV4dGVybmFsUmVzb2x2ZXIsCisgICAgICAgICAgICAgICAgbGFzdE1vZGlmaWVkRGF0ZSwgZGVidWcpOworICAgICAgICBTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBJT1Rvb2xzLmZsb3cocmVhZGVyLCBzdHJpbmdXcml0ZXIpOworICAgICAgICBTdHJpbmcgZmlsZUNvbnRlbnRzID0gc3RyaW5nV3JpdGVyLnRvU3RyaW5nKCk7CisgICAgICAgIHN0cmluZ1dyaXRlciA9IG51bGw7CisgICAgICAgIGludCBpbmRleCA9IDA7CisgICAgICAgIGJvb2xlYW4gaW5zaWRlID0gZmFsc2U7CisgICAgICAgIFN0cmluZ0J1ZmZlciBjb21tYW5kID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgd2hpbGUgKGluZGV4IDwgZmlsZUNvbnRlbnRzLmxlbmd0aCgpKSB7CisgICAgICAgICAgICAgICAgY2hhciBjID0gZmlsZUNvbnRlbnRzLmNoYXJBdChpbmRleCk7CisgICAgICAgICAgICAgICAgaWYgKCFpbnNpZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT0gQ09NTUFORF9TVEFSVC5jaGFyQXQoMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBjaGFyQ21wKGZpbGVDb250ZW50cywgaW5kZXgsIENPTU1BTkRfU1RBUlQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnNpZGUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gQ09NTUFORF9TVEFSVC5sZW5ndGgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQuc2V0TGVuZ3RoKDApOyAvL2NsZWFyIHRoZSBjb21tYW5kIHN0cmluZworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzc2lNZWRpYXRvci5nZXRDb25kaXRpb25hbFN0YXRlKCkucHJvY2Vzc0NvbmRpdGlvbmFsQ29tbWFuZHNPbmx5KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKGMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjID09IENPTU1BTkRfRU5ELmNoYXJBdCgwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGNoYXJDbXAoZmlsZUNvbnRlbnRzLCBpbmRleCwgQ09NTUFORF9FTkQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnNpZGUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IENPTU1BTkRfRU5ELmxlbmd0aCgpOworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHN0ckNtZCA9IHBhcnNlQ21kKGNvbW1hbmQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlYnVnID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzaUV4dGVybmFsUmVzb2x2ZXIubG9nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNTSVByb2Nlc3Nvci5wcm9jZXNzIC0tIHByb2Nlc3NpbmcgY29tbWFuZDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHN0ckNtZCwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBwYXJhbU5hbWVzID0gcGFyc2VQYXJhbU5hbWVzKGNvbW1hbmQsIHN0ckNtZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubGVuZ3RoKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gcGFyYW1WYWx1ZXMgPSBwYXJzZVBhcmFtVmFsdWVzKGNvbW1hbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ckNtZC5sZW5ndGgoKSwgcGFyYW1OYW1lcy5sZW5ndGgpOworICAgICAgICAgICAgICAgICAgICAgICAgLy9XZSBuZWVkIHRvIGZldGNoIHRoaXMgdmFsdWUgZWFjaCB0aW1lLCBzaW5jZSBpdCBtYXkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoYW5nZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHVyaW5nIHRoZSBsb29wCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY29uZmlnRXJyTXNnID0gc3NpTWVkaWF0b3IuZ2V0Q29uZmlnRXJyTXNnKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBTU0lDb21tYW5kIHNzaUNvbW1hbmQgPSAoU1NJQ29tbWFuZCljb21tYW5kcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0KHN0ckNtZC50b0xvd2VyQ2FzZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBlcnJvck1lc3NhZ2UgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNzaUNvbW1hbmQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9ICJVbmtub3duIGNvbW1hbmQ6ICIgKyBzdHJDbWQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtVmFsdWVzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSAiRXJyb3IgcGFyc2luZyBkaXJlY3RpdmUgcGFyYW1ldGVycy4iOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbU5hbWVzLmxlbmd0aCAhPSBwYXJhbVZhbHVlcy5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSAiUGFyYW1ldGVyIG5hbWVzIGNvdW50IGRvZXMgbm90IG1hdGNoIHBhcmFtZXRlciB2YWx1ZXMgY291bnQgb24gY29tbWFuZDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzdHJDbWQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbid0IHByb2Nlc3MgdGhlIGNvbW1hbmQgaWYgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25kaXRpb25hbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbW1hbmRzIG9ubHkgYW5kIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbW1hbmQgaXMgbm90IGNvbmRpdGlvbmFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzc2lNZWRpYXRvci5nZXRDb25kaXRpb25hbFN0YXRlKCkucHJvY2Vzc0NvbmRpdGlvbmFsQ29tbWFuZHNPbmx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBzc2lDb21tYW5kIGluc3RhbmNlb2YgU1NJQ29uZGl0aW9uYWwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NpQ29tbWFuZC5wcm9jZXNzKHNzaU1lZGlhdG9yLCBzdHJDbWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lcywgcGFyYW1WYWx1ZXMsIHdyaXRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yTWVzc2FnZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NpRXh0ZXJuYWxSZXNvbHZlci5sb2coZXJyb3JNZXNzYWdlLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoY29uZmlnRXJyTXNnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQuYXBwZW5kKGMpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoU1NJU3RvcFByb2Nlc3NpbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy9JZiB3ZSBhcmUgaGVyZSwgdGhlbiB3ZSBoYXZlIGFscmVhZHkgc3RvcHBlZCBwcm9jZXNzaW5nLCBzbyBhbGwKKyAgICAgICAgICAgIC8vIGlzIGdvb2QKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogUGFyc2UgYSBTdHJpbmdCdWZmZXIgYW5kIHRha2Ugb3V0IHRoZSBwYXJhbSB0eXBlIHRva2VuLiBDYWxsZWQgZnJvbQorICAgICAqIDxjb2RlPnJlcXVlc3RIYW5kbGVyPC9jb2RlPgorICAgICAqIAorICAgICAqIEBwYXJhbSBjbWQKKyAgICAgKiAgICAgICAgICAgIGEgdmFsdWUgb2YgdHlwZSAnU3RyaW5nQnVmZmVyJworICAgICAqIEByZXR1cm4gYSB2YWx1ZSBvZiB0eXBlICdTdHJpbmdbXScKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nW10gcGFyc2VQYXJhbU5hbWVzKFN0cmluZ0J1ZmZlciBjbWQsIGludCBzdGFydCkgeworICAgICAgICBpbnQgYklkeCA9IHN0YXJ0OworICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgIGludCBxdW90ZXMgPSAwOworICAgICAgICBib29sZWFuIGluc2lkZSA9IGZhbHNlOworICAgICAgICBTdHJpbmdCdWZmZXIgcmV0QnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICB3aGlsZSAoYklkeCA8IGNtZC5sZW5ndGgoKSkgeworICAgICAgICAgICAgaWYgKCFpbnNpZGUpIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAoYklkeCA8IGNtZC5sZW5ndGgoKSAmJiBpc1NwYWNlKGNtZC5jaGFyQXQoYklkeCkpKQorICAgICAgICAgICAgICAgICAgICBiSWR4Kys7CisgICAgICAgICAgICAgICAgaWYgKGJJZHggPj0gY21kLmxlbmd0aCgpKSBicmVhazsKKyAgICAgICAgICAgICAgICBpbnNpZGUgPSAhaW5zaWRlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAoYklkeCA8IGNtZC5sZW5ndGgoKSAmJiBjbWQuY2hhckF0KGJJZHgpICE9ICc9JykgeworICAgICAgICAgICAgICAgICAgICByZXRCdWYuYXBwZW5kKGNtZC5jaGFyQXQoYklkeCkpOworICAgICAgICAgICAgICAgICAgICBiSWR4Kys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldEJ1Zi5hcHBlbmQoJz0nKTsKKyAgICAgICAgICAgICAgICBpbnNpZGUgPSAhaW5zaWRlOworICAgICAgICAgICAgICAgIHF1b3RlcyA9IDA7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBlc2NhcGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgZm9yICg7IGJJZHggPCBjbWQubGVuZ3RoKCkgJiYgcXVvdGVzICE9IDI7IGJJZHgrKykgeworICAgICAgICAgICAgICAgICAgICBjaGFyIGMgPSBjbWQuY2hhckF0KGJJZHgpOworICAgICAgICAgICAgICAgICAgICAvLyBOZWVkIHRvIHNraXAgZXNjYXBlZCBjaGFyYWN0ZXJzCisgICAgICAgICAgICAgICAgICAgIGlmIChjID09ICdcXCcgJiYgIWVzY2FwZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVzY2FwZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgYklkeCsrOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZXNjYXBlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PSAnIicpIHF1b3RlcysrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBTdHJpbmdUb2tlbml6ZXIgc3RyID0gbmV3IFN0cmluZ1Rva2VuaXplcihyZXRCdWYudG9TdHJpbmcoKSwgIj0iKTsKKyAgICAgICAgU3RyaW5nW10gcmV0U3RyaW5nID0gbmV3IFN0cmluZ1tzdHIuY291bnRUb2tlbnMoKV07CisgICAgICAgIHdoaWxlIChzdHIuaGFzTW9yZVRva2VucygpKSB7CisgICAgICAgICAgICByZXRTdHJpbmdbaSsrXSA9IHN0ci5uZXh0VG9rZW4oKS50cmltKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldFN0cmluZzsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFBhcnNlIGEgU3RyaW5nQnVmZmVyIGFuZCB0YWtlIG91dCB0aGUgcGFyYW0gdG9rZW4uIENhbGxlZCBmcm9tCisgICAgICogPGNvZGU+cmVxdWVzdEhhbmRsZXI8L2NvZGU+CisgICAgICogCisgICAgICogQHBhcmFtIGNtZAorICAgICAqICAgICAgICAgICAgYSB2YWx1ZSBvZiB0eXBlICdTdHJpbmdCdWZmZXInCisgICAgICogQHJldHVybiBhIHZhbHVlIG9mIHR5cGUgJ1N0cmluZ1tdJworICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmdbXSBwYXJzZVBhcmFtVmFsdWVzKFN0cmluZ0J1ZmZlciBjbWQsIGludCBzdGFydCwgaW50IGNvdW50KSB7CisgICAgICAgIGludCB2YWxJbmRleCA9IDA7CisgICAgICAgIGJvb2xlYW4gaW5zaWRlID0gZmFsc2U7CisgICAgICAgIFN0cmluZ1tdIHZhbHMgPSBuZXcgU3RyaW5nW2NvdW50XTsKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBmb3IgKGludCBiSWR4ID0gc3RhcnQ7IGJJZHggPCBjbWQubGVuZ3RoKCk7IGJJZHgrKykgeworICAgICAgICAgICAgaWYgKCFpbnNpZGUpIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAoYklkeCA8IGNtZC5sZW5ndGgoKSAmJiBjbWQuY2hhckF0KGJJZHgpICE9ICciJykKKyAgICAgICAgICAgICAgICAgICAgYklkeCsrOworICAgICAgICAgICAgICAgIGlmIChiSWR4ID49IGNtZC5sZW5ndGgoKSkgYnJlYWs7CisgICAgICAgICAgICAgICAgaW5zaWRlID0gIWluc2lkZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBlc2NhcGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgZm9yICg7IGJJZHggPCBjbWQubGVuZ3RoKCk7IGJJZHgrKykgeworICAgICAgICAgICAgICAgICAgICBjaGFyIGMgPSBjbWQuY2hhckF0KGJJZHgpOworICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgZXNjYXBlcworICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PSAnXFwnICYmICFlc2NhcGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlc2NhcGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIHJlYWNoIHRoZSBvdGhlciAiIHRoZW4gc3RvcAorICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PSAnIicgJiYgIWVzY2FwZWQpIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAvLyBTaW5jZSBwYXJzaW5nIG9mIGF0dHJpYnV0ZXMgYW5kIHZhcgorICAgICAgICAgICAgICAgICAgICAvLyBzdWJzdGl0dXRpb24gaXMgZG9uZSBpbiBzZXBhcmF0ZSBwbGFjZXMsCisgICAgICAgICAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gbGVhdmUgZXNjYXBlIGluIHRoZSBzdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT0gJyQnICYmIGVzY2FwZWQpIHNiLmFwcGVuZCgnXFwnKTsKKyAgICAgICAgICAgICAgICAgICAgZXNjYXBlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoYyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIElmIHdlIGhpdCB0aGUgZW5kIHdpdGhvdXQgc2VlaW5nIGEgcXVvdGUKKyAgICAgICAgICAgICAgICAvLyB0aGUgc2lnbmFsIGFuIGVycm9yCisgICAgICAgICAgICAgICAgaWYgKGJJZHggPT0gY21kLmxlbmd0aCgpKSByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB2YWxzW3ZhbEluZGV4KytdID0gc2IudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBzYi5kZWxldGUoMCwgc2IubGVuZ3RoKCkpOyAvLyBjbGVhciB0aGUgYnVmZmVyCisgICAgICAgICAgICAgICAgaW5zaWRlID0gIWluc2lkZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdmFsczsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFBhcnNlIGEgU3RyaW5nQnVmZmVyIGFuZCB0YWtlIG91dCB0aGUgY29tbWFuZCB0b2tlbi4gQ2FsbGVkIGZyb20KKyAgICAgKiA8Y29kZT5yZXF1ZXN0SGFuZGxlcjwvY29kZT4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY21kCisgICAgICogICAgICAgICAgICBhIHZhbHVlIG9mIHR5cGUgJ1N0cmluZ0J1ZmZlcicKKyAgICAgKiBAcmV0dXJuIGEgdmFsdWUgb2YgdHlwZSAnU3RyaW5nJywgb3IgbnVsbCBpZiB0aGVyZSBpcyBub25lCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcGFyc2VDbWQoU3RyaW5nQnVmZmVyIGNtZCkgeworICAgICAgICBpbnQgZmlyc3RMZXR0ZXIgPSAtMTsKKyAgICAgICAgaW50IGxhc3RMZXR0ZXIgPSAtMTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbWQubGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgY2hhciBjID0gY21kLmNoYXJBdChpKTsKKyAgICAgICAgICAgIGlmIChDaGFyYWN0ZXIuaXNMZXR0ZXIoYykpIHsKKyAgICAgICAgICAgICAgICBpZiAoZmlyc3RMZXR0ZXIgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3RMZXR0ZXIgPSBpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsYXN0TGV0dGVyID0gaTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNTcGFjZShjKSkgeworICAgICAgICAgICAgICAgIGlmIChsYXN0TGV0dGVyID4gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgY29tbWFuZCA9IG51bGw7CisgICAgICAgIGlmIChmaXJzdExldHRlciAhPSAtMSkgeworICAgICAgICAgICAgY29tbWFuZCA9IGNtZC5zdWJzdHJpbmcoZmlyc3RMZXR0ZXIsIGxhc3RMZXR0ZXIgKyAxKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29tbWFuZDsKKyAgICB9CisKKworICAgIHByb3RlY3RlZCBib29sZWFuIGNoYXJDbXAoU3RyaW5nIGJ1ZiwgaW50IGluZGV4LCBTdHJpbmcgY29tbWFuZCkgeworICAgICAgICByZXR1cm4gYnVmLnJlZ2lvbk1hdGNoZXMoaW5kZXgsIGNvbW1hbmQsIDAsIGNvbW1hbmQubGVuZ3RoKCkpOworICAgIH0KKworCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNTcGFjZShjaGFyIGMpIHsKKyAgICAgICAgcmV0dXJuIGMgPT0gJyAnIHx8IGMgPT0gJ1xuJyB8fCBjID09ICdcdCcgfHwgYyA9PSAnXHInOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3NpL1NTSVNlcnZsZXQuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zc2kvU1NJU2VydmxldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5MzIxMzkKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3NpL1NTSVNlcnZsZXQuamF2YQpAQCAtMCwwICsxLDIwMCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBMaWNlbnNlZCB1bmRlciB0aGUKKyAqIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyAqIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZQorICogYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlCisgKiBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzCisgKiBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlCisgKiBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3NpOworCisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEubmV0LlVSTENvbm5lY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5HbG9iYWxzOworLyoqCisgKiBTZXJ2bGV0IHRvIHByb2Nlc3MgU1NJIHJlcXVlc3RzIHdpdGhpbiBhIHdlYnBhZ2UuIE1hcHBlZCB0byBhIHBhdGggZnJvbQorICogd2l0aGluIHdlYi54bWwuCisgKiAKKyAqIEBhdXRob3IgQmlwIFRoZWxpbgorICogQGF1dGhvciBBbXkgUm9oCisgKiBAYXV0aG9yIERhbiBTYW5kYmVyZworICogQHZlcnNpb24gJFJldmlzaW9uJCwgJERhdGUkCisgKi8KK3B1YmxpYyBjbGFzcyBTU0lTZXJ2bGV0IGV4dGVuZHMgSHR0cFNlcnZsZXQgeworICAgIC8qKiBEZWJ1ZyBsZXZlbCBmb3IgdGhpcyBzZXJ2bGV0LiAqLworICAgIHByb3RlY3RlZCBpbnQgZGVidWcgPSAwOworICAgIC8qKiBTaG91bGQgdGhlIG91dHB1dCBiZSBidWZmZXJlZC4gKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBidWZmZXJlZCA9IGZhbHNlOworICAgIC8qKiBFeHBpcmF0aW9uIHRpbWUgaW4gc2Vjb25kcyBmb3IgdGhlIGRvYy4gKi8KKyAgICBwcm90ZWN0ZWQgTG9uZyBleHBpcmVzID0gbnVsbDsKKyAgICAvKiogdmlydHVhbCBwYXRoIGNhbiBiZSB3ZWJhcHAtcmVsYXRpdmUgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1ZpcnR1YWxXZWJhcHBSZWxhdGl2ZSA9IGZhbHNlOworCisKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBtZXRob2RzLgorICAgIC8qKgorICAgICAqIEluaXRpYWxpemUgdGhpcyBzZXJ2bGV0LgorICAgICAqIAorICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGluaXQoKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyB2YWx1ZSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB2YWx1ZSA9IGdldFNlcnZsZXRDb25maWcoKS5nZXRJbml0UGFyYW1ldGVyKCJkZWJ1ZyIpOworICAgICAgICAgICAgZGVidWcgPSBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIDsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgdmFsdWUgPSBnZXRTZXJ2bGV0Q29uZmlnKCkuZ2V0SW5pdFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICAgICAgImlzVmlydHVhbFdlYmFwcFJlbGF0aXZlIik7CisgICAgICAgICAgICBpc1ZpcnR1YWxXZWJhcHBSZWxhdGl2ZSA9IEludGVnZXIucGFyc2VJbnQodmFsdWUpID4gMD90cnVlOmZhbHNlOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB2YWx1ZSA9IGdldFNlcnZsZXRDb25maWcoKS5nZXRJbml0UGFyYW1ldGVyKCJleHBpcmVzIik7CisgICAgICAgICAgICBleHBpcmVzID0gTG9uZy52YWx1ZU9mKHZhbHVlKTsKKyAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGV4cGlyZXMgPSBudWxsOworICAgICAgICAgICAgbG9nKCJJbnZhbGlkIGZvcm1hdCBmb3IgZXhwaXJlcyBpbml0UGFyYW07IGV4cGVjdGVkIGludGVnZXIgKHNlY29uZHMpIik7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICA7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHZhbHVlID0gZ2V0U2VydmxldENvbmZpZygpLmdldEluaXRQYXJhbWV0ZXIoImJ1ZmZlcmVkIik7CisgICAgICAgICAgICBidWZmZXJlZCA9IEludGVnZXIucGFyc2VJbnQodmFsdWUpID4gMD90cnVlOmZhbHNlOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgOworICAgICAgICB9CisgICAgICAgIGlmIChkZWJ1ZyA+IDApCisgICAgICAgICAgICBsb2coIlNTSVNlcnZsZXQuaW5pdCgpIFNTSSBpbnZva2VyIHN0YXJ0ZWQgd2l0aCAnZGVidWcnPSIgKyBkZWJ1Zyk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIGFuZCBmb3J3YXJkIHRoZSBHRVQgcmVxdWVzdCB0byBvdXIgPGNvZGU+cmVxdWVzdEhhbmRsZXIoKTwvY29kZT4qCisgICAgICogCisgICAgICogQHBhcmFtIHJlcQorICAgICAqICAgICAgICAgICAgYSB2YWx1ZSBvZiB0eXBlICdIdHRwU2VydmxldFJlcXVlc3QnCisgICAgICogQHBhcmFtIHJlcworICAgICAqICAgICAgICAgICAgYSB2YWx1ZSBvZiB0eXBlICdIdHRwU2VydmxldFJlc3BvbnNlJworICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlcykKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChkZWJ1ZyA+IDApIGxvZygiU1NJU2VydmxldC5kb0dldCgpIik7CisgICAgICAgIHJlcXVlc3RIYW5kbGVyKHJlcSwgcmVzKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgYW5kIGZvcndhcmQgdGhlIFBPU1QgcmVxdWVzdCB0byBvdXIKKyAgICAgKiA8Y29kZT5yZXF1ZXN0SGFuZGxlcigpPC9jb2RlPi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcmVxCisgICAgICogICAgICAgICAgICBhIHZhbHVlIG9mIHR5cGUgJ0h0dHBTZXJ2bGV0UmVxdWVzdCcKKyAgICAgKiBAcGFyYW0gcmVzCisgICAgICogICAgICAgICAgICBhIHZhbHVlIG9mIHR5cGUgJ0h0dHBTZXJ2bGV0UmVzcG9uc2UnCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRvUG9zdChIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlcykKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChkZWJ1ZyA+IDApIGxvZygiU1NJU2VydmxldC5kb1Bvc3QoKSIpOworICAgICAgICByZXF1ZXN0SGFuZGxlcihyZXEsIHJlcyk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIG91ciByZXF1ZXN0IGFuZCBsb2NhdGUgcmlnaHQgU1NJIGNvbW1hbmQuCisgICAgICogCisgICAgICogQHBhcmFtIHJlcQorICAgICAqICAgICAgICAgICAgYSB2YWx1ZSBvZiB0eXBlICdIdHRwU2VydmxldFJlcXVlc3QnCisgICAgICogQHBhcmFtIHJlcworICAgICAqICAgICAgICAgICAgYSB2YWx1ZSBvZiB0eXBlICdIdHRwU2VydmxldFJlc3BvbnNlJworICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHJlcXVlc3RIYW5kbGVyKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsCisgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlcykgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKyAgICAgICAgU2VydmxldENvbnRleHQgc2VydmxldENvbnRleHQgPSBnZXRTZXJ2bGV0Q29udGV4dCgpOworICAgICAgICBTdHJpbmcgcGF0aCA9IFNTSVNlcnZsZXRSZXF1ZXN0VXRpbC5nZXRSZWxhdGl2ZVBhdGgocmVxKTsKKyAgICAgICAgaWYgKGRlYnVnID4gMCkKKyAgICAgICAgICAgIGxvZygiU1NJU2VydmxldC5yZXF1ZXN0SGFuZGxlcigpXG4iICsgIlNlcnZpbmcgIgorICAgICAgICAgICAgICAgICAgICArIChidWZmZXJlZD8iYnVmZmVyZWQgIjoidW5idWZmZXJlZCAiKSArICJyZXNvdXJjZSAnIgorICAgICAgICAgICAgICAgICAgICArIHBhdGggKyAiJyIpOworICAgICAgICAvLyBFeGNsdWRlIGFueSByZXNvdXJjZSBpbiB0aGUgL1dFQi1JTkYgYW5kIC9NRVRBLUlORiBzdWJkaXJlY3RvcmllcworICAgICAgICAvLyAodGhlICJ0b1VwcGVyQ2FzZSgpIiBhdm9pZHMgcHJvYmxlbXMgb24gV2luZG93cyBzeXN0ZW1zKQorICAgICAgICBpZiAocGF0aCA9PSBudWxsIHx8IHBhdGgudG9VcHBlckNhc2UoKS5zdGFydHNXaXRoKCIvV0VCLUlORiIpCisgICAgICAgICAgICAgICAgfHwgcGF0aC50b1VwcGVyQ2FzZSgpLnN0YXJ0c1dpdGgoIi9NRVRBLUlORiIpKSB7CisgICAgICAgICAgICByZXMuc2VuZEVycm9yKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfTk9UX0ZPVU5ELCBwYXRoKTsKKyAgICAgICAgICAgIGxvZygiQ2FuJ3Qgc2VydmUgZmlsZTogIiArIHBhdGgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIFVSTCByZXNvdXJjZSA9IHNlcnZsZXRDb250ZXh0LmdldFJlc291cmNlKHBhdGgpOworICAgICAgICBpZiAocmVzb3VyY2UgPT0gbnVsbCkgeworICAgICAgICAgICAgcmVzLnNlbmRFcnJvcihIdHRwU2VydmxldFJlc3BvbnNlLlNDX05PVF9GT1VORCwgcGF0aCk7CisgICAgICAgICAgICBsb2coIkNhbid0IGZpbmQgZmlsZTogIiArIHBhdGgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIFN0cmluZyByZXNvdXJjZU1pbWVUeXBlID0gc2VydmxldENvbnRleHQuZ2V0TWltZVR5cGUocGF0aCk7CisgICAgICAgIGlmIChyZXNvdXJjZU1pbWVUeXBlID09IG51bGwpIHsKKyAgICAgICAgICAgIHJlc291cmNlTWltZVR5cGUgPSAidGV4dC9odG1sO2NoYXJzZXQ9VVRGLTgiOworICAgICAgICB9CisgICAgICAgIHJlcy5zZXRDb250ZW50VHlwZShyZXNvdXJjZU1pbWVUeXBlKTsKKyAgICAgICAgaWYgKGV4cGlyZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgcmVzLnNldERhdGVIZWFkZXIoIkV4cGlyZXMiLCAobmV3IGphdmEudXRpbC5EYXRlKCkpLmdldFRpbWUoKQorICAgICAgICAgICAgICAgICAgICArIGV4cGlyZXMubG9uZ1ZhbHVlKCkgKiAxMDAwKTsKKyAgICAgICAgfQorICAgICAgICByZXEuc2V0QXR0cmlidXRlKEdsb2JhbHMuU1NJX0ZMQUdfQVRUUiwgInRydWUiKTsKKyAgICAgICAgcHJvY2Vzc1NTSShyZXEsIHJlcywgcmVzb3VyY2UpOworICAgIH0KKworCisgICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1NTSShIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlcywKKyAgICAgICAgICAgIFVSTCByZXNvdXJjZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU1NJRXh0ZXJuYWxSZXNvbHZlciBzc2lFeHRlcm5hbFJlc29sdmVyID0gbmV3IFNTSVNlcnZsZXRFeHRlcm5hbFJlc29sdmVyKAorICAgICAgICAgICAgICAgIHRoaXMsIHJlcSwgcmVzLCBpc1ZpcnR1YWxXZWJhcHBSZWxhdGl2ZSwgZGVidWcpOworICAgICAgICBTU0lQcm9jZXNzb3Igc3NpUHJvY2Vzc29yID0gbmV3IFNTSVByb2Nlc3Nvcihzc2lFeHRlcm5hbFJlc29sdmVyLAorICAgICAgICAgICAgICAgIGRlYnVnKTsKKyAgICAgICAgUHJpbnRXcml0ZXIgcHJpbnRXcml0ZXIgPSBudWxsOworICAgICAgICBTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbnVsbDsKKyAgICAgICAgaWYgKGJ1ZmZlcmVkKSB7CisgICAgICAgICAgICBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgICAgICBwcmludFdyaXRlciA9IG5ldyBQcmludFdyaXRlcihzdHJpbmdXcml0ZXIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJpbnRXcml0ZXIgPSByZXMuZ2V0V3JpdGVyKCk7CisgICAgICAgIH0KKyAgICAgICAgVVJMQ29ubmVjdGlvbiByZXNvdXJjZUluZm8gPSByZXNvdXJjZS5vcGVuQ29ubmVjdGlvbigpOworICAgICAgICBJbnB1dFN0cmVhbSByZXNvdXJjZUlucHV0U3RyZWFtID0gcmVzb3VyY2VJbmZvLmdldElucHV0U3RyZWFtKCk7CisgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGJ1ZmZlcmVkUmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKAorICAgICAgICAgICAgICAgIG5ldyBJbnB1dFN0cmVhbVJlYWRlcihyZXNvdXJjZUlucHV0U3RyZWFtKSk7CisgICAgICAgIERhdGUgbGFzdE1vZGlmaWVkRGF0ZSA9IG5ldyBEYXRlKHJlc291cmNlSW5mby5nZXRMYXN0TW9kaWZpZWQoKSk7CisgICAgICAgIHNzaVByb2Nlc3Nvci5wcm9jZXNzKGJ1ZmZlcmVkUmVhZGVyLCBsYXN0TW9kaWZpZWREYXRlLCBwcmludFdyaXRlcik7CisgICAgICAgIGlmIChidWZmZXJlZCkgeworICAgICAgICAgICAgcHJpbnRXcml0ZXIuZmx1c2goKTsKKyAgICAgICAgICAgIFN0cmluZyB0ZXh0ID0gc3RyaW5nV3JpdGVyLnRvU3RyaW5nKCk7CisgICAgICAgICAgICByZXMuZ2V0V3JpdGVyKCkud3JpdGUodGV4dCk7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NzaS9TU0lTZXJ2bGV0RXh0ZXJuYWxSZXNvbHZlci5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NzaS9TU0lTZXJ2bGV0RXh0ZXJuYWxSZXNvbHZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3MmQ3ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3NpL1NTSVNlcnZsZXRFeHRlcm5hbFJlc29sdmVyLmphdmEKQEAgLTAsMCArMSw0MjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gTGljZW5zZWQgdW5kZXIgdGhlCisgKiBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisgKiBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UKKyAqIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZQorICogbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcworICogZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZQorICogZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnNzaTsKKworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS5uZXQuVVJMQ29ubmVjdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkxEZWNvZGVyOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlJlcXVlc3REaXNwYXRjaGVyOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworLyoqCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBTU0lFeHRlcm5hbFJlc29sdmVyIHRoYXQgaXMgdXNlZCB3aXRoIHNlcnZsZXRzLgorICogCisgKiBAYXV0aG9yIERhbiBTYW5kYmVyZworICogQHZlcnNpb24gJFJldmlzaW9uJCwgJERhdGUkCisgKi8KK3B1YmxpYyBjbGFzcyBTU0lTZXJ2bGV0RXh0ZXJuYWxSZXNvbHZlciBpbXBsZW1lbnRzIFNTSUV4dGVybmFsUmVzb2x2ZXIgeworICAgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVkFSSUFCTEVfTkFNRVNbXSA9IHsiQVVUSF9UWVBFIiwgIkNPTlRFTlRfTEVOR1RIIiwKKyAgICAgICAgICAgICJDT05URU5UX1RZUEUiLCAiRE9DVU1FTlRfTkFNRSIsICJET0NVTUVOVF9VUkkiLAorICAgICAgICAgICAgIkdBVEVXQVlfSU5URVJGQUNFIiwgIlBBVEhfSU5GTyIsICJQQVRIX1RSQU5TTEFURUQiLAorICAgICAgICAgICAgIlFVRVJZX1NUUklORyIsICJRVUVSWV9TVFJJTkdfVU5FU0NBUEVEIiwgIlJFTU9URV9BRERSIiwKKyAgICAgICAgICAgICJSRU1PVEVfSE9TVCIsICJSRU1PVEVfVVNFUiIsICJSRVFVRVNUX01FVEhPRCIsICJTQ1JJUFRfTkFNRSIsCisgICAgICAgICAgICAiU0VSVkVSX05BTUUiLCAiU0VSVkVSX1BPUlQiLCAiU0VSVkVSX1BST1RPQ09MIiwgIlNFUlZFUl9TT0ZUV0FSRSJ9OworICAgIHByb3RlY3RlZCBIdHRwU2VydmxldCBzZXJ2bGV0OworICAgIHByb3RlY3RlZCBIdHRwU2VydmxldFJlcXVlc3QgcmVxOworICAgIHByb3RlY3RlZCBIdHRwU2VydmxldFJlc3BvbnNlIHJlczsKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1ZpcnR1YWxXZWJhcHBSZWxhdGl2ZTsKKyAgICBwcm90ZWN0ZWQgaW50IGRlYnVnOworCisKKyAgICBwdWJsaWMgU1NJU2VydmxldEV4dGVybmFsUmVzb2x2ZXIoSHR0cFNlcnZsZXQgc2VydmxldCwKKyAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzLAorICAgICAgICAgICAgYm9vbGVhbiBpc1ZpcnR1YWxXZWJhcHBSZWxhdGl2ZSwgaW50IGRlYnVnKSB7CisgICAgICAgIHRoaXMuc2VydmxldCA9IHNlcnZsZXQ7CisgICAgICAgIHRoaXMucmVxID0gcmVxOworICAgICAgICB0aGlzLnJlcyA9IHJlczsKKyAgICAgICAgdGhpcy5pc1ZpcnR1YWxXZWJhcHBSZWxhdGl2ZSA9IGlzVmlydHVhbFdlYmFwcFJlbGF0aXZlOworICAgICAgICB0aGlzLmRlYnVnID0gZGVidWc7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBsb2coU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSB0aHJvd2FibGUpIHsKKyAgICAgICAgLy9XZSBjYW4ndCBhc3N1bWUgdGhhdCBTZXJ2bGV0LmxvZyggbWVzc2FnZSwgbnVsbCApCisgICAgICAgIC8vaXMgdGhlIHNhbWUgYXMgU2VydmxldC5sb2coIG1lc3NhZ2UgKSwgc2luY2UgQVBJCisgICAgICAgIC8vZG9lc24ndCBzZWVtIHRvIHNheSBzby4KKyAgICAgICAgaWYgKHRocm93YWJsZSAhPSBudWxsKSB7CisgICAgICAgICAgICBzZXJ2bGV0LmxvZyhtZXNzYWdlLCB0aHJvd2FibGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2VydmxldC5sb2cobWVzc2FnZSk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIGFkZFZhcmlhYmxlTmFtZXMoQ29sbGVjdGlvbiB2YXJpYWJsZU5hbWVzKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgVkFSSUFCTEVfTkFNRVMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIFN0cmluZyB2YXJpYWJsZU5hbWUgPSBWQVJJQUJMRV9OQU1FU1tpXTsKKyAgICAgICAgICAgIFN0cmluZyB2YXJpYWJsZVZhbHVlID0gZ2V0VmFyaWFibGVWYWx1ZSh2YXJpYWJsZU5hbWUpOworICAgICAgICAgICAgaWYgKHZhcmlhYmxlVmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHZhcmlhYmxlTmFtZXMuYWRkKHZhcmlhYmxlTmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRW51bWVyYXRpb24gZSA9IHJlcS5nZXRBdHRyaWJ1dGVOYW1lcygpOworICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKWUubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgIGlmICghaXNOYW1lUmVzZXJ2ZWQobmFtZSkpIHsKKyAgICAgICAgICAgICAgICB2YXJpYWJsZU5hbWVzLmFkZChuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHJvdGVjdGVkIE9iamVjdCBnZXRSZXFBdHRyaWJ1dGVJZ25vcmVDYXNlKFN0cmluZyB0YXJnZXROYW1lKSB7CisgICAgICAgIE9iamVjdCBvYmplY3QgPSBudWxsOworICAgICAgICBpZiAoIWlzTmFtZVJlc2VydmVkKHRhcmdldE5hbWUpKSB7CisgICAgICAgICAgICBvYmplY3QgPSByZXEuZ2V0QXR0cmlidXRlKHRhcmdldE5hbWUpOworICAgICAgICAgICAgaWYgKG9iamVjdCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgRW51bWVyYXRpb24gZSA9IHJlcS5nZXRBdHRyaWJ1dGVOYW1lcygpOworICAgICAgICAgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZyllLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXROYW1lLmVxdWFsc0lnbm9yZUNhc2UobmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhaXNOYW1lUmVzZXJ2ZWQobmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCA9IHJlcS5nZXRBdHRyaWJ1dGUobmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAob2JqZWN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gb2JqZWN0OworICAgIH0KKworCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNOYW1lUmVzZXJ2ZWQoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIG5hbWUuc3RhcnRzV2l0aCgiamF2YS4iKSB8fCBuYW1lLnN0YXJ0c1dpdGgoImphdmF4LiIpCisgICAgICAgICAgICAgICAgfHwgbmFtZS5zdGFydHNXaXRoKCJzdW4uIik7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXRWYXJpYWJsZVZhbHVlKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgaWYgKCFpc05hbWVSZXNlcnZlZChuYW1lKSkgeworICAgICAgICAgICAgcmVxLnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFyaWFibGVWYWx1ZShTdHJpbmcgbmFtZSkgeworICAgICAgICBTdHJpbmcgcmV0VmFsID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IG9iamVjdCA9IGdldFJlcUF0dHJpYnV0ZUlnbm9yZUNhc2UobmFtZSk7CisgICAgICAgIGlmIChvYmplY3QgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0VmFsID0gb2JqZWN0LnRvU3RyaW5nKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXRWYWwgPSBnZXRDR0lWYXJpYWJsZShuYW1lKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0VmFsOworICAgIH0KKworCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDR0lWYXJpYWJsZShTdHJpbmcgbmFtZSkgeworICAgICAgICBTdHJpbmcgcmV0VmFsID0gbnVsbDsKKyAgICAgICAgaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiQVVUSF9UWVBFIikpIHsKKyAgICAgICAgICAgIHJldFZhbCA9IHJlcS5nZXRBdXRoVHlwZSgpOworICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiQ09OVEVOVF9MRU5HVEgiKSkgeworICAgICAgICAgICAgaW50IGNvbnRlbnRMZW5ndGggPSByZXEuZ2V0Q29udGVudExlbmd0aCgpOworICAgICAgICAgICAgaWYgKGNvbnRlbnRMZW5ndGggPj0gMCkgeworICAgICAgICAgICAgICAgIHJldFZhbCA9IEludGVnZXIudG9TdHJpbmcoY29udGVudExlbmd0aCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJDT05URU5UX1RZUEUiKSkgeworICAgICAgICAgICAgcmV0VmFsID0gcmVxLmdldENvbnRlbnRUeXBlKCk7CisgICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJET0NVTUVOVF9OQU1FIikpIHsKKyAgICAgICAgICAgIFN0cmluZyByZXF1ZXN0VVJJID0gcmVxLmdldFJlcXVlc3RVUkkoKTsKKyAgICAgICAgICAgIHJldFZhbCA9IHJlcXVlc3RVUkkuc3Vic3RyaW5nKHJlcXVlc3RVUkkubGFzdEluZGV4T2YoJy8nKSArIDEpOworICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiRE9DVU1FTlRfVVJJIikpIHsKKyAgICAgICAgICAgIHJldFZhbCA9IHJlcS5nZXRSZXF1ZXN0VVJJKCk7CisgICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJHQVRFV0FZX0lOVEVSRkFDRSIpKSB7CisgICAgICAgICAgICByZXRWYWwgPSAiQ0dJLzEuMSI7CisgICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJQQVRIX0lORk8iKSkgeworICAgICAgICAgICAgcmV0VmFsID0gcmVxLmdldFBhdGhJbmZvKCk7CisgICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJQQVRIX1RSQU5TTEFURUQiKSkgeworICAgICAgICAgICAgcmV0VmFsID0gcmVxLmdldFBhdGhUcmFuc2xhdGVkKCk7CisgICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJRVUVSWV9TVFJJTkciKSkgeworICAgICAgICAgICAgLy9hcGFjaGUgZGlzcGxheXMgdGhpcyBhcyBhbiBlbXB0eSBzdHJpbmcgcmF0aGVyIHRoYW4gKG5vbmUpCisgICAgICAgICAgICByZXRWYWwgPSBudWxsVG9FbXB0eVN0cmluZyhyZXEuZ2V0UXVlcnlTdHJpbmcoKSk7CisgICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJRVUVSWV9TVFJJTkdfVU5FU0NBUEVEIikpIHsKKyAgICAgICAgICAgIFN0cmluZyBxdWVyeVN0cmluZyA9IHJlcS5nZXRRdWVyeVN0cmluZygpOworICAgICAgICAgICAgaWYgKHF1ZXJ5U3RyaW5nICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXRWYWwgPSBVUkxEZWNvZGVyLmRlY29kZShxdWVyeVN0cmluZyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJSRU1PVEVfQUREUiIpKSB7CisgICAgICAgICAgICByZXRWYWwgPSByZXEuZ2V0UmVtb3RlQWRkcigpOworICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiUkVNT1RFX0hPU1QiKSkgeworICAgICAgICAgICAgcmV0VmFsID0gcmVxLmdldFJlbW90ZUhvc3QoKTsKKyAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoIlJFTU9URV9VU0VSIikpIHsKKyAgICAgICAgICAgIHJldFZhbCA9IHJlcS5nZXRSZW1vdGVVc2VyKCk7CisgICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJSRVFVRVNUX01FVEhPRCIpKSB7CisgICAgICAgICAgICByZXRWYWwgPSByZXEuZ2V0TWV0aG9kKCk7CisgICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJTQ1JJUFRfTkFNRSIpKSB7CisgICAgICAgICAgICByZXRWYWwgPSByZXEuZ2V0U2VydmxldFBhdGgoKTsKKyAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoIlNFUlZFUl9OQU1FIikpIHsKKyAgICAgICAgICAgIHJldFZhbCA9IHJlcS5nZXRTZXJ2ZXJOYW1lKCk7CisgICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJTRVJWRVJfUE9SVCIpKSB7CisgICAgICAgICAgICByZXRWYWwgPSBJbnRlZ2VyLnRvU3RyaW5nKHJlcS5nZXRTZXJ2ZXJQb3J0KCkpOworICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiU0VSVkVSX1BST1RPQ09MIikpIHsKKyAgICAgICAgICAgIHJldFZhbCA9IHJlcS5nZXRQcm90b2NvbCgpOworICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiU0VSVkVSX1NPRlRXQVJFIikpIHsKKyAgICAgICAgICAgIFNlcnZsZXRDb250ZXh0IHNlcnZsZXRDb250ZXh0ID0gc2VydmxldC5nZXRTZXJ2bGV0Q29udGV4dCgpOworICAgICAgICAgICAgcmV0VmFsID0gc2VydmxldENvbnRleHQuZ2V0U2VydmVySW5mbygpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXRWYWw7CisgICAgfQorCisKKyAgICBwdWJsaWMgRGF0ZSBnZXRDdXJyZW50RGF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBEYXRlKCk7CisgICAgfQorCisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIG51bGxUb0VtcHR5U3RyaW5nKFN0cmluZyBzdHJpbmcpIHsKKyAgICAgICAgU3RyaW5nIHJldFZhbCA9IHN0cmluZzsKKyAgICAgICAgaWYgKHJldFZhbCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXRWYWwgPSAiIjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0VmFsOworICAgIH0KKworCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQYXRoV2l0aG91dEZpbGVOYW1lKFN0cmluZyBzZXJ2bGV0UGF0aCkgeworICAgICAgICBTdHJpbmcgcmV0VmFsID0gbnVsbDsKKyAgICAgICAgaW50IGxhc3RTbGFzaCA9IHNlcnZsZXRQYXRoLmxhc3RJbmRleE9mKCcvJyk7CisgICAgICAgIGlmIChsYXN0U2xhc2ggPj0gMCkgeworICAgICAgICAgICAgLy9jdXQgb2ZmIGZpbGUgbmFtZWUKKyAgICAgICAgICAgIHJldFZhbCA9IHNlcnZsZXRQYXRoLnN1YnN0cmluZygwLCBsYXN0U2xhc2ggKyAxKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0VmFsOworICAgIH0KKworCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQYXRoV2l0aG91dENvbnRleHQoU3RyaW5nIHNlcnZsZXRQYXRoKSB7CisgICAgICAgIFN0cmluZyByZXRWYWwgPSBudWxsOworICAgICAgICBpbnQgc2Vjb25kU2xhc2ggPSBzZXJ2bGV0UGF0aC5pbmRleE9mKCcvJywgMSk7CisgICAgICAgIGlmIChzZWNvbmRTbGFzaCA+PSAwKSB7CisgICAgICAgICAgICAvL2N1dCBvZmYgY29udGV4dAorICAgICAgICAgICAgcmV0VmFsID0gc2VydmxldFBhdGguc3Vic3RyaW5nKHNlY29uZFNsYXNoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0VmFsOworICAgIH0KKworCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRBYnNvbHV0ZVBhdGgoU3RyaW5nIHBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBwYXRoV2l0aG91dENvbnRleHQgPSBTU0lTZXJ2bGV0UmVxdWVzdFV0aWwuZ2V0UmVsYXRpdmVQYXRoKHJlcSk7CisgICAgICAgIFN0cmluZyBwcmVmaXggPSBnZXRQYXRoV2l0aG91dEZpbGVOYW1lKHBhdGhXaXRob3V0Q29udGV4dCk7CisgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJDb3VsZG4ndCByZW1vdmUgZmlsZW5hbWUgZnJvbSBwYXRoOiAiCisgICAgICAgICAgICAgICAgICAgICsgcGF0aFdpdGhvdXRDb250ZXh0KTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgZnVsbFBhdGggPSBwcmVmaXggKyBwYXRoOworICAgICAgICBTdHJpbmcgcmV0VmFsID0gU1NJU2VydmxldFJlcXVlc3RVdGlsLm5vcm1hbGl6ZShmdWxsUGF0aCk7CisgICAgICAgIGlmIChyZXRWYWwgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJOb3JtYWxpemF0aW9uIHlpZWxkZWQgbnVsbCBvbiBwYXRoOiAiCisgICAgICAgICAgICAgICAgICAgICsgZnVsbFBhdGgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXRWYWw7CisgICAgfQorCisKKyAgICBwcm90ZWN0ZWQgU2VydmxldENvbnRleHRBbmRQYXRoIGdldFNlcnZsZXRDb250ZXh0QW5kUGF0aEZyb21Ob25WaXJ0dWFsUGF0aCgKKyAgICAgICAgICAgIFN0cmluZyBub25WaXJ0dWFsUGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG5vblZpcnR1YWxQYXRoLnN0YXJ0c1dpdGgoIi8iKSB8fCBub25WaXJ0dWFsUGF0aC5zdGFydHNXaXRoKCJcXCIpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkEgbm9uLXZpcnR1YWwgcGF0aCBjYW4ndCBiZSBhYnNvbHV0ZTogIgorICAgICAgICAgICAgICAgICAgICArIG5vblZpcnR1YWxQYXRoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobm9uVmlydHVhbFBhdGguaW5kZXhPZigiLi4vIikgPj0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJBIG5vbi12aXJ0dWFsIHBhdGggY2FuJ3QgY29udGFpbiAnLi4vJyA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBub25WaXJ0dWFsUGF0aCk7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIHBhdGggPSBnZXRBYnNvbHV0ZVBhdGgobm9uVmlydHVhbFBhdGgpOworICAgICAgICBTZXJ2bGV0Q29udGV4dCBzZXJ2bGV0Q29udGV4dCA9IHNlcnZsZXQuZ2V0U2VydmxldENvbnRleHQoKTsKKyAgICAgICAgU2VydmxldENvbnRleHRBbmRQYXRoIGNzQW5kUCA9IG5ldyBTZXJ2bGV0Q29udGV4dEFuZFBhdGgoCisgICAgICAgICAgICAgICAgc2VydmxldENvbnRleHQsIHBhdGgpOworICAgICAgICByZXR1cm4gY3NBbmRQOworICAgIH0KKworCisgICAgcHJvdGVjdGVkIFNlcnZsZXRDb250ZXh0QW5kUGF0aCBnZXRTZXJ2bGV0Q29udGV4dEFuZFBhdGhGcm9tVmlydHVhbFBhdGgoCisgICAgICAgICAgICBTdHJpbmcgdmlydHVhbFBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFNlcnZsZXRDb250ZXh0IHNlcnZsZXRDb250ZXh0ID0gc2VydmxldC5nZXRTZXJ2bGV0Q29udGV4dCgpOworICAgICAgICBTdHJpbmcgcGF0aCA9IG51bGw7CisgICAgICAgIGlmICghdmlydHVhbFBhdGguc3RhcnRzV2l0aCgiLyIpICYmICF2aXJ0dWFsUGF0aC5zdGFydHNXaXRoKCJcXCIpKSB7CisgICAgICAgICAgICBwYXRoID0gZ2V0QWJzb2x1dGVQYXRoKHZpcnR1YWxQYXRoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFN0cmluZyBub3JtYWxpemVkID0gU1NJU2VydmxldFJlcXVlc3RVdGlsLm5vcm1hbGl6ZSh2aXJ0dWFsUGF0aCk7CisgICAgICAgICAgICBpZiAoaXNWaXJ0dWFsV2ViYXBwUmVsYXRpdmUpIHsKKyAgICAgICAgICAgICAgICBwYXRoID0gbm9ybWFsaXplZDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2VydmxldENvbnRleHQgPSBzZXJ2bGV0Q29udGV4dC5nZXRDb250ZXh0KG5vcm1hbGl6ZWQpOworICAgICAgICAgICAgICAgIGlmIChzZXJ2bGV0Q29udGV4dCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiQ291bGRuJ3QgZ2V0IGNvbnRleHQgZm9yIHBhdGg6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG5vcm1hbGl6ZWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvL0lmIGl0J3MgdGhlIHJvb3QgY29udGV4dCwgdGhlbiB0aGVyZSBpcyBubyBjb250ZXh0IGVsZW1lbnQKKyAgICAgICAgICAgICAgICAvLyB0byByZW1vdmUsCisgICAgICAgICAgICAgICAgLy8gaWU6CisgICAgICAgICAgICAgICAgLy8gJy9maWxlMS5zaHRtbCcgdnMgJy9hcHBOYW1lMS9maWxlMS5zaHRtbCcKKyAgICAgICAgICAgICAgICBpZiAoIWlzUm9vdENvbnRleHQoc2VydmxldENvbnRleHQpKSB7CisgICAgICAgICAgICAgICAgICAgIHBhdGggPSBnZXRQYXRoV2l0aG91dENvbnRleHQobm9ybWFsaXplZCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChwYXRoID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkbid0IHJlbW92ZSBjb250ZXh0IGZyb20gcGF0aDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbm9ybWFsaXplZCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBwYXRoID0gbm9ybWFsaXplZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBTZXJ2bGV0Q29udGV4dEFuZFBhdGgoc2VydmxldENvbnRleHQsIHBhdGgpOworICAgIH0KKworCisgICAgLy9Bc3N1bWVzIHNlcnZsZXRDb250ZXh0IGlzIG5vdC1udWxsCisgICAgLy9Bc3N1bWVzIHRoYXQgaWRlbnRpdHkgY29tcGFyaXNvbiB3aWxsIGJlIHRydWUgZm9yIHRoZSBzYW1lIGNvbnRleHQKKyAgICAvL0Fzc3VtaW5nIHRoZSBhYm92ZSwgZ2V0Q29udGV4dCgiLyIpIHdpbGwgYmUgbm9uLW51bGwgYXMgbG9uZyBhcyB0aGUgcm9vdAorICAgIC8vIGNvbnRleHQgaXMKKyAgICAvLyBhY2Nlc3NpYmxlLgorICAgIC8vSWYgaXQgaXNuJ3QsIHRoZW4gc2VydmxldENvbnRleHQgY2FuJ3QgYmUgdGhlIHJvb3QgY29udGV4dCBhbnl3YXksIGhlbmNlCisgICAgLy8gdGhleSB3aWxsCisgICAgLy8gbm90IG1hdGNoLgorICAgIHByb3RlY3RlZCBib29sZWFuIGlzUm9vdENvbnRleHQoU2VydmxldENvbnRleHQgc2VydmxldENvbnRleHQpIHsKKyAgICAgICAgcmV0dXJuIHNlcnZsZXRDb250ZXh0ID09IHNlcnZsZXRDb250ZXh0LmdldENvbnRleHQoIi8iKTsKKyAgICB9CisKKworICAgIHByb3RlY3RlZCBTZXJ2bGV0Q29udGV4dEFuZFBhdGggZ2V0U2VydmxldENvbnRleHRBbmRQYXRoKAorICAgICAgICAgICAgU3RyaW5nIG9yaWdpbmFsUGF0aCwgYm9vbGVhbiB2aXJ0dWFsKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTZXJ2bGV0Q29udGV4dEFuZFBhdGggY3NBbmRQID0gbnVsbDsKKyAgICAgICAgaWYgKGRlYnVnID4gMCkgeworICAgICAgICAgICAgbG9nKCJTU0lTZXJ2bGV0RXh0ZXJuYWxSZXNvbHZlci5nZXRTZXJ2bGV0Q29udGV4dEFuZFBhdGgoICIKKyAgICAgICAgICAgICAgICAgICAgKyBvcmlnaW5hbFBhdGggKyAiLCAiICsgdmlydHVhbCArICIpIiwgbnVsbCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZpcnR1YWwpIHsKKyAgICAgICAgICAgIGNzQW5kUCA9IGdldFNlcnZsZXRDb250ZXh0QW5kUGF0aEZyb21WaXJ0dWFsUGF0aChvcmlnaW5hbFBhdGgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY3NBbmRQID0gZ2V0U2VydmxldENvbnRleHRBbmRQYXRoRnJvbU5vblZpcnR1YWxQYXRoKG9yaWdpbmFsUGF0aCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNzQW5kUDsKKyAgICB9CisKKworICAgIHByb3RlY3RlZCBVUkxDb25uZWN0aW9uIGdldFVSTENvbm5lY3Rpb24oU3RyaW5nIG9yaWdpbmFsUGF0aCwKKyAgICAgICAgICAgIGJvb2xlYW4gdmlydHVhbCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU2VydmxldENvbnRleHRBbmRQYXRoIGNzQW5kUCA9IGdldFNlcnZsZXRDb250ZXh0QW5kUGF0aChvcmlnaW5hbFBhdGgsCisgICAgICAgICAgICAgICAgdmlydHVhbCk7CisgICAgICAgIFNlcnZsZXRDb250ZXh0IGNvbnRleHQgPSBjc0FuZFAuZ2V0U2VydmxldENvbnRleHQoKTsKKyAgICAgICAgU3RyaW5nIHBhdGggPSBjc0FuZFAuZ2V0UGF0aCgpOworICAgICAgICBVUkwgdXJsID0gY29udGV4dC5nZXRSZXNvdXJjZShwYXRoKTsKKyAgICAgICAgaWYgKHVybCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkNvbnRleHQgZGlkIG5vdCBjb250YWluIHJlc291cmNlOiAiICsgcGF0aCk7CisgICAgICAgIH0KKyAgICAgICAgVVJMQ29ubmVjdGlvbiB1cmxDb25uZWN0aW9uID0gdXJsLm9wZW5Db25uZWN0aW9uKCk7CisgICAgICAgIHJldHVybiB1cmxDb25uZWN0aW9uOworICAgIH0KKworCisgICAgcHVibGljIGxvbmcgZ2V0RmlsZUxhc3RNb2RpZmllZChTdHJpbmcgcGF0aCwgYm9vbGVhbiB2aXJ0dWFsKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgbG9uZyBsYXN0TW9kaWZpZWQgPSAwOworICAgICAgICBVUkxDb25uZWN0aW9uIHVybENvbm5lY3Rpb24gPSBnZXRVUkxDb25uZWN0aW9uKHBhdGgsIHZpcnR1YWwpOworICAgICAgICBsYXN0TW9kaWZpZWQgPSB1cmxDb25uZWN0aW9uLmdldExhc3RNb2RpZmllZCgpOworICAgICAgICByZXR1cm4gbGFzdE1vZGlmaWVkOworICAgIH0KKworCisgICAgcHVibGljIGxvbmcgZ2V0RmlsZVNpemUoU3RyaW5nIHBhdGgsIGJvb2xlYW4gdmlydHVhbCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgbG9uZyBmaWxlU2l6ZSA9IC0xOworICAgICAgICBVUkxDb25uZWN0aW9uIHVybENvbm5lY3Rpb24gPSBnZXRVUkxDb25uZWN0aW9uKHBhdGgsIHZpcnR1YWwpOworICAgICAgICBmaWxlU2l6ZSA9IHVybENvbm5lY3Rpb24uZ2V0Q29udGVudExlbmd0aCgpOworICAgICAgICByZXR1cm4gZmlsZVNpemU7CisgICAgfQorCisKKyAgICAvL1dlIGFyZSBtYWtpbmcgbG90cyBvZiB1bm5lY2Vzc2FyeSBjb3BpZXMgb2YgdGhlIGluY2x1ZGVkIGRhdGEgaGVyZS4gSWYKKyAgICAvLyBzb21lb25lIGV2ZXIKKyAgICAvLyBjb21wbGFpbnMgdGhhdCB0aGlzCisgICAgLy9pcyBzbG93LCB3ZSBzaG91bGQgY29ubmVjdCB0aGUgaW5jbHVkZWQgc3RyZWFtIHRvIHRoZSBwcmludCB3cml0ZXIgdGhhdAorICAgIC8vIFNTSUNvbW1hbmQKKyAgICAvLyB1c2VzLgorICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmlsZVRleHQoU3RyaW5nIG9yaWdpbmFsUGF0aCwgYm9vbGVhbiB2aXJ0dWFsKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFNlcnZsZXRDb250ZXh0QW5kUGF0aCBjc0FuZFAgPSBnZXRTZXJ2bGV0Q29udGV4dEFuZFBhdGgoCisgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsUGF0aCwgdmlydHVhbCk7CisgICAgICAgICAgICBTZXJ2bGV0Q29udGV4dCBjb250ZXh0ID0gY3NBbmRQLmdldFNlcnZsZXRDb250ZXh0KCk7CisgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IGNzQW5kUC5nZXRQYXRoKCk7CisgICAgICAgICAgICBSZXF1ZXN0RGlzcGF0Y2hlciByZCA9IGNvbnRleHQuZ2V0UmVxdWVzdERpc3BhdGNoZXIocGF0aCk7CisgICAgICAgICAgICBpZiAocmQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZG4ndCBnZXQgcmVxdWVzdCBkaXNwYXRjaGVyIGZvciBwYXRoOiAiICsgcGF0aCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBCeXRlQXJyYXlTZXJ2bGV0T3V0cHV0U3RyZWFtIGJhc29zID0gbmV3IEJ5dGVBcnJheVNlcnZsZXRPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIFJlc3BvbnNlSW5jbHVkZVdyYXBwZXIgcmVzcG9uc2VJbmNsdWRlV3JhcHBlciA9IG5ldyBSZXNwb25zZUluY2x1ZGVXcmFwcGVyKAorICAgICAgICAgICAgICAgICAgICByZXMsIGJhc29zKTsKKyAgICAgICAgICAgIHJkLmluY2x1ZGUocmVxLCByZXNwb25zZUluY2x1ZGVXcmFwcGVyKTsKKyAgICAgICAgICAgIC8vV2UgY2FuJ3QgYXNzdW1lIHRoZSBpbmNsdWRlZCBzZXJ2bGV0IGZsdXNoZWQgaXRzIG91dHB1dAorICAgICAgICAgICAgcmVzcG9uc2VJbmNsdWRlV3JhcHBlci5mbHVzaE91dHB1dFN0cmVhbU9yV3JpdGVyKCk7CisgICAgICAgICAgICBieXRlW10gYnl0ZXMgPSBiYXNvcy50b0J5dGVBcnJheSgpOworICAgICAgICAgICAgLy9Bc3N1bWUgdGhhdCB0aGUgZGVmYXVsdCBlbmNvZGluZyBpcyB3aGF0IHdhcyB1c2VkIHRvIGVuY29kZSB0aGUKKyAgICAgICAgICAgIC8vIGJ5dGVzLgorICAgICAgICAgICAgLy8gUXVlc3Rpb25hYmxlLgorICAgICAgICAgICAgU3RyaW5nIHJldFZhbCA9IG5ldyBTdHJpbmcoYnl0ZXMpOworICAgICAgICAgICAgLy9tYWtlIGFuIGFzc3VtcHRpb24gdGhhdCBhbiBlbXB0eSByZXNwb25zZSBpcyBhIGZhaWx1cmUuIFRoaXMgaXMKKyAgICAgICAgICAgIC8vIGEgcHJvYmxlbQorICAgICAgICAgICAgLy8gaWYgYSB0cnVseSBlbXB0eSBmaWxlCisgICAgICAgICAgICAvL3dlcmUgaW5jbHVkZWQsIGJ1dCBub3Qgc3VyZSBob3cgZWxzZSB0byB0ZWxsLgorICAgICAgICAgICAgaWYgKHJldFZhbC5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJDb3VsZG4ndCBmaW5kIGZpbGU6ICIgKyBwYXRoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXRWYWw7CisgICAgICAgIH0gY2F0Y2ggKFNlcnZsZXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJDb3VsZG4ndCBpbmNsdWRlIGZpbGU6ICIgKyBvcmlnaW5hbFBhdGgKKyAgICAgICAgICAgICAgICAgICAgKyAiIGJlY2F1c2Ugb2YgU2VydmxldEV4Y2VwdGlvbjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBjbGFzcyBTZXJ2bGV0Q29udGV4dEFuZFBhdGggeworICAgICAgICBwcm90ZWN0ZWQgU2VydmxldENvbnRleHQgc2VydmxldENvbnRleHQ7CisgICAgICAgIHByb3RlY3RlZCBTdHJpbmcgcGF0aDsKKworCisgICAgICAgIHB1YmxpYyBTZXJ2bGV0Q29udGV4dEFuZFBhdGgoU2VydmxldENvbnRleHQgc2VydmxldENvbnRleHQsIFN0cmluZyBwYXRoKSB7CisgICAgICAgICAgICB0aGlzLnNlcnZsZXRDb250ZXh0ID0gc2VydmxldENvbnRleHQ7CisgICAgICAgICAgICB0aGlzLnBhdGggPSBwYXRoOworICAgICAgICB9CisKKworICAgICAgICBwdWJsaWMgU2VydmxldENvbnRleHQgZ2V0U2VydmxldENvbnRleHQoKSB7CisgICAgICAgICAgICByZXR1cm4gc2VydmxldENvbnRleHQ7CisgICAgICAgIH0KKworCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpIHsKKyAgICAgICAgICAgIHJldHVybiBwYXRoOworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zc2kvU1NJU2VydmxldFJlcXVlc3RVdGlsLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3NpL1NTSVNlcnZsZXRSZXF1ZXN0VXRpbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhMjI3ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3NpL1NTSVNlcnZsZXRSZXF1ZXN0VXRpbC5qYXZhCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gTGljZW5zZWQgdW5kZXIgdGhlCisgKiBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisgKiBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UKKyAqIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZQorICogbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcworICogZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZQorICogZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnNzaTsKKworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuUmVxdWVzdFV0aWw7CitwdWJsaWMgY2xhc3MgU1NJU2VydmxldFJlcXVlc3RVdGlsIHsKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHJlbGF0aXZlIHBhdGggYXNzb2NpYXRlZCB3aXRoIHRoaXMgc2VydmxldC4gVGFrZW4gZnJvbQorICAgICAqIERlZmF1bHRTZXJ2bGV0LmphdmEuIFBlcmhhcHMgdGhpcyBzaG91bGQgYmUgcHV0IGluCisgICAgICogb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsIHNvbWV3aGVyZT8gU2VlbXMgbGlrZSBpdCB3b3VsZCBiZSB3aWRlbHkgdXNlZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcmVxdWVzdAorICAgICAqICAgICAgICAgICAgVGhlIHNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlbGF0aXZlUGF0aChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICAvLyBBcmUgd2UgYmVpbmcgcHJvY2Vzc2VkIGJ5IGEgUmVxdWVzdERpc3BhdGNoZXIuaW5jbHVkZSgpPworICAgICAgICBpZiAocmVxdWVzdC5nZXRBdHRyaWJ1dGUoImphdmF4LnNlcnZsZXQuaW5jbHVkZS5yZXF1ZXN0X3VyaSIpICE9IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZyByZXN1bHQgPSAoU3RyaW5nKXJlcXVlc3QKKyAgICAgICAgICAgICAgICAgICAgLmdldEF0dHJpYnV0ZSgiamF2YXguc2VydmxldC5pbmNsdWRlLnBhdGhfaW5mbyIpOworICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdCA9IChTdHJpbmcpcmVxdWVzdAorICAgICAgICAgICAgICAgICAgICAgICAgLmdldEF0dHJpYnV0ZSgiamF2YXguc2VydmxldC5pbmNsdWRlLnNlcnZsZXRfcGF0aCIpOworICAgICAgICAgICAgaWYgKChyZXN1bHQgPT0gbnVsbCkgfHwgKHJlc3VsdC5lcXVhbHMoIiIpKSkgcmVzdWx0ID0gIi8iOworICAgICAgICAgICAgcmV0dXJuIChyZXN1bHQpOworICAgICAgICB9CisgICAgICAgIC8vIE5vLCBleHRyYWN0IHRoZSBkZXNpcmVkIHBhdGggZGlyZWN0bHkgZnJvbSB0aGUgcmVxdWVzdAorICAgICAgICBTdHJpbmcgcmVzdWx0ID0gcmVxdWVzdC5nZXRQYXRoSW5mbygpOworICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IHJlcXVlc3QuZ2V0U2VydmxldFBhdGgoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHJlc3VsdCA9PSBudWxsKSB8fCAocmVzdWx0LmVxdWFscygiIikpKSB7CisgICAgICAgICAgICByZXN1bHQgPSAiLyI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZShyZXN1bHQpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgY29udGV4dC1yZWxhdGl2ZSBwYXRoLCBiZWdpbm5pbmcgd2l0aCBhICIvIiwgdGhhdCByZXByZXNlbnRzCisgICAgICogdGhlIGNhbm9uaWNhbCB2ZXJzaW9uIG9mIHRoZSBzcGVjaWZpZWQgcGF0aCBhZnRlciAiLi4iIGFuZCAiLiIgZWxlbWVudHMKKyAgICAgKiBhcmUgcmVzb2x2ZWQgb3V0LiBJZiB0aGUgc3BlY2lmaWVkIHBhdGggYXR0ZW1wdHMgdG8gZ28gb3V0c2lkZSB0aGUKKyAgICAgKiBib3VuZGFyaWVzIG9mIHRoZSBjdXJyZW50IGNvbnRleHQgKGkuZS4gdG9vIG1hbnkgIi4uIiBwYXRoIGVsZW1lbnRzIGFyZQorICAgICAqIHByZXNlbnQpLCByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaW5zdGVhZC4gVGhpcyBub3JtYWxpemUgc2hvdWxkIGJlCisgICAgICogdGhlIHNhbWUgYXMgRGVmYXVsdFNlcnZsZXQubm9ybWFsaXplLCB3aGljaCBpcyBhbG1vc3QgdGhlIHNhbWUgKCBzZWUKKyAgICAgKiBzb3VyY2UgY29kZSBiZWxvdyApIGFzIFJlcXVlc3RVdGlsLm5vcm1hbGl6ZS4gRG8gd2UgbmVlZCBhbGwgdGhpcworICAgICAqIGR1cGxpY2F0aW9uPworICAgICAqIAorICAgICAqIEBwYXJhbSBwYXRoCisgICAgICogICAgICAgICAgICBQYXRoIHRvIGJlIG5vcm1hbGl6ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBub3JtYWxpemUoU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgaWYgKHBhdGggPT0gbnVsbCkgcmV0dXJuIG51bGw7CisgICAgICAgIFN0cmluZyBub3JtYWxpemVkID0gcGF0aDsKKyAgICAgICAgLy9XaHkgZG9lc24ndCBSZXF1ZXN0VXRpbCBkbyB0aGlzPz8KKyAgICAgICAgLy8gTm9ybWFsaXplIHRoZSBzbGFzaGVzIGFuZCBhZGQgbGVhZGluZyBzbGFzaCBpZiBuZWNlc3NhcnkKKyAgICAgICAgaWYgKG5vcm1hbGl6ZWQuaW5kZXhPZignXFwnKSA+PSAwKQorICAgICAgICAgICAgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZWQucmVwbGFjZSgnXFwnLCAnLycpOworICAgICAgICBub3JtYWxpemVkID0gUmVxdWVzdFV0aWwubm9ybWFsaXplKHBhdGgpOworICAgICAgICByZXR1cm4gbm9ybWFsaXplZDsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3NzaS9TU0lTZXQuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zc2kvU1NJU2V0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThjZGE3YwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zc2kvU1NJU2V0LmphdmEKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBMaWNlbnNlZCB1bmRlciB0aGUKKyAqIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyAqIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZQorICogYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlCisgKiBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzCisgKiBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlCisgKiBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3NpOworCisKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworLyoqCisgKiBJbXBsZW1lbnRzIHRoZSBTZXJ2ZXItc2lkZSAjc2V0IGNvbW1hbmQKKyAqIAorICogQGF1dGhvciBQYXVsIFNwZWVkCisgKiBAYXV0aG9yIERhbiBTYW5kYmVyZworICogQHZlcnNpb24gJFJldmlzaW9uJCwgJERhdGUkCisgKi8KK3B1YmxpYyBjbGFzcyBTU0lTZXQgaW1wbGVtZW50cyBTU0lDb21tYW5kIHsKKyAgICAvKioKKyAgICAgKiBAc2VlIFNTSUNvbW1hbmQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwcm9jZXNzKFNTSU1lZGlhdG9yIHNzaU1lZGlhdG9yLCBTdHJpbmcgY29tbWFuZE5hbWUsCisgICAgICAgICAgICBTdHJpbmdbXSBwYXJhbU5hbWVzLCBTdHJpbmdbXSBwYXJhbVZhbHVlcywgUHJpbnRXcml0ZXIgd3JpdGVyKQorICAgICAgICAgICAgdGhyb3dzIFNTSVN0b3BQcm9jZXNzaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGVycm9yTWVzc2FnZSA9IHNzaU1lZGlhdG9yLmdldENvbmZpZ0Vyck1zZygpOworICAgICAgICBTdHJpbmcgdmFyaWFibGVOYW1lID0gbnVsbDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbU5hbWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBTdHJpbmcgcGFyYW1OYW1lID0gcGFyYW1OYW1lc1tpXTsKKyAgICAgICAgICAgIFN0cmluZyBwYXJhbVZhbHVlID0gcGFyYW1WYWx1ZXNbaV07CisgICAgICAgICAgICBpZiAocGFyYW1OYW1lLmVxdWFsc0lnbm9yZUNhc2UoInZhciIpKSB7CisgICAgICAgICAgICAgICAgdmFyaWFibGVOYW1lID0gcGFyYW1WYWx1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW1OYW1lLmVxdWFsc0lnbm9yZUNhc2UoInZhbHVlIikpIHsKKyAgICAgICAgICAgICAgICBpZiAodmFyaWFibGVOYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHN1YnN0aXR1dGVkVmFsdWUgPSBzc2lNZWRpYXRvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdWJzdGl0dXRlVmFyaWFibGVzKHBhcmFtVmFsdWUpOworICAgICAgICAgICAgICAgICAgICBzc2lNZWRpYXRvci5zZXRWYXJpYWJsZVZhbHVlKHZhcmlhYmxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzdGl0dXRlZFZhbHVlKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzc2lNZWRpYXRvci5sb2coIiNzZXQtLW5vIHZhcmlhYmxlIHNwZWNpZmllZCIpOworICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoZXJyb3JNZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNTSVN0b3BQcm9jZXNzaW5nRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzc2lNZWRpYXRvci5sb2coIiNzZXQtLUludmFsaWQgYXR0cmlidXRlOiAiICsgcGFyYW1OYW1lKTsKKyAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoZXJyb3JNZXNzYWdlKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU1NJU3RvcFByb2Nlc3NpbmdFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3NpL1NTSVN0b3BQcm9jZXNzaW5nRXhjZXB0aW9uLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3NpL1NTSVN0b3BQcm9jZXNzaW5nRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y2MmJjYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zc2kvU1NJU3RvcFByb2Nlc3NpbmdFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDI0IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uIExpY2Vuc2VkIHVuZGVyIHRoZQorICogQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorICogZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlCisgKiBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUKKyAqIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMKKyAqIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UKKyAqIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5zc2k7CisKKworLyoqCisgKiBFeGNlcHRpb24gdXNlZCB0byB0ZWxsIFNTSVByb2Nlc3NvciB0aGF0IGl0IHNob3VsZCBzdG9wIHByb2Nlc3NpbmcgU1NJCisgKiBjb21tYW5kcy4gVGhpcyBpcyB1c2VkIHRvIG1pbWljayB0aGUgQXBhY2hlIGJlaGF2aW9yIGluICNzZXQgd2l0aCBpbnZhbGlkCisgKiBhdHRyaWJ1dGVzLgorICogCisgKiBAYXV0aG9yIFBhdWwgU3BlZWQKKyAqIEBhdXRob3IgRGFuIFNhbmRiZXJnCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kLCAkRGF0ZSQKKyAqLworcHVibGljIGNsYXNzIFNTSVN0b3BQcm9jZXNzaW5nRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3NpL3BhY2thZ2UuaHRtbCBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zc2kvcGFja2FnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkNmYwMTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3NpL3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDE2IEBACis8Ym9keT4KKzxwPlRoaXMgcGFja2FnZSBjb250YWlucyBjb2RlIHRoYXQgaXMgdXNlZCBieSB0aGUgU3NpSW52b2tlci48L3A+Cis8cD5UaGlzIGNsYXNzIGNvbnNpc3RzIG9mIDxjb2RlPlNzaU1lZGlhdG9yLmphdmE8L2NvZGU+IHdoaWNoIHdvcmtzIGFzIGEKK21lZGlhdG9yIGJldHdlZW4gdGhlIGRpZmZlcmVudCBTc2lDb21tYW5kcy4gVG8gYWRkIGEgY29tbWFuZCB5b3UgaGF2ZSB0bworaW1wbGVtZW50IHRoZSA8Y29kZT5Tc2lDb21tYW5kPC9jb2RlPiBpbnRlcmZhY2UgYW5kIGV4dGVuZCB0aGUKKzxjb2RlPlNzaU1lZGlhdG9yPC9jb2RlPi4gQ29tbWFuZHMgY3VycmVudGx5IGltcGxlbWVudGVkIGFyZTwvcD4KKworPHVsPgorPGxpPjxiPlNzaUNvbmZpZzwvYj4gLSBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgTkNTQSBjb21tYW5kIENvbmZpZyBpLmUuICZsdDshLS0jY29uZmlnIGVycm1zZz0iZXJyb3I/Ii0tJmd0OzwvbGk+Cis8bGk+PGI+U3NpRWNobzwvYj4gLSBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgTkNTQSBjb21tYW5kIEVjaG8gaS5lLiAmbHQ7IS0tI2VjaG8gdmFyPSJTRVJWRVJfTkFNRSItLSZndDs8L2xpPgorPGxpPjxiPlNzaUV4ZWM8L2I+IC0gTm90IGltcGxlbWVudGVkPC9saT4KKzxsaT48Yj5Tc2lGbGFzdE1vZDwvYj4gLSBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgTkNTQSBjb21tYW5kIGZsYXN0bW9kIGkuZS4gJmx0OyEtLSNmbGFzdG1vZCB2aXJ0dWFsPSJmaWxlIi0tJmd0OzwvbGk+Cis8bGk+PGI+U3NpRnNpemU8L2I+IC0gSW1wbGVtZW50YXRpb24gb2YgdGhlIE5DU0EgY29tbWFuZCBmc2l6ZSBpLmUuICZsdDshLS0jZnNpemUgZmlsZT0iZmlsZSItLSZndDs8L2xpPgorPGxpPjxiPlNzaUluY2x1ZGU8L2I+IC0gSW1wbGVtZW50YXRpb24gb2YgdGhlIE5DU0EgY29tbWFuZCBJbmNsdWRlIGkuZS4gJmx0OyEtLSNjb25maWcgdmlydHVhbD0iaW5jbHVkZWZpbGUiLS0mZ3Q7PC9saT4KKzwvdWw+Cis8L2JvZHk+CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9BdXRoZW50aWNhdG9ycy5wcm9wZXJ0aWVzIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvQXV0aGVudGljYXRvcnMucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWU2MjNhCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvQXV0aGVudGljYXRvcnMucHJvcGVydGllcwpAQCAtMCwwICsxLDUgQEAKK0JBU0lDPW9yZy5hcGFjaGUuY2F0YWxpbmEuYXV0aGVudGljYXRvci5CYXNpY0F1dGhlbnRpY2F0b3IKK0NMSUVOVC1DRVJUPW9yZy5hcGFjaGUuY2F0YWxpbmEuYXV0aGVudGljYXRvci5TU0xBdXRoZW50aWNhdG9yCitESUdFU1Q9b3JnLmFwYWNoZS5jYXRhbGluYS5hdXRoZW50aWNhdG9yLkRpZ2VzdEF1dGhlbnRpY2F0b3IKK0ZPUk09b3JnLmFwYWNoZS5jYXRhbGluYS5hdXRoZW50aWNhdG9yLkZvcm1BdXRoZW50aWNhdG9yCitOT05FPW9yZy5hcGFjaGUuY2F0YWxpbmEuYXV0aGVudGljYXRvci5Ob25Mb2dpbkF1dGhlbnRpY2F0b3IKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdGFydHVwL0Jvb3RzdHJhcC5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvQm9vdHN0cmFwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMzNWFjMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdGFydHVwL0Jvb3RzdHJhcC5qYXZhCkBAIC0wLDAgKzEsNDkyIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0YXJ0dXA7CisKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CisKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXJGYWN0b3J5OworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuc2VjdXJpdHkuU2VjdXJpdHlDbGFzc0xvYWQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7CisKKworLyoqCisgKiBCb29zdHJhcCBsb2FkZXIgZm9yIENhdGFsaW5hLiAgVGhpcyBhcHBsaWNhdGlvbiBjb25zdHJ1Y3RzIGEgY2xhc3MgbG9hZGVyCisgKiBmb3IgdXNlIGluIGxvYWRpbmcgdGhlIENhdGFsaW5hIGludGVybmFsIGNsYXNzZXMgKGJ5IGFjY3VtdWxhdGluZyBhbGwgb2YgdGhlCisgKiBKQVIgZmlsZXMgZm91bmQgaW4gdGhlICJzZXJ2ZXIiIGRpcmVjdG9yeSB1bmRlciAiY2F0YWxpbmEuaG9tZSIpLCBhbmQKKyAqIHN0YXJ0cyB0aGUgcmVndWxhciBleGVjdXRpb24gb2YgdGhlIGNvbnRhaW5lci4gIFRoZSBwdXJwb3NlIG9mIHRoaXMKKyAqIHJvdW5kYWJvdXQgYXBwcm9hY2ggaXMgdG8ga2VlcCB0aGUgQ2F0YWxpbmEgaW50ZXJuYWwgY2xhc3NlcyAoYW5kIGFueQorICogb3RoZXIgY2xhc3NlcyB0aGV5IGRlcGVuZCBvbiwgc3VjaCBhcyBhbiBYTUwgcGFyc2VyKSBvdXQgb2YgdGhlIHN5c3RlbQorICogY2xhc3MgcGF0aCBhbmQgdGhlcmVmb3JlIG5vdCB2aXNpYmxlIHRvIGFwcGxpY2F0aW9uIGxldmVsIGNsYXNzZXMuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAYXV0aG9yIFJlbXkgTWF1Y2hlcmF0CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBCb290c3RyYXAgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEJvb3RzdHJhcC5jbGFzcyk7CisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RhbnRzCisKKworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENBVEFMSU5BX0hPTUVfVE9LRU4gPSAiJHtjYXRhbGluYS5ob21lfSI7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FUQUxJTkFfQkFTRV9UT0tFTiA9ICIke2NhdGFsaW5hLmJhc2V9IjsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTdGF0aWMgVmFyaWFibGVzCisKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKTVhfRVJST1JfTUVTU0FHRSA9CisgICAgICAgICJUaGlzIHJlbGVhc2Ugb2YgQXBhY2hlIFRvbWNhdCB3YXMgcGFja2FnZWQgdG8gcnVuIG9uIEoyU0UgNS4wIFxuIgorICAgICAgICArICJvciBsYXRlci4gSXQgY2FuIGJlIHJ1biBvbiBlYXJsaWVyIEpWTXMgYnkgZG93bmxvYWRpbmcgYW5kIFxuIgorICAgICAgICArICJpbnN0YWxsaW5nIGEgY29tcGF0aWJpbGl0eSBwYWNrYWdlIGZyb20gdGhlIEFwYWNoZSBUb21jYXQgXG4iCisgICAgICAgICsgImJpbmFyeSBkb3dubG9hZCBwYWdlLiI7CisKKworICAgIC8qKgorICAgICAqIERhZW1vbiBvYmplY3QgdXNlZCBieSBtYWluLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIEJvb3RzdHJhcCBkYWVtb24gPSBudWxsOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogRGFlbW9uIHJlZmVyZW5jZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIE9iamVjdCBjYXRhbGluYURhZW1vbiA9IG51bGw7CisKKworICAgIHByb3RlY3RlZCBDbGFzc0xvYWRlciBjb21tb25Mb2FkZXIgPSBudWxsOworICAgIHByb3RlY3RlZCBDbGFzc0xvYWRlciBjYXRhbGluYUxvYWRlciA9IG51bGw7CisgICAgcHJvdGVjdGVkIENsYXNzTG9hZGVyIHNoYXJlZExvYWRlciA9IG51bGw7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByaXZhdGUgTWV0aG9kcworCisKKyAgICBwcml2YXRlIHZvaWQgaW5pdENsYXNzTG9hZGVycygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNvbW1vbkxvYWRlciA9IGNyZWF0ZUNsYXNzTG9hZGVyKCJjb21tb24iLCBudWxsKTsKKyAgICAgICAgICAgIGNhdGFsaW5hTG9hZGVyID0gY3JlYXRlQ2xhc3NMb2FkZXIoInNlcnZlciIsIGNvbW1vbkxvYWRlcik7CisgICAgICAgICAgICBzaGFyZWRMb2FkZXIgPSBjcmVhdGVDbGFzc0xvYWRlcigic2hhcmVkIiwgY29tbW9uTG9hZGVyKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcigiQ2xhc3MgbG9hZGVyIGNyZWF0aW9uIHRocmV3IGV4Y2VwdGlvbiIsIHQpOworICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHByaXZhdGUgQ2xhc3NMb2FkZXIgY3JlYXRlQ2xhc3NMb2FkZXIoU3RyaW5nIG5hbWUsIENsYXNzTG9hZGVyIHBhcmVudCkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgU3RyaW5nIHZhbHVlID0gQ2F0YWxpbmFQcm9wZXJ0aWVzLmdldFByb3BlcnR5KG5hbWUgKyAiLmxvYWRlciIpOworICAgICAgICBpZiAoKHZhbHVlID09IG51bGwpIHx8ICh2YWx1ZS5lcXVhbHMoIiIpKSkKKyAgICAgICAgICAgIHJldHVybiBwYXJlbnQ7CisKKyAgICAgICAgQXJyYXlMaXN0IHVucGFja2VkTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgQXJyYXlMaXN0IHBhY2tlZExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIEFycmF5TGlzdCB1cmxMaXN0ID0gbmV3IEFycmF5TGlzdCgpOworCisgICAgICAgIFN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHZhbHVlLCAiLCIpOworICAgICAgICB3aGlsZSAodG9rZW5pemVyLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICBTdHJpbmcgcmVwb3NpdG9yeSA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKKworICAgICAgICAgICAgLy8gTG9jYWwgcmVwb3NpdG9yeQorICAgICAgICAgICAgYm9vbGVhbiBwYWNrZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmIChyZXBvc2l0b3J5LnN0YXJ0c1dpdGgoQ0FUQUxJTkFfSE9NRV9UT0tFTikpIHsKKyAgICAgICAgICAgICAgICByZXBvc2l0b3J5ID0gZ2V0Q2F0YWxpbmFIb21lKCkgCisgICAgICAgICAgICAgICAgICAgICsgcmVwb3NpdG9yeS5zdWJzdHJpbmcoQ0FUQUxJTkFfSE9NRV9UT0tFTi5sZW5ndGgoKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHJlcG9zaXRvcnkuc3RhcnRzV2l0aChDQVRBTElOQV9CQVNFX1RPS0VOKSkgeworICAgICAgICAgICAgICAgIHJlcG9zaXRvcnkgPSBnZXRDYXRhbGluYUJhc2UoKSAKKyAgICAgICAgICAgICAgICAgICAgKyByZXBvc2l0b3J5LnN1YnN0cmluZyhDQVRBTElOQV9CQVNFX1RPS0VOLmxlbmd0aCgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGEgSkFSIFVSTCByZXBvc2l0b3J5CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHVybExpc3QuYWRkKG5ldyBVUkwocmVwb3NpdG9yeSkpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBJZ25vcmUKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHJlcG9zaXRvcnkuZW5kc1dpdGgoIiouamFyIikpIHsKKyAgICAgICAgICAgICAgICBwYWNrZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIHJlcG9zaXRvcnkgPSByZXBvc2l0b3J5LnN1YnN0cmluZworICAgICAgICAgICAgICAgICAgICAoMCwgcmVwb3NpdG9yeS5sZW5ndGgoKSAtICIqLmphciIubGVuZ3RoKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBhY2tlZCkgeworICAgICAgICAgICAgICAgIHBhY2tlZExpc3QuYWRkKG5ldyBGaWxlKHJlcG9zaXRvcnkpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdW5wYWNrZWRMaXN0LmFkZChuZXcgRmlsZShyZXBvc2l0b3J5KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBGaWxlW10gdW5wYWNrZWQgPSAoRmlsZVtdKSB1bnBhY2tlZExpc3QudG9BcnJheShuZXcgRmlsZVswXSk7CisgICAgICAgIEZpbGVbXSBwYWNrZWQgPSAoRmlsZVtdKSBwYWNrZWRMaXN0LnRvQXJyYXkobmV3IEZpbGVbMF0pOworICAgICAgICBVUkxbXSB1cmxzID0gKFVSTFtdKSB1cmxMaXN0LnRvQXJyYXkobmV3IFVSTFswXSk7CisKKyAgICAgICAgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIgPSBDbGFzc0xvYWRlckZhY3RvcnkuY3JlYXRlQ2xhc3NMb2FkZXIKKyAgICAgICAgICAgICh1bnBhY2tlZCwgcGFja2VkLCB1cmxzLCBwYXJlbnQpOworCisgICAgICAgIC8vIFJldHJpZXZpbmcgTUJlYW4gc2VydmVyCisgICAgICAgIE1CZWFuU2VydmVyIG1CZWFuU2VydmVyID0gbnVsbDsKKyAgICAgICAgaWYgKE1CZWFuU2VydmVyRmFjdG9yeS5maW5kTUJlYW5TZXJ2ZXIobnVsbCkuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgbUJlYW5TZXJ2ZXIgPSAKKyAgICAgICAgICAgICAgICAoTUJlYW5TZXJ2ZXIpIE1CZWFuU2VydmVyRmFjdG9yeS5maW5kTUJlYW5TZXJ2ZXIobnVsbCkuZ2V0KDApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUJlYW5TZXJ2ZXIgPSBNQmVhblNlcnZlckZhY3RvcnkuY3JlYXRlTUJlYW5TZXJ2ZXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlZ2lzdGVyIHRoZSBzZXJ2ZXIgY2xhc3Nsb2FkZXIKKyAgICAgICAgT2JqZWN0TmFtZSBvYmplY3ROYW1lID0gCisgICAgICAgICAgICBuZXcgT2JqZWN0TmFtZSgiQ2F0YWxpbmE6dHlwZT1TZXJ2ZXJDbGFzc0xvYWRlcixuYW1lPSIgKyBuYW1lKTsKKyAgICAgICAgbUJlYW5TZXJ2ZXIucmVnaXN0ZXJNQmVhbihjbGFzc0xvYWRlciwgb2JqZWN0TmFtZSk7CisKKyAgICAgICAgcmV0dXJuIGNsYXNzTG9hZGVyOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIGRhZW1vbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbml0KCkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKworICAgICAgICAvLyBTZXQgQ2F0YWxpbmEgcGF0aAorICAgICAgICBzZXRDYXRhbGluYUhvbWUoKTsKKyAgICAgICAgc2V0Q2F0YWxpbmFCYXNlKCk7CisKKyAgICAgICAgaW5pdENsYXNzTG9hZGVycygpOworCisgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKGNhdGFsaW5hTG9hZGVyKTsKKworICAgICAgICBTZWN1cml0eUNsYXNzTG9hZC5zZWN1cml0eUNsYXNzTG9hZChjYXRhbGluYUxvYWRlcik7CisKKyAgICAgICAgLy8gTG9hZCBvdXIgc3RhcnR1cCBjbGFzcyBhbmQgY2FsbCBpdHMgcHJvY2VzcygpIG1ldGhvZAorICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoIkxvYWRpbmcgc3RhcnR1cCBjbGFzcyIpOworICAgICAgICBDbGFzcyBzdGFydHVwQ2xhc3MgPQorICAgICAgICAgICAgY2F0YWxpbmFMb2FkZXIubG9hZENsYXNzCisgICAgICAgICAgICAoIm9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cC5DYXRhbGluYSIpOworICAgICAgICBPYmplY3Qgc3RhcnR1cEluc3RhbmNlID0gc3RhcnR1cENsYXNzLm5ld0luc3RhbmNlKCk7CisKKyAgICAgICAgLy8gU2V0IHRoZSBzaGFyZWQgZXh0ZW5zaW9ucyBjbGFzcyBsb2FkZXIKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmRlYnVnKCJTZXR0aW5nIHN0YXJ0dXAgY2xhc3MgcHJvcGVydGllcyIpOworICAgICAgICBTdHJpbmcgbWV0aG9kTmFtZSA9ICJzZXRQYXJlbnRDbGFzc0xvYWRlciI7CisgICAgICAgIENsYXNzIHBhcmFtVHlwZXNbXSA9IG5ldyBDbGFzc1sxXTsKKyAgICAgICAgcGFyYW1UeXBlc1swXSA9IENsYXNzLmZvck5hbWUoImphdmEubGFuZy5DbGFzc0xvYWRlciIpOworICAgICAgICBPYmplY3QgcGFyYW1WYWx1ZXNbXSA9IG5ldyBPYmplY3RbMV07CisgICAgICAgIHBhcmFtVmFsdWVzWzBdID0gc2hhcmVkTG9hZGVyOworICAgICAgICBNZXRob2QgbWV0aG9kID0KKyAgICAgICAgICAgIHN0YXJ0dXBJbnN0YW5jZS5nZXRDbGFzcygpLmdldE1ldGhvZChtZXRob2ROYW1lLCBwYXJhbVR5cGVzKTsKKyAgICAgICAgbWV0aG9kLmludm9rZShzdGFydHVwSW5zdGFuY2UsIHBhcmFtVmFsdWVzKTsKKworICAgICAgICBjYXRhbGluYURhZW1vbiA9IHN0YXJ0dXBJbnN0YW5jZTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogTG9hZCBkYWVtb24uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGxvYWQoU3RyaW5nW10gYXJndW1lbnRzKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBDYWxsIHRoZSBsb2FkKCkgbWV0aG9kCisgICAgICAgIFN0cmluZyBtZXRob2ROYW1lID0gImxvYWQiOworICAgICAgICBPYmplY3QgcGFyYW1bXTsKKyAgICAgICAgQ2xhc3MgcGFyYW1UeXBlc1tdOworICAgICAgICBpZiAoYXJndW1lbnRzPT1udWxsIHx8IGFyZ3VtZW50cy5sZW5ndGg9PTApIHsKKyAgICAgICAgICAgIHBhcmFtVHlwZXMgPSBudWxsOworICAgICAgICAgICAgcGFyYW0gPSBudWxsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcGFyYW1UeXBlcyA9IG5ldyBDbGFzc1sxXTsKKyAgICAgICAgICAgIHBhcmFtVHlwZXNbMF0gPSBhcmd1bWVudHMuZ2V0Q2xhc3MoKTsKKyAgICAgICAgICAgIHBhcmFtID0gbmV3IE9iamVjdFsxXTsKKyAgICAgICAgICAgIHBhcmFtWzBdID0gYXJndW1lbnRzOworICAgICAgICB9CisgICAgICAgIE1ldGhvZCBtZXRob2QgPSAKKyAgICAgICAgICAgIGNhdGFsaW5hRGFlbW9uLmdldENsYXNzKCkuZ2V0TWV0aG9kKG1ldGhvZE5hbWUsIHBhcmFtVHlwZXMpOworICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoIkNhbGxpbmcgc3RhcnR1cCBjbGFzcyAiICsgbWV0aG9kKTsKKyAgICAgICAgbWV0aG9kLmludm9rZShjYXRhbGluYURhZW1vbiwgcGFyYW0pOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNYWluIFByb2dyYW0KKworCisgICAgLyoqCisgICAgICogTG9hZCB0aGUgQ2F0YWxpbmEgZGFlbW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGluaXQoU3RyaW5nW10gYXJndW1lbnRzKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBpbml0KCk7CisgICAgICAgIGxvYWQoYXJndW1lbnRzKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU3RhcnQgdGhlIENhdGFsaW5hIGRhZW1vbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydCgpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiggY2F0YWxpbmFEYWVtb249PW51bGwgKSBpbml0KCk7CisKKyAgICAgICAgTWV0aG9kIG1ldGhvZCA9IGNhdGFsaW5hRGFlbW9uLmdldENsYXNzKCkuZ2V0TWV0aG9kKCJzdGFydCIsIG51bGwpOworICAgICAgICBtZXRob2QuaW52b2tlKGNhdGFsaW5hRGFlbW9uLCBudWxsKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU3RvcCB0aGUgQ2F0YWxpbmEgRGFlbW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0b3AoKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBNZXRob2QgbWV0aG9kID0gY2F0YWxpbmFEYWVtb24uZ2V0Q2xhc3MoKS5nZXRNZXRob2QoInN0b3AiLCBudWxsKTsKKyAgICAgICAgbWV0aG9kLmludm9rZShjYXRhbGluYURhZW1vbiwgbnVsbCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFN0b3AgdGhlIHN0YW5kbG9uZSBzZXJ2ZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcFNlcnZlcigpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIE1ldGhvZCBtZXRob2QgPSAKKyAgICAgICAgICAgIGNhdGFsaW5hRGFlbW9uLmdldENsYXNzKCkuZ2V0TWV0aG9kKCJzdG9wU2VydmVyIiwgbnVsbCk7CisgICAgICAgIG1ldGhvZC5pbnZva2UoY2F0YWxpbmFEYWVtb24sIG51bGwpOworCisgICAgfQorCisKKyAgIC8qKgorICAgICAqIFN0b3AgdGhlIHN0YW5kbG9uZSBzZXJ2ZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcFNlcnZlcihTdHJpbmdbXSBhcmd1bWVudHMpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIE9iamVjdCBwYXJhbVtdOworICAgICAgICBDbGFzcyBwYXJhbVR5cGVzW107CisgICAgICAgIGlmIChhcmd1bWVudHM9PW51bGwgfHwgYXJndW1lbnRzLmxlbmd0aD09MCkgeworICAgICAgICAgICAgcGFyYW1UeXBlcyA9IG51bGw7CisgICAgICAgICAgICBwYXJhbSA9IG51bGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwYXJhbVR5cGVzID0gbmV3IENsYXNzWzFdOworICAgICAgICAgICAgcGFyYW1UeXBlc1swXSA9IGFyZ3VtZW50cy5nZXRDbGFzcygpOworICAgICAgICAgICAgcGFyYW0gPSBuZXcgT2JqZWN0WzFdOworICAgICAgICAgICAgcGFyYW1bMF0gPSBhcmd1bWVudHM7CisgICAgICAgIH0KKyAgICAgICAgTWV0aG9kIG1ldGhvZCA9IAorICAgICAgICAgICAgY2F0YWxpbmFEYWVtb24uZ2V0Q2xhc3MoKS5nZXRNZXRob2QoInN0b3BTZXJ2ZXIiLCBwYXJhbVR5cGVzKTsKKyAgICAgICAgbWV0aG9kLmludm9rZShjYXRhbGluYURhZW1vbiwgcGFyYW0pOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgZmxhZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBd2FpdChib29sZWFuIGF3YWl0KQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBDbGFzcyBwYXJhbVR5cGVzW10gPSBuZXcgQ2xhc3NbMV07CisgICAgICAgIHBhcmFtVHlwZXNbMF0gPSBCb29sZWFuLlRZUEU7CisgICAgICAgIE9iamVjdCBwYXJhbVZhbHVlc1tdID0gbmV3IE9iamVjdFsxXTsKKyAgICAgICAgcGFyYW1WYWx1ZXNbMF0gPSBuZXcgQm9vbGVhbihhd2FpdCk7CisgICAgICAgIE1ldGhvZCBtZXRob2QgPSAKKyAgICAgICAgICAgIGNhdGFsaW5hRGFlbW9uLmdldENsYXNzKCkuZ2V0TWV0aG9kKCJzZXRBd2FpdCIsIHBhcmFtVHlwZXMpOworICAgICAgICBtZXRob2QuaW52b2tlKGNhdGFsaW5hRGFlbW9uLCBwYXJhbVZhbHVlcyk7CisKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRBd2FpdCgpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIENsYXNzIHBhcmFtVHlwZXNbXSA9IG5ldyBDbGFzc1swXTsKKyAgICAgICAgT2JqZWN0IHBhcmFtVmFsdWVzW10gPSBuZXcgT2JqZWN0WzBdOworICAgICAgICBNZXRob2QgbWV0aG9kID0KKyAgICAgICAgICAgIGNhdGFsaW5hRGFlbW9uLmdldENsYXNzKCkuZ2V0TWV0aG9kKCJnZXRBd2FpdCIsIHBhcmFtVHlwZXMpOworICAgICAgICBCb29sZWFuIGI9KEJvb2xlYW4pbWV0aG9kLmludm9rZShjYXRhbGluYURhZW1vbiwgcGFyYW1WYWx1ZXMpOworICAgICAgICByZXR1cm4gYi5ib29sZWFuVmFsdWUoKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIERlc3Ryb3kgdGhlIENhdGFsaW5hIERhZW1vbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkZXN0cm95KCkgeworCisgICAgICAgIC8vIEZJWE1FCisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIE1haW4gbWV0aG9kLCB1c2VkIGZvciB0ZXN0aW5nIG9ubHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXJncyBDb21tYW5kIGxpbmUgYXJndW1lbnRzIHRvIGJlIHByb2Nlc3NlZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pIHsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gQXR0ZW1wdCB0byBsb2FkIEpNWCBjbGFzcworICAgICAgICAgICAgbmV3IE9iamVjdE5hbWUoInRlc3Q6Zm9vPWJhciIpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKEpNWF9FUlJPUl9NRVNTQUdFKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgLy8gR2l2ZSB1c2VycyBzb21lIHRpbWUgdG8gcmVhZCB0aGUgbWVzc2FnZSBiZWZvcmUgZXhpdGluZworICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCg1MDAwKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRhZW1vbiA9PSBudWxsKSB7CisgICAgICAgICAgICBkYWVtb24gPSBuZXcgQm9vdHN0cmFwKCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGRhZW1vbi5pbml0KCk7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgIHQucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN0cmluZyBjb21tYW5kID0gInN0YXJ0IjsKKyAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICBjb21tYW5kID0gYXJnc1thcmdzLmxlbmd0aCAtIDFdOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY29tbWFuZC5lcXVhbHMoInN0YXJ0ZCIpKSB7CisgICAgICAgICAgICAgICAgYXJnc1swXSA9ICJzdGFydCI7CisgICAgICAgICAgICAgICAgZGFlbW9uLmxvYWQoYXJncyk7CisgICAgICAgICAgICAgICAgZGFlbW9uLnN0YXJ0KCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbW1hbmQuZXF1YWxzKCJzdG9wZCIpKSB7CisgICAgICAgICAgICAgICAgYXJnc1swXSA9ICJzdG9wIjsKKyAgICAgICAgICAgICAgICBkYWVtb24uc3RvcCgpOworICAgICAgICAgICAgfSBlbHNlIGlmIChjb21tYW5kLmVxdWFscygic3RhcnQiKSkgeworICAgICAgICAgICAgICAgIGRhZW1vbi5zZXRBd2FpdCh0cnVlKTsKKyAgICAgICAgICAgICAgICBkYWVtb24ubG9hZChhcmdzKTsKKyAgICAgICAgICAgICAgICBkYWVtb24uc3RhcnQoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY29tbWFuZC5lcXVhbHMoInN0b3AiKSkgeworICAgICAgICAgICAgICAgIGRhZW1vbi5zdG9wU2VydmVyKGFyZ3MpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgdC5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q2F0YWxpbmFIb21lKFN0cmluZyBzKSB7CisgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSggImNhdGFsaW5hLmhvbWUiLCBzICk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q2F0YWxpbmFCYXNlKFN0cmluZyBzKSB7CisgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSggImNhdGFsaW5hLmJhc2UiLCBzICk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIDxjb2RlPmNhdGFsaW5hLmJhc2U8L2NvZGU+IFN5c3RlbSBwcm9wZXJ0eSB0byB0aGUgY3VycmVudAorICAgICAqIHdvcmtpbmcgZGlyZWN0b3J5IGlmIGl0IGhhcyBub3QgYmVlbiBzZXQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNldENhdGFsaW5hQmFzZSgpIHsKKworICAgICAgICBpZiAoU3lzdGVtLmdldFByb3BlcnR5KCJjYXRhbGluYS5iYXNlIikgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2F0YWxpbmEuaG9tZSIpICE9IG51bGwpCisgICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImNhdGFsaW5hLmJhc2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2F0YWxpbmEuaG9tZSIpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJjYXRhbGluYS5iYXNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIikpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIDxjb2RlPmNhdGFsaW5hLmhvbWU8L2NvZGU+IFN5c3RlbSBwcm9wZXJ0eSB0byB0aGUgY3VycmVudAorICAgICAqIHdvcmtpbmcgZGlyZWN0b3J5IGlmIGl0IGhhcyBub3QgYmVlbiBzZXQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNldENhdGFsaW5hSG9tZSgpIHsKKworICAgICAgICBpZiAoU3lzdGVtLmdldFByb3BlcnR5KCJjYXRhbGluYS5ob21lIikgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgRmlsZSBib290c3RyYXBKYXIgPSAKKyAgICAgICAgICAgIG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKSwgImJvb3RzdHJhcC5qYXIiKTsKKyAgICAgICAgaWYgKGJvb3RzdHJhcEphci5leGlzdHMoKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkKKyAgICAgICAgICAgICAgICAgICAgKCJjYXRhbGluYS5ob21lIiwgCisgICAgICAgICAgICAgICAgICAgICAobmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpLCAiLi4iKSkKKyAgICAgICAgICAgICAgICAgICAgIC5nZXRDYW5vbmljYWxQYXRoKCkpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBJZ25vcmUKKyAgICAgICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImNhdGFsaW5hLmhvbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIikpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJjYXRhbGluYS5ob21lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIikpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgdmFsdWUgb2YgdGhlIGNhdGFsaW5hLmhvbWUgZW52aXJvbm1lbnQgdmFyaWFibGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q2F0YWxpbmFIb21lKCkgeworICAgICAgICByZXR1cm4gU3lzdGVtLmdldFByb3BlcnR5KCJjYXRhbGluYS5ob21lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIikpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0IHRoZSB2YWx1ZSBvZiB0aGUgY2F0YWxpbmEuYmFzZSBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDYXRhbGluYUJhc2UoKSB7CisgICAgICAgIHJldHVybiBTeXN0ZW0uZ2V0UHJvcGVydHkoImNhdGFsaW5hLmJhc2UiLCBnZXRDYXRhbGluYUhvbWUoKSk7CisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdGFydHVwL0NhdGFsaW5hLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9DYXRhbGluYS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4YWY4NDQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9DYXRhbGluYS5qYXZhCkBAIC0wLDAgKzEsNjc0IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0YXJ0dXA7CisKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5uZXQuU29ja2V0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGFpbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuU2VydmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZFNlcnZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvbWNhdC51dGlsLmRpZ2VzdGVyLkRpZ2VzdGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuZGlnZXN0ZXIuUnVsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvbWNhdC51dGlsLmxvZy5TeXN0ZW1Mb2dIYW5kbGVyOworaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7CitpbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7CisKKworLyoqCisgKiBTdGFydHVwL1NodXRkb3duIHNoZWxsIHByb2dyYW0gZm9yIENhdGFsaW5hLiAgVGhlIGZvbGxvd2luZyBjb21tYW5kIGxpbmUKKyAqIG9wdGlvbnMgYXJlIHJlY29nbml6ZWQ6CisgKiA8dWw+CisgKiA8bGk+PGI+LWNvbmZpZyB7cGF0aG5hbWV9PC9iPiAtIFNldCB0aGUgcGF0aG5hbWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZQorICogICAgIHRvIGJlIHByb2Nlc3NlZC4gIElmIGEgcmVsYXRpdmUgcGF0aCBpcyBzcGVjaWZpZWQsIGl0IHdpbGwgYmUKKyAqICAgICBpbnRlcnByZXRlZCBhcyByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IHBhdGhuYW1lIHNwZWNpZmllZCBieSB0aGUKKyAqICAgICAiY2F0YWxpbmEuYmFzZSIgc3lzdGVtIHByb3BlcnR5LiAgIFtjb25mL3NlcnZlci54bWxdCisgKiA8bGk+PGI+LWhlbHA8L2I+IC0gRGlzcGxheSB1c2FnZSBpbmZvcm1hdGlvbi4KKyAqIDxsaT48Yj4tc3RvcDwvYj4gLSBTdG9wIHRoZSBjdXJyZW50bHkgcnVubmluZyBpbnN0YW5jZSBvZiBDYXRhbGluYS4KKyAqIDwvdT4KKyAqCisgKiBTaG91bGQgZG8gdGhlIHNhbWUgdGhpbmcgYXMgRW1iZWRkZWQsIGJ1dCB1c2luZyBhIHNlcnZlci54bWwgZmlsZS4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEBhdXRob3IgUmVteSBNYXVjaGVyYXQKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIENhdGFsaW5hIGV4dGVuZHMgRW1iZWRkZWQgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogUGF0aG5hbWUgdG8gdGhlIHNlcnZlciBjb25maWd1cmF0aW9uIGZpbGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBjb25maWdGaWxlID0gImNvbmYvc2VydmVyLnhtbCI7CisKKyAgICAvLyBYWFggU2hvdWxkIGJlIG1vdmVkIHRvIGVtYmVkZGVkCisgICAgLyoqCisgICAgICogVGhlIHNoYXJlZCBleHRlbnNpb25zIGNsYXNzIGxvYWRlciBmb3IgdGhpcyBzZXJ2ZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIENsYXNzTG9hZGVyIHBhcmVudENsYXNzTG9hZGVyID0KKyAgICAgICAgQ2F0YWxpbmEuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKTsKKworCisgICAgLyoqCisgICAgICogVGhlIHNlcnZlciBjb21wb25lbnQgd2UgYXJlIHN0YXJ0aW5nIG9yIHN0b3BwaW5nCisgICAgICovCisgICAgcHJvdGVjdGVkIFNlcnZlciBzZXJ2ZXIgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBBcmUgd2Ugc3RhcnRpbmcgYSBuZXcgc2VydmVyPworICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIHN0YXJ0aW5nID0gZmFsc2U7CisKKworICAgIC8qKgorICAgICAqIEFyZSB3ZSBzdG9wcGluZyBhbiBleGlzdGluZyBzZXJ2ZXI/CisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gc3RvcHBpbmcgPSBmYWxzZTsKKworCisgICAgLyoqCisgICAgICogVXNlIHNodXRkb3duIGhvb2sgZmxhZy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiB1c2VTaHV0ZG93bkhvb2sgPSB0cnVlOworCisKKyAgICAvKioKKyAgICAgKiBTaHV0ZG93biBob29rLgorICAgICAqLworICAgIHByb3RlY3RlZCBUaHJlYWQgc2h1dGRvd25Ib29rID0gbnVsbDsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIHB1YmxpYyB2b2lkIHNldENvbmZpZyhTdHJpbmcgZmlsZSkgeworICAgICAgICBjb25maWdGaWxlID0gZmlsZTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldENvbmZpZ0ZpbGUoU3RyaW5nIGZpbGUpIHsKKyAgICAgICAgY29uZmlnRmlsZSA9IGZpbGU7CisgICAgfQorCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbmZpZ0ZpbGUoKSB7CisgICAgICAgIHJldHVybiBjb25maWdGaWxlOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgc2V0VXNlU2h1dGRvd25Ib29rKGJvb2xlYW4gdXNlU2h1dGRvd25Ib29rKSB7CisgICAgICAgIHRoaXMudXNlU2h1dGRvd25Ib29rID0gdXNlU2h1dGRvd25Ib29rOworICAgIH0KKworCisgICAgcHVibGljIGJvb2xlYW4gZ2V0VXNlU2h1dGRvd25Ib29rKCkgeworICAgICAgICByZXR1cm4gdXNlU2h1dGRvd25Ib29rOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzaGFyZWQgZXh0ZW5zaW9ucyBjbGFzcyBsb2FkZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyZW50Q2xhc3NMb2FkZXIgVGhlIHNoYXJlZCBleHRlbnNpb25zIGNsYXNzIGxvYWRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXJlbnRDbGFzc0xvYWRlcihDbGFzc0xvYWRlciBwYXJlbnRDbGFzc0xvYWRlcikgeworCisgICAgICAgIHRoaXMucGFyZW50Q2xhc3NMb2FkZXIgPSBwYXJlbnRDbGFzc0xvYWRlcjsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzZXJ2ZXIgaW5zdGFuY2Ugd2UgYXJlIGNvbmZpZ3VyaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIHNlcnZlciBUaGUgbmV3IHNlcnZlcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNlcnZlcihTZXJ2ZXIgc2VydmVyKSB7CisKKyAgICAgICAgdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7CisKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNYWluIFByb2dyYW0KKworICAgIC8qKgorICAgICAqIFRoZSBhcHBsaWNhdGlvbiBtYWluIHByb2dyYW0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXJncyBDb21tYW5kIGxpbmUgYXJndW1lbnRzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NbXSkgeworICAgICAgICAobmV3IENhdGFsaW5hKCkpLnByb2Nlc3MoYXJncyk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgaW5zdGFuY2UgbWFpbiBwcm9ncmFtLgorICAgICAqCisgICAgICogQHBhcmFtIGFyZ3MgQ29tbWFuZCBsaW5lIGFyZ3VtZW50cworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHByb2Nlc3MoU3RyaW5nIGFyZ3NbXSkgeworCisgICAgICAgIHNldEF3YWl0KHRydWUpOworICAgICAgICBzZXRDYXRhbGluYUhvbWUoKTsKKyAgICAgICAgc2V0Q2F0YWxpbmFCYXNlKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoYXJndW1lbnRzKGFyZ3MpKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0YXJ0aW5nKSB7CisgICAgICAgICAgICAgICAgICAgIGxvYWQoYXJncyk7CisgICAgICAgICAgICAgICAgICAgIHN0YXJ0KCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdG9wcGluZykgeworICAgICAgICAgICAgICAgICAgICBzdG9wU2VydmVyKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm90ZWN0ZWQgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBzcGVjaWZpZWQgY29tbWFuZCBsaW5lIGFyZ3VtZW50cywgYW5kIHJldHVybgorICAgICAqIDxjb2RlPnRydWU8L2NvZGU+IGlmIHdlIHNob3VsZCBjb250aW51ZSBwcm9jZXNzaW5nOyBvdGhlcndpc2UKKyAgICAgKiByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIGFyZ3MgQ29tbWFuZCBsaW5lIGFyZ3VtZW50cyB0byBwcm9jZXNzCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gYXJndW1lbnRzKFN0cmluZyBhcmdzW10pIHsKKworICAgICAgICBib29sZWFuIGlzQ29uZmlnID0gZmFsc2U7CisKKyAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDwgMSkgeworICAgICAgICAgICAgdXNhZ2UoKTsKKyAgICAgICAgICAgIHJldHVybiAoZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoaXNDb25maWcpIHsKKyAgICAgICAgICAgICAgICBjb25maWdGaWxlID0gYXJnc1tpXTsKKyAgICAgICAgICAgICAgICBpc0NvbmZpZyA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLWNvbmZpZyIpKSB7CisgICAgICAgICAgICAgICAgaXNDb25maWcgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLW5vbmFtaW5nIikpIHsKKyAgICAgICAgICAgICAgICBzZXRVc2VOYW1pbmcoIGZhbHNlICk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItaGVscCIpKSB7CisgICAgICAgICAgICAgICAgdXNhZ2UoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGZhbHNlKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoInN0YXJ0IikpIHsKKyAgICAgICAgICAgICAgICBzdGFydGluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgc3RvcHBpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoInN0b3AiKSkgeworICAgICAgICAgICAgICAgIHN0YXJ0aW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgc3RvcHBpbmcgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB1c2FnZSgpOworICAgICAgICAgICAgICAgIHJldHVybiAoZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICh0cnVlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgRmlsZSBvYmplY3QgcmVwcmVzZW50aW5nIG91ciBjb25maWd1cmF0aW9uIGZpbGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIEZpbGUgY29uZmlnRmlsZSgpIHsKKworICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShjb25maWdGaWxlKTsKKyAgICAgICAgaWYgKCFmaWxlLmlzQWJzb2x1dGUoKSkKKyAgICAgICAgICAgIGZpbGUgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImNhdGFsaW5hLmJhc2UiKSwgY29uZmlnRmlsZSk7CisgICAgICAgIHJldHVybiAoZmlsZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhbmQgY29uZmlndXJlIHRoZSBEaWdlc3RlciB3ZSB3aWxsIGJlIHVzaW5nIGZvciBzdGFydHVwLgorICAgICAqLworICAgIHByb3RlY3RlZCBEaWdlc3RlciBjcmVhdGVTdGFydERpZ2VzdGVyKCkgeworICAgICAgICBsb25nIHQxPVN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBkaWdlc3RlcgorICAgICAgICBEaWdlc3RlciBkaWdlc3RlciA9IG5ldyBEaWdlc3RlcigpOworICAgICAgICBkaWdlc3Rlci5zZXRWYWxpZGF0aW5nKGZhbHNlKTsKKyAgICAgICAgZGlnZXN0ZXIuc2V0Q2xhc3NMb2FkZXIoU3RhbmRhcmRTZXJ2ZXIuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSk7CisKKyAgICAgICAgLy8gQ29uZmlndXJlIHRoZSBhY3Rpb25zIHdlIHdpbGwgYmUgdXNpbmcKKyAgICAgICAgZGlnZXN0ZXIuYWRkT2JqZWN0Q3JlYXRlKCJTZXJ2ZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZFNlcnZlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2xhc3NOYW1lIik7CisgICAgICAgIGRpZ2VzdGVyLmFkZFNldFByb3BlcnRpZXMoIlNlcnZlciIpOworICAgICAgICBkaWdlc3Rlci5hZGRTZXROZXh0KCJTZXJ2ZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXRTZXJ2ZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLlNlcnZlciIpOworCisgICAgICAgIGRpZ2VzdGVyLmFkZE9iamVjdENyZWF0ZSgiU2VydmVyL0dsb2JhbE5hbWluZ1Jlc291cmNlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuTmFtaW5nUmVzb3VyY2VzIik7CisgICAgICAgIGRpZ2VzdGVyLmFkZFNldFByb3BlcnRpZXMoIlNlcnZlci9HbG9iYWxOYW1pbmdSZXNvdXJjZXMiKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkU2V0TmV4dCgiU2VydmVyL0dsb2JhbE5hbWluZ1Jlc291cmNlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldEdsb2JhbE5hbWluZ1Jlc291cmNlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95Lk5hbWluZ1Jlc291cmNlcyIpOworCisgICAgICAgIGRpZ2VzdGVyLmFkZE9iamVjdENyZWF0ZSgiU2VydmVyL0xpc3RlbmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIC8vIE1VU1QgYmUgc3BlY2lmaWVkIGluIHRoZSBlbGVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2xhc3NOYW1lIik7CisgICAgICAgIGRpZ2VzdGVyLmFkZFNldFByb3BlcnRpZXMoIlNlcnZlci9MaXN0ZW5lciIpOworICAgICAgICBkaWdlc3Rlci5hZGRTZXROZXh0KCJTZXJ2ZXIvTGlzdGVuZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZGRMaWZlY3ljbGVMaXN0ZW5lciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlTGlzdGVuZXIiKTsKKworICAgICAgICBkaWdlc3Rlci5hZGRPYmplY3RDcmVhdGUoIlNlcnZlci9TZXJ2aWNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRTZXJ2aWNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjbGFzc05hbWUiKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkU2V0UHJvcGVydGllcygiU2VydmVyL1NlcnZpY2UiKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkU2V0TmV4dCgiU2VydmVyL1NlcnZpY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZGRTZXJ2aWNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5TZXJ2aWNlIik7CisKKyAgICAgICAgZGlnZXN0ZXIuYWRkT2JqZWN0Q3JlYXRlKCJTZXJ2ZXIvU2VydmljZS9MaXN0ZW5lciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCAvLyBNVVNUIGJlIHNwZWNpZmllZCBpbiB0aGUgZWxlbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNsYXNzTmFtZSIpOworICAgICAgICBkaWdlc3Rlci5hZGRTZXRQcm9wZXJ0aWVzKCJTZXJ2ZXIvU2VydmljZS9MaXN0ZW5lciIpOworICAgICAgICBkaWdlc3Rlci5hZGRTZXROZXh0KCJTZXJ2ZXIvU2VydmljZS9MaXN0ZW5lciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkZExpZmVjeWNsZUxpc3RlbmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVMaXN0ZW5lciIpOworCisgICAgICAgIGRpZ2VzdGVyLmFkZFJ1bGUoIlNlcnZlci9TZXJ2aWNlL0Nvbm5lY3RvciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENvbm5lY3RvckNyZWF0ZVJ1bGUoKSk7CisgICAgICAgIGRpZ2VzdGVyLmFkZFJ1bGUoIlNlcnZlci9TZXJ2aWNlL0Nvbm5lY3RvciIsIAorICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTZXRBbGxQcm9wZXJ0aWVzUnVsZSgpKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkU2V0TmV4dCgiU2VydmVyL1NlcnZpY2UvQ29ubmVjdG9yIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWRkQ29ubmVjdG9yIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuQ29ubmVjdG9yIik7CisKKyAgICAgICAgZGlnZXN0ZXIuYWRkT2JqZWN0Q3JlYXRlKCJTZXJ2ZXIvU2VydmljZS9Db25uZWN0b3IvTGlzdGVuZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgLy8gTVVTVCBiZSBzcGVjaWZpZWQgaW4gdGhlIGVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjbGFzc05hbWUiKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkU2V0UHJvcGVydGllcygiU2VydmVyL1NlcnZpY2UvQ29ubmVjdG9yL0xpc3RlbmVyIik7CisgICAgICAgIGRpZ2VzdGVyLmFkZFNldE5leHQoIlNlcnZlci9TZXJ2aWNlL0Nvbm5lY3Rvci9MaXN0ZW5lciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkZExpZmVjeWNsZUxpc3RlbmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVMaXN0ZW5lciIpOworCisgICAgICAgIC8vIEFkZCBSdWxlU2V0cyBmb3IgbmVzdGVkIGVsZW1lbnRzCisgICAgICAgIGRpZ2VzdGVyLmFkZFJ1bGVTZXQobmV3IE5hbWluZ1J1bGVTZXQoIlNlcnZlci9HbG9iYWxOYW1pbmdSZXNvdXJjZXMvIikpOworICAgICAgICBkaWdlc3Rlci5hZGRSdWxlU2V0KG5ldyBFbmdpbmVSdWxlU2V0KCJTZXJ2ZXIvU2VydmljZS8iKSk7CisgICAgICAgIGRpZ2VzdGVyLmFkZFJ1bGVTZXQobmV3IEhvc3RSdWxlU2V0KCJTZXJ2ZXIvU2VydmljZS9FbmdpbmUvIikpOworICAgICAgICBkaWdlc3Rlci5hZGRSdWxlU2V0KG5ldyBDb250ZXh0UnVsZVNldCgiU2VydmVyL1NlcnZpY2UvRW5naW5lL0hvc3QvIikpOworICAgICAgICBkaWdlc3Rlci5hZGRSdWxlU2V0KG5ldyBDbHVzdGVyUnVsZVNldCgiU2VydmVyL1NlcnZpY2UvRW5naW5lL0hvc3QvQ2x1c3Rlci8iKSk7CisgICAgICAgIGRpZ2VzdGVyLmFkZFJ1bGVTZXQobmV3IE5hbWluZ1J1bGVTZXQoIlNlcnZlci9TZXJ2aWNlL0VuZ2luZS9Ib3N0L0NvbnRleHQvIikpOworCisgICAgICAgIC8vIFdoZW4gdGhlICdlbmdpbmUnIGlzIGZvdW5kLCBzZXQgdGhlIHBhcmVudENsYXNzTG9hZGVyLgorICAgICAgICBkaWdlc3Rlci5hZGRSdWxlKCJTZXJ2ZXIvU2VydmljZS9FbmdpbmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTZXRQYXJlbnRDbGFzc0xvYWRlclJ1bGUocGFyZW50Q2xhc3NMb2FkZXIpKTsKKworICAgICAgICBsb25nIHQyPVN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoIkRpZ2VzdGVyIGZvciBzZXJ2ZXIueG1sIGNyZWF0ZWQgIiArICggdDItdDEgKSk7CisgICAgICAgIHJldHVybiAoZGlnZXN0ZXIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW5kIGNvbmZpZ3VyZSB0aGUgRGlnZXN0ZXIgd2Ugd2lsbCBiZSB1c2luZyBmb3Igc2h1dGRvd24uCisgICAgICovCisgICAgcHJvdGVjdGVkIERpZ2VzdGVyIGNyZWF0ZVN0b3BEaWdlc3RlcigpIHsKKworICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBkaWdlc3RlcgorICAgICAgICBEaWdlc3RlciBkaWdlc3RlciA9IG5ldyBEaWdlc3RlcigpOworCisgICAgICAgIC8vIENvbmZpZ3VyZSB0aGUgcnVsZXMgd2UgbmVlZCBmb3Igc2h1dHRpbmcgZG93bgorICAgICAgICBkaWdlc3Rlci5hZGRPYmplY3RDcmVhdGUoIlNlcnZlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkU2VydmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjbGFzc05hbWUiKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkU2V0UHJvcGVydGllcygiU2VydmVyIik7CisgICAgICAgIGRpZ2VzdGVyLmFkZFNldE5leHQoIlNlcnZlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldFNlcnZlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuU2VydmVyIik7CisKKyAgICAgICAgcmV0dXJuIChkaWdlc3Rlcik7CisKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHN0b3BTZXJ2ZXIoKSB7CisgICAgICAgIHN0b3BTZXJ2ZXIobnVsbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RvcFNlcnZlcihTdHJpbmdbXSBhcmd1bWVudHMpIHsKKworICAgICAgICBpZiAoYXJndW1lbnRzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFyZ3VtZW50cyhhcmd1bWVudHMpOworICAgICAgICB9CisKKyAgICAgICAgaWYoIHNlcnZlciA9PSBudWxsICkgeworICAgICAgICAgICAgLy8gQ3JlYXRlIGFuZCBleGVjdXRlIG91ciBEaWdlc3RlcgorICAgICAgICAgICAgRGlnZXN0ZXIgZGlnZXN0ZXIgPSBjcmVhdGVTdG9wRGlnZXN0ZXIoKTsKKyAgICAgICAgICAgIGRpZ2VzdGVyLnNldENsYXNzTG9hZGVyKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkpOworICAgICAgICAgICAgRmlsZSBmaWxlID0gY29uZmlnRmlsZSgpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBJbnB1dFNvdXJjZSBpcyA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBJbnB1dFNvdXJjZSgiZmlsZTovLyIgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgICAgICAgICBGaWxlSW5wdXRTdHJlYW0gZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKKyAgICAgICAgICAgICAgICBpcy5zZXRCeXRlU3RyZWFtKGZpcyk7CisgICAgICAgICAgICAgICAgZGlnZXN0ZXIucHVzaCh0aGlzKTsKKyAgICAgICAgICAgICAgICBkaWdlc3Rlci5wYXJzZShpcyk7CisgICAgICAgICAgICAgICAgZmlzLmNsb3NlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiQ2F0YWxpbmEuc3RvcDogIiwgZSk7CisgICAgICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBTdG9wIHRoZSBleGlzdGluZyBzZXJ2ZXIKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFNvY2tldCBzb2NrZXQgPSBuZXcgU29ja2V0KCIxMjcuMC4wLjEiLCBzZXJ2ZXIuZ2V0UG9ydCgpKTsKKyAgICAgICAgICAgIE91dHB1dFN0cmVhbSBzdHJlYW0gPSBzb2NrZXQuZ2V0T3V0cHV0U3RyZWFtKCk7CisgICAgICAgICAgICBTdHJpbmcgc2h1dGRvd24gPSBzZXJ2ZXIuZ2V0U2h1dGRvd24oKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2h1dGRvd24ubGVuZ3RoKCk7IGkrKykKKyAgICAgICAgICAgICAgICBzdHJlYW0ud3JpdGUoc2h1dGRvd24uY2hhckF0KGkpKTsKKyAgICAgICAgICAgIHN0cmVhbS5mbHVzaCgpOworICAgICAgICAgICAgc3RyZWFtLmNsb3NlKCk7CisgICAgICAgICAgICBzb2NrZXQuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9nLmVycm9yKCJDYXRhbGluYS5zdG9wOiAiLCBlKTsKKyAgICAgICAgICAgIFN5c3RlbS5leGl0KDEpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgPGNvZGU+Y2F0YWxpbmEuYmFzZTwvY29kZT4gU3lzdGVtIHByb3BlcnR5IHRvIHRoZSBjdXJyZW50CisgICAgICogd29ya2luZyBkaXJlY3RvcnkgaWYgaXQgaGFzIG5vdCBiZWVuIHNldC4KKyAgICAgKiBAZGVwcmVjYXRlZCBVc2UgaW5pdERpcnMoKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENhdGFsaW5hQmFzZSgpIHsKKyAgICAgICAgaW5pdERpcnMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIDxjb2RlPmNhdGFsaW5hLmhvbWU8L2NvZGU+IFN5c3RlbSBwcm9wZXJ0eSB0byB0aGUgY3VycmVudAorICAgICAqIHdvcmtpbmcgZGlyZWN0b3J5IGlmIGl0IGhhcyBub3QgYmVlbiBzZXQuCisgICAgICogQGRlcHJlY2F0ZWQgVXNlIGluaXREaXJzKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDYXRhbGluYUhvbWUoKSB7CisgICAgICAgIGluaXREaXJzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnQgYSBuZXcgc2VydmVyIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGxvYWQoKSB7CisgICAgICAgIGluaXREaXJzKCk7CisKKyAgICAgICAgLy8gQmVmb3JlIGRpZ2VzdGVyIC0gaXQgbWF5IGJlIG5lZWRlZAorCisgICAgICAgIGluaXROYW1pbmcoKTsKKworICAgICAgICAvLyBDcmVhdGUgYW5kIGV4ZWN1dGUgb3VyIERpZ2VzdGVyCisgICAgICAgIERpZ2VzdGVyIGRpZ2VzdGVyID0gY3JlYXRlU3RhcnREaWdlc3RlcigpOworICAgICAgICBsb25nIHQxID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisKKyAgICAgICAgRXhjZXB0aW9uIGV4ID0gbnVsbDsKKyAgICAgICAgSW5wdXRTb3VyY2UgaW5wdXRTb3VyY2UgPSBudWxsOworICAgICAgICBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBGaWxlIGZpbGUgPSBjb25maWdGaWxlKCk7CisgICAgICAgICAgICBpbnB1dFN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7CisgICAgICAgICAgICBpbnB1dFNvdXJjZSA9IG5ldyBJbnB1dFNvdXJjZSgiZmlsZTovLyIgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXRTdHJlYW0gPT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbSA9IGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKQorICAgICAgICAgICAgICAgICAgICAuZ2V0UmVzb3VyY2VBc1N0cmVhbShnZXRDb25maWdGaWxlKCkpOworICAgICAgICAgICAgICAgIGlucHV0U291cmNlID0gbmV3IElucHV0U291cmNlCisgICAgICAgICAgICAgICAgICAgIChnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgIC5nZXRSZXNvdXJjZShnZXRDb25maWdGaWxlKCkpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoaW5wdXRTdHJlYW0gPT0gbnVsbCkgeworICAgICAgICAgICAgbG9nLndhcm4oIkNhbid0IGxvYWQgc2VydmVyLnhtbCIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlucHV0U291cmNlLnNldEJ5dGVTdHJlYW0oaW5wdXRTdHJlYW0pOworICAgICAgICAgICAgZGlnZXN0ZXIucHVzaCh0aGlzKTsKKyAgICAgICAgICAgIGRpZ2VzdGVyLnBhcnNlKGlucHV0U291cmNlKTsKKyAgICAgICAgICAgIGlucHV0U3RyZWFtLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2cud2FybigiQ2F0YWxpbmEuc3RhcnQgdXNpbmcgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZ2V0Q29uZmlnRmlsZSgpICsgIjogIiAsIGUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmVwbGFjZSBTeXN0ZW0ub3V0IGFuZCBTeXN0ZW0uZXJyIHdpdGggYSBjdXN0b20gUHJpbnRTdHJlYW0KKyAgICAgICAgLy8gVE9ETzogbW92ZSB0byBFbWJlZGRlZCwgbWFrZSBpdCBjb25maWd1cmFibGUKKyAgICAgICAgU3lzdGVtTG9nSGFuZGxlciBzeXN0ZW1sb2cgPSBuZXcgU3lzdGVtTG9nSGFuZGxlcihTeXN0ZW0ub3V0KTsKKyAgICAgICAgU3lzdGVtLnNldE91dChzeXN0ZW1sb2cpOworICAgICAgICBTeXN0ZW0uc2V0RXJyKHN5c3RlbWxvZyk7CisKKyAgICAgICAgLy8gU3RhcnQgdGhlIG5ldyBzZXJ2ZXIKKyAgICAgICAgaWYgKHNlcnZlciBpbnN0YW5jZW9mIExpZmVjeWNsZSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBzZXJ2ZXIuaW5pdGlhbGl6ZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoTGlmZWN5Y2xlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkNhdGFsaW5hLnN0YXJ0IiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBsb25nIHQyID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIGxvZy5pbmZvKCJJbml0aWFsaXphdGlvbiBwcm9jZXNzZWQgaW4gIiArICh0MiAtIHQxKSArICIgbXMiKTsKKworICAgIH0KKworCisgICAgLyogCisgICAgICogTG9hZCB1c2luZyBhcmd1bWVudHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBsb2FkKFN0cmluZyBhcmdzW10pIHsKKworICAgICAgICBzZXRDYXRhbGluYUhvbWUoKTsKKyAgICAgICAgc2V0Q2F0YWxpbmFCYXNlKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoYXJndW1lbnRzKGFyZ3MpKQorICAgICAgICAgICAgICAgIGxvYWQoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5vdXQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY3JlYXRlKCkgeworCisgICAgfQorCisgICAgcHVibGljIHZvaWQgZGVzdHJveSgpIHsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0IGEgbmV3IHNlcnZlciBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHsKKworICAgICAgICBpZiAoc2VydmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIGxvYWQoKTsKKyAgICAgICAgfQorCisgICAgICAgIGxvbmcgdDEgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKworICAgICAgICAvLyBTdGFydCB0aGUgbmV3IHNlcnZlcgorICAgICAgICBpZiAoc2VydmVyIGluc3RhbmNlb2YgTGlmZWN5Y2xlKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICgoTGlmZWN5Y2xlKSBzZXJ2ZXIpLnN0YXJ0KCk7CisgICAgICAgICAgICB9IGNhdGNoIChMaWZlY3ljbGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiQ2F0YWxpbmEuc3RhcnQ6ICIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbG9uZyB0MiA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICBsb2cuaW5mbygiU2VydmVyIHN0YXJ0dXAgaW4gIiArICh0MiAtIHQxKSArICIgbXMiKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gUmVnaXN0ZXIgc2h1dGRvd24gaG9vaworICAgICAgICAgICAgaWYgKHVzZVNodXRkb3duSG9vaykgeworICAgICAgICAgICAgICAgIGlmIChzaHV0ZG93bkhvb2sgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBzaHV0ZG93bkhvb2sgPSBuZXcgQ2F0YWxpbmFTaHV0ZG93bkhvb2soKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgUnVudGltZS5nZXRSdW50aW1lKCkuYWRkU2h1dGRvd25Ib29rKHNodXRkb3duSG9vayk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAvLyBUaGlzIHdpbGwgZmFpbCBvbiBKREsgMS4yLiBJZ25vcmluZywgYXMgVG9tY2F0IGNhbiBydW4KKyAgICAgICAgICAgIC8vIGZpbmUgd2l0aG91dCB0aGUgc2h1dGRvd24gaG9vay4KKyAgICAgICAgfQorCisgICAgICAgIGlmIChhd2FpdCkgeworICAgICAgICAgICAgYXdhaXQoKTsKKyAgICAgICAgICAgIHN0b3AoKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTdG9wIGFuIGV4aXN0aW5nIHNlcnZlciBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdG9wKCkgeworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIFNodXRkb3duSG9vayBmaXJzdCBzbyB0aGF0IHNlcnZlci5zdG9wKCkgCisgICAgICAgICAgICAvLyBkb2Vzbid0IGdldCBpbnZva2VkIHR3aWNlCisgICAgICAgICAgICBpZiAodXNlU2h1dGRvd25Ib29rKSB7CisgICAgICAgICAgICAgICAgUnVudGltZS5nZXRSdW50aW1lKCkucmVtb3ZlU2h1dGRvd25Ib29rKHNodXRkb3duSG9vayk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAvLyBUaGlzIHdpbGwgZmFpbCBvbiBKREsgMS4yLiBJZ25vcmluZywgYXMgVG9tY2F0IGNhbiBydW4KKyAgICAgICAgICAgIC8vIGZpbmUgd2l0aG91dCB0aGUgc2h1dGRvd24gaG9vay4KKyAgICAgICAgfQorCisgICAgICAgIC8vIFNodXQgZG93biB0aGUgc2VydmVyCisgICAgICAgIGlmIChzZXJ2ZXIgaW5zdGFuY2VvZiBMaWZlY3ljbGUpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgKChMaWZlY3ljbGUpIHNlcnZlcikuc3RvcCgpOworICAgICAgICAgICAgfSBjYXRjaCAoTGlmZWN5Y2xlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkNhdGFsaW5hLnN0b3AiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBd2FpdCBhbmQgc2h1dGRvd24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgYXdhaXQoKSB7CisKKyAgICAgICAgc2VydmVyLmF3YWl0KCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFByaW50IHVzYWdlIGluZm9ybWF0aW9uIGZvciB0aGlzIGFwcGxpY2F0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHVzYWdlKCkgeworCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbgorICAgICAgICAgICAgKCJ1c2FnZTogamF2YSBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0YXJ0dXAuQ2F0YWxpbmEiCisgICAgICAgICAgICAgKyAiIFsgLWNvbmZpZyB7cGF0aG5hbWV9IF0iCisgICAgICAgICAgICAgKyAiIFsgLW5vbmFtaW5nIF0geyBzdGFydCB8IHN0b3AgfSIpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ2F0YWxpbmFTaHV0ZG93bkhvb2sgSW5uZXIgQ2xhc3MKKworICAgIC8vIFhYWCBTaG91bGQgYmUgbW92ZWQgdG8gZW1iZWRkZWQgIQorICAgIC8qKgorICAgICAqIFNodXRkb3duIGhvb2sgd2hpY2ggd2lsbCBwZXJmb3JtIGEgY2xlYW4gc2h1dGRvd24gb2YgQ2F0YWxpbmEgaWYgbmVlZGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCBjbGFzcyBDYXRhbGluYVNodXRkb3duSG9vayBleHRlbmRzIFRocmVhZCB7CisKKyAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworCisgICAgICAgICAgICBpZiAoc2VydmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBDYXRhbGluYS50aGlzLnN0b3AoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICB9CisKKyAgICB9CisgICAgCisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGxvZz0KKyAgICAgICAgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeS5nZXRMb2coIENhdGFsaW5hLmNsYXNzICk7CisKK30KKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJpdmF0ZSBDbGFzc2VzCisKKworLyoqCisgKiBSdWxlIHRoYXQgc2V0cyB0aGUgcGFyZW50IGNsYXNzIGxvYWRlciBmb3IgdGhlIHRvcCBvYmplY3Qgb24gdGhlIHN0YWNrLAorICogd2hpY2ggbXVzdCBiZSBhIDxjb2RlPkNvbnRhaW5lcjwvY29kZT4uCisgKi8KKworZmluYWwgY2xhc3MgU2V0UGFyZW50Q2xhc3NMb2FkZXJSdWxlIGV4dGVuZHMgUnVsZSB7CisKKyAgICBwdWJsaWMgU2V0UGFyZW50Q2xhc3NMb2FkZXJSdWxlKENsYXNzTG9hZGVyIHBhcmVudENsYXNzTG9hZGVyKSB7CisKKyAgICAgICAgdGhpcy5wYXJlbnRDbGFzc0xvYWRlciA9IHBhcmVudENsYXNzTG9hZGVyOworCisgICAgfQorCisgICAgQ2xhc3NMb2FkZXIgcGFyZW50Q2xhc3NMb2FkZXIgPSBudWxsOworCisgICAgcHVibGljIHZvaWQgYmVnaW4oU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKGRpZ2VzdGVyLmdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBkaWdlc3Rlci5nZXRMb2dnZXIoKS5kZWJ1ZygiU2V0dGluZyBwYXJlbnQgY2xhc3MgbG9hZGVyIik7CisKKyAgICAgICAgQ29udGFpbmVyIHRvcCA9IChDb250YWluZXIpIGRpZ2VzdGVyLnBlZWsoKTsKKyAgICAgICAgdG9wLnNldFBhcmVudENsYXNzTG9hZGVyKHBhcmVudENsYXNzTG9hZGVyKTsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9DYXRhbGluYVByb3BlcnRpZXMuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdGFydHVwL0NhdGFsaW5hUHJvcGVydGllcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmMGFlYTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9DYXRhbGluYVByb3BlcnRpZXMuamF2YQpAQCAtMCwwICsxLDE2OSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5zdGFydHVwOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworCisvKioKKyAqIFV0aWxpdHkgY2xhc3MgdG8gcmVhZCB0aGUgYm9vdHN0cmFwIENhdGFsaW5hIGNvbmZpZ3VyYXRpb24uCisgKgorICogQGF1dGhvciBSZW15IE1hdWNoZXJhdAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgQ2F0YWxpbmFQcm9wZXJ0aWVzIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTdGF0aWMgVmFyaWFibGVzCisKKyAgICBwcml2YXRlIHN0YXRpYyBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2cgbG9nPQorICAgICAgICBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5LmdldExvZyggQ2F0YWxpbmFQcm9wZXJ0aWVzLmNsYXNzICk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBudWxsOworCisKKyAgICBzdGF0aWMgeworCisgICAgICAgIGxvYWRQcm9wZXJ0aWVzKCk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gc3BlY2lmaWVkIHByb3BlcnR5IHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFByb3BlcnR5KFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgcmV0dXJuIHByb3BlcnRpZXMuZ2V0UHJvcGVydHkobmFtZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBzcGVjaWZpZWQgcHJvcGVydHkgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UHJvcGVydHkoU3RyaW5nIG5hbWUsIFN0cmluZyBkZWZhdWx0VmFsdWUpIHsKKworICAgICAgICByZXR1cm4gcHJvcGVydGllcy5nZXRQcm9wZXJ0eShuYW1lLCBkZWZhdWx0VmFsdWUpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogTG9hZCBwcm9wZXJ0aWVzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgbG9hZFByb3BlcnRpZXMoKSB7CisKKyAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBudWxsOworICAgICAgICBUaHJvd2FibGUgZXJyb3IgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTdHJpbmcgY29uZmlnVXJsID0gZ2V0Q29uZmlnVXJsKCk7CisgICAgICAgICAgICBpZiAoY29uZmlnVXJsICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpcyA9IChuZXcgVVJMKGNvbmZpZ1VybCkpLm9wZW5TdHJlYW0oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIC8vIElnbm9yZQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGlzID09IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgRmlsZSBob21lID0gbmV3IEZpbGUoZ2V0Q2F0YWxpbmFCYXNlKCkpOworICAgICAgICAgICAgICAgIEZpbGUgY29uZiA9IG5ldyBGaWxlKGhvbWUsICJjb25mIik7CisgICAgICAgICAgICAgICAgRmlsZSBwcm9wZXJ0aWVzID0gbmV3IEZpbGUoY29uZiwgImNhdGFsaW5hLnByb3BlcnRpZXMiKTsKKyAgICAgICAgICAgICAgICBpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0ocHJvcGVydGllcyk7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgIC8vIElnbm9yZQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGlzID09IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaXMgPSBDYXRhbGluYVByb3BlcnRpZXMuY2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbQorICAgICAgICAgICAgICAgICAgICAoIi9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvY2F0YWxpbmEucHJvcGVydGllcyIpOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICAvLyBJZ25vcmUKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChpcyAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICAgICAgICAgIHByb3BlcnRpZXMubG9hZChpcyk7CisgICAgICAgICAgICAgICAgaXMuY2xvc2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgZXJyb3IgPSB0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKChpcyA9PSBudWxsKSB8fCAoZXJyb3IgIT0gbnVsbCkpIHsKKyAgICAgICAgICAgIC8vIERvIHNvbWV0aGluZworICAgICAgICAgICAgbG9nLndhcm4oIkZhaWxlZCB0byBsb2FkIGNhdGFsaW5hLnByb3BlcnRpZXMiLCBlcnJvcik7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZWdpc3RlciB0aGUgcHJvcGVydGllcyBhcyBzeXN0ZW0gcHJvcGVydGllcworICAgICAgICBFbnVtZXJhdGlvbiBlbnVtZXJhdGlvbiA9IHByb3BlcnRpZXMucHJvcGVydHlOYW1lcygpOworICAgICAgICB3aGlsZSAoZW51bWVyYXRpb24uaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZykgZW51bWVyYXRpb24ubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IHByb3BlcnRpZXMuZ2V0UHJvcGVydHkobmFtZSk7CisgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eShuYW1lLCB2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0IHRoZSB2YWx1ZSBvZiB0aGUgY2F0YWxpbmEuaG9tZSBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0Q2F0YWxpbmFIb21lKCkgeworICAgICAgICByZXR1cm4gU3lzdGVtLmdldFByb3BlcnR5KCJjYXRhbGluYS5ob21lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIikpOworICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBjYXRhbGluYS5iYXNlIGVudmlyb25tZW50IHZhcmlhYmxlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRDYXRhbGluYUJhc2UoKSB7CisgICAgICAgIHJldHVybiBTeXN0ZW0uZ2V0UHJvcGVydHkoImNhdGFsaW5hLmJhc2UiLCBnZXRDYXRhbGluYUhvbWUoKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBjb25maWd1cmF0aW9uIFVSTC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0Q29uZmlnVXJsKCkgeworICAgICAgICByZXR1cm4gU3lzdGVtLmdldFByb3BlcnR5KCJjYXRhbGluYS5jb25maWciKTsKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvQ2xhc3NMb2FkZXJGYWN0b3J5LmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9DbGFzc0xvYWRlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMThkZDgyCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvQ2xhc3NMb2FkZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwxNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cDsKKworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5sb2FkZXIuU3RhbmRhcmRDbGFzc0xvYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKKworCisvKioKKyAqIDxwPlV0aWxpdHkgY2xhc3MgZm9yIGJ1aWxkaW5nIGNsYXNzIGxvYWRlcnMgZm9yIENhdGFsaW5hLiAgVGhlIGZhY3RvcnkKKyAqIG1ldGhvZCByZXF1aXJlcyB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnMgaW4gb3JkZXIgdG8gYnVpbGQgYSBuZXcgY2xhc3MKKyAqIGxvYWRlciAod2l0aCBzdWl0YWJsZSBkZWZhdWx0cyBpbiBhbGwgY2FzZXMpOjwvcD4KKyAqIDx1bD4KKyAqIDxsaT5BIHNldCBvZiBkaXJlY3RvcmllcyBjb250YWluaW5nIHVucGFja2VkIGNsYXNzZXMgKGFuZCByZXNvdXJjZXMpCisgKiAgICAgdGhhdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIGNsYXNzIGxvYWRlcidzCisgKiAgICAgcmVwb3NpdG9yaWVzLjwvbGk+CisgKiA8bGk+QSBzZXQgb2YgZGlyZWN0b3JpZXMgY29udGFpbmluZyBjbGFzc2VzIGFuZCByZXNvdXJjZXMgaW4gSkFSIGZpbGVzLgorICogICAgIEVhY2ggcmVhZGFibGUgSkFSIGZpbGUgZGlzY292ZXJlZCBpbiB0aGVzZSBkaXJlY3RvcmllcyB3aWxsIGJlCisgKiAgICAgYWRkZWQgdG8gdGhlIGNsYXNzIGxvYWRlcidzIHJlcG9zaXRvcmllcy48L2xpPgorICogPGxpPjxjb2RlPkNsYXNzTG9hZGVyPC9jb2RlPiBpbnN0YW5jZSB0aGF0IHNob3VsZCBiZWNvbWUgdGhlIHBhcmVudCBvZgorICogICAgIHRoZSBuZXcgY2xhc3MgbG9hZGVyLjwvbGk+CisgKiA8L3VsPgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgQ2xhc3NMb2FkZXJGYWN0b3J5IHsKKworCisgICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKENsYXNzTG9hZGVyRmFjdG9yeS5jbGFzcyk7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuZCByZXR1cm4gYSBuZXcgY2xhc3MgbG9hZGVyLCBiYXNlZCBvbiB0aGUgY29uZmlndXJhdGlvbgorICAgICAqIGRlZmF1bHRzIGFuZCB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSBwYXRoczoKKyAgICAgKgorICAgICAqIEBwYXJhbSB1bnBhY2tlZCBBcnJheSBvZiBwYXRobmFtZXMgdG8gdW5wYWNrZWQgZGlyZWN0b3JpZXMgdGhhdCBzaG91bGQKKyAgICAgKiAgYmUgYWRkZWQgdG8gdGhlIHJlcG9zaXRvcmllcyBvZiB0aGUgY2xhc3MgbG9hZGVyLCBvciA8Y29kZT5udWxsPC9jb2RlPiAKKyAgICAgKiBmb3Igbm8gdW5wYWNrZWQgZGlyZWN0b3JpZXMgdG8gYmUgY29uc2lkZXJlZAorICAgICAqIEBwYXJhbSBwYWNrZWQgQXJyYXkgb2YgcGF0aG5hbWVzIHRvIGRpcmVjdG9yaWVzIGNvbnRhaW5pbmcgSkFSIGZpbGVzCisgICAgICogIHRoYXQgc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSByZXBvc2l0b3JpZXMgb2YgdGhlIGNsYXNzIGxvYWRlciwgCisgICAgICogb3IgPGNvZGU+bnVsbDwvY29kZT4gZm9yIG5vIGRpcmVjdG9yaWVzIG9mIEpBUiBmaWxlcyB0byBiZSBjb25zaWRlcmVkCisgICAgICogQHBhcmFtIHBhcmVudCBQYXJlbnQgY2xhc3MgbG9hZGVyIGZvciB0aGUgbmV3IGNsYXNzIGxvYWRlciwgb3IKKyAgICAgKiAgPGNvZGU+bnVsbDwvY29kZT4gZm9yIHRoZSBzeXN0ZW0gY2xhc3MgbG9hZGVyLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzIGNvbnN0cnVjdGluZyB0aGUgY2xhc3MgbG9hZGVyCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDbGFzc0xvYWRlciBjcmVhdGVDbGFzc0xvYWRlcihGaWxlIHVucGFja2VkW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlIHBhY2tlZFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NMb2FkZXIgcGFyZW50KQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZUNsYXNzTG9hZGVyKHVucGFja2VkLCBwYWNrZWQsIG51bGwsIHBhcmVudCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW5kIHJldHVybiBhIG5ldyBjbGFzcyBsb2FkZXIsIGJhc2VkIG9uIHRoZSBjb25maWd1cmF0aW9uCisgICAgICogZGVmYXVsdHMgYW5kIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5IHBhdGhzOgorICAgICAqCisgICAgICogQHBhcmFtIHVucGFja2VkIEFycmF5IG9mIHBhdGhuYW1lcyB0byB1bnBhY2tlZCBkaXJlY3RvcmllcyB0aGF0IHNob3VsZAorICAgICAqICBiZSBhZGRlZCB0byB0aGUgcmVwb3NpdG9yaWVzIG9mIHRoZSBjbGFzcyBsb2FkZXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+IAorICAgICAqIGZvciBubyB1bnBhY2tlZCBkaXJlY3RvcmllcyB0byBiZSBjb25zaWRlcmVkCisgICAgICogQHBhcmFtIHBhY2tlZCBBcnJheSBvZiBwYXRobmFtZXMgdG8gZGlyZWN0b3JpZXMgY29udGFpbmluZyBKQVIgZmlsZXMKKyAgICAgKiAgdGhhdCBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIHJlcG9zaXRvcmllcyBvZiB0aGUgY2xhc3MgbG9hZGVyLCAKKyAgICAgKiBvciA8Y29kZT5udWxsPC9jb2RlPiBmb3Igbm8gZGlyZWN0b3JpZXMgb2YgSkFSIGZpbGVzIHRvIGJlIGNvbnNpZGVyZWQKKyAgICAgKiBAcGFyYW0gdXJscyBBcnJheSBvZiBVUkxzIHRvIHJlbW90ZSByZXBvc2l0b3JpZXMsIGRlc2lnbmluZyBlaXRoZXIgSkFSIAorICAgICAqICByZXNvdXJjZXMgb3IgdW5jb21wcmVzc2VkIGRpcmVjdG9yaWVzIHRoYXQgc2hvdWxkIGJlIGFkZGVkIHRvIAorICAgICAqICB0aGUgcmVwb3NpdG9yaWVzIG9mIHRoZSBjbGFzcyBsb2FkZXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGZvciBubyAKKyAgICAgKiAgZGlyZWN0b3JpZXMgb2YgSkFSIGZpbGVzIHRvIGJlIGNvbnNpZGVyZWQKKyAgICAgKiBAcGFyYW0gcGFyZW50IFBhcmVudCBjbGFzcyBsb2FkZXIgZm9yIHRoZSBuZXcgY2xhc3MgbG9hZGVyLCBvcgorICAgICAqICA8Y29kZT5udWxsPC9jb2RlPiBmb3IgdGhlIHN5c3RlbSBjbGFzcyBsb2FkZXIuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMgY29uc3RydWN0aW5nIHRoZSBjbGFzcyBsb2FkZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENsYXNzTG9hZGVyIGNyZWF0ZUNsYXNzTG9hZGVyKEZpbGUgdW5wYWNrZWRbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUgcGFja2VkW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkwgdXJsc1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NMb2FkZXIgcGFyZW50KQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoIkNyZWF0aW5nIG5ldyBjbGFzcyBsb2FkZXIiKTsKKworICAgICAgICAvLyBDb25zdHJ1Y3QgdGhlICJjbGFzcyBwYXRoIiBmb3IgdGhpcyBjbGFzcyBsb2FkZXIKKyAgICAgICAgQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisKKyAgICAgICAgLy8gQWRkIHVucGFja2VkIGRpcmVjdG9yaWVzCisgICAgICAgIGlmICh1bnBhY2tlZCAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHVucGFja2VkLmxlbmd0aDsgaSsrKSAgeworICAgICAgICAgICAgICAgIEZpbGUgZmlsZSA9IHVucGFja2VkW2ldOworICAgICAgICAgICAgICAgIGlmICghZmlsZS5leGlzdHMoKSB8fCAhZmlsZS5jYW5SZWFkKCkpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGZpbGUgPSBuZXcgRmlsZShmaWxlLmdldENhbm9uaWNhbFBhdGgoKSArIEZpbGUuc2VwYXJhdG9yKTsKKyAgICAgICAgICAgICAgICBVUkwgdXJsID0gZmlsZS50b1VSTCgpOworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgIEluY2x1ZGluZyBkaXJlY3RvcnkgIiArIHVybCk7CisgICAgICAgICAgICAgICAgbGlzdC5hZGQodXJsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEFkZCBwYWNrZWQgZGlyZWN0b3J5IEpBUiBmaWxlcworICAgICAgICBpZiAocGFja2VkICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFja2VkLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgRmlsZSBkaXJlY3RvcnkgPSBwYWNrZWRbaV07CisgICAgICAgICAgICAgICAgaWYgKCFkaXJlY3RvcnkuaXNEaXJlY3RvcnkoKSB8fCAhZGlyZWN0b3J5LmV4aXN0cygpIHx8CisgICAgICAgICAgICAgICAgICAgICFkaXJlY3RvcnkuY2FuUmVhZCgpKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZW5hbWVzW10gPSBkaXJlY3RvcnkubGlzdCgpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZmlsZW5hbWVzLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlbmFtZSA9IGZpbGVuYW1lc1tqXS50b0xvd2VyQ2FzZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWZpbGVuYW1lLmVuZHNXaXRoKCIuamFyIikpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoZGlyZWN0b3J5LCBmaWxlbmFtZXNbal0pOworICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiAgSW5jbHVkaW5nIGphciBmaWxlICIgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgVVJMIHVybCA9IGZpbGUudG9VUkwoKTsKKyAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGQodXJsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBBZGQgVVJMcworICAgICAgICBpZiAodXJscyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHVybHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiICBJbmNsdWRpbmcgVVJMICIgKyB1cmxzW2ldKTsKKyAgICAgICAgICAgICAgICBsaXN0LmFkZCh1cmxzW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIENvbnN0cnVjdCB0aGUgY2xhc3MgbG9hZGVyIGl0c2VsZgorICAgICAgICBVUkxbXSBhcnJheSA9IChVUkxbXSkgbGlzdC50b0FycmF5KG5ldyBVUkxbbGlzdC5zaXplKCldKTsKKyAgICAgICAgU3RhbmRhcmRDbGFzc0xvYWRlciBjbGFzc0xvYWRlciA9IG51bGw7CisgICAgICAgIGlmIChwYXJlbnQgPT0gbnVsbCkKKyAgICAgICAgICAgIGNsYXNzTG9hZGVyID0gbmV3IFN0YW5kYXJkQ2xhc3NMb2FkZXIoYXJyYXkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBjbGFzc0xvYWRlciA9IG5ldyBTdGFuZGFyZENsYXNzTG9hZGVyKGFycmF5LCBwYXJlbnQpOworICAgICAgICByZXR1cm4gKGNsYXNzTG9hZGVyKTsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9DbHVzdGVyUnVsZVNldC5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvQ2x1c3RlclJ1bGVTZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTY4YzVjCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvQ2x1c3RlclJ1bGVTZXQuamF2YQpAQCAtMCwwICsxLDEzMyBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LTIwMDEsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0YXJ0dXA7CisKKworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuZGlnZXN0ZXIuRGlnZXN0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5kaWdlc3Rlci5SdWxlU2V0QmFzZTsKKworCisvKioKKyAqIDxwPjxzdHJvbmc+UnVsZVNldDwvc3Ryb25nPiBmb3IgcHJvY2Vzc2luZyB0aGUgY29udGVudHMgb2YgYQorICogQ2x1c3RlciBkZWZpbml0aW9uIGVsZW1lbnQuICA8L3A+CisgKgorICogQGF1dGhvciBGaWxpcCBIYW5paworICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgQ2x1c3RlclJ1bGVTZXQgZXh0ZW5kcyBSdWxlU2V0QmFzZSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgbWF0Y2hpbmcgcGF0dGVybiBwcmVmaXggdG8gdXNlIGZvciByZWNvZ25pemluZyBvdXIgZWxlbWVudHMuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBwcmVmaXggPSBudWxsOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3IKKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGFuIGluc3RhbmNlIG9mIHRoaXMgPGNvZGU+UnVsZVNldDwvY29kZT4gd2l0aCB0aGUgZGVmYXVsdAorICAgICAqIG1hdGNoaW5nIHBhdHRlcm4gcHJlZml4LgorICAgICAqLworICAgIHB1YmxpYyBDbHVzdGVyUnVsZVNldCgpIHsKKworICAgICAgICB0aGlzKCIiKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGFuIGluc3RhbmNlIG9mIHRoaXMgPGNvZGU+UnVsZVNldDwvY29kZT4gd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgICogbWF0Y2hpbmcgcGF0dGVybiBwcmVmaXguCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJlZml4IFByZWZpeCBmb3IgbWF0Y2hpbmcgcGF0dGVybiBydWxlcyAoaW5jbHVkaW5nIHRoZQorICAgICAqICB0cmFpbGluZyBzbGFzaCBjaGFyYWN0ZXIpCisgICAgICovCisgICAgcHVibGljIENsdXN0ZXJSdWxlU2V0KFN0cmluZyBwcmVmaXgpIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgdGhpcy5uYW1lc3BhY2VVUkkgPSBudWxsOworICAgICAgICB0aGlzLnByZWZpeCA9IHByZWZpeDsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiA8cD5BZGQgdGhlIHNldCBvZiBSdWxlIGluc3RhbmNlcyBkZWZpbmVkIGluIHRoaXMgUnVsZVNldCB0byB0aGUKKyAgICAgKiBzcGVjaWZpZWQgPGNvZGU+RGlnZXN0ZXI8L2NvZGU+IGluc3RhbmNlLCBhc3NvY2lhdGluZyB0aGVtIHdpdGgKKyAgICAgKiBvdXIgbmFtZXNwYWNlIFVSSSAoaWYgYW55KS4gIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGNhbGxlZAorICAgICAqIGJ5IGEgRGlnZXN0ZXIgaW5zdGFuY2UuPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIGRpZ2VzdGVyIERpZ2VzdGVyIGluc3RhbmNlIHRvIHdoaWNoIHRoZSBuZXcgUnVsZSBpbnN0YW5jZXMKKyAgICAgKiAgc2hvdWxkIGJlIGFkZGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFJ1bGVJbnN0YW5jZXMoRGlnZXN0ZXIgZGlnZXN0ZXIpIHsKKyAgICAgICAgLy9DbHVzdGVyIGNvbmZpZ3VyYXRpb24gc3RhcnQKKyAgICAgICAgZGlnZXN0ZXIuYWRkT2JqZWN0Q3JlYXRlKHByZWZpeCArICJNZW1iZXJzaGlwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIC8vIE1VU1QgYmUgc3BlY2lmaWVkIGluIHRoZSBlbGVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2xhc3NOYW1lIik7CisgICAgICAgIGRpZ2VzdGVyLmFkZFNldFByb3BlcnRpZXMocHJlZml4ICsgIk1lbWJlcnNoaXAiKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkU2V0TmV4dChwcmVmaXggKyAiTWVtYmVyc2hpcCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldE1lbWJlcnNoaXBTZXJ2aWNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLk1lbWJlcnNoaXBTZXJ2aWNlIik7CisgICAgICAgIAorICAgICAgICBkaWdlc3Rlci5hZGRPYmplY3RDcmVhdGUocHJlZml4ICsgIlNlbmRlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCAvLyBNVVNUIGJlIHNwZWNpZmllZCBpbiB0aGUgZWxlbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNsYXNzTmFtZSIpOworICAgICAgICBkaWdlc3Rlci5hZGRTZXRQcm9wZXJ0aWVzKHByZWZpeCArICJTZW5kZXIiKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkU2V0TmV4dChwcmVmaXggKyAiU2VuZGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0Q2x1c3RlclNlbmRlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5DbHVzdGVyU2VuZGVyIik7CisKKyAgICAgICAgZGlnZXN0ZXIuYWRkT2JqZWN0Q3JlYXRlKHByZWZpeCArICJSZWNlaXZlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCAvLyBNVVNUIGJlIHNwZWNpZmllZCBpbiB0aGUgZWxlbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNsYXNzTmFtZSIpOworICAgICAgICBkaWdlc3Rlci5hZGRTZXRQcm9wZXJ0aWVzKHByZWZpeCArICJSZWNlaXZlciIpOworICAgICAgICBkaWdlc3Rlci5hZGRTZXROZXh0KHByZWZpeCArICJSZWNlaXZlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldENsdXN0ZXJSZWNlaXZlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5DbHVzdGVyUmVjZWl2ZXIiKTsKKworICAgICAgICBkaWdlc3Rlci5hZGRPYmplY3RDcmVhdGUocHJlZml4ICsgIlZhbHZlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIC8vIE1VU1QgYmUgc3BlY2lmaWVkIGluIHRoZSBlbGVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2xhc3NOYW1lIik7CisgICAgICAgIGRpZ2VzdGVyLmFkZFNldFByb3BlcnRpZXMocHJlZml4ICsgIlZhbHZlIik7CisgICAgICAgIGRpZ2VzdGVyLmFkZFNldE5leHQocHJlZml4ICsgIlZhbHZlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWRkVmFsdmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLlZhbHZlIik7CisgICAgICAgIAorICAgICAgICBkaWdlc3Rlci5hZGRPYmplY3RDcmVhdGUocHJlZml4ICsgIkRlcGxveWVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIC8vIE1VU1QgYmUgc3BlY2lmaWVkIGluIHRoZSBlbGVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2xhc3NOYW1lIik7CisgICAgICAgIGRpZ2VzdGVyLmFkZFNldFByb3BlcnRpZXMocHJlZml4ICsgIkRlcGxveWVyIik7CisgICAgICAgIGRpZ2VzdGVyLmFkZFNldE5leHQocHJlZml4ICsgIkRlcGxveWVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0Q2x1c3RlckRlcGxveWVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLkNsdXN0ZXJEZXBsb3llciIpOworCisKKworICAgICAgICAvL0NsdXN0ZXIgY29uZmlndXJhdGlvbiBlbmQKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvQ29ubmVjdG9yQ3JlYXRlUnVsZS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvQ29ubmVjdG9yQ3JlYXRlUnVsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwM2IxMzkKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9Db25uZWN0b3JDcmVhdGVSdWxlLmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyogJElkJAorICoKKyAqIENvcHlyaWdodCAyMDAxLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLyAKKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cDsKKworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuQ29ubmVjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuZGlnZXN0ZXIuUnVsZTsKK2ltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOworCisKKy8qKgorICogUnVsZSBpbXBsZW1lbnRhdGlvbiB0aGF0IGNyZWF0ZXMgYSBjb25uZWN0b3IuCisgKi8KKworcHVibGljIGNsYXNzIENvbm5lY3RvckNyZWF0ZVJ1bGUgZXh0ZW5kcyBSdWxlIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIGJlZ2lubmluZyBvZiB0aGlzIGVsZW1lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXR0cmlidXRlcyBUaGUgYXR0cmlidXRlIGxpc3Qgb2YgdGhpcyBlbGVtZW50CisgICAgICovCisgICAgcHVibGljIHZvaWQgYmVnaW4oQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZGlnZXN0ZXIucHVzaChuZXcgQ29ubmVjdG9yKGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInByb3RvY29sIikpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIGVuZCBvZiB0aGlzIGVsZW1lbnQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZW5kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIE9iamVjdCB0b3AgPSBkaWdlc3Rlci5wb3AoKTsKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvQ29uc3RhbnRzLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9Db25zdGFudHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWM3OTY2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvQ29uc3RhbnRzLmphdmEKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5zdGFydHVwOworCisKKy8qKgorICogU3RyaW5nIGNvbnN0YW50cyBmb3IgdGhlIHN0YXJ0dXAgcGFja2FnZS4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEBhdXRob3IgSmVhbi1GcmFuY29pcyBBcmNhbmQKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIENvbnN0YW50cyB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQYWNrYWdlID0gIm9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cCI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBcHBsaWNhdGlvbkNvbnRleHRYbWwgPSAiTUVUQS1JTkYvY29udGV4dC54bWwiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFwcGxpY2F0aW9uV2ViWG1sID0gIi9XRUItSU5GL3dlYi54bWwiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERlZmF1bHRDb250ZXh0WG1sID0gImNvbmYvY29udGV4dC54bWwiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERlZmF1bHRXZWJYbWwgPSAiY29uZi93ZWIueG1sIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIb3N0Q29udGV4dFhtbCA9ICJjb250ZXh0LnhtbC5kZWZhdWx0IjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIb3N0V2ViWG1sID0gIndlYi54bWwuZGVmYXVsdCI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUbGREdGRQdWJsaWNJZF8xMSA9CisgICAgICAgICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgSlNQIFRhZyBMaWJyYXJ5IDEuMS8vRU4iOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRsZER0ZFJlc291cmNlUGF0aF8xMSA9CisgICAgICAgICIvamF2YXgvc2VydmxldC9qc3AvcmVzb3VyY2VzL3dlYi1qc3B0YWdsaWJyYXJ5XzFfMS5kdGQiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVGxkRHRkUHVibGljSWRfMTIgPQorICAgICAgICAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEpTUCBUYWcgTGlicmFyeSAxLjIvL0VOIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUbGREdGRSZXNvdXJjZVBhdGhfMTIgPQorICAgICAgICAiL2phdmF4L3NlcnZsZXQvanNwL3Jlc291cmNlcy93ZWItanNwdGFnbGlicmFyeV8xXzIuZHRkIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRsZFNjaGVtYVB1YmxpY0lkXzIwID0KKyAgICAgICAgIndlYi1qc3B0YWdsaWJyYXJ5XzJfMC54c2QiOzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUbGRTY2hlbWFSZXNvdXJjZVBhdGhfMjAgPQorICAgICAgICAiL2phdmF4L3NlcnZsZXQvcmVzb3VyY2VzL3dlYi1qc3B0YWdsaWJyYXJ5XzJfMC54c2QiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV2ViRHRkUHVibGljSWRfMjIgPQorICAgICAgICAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIFdlYiBBcHBsaWNhdGlvbiAyLjIvL0VOIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXZWJEdGRSZXNvdXJjZVBhdGhfMjIgPQorICAgICAgICAiL2phdmF4L3NlcnZsZXQvcmVzb3VyY2VzL3dlYi1hcHBfMl8yLmR0ZCI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXZWJEdGRQdWJsaWNJZF8yMyA9CisgICAgICAgICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgV2ViIEFwcGxpY2F0aW9uIDIuMy8vRU4iOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdlYkR0ZFJlc291cmNlUGF0aF8yMyA9CisgICAgICAgICIvamF2YXgvc2VydmxldC9yZXNvdXJjZXMvd2ViLWFwcF8yXzMuZHRkIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdlYlNjaGVtYVB1YmxpY0lkXzI0ID0KKyAgICAgICAgIndlYi1hcHBfMl80LnhzZCI7OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdlYlNjaGVtYVJlc291cmNlUGF0aF8yNCA9CisgICAgICAgICIvamF2YXgvc2VydmxldC9yZXNvdXJjZXMvd2ViLWFwcF8yXzQueHNkIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEoyZWVTY2hlbWFQdWJsaWNJZF8xNCA9CisgICAgICAgICJqMmVlXzFfNC54c2QiOzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKMmVlU2NoZW1hUmVzb3VyY2VQYXRoXzE0ID0KKyAgICAgICAgIi9qYXZheC9zZXJ2bGV0L3Jlc291cmNlcy9qMmVlXzFfNC54c2QiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVzNjU2NoZW1hUHVibGljSWRfMTAgPQorICAgICAgICAieG1sLnhzZCI7OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFczY1NjaGVtYVJlc291cmNlUGF0aF8xMCA9CisgICAgICAgICIvamF2YXgvc2VydmxldC9yZXNvdXJjZXMveG1sLnhzZCI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKc3BTY2hlbWFQdWJsaWNJZF8yMCA9CisgICAgICAgICJqc3BfMl8wLnhzZCI7OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpzcFNjaGVtYVJlc291cmNlUGF0aF8yMCA9CisgICAgICAgICIvamF2YXgvc2VydmxldC9yZXNvdXJjZXMvanNwXzJfMC54c2QiOworICAgIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEoyZWVXZWJTZXJ2aWNlU2NoZW1hUHVibGljSWRfMTEgPQorICAgICAgICAgICAgImoyZWVfd2ViX3NlcnZpY2VzXzFfMS54c2QiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEoyZWVXZWJTZXJ2aWNlU2NoZW1hUmVzb3VyY2VQYXRoXzExID0KKyAgICAgICAgICAgICIvamF2YXgvc2VydmxldC9yZXNvdXJjZXMvajJlZV93ZWJfc2VydmljZXNfMV8xLnhzZCI7CisgICAgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSjJlZVdlYlNlcnZpY2VDbGllbnRTY2hlbWFQdWJsaWNJZF8xMSA9CisgICAgICAgICAgICAiajJlZV93ZWJfc2VydmljZXNfY2xpZW50XzFfMS54c2QiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEoyZWVXZWJTZXJ2aWNlQ2xpZW50U2NoZW1hUmVzb3VyY2VQYXRoXzExID0KKyAgICAgICAgICAgICIvamF2YXgvc2VydmxldC9yZXNvdXJjZXMvajJlZV93ZWJfc2VydmljZXNfY2xpZW50XzFfMS54c2QiOworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9Db250ZXh0Q29uZmlnLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9Db250ZXh0Q29uZmlnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDcwODZiZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdGFydHVwL0NvbnRleHRDb25maWcuamF2YQpAQCAtMCwwICsxLDEyNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OS0yMDAxLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5zdGFydHVwOworCisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuQXV0aGVudGljYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5FbmdpbmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Ib3N0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlRXZlbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlBpcGVsaW5lOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuVmFsdmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5XcmFwcGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5Db250YWluZXJCYXNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZENvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkRW5naW5lOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZEhvc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuRXJyb3JQYWdlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkZpbHRlckRlZjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5GaWx0ZXJNYXA7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuTG9naW5Db25maWc7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuU2VjdXJpdHlDb25zdHJhaW50OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuc2Vzc2lvbi5TdGFuZGFyZE1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLlN0cmluZ01hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5kaWdlc3Rlci5EaWdlc3RlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvbWNhdC51dGlsLmRpZ2VzdGVyLlJ1bGVTZXQ7CitpbXBvcnQgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyOworaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uOworCisvKioKKyAqIFN0YXJ0dXAgZXZlbnQgbGlzdGVuZXIgZm9yIGEgPGI+Q29udGV4dDwvYj4gdGhhdCBjb25maWd1cmVzIHRoZSBwcm9wZXJ0aWVzCisgKiBvZiB0aGF0IENvbnRleHQsIGFuZCB0aGUgYXNzb2NpYXRlZCBkZWZpbmVkIHNlcnZsZXRzLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQGF1dGhvciBKZWFuLUZyYW5jb2lzIEFyY2FuZAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgQ29udGV4dENvbmZpZworICAgIGltcGxlbWVudHMgTGlmZWN5Y2xlTGlzdGVuZXIgeworCisgICAgcHJvdGVjdGVkIHN0YXRpYyBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2cgbG9nPQorICAgICAgICBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5LmdldExvZyggQ29udGV4dENvbmZpZy5jbGFzcyApOworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qCisgICAgICogQ3VzdG9tIG1hcHBpbmdzIG9mIGxvZ2luIG1ldGhvZHMgdG8gYXV0aGVudGljYXRvcnMKKyAgICAgKi8KKyAgICBwcml2YXRlIE1hcCBjdXN0b21BdXRoZW50aWNhdG9yczsKKworCisgICAgLyoqCisgICAgICogVGhlIHNldCBvZiBBdXRoZW50aWNhdG9ycyB0aGF0IHdlIGtub3cgaG93IHRvIGNvbmZpZ3VyZS4gIFRoZSBrZXkgaXMKKyAgICAgKiB0aGUgbmFtZSBvZiB0aGUgaW1wbGVtZW50ZWQgYXV0aGVudGljYXRpb24gbWV0aG9kLCBhbmQgdGhlIHZhbHVlIGlzCisgICAgICogdGhlIGZ1bGx5IHF1YWxpZmllZCBKYXZhIGNsYXNzIG5hbWUgb2YgdGhlIGNvcnJlc3BvbmRpbmcgVmFsdmUuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBQcm9wZXJ0aWVzIGF1dGhlbnRpY2F0b3JzID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIENvbnRleHQgd2UgYXJlIGFzc29jaWF0ZWQgd2l0aC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ29udGV4dCBjb250ZXh0ID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIGRlZmF1bHQgd2ViIGFwcGxpY2F0aW9uJ3MgY29udGV4dCBmaWxlIGxvY2F0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdENvbnRleHRYbWwgPSBudWxsOworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IHdlYiBhcHBsaWNhdGlvbidzIGRlcGxveW1lbnQgZGVzY3JpcHRvciBsb2NhdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRXZWJYbWwgPSBudWxsOworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFRyYWNrIGFueSBmYXRhbCBlcnJvcnMgZHVyaW5nIHN0YXJ0dXAgY29uZmlndXJhdGlvbiBwcm9jZXNzaW5nLgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIG9rID0gZmFsc2U7CisKKworICAgIC8qKgorICAgICAqIEFueSBwYXJzZSBlcnJvciB3aGljaCBvY2N1cnJlZCB3aGlsZSBwYXJzaW5nIFhNTCBkZXNjcmlwdG9ycy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU0FYUGFyc2VFeGNlcHRpb24gcGFyc2VFeGNlcHRpb24gPSBudWxsOworCisgICAgCisgICAgLyoqCisgICAgICogT3JpZ2luYWwgZG9jQmFzZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIG9yaWdpbmFsRG9jQmFzZSA9IG51bGw7CisgICAgCisKKyAgICAvKioKKyAgICAgKiBUaGUgc3RyaW5nIHJlc291cmNlcyBmb3IgdGhpcyBwYWNrYWdlLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nTWFuYWdlciBzbSA9CisgICAgICAgIFN0cmluZ01hbmFnZXIuZ2V0TWFuYWdlcihDb25zdGFudHMuUGFja2FnZSk7CisKKworICAgIC8qKgorICAgICAqIFRoZSA8Y29kZT5EaWdlc3RlcjwvY29kZT4gd2Ugd2lsbCB1c2UgdG8gcHJvY2VzcyB3ZWIgYXBwbGljYXRpb24KKyAgICAgKiBjb250ZXh0IGZpbGVzLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgRGlnZXN0ZXIgY29udGV4dERpZ2VzdGVyID0gbnVsbDsKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgPGNvZGU+RGlnZXN0ZXI8L2NvZGU+IHdlIHdpbGwgdXNlIHRvIHByb2Nlc3Mgd2ViIGFwcGxpY2F0aW9uCisgICAgICogZGVwbG95bWVudCBkZXNjcmlwdG9yIGZpbGVzLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgRGlnZXN0ZXIgd2ViRGlnZXN0ZXIgPSBudWxsOworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFRoZSA8Y29kZT5SdWxlPC9jb2RlPiB1c2VkIHRvIHBhcnNlIHRoZSB3ZWIueG1sCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBXZWJSdWxlU2V0IHdlYlJ1bGVTZXQgPSBuZXcgV2ViUnVsZVNldCgpOworCisgICAgLyoqCisgICAgICogQXR0cmlidXRlIHZhbHVlIHVzZWQgdG8gdHVybiBvbi9vZmYgWE1MIHZhbGlkYXRpb24KKyAgICAgKi8KKyAgICAgcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIHhtbFZhbGlkYXRpb24gPSBmYWxzZTsKKworCisgICAgLyoqCisgICAgICogQXR0cmlidXRlIHZhbHVlIHVzZWQgdG8gdHVybiBvbi9vZmYgWE1MIG5hbWVzcGFjZSBhd2FyZW5lcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4geG1sTmFtZXNwYWNlQXdhcmUgPSBmYWxzZTsKKworICAgIAorICAgIC8qKgorICAgICAqIERlcGxveW1lbnQgY291bnQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBsb25nIGRlcGxveW1lbnRDb3VudCA9IDBMOworICAgIAorICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGxvY2F0aW9uIG9mIHRoZSBkZWZhdWx0IGRlcGxveW1lbnQgZGVzY3JpcHRvcgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFdlYlhtbCgpIHsKKyAgICAgICAgaWYoIGRlZmF1bHRXZWJYbWwgPT0gbnVsbCApIGRlZmF1bHRXZWJYbWw9Q29uc3RhbnRzLkRlZmF1bHRXZWJYbWw7CisgICAgICAgIHJldHVybiAodGhpcy5kZWZhdWx0V2ViWG1sKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBsb2NhdGlvbiBvZiB0aGUgZGVmYXVsdCBkZXBsb3ltZW50IGRlc2NyaXB0b3IKKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXRoIEFic29sdXRlL3JlbGF0aXZlIHBhdGggdG8gdGhlIGRlZmF1bHQgd2ViLnhtbAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHRXZWJYbWwoU3RyaW5nIHBhdGgpIHsKKworICAgICAgICB0aGlzLmRlZmF1bHRXZWJYbWwgPSBwYXRoOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGxvY2F0aW9uIG9mIHRoZSBkZWZhdWx0IGNvbnRleHQgZmlsZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENvbnRleHRYbWwoKSB7CisgICAgICAgIGlmKCBkZWZhdWx0Q29udGV4dFhtbCA9PSBudWxsICkgZGVmYXVsdENvbnRleHRYbWw9Q29uc3RhbnRzLkRlZmF1bHRDb250ZXh0WG1sOworICAgICAgICByZXR1cm4gKHRoaXMuZGVmYXVsdENvbnRleHRYbWwpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGxvY2F0aW9uIG9mIHRoZSBkZWZhdWx0IGNvbnRleHQgZmlsZQorICAgICAqCisgICAgICogQHBhcmFtIHBhdGggQWJzb2x1dGUvcmVsYXRpdmUgcGF0aCB0byB0aGUgZGVmYXVsdCBjb250ZXh0LnhtbAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHRDb250ZXh0WG1sKFN0cmluZyBwYXRoKSB7CisKKyAgICAgICAgdGhpcy5kZWZhdWx0Q29udGV4dFhtbCA9IHBhdGg7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldHMgY3VzdG9tIG1hcHBpbmdzIG9mIGxvZ2luIG1ldGhvZHMgdG8gYXV0aGVudGljYXRvcnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY3VzdG9tQXV0aGVudGljYXRvcnMgQ3VzdG9tIG1hcHBpbmdzIG9mIGxvZ2luIG1ldGhvZHMgdG8KKyAgICAgKiBhdXRoZW50aWNhdG9ycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEN1c3RvbUF1dGhlbnRpY2F0b3JzKE1hcCBjdXN0b21BdXRoZW50aWNhdG9ycykgeworICAgICAgICB0aGlzLmN1c3RvbUF1dGhlbnRpY2F0b3JzID0gY3VzdG9tQXV0aGVudGljYXRvcnM7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUHJvY2VzcyBldmVudHMgZm9yIGFuIGFzc29jaWF0ZWQgQ29udGV4dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudCBUaGUgbGlmZWN5Y2xlIGV2ZW50IHRoYXQgaGFzIG9jY3VycmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgbGlmZWN5Y2xlRXZlbnQoTGlmZWN5Y2xlRXZlbnQgZXZlbnQpIHsKKworICAgICAgICAvLyBJZGVudGlmeSB0aGUgY29udGV4dCB3ZSBhcmUgYXNzb2NpYXRlZCB3aXRoCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjb250ZXh0ID0gKENvbnRleHQpIGV2ZW50LmdldExpZmVjeWNsZSgpOworICAgICAgICB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9nLmVycm9yKHNtLmdldFN0cmluZygiY29udGV4dENvbmZpZy5jY2UiLCBldmVudC5nZXRMaWZlY3ljbGUoKSksIGUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gUHJvY2VzcyB0aGUgZXZlbnQgdGhhdCBoYXMgb2NjdXJyZWQKKyAgICAgICAgaWYgKGV2ZW50LmdldFR5cGUoKS5lcXVhbHMoTGlmZWN5Y2xlLlNUQVJUX0VWRU5UKSkgeworICAgICAgICAgICAgc3RhcnQoKTsKKyAgICAgICAgfSBlbHNlIGlmIChldmVudC5nZXRUeXBlKCkuZXF1YWxzKFN0YW5kYXJkQ29udGV4dC5CRUZPUkVfU1RBUlRfRVZFTlQpKSB7CisgICAgICAgICAgICBiZWZvcmVTdGFydCgpOworICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmdldFR5cGUoKS5lcXVhbHMoTGlmZWN5Y2xlLlNUT1BfRVZFTlQpKSB7CisgICAgICAgICAgICBzdG9wKCk7CisgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQuZ2V0VHlwZSgpLmVxdWFscyhMaWZlY3ljbGUuSU5JVF9FVkVOVCkpIHsKKyAgICAgICAgICAgIGluaXQoKTsKKyAgICAgICAgfSBlbHNlIGlmIChldmVudC5nZXRUeXBlKCkuZXF1YWxzKExpZmVjeWNsZS5ERVNUUk9ZX0VWRU5UKSkgeworICAgICAgICAgICAgZGVzdHJveSgpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHByb3RlY3RlZCBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIGFwcGxpY2F0aW9uIGNvbmZpZ3VyYXRpb24gZmlsZSwgaWYgaXQgZXhpc3RzLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGFwcGxpY2F0aW9uV2ViQ29uZmlnKCkgeworCisgICAgICAgIC8vIE9wZW4gdGhlIGFwcGxpY2F0aW9uIHdlYi54bWwgZmlsZSwgaWYgaXQgZXhpc3RzCisgICAgICAgIElucHV0U3RyZWFtIHN0cmVhbSA9IG51bGw7CisgICAgICAgIFNlcnZsZXRDb250ZXh0IHNlcnZsZXRDb250ZXh0ID0gY29udGV4dC5nZXRTZXJ2bGV0Q29udGV4dCgpOworICAgICAgICBpZiAoc2VydmxldENvbnRleHQgIT0gbnVsbCkKKyAgICAgICAgICAgIHN0cmVhbSA9IHNlcnZsZXRDb250ZXh0LmdldFJlc291cmNlQXNTdHJlYW0KKyAgICAgICAgICAgICAgICAoQ29uc3RhbnRzLkFwcGxpY2F0aW9uV2ViWG1sKTsKKyAgICAgICAgaWYgKHN0cmVhbSA9PSBudWxsKSB7CisgICAgICAgICAgICBsb2cuaW5mbyhzbS5nZXRTdHJpbmcoImNvbnRleHRDb25maWcuYXBwbGljYXRpb25NaXNzaW5nIikgKyAiICIgKyBjb250ZXh0KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgbG9uZyB0MT1TeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKworICAgICAgICBpZiAod2ViRGlnZXN0ZXIgPT0gbnVsbCl7CisgICAgICAgICAgICB3ZWJEaWdlc3RlciA9IGNyZWF0ZVdlYkRpZ2VzdGVyKCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIFVSTCB1cmw9bnVsbDsKKyAgICAgICAgLy8gUHJvY2VzcyB0aGUgYXBwbGljYXRpb24gd2ViLnhtbCBmaWxlCisgICAgICAgIHN5bmNocm9uaXplZCAod2ViRGlnZXN0ZXIpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdXJsID0KKyAgICAgICAgICAgICAgICAgICAgc2VydmxldENvbnRleHQuZ2V0UmVzb3VyY2UoQ29uc3RhbnRzLkFwcGxpY2F0aW9uV2ViWG1sKTsKKyAgICAgICAgICAgICAgICBpZiggdXJsIT1udWxsICkgeworICAgICAgICAgICAgICAgICAgICBJbnB1dFNvdXJjZSBpcyA9IG5ldyBJbnB1dFNvdXJjZSh1cmwudG9FeHRlcm5hbEZvcm0oKSk7CisgICAgICAgICAgICAgICAgICAgIGlzLnNldEJ5dGVTdHJlYW0oc3RyZWFtKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRleHQgaW5zdGFuY2VvZiBTdGFuZGFyZENvbnRleHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICgoU3RhbmRhcmRDb250ZXh0KSBjb250ZXh0KS5zZXRSZXBsYWNlV2VsY29tZUZpbGVzKHRydWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHdlYkRpZ2VzdGVyLnB1c2goY29udGV4dCk7CisgICAgICAgICAgICAgICAgICAgIHdlYkRpZ2VzdGVyLnNldEVycm9ySGFuZGxlcihuZXcgQ29udGV4dEVycm9ySGFuZGxlcigpKTsKKyAgICAgICAgICAgICAgICAgICAgd2ViRGlnZXN0ZXIucGFyc2UoaXMpOworICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2VFeGNlcHRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJObyB3ZWIueG1sLCB1c2luZyBkZWZhdWx0cyAiICsgY29udGV4dCApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKFNBWFBhcnNlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3Ioc20uZ2V0U3RyaW5nKCJjb250ZXh0Q29uZmlnLmFwcGxpY2F0aW9uUGFyc2UiKSwgZSk7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKHNtLmdldFN0cmluZygiY29udGV4dENvbmZpZy5hcHBsaWNhdGlvblBvc2l0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiICsgZS5nZXRMaW5lTnVtYmVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiArIGUuZ2V0Q29sdW1uTnVtYmVyKCkpKTsKKyAgICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3Ioc20uZ2V0U3RyaW5nKCJjb250ZXh0Q29uZmlnLmFwcGxpY2F0aW9uUGFyc2UiKSwgZSk7CisgICAgICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgd2ViRGlnZXN0ZXIucmVzZXQoKTsKKyAgICAgICAgICAgICAgICBwYXJzZUV4Y2VwdGlvbiA9IG51bGw7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKHNtLmdldFN0cmluZygiY29udGV4dENvbmZpZy5hcHBsaWNhdGlvbkNsb3NlIiksIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB3ZWJSdWxlU2V0LnJlY3ljbGUoKTsKKworICAgICAgICBsb25nIHQyPVN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICBpZiAoY29udGV4dCBpbnN0YW5jZW9mIFN0YW5kYXJkQ29udGV4dCkgeworICAgICAgICAgICAgKChTdGFuZGFyZENvbnRleHQpIGNvbnRleHQpLnNldFN0YXJ0dXBUaW1lKHQyLXQxKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHVwIGEgbWFuYWdlci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgbWFuYWdlckNvbmZpZygpIHsKKworICAgICAgICBpZiAoY29udGV4dC5nZXRNYW5hZ2VyKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKChjb250ZXh0LmdldENsdXN0ZXIoKSAhPSBudWxsKSAmJiBjb250ZXh0LmdldERpc3RyaWJ1dGFibGUoKSkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0TWFuYWdlcihjb250ZXh0LmdldENsdXN0ZXIoKS5jcmVhdGVNYW5hZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29udGV4dC5nZXROYW1lKCkpKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJjb250ZXh0Q29uZmlnLmNsdXN0ZXJpbmdJbml0IiwgZXgpOworICAgICAgICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY29udGV4dC5zZXRNYW5hZ2VyKG5ldyBTdGFuZGFyZE1hbmFnZXIoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHVwIGFuIEF1dGhlbnRpY2F0b3IgYXV0b21hdGljYWxseSBpZiByZXF1aXJlZCwgYW5kIG9uZSBoYXMgbm90CisgICAgICogYWxyZWFkeSBiZWVuIGNvbmZpZ3VyZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIGF1dGhlbnRpY2F0b3JDb25maWcoKSB7CisKKyAgICAgICAgLy8gRG9lcyB0aGlzIENvbnRleHQgcmVxdWlyZSBhbiBBdXRoZW50aWNhdG9yPworICAgICAgICBTZWN1cml0eUNvbnN0cmFpbnQgY29uc3RyYWludHNbXSA9IGNvbnRleHQuZmluZENvbnN0cmFpbnRzKCk7CisgICAgICAgIGlmICgoY29uc3RyYWludHMgPT0gbnVsbCkgfHwgKGNvbnN0cmFpbnRzLmxlbmd0aCA9PSAwKSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgTG9naW5Db25maWcgbG9naW5Db25maWcgPSBjb250ZXh0LmdldExvZ2luQ29uZmlnKCk7CisgICAgICAgIGlmIChsb2dpbkNvbmZpZyA9PSBudWxsKSB7CisgICAgICAgICAgICBsb2dpbkNvbmZpZyA9IG5ldyBMb2dpbkNvbmZpZygiTk9ORSIsIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICAgICAgY29udGV4dC5zZXRMb2dpbkNvbmZpZyhsb2dpbkNvbmZpZyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBIYXMgYW4gYXV0aGVudGljYXRvciBiZWVuIGNvbmZpZ3VyZWQgYWxyZWFkeT8KKyAgICAgICAgaWYgKGNvbnRleHQgaW5zdGFuY2VvZiBBdXRoZW50aWNhdG9yKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBpZiAoY29udGV4dCBpbnN0YW5jZW9mIENvbnRhaW5lckJhc2UpIHsKKyAgICAgICAgICAgIFBpcGVsaW5lIHBpcGVsaW5lID0gKChDb250YWluZXJCYXNlKSBjb250ZXh0KS5nZXRQaXBlbGluZSgpOworICAgICAgICAgICAgaWYgKHBpcGVsaW5lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBWYWx2ZSBiYXNpYyA9IHBpcGVsaW5lLmdldEJhc2ljKCk7CisgICAgICAgICAgICAgICAgaWYgKChiYXNpYyAhPSBudWxsKSAmJiAoYmFzaWMgaW5zdGFuY2VvZiBBdXRoZW50aWNhdG9yKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIFZhbHZlIHZhbHZlc1tdID0gcGlwZWxpbmUuZ2V0VmFsdmVzKCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx2ZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHZlc1tpXSBpbnN0YW5jZW9mIEF1dGhlbnRpY2F0b3IpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuOyAgICAgLy8gQ2Fubm90IGluc3RhbGwgYSBWYWx2ZSBldmVuIGlmIGl0IHdvdWxkIGJlIG5lZWRlZAorICAgICAgICB9CisKKyAgICAgICAgLy8gSGFzIGEgUmVhbG0gYmVlbiBjb25maWd1cmVkIGZvciB1cyB0byBhdXRoZW50aWNhdGUgYWdhaW5zdD8KKyAgICAgICAgaWYgKGNvbnRleHQuZ2V0UmVhbG0oKSA9PSBudWxsKSB7CisgICAgICAgICAgICBsb2cuZXJyb3Ioc20uZ2V0U3RyaW5nKCJjb250ZXh0Q29uZmlnLm1pc3NpbmdSZWFsbSIpKTsKKyAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBGaXJzdCBjaGVjayB0byBzZWUgaWYgdGhlcmUgaXMgYSBjdXN0b20gbWFwcGluZyBmb3IgdGhlIGxvZ2luCisgICAgICAgICAqIG1ldGhvZC4gSWYgc28sIHVzZSBpdC4gT3RoZXJ3aXNlLCBjaGVjayBpZiB0aGVyZSBpcyBhIG1hcHBpbmcgaW4KKyAgICAgICAgICogb3JnL2FwYWNoZS9jYXRhbGluYS9zdGFydHVwL0F1dGhlbnRpY2F0b3JzLnByb3BlcnRpZXMuCisgICAgICAgICAqLworICAgICAgICBWYWx2ZSBhdXRoZW50aWNhdG9yID0gbnVsbDsKKyAgICAgICAgaWYgKGN1c3RvbUF1dGhlbnRpY2F0b3JzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGF1dGhlbnRpY2F0b3IgPSAoVmFsdmUpCisgICAgICAgICAgICAgICAgY3VzdG9tQXV0aGVudGljYXRvcnMuZ2V0KGxvZ2luQ29uZmlnLmdldEF1dGhNZXRob2QoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGF1dGhlbnRpY2F0b3IgPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gTG9hZCBvdXIgbWFwcGluZyBwcm9wZXJ0aWVzIGlmIG5lY2Vzc2FyeQorICAgICAgICAgICAgaWYgKGF1dGhlbnRpY2F0b3JzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpcz10aGlzLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKCJvcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvQXV0aGVudGljYXRvcnMucHJvcGVydGllcyIpOworICAgICAgICAgICAgICAgICAgICBpZiggaXMhPW51bGwgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdXRoZW50aWNhdG9ycyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBhdXRoZW50aWNhdG9ycy5sb2FkKGlzKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcihzbS5nZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250ZXh0Q29uZmlnLmF1dGhlbnRpY2F0b3JSZXNvdXJjZXMiKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBvaz1mYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKHNtLmdldFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRleHRDb25maWcuYXV0aGVudGljYXRvclJlc291cmNlcyIpLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSWRlbnRpZnkgdGhlIGNsYXNzIG5hbWUgb2YgdGhlIFZhbHZlIHdlIHNob3VsZCBjb25maWd1cmUKKyAgICAgICAgICAgIFN0cmluZyBhdXRoZW50aWNhdG9yTmFtZSA9IG51bGw7CisgICAgICAgICAgICBhdXRoZW50aWNhdG9yTmFtZSA9CisgICAgICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0b3JzLmdldFByb3BlcnR5KGxvZ2luQ29uZmlnLmdldEF1dGhNZXRob2QoKSk7CisgICAgICAgICAgICBpZiAoYXV0aGVudGljYXRvck5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGxvZy5lcnJvcihzbS5nZXRTdHJpbmcoImNvbnRleHRDb25maWcuYXV0aGVudGljYXRvck1pc3NpbmciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9naW5Db25maWcuZ2V0QXV0aE1ldGhvZCgpKSk7CisgICAgICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEluc3RhbnRpYXRlIGFuZCBpbnN0YWxsIGFuIEF1dGhlbnRpY2F0b3Igb2YgdGhlIHJlcXVlc3RlZCBjbGFzcworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBDbGFzcyBhdXRoZW50aWNhdG9yQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKGF1dGhlbnRpY2F0b3JOYW1lKTsKKyAgICAgICAgICAgICAgICBhdXRoZW50aWNhdG9yID0gKFZhbHZlKSBhdXRoZW50aWNhdG9yQ2xhc3MubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKHNtLmdldFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250ZXh0Q29uZmlnLmF1dGhlbnRpY2F0b3JJbnN0YW50aWF0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoZW50aWNhdG9yTmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHQpOworICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoYXV0aGVudGljYXRvciAhPSBudWxsICYmIGNvbnRleHQgaW5zdGFuY2VvZiBDb250YWluZXJCYXNlKSB7CisgICAgICAgICAgICBQaXBlbGluZSBwaXBlbGluZSA9ICgoQ29udGFpbmVyQmFzZSkgY29udGV4dCkuZ2V0UGlwZWxpbmUoKTsKKyAgICAgICAgICAgIGlmIChwaXBlbGluZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgKChDb250YWluZXJCYXNlKSBjb250ZXh0KS5hZGRWYWx2ZShhdXRoZW50aWNhdG9yKTsKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKHNtLmdldFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250ZXh0Q29uZmlnLmF1dGhlbnRpY2F0b3JDb25maWd1cmVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2luQ29uZmlnLmdldEF1dGhNZXRob2QoKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgKGlmIG5lY2Vzc2FyeSkgYW5kIHJldHVybiBhIERpZ2VzdGVyIGNvbmZpZ3VyZWQgdG8gcHJvY2VzcyB0aGUKKyAgICAgKiB3ZWIgYXBwbGljYXRpb24gZGVwbG95bWVudCBkZXNjcmlwdG9yICh3ZWIueG1sKS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIERpZ2VzdGVyIGNyZWF0ZVdlYkRpZ2VzdGVyKCkgeworICAgICAgICBEaWdlc3RlciB3ZWJEaWdlc3RlciA9CisgICAgICAgICAgICBjcmVhdGVXZWJYbWxEaWdlc3Rlcih4bWxOYW1lc3BhY2VBd2FyZSwgeG1sVmFsaWRhdGlvbik7CisgICAgICAgIHJldHVybiB3ZWJEaWdlc3RlcjsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENyZWF0ZSAoaWYgbmVjZXNzYXJ5KSBhbmQgcmV0dXJuIGEgRGlnZXN0ZXIgY29uZmlndXJlZCB0byBwcm9jZXNzIHRoZQorICAgICAqIHdlYiBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IgKHdlYi54bWwpLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgRGlnZXN0ZXIgY3JlYXRlV2ViWG1sRGlnZXN0ZXIoYm9vbGVhbiBuYW1lc3BhY2VBd2FyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gdmFsaWRhdGlvbikgeworICAgICAgICAKKyAgICAgICAgRGlnZXN0ZXIgd2ViRGlnZXN0ZXIgPSAgRGlnZXN0ZXJGYWN0b3J5Lm5ld0RpZ2VzdGVyKHhtbFZhbGlkYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxOYW1lc3BhY2VBd2FyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlYlJ1bGVTZXQpOworICAgICAgICByZXR1cm4gd2ViRGlnZXN0ZXI7CisgICAgfQorCisgICAgCisgICAgLyoqCisgICAgICogQ3JlYXRlIChpZiBuZWNlc3NhcnkpIGFuZCByZXR1cm4gYSBEaWdlc3RlciBjb25maWd1cmVkIHRvIHByb2Nlc3MgdGhlCisgICAgICogY29udGV4dCBjb25maWd1cmF0aW9uIGRlc2NyaXB0b3IgZm9yIGFuIGFwcGxpY2F0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCBEaWdlc3RlciBjcmVhdGVDb250ZXh0RGlnZXN0ZXIoKSB7CisgICAgICAgIERpZ2VzdGVyIGRpZ2VzdGVyID0gbmV3IERpZ2VzdGVyKCk7CisgICAgICAgIGRpZ2VzdGVyLnNldFZhbGlkYXRpbmcoZmFsc2UpOworICAgICAgICBSdWxlU2V0IGNvbnRleHRSdWxlU2V0ID0gbmV3IENvbnRleHRSdWxlU2V0KCIiLCBmYWxzZSk7CisgICAgICAgIGRpZ2VzdGVyLmFkZFJ1bGVTZXQoY29udGV4dFJ1bGVTZXQpOworICAgICAgICBSdWxlU2V0IG5hbWluZ1J1bGVTZXQgPSBuZXcgTmFtaW5nUnVsZVNldCgiQ29udGV4dC8iKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkUnVsZVNldChuYW1pbmdSdWxlU2V0KTsKKyAgICAgICAgcmV0dXJuIGRpZ2VzdGVyOworICAgIH0KKworCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRCYXNlRGlyKCkgeworICAgICAgICBDb250YWluZXIgZW5naW5lQz1jb250ZXh0LmdldFBhcmVudCgpLmdldFBhcmVudCgpOworICAgICAgICBpZiggZW5naW5lQyBpbnN0YW5jZW9mIFN0YW5kYXJkRW5naW5lICkgeworICAgICAgICAgICAgcmV0dXJuICgoU3RhbmRhcmRFbmdpbmUpZW5naW5lQykuZ2V0QmFzZURpcigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBTeXN0ZW0uZ2V0UHJvcGVydHkoImNhdGFsaW5hLmJhc2UiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZmlsZSwgaWYgaXQgZXhpc3RzLgorICAgICAqIFRoZSBkZWZhdWx0IGNvbmZpZyBtdXN0IGJlIHJlYWQgd2l0aCB0aGUgY29udGFpbmVyIGxvYWRlciAtIHNvCisgICAgICogY29udGFpbmVyIHNlcnZsZXRzIGNhbiBiZSBsb2FkZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBkZWZhdWx0V2ViQ29uZmlnKCkgeworICAgICAgICBsb25nIHQxPVN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCisgICAgICAgIC8vIE9wZW4gdGhlIGRlZmF1bHQgd2ViLnhtbCBmaWxlLCBpZiBpdCBleGlzdHMKKyAgICAgICAgaWYoIGRlZmF1bHRXZWJYbWw9PW51bGwgJiYgY29udGV4dCBpbnN0YW5jZW9mIFN0YW5kYXJkQ29udGV4dCApIHsKKyAgICAgICAgICAgIGRlZmF1bHRXZWJYbWw9KChTdGFuZGFyZENvbnRleHQpY29udGV4dCkuZ2V0RGVmYXVsdFdlYlhtbCgpOworICAgICAgICB9CisgICAgICAgIC8vIHNldCB0aGUgZGVmYXVsdCBpZiB3ZSBkb24ndCBoYXZlIGFueSBvdmVycmlkZXMKKyAgICAgICAgaWYoIGRlZmF1bHRXZWJYbWw9PW51bGwgKSBnZXREZWZhdWx0V2ViWG1sKCk7CisKKyAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUodGhpcy5kZWZhdWx0V2ViWG1sKTsKKyAgICAgICAgaWYgKCFmaWxlLmlzQWJzb2x1dGUoKSkgeworICAgICAgICAgICAgZmlsZSA9IG5ldyBGaWxlKGdldEJhc2VEaXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlZmF1bHRXZWJYbWwpOworICAgICAgICB9CisKKyAgICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtID0gbnVsbDsKKyAgICAgICAgSW5wdXRTb3VyY2Ugc291cmNlID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKCAhIGZpbGUuZXhpc3RzKCkgKSB7CisgICAgICAgICAgICAgICAgLy8gVXNlIGdldFJlc291cmNlIGFuZCBnZXRSZXNvdXJjZUFzU3RyZWFtCisgICAgICAgICAgICAgICAgc3RyZWFtID0gZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpCisgICAgICAgICAgICAgICAgICAgIC5nZXRSZXNvdXJjZUFzU3RyZWFtKGRlZmF1bHRXZWJYbWwpOworICAgICAgICAgICAgICAgIGlmKCBzdHJlYW0gIT0gbnVsbCApIHsKKyAgICAgICAgICAgICAgICAgICAgc291cmNlID0gbmV3IElucHV0U291cmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRSZXNvdXJjZShkZWZhdWx0V2ViWG1sKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbygiTm8gZGVmYXVsdCB3ZWIueG1sIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzb3VyY2UgPQorICAgICAgICAgICAgICAgICAgICBuZXcgSW5wdXRTb3VyY2UoImZpbGU6Ly8iICsgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgICAgICAgICAgc3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcihzbS5nZXRTdHJpbmcoImNvbnRleHRDb25maWcuZGVmYXVsdE1pc3NpbmciKSAKKyAgICAgICAgICAgICAgICAgICAgICArICIgIiArIGRlZmF1bHRXZWJYbWwgKyAiICIgKyBmaWxlICwgZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAod2ViRGlnZXN0ZXIgPT0gbnVsbCl7CisgICAgICAgICAgICB3ZWJEaWdlc3RlciA9IGNyZWF0ZVdlYkRpZ2VzdGVyKCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChzdHJlYW0gIT0gbnVsbCkgeworICAgICAgICAgICAgcHJvY2Vzc0RlZmF1bHRXZWJDb25maWcod2ViRGlnZXN0ZXIsIHN0cmVhbSwgc291cmNlKTsKKyAgICAgICAgICAgIHdlYlJ1bGVTZXQucmVjeWNsZSgpOworICAgICAgICB9CisKKyAgICAgICAgbG9uZyB0Mj1TeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgaWYoICh0Mi10MSkgPiAyMDAgKQorICAgICAgICAgICAgbG9nLmRlYnVnKCJQcm9jZXNzZWQgZGVmYXVsdCB3ZWIueG1sICIgKyBmaWxlICsgIiAiICArICggdDItdDEpKTsKKworICAgICAgICBzdHJlYW0gPSBudWxsOworICAgICAgICBzb3VyY2UgPSBudWxsOworCisgICAgICAgIGZpbGUgPSBuZXcgRmlsZShnZXRDb25maWdCYXNlKCksIENvbnN0YW50cy5Ib3N0V2ViWG1sKTsKKyAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgIGlmIChmaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgc291cmNlID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IElucHV0U291cmNlKCJmaWxlOi8vIiArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICAgICAgICAgIHN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2cuZXJyb3Ioc20uZ2V0U3RyaW5nKCJjb250ZXh0Q29uZmlnLmRlZmF1bHRNaXNzaW5nIikgCisgICAgICAgICAgICAgICAgICAgICAgKyAiICIgKyBmaWxlICwgZSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChzdHJlYW0gIT0gbnVsbCkgeworICAgICAgICAgICAgcHJvY2Vzc0RlZmF1bHRXZWJDb25maWcod2ViRGlnZXN0ZXIsIHN0cmVhbSwgc291cmNlKTsKKyAgICAgICAgICAgIHdlYlJ1bGVTZXQucmVjeWNsZSgpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgYSBkZWZhdWx0IHdlYi54bWwuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0RlZmF1bHRXZWJDb25maWcoRGlnZXN0ZXIgZGlnZXN0ZXIsIElucHV0U3RyZWFtIHN0cmVhbSwgCisgICAgICAgICAgICBJbnB1dFNvdXJjZSBzb3VyY2UpIHsKKyAgICAgICAgLy8gUHJvY2VzcyB0aGUgZGVmYXVsdCB3ZWIueG1sIGZpbGUKKyAgICAgICAgc3luY2hyb25pemVkIChkaWdlc3RlcikgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBzb3VyY2Uuc2V0Qnl0ZVN0cmVhbShzdHJlYW0pOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmIChjb250ZXh0IGluc3RhbmNlb2YgU3RhbmRhcmRDb250ZXh0KQorICAgICAgICAgICAgICAgICAgICAoKFN0YW5kYXJkQ29udGV4dCkgY29udGV4dCkuc2V0UmVwbGFjZVdlbGNvbWVGaWxlcyh0cnVlKTsKKyAgICAgICAgICAgICAgICBkaWdlc3Rlci5zZXRDbGFzc0xvYWRlcih0aGlzLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7CisgICAgICAgICAgICAgICAgZGlnZXN0ZXIuc2V0VXNlQ29udGV4dENsYXNzTG9hZGVyKGZhbHNlKTsKKyAgICAgICAgICAgICAgICBkaWdlc3Rlci5wdXNoKGNvbnRleHQpOworICAgICAgICAgICAgICAgIGRpZ2VzdGVyLnNldEVycm9ySGFuZGxlcihuZXcgQ29udGV4dEVycm9ySGFuZGxlcigpKTsKKyAgICAgICAgICAgICAgICBkaWdlc3Rlci5wYXJzZShzb3VyY2UpOworICAgICAgICAgICAgICAgIGlmIChwYXJzZUV4Y2VwdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoU0FYUGFyc2VFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxvZy5lcnJvcihzbS5nZXRTdHJpbmcoImNvbnRleHRDb25maWcuZGVmYXVsdFBhcnNlIiksIGUpOworICAgICAgICAgICAgICAgIGxvZy5lcnJvcihzbS5nZXRTdHJpbmcoImNvbnRleHRDb25maWcuZGVmYXVsdFBvc2l0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiICsgZS5nZXRMaW5lTnVtYmVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiArIGUuZ2V0Q29sdW1uTnVtYmVyKCkpKTsKKyAgICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3Ioc20uZ2V0U3RyaW5nKCJjb250ZXh0Q29uZmlnLmRlZmF1bHRQYXJzZSIpLCBlKTsKKyAgICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBkaWdlc3Rlci5yZXNldCgpOworICAgICAgICAgICAgICAgIHBhcnNlRXhjZXB0aW9uID0gbnVsbDsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3Ioc20uZ2V0U3RyaW5nKCJjb250ZXh0Q29uZmlnLmRlZmF1bHRDbG9zZSIpLCBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBmaWxlLCBpZiBpdCBleGlzdHMuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgY29udGV4dENvbmZpZygpIHsKKyAgICAgICAgCisgICAgICAgIC8vIE9wZW4gdGhlIGRlZmF1bHQgd2ViLnhtbCBmaWxlLCBpZiBpdCBleGlzdHMKKyAgICAgICAgaWYoIGRlZmF1bHRDb250ZXh0WG1sPT1udWxsICYmIGNvbnRleHQgaW5zdGFuY2VvZiBTdGFuZGFyZENvbnRleHQgKSB7CisgICAgICAgICAgICBkZWZhdWx0Q29udGV4dFhtbCA9ICgoU3RhbmRhcmRDb250ZXh0KWNvbnRleHQpLmdldERlZmF1bHRDb250ZXh0WG1sKCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gc2V0IHRoZSBkZWZhdWx0IGlmIHdlIGRvbid0IGhhdmUgYW55IG92ZXJyaWRlcworICAgICAgICBpZiggZGVmYXVsdENvbnRleHRYbWw9PW51bGwgKSBnZXREZWZhdWx0Q29udGV4dFhtbCgpOworCisgICAgICAgIGlmICghY29udGV4dC5nZXRPdmVycmlkZSgpKSB7CisgICAgICAgICAgICBwcm9jZXNzQ29udGV4dENvbmZpZyhuZXcgRmlsZShnZXRCYXNlRGlyKCksIGRlZmF1bHRDb250ZXh0WG1sKSk7CisgICAgICAgICAgICBwcm9jZXNzQ29udGV4dENvbmZpZyhuZXcgRmlsZShnZXRDb25maWdCYXNlKCksIENvbnN0YW50cy5Ib3N0Q29udGV4dFhtbCkpOworICAgICAgICB9CisgICAgICAgIGlmIChjb250ZXh0LmdldENvbmZpZ0ZpbGUoKSAhPSBudWxsKQorICAgICAgICAgICAgcHJvY2Vzc0NvbnRleHRDb25maWcobmV3IEZpbGUoY29udGV4dC5nZXRDb25maWdGaWxlKCkpKTsKKyAgICAgICAgCisgICAgfQorCisgICAgCisgICAgLyoqCisgICAgICogUHJvY2VzcyBhIGNvbnRleHQueG1sLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NDb250ZXh0Q29uZmlnKEZpbGUgZmlsZSkgeworICAgICAgICAKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmRlYnVnKCJQcm9jZXNzaW5nIGNvbnRleHQgWyIgKyBjb250ZXh0LmdldE5hbWUoKSArICJdIGNvbmZpZ3VyYXRpb24gZmlsZSAiICsgZmlsZSk7CisgICAgICAgIAorICAgICAgICAvLyBBZGQgYXMgd2F0Y2hlZCByZXNvdXJjZSBzbyB0aGF0IGNhc2NhZGUgcmVsb2FkIG9jY3VycyBpZiBhIGRlZmF1bHQKKyAgICAgICAgLy8gY29uZmlnIGZpbGUgaXMgbW9kaWZpZWQvYWRkZWQvcmVtb3ZlZAorICAgICAgICBjb250ZXh0LmFkZFdhdGNoZWRSZXNvdXJjZShmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKKworICAgICAgICBJbnB1dFNvdXJjZSBzb3VyY2UgPSBudWxsOworICAgICAgICBJbnB1dFN0cmVhbSBzdHJlYW0gPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKGZpbGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICBzdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpOworICAgICAgICAgICAgICAgIHNvdXJjZSA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBJbnB1dFNvdXJjZSgiZmlsZTovLyIgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkNvbnRleHQgWyIgKyBjb250ZXh0LmdldE5hbWUoKSArICJdIGNvbmZpZ3VyYXRpb24gZmlsZSAiICsgZmlsZSArICIgbm90IGZvdW5kIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2cuZXJyb3Ioc20uZ2V0U3RyaW5nKCJjb250ZXh0Q29uZmlnLmRlZmF1bHRNaXNzaW5nIikgKyBmaWxlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc291cmNlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGlmIChjb250ZXh0RGlnZXN0ZXIgPT0gbnVsbCl7CisgICAgICAgICAgICBjb250ZXh0RGlnZXN0ZXIgPSBjcmVhdGVDb250ZXh0RGlnZXN0ZXIoKTsKKyAgICAgICAgfQorICAgICAgICBzeW5jaHJvbml6ZWQgKGNvbnRleHREaWdlc3RlcikgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBzb3VyY2Uuc2V0Qnl0ZVN0cmVhbShzdHJlYW0pOworICAgICAgICAgICAgICAgIGNvbnRleHREaWdlc3Rlci5zZXRDbGFzc0xvYWRlcih0aGlzLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7CisgICAgICAgICAgICAgICAgY29udGV4dERpZ2VzdGVyLnNldFVzZUNvbnRleHRDbGFzc0xvYWRlcihmYWxzZSk7CisgICAgICAgICAgICAgICAgY29udGV4dERpZ2VzdGVyLnB1c2goY29udGV4dC5nZXRQYXJlbnQoKSk7CisgICAgICAgICAgICAgICAgY29udGV4dERpZ2VzdGVyLnB1c2goY29udGV4dCk7CisgICAgICAgICAgICAgICAgY29udGV4dERpZ2VzdGVyLnNldEVycm9ySGFuZGxlcihuZXcgQ29udGV4dEVycm9ySGFuZGxlcigpKTsKKyAgICAgICAgICAgICAgICBjb250ZXh0RGlnZXN0ZXIucGFyc2Uoc291cmNlKTsKKyAgICAgICAgICAgICAgICBpZiAocGFyc2VFeGNlcHRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKFNBWFBhcnNlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3Ioc20uZ2V0U3RyaW5nKCJjb250ZXh0Q29uZmlnLmRlZmF1bHRQYXJzZSIpLCBlKTsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3Ioc20uZ2V0U3RyaW5nKCJjb250ZXh0Q29uZmlnLmRlZmF1bHRQb3NpdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiArIGUuZ2V0TGluZU51bWJlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIgKyBlLmdldENvbHVtbk51bWJlcigpKSk7CisgICAgICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKHNtLmdldFN0cmluZygiY29udGV4dENvbmZpZy5kZWZhdWx0UGFyc2UiKSwgZSk7CisgICAgICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgY29udGV4dERpZ2VzdGVyLnJlc2V0KCk7CisgICAgICAgICAgICAgICAgcGFyc2VFeGNlcHRpb24gPSBudWxsOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcihzbS5nZXRTdHJpbmcoImNvbnRleHRDb25maWcuZGVmYXVsdENsb3NlIiksIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIAorICAgIC8qKgorICAgICAqIEFkanVzdCBkb2NCYXNlLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGZpeERvY0Jhc2UoKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAKKyAgICAgICAgSG9zdCBob3N0ID0gKEhvc3QpIGNvbnRleHQuZ2V0UGFyZW50KCk7CisgICAgICAgIFN0cmluZyBhcHBCYXNlID0gaG9zdC5nZXRBcHBCYXNlKCk7CisKKyAgICAgICAgYm9vbGVhbiB1bnBhY2tXQVJzID0gdHJ1ZTsKKyAgICAgICAgaWYgKGhvc3QgaW5zdGFuY2VvZiBTdGFuZGFyZEhvc3QpIHsKKyAgICAgICAgICAgIHVucGFja1dBUnMgPSAoKFN0YW5kYXJkSG9zdCkgaG9zdCkuaXNVbnBhY2tXQVJzKCkgCisgICAgICAgICAgICAgICAgJiYgKChTdGFuZGFyZENvbnRleHQpIGNvbnRleHQpLmdldFVucGFja1dBUigpOworICAgICAgICB9CisKKyAgICAgICAgRmlsZSBjYW5vbmljYWxBcHBCYXNlID0gbmV3IEZpbGUoYXBwQmFzZSk7CisgICAgICAgIGlmIChjYW5vbmljYWxBcHBCYXNlLmlzQWJzb2x1dGUoKSkgeworICAgICAgICAgICAgY2Fub25pY2FsQXBwQmFzZSA9IGNhbm9uaWNhbEFwcEJhc2UuZ2V0Q2Fub25pY2FsRmlsZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2Fub25pY2FsQXBwQmFzZSA9IAorICAgICAgICAgICAgICAgIG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2F0YWxpbmEuYmFzZSIpLCBhcHBCYXNlKQorICAgICAgICAgICAgICAgIC5nZXRDYW5vbmljYWxGaWxlKCk7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgZG9jQmFzZSA9IGNvbnRleHQuZ2V0RG9jQmFzZSgpOworICAgICAgICBpZiAoZG9jQmFzZSA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBUcnlpbmcgdG8gZ3Vlc3MgdGhlIGRvY0Jhc2UgYWNjb3JkaW5nIHRvIHRoZSBwYXRoCisgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IGNvbnRleHQuZ2V0UGF0aCgpOworICAgICAgICAgICAgaWYgKHBhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwYXRoLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgICAgICBkb2NCYXNlID0gIlJPT1QiOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAocGF0aC5zdGFydHNXaXRoKCIvIikpIHsKKyAgICAgICAgICAgICAgICAgICAgZG9jQmFzZSA9IHBhdGguc3Vic3RyaW5nKDEpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGRvY0Jhc2UgPSBwYXRoOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGRvY0Jhc2UpOworICAgICAgICBpZiAoIWZpbGUuaXNBYnNvbHV0ZSgpKSB7CisgICAgICAgICAgICBkb2NCYXNlID0gKG5ldyBGaWxlKGNhbm9uaWNhbEFwcEJhc2UsIGRvY0Jhc2UpKS5nZXRQYXRoKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkb2NCYXNlID0gZmlsZS5nZXRDYW5vbmljYWxQYXRoKCk7CisgICAgICAgIH0KKyAgICAgICAgZmlsZSA9IG5ldyBGaWxlKGRvY0Jhc2UpOworCisgICAgICAgIGlmIChkb2NCYXNlLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoIi53YXIiKSAmJiAhZmlsZS5pc0RpcmVjdG9yeSgpICYmIHVucGFja1dBUnMpIHsKKyAgICAgICAgICAgIFVSTCB3YXIgPSBuZXcgVVJMKCJqYXI6IiArIChuZXcgRmlsZShkb2NCYXNlKSkudG9VUkwoKSArICIhLyIpOworICAgICAgICAgICAgU3RyaW5nIGNvbnRleHRQYXRoID0gY29udGV4dC5nZXRQYXRoKCk7CisgICAgICAgICAgICBpZiAoY29udGV4dFBhdGguZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgICAgIGNvbnRleHRQYXRoID0gIlJPT1QiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZG9jQmFzZSA9IEV4cGFuZFdhci5leHBhbmQoaG9zdCwgd2FyLCBjb250ZXh0UGF0aCk7CisgICAgICAgICAgICBmaWxlID0gbmV3IEZpbGUoZG9jQmFzZSk7CisgICAgICAgICAgICBkb2NCYXNlID0gZmlsZS5nZXRDYW5vbmljYWxQYXRoKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBGaWxlIGRvY0RpciA9IG5ldyBGaWxlKGRvY0Jhc2UpOworICAgICAgICAgICAgaWYgKCFkb2NEaXIuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICBGaWxlIHdhckZpbGUgPSBuZXcgRmlsZShkb2NCYXNlICsgIi53YXIiKTsKKyAgICAgICAgICAgICAgICBpZiAod2FyRmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAodW5wYWNrV0FScykgeworICAgICAgICAgICAgICAgICAgICAgICAgVVJMIHdhciA9IG5ldyBVUkwoImphcjoiICsgd2FyRmlsZS50b1VSTCgpICsgIiEvIik7CisgICAgICAgICAgICAgICAgICAgICAgICBkb2NCYXNlID0gRXhwYW5kV2FyLmV4cGFuZChob3N0LCB3YXIsIGNvbnRleHQuZ2V0UGF0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgPSBuZXcgRmlsZShkb2NCYXNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvY0Jhc2UgPSBmaWxlLmdldENhbm9uaWNhbFBhdGgoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvY0Jhc2UgPSB3YXJGaWxlLmdldENhbm9uaWNhbFBhdGgoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChkb2NCYXNlLnN0YXJ0c1dpdGgoY2Fub25pY2FsQXBwQmFzZS5nZXRQYXRoKCkpKSB7CisgICAgICAgICAgICBkb2NCYXNlID0gZG9jQmFzZS5zdWJzdHJpbmcoY2Fub25pY2FsQXBwQmFzZS5nZXRQYXRoKCkubGVuZ3RoKCkpOworICAgICAgICAgICAgZG9jQmFzZSA9IGRvY0Jhc2UucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcvJyk7CisgICAgICAgICAgICBpZiAoZG9jQmFzZS5zdGFydHNXaXRoKCIvIikpIHsKKyAgICAgICAgICAgICAgICBkb2NCYXNlID0gZG9jQmFzZS5zdWJzdHJpbmcoMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkb2NCYXNlID0gZG9jQmFzZS5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnRleHQuc2V0RG9jQmFzZShkb2NCYXNlKTsKKworICAgIH0KKyAgICAKKyAgICAKKyAgICBwcm90ZWN0ZWQgdm9pZCBhbnRpTG9ja2luZygpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKChjb250ZXh0IGluc3RhbmNlb2YgU3RhbmRhcmRDb250ZXh0KSAKKyAgICAgICAgICAgICYmICgoU3RhbmRhcmRDb250ZXh0KSBjb250ZXh0KS5nZXRBbnRpUmVzb3VyY2VMb2NraW5nKCkpIHsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgSG9zdCBob3N0ID0gKEhvc3QpIGNvbnRleHQuZ2V0UGFyZW50KCk7CisgICAgICAgICAgICBTdHJpbmcgYXBwQmFzZSA9IGhvc3QuZ2V0QXBwQmFzZSgpOworICAgICAgICAgICAgU3RyaW5nIGRvY0Jhc2UgPSBjb250ZXh0LmdldERvY0Jhc2UoKTsKKyAgICAgICAgICAgIGlmIChkb2NCYXNlID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgaWYgKG9yaWdpbmFsRG9jQmFzZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgb3JpZ2luYWxEb2NCYXNlID0gZG9jQmFzZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZG9jQmFzZSA9IG9yaWdpbmFsRG9jQmFzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZpbGUgZG9jQmFzZUZpbGUgPSBuZXcgRmlsZShkb2NCYXNlKTsKKyAgICAgICAgICAgIGlmICghZG9jQmFzZUZpbGUuaXNBYnNvbHV0ZSgpKSB7CisgICAgICAgICAgICAgICAgZG9jQmFzZUZpbGUgPSBuZXcgRmlsZShhcHBCYXNlLCBkb2NCYXNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBjb250ZXh0LmdldFBhdGgoKTsKKyAgICAgICAgICAgIGlmIChwYXRoID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocGF0aC5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICAgICAgZG9jQmFzZSA9ICJST09UIjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHBhdGguc3RhcnRzV2l0aCgiLyIpKSB7CisgICAgICAgICAgICAgICAgICAgIGRvY0Jhc2UgPSBwYXRoLnN1YnN0cmluZygxKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBkb2NCYXNlID0gcGF0aDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEZpbGUgZmlsZSA9IG51bGw7CisgICAgICAgICAgICBpZiAoZG9jQmFzZS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCIud2FyIikpIHsKKyAgICAgICAgICAgICAgICBmaWxlID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmlvLnRtcGRpciIpLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVwbG95bWVudENvdW50KysgKyAiLSIgKyBkb2NCYXNlICsgIi53YXIiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZmlsZSA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5pby50bXBkaXIiKSwgCisgICAgICAgICAgICAgICAgICAgICAgICBkZXBsb3ltZW50Q291bnQrKyArICItIiArIGRvY0Jhc2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJBbnRpIGxvY2tpbmcgY29udGV4dFsiICsgY29udGV4dC5nZXRQYXRoKCkgCisgICAgICAgICAgICAgICAgICAgICAgICArICJdIHNldHRpbmcgZG9jQmFzZSB0byAiICsgZmlsZSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIENsZWFudXAganVzdCBpbiBjYXNlIGFuIG9sZCBkZXBsb3ltZW50IGlzIGx5aW5nIGFyb3VuZAorICAgICAgICAgICAgRXhwYW5kV2FyLmRlbGV0ZShmaWxlKTsKKyAgICAgICAgICAgIGlmIChFeHBhbmRXYXIuY29weShkb2NCYXNlRmlsZSwgZmlsZSkpIHsKKyAgICAgICAgICAgICAgICBjb250ZXh0LnNldERvY0Jhc2UoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgfQorICAgICAgICAKKyAgICB9CisgICAgCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIGEgImluaXQiIGV2ZW50IGZvciB0aGlzIENvbnRleHQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKKyAgICAgICAgLy8gQ2FsbGVkIGZyb20gU3RhbmRhcmRDb250ZXh0LmluaXQoKQorCisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZyhzbS5nZXRTdHJpbmcoImNvbnRleHRDb25maWcuaW5pdCIpKTsKKyAgICAgICAgY29udGV4dC5zZXRDb25maWd1cmVkKGZhbHNlKTsKKyAgICAgICAgb2sgPSB0cnVlOworICAgICAgICAKKyAgICAgICAgY29udGV4dENvbmZpZygpOworICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpeERvY0Jhc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9nLmVycm9yKHNtLmdldFN0cmluZygiY29udGV4dENvbmZpZy5maXhEb2NCYXNlIiksIGUpOworICAgICAgICB9CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIGEgImJlZm9yZSBzdGFydCIgZXZlbnQgZm9yIHRoaXMgQ29udGV4dC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgYmVmb3JlU3RhcnQoKSB7CisgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgYW50aUxvY2tpbmcoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9nLmVycm9yKHNtLmdldFN0cmluZygiY29udGV4dENvbmZpZy5hbnRpTG9ja2luZyIpLCBlKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogUHJvY2VzcyBhICJzdGFydCIgZXZlbnQgZm9yIHRoaXMgQ29udGV4dC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgc3RhcnQoKSB7CisgICAgICAgIC8vIENhbGxlZCBmcm9tIFN0YW5kYXJkQ29udGV4dC5zdGFydCgpCisKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmRlYnVnKHNtLmdldFN0cmluZygiY29udGV4dENvbmZpZy5zdGFydCIpKTsKKworICAgICAgICAvLyBTZXQgcHJvcGVydGllcyBiYXNlZCBvbiBEZWZhdWx0Q29udGV4dAorICAgICAgICBDb250YWluZXIgY29udGFpbmVyID0gY29udGV4dC5nZXRQYXJlbnQoKTsKKyAgICAgICAgaWYoICFjb250ZXh0LmdldE92ZXJyaWRlKCkgKSB7CisgICAgICAgICAgICBpZiggY29udGFpbmVyIGluc3RhbmNlb2YgSG9zdCApIHsKKyAgICAgICAgICAgICAgICAvLyBSZXNldCB0aGUgdmFsdWUgb25seSBpZiB0aGUgYXR0cmlidXRlIHdhc24ndAorICAgICAgICAgICAgICAgIC8vIHNldCBvbiB0aGUgY29udGV4dC4KKyAgICAgICAgICAgICAgICB4bWxWYWxpZGF0aW9uID0gY29udGV4dC5nZXRYbWxWYWxpZGF0aW9uKCk7CisgICAgICAgICAgICAgICAgaWYgKCF4bWxWYWxpZGF0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIHhtbFZhbGlkYXRpb24gPSAoKEhvc3QpY29udGFpbmVyKS5nZXRYbWxWYWxpZGF0aW9uKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHhtbE5hbWVzcGFjZUF3YXJlID0gY29udGV4dC5nZXRYbWxOYW1lc3BhY2VBd2FyZSgpOworICAgICAgICAgICAgICAgIGlmICgheG1sTmFtZXNwYWNlQXdhcmUpeworICAgICAgICAgICAgICAgICAgICB4bWxOYW1lc3BhY2VBd2FyZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAoKEhvc3QpY29udGFpbmVyKS5nZXRYbWxOYW1lc3BhY2VBd2FyZSgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNvbnRhaW5lciA9IGNvbnRhaW5lci5nZXRQYXJlbnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFByb2Nlc3MgdGhlIGRlZmF1bHQgYW5kIGFwcGxpY2F0aW9uIHdlYi54bWwgZmlsZXMKKyAgICAgICAgZGVmYXVsdFdlYkNvbmZpZygpOworICAgICAgICBhcHBsaWNhdGlvbldlYkNvbmZpZygpOworICAgICAgICBpZiAob2spIHsKKyAgICAgICAgICAgIHZhbGlkYXRlU2VjdXJpdHlSb2xlcygpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ29uZmlndXJlIGFuIGF1dGhlbnRpY2F0b3IgaWYgd2UgbmVlZCBvbmUKKyAgICAgICAgaWYgKG9rKQorICAgICAgICAgICAgYXV0aGVudGljYXRvckNvbmZpZygpOworCisgICAgICAgIC8vIENvbmZpZ3VyZSBhIG1hbmFnZXIKKyAgICAgICAgaWYgKG9rKQorICAgICAgICAgICAgbWFuYWdlckNvbmZpZygpOworCisgICAgICAgIC8vIER1bXAgdGhlIGNvbnRlbnRzIG9mIHRoaXMgcGlwZWxpbmUgaWYgcmVxdWVzdGVkCisgICAgICAgIGlmICgobG9nLmlzRGVidWdFbmFibGVkKCkpICYmIChjb250ZXh0IGluc3RhbmNlb2YgQ29udGFpbmVyQmFzZSkpIHsKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiUGlwbGluZSBDb25maWd1cmF0aW9uOiIpOworICAgICAgICAgICAgUGlwZWxpbmUgcGlwZWxpbmUgPSAoKENvbnRhaW5lckJhc2UpIGNvbnRleHQpLmdldFBpcGVsaW5lKCk7CisgICAgICAgICAgICBWYWx2ZSB2YWx2ZXNbXSA9IG51bGw7CisgICAgICAgICAgICBpZiAocGlwZWxpbmUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB2YWx2ZXMgPSBwaXBlbGluZS5nZXRWYWx2ZXMoKTsKKyAgICAgICAgICAgIGlmICh2YWx2ZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsdmVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiICAiICsgdmFsdmVzW2ldLmdldEluZm8oKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9nLmRlYnVnKCI9PT09PT09PT09PT09PT09PT09PT09Iik7CisgICAgICAgIH0KKworICAgICAgICAvLyBNYWtlIG91ciBhcHBsaWNhdGlvbiBhdmFpbGFibGUgaWYgbm8gcHJvYmxlbXMgd2VyZSBlbmNvdW50ZXJlZAorICAgICAgICBpZiAob2spCisgICAgICAgICAgICBjb250ZXh0LnNldENvbmZpZ3VyZWQodHJ1ZSk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgbG9nLmVycm9yKHNtLmdldFN0cmluZygiY29udGV4dENvbmZpZy51bmF2YWlsYWJsZSIpKTsKKyAgICAgICAgICAgIGNvbnRleHQuc2V0Q29uZmlndXJlZChmYWxzZSk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUHJvY2VzcyBhICJzdG9wIiBldmVudCBmb3IgdGhpcyBDb250ZXh0LgorICAgICAqLworICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBzdG9wKCkgeworCisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZyhzbS5nZXRTdHJpbmcoImNvbnRleHRDb25maWcuc3RvcCIpKTsKKworICAgICAgICBpbnQgaTsKKworICAgICAgICAvLyBSZW1vdmluZyBjaGlsZHJlbgorICAgICAgICBDb250YWluZXJbXSBjaGlsZHJlbiA9IGNvbnRleHQuZmluZENoaWxkcmVuKCk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgY29udGV4dC5yZW1vdmVDaGlsZChjaGlsZHJlbltpXSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZW1vdmluZyBhcHBsaWNhdGlvbiBwYXJhbWV0ZXJzCisgICAgICAgIC8qCisgICAgICAgIEFwcGxpY2F0aW9uUGFyYW1ldGVyW10gYXBwbGljYXRpb25QYXJhbWV0ZXJzID0KKyAgICAgICAgICAgIGNvbnRleHQuZmluZEFwcGxpY2F0aW9uUGFyYW1ldGVycygpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXBwbGljYXRpb25QYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBjb250ZXh0LnJlbW92ZUFwcGxpY2F0aW9uUGFyYW1ldGVyCisgICAgICAgICAgICAgICAgKGFwcGxpY2F0aW9uUGFyYW1ldGVyc1tpXS5nZXROYW1lKCkpOworICAgICAgICB9CisgICAgICAgICovCisKKyAgICAgICAgLy8gUmVtb3Zpbmcgc2VjdXJpdHkgY29uc3RyYWludHMKKyAgICAgICAgU2VjdXJpdHlDb25zdHJhaW50W10gc2VjdXJpdHlDb25zdHJhaW50cyA9IGNvbnRleHQuZmluZENvbnN0cmFpbnRzKCk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzZWN1cml0eUNvbnN0cmFpbnRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBjb250ZXh0LnJlbW92ZUNvbnN0cmFpbnQoc2VjdXJpdHlDb25zdHJhaW50c1tpXSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZW1vdmluZyBFamJzCisgICAgICAgIC8qCisgICAgICAgIENvbnRleHRFamJbXSBjb250ZXh0RWpicyA9IGNvbnRleHQuZmluZEVqYnMoKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvbnRleHRFamJzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBjb250ZXh0LnJlbW92ZUVqYihjb250ZXh0RWpic1tpXS5nZXROYW1lKCkpOworICAgICAgICB9CisgICAgICAgICovCisKKyAgICAgICAgLy8gUmVtb3ZpbmcgZW52aXJvbm1lbnRzCisgICAgICAgIC8qCisgICAgICAgIENvbnRleHRFbnZpcm9ubWVudFtdIGNvbnRleHRFbnZpcm9ubWVudHMgPSBjb250ZXh0LmZpbmRFbnZpcm9ubWVudHMoKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvbnRleHRFbnZpcm9ubWVudHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGNvbnRleHQucmVtb3ZlRW52aXJvbm1lbnQoY29udGV4dEVudmlyb25tZW50c1tpXS5nZXROYW1lKCkpOworICAgICAgICB9CisgICAgICAgICovCisKKyAgICAgICAgLy8gUmVtb3ZpbmcgZXJyb3JzIHBhZ2VzCisgICAgICAgIEVycm9yUGFnZVtdIGVycm9yUGFnZXMgPSBjb250ZXh0LmZpbmRFcnJvclBhZ2VzKCk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBlcnJvclBhZ2VzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBjb250ZXh0LnJlbW92ZUVycm9yUGFnZShlcnJvclBhZ2VzW2ldKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlbW92aW5nIGZpbHRlciBkZWZzCisgICAgICAgIEZpbHRlckRlZltdIGZpbHRlckRlZnMgPSBjb250ZXh0LmZpbmRGaWx0ZXJEZWZzKCk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBmaWx0ZXJEZWZzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBjb250ZXh0LnJlbW92ZUZpbHRlckRlZihmaWx0ZXJEZWZzW2ldKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlbW92aW5nIGZpbHRlciBtYXBzCisgICAgICAgIEZpbHRlck1hcFtdIGZpbHRlck1hcHMgPSBjb250ZXh0LmZpbmRGaWx0ZXJNYXBzKCk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBmaWx0ZXJNYXBzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBjb250ZXh0LnJlbW92ZUZpbHRlck1hcChmaWx0ZXJNYXBzW2ldKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlbW92aW5nIGxvY2FsIGVqYnMKKyAgICAgICAgLyoKKyAgICAgICAgQ29udGV4dExvY2FsRWpiW10gY29udGV4dExvY2FsRWpicyA9IGNvbnRleHQuZmluZExvY2FsRWpicygpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29udGV4dExvY2FsRWpicy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgY29udGV4dC5yZW1vdmVMb2NhbEVqYihjb250ZXh0TG9jYWxFamJzW2ldLmdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgKi8KKworICAgICAgICAvLyBSZW1vdmluZyBNaW1lIG1hcHBpbmdzCisgICAgICAgIFN0cmluZ1tdIG1pbWVNYXBwaW5ncyA9IGNvbnRleHQuZmluZE1pbWVNYXBwaW5ncygpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbWltZU1hcHBpbmdzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBjb250ZXh0LnJlbW92ZU1pbWVNYXBwaW5nKG1pbWVNYXBwaW5nc1tpXSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZW1vdmluZyBwYXJhbWV0ZXJzCisgICAgICAgIFN0cmluZ1tdIHBhcmFtZXRlcnMgPSBjb250ZXh0LmZpbmRQYXJhbWV0ZXJzKCk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBjb250ZXh0LnJlbW92ZVBhcmFtZXRlcihwYXJhbWV0ZXJzW2ldKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlbW92aW5nIHJlc291cmNlIGVudiByZWZzCisgICAgICAgIC8qCisgICAgICAgIFN0cmluZ1tdIHJlc291cmNlRW52UmVmcyA9IGNvbnRleHQuZmluZFJlc291cmNlRW52UmVmcygpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcmVzb3VyY2VFbnZSZWZzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBjb250ZXh0LnJlbW92ZVJlc291cmNlRW52UmVmKHJlc291cmNlRW52UmVmc1tpXSk7CisgICAgICAgIH0KKyAgICAgICAgKi8KKworICAgICAgICAvLyBSZW1vdmluZyByZXNvdXJjZSBsaW5rcworICAgICAgICAvKgorICAgICAgICBDb250ZXh0UmVzb3VyY2VMaW5rW10gY29udGV4dFJlc291cmNlTGlua3MgPQorICAgICAgICAgICAgY29udGV4dC5maW5kUmVzb3VyY2VMaW5rcygpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29udGV4dFJlc291cmNlTGlua3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGNvbnRleHQucmVtb3ZlUmVzb3VyY2VMaW5rKGNvbnRleHRSZXNvdXJjZUxpbmtzW2ldLmdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgKi8KKworICAgICAgICAvLyBSZW1vdmluZyByZXNvdXJjZXMKKyAgICAgICAgLyoKKyAgICAgICAgQ29udGV4dFJlc291cmNlW10gY29udGV4dFJlc291cmNlcyA9IGNvbnRleHQuZmluZFJlc291cmNlcygpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29udGV4dFJlc291cmNlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgY29udGV4dC5yZW1vdmVSZXNvdXJjZShjb250ZXh0UmVzb3VyY2VzW2ldLmdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgKi8KKworICAgICAgICAvLyBSZW1vdmluZyBzZXJjdXJpdHkgcm9sZQorICAgICAgICBTdHJpbmdbXSBzZWN1cml0eVJvbGVzID0gY29udGV4dC5maW5kU2VjdXJpdHlSb2xlcygpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2VjdXJpdHlSb2xlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgY29udGV4dC5yZW1vdmVTZWN1cml0eVJvbGUoc2VjdXJpdHlSb2xlc1tpXSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZW1vdmluZyBzZXJ2bGV0IG1hcHBpbmdzCisgICAgICAgIFN0cmluZ1tdIHNlcnZsZXRNYXBwaW5ncyA9IGNvbnRleHQuZmluZFNlcnZsZXRNYXBwaW5ncygpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2VydmxldE1hcHBpbmdzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBjb250ZXh0LnJlbW92ZVNlcnZsZXRNYXBwaW5nKHNlcnZsZXRNYXBwaW5nc1tpXSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBGSVhNRSA6IFJlbW92aW5nIHN0YXR1cyBwYWdlcworCisgICAgICAgIC8vIFJlbW92aW5nIHRhZ2xpYnMKKyAgICAgICAgU3RyaW5nW10gdGFnbGlicyA9IGNvbnRleHQuZmluZFRhZ2xpYnMoKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHRhZ2xpYnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGNvbnRleHQucmVtb3ZlVGFnbGliKHRhZ2xpYnNbaV0pOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmVtb3Zpbmcgd2VsY29tZSBmaWxlcworICAgICAgICBTdHJpbmdbXSB3ZWxjb21lRmlsZXMgPSBjb250ZXh0LmZpbmRXZWxjb21lRmlsZXMoKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHdlbGNvbWVGaWxlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgY29udGV4dC5yZW1vdmVXZWxjb21lRmlsZSh3ZWxjb21lRmlsZXNbaV0pOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmVtb3Zpbmcgd3JhcHBlciBsaWZlY3ljbGVzCisgICAgICAgIFN0cmluZ1tdIHdyYXBwZXJMaWZlY3ljbGVzID0gY29udGV4dC5maW5kV3JhcHBlckxpZmVjeWNsZXMoKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHdyYXBwZXJMaWZlY3ljbGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBjb250ZXh0LnJlbW92ZVdyYXBwZXJMaWZlY3ljbGUod3JhcHBlckxpZmVjeWNsZXNbaV0pOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmVtb3Zpbmcgd3JhcHBlciBsaXN0ZW5lcnMKKyAgICAgICAgU3RyaW5nW10gd3JhcHBlckxpc3RlbmVycyA9IGNvbnRleHQuZmluZFdyYXBwZXJMaXN0ZW5lcnMoKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHdyYXBwZXJMaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGNvbnRleHQucmVtb3ZlV3JhcHBlckxpc3RlbmVyKHdyYXBwZXJMaXN0ZW5lcnNbaV0pOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmVtb3ZlIChwYXJ0aWFsbHkpIGZvbGRlcnMgYW5kIGZpbGVzIGNyZWF0ZWQgYnkgYW50aUxvY2tpbmcKKyAgICAgICAgSG9zdCBob3N0ID0gKEhvc3QpIGNvbnRleHQuZ2V0UGFyZW50KCk7CisgICAgICAgIFN0cmluZyBhcHBCYXNlID0gaG9zdC5nZXRBcHBCYXNlKCk7CisgICAgICAgIFN0cmluZyBkb2NCYXNlID0gY29udGV4dC5nZXREb2NCYXNlKCk7CisgICAgICAgIGlmICgoZG9jQmFzZSAhPSBudWxsKSAmJiAob3JpZ2luYWxEb2NCYXNlICE9IG51bGwpKSB7CisgICAgICAgICAgICBGaWxlIGRvY0Jhc2VGaWxlID0gbmV3IEZpbGUoZG9jQmFzZSk7CisgICAgICAgICAgICBpZiAoIWRvY0Jhc2VGaWxlLmlzQWJzb2x1dGUoKSkgeworICAgICAgICAgICAgICAgIGRvY0Jhc2VGaWxlID0gbmV3IEZpbGUoYXBwQmFzZSwgZG9jQmFzZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBFeHBhbmRXYXIuZGVsZXRlKGRvY0Jhc2VGaWxlKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgb2sgPSB0cnVlOworCisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFByb2Nlc3MgYSAiZGVzdHJveSIgZXZlbnQgZm9yIHRoaXMgQ29udGV4dC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgZGVzdHJveSgpIHsKKyAgICAgICAgLy8gQ2FsbGVkIGZyb20gU3RhbmRhcmRDb250ZXh0LmRlc3Ryb3koKQorICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoc20uZ2V0U3RyaW5nKCJjb250ZXh0Q29uZmlnLmRlc3Ryb3kiKSk7CisgICAgICAgIFN0cmluZyB3b3JrRGlyID0gKChTdGFuZGFyZENvbnRleHQpIGNvbnRleHQpLmdldFdvcmtEaXIoKTsKKyAgICAgICAgaWYgKHdvcmtEaXIgIT0gbnVsbCkKKyAgICAgICAgICAgIEV4cGFuZFdhci5kZWxldGUobmV3IEZpbGUod29ya0RpcikpOworICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBWYWxpZGF0ZSB0aGUgdXNhZ2Ugb2Ygc2VjdXJpdHkgcm9sZSBuYW1lcyBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uCisgICAgICogZGVwbG95bWVudCBkZXNjcmlwdG9yLiAgSWYgYW55IHByb2JsZW1zIGFyZSBmb3VuZCwgaXNzdWUgd2FybmluZworICAgICAqIG1lc3NhZ2VzIChmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkpIGFuZCBhZGQgdGhlIG1pc3Npbmcgcm9sZXMuCisgICAgICogKFRvIG1ha2UgdGhlc2UgcHJvYmxlbXMgZmF0YWwgaW5zdGVhZCwgc2ltcGx5IHNldCB0aGUgPGNvZGU+b2s8L2NvZGU+CisgICAgICogaW5zdGFuY2UgdmFyaWFibGUgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+IGFzIHdlbGwpLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlU2VjdXJpdHlSb2xlcygpIHsKKworICAgICAgICAvLyBDaGVjayByb2xlIG5hbWVzIHVzZWQgaW4gPHNlY3VyaXR5LWNvbnN0cmFpbnQ+IGVsZW1lbnRzCisgICAgICAgIFNlY3VyaXR5Q29uc3RyYWludCBjb25zdHJhaW50c1tdID0gY29udGV4dC5maW5kQ29uc3RyYWludHMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb25zdHJhaW50cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgU3RyaW5nIHJvbGVzW10gPSBjb25zdHJhaW50c1tpXS5maW5kQXV0aFJvbGVzKCk7CisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHJvbGVzLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgaWYgKCEiKiIuZXF1YWxzKHJvbGVzW2pdKSAmJgorICAgICAgICAgICAgICAgICAgICAhY29udGV4dC5maW5kU2VjdXJpdHlSb2xlKHJvbGVzW2pdKSkgeworICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbyhzbS5nZXRTdHJpbmcoImNvbnRleHRDb25maWcucm9sZS5hdXRoIiwgcm9sZXNbal0pKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dC5hZGRTZWN1cml0eVJvbGUocm9sZXNbal0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIENoZWNrIHJvbGUgbmFtZXMgdXNlZCBpbiA8c2VydmxldD4gZWxlbWVudHMKKyAgICAgICAgQ29udGFpbmVyIHdyYXBwZXJzW10gPSBjb250ZXh0LmZpbmRDaGlsZHJlbigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHdyYXBwZXJzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBXcmFwcGVyIHdyYXBwZXIgPSAoV3JhcHBlcikgd3JhcHBlcnNbaV07CisgICAgICAgICAgICBTdHJpbmcgcnVuQXMgPSB3cmFwcGVyLmdldFJ1bkFzKCk7CisgICAgICAgICAgICBpZiAoKHJ1bkFzICE9IG51bGwpICYmICFjb250ZXh0LmZpbmRTZWN1cml0eVJvbGUocnVuQXMpKSB7CisgICAgICAgICAgICAgICAgbG9nLmluZm8oc20uZ2V0U3RyaW5nKCJjb250ZXh0Q29uZmlnLnJvbGUucnVuYXMiLCBydW5BcykpOworICAgICAgICAgICAgICAgIGNvbnRleHQuYWRkU2VjdXJpdHlSb2xlKHJ1bkFzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0cmluZyBuYW1lc1tdID0gd3JhcHBlci5maW5kU2VjdXJpdHlSZWZlcmVuY2VzKCk7CisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG5hbWVzLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGxpbmsgPSB3cmFwcGVyLmZpbmRTZWN1cml0eVJlZmVyZW5jZShuYW1lc1tqXSk7CisgICAgICAgICAgICAgICAgaWYgKChsaW5rICE9IG51bGwpICYmICFjb250ZXh0LmZpbmRTZWN1cml0eVJvbGUobGluaykpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oc20uZ2V0U3RyaW5nKCJjb250ZXh0Q29uZmlnLnJvbGUubGluayIsIGxpbmspKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dC5hZGRTZWN1cml0eVJvbGUobGluayk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdldCBjb25maWcgYmFzZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRmlsZSBnZXRDb25maWdCYXNlKCkgeworICAgICAgICBGaWxlIGNvbmZpZ0Jhc2UgPSAKKyAgICAgICAgICAgIG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2F0YWxpbmEuYmFzZSIpLCAiY29uZiIpOworICAgICAgICBpZiAoIWNvbmZpZ0Jhc2UuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIENvbnRhaW5lciBjb250YWluZXIgPSBjb250ZXh0OworICAgICAgICBDb250YWluZXIgaG9zdCA9IG51bGw7CisgICAgICAgIENvbnRhaW5lciBlbmdpbmUgPSBudWxsOworICAgICAgICB3aGlsZSAoY29udGFpbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChjb250YWluZXIgaW5zdGFuY2VvZiBIb3N0KQorICAgICAgICAgICAgICAgIGhvc3QgPSBjb250YWluZXI7CisgICAgICAgICAgICBpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgRW5naW5lKQorICAgICAgICAgICAgICAgIGVuZ2luZSA9IGNvbnRhaW5lcjsKKyAgICAgICAgICAgIGNvbnRhaW5lciA9IGNvbnRhaW5lci5nZXRQYXJlbnQoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZW5naW5lICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNvbmZpZ0Jhc2UgPSBuZXcgRmlsZShjb25maWdCYXNlLCBlbmdpbmUuZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaG9zdCAhPSBudWxsKSB7CisgICAgICAgICAgICBjb25maWdCYXNlID0gbmV3IEZpbGUoY29uZmlnQmFzZSwgaG9zdC5nZXROYW1lKCkpOworICAgICAgICB9CisgICAgICAgIGNvbmZpZ0Jhc2UubWtkaXJzKCk7CisgICAgICAgIHJldHVybiBjb25maWdCYXNlOworICAgIH0KKworCisgICAgcHJvdGVjdGVkIGNsYXNzIENvbnRleHRFcnJvckhhbmRsZXIKKyAgICAgICAgaW1wbGVtZW50cyBFcnJvckhhbmRsZXIgeworCisgICAgICAgIHB1YmxpYyB2b2lkIGVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworICAgICAgICAgICAgcGFyc2VFeGNlcHRpb24gPSBleGNlcHRpb247CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBmYXRhbEVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworICAgICAgICAgICAgcGFyc2VFeGNlcHRpb24gPSBleGNlcHRpb247CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB3YXJuaW5nKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworICAgICAgICAgICAgcGFyc2VFeGNlcHRpb24gPSBleGNlcHRpb247CisgICAgICAgIH0KKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9Db250ZXh0UnVsZVNldC5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvQ29udGV4dFJ1bGVTZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjNkYzdlCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvQ29udGV4dFJ1bGVTZXQuamF2YQpAQCAtMCwwICsxLDI4NyBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LTIwMDEsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0YXJ0dXA7CisKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Db250YWluZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Mb2FkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5kaWdlc3Rlci5EaWdlc3RlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvbWNhdC51dGlsLmRpZ2VzdGVyLlJ1bGU7CitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5kaWdlc3Rlci5SdWxlU2V0QmFzZTsKK2ltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOworCisKKy8qKgorICogPHA+PHN0cm9uZz5SdWxlU2V0PC9zdHJvbmc+IGZvciBwcm9jZXNzaW5nIHRoZSBjb250ZW50cyBvZiBhCisgKiBDb250ZXh0IG9yIERlZmF1bHRDb250ZXh0IGRlZmluaXRpb24gZWxlbWVudC4gIFRvIGVuYWJsZSBwYXJzaW5nIG9mIGEKKyAqIERlZmF1bHRDb250ZXh0LCBiZSBzdXJlIHRvIHNwZWNpZnkgYSBwcmVmaXggdGhhdCBlbmRzIHdpdGggIi9EZWZhdWx0Ii48L3A+CisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBDb250ZXh0UnVsZVNldCBleHRlbmRzIFJ1bGVTZXRCYXNlIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBtYXRjaGluZyBwYXR0ZXJuIHByZWZpeCB0byB1c2UgZm9yIHJlY29nbml6aW5nIG91ciBlbGVtZW50cy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHByZWZpeCA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFNob3VsZCB0aGUgY29udGV4dCBiZSBjcmVhdGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGNyZWF0ZSA9IHRydWU7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcgorCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYW4gaW5zdGFuY2Ugb2YgdGhpcyA8Y29kZT5SdWxlU2V0PC9jb2RlPiB3aXRoIHRoZSBkZWZhdWx0CisgICAgICogbWF0Y2hpbmcgcGF0dGVybiBwcmVmaXguCisgICAgICovCisgICAgcHVibGljIENvbnRleHRSdWxlU2V0KCkgeworCisgICAgICAgIHRoaXMoIiIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYW4gaW5zdGFuY2Ugb2YgdGhpcyA8Y29kZT5SdWxlU2V0PC9jb2RlPiB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBtYXRjaGluZyBwYXR0ZXJuIHByZWZpeC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcmVmaXggUHJlZml4IGZvciBtYXRjaGluZyBwYXR0ZXJuIHJ1bGVzIChpbmNsdWRpbmcgdGhlCisgICAgICogIHRyYWlsaW5nIHNsYXNoIGNoYXJhY3RlcikKKyAgICAgKi8KKyAgICBwdWJsaWMgQ29udGV4dFJ1bGVTZXQoU3RyaW5nIHByZWZpeCkgeworCisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIHRoaXMubmFtZXNwYWNlVVJJID0gbnVsbDsKKyAgICAgICAgdGhpcy5wcmVmaXggPSBwcmVmaXg7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhbiBpbnN0YW5jZSBvZiB0aGlzIDxjb2RlPlJ1bGVTZXQ8L2NvZGU+IHdpdGggdGhlIHNwZWNpZmllZAorICAgICAqIG1hdGNoaW5nIHBhdHRlcm4gcHJlZml4LgorICAgICAqCisgICAgICogQHBhcmFtIHByZWZpeCBQcmVmaXggZm9yIG1hdGNoaW5nIHBhdHRlcm4gcnVsZXMgKGluY2x1ZGluZyB0aGUKKyAgICAgKiAgdHJhaWxpbmcgc2xhc2ggY2hhcmFjdGVyKQorICAgICAqLworICAgIHB1YmxpYyBDb250ZXh0UnVsZVNldChTdHJpbmcgcHJlZml4LCBib29sZWFuIGNyZWF0ZSkgeworCisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIHRoaXMubmFtZXNwYWNlVVJJID0gbnVsbDsKKyAgICAgICAgdGhpcy5wcmVmaXggPSBwcmVmaXg7CisgICAgICAgIHRoaXMuY3JlYXRlID0gY3JlYXRlOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogPHA+QWRkIHRoZSBzZXQgb2YgUnVsZSBpbnN0YW5jZXMgZGVmaW5lZCBpbiB0aGlzIFJ1bGVTZXQgdG8gdGhlCisgICAgICogc3BlY2lmaWVkIDxjb2RlPkRpZ2VzdGVyPC9jb2RlPiBpbnN0YW5jZSwgYXNzb2NpYXRpbmcgdGhlbSB3aXRoCisgICAgICogb3VyIG5hbWVzcGFjZSBVUkkgKGlmIGFueSkuICBUaGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSBjYWxsZWQKKyAgICAgKiBieSBhIERpZ2VzdGVyIGluc3RhbmNlLjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkaWdlc3RlciBEaWdlc3RlciBpbnN0YW5jZSB0byB3aGljaCB0aGUgbmV3IFJ1bGUgaW5zdGFuY2VzCisgICAgICogIHNob3VsZCBiZSBhZGRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRSdWxlSW5zdGFuY2VzKERpZ2VzdGVyIGRpZ2VzdGVyKSB7CisKKyAgICAgICAgaWYgKGNyZWF0ZSkgeworICAgICAgICAgICAgZGlnZXN0ZXIuYWRkT2JqZWN0Q3JlYXRlKHByZWZpeCArICJDb250ZXh0IiwKKyAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZENvbnRleHQiLCAiY2xhc3NOYW1lIik7CisgICAgICAgICAgICBkaWdlc3Rlci5hZGRTZXRQcm9wZXJ0aWVzKHByZWZpeCArICJDb250ZXh0Iik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkaWdlc3Rlci5hZGRSdWxlKHByZWZpeCArICJDb250ZXh0IiwgbmV3IFNldENvbnRleHRQcm9wZXJ0aWVzUnVsZSgpKTsKKyAgICAgICAgfQorICAgICAgICBkaWdlc3Rlci5hZGRSdWxlKHByZWZpeCArICJDb250ZXh0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ29weVBhcmVudENsYXNzTG9hZGVyUnVsZSgpKTsKKyAgICAgICAgaWYgKGNyZWF0ZSkgeworICAgICAgICAgICAgZGlnZXN0ZXIuYWRkUnVsZShwcmVmaXggKyAiQ29udGV4dCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBMaWZlY3ljbGVMaXN0ZW5lclJ1bGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgib3JnLmFwYWNoZS5jYXRhbGluYS5zdGFydHVwLkNvbnRleHRDb25maWciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb25maWdDbGFzcyIpKTsKKyAgICAgICAgICAgIGRpZ2VzdGVyLmFkZFNldE5leHQocHJlZml4ICsgIkNvbnRleHQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWRkQ2hpbGQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5Db250YWluZXIiKTsKKyAgICAgICAgfQorICAgICAgICBkaWdlc3Rlci5hZGRDYWxsTWV0aG9kKHByZWZpeCArICJDb250ZXh0L0luc3RhbmNlTGlzdGVuZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZGRJbnN0YW5jZUxpc3RlbmVyIiwgMCk7CisKKyAgICAgICAgZGlnZXN0ZXIuYWRkT2JqZWN0Q3JlYXRlKHByZWZpeCArICJDb250ZXh0L0xpc3RlbmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIC8vIE1VU1QgYmUgc3BlY2lmaWVkIGluIHRoZSBlbGVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2xhc3NOYW1lIik7CisgICAgICAgIGRpZ2VzdGVyLmFkZFNldFByb3BlcnRpZXMocHJlZml4ICsgIkNvbnRleHQvTGlzdGVuZXIiKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkU2V0TmV4dChwcmVmaXggKyAiQ29udGV4dC9MaXN0ZW5lciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkZExpZmVjeWNsZUxpc3RlbmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVMaXN0ZW5lciIpOworCisgICAgICAgIGRpZ2VzdGVyLmFkZFJ1bGUocHJlZml4ICsgIkNvbnRleHQvTG9hZGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ3JlYXRlTG9hZGVyUnVsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIm9yZy5hcGFjaGUuY2F0YWxpbmEubG9hZGVyLldlYmFwcExvYWRlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2xhc3NOYW1lIikpOworICAgICAgICBkaWdlc3Rlci5hZGRTZXRQcm9wZXJ0aWVzKHByZWZpeCArICJDb250ZXh0L0xvYWRlciIpOworICAgICAgICBkaWdlc3Rlci5hZGRTZXROZXh0KHByZWZpeCArICJDb250ZXh0L0xvYWRlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldExvYWRlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuTG9hZGVyIik7CisKKyAgICAgICAgZGlnZXN0ZXIuYWRkT2JqZWN0Q3JlYXRlKHByZWZpeCArICJDb250ZXh0L01hbmFnZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuc2Vzc2lvbi5TdGFuZGFyZE1hbmFnZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNsYXNzTmFtZSIpOworICAgICAgICBkaWdlc3Rlci5hZGRTZXRQcm9wZXJ0aWVzKHByZWZpeCArICJDb250ZXh0L01hbmFnZXIiKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkU2V0TmV4dChwcmVmaXggKyAiQ29udGV4dC9NYW5hZ2VyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0TWFuYWdlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuTWFuYWdlciIpOworCisgICAgICAgIGRpZ2VzdGVyLmFkZE9iamVjdENyZWF0ZShwcmVmaXggKyAiQ29udGV4dC9NYW5hZ2VyL1N0b3JlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIC8vIE1VU1QgYmUgc3BlY2lmaWVkIGluIHRoZSBlbGVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2xhc3NOYW1lIik7CisgICAgICAgIGRpZ2VzdGVyLmFkZFNldFByb3BlcnRpZXMocHJlZml4ICsgIkNvbnRleHQvTWFuYWdlci9TdG9yZSIpOworICAgICAgICBkaWdlc3Rlci5hZGRTZXROZXh0KHByZWZpeCArICJDb250ZXh0L01hbmFnZXIvU3RvcmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXRTdG9yZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuU3RvcmUiKTsKKworICAgICAgICBkaWdlc3Rlci5hZGRPYmplY3RDcmVhdGUocHJlZml4ICsgIkNvbnRleHQvUGFyYW1ldGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5BcHBsaWNhdGlvblBhcmFtZXRlciIpOworICAgICAgICBkaWdlc3Rlci5hZGRTZXRQcm9wZXJ0aWVzKHByZWZpeCArICJDb250ZXh0L1BhcmFtZXRlciIpOworICAgICAgICBkaWdlc3Rlci5hZGRTZXROZXh0KHByZWZpeCArICJDb250ZXh0L1BhcmFtZXRlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkZEFwcGxpY2F0aW9uUGFyYW1ldGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuQXBwbGljYXRpb25QYXJhbWV0ZXIiKTsKKworICAgICAgICBkaWdlc3Rlci5hZGRPYmplY3RDcmVhdGUocHJlZml4ICsgIkNvbnRleHQvUmVhbG0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgLy8gTVVTVCBiZSBzcGVjaWZpZWQgaW4gdGhlIGVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjbGFzc05hbWUiKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkU2V0UHJvcGVydGllcyhwcmVmaXggKyAiQ29udGV4dC9SZWFsbSIpOworICAgICAgICBkaWdlc3Rlci5hZGRTZXROZXh0KHByZWZpeCArICJDb250ZXh0L1JlYWxtIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0UmVhbG0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLlJlYWxtIik7CisKKyAgICAgICAgZGlnZXN0ZXIuYWRkT2JqZWN0Q3JlYXRlKHByZWZpeCArICJDb250ZXh0L1Jlc291cmNlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5uYW1pbmcucmVzb3VyY2VzLkZpbGVEaXJDb250ZXh0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjbGFzc05hbWUiKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkU2V0UHJvcGVydGllcyhwcmVmaXggKyAiQ29udGV4dC9SZXNvdXJjZXMiKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkU2V0TmV4dChwcmVmaXggKyAiQ29udGV4dC9SZXNvdXJjZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXRSZXNvdXJjZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJqYXZheC5uYW1pbmcuZGlyZWN0b3J5LkRpckNvbnRleHQiKTsKKworICAgICAgICBkaWdlc3Rlci5hZGRPYmplY3RDcmVhdGUocHJlZml4ICsgIkNvbnRleHQvUmVzb3VyY2VMaW5rIiwKKyAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuQ29udGV4dFJlc291cmNlTGluayIpOworICAgICAgICBkaWdlc3Rlci5hZGRTZXRQcm9wZXJ0aWVzKHByZWZpeCArICJDb250ZXh0L1Jlc291cmNlTGluayIpOworICAgICAgICBkaWdlc3Rlci5hZGRSdWxlKHByZWZpeCArICJDb250ZXh0L1Jlc291cmNlTGluayIsCisgICAgICAgICAgICAgICAgbmV3IFNldE5leHROYW1pbmdSdWxlKCJhZGRSZXNvdXJjZUxpbmsiLAorICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkNvbnRleHRSZXNvdXJjZUxpbmsiKSk7CisKKyAgICAgICAgZGlnZXN0ZXIuYWRkT2JqZWN0Q3JlYXRlKHByZWZpeCArICJDb250ZXh0L1ZhbHZlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIC8vIE1VU1QgYmUgc3BlY2lmaWVkIGluIHRoZSBlbGVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2xhc3NOYW1lIik7CisgICAgICAgIGRpZ2VzdGVyLmFkZFNldFByb3BlcnRpZXMocHJlZml4ICsgIkNvbnRleHQvVmFsdmUiKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkU2V0TmV4dChwcmVmaXggKyAiQ29udGV4dC9WYWx2ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkZFZhbHZlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5WYWx2ZSIpOworCisgICAgICAgIGRpZ2VzdGVyLmFkZENhbGxNZXRob2QocHJlZml4ICsgIkNvbnRleHQvV2F0Y2hlZFJlc291cmNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWRkV2F0Y2hlZFJlc291cmNlIiwgMCk7CisKKyAgICAgICAgZGlnZXN0ZXIuYWRkQ2FsbE1ldGhvZChwcmVmaXggKyAiQ29udGV4dC9XcmFwcGVyTGlmZWN5Y2xlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWRkV3JhcHBlckxpZmVjeWNsZSIsIDApOworCisgICAgICAgIGRpZ2VzdGVyLmFkZENhbGxNZXRob2QocHJlZml4ICsgIkNvbnRleHQvV3JhcHBlckxpc3RlbmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWRkV3JhcHBlckxpc3RlbmVyIiwgMCk7CisKKyAgICB9CisKK30KKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcml2YXRlIENsYXNzZXMKKworCisvKioKKyAqIFJ1bGUgdGhhdCBjcmVhdGVzIGEgbmV3IDxjb2RlPkxvYWRlcjwvY29kZT4gaW5zdGFuY2UsIHdpdGggdGhlIHBhcmVudAorICogY2xhc3MgbG9hZGVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgdG9wIG9iamVjdCBvbiB0aGUgc3RhY2sgKHdoaWNoIG11c3QgYmUKKyAqIGEgPGNvZGU+Q29udGFpbmVyPC9jb2RlPiksIGFuZCBwdXNoZXMgaXQgb24gdG8gdGhlIHN0YWNrLgorICovCisKK2ZpbmFsIGNsYXNzIENyZWF0ZUxvYWRlclJ1bGUgZXh0ZW5kcyBSdWxlIHsKKworICAgIHB1YmxpYyBDcmVhdGVMb2FkZXJSdWxlKFN0cmluZyBsb2FkZXJDbGFzcywgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKKworICAgICAgICB0aGlzLmxvYWRlckNsYXNzID0gbG9hZGVyQ2xhc3M7CisgICAgICAgIHRoaXMuYXR0cmlidXRlTmFtZSA9IGF0dHJpYnV0ZU5hbWU7CisKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBhdHRyaWJ1dGVOYW1lOworCisgICAgcHJpdmF0ZSBTdHJpbmcgbG9hZGVyQ2xhc3M7CisKKyAgICBwdWJsaWMgdm9pZCBiZWdpbihTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBMb29rIHVwIHRoZSByZXF1aXJlZCBwYXJlbnQgY2xhc3MgbG9hZGVyCisgICAgICAgIENsYXNzTG9hZGVyIHBhcmVudENsYXNzTG9hZGVyID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IG9qYiA9IGRpZ2VzdGVyLnBlZWsoKTsKKyAgICAgICAgaWYgKG9qYiBpbnN0YW5jZW9mIENvbnRhaW5lcikgeworICAgICAgICAgICAgcGFyZW50Q2xhc3NMb2FkZXIgPSAoKENvbnRhaW5lcilvamIpLmdldFBhcmVudENsYXNzTG9hZGVyKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBJbnN0YW50aWF0ZSBhIG5ldyBMb2FkZXIgaW1wbGVtZW50YXRpb24gb2JqZWN0CisgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBsb2FkZXJDbGFzczsKKyAgICAgICAgaWYgKGF0dHJpYnV0ZU5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gYXR0cmlidXRlcy5nZXRWYWx1ZShhdHRyaWJ1dGVOYW1lKTsKKyAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKQorICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9IHZhbHVlOworICAgICAgICB9CisgICAgICAgIENsYXNzIGNsYXp6ID0gQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUpOworICAgICAgICBDbGFzcyB0eXBlc1tdID0geyBDbGFzc0xvYWRlci5jbGFzcyB9OworICAgICAgICBPYmplY3QgYXJnc1tdID0geyBwYXJlbnRDbGFzc0xvYWRlciB9OworICAgICAgICBDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciA9IGNsYXp6LmdldERlY2xhcmVkQ29uc3RydWN0b3IodHlwZXMpOworICAgICAgICBMb2FkZXIgbG9hZGVyID0gKExvYWRlcikgY29uc3RydWN0b3IubmV3SW5zdGFuY2UoYXJncyk7CisKKyAgICAgICAgLy8gUHVzaCB0aGUgbmV3IGxvYWRlciBvbnRvIHRoZSBzdGFjaworICAgICAgICBkaWdlc3Rlci5wdXNoKGxvYWRlcik7CisgICAgICAgIGlmIChkaWdlc3Rlci5nZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgZGlnZXN0ZXIuZ2V0TG9nZ2VyKCkuZGVidWcoIm5ldyAiICsgbG9hZGVyLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGVuZChTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbmFtZSkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgTG9hZGVyIGxvYWRlciA9IChMb2FkZXIpIGRpZ2VzdGVyLnBvcCgpOworICAgICAgICBpZiAoZGlnZXN0ZXIuZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGRpZ2VzdGVyLmdldExvZ2dlcigpLmRlYnVnKCJwb3AgIiArIGxvYWRlci5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvQ29weVBhcmVudENsYXNzTG9hZGVyUnVsZS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvQ29weVBhcmVudENsYXNzTG9hZGVyUnVsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2YTMzYmIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9Db3B5UGFyZW50Q2xhc3NMb2FkZXJSdWxlLmphdmEKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LTIwMDEsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0YXJ0dXA7CisKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvbWNhdC51dGlsLmRpZ2VzdGVyLlJ1bGU7CitpbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKKworCisvKioKKyAqIDxwPlJ1bGUgdGhhdCBjb3BpZXMgdGhlIDxjb2RlPnBhcmVudENsYXNzTG9hZGVyPC9jb2RlPiBwcm9wZXJ0eSBmcm9tIHRoZQorICogbmV4dC10by10b3AgaXRlbSBvbiB0aGUgc3RhY2sgKHdoaWNoIG11c3QgYmUgYSA8Y29kZT5Db250YWluZXI8L2NvZGU+KQorICogdG8gdGhlIHRvcCBpdGVtIG9uIHRoZSBzdGFjayAod2hpY2ggbXVzdCBhbHNvIGJlIGEKKyAqIDxjb2RlPkNvbnRhaW5lcjwvY29kZT4pLjwvcD4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIENvcHlQYXJlbnRDbGFzc0xvYWRlclJ1bGUgZXh0ZW5kcyBSdWxlIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIFJ1bGUuCisgICAgICovCisgICAgcHVibGljIENvcHlQYXJlbnRDbGFzc0xvYWRlclJ1bGUoKSB7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogSGFuZGxlIHRoZSBiZWdpbm5pbmcgb2YgYW4gWE1MIGVsZW1lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXR0cmlidXRlcyBUaGUgYXR0cmlidXRlcyBvZiB0aGlzIGVsZW1lbnQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGEgcHJvY2Vzc2luZyBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBiZWdpbihTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAoZGlnZXN0ZXIuZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGRpZ2VzdGVyLmdldExvZ2dlcigpLmRlYnVnKCJDb3B5aW5nIHBhcmVudCBjbGFzcyBsb2FkZXIiKTsKKyAgICAgICAgQ29udGFpbmVyIGNoaWxkID0gKENvbnRhaW5lcikgZGlnZXN0ZXIucGVlaygwKTsKKyAgICAgICAgT2JqZWN0IHBhcmVudCA9IGRpZ2VzdGVyLnBlZWsoMSk7CisgICAgICAgIE1ldGhvZCBtZXRob2QgPQorICAgICAgICAgICAgcGFyZW50LmdldENsYXNzKCkuZ2V0TWV0aG9kKCJnZXRQYXJlbnRDbGFzc0xvYWRlciIsIG5ldyBDbGFzc1swXSk7CisgICAgICAgIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyID0KKyAgICAgICAgICAgIChDbGFzc0xvYWRlcikgbWV0aG9kLmludm9rZShwYXJlbnQsIG5ldyBPYmplY3RbMF0pOworICAgICAgICBjaGlsZC5zZXRQYXJlbnRDbGFzc0xvYWRlcihjbGFzc0xvYWRlcik7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvRGlnZXN0ZXJGYWN0b3J5LmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9EaWdlc3RlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDhkMTgyCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvRGlnZXN0ZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwxNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OS0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cDsKKworaW1wb3J0IGphdmEubmV0LlVSTDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5TY2hlbWFSZXNvbHZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvbWNhdC51dGlsLmRpZ2VzdGVyLkRpZ2VzdGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuZGlnZXN0ZXIuUnVsZVNldDsKKworLyoqCisgKiBXcmFwcGVyIGNsYXNzIGFyb3VuZCB0aGUgRGlnZXN0ZXIgdGhhdCBoaWRlIERpZ2VzdGVyJ3MgaW5pdGlhbGl6YXRpb24gZGV0YWlscworICoKKyAqIEBhdXRob3IgSmVhbi1GcmFuY29pcyBBcmNhbmQKKyAqLworcHVibGljIGNsYXNzIERpZ2VzdGVyRmFjdG9yeSB7CisgICAgLyoqCisgICAgICogVGhlIGxvZy4KKyAgICAgKi8KKyAgIHByb3RlY3RlZCBzdGF0aWMgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGxvZyA9IAorICAgICAgIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3RvcnkuZ2V0TG9nKERpZ2VzdGVyRmFjdG9yeS5jbGFzcyk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgWE1MIGVudGlyeSByZXNvbHZlciB1c2VkIGJ5IHRoZSBEaWdlc3Rlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBTY2hlbWFSZXNvbHZlciBzY2hlbWFSZXNvbHZlcjsKKworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgPGNvZGU+RGlnZXN0ZXI8L2NvZGU+IHBhcnNlciB3aXRoIG5vIDxjb2RlPlJ1bGU8L2NvZGU+CisgICAgICogYXNzb2NpYXRlZCBhbmQgWE1MIHZhbGlkYXRpb24gdHVybmVkIG9mZi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIERpZ2VzdGVyIG5ld0RpZ2VzdGVyKCl7CisgICAgICAgIHJldHVybiBuZXdEaWdlc3RlcihmYWxzZSwgZmFsc2UsIG51bGwpOworICAgIH0KKworICAgIAorICAgIC8qKgorICAgICAqIENyZWF0ZSBhIDxjb2RlPkRpZ2VzdGVyPC9jb2RlPiBwYXJzZXIgd2l0aCBYTUwgdmFsaWRhdGlvbiB0dXJuZWQgb2ZmLgorICAgICAqIEBwYXJhbSBydWxlIGFuIGluc3RhbmNlIG9mIDxjb2RlPlJ1bGVTZXQ8L2NvZGU+IHVzZWQgZm9yIHBhcnNpbmcgdGhlIHhtbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIERpZ2VzdGVyIG5ld0RpZ2VzdGVyKFJ1bGVTZXQgcnVsZSl7CisgICAgICAgIHJldHVybiBuZXdEaWdlc3RlcihmYWxzZSxmYWxzZSxydWxlKTsKKyAgICB9CisKKyAgICAKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSA8Y29kZT5EaWdlc3RlcjwvY29kZT4gcGFyc2VyLgorICAgICAqIEBwYXJhbSB4bWxWYWxpZGF0aW9uIHR1cm4gb24vb2ZmIHhtbCB2YWxpZGF0aW9uCisgICAgICogQHBhcmFtIHhtbE5hbWVzcGFjZUF3YXJlIHR1cm4gb24vb2ZmIG5hbWVzcGFjZSB2YWxpZGF0aW9uCisgICAgICogQHBhcmFtIHJ1bGUgYW4gaW5zdGFuY2Ugb2YgPGNvZGU+UnVsZVNldDwvY29kZT4gdXNlZCBmb3IgcGFyc2luZyB0aGUgeG1sLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgRGlnZXN0ZXIgbmV3RGlnZXN0ZXIoYm9vbGVhbiB4bWxWYWxpZGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB4bWxOYW1lc3BhY2VBd2FyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJ1bGVTZXQgcnVsZSkgeworICAgICAgICBEaWdlc3RlciBkaWdlc3RlciA9IG5ldyBEaWdlc3RlcigpOworICAgICAgICBkaWdlc3Rlci5zZXROYW1lc3BhY2VBd2FyZSh4bWxOYW1lc3BhY2VBd2FyZSk7CisgICAgICAgIGRpZ2VzdGVyLnNldFZhbGlkYXRpbmcoeG1sVmFsaWRhdGlvbik7CisgICAgICAgIGRpZ2VzdGVyLnNldFVzZUNvbnRleHRDbGFzc0xvYWRlcih0cnVlKTsKKworICAgICAgICBpZiAoeG1sVmFsaWRhdGlvbiB8fCB4bWxOYW1lc3BhY2VBd2FyZSl7CisgICAgICAgICAgICBjb25maWd1cmVTY2hlbWEoZGlnZXN0ZXIpOyAgICAgICAgCisgICAgICAgIH0KKworICAgICAgICBzY2hlbWFSZXNvbHZlciA9IG5ldyBTY2hlbWFSZXNvbHZlcihkaWdlc3Rlcik7CisgICAgICAgIHJlZ2lzdGVyTG9jYWxTY2hlbWEoKTsKKyAgICAgICAgCisgICAgICAgIGRpZ2VzdGVyLnNldEVudGl0eVJlc29sdmVyKHNjaGVtYVJlc29sdmVyKTsKKyAgICAgICAgaWYgKCBydWxlICE9IG51bGwgKSB7CisgICAgICAgICAgICBkaWdlc3Rlci5hZGRSdWxlU2V0KHJ1bGUpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIChkaWdlc3Rlcik7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBVdGlsaXRpZXMgdXNlZCB0byBmb3JjZSB0aGUgcGFyc2VyIHRvIHVzZSBsb2NhbCBzY2hlbWEsIHdoZW4gYXZhaWxhYmxlLAorICAgICAqIGluc3RlYWQgb2YgdGhlIDxjb2RlPnNjaGVtYUxvY2F0aW9uPC9jb2RlPiBYTUwgZWxlbWVudC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgcmVnaXN0ZXJMb2NhbFNjaGVtYSgpeworICAgICAgICAvLyBKMkVFCisgICAgICAgIHJlZ2lzdGVyKENvbnN0YW50cy5KMmVlU2NoZW1hUmVzb3VyY2VQYXRoXzE0LAorICAgICAgICAgICAgICAgICBDb25zdGFudHMuSjJlZVNjaGVtYVB1YmxpY0lkXzE0KTsKKyAgICAgICAgLy8gVzNDCisgICAgICAgIHJlZ2lzdGVyKENvbnN0YW50cy5XM2NTY2hlbWFSZXNvdXJjZVBhdGhfMTAsCisgICAgICAgICAgICAgICAgIENvbnN0YW50cy5XM2NTY2hlbWFQdWJsaWNJZF8xMCk7CisgICAgICAgIC8vIEpTUAorICAgICAgICByZWdpc3RlcihDb25zdGFudHMuSnNwU2NoZW1hUmVzb3VyY2VQYXRoXzIwLAorICAgICAgICAgICAgICAgICBDb25zdGFudHMuSnNwU2NoZW1hUHVibGljSWRfMjApOworICAgICAgICAvLyBUTEQKKyAgICAgICAgcmVnaXN0ZXIoQ29uc3RhbnRzLlRsZER0ZFJlc291cmNlUGF0aF8xMSwgIAorICAgICAgICAgICAgICAgICBDb25zdGFudHMuVGxkRHRkUHVibGljSWRfMTEpOworICAgICAgICAKKyAgICAgICAgcmVnaXN0ZXIoQ29uc3RhbnRzLlRsZER0ZFJlc291cmNlUGF0aF8xMiwKKyAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLlRsZER0ZFB1YmxpY0lkXzEyKTsKKworICAgICAgICByZWdpc3RlcihDb25zdGFudHMuVGxkU2NoZW1hUmVzb3VyY2VQYXRoXzIwLAorICAgICAgICAgICAgICAgICBDb25zdGFudHMuVGxkU2NoZW1hUHVibGljSWRfMjApOworCisgICAgICAgIC8vIHdlYi54bWwgICAgCisgICAgICAgIHJlZ2lzdGVyKENvbnN0YW50cy5XZWJEdGRSZXNvdXJjZVBhdGhfMjIsCisgICAgICAgICAgICAgICAgIENvbnN0YW50cy5XZWJEdGRQdWJsaWNJZF8yMik7CisKKyAgICAgICAgcmVnaXN0ZXIoQ29uc3RhbnRzLldlYkR0ZFJlc291cmNlUGF0aF8yMywKKyAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLldlYkR0ZFB1YmxpY0lkXzIzKTsKKworICAgICAgICByZWdpc3RlcihDb25zdGFudHMuV2ViU2NoZW1hUmVzb3VyY2VQYXRoXzI0LAorICAgICAgICAgICAgICAgICBDb25zdGFudHMuV2ViU2NoZW1hUHVibGljSWRfMjQpOworCisgICAgICAgIC8vIFdlYiBTZXJ2aWNlCisgICAgICAgIHJlZ2lzdGVyKENvbnN0YW50cy5KMmVlV2ViU2VydmljZVNjaGVtYVJlc291cmNlUGF0aF8xMSwKKyAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLkoyZWVXZWJTZXJ2aWNlU2NoZW1hUHVibGljSWRfMTEpOworCisgICAgICAgIHJlZ2lzdGVyKENvbnN0YW50cy5KMmVlV2ViU2VydmljZUNsaWVudFNjaGVtYVJlc291cmNlUGF0aF8xMSwKKyAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLkoyZWVXZWJTZXJ2aWNlQ2xpZW50U2NoZW1hUHVibGljSWRfMTEpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBMb2FkIHRoZSByZXNvdXJjZSBhbmQgYWRkIGl0IHRvIHRoZSByZXNvbHZlci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgcmVnaXN0ZXIoU3RyaW5nIHJlc291cmNlVVJMLCBTdHJpbmcgcmVzb3VyY2VQdWJsaWNJZCl7CisgICAgICAgIFVSTCB1cmwgPSBEaWdlc3RlckZhY3RvcnkuY2xhc3MuZ2V0UmVzb3VyY2UocmVzb3VyY2VVUkwpOworICAgCisgICAgICAgIGlmKHVybCA9PSBudWxsKSB7CisgICAgICAgICAgICBsb2cud2FybigiQ291bGQgbm90IGdldCB1cmwgZm9yICIgKyByZXNvdXJjZVVSTCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzY2hlbWFSZXNvbHZlci5yZWdpc3RlcihyZXNvdXJjZVB1YmxpY0lkICwgdXJsLnRvU3RyaW5nKCkgKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogVHVybiBvbiBEVEQgYW5kL29yIHZhbGlkYXRpb24gKGJhc2VkIG9uIHRoZSBwYXJzZXIgaW1wbGVtZW50YXRpb24pCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGNvbmZpZ3VyZVNjaGVtYShEaWdlc3RlciBkaWdlc3Rlcil7CisgICAgICAgIFVSTCB1cmwgPSBEaWdlc3RlckZhY3RvcnkuY2xhc3MKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRSZXNvdXJjZShDb25zdGFudHMuV2ViU2NoZW1hUmVzb3VyY2VQYXRoXzI0KTsKKyAgCisgICAgICAgIGlmKHVybCA9PSBudWxsKSB7CisgICAgICAgICAgICBsb2cuZXJyb3IoIkNvdWxkIG5vdCBnZXQgdXJsIGZvciAiIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgQ29uc3RhbnRzLldlYlNjaGVtYVJlc291cmNlUGF0aF8yNCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkaWdlc3Rlci5zZXRTY2hlbWEodXJsLnRvU3RyaW5nKCkpOyAgICAgCisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9FbWJlZGRlZC5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvRW1iZWRkZWQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODllMTg5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvRW1iZWRkZWQuamF2YQpAQCAtMCwwICsxLDk0NSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5zdGFydHVwOworCisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuQXV0aGVudGljYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5FbmdpbmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Ib3N0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Mb2FkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5SZWFsbTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlZhbHZlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLkNvbm5lY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRDb250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZEVuZ2luZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRIb3N0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZFNlcnZpY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5sb2FkZXIuV2ViYXBwTG9hZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuc2VjdXJpdHkuU2VjdXJpdHlDb25maWc7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLkxpZmVjeWNsZVN1cHBvcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLlN0cmluZ01hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5JbnRyb3NwZWN0aW9uVXRpbHM7CisKKworLyoqCisgKiBDb252ZW5pZW5jZSBjbGFzcyB0byBlbWJlZCBhIENhdGFsaW5hIHNlcnZsZXQgY29udGFpbmVyIGVudmlyb25tZW50CisgKiBpbnNpZGUgYW5vdGhlciBhcHBsaWNhdGlvbi4gIFlvdSBtdXN0IGNhbGwgdGhlIG1ldGhvZHMgb2YgdGhpcyBjbGFzcyBpbiB0aGUKKyAqIGZvbGxvd2luZyBvcmRlciB0byBlbnN1cmUgY29ycmVjdCBvcGVyYXRpb24uCisgKgorICogPHVsPgorICogPGxpPkluc3RhbnRpYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuPC9saT4KKyAqIDxsaT5TZXQgdGhlIHJlbGV2YW50IHByb3BlcnRpZXMgb2YgdGhpcyBvYmplY3QgaXRzZWxmLiAgSW4gcGFydGljdWxhciwKKyAqICAgICB5b3Ugd2lsbCB3YW50IHRvIGVzdGFibGlzaCB0aGUgZGVmYXVsdCBMb2dnZXIgdG8gYmUgdXNlZCwgYXMgd2VsbAorICogICAgIGFzIHRoZSBkZWZhdWx0IFJlYWxtIGlmIHlvdSBhcmUgdXNpbmcgY29udGFpbmVyLW1hbmFnZWQgc2VjdXJpdHkuPC9saT4KKyAqIDxsaT5DYWxsIDxjb2RlPmNyZWF0ZUVuZ2luZSgpPC9jb2RlPiB0byBjcmVhdGUgYW4gRW5naW5lIG9iamVjdCwgYW5kIHRoZW4KKyAqICAgICBjYWxsIGl0cyBwcm9wZXJ0eSBzZXR0ZXJzIGFzIGRlc2lyZWQuPC9saT4KKyAqIDxsaT5DYWxsIDxjb2RlPmNyZWF0ZUhvc3QoKTwvY29kZT4gdG8gY3JlYXRlIGF0IGxlYXN0IG9uZSB2aXJ0dWFsIEhvc3QKKyAqICAgICBhc3NvY2lhdGVkIHdpdGggdGhlIG5ld2x5IGNyZWF0ZWQgRW5naW5lLCBhbmQgdGhlbiBjYWxsIGl0cyBwcm9wZXJ0eQorICogICAgIHNldHRlcnMgYXMgZGVzaXJlZC4gIEFmdGVyIHlvdSBjdXN0b21pemUgdGhpcyBIb3N0LCBhZGQgaXQgdG8gdGhlCisgKiAgICAgY29ycmVzcG9uZGluZyBFbmdpbmUgd2l0aCA8Y29kZT5lbmdpbmUuYWRkQ2hpbGQoaG9zdCk8L2NvZGU+LjwvbGk+CisgKiA8bGk+Q2FsbCA8Y29kZT5jcmVhdGVDb250ZXh0KCk8L2NvZGU+IHRvIGNyZWF0ZSBhdCBsZWFzdCBvbmUgQ29udGV4dAorICogICAgIGFzc29jaWF0ZWQgd2l0aCBlYWNoIG5ld2x5IGNyZWF0ZWQgSG9zdCwgYW5kIHRoZW4gY2FsbCBpdHMgcHJvcGVydHkKKyAqICAgICBzZXR0ZXJzIGFzIGRlc2lyZWQuICBZb3UgPHN0cm9uZz5TSE9VTEQ8L3N0cm9uZz4gY3JlYXRlIGEgQ29udGV4dCB3aXRoCisgKiAgICAgYSBwYXRobmFtZSBlcXVhbCB0byBhIHplcm8tbGVuZ3RoIHN0cmluZywgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIHByb2Nlc3MKKyAqICAgICBhbGwgcmVxdWVzdHMgbm90IG1hcHBlZCB0byBzb21lIG90aGVyIENvbnRleHQuICBBZnRlciB5b3UgY3VzdG9taXplCisgKiAgICAgdGhpcyBDb250ZXh0LCBhZGQgaXQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgSG9zdCB3aXRoCisgKiAgICAgPGNvZGU+aG9zdC5hZGRDaGlsZChjb250ZXh0KTwvY29kZT4uPC9saT4KKyAqIDxsaT5DYWxsIDxjb2RlPmFkZEVuZ2luZSgpPC9jb2RlPiB0byBhdHRhY2ggdGhpcyBFbmdpbmUgdG8gdGhlIHNldCBvZgorICogICAgIGRlZmluZWQgRW5naW5lcyBmb3IgdGhpcyBvYmplY3QuPC9saT4KKyAqIDxsaT5DYWxsIDxjb2RlPmNyZWF0ZUNvbm5lY3RvcigpPC9jb2RlPiB0byBjcmVhdGUgYXQgbGVhc3Qgb25lIFRDUC9JUAorICogICAgIGNvbm5lY3RvciwgYW5kIHRoZW4gY2FsbCBpdHMgcHJvcGVydHkgc2V0dGVycyBhcyBkZXNpcmVkLjwvbGk+CisgKiA8bGk+Q2FsbCA8Y29kZT5hZGRDb25uZWN0b3IoKTwvY29kZT4gdG8gYXR0YWNoIHRoaXMgQ29ubmVjdG9yIHRvIHRoZSBzZXQKKyAqICAgICBvZiBkZWZpbmVkIENvbm5lY3RvcnMgZm9yIHRoaXMgb2JqZWN0LiAgVGhlIGFkZGVkIENvbm5lY3RvciB3aWxsIHVzZQorICogICAgIHRoZSBtb3N0IHJlY2VudGx5IGFkZGVkIEVuZ2luZSB0byBwcm9jZXNzIGl0cyByZWNlaXZlZCByZXF1ZXN0cy48L2xpPgorICogPGxpPlJlcGVhdCB0aGUgYWJvdmUgc2VyaWVzIG9mIHN0ZXBzIGFzIG9mdGVuIGFzIHJlcXVpcmVkIChhbHRob3VnaCB0aGVyZQorICogICAgIHdpbGwgdHlwaWNhbGx5IGJlIG9ubHkgb25lIEVuZ2luZSBpbnN0YW5jZSBjcmVhdGVkKS48L2xpPgorICogPGxpPkNhbGwgPGNvZGU+c3RhcnQoKTwvY29kZT4gdG8gaW5pdGlhdGUgbm9ybWFsIG9wZXJhdGlvbnMgb2YgYWxsIHRoZQorICogICAgIGF0dGFjaGVkIGNvbXBvbmVudHMuPC9saT4KKyAqIDwvdWw+CisgKgorICogQWZ0ZXIgbm9ybWFsIG9wZXJhdGlvbnMgaGF2ZSBiZWd1biwgeW91IGNhbiBhZGQgYW5kIHJlbW92ZSBDb25uZWN0b3JzLAorICogRW5naW5lcywgSG9zdHMsIGFuZCBDb250ZXh0cyBvbiB0aGUgZmx5LiAgSG93ZXZlciwgb25jZSB5b3UgaGF2ZSByZW1vdmVkCisgKiBhIHBhcnRpY3VsYXIgY29tcG9uZW50LCBpdCBtdXN0IGJlIHRocm93biBhd2F5IC0tIHlvdSBjYW4gY3JlYXRlIGEgbmV3IG9uZQorICogd2l0aCB0aGUgc2FtZSBjaGFyYWN0ZXJpc3RpY3MgaWYgeW91IG1lcmVseSB3YW50IHRvIGRvIGEgcmVzdGFydC4KKyAqIDxwPgorICogVG8gaW5pdGlhdGUgYSBub3JtYWwgc2h1dGRvd24sIGNhbGwgdGhlIDxjb2RlPnN0b3AoKTwvY29kZT4gbWV0aG9kIG9mCisgKiB0aGlzIG9iamVjdC4KKyAqIDxwPgorICogPHN0cm9uZz5JTVBMRU1FTlRBVElPTiBOT1RFPC9zdHJvbmc+OiAgVGhlIDxjb2RlPm1haW4oKTwvY29kZT4gbWV0aG9kIG9mCisgKiB0aGlzIGNsYXNzIGlzIGEgc2ltcGxlIGV4YW1wbGUgdGhhdCBleGVyY2l6ZXMgdGhlIGZlYXR1cmVzIG9mIGR5bmFtaWNhbGx5CisgKiBzdGFydGluZyBhbmQgc3RvcHBpbmcgdmFyaW91cyBjb21wb25lbnRzLiAgWW91IGNhbiBleGVjdXRlIHRoaXMgYnkgZXhlY3V0aW5nCisgKiB0aGUgZm9sbG93aW5nIHN0ZXBzIChvbiBhIFVuaXggcGxhdGZvcm0pOgorICogPHByZT4KKyAqICAgY2QgJENBVEFMSU5BX0hPTUUKKyAqICAgLi9iaW4vY2F0YWxpbmEuc2ggZW1iZWRkZWQKKyAqIDwvcHJlPgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgRW1iZWRkZWQgIGV4dGVuZHMgU3RhbmRhcmRTZXJ2aWNlIGltcGxlbWVudHMgTGlmZWN5Y2xlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coRW1iZWRkZWQuY2xhc3MpOworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggZGVmYXVsdCBwcm9wZXJ0aWVzLgorICAgICAqLworICAgIHB1YmxpYyBFbWJlZGRlZCgpIHsKKworICAgICAgICB0aGlzKG51bGwpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aXRoIHNwZWNpZmllZCBwcm9wZXJ0aWVzLgorICAgICAqCisgICAgICogQHBhcmFtIHJlYWxtIFJlYWxtIGltcGxlbWVudGF0aW9uIHRvIGJlIGluaGVyaXRlZCBieSBhbGwgY29tcG9uZW50cworICAgICAqICAodW5sZXNzIG92ZXJyaWRkZW4gZnVydGhlciBkb3duIHRoZSBjb250YWluZXIgaGllcmFyY2h5KQorICAgICAqLworICAgIHB1YmxpYyBFbWJlZGRlZChSZWFsbSByZWFsbSkgeworCisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIHNldFJlYWxtKHJlYWxtKTsKKyAgICAgICAgc2V0U2VjdXJpdHlQcm90ZWN0aW9uKCk7CisgICAgICAgIAorICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIElzIG5hbWluZyBlbmFibGVkID8KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiB1c2VOYW1pbmcgPSB0cnVlOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc2V0IG9mIEVuZ2luZXMgdGhhdCBoYXZlIGJlZW4gZGVwbG95ZWQgaW4gdGhpcyBzZXJ2ZXIuICBOb3JtYWxseQorICAgICAqIHRoZXJlIHdpbGwgb25seSBiZSBvbmUuCisgICAgICovCisgICAgcHJvdGVjdGVkIEVuZ2luZSBlbmdpbmVzW10gPSBuZXcgRW5naW5lWzBdOworCisKKyAgICAvKioKKyAgICAgKiBDdXN0b20gbWFwcGluZ3Mgb2YgbG9naW4gbWV0aG9kcyB0byBhdXRoZW50aWNhdG9ycworICAgICAqLworICAgIHByb3RlY3RlZCBIYXNoTWFwIGF1dGhlbnRpY2F0b3JzOworCisKKyAgICAvKioKKyAgICAgKiBEZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHNlcnZlciBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBpbmZvID0KKyAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cC5FbWJlZGRlZC8xLjAiOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgbGlmZWN5Y2xlIGV2ZW50IHN1cHBvcnQgZm9yIHRoaXMgY29tcG9uZW50LgorICAgICAqLworICAgIHByb3RlY3RlZCBMaWZlY3ljbGVTdXBwb3J0IGxpZmVjeWNsZSA9IG5ldyBMaWZlY3ljbGVTdXBwb3J0KHRoaXMpOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCByZWFsbSB0byBiZSB1c2VkIGJ5IGFsbCBjb250YWluZXJzIGFzc29jaWF0ZWQgd2l0aAorICAgICAqIHRoaXMgY29tcG9lbm50LgorICAgICAqLworICAgIHByb3RlY3RlZCBSZWFsbSByZWFsbSA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzdHJpbmcgbWFuYWdlciBmb3IgdGhpcyBwYWNrYWdlLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nTWFuYWdlciBzbSA9CisgICAgICAgIFN0cmluZ01hbmFnZXIuZ2V0TWFuYWdlcihDb25zdGFudHMuUGFja2FnZSk7CisKKworICAgIC8qKgorICAgICAqIEhhcyB0aGlzIGNvbXBvbmVudCBiZWVuIHN0YXJ0ZWQgeWV0PworICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIHN0YXJ0ZWQgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIFVzZSBhd2FpdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhd2FpdCA9IGZhbHNlOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRydWUgaWYgbmFtaW5nIGlzIGVuYWJsZWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNVc2VOYW1pbmcoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLnVzZU5hbWluZyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgbmFtaW5nIHN1cHBvcnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXNlTmFtaW5nIFRoZSBuZXcgdXNlIG5hbWluZyB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVzZU5hbWluZyhib29sZWFuIHVzZU5hbWluZykgeworCisgICAgICAgIGJvb2xlYW4gb2xkVXNlTmFtaW5nID0gdGhpcy51c2VOYW1pbmc7CisgICAgICAgIHRoaXMudXNlTmFtaW5nID0gdXNlTmFtaW5nOworICAgICAgICBzdXBwb3J0LmZpcmVQcm9wZXJ0eUNoYW5nZSgidXNlTmFtaW5nIiwgbmV3IEJvb2xlYW4ob2xkVXNlTmFtaW5nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJvb2xlYW4odGhpcy51c2VOYW1pbmcpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBkZWZhdWx0IFJlYWxtIGZvciBvdXIgQ29udGFpbmVycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgUmVhbG0gZ2V0UmVhbG0oKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLnJlYWxtKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBkZWZhdWx0IFJlYWxtIGZvciBvdXIgQ29udGFpbmVycy4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWFsbSBUaGUgbmV3IGRlZmF1bHQgcmVhbG0KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZWFsbShSZWFsbSByZWFsbSkgeworCisgICAgICAgIFJlYWxtIG9sZFJlYWxtID0gdGhpcy5yZWFsbTsKKyAgICAgICAgdGhpcy5yZWFsbSA9IHJlYWxtOworICAgICAgICBzdXBwb3J0LmZpcmVQcm9wZXJ0eUNoYW5nZSgicmVhbG0iLCBvbGRSZWFsbSwgdGhpcy5yZWFsbSk7CisKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBd2FpdChib29sZWFuIGIpIHsKKyAgICAgICAgYXdhaXQgPSBiOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzQXdhaXQoKSB7CisgICAgICAgIHJldHVybiBhd2FpdDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDYXRhbGluYUhvbWUoIFN0cmluZyBzICkgeworICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoICJjYXRhbGluYS5ob21lIiwgcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q2F0YWxpbmFCYXNlKCBTdHJpbmcgcyApIHsKKyAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCAiY2F0YWxpbmEuYmFzZSIsIHMpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2F0YWxpbmFIb21lKCkgeworICAgICAgICByZXR1cm4gU3lzdGVtLmdldFByb3BlcnR5KCJjYXRhbGluYS5ob21lIik7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRDYXRhbGluYUJhc2UoKSB7CisgICAgICAgIHJldHVybiBTeXN0ZW0uZ2V0UHJvcGVydHkoImNhdGFsaW5hLmJhc2UiKTsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisgICAgLyoqCisgICAgICogQWRkIGEgbmV3IENvbm5lY3RvciB0byB0aGUgc2V0IG9mIGRlZmluZWQgQ29ubmVjdG9ycy4gIFRoZSBuZXdseQorICAgICAqIGFkZGVkIENvbm5lY3RvciB3aWxsIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbW9zdCByZWNlbnRseSBhZGRlZCBFbmdpbmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdG9yIFRoZSBjb25uZWN0b3IgdG8gYmUgYWRkZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIG5vIGVuZ2luZXMgaGF2ZSBiZWVuIGFkZGVkIHlldAorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRDb25uZWN0b3IoQ29ubmVjdG9yIGNvbm5lY3RvcikgeworCisgICAgICAgIGlmKCBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSApIHsKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiQWRkaW5nIGNvbm5lY3RvciAoIiArIGNvbm5lY3Rvci5nZXRJbmZvKCkgKyAiKSIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGhhdmUgYSBDb250YWluZXIgdG8gc2VuZCByZXF1ZXN0cyB0bworICAgICAgICBpZiAoZW5naW5lcy5sZW5ndGggPCAxKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoImVtYmVkZGVkLm5vRW5naW5lcyIpKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBBZGQgdGhlIGNvbm5lY3Rvci4gVGhpcyB3aWxsIHNldCB0aGUgY29ubmVjdG9yJ3MgY29udGFpbmVyIHRvIHRoZQorICAgICAgICAgKiBtb3N0IHJlY2VudGx5IGFkZGVkIEVuZ2luZQorICAgICAgICAgKi8KKyAgICAgICAgc3VwZXIuYWRkQ29ubmVjdG9yKGNvbm5lY3Rvcik7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBuZXcgRW5naW5lIHRvIHRoZSBzZXQgb2YgZGVmaW5lZCBFbmdpbmVzLgorICAgICAqCisgICAgICogQHBhcmFtIGVuZ2luZSBUaGUgZW5naW5lIHRvIGJlIGFkZGVkCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZEVuZ2luZShFbmdpbmUgZW5naW5lKSB7CisKKyAgICAgICAgaWYoIGxvZy5pc0RlYnVnRW5hYmxlZCgpICkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiQWRkaW5nIGVuZ2luZSAoIiArIGVuZ2luZS5nZXRJbmZvKCkgKyAiKSIpOworCisgICAgICAgIC8vIEFkZCB0aGlzIEVuZ2luZSB0byBvdXIgc2V0IG9mIGRlZmluZWQgRW5naW5lcworICAgICAgICBFbmdpbmUgcmVzdWx0c1tdID0gbmV3IEVuZ2luZVtlbmdpbmVzLmxlbmd0aCArIDFdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVuZ2luZXMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICByZXN1bHRzW2ldID0gZW5naW5lc1tpXTsKKyAgICAgICAgcmVzdWx0c1tlbmdpbmVzLmxlbmd0aF0gPSBlbmdpbmU7CisgICAgICAgIGVuZ2luZXMgPSByZXN1bHRzOworCisgICAgICAgIC8vIFN0YXJ0IHRoaXMgRW5naW5lIGlmIG5lY2Vzc2FyeQorICAgICAgICBpZiAoc3RhcnRlZCAmJiAoZW5naW5lIGluc3RhbmNlb2YgTGlmZWN5Y2xlKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAoKExpZmVjeWNsZSkgZW5naW5lKS5zdGFydCgpOworICAgICAgICAgICAgfSBjYXRjaCAoTGlmZWN5Y2xlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkVuZ2luZS5zdGFydCIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdGhpcy5jb250YWluZXIgPSBlbmdpbmU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUsIGNvbmZpZ3VyZSwgYW5kIHJldHVybiBhIG5ldyBUQ1AvSVAgc29ja2V0IGNvbm5lY3RvcgorICAgICAqIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgcHJvcGVydGllcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhZGRyZXNzIEluZXRBZGRyZXNzIHRvIGJpbmQgdG8sIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZQorICAgICAqIGNvbm5lY3RvciBpcyBzdXBwb3NlZCB0byBiaW5kIHRvIGFsbCBhZGRyZXNzZXMgb24gdGhpcyBzZXJ2ZXIKKyAgICAgKiBAcGFyYW0gcG9ydCBQb3J0IG51bWJlciB0byBsaXN0ZW4gdG8KKyAgICAgKiBAcGFyYW0gc2VjdXJlIHRydWUgaWYgdGhlIGdlbmVyYXRlZCBjb25uZWN0b3IgaXMgc3VwcG9zZWQgdG8gYmUKKyAgICAgKiBTU0wtZW5hYmxlZCwgYW5kIGZhbHNlIG90aGVyd2lzZQorICAgICAqLworICAgIHB1YmxpYyBDb25uZWN0b3IgY3JlYXRlQ29ubmVjdG9yKEluZXRBZGRyZXNzIGFkZHJlc3MsIGludCBwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VjdXJlKSB7CisJcmV0dXJuIGNyZWF0ZUNvbm5lY3RvcihhZGRyZXNzICE9IG51bGw/IGFkZHJlc3MudG9TdHJpbmcoKSA6IG51bGwsCisJCQkgICAgICAgcG9ydCwgc2VjdXJlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29ubmVjdG9yIGNyZWF0ZUNvbm5lY3RvcihTdHJpbmcgYWRkcmVzcywgaW50IHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZWN1cmUpIHsKKyAgICAgICAgU3RyaW5nIHByb3RvY29sID0gImh0dHAiOworICAgICAgICBpZiAoc2VjdXJlKSB7CisgICAgICAgICAgICBwcm90b2NvbCA9ICJodHRwcyI7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gY3JlYXRlQ29ubmVjdG9yKGFkZHJlc3MsIHBvcnQsIHByb3RvY29sKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBDb25uZWN0b3IgY3JlYXRlQ29ubmVjdG9yKEluZXRBZGRyZXNzIGFkZHJlc3MsIGludCBwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcm90b2NvbCkgeworCXJldHVybiBjcmVhdGVDb25uZWN0b3IoYWRkcmVzcyAhPSBudWxsPyBhZGRyZXNzLnRvU3RyaW5nKCkgOiBudWxsLAorCQkJICAgICAgIHBvcnQsIHByb3RvY29sKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29ubmVjdG9yIGNyZWF0ZUNvbm5lY3RvcihTdHJpbmcgYWRkcmVzcywgaW50IHBvcnQsCisJCQkJICAgICBTdHJpbmcgcHJvdG9jb2wpIHsKKworICAgICAgICBDb25uZWN0b3IgY29ubmVjdG9yID0gbnVsbDsKKworCWlmIChhZGRyZXNzICE9IG51bGwpIHsKKwkgICAgLyoKKwkgICAgICogSW5ldEFkZHJlc3MudG9TdHJpbmcoKSByZXR1cm5zIGEgc3RyaW5nIG9mIHRoZSBmb3JtCisJICAgICAqICI8aG9zdG5hbWU+LzxsaXRlcmFsX0lQPiIuIEdldCB0aGUgbGF0dGVyIHBhcnQsIHNvIHRoYXQgdGhlCisJICAgICAqIGFkZHJlc3MgY2FuIGJlIHBhcnNlZCAoYmFjaykgaW50byBhbiBJbmV0QWRkcmVzcyB1c2luZworCSAgICAgKiBJbmV0QWRkcmVzcy5nZXRCeU5hbWUoKS4KKwkgICAgICovCisJICAgIGludCBpbmRleCA9IGFkZHJlc3MuaW5kZXhPZignLycpOworCSAgICBpZiAoaW5kZXggIT0gLTEpIHsKKwkJYWRkcmVzcyA9IGFkZHJlc3Muc3Vic3RyaW5nKGluZGV4ICsgMSk7CisJICAgIH0KKwl9CisKKwlpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ3JlYXRpbmcgY29ubmVjdG9yIGZvciBhZGRyZXNzPSciICsKKwkJICAgICAgKChhZGRyZXNzID09IG51bGwpID8gIkFMTCIgOiBhZGRyZXNzKSArCisJCSAgICAgICInIHBvcnQ9JyIgKyBwb3J0ICsgIicgcHJvdG9jb2w9JyIgKyBwcm90b2NvbCArICInIik7CisJfQorCisgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgIGlmIChwcm90b2NvbC5lcXVhbHMoImFqcCIpKSB7CisgICAgICAgICAgICAgICAgY29ubmVjdG9yID0gbmV3IENvbm5lY3Rvcigib3JnLmFwYWNoZS5qay5zZXJ2ZXIuSmtDb3lvdGVIYW5kbGVyIik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHByb3RvY29sLmVxdWFscygibWVtb3J5IikpIHsKKyAgICAgICAgICAgICAgICBjb25uZWN0b3IgPSBuZXcgQ29ubmVjdG9yKCJvcmcuYXBhY2hlLmNveW90ZS5tZW1vcnkuTWVtb3J5UHJvdG9jb2xIYW5kbGVyIik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHByb3RvY29sLmVxdWFscygiaHR0cHMiKSkgeworICAgICAgICAgICAgICAgIGNvbm5lY3RvciA9IG5ldyBDb25uZWN0b3IoKTsKKyAgICAgICAgICAgICAgICBjb25uZWN0b3Iuc2V0U2NoZW1lKCJodHRwcyIpOworICAgICAgICAgICAgICAgIGNvbm5lY3Rvci5zZXRTZWN1cmUodHJ1ZSk7CisgICAgICAgICAgICAgICAgLy8gRklYTUUgISEhISBTRVQgU1NMIFBST1BFUlRJRVMKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGFkZHJlc3MgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEludHJvc3BlY3Rpb25VdGlscy5zZXRQcm9wZXJ0eShjb25uZWN0b3IsICJhZGRyZXNzIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiICsgYWRkcmVzcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBJbnRyb3NwZWN0aW9uVXRpbHMuc2V0UHJvcGVydHkoY29ubmVjdG9yLCAicG9ydCIsICIiICsgcG9ydCk7CisKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcigiQ291bGRuJ3QgY3JlYXRlIGNvbm5lY3Rvci4iKTsKKyAgICAgICAgfSAKKworICAgICAgICByZXR1cm4gKGNvbm5lY3Rvcik7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUsIGNvbmZpZ3VyZSwgYW5kIHJldHVybiBhIENvbnRleHQgdGhhdCB3aWxsIHByb2Nlc3MgYWxsCisgICAgICogSFRUUCByZXF1ZXN0cyByZWNlaXZlZCBmcm9tIG9uZSBvZiB0aGUgYXNzb2NpYXRlZCBDb25uZWN0b3JzLAorICAgICAqIGFuZCBkaXJlY3RlZCB0byB0aGUgc3BlY2lmaWVkIGNvbnRleHQgcGF0aCBvbiB0aGUgdmlydHVhbCBob3N0CisgICAgICogdG8gd2hpY2ggdGhpcyBDb250ZXh0IGlzIGNvbm5lY3RlZC4KKyAgICAgKiA8cD4KKyAgICAgKiBBZnRlciB5b3UgaGF2ZSBjdXN0b21pemVkIHRoZSBwcm9wZXJ0aWVzLCBsaXN0ZW5lcnMsIGFuZCBWYWx2ZXMKKyAgICAgKiBmb3IgdGhpcyBDb250ZXh0LCB5b3UgbXVzdCBhdHRhY2ggaXQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgSG9zdAorICAgICAqIGJ5IGNhbGxpbmc6CisgICAgICogPHByZT4KKyAgICAgKiAgIGhvc3QuYWRkQ2hpbGQoY29udGV4dCk7CisgICAgICogPC9wcmU+CisgICAgICogd2hpY2ggd2lsbCBhbHNvIGNhdXNlIHRoZSBDb250ZXh0IHRvIGJlIHN0YXJ0ZWQgaWYgdGhlIEhvc3QgaGFzCisgICAgICogYWxyZWFkeSBiZWVuIHN0YXJ0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0aCBDb250ZXh0IHBhdGggb2YgdGhpcyBhcHBsaWNhdGlvbiAoIiIgZm9yIHRoZSBkZWZhdWx0CisgICAgICogIGFwcGxpY2F0aW9uIGZvciB0aGlzIGhvc3QsIG11c3Qgc3RhcnQgd2l0aCBhIHNsYXNoIG90aGVyd2lzZSkKKyAgICAgKiBAcGFyYW0gZG9jQmFzZSBBYnNvbHV0ZSBwYXRobmFtZSB0byB0aGUgZG9jdW1lbnQgYmFzZSBkaXJlY3RvcnkKKyAgICAgKiAgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBhbiBpbnZhbGlkIHBhcmFtZXRlcgorICAgICAqICBpcyBzcGVjaWZpZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgQ29udGV4dCBjcmVhdGVDb250ZXh0KFN0cmluZyBwYXRoLCBTdHJpbmcgZG9jQmFzZSkgeworCisgICAgICAgIGlmKCBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSApCisgICAgICAgICAgICBsb2cuZGVidWcoIkNyZWF0aW5nIGNvbnRleHQgJyIgKyBwYXRoICsgIicgd2l0aCBkb2NCYXNlICciICsKKyAgICAgICAgICAgICAgICAgICAgICAgZG9jQmFzZSArICInIik7CisKKyAgICAgICAgU3RhbmRhcmRDb250ZXh0IGNvbnRleHQgPSBuZXcgU3RhbmRhcmRDb250ZXh0KCk7CisKKyAgICAgICAgY29udGV4dC5zZXREb2NCYXNlKGRvY0Jhc2UpOworICAgICAgICBjb250ZXh0LnNldFBhdGgocGF0aCk7CisKKyAgICAgICAgQ29udGV4dENvbmZpZyBjb25maWcgPSBuZXcgQ29udGV4dENvbmZpZygpOworICAgICAgICBjb25maWcuc2V0Q3VzdG9tQXV0aGVudGljYXRvcnMoYXV0aGVudGljYXRvcnMpOworICAgICAgICAoKExpZmVjeWNsZSkgY29udGV4dCkuYWRkTGlmZWN5Y2xlTGlzdGVuZXIoY29uZmlnKTsKKworICAgICAgICByZXR1cm4gKGNvbnRleHQpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUsIGNvbmZpZ3VyZSwgYW5kIHJldHVybiBhbiBFbmdpbmUgdGhhdCB3aWxsIHByb2Nlc3MgYWxsCisgICAgICogSFRUUCByZXF1ZXN0cyByZWNlaXZlZCBmcm9tIG9uZSBvZiB0aGUgYXNzb2NpYXRlZCBDb25uZWN0b3JzLAorICAgICAqIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgcHJvcGVydGllcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgRW5naW5lIGNyZWF0ZUVuZ2luZSgpIHsKKworICAgICAgICBpZiggbG9nLmlzRGVidWdFbmFibGVkKCkgKQorICAgICAgICAgICAgbG9nLmRlYnVnKCJDcmVhdGluZyBlbmdpbmUiKTsKKworICAgICAgICBTdGFuZGFyZEVuZ2luZSBlbmdpbmUgPSBuZXcgU3RhbmRhcmRFbmdpbmUoKTsKKworICAgICAgICAvLyBEZWZhdWx0IGhvc3Qgd2lsbCBiZSBzZXQgdG8gdGhlIGZpcnN0IGhvc3QgYWRkZWQKKyAgICAgICAgZW5naW5lLnNldFJlYWxtKHJlYWxtKTsgICAgICAgICAvLyBJbmhlcml0ZWQgYnkgYWxsIGNoaWxkcmVuCisKKyAgICAgICAgcmV0dXJuIChlbmdpbmUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUsIGNvbmZpZ3VyZSwgYW5kIHJldHVybiBhIEhvc3QgdGhhdCB3aWxsIHByb2Nlc3MgYWxsCisgICAgICogSFRUUCByZXF1ZXN0cyByZWNlaXZlZCBmcm9tIG9uZSBvZiB0aGUgYXNzb2NpYXRlZCBDb25uZWN0b3JzLAorICAgICAqIGFuZCBkaXJlY3RlZCB0byB0aGUgc3BlY2lmaWVkIHZpcnR1YWwgaG9zdC4KKyAgICAgKiA8cD4KKyAgICAgKiBBZnRlciB5b3UgaGF2ZSBjdXN0b21pemVkIHRoZSBwcm9wZXJ0aWVzLCBsaXN0ZW5lcnMsIGFuZCBWYWx2ZXMKKyAgICAgKiBmb3IgdGhpcyBIb3N0LCB5b3UgbXVzdCBhdHRhY2ggaXQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgRW5naW5lCisgICAgICogYnkgY2FsbGluZzoKKyAgICAgKiA8cHJlPgorICAgICAqICAgZW5naW5lLmFkZENoaWxkKGhvc3QpOworICAgICAqIDwvcHJlPgorICAgICAqIHdoaWNoIHdpbGwgYWxzbyBjYXVzZSB0aGUgSG9zdCB0byBiZSBzdGFydGVkIGlmIHRoZSBFbmdpbmUgaGFzCisgICAgICogYWxyZWFkeSBiZWVuIHN0YXJ0ZWQuICBJZiB0aGlzIGlzIHRoZSBkZWZhdWx0IChvciBvbmx5KSBIb3N0IHlvdQorICAgICAqIHdpbGwgYmUgZGVmaW5pbmcsIHlvdSBtYXkgYWxzbyB0ZWxsIHRoZSBFbmdpbmUgdG8gcGFzcyBhbGwgcmVxdWVzdHMKKyAgICAgKiBub3QgYXNzaWduZWQgdG8gYW5vdGhlciB2aXJ0dWFsIGhvc3QgdG8gdGhpcyBvbmU6CisgICAgICogPHByZT4KKyAgICAgKiAgIGVuZ2luZS5zZXREZWZhdWx0SG9zdChob3N0LmdldE5hbWUoKSk7CisgICAgICogPC9wcmU+CisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBDYW5vbmljYWwgbmFtZSBvZiB0aGlzIHZpcnR1YWwgaG9zdAorICAgICAqIEBwYXJhbSBhcHBCYXNlIEFic29sdXRlIHBhdGhuYW1lIHRvIHRoZSBhcHBsaWNhdGlvbiBiYXNlIGRpcmVjdG9yeQorICAgICAqICBmb3IgdGhpcyB2aXJ0dWFsIGhvc3QKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGFuIGludmFsaWQgcGFyYW1ldGVyCisgICAgICogIGlzIHNwZWNpZmllZAorICAgICAqLworICAgIHB1YmxpYyBIb3N0IGNyZWF0ZUhvc3QoU3RyaW5nIG5hbWUsIFN0cmluZyBhcHBCYXNlKSB7CisKKyAgICAgICAgaWYoIGxvZy5pc0RlYnVnRW5hYmxlZCgpICkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ3JlYXRpbmcgaG9zdCAnIiArIG5hbWUgKyAiJyB3aXRoIGFwcEJhc2UgJyIgKworICAgICAgICAgICAgICAgICAgICAgICBhcHBCYXNlICsgIiciKTsKKworICAgICAgICBTdGFuZGFyZEhvc3QgaG9zdCA9IG5ldyBTdGFuZGFyZEhvc3QoKTsKKworICAgICAgICBob3N0LnNldEFwcEJhc2UoYXBwQmFzZSk7CisgICAgICAgIGhvc3Quc2V0TmFtZShuYW1lKTsKKworICAgICAgICByZXR1cm4gKGhvc3QpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW5kIHJldHVybiBhIGNsYXNzIGxvYWRlciBtYW5hZ2VyIHRoYXQgY2FuIGJlIGN1c3RvbWl6ZWQsIGFuZAorICAgICAqIHRoZW4gYXR0YWNoZWQgdG8gYSBDb250ZXh0LCBiZWZvcmUgaXQgaXMgc3RhcnRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJlbnQgQ2xhc3NMb2FkZXIgdGhhdCB3aWxsIGJlIHRoZSBwYXJlbnQgb2YgdGhlIG9uZQorICAgICAqICBjcmVhdGVkIGJ5IHRoaXMgTG9hZGVyCisgICAgICovCisgICAgcHVibGljIExvYWRlciBjcmVhdGVMb2FkZXIoQ2xhc3NMb2FkZXIgcGFyZW50KSB7CisKKyAgICAgICAgaWYoIGxvZy5pc0RlYnVnRW5hYmxlZCgpICkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ3JlYXRpbmcgTG9hZGVyIHdpdGggcGFyZW50IGNsYXNzIGxvYWRlciAnIiArCisgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudCArICInIik7CisKKyAgICAgICAgV2ViYXBwTG9hZGVyIGxvYWRlciA9IG5ldyBXZWJhcHBMb2FkZXIocGFyZW50KTsKKyAgICAgICAgcmV0dXJuIChsb2FkZXIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBTZXJ2ZXIgaW1wbGVtZW50YXRpb24gYW5kCisgICAgICogdGhlIGNvcnJlc3BvbmRpbmcgdmVyc2lvbiBudW1iZXIsIGluIHRoZSBmb3JtYXQKKyAgICAgKiA8Y29kZT4mbHQ7ZGVzY3JpcHRpb24mZ3Q7LyZsdDt2ZXJzaW9uJmd0OzwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJbmZvKCkgeworCisgICAgICAgIHJldHVybiAoaW5mbyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIENvbnRleHQgZnJvbSB0aGUgc2V0IG9mIGRlZmluZWQgQ29udGV4dHMgZm9yIGl0cworICAgICAqIGFzc29jaWF0ZWQgSG9zdC4gIElmIHRoaXMgaXMgdGhlIGxhc3QgQ29udGV4dCBmb3IgdGhpcyBIb3N0LCB0aGUgSG9zdAorICAgICAqIHdpbGwgYWxzbyBiZSByZW1vdmVkLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIENvbnRleHQgdG8gYmUgcmVtb3ZlZAorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVDb250ZXh0KENvbnRleHQgY29udGV4dCkgeworCisgICAgICAgIGlmKCBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSApCisgICAgICAgICAgICBsb2cuZGVidWcoIlJlbW92aW5nIGNvbnRleHRbIiArIGNvbnRleHQuZ2V0UGF0aCgpICsgIl0iKTsKKworICAgICAgICAvLyBJcyB0aGlzIENvbnRleHQgYWN0dWFsbHkgYW1vbmcgdGhvc2UgdGhhdCBhcmUgZGVmaW5lZD8KKyAgICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVuZ2luZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIENvbnRhaW5lciBob3N0c1tdID0gZW5naW5lc1tpXS5maW5kQ2hpbGRyZW4oKTsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgaG9zdHMubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgICAgICBDb250YWluZXIgY29udGV4dHNbXSA9IGhvc3RzW2pdLmZpbmRDaGlsZHJlbigpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgY29udGV4dHMubGVuZ3RoOyBrKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRleHQgPT0gKENvbnRleHQpIGNvbnRleHRzW2tdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZm91bmQpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGZvdW5kKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmICghZm91bmQpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgLy8gUmVtb3ZlIHRoaXMgQ29udGV4dCBmcm9tIHRoZSBhc3NvY2lhdGVkIEhvc3QKKyAgICAgICAgaWYoIGxvZy5pc0RlYnVnRW5hYmxlZCgpICkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiIFJlbW92aW5nIHRoaXMgQ29udGV4dCIpOworICAgICAgICBjb250ZXh0LmdldFBhcmVudCgpLnJlbW92ZUNoaWxkKGNvbnRleHQpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBFbmdpbmUgZnJvbSB0aGUgc2V0IG9mIGRlZmluZWQgRW5naW5lcywgYWxvbmcgd2l0aAorICAgICAqIGFsbCBvZiBpdHMgcmVsYXRlZCBIb3N0cyBhbmQgQ29udGV4dHMuICBBbGwgYXNzb2NpYXRlZCBDb25uZWN0b3JzIGFyZQorICAgICAqIGFsc28gcmVtb3ZlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbmdpbmUgVGhlIEVuZ2luZSB0byBiZSByZW1vdmVkCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZUVuZ2luZShFbmdpbmUgZW5naW5lKSB7CisKKyAgICAgICAgaWYoIGxvZy5pc0RlYnVnRW5hYmxlZCgpICkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiUmVtb3ZpbmcgZW5naW5lICgiICsgZW5naW5lLmdldEluZm8oKSArICIpIik7CisKKyAgICAgICAgLy8gSXMgdGhlIHNwZWNpZmllZCBFbmdpbmUgYWN0dWFsbHkgZGVmaW5lZD8KKyAgICAgICAgaW50IGogPSAtMTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbmdpbmVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoZW5naW5lID09IGVuZ2luZXNbaV0pIHsKKyAgICAgICAgICAgICAgICBqID0gaTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoaiA8IDApCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgLy8gUmVtb3ZlIGFueSBDb25uZWN0b3IgdGhhdCBpcyB1c2luZyB0aGlzIEVuZ2luZQorICAgICAgICBpZiggbG9nLmlzRGVidWdFbmFibGVkKCkgKQorICAgICAgICAgICAgbG9nLmRlYnVnKCIgUmVtb3ZpbmcgcmVsYXRlZCBDb250YWluZXJzIik7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBpbnQgbiA9IC0xOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb25uZWN0b3JzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGNvbm5lY3RvcnNbaV0uZ2V0Q29udGFpbmVyKCkgPT0gKENvbnRhaW5lcikgZW5naW5lKSB7CisgICAgICAgICAgICAgICAgICAgIG4gPSBpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobiA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICByZW1vdmVDb25uZWN0b3IoY29ubmVjdG9yc1tuXSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBTdG9wIHRoaXMgRW5naW5lIGlmIG5lY2Vzc2FyeQorICAgICAgICBpZiAoZW5naW5lIGluc3RhbmNlb2YgTGlmZWN5Y2xlKSB7CisgICAgICAgICAgICBpZiggbG9nLmlzRGVidWdFbmFibGVkKCkgKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiIFN0b3BwaW5nIHRoaXMgRW5naW5lIik7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICgoTGlmZWN5Y2xlKSBlbmdpbmUpLnN0b3AoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKExpZmVjeWNsZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJFbmdpbmUuc3RvcCIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gUmVtb3ZlIHRoaXMgRW5naW5lIGZyb20gb3VyIHNldCBvZiBkZWZpbmVkIEVuZ2luZXMKKyAgICAgICAgaWYoIGxvZy5pc0RlYnVnRW5hYmxlZCgpICkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiIFJlbW92aW5nIHRoaXMgRW5naW5lIik7CisgICAgICAgIGludCBrID0gMDsKKyAgICAgICAgRW5naW5lIHJlc3VsdHNbXSA9IG5ldyBFbmdpbmVbZW5naW5lcy5sZW5ndGggLSAxXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbmdpbmVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoaSAhPSBqKQorICAgICAgICAgICAgICAgIHJlc3VsdHNbaysrXSA9IGVuZ2luZXNbaV07CisgICAgICAgIH0KKyAgICAgICAgZW5naW5lcyA9IHJlc3VsdHM7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIEhvc3QsIGFsb25nIHdpdGggYWxsIG9mIGl0cyByZWxhdGVkIENvbnRleHRzLAorICAgICAqIGZyb20gdGhlIHNldCBvZiBkZWZpbmVkIEhvc3RzIGZvciBpdHMgYXNzb2NpYXRlZCBFbmdpbmUuICBJZiB0aGlzIGlzCisgICAgICogdGhlIGxhc3QgSG9zdCBmb3IgdGhpcyBFbmdpbmUsIHRoZSBFbmdpbmUgd2lsbCBhbHNvIGJlIHJlbW92ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaG9zdCBUaGUgSG9zdCB0byBiZSByZW1vdmVkCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZUhvc3QoSG9zdCBob3N0KSB7CisKKyAgICAgICAgaWYoIGxvZy5pc0RlYnVnRW5hYmxlZCgpICkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiUmVtb3ZpbmcgaG9zdFsiICsgaG9zdC5nZXROYW1lKCkgKyAiXSIpOworCisgICAgICAgIC8vIElzIHRoaXMgSG9zdCBhY3R1YWxseSBhbW9uZyB0aG9zZSB0aGF0IGFyZSBkZWZpbmVkPworICAgICAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW5naW5lcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgQ29udGFpbmVyIGhvc3RzW10gPSBlbmdpbmVzW2ldLmZpbmRDaGlsZHJlbigpOworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBob3N0cy5sZW5ndGg7IGorKykgeworICAgICAgICAgICAgICAgIGlmIChob3N0ID09IChIb3N0KSBob3N0c1tqXSkgeworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGZvdW5kKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmICghZm91bmQpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgLy8gUmVtb3ZlIHRoaXMgSG9zdCBmcm9tIHRoZSBhc3NvY2lhdGVkIEVuZ2luZQorICAgICAgICBpZiggbG9nLmlzRGVidWdFbmFibGVkKCkgKQorICAgICAgICAgICAgbG9nLmRlYnVnKCIgUmVtb3ZpbmcgdGhpcyBIb3N0Iik7CisgICAgICAgIGhvc3QuZ2V0UGFyZW50KCkucmVtb3ZlQ2hpbGQoaG9zdCk7CisKKyAgICB9CisKKworICAgIC8qCisgICAgICogTWFwcyB0aGUgc3BlY2lmaWVkIGxvZ2luIG1ldGhvZCB0byB0aGUgc3BlY2lmaWVkIGF1dGhlbnRpY2F0b3IsIGFsbG93aW5nCisgICAgICogdGhlIG1hcHBpbmdzIGluIG9yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9BdXRoZW50aWNhdG9ycy5wcm9wZXJ0aWVzCisgICAgICogdG8gYmUgb3ZlcnJpZGRlbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhdXRoZW50aWNhdG9yIEF1dGhlbnRpY2F0b3IgdG8gaGFuZGxlIGF1dGhlbnRpY2F0aW9uIGZvciB0aGUKKyAgICAgKiBzcGVjaWZpZWQgbG9naW4gbWV0aG9kCisgICAgICogQHBhcmFtIGxvZ2luTWV0aG9kIExvZ2luIG1ldGhvZCB0aGF0IG1hcHMgdG8gdGhlIHNwZWNpZmllZCBhdXRoZW50aWNhdG9yCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgc3BlY2lmaWVkIGF1dGhlbnRpY2F0b3IgZG9lcyBub3QKKyAgICAgKiBpbXBsZW1lbnQgdGhlIG9yZy5hcGFjaGUuY2F0YWxpbmEuVmFsdmUgaW50ZXJmYWNlCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQXV0aGVudGljYXRvcihBdXRoZW50aWNhdG9yIGF1dGhlbnRpY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbG9naW5NZXRob2QpIHsKKyAgICAgICAgaWYgKCEoYXV0aGVudGljYXRvciBpbnN0YW5jZW9mIFZhbHZlKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICBzbS5nZXRTdHJpbmcoImVtYmVkZGVkLmF1dGhlbnRpY2F0b3JOb3RJbnN0YW5jZU9mVmFsdmUiKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGF1dGhlbnRpY2F0b3JzID09IG51bGwpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgICAgIGlmIChhdXRoZW50aWNhdG9ycyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0b3JzID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYXV0aGVudGljYXRvcnMucHV0KGxvZ2luTWV0aG9kLCBhdXRoZW50aWNhdG9yKTsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBMaWZlY3ljbGUgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBsaWZlY3ljbGUgZXZlbnQgbGlzdGVuZXIgdG8gdGhpcyBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRvIGFkZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZExpZmVjeWNsZUxpc3RlbmVyKExpZmVjeWNsZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisKKyAgICAgICAgbGlmZWN5Y2xlLmFkZExpZmVjeWNsZUxpc3RlbmVyKGxpc3RlbmVyKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBsaWZlY3ljbGUgbGlzdGVuZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGxpZmVjeWNsZS4gSWYgdGhpcyAKKyAgICAgKiBMaWZlY3ljbGUgaGFzIG5vIGxpc3RlbmVycyByZWdpc3RlcmVkLCBhIHplcm8tbGVuZ3RoIGFycmF5IGlzIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBMaWZlY3ljbGVMaXN0ZW5lcltdIGZpbmRMaWZlY3ljbGVMaXN0ZW5lcnMoKSB7CisKKyAgICAgICAgcmV0dXJuIGxpZmVjeWNsZS5maW5kTGlmZWN5Y2xlTGlzdGVuZXJzKCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhIGxpZmVjeWNsZSBldmVudCBsaXN0ZW5lciBmcm9tIHRoaXMgY29tcG9uZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciB0byByZW1vdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVMaWZlY3ljbGVMaXN0ZW5lcihMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lcikgeworCisgICAgICAgIGxpZmVjeWNsZS5yZW1vdmVMaWZlY3ljbGVMaXN0ZW5lcihsaXN0ZW5lcik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFByZXBhcmUgZm9yIHRoZSBiZWdpbm5pbmcgb2YgYWN0aXZlIHVzZSBvZiB0aGUgcHVibGljIG1ldGhvZHMgb2YgdGhpcworICAgICAqIGNvbXBvbmVudC4gIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgPGNvZGU+Y29uZmlndXJlKCk8L2NvZGU+LAorICAgICAqIGFuZCBiZWZvcmUgYW55IG9mIHRoZSBwdWJsaWMgbWV0aG9kcyBvZiB0aGUgY29tcG9uZW50IGFyZSB1dGlsaXplZC4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTGlmZWN5Y2xlRXhjZXB0aW9uIGlmIHRoaXMgY29tcG9uZW50IGRldGVjdHMgYSBmYXRhbCBlcnJvcgorICAgICAqICB0aGF0IHByZXZlbnRzIHRoaXMgY29tcG9uZW50IGZyb20gYmVpbmcgdXNlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgdGhyb3dzIExpZmVjeWNsZUV4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYoIGxvZy5pc0luZm9FbmFibGVkKCkgKQorICAgICAgICAgICAgbG9nLmluZm8oIlN0YXJ0aW5nIHRvbWNhdCBzZXJ2ZXIiKTsKKworICAgICAgICAvLyBWYWxpZGF0ZSB0aGUgc2V0dXAgb2Ygb3VyIHJlcXVpcmVkIHN5c3RlbSBwcm9wZXJ0aWVzCisgICAgICAgIGluaXREaXJzKCk7CisKKyAgICAgICAgLy8gSW5pdGlhbGl6ZSBzb21lIG5hbWluZyBzcGVjaWZpYyBwcm9wZXJ0aWVzCisgICAgICAgIGluaXROYW1pbmcoKTsKKworICAgICAgICAvLyBWYWxpZGF0ZSBhbmQgdXBkYXRlIG91ciBjdXJyZW50IGNvbXBvbmVudCBzdGF0ZQorICAgICAgICBpZiAoc3RhcnRlZCkKKyAgICAgICAgICAgIHRocm93IG5ldyBMaWZlY3ljbGVFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJlbWJlZGRlZC5hbHJlYWR5U3RhcnRlZCIpKTsKKyAgICAgICAgbGlmZWN5Y2xlLmZpcmVMaWZlY3ljbGVFdmVudChTVEFSVF9FVkVOVCwgbnVsbCk7CisgICAgICAgIHN0YXJ0ZWQgPSB0cnVlOworICAgICAgICBpbml0aWFsaXplZCA9IHRydWU7CisKKyAgICAgICAgLy8gU3RhcnQgb3VyIGRlZmluZWQgRW5naW5lcyBmaXJzdAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVuZ2luZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChlbmdpbmVzW2ldIGluc3RhbmNlb2YgTGlmZWN5Y2xlKQorICAgICAgICAgICAgICAgICgoTGlmZWN5Y2xlKSBlbmdpbmVzW2ldKS5zdGFydCgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gU3RhcnQgb3VyIGRlZmluZWQgQ29ubmVjdG9ycyBzZWNvbmQKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb25uZWN0b3JzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBjb25uZWN0b3JzW2ldLmluaXRpYWxpemUoKTsKKyAgICAgICAgICAgIGlmIChjb25uZWN0b3JzW2ldIGluc3RhbmNlb2YgTGlmZWN5Y2xlKQorICAgICAgICAgICAgICAgICgoTGlmZWN5Y2xlKSBjb25uZWN0b3JzW2ldKS5zdGFydCgpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdyYWNlZnVsbHkgdGVybWluYXRlIHRoZSBhY3RpdmUgdXNlIG9mIHRoZSBwdWJsaWMgbWV0aG9kcyBvZiB0aGlzCisgICAgICogY29tcG9uZW50LiAgVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHRoZSBsYXN0IG9uZSBjYWxsZWQgb24gYSBnaXZlbgorICAgICAqIGluc3RhbmNlIG9mIHRoaXMgY29tcG9uZW50LgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBMaWZlY3ljbGVFeGNlcHRpb24gaWYgdGhpcyBjb21wb25lbnQgZGV0ZWN0cyBhIGZhdGFsIGVycm9yCisgICAgICogIHRoYXQgbmVlZHMgdG8gYmUgcmVwb3J0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdG9wKCkgdGhyb3dzIExpZmVjeWNsZUV4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYoIGxvZy5pc0RlYnVnRW5hYmxlZCgpICkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiU3RvcHBpbmcgZW1iZWRkZWQgc2VydmVyIik7CisKKyAgICAgICAgLy8gVmFsaWRhdGUgYW5kIHVwZGF0ZSBvdXIgY3VycmVudCBjb21wb25lbnQgc3RhdGUKKyAgICAgICAgaWYgKCFzdGFydGVkKQorICAgICAgICAgICAgdGhyb3cgbmV3IExpZmVjeWNsZUV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoImVtYmVkZGVkLm5vdFN0YXJ0ZWQiKSk7CisgICAgICAgIGxpZmVjeWNsZS5maXJlTGlmZWN5Y2xlRXZlbnQoU1RPUF9FVkVOVCwgbnVsbCk7CisgICAgICAgIHN0YXJ0ZWQgPSBmYWxzZTsKKworICAgICAgICAvLyBTdG9wIG91ciBkZWZpbmVkIENvbm5lY3RvcnMgZmlyc3QKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb25uZWN0b3JzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoY29ubmVjdG9yc1tpXSBpbnN0YW5jZW9mIExpZmVjeWNsZSkKKyAgICAgICAgICAgICAgICAoKExpZmVjeWNsZSkgY29ubmVjdG9yc1tpXSkuc3RvcCgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gU3RvcCBvdXIgZGVmaW5lZCBFbmdpbmVzIHNlY29uZAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVuZ2luZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChlbmdpbmVzW2ldIGluc3RhbmNlb2YgTGlmZWN5Y2xlKQorICAgICAgICAgICAgICAgICgoTGlmZWN5Y2xlKSBlbmdpbmVzW2ldKS5zdG9wKCk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3RlY3RlZCBNZXRob2RzCisKKworICAgIC8qKiBJbml0aWFsaXplIG5hbWluZyAtIHRoaXMgc2hvdWxkIG9ubHkgZW5hYmxlIGphdmE6ZW52IGFuZCByb290IG5hbWluZy4KKyAgICAgKiBJZiB0b21jYXQgaXMgZW1iZWRlZCBpbiBhbiBhcHBsaWNhdGlvbiB0aGF0IGFscmVhZHkgZGVmaW5lcyB0aG9zZSAtCisgICAgICogaXQgc2hvdWxkbid0IGRvIGl0LgorICAgICAqCisgICAgICogWFhYIFRoZSAyIHNob3VsZCBiZSBzZXBhcmF0ZWQsIHlvdSBtYXkgd2FudCB0byBlbmFibGUgamF2YTogYnV0IG5vdAorICAgICAqIHRoZSBpbml0aWFsIGNvbnRleHQgYW5kIHRoZSByZXZlcnNlCisgICAgICogWFhYIENhbiB3ZSAiZ3Vlc3MiIC0gaS5lLiBsb29rdXAgamF2YTogYW5kIGlmIHNvbWV0aGluZyBpcyByZXR1cm5lZCBhc3N1bWUKKyAgICAgKiBmYWxzZSA/CisgICAgICogWFhYIFdlIGhhdmUgYSBtYWpvciBwcm9ibGVtIHdpdGggdGhlIGN1cnJlbnQgc2V0dGluZyBmb3IgamF2YTogdXJsCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgaW5pdE5hbWluZygpIHsKKyAgICAgICAgLy8gU2V0dGluZyBhZGRpdGlvbmFsIHZhcmlhYmxlcworICAgICAgICBpZiAoIXVzZU5hbWluZykgeworICAgICAgICAgICAgbG9nLmluZm8oICJDYXRhbGluYSBuYW1pbmcgZGlzYWJsZWQiKTsKKyAgICAgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiY2F0YWxpbmEudXNlTmFtaW5nIiwgImZhbHNlIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImNhdGFsaW5hLnVzZU5hbWluZyIsICJ0cnVlIik7CisgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSAib3JnLmFwYWNoZS5uYW1pbmciOworICAgICAgICAgICAgU3RyaW5nIG9sZFZhbHVlID0KKyAgICAgICAgICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydHkoamF2YXgubmFtaW5nLkNvbnRleHQuVVJMX1BLR19QUkVGSVhFUyk7CisgICAgICAgICAgICBpZiAob2xkVmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgKyAiOiIgKyBvbGRWYWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eShqYXZheC5uYW1pbmcuQ29udGV4dC5VUkxfUEtHX1BSRUZJWEVTLCB2YWx1ZSk7CisgICAgICAgICAgICBpZiggbG9nLmlzRGVidWdFbmFibGVkKCkgKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiU2V0dGluZyBuYW1pbmcgcHJlZml4PSIgKyB2YWx1ZSk7CisgICAgICAgICAgICB2YWx1ZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eQorICAgICAgICAgICAgICAgIChqYXZheC5uYW1pbmcuQ29udGV4dC5JTklUSUFMX0NPTlRFWFRfRkFDVE9SWSk7CisgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eQorICAgICAgICAgICAgICAgICAgICAoamF2YXgubmFtaW5nLkNvbnRleHQuSU5JVElBTF9DT05URVhUX0ZBQ1RPUlksCisgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5uYW1pbmcuamF2YS5qYXZhVVJMQ29udGV4dEZhY3RvcnkiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCAiSU5JVElBTF9DT05URVhUX0ZBQ1RPUlkgYWxyZWFkIHNldCAiICsgdmFsdWUgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHJvdGVjdGVkIHZvaWQgaW5pdERpcnMoKSB7CisKKyAgICAgICAgU3RyaW5nIGNhdGFsaW5hSG9tZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2F0YWxpbmEuaG9tZSIpOworICAgICAgICBpZiAoY2F0YWxpbmFIb21lID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHBhdGNoIGZvciBKMkVFIFJJIDEuMworICAgICAgICAgICAgU3RyaW5nIGoyZWVIb21lID0gU3lzdGVtLmdldFByb3BlcnR5KCJjb20uc3VuLmVudGVycHJpc2UuaG9tZSIpOworICAgICAgICAgICAgaWYgKGoyZWVIb21lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjYXRhbGluYUhvbWU9U3lzdGVtLmdldFByb3BlcnR5KCJjb20uc3VuLmVudGVycHJpc2UuaG9tZSIpOworICAgICAgICAgICAgfSBlbHNlIGlmIChTeXN0ZW0uZ2V0UHJvcGVydHkoImNhdGFsaW5hLmJhc2UiKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY2F0YWxpbmFIb21lID0gU3lzdGVtLmdldFByb3BlcnR5KCJjYXRhbGluYS5iYXNlIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFVzZSBJbnRyb3NwZWN0aW9uVXRpbHMgYW5kIGd1ZXNzIHRoZSBkaXIKKyAgICAgICAgICAgICAgICBjYXRhbGluYUhvbWUgPSBJbnRyb3NwZWN0aW9uVXRpbHMuZ3Vlc3NJbnN0YWxsCisgICAgICAgICAgICAgICAgICAgICgiY2F0YWxpbmEuaG9tZSIsICJjYXRhbGluYS5iYXNlIiwgImNhdGFsaW5hLmphciIpOworICAgICAgICAgICAgICAgIGlmIChjYXRhbGluYUhvbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBjYXRhbGluYUhvbWUgPSBJbnRyb3NwZWN0aW9uVXRpbHMuZ3Vlc3NJbnN0YWxsCisgICAgICAgICAgICAgICAgICAgICAgICAoInRvbWNhdC5pbnN0YWxsIiwgImNhdGFsaW5hLmhvbWUiLCAidG9tY2F0LmphciIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoY2F0YWxpbmFIb21lICE9IG51bGwpIHsKKyAgICAgICAgICAgIEZpbGUgaG9tZSA9IG5ldyBGaWxlKGNhdGFsaW5hSG9tZSk7CisgICAgICAgICAgICBpZiAoIWhvbWUuaXNBYnNvbHV0ZSgpKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgY2F0YWxpbmFIb21lID0gaG9tZS5nZXRDYW5vbmljYWxQYXRoKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBjYXRhbGluYUhvbWUgPSBob21lLmdldEFic29sdXRlUGF0aCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiY2F0YWxpbmEuaG9tZSIsIGNhdGFsaW5hSG9tZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoU3lzdGVtLmdldFByb3BlcnR5KCJjYXRhbGluYS5iYXNlIikgPT0gbnVsbCkgeworICAgICAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJjYXRhbGluYS5iYXNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydHkoImNhdGFsaW5hLmhvbWUiKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBTdHJpbmcgY2F0YWxpbmFCYXNlID0gU3lzdGVtLmdldFByb3BlcnR5KCJjYXRhbGluYS5iYXNlIik7CisgICAgICAgICAgICBGaWxlIGJhc2UgPSBuZXcgRmlsZShjYXRhbGluYUJhc2UpOworICAgICAgICAgICAgaWYgKCFiYXNlLmlzQWJzb2x1dGUoKSkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGNhdGFsaW5hQmFzZSA9IGJhc2UuZ2V0Q2Fub25pY2FsUGF0aCgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2F0YWxpbmFCYXNlID0gYmFzZS5nZXRBYnNvbHV0ZVBhdGgoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImNhdGFsaW5hLmJhc2UiLCBjYXRhbGluYUJhc2UpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByaXZhdGUgTWV0aG9kcworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzZWN1cml0eSBwYWNrYWdlIGFjY2Vzcy9wcm90ZWN0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldFNlY3VyaXR5UHJvdGVjdGlvbigpeworICAgICAgICBTZWN1cml0eUNvbmZpZyBzZWN1cml0eUNvbmZpZyA9IFNlY3VyaXR5Q29uZmlnLm5ld0luc3RhbmNlKCk7CisgICAgICAgIHNlY3VyaXR5Q29uZmlnLnNldFBhY2thZ2VEZWZpbml0aW9uKCk7CisgICAgICAgIHNlY3VyaXR5Q29uZmlnLnNldFBhY2thZ2VBY2Nlc3MoKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdGFydHVwL0VuZ2luZUNvbmZpZy5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvRW5naW5lQ29uZmlnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTliNTAwYwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdGFydHVwL0VuZ2luZUNvbmZpZy5qYXZhCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0YXJ0dXA7CisKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuRW5naW5lOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlRXZlbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuU3RyaW5nTWFuYWdlcjsKKworCisvKioKKyAqIFN0YXJ0dXAgZXZlbnQgbGlzdGVuZXIgZm9yIGEgPGI+RW5naW5lPC9iPiB0aGF0IGNvbmZpZ3VyZXMgdGhlIHByb3BlcnRpZXMKKyAqIG9mIHRoYXQgRW5naW5lLCBhbmQgdGhlIGFzc29jaWF0ZWQgZGVmaW5lZCBjb250ZXh0cy4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIEVuZ2luZUNvbmZpZworICAgIGltcGxlbWVudHMgTGlmZWN5Y2xlTGlzdGVuZXIgeworCisKKyAgICBwcml2YXRlIHN0YXRpYyBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2cgbG9nPQorICAgICAgICBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5LmdldExvZyggRW5naW5lQ29uZmlnLmNsYXNzICk7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIEVuZ2luZSB3ZSBhcmUgYXNzb2NpYXRlZCB3aXRoLgorICAgICAqLworICAgIHByaXZhdGUgRW5naW5lIGVuZ2luZSA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzdHJpbmcgcmVzb3VyY2VzIGZvciB0aGlzIHBhY2thZ2UuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nTWFuYWdlciBzbSA9CisgICAgICAgIFN0cmluZ01hbmFnZXIuZ2V0TWFuYWdlcihDb25zdGFudHMuUGFja2FnZSk7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBTVEFSVCBldmVudCBmb3IgYW4gYXNzb2NpYXRlZCBFbmdpbmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnQgVGhlIGxpZmVjeWNsZSBldmVudCB0aGF0IGhhcyBvY2N1cnJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGxpZmVjeWNsZUV2ZW50KExpZmVjeWNsZUV2ZW50IGV2ZW50KSB7CisKKyAgICAgICAgLy8gSWRlbnRpZnkgdGhlIGVuZ2luZSB3ZSBhcmUgYXNzb2NpYXRlZCB3aXRoCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBlbmdpbmUgPSAoRW5naW5lKSBldmVudC5nZXRMaWZlY3ljbGUoKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcihzbS5nZXRTdHJpbmcoImVuZ2luZUNvbmZpZy5jY2UiLCBldmVudC5nZXRMaWZlY3ljbGUoKSksIGUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gUHJvY2VzcyB0aGUgZXZlbnQgdGhhdCBoYXMgb2NjdXJyZWQKKyAgICAgICAgaWYgKGV2ZW50LmdldFR5cGUoKS5lcXVhbHMoTGlmZWN5Y2xlLlNUQVJUX0VWRU5UKSkKKyAgICAgICAgICAgIHN0YXJ0KCk7CisgICAgICAgIGVsc2UgaWYgKGV2ZW50LmdldFR5cGUoKS5lcXVhbHMoTGlmZWN5Y2xlLlNUT1BfRVZFTlQpKQorICAgICAgICAgICAgc3RvcCgpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcml2YXRlIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUHJvY2VzcyBhICJzdGFydCIgZXZlbnQgZm9yIHRoaXMgRW5naW5lLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzdGFydCgpIHsKKworICAgICAgICBpZiAoZW5naW5lLmdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBlbmdpbmUuZ2V0TG9nZ2VyKCkuZGVidWcoc20uZ2V0U3RyaW5nKCJlbmdpbmVDb25maWcuc3RhcnQiKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgYSAic3RvcCIgZXZlbnQgZm9yIHRoaXMgRW5naW5lLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzdG9wKCkgeworCisgICAgICAgIGlmIChlbmdpbmUuZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGVuZ2luZS5nZXRMb2dnZXIoKS5kZWJ1ZyhzbS5nZXRTdHJpbmcoImVuZ2luZUNvbmZpZy5zdG9wIikpOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdGFydHVwL0VuZ2luZVJ1bGVTZXQuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdGFydHVwL0VuZ2luZVJ1bGVTZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODZkZGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvRW5naW5lUnVsZVNldC5qYXZhCkBAIC0wLDAgKzEsMTM5IEBACisvKgorICogQ29weXJpZ2h0IDE5OTktMjAwMSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cDsKKworCitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5kaWdlc3Rlci5EaWdlc3RlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvbWNhdC51dGlsLmRpZ2VzdGVyLlJ1bGVTZXRCYXNlOworCisKKy8qKgorICogPHA+PHN0cm9uZz5SdWxlU2V0PC9zdHJvbmc+IGZvciBwcm9jZXNzaW5nIHRoZSBjb250ZW50cyBvZiBhCisgKiBFbmdpbmUgZGVmaW5pdGlvbiBlbGVtZW50LiAgVGhpcyA8Y29kZT5SdWxlU2V0PC9jb2RlPiBkb2VzIE5PVCBpbmNsdWRlCisgKiBhbnkgcnVsZXMgZm9yIG5lc3RlZCBIb3N0IG9yIERlZmF1bHRDb250ZXh0IGVsZW1lbnRzLCB3aGljaCBzaG91bGQKKyAqIGJlIGFkZGVkIHZpYSBpbnN0YW5jZXMgb2YgPGNvZGU+SG9zdFJ1bGVTZXQ8L2NvZGU+IG9yCisgKiA8Y29kZT5Db250ZXh0UnVsZVNldDwvY29kZT4sIHJlc3BlY3RpdmVseS48L3A+CisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBFbmdpbmVSdWxlU2V0IGV4dGVuZHMgUnVsZVNldEJhc2UgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIG1hdGNoaW5nIHBhdHRlcm4gcHJlZml4IHRvIHVzZSBmb3IgcmVjb2duaXppbmcgb3VyIGVsZW1lbnRzLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgcHJlZml4ID0gbnVsbDsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9yCisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhbiBpbnN0YW5jZSBvZiB0aGlzIDxjb2RlPlJ1bGVTZXQ8L2NvZGU+IHdpdGggdGhlIGRlZmF1bHQKKyAgICAgKiBtYXRjaGluZyBwYXR0ZXJuIHByZWZpeC4KKyAgICAgKi8KKyAgICBwdWJsaWMgRW5naW5lUnVsZVNldCgpIHsKKworICAgICAgICB0aGlzKCIiKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGFuIGluc3RhbmNlIG9mIHRoaXMgPGNvZGU+UnVsZVNldDwvY29kZT4gd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgICogbWF0Y2hpbmcgcGF0dGVybiBwcmVmaXguCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJlZml4IFByZWZpeCBmb3IgbWF0Y2hpbmcgcGF0dGVybiBydWxlcyAoaW5jbHVkaW5nIHRoZQorICAgICAqICB0cmFpbGluZyBzbGFzaCBjaGFyYWN0ZXIpCisgICAgICovCisgICAgcHVibGljIEVuZ2luZVJ1bGVTZXQoU3RyaW5nIHByZWZpeCkgeworCisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIHRoaXMubmFtZXNwYWNlVVJJID0gbnVsbDsKKyAgICAgICAgdGhpcy5wcmVmaXggPSBwcmVmaXg7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiA8cD5BZGQgdGhlIHNldCBvZiBSdWxlIGluc3RhbmNlcyBkZWZpbmVkIGluIHRoaXMgUnVsZVNldCB0byB0aGUKKyAgICAgKiBzcGVjaWZpZWQgPGNvZGU+RGlnZXN0ZXI8L2NvZGU+IGluc3RhbmNlLCBhc3NvY2lhdGluZyB0aGVtIHdpdGgKKyAgICAgKiBvdXIgbmFtZXNwYWNlIFVSSSAoaWYgYW55KS4gIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGNhbGxlZAorICAgICAqIGJ5IGEgRGlnZXN0ZXIgaW5zdGFuY2UuPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIGRpZ2VzdGVyIERpZ2VzdGVyIGluc3RhbmNlIHRvIHdoaWNoIHRoZSBuZXcgUnVsZSBpbnN0YW5jZXMKKyAgICAgKiAgc2hvdWxkIGJlIGFkZGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFJ1bGVJbnN0YW5jZXMoRGlnZXN0ZXIgZGlnZXN0ZXIpIHsKKworICAgICAgICBkaWdlc3Rlci5hZGRPYmplY3RDcmVhdGUocHJlZml4ICsgIkVuZ2luZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkRW5naW5lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjbGFzc05hbWUiKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkU2V0UHJvcGVydGllcyhwcmVmaXggKyAiRW5naW5lIik7CisgICAgICAgIGRpZ2VzdGVyLmFkZFJ1bGUocHJlZml4ICsgIkVuZ2luZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IExpZmVjeWNsZUxpc3RlbmVyUnVsZQorICAgICAgICAgICAgICAgICAgICAgICAgICgib3JnLmFwYWNoZS5jYXRhbGluYS5zdGFydHVwLkVuZ2luZUNvbmZpZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJlbmdpbmVDb25maWdDbGFzcyIpKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkU2V0TmV4dChwcmVmaXggKyAiRW5naW5lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0Q29udGFpbmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5Db250YWluZXIiKTsKKworICAgICAgICBkaWdlc3Rlci5hZGRPYmplY3RDcmVhdGUocHJlZml4ICsgIkVuZ2luZS9MaXN0ZW5lciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCAvLyBNVVNUIGJlIHNwZWNpZmllZCBpbiB0aGUgZWxlbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNsYXNzTmFtZSIpOworICAgICAgICBkaWdlc3Rlci5hZGRTZXRQcm9wZXJ0aWVzKHByZWZpeCArICJFbmdpbmUvTGlzdGVuZXIiKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkU2V0TmV4dChwcmVmaXggKyAiRW5naW5lL0xpc3RlbmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWRkTGlmZWN5Y2xlTGlzdGVuZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZUxpc3RlbmVyIik7CisKKyAgICAgICAgZGlnZXN0ZXIuYWRkT2JqZWN0Q3JlYXRlKHByZWZpeCArICJFbmdpbmUvTG9nZ2VyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIC8vIE1VU1QgYmUgc3BlY2lmaWVkIGluIHRoZSBlbGVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2xhc3NOYW1lIik7CisgICAgICAgIGRpZ2VzdGVyLmFkZFNldFByb3BlcnRpZXMocHJlZml4ICsgIkVuZ2luZS9Mb2dnZXIiKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkU2V0TmV4dChwcmVmaXggKyAiRW5naW5lL0xvZ2dlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldExvZ2dlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuTG9nZ2VyIik7CisKKyAgICAgICAgZGlnZXN0ZXIuYWRkT2JqZWN0Q3JlYXRlKHByZWZpeCArICJFbmdpbmUvUmVhbG0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgLy8gTVVTVCBiZSBzcGVjaWZpZWQgaW4gdGhlIGVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjbGFzc05hbWUiKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkU2V0UHJvcGVydGllcyhwcmVmaXggKyAiRW5naW5lL1JlYWxtIik7CisgICAgICAgIGRpZ2VzdGVyLmFkZFNldE5leHQocHJlZml4ICsgIkVuZ2luZS9SZWFsbSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldFJlYWxtIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5SZWFsbSIpOworCisgICAgICAgIGRpZ2VzdGVyLmFkZE9iamVjdENyZWF0ZShwcmVmaXggKyAiRW5naW5lL1ZhbHZlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIC8vIE1VU1QgYmUgc3BlY2lmaWVkIGluIHRoZSBlbGVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2xhc3NOYW1lIik7CisgICAgICAgIGRpZ2VzdGVyLmFkZFNldFByb3BlcnRpZXMocHJlZml4ICsgIkVuZ2luZS9WYWx2ZSIpOworICAgICAgICBkaWdlc3Rlci5hZGRTZXROZXh0KHByZWZpeCArICJFbmdpbmUvVmFsdmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZGRWYWx2ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuVmFsdmUiKTsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9FeHBhbmRXYXIuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdGFydHVwL0V4cGFuZFdhci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwZjQwNDkKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9FeHBhbmRXYXIuamF2YQpAQCAtMCwwICsxLDMzNyBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5zdGFydHVwOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5KYXJVUkxDb25uZWN0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLmphci5KYXJFbnRyeTsKK2ltcG9ydCBqYXZhLnV0aWwuamFyLkphckZpbGU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkhvc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLlN0cmluZ01hbmFnZXI7CisKKy8qKgorICogRXhwYW5kIG91dCBhIFdBUiBpbiBhIEhvc3QncyBhcHBCYXNlLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQGF1dGhvciBSZW15IE1hdWNoZXJhdAorICogQGF1dGhvciBHbGVubiBMLiBOaWVsc2VuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KKworcHVibGljIGNsYXNzIEV4cGFuZFdhciB7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzdHJpbmcgcmVzb3VyY2VzIGZvciB0aGlzIHBhY2thZ2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdNYW5hZ2VyIHNtID0KKyAgICAgICAgU3RyaW5nTWFuYWdlci5nZXRNYW5hZ2VyKENvbnN0YW50cy5QYWNrYWdlKTsKKworCisgICAgLyoqCisgICAgICogRXhwYW5kIHRoZSBXQVIgZmlsZSBmb3VuZCBhdCB0aGUgc3BlY2lmaWVkIFVSTCBpbnRvIGFuIHVucGFja2VkCisgICAgICogZGlyZWN0b3J5IHN0cnVjdHVyZSwgYW5kIHJldHVybiB0aGUgYWJzb2x1dGUgcGF0aG5hbWUgdG8gdGhlIGV4cGFuZGVkCisgICAgICogZGlyZWN0b3J5LgorICAgICAqCisgICAgICogQHBhcmFtIGhvc3QgSG9zdCB3YXIgaXMgYmVpbmcgaW5zdGFsbGVkIGZvcgorICAgICAqIEBwYXJhbSB3YXIgVVJMIG9mIHRoZSB3ZWIgYXBwbGljYXRpb24gYXJjaGl2ZSB0byBiZSBleHBhbmRlZAorICAgICAqICAobXVzdCBzdGFydCB3aXRoICJqYXI6IikKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoaXMgaXMgbm90IGEgImphcjoiIFVSTAorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIHdhcyBlbmNvdW50ZXJlZAorICAgICAqICBkdXJpbmcgZXhwYW5zaW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZXhwYW5kKEhvc3QgaG9zdCwgVVJMIHdhcikKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIGRpcmVjdG9yeSBuYW1lIG9mIHRoZSBleHBhbmRlZCBkaXJlY3RvcnkKKyAgICAgICAgaWYgKGhvc3QuZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgaG9zdC5nZXRMb2dnZXIoKS5kZWJ1ZygiZXhwYW5kKCIgKyB3YXIudG9TdHJpbmcoKSArICIpIik7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIHBhdGhuYW1lID0gd2FyLnRvU3RyaW5nKCkucmVwbGFjZSgnXFwnLCAnLycpOworICAgICAgICBpZiAocGF0aG5hbWUuZW5kc1dpdGgoIiEvIikpIHsKKyAgICAgICAgICAgIHBhdGhuYW1lID0gcGF0aG5hbWUuc3Vic3RyaW5nKDAsIHBhdGhuYW1lLmxlbmd0aCgpIC0gMik7CisgICAgICAgIH0KKyAgICAgICAgaW50IHBlcmlvZCA9IHBhdGhuYW1lLmxhc3RJbmRleE9mKCcuJyk7CisgICAgICAgIGlmIChwZXJpb2QgPj0gcGF0aG5hbWUubGVuZ3RoKCkgLSA0KQorICAgICAgICAgICAgcGF0aG5hbWUgPSBwYXRobmFtZS5zdWJzdHJpbmcoMCwgcGVyaW9kKTsKKyAgICAgICAgaW50IHNsYXNoID0gcGF0aG5hbWUubGFzdEluZGV4T2YoJy8nKTsKKyAgICAgICAgaWYgKHNsYXNoID49IDApIHsKKyAgICAgICAgICAgIHBhdGhuYW1lID0gcGF0aG5hbWUuc3Vic3RyaW5nKHNsYXNoICsgMSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGhvc3QuZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgaG9zdC5nZXRMb2dnZXIoKS5kZWJ1ZygiICBQcm9wb3NlZCBkaXJlY3RvcnkgbmFtZTogIiArIHBhdGhuYW1lKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZXhwYW5kKGhvc3QsIHdhciwgcGF0aG5hbWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBFeHBhbmQgdGhlIFdBUiBmaWxlIGZvdW5kIGF0IHRoZSBzcGVjaWZpZWQgVVJMIGludG8gYW4gdW5wYWNrZWQKKyAgICAgKiBkaXJlY3Rvcnkgc3RydWN0dXJlLCBhbmQgcmV0dXJuIHRoZSBhYnNvbHV0ZSBwYXRobmFtZSB0byB0aGUgZXhwYW5kZWQKKyAgICAgKiBkaXJlY3RvcnkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaG9zdCBIb3N0IHdhciBpcyBiZWluZyBpbnN0YWxsZWQgZm9yCisgICAgICogQHBhcmFtIHdhciBVUkwgb2YgdGhlIHdlYiBhcHBsaWNhdGlvbiBhcmNoaXZlIHRvIGJlIGV4cGFuZGVkCisgICAgICogIChtdXN0IHN0YXJ0IHdpdGggImphcjoiKQorICAgICAqIEBwYXJhbSBwYXRobmFtZSBDb250ZXh0IHBhdGggbmFtZSBmb3Igd2ViIGFwcGxpY2F0aW9uCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGlzIGlzIG5vdCBhICJqYXI6IiBVUkwKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciB3YXMgZW5jb3VudGVyZWQKKyAgICAgKiAgZHVyaW5nIGV4cGFuc2lvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4cGFuZChIb3N0IGhvc3QsIFVSTCB3YXIsIFN0cmluZyBwYXRobmFtZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGVyZSBpcyBubyBzdWNoIGRpcmVjdG9yeSBhbHJlYWR5IGV4aXN0aW5nCisgICAgICAgIEZpbGUgYXBwQmFzZSA9IG5ldyBGaWxlKGhvc3QuZ2V0QXBwQmFzZSgpKTsKKyAgICAgICAgaWYgKCFhcHBCYXNlLmlzQWJzb2x1dGUoKSkgeworICAgICAgICAgICAgYXBwQmFzZSA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2F0YWxpbmEuYmFzZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3QuZ2V0QXBwQmFzZSgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWFwcEJhc2UuZXhpc3RzKCkgfHwgIWFwcEJhc2UuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygiaG9zdENvbmZpZy5hcHBCYXNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcEJhc2UuZ2V0QWJzb2x1dGVQYXRoKCkpKTsKKyAgICAgICAgfQorICAgICAgICBGaWxlIGRvY0Jhc2UgPSBuZXcgRmlsZShhcHBCYXNlLCBwYXRobmFtZSk7CisgICAgICAgIGlmIChkb2NCYXNlLmV4aXN0cygpKSB7CisgICAgICAgICAgICAvLyBXYXIgZmlsZSBpcyBhbHJlYWR5IGluc3RhbGxlZAorICAgICAgICAgICAgcmV0dXJuIChkb2NCYXNlLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENyZWF0ZSB0aGUgbmV3IGRvY3VtZW50IGJhc2UgZGlyZWN0b3J5CisgICAgICAgIGRvY0Jhc2UubWtkaXIoKTsKKworICAgICAgICAvLyBFeHBhbmQgdGhlIFdBUiBpbnRvIHRoZSBuZXcgZG9jdW1lbnQgYmFzZSBkaXJlY3RvcnkKKyAgICAgICAgSmFyVVJMQ29ubmVjdGlvbiBqdWMgPSAoSmFyVVJMQ29ubmVjdGlvbikgd2FyLm9wZW5Db25uZWN0aW9uKCk7CisgICAgICAgIGp1Yy5zZXRVc2VDYWNoZXMoZmFsc2UpOworICAgICAgICBKYXJGaWxlIGphckZpbGUgPSBudWxsOworICAgICAgICBJbnB1dFN0cmVhbSBpbnB1dCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBqYXJGaWxlID0ganVjLmdldEphckZpbGUoKTsKKyAgICAgICAgICAgIEVudW1lcmF0aW9uIGphckVudHJpZXMgPSBqYXJGaWxlLmVudHJpZXMoKTsKKyAgICAgICAgICAgIHdoaWxlIChqYXJFbnRyaWVzLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgSmFyRW50cnkgamFyRW50cnkgPSAoSmFyRW50cnkpIGphckVudHJpZXMubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGphckVudHJ5LmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICBpbnQgbGFzdCA9IG5hbWUubGFzdEluZGV4T2YoJy8nKTsKKyAgICAgICAgICAgICAgICBpZiAobGFzdCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIEZpbGUgcGFyZW50ID0gbmV3IEZpbGUoZG9jQmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLnN1YnN0cmluZygwLCBsYXN0KSk7CisgICAgICAgICAgICAgICAgICAgIHBhcmVudC5ta2RpcnMoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG5hbWUuZW5kc1dpdGgoIi8iKSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW5wdXQgPSBqYXJGaWxlLmdldElucHV0U3RyZWFtKGphckVudHJ5KTsKKyAgICAgICAgICAgICAgICBleHBhbmQoaW5wdXQsIGRvY0Jhc2UsIG5hbWUpOworICAgICAgICAgICAgICAgIGlucHV0LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgaW5wdXQgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBJZiBzb21ldGhpbmcgd2VudCB3cm9uZywgZGVsZXRlIGV4cGFuZGVkIGRpciB0byBrZWVwIHRoaW5ncyAKKyAgICAgICAgICAgIC8vIGNsZWFuCisgICAgICAgICAgICBkZWxldGVEaXIoZG9jQmFzZSk7CisgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKGlucHV0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpbnB1dC5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW5wdXQgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGphckZpbGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGphckZpbGUuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGphckZpbGUgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gUmV0dXJuIHRoZSBhYnNvbHV0ZSBwYXRoIHRvIG91ciBuZXcgZG9jdW1lbnQgYmFzZSBkaXJlY3RvcnkKKyAgICAgICAgcmV0dXJuIChkb2NCYXNlLmdldEFic29sdXRlUGF0aCgpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29weSB0aGUgc3BlY2lmaWVkIGZpbGUgb3IgZGlyZWN0b3J5IHRvIHRoZSBkZXN0aW5hdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzcmMgRmlsZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBzb3VyY2UKKyAgICAgKiBAcGFyYW0gZGVzdCBGaWxlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGRlc3RpbmF0aW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGNvcHkoRmlsZSBzcmMsIEZpbGUgZGVzdCkgeworICAgICAgICByZXR1cm4gY29weUludGVybmFsKHNyYywgZGVzdCwgbmV3IGJ5dGVbNDA5Nl0pOworICAgIH0KKworICAgIAorICAgIC8qKgorICAgICAqIENvcHkgdGhlIHNwZWNpZmllZCBmaWxlIG9yIGRpcmVjdG9yeSB0byB0aGUgZGVzdGluYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3JjIEZpbGUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgc291cmNlCisgICAgICogQHBhcmFtIGRlc3QgRmlsZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBkZXN0aW5hdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb3B5SW50ZXJuYWwoRmlsZSBzcmMsIEZpbGUgZGVzdCwgYnl0ZVtdIGJ1ZikgeworICAgICAgICAKKyAgICAgICAgYm9vbGVhbiByZXN1bHQgPSB0cnVlOworICAgICAgICAKKyAgICAgICAgU3RyaW5nIGZpbGVzW10gPSBudWxsOworICAgICAgICBpZiAoc3JjLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgIGZpbGVzID0gc3JjLmxpc3QoKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IGRlc3QubWtkaXIoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZpbGVzID0gbmV3IFN0cmluZ1sxXTsKKyAgICAgICAgICAgIGZpbGVzWzBdID0gIiI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZpbGVzID09IG51bGwpIHsKKyAgICAgICAgICAgIGZpbGVzID0gbmV3IFN0cmluZ1swXTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgKGkgPCBmaWxlcy5sZW5ndGgpICYmIHJlc3VsdDsgaSsrKSB7CisgICAgICAgICAgICBGaWxlIGZpbGVTcmMgPSBuZXcgRmlsZShzcmMsIGZpbGVzW2ldKTsKKyAgICAgICAgICAgIEZpbGUgZmlsZURlc3QgPSBuZXcgRmlsZShkZXN0LCBmaWxlc1tpXSk7CisgICAgICAgICAgICBpZiAoZmlsZVNyYy5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gY29weUludGVybmFsKGZpbGVTcmMsIGZpbGVEZXN0LCBidWYpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBGaWxlSW5wdXRTdHJlYW0gaXMgPSBudWxsOworICAgICAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gb3MgPSBudWxsOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlU3JjKTsKKyAgICAgICAgICAgICAgICAgICAgb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlRGVzdCk7CisgICAgICAgICAgICAgICAgICAgIGludCBsZW4gPSAwOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gaXMucmVhZChidWYpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxlbiA9PSAtMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9zLndyaXRlKGJ1ZiwgMCwgbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAob3MgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBEZWxldGUgdGhlIHNwZWNpZmllZCBkaXJlY3RvcnksIGluY2x1ZGluZyBhbGwgb2YgaXRzIGNvbnRlbnRzIGFuZAorICAgICAqIHN1YmRpcmVjdG9yaWVzIHJlY3Vyc2l2ZWx5LgorICAgICAqCisgICAgICogQHBhcmFtIGRpciBGaWxlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGRpcmVjdG9yeSB0byBiZSBkZWxldGVkCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGRlbGV0ZShGaWxlIGRpcikgeworICAgICAgICBpZiAoZGlyLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBkZWxldGVEaXIoZGlyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBkaXIuZGVsZXRlKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogRGVsZXRlIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5LCBpbmNsdWRpbmcgYWxsIG9mIGl0cyBjb250ZW50cyBhbmQKKyAgICAgKiBzdWJkaXJlY3RvcmllcyByZWN1cnNpdmVseS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkaXIgRmlsZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBkaXJlY3RvcnkgdG8gYmUgZGVsZXRlZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBkZWxldGVEaXIoRmlsZSBkaXIpIHsKKworICAgICAgICBTdHJpbmcgZmlsZXNbXSA9IGRpci5saXN0KCk7CisgICAgICAgIGlmIChmaWxlcyA9PSBudWxsKSB7CisgICAgICAgICAgICBmaWxlcyA9IG5ldyBTdHJpbmdbMF07CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoZGlyLCBmaWxlc1tpXSk7CisgICAgICAgICAgICBpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICAgICAgZGVsZXRlRGlyKGZpbGUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmaWxlLmRlbGV0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBkaXIuZGVsZXRlKCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEV4cGFuZCB0aGUgc3BlY2lmaWVkIGlucHV0IHN0cmVhbSBpbnRvIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5LCBjcmVhdGluZworICAgICAqIGEgZmlsZSBuYW1lZCBmcm9tIHRoZSBzcGVjaWZpZWQgcmVsYXRpdmUgcGF0aC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnB1dCBJbnB1dFN0cmVhbSB0byBiZSBjb3BpZWQKKyAgICAgKiBAcGFyYW0gZG9jQmFzZSBEb2N1bWVudCBiYXNlIGRpcmVjdG9yeSBpbnRvIHdoaWNoIHdlIGFyZSBleHBhbmRpbmcKKyAgICAgKiBAcGFyYW0gbmFtZSBSZWxhdGl2ZSBwYXRobmFtZSBvZiB0aGUgZmlsZSB0byBiZSBjcmVhdGVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgZXhwYW5kKElucHV0U3RyZWFtIGlucHV0LCBGaWxlIGRvY0Jhc2UsIFN0cmluZyBuYW1lKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGRvY0Jhc2UsIG5hbWUpOworICAgICAgICBCdWZmZXJlZE91dHB1dFN0cmVhbSBvdXRwdXQgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgb3V0cHV0ID0gCisgICAgICAgICAgICAgICAgbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpKTsKKyAgICAgICAgICAgIGJ5dGUgYnVmZmVyW10gPSBuZXcgYnl0ZVsyMDQ4XTsKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgICAgaW50IG4gPSBpbnB1dC5yZWFkKGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgaWYgKG4gPD0gMCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgb3V0cHV0LndyaXRlKGJ1ZmZlciwgMCwgbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAob3V0cHV0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBvdXRwdXQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdGFydHVwL0hvbWVzVXNlckRhdGFiYXNlLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9Ib21lc1VzZXJEYXRhYmFzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmOTkxYjMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9Ib21lc1VzZXJEYXRhYmFzZS5qYXZhCkBAIC0wLDAgKzEsMTQzIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0YXJ0dXA7CisKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKKworCisvKioKKyAqIENvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIHRoZSA8c3Ryb25nPlVzZXJEYXRhYmFzZTwvY29kZT4gaW50ZXJmYWNlCisgKiBjb25zaWRlcnMgYWxsIGRpcmVjdG9yaWVzIGluIGEgZGlyZWN0b3J5IHdob3NlIHBhdGhuYW1lIGlzIHNwZWNpZmllZAorICogdG8gb3VyIGNvbnN0cnVjdG9yIHRvIGJlICJob21lIiBkaXJlY3RvcmllcyBmb3IgdGhvc2UgdXNlcnMuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBIb21lc1VzZXJEYXRhYmFzZQorICAgIGltcGxlbWVudHMgVXNlckRhdGFiYXNlIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgdXNlciBkYXRhYmFzZSBjb21wb25lbnQuCisgICAgICovCisgICAgcHVibGljIEhvbWVzVXNlckRhdGFiYXNlKCkgeworCisgICAgICAgIHN1cGVyKCk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIHNldCBvZiBob21lIGRpcmVjdG9yaWVzIGZvciBhbGwgZGVmaW5lZCB1c2Vycywga2V5ZWQgYnkgdXNlcm5hbWUuCisgICAgICovCisgICAgcHJpdmF0ZSBIYXNodGFibGUgaG9tZXMgPSBuZXcgSGFzaHRhYmxlKCk7CisKKworICAgIC8qKgorICAgICAqIFRoZSBVc2VyQ29uZmlnIGxpc3RlbmVyIHdpdGggd2hpY2ggd2UgYXJlIGFzc29jaWF0ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBVc2VyQ29uZmlnIHVzZXJDb25maWcgPSBudWxsOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgVXNlckNvbmZpZyBsaXN0ZW5lciB3aXRoIHdoaWNoIHdlIGFyZSBhc3NvY2lhdGVkLgorICAgICAqLworICAgIHB1YmxpYyBVc2VyQ29uZmlnIGdldFVzZXJDb25maWcoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLnVzZXJDb25maWcpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIFVzZXJDb25maWcgbGlzdGVuZXIgd2l0aCB3aGljaCB3ZSBhcmUgYXNzb2NpYXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1c2VyQ29uZmlnIFRoZSBuZXcgVXNlckNvbmZpZyBsaXN0ZW5lcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVzZXJDb25maWcoVXNlckNvbmZpZyB1c2VyQ29uZmlnKSB7CisKKyAgICAgICAgdGhpcy51c2VyQ29uZmlnID0gdXNlckNvbmZpZzsKKyAgICAgICAgaW5pdCgpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhbiBhYnNvbHV0ZSBwYXRobmFtZSB0byB0aGUgaG9tZSBkaXJlY3RvcnkgZm9yIHRoZSBzcGVjaWZpZWQgdXNlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1c2VyIFVzZXIgZm9yIHdoaWNoIGEgaG9tZSBkaXJlY3Rvcnkgc2hvdWxkIGJlIHJldHJpZXZlZAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SG9tZShTdHJpbmcgdXNlcikgeworCisgICAgICAgIHJldHVybiAoKFN0cmluZykgaG9tZXMuZ2V0KHVzZXIpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGFuIGVudW1lcmF0aW9uIG9mIHRoZSB1c2VybmFtZXMgZGVmaW5lZCBvbiB0aGlzIHNlcnZlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0VXNlcnMoKSB7CisKKyAgICAgICAgcmV0dXJuIChob21lcy5rZXlzKCkpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJpdmF0ZSBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemUgb3VyIHNldCBvZiB1c2VycyBhbmQgaG9tZSBkaXJlY3Rvcmllcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgaW5pdCgpIHsKKworICAgICAgICBTdHJpbmcgaG9tZUJhc2UgPSB1c2VyQ29uZmlnLmdldEhvbWVCYXNlKCk7CisgICAgICAgIEZpbGUgaG9tZUJhc2VEaXIgPSBuZXcgRmlsZShob21lQmFzZSk7CisgICAgICAgIGlmICghaG9tZUJhc2VEaXIuZXhpc3RzKCkgfHwgIWhvbWVCYXNlRGlyLmlzRGlyZWN0b3J5KCkpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIFN0cmluZyBob21lQmFzZUZpbGVzW10gPSBob21lQmFzZURpci5saXN0KCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBob21lQmFzZUZpbGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBGaWxlIGhvbWVEaXIgPSBuZXcgRmlsZShob21lQmFzZURpciwgaG9tZUJhc2VGaWxlc1tpXSk7CisgICAgICAgICAgICBpZiAoIWhvbWVEaXIuaXNEaXJlY3RvcnkoKSB8fCAhaG9tZURpci5jYW5SZWFkKCkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBob21lcy5wdXQoaG9tZUJhc2VGaWxlc1tpXSwgaG9tZURpci50b1N0cmluZygpKTsKKyAgICAgICAgfQorCisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvSG9zdENvbmZpZy5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvSG9zdENvbmZpZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyMzcyODYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9Ib3N0Q29uZmlnLmphdmEKQEAgLTAsMCArMSwxMjY3IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0YXJ0dXA7CisKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuamFyLkphckVudHJ5OworaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRmlsZTsKKworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGFpbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkVuZ2luZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkhvc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVFdmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZUxpc3RlbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5Db250YWluZXJCYXNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZEhvc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLlN0cmluZ01hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLm1vZGVsZXIuUmVnaXN0cnk7CitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5kaWdlc3Rlci5EaWdlc3RlcjsKKworCisvKioKKyAqIFN0YXJ0dXAgZXZlbnQgbGlzdGVuZXIgZm9yIGEgPGI+SG9zdDwvYj4gdGhhdCBjb25maWd1cmVzIHRoZSBwcm9wZXJ0aWVzCisgKiBvZiB0aGF0IEhvc3QsIGFuZCB0aGUgYXNzb2NpYXRlZCBkZWZpbmVkIGNvbnRleHRzLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQGF1dGhvciBSZW15IE1hdWNoZXJhdAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgSG9zdENvbmZpZworICAgIGltcGxlbWVudHMgTGlmZWN5Y2xlTGlzdGVuZXIgeworICAgIAorICAgIHByb3RlY3RlZCBzdGF0aWMgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGxvZz0KKyAgICAgICAgIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3RvcnkuZ2V0TG9nKCBIb3N0Q29uZmlnLmNsYXNzICk7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogQXBwIGJhc2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIEZpbGUgYXBwQmFzZSA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIENvbmZpZyBiYXNlLgorICAgICAqLworICAgIHByb3RlY3RlZCBGaWxlIGNvbmZpZ0Jhc2UgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgSmF2YSBjbGFzcyBuYW1lIG9mIHRoZSBDb250ZXh0IGNvbmZpZ3VyYXRpb24gY2xhc3Mgd2Ugc2hvdWxkIHVzZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGNvbmZpZ0NsYXNzID0gIm9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cC5Db250ZXh0Q29uZmlnIjsKKworCisgICAgLyoqCisgICAgICogVGhlIEphdmEgY2xhc3MgbmFtZSBvZiB0aGUgQ29udGV4dCBpbXBsZW1lbnRhdGlvbiB3ZSBzaG91bGQgdXNlLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgY29udGV4dENsYXNzID0gIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZENvbnRleHQiOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgSG9zdCB3ZSBhcmUgYXNzb2NpYXRlZCB3aXRoLgorICAgICAqLworICAgIHByb3RlY3RlZCBIb3N0IGhvc3QgPSBudWxsOworCisgICAgCisgICAgLyoqCisgICAgICogVGhlIEpNWCBPYmplY3ROYW1lIG9mIHRoaXMgY29tcG9uZW50LgorICAgICAqLworICAgIHByb3RlY3RlZCBPYmplY3ROYW1lIG9uYW1lID0gbnVsbDsKKyAgICAKKworICAgIC8qKgorICAgICAqIFRoZSBzdHJpbmcgcmVzb3VyY2VzIGZvciB0aGlzIHBhY2thZ2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdNYW5hZ2VyIHNtID0KKyAgICAgICAgU3RyaW5nTWFuYWdlci5nZXRNYW5hZ2VyKENvbnN0YW50cy5QYWNrYWdlKTsKKworCisgICAgLyoqCisgICAgICogU2hvdWxkIHdlIGRlcGxveSBYTUwgQ29udGV4dCBjb25maWcgZmlsZXM/CisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gZGVwbG95WE1MID0gZmFsc2U7CisKKworICAgIC8qKgorICAgICAqIFNob3VsZCB3ZSB1bnBhY2sgV0FSIGZpbGVzIHdoZW4gYXV0by1kZXBsb3lpbmcgYXBwbGljYXRpb25zIGluIHRoZQorICAgICAqIDxjb2RlPmFwcEJhc2U8L2NvZGU+IGRpcmVjdG9yeT8KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiB1bnBhY2tXQVJzID0gZmFsc2U7CisKKworICAgIC8qKgorICAgICAqIE1hcCBvZiBkZXBsb3llZCBhcHBsaWNhdGlvbnMuCisgICAgICovCisgICAgcHJvdGVjdGVkIEhhc2hNYXAgZGVwbG95ZWQgPSBuZXcgSGFzaE1hcCgpOworCisgICAgCisgICAgLyoqCisgICAgICogTGlzdCBvZiBhcHBsaWNhdGlvbnMgd2hpY2ggYXJlIGJlaW5nIHNlcnZpY2VkLCBhbmQgc2hvdWxkbid0IGJlIAorICAgICAqIGRlcGxveWVkL3VuZGVwbG95ZWQvcmVkZXBsb3llZCBhdCB0aGUgbW9tZW50LgorICAgICAqLworICAgIHByb3RlY3RlZCBBcnJheUxpc3Qgc2VydmljZWQgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgCisKKyAgICAvKioKKyAgICAgKiBBdHRyaWJ1dGUgdmFsdWUgdXNlZCB0byB0dXJuIG9uL29mZiBYTUwgdmFsaWRhdGlvbgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIHhtbFZhbGlkYXRpb24gPSBmYWxzZTsKKworCisgICAgLyoqCisgICAgICogQXR0cmlidXRlIHZhbHVlIHVzZWQgdG8gdHVybiBvbi9vZmYgWE1MIG5hbWVzcGFjZSBhd2FyZW5lcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiB4bWxOYW1lc3BhY2VBd2FyZSA9IGZhbHNlOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgPGNvZGU+RGlnZXN0ZXI8L2NvZGU+IGluc3RhbmNlIHVzZWQgdG8gcGFyc2UgY29udGV4dCBkZXNjcmlwdG9ycy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIERpZ2VzdGVyIGRpZ2VzdGVyID0gY3JlYXRlRGlnZXN0ZXIoKTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgQ29udGV4dCBjb25maWd1cmF0aW9uIGNsYXNzIG5hbWUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDb25maWdDbGFzcygpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMuY29uZmlnQ2xhc3MpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIENvbnRleHQgY29uZmlndXJhdGlvbiBjbGFzcyBuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbmZpZ0NsYXNzIFRoZSBuZXcgQ29udGV4dCBjb25maWd1cmF0aW9uIGNsYXNzIG5hbWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29uZmlnQ2xhc3MoU3RyaW5nIGNvbmZpZ0NsYXNzKSB7CisKKyAgICAgICAgdGhpcy5jb25maWdDbGFzcyA9IGNvbmZpZ0NsYXNzOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIENvbnRleHQgaW1wbGVtZW50YXRpb24gY2xhc3MgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRleHRDbGFzcygpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMuY29udGV4dENsYXNzKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBDb250ZXh0IGltcGxlbWVudGF0aW9uIGNsYXNzIG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dENsYXNzIFRoZSBuZXcgQ29udGV4dCBpbXBsZW1lbnRhdGlvbiBjbGFzcyBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbnRleHRDbGFzcyhTdHJpbmcgY29udGV4dENsYXNzKSB7CisKKyAgICAgICAgdGhpcy5jb250ZXh0Q2xhc3MgPSBjb250ZXh0Q2xhc3M7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZGVwbG95IFhNTCBjb25maWcgZmlsZSBmbGFnIGZvciB0aGlzIGNvbXBvbmVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0RlcGxveVhNTCgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMuZGVwbG95WE1MKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBkZXBsb3kgWE1MIGNvbmZpZyBmaWxlIGZsYWcgZm9yIHRoaXMgY29tcG9uZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGRlcGxveVhNTCBUaGUgbmV3IGRlcGxveSBYTUwgZmxhZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERlcGxveVhNTChib29sZWFuIGRlcGxveVhNTCkgeworCisgICAgICAgIHRoaXMuZGVwbG95WE1MPSBkZXBsb3lYTUw7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdW5wYWNrIFdBUnMgZmxhZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1VucGFja1dBUnMoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLnVucGFja1dBUnMpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHVucGFjayBXQVJzIGZsYWcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdW5wYWNrV0FScyBUaGUgbmV3IHVucGFjayBXQVJzIGZsYWcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVbnBhY2tXQVJzKGJvb2xlYW4gdW5wYWNrV0FScykgeworCisgICAgICAgIHRoaXMudW5wYWNrV0FScyA9IHVucGFja1dBUnM7CisKKyAgICB9CisgICAgCisgICAgCisgICAgIC8qKgorICAgICAqIFNldCB0aGUgdmFsaWRhdGlvbiBmZWF0dXJlIG9mIHRoZSBYTUwgcGFyc2VyIHVzZWQgd2hlbgorICAgICAqIHBhcnNpbmcgeG1sIGluc3RhbmNlcy4KKyAgICAgKiBAcGFyYW0geG1sVmFsaWRhdGlvbiB0cnVlIHRvIGVuYWJsZSB4bWwgaW5zdGFuY2UgdmFsaWRhdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFhtbFZhbGlkYXRpb24oYm9vbGVhbiB4bWxWYWxpZGF0aW9uKXsKKyAgICAgICAgdGhpcy54bWxWYWxpZGF0aW9uID0geG1sVmFsaWRhdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHNlcnZlci54bWwgPGhvc3Q+IGF0dHJpYnV0ZSdzIHhtbFZhbGlkYXRpb24uCisgICAgICogQHJldHVybiB0cnVlIGlmIHZhbGlkYXRpb24gaXMgZW5hYmxlZC4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldFhtbFZhbGlkYXRpb24oKXsKKyAgICAgICAgcmV0dXJuIHhtbFZhbGlkYXRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBzZXJ2ZXIueG1sIDxob3N0PiBhdHRyaWJ1dGUncyB4bWxOYW1lc3BhY2VBd2FyZS4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgbmFtZXNwYWNlIGF3YXJlbmVzIGlzIGVuYWJsZWQuCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRYbWxOYW1lc3BhY2VBd2FyZSgpeworICAgICAgICByZXR1cm4geG1sTmFtZXNwYWNlQXdhcmU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG5hbWVzcGFjZSBhd2FyZSBmZWF0dXJlIG9mIHRoZSBYTUwgcGFyc2VyIHVzZWQgd2hlbgorICAgICAqIHBhcnNpbmcgeG1sIGluc3RhbmNlcy4KKyAgICAgKiBAcGFyYW0geG1sTmFtZXNwYWNlQXdhcmUgdHJ1ZSB0byBlbmFibGUgbmFtZXNwYWNlIGF3YXJlbmVzcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFhtbE5hbWVzcGFjZUF3YXJlKGJvb2xlYW4geG1sTmFtZXNwYWNlQXdhcmUpeworICAgICAgICB0aGlzLnhtbE5hbWVzcGFjZUF3YXJlPXhtbE5hbWVzcGFjZUF3YXJlOworICAgIH0gICAgCisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBTVEFSVCBldmVudCBmb3IgYW4gYXNzb2NpYXRlZCBIb3N0LgorICAgICAqCisgICAgICogQHBhcmFtIGV2ZW50IFRoZSBsaWZlY3ljbGUgZXZlbnQgdGhhdCBoYXMgb2NjdXJyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBsaWZlY3ljbGVFdmVudChMaWZlY3ljbGVFdmVudCBldmVudCkgeworCisgICAgICAgIGlmIChldmVudC5nZXRUeXBlKCkuZXF1YWxzKCJjaGVjayIpKQorICAgICAgICAgICAgY2hlY2soKTsKKworICAgICAgICAvLyBJZGVudGlmeSB0aGUgaG9zdCB3ZSBhcmUgYXNzb2NpYXRlZCB3aXRoCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBob3N0ID0gKEhvc3QpIGV2ZW50LmdldExpZmVjeWNsZSgpOworICAgICAgICAgICAgaWYgKGhvc3QgaW5zdGFuY2VvZiBTdGFuZGFyZEhvc3QpIHsKKyAgICAgICAgICAgICAgICBzZXREZXBsb3lYTUwoKChTdGFuZGFyZEhvc3QpIGhvc3QpLmlzRGVwbG95WE1MKCkpOworICAgICAgICAgICAgICAgIHNldFVucGFja1dBUnMoKChTdGFuZGFyZEhvc3QpIGhvc3QpLmlzVW5wYWNrV0FScygpKTsKKyAgICAgICAgICAgICAgICBzZXRYbWxOYW1lc3BhY2VBd2FyZSgoKFN0YW5kYXJkSG9zdCkgaG9zdCkuZ2V0WG1sTmFtZXNwYWNlQXdhcmUoKSk7CisgICAgICAgICAgICAgICAgc2V0WG1sVmFsaWRhdGlvbigoKFN0YW5kYXJkSG9zdCkgaG9zdCkuZ2V0WG1sVmFsaWRhdGlvbigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcihzbS5nZXRTdHJpbmcoImhvc3RDb25maWcuY2NlIiwgZXZlbnQuZ2V0TGlmZWN5Y2xlKCkpLCBlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFByb2Nlc3MgdGhlIGV2ZW50IHRoYXQgaGFzIG9jY3VycmVkCisgICAgICAgIGlmIChldmVudC5nZXRUeXBlKCkuZXF1YWxzKExpZmVjeWNsZS5TVEFSVF9FVkVOVCkpCisgICAgICAgICAgICBzdGFydCgpOworICAgICAgICBlbHNlIGlmIChldmVudC5nZXRUeXBlKCkuZXF1YWxzKExpZmVjeWNsZS5TVE9QX0VWRU5UKSkKKyAgICAgICAgICAgIHN0b3AoKTsKKworICAgIH0KKworICAgIAorICAgIC8qKgorICAgICAqIEFkZCBhIHNlcnZpY2VkIGFwcGxpY2F0aW9uIHRvIHRoZSBsaXN0LgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRTZXJ2aWNlZChTdHJpbmcgbmFtZSkgeworICAgICAgICBzZXJ2aWNlZC5hZGQobmFtZSk7CisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIElzIGFwcGxpY2F0aW9uIHNlcnZpY2VkID8KKyAgICAgKiBAcmV0dXJuIHN0YXRlIG9mIHRoZSBhcHBsaWNhdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc1NlcnZpY2VkKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHJldHVybiAoc2VydmljZWQuY29udGFpbnMobmFtZSkpOworICAgIH0KKyAgICAKKworICAgIC8qKgorICAgICAqIFJlbW92ZWQgYSBzZXJ2aWNlZCBhcHBsaWNhdGlvbiBmcm9tIHRoZSBsaXN0LgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVTZXJ2aWNlZChTdHJpbmcgbmFtZSkgeworICAgICAgICBzZXJ2aWNlZC5yZW1vdmUobmFtZSk7CisgICAgfQorCisgICAgCisgICAgLyoqCisgICAgICogR2V0IHRoZSBpbnN0YW50IHdoZXJlIGFuIGFwcGxpY2F0aW9uIHdhcyBkZXBsb3llZC4KKyAgICAgKiBAcmV0dXJuIDBMIGlmIG5vIGFwcGxpY2F0aW9uIHdpdGggdGhhdCBuYW1lIGlzIGRlcGxveWVkLCBvciB0aGUgaW5zdGFudAorICAgICAqIG9uIHdoaWNoIHRoZSBhcHBsaWNhdGlvbiB3YXMgZGVwbG95ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXREZXBsb3ltZW50VGltZShTdHJpbmcgbmFtZSkgeworICAgIAlEZXBsb3llZEFwcGxpY2F0aW9uIGFwcCA9IChEZXBsb3llZEFwcGxpY2F0aW9uKSBkZXBsb3llZC5nZXQobmFtZSk7CisgICAgCWlmIChhcHAgPT0gbnVsbCkgeworICAgIAkJcmV0dXJuIDBMOworICAgIAl9IGVsc2UgeworICAgIAkJcmV0dXJuIGFwcC50aW1lc3RhbXA7CisgICAgCX0KKyAgICB9CisgICAgCisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3RlY3RlZCBNZXRob2RzCisKKyAgICAKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgdGhlIGRpZ2VzdGVyIHdoaWNoIHdpbGwgYmUgdXNlZCB0byBwYXJzZSBjb250ZXh0IGNvbmZpZyBmaWxlcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIERpZ2VzdGVyIGNyZWF0ZURpZ2VzdGVyKCkgeworICAgICAgICBEaWdlc3RlciBkaWdlc3RlciA9IG5ldyBEaWdlc3RlcigpOworICAgICAgICBkaWdlc3Rlci5zZXRWYWxpZGF0aW5nKGZhbHNlKTsKKyAgICAgICAgLy8gQWRkIG9iamVjdCBjcmVhdGlvbiBydWxlCisgICAgICAgIGRpZ2VzdGVyLmFkZE9iamVjdENyZWF0ZSgiQ29udGV4dCIsICJvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRDb250ZXh0IiwKKyAgICAgICAgICAgICJjbGFzc05hbWUiKTsKKyAgICAgICAgLy8gU2V0IHRoZSBwcm9wZXJ0aWVzIG9uIHRoYXQgb2JqZWN0IChpdCBkb2Vzbid0IG1hdHRlciBpZiBleHRyYSAKKyAgICAgICAgLy8gcHJvcGVydGllcyBhcmUgc2V0KQorICAgICAgICBkaWdlc3Rlci5hZGRTZXRQcm9wZXJ0aWVzKCJDb250ZXh0Iik7CisgICAgICAgIHJldHVybiAoZGlnZXN0ZXIpOworICAgIH0KKyAgICAKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIEZpbGUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgImFwcGxpY2F0aW9uIHJvb3QiIGRpcmVjdG9yeQorICAgICAqIGZvciBvdXIgYXNzb2NpYXRlZCBIb3N0LgorICAgICAqLworICAgIHByb3RlY3RlZCBGaWxlIGFwcEJhc2UoKSB7CisKKyAgICAgICAgaWYgKGFwcEJhc2UgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGFwcEJhc2U7CisgICAgICAgIH0KKworICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShob3N0LmdldEFwcEJhc2UoKSk7CisgICAgICAgIGlmICghZmlsZS5pc0Fic29sdXRlKCkpCisgICAgICAgICAgICBmaWxlID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJjYXRhbGluYS5iYXNlIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdC5nZXRBcHBCYXNlKCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYXBwQmFzZSA9IGZpbGUuZ2V0Q2Fub25pY2FsRmlsZSgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhcHBCYXNlID0gZmlsZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKGFwcEJhc2UpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBGaWxlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlICJjb25maWd1cmF0aW9uIHJvb3QiIGRpcmVjdG9yeQorICAgICAqIGZvciBvdXIgYXNzb2NpYXRlZCBIb3N0LgorICAgICAqLworICAgIHByb3RlY3RlZCBGaWxlIGNvbmZpZ0Jhc2UoKSB7CisKKyAgICAgICAgaWYgKGNvbmZpZ0Jhc2UgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGNvbmZpZ0Jhc2U7CisgICAgICAgIH0KKworICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImNhdGFsaW5hLmJhc2UiKSwgImNvbmYiKTsKKyAgICAgICAgQ29udGFpbmVyIHBhcmVudCA9IGhvc3QuZ2V0UGFyZW50KCk7CisgICAgICAgIGlmICgocGFyZW50ICE9IG51bGwpICYmIChwYXJlbnQgaW5zdGFuY2VvZiBFbmdpbmUpKSB7CisgICAgICAgICAgICBmaWxlID0gbmV3IEZpbGUoZmlsZSwgcGFyZW50LmdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgZmlsZSA9IG5ldyBGaWxlKGZpbGUsIGhvc3QuZ2V0TmFtZSgpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNvbmZpZ0Jhc2UgPSBmaWxlLmdldENhbm9uaWNhbEZpbGUoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgY29uZmlnQmFzZSA9IGZpbGU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChjb25maWdCYXNlKTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbmFtZSBvZiB0aGUgY29uZmlnQmFzZS4KKyAgICAgKiBGb3IgdXNlIHdpdGggSk1YIG1hbmFnZW1lbnQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDb25maWdCYXNlTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIGNvbmZpZ0Jhc2UoKS5nZXRBYnNvbHV0ZVBhdGgoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHaXZlbiBhIGNvbnRleHQgcGF0aCwgZ2V0IHRoZSBjb25maWcgZmlsZSBuYW1lLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q29uZmlnRmlsZShTdHJpbmcgcGF0aCkgeworICAgICAgICBTdHJpbmcgYmFzZW5hbWUgPSBudWxsOworICAgICAgICBpZiAocGF0aC5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICBiYXNlbmFtZSA9ICJST09UIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJhc2VuYW1lID0gcGF0aC5zdWJzdHJpbmcoMSkucmVwbGFjZSgnLycsICcjJyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChiYXNlbmFtZSk7CisgICAgfQorCisgICAgCisgICAgLyoqCisgICAgICogR2l2ZW4gYSBjb250ZXh0IHBhdGgsIGdldCB0aGUgY29uZmlnIGZpbGUgbmFtZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldERvY0Jhc2UoU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgU3RyaW5nIGJhc2VuYW1lID0gbnVsbDsKKyAgICAgICAgaWYgKHBhdGguZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgYmFzZW5hbWUgPSAiUk9PVCI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBiYXNlbmFtZSA9IHBhdGguc3Vic3RyaW5nKDEpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoYmFzZW5hbWUpOworICAgIH0KKworICAgIAorICAgIC8qKgorICAgICAqIERlcGxveSBhcHBsaWNhdGlvbnMgZm9yIGFueSBkaXJlY3RvcmllcyBvciBXQVIgZmlsZXMgdGhhdCBhcmUgZm91bmQKKyAgICAgKiBpbiBvdXIgImFwcGxpY2F0aW9uIHJvb3QiIGRpcmVjdG9yeS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBkZXBsb3lBcHBzKCkgeworCisgICAgICAgIEZpbGUgYXBwQmFzZSA9IGFwcEJhc2UoKTsKKyAgICAgICAgRmlsZSBjb25maWdCYXNlID0gY29uZmlnQmFzZSgpOworICAgICAgICAvLyBEZXBsb3kgWE1MIGRlc2NyaXB0b3JzIGZyb20gY29uZmlnQmFzZQorICAgICAgICBkZXBsb3lEZXNjcmlwdG9ycyhjb25maWdCYXNlLCBjb25maWdCYXNlLmxpc3QoKSk7CisgICAgICAgIC8vIERlcGxveSBXQVJzLCBhbmQgbG9vcCBpZiBhZGRpdGlvbmFsIGRlc2NyaXB0b3JzIGFyZSBmb3VuZAorICAgICAgICBkZXBsb3lXQVJzKGFwcEJhc2UsIGFwcEJhc2UubGlzdCgpKTsKKyAgICAgICAgLy8gRGVwbG95IGV4cGFuZGVkIGZvbGRlcnMKKyAgICAgICAgZGVwbG95RGlyZWN0b3JpZXMoYXBwQmFzZSwgYXBwQmFzZS5saXN0KCkpOworICAgICAgICAKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIERlcGxveSBhcHBsaWNhdGlvbnMgZm9yIGFueSBkaXJlY3RvcmllcyBvciBXQVIgZmlsZXMgdGhhdCBhcmUgZm91bmQKKyAgICAgKiBpbiBvdXIgImFwcGxpY2F0aW9uIHJvb3QiIGRpcmVjdG9yeS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBkZXBsb3lBcHBzKFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgRmlsZSBhcHBCYXNlID0gYXBwQmFzZSgpOworICAgICAgICBGaWxlIGNvbmZpZ0Jhc2UgPSBjb25maWdCYXNlKCk7CisgICAgICAgIFN0cmluZyBiYXNlTmFtZSA9IGdldENvbmZpZ0ZpbGUobmFtZSk7CisgICAgICAgIFN0cmluZyBkb2NCYXNlID0gZ2V0Q29uZmlnRmlsZShuYW1lKTsKKyAgICAgICAgCisgICAgICAgIC8vIERlcGxveSBYTUwgZGVzY3JpcHRvcnMgZnJvbSBjb25maWdCYXNlCisgICAgICAgIEZpbGUgeG1sID0gbmV3IEZpbGUoY29uZmlnQmFzZSwgYmFzZU5hbWUgKyAiLnhtbCIpOworICAgICAgICBpZiAoeG1sLmV4aXN0cygpKQorICAgICAgICAgICAgZGVwbG95RGVzY3JpcHRvcihuYW1lLCB4bWwsIGJhc2VOYW1lICsgIi54bWwiKTsKKyAgICAgICAgLy8gRGVwbG95IFdBUnMsIGFuZCBsb29wIGlmIGFkZGl0aW9uYWwgZGVzY3JpcHRvcnMgYXJlIGZvdW5kCisgICAgICAgIEZpbGUgd2FyID0gbmV3IEZpbGUoYXBwQmFzZSwgZG9jQmFzZSArICIud2FyIik7CisgICAgICAgIGlmICh3YXIuZXhpc3RzKCkpCisgICAgICAgICAgICBkZXBsb3lXQVIobmFtZSwgd2FyLCBkb2NCYXNlICsgIi53YXIiKTsKKyAgICAgICAgLy8gRGVwbG95IGV4cGFuZGVkIGZvbGRlcnMKKyAgICAgICAgRmlsZSBkaXIgPSBuZXcgRmlsZShhcHBCYXNlLCBkb2NCYXNlKTsKKyAgICAgICAgaWYgKGRpci5leGlzdHMoKSkKKyAgICAgICAgICAgIGRlcGxveURpcmVjdG9yeShuYW1lLCBkaXIsIGRvY0Jhc2UpOworICAgICAgICAKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIERlcGxveSBYTUwgY29udGV4dCBkZXNjcmlwdG9ycy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBkZXBsb3lEZXNjcmlwdG9ycyhGaWxlIGNvbmZpZ0Jhc2UsIFN0cmluZ1tdIGZpbGVzKSB7CisKKyAgICAgICAgaWYgKGZpbGVzID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7CisKKyAgICAgICAgICAgIGlmIChmaWxlc1tpXS5lcXVhbHNJZ25vcmVDYXNlKCJNRVRBLUlORiIpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKGZpbGVzW2ldLmVxdWFsc0lnbm9yZUNhc2UoIldFQi1JTkYiKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIEZpbGUgY29udGV4dFhtbCA9IG5ldyBGaWxlKGNvbmZpZ0Jhc2UsIGZpbGVzW2ldKTsKKyAgICAgICAgICAgIGlmIChmaWxlc1tpXS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCIueG1sIikpIHsKKworICAgICAgICAgICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgY29udGV4dCBwYXRoIGFuZCBtYWtlIHN1cmUgaXQgaXMgdW5pcXVlCisgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWVUbXAgPSBmaWxlc1tpXS5zdWJzdHJpbmcoMCwgZmlsZXNbaV0ubGVuZ3RoKCkgLSA0KTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgY29udGV4dFBhdGggPSAiLyIgKyBuYW1lVG1wLnJlcGxhY2UoJyMnLCAnLycpOworICAgICAgICAgICAgICAgIGlmIChuYW1lVG1wLmVxdWFscygiUk9PVCIpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRleHRQYXRoID0gIiI7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGlzU2VydmljZWQoY29udGV4dFBhdGgpKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZSA9IGZpbGVzW2ldOworCisgICAgICAgICAgICAgICAgZGVwbG95RGVzY3JpcHRvcihjb250ZXh0UGF0aCwgY29udGV4dFhtbCwgZmlsZSk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gY29udGV4dFBhdGgKKyAgICAgKiBAcGFyYW0gY29udGV4dFhtbAorICAgICAqIEBwYXJhbSBmaWxlCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZGVwbG95RGVzY3JpcHRvcihTdHJpbmcgY29udGV4dFBhdGgsIEZpbGUgY29udGV4dFhtbCwgU3RyaW5nIGZpbGUpIHsKKyAgICAgICAgRGVwbG95ZWRBcHBsaWNhdGlvbiBkZXBsb3llZEFwcCA9IG5ldyBEZXBsb3llZEFwcGxpY2F0aW9uKGNvbnRleHRQYXRoKTsKKyAgICAgICAgCisgICAgICAgIGlmIChkZXBsb3ltZW50RXhpc3RzKGNvbnRleHRQYXRoKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvLyBBc3N1bWUgdGhpcyBpcyBhIGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRvciBhbmQgZGVwbG95IGl0CisgICAgICAgIGxvZy5kZWJ1ZyhzbS5nZXRTdHJpbmcoImhvc3RDb25maWcuZGVwbG95RGVzY3JpcHRvciIsIGZpbGUpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENvbnRleHQgY29udGV4dCA9IG51bGw7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGRpZ2VzdGVyKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dCA9IChDb250ZXh0KSBkaWdlc3Rlci5wYXJzZShjb250ZXh0WG1sKTsKKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICBkaWdlc3Rlci5yZXNldCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjb250ZXh0IGluc3RhbmNlb2YgTGlmZWN5Y2xlKSB7CisgICAgICAgICAgICAgICAgQ2xhc3MgY2xhenogPSBDbGFzcy5mb3JOYW1lKGhvc3QuZ2V0Q29uZmlnQ2xhc3MoKSk7CisgICAgICAgICAgICAgICAgTGlmZWN5Y2xlTGlzdGVuZXIgbGlzdGVuZXIgPQorICAgICAgICAgICAgICAgICAgICAoTGlmZWN5Y2xlTGlzdGVuZXIpIGNsYXp6Lm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICAgICAgKChMaWZlY3ljbGUpIGNvbnRleHQpLmFkZExpZmVjeWNsZUxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRleHQuc2V0Q29uZmlnRmlsZShjb250ZXh0WG1sLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgICAgIGNvbnRleHQuc2V0UGF0aChjb250ZXh0UGF0aCk7CisgICAgICAgICAgICAvLyBBZGQgdGhlIGNvbnRleHQgWE1MIHRvIHRoZSBsaXN0IG9mIHdhdGNoZWQgZmlsZXMKKyAgICAgICAgICAgIGRlcGxveWVkQXBwLnJlbG9hZFJlc291cmNlcy5wdXQKKyAgICAgICAgICAgICAgICAoY29udGV4dFhtbC5nZXRBYnNvbHV0ZVBhdGgoKSwgbmV3IExvbmcoY29udGV4dFhtbC5sYXN0TW9kaWZpZWQoKSkpOworICAgICAgICAgICAgLy8gQWRkIHRoZSBhc3NvY2lhdGVkIGRvY0Jhc2UgdG8gdGhlIHJlZGVwbG95ZWQgbGlzdCBpZiBpdCdzIGEgV0FSCisgICAgICAgICAgICBib29sZWFuIGlzV2FyID0gZmFsc2U7CisgICAgICAgICAgICBpZiAoY29udGV4dC5nZXREb2NCYXNlKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEZpbGUgZG9jQmFzZSA9IG5ldyBGaWxlKGNvbnRleHQuZ2V0RG9jQmFzZSgpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWRvY0Jhc2UuaXNBYnNvbHV0ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGRvY0Jhc2UgPSBuZXcgRmlsZShhcHBCYXNlKCksIGNvbnRleHQuZ2V0RG9jQmFzZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGVwbG95ZWRBcHAucmVkZXBsb3lSZXNvdXJjZXMucHV0KGRvY0Jhc2UuZ2V0QWJzb2x1dGVQYXRoKCksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTG9uZyhkb2NCYXNlLmxhc3RNb2RpZmllZCgpKSk7CisgICAgICAgICAgICAgICAgaWYgKGRvY0Jhc2UuZ2V0QWJzb2x1dGVQYXRoKCkudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLndhciIpKSB7CisgICAgICAgICAgICAgICAgICAgIGlzV2FyID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBob3N0LmFkZENoaWxkKGNvbnRleHQpOworICAgICAgICAgICAgLy8gQWRkIHRoZSBldmVudHVhbCB1bnBhY2tlZCBXQVIgYW5kIGFsbCB0aGUgcmVzb3VyY2VzIHdoaWNoIHdpbGwgYmUKKyAgICAgICAgICAgIC8vIHdhdGNoZWQgaW5zaWRlIGl0CisgICAgICAgICAgICBpZiAoaXNXYXIgJiYgdW5wYWNrV0FScykgeworICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gbnVsbDsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IGNvbnRleHQuZ2V0UGF0aCgpOworICAgICAgICAgICAgICAgIGlmIChwYXRoLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICJST09UIjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAocGF0aC5zdGFydHNXaXRoKCIvIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBwYXRoLnN1YnN0cmluZygxKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBwYXRoOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEZpbGUgZG9jQmFzZSA9IG5ldyBGaWxlKG5hbWUpOworICAgICAgICAgICAgICAgIGlmICghZG9jQmFzZS5pc0Fic29sdXRlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZG9jQmFzZSA9IG5ldyBGaWxlKGFwcEJhc2UoKSwgbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRlcGxveWVkQXBwLnJlZGVwbG95UmVzb3VyY2VzLnB1dChkb2NCYXNlLmdldEFic29sdXRlUGF0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IExvbmcoZG9jQmFzZS5sYXN0TW9kaWZpZWQoKSkpOworICAgICAgICAgICAgICAgIGFkZFdhdGNoZWRSZXNvdXJjZXMoZGVwbG95ZWRBcHAsIGRvY0Jhc2UuZ2V0QWJzb2x1dGVQYXRoKCksIGNvbnRleHQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoY29udGV4dC5nZXREb2NCYXNlKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBGaWxlIGRvY0Jhc2UgPSBuZXcgRmlsZShjb250ZXh0LmdldERvY0Jhc2UoKSk7CisgICAgICAgICAgICAgICAgICAgIGlmICghZG9jQmFzZS5pc0Fic29sdXRlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvY0Jhc2UgPSBuZXcgRmlsZShhcHBCYXNlKCksIGNvbnRleHQuZ2V0RG9jQmFzZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgZG9jQmFzZSA9IGRvY0Jhc2UuZ2V0Q2Fub25pY2FsRmlsZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkb2NCYXNlLmdldEFic29sdXRlUGF0aCgpLnN0YXJ0c1dpdGgoYXBwQmFzZSgpLmdldEFic29sdXRlUGF0aCgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGxveWVkQXBwLnJlZGVwbG95UmVzb3VyY2VzLnB1dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29udGV4dFhtbC5nZXRBYnNvbHV0ZVBhdGgoKSwgbmV3IExvbmcoY29udGV4dFhtbC5sYXN0TW9kaWZpZWQoKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGxveWVkQXBwLnJlbG9hZFJlc291cmNlcy5yZW1vdmUoY29udGV4dFhtbC5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFkZFdhdGNoZWRSZXNvdXJjZXMoZGVwbG95ZWRBcHAsIG51bGwsIGNvbnRleHQpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgbG9nLmVycm9yKHNtLmdldFN0cmluZygiaG9zdENvbmZpZy5kZXBsb3lEZXNjcmlwdG9yLmVycm9yIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSksIHQpOworICAgICAgICB9CisKKyAgICAgICAgZGVwbG95ZWQucHV0KGNvbnRleHRQYXRoLCBkZXBsb3llZEFwcCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBEZXBsb3kgV0FSIGZpbGVzLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGRlcGxveVdBUnMoRmlsZSBhcHBCYXNlLCBTdHJpbmdbXSBmaWxlcykgeworICAgICAgICAKKyAgICAgICAgaWYgKGZpbGVzID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIAorICAgICAgICBib29sZWFuIGNoZWNrQWRkaXRpb25hbERlcGxveW1lbnRzID0gZmFsc2U7CisgICAgICAgIAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChmaWxlc1tpXS5lcXVhbHNJZ25vcmVDYXNlKCJNRVRBLUlORiIpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKGZpbGVzW2ldLmVxdWFsc0lnbm9yZUNhc2UoIldFQi1JTkYiKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIEZpbGUgZGlyID0gbmV3IEZpbGUoYXBwQmFzZSwgZmlsZXNbaV0pOworICAgICAgICAgICAgaWYgKGZpbGVzW2ldLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoIi53YXIiKSkgeworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgY29udGV4dCBwYXRoIGFuZCBtYWtlIHN1cmUgaXQgaXMgdW5pcXVlCisgICAgICAgICAgICAgICAgU3RyaW5nIGNvbnRleHRQYXRoID0gIi8iICsgZmlsZXNbaV07CisgICAgICAgICAgICAgICAgaW50IHBlcmlvZCA9IGNvbnRleHRQYXRoLmxhc3RJbmRleE9mKCIuIik7CisgICAgICAgICAgICAgICAgaWYgKHBlcmlvZCA+PSAwKQorICAgICAgICAgICAgICAgICAgICBjb250ZXh0UGF0aCA9IGNvbnRleHRQYXRoLnN1YnN0cmluZygwLCBwZXJpb2QpOworICAgICAgICAgICAgICAgIGlmIChjb250ZXh0UGF0aC5lcXVhbHMoIi9ST09UIikpCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHRQYXRoID0gIiI7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKGlzU2VydmljZWQoY29udGV4dFBhdGgpKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZSA9IGZpbGVzW2ldOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGRlcGxveVdBUihjb250ZXh0UGF0aCwgZGlyLCBmaWxlKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICB9CisgICAgICAgIAorICAgIH0KKworCisgICAgLyoqCisgICAgICogQHBhcmFtIGNvbnRleHRQYXRoCisgICAgICogQHBhcmFtIGRpcgorICAgICAqIEBwYXJhbSBmaWxlCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZGVwbG95V0FSKFN0cmluZyBjb250ZXh0UGF0aCwgRmlsZSBkaXIsIFN0cmluZyBmaWxlKSB7CisgICAgICAgIAorICAgICAgICBpZiAoZGVwbG95bWVudEV4aXN0cyhjb250ZXh0UGF0aCkpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIAorICAgICAgICAvLyBDaGVja2luZyBmb3IgYSBuZXN0ZWQgL01FVEEtSU5GL2NvbnRleHQueG1sCisgICAgICAgIEphckZpbGUgamFyID0gbnVsbDsKKyAgICAgICAgSmFyRW50cnkgZW50cnkgPSBudWxsOworICAgICAgICBJbnB1dFN0cmVhbSBpc3RyZWFtID0gbnVsbDsKKyAgICAgICAgQnVmZmVyZWRPdXRwdXRTdHJlYW0gb3N0cmVhbSA9IG51bGw7CisgICAgICAgIEZpbGUgeG1sID0gbmV3IEZpbGUKKyAgICAgICAgICAgIChjb25maWdCYXNlLCBmaWxlLnN1YnN0cmluZygwLCBmaWxlLmxhc3RJbmRleE9mKCIuIikpICsgIi54bWwiKTsKKyAgICAgICAgaWYgKGRlcGxveVhNTCAmJiAheG1sLmV4aXN0cygpKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGphciA9IG5ldyBKYXJGaWxlKGRpcik7CisgICAgICAgICAgICAgICAgZW50cnkgPSBqYXIuZ2V0SmFyRW50cnkoQ29uc3RhbnRzLkFwcGxpY2F0aW9uQ29udGV4dFhtbCk7CisgICAgICAgICAgICAgICAgaWYgKGVudHJ5ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaXN0cmVhbSA9IGphci5nZXRJbnB1dFN0cmVhbShlbnRyeSk7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBjb25maWdCYXNlLm1rZGlycygpOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgb3N0cmVhbSA9CisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0KKyAgICAgICAgICAgICAgICAgICAgICAgIChuZXcgRmlsZU91dHB1dFN0cmVhbSh4bWwpLCAxMDI0KTsKKyAgICAgICAgICAgICAgICAgICAgYnl0ZSBidWZmZXJbXSA9IG5ldyBieXRlWzEwMjRdOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IG4gPSBpc3RyZWFtLnJlYWQoYnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgb3N0cmVhbS53cml0ZShidWZmZXIsIDAsIG4pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG9zdHJlYW0uZmx1c2goKTsKKyAgICAgICAgICAgICAgICAgICAgb3N0cmVhbS5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICBvc3RyZWFtID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgaXN0cmVhbS5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICBpc3RyZWFtID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgZW50cnkgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBqYXIuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgamFyID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIElnbm9yZSBhbmQgY29udGludWUKKyAgICAgICAgICAgICAgICBpZiAob3N0cmVhbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvc3RyZWFtLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgb3N0cmVhbSA9IG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChpc3RyZWFtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpc3RyZWFtID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGVudHJ5ID0gbnVsbDsKKyAgICAgICAgICAgICAgICBpZiAoamFyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGphci5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGphciA9IG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBEZXBsb3llZEFwcGxpY2F0aW9uIGRlcGxveWVkQXBwID0gbmV3IERlcGxveWVkQXBwbGljYXRpb24oY29udGV4dFBhdGgpOworICAgICAgICAKKyAgICAgICAgLy8gRGVwbG95IHRoZSBhcHBsaWNhdGlvbiBpbiB0aGlzIFdBUiBmaWxlCisgICAgICAgIGxvZy5pbmZvKHNtLmdldFN0cmluZygiaG9zdENvbmZpZy5kZXBsb3lKYXIiLCBmaWxlKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDb250ZXh0IGNvbnRleHQgPSAoQ29udGV4dCkgQ2xhc3MuZm9yTmFtZShjb250ZXh0Q2xhc3MpLm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICBpZiAoY29udGV4dCBpbnN0YW5jZW9mIExpZmVjeWNsZSkgeworICAgICAgICAgICAgICAgIENsYXNzIGNsYXp6ID0gQ2xhc3MuZm9yTmFtZShob3N0LmdldENvbmZpZ0NsYXNzKCkpOworICAgICAgICAgICAgICAgIExpZmVjeWNsZUxpc3RlbmVyIGxpc3RlbmVyID0KKyAgICAgICAgICAgICAgICAgICAgKExpZmVjeWNsZUxpc3RlbmVyKSBjbGF6ei5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgICAgICgoTGlmZWN5Y2xlKSBjb250ZXh0KS5hZGRMaWZlY3ljbGVMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250ZXh0LnNldFBhdGgoY29udGV4dFBhdGgpOworICAgICAgICAgICAgY29udGV4dC5zZXREb2NCYXNlKGZpbGUpOworICAgICAgICAgICAgaWYgKHhtbC5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0Q29uZmlnRmlsZSh4bWwuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICAgICAgICAgIGRlcGxveWVkQXBwLnJlbG9hZFJlc291cmNlcy5wdXQKKyAgICAgICAgICAgICAgICAgICAgKHhtbC5nZXRBYnNvbHV0ZVBhdGgoKSwgbmV3IExvbmcoeG1sLmxhc3RNb2RpZmllZCgpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBob3N0LmFkZENoaWxkKGNvbnRleHQpOworICAgICAgICAgICAgLy8gSWYgd2UncmUgdW5wYWNraW5nIFdBUnMsIHRoZSBkb2NCYXNlIHdpbGwgYmUgbXV0YXRlZCBhZnRlcgorICAgICAgICAgICAgLy8gc3RhcnRpbmcgdGhlIGNvbnRleHQKKyAgICAgICAgICAgIGlmICh1bnBhY2tXQVJzICYmIChjb250ZXh0LmdldERvY0Jhc2UoKSAhPSBudWxsKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gbnVsbDsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IGNvbnRleHQuZ2V0UGF0aCgpOworICAgICAgICAgICAgICAgIGlmIChwYXRoLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICJST09UIjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAocGF0aC5zdGFydHNXaXRoKCIvIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBwYXRoLnN1YnN0cmluZygxKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBwYXRoOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEZpbGUgZG9jQmFzZSA9IG5ldyBGaWxlKG5hbWUpOworICAgICAgICAgICAgICAgIGlmICghZG9jQmFzZS5pc0Fic29sdXRlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZG9jQmFzZSA9IG5ldyBGaWxlKGFwcEJhc2UoKSwgbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRlcGxveWVkQXBwLnJlZGVwbG95UmVzb3VyY2VzLnB1dChkb2NCYXNlLmdldEFic29sdXRlUGF0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IExvbmcoZG9jQmFzZS5sYXN0TW9kaWZpZWQoKSkpOworICAgICAgICAgICAgICAgIGFkZFdhdGNoZWRSZXNvdXJjZXMoZGVwbG95ZWRBcHAsIGRvY0Jhc2UuZ2V0QWJzb2x1dGVQYXRoKCksIGNvbnRleHQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhZGRXYXRjaGVkUmVzb3VyY2VzKGRlcGxveWVkQXBwLCBudWxsLCBjb250ZXh0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcihzbS5nZXRTdHJpbmcoImhvc3RDb25maWcuZGVwbG95SmFyLmVycm9yIiwgZmlsZSksIHQpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBQb3B1bGF0ZSByZWRlcGxveSByZXNvdXJjZXMgd2l0aCB0aGUgV0FSIGZpbGUKKyAgICAgICAgZGVwbG95ZWRBcHAucmVkZXBsb3lSZXNvdXJjZXMucHV0CisgICAgICAgICAgICAoZGlyLmdldEFic29sdXRlUGF0aCgpLCBuZXcgTG9uZyhkaXIubGFzdE1vZGlmaWVkKCkpKTsKKyAgICAgICAgZGVwbG95ZWQucHV0KGNvbnRleHRQYXRoLCBkZXBsb3llZEFwcCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBEZXBsb3kgZGlyZWN0b3JpZXMuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZGVwbG95RGlyZWN0b3JpZXMoRmlsZSBhcHBCYXNlLCBTdHJpbmdbXSBmaWxlcykgeworCisgICAgICAgIGlmIChmaWxlcyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgeworCisgICAgICAgICAgICBpZiAoZmlsZXNbaV0uZXF1YWxzSWdub3JlQ2FzZSgiTUVUQS1JTkYiKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlmIChmaWxlc1tpXS5lcXVhbHNJZ25vcmVDYXNlKCJXRUItSU5GIikpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBGaWxlIGRpciA9IG5ldyBGaWxlKGFwcEJhc2UsIGZpbGVzW2ldKTsKKyAgICAgICAgICAgIGlmIChkaXIuaXNEaXJlY3RvcnkoKSkgeworCisgICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZXJlIGlzIGFuIGFwcGxpY2F0aW9uIGNvbmZpZ3VyYXRpb24gZGlyZWN0b3J5CisgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBuZWVkZWQgaWYgdGhlIENvbnRleHQgYXBwQmFzZSBpcyB0aGUgc2FtZSBhcyB0aGUKKyAgICAgICAgICAgICAgICAvLyB3ZWIgc2VydmVyIGRvY3VtZW50IHJvb3QgdG8gbWFrZSBzdXJlIG9ubHkgd2ViIGFwcGxpY2F0aW9ucworICAgICAgICAgICAgICAgIC8vIGFyZSBkZXBsb3llZCBhbmQgbm90IGRpcmVjdG9yaWVzIGZvciB3ZWIgc3BhY2UuCisgICAgICAgICAgICAgICAgRmlsZSB3ZWJJbmYgPSBuZXcgRmlsZShkaXIsICIvV0VCLUlORiIpOworICAgICAgICAgICAgICAgIGlmICghd2ViSW5mLmV4aXN0cygpIHx8ICF3ZWJJbmYuaXNEaXJlY3RvcnkoKSB8fAorICAgICAgICAgICAgICAgICAgICAhd2ViSW5mLmNhblJlYWQoKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIGNvbnRleHQgcGF0aCBhbmQgbWFrZSBzdXJlIGl0IGlzIHVuaXF1ZQorICAgICAgICAgICAgICAgIFN0cmluZyBjb250ZXh0UGF0aCA9ICIvIiArIGZpbGVzW2ldOworICAgICAgICAgICAgICAgIGlmIChmaWxlc1tpXS5lcXVhbHMoIlJPT1QiKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dFBhdGggPSAiIjsKKworICAgICAgICAgICAgICAgIGlmIChpc1NlcnZpY2VkKGNvbnRleHRQYXRoKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZSA9IGZpbGVzW2ldOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGRlcGxveURpcmVjdG9yeShjb250ZXh0UGF0aCwgZGlyLCBmaWxlKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgIH0KKworICAgIAorICAgIC8qKgorICAgICAqIEBwYXJhbSBjb250ZXh0UGF0aAorICAgICAqIEBwYXJhbSBkaXIKKyAgICAgKiBAcGFyYW0gZmlsZQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGRlcGxveURpcmVjdG9yeShTdHJpbmcgY29udGV4dFBhdGgsIEZpbGUgZGlyLCBTdHJpbmcgZmlsZSkgeworICAgICAgICBEZXBsb3llZEFwcGxpY2F0aW9uIGRlcGxveWVkQXBwID0gbmV3IERlcGxveWVkQXBwbGljYXRpb24oY29udGV4dFBhdGgpOworICAgICAgICAKKyAgICAgICAgaWYgKGRlcGxveW1lbnRFeGlzdHMoY29udGV4dFBhdGgpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8vIERlcGxveSB0aGUgYXBwbGljYXRpb24gaW4gdGhpcyBkaXJlY3RvcnkKKyAgICAgICAgaWYoIGxvZy5pc0RlYnVnRW5hYmxlZCgpICkgCisgICAgICAgICAgICBsb2cuZGVidWcoc20uZ2V0U3RyaW5nKCJob3N0Q29uZmlnLmRlcGxveURpciIsIGZpbGUpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENvbnRleHQgY29udGV4dCA9IChDb250ZXh0KSBDbGFzcy5mb3JOYW1lKGNvbnRleHRDbGFzcykubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIGlmIChjb250ZXh0IGluc3RhbmNlb2YgTGlmZWN5Y2xlKSB7CisgICAgICAgICAgICAgICAgQ2xhc3MgY2xhenogPSBDbGFzcy5mb3JOYW1lKGhvc3QuZ2V0Q29uZmlnQ2xhc3MoKSk7CisgICAgICAgICAgICAgICAgTGlmZWN5Y2xlTGlzdGVuZXIgbGlzdGVuZXIgPQorICAgICAgICAgICAgICAgICAgICAoTGlmZWN5Y2xlTGlzdGVuZXIpIGNsYXp6Lm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICAgICAgKChMaWZlY3ljbGUpIGNvbnRleHQpLmFkZExpZmVjeWNsZUxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRleHQuc2V0UGF0aChjb250ZXh0UGF0aCk7CisgICAgICAgICAgICBjb250ZXh0LnNldERvY0Jhc2UoZmlsZSk7CisgICAgICAgICAgICBpZiAoZGVwbG95WE1MKSB7CisgICAgICAgICAgICAgICAgY29udGV4dC5zZXRDb25maWdGaWxlCisgICAgICAgICAgICAgICAgICAgICgobmV3IEZpbGUoZGlyLCBDb25zdGFudHMuQXBwbGljYXRpb25Db250ZXh0WG1sKSkuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaG9zdC5hZGRDaGlsZChjb250ZXh0KTsKKyAgICAgICAgICAgIGRlcGxveWVkQXBwLnJlZGVwbG95UmVzb3VyY2VzLnB1dChkaXIuZ2V0QWJzb2x1dGVQYXRoKCksCisgICAgICAgICAgICAgICAgICAgIG5ldyBMb25nKGRpci5sYXN0TW9kaWZpZWQoKSkpOworICAgICAgICAgICAgYWRkV2F0Y2hlZFJlc291cmNlcyhkZXBsb3llZEFwcCwgZGlyLmdldEFic29sdXRlUGF0aCgpLCBjb250ZXh0KTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcihzbS5nZXRTdHJpbmcoImhvc3RDb25maWcuZGVwbG95RGlyLmVycm9yIiwgZmlsZSksIHQpOworICAgICAgICB9CisKKyAgICAgICAgZGVwbG95ZWQucHV0KGNvbnRleHRQYXRoLCBkZXBsb3llZEFwcCk7CisgICAgfQorCisgICAgCisgICAgLyoqCisgICAgICogQ2hlY2sgaWYgYSB3ZWJhcHAgaXMgYWxyZWFkeSBkZXBsb3llZCBpbiB0aGlzIGhvc3QuCisgICAgICogCisgICAgICogQHBhcmFtIGNvbnRleHRQYXRoIG9mIHRoZSBjb250ZXh0IHdoaWNoIHdpbGwgYmUgY2hlY2tlZAorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGRlcGxveW1lbnRFeGlzdHMoU3RyaW5nIGNvbnRleHRQYXRoKSB7CisgICAgICAgIHJldHVybiAoZGVwbG95ZWQuY29udGFpbnNLZXkoY29udGV4dFBhdGgpIHx8IChob3N0LmZpbmRDaGlsZChjb250ZXh0UGF0aCkgIT0gbnVsbCkpOworICAgIH0KKyAgICAKKworICAgIC8qKgorICAgICAqIEFkZCB3YXRjaGVkIHJlc291cmNlcyB0byB0aGUgc3BlY2lmaWVkIENvbnRleHQuCisgICAgICogQHBhcmFtIGFwcAorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGFkZFdhdGNoZWRSZXNvdXJjZXMoRGVwbG95ZWRBcHBsaWNhdGlvbiBhcHAsIFN0cmluZyBkb2NCYXNlLCBDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgLy8gRklYTUU6IEZlYXR1cmUgaWRlYS4gQWRkIHN1cHBvcnQgZm9yIHBhdHRlcm5zIChleDogV0VCLUlORi8qLCBXRUItSU5GLyoueG1sKSwgd2hlcmUKKyAgICAgICAgLy8gICAgICAgIHdlIHdvdWxkIG9ubHkgY2hlY2sgaWYgYXQgbGVhc3Qgb25lIHJlc291cmNlIGlzIG5ld2VyIHRoYW4gYXBwLnRpbWVzdGFtcAorICAgICAgICBGaWxlIGRvY0Jhc2VGaWxlID0gbnVsbDsKKyAgICAgICAgaWYgKGRvY0Jhc2UgIT0gbnVsbCkgeworICAgICAgICAgICAgZG9jQmFzZUZpbGUgPSBuZXcgRmlsZShkb2NCYXNlKTsKKyAgICAgICAgICAgIGlmICghZG9jQmFzZUZpbGUuaXNBYnNvbHV0ZSgpKSB7CisgICAgICAgICAgICAgICAgZG9jQmFzZUZpbGUgPSBuZXcgRmlsZShhcHBCYXNlKCksIGRvY0Jhc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFN0cmluZ1tdIHdhdGNoZWRSZXNvdXJjZXMgPSBjb250ZXh0LmZpbmRXYXRjaGVkUmVzb3VyY2VzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd2F0Y2hlZFJlc291cmNlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgRmlsZSByZXNvdXJjZSA9IG5ldyBGaWxlKHdhdGNoZWRSZXNvdXJjZXNbaV0pOworICAgICAgICAgICAgaWYgKCFyZXNvdXJjZS5pc0Fic29sdXRlKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoZG9jQmFzZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc291cmNlID0gbmV3IEZpbGUoZG9jQmFzZUZpbGUsIHdhdGNoZWRSZXNvdXJjZXNbaV0pOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFwcC5yZWxvYWRSZXNvdXJjZXMucHV0KHJlc291cmNlLmdldEFic29sdXRlUGF0aCgpLCAKKyAgICAgICAgICAgICAgICAgICAgbmV3IExvbmcocmVzb3VyY2UubGFzdE1vZGlmaWVkKCkpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKworICAgIC8qKgorICAgICAqIENoZWNrIHJlc291cmNlcyBmb3IgcmVkZXBsb3ltZW50IGFuZCByZWxvYWRpbmcuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIGNoZWNrUmVzb3VyY2VzKERlcGxveWVkQXBwbGljYXRpb24gYXBwKSB7CisgICAgICAgIFN0cmluZ1tdIHJlc291cmNlcyA9IChTdHJpbmdbXSkgYXBwLnJlZGVwbG95UmVzb3VyY2VzLmtleVNldCgpLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBGaWxlIHJlc291cmNlID0gbmV3IEZpbGUocmVzb3VyY2VzW2ldKTsKKyAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkNoZWNraW5nIGNvbnRleHRbIiArIGFwcC5uYW1lICsgIl0gcmVkZXBsb3kgcmVzb3VyY2UgIiArIHJlc291cmNlKTsKKyAgICAgICAgICAgIGlmIChyZXNvdXJjZS5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgIGxvbmcgbGFzdE1vZGlmaWVkID0gKChMb25nKSBhcHAucmVkZXBsb3lSZXNvdXJjZXMuZ2V0KHJlc291cmNlc1tpXSkpLmxvbmdWYWx1ZSgpOworICAgICAgICAgICAgICAgIGlmICgoIXJlc291cmNlLmlzRGlyZWN0b3J5KCkpICYmIHJlc291cmNlLmxhc3RNb2RpZmllZCgpID4gbGFzdE1vZGlmaWVkKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFJlZGVwbG95IGFwcGxpY2F0aW9uCisgICAgICAgICAgICAgICAgICAgIENvbnRhaW5lckJhc2UgY29udGV4dCA9IChDb250YWluZXJCYXNlKSBob3N0LmZpbmRDaGlsZChhcHAubmFtZSk7CisgICAgICAgICAgICAgICAgICAgIGhvc3QucmVtb3ZlQ2hpbGQoY29udGV4dCk7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmRlc3Ryb3koKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKHNtLmdldFN0cmluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJob3N0Q29uZmlnLmNvbnRleHQuZGVzdHJveSIsIGFwcC5uYW1lKSwgZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gRGVsZXRlIG90aGVyIHJlZGVwbG95IHJlc291cmNlcworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHJlc291cmNlcy5sZW5ndGg7IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGogIT0gaSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUgY3VycmVudCA9IG5ldyBGaWxlKHJlc291cmNlc1tqXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LmdldENhbm9uaWNhbEZpbGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChjdXJyZW50LmdldEFic29sdXRlUGF0aCgpLnN0YXJ0c1dpdGgoYXBwQmFzZSgpLmdldEFic29sdXRlUGF0aCgpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChjdXJyZW50LmdldEFic29sdXRlUGF0aCgpLnN0YXJ0c1dpdGgoY29uZmlnQmFzZSgpLmdldEFic29sdXRlUGF0aCgpKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkRlbGV0ZSAiICsgY3VycmVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBhbmRXYXIuZGVsZXRlKGN1cnJlbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cud2FybihzbS5nZXRTdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImhvc3RDb25maWcuY2Fub25pY2FsaXppbmciLCBhcHAubmFtZSksIGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBkZXBsb3llZC5yZW1vdmUoYXBwLm5hbWUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBVbmRlcGxveSBhcHBsaWNhdGlvbgorICAgICAgICAgICAgICAgIENvbnRhaW5lckJhc2UgY29udGV4dCA9IChDb250YWluZXJCYXNlKSBob3N0LmZpbmRDaGlsZChhcHAubmFtZSk7CisgICAgICAgICAgICAgICAgaG9zdC5yZW1vdmVDaGlsZChjb250ZXh0KTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmRlc3Ryb3koKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBsb2cud2FybihzbS5nZXRTdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJob3N0Q29uZmlnLmNvbnRleHQuZGVzdHJveSIsIGFwcC5uYW1lKSwgZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIERlbGV0ZSBhbGwgcmVkZXBsb3kgcmVzb3VyY2VzCisgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCByZXNvdXJjZXMubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUgY3VycmVudCA9IG5ldyBGaWxlKHJlc291cmNlc1tqXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5nZXRDYW5vbmljYWxGaWxlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGN1cnJlbnQuZ2V0QWJzb2x1dGVQYXRoKCkuc3RhcnRzV2l0aChhcHBCYXNlKCkuZ2V0QWJzb2x1dGVQYXRoKCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChjdXJyZW50LmdldEFic29sdXRlUGF0aCgpLnN0YXJ0c1dpdGgoY29uZmlnQmFzZSgpLmdldEFic29sdXRlUGF0aCgpKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRGVsZXRlICIgKyBjdXJyZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBhbmRXYXIuZGVsZXRlKGN1cnJlbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2cud2FybihzbS5nZXRTdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJob3N0Q29uZmlnLmNhbm9uaWNhbGl6aW5nIiwgYXBwLm5hbWUpLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBEZWxldGUgcmVsb2FkIHJlc291cmNlcyBhcyB3ZWxsICh0byByZW1vdmUgYW55IHJlbWFpbmluZyAueG1sIGRlc2NyaXB0b3IpCisgICAgICAgICAgICAgICAgU3RyaW5nW10gcmVzb3VyY2VzMiA9IChTdHJpbmdbXSkgYXBwLnJlbG9hZFJlc291cmNlcy5rZXlTZXQoKS50b0FycmF5KG5ldyBTdHJpbmdbMF0pOworICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgcmVzb3VyY2VzMi5sZW5ndGg7IGorKykgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSBjdXJyZW50ID0gbmV3IEZpbGUocmVzb3VyY2VzMltqXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5nZXRDYW5vbmljYWxGaWxlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGN1cnJlbnQuZ2V0QWJzb2x1dGVQYXRoKCkuc3RhcnRzV2l0aChhcHBCYXNlKCkuZ2V0QWJzb2x1dGVQYXRoKCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoY3VycmVudC5nZXRBYnNvbHV0ZVBhdGgoKS5zdGFydHNXaXRoKGNvbmZpZ0Jhc2UoKS5nZXRBYnNvbHV0ZVBhdGgoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChjdXJyZW50LmdldEFic29sdXRlUGF0aCgpLmVuZHNXaXRoKCIueG1sIikpKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRGVsZXRlICIgKyBjdXJyZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBhbmRXYXIuZGVsZXRlKGN1cnJlbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2cud2FybihzbS5nZXRTdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJob3N0Q29uZmlnLmNhbm9uaWNhbGl6aW5nIiwgYXBwLm5hbWUpLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkZXBsb3llZC5yZW1vdmUoYXBwLm5hbWUpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXNvdXJjZXMgPSAoU3RyaW5nW10pIGFwcC5yZWxvYWRSZXNvdXJjZXMua2V5U2V0KCkudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXNvdXJjZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIEZpbGUgcmVzb3VyY2UgPSBuZXcgRmlsZShyZXNvdXJjZXNbaV0pOworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ2hlY2tpbmcgY29udGV4dFsiICsgYXBwLm5hbWUgKyAiXSByZWxvYWQgcmVzb3VyY2UgIiArIHJlc291cmNlKTsKKyAgICAgICAgICAgIGxvbmcgbGFzdE1vZGlmaWVkID0gKChMb25nKSBhcHAucmVsb2FkUmVzb3VyY2VzLmdldChyZXNvdXJjZXNbaV0pKS5sb25nVmFsdWUoKTsKKyAgICAgICAgICAgIGlmICgoIXJlc291cmNlLmV4aXN0cygpICYmIGxhc3RNb2RpZmllZCAhPSAwTCkgCisgICAgICAgICAgICAgICAgfHwgKHJlc291cmNlLmxhc3RNb2RpZmllZCgpICE9IGxhc3RNb2RpZmllZCkpIHsKKyAgICAgICAgICAgICAgICAvLyBSZWxvYWQgYXBwbGljYXRpb24KKyAgICAgICAgICAgICAgICBDb250YWluZXIgY29udGV4dCA9IGhvc3QuZmluZENoaWxkKGFwcC5uYW1lKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAoKExpZmVjeWNsZSkgY29udGV4dCkuc3RvcCgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKHNtLmdldFN0cmluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImhvc3RDb25maWcuY29udGV4dC5yZXN0YXJ0IiwgYXBwLm5hbWUpLCBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGNvbnRleHQgd2FzIG5vdCBzdGFydGVkIChmb3IgZXhhbXBsZSBhbiBlcnJvciAKKyAgICAgICAgICAgICAgICAvLyBpbiB3ZWIueG1sKSB3ZSdsbCBzdGlsbCBnZXQgdG8gdHJ5IHRvIHN0YXJ0CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgKChMaWZlY3ljbGUpIGNvbnRleHQpLnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oc20uZ2V0U3RyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiaG9zdENvbmZpZy5jb250ZXh0LnJlc3RhcnQiLCBhcHAubmFtZSksIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBVcGRhdGUgdGltZXMKKyAgICAgICAgICAgICAgICBhcHAucmVsb2FkUmVzb3VyY2VzLnB1dChyZXNvdXJjZXNbaV0sIG5ldyBMb25nKHJlc291cmNlLmxhc3RNb2RpZmllZCgpKSk7CisgICAgICAgICAgICAgICAgYXBwLnRpbWVzdGFtcCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIGEgInN0YXJ0IiBldmVudCBmb3IgdGhpcyBIb3N0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgeworCisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZyhzbS5nZXRTdHJpbmcoImhvc3RDb25maWcuc3RhcnQiKSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE9iamVjdE5hbWUgaG9zdE9OID0gbmV3IE9iamVjdE5hbWUoaG9zdC5nZXRPYmplY3ROYW1lKCkpOworICAgICAgICAgICAgb25hbWUgPSBuZXcgT2JqZWN0TmFtZQorICAgICAgICAgICAgICAgIChob3N0T04uZ2V0RG9tYWluKCkgKyAiOnR5cGU9RGVwbG95ZXIsaG9zdD0iICsgaG9zdC5nZXROYW1lKCkpOworICAgICAgICAgICAgUmVnaXN0cnkuZ2V0UmVnaXN0cnkobnVsbCwgbnVsbCkucmVnaXN0ZXJDb21wb25lbnQKKyAgICAgICAgICAgICAgICAodGhpcywgb25hbWUsIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9nLmVycm9yKHNtLmdldFN0cmluZygiaG9zdENvbmZpZy5qbXgucmVnaXN0ZXIiKSwgZSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGRlcGxveUFwcHMoKTsKKyAgICAgICAgCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIGEgInN0b3AiIGV2ZW50IGZvciB0aGlzIEhvc3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcCgpIHsKKworICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoc20uZ2V0U3RyaW5nKCJob3N0Q29uZmlnLnN0b3AiKSk7CisKKyAgICAgICAgdW5kZXBsb3lBcHBzKCk7CisKKyAgICAgICAgaWYgKG9uYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgUmVnaXN0cnkuZ2V0UmVnaXN0cnkobnVsbCwgbnVsbCkudW5yZWdpc3RlckNvbXBvbmVudChvbmFtZSk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxvZy5lcnJvcihzbS5nZXRTdHJpbmcoImhvc3RDb25maWcuam14LnVucmVnaXN0ZXIiKSwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgb25hbWUgPSBudWxsOworICAgICAgICBhcHBCYXNlID0gbnVsbDsKKyAgICAgICAgY29uZmlnQmFzZSA9IG51bGw7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFVuZGVwbG95IGFsbCBkZXBsb3llZCBhcHBsaWNhdGlvbnMuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgdW5kZXBsb3lBcHBzKCkgeworCisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZyhzbS5nZXRTdHJpbmcoImhvc3RDb25maWcudW5kZXBsb3lpbmciKSk7CisKKyAgICAgICAgLy8gU29mdCB1bmRlcGxveSBhbGwgY29udGV4dHMgd2UgaGF2ZSBkZXBsb3llZAorICAgICAgICBEZXBsb3llZEFwcGxpY2F0aW9uW10gYXBwcyA9IAorICAgICAgICAgICAgKERlcGxveWVkQXBwbGljYXRpb25bXSkgZGVwbG95ZWQudmFsdWVzKCkudG9BcnJheShuZXcgRGVwbG95ZWRBcHBsaWNhdGlvblswXSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXBwcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaG9zdC5yZW1vdmVDaGlsZChob3N0LmZpbmRDaGlsZChhcHBzW2ldLm5hbWUpKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgZGVwbG95ZWQuY2xlYXIoKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ2hlY2sgc3RhdHVzIG9mIGFsbCB3ZWJhcHBzLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrKCkgeworCisgICAgICAgIGlmIChob3N0LmdldEF1dG9EZXBsb3koKSkgeworICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIHJlc291cmNlcyBtb2RpZmljYXRpb24gdG8gdHJpZ2dlciByZWRlcGxveW1lbnQKKyAgICAgICAgICAgIERlcGxveWVkQXBwbGljYXRpb25bXSBhcHBzID0gCisgICAgICAgICAgICAgICAgKERlcGxveWVkQXBwbGljYXRpb25bXSkgZGVwbG95ZWQudmFsdWVzKCkudG9BcnJheShuZXcgRGVwbG95ZWRBcHBsaWNhdGlvblswXSk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFwcHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoIWlzU2VydmljZWQoYXBwc1tpXS5uYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgY2hlY2tSZXNvdXJjZXMoYXBwc1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBIb3RkZXBsb3kgYXBwbGljYXRpb25zCisgICAgICAgICAgICBkZXBsb3lBcHBzKCk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIAorICAgIC8qKgorICAgICAqIENoZWNrIHN0YXR1cyBvZiBhIHNwZWNpZmljIHdlYmFwcCwgZm9yIHVzZSB3aXRoIHN0dWZmIGxpa2UgbWFuYWdlbWVudCB3ZWJhcHBzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNoZWNrKFN0cmluZyBuYW1lKSB7CisgICAgICAgIERlcGxveWVkQXBwbGljYXRpb24gYXBwID0gKERlcGxveWVkQXBwbGljYXRpb24pIGRlcGxveWVkLmdldChuYW1lKTsKKyAgICAgICAgaWYgKGFwcCAhPSBudWxsKSB7CisgICAgICAgICAgICBjaGVja1Jlc291cmNlcyhhcHApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGVwbG95QXBwcyhuYW1lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIG5ldyBDb250ZXh0IHRvIGJlIG1hbmFnZWQgYnkgdXMuCisgICAgICogRW50cnkgcG9pbnQgZm9yIHRoZSBhZG1pbiB3ZWJhcHAsIGFuZCBvdGhlciBKTVggQ29udGV4dCBjb250cm9sZXJzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG1hbmFnZUFwcChDb250ZXh0IGNvbnRleHQpICB7ICAgIAorCisgICAgICAgIFN0cmluZyBjb250ZXh0UGF0aCA9IGNvbnRleHQuZ2V0UGF0aCgpOworICAgICAgICAKKyAgICAgICAgaWYgKGRlcGxveWVkLmNvbnRhaW5zS2V5KGNvbnRleHRQYXRoKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBEZXBsb3llZEFwcGxpY2F0aW9uIGRlcGxveWVkQXBwID0gbmV3IERlcGxveWVkQXBwbGljYXRpb24oY29udGV4dFBhdGgpOworICAgICAgICAKKyAgICAgICAgLy8gQWRkIHRoZSBhc3NvY2lhdGVkIGRvY0Jhc2UgdG8gdGhlIHJlZGVwbG95ZWQgbGlzdCBpZiBpdCdzIGEgV0FSCisgICAgICAgIGJvb2xlYW4gaXNXYXIgPSBmYWxzZTsKKyAgICAgICAgaWYgKGNvbnRleHQuZ2V0RG9jQmFzZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIEZpbGUgZG9jQmFzZSA9IG5ldyBGaWxlKGNvbnRleHQuZ2V0RG9jQmFzZSgpKTsKKyAgICAgICAgICAgIGlmICghZG9jQmFzZS5pc0Fic29sdXRlKCkpIHsKKyAgICAgICAgICAgICAgICBkb2NCYXNlID0gbmV3IEZpbGUoYXBwQmFzZSgpLCBjb250ZXh0LmdldERvY0Jhc2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZXBsb3llZEFwcC5yZWRlcGxveVJlc291cmNlcy5wdXQoZG9jQmFzZS5nZXRBYnNvbHV0ZVBhdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBMb25nKGRvY0Jhc2UubGFzdE1vZGlmaWVkKCkpKTsKKyAgICAgICAgICAgIGlmIChkb2NCYXNlLmdldEFic29sdXRlUGF0aCgpLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoIi53YXIiKSkgeworICAgICAgICAgICAgICAgIGlzV2FyID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBob3N0LmFkZENoaWxkKGNvbnRleHQpOworICAgICAgICAvLyBBZGQgdGhlIGV2ZW50dWFsIHVucGFja2VkIFdBUiBhbmQgYWxsIHRoZSByZXNvdXJjZXMgd2hpY2ggd2lsbCBiZQorICAgICAgICAvLyB3YXRjaGVkIGluc2lkZSBpdAorICAgICAgICBpZiAoaXNXYXIgJiYgdW5wYWNrV0FScykgeworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBudWxsOworICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBjb250ZXh0LmdldFBhdGgoKTsKKyAgICAgICAgICAgIGlmIChwYXRoLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgICAgICBuYW1lID0gIlJPT1QiOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAocGF0aC5zdGFydHNXaXRoKCIvIikpIHsKKyAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHBhdGguc3Vic3RyaW5nKDEpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBwYXRoOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZpbGUgZG9jQmFzZSA9IG5ldyBGaWxlKG5hbWUpOworICAgICAgICAgICAgaWYgKCFkb2NCYXNlLmlzQWJzb2x1dGUoKSkgeworICAgICAgICAgICAgICAgIGRvY0Jhc2UgPSBuZXcgRmlsZShhcHBCYXNlKCksIG5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVwbG95ZWRBcHAucmVkZXBsb3lSZXNvdXJjZXMucHV0KGRvY0Jhc2UuZ2V0QWJzb2x1dGVQYXRoKCksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTG9uZyhkb2NCYXNlLmxhc3RNb2RpZmllZCgpKSk7CisgICAgICAgICAgICBhZGRXYXRjaGVkUmVzb3VyY2VzKGRlcGxveWVkQXBwLCBkb2NCYXNlLmdldEFic29sdXRlUGF0aCgpLCBjb250ZXh0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFkZFdhdGNoZWRSZXNvdXJjZXMoZGVwbG95ZWRBcHAsIG51bGwsIGNvbnRleHQpOworICAgICAgICB9CisgICAgICAgIGRlcGxveWVkLnB1dChjb250ZXh0UGF0aCwgZGVwbG95ZWRBcHApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhIHdlYmFwcCBmcm9tIG91ciBjb250cm9sLgorICAgICAqIEVudHJ5IHBvaW50IGZvciB0aGUgYWRtaW4gd2ViYXBwLCBhbmQgb3RoZXIgSk1YIENvbnRleHQgY29udHJvbGVycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB1bm1hbmFnZUFwcChTdHJpbmcgY29udGV4dFBhdGgpIHsKKyAgICAgICAgaWYoaXNTZXJ2aWNlZChjb250ZXh0UGF0aCkpIHsKKyAgICAgICAgICAgIGRlcGxveWVkLnJlbW92ZShjb250ZXh0UGF0aCk7CisgICAgICAgICAgICBob3N0LnJlbW92ZUNoaWxkKGhvc3QuZmluZENoaWxkKGNvbnRleHRQYXRoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBzdGF0ZSBvZiBhIGRlcGxveWVkIGFwcGxpY2F0aW9uLCBhcyB3ZWxsIGFzIAorICAgICAqIHRoZSBtb25pdG9yZWQgcmVzb3VyY2VzLgorICAgICAqLworICAgIHByb3RlY3RlZCBjbGFzcyBEZXBsb3llZEFwcGxpY2F0aW9uIHsKKyAgICAJcHVibGljIERlcGxveWVkQXBwbGljYXRpb24oU3RyaW5nIG5hbWUpIHsKKyAgICAJCXRoaXMubmFtZSA9IG5hbWU7CisgICAgCX0KKyAgICAJCisgICAgCS8qKgorICAgIAkgKiBBcHBsaWNhdGlvbiBjb250ZXh0IHBhdGguIFRoZSBhc3NlcnRpb24gaXMgdGhhdCAKKyAgICAJICogKGhvc3QuZ2V0Q2hpbGQobmFtZSkgIT0gbnVsbCkuCisgICAgCSAqLworICAgIAlwdWJsaWMgU3RyaW5nIG5hbWU7CisgICAgCQorICAgIAkvKioKKyAgICAJICogQW55IG1vZGlmaWNhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIChzdGF0aWMpIHJlc291cmNlcyB3aWxsIGNhdXNlIGEgCisgICAgCSAqIHJlZGVwbG95bWVudCBvZiB0aGUgYXBwbGljYXRpb24uIElmIGFueSBvZiB0aGUgc3BlY2lmaWVkIHJlc291cmNlcyBpcworICAgIAkgKiByZW1vdmVkLCB0aGUgYXBwbGljYXRpb24gd2lsbCBiZSB1bmRlcGxveWVkLiBUeXBpY2FsbHksIHRoaXMgd2lsbAorICAgIAkgKiBjb250YWluIHJlc291cmNlcyBsaWtlIHRoZSBjb250ZXh0LnhtbCBmaWxlLCBhIGNvbXByZXNzZWQgV0FSIHBhdGguCisgICAgICAgICAqIFRoZSB2YWx1ZSBpcyB0aGUgbGFzdCBtb2RpZmljYXRpb24gdGltZS4KKyAgICAJICovCisgICAgCXB1YmxpYyBIYXNoTWFwIHJlZGVwbG95UmVzb3VyY2VzID0gbmV3IEhhc2hNYXAoKTsKKworICAgIAkvKioKKyAgICAJICogQW55IG1vZGlmaWNhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIChzdGF0aWMpIHJlc291cmNlcyB3aWxsIGNhdXNlIGEgCisgICAgCSAqIHJlbG9hZCBvZiB0aGUgYXBwbGljYXRpb24uIFRoaXMgd2lsbCB0eXBpY2FsbHkgY29udGFpbiByZXNvdXJjZXMKKyAgICAJICogc3VjaCBhcyB0aGUgd2ViLnhtbCBvZiBhIHdlYmFwcCwgYnV0IGNhbiBiZSBjb25maWd1cmVkIHRvIGNvbnRhaW4KKyAgICAJICogYWRkaXRpb25hbCBkZXNjcmlwdG9ycy4KKyAgICAgICAgICogVGhlIHZhbHVlIGlzIHRoZSBsYXN0IG1vZGlmaWNhdGlvbiB0aW1lLgorICAgIAkgKi8KKyAgICAJcHVibGljIEhhc2hNYXAgcmVsb2FkUmVzb3VyY2VzID0gbmV3IEhhc2hNYXAoKTsKKworICAgIAkvKioKKyAgICAJICogSW5zdGFudCB3aGVyZSB0aGUgYXBwbGljYXRpb24gd2FzIGxhc3QgcHV0IGluIHNlcnZpY2UuCisgICAgCSAqLworICAgIAlwdWJsaWMgbG9uZyB0aW1lc3RhbXAgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdGFydHVwL0hvc3RSdWxlU2V0LmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9Ib3N0UnVsZVNldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzMzY0ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9Ib3N0UnVsZVNldC5qYXZhCkBAIC0wLDAgKzEsMTQ1IEBACisvKgorICogQ29weXJpZ2h0IDE5OTktMjAwMSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cDsKKworCitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5kaWdlc3Rlci5EaWdlc3RlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvbWNhdC51dGlsLmRpZ2VzdGVyLlJ1bGVTZXRCYXNlOworCisKKy8qKgorICogPHA+PHN0cm9uZz5SdWxlU2V0PC9zdHJvbmc+IGZvciBwcm9jZXNzaW5nIHRoZSBjb250ZW50cyBvZiBhCisgKiBIb3N0IGRlZmluaXRpb24gZWxlbWVudC4gIFRoaXMgPGNvZGU+UnVsZVNldDwvY29kZT4gZG9lcyBOT1QgaW5jbHVkZQorICogYW55IHJ1bGVzIGZvciBuZXN0ZWQgQ29udGV4dCBvciBEZWZhdWx0Q29udGV4dCBlbGVtZW50cywgd2hpY2ggc2hvdWxkCisgKiBiZSBhZGRlZCB2aWEgaW5zdGFuY2VzIG9mIDxjb2RlPkNvbnRleHRSdWxlU2V0PC9jb2RlPi48L3A+CisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBIb3N0UnVsZVNldCBleHRlbmRzIFJ1bGVTZXRCYXNlIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBtYXRjaGluZyBwYXR0ZXJuIHByZWZpeCB0byB1c2UgZm9yIHJlY29nbml6aW5nIG91ciBlbGVtZW50cy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHByZWZpeCA9IG51bGw7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcgorCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYW4gaW5zdGFuY2Ugb2YgdGhpcyA8Y29kZT5SdWxlU2V0PC9jb2RlPiB3aXRoIHRoZSBkZWZhdWx0CisgICAgICogbWF0Y2hpbmcgcGF0dGVybiBwcmVmaXguCisgICAgICovCisgICAgcHVibGljIEhvc3RSdWxlU2V0KCkgeworCisgICAgICAgIHRoaXMoIiIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYW4gaW5zdGFuY2Ugb2YgdGhpcyA8Y29kZT5SdWxlU2V0PC9jb2RlPiB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBtYXRjaGluZyBwYXR0ZXJuIHByZWZpeC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcmVmaXggUHJlZml4IGZvciBtYXRjaGluZyBwYXR0ZXJuIHJ1bGVzIChpbmNsdWRpbmcgdGhlCisgICAgICogIHRyYWlsaW5nIHNsYXNoIGNoYXJhY3RlcikKKyAgICAgKi8KKyAgICBwdWJsaWMgSG9zdFJ1bGVTZXQoU3RyaW5nIHByZWZpeCkgeworCisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIHRoaXMubmFtZXNwYWNlVVJJID0gbnVsbDsKKyAgICAgICAgdGhpcy5wcmVmaXggPSBwcmVmaXg7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiA8cD5BZGQgdGhlIHNldCBvZiBSdWxlIGluc3RhbmNlcyBkZWZpbmVkIGluIHRoaXMgUnVsZVNldCB0byB0aGUKKyAgICAgKiBzcGVjaWZpZWQgPGNvZGU+RGlnZXN0ZXI8L2NvZGU+IGluc3RhbmNlLCBhc3NvY2lhdGluZyB0aGVtIHdpdGgKKyAgICAgKiBvdXIgbmFtZXNwYWNlIFVSSSAoaWYgYW55KS4gIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGNhbGxlZAorICAgICAqIGJ5IGEgRGlnZXN0ZXIgaW5zdGFuY2UuPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIGRpZ2VzdGVyIERpZ2VzdGVyIGluc3RhbmNlIHRvIHdoaWNoIHRoZSBuZXcgUnVsZSBpbnN0YW5jZXMKKyAgICAgKiAgc2hvdWxkIGJlIGFkZGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFJ1bGVJbnN0YW5jZXMoRGlnZXN0ZXIgZGlnZXN0ZXIpIHsKKworICAgICAgICBkaWdlc3Rlci5hZGRPYmplY3RDcmVhdGUocHJlZml4ICsgIkhvc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZEhvc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNsYXNzTmFtZSIpOworICAgICAgICBkaWdlc3Rlci5hZGRTZXRQcm9wZXJ0aWVzKHByZWZpeCArICJIb3N0Iik7CisgICAgICAgIGRpZ2VzdGVyLmFkZFJ1bGUocHJlZml4ICsgIkhvc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDb3B5UGFyZW50Q2xhc3NMb2FkZXJSdWxlKCkpOworICAgICAgICBkaWdlc3Rlci5hZGRSdWxlKHByZWZpeCArICJIb3N0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTGlmZWN5Y2xlTGlzdGVuZXJSdWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgKCJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0YXJ0dXAuSG9zdENvbmZpZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJob3N0Q29uZmlnQ2xhc3MiKSk7CisgICAgICAgIGRpZ2VzdGVyLmFkZFNldE5leHQocHJlZml4ICsgIkhvc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZGRDaGlsZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGFpbmVyIik7CisKKyAgICAgICAgZGlnZXN0ZXIuYWRkQ2FsbE1ldGhvZChwcmVmaXggKyAiSG9zdC9BbGlhcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkZEFsaWFzIiwgMCk7CisKKyAgICAgICAgLy9DbHVzdGVyIGNvbmZpZ3VyYXRpb24gc3RhcnQKKyAgICAgICAgZGlnZXN0ZXIuYWRkT2JqZWN0Q3JlYXRlKHByZWZpeCArICJIb3N0L0NsdXN0ZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgLy8gTVVTVCBiZSBzcGVjaWZpZWQgaW4gdGhlIGVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjbGFzc05hbWUiKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkU2V0UHJvcGVydGllcyhwcmVmaXggKyAiSG9zdC9DbHVzdGVyIik7CisgICAgICAgIGRpZ2VzdGVyLmFkZFNldE5leHQocHJlZml4ICsgIkhvc3QvQ2x1c3RlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldENsdXN0ZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLkNsdXN0ZXIiKTsKKyAgICAgICAgLy9DbHVzdGVyIGNvbmZpZ3VyYXRpb24gZW5kCisKKyAgICAgICAgZGlnZXN0ZXIuYWRkT2JqZWN0Q3JlYXRlKHByZWZpeCArICJIb3N0L0xpc3RlbmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIC8vIE1VU1QgYmUgc3BlY2lmaWVkIGluIHRoZSBlbGVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2xhc3NOYW1lIik7CisgICAgICAgIGRpZ2VzdGVyLmFkZFNldFByb3BlcnRpZXMocHJlZml4ICsgIkhvc3QvTGlzdGVuZXIiKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkU2V0TmV4dChwcmVmaXggKyAiSG9zdC9MaXN0ZW5lciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkZExpZmVjeWNsZUxpc3RlbmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVMaXN0ZW5lciIpOworCisgICAgICAgIGRpZ2VzdGVyLmFkZE9iamVjdENyZWF0ZShwcmVmaXggKyAiSG9zdC9SZWFsbSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCAvLyBNVVNUIGJlIHNwZWNpZmllZCBpbiB0aGUgZWxlbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNsYXNzTmFtZSIpOworICAgICAgICBkaWdlc3Rlci5hZGRTZXRQcm9wZXJ0aWVzKHByZWZpeCArICJIb3N0L1JlYWxtIik7CisgICAgICAgIGRpZ2VzdGVyLmFkZFNldE5leHQocHJlZml4ICsgIkhvc3QvUmVhbG0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXRSZWFsbSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuUmVhbG0iKTsKKworICAgICAgICBkaWdlc3Rlci5hZGRPYmplY3RDcmVhdGUocHJlZml4ICsgIkhvc3QvVmFsdmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgLy8gTVVTVCBiZSBzcGVjaWZpZWQgaW4gdGhlIGVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjbGFzc05hbWUiKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkU2V0UHJvcGVydGllcyhwcmVmaXggKyAiSG9zdC9WYWx2ZSIpOworICAgICAgICBkaWdlc3Rlci5hZGRTZXROZXh0KHByZWZpeCArICJIb3N0L1ZhbHZlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWRkVmFsdmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLlZhbHZlIik7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvTGlmZWN5Y2xlTGlzdGVuZXJSdWxlLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9MaWZlY3ljbGVMaXN0ZW5lclJ1bGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGIyOTM4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvTGlmZWN5Y2xlTGlzdGVuZXJSdWxlLmphdmEKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OS0yMDAxLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5zdGFydHVwOworCisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZUxpc3RlbmVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuZGlnZXN0ZXIuUnVsZTsKK2ltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOworCisKKy8qKgorICogPHA+UnVsZSB0aGF0IGNyZWF0ZXMgYSBuZXcgPGNvZGU+TGlmZWN5Y2xlTGlzdGVuZXI8L2NvZGU+IGluc3RhbmNlLAorICogYW5kIGFzc29jaWF0ZXMgaXQgd2l0aCB0aGUgdG9wIG9iamVjdCBvbiB0aGUgc3RhY2sgKHdoaWNoIG11c3QKKyAqIGltcGxlbWVudCA8Y29kZT5MaWZlY3ljbGVMaXN0ZW5lcjwvY29kZT4pLjwvcD4KKyAqLworCitwdWJsaWMgY2xhc3MgTGlmZWN5Y2xlTGlzdGVuZXJSdWxlIGV4dGVuZHMgUnVsZSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBSdWxlLgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyQ2xhc3MgRGVmYXVsdCBuYW1lIG9mIHRoZSBMaWZlY3ljbGVMaXN0ZW5lcgorICAgICAqICBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0byBiZSBjcmVhdGVkCisgICAgICogQHBhcmFtIGF0dHJpYnV0ZU5hbWUgTmFtZSBvZiB0aGUgYXR0cmlidXRlIHRoYXQgb3B0aW9uYWxseQorICAgICAqICBpbmNsdWRlcyBhbiBvdmVycmlkZSBuYW1lIG9mIHRoZSBMaWZlY3ljbGVMaXN0ZW5lciBjbGFzcworICAgICAqLworICAgIHB1YmxpYyBMaWZlY3ljbGVMaXN0ZW5lclJ1bGUoU3RyaW5nIGxpc3RlbmVyQ2xhc3MsIFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7CisKKyAgICAgICAgdGhpcy5saXN0ZW5lckNsYXNzID0gbGlzdGVuZXJDbGFzczsKKyAgICAgICAgdGhpcy5hdHRyaWJ1dGVOYW1lID0gYXR0cmlidXRlTmFtZTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBhdHRyaWJ1dGUgbmFtZSBvZiBhbiBhdHRyaWJ1dGUgdGhhdCBjYW4gb3ZlcnJpZGUgdGhlCisgICAgICogaW1wbGVtZW50YXRpb24gY2xhc3MgbmFtZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBhdHRyaWJ1dGVOYW1lOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgPGNvZGU+TGlmZWN5Y2xlTGlzdGVuZXI8L2NvZGU+IGltcGxlbWVudGF0aW9uIGNsYXNzLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGxpc3RlbmVyQ2xhc3M7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBIYW5kbGUgdGhlIGJlZ2lubmluZyBvZiBhbiBYTUwgZWxlbWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVzIFRoZSBhdHRyaWJ1dGVzIG9mIHRoaXMgZWxlbWVudAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYSBwcm9jZXNzaW5nIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGJlZ2luKFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBuYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIC8vIEluc3RhbnRpYXRlIGEgbmV3IExpZmVjeWxlTGlzdGVuZXIgaW1wbGVtZW50YXRpb24gb2JqZWN0CisgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBsaXN0ZW5lckNsYXNzOworICAgICAgICBpZiAoYXR0cmlidXRlTmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKGF0dHJpYnV0ZU5hbWUpOworICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpCisgICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gdmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgQ2xhc3MgY2xhenogPSBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSk7CisgICAgICAgIExpZmVjeWNsZUxpc3RlbmVyIGxpc3RlbmVyID0KKyAgICAgICAgICAgIChMaWZlY3ljbGVMaXN0ZW5lcikgY2xhenoubmV3SW5zdGFuY2UoKTsKKworICAgICAgICAvLyBBZGQgdGhpcyBMaWZlY3ljbGVMaXN0ZW5lciB0byBvdXIgYXNzb2NpYXRlZCBjb21wb25lbnQKKyAgICAgICAgTGlmZWN5Y2xlIGxpZmVjeWNsZSA9IChMaWZlY3ljbGUpIGRpZ2VzdGVyLnBlZWsoKTsKKyAgICAgICAgbGlmZWN5Y2xlLmFkZExpZmVjeWNsZUxpc3RlbmVyKGxpc3RlbmVyKTsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9Mb2NhbFN0cmluZ3MucHJvcGVydGllcyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdGFydHVwL0xvY2FsU3RyaW5ncy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyZmM3NjcKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9Mb2NhbFN0cmluZ3MucHJvcGVydGllcwpAQCAtMCwwICsxLDY0IEBACitjb250ZXh0Q29uZmlnLmFwcGxpY2F0aW9uQ2xvc2U9RXJyb3IgY2xvc2luZyBhcHBsaWNhdGlvbiB3ZWIueG1sCitjb250ZXh0Q29uZmlnLmFwcGxpY2F0aW9uQ29uZmlnPUNvbmZpZ3VyYXRpb24gZXJyb3IgaW4gYXBwbGljYXRpb24gd2ViLnhtbAorY29udGV4dENvbmZpZy5hcHBsaWNhdGlvbkxpc3RlbmVyPUV4Y2VwdGlvbiBjcmVhdGluZyBsaXN0ZW5lciBvZiBjbGFzcyB7MH0KK2NvbnRleHRDb25maWcuYXBwbGljYXRpb25NaXNzaW5nPU1pc3NpbmcgYXBwbGljYXRpb24gd2ViLnhtbCwgdXNpbmcgZGVmYXVsdHMgb25seQorY29udGV4dENvbmZpZy5hcHBsaWNhdGlvblBhcnNlPVBhcnNlIGVycm9yIGluIGFwcGxpY2F0aW9uIHdlYi54bWwKK2NvbnRleHRDb25maWcuYXBwbGljYXRpb25Qb3NpdGlvbj1PY2N1cnJlZCBhdCBsaW5lIHswfSBjb2x1bW4gezF9Citjb250ZXh0Q29uZmlnLmF1dGhlbnRpY2F0b3JDb25maWd1cmVkPUNvbmZpZ3VyZWQgYW4gYXV0aGVudGljYXRvciBmb3IgbWV0aG9kIHswfQorY29udGV4dENvbmZpZy5hdXRoZW50aWNhdG9ySW5zdGFudGlhdGU9Q2Fubm90IGluc3RhbnRpYXRlIGFuIGF1dGhlbnRpY2F0b3Igb2YgY2xhc3MgezB9Citjb250ZXh0Q29uZmlnLmF1dGhlbnRpY2F0b3JNaXNzaW5nPUNhbm5vdCBjb25maWd1cmUgYW4gYXV0aGVudGljYXRvciBmb3IgbWV0aG9kIHswfQorY29udGV4dENvbmZpZy5hdXRoZW50aWNhdG9yUmVzb3VyY2VzPUNhbm5vdCBsb2FkIGF1dGhlbnRpY2F0b3JzIG1hcHBpbmcgbGlzdAorY29udGV4dENvbmZpZy5jY2U9TGlmZWN5Y2xlIGV2ZW50IGRhdGEgb2JqZWN0IHswfSBpcyBub3QgYSBDb250ZXh0Citjb250ZXh0Q29uZmlnLmNlcnRpZmljYXRlc0NvbmZpZy5hZGRlZD1BZGRlZCBjZXJ0aWZpY2F0ZXMgLT4gcmVxdWVzdCBhdHRyaWJ1dGUgVmFsdmUKK2NvbnRleHRDb25maWcuY2VydGlmaWNhdGVzQ29uZmlnLmVycm9yPUV4Y2VwdGlvbiBhZGRpbmcgQ2VydGlmaWNhdGVzVmFsdmU6Citjb250ZXh0Q29uZmlnLmRlZmF1bHRDbG9zZT1FcnJvciBjbG9zaW5nIGRlZmF1bHQgd2ViLnhtbAorY29udGV4dENvbmZpZy5kZWZhdWx0Q29uZmlnPUNvbmZpZ3VyYXRpb24gZXJyb3IgaW4gZGVmYXVsdCB3ZWIueG1sCitjb250ZXh0Q29uZmlnLmRlZmF1bHRNaXNzaW5nPU1pc3NpbmcgZGVmYXVsdCB3ZWIueG1sLCB1c2luZyBhcHBsaWNhdGlvbiB3ZWIueG1sIG9ubHkKK2NvbnRleHRDb25maWcuZGVmYXVsdFBhcnNlPVBhcnNlIGVycm9yIGluIGRlZmF1bHQgd2ViLnhtbAorY29udGV4dENvbmZpZy5kZWZhdWx0UG9zaXRpb249T2NjdXJyZWQgYXQgbGluZSB7MH0gY29sdW1uIHsxfQorY29udGV4dENvbmZpZy5taXNzaW5nUmVhbG09Tm8gUmVhbG0gaGFzIGJlZW4gY29uZmlndXJlZCB0byBhdXRoZW50aWNhdGUgYWdhaW5zdAorY29udGV4dENvbmZpZy5yb2xlLmF1dGg9V0FSTklORzogU2VjdXJpdHkgcm9sZSBuYW1lIHswfSB1c2VkIGluIGFuIDxhdXRoLWNvbnN0cmFpbnQ+IHdpdGhvdXQgYmVpbmcgZGVmaW5lZCBpbiBhIDxzZWN1cml0eS1yb2xlPgorY29udGV4dENvbmZpZy5yb2xlLmxpbms9V0FSTklORzogU2VjdXJpdHkgcm9sZSBuYW1lIHswfSB1c2VkIGluIGEgPHJvbGUtbGluaz4gd2l0aG91dCBiZWluZyBkZWZpbmVkIGluIGEgPHNlY3VyaXR5LXJvbGU+Citjb250ZXh0Q29uZmlnLnJvbGUucnVuYXM9V0FSTklORzogU2VjdXJpdHkgcm9sZSBuYW1lIHswfSB1c2VkIGluIGEgPHJ1bi1hcz4gd2l0aG91dCBiZWluZyBkZWZpbmVkIGluIGEgPHNlY3VyaXR5LXJvbGU+Citjb250ZXh0Q29uZmlnLnN0YXJ0PUNvbnRleHRDb25maWc6IFByb2Nlc3NpbmcgU1RBUlQKK2NvbnRleHRDb25maWcuc3RvcD1Db250ZXh0Q29uZmlnOiBQcm9jZXNzaW5nIFNUT1AKK2NvbnRleHRDb25maWcudGxkRW50cnlFeGNlcHRpb249RXhjZXB0aW9uIHByb2Nlc3NpbmcgVExEIHswfSBpbiBKQVIgYXQgcmVzb3VyY2UgcGF0aCB7MX0gaW4gY29udGV4dCB7Mn0KK2NvbnRleHRDb25maWcudGxkRmlsZUV4Y2VwdGlvbj1FeGNlcHRpb24gcHJvY2Vzc2luZyBUTEQgYXQgcmVzb3VyY2UgcGF0aCB7MH0gaW4gY29udGV4dCB7MX0KK2NvbnRleHRDb25maWcudGxkSmFyRXhjZXB0aW9uPUV4Y2VwdGlvbiBwcm9jZXNzaW5nIEpBUiBhdCByZXNvdXJjZSBwYXRoIHswfSBpbiBjb250ZXh0IHsxfQorY29udGV4dENvbmZpZy50bGRSZXNvdXJjZVBhdGg9SW52YWxpZCBUTEQgcmVzb3VyY2UgcGF0aCB7MH0KK2NvbnRleHRDb25maWcudW5hdmFpbGFibGU9TWFya2luZyB0aGlzIGFwcGxpY2F0aW9uIHVuYXZhaWxhYmxlIGR1ZSB0byBwcmV2aW91cyBlcnJvcihzKQorZW1iZWRkZWQuYWxyZWFkeVN0YXJ0ZWQ9RW1iZWRkZWQgc2VydmljZSBoYXMgYWxyZWFkeSBiZWVuIHN0YXJ0ZWQKK2VtYmVkZGVkLm5vRW5naW5lcz1ObyBlbmdpbmVzIGhhdmUgYmVlbiBkZWZpbmVkIHlldAorZW1iZWRkZWQubm90U3RhcnRlZD1FbWJlZGRlZCBzZXJ2aWNlIGhhcyBub3QgeWV0IGJlZW4gc3RhcnRlZAorZW1iZWRkZWQuYXV0aGVudGljYXRvck5vdEluc3RhbmNlT2ZWYWx2ZT1TcGVjaWZpZWQgQXV0aGVudGljYXRvciBpcyBub3QgYSBWYWx2ZQorZW5naW5lQ29uZmlnLmNjZT1MaWZlY3ljbGUgZXZlbnQgZGF0YSBvYmplY3QgezB9IGlzIG5vdCBhbiBFbmdpbmUKK2VuZ2luZUNvbmZpZy5zdGFydD1FbmdpbmVDb25maWc6IFByb2Nlc3NpbmcgU1RBUlQKK2VuZ2luZUNvbmZpZy5zdG9wPUVuZ2luZUNvbmZpZzogUHJvY2Vzc2luZyBTVE9QCitob3N0Q29uZmlnLmFwcEJhc2U9QXBwbGljYXRpb24gYmFzZSBkaXJlY3RvcnkgezB9IGRvZXMgbm90IGV4aXN0Citob3N0Q29uZmlnLmNjZT1MaWZlY3ljbGUgZXZlbnQgZGF0YSBvYmplY3QgezB9IGlzIG5vdCBhIEhvc3QKK2hvc3RDb25maWcuZGVwbG95PURlcGxveWluZyB3ZWIgYXBwbGljYXRpb24gZGlyZWN0b3J5IHswfQoraG9zdENvbmZpZy5kZXBsb3lEZXNjcmlwdG9yPURlcGxveWluZyBjb25maWd1cmF0aW9uIGRlc2NyaXB0b3IgezB9Citob3N0Q29uZmlnLmRlcGxveURlc2NyaXB0b3IuZXJyb3I9RXJyb3IgZGVwbG95aW5nIGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRvciB7MH0KK2hvc3RDb25maWcuZGVwbG95RGlyPURlcGxveWluZyB3ZWIgYXBwbGljYXRpb24gZGlyZWN0b3J5IHswfQoraG9zdENvbmZpZy5kZXBsb3lEaXIuZXJyb3I9RXJyb3IgZGVwbG95aW5nIHdlYiBhcHBsaWNhdGlvbiBkaXJlY3RvcnkgezB9Citob3N0Q29uZmlnLmRlcGxveUphcj1EZXBsb3lpbmcgd2ViIGFwcGxpY2F0aW9uIGFyY2hpdmUgezB9Citob3N0Q29uZmlnLmRlcGxveUphci5lcnJvcj1FcnJvciBkZXBsb3lpbmcgd2ViIGFwcGxpY2F0aW9uIGFyY2hpdmUgezB9Citob3N0Q29uZmlnLmRlcGxveS5lcnJvcj1FeGNlcHRpb24gd2hpbGUgZGVwbG95aW5nIHdlYiBhcHBsaWNhdGlvbiBkaXJlY3RvcnkgezB9Citob3N0Q29uZmlnLmRlcGxveWluZz1EZXBsb3lpbmcgZGlzY292ZXJlZCB3ZWIgYXBwbGljYXRpb25zCitob3N0Q29uZmlnLmV4cGFuZD1FeHBhbmRpbmcgd2ViIGFwcGxpY2F0aW9uIGFyY2hpdmUgezB9Citob3N0Q29uZmlnLmV4cGFuZC5lcnJvcj1FeGNlcHRpb24gd2hpbGUgZXhwYW5kaW5nIHdlYiBhcHBsaWNhdGlvbiBhcmNoaXZlIHswfQoraG9zdENvbmZpZy5leHBhbmRpbmc9RXhwYW5kaW5nIGRpc2NvdmVyZWQgd2ViIGFwcGxpY2F0aW9uIGFyY2hpdmVzCitob3N0Q29uZmlnLmNvbnRleHQucmVzdGFydD1FcnJvciBkdXJpbmcgY29udGV4dCB7MH0gcmVzdGFydAoraG9zdENvbmZpZy5yZW1vdmVYTUw9Q29udGV4dCB7MH0gaXMgdW5kZXBsb3llZAoraG9zdENvbmZpZy5yZW1vdmVESVI9RGlyZWN0b3J5IHswfSBpcyB1bmRlcGxveWVkCitob3N0Q29uZmlnLnJlbW92ZVdBUj1XYXIgezB9IGlzIHVuZGVwbG95ZWRob3N0Q29uZmlnLnN0YXJ0PUhvc3RDb25maWc6IFByb2Nlc3NpbmcgU1RBUlQKK2hvc3RDb25maWcuc3RvcD1Ib3N0Q29uZmlnOiBQcm9jZXNzaW5nIFNUT1AKK2hvc3RDb25maWcudW5kZXBsb3k9VW5kZXBsb3lpbmcgd2ViIGFwcGxpY2F0aW9uIGF0IGNvbnRleHQgcGF0aCB7MH0KK2hvc3RDb25maWcudW5kZXBsb3kuZXJyb3I9RXJyb3IgdW5kZXBsb3lpbmcgd2ViIGFwcGxpY2F0aW9uIGF0IGNvbnRleHQgcGF0aCB7MH0KK2hvc3RDb25maWcudW5kZXBsb3lpbmc9VW5kZXBsb3lpbmcgZGVwbG95ZWQgd2ViIGFwcGxpY2F0aW9ucwordXNlckNvbmZpZy5kYXRhYmFzZT1FeGNlcHRpb24gbG9hZGluZyB1c2VyIGRhdGFiYXNlCit1c2VyQ29uZmlnLmRlcGxveT1EZXBsb3lpbmcgd2ViIGFwcGxpY2F0aW9uIGZvciB1c2VyIHswfQordXNlckNvbmZpZy5kZXBsb3lpbmc9RGVwbG95aW5nIHVzZXIgd2ViIGFwcGxpY2F0aW9ucwordXNlckNvbmZpZy5lcnJvcj1FcnJvciBkZXBsb3lpbmcgd2ViIGFwcGxpY2F0aW9uIGZvciB1c2VyIHswfQordXNlckNvbmZpZy5zdGFydD1Vc2VyQ29uZmlnOiBQcm9jZXNzaW5nIFNUQVJUCit1c2VyQ29uZmlnLnN0b3A9VXNlckNvbmZpZzogUHJvY2Vzc2luZyBTVE9QCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9Mb2NhbFN0cmluZ3NfZXMucHJvcGVydGllcyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdGFydHVwL0xvY2FsU3RyaW5nc19lcy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlY2Y4YjEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9Mb2NhbFN0cmluZ3NfZXMucHJvcGVydGllcwpAQCAtMCwwICsxLDYxIEBACitjb250ZXh0Q29uZmlnLmFwcGxpY2F0aW9uQ2xvc2U9RXJyb3IgZHVyYW50ZSBlbCBjaWVycmUgZGVsIGFyY2hpdm8gd2ViLnhtbCBkZSBsYSBhcGxpY2FjafNuCitjb250ZXh0Q29uZmlnLmFwcGxpY2F0aW9uQ29uZmlnPUVycnJvciBkZSBjb25maWd1cmFjafNuIGVuIGVsIGFyY2hpdm8gd2ViLnhtbCBkZSBsYSBhcGxpY2FjafNuCitjb250ZXh0Q29uZmlnLmFwcGxpY2F0aW9uTGlzdGVuZXI9RXhjZXBjafNuIGR1cmFudGUgbGEgY3JlYWNp824gZGUgbGEgY2xhc2UgZGUgZXNjdWNoYSAobGlzdGVuZXIpIHswfQorY29udGV4dENvbmZpZy5hcHBsaWNhdGlvbk1pc3Npbmc9RmFsdGEgZWwgYXJjaGl2byB3ZWIueG1sIGRlIGxhIGFwbGljYWNp825iLiBVdGlsaXphbmRvIGxvcyBwYXLhbWV0cm9zIHBvciBkZWZlY3RvCitjb250ZXh0Q29uZmlnLmFwcGxpY2F0aW9uUGFyc2U9RXJyb3IgZGUgZXZhbHVhY2nzbiAocGFyc2UpIGVuIGVsIGFyY2hpdm8gd2ViLnhtbCBkZSBsYSBhcGxpY2FjafNuCitjb250ZXh0Q29uZmlnLmFwcGxpY2F0aW9uUG9zaXRpb249U2UgaGEgcHJvZHVjaWRvIGVuIGxhIGztbmVhIHswfSBjb2x1bW5hIHsxfQorY29udGV4dENvbmZpZy5hdXRoZW50aWNhdG9yQ29uZmlndXJlZD1Db25maWd1cmFjafNuIGRlIHVuIGF1dGVudGlmaWNhZG9yIChhdXRoZW50aWNhdG9yKSBwYXJhIGVsIG3pdG9kbyB7MH0KK2NvbnRleHRDb25maWcuYXV0aGVudGljYXRvckluc3RhbnRpYXRlPUltcG9zaWJsZSBkZSBpbnN0YW5jaWFyIHVuIGF1dGVudGljYWRvciAoYXV0aGVudGljYXRvcikgcGFyYSBsYSBjbGFzZSB7MH0KK2NvbnRleHRDb25maWcuYXV0aGVudGljYXRvck1pc3Npbmc9SW1wb3NpYmxlIGRlIGNvbmZpZ3VyYXIgdW4gYXV0ZW50aWZpY2Fkb3IgKGF1dGhlbnRpY2F0b3IpIHBhcmEgZWwgbel0b2RvIHswfQorY29udGV4dENvbmZpZy5hdXRoZW50aWNhdG9yUmVzb3VyY2VzPUltcG9zaWJsZSBkZSBjYXJnYXIgbGEgbGlzdGEgZGUgY29ycmVzcG9uZGVuY2lhIGRlIGF1dGVudGljYWRvcmVzIChhdXRoZW50aWNhdG9ycykKK2NvbnRleHRDb25maWcuY2NlPUVsIG9iamV0byBkZSBsb3MgZGF0b3MgZGUgZXZlbnRvIGRlIGNpY2xvIGRlIHZpZGEgKExpZmVjeWNsZSBldmVudCBkYXRhIG9iamVjdCkgezB9IG5vIGVzIHVuIENvbnRleHRvCitjb250ZXh0Q29uZmlnLmNlcnRpZmljYXRlc0NvbmZpZy5hZGRlZD1BZGljafNuIGRlIGNlcnRpZmljYWRvcyAtPiByZXF1aWVyZSB24Wx2dWxhIGRlIGF0cmlidXRvIChhdHRyaWJ1dGUgVmFsdmUpCitjb250ZXh0Q29uZmlnLmNlcnRpZmljYXRlc0NvbmZpZy5lcnJvcj1FeGNlcGNp824gZHVyYW50ZSBsYSBhZGljafNuIGRlICJDZXJ0aWZpY2F0ZXNWYWx2ZSI6Citjb250ZXh0Q29uZmlnLmRlZmF1bHRDbG9zZT1FcnJvciBkdXJhbnRlIGVsIGNpZXJyZSBkZWwgYXJjaGl2byB3ZWIueG1sIHBvciBkZWZlY3RvCitjb250ZXh0Q29uZmlnLmRlZmF1bHRDb25maWc9RXJyb3IgZGUgY29uZmlndXJhY2nzbiBlbiBlbCBhcmNoaXZvIHdlYi54bWwgcG9yIGRlZmVjdG8KK2NvbnRleHRDb25maWcuZGVmYXVsdE1pc3Npbmc9RmFsdGEgZWwgYXJjaGl2byB3ZWIueG1sIHBvciBkZWZlY3RvLCB1dGlsaXphbmRvIHPzbG8gZWwgYXJjaGl2byB3ZWIueG1sIGRlIGxhIGFwbGljYWNp824KK2NvbnRleHRDb25maWcuZGVmYXVsdFBhcnNlPUVycm9yIGRlIGV2YWx1YWNp824gKHBhcnNlKSBlbiBlbCBhcmNpdm8gd2ViLnhtbCBwb3IgZGVmZWN0bworY29udGV4dENvbmZpZy5kZWZhdWx0UG9zaXRpb249U2UgaGEgcHJvZHVjaWRvIGVuIGxhIGztbmVhIHswfSBjb2x1bW5hIHsxfQorY29udGV4dENvbmZpZy5taXNzaW5nUmVhbG09QWxn+m4gcmVpbm8gKHJlYWxtKSBubyBoYSBzaWRvIGNvbmZpZ3VyYWRvIHBhcmEgcmVhbGl6YXIgbGEgYXV0ZW50aWNhY2nzbgorY29udGV4dENvbmZpZy5yb2xlLmF1dGg9QVRFTkNJ0046IEVsIG5vbWJyZSBkZSBwYXBlbCBkZSBzZWd1cmlkYWQgezB9IGVzIHVzYWRvIGVuIHVuIDxhdXRoLWNvbnN0cmFpbnQ+IHNpbiBoYWJlciBzaWRvIGRlZmluaWRvIGVuIDxzZWN1cml0eS1yb2xlPgorY29udGV4dENvbmZpZy5yb2xlLmxpbms9QVRFTkNJ0046IEVsIG5vbWJyZSBkZSBwYXBlbCBkZSBzZWd1cmlkYWQgezB9IGVzIHVzYWRvIGVuIHVuIDxyb2xlLWxpbms+IHNpbiBoYWJlciBzaWRvIGRlZmluaWRvIGVuIDxzZWN1cml0eS1yb2xlPgorY29udGV4dENvbmZpZy5yb2xlLnJ1bmFzPUFURU5DSdNOOiBFbCBub21icmUgZGUgcGFwZWwgZGUgc2VndXJpZGFkIHswfSBlcyB1c2FkbyBlbiB1biA8cnVuLWFzPiBzaW4gaGFiZXIgc2lkbyBkZWZpbmlkbyBlbiA8c2VjdXJpdHktcm9sZT4KK2NvbnRleHRDb25maWcuc3RhcnQ9IkNvbnRleHRDb25maWciOiBUcmF0YW1pZW50byBkZWwgIlNUQVJUIgorY29udGV4dENvbmZpZy5zdG9wPSJDb250ZXh0Q29uZmlnIjogVHJhdGFtaWVudG8gZGVsICJTVE9QIgorY29udGV4dENvbmZpZy50bGRFbnRyeUV4Y2VwdGlvbj1FeGNlcGNp824gZHVyYW50ZSBlbCB0cmF0YW1pZW50byBkZSBsYSBUTEQgezB9IGVuIGVsIEpBUiBpbmRpY2FkbyBwb3IgbGEgdHJheWVjdG9yaWEgZGUgcmVjdXJzbyB7MX0KK2NvbnRleHRDb25maWcudGxkRmlsZUV4Y2VwdGlvbj1FeGNlcGNp824gZHVyYW50ZSBlbCB0cmF0YW1pZW50byBkZSBsYSBUTEQgaW5kaWNhZGEgcG9yIGxhIHRyYXllY3RvcmlhIGRlIHJlY3Vyc28gezB9Citjb250ZXh0Q29uZmlnLnRsZEphckV4Y2VwdGlvbj1FeGNlcGNp824gZHVyYW50ZSBlbCB0cmF0YW1pZW50byBkZWwgSkFSIGluZGljYWRvIHBvciBsYSB0cmF5ZWN0b3JpYSBkZSByZWN1cnNvIHswfQorY29udGV4dENvbmZpZy50bGRSZXNvdXJjZVBhdGg9VHJheWVjdG9yaWEgZGUgcmVjdXJzbyBUTEQgezB9IGluduFsaWRhCitjb250ZXh0Q29uZmlnLnVuYXZhaWxhYmxlPUVzdGEgYXBsaWNhY2nzbiBlc3ThIG1hcmNhZGEgY29tbyBubyBkaXNwb25pYmxlIGRlYmlkbyBhIGxvcyBlcnJvcmVzIHByZWNlZGVudGVzCitlbWJlZGRlZC5hbHJlYWR5U3RhcnRlZD1FbCBzZXJ2aWNpbyBlbWJlYmlkbyAoZW1iZWRkZWQgc2VydmljZSkgeWEgaGEgc2lkbyBhcnJhbmNhZG8KK2VtYmVkZGVkLm5vRW5naW5lcz1BbGf6biBtb3RvciAoZW5naW5lKSBubyBoYSBzaWRvIGH6biBkZWZpbmlkbworZW1iZWRkZWQubm90U3RhcnRlZD1FbCBzZXJ2aWNpbyBlbWJlYmlkbyAoZW1iZWRkZWQgc2VydmljZSkgYfpuIG5vIGhhIHNpZG8gYXJyYW5jYWRvCitlbmdpbmVDb25maWcuY2NlPUVsIG9iamV0byBkZSBsb3MgZGF0b3MgZGUgZXZlbnRvIGRlIGNpY2xvIGRlIHZpZGEgKExpZmVjeWNsZSBldmVudCBkYXRhIG9iamVjdCkgezB9IG5vIGVzIHVuIG1vdG9yIChlbmdpbmUpCitlbmdpbmVDb25maWcuc3RhcnQ9IkVuZ2luZUNvbmZpZyI6IFRyYXRhbWllbnRvIGRlbCAiU1RBUlQiCitlbmdpbmVDb25maWcuc3RvcD0iRW5naW5lQ29uZmlnIjogVHJhdGFtaWVudG8gZGVsICJTVE9QIgoraG9zdENvbmZpZy5hcHBCYXNlPU5vIGV4aXN0ZSBlbCBkaXJlY3RvcmlvIGJhc2UgZGUgbGEgYXBsaWNhY2nzbiB7MH0KK2hvc3RDb25maWcuY2NlPUVsIG9iamV0byBkZSBsb3MgZGF0b3MgZGUgZXZlbnRvIGRlIGNpY2xvIGRlIHZpZGEgKExpZmVjeWNsZSBldmVudCBkYXRhIG9iamVjdCkgezB9IG5vIGVzIHVuYSBt4XF1aW5hIChob3N0KQoraG9zdENvbmZpZy5kZXBsb3k9RGVzcGxpZXF1ZSBkZWwgZGlyZWN0b3JpbyB7MH0gZGUgbGEgYXBsaWNhY2nzbiB3ZWIKK2hvc3RDb25maWcuZGVwbG95RGVzY3JpcHRvcj1EZXNwbGllcXVlIGRlbCBkZXNjcmlwdG9yIGRlIGNvbmZpZ3VyYWNp824gezB9Citob3N0Q29uZmlnLmRlcGxveURlc2NyaXB0b3IuZXJyb3I9RXJyb3IgZHVyYW50ZSBlbCBkZXNwbGllZ3VlIGRlbCBkZXNjcmlwdG9yIGRlIGNvbmZpZ3VyYWNp824gezB9Citob3N0Q29uZmlnLmRlcGxveURpcj1EZXNwbGllZ3VlIGRlbCBkaXJlY3RvcmlvIHswfSBkZSBsYSBhcGxpY2FjafNuIHdlYgoraG9zdENvbmZpZy5kZXBsb3lEaXIuZXJyb3I9RXJyb3IgZHVyYW50ZSBlbCBkZXNwbGllZ3VlIGRlbCBkaXJlY3RvcmlvIHswfSBkZSBsYSBhcGxpY2FjafNuIHdlYgoraG9zdENvbmZpZy5kZXBsb3lKYXI9RGVzcGxpZWd1ZSBkZWwgYXJjaGl2byB7MH0gZGUgbGEgYXBsaWNhY2nzbiB3ZWIKK2hvc3RDb25maWcuZGVwbG95SmFyLmVycm9yPUVycm9yIGR1cmFudGUgZWwgZGVzcGxpZWd1ZSBkZWwgYXJjaGl2byB7MH0gZGUgbGEgYXBsaWNhY2nzbiB3ZWIKK2hvc3RDb25maWcuZGVwbG95LmVycm9yPUV4Y2VwY2nzbiBlbiBlbCBkaXJlY3RvcmlvIHswfSBkZSBsYSBhcGxpY2FjafNuIHdlYgoraG9zdENvbmZpZy5kZXBsb3lpbmc9RGVzcGxlZ2FuZG8gYXBsaWNhY2lvbmVzIHdlYiBkZXNjdWJpZXJ0YXMKK2hvc3RDb25maWcuZXhwYW5kPURlc2NvbXByZXNp824gZGVsIGFyY2hpdm8gezB9IGRlIGxhIGFwbGljYWNp824gd2ViCitob3N0Q29uZmlnLmV4cGFuZC5lcnJvcj1FeGNlcGNp824gZHVyYW50ZSBsYSBkZXNjb21wcmVzafNuIGRlbCBhcmNoaXZvIHswfSBkZSBsYSBhcGxpY2FjafNuIHdlYgoraG9zdENvbmZpZy5leHBhbmRpbmc9RGVzY3ViaWVydGEgZGVzY29tcHJlc2nzbiBkZSBhcmNoaXZvcyBkZSBhcGxpY2FjaW9uZXMgd2ViCitob3N0Q29uZmlnLmNvbnRleHQucmVzdGFydD1FcnJvciBkdXJhbnRlIGVsIGFycmFucXVlIGRlbCBjb250ZXh0byB7MH0KK2hvc3RDb25maWcuc3RhcnQ9Ikhvc3RDb25maWciOiBUcmF0YW1pZW50byBkZWwgIlNUQVJUIgoraG9zdENvbmZpZy5zdG9wPSJIb3N0Q29uZmlnIjogVHJhdGFtaWVudG8gZGVsICJTVE9QIgoraG9zdENvbmZpZy51bmRlcGxveT1SZXBsaWVndWUgKHVuZGVwbG95KSBkZSBsYSBhcGxpY2FjafNuIHdlYiBxdWUgdGllbmUgY29tbyB0cmF5ZWN0b3JpYSBkZSBjb250ZXh0byB7MH0KK2hvc3RDb25maWcudW5kZXBsb3kuZXJyb3I9RXJyb3IgZHVyYW50ZSBlbCByZXBsaWVndWUgKHVuZGVwbG95KSBkZSBsYSBhcGxpY2FjafNuIHdlYiBxdWUgdGllbmUgY29tbyB0cmF5ZWN0b3JpYSBkZSBjb250ZXh0byB7MH0KK2hvc3RDb25maWcudW5kZXBsb3lpbmc9UmVwbGllZ3VlIGRlIGxhcyBhcGxpY2FjaW9uZXMgd2ViIGRlc3BsZWdhZGFzCit1c2VyQ29uZmlnLmRhdGFiYXNlPUV4Y2VwY2nzbiBkdXJhbnRlIGxhIGNhcmdhIGRlIGJhc2UgZGUgZGF0b3MgZGUgdXN1YXJpbwordXNlckNvbmZpZy5kZXBsb3k9RGVzcGxpZWd1ZSBkZSBsYSBhcGxpY2FjafNuIHdlYiBwYXJhIGVsIHVzdWFyaW8gezB9Cit1c2VyQ29uZmlnLmRlcGxveWluZz1EZXNwbGVnYW5kbyBhcGxpY2FjaW9uZXMgd2ViIHBhcmEgZWwgdXN1YXJpbwordXNlckNvbmZpZy5lcnJvcj1FcnJvciBkdXJhbnRlIGVsIGRlc3BsaWVndWUgZGUgbGEgYXBsaWNhY2nzbiB3ZWIgcGFyYSBlbCB1c2FyaW8gezB9Cit1c2VyQ29uZmlnLnN0YXJ0PSJVc2VyQ29uZmlnIjogVHJhdGFtaWVudG8gZGVsICJTVEFSVCIKK3VzZXJDb25maWcuc3RvcD0iVXNlckNvbmZpZyI6IFRyYXRhbWllbnRvIGRlbCAiU1RPUCIKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdGFydHVwL0xvY2FsU3RyaW5nc19mci5wcm9wZXJ0aWVzIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvTG9jYWxTdHJpbmdzX2ZyLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY1MTk2NwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdGFydHVwL0xvY2FsU3RyaW5nc19mci5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNTkgQEAKK2NvbnRleHRDb25maWcuYXBwbGljYXRpb25DbG9zZT1FcnJldXIgbG9ycyBkZSBsYSBmZXJtZXR1cmUgZHUgZmljaGllciB3ZWIueG1sIGRlIGwnJ2FwcGxpY2F0aW9uCitjb250ZXh0Q29uZmlnLmFwcGxpY2F0aW9uQ29uZmlnPUVycmV1ciBkZSBjb25maWd1cmF0aW9uIGRhbnMgbGUgZmljaGllciB3ZWIueG1sIGRlIGwnJ2FwcGxpY2F0aW9uCitjb250ZXh0Q29uZmlnLmFwcGxpY2F0aW9uTGlzdGVuZXI9RXhjZXB0aW9uIGxvcnMgZGUgbGEgY3LpYXRpb24gZGUgbGEgY2xhc3NlIGQnJ+ljb3V0ZSAobGlzdGVuZXIpIHswfQorY29udGV4dENvbmZpZy5hcHBsaWNhdGlvbk1pc3Npbmc9TGUgZmljaGllciB3ZWIueG1sIGRlIGwnJ2FwcGxpY2F0aW9uIGVzdCBhYnNlbnQsIHV0aWxpc2F0aW9uIGRlcyBwYXJhbep0cmVzIHBhciBk6WZhdXQKK2NvbnRleHRDb25maWcuYXBwbGljYXRpb25QYXJzZT1FcnJldXIgZCcn6XZhbHVhdGlvbiAocGFyc2UpIGRhbnMgbGUgZmljaGllciB3ZWIueG1sIGRlIGwnJ2FwcGxpY2F0aW9uCitjb250ZXh0Q29uZmlnLmFwcGxpY2F0aW9uUG9zaXRpb249UycnZXN0IHByb2R1aXRlIOAgbGEgbGlnbmUgezB9IGNvbG9ubmUgezF9Citjb250ZXh0Q29uZmlnLmF1dGhlbnRpY2F0b3JDb25maWd1cmVkPUNvbmZpZ3VyYXRpb24gZCcndW4gYXV0aGVudGlmaWNhdGV1ciAoYXV0aGVudGljYXRvcikgcG91ciBsYSBt6XRob2RlIHswfQorY29udGV4dENvbmZpZy5hdXRoZW50aWNhdG9ySW5zdGFudGlhdGU9SW1wb3NzaWJsZSBkJydpbnN0YW5jaWVyIHVuIGF1dGhlbnRpZmljYXRldXIgKGF1dGhlbnRpY2F0b3IpIHBvdXIgbGEgY2xhc3NlIHswfQorY29udGV4dENvbmZpZy5hdXRoZW50aWNhdG9yTWlzc2luZz1JbXBvc3NpYmxlIGRlIGNvbmZpZ3VyZXIgdW4gYXV0aGVudGlmaWNhdGV1ciAoYXV0aGVudGljYXRvcikgcG91ciBsYSBt6XRob2RlIHswfQorY29udGV4dENvbmZpZy5hdXRoZW50aWNhdG9yUmVzb3VyY2VzPUltcG9zc2libGUgZGUgY2hhcmdlciBsYSBsaXN0ZSBkZSBjb3JyZXNwb25kYW5jZSBkZXMgYXV0aGVudGlmaWNhdGV1ciAoYXV0aGVudGljYXRvcnMpCitjb250ZXh0Q29uZmlnLmNjZT1MJydvYmpldCBkb25u6WUg6XbobmVtZW50IGN5Y2xlIGRlIHZpZSAoTGlmZWN5Y2xlIGV2ZW50IGRhdGEgb2JqZWN0KSB7MH0gbicnZXN0IHBhcyB1biBDb250ZXh0ZQorY29udGV4dENvbmZpZy5jZXJ0aWZpY2F0ZXNDb25maWcuYWRkZWQ9QWpvdXQgZGUgY2VydGlmaWNhdHMgLT4gcmVxdep0ZSBBdHRyaWJ1dCBkZSBWYWx2ZSAoYXR0cmlidXRlIFZhbHZlKQorY29udGV4dENvbmZpZy5jZXJ0aWZpY2F0ZXNDb25maWcuZXJyb3I9RXhjZXB0aW9uIGxvcnMgZGUgbCcnYWpvdXQgZGVzICJDZXJ0aWZpY2F0ZXNWYWx2ZSI6Citjb250ZXh0Q29uZmlnLmRlZmF1bHRDbG9zZT1FcnJldXIgbG9ycyBkZSBsYSBmZXJtZXR1cmUgZHUgZmljaGllciB3ZWIueG1sIHBhciBk6WZhdXQKK2NvbnRleHRDb25maWcuZGVmYXVsdENvbmZpZz1FcnJldXIgZGUgY29uZmlndXJhdGlvbiBkYW5zIGxlIGZpY2hpZXIgd2ViLnhtbCBwYXIgZOlmYXV0Citjb250ZXh0Q29uZmlnLmRlZmF1bHRNaXNzaW5nPUxlIGZpY2hpZXIgd2ViLnhtbCBwYXIgZOlmYXV0IGVzdCBhYnNlbnQsIHV0aWxpc2F0aW9uIGR1IGZpY2hpZXIgd2ViLnhtbCBkZSBsJydhcHBsaWNhdGlvbiB3ZWIueG1sIHNldWxlbWVudAorY29udGV4dENvbmZpZy5kZWZhdWx0UGFyc2U9RXJyZXVyIGQnJ+l2YWx1YXRpb24gKHBhcnNlKSBkYW5zIGxlIGZpY2hpZXIgd2ViLnhtbCBwYXIgZOlmYXV0Citjb250ZXh0Q29uZmlnLmRlZmF1bHRQb3NpdGlvbj1TJydlc3QgcHJvZHVpdGUg4CBsYSBsaWduZSB7MH0gY29sb25uZSB7MX0KK2NvbnRleHRDb25maWcubWlzc2luZ1JlYWxtPUF1Y3VuIHJveWF1bWUgKHJlYWxtKSBuJydhIOl06SBjb25maWd1cukgcG91ciBy6WFsaXNlciBsJydhdXRoZW50aWZpY2F0aW9uCitjb250ZXh0Q29uZmlnLnJvbGUuYXV0aD1BVFRFTlRJT046IExlIG5vbSBkZSBy9GxlIGRlIHPpY3VyaXTpIHswfSBlc3QgdXRpbGlz6SBkYW5zIHVuIDxhdXRoLWNvbnN0cmFpbnQ+IHNhbnMgYXZvaXIg6XTpIGTpZmluaSBkYW5zIDxzZWN1cml0eS1yb2xlPgorY29udGV4dENvbmZpZy5yb2xlLmxpbms9QVRURU5USU9OOiBMZSBub20gZGUgcvRsZSBkZSBz6WN1cml06SB7MH0gZXN0IHV0aWxpc+kgZGFucyB1biA8cm9sZS1saW5rPiBzYW5zIGF2b2lyIOl06SBk6WZpbmkgZGFucyA8c2VjdXJpdHktcm9sZT4KK2NvbnRleHRDb25maWcucm9sZS5ydW5hcz1BVFRFTlRJT046IExlIG5vbSBkZSBy9GxlIGRlIHPpY3VyaXTpIHswfSBlc3QgdXRpbGlz6SBkYW5zIHVuIDxydW4tYXM+IHNhbnMgYXZvaXIg6XTpIGTpZmluaSBkYW5zIDxzZWN1cml0eS1yb2xlPgorY29udGV4dENvbmZpZy5zdGFydD0iQ29udGV4dENvbmZpZyI6IFRyYWl0ZW1lbnQgZHUgIlNUQVJUIgorY29udGV4dENvbmZpZy5zdG9wPSJDb250ZXh0Q29uZmlnIjogVHJhaXRlbWVudCBkdSAiU1RPUCIKK2NvbnRleHRDb25maWcudGxkRW50cnlFeGNlcHRpb249RXhjZXB0aW9uIGxvcnMgZHUgdHJhaXRlbWVudCBkZSBsYSBUTEQgezB9IGRhbnMgbGUgSkFSIGluZGlxdekgcGFyIGxlIGNoZW1pbiBkZSByZXNzb3VyY2UgezF9Citjb250ZXh0Q29uZmlnLnRsZEZpbGVFeGNlcHRpb249RXhjZXB0aW9uIGxvcnMgZHUgdHJhaXRlbWVudCBkZSBsYSBUTEQgaW5kaXF16SBwYXIgbGUgY2hlbWluIGRlIHJlc3NvdXJjZSB7MH0KK2NvbnRleHRDb25maWcudGxkSmFyRXhjZXB0aW9uPUV4Y2VwdGlvbiBsb3JzIGR1IHRyYWl0ZW1lbnQgZHUgSkFSIGluZGlxdekgcGFyIGxlIGNoZW1pbiBkZSByZXNzb3VyY2UgezB9Citjb250ZXh0Q29uZmlnLnRsZFJlc291cmNlUGF0aD1DaGVtaW4gZGUgcmVzc291cmNlIFRMRCB7MH0gaW52YWxpZGUKK2NvbnRleHRDb25maWcudW5hdmFpbGFibGU9Q2V0dGUgYXBwbGljYXRpb24gZXN0IG1hcnF16WUgY29tbWUgbm9uIGRpc3BvbmlibGUgc3VpdGUgYXV4IGVycmV1cnMgcHLpY+lkZW50ZXMKK2VtYmVkZGVkLmFscmVhZHlTdGFydGVkPUxlIHNlcnZpY2UgZW5mb3VpIChlbWJlZGRlZCBzZXJ2aWNlKSBhIGTpauAg6XTpIGTpbWFycukKK2VtYmVkZGVkLm5vRW5naW5lcz1BdWN1biBtb3RldXIgKGVuZ2luZSkgbicnYSBlbmNvcmUg6XTpIGTpZmluaQorZW1iZWRkZWQubm90U3RhcnRlZD1MZSBzZXJ2aWNlIGVuZm91aSAoZW1iZWRkZWQgc2VydmljZSkgbicnYSBwYXMgZW5jb3JlIOl06SBk6W1hcnLpCitlbmdpbmVDb25maWcuY2NlPUwnJ29iamV0IGRvbm7pZSDpduhuZW1lbnQgY3ljbGUgZGUgdmllIChMaWZlY3ljbGUgZXZlbnQgZGF0YSBvYmplY3QpIHswfSBuJydlc3QgcGFzIHVuIG1vdGV1ciAoZW5naW5lKQorZW5naW5lQ29uZmlnLnN0YXJ0PSJFbmdpbmVDb25maWciOiBUcmFpdGVtZW50IGR1ICJTVEFSVCIKK2VuZ2luZUNvbmZpZy5zdG9wPSJFbmdpbmVDb25maWciOiBUcmFpdGVtZW50IGR1ICJTVE9QIgoraG9zdENvbmZpZy5jY2U9TCcnb2JqZXQgZG9ubullIOl26G5lbWVudCBjeWNsZSBkZSB2aWUgKExpZmVjeWNsZSBldmVudCBkYXRhIG9iamVjdCkgezB9IG4nJ2VzdCBwYXMgdW4gaPR0ZQoraG9zdENvbmZpZy5kZXBsb3k9ROlwbG9pZW1lbnQgZHUgculwZXJ0b2lyZSB7MH0gZGUgbCcnYXBwbGljYXRpb24gd2ViCitob3N0Q29uZmlnLmRlcGxveURlc2NyaXB0b3I9ROlwbG9pZW1lbnQgZHUgZGVzY3JpcHRldXIgZGUgY29uZmlndXJhdGlvbiB7MH0KK2hvc3RDb25maWcuZGVwbG95RGVzY3JpcHRvci5lcnJvcj1FcnJldXIgbG9ycyBkdSBk6XBsb2llbWVudCBkdSBkZXNjcmlwdGV1ciBkZSBjb25maWd1cmF0aW9uIHswfQoraG9zdENvbmZpZy5kZXBsb3lEaXI9ROlwbG9pZW1lbnQgZHUgculwZXJ0b2lyZSB7MH0gZGUgbCcnYXBwbGljYXRpb24gd2ViCitob3N0Q29uZmlnLmRlcGxveURpci5lcnJvcj1FcnJldXIgbG9ycyBkdSBk6XBsb2llbWVudCBkdSBy6XBlcnRvaXJlIHswfSBkZSBsJydhcHBsaWNhdGlvbiB3ZWIKK2hvc3RDb25maWcuZGVwbG95SmFyPUTpcGxvaWVtZW50IGRlIGwnJ2FyY2hpdmUgezB9IGRlIGwnJ2FwcGxpY2F0aW9uIHdlYgoraG9zdENvbmZpZy5kZXBsb3lKYXIuZXJyb3I9RXJyZXVyIGxvcnMgZHUgZOlwbG9pZW1lbnQgZGUgbCcnYXJjaGl2ZSB7MH0gZGUgbCcnYXBwbGljYXRpb24gd2ViCitob3N0Q29uZmlnLmRlcGxveS5lcnJvcj1FeGNlcHRpb24gbG9ycyBkdSBy6XBlcnRvaXJlIHswfSBkZSBsJydhcHBsaWNhdGlvbiB3ZWIKK2hvc3RDb25maWcuZGVwbG95aW5nPUTpcGxvaWVtZW50IGRlcyBhcHBsaWNhdGlvbnMgd2ViIGTpY291dmVydGVzIChkaXNjb3ZlcmVkKQoraG9zdENvbmZpZy5leHBhbmQ9ROljb21wcmVzc2lvbiBkZSBsJydhcmNoaXZlIHswfSBkZSBsJydhcHBsaWNhdGlvbiB3ZWIKK2hvc3RDb25maWcuZXhwYW5kLmVycm9yPUV4Y2VwdGlvbiBsb3JzIGRlIGxhIGTpY29tcHJlc3Npb24gZGUgbCcnYXJjaGl2ZSB7MH0gZGUgbCcnYXBwbGljYXRpb24gd2ViCitob3N0Q29uZmlnLmV4cGFuZGluZz1E6WNvbXByZXNzaW9uIGRlcyBhcmNoaXZlcyBkZXMgYXBwbGljYXRpb25zIHdlYiBk6WNvdXZlcnRlcyAoZGlzY292ZXJlZCkKK2hvc3RDb25maWcuc3RhcnQ9Ikhvc3RDb25maWciOiBUcmFpdGVtZW50IGR1ICJTVEFSVCIKK2hvc3RDb25maWcuc3RvcD0iSG9zdENvbmZpZyI6IFRyYWl0ZW1lbnQgZHUgIlNUT1AiCitob3N0Q29uZmlnLnVuZGVwbG95PVJlcGxpICh1bmRlcGxveSkgZGUgbCcnYXBwbGljYXRpb24gd2ViIGF5YW50IHBvdXIgY2hlbWluIGRlIGNvbnRleHRlIHswfQoraG9zdENvbmZpZy51bmRlcGxveS5lcnJvcj1FcnJldXIgbG9ycyBkdSByZXBsaSAodW5kZXBsb3kpIGRlIGwnJ2FwcGxpY2F0aW9uIHdlYiBheWFudCBwb3VyIGNoZW1pbiBkZSBjb250ZXh0ZSB7MH0KK2hvc3RDb25maWcudW5kZXBsb3lpbmc9UmVwbGkgZGVzIGFwcGxpY2F0aW9ucyB3ZWIgZOlwbG956WVzCit1c2VyQ29uZmlnLmRhdGFiYXNlPUV4Y2VwdGlvbiBsb3JzIGR1IGNoYXJnZW1lbnQgZGUgbGEgYmFzZSBkZSBkb25u6WVzIHV0aWxpc2F0ZXVyCit1c2VyQ29uZmlnLmRlcGxveT1E6XBsb2llbWVudCBkZSBsJydhcHBsaWNhdGlvbiB3ZWIgcG91ciBsJyd1dGlsaXNhdGV1ciB7MH0KK3VzZXJDb25maWcuZGVwbG95aW5nPUTpcGxvaWVtZW50IGRlcyBhcHBsaWNhdGlvbnMgd2ViIHV0aWxpc2F0ZXVyCit1c2VyQ29uZmlnLmVycm9yPUVycmV1ciBsb3JzIGR1IGTpcGxvaWVtZW50IGRlIGwnJ2FwcGxpY2F0aW9uIHdlYiBwb3VyIGwnJ3V0aWxpc2F0ZXVyIHswfQordXNlckNvbmZpZy5zdGFydD0iVXNlckNvbmZpZyI6IFRyYWl0ZW1lbnQgZHUgIlNUQVJUIgordXNlckNvbmZpZy5zdG9wPSJVc2VyQ29uZmlnIjogVHJhaXRlbWVudCBkdSAiU1RPUCIKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdGFydHVwL0xvY2FsU3RyaW5nc19qYS5wcm9wZXJ0aWVzIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvTG9jYWxTdHJpbmdzX2phLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ5NTE1NwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdGFydHVwL0xvY2FsU3RyaW5nc19qYS5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNjQgQEAKK2NvbnRleHRDb25maWcuYXBwbGljYXRpb25DbG9zZT1cdTMwYTJcdTMwZDdcdTMwZWFcdTMwYjFcdTMwZmNcdTMwYjdcdTMwZTdcdTMwZjNcdTMwNmV3ZWIueG1sXHUzMDkyXHUzMGFmXHUzMGVkXHUzMGZjXHUzMGJhXHU0ZTJkXHUzMDZlXHUzMGE4XHUzMGU5XHUzMGZjXHUzMDY3XHUzMDU5Citjb250ZXh0Q29uZmlnLmFwcGxpY2F0aW9uQ29uZmlnPVx1MzBhMlx1MzBkN1x1MzBlYVx1MzBiMVx1MzBmY1x1MzBiN1x1MzBlN1x1MzBmM1x1MzA2ZXdlYi54bWxcdTMwNmVcdThhMmRcdTViOWFcdTMwYThcdTMwZTlcdTMwZmNcdTMwNjdcdTMwNTkKK2NvbnRleHRDb25maWcuYXBwbGljYXRpb25MaXN0ZW5lcj1cdTMwYWZcdTMwZTlcdTMwYjkgezB9IFx1MzA2ZVx1MzBlYVx1MzBiOVx1MzBjYVx1MzA5Mlx1NGY1Y1x1NjIxMFx1NGUyZFx1MzA2ZVx1NGY4Ylx1NTkxNlx1MzA2N1x1MzA1OQorY29udGV4dENvbmZpZy5hcHBsaWNhdGlvbk1pc3Npbmc9XHUzMGEyXHUzMGQ3XHUzMGVhXHUzMGIxXHUzMGZjXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDZld2ViLnhtbFx1MzA0Y1x1ODk4Ylx1MzA2NFx1MzA0Ylx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMVx1MzBjN1x1MzBkNVx1MzBhOVx1MzBlYlx1MzBjOFx1MzA2MFx1MzA1MVx1MzA5Mlx1NGY3Zlx1NzUyOFx1MzA1N1x1MzA3ZVx1MzA1OQorY29udGV4dENvbmZpZy5hcHBsaWNhdGlvblBhcnNlPVx1MzBhMlx1MzBkN1x1MzBlYVx1MzBiMVx1MzBmY1x1MzBiN1x1MzBlN1x1MzBmM1x1MzA2ZXdlYi54bWxcdTRlMmRcdTMwNmVcdTg5ZTNcdTY3OTBcdTMwYThcdTMwZTlcdTMwZmNcdTMwNjdcdTMwNTkKK2NvbnRleHRDb25maWcuYXBwbGljYXRpb25Qb3NpdGlvbj17MH1cdTg4NGNcdTMwNmV7MX1cdTUyMTdcdTc2ZWVcdTMwNjdcdTc2N2FcdTc1MWZcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWYKK2NvbnRleHRDb25maWcuYXV0aGVudGljYXRvckNvbmZpZ3VyZWQ9XHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5IHswfSBcdTMwNmVcdTMwYWFcdTMwZmNcdTMwYmJcdTMwZjNcdTMwYzZcdTMwYTNcdTMwYjFcdTMwZmNcdTMwYmZcdTMwOTJcdThhMmRcdTViOWFcdTMwNTdcdTMwN2VcdTMwNTkKK2NvbnRleHRDb25maWcuYXV0aGVudGljYXRvckluc3RhbnRpYXRlPVx1MzBhZlx1MzBlOVx1MzBiOSB7MH0gXHUzMDZlXHUzMGFhXHUzMGZjXHUzMGJiXHUzMGYzXHUzMGM2XHUzMGEzXHUzMGIxXHUzMGZjXHUzMGJmXHUzMDkyXHUzMGE0XHUzMGYzXHUzMGI5XHUzMGJmXHUzMGYzXHUzMGI5XHU1MzE2XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzCitjb250ZXh0Q29uZmlnLmF1dGhlbnRpY2F0b3JNaXNzaW5nPVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOSB7MH0gXHUzMDZlXHUzMGFhXHUzMGZjXHUzMGJiXHUzMGYzXHUzMGM2XHUzMGEzXHUzMGIxXHUzMGZjXHUzMGJmXHUzMDkyXHU4YTJkXHU1YjlhXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzCitjb250ZXh0Q29uZmlnLmF1dGhlbnRpY2F0b3JSZXNvdXJjZXM9XHUzMGFhXHUzMGZjXHUzMGJiXHUzMGYzXHUzMGM2XHUzMGEzXHUzMGIxXHUzMGZjXHUzMGJmXHUzMDZlXHUzMGRlXHUzMGMzXHUzMGQ3XHUzMGVhXHUzMGI5XHUzMGM4XHUzMDkyXHUzMGVkXHUzMGZjXHUzMGM5XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzCitjb250ZXh0Q29uZmlnLmNjZT1cdTMwZTlcdTMwYTRcdTMwZDVcdTMwYjVcdTMwYTRcdTMwYWZcdTMwZWJcdTMwYTRcdTMwZDlcdTMwZjNcdTMwYzhcdTMwYzdcdTMwZmNcdTMwYmZcdTMwYWFcdTMwZDZcdTMwYjhcdTMwYTdcdTMwYWZcdTMwYzggezB9IFx1MzA2Zlx1MzBiM1x1MzBmM1x1MzBjNlx1MzBhZFx1MzBiOVx1MzBjOFx1MzA2N1x1MzA2Zlx1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5MworY29udGV4dENvbmZpZy5jZXJ0aWZpY2F0ZXNDb25maWcuYWRkZWQ9XHU4YTNjXHU2NjBlXHU2NmY4XHUzMDkyXHUzMGVhXHUzMGFmXHUzMGE4XHUzMGI5XHUzMGM4XHUzMDZlXHU1YzVlXHU2MDI3XHU1MDI0XHUzMDZiXHU4ZmZkXHU1MmEwXHUzMDU3XHUzMDdlXHUzMDU5Citjb250ZXh0Q29uZmlnLmNlcnRpZmljYXRlc0NvbmZpZy5lcnJvcj1DZXJ0aWZpY2F0ZXNWYWx2ZVx1MzA5Mlx1OGZmZFx1NTJhMFx1NGUyZFx1MzA2Ylx1NGY4Ylx1NTkxNlx1MzA0Y1x1NzY3YVx1NzUxZlx1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1ZjoKK2NvbnRleHRDb25maWcuZGVmYXVsdENsb3NlPVx1MzBjN1x1MzBkNVx1MzBhOVx1MzBlYlx1MzBjOFx1MzA2ZXdlYi54bWxcdTMwNmVcdTMwYWZcdTMwZWRcdTMwZmNcdTMwYmFcdTRlMmRcdTMwNmJcdTMwYThcdTMwZTlcdTMwZmNcdTMwNGNcdTc2N2FcdTc1MWZcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWYKK2NvbnRleHRDb25maWcuZGVmYXVsdENvbmZpZz1cdTMwYzdcdTMwZDVcdTMwYTlcdTMwZWJcdTMwYzhcdTMwNmV3ZWIueG1sXHUzMDZlXHU0ZTJkXHUzMDZlXHU4YTJkXHU1YjlhXHUzMGE4XHUzMGU5XHUzMGZjXHUzMDY3XHUzMDU5Citjb250ZXh0Q29uZmlnLmRlZmF1bHRNaXNzaW5nPVx1MzBjN1x1MzBkNVx1MzBhOVx1MzBlYlx1MzBjOFx1MzA2ZXdlYi54bWxcdTMwNGNcdTg5OGJcdTMwNjRcdTMwNGJcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDFcdTMwYTJcdTMwZDdcdTMwZWFcdTMwYjFcdTMwZmNcdTMwYjdcdTMwZTdcdTMwZjNcdTMwNmV3ZWIueG1sXHUzMDYwXHUzMDUxXHUzMDkyXHU0ZjdmXHU3NTI4XHUzMDU3XHUzMDdlXHUzMDU5Citjb250ZXh0Q29uZmlnLmRlZmF1bHRQYXJzZT1cdTMwYzdcdTMwZDVcdTMwYTlcdTMwZWJcdTMwYzhcdTMwNmV3ZWIueG1sXHU0ZTJkXHUzMDZlXHU4OWUzXHU2NzkwXHUzMGE4XHUzMGU5XHUzMGZjXHUzMDY3XHUzMDU5Citjb250ZXh0Q29uZmlnLmRlZmF1bHRQb3NpdGlvbj17MH1cdTg4NGNcdTMwNmV7MX1cdTUyMTdcdTc2ZWVcdTMwNjdcdTc2N2FcdTc1MWZcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWYKK2NvbnRleHRDb25maWcubWlzc2luZ1JlYWxtPVx1OGE4ZFx1OGEzY1x1MzA1OVx1MzA4Ylx1MzA1Zlx1MzA4MVx1MzA2Ylx1MzBlY1x1MzBlYlx1MzBlMFx1MzA0Y1x1OGEyZFx1NWI5YVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5MworY29udGV4dENvbmZpZy5yb2xlLmF1dGg9XHU4YjY2XHU1NDRhOiA8c2VjdXJpdHktcm9sZT5cdTMwNmJcdTViOWFcdTdmYTlcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwNmFcdTMwNDRcdTMwYmJcdTMwYWRcdTMwZTVcdTMwZWFcdTMwYzZcdTMwYTNcdTMwZWRcdTMwZmNcdTMwZWJcdTU0MGQgezB9IFx1MzA0YzxhdXRoLWNvbnN0cmFpbnQ+XHUzMDZlXHU0ZTJkXHUzMDY3XHU0ZjdmXHU3NTI4XHUzMDU1XHUzMDhjXHUzMDdlXHUzMDU3XHUzMDVmCitjb250ZXh0Q29uZmlnLnJvbGUubGluaz1cdThiNjZcdTU0NGE6IDxzZWN1cml0eS1yb2xlPlx1MzA2Ylx1NWI5YVx1N2ZhOVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA2YVx1MzA0NFx1MzBiYlx1MzBhZFx1MzBlNVx1MzBlYVx1MzBjNlx1MzBhM1x1MzBlZFx1MzBmY1x1MzBlYlx1NTQwZCB7MH0gXHUzMDRjPHJvbGUtbGluaz5cdTMwNmVcdTRlMmRcdTMwNjdcdTRmN2ZcdTc1MjhcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNTdcdTMwNWYKK2NvbnRleHRDb25maWcucm9sZS5ydW5hcz1cdThiNjZcdTU0NGE6IDxzZWN1cml0eS1yb2xlPlx1MzA2Ylx1NWI5YVx1N2ZhOVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA2YVx1MzA0NFx1MzBiYlx1MzBhZFx1MzBlNVx1MzBlYVx1MzBjNlx1MzBhM1x1MzBlZFx1MzBmY1x1MzBlYlx1NTQwZCB7MH0gXHUzMDRjPHJ1bi1hcz5cdTMwNmVcdTRlMmRcdTMwNjdcdTRmN2ZcdTc1MjhcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNTdcdTMwNWYKK2NvbnRleHRDb25maWcuc3RhcnQ9Q29udGV4dENvbmZpZzogXHU1MWU2XHU3NDA2XHUzMDkyXHU5NThiXHU1OWNiXHUzMDU3XHUzMDdlXHUzMDU5Citjb250ZXh0Q29uZmlnLnN0b3A9Q29udGV4dENvbmZpZzogXHU1MWU2XHU3NDA2XHUzMDkyXHU1MDVjXHU2YjYyXHUzMDU3XHUzMDdlXHUzMDU5Citjb250ZXh0Q29uZmlnLnRsZEVudHJ5RXhjZXB0aW9uPVx1MzBlYVx1MzBiZFx1MzBmY1x1MzBiOVx1MzBkMVx1MzBiOSB7MX0gXHUzMDZlSkFSXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMDZlVExEIHswfSBcdTMwOTJcdTUxZTZcdTc0MDZcdTRlMmRcdTMwNmVcdTRmOGJcdTU5MTZcdTMwNjdcdTMwNTkKK2NvbnRleHRDb25maWcudGxkRmlsZUV4Y2VwdGlvbj1cdTMwZWFcdTMwYmRcdTMwZmNcdTMwYjlcdTMwZDFcdTMwYjkgezB9IFx1MzA2ZVRMRFx1MzA5Mlx1NTFlNlx1NzQwNlx1NGUyZFx1MzA2ZVx1NGY4Ylx1NTkxNlx1MzA2N1x1MzA1OQorY29udGV4dENvbmZpZy50bGRKYXJFeGNlcHRpb249XHUzMGVhXHUzMGJkXHUzMGZjXHUzMGI5XHUzMGQxXHUzMGI5IHswfSBcdTMwNmVKQVJcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTMwOTJcdTUxZTZcdTc0MDZcdTRlMmRcdTMwNmVcdTRmOGJcdTU5MTZcdTMwNjdcdTMwNTkKK2NvbnRleHRDb25maWcudGxkUmVzb3VyY2VQYXRoPVx1NzEyMVx1NTJiOVx1MzA2YVRMRFx1MzA2ZVx1MzBlYVx1MzBiZFx1MzBmY1x1MzBiOVx1MzBkMVx1MzBiOSB7MH0KK2NvbnRleHRDb25maWcudW5hdmFpbGFibGU9XHU1MjRkXHUzMDZlXHUzMGE4XHUzMGU5XHUzMGZjXHUzMDZlXHUzMDVmXHUzMDgxXHUzMDZiXHUzMDUzXHUzMDZlXHUzMGEyXHUzMGQ3XHUzMGVhXHUzMGIxXHUzMGZjXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDZmXHU1MjI5XHU3NTI4XHUzMDY3XHUzMDRkXHUzMDZhXHUzMDQ0XHUzMDg4XHUzMDQ2XHUzMDZiXHUzMGRlXHUzMGZjXHUzMGFmXHUzMDU3XHUzMDdlXHUzMDU5CitlbWJlZGRlZC5hbHJlYWR5U3RhcnRlZD1cdTdkNDRcdTMwN2ZcdThmYmNcdTMwN2ZcdTMwYjVcdTMwZmNcdTMwZDNcdTMwYjlcdTMwNmZcdTY1ZTJcdTMwNmJcdThkNzdcdTUyZDVcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkKK2VtYmVkZGVkLm5vRW5naW5lcz1cdTMwN2VcdTMwNjBcdTMwYThcdTMwZjNcdTMwYjhcdTMwZjNcdTMwNGNcdTViOWFcdTdmYTlcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNWJcdTMwOTMKK2VtYmVkZGVkLm5vdFN0YXJ0ZWQ9XHU3ZDQ0XHUzMDdmXHU4ZmJjXHUzMDdmXHUzMGI1XHUzMGZjXHUzMGQzXHUzMGI5XHUzMDZmXHUzMDdlXHUzMDYwXHU4ZDc3XHU1MmQ1XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzCitlbmdpbmVDb25maWcuY2NlPVx1MzBlOVx1MzBhNFx1MzBkNVx1MzBiNVx1MzBhNFx1MzBhZlx1MzBlYlx1MzBhNFx1MzBkOVx1MzBmM1x1MzBjOFx1MzBjN1x1MzBmY1x1MzBiZlx1MzBhYVx1MzBkNlx1MzBiOFx1MzBhN1x1MzBhZlx1MzBjOCB7MH0gXHUzMDZmXHUzMGE4XHUzMGYzXHUzMGI4XHUzMGYzXHUzMDY3XHUzMDZmXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDViXHUzMDkzCitlbmdpbmVDb25maWcuc3RhcnQ9RW5naW5lQ29uZmlnOiBcdTUxZTZcdTc0MDZcdTMwOTJcdTk1OGJcdTU5Y2JcdTMwNTdcdTMwN2VcdTMwNTkKK2VuZ2luZUNvbmZpZy5zdG9wPUVuZ2luZUNvbmZpZzogXHU1MWU2XHU3NDA2XHUzMDkyXHU1MDVjXHU2YjYyXHUzMDU3XHUzMDdlXHUzMDU5Citob3N0Q29uZmlnLmFwcEJhc2U9XHUzMGEyXHUzMGQ3XHUzMGVhXHUzMGIxXHUzMGZjXHUzMGI3XHUzMGU3XHUzMGYzXHUzMGQ5XHUzMGZjXHUzMGI5XHUzMGM3XHUzMGEzXHUzMGVjXHUzMGFmXHUzMGM4XHUzMGVhIHswfSBcdTMwNmZcdTViNThcdTU3MjhcdTMwNTdcdTMwN2VcdTMwNWJcdTMwOTMKK2hvc3RDb25maWcuY2NlPVx1MzBlOVx1MzBhNFx1MzBkNVx1MzBiNVx1MzBhNFx1MzBhZlx1MzBlYlx1MzBhNFx1MzBkOVx1MzBmM1x1MzBjOFx1MzBjN1x1MzBmY1x1MzBiZlx1MzBhYVx1MzBkNlx1MzBiOFx1MzBhN1x1MzBhZlx1MzBjOCB7MH0gXHUzMDZmXHUzMGRiXHUzMGI5XHUzMGM4XHUzMDY3XHUzMDZmXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDViXHUzMDkzCitob3N0Q29uZmlnLmRlcGxveT1XZWJcdTMwYTJcdTMwZDdcdTMwZWFcdTMwYjFcdTMwZmNcdTMwYjdcdTMwZTdcdTMwZjNcdTMwYzdcdTMwYTNcdTMwZWNcdTMwYWZcdTMwYzhcdTMwZWEgezB9IFx1MzA5Mlx1OTE0ZFx1NTA5OVx1MzA1N1x1MzA3ZVx1MzA1OQoraG9zdENvbmZpZy5kZXBsb3lEZXNjcmlwdG9yPVx1OGEyZFx1NWI5YVx1OGExOFx1OGZmMFx1NWI1MCB7MH0gXHUzMDkyXHU5MTRkXHU1MDk5XHUzMDU3XHUzMDdlXHUzMDU5Citob3N0Q29uZmlnLmRlcGxveURlc2NyaXB0b3IuZXJyb3I9XHU4YTJkXHU1YjlhXHU4YTE4XHU4ZmYwXHU1YjUwIHswfSBcdTMwOTJcdTkxNGRcdTUwOTlcdTRlMmRcdTMwNmVcdTMwYThcdTMwZTlcdTMwZmNcdTMwNjdcdTMwNTkKK2hvc3RDb25maWcuZGVwbG95RGlyPVdlYlx1MzBhMlx1MzBkN1x1MzBlYVx1MzBiMVx1MzBmY1x1MzBiN1x1MzBlN1x1MzBmM1x1MzBjN1x1MzBhM1x1MzBlY1x1MzBhZlx1MzBjOFx1MzBlYSB7MH0gXHUzMDkyXHU5MTRkXHU1MDk5XHUzMDU3XHUzMDdlXHUzMDU5Citob3N0Q29uZmlnLmRlcGxveURpci5lcnJvcj1XZWJcdTMwYTJcdTMwZDdcdTMwZWFcdTMwYjFcdTMwZmNcdTMwYjdcdTMwZTdcdTMwZjNcdTMwYzdcdTMwYTNcdTMwZWNcdTMwYWZcdTMwYzhcdTMwZWEgezB9IFx1MzA5Mlx1OTE0ZFx1NTA5OVx1NGUyZFx1MzA2ZVx1MzBhOFx1MzBlOVx1MzBmY1x1MzA2N1x1MzA1OQoraG9zdENvbmZpZy5kZXBsb3lKYXI9V2ViXHUzMGEyXHUzMGQ3XHUzMGVhXHUzMGIxXHUzMGZjXHUzMGI3XHUzMGU3XHUzMGYzXHUzMGEyXHUzMGZjXHUzMGFiXHUzMGE0XHUzMGQ2IHswfSBcdTMwOTJcdTkxNGRcdTUwOTlcdTMwNTdcdTMwN2VcdTMwNTkKK2hvc3RDb25maWcuZGVwbG95SmFyLmVycm9yPVdlYlx1MzBhMlx1MzBkN1x1MzBlYVx1MzBiMVx1MzBmY1x1MzBiN1x1MzBlN1x1MzBmM1x1MzBhMlx1MzBmY1x1MzBhYlx1MzBhNFx1MzBkNiB7MH0gXHUzMDkyXHU5MTRkXHU1MDk5XHU0ZTJkXHUzMDZlXHUzMGE4XHUzMGU5XHUzMGZjXHUzMDY3XHUzMDU5Citob3N0Q29uZmlnLmRlcGxveS5lcnJvcj1XZWJcdTMwYTJcdTMwZDdcdTMwZWFcdTMwYjFcdTMwZmNcdTMwYjdcdTMwZTdcdTMwZjNcdTMwYzdcdTMwYTNcdTMwZWNcdTMwYWZcdTMwYzhcdTMwZWEgezB9IFx1MzA5Mlx1OTE0ZFx1NTA5OVx1NGUyZFx1MzA2ZVx1NGY4Ylx1NTkxNlx1MzA2N1x1MzA1OQoraG9zdENvbmZpZy5kZXBsb3lpbmc9XHU4OThiXHUzMDY0XHUzMDRiXHUzMDYzXHUzMDVmV2ViXHUzMGEyXHUzMGQ3XHUzMGVhXHUzMGIxXHUzMGZjXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDkyXHU5MTRkXHU1MDk5XHUzMDU3XHUzMDdlXHUzMDU5Citob3N0Q29uZmlnLmV4cGFuZD1XZWJcdTMwYTJcdTMwZDdcdTMwZWFcdTMwYjFcdTMwZmNcdTMwYjdcdTMwZTdcdTMwZjNcdTMwYTJcdTMwZmNcdTMwYWJcdTMwYTRcdTMwZDYgezB9IFx1MzA5Mlx1NWM1NVx1OTU4Ylx1MzA1N1x1MzA3ZVx1MzA1OQoraG9zdENvbmZpZy5leHBhbmQuZXJyb3I9V2ViXHUzMGEyXHUzMGQ3XHUzMGVhXHUzMGIxXHUzMGZjXHUzMGI3XHUzMGU3XHUzMGYzXHUzMGEyXHUzMGZjXHUzMGFiXHUzMGE0XHUzMGQ2IHswfSBcdTMwOTJcdTVjNTVcdTk1OGJcdTRlMmRcdTMwNmVcdTRmOGJcdTU5MTZcdTMwNjdcdTMwNTkKK2hvc3RDb25maWcuZXhwYW5kaW5nPVx1ODk4Ylx1MzA2NFx1MzA0Ylx1MzA2M1x1MzA1ZldlYlx1MzBhMlx1MzBkN1x1MzBlYVx1MzBiMVx1MzBmY1x1MzBiN1x1MzBlN1x1MzBmM1x1MzBhMlx1MzBmY1x1MzBhYlx1MzBhNFx1MzBkNlx1MzA5Mlx1NWM1NVx1OTU4Ylx1MzA1N1x1MzA3ZVx1MzA1OQoraG9zdENvbmZpZy5jb250ZXh0LnJlc3RhcnQ9XHUzMGIzXHUzMGYzXHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4IHswfSBcdTMwOTJcdTUxOGRcdThkNzdcdTUyZDVcdTRlMmRcdTMwNmVcdTMwYThcdTMwZTlcdTMwZmNcdTMwNjdcdTMwNTkKK2hvc3RDb25maWcucmVtb3ZlWE1MPVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBhZFx1MzBiOVx1MzBjOCB7MH0gXHUzMDZlXHU5MTRkXHU1MDk5XHUzMDkyXHU4OWUzXHU5NjY0XHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmCitob3N0Q29uZmlnLnJlbW92ZURJUj1cdTMwYzdcdTMwYTNcdTMwZWNcdTMwYWZcdTMwYzhcdTMwZWEgezB9IFx1MzA2ZVx1OTE0ZFx1NTA5OVx1MzA5Mlx1ODllM1x1OTY2NFx1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1ZgoraG9zdENvbmZpZy5yZW1vdmVXQVI9V0FSXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViIHswfSBcdTMwNmVcdTkxNGRcdTUwOTlcdTMwOTJcdTg5ZTNcdTk2NjRcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWYKK2hvc3RDb25maWcuc3RhcnQ9SG9zdENvbmZpZzogXHU1MWU2XHU3NDA2XHUzMDkyXHU1MDVjXHU2YjYyXHUzMDU3XHUzMDdlXHUzMDU5Citob3N0Q29uZmlnLnN0b3A9SG9zdENvbmZpZzogXHU1MWU2XHU3NDA2XHUzMDkyXHU1MDVjXHU2YjYyXHUzMDU3XHUzMDdlXHUzMDU5Citob3N0Q29uZmlnLnVuZGVwbG95PVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBhZFx1MzBiOVx1MzBjOFx1MzBkMVx1MzBiOSB7MH0gXHUzMDZlV2ViXHUzMGEyXHUzMGQ3XHUzMGVhXHUzMGIxXHUzMGZjXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDZlXHU5MTRkXHU1MDk5XHUzMDkyXHU4OWUzXHU5NjY0XHUzMDU3XHUzMDdlXHUzMDU5Citob3N0Q29uZmlnLnVuZGVwbG95LmVycm9yPVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBhZFx1MzBiOVx1MzBjOFx1MzBkMVx1MzBiOSB7MH0gXHUzMDZlV2ViXHUzMGEyXHUzMGQ3XHUzMGVhXHUzMGIxXHUzMGZjXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDZlXHU5MTRkXHU1MDk5XHUzMDkyXHU4OWUzXHU5NjY0XHU0ZTJkXHUzMDZlXHUzMGE4XHUzMGU5XHUzMGZjXHUzMDY3XHUzMDU5Citob3N0Q29uZmlnLnVuZGVwbG95aW5nPVx1OTE0ZFx1NTA5OVx1MzA1NVx1MzA4Y1x1MzA1ZldlYlx1MzBhMlx1MzBkN1x1MzBlYVx1MzBiMVx1MzBmY1x1MzBiN1x1MzBlN1x1MzBmM1x1MzA2ZVx1OTE0ZFx1NTA5OVx1MzA5Mlx1ODllM1x1OTY2NFx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OQordXNlckNvbmZpZy5kYXRhYmFzZT1cdTMwZTZcdTMwZmNcdTMwYjZcdTMwYzdcdTMwZmNcdTMwYmZcdTMwZDlcdTMwZmNcdTMwYjlcdTMwNmVcdTMwZWRcdTMwZmNcdTMwYzlcdTRlMmRcdTMwNmVcdTRmOGJcdTU5MTZcdTMwNjdcdTMwNTkKK3VzZXJDb25maWcuZGVwbG95PVx1MzBlNlx1MzBmY1x1MzBiNiB7MH0gXHUzMDZlV2ViXHUzMGEyXHUzMGQ3XHUzMGVhXHUzMGIxXHUzMGZjXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDkyXHU5MTRkXHU1MDk5XHUzMDU3XHUzMDdlXHUzMDU5Cit1c2VyQ29uZmlnLmRlcGxveWluZz1cdTMwZTZcdTMwZmNcdTMwYjZcdTMwNmVXZWJcdTMwYTJcdTMwZDdcdTMwZWFcdTMwYjFcdTMwZmNcdTMwYjdcdTMwZTdcdTMwZjNcdTMwOTJcdTkxNGRcdTUwOTlcdTMwNTdcdTMwN2VcdTMwNTkKK3VzZXJDb25maWcuZXJyb3I9XHUzMGU2XHUzMGZjXHUzMGI2IHswfSBcdTMwNmVXZWJcdTMwYTJcdTMwZDdcdTMwZWFcdTMwYjFcdTMwZmNcdTMwYjdcdTMwZTdcdTMwZjNcdTMwOTJcdTkxNGRcdTUwOTlcdTRlMmRcdTMwNmVcdTMwYThcdTMwZTlcdTMwZmNcdTMwNjdcdTMwNTkKK3VzZXJDb25maWcuc3RhcnQ9VXNlckNvbmZpZzogXHU1MWU2XHU3NDA2XHUzMDkyXHU5NThiXHU1OWNiXHUzMDU3XHUzMDdlXHUzMDU5Cit1c2VyQ29uZmlnLnN0b3A9VXNlckNvbmZpZzogXHU1MWU2XHU3NDA2XHUzMDkyXHU1MDVjXHU2YjYyXHUzMDU3XHUzMDdlXHUzMDU5CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9OYW1pbmdSdWxlU2V0LmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9OYW1pbmdSdWxlU2V0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmIyNzJlMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdGFydHVwL05hbWluZ1J1bGVTZXQuamF2YQpAQCAtMCwwICsxLDEzNSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LTIwMDEsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0YXJ0dXA7CisKKworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuZGlnZXN0ZXIuRGlnZXN0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5kaWdlc3Rlci5SdWxlU2V0QmFzZTsKKworCisvKioKKyAqIDxwPjxzdHJvbmc+UnVsZVNldDwvc3Ryb25nPiBmb3IgcHJvY2Vzc2luZyB0aGUgSk5ESSBFbnRlcnByaXNlIE5hbWluZworICogQ29udGV4dCByZXNvdXJjZSBkZWNsYXJhdGlvbiBlbGVtZW50cy48L3A+CisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAYXV0aG9yIFJlbXkgTWF1Y2hlcmF0CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBOYW1pbmdSdWxlU2V0IGV4dGVuZHMgUnVsZVNldEJhc2UgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIG1hdGNoaW5nIHBhdHRlcm4gcHJlZml4IHRvIHVzZSBmb3IgcmVjb2duaXppbmcgb3VyIGVsZW1lbnRzLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgcHJlZml4ID0gbnVsbDsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9yCisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhbiBpbnN0YW5jZSBvZiB0aGlzIDxjb2RlPlJ1bGVTZXQ8L2NvZGU+IHdpdGggdGhlIGRlZmF1bHQKKyAgICAgKiBtYXRjaGluZyBwYXR0ZXJuIHByZWZpeC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTmFtaW5nUnVsZVNldCgpIHsKKworICAgICAgICB0aGlzKCIiKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGFuIGluc3RhbmNlIG9mIHRoaXMgPGNvZGU+UnVsZVNldDwvY29kZT4gd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgICogbWF0Y2hpbmcgcGF0dGVybiBwcmVmaXguCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJlZml4IFByZWZpeCBmb3IgbWF0Y2hpbmcgcGF0dGVybiBydWxlcyAoaW5jbHVkaW5nIHRoZQorICAgICAqICB0cmFpbGluZyBzbGFzaCBjaGFyYWN0ZXIpCisgICAgICovCisgICAgcHVibGljIE5hbWluZ1J1bGVTZXQoU3RyaW5nIHByZWZpeCkgeworCisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIHRoaXMubmFtZXNwYWNlVVJJID0gbnVsbDsKKyAgICAgICAgdGhpcy5wcmVmaXggPSBwcmVmaXg7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiA8cD5BZGQgdGhlIHNldCBvZiBSdWxlIGluc3RhbmNlcyBkZWZpbmVkIGluIHRoaXMgUnVsZVNldCB0byB0aGUKKyAgICAgKiBzcGVjaWZpZWQgPGNvZGU+RGlnZXN0ZXI8L2NvZGU+IGluc3RhbmNlLCBhc3NvY2lhdGluZyB0aGVtIHdpdGgKKyAgICAgKiBvdXIgbmFtZXNwYWNlIFVSSSAoaWYgYW55KS4gIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGNhbGxlZAorICAgICAqIGJ5IGEgRGlnZXN0ZXIgaW5zdGFuY2UuPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIGRpZ2VzdGVyIERpZ2VzdGVyIGluc3RhbmNlIHRvIHdoaWNoIHRoZSBuZXcgUnVsZSBpbnN0YW5jZXMKKyAgICAgKiAgc2hvdWxkIGJlIGFkZGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFJ1bGVJbnN0YW5jZXMoRGlnZXN0ZXIgZGlnZXN0ZXIpIHsKKworICAgICAgICBkaWdlc3Rlci5hZGRPYmplY3RDcmVhdGUocHJlZml4ICsgIkVqYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuQ29udGV4dEVqYiIpOworICAgICAgICBkaWdlc3Rlci5hZGRSdWxlKHByZWZpeCArICJFamIiLCBuZXcgU2V0QWxsUHJvcGVydGllc1J1bGUoKSk7CisgICAgICAgIGRpZ2VzdGVyLmFkZFJ1bGUocHJlZml4ICsgIkVqYiIsCisgICAgICAgICAgICAgICAgbmV3IFNldE5leHROYW1pbmdSdWxlKCJhZGRFamIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5Db250ZXh0RWpiIikpOworCisgICAgICAgIGRpZ2VzdGVyLmFkZE9iamVjdENyZWF0ZShwcmVmaXggKyAiRW52aXJvbm1lbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkNvbnRleHRFbnZpcm9ubWVudCIpOworICAgICAgICBkaWdlc3Rlci5hZGRTZXRQcm9wZXJ0aWVzKHByZWZpeCArICJFbnZpcm9ubWVudCIpOworICAgICAgICBkaWdlc3Rlci5hZGRSdWxlKHByZWZpeCArICJFbnZpcm9ubWVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNldE5leHROYW1pbmdSdWxlKCJhZGRFbnZpcm9ubWVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkNvbnRleHRFbnZpcm9ubWVudCIpKTsKKworICAgICAgICBkaWdlc3Rlci5hZGRPYmplY3RDcmVhdGUocHJlZml4ICsgIkxvY2FsRWpiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5Db250ZXh0TG9jYWxFamIiKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkUnVsZShwcmVmaXggKyAiTG9jYWxFamIiLCBuZXcgU2V0QWxsUHJvcGVydGllc1J1bGUoKSk7CisgICAgICAgIGRpZ2VzdGVyLmFkZFJ1bGUocHJlZml4ICsgIkxvY2FsRWpiIiwKKyAgICAgICAgICAgICAgICBuZXcgU2V0TmV4dE5hbWluZ1J1bGUoImFkZExvY2FsRWpiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuQ29udGV4dExvY2FsRWpiIikpOworCisgICAgICAgIGRpZ2VzdGVyLmFkZE9iamVjdENyZWF0ZShwcmVmaXggKyAiUmVzb3VyY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkNvbnRleHRSZXNvdXJjZSIpOworICAgICAgICBkaWdlc3Rlci5hZGRSdWxlKHByZWZpeCArICJSZXNvdXJjZSIsIG5ldyBTZXRBbGxQcm9wZXJ0aWVzUnVsZSgpKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkUnVsZShwcmVmaXggKyAiUmVzb3VyY2UiLAorICAgICAgICAgICAgICAgIG5ldyBTZXROZXh0TmFtaW5nUnVsZSgiYWRkUmVzb3VyY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5Db250ZXh0UmVzb3VyY2UiKSk7CisKKyAgICAgICAgZGlnZXN0ZXIuYWRkT2JqZWN0Q3JlYXRlKHByZWZpeCArICJSZXNvdXJjZUVudlJlZiIsCisgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuQ29udGV4dFJlc291cmNlRW52UmVmIik7CisgICAgICAgIGRpZ2VzdGVyLmFkZFJ1bGUocHJlZml4ICsgIlJlc291cmNlRW52UmVmIiwgbmV3IFNldEFsbFByb3BlcnRpZXNSdWxlKCkpOworICAgICAgICBkaWdlc3Rlci5hZGRSdWxlKHByZWZpeCArICJSZXNvdXJjZUVudlJlZiIsCisgICAgICAgICAgICAgICAgbmV3IFNldE5leHROYW1pbmdSdWxlKCJhZGRSZXNvdXJjZUVudlJlZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkNvbnRleHRSZXNvdXJjZUVudlJlZiIpKTsKKworICAgICAgICBkaWdlc3Rlci5hZGRPYmplY3RDcmVhdGUocHJlZml4ICsgIlRyYW5zYWN0aW9uIiwKKyAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5Db250ZXh0VHJhbnNhY3Rpb24iKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkUnVsZShwcmVmaXggKyAiVHJhbnNhY3Rpb24iLCBuZXcgU2V0QWxsUHJvcGVydGllc1J1bGUoKSk7CisgICAgICAgIGRpZ2VzdGVyLmFkZFJ1bGUocHJlZml4ICsgIlRyYW5zYWN0aW9uIiwKKyAgICAgICAgICAgICAgICBuZXcgU2V0TmV4dE5hbWluZ1J1bGUoInNldFRyYW5zYWN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuQ29udGV4dFRyYW5zYWN0aW9uIikpOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdGFydHVwL1Bhc3N3ZFVzZXJEYXRhYmFzZS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvUGFzc3dkVXNlckRhdGFiYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDczOTViNgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdGFydHVwL1Bhc3N3ZFVzZXJEYXRhYmFzZS5qYXZhCkBAIC0wLDAgKzEsMTkzIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0YXJ0dXA7CisKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CisKKworLyoqCisgKiBDb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgPHN0cm9uZz5Vc2VyRGF0YWJhc2U8L2NvZGU+IGludGVyZmFjZQorICogdGhhdCBwcm9jZXNzZXMgdGhlIDxjb2RlPi9ldGMvcGFzc3dkPC9jb2RlPiBmaWxlIG9uIGEgVW5peCBzeXN0ZW0uCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBQYXNzd2RVc2VyRGF0YWJhc2UKKyAgICBpbXBsZW1lbnRzIFVzZXJEYXRhYmFzZSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIHVzZXIgZGF0YWJhc2UgY29tcG9uZW50LgorICAgICAqLworICAgIHB1YmxpYyBQYXNzd2RVc2VyRGF0YWJhc2UoKSB7CisKKyAgICAgICAgc3VwZXIoKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgcGF0aG5hbWUgb2YgdGhlIFVuaXggcGFzc3dvcmQgZmlsZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFTU1dPUkRfRklMRSA9ICIvZXRjL3Bhc3N3ZCI7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzZXQgb2YgaG9tZSBkaXJlY3RvcmllcyBmb3IgYWxsIGRlZmluZWQgdXNlcnMsIGtleWVkIGJ5IHVzZXJuYW1lLgorICAgICAqLworICAgIHByaXZhdGUgSGFzaHRhYmxlIGhvbWVzID0gbmV3IEhhc2h0YWJsZSgpOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgVXNlckNvbmZpZyBsaXN0ZW5lciB3aXRoIHdoaWNoIHdlIGFyZSBhc3NvY2lhdGVkLgorICAgICAqLworICAgIHByaXZhdGUgVXNlckNvbmZpZyB1c2VyQ29uZmlnID0gbnVsbDsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIFVzZXJDb25maWcgbGlzdGVuZXIgd2l0aCB3aGljaCB3ZSBhcmUgYXNzb2NpYXRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgVXNlckNvbmZpZyBnZXRVc2VyQ29uZmlnKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy51c2VyQ29uZmlnKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBVc2VyQ29uZmlnIGxpc3RlbmVyIHdpdGggd2hpY2ggd2UgYXJlIGFzc29jaWF0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXNlckNvbmZpZyBUaGUgbmV3IFVzZXJDb25maWcgbGlzdGVuZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVc2VyQ29uZmlnKFVzZXJDb25maWcgdXNlckNvbmZpZykgeworCisgICAgICAgIHRoaXMudXNlckNvbmZpZyA9IHVzZXJDb25maWc7CisgICAgICAgIGluaXQoKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYW4gYWJzb2x1dGUgcGF0aG5hbWUgdG8gdGhlIGhvbWUgZGlyZWN0b3J5IGZvciB0aGUgc3BlY2lmaWVkIHVzZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXNlciBVc2VyIGZvciB3aGljaCBhIGhvbWUgZGlyZWN0b3J5IHNob3VsZCBiZSByZXRyaWV2ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEhvbWUoU3RyaW5nIHVzZXIpIHsKKworICAgICAgICByZXR1cm4gKChTdHJpbmcpIGhvbWVzLmdldCh1c2VyKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhbiBlbnVtZXJhdGlvbiBvZiB0aGUgdXNlcm5hbWVzIGRlZmluZWQgb24gdGhpcyBzZXJ2ZXIuCisgICAgICovCisgICAgcHVibGljIEVudW1lcmF0aW9uIGdldFVzZXJzKCkgeworCisgICAgICAgIHJldHVybiAoaG9tZXMua2V5cygpKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByaXZhdGUgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIG91ciBzZXQgb2YgdXNlcnMgYW5kIGhvbWUgZGlyZWN0b3JpZXMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGluaXQoKSB7CisKKyAgICAgICAgQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKFBBU1NXT1JEX0ZJTEUpKTsKKworICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKworICAgICAgICAgICAgICAgIC8vIEFjY3VtdWxhdGUgdGhlIG5leHQgbGluZQorICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGNoID0gcmVhZGVyLnJlYWQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChjaCA8IDApIHx8IChjaCA9PSAnXG4nKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKChjaGFyKSBjaCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFN0cmluZyBsaW5lID0gYnVmZmVyLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgaWYgKGxpbmUubGVuZ3RoKCkgPCAxKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIC8vIFBhcnNlIHRoZSBsaW5lIGludG8gY29uc3RpdHVlbnQgZWxlbWVudHMKKyAgICAgICAgICAgICAgICBpbnQgbiA9IDA7CisgICAgICAgICAgICAgICAgU3RyaW5nIHRva2Vuc1tdID0gbmV3IFN0cmluZ1s3XTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgdG9rZW5zW2ldID0gbnVsbDsKKyAgICAgICAgICAgICAgICB3aGlsZSAobiA8IHRva2Vucy5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRva2VuID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgaW50IGNvbG9uID0gbGluZS5pbmRleE9mKCc6Jyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb2xvbiA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IGxpbmUuc3Vic3RyaW5nKDAsIGNvbG9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLnN1YnN0cmluZyhjb2xvbiArIDEpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSBsaW5lOworICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9ICIiOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHRva2Vuc1tuKytdID0gdG9rZW47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gQWRkIHRoaXMgdXNlciBhbmQgY29ycmVzcG9uZGluZyBkaXJlY3RvcnkKKyAgICAgICAgICAgICAgICBpZiAoKHRva2Vuc1swXSAhPSBudWxsKSAmJiAodG9rZW5zWzVdICE9IG51bGwpKQorICAgICAgICAgICAgICAgICAgICBob21lcy5wdXQodG9rZW5zWzBdLCB0b2tlbnNbNV0pOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJlYWRlci5jbG9zZSgpOworICAgICAgICAgICAgcmVhZGVyID0gbnVsbDsKKworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgaWYgKHJlYWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcmVhZGVyLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZikgeworICAgICAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlYWRlciA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9TZXRBbGxQcm9wZXJ0aWVzUnVsZS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvU2V0QWxsUHJvcGVydGllc1J1bGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWE2NDkyCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvU2V0QWxsUHJvcGVydGllc1J1bGUuamF2YQpAQCAtMCwwICsxLDY0IEBACisvKgorICogQ29weXJpZ2h0IDE5OTktMjAwMSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cDsKKworaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvbWNhdC51dGlsLkludHJvc3BlY3Rpb25VdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvbWNhdC51dGlsLmRpZ2VzdGVyLlJ1bGU7CisKKy8qKgorICogUnVsZSB0aGF0IHVzZXMgdGhlIGludHJvc3BlY3Rpb24gdXRpbHMgdG8gc2V0IHByb3BlcnRpZXMuCisgKiAKKyAqIEBhdXRob3IgUmVteSBNYXVjaGVyYXQKKyAqLworcHVibGljIGNsYXNzIFNldEFsbFByb3BlcnRpZXNSdWxlIGV4dGVuZHMgUnVsZSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIEhhbmRsZSB0aGUgYmVnaW5uaW5nIG9mIGFuIFhNTCBlbGVtZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGF0dHJpYnV0ZXMgVGhlIGF0dHJpYnV0ZXMgb2YgdGhpcyBlbGVtZW50CisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhIHByb2Nlc3NpbmcgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgYmVnaW4oU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIG5hbWVYLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGF0dHJpYnV0ZXMuZ2V0TG9jYWxOYW1lKGkpOworICAgICAgICAgICAgaWYgKCIiLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgIG5hbWUgPSBhdHRyaWJ1dGVzLmdldFFOYW1lKGkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gYXR0cmlidXRlcy5nZXRWYWx1ZShpKTsKKyAgICAgICAgICAgIEludHJvc3BlY3Rpb25VdGlscy5zZXRQcm9wZXJ0eShkaWdlc3Rlci5wZWVrKCksIG5hbWUsIHZhbHVlKTsKKyAgICAgICAgfQorCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdGFydHVwL1NldENvbnRleHRQcm9wZXJ0aWVzUnVsZS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvU2V0Q29udGV4dFByb3BlcnRpZXNSdWxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRhYjg4NwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdGFydHVwL1NldENvbnRleHRQcm9wZXJ0aWVzUnVsZS5qYXZhCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OS0yMDAxLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5zdGFydHVwOworCitpbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuSW50cm9zcGVjdGlvblV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuZGlnZXN0ZXIuUnVsZTsKKworLyoqCisgKiBSdWxlIHRoYXQgdXNlcyB0aGUgaW50cm9zcGVjdGlvbiB1dGlscyB0byBzZXQgcHJvcGVydGllcyBvZiBhIGNvbnRleHQgCisgKiAoZXZlcnl0aGluZyBleGNlcHQgInBhdGgiKS4KKyAqIAorICogQGF1dGhvciBSZW15IE1hdWNoZXJhdAorICovCitwdWJsaWMgY2xhc3MgU2V0Q29udGV4dFByb3BlcnRpZXNSdWxlIGV4dGVuZHMgUnVsZSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIEhhbmRsZSB0aGUgYmVnaW5uaW5nIG9mIGFuIFhNTCBlbGVtZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGF0dHJpYnV0ZXMgVGhlIGF0dHJpYnV0ZXMgb2YgdGhpcyBlbGVtZW50CisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhIHByb2Nlc3NpbmcgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgYmVnaW4oU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIG5hbWVYLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGF0dHJpYnV0ZXMuZ2V0TG9jYWxOYW1lKGkpOworICAgICAgICAgICAgaWYgKCIiLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgIG5hbWUgPSBhdHRyaWJ1dGVzLmdldFFOYW1lKGkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCJwYXRoIi5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoaSk7CisgICAgICAgICAgICBJbnRyb3NwZWN0aW9uVXRpbHMuc2V0UHJvcGVydHkoZGlnZXN0ZXIucGVlaygpLCBuYW1lLCB2YWx1ZSk7CisgICAgICAgIH0KKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9TZXROZXh0TmFtaW5nUnVsZS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvU2V0TmV4dE5hbWluZ1J1bGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjk2NjZiCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvU2V0TmV4dE5hbWluZ1J1bGUuamF2YQpAQCAtMCwwICsxLDExOSBAQAorLyogJElkJAorICoKKyAqIENvcHlyaWdodCAyMDAxLTIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLyAKKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5OYW1pbmdSZXNvdXJjZXM7CitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5JbnRyb3NwZWN0aW9uVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5kaWdlc3Rlci5SdWxlOworCisKKy8qKgorICogPHA+UnVsZSBpbXBsZW1lbnRhdGlvbiB0aGF0IGNhbGxzIGEgbWV0aG9kIG9uIHRoZSAodG9wLTEpIChwYXJlbnQpCisgKiBvYmplY3QsIHBhc3NpbmcgdGhlIHRvcCBvYmplY3QgKGNoaWxkKSBhcyBhbiBhcmd1bWVudC4gIEl0IGlzCisgKiBjb21tb25seSB1c2VkIHRvIGVzdGFibGlzaCBwYXJlbnQtY2hpbGQgcmVsYXRpb25zaGlwcy48L3A+CisgKgorICogPHA+VGhpcyBydWxlIG5vdyBzdXBwb3J0cyBtb3JlIGZsZXhpYmxlIG1ldGhvZCBtYXRjaGluZyBieSBkZWZhdWx0LgorICogSXQgaXMgcG9zc2libGUgdGhhdCB0aGlzIG1heSBicmVhayAoc29tZSkgY29kZSAKKyAqIHdyaXR0ZW4gYWdhaW5zdCByZWxlYXNlIDEuMS4xIG9yIGVhcmxpZXIuCisgKiA8L3A+IAorICovCisKK3B1YmxpYyBjbGFzcyBTZXROZXh0TmFtaW5nUnVsZSBleHRlbmRzIFJ1bGUgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworICAgIAorICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhICJzZXQgbmV4dCIgcnVsZSB3aXRoIHRoZSBzcGVjaWZpZWQgbWV0aG9kIG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWV0aG9kTmFtZSBNZXRob2QgbmFtZSBvZiB0aGUgcGFyZW50IG1ldGhvZCB0byBjYWxsCisgICAgICogQHBhcmFtIHBhcmFtVHlwZSBKYXZhIGNsYXNzIG9mIHRoZSBwYXJlbnQgbWV0aG9kJ3MgYXJndW1lbnQKKyAgICAgKiAgKGlmIHlvdSB3aXNoIHRvIHVzZSBhIHByaW1pdGl2ZSB0eXBlLCBzcGVjaWZ5IHRoZSBjb3JyZXNvbmRpbmcKKyAgICAgKiAgSmF2YSB3cmFwcGVyIGNsYXNzIGluc3RlYWQsIHN1Y2ggYXMgPGNvZGU+amF2YS5sYW5nLkJvb2xlYW48L2NvZGU+CisgICAgICogIGZvciBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IHBhcmFtZXRlcikKKyAgICAgKi8KKyAgICBwdWJsaWMgU2V0TmV4dE5hbWluZ1J1bGUoU3RyaW5nIG1ldGhvZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXJhbVR5cGUpIHsKKworICAgICAgICB0aGlzLm1ldGhvZE5hbWUgPSBtZXRob2ROYW1lOworICAgICAgICB0aGlzLnBhcmFtVHlwZSA9IHBhcmFtVHlwZTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBtZXRob2QgbmFtZSB0byBjYWxsIG9uIHRoZSBwYXJlbnQgb2JqZWN0LgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgbWV0aG9kTmFtZSA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBKYXZhIGNsYXNzIG5hbWUgb2YgdGhlIHBhcmFtZXRlciB0eXBlIGV4cGVjdGVkIGJ5IHRoZSBtZXRob2QuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBwYXJhbVR5cGUgPSBudWxsOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUHJvY2VzcyB0aGUgZW5kIG9mIHRoaXMgZWxlbWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBlbmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBJZGVudGlmeSB0aGUgb2JqZWN0cyB0byBiZSB1c2VkCisgICAgICAgIE9iamVjdCBjaGlsZCA9IGRpZ2VzdGVyLnBlZWsoMCk7CisgICAgICAgIE9iamVjdCBwYXJlbnQgPSBkaWdlc3Rlci5wZWVrKDEpOworCisgICAgICAgIE5hbWluZ1Jlc291cmNlcyBuYW1pbmdSZXNvdXJjZXMgPSBudWxsOworICAgICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgQ29udGV4dCkgeworICAgICAgICAgICAgbmFtaW5nUmVzb3VyY2VzID0gKChDb250ZXh0KSBwYXJlbnQpLmdldE5hbWluZ1Jlc291cmNlcygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbmFtaW5nUmVzb3VyY2VzID0gKE5hbWluZ1Jlc291cmNlcykgcGFyZW50OworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBDYWxsIHRoZSBzcGVjaWZpZWQgbWV0aG9kCisgICAgICAgIEludHJvc3BlY3Rpb25VdGlscy5jYWxsTWV0aG9kMShuYW1pbmdSZXNvdXJjZXMsIG1ldGhvZE5hbWUsCisgICAgICAgICAgICAgICAgY2hpbGQsIHBhcmFtVHlwZSwgZGlnZXN0ZXIuZ2V0Q2xhc3NMb2FkZXIoKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbmRlciBhIHByaW50YWJsZSB2ZXJzaW9uIG9mIHRoaXMgUnVsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIlNldE5leHRSdWxlWyIpOworICAgICAgICBzYi5hcHBlbmQoIm1ldGhvZE5hbWU9Iik7CisgICAgICAgIHNiLmFwcGVuZChtZXRob2ROYW1lKTsKKyAgICAgICAgc2IuYXBwZW5kKCIsIHBhcmFtVHlwZT0iKTsKKyAgICAgICAgc2IuYXBwZW5kKHBhcmFtVHlwZSk7CisgICAgICAgIHNiLmFwcGVuZCgiXSIpOworICAgICAgICByZXR1cm4gKHNiLnRvU3RyaW5nKCkpOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdGFydHVwL1RsZENvbmZpZy5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvVGxkQ29uZmlnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQwYWMyOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdGFydHVwL1RsZENvbmZpZy5qYXZhCkBAIC0wLDAgKzEsNzE1IEBACisvKgorICogQ29weXJpZ2h0IDE5OTktMjAwMSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cDsKKworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEubmV0LlVSTENsYXNzTG9hZGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKK2ltcG9ydCBqYXZhLnV0aWwuamFyLkphckVudHJ5OworaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRmlsZTsKKworaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1lQ2xhc3NQYWlyOworaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1pbmdFbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm5hbWluZy5kaXJlY3RvcnkuRGlyQ29udGV4dDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5HbG9iYWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZENvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLlN0cmluZ01hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5kaWdlc3Rlci5EaWdlc3RlcjsKK2ltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKKworLyoqCisgKiBTdGFydHVwIGV2ZW50IGxpc3RlbmVyIGZvciBhIDxiPkNvbnRleHQ8L2I+IHRoYXQgY29uZmlndXJlcyB0aGUgcHJvcGVydGllcworICogb2YgdGhhdCBDb250ZXh0LCBhbmQgdGhlIGFzc29jaWF0ZWQgZGVmaW5lZCBzZXJ2bGV0cy4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEBhdXRob3IgSmVhbi1GcmFuY29pcyBBcmNhbmQKKyAqIEBhdXRob3IgQ29zdGluIE1hbm9sYWNoZQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgVGxkQ29uZmlnICB7CisKKyAgICAvLyBOYW1lcyBvZiBKQVJzIHRoYXQgYXJlIGtub3duIG5vdCB0byBjb250YWluIGFueSBUTERzCisgICAgcHJpdmF0ZSBzdGF0aWMgSGFzaFNldCBub1RsZEphcnM7CisKKyAgICBwcml2YXRlIHN0YXRpYyBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2cgbG9nPQorICAgICAgICBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5LmdldExvZyggVGxkQ29uZmlnLmNsYXNzICk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9VUkxfUFJFRklYID0gImZpbGU6IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRklMRV9VUkxfUFJFRklYX0xFTiA9IEZJTEVfVVJMX1BSRUZJWC5sZW5ndGgoKTsKKworCisgICAgLyoKKyAgICAgKiBJbml0aWFsaXplcyB0aGUgc2V0IG9mIEpBUnMgdGhhdCBhcmUga25vd24gbm90IHRvIGNvbnRhaW4gYW55IFRMRHMKKyAgICAgKi8KKyAgICBzdGF0aWMgeworICAgICAgICBub1RsZEphcnMgPSBuZXcgSGFzaFNldCgpOworICAgICAgICBub1RsZEphcnMuYWRkKCJhbnQuamFyIik7CisgICAgICAgIG5vVGxkSmFycy5hZGQoImNhdGFsaW5hLmphciIpOworICAgICAgICBub1RsZEphcnMuYWRkKCJjYXRhbGluYS1hbnQuamFyIik7CisgICAgICAgIG5vVGxkSmFycy5hZGQoImNhdGFsaW5hLWNsdXN0ZXIuamFyIik7CisgICAgICAgIG5vVGxkSmFycy5hZGQoImNhdGFsaW5hLW9wdGlvbmFsLmphciIpOworICAgICAgICBub1RsZEphcnMuYWRkKCJjYXRhbGluYS1pMThuLWZyLmphciIpOworICAgICAgICBub1RsZEphcnMuYWRkKCJjYXRhbGluYS1pMThuLWphLmphciIpOworICAgICAgICBub1RsZEphcnMuYWRkKCJjYXRhbGluYS1pMThuLWVzLmphciIpOworICAgICAgICBub1RsZEphcnMuYWRkKCJjb21tb25zLWRiY3AuamFyIik7CisgICAgICAgIG5vVGxkSmFycy5hZGQoImNvbW1vbnMtbW9kZWxlci5qYXIiKTsKKyAgICAgICAgbm9UbGRKYXJzLmFkZCgiY29tbW9ucy1sb2dnaW5nLWFwaS5qYXIiKTsKKyAgICAgICAgbm9UbGRKYXJzLmFkZCgiY29tbW9ucy1iZWFudXRpbHMuamFyIik7CisgICAgICAgIG5vVGxkSmFycy5hZGQoImNvbW1vbnMtZmlsZXVwbG9hZC0xLjAuamFyIik7CisgICAgICAgIG5vVGxkSmFycy5hZGQoImNvbW1vbnMtcG9vbC5qYXIiKTsKKyAgICAgICAgbm9UbGRKYXJzLmFkZCgiY29tbW9ucy1kaWdlc3Rlci5qYXIiKTsKKyAgICAgICAgbm9UbGRKYXJzLmFkZCgiY29tbW9ucy1sb2dnaW5nLmphciIpOworICAgICAgICBub1RsZEphcnMuYWRkKCJjb21tb25zLWNvbGxlY3Rpb25zLmphciIpOworICAgICAgICBub1RsZEphcnMuYWRkKCJjb21tb25zLWVsLmphciIpOworICAgICAgICBub1RsZEphcnMuYWRkKCJqYWthcnRhLXJlZ2V4cC0xLjMuamFyIik7CisgICAgICAgIG5vVGxkSmFycy5hZGQoImphc3Blci1jb21waWxlci5qYXIiKTsKKyAgICAgICAgbm9UbGRKYXJzLmFkZCgiamFzcGVyLWNvbXBpbGVyLWpkdC5qYXIiKTsKKyAgICAgICAgbm9UbGRKYXJzLmFkZCgiamFzcGVyLXJ1bnRpbWUuamFyIik7CisgICAgICAgIG5vVGxkSmFycy5hZGQoImpteC5qYXIiKTsKKyAgICAgICAgbm9UbGRKYXJzLmFkZCgiam14LXRvb2xzLmphciIpOworICAgICAgICBub1RsZEphcnMuYWRkKCJqc3AtYXBpLmphciIpOworICAgICAgICBub1RsZEphcnMuYWRkKCJuYW1pbmctY29tbW9uLmphciIpOworICAgICAgICBub1RsZEphcnMuYWRkKCJuYW1pbmctcmVzb3VyY2VzLmphciIpOworICAgICAgICBub1RsZEphcnMuYWRkKCJuYW1pbmctZmFjdG9yeS5qYXIiKTsKKyAgICAgICAgbm9UbGRKYXJzLmFkZCgibmFtaW5nLWZhY3RvcnktZGJjcC5qYXIiKTsKKyAgICAgICAgbm9UbGRKYXJzLmFkZCgibmFtaW5nLWphdmEuamFyIik7CisgICAgICAgIG5vVGxkSmFycy5hZGQoInNlcnZsZXQtYXBpLmphciIpOworICAgICAgICBub1RsZEphcnMuYWRkKCJzZXJ2bGV0cy1kZWZhdWx0LmphciIpOworICAgICAgICBub1RsZEphcnMuYWRkKCJzZXJ2bGV0cy1pbnZva2VyLmphciIpOworICAgICAgICBub1RsZEphcnMuYWRkKCJzZXJ2bGV0cy1jb21tb24uamFyIik7CisgICAgICAgIG5vVGxkSmFycy5hZGQoInNlcnZsZXRzLXdlYmRhdi5qYXIiKTsKKyAgICAgICAgbm9UbGRKYXJzLmFkZCgidG9tY2F0LXV0aWwuamFyIik7CisgICAgICAgIG5vVGxkSmFycy5hZGQoInRvbWNhdC1odHRwMTEuamFyIik7CisgICAgICAgIG5vVGxkSmFycy5hZGQoInRvbWNhdC1hanAuamFyIik7CisgICAgICAgIG5vVGxkSmFycy5hZGQoInRvbWNhdC1jb3lvdGUuamFyIik7CisgICAgICAgIG5vVGxkSmFycy5hZGQoInhlcmNlc0ltcGwuamFyIik7CisgICAgICAgIG5vVGxkSmFycy5hZGQoInhtbFBhcnNlckFQSXMuamFyIik7CisgICAgICAgIG5vVGxkSmFycy5hZGQoInhtbC1hcGlzLmphciIpOworICAgICAgICAvLyBKQVJzIGZyb20gSjJTRSBydW50aW1lCisgICAgICAgIG5vVGxkSmFycy5hZGQoInN1bmpjZV9wcm92aWRlci5qYXIiKTsKKyAgICAgICAgbm9UbGRKYXJzLmFkZCgibGRhcHNlYy5qYXIiKTsKKyAgICAgICAgbm9UbGRKYXJzLmFkZCgibG9jYWxlZGF0YS5qYXIiKTsKKyAgICAgICAgbm9UbGRKYXJzLmFkZCgiZG5zbnMuamFyIik7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworICAgIC8qKgorICAgICAqIFRoZSBDb250ZXh0IHdlIGFyZSBhc3NvY2lhdGVkIHdpdGguCisgICAgICovCisgICAgcHJpdmF0ZSBDb250ZXh0IGNvbnRleHQgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc3RyaW5nIHJlc291cmNlcyBmb3IgdGhpcyBwYWNrYWdlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ01hbmFnZXIgc20gPQorICAgICAgICBTdHJpbmdNYW5hZ2VyLmdldE1hbmFnZXIoQ29uc3RhbnRzLlBhY2thZ2UpOworCisgICAgLyoqCisgICAgICogVGhlIDxjb2RlPkRpZ2VzdGVyPC9jb2RlPiB3ZSB3aWxsIHVzZSB0byBwcm9jZXNzIHRhZyBsaWJyYXJ5CisgICAgICogZGVzY3JpcHRvciBmaWxlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBEaWdlc3RlciB0bGREaWdlc3RlciA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIEF0dHJpYnV0ZSB2YWx1ZSB1c2VkIHRvIHR1cm4gb24vb2ZmIFRMRCB2YWxpZGF0aW9uCisgICAgICovCisgICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gdGxkVmFsaWRhdGlvbiA9IGZhbHNlOworCisKKyAgICAvKioKKyAgICAgKiBBdHRyaWJ1dGUgdmFsdWUgdXNlZCB0byB0dXJuIG9uL29mZiBUTEQgIG5hbWVzcGFjZSBhd2FyZW5lcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHRsZE5hbWVzcGFjZUF3YXJlID0gZmFsc2U7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gcmVzY2FuPXRydWU7CisKKyAgICBwcml2YXRlIEFycmF5TGlzdCBsaXN0ZW5lcnM9bmV3IEFycmF5TGlzdCgpOworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBsaXN0IG9mIEpBUnMgdGhhdCBhcmUga25vd24gbm90IHRvIGNvbnRhaW4gYW55IFRMRHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gamFyTmFtZXMgTGlzdCBvZiBjb21tYS1zZXBhcmF0ZWQgbmFtZXMgb2YgSkFSIGZpbGVzIHRoYXQgYXJlIAorICAgICAqIGtub3duIG5vdCB0byBjb250YWluIGFueSBUTERzIAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXROb1RsZEphcnMoU3RyaW5nIGphck5hbWVzKSB7CisgICAgICAgIGlmIChqYXJOYW1lcyAhPSBudWxsKSB7CisgICAgICAgICAgICBub1RsZEphcnMuY2xlYXIoKTsKKyAgICAgICAgICAgIFN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGphck5hbWVzLCAiLCIpOworICAgICAgICAgICAgd2hpbGUgKHRva2VuaXplci5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgIG5vVGxkSmFycy5hZGQodG9rZW5pemVyLm5leHRUb2tlbigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdmFsaWRhdGlvbiBmZWF0dXJlIG9mIHRoZSBYTUwgcGFyc2VyIHVzZWQgd2hlbgorICAgICAqIHBhcnNpbmcgeG1sIGluc3RhbmNlcy4KKyAgICAgKiBAcGFyYW0gdGxkVmFsaWRhdGlvbiB0cnVlIHRvIGVuYWJsZSB4bWwgaW5zdGFuY2UgdmFsaWRhdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRsZFZhbGlkYXRpb24oYm9vbGVhbiB0bGRWYWxpZGF0aW9uKXsKKyAgICAgICAgVGxkQ29uZmlnLnRsZFZhbGlkYXRpb24gPSB0bGRWYWxpZGF0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgc2VydmVyLnhtbCA8aG9zdD4gYXR0cmlidXRlJ3MgeG1sVmFsaWRhdGlvbi4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdmFsaWRhdGlvbiBpcyBlbmFibGVkLgorICAgICAqCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0VGxkVmFsaWRhdGlvbigpeworICAgICAgICByZXR1cm4gdGxkVmFsaWRhdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHNlcnZlci54bWwgPGhvc3Q+IGF0dHJpYnV0ZSdzIHhtbE5hbWVzcGFjZUF3YXJlLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBuYW1lc3BhY2UgYXdhcmVuZXMgaXMgZW5hYmxlZC4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldFRsZE5hbWVzcGFjZUF3YXJlKCl7CisgICAgICAgIHJldHVybiB0bGROYW1lc3BhY2VBd2FyZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbmFtZXNwYWNlIGF3YXJlIGZlYXR1cmUgb2YgdGhlIFhNTCBwYXJzZXIgdXNlZCB3aGVuCisgICAgICogcGFyc2luZyB4bWwgaW5zdGFuY2VzLgorICAgICAqIEBwYXJhbSB0bGROYW1lc3BhY2VBd2FyZSB0cnVlIHRvIGVuYWJsZSBuYW1lc3BhY2UgYXdhcmVuZXNzCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VGxkTmFtZXNwYWNlQXdhcmUoYm9vbGVhbiB0bGROYW1lc3BhY2VBd2FyZSl7CisgICAgICAgIFRsZENvbmZpZy50bGROYW1lc3BhY2VBd2FyZSA9IHRsZE5hbWVzcGFjZUF3YXJlOworICAgIH0gICAgCisKKworICAgIHB1YmxpYyBib29sZWFuIGlzUmVzY2FuKCkgeworICAgICAgICByZXR1cm4gcmVzY2FuOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFJlc2Nhbihib29sZWFuIHJlc2NhbikgeworICAgICAgICB0aGlzLnJlc2NhbiA9IHJlc2NhbjsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29udGV4dCBnZXRDb250ZXh0KCkgeworICAgICAgICByZXR1cm4gY29udGV4dDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDb250ZXh0KENvbnRleHQgY29udGV4dCkgeworICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZEFwcGxpY2F0aW9uTGlzdGVuZXIoIFN0cmluZyBzICkgeworICAgICAgICAvL2lmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmRlYnVnKCAiQWRkIHRsZCBsaXN0ZW5lciAiICsgcyk7CisgICAgICAgIGxpc3RlbmVycy5hZGQocyk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZ1tdIGdldFRsZExpc3RlbmVycygpIHsKKyAgICAgICAgU3RyaW5nIHJlc3VsdFtdPW5ldyBTdHJpbmdbbGlzdGVuZXJzLnNpemUoKV07CisgICAgICAgIGxpc3RlbmVycy50b0FycmF5KHJlc3VsdCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTY2FuIGZvciBhbmQgY29uZmlndXJlIGFsbCB0YWcgbGlicmFyeSBkZXNjcmlwdG9ycyBmb3VuZCBpbiB0aGlzCisgICAgICogd2ViIGFwcGxpY2F0aW9uLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYSBmYXRhbCBpbnB1dC9vdXRwdXQgb3IgcGFyc2luZyBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGxvbmcgdDE9U3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisKKyAgICAgICAgRmlsZSB0bGRDYWNoZT1udWxsOworCisgICAgICAgIGlmIChjb250ZXh0IGluc3RhbmNlb2YgU3RhbmRhcmRDb250ZXh0KSB7CisgICAgICAgICAgICBGaWxlIHdvcmtEaXI9IChGaWxlKQorICAgICAgICAgICAgICAgICgoU3RhbmRhcmRDb250ZXh0KWNvbnRleHQpLmdldFNlcnZsZXRDb250ZXh0KCkuZ2V0QXR0cmlidXRlKEdsb2JhbHMuV09SS19ESVJfQVRUUik7CisgICAgICAgICAgICB0bGRDYWNoZT1uZXcgRmlsZSggd29ya0RpciwgInRsZENhY2hlLnNlciIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gT3B0aW9uIHRvIG5vdCByZXNjYW4KKyAgICAgICAgaWYoICEgcmVzY2FuICkgeworICAgICAgICAgICAgLy8gZmluZCB0aGUgY2FjaGUKKyAgICAgICAgICAgIGlmKCB0bGRDYWNoZSE9IG51bGwgJiYgdGxkQ2FjaGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBqdXN0IHJlYWQgaXQuLi4KKyAgICAgICAgICAgICAgICBwcm9jZXNzQ2FjaGUodGxkQ2FjaGUpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIEFjcXVpcmUgdGhlIGxpc3Qgb2YgVExEIHJlc291cmNlIHBhdGhzLCBwb3NzaWJseSBlbWJlZGRlZCBpbiBKQVIKKyAgICAgICAgICogZmlsZXMsIHRvIGJlIHByb2Nlc3NlZAorICAgICAgICAgKi8KKyAgICAgICAgU2V0IHJlc291cmNlUGF0aHMgPSB0bGRTY2FuUmVzb3VyY2VQYXRocygpOworICAgICAgICBNYXAgamFyUGF0aHMgPSBnZXRKYXJQYXRocygpOworCisgICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB3ZSBjYW4gdXNlIGNhY2hlZCBsaXN0ZW5lcnMKKyAgICAgICAgaWYgKHRsZENhY2hlICE9IG51bGwgJiYgdGxkQ2FjaGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIGxvbmcgbGFzdE1vZGlmaWVkID0gZ2V0TGFzdE1vZGlmaWVkKHJlc291cmNlUGF0aHMsIGphclBhdGhzKTsKKyAgICAgICAgICAgIGlmIChsYXN0TW9kaWZpZWQgPCB0bGRDYWNoZS5sYXN0TW9kaWZpZWQoKSkgeworICAgICAgICAgICAgICAgIHByb2Nlc3NDYWNoZSh0bGRDYWNoZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gU2NhbiBlYWNoIGFjY3VtdWxhdGVkIHJlc291cmNlIHBhdGggZm9yIFRMRHMgdG8gYmUgcHJvY2Vzc2VkCisgICAgICAgIEl0ZXJhdG9yIHBhdGhzID0gcmVzb3VyY2VQYXRocy5pdGVyYXRvcigpOworICAgICAgICB3aGlsZSAocGF0aHMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IChTdHJpbmcpIHBhdGhzLm5leHQoKTsKKyAgICAgICAgICAgIGlmIChwYXRoLmVuZHNXaXRoKCIuamFyIikpIHsKKyAgICAgICAgICAgICAgICB0bGRTY2FuSmFyKHBhdGgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0bGRTY2FuVGxkKHBhdGgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChqYXJQYXRocyAhPSBudWxsKSB7CisgICAgICAgICAgICBwYXRocyA9IGphclBhdGhzLnZhbHVlcygpLml0ZXJhdG9yKCk7CisgICAgICAgICAgICB3aGlsZSAocGF0aHMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgdGxkU2NhbkphcigoRmlsZSkgcGF0aHMubmV4dCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBsaXN0W10gPSBnZXRUbGRMaXN0ZW5lcnMoKTsKKworICAgICAgICBpZiggdGxkQ2FjaGUhPSBudWxsICkgeworICAgICAgICAgICAgbG9nLmRlYnVnKCAiU2F2aW5nIHRsZCBjYWNoZTogIiArIHRsZENhY2hlICsgIiAiICsgbGlzdC5sZW5ndGgpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIG91dD1uZXcgRmlsZU91dHB1dFN0cmVhbSh0bGRDYWNoZSk7CisgICAgICAgICAgICAgICAgT2JqZWN0T3V0cHV0U3RyZWFtIG9vcz1uZXcgT2JqZWN0T3V0cHV0U3RyZWFtKCBvdXQgKTsKKyAgICAgICAgICAgICAgICBvb3Mud3JpdGVPYmplY3QoIGxpc3QgKTsKKyAgICAgICAgICAgICAgICBvb3MuY2xvc2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2goIElPRXhjZXB0aW9uIGV4ICkgeworICAgICAgICAgICAgICAgIGV4LnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYoIGxvZy5pc0RlYnVnRW5hYmxlZCgpICkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZyggIkFkZGluZyB0bGQgbGlzdGVuZXJzOiIgKyBsaXN0Lmxlbmd0aCk7CisgICAgICAgIGZvciggaW50IGk9MDsgbGlzdCE9bnVsbCAmJiBpPGxpc3QubGVuZ3RoOyBpKysgKSB7CisgICAgICAgICAgICBjb250ZXh0LmFkZEFwcGxpY2F0aW9uTGlzdGVuZXIobGlzdFtpXSk7CisgICAgICAgIH0KKworICAgICAgICBsb25nIHQyPVN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICBpZiggY29udGV4dCBpbnN0YW5jZW9mIFN0YW5kYXJkQ29udGV4dCApIHsKKyAgICAgICAgICAgICgoU3RhbmRhcmRDb250ZXh0KWNvbnRleHQpLnNldFRsZFNjYW5UaW1lKHQyLXQxKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJpdmF0ZSBNZXRob2RzCisKKyAgICAvKgorICAgICAqIFJldHVybnMgdGhlIGxhc3QgbW9kaWZpY2F0aW9uIGRhdGUgb2YgdGhlIGdpdmVuIHNldHMgb2YgcmVzb3VyY2VzLgorICAgICAqCisgICAgICogQHBhcmFtIHJlc291cmNlUGF0aHMKKyAgICAgKiBAcGFyYW0gamFyUGF0aHMKKyAgICAgKgorICAgICAqIEByZXR1cm4gTGFzdCBtb2RpZmljYXRpb24gZGF0ZQorICAgICAqLworICAgIHByaXZhdGUgbG9uZyBnZXRMYXN0TW9kaWZpZWQoU2V0IHJlc291cmNlUGF0aHMsIE1hcCBqYXJQYXRocykKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIGxvbmcgbGFzdE1vZGlmaWVkID0gMDsKKworICAgICAgICBJdGVyYXRvciBwYXRocyA9IHJlc291cmNlUGF0aHMuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKHBhdGhzLmhhc05leHQoKSkgeworICAgICAgICAgICAgU3RyaW5nIHBhdGggPSAoU3RyaW5nKSBwYXRocy5uZXh0KCk7CisgICAgICAgICAgICBVUkwgdXJsID0gY29udGV4dC5nZXRTZXJ2bGV0Q29udGV4dCgpLmdldFJlc291cmNlKHBhdGgpOworICAgICAgICAgICAgaWYgKHVybCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCAiTnVsbCB1cmwgIisgcGF0aCApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9uZyBsYXN0TSA9IHVybC5vcGVuQ29ubmVjdGlvbigpLmdldExhc3RNb2RpZmllZCgpOworICAgICAgICAgICAgaWYgKGxhc3RNID4gbGFzdE1vZGlmaWVkKSBsYXN0TW9kaWZpZWQgPSBsYXN0TTsKKyAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyggIkxhc3QgbW9kaWZpZWQgIiArIHBhdGggKyAiICIgKyBsYXN0TSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoamFyUGF0aHMgIT0gbnVsbCkgeworICAgICAgICAgICAgcGF0aHMgPSBqYXJQYXRocy52YWx1ZXMoKS5pdGVyYXRvcigpOworICAgICAgICAgICAgd2hpbGUgKHBhdGhzLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIEZpbGUgamFyRmlsZSA9IChGaWxlKSBwYXRocy5uZXh0KCk7CisgICAgICAgICAgICAgICAgbG9uZyBsYXN0TSA9IGphckZpbGUubGFzdE1vZGlmaWVkKCk7CisgICAgICAgICAgICAgICAgaWYgKGxhc3RNID4gbGFzdE1vZGlmaWVkKSBsYXN0TW9kaWZpZWQgPSBsYXN0TTsKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJMYXN0IG1vZGlmaWVkICIgKyBqYXJGaWxlLmdldEFic29sdXRlUGF0aCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgIiArIGxhc3RNKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbGFzdE1vZGlmaWVkOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzQ2FjaGUoRmlsZSB0bGRDYWNoZSApIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIHJlYWQgdGhlIGNhY2hlIGFuZCByZXR1cm47CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBGaWxlSW5wdXRTdHJlYW0gaW49bmV3IEZpbGVJbnB1dFN0cmVhbSh0bGRDYWNoZSk7CisgICAgICAgICAgICBPYmplY3RJbnB1dFN0cmVhbSBvaXM9bmV3IE9iamVjdElucHV0U3RyZWFtKCBpbiApOworICAgICAgICAgICAgU3RyaW5nIGxpc3RbXT0oU3RyaW5nIFtdKW9pcy5yZWFkT2JqZWN0KCk7CisgICAgICAgICAgICBpZiggbG9nLmlzRGVidWdFbmFibGVkKCkgKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiUmV1c2luZyB0bGRDYWNoZSAiICsgdGxkQ2FjaGUgKyAiICIgKyBsaXN0Lmxlbmd0aCk7CisgICAgICAgICAgICBmb3IoIGludCBpPTA7IGxpc3QhPW51bGwgJiYgaTxsaXN0Lmxlbmd0aDsgaSsrICkgeworICAgICAgICAgICAgICAgIGNvbnRleHQuYWRkQXBwbGljYXRpb25MaXN0ZW5lcihsaXN0W2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9pcy5jbG9zZSgpOworICAgICAgICB9IGNhdGNoKCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGV4ICkgeworICAgICAgICAgICAgZXgucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgKGlmIG5lY2Vzc2FyeSkgYW5kIHJldHVybiBhIERpZ2VzdGVyIGNvbmZpZ3VyZWQgdG8gcHJvY2VzcyBhIHRhZworICAgICAqIGxpYnJhcnkgZGVzY3JpcHRvciwgbG9va2luZyBmb3IgYWRkaXRpb25hbCBsaXN0ZW5lciBjbGFzc2VzIHRvIGJlCisgICAgICogcmVnaXN0ZXJlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBEaWdlc3RlciBjcmVhdGVUbGREaWdlc3RlcigpIHsKKworICAgICAgICByZXR1cm4gRGlnZXN0ZXJGYWN0b3J5Lm5ld0RpZ2VzdGVyKHRsZFZhbGlkYXRpb24sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRsZE5hbWVzcGFjZUF3YXJlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVGxkUnVsZVNldCgpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2NhbiB0aGUgSkFSIGZpbGUgYXQgdGhlIHNwZWNpZmllZCByZXNvdXJjZSBwYXRoIGZvciBUTERzIGluIHRoZQorICAgICAqIDxjb2RlPk1FVEEtSU5GPC9jb2RlPiBzdWJkaXJlY3RvcnksIGFuZCBzY2FuIGVhY2ggVExEIGZvciBhcHBsaWNhdGlvbgorICAgICAqIGV2ZW50IGxpc3RlbmVycyB0aGF0IG5lZWQgdG8gYmUgcmVnaXN0ZXJlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNvdXJjZVBhdGggUmVzb3VyY2UgcGF0aCBvZiB0aGUgSkFSIGZpbGUgdG8gc2NhbgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW4gZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBzY2FubmluZyB0aGlzIEpBUgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB0bGRTY2FuSmFyKFN0cmluZyByZXNvdXJjZVBhdGgpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgbG9nLmRlYnVnKCIgU2Nhbm5pbmcgSkFSIGF0IHJlc291cmNlIHBhdGggJyIgKyByZXNvdXJjZVBhdGggKyAiJyIpOworICAgICAgICB9CisKKyAgICAgICAgVVJMIHVybCA9IGNvbnRleHQuZ2V0U2VydmxldENvbnRleHQoKS5nZXRSZXNvdXJjZShyZXNvdXJjZVBhdGgpOworICAgICAgICBpZiAodXJsID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygiY29udGV4dENvbmZpZy50bGRSZXNvdXJjZVBhdGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlUGF0aCkpOworICAgICAgICB9CisKKyAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUodXJsLmdldEZpbGUoKSk7CisgICAgICAgIGZpbGUgPSBmaWxlLmdldENhbm9uaWNhbEZpbGUoKTsKKyAgICAgICAgdGxkU2NhbkphcihmaWxlKTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFNjYW5zIGFsbCBUTEQgZW50cmllcyBpbiB0aGUgZ2l2ZW4gSkFSIGZvciBhcHBsaWNhdGlvbiBsaXN0ZW5lcnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZSBKQVIgZmlsZSB3aG9zZSBUTEQgZW50cmllcyBhcmUgc2Nhbm5lZCBmb3IgYXBwbGljYXRpb24KKyAgICAgKiBsaXN0ZW5lcnMKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgdGxkU2NhbkphcihGaWxlIGZpbGUpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIEphckZpbGUgamFyRmlsZSA9IG51bGw7CisgICAgICAgIFN0cmluZyBuYW1lID0gbnVsbDsKKworICAgICAgICBTdHJpbmcgamFyUGF0aCA9IGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGphckZpbGUgPSBuZXcgSmFyRmlsZShmaWxlKTsKKyAgICAgICAgICAgIEVudW1lcmF0aW9uIGVudHJpZXMgPSBqYXJGaWxlLmVudHJpZXMoKTsKKyAgICAgICAgICAgIHdoaWxlIChlbnRyaWVzLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgSmFyRW50cnkgZW50cnkgPSAoSmFyRW50cnkpIGVudHJpZXMubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICBuYW1lID0gZW50cnkuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgIGlmICghbmFtZS5zdGFydHNXaXRoKCJNRVRBLUlORi8iKSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFuYW1lLmVuZHNXaXRoKCIudGxkIikpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBsb2cudHJhY2UoIiAgUHJvY2Vzc2luZyBUTEQgYXQgJyIgKyBuYW1lICsgIiciKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgdGxkU2NhblN0cmVhbShuZXcgSW5wdXRTb3VyY2UoamFyRmlsZS5nZXRJbnB1dFN0cmVhbShlbnRyeSkpKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3Ioc20uZ2V0U3RyaW5nKCJjb250ZXh0Q29uZmlnLnRsZEVudHJ5RXhjZXB0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBqYXJQYXRoLCBjb250ZXh0LmdldFBhdGgoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2cuZXJyb3Ioc20uZ2V0U3RyaW5nKCJjb250ZXh0Q29uZmlnLnRsZEphckV4Y2VwdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphclBhdGgsIGNvbnRleHQuZ2V0UGF0aCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICBlKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChqYXJGaWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBqYXJGaWxlLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2NhbiB0aGUgVExEIGNvbnRlbnRzIGluIHRoZSBzcGVjaWZpZWQgaW5wdXQgc3RyZWFtLCBhbmQgcmVnaXN0ZXIKKyAgICAgKiBhbnkgYXBwbGljYXRpb24gZXZlbnQgbGlzdGVuZXJzIGZvdW5kIHRoZXJlLiAgPGI+Tk9URTwvYj4gLSBJdCBpcworICAgICAqIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgY2FsbGVyIHRvIGNsb3NlIHRoZSBJbnB1dFN0cmVhbSBhZnRlciB0aGlzCisgICAgICogbWV0aG9kIHJldHVybnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VTdHJlYW0gSW5wdXRTdHJlYW0gY29udGFpbmluZyBhIHRhZyBsaWJyYXJ5IGRlc2NyaXB0b3IKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgc2Nhbm5pbmcgdGhpcyBUTEQKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgdGxkU2NhblN0cmVhbShJbnB1dFNvdXJjZSByZXNvdXJjZVN0cmVhbSkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKHRsZERpZ2VzdGVyID09IG51bGwpeworICAgICAgICAgICAgdGxkRGlnZXN0ZXIgPSBjcmVhdGVUbGREaWdlc3RlcigpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBzeW5jaHJvbml6ZWQgKHRsZERpZ2VzdGVyKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHRsZERpZ2VzdGVyLnB1c2godGhpcyk7CisgICAgICAgICAgICAgICAgdGxkRGlnZXN0ZXIucGFyc2UocmVzb3VyY2VTdHJlYW0pOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICB0bGREaWdlc3Rlci5yZXNldCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTY2FuIHRoZSBUTEQgY29udGVudHMgYXQgdGhlIHNwZWNpZmllZCByZXNvdXJjZSBwYXRoLCBhbmQgcmVnaXN0ZXIKKyAgICAgKiBhbnkgYXBwbGljYXRpb24gZXZlbnQgbGlzdGVuZXJzIGZvdW5kIHRoZXJlLgorICAgICAqCisgICAgICogQHBhcmFtIHJlc291cmNlUGF0aCBSZXNvdXJjZSBwYXRoIGJlaW5nIHNjYW5uZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgc2Nhbm5pbmcgdGhpcyBUTEQKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgdGxkU2NhblRsZChTdHJpbmcgcmVzb3VyY2VQYXRoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiIFNjYW5uaW5nIFRMRCBhdCByZXNvdXJjZSBwYXRoICciICsgcmVzb3VyY2VQYXRoICsgIiciKTsKKyAgICAgICAgfQorCisgICAgICAgIElucHV0U291cmNlIGlucHV0U291cmNlID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlucHV0U291cmNlID0KKyAgICAgICAgICAgICAgICBuZXcgSW5wdXRTb3VyY2UoCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0U2VydmxldENvbnRleHQoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKHJlc291cmNlUGF0aCkpOworICAgICAgICAgICAgaWYgKGlucHV0U291cmNlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoImNvbnRleHRDb25maWcudGxkUmVzb3VyY2VQYXRoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZVBhdGgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRsZFNjYW5TdHJlYW0oaW5wdXRTb3VyY2UpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoImNvbnRleHRDb25maWcudGxkRmlsZUV4Y2VwdGlvbiIsIHJlc291cmNlUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmdldFBhdGgoKSksCisgICAgICAgICAgICAgICAgICBlKTsKKyAgICAgICAgfSAKKworICAgIH0KKworICAgIC8qKgorICAgICAqIEFjY3VtdWxhdGUgYW5kIHJldHVybiBhIFNldCBvZiByZXNvdXJjZSBwYXRocyB0byBiZSBhbmFseXplZCBmb3IKKyAgICAgKiB0YWcgbGlicmFyeSBkZXNjcmlwdG9ycy4gIEVhY2ggZWxlbWVudCBvZiB0aGUgcmV0dXJuZWQgc2V0IHdpbGwgYmUKKyAgICAgKiB0aGUgY29udGV4dC1yZWxhdGl2ZSBwYXRoIHRvIGVpdGhlciBhIHRhZyBsaWJyYXJ5IGRlc2NyaXB0b3IgZmlsZSwKKyAgICAgKiBvciB0byBhIEpBUiBmaWxlIHRoYXQgbWF5IGNvbnRhaW4gdGFnIGxpYnJhcnkgZGVzY3JpcHRvcnMgaW4gaXRzCisgICAgICogPGNvZGU+TUVUQS1JTkY8L2NvZGU+IHN1YmRpcmVjdG9yeS4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycyB3aGlsZQorICAgICAqICBhY2N1bXVsYXRpbmcgdGhlIGxpc3Qgb2YgcmVzb3VyY2UgcGF0aHMKKyAgICAgKi8KKyAgICBwcml2YXRlIFNldCB0bGRTY2FuUmVzb3VyY2VQYXRocygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgbG9nLmRlYnVnKCIgQWNjdW11bGF0aW5nIFRMRCByZXNvdXJjZSBwYXRocyIpOworICAgICAgICB9CisgICAgICAgIFNldCByZXNvdXJjZVBhdGhzID0gbmV3IEhhc2hTZXQoKTsKKworICAgICAgICAvLyBBY2N1bXVsYXRlIHJlc291cmNlIHBhdGhzIGV4cGxpY2l0bHkgbGlzdGVkIGluIHRoZSB3ZWIgYXBwbGljYXRpb24KKyAgICAgICAgLy8gZGVwbG95bWVudCBkZXNjcmlwdG9yCisgICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkgeworICAgICAgICAgICAgbG9nLnRyYWNlKCIgIFNjYW5uaW5nIDx0YWdsaWI+IGVsZW1lbnRzIGluIHdlYi54bWwiKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgdGFnbGlic1tdID0gY29udGV4dC5maW5kVGFnbGlicygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRhZ2xpYnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIFN0cmluZyByZXNvdXJjZVBhdGggPSBjb250ZXh0LmZpbmRUYWdsaWIodGFnbGlic1tpXSk7CisgICAgICAgICAgICAvLyBGSVhNRSAtIFNlcnZsZXQgMi40IERURCBpbXBsaWVzIHRoYXQgdGhlIGxvY2F0aW9uIE1VU1QgYmUKKyAgICAgICAgICAgIC8vIGEgY29udGV4dC1yZWxhdGl2ZSBwYXRoIHN0YXJ0aW5nIHdpdGggJy8nPworICAgICAgICAgICAgaWYgKCFyZXNvdXJjZVBhdGguc3RhcnRzV2l0aCgiLyIpKSB7CisgICAgICAgICAgICAgICAgcmVzb3VyY2VQYXRoID0gIi9XRUItSU5GLyIgKyByZXNvdXJjZVBhdGg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICBsb2cudHJhY2UoIiAgIEFkZGluZyBwYXRoICciICsgcmVzb3VyY2VQYXRoICsKKyAgICAgICAgICAgICAgICAgICAgIicgZm9yIFVSSSAnIiArIHRhZ2xpYnNbaV0gKyAiJyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzb3VyY2VQYXRocy5hZGQocmVzb3VyY2VQYXRoKTsKKyAgICAgICAgfQorCisgICAgICAgIERpckNvbnRleHQgcmVzb3VyY2VzID0gY29udGV4dC5nZXRSZXNvdXJjZXMoKTsKKyAgICAgICAgaWYgKHJlc291cmNlcyAhPSBudWxsKSB7CisgICAgICAgICAgICB0bGRTY2FuUmVzb3VyY2VQYXRoc1dlYkluZihyZXNvdXJjZXMsICIvV0VCLUlORiIsIHJlc291cmNlUGF0aHMpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmV0dXJuIHRoZSBjb21wbGV0ZWQgc2V0CisgICAgICAgIHJldHVybiAocmVzb3VyY2VQYXRocyk7CisKKyAgICB9CisKKyAgICAvKgorICAgICAqIFNjYW5zIHRoZSB3ZWIgYXBwbGljYXRpb24ncyBzdWJkaXJlY3RvcnkgaWRlbnRpZmllZCBieSByb290UGF0aCwKKyAgICAgKiBhbG9uZyB3aXRoIGl0cyBzdWJkaXJlY3RvcmllcywgZm9yIFRMRHMuCisgICAgICoKKyAgICAgKiBJbml0aWFsbHksIHJvb3RQYXRoIGVxdWFscyAvV0VCLUlORi4gVGhlIC9XRUItSU5GL2NsYXNzZXMgYW5kCisgICAgICogL1dFQi1JTkYvbGliIHN1YmRpcmVjdG9yaWVzIGFyZSBleGNsdWRlZCBmcm9tIHRoZSBzZWFyY2gsIGFzIHBlciB0aGUKKyAgICAgKiBKU1AgMi4wIHNwZWMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VzIFRoZSB3ZWIgYXBwbGljYXRpb24ncyByZXNvdXJjZXMKKyAgICAgKiBAcGFyYW0gcm9vdFBhdGggVGhlIHBhdGggd2hvc2Ugc3ViZGlyZWN0b3JpZXMgYXJlIHRvIGJlIHNlYXJjaGVkIGZvcgorICAgICAqIFRMRHMKKyAgICAgKiBAcGFyYW0gdGxkUGF0aHMgVGhlIHNldCBvZiBUTEQgcmVzb3VyY2UgcGF0aHMgdG8gYWRkIHRvCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHRsZFNjYW5SZXNvdXJjZVBhdGhzV2ViSW5mKERpckNvbnRleHQgcmVzb3VyY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcm9vdFBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldCB0bGRQYXRocykgCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkgeworICAgICAgICAgICAgbG9nLnRyYWNlKCIgIFNjYW5uaW5nIFRMRHMgaW4gIiArIHJvb3RQYXRoICsgIiBzdWJkaXJlY3RvcnkiKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBOYW1pbmdFbnVtZXJhdGlvbiBpdGVtcyA9IHJlc291cmNlcy5saXN0KHJvb3RQYXRoKTsKKyAgICAgICAgICAgIHdoaWxlIChpdGVtcy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgIE5hbWVDbGFzc1BhaXIgaXRlbSA9IChOYW1lQ2xhc3NQYWlyKSBpdGVtcy5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgICAgIFN0cmluZyByZXNvdXJjZVBhdGggPSByb290UGF0aCArICIvIiArIGl0ZW0uZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgIGlmICghcmVzb3VyY2VQYXRoLmVuZHNXaXRoKCIudGxkIikKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIChyZXNvdXJjZVBhdGguc3RhcnRzV2l0aCgiL1dFQi1JTkYvY2xhc3NlcyIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgcmVzb3VyY2VQYXRoLnN0YXJ0c1dpdGgoIi9XRUItSU5GL2xpYiIpKSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHJlc291cmNlUGF0aC5lbmRzV2l0aCgiLnRsZCIpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9nLnRyYWNlKCIgICBBZGRpbmcgcGF0aCAnIiArIHJlc291cmNlUGF0aCArICInIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdGxkUGF0aHMuYWRkKHJlc291cmNlUGF0aCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGxkU2NhblJlc291cmNlUGF0aHNXZWJJbmYocmVzb3VyY2VzLCByZXNvdXJjZVBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRsZFBhdGhzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICA7IC8vIFNpbGVudCBjYXRjaDogaXQncyB2YWxpZCB0aGF0IG5vIC9XRUItSU5GIGRpcmVjdG9yeSBleGlzdHMKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBtYXAgb2YgdGhlIHBhdGhzIHRvIGFsbCBKQVIgZmlsZXMgdGhhdCBhcmUgYWNjZXNzaWJsZSB0byB0aGUKKyAgICAgKiB3ZWJhcHAgYW5kIHdpbGwgYmUgc2Nhbm5lZCBmb3IgVExEcy4KKyAgICAgKgorICAgICAqIFRoZSBtYXAgYWx3YXlzIGluY2x1ZGVzIGFsbCB0aGUgSkFScyB1bmRlciBXRUItSU5GL2xpYiwgYXMgd2VsbCBhcworICAgICAqIHNoYXJlZCBKQVJzIGluIHRoZSBjbGFzc2xvYWRlciBkZWxlZ2F0aW9uIGNoYWluIG9mIHRoZSB3ZWJhcHAncworICAgICAqIGNsYXNzbG9hZGVyLgorICAgICAqCisgICAgICogVGhlIGxhdHRlciBjb25zdGl0dXRlcyBhIFRvbWNhdC1zcGVjaWZpYyBleHRlbnNpb24gdG8gdGhlIFRMRCBzZWFyY2gKKyAgICAgKiBvcmRlciBkZWZpbmVkIGluIHRoZSBKU1Agc3BlYy4gSXQgYWxsb3dzIHRhZyBsaWJyYXJpZXMgcGFja2FnZWQgYXMgSkFSCisgICAgICogZmlsZXMgdG8gYmUgc2hhcmVkIGJ5IHdlYiBhcHBsaWNhdGlvbnMgYnkgc2ltcGx5IGRyb3BwaW5nIHRoZW0gaW4gYSAKKyAgICAgKiBsb2NhdGlvbiB0aGF0IGFsbCB3ZWIgYXBwbGljYXRpb25zIGhhdmUgYWNjZXNzIHRvIChlLmcuLAorICAgICAqIDxDQVRBTElOQV9IT01FPi9jb21tb24vbGliKS4KKyAgICAgKgorICAgICAqIFRoZSBzZXQgb2Ygc2hhcmVkIEpBUnMgdG8gYmUgc2Nhbm5lZCBmb3IgVExEcyBpcyBuYXJyb3dlZCBkb3duIGJ5CisgICAgICogdGhlIDx0dD5ub1RsZEphcnM8L3R0PiBjbGFzcyB2YXJpYWJsZSwgd2hpY2ggY29udGFpbnMgdGhlIG5hbWVzIG9mIEpBUnMKKyAgICAgKiB0aGF0IGFyZSBrbm93biBub3QgdG8gY29udGFpbiBhbnkgVExEcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gTWFwIG9mIEpBUiBmaWxlIHBhdGhzCisgICAgICovCisgICAgcHJpdmF0ZSBNYXAgZ2V0SmFyUGF0aHMoKSB7CisKKyAgICAgICAgSGFzaE1hcCBqYXJQYXRoTWFwID0gbnVsbDsKKworICAgICAgICBDbGFzc0xvYWRlciB3ZWJhcHBMb2FkZXIgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOworICAgICAgICBDbGFzc0xvYWRlciBsb2FkZXIgPSB3ZWJhcHBMb2FkZXI7CisgICAgICAgIHdoaWxlIChsb2FkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGxvYWRlciBpbnN0YW5jZW9mIFVSTENsYXNzTG9hZGVyKSB7CisgICAgICAgICAgICAgICAgVVJMW10gdXJscyA9ICgoVVJMQ2xhc3NMb2FkZXIpIGxvYWRlcikuZ2V0VVJMcygpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTx1cmxzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEV4cGVjdCBmaWxlIFVSTHMKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBkZWZpbml0ZWx5IG5vdCBhcyBjbGVhbiBhcyB1c2luZyBKQVIgVVJMcyBlaXRoZXIKKyAgICAgICAgICAgICAgICAgICAgLy8gb3ZlciBmaWxlIG9yIHRoZSBjdXN0b20gam5kaSBoYW5kbGVyLCBidXQgYSBsb3QgbGVzcworICAgICAgICAgICAgICAgICAgICAvLyBidWdneSBvdmVyYWxsCisgICAgICAgICAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKHVybHNbaV0uZ2V0RmlsZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgPSBmaWxlLmdldENhbm9uaWNhbEZpbGUoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghcGF0aC5lbmRzV2l0aCgiLmphciIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgKiBTY2FuIGFsbCBKQVJzIGZyb20gV0VCLUlORi9saWIsIHBsdXMgYW55IHNoYXJlZCBKQVJzCisgICAgICAgICAgICAgICAgICAgICAqIHRoYXQgYXJlIG5vdCBrbm93biBub3QgdG8gY29udGFpbiBhbnkgVExEcworICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKGxvYWRlciA9PSB3ZWJhcHBMb2FkZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBub1RsZEphcnMgPT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICFub1RsZEphcnMuY29udGFpbnMoZmlsZS5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoamFyUGF0aE1hcCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgamFyUGF0aE1hcCA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgamFyUGF0aE1hcC5wdXQocGF0aCwgZmlsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFqYXJQYXRoTWFwLmNvbnRhaW5zS2V5KHBhdGgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgamFyUGF0aE1hcC5wdXQocGF0aCwgZmlsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb2FkZXIgPSBsb2FkZXIuZ2V0UGFyZW50KCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gamFyUGF0aE1hcDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9UbGRSdWxlU2V0LmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9UbGRSdWxlU2V0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJmZDRhOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdGFydHVwL1RsZFJ1bGVTZXQuamF2YQpAQCAtMCwwICsxLDk1IEBACisvKgorICogQ29weXJpZ2h0IDE5OTktMjAwMSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cDsKKworCitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5kaWdlc3Rlci5EaWdlc3RlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvbWNhdC51dGlsLmRpZ2VzdGVyLlJ1bGVTZXRCYXNlOworCisKKy8qKgorICogPHA+PHN0cm9uZz5SdWxlU2V0PC9zdHJvbmc+IGZvciBwcm9jZXNzaW5nIHRoZSBjb250ZW50cyBvZiBhIHRhZyBsaWJyYXJ5CisgKiBkZXNjcmlwdG9yIHJlc291cmNlLjwvcD4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIFRsZFJ1bGVTZXQgZXh0ZW5kcyBSdWxlU2V0QmFzZSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgbWF0Y2hpbmcgcGF0dGVybiBwcmVmaXggdG8gdXNlIGZvciByZWNvZ25pemluZyBvdXIgZWxlbWVudHMuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBwcmVmaXggPSBudWxsOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3IKKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGFuIGluc3RhbmNlIG9mIHRoaXMgPGNvZGU+UnVsZVNldDwvY29kZT4gd2l0aCB0aGUgZGVmYXVsdAorICAgICAqIG1hdGNoaW5nIHBhdHRlcm4gcHJlZml4LgorICAgICAqLworICAgIHB1YmxpYyBUbGRSdWxlU2V0KCkgeworCisgICAgICAgIHRoaXMoIiIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYW4gaW5zdGFuY2Ugb2YgdGhpcyA8Y29kZT5SdWxlU2V0PC9jb2RlPiB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBtYXRjaGluZyBwYXR0ZXJuIHByZWZpeC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcmVmaXggUHJlZml4IGZvciBtYXRjaGluZyBwYXR0ZXJuIHJ1bGVzIChpbmNsdWRpbmcgdGhlCisgICAgICogIHRyYWlsaW5nIHNsYXNoIGNoYXJhY3RlcikKKyAgICAgKi8KKyAgICBwdWJsaWMgVGxkUnVsZVNldChTdHJpbmcgcHJlZml4KSB7CisKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgdGhpcy5uYW1lc3BhY2VVUkkgPSBudWxsOworICAgICAgICB0aGlzLnByZWZpeCA9IHByZWZpeDsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIDxwPkFkZCB0aGUgc2V0IG9mIFJ1bGUgaW5zdGFuY2VzIGRlZmluZWQgaW4gdGhpcyBSdWxlU2V0IHRvIHRoZQorICAgICAqIHNwZWNpZmllZCA8Y29kZT5EaWdlc3RlcjwvY29kZT4gaW5zdGFuY2UsIGFzc29jaWF0aW5nIHRoZW0gd2l0aAorICAgICAqIG91ciBuYW1lc3BhY2UgVVJJIChpZiBhbnkpLiAgVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgY2FsbGVkCisgICAgICogYnkgYSBEaWdlc3RlciBpbnN0YW5jZS48L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gZGlnZXN0ZXIgRGlnZXN0ZXIgaW5zdGFuY2UgdG8gd2hpY2ggdGhlIG5ldyBSdWxlIGluc3RhbmNlcworICAgICAqICBzaG91bGQgYmUgYWRkZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkUnVsZUluc3RhbmNlcyhEaWdlc3RlciBkaWdlc3RlcikgeworCisgICAgICAgIGRpZ2VzdGVyLmFkZENhbGxNZXRob2QocHJlZml4ICsgInRhZ2xpYi9saXN0ZW5lci9saXN0ZW5lci1jbGFzcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkZEFwcGxpY2F0aW9uTGlzdGVuZXIiLCAwKTsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9Ub29sLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9Ub29sLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDgyZWIxMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdGFydHVwL1Rvb2wuamF2YQpAQCAtMCwwICsxLDI0MyBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5zdGFydHVwOworCisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKKworCisvKioKKyAqIDxwPkdlbmVyYWwgcHVycG9zZSB3cmFwcGVyIGZvciBjb21tYW5kIGxpbmUgdG9vbHMgdGhhdCBzaG91bGQgZXhlY3V0ZSBpbiBhbgorICogZW52aXJvbm1lbnQgd2l0aCB0aGUgY29tbW9uIGNsYXNzIGxvYWRlciBlbnZpcm9ubWVudCBzZXQgdXAgYnkgQ2F0YWxpbmEuCisgKiBUaGlzIHNob3VsZCBiZSBleGVjdXRlZCBmcm9tIGEgY29tbWFuZCBsaW5lIHNjcmlwdCB0aGF0IGNvbmZvcm1zIHRvCisgKiB0aGUgZm9sbG93aW5nIHJlcXVpcmVtZW50czo8L3A+CisgKiA8dWw+CisgKiA8bGk+UGFzc2VzIHRoZSA8Y29kZT5jYXRhbGluYS5ob21lPC9jb2RlPiBzeXN0ZW0gcHJvcGVydHkgY29uZmlndXJlZCB3aXRoCisgKiAgICAgdGhlIHBhdGhuYW1lIG9mIHRoZSBUb21jYXQgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeS48L2xpPgorICogPGxpPlNldHMgdGhlIHN5c3RlbSBjbGFzc3BhdGggdG8gaW5jbHVkZSA8Y29kZT5ib290c3RyYXAuamFyPC9jb2RlPiBhbmQKKyAqICAgICA8Y29kZT4kSkFWQV9IT01FL2xpYi90b29scy5qYXI8L2NvZGU+LjwvbGk+CisgKiA8L3VsPgorICoKKyAqIDxwPlRoZSBjb21tYW5kIGxpbmUgdG8gZXhlY3V0ZSB0aGUgdG9vbCBsb29rcyBsaWtlOjwvcD4KKyAqIDxwcmU+CisgKiAgIGphdmEgLWNsYXNzcGF0aCAkQ0xBU1NQQVRIIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cC5Ub29sIFwKKyAqICAgICAke29wdGlvbnN9ICR7Y2xhc3NuYW1lfSAke2FyZ3VtZW50c30KKyAqIDwvcHJlPgorICoKKyAqIDxwPndpdGggdGhlIGZvbGxvd2luZyByZXBsYWNlbWVudCBjb250ZW50czoKKyAqIDx1bD4KKyAqIDxsaT48c3Ryb25nPiR7b3B0aW9uc308L3N0cm9uZz4gLSBDb21tYW5kIGxpbmUgb3B0aW9ucyBmb3IgdGhpcyBUb29sIHdyYXBwZXIuCisgKiAgICAgVGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSBzdXBwb3J0ZWQ6CisgKiAgICAgPHVsPgorICogICAgIDxsaT48ZW0+LWFudDwvZW0+IDogU2V0IHRoZSA8Y29kZT5hbnQuaG9tZTwvY29kZT4gc3lzdGVtIHByb3BlcnR5CisgKiAgICAgICAgIHRvIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHZhbHVlIG9mIDxjb2RlPmNhdGFsaW5hLmhvbWU8L2NvZGU+CisgKiAgICAgICAgICh1c2VmdWwgd2hlbiB5b3VyIGNvbW1hbmQgbGluZSB0b29sIHJ1bnMgQW50KS48L2xpPgorICogICAgIDxsaT48ZW0+LWNvbW1vbjwvZW0+IDogQWRkIDxjb2RlPmNvbW1vbi9jbGFzc2VzPC9jb2RlPiBhbmQKKyAqICAgICAgICAgPGNvZGU+Y29tbW9uL2xpYjwvY29kRSkgdG8gdGhlIGNsYXNzIGxvYWRlciByZXBvc2l0b3JpZXMuPC9saT4KKyAqICAgICA8bGk+PGVtPi1zZXJ2ZXI8L2VtPiA6IEFkZCA8Y29kZT5zZXJ2ZXIvY2xhc3NlczwvY29kZT4gYW5kCisgKiAgICAgICAgIDxjb2RlPnNlcnZlci9saWI8L2NvZGU+IHRvIHRoZSBjbGFzcyBsb2FkZXIgcmVwb3NpdG9yaWVzLjwvbGk+CisgKiAgICAgPGxpPjxlbT4tc2hhcmVkPC9lbT4gOiBBZGQgPGNvZGU+c2hhcmVkL2NsYXNzZXM8L2NvZGU+IGFuZAorICogICAgICAgICA8Y29kZT5zaGFyZWQvbGliPC9jb2RlPiB0byB0aGUgY2xhc3MgbG9hZGVyIHJlcG9zaXRvcmllcy48L2xpPgorICogICAgIDwvdWw+CisgKiA8bGk+PHN0cm9uZz4ke2NsYXNzbmFtZX08L3N0cm9uZz4gLSBGdWxseSBxdWFsaWZpZWQgSmF2YSBjbGFzcyBuYW1lIG9mIHRoZQorICogICAgIGFwcGxpY2F0aW9uJ3MgbWFpbiBjbGFzcy48L2xpPgorICogPGxpPjxzdHJvbmc+JHthcmd1bWVudHN9PC9zdHJvbmc+IC0gQ29tbWFuZCBsaW5lIGFyZ3VtZW50cyB0byBiZSBwYXNzZWQgdG8KKyAqICAgICB0aGUgYXBwbGljYXRpb24ncyA8Y29kZT5tYWluKCk8L2NvZGU+IG1ldGhvZC48L2xpPgorICogPC91bD4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIFRvb2wgeworCisKKyAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coVG9vbC5jbGFzcyk7CisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTdGF0aWMgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFNldCA8Y29kZT5hbnQuaG9tZTwvY29kZT4gc3lzdGVtIHByb3BlcnR5PworICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gYW50ID0gZmFsc2U7CisKKworICAgIC8qKgorICAgICAqIFRoZSBwYXRobmFtZSBvZiBvdXIgaW5zdGFsbGF0aW9uIGJhc2UgZGlyZWN0b3J5LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBjYXRhbGluYUhvbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImNhdGFsaW5hLmhvbWUiKTsKKworCisgICAgLyoqCisgICAgICogSW5jbHVkZSBjb21tb24gY2xhc3NlcyBpbiB0aGUgcmVwb3NpdG9yaWVzPworICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gY29tbW9uID0gZmFsc2U7CisKKworICAgIC8qKgorICAgICAqIEluY2x1ZGUgc2VydmVyIGNsYXNzZXMgaW4gdGhlIHJlcG9zaXRvcmllcz8KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHNlcnZlciA9IGZhbHNlOworCisKKyAgICAvKioKKyAgICAgKiBJbmNsdWRlIHNoYXJlZCBjbGFzc2VzIGluIHRoZSByZXBvc2l0b3JpZXM/CisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzaGFyZWQgPSBmYWxzZTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTWFpbiBQcm9ncmFtCisKKworICAgIC8qKgorICAgICAqIFRoZSBtYWluIHByb2dyYW0gZm9yIHRoZSBib290c3RyYXAuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXJncyBDb21tYW5kIGxpbmUgYXJndW1lbnRzIHRvIGJlIHByb2Nlc3NlZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pIHsKKworICAgICAgICAvLyBWZXJpZnkgdGhhdCAiY2F0YWxpbmEuaG9tZSIgd2FzIHBhc3NlZC4KKyAgICAgICAgaWYgKGNhdGFsaW5hSG9tZSA9PSBudWxsKSB7CisgICAgICAgICAgICBsb2cuZXJyb3IoIk11c3Qgc2V0ICdjYXRhbGluYS5ob21lJyBzeXN0ZW0gcHJvcGVydHkiKTsKKyAgICAgICAgICAgIFN5c3RlbS5leGl0KDEpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUHJvY2VzcyBjb21tYW5kIGxpbmUgb3B0aW9ucworICAgICAgICBpbnQgaW5kZXggPSAwOworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgaWYgKGluZGV4ID09IGFyZ3MubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgdXNhZ2UoKTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgiLWFudCIuZXF1YWxzKGFyZ3NbaW5kZXhdKSkKKyAgICAgICAgICAgICAgICBhbnQgPSB0cnVlOworICAgICAgICAgICAgZWxzZSBpZiAoIi1jb21tb24iLmVxdWFscyhhcmdzW2luZGV4XSkpCisgICAgICAgICAgICAgICAgY29tbW9uID0gdHJ1ZTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCItc2VydmVyIi5lcXVhbHMoYXJnc1tpbmRleF0pKQorICAgICAgICAgICAgICAgIHNlcnZlciA9IHRydWU7CisgICAgICAgICAgICBlbHNlIGlmICgiLXNoYXJlZCIuZXF1YWxzKGFyZ3NbaW5kZXhdKSkKKyAgICAgICAgICAgICAgICBzaGFyZWQgPSB0cnVlOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgaW5kZXgrKzsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5kZXggPiBhcmdzLmxlbmd0aCkgeworICAgICAgICAgICAgdXNhZ2UoKTsKKyAgICAgICAgICAgIFN5c3RlbS5leGl0KDEpOworICAgICAgICB9CisKKyAgICAgICAgLy8gU2V0ICJhbnQuaG9tZSIgaWYgcmVxdWVzdGVkCisgICAgICAgIGlmIChhbnQpCisgICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImFudC5ob21lIiwgY2F0YWxpbmFIb21lKTsKKworICAgICAgICAvLyBDb25zdHJ1Y3QgdGhlIGNsYXNzIGxvYWRlciB3ZSB3aWxsIGJlIHVzaW5nCisgICAgICAgIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEFycmF5TGlzdCBwYWNrZWQgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgICAgICBBcnJheUxpc3QgdW5wYWNrZWQgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgICAgICB1bnBhY2tlZC5hZGQobmV3IEZpbGUoY2F0YWxpbmFIb21lLCAiY2xhc3NlcyIpKTsKKyAgICAgICAgICAgIHBhY2tlZC5hZGQobmV3IEZpbGUoY2F0YWxpbmFIb21lLCAibGliIikpOworICAgICAgICAgICAgaWYgKGNvbW1vbikgeworICAgICAgICAgICAgICAgIHVucGFja2VkLmFkZChuZXcgRmlsZShjYXRhbGluYUhvbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb21tb24iICsgRmlsZS5zZXBhcmF0b3IgKyAiY2xhc3NlcyIpKTsKKyAgICAgICAgICAgICAgICBwYWNrZWQuYWRkKG5ldyBGaWxlKGNhdGFsaW5hSG9tZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb21tb24iICsgRmlsZS5zZXBhcmF0b3IgKyAibGliIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNlcnZlcikgeworICAgICAgICAgICAgICAgIHVucGFja2VkLmFkZChuZXcgRmlsZShjYXRhbGluYUhvbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXJ2ZXIiICsgRmlsZS5zZXBhcmF0b3IgKyAiY2xhc3NlcyIpKTsKKyAgICAgICAgICAgICAgICBwYWNrZWQuYWRkKG5ldyBGaWxlKGNhdGFsaW5hSG9tZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXJ2ZXIiICsgRmlsZS5zZXBhcmF0b3IgKyAibGliIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNoYXJlZCkgeworICAgICAgICAgICAgICAgIHVucGFja2VkLmFkZChuZXcgRmlsZShjYXRhbGluYUhvbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzaGFyZWQiICsgRmlsZS5zZXBhcmF0b3IgKyAiY2xhc3NlcyIpKTsKKyAgICAgICAgICAgICAgICBwYWNrZWQuYWRkKG5ldyBGaWxlKGNhdGFsaW5hSG9tZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzaGFyZWQiICsgRmlsZS5zZXBhcmF0b3IgKyAibGliIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2xhc3NMb2FkZXIgPQorICAgICAgICAgICAgICAgIENsYXNzTG9hZGVyRmFjdG9yeS5jcmVhdGVDbGFzc0xvYWRlcgorICAgICAgICAgICAgICAgICgoRmlsZVtdKSB1bnBhY2tlZC50b0FycmF5KG5ldyBGaWxlWzBdKSwKKyAgICAgICAgICAgICAgICAgKEZpbGVbXSkgcGFja2VkLnRvQXJyYXkobmV3IEZpbGVbMF0pLAorICAgICAgICAgICAgICAgICBudWxsKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcigiQ2xhc3MgbG9hZGVyIGNyZWF0aW9uIHRocmV3IGV4Y2VwdGlvbiIsIHQpOworICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7CisgICAgICAgIH0KKyAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIoY2xhc3NMb2FkZXIpOworCisgICAgICAgIC8vIExvYWQgb3VyIGFwcGxpY2F0aW9uIGNsYXNzCisgICAgICAgIENsYXNzIGNsYXp6ID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IGFyZ3NbaW5kZXgrK107CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJMb2FkaW5nIGFwcGxpY2F0aW9uIGNsYXNzICIgKyBjbGFzc05hbWUpOworICAgICAgICAgICAgY2xhenogPSBjbGFzc0xvYWRlci5sb2FkQ2xhc3MoY2xhc3NOYW1lKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcigiRXhjZXB0aW9uIGNyZWF0aW5nIGluc3RhbmNlIG9mICIgKyBjbGFzc05hbWUsIHQpOworICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBMb2NhdGUgdGhlIHN0YXRpYyBtYWluKCkgbWV0aG9kIG9mIHRoZSBhcHBsaWNhdGlvbiBjbGFzcworICAgICAgICBNZXRob2QgbWV0aG9kID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIHBhcmFtc1tdID0gbmV3IFN0cmluZ1thcmdzLmxlbmd0aCAtIGluZGV4XTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShhcmdzLCBpbmRleCwgcGFyYW1zLCAwLCBwYXJhbXMubGVuZ3RoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIklkZW50aWZ5aW5nIG1haW4oKSBtZXRob2QiKTsKKyAgICAgICAgICAgIFN0cmluZyBtZXRob2ROYW1lID0gIm1haW4iOworICAgICAgICAgICAgQ2xhc3MgcGFyYW1UeXBlc1tdID0gbmV3IENsYXNzWzFdOworICAgICAgICAgICAgcGFyYW1UeXBlc1swXSA9IHBhcmFtcy5nZXRDbGFzcygpOworICAgICAgICAgICAgbWV0aG9kID0gY2xhenouZ2V0TWV0aG9kKG1ldGhvZE5hbWUsIHBhcmFtVHlwZXMpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgbG9nLmVycm9yKCJFeGNlcHRpb24gbG9jYXRpbmcgbWFpbigpIG1ldGhvZCIsIHQpOworICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBJbnZva2UgdGhlIG1haW4gbWV0aG9kIG9mIHRoZSBhcHBsaWNhdGlvbiBjbGFzcworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ2FsbGluZyBtYWluKCkgbWV0aG9kIik7CisgICAgICAgICAgICBPYmplY3QgcGFyYW1WYWx1ZXNbXSA9IG5ldyBPYmplY3RbMV07CisgICAgICAgICAgICBwYXJhbVZhbHVlc1swXSA9IHBhcmFtczsKKyAgICAgICAgICAgIG1ldGhvZC5pbnZva2UobnVsbCwgcGFyYW1WYWx1ZXMpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgbG9nLmVycm9yKCJFeGNlcHRpb24gY2FsbGluZyBtYWluKCkgbWV0aG9kIiwgdCk7CisgICAgICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBEaXNwbGF5IHVzYWdlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgdG9vbC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHVzYWdlKCkgeworCisgICAgICAgIGxvZy5pbmZvKCJVc2FnZTogIGphdmEgb3JnLmFwYWNoZS5jYXRhbGluYS5zdGFydHVwLlRvb2wgWzxvcHRpb25zPl0gPGNsYXNzPiBbPGFyZ3VtZW50cz5dIik7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvVXNlckNvbmZpZy5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvVXNlckNvbmZpZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjMmNjNjgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9Vc2VyQ29uZmlnLmphdmEKQEAgLTAsMCArMSwzMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cDsKKworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkhvc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVFdmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZUxpc3RlbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5TdHJpbmdNYW5hZ2VyOworCisKKy8qKgorICogU3RhcnR1cCBldmVudCBsaXN0ZW5lciBmb3IgYSA8Yj5Ib3N0PC9iPiB0aGF0IGNvbmZpZ3VyZXMgQ29udGV4dHMgKHdlYgorICogYXBwbGljYXRpb25zKSBmb3IgYWxsIGRlZmluZWQgInVzZXJzIiB3aG8gaGF2ZSBhIHdlYiBhcHBsaWNhdGlvbiBpbiBhCisgKiBkaXJlY3Rvcnkgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgaW4gdGhlaXIgaG9tZSBkaXJlY3Rvcmllcy4gIFRoZSBjb250ZXh0CisgKiBwYXRoIG9mIGVhY2ggZGVwbG95ZWQgYXBwbGljYXRpb24gd2lsbCBiZSBzZXQgdG8gPGNvZGU+fnh4eHh4PC9jb2RlPiwgd2hlcmUKKyAqIHh4eHh4IGlzIHRoZSB1c2VybmFtZSBvZiB0aGUgb3duaW5nIHVzZXIgZm9yIHRoYXQgd2ViIGFwcGxpY2F0aW9uCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBVc2VyQ29uZmlnCisgICAgaW1wbGVtZW50cyBMaWZlY3ljbGVMaXN0ZW5lciB7CisKKworICAgIHByaXZhdGUgc3RhdGljIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZyBsb2c9CisgICAgICAgIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3RvcnkuZ2V0TG9nKCBVc2VyQ29uZmlnLmNsYXNzICk7CisKKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIEphdmEgY2xhc3MgbmFtZSBvZiB0aGUgQ29udGV4dCBjb25maWd1cmF0aW9uIGNsYXNzIHdlIHNob3VsZCB1c2UuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgY29uZmlnQ2xhc3MgPSAib3JnLmFwYWNoZS5jYXRhbGluYS5zdGFydHVwLkNvbnRleHRDb25maWciOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgSmF2YSBjbGFzcyBuYW1lIG9mIHRoZSBDb250ZXh0IGltcGxlbWVudGF0aW9uIHdlIHNob3VsZCB1c2UuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgY29udGV4dENsYXNzID0gIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZENvbnRleHQiOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZGlyZWN0b3J5IG5hbWUgdG8gYmUgc2VhcmNoZWQgZm9yIHdpdGhpbiBlYWNoIHVzZXIgaG9tZSBkaXJlY3RvcnkuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZGlyZWN0b3J5TmFtZSA9ICJwdWJsaWNfaHRtbCI7CisKKworICAgIC8qKgorICAgICAqIFRoZSBiYXNlIGRpcmVjdG9yeSBjb250YWluaW5nIHVzZXIgaG9tZSBkaXJlY3Rvcmllcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBob21lQmFzZSA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBIb3N0IHdlIGFyZSBhc3NvY2lhdGVkIHdpdGguCisgICAgICovCisgICAgcHJpdmF0ZSBIb3N0IGhvc3QgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc3RyaW5nIHJlc291cmNlcyBmb3IgdGhpcyBwYWNrYWdlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ01hbmFnZXIgc20gPQorICAgICAgICBTdHJpbmdNYW5hZ2VyLmdldE1hbmFnZXIoQ29uc3RhbnRzLlBhY2thZ2UpOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgSmF2YSBjbGFzcyBuYW1lIG9mIHRoZSB1c2VyIGRhdGFiYXNlIGNsYXNzIHdlIHNob3VsZCB1c2UuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgdXNlckNsYXNzID0KKyAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cC5QYXNzd2RVc2VyRGF0YWJhc2UiOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBDb250ZXh0IGNvbmZpZ3VyYXRpb24gY2xhc3MgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbmZpZ0NsYXNzKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5jb25maWdDbGFzcyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgQ29udGV4dCBjb25maWd1cmF0aW9uIGNsYXNzIG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29uZmlnQ2xhc3MgVGhlIG5ldyBDb250ZXh0IGNvbmZpZ3VyYXRpb24gY2xhc3MgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb25maWdDbGFzcyhTdHJpbmcgY29uZmlnQ2xhc3MpIHsKKworICAgICAgICB0aGlzLmNvbmZpZ0NsYXNzID0gY29uZmlnQ2xhc3M7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgQ29udGV4dCBpbXBsZW1lbnRhdGlvbiBjbGFzcyBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGV4dENsYXNzKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5jb250ZXh0Q2xhc3MpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIENvbnRleHQgaW1wbGVtZW50YXRpb24gY2xhc3MgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0Q2xhc3MgVGhlIG5ldyBDb250ZXh0IGltcGxlbWVudGF0aW9uIGNsYXNzIG5hbWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29udGV4dENsYXNzKFN0cmluZyBjb250ZXh0Q2xhc3MpIHsKKworICAgICAgICB0aGlzLmNvbnRleHRDbGFzcyA9IGNvbnRleHRDbGFzczsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBkaXJlY3RvcnkgbmFtZSBmb3IgdXNlciB3ZWIgYXBwbGljYXRpb25zLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGlyZWN0b3J5TmFtZSgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMuZGlyZWN0b3J5TmFtZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZGlyZWN0b3J5IG5hbWUgZm9yIHVzZXIgd2ViIGFwcGxpY2F0aW9ucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkaXJlY3RvcnlOYW1lIFRoZSBuZXcgZGlyZWN0b3J5IG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREaXJlY3RvcnlOYW1lKFN0cmluZyBkaXJlY3RvcnlOYW1lKSB7CisKKyAgICAgICAgdGhpcy5kaXJlY3RvcnlOYW1lID0gZGlyZWN0b3J5TmFtZTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBiYXNlIGRpcmVjdG9yeSBjb250YWluaW5nIHVzZXIgaG9tZSBkaXJlY3Rvcmllcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEhvbWVCYXNlKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5ob21lQmFzZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYmFzZSBkaXJlY3RvcnkgY29udGFpbmluZyB1c2VyIGhvbWUgZGlyZWN0b3JpZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaG9tZUJhc2UgVGhlIG5ldyBiYXNlIGRpcmVjdG9yeQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEhvbWVCYXNlKFN0cmluZyBob21lQmFzZSkgeworCisgICAgICAgIHRoaXMuaG9tZUJhc2UgPSBob21lQmFzZTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB1c2VyIGRhdGFiYXNlIGNsYXNzIG5hbWUgZm9yIHRoaXMgY29tcG9uZW50LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXNlckNsYXNzKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy51c2VyQ2xhc3MpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHVzZXIgZGF0YWJhc2UgY2xhc3MgbmFtZSBmb3IgdGhpcyBjb21wb25lbnQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VXNlckNsYXNzKFN0cmluZyB1c2VyQ2xhc3MpIHsKKworICAgICAgICB0aGlzLnVzZXJDbGFzcyA9IHVzZXJDbGFzczsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIFNUQVJUIGV2ZW50IGZvciBhbiBhc3NvY2lhdGVkIEhvc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnQgVGhlIGxpZmVjeWNsZSBldmVudCB0aGF0IGhhcyBvY2N1cnJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGxpZmVjeWNsZUV2ZW50KExpZmVjeWNsZUV2ZW50IGV2ZW50KSB7CisKKyAgICAgICAgLy8gSWRlbnRpZnkgdGhlIGhvc3Qgd2UgYXJlIGFzc29jaWF0ZWQgd2l0aAorICAgICAgICB0cnkgeworICAgICAgICAgICAgaG9zdCA9IChIb3N0KSBldmVudC5nZXRMaWZlY3ljbGUoKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcihzbS5nZXRTdHJpbmcoImhvc3RDb25maWcuY2NlIiwgZXZlbnQuZ2V0TGlmZWN5Y2xlKCkpLCBlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFByb2Nlc3MgdGhlIGV2ZW50IHRoYXQgaGFzIG9jY3VycmVkCisgICAgICAgIGlmIChldmVudC5nZXRUeXBlKCkuZXF1YWxzKExpZmVjeWNsZS5TVEFSVF9FVkVOVCkpCisgICAgICAgICAgICBzdGFydCgpOworICAgICAgICBlbHNlIGlmIChldmVudC5nZXRUeXBlKCkuZXF1YWxzKExpZmVjeWNsZS5TVE9QX0VWRU5UKSkKKyAgICAgICAgICAgIHN0b3AoKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJpdmF0ZSBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIERlcGxveSBhIHdlYiBhcHBsaWNhdGlvbiBmb3IgYW55IHVzZXIgd2hvIGhhcyBhIHdlYiBhcHBsaWNhdGlvbiBwcmVzZW50CisgICAgICogaW4gYSBkaXJlY3Rvcnkgd2l0aCBhIHNwZWNpZmllZCBuYW1lIHdpdGhpbiB0aGVpciBob21lIGRpcmVjdG9yeS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZGVwbG95KCkgeworCisgICAgICAgIGlmIChob3N0LmdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBob3N0LmdldExvZ2dlcigpLmRlYnVnKHNtLmdldFN0cmluZygidXNlckNvbmZpZy5kZXBsb3lpbmciKSk7CisKKyAgICAgICAgLy8gTG9hZCB0aGUgdXNlciBkYXRhYmFzZSBvYmplY3QgZm9yIHRoaXMgaG9zdAorICAgICAgICBVc2VyRGF0YWJhc2UgZGF0YWJhc2UgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ2xhc3MgY2xhenogPSBDbGFzcy5mb3JOYW1lKHVzZXJDbGFzcyk7CisgICAgICAgICAgICBkYXRhYmFzZSA9IChVc2VyRGF0YWJhc2UpIGNsYXp6Lm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICBkYXRhYmFzZS5zZXRVc2VyQ29uZmlnKHRoaXMpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgaG9zdC5nZXRMb2dnZXIoKS5lcnJvcihzbS5nZXRTdHJpbmcoInVzZXJDb25maWcuZGF0YWJhc2UiKSwgZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBEZXBsb3kgdGhlIHdlYiBhcHBsaWNhdGlvbiAoaWYgYW55KSBmb3IgZWFjaCBkZWZpbmVkIHVzZXIKKyAgICAgICAgRW51bWVyYXRpb24gdXNlcnMgPSBkYXRhYmFzZS5nZXRVc2VycygpOworICAgICAgICB3aGlsZSAodXNlcnMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgIFN0cmluZyB1c2VyID0gKFN0cmluZykgdXNlcnMubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgIFN0cmluZyBob21lID0gZGF0YWJhc2UuZ2V0SG9tZSh1c2VyKTsKKyAgICAgICAgICAgIGRlcGxveSh1c2VyLCBob21lKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBEZXBsb3kgYSB3ZWIgYXBwbGljYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgdXNlciBpZiB0aGV5IGhhdmUgc3VjaCBhbgorICAgICAqIGFwcGxpY2F0aW9uIGluIHRoZSBkZWZpbmVkIGRpcmVjdG9yeSB3aXRoaW4gdGhlaXIgaG9tZSBkaXJlY3RvcnkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXNlciBVc2VybmFtZSBvd25pbmcgdGhlIGFwcGxpY2F0aW9uIHRvIGJlIGRlcGxveWVkCisgICAgICogQHBhcmFtIGhvbWUgSG9tZSBkaXJlY3Rvcnkgb2YgdGhpcyB1c2VyCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGRlcGxveShTdHJpbmcgdXNlciwgU3RyaW5nIGhvbWUpIHsKKworICAgICAgICAvLyBEb2VzIHRoaXMgdXNlciBoYXZlIGEgd2ViIGFwcGxpY2F0aW9uIHRvIGJlIGRlcGxveWVkPworICAgICAgICBTdHJpbmcgY29udGV4dFBhdGggPSAiL34iICsgdXNlcjsKKyAgICAgICAgaWYgKGhvc3QuZmluZENoaWxkKGNvbnRleHRQYXRoKSAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBGaWxlIGFwcCA9IG5ldyBGaWxlKGhvbWUsIGRpcmVjdG9yeU5hbWUpOworICAgICAgICBpZiAoIWFwcC5leGlzdHMoKSB8fCAhYXBwLmlzRGlyZWN0b3J5KCkpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIC8qCisgICAgICAgIEZpbGUgZGQgPSBuZXcgRmlsZShhcHAsICIvV0VCLUlORi93ZWIueG1sIik7CisgICAgICAgIGlmICghZGQuZXhpc3RzKCkgfHwgIWRkLmlzRmlsZSgpIHx8ICFkZC5jYW5SZWFkKCkpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICovCisgICAgICAgIGhvc3QuZ2V0TG9nZ2VyKCkuaW5mbyhzbS5nZXRTdHJpbmcoInVzZXJDb25maWcuZGVwbG95IiwgdXNlcikpOworCisgICAgICAgIC8vIERlcGxveSB0aGUgd2ViIGFwcGxpY2F0aW9uIGZvciB0aGlzIHVzZXIKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENsYXNzIGNsYXp6ID0gQ2xhc3MuZm9yTmFtZShjb250ZXh0Q2xhc3MpOworICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0ID0KKyAgICAgICAgICAgICAgKENvbnRleHQpIGNsYXp6Lm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICBjb250ZXh0LnNldFBhdGgoY29udGV4dFBhdGgpOworICAgICAgICAgICAgY29udGV4dC5zZXREb2NCYXNlKGFwcC50b1N0cmluZygpKTsKKyAgICAgICAgICAgIGlmIChjb250ZXh0IGluc3RhbmNlb2YgTGlmZWN5Y2xlKSB7CisgICAgICAgICAgICAgICAgY2xhenogPSBDbGFzcy5mb3JOYW1lKGNvbmZpZ0NsYXNzKTsKKyAgICAgICAgICAgICAgICBMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lciA9CisgICAgICAgICAgICAgICAgICAoTGlmZWN5Y2xlTGlzdGVuZXIpIGNsYXp6Lm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICAgICAgKChMaWZlY3ljbGUpIGNvbnRleHQpLmFkZExpZmVjeWNsZUxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGhvc3QuYWRkQ2hpbGQoY29udGV4dCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBob3N0LmdldExvZ2dlcigpLmVycm9yKHNtLmdldFN0cmluZygidXNlckNvbmZpZy5lcnJvciIsIHVzZXIpLCBlKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIGEgInN0YXJ0IiBldmVudCBmb3IgdGhpcyBIb3N0LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzdGFydCgpIHsKKworICAgICAgICBpZiAoaG9zdC5nZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgaG9zdC5nZXRMb2dnZXIoKS5kZWJ1ZyhzbS5nZXRTdHJpbmcoInVzZXJDb25maWcuc3RhcnQiKSk7CisKKyAgICAgICAgZGVwbG95KCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgYSAic3RvcCIgZXZlbnQgZm9yIHRoaXMgSG9zdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc3RvcCgpIHsKKworICAgICAgICBpZiAoaG9zdC5nZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgaG9zdC5nZXRMb2dnZXIoKS5kZWJ1ZyhzbS5nZXRTdHJpbmcoInVzZXJDb25maWcuc3RvcCIpKTsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9Vc2VyRGF0YWJhc2UuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdGFydHVwL1VzZXJEYXRhYmFzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiOWVlZTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9Vc2VyRGF0YWJhc2UuamF2YQpAQCAtMCwwICsxLDY5IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0YXJ0dXA7CisKKworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKKworCisvKioKKyAqIEFic3RyYWN0aW9uIG9mIHRoZSBzZXQgb2YgdXNlcnMgZGVmaW5lZCBieSB0aGUgb3BlcmF0aW5nIHN5c3RlbSBvbiB0aGUKKyAqIGN1cnJlbnQgc2VydmVyIHBsYXRmb3JtLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgaW50ZXJmYWNlIFVzZXJEYXRhYmFzZSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBVc2VyQ29uZmlnIGxpc3RlbmVyIHdpdGggd2hpY2ggd2UgYXJlIGFzc29jaWF0ZWQuCisgICAgICovCisgICAgcHVibGljIFVzZXJDb25maWcgZ2V0VXNlckNvbmZpZygpOworCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIFVzZXJDb25maWcgbGlzdGVuZXIgd2l0aCB3aGljaCB3ZSBhcmUgYXNzb2NpYXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1c2VyQ29uZmlnIFRoZSBuZXcgVXNlckNvbmZpZyBsaXN0ZW5lcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVzZXJDb25maWcoVXNlckNvbmZpZyB1c2VyQ29uZmlnKTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYW4gYWJzb2x1dGUgcGF0aG5hbWUgdG8gdGhlIGhvbWUgZGlyZWN0b3J5IGZvciB0aGUgc3BlY2lmaWVkIHVzZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXNlciBVc2VyIGZvciB3aGljaCBhIGhvbWUgZGlyZWN0b3J5IHNob3VsZCBiZSByZXRyaWV2ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEhvbWUoU3RyaW5nIHVzZXIpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYW4gZW51bWVyYXRpb24gb2YgdGhlIHVzZXJuYW1lcyBkZWZpbmVkIG9uIHRoaXMgc2VydmVyLgorICAgICAqLworICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRVc2VycygpOworCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdGFydHVwL1dlYlJ1bGVTZXQuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdGFydHVwL1dlYlJ1bGVTZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTRhN2QwCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvV2ViUnVsZVNldC5qYXZhCkBAIC0wLDAgKzEsNjE2IEBACisvKgorICogQ29weXJpZ2h0IDE5OTktMjAwMSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cDsKKworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLldyYXBwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuU2VjdXJpdHlDb25zdHJhaW50OworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuZGlnZXN0ZXIuRGlnZXN0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5kaWdlc3Rlci5SdWxlOworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuZGlnZXN0ZXIuUnVsZVNldEJhc2U7CitpbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKKworCisvKioKKyAqIDxwPjxzdHJvbmc+UnVsZVNldDwvc3Ryb25nPiBmb3IgcHJvY2Vzc2luZyB0aGUgY29udGVudHMgb2YgYSB3ZWIgYXBwbGljYXRpb24KKyAqIGRlcGxveW1lbnQgZGVzY3JpcHRvciAoPGNvZGU+L1dFQi1JTkYvd2ViLnhtbDwvY29kZT4pIHJlc291cmNlLjwvcD4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIFdlYlJ1bGVTZXQgZXh0ZW5kcyBSdWxlU2V0QmFzZSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgbWF0Y2hpbmcgcGF0dGVybiBwcmVmaXggdG8gdXNlIGZvciByZWNvZ25pemluZyBvdXIgZWxlbWVudHMuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBwcmVmaXggPSBudWxsOworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFRoZSA8Y29kZT5TZXRTZXNzaW9uQ29uZmlnPC9jb2RlPiBydWxlIHVzZWQgdG8gcGFyc2UgdGhlIHdlYi54bWwKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU2V0U2Vzc2lvbkNvbmZpZyBzZXNzaW9uQ29uZmlnOworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFRoZSA8Y29kZT5TZXRMb2dpbkNvbmZpZzwvY29kZT4gcnVsZSB1c2VkIHRvIHBhcnNlIHRoZSB3ZWIueG1sCisgICAgICovCisgICAgcHJvdGVjdGVkIFNldExvZ2luQ29uZmlnIGxvZ2luQ29uZmlnOworCisgICAgCisgICAgLyoqCisgICAgICogVGhlIDxjb2RlPlNldEpzcENvbmZpZzwvY29kZT4gcnVsZSB1c2VkIHRvIHBhcnNlIHRoZSB3ZWIueG1sCisgICAgICovICAgIAorICAgIHByb3RlY3RlZCBTZXRKc3BDb25maWcganNwQ29uZmlnOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3IKKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGFuIGluc3RhbmNlIG9mIHRoaXMgPGNvZGU+UnVsZVNldDwvY29kZT4gd2l0aCB0aGUgZGVmYXVsdAorICAgICAqIG1hdGNoaW5nIHBhdHRlcm4gcHJlZml4LgorICAgICAqLworICAgIHB1YmxpYyBXZWJSdWxlU2V0KCkgeworCisgICAgICAgIHRoaXMoIiIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYW4gaW5zdGFuY2Ugb2YgdGhpcyA8Y29kZT5SdWxlU2V0PC9jb2RlPiB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBtYXRjaGluZyBwYXR0ZXJuIHByZWZpeC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcmVmaXggUHJlZml4IGZvciBtYXRjaGluZyBwYXR0ZXJuIHJ1bGVzIChpbmNsdWRpbmcgdGhlCisgICAgICogIHRyYWlsaW5nIHNsYXNoIGNoYXJhY3RlcikKKyAgICAgKi8KKyAgICBwdWJsaWMgV2ViUnVsZVNldChTdHJpbmcgcHJlZml4KSB7CisKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgdGhpcy5uYW1lc3BhY2VVUkkgPSBudWxsOworICAgICAgICB0aGlzLnByZWZpeCA9IHByZWZpeDsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIDxwPkFkZCB0aGUgc2V0IG9mIFJ1bGUgaW5zdGFuY2VzIGRlZmluZWQgaW4gdGhpcyBSdWxlU2V0IHRvIHRoZQorICAgICAqIHNwZWNpZmllZCA8Y29kZT5EaWdlc3RlcjwvY29kZT4gaW5zdGFuY2UsIGFzc29jaWF0aW5nIHRoZW0gd2l0aAorICAgICAqIG91ciBuYW1lc3BhY2UgVVJJIChpZiBhbnkpLiAgVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgY2FsbGVkCisgICAgICogYnkgYSBEaWdlc3RlciBpbnN0YW5jZS48L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gZGlnZXN0ZXIgRGlnZXN0ZXIgaW5zdGFuY2UgdG8gd2hpY2ggdGhlIG5ldyBSdWxlIGluc3RhbmNlcworICAgICAqICBzaG91bGQgYmUgYWRkZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkUnVsZUluc3RhbmNlcyhEaWdlc3RlciBkaWdlc3RlcikgeworICAgICAgICBzZXNzaW9uQ29uZmlnID0gbmV3IFNldFNlc3Npb25Db25maWcoKTsKKyAgICAgICAganNwQ29uZmlnID0gbmV3IFNldEpzcENvbmZpZygpOworICAgICAgICBsb2dpbkNvbmZpZyA9IG5ldyBTZXRMb2dpbkNvbmZpZygpOworICAgICAgICAKKyAgICAgICAgZGlnZXN0ZXIuYWRkUnVsZShwcmVmaXggKyAid2ViLWFwcCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNldFB1YmxpY0lkUnVsZSgic2V0UHVibGljSWQiKSk7CisKKyAgICAgICAgZGlnZXN0ZXIuYWRkQ2FsbE1ldGhvZChwcmVmaXggKyAid2ViLWFwcC9jb250ZXh0LXBhcmFtIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWRkUGFyYW1ldGVyIiwgMik7CisgICAgICAgIGRpZ2VzdGVyLmFkZENhbGxQYXJhbShwcmVmaXggKyAid2ViLWFwcC9jb250ZXh0LXBhcmFtL3BhcmFtLW5hbWUiLCAwKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkQ2FsbFBhcmFtKHByZWZpeCArICJ3ZWItYXBwL2NvbnRleHQtcGFyYW0vcGFyYW0tdmFsdWUiLCAxKTsKKworICAgICAgICBkaWdlc3Rlci5hZGRDYWxsTWV0aG9kKHByZWZpeCArICJ3ZWItYXBwL2Rpc3BsYXktbmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldERpc3BsYXlOYW1lIiwgMCk7CisKKyAgICAgICAgZGlnZXN0ZXIuYWRkUnVsZShwcmVmaXggKyAid2ViLWFwcC9kaXN0cmlidXRhYmxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU2V0RGlzdHJpYnV0YWJsZVJ1bGUoKSk7CisKKyAgICAgICAgZGlnZXN0ZXIuYWRkT2JqZWN0Q3JlYXRlKHByZWZpeCArICJ3ZWItYXBwL2VqYi1sb2NhbC1yZWYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkNvbnRleHRMb2NhbEVqYiIpOworICAgICAgICBkaWdlc3Rlci5hZGRSdWxlKHByZWZpeCArICJ3ZWItYXBwL2VqYi1sb2NhbC1yZWYiLAorICAgICAgICAgICAgICAgIG5ldyBTZXROZXh0TmFtaW5nUnVsZSgiYWRkTG9jYWxFamIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5Db250ZXh0TG9jYWxFamIiKSk7CisKKyAgICAgICAgZGlnZXN0ZXIuYWRkQ2FsbE1ldGhvZChwcmVmaXggKyAid2ViLWFwcC9lamItbG9jYWwtcmVmL2Rlc2NyaXB0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0RGVzY3JpcHRpb24iLCAwKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkQ2FsbE1ldGhvZChwcmVmaXggKyAid2ViLWFwcC9lamItbG9jYWwtcmVmL2VqYi1saW5rIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0TGluayIsIDApOworICAgICAgICBkaWdlc3Rlci5hZGRDYWxsTWV0aG9kKHByZWZpeCArICJ3ZWItYXBwL2VqYi1sb2NhbC1yZWYvZWpiLXJlZi1uYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0TmFtZSIsIDApOworICAgICAgICBkaWdlc3Rlci5hZGRDYWxsTWV0aG9kKHByZWZpeCArICJ3ZWItYXBwL2VqYi1sb2NhbC1yZWYvZWpiLXJlZi10eXBlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0VHlwZSIsIDApOworICAgICAgICBkaWdlc3Rlci5hZGRDYWxsTWV0aG9kKHByZWZpeCArICJ3ZWItYXBwL2VqYi1sb2NhbC1yZWYvbG9jYWwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXRMb2NhbCIsIDApOworICAgICAgICBkaWdlc3Rlci5hZGRDYWxsTWV0aG9kKHByZWZpeCArICJ3ZWItYXBwL2VqYi1sb2NhbC1yZWYvbG9jYWwtaG9tZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldEhvbWUiLCAwKTsKKworICAgICAgICBkaWdlc3Rlci5hZGRPYmplY3RDcmVhdGUocHJlZml4ICsgIndlYi1hcHAvZWpiLXJlZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuQ29udGV4dEVqYiIpOworICAgICAgICBkaWdlc3Rlci5hZGRSdWxlKHByZWZpeCArICJ3ZWItYXBwL2VqYi1yZWYiLAorICAgICAgICAgICAgICAgIG5ldyBTZXROZXh0TmFtaW5nUnVsZSgiYWRkRWpiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuQ29udGV4dEVqYiIpKTsKKworICAgICAgICBkaWdlc3Rlci5hZGRDYWxsTWV0aG9kKHByZWZpeCArICJ3ZWItYXBwL2VqYi1yZWYvZGVzY3JpcHRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXREZXNjcmlwdGlvbiIsIDApOworICAgICAgICBkaWdlc3Rlci5hZGRDYWxsTWV0aG9kKHByZWZpeCArICJ3ZWItYXBwL2VqYi1yZWYvZWpiLWxpbmsiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXRMaW5rIiwgMCk7CisgICAgICAgIGRpZ2VzdGVyLmFkZENhbGxNZXRob2QocHJlZml4ICsgIndlYi1hcHAvZWpiLXJlZi9lamItcmVmLW5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXROYW1lIiwgMCk7CisgICAgICAgIGRpZ2VzdGVyLmFkZENhbGxNZXRob2QocHJlZml4ICsgIndlYi1hcHAvZWpiLXJlZi9lamItcmVmLXR5cGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXRUeXBlIiwgMCk7CisgICAgICAgIGRpZ2VzdGVyLmFkZENhbGxNZXRob2QocHJlZml4ICsgIndlYi1hcHAvZWpiLXJlZi9ob21lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0SG9tZSIsIDApOworICAgICAgICBkaWdlc3Rlci5hZGRDYWxsTWV0aG9kKHByZWZpeCArICJ3ZWItYXBwL2VqYi1yZWYvcmVtb3RlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0UmVtb3RlIiwgMCk7CisKKyAgICAgICAgZGlnZXN0ZXIuYWRkT2JqZWN0Q3JlYXRlKHByZWZpeCArICJ3ZWItYXBwL2Vudi1lbnRyeSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuQ29udGV4dEVudmlyb25tZW50Iik7CisgICAgICAgIGRpZ2VzdGVyLmFkZFJ1bGUocHJlZml4ICsgIndlYi1hcHAvZW52LWVudHJ5IiwKKyAgICAgICAgICAgICAgICBuZXcgU2V0TmV4dE5hbWluZ1J1bGUoImFkZEVudmlyb25tZW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuQ29udGV4dEVudmlyb25tZW50IikpOworCisgICAgICAgIGRpZ2VzdGVyLmFkZENhbGxNZXRob2QocHJlZml4ICsgIndlYi1hcHAvZW52LWVudHJ5L2Rlc2NyaXB0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0RGVzY3JpcHRpb24iLCAwKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkQ2FsbE1ldGhvZChwcmVmaXggKyAid2ViLWFwcC9lbnYtZW50cnkvZW52LWVudHJ5LW5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXROYW1lIiwgMCk7CisgICAgICAgIGRpZ2VzdGVyLmFkZENhbGxNZXRob2QocHJlZml4ICsgIndlYi1hcHAvZW52LWVudHJ5L2Vudi1lbnRyeS10eXBlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0VHlwZSIsIDApOworICAgICAgICBkaWdlc3Rlci5hZGRDYWxsTWV0aG9kKHByZWZpeCArICJ3ZWItYXBwL2Vudi1lbnRyeS9lbnYtZW50cnktdmFsdWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXRWYWx1ZSIsIDApOworCisgICAgICAgIGRpZ2VzdGVyLmFkZE9iamVjdENyZWF0ZShwcmVmaXggKyAid2ViLWFwcC9lcnJvci1wYWdlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5FcnJvclBhZ2UiKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkU2V0TmV4dChwcmVmaXggKyAid2ViLWFwcC9lcnJvci1wYWdlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWRkRXJyb3JQYWdlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuRXJyb3JQYWdlIik7CisKKyAgICAgICAgZGlnZXN0ZXIuYWRkQ2FsbE1ldGhvZChwcmVmaXggKyAid2ViLWFwcC9lcnJvci1wYWdlL2Vycm9yLWNvZGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXRFcnJvckNvZGUiLCAwKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkQ2FsbE1ldGhvZChwcmVmaXggKyAid2ViLWFwcC9lcnJvci1wYWdlL2V4Y2VwdGlvbi10eXBlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0RXhjZXB0aW9uVHlwZSIsIDApOworICAgICAgICBkaWdlc3Rlci5hZGRDYWxsTWV0aG9kKHByZWZpeCArICJ3ZWItYXBwL2Vycm9yLXBhZ2UvbG9jYXRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXRMb2NhdGlvbiIsIDApOworCisgICAgICAgIGRpZ2VzdGVyLmFkZE9iamVjdENyZWF0ZShwcmVmaXggKyAid2ViLWFwcC9maWx0ZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkZpbHRlckRlZiIpOworICAgICAgICBkaWdlc3Rlci5hZGRTZXROZXh0KHByZWZpeCArICJ3ZWItYXBwL2ZpbHRlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkZEZpbHRlckRlZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkZpbHRlckRlZiIpOworCisgICAgICAgIGRpZ2VzdGVyLmFkZENhbGxNZXRob2QocHJlZml4ICsgIndlYi1hcHAvZmlsdGVyL2Rlc2NyaXB0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0RGVzY3JpcHRpb24iLCAwKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkQ2FsbE1ldGhvZChwcmVmaXggKyAid2ViLWFwcC9maWx0ZXIvZGlzcGxheS1uYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0RGlzcGxheU5hbWUiLCAwKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkQ2FsbE1ldGhvZChwcmVmaXggKyAid2ViLWFwcC9maWx0ZXIvZmlsdGVyLWNsYXNzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0RmlsdGVyQ2xhc3MiLCAwKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkQ2FsbE1ldGhvZChwcmVmaXggKyAid2ViLWFwcC9maWx0ZXIvZmlsdGVyLW5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXRGaWx0ZXJOYW1lIiwgMCk7CisgICAgICAgIGRpZ2VzdGVyLmFkZENhbGxNZXRob2QocHJlZml4ICsgIndlYi1hcHAvZmlsdGVyL2xhcmdlLWljb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXRMYXJnZUljb24iLCAwKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkQ2FsbE1ldGhvZChwcmVmaXggKyAid2ViLWFwcC9maWx0ZXIvc21hbGwtaWNvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldFNtYWxsSWNvbiIsIDApOworCisgICAgICAgIGRpZ2VzdGVyLmFkZENhbGxNZXRob2QocHJlZml4ICsgIndlYi1hcHAvZmlsdGVyL2luaXQtcGFyYW0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZGRJbml0UGFyYW1ldGVyIiwgMik7CisgICAgICAgIGRpZ2VzdGVyLmFkZENhbGxQYXJhbShwcmVmaXggKyAid2ViLWFwcC9maWx0ZXIvaW5pdC1wYXJhbS9wYXJhbS1uYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgICAgICBkaWdlc3Rlci5hZGRDYWxsUGFyYW0ocHJlZml4ICsgIndlYi1hcHAvZmlsdGVyL2luaXQtcGFyYW0vcGFyYW0tdmFsdWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7CisKKyAgICAgICAgZGlnZXN0ZXIuYWRkT2JqZWN0Q3JlYXRlKHByZWZpeCArICJ3ZWItYXBwL2ZpbHRlci1tYXBwaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5GaWx0ZXJNYXAiKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkU2V0TmV4dChwcmVmaXggKyAid2ViLWFwcC9maWx0ZXItbWFwcGluZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkZEZpbHRlck1hcCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkZpbHRlck1hcCIpOworCisgICAgICAgIGRpZ2VzdGVyLmFkZENhbGxNZXRob2QocHJlZml4ICsgIndlYi1hcHAvZmlsdGVyLW1hcHBpbmcvZmlsdGVyLW5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXRGaWx0ZXJOYW1lIiwgMCk7CisgICAgICAgIGRpZ2VzdGVyLmFkZENhbGxNZXRob2QocHJlZml4ICsgIndlYi1hcHAvZmlsdGVyLW1hcHBpbmcvc2VydmxldC1uYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0U2VydmxldE5hbWUiLCAwKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkQ2FsbE1ldGhvZChwcmVmaXggKyAid2ViLWFwcC9maWx0ZXItbWFwcGluZy91cmwtcGF0dGVybiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldFVSTFBhdHRlcm4iLCAwKTsKKworICAgICAgICBkaWdlc3Rlci5hZGRDYWxsTWV0aG9kKHByZWZpeCArICJ3ZWItYXBwL2ZpbHRlci1tYXBwaW5nL2Rpc3BhdGNoZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXREaXNwYXRjaGVyIiwgMCk7CisKKyAgICAgICAgIGRpZ2VzdGVyLmFkZENhbGxNZXRob2QocHJlZml4ICsgIndlYi1hcHAvbGlzdGVuZXIvbGlzdGVuZXItY2xhc3MiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWRkQXBwbGljYXRpb25MaXN0ZW5lciIsIDApOworICAgICAgICAgCisgICAgICAgIGRpZ2VzdGVyLmFkZFJ1bGUocHJlZml4ICsgIndlYi1hcHAvanNwLWNvbmZpZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAganNwQ29uZmlnKTsKKyAgICAgICAgCisgICAgICAgIGRpZ2VzdGVyLmFkZENhbGxNZXRob2QocHJlZml4ICsgIndlYi1hcHAvanNwLWNvbmZpZy9qc3AtcHJvcGVydHktZ3JvdXAvdXJsLXBhdHRlcm4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZGRKc3BNYXBwaW5nIiwgMCk7CisKKyAgICAgICAgZGlnZXN0ZXIuYWRkQ2FsbE1ldGhvZChwcmVmaXggKyAid2ViLWFwcC9saXN0ZW5lci9saXN0ZW5lci1jbGFzcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkZEFwcGxpY2F0aW9uTGlzdGVuZXIiLCAwKTsKKyAgICAgICAgCisgICAgICAgIGRpZ2VzdGVyLmFkZFJ1bGUocHJlZml4ICsgIndlYi1hcHAvbG9naW4tY29uZmlnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsb2dpbkNvbmZpZyk7CisKKyAgICAgICAgZGlnZXN0ZXIuYWRkT2JqZWN0Q3JlYXRlKHByZWZpeCArICJ3ZWItYXBwL2xvZ2luLWNvbmZpZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuTG9naW5Db25maWciKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkU2V0TmV4dChwcmVmaXggKyAid2ViLWFwcC9sb2dpbi1jb25maWciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXRMb2dpbkNvbmZpZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkxvZ2luQ29uZmlnIik7CisKKyAgICAgICAgZGlnZXN0ZXIuYWRkQ2FsbE1ldGhvZChwcmVmaXggKyAid2ViLWFwcC9sb2dpbi1jb25maWcvYXV0aC1tZXRob2QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXRBdXRoTWV0aG9kIiwgMCk7CisgICAgICAgIGRpZ2VzdGVyLmFkZENhbGxNZXRob2QocHJlZml4ICsgIndlYi1hcHAvbG9naW4tY29uZmlnL3JlYWxtLW5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXRSZWFsbU5hbWUiLCAwKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkQ2FsbE1ldGhvZChwcmVmaXggKyAid2ViLWFwcC9sb2dpbi1jb25maWcvZm9ybS1sb2dpbi1jb25maWcvZm9ybS1lcnJvci1wYWdlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0RXJyb3JQYWdlIiwgMCk7CisgICAgICAgIGRpZ2VzdGVyLmFkZENhbGxNZXRob2QocHJlZml4ICsgIndlYi1hcHAvbG9naW4tY29uZmlnL2Zvcm0tbG9naW4tY29uZmlnL2Zvcm0tbG9naW4tcGFnZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldExvZ2luUGFnZSIsIDApOworCisgICAgICAgIGRpZ2VzdGVyLmFkZENhbGxNZXRob2QocHJlZml4ICsgIndlYi1hcHAvbWltZS1tYXBwaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWRkTWltZU1hcHBpbmciLCAyKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkQ2FsbFBhcmFtKHByZWZpeCArICJ3ZWItYXBwL21pbWUtbWFwcGluZy9leHRlbnNpb24iLCAwKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkQ2FsbFBhcmFtKHByZWZpeCArICJ3ZWItYXBwL21pbWUtbWFwcGluZy9taW1lLXR5cGUiLCAxKTsKKworICAgICAgICBkaWdlc3Rlci5hZGRPYmplY3RDcmVhdGUocHJlZml4ICsgIndlYi1hcHAvcmVzb3VyY2UtZW52LXJlZiIsCisgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuQ29udGV4dFJlc291cmNlRW52UmVmIik7CisgICAgICAgIGRpZ2VzdGVyLmFkZFJ1bGUocHJlZml4ICsgIndlYi1hcHAvcmVzb3VyY2UtZW52LXJlZiIsCisgICAgICAgICAgICAgICAgICAgIG5ldyBTZXROZXh0TmFtaW5nUnVsZSgiYWRkUmVzb3VyY2VFbnZSZWYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkNvbnRleHRSZXNvdXJjZUVudlJlZiIpKTsKKworICAgICAgICBkaWdlc3Rlci5hZGRDYWxsTWV0aG9kKHByZWZpeCArICJ3ZWItYXBwL3Jlc291cmNlLWVudi1yZWYvcmVzb3VyY2UtZW52LXJlZi1uYW1lIiwKKyAgICAgICAgICAgICAgICAic2V0TmFtZSIsIDApOworICAgICAgICBkaWdlc3Rlci5hZGRDYWxsTWV0aG9kKHByZWZpeCArICJ3ZWItYXBwL3Jlc291cmNlLWVudi1yZWYvcmVzb3VyY2UtZW52LXJlZi10eXBlIiwKKyAgICAgICAgICAgICAgICAic2V0VHlwZSIsIDApOworCisgICAgICAgIGRpZ2VzdGVyLmFkZE9iamVjdENyZWF0ZShwcmVmaXggKyAid2ViLWFwcC9tZXNzYWdlLWRlc3RpbmF0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5NZXNzYWdlRGVzdGluYXRpb24iKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkU2V0TmV4dChwcmVmaXggKyAid2ViLWFwcC9tZXNzYWdlLWRlc3RpbmF0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWRkTWVzc2FnZURlc3RpbmF0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuTWVzc2FnZURlc3RpbmF0aW9uIik7CisKKyAgICAgICAgZGlnZXN0ZXIuYWRkQ2FsbE1ldGhvZChwcmVmaXggKyAid2ViLWFwcC9tZXNzYWdlLWRlc3RpbmF0aW9uL2Rlc2NyaXB0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0RGVzY3JpcHRpb24iLCAwKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkQ2FsbE1ldGhvZChwcmVmaXggKyAid2ViLWFwcC9tZXNzYWdlLWRlc3RpbmF0aW9uL2Rpc3BsYXktbmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldERpc3BsYXlOYW1lIiwgMCk7CisgICAgICAgIGRpZ2VzdGVyLmFkZENhbGxNZXRob2QocHJlZml4ICsgIndlYi1hcHAvbWVzc2FnZS1kZXN0aW5hdGlvbi9pY29uL2xhcmdlLWljb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXRMYXJnZUljb24iLCAwKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkQ2FsbE1ldGhvZChwcmVmaXggKyAid2ViLWFwcC9tZXNzYWdlLWRlc3RpbmF0aW9uL2ljb24vc21hbGwtaWNvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldFNtYWxsSWNvbiIsIDApOworICAgICAgICBkaWdlc3Rlci5hZGRDYWxsTWV0aG9kKHByZWZpeCArICJ3ZWItYXBwL21lc3NhZ2UtZGVzdGluYXRpb24vbWVzc2FnZS1kZXN0aW5hdGlvbi1uYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0TmFtZSIsIDApOworCisgICAgICAgIGRpZ2VzdGVyLmFkZE9iamVjdENyZWF0ZShwcmVmaXggKyAid2ViLWFwcC9tZXNzYWdlLWRlc3RpbmF0aW9uLXJlZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuTWVzc2FnZURlc3RpbmF0aW9uUmVmIik7CisgICAgICAgIGRpZ2VzdGVyLmFkZFNldE5leHQocHJlZml4ICsgIndlYi1hcHAvbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZGRNZXNzYWdlRGVzdGluYXRpb25SZWYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5NZXNzYWdlRGVzdGluYXRpb25SZWYiKTsKKworICAgICAgICBkaWdlc3Rlci5hZGRDYWxsTWV0aG9kKHByZWZpeCArICJ3ZWItYXBwL21lc3NhZ2UtZGVzdGluYXRpb24tcmVmL2Rlc2NyaXB0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0RGVzY3JpcHRpb24iLCAwKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkQ2FsbE1ldGhvZChwcmVmaXggKyAid2ViLWFwcC9tZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi9tZXNzYWdlLWRlc3RpbmF0aW9uLWxpbmsiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXRMaW5rIiwgMCk7CisgICAgICAgIGRpZ2VzdGVyLmFkZENhbGxNZXRob2QocHJlZml4ICsgIndlYi1hcHAvbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYvbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldE5hbWUiLCAwKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkQ2FsbE1ldGhvZChwcmVmaXggKyAid2ViLWFwcC9tZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi9tZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXRUeXBlIiwgMCk7CisgICAgICAgIGRpZ2VzdGVyLmFkZENhbGxNZXRob2QocHJlZml4ICsgIndlYi1hcHAvbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYvbWVzc2FnZS1kZXN0aW5hdGlvbi11c2FnZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldFVzYWdlIiwgMCk7CisKKyAgICAgICAgZGlnZXN0ZXIuYWRkT2JqZWN0Q3JlYXRlKHByZWZpeCArICJ3ZWItYXBwL3Jlc291cmNlLXJlZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuQ29udGV4dFJlc291cmNlIik7CisgICAgICAgIGRpZ2VzdGVyLmFkZFJ1bGUocHJlZml4ICsgIndlYi1hcHAvcmVzb3VyY2UtcmVmIiwKKyAgICAgICAgICAgICAgICBuZXcgU2V0TmV4dE5hbWluZ1J1bGUoImFkZFJlc291cmNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuQ29udGV4dFJlc291cmNlIikpOworCisgICAgICAgIGRpZ2VzdGVyLmFkZENhbGxNZXRob2QocHJlZml4ICsgIndlYi1hcHAvcmVzb3VyY2UtcmVmL2Rlc2NyaXB0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0RGVzY3JpcHRpb24iLCAwKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkQ2FsbE1ldGhvZChwcmVmaXggKyAid2ViLWFwcC9yZXNvdXJjZS1yZWYvcmVzLWF1dGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXRBdXRoIiwgMCk7CisgICAgICAgIGRpZ2VzdGVyLmFkZENhbGxNZXRob2QocHJlZml4ICsgIndlYi1hcHAvcmVzb3VyY2UtcmVmL3Jlcy1yZWYtbmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldE5hbWUiLCAwKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkQ2FsbE1ldGhvZChwcmVmaXggKyAid2ViLWFwcC9yZXNvdXJjZS1yZWYvcmVzLXNoYXJpbmctc2NvcGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXRTY29wZSIsIDApOworICAgICAgICBkaWdlc3Rlci5hZGRDYWxsTWV0aG9kKHByZWZpeCArICJ3ZWItYXBwL3Jlc291cmNlLXJlZi9yZXMtdHlwZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldFR5cGUiLCAwKTsKKworICAgICAgICBkaWdlc3Rlci5hZGRPYmplY3RDcmVhdGUocHJlZml4ICsgIndlYi1hcHAvc2VjdXJpdHktY29uc3RyYWludCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuU2VjdXJpdHlDb25zdHJhaW50Iik7CisgICAgICAgIGRpZ2VzdGVyLmFkZFNldE5leHQocHJlZml4ICsgIndlYi1hcHAvc2VjdXJpdHktY29uc3RyYWludCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkZENvbnN0cmFpbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5TZWN1cml0eUNvbnN0cmFpbnQiKTsKKworICAgICAgICBkaWdlc3Rlci5hZGRSdWxlKHByZWZpeCArICJ3ZWItYXBwL3NlY3VyaXR5LWNvbnN0cmFpbnQvYXV0aC1jb25zdHJhaW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU2V0QXV0aENvbnN0cmFpbnRSdWxlKCkpOworICAgICAgICBkaWdlc3Rlci5hZGRDYWxsTWV0aG9kKHByZWZpeCArICJ3ZWItYXBwL3NlY3VyaXR5LWNvbnN0cmFpbnQvYXV0aC1jb25zdHJhaW50L3JvbGUtbmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkZEF1dGhSb2xlIiwgMCk7CisgICAgICAgIGRpZ2VzdGVyLmFkZENhbGxNZXRob2QocHJlZml4ICsgIndlYi1hcHAvc2VjdXJpdHktY29uc3RyYWludC9kaXNwbGF5LW5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXREaXNwbGF5TmFtZSIsIDApOworICAgICAgICBkaWdlc3Rlci5hZGRDYWxsTWV0aG9kKHByZWZpeCArICJ3ZWItYXBwL3NlY3VyaXR5LWNvbnN0cmFpbnQvdXNlci1kYXRhLWNvbnN0cmFpbnQvdHJhbnNwb3J0LWd1YXJhbnRlZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldFVzZXJDb25zdHJhaW50IiwgMCk7CisKKyAgICAgICAgZGlnZXN0ZXIuYWRkT2JqZWN0Q3JlYXRlKHByZWZpeCArICJ3ZWItYXBwL3NlY3VyaXR5LWNvbnN0cmFpbnQvd2ViLXJlc291cmNlLWNvbGxlY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LlNlY3VyaXR5Q29sbGVjdGlvbiIpOworICAgICAgICBkaWdlc3Rlci5hZGRTZXROZXh0KHByZWZpeCArICJ3ZWItYXBwL3NlY3VyaXR5LWNvbnN0cmFpbnQvd2ViLXJlc291cmNlLWNvbGxlY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZGRDb2xsZWN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuU2VjdXJpdHlDb2xsZWN0aW9uIik7CisgICAgICAgIGRpZ2VzdGVyLmFkZENhbGxNZXRob2QocHJlZml4ICsgIndlYi1hcHAvc2VjdXJpdHktY29uc3RyYWludC93ZWItcmVzb3VyY2UtY29sbGVjdGlvbi9odHRwLW1ldGhvZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkZE1ldGhvZCIsIDApOworICAgICAgICBkaWdlc3Rlci5hZGRDYWxsTWV0aG9kKHByZWZpeCArICJ3ZWItYXBwL3NlY3VyaXR5LWNvbnN0cmFpbnQvd2ViLXJlc291cmNlLWNvbGxlY3Rpb24vdXJsLXBhdHRlcm4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZGRQYXR0ZXJuIiwgMCk7CisgICAgICAgIGRpZ2VzdGVyLmFkZENhbGxNZXRob2QocHJlZml4ICsgIndlYi1hcHAvc2VjdXJpdHktY29uc3RyYWludC93ZWItcmVzb3VyY2UtY29sbGVjdGlvbi93ZWItcmVzb3VyY2UtbmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldE5hbWUiLCAwKTsKKworICAgICAgICBkaWdlc3Rlci5hZGRDYWxsTWV0aG9kKHByZWZpeCArICJ3ZWItYXBwL3NlY3VyaXR5LXJvbGUvcm9sZS1uYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWRkU2VjdXJpdHlSb2xlIiwgMCk7CisKKyAgICAgICAgZGlnZXN0ZXIuYWRkUnVsZShwcmVmaXggKyAid2ViLWFwcC9zZXJ2bGV0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgV3JhcHBlckNyZWF0ZVJ1bGUoKSk7CisgICAgICAgIGRpZ2VzdGVyLmFkZFNldE5leHQocHJlZml4ICsgIndlYi1hcHAvc2VydmxldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkZENoaWxkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS5Db250YWluZXIiKTsKKworICAgICAgICBkaWdlc3Rlci5hZGRDYWxsTWV0aG9kKHByZWZpeCArICJ3ZWItYXBwL3NlcnZsZXQvaW5pdC1wYXJhbSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkZEluaXRQYXJhbWV0ZXIiLCAyKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkQ2FsbFBhcmFtKHByZWZpeCArICJ3ZWItYXBwL3NlcnZsZXQvaW5pdC1wYXJhbS9wYXJhbS1uYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgICAgICBkaWdlc3Rlci5hZGRDYWxsUGFyYW0ocHJlZml4ICsgIndlYi1hcHAvc2VydmxldC9pbml0LXBhcmFtL3BhcmFtLXZhbHVlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOworCisgICAgICAgIGRpZ2VzdGVyLmFkZENhbGxNZXRob2QocHJlZml4ICsgIndlYi1hcHAvc2VydmxldC9qc3AtZmlsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldEpzcEZpbGUiLCAwKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkQ2FsbE1ldGhvZChwcmVmaXggKyAid2ViLWFwcC9zZXJ2bGV0L2xvYWQtb24tc3RhcnR1cCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldExvYWRPblN0YXJ0dXBTdHJpbmciLCAwKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkQ2FsbE1ldGhvZChwcmVmaXggKyAid2ViLWFwcC9zZXJ2bGV0L3J1bi1hcy9yb2xlLW5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXRSdW5BcyIsIDApOworCisgICAgICAgIGRpZ2VzdGVyLmFkZENhbGxNZXRob2QocHJlZml4ICsgIndlYi1hcHAvc2VydmxldC9zZWN1cml0eS1yb2xlLXJlZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkZFNlY3VyaXR5UmVmZXJlbmNlIiwgMik7CisgICAgICAgIGRpZ2VzdGVyLmFkZENhbGxQYXJhbShwcmVmaXggKyAid2ViLWFwcC9zZXJ2bGV0L3NlY3VyaXR5LXJvbGUtcmVmL3JvbGUtbGluayIsIDEpOworICAgICAgICBkaWdlc3Rlci5hZGRDYWxsUGFyYW0ocHJlZml4ICsgIndlYi1hcHAvc2VydmxldC9zZWN1cml0eS1yb2xlLXJlZi9yb2xlLW5hbWUiLCAwKTsKKworICAgICAgICBkaWdlc3Rlci5hZGRDYWxsTWV0aG9kKHByZWZpeCArICJ3ZWItYXBwL3NlcnZsZXQvc2VydmxldC1jbGFzcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0U2VydmxldENsYXNzIiwgMCk7CisgICAgICAgIGRpZ2VzdGVyLmFkZENhbGxNZXRob2QocHJlZml4ICsgIndlYi1hcHAvc2VydmxldC9zZXJ2bGV0LW5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldE5hbWUiLCAwKTsKKworICAgICAgICBkaWdlc3Rlci5hZGRDYWxsTWV0aG9kKHByZWZpeCArICJ3ZWItYXBwL3NlcnZsZXQtbWFwcGluZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkZFNlcnZsZXRNYXBwaW5nIiwgMik7CisgICAgICAgIGRpZ2VzdGVyLmFkZENhbGxQYXJhbShwcmVmaXggKyAid2ViLWFwcC9zZXJ2bGV0LW1hcHBpbmcvc2VydmxldC1uYW1lIiwgMSk7CisgICAgICAgIGRpZ2VzdGVyLmFkZENhbGxQYXJhbShwcmVmaXggKyAid2ViLWFwcC9zZXJ2bGV0LW1hcHBpbmcvdXJsLXBhdHRlcm4iLCAwKTsKKworICAgICAgICBkaWdlc3Rlci5hZGRSdWxlKHByZWZpeCArICJ3ZWItYXBwL3Nlc3Npb24tY29uZmlnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uQ29uZmlnKTsKKyAgICAgICAgCisgICAgICAgIGRpZ2VzdGVyLmFkZENhbGxNZXRob2QocHJlZml4ICsgIndlYi1hcHAvc2Vzc2lvbi1jb25maWcvc2Vzc2lvbi10aW1lb3V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0U2Vzc2lvblRpbWVvdXQiLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgSW50ZWdlci5UWVBFIH0pOworICAgICAgICBkaWdlc3Rlci5hZGRDYWxsUGFyYW0ocHJlZml4ICsgIndlYi1hcHAvc2Vzc2lvbi1jb25maWcvc2Vzc2lvbi10aW1lb3V0IiwgMCk7CisKKyAgICAgICAgZGlnZXN0ZXIuYWRkQ2FsbE1ldGhvZChwcmVmaXggKyAid2ViLWFwcC90YWdsaWIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZGRUYWdsaWIiLCAyKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkQ2FsbFBhcmFtKHByZWZpeCArICJ3ZWItYXBwL3RhZ2xpYi90YWdsaWItbG9jYXRpb24iLCAxKTsKKyAgICAgICAgZGlnZXN0ZXIuYWRkQ2FsbFBhcmFtKHByZWZpeCArICJ3ZWItYXBwL3RhZ2xpYi90YWdsaWItdXJpIiwgMCk7CisKKyAgICAgICAgZGlnZXN0ZXIuYWRkQ2FsbE1ldGhvZChwcmVmaXggKyAid2ViLWFwcC93ZWxjb21lLWZpbGUtbGlzdC93ZWxjb21lLWZpbGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZGRXZWxjb21lRmlsZSIsIDApOworCisgICAgICAgIGRpZ2VzdGVyLmFkZENhbGxNZXRob2QocHJlZml4ICsgIndlYi1hcHAvbG9jYWxlLWVuY29kaW5nLW1hcHBpbmctbGlzdC9sb2NhbGUtZW5jb2RpbmctbWFwcGluZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWRkTG9jYWxlRW5jb2RpbmdNYXBwaW5nUGFyYW1ldGVyIiwgMik7CisgICAgICAgIGRpZ2VzdGVyLmFkZENhbGxQYXJhbShwcmVmaXggKyAid2ViLWFwcC9sb2NhbGUtZW5jb2RpbmctbWFwcGluZy1saXN0L2xvY2FsZS1lbmNvZGluZy1tYXBwaW5nL2xvY2FsZSIsIDApOworICAgICAgICBkaWdlc3Rlci5hZGRDYWxsUGFyYW0ocHJlZml4ICsgIndlYi1hcHAvbG9jYWxlLWVuY29kaW5nLW1hcHBpbmctbGlzdC9sb2NhbGUtZW5jb2RpbmctbWFwcGluZy9lbmNvZGluZyIsIDEpOworCisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzZXQgY291bnRlciB1c2VkIGZvciB2YWxpZGF0aW5nIHRoZSB3ZWIueG1sIGZpbGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVjeWNsZSgpeworICAgICAgICBqc3BDb25maWcuaXNKc3BDb25maWdTZXQgPSBmYWxzZTsKKyAgICAgICAgc2Vzc2lvbkNvbmZpZy5pc1Nlc3Npb25Db25maWdTZXQgPSBmYWxzZTsKKyAgICAgICAgbG9naW5Db25maWcuaXNMb2dpbkNvbmZpZ1NldCA9IGZhbHNlOworICAgIH0KK30KKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcml2YXRlIENsYXNzZXMKKworCisvKioKKyAqIFJ1bGUgdG8gY2hlY2sgdGhhdCB0aGUgPGNvZGU+bG9naW4tY29uZmlnPC9jb2RlPiBpcyBvY2N1cmluZyAKKyAqIG9ubHkgMSB0aW1lIHdpdGhpbiB0aGUgd2ViLnhtbAorICovCitmaW5hbCBjbGFzcyBTZXRMb2dpbkNvbmZpZyBleHRlbmRzIFJ1bGUgeworICAgIHByb3RlY3RlZCBib29sZWFuIGlzTG9naW5Db25maWdTZXQgPSBmYWxzZTsKKyAgICBwdWJsaWMgU2V0TG9naW5Db25maWcoKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYmVnaW4oU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChpc0xvZ2luQ29uZmlnU2V0KXsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgICAiPGxvZ2luLWNvbmZpZz4gZWxlbWVudCBpcyBsaW1pdGVkIHRvIDEgb2NjdXJhbmNlIik7CisgICAgICAgIH0KKyAgICAgICAgaXNMb2dpbkNvbmZpZ1NldCA9IHRydWU7CisgICAgfQorCit9CisKKworLyoqCisgKiBSdWxlIHRvIGNoZWNrIHRoYXQgdGhlIDxjb2RlPmpzcC1jb25maWc8L2NvZGU+IGlzIG9jY3VyaW5nIAorICogb25seSAxIHRpbWUgd2l0aGluIHRoZSB3ZWIueG1sCisgKi8KK2ZpbmFsIGNsYXNzIFNldEpzcENvbmZpZyBleHRlbmRzIFJ1bGUgeworICAgIHByb3RlY3RlZCBib29sZWFuIGlzSnNwQ29uZmlnU2V0ID0gZmFsc2U7CisgICAgcHVibGljIFNldEpzcENvbmZpZygpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBiZWdpbihTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGlzSnNwQ29uZmlnU2V0KXsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgICAiPGpzcC1jb25maWc+IGVsZW1lbnQgaXMgbGltaXRlZCB0byAxIG9jY3VyYW5jZSIpOworICAgICAgICB9CisgICAgICAgIGlzSnNwQ29uZmlnU2V0ID0gdHJ1ZTsKKyAgICB9CisKK30KKworCisvKioKKyAqIFJ1bGUgdG8gY2hlY2sgdGhhdCB0aGUgPGNvZGU+c2Vzc2lvbi1jb25maWc8L2NvZGU+IGlzIG9jY3VyaW5nIAorICogb25seSAxIHRpbWUgd2l0aGluIHRoZSB3ZWIueG1sCisgKi8KK2ZpbmFsIGNsYXNzIFNldFNlc3Npb25Db25maWcgZXh0ZW5kcyBSdWxlIHsKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1Nlc3Npb25Db25maWdTZXQgPSBmYWxzZTsKKyAgICBwdWJsaWMgU2V0U2Vzc2lvbkNvbmZpZygpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBiZWdpbihTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGlzU2Vzc2lvbkNvbmZpZ1NldCl7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgIjxzZXNzaW9uLWNvbmZpZz4gZWxlbWVudCBpcyBsaW1pdGVkIHRvIDEgb2NjdXJhbmNlIik7CisgICAgICAgIH0KKyAgICAgICAgaXNTZXNzaW9uQ29uZmlnU2V0ID0gdHJ1ZTsKKyAgICB9CisKK30KKworLyoqCisgKiBBIFJ1bGUgdGhhdCBjYWxscyB0aGUgPGNvZGU+c2V0QXV0aENvbnN0cmFpbnQodHJ1ZSk8L2NvZGU+IG1ldGhvZCBvZgorICogdGhlIHRvcCBpdGVtIG9uIHRoZSBzdGFjaywgd2hpY2ggbXVzdCBiZSBvZiB0eXBlCisgKiA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5TZWN1cml0eUNvbnN0cmFpbnQ8L2NvZGU+LgorICovCisKK2ZpbmFsIGNsYXNzIFNldEF1dGhDb25zdHJhaW50UnVsZSBleHRlbmRzIFJ1bGUgeworCisgICAgcHVibGljIFNldEF1dGhDb25zdHJhaW50UnVsZSgpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBiZWdpbihTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU2VjdXJpdHlDb25zdHJhaW50IHNlY3VyaXR5Q29uc3RyYWludCA9CisgICAgICAgICAgICAoU2VjdXJpdHlDb25zdHJhaW50KSBkaWdlc3Rlci5wZWVrKCk7CisgICAgICAgIHNlY3VyaXR5Q29uc3RyYWludC5zZXRBdXRoQ29uc3RyYWludCh0cnVlKTsKKyAgICAgICAgaWYgKGRpZ2VzdGVyLmdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIGRpZ2VzdGVyLmdldExvZ2dlcigpCisgICAgICAgICAgICAgICAuZGVidWcoIkNhbGxpbmcgU2VjdXJpdHlDb25zdHJhaW50LnNldEF1dGhDb25zdHJhaW50KHRydWUpIik7CisgICAgICAgIH0KKyAgICB9CisKK30KKworCisvKioKKyAqIENsYXNzIHRoYXQgY2FsbHMgPGNvZGU+c2V0RGlzdHJpYnV0YWJsZSh0cnVlKTwvY29kZT4gZm9yIHRoZSB0b3Agb2JqZWN0CisgKiBvbiB0aGUgc3RhY2ssIHdoaWNoIG11c3QgYmUgYSA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRleHQ8L2NvZGU+LgorICovCisKK2ZpbmFsIGNsYXNzIFNldERpc3RyaWJ1dGFibGVSdWxlIGV4dGVuZHMgUnVsZSB7CisKKyAgICBwdWJsaWMgU2V0RGlzdHJpYnV0YWJsZVJ1bGUoKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYmVnaW4oU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIENvbnRleHQgY29udGV4dCA9IChDb250ZXh0KSBkaWdlc3Rlci5wZWVrKCk7CisgICAgICAgIGNvbnRleHQuc2V0RGlzdHJpYnV0YWJsZSh0cnVlKTsKKyAgICAgICAgaWYgKGRpZ2VzdGVyLmdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIGRpZ2VzdGVyLmdldExvZ2dlcigpLmRlYnVnCisgICAgICAgICAgICAgICAoY29udGV4dC5nZXRDbGFzcygpLmdldE5hbWUoKSArICIuc2V0RGlzdHJpYnV0YWJsZSggdHJ1ZSkiKTsKKyAgICAgICAgfQorICAgIH0KKworfQorCisKKy8qKgorICogQ2xhc3MgdGhhdCBjYWxscyBhIHByb3BlcnR5IHNldHRlciBmb3IgdGhlIHRvcCBvYmplY3Qgb24gdGhlIHN0YWNrLAorICogcGFzc2luZyB0aGUgcHVibGljIElEIG9mIHRoZSBlbnRpdHkgd2UgYXJlIGN1cnJlbnRseSBwcm9jZXNzaW5nLgorICovCisKK2ZpbmFsIGNsYXNzIFNldFB1YmxpY0lkUnVsZSBleHRlbmRzIFJ1bGUgeworCisgICAgcHVibGljIFNldFB1YmxpY0lkUnVsZShTdHJpbmcgbWV0aG9kKSB7CisgICAgICAgIHRoaXMubWV0aG9kID0gbWV0aG9kOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIG1ldGhvZCA9IG51bGw7CisKKyAgICBwdWJsaWMgdm9pZCBiZWdpbihTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBDb250ZXh0IGNvbnRleHQgPSAoQ29udGV4dCkgZGlnZXN0ZXIucGVlayhkaWdlc3Rlci5nZXRDb3VudCgpIC0gMSk7CisgICAgICAgIE9iamVjdCB0b3AgPSBkaWdlc3Rlci5wZWVrKCk7CisgICAgICAgIENsYXNzIHBhcmFtQ2xhc3Nlc1tdID0gbmV3IENsYXNzWzFdOworICAgICAgICBwYXJhbUNsYXNzZXNbMF0gPSAiU3RyaW5nIi5nZXRDbGFzcygpOworICAgICAgICBTdHJpbmcgcGFyYW1WYWx1ZXNbXSA9IG5ldyBTdHJpbmdbMV07CisgICAgICAgIHBhcmFtVmFsdWVzWzBdID0gZGlnZXN0ZXIuZ2V0UHVibGljSWQoKTsKKworICAgICAgICBNZXRob2QgbSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtID0gdG9wLmdldENsYXNzKCkuZ2V0TWV0aG9kKG1ldGhvZCwgcGFyYW1DbGFzc2VzKTsKKyAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGRpZ2VzdGVyLmdldExvZ2dlcigpLmVycm9yKCJDYW4ndCBmaW5kIG1ldGhvZCAiICsgbWV0aG9kICsgIiBpbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHRvcCArICIgQ0xBU1MgIiArIHRvcC5nZXRDbGFzcygpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIG0uaW52b2tlKHRvcCwgcGFyYW1WYWx1ZXMpOworICAgICAgICBpZiAoZGlnZXN0ZXIuZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGRpZ2VzdGVyLmdldExvZ2dlcigpLmRlYnVnKCIiICsgdG9wLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIi4iIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtZXRob2QgKyAiKCIgKyBwYXJhbVZhbHVlc1swXSArICIpIik7CisKKyAgICB9CisKK30KKworCisvKioKKyAqIEEgUnVsZSB0aGF0IGNhbGxzIHRoZSBmYWN0b3J5IG1ldGhvZCBvbiB0aGUgc3BlY2lmaWVkIENvbnRleHQgdG8KKyAqIGNyZWF0ZSB0aGUgb2JqZWN0IHRoYXQgaXMgdG8gYmUgYWRkZWQgdG8gdGhlIHN0YWNrLgorICovCisKK2ZpbmFsIGNsYXNzIFdyYXBwZXJDcmVhdGVSdWxlIGV4dGVuZHMgUnVsZSB7CisKKyAgICBwdWJsaWMgV3JhcHBlckNyZWF0ZVJ1bGUoKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYmVnaW4oU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIENvbnRleHQgY29udGV4dCA9CisgICAgICAgICAgICAoQ29udGV4dCkgZGlnZXN0ZXIucGVlayhkaWdlc3Rlci5nZXRDb3VudCgpIC0gMSk7CisgICAgICAgIFdyYXBwZXIgd3JhcHBlciA9IGNvbnRleHQuY3JlYXRlV3JhcHBlcigpOworICAgICAgICBkaWdlc3Rlci5wdXNoKHdyYXBwZXIpOworICAgICAgICBpZiAoZGlnZXN0ZXIuZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGRpZ2VzdGVyLmdldExvZ2dlcigpLmRlYnVnKCJuZXcgIiArIHdyYXBwZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGVuZChTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbmFtZSkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFdyYXBwZXIgd3JhcHBlciA9IChXcmFwcGVyKSBkaWdlc3Rlci5wb3AoKTsKKyAgICAgICAgaWYgKGRpZ2VzdGVyLmdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBkaWdlc3Rlci5nZXRMb2dnZXIoKS5kZWJ1ZygicG9wICIgKyB3cmFwcGVyLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdGFydHVwL2NhdGFsaW5hLnByb3BlcnRpZXMgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9jYXRhbGluYS5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1MzI5NGQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvc3RhcnR1cC9jYXRhbGluYS5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNTcgQEAKKyMKKyMgTGlzdCBvZiBjb21tYS1zZXBhcmF0ZWQgcGFja2FnZXMgdGhhdCBzdGFydCB3aXRoIG9yIGVxdWFsIHRoaXMgc3RyaW5nCisjIHdpbGwgY2F1c2UgYSBzZWN1cml0eSBleGNlcHRpb24gdG8gYmUgdGhyb3duIHdoZW4KKyMgcGFzc2VkIHRvIGNoZWNrUGFja2FnZUFjY2VzcyB1bmxlc3MgdGhlCisjIGNvcnJlc3BvbmRpbmcgUnVudGltZVBlcm1pc3Npb24gKCJhY2Nlc3NDbGFzc0luUGFja2FnZS4iK3BhY2thZ2UpIGhhcworIyBiZWVuIGdyYW50ZWQuCitwYWNrYWdlLmFjY2Vzcz1zdW4uLG9yZy5hcGFjaGUuY2F0YWxpbmEuLG9yZy5hcGFjaGUuY295b3RlLixvcmcuYXBhY2hlLnRvbWNhdC4sb3JnLmFwYWNoZS5qYXNwZXIuLHN1bi5iZWFucy4KKyMKKyMgTGlzdCBvZiBjb21tYS1zZXBhcmF0ZWQgcGFja2FnZXMgdGhhdCBzdGFydCB3aXRoIG9yIGVxdWFsIHRoaXMgc3RyaW5nCisjIHdpbGwgY2F1c2UgYSBzZWN1cml0eSBleGNlcHRpb24gdG8gYmUgdGhyb3duIHdoZW4KKyMgcGFzc2VkIHRvIGNoZWNrUGFja2FnZURlZmluaXRpb24gdW5sZXNzIHRoZQorIyBjb3JyZXNwb25kaW5nIFJ1bnRpbWVQZXJtaXNzaW9uICgiZGVmaW5lQ2xhc3NJblBhY2thZ2UuIitwYWNrYWdlKSBoYXMKKyMgYmVlbiBncmFudGVkLgorIworIyBieSBkZWZhdWx0LCBubyBwYWNrYWdlcyBhcmUgcmVzdHJpY3RlZCBmb3IgZGVmaW5pdGlvbiwgYW5kIG5vbmUgb2YKKyMgdGhlIGNsYXNzIGxvYWRlcnMgc3VwcGxpZWQgd2l0aCB0aGUgSkRLIGNhbGwgY2hlY2tQYWNrYWdlRGVmaW5pdGlvbi4KKyMKK3BhY2thZ2UuZGVmaW5pdGlvbj1zdW4uLGphdmEuLG9yZy5hcGFjaGUuY2F0YWxpbmEuLG9yZy5hcGFjaGUuY295b3RlLixvcmcuYXBhY2hlLnRvbWNhdC4sb3JnLmFwYWNoZS5qYXNwZXIuCisKKyMKKyMKKyMgTGlzdCBvZiBjb21tYS1zZXBhcmF0ZWQgcGF0aHMgZGVmaW5pbmcgdGhlIGNvbnRlbnRzIG9mIHRoZSAiY29tbW9uIiAKKyMgY2xhc3Nsb2FkZXIuIFByZWZpeGVzIHNob3VsZCBiZSB1c2VkIHRvIGRlZmluZSB3aGF0IGlzIHRoZSByZXBvc2l0b3J5IHR5cGUuCisjIFBhdGggbWF5IGJlIHJlbGF0aXZlIHRvIHRoZSBDQVRBTElOQV9IT01FIG9yIENBVEFMSU5BX0JBU0UgcGF0aCBvciBhYnNvbHV0ZS4KKyMgSWYgbGVmdCBhcyBibGFuayx0aGUgSlZNIHN5c3RlbSBsb2FkZXIgd2lsbCBiZSB1c2VkIGFzIENhdGFsaW5hJ3MgImNvbW1vbiIgCisjIGxvYWRlci4KKyMgRXhhbXBsZXM6CisjICAgICAiZm9vIjogQWRkIHRoaXMgZm9sZGVyIGFzIGEgY2xhc3MgcmVwb3NpdG9yeQorIyAgICAgImZvby8qLmphciI6IEFkZCBhbGwgdGhlIEpBUnMgb2YgdGhlIHNwZWNpZmllZCBmb2xkZXIgYXMgY2xhc3MgCisjICAgICAgICAgICAgICAgICAgcmVwb3NpdG9yaWVzCisjICAgICAiZm9vL2Jhci5qYXIiOiBBZGQgYmFyLmphciBhcyBhIGNsYXNzIHJlcG9zaXRvcnkKK2NvbW1vbi5sb2FkZXI9JHtjYXRhbGluYS5ob21lfS9jb21tb24vY2xhc3Nlcywke2NhdGFsaW5hLmhvbWV9L2NvbW1vbi9pMThuLyouamFyLCR7Y2F0YWxpbmEuaG9tZX0vY29tbW9uL2VuZG9yc2VkLyouamFyLCR7Y2F0YWxpbmEuaG9tZX0vY29tbW9uL2xpYi8qLmphcgorCisjCisjIExpc3Qgb2YgY29tbWEtc2VwYXJhdGVkIHBhdGhzIGRlZmluaW5nIHRoZSBjb250ZW50cyBvZiB0aGUgInNlcnZlciIgCisjIGNsYXNzbG9hZGVyLiBQcmVmaXhlcyBzaG91bGQgYmUgdXNlZCB0byBkZWZpbmUgd2hhdCBpcyB0aGUgcmVwb3NpdG9yeSB0eXBlLgorIyBQYXRoIG1heSBiZSByZWxhdGl2ZSB0byB0aGUgQ0FUQUxJTkFfSE9NRSBvciBDQVRBTElOQV9CQVNFIHBhdGggb3IgYWJzb2x1dGUuCisjIElmIGxlZnQgYXMgYmxhbmssIHRoZSAiY29tbW9uIiBsb2FkZXIgd2lsbCBiZSB1c2VkIGFzIENhdGFsaW5hJ3MgInNlcnZlciIgCisjIGxvYWRlci4KKyMgRXhhbXBsZXM6CisjICAgICAiZm9vIjogQWRkIHRoaXMgZm9sZGVyIGFzIGEgY2xhc3MgcmVwb3NpdG9yeQorIyAgICAgImZvby8qLmphciI6IEFkZCBhbGwgdGhlIEpBUnMgb2YgdGhlIHNwZWNpZmllZCBmb2xkZXIgYXMgY2xhc3MgCisjICAgICAgICAgICAgICAgICAgcmVwb3NpdG9yaWVzCisjICAgICAiZm9vL2Jhci5qYXIiOiBBZGQgYmFyLmphciBhcyBhIGNsYXNzIHJlcG9zaXRvcnkKK3NlcnZlci5sb2FkZXI9JHtjYXRhbGluYS5ob21lfS9zZXJ2ZXIvY2xhc3Nlcywke2NhdGFsaW5hLmhvbWV9L3NlcnZlci9saWIvKi5qYXIKKworIworIyBMaXN0IG9mIGNvbW1hLXNlcGFyYXRlZCBwYXRocyBkZWZpbmluZyB0aGUgY29udGVudHMgb2YgdGhlICJzaGFyZWQiIAorIyBjbGFzc2xvYWRlci4gUHJlZml4ZXMgc2hvdWxkIGJlIHVzZWQgdG8gZGVmaW5lIHdoYXQgaXMgdGhlIHJlcG9zaXRvcnkgdHlwZS4KKyMgUGF0aCBtYXkgYmUgcmVsYXRpdmUgdG8gdGhlIENBVEFMSU5BX0JBU0UgcGF0aCBvciBhYnNvbHV0ZS4gSWYgbGVmdCBhcyBibGFuaywKKyMgdGhlICJjb21tb24iIGxvYWRlciB3aWxsIGJlIHVzZWQgYXMgQ2F0YWxpbmEncyAic2hhcmVkIiBsb2FkZXIuCisjIEV4YW1wbGVzOgorIyAgICAgImZvbyI6IEFkZCB0aGlzIGZvbGRlciBhcyBhIGNsYXNzIHJlcG9zaXRvcnkKKyMgICAgICJmb28vKi5qYXIiOiBBZGQgYWxsIHRoZSBKQVJzIG9mIHRoZSBzcGVjaWZpZWQgZm9sZGVyIGFzIGNsYXNzIAorIyAgICAgICAgICAgICAgICAgIHJlcG9zaXRvcmllcworIyAgICAgImZvby9iYXIuamFyIjogQWRkIGJhci5qYXIgYXMgYSBjbGFzcyByZXBvc2l0b3J5IAorc2hhcmVkLmxvYWRlcj0ke2NhdGFsaW5hLmJhc2V9L3NoYXJlZC9jbGFzc2VzLCR7Y2F0YWxpbmEuYmFzZX0vc2hhcmVkL2xpYi8qLmphcgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3N0YXJ0dXAvbWJlYW5zLWRlc2NyaXB0b3JzLnhtbCBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdGFydHVwL21iZWFucy1kZXNjcmlwdG9ycy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQyODNjNAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9zdGFydHVwL21iZWFucy1kZXNjcmlwdG9ycy54bWwKQEAgLTAsMCArMSwxMTEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPG1iZWFucy1kZXNjcmlwdG9ycz4KKworICA8bWJlYW4gbmFtZT0iQ29udGV4dENvbmZpZyIKKyAgICAgICAgIGRlc2NyaXB0aW9uPSJTdGFydHVwIGV2ZW50IGxpc3RlbmVyIGZvciBhIENvbnRleHQgdGhhdCBjb25maWd1cmVzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoYXQgQ29udGV4dCwgYW5kIHRoZSBhc3NvY2lhdGVkIGRlZmluZWQgc2VydmxldHMiCisgICAgICAgICBkb21haW49IkNhdGFsaW5hIgorICAgICAgICAgZ3JvdXA9Ikxpc3RlbmVyIgorICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5zdGFydHVwLkNvbnRleHRDb25maWciPgorICAgIAorICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NOYW1lIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IkZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBtYW5hZ2VkIG9iamVjdCIKKyAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisgICAgICAKKyAgPC9tYmVhbj4KKworICA8bWJlYW4gbmFtZT0iRW5naW5lQ29uZmlnIgorICAgICAgICAgZGVzY3JpcHRpb249IlN0YXJ0dXAgZXZlbnQgbGlzdGVuZXIgZm9yIGEgRW5naW5lIHRoYXQgY29uZmlndXJlcyB0aGUgcHJvcGVydGllcyBvZiB0aGF0IEVuZ2luZSwgYW5kIHRoZSBhc3NvY2lhdGVkIGRlZmluZWQgY29udGV4dHMiCisgICAgICAgICBkb21haW49IkNhdGFsaW5hIgorICAgICAgICAgZ3JvdXA9Ikxpc3RlbmVyIgorICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5zdGFydHVwLkVuZ2luZUNvbmZpZyI+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzTmFtZSIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJGdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgbWFuYWdlZCBvYmplY3QiCisgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorICAgICAgCisgIDwvbWJlYW4+CisKKworICA8bWJlYW4gbmFtZT0iSG9zdENvbmZpZyIKKyAgICAgICAgIGRlc2NyaXB0aW9uPSJTdGFydHVwIGV2ZW50IGxpc3RlbmVyIGZvciBhIEhvc3QgdGhhdCBjb25maWd1cmVzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoYXQgSG9zdCwgYW5kIHRoZSBhc3NvY2lhdGVkIGRlZmluZWQgY29udGV4dHMiCisgICAgICAgICBkb21haW49IkNhdGFsaW5hIgorICAgICAgICAgZ3JvdXA9Ikxpc3RlbmVyIgorICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5zdGFydHVwLkhvc3RDb25maWciPgorICAgIAorICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NOYW1lIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IkZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBtYW5hZ2VkIG9iamVjdCIKKyAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9ImNvbmZpZ0Jhc2VOYW1lIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBiYXNlIGRpcmVjdG9yeSBmb3IgQ29udGV4dCBjb25maWd1cmF0aW9uIGZpbGVzIgorICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiIC8+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9ImNvbmZpZ0NsYXNzIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBKYXZhIGNsYXNzIG5hbWUgb2YgdGhlIENvbnRleHQgY29uZmlndXJhdGlvbiBjbGFzcyB3ZSBzaG91bGQgdXNlIgorICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb250ZXh0Q2xhc3MiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIEphdmEgY2xhc3MgbmFtZSBvZiB0aGUgQ29udGV4dCBpbXBsZW1lbnRhdGlvbiB3ZSBzaG91bGQgdXNlIgorICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgICAgCisgICAgPG9wZXJhdGlvbiBuYW1lPSJjaGVjayIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDaGVjayBhIHdlYiBhcHBsaWNhdGlvbiBuYW1lIGZvciB1cGRhdGVzIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgICAgICByZXR1cm5UeXBlPSJ2b2lkIj4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0ibmFtZSIKKyAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IkFwcGxpY2F0aW9uIG5hbWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICA8L29wZXJhdGlvbj4KKworICAgIDxvcGVyYXRpb24gbmFtZT0iYWRkU2VydmljZWQiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iQWRkIGEgd2ViIGFwcGxpY2F0aW9uIG5hbWUgdG8gdGhlIHNlcnZpY2VkIGxpc3QiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJuYW1lIgorICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iQXBwbGljYXRpb24gbmFtZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgIDwvb3BlcmF0aW9uPgorCisgICAgPG9wZXJhdGlvbiBuYW1lPSJpc1NlcnZpY2VkIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IkFkZCBhIHdlYiBhcHBsaWNhdGlvbiBuYW1lIHRvIHRoZSBzZXJ2aWNlZCBsaXN0IgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgICAgICByZXR1cm5UeXBlPSJib29sZWFuIj4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0ibmFtZSIKKyAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IkFwcGxpY2F0aW9uIG5hbWUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICA8L29wZXJhdGlvbj4KKworICAgIDxvcGVyYXRpb24gbmFtZT0ibWFuYWdlQXBwIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IkFkZCBhIHdlYiBhcHBsaWNhdGlvbiBtYW5hZ2VkIGV4dGVybmFsbHkiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0IgorICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ29udGV4dCB0byBhZGQiCisgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGV4dCIgLz4KKyAgICA8L29wZXJhdGlvbj4KKworICAgIDxvcGVyYXRpb24gbmFtZT0icmVtb3ZlU2VydmljZWQiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iQWRkIGEgd2ViIGFwcGxpY2F0aW9uIG5hbWUgdG8gdGhlIHNlcnZpY2VkIGxpc3QiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJuYW1lIgorICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iQXBwbGljYXRpb24gbmFtZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgIDwvb3BlcmF0aW9uPgorCisgICAgPG9wZXJhdGlvbiBuYW1lPSJ1bm1hbmFnZUFwcCIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJSZW1vdmUgYSB3ZWIgYXBwbGljYXRpb24gZnJvbSBjaGVja3MiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0UGF0aCIKKyAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBhcHBsaWNhdGlvbiBwYXRoIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiAvPgorICAgIDwvb3BlcmF0aW9uPgorCisgIDwvbWJlYW4+CisKKzwvbWJlYW5zLWRlc2NyaXB0b3JzPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3VzZXJzL0Fic3RyYWN0R3JvdXAuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91c2Vycy9BYnN0cmFjdEdyb3VwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTAyMTJjMgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91c2Vycy9BYnN0cmFjdEdyb3VwLmphdmEKQEAgLTAsMCArMSwxNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudXNlcnM7CisKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuR3JvdXA7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Sb2xlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuVXNlckRhdGFiYXNlOworCisKKy8qKgorICogPHA+Q29udmVuaWVuY2UgYmFzZSBjbGFzcyBmb3Ige0BsaW5rIEdyb3VwfSBpbXBsZW1lbnRhdGlvbnMuPC9wPgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqIEBzaW5jZSA0LjEKKyAqLworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RHcm91cCBpbXBsZW1lbnRzIEdyb3VwIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGlzIGdyb3VwLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb24gPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZ3JvdXAgbmFtZSBvZiB0aGlzIGdyb3VwLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ3JvdXBuYW1lID0gbnVsbDsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZGVzY3JpcHRpb24gb2YgdGhpcyBncm91cC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5kZXNjcmlwdGlvbik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZGVzY3JpcHRpb24gb2YgdGhpcyBncm91cC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZXNjcmlwdGlvbiBUaGUgbmV3IGRlc2NyaXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7CisKKyAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGdyb3VwIG5hbWUgb2YgdGhpcyBncm91cCwgd2hpY2ggbXVzdCBiZSB1bmlxdWUKKyAgICAgKiB3aXRoaW4gdGhlIHNjb3BlIG9mIGEge0BsaW5rIFVzZXJEYXRhYmFzZX0uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRHcm91cG5hbWUoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLmdyb3VwbmFtZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZ3JvdXAgbmFtZSBvZiB0aGlzIGdyb3VwLCB3aGljaCBtdXN0IGJlIHVuaXF1ZQorICAgICAqIHdpdGhpbiB0aGUgc2NvcGUgb2YgYSB7QGxpbmsgVXNlckRhdGFiYXNlfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBncm91cG5hbWUgVGhlIG5ldyBncm91cCBuYW1lCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0R3JvdXBuYW1lKFN0cmluZyBncm91cG5hbWUpIHsKKworICAgICAgICB0aGlzLmdyb3VwbmFtZSA9IGdyb3VwbmFtZTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXQgb2Yge0BsaW5rIFJvbGV9cyBhc3NpZ25lZCBzcGVjaWZpY2FsbHkgdG8gdGhpcyBncm91cC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgSXRlcmF0b3IgZ2V0Um9sZXMoKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB7QGxpbmsgVXNlckRhdGFiYXNlfSB3aXRoaW4gd2hpY2ggdGhpcyBHcm91cCBpcyBkZWZpbmVkLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBVc2VyRGF0YWJhc2UgZ2V0VXNlckRhdGFiYXNlKCk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhbiBJdGVyYXRvciBvdmVyIHRoZSBzZXQgb2Yge0BsaW5rIG9yZy5hcGFjaGUuY2F0YWxpbmEuVXNlcn1zIHRoYXQgCisgICAgICogYXJlIG1lbWJlcnMgb2YgdGhpcyBncm91cC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgSXRlcmF0b3IgZ2V0VXNlcnMoKTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIEFkZCBhIG5ldyB7QGxpbmsgUm9sZX0gdG8gdGhvc2UgYXNzaWduZWQgc3BlY2lmaWNhbGx5IHRvIHRoaXMgZ3JvdXAuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcm9sZSBUaGUgbmV3IHJvbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBhZGRSb2xlKFJvbGUgcm9sZSk7CisKKworICAgIC8qKgorICAgICAqIElzIHRoaXMgZ3JvdXAgc3BlY2lmaWNhbGx5IGFzc2lnbmVkIHRoZSBzcGVjaWZpZWQge0BsaW5rIFJvbGV9PworICAgICAqCisgICAgICogQHBhcmFtIHJvbGUgVGhlIHJvbGUgdG8gY2hlY2sKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0luUm9sZShSb2xlIHJvbGUpOworCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSB7QGxpbmsgUm9sZX0gZnJvbSB0aG9zZSBhc3NpZ25lZCB0byB0aGlzIGdyb3VwLgorICAgICAqCisgICAgICogQHBhcmFtIHJvbGUgVGhlIG9sZCByb2xlCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgcmVtb3ZlUm9sZShSb2xlIHJvbGUpOworCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYWxsIHtAbGluayBSb2xlfXMgZnJvbSB0aG9zZSBhc3NpZ25lZCB0byB0aGlzIGdyb3VwLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlbW92ZVJvbGVzKCk7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcmluY2lwYWwgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBNYWtlIHRoZSBwcmluY2lwYWwgbmFtZSB0aGUgc2FtZSBhcyB0aGUgZ3JvdXAgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisKKyAgICAgICAgcmV0dXJuIChnZXRHcm91cG5hbWUoKSk7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3VzZXJzL0Fic3RyYWN0Um9sZS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3VzZXJzL0Fic3RyYWN0Um9sZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzYWQyYTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXNlcnMvQWJzdHJhY3RSb2xlLmphdmEKQEAgLTAsMCArMSwxMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudXNlcnM7CisKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuUm9sZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlVzZXJEYXRhYmFzZTsKKworCisvKioKKyAqIDxwPkNvbnZlbmllbmNlIGJhc2UgY2xhc3MgZm9yIHtAbGluayBSb2xlfSBpbXBsZW1lbnRhdGlvbnMuPC9wPgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqIEBzaW5jZSA0LjEKKyAqLworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RSb2xlIGltcGxlbWVudHMgUm9sZSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhpcyBSb2xlLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb24gPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgcm9sZSBuYW1lIG9mIHRoaXMgUm9sZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHJvbGVuYW1lID0gbnVsbDsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZGVzY3JpcHRpb24gb2YgdGhpcyByb2xlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLmRlc2NyaXB0aW9uKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBkZXNjcmlwdGlvbiBvZiB0aGlzIHJvbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gVGhlIG5ldyBkZXNjcmlwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgeworCisgICAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSByb2xlIG5hbWUgb2YgdGhpcyByb2xlLCB3aGljaCBtdXN0IGJlIHVuaXF1ZQorICAgICAqIHdpdGhpbiB0aGUgc2NvcGUgb2YgYSB7QGxpbmsgVXNlckRhdGFiYXNlfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFJvbGVuYW1lKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5yb2xlbmFtZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcm9sZSBuYW1lIG9mIHRoaXMgcm9sZSwgd2hpY2ggbXVzdCBiZSB1bmlxdWUKKyAgICAgKiB3aXRoaW4gdGhlIHNjb3BlIG9mIGEge0BsaW5rIFVzZXJEYXRhYmFzZX0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcm9sZW5hbWUgVGhlIG5ldyByb2xlIG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSb2xlbmFtZShTdHJpbmcgcm9sZW5hbWUpIHsKKworICAgICAgICB0aGlzLnJvbGVuYW1lID0gcm9sZW5hbWU7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUge0BsaW5rIFVzZXJEYXRhYmFzZX0gd2l0aGluIHdoaWNoIHRoaXMgUm9sZSBpcyBkZWZpbmVkLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBVc2VyRGF0YWJhc2UgZ2V0VXNlckRhdGFiYXNlKCk7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJpbmNpcGFsIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogTWFrZSB0aGUgcHJpbmNpcGFsIG5hbWUgdGhlIHNhbWUgYXMgdGhlIHJvbGUgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisKKyAgICAgICAgcmV0dXJuIChnZXRSb2xlbmFtZSgpKTsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXNlcnMvQWJzdHJhY3RVc2VyLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXNlcnMvQWJzdHJhY3RVc2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdiZWFlMgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91c2Vycy9BYnN0cmFjdFVzZXIuamF2YQpAQCAtMCwwICsxLDIyNCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS51c2VyczsKKworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuR3JvdXA7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Sb2xlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuVXNlcjsKKworCisvKioKKyAqIDxwPkNvbnZlbmllbmNlIGJhc2UgY2xhc3MgZm9yIHtAbGluayBVc2VyfSBpbXBsZW1lbnRhdGlvbnMuPC9wPgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqIEBzaW5jZSA0LjEKKyAqLworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RVc2VyIGltcGxlbWVudHMgVXNlciB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZnVsbCBuYW1lIG9mIHRoaXMgdXNlci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGZ1bGxOYW1lID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIGxvZ29uIHBhc3N3b3JkIG9mIHRoaXMgdXNlci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHBhc3N3b3JkID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIGxvZ29uIHVzZXJuYW1lIG9mIHRoaXMgdXNlci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHVzZXJuYW1lID0gbnVsbDsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZnVsbCBuYW1lIG9mIHRoaXMgdXNlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEZ1bGxOYW1lKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5mdWxsTmFtZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZnVsbCBuYW1lIG9mIHRoaXMgdXNlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmdWxsTmFtZSBUaGUgbmV3IGZ1bGwgbmFtZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZ1bGxOYW1lKFN0cmluZyBmdWxsTmFtZSkgeworCisgICAgICAgIHRoaXMuZnVsbE5hbWUgPSBmdWxsTmFtZTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXQgb2Yge0BsaW5rIEdyb3VwfXMgdG8gd2hpY2ggdGhpcyB1c2VyIGJlbG9uZ3MuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IEl0ZXJhdG9yIGdldEdyb3VwcygpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGxvZ29uIHBhc3N3b3JkIG9mIHRoaXMgdXNlciwgb3B0aW9uYWxseSBwcmVmaXhlZCB3aXRoIHRoZQorICAgICAqIGlkZW50aWZpZXIgb2YgYW4gZW5jb2Rpbmcgc2NoZW1lIHN1cnJvdW5kZWQgYnkgY3VybHkgYnJhY2VzLCBzdWNoIGFzCisgICAgICogPGNvZGU+e21kNX14eHh4eDwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRQYXNzd29yZCgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMucGFzc3dvcmQpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGxvZ29uIHBhc3N3b3JkIG9mIHRoaXMgdXNlciwgb3B0aW9uYWxseSBwcmVmaXhlZCB3aXRoIHRoZQorICAgICAqIGlkZW50aWZpZXIgb2YgYW4gZW5jb2Rpbmcgc2NoZW1lIHN1cnJvdW5kZWQgYnkgY3VybHkgYnJhY2VzLCBzdWNoIGFzCisgICAgICogPGNvZGU+e21kNX14eHh4eDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFzc3dvcmQgVGhlIG5ldyBsb2dvbiBwYXNzd29yZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkKFN0cmluZyBwYXNzd29yZCkgeworCisgICAgICAgIHRoaXMucGFzc3dvcmQgPSBwYXNzd29yZDsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXQgb2Yge0BsaW5rIFJvbGV9cyBhc3NpZ25lZCBzcGVjaWZpY2FsbHkgdG8gdGhpcyB1c2VyLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBJdGVyYXRvciBnZXRSb2xlcygpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGxvZ29uIHVzZXJuYW1lIG9mIHRoaXMgdXNlciwgd2hpY2ggbXVzdCBiZSB1bmlxdWUKKyAgICAgKiB3aXRoaW4gdGhlIHNjb3BlIG9mIGEge0BsaW5rIG9yZy5hcGFjaGUuY2F0YWxpbmEuVXNlckRhdGFiYXNlfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFVzZXJuYW1lKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy51c2VybmFtZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbG9nb24gdXNlcm5hbWUgb2YgdGhpcyB1c2VyLCB3aGljaCBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4KKyAgICAgKiB0aGUgc2NvcGUgb2YgYSB7QGxpbmsgb3JnLmFwYWNoZS5jYXRhbGluYS5Vc2VyRGF0YWJhc2V9LgorICAgICAqCisgICAgICogQHBhcmFtIHVzZXJuYW1lIFRoZSBuZXcgbG9nb24gdXNlcm5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVc2VybmFtZShTdHJpbmcgdXNlcm5hbWUpIHsKKworICAgICAgICB0aGlzLnVzZXJuYW1lID0gdXNlcm5hbWU7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBuZXcge0BsaW5rIEdyb3VwfSB0byB0aG9zZSB0aGlzIHVzZXIgYmVsb25ncyB0by4KKyAgICAgKgorICAgICAqIEBwYXJhbSBncm91cCBUaGUgbmV3IGdyb3VwCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgYWRkR3JvdXAoR3JvdXAgZ3JvdXApOworCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBuZXcge0BsaW5rIFJvbGV9IHRvIHRob3NlIGFzc2lnbmVkIHNwZWNpZmljYWxseSB0byB0aGlzIHVzZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcm9sZSBUaGUgbmV3IHJvbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBhZGRSb2xlKFJvbGUgcm9sZSk7CisKKworICAgIC8qKgorICAgICAqIElzIHRoaXMgdXNlciBpbiB0aGUgc3BlY2lmaWVkIHtAbGluayBHcm91cH0/CisgICAgICoKKyAgICAgKiBAcGFyYW0gZ3JvdXAgVGhlIGdyb3VwIHRvIGNoZWNrCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNJbkdyb3VwKEdyb3VwIGdyb3VwKTsKKworCisgICAgLyoqCisgICAgICogSXMgdGhpcyB1c2VyIHNwZWNpZmljYWxseSBhc3NpZ25lZCB0aGUgc3BlY2lmaWVkIHtAbGluayBSb2xlfT8gIFRoaXMKKyAgICAgKiBtZXRob2QgZG9lcyA8c3Ryb25nPk5PVDwvc3Ryb25nPiBjaGVjayBmb3Igcm9sZXMgaW5oZXJpdGVkIGJhc2VkIG9uCisgICAgICoge0BsaW5rIEdyb3VwfSBtZW1iZXJzaGlwLgorICAgICAqCisgICAgICogQHBhcmFtIHJvbGUgVGhlIHJvbGUgdG8gY2hlY2sKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0luUm9sZShSb2xlIHJvbGUpOworCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSB7QGxpbmsgR3JvdXB9IGZyb20gdGhvc2UgdGhpcyB1c2VyIGJlbG9uZ3MgdG8uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZ3JvdXAgVGhlIG9sZCBncm91cAorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlbW92ZUdyb3VwKEdyb3VwIGdyb3VwKTsKKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGFsbCB7QGxpbmsgR3JvdXB9cyBmcm9tIHRob3NlIHRoaXMgdXNlciBiZWxvbmdzIHRvLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlbW92ZUdyb3VwcygpOworCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSB7QGxpbmsgUm9sZX0gZnJvbSB0aG9zZSBhc3NpZ25lZCB0byB0aGlzIHVzZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcm9sZSBUaGUgb2xkIHJvbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCByZW1vdmVSb2xlKFJvbGUgcm9sZSk7CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhbGwge0BsaW5rIFJvbGV9cyBmcm9tIHRob3NlIGFzc2lnbmVkIHRvIHRoaXMgdXNlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCByZW1vdmVSb2xlcygpOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJpbmNpcGFsIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogTWFrZSB0aGUgcHJpbmNpcGFsIG5hbWUgdGhlIHNhbWUgYXMgdGhlIGdyb3VwIG5hbWUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCisgICAgICAgIHJldHVybiAoZ2V0VXNlcm5hbWUoKSk7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3VzZXJzL0NvbnN0YW50cy5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3VzZXJzL0NvbnN0YW50cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzNmJjMGMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXNlcnMvQ29uc3RhbnRzLmphdmEKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS51c2VyczsKKworCisvKioKKyAqIE1hbmlmZXN0IGNvbnN0YW50cyBmb3IgdGhpcyBKYXZhIHBhY2thZ2UuCisgKgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqIEBzaW5jZSA0LjEKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgQ29uc3RhbnRzIHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBhY2thZ2UgPSAib3JnLmFwYWNoZS5jYXRhbGluYS51c2VycyI7CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91c2Vycy9Mb2NhbFN0cmluZ3MucHJvcGVydGllcyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91c2Vycy9Mb2NhbFN0cmluZ3MucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjczZjViCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3VzZXJzL0xvY2FsU3RyaW5ncy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNCBAQAorbWVtb3J5VXNlckRhdGFiYXNlLmludmFsaWRHcm91cD1JbnZhbGlkIGdyb3VwIG5hbWUgezB9CittZW1vcnlVc2VyRGF0YWJhc2UucmVuYW1lT2xkPUNhbm5vdCByZW5hbWUgb3JpZ2luYWwgZmlsZSB0byB7MH0KK21lbW9yeVVzZXJEYXRhYmFzZS5yZW5hbWVOZXc9Q2Fubm90IHJlbmFtZSBuZXcgZmlsZSB0byB7MH0KK21lbW9yeVVzZXJEYXRhYmFzZS53cml0ZUV4Y2VwdGlvbj1JT0V4Y2VwdGlvbiB3cml0aW5nIHRvIHswfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3VzZXJzL0xvY2FsU3RyaW5nc19lcy5wcm9wZXJ0aWVzIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3VzZXJzL0xvY2FsU3RyaW5nc19lcy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyMWU2ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXNlcnMvTG9jYWxTdHJpbmdzX2VzLnByb3BlcnRpZXMKQEAgLTAsMCArMSw0IEBACittZW1vcnlVc2VyRGF0YWJhc2UuaW52YWxpZEdyb3VwPU5vbWJyZSBkZSBncnVwbyB7MH0gaW524WxpZG8KK21lbW9yeVVzZXJEYXRhYmFzZS5yZW5hbWVPbGQ9SW1wb3NpYmxlIGRlIHJlbm9tYnJhciBlbCBhcmNoaXZvIG9yaWdpbmFsIGEgezB9CittZW1vcnlVc2VyRGF0YWJhc2UucmVuYW1lTmV3PUltcG9zaWJsZSBkZSByZW5vbWJyYXIgZWwgYXJjaGl2byBudWV2byBhIHswfQorbWVtb3J5VXNlckRhdGFiYXNlLndyaXRlRXhjZXB0aW9uPUlPRXhjZXB0aW9uIGR1cmFudGUgbGEgZXNjcml0dXJhIGhhY2lhIHswfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3VzZXJzL0xvY2FsU3RyaW5nc19mci5wcm9wZXJ0aWVzIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3VzZXJzL0xvY2FsU3RyaW5nc19mci5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiMjg3MjgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXNlcnMvTG9jYWxTdHJpbmdzX2ZyLnByb3BlcnRpZXMKQEAgLTAsMCArMSw0IEBACittZW1vcnlVc2VyRGF0YWJhc2UuaW52YWxpZEdyb3VwPU5vbSBkZSBncm91cGUgaW52YWxpZGUgezB9CittZW1vcnlVc2VyRGF0YWJhc2UucmVuYW1lT2xkPUltcG9zc2libGUgZGUgcmVub21tZXIgbGUgZmljaGllciBvcmlnaW5hbCBlbiB7MH0KK21lbW9yeVVzZXJEYXRhYmFzZS5yZW5hbWVOZXc9SW1wb3NzaWJsZSBkZSByZW5vbW1lciBsZSBub3V2ZWF1IGZpY2hpZXIgZW4gezB9CittZW1vcnlVc2VyRGF0YWJhc2Uud3JpdGVFeGNlcHRpb249SU9FeGNlcHRpb24gbG9ycyBkZSBsJyfpY3JpdHVyZSB2ZXJzIHswfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3VzZXJzL0xvY2FsU3RyaW5nc19qYS5wcm9wZXJ0aWVzIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3VzZXJzL0xvY2FsU3RyaW5nc19qYS5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhZTk2ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXNlcnMvTG9jYWxTdHJpbmdzX2phLnByb3BlcnRpZXMKQEAgLTAsMCArMSw0IEBACittZW1vcnlVc2VyRGF0YWJhc2UuaW52YWxpZEdyb3VwPVx1NzEyMVx1NTJiOVx1MzA2YVx1MzBiMFx1MzBlYlx1MzBmY1x1MzBkN1x1NTQwZCB7MH0KK21lbW9yeVVzZXJEYXRhYmFzZS5yZW5hbWVPbGQ9XHU1MTQzXHUzMDZlXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHU1NDBkXHUzMDkyIHswfSBcdTMwNmJcdTU5MDlcdTY2ZjRcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMKK21lbW9yeVVzZXJEYXRhYmFzZS5yZW5hbWVOZXc9XHU2NWIwXHUzMDU3XHUzMDQ0XHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHU1NDBkXHUzMDkyIHswfSBcdTMwNmJcdTU5MDlcdTY2ZjRcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMKK21lbW9yeVVzZXJEYXRhYmFzZS53cml0ZUV4Y2VwdGlvbj17MH0gXHUzMDZiXHU2NmY4XHUzMDRkXHU4ZmJjXHUzMDdmXHU0ZTJkXHUzMDZlSU9FeGNlcHRpb25cdTMwNjdcdTMwNTkKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91c2Vycy9NZW1vcnlHcm91cC5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3VzZXJzL01lbW9yeUdyb3VwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBhZDJkNAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91c2Vycy9NZW1vcnlHcm91cC5qYXZhCkBAIC0wLDAgKzEsMjEzIEBACisvKgorICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnVzZXJzOworCisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuUm9sZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlVzZXJEYXRhYmFzZTsKKworCisvKioKKyAqIDxwPkNvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBvcmcuYXBhY2hlLmNhdGFsaW5hLkdyb3VwfSBmb3IgdGhlCisgKiB7QGxpbmsgTWVtb3J5VXNlckRhdGFiYXNlfSBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgVXNlckRhdGFiYXNlfS48L3A+CisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICogQHNpbmNlIDQuMQorICovCisKK3B1YmxpYyBjbGFzcyBNZW1vcnlHcm91cCBleHRlbmRzIEFic3RyYWN0R3JvdXAgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgLyoqCisgICAgICogUGFja2FnZS1wcml2YXRlIGNvbnN0cnVjdG9yIHVzZWQgYnkgdGhlIGZhY3RvcnkgbWV0aG9kIGluCisgICAgICoge0BsaW5rIE1lbW9yeVVzZXJEYXRhYmFzZX0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGF0YWJhc2UgVGhlIHtAbGluayBNZW1vcnlVc2VyRGF0YWJhc2V9IHRoYXQgb3ducyB0aGlzIGdyb3VwCisgICAgICogQHBhcmFtIGdyb3VwbmFtZSBHcm91cCBuYW1lIG9mIHRoaXMgZ3JvdXAKKyAgICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gRGVzY3JpcHRpb24gb2YgdGhpcyBncm91cAorICAgICAqLworICAgIE1lbW9yeUdyb3VwKE1lbW9yeVVzZXJEYXRhYmFzZSBkYXRhYmFzZSwKKyAgICAgICAgICAgICAgICBTdHJpbmcgZ3JvdXBuYW1lLCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKKworICAgICAgICBzdXBlcigpOworICAgICAgICB0aGlzLmRhdGFiYXNlID0gZGF0YWJhc2U7CisgICAgICAgIHNldEdyb3VwbmFtZShncm91cG5hbWUpOworICAgICAgICBzZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUge0BsaW5rIE1lbW9yeVVzZXJEYXRhYmFzZX0gdGhhdCBvd25zIHRoaXMgZ3JvdXAuCisgICAgICovCisgICAgcHJvdGVjdGVkIE1lbW9yeVVzZXJEYXRhYmFzZSBkYXRhYmFzZSA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzZXQgb2Yge0BsaW5rIFJvbGV9cyBhc3NvY2lhdGVkIHdpdGggdGhpcyBncm91cC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQXJyYXlMaXN0IHJvbGVzID0gbmV3IEFycmF5TGlzdCgpOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXQgb2Yge0BsaW5rIFJvbGV9cyBhc3NpZ25lZCBzcGVjaWZpY2FsbHkgdG8gdGhpcyBncm91cC4KKyAgICAgKi8KKyAgICBwdWJsaWMgSXRlcmF0b3IgZ2V0Um9sZXMoKSB7CisKKyAgICAgICAgc3luY2hyb25pemVkIChyb2xlcykgeworICAgICAgICAgICAgcmV0dXJuIChyb2xlcy5pdGVyYXRvcigpKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHtAbGluayBVc2VyRGF0YWJhc2V9IHdpdGhpbiB3aGljaCB0aGlzIEdyb3VwIGlzIGRlZmluZWQuCisgICAgICovCisgICAgcHVibGljIFVzZXJEYXRhYmFzZSBnZXRVc2VyRGF0YWJhc2UoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLmRhdGFiYXNlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXQgb2Yge0BsaW5rIG9yZy5hcGFjaGUuY2F0YWxpbmEuVXNlcn1zIHRoYXQgYXJlIG1lbWJlcnMgb2YgdGhpcyBncm91cC4KKyAgICAgKi8KKyAgICBwdWJsaWMgSXRlcmF0b3IgZ2V0VXNlcnMoKSB7CisKKyAgICAgICAgQXJyYXlMaXN0IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIEl0ZXJhdG9yIHVzZXJzID0gZGF0YWJhc2UuZ2V0VXNlcnMoKTsKKyAgICAgICAgd2hpbGUgKHVzZXJzLmhhc05leHQoKSkgeworICAgICAgICAgICAgTWVtb3J5VXNlciB1c2VyID0gKE1lbW9yeVVzZXIpIHVzZXJzLm5leHQoKTsKKyAgICAgICAgICAgIGlmICh1c2VyLmlzSW5Hcm91cCh0aGlzKSkgeworICAgICAgICAgICAgICAgIHJlc3VsdHMuYWRkKHVzZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAocmVzdWx0cy5pdGVyYXRvcigpKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIEFkZCBhIG5ldyB7QGxpbmsgUm9sZX0gdG8gdGhvc2UgYXNzaWduZWQgc3BlY2lmaWNhbGx5IHRvIHRoaXMgZ3JvdXAuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcm9sZSBUaGUgbmV3IHJvbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRSb2xlKFJvbGUgcm9sZSkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAocm9sZXMpIHsKKyAgICAgICAgICAgIGlmICghcm9sZXMuY29udGFpbnMocm9sZSkpIHsKKyAgICAgICAgICAgICAgICByb2xlcy5hZGQocm9sZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogSXMgdGhpcyBncm91cCBzcGVjaWZpY2FsbHkgYXNzaWduZWQgdGhlIHNwZWNpZmllZCB7QGxpbmsgUm9sZX0/CisgICAgICoKKyAgICAgKiBAcGFyYW0gcm9sZSBUaGUgcm9sZSB0byBjaGVjaworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzSW5Sb2xlKFJvbGUgcm9sZSkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAocm9sZXMpIHsKKyAgICAgICAgICAgIHJldHVybiAocm9sZXMuY29udGFpbnMocm9sZSkpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhIHtAbGluayBSb2xlfSBmcm9tIHRob3NlIGFzc2lnbmVkIHRvIHRoaXMgZ3JvdXAuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcm9sZSBUaGUgb2xkIHJvbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVSb2xlKFJvbGUgcm9sZSkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAocm9sZXMpIHsKKyAgICAgICAgICAgIHJvbGVzLnJlbW92ZShyb2xlKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYWxsIHtAbGluayBSb2xlfXMgZnJvbSB0aG9zZSBhc3NpZ25lZCB0byB0aGlzIGdyb3VwLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVJvbGVzKCkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAocm9sZXMpIHsKKyAgICAgICAgICAgIHJvbGVzLmNsZWFyKCk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogPHA+UmV0dXJuIGEgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgZ3JvdXAgaW4gWE1MIGZvcm1hdC48L3A+CisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCI8Z3JvdXAgZ3JvdXBuYW1lPVwiIik7CisgICAgICAgIHNiLmFwcGVuZChncm91cG5hbWUpOworICAgICAgICBzYi5hcHBlbmQoIlwiIik7CisgICAgICAgIGlmIChkZXNjcmlwdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiBkZXNjcmlwdGlvbj1cIiIpOworICAgICAgICAgICAgc2IuYXBwZW5kKGRlc2NyaXB0aW9uKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiXCIiKTsKKyAgICAgICAgfQorICAgICAgICBzeW5jaHJvbml6ZWQgKHJvbGVzKSB7CisgICAgICAgICAgICBpZiAocm9sZXMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiIHJvbGVzPVwiIik7CisgICAgICAgICAgICAgICAgaW50IG4gPSAwOworICAgICAgICAgICAgICAgIEl0ZXJhdG9yIHZhbHVlcyA9IHJvbGVzLml0ZXJhdG9yKCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKHZhbHVlcy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG4gPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJywnKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBuKys7CisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgoU3RyaW5nKSAoKFJvbGUpIHZhbHVlcy5uZXh0KCkpLmdldFJvbGVuYW1lKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIlwiIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc2IuYXBwZW5kKCIvPiIpOworICAgICAgICByZXR1cm4gKHNiLnRvU3RyaW5nKCkpOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91c2Vycy9NZW1vcnlSb2xlLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXNlcnMvTWVtb3J5Um9sZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmMDI0MjIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXNlcnMvTWVtb3J5Um9sZS5qYXZhCkBAIC0wLDAgKzEsMTAyIEBACisvKgorICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnVzZXJzOworCisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlVzZXJEYXRhYmFzZTsKKworCisvKioKKyAqIDxwPkNvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBvcmcuYXBhY2hlLmNhdGFsaW5hLlJvbGV9IGZvciB0aGUKKyAqIHtAbGluayBNZW1vcnlVc2VyRGF0YWJhc2V9IGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBVc2VyRGF0YWJhc2V9LjwvcD4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKiBAc2luY2UgNC4xCisgKi8KKworcHVibGljIGNsYXNzIE1lbW9yeVJvbGUgZXh0ZW5kcyBBYnN0cmFjdFJvbGUgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgLyoqCisgICAgICogUGFja2FnZS1wcml2YXRlIGNvbnN0cnVjdG9yIHVzZWQgYnkgdGhlIGZhY3RvcnkgbWV0aG9kIGluCisgICAgICoge0BsaW5rIE1lbW9yeVVzZXJEYXRhYmFzZX0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGF0YWJhc2UgVGhlIHtAbGluayBNZW1vcnlVc2VyRGF0YWJhc2V9IHRoYXQgb3ducyB0aGlzIHJvbGUKKyAgICAgKiBAcGFyYW0gcm9sZW5hbWUgUm9sZSBuYW1lIG9mIHRoaXMgcm9sZQorICAgICAqIEBwYXJhbSBkZXNjcmlwdGlvbiBEZXNjcmlwdGlvbiBvZiB0aGlzIHJvbGUKKyAgICAgKi8KKyAgICBNZW1vcnlSb2xlKE1lbW9yeVVzZXJEYXRhYmFzZSBkYXRhYmFzZSwKKyAgICAgICAgICAgICAgIFN0cmluZyByb2xlbmFtZSwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7CisKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgdGhpcy5kYXRhYmFzZSA9IGRhdGFiYXNlOworICAgICAgICBzZXRSb2xlbmFtZShyb2xlbmFtZSk7CisgICAgICAgIHNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSB7QGxpbmsgTWVtb3J5VXNlckRhdGFiYXNlfSB0aGF0IG93bnMgdGhpcyByb2xlLgorICAgICAqLworICAgIHByb3RlY3RlZCBNZW1vcnlVc2VyRGF0YWJhc2UgZGF0YWJhc2UgPSBudWxsOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB7QGxpbmsgVXNlckRhdGFiYXNlfSB3aXRoaW4gd2hpY2ggdGhpcyByb2xlIGlzIGRlZmluZWQuCisgICAgICovCisgICAgcHVibGljIFVzZXJEYXRhYmFzZSBnZXRVc2VyRGF0YWJhc2UoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLmRhdGFiYXNlKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIDxwPlJldHVybiBhIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHJvbGUgaW4gWE1MIGZvcm1hdC48L3A+CisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCI8cm9sZSByb2xlbmFtZT1cIiIpOworICAgICAgICBzYi5hcHBlbmQocm9sZW5hbWUpOworICAgICAgICBzYi5hcHBlbmQoIlwiIik7CisgICAgICAgIGlmIChkZXNjcmlwdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiBkZXNjcmlwdGlvbj1cIiIpOworICAgICAgICAgICAgc2IuYXBwZW5kKGRlc2NyaXB0aW9uKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiXCIiKTsKKyAgICAgICAgfQorICAgICAgICBzYi5hcHBlbmQoIi8+Iik7CisgICAgICAgIHJldHVybiAoc2IudG9TdHJpbmcoKSk7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3VzZXJzL01lbW9yeVVzZXIuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91c2Vycy9NZW1vcnlVc2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJiMmYxNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91c2Vycy9NZW1vcnlVc2VyLmphdmEKQEAgLTAsMCArMSwyOTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudXNlcnM7CisKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Hcm91cDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlJvbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Vc2VyRGF0YWJhc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLlJlcXVlc3RVdGlsOworCisvKioKKyAqIDxwPkNvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBvcmcuYXBhY2hlLmNhdGFsaW5hLlVzZXJ9IGZvciB0aGUKKyAqIHtAbGluayBNZW1vcnlVc2VyRGF0YWJhc2V9IGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBVc2VyRGF0YWJhc2V9LjwvcD4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKiBAc2luY2UgNC4xCisgKi8KKworcHVibGljIGNsYXNzIE1lbW9yeVVzZXIgZXh0ZW5kcyBBYnN0cmFjdFVzZXIgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgLyoqCisgICAgICogUGFja2FnZS1wcml2YXRlIGNvbnN0cnVjdG9yIHVzZWQgYnkgdGhlIGZhY3RvcnkgbWV0aG9kIGluCisgICAgICoge0BsaW5rIE1lbW9yeVVzZXJEYXRhYmFzZX0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGF0YWJhc2UgVGhlIHtAbGluayBNZW1vcnlVc2VyRGF0YWJhc2V9IHRoYXQgb3ducyB0aGlzIHVzZXIKKyAgICAgKiBAcGFyYW0gdXNlcm5hbWUgTG9nb24gdXNlcm5hbWUgb2YgdGhlIG5ldyB1c2VyCisgICAgICogQHBhcmFtIHBhc3N3b3JkIExvZ29uIHBhc3N3b3JkIG9mIHRoZSBuZXcgdXNlcgorICAgICAqIEBwYXJhbSBmdWxsTmFtZSBGdWxsIG5hbWUgb2YgdGhlIG5ldyB1c2VyCisgICAgICovCisgICAgTWVtb3J5VXNlcihNZW1vcnlVc2VyRGF0YWJhc2UgZGF0YWJhc2UsIFN0cmluZyB1c2VybmFtZSwKKyAgICAgICAgICAgICAgIFN0cmluZyBwYXNzd29yZCwgU3RyaW5nIGZ1bGxOYW1lKSB7CisKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgdGhpcy5kYXRhYmFzZSA9IGRhdGFiYXNlOworICAgICAgICBzZXRVc2VybmFtZSh1c2VybmFtZSk7CisgICAgICAgIHNldFBhc3N3b3JkKHBhc3N3b3JkKTsKKyAgICAgICAgc2V0RnVsbE5hbWUoZnVsbE5hbWUpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIHtAbGluayBNZW1vcnlVc2VyRGF0YWJhc2V9IHRoYXQgb3ducyB0aGlzIHVzZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIE1lbW9yeVVzZXJEYXRhYmFzZSBkYXRhYmFzZSA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzZXQgb2Yge0BsaW5rIEdyb3VwfXMgdGhhdCB0aGlzIHVzZXIgaXMgYSBtZW1iZXIgb2YuCisgICAgICovCisgICAgcHJvdGVjdGVkIEFycmF5TGlzdCBncm91cHMgPSBuZXcgQXJyYXlMaXN0KCk7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzZXQgb2Yge0BsaW5rIFJvbGV9cyBhc3NvY2lhdGVkIHdpdGggdGhpcyB1c2VyLgorICAgICAqLworICAgIHByb3RlY3RlZCBBcnJheUxpc3Qgcm9sZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNldCBvZiB7QGxpbmsgR3JvdXB9cyB0byB3aGljaCB0aGlzIHVzZXIgYmVsb25ncy4KKyAgICAgKi8KKyAgICBwdWJsaWMgSXRlcmF0b3IgZ2V0R3JvdXBzKCkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAoZ3JvdXBzKSB7CisgICAgICAgICAgICByZXR1cm4gKGdyb3Vwcy5pdGVyYXRvcigpKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNldCBvZiB7QGxpbmsgUm9sZX1zIGFzc2lnbmVkIHNwZWNpZmljYWxseSB0byB0aGlzIHVzZXIuCisgICAgICovCisgICAgcHVibGljIEl0ZXJhdG9yIGdldFJvbGVzKCkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAocm9sZXMpIHsKKyAgICAgICAgICAgIHJldHVybiAocm9sZXMuaXRlcmF0b3IoKSk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB7QGxpbmsgVXNlckRhdGFiYXNlfSB3aXRoaW4gd2hpY2ggdGhpcyBVc2VyIGlzIGRlZmluZWQuCisgICAgICovCisgICAgcHVibGljIFVzZXJEYXRhYmFzZSBnZXRVc2VyRGF0YWJhc2UoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLmRhdGFiYXNlKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIEFkZCBhIG5ldyB7QGxpbmsgR3JvdXB9IHRvIHRob3NlIHRoaXMgdXNlciBiZWxvbmdzIHRvLgorICAgICAqCisgICAgICogQHBhcmFtIGdyb3VwIFRoZSBuZXcgZ3JvdXAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRHcm91cChHcm91cCBncm91cCkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAoZ3JvdXBzKSB7CisgICAgICAgICAgICBpZiAoIWdyb3Vwcy5jb250YWlucyhncm91cCkpIHsKKyAgICAgICAgICAgICAgICBncm91cHMuYWRkKGdyb3VwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBuZXcge0BsaW5rIFJvbGV9IHRvIHRob3NlIGFzc2lnbmVkIHNwZWNpZmljYWxseSB0byB0aGlzIHVzZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcm9sZSBUaGUgbmV3IHJvbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRSb2xlKFJvbGUgcm9sZSkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAocm9sZXMpIHsKKyAgICAgICAgICAgIGlmICghcm9sZXMuY29udGFpbnMocm9sZSkpIHsKKyAgICAgICAgICAgICAgICByb2xlcy5hZGQocm9sZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogSXMgdGhpcyB1c2VyIGluIHRoZSBzcGVjaWZpZWQgZ3JvdXA/CisgICAgICoKKyAgICAgKiBAcGFyYW0gZ3JvdXAgVGhlIGdyb3VwIHRvIGNoZWNrCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNJbkdyb3VwKEdyb3VwIGdyb3VwKSB7CisKKyAgICAgICAgc3luY2hyb25pemVkIChncm91cHMpIHsKKyAgICAgICAgICAgIHJldHVybiAoZ3JvdXBzLmNvbnRhaW5zKGdyb3VwKSk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogSXMgdGhpcyB1c2VyIHNwZWNpZmljYWxseSBhc3NpZ25lZCB0aGUgc3BlY2lmaWVkIHtAbGluayBSb2xlfT8gIFRoaXMKKyAgICAgKiBtZXRob2QgZG9lcyA8c3Ryb25nPk5PVDwvc3Ryb25nPiBjaGVjayBmb3Igcm9sZXMgaW5oZXJpdGVkIGJhc2VkIG9uCisgICAgICoge0BsaW5rIEdyb3VwfSBtZW1iZXJzaGlwLgorICAgICAqCisgICAgICogQHBhcmFtIHJvbGUgVGhlIHJvbGUgdG8gY2hlY2sKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0luUm9sZShSb2xlIHJvbGUpIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKHJvbGVzKSB7CisgICAgICAgICAgICByZXR1cm4gKHJvbGVzLmNvbnRhaW5zKHJvbGUpKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSB7QGxpbmsgR3JvdXB9IGZyb20gdGhvc2UgdGhpcyB1c2VyIGJlbG9uZ3MgdG8uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZ3JvdXAgVGhlIG9sZCBncm91cAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUdyb3VwKEdyb3VwIGdyb3VwKSB7CisKKyAgICAgICAgc3luY2hyb25pemVkIChncm91cHMpIHsKKyAgICAgICAgICAgIGdyb3Vwcy5yZW1vdmUoZ3JvdXApOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhbGwge0BsaW5rIEdyb3VwfXMgZnJvbSB0aG9zZSB0aGlzIHVzZXIgYmVsb25ncyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVHcm91cHMoKSB7CisKKyAgICAgICAgc3luY2hyb25pemVkIChncm91cHMpIHsKKyAgICAgICAgICAgIGdyb3Vwcy5jbGVhcigpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhIHtAbGluayBSb2xlfSBmcm9tIHRob3NlIGFzc2lnbmVkIHRvIHRoaXMgdXNlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSByb2xlIFRoZSBvbGQgcm9sZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVJvbGUoUm9sZSByb2xlKSB7CisKKyAgICAgICAgc3luY2hyb25pemVkIChyb2xlcykgeworICAgICAgICAgICAgcm9sZXMucmVtb3ZlKHJvbGUpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhbGwge0BsaW5rIFJvbGV9cyBmcm9tIHRob3NlIGFzc2lnbmVkIHRvIHRoaXMgdXNlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVSb2xlcygpIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKHJvbGVzKSB7CisgICAgICAgICAgICByb2xlcy5jbGVhcigpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIDxwPlJldHVybiBhIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHVzZXIgaW4gWE1MIGZvcm1hdC48L3A+CisgICAgICoKKyAgICAgKiA8cD48c3Ryb25nPklNUExFTUVOVEFUSU9OIE5PVEU8L3N0cm9uZz4gLSBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksCisgICAgICogdGhlIHJlYWRlciB0aGF0IHByb2Nlc3NlcyB0aGlzIGVudHJ5IHdpbGwgYWNjZXB0IGVpdGhlcgorICAgICAqIDxjb2RlPnVzZXJuYW1lPC9jb2RlPiBvciA8L2NvZGU+bmFtZTwvY29kZT4gZm9yIHRoZSB1c2VybmFtZQorICAgICAqIHByb3BlcnR5LjwvcD4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIjx1c2VyIHVzZXJuYW1lPVwiIik7CisgICAgICAgIHNiLmFwcGVuZChSZXF1ZXN0VXRpbC5maWx0ZXIodXNlcm5hbWUpKTsKKyAgICAgICAgc2IuYXBwZW5kKCJcIiBwYXNzd29yZD1cIiIpOworICAgICAgICBzYi5hcHBlbmQoUmVxdWVzdFV0aWwuZmlsdGVyKHBhc3N3b3JkKSk7CisgICAgICAgIHNiLmFwcGVuZCgiXCIiKTsKKyAgICAgICAgaWYgKGZ1bGxOYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiIGZ1bGxOYW1lPVwiIik7CisgICAgICAgICAgICBzYi5hcHBlbmQoUmVxdWVzdFV0aWwuZmlsdGVyKGZ1bGxOYW1lKSk7CisgICAgICAgICAgICBzYi5hcHBlbmQoIlwiIik7CisgICAgICAgIH0KKyAgICAgICAgc3luY2hyb25pemVkIChncm91cHMpIHsKKyAgICAgICAgICAgIGlmIChncm91cHMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiIGdyb3Vwcz1cIiIpOworICAgICAgICAgICAgICAgIGludCBuID0gMDsKKyAgICAgICAgICAgICAgICBJdGVyYXRvciB2YWx1ZXMgPSBncm91cHMuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAodmFsdWVzLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAobiA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgnLCcpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG4rKzsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKFJlcXVlc3RVdGlsLmZpbHRlcigoKEdyb3VwKSB2YWx1ZXMubmV4dCgpKS5nZXRHcm91cG5hbWUoKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIlwiIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3luY2hyb25pemVkIChyb2xlcykgeworICAgICAgICAgICAgaWYgKHJvbGVzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiByb2xlcz1cIiIpOworICAgICAgICAgICAgICAgIGludCBuID0gMDsKKyAgICAgICAgICAgICAgICBJdGVyYXRvciB2YWx1ZXMgPSByb2xlcy5pdGVyYXRvcigpOworICAgICAgICAgICAgICAgIHdoaWxlICh2YWx1ZXMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChuID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCcsJyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbisrOworICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoUmVxdWVzdFV0aWwuZmlsdGVyKCgoUm9sZSkgdmFsdWVzLm5leHQoKSkuZ2V0Um9sZW5hbWUoKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIlwiIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc2IuYXBwZW5kKCIvPiIpOworICAgICAgICByZXR1cm4gKHNiLnRvU3RyaW5nKCkpOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91c2Vycy9NZW1vcnlVc2VyRGF0YWJhc2UuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91c2Vycy9NZW1vcnlVc2VyRGF0YWJhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2QzZTM5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3VzZXJzL01lbW9yeVVzZXJEYXRhYmFzZS5qYXZhCkBAIC0wLDAgKzEsNzQ1IEBACisvKgorICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnVzZXJzOworCisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Hcm91cDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlJvbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Vc2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuVXNlckRhdGFiYXNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5TdHJpbmdNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuZGlnZXN0ZXIuRGlnZXN0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5kaWdlc3Rlci5PYmplY3RDcmVhdGlvbkZhY3Rvcnk7CitpbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKKworCisvKioKKyAqIDxwPkNvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBVc2VyRGF0YWJhc2V9IHRoYXQgbG9hZHMgYWxsCisgKiBkZWZpbmVkIHVzZXJzLCBncm91cHMsIGFuZCByb2xlcyBpbnRvIGFuIGluLW1lbW9yeSBkYXRhIHN0cnVjdHVyZSwKKyAqIGFuZCB1c2VzIGEgc3BlY2lmaWVkIFhNTCBmaWxlIGZvciBpdHMgcGVyc2lzdGVudCBzdG9yYWdlLjwvcD4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKiBAc2luY2UgNC4xCisgKi8KKworcHVibGljIGNsYXNzIE1lbW9yeVVzZXJEYXRhYmFzZSBpbXBsZW1lbnRzIFVzZXJEYXRhYmFzZSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugd2l0aCBkZWZhdWx0IHZhbHVlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWVtb3J5VXNlckRhdGFiYXNlKCkgeworCisgICAgICAgIHN1cGVyKCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWVzLgorICAgICAqCisgICAgICogQHBhcmFtIGlkIFVuaXF1ZSBnbG9iYWwgaWRlbnRpZmllciBvZiB0aGlzIHVzZXIgZGF0YWJhc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgTWVtb3J5VXNlckRhdGFiYXNlKFN0cmluZyBpZCkgeworCisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIHRoaXMuaWQgPSBpZDsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBzZXQgb2Yge0BsaW5rIEdyb3VwfXMgZGVmaW5lZCBpbiB0aGlzIGRhdGFiYXNlLCBrZXllZCBieQorICAgICAqIGdyb3VwIG5hbWUuCisgICAgICovCisgICAgcHJvdGVjdGVkIEhhc2hNYXAgZ3JvdXBzID0gbmV3IEhhc2hNYXAoKTsKKworCisgICAgLyoqCisgICAgICogVGhlIHVuaXF1ZSBnbG9iYWwgaWRlbnRpZmllciBvZiB0aGlzIHVzZXIgZGF0YWJhc2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBpZCA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSByZWxhdGl2ZSAodG8gPGNvZGU+Y2F0YWxpbmEuYmFzZTwvY29kZT4pIG9yIGFic29sdXRlIHBhdGhuYW1lIHRvCisgICAgICogdGhlIFhNTCBmaWxlIGluIHdoaWNoIHdlIHdpbGwgc2F2ZSBvdXIgcGVyc2lzdGVudCBpbmZvcm1hdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHBhdGhuYW1lID0gImNvbmYvdG9tY2F0LXVzZXJzLnhtbCI7CisKKworICAgIC8qKgorICAgICAqIFRoZSByZWxhdGl2ZSBvciBhYnNvbHV0ZSBwYXRobmFtZSB0byB0aGUgZmlsZSBpbiB3aGljaCBvdXIgb2xkCisgICAgICogaW5mb3JtYXRpb24gaXMgc3RvcmVkIHdoaWxlIHJlbmFtaW5nIGlzIGluIHByb2dyZXNzLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgcGF0aG5hbWVPbGQgPSBwYXRobmFtZSArICIub2xkIjsKKworCisgICAgLyoqCisgICAgICogVGhlIHJlbGF0aXZlIG9yIGFic29sdXRlIHBhdGhuYW1lIG90IHRoZSBmaWxlIGluIHdoaWNoIHdlIHdyaXRlCisgICAgICogb3VyIG5ldyBpbmZvcm1hdGlvbiBwcmlvciB0byByZW5hbWluZy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHBhdGhuYW1lTmV3ID0gcGF0aG5hbWUgKyAiLm5ldyI7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzZXQgb2Yge0BsaW5rIFJvbGV9cyBkZWZpbmVkIGluIHRoaXMgZGF0YWJhc2UsIGtleWVkIGJ5CisgICAgICogcm9sZSBuYW1lLgorICAgICAqLworICAgIHByb3RlY3RlZCBIYXNoTWFwIHJvbGVzID0gbmV3IEhhc2hNYXAoKTsKKworCisgICAgLyoqCisgICAgICogVGhlIHN0cmluZyBtYW5hZ2VyIGZvciB0aGlzIHBhY2thZ2UuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nTWFuYWdlciBzbSA9CisgICAgICAgIFN0cmluZ01hbmFnZXIuZ2V0TWFuYWdlcihDb25zdGFudHMuUGFja2FnZSk7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzZXQgb2Yge0BsaW5rIFVzZXJ9cyBkZWZpbmVkIGluIHRoaXMgZGF0YWJhc2UsIGtleWVkIGJ5CisgICAgICogdXNlciBuYW1lLgorICAgICAqLworICAgIHByb3RlY3RlZCBIYXNoTWFwIHVzZXJzID0gbmV3IEhhc2hNYXAoKTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2V0IG9mIHtAbGluayBHcm91cH1zIGRlZmluZWQgaW4gdGhpcyB1c2VyIGRhdGFiYXNlLgorICAgICAqLworICAgIHB1YmxpYyBJdGVyYXRvciBnZXRHcm91cHMoKSB7CisKKyAgICAgICAgc3luY2hyb25pemVkIChncm91cHMpIHsKKyAgICAgICAgICAgIHJldHVybiAoZ3JvdXBzLnZhbHVlcygpLml0ZXJhdG9yKCkpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdW5pcXVlIGdsb2JhbCBpZGVudGlmaWVyIG9mIHRoaXMgdXNlciBkYXRhYmFzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5pZCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcmVsYXRpdmUgb3IgYWJzb2x1dGUgcGF0aG5hbWUgdG8gdGhlIHBlcnNpc3RlbnQgc3RvcmFnZSBmaWxlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aG5hbWUoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLnBhdGhuYW1lKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSByZWxhdGl2ZSBvciBhYnNvbHV0ZSBwYXRobmFtZSB0byB0aGUgcGVyc2lzdGVudCBzdG9yYWdlIGZpbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0aG5hbWUgVGhlIG5ldyBwYXRobmFtZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhdGhuYW1lKFN0cmluZyBwYXRobmFtZSkgeworCisgICAgICAgIHRoaXMucGF0aG5hbWUgPSBwYXRobmFtZTsKKyAgICAgICAgdGhpcy5wYXRobmFtZU9sZCA9IHBhdGhuYW1lICsgIi5vbGQiOworICAgICAgICB0aGlzLnBhdGhuYW1lTmV3ID0gcGF0aG5hbWUgKyAiLm5ldyI7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2V0IG9mIHtAbGluayBSb2xlfXMgZGVmaW5lZCBpbiB0aGlzIHVzZXIgZGF0YWJhc2UuCisgICAgICovCisgICAgcHVibGljIEl0ZXJhdG9yIGdldFJvbGVzKCkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAocm9sZXMpIHsKKyAgICAgICAgICAgIHJldHVybiAocm9sZXMudmFsdWVzKCkuaXRlcmF0b3IoKSk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXQgb2Yge0BsaW5rIFVzZXJ9cyBkZWZpbmVkIGluIHRoaXMgdXNlciBkYXRhYmFzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgSXRlcmF0b3IgZ2V0VXNlcnMoKSB7CisKKyAgICAgICAgc3luY2hyb25pemVkICh1c2VycykgeworICAgICAgICAgICAgcmV0dXJuICh1c2Vycy52YWx1ZXMoKS5pdGVyYXRvcigpKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBGaW5hbGl6ZSBhY2Nlc3MgdG8gdGhpcyB1c2VyIGRhdGFiYXNlLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW55IGV4Y2VwdGlvbiBpcyB0aHJvd24gZHVyaW5nIGNsb3NpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIHNhdmUoKTsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKGdyb3VwcykgeworICAgICAgICAgICAgc3luY2hyb25pemVkICh1c2VycykgeworICAgICAgICAgICAgICAgIHVzZXJzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgZ3JvdXBzLmNsZWFyKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuZCByZXR1cm4gYSBuZXcge0BsaW5rIEdyb3VwfSBkZWZpbmVkIGluIHRoaXMgdXNlciBkYXRhYmFzZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBncm91cG5hbWUgVGhlIGdyb3VwIG5hbWUgb2YgdGhlIG5ldyBncm91cCAobXVzdCBiZSB1bmlxdWUpCisgICAgICogQHBhcmFtIGRlc2NyaXB0aW9uIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGlzIGdyb3VwCisgICAgICovCisgICAgcHVibGljIEdyb3VwIGNyZWF0ZUdyb3VwKFN0cmluZyBncm91cG5hbWUsIFN0cmluZyBkZXNjcmlwdGlvbikgeworCisgICAgICAgIE1lbW9yeUdyb3VwIGdyb3VwID0gbmV3IE1lbW9yeUdyb3VwKHRoaXMsIGdyb3VwbmFtZSwgZGVzY3JpcHRpb24pOworICAgICAgICBzeW5jaHJvbml6ZWQgKGdyb3VwcykgeworICAgICAgICAgICAgZ3JvdXBzLnB1dChncm91cC5nZXRHcm91cG5hbWUoKSwgZ3JvdXApOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoZ3JvdXApOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW5kIHJldHVybiBhIG5ldyB7QGxpbmsgUm9sZX0gZGVmaW5lZCBpbiB0aGlzIHVzZXIgZGF0YWJhc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcm9sZW5hbWUgVGhlIHJvbGUgbmFtZSBvZiB0aGUgbmV3IGdyb3VwIChtdXN0IGJlIHVuaXF1ZSkKKyAgICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gVGhlIGRlc2NyaXB0aW9uIG9mIHRoaXMgZ3JvdXAKKyAgICAgKi8KKyAgICBwdWJsaWMgUm9sZSBjcmVhdGVSb2xlKFN0cmluZyByb2xlbmFtZSwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7CisKKyAgICAgICAgTWVtb3J5Um9sZSByb2xlID0gbmV3IE1lbW9yeVJvbGUodGhpcywgcm9sZW5hbWUsIGRlc2NyaXB0aW9uKTsKKyAgICAgICAgc3luY2hyb25pemVkIChyb2xlcykgeworICAgICAgICAgICAgcm9sZXMucHV0KHJvbGUuZ2V0Um9sZW5hbWUoKSwgcm9sZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChyb2xlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuZCByZXR1cm4gYSBuZXcge0BsaW5rIFVzZXJ9IGRlZmluZWQgaW4gdGhpcyB1c2VyIGRhdGFiYXNlLgorICAgICAqCisgICAgICogQHBhcmFtIHVzZXJuYW1lIFRoZSBsb2dvbiB1c2VybmFtZSBvZiB0aGUgbmV3IHVzZXIgKG11c3QgYmUgdW5pcXVlKQorICAgICAqIEBwYXJhbSBwYXNzd29yZCBUaGUgbG9nb24gcGFzc3dvcmQgb2YgdGhlIG5ldyB1c2VyCisgICAgICogQHBhcmFtIGZ1bGxOYW1lIFRoZSBmdWxsIG5hbWUgb2YgdGhlIG5ldyB1c2VyCisgICAgICovCisgICAgcHVibGljIFVzZXIgY3JlYXRlVXNlcihTdHJpbmcgdXNlcm5hbWUsIFN0cmluZyBwYXNzd29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBmdWxsTmFtZSkgeworCisgICAgICAgIE1lbW9yeVVzZXIgdXNlciA9IG5ldyBNZW1vcnlVc2VyKHRoaXMsIHVzZXJuYW1lLCBwYXNzd29yZCwgZnVsbE5hbWUpOworICAgICAgICBzeW5jaHJvbml6ZWQgKHVzZXJzKSB7CisgICAgICAgICAgICB1c2Vycy5wdXQodXNlci5nZXRVc2VybmFtZSgpLCB1c2VyKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKHVzZXIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHtAbGluayBHcm91cH0gd2l0aCB0aGUgc3BlY2lmaWVkIGdyb3VwIG5hbWUsIGlmIGFueTsKKyAgICAgKiBvdGhlcndpc2UgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIGdyb3VwbmFtZSBOYW1lIG9mIHRoZSBncm91cCB0byByZXR1cm4KKyAgICAgKi8KKyAgICBwdWJsaWMgR3JvdXAgZmluZEdyb3VwKFN0cmluZyBncm91cG5hbWUpIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKGdyb3VwcykgeworICAgICAgICAgICAgcmV0dXJuICgoR3JvdXApIGdyb3Vwcy5nZXQoZ3JvdXBuYW1lKSk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB7QGxpbmsgUm9sZX0gd2l0aCB0aGUgc3BlY2lmaWVkIHJvbGUgbmFtZSwgaWYgYW55OworICAgICAqIG90aGVyd2lzZSByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcm9sZW5hbWUgTmFtZSBvZiB0aGUgcm9sZSB0byByZXR1cm4KKyAgICAgKi8KKyAgICBwdWJsaWMgUm9sZSBmaW5kUm9sZShTdHJpbmcgcm9sZW5hbWUpIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKHJvbGVzKSB7CisgICAgICAgICAgICByZXR1cm4gKChSb2xlKSByb2xlcy5nZXQocm9sZW5hbWUpKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHtAbGluayBVc2VyfSB3aXRoIHRoZSBzcGVjaWZpZWQgdXNlciBuYW1lLCBpZiBhbnk7CisgICAgICogb3RoZXJ3aXNlIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1c2VybmFtZSBOYW1lIG9mIHRoZSB1c2VyIHRvIHJldHVybgorICAgICAqLworICAgIHB1YmxpYyBVc2VyIGZpbmRVc2VyKFN0cmluZyB1c2VybmFtZSkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAodXNlcnMpIHsKKyAgICAgICAgICAgIHJldHVybiAoKFVzZXIpIHVzZXJzLmdldCh1c2VybmFtZSkpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemUgYWNjZXNzIHRvIHRoaXMgdXNlciBkYXRhYmFzZS4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFueSBleGNlcHRpb24gaXMgdGhyb3duIGR1cmluZyBvcGVuaW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgb3BlbigpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIHN5bmNocm9uaXplZCAoZ3JvdXBzKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHVzZXJzKSB7CisKKyAgICAgICAgICAgICAgICAvLyBFcmFzZSBhbnkgcHJldmlvdXMgZ3JvdXBzIGFuZCB1c2VycworICAgICAgICAgICAgICAgIHVzZXJzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgZ3JvdXBzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgcm9sZXMuY2xlYXIoKTsKKworICAgICAgICAgICAgICAgIC8vIENvbnN0cnVjdCBhIHJlYWRlciBmb3IgdGhlIFhNTCBpbnB1dCBmaWxlIChpZiBpdCBleGlzdHMpCisgICAgICAgICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUocGF0aG5hbWUpOworICAgICAgICAgICAgICAgIGlmICghZmlsZS5pc0Fic29sdXRlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZmlsZSA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2F0YWxpbmEuYmFzZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aG5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIWZpbGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBGaWxlSW5wdXRTdHJlYW0gZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKKworICAgICAgICAgICAgICAgIC8vIENvbnN0cnVjdCBhIGRpZ2VzdGVyIHRvIHJlYWQgdGhlIFhNTCBpbnB1dCBmaWxlCisgICAgICAgICAgICAgICAgRGlnZXN0ZXIgZGlnZXN0ZXIgPSBuZXcgRGlnZXN0ZXIoKTsKKyAgICAgICAgICAgICAgICBkaWdlc3Rlci5hZGRGYWN0b3J5Q3JlYXRlCisgICAgICAgICAgICAgICAgICAgICgidG9tY2F0LXVzZXJzL2dyb3VwIiwKKyAgICAgICAgICAgICAgICAgICAgIG5ldyBNZW1vcnlHcm91cENyZWF0aW9uRmFjdG9yeSh0aGlzKSk7CisgICAgICAgICAgICAgICAgZGlnZXN0ZXIuYWRkRmFjdG9yeUNyZWF0ZQorICAgICAgICAgICAgICAgICAgICAoInRvbWNhdC11c2Vycy9yb2xlIiwKKyAgICAgICAgICAgICAgICAgICAgIG5ldyBNZW1vcnlSb2xlQ3JlYXRpb25GYWN0b3J5KHRoaXMpKTsKKyAgICAgICAgICAgICAgICBkaWdlc3Rlci5hZGRGYWN0b3J5Q3JlYXRlCisgICAgICAgICAgICAgICAgICAgICgidG9tY2F0LXVzZXJzL3VzZXIiLAorICAgICAgICAgICAgICAgICAgICAgbmV3IE1lbW9yeVVzZXJDcmVhdGlvbkZhY3RvcnkodGhpcykpOworCisgICAgICAgICAgICAgICAgLy8gUGFyc2UgdGhlIFhNTCBpbnB1dCBmaWxlIHRvIGxvYWQgdGhpcyBkYXRhYmFzZQorICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGRpZ2VzdGVyLnBhcnNlKGZpcyk7CisgICAgICAgICAgICAgICAgICAgIGZpcy5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaXMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIHtAbGluayBHcm91cH0gZnJvbSB0aGlzIHVzZXIgZGF0YWJhc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZ3JvdXAgVGhlIGdyb3VwIHRvIGJlIHJlbW92ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVHcm91cChHcm91cCBncm91cCkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAoZ3JvdXBzKSB7CisgICAgICAgICAgICBJdGVyYXRvciB1c2VycyA9IGdldFVzZXJzKCk7CisgICAgICAgICAgICB3aGlsZSAodXNlcnMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgVXNlciB1c2VyID0gKFVzZXIpIHVzZXJzLm5leHQoKTsKKyAgICAgICAgICAgICAgICB1c2VyLnJlbW92ZUdyb3VwKGdyb3VwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdyb3Vwcy5yZW1vdmUoZ3JvdXAuZ2V0R3JvdXBuYW1lKCkpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIHtAbGluayBSb2xlfSBmcm9tIHRoaXMgdXNlciBkYXRhYmFzZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByb2xlIFRoZSByb2xlIHRvIGJlIHJlbW92ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVSb2xlKFJvbGUgcm9sZSkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAocm9sZXMpIHsKKyAgICAgICAgICAgIEl0ZXJhdG9yIGdyb3VwcyA9IGdldEdyb3VwcygpOworICAgICAgICAgICAgd2hpbGUgKGdyb3Vwcy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBHcm91cCBncm91cCA9IChHcm91cCkgZ3JvdXBzLm5leHQoKTsKKyAgICAgICAgICAgICAgICBncm91cC5yZW1vdmVSb2xlKHJvbGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgSXRlcmF0b3IgdXNlcnMgPSBnZXRVc2VycygpOworICAgICAgICAgICAgd2hpbGUgKHVzZXJzLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIFVzZXIgdXNlciA9IChVc2VyKSB1c2Vycy5uZXh0KCk7CisgICAgICAgICAgICAgICAgdXNlci5yZW1vdmVSb2xlKHJvbGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcm9sZXMucmVtb3ZlKHJvbGUuZ2V0Um9sZW5hbWUoKSk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQge0BsaW5rIFVzZXJ9IGZyb20gdGhpcyB1c2VyIGRhdGFiYXNlLgorICAgICAqCisgICAgICogQHBhcmFtIHVzZXIgVGhlIHVzZXIgdG8gYmUgcmVtb3ZlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVVzZXIoVXNlciB1c2VyKSB7CisKKyAgICAgICAgc3luY2hyb25pemVkICh1c2VycykgeworICAgICAgICAgICAgdXNlcnMucmVtb3ZlKHVzZXIuZ2V0VXNlcm5hbWUoKSk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2F2ZSBhbnkgdXBkYXRlZCBpbmZvcm1hdGlvbiB0byB0aGUgcGVyc2lzdGVudCBzdG9yYWdlIGxvY2F0aW9uIGZvcgorICAgICAqIHRoaXMgdXNlciBkYXRhYmFzZS4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFueSBleGNlcHRpb24gaXMgdGhyb3duIGR1cmluZyBzYXZpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzYXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gV3JpdGUgb3V0IGNvbnRlbnRzIHRvIGEgdGVtcG9yYXJ5IGZpbGUKKyAgICAgICAgRmlsZSBmaWxlTmV3ID0gbmV3IEZpbGUocGF0aG5hbWVOZXcpOworICAgICAgICBpZiAoIWZpbGVOZXcuaXNBYnNvbHV0ZSgpKSB7CisgICAgICAgICAgICBmaWxlTmV3ID0KKyAgICAgICAgICAgICAgICBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImNhdGFsaW5hLmJhc2UiKSwgcGF0aG5hbWVOZXcpOworICAgICAgICB9CisgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IG51bGw7CisgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgIC8vIENvbmZpZ3VyZSBvdXIgUHJpbnRXcml0ZXIKKyAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZU5ldyk7CisgICAgICAgICAgICBPdXRwdXRTdHJlYW1Xcml0ZXIgb3N3ID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihmb3MsICJVVEY4Iik7CisgICAgICAgICAgICB3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIob3N3KTsKKworICAgICAgICAgICAgLy8gUHJpbnQgdGhlIGZpbGUgcHJvbG9nCisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0ndXRmLTgnPz4iKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCI8dG9tY2F0LXVzZXJzPiIpOworCisgICAgICAgICAgICAvLyBQcmludCBlbnRyaWVzIGZvciBlYWNoIGRlZmluZWQgcm9sZSwgZ3JvdXAsIGFuZCB1c2VyCisgICAgICAgICAgICBJdGVyYXRvciB2YWx1ZXMgPSBudWxsOworICAgICAgICAgICAgdmFsdWVzID0gZ2V0Um9sZXMoKTsKKyAgICAgICAgICAgIHdoaWxlICh2YWx1ZXMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KCIgICIpOworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKHZhbHVlcy5uZXh0KCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFsdWVzID0gZ2V0R3JvdXBzKCk7CisgICAgICAgICAgICB3aGlsZSAodmFsdWVzLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludCgiICAiKTsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbih2YWx1ZXMubmV4dCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhbHVlcyA9IGdldFVzZXJzKCk7CisgICAgICAgICAgICB3aGlsZSAodmFsdWVzLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludCgiICAiKTsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbih2YWx1ZXMubmV4dCgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gUHJpbnQgdGhlIGZpbGUgZXBpbG9nCisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiPC90b21jYXQtdXNlcnM+Iik7CisKKyAgICAgICAgICAgIC8vIENoZWNrIGZvciBlcnJvcnMgdGhhdCBvY2N1cnJlZCB3aGlsZSBwcmludGluZworICAgICAgICAgICAgaWYgKHdyaXRlci5jaGVja0Vycm9yKCkpIHsKKyAgICAgICAgICAgICAgICB3cml0ZXIuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICBmaWxlTmV3LmRlbGV0ZSgpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJtZW1vcnlVc2VyRGF0YWJhc2Uud3JpdGVFeGNlcHRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVOZXcuZ2V0QWJzb2x1dGVQYXRoKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdyaXRlci5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBpZiAod3JpdGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB3cml0ZXIuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbGVOZXcuZGVsZXRlKCk7CisgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9CisKKyAgICAgICAgLy8gUGVyZm9ybSB0aGUgcmVxdWlyZWQgcmVuYW1lcyB0byBwZXJtYW5lbnRseSBzYXZlIHRoaXMgZmlsZQorICAgICAgICBGaWxlIGZpbGVPbGQgPSBuZXcgRmlsZShwYXRobmFtZU9sZCk7CisgICAgICAgIGlmICghZmlsZU9sZC5pc0Fic29sdXRlKCkpIHsKKyAgICAgICAgICAgIGZpbGVPbGQgPQorICAgICAgICAgICAgICAgIG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2F0YWxpbmEuYmFzZSIpLCBwYXRobmFtZU9sZCk7CisgICAgICAgIH0KKyAgICAgICAgZmlsZU9sZC5kZWxldGUoKTsKKyAgICAgICAgRmlsZSBmaWxlT3JpZyA9IG5ldyBGaWxlKHBhdGhuYW1lKTsKKyAgICAgICAgaWYgKCFmaWxlT3JpZy5pc0Fic29sdXRlKCkpIHsKKyAgICAgICAgICAgIGZpbGVPcmlnID0KKyAgICAgICAgICAgICAgICBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImNhdGFsaW5hLmJhc2UiKSwgcGF0aG5hbWUpOworICAgICAgICB9CisgICAgICAgIGlmIChmaWxlT3JpZy5leGlzdHMoKSkgeworICAgICAgICAgICAgZmlsZU9sZC5kZWxldGUoKTsKKyAgICAgICAgICAgIGlmICghZmlsZU9yaWcucmVuYW1lVG8oZmlsZU9sZCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygibWVtb3J5VXNlckRhdGFiYXNlLnJlbmFtZU9sZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZU9sZC5nZXRBYnNvbHV0ZVBhdGgoKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghZmlsZU5ldy5yZW5hbWVUbyhmaWxlT3JpZykpIHsKKyAgICAgICAgICAgIGlmIChmaWxlT2xkLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgZmlsZU9sZC5yZW5hbWVUbyhmaWxlT3JpZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJtZW1vcnlVc2VyRGF0YWJhc2UucmVuYW1lTmV3IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVPcmlnLmdldEFic29sdXRlUGF0aCgpKSk7CisgICAgICAgIH0KKyAgICAgICAgZmlsZU9sZC5kZWxldGUoKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgVXNlckRhdGFiYXNlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiTWVtb3J5VXNlckRhdGFiYXNlW2lkPSIpOworICAgICAgICBzYi5hcHBlbmQodGhpcy5pZCk7CisgICAgICAgIHNiLmFwcGVuZCgiLHBhdGhuYW1lPSIpOworICAgICAgICBzYi5hcHBlbmQocGF0aG5hbWUpOworICAgICAgICBzYi5hcHBlbmQoIixncm91cENvdW50PSIpOworICAgICAgICBzYi5hcHBlbmQodGhpcy5ncm91cHMuc2l6ZSgpKTsKKyAgICAgICAgc2IuYXBwZW5kKCIscm9sZUNvdW50PSIpOworICAgICAgICBzYi5hcHBlbmQodGhpcy5yb2xlcy5zaXplKCkpOworICAgICAgICBzYi5hcHBlbmQoIix1c2VyQ291bnQ9Iik7CisgICAgICAgIHNiLmFwcGVuZCh0aGlzLnVzZXJzLnNpemUoKSk7CisgICAgICAgIHNiLmFwcGVuZCgiXSIpOworICAgICAgICByZXR1cm4gKHNiLnRvU3RyaW5nKCkpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQYWNrYWdlIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSA8Y29kZT5TdHJpbmdNYW5hZ2VyPC9jb2RlPiBmb3IgdXNlIGluIGxvb2tpbmcgdXAgbWVzc2FnZXMuCisgICAgICovCisgICAgU3RyaW5nTWFuYWdlciBnZXRTdHJpbmdNYW5hZ2VyKCkgeworCisgICAgICAgIHJldHVybiAoc20pOworCisgICAgfQorCisKK30KKworCisKKy8qKgorICogRGlnZXN0ZXIgb2JqZWN0IGNyZWF0aW9uIGZhY3RvcnkgZm9yIGdyb3VwIGluc3RhbmNlcy4KKyAqLworY2xhc3MgTWVtb3J5R3JvdXBDcmVhdGlvbkZhY3RvcnkgaW1wbGVtZW50cyBPYmplY3RDcmVhdGlvbkZhY3RvcnkgeworCisgICAgcHVibGljIE1lbW9yeUdyb3VwQ3JlYXRpb25GYWN0b3J5KE1lbW9yeVVzZXJEYXRhYmFzZSBkYXRhYmFzZSkgeworICAgICAgICB0aGlzLmRhdGFiYXNlID0gZGF0YWJhc2U7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBjcmVhdGVPYmplY3QoQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7CisgICAgICAgIFN0cmluZyBncm91cG5hbWUgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJncm91cG5hbWUiKTsKKyAgICAgICAgaWYgKGdyb3VwbmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICBncm91cG5hbWUgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJuYW1lIik7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIGRlc2NyaXB0aW9uID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgiZGVzY3JpcHRpb24iKTsKKyAgICAgICAgU3RyaW5nIHJvbGVzID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgicm9sZXMiKTsKKyAgICAgICAgR3JvdXAgZ3JvdXAgPSBkYXRhYmFzZS5jcmVhdGVHcm91cChncm91cG5hbWUsIGRlc2NyaXB0aW9uKTsKKyAgICAgICAgaWYgKHJvbGVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIHdoaWxlIChyb2xlcy5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcm9sZW5hbWUgPSBudWxsOworICAgICAgICAgICAgICAgIGludCBjb21tYSA9IHJvbGVzLmluZGV4T2YoJywnKTsKKyAgICAgICAgICAgICAgICBpZiAoY29tbWEgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICByb2xlbmFtZSA9IHJvbGVzLnN1YnN0cmluZygwLCBjb21tYSkudHJpbSgpOworICAgICAgICAgICAgICAgICAgICByb2xlcyA9IHJvbGVzLnN1YnN0cmluZyhjb21tYSArIDEpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJvbGVuYW1lID0gcm9sZXMudHJpbSgpOworICAgICAgICAgICAgICAgICAgICByb2xlcyA9ICIiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocm9sZW5hbWUubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIFJvbGUgcm9sZSA9IGRhdGFiYXNlLmZpbmRSb2xlKHJvbGVuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJvbGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcm9sZSA9IGRhdGFiYXNlLmNyZWF0ZVJvbGUocm9sZW5hbWUsIG51bGwpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGdyb3VwLmFkZFJvbGUocm9sZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAoZ3JvdXApOworICAgIH0KKworICAgIHByaXZhdGUgTWVtb3J5VXNlckRhdGFiYXNlIGRhdGFiYXNlID0gbnVsbDsKKworICAgIHByaXZhdGUgRGlnZXN0ZXIgZGlnZXN0ZXIgPSBudWxsOworCisgICAgcHVibGljIERpZ2VzdGVyIGdldERpZ2VzdGVyKCkgeworICAgICAgICByZXR1cm4gKHRoaXMuZGlnZXN0ZXIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERpZ2VzdGVyKERpZ2VzdGVyIGRpZ2VzdGVyKSB7CisgICAgICAgIHRoaXMuZGlnZXN0ZXIgPSBkaWdlc3RlcjsKKyAgICB9CisKK30KKworCisvKioKKyAqIERpZ2VzdGVyIG9iamVjdCBjcmVhdGlvbiBmYWN0b3J5IGZvciByb2xlIGluc3RhbmNlcy4KKyAqLworY2xhc3MgTWVtb3J5Um9sZUNyZWF0aW9uRmFjdG9yeSBpbXBsZW1lbnRzIE9iamVjdENyZWF0aW9uRmFjdG9yeSB7CisKKyAgICBwdWJsaWMgTWVtb3J5Um9sZUNyZWF0aW9uRmFjdG9yeShNZW1vcnlVc2VyRGF0YWJhc2UgZGF0YWJhc2UpIHsKKyAgICAgICAgdGhpcy5kYXRhYmFzZSA9IGRhdGFiYXNlOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgY3JlYXRlT2JqZWN0KEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgeworICAgICAgICBTdHJpbmcgcm9sZW5hbWUgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJyb2xlbmFtZSIpOworICAgICAgICBpZiAocm9sZW5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgcm9sZW5hbWUgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJuYW1lIik7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIGRlc2NyaXB0aW9uID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgiZGVzY3JpcHRpb24iKTsKKyAgICAgICAgUm9sZSByb2xlID0gZGF0YWJhc2UuY3JlYXRlUm9sZShyb2xlbmFtZSwgZGVzY3JpcHRpb24pOworICAgICAgICByZXR1cm4gKHJvbGUpOworICAgIH0KKworICAgIHByaXZhdGUgTWVtb3J5VXNlckRhdGFiYXNlIGRhdGFiYXNlID0gbnVsbDsKKworICAgIHByaXZhdGUgRGlnZXN0ZXIgZGlnZXN0ZXIgPSBudWxsOworCisgICAgcHVibGljIERpZ2VzdGVyIGdldERpZ2VzdGVyKCkgeworICAgICAgICByZXR1cm4gKHRoaXMuZGlnZXN0ZXIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERpZ2VzdGVyKERpZ2VzdGVyIGRpZ2VzdGVyKSB7CisgICAgICAgIHRoaXMuZGlnZXN0ZXIgPSBkaWdlc3RlcjsKKyAgICB9CisKK30KKworCisvKioKKyAqIERpZ2VzdGVyIG9iamVjdCBjcmVhdGlvbiBmYWN0b3J5IGZvciB1c2VyIGluc3RhbmNlcy4KKyAqLworY2xhc3MgTWVtb3J5VXNlckNyZWF0aW9uRmFjdG9yeSBpbXBsZW1lbnRzIE9iamVjdENyZWF0aW9uRmFjdG9yeSB7CisKKyAgICBwdWJsaWMgTWVtb3J5VXNlckNyZWF0aW9uRmFjdG9yeShNZW1vcnlVc2VyRGF0YWJhc2UgZGF0YWJhc2UpIHsKKyAgICAgICAgdGhpcy5kYXRhYmFzZSA9IGRhdGFiYXNlOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgY3JlYXRlT2JqZWN0KEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgeworICAgICAgICBTdHJpbmcgdXNlcm5hbWUgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJ1c2VybmFtZSIpOworICAgICAgICBpZiAodXNlcm5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgdXNlcm5hbWUgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJuYW1lIik7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIHBhc3N3b3JkID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgicGFzc3dvcmQiKTsKKyAgICAgICAgU3RyaW5nIGZ1bGxOYW1lID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgiZnVsbE5hbWUiKTsKKyAgICAgICAgaWYgKGZ1bGxOYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgIGZ1bGxOYW1lID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgiZnVsbG5hbWUiKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgZ3JvdXBzID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgiZ3JvdXBzIik7CisgICAgICAgIFN0cmluZyByb2xlcyA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInJvbGVzIik7CisgICAgICAgIFVzZXIgdXNlciA9IGRhdGFiYXNlLmNyZWF0ZVVzZXIodXNlcm5hbWUsIHBhc3N3b3JkLCBmdWxsTmFtZSk7CisgICAgICAgIGlmIChncm91cHMgIT0gbnVsbCkgeworICAgICAgICAgICAgd2hpbGUgKGdyb3Vwcy5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZ3JvdXBuYW1lID0gbnVsbDsKKyAgICAgICAgICAgICAgICBpbnQgY29tbWEgPSBncm91cHMuaW5kZXhPZignLCcpOworICAgICAgICAgICAgICAgIGlmIChjb21tYSA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGdyb3VwbmFtZSA9IGdyb3Vwcy5zdWJzdHJpbmcoMCwgY29tbWEpLnRyaW0oKTsKKyAgICAgICAgICAgICAgICAgICAgZ3JvdXBzID0gZ3JvdXBzLnN1YnN0cmluZyhjb21tYSArIDEpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGdyb3VwbmFtZSA9IGdyb3Vwcy50cmltKCk7CisgICAgICAgICAgICAgICAgICAgIGdyb3VwcyA9ICIiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZ3JvdXBuYW1lLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICBHcm91cCBncm91cCA9IGRhdGFiYXNlLmZpbmRHcm91cChncm91cG5hbWUpOworICAgICAgICAgICAgICAgICAgICBpZiAoZ3JvdXAgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAgPSBkYXRhYmFzZS5jcmVhdGVHcm91cChncm91cG5hbWUsIG51bGwpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHVzZXIuYWRkR3JvdXAoZ3JvdXApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAocm9sZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgd2hpbGUgKHJvbGVzLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgIFN0cmluZyByb2xlbmFtZSA9IG51bGw7CisgICAgICAgICAgICAgICAgaW50IGNvbW1hID0gcm9sZXMuaW5kZXhPZignLCcpOworICAgICAgICAgICAgICAgIGlmIChjb21tYSA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJvbGVuYW1lID0gcm9sZXMuc3Vic3RyaW5nKDAsIGNvbW1hKS50cmltKCk7CisgICAgICAgICAgICAgICAgICAgIHJvbGVzID0gcm9sZXMuc3Vic3RyaW5nKGNvbW1hICsgMSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcm9sZW5hbWUgPSByb2xlcy50cmltKCk7CisgICAgICAgICAgICAgICAgICAgIHJvbGVzID0gIiI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChyb2xlbmFtZS5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgUm9sZSByb2xlID0gZGF0YWJhc2UuZmluZFJvbGUocm9sZW5hbWUpOworICAgICAgICAgICAgICAgICAgICBpZiAocm9sZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByb2xlID0gZGF0YWJhc2UuY3JlYXRlUm9sZShyb2xlbmFtZSwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdXNlci5hZGRSb2xlKHJvbGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKHVzZXIpOworICAgIH0KKworICAgIHByaXZhdGUgTWVtb3J5VXNlckRhdGFiYXNlIGRhdGFiYXNlID0gbnVsbDsKKworICAgIHByaXZhdGUgRGlnZXN0ZXIgZGlnZXN0ZXIgPSBudWxsOworCisgICAgcHVibGljIERpZ2VzdGVyIGdldERpZ2VzdGVyKCkgeworICAgICAgICByZXR1cm4gKHRoaXMuZGlnZXN0ZXIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERpZ2VzdGVyKERpZ2VzdGVyIGRpZ2VzdGVyKSB7CisgICAgICAgIHRoaXMuZGlnZXN0ZXIgPSBkaWdlc3RlcjsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91c2Vycy9NZW1vcnlVc2VyRGF0YWJhc2VGYWN0b3J5LmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXNlcnMvTWVtb3J5VXNlckRhdGFiYXNlRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1Njc5YWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXNlcnMvTWVtb3J5VXNlckRhdGFiYXNlRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnVzZXJzOworCisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworCitpbXBvcnQgamF2YXgubmFtaW5nLkNvbnRleHQ7CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWU7CitpbXBvcnQgamF2YXgubmFtaW5nLlJlZkFkZHI7CitpbXBvcnQgamF2YXgubmFtaW5nLlJlZmVyZW5jZTsKK2ltcG9ydCBqYXZheC5uYW1pbmcuc3BpLk9iamVjdEZhY3Rvcnk7CisKKworLyoqCisgKiA8cD5KTkRJIG9iamVjdCBjcmVhdGlvbiBmYWN0b3J5IGZvciA8Y29kZT5NZW1vcnlVc2VyRGF0YWJhc2U8L2NvZGU+CisgKiBpbnN0YW5jZXMuICBUaGlzIG1ha2VzIGl0IGNvbnZlbmllbnQgdG8gY29uZmlndXJlIGEgdXNlciBkYXRhYmFzZQorICogaW4gdGhlIGdsb2JhbCBKTkRJIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBDYXRhbGluYSBpbnN0YW5jZSwKKyAqIGFuZCB0aGVuIGxpbmsgdG8gdGhhdCByZXNvdXJjZSBmb3Igd2ViIGFwcGxpY2F0aW9ucyB0aGF0IGFkbWluaXN0ZXIKKyAqIHRoZSBjb250ZW50cyBvZiB0aGUgdXNlciBkYXRhYmFzZS48L3A+CisgKgorICogPHA+VGhlIDxjb2RlPk1lbW9yeVVzZXJEYXRhYmFzZTwvY29kZT4gaW5zdGFuY2UgaXMgY29uZmlndXJlZCBiYXNlZAorICogb24gdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXIgdmFsdWVzOjwvcD4KKyAqIDx1bD4KKyAqIDxsaT48c3Ryb25nPnBhdGhuYW1lPC9zdHJvbmc+IC0gQWJzb2x1dGUgb3IgcmVsYXRpdmUgKHRvIHRoZSBkaXJlY3RvcnkKKyAqICAgICBwYXRoIHNwZWNpZmllZCBieSB0aGUgPGNvZGU+Y2F0YWxpbmEuYmFzZTwvY29kZT4gc3lzdGVtIHByb3BlcnR5KQorICogICAgIHBhdGhuYW1lIHRvIHRoZSBYTUwgZmlsZSBmcm9tIHdoaWNoIG91ciB1c2VyIGluZm9ybWF0aW9uIGlzIGxvYWRlZCwKKyAqICAgICBhbmQgdG8gd2hpY2ggaXQgaXMgc3RvcmVkLiAgW2NvbmYvdG9tY2F0LXVzZXJzLnhtbF08L2xpPgorICogPC91bD4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKiBAc2luY2UgNC4xCisgKi8KKworcHVibGljIGNsYXNzIE1lbW9yeVVzZXJEYXRhYmFzZUZhY3RvcnkgaW1wbGVtZW50cyBPYmplY3RGYWN0b3J5IHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIDxwPkNyZWF0ZSBhbmQgcmV0dXJuIGEgbmV3IDxjb2RlPk1lbW9yeVVzZXJEYXRhYmFzZTwvY29kZT4gaW5zdGFuY2UKKyAgICAgKiB0aGF0IGhhcyBiZWVuIGNvbmZpZ3VyZWQgYWNjb3JkaW5nIHRvIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZQorICAgICAqIHNwZWNpZmllZCA8Y29kZT5SZWZlcmVuY2U8L2NvZGU+LiAgSWYgeW91IGluc3RhbmNlIGNhbiBiZSBjcmVhdGVkLAorICAgICAqIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpbnN0ZWFkLjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvYmogVGhlIHBvc3NpYmx5IG51bGwgb2JqZWN0IGNvbnRhaW5pbmcgbG9jYXRpb24gb3IKKyAgICAgKiAgcmVmZXJlbmNlIGluZm9ybWF0aW9uIHRoYXQgY2FuIGJlIHVzZWQgaW4gY3JlYXRpbmcgYW4gb2JqZWN0CisgICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhpcyBvYmplY3QgcmVsYXRpdmUgdG8gPGNvZGU+bmFtZUN0eDwvY29kZT4KKyAgICAgKiBAcGFyYW0gbmFtZUN0eCBUaGUgY29udGV4dCByZWxhdGl2ZSB0byB3aGljaCB0aGUgPGNvZGU+bmFtZTwvY29kZT4KKyAgICAgKiAgcGFyYW1ldGVyIGlzIHNwZWNpZmllZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgPGNvZGU+bmFtZTwvY29kZT4KKyAgICAgKiAgaXMgcmVsYXRpdmUgdG8gdGhlIGRlZmF1bHQgaW5pdGlhbCBjb250ZXh0CisgICAgICogQHBhcmFtIGVudmlyb25tZW50IFRoZSBwb3NzaWJseSBudWxsIGVudmlyb25tZW50IHRoYXQgaXMgdXNlZCBpbgorICAgICAqICBjcmVhdGluZyB0aGlzIG9iamVjdAorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0SW5zdGFuY2UoT2JqZWN0IG9iaiwgTmFtZSBuYW1lLCBDb250ZXh0IG5hbWVDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYXNodGFibGUgZW52aXJvbm1lbnQpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIC8vIFdlIG9ubHkga25vdyBob3cgdG8gZGVhbCB3aXRoIDxjb2RlPmphdmF4Lm5hbWluZy5SZWZlcmVuY2U8L2NvZGU+cworICAgICAgICAvLyB0aGF0IHNwZWNpZnkgYSBjbGFzcyBuYW1lIG9mICJvcmcuYXBhY2hlLmNhdGFsaW5hLlVzZXJEYXRhYmFzZSIKKyAgICAgICAgaWYgKChvYmogPT0gbnVsbCkgfHwgIShvYmogaW5zdGFuY2VvZiBSZWZlcmVuY2UpKSB7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICB9CisgICAgICAgIFJlZmVyZW5jZSByZWYgPSAoUmVmZXJlbmNlKSBvYmo7CisgICAgICAgIGlmICghIm9yZy5hcGFjaGUuY2F0YWxpbmEuVXNlckRhdGFiYXNlIi5lcXVhbHMocmVmLmdldENsYXNzTmFtZSgpKSkgeworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENyZWF0ZSBhbmQgY29uZmlndXJlIGEgTWVtb3J5VXNlckRhdGFiYXNlIGluc3RhbmNlIGJhc2VkIG9uIHRoZQorICAgICAgICAvLyBSZWZBZGRyIHZhbHVlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBSZWZlcmVuY2UKKyAgICAgICAgTWVtb3J5VXNlckRhdGFiYXNlIGRhdGFiYXNlID0gbmV3IE1lbW9yeVVzZXJEYXRhYmFzZShuYW1lLnRvU3RyaW5nKCkpOworICAgICAgICBSZWZBZGRyIHJhID0gbnVsbDsKKworICAgICAgICByYSA9IHJlZi5nZXQoInBhdGhuYW1lIik7CisgICAgICAgIGlmIChyYSAhPSBudWxsKSB7CisgICAgICAgICAgICBkYXRhYmFzZS5zZXRQYXRobmFtZShyYS5nZXRDb250ZW50KCkudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXR1cm4gdGhlIGNvbmZpZ3VyZWQgZGF0YWJhc2UgaW5zdGFuY2UKKyAgICAgICAgZGF0YWJhc2Uub3BlbigpOworICAgICAgICBkYXRhYmFzZS5zYXZlKCk7CisgICAgICAgIHJldHVybiAoZGF0YWJhc2UpOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91c2Vycy9tYmVhbnMtZGVzY3JpcHRvcnMueG1sIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3VzZXJzL21iZWFucy1kZXNjcmlwdG9ycy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVhMDRiZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91c2Vycy9tYmVhbnMtZGVzY3JpcHRvcnMueG1sCkBAIC0wLDAgKzEsMjY5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzxtYmVhbnMtZGVzY3JpcHRvcnM+CisKKyAgPG1iZWFuICAgICAgICAgbmFtZT0iSkRCQ1VzZXJEYXRhYmFzZSIKKyAgICAgICAgICAgIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5tYmVhbnMuSkRCQ1VzZXJEYXRhYmFzZU1CZWFuIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJKREJDIGJhc2VkIHVzZXIgYW5kIGdyb3VwIGRhdGFiYXNlIgorICAgICAgICAgICAgICAgZG9tYWluPSJVc2VycyIKKyAgICAgICAgICAgICAgICBncm91cD0iVXNlckRhdGFiYXNlIgorICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnVzZXJzLkpEQkNVc2VyRGF0YWJhc2UiPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9Imdyb3VwcyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iTUJlYW4gTmFtZXMgb2YgYWxsIGRlZmluZWQgZ3JvdXBzIgorICAgICAgICAgICAgICAgICB0eXBlPSJbTGphdmEubGFuZy5TdHJpbmc7IgorICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9InJvbGVzIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJNQmVhbiBOYW1lcyBvZiBhbGwgZGVmaW5lZCByb2xlcyIKKyAgICAgICAgICAgICAgICAgdHlwZT0iW0xqYXZhLmxhbmcuU3RyaW5nOyIKKyAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJ1c2VycyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iTUJlYW4gTmFtZXMgb2YgYWxsIGRlZmluZWQgdXNlcnMiCisgICAgICAgICAgICAgICAgIHR5cGU9IltMamF2YS5sYW5nLlN0cmluZzsiCisgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisKKyAgICA8b3BlcmF0aW9uICAgbmFtZT0iY3JlYXRlR3JvdXAiCisgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgZ3JvdXAgYW5kIHJldHVybiBNQmVhbiBuYW1lIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgIHJldHVyblR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJncm91cG5hbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249Ikdyb3VwIG5hbWUgb2YgdGhlIG5ldyBncm91cCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJkZXNjcmlwdGlvbiIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iRGVzY3JpcHRpb24gb2YgdGhlIG5ldyBncm91cCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgIDwvb3BlcmF0aW9uPgorCisgICAgPG9wZXJhdGlvbiAgIG5hbWU9ImNyZWF0ZVJvbGUiCisgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgcm9sZSBhbmQgcmV0dXJuIE1CZWFuIG5hbWUiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgcmV0dXJuVHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9InJvbGVuYW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJSb2xlIG5hbWUgb2YgdGhlIG5ldyByb2xlIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9ImRlc2NyaXB0aW9uIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJEZXNjcmlwdGlvbiBvZiB0aGUgbmV3IHJvbGUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICA8L29wZXJhdGlvbj4KKworICAgIDxvcGVyYXRpb24gICBuYW1lPSJjcmVhdGVVc2VyIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IHVzZXIgYW5kIHJldHVybiBNQmVhbiBuYW1lIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgIHJldHVyblR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJ1c2VybmFtZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVXNlciBuYW1lIG9mIHRoZSBuZXcgdXNlciIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXNzd29yZCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iUGFzc3dvcmQgb2YgdGhlIG5ldyB1c2VyIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9ImZ1bGxOYW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJGdWxsIG5hbWUgb2YgdGhlIG5ldyB1c2VyIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgPC9vcGVyYXRpb24+CisKKyAgICA8b3BlcmF0aW9uICAgbmFtZT0iZmluZEdyb3VwIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJSZXR1cm4gTUJlYW4gTmFtZSBvZiB0aGUgc3BlY2lmaWVkIGdyb3VwIChpZiBhbnkpIgorICAgICAgICAgICAgICAgaW1wYWN0PSJJTkZPIgorICAgICAgICAgICByZXR1cm5UeXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iZ3JvdXBuYW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJHcm91cCBuYW1lIG9mIHRoZSByZXF1ZXN0ZWQgZ3JvdXAiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICA8L29wZXJhdGlvbj4KKworICAgIDxvcGVyYXRpb24gICBuYW1lPSJmaW5kUm9sZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iUmV0dXJuIE1CZWFuIE5hbWUgb2YgdGhlIHNwZWNpZmllZCByb2xlIChpZiBhbnkpIgorICAgICAgICAgICAgICAgaW1wYWN0PSJJTkZPIgorICAgICAgICAgICByZXR1cm5UeXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icm9sZW5hbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249IlJvbGUgbmFtZSBvZiB0aGUgcmVxdWVzdGVkIHJvbGUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICA8L29wZXJhdGlvbj4KKworICAgIDxvcGVyYXRpb24gICBuYW1lPSJmaW5kVXNlciIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iUmV0dXJuIE1CZWFuIE5hbWUgb2YgdGhlIHNwZWNpZmllZCB1c2VyIChpZiBhbnkpIgorICAgICAgICAgICAgICAgaW1wYWN0PSJJTkZPIgorICAgICAgICAgICByZXR1cm5UeXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0idXNlcm5hbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249IlVzZXIgbmFtZSBvZiB0aGUgcmVxdWVzdGVkIHVzZXIiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICA8L29wZXJhdGlvbj4KKworICAgIDxvcGVyYXRpb24gICBuYW1lPSJyZW1vdmVHcm91cCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iUmVtb3ZlIGV4aXN0aW5nIGdyb3VwIChhbmQgYWxsIHVzZXIgbWVtYmVyc2hpcHMpIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJncm91cG5hbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249Ikdyb3VwIG5hbWUgb2YgdGhlIGdyb3VwIHRvIHJlbW92ZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgIDwvb3BlcmF0aW9uPgorCisgICAgPG9wZXJhdGlvbiAgIG5hbWU9InJlbW92ZVJvbGUiCisgICAgICAgICAgZGVzY3JpcHRpb249IlJlbW92ZSBleGlzdGluZyByb2xlIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJyb2xlbmFtZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iUm9sZSBuYW1lIG9mIHRoZSByb2xlIHRvIHJlbW92ZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgIDwvb3BlcmF0aW9uPgorCisgICAgPG9wZXJhdGlvbiAgIG5hbWU9InJlbW92ZVVzZXIiCisgICAgICAgICAgZGVzY3JpcHRpb249IlJlbW92ZSBleGlzdGluZyB1c2VyIChhbmQgYWxsIGdyb3VwIG1lbWJlcnNoaXBzKSIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICByZXR1cm5UeXBlPSJ2b2lkIj4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0idXNlcm5hbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249IlVzZXIgbmFtZSBvZiB0aGUgdXNlciB0byByZW1vdmUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICA8L29wZXJhdGlvbj4KKworICAgIDxvcGVyYXRpb24gICBuYW1lPSJzYXZlIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJTYXZlIGN1cnJlbnQgdXNlcnMgYW5kIGdyb3VwcyB0byBwZXJzaXN0ZW50IHN0b3JhZ2UiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgcmV0dXJuVHlwZT0idm9pZCI+CisgICAgPC9vcGVyYXRpb24+CisKKworICAgIDxvcGVyYXRpb24gbmFtZT0ic3RhcnQiIGRlc2NyaXB0aW9uPSJTdGFydCIgaW1wYWN0PSJBQ1RJT04iIHJldHVyblR5cGU9InZvaWQiIC8+CisgICAgPG9wZXJhdGlvbiBuYW1lPSJzdG9wIiBkZXNjcmlwdGlvbj0iU3RvcCIgaW1wYWN0PSJBQ1RJT04iIHJldHVyblR5cGU9InZvaWQiIC8+CisgICAgPG9wZXJhdGlvbiBuYW1lPSJpbml0IiBkZXNjcmlwdGlvbj0iSW5pdCIgaW1wYWN0PSJBQ1RJT04iIHJldHVyblR5cGU9InZvaWQiIC8+CisgICAgPG9wZXJhdGlvbiBuYW1lPSJkZXN0cm95IiBkZXNjcmlwdGlvbj0iRGVzdHJveSIgaW1wYWN0PSJBQ1RJT04iIHJldHVyblR5cGU9InZvaWQiIC8+CisgIDwvbWJlYW4+CisKKyAgPG1iZWFuICAgICAgICAgbmFtZT0iTWVtb3J5VXNlckRhdGFiYXNlIgorICAgICAgICAgICAgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLm1iZWFucy5NZW1vcnlVc2VyRGF0YWJhc2VNQmVhbiIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iSW4tbWVtb3J5IHVzZXIgYW5kIGdyb3VwIGRhdGFiYXNlIgorICAgICAgICAgICAgICAgZG9tYWluPSJVc2VycyIKKyAgICAgICAgICAgICAgICBncm91cD0iVXNlckRhdGFiYXNlIgorICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnVzZXJzLk1lbW9yeVVzZXJEYXRhYmFzZSI+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0iZW5jb2RpbmciCisgICAgICAgICAgZGVzY3JpcHRpb249IkNoYXJhY3RlciBlbmNvZGluZyB0byB1c2Ugd2hlbiB3cml0aW5nIFhNTCBmaWxlIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0iZ3JvdXBzIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJNQmVhbiBOYW1lcyBvZiBhbGwgZGVmaW5lZCBncm91cHMiCisgICAgICAgICAgICAgICAgIHR5cGU9IltMamF2YS5sYW5nLlN0cmluZzsiCisgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0icGF0aG5hbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249IlJlbGF0aXZlIG9yIGFic29sdXRlIHBhdGhuYW1lIHRvIGRhdGFiYXNlIGZpbGUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJyb2xlcyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iTUJlYW4gTmFtZXMgb2YgYWxsIGRlZmluZWQgcm9sZXMiCisgICAgICAgICAgICAgICAgIHR5cGU9IltMamF2YS5sYW5nLlN0cmluZzsiCisgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0idXNlcnMiCisgICAgICAgICAgZGVzY3JpcHRpb249Ik1CZWFuIE5hbWVzIG9mIGFsbCBkZWZpbmVkIHVzZXJzIgorICAgICAgICAgICAgICAgICB0eXBlPSJbTGphdmEubGFuZy5TdHJpbmc7IgorICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorCisgICAgPG9wZXJhdGlvbiAgIG5hbWU9ImNyZWF0ZUdyb3VwIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IGdyb3VwIGFuZCByZXR1cm4gTUJlYW4gbmFtZSIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICByZXR1cm5UeXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iZ3JvdXBuYW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJHcm91cCBuYW1lIG9mIHRoZSBuZXcgZ3JvdXAiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iZGVzY3JpcHRpb24iCisgICAgICAgICAgZGVzY3JpcHRpb249IkRlc2NyaXB0aW9uIG9mIHRoZSBuZXcgZ3JvdXAiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICA8L29wZXJhdGlvbj4KKworICAgIDxvcGVyYXRpb24gICBuYW1lPSJjcmVhdGVSb2xlIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IHJvbGUgYW5kIHJldHVybiBNQmVhbiBuYW1lIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgIHJldHVyblR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJyb2xlbmFtZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iUm9sZSBuYW1lIG9mIHRoZSBuZXcgcm9sZSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJkZXNjcmlwdGlvbiIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iRGVzY3JpcHRpb24gb2YgdGhlIG5ldyByb2xlIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgPC9vcGVyYXRpb24+CisKKyAgICA8b3BlcmF0aW9uICAgbmFtZT0iY3JlYXRlVXNlciIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyB1c2VyIGFuZCByZXR1cm4gTUJlYW4gbmFtZSIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICByZXR1cm5UeXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0idXNlcm5hbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249IlVzZXIgbmFtZSBvZiB0aGUgbmV3IHVzZXIiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFzc3dvcmQiCisgICAgICAgICAgZGVzY3JpcHRpb249IlBhc3N3b3JkIG9mIHRoZSBuZXcgdXNlciIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJmdWxsTmFtZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iRnVsbCBuYW1lIG9mIHRoZSBuZXcgdXNlciIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgIDwvb3BlcmF0aW9uPgorCisgICAgPG9wZXJhdGlvbiAgIG5hbWU9ImZpbmRHcm91cCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iUmV0dXJuIE1CZWFuIE5hbWUgb2YgdGhlIHNwZWNpZmllZCBncm91cCAoaWYgYW55KSIKKyAgICAgICAgICAgICAgIGltcGFjdD0iSU5GTyIKKyAgICAgICAgICAgcmV0dXJuVHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9Imdyb3VwbmFtZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iR3JvdXAgbmFtZSBvZiB0aGUgcmVxdWVzdGVkIGdyb3VwIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgPC9vcGVyYXRpb24+CisKKyAgICA8b3BlcmF0aW9uICAgbmFtZT0iZmluZFJvbGUiCisgICAgICAgICAgZGVzY3JpcHRpb249IlJldHVybiBNQmVhbiBOYW1lIG9mIHRoZSBzcGVjaWZpZWQgcm9sZSAoaWYgYW55KSIKKyAgICAgICAgICAgICAgIGltcGFjdD0iSU5GTyIKKyAgICAgICAgICAgcmV0dXJuVHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9InJvbGVuYW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJSb2xlIG5hbWUgb2YgdGhlIHJlcXVlc3RlZCByb2xlIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgPC9vcGVyYXRpb24+CisKKyAgICA8b3BlcmF0aW9uICAgbmFtZT0iZmluZFVzZXIiCisgICAgICAgICAgZGVzY3JpcHRpb249IlJldHVybiBNQmVhbiBOYW1lIG9mIHRoZSBzcGVjaWZpZWQgdXNlciAoaWYgYW55KSIKKyAgICAgICAgICAgICAgIGltcGFjdD0iSU5GTyIKKyAgICAgICAgICAgcmV0dXJuVHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9InVzZXJuYW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJVc2VyIG5hbWUgb2YgdGhlIHJlcXVlc3RlZCB1c2VyIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgPC9vcGVyYXRpb24+CisKKyAgICA8b3BlcmF0aW9uICAgbmFtZT0icmVtb3ZlR3JvdXAiCisgICAgICAgICAgZGVzY3JpcHRpb249IlJlbW92ZSBleGlzdGluZyBncm91cCAoYW5kIGFsbCB1c2VyIG1lbWJlcnNoaXBzKSIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICByZXR1cm5UeXBlPSJ2b2lkIj4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iZ3JvdXBuYW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJHcm91cCBuYW1lIG9mIHRoZSBncm91cCB0byByZW1vdmUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICA8L29wZXJhdGlvbj4KKworICAgIDxvcGVyYXRpb24gICBuYW1lPSJyZW1vdmVSb2xlIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJSZW1vdmUgZXhpc3Rpbmcgcm9sZSIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICByZXR1cm5UeXBlPSJ2b2lkIj4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icm9sZW5hbWUiCisgICAgICAgICAgZGVzY3JpcHRpb249IlJvbGUgbmFtZSBvZiB0aGUgcm9sZSB0byByZW1vdmUiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgICA8L29wZXJhdGlvbj4KKworICAgIDxvcGVyYXRpb24gICBuYW1lPSJyZW1vdmVVc2VyIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJSZW1vdmUgZXhpc3RpbmcgdXNlciAoYW5kIGFsbCBncm91cCBtZW1iZXJzaGlwcykiCisgICAgICAgICAgICAgICBpbXBhY3Q9IkFDVElPTiIKKyAgICAgICAgICAgcmV0dXJuVHlwZT0idm9pZCI+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9InVzZXJuYW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJVc2VyIG5hbWUgb2YgdGhlIHVzZXIgdG8gcmVtb3ZlIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgPC9vcGVyYXRpb24+CisKKyAgICA8b3BlcmF0aW9uICAgbmFtZT0ic2F2ZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iU2F2ZSBjdXJyZW50IHVzZXJzIGFuZCBncm91cHMgdG8gcGVyc2lzdGVudCBzdG9yYWdlIgorICAgICAgICAgICAgICAgaW1wYWN0PSJBQ1RJT04iCisgICAgICAgICAgIHJldHVyblR5cGU9InZvaWQiPgorICAgIDwvb3BlcmF0aW9uPgorCisKKyAgICA8b3BlcmF0aW9uIG5hbWU9InN0YXJ0IiBkZXNjcmlwdGlvbj0iU3RhcnQiIGltcGFjdD0iQUNUSU9OIiByZXR1cm5UeXBlPSJ2b2lkIiAvPgorICAgIDxvcGVyYXRpb24gbmFtZT0ic3RvcCIgZGVzY3JpcHRpb249IlN0b3AiIGltcGFjdD0iQUNUSU9OIiByZXR1cm5UeXBlPSJ2b2lkIiAvPgorICAgIDxvcGVyYXRpb24gbmFtZT0iaW5pdCIgZGVzY3JpcHRpb249IkluaXQiIGltcGFjdD0iQUNUSU9OIiByZXR1cm5UeXBlPSJ2b2lkIiAvPgorICAgIDxvcGVyYXRpb24gbmFtZT0iZGVzdHJveSIgZGVzY3JpcHRpb249IkRlc3Ryb3kiIGltcGFjdD0iQUNUSU9OIiByZXR1cm5UeXBlPSJ2b2lkIiAvPgorICA8L21iZWFuPgorCisKKzwvbWJlYW5zLWRlc2NyaXB0b3JzPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvQmFzZTY0LmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9CYXNlNjQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzFiZjYwCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvQmFzZTY0LmphdmEKQEAgLTAsMCArMSwyODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWw7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvbWNhdC51dGlsLmJ1Zi5CeXRlQ2h1bms7CitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5idWYuQ2hhckNodW5rOworCisvKioKKyAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgZW5jb2RlL2RlY29kZSBmb3IgUkZDIDIwNDUgQmFzZTY0IGFzIGRlZmluZWQgYnkKKyAqIFJGQyAyMDQ1LCBOLiBGcmVlZCBhbmQgTi4gQm9yZW5zdGVpbi4gIDxhCisgKiBocmVmPSJodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMyMDQ1LnR4dCI+UkZDIDIwNDU8L2E+OgorICogTXVsdGlwdXJwb3NlIEludGVybmV0IE1haWwgRXh0ZW5zaW9ucyAoTUlNRSkgUGFydCBPbmU6IEZvcm1hdCBvZgorICogSW50ZXJuZXQgTWVzc2FnZSBCb2RpZXMuIFJlZmVyZW5jZSAxOTk2CisgKgorICogQGF1dGhvciBKZWZmcmV5IFJvZHJpZ3VlegorICogQHZlcnNpb24gJElkJAorICovCitwdWJsaWMgZmluYWwgY2xhc3MgIEJhc2U2NAoreworICAgIHN0YXRpYyBwcml2YXRlIGZpbmFsIGludCAgQkFTRUxFTkdUSCAgICAgICAgID0gMjU1OworICAgIHN0YXRpYyBwcml2YXRlIGZpbmFsIGludCAgTE9PS1VQTEVOR1RIICAgICAgID0gNjQ7CisgICAgc3RhdGljIHByaXZhdGUgZmluYWwgaW50ICBUV0VOVFlGT1VSQklUR1JPVVAgPSAyNDsKKyAgICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBpbnQgIEVJR0hUQklUICAgICAgICAgICA9IDg7CisgICAgc3RhdGljIHByaXZhdGUgZmluYWwgaW50ICBTSVhURUVOQklUICAgICAgICAgPSAxNjsKKyAgICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBpbnQgIFNJWEJJVCAgICAgICAgICAgICA9IDY7CisgICAgc3RhdGljIHByaXZhdGUgZmluYWwgaW50ICBGT1VSQllURSAgICAgICAgICAgPSA0OworICAgIHN0YXRpYyBwcml2YXRlIGZpbmFsIGludCAgU0lHTiAgICAgICAgICAgICAgID0gLTEyODsKKyAgICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBieXRlIFBBRCAgICAgICAgICAgICAgICA9IChieXRlKSAnPSc7CisgICAgc3RhdGljIHByaXZhdGUgYnl0ZSBbXSBiYXNlNjRBbHBoYWJldCAgICAgICA9IG5ldyBieXRlW0JBU0VMRU5HVEhdOworICAgIHN0YXRpYyBwcml2YXRlIGJ5dGUgW10gbG9va1VwQmFzZTY0QWxwaGFiZXQgPSBuZXcgYnl0ZVtMT09LVVBMRU5HVEhdOworICAgIC8vc3RhdGljIHByaXZhdGUgZmluYWwgTG9nIGxvZyA9IExvZ1NvdXJjZS5nZXRJbnN0YW5jZSgib3JnLmFwYWNoZS5jb21tb25zLnV0aWwuQmFzZTY0Iik7CisKKyAgICBzdGF0aWMKKyAgICB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQkFTRUxFTkdUSDsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgYmFzZTY0QWxwaGFiZXRbaV0gPSAtMTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gJ1onOyBpID49ICdBJzsgaS0tKQorICAgICAgICB7CisgICAgICAgICAgICBiYXNlNjRBbHBoYWJldFtpXSA9IChieXRlKSAoaSAtICdBJyk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9ICd6JzsgaT49ICdhJzsgaS0tKQorICAgICAgICB7CisgICAgICAgICAgICBiYXNlNjRBbHBoYWJldFtpXSA9IChieXRlKSAoaSAtICdhJyArIDI2KTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gJzknOyBpID49ICcwJzsgaS0tKQorICAgICAgICB7CisgICAgICAgICAgICBiYXNlNjRBbHBoYWJldFtpXSA9IChieXRlKSAoaSAtICcwJyArIDUyKTsKKyAgICAgICAgfQorCisgICAgICAgIGJhc2U2NEFscGhhYmV0WycrJ10gID0gNjI7CisgICAgICAgIGJhc2U2NEFscGhhYmV0WycvJ10gID0gNjM7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPD0gMjU7IGkrKyApCisgICAgICAgICAgICBsb29rVXBCYXNlNjRBbHBoYWJldFtpXSA9IChieXRlKSAoJ0EnICsgaSk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDI2LCAgaiA9IDA7IGkgPD0gNTE7IGkrKywgaisrICkKKyAgICAgICAgICAgIGxvb2tVcEJhc2U2NEFscGhhYmV0W2ldID0gKGJ5dGUpICgnYScrIGopOworCisgICAgICAgIGZvciAoaW50IGkgPSA1MiwgIGogPSAwOyBpIDw9IDYxOyBpKyssIGorKyApCisgICAgICAgICAgICBsb29rVXBCYXNlNjRBbHBoYWJldFtpXSA9IChieXRlKSAoJzAnICsgaik7CisKKyAgICAgICAgbG9va1VwQmFzZTY0QWxwaGFiZXRbNjJdID0gKGJ5dGUpICcrJzsKKyAgICAgICAgbG9va1VwQmFzZTY0QWxwaGFiZXRbNjNdID0gKGJ5dGUpICcvJzsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNCYXNlNjQoIFN0cmluZyBpc1ZhbGlkU3RyaW5nICkKKyAgICB7CisgICAgICAgIHJldHVybiBpc0FycmF5Qnl0ZUJhc2U2NChpc1ZhbGlkU3RyaW5nLmdldEJ5dGVzKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0Jhc2U2NCggYnl0ZSBvY3RlY3QgKQorICAgIHsKKyAgICAgICAgLy9zaGFsbCB3ZSBpZ25vcmUgd2hpdGUgc3BhY2U/IEpFRkY/PworICAgICAgICByZXR1cm4gKG9jdGVjdCA9PSBQQUQgfHwgYmFzZTY0QWxwaGFiZXRbb2N0ZWN0XSAhPSAtMSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQXJyYXlCeXRlQmFzZTY0KCBieXRlW10gYXJyYXlPY3RlY3QgKQorICAgIHsKKyAgICAgICAgaW50IGxlbmd0aCA9IGFycmF5T2N0ZWN0Lmxlbmd0aDsKKyAgICAgICAgaWYgKGxlbmd0aCA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBzaG91bGRuJ3QgYSAwIGxlbmd0aCBhcnJheSBiZSB2YWxpZCBiYXNlNjQgZGF0YT8KKyAgICAgICAgICAgIC8vIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGk9MDsgaSA8IGxlbmd0aDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoICFCYXNlNjQuaXNCYXNlNjQoYXJyYXlPY3RlY3RbaV0pICkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5jb2RlcyBoZXggb2N0ZWN0cyBpbnRvIEJhc2U2NC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiaW5hcnlEYXRhIEFycmF5IGNvbnRhaW5pbmcgYmluYXJ5IGRhdGEgdG8gZW5jb2RlLgorICAgICAqIEByZXR1cm4gQmFzZTY0LWVuY29kZWQgZGF0YS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBlbmNvZGUoIGJ5dGVbXSBiaW5hcnlEYXRhICkKKyAgICB7CisgICAgICAgIGludCAgICAgIGxlbmd0aERhdGFCaXRzICAgID0gYmluYXJ5RGF0YS5sZW5ndGgqRUlHSFRCSVQ7CisgICAgICAgIGludCAgICAgIGZld2VyVGhhbjI0Yml0cyAgID0gbGVuZ3RoRGF0YUJpdHMlVFdFTlRZRk9VUkJJVEdST1VQOworICAgICAgICBpbnQgICAgICBudW1iZXJUcmlwbGV0cyAgICA9IGxlbmd0aERhdGFCaXRzL1RXRU5UWUZPVVJCSVRHUk9VUDsKKyAgICAgICAgYnl0ZSAgICAgZW5jb2RlZERhdGFbXSAgICAgPSBudWxsOworCisKKyAgICAgICAgaWYgKGZld2VyVGhhbjI0Yml0cyAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICAvL2RhdGEgbm90IGRpdmlzaWJsZSBieSAyNCBiaXQKKyAgICAgICAgICAgIGVuY29kZWREYXRhID0gbmV3IGJ5dGVbIChudW1iZXJUcmlwbGV0cyArIDEgKSAqIDQgXTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIDE2IG9yIDggYml0CisgICAgICAgICAgICBlbmNvZGVkRGF0YSA9IG5ldyBieXRlWyBudW1iZXJUcmlwbGV0cyAqIDQgXTsKKyAgICAgICAgfQorCisgICAgICAgIGJ5dGUgayA9IDAsIGwgPSAwLCBiMSA9IDAsIGIyID0gMCwgYjMgPSAwOworCisgICAgICAgIGludCBlbmNvZGVkSW5kZXggPSAwOworICAgICAgICBpbnQgZGF0YUluZGV4ICAgPSAwOworICAgICAgICBpbnQgaSAgICAgICAgICAgPSAwOworICAgICAgICAvL2xvZy5kZWJ1ZygibnVtYmVyIG9mIHRyaXBsZXRzID0gIiArIG51bWJlclRyaXBsZXRzKTsKKyAgICAgICAgZm9yICggaSA9IDA7IGk8bnVtYmVyVHJpcGxldHM7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGRhdGFJbmRleCA9IGkqMzsKKyAgICAgICAgICAgIGIxID0gYmluYXJ5RGF0YVtkYXRhSW5kZXhdOworICAgICAgICAgICAgYjIgPSBiaW5hcnlEYXRhW2RhdGFJbmRleCArIDFdOworICAgICAgICAgICAgYjMgPSBiaW5hcnlEYXRhW2RhdGFJbmRleCArIDJdOworCisgICAgICAgICAgICAvL2xvZy5kZWJ1ZygiYjE9ICIgKyBiMSArIiwgYjI9ICIgKyBiMiArICIsIGIzPSAiICsgYjMpOworCisgICAgICAgICAgICBsICA9IChieXRlKShiMiAmIDB4MGYpOworICAgICAgICAgICAgayAgPSAoYnl0ZSkoYjEgJiAweDAzKTsKKworICAgICAgICAgICAgZW5jb2RlZEluZGV4ID0gaSAqIDQ7CisgICAgICAgICAgICBieXRlIHZhbDEgPSAoKGIxICYgU0lHTik9PTApPyhieXRlKShiMT4+Mik6KGJ5dGUpKChiMSk+PjJeMHhjMCk7CisgICAgICAgICAgICBieXRlIHZhbDIgPSAoKGIyICYgU0lHTik9PTApPyhieXRlKShiMj4+NCk6KGJ5dGUpKChiMik+PjReMHhmMCk7CisgICAgICAgICAgICBieXRlIHZhbDMgPSAoKGIzICYgU0lHTik9PTApPyhieXRlKShiMz4+Nik6KGJ5dGUpKChiMyk+PjZeMHhmYyk7CisKKyAgICAgICAgICAgIGVuY29kZWREYXRhW2VuY29kZWRJbmRleF0gICA9IGxvb2tVcEJhc2U2NEFscGhhYmV0WyB2YWwxIF07CisgICAgICAgICAgICAvL2xvZy5kZWJ1ZyggInZhbDIgPSAiICsgdmFsMiApOworICAgICAgICAgICAgLy9sb2cuZGVidWcoICJrNCAgID0gIiArIChrPDw0KSApOworICAgICAgICAgICAgLy9sb2cuZGVidWcoICAidmFrICA9ICIgKyAodmFsMiB8IChrPDw0KSkgKTsKKyAgICAgICAgICAgIGVuY29kZWREYXRhW2VuY29kZWRJbmRleCsxXSA9CisgICAgICAgICAgICAgICAgbG9va1VwQmFzZTY0QWxwaGFiZXRbIHZhbDIgfCAoIGs8PDQgKV07CisgICAgICAgICAgICBlbmNvZGVkRGF0YVtlbmNvZGVkSW5kZXgrMl0gPQorICAgICAgICAgICAgICAgIGxvb2tVcEJhc2U2NEFscGhhYmV0WyAobCA8PDIgKSB8IHZhbDMgXTsKKyAgICAgICAgICAgIGVuY29kZWREYXRhW2VuY29kZWRJbmRleCszXSA9IGxvb2tVcEJhc2U2NEFscGhhYmV0WyBiMyAmIDB4M2YgXTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGZvcm0gaW50ZWdyYWwgbnVtYmVyIG9mIDYtYml0IGdyb3VwcworICAgICAgICBkYXRhSW5kZXggICAgPSBpKjM7CisgICAgICAgIGVuY29kZWRJbmRleCA9IGkqNDsKKyAgICAgICAgaWYgKGZld2VyVGhhbjI0Yml0cyA9PSBFSUdIVEJJVCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGIxID0gYmluYXJ5RGF0YVtkYXRhSW5kZXhdOworICAgICAgICAgICAgayA9IChieXRlKSAoIGIxICYweDAzICk7CisgICAgICAgICAgICAvL2xvZy5kZWJ1ZygiYjE9IiArIGIxKTsKKyAgICAgICAgICAgIC8vbG9nLmRlYnVnKCJiMTw8MiA9ICIgKyAoYjE+PjIpICk7CisgICAgICAgICAgICBieXRlIHZhbDEgPSAoKGIxICYgU0lHTik9PTApPyhieXRlKShiMT4+Mik6KGJ5dGUpKChiMSk+PjJeMHhjMCk7CisgICAgICAgICAgICBlbmNvZGVkRGF0YVtlbmNvZGVkSW5kZXhdICAgICA9IGxvb2tVcEJhc2U2NEFscGhhYmV0WyB2YWwxIF07CisgICAgICAgICAgICBlbmNvZGVkRGF0YVtlbmNvZGVkSW5kZXggKyAxXSA9IGxvb2tVcEJhc2U2NEFscGhhYmV0WyBrPDw0IF07CisgICAgICAgICAgICBlbmNvZGVkRGF0YVtlbmNvZGVkSW5kZXggKyAyXSA9IFBBRDsKKyAgICAgICAgICAgIGVuY29kZWREYXRhW2VuY29kZWRJbmRleCArIDNdID0gUEFEOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGZld2VyVGhhbjI0Yml0cyA9PSBTSVhURUVOQklUKQorICAgICAgICB7CisKKyAgICAgICAgICAgIGIxID0gYmluYXJ5RGF0YVtkYXRhSW5kZXhdOworICAgICAgICAgICAgYjIgPSBiaW5hcnlEYXRhW2RhdGFJbmRleCArMSBdOworICAgICAgICAgICAgbCA9IChieXRlKSAoYjIgJiAweDBmKTsKKyAgICAgICAgICAgIGsgPSAoYnl0ZSkgKGIxICYgMHgwMyk7CisKKyAgICAgICAgICAgIGJ5dGUgdmFsMSA9ICgoYjEgJiBTSUdOKSA9PSAwKT8oYnl0ZSkoYjE+PjIpOihieXRlKSgoYjEpPj4yXjB4YzApOworICAgICAgICAgICAgYnl0ZSB2YWwyID0gKChiMiAmIFNJR04pID09IDApPyhieXRlKShiMj4+NCk6KGJ5dGUpKChiMik+PjReMHhmMCk7CisKKyAgICAgICAgICAgIGVuY29kZWREYXRhW2VuY29kZWRJbmRleF0gICAgID0gbG9va1VwQmFzZTY0QWxwaGFiZXRbIHZhbDEgXTsKKyAgICAgICAgICAgIGVuY29kZWREYXRhW2VuY29kZWRJbmRleCArIDFdID0KKyAgICAgICAgICAgICAgICBsb29rVXBCYXNlNjRBbHBoYWJldFsgdmFsMiB8ICggazw8NCApXTsKKyAgICAgICAgICAgIGVuY29kZWREYXRhW2VuY29kZWRJbmRleCArIDJdID0gbG9va1VwQmFzZTY0QWxwaGFiZXRbIGw8PDIgXTsKKyAgICAgICAgICAgIGVuY29kZWREYXRhW2VuY29kZWRJbmRleCArIDNdID0gUEFEOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGVuY29kZWREYXRhOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlY29kZXMgQmFzZTY0IGRhdGEgaW50byBvY3RlY3RzCisgICAgICoKKyAgICAgKiBAcGFyYW0gYmFzZTY0RGF0YUJDIEJ5dGUgYXJyYXkgY29udGFpbmluZyBCYXNlNjQgZGF0YQorICAgICAqIEBwYXJhbSBkZWNvZGVkRGF0YUNDIFRoZSBkZWNvZGVkIGRhdGEgY2hhcnMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVjb2RlKCBCeXRlQ2h1bmsgYmFzZTY0RGF0YUJDLCBDaGFyQ2h1bmsgZGVjb2RlZERhdGFDQykKKyAgICB7CisgICAgICAgIGludCBzdGFydCA9IGJhc2U2NERhdGFCQy5nZXRTdGFydCgpOworICAgICAgICBpbnQgZW5kID0gYmFzZTY0RGF0YUJDLmdldEVuZCgpOworICAgICAgICBieXRlW10gYmFzZTY0RGF0YSA9IGJhc2U2NERhdGFCQy5nZXRCdWZmZXIoKTsKKyAgICAgICAgCisgICAgICAgIGRlY29kZWREYXRhQ0MucmVjeWNsZSgpOworICAgICAgICAKKyAgICAgICAgLy8gaGFuZGxlIHRoZSBlZGdlIGNhc2UsIHNvIHdlIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgaXQgbGF0ZXIKKyAgICAgICAgaWYoZW5kIC0gc3RhcnQgPT0gMCkgeyByZXR1cm47IH0KKworICAgICAgICBpbnQgICAgICBudW1iZXJRdWFkcnVwbGUgICAgPSAoZW5kIC0gc3RhcnQpL0ZPVVJCWVRFOworICAgICAgICBieXRlICAgICBiMT0wLGIyPTAsYjM9MCwgYjQ9MCwgbWFya2VyMD0wLCBtYXJrZXIxPTA7CisKKyAgICAgICAgLy8gVGhyb3cgYXdheSBhbnl0aGluZyBub3QgaW4gYmFzZTY0RGF0YQorCisgICAgICAgIGludCBlbmNvZGVkSW5kZXggPSAwOworICAgICAgICBpbnQgZGF0YUluZGV4ID0gc3RhcnQ7CisgICAgICAgIGNoYXJbXSBkZWNvZGVkRGF0YSA9IG51bGw7CisgICAgICAgIAorICAgICAgICB7CisgICAgICAgICAgICAvLyB0aGlzIHNpemVzIHRoZSBvdXRwdXQgYXJyYXkgcHJvcGVybHkgLSBybHcKKyAgICAgICAgICAgIGludCBsYXN0RGF0YSA9IGVuZCAtIHN0YXJ0OworICAgICAgICAgICAgLy8gaWdub3JlIHRoZSAnPScgcGFkZGluZworICAgICAgICAgICAgd2hpbGUgKGJhc2U2NERhdGFbc3RhcnQrbGFzdERhdGEtMV0gPT0gUEFEKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgtLWxhc3REYXRhID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVjb2RlZERhdGFDQy5hbGxvY2F0ZShsYXN0RGF0YSAtIG51bWJlclF1YWRydXBsZSwgLTEpOworICAgICAgICAgICAgZGVjb2RlZERhdGFDQy5zZXRFbmQobGFzdERhdGEgLSBudW1iZXJRdWFkcnVwbGUpOworICAgICAgICAgICAgZGVjb2RlZERhdGEgPSBkZWNvZGVkRGF0YUNDLmdldEJ1ZmZlcigpOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXJRdWFkcnVwbGU7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgZGF0YUluZGV4ID0gc3RhcnQgKyBpICogNDsKKyAgICAgICAgICAgIG1hcmtlcjAgICA9IGJhc2U2NERhdGFbZGF0YUluZGV4ICsgMl07CisgICAgICAgICAgICBtYXJrZXIxICAgPSBiYXNlNjREYXRhW2RhdGFJbmRleCArIDNdOworCisgICAgICAgICAgICBiMSA9IGJhc2U2NEFscGhhYmV0W2Jhc2U2NERhdGFbZGF0YUluZGV4XV07CisgICAgICAgICAgICBiMiA9IGJhc2U2NEFscGhhYmV0W2Jhc2U2NERhdGFbZGF0YUluZGV4ICsxXV07CisKKyAgICAgICAgICAgIGlmIChtYXJrZXIwICE9IFBBRCAmJiBtYXJrZXIxICE9IFBBRCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL05vIFBBRCBlLmcgM2NRbAorICAgICAgICAgICAgICAgIGIzID0gYmFzZTY0QWxwaGFiZXRbIG1hcmtlcjAgXTsKKyAgICAgICAgICAgICAgICBiNCA9IGJhc2U2NEFscGhhYmV0WyBtYXJrZXIxIF07CisKKyAgICAgICAgICAgICAgICBkZWNvZGVkRGF0YVtlbmNvZGVkSW5kZXhdICAgPSAoY2hhcikgKCggIGIxIDw8MiB8IGIyPj40ICkgJiAweGZmKTsKKyAgICAgICAgICAgICAgICBkZWNvZGVkRGF0YVtlbmNvZGVkSW5kZXggKyAxXSA9CisgICAgICAgICAgICAgICAgICAgIChjaGFyKSAoKCgoYjIgJiAweGYpPDw0ICkgfCggKGIzPj4yKSAmIDB4ZikgKSAmIDB4ZmYpOworICAgICAgICAgICAgICAgIGRlY29kZWREYXRhW2VuY29kZWRJbmRleCArIDJdID0gKGNoYXIpICgoIGIzPDw2IHwgYjQgKSAmIDB4ZmYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAobWFya2VyMCA9PSBQQUQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9Ud28gUEFEIGUuZy4gM2NbUGFkXVtQYWRdCisgICAgICAgICAgICAgICAgZGVjb2RlZERhdGFbZW5jb2RlZEluZGV4XSAgID0gKGNoYXIpICgoICBiMSA8PDIgfCBiMj4+NCApICYgMHhmZik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChtYXJrZXIxID09IFBBRCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL09uZSBQQUQgZS5nLiAzY1FbUGFkXQorICAgICAgICAgICAgICAgIGIzID0gYmFzZTY0QWxwaGFiZXRbIG1hcmtlcjAgXTsKKworICAgICAgICAgICAgICAgIGRlY29kZWREYXRhW2VuY29kZWRJbmRleF0gICA9IChjaGFyKSAoKCAgYjEgPDwyIHwgYjI+PjQgKSAmIDB4ZmYpOworICAgICAgICAgICAgICAgIGRlY29kZWREYXRhW2VuY29kZWRJbmRleCArIDFdID0KKyAgICAgICAgICAgICAgICAgICAgKGNoYXIpICgoKChiMiAmIDB4Zik8PDQgKSB8KCAoYjM+PjIpICYgMHhmKSApICYgMHhmZik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbmNvZGVkSW5kZXggKz0gMzsKKyAgICAgICAgfQorICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9DR0lQcm9jZXNzRW52aXJvbm1lbnQuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL0NHSVByb2Nlc3NFbnZpcm9ubWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiOTQxZTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9DR0lQcm9jZXNzRW52aXJvbm1lbnQuamF2YQpAQCAtMCwwICsxLDQ0OCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEubmV0LlVSTEVuY29kZXI7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKKworCisvKioKKyAqIEVuY2Fwc3VsYXRlcyB0aGUgQ0dJIFByb2Nlc3MnIGVudmlyb25tZW50IGFuZCBydWxlcyB0byBkZXJpdmUKKyAqIHRoYXQgZW52aXJvbm1lbnQgZnJvbSB0aGUgc2VydmxldCBjb250YWluZXIgYW5kIHJlcXVlc3QgaW5mb3JtYXRpb24uCisgKiBAYXV0aG9yICAgTWFydGluIERlbmdsZXIgW3Jvb3RAbWFydGluZGVuZ2xlci5jb21dCisgKiBAdmVyc2lvbiAgJFJldmlzaW9uJCwgJERhdGUkCisgKiBAc2luY2UgICAgVG9tY2F0IDQuMAorICovCisKK3B1YmxpYyBjbGFzcyBDR0lQcm9jZXNzRW52aXJvbm1lbnQgZXh0ZW5kcyBQcm9jZXNzRW52aXJvbm1lbnQgeworICAgIAorICAgIAorICAgIHByaXZhdGUgc3RhdGljIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZyBsb2c9CisgICAgICAgIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3RvcnkuZ2V0TG9nKCBDR0lQcm9jZXNzRW52aXJvbm1lbnQuY2xhc3MgKTsKKyAgICAKKyAgICAvKiogY2dpIGNvbW1hbmQncyBxdWVyeSBwYXJhbWV0ZXJzICovCisgICAgcHJpdmF0ZSBIYXNodGFibGUgcXVlcnlQYXJhbWV0ZXJzID0gbnVsbDsKKworICAgIC8qKgorICAgICAqICBUaGUgQ0dJIHNlYXJjaCBwYXRoIHdpbGwgc3RhcnQgYXQKKyAgICAgKiAgICB3ZWJBcHBSb290RGlyICsgRmlsZS5zZXBhcmF0b3IgKyBjZ2lQYXRoUHJlZml4CisgICAgICogICAgKG9yIHdlYkFwcFJvb3REaXIgYWxvbmUgaWYgY2dpUGF0aFByZWZpeCBpcworICAgICAqICAgIG51bGwpCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgY2dpUGF0aFByZWZpeCA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBQcm9jZXNzRW52aXJvbm1lbnQgYW5kIGRlcml2ZXMgdGhlIG5lY2Vzc2FyeSBlbnZpcm9ubWVudCwKKyAgICAgKiB3b3JraW5nIGRpcmVjdG9yeSwgY29tbWFuZCwgZXRjLiAgVGhlIGNnaSBwYXRoIHByZWZpeCBpcyBpbml0aWFsaXplZAorICAgICAqIHRvICIiICh0aGUgZW1wdHkgc3RyaW5nKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgcmVxICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCBmb3IgaW5mb3JtYXRpb24gcHJvdmlkZWQgYnkKKyAgICAgKiAgICAgICAgICAgICAgICAgICB0aGUgU2VydmxldCBBUEkKKyAgICAgKiBAcGFyYW0gIGNvbnRleHQgICBTZXJ2bGV0Q29udGV4dCBmb3IgaW5mb3JtYXRpb24gcHJvdmlkZWQgYnkKKyAgICAgKiAgICAgICAgICAgICAgICAgICB0aGUgU2VydmxldCBBUEkKKyAgICAgKi8KKyAgICBwdWJsaWMgQ0dJUHJvY2Vzc0Vudmlyb25tZW50KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsCisgICAgICAgIFNlcnZsZXRDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIHRoaXMocmVxLCBjb250ZXh0LCAiIik7CisgICAgfQorCisKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBQcm9jZXNzRW52aXJvbm1lbnQgYW5kIGRlcml2ZXMgdGhlIG5lY2Vzc2FyeSBlbnZpcm9ubWVudCwKKyAgICAgKiB3b3JraW5nIGRpcmVjdG9yeSwgY29tbWFuZCwgZXRjLgorICAgICAqIEBwYXJhbSByZXEgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IGZvciBpbmZvcm1hdGlvbiBwcm92aWRlZCBieQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgdGhlIFNlcnZsZXQgQVBJCisgICAgICogQHBhcmFtIGNvbnRleHQgICAgICAgICBTZXJ2bGV0Q29udGV4dCBmb3IgaW5mb3JtYXRpb24gcHJvdmlkZWQgYnkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBTZXJ2bGV0IEFQSQorICAgICAqIEBwYXJhbSBjZ2lQYXRoUHJlZml4ICAgc3ViZGlyZWN0b3J5IG9mIHdlYkFwcFJvb3REaXIgYmVsb3cgd2hpY2ggdGhlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICB3ZWIgYXBwJ3MgQ0dJcyBtYXkgYmUgc3RvcmVkOyBjYW4gYmUgbnVsbCBvciAiIi4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ0dJUHJvY2Vzc0Vudmlyb25tZW50KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsCisgICAgICAgIFNlcnZsZXRDb250ZXh0IGNvbnRleHQsIFN0cmluZyBjZ2lQYXRoUHJlZml4KSB7CisgICAgICAgICAgICB0aGlzKHJlcSwgY29udGV4dCwgY2dpUGF0aFByZWZpeCwgMCk7CisgICAgfQorCisKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBQcm9jZXNzRW52aXJvbm1lbnQgYW5kIGRlcml2ZXMgdGhlIG5lY2Vzc2FyeSBlbnZpcm9ubWVudCwKKyAgICAgKiB3b3JraW5nIGRpcmVjdG9yeSwgY29tbWFuZCwgZXRjLgorICAgICAqIEBwYXJhbSByZXEgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IGZvciBpbmZvcm1hdGlvbiBwcm92aWRlZCBieQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgdGhlIFNlcnZsZXQgQVBJCisgICAgICogQHBhcmFtIGNvbnRleHQgICAgICAgICBTZXJ2bGV0Q29udGV4dCBmb3IgaW5mb3JtYXRpb24gcHJvdmlkZWQgYnkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBTZXJ2bGV0IEFQSQorICAgICAqIEBwYXJhbSAgZGVidWcgICAgICAgICAgaW50IGRlYnVnIGxldmVsICgwID09IG5vbmUsIDYgPT0gbG90cykKKyAgICAgKi8KKyAgICBwdWJsaWMgQ0dJUHJvY2Vzc0Vudmlyb25tZW50KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsCisgICAgICAgIFNlcnZsZXRDb250ZXh0IGNvbnRleHQsIGludCBkZWJ1ZykgeworICAgICAgICAgICAgdGhpcyhyZXEsIGNvbnRleHQsICIiLCAwKTsKKyAgICB9CisKKworCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgUHJvY2Vzc0Vudmlyb25tZW50IGFuZCBkZXJpdmVzIHRoZSBuZWNlc3NhcnkgZW52aXJvbm1lbnQsCisgICAgICogd29ya2luZyBkaXJlY3RvcnksIGNvbW1hbmQsIGV0Yy4KKyAgICAgKiBAcGFyYW0gcmVxICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCBmb3IgaW5mb3JtYXRpb24gcHJvdmlkZWQgYnkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBTZXJ2bGV0IEFQSQorICAgICAqIEBwYXJhbSBjb250ZXh0ICAgICAgICAgU2VydmxldENvbnRleHQgZm9yIGluZm9ybWF0aW9uIHByb3ZpZGVkIGJ5CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICB0aGUgU2VydmxldCBBUEkKKyAgICAgKiBAcGFyYW0gY2dpUGF0aFByZWZpeCAgIHN1YmRpcmVjdG9yeSBvZiB3ZWJBcHBSb290RGlyIGJlbG93IHdoaWNoIHRoZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgd2ViIGFwcCdzIENHSXMgbWF5IGJlIHN0b3JlZDsgY2FuIGJlIG51bGwgb3IgIiIuCisgICAgICogQHBhcmFtICBkZWJ1ZyAgICAgICAgICBpbnQgZGVidWcgbGV2ZWwgKDAgPT0gbm9uZSwgNiA9PSBsb3RzKQorICAgICAqLworICAgIHB1YmxpYyBDR0lQcm9jZXNzRW52aXJvbm1lbnQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwKKyAgICAgICAgU2VydmxldENvbnRleHQgY29udGV4dCwgU3RyaW5nIGNnaVBhdGhQcmVmaXgsIGludCBkZWJ1ZykgeworICAgICAgICAgICAgc3VwZXIocmVxLCBjb250ZXh0LCBkZWJ1Zyk7CisgICAgICAgICAgICB0aGlzLmNnaVBhdGhQcmVmaXggPSBjZ2lQYXRoUHJlZml4OworICAgICAgICAgICAgcXVlcnlQYXJhbWV0ZXJzID0gbmV3IEhhc2h0YWJsZSgpOworICAgICAgICAgICAgRW51bWVyYXRpb24gcGFyYW1OYW1lcyA9IHJlcS5nZXRQYXJhbWV0ZXJOYW1lcygpOworICAgICAgICAgICAgd2hpbGUgKHBhcmFtTmFtZXMgIT0gbnVsbCAmJiBwYXJhbU5hbWVzLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHBhcmFtID0gcGFyYW1OYW1lcy5uZXh0RWxlbWVudCgpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgaWYgKHBhcmFtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcXVlcnlQYXJhbWV0ZXJzLnB1dChwYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHJlcS5nZXRQYXJhbWV0ZXIocGFyYW0pKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhpcy52YWxpZCA9IGRlcml2ZVByb2Nlc3NFbnZpcm9ubWVudChyZXEpOworICAgIH0KKworCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIHRoZSBDR0kgZW52aXJvbm1lbnQgdG8gYmUgc3VwcGxpZWQgdG8gdGhlIGludm9rZWQgQ0dJCisgICAgICogc2NyaXB0OyByZWxpZXMgaGVhdmxpeSBvbiBTZXJ2bGV0IEFQSSBtZXRob2RzIGFuZCBmaW5kQ0dJCisgICAgICogQHBhcmFtICAgIHJlcSByZXF1ZXN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgQ0dJIGludm9rYXRpb24KKyAgICAgKiBAcmV0dXJuICAgdHJ1ZSBpZiBlbnZpcm9ubWVudCB3YXMgc2V0IE9LLCBmYWxzZSBpZiB0aGVyZSB3YXMgYSBwcm9ibGVtCisgICAgICogICAgICAgICAgIGFuZCBubyBlbnZpcm9ubWVudCB3YXMgc2V0CisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gZGVyaXZlUHJvY2Vzc0Vudmlyb25tZW50KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEpIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogVGhpcyBtZXRob2QgaXMgc2xpZ2h0bHkgdWdseTsgYydlc3QgbGEgdmllLgorICAgICAgICAgKiAiWW91IGNhbm5vdCBzdG9wIFt1Z2xpbmVzc10sIHlvdSBjYW4gb25seSBob3BlIHRvIGNvbnRhaW4gW2l0XSIKKyAgICAgICAgICogKGFwb2xvZ2llcyB0byBNYXJ2IEFsYmVydCByZWdhcmRpbmcgTUopCisgICAgICAgICAqLworCisgICAgICAgIEhhc2h0YWJsZSBlbnZwOworICAgICAgICBzdXBlci5kZXJpdmVQcm9jZXNzRW52aXJvbm1lbnQocmVxKTsKKyAgICAgICAgZW52cCA9IGdldEVudmlyb25tZW50KCk7CisKKyAgICAgICAgU3RyaW5nIHNQYXRoSW5mb09yaWcgPSBudWxsOworICAgICAgICBTdHJpbmcgc1BhdGhUcmFuc2xhdGVkT3JpZyA9IG51bGw7CisgICAgICAgIFN0cmluZyBzUGF0aEluZm9DR0kgPSBudWxsOworICAgICAgICBTdHJpbmcgc1BhdGhUcmFuc2xhdGVkQ0dJID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIHNDR0lGdWxsUGF0aCA9IG51bGw7CisgICAgICAgIFN0cmluZyBzQ0dJU2NyaXB0TmFtZSA9IG51bGw7CisgICAgICAgIFN0cmluZyBzQ0dJRnVsbE5hbWUgPSBudWxsOworICAgICAgICBTdHJpbmcgc0NHSU5hbWUgPSBudWxsOworICAgICAgICBTdHJpbmdbXSBzQ0dJTmFtZXM7CisgICAgICAgIHNQYXRoSW5mb09yaWcgPSB0aGlzLnBhdGhJbmZvOworICAgICAgICBzUGF0aEluZm9PcmlnID0gc1BhdGhJbmZvT3JpZyA9PSBudWxsID8gIiIgOiBzUGF0aEluZm9PcmlnOworICAgICAgICBzUGF0aFRyYW5zbGF0ZWRPcmlnID0gcmVxLmdldFBhdGhUcmFuc2xhdGVkKCk7CisgICAgICAgIHNQYXRoVHJhbnNsYXRlZE9yaWcgPSBzUGF0aFRyYW5zbGF0ZWRPcmlnID09IG51bGwgPyAiIiA6CisgICAgICAgICAgICBzUGF0aFRyYW5zbGF0ZWRPcmlnOworICAgICAgICAgICAgc0NHSU5hbWVzID0KKyAgICAgICAgICAgICAgICBmaW5kQ0dJKHNQYXRoSW5mb09yaWcsIGdldFdlYkFwcFJvb3REaXIoKSwgZ2V0Q29udGV4dFBhdGgoKSwKKyAgICAgICAgICAgICAgICBnZXRTZXJ2bGV0UGF0aCgpLCBjZ2lQYXRoUHJlZml4KTsKKyAgICAgICAgc0NHSUZ1bGxQYXRoID0gc0NHSU5hbWVzWzBdOworICAgICAgICBzQ0dJU2NyaXB0TmFtZSA9IHNDR0lOYW1lc1sxXTsKKyAgICAgICAgc0NHSUZ1bGxOYW1lID0gc0NHSU5hbWVzWzJdOworICAgICAgICBzQ0dJTmFtZSA9IHNDR0lOYW1lc1szXTsKKyAgICAgICAgaWYgKHNDR0lGdWxsUGF0aCA9PSBudWxsIHx8IHNDR0lTY3JpcHROYW1lID09IG51bGwKKyAgICAgICAgICAgIHx8IHNDR0lGdWxsTmFtZSA9PSBudWxsIHx8IHNDR0lOYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZW52cC5wdXQoIlNFUlZFUl9TT0ZUV0FSRSIsICJUT01DQVQiKTsKKyAgICAgICAgZW52cC5wdXQoIlNFUlZFUl9OQU1FIiwgbnVsbHNUb0JsYW5rcyhyZXEuZ2V0U2VydmVyTmFtZSgpKSk7CisgICAgICAgIGVudnAucHV0KCJHQVRFV0FZX0lOVEVSRkFDRSIsICJDR0kvMS4xIik7CisgICAgICAgIGVudnAucHV0KCJTRVJWRVJfUFJPVE9DT0wiLCBudWxsc1RvQmxhbmtzKHJlcS5nZXRQcm90b2NvbCgpKSk7CisgICAgICAgIGludCBwb3J0ID0gcmVxLmdldFNlcnZlclBvcnQoKTsKKyAgICAgICAgSW50ZWdlciBpUG9ydCA9IChwb3J0ID09IDAgPyBuZXcgSW50ZWdlcigtMSkgOiBuZXcgSW50ZWdlcihwb3J0KSk7CisgICAgICAgIGVudnAucHV0KCJTRVJWRVJfUE9SVCIsIGlQb3J0LnRvU3RyaW5nKCkpOworICAgICAgICBlbnZwLnB1dCgiUkVRVUVTVF9NRVRIT0QiLCBudWxsc1RvQmxhbmtzKHJlcS5nZXRNZXRob2QoKSkpOworCisgICAgICAgIC8qLQorICAgICAgICAqIFBBVEhfSU5GTyBzaG91bGQgYmUgZGV0ZXJtaW5lZCBieSB1c2luZyBzQ0dJRnVsbE5hbWU6CisgICAgICAgICogMSkgTGV0IHNDR0lGdWxsTmFtZSBub3QgZW5kIGluIGEgIi8iIChzZWUgbWV0aG9kIGZpbmRDR0kpCisgICAgICAgICogMikgTGV0IHNDR0lGdWxsTmFtZSBlcXVhbCB0aGUgcGF0aEluZm8gZnJhZ21lbnQgd2hpY2gKKyAgICAgICAgKiAgICBjb3JyZXNwb25kcyB0byB0aGUgYWN0dWFsIGNnaSBzY3JpcHQuCisgICAgICAgICogMykgVGh1cywgUEFUSF9JTkZPID0gcmVxdWVzdC5nZXRQYXRoSW5mbygpLnN1YnN0cmluZygKKyAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICBzQ0dJRnVsbE5hbWUubGVuZ3RoKCkpCisgICAgICAgICoKKyAgICAgICAgKiAoc2VlIG1ldGhvZCBmaW5kQ0dJLCB3aGVyZSB0aGUgcmVhbCB3b3JrIGlzIGRvbmUpCisgICAgICAgICoKKyAgICAgICAgKi8KKworICAgICAgICBpZiAocGF0aEluZm8gPT0gbnVsbCB8fAorICAgICAgICAgICAgKHBhdGhJbmZvLnN1YnN0cmluZyhzQ0dJRnVsbE5hbWUubGVuZ3RoKCkpLmxlbmd0aCgpIDw9IDApKSB7CisgICAgICAgICAgICAgICAgc1BhdGhJbmZvQ0dJID0gIiI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzUGF0aEluZm9DR0kgPSBwYXRoSW5mby5zdWJzdHJpbmcoc0NHSUZ1bGxOYW1lLmxlbmd0aCgpKTsKKyAgICAgICAgfQorICAgICAgICBlbnZwLnB1dCgiUEFUSF9JTkZPIiwgc1BhdGhJbmZvQ0dJKTsKKworICAgICAgICAvKi0KKyAgICAgICAgKiBQQVRIX1RSQU5TTEFURUQgbXVzdCBiZSBkZXRlcm1pbmVkIGFmdGVyIFBBVEhfSU5GTyAoYW5kIHRoZQorICAgICAgICAqIGltcGxpZWQgcmVhbCBjZ2ktc2NyaXB0KSBoYXMgYmVlbiB0YWtlbiBpbnRvIGFjY291bnQuCisgICAgICAgICoKKyAgICAgICAgKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgZGVtb25zdHJhdGVzOgorICAgICAgICAqCisgICAgICAgICogc2VydmxldCBpbmZvICAgPSAvc2VydmxldC9jZ2lndy9kaXIxL2RpcjIvY2dpMS90cmFuczEvdHJhbnMyCisgICAgICAgICogY2dpZnVsbHBhdGggICAgPSAvc2VydmxldC9jZ2lndy9kaXIxL2RpcjIvY2dpMQorICAgICAgICAqIHBhdGhfaW5mbyAgICAgID0gL3RyYW5zMS90cmFuczIKKyAgICAgICAgKiB3ZWJBcHBSb290RGlyICA9IHNlcnZsZXRDb250ZXh0LmdldFJlYWxQYXRoKCIvIikKKyAgICAgICAgKgorICAgICAgICAqIHBhdGhfdHJhbnNsYXRlZCA9IHNlcnZsZXRDb250ZXh0LmdldFJlYWxQYXRoKCIvdHJhbnMxL3RyYW5zMiIpCisgICAgICAgICoKKyAgICAgICAgKiBUaGF0IGlzLCBQQVRIX1RSQU5TTEFURUQgPSB3ZWJBcHBSb290RGlyICsgc1BhdGhJbmZvQ0dJCisgICAgICAgICogKHVubGVzcyBzUGF0aEluZm9DR0kgaXMgbnVsbCBvciBibGFuaywgdGhlbiB0aGUgQ0dJCisgICAgICAgICogc3BlY2lmaWNhdGlvbiBkaWN0YXRlcyB0aGF0IHRoZSBQQVRIX1RSQU5TTEFURUQgbWV0YXZhcmlhYmxlCisgICAgICAgICogU0hPVUxEIE5PVCBiZSBkZWZpbmVkLgorICAgICAgICAqCisgICAgICAgICovCisKKyAgICAgICAgaWYgKHNQYXRoSW5mb0NHSSAhPSBudWxsICYmICEoIiIuZXF1YWxzKHNQYXRoSW5mb0NHSSkpKSB7CisgICAgICAgICAgICBzUGF0aFRyYW5zbGF0ZWRDR0kgPSBnZXRDb250ZXh0KCkuZ2V0UmVhbFBhdGgoc1BhdGhJbmZvQ0dJKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNQYXRoVHJhbnNsYXRlZENHSSA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNQYXRoVHJhbnNsYXRlZENHSSA9PSBudWxsIHx8ICIiLmVxdWFscyhzUGF0aFRyYW5zbGF0ZWRDR0kpKSB7CisgICAgICAgICAgICAvL05PT1AKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGVudnAucHV0KCJQQVRIX1RSQU5TTEFURUQiLCBudWxsc1RvQmxhbmtzKHNQYXRoVHJhbnNsYXRlZENHSSkpOworICAgICAgICB9CisgICAgICAgIGVudnAucHV0KCJTQ1JJUFRfTkFNRSIsIG51bGxzVG9CbGFua3Moc0NHSVNjcmlwdE5hbWUpKTsKKyAgICAgICAgZW52cC5wdXQoIlFVRVJZX1NUUklORyIsIG51bGxzVG9CbGFua3MocmVxLmdldFF1ZXJ5U3RyaW5nKCkpKTsKKyAgICAgICAgZW52cC5wdXQoIlJFTU9URV9IT1NUIiwgbnVsbHNUb0JsYW5rcyhyZXEuZ2V0UmVtb3RlSG9zdCgpKSk7CisgICAgICAgIGVudnAucHV0KCJSRU1PVEVfQUREUiIsIG51bGxzVG9CbGFua3MocmVxLmdldFJlbW90ZUFkZHIoKSkpOworICAgICAgICBlbnZwLnB1dCgiQVVUSF9UWVBFIiwgbnVsbHNUb0JsYW5rcyhyZXEuZ2V0QXV0aFR5cGUoKSkpOworICAgICAgICBlbnZwLnB1dCgiUkVNT1RFX1VTRVIiLCBudWxsc1RvQmxhbmtzKHJlcS5nZXRSZW1vdGVVc2VyKCkpKTsKKyAgICAgICAgZW52cC5wdXQoIlJFTU9URV9JREVOVCIsICIiKTsgLy9ub3QgbmVjZXNzYXJ5IGZvciBmdWxsIGNvbXBsaWFuY2UKKyAgICAgICAgZW52cC5wdXQoIkNPTlRFTlRfVFlQRSIsIG51bGxzVG9CbGFua3MocmVxLmdldENvbnRlbnRUeXBlKCkpKTsKKworICAgICAgICAvKiBOb3RlIENHSSBzcGVjIHNheXMgQ09OVEVOVF9MRU5HVEggbXVzdCBiZSBOVUxMICgiIikgb3IgdW5kZWZpbmVkCisgICAgICAgICogaWYgdGhlcmUgaXMgbm8gY29udGVudCwgc28gd2UgY2Fubm90IHB1dCAwIG9yIC0xIGluIGFzIHBlciB0aGUKKyAgICAgICAgKiBTZXJ2bGV0IEFQSSBzcGVjLgorICAgICAgICAqLworCisgICAgICAgIGludCBjb250ZW50TGVuZ3RoID0gcmVxLmdldENvbnRlbnRMZW5ndGgoKTsKKyAgICAgICAgU3RyaW5nIHNDb250ZW50TGVuZ3RoID0gKGNvbnRlbnRMZW5ndGggPD0gMCA/ICIiIDogKAorICAgICAgICAgICAgbmV3IEludGVnZXIoY29udGVudExlbmd0aCkpLnRvU3RyaW5nKCkpOworICAgICAgICBlbnZwLnB1dCgiQ09OVEVOVF9MRU5HVEgiLCBzQ29udGVudExlbmd0aCk7CisgICAgICAgIEVudW1lcmF0aW9uIGhlYWRlcnMgPSByZXEuZ2V0SGVhZGVyTmFtZXMoKTsKKyAgICAgICAgU3RyaW5nIGhlYWRlciA9IG51bGw7CisgICAgICAgIHdoaWxlIChoZWFkZXJzLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICBoZWFkZXIgPSBudWxsOworICAgICAgICAgICAgaGVhZGVyID0gKChTdHJpbmcpaGVhZGVycy5uZXh0RWxlbWVudCgpKS50b1VwcGVyQ2FzZSgpOworICAgICAgICAgICAgLy9SRU1JTkQ6IHJld3JpdGUgbXVsdGlwbGUgaGVhZGVycyBhcyBpZiByZWNlaXZlZCBhcyBzaW5nbGUKKyAgICAgICAgICAgIC8vUkVNSU5EOiBjaGFuZ2UgY2hhcmFjdGVyIHNldAorICAgICAgICAgICAgLy9SRU1JTkQ6IEkgZm9yZ290IHdoYXQgdGhlIHByZXZpb3VzIFJFTUlORCBtZWFucworICAgICAgICAgICAgaWYgKCJBVVRIT1JJWkFUSU9OIi5lcXVhbHNJZ25vcmVDYXNlKGhlYWRlcikKKyAgICAgICAgICAgICAgICB8fCAiUFJPWFlfQVVUSE9SSVpBVElPTiIuZXF1YWxzSWdub3JlQ2FzZShoZWFkZXIpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vTk9PUCBwZXIgQ0dJIHNwZWNpZmljYXRpb24gc2VjdGlvbiAxMS4yCisgICAgICAgICAgICB9IGVsc2UgaWYgKCJIT1NUIi5lcXVhbHNJZ25vcmVDYXNlKGhlYWRlcikpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgaG9zdCA9IHJlcS5nZXRIZWFkZXIoaGVhZGVyKTsKKyAgICAgICAgICAgICAgICBlbnZwLnB1dCgiSFRUUF8iICsgaGVhZGVyLnJlcGxhY2UoJy0nLCAnXycpLAorICAgICAgICAgICAgICAgICAgICBob3N0LnN1YnN0cmluZygwLCBob3N0LmluZGV4T2YoIjoiKSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBlbnZwLnB1dCgiSFRUUF8iICsgaGVhZGVyLnJlcGxhY2UoJy0nLCAnXycpLAorICAgICAgICAgICAgICAgICAgICByZXEuZ2V0SGVhZGVyKGhlYWRlcikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvbW1hbmQgPSBzQ0dJRnVsbFBhdGg7CisgICAgICAgIHdvcmtpbmdEaXJlY3RvcnkgPSBuZXcgRmlsZShjb21tYW5kLnN1YnN0cmluZygwLAorICAgICAgICAgICAgY29tbWFuZC5sYXN0SW5kZXhPZihGaWxlLnNlcGFyYXRvcikpKTsKKyAgICAgICAgZW52cC5wdXQoIlhfVE9NQ0FUX0NPTU1BTkRfUEFUSCIsIGNvbW1hbmQpOyAvL2ZvciBraWNrcworICAgICAgICB0aGlzLnNldEVudmlyb25tZW50KGVudnApOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlc29sdmVzIGNvcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNnaSBzY3JpcHQuIDxwPiBFeGFtcGxlIFVSSToKKyAgICAgKiA8UFJFPiAvc2VydmxldC9jZ2lnYXRld2F5L2RpcjEvcmVhbENHSXNjcmlwdC9wYXRoaW5mbzEgPC9QUkU+IDx1bD4KKyAgICAgKiA8TEk+PGI+cGF0aDwvYj4gPSAkQ0FUQUxJTkFfSE9NRS9teXdlYmFwcC9kaXIxL3JlYWxDR0lzY3JpcHQKKyAgICAgKiA8TEk+PGI+c2NyaXB0TmFtZTwvYj4gPSAvc2VydmxldC9jZ2lnYXRld2F5L2RpcjEvcmVhbENHSXNjcmlwdDwvTEk+CisgICAgICogPExJPjxiPmNnaU5hbWU8L2I+ID0gL2RpcjEvcmVhbENHSXNjcmlwdAorICAgICAqIDxMST48Yj5uYW1lPC9iPiA9IHJlYWxDR0lzY3JpcHQKKyAgICAgKiA8L3VsPgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBDR0kgc2VhcmNoIGFsZ29yaXRobTogc2VhcmNoIHRoZSByZWFsIHBhdGggYmVsb3cKKyAgICAgKiAmbHQ7bXktd2ViYXBwLXJvb3QmZ3Q7IGFuZCBmaW5kIHRoZSBmaXJzdCBub24tZGlyZWN0b3J5IGluCisgICAgICogdGhlIGdldFBhdGhUcmFuc2xhdGVkKCIvIiksIHJlYWRpbmcvc2VhcmNoaW5nIGZyb20gbGVmdC10by1yaWdodC4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogVGhlIENHSSBzZWFyY2ggcGF0aCB3aWxsIHN0YXJ0IGF0CisgICAgICogd2ViQXBwUm9vdERpciArIEZpbGUuc2VwYXJhdG9yICsgY2dpUGF0aFByZWZpeCAob3Igd2ViQXBwUm9vdERpcgorICAgICAqIGFsb25lIGlmIGNnaVBhdGhQcmVmaXggaXMgbnVsbCkuCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIGNnaVBhdGhQcmVmaXggaXMgdXN1YWxseSBzZXQgYnkgdGhlIGNhbGxpbmcgc2VydmxldCB0byB0aGUgc2VydmxldCdzCisgICAgICogY2dpUGF0aFByZWZpeCBpbml0IHBhcmFtZXRlcgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXRoSW5mbyAgICAgICBTdHJpbmcgZnJvbSBIdHRwU2VydmxldFJlcXVlc3QuZ2V0UGF0aEluZm8oKQorICAgICAqIEBwYXJhbSB3ZWJBcHBSb290RGlyICBTdHJpbmcgZnJvbSBjb250ZXh0LmdldFJlYWxQYXRoKCIvIikKKyAgICAgKiBAcGFyYW0gY29udGV4dFBhdGggICAgU3RyaW5nIGFzIGZyb20gSHR0cFNlcnZsZXRSZXF1ZXN0LmdldENvbnRleHRQYXRoKCkKKyAgICAgKiBAcGFyYW0gc2VydmxldFBhdGggICAgU3RyaW5nIGFzIGZyb20gSHR0cFNlcnZsZXRSZXF1ZXN0LmdldFNlcnZsZXRQYXRoKCkKKyAgICAgKiBAcGFyYW0gY2dpUGF0aFByZWZpeCAgc3ViZGlyZWN0b3J5IG9mIHdlYkFwcFJvb3REaXIgYmVsb3cgd2hpY2ggdGhlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgIHdlYiBhcHAncyBDR0lzIG1heSBiZSBzdG9yZWQ7IGNhbiBiZSBudWxsLgorICAgICAqIEByZXR1cm4KKyAgICAgKiA8dWw+IDxsaT4gPGNvZGU+cGF0aDwvY29kZT4gIC0gICAgZnVsbCBmaWxlLXN5c3RlbSBwYXRoIHRvIHZhbGlkIGNnaQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHQsIG9yIG51bGwgaWYgbm8gY2dpIHdhcyBmb3VuZAorICAgICAqIDxsaT4gPGNvZGU+c2NyaXB0TmFtZTwvY29kZT4gLSAgICBDR0kgdmFyaWFibGUgU0NSSVBUX05BTUU7IHRoZSBmdWxsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTCBwYXRoIHRvIHZhbGlkIGNnaSBzY3JpcHQgb3IKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCBpZiBubyBjZ2kgd2FzIGZvdW5kCisgICAgICogPGxpPiA8Y29kZT5jZ2lOYW1lPC9jb2RlPiAgICAtICAgIHNlcnZsZXQgcGF0aEluZm8gZnJhZ21lbnQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVzcG9uZGluZyB0byB0aGUgY2dpIHNjcmlwdAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdHNlbGYsIG9yIG51bGwgaWYgbm90IGZvdW5kCisgICAgICogPGxpPiA8Y29kZT5uYW1lPC9jb2RlPiAgICAgICAtICAgIHNpbXBsZSBuYW1lIChubyBkaXJlY3Rvcmllcykgb2YKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNnaSBzY3JpcHQsIG9yIG51bGwgaWYgbm8gY2dpCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcyBmb3VuZAorICAgICAqIDwvdWw+CisgICAgICogQHNpbmNlIFRvbWNhdCA0LjAKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nW10gZmluZENHSShTdHJpbmcgcGF0aEluZm8sIFN0cmluZyB3ZWJBcHBSb290RGlyLAorICAgICAgICBTdHJpbmcgY29udGV4dFBhdGgsIFN0cmluZyBzZXJ2bGV0UGF0aCwgU3RyaW5nIGNnaVBhdGhQcmVmaXgpIHsKKyAgICAgICAgICAgIFN0cmluZyBwYXRoID0gbnVsbDsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gbnVsbDsKKyAgICAgICAgICAgIFN0cmluZyBzY3JpcHRuYW1lID0gbnVsbDsKKyAgICAgICAgICAgIFN0cmluZyBjZ2luYW1lID0gbnVsbDsKKyAgICAgICAgICAgIGlmICgod2ViQXBwUm9vdERpciAhPSBudWxsKQorICAgICAgICAgICAgICAgICYmICh3ZWJBcHBSb290RGlyLmxhc3RJbmRleE9mKCIvIikKKyAgICAgICAgICAgICAgICA9PSAod2ViQXBwUm9vdERpci5sZW5ndGgoKSAtIDEpKSkgeworICAgICAgICAgICAgICAgICAgICAvL3N0cmlwIHRoZSB0cmFpbGluZyAiLyIgZnJvbSB0aGUgd2ViQXBwUm9vdERpcgorICAgICAgICAgICAgICAgICAgICB3ZWJBcHBSb290RGlyID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdlYkFwcFJvb3REaXIuc3Vic3RyaW5nKDAsCisgICAgICAgICAgICAgICAgICAgICAgICAod2ViQXBwUm9vdERpci5sZW5ndGgoKSAtIDEpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjZ2lQYXRoUHJlZml4ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB3ZWJBcHBSb290RGlyID0gd2ViQXBwUm9vdERpciArIEZpbGUuc2VwYXJhdG9yCisgICAgICAgICAgICAgICAgICAgICsgY2dpUGF0aFByZWZpeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJmaW5kQ0dJOiBzdGFydCA9IFsiICsgd2ViQXBwUm9vdERpcgorICAgICAgICAgICAgICAgICAgICArICJdLCBwYXRoSW5mbyA9IFsiICsgcGF0aEluZm8gKyAiXSAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZpbGUgY3VycmVudExvY2F0aW9uID0gbmV3IEZpbGUod2ViQXBwUm9vdERpcik7CisgICAgICAgICAgICBTdHJpbmdUb2tlbml6ZXIgZGlyV2Fsa2VyID0gbmV3IFN0cmluZ1Rva2VuaXplcihwYXRoSW5mbywgIi8iKTsKKyAgICAgICAgICAgIHdoaWxlICghY3VycmVudExvY2F0aW9uLmlzRmlsZSgpICYmIGRpcldhbGtlci5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgIGN1cnJlbnRMb2NhdGlvbiA9IG5ldworICAgICAgICAgICAgICAgICAgICBGaWxlKGN1cnJlbnRMb2NhdGlvbiwgKFN0cmluZykgZGlyV2Fsa2VyLm5leHRFbGVtZW50KCkpOworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJmaW5kQ0dJOiB0cmF2ZXJzaW5nIHRvIFsiICsgY3VycmVudExvY2F0aW9uICsgIl0iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWN1cnJlbnRMb2NhdGlvbi5pc0ZpbGUoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nW10geyBudWxsLCBudWxsLCBudWxsLCBudWxsIH07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJmaW5kQ0dJOiBGT1VORCBjZ2kgYXQgWyIgKyBjdXJyZW50TG9jYXRpb24gKyAiXSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwYXRoID0gY3VycmVudExvY2F0aW9uLmdldEFic29sdXRlUGF0aCgpOworICAgICAgICAgICAgICAgIG5hbWUgPSBjdXJyZW50TG9jYXRpb24uZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgIGNnaW5hbWUgPSBjdXJyZW50TG9jYXRpb24uZ2V0UGFyZW50KCkKKyAgICAgICAgICAgICAgICAgICAgLnN1YnN0cmluZyh3ZWJBcHBSb290RGlyLmxlbmd0aCgpKQorICAgICAgICAgICAgICAgICAgICArIEZpbGUuc2VwYXJhdG9yICsgbmFtZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCIuIi5lcXVhbHMoY29udGV4dFBhdGgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRuYW1lID0gc2VydmxldFBhdGggKyBjZ2luYW1lOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHNjcmlwdG5hbWUgPSBjb250ZXh0UGF0aCArIHNlcnZsZXRQYXRoICsgY2dpbmFtZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpICB7CisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJmaW5kQ0dJIGNhbGM6IG5hbWU9IiArIG5hbWUgKyAiLCBwYXRoPSIgKyBwYXRoCisgICAgICAgICAgICAgICAgICAgICsgIiwgc2NyaXB0bmFtZT0iICsgc2NyaXB0bmFtZSArICIsIGNnaW5hbWU9IiArIGNnaW5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7IHBhdGgsIHNjcmlwdG5hbWUsIGNnaW5hbWUsIG5hbWUgfTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFByaW50IGltcG9ydGFudCBDR0kgZW52aXJvbm1lbnQgaW5mb3JtYXRpb24gaW4gYW4KKyAgICAgKiBlYXN5LXRvLXJlYWQgSFRNTCB0YWJsZQorICAgICAqIEByZXR1cm4gIEhUTUwgc3RyaW5nIGNvbnRhaW5pbmcgQ0dJIGVudmlyb25tZW50IGluZm8KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIHNiLmFwcGVuZCgiPFRBQkxFIGJvcmRlcj0yPiIpOworICAgICAgICBzYi5hcHBlbmQoIjx0cj48dGggY29sc3Bhbj0yIGJnY29sb3I9Z3JleT4iKTsKKyAgICAgICAgc2IuYXBwZW5kKCJQcm9jZXNzRW52aXJvbm1lbnQgSW5mbzwvdGg+PC90cj4iKTsKKyAgICAgICAgc2IuYXBwZW5kKCI8dHI+PHRkPkRlYnVnIExldmVsPC90ZD48dGQ+Iik7CisgICAgICAgIHNiLmFwcGVuZChkZWJ1Zyk7CisgICAgICAgIHNiLmFwcGVuZCgiPC90ZD48L3RyPiIpOworICAgICAgICBzYi5hcHBlbmQoIjx0cj48dGQ+VmFsaWRpdHk6PC90ZD48dGQ+Iik7CisgICAgICAgIHNiLmFwcGVuZChpc1ZhbGlkKCkpOworICAgICAgICBzYi5hcHBlbmQoIjwvdGQ+PC90cj4iKTsKKyAgICAgICAgaWYgKGlzVmFsaWQoKSkgeworICAgICAgICAgICAgRW51bWVyYXRpb24gZW52ayA9IGVudi5rZXlzKCk7CisgICAgICAgICAgICB3aGlsZSAoZW52ay5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBzID0gKFN0cmluZyllbnZrLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCI8dHI+PHRkPiIpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChzKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIjwvdGQ+PHRkPiIpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChibGFua3NUb1N0cmluZygoU3RyaW5nKWVudi5nZXQocyksCisgICAgICAgICAgICAgICAgICAgICJbd2lsbCBiZSBzZXQgdG8gYmxhbmtdIikpOworICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIjwvdGQ+PC90cj4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzYi5hcHBlbmQoIjx0cj48dGQgY29sc3Bhbj0yPjxIUj48L3RkPjwvdHI+Iik7CisgICAgICAgIHNiLmFwcGVuZCgiPHRyPjx0ZD5EZXJpdmVkIENvbW1hbmQ8L3RkPjx0ZD4iKTsKKyAgICAgICAgc2IuYXBwZW5kKG51bGxzVG9CbGFua3MoY29tbWFuZCkpOworICAgICAgICBzYi5hcHBlbmQoIjwvdGQ+PC90cj4iKTsKKyAgICAgICAgc2IuYXBwZW5kKCI8dHI+PHRkPldvcmtpbmcgRGlyZWN0b3J5PC90ZD48dGQ+Iik7CisgICAgICAgIGlmICh3b3JraW5nRGlyZWN0b3J5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCh3b3JraW5nRGlyZWN0b3J5LnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgICAgIHNiLmFwcGVuZCgiPC90ZD48L3RyPiIpOworICAgICAgICBzYi5hcHBlbmQoIjx0cj48dGQgY29sc3Bhbj0yPlF1ZXJ5IFBhcmFtczwvdGQ+PC90cj4iKTsKKyAgICAgICAgRW51bWVyYXRpb24gcGFyYW1rID0gcXVlcnlQYXJhbWV0ZXJzLmtleXMoKTsKKyAgICAgICAgd2hpbGUgKHBhcmFtay5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgU3RyaW5nIHMgPSBwYXJhbWsubmV4dEVsZW1lbnQoKS50b1N0cmluZygpOworICAgICAgICAgICAgc2IuYXBwZW5kKCI8dHI+PHRkPiIpOworICAgICAgICAgICAgc2IuYXBwZW5kKHMpOworICAgICAgICAgICAgc2IuYXBwZW5kKCI8L3RkPjx0ZD4iKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChxdWVyeVBhcmFtZXRlcnMuZ2V0KHMpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgc2IuYXBwZW5kKCI8L3RkPjwvdHI+Iik7CisgICAgICAgIH0KKworICAgICAgICBzYi5hcHBlbmQoIjwvVEFCTEU+PHA+ZW5kLiIpOworICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdldHMgcHJvY2VzcycgZGVyaXZlZCBxdWVyeSBwYXJhbWV0ZXJzCisgICAgICogQHJldHVybiAgIHByb2Nlc3MnIHF1ZXJ5IHBhcmFtZXRlcnMKKyAgICAgKi8KKyAgICBwdWJsaWMgSGFzaHRhYmxlIGdldFBhcmFtZXRlcnMoKSB7CisgICAgICAgIHJldHVybiBxdWVyeVBhcmFtZXRlcnM7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9DaGFyc2V0TWFwcGVyLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9DaGFyc2V0TWFwcGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVjMGZjZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL0NoYXJzZXRNYXBwZXIuamF2YQpAQCAtMCwwICsxLDE0NSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogVGhpcyBjbGFzcyBpcyBiYXNlZCBvbiBhIGNsYXNzIG9yaWdpbmFsbHkgd3JpdHRlbiBieSBKYXNvbiBIdW50ZXIKKyAqIDxqaHVudGVyQGFjbS5vcmc+IGFzIHBhcnQgb2YgdGhlIGJvb2sgIkphdmEgU2VydmxldCBQcm9ncmFtbWluZyIKKyAqIChPJ1JlaWxseSkuICBTZWUgaHR0cDovL3d3dy5zZXJ2bGV0cy5jb20vYm9vayBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAqIFVzZWQgYnkgU3VuIE1pY3Jvc3lzdGVtcyB3aXRoIHBlcm1pc3Npb24uCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWw7CisKKworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworCisKKy8qKgorICogVXRpbGl0eSBjbGFzcyB0aGF0IGF0dGVtcHRzIHRvIG1hcCBmcm9tIGEgTG9jYWxlIHRvIHRoZSBjb3JyZXNwb25kaW5nCisgKiBjaGFyYWN0ZXIgc2V0IHRvIGJlIHVzZWQgZm9yIGludGVycHJldGluZyBpbnB1dCB0ZXh0IChvciBnZW5lcmF0aW5nCisgKiBvdXRwdXQgdGV4dCkgd2hlbiB0aGUgQ29udGVudC1UeXBlIGhlYWRlciBkb2VzIG5vdCBpbmNsdWRlIG9uZS4gIFlvdQorICogY2FuIGN1c3RvbWl6ZSB0aGUgYmVoYXZpb3Igb2YgdGhpcyBjbGFzcyBieSBtb2RpZnlpbmcgdGhlIG1hcHBpbmcgZGF0YQorICogaXQgbG9hZHMsIG9yIGJ5IHN1YmNsYXNzaW5nIGl0ICh0byBjaGFuZ2UgdGhlIGFsZ29yaXRobSkgYW5kIHRoZW4gdXNpbmcKKyAqIHlvdXIgb3duIHZlcnNpb24gZm9yIGEgcGFydGljdWxhciB3ZWIgYXBwbGljYXRpb24uCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkRGF0ZSQgJFZlcnNpb24kCisgKi8KKworcHVibGljIGNsYXNzIENoYXJzZXRNYXBwZXIgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE1hbmlmZXN0IENvbnN0YW50cworCisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IHByb3BlcnRpZXMgcmVzb3VyY2UgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1JFU09VUkNFID0KKyAgICAgICIvb3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL0NoYXJzZXRNYXBwZXJEZWZhdWx0LnByb3BlcnRpZXMiOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgQ2hhcnNldE1hcHBlciB1c2luZyB0aGUgZGVmYXVsdCBwcm9wZXJ0aWVzIHJlc291cmNlLgorICAgICAqLworICAgIHB1YmxpYyBDaGFyc2V0TWFwcGVyKCkgeworCisgICAgICAgIHRoaXMoREVGQVVMVF9SRVNPVVJDRSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBDaGFyc2V0TWFwcGVyIHVzaW5nIHRoZSBzcGVjaWZpZWQgcHJvcGVydGllcyByZXNvdXJjZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgYSBwcm9wZXJ0aWVzIHJlc291cmNlIHRvIGJlIGxvYWRlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHNwZWNpZmllZCBwcm9wZXJ0aWVzCisgICAgICogIHJlc291cmNlIGNvdWxkIG5vdCBiZSBsb2FkZWQgZm9yIGFueSByZWFzb24uCisgICAgICovCisgICAgcHVibGljIENoYXJzZXRNYXBwZXIoU3RyaW5nIG5hbWUpIHsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtID0KKyAgICAgICAgICAgICAgdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlQXNTdHJlYW0obmFtZSk7CisgICAgICAgICAgICBtYXAubG9hZChzdHJlYW0pOworICAgICAgICAgICAgc3RyZWFtLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHQudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgbWFwcGluZyBwcm9wZXJ0aWVzIHRoYXQgaGF2ZSBiZWVuIGluaXRpYWxpemVkIGZyb20gdGhlIHNwZWNpZmllZCBvcgorICAgICAqIGRlZmF1bHQgcHJvcGVydGllcyByZXNvdXJjZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFByb3BlcnRpZXMgbWFwID0gbmV3IFByb3BlcnRpZXMoKTsKKworCisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogQ2FsY3VsYXRlIHRoZSBuYW1lIG9mIGEgY2hhcmFjdGVyIHNldCB0byBiZSBhc3N1bWVkLCBnaXZlbiB0aGUgc3BlY2lmaWVkCisgICAgICogTG9jYWxlIGFuZCB0aGUgYWJzZW5jZSBvZiBhIGNoYXJhY3RlciBzZXQgc3BlY2lmaWVkIGFzIHBhcnQgb2YgdGhlCisgICAgICogY29udGVudCB0eXBlIGhlYWRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsb2NhbGUgVGhlIGxvY2FsZSBmb3Igd2hpY2ggdG8gY2FsY3VsYXRlIGEgY2hhcmFjdGVyIHNldAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2hhcnNldChMb2NhbGUgbG9jYWxlKSB7CisKKyAgICAgICAgU3RyaW5nIGNoYXJzZXQgPSBudWxsOworCisgICAgICAgIC8vIEZpcnN0LCB0cnkgYSBmdWxsIG5hbWUgbWF0Y2ggKGxhbmd1YWdlIGFuZCBjb3VudHJ5KQorICAgICAgICBjaGFyc2V0ID0gbWFwLmdldFByb3BlcnR5KGxvY2FsZS50b1N0cmluZygpKTsKKyAgICAgICAgaWYgKGNoYXJzZXQgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAoY2hhcnNldCk7CisKKyAgICAgICAgLy8gU2Vjb25kLCB0cnkgdG8gbWF0Y2gganVzdCB0aGUgbGFuZ3VhZ2UKKyAgICAgICAgY2hhcnNldCA9IG1hcC5nZXRQcm9wZXJ0eShsb2NhbGUuZ2V0TGFuZ3VhZ2UoKSk7CisgICAgICAgIHJldHVybiAoY2hhcnNldCk7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGNhbiBoYXZlIGEKKyAgICAgKiBsb2NhbGUtZW5jb2RpbmctbWFwcGluZy1saXN0IGVsZW1lbnQgd2hpY2ggZGVzY3JpYmVzIHRoZQorICAgICAqIHdlYmFwcCdzIGRlc2lyZWQgbWFwcGluZyBmcm9tIGxvY2FsZSB0byBjaGFyc2V0LiAgVGhpcyBtZXRob2QKKyAgICAgKiBnZXRzIGNhbGxlZCB3aGVuIHByb2Nlc3NpbmcgdGhlIHdlYi54bWwgZmlsZSBmb3IgYSBjb250ZXh0CisgICAgICoKKyAgICAgKiBAcGFyYW0gbG9jYWxlIFRoZSBsb2NhbGUgZm9yIGEgY2hhcmFjdGVyIHNldAorICAgICAqIEBwYXJhbSBjaGFyc2V0IFRoZSBjaGFyc2V0IHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbG9jYWxlCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQ2hhcnNldE1hcHBpbmdGcm9tRGVwbG95bWVudERlc2NyaXB0b3IoU3RyaW5nIGxvY2FsZSxTdHJpbmcgY2hhcnNldCkgeworICAgICAgICBtYXAucHV0KCBsb2NhbGUsIGNoYXJzZXQgKTsKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvQ2hhcnNldE1hcHBlckRlZmF1bHQucHJvcGVydGllcyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL0NoYXJzZXRNYXBwZXJEZWZhdWx0LnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkwMjliOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL0NoYXJzZXRNYXBwZXJEZWZhdWx0LnByb3BlcnRpZXMKQEAgLTAsMCArMSwzOSBAQAorYXI9SVNPLTg4NTktNgorYmU9SVNPLTg4NTktNQorYmc9SVNPLTg4NTktNQorY2E9SVNPLTg4NTktMQorY3M9SVNPLTg4NTktMgorZGE9SVNPLTg4NTktMQorZGU9SVNPLTg4NTktMQorZWw9SVNPLTg4NTktNworZW49SVNPLTg4NTktMQorZXM9SVNPLTg4NTktMQorZXQ9SVNPLTg4NTktMQorZmk9SVNPLTg4NTktMQorZnI9SVNPLTg4NTktMQoraHI9SVNPLTg4NTktMgoraHU9SVNPLTg4NTktMgoraXM9SVNPLTg4NTktMQoraXQ9SVNPLTg4NTktMQoraXc9SVNPLTg4NTktOAoramE9U2hpZnRfSklTCitrbz1FVUMtS1IKK2x0PUlTTy04ODU5LTIKK2x2PUlTTy04ODU5LTIKK21rPUlTTy04ODU5LTUKK25sPUlTTy04ODU5LTEKK25vPUlTTy04ODU5LTEKK3BsPUlTTy04ODU5LTIKK3B0PUlTTy04ODU5LTEKK3JvPUlTTy04ODU5LTIKK3J1PUlTTy04ODU5LTUKK3NoPUlTTy04ODU5LTUKK3NrPUlTTy04ODU5LTIKK3NsPUlTTy04ODU5LTIKK3NxPUlTTy04ODU5LTIKK3NyPUlTTy04ODU5LTUKK3N2PUlTTy04ODU5LTEKK3RyPUlTTy04ODU5LTkKK3VrPUlTTy04ODU5LTUKK3poPUdCMjMxMgoremhfVFc9QmlnNQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvQ29va2llVG9vbHMuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL0Nvb2tpZVRvb2xzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI5OGQ2ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL0Nvb2tpZVRvb2xzLmphdmEKQEAgLTAsMCArMSwxNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbDsKKworaW1wb3J0IGphdmEudGV4dC4qOworaW1wb3J0IGphdmEudXRpbC4qOworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkNvb2tpZTsKKworLy8gWFhYIHVzZSBvbmx5IG9uZSBEYXRlIGluc3RhbmNlL3JlcXVlc3QsIHJldXNlIGl0LgorCisvKioKKyAqIENvb2tpZSB1dGlscyAtIGdlbmVyYXRlIGNvb2tpZSBoZWFkZXIsIGV0YworICoKKyAqIEBhdXRob3IgT3JpZ2luYWwgQXV0aG9yIFVua25vd24KKyAqIEBhdXRob3IgZHVuY2FuQGVuZy5zdW4uY29tCisgKi8KK3B1YmxpYyBjbGFzcyBDb29raWVUb29scyB7CisKKyAgICAvKiogUmV0dXJuIHRoZSBoZWFkZXIgbmFtZSB0byBzZXQgdGhlIGNvb2tpZSwgYmFzZWQgb24gY29va2llCisgICAgICogIHZlcnNpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDb29raWVIZWFkZXJOYW1lKENvb2tpZSBjb29raWUpIHsKKyAgICAgICAgaW50IHZlcnNpb24gPSBjb29raWUuZ2V0VmVyc2lvbigpOworCisgICAgICAgIGlmICh2ZXJzaW9uID09IDEpIHsKKyAgICAgICAgICAgIHJldHVybiAiU2V0LUNvb2tpZTIiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuICJTZXQtQ29va2llIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiBSZXR1cm4gdGhlIGhlYWRlciB2YWx1ZSB1c2VkIHRvIHNldCB0aGlzIGNvb2tpZQorICAgICAqICBAZGVwcmVjYXRlZCBVc2UgU3RyaW5nQnVmZmVyIHZlcnNpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDb29raWVIZWFkZXJWYWx1ZShDb29raWUgY29va2llKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGdldENvb2tpZUhlYWRlclZhbHVlKCBjb29raWUsIGJ1ZiApOworICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqIFJldHVybiB0aGUgaGVhZGVyIHZhbHVlIHVzZWQgdG8gc2V0IHRoaXMgY29va2llCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGdldENvb2tpZUhlYWRlclZhbHVlKENvb2tpZSBjb29raWUsIFN0cmluZ0J1ZmZlciBidWYpIHsKKyAgICAgICAgaW50IHZlcnNpb24gPSBjb29raWUuZ2V0VmVyc2lvbigpOworCisgICAgICAgIC8vIHRoaXMgcGFydCBpcyB0aGUgc2FtZSBmb3IgYWxsIGNvb2tpZXMKKworICAgICAgICBTdHJpbmcgbmFtZSA9IGNvb2tpZS5nZXROYW1lKCk7ICAgICAvLyBBdm9pZCBOUEUgb24gbWFsZm9ybWVkIGNvb2tpZXMKKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkKKyAgICAgICAgICAgIG5hbWUgPSAiIjsKKyAgICAgICAgU3RyaW5nIHZhbHVlID0gY29va2llLmdldFZhbHVlKCk7CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQorICAgICAgICAgICAgdmFsdWUgPSAiIjsKKyAgICAgICAgCisgICAgICAgIGJ1Zi5hcHBlbmQobmFtZSk7CisgICAgICAgIGJ1Zi5hcHBlbmQoIj0iKTsKKyAgICAgICAgbWF5YmVRdW90ZSh2ZXJzaW9uLCBidWYsIHZhbHVlKTsKKworICAgICAgICAvLyBhZGQgdmVyc2lvbiAxIHNwZWNpZmljIGluZm9ybWF0aW9uCisgICAgICAgIGlmICh2ZXJzaW9uID09IDEpIHsKKyAgICAgICAgICAgIC8vIFZlcnNpb249MSAuLi4gcmVxdWlyZWQKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQgKCI7IFZlcnNpb249MSIpOworCisgICAgICAgICAgICAvLyBDb21tZW50PWNvbW1lbnQKKyAgICAgICAgICAgIGlmIChjb29raWUuZ2V0Q29tbWVudCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kICgiOyBDb21tZW50PSIpOworICAgICAgICAgICAgICAgIG1heWJlUXVvdGUgKHZlcnNpb24sIGJ1ZiwgY29va2llLmdldENvbW1lbnQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBhZGQgZG9tYWluIGluZm9ybWF0aW9uLCBpZiBwcmVzZW50CisKKyAgICAgICAgaWYgKGNvb2tpZS5nZXREb21haW4oKSAhPSBudWxsKSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKCI7IERvbWFpbj0iKTsKKyAgICAgICAgICAgIG1heWJlUXVvdGUgKHZlcnNpb24sIGJ1ZiwgY29va2llLmdldERvbWFpbigpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE1heC1BZ2U9c2Vjcy9EaXNjYXJkIC4uLiBvciB1c2Ugb2xkICJFeHBpcmVzIiBmb3JtYXQKKyAgICAgICAgaWYgKGNvb2tpZS5nZXRNYXhBZ2UoKSA+PSAwKSB7CisgICAgICAgICAgICBpZiAodmVyc2lvbiA9PSAwKSB7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCAoIjsgRXhwaXJlcz0iKTsKKyAgICAgICAgICAgICAgICBpZiAoY29va2llLmdldE1heEFnZSgpID09IDApCisgICAgICAgICAgICAgICAgICAgIERhdGVUb29sLm9sZENvb2tpZUZvcm1hdC5mb3JtYXQobmV3IERhdGUoMTAwMDApLCBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpZWxkUG9zaXRpb24oMCkpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgRGF0ZVRvb2wub2xkQ29va2llRm9ybWF0LmZvcm1hdAorICAgICAgICAgICAgICAgICAgICAgICAgKG5ldyBEYXRlKCBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb2tpZS5nZXRNYXhBZ2UoKSAqMTAwMEwpLCBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpZWxkUG9zaXRpb24oMCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kICgiOyBNYXgtQWdlPSIpOworICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQgKGNvb2tpZS5nZXRNYXhBZ2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAodmVyc2lvbiA9PSAxKQorICAgICAgICAgIGJ1Zi5hcHBlbmQgKCI7IERpc2NhcmQiKTsKKworICAgICAgICAvLyBQYXRoPXBhdGgKKyAgICAgICAgaWYgKGNvb2tpZS5nZXRQYXRoKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgYnVmLmFwcGVuZCAoIjsgUGF0aD0iKTsKKyAgICAgICAgICAgIG1heWJlUXVvdGUgKHZlcnNpb24sIGJ1ZiwgY29va2llLmdldFBhdGgoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBTZWN1cmUKKyAgICAgICAgaWYgKGNvb2tpZS5nZXRTZWN1cmUoKSkgeworICAgICAgICAgIGJ1Zi5hcHBlbmQgKCI7IFNlY3VyZSIpOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgbWF5YmVRdW90ZSAoaW50IHZlcnNpb24sIFN0cmluZ0J1ZmZlciBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUpCisgICAgeworICAgICAgICBpZiAodmVyc2lvbiA9PSAwIHx8IGlzVG9rZW4gKHZhbHVlKSkKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQgKHZhbHVlKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBidWYuYXBwZW5kICgnIicpOworICAgICAgICAgICAgYnVmLmFwcGVuZCAodmFsdWUpOworICAgICAgICAgICAgYnVmLmFwcGVuZCAoJyInKTsKKyAgICAgICAgfQorICAgIH0KKworICAgICAgICAvLworICAgIC8vIGZyb20gUkZDIDIwNjgsIHRva2VuIHNwZWNpYWwgY2FzZSBjaGFyYWN0ZXJzCisgICAgLy8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgdHNwZWNpYWxzID0gIigpPD5ALDs6XFxcIi9bXT89e30gXHQiOworCisgICAgLyoKKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZmYgdGhlIHN0cmluZyBjb3VudHMgYXMgYW4gSFRUUC8xLjEgInRva2VuIi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVG9rZW4gKFN0cmluZyB2YWx1ZSkgeworICAgICAgICBpbnQgbGVuID0gdmFsdWUubGVuZ3RoICgpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgICAgIGNoYXIgYyA9IHZhbHVlLmNoYXJBdCAoaSk7CisKKyAgICAgICAgICAgIGlmIChjIDwgMHgyMCB8fCBjID49IDB4N2YgfHwgdHNwZWNpYWxzLmluZGV4T2YgKGMpICE9IC0xKQorICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL0N1c3RvbU9iamVjdElucHV0U3RyZWFtLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9DdXN0b21PYmplY3RJbnB1dFN0cmVhbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0ODBkMTkKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9DdXN0b21PYmplY3RJbnB1dFN0cmVhbS5qYXZhCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWw7CisKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk9iamVjdFN0cmVhbUNsYXNzOworCisvKioKKyAqIEN1c3RvbSBzdWJjbGFzcyBvZiA8Y29kZT5PYmplY3RJbnB1dFN0cmVhbTwvY29kZT4gdGhhdCBsb2FkcyBmcm9tIHRoZQorICogY2xhc3MgbG9hZGVyIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbi4gIFRoaXMgYWxsb3dzIGNsYXNzZXMgZGVmaW5lZCBvbmx5CisgKiB3aXRoIHRoZSB3ZWIgYXBwbGljYXRpb24gdG8gYmUgZm91bmQgY29ycmVjdGx5LgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQGF1dGhvciBCaXAgVGhlbGluCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kLCAkRGF0ZSQKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgQ3VzdG9tT2JqZWN0SW5wdXRTdHJlYW0KKyAgICBleHRlbmRzIE9iamVjdElucHV0U3RyZWFtIHsKKworCisgICAgLyoqCisgICAgICogVGhlIGNsYXNzIGxvYWRlciB3ZSB3aWxsIHVzZSB0byByZXNvbHZlIGNsYXNzZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBDbGFzc0xvYWRlciBjbGFzc0xvYWRlciA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBpbnN0YW5jZSBvZiBDdXN0b21PYmplY3RJbnB1dFN0cmVhbQorICAgICAqCisgICAgICogQHBhcmFtIHN0cmVhbSBUaGUgaW5wdXQgc3RyZWFtIHdlIHdpbGwgcmVhZCBmcm9tCisgICAgICogQHBhcmFtIGNsYXNzTG9hZGVyIFRoZSBjbGFzcyBsb2FkZXIgdXNlZCB0byBpbnN0YW50aWF0ZSBvYmplY3RzCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgQ3VzdG9tT2JqZWN0SW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICBzdXBlcihzdHJlYW0pOworICAgICAgICB0aGlzLmNsYXNzTG9hZGVyID0gY2xhc3NMb2FkZXI7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBMb2FkIHRoZSBsb2NhbCBjbGFzcyBlcXVpdmFsZW50IG9mIHRoZSBzcGVjaWZpZWQgc3RyZWFtIGNsYXNzCisgICAgICogZGVzY3JpcHRpb24sIGJ5IHVzaW5nIHRoZSBjbGFzcyBsb2FkZXIgYXNzaWduZWQgdG8gdGhpcyBDb250ZXh0LgorICAgICAqCisgICAgICogQHBhcmFtIGNsYXNzRGVzYyBDbGFzcyBkZXNjcmlwdGlvbiBmcm9tIHRoZSBpbnB1dCBzdHJlYW0KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBpZiB0aGlzIGNsYXNzIGNhbm5vdCBiZSBmb3VuZAorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBDbGFzcyByZXNvbHZlQ2xhc3MoT2JqZWN0U3RyZWFtQ2xhc3MgY2xhc3NEZXNjKQorICAgICAgICB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gQ2xhc3MuZm9yTmFtZShjbGFzc0Rlc2MuZ2V0TmFtZSgpLCBmYWxzZSwgY2xhc3NMb2FkZXIpOworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9ET01Xcml0ZXIuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL0RPTVdyaXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzNTAzNTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9ET01Xcml0ZXIuamF2YQpAQCAtMCwwICsxLDM0OCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbDsKKworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uV3JpdGVyOworCitpbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKKworLyoqCisgKiBBIHNhbXBsZSBET00gd3JpdGVyLiBUaGlzIHNhbXBsZSBwcm9ncmFtIGlsbHVzdHJhdGVzIGhvdyB0bworICogdHJhdmVyc2UgYSBET00gdHJlZSBpbiBvcmRlciB0byBwcmludCBhIGRvY3VtZW50IHRoYXQgaXMgcGFyc2VkLgorICovCitwdWJsaWMgY2xhc3MgRE9NV3JpdGVyIHsKKworICAgLy8KKyAgIC8vIERhdGEKKyAgIC8vCisKKyAgIC8qKiBEZWZhdWx0IEVuY29kaW5nICovCisgICBwcml2YXRlIHN0YXRpYyAgU3RyaW5nCisgICBQUklOVFdSSVRFUl9FTkNPRElORyA9ICJVVEY4IjsKKworICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIE1JTUUySkFWQV9FTkNPRElOR1NbXSA9CisgICAgeyAiRGVmYXVsdCIsICJVVEYtOCIsICJVUy1BU0NJSSIsICJJU08tODg1OS0xIiwgIklTTy04ODU5LTIiLCAiSVNPLTg4NTktMyIsICJJU08tODg1OS00IiwKKyAgICAgICJJU08tODg1OS01IiwgIklTTy04ODU5LTYiLCAiSVNPLTg4NTktNyIsICJJU08tODg1OS04IiwgIklTTy04ODU5LTkiLCAiSVNPLTIwMjItSlAiLAorICAgICAgIlNISUZUX0pJUyIsICJFVUMtSlAiLCJHQjIzMTIiLCAiQklHNSIsICJFVUMtS1IiLCAiSVNPLTIwMjItS1IiLCAiS09JOC1SIiwgIkVCQ0RJQy1DUC1VUyIsCisgICAgICAiRUJDRElDLUNQLUNBIiwgIkVCQ0RJQy1DUC1OTCIsICJFQkNESUMtQ1AtREsiLCAiRUJDRElDLUNQLU5PIiwgIkVCQ0RJQy1DUC1GSSIsICJFQkNESUMtQ1AtU0UiLAorICAgICAgIkVCQ0RJQy1DUC1JVCIsICJFQkNESUMtQ1AtRVMiLCAiRUJDRElDLUNQLUdCIiwgIkVCQ0RJQy1DUC1GUiIsICJFQkNESUMtQ1AtQVIxIiwKKyAgICAgICJFQkNESUMtQ1AtSEUiLCAiRUJDRElDLUNQLUNIIiwgIkVCQ0RJQy1DUC1ST0VDRSIsIkVCQ0RJQy1DUC1ZVSIsCisgICAgICAiRUJDRElDLUNQLUlTIiwgIkVCQ0RJQy1DUC1BUjIiLCAiVVRGLTE2IgorICAgIH07CisKKyAgIC8qKiBPdXRwdXQgcXVhbGlmaWVkIG5hbWVzICovCisgICBwcml2YXRlIGJvb2xlYW4gcXVhbGlmaWVkTmFtZXMgPSB0cnVlOworCisgICAvKiogUHJpbnQgd3JpdGVyLiAqLworICAgcHJvdGVjdGVkIFByaW50V3JpdGVyIG91dDsKKworICAgLyoqIENhbm9uaWNhbCBvdXRwdXQuICovCisgICBwcm90ZWN0ZWQgYm9vbGVhbiBjYW5vbmljYWw7CisKKworICAgcHVibGljIERPTVdyaXRlcihTdHJpbmcgZW5jb2RpbmcsIGJvb2xlYW4gY2Fub25pY2FsKQorICAgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24geworICAgICAgb3V0ID0gbmV3IFByaW50V3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoU3lzdGVtLm91dCwgZW5jb2RpbmcpKTsKKyAgICAgIHRoaXMuY2Fub25pY2FsID0gY2Fub25pY2FsOworICAgfSAvLyA8aW5pdD4oU3RyaW5nLGJvb2xlYW4pCisKKyAgIC8vCisgICAvLyBDb25zdHJ1Y3RvcnMKKyAgIC8vCisKKyAgIC8qKiBEZWZhdWx0IGNvbnN0cnVjdG9yLiAqLworICAgcHVibGljIERPTVdyaXRlcihib29sZWFuIGNhbm9uaWNhbCkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24geworICAgICAgdGhpcyggZ2V0V3JpdGVyRW5jb2RpbmcoKSwgY2Fub25pY2FsKTsKKyAgIH0KKworICAgIHB1YmxpYyBET01Xcml0ZXIoV3JpdGVyIHdyaXRlciwgYm9vbGVhbiBjYW5vbmljYWwpIHsKKyAgICAgICAgb3V0ID0gbmV3IFByaW50V3JpdGVyKHdyaXRlcik7CisgICAgICAgIHRoaXMuY2Fub25pY2FsID0gY2Fub25pY2FsOworICAgIH0KKworICAgcHVibGljIGJvb2xlYW4gZ2V0UXVhbGlmaWVkTmFtZXMoKSB7CisgICAgICByZXR1cm4gdGhpcy5xdWFsaWZpZWROYW1lczsKKyAgIH0KKworICAgcHVibGljIHZvaWQgc2V0UXVhbGlmaWVkTmFtZXMoYm9vbGVhbiBxdWFsaWZpZWROYW1lcykgeworICAgICAgdGhpcy5xdWFsaWZpZWROYW1lcyA9IHF1YWxpZmllZE5hbWVzOworICAgfQorCisgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRXcml0ZXJFbmNvZGluZyggKSB7CisgICAgICByZXR1cm4gKFBSSU5UV1JJVEVSX0VOQ09ESU5HKTsKKyAgIH0vLyBnZXRXcml0ZXJFbmNvZGluZworCisgICBwdWJsaWMgc3RhdGljIHZvaWQgIHNldFdyaXRlckVuY29kaW5nKCBTdHJpbmcgZW5jb2RpbmcgKSB7CisgICAgICBpZiggZW5jb2RpbmcuZXF1YWxzSWdub3JlQ2FzZSggIkRFRkFVTFQiICkgKQorICAgICAgICAgUFJJTlRXUklURVJfRU5DT0RJTkcgID0gIlVURjgiOworICAgICAgZWxzZSBpZiggZW5jb2RpbmcuZXF1YWxzSWdub3JlQ2FzZSggIlVURi0xNiIgKSApCisgICAgICAgICBQUklOVFdSSVRFUl9FTkNPRElORyAgPSAiVW5pY29kZSI7CisgICAgICBlbHNlCisgICAgICAgICBQUklOVFdSSVRFUl9FTkNPRElORyA9IE1JTUUySmF2YS5jb252ZXJ0KCBlbmNvZGluZyApOworICAgfS8vIHNldFdyaXRlckVuY29kaW5nCisKKworICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRKYXZhRW5jb2RpbmcoIFN0cmluZyBlbmNvZGluZyApIHsKKyAgICAgIGZvciAoIGludCBpID0gMDsgaSA8IE1JTUUySkFWQV9FTkNPRElOR1MubGVuZ3RoOyBpKysgKQorICAgICAgICAgaWYgKCBlbmNvZGluZy5lcXVhbHMoIE1JTUUySkFWQV9FTkNPRElOR1NbaV0gKSApCisgICAgICAgICAgICByZXR1cm4gKHRydWUpOworCisgICAgICByZXR1cm4gKGZhbHNlKTsKKyAgIH0vLyBpc1ZhbGlkSmF2YUVuY29kaW5nCisKKworICAgLyoqIFByaW50cyB0aGUgc3BlY2lmaWVkIG5vZGUsIHJlY3Vyc2l2ZWx5LiAqLworICAgcHVibGljIHZvaWQgcHJpbnQoTm9kZSBub2RlKSB7CisKKyAgICAgIC8vIGlzIHRoZXJlIGFueXRoaW5nIHRvIGRvPworICAgICAgaWYgKCBub2RlID09IG51bGwgKSB7CisgICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGludCB0eXBlID0gbm9kZS5nZXROb2RlVHlwZSgpOworICAgICAgc3dpdGNoICggdHlwZSApIHsKKyAgICAgICAgIC8vIHByaW50IGRvY3VtZW50CisgICAgICAgICBjYXNlIE5vZGUuRE9DVU1FTlRfTk9ERTogeworICAgICAgICAgICAgICAgaWYgKCAhY2Fub25pY2FsICkgeworICAgICAgICAgICAgICAgICAgU3RyaW5nICBFbmNvZGluZyA9IGdldFdyaXRlckVuY29kaW5nKCk7CisgICAgICAgICAgICAgICAgICBpZiggRW5jb2RpbmcuZXF1YWxzSWdub3JlQ2FzZSggIkRFRkFVTFQiICkgKQorICAgICAgICAgICAgICAgICAgICAgRW5jb2RpbmcgPSAiVVRGLTgiOworICAgICAgICAgICAgICAgICAgZWxzZSBpZiggRW5jb2RpbmcuZXF1YWxzSWdub3JlQ2FzZSggIlVuaWNvZGUiICkgKQorICAgICAgICAgICAgICAgICAgICAgRW5jb2RpbmcgPSAiVVRGLTE2IjsKKyAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgIEVuY29kaW5nID0gTUlNRTJKYXZhLnJldmVyc2UoIEVuY29kaW5nICk7CisKKyAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCIiKworICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5jb2RpbmcgKyAiXCI/PiIpOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgcHJpbnQoKChEb2N1bWVudClub2RlKS5nZXREb2N1bWVudEVsZW1lbnQoKSk7CisgICAgICAgICAgICAgICBvdXQuZmx1c2goKTsKKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBwcmludCBlbGVtZW50IHdpdGggYXR0cmlidXRlcworICAgICAgICAgY2FzZSBOb2RlLkVMRU1FTlRfTk9ERTogeworICAgICAgICAgICAgICAgb3V0LnByaW50KCc8Jyk7CisgICAgICAgICAgICAgICBpZiAodGhpcy5xdWFsaWZpZWROYW1lcykgeyAKKyAgICAgICAgICAgICAgICAgIG91dC5wcmludChub2RlLmdldE5vZGVOYW1lKCkpOworICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIG91dC5wcmludChub2RlLmdldExvY2FsTmFtZSgpKTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIEF0dHIgYXR0cnNbXSA9IHNvcnRBdHRyaWJ1dGVzKG5vZGUuZ2V0QXR0cmlidXRlcygpKTsKKyAgICAgICAgICAgICAgIGZvciAoIGludCBpID0gMDsgaSA8IGF0dHJzLmxlbmd0aDsgaSsrICkgeworICAgICAgICAgICAgICAgICAgQXR0ciBhdHRyID0gYXR0cnNbaV07CisgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoJyAnKTsKKyAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnF1YWxpZmllZE5hbWVzKSB7CisgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoYXR0ci5nZXROb2RlTmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoYXR0ci5nZXRMb2NhbE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgIG91dC5wcmludCgiPVwiIik7CisgICAgICAgICAgICAgICAgICBvdXQucHJpbnQobm9ybWFsaXplKGF0dHIuZ2V0Tm9kZVZhbHVlKCkpKTsKKyAgICAgICAgICAgICAgICAgIG91dC5wcmludCgnIicpOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgb3V0LnByaW50KCc+Jyk7CisgICAgICAgICAgICAgICBOb2RlTGlzdCBjaGlsZHJlbiA9IG5vZGUuZ2V0Q2hpbGROb2RlcygpOworICAgICAgICAgICAgICAgaWYgKCBjaGlsZHJlbiAhPSBudWxsICkgeworICAgICAgICAgICAgICAgICAgaW50IGxlbiA9IGNoaWxkcmVuLmdldExlbmd0aCgpOworICAgICAgICAgICAgICAgICAgZm9yICggaW50IGkgPSAwOyBpIDwgbGVuOyBpKysgKSB7CisgICAgICAgICAgICAgICAgICAgICBwcmludChjaGlsZHJlbi5pdGVtKGkpKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBoYW5kbGUgZW50aXR5IHJlZmVyZW5jZSBub2RlcworICAgICAgICAgY2FzZSBOb2RlLkVOVElUWV9SRUZFUkVOQ0VfTk9ERTogeworICAgICAgICAgICAgICAgaWYgKCBjYW5vbmljYWwgKSB7CisgICAgICAgICAgICAgICAgICBOb2RlTGlzdCBjaGlsZHJlbiA9IG5vZGUuZ2V0Q2hpbGROb2RlcygpOworICAgICAgICAgICAgICAgICAgaWYgKCBjaGlsZHJlbiAhPSBudWxsICkgeworICAgICAgICAgICAgICAgICAgICAgaW50IGxlbiA9IGNoaWxkcmVuLmdldExlbmd0aCgpOworICAgICAgICAgICAgICAgICAgICAgZm9yICggaW50IGkgPSAwOyBpIDwgbGVuOyBpKysgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludChjaGlsZHJlbi5pdGVtKGkpKTsKKyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoJyYnKTsKKyAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnF1YWxpZmllZE5hbWVzKSB7CisgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQobm9kZS5nZXROb2RlTmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQobm9kZS5nZXRMb2NhbE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoJzsnKTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBwcmludCBjZGF0YSBzZWN0aW9ucworICAgICAgICAgY2FzZSBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERTogeworICAgICAgICAgICAgICAgaWYgKCBjYW5vbmljYWwgKSB7CisgICAgICAgICAgICAgICAgICBvdXQucHJpbnQobm9ybWFsaXplKG5vZGUuZ2V0Tm9kZVZhbHVlKCkpKTsKKyAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoIjwhW0NEQVRBWyIpOworICAgICAgICAgICAgICAgICAgb3V0LnByaW50KG5vZGUuZ2V0Tm9kZVZhbHVlKCkpOworICAgICAgICAgICAgICAgICAgb3V0LnByaW50KCJdXT4iKTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBwcmludCB0ZXh0CisgICAgICAgICBjYXNlIE5vZGUuVEVYVF9OT0RFOiB7CisgICAgICAgICAgICAgICBvdXQucHJpbnQobm9ybWFsaXplKG5vZGUuZ2V0Tm9kZVZhbHVlKCkpKTsKKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBwcmludCBwcm9jZXNzaW5nIGluc3RydWN0aW9uCisgICAgICAgICBjYXNlIE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFOiB7CisgICAgICAgICAgICAgICBvdXQucHJpbnQoIjw/Iik7CisgICAgICAgICAgICAgICBpZiAodGhpcy5xdWFsaWZpZWROYW1lcykgeworICAgICAgICAgICAgICAgICAgb3V0LnByaW50KG5vZGUuZ2V0Tm9kZU5hbWUoKSk7CisgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgb3V0LnByaW50KG5vZGUuZ2V0TG9jYWxOYW1lKCkpOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICBTdHJpbmcgZGF0YSA9IG5vZGUuZ2V0Tm9kZVZhbHVlKCk7CisgICAgICAgICAgICAgICBpZiAoIGRhdGEgIT0gbnVsbCAmJiBkYXRhLmxlbmd0aCgpID4gMCApIHsKKyAgICAgICAgICAgICAgICAgIG91dC5wcmludCgnICcpOworICAgICAgICAgICAgICAgICAgb3V0LnByaW50KGRhdGEpOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgb3V0LnByaW50KCI/PiIpOworICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmICggdHlwZSA9PSBOb2RlLkVMRU1FTlRfTk9ERSApIHsKKyAgICAgICAgIG91dC5wcmludCgiPC8iKTsKKyAgICAgICAgIGlmICh0aGlzLnF1YWxpZmllZE5hbWVzKSB7CisgICAgICAgICAgICBvdXQucHJpbnQobm9kZS5nZXROb2RlTmFtZSgpKTsKKyAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvdXQucHJpbnQobm9kZS5nZXRMb2NhbE5hbWUoKSk7CisgICAgICAgICB9CisgICAgICAgICBvdXQucHJpbnQoJz4nKTsKKyAgICAgIH0KKworICAgICAgb3V0LmZsdXNoKCk7CisKKyAgIH0gLy8gcHJpbnQoTm9kZSkKKworICAgLyoqIFJldHVybnMgYSBzb3J0ZWQgbGlzdCBvZiBhdHRyaWJ1dGVzLiAqLworICAgcHJvdGVjdGVkIEF0dHJbXSBzb3J0QXR0cmlidXRlcyhOYW1lZE5vZGVNYXAgYXR0cnMpIHsKKworICAgICAgaW50IGxlbiA9IChhdHRycyAhPSBudWxsKSA/IGF0dHJzLmdldExlbmd0aCgpIDogMDsKKyAgICAgIEF0dHIgYXJyYXlbXSA9IG5ldyBBdHRyW2xlbl07CisgICAgICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBsZW47IGkrKyApIHsKKyAgICAgICAgIGFycmF5W2ldID0gKEF0dHIpYXR0cnMuaXRlbShpKTsKKyAgICAgIH0KKyAgICAgIGZvciAoIGludCBpID0gMDsgaSA8IGxlbiAtIDE7IGkrKyApIHsKKyAgICAgICAgIFN0cmluZyBuYW1lID0gbnVsbDsKKyAgICAgICAgIGlmICh0aGlzLnF1YWxpZmllZE5hbWVzKSB7CisgICAgICAgICAgICBuYW1lICA9IGFycmF5W2ldLmdldE5vZGVOYW1lKCk7CisgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbmFtZSAgPSBhcnJheVtpXS5nZXRMb2NhbE5hbWUoKTsKKyAgICAgICAgIH0KKyAgICAgICAgIGludCAgICBpbmRleCA9IGk7CisgICAgICAgICBmb3IgKCBpbnQgaiA9IGkgKyAxOyBqIDwgbGVuOyBqKysgKSB7CisgICAgICAgICAgICBTdHJpbmcgY3VyTmFtZSA9IG51bGw7CisgICAgICAgICAgICBpZiAodGhpcy5xdWFsaWZpZWROYW1lcykgeworICAgICAgICAgICAgICAgY3VyTmFtZSA9IGFycmF5W2pdLmdldE5vZGVOYW1lKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgY3VyTmFtZSA9IGFycmF5W2pdLmdldExvY2FsTmFtZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBjdXJOYW1lLmNvbXBhcmVUbyhuYW1lKSA8IDAgKSB7CisgICAgICAgICAgICAgICBuYW1lICA9IGN1ck5hbWU7CisgICAgICAgICAgICAgICBpbmRleCA9IGo7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICAgICBpZiAoIGluZGV4ICE9IGkgKSB7CisgICAgICAgICAgICBBdHRyIHRlbXAgICAgPSBhcnJheVtpXTsKKyAgICAgICAgICAgIGFycmF5W2ldICAgICA9IGFycmF5W2luZGV4XTsKKyAgICAgICAgICAgIGFycmF5W2luZGV4XSA9IHRlbXA7CisgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJldHVybiAoYXJyYXkpOworCisgICB9IC8vIHNvcnRBdHRyaWJ1dGVzKE5hbWVkTm9kZU1hcCk6QXR0cltdCisKKworICAgLyoqIE5vcm1hbGl6ZXMgdGhlIGdpdmVuIHN0cmluZy4gKi8KKyAgIHByb3RlY3RlZCBTdHJpbmcgbm9ybWFsaXplKFN0cmluZyBzKSB7CisgICAgICBTdHJpbmdCdWZmZXIgc3RyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCisgICAgICBpbnQgbGVuID0gKHMgIT0gbnVsbCkgPyBzLmxlbmd0aCgpIDogMDsKKyAgICAgIGZvciAoIGludCBpID0gMDsgaSA8IGxlbjsgaSsrICkgeworICAgICAgICAgY2hhciBjaCA9IHMuY2hhckF0KGkpOworICAgICAgICAgc3dpdGNoICggY2ggKSB7CisgICAgICAgICAgICBjYXNlICc8JzogeworICAgICAgICAgICAgICAgICAgc3RyLmFwcGVuZCgiJmx0OyIpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlICc+JzogeworICAgICAgICAgICAgICAgICAgc3RyLmFwcGVuZCgiJmd0OyIpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlICcmJzogeworICAgICAgICAgICAgICAgICAgc3RyLmFwcGVuZCgiJmFtcDsiKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSAnIic6IHsKKyAgICAgICAgICAgICAgICAgIHN0ci5hcHBlbmQoIiZxdW90OyIpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlICdccic6CisgICAgICAgICAgICBjYXNlICdcbic6IHsKKyAgICAgICAgICAgICAgICAgIGlmICggY2Fub25pY2FsICkgeworICAgICAgICAgICAgICAgICAgICAgc3RyLmFwcGVuZCgiJiMiKTsKKyAgICAgICAgICAgICAgICAgICAgIHN0ci5hcHBlbmQoSW50ZWdlci50b1N0cmluZyhjaCkpOworICAgICAgICAgICAgICAgICAgICAgc3RyLmFwcGVuZCgnOycpOworICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAvLyBlbHNlLCBkZWZhdWx0IGFwcGVuZCBjaGFyCisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgICAgICAgICBzdHIuYXBwZW5kKGNoKTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIChzdHIudG9TdHJpbmcoKSk7CisKKyAgIH0gLy8gbm9ybWFsaXplKFN0cmluZyk6U3RyaW5nCisKKyAgIHByaXZhdGUgc3RhdGljIHZvaWQgcHJpbnRWYWxpZEphdmFFbmNvZGluZygpIHsKKyAgICAgIFN5c3RlbS5lcnIucHJpbnRsbiggIiAgICBFTkNPRElOR1M6IiApOworICAgICAgU3lzdGVtLmVyci5wcmludCggIiAgICIgKTsKKyAgICAgIGZvciggaW50IGkgPSAwOworICAgICAgICAgICAgICAgICAgICAgaSA8IE1JTUUySkFWQV9FTkNPRElOR1MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgIFN5c3RlbS5lcnIucHJpbnQoIE1JTUUySkFWQV9FTkNPRElOR1NbaV0gKyAiICIgKTsKKyAgICAgIGlmKCAoaSAlIDcgKSA9PSAwICl7CisgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oKTsKKyAgICAgICAgIFN5c3RlbS5lcnIucHJpbnQoICIgICAiICk7CisgICAgICAgICB9CisgICAgICB9CisKKyAgIH0gLy8gcHJpbnRKYXZhRW5jb2RpbmcoKQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9EYXRlVG9vbC5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvRGF0ZVRvb2wuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWI4NDg3Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvRGF0ZVRvb2wuamF2YQpAQCAtMCwwICsxLDk4IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWw7CisKK2ltcG9ydCBqYXZhLnRleHQuRGF0ZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5UaW1lWm9uZTsKKworLyoqCisgKiAgQ29tbW9uIHBsYWNlIGZvciBkYXRlIHV0aWxzLgorICoKKyAqIEBhdXRob3IgZGFjQGVuZy5zdW4uY29tCisgKiBAYXV0aG9yIEphc29uIEh1bnRlciBbamNoQGVuZy5zdW4uY29tXQorICogQGF1dGhvciBKYW1lcyBUb2RkIFtnb256b0Blbmcuc3VuLmNvbV0KKyAqIEBhdXRob3IgQ29zdGluIE1hbm9sYWNoZQorICovCitwdWJsaWMgY2xhc3MgRGF0ZVRvb2wgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nTWFuYWdlciBzbSA9CisgICAgICAgIFN0cmluZ01hbmFnZXIuZ2V0TWFuYWdlcigib3JnLmFwYWNoZS5jYXRhbGluYS51dGlsIik7CisKKyAgICAvKioKKyAgICAgKiBVUyBsb2NhbGUgLSBhbGwgSFRUUCBkYXRlcyBhcmUgaW4gZW5nbGlzaAorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgTG9jYWxlIExPQ0FMRV9VUyA9IExvY2FsZS5VUzsKKworICAgIC8qKgorICAgICAqIEdNVCB0aW1lem9uZSAtIGFsbCBIVFRQIGRhdGVzIGFyZSBvbiBHTVQKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIFRpbWVab25lIEdNVF9aT05FID0gVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVCIpOworCisgICAgLyoqCisgICAgICogZm9ybWF0IGZvciBSRkMgMTEyMyBkYXRlIHN0cmluZyAtLSAiU3VuLCAwNiBOb3YgMTk5NCAwODo0OTozNyBHTVQiCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUkZDMTEyM19QQVRURVJOID0KKyAgICAgICAgIkVFRSwgZGQgTU1NIHl5eXl5IEhIOm1tOnNzIHoiOworCisgICAgLyoqIAorICAgICAqIEZvcm1hdCBmb3IgaHR0cCByZXNwb25zZSBoZWFkZXIgZGF0ZSBmaWVsZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfUkVTUE9OU0VfREFURV9IRUFERVIgPQorICAgICAgICAiRUVFLCBkZCBNTU0geXl5eSBISDptbTpzcyB6enoiOworCisgICAgLy8gZm9ybWF0IGZvciBSRkMgMTAzNiBkYXRlIHN0cmluZyAtLSAiU3VuZGF5LCAwNi1Ob3YtOTQgMDg6NDk6MzcgR01UIgorICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyByZmMxMDM2UGF0dGVybiA9CisgICAgICAgICJFRUVFRUVFRUUsIGRkLU1NTS15eSBISDptbTpzcyB6IjsKKworICAgIC8vIGZvcm1hdCBmb3IgQyBhc2N0aW1lKCkgZGF0ZSBzdHJpbmcgLS0gIlN1biBOb3YgIDYgMDg6NDk6MzcgMTk5NCIKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgYXNjdGltZVBhdHRlcm4gPQorICAgICAgICAiRUVFIE1NTSBkIEhIOm1tOnNzIHl5eXl5IjsKKworICAgIC8qKgorICAgICAqIFBhdHRlcm4gdXNlZCBmb3Igb2xkIGNvb2tpZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBPTERfQ09PS0lFX1BBVFRFUk4gPSAiRUVFLCBkZC1NTU0teXl5eSBISDptbTpzcyB6IjsKKworICAgIC8qKgorICAgICAqIERhdGVGb3JtYXQgdG8gYmUgdXNlZCB0byBmb3JtYXQgZGF0ZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIERhdGVGb3JtYXQgcmZjMTEyM0Zvcm1hdCA9CisgICAgICAgIG5ldyBTaW1wbGVEYXRlRm9ybWF0KFJGQzExMjNfUEFUVEVSTiwgTE9DQUxFX1VTKTsKKworICAgIC8qKgorICAgICAqIERhdGVGb3JtYXQgdG8gYmUgdXNlZCB0byBmb3JtYXQgb2xkIG5ldHNjYXBlIGNvb2tpZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIERhdGVGb3JtYXQgb2xkQ29va2llRm9ybWF0ID0KKyAgICAgICAgbmV3IFNpbXBsZURhdGVGb3JtYXQoT0xEX0NPT0tJRV9QQVRURVJOLCBMT0NBTEVfVVMpOworCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBEYXRlRm9ybWF0IHJmYzEwMzZGb3JtYXQgPQorICAgICAgICBuZXcgU2ltcGxlRGF0ZUZvcm1hdChyZmMxMDM2UGF0dGVybiwgTE9DQUxFX1VTKTsKKworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgRGF0ZUZvcm1hdCBhc2N0aW1lRm9ybWF0ID0KKyAgICAgICAgbmV3IFNpbXBsZURhdGVGb3JtYXQoYXNjdGltZVBhdHRlcm4sIExPQ0FMRV9VUyk7CisKKyAgICBzdGF0aWMgeworICAgICAgICByZmMxMTIzRm9ybWF0LnNldFRpbWVab25lKEdNVF9aT05FKTsKKyAgICAgICAgb2xkQ29va2llRm9ybWF0LnNldFRpbWVab25lKEdNVF9aT05FKTsKKyAgICAgICAgcmZjMTAzNkZvcm1hdC5zZXRUaW1lWm9uZShHTVRfWk9ORSk7CisgICAgICAgIGFzY3RpbWVGb3JtYXQuc2V0VGltZVpvbmUoR01UX1pPTkUpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvRW51bWVyYXRvci5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvRW51bWVyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyMmZmZDcKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9FbnVtZXJhdG9yLmphdmEKQEAgLTAsMCArMSwxNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbDsKKworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247CisKKworLyoqCisgKiBBZGFwdGVyIGNsYXNzIHRoYXQgd3JhcHMgYW4gPGNvZGU+RW51bWVyYXRpb248L2NvZGU+IGFyb3VuZCBhIEphdmEyCisgKiBjb2xsZWN0aW9uIGNsYXNzZXMgb2JqZWN0IDxjb2RlPkl0ZXJhdG9yPC9jb2RlPiBzbyB0aGF0IGV4aXN0aW5nIEFQSXMKKyAqIHJldHVybmluZyBFbnVtZXJhdGlvbnMgY2FuIGVhc2lseSBydW4gb24gdG9wIG9mIHRoZSBuZXcgY29sbGVjdGlvbnMuCisgKiBDb25zdHJ1Y3RvcnMgYXJlIHByb3ZpZGVkIHRvIGVhc2xpeSBjcmVhdGUgc3VjaCB3cmFwcGVycy4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIEVudW1lcmF0b3IgaW1wbGVtZW50cyBFbnVtZXJhdGlvbiB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYW4gRW51bWVyYXRpb24gb3ZlciB0aGUgdmFsdWVzIG9mIHRoZSBzcGVjaWZpZWQgQ29sbGVjdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb2xsZWN0aW9uIENvbGxlY3Rpb24gd2hvc2UgdmFsdWVzIHNob3VsZCBiZSBlbnVtZXJhdGVkCisgICAgICovCisgICAgcHVibGljIEVudW1lcmF0b3IoQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7CisKKyAgICAgICAgdGhpcyhjb2xsZWN0aW9uLml0ZXJhdG9yKCkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYW4gRW51bWVyYXRpb24gb3ZlciB0aGUgdmFsdWVzIG9mIHRoZSBzcGVjaWZpZWQgQ29sbGVjdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb2xsZWN0aW9uIENvbGxlY3Rpb24gd2hvc2UgdmFsdWVzIHNob3VsZCBiZSBlbnVtZXJhdGVkCisgICAgICogQHBhcmFtIGNsb25lIHRydWUgdG8gY2xvbmUgaXRlcmF0b3IKKyAgICAgKi8KKyAgICBwdWJsaWMgRW51bWVyYXRvcihDb2xsZWN0aW9uIGNvbGxlY3Rpb24sIGJvb2xlYW4gY2xvbmUpIHsKKworICAgICAgICB0aGlzKGNvbGxlY3Rpb24uaXRlcmF0b3IoKSwgY2xvbmUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYW4gRW51bWVyYXRpb24gb3ZlciB0aGUgdmFsdWVzIHJldHVybmVkIGJ5IHRoZQorICAgICAqIHNwZWNpZmllZCBJdGVyYXRvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpdGVyYXRvciBJdGVyYXRvciB0byBiZSB3cmFwcGVkCisgICAgICovCisgICAgcHVibGljIEVudW1lcmF0b3IoSXRlcmF0b3IgaXRlcmF0b3IpIHsKKworICAgICAgICBzdXBlcigpOworICAgICAgICB0aGlzLml0ZXJhdG9yID0gaXRlcmF0b3I7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhbiBFbnVtZXJhdGlvbiBvdmVyIHRoZSB2YWx1ZXMgcmV0dXJuZWQgYnkgdGhlCisgICAgICogc3BlY2lmaWVkIEl0ZXJhdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIGl0ZXJhdG9yIEl0ZXJhdG9yIHRvIGJlIHdyYXBwZWQKKyAgICAgKiBAcGFyYW0gY2xvbmUgdHJ1ZSB0byBjbG9uZSBpdGVyYXRvcgorICAgICAqLworICAgIHB1YmxpYyBFbnVtZXJhdG9yKEl0ZXJhdG9yIGl0ZXJhdG9yLCBib29sZWFuIGNsb25lKSB7CisKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgaWYgKCFjbG9uZSkgeworICAgICAgICAgICAgdGhpcy5pdGVyYXRvciA9IGl0ZXJhdG9yOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIGxpc3QuYWRkKGl0ZXJhdG9yLm5leHQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aGlzLml0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOyAgIAorICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhbiBFbnVtZXJhdGlvbiBvdmVyIHRoZSB2YWx1ZXMgb2YgdGhlIHNwZWNpZmllZCBNYXAuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwIE1hcCB3aG9zZSB2YWx1ZXMgc2hvdWxkIGJlIGVudW1lcmF0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgRW51bWVyYXRvcihNYXAgbWFwKSB7CisKKyAgICAgICAgdGhpcyhtYXAudmFsdWVzKCkuaXRlcmF0b3IoKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhbiBFbnVtZXJhdGlvbiBvdmVyIHRoZSB2YWx1ZXMgb2YgdGhlIHNwZWNpZmllZCBNYXAuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwIE1hcCB3aG9zZSB2YWx1ZXMgc2hvdWxkIGJlIGVudW1lcmF0ZWQKKyAgICAgKiBAcGFyYW0gY2xvbmUgdHJ1ZSB0byBjbG9uZSBpdGVyYXRvcgorICAgICAqLworICAgIHB1YmxpYyBFbnVtZXJhdG9yKE1hcCBtYXAsIGJvb2xlYW4gY2xvbmUpIHsKKworICAgICAgICB0aGlzKG1hcC52YWx1ZXMoKS5pdGVyYXRvcigpLCBjbG9uZSk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgPGNvZGU+SXRlcmF0b3I8L2NvZGU+IG92ZXIgd2hpY2ggdGhlIDxjb2RlPkVudW1lcmF0aW9uPC9jb2RlPgorICAgICAqIHJlcHJlc2VudGVkIGJ5IHRoaXMgY2xhc3MgYWN0dWFsbHkgb3BlcmF0ZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBJdGVyYXRvciBpdGVyYXRvciA9IG51bGw7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBUZXN0cyBpZiB0aGlzIGVudW1lcmF0aW9uIGNvbnRhaW5zIG1vcmUgZWxlbWVudHMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGFuZCBvbmx5IGlmIHRoaXMgZW51bWVyYXRpb24gb2JqZWN0CisgICAgICogIGNvbnRhaW5zIGF0IGxlYXN0IG9uZSBtb3JlIGVsZW1lbnQgdG8gcHJvdmlkZSwgPGNvZGU+ZmFsc2U8L2NvZGU+CisgICAgICogIG90aGVyd2lzZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc01vcmVFbGVtZW50cygpIHsKKworICAgICAgICByZXR1cm4gKGl0ZXJhdG9yLmhhc05leHQoKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG5leHQgZWxlbWVudCBvZiB0aGlzIGVudW1lcmF0aW9uIGlmIHRoaXMgZW51bWVyYXRpb24KKyAgICAgKiBoYXMgYXQgbGVhc3Qgb25lIG1vcmUgZWxlbWVudCB0byBwcm92aWRlLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbmV4dCBlbGVtZW50IG9mIHRoaXMgZW51bWVyYXRpb24KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBpZiBubyBtb3JlIGVsZW1lbnRzIGV4aXN0CisgICAgICovCisgICAgcHVibGljIE9iamVjdCBuZXh0RWxlbWVudCgpIHRocm93cyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIHsKKworICAgICAgICByZXR1cm4gKGl0ZXJhdG9yLm5leHQoKSk7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvRXh0ZW5zaW9uLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9FeHRlbnNpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2JlMDY1Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvRXh0ZW5zaW9uLmphdmEKQEAgLTAsMCArMSwzMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbDsKKworCitpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKKworCisvKioKKyAqIFV0aWxpdHkgY2xhc3MgdGhhdCByZXByZXNlbnRzIGVpdGhlciBhbiBhdmFpbGFibGUgIk9wdGlvbmFsIFBhY2thZ2UiCisgKiAoZm9ybWVybHkga25vd24gYXMgIlN0YW5kYXJkIEV4dGVuc2lvbiIpIGFzIGRlc2NyaWJlZCBpbiB0aGUgbWFuaWZlc3QKKyAqIG9mIGEgSkFSIGZpbGUsIG9yIHRoZSByZXF1aXJlbWVudCBmb3Igc3VjaCBhbiBvcHRpb25hbCBwYWNrYWdlLiAgSXQgaXMKKyAqIHVzZWQgdG8gc3VwcG9ydCB0aGUgcmVxdWlyZW1lbnRzIG9mIHRoZSBTZXJ2bGV0IFNwZWNpZmljYXRpb24sIHZlcnNpb24KKyAqIDIuMywgcmVsYXRlZCB0byBwcm92aWRpbmcgc2hhcmVkIGV4dGVuc2lvbnMgdG8gYWxsIHdlYmFwcHMuCisgKiA8cD4KKyAqIEluIGFkZGl0aW9uLCBzdGF0aWMgdXRpbGl0eSBtZXRob2RzIGFyZSBhdmFpbGFibGUgdG8gc2NhbiBhIG1hbmlmZXN0CisgKiBhbmQgcmV0dXJuIGFuIGFycmF5IG9mIGVpdGhlciBhdmFpbGFibGUgb3IgcmVxdWlyZWQgb3B0aW9uYWwgbW9kdWxlcworICogZG9jdW1lbnRlZCBpbiB0aGF0IG1hbmlmZXN0LgorICogPHA+CisgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBvcHRpb25hbCBwYWNrYWdlcywgc2VlIHRoZSBkb2N1bWVudAorICogPGVtPk9wdGlvbmFsIFBhY2thZ2UgVmVyc2lvbmluZzwvZW0+IGluIHRoZSBkb2N1bWVudGF0aW9uIGJ1bmRsZSBmb3IgeW91cgorICogSmF2YTIgU3RhbmRhcmQgRWRpdGlvbiBwYWNrYWdlLCBpbiBmaWxlCisgKiA8Y29kZT5ndWlkZS9leHRlbnNpb25zL3ZlcnNpb25pbmcuaHRtbDwvY29kZT4uCisgKgorICogQGF1dGhvciBDcmFpZyBNY0NsYW5haGFuCisgKiBAYXV0aG9yIEp1c3R5bmEgSG9yd2F0CisgKiBAYXV0aG9yIEdyZWcgTXVycmF5CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBFeHRlbnNpb24geworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2YgdGhlIG9wdGlvbmFsIHBhY2thZ2UgYmVpbmcgbWFkZSBhdmFpbGFibGUsIG9yIHJlcXVpcmVkLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGV4dGVuc2lvbk5hbWUgPSBudWxsOworICAgIAorCisgICAgcHVibGljIFN0cmluZyBnZXRFeHRlbnNpb25OYW1lKCkgeworICAgICAgICByZXR1cm4gKHRoaXMuZXh0ZW5zaW9uTmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RXh0ZW5zaW9uTmFtZShTdHJpbmcgZXh0ZW5zaW9uTmFtZSkgeworICAgICAgICB0aGlzLmV4dGVuc2lvbk5hbWUgPSBleHRlbnNpb25OYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFVuaXF1ZUlkIGNyZWF0ZWQgYnkgY29tYmluaW5nIHRoZSBleHRlbnNpb24gbmFtZSBhbmQgaW1wbGVtZW50YXRpb24KKyAgICAgKiB2ZXJzaW9uLiAKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFVuaXF1ZUlkKCkgeworICAgICAgICByZXR1cm4gdGhpcy5leHRlbnNpb25OYW1lICsgdGhpcy5pbXBsZW1lbnRhdGlvblZlcnNpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIFVSTCBmcm9tIHdoaWNoIHRoZSBtb3N0IHJlY2VudCB2ZXJzaW9uIG9mIHRoaXMgb3B0aW9uYWwgcGFja2FnZQorICAgICAqIGNhbiBiZSBvYnRhaW5lZCBpZiBpdCBpcyBub3QgYWxyZWFkeSBpbnN0YWxsZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgaW1wbGVtZW50YXRpb25VUkwgPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXRJbXBsZW1lbnRhdGlvblVSTCgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLmltcGxlbWVudGF0aW9uVVJMKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJbXBsZW1lbnRhdGlvblVSTChTdHJpbmcgaW1wbGVtZW50YXRpb25VUkwpIHsKKyAgICAgICAgdGhpcy5pbXBsZW1lbnRhdGlvblVSTCA9IGltcGxlbWVudGF0aW9uVVJMOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2YgdGhlIGNvbXBhbnkgb3Igb3JnYW5pemF0aW9uIHRoYXQgcHJvZHVjZWQgdGhpcworICAgICAqIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgb3B0aW9uYWwgcGFja2FnZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBpbXBsZW1lbnRhdGlvblZlbmRvciA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEltcGxlbWVudGF0aW9uVmVuZG9yKCkgeworICAgICAgICByZXR1cm4gKHRoaXMuaW1wbGVtZW50YXRpb25WZW5kb3IpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEltcGxlbWVudGF0aW9uVmVuZG9yKFN0cmluZyBpbXBsZW1lbnRhdGlvblZlbmRvcikgeworICAgICAgICB0aGlzLmltcGxlbWVudGF0aW9uVmVuZG9yID0gaW1wbGVtZW50YXRpb25WZW5kb3I7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm9kdWNlZCB0aGUgb3B0aW9uYWwKKyAgICAgKiBwYWNrYWdlIGNvbnRhaW5lZCBpbiB0aGlzIEpBUiBmaWxlLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGltcGxlbWVudGF0aW9uVmVuZG9ySWQgPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXRJbXBsZW1lbnRhdGlvblZlbmRvcklkKCkgeworICAgICAgICByZXR1cm4gKHRoaXMuaW1wbGVtZW50YXRpb25WZW5kb3JJZCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SW1wbGVtZW50YXRpb25WZW5kb3JJZChTdHJpbmcgaW1wbGVtZW50YXRpb25WZW5kb3JJZCkgeworICAgICAgICB0aGlzLmltcGxlbWVudGF0aW9uVmVuZG9ySWQgPSBpbXBsZW1lbnRhdGlvblZlbmRvcklkOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIHZlcnNpb24gbnVtYmVyIChkb3R0ZWQgZGVjaW1hbCBub3RhdGlvbikgZm9yIHRoaXMgaW1wbGVtZW50YXRpb24KKyAgICAgKiBvZiB0aGUgb3B0aW9uYWwgcGFja2FnZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBpbXBsZW1lbnRhdGlvblZlcnNpb24gPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXRJbXBsZW1lbnRhdGlvblZlcnNpb24oKSB7CisgICAgICAgIHJldHVybiAodGhpcy5pbXBsZW1lbnRhdGlvblZlcnNpb24pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEltcGxlbWVudGF0aW9uVmVyc2lvbihTdHJpbmcgaW1wbGVtZW50YXRpb25WZXJzaW9uKSB7CisgICAgICAgIHRoaXMuaW1wbGVtZW50YXRpb25WZXJzaW9uID0gaW1wbGVtZW50YXRpb25WZXJzaW9uOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2YgdGhlIGNvbXBhbnkgb3Igb3JnYW5pemF0aW9uIHRoYXQgb3JpZ2luYXRlZCB0aGUKKyAgICAgKiBzcGVjaWZpY2F0aW9uIHRvIHdoaWNoIHRoaXMgb3B0aW9uYWwgcGFja2FnZSBjb25mb3Jtcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBzcGVjaWZpY2F0aW9uVmVuZG9yID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWNhdGlvblZlbmRvcigpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLnNwZWNpZmljYXRpb25WZW5kb3IpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFNwZWNpZmljYXRpb25WZW5kb3IoU3RyaW5nIHNwZWNpZmljYXRpb25WZW5kb3IpIHsKKyAgICAgICAgdGhpcy5zcGVjaWZpY2F0aW9uVmVuZG9yID0gc3BlY2lmaWNhdGlvblZlbmRvcjsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSB2ZXJzaW9uIG51bWJlciAoZG90dGVkIGRlY2ltYWwgbm90YXRpb24pIG9mIHRoZSBzcGVjaWZpY2F0aW9uCisgICAgICogdG8gd2hpY2ggdGhpcyBvcHRpb25hbCBwYWNrYWdlIGNvbmZvcm1zLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHNwZWNpZmljYXRpb25WZXJzaW9uID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWNhdGlvblZlcnNpb24oKSB7CisgICAgICAgIHJldHVybiAodGhpcy5zcGVjaWZpY2F0aW9uVmVyc2lvbik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U3BlY2lmaWNhdGlvblZlcnNpb24oU3RyaW5nIHNwZWNpZmljYXRpb25WZXJzaW9uKSB7CisgICAgICAgIHRoaXMuc3BlY2lmaWNhdGlvblZlcnNpb24gPSBzcGVjaWZpY2F0aW9uVmVyc2lvbjsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIGZ1bGZpbGxlZCBpcyB0cnVlIGlmIGFsbCB0aGUgcmVxdWlyZWQgZXh0ZW5zaW9uIGRlcGVuZGVuY2llcyBoYXZlIGJlZW4KKyAgICAgKiBzYXRpc2ZpZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gZnVsZmlsbGVkID0gZmFsc2U7CisKKyAgICBwdWJsaWMgdm9pZCBzZXRGdWxmaWxsZWQoYm9vbGVhbiBmdWxmaWxsZWQpIHsKKyAgICAgICAgdGhpcy5mdWxmaWxsZWQgPSBmdWxmaWxsZWQ7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIGlzRnVsZmlsbGVkKCkgeworICAgICAgICByZXR1cm4gZnVsZmlsbGVkOworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisgICAgLyoqCisgICAgICogUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgPGNvZGU+RXh0ZW5zaW9uPC9jb2RlPgorICAgICAqICh3aGljaCByZXByZXNlbnRzIGFuIG9wdGlvbmFsIHBhY2thZ2UgcmVxdWlyZWQgYnkgdGhpcyBhcHBsaWNhdGlvbikKKyAgICAgKiBpcyBzYXRpc2ZpZWQgYnkgdGhpcyA8Y29kZT5FeHRlbnNpb248L2NvZGU+ICh3aGljaCByZXByZXNlbnRzIGFuCisgICAgICogb3B0aW9uYWwgcGFja2FnZSB0aGF0IGlzIGFscmVhZHkgaW5zdGFsbGVkLiAgT3RoZXJ3aXNlLCByZXR1cm4KKyAgICAgKiA8Y29kZT5mYWxzZTwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWlyZWQgRXh0ZW5zaW9uIG9mIHRoZSByZXF1aXJlZCBvcHRpb25hbCBwYWNrYWdlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNDb21wYXRpYmxlV2l0aChFeHRlbnNpb24gcmVxdWlyZWQpIHsKKworICAgICAgICAvLyBFeHRlbnNpb24gTmFtZSBtdXN0IG1hdGNoCisgICAgICAgIGlmIChleHRlbnNpb25OYW1lID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKGZhbHNlKTsKKyAgICAgICAgaWYgKCFleHRlbnNpb25OYW1lLmVxdWFscyhyZXF1aXJlZC5nZXRFeHRlbnNpb25OYW1lKCkpKQorICAgICAgICAgICAgcmV0dXJuIChmYWxzZSk7CisKKyAgICAgICAgLy8gQXZhaWxhYmxlIHNwZWNpZmljYXRpb24gdmVyc2lvbiBtdXN0IGJlID49IHJlcXVpcmVkCisgICAgICAgIGlmICghaXNOZXdlcihzcGVjaWZpY2F0aW9uVmVyc2lvbiwgcmVxdWlyZWQuZ2V0U3BlY2lmaWNhdGlvblZlcnNpb24oKSkpCisgICAgICAgICAgICByZXR1cm4gKGZhbHNlKTsKKworICAgICAgICAvLyBJbXBsZW1lbnRhdGlvbiBWZW5kb3IgSUQgbXVzdCBtYXRjaAorICAgICAgICBpZiAoaW1wbGVtZW50YXRpb25WZW5kb3JJZCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChmYWxzZSk7CisgICAgICAgIGlmICghaW1wbGVtZW50YXRpb25WZW5kb3JJZC5lcXVhbHMocmVxdWlyZWQuZ2V0SW1wbGVtZW50YXRpb25WZW5kb3JJZCgpKSkKKyAgICAgICAgICAgIHJldHVybiAoZmFsc2UpOworCisgICAgICAgIC8vIEltcGxlbWVudGF0aW9uIHZlcnNpb24gbXVzdCBiZSA+PSByZXF1aXJlZAorICAgICAgICBpZiAoIWlzTmV3ZXIoaW1wbGVtZW50YXRpb25WZXJzaW9uLCByZXF1aXJlZC5nZXRJbXBsZW1lbnRhdGlvblZlcnNpb24oKSkpCisgICAgICAgICAgICByZXR1cm4gKGZhbHNlKTsKKworICAgICAgICAvLyBUaGlzIGF2YWlsYWJsZSBvcHRpb25hbCBwYWNrYWdlIHNhdGlzZmllcyB0aGUgcmVxdWlyZW1lbnRzCisgICAgICAgIHJldHVybiAodHJ1ZSk7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCJFeHRlbnNpb25bIik7CisgICAgICAgIHNiLmFwcGVuZChleHRlbnNpb25OYW1lKTsKKyAgICAgICAgaWYgKGltcGxlbWVudGF0aW9uVVJMICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiLCBpbXBsZW1lbnRhdGlvblVSTD0iKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChpbXBsZW1lbnRhdGlvblVSTCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGltcGxlbWVudGF0aW9uVmVuZG9yICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiLCBpbXBsZW1lbnRhdGlvblZlbmRvcj0iKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChpbXBsZW1lbnRhdGlvblZlbmRvcik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGltcGxlbWVudGF0aW9uVmVuZG9ySWQgIT0gbnVsbCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIsIGltcGxlbWVudGF0aW9uVmVuZG9ySWQ9Iik7CisgICAgICAgICAgICBzYi5hcHBlbmQoaW1wbGVtZW50YXRpb25WZW5kb3JJZCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGltcGxlbWVudGF0aW9uVmVyc2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiwgaW1wbGVtZW50YXRpb25WZXJzaW9uPSIpOworICAgICAgICAgICAgc2IuYXBwZW5kKGltcGxlbWVudGF0aW9uVmVyc2lvbik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNwZWNpZmljYXRpb25WZW5kb3IgIT0gbnVsbCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIsIHNwZWNpZmljYXRpb25WZW5kb3I9Iik7CisgICAgICAgICAgICBzYi5hcHBlbmQoc3BlY2lmaWNhdGlvblZlbmRvcik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNwZWNpZmljYXRpb25WZXJzaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiLCBzcGVjaWZpY2F0aW9uVmVyc2lvbj0iKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChzcGVjaWZpY2F0aW9uVmVyc2lvbik7CisgICAgICAgIH0KKyAgICAgICAgc2IuYXBwZW5kKCJdIik7CisgICAgICAgIHJldHVybiAoc2IudG9TdHJpbmcoKSk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByaXZhdGUgTWV0aG9kcworCisKKworICAgIC8qKgorICAgICAqIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZmlyc3QgdmVyc2lvbiBudW1iZXIgaXMgZ3JlYXRlciB0aGFuCisgICAgICogb3IgZXF1YWwgdG8gdGhlIHNlY29uZDsgb3RoZXJ3aXNlIHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlyc3QgRmlyc3QgdmVyc2lvbiBudW1iZXIgKGRvdHRlZCBkZWNpbWFsKQorICAgICAqIEBwYXJhbSBzZWNvbmQgU2Vjb25kIHZlcnNpb24gbnVtYmVyIChkb3R0ZWQgZGVjaW1hbCkKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG9uIGEgbWFsZm9ybWVkIHZlcnNpb24gbnVtYmVyCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGlzTmV3ZXIoU3RyaW5nIGZpcnN0LCBTdHJpbmcgc2Vjb25kKQorICAgICAgICB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIHsKKworICAgICAgICBpZiAoKGZpcnN0ID09IG51bGwpIHx8IChzZWNvbmQgPT0gbnVsbCkpCisgICAgICAgICAgICByZXR1cm4gKGZhbHNlKTsKKyAgICAgICAgaWYgKGZpcnN0LmVxdWFscyhzZWNvbmQpKQorICAgICAgICAgICAgcmV0dXJuICh0cnVlKTsKKworICAgICAgICBTdHJpbmdUb2tlbml6ZXIgZlRvayA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoZmlyc3QsICIuIiwgdHJ1ZSk7CisgICAgICAgIFN0cmluZ1Rva2VuaXplciBzVG9rID0gbmV3IFN0cmluZ1Rva2VuaXplcihzZWNvbmQsICIuIiwgdHJ1ZSk7CisgICAgICAgIGludCBmVmVyc2lvbiA9IDA7CisgICAgICAgIGludCBzVmVyc2lvbiA9IDA7CisgICAgICAgIHdoaWxlIChmVG9rLmhhc01vcmVUb2tlbnMoKSB8fCBzVG9rLmhhc01vcmVUb2tlbnMoKSkgeworICAgICAgICAgICAgaWYgKGZUb2suaGFzTW9yZVRva2VucygpKQorICAgICAgICAgICAgICAgIGZWZXJzaW9uID0gSW50ZWdlci5wYXJzZUludChmVG9rLm5leHRUb2tlbigpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBmVmVyc2lvbiA9IDA7CisgICAgICAgICAgICBpZiAoc1Rvay5oYXNNb3JlVG9rZW5zKCkpCisgICAgICAgICAgICAgICAgc1ZlcnNpb24gPSBJbnRlZ2VyLnBhcnNlSW50KHNUb2submV4dFRva2VuKCkpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHNWZXJzaW9uID0gMDsKKyAgICAgICAgICAgIGlmIChmVmVyc2lvbiA8IHNWZXJzaW9uKQorICAgICAgICAgICAgICAgIHJldHVybiAoZmFsc2UpOworICAgICAgICAgICAgZWxzZSBpZiAoZlZlcnNpb24gPiBzVmVyc2lvbikKKyAgICAgICAgICAgICAgICByZXR1cm4gKHRydWUpOworICAgICAgICAgICAgaWYgKGZUb2suaGFzTW9yZVRva2VucygpKSAgIC8vIFN3YWxsb3cgdGhlIHBlcmlvZHMKKyAgICAgICAgICAgICAgICBmVG9rLm5leHRUb2tlbigpOworICAgICAgICAgICAgaWYgKHNUb2suaGFzTW9yZVRva2VucygpKQorICAgICAgICAgICAgICAgIHNUb2submV4dFRva2VuKCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKHRydWUpOyAgLy8gRXhhY3QgbWF0Y2gKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9FeHRlbnNpb25WYWxpZGF0b3IuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL0V4dGVuc2lvblZhbGlkYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmYWRlZTkKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9FeHRlbnNpb25WYWxpZGF0b3IuamF2YQpAQCAtMCwwICsxLDQxOSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOworaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CitpbXBvcnQgamF2YS51dGlsLmphci5KYXJJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuamFyLk1hbmlmZXN0OworCitpbXBvcnQgamF2YXgubmFtaW5nLkJpbmRpbmc7CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWluZ0VudW1lcmF0aW9uOworaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1pbmdFeGNlcHRpb247CitpbXBvcnQgamF2YXgubmFtaW5nLmRpcmVjdG9yeS5EaXJDb250ZXh0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLm5hbWluZy5yZXNvdXJjZXMuUmVzb3VyY2U7CisKKworLyoqCisgKiBFbnN1cmVzIHRoYXQgYWxsIGV4dGVuc2lvbiBkZXBlbmRpZXMgYXJlIHJlc29sdmVkIGZvciBhIFdFQiBhcHBsaWNhdGlvbgorICogYXJlIG1ldC4gVGhpcyBjbGFzcyBidWlsZHMgYSBtYXN0ZXIgbGlzdCBvZiBleHRlbnNpb25zIGF2YWlsYWJsZSB0byBhbgorICogYXBwbGljYWl0b24gYW5kIHRoZW4gdmFsaWRhdGVzIHRob3NlIGV4dGVuc2lvbnMuCisgKgorICogU2VlIGh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjQvZG9jcy9ndWlkZS9leHRlbnNpb25zL3NwZWMuaHRtbCBmb3IKKyAqIGEgZGV0YWlsZWQgZXhwbGFuYXRpb24gb2YgdGhlIGV4dGVuc2lvbiBtZWNoYW5pc20gaW4gSmF2YS4KKyAqCisgKiBAYXV0aG9yIEdyZWcgTXVycmF5CisgKiBAYXV0aG9yIEp1c3R5bmEgSG9yd2F0CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICoKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEV4dGVuc2lvblZhbGlkYXRvciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2cgbG9nPQorICAgICAgICBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5LmdldExvZyhFeHRlbnNpb25WYWxpZGF0b3IuY2xhc3MpOworCisgICAgLyoqCisgICAgICogVGhlIHN0cmluZyByZXNvdXJjZXMgZm9yIHRoaXMgcGFja2FnZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmdNYW5hZ2VyIHNtID0KKyAgICAgICAgU3RyaW5nTWFuYWdlci5nZXRNYW5hZ2VyKCJvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwiKTsKKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBIYXNoTWFwIGNvbnRhaW5lckF2YWlsYWJsZUV4dGVuc2lvbnMgPSBudWxsOworICAgIHByaXZhdGUgc3RhdGljIEFycmF5TGlzdCBjb250YWluZXJNYW5pZmVzdFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBtZXNzYWdlcyA9IG51bGw7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFN0YXRpYyBJbml0aWFsaXplcgorCisKKyAgICAvKioKKyAgICAgKiAgVGhpcyBzdGF0aWMgaW5pdGlhbGl6ZXIgbG9hZHMgdGhlIGNvbnRhaW5lciBsZXZlbCBleHRlbnNpb25zIHRoYXQgYXJlCisgICAgICogIGF2YWlsYWJsZSB0byBhbGwgd2ViIGFwcGxpY2F0aW9ucy4gVGhpcyBtZXRob2Qgc2NhbnMgYWxsIGV4dGVuc2lvbiAKKyAgICAgKiAgZGlyZWN0b3JpZXMgYXZhaWxhYmxlIHZpYSB0aGUgImphdmEuZXh0LmRpcnMiIFN5c3RlbSBwcm9wZXJ0eS4gCisgICAgICoKKyAgICAgKiAgVGhlIFN5c3RlbSBDbGFzcy1QYXRoIGlzIGFsc28gc2Nhbm5lZCBmb3IgamFyIGZpbGVzIHRoYXQgbWF5IGNvbnRhaW4gCisgICAgICogIGF2YWlsYWJsZSBleHRlbnNpb25zLgorICAgICAqLworICAgIHN0YXRpYyB7CisKKyAgICAgICAgLy8gY2hlY2sgZm9yIGNvbnRhaW5lciBsZXZlbCBvcHRpb25hbCBwYWNrYWdlcworICAgICAgICBTdHJpbmcgc3lzdGVtQ2xhc3NwYXRoID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmNsYXNzLnBhdGgiKTsKKworICAgICAgICBTdHJpbmdUb2tlbml6ZXIgc3RyVG9rID0gbmV3IFN0cmluZ1Rva2VuaXplcihzeXN0ZW1DbGFzc3BhdGgsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlLnBhdGhTZXBhcmF0b3IpOworCisgICAgICAgIC8vIGJ1aWxkIGEgbGlzdCBvZiBqYXIgZmlsZXMgaW4gdGhlIGNsYXNzcGF0aAorICAgICAgICB3aGlsZSAoc3RyVG9rLmhhc01vcmVUb2tlbnMoKSkgeworICAgICAgICAgICAgU3RyaW5nIGNsYXNzcGF0aEl0ZW0gPSBzdHJUb2submV4dFRva2VuKCk7CisgICAgICAgICAgICBpZiAoY2xhc3NwYXRoSXRlbS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCIuamFyIikpIHsKKyAgICAgICAgICAgICAgICBGaWxlIGl0ZW0gPSBuZXcgRmlsZShjbGFzc3BhdGhJdGVtKTsKKyAgICAgICAgICAgICAgICBpZiAoaXRlbS5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWRkU3lzdGVtUmVzb3VyY2UoaXRlbSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcihzbS5nZXRTdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImV4dGVuc2lvblZhbGlkYXRvci5mYWlsbG9hZCIsIGl0ZW0pLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGFkZCBzcGVjaWZpZWQgZm9sZGVycyB0byB0aGUgbGlzdAorICAgICAgICBhZGRGb2xkZXJMaXN0KCJqYXZhLmV4dC5kaXJzIik7CisgICAgICAgIGFkZEZvbGRlckxpc3QoImNhdGFsaW5hLmV4dC5kaXJzIik7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSdW50aW1lIHZhbGlkYXRpb24gb2YgYSBXZWIgQXBwbGljYWl0b24uCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCB1c2VzIEpOREkgdG8gbG9vayB1cCB0aGUgcmVzb3VyY2VzIGxvY2F0ZWQgdW5kZXIgYSAKKyAgICAgKiA8Y29kZT5EaXJDb250ZXh0PC9jb2RlPi4gSXQgbG9jYXRlcyBXZWIgQXBwbGljYXRpb24gTUFOSUZFU1QuTUYgCisgICAgICogZmlsZSBpbiB0aGUgL01FVEEtSU5GLyBkaXJlY3Rvcnkgb2YgdGhlIGFwcGxpY2F0aW9uIGFuZCBhbGwgCisgICAgICogTUFOSUZFU1QuTUYgZmlsZXMgaW4gZWFjaCBKQVIgZmlsZSBsb2NhdGVkIGluIHRoZSBXRUItSU5GL2xpYiAKKyAgICAgKiBkaXJlY3RvcnkgYW5kIGNyZWF0ZXMgYW4gPGNvZGU+QXJyYXlMaXN0PC9jb2RlPiBvZiAKKyAgICAgKiA8Y29kZT5NYW5pZmVzdFJlc29yY2U8Y29kZT4gb2JqZWN0cy4gVGhlc2Ugb2JqZWN0cyBhcmUgdGhlbiBwYXNzZWQgCisgICAgICogdG8gdGhlIHZhbGlkYXRlTWFuaWZlc3RSZXNvdXJjZXMgbWV0aG9kIGZvciB2YWxpZGF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGRpckNvbnRleHQgVGhlIEpOREkgcm9vdCBvZiB0aGUgV2ViIEFwcGxpY2F0aW9uCisgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgZnJvbSB3aGljaCB0aGUgTG9nZ2VyIGFuZCBwYXRoIHRvIHRoZQorICAgICAqICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgYWxsIHJlcXVpcmVkIGV4dGVuc2lvbnMgc2F0aXNmaWVkCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiB2YWxpZGF0ZUFwcGxpY2F0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpckNvbnRleHQgZGlyQ29udGV4dCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhbmRhcmRDb250ZXh0IGNvbnRleHQpCisgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgU3RyaW5nIGFwcE5hbWUgPSBjb250ZXh0LmdldFBhdGgoKTsKKyAgICAgICAgQXJyYXlMaXN0IGFwcE1hbmlmZXN0UmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBNYW5pZmVzdFJlc291cmNlIGFwcE1hbmlmZXN0UmVzb3VyY2UgPSBudWxsOworICAgICAgICAvLyBJZiB0aGUgYXBwbGljYXRpb24gY29udGV4dCBpcyBudWxsIGl0IGRvZXMgbm90IGV4aXN0IGFuZCAKKyAgICAgICAgLy8gdGhlcmVmb3JlIGlzIG5vdCB2YWxpZAorICAgICAgICBpZiAoZGlyQ29udGV4dCA9PSBudWxsKSByZXR1cm4gZmFsc2U7CisgICAgICAgIC8vIEZpbmQgdGhlIE1hbmlmZXN0IGZvciB0aGUgV2ViIEFwcGxpY2FpdG9uCisgICAgICAgIElucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE5hbWluZ0VudW1lcmF0aW9uIHduZSA9IGRpckNvbnRleHQubGlzdEJpbmRpbmdzKCIvTUVUQS1JTkYvIik7CisgICAgICAgICAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZykgd25lLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICBpZiAoYmluZGluZy5nZXROYW1lKCkudG9VcHBlckNhc2UoKS5lcXVhbHMoIk1BTklGRVNULk1GIikpIHsKKyAgICAgICAgICAgICAgICBSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSlkaXJDb250ZXh0Lmxvb2t1cAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCIvTUVUQS1JTkYvIiArIGJpbmRpbmcuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbSA9IHJlc291cmNlLnN0cmVhbUNvbnRlbnQoKTsKKyAgICAgICAgICAgICAgICBNYW5pZmVzdCBtYW5pZmVzdCA9IG5ldyBNYW5pZmVzdChpbnB1dFN0cmVhbSk7CisgICAgICAgICAgICAgICAgaW5wdXRTdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbSA9IG51bGw7CisgICAgICAgICAgICAgICAgTWFuaWZlc3RSZXNvdXJjZSBtcmUgPSBuZXcgTWFuaWZlc3RSZXNvdXJjZQorICAgICAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJleHRlbnNpb25WYWxpZGF0b3Iud2ViLWFwcGxpY2F0aW9uLW1hbmlmZXN0IiksCisgICAgICAgICAgICAgICAgICAgIG1hbmlmZXN0LCBNYW5pZmVzdFJlc291cmNlLldBUik7CisgICAgICAgICAgICAgICAgYXBwTWFuaWZlc3RSZXNvdXJjZXMuYWRkKG1yZSk7CisgICAgICAgICAgICB9IAorICAgICAgICB9IGNhdGNoIChOYW1pbmdFeGNlcHRpb24gbmV4KSB7CisgICAgICAgICAgICAvLyBBcHBsaWNhdGlvbiBkb2VzIG5vdCBjb250YWluIGEgTUFOSUZFU1QuTUYgZmlsZQorICAgICAgICB9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5zZSkgeworICAgICAgICAgICAgLy8gQXBwbGljYXRpb24gZG9lcyBub3QgY29udGFpbiBhIE1BTklGRVNULk1GIGZpbGUKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChpbnB1dFN0cmVhbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRTdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBMb2NhdGUgdGhlIE1hbmlmZXN0cyBmb3IgYWxsIGJ1bmRsZWQgSkFScworICAgICAgICBOYW1pbmdFbnVtZXJhdGlvbiBuZSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoZGlyQ29udGV4dCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbmUgPSBkaXJDb250ZXh0Lmxpc3RCaW5kaW5ncygiV0VCLUlORi9saWIvIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAoKG5lICE9IG51bGwpICYmIG5lLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgQmluZGluZyBiaW5kaW5nID0gKEJpbmRpbmcpbmUubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJpbmRpbmcuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoIi5qYXIiKSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpZGlyQ29udGV4dC5sb29rdXAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIi9XRUItSU5GL2xpYi8iICsgYmluZGluZy5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIE1hbmlmZXN0IGptYW5pZmVzdCA9IGdldE1hbmlmZXN0KHJlc291cmNlLnN0cmVhbUNvbnRlbnQoKSk7CisgICAgICAgICAgICAgICAgaWYgKGptYW5pZmVzdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIE1hbmlmZXN0UmVzb3VyY2UgbXJlID0gbmV3IE1hbmlmZXN0UmVzb3VyY2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kaW5nLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGptYW5pZmVzdCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYW5pZmVzdFJlc291cmNlLkFQUExJQ0FUSU9OKTsKKyAgICAgICAgICAgICAgICAgICAgYXBwTWFuaWZlc3RSZXNvdXJjZXMuYWRkKG1yZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChOYW1pbmdFeGNlcHRpb24gbmV4KSB7CisgICAgICAgICAgICAvLyBKdW1wIG91dCBvZiB0aGUgY2hlY2sgZm9yIHRoaXMgYXBwbGljYXRpb24gYmVjYXVzZSBpdCAKKyAgICAgICAgICAgIC8vIGhhcyBubyByZXNvdXJjZXMKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB2YWxpZGF0ZU1hbmlmZXN0UmVzb3VyY2VzKGFwcE5hbWUsIGFwcE1hbmlmZXN0UmVzb3VyY2VzKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENoZWNrcyB0byBzZWUgaWYgdGhlIGdpdmVuIHN5c3RlbSBKQVIgZmlsZSBjb250YWlucyBhIE1BTklGRVNULCBhbmQgYWRkcworICAgICAqIGl0IHRvIHRoZSBjb250YWluZXIncyBtYW5pZmVzdCByZXNvdXJjZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gamFyRmlsZSBUaGUgc3lzdGVtIEpBUiB3aG9zZSBtYW5pZmVzdCB0byBhZGQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkU3lzdGVtUmVzb3VyY2UoRmlsZSBqYXJGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBNYW5pZmVzdCBtYW5pZmVzdCA9IGdldE1hbmlmZXN0KG5ldyBGaWxlSW5wdXRTdHJlYW0oamFyRmlsZSkpOworICAgICAgICBpZiAobWFuaWZlc3QgIT0gbnVsbCkgIHsKKyAgICAgICAgICAgIE1hbmlmZXN0UmVzb3VyY2UgbXJlCisgICAgICAgICAgICAgICAgPSBuZXcgTWFuaWZlc3RSZXNvdXJjZShqYXJGaWxlLmdldEFic29sdXRlUGF0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFuaWZlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYW5pZmVzdFJlc291cmNlLlNZU1RFTSk7CisgICAgICAgICAgICBjb250YWluZXJNYW5pZmVzdFJlc291cmNlcy5hZGQobXJlKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJpdmF0ZSBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFZhbGlkYXRlcyBhIDxjb2RlPkFycmF5TGlzdDwvY29kZT4gb2YgPGNvZGU+TWFuaWZlc3RSZXNvdXJjZTwvY29kZT4gCisgICAgICogb2JqZWN0cy4gVGhpcyBtZXRob2QgcmVxdWlyZXMgYW4gYXBwbGljYXRpb24gbmFtZSAod2hpY2ggaXMgdGhlIAorICAgICAqIGNvbnRleHQgcm9vdCBvZiB0aGUgYXBwbGljYXRpb24gYXQgcnVudGltZSkuICAKKyAgICAgKgorICAgICAqIDxjb2RlPmZhbHNlPC9mYWxzZT4gaXMgcmV0dXJuZWQgaWYgdGhlIGV4dGVuc2lvbiBkZXBlbmRlbmNpZXMKKyAgICAgKiByZXByZXNlbnRlZCBieSBhbnkgZ2l2ZW4gPGNvZGU+TWFuaWZlc3RSZXNvdXJjZTwvY29kZT4gb2JqZWN0cyAKKyAgICAgKiBpcyBub3QgbWV0LgorICAgICAqCisgICAgICogVGhpcyBtZXRob2Qgc2hvdWxkIGFsc28gcHJvdmlkZSBzdGF0aWMgdmFsaWRhdGlvbiBvZiBhIFdlYiBBcHBsaWNhaXRvbiAKKyAgICAgKiBpZiBwcm92aWRlZCB3aXRoIHRoZSBuZWNlc3NhcnkgcGFyYW1ldGVycy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhcHBOYW1lIFRoZSBuYW1lIG9mIHRoZSBBcHBsaWNhdGlvbiB0aGF0IHdpbGwgYXBwZWFyIGluIHRoZSAKKyAgICAgKiAgICAgICAgICAgICAgICBlcnJvciBtZXNzYWdlcworICAgICAqIEBwYXJhbSByZXNvdXJjZXMgQSBsaXN0IG9mIDxjb2RlPk1hbmlmZXN0UmVzb3VyY2U8L2NvZGU+IG9iamVjdHMgCisgICAgICogICAgICAgICAgICAgICAgICB0byBiZSB2YWxpZGF0ZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgbWFuaWZlc3QgcmVzb3VyY2UgZmlsZSByZXF1aXJlbWVudHMgYXJlIG1ldAorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gdmFsaWRhdGVNYW5pZmVzdFJlc291cmNlcyhTdHJpbmcgYXBwTmFtZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5TGlzdCByZXNvdXJjZXMpIHsKKyAgICAgICAgYm9vbGVhbiBwYXNzZXMgPSB0cnVlOworICAgICAgICBpbnQgZmFpbHVyZUNvdW50ID0gMDsgICAgICAgIAorICAgICAgICBIYXNoTWFwIGF2YWlsYWJsZUV4dGVuc2lvbnMgPSBudWxsOworCisgICAgICAgIEl0ZXJhdG9yIGl0ID0gcmVzb3VyY2VzLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIE1hbmlmZXN0UmVzb3VyY2UgbXJlID0gKE1hbmlmZXN0UmVzb3VyY2UpaXQubmV4dCgpOworICAgICAgICAgICAgQXJyYXlMaXN0IHJlcXVpcmVkTGlzdCA9IG1yZS5nZXRSZXF1aXJlZEV4dGVuc2lvbnMoKTsKKyAgICAgICAgICAgIGlmIChyZXF1aXJlZExpc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBidWlsZCB0aGUgbGlzdCBvZiBhdmFpbGFibGUgZXh0ZW5zaW9ucyBpZiBuZWNlc3NhcnkKKyAgICAgICAgICAgIGlmIChhdmFpbGFibGVFeHRlbnNpb25zID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBhdmFpbGFibGVFeHRlbnNpb25zID0gYnVpbGRBdmFpbGFibGVFeHRlbnNpb25zTWFwKHJlc291cmNlcyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGxvYWQgdGhlIGNvbnRhaW5lciBsZXZlbCByZXNvdXJjZSBtYXAgaWYgaXQgaGFzIG5vdCBiZWVuIGJ1aWx0CisgICAgICAgICAgICAvLyB5ZXQKKyAgICAgICAgICAgIGlmIChjb250YWluZXJBdmFpbGFibGVFeHRlbnNpb25zID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjb250YWluZXJBdmFpbGFibGVFeHRlbnNpb25zCisgICAgICAgICAgICAgICAgICAgID0gYnVpbGRBdmFpbGFibGVFeHRlbnNpb25zTWFwKGNvbnRhaW5lck1hbmlmZXN0UmVzb3VyY2VzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gaXRlcmF0ZSB0aHJvdWdoIHRoZSBsaXN0IG9mIHJlcXVpcmVkIGV4dGVuc2lvbnMKKyAgICAgICAgICAgIEl0ZXJhdG9yIHJpdCA9IHJlcXVpcmVkTGlzdC5pdGVyYXRvcigpOworICAgICAgICAgICAgd2hpbGUgKHJpdC5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBFeHRlbnNpb24gcmVxdWlyZWRFeHQgPSAoRXh0ZW5zaW9uKXJpdC5uZXh0KCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIGV4dElkID0gcmVxdWlyZWRFeHQuZ2V0VW5pcXVlSWQoKTsKKyAgICAgICAgICAgICAgICAvLyBjaGVjayB0aGUgYXBwbGljYWlvbiBpdHNlbGYgZm9yIHRoZSBleHRlbnNpb24KKyAgICAgICAgICAgICAgICBpZiAoYXZhaWxhYmxlRXh0ZW5zaW9ucyAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGF2YWlsYWJsZUV4dGVuc2lvbnMuY29udGFpbnNLZXkoZXh0SWQpKSB7CisgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uIHRhcmdldEV4dCA9IChFeHRlbnNpb24pCisgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZUV4dGVuc2lvbnMuZ2V0KGV4dElkKTsKKyAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0RXh0LmlzQ29tcGF0aWJsZVdpdGgocmVxdWlyZWRFeHQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkRXh0LnNldEZ1bGZpbGxlZCh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gY2hlY2sgdGhlIGNvbnRhaW5lciBsZXZlbCBsaXN0IGZvciB0aGUgZXh0ZW5zaW9uCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb250YWluZXJBdmFpbGFibGVFeHRlbnNpb25zICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGNvbnRhaW5lckF2YWlsYWJsZUV4dGVuc2lvbnMuY29udGFpbnNLZXkoZXh0SWQpKSB7CisgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uIHRhcmdldEV4dCA9IChFeHRlbnNpb24pCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lckF2YWlsYWJsZUV4dGVuc2lvbnMuZ2V0KGV4dElkKTsKKyAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0RXh0LmlzQ29tcGF0aWJsZVdpdGgocmVxdWlyZWRFeHQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkRXh0LnNldEZ1bGZpbGxlZCh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRmFpbHVyZQorICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbyhzbS5nZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAiZXh0ZW5zaW9uVmFsaWRhdG9yLmV4dGVuc2lvbi1ub3QtZm91bmQtZXJyb3IiLAorICAgICAgICAgICAgICAgICAgICAgICAgYXBwTmFtZSwgbXJlLmdldFJlc291cmNlTmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWRFeHQuZ2V0RXh0ZW5zaW9uTmFtZSgpKSk7CisgICAgICAgICAgICAgICAgICAgIHBhc3NlcyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBmYWlsdXJlQ291bnQrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXBhc3NlcykgeworICAgICAgICAgICAgbG9nLmluZm8oc20uZ2V0U3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgImV4dGVuc2lvblZhbGlkYXRvci5leHRlbnNpb24tdmFsaWRhdGlvbi1lcnJvciIsIGFwcE5hbWUsCisgICAgICAgICAgICAgICAgICAgICBmYWlsdXJlQ291bnQgKyAiIikpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHBhc3NlczsKKyAgICB9CisgICAgCisgICAvKiAKKyAgICAqIEJ1aWxkIHRoaXMgbGlzdCBvZiBhdmFpbGFibGUgZXh0ZW5zaW9ucyBzbyB0aGF0IHdlIGRvIG5vdCBoYXZlIHRvIAorICAgICogcmUtYnVpbGQgdGhpcyBsaXN0IGV2ZXJ5IHRpbWUgd2UgaXRlcmF0ZSB0aHJvdWdoIHRoZSBsaXN0IG9mIHJlcXVpcmVkIAorICAgICogZXh0ZW5zaW9ucy4gQWxsIGF2YWlsYWJsZSBleHRlbnNpb25zIGluIGFsbCBvZiB0aGUgCisgICAgKiA8Y29kZT5NYWluZmVzdFJlc291cmNlPC9jb2RlPiBvYmplY3RzIHdpbGwgYmUgYWRkZWQgdG8gYSAKKyAgICAqIDxjb2RlPkhhc2hNYXA8L2NvZGU+IHdoaWNoIGlzIHJldHVybmVkIG9uIHRoZSBmaXJzdCBkZXBlbmRlbmN5IGxpc3QKKyAgICAqIHByb2Nlc3NpbmcgcGFzcy4gCisgICAgKgorICAgICogVGhlIGtleSBpcyB0aGUgbmFtZSArIGltcGxlbWVudGF0aW9uIHZlcnNpb24uCisgICAgKgorICAgICogTk9URTogQSBsaXN0IGlzIGJ1aWx0IG9ubHkgaWYgdGhlcmUgaXMgYSBkZXBlbmRlbmN5IHRoYXQgbmVlZHMgCisgICAgKiB0byBiZSBjaGVja2VkIChwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24pLgorICAgICoKKyAgICAqIEBwYXJhbSByZXNvdXJjZXMgQSBsaXN0IG9mIDxjb2RlPk1hbmlmZXN0UmVzb3VyY2U8L2NvZGU+IG9iamVjdHMKKyAgICAqCisgICAgKiBAcmV0dXJuIEhhc2hNYXAgTWFwIG9mIGF2YWlsYWJsZSBleHRlbnNpb25zCisgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBIYXNoTWFwIGJ1aWxkQXZhaWxhYmxlRXh0ZW5zaW9uc01hcChBcnJheUxpc3QgcmVzb3VyY2VzKSB7CisKKyAgICAgICAgSGFzaE1hcCBhdmFpbGFibGVNYXAgPSBudWxsOworCisgICAgICAgIEl0ZXJhdG9yIGl0ID0gcmVzb3VyY2VzLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIE1hbmlmZXN0UmVzb3VyY2UgbXJlID0gKE1hbmlmZXN0UmVzb3VyY2UpaXQubmV4dCgpOworICAgICAgICAgICAgSGFzaE1hcCBtYXAgPSBtcmUuZ2V0QXZhaWxhYmxlRXh0ZW5zaW9ucygpOworICAgICAgICAgICAgaWYgKG1hcCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgSXRlcmF0b3IgdmFsdWVzID0gbWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKHZhbHVlcy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uIGV4dCA9IChFeHRlbnNpb24pIHZhbHVlcy5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChhdmFpbGFibGVNYXAgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlTWFwID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZU1hcC5wdXQoZXh0LmdldFVuaXF1ZUlkKCksIGV4dCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWF2YWlsYWJsZU1hcC5jb250YWluc0tleShleHQuZ2V0VW5pcXVlSWQoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZU1hcC5wdXQoZXh0LmdldFVuaXF1ZUlkKCksIGV4dCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gYXZhaWxhYmxlTWFwOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIE1hbmlmZXN0IGZyb20gYSBqYXIgZmlsZSBvciB3YXIgZmlsZQorICAgICAqCisgICAgICogQHBhcmFtIGluU3RyZWFtIElucHV0IHN0cmVhbSB0byBhIFdBUiBvciBKQVIgZmlsZQorICAgICAqIEByZXR1cm4gVGhlIFdBUidzIG9yIEpBUidzIG1hbmlmZXN0CisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgTWFuaWZlc3QgZ2V0TWFuaWZlc3QoSW5wdXRTdHJlYW0gaW5TdHJlYW0pCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIE1hbmlmZXN0IG1hbmlmZXN0ID0gbnVsbDsKKyAgICAgICAgSmFySW5wdXRTdHJlYW0gamluID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgamluID0gbmV3IEphcklucHV0U3RyZWFtKGluU3RyZWFtKTsKKyAgICAgICAgICAgIG1hbmlmZXN0ID0gamluLmdldE1hbmlmZXN0KCk7CisgICAgICAgICAgICBqaW4uY2xvc2UoKTsKKyAgICAgICAgICAgIGppbiA9IG51bGw7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoamluICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBqaW4uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbWFuaWZlc3Q7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBZGQgdGhlIEpBUnMgc3BlY2lmaWVkIHRvIHRoZSBleHRlbnNpb24gbGlzdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFkZEZvbGRlckxpc3QoU3RyaW5nIHByb3BlcnR5KSB7CisKKyAgICAgICAgLy8gZ2V0IHRoZSBmaWxlcyBpbiB0aGUgZXh0ZW5zaW9ucyBkaXJlY3RvcnkKKyAgICAgICAgU3RyaW5nIGV4dGVuc2lvbnNEaXIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkocHJvcGVydHkpOworICAgICAgICBpZiAoZXh0ZW5zaW9uc0RpciAhPSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmdUb2tlbml6ZXIgZXh0ZW5zaW9uc1RvaworICAgICAgICAgICAgICAgID0gbmV3IFN0cmluZ1Rva2VuaXplcihleHRlbnNpb25zRGlyLCBGaWxlLnBhdGhTZXBhcmF0b3IpOworICAgICAgICAgICAgd2hpbGUgKGV4dGVuc2lvbnNUb2suaGFzTW9yZVRva2VucygpKSB7CisgICAgICAgICAgICAgICAgRmlsZSB0YXJnZXREaXIgPSBuZXcgRmlsZShleHRlbnNpb25zVG9rLm5leHRUb2tlbigpKTsKKyAgICAgICAgICAgICAgICBpZiAoIXRhcmdldERpci5leGlzdHMoKSB8fCAhdGFyZ2V0RGlyLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEZpbGVbXSBmaWxlcyA9IHRhcmdldERpci5saXN0RmlsZXMoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmaWxlc1tpXS5nZXROYW1lKCkudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLmphciIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZFN5c3RlbVJlc291cmNlKGZpbGVzW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJleHRlbnNpb25WYWxpZGF0b3IuZmFpbGxvYWQiLCBmaWxlc1tpXSksIGUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvRmFzdERhdGVGb3JtYXQuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL0Zhc3REYXRlRm9ybWF0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJhMmM1YwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL0Zhc3REYXRlRm9ybWF0LmphdmEKQEAgLTAsMCArMSwxMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKKworaW1wb3J0IGphdmEudGV4dC5EYXRlRm9ybWF0OworaW1wb3J0IGphdmEudGV4dC5GaWVsZFBvc2l0aW9uOworaW1wb3J0IGphdmEudGV4dC5QYXJzZVBvc2l0aW9uOworaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OworCisvKioKKyAqIEZhc3QgZGF0ZSBmb3JtYXR0ZXIgdGhhdCBjYWNoZXMgcmVjZW50bHkgZm9ybWF0dGVkIGRhdGUgaW5mb3JtYXRpb24KKyAqIGFuZCB1c2VzIGl0IHRvIGF2b2lkIHRvby1mcmVxdWVudCBjYWxscyB0byB0aGUgdW5kZXJseWluZworICogZm9ybWF0dGVyLiAgTm90ZTogYnJlYWtzIGZpZWxkUG9zaXRpb24gcGFyYW0gb2YgZm9ybWF0KERhdGUsCisgKiBTdHJpbmdCdWZmZXIsIEZpZWxkUG9zaXRpb24pLiAgSWYgeW91IGNhcmUgYWJvdXQgdGhlIGZpZWxkCisgKiBwb3NpdGlvbiwgY2FsbCB0aGUgdW5kZXJseWluZyBEYXRlRm9ybWF0IGRpcmVjdGx5LgorICoKKyAqIEBhdXRob3IgU3RhbiBCYWlsZXMKKyAqIEBhdXRob3IgQWxleCBDaGFmZmVlCisgKiovCitwdWJsaWMgY2xhc3MgRmFzdERhdGVGb3JtYXQgZXh0ZW5kcyBEYXRlRm9ybWF0IHsKKyAgICBEYXRlRm9ybWF0ICAgIGRmOworICAgIGxvbmcgICAgICAgICAgbGFzdFNlYyA9IC0xOworICAgIFN0cmluZ0J1ZmZlciAgc2IgICAgICA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICBGaWVsZFBvc2l0aW9uIGZwICAgICAgPSBuZXcgRmllbGRQb3NpdGlvbihEYXRlRm9ybWF0Lk1JTExJU0VDT05EX0ZJRUxEKTsKKworICAgIHB1YmxpYyBGYXN0RGF0ZUZvcm1hdChEYXRlRm9ybWF0IGRmKSB7CisgICAgICAgIHRoaXMuZGYgPSBkZjsKKyAgICB9CisKKyAgICBwdWJsaWMgRGF0ZSBwYXJzZShTdHJpbmcgdGV4dCwgUGFyc2VQb3NpdGlvbiBwb3MpIHsKKyAgICAgICAgcmV0dXJuIGRmLnBhcnNlKHRleHQsIHBvcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTm90ZTogYnJlYWtzIGZ1bmN0aW9uYWxpdHkgb2YgZmllbGRQb3NpdGlvbiBwYXJhbS4gQWxzbzoKKyAgICAgKiB0aGVyZSdzIGEgYnVnIGluIFNpbXBsZURhdGVGb3JtYXQgd2l0aCAiUyIgYW5kICJTUyIsIHVzZSAiU1NTIgorICAgICAqIGluc3RlYWQgaWYgeW91IHdhbnQgYSBtc2VjIGZpZWxkLgorICAgICAqKi8KKyAgICBwdWJsaWMgU3RyaW5nQnVmZmVyIGZvcm1hdChEYXRlIGRhdGUsIFN0cmluZ0J1ZmZlciB0b0FwcGVuZFRvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkUG9zaXRpb24gZmllbGRQb3NpdGlvbikgeworICAgICAgICBsb25nIGR0ID0gZGF0ZS5nZXRUaW1lKCk7CisgICAgICAgIGxvbmcgZHMgPSBkdCAvIDEwMDA7CisgICAgICAgIGlmIChkcyAhPSBsYXN0U2VjKSB7CisgICAgICAgICAgICBzYi5zZXRMZW5ndGgoMCk7CisgICAgICAgICAgICBkZi5mb3JtYXQoZGF0ZSwgc2IsIGZwKTsKKyAgICAgICAgICAgIGxhc3RTZWMgPSBkczsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIG11bmdlIGN1cnJlbnQgbXNlYyBpbnRvIGV4aXN0aW5nIHN0cmluZworICAgICAgICAgICAgaW50IG1zID0gKGludCkoZHQgJSAxMDAwKTsKKyAgICAgICAgICAgIGludCBwb3MgPSBmcC5nZXRFbmRJbmRleCgpOworICAgICAgICAgICAgaW50IGJlZ2luID0gZnAuZ2V0QmVnaW5JbmRleCgpOworICAgICAgICAgICAgaWYgKHBvcyA+IDApIHsKKyAgICAgICAgICAgICAgICBpZiAocG9zID4gYmVnaW4pCisgICAgICAgICAgICAgICAgICAgIHNiLnNldENoYXJBdCgtLXBvcywgQ2hhcmFjdGVyLmZvckRpZ2l0KG1zICUgMTAsIDEwKSk7CisgICAgICAgICAgICAgICAgbXMgLz0gMTA7CisgICAgICAgICAgICAgICAgaWYgKHBvcyA+IGJlZ2luKQorICAgICAgICAgICAgICAgICAgICBzYi5zZXRDaGFyQXQoLS1wb3MsIENoYXJhY3Rlci5mb3JEaWdpdChtcyAlIDEwLCAxMCkpOworICAgICAgICAgICAgICAgIG1zIC89IDEwOworICAgICAgICAgICAgICAgIGlmIChwb3MgPiBiZWdpbikKKyAgICAgICAgICAgICAgICAgICAgc2Iuc2V0Q2hhckF0KC0tcG9zLCBDaGFyYWN0ZXIuZm9yRGlnaXQobXMgJSAxMCwgMTApKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB0b0FwcGVuZFRvLmFwcGVuZChzYi50b1N0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIHRvQXBwZW5kVG87CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICBTdHJpbmcgZm9ybWF0ID0gInl5eXktTU0tZGQgSEg6bW06c3MuU1NTIjsKKyAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID4gMCkKKyAgICAgICAgICAgIGZvcm1hdCA9IGFyZ3NbMF07CisgICAgICAgIFNpbXBsZURhdGVGb3JtYXQgc2RmID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoZm9ybWF0KTsKKyAgICAgICAgRmFzdERhdGVGb3JtYXQgZmRmID0gbmV3IEZhc3REYXRlRm9ybWF0KHNkZik7CisgICAgICAgIERhdGUgZCA9IG5ldyBEYXRlKCk7CisKKyAgICAgICAgZC5zZXRUaW1lKDEpOyBTeXN0ZW0ub3V0LnByaW50bG4oZmRmLmZvcm1hdChkKSArICJcdCIgKyBzZGYuZm9ybWF0KGQpKTsKKyAgICAgICAgZC5zZXRUaW1lKDIwKTsgU3lzdGVtLm91dC5wcmludGxuKGZkZi5mb3JtYXQoZCkgKyAiXHQiICsgc2RmLmZvcm1hdChkKSk7CisgICAgICAgIGQuc2V0VGltZSg1MDApOyBTeXN0ZW0ub3V0LnByaW50bG4oZmRmLmZvcm1hdChkKSArICJcdCIgKyBzZGYuZm9ybWF0KGQpKTsKKyAgICAgICAgZC5zZXRUaW1lKDU0Myk7IFN5c3RlbS5vdXQucHJpbnRsbihmZGYuZm9ybWF0KGQpICsgIlx0IiArIHNkZi5mb3JtYXQoZCkpOworICAgICAgICBkLnNldFRpbWUoOTk5KTsgU3lzdGVtLm91dC5wcmludGxuKGZkZi5mb3JtYXQoZCkgKyAiXHQiICsgc2RmLmZvcm1hdChkKSk7CisgICAgICAgIGQuc2V0VGltZSgxMDUwKTsgU3lzdGVtLm91dC5wcmludGxuKGZkZi5mb3JtYXQoZCkgKyAiXHQiICsgc2RmLmZvcm1hdChkKSk7CisgICAgICAgIGQuc2V0VGltZSgyNTQzKTsgU3lzdGVtLm91dC5wcmludGxuKGZkZi5mb3JtYXQoZCkgKyAiXHQiICsgc2RmLmZvcm1hdChkKSk7CisgICAgICAgIGQuc2V0VGltZSgxMjM0NSk7IFN5c3RlbS5vdXQucHJpbnRsbihmZGYuZm9ybWF0KGQpICsgIlx0IiArIHNkZi5mb3JtYXQoZCkpOworICAgICAgICBkLnNldFRpbWUoMTIzNDApOyBTeXN0ZW0ub3V0LnByaW50bG4oZmRmLmZvcm1hdChkKSArICJcdCIgKyBzZGYuZm9ybWF0KGQpKTsKKworICAgICAgICBmaW5hbCBpbnQgcmVwcyA9IDEwMDAwMDsKKyAgICAgICAgeworICAgICAgICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBkLnNldFRpbWUoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworICAgICAgICAgICAgICAgIGZkZi5mb3JtYXQoZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb25nIGVsYXAgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0OworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJmYXN0OiAiICsgZWxhcCArICIgZWxhcHNlZCIpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGZkZi5mb3JtYXQoZCkpOworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgaSsrKSB7CisgICAgICAgICAgICAgICAgZC5zZXRUaW1lKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKKyAgICAgICAgICAgICAgICBzZGYuZm9ybWF0KGQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9uZyBlbGFwID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydDsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigic2xvdzogIiArIGVsYXAgKyAiIGVsYXBzZWQiKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihzZGYuZm9ybWF0KGQpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL0hleFV0aWxzLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9IZXhVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzZDkyMGYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9IZXhVdGlscy5qYXZhCkBAIC0wLDAgKzEsMTc2IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWw7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKKworLyoqCisgKiBMaWJyYXJ5IG9mIHV0aWxpdHkgbWV0aG9kcyB1c2VmdWwgaW4gZGVhbGluZyB3aXRoIGNvbnZlcnRpbmcgYnl0ZSBhcnJheXMKKyAqIHRvIGFuZCBmcm9tIHN0cmluZ3Mgb2YgaGV4YWRlY2ltYWwgZGlnaXRzLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBIZXhVdGlscyB7CisgICAgLy8gQ29kZSBmcm9tIEFqcDExLCBmcm9tIEFwYWNoZSdzIEpTZXJ2CisKKyAgICAvLyBUYWJsZSBmb3IgSEVYIHRvIERFQyBieXRlIHRyYW5zbGF0aW9uCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBERUMgPSB7CisgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKyAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgICAgIDAwLCAwMSwgMDIsIDAzLCAwNCwgMDUsIDA2LCAwNywgIDgsICA5LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgICAtMSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKyAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgICAgIC0xLCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKyAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKyAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKyAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgIH07CisKKworCisgICAgLyoqCisgICAgICogVGhlIHN0cmluZyBtYW5hZ2VyIGZvciB0aGlzIHBhY2thZ2UuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nTWFuYWdlciBzbSA9CisgICAgICAgIFN0cmluZ01hbmFnZXIuZ2V0TWFuYWdlcigib3JnLmFwYWNoZS5jYXRhbGluYS51dGlsIik7CisKKworICAgIC8qKgorICAgICAqIENvbnZlcnQgYSBTdHJpbmcgb2YgaGV4YWRlY2ltYWwgZGlnaXRzIGludG8gdGhlIGNvcnJlc3BvbmRpbmcKKyAgICAgKiBieXRlIGFycmF5IGJ5IGVuY29kaW5nIGVhY2ggdHdvIGhleGFkZWNpbWFsIGRpZ2l0cyBhcyBhIGJ5dGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGlnaXRzIEhleGFkZWNpbWFsIGRpZ2l0cyByZXByZXNlbnRhdGlvbgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgYW4gaW52YWxpZCBoZXhhZGVjaW1hbCBkaWdpdAorICAgICAqICBpcyBmb3VuZCwgb3IgdGhlIGlucHV0IHN0cmluZyBjb250YWlucyBhbiBvZGQgbnVtYmVyIG9mIGhleGFkZWNpbWFsCisgICAgICogIGRpZ2l0cworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIGNvbnZlcnQoU3RyaW5nIGRpZ2l0cykgeworCisgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpZ2l0cy5sZW5ndGgoKTsgaSArPSAyKSB7CisgICAgICAgICAgICBjaGFyIGMxID0gZGlnaXRzLmNoYXJBdChpKTsKKyAgICAgICAgICAgIGlmICgoaSsxKSA+PSBkaWdpdHMubGVuZ3RoKCkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJoZXhVdGlsLm9kZCIpKTsKKyAgICAgICAgICAgIGNoYXIgYzIgPSBkaWdpdHMuY2hhckF0KGkgKyAxKTsKKyAgICAgICAgICAgIGJ5dGUgYiA9IDA7CisgICAgICAgICAgICBpZiAoKGMxID49ICcwJykgJiYgKGMxIDw9ICc5JykpCisgICAgICAgICAgICAgICAgYiArPSAoKGMxIC0gJzAnKSAqIDE2KTsKKyAgICAgICAgICAgIGVsc2UgaWYgKChjMSA+PSAnYScpICYmIChjMSA8PSAnZicpKQorICAgICAgICAgICAgICAgIGIgKz0gKChjMSAtICdhJyArIDEwKSAqIDE2KTsKKyAgICAgICAgICAgIGVsc2UgaWYgKChjMSA+PSAnQScpICYmIChjMSA8PSAnRicpKQorICAgICAgICAgICAgICAgIGIgKz0gKChjMSAtICdBJyArIDEwKSAqIDE2KTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoImhleFV0aWwuYmFkIikpOworICAgICAgICAgICAgaWYgKChjMiA+PSAnMCcpICYmIChjMiA8PSAnOScpKQorICAgICAgICAgICAgICAgIGIgKz0gKGMyIC0gJzAnKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKChjMiA+PSAnYScpICYmIChjMiA8PSAnZicpKQorICAgICAgICAgICAgICAgIGIgKz0gKGMyIC0gJ2EnICsgMTApOworICAgICAgICAgICAgZWxzZSBpZiAoKGMyID49ICdBJykgJiYgKGMyIDw9ICdGJykpCisgICAgICAgICAgICAgICAgYiArPSAoYzIgLSAnQScgKyAxMCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJoZXhVdGlsLmJhZCIpKTsKKyAgICAgICAgICAgIGJhb3Mud3JpdGUoYik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChiYW9zLnRvQnl0ZUFycmF5KCkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IGEgYnl0ZSBhcnJheSBpbnRvIGEgcHJpbnRhYmxlIGZvcm1hdCBjb250YWluaW5nIGEKKyAgICAgKiBTdHJpbmcgb2YgaGV4YWRlY2ltYWwgZGlnaXQgY2hhcmFjdGVycyAodHdvIHBlciBieXRlKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBieXRlcyBCeXRlIGFycmF5IHJlcHJlc2VudGF0aW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydChieXRlIGJ5dGVzW10pIHsKKworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKGJ5dGVzLmxlbmd0aCAqIDIpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoY29udmVydERpZ2l0KChpbnQpIChieXRlc1tpXSA+PiA0KSkpOworICAgICAgICAgICAgc2IuYXBwZW5kKGNvbnZlcnREaWdpdCgoaW50KSAoYnl0ZXNbaV0gJiAweDBmKSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoc2IudG9TdHJpbmcoKSk7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IDQgaGV4IGRpZ2l0cyB0byBhbiBpbnQsIGFuZCByZXR1cm4gdGhlIG51bWJlciBvZiBjb252ZXJ0ZWQKKyAgICAgKiBieXRlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBoZXggQnl0ZSBhcnJheSBjb250YWluaW5nIGV4YWN0bHkgZm91ciBoZXhhZGVjaW1hbCBkaWdpdHMKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGFuIGludmFsaWQgaGV4YWRlY2ltYWwgZGlnaXQKKyAgICAgKiAgaXMgaW5jbHVkZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCBjb252ZXJ0MkludCggYnl0ZVtdIGhleCApIHsKKyAgICAgICAgLy8gQ29kZSBmcm9tIEFqcDExLCBmcm9tIEFwYWNoZSdzIEpTZXJ2CisKKyAgICAgICAgLy8gYXNzZXJ0IGIubGVuZ3RoPT00CisgICAgICAgIC8vIGFzc2VydCB2YWxpZCBkYXRhCisgICAgICAgIGludCBsZW47CisgICAgICAgIGlmKGhleC5sZW5ndGggPCA0ICkgcmV0dXJuIDA7CisgICAgICAgIGlmKCBERUNbaGV4WzBdXTwwICkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oc20uZ2V0U3RyaW5nKCJoZXhVdGlsLmJhZCIpKTsKKyAgICAgICAgbGVuID0gREVDW2hleFswXV07CisgICAgICAgIGxlbiA9IGxlbiA8PCA0OworICAgICAgICBpZiggREVDW2hleFsxXV08MCApCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHNtLmdldFN0cmluZygiaGV4VXRpbC5iYWQiKSk7CisgICAgICAgIGxlbiArPSBERUNbaGV4WzFdXTsKKyAgICAgICAgbGVuID0gbGVuIDw8IDQ7CisgICAgICAgIGlmKCBERUNbaGV4WzJdXTwwICkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oc20uZ2V0U3RyaW5nKCJoZXhVdGlsLmJhZCIpKTsKKyAgICAgICAgbGVuICs9IERFQ1toZXhbMl1dOworICAgICAgICBsZW4gPSBsZW4gPDwgNDsKKyAgICAgICAgaWYoIERFQ1toZXhbM11dPDAgKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihzbS5nZXRTdHJpbmcoImhleFV0aWwuYmFkIikpOworICAgICAgICBsZW4gKz0gREVDW2hleFszXV07CisgICAgICAgIHJldHVybiBsZW47CisgICAgfQorCisKKworICAgIC8qKgorICAgICAqIFtQcml2YXRlXSBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgdmFsdWUgKDAgLi4gMTUpIHRvIHRoZSBjb3JyZXNwb25kaW5nCisgICAgICogaGV4YWRlY2ltYWwgZGlnaXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUgVmFsdWUgdG8gYmUgY29udmVydGVkCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2hhciBjb252ZXJ0RGlnaXQoaW50IHZhbHVlKSB7CisKKyAgICAgICAgdmFsdWUgJj0gMHgwZjsKKyAgICAgICAgaWYgKHZhbHVlID49IDEwKQorICAgICAgICAgICAgcmV0dXJuICgoY2hhcikgKHZhbHVlIC0gMTAgKyAnYScpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuICgoY2hhcikgKHZhbHVlICsgJzAnKSk7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvSU9Ub29scy5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvSU9Ub29scy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkMzAzZjYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9JT1Rvb2xzLmphdmEKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWw7CisKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5SZWFkZXI7CitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CisKKworLyoqCisgKiBDb250YWlucyBjb21tb25seSBuZWVkZWQgSS9PLXJlbGF0ZWQgbWV0aG9kcyAKKyAqCisgKiBAYXV0aG9yIERhbiBTYW5kYmVyZworICovCitwdWJsaWMgY2xhc3MgSU9Ub29scyB7CisgICAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBpbnQgREVGQVVMVF9CVUZGRVJfU0laRT00KjEwMjQ7IC8vNGsKKworICAgIC8vRW5zdXJlIG5vbi1pbnN0YW50aWFiaWxpdHkKKyAgICBwcml2YXRlIElPVG9vbHMoKSB7CisgICAgfQorCisgICAgIC8qKgorICAgICAqIFJlYWQgaW5wdXQgZnJvbSByZWFkZXIgYW5kIHdyaXRlIGl0IHRvIHdyaXRlciB1bnRpbCB0aGVyZSBpcyBubyBtb3JlCisgICAgICogaW5wdXQgZnJvbSByZWFkZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVhZGVyIHRoZSByZWFkZXIgdG8gcmVhZCBmcm9tLgorICAgICAqIEBwYXJhbSB3cml0ZXIgdGhlIHdyaXRlciB0byB3cml0ZSB0by4KKyAgICAgKiBAcGFyYW0gYnVmIHRoZSBjaGFyIGFycmF5IHRvIHVzZSBhcyBhIGJ1ZmZlcngKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZmxvdyggUmVhZGVyIHJlYWRlciwgV3JpdGVyIHdyaXRlciwgY2hhcltdIGJ1ZiApIAorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpbnQgbnVtUmVhZDsKKyAgICAgICAgd2hpbGUgKCAobnVtUmVhZCA9IHJlYWRlci5yZWFkKGJ1ZikgKSA+PSAwKSB7CisgICAgICAgICAgICB3cml0ZXIud3JpdGUoYnVmLCAwLCBudW1SZWFkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgI2Zsb3coIFJlYWRlciwgV3JpdGVyLCBjaGFyW10gKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBmbG93KCBSZWFkZXIgcmVhZGVyLCBXcml0ZXIgd3JpdGVyICkgCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGNoYXJbXSBidWYgPSBuZXcgY2hhcltERUZBVUxUX0JVRkZFUl9TSVpFXTsKKyAgICAgICAgZmxvdyggcmVhZGVyLCB3cml0ZXIsIGJ1ZiApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWQgaW5wdXQgZnJvbSBpbnB1dCBzdHJlYW0gYW5kIHdyaXRlIGl0IHRvIG91dHB1dCBzdHJlYW0gCisgICAgICogdW50aWwgdGhlcmUgaXMgbm8gbW9yZSBpbnB1dCBmcm9tIGlucHV0IHN0cmVhbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpcyBpbnB1dCBzdHJlYW0gdGhlIGlucHV0IHN0cmVhbSB0byByZWFkIGZyb20uCisgICAgICogQHBhcmFtIG9zIG91dHB1dCBzdHJlYW0gdGhlIG91dHB1dCBzdHJlYW0gdG8gd3JpdGUgdG8uCisgICAgICogQHBhcmFtIGJ1ZiB0aGUgYnl0ZSBhcnJheSB0byB1c2UgYXMgYSBidWZmZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZmxvdyggSW5wdXRTdHJlYW0gaXMsIE91dHB1dFN0cmVhbSBvcywgYnl0ZVtdIGJ1ZiApIAorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpbnQgbnVtUmVhZDsKKyAgICAgICAgd2hpbGUgKCAobnVtUmVhZCA9IGlzLnJlYWQoYnVmKSApID49IDApIHsKKyAgICAgICAgICAgIG9zLndyaXRlKGJ1ZiwgMCwgbnVtUmVhZCk7CisgICAgICAgIH0KKyAgICB9ICAKKworICAgIC8qKgorICAgICAqIEBzZWUgI2Zsb3coIGphdmEuaW8uSW5wdXRTdHJlYW0sIGphdmEuaW8uT3V0cHV0U3RyZWFtLCBieXRlW10gKQorICAgICAqLyAKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZmxvdyggSW5wdXRTdHJlYW0gaXMsIE91dHB1dFN0cmVhbSBvcyApIAorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbREVGQVVMVF9CVUZGRVJfU0laRV07CisgICAgICAgIGZsb3coIGlzLCBvcywgYnVmICk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvSW5zdGFuY2VTdXBwb3J0LmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9JbnN0YW5jZVN1cHBvcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjI4NWNhCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvSW5zdGFuY2VTdXBwb3J0LmphdmEKQEAgLTAsMCArMSwzNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbDsKKworCitpbXBvcnQgamF2YXguc2VydmxldC5GaWx0ZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5JbnN0YW5jZUV2ZW50OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuSW5zdGFuY2VMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLldyYXBwZXI7CisKKworLyoqCisgKiBTdXBwb3J0IGNsYXNzIHRvIGFzc2lzdCBpbiBmaXJpbmcgSW5zdGFuY2VFdmVudCBub3RpZmljYXRpb25zIHRvCisgKiByZWdpc3RlcmVkIEluc3RhbmNlTGlzdGVuZXJzLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJElkJAorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBJbnN0YW5jZVN1cHBvcnQgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IEluc3RhbmNlU3VwcG9ydCBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBJbnN0YW5jZSBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gd3JhcHBlciBUaGUgY29tcG9uZW50IHRoYXQgd2lsbCBiZSB0aGUgc291cmNlCisgICAgICogIG9mIGV2ZW50cyB0aGF0IHdlIGZpcmUKKyAgICAgKi8KKyAgICBwdWJsaWMgSW5zdGFuY2VTdXBwb3J0KFdyYXBwZXIgd3JhcHBlcikgeworCisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIHRoaXMud3JhcHBlciA9IHdyYXBwZXI7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc2V0IG9mIHJlZ2lzdGVyZWQgSW5zdGFuY2VMaXN0ZW5lcnMgZm9yIGV2ZW50IG5vdGlmaWNhdGlvbnMuCisgICAgICovCisgICAgcHJpdmF0ZSBJbnN0YW5jZUxpc3RlbmVyIGxpc3RlbmVyc1tdID0gbmV3IEluc3RhbmNlTGlzdGVuZXJbMF07CisKKworICAgIC8qKgorICAgICAqIFRoZSBzb3VyY2UgY29tcG9uZW50IGZvciBpbnN0YW5jZSBldmVudHMgdGhhdCB3ZSB3aWxsIGZpcmUuCisgICAgICovCisgICAgcHJpdmF0ZSBXcmFwcGVyIHdyYXBwZXIgPSBudWxsOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBXcmFwcGVyIHdpdGggd2hpY2ggd2UgYXJlIGFzc29jaWF0ZWQuCisgICAgICovCisgICAgcHVibGljIFdyYXBwZXIgZ2V0V3JhcHBlcigpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMud3JhcHBlcik7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBsaWZlY3ljbGUgZXZlbnQgbGlzdGVuZXIgdG8gdGhpcyBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRvIGFkZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEluc3RhbmNlTGlzdGVuZXIoSW5zdGFuY2VMaXN0ZW5lciBsaXN0ZW5lcikgeworCisgICAgICBzeW5jaHJvbml6ZWQgKGxpc3RlbmVycykgeworICAgICAgICAgIEluc3RhbmNlTGlzdGVuZXIgcmVzdWx0c1tdID0KKyAgICAgICAgICAgIG5ldyBJbnN0YW5jZUxpc3RlbmVyW2xpc3RlbmVycy5sZW5ndGggKyAxXTsKKyAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgcmVzdWx0c1tpXSA9IGxpc3RlbmVyc1tpXTsKKyAgICAgICAgICByZXN1bHRzW2xpc3RlbmVycy5sZW5ndGhdID0gbGlzdGVuZXI7CisgICAgICAgICAgbGlzdGVuZXJzID0gcmVzdWx0czsKKyAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogTm90aWZ5IGFsbCBsaWZlY3ljbGUgZXZlbnQgbGlzdGVuZXJzIHRoYXQgYSBwYXJ0aWN1bGFyIGV2ZW50IGhhcworICAgICAqIG9jY3VycmVkIGZvciB0aGlzIENvbnRhaW5lci4gIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHBlcmZvcm1zCisgICAgICogdGhpcyBub3RpZmljYXRpb24gc3luY2hyb25vdXNseSB1c2luZyB0aGUgY2FsbGluZyB0aHJlYWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHlwZSBFdmVudCB0eXBlCisgICAgICogQHBhcmFtIGZpbHRlciBUaGUgcmVsZXZhbnQgRmlsdGVyIGZvciB0aGlzIGV2ZW50CisgICAgICovCisgICAgcHVibGljIHZvaWQgZmlyZUluc3RhbmNlRXZlbnQoU3RyaW5nIHR5cGUsIEZpbHRlciBmaWx0ZXIpIHsKKworICAgICAgICBpZiAobGlzdGVuZXJzLmxlbmd0aCA9PSAwKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIEluc3RhbmNlRXZlbnQgZXZlbnQgPSBuZXcgSW5zdGFuY2VFdmVudCh3cmFwcGVyLCBmaWx0ZXIsIHR5cGUpOworICAgICAgICBJbnN0YW5jZUxpc3RlbmVyIGludGVyZXN0ZWRbXSA9IG51bGw7CisgICAgICAgIHN5bmNocm9uaXplZCAobGlzdGVuZXJzKSB7CisgICAgICAgICAgICBpbnRlcmVzdGVkID0gKEluc3RhbmNlTGlzdGVuZXJbXSkgbGlzdGVuZXJzLmNsb25lKCk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnRlcmVzdGVkLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgaW50ZXJlc3RlZFtpXS5pbnN0YW5jZUV2ZW50KGV2ZW50KTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogTm90aWZ5IGFsbCBsaWZlY3ljbGUgZXZlbnQgbGlzdGVuZXJzIHRoYXQgYSBwYXJ0aWN1bGFyIGV2ZW50IGhhcworICAgICAqIG9jY3VycmVkIGZvciB0aGlzIENvbnRhaW5lci4gIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHBlcmZvcm1zCisgICAgICogdGhpcyBub3RpZmljYXRpb24gc3luY2hyb25vdXNseSB1c2luZyB0aGUgY2FsbGluZyB0aHJlYWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHlwZSBFdmVudCB0eXBlCisgICAgICogQHBhcmFtIGZpbHRlciBUaGUgcmVsZXZhbnQgRmlsdGVyIGZvciB0aGlzIGV2ZW50CisgICAgICogQHBhcmFtIGV4Y2VwdGlvbiBFeGNlcHRpb24gdGhhdCBvY2N1cnJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGZpcmVJbnN0YW5jZUV2ZW50KFN0cmluZyB0eXBlLCBGaWx0ZXIgZmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocm93YWJsZSBleGNlcHRpb24pIHsKKworICAgICAgICBpZiAobGlzdGVuZXJzLmxlbmd0aCA9PSAwKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIEluc3RhbmNlRXZlbnQgZXZlbnQgPSBuZXcgSW5zdGFuY2VFdmVudCh3cmFwcGVyLCBmaWx0ZXIsIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb24pOworICAgICAgICBJbnN0YW5jZUxpc3RlbmVyIGludGVyZXN0ZWRbXSA9IG51bGw7CisgICAgICAgIHN5bmNocm9uaXplZCAobGlzdGVuZXJzKSB7CisgICAgICAgICAgICBpbnRlcmVzdGVkID0gKEluc3RhbmNlTGlzdGVuZXJbXSkgbGlzdGVuZXJzLmNsb25lKCk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnRlcmVzdGVkLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgaW50ZXJlc3RlZFtpXS5pbnN0YW5jZUV2ZW50KGV2ZW50KTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogTm90aWZ5IGFsbCBsaWZlY3ljbGUgZXZlbnQgbGlzdGVuZXJzIHRoYXQgYSBwYXJ0aWN1bGFyIGV2ZW50IGhhcworICAgICAqIG9jY3VycmVkIGZvciB0aGlzIENvbnRhaW5lci4gIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHBlcmZvcm1zCisgICAgICogdGhpcyBub3RpZmljYXRpb24gc3luY2hyb25vdXNseSB1c2luZyB0aGUgY2FsbGluZyB0aHJlYWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHlwZSBFdmVudCB0eXBlCisgICAgICogQHBhcmFtIGZpbHRlciBUaGUgcmVsZXZhbnQgRmlsdGVyIGZvciB0aGlzIGV2ZW50CisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgc2VydmxldCByZXNwb25zZSB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGZpcmVJbnN0YW5jZUV2ZW50KFN0cmluZyB0eXBlLCBGaWx0ZXIgZmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB7CisKKyAgICAgICAgaWYgKGxpc3RlbmVycy5sZW5ndGggPT0gMCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBJbnN0YW5jZUV2ZW50IGV2ZW50ID0gbmV3IEluc3RhbmNlRXZlbnQod3JhcHBlciwgZmlsdGVyLCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCwgcmVzcG9uc2UpOworICAgICAgICBJbnN0YW5jZUxpc3RlbmVyIGludGVyZXN0ZWRbXSA9IG51bGw7CisgICAgICAgIHN5bmNocm9uaXplZCAobGlzdGVuZXJzKSB7CisgICAgICAgICAgICBpbnRlcmVzdGVkID0gKEluc3RhbmNlTGlzdGVuZXJbXSkgbGlzdGVuZXJzLmNsb25lKCk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnRlcmVzdGVkLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgaW50ZXJlc3RlZFtpXS5pbnN0YW5jZUV2ZW50KGV2ZW50KTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogTm90aWZ5IGFsbCBsaWZlY3ljbGUgZXZlbnQgbGlzdGVuZXJzIHRoYXQgYSBwYXJ0aWN1bGFyIGV2ZW50IGhhcworICAgICAqIG9jY3VycmVkIGZvciB0aGlzIENvbnRhaW5lci4gIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHBlcmZvcm1zCisgICAgICogdGhpcyBub3RpZmljYXRpb24gc3luY2hyb25vdXNseSB1c2luZyB0aGUgY2FsbGluZyB0aHJlYWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHlwZSBFdmVudCB0eXBlCisgICAgICogQHBhcmFtIGZpbHRlciBUaGUgcmVsZXZhbnQgRmlsdGVyIGZvciB0aGlzIGV2ZW50CisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgc2VydmxldCByZXNwb25zZSB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSBleGNlcHRpb24gRXhjZXB0aW9uIHRoYXQgb2NjdXJyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBmaXJlSW5zdGFuY2VFdmVudChTdHJpbmcgdHlwZSwgRmlsdGVyIGZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJvd2FibGUgZXhjZXB0aW9uKSB7CisKKyAgICAgICAgaWYgKGxpc3RlbmVycy5sZW5ndGggPT0gMCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBJbnN0YW5jZUV2ZW50IGV2ZW50ID0gbmV3IEluc3RhbmNlRXZlbnQod3JhcHBlciwgZmlsdGVyLCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCwgcmVzcG9uc2UsIGV4Y2VwdGlvbik7CisgICAgICAgIEluc3RhbmNlTGlzdGVuZXIgaW50ZXJlc3RlZFtdID0gbnVsbDsKKyAgICAgICAgc3luY2hyb25pemVkIChsaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgIGludGVyZXN0ZWQgPSAoSW5zdGFuY2VMaXN0ZW5lcltdKSBsaXN0ZW5lcnMuY2xvbmUoKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGludGVyZXN0ZWQubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBpbnRlcmVzdGVkW2ldLmluc3RhbmNlRXZlbnQoZXZlbnQpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBOb3RpZnkgYWxsIGxpZmVjeWNsZSBldmVudCBsaXN0ZW5lcnMgdGhhdCBhIHBhcnRpY3VsYXIgZXZlbnQgaGFzCisgICAgICogb2NjdXJyZWQgZm9yIHRoaXMgQ29udGFpbmVyLiAgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcGVyZm9ybXMKKyAgICAgKiB0aGlzIG5vdGlmaWNhdGlvbiBzeW5jaHJvbm91c2x5IHVzaW5nIHRoZSBjYWxsaW5nIHRocmVhZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0eXBlIEV2ZW50IHR5cGUKKyAgICAgKiBAcGFyYW0gc2VydmxldCBUaGUgcmVsZXZhbnQgU2VydmxldCBmb3IgdGhpcyBldmVudAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGZpcmVJbnN0YW5jZUV2ZW50KFN0cmluZyB0eXBlLCBTZXJ2bGV0IHNlcnZsZXQpIHsKKworICAgICAgICBpZiAobGlzdGVuZXJzLmxlbmd0aCA9PSAwKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIEluc3RhbmNlRXZlbnQgZXZlbnQgPSBuZXcgSW5zdGFuY2VFdmVudCh3cmFwcGVyLCBzZXJ2bGV0LCB0eXBlKTsKKyAgICAgICAgSW5zdGFuY2VMaXN0ZW5lciBpbnRlcmVzdGVkW10gPSBudWxsOworICAgICAgICBzeW5jaHJvbml6ZWQgKGxpc3RlbmVycykgeworICAgICAgICAgICAgaW50ZXJlc3RlZCA9IChJbnN0YW5jZUxpc3RlbmVyW10pIGxpc3RlbmVycy5jbG9uZSgpOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW50ZXJlc3RlZC5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIGludGVyZXN0ZWRbaV0uaW5zdGFuY2VFdmVudChldmVudCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIE5vdGlmeSBhbGwgbGlmZWN5Y2xlIGV2ZW50IGxpc3RlbmVycyB0aGF0IGEgcGFydGljdWxhciBldmVudCBoYXMKKyAgICAgKiBvY2N1cnJlZCBmb3IgdGhpcyBDb250YWluZXIuICBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBwZXJmb3JtcworICAgICAqIHRoaXMgbm90aWZpY2F0aW9uIHN5bmNocm9ub3VzbHkgdXNpbmcgdGhlIGNhbGxpbmcgdGhyZWFkLgorICAgICAqCisgICAgICogQHBhcmFtIHR5cGUgRXZlbnQgdHlwZQorICAgICAqIEBwYXJhbSBzZXJ2bGV0IFRoZSByZWxldmFudCBTZXJ2bGV0IGZvciB0aGlzIGV2ZW50CisgICAgICogQHBhcmFtIGV4Y2VwdGlvbiBFeGNlcHRpb24gdGhhdCBvY2N1cnJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGZpcmVJbnN0YW5jZUV2ZW50KFN0cmluZyB0eXBlLCBTZXJ2bGV0IHNlcnZsZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyb3dhYmxlIGV4Y2VwdGlvbikgeworCisgICAgICAgIGlmIChsaXN0ZW5lcnMubGVuZ3RoID09IDApCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgSW5zdGFuY2VFdmVudCBldmVudCA9IG5ldyBJbnN0YW5jZUV2ZW50KHdyYXBwZXIsIHNlcnZsZXQsIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb24pOworICAgICAgICBJbnN0YW5jZUxpc3RlbmVyIGludGVyZXN0ZWRbXSA9IG51bGw7CisgICAgICAgIHN5bmNocm9uaXplZCAobGlzdGVuZXJzKSB7CisgICAgICAgICAgICBpbnRlcmVzdGVkID0gKEluc3RhbmNlTGlzdGVuZXJbXSkgbGlzdGVuZXJzLmNsb25lKCk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnRlcmVzdGVkLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgaW50ZXJlc3RlZFtpXS5pbnN0YW5jZUV2ZW50KGV2ZW50KTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogTm90aWZ5IGFsbCBsaWZlY3ljbGUgZXZlbnQgbGlzdGVuZXJzIHRoYXQgYSBwYXJ0aWN1bGFyIGV2ZW50IGhhcworICAgICAqIG9jY3VycmVkIGZvciB0aGlzIENvbnRhaW5lci4gIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHBlcmZvcm1zCisgICAgICogdGhpcyBub3RpZmljYXRpb24gc3luY2hyb25vdXNseSB1c2luZyB0aGUgY2FsbGluZyB0aHJlYWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHlwZSBFdmVudCB0eXBlCisgICAgICogQHBhcmFtIHNlcnZsZXQgVGhlIHJlbGV2YW50IFNlcnZsZXQgZm9yIHRoaXMgZXZlbnQKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBzZXJ2bGV0IHJlc3BvbnNlIHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgZmlyZUluc3RhbmNlRXZlbnQoU3RyaW5nIHR5cGUsIFNlcnZsZXQgc2VydmxldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgeworCisgICAgICAgIGlmIChsaXN0ZW5lcnMubGVuZ3RoID09IDApCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgSW5zdGFuY2VFdmVudCBldmVudCA9IG5ldyBJbnN0YW5jZUV2ZW50KHdyYXBwZXIsIHNlcnZsZXQsIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LCByZXNwb25zZSk7CisgICAgICAgIEluc3RhbmNlTGlzdGVuZXIgaW50ZXJlc3RlZFtdID0gbnVsbDsKKyAgICAgICAgc3luY2hyb25pemVkIChsaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgIGludGVyZXN0ZWQgPSAoSW5zdGFuY2VMaXN0ZW5lcltdKSBsaXN0ZW5lcnMuY2xvbmUoKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGludGVyZXN0ZWQubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBpbnRlcmVzdGVkW2ldLmluc3RhbmNlRXZlbnQoZXZlbnQpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBOb3RpZnkgYWxsIGxpZmVjeWNsZSBldmVudCBsaXN0ZW5lcnMgdGhhdCBhIHBhcnRpY3VsYXIgZXZlbnQgaGFzCisgICAgICogb2NjdXJyZWQgZm9yIHRoaXMgQ29udGFpbmVyLiAgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcGVyZm9ybXMKKyAgICAgKiB0aGlzIG5vdGlmaWNhdGlvbiBzeW5jaHJvbm91c2x5IHVzaW5nIHRoZSBjYWxsaW5nIHRocmVhZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0eXBlIEV2ZW50IHR5cGUKKyAgICAgKiBAcGFyYW0gc2VydmxldCBUaGUgcmVsZXZhbnQgU2VydmxldCBmb3IgdGhpcyBldmVudAorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIHNlcnZsZXQgcmVzcG9uc2Ugd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gZXhjZXB0aW9uIEV4Y2VwdGlvbiB0aGF0IG9jY3VycmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgZmlyZUluc3RhbmNlRXZlbnQoU3RyaW5nIHR5cGUsIFNlcnZsZXQgc2VydmxldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJvd2FibGUgZXhjZXB0aW9uKSB7CisKKyAgICAgICAgaWYgKGxpc3RlbmVycy5sZW5ndGggPT0gMCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBJbnN0YW5jZUV2ZW50IGV2ZW50ID0gbmV3IEluc3RhbmNlRXZlbnQod3JhcHBlciwgc2VydmxldCwgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QsIHJlc3BvbnNlLCBleGNlcHRpb24pOworICAgICAgICBJbnN0YW5jZUxpc3RlbmVyIGludGVyZXN0ZWRbXSA9IG51bGw7CisgICAgICAgIHN5bmNocm9uaXplZCAobGlzdGVuZXJzKSB7CisgICAgICAgICAgICBpbnRlcmVzdGVkID0gKEluc3RhbmNlTGlzdGVuZXJbXSkgbGlzdGVuZXJzLmNsb25lKCk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnRlcmVzdGVkLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgaW50ZXJlc3RlZFtpXS5pbnN0YW5jZUV2ZW50KGV2ZW50KTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGEgbGlmZWN5Y2xlIGV2ZW50IGxpc3RlbmVyIGZyb20gdGhpcyBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRvIHJlbW92ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUluc3RhbmNlTGlzdGVuZXIoSW5zdGFuY2VMaXN0ZW5lciBsaXN0ZW5lcikgeworCisgICAgICAgIHN5bmNocm9uaXplZCAobGlzdGVuZXJzKSB7CisgICAgICAgICAgICBpbnQgbiA9IC0xOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAobGlzdGVuZXJzW2ldID09IGxpc3RlbmVyKSB7CisgICAgICAgICAgICAgICAgICAgIG4gPSBpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobiA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgSW5zdGFuY2VMaXN0ZW5lciByZXN1bHRzW10gPQorICAgICAgICAgICAgICBuZXcgSW5zdGFuY2VMaXN0ZW5lcltsaXN0ZW5lcnMubGVuZ3RoIC0gMV07CisgICAgICAgICAgICBpbnQgaiA9IDA7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChpICE9IG4pCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdHNbaisrXSA9IGxpc3RlbmVyc1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxpc3RlbmVycyA9IHJlc3VsdHM7CisgICAgICAgIH0KKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9MaWZlY3ljbGVTdXBwb3J0LmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9MaWZlY3ljbGVTdXBwb3J0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNmNTc3YgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL0xpZmVjeWNsZVN1cHBvcnQuamF2YQpAQCAtMCwwICsxLDE1NCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsOworCisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZUV2ZW50OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlTGlzdGVuZXI7CisKKworLyoqCisgKiBTdXBwb3J0IGNsYXNzIHRvIGFzc2lzdCBpbiBmaXJpbmcgTGlmZWN5Y2xlRXZlbnQgbm90aWZpY2F0aW9ucyB0bworICogcmVnaXN0ZXJlZCBMaWZlY3ljbGVMaXN0ZW5lcnMuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkSWQkCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIExpZmVjeWNsZVN1cHBvcnQgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IExpZmVjeWNsZVN1cHBvcnQgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgICogTGlmZWN5Y2xlIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaWZlY3ljbGUgVGhlIExpZmVjeWNsZSBjb21wb25lbnQgdGhhdCB3aWxsIGJlIHRoZSBzb3VyY2UKKyAgICAgKiAgb2YgZXZlbnRzIHRoYXQgd2UgZmlyZQorICAgICAqLworICAgIHB1YmxpYyBMaWZlY3ljbGVTdXBwb3J0KExpZmVjeWNsZSBsaWZlY3ljbGUpIHsKKworICAgICAgICBzdXBlcigpOworICAgICAgICB0aGlzLmxpZmVjeWNsZSA9IGxpZmVjeWNsZTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBzb3VyY2UgY29tcG9uZW50IGZvciBsaWZlY3ljbGUgZXZlbnRzIHRoYXQgd2Ugd2lsbCBmaXJlLgorICAgICAqLworICAgIHByaXZhdGUgTGlmZWN5Y2xlIGxpZmVjeWNsZSA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzZXQgb2YgcmVnaXN0ZXJlZCBMaWZlY3ljbGVMaXN0ZW5lcnMgZm9yIGV2ZW50IG5vdGlmaWNhdGlvbnMuCisgICAgICovCisgICAgcHJpdmF0ZSBMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lcnNbXSA9IG5ldyBMaWZlY3ljbGVMaXN0ZW5lclswXTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIEFkZCBhIGxpZmVjeWNsZSBldmVudCBsaXN0ZW5lciB0byB0aGlzIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgdG8gYWRkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkTGlmZWN5Y2xlTGlzdGVuZXIoTGlmZWN5Y2xlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKworICAgICAgc3luY2hyb25pemVkIChsaXN0ZW5lcnMpIHsKKyAgICAgICAgICBMaWZlY3ljbGVMaXN0ZW5lciByZXN1bHRzW10gPQorICAgICAgICAgICAgbmV3IExpZmVjeWNsZUxpc3RlbmVyW2xpc3RlbmVycy5sZW5ndGggKyAxXTsKKyAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgcmVzdWx0c1tpXSA9IGxpc3RlbmVyc1tpXTsKKyAgICAgICAgICByZXN1bHRzW2xpc3RlbmVycy5sZW5ndGhdID0gbGlzdGVuZXI7CisgICAgICAgICAgbGlzdGVuZXJzID0gcmVzdWx0czsKKyAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBsaWZlY3ljbGUgbGlzdGVuZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGxpZmVjeWNsZS4gSWYgdGhpcyAKKyAgICAgKiBMaWZlY3ljbGUgaGFzIG5vIGxpc3RlbmVycyByZWdpc3RlcmVkLCBhIHplcm8tbGVuZ3RoIGFycmF5IGlzIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBMaWZlY3ljbGVMaXN0ZW5lcltdIGZpbmRMaWZlY3ljbGVMaXN0ZW5lcnMoKSB7CisKKyAgICAgICAgcmV0dXJuIGxpc3RlbmVyczsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogTm90aWZ5IGFsbCBsaWZlY3ljbGUgZXZlbnQgbGlzdGVuZXJzIHRoYXQgYSBwYXJ0aWN1bGFyIGV2ZW50IGhhcworICAgICAqIG9jY3VycmVkIGZvciB0aGlzIENvbnRhaW5lci4gIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHBlcmZvcm1zCisgICAgICogdGhpcyBub3RpZmljYXRpb24gc3luY2hyb25vdXNseSB1c2luZyB0aGUgY2FsbGluZyB0aHJlYWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHlwZSBFdmVudCB0eXBlCisgICAgICogQHBhcmFtIGRhdGEgRXZlbnQgZGF0YQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGZpcmVMaWZlY3ljbGVFdmVudChTdHJpbmcgdHlwZSwgT2JqZWN0IGRhdGEpIHsKKworICAgICAgICBMaWZlY3ljbGVFdmVudCBldmVudCA9IG5ldyBMaWZlY3ljbGVFdmVudChsaWZlY3ljbGUsIHR5cGUsIGRhdGEpOworICAgICAgICBMaWZlY3ljbGVMaXN0ZW5lciBpbnRlcmVzdGVkW10gPSBudWxsOworICAgICAgICBzeW5jaHJvbml6ZWQgKGxpc3RlbmVycykgeworICAgICAgICAgICAgaW50ZXJlc3RlZCA9IChMaWZlY3ljbGVMaXN0ZW5lcltdKSBsaXN0ZW5lcnMuY2xvbmUoKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGludGVyZXN0ZWQubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBpbnRlcmVzdGVkW2ldLmxpZmVjeWNsZUV2ZW50KGV2ZW50KTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGEgbGlmZWN5Y2xlIGV2ZW50IGxpc3RlbmVyIGZyb20gdGhpcyBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRvIHJlbW92ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUxpZmVjeWNsZUxpc3RlbmVyKExpZmVjeWNsZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisKKyAgICAgICAgc3luY2hyb25pemVkIChsaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgIGludCBuID0gLTE7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChsaXN0ZW5lcnNbaV0gPT0gbGlzdGVuZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgbiA9IGk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChuIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBMaWZlY3ljbGVMaXN0ZW5lciByZXN1bHRzW10gPQorICAgICAgICAgICAgICBuZXcgTGlmZWN5Y2xlTGlzdGVuZXJbbGlzdGVuZXJzLmxlbmd0aCAtIDFdOworICAgICAgICAgICAgaW50IGogPSAwOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoaSAhPSBuKQorICAgICAgICAgICAgICAgICAgICByZXN1bHRzW2orK10gPSBsaXN0ZW5lcnNbaV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsaXN0ZW5lcnMgPSByZXN1bHRzOworICAgICAgICB9CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvTG9jYWxTdHJpbmdzLnByb3BlcnRpZXMgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9Mb2NhbFN0cmluZ3MucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWExMjI5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvTG9jYWxTdHJpbmdzLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxMSBAQAorcHJvcGVydHlNYXAubG9ja2VkPU5vIG1vZGlmaWNhdGlvbnMgYXJlIGFsbG93ZWQgdG8gYSBsb2NrZWQgUGFyYW1ldGVyTWFwCityZXNvdXJjZVNldC5sb2NrZWQ9Tm8gbW9kaWZpY2F0aW9ucyBhcmUgYWxsb3dlZCB0byBhIGxvY2tlZCBSZXNvdXJjZVNldAoraGV4VXRpbC5iYWQ9QmFkIGhleGFkZWNpbWFsIGRpZ2l0CitoZXhVdGlsLm9kZD1PZGQgbnVtYmVyIG9mIGhleGFkZWNpbWFsIGRpZ2l0cworI0RlZmF1bHQgTWVzc2FnZXMgVXRpbGl6ZWQgYnkgdGhlIEV4dGVuc2lvblZhbGlkYXRvcgorZXh0ZW5zaW9uVmFsaWRhdG9yLndlYi1hcHBsaWNhdGlvbi1tYW5pZmVzdD1XZWIgQXBwbGljYXRpb24gTWFuaWZlc3QKK2V4dGVuc2lvblZhbGlkYXRvci5leHRlbnNpb24tbm90LWZvdW5kLWVycm9yPUV4dGVuc2lvblZhbGlkYXRvclt7MH1dW3sxfV06IFJlcXVpcmVkIGV4dGVuc2lvbiAiezJ9IiBub3QgZm91bmQuCitleHRlbnNpb25WYWxpZGF0b3IuZXh0ZW5zaW9uLXZhbGlkYXRpb24tZXJyb3I9RXh0ZW5zaW9uVmFsaWRhdG9yW3swfV06IEZhaWx1cmUgdG8gZmluZCB7MX0gcmVxdWlyZWQgZXh0ZW5zaW9uKHMpLgorZXh0ZW5zaW9uVmFsaWRhdG9yLmZhaWxsb2FkPUZhaWx1cmUgbG9hZGluZyBleHRlbnNpb24gezB9CitTZWN1cml0eVV0aWwuZG9Bc1ByaXZpbGVnZT1BbiBleGNlcHRpb24gb2NjdXJzIHdoZW4gcnVubmluZyB0aGUgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbiBibG9jay4KKwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvTG9jYWxTdHJpbmdzX2VzLnByb3BlcnRpZXMgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9Mb2NhbFN0cmluZ3NfZXMucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTI1MWE1Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvTG9jYWxTdHJpbmdzX2VzLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxMCBAQAorcHJvcGVydHlNYXAubG9ja2VkPU5vIHNlIHBlcm1pdGVuIG1vZGlmaWNhY2lvbmVzIGVuIHVuIFBhcmFtZXRlck1hcCBibG9xdWVhZG8KK3Jlc291cmNlU2V0LmxvY2tlZD1ObyBzZSBwZXJtaXRlbiBtb2RpZmljYWNpb25lcyBlbiB1biBSZXNvdXJjZVNldCBibG9xdWVhZG8KK2hleFV0aWwuYmFkPUTtZ2l0byBoZXhhZGVjaW1hbCBpbmNvcnJlY3RvCitoZXhVdGlsLm9kZD1O+m1lcm8gZGUgZO1naXRvcyBoZXhhZGVjaW1hbGVzIGltcGFyCisjRGVmYXVsdCBNZXNzYWdlcyBVdGlsaXplZCBieSB0aGUgRXh0ZW5zaW9uVmFsaWRhdG9yCitleHRlbnNpb25WYWxpZGF0b3Iud2ViLWFwcGxpY2F0aW9uLW1hbmlmZXN0PU1hbmlmaWVzdG8gZGUgQXBsaWNhY2nzbiBXZWIKK2V4dGVuc2lvblZhbGlkYXRvci5leHRlbnNpb24tbm90LWZvdW5kLWVycm9yPUV4dGVuc2lvblZhbGlkYXRvclt7MH1dW3sxfV06IExhIGV4dGVuc2nzbiBubyBlbmN1ZW50cmEgZWwgInsyfSIgcmVxdWVyaWRvLgorZXh0ZW5zaW9uVmFsaWRhdG9yLmV4dGVuc2lvbi12YWxpZGF0aW9uLWVycm9yPUV4dGVuc2lvblZhbGlkYXRvclt7MH1dOiBJbXBvc2libGUgZGUgaGFsbGFyIGxhKHMpIGV4dGVuc2lvbihlcykgezF9IHJlcXVlcmlkYShzKS4KK1NlY3VyaXR5VXRpbC5kb0FzUHJpdmlsZWdlPVVuYSBleGNlcGNp824gc2UgaGEgcHJvZHVjaWRvIGR1cmFudGUgbGEgZWplY3VjafNuIGRlbCBibG9xdWUgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbi4KKwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvTG9jYWxTdHJpbmdzX2ZyLnByb3BlcnRpZXMgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9Mb2NhbFN0cmluZ3NfZnIucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Mjc2YThhCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvTG9jYWxTdHJpbmdzX2ZyLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxMCBAQAorcHJvcGVydHlNYXAubG9ja2VkPUF1Y3VuZSBtb2RpZmljYXRpb24gbicnZXN0IGF1dGhvcmlz6WUgc3VyIHVuIFBhcmFtZXRlck1hcCB26XJyb3VpbGzpCityZXNvdXJjZVNldC5sb2NrZWQ9QXVjdW5lIG1vZGlmaWNhdGlvbiBuJydlc3QgYXV0aG9yaXPpZSBzdXIgdW4gUmVzb3VyY2VTZXQgdulycm91aWxs6QoraGV4VXRpbC5iYWQ9TWF1dmFpcyBkaWdpdCBoZXhhZGVjaW1hbAoraGV4VXRpbC5vZGQ9Tm9tYnJlIGltcGFpciBkZSBkaWdpdHMgaGV4YWRlY2ltYXV4CisjRGVmYXVsdCBNZXNzYWdlcyBVdGlsaXplZCBieSB0aGUgRXh0ZW5zaW9uVmFsaWRhdG9yCitleHRlbnNpb25WYWxpZGF0b3Iud2ViLWFwcGxpY2F0aW9uLW1hbmlmZXN0PVdlYiBBcHBsaWNhdGlvbiBNYW5pZmVzdAorZXh0ZW5zaW9uVmFsaWRhdG9yLmV4dGVuc2lvbi1ub3QtZm91bmQtZXJyb3I9RXh0ZW5zaW9uVmFsaWRhdG9yW3swfV1bezF9XTogTCcnZXh0ZW5zaW9uIHJlcXVpc2UgInsyfSIgZXN0IGludHJvdXZhYmxlLgorZXh0ZW5zaW9uVmFsaWRhdG9yLmV4dGVuc2lvbi12YWxpZGF0aW9uLWVycm9yPUV4dGVuc2lvblZhbGlkYXRvclt7MH1dOiBJbXBvc3NpYmxlIGRlIHRyb3V2ZXIgezF9IGV4dGVuc2lvbihzKSByZXF1aXNlKHMpLgorU2VjdXJpdHlVdGlsLmRvQXNQcml2aWxlZ2U9VW5lIGV4Y2VwdGlvbiBzJydlc3QgcHJvZHVpdGUgbG9ycyBkZSBsJydleGVjdXRpb24gZHUgYmxvYyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uLgorCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9Mb2NhbFN0cmluZ3NfamEucHJvcGVydGllcyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL0xvY2FsU3RyaW5nc19qYS5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyMzVkNjQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9Mb2NhbFN0cmluZ3NfamEucHJvcGVydGllcwpAQCAtMCwwICsxLDExIEBACitwcm9wZXJ0eU1hcC5sb2NrZWQ9XHUzMGVkXHUzMGMzXHUzMGFmXHUzMDU1XHUzMDhjXHUzMDVmUGFyYW1ldGVyTWFwXHUzMDZmXHU1OTA5XHU2NmY0XHUzMDRjXHU4YTMxXHUzMDU1XHUzMDhjXHUzMDdlXHUzMDViXHUzMDkzCityZXNvdXJjZVNldC5sb2NrZWQ9XHUzMGVkXHUzMGMzXHUzMGFmXHUzMDU1XHUzMDhjXHUzMDVmUmVzb3VyY2VTZXRcdTMwNmZcdTU5MDlcdTY2ZjRcdTMwNGNcdThhMzFcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNWJcdTMwOTMKK2hleFV0aWwuYmFkPVx1NzEyMVx1NTJiOVx1MzA2YTE2XHU5MDMyXHU2NTcwXHU1MDI0XHUzMDY3XHUzMDU5CitoZXhVdGlsLm9kZD1cdTU5NDdcdTY1NzBcdTY4NDFcdTMwNmUxNlx1OTAzMlx1NjU3MFx1NTAyNFx1MzA2N1x1MzA1OQorI0RlZmF1bHQgTWVzc2FnZXMgVXRpbGl6ZWQgYnkgdGhlIEV4dGVuc2lvblZhbGlkYXRvcgorZXh0ZW5zaW9uVmFsaWRhdG9yLndlYi1hcHBsaWNhdGlvbi1tYW5pZmVzdD1XZWJcdTMwYTJcdTMwZDdcdTMwZWFcdTMwYjFcdTMwZmNcdTMwYjdcdTMwZTdcdTMwZjNcdTMwZGVcdTMwY2JcdTMwZDVcdTMwYTdcdTMwYjlcdTMwYzgKK2V4dGVuc2lvblZhbGlkYXRvci5leHRlbnNpb24tbm90LWZvdW5kLWVycm9yPUV4dGVuc2lvblZhbGlkYXRvclt7MH1dW3sxfV06IFx1NWZjNVx1ODk4MVx1MzA2YVx1NjJlMVx1NWYzNSAiezJ9IiBcdTMwNGNcdTg5OGJcdTMwNjRcdTMwNGJcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDIKK2V4dGVuc2lvblZhbGlkYXRvci5leHRlbnNpb24tdmFsaWRhdGlvbi1lcnJvcj1FeHRlbnNpb25WYWxpZGF0b3JbezB9XTogXHU1ZmM1XHU4OTgxXHUzMDZhXHU2MmUxXHU1ZjM1ICJ7MX0iIFx1MzA0Y1x1ODk4Ylx1MzA2NFx1MzA0Ylx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMgorZXh0ZW5zaW9uVmFsaWRhdG9yLmZhaWxsb2FkPVx1NjJlMVx1NWYzNSB7MH0gXHUzMDZlXHUzMGVkXHUzMGZjXHUzMGM5XHUzMDZiXHU1OTMxXHU2NTU3XHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmCitTZWN1cml0eVV0aWwuZG9Bc1ByaXZpbGVnZT1Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uXHUzMGQ2XHUzMGVkXHUzMGMzXHUzMGFmXHUzMDkyXHU1YjlmXHU4ODRjXHU0ZTJkXHUzMDZiXHU0ZjhiXHU1OTE2XHUzMDRjXHU3NjdhXHU3NTFmXHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmXHUzMDAyCisKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL01ENUVuY29kZXIuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL01ENUVuY29kZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2I5ZWU2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvTUQ1RW5jb2Rlci5qYXZhCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbDsKKworCisvKioKKyAqIEVuY29kZSBhbiBNRDUgZGlnZXN0IGludG8gYSBTdHJpbmcuCisgKiA8cD4KKyAqIFRoZSAxMjggYml0IE1ENSBoYXNoIGlzIGNvbnZlcnRlZCBpbnRvIGEgMzIgY2hhcmFjdGVyIGxvbmcgU3RyaW5nLgorICogRWFjaCBjaGFyYWN0ZXIgb2YgdGhlIFN0cmluZyBpcyB0aGUgaGV4YWRlY2ltYWwgcmVwcmVzZW50YXRpb24gb2YgNCBiaXRzCisgKiBvZiB0aGUgZGlnZXN0LgorICoKKyAqIEBhdXRob3IgUmVteSBNYXVjaGVyYXQKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIE1ENUVuY29kZXIgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIGhleGFkZWNpbWFsID0KKyAgICB7JzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsICc4JywgJzknLAorICAgICAnYScsICdiJywgJ2MnLCAnZCcsICdlJywgJ2YnfTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIEVuY29kZXMgdGhlIDEyOCBiaXQgKDE2IGJ5dGVzKSBNRDUgaW50byBhIDMyIGNoYXJhY3RlciBTdHJpbmcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYmluYXJ5RGF0YSBBcnJheSBjb250YWluaW5nIHRoZSBkaWdlc3QKKyAgICAgKiBAcmV0dXJuIEVuY29kZWQgTUQ1LCBvciBudWxsIGlmIGVuY29kaW5nIGZhaWxlZAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZW5jb2RlKCBieXRlW10gYmluYXJ5RGF0YSApIHsKKworICAgICAgICBpZiAoYmluYXJ5RGF0YS5sZW5ndGggIT0gMTYpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBjaGFyW10gYnVmZmVyID0gbmV3IGNoYXJbMzJdOworCisgICAgICAgIGZvciAoaW50IGk9MDsgaTwxNjsgaSsrKSB7CisgICAgICAgICAgICBpbnQgbG93ID0gKGludCkgKGJpbmFyeURhdGFbaV0gJiAweDBmKTsKKyAgICAgICAgICAgIGludCBoaWdoID0gKGludCkgKChiaW5hcnlEYXRhW2ldICYgMHhmMCkgPj4gNCk7CisgICAgICAgICAgICBidWZmZXJbaSoyXSA9IGhleGFkZWNpbWFsW2hpZ2hdOworICAgICAgICAgICAgYnVmZmVyW2kqMiArIDFdID0gaGV4YWRlY2ltYWxbbG93XTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGJ1ZmZlcik7CisKKyAgICB9CisKKworfQorCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9NSU1FMkphdmEuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL01JTUUySmF2YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxNWYxN2EKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9NSU1FMkphdmEuamF2YQpAQCAtMCwwICsxLDYwMiBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbDsKKworaW1wb3J0IGphdmEudXRpbC4qOworCisvKioKKyAqIE1JTUUySmF2YSBpcyBhIGNvbnZlbmllbmNlIGNsYXNzIHdoaWNoIGhhbmRsZXMgY29udmVyc2lvbnMgYmV0d2VlbiBNSU1FIGNoYXJzZXQgbmFtZXMKKyAqIGFuZCBKYXZhIGVuY29kaW5nIG5hbWVzLgorICogPHA+VGhlIHN1cHBvcnRlZCBYTUwgZW5jb2RpbmdzIGFyZSB0aGUgaW50ZXJzZWN0aW9uIG9mIFhNTC1zdXBwb3J0ZWQgY29kZSBzZXRzIGFuZCB0aG9zZQorICogc3VwcG9ydGVkIGluIEpESyAxLjEuCisgKiA8cD5NSU1FIGNoYXJzZXQgbmFtZXMgYXJlIHVzZWQgb24gPHZhcj54bWxFbmNvZGluZzwvdmFyPiBwYXJhbWV0ZXJzIHRvIG1ldGhvZHMgc3VjaAorICogYXMgPGNvZGU+VFhEb2N1bWVudCNzZXRFbmNvZGluZzwvY29kZT4gYW5kIDxjb2RlPkRURCNzZXRFbmNvZGluZzwvY29kZT4uCisgKiA8cD5KYXZhIGVuY29kaW5nIG5hbWVzIGFyZSB1c2VkIG9uIDx2YXI+ZW5jb2Rpbmc8L3Zhcj4gcGFyYW1ldGVycyB0bworICogbWV0aG9kcyBzdWNoIGFzIDxjb2RlPlRYRG9jdW1lbnQjcHJpbnRXaXRoRm9ybWF0PC9jb2RlPiBhbmQgPGNvZGU+RFREI3ByaW50RXh0ZXJuYWw8L2NvZGU+LgorICogPFA+CisgKiA8VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSI+CisgKiAgPFRSPgorICogICAgICA8VEQgV0lEVEg9IjMzJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj48Qj5Db21tb24gTmFtZTwvQj4KKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxNSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+PEI+VXNlIHRoaXMgbmFtZSBpbiBYTUwgZmlsZXM8L0I+CisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTIlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPjxCPk5hbWUgVHlwZTwvQj4KKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIzMSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+PEI+WGVyY2VzIGNvbnZlcnRzIHRvIHRoaXMgSmF2YSBFbmNvZGVyIE5hbWU8L0I+CisgKiAgICAgIDwvVEQ+CisgKiAgPC9UUj4KKyAqICA8VFI+CisgKiAgICAgIDxURCBXSURUSD0iMzMlIj44IGJpdCBVbmljb2RlPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxNSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+VVRGLTgKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxMiUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+SUFOQQorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjMxJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5VVEY4CisgKiAgICAgIDwvVEQ+CisgKiAgPC9UUj4KKyAqICA8VFI+CisgKiAgICAgIDxURCBXSURUSD0iMzMlIj5JU08gTGF0aW4gMTwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTUlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPklTTy04ODU5LTEKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxMiUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+TUlNRQorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjMxJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5JU08tODg1OS0xCisgKiAgICAgIDwvVEQ+CisgKiAgPC9UUj4KKyAqICA8VFI+CisgKiAgICAgIDxURCBXSURUSD0iMzMlIj5JU08gTGF0aW4gMjwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTUlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPklTTy04ODU5LTIKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxMiUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+TUlNRQorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjMxJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5JU08tODg1OS0yCisgKiAgICAgIDwvVEQ+CisgKiAgPC9UUj4KKyAqICA8VFI+CisgKiAgICAgIDxURCBXSURUSD0iMzMlIj5JU08gTGF0aW4gMzwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTUlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPklTTy04ODU5LTMKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxMiUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+TUlNRQorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjMxJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5JU08tODg1OS0zCisgKiAgICAgIDwvVEQ+CisgKiAgPC9UUj4KKyAqICA8VFI+CisgKiAgICAgIDxURCBXSURUSD0iMzMlIj5JU08gTGF0aW4gNDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTUlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPklTTy04ODU5LTQKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxMiUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+TUlNRQorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjMxJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5JU08tODg1OS00CisgKiAgICAgIDwvVEQ+CisgKiAgPC9UUj4KKyAqICA8VFI+CisgKiAgICAgIDxURCBXSURUSD0iMzMlIj5JU08gTGF0aW4gQ3lyaWxsaWM8L1REPgorICogICAgICA8VEQgV0lEVEg9IjE1JSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5JU08tODg1OS01CisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTIlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPk1JTUUKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIzMSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+SVNPLTg4NTktNQorICogICAgICA8L1REPgorICogIDwvVFI+CisgKiAgPFRSPgorICogICAgICA8VEQgV0lEVEg9IjMzJSI+SVNPIExhdGluIEFyYWJpYzwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTUlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPklTTy04ODU5LTYKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxMiUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+TUlNRQorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjMxJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5JU08tODg1OS02CisgKiAgICAgIDwvVEQ+CisgKiAgPC9UUj4KKyAqICA8VFI+CisgKiAgICAgIDxURCBXSURUSD0iMzMlIj5JU08gTGF0aW4gR3JlZWs8L1REPgorICogICAgICA8VEQgV0lEVEg9IjE1JSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5JU08tODg1OS03CisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTIlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPk1JTUUKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIzMSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+SVNPLTg4NTktNworICogICAgICA8L1REPgorICogIDwvVFI+CisgKiAgPFRSPgorICogICAgICA8VEQgV0lEVEg9IjMzJSI+SVNPIExhdGluIEhlYnJldzwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTUlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPklTTy04ODU5LTgKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxMiUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+TUlNRQorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjMxJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5JU08tODg1OS04CisgKiAgICAgIDwvVEQ+CisgKiAgPC9UUj4KKyAqICA8VFI+CisgKiAgICAgIDxURCBXSURUSD0iMzMlIj5JU08gTGF0aW4gNTwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTUlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPklTTy04ODU5LTkKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxMiUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+TUlNRQorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjMxJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5JU08tODg1OS05CisgKiAgICAgIDwvVEQ+CisgKiAgPC9UUj4KKyAqICA8VFI+CisgKiAgICAgIDxURCBXSURUSD0iMzMlIj5FQkNESUM6IFVTPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxNSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+ZWJjZGljLWNwLXVzCisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTIlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPklBTkEKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIzMSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+Y3AwMzcKKyAqICAgICAgPC9URD4KKyAqICA8L1RSPgorICogIDxUUj4KKyAqICAgICAgPFREIFdJRFRIPSIzMyUiPkVCQ0RJQzogQ2FuYWRhPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxNSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+ZWJjZGljLWNwLWNhCisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTIlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPklBTkEKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIzMSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+Y3AwMzcKKyAqICAgICAgPC9URD4KKyAqICA8L1RSPgorICogIDxUUj4KKyAqICAgICAgPFREIFdJRFRIPSIzMyUiPkVCQ0RJQzogTmV0aGVybGFuZHM8L1REPgorICogICAgICA8VEQgV0lEVEg9IjE1JSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5lYmNkaWMtY3AtbmwKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxMiUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+SUFOQQorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjMxJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5jcDAzNworICogICAgICA8L1REPgorICogIDwvVFI+CisgKiAgPFRSPgorICogICAgICA8VEQgV0lEVEg9IjMzJSI+RUJDRElDOiBEZW5tYXJrPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxNSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+ZWJjZGljLWNwLWRrCisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTIlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPklBTkEKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIzMSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+Y3AyNzcKKyAqICAgICAgPC9URD4KKyAqICA8L1RSPgorICogIDxUUj4KKyAqICAgICAgPFREIFdJRFRIPSIzMyUiPkVCQ0RJQzogTm9yd2F5PC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxNSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+ZWJjZGljLWNwLW5vCisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTIlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPklBTkEKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIzMSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+Y3AyNzcKKyAqICAgICAgPC9URD4KKyAqICA8L1RSPgorICogIDxUUj4KKyAqICAgICAgPFREIFdJRFRIPSIzMyUiPkVCQ0RJQzogRmlubGFuZDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTUlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPmViY2RpYy1jcC1maQorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjEyJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5JQU5BCisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMzElIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPmNwMjc4CisgKiAgICAgIDwvVEQ+CisgKiAgPC9UUj4KKyAqICA8VFI+CisgKiAgICAgIDxURCBXSURUSD0iMzMlIj5FQkNESUM6IFN3ZWRlbjwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTUlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPmViY2RpYy1jcC1zZQorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjEyJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5JQU5BCisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMzElIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPmNwMjc4CisgKiAgICAgIDwvVEQ+CisgKiAgPC9UUj4KKyAqICA8VFI+CisgKiAgICAgIDxURCBXSURUSD0iMzMlIj5FQkNESUM6IEl0YWx5PC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxNSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+ZWJjZGljLWNwLWl0CisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTIlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPklBTkEKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIzMSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+Y3AyODAKKyAqICAgICAgPC9URD4KKyAqICA8L1RSPgorICogIDxUUj4KKyAqICAgICAgPFREIFdJRFRIPSIzMyUiPkVCQ0RJQzogU3BhaW4sIExhdGluIEFtZXJpY2E8L1REPgorICogICAgICA8VEQgV0lEVEg9IjE1JSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5lYmNkaWMtY3AtZXMKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxMiUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+SUFOQQorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjMxJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5jcDI4NAorICogICAgICA8L1REPgorICogIDwvVFI+CisgKiAgPFRSPgorICogICAgICA8VEQgV0lEVEg9IjMzJSI+RUJDRElDOiBHcmVhdCBCcml0YWluPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxNSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+ZWJjZGljLWNwLWdiCisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTIlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPklBTkEKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIzMSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+Y3AyODUKKyAqICAgICAgPC9URD4KKyAqICA8L1RSPgorICogIDxUUj4KKyAqICAgICAgPFREIFdJRFRIPSIzMyUiPkVCQ0RJQzogRnJhbmNlPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxNSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+ZWJjZGljLWNwLWZyCisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTIlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPklBTkEKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIzMSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+Y3AyOTcKKyAqICAgICAgPC9URD4KKyAqICA8L1RSPgorICogIDxUUj4KKyAqICAgICAgPFREIFdJRFRIPSIzMyUiPkVCQ0RJQzogQXJhYmljPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxNSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+ZWJjZGljLWNwLWFyMQorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjEyJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5JQU5BCisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMzElIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPmNwNDIwCisgKiAgICAgIDwvVEQ+CisgKiAgPC9UUj4KKyAqICA8VFI+CisgKiAgICAgIDxURCBXSURUSD0iMzMlIj5FQkNESUM6IEhlYnJldzwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTUlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPmViY2RpYy1jcC1oZQorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjEyJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5JQU5BCisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMzElIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPmNwNDI0CisgKiAgICAgIDwvVEQ+CisgKiAgPC9UUj4KKyAqICA8VFI+CisgKiAgICAgIDxURCBXSURUSD0iMzMlIj5FQkNESUM6IFN3aXR6ZXJsYW5kPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxNSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+ZWJjZGljLWNwLWNoCisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTIlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPklBTkEKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIzMSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+Y3A1MDAKKyAqICAgICAgPC9URD4KKyAqICA8L1RSPgorICogIDxUUj4KKyAqICAgICAgPFREIFdJRFRIPSIzMyUiPkVCQ0RJQzogUm9lY2U8L1REPgorICogICAgICA8VEQgV0lEVEg9IjE1JSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5lYmNkaWMtY3Atcm9lY2UKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxMiUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+SUFOQQorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjMxJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5jcDg3MAorICogICAgICA8L1REPgorICogIDwvVFI+CisgKiAgPFRSPgorICogICAgICA8VEQgV0lEVEg9IjMzJSI+RUJDRElDOiBZb2dvc2xhdmlhPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxNSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+ZWJjZGljLWNwLXl1CisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTIlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPklBTkEKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIzMSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+Y3A4NzAKKyAqICAgICAgPC9URD4KKyAqICA8L1RSPgorICogIDxUUj4KKyAqICAgICAgPFREIFdJRFRIPSIzMyUiPkVCQ0RJQzogSWNlbGFuZDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTUlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPmViY2RpYy1jcC1pcworICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjEyJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5JQU5BCisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMzElIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPmNwODcxCisgKiAgICAgIDwvVEQ+CisgKiAgPC9UUj4KKyAqICA8VFI+CisgKiAgICAgIDxURCBXSURUSD0iMzMlIj5FQkNESUM6IFVyZHU8L1REPgorICogICAgICA8VEQgV0lEVEg9IjE1JSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5lYmNkaWMtY3AtYXIyCisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTIlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPklBTkEKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIzMSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+Y3A5MTgKKyAqICAgICAgPC9URD4KKyAqICA8L1RSPgorICogIDxUUj4KKyAqICAgICAgPFREIFdJRFRIPSIzMyUiPkNoaW5lc2UgZm9yIFBSQywgbWl4ZWQgMS8yIGJ5dGU8L1REPgorICogICAgICA8VEQgV0lEVEg9IjE1JSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5nYjIzMTIKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxMiUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+TUlNRQorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjMxJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5HQjIzMTIKKyAqICAgICAgPC9URD4KKyAqICA8L1RSPgorICogIDxUUj4KKyAqICAgICAgPFREIFdJRFRIPSIzMyUiPkV4dGVuZGVkIFVuaXggQ29kZSwgcGFja2VkIGZvciBKYXBhbmVzZTwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTUlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPmV1Yy1qcAorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjEyJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5NSU1FCisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMzElIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPmV1Y2ppcworICogICAgICA8L1REPgorICogIDwvVFI+CisgKiAgPFRSPgorICogICAgICA8VEQgV0lEVEg9IjMzJSI+SmFwYW5lc2U6IGlzby0yMDIyLWpwPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxNSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+aXNvLTIwMjAtanAKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxMiUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+TUlNRQorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjMxJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5KSVMKKyAqICAgICAgPC9URD4KKyAqICA8L1RSPgorICogIDxUUj4KKyAqICAgICAgPFREIFdJRFRIPSIzMyUiPkphcGFuZXNlOiBTaGlmdCBKSVM8L1REPgorICogICAgICA8VEQgV0lEVEg9IjE1JSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5TaGlmdF9KSVMKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxMiUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+TUlNRQorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjMxJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5TSklTCisgKiAgICAgIDwvVEQ+CisgKiAgPC9UUj4KKyAqICA8VFI+CisgKiAgICAgIDxURCBXSURUSD0iMzMlIj5DaGluZXNlOiBCaWc1PC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxNSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+QmlnNQorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjEyJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5NSU1FCisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMzElIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPkJpZzUKKyAqICAgICAgPC9URD4KKyAqICA8L1RSPgorICogIDxUUj4KKyAqICAgICAgPFREIFdJRFRIPSIzMyUiPkV4dGVuZGVkIFVuaXggQ29kZSwgcGFja2VkIGZvciBLb3JlYW48L1REPgorICogICAgICA8VEQgV0lEVEg9IjE1JSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5ldWMta3IKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxMiUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+TUlNRQorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjMxJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5pc28yMDIya3IKKyAqICAgICAgPC9URD4KKyAqICA8L1RSPgorICogIDxUUj4KKyAqICAgICAgPFREIFdJRFRIPSIzMyUiPkN5cmlsbGljPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxNSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+a29pOC1yCisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTIlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPk1JTUUKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIzMSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+a29pOC1yCisgKiAgICAgIDwvVEQ+CisgKiAgPC9UUj4KKyAqIDwvVEFCTEU+CisgKgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqIEBhdXRob3IgVEFNVVJBIEtlbnQgJmx0O2tlbnRAdHJsLmlibS5jby5qcCZndDsKKyAqLworcHVibGljIGNsYXNzIE1JTUUySmF2YSB7CisKKyAgICBzdGF0aWMgcHJpdmF0ZSBIYXNodGFibGUgc19lbmNoYXNoOworICAgIHN0YXRpYyBwcml2YXRlIEhhc2h0YWJsZSBzX3Jldmhhc2g7CisKKyAgICBzdGF0aWMgeworICAgICAgICBzX2VuY2hhc2ggPSBuZXcgSGFzaHRhYmxlKCk7CisgICAgICAgIC8vICAgIDxwcmVmZXJyZWQgTUlNRSBuYW1lPiwgPEphdmEgZW5jb2RpbmcgbmFtZT4KKyAgICAgICAgc19lbmNoYXNoLnB1dCgiVVRGLTgiLCAiVVRGOCIpOworICAgICAgICBzX2VuY2hhc2gucHV0KCJVUy1BU0NJSSIsICAgICAgICAiODg1OV8xIik7ICAgIC8vID8KKyAgICAgICAgc19lbmNoYXNoLnB1dCgiSVNPLTg4NTktMSIsICAgICAgIjg4NTlfMSIpOworICAgICAgICBzX2VuY2hhc2gucHV0KCJJU08tODg1OS0yIiwgICAgICAiODg1OV8yIik7CisgICAgICAgIHNfZW5jaGFzaC5wdXQoIklTTy04ODU5LTMiLCAgICAgICI4ODU5XzMiKTsKKyAgICAgICAgc19lbmNoYXNoLnB1dCgiSVNPLTg4NTktNCIsICAgICAgIjg4NTlfNCIpOworICAgICAgICBzX2VuY2hhc2gucHV0KCJJU08tODg1OS01IiwgICAgICAiODg1OV81Iik7CisgICAgICAgIHNfZW5jaGFzaC5wdXQoIklTTy04ODU5LTYiLCAgICAgICI4ODU5XzYiKTsKKyAgICAgICAgc19lbmNoYXNoLnB1dCgiSVNPLTg4NTktNyIsICAgICAgIjg4NTlfNyIpOworICAgICAgICBzX2VuY2hhc2gucHV0KCJJU08tODg1OS04IiwgICAgICAiODg1OV84Iik7CisgICAgICAgIHNfZW5jaGFzaC5wdXQoIklTTy04ODU5LTkiLCAgICAgICI4ODU5XzkiKTsKKyAgICAgICAgc19lbmNoYXNoLnB1dCgiSVNPLTIwMjItSlAiLCAgICAgIkpJUyIpOworICAgICAgICBzX2VuY2hhc2gucHV0KCJTSElGVF9KSVMiLCAgICAgICAiU0pJUyIpOworICAgICAgICBzX2VuY2hhc2gucHV0KCJFVUMtSlAiLCAgICAgICAgICAiRVVDSklTIik7CisgICAgICAgIHNfZW5jaGFzaC5wdXQoIkdCMjMxMiIsICAgICAgICAgICJHQjIzMTIiKTsKKyAgICAgICAgc19lbmNoYXNoLnB1dCgiQklHNSIsICAgICAgICAgICAgIkJpZzUiKTsKKyAgICAgICAgc19lbmNoYXNoLnB1dCgiRVVDLUtSIiwgICAgICAgICAgIktTQzU2MDEiKTsKKyAgICAgICAgc19lbmNoYXNoLnB1dCgiSVNPLTIwMjItS1IiLCAgICAgIklTTzIwMjJLUiIpOworICAgICAgICBzX2VuY2hhc2gucHV0KCJLT0k4LVIiLCAgICAgICAgICAiS09JOF9SIik7CisKKyAgICAgICAgc19lbmNoYXNoLnB1dCgiRUJDRElDLUNQLVVTIiwgICAgIkNQMDM3Iik7CisgICAgICAgIHNfZW5jaGFzaC5wdXQoIkVCQ0RJQy1DUC1DQSIsICAgICJDUDAzNyIpOworICAgICAgICBzX2VuY2hhc2gucHV0KCJFQkNESUMtQ1AtTkwiLCAgICAiQ1AwMzciKTsKKyAgICAgICAgc19lbmNoYXNoLnB1dCgiRUJDRElDLUNQLURLIiwgICAgIkNQMjc3Iik7CisgICAgICAgIHNfZW5jaGFzaC5wdXQoIkVCQ0RJQy1DUC1OTyIsICAgICJDUDI3NyIpOworICAgICAgICBzX2VuY2hhc2gucHV0KCJFQkNESUMtQ1AtRkkiLCAgICAiQ1AyNzgiKTsKKyAgICAgICAgc19lbmNoYXNoLnB1dCgiRUJDRElDLUNQLVNFIiwgICAgIkNQMjc4Iik7CisgICAgICAgIHNfZW5jaGFzaC5wdXQoIkVCQ0RJQy1DUC1JVCIsICAgICJDUDI4MCIpOworICAgICAgICBzX2VuY2hhc2gucHV0KCJFQkNESUMtQ1AtRVMiLCAgICAiQ1AyODQiKTsKKyAgICAgICAgc19lbmNoYXNoLnB1dCgiRUJDRElDLUNQLUdCIiwgICAgIkNQMjg1Iik7CisgICAgICAgIHNfZW5jaGFzaC5wdXQoIkVCQ0RJQy1DUC1GUiIsICAgICJDUDI5NyIpOworICAgICAgICBzX2VuY2hhc2gucHV0KCJFQkNESUMtQ1AtQVIxIiwgICAiQ1A0MjAiKTsKKyAgICAgICAgc19lbmNoYXNoLnB1dCgiRUJDRElDLUNQLUhFIiwgICAgIkNQNDI0Iik7CisgICAgICAgIHNfZW5jaGFzaC5wdXQoIkVCQ0RJQy1DUC1DSCIsICAgICJDUDUwMCIpOworICAgICAgICBzX2VuY2hhc2gucHV0KCJFQkNESUMtQ1AtUk9FQ0UiLCAiQ1A4NzAiKTsKKyAgICAgICAgc19lbmNoYXNoLnB1dCgiRUJDRElDLUNQLVlVIiwgICAgIkNQODcwIik7CisgICAgICAgIHNfZW5jaGFzaC5wdXQoIkVCQ0RJQy1DUC1JUyIsICAgICJDUDg3MSIpOworICAgICAgICBzX2VuY2hhc2gucHV0KCJFQkNESUMtQ1AtQVIyIiwgICAiQ1A5MTgiKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gajpDTlMxMTY0MyAtPiBFVUMtVFc/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJU08tMjAyMi1DTj8gSVNPLTIwMjItQ04tRVhUPworCisgICAgICAgIHNfcmV2aGFzaCA9IG5ldyBIYXNodGFibGUoKTsKKyAgICAgICAgLy8gICAgPEphdmEgZW5jb2RpbmcgbmFtZT4sIDxwcmVmZXJyZWQgTUlNRSBuYW1lPgorICAgICAgICBzX3Jldmhhc2gucHV0KCJVVEY4IiwgIlVURi04Iik7CisgICAgICAgIC8vc19yZXZoYXNoLnB1dCgiODg1OV8xIiwgIlVTLUFTQ0lJIik7ICAgIC8vID8KKyAgICAgICAgc19yZXZoYXNoLnB1dCgiODg1OV8xIiwgIklTTy04ODU5LTEiKTsKKyAgICAgICAgc19yZXZoYXNoLnB1dCgiODg1OV8yIiwgIklTTy04ODU5LTIiKTsKKyAgICAgICAgc19yZXZoYXNoLnB1dCgiODg1OV8zIiwgIklTTy04ODU5LTMiKTsKKyAgICAgICAgc19yZXZoYXNoLnB1dCgiODg1OV80IiwgIklTTy04ODU5LTQiKTsKKyAgICAgICAgc19yZXZoYXNoLnB1dCgiODg1OV81IiwgIklTTy04ODU5LTUiKTsKKyAgICAgICAgc19yZXZoYXNoLnB1dCgiODg1OV82IiwgIklTTy04ODU5LTYiKTsKKyAgICAgICAgc19yZXZoYXNoLnB1dCgiODg1OV83IiwgIklTTy04ODU5LTciKTsKKyAgICAgICAgc19yZXZoYXNoLnB1dCgiODg1OV84IiwgIklTTy04ODU5LTgiKTsKKyAgICAgICAgc19yZXZoYXNoLnB1dCgiODg1OV85IiwgIklTTy04ODU5LTkiKTsKKyAgICAgICAgc19yZXZoYXNoLnB1dCgiSklTIiwgIklTTy0yMDIyLUpQIik7CisgICAgICAgIHNfcmV2aGFzaC5wdXQoIlNKSVMiLCAiU2hpZnRfSklTIik7CisgICAgICAgIHNfcmV2aGFzaC5wdXQoIkVVQ0pJUyIsICJFVUMtSlAiKTsKKyAgICAgICAgc19yZXZoYXNoLnB1dCgiR0IyMzEyIiwgIkdCMjMxMiIpOworICAgICAgICBzX3Jldmhhc2gucHV0KCJCSUc1IiwgIkJpZzUiKTsKKyAgICAgICAgc19yZXZoYXNoLnB1dCgiS1NDNTYwMSIsICJFVUMtS1IiKTsKKyAgICAgICAgc19yZXZoYXNoLnB1dCgiSVNPMjAyMktSIiwgIklTTy0yMDIyLUtSIik7CisgICAgICAgIHNfcmV2aGFzaC5wdXQoIktPSThfUiIsICJLT0k4LVIiKTsKKworICAgICAgICBzX3Jldmhhc2gucHV0KCJDUDAzNyIsICJFQkNESUMtQ1AtVVMiKTsKKyAgICAgICAgc19yZXZoYXNoLnB1dCgiQ1AwMzciLCAiRUJDRElDLUNQLUNBIik7CisgICAgICAgIHNfcmV2aGFzaC5wdXQoIkNQMDM3IiwgIkVCQ0RJQy1DUC1OTCIpOworICAgICAgICBzX3Jldmhhc2gucHV0KCJDUDI3NyIsICJFQkNESUMtQ1AtREsiKTsKKyAgICAgICAgc19yZXZoYXNoLnB1dCgiQ1AyNzciLCAiRUJDRElDLUNQLU5PIik7CisgICAgICAgIHNfcmV2aGFzaC5wdXQoIkNQMjc4IiwgIkVCQ0RJQy1DUC1GSSIpOworICAgICAgICBzX3Jldmhhc2gucHV0KCJDUDI3OCIsICJFQkNESUMtQ1AtU0UiKTsKKyAgICAgICAgc19yZXZoYXNoLnB1dCgiQ1AyODAiLCAiRUJDRElDLUNQLUlUIik7CisgICAgICAgIHNfcmV2aGFzaC5wdXQoIkNQMjg0IiwgIkVCQ0RJQy1DUC1FUyIpOworICAgICAgICBzX3Jldmhhc2gucHV0KCJDUDI4NSIsICJFQkNESUMtQ1AtR0IiKTsKKyAgICAgICAgc19yZXZoYXNoLnB1dCgiQ1AyOTciLCAiRUJDRElDLUNQLUZSIik7CisgICAgICAgIHNfcmV2aGFzaC5wdXQoIkNQNDIwIiwgIkVCQ0RJQy1DUC1BUjEiKTsKKyAgICAgICAgc19yZXZoYXNoLnB1dCgiQ1A0MjQiLCAiRUJDRElDLUNQLUhFIik7CisgICAgICAgIHNfcmV2aGFzaC5wdXQoIkNQNTAwIiwgIkVCQ0RJQy1DUC1DSCIpOworICAgICAgICBzX3Jldmhhc2gucHV0KCJDUDg3MCIsICJFQkNESUMtQ1AtUk9FQ0UiKTsKKyAgICAgICAgc19yZXZoYXNoLnB1dCgiQ1A4NzAiLCAiRUJDRElDLUNQLVlVIik7CisgICAgICAgIHNfcmV2aGFzaC5wdXQoIkNQODcxIiwgIkVCQ0RJQy1DUC1JUyIpOworICAgICAgICBzX3Jldmhhc2gucHV0KCJDUDkxOCIsICJFQkNESUMtQ1AtQVIyIik7CisgICAgfQorCisgICAgcHJpdmF0ZSBNSU1FMkphdmEoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVydCBhIE1JTUUgY2hhcnNldCBuYW1lLCBhbHNvIGtub3duIGFzIGFuIFhNTCBlbmNvZGluZyBuYW1lLCB0byBhIEphdmEgZW5jb2RpbmcgbmFtZS4KKyAgICAgKiBAcGFyYW0gICBtaW1lQ2hhcnNldE5hbWUgQ2FzZSBpbnNlbnNpdGl2ZSBNSU1FIGNoYXJzZXQgbmFtZTogPGNvZGU+VVRGLTgsIFVTLUFTQ0lJLCBJU08tODg1OS0xLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBJU08tODg1OS0yLCBJU08tODg1OS0zLCBJU08tODg1OS00LCBJU08tODg1OS01LCBJU08tODg1OS02LAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBJU08tODg1OS03LCBJU08tODg1OS04LCBJU08tODg1OS05LCBJU08tMjAyMi1KUCwgU2hpZnRfSklTLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBFVUMtSlAsIEdCMjMxMiwgQmlnNSwgRVVDLUtSLCBJU08tMjAyMi1LUiwgS09JOC1SLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBFQkNESUMtQ1AtVVMsIEVCQ0RJQy1DUC1DQSwgRUJDRElDLUNQLU5MLCBFQkNESUMtQ1AtREssCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIEVCQ0RJQy1DUC1OTywgRUJDRElDLUNQLUZJLCBFQkNESUMtQ1AtU0UsIEVCQ0RJQy1DUC1JVCwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgRUJDRElDLUNQLUVTLCBFQkNESUMtQ1AtR0IsIEVCQ0RJQy1DUC1GUiwgRUJDRElDLUNQLUFSMSwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgRUJDRElDLUNQLUhFLCBFQkNESUMtQ1AtQ0gsIEVCQ0RJQy1DUC1ST0VDRSwgRUJDRElDLUNQLVlVLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBFQkNESUMtQ1AtSVMgYW5kIEVCQ0RJQy1DUC1BUjI8L2NvZGU+LgorICAgICAqIEByZXR1cm4gICAgICAgICAgICAgICAgICBKYXZhIGVuY29kaW5nIG5hbWUsIG9yIDx2YXI+bnVsbDwvdmFyPiBpZiA8dmFyPm1pbWVDaGFyc2V0TmFtZTwvdmFyPgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBpcyB1bmtub3duLgorICAgICAqIEBzZWUgI3JldmVyc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0KFN0cmluZyBtaW1lQ2hhcnNldE5hbWUpIHsKKyAgICAgICAgcmV0dXJuIChTdHJpbmcpc19lbmNoYXNoLmdldChtaW1lQ2hhcnNldE5hbWUudG9VcHBlckNhc2UoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVydCBhIEphdmEgZW5jb2RpbmcgbmFtZSB0byBNSU1FIGNoYXJzZXQgbmFtZS4KKyAgICAgKiBBdmFpbGFibGUgdmFsdWVzIG9mIDxpPmVuY29kaW5nPC9pPiBhcmUgIlVURjgiLCAiODg1OV8xIiwgIjg4NTlfMiIsICI4ODU5XzMiLCAiODg1OV80IiwKKyAgICAgKiAiODg1OV81IiwgIjg4NTlfNiIsICI4ODU5XzciLCAiODg1OV84IiwgIjg4NTlfOSIsICJKSVMiLCAiU0pJUyIsICJFVUNKSVMiLAorICAgICAqICJHQjIzMTIiLCAiQklHNSIsICJLU0M1NjAxIiwgIklTTzIwMjJLUiIsICAiS09JOF9SIiwgIkNQMDM3IiwgIkNQMjc3IiwgIkNQMjc4IiwKKyAgICAgKiAiQ1AyODAiLCAiQ1AyODQiLCAiQ1AyODUiLCAiQ1AyOTciLCAiQ1A0MjAiLCAiQ1A0MjQiLCAiQ1A1MDAiLCAiQ1A4NzAiLCAiQ1A4NzEiIGFuZCAiQ1A5MTgiLgorICAgICAqIEBwYXJhbSAgIGVuY29kaW5nICAgIENhc2UgaW5zZW5zaXRpdmUgSmF2YSBlbmNvZGluZyBuYW1lOiA8Y29kZT5VVEY4LCA4ODU5XzEsIDg4NTlfMiwgODg1OV8zLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgIDg4NTlfNCwgODg1OV81LCA4ODU5XzYsIDg4NTlfNywgODg1OV84LCA4ODU5XzksIEpJUywgU0pJUywgRVVDSklTLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgIEdCMjMxMiwgQklHNSwgS1NDNTYwMSwgSVNPMjAyMktSLCBLT0k4X1IsIENQMDM3LCBDUDI3NywgQ1AyNzgsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgQ1AyODAsIENQMjg0LCBDUDI4NSwgQ1AyOTcsIENQNDIwLCBDUDQyNCwgQ1A1MDAsIENQODcwLCBDUDg3MQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGFuZCBDUDkxODwvY29kZT4uCisgICAgICogQHJldHVybiAgICAgICAgICAgICAgTUlNRSBjaGFyc2V0IG5hbWUsIG9yIDx2YXI+bnVsbDwvdmFyPiBpZiA8dmFyPmVuY29kaW5nPC92YXI+IGlzIHVua25vd24uCisgICAgICogQHNlZSAjY29udmVydAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHJldmVyc2UoU3RyaW5nIGVuY29kaW5nKSB7CisgICAgICAgIHJldHVybiAoU3RyaW5nKXNfcmV2aGFzaC5nZXQoZW5jb2RpbmcudG9VcHBlckNhc2UoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvTWFuaWZlc3RSZXNvdXJjZS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvTWFuaWZlc3RSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2MjhhYzcKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9NYW5pZmVzdFJlc291cmNlLmphdmEKQEAgLTAsMCArMSwyNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5qYXIuTWFuaWZlc3Q7CitpbXBvcnQgamF2YS51dGlsLmphci5BdHRyaWJ1dGVzOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKKy8qKgorICogIFJlcHJlc2VudGF0aW9uIG9mIGEgTWFuaWZlc3QgZmlsZSBhbmQgaXRzIGF2YWlsYWJsZSBleHRlbnNpb25zIGFuZAorICogIHJlcXVpcmVkIGV4dGVuc2lvbnMKKyAqICAKKyAqIEBhdXRob3IgR3JlZyBNdXJyYXkKKyAqIEBhdXRob3IgSnVzdHluYSBIb3J3YXQKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKiAKKyAqLworcHVibGljIGNsYXNzIE1hbmlmZXN0UmVzb3VyY2UgeworICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisgICAgLy8gVGhlc2UgYXJlIHRoZSByZXNvdXJjZSB0eXBlcyBmb3IgZGV0ZXJtaW5pbmcgZWZmZWN0IGVycm9yIG1lc3NhZ2VzCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1lTVEVNID0gMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQVIgPSAyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFQUExJQ0FUSU9OID0gMzsKKyAgICAKKyAgICBwcml2YXRlIEhhc2hNYXAgYXZhaWxhYmxlRXh0ZW5zaW9ucyA9IG51bGw7CisgICAgcHJpdmF0ZSBBcnJheUxpc3QgcmVxdWlyZWRFeHRlbnNpb25zID0gbnVsbDsKKyAgICAKKyAgICBwcml2YXRlIFN0cmluZyByZXNvdXJjZU5hbWUgPSBudWxsOworICAgIHByaXZhdGUgaW50IHJlc291cmNlVHlwZSA9IC0xOworICAgICAgICAKKyAgICBwdWJsaWMgTWFuaWZlc3RSZXNvdXJjZShTdHJpbmcgcmVzb3VyY2VOYW1lLCBNYW5pZmVzdCBtYW5pZmVzdCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlc291cmNlVHlwZSkgeworICAgICAgICB0aGlzLnJlc291cmNlTmFtZSA9IHJlc291cmNlTmFtZTsKKyAgICAgICAgdGhpcy5yZXNvdXJjZVR5cGUgPSByZXNvdXJjZVR5cGU7CisgICAgICAgIHByb2Nlc3NNYW5pZmVzdChtYW5pZmVzdCk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEdldHMgdGhlIG5hbWUgb2YgdGhlIHJlc291cmNlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VOYW1lKCkgeworICAgICAgICByZXR1cm4gcmVzb3VyY2VOYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIG1hcCBvZiBhdmFpbGFibGUgZXh0ZW5zaW9ucworICAgICAqCisgICAgICogQHJldHVybiBNYXAgb2YgYXZhaWxhYmxlIGV4dGVuc2lvbnMKKyAgICAgKi8KKyAgICBwdWJsaWMgSGFzaE1hcCBnZXRBdmFpbGFibGVFeHRlbnNpb25zKCkgeworICAgICAgICByZXR1cm4gYXZhaWxhYmxlRXh0ZW5zaW9uczsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbGlzdCBvZiByZXF1aXJlZCBleHRlbnNpb25zCisgICAgICoKKyAgICAgKiBAcmV0dXJuIExpc3Qgb2YgcmVxdWlyZWQgZXh0ZW5zaW9ucworICAgICAqLworICAgIHB1YmxpYyBBcnJheUxpc3QgZ2V0UmVxdWlyZWRFeHRlbnNpb25zKCkgeworICAgICAgICByZXR1cm4gcmVxdWlyZWRFeHRlbnNpb25zOyAgIAorICAgIH0KKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIG51bWJlciBvZiBhdmFpbGFibGUgZXh0ZW5zaW9ucworICAgICAqCisgICAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBleHRlbnNpb25zCisgICAgICovCisgICAgcHVibGljIGludCBnZXRBdmFpbGFibGVFeHRlbnNpb25Db3VudCgpIHsKKyAgICAgICAgcmV0dXJuIChhdmFpbGFibGVFeHRlbnNpb25zICE9IG51bGwpID8gYXZhaWxhYmxlRXh0ZW5zaW9ucy5zaXplKCkgOiAwOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBudW1iZXIgb2YgcmVxdWlyZWQgZXh0ZW5zaW9ucworICAgICAqCisgICAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIHJlcXVpcmVkIGV4dGVuc2lvbnMKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFJlcXVpcmVkRXh0ZW5zaW9uQ291bnQoKSB7CisgICAgICAgIHJldHVybiAocmVxdWlyZWRFeHRlbnNpb25zICE9IG51bGwpID8gcmVxdWlyZWRFeHRlbnNpb25zLnNpemUoKSA6IDA7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENvbnZpZW5pZW5jZSBtZXRob2QgdG8gY2hlY2sgaWYgdGhpcyA8Y29kZT5NYW5pZmVzdFJlc291cmNlPC9jb2RlPgorICAgICAqIGhhcyBhbiByZXF1aXJlcyBleHRlbnNpb25zLgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHJlcXVpcmVkIGV4dGVuc2lvbnMgYXJlIHByZXNlbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiByZXF1aXJlc0V4dGVuc2lvbnMoKSB7CisgICAgICAgIHJldHVybiAocmVxdWlyZWRFeHRlbnNpb25zICE9IG51bGwpID8gdHJ1ZSA6IGZhbHNlOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDb252aWVuaWVuY2UgbWV0aG9kIHRvIGNoZWNrIGlmIHRoaXMgPGNvZGU+TWFuaWZlc3RSZXNvdXJjZTwvY29kZT4KKyAgICAgKiBoYXMgYW4gZXh0ZW5zaW9uIGF2YWlsYWJsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBrZXkgZXh0ZW5zaW9uIGlkZW50aWZpZXIKKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBleHRlbnNpb24gYXZhaWxhYmxlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNFeHRlbnNpb24oU3RyaW5nIGtleSkgeworICAgICAgICByZXR1cm4gKGF2YWlsYWJsZUV4dGVuc2lvbnMgIT0gbnVsbCkgPworICAgICAgICAgICAgICAgIGF2YWlsYWJsZUV4dGVuc2lvbnMuY29udGFpbnNLZXkoa2V5KSA6IGZhbHNlOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIGFsbCByZXF1aXJlZCBleHRlbnNpb24gZGVwZW5kZW5jaWVzCisgICAgICogaGF2ZSBiZWVuIG1lZXQgZm9yIHRoaXMgPGNvZGU+TWFuaWZlc3RSZXNvdXJjZTwvY29kZT4gb2JqZWN0LgorICAgICAqCisgICAgICogQHJldHVybiBib29sZWFuIHRydWUgaWYgYWxsIGV4dGVuc2lvbiBkZXBlbmRlbmNpZXMgaGF2ZSBiZWVuIHNhdGlzZmllZAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRnVsZmlsbGVkKCkgeworICAgICAgICBpZiAocmVxdWlyZWRFeHRlbnNpb25zID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBJdGVyYXRvciBpdCA9IHJlcXVpcmVkRXh0ZW5zaW9ucy5pdGVyYXRvcigpOworICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBFeHRlbnNpb24gZXh0ID0gKEV4dGVuc2lvbilpdC5uZXh0KCk7CisgICAgICAgICAgICBpZiAoIWV4dC5pc0Z1bGZpbGxlZCgpKSByZXR1cm4gZmFsc2U7ICAgICAgICAgICAgCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiTWFuaWZlc3RSZXNvdXJjZVsiKTsKKyAgICAgICAgc2IuYXBwZW5kKHJlc291cmNlTmFtZSk7CisKKyAgICAgICAgc2IuYXBwZW5kKCIsIGlzRnVsZmlsbGVkPSIpOworICAgICAgICBzYi5hcHBlbmQoaXNGdWxmaWxsZWQoKSArIiIpOworICAgICAgICBzYi5hcHBlbmQoIiwgcmVxdWlyZWRFeHRlbnNpb25Db3VudCA9Iik7CisgICAgICAgIHNiLmFwcGVuZChnZXRSZXF1aXJlZEV4dGVuc2lvbkNvdW50KCkpOworICAgICAgICBzYi5hcHBlbmQoIiwgYXZhaWxhYmxlRXh0ZW5zaW9uQ291bnQ9Iik7CisgICAgICAgIHNiLmFwcGVuZChnZXRBdmFpbGFibGVFeHRlbnNpb25Db3VudCgpKTsKKyAgICAgICAgc3dpdGNoIChyZXNvdXJjZVR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgU1lTVEVNIDogc2IuYXBwZW5kKCIsIHJlc291cmNlVHlwZT1TWVNURU0iKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFdBUiA6IHNiLmFwcGVuZCgiLCByZXNvdXJjZVR5cGU9V0FSIik7IGJyZWFrOworICAgICAgICAgICAgY2FzZSBBUFBMSUNBVElPTiA6IHNiLmFwcGVuZCgiLCByZXNvdXJjZVR5cGU9QVBQTElDQVRJT04iKTsgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgc2IuYXBwZW5kKCJdIik7CisgICAgICAgIHJldHVybiAoc2IudG9TdHJpbmcoKSk7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcml2YXRlIE1ldGhvZHMKKworICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzTWFuaWZlc3QoTWFuaWZlc3QgbWFuaWZlc3QpIHsKKyAgICAgICAgYXZhaWxhYmxlRXh0ZW5zaW9ucyA9IGdldEF2YWlsYWJsZUV4dGVuc2lvbnMobWFuaWZlc3QpOworICAgICAgICByZXF1aXJlZEV4dGVuc2lvbnMgPSBnZXRSZXF1aXJlZEV4dGVuc2lvbnMobWFuaWZlc3QpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNldCBvZiA8Y29kZT5FeHRlbnNpb248L2NvZGU+IG9iamVjdHMgcmVwcmVzZW50aW5nIG9wdGlvbmFsCisgICAgICogcGFja2FnZXMgdGhhdCBhcmUgcmVxdWlyZWQgYnkgdGhlIGFwcGxpY2F0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUKKyAgICAgKiBzcGVjaWZpZWQgPGNvZGU+TWFuaWZlc3Q8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIG1hbmlmZXN0IE1hbmlmZXN0IHRvIGJlIHBhcnNlZAorICAgICAqCisgICAgICogQHJldHVybiBMaXN0IG9mIHJlcXVpcmVkIGV4dGVuc2lvbnMsIG9yIG51bGwgaWYgdGhlIGFwcGxpY2F0aW9uCisgICAgICogZG9lcyBub3QgcmVxdWlyZSBhbnkgZXh0ZW5zaW9ucworICAgICAqLworICAgIHByaXZhdGUgQXJyYXlMaXN0IGdldFJlcXVpcmVkRXh0ZW5zaW9ucyhNYW5pZmVzdCBtYW5pZmVzdCkgeworCisgICAgICAgIEF0dHJpYnV0ZXMgYXR0cmlidXRlcyA9IG1hbmlmZXN0LmdldE1haW5BdHRyaWJ1dGVzKCk7CisgICAgICAgIFN0cmluZyBuYW1lcyA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoIkV4dGVuc2lvbi1MaXN0Iik7CisgICAgICAgIGlmIChuYW1lcyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgQXJyYXlMaXN0IGV4dGVuc2lvbkxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIG5hbWVzICs9ICIgIjsKKworICAgICAgICB3aGlsZSAodHJ1ZSkgeworCisgICAgICAgICAgICBpbnQgc3BhY2UgPSBuYW1lcy5pbmRleE9mKCcgJyk7CisgICAgICAgICAgICBpZiAoc3BhY2UgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBuYW1lcy5zdWJzdHJpbmcoMCwgc3BhY2UpLnRyaW0oKTsKKyAgICAgICAgICAgIG5hbWVzID0gbmFtZXMuc3Vic3RyaW5nKHNwYWNlICsgMSk7CisKKyAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9CisgICAgICAgICAgICAgICAgYXR0cmlidXRlcy5nZXRWYWx1ZShuYW1lICsgIi1FeHRlbnNpb24tTmFtZSIpOworICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBFeHRlbnNpb24gZXh0ZW5zaW9uID0gbmV3IEV4dGVuc2lvbigpOworICAgICAgICAgICAgZXh0ZW5zaW9uLnNldEV4dGVuc2lvbk5hbWUodmFsdWUpOworICAgICAgICAgICAgZXh0ZW5zaW9uLnNldEltcGxlbWVudGF0aW9uVVJMCisgICAgICAgICAgICAgICAgKGF0dHJpYnV0ZXMuZ2V0VmFsdWUobmFtZSArICItSW1wbGVtZW50YXRpb24tVVJMIikpOworICAgICAgICAgICAgZXh0ZW5zaW9uLnNldEltcGxlbWVudGF0aW9uVmVuZG9ySWQKKyAgICAgICAgICAgICAgICAoYXR0cmlidXRlcy5nZXRWYWx1ZShuYW1lICsgIi1JbXBsZW1lbnRhdGlvbi1WZW5kb3ItSWQiKSk7CisgICAgICAgICAgICBTdHJpbmcgdmVyc2lvbiA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUobmFtZSArICItSW1wbGVtZW50YXRpb24tVmVyc2lvbiIpOworICAgICAgICAgICAgZXh0ZW5zaW9uLnNldEltcGxlbWVudGF0aW9uVmVyc2lvbih2ZXJzaW9uKTsKKyAgICAgICAgICAgIGV4dGVuc2lvbi5zZXRTcGVjaWZpY2F0aW9uVmVyc2lvbgorICAgICAgICAgICAgICAgIChhdHRyaWJ1dGVzLmdldFZhbHVlKG5hbWUgKyAiLVNwZWNpZmljYXRpb24tVmVyc2lvbiIpKTsKKyAgICAgICAgICAgIGV4dGVuc2lvbkxpc3QuYWRkKGV4dGVuc2lvbik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGV4dGVuc2lvbkxpc3Q7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2V0IG9mIDxjb2RlPkV4dGVuc2lvbjwvY29kZT4gb2JqZWN0cyByZXByZXNlbnRpbmcgb3B0aW9uYWwKKyAgICAgKiBwYWNrYWdlcyB0aGF0IGFyZSBidW5kbGVkIHdpdGggdGhlIGFwcGxpY2F0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUKKyAgICAgKiBzcGVjaWZpZWQgPGNvZGU+TWFuaWZlc3Q8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIG1hbmlmZXN0IE1hbmlmZXN0IHRvIGJlIHBhcnNlZAorICAgICAqCisgICAgICogQHJldHVybiBNYXAgb2YgYXZhaWxhYmxlIGV4dGVuc2lvbnMsIG9yIG51bGwgaWYgdGhlIHdlYiBhcHBsaWNhdGlvbgorICAgICAqIGRvZXMgbm90IGJ1bmRsZSBhbnkgZXh0ZW5zaW9ucworICAgICAqLworICAgIHByaXZhdGUgSGFzaE1hcCBnZXRBdmFpbGFibGVFeHRlbnNpb25zKE1hbmlmZXN0IG1hbmlmZXN0KSB7CisKKyAgICAgICAgQXR0cmlidXRlcyBhdHRyaWJ1dGVzID0gbWFuaWZlc3QuZ2V0TWFpbkF0dHJpYnV0ZXMoKTsKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJFeHRlbnNpb24tTmFtZSIpOworICAgICAgICBpZiAobmFtZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgSGFzaE1hcCBleHRlbnNpb25NYXAgPSBuZXcgSGFzaE1hcCgpOworCisgICAgICAgIEV4dGVuc2lvbiBleHRlbnNpb24gPSBuZXcgRXh0ZW5zaW9uKCk7CisgICAgICAgIGV4dGVuc2lvbi5zZXRFeHRlbnNpb25OYW1lKG5hbWUpOworICAgICAgICBleHRlbnNpb24uc2V0SW1wbGVtZW50YXRpb25VUkwoCisgICAgICAgICAgICBhdHRyaWJ1dGVzLmdldFZhbHVlKCJJbXBsZW1lbnRhdGlvbi1VUkwiKSk7CisgICAgICAgIGV4dGVuc2lvbi5zZXRJbXBsZW1lbnRhdGlvblZlbmRvcigKKyAgICAgICAgICAgIGF0dHJpYnV0ZXMuZ2V0VmFsdWUoIkltcGxlbWVudGF0aW9uLVZlbmRvciIpKTsKKyAgICAgICAgZXh0ZW5zaW9uLnNldEltcGxlbWVudGF0aW9uVmVuZG9ySWQoCisgICAgICAgICAgICBhdHRyaWJ1dGVzLmdldFZhbHVlKCJJbXBsZW1lbnRhdGlvbi1WZW5kb3ItSWQiKSk7CisgICAgICAgIGV4dGVuc2lvbi5zZXRJbXBsZW1lbnRhdGlvblZlcnNpb24oCisgICAgICAgICAgICBhdHRyaWJ1dGVzLmdldFZhbHVlKCJJbXBsZW1lbnRhdGlvbi1WZXJzaW9uIikpOworICAgICAgICBleHRlbnNpb24uc2V0U3BlY2lmaWNhdGlvblZlcnNpb24oCisgICAgICAgICAgICBhdHRyaWJ1dGVzLmdldFZhbHVlKCJTcGVjaWZpY2F0aW9uLVZlcnNpb24iKSk7CisKKyAgICAgICAgaWYgKCFleHRlbnNpb25NYXAuY29udGFpbnNLZXkoZXh0ZW5zaW9uLmdldFVuaXF1ZUlkKCkpKSB7CisgICAgICAgICAgICBleHRlbnNpb25NYXAucHV0KGV4dGVuc2lvbi5nZXRVbmlxdWVJZCgpLCBleHRlbnNpb24pOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGV4dGVuc2lvbk1hcDsKKyAgICB9CisgICAgCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9QYXJhbWV0ZXJNYXAuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL1BhcmFtZXRlck1hcC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzNWFiNDYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9QYXJhbWV0ZXJNYXAuamF2YQpAQCAtMCwwICsxLDIxMSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsOworCisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisKKy8qKgorICogRXh0ZW5kZWQgaW1wbGVtZW50YXRpb24gb2YgPHN0cm9uZz5IYXNoTWFwPC9zdHJvbmc+IHRoYXQgaW5jbHVkZXMgYQorICogPGNvZGU+bG9ja2VkPC9jb2RlPiBwcm9wZXJ0eS4gIFRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgdG8gc2FmZWx5IGV4cG9zZQorICogQ2F0YWxpbmEgaW50ZXJuYWwgcGFyYW1ldGVyIG1hcCBvYmplY3RzIHRvIHVzZXIgY2xhc3NlcyB3aXRob3V0IGhhdmluZworICogdG8gY2xvbmUgdGhlbSBpbiBvcmRlciB0byBhdm9pZCBtb2RpZmljYXRpb25zLiAgV2hlbiBmaXJzdCBjcmVhdGVkLCBhCisgKiA8Y29kZT5QYXJtYWV0ZXJNYXA8L2NvZGU+IGluc3RhbmNlIGlzIG5vdCBsb2NrZWQuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBQYXJhbWV0ZXJNYXAgZXh0ZW5kcyBIYXNoTWFwIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldywgZW1wdHkgbWFwIHdpdGggdGhlIGRlZmF1bHQgaW5pdGlhbCBjYXBhY2l0eSBhbmQKKyAgICAgKiBsb2FkIGZhY3Rvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgUGFyYW1ldGVyTWFwKCkgeworCisgICAgICAgIHN1cGVyKCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldywgZW1wdHkgbWFwIHdpdGggdGhlIHNwZWNpZmllZCBpbml0aWFsIGNhcGFjaXR5IGFuZAorICAgICAqIGRlZmF1bHQgbG9hZCBmYWN0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5pdGlhbENhcGFjaXR5IFRoZSBpbml0aWFsIGNhcGFjaXR5IG9mIHRoaXMgbWFwCisgICAgICovCisgICAgcHVibGljIFBhcmFtZXRlck1hcChpbnQgaW5pdGlhbENhcGFjaXR5KSB7CisKKyAgICAgICAgc3VwZXIoaW5pdGlhbENhcGFjaXR5KTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3LCBlbXB0eSBtYXAgd2l0aCB0aGUgc3BlY2lmaWVkIGluaXRpYWwgY2FwYWNpdHkgYW5kCisgICAgICogbG9hZCBmYWN0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5pdGlhbENhcGFjaXR5IFRoZSBpbml0aWFsIGNhcGFjaXR5IG9mIHRoaXMgbWFwCisgICAgICogQHBhcmFtIGxvYWRGYWN0b3IgVGhlIGxvYWQgZmFjdG9yIG9mIHRoaXMgbWFwCisgICAgICovCisgICAgcHVibGljIFBhcmFtZXRlck1hcChpbnQgaW5pdGlhbENhcGFjaXR5LCBmbG9hdCBsb2FkRmFjdG9yKSB7CisKKyAgICAgICAgc3VwZXIoaW5pdGlhbENhcGFjaXR5LCBsb2FkRmFjdG9yKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IG1hcCB3aXRoIHRoZSBzYW1lIG1hcHBpbmdzIGFzIHRoZSBnaXZlbiBtYXAuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwIE1hcCB3aG9zZSBjb250ZW50cyBhcmUgZHVwbGlhdGVkIGluIHRoZSBuZXcgbWFwCisgICAgICovCisgICAgcHVibGljIFBhcmFtZXRlck1hcChNYXAgbWFwKSB7CisKKyAgICAgICAgc3VwZXIobWFwKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBjdXJyZW50IGxvY2sgc3RhdGUgb2YgdGhpcyBwYXJhbWV0ZXIgbWFwLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBsb2NrZWQgPSBmYWxzZTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBsb2NrZWQgc3RhdGUgb2YgdGhpcyBwYXJhbWV0ZXIgbWFwLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzTG9ja2VkKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5sb2NrZWQpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGxvY2tlZCBzdGF0ZSBvZiB0aGlzIHBhcmFtZXRlciBtYXAuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbG9ja2VkIFRoZSBuZXcgbG9ja2VkIHN0YXRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TG9ja2VkKGJvb2xlYW4gbG9ja2VkKSB7CisKKyAgICAgICAgdGhpcy5sb2NrZWQgPSBsb2NrZWQ7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSBzdHJpbmcgbWFuYWdlciBmb3IgdGhpcyBwYWNrYWdlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ01hbmFnZXIgc20gPQorICAgICAgICBTdHJpbmdNYW5hZ2VyLmdldE1hbmFnZXIoIm9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbCIpOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYWxsIG1hcHBpbmdzIGZyb20gdGhpcyBtYXAuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGlzIG1hcCBpcyBjdXJyZW50bHkgbG9ja2VkCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisKKyAgICAgICAgaWYgKGxvY2tlZCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJwYXJhbWV0ZXJNYXAubG9ja2VkIikpOworICAgICAgICBzdXBlci5jbGVhcigpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBc3NvY2lhdGUgdGhlIHNwZWNpZmllZCB2YWx1ZSB3aXRoIHRoZSBzcGVjaWZpZWQga2V5IGluIHRoaXMgbWFwLiAgSWYKKyAgICAgKiB0aGUgbWFwIHByZXZpb3VzbHkgY29udGFpbmVkIGEgbWFwcGluZyBmb3IgdGhpcyBrZXksIHRoZSBvbGQgdmFsdWUgaXMKKyAgICAgKiByZXBsYWNlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBrZXkgS2V5IHdpdGggd2hpY2ggdGhlIHNwZWNpZmllZCB2YWx1ZSBpcyB0byBiZSBhc3NvY2lhdGVkCisgICAgICogQHBhcmFtIHZhbHVlIFZhbHVlIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGtleQorICAgICAqCisgICAgICogQHJldHVybiBUaGUgcHJldmlvdXMgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQga2V5LCBvcgorICAgICAqICA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSB3YXMgbm8gbWFwcGluZyBmb3Iga2V5CisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGlzIG1hcCBpcyBjdXJyZW50bHkgbG9ja2VkCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBwdXQoT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKSB7CisKKyAgICAgICAgaWYgKGxvY2tlZCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJwYXJhbWV0ZXJNYXAubG9ja2VkIikpOworICAgICAgICByZXR1cm4gKHN1cGVyLnB1dChrZXksIHZhbHVlKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvcHkgYWxsIG9mIHRoZSBtYXBwaW5ncyBmcm9tIHRoZSBzcGVjaWZpZWQgbWFwIHRvIHRoaXMgb25lLiAgVGhlc2UKKyAgICAgKiBtYXBwaW5ncyByZXBsYWNlIGFueSBtYXBwaW5ncyB0aGF0IHRoaXMgbWFwIGhhZCBmb3IgYW55IG9mIHRoZSBrZXlzCisgICAgICogY3VycmVudGx5IGluIHRoZSBzcGVjaWZpZWQgTWFwLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcCBNYXBwaW5ncyB0byBiZSBzdG9yZWQgaW50byB0aGlzIG1hcAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhpcyBtYXAgaXMgY3VycmVudGx5IGxvY2tlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHB1dEFsbChNYXAgbWFwKSB7CisKKyAgICAgICAgaWYgKGxvY2tlZCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJwYXJhbWV0ZXJNYXAubG9ja2VkIikpOworICAgICAgICBzdXBlci5wdXRBbGwobWFwKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBtYXBwaW5nIGZvciB0aGlzIGtleSBmcm9tIHRoZSBtYXAgaWYgcHJlc2VudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBrZXkgS2V5IHdob3NlIG1hcHBpbmcgaXMgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSBtYXAKKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIHByZXZpb3VzIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGtleSwgb3IKKyAgICAgKiAgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgd2FzIG5vIG1hcHBpbmcgZm9yIHRoYXQga2V5CisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGlzIG1hcCBpcyBjdXJyZW50bHkgbG9ja2VkCisgICAgICovCisgICAgcHVibGljIE9iamVjdCByZW1vdmUoT2JqZWN0IGtleSkgeworCisgICAgICAgIGlmIChsb2NrZWQpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygicGFyYW1ldGVyTWFwLmxvY2tlZCIpKTsKKyAgICAgICAgcmV0dXJuIChzdXBlci5yZW1vdmUoa2V5KSk7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvUHJvY2Vzc0Vudmlyb25tZW50LmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9Qcm9jZXNzRW52aXJvbm1lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmVlYjMxCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvUHJvY2Vzc0Vudmlyb25tZW50LmphdmEKQEAgLTAsMCArMSwzMTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWw7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CisKKworCisvKioKKyAqIEVuY2Fwc3VsYXRlcyB0aGUgUHJvY2VzcyBlbnZpcm9ubWVudCBhbmQgcnVsZXMgdG8gZGVyaXZlCisgKiB0aGF0IGVudmlyb25tZW50IGZyb20gdGhlIHNlcnZsZXQgY29udGFpbmVyIGFuZCByZXF1ZXN0IGluZm9ybWF0aW9uLgorICogQGF1dGhvciAgIE1hcnRpbiBEZW5nbGVyIFtyb290QG1hcnRpbmRlbmdsZXIuY29tXQorICogQHZlcnNpb24gICRSZXZpc2lvbiQsICREYXRlJAorICogQHNpbmNlICAgIFRvbWNhdCA0LjAKKyAqLworcHVibGljIGNsYXNzIFByb2Nlc3NFbnZpcm9ubWVudCB7CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGxvZz0KKyAgICAgICAgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeS5nZXRMb2coIFByb2Nlc3NFbnZpcm9ubWVudC5jbGFzcyApOworICAgIAorICAgIC8qKiBjb250ZXh0IG9mIHRoZSBlbmNsb3Npbmcgc2VydmxldCAqLworICAgIHByaXZhdGUgU2VydmxldENvbnRleHQgY29udGV4dCA9IG51bGw7CisKKyAgICAvKiogcmVhbCBmaWxlIHN5c3RlbSBkaXJlY3Rvcnkgb2YgdGhlIGVuY2xvc2luZyBzZXJ2bGV0J3Mgd2ViIGFwcCAqLworICAgIHByaXZhdGUgU3RyaW5nIHdlYkFwcFJvb3REaXIgPSBudWxsOworCisgICAgLyoqIGNvbnRleHQgcGF0aCBvZiBlbmNsb3Npbmcgc2VydmxldCAqLworICAgIHByaXZhdGUgU3RyaW5nIGNvbnRleHRQYXRoID0gbnVsbDsKKworICAgIC8qKiBwYXRoSW5mbyBmb3IgdGhlIGN1cnJlbnQgcmVxdWVzdCAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgcGF0aEluZm8gPSBudWxsOworCisgICAgLyoqIHNlcnZsZXQgVVJJIG9mIHRoZSBlbmNsb3Npbmcgc2VydmxldCAqLworICAgIHByaXZhdGUgU3RyaW5nIHNlcnZsZXRQYXRoID0gbnVsbDsKKworICAgIC8qKiBkZXJpdmVkIHByb2Nlc3MgZW52aXJvbm1lbnQgKi8KKyAgICBwcm90ZWN0ZWQgSGFzaHRhYmxlIGVudiA9IG51bGw7CisKKyAgICAvKiogY29tbWFuZCB0byBiZSBpbnZva2VkICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBjb21tYW5kID0gbnVsbDsKKworICAgIC8qKiB3aGV0aGVyIG9yIG5vdCB0aGlzIG9iamVjdCBpcyB2YWxpZCBvciBub3QgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZCA9IGZhbHNlOworCisgICAgLyoqIHRoZSBkZWJ1Z2dpbmcgZGV0YWlsIGxldmVsIGZvciB0aGlzIGluc3RhbmNlLiAqLworICAgIHByb3RlY3RlZCBpbnQgZGVidWcgPSAwOworCisgICAgLyoqIHByb2Nlc3MnIGRlc2lyZWQgd29ya2luZyBkaXJlY3RvcnkgKi8KKyAgICBwcm90ZWN0ZWQgRmlsZSB3b3JraW5nRGlyZWN0b3J5ID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIFByb2Nlc3NFbnZpcm9ubWVudCBhbmQgZGVyaXZlcyB0aGUgbmVjZXNzYXJ5IGVudmlyb25tZW50LAorICAgICAqIHdvcmtpbmcgZGlyZWN0b3J5LCBjb21tYW5kLCBldGMuCisgICAgICogQHBhcmFtICByZXEgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IGZvciBpbmZvcm1hdGlvbiBwcm92aWRlZCBieQorICAgICAqICAgICAgICAgICAgICAgICAgIHRoZSBTZXJ2bGV0IEFQSQorICAgICAqIEBwYXJhbSAgY29udGV4dCAgIFNlcnZsZXRDb250ZXh0IGZvciBpbmZvcm1hdGlvbiBwcm92aWRlZCBieQorICAgICAqICAgICAgICAgICAgICAgICAgIHRoZSBTZXJ2bGV0IEFQSQorICAgICAqLworICAgIHB1YmxpYyBQcm9jZXNzRW52aXJvbm1lbnQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwKKyAgICAgICAgU2VydmxldENvbnRleHQgY29udGV4dCkgeworICAgICAgICB0aGlzKHJlcSwgY29udGV4dCwgMCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgUHJvY2Vzc0Vudmlyb25tZW50IGFuZCBkZXJpdmVzIHRoZSBuZWNlc3NhcnkgZW52aXJvbm1lbnQsCisgICAgICogd29ya2luZyBkaXJlY3RvcnksIGNvbW1hbmQsIGV0Yy4KKyAgICAgKiBAcGFyYW0gIHJlcSAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgZm9yIGluZm9ybWF0aW9uIHByb3ZpZGVkIGJ5CisgICAgICogICAgICAgICAgICAgICAgICAgdGhlIFNlcnZsZXQgQVBJCisgICAgICogQHBhcmFtICBjb250ZXh0ICAgU2VydmxldENvbnRleHQgZm9yIGluZm9ybWF0aW9uIHByb3ZpZGVkIGJ5CisgICAgICogICAgICAgICAgICAgICAgICAgdGhlIFNlcnZsZXQgQVBJCisgICAgICogQHBhcmFtICBkZWJ1ZyAgICAgaW50IGRlYnVnIGxldmVsICgwID09IG5vbmUsIDQgPT0gbWVkaXVtLCA2ID09IGxvdHMpCisgICAgICovCisgICAgcHVibGljIFByb2Nlc3NFbnZpcm9ubWVudChIdHRwU2VydmxldFJlcXVlc3QgcmVxLAorICAgICAgICBTZXJ2bGV0Q29udGV4dCBjb250ZXh0LCBpbnQgZGVidWcpIHsKKyAgICAgICAgICAgIHRoaXMuZGVidWcgPSBkZWJ1ZzsKKyAgICAgICAgICAgIHNldHVwRnJvbUNvbnRleHQoY29udGV4dCk7CisgICAgICAgICAgICBzZXR1cEZyb21SZXF1ZXN0KHJlcSk7CisgICAgICAgICAgICB0aGlzLnZhbGlkID0gZGVyaXZlUHJvY2Vzc0Vudmlyb25tZW50KHJlcSk7CisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIAorICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIigpIGN0b3IsIGRlYnVnIGxldmVsICIgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWcpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVXNlcyB0aGUgU2VydmxldENvbnRleHQgdG8gc2V0IHNvbWUgcHJvY2VzcyB2YXJpYWJsZXMKKyAgICAgKiBAcGFyYW0gIGNvbnRleHQgICBTZXJ2bGV0Q29udGV4dCBmb3IgaW5mb3JtYXRpb24gcHJvdmlkZWQgYnkKKyAgICAgKiAgICAgICAgICAgICAgICAgICB0aGUgU2VydmxldCBBUEkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXR1cEZyb21Db250ZXh0KFNlcnZsZXRDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsKKyAgICAgICAgdGhpcy53ZWJBcHBSb290RGlyID0gY29udGV4dC5nZXRSZWFsUGF0aCgiLyIpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVXNlcyB0aGUgSHR0cFNlcnZsZXRSZXF1ZXN0IHRvIHNldCBtb3N0IHByb2Nlc3MgdmFyaWFibGVzCisgICAgICogQHBhcmFtICByZXEgICBIdHRwU2VydmxldFJlcXVlc3QgZm9yIGluZm9ybWF0aW9uIHByb3ZpZGVkIGJ5CisgICAgICogICAgICAgICAgICAgICB0aGUgU2VydmxldCBBUEkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXR1cEZyb21SZXF1ZXN0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEpIHsKKyAgICAgICAgdGhpcy5jb250ZXh0UGF0aCA9IHJlcS5nZXRDb250ZXh0UGF0aCgpOworICAgICAgICB0aGlzLnBhdGhJbmZvID0gcmVxLmdldFBhdGhJbmZvKCk7CisgICAgICAgIHRoaXMuc2VydmxldFBhdGggPSByZXEuZ2V0U2VydmxldFBhdGgoKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFByaW50IGltcG9ydGFudCBwcm9jZXNzIGVudmlyb25tZW50IGluZm9ybWF0aW9uIGluIGFuCisgICAgICogZWFzeS10by1yZWFkIEhUTUwgdGFibGUKKyAgICAgKiBAcmV0dXJuICBIVE1MIHN0cmluZyBjb250YWluaW5nIHByb2Nlc3MgZW52aXJvbm1lbnQgaW5mbworICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgc2IuYXBwZW5kKCI8VEFCTEUgYm9yZGVyPTI+Iik7CisgICAgICAgIHNiLmFwcGVuZCgiPHRyPjx0aCBjb2xzcGFuPTIgYmdjb2xvcj1ncmV5PiIpOworICAgICAgICBzYi5hcHBlbmQoIlByb2Nlc3NFbnZpcm9ubWVudCBJbmZvPC90aD48L3RyPiIpOworICAgICAgICBzYi5hcHBlbmQoIjx0cj48dGQ+RGVidWcgTGV2ZWw8L3RkPjx0ZD4iKTsKKyAgICAgICAgc2IuYXBwZW5kKGRlYnVnKTsKKyAgICAgICAgc2IuYXBwZW5kKCI8L3RkPjwvdHI+Iik7CisgICAgICAgIHNiLmFwcGVuZCgiPHRyPjx0ZD5WYWxpZGl0eTo8L3RkPjx0ZD4iKTsKKyAgICAgICAgc2IuYXBwZW5kKGlzVmFsaWQoKSk7CisgICAgICAgIHNiLmFwcGVuZCgiPC90ZD48L3RyPiIpOworICAgICAgICBpZiAoaXNWYWxpZCgpKSB7CisgICAgICAgICAgICBFbnVtZXJhdGlvbiBlbnZrID0gZW52LmtleXMoKTsKKyAgICAgICAgICAgIHdoaWxlIChlbnZrLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHMgPSAoU3RyaW5nKWVudmsubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIjx0cj48dGQ+Iik7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKHMpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiPC90ZD48dGQ+Iik7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGJsYW5rc1RvU3RyaW5nKChTdHJpbmcpZW52LmdldChzKSwKKyAgICAgICAgICAgICAgICAgICAgIlt3aWxsIGJlIHNldCB0byBibGFua10iKSk7CisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiPC90ZD48L3RyPiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHNiLmFwcGVuZCgiPHRyPjx0ZCBjb2xzcGFuPTI+PEhSPjwvdGQ+PC90cj4iKTsKKyAgICAgICAgc2IuYXBwZW5kKCI8dHI+PHRkPkRlcml2ZWQgQ29tbWFuZDwvdGQ+PHRkPiIpOworICAgICAgICBzYi5hcHBlbmQobnVsbHNUb0JsYW5rcyhjb21tYW5kKSk7CisgICAgICAgIHNiLmFwcGVuZCgiPC90ZD48L3RyPiIpOworICAgICAgICBzYi5hcHBlbmQoIjx0cj48dGQ+V29ya2luZyBEaXJlY3Rvcnk8L3RkPjx0ZD4iKTsKKyAgICAgICAgaWYgKHdvcmtpbmdEaXJlY3RvcnkgIT0gbnVsbCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKHdvcmtpbmdEaXJlY3RvcnkudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgc2IuYXBwZW5kKCI8L3RkPjwvdHI+Iik7CisgICAgICAgIHNiLmFwcGVuZCgiPC9UQUJMRT48cD5lbmQuIik7CisgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0cyBkZXJpdmVkIGNvbW1hbmQgc3RyaW5nCisgICAgICogQHJldHVybiAgY29tbWFuZCBzdHJpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbW1hbmQoKSB7CisgICAgICAgIHJldHVybiBjb21tYW5kOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgZGVzaXJlZCBjb21tYW5kIHN0cmluZworICAgICAqIEBwYXJhbSAgIGNvbW1hbmQgU3RyaW5nIGNvbW1hbmQgYXMgZGVzaXJlZAorICAgICAqIEByZXR1cm4gIGNvbW1hbmQgc3RyaW5nCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBzZXRDb21tYW5kKFN0cmluZyBjb21tYW5kKSB7CisgICAgICAgIHJldHVybiBjb21tYW5kOworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0cyB0aGlzIHByb2Nlc3MnIGRlcml2ZWQgd29ya2luZyBkaXJlY3RvcnkKKyAgICAgKiBAcmV0dXJuICB3b3JraW5nIGRpcmVjdG9yeQorICAgICAqLworICAgIHB1YmxpYyBGaWxlIGdldFdvcmtpbmdEaXJlY3RvcnkoKSB7CisgICAgICAgIHJldHVybiB3b3JraW5nRGlyZWN0b3J5OworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0cyBwcm9jZXNzJyBlbnZpcm9ubWVudAorICAgICAqIEByZXR1cm4gICBwcm9jZXNzJyBlbnZpcm9ubWVudAorICAgICAqLworICAgIHB1YmxpYyBIYXNodGFibGUgZ2V0RW52aXJvbm1lbnQoKSB7CisgICAgICAgIHJldHVybiBlbnY7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXRzIHByb2Nlc3MnIGVudmlyb25tZW50CisgICAgICogQHBhcmFtICAgIGVudiBwcm9jZXNzJyBlbnZpcm9ubWVudAorICAgICAqIEByZXR1cm4gICBIYXNodGFibGUgdG8gd2hpY2ggdGhlIHByb2Nlc3MnIGVudmlyb25tZW50IHdhcyBzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgSGFzaHRhYmxlIHNldEVudmlyb25tZW50KEhhc2h0YWJsZSBlbnYpIHsKKyAgICAgICAgdGhpcy5lbnYgPSBlbnY7CisgICAgICAgIHJldHVybiB0aGlzLmVudjsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdldHMgdmFsaWRpdHkgc3RhdHVzCisgICAgICogQHJldHVybiAgIHRydWUgaWYgdGhpcyBlbnZpcm9ubWVudCBpcyB2YWxpZCwgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpIHsKKyAgICAgICAgcmV0dXJuIHZhbGlkOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29udmVydHMgbnVsbCBzdHJpbmdzIHRvIGJsYW5rIHN0cmluZ3MgKCIiKQorICAgICAqIEBwYXJhbSAgICBzIHN0cmluZyB0byBiZSBjb252ZXJ0ZWQgaWYgbmVjZXNzYXJ5CisgICAgICogQHJldHVybiAgIGEgbm9uLW51bGwgc3RyaW5nLCBlaXRoZXIgdGhlIG9yaWdpbmFsIG9yIHRoZSBlbXB0eSBzdHJpbmcKKyAgICAgKiAgICAgICAgICAgKCIiKSBpZiB0aGUgb3JpZ2luYWwgd2FzIDxjb2RlPm51bGw8L2NvZGU+CisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBudWxsc1RvQmxhbmtzKFN0cmluZyBzKSB7CisgICAgICAgIHJldHVybiBudWxsc1RvU3RyaW5nKHMsICIiKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvbnZlcnRzIG51bGwgc3RyaW5ncyB0byBhbm90aGVyIHN0cmluZworICAgICAqIEBwYXJhbSAgICBjb3VsZEJlTnVsbCBzdHJpbmcgdG8gYmUgY29udmVydGVkIGlmIG5lY2Vzc2FyeQorICAgICAqIEBwYXJhbSAgICBzdWJGb3JOdWxscyBzdHJpbmcgdG8gcmV0dXJuIGluc3RlYWQgb2YgYSBudWxsIHN0cmluZworICAgICAqIEByZXR1cm4gICBhIG5vbi1udWxsIHN0cmluZywgZWl0aGVyIHRoZSBvcmlnaW5hbCBvciB0aGUgc3Vic3RpdHV0ZQorICAgICAqICAgICAgICAgICBzdHJpbmcgaWYgdGhlIG9yaWdpbmFsIHdhcyA8Y29kZT5udWxsPC9jb2RlPgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgbnVsbHNUb1N0cmluZyhTdHJpbmcgY291bGRCZU51bGwsIFN0cmluZyBzdWJGb3JOdWxscykgeworICAgICAgICByZXR1cm4gKGNvdWxkQmVOdWxsID09IG51bGwgPyBzdWJGb3JOdWxscyA6IGNvdWxkQmVOdWxsKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvbnZlcnRzIGJsYW5rIHN0cmluZ3MgdG8gYW5vdGhlciBzdHJpbmcKKyAgICAgKiBAcGFyYW0gICAgY291bGRCZUJsYW5rIHN0cmluZyB0byBiZSBjb252ZXJ0ZWQgaWYgbmVjZXNzYXJ5CisgICAgICogQHBhcmFtICAgIHN1YkZvckJsYW5rcyBzdHJpbmcgdG8gcmV0dXJuIGluc3RlYWQgb2YgYSBibGFuayBzdHJpbmcKKyAgICAgKiBAcmV0dXJuICAgYSBub24tbnVsbCBzdHJpbmcsIGVpdGhlciB0aGUgb3JpZ2luYWwgb3IgdGhlIHN1YnN0aXR1dGUKKyAgICAgKiAgICAgICAgICAgc3RyaW5nIGlmIHRoZSBvcmlnaW5hbCB3YXMgPGNvZGU+bnVsbDwvY29kZT4gb3IgZW1wdHkgKCIiKQorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgYmxhbmtzVG9TdHJpbmcoU3RyaW5nIGNvdWxkQmVCbGFuaywKKyAgICAgICAgU3RyaW5nIHN1YkZvckJsYW5rcykgeworICAgICAgICAgICAgcmV0dXJuICgoIiIuZXF1YWxzKGNvdWxkQmVCbGFuaykgfHwgY291bGRCZUJsYW5rID09IG51bGwpID8KKyAgICAgICAgICAgICAgICBzdWJGb3JCbGFua3MgOiBjb3VsZEJlQmxhbmspOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyB0aGUgUHJvY2VzcyBlbnZpcm9ubWVudCB0byBiZSBzdXBwbGllZCB0byB0aGUgaW52b2tlZAorICAgICAqIHByb2Nlc3MuICBEZWZpbmVzIGFuIGVudmlyb25tZW50IG5vIGVudmlyb25tZW50IHZhcmlhYmxlcy4KKyAgICAgKiA8cD4KKyAgICAgKiBTaG91bGQgYmUgb3ZlcnJpZGVuIGJ5IHN1YmNsYXNzZXMgdG8gcGVyZm9ybSB1c2VmdWwgc2V0dXAuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtICAgIHJlcSByZXF1ZXN0IGFzc29jaWF0ZWQgd2l0aCB0aGUKKyAgICAgKiAgICAgICAgICAgUHJvY2VzcycgaW52b2NhdGlvbgorICAgICAqIEByZXR1cm4gICB0cnVlIGlmIGVudmlyb25tZW50IHdhcyBzZXQgT0ssIGZhbHNlIGlmIHRoZXJlIHdhcyBhIHByb2JsZW0KKyAgICAgKiAgICAgICAgICAgYW5kIG5vIGVudmlyb25tZW50IHdhcyBzZXQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBkZXJpdmVQcm9jZXNzRW52aXJvbm1lbnQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkgeworCisgICAgICAgIEhhc2h0YWJsZSBlbnZwID0gbmV3IEhhc2h0YWJsZSgpOworICAgICAgICBjb21tYW5kID0gZ2V0Q29tbWFuZCgpOworICAgICAgICBpZiAoY29tbWFuZCAhPSBudWxsKSB7CisgICAgICAgICAgICB3b3JraW5nRGlyZWN0b3J5ID0gbmV3CisgICAgICAgICAgICAgICAgRmlsZShjb21tYW5kLnN1YnN0cmluZygwLAorICAgICAgICAgICAgICAgIGNvbW1hbmQubGFzdEluZGV4T2YoRmlsZS5zZXBhcmF0b3IpKSk7CisgICAgICAgICAgICAgICAgZW52cC5wdXQoIlhfVE9NQ0FUX0NPTU1BTkRfUEFUSCIsIGNvbW1hbmQpOyAvL2ZvciBraWNrcworICAgICAgICB9CisgICAgICAgIHRoaXMuZW52ID0gZW52cDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGUgd2ViIGFwcGxpY2F0aW9uIHRvIHdoaWNoIHRoaXMgcHJvY2Vzc1wKKyAgICAgKiBiZWxvbmdzCisgICAgICogQHJldHVybiAgcm9vdCBkaXJlY3RvcnkKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFdlYkFwcFJvb3REaXIoKSB7CisgICAgICAgIHJldHVybiB3ZWJBcHBSb290RGlyOworICAgIH0KKworCisgICAgcHVibGljIFN0cmluZyBnZXRDb250ZXh0UGF0aCgpeworICAgICAgICAgICAgcmV0dXJuIGNvbnRleHRQYXRoOworICAgICAgICB9CisKKworICAgIHB1YmxpYyBTZXJ2bGV0Q29udGV4dCBnZXRDb250ZXh0KCl7CisgICAgICAgICAgICByZXR1cm4gY29udGV4dDsKKyAgICAgICAgfQorCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFNlcnZsZXRQYXRoKCl7CisgICAgICAgICAgICByZXR1cm4gc2VydmxldFBhdGg7CisgICAgICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL1Byb2Nlc3NIZWxwZXIuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL1Byb2Nlc3NIZWxwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWI1ZDhmCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvUHJvY2Vzc0hlbHBlci5qYXZhCkBAIC0wLDAgKzEsNDk2IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKKworLyoqCisgICAgICogRW5jYXBzdWxhdGVzIHRoZSBrbm93bGVkZ2Ugb2YgaG93IHRvIHJ1biBhIENHSSBzY3JpcHQsIGdpdmVuIHRoZQorICAgICAqIHNjcmlwdCdzIGRlc2lyZWQgZW52aXJvbm1lbnQgYW5kIChvcHRpb25hbGx5KSBpbnB1dC9vdXRwdXQgc3RyZWFtcworICAgICAqCisgICAgICogPHA+CisgICAgICoKKyAgICAgKiBFeHBvc2VzIGEgPGNvZGU+cnVuPC9jb2RlPiBtZXRob2QgdXNlZCB0byBhY3R1YWxseSBpbnZva2UgdGhlCisgICAgICogQ0dJLgorICAgICAqCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqCisgICAgICogVGhlIENHSSBlbnZpcm9ubWVudCBhbmQgc2V0dGluZ3MgYXJlIGRlcml2ZWQgZnJvbSB0aGUgaW5mb3JtYXRpb24KKyAgICAgKiBwYXNzZWQgdG8gdGhlIGNvbnN0dWN0b3IuCisgICAgICoKKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICoKKyAgICAgKiBUaGUgaW5wdXQgYW5kIG91dHB1dCBzdHJlYW1zIGNhbiBiZSBzZXQgYnkgdGhlIDxjb2RlPnNldElucHV0PC9jb2RlPgorICAgICAqIGFuZCA8Y29kZT5zZXRSZXNwb25zZTwvY29kZT4gbWV0aG9kcywgcmVzcGVjdGl2ZWx5LgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBhdXRob3IgICAgTWFydGluIERlbmdsZXIgW3Jvb3RAbWFydGluZGVuZ2xlci5jb21dCisgICAgICogQHZlcnNpb24gICAkUmV2aXNpb24kLCAkRGF0ZSQKKyAgICAgKi8KK3B1YmxpYyBjbGFzcyBQcm9jZXNzSGVscGVyIHsKKworICAgIHByaXZhdGUgc3RhdGljIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZyBsb2c9CisgICAgICAgIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3RvcnkuZ2V0TG9nKCBQcm9jZXNzSGVscGVyLmNsYXNzICk7CisgICAgCisgICAgLyoqIHNjcmlwdC9jb21tYW5kIHRvIGJlIGV4ZWN1dGVkICovCisgICAgcHJpdmF0ZSBTdHJpbmcgY29tbWFuZCA9IG51bGw7CisKKyAgICAvKiogZW52aXJvbm1lbnQgdXNlZCB3aGVuIGludm9raW5nIHRoZSBjZ2kgc2NyaXB0ICovCisgICAgcHJpdmF0ZSBIYXNodGFibGUgZW52ID0gbnVsbDsKKworICAgIC8qKiB3b3JraW5nIGRpcmVjdG9yeSB1c2VkIHdoZW4gaW52b2tpbmcgdGhlIGNnaSBzY3JpcHQgKi8KKyAgICBwcml2YXRlIEZpbGUgd2QgPSBudWxsOworCisgICAgLyoqIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gYmUgcGFzc2VkIHRvIHRoZSBpbnZva2VkIHNjcmlwdCAqLworICAgIHByaXZhdGUgSGFzaHRhYmxlIHBhcmFtcyA9IG51bGw7CisKKyAgICAvKiogc3RkaW4gdG8gYmUgcGFzc2VkIHRvIGNnaSBzY3JpcHQgKi8KKyAgICBwcml2YXRlIElucHV0U3RyZWFtIHN0ZGluID0gbnVsbDsKKworICAgIC8qKiByZXNwb25zZSBvYmplY3QgdXNlZCB0byBzZXQgaGVhZGVycyAmIGdldCBvdXRwdXQgc3RyZWFtICovCisgICAgcHJpdmF0ZSBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlID0gbnVsbDsKKworICAgIC8qKiBib29sZWFuIHRyYWNraW5nIHdoZXRoZXIgdGhpcyBvYmplY3QgaGFzIGVub3VnaCBpbmZvIHRvIHJ1bigpICovCisgICAgcHJpdmF0ZSBib29sZWFuIHJlYWR5VG9SdW4gPSBmYWxzZTsKKworICAgIC8qKiB0aGUgZGVidWdnaW5nIGRldGFpbCBsZXZlbCBmb3IgdGhpcyBpbnN0YW5jZS4gKi8KKyAgICBwcml2YXRlIGludCBkZWJ1ZyA9IDA7CisKKyAgICAvKiogdGhlIHRpbWUgaW4gbXMgdG8gd2FpdCBmb3IgdGhlIGNsaWVudCB0byBzZW5kIHVzIENHSSBpbnB1dCBkYXRhICovCisgICAgcHJpdmF0ZSBpbnQgaUNsaWVudElucHV0VGltZW91dDsKKworICAgIC8qKgorICAgICAqICBDcmVhdGVzIGEgUHJvY2Vzc0hlbHBlciBhbmQgaW5pdGlhbGl6ZXMgaXRzIGVudmlyb25tZW50LCB3b3JraW5nCisgICAgICogIGRpcmVjdG9yeSwgYW5kIHF1ZXJ5IHBhcmFtZXRlcnMuCisgICAgICogIDxCUj4KKyAgICAgKiAgSW5wdXQvb3V0cHV0IHN0cmVhbXMgKG9wdGlvbmFsKSBhcmUgc2V0IHVzaW5nIHRoZQorICAgICAqICA8Y29kZT5zZXRJbnB1dDwvY29kZT4gYW5kIDxjb2RlPnNldFJlc3BvbnNlPC9jb2RlPiBtZXRob2RzLAorICAgICAqICByZXNwZWN0aXZlbHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gIGNvbW1hbmQgIHN0cmluZyBmdWxsIHBhdGggdG8gY29tbWFuZCB0byBiZSBleGVjdXRlZAorICAgICAqIEBwYXJhbSAgZW52ICAgICAgSGFzaHRhYmxlIHdpdGggdGhlIGRlc2lyZWQgc2NyaXB0IGVudmlyb25tZW50CisgICAgICogQHBhcmFtICB3ZCAgICAgICBGaWxlIHdpdGggdGhlIHNjcmlwdCdzIGRlc2lyZWQgd29ya2luZyBkaXJlY3RvcnkKKyAgICAgKiBAcGFyYW0gIHBhcmFtcyAgIEhhc2h0YWJsZSB3aXRoIHRoZSBzY3JpcHQncyBxdWVyeSBwYXJhbWV0ZXJzCisgICAgICovCisgICAgcHVibGljIFByb2Nlc3NIZWxwZXIoCisgICAgICAgIFN0cmluZyBjb21tYW5kLAorICAgICAgICBIYXNodGFibGUgZW52LAorICAgICAgICBGaWxlIHdkLAorICAgICAgICBIYXNodGFibGUgcGFyYW1zKSB7CisgICAgICAgIHRoaXMuY29tbWFuZCA9IGNvbW1hbmQ7CisgICAgICAgIHRoaXMuZW52ID0gZW52OworICAgICAgICB0aGlzLndkID0gd2Q7CisgICAgICAgIHRoaXMucGFyYW1zID0gcGFyYW1zOworICAgICAgICB1cGRhdGVSZWFkeVN0YXR1cygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrcyAmIHNldHMgcmVhZHkgc3RhdHVzCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlUmVhZHlTdGF0dXMoKSB7CisgICAgICAgIGlmIChjb21tYW5kICE9IG51bGwKKyAgICAgICAgICAgICYmIGVudiAhPSBudWxsCisgICAgICAgICAgICAmJiB3ZCAhPSBudWxsCisgICAgICAgICAgICAmJiBwYXJhbXMgIT0gbnVsbAorICAgICAgICAgICAgJiYgcmVzcG9uc2UgIT0gbnVsbCkgeworICAgICAgICAgICAgcmVhZHlUb1J1biA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZWFkeVRvUnVuID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHJlYWR5IHN0YXR1cworICAgICAqCisgICAgICogQHJldHVybiAgIGZhbHNlIGlmIG5vdCByZWFkeSAoPGNvZGU+cnVuPC9jb2RlPiB3aWxsIHRocm93CisgICAgICogICAgICAgICAgIGFuIGV4Y2VwdGlvbiksIHRydWUgaWYgcmVhZHkKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JlYWR5KCkgeworICAgICAgICByZXR1cm4gcmVhZHlUb1J1bjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIEh0dHBTZXJ2bGV0UmVzcG9uc2Ugb2JqZWN0IHVzZWQgdG8gc2V0IGhlYWRlcnMgYW5kIHNlbmQKKyAgICAgKiBvdXRwdXQgdG8KKyAgICAgKgorICAgICAqIEBwYXJhbSAgcmVzcG9uc2UgICBIdHRwU2VydmxldFJlc3BvbnNlIHRvIGJlIHVzZWQKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlc3BvbnNlKEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHsKKyAgICAgICAgdGhpcy5yZXNwb25zZSA9IHJlc3BvbnNlOworICAgICAgICB1cGRhdGVSZWFkeVN0YXR1cygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgc3RhbmRhcmQgaW5wdXQgdG8gYmUgcGFzc2VkIG9uIHRvIHRoZSBpbnZva2VkIGNnaSBzY3JpcHQKKyAgICAgKgorICAgICAqIEBwYXJhbSAgc3RkaW4gICBJbnB1dFN0cmVhbSB0byBiZSB1c2VkCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJbnB1dChJbnB1dFN0cmVhbSBzdGRpbikgeworICAgICAgICB0aGlzLnN0ZGluID0gc3RkaW47CisgICAgICAgIHVwZGF0ZVJlYWR5U3RhdHVzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVydHMgYSBIYXNodGFibGUgdG8gYSBTdHJpbmcgYXJyYXkgYnkgY29udmVydGluZyBlYWNoCisgICAgICoga2V5L3ZhbHVlIHBhaXIgaW4gdGhlIEhhc2h0YWJsZSB0byBhIFN0cmluZyBpbiB0aGUgZm9ybQorICAgICAqICJrZXk9dmFsdWUiIChoYXNoa2V5ICsgIj0iICsgaGFzaC5nZXQoaGFzaGtleSkudG9TdHJpbmcoKSkKKyAgICAgKgorICAgICAqIEBwYXJhbSAgaCAgIEhhc2h0YWJsZSB0byBjb252ZXJ0CisgICAgICoKKyAgICAgKiBAcmV0dXJuICAgICBjb252ZXJ0ZWQgc3RyaW5nIGFycmF5CisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uICBOdWxsUG9pbnRlckV4Y2VwdGlvbiAgIGlmIGEgaGFzaCBrZXkgaGFzIGEgbnVsbCB2YWx1ZQorICAgICAqCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmdbXSBoYXNoVG9TdHJpbmdBcnJheShIYXNodGFibGUgaCkKKyAgICAgICAgdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIHsKKyAgICAgICAgVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIEVudW1lcmF0aW9uIGUgPSBoLmtleXMoKTsKKyAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBrID0gZS5uZXh0RWxlbWVudCgpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICB2LmFkZChrICsgIj0iICsgaC5nZXQoaykpOworICAgICAgICB9CisgICAgICAgIFN0cmluZ1tdIHN0ckFyciA9IG5ldyBTdHJpbmdbdi5zaXplKCldOworICAgICAgICB2LmNvcHlJbnRvKHN0ckFycik7CisgICAgICAgIHJldHVybiBzdHJBcnI7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXhlY3V0ZXMgYSBwcm9jZXNzIHNjcmlwdCB3aXRoIHRoZSBkZXNpcmVkIGVudmlyb25tZW50LCBjdXJyZW50IHdvcmtpbmcKKyAgICAgKiBkaXJlY3RvcnksIGFuZCBpbnB1dC9vdXRwdXQgc3RyZWFtcworICAgICAqCisgICAgICogPHA+CisgICAgICogVGhpcyBpbXBsZW1lbnRzIHRoZSBmb2xsb3dpbmcgQ0dJIHNwZWNpZmljYXRpb24gcmVjb21tZWRhdGlvbnM6CisgICAgICogPFVMPgorICAgICAqIDxMST4gU2VydmVycyBTSE9VTEQgcHJvdmlkZSB0aGUgIjxjb2RlPnF1ZXJ5PC9jb2RlPiIgY29tcG9uZW50IG9mCisgICAgICogICAgICB0aGUgc2NyaXB0LVVSSSBhcyBjb21tYW5kLWxpbmUgYXJndW1lbnRzIHRvIHNjcmlwdHMgaWYgaXQKKyAgICAgKiAgICAgIGRvZXMgbm90IGNvbnRhaW4gYW55IHVuZW5jb2RlZCAiPSIgY2hhcmFjdGVycyBhbmQgdGhlCisgICAgICogICAgICBjb21tYW5kLWxpbmUgYXJndW1lbnRzIGNhbiBiZSBnZW5lcmF0ZWQgaW4gYW4gdW5hbWJpZ3VvdXMKKyAgICAgKiAgICAgIG1hbm5lci4KKyAgICAgKiA8TEk+IFNlcnZlcnMgU0hPVUxEIHNldCB0aGUgQVVUSF9UWVBFIG1ldGF2YXJpYWJsZSB0byB0aGUgdmFsdWUKKyAgICAgKiAgICAgIG9mIHRoZSAiPGNvZGU+YXV0aC1zY2hlbWU8L2NvZGU+IiB0b2tlbiBvZiB0aGUKKyAgICAgKiAgICAgICI8Y29kZT5BdXRob3JpemF0aW9uPC9jb2RlPiIgaWYgaXQgd2FzIHN1cHBsaWVkIGFzIHBhcnQgb2YgdGhlCisgICAgICogICAgICByZXF1ZXN0IGhlYWRlci4gIFNlZSA8Y29kZT5nZXRDR0lFbnZpcm9ubWVudDwvY29kZT4gbWV0aG9kLgorICAgICAqIDxMST4gV2hlcmUgYXBwbGljYWJsZSwgc2VydmVycyBTSE9VTEQgc2V0IHRoZSBjdXJyZW50IHdvcmtpbmcKKyAgICAgKiAgICAgIGRpcmVjdG9yeSB0byB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIHRoZSBzY3JpcHQgaXMgbG9jYXRlZAorICAgICAqICAgICAgYmVmb3JlIGludm9raW5nIGl0LgorICAgICAqIDxMST4gU2VydmVyIGltcGxlbWVudGF0aW9ucyBTSE9VTEQgZGVmaW5lIHRoZWlyIGJlaGF2aW9yIGZvciB0aGUKKyAgICAgKiAgICAgIGZvbGxvd2luZyBjYXNlczoKKyAgICAgKiAgICAgPHVsPgorICAgICAqICAgICA8TEk+IDx1PkFsbG93ZWQgY2hhcmFjdGVycyBpbiBwYXRoSW5mbzwvdT46ICBUaGlzIGltcGxlbWVudGF0aW9uCisgICAgICogICAgICAgICAgICAgZG9lcyBub3QgYWxsb3cgQVNDSUkgTlVMIG5vciBhbnkgY2hhcmFjdGVyIHdoaWNoIGNhbm5vdAorICAgICAqICAgICAgICAgICAgIGJlIFVSTC1lbmNvZGVkIGFjY29yZGluZyB0byBpbnRlcm5ldCBzdGFuZGFyZHM7CisgICAgICogICAgIDxMST4gPHU+QWxsb3dlZCBjaGFyYWN0ZXJzIGluIHBhdGggc2VnbWVudHM8L3U+OiBUaGlzCisgICAgICogICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgYWxsb3cgbm9uLXRlcm1pbmFsIE5VTEwKKyAgICAgKiAgICAgICAgICAgICBzZWdtZW50cyBpbiB0aGUgdGhlIHBhdGggLS0gSU9FeGNlcHRpb25zIG1heSBiZSB0aHJvd247CisgICAgICogICAgIDxMST4gPHU+Ijxjb2RlPi48L2NvZGU+IiBhbmQgIjxjb2RlPi4uPC9jb2RlPiIgcGF0aAorICAgICAqICAgICAgICAgICAgIHNlZ21lbnRzPC91PjoKKyAgICAgKiAgICAgICAgICAgICBUaGlzIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IGFsbG93ICI8Y29kZT4uPC9jb2RlPiIgYW5kCisgICAgICogICAgICAgICAgICAgIjxjb2RlPi4uPC9jb2RlPiIgaW4gdGhlIHRoZSBwYXRoLCBhbmQgc3VjaCBjaGFyYWN0ZXJzCisgICAgICogICAgICAgICAgICAgd2lsbCByZXN1bHQgaW4gYW4gSU9FeGNlcHRpb24gYmVpbmcgdGhyb3duOworICAgICAqICAgICA8TEk+IDx1PkltcGxlbWVudGF0aW9uIGxpbWl0YXRpb25zPC91PjogVGhpcyBpbXBsZW1lbnRhdGlvbgorICAgICAqICAgICAgICAgICAgIGRvZXMgbm90IGltcG9zZSBhbnkgbGltaXRhdGlvbnMgZXhjZXB0IGFzIGRvY3VtZW50ZWQKKyAgICAgKiAgICAgICAgICAgICBhYm92ZS4gIFRoaXMgaW1wbGVtZW50YXRpb24gbWF5IGJlIGxpbWl0ZWQgYnkgdGhlCisgICAgICogICAgICAgICAgICAgc2VydmxldCBjb250YWluZXIgdXNlZCB0byBob3VzZSB0aGlzIGltcGxlbWVudGF0aW9uLgorICAgICAqICAgICAgICAgICAgIEluIHBhcnRpY3VsYXIsIGFsbCB0aGUgcHJpbWFyeSBDR0kgdmFyaWFibGUgdmFsdWVzCisgICAgICogICAgICAgICAgICAgYXJlIGRlcml2ZWQgZWl0aGVyIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgZnJvbSB0aGUKKyAgICAgKiAgICAgICAgICAgICBjb250YWluZXIncyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgU2VydmxldCBBUEkgbWV0aG9kcy4KKyAgICAgKiAgICAgPC91bD4KKyAgICAgKiA8L1VMPgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgamF2YS5sYW5nLlJ1bnRpbWUjZXhlYyhTdHJpbmcgY29tbWFuZCwgCisgICAgICogU3RyaW5nW10gZW52cCwgRmlsZSBkaXIpCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIHByb2JsZW1zIGR1cmluZyByZWFkaW5nL3dyaXRpbmcgb2NjdXIKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogUkVNSU5EOiAgdGhpcyBtZXRob2QgZmVlbHMgdG9vIGJpZzsgc2hvdWxkIGl0IGJlIHJlLXdyaXR0ZW4/CisgICAgICAgICAqLworCisgICAgICAgIGlmICghaXNSZWFkeSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSArICI6IG5vdCByZWFkeSB0byBydW4uIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygicnVuQ0dJKGVudnA9WyIgKyBlbnYgKyAiXSwgY29tbWFuZD0iICsgY29tbWFuZCArICIpIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKGNvbW1hbmQuaW5kZXhPZihGaWxlLnNlcGFyYXRvciArICIuIiArIEZpbGUuc2VwYXJhdG9yKSA+PSAwKQorICAgICAgICAgICAgfHwgKGNvbW1hbmQuaW5kZXhPZihGaWxlLnNlcGFyYXRvciArICIuLiIpID49IDApCisgICAgICAgICAgICB8fCAoY29tbWFuZC5pbmRleE9mKCIuLiIgKyBGaWxlLnNlcGFyYXRvcikgPj0gMCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpCisgICAgICAgICAgICAgICAgICAgICsgIklsbGVnYWwgQ2hhcmFjdGVyIGluIENHSSBjb21tYW5kICIKKyAgICAgICAgICAgICAgICAgICAgKyAicGF0aCAoJy4nIG9yICcuLicpIGRldGVjdGVkLiAgTm90ICIKKyAgICAgICAgICAgICAgICAgICAgKyAicnVubmluZyBDR0kgWyIKKyAgICAgICAgICAgICAgICAgICAgKyBjb21tYW5kCisgICAgICAgICAgICAgICAgICAgICsgIl0uIik7CisgICAgICAgIH0KKworICAgICAgICAvKiBvcmlnaW5hbCBjb250ZW50L3N0cnVjdHVyZSBvZiB0aGlzIHNlY3Rpb24gdGFrZW4gZnJvbQorICAgICAgICAgKiBodHRwOi8vZGV2ZWxvcGVyLmphdmEuc3VuLmNvbS9kZXZlbG9wZXIvCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Z1BhcmFkZS9idWdzLzQyMTY4ODQuaHRtbAorICAgICAgICAgKiB3aXRoIG1ham9yIG1vZGlmaWNhdGlvbnMgYnkgTWFydGluIERlbmdsZXIKKyAgICAgICAgICovCisgICAgICAgIFJ1bnRpbWUgcnQgPSBudWxsOworICAgICAgICBCdWZmZXJlZFJlYWRlciBjb21tYW5kc1N0ZE91dCA9IG51bGw7CisgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGNvbW1hbmRzU3RkRXJyID0gbnVsbDsKKyAgICAgICAgQnVmZmVyZWRPdXRwdXRTdHJlYW0gY29tbWFuZHNTdGRJbiA9IG51bGw7CisgICAgICAgIFByb2Nlc3MgcHJvYyA9IG51bGw7CisgICAgICAgIGJ5dGVbXSBiQnVmID0gbmV3IGJ5dGVbMTAyNF07CisgICAgICAgIGNoYXJbXSBjQnVmID0gbmV3IGNoYXJbMTAyNF07CisgICAgICAgIGludCBidWZSZWFkID0gLTE7CisKKyAgICAgICAgLy9jcmVhdGUgcXVlcnkgYXJndW1lbnRzCisgICAgICAgIEVudW1lcmF0aW9uIHBhcmFtTmFtZXMgPSBwYXJhbXMua2V5cygpOworICAgICAgICBTdHJpbmdCdWZmZXIgY21kQW5kQXJncyA9IG5ldyBTdHJpbmdCdWZmZXIoY29tbWFuZCk7CisgICAgICAgIGlmIChwYXJhbU5hbWVzICE9IG51bGwgJiYgcGFyYW1OYW1lcy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgY21kQW5kQXJncy5hcHBlbmQoIiAiKTsKKyAgICAgICAgICAgIHdoaWxlIChwYXJhbU5hbWVzLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGsgPSAoU3RyaW5nKSBwYXJhbU5hbWVzLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIHYgPSBwYXJhbXMuZ2V0KGspLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgaWYgKChrLmluZGV4T2YoIj0iKSA8IDApICYmICh2LmluZGV4T2YoIj0iKSA8IDApKSB7CisgICAgICAgICAgICAgICAgICAgIGNtZEFuZEFyZ3MuYXBwZW5kKGspOworICAgICAgICAgICAgICAgICAgICBjbWRBbmRBcmdzLmFwcGVuZCgiPSIpOworICAgICAgICAgICAgICAgICAgICB2ID0gamF2YS5uZXQuVVJMRW5jb2Rlci5lbmNvZGUodik7CisgICAgICAgICAgICAgICAgICAgIGNtZEFuZEFyZ3MuYXBwZW5kKHYpOworICAgICAgICAgICAgICAgICAgICBjbWRBbmRBcmdzLmFwcGVuZCgiICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBwb3N0SW4gPSBnZXRQb3N0SW5wdXQocGFyYW1zKTsKKyAgICAgICAgaW50IGNvbnRlbnRMZW5ndGggPQorICAgICAgICAgICAgKHBvc3RJbi5sZW5ndGgoKSArIFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKS5sZW5ndGgoKSk7CisgICAgICAgIGlmICgiUE9TVCIuZXF1YWxzKGVudi5nZXQoIlJFUVVFU1RfTUVUSE9EIikpKSB7CisgICAgICAgICAgICBlbnYucHV0KCJDT05URU5UX0xFTkdUSCIsIG5ldyBJbnRlZ2VyKGNvbnRlbnRMZW5ndGgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJ0ID0gUnVudGltZS5nZXRSdW50aW1lKCk7CisgICAgICAgIHByb2MgPSBydC5leGVjKGNtZEFuZEFyZ3MudG9TdHJpbmcoKSwgaGFzaFRvU3RyaW5nQXJyYXkoZW52KSwgd2QpOworCisgICAgICAgIC8qCisgICAgICAgICAqIHByb3ZpZGUgaW5wdXQgdG8gY2dpCisgICAgICAgICAqIEZpcnN0ICAtLSBwYXJhbWV0ZXJzCisgICAgICAgICAqIFNlY29uZCAtLSBhbnkgcmVtYWluaW5nIGlucHV0CisgICAgICAgICAqLworICAgICAgICBjb21tYW5kc1N0ZEluID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKHByb2MuZ2V0T3V0cHV0U3RyZWFtKCkpOworICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygicnVuQ0dJIHN0ZGluPVsiICsgc3RkaW4gKyAiXSwgcXM9IiArIGVudi5nZXQoIlFVRVJZX1NUUklORyIpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIlBPU1QiLmVxdWFscyhlbnYuZ2V0KCJSRVFVRVNUX01FVEhPRCIpKSkgeworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJydW5DR0k6IHdyaXRpbmcgLS0tLS0tLS0tLS0tLS0tXG4iKTsKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcocG9zdEluKTsKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoCisgICAgICAgICAgICAgICAgICAgICJydW5DR0k6IG5ldyBjb250ZW50X2xlbmd0aD0iCisgICAgICAgICAgICAgICAgICAgICAgICArIGNvbnRlbnRMZW5ndGgKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIi0tLS0tLS0tLS0tLS0tLVxuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb21tYW5kc1N0ZEluLndyaXRlKHBvc3RJbi5nZXRCeXRlcygpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RkaW4gIT0gbnVsbCkgeworICAgICAgICAgICAgLy9SRU1JTkQ6IGRvY3VtZW50IHRoaXMKKyAgICAgICAgICAgIC8qIGFzc3VtZSBpZiBub3RoaW5nIGlzIGF2YWlsYWJsZSBhZnRlciBhIHRpbWUsIHRoYXQgbm90aGluZyBpcworICAgICAgICAgICAgICogY29taW5nLi4uCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChzdGRpbi5hdmFpbGFibGUoKSA8PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygKKyAgICAgICAgICAgICAgICAgICAgICAgICJydW5DR0kgc3RkaW4gaXMgTk9UIGF2YWlsYWJsZSBbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc3RkaW4uYXZhaWxhYmxlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJdIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcChpQ2xpZW50SW5wdXRUaW1lb3V0KTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZ25vcmVkKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0ZGluLmF2YWlsYWJsZSgpID4gMCkgeworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoCisgICAgICAgICAgICAgICAgICAgICAgICAicnVuQ0dJIHN0ZGluIElTIGF2YWlsYWJsZSBbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc3RkaW4uYXZhaWxhYmxlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJdIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJCdWYgPSBuZXcgYnl0ZVsxMDI0XTsKKyAgICAgICAgICAgICAgICBidWZSZWFkID0gLTE7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChidWZSZWFkID0gc3RkaW4ucmVhZChiQnVmKSkgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJ1bkNHSTogcmVhZCBbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBidWZSZWFkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJdIGJ5dGVzIGZyb20gc3RkaW4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRzU3RkSW4ud3JpdGUoYkJ1ZiwgMCwgYnVmUmVhZCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoInJ1bkNHSTogRE9ORSBSRUFESU5HIGZyb20gc3RkaW4iKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IoInJ1bkNHSTogY291bGRuJ3Qgd3JpdGUgYWxsIGJ5dGVzLiIsIGlvZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvbW1hbmRzU3RkSW4uZmx1c2goKTsKKyAgICAgICAgY29tbWFuZHNTdGRJbi5jbG9zZSgpOworCisgICAgICAgIC8qIHdlIHdhbnQgdG8gd2FpdCBmb3IgdGhlIHByb2Nlc3MgdG8gZXhpdCwgIFByb2Nlc3Mud2FpdEZvcigpCisgICAgICAgICAqIGlzIHVzZWxlc3MgaW4gb3VyIHNpdHVhdGlvbjsgc2VlCisgICAgICAgICAqIGh0dHA6Ly9kZXZlbG9wZXIuamF2YS5zdW4uY29tL2RldmVsb3Blci8KKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVnUGFyYWRlL2J1Z3MvNDIyMzY1MC5odG1sCisgICAgICAgICAqLworCisgICAgICAgIGJvb2xlYW4gaXNSdW5uaW5nID0gdHJ1ZTsKKyAgICAgICAgY29tbWFuZHNTdGRPdXQgPQorICAgICAgICAgICAgbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihwcm9jLmdldElucHV0U3RyZWFtKCkpKTsKKyAgICAgICAgY29tbWFuZHNTdGRFcnIgPQorICAgICAgICAgICAgbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihwcm9jLmdldEVycm9yU3RyZWFtKCkpKTsKKyAgICAgICAgQnVmZmVyZWRXcml0ZXIgc2VydmxldENvbnRhaW5lclN0ZG91dCA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChyZXNwb25zZS5nZXRPdXRwdXRTdHJlYW0oKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2VydmxldENvbnRhaW5lclN0ZG91dCA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBCdWZmZXJlZFdyaXRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIocmVzcG9uc2UuZ2V0T3V0cHV0U3RyZWFtKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaWdub3JlZCkgeworICAgICAgICAgICAgLy9OT09QOiBubyBvdXRwdXQgd2lsbCBiZSB3cml0dGVuCisgICAgICAgIH0KKworICAgICAgICB3aGlsZSAoaXNSdW5uaW5nKSB7CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgLy9yZWFkIHN0ZGVyciBmaXJzdAorICAgICAgICAgICAgICAgIGNCdWYgPSBuZXcgY2hhclsxMDI0XTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoKGJ1ZlJlYWQgPSBjb21tYW5kc1N0ZEVyci5yZWFkKGNCdWYpKSAhPSAtMSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoc2VydmxldENvbnRhaW5lclN0ZG91dCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2bGV0Q29udGFpbmVyU3Rkb3V0LndyaXRlKGNCdWYsIDAsIGJ1ZlJlYWQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy9zZXQgaGVhZGVycworICAgICAgICAgICAgICAgIFN0cmluZyBsaW5lID0gbnVsbDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoKChsaW5lID0gY29tbWFuZHNTdGRPdXQucmVhZExpbmUoKSkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgJiYgISgiIi5lcXVhbHMobGluZSkpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJydW5DR0k6IGFkZEhlYWRlcihcIiIgKyBsaW5lICsgIlwiKSIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lLnN0YXJ0c1dpdGgoIkhUVFAiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy9UT0RPOiBzaG91bGQgc2V0IHN0YXR1cyBjb2RlcyAoTlBIIHN1cHBvcnQpCisgICAgICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgICAgICogcmVzcG9uc2Uuc2V0U3RhdHVzKGdldFN0YXR1c0NvZGUobGluZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5hZGRIZWFkZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZS5zdWJzdHJpbmcoMCwgbGluZS5pbmRleE9mKCI6IikpLnRyaW0oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lLnN1YnN0cmluZyhsaW5lLmluZGV4T2YoIjoiKSArIDEpLnRyaW0oKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvL3dyaXRlIG91dHB1dAorICAgICAgICAgICAgICAgIGNCdWYgPSBuZXcgY2hhclsxMDI0XTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoKGJ1ZlJlYWQgPSBjb21tYW5kc1N0ZE91dC5yZWFkKGNCdWYpKSAhPSAtMSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoc2VydmxldENvbnRhaW5lclN0ZG91dCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoInJ1bkNHSTogd3JpdGUoXCIiICsgbmV3IFN0cmluZyhjQnVmKSArICJcIikiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZsZXRDb250YWluZXJTdGRvdXQud3JpdGUoY0J1ZiwgMCwgYnVmUmVhZCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoc2VydmxldENvbnRhaW5lclN0ZG91dCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHNlcnZsZXRDb250YWluZXJTdGRvdXQuZmx1c2goKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcm9jLmV4aXRWYWx1ZSgpOyAvLyBUaHJvd3MgZXhjZXB0aW9uIGlmIGFsaXZlCisKKyAgICAgICAgICAgICAgICBpc1J1bm5pbmcgPSBmYWxzZTsKKworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFRocmVhZFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoNTAwKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZ25vcmVkKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IC8vcmVwbGFjZW1lbnQgZm9yIFByb2Nlc3Mud2FpdEZvcigpCisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIGEgc3RyaW5nIGZvciBpbnB1dCB0byBhIFBPU1QgY2dpIHNjcmlwdAorICAgICAqCisgICAgICogQHBhcmFtICBwYXJhbXMgICBIYXNodGFibGUgb2YgcXVlcnkgcGFyYW1ldGVycyB0byBiZSBwYXNzZWQgdG8KKyAgICAgKiAgICAgICAgICAgICAgICAgIHRoZSBDR0kgc2NyaXB0CisgICAgICogQHJldHVybiAgICAgICAgICBmb3IgdXNlIGFzIGlucHV0IHRvIHRoZSBDR0kgc2NyaXB0CisgICAgICovCisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFBvc3RJbnB1dChIYXNodGFibGUgcGFyYW1zKSB7CisgICAgICAgIFN0cmluZyBsaW5lU2VwYXJhdG9yID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOworICAgICAgICBFbnVtZXJhdGlvbiBwYXJhbU5hbWVzID0gcGFyYW1zLmtleXMoKTsKKyAgICAgICAgU3RyaW5nQnVmZmVyIHBvc3RJbnB1dCA9IG5ldyBTdHJpbmdCdWZmZXIoIiIpOworICAgICAgICBTdHJpbmdCdWZmZXIgcXMgPSBuZXcgU3RyaW5nQnVmZmVyKCIiKTsKKyAgICAgICAgaWYgKHBhcmFtTmFtZXMgIT0gbnVsbCAmJiBwYXJhbU5hbWVzLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICB3aGlsZSAocGFyYW1OYW1lcy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBrID0gKFN0cmluZykgcGFyYW1OYW1lcy5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgICAgIFN0cmluZyB2ID0gcGFyYW1zLmdldChrKS50b1N0cmluZygpOworICAgICAgICAgICAgICAgIGlmICgoay5pbmRleE9mKCI9IikgPCAwKSAmJiAodi5pbmRleE9mKCI9IikgPCAwKSkgeworICAgICAgICAgICAgICAgICAgICBwb3N0SW5wdXQuYXBwZW5kKGspOworICAgICAgICAgICAgICAgICAgICBxcy5hcHBlbmQoayk7CisgICAgICAgICAgICAgICAgICAgIHBvc3RJbnB1dC5hcHBlbmQoIj0iKTsKKyAgICAgICAgICAgICAgICAgICAgcXMuYXBwZW5kKCI9Iik7CisgICAgICAgICAgICAgICAgICAgIHBvc3RJbnB1dC5hcHBlbmQodik7CisgICAgICAgICAgICAgICAgICAgIHFzLmFwcGVuZCh2KTsKKyAgICAgICAgICAgICAgICAgICAgcG9zdElucHV0LmFwcGVuZChsaW5lU2VwYXJhdG9yKTsKKyAgICAgICAgICAgICAgICAgICAgcXMuYXBwZW5kKCImIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHFzLmFwcGVuZChsaW5lU2VwYXJhdG9yKTsKKyAgICAgICAgcmV0dXJuIHFzLmFwcGVuZChwb3N0SW5wdXQpLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRJQ2xpZW50SW5wdXRUaW1lb3V0KCkgeworICAgICAgICByZXR1cm4gaUNsaWVudElucHV0VGltZW91dDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJQ2xpZW50SW5wdXRUaW1lb3V0KGludCBpQ2xpZW50SW5wdXRUaW1lb3V0KSB7CisgICAgICAgIHRoaXMuaUNsaWVudElucHV0VGltZW91dCA9IGlDbGllbnRJbnB1dFRpbWVvdXQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvUXVldWUuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL1F1ZXVlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM0MzIwYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL1F1ZXVlLmphdmEKQEAgLTAsMCArMSw4NyBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCisvKioKKyAqIEEgc2ltcGxlIEZJRk8gcXVldWUgY2xhc3Mgd2hpY2ggY2F1c2VzIHRoZSBjYWxsaW5nIHRocmVhZCB0byB3YWl0CisgKiBpZiB0aGUgcXVldWUgaXMgZW1wdHkgYW5kIG5vdGlmaWVzIHRocmVhZHMgdGhhdCBhcmUgd2FpdGluZyB3aGVuIGl0CisgKiBpcyBub3QgZW1wdHkuCisgKgorICogQGF1dGhvciBBbmlsIFYgKGFrdkBlbmcuc3VuLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFF1ZXVlIHsKKyAgICBwcml2YXRlIFZlY3RvciB2ZWN0b3IgPSBuZXcgVmVjdG9yKCk7CisKKyAgICAvKioKKyAgICAgKiBQdXQgdGhlIG9iamVjdCBpbnRvIHRoZSBxdWV1ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgIG9iamVjdCAgICAgICAgICB0aGUgb2JqZWN0IHRvIGJlIGFwcGVuZGVkIHRvIHRoZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcHV0KE9iamVjdCBvYmplY3QpIHsKKyAgICAgICAgdmVjdG9yLmFkZEVsZW1lbnQob2JqZWN0KTsKKyAgICAgICAgbm90aWZ5KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHVsbCB0aGUgZmlyc3Qgb2JqZWN0IG91dCBvZiB0aGUgcXVldWUuIFdhaXQgaWYgdGhlIHF1ZXVlIGlzCisgICAgICogZW1wdHkuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBPYmplY3QgcHVsbCgpIHsKKyAgICAgICAgd2hpbGUgKGlzRW1wdHkoKSkKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgd2FpdCgpOworICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGdldCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgZmlyc3Qgb2JqZWN0IG91dCBvZiB0aGUgcXVldWUuIFJldHVybiBudWxsIGlmIHRoZSBxdWV1ZQorICAgICAqIGlzIGVtcHR5LgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgT2JqZWN0IGdldCgpIHsKKyAgICAgICAgT2JqZWN0IG9iamVjdCA9IHBlZWsoKTsKKyAgICAgICAgaWYgKG9iamVjdCAhPSBudWxsKQorICAgICAgICAgICAgdmVjdG9yLnJlbW92ZUVsZW1lbnRBdCgwKTsKKyAgICAgICAgcmV0dXJuIG9iamVjdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQZWVrIHRvIHNlZSBpZiBzb21ldGhpbmcgaXMgYXZhaWxhYmxlLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgcGVlaygpIHsKKyAgICAgICAgaWYgKGlzRW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICByZXR1cm4gdmVjdG9yLmVsZW1lbnRBdCgwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJcyB0aGUgcXVldWUgZW1wdHk/CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKKyAgICAgICAgcmV0dXJuIHZlY3Rvci5pc0VtcHR5KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSG93IG1hbnkgZWxlbWVudHMgYXJlIHRoZXJlIGluIHRoaXMgcXVldWU/CisgICAgICovCisgICAgcHVibGljIGludCBzaXplKCkgeworICAgICAgICByZXR1cm4gdmVjdG9yLnNpemUoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9SZXF1ZXN0VXRpbC5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvUmVxdWVzdFV0aWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjBmZWY5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvUmVxdWVzdFV0aWwuamF2YQpAQCAtMCwwICsxLDUwOSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsOworCitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuVGltZVpvbmU7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuQ29va2llOworCisKKy8qKgorICogR2VuZXJhbCBwdXJwb3NlIHJlcXVlc3QgcGFyc2luZyBhbmQgZW5jb2RpbmcgdXRpbGl0eSBtZXRob2RzLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQGF1dGhvciBUaW0gVHllCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBSZXF1ZXN0VXRpbCB7CisKKworICAgIC8qKgorICAgICAqIFRoZSBEYXRlRm9ybWF0IHRvIHVzZSBmb3IgZ2VuZXJhdGluZyByZWFkYWJsZSBkYXRlcyBpbiBjb29raWVzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFNpbXBsZURhdGVGb3JtYXQgZm9ybWF0ID0KKyAgICAgICAgbmV3IFNpbXBsZURhdGVGb3JtYXQoIiBFRUVFLCBkZC1NTU0teXkga2s6bW06c3MgenoiKTsKKworICAgIHN0YXRpYyB7CisgICAgICAgIGZvcm1hdC5zZXRUaW1lWm9uZShUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01UIikpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogRW5jb2RlIGEgY29va2llIGFzIHBlciBSRkMgMjEwOS4gIFRoZSByZXN1bHRpbmcgc3RyaW5nIGNhbiBiZSB1c2VkCisgICAgICogYXMgdGhlIHZhbHVlIGZvciBhIDxjb2RlPlNldC1Db29raWU8L2NvZGU+IGhlYWRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb29raWUgVGhlIGNvb2tpZSB0byBlbmNvZGUuCisgICAgICogQHJldHVybiBBIHN0cmluZyBmb2xsb3dpbmcgUkZDIDIxMDkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZW5jb2RlQ29va2llKENvb2tpZSBjb29raWUpIHsKKworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlciggY29va2llLmdldE5hbWUoKSApOworICAgICAgICBidWYuYXBwZW5kKCI9Iik7CisgICAgICAgIGJ1Zi5hcHBlbmQoY29va2llLmdldFZhbHVlKCkpOworCisgICAgICAgIGlmIChjb29raWUuZ2V0Q29tbWVudCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIjsgQ29tbWVudD1cIiIpOworICAgICAgICAgICAgYnVmLmFwcGVuZChjb29raWUuZ2V0Q29tbWVudCgpKTsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIlwiIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY29va2llLmdldERvbWFpbigpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIjsgRG9tYWluPVwiIik7CisgICAgICAgICAgICBidWYuYXBwZW5kKGNvb2tpZS5nZXREb21haW4oKSk7CisgICAgICAgICAgICBidWYuYXBwZW5kKCJcIiIpOworICAgICAgICB9CisKKyAgICAgICAgbG9uZyBhZ2UgPSBjb29raWUuZ2V0TWF4QWdlKCk7CisgICAgICAgIGlmIChjb29raWUuZ2V0TWF4QWdlKCkgPj0gMCkgeworICAgICAgICAgICAgYnVmLmFwcGVuZCgiOyBNYXgtQWdlPVwiIik7CisgICAgICAgICAgICBidWYuYXBwZW5kKGNvb2tpZS5nZXRNYXhBZ2UoKSk7CisgICAgICAgICAgICBidWYuYXBwZW5kKCJcIiIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNvb2tpZS5nZXRQYXRoKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgYnVmLmFwcGVuZCgiOyBQYXRoPVwiIik7CisgICAgICAgICAgICBidWYuYXBwZW5kKGNvb2tpZS5nZXRQYXRoKCkpOworICAgICAgICAgICAgYnVmLmFwcGVuZCgiXCIiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb29raWUuZ2V0U2VjdXJlKCkpIHsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIjsgU2VjdXJlIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY29va2llLmdldFZlcnNpb24oKSA+IDApIHsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIjsgVmVyc2lvbj1cIiIpOworICAgICAgICAgICAgYnVmLmFwcGVuZChjb29raWUuZ2V0VmVyc2lvbigpKTsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIlwiIik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKGJ1Zi50b1N0cmluZygpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEZpbHRlciB0aGUgc3BlY2lmaWVkIG1lc3NhZ2Ugc3RyaW5nIGZvciBjaGFyYWN0ZXJzIHRoYXQgYXJlIHNlbnNpdGl2ZQorICAgICAqIGluIEhUTUwuICBUaGlzIGF2b2lkcyBwb3RlbnRpYWwgYXR0YWNrcyBjYXVzZWQgYnkgaW5jbHVkaW5nIEphdmFTY3JpcHQKKyAgICAgKiBjb2RlcyBpbiB0aGUgcmVxdWVzdCBVUkwgdGhhdCBpcyBvZnRlbiByZXBvcnRlZCBpbiBlcnJvciBtZXNzYWdlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIHN0cmluZyB0byBiZSBmaWx0ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGZpbHRlcihTdHJpbmcgbWVzc2FnZSkgeworCisgICAgICAgIGlmIChtZXNzYWdlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworCisgICAgICAgIGNoYXIgY29udGVudFtdID0gbmV3IGNoYXJbbWVzc2FnZS5sZW5ndGgoKV07CisgICAgICAgIG1lc3NhZ2UuZ2V0Q2hhcnMoMCwgbWVzc2FnZS5sZW5ndGgoKSwgY29udGVudCwgMCk7CisgICAgICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKGNvbnRlbnQubGVuZ3RoICsgNTApOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbnRlbnQubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHN3aXRjaCAoY29udGVudFtpXSkgeworICAgICAgICAgICAgY2FzZSAnPCc6CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiJmx0OyIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnPic6CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiJmd0OyIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnJic6CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiJmFtcDsiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJyInOgorICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIiZxdW90OyIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGNvbnRlbnRbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAocmVzdWx0LnRvU3RyaW5nKCkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBOb3JtYWxpemUgYSByZWxhdGl2ZSBVUkkgcGF0aCB0aGF0IG1heSBoYXZlIHJlbGF0aXZlIHZhbHVlcyAoIi8uLyIsCisgICAgICogIi8uLi8iLCBhbmQgc28gb24gKSBpdCBpdC4gIDxzdHJvbmc+V0FSTklORzwvc3Ryb25nPiAtIFRoaXMgbWV0aG9kIGlzCisgICAgICogdXNlZnVsIG9ubHkgZm9yIG5vcm1hbGl6aW5nIGFwcGxpY2F0aW9uLWdlbmVyYXRlZCBwYXRocy4gIEl0IGRvZXMgbm90CisgICAgICogdHJ5IHRvIHBlcmZvcm0gc2VjdXJpdHkgY2hlY2tzIGZvciBtYWxpY2lvdXMgaW5wdXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0aCBSZWxhdGl2ZSBwYXRoIHRvIGJlIG5vcm1hbGl6ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBub3JtYWxpemUoU3RyaW5nIHBhdGgpIHsKKworICAgICAgICBpZiAocGF0aCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgLy8gQ3JlYXRlIGEgcGxhY2UgZm9yIHRoZSBub3JtYWxpemVkIHBhdGgKKyAgICAgICAgU3RyaW5nIG5vcm1hbGl6ZWQgPSBwYXRoOworCisgICAgICAgIGlmIChub3JtYWxpemVkLmVxdWFscygiLy4iKSkKKyAgICAgICAgICAgIHJldHVybiAiLyI7CisKKyAgICAgICAgLy8gQWRkIGEgbGVhZGluZyAiLyIgaWYgbmVjZXNzYXJ5CisgICAgICAgIGlmICghbm9ybWFsaXplZC5zdGFydHNXaXRoKCIvIikpCisgICAgICAgICAgICBub3JtYWxpemVkID0gIi8iICsgbm9ybWFsaXplZDsKKworICAgICAgICAvLyBSZXNvbHZlIG9jY3VycmVuY2VzIG9mICIvLyIgaW4gdGhlIG5vcm1hbGl6ZWQgcGF0aAorICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgaW50IGluZGV4ID0gbm9ybWFsaXplZC5pbmRleE9mKCIvLyIpOworICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIG5vcm1hbGl6ZWQgPSBub3JtYWxpemVkLnN1YnN0cmluZygwLCBpbmRleCkgKworICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWQuc3Vic3RyaW5nKGluZGV4ICsgMSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXNvbHZlIG9jY3VycmVuY2VzIG9mICIvLi8iIGluIHRoZSBub3JtYWxpemVkIHBhdGgKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIGludCBpbmRleCA9IG5vcm1hbGl6ZWQuaW5kZXhPZigiLy4vIik7CisgICAgICAgICAgICBpZiAoaW5kZXggPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZWQuc3Vic3RyaW5nKDAsIGluZGV4KSArCisgICAgICAgICAgICAgICAgbm9ybWFsaXplZC5zdWJzdHJpbmcoaW5kZXggKyAyKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlc29sdmUgb2NjdXJyZW5jZXMgb2YgIi8uLi8iIGluIHRoZSBub3JtYWxpemVkIHBhdGgKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIGludCBpbmRleCA9IG5vcm1hbGl6ZWQuaW5kZXhPZigiLy4uLyIpOworICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGlmIChpbmRleCA9PSAwKQorICAgICAgICAgICAgICAgIHJldHVybiAobnVsbCk7ICAvLyBUcnlpbmcgdG8gZ28gb3V0c2lkZSBvdXIgY29udGV4dAorICAgICAgICAgICAgaW50IGluZGV4MiA9IG5vcm1hbGl6ZWQubGFzdEluZGV4T2YoJy8nLCBpbmRleCAtIDEpOworICAgICAgICAgICAgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZWQuc3Vic3RyaW5nKDAsIGluZGV4MikgKworICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWQuc3Vic3RyaW5nKGluZGV4ICsgMyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXR1cm4gdGhlIG5vcm1hbGl6ZWQgcGF0aCB0aGF0IHdlIGhhdmUgY29tcGxldGVkCisgICAgICAgIHJldHVybiAobm9ybWFsaXplZCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFBhcnNlIHRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcgZnJvbSB0aGUgc3BlY2lmaWVkIGNvbnRlbnQgdHlwZSBoZWFkZXIuCisgICAgICogSWYgdGhlIGNvbnRlbnQgdHlwZSBpcyBudWxsLCBvciB0aGVyZSBpcyBubyBleHBsaWNpdCBjaGFyYWN0ZXIgZW5jb2RpbmcsCisgICAgICogPGNvZGU+bnVsbDwvY29kZT4gaXMgcmV0dXJuZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGVudFR5cGUgYSBjb250ZW50IHR5cGUgaGVhZGVyCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcGFyc2VDaGFyYWN0ZXJFbmNvZGluZyhTdHJpbmcgY29udGVudFR5cGUpIHsKKworICAgICAgICBpZiAoY29udGVudFR5cGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIGludCBzdGFydCA9IGNvbnRlbnRUeXBlLmluZGV4T2YoImNoYXJzZXQ9Iik7CisgICAgICAgIGlmIChzdGFydCA8IDApCisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICBTdHJpbmcgZW5jb2RpbmcgPSBjb250ZW50VHlwZS5zdWJzdHJpbmcoc3RhcnQgKyA4KTsKKyAgICAgICAgaW50IGVuZCA9IGVuY29kaW5nLmluZGV4T2YoJzsnKTsKKyAgICAgICAgaWYgKGVuZCA+PSAwKQorICAgICAgICAgICAgZW5jb2RpbmcgPSBlbmNvZGluZy5zdWJzdHJpbmcoMCwgZW5kKTsKKyAgICAgICAgZW5jb2RpbmcgPSBlbmNvZGluZy50cmltKCk7CisgICAgICAgIGlmICgoZW5jb2RpbmcubGVuZ3RoKCkgPiAyKSAmJiAoZW5jb2Rpbmcuc3RhcnRzV2l0aCgiXCIiKSkKKyAgICAgICAgICAgICYmIChlbmNvZGluZy5lbmRzV2l0aCgiXCIiKSkpCisgICAgICAgICAgICBlbmNvZGluZyA9IGVuY29kaW5nLnN1YnN0cmluZygxLCBlbmNvZGluZy5sZW5ndGgoKSAtIDEpOworICAgICAgICByZXR1cm4gKGVuY29kaW5nLnRyaW0oKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFBhcnNlIGEgY29va2llIGhlYWRlciBpbnRvIGFuIGFycmF5IG9mIGNvb2tpZXMgYWNjb3JkaW5nIHRvIFJGQyAyMTA5LgorICAgICAqCisgICAgICogQHBhcmFtIGhlYWRlciBWYWx1ZSBvZiBhbiBIVFRQICJDb29raWUiIGhlYWRlcgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQ29va2llW10gcGFyc2VDb29raWVIZWFkZXIoU3RyaW5nIGhlYWRlcikgeworCisgICAgICAgIGlmICgoaGVhZGVyID09IG51bGwpIHx8IChoZWFkZXIubGVuZ3RoKCkgPCAxKSkKKyAgICAgICAgICAgIHJldHVybiAobmV3IENvb2tpZVswXSk7CisKKyAgICAgICAgQXJyYXlMaXN0IGNvb2tpZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIHdoaWxlIChoZWFkZXIubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICBpbnQgc2VtaWNvbG9uID0gaGVhZGVyLmluZGV4T2YoJzsnKTsKKyAgICAgICAgICAgIGlmIChzZW1pY29sb24gPCAwKQorICAgICAgICAgICAgICAgIHNlbWljb2xvbiA9IGhlYWRlci5sZW5ndGgoKTsKKyAgICAgICAgICAgIGlmIChzZW1pY29sb24gPT0gMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIFN0cmluZyB0b2tlbiA9IGhlYWRlci5zdWJzdHJpbmcoMCwgc2VtaWNvbG9uKTsKKyAgICAgICAgICAgIGlmIChzZW1pY29sb24gPCBoZWFkZXIubGVuZ3RoKCkpCisgICAgICAgICAgICAgICAgaGVhZGVyID0gaGVhZGVyLnN1YnN0cmluZyhzZW1pY29sb24gKyAxKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBoZWFkZXIgPSAiIjsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaW50IGVxdWFscyA9IHRva2VuLmluZGV4T2YoJz0nKTsKKyAgICAgICAgICAgICAgICBpZiAoZXF1YWxzID4gMCkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHRva2VuLnN1YnN0cmluZygwLCBlcXVhbHMpLnRyaW0oKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gdG9rZW4uc3Vic3RyaW5nKGVxdWFscysxKS50cmltKCk7CisgICAgICAgICAgICAgICAgICAgIGNvb2tpZXMuYWRkKG5ldyBDb29raWUobmFtZSwgdmFsdWUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgeworICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAoKENvb2tpZVtdKSBjb29raWVzLnRvQXJyYXkobmV3IENvb2tpZVtjb29raWVzLnNpemUoKV0pKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQXBwZW5kIHJlcXVlc3QgcGFyYW1ldGVycyBmcm9tIHRoZSBzcGVjaWZpZWQgU3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBNYXAuICBJdCBpcyBwcmVzdW1lZCB0aGF0IHRoZSBzcGVjaWZpZWQgTWFwIGlzIG5vdCBhY2Nlc3NlZCBmcm9tIGFueQorICAgICAqIG90aGVyIHRocmVhZCwgc28gbm8gc3luY2hyb25pemF0aW9uIGlzIHBlcmZvcm1lZC4KKyAgICAgKiA8cD4KKyAgICAgKiA8c3Ryb25nPklNUExFTUVOVEFUSU9OIE5PVEU8L3N0cm9uZz46ICBVUkwgZGVjb2RpbmcgaXMgcGVyZm9ybWVkCisgICAgICogaW5kaXZpZHVhbGx5IG9uIHRoZSBwYXJzZWQgbmFtZSBhbmQgdmFsdWUgZWxlbWVudHMsIHJhdGhlciB0aGFuIG9uCisgICAgICogdGhlIGVudGlyZSBxdWVyeSBzdHJpbmcgYWhlYWQgb2YgdGltZSwgdG8gcHJvcGVybHkgZGVhbCB3aXRoIHRoZSBjYXNlCisgICAgICogd2hlcmUgdGhlIG5hbWUgb3IgdmFsdWUgaW5jbHVkZXMgYW4gZW5jb2RlZCAiPSIgb3IgIiYiIGNoYXJhY3RlcgorICAgICAqIHRoYXQgd291bGQgb3RoZXJ3aXNlIGJlIGludGVycHJldGVkIGFzIGEgZGVsaW1pdGVyLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcCBNYXAgdGhhdCBhY2N1bXVsYXRlcyB0aGUgcmVzdWx0aW5nIHBhcmFtZXRlcnMKKyAgICAgKiBAcGFyYW0gZGF0YSBJbnB1dCBzdHJpbmcgY29udGFpbmluZyByZXF1ZXN0IHBhcmFtZXRlcnMKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBkYXRhIGlzIG1hbGZvcm1lZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwYXJzZVBhcmFtZXRlcnMoTWFwIG1hcCwgU3RyaW5nIGRhdGEsIFN0cmluZyBlbmNvZGluZykKKyAgICAgICAgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24geworCisgICAgICAgIGlmICgoZGF0YSAhPSBudWxsKSAmJiAoZGF0YS5sZW5ndGgoKSA+IDApKSB7CisKKyAgICAgICAgICAgIC8vIHVzZSB0aGUgc3BlY2lmaWVkIGVuY29kaW5nIHRvIGV4dHJhY3QgYnl0ZXMgb3V0IG9mIHRoZQorICAgICAgICAgICAgLy8gZ2l2ZW4gc3RyaW5nIHNvIHRoYXQgdGhlIGVuY29kaW5nIGlzIG5vdCBsb3N0LiBJZiBhbgorICAgICAgICAgICAgLy8gZW5jb2RpbmcgaXMgbm90IHNwZWNpZmllZCwgbGV0IGl0IHVzZSBwbGF0Zm9ybSBkZWZhdWx0CisgICAgICAgICAgICBieXRlW10gYnl0ZXMgPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAoZW5jb2RpbmcgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBieXRlcyA9IGRhdGEuZ2V0Qnl0ZXMoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBieXRlcyA9IGRhdGEuZ2V0Qnl0ZXMoZW5jb2RpbmcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gdWVlKSB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHBhcnNlUGFyYW1ldGVycyhtYXAsIGJ5dGVzLCBlbmNvZGluZyk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogRGVjb2RlIGFuZCByZXR1cm4gdGhlIHNwZWNpZmllZCBVUkwtZW5jb2RlZCBTdHJpbmcuCisgICAgICogV2hlbiB0aGUgYnl0ZSBhcnJheSBpcyBjb252ZXJ0ZWQgdG8gYSBzdHJpbmcsIHRoZSBzeXN0ZW0gZGVmYXVsdAorICAgICAqIGNoYXJhY3RlciBlbmNvZGluZyBpcyB1c2VkLi4uICBUaGlzIG1heSBiZSBkaWZmZXJlbnQgdGhhbiBzb21lIG90aGVyCisgICAgICogc2VydmVycy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHIgVGhlIHVybC1lbmNvZGVkIHN0cmluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgYSAnJScgY2hhcmFjdGVyIGlzIG5vdCBmb2xsb3dlZAorICAgICAqIGJ5IGEgdmFsaWQgMi1kaWdpdCBoZXhhZGVjaW1hbCBudW1iZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBVUkxEZWNvZGUoU3RyaW5nIHN0cikgeworCisgICAgICAgIHJldHVybiBVUkxEZWNvZGUoc3RyLCBudWxsKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogRGVjb2RlIGFuZCByZXR1cm4gdGhlIHNwZWNpZmllZCBVUkwtZW5jb2RlZCBTdHJpbmcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyIFRoZSB1cmwtZW5jb2RlZCBzdHJpbmcKKyAgICAgKiBAcGFyYW0gZW5jIFRoZSBlbmNvZGluZyB0byB1c2U7IGlmIG51bGwsIHRoZSBkZWZhdWx0IGVuY29kaW5nIGlzIHVzZWQKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBhICclJyBjaGFyYWN0ZXIgaXMgbm90IGZvbGxvd2VkCisgICAgICogYnkgYSB2YWxpZCAyLWRpZ2l0IGhleGFkZWNpbWFsIG51bWJlcgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFVSTERlY29kZShTdHJpbmcgc3RyLCBTdHJpbmcgZW5jKSB7CisKKyAgICAgICAgaWYgKHN0ciA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKworICAgICAgICAvLyB1c2UgdGhlIHNwZWNpZmllZCBlbmNvZGluZyB0byBleHRyYWN0IGJ5dGVzIG91dCBvZiB0aGUKKyAgICAgICAgLy8gZ2l2ZW4gc3RyaW5nIHNvIHRoYXQgdGhlIGVuY29kaW5nIGlzIG5vdCBsb3N0LiBJZiBhbgorICAgICAgICAvLyBlbmNvZGluZyBpcyBub3Qgc3BlY2lmaWVkLCBsZXQgaXQgdXNlIHBsYXRmb3JtIGRlZmF1bHQKKyAgICAgICAgYnl0ZVtdIGJ5dGVzID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChlbmMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGJ5dGVzID0gc3RyLmdldEJ5dGVzKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJ5dGVzID0gc3RyLmdldEJ5dGVzKGVuYyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gdWVlKSB7fQorCisgICAgICAgIHJldHVybiBVUkxEZWNvZGUoYnl0ZXMsIGVuYyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIERlY29kZSBhbmQgcmV0dXJuIHRoZSBzcGVjaWZpZWQgVVJMLWVuY29kZWQgYnl0ZSBhcnJheS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBieXRlcyBUaGUgdXJsLWVuY29kZWQgYnl0ZSBhcnJheQorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGEgJyUnIGNoYXJhY3RlciBpcyBub3QgZm9sbG93ZWQKKyAgICAgKiBieSBhIHZhbGlkIDItZGlnaXQgaGV4YWRlY2ltYWwgbnVtYmVyCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgVVJMRGVjb2RlKGJ5dGVbXSBieXRlcykgeworICAgICAgICByZXR1cm4gVVJMRGVjb2RlKGJ5dGVzLCBudWxsKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIERlY29kZSBhbmQgcmV0dXJuIHRoZSBzcGVjaWZpZWQgVVJMLWVuY29kZWQgYnl0ZSBhcnJheS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBieXRlcyBUaGUgdXJsLWVuY29kZWQgYnl0ZSBhcnJheQorICAgICAqIEBwYXJhbSBlbmMgVGhlIGVuY29kaW5nIHRvIHVzZTsgaWYgbnVsbCwgdGhlIGRlZmF1bHQgZW5jb2RpbmcgaXMgdXNlZAorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGEgJyUnIGNoYXJhY3RlciBpcyBub3QgZm9sbG93ZWQKKyAgICAgKiBieSBhIHZhbGlkIDItZGlnaXQgaGV4YWRlY2ltYWwgbnVtYmVyCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgVVJMRGVjb2RlKGJ5dGVbXSBieXRlcywgU3RyaW5nIGVuYykgeworCisgICAgICAgIGlmIChieXRlcyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKworICAgICAgICBpbnQgbGVuID0gYnl0ZXMubGVuZ3RoOworICAgICAgICBpbnQgaXggPSAwOworICAgICAgICBpbnQgb3ggPSAwOworICAgICAgICB3aGlsZSAoaXggPCBsZW4pIHsKKyAgICAgICAgICAgIGJ5dGUgYiA9IGJ5dGVzW2l4KytdOyAgICAgLy8gR2V0IGJ5dGUgdG8gdGVzdAorICAgICAgICAgICAgaWYgKGIgPT0gJysnKSB7CisgICAgICAgICAgICAgICAgYiA9IChieXRlKScgJzsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYiA9PSAnJScpIHsKKyAgICAgICAgICAgICAgICBiID0gKGJ5dGUpICgoY29udmVydEhleERpZ2l0KGJ5dGVzW2l4KytdKSA8PCA0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY29udmVydEhleERpZ2l0KGJ5dGVzW2l4KytdKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBieXRlc1tveCsrXSA9IGI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVuYyAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGJ5dGVzLCAwLCBveCwgZW5jKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhieXRlcywgMCwgb3gpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IGEgYnl0ZSBjaGFyYWN0ZXIgdmFsdWUgdG8gaGV4aWRlY2ltYWwgZGlnaXQgdmFsdWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYiB0aGUgY2hhcmFjdGVyIHZhbHVlIGJ5dGUKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBieXRlIGNvbnZlcnRIZXhEaWdpdCggYnl0ZSBiICkgeworICAgICAgICBpZiAoKGIgPj0gJzAnKSAmJiAoYiA8PSAnOScpKSByZXR1cm4gKGJ5dGUpKGIgLSAnMCcpOworICAgICAgICBpZiAoKGIgPj0gJ2EnKSAmJiAoYiA8PSAnZicpKSByZXR1cm4gKGJ5dGUpKGIgLSAnYScgKyAxMCk7CisgICAgICAgIGlmICgoYiA+PSAnQScpICYmIChiIDw9ICdGJykpIHJldHVybiAoYnl0ZSkoYiAtICdBJyArIDEwKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBQdXQgbmFtZSBhbmQgdmFsdWUgcGFpciBpbiBtYXAuICBXaGVuIG5hbWUgYWxyZWFkeSBleGlzdCwgYWRkIHZhbHVlCisgICAgICogdG8gYXJyYXkgb2YgdmFsdWVzLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcCBUaGUgbWFwIHRvIHBvcHVsYXRlCisgICAgICogQHBhcmFtIG5hbWUgVGhlIHBhcmFtZXRlciBuYW1lCisgICAgICogQHBhcmFtIHZhbHVlIFRoZSBwYXJhbWV0ZXIgdmFsdWUKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHB1dE1hcEVudHJ5KCBNYXAgbWFwLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIFN0cmluZ1tdIG5ld1ZhbHVlcyA9IG51bGw7CisgICAgICAgIFN0cmluZ1tdIG9sZFZhbHVlcyA9IChTdHJpbmdbXSkgbWFwLmdldChuYW1lKTsKKyAgICAgICAgaWYgKG9sZFZhbHVlcyA9PSBudWxsKSB7CisgICAgICAgICAgICBuZXdWYWx1ZXMgPSBuZXcgU3RyaW5nWzFdOworICAgICAgICAgICAgbmV3VmFsdWVzWzBdID0gdmFsdWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBuZXdWYWx1ZXMgPSBuZXcgU3RyaW5nW29sZFZhbHVlcy5sZW5ndGggKyAxXTsKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkob2xkVmFsdWVzLCAwLCBuZXdWYWx1ZXMsIDAsIG9sZFZhbHVlcy5sZW5ndGgpOworICAgICAgICAgICAgbmV3VmFsdWVzW29sZFZhbHVlcy5sZW5ndGhdID0gdmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgbWFwLnB1dChuYW1lLCBuZXdWYWx1ZXMpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQXBwZW5kIHJlcXVlc3QgcGFyYW1ldGVycyBmcm9tIHRoZSBzcGVjaWZpZWQgU3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBNYXAuICBJdCBpcyBwcmVzdW1lZCB0aGF0IHRoZSBzcGVjaWZpZWQgTWFwIGlzIG5vdCBhY2Nlc3NlZCBmcm9tIGFueQorICAgICAqIG90aGVyIHRocmVhZCwgc28gbm8gc3luY2hyb25pemF0aW9uIGlzIHBlcmZvcm1lZC4KKyAgICAgKiA8cD4KKyAgICAgKiA8c3Ryb25nPklNUExFTUVOVEFUSU9OIE5PVEU8L3N0cm9uZz46ICBVUkwgZGVjb2RpbmcgaXMgcGVyZm9ybWVkCisgICAgICogaW5kaXZpZHVhbGx5IG9uIHRoZSBwYXJzZWQgbmFtZSBhbmQgdmFsdWUgZWxlbWVudHMsIHJhdGhlciB0aGFuIG9uCisgICAgICogdGhlIGVudGlyZSBxdWVyeSBzdHJpbmcgYWhlYWQgb2YgdGltZSwgdG8gcHJvcGVybHkgZGVhbCB3aXRoIHRoZSBjYXNlCisgICAgICogd2hlcmUgdGhlIG5hbWUgb3IgdmFsdWUgaW5jbHVkZXMgYW4gZW5jb2RlZCAiPSIgb3IgIiYiIGNoYXJhY3RlcgorICAgICAqIHRoYXQgd291bGQgb3RoZXJ3aXNlIGJlIGludGVycHJldGVkIGFzIGEgZGVsaW1pdGVyLgorICAgICAqCisgICAgICogTk9URTogYnl0ZSBhcnJheSBkYXRhIGlzIG1vZGlmaWVkIGJ5IHRoaXMgbWV0aG9kLiAgQ2FsbGVyIGJld2FyZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXAgTWFwIHRoYXQgYWNjdW11bGF0ZXMgdGhlIHJlc3VsdGluZyBwYXJhbWV0ZXJzCisgICAgICogQHBhcmFtIGRhdGEgSW5wdXQgc3RyaW5nIGNvbnRhaW5pbmcgcmVxdWVzdCBwYXJhbWV0ZXJzCisgICAgICogQHBhcmFtIGVuY29kaW5nIEVuY29kaW5nIHRvIHVzZSBmb3IgY29udmVydGluZyBoZXgKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBpZiB0aGUgZGF0YSBpcyBtYWxmb3JtZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcGFyc2VQYXJhbWV0ZXJzKE1hcCBtYXAsIGJ5dGVbXSBkYXRhLCBTdHJpbmcgZW5jb2RpbmcpCisgICAgICAgIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAoZGF0YSAhPSBudWxsICYmIGRhdGEubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgaW50ICAgIHBvcyA9IDA7CisgICAgICAgICAgICBpbnQgICAgaXggPSAwOworICAgICAgICAgICAgaW50ICAgIG94ID0gMDsKKyAgICAgICAgICAgIFN0cmluZyBrZXkgPSBudWxsOworICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gbnVsbDsKKyAgICAgICAgICAgIHdoaWxlIChpeCA8IGRhdGEubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgYnl0ZSBjID0gZGF0YVtpeCsrXTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKChjaGFyKSBjKSB7CisgICAgICAgICAgICAgICAgY2FzZSAnJic6CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gbmV3IFN0cmluZyhkYXRhLCAwLCBveCwgZW5jb2RpbmcpOworICAgICAgICAgICAgICAgICAgICBpZiAoa2V5ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1dE1hcEVudHJ5KG1hcCwga2V5LCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBudWxsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG94ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnPSc6CisgICAgICAgICAgICAgICAgICAgIGlmIChrZXkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gbmV3IFN0cmluZyhkYXRhLCAwLCBveCwgZW5jb2RpbmcpOworICAgICAgICAgICAgICAgICAgICAgICAgb3ggPSAwOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVtveCsrXSA9IGM7CisgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgCisgICAgICAgICAgICAgICAgY2FzZSAnKyc6CisgICAgICAgICAgICAgICAgICAgIGRhdGFbb3grK10gPSAoYnl0ZSknICc7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJyUnOgorICAgICAgICAgICAgICAgICAgICBkYXRhW294KytdID0gKGJ5dGUpKChjb252ZXJ0SGV4RGlnaXQoZGF0YVtpeCsrXSkgPDwgNCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY29udmVydEhleERpZ2l0KGRhdGFbaXgrK10pKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgZGF0YVtveCsrXSA9IGM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy9UaGUgbGFzdCB2YWx1ZSBkb2VzIG5vdCBlbmQgaW4gJyYnLiAgU28gc2F2ZSBpdCBub3cuCisgICAgICAgICAgICBpZiAoa2V5ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IG5ldyBTdHJpbmcoZGF0YSwgMCwgb3gsIGVuY29kaW5nKTsKKyAgICAgICAgICAgICAgICBwdXRNYXBFbnRyeShtYXAsIGtleSwgdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9SZXNvdXJjZVNldC5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvUmVzb3VyY2VTZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGNmMTI0Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvUmVzb3VyY2VTZXQuamF2YQpAQCAtMCwwICsxLDE4NCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsOworCisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKKworCisvKioKKyAqIEV4dGVuZGVkIGltcGxlbWVudGF0aW9uIG9mIDxzdHJvbmc+SGFzaFNldDwvc3Ryb25nPiB0aGF0IGluY2x1ZGVzIGEKKyAqIDxjb2RlPmxvY2tlZDwvY29kZT4gcHJvcGVydHkuICBUaGlzIGNsYXNzIGNhbiBiZSB1c2VkIHRvIHNhZmVseSBleHBvc2UKKyAqIHJlc291cmNlIHBhdGggc2V0cyB0byB1c2VyIGNsYXNzZXMgd2l0aG91dCBoYXZpbmcgdG8gY2xvbmUgdGhlbSBpbiBvcmRlcgorICogdG8gYXZvaWQgbW9kaWZpY2F0aW9ucy4gIFdoZW4gZmlyc3QgY3JlYXRlZCwgYSA8Y29kZT5SZXNvdXJjZU1hcDwvY29kZT4KKyAqIGlzIG5vdCBsb2NrZWQuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBSZXNvdXJjZVNldCBleHRlbmRzIEhhc2hTZXQgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3LCBlbXB0eSBzZXQgd2l0aCB0aGUgZGVmYXVsdCBpbml0aWFsIGNhcGFjaXR5IGFuZAorICAgICAqIGxvYWQgZmFjdG9yLgorICAgICAqLworICAgIHB1YmxpYyBSZXNvdXJjZVNldCgpIHsKKworICAgICAgICBzdXBlcigpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcsIGVtcHR5IHNldCB3aXRoIHRoZSBzcGVjaWZpZWQgaW5pdGlhbCBjYXBhY2l0eSBhbmQKKyAgICAgKiBkZWZhdWx0IGxvYWQgZmFjdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIGluaXRpYWxDYXBhY2l0eSBUaGUgaW5pdGlhbCBjYXBhY2l0eSBvZiB0aGlzIHNldAorICAgICAqLworICAgIHB1YmxpYyBSZXNvdXJjZVNldChpbnQgaW5pdGlhbENhcGFjaXR5KSB7CisKKyAgICAgICAgc3VwZXIoaW5pdGlhbENhcGFjaXR5KTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3LCBlbXB0eSBzZXQgd2l0aCB0aGUgc3BlY2lmaWVkIGluaXRpYWwgY2FwYWNpdHkgYW5kCisgICAgICogbG9hZCBmYWN0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5pdGlhbENhcGFjaXR5IFRoZSBpbml0aWFsIGNhcGFjaXR5IG9mIHRoaXMgc2V0CisgICAgICogQHBhcmFtIGxvYWRGYWN0b3IgVGhlIGxvYWQgZmFjdG9yIG9mIHRoaXMgc2V0CisgICAgICovCisgICAgcHVibGljIFJlc291cmNlU2V0KGludCBpbml0aWFsQ2FwYWNpdHksIGZsb2F0IGxvYWRGYWN0b3IpIHsKKworICAgICAgICBzdXBlcihpbml0aWFsQ2FwYWNpdHksIGxvYWRGYWN0b3IpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgc2V0IHdpdGggdGhlIHNhbWUgY29udGVudHMgYXMgdGhlIGV4aXN0aW5nIGNvbGxlY3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29sbCBUaGUgY29sbGVjdGlvbiB3aG9zZSBjb250ZW50cyB3ZSBzaG91bGQgY29weQorICAgICAqLworICAgIHB1YmxpYyBSZXNvdXJjZVNldChDb2xsZWN0aW9uIGNvbGwpIHsKKworICAgICAgICBzdXBlcihjb2xsKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBjdXJyZW50IGxvY2sgc3RhdGUgb2YgdGhpcyBwYXJhbWV0ZXIgbWFwLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBsb2NrZWQgPSBmYWxzZTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBsb2NrZWQgc3RhdGUgb2YgdGhpcyBwYXJhbWV0ZXIgbWFwLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzTG9ja2VkKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5sb2NrZWQpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGxvY2tlZCBzdGF0ZSBvZiB0aGlzIHBhcmFtZXRlciBtYXAuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbG9ja2VkIFRoZSBuZXcgbG9ja2VkIHN0YXRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TG9ja2VkKGJvb2xlYW4gbG9ja2VkKSB7CisKKyAgICAgICAgdGhpcy5sb2NrZWQgPSBsb2NrZWQ7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSBzdHJpbmcgbWFuYWdlciBmb3IgdGhpcyBwYWNrYWdlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ01hbmFnZXIgc20gPQorICAgICAgICBTdHJpbmdNYW5hZ2VyLmdldE1hbmFnZXIoIm9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbCIpOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogQWRkIHRoZSBzcGVjaWZpZWQgZWxlbWVudCB0byB0aGlzIHNldCBpZiBpdCBpcyBub3QgYWxyZWFkeSBwcmVzZW50LgorICAgICAqIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZWxlbWVudCB3YXMgYWRkZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbyBUaGUgb2JqZWN0IHRvIGJlIGFkZGVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGlzIFJlc291cmNlU2V0IGlzIGxvY2tlZAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGFkZChPYmplY3QgbykgeworCisgICAgICAgIGlmIChsb2NrZWQpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInJlc291cmNlU2V0LmxvY2tlZCIpKTsKKyAgICAgICAgcmV0dXJuIChzdXBlci5hZGQobykpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYWxsIG9mIHRoZSBlbGVtZW50cyBmcm9tIHRoaXMgc2V0LgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhpcyBSZXNvdXJjZVNldCBpcyBsb2NrZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKworICAgICAgICBpZiAobG9ja2VkKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJyZXNvdXJjZVNldC5sb2NrZWQiKSk7CisgICAgICAgIHN1cGVyLmNsZWFyKCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGUgZ2l2ZW4gZWxlbWVudCBmcm9tIHRoaXMgc2V0IGlmIGl0IGlzIHByZXNlbnQuCisgICAgICogUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBlbGVtZW50IHdhcyByZW1vdmVkLgorICAgICAqCisgICAgICogQHBhcmFtIG8gVGhlIG9iamVjdCB0byBiZSByZW1vdmVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGlzIFJlc291cmNlU2V0IGlzIGxvY2tlZAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3QgbykgeworCisgICAgICAgIGlmIChsb2NrZWQpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInJlc291cmNlU2V0LmxvY2tlZCIpKTsKKyAgICAgICAgcmV0dXJuIChzdXBlci5yZW1vdmUobykpOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL1NjaGVtYVJlc29sdmVyLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9TY2hlbWFSZXNvbHZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhNjZkZTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9TY2hlbWFSZXNvbHZlci5qYXZhCkBAIC0wLDAgKzEsMTMzIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbDsKKworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvbWNhdC51dGlsLmRpZ2VzdGVyLkRpZ2VzdGVyOworaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOworaW1wb3J0IG9yZy54bWwuc2F4LkVudGl0eVJlc29sdmVyOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKKworLyoqCisgKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgYSBsb2NhbCBTQVgncyA8Y29kZT5FbnRpdHlSZXNvbHZlcjwvY29kZT4uIEFsbAorICogRFREcyBhbmQgc2NoZW1hcyB1c2VkIHRvIHZhbGlkYXRlIHRoZSB3ZWIueG1sIGZpbGUgd2lsbCByZS1kaXJlY3RlZAorICogdG8gYSBsb2NhbCBmaWxlIHN0b3JlZCBpbiB0aGUgc2VydmxldC1hcGkuamFyIGFuZCBqc3AtYXBpLmphci4KKyAqCisgKiBAYXV0aG9yIEplYW4tRnJhbmNvaXMgQXJjYW5kCisgKi8KK3B1YmxpYyBjbGFzcyBTY2hlbWFSZXNvbHZlciBpbXBsZW1lbnRzIEVudGl0eVJlc29sdmVyIHsKKworICAgIC8qKgorICAgICAqIFRoZSBkaXNnZXN0ZXIgaW5zdGFuY2UgZm9yIHdoaWNoIHRoaXMgY2xhc3MgaXMgdGhlIGVudGl0eSByZXNvbHZlci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRGlnZXN0ZXIgZGlnZXN0ZXI7CisKKworICAgIC8qKgorICAgICAqIFRoZSBVUkxzIG9mIGR0ZHMgYW5kIHNjaGVtYXMgdGhhdCBoYXZlIGJlZW4gcmVnaXN0ZXJlZCwga2V5ZWQgYnkgdGhlCisgICAgICogcHVibGljIGlkZW50aWZpZXIgdGhhdCBjb3JyZXNwb25kcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgSGFzaE1hcCBlbnRpdHlWYWxpZGF0b3IgPSBuZXcgSGFzaE1hcCgpOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgcHVibGljIGlkZW50aWZpZXIgb2YgdGhlIERURCB3ZSBhcmUgY3VycmVudGx5IHBhcnNpbmcgdW5kZXIKKyAgICAgKiAoaWYgYW55KS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHB1YmxpY0lkID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogRXh0ZW5zaW9uIHRvIG1ha2UgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBEVEQgYW5kIFNjaGVtYS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHNjaGVtYUV4dGVuc2lvbiA9ICJ4c2QiOworCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgPGNvZGU+RW50aXR5UmVzb2x2ZXI8L2NvZGU+IHRoYXQgd2lsbCByZWRpcmVjdAorICAgICAqIGFsbCByZW1vdGUgZHRkcyBhbmQgc2NoZW1hIHRvIGEgbG9jYXQgZGVzdGluYXRpb24uCisgICAgICogQHBhcmFtIGRpZ2VzdGVyIFRoZSBkaWdlc3RlciBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2NoZW1hUmVzb2x2ZXIoRGlnZXN0ZXIgZGlnZXN0ZXIpIHsKKyAgICAgICAgdGhpcy5kaWdlc3RlciA9IGRpZ2VzdGVyOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVnaXN0ZXIgdGhlIHNwZWNpZmllZCBEVEQvU2NoZW1hIFVSTCBmb3IgdGhlIHNwZWNpZmllZCBwdWJsaWMKKyAgICAgKiBpZGVudGlmaWVyLiBUaGlzIG11c3QgYmUgY2FsbGVkIGJlZm9yZSB0aGUgZmlyc3QgY2FsbCB0bworICAgICAqIDxjb2RlPnBhcnNlKCk8L2NvZGU+LgorICAgICAqCisgICAgICogV2hlbiBhZGRpbmcgYSBzY2hlbWEgZmlsZSAoKi54c2QpLCBvbmx5IHRoZSBuYW1lIG9mIHRoZSBmaWxlCisgICAgICogd2lsbCBnZXQgYWRkZWQuIElmIHR3byBzY2hlbWFzIHdpdGggdGhlIHNhbWUgbmFtZSBhcmUgYWRkZWQsCisgICAgICogb25seSB0aGUgbGFzdCBvbmUgd2lsbCBiZSBzdG9yZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHVibGljSWQgUHVibGljIGlkZW50aWZpZXIgb2YgdGhlIERURCB0byBiZSByZXNvbHZlZAorICAgICAqIEBwYXJhbSBlbnRpdHlVUkwgVGhlIFVSTCB0byB1c2UgZm9yIHJlYWRpbmcgdGhpcyBEVEQKKyAgICAgKi8KKyAgICAgcHVibGljIHZvaWQgcmVnaXN0ZXIoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgZW50aXR5VVJMKSB7CisgICAgICAgICBTdHJpbmcga2V5ID0gcHVibGljSWQ7CisgICAgICAgICBpZiAocHVibGljSWQuaW5kZXhPZihzY2hlbWFFeHRlbnNpb24pICE9IC0xKQorICAgICAgICAgICAgIGtleSA9IHB1YmxpY0lkLnN1YnN0cmluZyhwdWJsaWNJZC5sYXN0SW5kZXhPZignLycpKzEpOworICAgICAgICAgZW50aXR5VmFsaWRhdG9yLnB1dChrZXksIGVudGl0eVVSTCk7CisgICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVzb2x2ZSB0aGUgcmVxdWVzdGVkIGV4dGVybmFsIGVudGl0eS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwdWJsaWNJZCBUaGUgcHVibGljIGlkZW50aWZpZXIgb2YgdGhlIGVudGl0eSBiZWluZyByZWZlcmVuY2VkCisgICAgICogQHBhcmFtIHN5c3RlbUlkIFRoZSBzeXN0ZW0gaWRlbnRpZmllciBvZiB0aGUgZW50aXR5IGJlaW5nIHJlZmVyZW5jZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gU0FYRXhjZXB0aW9uIGlmIGEgcGFyc2luZyBleGNlcHRpb24gb2NjdXJzCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgSW5wdXRTb3VyY2UgcmVzb2x2ZUVudGl0eShTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkKKyAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKHB1YmxpY0lkICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMucHVibGljSWQgPSBwdWJsaWNJZDsKKyAgICAgICAgICAgIGRpZ2VzdGVyLnNldFB1YmxpY0lkKHB1YmxpY0lkKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEhhcyB0aGlzIHN5c3RlbSBpZGVudGlmaWVyIGJlZW4gcmVnaXN0ZXJlZD8KKyAgICAgICAgU3RyaW5nIGVudGl0eVVSTCA9IG51bGw7CisgICAgICAgIGlmIChwdWJsaWNJZCAhPSBudWxsKSB7CisgICAgICAgICAgICBlbnRpdHlVUkwgPSAoU3RyaW5nKSBlbnRpdHlWYWxpZGF0b3IuZ2V0KHB1YmxpY0lkKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlZGlyZWN0IHRoZSBzY2hlbWEgbG9jYXRpb24gdG8gYSBsb2NhbCBkZXN0aW5hdGlvbgorICAgICAgICBTdHJpbmcga2V5ID0gbnVsbDsKKyAgICAgICAgaWYgKGVudGl0eVVSTCA9PSBudWxsICYmIHN5c3RlbUlkICE9IG51bGwpIHsKKyAgICAgICAgICAgIGtleSA9IHN5c3RlbUlkLnN1YnN0cmluZyhzeXN0ZW1JZC5sYXN0SW5kZXhPZignLycpKzEpOworICAgICAgICAgICAgZW50aXR5VVJMID0gKFN0cmluZyllbnRpdHlWYWxpZGF0b3IuZ2V0KGtleSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZW50aXR5VVJMID09IG51bGwpIHsKKyAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gKG5ldyBJbnB1dFNvdXJjZShlbnRpdHlVUkwpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTQVhFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvU2VydmVySW5mby5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvU2VydmVySW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1YmExZmQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9TZXJ2ZXJJbmZvLmphdmEKQEAgLTAsMCArMSwxMjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbDsKKworCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworCisvKioKKyAqIFNpbXBsZSB1dGlsaXR5IG1vZHVsZSB0byBtYWtlIGl0IGVhc3kgdG8gcGx1ZyBpbiB0aGUgc2VydmVyIGlkZW50aWZpZXIKKyAqIHdoZW4gaW50ZWdyYXRpbmcgVG9tY2F0LgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgU2VydmVySW5mbyB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU3RhdGljIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc2VydmVyIGluZm9ybWF0aW9uIFN0cmluZyB3aXRoIHdoaWNoIHdlIGlkZW50aWZ5IG91cnNlbHZlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgc2VydmVySW5mbyA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBUaGUgc2VydmVyIGJ1aWx0IFN0cmluZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgc2VydmVyQnVpbHQgPSBudWxsOworCisgICAgLyoqCisgICAgICogVGhlIHNlcnZlcidzIHZlcnNpb24gbnVtYmVyIFN0cmluZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgc2VydmVyTnVtYmVyID0gbnVsbDsKKworICAgIHN0YXRpYyB7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIElucHV0U3RyZWFtIGlzID0gU2VydmVySW5mby5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtCisgICAgICAgICAgICAgICAgKCIvb3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL1NlcnZlckluZm8ucHJvcGVydGllcyIpOworICAgICAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgICAgICBwcm9wcy5sb2FkKGlzKTsKKyAgICAgICAgICAgIGlzLmNsb3NlKCk7CisgICAgICAgICAgICBzZXJ2ZXJJbmZvID0gcHJvcHMuZ2V0UHJvcGVydHkoInNlcnZlci5pbmZvIik7CisgICAgICAgICAgICBzZXJ2ZXJCdWlsdCA9IHByb3BzLmdldFByb3BlcnR5KCJzZXJ2ZXIuYnVpbHQiKTsKKyAgICAgICAgICAgIHNlcnZlck51bWJlciA9IHByb3BzLmdldFByb3BlcnR5KCJzZXJ2ZXIubnVtYmVyIik7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNlcnZlckluZm8gPT0gbnVsbCkKKyAgICAgICAgICAgIHNlcnZlckluZm8gPSAiQXBhY2hlIFRvbWNhdCI7CisgICAgICAgIGlmIChzZXJ2ZXJCdWlsdCA9PSBudWxsKQorICAgICAgICAgICAgc2VydmVyQnVpbHQgPSAidW5rbm93biI7CisgICAgICAgIGlmIChzZXJ2ZXJOdW1iZXIgPT0gbnVsbCkKKyAgICAgICAgICAgIHNlcnZlck51bWJlciA9ICI1LjUuMC4wIjsKKyAgICAgICAgCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXJ2ZXIgaWRlbnRpZmljYXRpb24gZm9yIHRoaXMgdmVyc2lvbiBvZiBUb21jYXQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U2VydmVySW5mbygpIHsKKworICAgICAgICByZXR1cm4gKHNlcnZlckluZm8pOworCisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXJ2ZXIgYnVpbHQgdGltZSBmb3IgdGhpcyB2ZXJzaW9uIG9mIFRvbWNhdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTZXJ2ZXJCdWlsdCgpIHsKKworICAgICAgICByZXR1cm4gKHNlcnZlckJ1aWx0KTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2VydmVyJ3MgdmVyc2lvbiBudW1iZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U2VydmVyTnVtYmVyKCkgeworCisgICAgICAgIHJldHVybiAoc2VydmVyTnVtYmVyKTsKKworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTZXJ2ZXIgdmVyc2lvbjogIiArIGdldFNlcnZlckluZm8oKSk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU2VydmVyIGJ1aWx0OiAgICIgKyBnZXRTZXJ2ZXJCdWlsdCgpKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTZXJ2ZXIgbnVtYmVyOiAgIiArIGdldFNlcnZlck51bWJlcigpKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPUyBOYW1lOiAgICAgICAgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKSk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT1MgVmVyc2lvbjogICAgICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnR5KCJvcy52ZXJzaW9uIikpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkFyY2hpdGVjdHVyZTogICAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MuYXJjaCIpKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJKVk0gVmVyc2lvbjogICAgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEucnVudGltZS52ZXJzaW9uIikpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkpWTSBWZW5kb3I6ICAgICAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS52bS52ZW5kb3IiKSk7ICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9TZXJ2ZXJJbmZvLnByb3BlcnRpZXMgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9TZXJ2ZXJJbmZvLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI0YWZiMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL1NlcnZlckluZm8ucHJvcGVydGllcwpAQCAtMCwwICsxLDMgQEAKK3NlcnZlci5pbmZvPUFwYWNoZSBUb21jYXQvQFZFUlNJT05ACitzZXJ2ZXIubnVtYmVyPUBWRVJTSU9OX05VTUJFUkAKK3NlcnZlci5idWlsdD1AVkVSU0lPTl9CVUlMVEAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9TdHJmdGltZS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvU3RyZnRpbWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjY5NzcxCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvU3RyZnRpbWUuamF2YQpAQCAtMCwwICsxLDI2MiBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbDsKKworaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLlRpbWVab25lOworCisvKioKKyAqIENvbnZlcnRzIGRhdGVzIHRvIHN0cmluZ3MgdXNpbmcgdGhlIHNhbWUgZm9ybWF0IHNwZWNpZmllcnMgYXMgc3RyZnRpbWUKKyAqCisgKiBOb3RlOiBUaGlzIGRvZXMgbm90IG1pbWljIHN0cmZ0aW1lIHBlcmZlY3RseS4gIENlcnRhaW4gc3RyZnRpbWUgY29tbWFuZHMsIAorICogICAgICAgYXJlIG5vdCBzdXBwb3J0ZWQsIGFuZCB3aWxsIGNvbnZlcnQgYXMgaWYgdGhleSB3ZXJlIGxpdGVyYWxzLgorICoKKyAqICAgICAgIENlcnRhaW4gY29tcGxpY2F0ZWQgY29tbWFuZHMsIGxpa2UgdGhvc2UgZGVhbGluZyB3aXRoIHRoZSB3ZWVrIG9mIHRoZSB5ZWFyCisgKiAgICAgICBwcm9iYWJseSBkb24ndCBoYXZlIGV4YWN0bHkgdGhlIHNhbWUgYmVoYXZpb3IgYXMgc3RyZnRpbWUuCisgKgorICogICAgICAgVGhlc2UgbGltaXRhdGlvbnMgYXJlIGR1ZSB0byB1c2UgU2ltcGxlRGF0ZVRpbWUuICBJZiB0aGUgY29udmVyc2lvbiB3YXMgZG9uZQorICogICAgICAgbWFudWFsbHksIGFsbCB0aGVzZSBsaW1pdGF0aW9ucyBjb3VsZCBiZSBlbGltaW5hdGVkLgorICoKKyAqICAgICAgIFRoZSBpbnRlcmZhY2UgbG9va3MgbGlrZSBhIHN1YnNldCBvZiBEYXRlRm9ybWF0LiAgTWF5YmUgc29tZWRheSBzb21lb25lIHdpbGwgbWFrZSB0aGlzIGNsYXNzCisgKiAgICAgICBleHRlbmQgRGF0ZUZvcm1hdC4KKyAqCisgKiBAYXV0aG9yIEJpcCBUaGVsaW4KKyAqIEBhdXRob3IgRGFuIFNhbmRiZXJnCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kLCAkRGF0ZSQKKyAqLworcHVibGljIGNsYXNzIFN0cmZ0aW1lIHsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIFByb3BlcnRpZXMgdHJhbnNsYXRlOworICAgIHByb3RlY3RlZCBTaW1wbGVEYXRlRm9ybWF0IHNpbXBsZURhdGVGb3JtYXQ7CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIG91ciBwYXR0ZXJuIHRyYW5zbGF0aW9uCisgICAgICovCisgICAgc3RhdGljIHsKKyAgICAgICAgdHJhbnNsYXRlID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgdHJhbnNsYXRlLnB1dCgiYSIsIkVFRSIpOworICAgICAgICB0cmFuc2xhdGUucHV0KCJBIiwiRUVFRSIpOworICAgICAgICB0cmFuc2xhdGUucHV0KCJiIiwiTU1NIik7CisgICAgICAgIHRyYW5zbGF0ZS5wdXQoIkIiLCJNTU1NIik7CisgICAgICAgIHRyYW5zbGF0ZS5wdXQoImMiLCJFRUUgTU1NIGQgSEg6bW06c3MgeXl5eSIpOworCisgICAgICAgIC8vVGhlcmUncyBubyB3YXkgdG8gc3BlY2lmeSB0aGUgY2VudHVyeSBpbiBTaW1wbGVEYXRlRm9ybWF0LiAgV2UgZG9uJ3Qgd2FudCB0byBoYXJkLWNvZGUKKyAgICAgICAgLy8yMCBzaW5jZSB0aGlzIGNvdWxkIGJlIHdyb25nIGZvciB0aGUgcHJlLTIwMDAgZmlsZXMuCisgICAgICAgIC8vdHJhbnNsYXRlLnB1dCgiQyIsICIyMCIpOworICAgICAgICB0cmFuc2xhdGUucHV0KCJkIiwiZGQiKTsKKyAgICAgICAgdHJhbnNsYXRlLnB1dCgiRCIsIk1NL2RkL3l5Iik7CisgICAgICAgIHRyYW5zbGF0ZS5wdXQoImUiLCJkZCIpOyAvL3dpbGwgc2hvdyBhcyAnMDMnIGluc3RlYWQgb2YgJyAzJworICAgICAgICB0cmFuc2xhdGUucHV0KCJGIiwieXl5eS1NTS1kZCIpOworICAgICAgICB0cmFuc2xhdGUucHV0KCJnIiwieXkiKTsKKyAgICAgICAgdHJhbnNsYXRlLnB1dCgiRyIsInl5eXkiKTsKKyAgICAgICAgdHJhbnNsYXRlLnB1dCgiSCIsIkhIIik7CisgICAgICAgIHRyYW5zbGF0ZS5wdXQoImgiLCJNTU0iKTsKKyAgICAgICAgdHJhbnNsYXRlLnB1dCgiSSIsImhoIik7CisgICAgICAgIHRyYW5zbGF0ZS5wdXQoImoiLCJEREQiKTsKKyAgICAgICAgdHJhbnNsYXRlLnB1dCgiayIsIkhIIik7IC8vd2lsbCBzaG93IGFzICcwNycgaW5zdGVhZCBvZiAnIDcnCisgICAgICAgIHRyYW5zbGF0ZS5wdXQoImwiLCJoaCIpOyAvL3dpbGwgc2hvdyBhcyAnMDcnIGluc3RlYWQgb2YgJyA3JworICAgICAgICB0cmFuc2xhdGUucHV0KCJtIiwiTU0iKTsKKyAgICAgICAgdHJhbnNsYXRlLnB1dCgiTSIsIm1tIik7CisgICAgICAgIHRyYW5zbGF0ZS5wdXQoIm4iLCJcbiIpOworICAgICAgICB0cmFuc2xhdGUucHV0KCJwIiwiYSIpOworICAgICAgICB0cmFuc2xhdGUucHV0KCJQIiwiYSIpOyAgLy93aWxsIHNob3cgYXMgcG0gaW5zdGVhZCBvZiBQTQorICAgICAgICB0cmFuc2xhdGUucHV0KCJyIiwiaGg6bW06c3MgYSIpOworICAgICAgICB0cmFuc2xhdGUucHV0KCJSIiwiSEg6bW0iKTsKKyAgICAgICAgLy9UaGVyZSdzIG5vIHdheSB0byBzcGVjaWZ5IHRoaXMgd2l0aCBTaW1wbGVEYXRlRm9ybWF0CisgICAgICAgIC8vdHJhbnNsYXRlLnB1dCgicyIsInNlY29uZHMgc2luY2UgZWNwb2NoIik7CisgICAgICAgIHRyYW5zbGF0ZS5wdXQoIlMiLCJzcyIpOworICAgICAgICB0cmFuc2xhdGUucHV0KCJ0IiwiXHQiKTsKKyAgICAgICAgdHJhbnNsYXRlLnB1dCgiVCIsIkhIOm1tOnNzIik7CisgICAgICAgIC8vVGhlcmUncyBubyB3YXkgdG8gc3BlY2lmeSB0aGlzIHdpdGggU2ltcGxlRGF0ZUZvcm1hdAorICAgICAgICAvL3RyYW5zbGF0ZS5wdXQoInUiLCJkYXkgb2Ygd2VlayAoIDEtNyApIik7CisKKyAgICAgICAgLy9UaGVyZSdzIG5vIHdheSB0byBzcGVjaWZ5IHRoaXMgd2l0aCBTaW1wbGVEYXRlRm9ybWF0CisgICAgICAgIC8vdHJhbnNsYXRlLnB1dCgiVSIsIndlZWsgaW4geWVhciB3aXRoIGZpcnN0IHN1bmRheSBhcyBmaXJzdCBkYXkuLi4iKTsKKworICAgICAgICB0cmFuc2xhdGUucHV0KCJWIiwid3ciKTsgLy9JJ20gbm90IHN1cmUgdGhpcyBpcyBhbHdheXMgZXhhY3RseSB0aGUgc2FtZQorCisgICAgICAgIC8vVGhlcmUncyBubyB3YXkgdG8gc3BlY2lmeSB0aGlzIHdpdGggU2ltcGxlRGF0ZUZvcm1hdAorICAgICAgICAvL3RyYW5zbGF0ZS5wdXQoIlciLCJ3ZWVrIGluIHllYXIgd2l0aCBmaXJzdCBtb25kYXkgYXMgZmlyc3QgZGF5Li4uIik7CisKKyAgICAgICAgLy9UaGVyZSdzIG5vIHdheSB0byBzcGVjaWZ5IHRoaXMgd2l0aCBTaW1wbGVEYXRlRm9ybWF0CisgICAgICAgIC8vdHJhbnNsYXRlLnB1dCgidyIsIkUiKTsKKyAgICAgICAgdHJhbnNsYXRlLnB1dCgiWCIsIkhIOm1tOnNzIik7CisgICAgICAgIHRyYW5zbGF0ZS5wdXQoIngiLCJNTS9kZC95eSIpOworICAgICAgICB0cmFuc2xhdGUucHV0KCJ5IiwieXkiKTsKKyAgICAgICAgdHJhbnNsYXRlLnB1dCgiWSIsInl5eXkiKTsKKyAgICAgICAgdHJhbnNsYXRlLnB1dCgiWiIsInoiKTsKKyAgICAgICAgdHJhbnNsYXRlLnB1dCgieiIsIloiKTsKKyAgICAgICAgdHJhbnNsYXRlLnB1dCgiJSIsIiUiKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIGRhdGUgZm9ybWF0dGluZyBjbGFzcworICAgICAqCisgICAgICogQHNlZSAjU3RyZnRpbWUoIFN0cmluZywgTG9jYWxlICkKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyZnRpbWUoIFN0cmluZyBvcmlnRm9ybWF0ICkgeworICAgICAgICBTdHJpbmcgY29udmVydGVkRm9ybWF0ID0gY29udmVydERhdGVGb3JtYXQoIG9yaWdGb3JtYXQgKTsKKyAgICAgICAgc2ltcGxlRGF0ZUZvcm1hdCA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCBjb252ZXJ0ZWRGb3JtYXQgKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBkYXRlIGZvcm1hdHRpbmcgY2xhc3MKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb3JpZ0Zvcm1hdCB0aGUgc3RyZnRpbWUtc3R5bGUgZm9ybWF0dGluZyBzdHJpbmcKKyAgICAgKiBAcGFyYW0gbG9jYWxlIHRoZSBsb2NhbGUgdG8gdXNlIGZvciBsb2NhbGUtc3BlY2lmaWMgY29udmVyc2lvbnMKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyZnRpbWUoIFN0cmluZyBvcmlnRm9ybWF0LCBMb2NhbGUgbG9jYWxlICkgeworICAgICAgICBTdHJpbmcgY29udmVydGVkRm9ybWF0ID0gY29udmVydERhdGVGb3JtYXQoIG9yaWdGb3JtYXQgKTsKKyAgICAgICAgc2ltcGxlRGF0ZUZvcm1hdCA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCBjb252ZXJ0ZWRGb3JtYXQsIGxvY2FsZSApOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZvcm1hdCB0aGUgZGF0ZSBhY2NvcmRpbmcgdG8gdGhlIHN0cmZ0aW1lLXN0eWxlIHN0cmluZyBnaXZlbiBpbiB0aGUgY29uc3RydWN0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGF0ZSB0aGUgZGF0ZSB0byBmb3JtYXQKKyAgICAgKiBAcmV0dXJuIHRoZSBmb3JtYXR0ZWQgZGF0ZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZm9ybWF0KCBEYXRlIGRhdGUgKSB7CisgICAgICAgIHJldHVybiBzaW1wbGVEYXRlRm9ybWF0LmZvcm1hdCggZGF0ZSApOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgdGltZXpvbmUgdXNlZCBmb3IgZm9ybWF0dGluZyBjb252ZXJzaW9ucworICAgICAqCisgICAgICogQHJldHVybiB0aGUgdGltZXpvbmUKKyAgICAgKi8KKyAgICBwdWJsaWMgVGltZVpvbmUgZ2V0VGltZVpvbmUoKSB7CisgICAgICAgIHJldHVybiBzaW1wbGVEYXRlRm9ybWF0LmdldFRpbWVab25lKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hhbmdlIHRoZSB0aW1lem9uZSB1c2VkIHRvIGZvcm1hdCBkYXRlcworICAgICAqCisgICAgICogQHNlZSBTaW1wbGVEYXRlRm9ybWF0I3NldFRpbWVab25lCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VGltZVpvbmUoIFRpbWVab25lIHRpbWVab25lICkgeworICAgICAgICBzaW1wbGVEYXRlRm9ybWF0LnNldFRpbWVab25lKCB0aW1lWm9uZSApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlYXJjaCB0aGUgcHJvdmlkZWQgcGF0dGVybiBhbmQgZ2V0IHRoZSBDIHN0YW5kYXJkCisgICAgICogRGF0ZS9UaW1lIGZvcm1hdHRpbmcgcnVsZXMgYW5kIGNvbnZlcnQgdGhlbSB0byB0aGUKKyAgICAgKiBKYXZhIGVxdWl2YWxlbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0dGVybiBUaGUgcGF0dGVybiB0byBzZWFyY2gKKyAgICAgKiBAcmV0dXJuIFRoZSBtb2RpZmllZCBwYXR0ZXJuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBjb252ZXJ0RGF0ZUZvcm1hdCggU3RyaW5nIHBhdHRlcm4gKSB7CisgICAgICAgIGJvb2xlYW4gaW5zaWRlID0gZmFsc2U7CisgICAgICAgIGJvb2xlYW4gbWFyayA9IGZhbHNlOworICAgICAgICBib29sZWFuIG1vZGlmaWVkQ29tbWFuZCA9IGZhbHNlOworCisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisKKyAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IHBhdHRlcm4ubGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgY2hhciBjID0gcGF0dGVybi5jaGFyQXQoaSk7CisKKyAgICAgICAgICAgIGlmICggYz09JyUnICYmICFtYXJrICkgeworICAgICAgICAgICAgICAgIG1hcms9dHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKCBtYXJrICkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIG1vZGlmaWVkQ29tbWFuZCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vZG9uJ3QgZG8gYW55dGhpbmctLXdlIGp1c3Qgd2FudGVkIHRvIHNraXAgYSBjaGFyCisgICAgICAgICAgICAgICAgICAgICAgICBtb2RpZmllZENvbW1hbmQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hcmsgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluc2lkZSA9IHRyYW5zbGF0ZUNvbW1hbmQoIGJ1ZiwgcGF0dGVybiwgaSwgaW5zaWRlICk7CisgICAgICAgICAgICAgICAgICAgICAgICAvL0l0J3MgYSBtb2RpZmllciBjb2RlCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGM9PSdPJyB8fCBjPT0nRScgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWRDb21tYW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyaz1mYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmICggIWluc2lkZSAmJiBjICE9ICcgJyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vV2Ugc3RhcnQgYSBsaXRlcmFsLCB3aGljaCB3ZSBuZWVkIHRvIHF1b3RlCisgICAgICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCInIik7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnNpZGUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKGMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICggYnVmLmxlbmd0aCgpID4gMCApIHsKKyAgICAgICAgICAgIGNoYXIgbGFzdENoYXIgPSBidWYuY2hhckF0KCBidWYubGVuZ3RoKCkgLSAxICk7CisKKyAgICAgICAgICAgIGlmKCBsYXN0Q2hhciE9J1wnJyAmJiBpbnNpZGUgKSB7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgnXCcnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFN0cmluZyBxdW90ZSggU3RyaW5nIHN0ciwgYm9vbGVhbiBpbnNpZGVRdW90ZXMgKSB7CisgICAgICAgIFN0cmluZyByZXRWYWwgPSBzdHI7CisgICAgICAgIGlmICggIWluc2lkZVF1b3RlcyApIHsKKyAgICAgICAgICAgIHJldFZhbCA9ICdcJycgKyByZXRWYWwgKyAnXCcnOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXRWYWw7CisgICAgfQorCisgICAgLyoqCisgICAgICogVHJ5IHRvIGdldCB0aGUgSmF2YSBEYXRlL1RpbWUgZm9ybWF0dGluZyBhc3NvY2lhdGVkIHdpdGgKKyAgICAgKiB0aGUgQyBzdGFuZGFyZCBwcm92aWRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBidWYgVGhlIGJ1ZmZlcgorICAgICAqIEBwYXJhbSBwYXR0ZXJuIFRoZSBkYXRlL3RpbWUgcGF0dGVybgorICAgICAqIEBwYXJhbSBpbmRleCBUaGUgY2hhciBpbmRleAorICAgICAqIEBwYXJhbSBvbGRJbnNpZGUgRmxhZyB2YWx1ZQorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiBuZXcgaXMgaW5zaWRlIGJ1ZmZlcgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIHRyYW5zbGF0ZUNvbW1hbmQoIFN0cmluZ0J1ZmZlciBidWYsIFN0cmluZyBwYXR0ZXJuLCBpbnQgaW5kZXgsIGJvb2xlYW4gb2xkSW5zaWRlICkgeworICAgICAgICBjaGFyIGZpcnN0Q2hhciA9IHBhdHRlcm4uY2hhckF0KCBpbmRleCApOworICAgICAgICBib29sZWFuIG5ld0luc2lkZSA9IG9sZEluc2lkZTsKKworICAgICAgICAvL08gYW5kIEUgYXJlIG1vZGlmaWVycywgdGhleSBtZWFuIHRvIHByZXNlbnQgYW4gYWx0ZXJuYXRpdmUgcmVwcmVzZW50YXRpb24gb2YgdGhlIG5leHQgY2hhcgorICAgICAgICAvL3dlIGp1c3QgaGFuZGxlIHRoZSBuZXh0IGNoYXIgYXMgaWYgdGhlIE8gb3IgRSB3YXNuJ3QgdGhlcmUKKyAgICAgICAgaWYgKCBmaXJzdENoYXIgPT0gJ08nIHx8IGZpcnN0Q2hhciA9PSAnRScgKSB7CisgICAgICAgICAgICBpZiAoIGluZGV4ICsgMSA8IHBhdHRlcm4ubGVuZ3RoKCkgKSB7ICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgbmV3SW5zaWRlID0gdHJhbnNsYXRlQ29tbWFuZCggYnVmLCBwYXR0ZXJuLCBpbmRleCArIDEsIG9sZEluc2lkZSApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCBxdW90ZSgiJSIgKyBmaXJzdENoYXIsIG9sZEluc2lkZSApICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBTdHJpbmcgY29tbWFuZCA9IHRyYW5zbGF0ZS5nZXRQcm9wZXJ0eSggU3RyaW5nLnZhbHVlT2YoIGZpcnN0Q2hhciApICk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vSWYgd2UgZG9uJ3QgZmluZCBhIGZvcm1hdCwgdHJlYXQgaXQgYXMgYSBsaXRlcmFsLS1UaGF0J3Mgd2hhdCBhcGFjaGUgZG9lcworICAgICAgICAgICAgaWYgKCBjb21tYW5kID09IG51bGwgKSB7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCggcXVvdGUoICIlIiArIGZpcnN0Q2hhciwgb2xkSW5zaWRlICkgKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy9JZiB3ZSB3ZXJlIGluc2lkZSBxdW90ZXMsIGNsb3NlIHRoZSBxdW90ZXMKKyAgICAgICAgICAgICAgICBpZiAoIG9sZEluc2lkZSApIHsKKyAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCggJ1wnJyApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCBjb21tYW5kICk7CisgICAgICAgICAgICAgICAgbmV3SW5zaWRlID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ld0luc2lkZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9TdHJpbmdNYW5hZ2VyLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9TdHJpbmdNYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU5NjUzNAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL1N0cmluZ01hbmFnZXIuamF2YQpAQCAtMCwwICsxLDI1MiBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsOworCitpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOworaW1wb3J0IGphdmEubmV0LlVSTENsYXNzTG9hZGVyOworCisvKioKKyAqIEFuIGludGVybmF0aW9uYWxpemF0aW9uIC8gbG9jYWxpemF0aW9uIGhlbHBlciBjbGFzcyB3aGljaCByZWR1Y2VzCisgKiB0aGUgYm90aGVyIG9mIGhhbmRsaW5nIFJlc291cmNlQnVuZGxlcyBhbmQgdGFrZXMgY2FyZSBvZiB0aGUKKyAqIGNvbW1vbiBjYXNlcyBvZiBtZXNzYWdlIGZvcm1hdGluZyB3aGljaCBvdGhlcndpc2UgcmVxdWlyZSB0aGUKKyAqIGNyZWF0aW9uIG9mIE9iamVjdCBhcnJheXMgYW5kIHN1Y2guCisgKgorICogPHA+VGhlIFN0cmluZ01hbmFnZXIgb3BlcmF0ZXMgb24gYSBwYWNrYWdlIGJhc2lzLiBPbmUgU3RyaW5nTWFuYWdlcgorICogcGVyIHBhY2thZ2UgY2FuIGJlIGNyZWF0ZWQgYW5kIGFjY2Vzc2VkIHZpYSB0aGUgZ2V0TWFuYWdlciBtZXRob2QKKyAqIGNhbGwuCisgKgorICogPHA+VGhlIFN0cmluZ01hbmFnZXIgd2lsbCBsb29rIGZvciBhIFJlc291cmNlQnVuZGxlIG5hbWVkIGJ5CisgKiB0aGUgcGFja2FnZSBuYW1lIGdpdmVuIHBsdXMgdGhlIHN1ZmZpeCBvZiAiTG9jYWxTdHJpbmdzIi4gSW4KKyAqIHByYWN0aWNlLCB0aGlzIG1lYW5zIHRoYXQgdGhlIGxvY2FsaXplZCBpbmZvcm1hdGlvbiB3aWxsIGJlIGNvbnRhaW5lZAorICogaW4gYSBMb2NhbFN0cmluZ3MucHJvcGVydGllcyBmaWxlIGxvY2F0ZWQgaW4gdGhlIHBhY2thZ2UKKyAqIGRpcmVjdG9yeSBvZiB0aGUgY2xhc3NwYXRoLgorICoKKyAqIDxwPlBsZWFzZSBzZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZSBmb3IKKyAqIG1vcmUgaW5mb3JtYXRpb24uCisgKgorICogQGF1dGhvciBKYW1lcyBEdW5jYW4gRGF2aWRzb24gW2R1bmNhbkBlbmcuc3VuLmNvbV0KKyAqIEBhdXRob3IgSmFtZXMgVG9kZCBbZ29uem9AZW5nLnN1bi5jb21dCisgKi8KKworcHVibGljIGNsYXNzIFN0cmluZ01hbmFnZXIgeworCisgICAgLyoqCisgICAgICogVGhlIFJlc291cmNlQnVuZGxlIGZvciB0aGlzIFN0cmluZ01hbmFnZXIuCisgICAgICovCisKKyAgICBwcml2YXRlIFJlc291cmNlQnVuZGxlIGJ1bmRsZTsKKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2cgbG9nPQorICAgICAgICBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5LmdldExvZyggU3RyaW5nTWFuYWdlci5jbGFzcyApOworICAgIAorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgU3RyaW5nTWFuYWdlciBmb3IgYSBnaXZlbiBwYWNrYWdlLiBUaGlzIGlzIGEKKyAgICAgKiBwcml2YXRlIG1ldGhvZCBhbmQgYWxsIGFjY2VzcyB0byBpdCBpcyBhcmJpdHJhdGVkIGJ5IHRoZQorICAgICAqIHN0YXRpYyBnZXRNYW5hZ2VyIG1ldGhvZCBjYWxsIHNvIHRoYXQgb25seSBvbmUgU3RyaW5nTWFuYWdlcgorICAgICAqIHBlciBwYWNrYWdlIHdpbGwgYmUgY3JlYXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYWNrYWdlTmFtZSBOYW1lIG9mIHBhY2thZ2UgdG8gY3JlYXRlIFN0cmluZ01hbmFnZXIgZm9yLgorICAgICAqLworCisgICAgcHJpdmF0ZSBTdHJpbmdNYW5hZ2VyKFN0cmluZyBwYWNrYWdlTmFtZSkgeworICAgICAgICBTdHJpbmcgYnVuZGxlTmFtZSA9IHBhY2thZ2VOYW1lICsgIi5Mb2NhbFN0cmluZ3MiOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKGJ1bmRsZU5hbWUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGNhdGNoKCBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZXggKSB7CisgICAgICAgICAgICAvLyBUcnkgZnJvbSB0aGUgY3VycmVudCBsb2FkZXIgKCB0aGF0J3MgdGhlIGNhc2UgZm9yIHRydXN0ZWQgYXBwcyApCisgICAgICAgICAgICBDbGFzc0xvYWRlciBjbD1UaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOworICAgICAgICAgICAgaWYoIGNsICE9IG51bGwgKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgYnVuZGxlPVJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShidW5kbGVOYW1lLCBMb2NhbGUuZ2V0RGVmYXVsdCgpLCBjbCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9IGNhdGNoKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBleDIpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiggY2w9PW51bGwgKQorICAgICAgICAgICAgICAgIGNsPXRoaXMuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpOworCisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJDYW4ndCBmaW5kIHJlc291cmNlICIgKyBidW5kbGVOYW1lICsKKyAgICAgICAgICAgICAgICAgICAgIiAiICsgY2wpOworICAgICAgICAgICAgaWYoIGNsIGluc3RhbmNlb2YgVVJMQ2xhc3NMb2FkZXIgKSB7CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSAKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCAoKFVSTENsYXNzTG9hZGVyKWNsKS5nZXRVUkxzKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGEgc3RyaW5nIGZyb20gdGhlIHVuZGVybHlpbmcgcmVzb3VyY2UgYnVuZGxlLgorICAgICAqCisgICAgICogQHBhcmFtIGtleSBUaGUgcmVzb3VyY2UgbmFtZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKKyAgICAgICAgcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldFN0cmluZ0ludGVybmFsKGtleSksIG51bGwpOworICAgIH0KKworCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRTdHJpbmdJbnRlcm5hbChTdHJpbmcga2V5KSB7CisgICAgICAgIGlmIChrZXkgPT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJrZXkgaXMgbnVsbCI7CisKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbihtc2cpOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIHN0ciA9IG51bGw7CisKKyAgICAgICAgaWYoIGJ1bmRsZT09bnVsbCApCisgICAgICAgICAgICByZXR1cm4ga2V5OworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3RyID0gYnVuZGxlLmdldFN0cmluZyhrZXkpOworICAgICAgICB9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gbXJlKSB7CisgICAgICAgICAgICBzdHIgPSAiQ2Fubm90IGZpbmQgbWVzc2FnZSBhc3NvY2lhdGVkIHdpdGgga2V5ICciICsga2V5ICsgIiciOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHN0cjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSBzdHJpbmcgZnJvbSB0aGUgdW5kZXJseWluZyByZXNvdXJjZSBidW5kbGUgYW5kIGZvcm1hdAorICAgICAqIGl0IHdpdGggdGhlIGdpdmVuIHNldCBvZiBhcmd1bWVudHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5IFRoZSByZXNvdXJjZSBuYW1lCisgICAgICogQHBhcmFtIGFyZ3MgRm9ybWF0dGluZyBkaXJlY3RpdmVzCisgICAgICovCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzKSB7CisgICAgICAgIFN0cmluZyBpU3RyaW5nID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIHZhbHVlID0gZ2V0U3RyaW5nSW50ZXJuYWwoa2V5KTsKKworICAgICAgICAvLyB0aGlzIGNoZWNrIGZvciB0aGUgcnVudGltZSBleGNlcHRpb24gaXMgc29tZSBwcmUgMS4xLjYKKyAgICAgICAgLy8gVk0ncyBkb24ndCBkbyBhbiBhdXRvbWF0aWMgdG9TdHJpbmcoKSBvbiB0aGUgcGFzc2VkIGluCisgICAgICAgIC8vIG9iamVjdHMgYW5kIGJhcmYgb3V0CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIGVuc3VyZSB0aGUgYXJndW1lbnRzIGFyZSBub3QgbnVsbCBzbyBwcmUgMS4yIFZNJ3MgZG9uJ3QgYmFyZgorICAgICAgICAgICAgT2JqZWN0IG5vbk51bGxBcmdzW10gPSBhcmdzOworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPGFyZ3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoYXJnc1tpXSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChub25OdWxsQXJncz09YXJncykgbm9uTnVsbEFyZ3M9KE9iamVjdFtdKWFyZ3MuY2xvbmUoKTsKKyAgICAgICAgICAgICAgICAgICAgbm9uTnVsbEFyZ3NbaV0gPSAibnVsbCI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpU3RyaW5nID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQodmFsdWUsIG5vbk51bGxBcmdzKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlhZSkgeworICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQodmFsdWUpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiIGFyZ1siICsgaSArICJdPSIgKyBhcmdzW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlTdHJpbmcgPSBidWYudG9TdHJpbmcoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaVN0cmluZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSBzdHJpbmcgZnJvbSB0aGUgdW5kZXJseWluZyByZXNvdXJjZSBidW5kbGUgYW5kIGZvcm1hdCBpdAorICAgICAqIHdpdGggdGhlIGdpdmVuIG9iamVjdCBhcmd1bWVudC4gVGhpcyBhcmd1bWVudCBjYW4gb2YgY291cnNlIGJlCisgICAgICogYSBTdHJpbmcgb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIGtleSBUaGUgcmVzb3VyY2UgbmFtZQorICAgICAqIEBwYXJhbSBhcmcgRm9ybWF0dGluZyBkaXJlY3RpdmUKKyAgICAgKi8KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdCBhcmcpIHsKKyAgICAgICAgT2JqZWN0W10gYXJncyA9IG5ldyBPYmplY3RbXSB7YXJnfTsKKyAgICAgICAgcmV0dXJuIGdldFN0cmluZyhrZXksIGFyZ3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhIHN0cmluZyBmcm9tIHRoZSB1bmRlcmx5aW5nIHJlc291cmNlIGJ1bmRsZSBhbmQgZm9ybWF0IGl0CisgICAgICogd2l0aCB0aGUgZ2l2ZW4gb2JqZWN0IGFyZ3VtZW50cy4gVGhlc2UgYXJndW1lbnRzIGNhbiBvZiBjb3Vyc2UKKyAgICAgKiBiZSBTdHJpbmcgb2JqZWN0cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBrZXkgVGhlIHJlc291cmNlIG5hbWUKKyAgICAgKiBAcGFyYW0gYXJnMSBGb3JtYXR0aW5nIGRpcmVjdGl2ZQorICAgICAqIEBwYXJhbSBhcmcyIEZvcm1hdHRpbmcgZGlyZWN0aXZlCisgICAgICovCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3QgYXJnMSwgT2JqZWN0IGFyZzIpIHsKKyAgICAgICAgT2JqZWN0W10gYXJncyA9IG5ldyBPYmplY3RbXSB7YXJnMSwgYXJnMn07CisgICAgICAgIHJldHVybiBnZXRTdHJpbmcoa2V5LCBhcmdzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSBzdHJpbmcgZnJvbSB0aGUgdW5kZXJseWluZyByZXNvdXJjZSBidW5kbGUgYW5kIGZvcm1hdCBpdAorICAgICAqIHdpdGggdGhlIGdpdmVuIG9iamVjdCBhcmd1bWVudHMuIFRoZXNlIGFyZ3VtZW50cyBjYW4gb2YgY291cnNlCisgICAgICogYmUgU3RyaW5nIG9iamVjdHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5IFRoZSByZXNvdXJjZSBuYW1lCisgICAgICogQHBhcmFtIGFyZzEgRm9ybWF0dGluZyBkaXJlY3RpdmUKKyAgICAgKiBAcGFyYW0gYXJnMiBGb3JtYXR0aW5nIGRpcmVjdGl2ZQorICAgICAqIEBwYXJhbSBhcmczIEZvcm1hdHRpbmcgZGlyZWN0aXZlCisgICAgICovCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3QgYXJnMSwgT2JqZWN0IGFyZzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGFyZzMpIHsKKyAgICAgICAgT2JqZWN0W10gYXJncyA9IG5ldyBPYmplY3RbXSB7YXJnMSwgYXJnMiwgYXJnM307CisgICAgICAgIHJldHVybiBnZXRTdHJpbmcoa2V5LCBhcmdzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSBzdHJpbmcgZnJvbSB0aGUgdW5kZXJseWluZyByZXNvdXJjZSBidW5kbGUgYW5kIGZvcm1hdCBpdAorICAgICAqIHdpdGggdGhlIGdpdmVuIG9iamVjdCBhcmd1bWVudHMuIFRoZXNlIGFyZ3VtZW50cyBjYW4gb2YgY291cnNlCisgICAgICogYmUgU3RyaW5nIG9iamVjdHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5IFRoZSByZXNvdXJjZSBuYW1lCisgICAgICogQHBhcmFtIGFyZzEgRm9ybWF0dGluZyBkaXJlY3RpdmUKKyAgICAgKiBAcGFyYW0gYXJnMiBGb3JtYXR0aW5nIGRpcmVjdGl2ZQorICAgICAqIEBwYXJhbSBhcmczIEZvcm1hdHRpbmcgZGlyZWN0aXZlCisgICAgICogQHBhcmFtIGFyZzQgRm9ybWF0dGluZyBkaXJlY3RpdmUKKyAgICAgKi8KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdCBhcmcxLCBPYmplY3QgYXJnMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgYXJnMywgT2JqZWN0IGFyZzQpIHsKKyAgICAgICAgT2JqZWN0W10gYXJncyA9IG5ldyBPYmplY3RbXSB7YXJnMSwgYXJnMiwgYXJnMywgYXJnNH07CisgICAgICAgIHJldHVybiBnZXRTdHJpbmcoa2V5LCBhcmdzKTsKKyAgICB9CisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBTVEFUSUMgU1VQUE9SVCBNRVRIT0RTCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIHByaXZhdGUgc3RhdGljIEhhc2h0YWJsZSBtYW5hZ2VycyA9IG5ldyBIYXNodGFibGUoKTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgU3RyaW5nTWFuYWdlciBmb3IgYSBwYXJ0aWN1bGFyIHBhY2thZ2UuIElmIGEgbWFuYWdlciBmb3IKKyAgICAgKiBhIHBhY2thZ2UgYWxyZWFkeSBleGlzdHMsIGl0IHdpbGwgYmUgcmV1c2VkLCBlbHNlIGEgbmV3CisgICAgICogU3RyaW5nTWFuYWdlciB3aWxsIGJlIGNyZWF0ZWQgYW5kIHJldHVybmVkLgorICAgICAqCisgICAgICogQHBhcmFtIHBhY2thZ2VOYW1lIFRoZSBwYWNrYWdlIG5hbWUKKyAgICAgKi8KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIFN0cmluZ01hbmFnZXIgZ2V0TWFuYWdlcihTdHJpbmcgcGFja2FnZU5hbWUpIHsKKyAgICAgICAgU3RyaW5nTWFuYWdlciBtZ3IgPSAoU3RyaW5nTWFuYWdlciltYW5hZ2Vycy5nZXQocGFja2FnZU5hbWUpOworCisgICAgICAgIGlmIChtZ3IgPT0gbnVsbCkgeworICAgICAgICAgICAgbWdyID0gbmV3IFN0cmluZ01hbmFnZXIocGFja2FnZU5hbWUpOworICAgICAgICAgICAgbWFuYWdlcnMucHV0KHBhY2thZ2VOYW1lLCBtZ3IpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtZ3I7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvU3RyaW5nUGFyc2VyLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9TdHJpbmdQYXJzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2VjYjdiCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvU3RyaW5nUGFyc2VyLmphdmEKQEAgLTAsMCArMSwzMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbDsKKworCisvKioKKyAqIFV0aWxpdHkgY2xhc3MgZm9yIHN0cmluZyBwYXJzaW5nIHRoYXQgaXMgaGlnaGVyIHBlcmZvcm1hbmNlIHRoYW4KKyAqIFN0cmluZ1BhcnNlciBmb3Igc2ltcGxlIGRlbGltaXRlZCB0ZXh0IGNhc2VzLiAgUGFyc2luZyBpcyBwZXJmb3JtZWQKKyAqIGJ5IHNldHRpbmcgdGhlIHN0cmluZywgYW5kIHRoZW4gdXNpbmcgdGhlIDxjb2RlPmZpbmRYeHh4KCk8L2NvZGU+IGFuZAorICogPGNvZGU+c2tpcFh4eHgoKTwvY29kZT4gZmFtaWxpZXMgb2YgbWV0aG9kcyB0byByZW1lbWJlciBzaWduaWZpY2FudAorICogb2Zmc2V0cy4gIFRvIHJldHJpZXZlIHRoZSBwYXJzZWQgc3Vic3RyaW5ncywgY2FsbCB0aGUgPGNvZGU+ZXh0cmFjdCgpPC9jb2RlPgorICogbWV0aG9kIHdpdGggdGhlIGFwcHJvcHJpYXRlIHNhdmVkIG9mZnNldCB2YWx1ZXMuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBTdHJpbmdQYXJzZXIgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgc3RyaW5nIHBhcnNlciB3aXRoIG5vIHByZXNldCBzdHJpbmcgdG8gYmUgcGFyc2VkLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdQYXJzZXIoKSB7CisKKyAgICAgICAgdGhpcyhudWxsKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgc3RyaW5nIHBhcnNlciB0aGF0IGlzIGluaXRpYWxpemVkIHRvIHBhcnNlIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBzdHJpbmcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyaW5nIFRoZSBzdHJpbmcgdG8gYmUgcGFyc2VkCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1BhcnNlcihTdHJpbmcgc3RyaW5nKSB7CisKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgc2V0U3RyaW5nKHN0cmluZyk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgY2hhcmFjdGVycyBvZiB0aGUgY3VycmVudCBzdHJpbmcsIGFzIGEgY2hhcmFjdGVyIGFycmF5LiAgU3RvcmVkCisgICAgICogd2hlbiB0aGUgc3RyaW5nIGlzIGZpcnN0IHNwZWNpZmllZCB0byBzcGVlZCB1cCBhY2Nlc3MgdG8gY2hhcmFjdGVycworICAgICAqIGJlaW5nIGNvbXBhcmVkIGR1cmluZyBwYXJzaW5nLgorICAgICAqLworICAgIHByaXZhdGUgY2hhciBjaGFyc1tdID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIHplcm8tcmVsYXRpdmUgaW5kZXggb2YgdGhlIGN1cnJlbnQgcG9pbnQgYXQgd2hpY2ggd2UgYXJlCisgICAgICogcG9zaXRpb25lZCB3aXRoaW4gdGhlIHN0cmluZyBiZWluZyBwYXJzZWQuICA8c3Ryb25nPk5PVEU8L3N0cm9uZz46CisgICAgICogdGhlIHZhbHVlIG9mIHRoaXMgaW5kZXggY2FuIGJlIG9uZSBsYXJnZXIgdGhhbiB0aGUgaW5kZXggb2YgdGhlIGxhc3QKKyAgICAgKiBjaGFyYWN0ZXIgb2YgdGhlIHN0cmluZyAoaS5lLiBlcXVhbCB0byB0aGUgc3RyaW5nIGxlbmd0aCkgaWYgeW91CisgICAgICogcGFyc2Ugb2ZmIHRoZSBlbmQgb2YgdGhlIHN0cmluZy4gIFRoaXMgdmFsdWUgaXMgdXNlZnVsIGZvciBleHRyYWN0aW5nCisgICAgICogc3Vic3RyaW5ncyB0aGF0IGluY2x1ZGUgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLgorICAgICAqLworICAgIHByaXZhdGUgaW50IGluZGV4ID0gMDsKKworCisgICAgLyoqCisgICAgICogVGhlIGxlbmd0aCBvZiB0aGUgU3RyaW5nIHdlIGFyZSBjdXJyZW50bHkgcGFyc2luZy4gIFN0b3JlZCB3aGVuIHRoZQorICAgICAqIHN0cmluZyBpcyBmaXJzdCBzcGVjaWZpZWQgdG8gYXZvaWQgcmVwZWF0ZWQgcmVjYWxjdWxhdGlvbnMuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgbGVuZ3RoID0gMDsKKworCisgICAgLyoqCisgICAgICogVGhlIFN0cmluZyB3ZSBhcmUgY3VycmVudGx5IHBhcnNpbmcuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgc3RyaW5nID0gbnVsbDsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgemVyby1yZWxhdGl2ZSBpbmRleCBvZiBvdXIgY3VycmVudCBwYXJzaW5nIHBvc2l0aW9uCisgICAgICogd2l0aGluIHRoZSBzdHJpbmcgYmVpbmcgcGFyc2VkLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0SW5kZXgoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLmluZGV4KTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyB3ZSBhcmUgcGFyc2luZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMubGVuZ3RoKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBTdHJpbmcgd2UgYXJlIGN1cnJlbnRseSBwYXJzaW5nLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5zdHJpbmcpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIFN0cmluZyB3ZSBhcmUgY3VycmVudGx5IHBhcnNpbmcuICBUaGUgcGFyc2VyIHN0YXRlIGlzIGFsc28gcmVzZXQKKyAgICAgKiB0byBiZWdpbiBhdCB0aGUgc3RhcnQgb2YgdGhpcyBzdHJpbmcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyaW5nIFRoZSBzdHJpbmcgdG8gYmUgcGFyc2VkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFN0cmluZyhTdHJpbmcgc3RyaW5nKSB7CisKKyAgICAgICAgdGhpcy5zdHJpbmcgPSBzdHJpbmc7CisgICAgICAgIGlmIChzdHJpbmcgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy5sZW5ndGggPSBzdHJpbmcubGVuZ3RoKCk7CisgICAgICAgICAgICBjaGFycyA9IHRoaXMuc3RyaW5nLnRvQ2hhckFycmF5KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aGlzLmxlbmd0aCA9IDA7CisgICAgICAgICAgICBjaGFycyA9IG5ldyBjaGFyWzBdOworICAgICAgICB9CisgICAgICAgIHJlc2V0KCk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBBZHZhbmNlIHRoZSBjdXJyZW50IHBhcnNpbmcgcG9zaXRpb24gYnkgb25lLCBpZiB3ZSBhcmUgbm90IGFscmVhZHkKKyAgICAgKiBwYXN0IHRoZSBlbmQgb2YgdGhlIHN0cmluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZHZhbmNlKCkgeworCisgICAgICAgIGlmIChpbmRleCA8IGxlbmd0aCkKKyAgICAgICAgICAgIGluZGV4Kys7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEV4dHJhY3QgYW5kIHJldHVybiBhIHN1YnN0cmluZyB0aGF0IHN0YXJ0cyBhdCB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uLAorICAgICAqIGFuZCBleHRlbmRzIHRvIHRoZSBlbmQgb2YgdGhlIHN0cmluZyBiZWluZyBwYXJzZWQuICBJZiB0aGlzIGlzIG5vdAorICAgICAqIHBvc3NpYmxlLCBhIHplcm8tbGVuZ3RoIHN0cmluZyBpcyByZXR1cm5lZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdGFydCBTdGFydGluZyBpbmRleCwgemVybyByZWxhdGl2ZSwgaW5jbHVzaXZlCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBleHRyYWN0KGludCBzdGFydCkgeworCisgICAgICAgIGlmICgoc3RhcnQgPCAwKSB8fCAoc3RhcnQgPj0gbGVuZ3RoKSkKKyAgICAgICAgICAgIHJldHVybiAoIiIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gKHN0cmluZy5zdWJzdHJpbmcoc3RhcnQpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogRXh0cmFjdCBhbmQgcmV0dXJuIGEgc3Vic3RyaW5nIHRoYXQgc3RhcnRzIGF0IHRoZSBzcGVjaWZpZWQgcG9zaXRpb24sCisgICAgICogYW5kIGVuZHMgYXQgdGhlIGNoYXJhY3RlciBiZWZvcmUgdGhlIHNwZWNpZmllZCBwb3NpdGlvbi4gIElmIHRoaXMgaXMKKyAgICAgKiBub3QgcG9zc2libGUsIGEgemVyby1sZW5ndGggc3RyaW5nIGlzIHJldHVybmVkLgorICAgICAqCisgICAgICogQHBhcmFtIHN0YXJ0IFN0YXJ0aW5nIGluZGV4LCB6ZXJvIHJlbGF0aXZlLCBpbmNsdXNpdmUKKyAgICAgKiBAcGFyYW0gZW5kIEVuZGluZyBpbmRleCwgemVybyByZWxhdGl2ZSwgZXhjbHVzaXZlCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBleHRyYWN0KGludCBzdGFydCwgaW50IGVuZCkgeworCisgICAgICAgIGlmICgoc3RhcnQgPCAwKSB8fCAoc3RhcnQgPj0gZW5kKSB8fCAoZW5kID4gbGVuZ3RoKSkKKyAgICAgICAgICAgIHJldHVybiAoIiIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gKHN0cmluZy5zdWJzdHJpbmcoc3RhcnQsIGVuZCkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBuZXh0IG9jY3VycmVuY2Ugb2YgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIsCisgICAgICogb3IgdGhlIGluZGV4IG9mIHRoZSBjaGFyYWN0ZXIgYWZ0ZXIgdGhlIGxhc3QgcG9zaXRpb24gb2YgdGhlIHN0cmluZworICAgICAqIGlmIG5vIG1vcmUgb2NjdXJyZW5jZXMgb2YgdGhpcyBjaGFyYWN0ZXIgYXJlIGZvdW5kLiAgVGhlIGN1cnJlbnQKKyAgICAgKiBwYXJzaW5nIHBvc2l0aW9uIGlzIHVwZGF0ZWQgdG8gdGhlIHJldHVybmVkIHZhbHVlLgorICAgICAqCisgICAgICogQHBhcmFtIGNoIENoYXJhY3RlciB0byBiZSBmb3VuZAorICAgICAqLworICAgIHB1YmxpYyBpbnQgZmluZENoYXIoY2hhciBjaCkgeworCisgICAgICAgIHdoaWxlICgoaW5kZXggPCBsZW5ndGgpICYmIChjaCAhPSBjaGFyc1tpbmRleF0pKQorICAgICAgICAgICAgaW5kZXgrKzsKKyAgICAgICAgcmV0dXJuIChpbmRleCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIG5leHQgb2NjdXJyZW5jZSBvZiBhIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlciwKKyAgICAgKiBvciB0aGUgaW5kZXggb2YgdGhlIGNoYXJhY3RlciBhZnRlciB0aGUgbGFzdCBwb3NpdGlvbiBvZiB0aGUgc3RyaW5nCisgICAgICogaWYgbm8gbW9yZSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGFyZSBmb3VuZC4gIFRoZSBjdXJyZW50CisgICAgICogcGFyc2luZyBwb3NpdGlvbiBpcyB1cGRhdGVkIHRvIHRoZSByZXR1cm5lZCB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGZpbmRUZXh0KCkgeworCisgICAgICAgIHdoaWxlICgoaW5kZXggPCBsZW5ndGgpICYmIGlzV2hpdGUoY2hhcnNbaW5kZXhdKSkKKyAgICAgICAgICAgIGluZGV4Kys7CisgICAgICAgIHJldHVybiAoaW5kZXgpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBuZXh0IG9jY3VycmVuY2Ugb2YgYSB3aGl0ZXNwYWNlIGNoYXJhY3RlciwKKyAgICAgKiBvciB0aGUgaW5kZXggb2YgdGhlIGNoYXJhY3RlciBhZnRlciB0aGUgbGFzdCBwb3NpdGlvbiBvZiB0aGUgc3RyaW5nCisgICAgICogaWYgbm8gbW9yZSB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgYXJlIGZvdW5kLiAgVGhlIGN1cnJlbnQgcGFyc2luZworICAgICAqIHBvc2l0aW9uIGlzIHVwZGF0ZWQgdG8gdGhlIHJldHVybmVkIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZmluZFdoaXRlKCkgeworCisgICAgICAgIHdoaWxlICgoaW5kZXggPCBsZW5ndGgpICYmICFpc1doaXRlKGNoYXJzW2luZGV4XSkpCisgICAgICAgICAgICBpbmRleCsrOworICAgICAgICByZXR1cm4gKGluZGV4KTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVzZXQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHBhcnNlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZQorICAgICAqIGN1cnJlbnQgc3RyaW5nIGJlaW5nIHBhcnNlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKKworICAgICAgICBpbmRleCA9IDA7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEFkdmFuY2UgdGhlIGN1cnJlbnQgcGFyc2luZyBwb3NpdGlvbiB3aGlsZSBpdCBpcyBwb2ludGluZyBhdCB0aGUKKyAgICAgKiBzcGVjaWZpZWQgY2hhcmFjdGVyLCBvciB1bnRpbCBpdCBtb3ZlcyBwYXN0IHRoZSBlbmQgb2YgdGhlIHN0cmluZy4KKyAgICAgKiBSZXR1cm4gdGhlIGZpbmFsIHZhbHVlLgorICAgICAqCisgICAgICogQHBhcmFtIGNoIENoYXJhY3RlciB0byBiZSBza2lwcGVkCisgICAgICovCisgICAgcHVibGljIGludCBza2lwQ2hhcihjaGFyIGNoKSB7CisKKyAgICAgICAgd2hpbGUgKChpbmRleCA8IGxlbmd0aCkgJiYgKGNoID09IGNoYXJzW2luZGV4XSkpCisgICAgICAgICAgICBpbmRleCsrOworICAgICAgICByZXR1cm4gKGluZGV4KTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQWR2YW5jZSB0aGUgY3VycmVudCBwYXJzaW5nIHBvc2l0aW9uIHdoaWxlIGl0IGlzIHBvaW50aW5nIGF0IGEKKyAgICAgKiBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIsIG9yIHVudGlsIGl0IG1vdmVzIHBhc3QgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLgorICAgICAqIFJldHVybiB0aGUgZmluYWwgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIGludCBza2lwVGV4dCgpIHsKKworICAgICAgICB3aGlsZSAoKGluZGV4IDwgbGVuZ3RoKSAmJiAhaXNXaGl0ZShjaGFyc1tpbmRleF0pKQorICAgICAgICAgICAgaW5kZXgrKzsKKyAgICAgICAgcmV0dXJuIChpbmRleCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEFkdmFuY2UgdGhlIGN1cnJlbnQgcGFyc2luZyBwb3NpdGlvbiB3aGlsZSBpdCBpcyBwb2ludGluZyBhdCBhCisgICAgICogd2hpdGVzcGFjZSBjaGFyYWN0ZXIsIG9yIHVudGlsIGl0IG1vdmVzIHBhc3QgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLgorICAgICAqIFJldHVybiB0aGUgZmluYWwgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIGludCBza2lwV2hpdGUoKSB7CisKKyAgICAgICAgd2hpbGUgKChpbmRleCA8IGxlbmd0aCkgJiYgaXNXaGl0ZShjaGFyc1tpbmRleF0pKQorICAgICAgICAgICAgaW5kZXgrKzsKKyAgICAgICAgcmV0dXJuIChpbmRleCk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm90ZWN0ZWQgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBJcyB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBjb25zaWRlcmVkIHRvIGJlIHdoaXRlc3BhY2U/CisgICAgICoKKyAgICAgKiBAcGFyYW0gY2ggQ2hhcmFjdGVyIHRvIGJlIGNoZWNrZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1doaXRlKGNoYXIgY2gpIHsKKworICAgICAgICBpZiAoKGNoID09ICcgJykgfHwgKGNoID09ICdcdCcpIHx8IChjaCA9PSAnXHInKSB8fCAoY2ggPT0gJ1xuJykpCisgICAgICAgICAgICByZXR1cm4gKHRydWUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gKGZhbHNlKTsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9Ub21jYXRDU1MuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL1RvbWNhdENTUy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkNjZiMTkKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9Ub21jYXRDU1MuamF2YQpAQCAtMCwwICsxLDM2IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWw7CisKKworcHVibGljIGNsYXNzIFRvbWNhdENTUyB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT01DQVRfQ1NTID0KKyAgICAgICAgIkgxIHtmb250LWZhbWlseTpUYWhvbWEsQXJpYWwsc2Fucy1zZXJpZjtjb2xvcjp3aGl0ZTtiYWNrZ3JvdW5kLWNvbG9yOiM1MjVENzY7Zm9udC1zaXplOjIycHg7fSAiICsKKyAgICAgICAgIkgyIHtmb250LWZhbWlseTpUYWhvbWEsQXJpYWwsc2Fucy1zZXJpZjtjb2xvcjp3aGl0ZTtiYWNrZ3JvdW5kLWNvbG9yOiM1MjVENzY7Zm9udC1zaXplOjE2cHg7fSAiICsKKyAgICAgICAgIkgzIHtmb250LWZhbWlseTpUYWhvbWEsQXJpYWwsc2Fucy1zZXJpZjtjb2xvcjp3aGl0ZTtiYWNrZ3JvdW5kLWNvbG9yOiM1MjVENzY7Zm9udC1zaXplOjE0cHg7fSAiICsKKyAgICAgICAgIkJPRFkge2ZvbnQtZmFtaWx5OlRhaG9tYSxBcmlhbCxzYW5zLXNlcmlmO2NvbG9yOmJsYWNrO2JhY2tncm91bmQtY29sb3I6d2hpdGU7fSAiICsKKyAgICAgICAgIkIge2ZvbnQtZmFtaWx5OlRhaG9tYSxBcmlhbCxzYW5zLXNlcmlmO2NvbG9yOndoaXRlO2JhY2tncm91bmQtY29sb3I6IzUyNUQ3Njt9ICIgKworICAgICAgICAiUCB7Zm9udC1mYW1pbHk6VGFob21hLEFyaWFsLHNhbnMtc2VyaWY7YmFja2dyb3VuZDp3aGl0ZTtjb2xvcjpibGFjaztmb250LXNpemU6MTJweDt9IiArCisgICAgICAgICJBIHtjb2xvciA6IGJsYWNrO30iICsKKyAgICAgICAgIkEubmFtZSB7Y29sb3IgOiBibGFjazt9IiArCisgICAgICAgICJIUiB7Y29sb3IgOiAjNTI1RDc2O30iOworCisKK30KKwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvVVJMLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9VUkwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTI1NTJlCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvVVJMLmphdmEKQEAgLTAsMCArMSw3MDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbDsKKworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworCisKKy8qKgorICogPHA+PHN0cm9uZz5VUkw8L3N0cm9uZz4gaXMgZGVzaWduZWQgdG8gcHJvdmlkZSBwdWJsaWMgQVBJcyBmb3IgcGFyc2luZworICogYW5kIHN5bnRoZXNpemluZyBVbmlmb3JtIFJlc291cmNlIExvY2F0b3JzIGFzIHNpbWlsYXIgYXMgcG9zc2libGUgdG8gdGhlCisgKiBBUElzIG9mIDxjb2RlPmphdmEubmV0LlVSTDwvY29kZT4sIGJ1dCB3aXRob3V0IHRoZSBhYmlsaXR5IHRvIG9wZW4gYQorICogc3RyZWFtIG9yIGNvbm5lY3Rpb24uICBPbmUgb2YgdGhlIGNvbnNlcXVlbmNlcyBvZiB0aGlzIGlzIHRoYXQgeW91IGNhbgorICogY29uc3RydWN0IFVSTHMgZm9yIHByb3RvY29scyBmb3Igd2hpY2ggYSBVUkxTdHJlYW1IYW5kbGVyIGlzIG5vdAorICogYXZhaWxhYmxlIChzdWNoIGFzIGFuICJodHRwcyIgVVJMIHdoZW4gSlNTRSBpcyBub3QgaW5zdGFsbGVkKS48L3A+CisgKgorICogPHA+PHN0cm9uZz5XQVJOSU5HPC9zdHJvbmc+IC0gVGhpcyBjbGFzcyBhc3N1bWVzIHRoYXQgdGhlIHN0cmluZworICogcmVwcmVzZW50YXRpb24gb2YgYSBVUkwgY29uZm9ybXMgdG8gdGhlIDxjb2RlPnNwZWM8L2NvZGU+IGFyZ3VtZW50CisgKiBhcyBkZXNjcmliZWQgaW4gUkZDIDIzOTYgIlVuaWZvcm0gUmVzb3VyY2UgSWRlbnRpZmllcnM6IEdlbmVyaWMgU3ludGF4IjoKKyAqIDxwcmU+CisgKiAgICZsdDtzY2hlbWUmZ3Q7Ly8mbHQ7YXV0aG9yaXR5Jmd0OyZsdDtwYXRoJmd0Oz8mbHQ7cXVlcnkmZ3Q7IyZsdDtmcmFnbWVudCZndDsKKyAqIDwvcHJlPjwvcD4KKyAqCisgKiA8cD48c3Ryb25nPkZJWE1FPC9zdHJvbmc+IC0gVGhpcyBjbGFzcyByZWFsbHkgb3VnaHQgdG8gZW5kIHVwIGluIGEgQ29tbW9ucworICogcGFja2FnZSBzb21lcGxhY2UuPC9wPgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgVVJMIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIFVSTCBvYmplY3QgZnJvbSB0aGUgc3BlY2lmaWVkIFN0cmluZyByZXByZXNlbnRhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzcGVjIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgVVJMCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBpZiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uCisgICAgICogIGNhbm5vdCBiZSBwYXJzZWQgc3VjY2Vzc2Z1bGx5CisgICAgICovCisgICAgcHVibGljIFVSTChTdHJpbmcgc3BlYykgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7CisKKyAgICAgICAgdGhpcyhudWxsLCBzcGVjKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgVVJMIG9iamVjdCBieSBwYXJzaW5nIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIHJlbGF0aXZlCisgICAgICogdG8gYSBzcGVjaWZpZWQgY29udGV4dC4gIEJhc2VkIG9uIGxvZ2ljIGZyb20gSkRLIDEuMy4xJ3MKKyAgICAgKiA8Y29kZT5qYXZhLm5ldC5VUkw8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgVVJMIGFnYWluc3Qgd2hpY2ggdGhlIHJlbGF0aXZlIHJlcHJlc2VudGF0aW9uCisgICAgICogIGlzIHJlc29sdmVkCisgICAgICogQHBhcmFtIHNwZWMgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBVUkwgKHVzdWFsbHkgcmVsYXRpdmUpCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBpZiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uCisgICAgICogIGNhbm5vdCBiZSBwYXJzZWQgc3VjY2Vzc2Z1bGx5CisgICAgICovCisgICAgcHVibGljIFVSTChVUkwgY29udGV4dCwgU3RyaW5nIHNwZWMpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24geworCisgICAgICAgIFN0cmluZyBvcmlnaW5hbCA9IHNwZWM7CisgICAgICAgIGludCBpLCBsaW1pdCwgYzsKKyAgICAgICAgaW50IHN0YXJ0ID0gMDsKKyAgICAgICAgU3RyaW5nIG5ld1Byb3RvY29sID0gbnVsbDsKKyAgICAgICAgYm9vbGVhbiBhUmVmID0gZmFsc2U7CisKKyAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgLy8gRWxpbWluYXRlIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UKKyAgICAgICAgICAgIGxpbWl0ID0gc3BlYy5sZW5ndGgoKTsKKyAgICAgICAgICAgIHdoaWxlICgobGltaXQgPiAwKSAmJiAoc3BlYy5jaGFyQXQobGltaXQgLSAxKSA8PSAnICcpKSB7CisgICAgICAgICAgICAgICAgbGltaXQtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlICgoc3RhcnQgPCBsaW1pdCkgJiYgKHNwZWMuY2hhckF0KHN0YXJ0KSA8PSAnICcpKSB7CisgICAgICAgICAgICAgICAgc3RhcnQrKzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSWYgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBzdGFydHMgd2l0aCAidXJsOiIsIHNraXAgaXQKKyAgICAgICAgICAgIGlmIChzcGVjLnJlZ2lvbk1hdGNoZXModHJ1ZSwgc3RhcnQsICJ1cmw6IiwgMCwgNCkpIHsKKyAgICAgICAgICAgICAgICBzdGFydCArPSA0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBJcyB0aGlzIGEgcmVmIHJlbGF0aXZlIHRvIHRoZSBjb250ZXh0IFVSTD8KKyAgICAgICAgICAgIGlmICgoc3RhcnQgPCBzcGVjLmxlbmd0aCgpKSAmJiAoc3BlYy5jaGFyQXQoc3RhcnQpID09ICcjJykpIHsKKyAgICAgICAgICAgICAgICBhUmVmID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gUGFyc2Ugb3V0IHRoZSBuZXcgcHJvdG9jb2wKKyAgICAgICAgICAgIGZvciAoaSA9IHN0YXJ0OyAhYVJlZiAmJiAoaSA8IGxpbWl0KSAmJgorICAgICAgICAgICAgICAgICAgICAgKChjID0gc3BlYy5jaGFyQXQoaSkpICE9ICcvJyk7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChjID09ICc6JykgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcyA9IHNwZWMuc3Vic3RyaW5nKHN0YXJ0LCBpKS50b0xvd2VyQ2FzZSgpOworICAgICAgICAgICAgICAgICAgICAvLyBBc3N1bWUgYWxsIHByb3RvY29scyBhcmUgdmFsaWQKKyAgICAgICAgICAgICAgICAgICAgbmV3UHJvdG9jb2wgPSBzOworICAgICAgICAgICAgICAgICAgICBzdGFydCA9IGkgKyAxOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIE9ubHkgdXNlIG91ciBjb250ZXh0IGlmIHRoZSBwcm90b2NvbHMgbWF0Y2gKKyAgICAgICAgICAgIHByb3RvY29sID0gbmV3UHJvdG9jb2w7CisgICAgICAgICAgICBpZiAoKGNvbnRleHQgIT0gbnVsbCkgJiYgKChuZXdQcm90b2NvbCA9PSBudWxsKSB8fAorICAgICAgICAgICAgICAgICBuZXdQcm90b2NvbC5lcXVhbHNJZ25vcmVDYXNlKGNvbnRleHQuZ2V0UHJvdG9jb2woKSkpKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGNvbnRleHQgaXMgYSBoaWVyYXJjaGljYWwgVVJMIHNjaGVtZSBhbmQgdGhlIHNwZWMKKyAgICAgICAgICAgICAgICAvLyBjb250YWlucyBhIG1hdGNoaW5nIHNjaGVtZSB0aGVuIG1haW50YWluIGJhY2t3YXJkcworICAgICAgICAgICAgICAgIC8vIGNvbXBhdGliaWxpdHkgYW5kIHRyZWF0IGl0IGFzIGlmIHRoZSBzcGVjIGRpZG4ndCBjb250YWluCisgICAgICAgICAgICAgICAgLy8gdGhlIHNjaGVtZTsgc2VlIDUuMi4zIG9mIFJGQzIzOTYKKyAgICAgICAgICAgICAgICBpZiAoKGNvbnRleHQuZ2V0UGF0aCgpICE9IG51bGwpICYmCisgICAgICAgICAgICAgICAgICAgIChjb250ZXh0LmdldFBhdGgoKS5zdGFydHNXaXRoKCIvIikpKQorICAgICAgICAgICAgICAgICAgICBuZXdQcm90b2NvbCA9IG51bGw7CisgICAgICAgICAgICAgICAgaWYgKG5ld1Byb3RvY29sID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2wgPSBjb250ZXh0LmdldFByb3RvY29sKCk7CisgICAgICAgICAgICAgICAgICAgIGF1dGhvcml0eSA9IGNvbnRleHQuZ2V0QXV0aG9yaXR5KCk7CisgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvID0gY29udGV4dC5nZXRVc2VySW5mbygpOworICAgICAgICAgICAgICAgICAgICBob3N0ID0gY29udGV4dC5nZXRIb3N0KCk7CisgICAgICAgICAgICAgICAgICAgIHBvcnQgPSBjb250ZXh0LmdldFBvcnQoKTsKKyAgICAgICAgICAgICAgICAgICAgZmlsZSA9IGNvbnRleHQuZ2V0RmlsZSgpOworICAgICAgICAgICAgICAgICAgICBpbnQgcXVlc3Rpb24gPSBmaWxlLmxhc3RJbmRleE9mKCI/Iik7CisgICAgICAgICAgICAgICAgICAgIGlmIChxdWVzdGlvbiA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICBwYXRoID0gZmlsZTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCA9IGZpbGUuc3Vic3RyaW5nKDAsIHF1ZXN0aW9uKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwcm90b2NvbCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBNYWxmb3JtZWRVUkxFeGNlcHRpb24oIm5vIHByb3RvY29sOiAiICsgb3JpZ2luYWwpOworCisgICAgICAgICAgICAvLyBQYXJzZSBvdXQgYW55IHJlZiBwb3J0aW9uIG9mIHRoZSBzcGVjCisgICAgICAgICAgICBpID0gc3BlYy5pbmRleE9mKCcjJywgc3RhcnQpOworICAgICAgICAgICAgaWYgKGkgPj0gMCkgeworICAgICAgICAgICAgICAgIHJlZiA9IHNwZWMuc3Vic3RyaW5nKGkgKyAxLCBsaW1pdCk7CisgICAgICAgICAgICAgICAgbGltaXQgPSBpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBQYXJzZSB0aGUgcmVtYWluZGVyIG9mIHRoZSBzcGVjIGluIGEgcHJvdG9jb2wtc3BlY2lmaWMgZmFzaGlvbgorICAgICAgICAgICAgcGFyc2Uoc3BlYywgc3RhcnQsIGxpbWl0KTsKKyAgICAgICAgICAgIGlmIChjb250ZXh0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgbm9ybWFsaXplKCk7CisKKworICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBNYWxmb3JtZWRVUkxFeGNlcHRpb24oZS50b1N0cmluZygpKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKworCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBVUkwgb2JqZWN0IGZyb20gdGhlIHNwZWNpZmllZCBjb21wb25lbnRzLiAgVGhlIGRlZmF1bHQgcG9ydAorICAgICAqIG51bWJlciBmb3IgdGhlIHNwZWNpZmllZCBwcm90b2NvbCB3aWxsIGJlIHVzZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvdG9jb2wgTmFtZSBvZiB0aGUgcHJvdG9jb2wgdG8gdXNlCisgICAgICogQHBhcmFtIGhvc3QgTmFtZSBvZiB0aGUgaG9zdCBhZGRyZXNzZWQgYnkgdGhpcyBwcm90b2NvbAorICAgICAqIEBwYXJhbSBmaWxlIEZpbGVuYW1lIG9uIHRoZSBzcGVjaWZpZWQgaG9zdAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBNYWxmb3JtZWRVUkxFeGNlcHRpb24gaXMgbmV2ZXIgdGhyb3duLCBidXQgcHJlc2VudCBmb3IKKyAgICAgKiAgY29tcGF0aWJsZSBBUElzCisgICAgICovCisgICAgcHVibGljIFVSTChTdHJpbmcgcHJvdG9jb2wsIFN0cmluZyBob3N0LCBTdHJpbmcgZmlsZSkKKyAgICAgICAgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7CisKKyAgICAgICAgdGhpcyhwcm90b2NvbCwgaG9zdCwgLTEsIGZpbGUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBVUkwgb2JqZWN0IGZyb20gdGhlIHNwZWNpZmllZCBjb21wb25lbnRzLiAgU3BlY2lmeWluZyBhIHBvcnQKKyAgICAgKiBudW1iZXIgb2YgLTEgaW5kaWNhdGVzIHRoYXQgdGhlIFVSTCBzaG91bGQgdXNlIHRoZSBkZWZhdWx0IHBvcnQgZm9yCisgICAgICogdGhhdCBwcm90b2NvbC4gIEJhc2VkIG9uIGxvZ2ljIGZyb20gSkRLIDEuMy4xJ3MKKyAgICAgKiA8Y29kZT5qYXZhLm5ldC5VUkw8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIHByb3RvY29sIE5hbWUgb2YgdGhlIHByb3RvY29sIHRvIHVzZQorICAgICAqIEBwYXJhbSBob3N0IE5hbWUgb2YgdGhlIGhvc3QgYWRkcmVzc2VkIGJ5IHRoaXMgcHJvdG9jb2wKKyAgICAgKiBAcGFyYW0gcG9ydCBQb3J0IG51bWJlciwgb3IgLTEgZm9yIHRoZSBkZWZhdWx0IHBvcnQgZm9yIHRoaXMgcHJvdG9jb2wKKyAgICAgKiBAcGFyYW0gZmlsZSBGaWxlbmFtZSBvbiB0aGUgc3BlY2lmaWVkIGhvc3QKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGlzIG5ldmVyIHRocm93biwgYnV0IHByZXNlbnQgZm9yCisgICAgICogIGNvbXBhdGlibGUgQVBJcworICAgICAqLworICAgIHB1YmxpYyBVUkwoU3RyaW5nIHByb3RvY29sLCBTdHJpbmcgaG9zdCwgaW50IHBvcnQsIFN0cmluZyBmaWxlKQorICAgICAgICB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKKworICAgICAgICB0aGlzLnByb3RvY29sID0gcHJvdG9jb2w7CisgICAgICAgIHRoaXMuaG9zdCA9IGhvc3Q7CisgICAgICAgIHRoaXMucG9ydCA9IHBvcnQ7CisKKyAgICAgICAgaW50IGhhc2ggPSBmaWxlLmluZGV4T2YoJyMnKTsKKyAgICAgICAgdGhpcy5maWxlID0gaGFzaCA8IDAgPyBmaWxlIDogZmlsZS5zdWJzdHJpbmcoMCwgaGFzaCk7CisgICAgICAgIHRoaXMucmVmID0gaGFzaCA8IDAgPyBudWxsIDogZmlsZS5zdWJzdHJpbmcoaGFzaCArIDEpOworICAgICAgICBpbnQgcXVlc3Rpb24gPSBmaWxlLmxhc3RJbmRleE9mKCc/Jyk7CisgICAgICAgIGlmIChxdWVzdGlvbiA+PSAwKSB7CisgICAgICAgICAgICBxdWVyeSA9IGZpbGUuc3Vic3RyaW5nKHF1ZXN0aW9uICsgMSk7CisgICAgICAgICAgICBwYXRoID0gZmlsZS5zdWJzdHJpbmcoMCwgcXVlc3Rpb24pOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHBhdGggPSBmaWxlOworCisgICAgICAgIGlmICgoaG9zdCAhPSBudWxsKSAmJiAoaG9zdC5sZW5ndGgoKSA+IDApKQorICAgICAgICAgICAgYXV0aG9yaXR5ID0gKHBvcnQgPT0gLTEpID8gaG9zdCA6IGhvc3QgKyAiOiIgKyBwb3J0OworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIGF1dGhvcml0eSBwYXJ0IG9mIHRoZSBVUkwuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgYXV0aG9yaXR5ID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIGZpbGVuYW1lIHBhcnQgb2YgdGhlIFVSTC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBmaWxlID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIGhvc3QgbmFtZSBwYXJ0IG9mIHRoZSBVUkwuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgaG9zdCA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBwYXRoIHBhcnQgb2YgdGhlIFVSTC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBwYXRoID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIHBvcnQgbnVtYmVyIHBhcnQgb2YgdGhlIFVSTC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBwb3J0ID0gLTE7CisKKworICAgIC8qKgorICAgICAqIFRoZSBwcm90b2NvbCBuYW1lIHBhcnQgb2YgdGhlIFVSTC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBwcm90b2NvbCA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBxdWVyeSBwYXJ0IG9mIHRoZSBVUkwuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcXVlcnkgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgcmVmZXJlbmNlIHBhcnQgb2YgdGhlIFVSTC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyByZWYgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgdXNlciBpbmZvIHBhcnQgb2YgdGhlIFVSTC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyB1c2VySW5mbyA9IG51bGw7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBDb21wYXJlIHR3byBVUkxzIGZvciBlcXVhbGl0eS4gIFRoZSByZXN1bHQgaXMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYW5kCisgICAgICogb25seSBpZiB0aGUgYXJndW1lbnQgaXMgbm90IG51bGwsIGFuZCBpcyBhIDxjb2RlPlVSTDwvY29kZT4gb2JqZWN0CisgICAgICogdGhhdCByZXByZXNlbnRzIHRoZSBzYW1lIDxjb2RlPlVSTDwvY29kZT4gYXMgdGhpcyBvYmplY3QuICBUd28KKyAgICAgKiA8Y29kZT5VUkxzPC9jb2RlPiBhcmUgZXF1YWwgaWYgdGhleSBoYXZlIHRoZSBzYW1lIHByb3RvY29sIGFuZAorICAgICAqIHJlZmVyZW5jZSB0aGUgc2FtZSBob3N0LCB0aGUgc2FtZSBwb3J0IG51bWJlciBvbiB0aGUgaG9zdCwKKyAgICAgKiBhbmQgdGhlIHNhbWUgZmlsZSBhbmQgYW5jaG9yIG9uIHRoZSBob3N0LgorICAgICAqCisgICAgICogQHBhcmFtIG9iaiBUaGUgVVJMIHRvIGNvbXBhcmUgYWdhaW5zdAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisKKyAgICAgICAgaWYgKG9iaiA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChmYWxzZSk7CisgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIFVSTCkpCisgICAgICAgICAgICByZXR1cm4gKGZhbHNlKTsKKyAgICAgICAgVVJMIG90aGVyID0gKFVSTCkgb2JqOworICAgICAgICBpZiAoIXNhbWVGaWxlKG90aGVyKSkKKyAgICAgICAgICAgIHJldHVybiAoZmFsc2UpOworICAgICAgICByZXR1cm4gKGNvbXBhcmUocmVmLCBvdGhlci5nZXRSZWYoKSkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGF1dGhvcml0eSBwYXJ0IG9mIHRoZSBVUkwuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRBdXRob3JpdHkoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLmF1dGhvcml0eSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZmlsZW5hbWUgcGFydCBvZiB0aGUgVVJMLiAgPHN0cm9uZz5OT1RFPC9zdHJvbmc+IC0gRm9yCisgICAgICogY29tcGF0aWJpbGl0eSB3aXRoIDxjb2RlPmphdmEubmV0LlVSTDwvY29kZT4sIHRoaXMgdmFsdWUgaW5jbHVkZXMKKyAgICAgKiB0aGUgcXVlcnkgc3RyaW5nIGlmIHRoZXJlIHdhcyBvbmUuICBGb3IganVzdCB0aGUgcGF0aCBwb3J0aW9uLAorICAgICAqIGNhbGwgPGNvZGU+Z2V0UGF0aCgpPC9jb2RlPiBpbnN0ZWFkLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmlsZSgpIHsKKworICAgICAgICBpZiAoZmlsZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuICgiIik7CisgICAgICAgIHJldHVybiAodGhpcy5maWxlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBob3N0IG5hbWUgcGFydCBvZiB0aGUgVVJMLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SG9zdCgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMuaG9zdCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcGF0aCBwYXJ0IG9mIHRoZSBVUkwuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRQYXRoKCkgeworCisgICAgICAgIGlmICh0aGlzLnBhdGggPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAoIiIpOworICAgICAgICByZXR1cm4gKHRoaXMucGF0aCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcG9ydCBudW1iZXIgcGFydCBvZiB0aGUgVVJMLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UG9ydCgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMucG9ydCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcHJvdG9jb2wgbmFtZSBwYXJ0IG9mIHRoZSBVUkwuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRQcm90b2NvbCgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMucHJvdG9jb2wpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHF1ZXJ5IHBhcnQgb2YgdGhlIFVSTC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFF1ZXJ5KCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5xdWVyeSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcmVmZXJlbmNlIHBhcnQgb2YgdGhlIFVSTC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlZigpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMucmVmKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB1c2VyIGluZm8gcGFydCBvZiB0aGUgVVJMLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXNlckluZm8oKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLnVzZXJJbmZvKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogTm9ybWFsaXplIHRoZSA8Y29kZT5wYXRoPC9jb2RlPiAoYW5kIHRoZXJlZm9yZSA8Y29kZT5maWxlPC9jb2RlPikKKyAgICAgKiBwb3J0aW9ucyBvZiB0aGlzIFVSTC4KKyAgICAgKiA8cD4KKyAgICAgKiA8c3Ryb25nPk5PVEU8L3N0cm9uZz4gLSBUaGlzIG1ldGhvZCBpcyBub3QgcGFydCBvZiB0aGUgcHVibGljIEFQSQorICAgICAqIG9mIDxjb2RlPmphdmEubmV0LlVSTDwvY29kZT4sIGJ1dCBpcyBwcm92aWRlZCBhcyBhIHZhbHVlIGFkZGVkCisgICAgICogc2VydmljZSBvZiB0aGlzIGltcGxlbWVudGF0aW9uLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBNYWxmb3JtZWRVUkxFeGNlcHRpb24gaWYgYSBub3JtYWxpemF0aW9uIGVycm9yIG9jY3VycywKKyAgICAgKiAgc3VjaCBhcyB0cnlpbmcgdG8gbW92ZSBhYm91dCB0aGUgaGllcmFyY2hpY2FsIHJvb3QKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBub3JtYWxpemUoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIG51bGwgcGF0aAorICAgICAgICBpZiAocGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICBpZiAocXVlcnkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBmaWxlID0gIj8iICsgcXVlcnk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZmlsZSA9ICIiOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ3JlYXRlIGEgcGxhY2UgZm9yIHRoZSBub3JtYWxpemVkIHBhdGgKKyAgICAgICAgU3RyaW5nIG5vcm1hbGl6ZWQgPSBwYXRoOworICAgICAgICBpZiAobm9ybWFsaXplZC5lcXVhbHMoIi8uIikpIHsKKyAgICAgICAgICAgIHBhdGggPSAiLyI7CisgICAgICAgICAgICBpZiAocXVlcnkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBmaWxlID0gcGF0aCArICI/IiArIHF1ZXJ5OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGZpbGUgPSBwYXRoOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gTm9ybWFsaXplIHRoZSBzbGFzaGVzIGFuZCBhZGQgbGVhZGluZyBzbGFzaCBpZiBuZWNlc3NhcnkKKyAgICAgICAgaWYgKG5vcm1hbGl6ZWQuaW5kZXhPZignXFwnKSA+PSAwKQorICAgICAgICAgICAgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZWQucmVwbGFjZSgnXFwnLCAnLycpOworICAgICAgICBpZiAoIW5vcm1hbGl6ZWQuc3RhcnRzV2l0aCgiLyIpKQorICAgICAgICAgICAgbm9ybWFsaXplZCA9ICIvIiArIG5vcm1hbGl6ZWQ7CisKKyAgICAgICAgLy8gUmVzb2x2ZSBvY2N1cnJlbmNlcyBvZiAiLy8iIGluIHRoZSBub3JtYWxpemVkIHBhdGgKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIGludCBpbmRleCA9IG5vcm1hbGl6ZWQuaW5kZXhPZigiLy8iKTsKKyAgICAgICAgICAgIGlmIChpbmRleCA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBub3JtYWxpemVkID0gbm9ybWFsaXplZC5zdWJzdHJpbmcoMCwgaW5kZXgpICsKKyAgICAgICAgICAgICAgICBub3JtYWxpemVkLnN1YnN0cmluZyhpbmRleCArIDEpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmVzb2x2ZSBvY2N1cnJlbmNlcyBvZiAiLy4vIiBpbiB0aGUgbm9ybWFsaXplZCBwYXRoCisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBpbnQgaW5kZXggPSBub3JtYWxpemVkLmluZGV4T2YoIi8uLyIpOworICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIG5vcm1hbGl6ZWQgPSBub3JtYWxpemVkLnN1YnN0cmluZygwLCBpbmRleCkgKworICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWQuc3Vic3RyaW5nKGluZGV4ICsgMik7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXNvbHZlIG9jY3VycmVuY2VzIG9mICIvLi4vIiBpbiB0aGUgbm9ybWFsaXplZCBwYXRoCisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBpbnQgaW5kZXggPSBub3JtYWxpemVkLmluZGV4T2YoIi8uLi8iKTsKKyAgICAgICAgICAgIGlmIChpbmRleCA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpZiAoaW5kZXggPT0gMCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWFsZm9ybWVkVVJMRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgICgiSW52YWxpZCByZWxhdGl2ZSBVUkwgcmVmZXJlbmNlIik7CisgICAgICAgICAgICBpbnQgaW5kZXgyID0gbm9ybWFsaXplZC5sYXN0SW5kZXhPZignLycsIGluZGV4IC0gMSk7CisgICAgICAgICAgICBub3JtYWxpemVkID0gbm9ybWFsaXplZC5zdWJzdHJpbmcoMCwgaW5kZXgyKSArCisgICAgICAgICAgICAgICAgbm9ybWFsaXplZC5zdWJzdHJpbmcoaW5kZXggKyAzKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlc29sdmUgb2NjdXJyZW5jZXMgb2YgIi8uIiBhdCB0aGUgZW5kIG9mIHRoZSBub3JtYWxpemVkIHBhdGgKKyAgICAgICAgaWYgKG5vcm1hbGl6ZWQuZW5kc1dpdGgoIi8uIikpCisgICAgICAgICAgICBub3JtYWxpemVkID0gbm9ybWFsaXplZC5zdWJzdHJpbmcoMCwgbm9ybWFsaXplZC5sZW5ndGgoKSAtIDEpOworCisgICAgICAgIC8vIFJlc29sdmUgb2NjdXJyZW5jZXMgb2YgIi8uLiIgYXQgdGhlIGVuZCBvZiB0aGUgbm9ybWFsaXplZCBwYXRoCisgICAgICAgIGlmIChub3JtYWxpemVkLmVuZHNXaXRoKCIvLi4iKSkgeworICAgICAgICAgICAgaW50IGluZGV4ID0gbm9ybWFsaXplZC5sZW5ndGgoKSAtIDM7CisgICAgICAgICAgICBpbnQgaW5kZXgyID0gbm9ybWFsaXplZC5sYXN0SW5kZXhPZignLycsIGluZGV4IC0gMSk7CisgICAgICAgICAgICBpZiAoaW5kZXgyIDwgMCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWFsZm9ybWVkVVJMRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgICgiSW52YWxpZCByZWxhdGl2ZSBVUkwgcmVmZXJlbmNlIik7CisgICAgICAgICAgICBub3JtYWxpemVkID0gbm9ybWFsaXplZC5zdWJzdHJpbmcoMCwgaW5kZXgyICsgMSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXR1cm4gdGhlIG5vcm1hbGl6ZWQgcGF0aCB0aGF0IHdlIGhhdmUgY29tcGxldGVkCisgICAgICAgIHBhdGggPSBub3JtYWxpemVkOworICAgICAgICBpZiAocXVlcnkgIT0gbnVsbCkKKyAgICAgICAgICAgIGZpbGUgPSBwYXRoICsgIj8iICsgcXVlcnk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGZpbGUgPSBwYXRoOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDb21wYXJlIHR3byBVUkxzLCBleGNsdWRpbmcgdGhlICJyZWYiIGZpZWxkcy4gIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4KKyAgICAgKiBpZiB0aGlzIDxjb2RlPlVSTDwvY29kZT4gYW5kIHRoZSA8Y29kZT5vdGhlcjwvY29kZT4gYXJndW1lbnQgYm90aCByZWZlcgorICAgICAqIHRvIHRoZSBzYW1lIHJlc291cmNlLiAgVGhlIHR3byA8Y29kZT5VUkxzPC9jb2RlPiBtaWdodCBub3QgYm90aCBjb250YWluCisgICAgICogdGhlIHNhbWUgYW5jaG9yLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHNhbWVGaWxlKFVSTCBvdGhlcikgeworCisgICAgICAgIGlmICghY29tcGFyZShwcm90b2NvbCwgb3RoZXIuZ2V0UHJvdG9jb2woKSkpCisgICAgICAgICAgICByZXR1cm4gKGZhbHNlKTsKKyAgICAgICAgaWYgKCFjb21wYXJlKGhvc3QsIG90aGVyLmdldEhvc3QoKSkpCisgICAgICAgICAgICByZXR1cm4gKGZhbHNlKTsKKyAgICAgICAgaWYgKHBvcnQgIT0gb3RoZXIuZ2V0UG9ydCgpKQorICAgICAgICAgICAgcmV0dXJuIChmYWxzZSk7CisgICAgICAgIGlmICghY29tcGFyZShmaWxlLCBvdGhlci5nZXRGaWxlKCkpKQorICAgICAgICAgICAgcmV0dXJuIChmYWxzZSk7CisgICAgICAgIHJldHVybiAodHJ1ZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIFVSTC4gIFRoaXMgZm9sbG93IHRoZSBydWxlcyBpbgorICAgICAqIFJGQyAyMzk2LCBTZWN0aW9uIDUuMiwgU3RlcCA3LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9FeHRlcm5hbEZvcm0oKSB7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBpZiAocHJvdG9jb2wgIT0gbnVsbCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKHByb3RvY29sKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiOiIpOworICAgICAgICB9CisgICAgICAgIGlmIChhdXRob3JpdHkgIT0gbnVsbCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIvLyIpOworICAgICAgICAgICAgc2IuYXBwZW5kKGF1dGhvcml0eSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBhdGggIT0gbnVsbCkKKyAgICAgICAgICAgIHNiLmFwcGVuZChwYXRoKTsKKyAgICAgICAgaWYgKHF1ZXJ5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgnPycpOworICAgICAgICAgICAgc2IuYXBwZW5kKHF1ZXJ5KTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVmICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgnIycpOworICAgICAgICAgICAgc2IuYXBwZW5kKHJlZik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChzYi50b1N0cmluZygpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiVVJMWyIpOworICAgICAgICBzYi5hcHBlbmQoImF1dGhvcml0eT0iKTsKKyAgICAgICAgc2IuYXBwZW5kKGF1dGhvcml0eSk7CisgICAgICAgIHNiLmFwcGVuZCgiLCBmaWxlPSIpOworICAgICAgICBzYi5hcHBlbmQoZmlsZSk7CisgICAgICAgIHNiLmFwcGVuZCgiLCBob3N0PSIpOworICAgICAgICBzYi5hcHBlbmQoaG9zdCk7CisgICAgICAgIHNiLmFwcGVuZCgiLCBwb3J0PSIpOworICAgICAgICBzYi5hcHBlbmQocG9ydCk7CisgICAgICAgIHNiLmFwcGVuZCgiLCBwcm90b2NvbD0iKTsKKyAgICAgICAgc2IuYXBwZW5kKHByb3RvY29sKTsKKyAgICAgICAgc2IuYXBwZW5kKCIsIHF1ZXJ5PSIpOworICAgICAgICBzYi5hcHBlbmQocXVlcnkpOworICAgICAgICBzYi5hcHBlbmQoIiwgcmVmPSIpOworICAgICAgICBzYi5hcHBlbmQocmVmKTsKKyAgICAgICAgc2IuYXBwZW5kKCIsIHVzZXJJbmZvPSIpOworICAgICAgICBzYi5hcHBlbmQodXNlckluZm8pOworICAgICAgICBzYi5hcHBlbmQoIl0iKTsKKyAgICAgICAgcmV0dXJuIChzYi50b1N0cmluZygpKTsKKworICAgICAgICAvLyAgICAgICAgcmV0dXJuICh0b0V4dGVybmFsRm9ybSgpKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJpdmF0ZSBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIENvbXBhcmUgdG8gU3RyaW5nIHZhbHVlcyBmb3IgZXF1YWxpdHksIHRha2luZyBhcHByb3ByaWF0ZSBjYXJlIGlmIG9uZQorICAgICAqIG9yIGJvdGggb2YgdGhlIHZhbHVlcyBhcmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlyc3QgRmlyc3Qgc3RyaW5nCisgICAgICogQHBhcmFtIHNlY29uZCBTZWNvbmQgc3RyaW5nCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGNvbXBhcmUoU3RyaW5nIGZpcnN0LCBTdHJpbmcgc2Vjb25kKSB7CisKKyAgICAgICAgaWYgKGZpcnN0ID09IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChzZWNvbmQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gKHRydWUpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiAoZmFsc2UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHNlY29uZCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiAoZmFsc2UpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiAoZmlyc3QuZXF1YWxzKHNlY29uZCkpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFBhcnNlIHRoZSBzcGVjaWZpZWQgcG9ydGlvbiBvZiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgVVJMLAorICAgICAqIGFzc3VtaW5nIHRoYXQgaXQgaGFzIGEgZm9ybWF0IHNpbWlsYXIgdG8gdGhhdCBmb3IgPGNvZGU+aHR0cDwvY29kZT4uCisgICAgICoKKyAgICAgKiA8cD48c3Ryb25nPkZJWE1FPC9zdHJvbmc+IC0gVGhpcyBhbGdvcml0aG0gY2FuIHVuZG91YnRlZGx5IGJlIG9wdGltaXplZAorICAgICAqIGZvciBwZXJmb3JtYW5jZS4gIEhvd2V2ZXIsIHRoYXQgbmVlZHMgdG8gd2FpdCB1bnRpbCBhZnRlciBzdWZmaWNpZW50CisgICAgICogdW5pdCB0ZXN0cyBhcmUgaW1wbGVtZW50ZWQgdG8gZ3VhcmFudGVlIGNvcnJlY3QgYmVoYXZpb3Igd2l0aCBubworICAgICAqIHJlZ3Jlc3Npb25zLjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzcGVjIFN0cmluZyByZXByZXNlbnRhdGlvbiBiZWluZyBwYXJzZWQKKyAgICAgKiBAcGFyYW0gc3RhcnQgU3RhcnRpbmcgb2Zmc2V0LCB3aGljaCB3aWxsIGJlIGp1c3QgYWZ0ZXIgdGhlICc6JyAoaWYKKyAgICAgKiAgdGhlcmUgaXMgb25lKSB0aGF0IGRldGVybWluZWQgdGhlIHByb3RvY29sIG5hbWUKKyAgICAgKiBAcGFyYW0gbGltaXQgRW5kaW5nIHBvc2l0aW9uLCB3aGljaCB3aWxsIGJlIHRoZSBwb3NpdGlvbiBvZiB0aGUgJyMnCisgICAgICogIChpZiB0aGVyZSBpcyBvbmUpIHRoYXQgZGVsaW1pdGVkIHRoZSBhbmNob3IKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGlmIGEgcGFyc2luZyBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcGFyc2UoU3RyaW5nIHNwZWMsIGludCBzdGFydCwgaW50IGxpbWl0KQorICAgICAgICB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBUcmltIHRoZSBxdWVyeSBzdHJpbmcgKGlmIGFueSkgb2ZmIHRoZSB0YWlsIGVuZAorICAgICAgICBpbnQgcXVlc3Rpb24gPSBzcGVjLmxhc3RJbmRleE9mKCc/JywgbGltaXQgLSAxKTsKKyAgICAgICAgaWYgKChxdWVzdGlvbiA+PSAwKSAmJiAocXVlc3Rpb24gPCBsaW1pdCkpIHsKKyAgICAgICAgICAgIHF1ZXJ5ID0gc3BlYy5zdWJzdHJpbmcocXVlc3Rpb24gKyAxLCBsaW1pdCk7CisgICAgICAgICAgICBsaW1pdCA9IHF1ZXN0aW9uOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcXVlcnkgPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgLy8gUGFyc2UgdGhlIGF1dGhvcml0eSBzZWN0aW9uCisgICAgICAgIGlmIChzcGVjLmluZGV4T2YoIi8vIiwgc3RhcnQpID09IHN0YXJ0KSB7CisgICAgICAgICAgICBpbnQgcGF0aFN0YXJ0ID0gc3BlYy5pbmRleE9mKCIvIiwgc3RhcnQgKyAyKTsKKyAgICAgICAgICAgIGlmICgocGF0aFN0YXJ0ID49IDApICYmIChwYXRoU3RhcnQgPCBsaW1pdCkpIHsKKyAgICAgICAgICAgICAgICBhdXRob3JpdHkgPSBzcGVjLnN1YnN0cmluZyhzdGFydCArIDIsIHBhdGhTdGFydCk7CisgICAgICAgICAgICAgICAgc3RhcnQgPSBwYXRoU3RhcnQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGF1dGhvcml0eSA9IHNwZWMuc3Vic3RyaW5nKHN0YXJ0ICsgMiwgbGltaXQpOworICAgICAgICAgICAgICAgIHN0YXJ0ID0gbGltaXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYXV0aG9yaXR5Lmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgIGludCBhdCA9IGF1dGhvcml0eS5pbmRleE9mKCdAJyk7CisgICAgICAgICAgICAgICAgaWYoIGF0ID49IDAgKSB7CisgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvID0gYXV0aG9yaXR5LnN1YnN0cmluZygwLGF0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW50IGNvbG9uID0gYXV0aG9yaXR5LmluZGV4T2YoJzonLGF0KzEpOworICAgICAgICAgICAgICAgIGlmIChjb2xvbiA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwb3J0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnBhcnNlSW50KGF1dGhvcml0eS5zdWJzdHJpbmcoY29sb24gKyAxKSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWFsZm9ybWVkVVJMRXhjZXB0aW9uKGUudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaG9zdCA9IGF1dGhvcml0eS5zdWJzdHJpbmcoYXQrMSwgY29sb24pOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGhvc3QgPSBhdXRob3JpdHkuc3Vic3RyaW5nKGF0KzEpOworICAgICAgICAgICAgICAgICAgICBwb3J0ID0gLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gUGFyc2UgdGhlIHBhdGggc2VjdGlvbgorICAgICAgICBpZiAoc3BlYy5pbmRleE9mKCIvIiwgc3RhcnQpID09IHN0YXJ0KSB7ICAgICAvLyBBYnNvbHV0ZSBwYXRoCisgICAgICAgICAgICBwYXRoID0gc3BlYy5zdWJzdHJpbmcoc3RhcnQsIGxpbWl0KTsKKyAgICAgICAgICAgIGlmIChxdWVyeSAhPSBudWxsKQorICAgICAgICAgICAgICAgIGZpbGUgPSBwYXRoICsgIj8iICsgcXVlcnk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZmlsZSA9IHBhdGg7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXNvbHZlIHJlbGF0aXZlIHBhdGggYWdhaW5zdCBvdXIgY29udGV4dCdzIGZpbGUKKyAgICAgICAgaWYgKHBhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKHF1ZXJ5ICE9IG51bGwpCisgICAgICAgICAgICAgICAgZmlsZSA9ICI/IiArIHF1ZXJ5OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGZpbGUgPSBudWxsOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICghcGF0aC5zdGFydHNXaXRoKCIvIikpCisgICAgICAgICAgICB0aHJvdyBuZXcgTWFsZm9ybWVkVVJMRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKCJCYXNlIHBhdGggZG9lcyBub3Qgc3RhcnQgd2l0aCAnLyciKTsKKyAgICAgICAgaWYgKCFwYXRoLmVuZHNXaXRoKCIvIikpCisgICAgICAgICAgICBwYXRoICs9ICIvLi4vIjsKKyAgICAgICAgcGF0aCArPSBzcGVjLnN1YnN0cmluZyhzdGFydCwgbGltaXQpOworICAgICAgICBpZiAocXVlcnkgIT0gbnVsbCkKKyAgICAgICAgICAgIGZpbGUgPSBwYXRoICsgIj8iICsgcXVlcnk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGZpbGUgPSBwYXRoOworICAgICAgICByZXR1cm47CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvVVJMRW5jb2Rlci5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvVVJMRW5jb2Rlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkMjNkYmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9VUkxFbmNvZGVyLmphdmEKQEAgLTAsMCArMSwxMDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQml0U2V0OworCisvKioKKyAqCisgKiBUaGlzIGNsYXNzIGlzIHZlcnkgc2ltaWxhciB0byB0aGUgamF2YS5uZXQuVVJMRW5jb2RlciBjbGFzcy4KKyAqCisgKiBVbmZvcnR1bmF0ZWx5LCB3aXRoIGphdmEubmV0LlVSTEVuY29kZXIgdGhlcmUgaXMgbm8gd2F5IHRvIHNwZWNpZnkgdG8gdGhlIAorICogamF2YS5uZXQuVVJMRW5jb2RlciB3aGljaCBjaGFyYWN0ZXJzIHNob3VsZCBOT1QgYmUgZW5jb2RlZC4KKyAqCisgKiBUaGlzIGNvZGUgd2FzIG1vdmVkIGZyb20gRGVmYXVsdFNlcnZsZXQuamF2YQorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQGF1dGhvciBSZW15IE1hdWNoZXJhdAorICovCitwdWJsaWMgY2xhc3MgVVJMRW5jb2RlciB7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBjaGFyW10gaGV4YWRlY2ltYWwgPQorICAgIHsnMCcsICcxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3JywgJzgnLCAnOScsCisgICAgICdBJywgJ0InLCAnQycsICdEJywgJ0UnLCAnRid9OworCisgICAgLy9BcnJheSBjb250YWluaW5nIHRoZSBzYWZlIGNoYXJhY3RlcnMgc2V0LgorICAgIHByb3RlY3RlZCBCaXRTZXQgc2FmZUNoYXJhY3RlcnMgPSBuZXcgQml0U2V0KDI1Nik7CisKKyAgICBwdWJsaWMgVVJMRW5jb2RlcigpIHsKKyAgICAgICAgZm9yIChjaGFyIGkgPSAnYSc7IGkgPD0gJ3onOyBpKyspIHsKKyAgICAgICAgICAgIGFkZFNhZmVDaGFyYWN0ZXIoaSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChjaGFyIGkgPSAnQSc7IGkgPD0gJ1onOyBpKyspIHsKKyAgICAgICAgICAgIGFkZFNhZmVDaGFyYWN0ZXIoaSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChjaGFyIGkgPSAnMCc7IGkgPD0gJzknOyBpKyspIHsKKyAgICAgICAgICAgIGFkZFNhZmVDaGFyYWN0ZXIoaSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRTYWZlQ2hhcmFjdGVyKCBjaGFyIGMgKSB7CisJc2FmZUNoYXJhY3RlcnMuc2V0KCBjICk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBlbmNvZGUoIFN0cmluZyBwYXRoICkgeworICAgICAgICBpbnQgbWF4Qnl0ZXNQZXJDaGFyID0gMTA7CisgICAgICAgIGludCBjYXNlRGlmZiA9ICgnYScgLSAnQScpOworICAgICAgICBTdHJpbmdCdWZmZXIgcmV3cml0dGVuUGF0aCA9IG5ldyBTdHJpbmdCdWZmZXIocGF0aC5sZW5ndGgoKSk7CisgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBidWYgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKG1heEJ5dGVzUGVyQ2hhcik7CisgICAgICAgIE91dHB1dFN0cmVhbVdyaXRlciB3cml0ZXIgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgd3JpdGVyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihidWYsICJVVEY4Iik7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgd3JpdGVyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihidWYpOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXRoLmxlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgIGludCBjID0gKGludCkgcGF0aC5jaGFyQXQoaSk7CisgICAgICAgICAgICBpZiAoc2FmZUNoYXJhY3RlcnMuZ2V0KGMpKSB7CisgICAgICAgICAgICAgICAgcmV3cml0dGVuUGF0aC5hcHBlbmQoKGNoYXIpYyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgdG8gZXh0ZXJuYWwgZW5jb2RpbmcgYmVmb3JlIGhleCBjb252ZXJzaW9uCisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKChjaGFyKWMpOworICAgICAgICAgICAgICAgICAgICB3cml0ZXIuZmx1c2goKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgYnVmLnJlc2V0KCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBieXRlW10gYmEgPSBidWYudG9CeXRlQXJyYXkoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGJhLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIENvbnZlcnRpbmcgZWFjaCBieXRlIGluIHRoZSBidWZmZXIKKyAgICAgICAgICAgICAgICAgICAgYnl0ZSB0b0VuY29kZSA9IGJhW2pdOworICAgICAgICAgICAgICAgICAgICByZXdyaXR0ZW5QYXRoLmFwcGVuZCgnJScpOworICAgICAgICAgICAgICAgICAgICBpbnQgbG93ID0gKGludCkgKHRvRW5jb2RlICYgMHgwZik7CisgICAgICAgICAgICAgICAgICAgIGludCBoaWdoID0gKGludCkgKCh0b0VuY29kZSAmIDB4ZjApID4+IDQpOworICAgICAgICAgICAgICAgICAgICByZXdyaXR0ZW5QYXRoLmFwcGVuZChoZXhhZGVjaW1hbFtoaWdoXSk7CisgICAgICAgICAgICAgICAgICAgIHJld3JpdHRlblBhdGguYXBwZW5kKGhleGFkZWNpbWFsW2xvd10pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBidWYucmVzZXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV3cml0dGVuUGF0aC50b1N0cmluZygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL1hNTFdyaXRlci5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvWE1MV3JpdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFhNzFhNgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL1hNTFdyaXRlci5qYXZhCkBAIC0wLDAgKzEsMjQzIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLldyaXRlcjsKKworLyoqCisgKiBYTUxXcml0ZXIgaGVscGVyIGNsYXNzLgorICoKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnJlbW1AYXBhY2hlLm9yZyI+UmVteSBNYXVjaGVyYXQ8L2E+CisgKi8KK3B1YmxpYyBjbGFzcyBYTUxXcml0ZXIgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdGFudHMKKworCisgICAgLyoqCisgICAgICogT3BlbmluZyB0YWcuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BFTklORyA9IDA7CisKKworICAgIC8qKgorICAgICAqIENsb3NpbmcgdGFnLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMT1NJTkcgPSAxOworCisKKyAgICAvKioKKyAgICAgKiBFbGVtZW50IHdpdGggbm8gY29udGVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT19DT05URU5UID0gMjsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIEJ1ZmZlci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKworCisgICAgLyoqCisgICAgICogV3JpdGVyLgorICAgICAqLworICAgIHByb3RlY3RlZCBXcml0ZXIgd3JpdGVyID0gbnVsbDsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLgorICAgICAqLworICAgIHB1YmxpYyBYTUxXcml0ZXIoKSB7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgWE1MV3JpdGVyKFdyaXRlciB3cml0ZXIpIHsKKyAgICAgICAgdGhpcy53cml0ZXIgPSB3cml0ZXI7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmV0cmlldmUgZ2VuZXJhdGVkIFhNTC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gU3RyaW5nIGNvbnRhaW5pbmcgdGhlIGdlbmVyYXRlZCBYTUwKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBXcml0ZSBwcm9wZXJ0eSB0byB0aGUgWE1MLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWVzcGFjZSBOYW1lc3BhY2UKKyAgICAgKiBAcGFyYW0gbmFtZXNwYWNlSW5mbyBOYW1lc3BhY2UgaW5mbworICAgICAqIEBwYXJhbSBuYW1lIFByb3BlcnR5IG5hbWUKKyAgICAgKiBAcGFyYW0gdmFsdWUgUHJvcGVydHkgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3cml0ZVByb3BlcnR5KFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBuYW1lc3BhY2VJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICB3cml0ZUVsZW1lbnQobmFtZXNwYWNlLCBuYW1lc3BhY2VJbmZvLCBuYW1lLCBPUEVOSU5HKTsKKyAgICAgICAgYnVmZmVyLmFwcGVuZCh2YWx1ZSk7CisgICAgICAgIHdyaXRlRWxlbWVudChuYW1lc3BhY2UsIG5hbWVzcGFjZUluZm8sIG5hbWUsIENMT1NJTkcpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBXcml0ZSBwcm9wZXJ0eSB0byB0aGUgWE1MLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWVzcGFjZSBOYW1lc3BhY2UKKyAgICAgKiBAcGFyYW0gbmFtZSBQcm9wZXJ0eSBuYW1lCisgICAgICogQHBhcmFtIHZhbHVlIFByb3BlcnR5IHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgd3JpdGVQcm9wZXJ0eShTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIHdyaXRlRWxlbWVudChuYW1lc3BhY2UsIG5hbWUsIE9QRU5JTkcpOworICAgICAgICBidWZmZXIuYXBwZW5kKHZhbHVlKTsKKyAgICAgICAgd3JpdGVFbGVtZW50KG5hbWVzcGFjZSwgbmFtZSwgQ0xPU0lORyk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBXcml0ZSBwcm9wZXJ0eSB0byB0aGUgWE1MLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWVzcGFjZSBOYW1lc3BhY2UKKyAgICAgKiBAcGFyYW0gbmFtZSBQcm9wZXJ0eSBuYW1lCisgICAgICovCisgICAgcHVibGljIHZvaWQgd3JpdGVQcm9wZXJ0eShTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbmFtZSkgeworICAgICAgICB3cml0ZUVsZW1lbnQobmFtZXNwYWNlLCBuYW1lLCBOT19DT05URU5UKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFdyaXRlIGFuIGVsZW1lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBFbGVtZW50IG5hbWUKKyAgICAgKiBAcGFyYW0gbmFtZXNwYWNlIE5hbWVzcGFjZSBhYmJyZXZpYXRpb24KKyAgICAgKiBAcGFyYW0gdHlwZSBFbGVtZW50IHR5cGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3cml0ZUVsZW1lbnQoU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIG5hbWUsIGludCB0eXBlKSB7CisgICAgICAgIHdyaXRlRWxlbWVudChuYW1lc3BhY2UsIG51bGwsIG5hbWUsIHR5cGUpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogV3JpdGUgYW4gZWxlbWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lc3BhY2UgTmFtZXNwYWNlIGFiYnJldmlhdGlvbgorICAgICAqIEBwYXJhbSBuYW1lc3BhY2VJbmZvIE5hbWVzcGFjZSBpbmZvCisgICAgICogQHBhcmFtIG5hbWUgRWxlbWVudCBuYW1lCisgICAgICogQHBhcmFtIHR5cGUgRWxlbWVudCB0eXBlCisgICAgICovCisgICAgcHVibGljIHZvaWQgd3JpdGVFbGVtZW50KFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBuYW1lc3BhY2VJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSwgaW50IHR5cGUpIHsKKyAgICAgICAgaWYgKChuYW1lc3BhY2UgIT0gbnVsbCkgJiYgKG5hbWVzcGFjZS5sZW5ndGgoKSA+IDApKSB7CisgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgT1BFTklORzoKKyAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlSW5mbyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIjwiICsgbmFtZXNwYWNlICsgIjoiICsgbmFtZSArICIgeG1sbnM6IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbmFtZXNwYWNlICsgIj1cIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG5hbWVzcGFjZUluZm8gKyAiXCI+Iik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiPCIgKyBuYW1lc3BhY2UgKyAiOiIgKyBuYW1lICsgIj4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENMT1NJTkc6CisgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiPC8iICsgbmFtZXNwYWNlICsgIjoiICsgbmFtZSArICI+XG4iKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTk9fQ09OVEVOVDoKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZUluZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCI8IiArIG5hbWVzcGFjZSArICI6IiArIG5hbWUgKyAiIHhtbG5zOiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG5hbWVzcGFjZSArICI9XCIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBuYW1lc3BhY2VJbmZvICsgIlwiLz4iKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCI8IiArIG5hbWVzcGFjZSArICI6IiArIG5hbWUgKyAiLz4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgT1BFTklORzoKKyAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCI8IiArIG5hbWUgKyAiPiIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDTE9TSU5HOgorICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIjwvIiArIG5hbWUgKyAiPlxuIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE5PX0NPTlRFTlQ6CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIjwiICsgbmFtZSArICIvPiIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBXcml0ZSB0ZXh0LgorICAgICAqCisgICAgICogQHBhcmFtIHRleHQgVGV4dCB0byBhcHBlbmQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRleHQoU3RyaW5nIHRleHQpIHsKKyAgICAgICAgYnVmZmVyLmFwcGVuZCh0ZXh0KTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFdyaXRlIGRhdGEuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGF0YSBEYXRhIHRvIGFwcGVuZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHdyaXRlRGF0YShTdHJpbmcgZGF0YSkgeworICAgICAgICBidWZmZXIuYXBwZW5kKCI8IVtDREFUQVsiICsgZGF0YSArICJdXT4iKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFdyaXRlIFhNTCBIZWFkZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgd3JpdGVYTUxIZWFkZXIoKSB7CisgICAgICAgIGJ1ZmZlci5hcHBlbmQoIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cInV0Zi04XCIgPz5cbiIpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2VuZCBkYXRhIGFuZCByZWluaXRpYWxpemVzIGJ1ZmZlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZW5kRGF0YSgpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmICh3cml0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgd3JpdGVyLndyaXRlKGJ1ZmZlci50b1N0cmluZygpKTsKKyAgICAgICAgICAgIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgfQorICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdmFsdmVzL0FjY2Vzc0xvZ1ZhbHZlLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdmFsdmVzL0FjY2Vzc0xvZ1ZhbHZlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWExNGFhOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS92YWx2ZXMvQWNjZXNzTG9nVmFsdmUuamF2YQpAQCAtMCwwICsxLDExMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OS0yMDAxLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS52YWx2ZXM7CisKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworaW1wb3J0IGphdmEudGV4dC5EZWNpbWFsRm9ybWF0OworaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5UaW1lWm9uZTsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuQ29va2llOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuUmVxdWVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3Rvci5SZXNwb25zZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuTGlmZWN5Y2xlU3VwcG9ydDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuU3RyaW5nTWFuYWdlcjsKKworCisvKioKKyAqIDxwPkltcGxlbWVudGF0aW9uIG9mIHRoZSA8Yj5WYWx2ZTwvYj4gaW50ZXJmYWNlIHRoYXQgZ2VuZXJhdGVzIGEgd2ViIHNlcnZlcgorICogYWNjZXNzIGxvZyB3aXRoIHRoZSBkZXRhaWxlZCBsaW5lIGNvbnRlbnRzIG1hdGNoaW5nIGEgY29uZmlndXJhYmxlIHBhdHRlcm4uCisgKiBUaGUgc3ludGF4IG9mIHRoZSBhdmFpbGFibGUgcGF0dGVybnMgaXMgc2ltaWxhciB0byB0aGF0IHN1cHBvcnRlZCBieSB0aGUKKyAqIEFwYWNoZSA8Y29kZT5tb2RfbG9nX2NvbmZpZzwvY29kZT4gbW9kdWxlLiAgQXMgYW4gYWRkaXRpb25hbCBmZWF0dXJlLAorICogYXV0b21hdGljIHJvbGxvdmVyIG9mIGxvZyBmaWxlcyB3aGVuIHRoZSBkYXRlIGNoYW5nZXMgaXMgYWxzbyBzdXBwb3J0ZWQuPC9wPgorICoKKyAqIDxwPlBhdHRlcm5zIGZvciB0aGUgbG9nZ2VkIG1lc3NhZ2UgbWF5IGluY2x1ZGUgY29uc3RhbnQgdGV4dCBvciBhbnkgb2YgdGhlCisgKiBmb2xsb3dpbmcgcmVwbGFjZW1lbnQgc3RyaW5ncywgZm9yIHdoaWNoIHRoZSBjb3JyZXNwb25kaW5nIGluZm9ybWF0aW9uCisgKiBmcm9tIHRoZSBzcGVjaWZpZWQgUmVzcG9uc2UgaXMgc3Vic3RpdHV0ZWQ6PC9wPgorICogPHVsPgorICogPGxpPjxiPiVhPC9iPiAtIFJlbW90ZSBJUCBhZGRyZXNzCisgKiA8bGk+PGI+JUE8L2I+IC0gTG9jYWwgSVAgYWRkcmVzcworICogPGxpPjxiPiViPC9iPiAtIEJ5dGVzIHNlbnQsIGV4Y2x1ZGluZyBIVFRQIGhlYWRlcnMsIG9yICctJyBpZiBubyBieXRlcworICogICAgIHdlcmUgc2VudAorICogPGxpPjxiPiVCPC9iPiAtIEJ5dGVzIHNlbnQsIGV4Y2x1ZGluZyBIVFRQIGhlYWRlcnMKKyAqIDxsaT48Yj4laDwvYj4gLSBSZW1vdGUgaG9zdCBuYW1lCisgKiA8bGk+PGI+JUg8L2I+IC0gUmVxdWVzdCBwcm90b2NvbAorICogPGxpPjxiPiVsPC9iPiAtIFJlbW90ZSBsb2dpY2FsIHVzZXJuYW1lIGZyb20gaWRlbnRkIChhbHdheXMgcmV0dXJucyAnLScpCisgKiA8bGk+PGI+JW08L2I+IC0gUmVxdWVzdCBtZXRob2QKKyAqIDxsaT48Yj4lcDwvYj4gLSBMb2NhbCBwb3J0CisgKiA8bGk+PGI+JXE8L2I+IC0gUXVlcnkgc3RyaW5nIChwcmVwZW5kZWQgd2l0aCBhICc/JyBpZiBpdCBleGlzdHMsIG90aGVyd2lzZQorICogICAgIGFuIGVtcHR5IHN0cmluZworICogPGxpPjxiPiVyPC9iPiAtIEZpcnN0IGxpbmUgb2YgdGhlIHJlcXVlc3QKKyAqIDxsaT48Yj4lczwvYj4gLSBIVFRQIHN0YXR1cyBjb2RlIG9mIHRoZSByZXNwb25zZQorICogPGxpPjxiPiVTPC9iPiAtIFVzZXIgc2Vzc2lvbiBJRAorICogPGxpPjxiPiV0PC9iPiAtIERhdGUgYW5kIHRpbWUsIGluIENvbW1vbiBMb2cgRm9ybWF0IGZvcm1hdAorICogPGxpPjxiPiV1PC9iPiAtIFJlbW90ZSB1c2VyIHRoYXQgd2FzIGF1dGhlbnRpY2F0ZWQKKyAqIDxsaT48Yj4lVTwvYj4gLSBSZXF1ZXN0ZWQgVVJMIHBhdGgKKyAqIDxsaT48Yj4ldjwvYj4gLSBMb2NhbCBzZXJ2ZXIgbmFtZQorICogPGxpPjxiPiVEPC9iPiAtIFRpbWUgdGFrZW4gdG8gcHJvY2VzcyB0aGUgcmVxdWVzdCwgaW4gbWlsbGlzCisgKiA8bGk+PGI+JVQ8L2I+IC0gVGltZSB0YWtlbiB0byBwcm9jZXNzIHRoZSByZXF1ZXN0LCBpbiBzZWNvbmRzCisgKiA8L3VsPgorICogPHA+SW4gYWRkaXRpb24sIHRoZSBjYWxsZXIgY2FuIHNwZWNpZnkgb25lIG9mIHRoZSBmb2xsb3dpbmcgYWxpYXNlcyBmb3IKKyAqIGNvbW1vbmx5IHV0aWxpemVkIHBhdHRlcm5zOjwvcD4KKyAqIDx1bD4KKyAqIDxsaT48Yj5jb21tb248L2I+IC0gPGNvZGU+JWggJWwgJXUgJXQgIiVyIiAlcyAlYjwvY29kZT4KKyAqIDxsaT48Yj5jb21iaW5lZDwvYj4gLQorICogICA8Y29kZT4laCAlbCAldSAldCAiJXIiICVzICViICIle1JlZmVyZXJ9aSIgIiV7VXNlci1BZ2VudH1pIjwvY29kZT4KKyAqIDwvdWw+CisgKgorICogPHA+CisgKiBUaGVyZSBpcyBhbHNvIHN1cHBvcnQgdG8gd3JpdGUgaW5mb3JtYXRpb24gZnJvbSB0aGUgY29va2llLCBpbmNvbWluZworICogaGVhZGVyLCB0aGUgU2Vzc2lvbiBvciBzb21ldGhpbmcgZWxzZSBpbiB0aGUgU2VydmxldFJlcXVlc3QuPGJyPgorICogSXQgaXMgbW9kZWxlZCBhZnRlciB0aGUgYXBhY2hlIHN5bnRheDoKKyAqIDx1bD4KKyAqIDxsaT48Y29kZT4le3h4eH1pPC9jb2RlPiBmb3IgaW5jb21pbmcgaGVhZGVycworICogPGxpPjxjb2RlPiV7eHh4fWM8L2NvZGU+IGZvciBhIHNwZWNpZmljIGNvb2tpZQorICogPGxpPjxjb2RlPiV7eHh4fXI8L2NvZGU+IHh4eCBpcyBhbiBhdHRyaWJ1dGUgaW4gdGhlIFNlcnZsZXRSZXF1ZXN0CisgKiA8bGk+PGNvZGU+JXt4eHh9czwvY29kZT4geHh4IGlzIGFuIGF0dHJpYnV0ZSBpbiB0aGUgSHR0cFNlc3Npb24KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogPHA+CisgKiBDb25kaXRpb25hbCBsb2dnaW5nIGlzIGFsc28gc3VwcG9ydGVkLiBUaGlzIGNhbiBiZSBkb25lIHdpdGggdGhlCisgKiA8Y29kZT5jb25kaXRpb248L2NvZGU+IHByb3BlcnR5LgorICogSWYgdGhlIHZhbHVlIHJldHVybmVkIGZyb20gU2VydmxldFJlcXVlc3QuZ2V0QXR0cmlidXRlKGNvbmRpdGlvbikKKyAqIHlpZWxkcyBhIG5vbi1udWxsIHZhbHVlLiBUaGUgbG9nZ2luZyB3aWxsIGJlIHNraXBwZWQuCisgKiA8L3A+CisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAYXV0aG9yIEphc29uIEJyaXR0YWluCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBBY2Nlc3NMb2dWYWx2ZQorICAgIGV4dGVuZHMgVmFsdmVCYXNlCisgICAgaW1wbGVtZW50cyBMaWZlY3ljbGUgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aCBkZWZhdWx0IHByb3BlcnR5IHZhbHVlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQWNjZXNzTG9nVmFsdmUoKSB7CisKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgc2V0UGF0dGVybigiY29tbW9uIik7CisKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBhcy1vZiBkYXRlIGZvciB0aGUgY3VycmVudGx5IG9wZW4gbG9nIGZpbGUsIG9yIGEgemVyby1sZW5ndGgKKyAgICAgKiBzdHJpbmcgaWYgdGhlcmUgaXMgbm8gb3BlbiBsb2cgZmlsZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBkYXRlU3RhbXAgPSAiIjsKKworCisgICAgLyoqCisgICAgICogVGhlIGRpcmVjdG9yeSBpbiB3aGljaCBsb2cgZmlsZXMgYXJlIGNyZWF0ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZGlyZWN0b3J5ID0gImxvZ3MiOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBpbmZvID0KKyAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEudmFsdmVzLkFjY2Vzc0xvZ1ZhbHZlLzEuMCI7CisKKworICAgIC8qKgorICAgICAqIFRoZSBsaWZlY3ljbGUgZXZlbnQgc3VwcG9ydCBmb3IgdGhpcyBjb21wb25lbnQuCisgICAgICovCisgICAgcHJvdGVjdGVkIExpZmVjeWNsZVN1cHBvcnQgbGlmZWN5Y2xlID0gbmV3IExpZmVjeWNsZVN1cHBvcnQodGhpcyk7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzZXQgb2YgbW9udGggYWJicmV2aWF0aW9ucyBmb3IgbG9nIG1lc3NhZ2VzLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIG1vbnRoc1tdID0KKyAgICB7ICJKYW4iLCAiRmViIiwgIk1hciIsICJBcHIiLCAiTWF5IiwgIkp1biIsCisgICAgICAiSnVsIiwgIkF1ZyIsICJTZXAiLCAiT2N0IiwgIk5vdiIsICJEZWMiIH07CisKKworICAgIC8qKgorICAgICAqIElmIHRoZSBjdXJyZW50IGxvZyBwYXR0ZXJuIGlzIHRoZSBzYW1lIGFzIHRoZSBjb21tb24gYWNjZXNzIGxvZworICAgICAqIGZvcm1hdCBwYXR0ZXJuLCB0aGVuIHdlJ2xsIHNldCB0aGlzIHZhcmlhYmxlIHRvIHRydWUgYW5kIGxvZyBpbgorICAgICAqIGEgbW9yZSBvcHRpbWFsIGFuZCBoYXJkLWNvZGVkIHdheS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gY29tbW9uID0gZmFsc2U7CisKKworICAgIC8qKgorICAgICAqIEZvciB0aGUgY29tYmluZWQgZm9ybWF0IChjb21tb24sIHBsdXMgdXNlcmFnZW50IGFuZCByZWZlcmVyKSwgd2UgZG8KKyAgICAgKiB0aGUgc2FtZQorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBjb21iaW5lZCA9IGZhbHNlOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgcGF0dGVybiB1c2VkIHRvIGZvcm1hdCBvdXIgYWNjZXNzIGxvZyBsaW5lcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBwYXR0ZXJuID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIHByZWZpeCB0aGF0IGlzIGFkZGVkIHRvIGxvZyBmaWxlIGZpbGVuYW1lcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBwcmVmaXggPSAiYWNjZXNzX2xvZy4iOworCisKKyAgICAvKioKKyAgICAgKiBTaG91bGQgd2Ugcm90YXRlIG91ciBsb2cgZmlsZT8gRGVmYXVsdCBpcyB0cnVlIChsaWtlIG9sZCBiZWhhdmlvcikKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gcm90YXRhYmxlID0gdHJ1ZTsKKworCisgICAgLyoqCisgICAgICogVGhlIHN0cmluZyBtYW5hZ2VyIGZvciB0aGlzIHBhY2thZ2UuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmdNYW5hZ2VyIHNtID0KKyAgICAgICAgU3RyaW5nTWFuYWdlci5nZXRNYW5hZ2VyKENvbnN0YW50cy5QYWNrYWdlKTsKKworCisgICAgLyoqCisgICAgICogSGFzIHRoaXMgY29tcG9uZW50IGJlZW4gc3RhcnRlZCB5ZXQ/CisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHN0YXJ0ZWQgPSBmYWxzZTsKKworCisgICAgLyoqCisgICAgICogVGhlIHN1ZmZpeCB0aGF0IGlzIGFkZGVkIHRvIGxvZyBmaWxlIGZpbGVuYW1lcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBzdWZmaXggPSAiIjsKKworCisgICAgLyoqCisgICAgICogVGhlIFByaW50V3JpdGVyIHRvIHdoaWNoIHdlIGFyZSBjdXJyZW50bHkgbG9nZ2luZywgaWYgYW55LgorICAgICAqLworICAgIHByaXZhdGUgUHJpbnRXcml0ZXIgd3JpdGVyID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogQSBkYXRlIGZvcm1hdHRlciB0byBmb3JtYXQgYSBEYXRlIGludG8gYSBkYXRlIGluIHRoZSBmb3JtYXQKKyAgICAgKiAieXl5eS1NTS1kZCIuCisgICAgICovCisgICAgcHJpdmF0ZSBTaW1wbGVEYXRlRm9ybWF0IGRhdGVGb3JtYXR0ZXIgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBBIGRhdGUgZm9ybWF0dGVyIHRvIGZvcm1hdCBEYXRlcyBpbnRvIGEgZGF5IHN0cmluZyBpbiB0aGUgZm9ybWF0CisgICAgICogImRkIi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFNpbXBsZURhdGVGb3JtYXQgZGF5Rm9ybWF0dGVyID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogQSBkYXRlIGZvcm1hdHRlciB0byBmb3JtYXQgYSBEYXRlIGludG8gYSBtb250aCBzdHJpbmcgaW4gdGhlIGZvcm1hdAorICAgICAqICJNTSIuCisgICAgICovCisgICAgcHJpdmF0ZSBTaW1wbGVEYXRlRm9ybWF0IG1vbnRoRm9ybWF0dGVyID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGltZSB0YWtlbiBmb3JtYXR0ZXIgZm9yIDMgZGVjaW1hbCBwbGFjZXMuCisgICAgICovCisgICAgIHByaXZhdGUgRGVjaW1hbEZvcm1hdCB0aW1lVGFrZW5Gb3JtYXR0ZXIgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBBIGRhdGUgZm9ybWF0dGVyIHRvIGZvcm1hdCBhIERhdGUgaW50byBhIHllYXIgc3RyaW5nIGluIHRoZSBmb3JtYXQKKyAgICAgKiAieXl5eSIuCisgICAgICovCisgICAgcHJpdmF0ZSBTaW1wbGVEYXRlRm9ybWF0IHllYXJGb3JtYXR0ZXIgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBBIGRhdGUgZm9ybWF0dGVyIHRvIGZvcm1hdCBhIERhdGUgaW50byBhIHRpbWUgaW4gdGhlIGZvcm1hdAorICAgICAqICJrazptbTpzcyIgKGtrIGlzIGEgMjQtaG91ciByZXByZXNlbnRhdGlvbiBvZiB0aGUgaG91cikuCisgICAgICovCisgICAgcHJpdmF0ZSBTaW1wbGVEYXRlRm9ybWF0IHRpbWVGb3JtYXR0ZXIgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgdGltZSB6b25lIHJlbGF0aXZlIHRvIEdNVC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyB0aW1lWm9uZSA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzeXN0ZW0gdGltZSB3aGVuIHdlIGxhc3QgdXBkYXRlZCB0aGUgRGF0ZSB0aGF0IHRoaXMgdmFsdmUKKyAgICAgKiB1c2VzIGZvciBsb2cgbGluZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBEYXRlIGN1cnJlbnREYXRlID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogV2hlbiBmb3JtYXR0aW5nIGxvZyBsaW5lcywgd2Ugb2Z0ZW4gdXNlIHN0cmluZ3MgbGlrZSB0aGlzIG9uZSAoIiAiKS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBzcGFjZSA9ICIgIjsKKworCisgICAgLyoqCisgICAgICogUmVzb2x2ZSBob3N0cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gcmVzb2x2ZUhvc3RzID0gZmFsc2U7CisKKworICAgIC8qKgorICAgICAqIEluc3RhbnQgd2hlbiB0aGUgbG9nIGRhaWx5IHJvdGF0aW9uIHdhcyBsYXN0IGNoZWNrZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBsb25nIHJvdGF0aW9uTGFzdENoZWNrZWQgPSAwTDsKKworCisgICAgLyoqCisgICAgICogQXJlIHdlIGRvaW5nIGNvbmRpdGlvbmFsIGxvZ2dpbmcuIGRlZmF1bHQgZmFsc2UuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgY29uZGl0aW9uID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogRGF0ZSBmb3JtYXQgdG8gcGxhY2UgaW4gbG9nIGZpbGUgbmFtZS4gVXNlIGF0IHlvdXIgb3duIHJpc2shCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZmlsZURhdGVGb3JtYXQgPSBudWxsOworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIHdlIGNyZWF0ZSBsb2cgZmlsZXMuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXREaXJlY3RvcnkoKSB7CisKKyAgICAgICAgcmV0dXJuIChkaXJlY3RvcnkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGRpcmVjdG9yeSBpbiB3aGljaCB3ZSBjcmVhdGUgbG9nIGZpbGVzLgorICAgICAqCisgICAgICogQHBhcmFtIGRpcmVjdG9yeSBUaGUgbmV3IGxvZyBmaWxlIGRpcmVjdG9yeQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERpcmVjdG9yeShTdHJpbmcgZGlyZWN0b3J5KSB7CisKKyAgICAgICAgdGhpcy5kaXJlY3RvcnkgPSBkaXJlY3Rvcnk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5mbygpIHsKKworICAgICAgICByZXR1cm4gKGluZm8pOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGZvcm1hdCBwYXR0ZXJuLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0dGVybigpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMucGF0dGVybik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZm9ybWF0IHBhdHRlcm4sIGZpcnN0IHRyYW5zbGF0aW5nIGFueSByZWNvZ25pemVkIGFsaWFzLgorICAgICAqCisgICAgICogQHBhcmFtIHBhdHRlcm4gVGhlIG5ldyBwYXR0ZXJuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGF0dGVybihTdHJpbmcgcGF0dGVybikgeworCisgICAgICAgIGlmIChwYXR0ZXJuID09IG51bGwpCisgICAgICAgICAgICBwYXR0ZXJuID0gIiI7CisgICAgICAgIGlmIChwYXR0ZXJuLmVxdWFscyhDb25zdGFudHMuQWNjZXNzTG9nLkNPTU1PTl9BTElBUykpCisgICAgICAgICAgICBwYXR0ZXJuID0gQ29uc3RhbnRzLkFjY2Vzc0xvZy5DT01NT05fUEFUVEVSTjsKKyAgICAgICAgaWYgKHBhdHRlcm4uZXF1YWxzKENvbnN0YW50cy5BY2Nlc3NMb2cuQ09NQklORURfQUxJQVMpKQorICAgICAgICAgICAgcGF0dGVybiA9IENvbnN0YW50cy5BY2Nlc3NMb2cuQ09NQklORURfUEFUVEVSTjsKKyAgICAgICAgdGhpcy5wYXR0ZXJuID0gcGF0dGVybjsKKworICAgICAgICBpZiAodGhpcy5wYXR0ZXJuLmVxdWFscyhDb25zdGFudHMuQWNjZXNzTG9nLkNPTU1PTl9QQVRURVJOKSkKKyAgICAgICAgICAgIGNvbW1vbiA9IHRydWU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGNvbW1vbiA9IGZhbHNlOworCisgICAgICAgIGlmICh0aGlzLnBhdHRlcm4uZXF1YWxzKENvbnN0YW50cy5BY2Nlc3NMb2cuQ09NQklORURfUEFUVEVSTikpCisgICAgICAgICAgICBjb21iaW5lZCA9IHRydWU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGNvbWJpbmVkID0gZmFsc2U7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbG9nIGZpbGUgcHJlZml4LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KCkgeworCisgICAgICAgIHJldHVybiAocHJlZml4KTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBsb2cgZmlsZSBwcmVmaXguCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJlZml4IFRoZSBuZXcgbG9nIGZpbGUgcHJlZml4CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJlZml4KFN0cmluZyBwcmVmaXgpIHsKKworICAgICAgICB0aGlzLnByZWZpeCA9IHByZWZpeDsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2hvdWxkIHdlIHJvdGF0ZSB0aGUgbG9ncworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzUm90YXRhYmxlKCkgeworCisgICAgICAgIHJldHVybiByb3RhdGFibGU7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdmFsdWUgaXMgd2Ugc2hvdWxkIHdlIHJvdGF0ZSB0aGUgbG9ncworICAgICAqCisgICAgICogQHBhcmFtIHJvdGF0YWJsZSB0cnVlIGlzIHdlIHNob3VsZCByb3RhdGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Um90YXRhYmxlKGJvb2xlYW4gcm90YXRhYmxlKSB7CisKKyAgICAgICAgdGhpcy5yb3RhdGFibGUgPSByb3RhdGFibGU7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbG9nIGZpbGUgc3VmZml4LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3VmZml4KCkgeworCisgICAgICAgIHJldHVybiAoc3VmZml4KTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBsb2cgZmlsZSBzdWZmaXguCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3VmZml4IFRoZSBuZXcgbG9nIGZpbGUgc3VmZml4CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3VmZml4KFN0cmluZyBzdWZmaXgpIHsKKworICAgICAgICB0aGlzLnN1ZmZpeCA9IHN1ZmZpeDsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSByZXNvbHZlIGhvc3RzIGZsYWcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb2x2ZUhvc3RzIFRoZSBuZXcgcmVzb2x2ZSBob3N0cyB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlc29sdmVIb3N0cyhib29sZWFuIHJlc29sdmVIb3N0cykgeworCisgICAgICAgIHRoaXMucmVzb2x2ZUhvc3RzID0gcmVzb2x2ZUhvc3RzOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSByZXNvbHZlIGhvc3RzIGZsYWcuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNSZXNvbHZlSG9zdHMoKSB7CisKKyAgICAgICAgcmV0dXJuIHJlc29sdmVIb3N0czsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHdoZXRoZXIgdGhlIGF0dHJpYnV0ZSBuYW1lIHRvIGxvb2sgZm9yIHdoZW4KKyAgICAgKiBwZXJmb3JtaW5nIGNvbmRpdGlvbmFsIGxvZ2dnaW5nLiBJZiBudWxsLCBldmVyeQorICAgICAqIHJlcXVlc3QgaXMgbG9nZ2VkLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29uZGl0aW9uKCkgeworCisgICAgICAgIHJldHVybiBjb25kaXRpb247CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgU2VydmxldFJlcXVlc3QuYXR0cmlidXRlIHRvIGxvb2sgZm9yIHRvIHBlcmZvcm0KKyAgICAgKiBjb25kaXRpb25hbCBsb2dnaW5nLiBTZXQgdG8gbnVsbCB0byBsb2cgZXZlcnl0aGluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25kaXRpb24gU2V0IHRvIG51bGwgdG8gbG9nIGV2ZXJ5dGhpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb25kaXRpb24oU3RyaW5nIGNvbmRpdGlvbikgeworCisgICAgICAgIHRoaXMuY29uZGl0aW9uID0gY29uZGl0aW9uOworCisgICAgfQorCisgICAgLyoqCisgICAgICogIFJldHVybiB0aGUgZGF0ZSBmb3JtYXQgZGF0ZSBiYXNlZCBsb2cgcm90YXRpb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRGaWxlRGF0ZUZvcm1hdCgpIHsKKyAgICAgICAgcmV0dXJuIGZpbGVEYXRlRm9ybWF0OworICAgIH0KKworCisgICAgLyoqCisgICAgICogIFNldCB0aGUgZGF0ZSBmb3JtYXQgZGF0ZSBiYXNlZCBsb2cgcm90YXRpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RmlsZURhdGVGb3JtYXQoU3RyaW5nIGZpbGVEYXRlRm9ybWF0KSB7CisgICAgICAgIHRoaXMuZmlsZURhdGVGb3JtYXQgPSAgZmlsZURhdGVGb3JtYXQ7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIExvZyBhIG1lc3NhZ2Ugc3VtbWFyaXppbmcgdGhlIHNwZWNpZmllZCByZXF1ZXN0IGFuZCByZXNwb25zZSwgYWNjb3JkaW5nCisgICAgICogdG8gdGhlIGZvcm1hdCBzcGVjaWZpZWQgYnkgdGhlIDxjb2RlPnBhdHRlcm48L2NvZGU+IHByb3BlcnR5LgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgUmVxdWVzdCBiZWluZyBwcm9jZXNzZWQKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgUmVzcG9uc2UgYmVpbmcgcHJvY2Vzc2VkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBoYXMgb2NjdXJyZWQKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0IGVycm9yIGhhcyBvY2N1cnJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGludm9rZShSZXF1ZXN0IHJlcXVlc3QsIFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIFBhc3MgdGhpcyByZXF1ZXN0IG9uIHRvIHRoZSBuZXh0IHZhbHZlIGluIG91ciBwaXBlbGluZQorICAgICAgICBsb25nIHQxPVN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCisgICAgICAgIGdldE5leHQoKS5pbnZva2UocmVxdWVzdCwgcmVzcG9uc2UpOworCisgICAgICAgIGxvbmcgdDI9U3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIGxvbmcgdGltZT10Mi10MTsKKworICAgICAgICBpZiAoY29uZGl0aW9uIT1udWxsICYmCisgICAgICAgICAgICAgICAgbnVsbCE9cmVxdWVzdC5nZXRSZXF1ZXN0KCkuZ2V0QXR0cmlidXRlKGNvbmRpdGlvbikpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisKKyAgICAgICAgRGF0ZSBkYXRlID0gZ2V0RGF0ZSgpOworICAgICAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCisgICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB3ZSBzaG91bGQgbG9nIHVzaW5nIHRoZSAiY29tbW9uIiBhY2Nlc3MgbG9nIHBhdHRlcm4KKyAgICAgICAgaWYgKGNvbW1vbiB8fCBjb21iaW5lZCkgeworICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gbnVsbDsKKworICAgICAgICAgICAgaWYgKGlzUmVzb2x2ZUhvc3RzKCkpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChyZXF1ZXN0LmdldFJlbW90ZUhvc3QoKSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChyZXF1ZXN0LmdldFJlbW90ZUFkZHIoKSk7CisKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIiAtICIpOworCisgICAgICAgICAgICB2YWx1ZSA9IHJlcXVlc3QuZ2V0UmVtb3RlVXNlcigpOworICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiLSAiKTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQodmFsdWUpOworICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoc3BhY2UpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJbIik7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGRheUZvcm1hdHRlci5mb3JtYXQoZGF0ZSkpOyAgICAgICAgICAgIC8vIERheQorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgnLycpOworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChsb29rdXAobW9udGhGb3JtYXR0ZXIuZm9ybWF0KGRhdGUpKSk7IC8vIE1vbnRoCisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCcvJyk7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHllYXJGb3JtYXR0ZXIuZm9ybWF0KGRhdGUpKTsgICAgICAgICAgICAvLyBZZWFyCisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCc6Jyk7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHRpbWVGb3JtYXR0ZXIuZm9ybWF0KGRhdGUpKTsgICAgICAgIC8vIFRpbWUKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoc3BhY2UpOworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCh0aW1lWm9uZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRpbWUgWm9uZQorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiXSBcIiIpOworCisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHJlcXVlc3QuZ2V0TWV0aG9kKCkpOworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChzcGFjZSk7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpKTsKKyAgICAgICAgICAgIGlmIChyZXF1ZXN0LmdldFF1ZXJ5U3RyaW5nKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoJz8nKTsKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHJlcXVlc3QuZ2V0UXVlcnlTdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHNwYWNlKTsKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQocmVxdWVzdC5nZXRQcm90b2NvbCgpKTsKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIlwiICIpOworCisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChzcGFjZSk7CisKKyAgICAgICAgICAgIGludCBsZW5ndGggPSByZXNwb25zZS5nZXRDb250ZW50Q291bnQoKTsKKworICAgICAgICAgICAgaWYgKGxlbmd0aCA8PSAwKQorICAgICAgICAgICAgICAgIHZhbHVlID0gIi0iOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHZhbHVlID0gIiIgKyBsZW5ndGg7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHZhbHVlKTsKKworICAgICAgICAgICAgaWYgKGNvbWJpbmVkKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChzcGFjZSk7CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiXCIiKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcmVmZXJlciA9IHJlcXVlc3QuZ2V0SGVhZGVyKCJyZWZlcmVyIik7CisgICAgICAgICAgICAgICAgaWYocmVmZXJlciAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHJlZmVyZXIpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiLSIpOworICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIlwiIik7CisKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHNwYWNlKTsKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJcIiIpOworICAgICAgICAgICAgICAgIFN0cmluZyB1YSA9IHJlcXVlc3QuZ2V0SGVhZGVyKCJ1c2VyLWFnZW50Iik7CisgICAgICAgICAgICAgICAgaWYodWEgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCh1YSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCItIik7CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiXCIiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gR2VuZXJhdGUgYSBtZXNzYWdlIGJhc2VkIG9uIHRoZSBkZWZpbmVkIHBhdHRlcm4KKyAgICAgICAgICAgIGJvb2xlYW4gcmVwbGFjZSA9IGZhbHNlOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXR0ZXJuLmxlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBjaGFyIGNoID0gcGF0dGVybi5jaGFyQXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKHJlcGxhY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogRm9yIGNvZGUgdGhhdCBwcm9jZXNzZXMgeywgdGhlIGJlaGF2aW9yIHdpbGwgYmUgLi4uIGlmIEkKKyAgICAgICAgICAgICAgICAgICAgICogZG8gbm90IGVub3VudGVyIGEgY2xvc2luZyB9IC0gdGhlbiBJIGlnbm9yZSB0aGUgeworICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKCd7JyA9PSBjaCl7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgbmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBqID0gaSArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IoO2ogPCBwYXR0ZXJuLmxlbmd0aCgpICYmICd9JyAhPSBwYXR0ZXJuLmNoYXJBdChqKTsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS5hcHBlbmQocGF0dGVybi5jaGFyQXQoaikpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGorMSA8IHBhdHRlcm4ubGVuZ3RoKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGUgKzEgd2FzIHRvIGFjY291bnQgZm9yIH0gd2hpY2ggd2UgaW5jcmVtZW50IG5vdyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGorKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHJlcGxhY2UobmFtZS50b1N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybi5jaGFyQXQoaiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpPWo7IC8qU2luY2Ugd2Ugd2Fsa2VkIG1vcmUgdGhhbiBvbmUgY2hhcmFjdGVyKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9EJ29oIC0gZW5kIG9mIHN0cmluZyAtIHByZXRlbmQgd2UgbmV2ZXIgZGlkIHRoaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2FuZCBkbyBwcm9jZXNzaW5nIHRoZSAib2xkIHdheSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHJlcGxhY2UoY2gsIGRhdGUsIHJlcXVlc3QsIHJlc3BvbnNlLCB0aW1lKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHJlcGxhY2UoY2gsIGRhdGUsIHJlcXVlc3QsIHJlc3BvbnNlLHRpbWUgKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmVwbGFjZSA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJyUnKSB7CisgICAgICAgICAgICAgICAgICAgIHJlcGxhY2UgPSB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoY2gpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBsb2cocmVzdWx0LnRvU3RyaW5nKCksIGRhdGUpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcml2YXRlIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogQ2xvc2UgdGhlIGN1cnJlbnRseSBvcGVuIGxvZyBmaWxlIChpZiBhbnkpCisgICAgICovCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBjbG9zZSgpIHsKKworICAgICAgICBpZiAod3JpdGVyID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIHdyaXRlci5mbHVzaCgpOworICAgICAgICB3cml0ZXIuY2xvc2UoKTsKKyAgICAgICAgd3JpdGVyID0gbnVsbDsKKyAgICAgICAgZGF0ZVN0YW1wID0gIiI7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIExvZyB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UgdG8gdGhlIGxvZyBmaWxlLCBzd2l0Y2hpbmcgZmlsZXMgaWYgdGhlIGRhdGUKKyAgICAgKiBoYXMgY2hhbmdlZCBzaW5jZSB0aGUgcHJldmlvdXMgbG9nIGNhbGwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVzc2FnZSBNZXNzYWdlIHRvIGJlIGxvZ2dlZAorICAgICAqIEBwYXJhbSBkYXRlIHRoZSBjdXJyZW50IERhdGUgb2JqZWN0IChzbyB0aGlzIG1ldGhvZCBkb2Vzbid0IG5lZWQgdG8KKyAgICAgKiAgICAgICAgY3JlYXRlIGEgbmV3IG9uZSkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBsb2coU3RyaW5nIG1lc3NhZ2UsIERhdGUgZGF0ZSkgeworCisgICAgICAgIGlmIChyb3RhdGFibGUpeworICAgICAgICAgICAgLy8gT25seSBkbyBhIGxvZ2ZpbGUgc3dpdGNoIGNoZWNrIG9uY2UgYSBzZWNvbmQsIG1heC4KKyAgICAgICAgICAgIGxvbmcgc3lzdGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICAgICAgaWYgKChzeXN0aW1lIC0gcm90YXRpb25MYXN0Q2hlY2tlZCkgPiAxMDAwKSB7CisKKyAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIGEgbmV3IGN1cnJlbnREYXRlCisgICAgICAgICAgICAgICAgY3VycmVudERhdGUgPSBuZXcgRGF0ZShzeXN0aW1lKTsKKyAgICAgICAgICAgICAgICByb3RhdGlvbkxhc3RDaGVja2VkID0gc3lzdGltZTsKKworICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBhIGNoYW5nZSBvZiBkYXRlCisgICAgICAgICAgICAgICAgU3RyaW5nIHRzRGF0ZSA9IGRhdGVGb3JtYXR0ZXIuZm9ybWF0KGN1cnJlbnREYXRlKTsKKworICAgICAgICAgICAgICAgIC8vIElmIHRoZSBkYXRlIGhhcyBjaGFuZ2VkLCBzd2l0Y2ggbG9nIGZpbGVzCisgICAgICAgICAgICAgICAgaWYgKCFkYXRlU3RhbXAuZXF1YWxzKHRzRGF0ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWRhdGVTdGFtcC5lcXVhbHModHNEYXRlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZVN0YW1wID0gdHNEYXRlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZW4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gTG9nIHRoaXMgbWVzc2FnZQorICAgICAgICBpZiAod3JpdGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKG1lc3NhZ2UpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbW9udGggYWJicmV2aWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIG1vbnRoLCB3aGljaCBtdXN0CisgICAgICogYmUgYSB0d28tZGlnaXQgU3RyaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIG1vbnRoIE1vbnRoIG51bWJlciAoIjAxIiAuLiAiMTIiKS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBsb29rdXAoU3RyaW5nIG1vbnRoKSB7CisKKyAgICAgICAgaW50IGluZGV4OworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW5kZXggPSBJbnRlZ2VyLnBhcnNlSW50KG1vbnRoKSAtIDE7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICBpbmRleCA9IDA7ICAvLyBDYW4gbm90IGhhcHBlbiwgaW4gdGhlb3J5CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChtb250aHNbaW5kZXhdKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogT3BlbiB0aGUgbmV3IGxvZyBmaWxlIGZvciB0aGUgZGF0ZSBzcGVjaWZpZWQgYnkgPGNvZGU+ZGF0ZVN0YW1wPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIG9wZW4oKSB7CisKKyAgICAgICAgLy8gQ3JlYXRlIHRoZSBkaXJlY3RvcnkgaWYgbmVjZXNzYXJ5CisgICAgICAgIEZpbGUgZGlyID0gbmV3IEZpbGUoZGlyZWN0b3J5KTsKKyAgICAgICAgaWYgKCFkaXIuaXNBYnNvbHV0ZSgpKQorICAgICAgICAgICAgZGlyID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJjYXRhbGluYS5iYXNlIiksIGRpcmVjdG9yeSk7CisgICAgICAgIGRpci5ta2RpcnMoKTsKKworICAgICAgICAvLyBPcGVuIHRoZSBjdXJyZW50IGxvZyBmaWxlCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTdHJpbmcgcGF0aG5hbWU7CisgICAgICAgICAgICAvLyBJZiBubyByb3RhdGUgLSBubyBuZWVkIGZvciBkYXRlU3RhbXAgaW4gZmlsZU5hbWUKKyAgICAgICAgICAgIGlmIChyb3RhdGFibGUpeworICAgICAgICAgICAgICAgIHBhdGhuYW1lID0gZGlyLmdldEFic29sdXRlUGF0aCgpICsgRmlsZS5zZXBhcmF0b3IgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCArIGRhdGVTdGFtcCArIHN1ZmZpeDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcGF0aG5hbWUgPSBkaXIuZ2V0QWJzb2x1dGVQYXRoKCkgKyBGaWxlLnNlcGFyYXRvciArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ICsgc3VmZml4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgd3JpdGVyID0gbmV3IFByaW50V3JpdGVyKG5ldyBGaWxlV3JpdGVyKHBhdGhuYW1lLCB0cnVlKSwgdHJ1ZSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHdyaXRlciA9IG51bGw7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSByZXBsYWNlbWVudCB0ZXh0IGZvciB0aGUgc3BlY2lmaWVkIHBhdHRlcm4gY2hhcmFjdGVyLgorICAgICAqCisgICAgICogQHBhcmFtIHBhdHRlcm4gUGF0dGVybiBjaGFyYWN0ZXIgaWRlbnRpZnlpbmcgdGhlIGRlc2lyZWQgdGV4dAorICAgICAqIEBwYXJhbSBkYXRlIHRoZSBjdXJyZW50IERhdGUgc28gdGhhdCB0aGlzIG1ldGhvZCBkb2Vzbid0IG5lZWQgdG8KKyAgICAgKiAgICAgICAgY3JlYXRlIG9uZQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFJlcXVlc3QgYmVpbmcgcHJvY2Vzc2VkCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFJlc3BvbnNlIGJlaW5nIHByb2Nlc3NlZAorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHJlcGxhY2UoY2hhciBwYXR0ZXJuLCBEYXRlIGRhdGUsIFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlLCBsb25nIHRpbWUpIHsKKworICAgICAgICBTdHJpbmcgdmFsdWUgPSBudWxsOworCisgICAgICAgIGlmIChwYXR0ZXJuID09ICdhJykgeworICAgICAgICAgICAgdmFsdWUgPSByZXF1ZXN0LmdldFJlbW90ZUFkZHIoKTsKKyAgICAgICAgfSBlbHNlIGlmIChwYXR0ZXJuID09ICdBJykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLmdldEhvc3RBZGRyZXNzKCk7CisgICAgICAgICAgICB9IGNhdGNoKFRocm93YWJsZSBlKXsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9ICIxMjcuMC4wLjEiOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHBhdHRlcm4gPT0gJ2InKSB7CisgICAgICAgICAgICBpbnQgbGVuZ3RoID0gcmVzcG9uc2UuZ2V0Q29udGVudENvdW50KCk7CisgICAgICAgICAgICBpZiAobGVuZ3RoIDw9IDApCisgICAgICAgICAgICAgICAgdmFsdWUgPSAiLSI7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdmFsdWUgPSAiIiArIGxlbmd0aDsKKyAgICAgICAgfSBlbHNlIGlmIChwYXR0ZXJuID09ICdCJykgeworICAgICAgICAgICAgdmFsdWUgPSAiIiArIHJlc3BvbnNlLmdldENvbnRlbnRMZW5ndGgoKTsKKyAgICAgICAgfSBlbHNlIGlmIChwYXR0ZXJuID09ICdoJykgeworICAgICAgICAgICAgdmFsdWUgPSByZXF1ZXN0LmdldFJlbW90ZUhvc3QoKTsKKyAgICAgICAgfSBlbHNlIGlmIChwYXR0ZXJuID09ICdIJykgeworICAgICAgICAgICAgdmFsdWUgPSByZXF1ZXN0LmdldFByb3RvY29sKCk7CisgICAgICAgIH0gZWxzZSBpZiAocGF0dGVybiA9PSAnbCcpIHsKKyAgICAgICAgICAgIHZhbHVlID0gIi0iOworICAgICAgICB9IGVsc2UgaWYgKHBhdHRlcm4gPT0gJ20nKSB7CisgICAgICAgICAgICBpZiAocmVxdWVzdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHZhbHVlID0gcmVxdWVzdC5nZXRNZXRob2QoKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB2YWx1ZSA9ICIiOworICAgICAgICB9IGVsc2UgaWYgKHBhdHRlcm4gPT0gJ3AnKSB7CisgICAgICAgICAgICB2YWx1ZSA9ICIiICsgcmVxdWVzdC5nZXRTZXJ2ZXJQb3J0KCk7CisgICAgICAgIH0gZWxzZSBpZiAocGF0dGVybiA9PSAnRCcpIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAiIiArIHRpbWU7CisgICAgICAgIH0gZWxzZSBpZiAocGF0dGVybiA9PSAncScpIHsKKyAgICAgICAgICAgIFN0cmluZyBxdWVyeSA9IG51bGw7CisgICAgICAgICAgICBpZiAocmVxdWVzdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHF1ZXJ5ID0gcmVxdWVzdC5nZXRRdWVyeVN0cmluZygpOworICAgICAgICAgICAgaWYgKHF1ZXJ5ICE9IG51bGwpCisgICAgICAgICAgICAgICAgdmFsdWUgPSAiPyIgKyBxdWVyeTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB2YWx1ZSA9ICIiOworICAgICAgICB9IGVsc2UgaWYgKHBhdHRlcm4gPT0gJ3InKSB7CisgICAgICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgICAgICBpZiAocmVxdWVzdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKHJlcXVlc3QuZ2V0TWV0aG9kKCkpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChzcGFjZSk7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpKTsKKyAgICAgICAgICAgICAgICBpZiAocmVxdWVzdC5nZXRRdWVyeVN0cmluZygpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCc/Jyk7CisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChyZXF1ZXN0LmdldFF1ZXJ5U3RyaW5nKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoc3BhY2UpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChyZXF1ZXN0LmdldFByb3RvY29sKCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIi0gLSAiKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQocmVxdWVzdC5nZXRQcm90b2NvbCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhbHVlID0gc2IudG9TdHJpbmcoKTsKKyAgICAgICAgfSBlbHNlIGlmIChwYXR0ZXJuID09ICdTJykgeworICAgICAgICAgICAgaWYgKHJlcXVlc3QgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBpZiAocmVxdWVzdC5nZXRTZXNzaW9uKGZhbHNlKSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHJlcXVlc3QuZ2V0U2Vzc2lvbihmYWxzZSkuZ2V0SWQoKTsKKyAgICAgICAgICAgICAgICBlbHNlIHZhbHVlID0gIi0iOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHZhbHVlID0gIi0iOworICAgICAgICB9IGVsc2UgaWYgKHBhdHRlcm4gPT0gJ3MnKSB7CisgICAgICAgICAgICBpZiAocmVzcG9uc2UgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB2YWx1ZSA9ICIiICsgcmVzcG9uc2UuZ2V0U3RhdHVzKCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdmFsdWUgPSAiLSI7CisgICAgICAgIH0gZWxzZSBpZiAocGF0dGVybiA9PSAndCcpIHsKKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciB0ZW1wID0gbmV3IFN0cmluZ0J1ZmZlcigiWyIpOworICAgICAgICAgICAgdGVtcC5hcHBlbmQoZGF5Rm9ybWF0dGVyLmZvcm1hdChkYXRlKSk7ICAgICAgICAgICAgIC8vIERheQorICAgICAgICAgICAgdGVtcC5hcHBlbmQoJy8nKTsKKyAgICAgICAgICAgIHRlbXAuYXBwZW5kKGxvb2t1cChtb250aEZvcm1hdHRlci5mb3JtYXQoZGF0ZSkpKTsgICAvLyBNb250aAorICAgICAgICAgICAgdGVtcC5hcHBlbmQoJy8nKTsKKyAgICAgICAgICAgIHRlbXAuYXBwZW5kKHllYXJGb3JtYXR0ZXIuZm9ybWF0KGRhdGUpKTsgICAgICAgICAgICAvLyBZZWFyCisgICAgICAgICAgICB0ZW1wLmFwcGVuZCgnOicpOworICAgICAgICAgICAgdGVtcC5hcHBlbmQodGltZUZvcm1hdHRlci5mb3JtYXQoZGF0ZSkpOyAgICAgICAgICAgIC8vIFRpbWUKKyAgICAgICAgICAgIHRlbXAuYXBwZW5kKCcgJyk7CisgICAgICAgICAgICB0ZW1wLmFwcGVuZCh0aW1lWm9uZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGltZXpvbmUKKyAgICAgICAgICAgIHRlbXAuYXBwZW5kKCddJyk7CisgICAgICAgICAgICB2YWx1ZSA9IHRlbXAudG9TdHJpbmcoKTsKKyAgICAgICAgfSBlbHNlIGlmIChwYXR0ZXJuID09ICdUJykgeworICAgICAgICAgICAgdmFsdWUgPSB0aW1lVGFrZW5Gb3JtYXR0ZXIuZm9ybWF0KHRpbWUvMTAwMGQpOworICAgICAgICB9IGVsc2UgaWYgKHBhdHRlcm4gPT0gJ3UnKSB7CisgICAgICAgICAgICBpZiAocmVxdWVzdCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHZhbHVlID0gcmVxdWVzdC5nZXRSZW1vdGVVc2VyKCk7CisgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB2YWx1ZSA9ICItIjsKKyAgICAgICAgfSBlbHNlIGlmIChwYXR0ZXJuID09ICdVJykgeworICAgICAgICAgICAgaWYgKHJlcXVlc3QgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHZhbHVlID0gIi0iOworICAgICAgICB9IGVsc2UgaWYgKHBhdHRlcm4gPT0gJ3YnKSB7CisgICAgICAgICAgICB2YWx1ZSA9IHJlcXVlc3QuZ2V0U2VydmVyTmFtZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdmFsdWUgPSAiPz8/IiArIHBhdHRlcm4gKyAiPz8/IjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuICgiIik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiAodmFsdWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHJlcGxhY2VtZW50IHRleHQgZm9yIHRoZSBzcGVjaWZpZWQgImhlYWRlci9wYXJhbWV0ZXIiLgorICAgICAqCisgICAgICogQHBhcmFtIGhlYWRlciBUaGUgaGVhZGVyL3BhcmFtZXRlciB0byBnZXQKKyAgICAgKiBAcGFyYW0gdHlwZSBXaGVyZSB0byBnZXQgaXQgZnJvbSBpPWlucHV0LGM9Y29va2llLHI9U2VydmxldFJlcXVlc3Qscz1TZXNzaW9uCisgICAgICogQHBhcmFtIHJlcXVlc3QgUmVxdWVzdCBiZWluZyBwcm9jZXNzZWQKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgUmVzcG9uc2UgYmVpbmcgcHJvY2Vzc2VkCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcmVwbGFjZShTdHJpbmcgaGVhZGVyLCBjaGFyIHR5cGUsIFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlKSB7CisKKyAgICAgICAgT2JqZWN0IHZhbHVlID0gbnVsbDsKKworICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgJ2knOgorICAgICAgICAgICAgICAgIGlmIChudWxsICE9IHJlcXVlc3QpCisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gcmVxdWVzdC5nZXRIZWFkZXIoaGVhZGVyKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHZhbHVlPSAiPz8iOworICAgICAgICAgICAgICAgIGJyZWFrOworLyoKKyAgICAgICAgICAgIC8vIFNvbWVvbmUgcGxlYXNlIG1ha2UgbWUgd29yaworICAgICAgICAgICAgY2FzZSAnbyc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisqLworICAgICAgICAgICAgY2FzZSAnYyc6CisgICAgICAgICAgICAgICAgIENvb2tpZVtdIGMgPSByZXF1ZXN0LmdldENvb2tpZXMoKTsKKyAgICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBjICE9IG51bGwgJiYgaSA8IGMubGVuZ3RoOyBpKyspeworICAgICAgICAgICAgICAgICAgICAgaWYgKGhlYWRlci5lcXVhbHMoY1tpXS5nZXROYW1lKCkpKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGNbaV0uZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAncic6CisgICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gcmVxdWVzdCkKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSByZXF1ZXN0LmdldEF0dHJpYnV0ZShoZWFkZXIpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdmFsdWU9ICI/PyI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdzJzoKKyAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSByZXF1ZXN0KSB7CisgICAgICAgICAgICAgICAgICAgIEh0dHBTZXNzaW9uIHNlc3MgPSByZXF1ZXN0LmdldFNlc3Npb24oZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSBzZXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBzZXNzLmdldEF0dHJpYnV0ZShoZWFkZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB2YWx1ZSA9ICI/Pz8iOworICAgICAgICB9CisKKyAgICAgICAgLyogdHJ5IGNhdGNoIGluIGNhc2UgdG9TdHJpbmcoKSBiYXJmcyAqLworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKHZhbHVlIT1udWxsKQorICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpdmFsdWU7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgIHJldHVybiAiLSI7CisgICAgICAgIH0gY2F0Y2goVGhyb3dhYmxlIGUpIHsKKyAgICAgICAgICAgIHJldHVybiAiLSI7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYSBEYXRlIG9iamVjdCB0aGF0IGlzIGFjY3VyYXRlIHRvIHdpdGhpbiBvbmUKKyAgICAgKiBzZWNvbmQuICBJZiBhIHRocmVhZCBjYWxscyB0aGlzIG1ldGhvZCB0byBnZXQgYSBEYXRlIGFuZCBpdCdzIGJlZW4KKyAgICAgKiBsZXNzIHRoYW4gMSBzZWNvbmQgc2luY2UgYSBuZXcgRGF0ZSB3YXMgY3JlYXRlZCwgdGhpcyBtZXRob2QKKyAgICAgKiBzaW1wbHkgZ2l2ZXMgb3V0IHRoZSBzYW1lIERhdGUgYWdhaW4gc28gdGhhdCB0aGUgc3lzdGVtIGRvZXNuJ3QKKyAgICAgKiBzcGVuZCB0aW1lIGNyZWF0aW5nIERhdGUgb2JqZWN0cyB1bm5lY2Vzc2FyaWx5LgorICAgICAqCisgICAgICogQHJldHVybiBEYXRlCisgICAgICovCisgICAgcHJpdmF0ZSBEYXRlIGdldERhdGUoKSB7CisgICAgICAgIGlmKGN1cnJlbnREYXRlID09IG51bGwpIHsKKwkgICAgY3VycmVudERhdGUgPSBuZXcgRGF0ZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIE9ubHkgY3JlYXRlIGEgbmV3IERhdGUgb25jZSBwZXIgc2Vjb25kLCBtYXguCisgICAgICAgICAgbG9uZyBzeXN0aW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgaWYgKChzeXN0aW1lIC0gY3VycmVudERhdGUuZ2V0VGltZSgpKSA+IDEwMDApIHsKKyAgICAgICAgICAgICAgY3VycmVudERhdGUgPSBuZXcgRGF0ZShzeXN0aW1lKTsKKyAgICAgICAgICB9CisJfQorCisgICAgICAgIHJldHVybiBjdXJyZW50RGF0ZTsKKyAgICB9CisKKworICAgIHByaXZhdGUgU3RyaW5nIGNhbGN1bGF0ZVRpbWVab25lT2Zmc2V0KGxvbmcgb2Zmc2V0KSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciB0eiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgaWYgKChvZmZzZXQ8MCkpICB7CisgICAgICAgICAgICB0ei5hcHBlbmQoIi0iKTsKKyAgICAgICAgICAgIG9mZnNldCA9IC1vZmZzZXQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0ei5hcHBlbmQoIisiKTsKKyAgICAgICAgfQorCisgICAgICAgIGxvbmcgaG91ck9mZnNldCA9IG9mZnNldC8oMTAwMCo2MCo2MCk7CisgICAgICAgIGxvbmcgbWludXRlT2Zmc2V0ID0gKG9mZnNldC8oMTAwMCo2MCkpICUgNjA7CisKKyAgICAgICAgaWYgKGhvdXJPZmZzZXQ8MTApCisgICAgICAgICAgICB0ei5hcHBlbmQoIjAiKTsKKyAgICAgICAgdHouYXBwZW5kKGhvdXJPZmZzZXQpOworCisgICAgICAgIGlmIChtaW51dGVPZmZzZXQ8MTApCisgICAgICAgICAgICB0ei5hcHBlbmQoIjAiKTsKKyAgICAgICAgdHouYXBwZW5kKG1pbnV0ZU9mZnNldCk7CisKKyAgICAgICAgcmV0dXJuIHR6LnRvU3RyaW5nKCk7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTGlmZWN5Y2xlIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogQWRkIGEgbGlmZWN5Y2xlIGV2ZW50IGxpc3RlbmVyIHRvIHRoaXMgY29tcG9uZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciB0byBhZGQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRMaWZlY3ljbGVMaXN0ZW5lcihMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lcikgeworCisgICAgICAgIGxpZmVjeWNsZS5hZGRMaWZlY3ljbGVMaXN0ZW5lcihsaXN0ZW5lcik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbGlmZWN5Y2xlIGxpc3RlbmVycyBhc3NvY2lhdGVkIHdpdGggdGhpcyBsaWZlY3ljbGUuIElmIHRoaXMKKyAgICAgKiBMaWZlY3ljbGUgaGFzIG5vIGxpc3RlbmVycyByZWdpc3RlcmVkLCBhIHplcm8tbGVuZ3RoIGFycmF5IGlzIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBMaWZlY3ljbGVMaXN0ZW5lcltdIGZpbmRMaWZlY3ljbGVMaXN0ZW5lcnMoKSB7CisKKyAgICAgICAgcmV0dXJuIGxpZmVjeWNsZS5maW5kTGlmZWN5Y2xlTGlzdGVuZXJzKCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhIGxpZmVjeWNsZSBldmVudCBsaXN0ZW5lciBmcm9tIHRoaXMgY29tcG9uZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciB0byBhZGQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVMaWZlY3ljbGVMaXN0ZW5lcihMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lcikgeworCisgICAgICAgIGxpZmVjeWNsZS5yZW1vdmVMaWZlY3ljbGVMaXN0ZW5lcihsaXN0ZW5lcik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFByZXBhcmUgZm9yIHRoZSBiZWdpbm5pbmcgb2YgYWN0aXZlIHVzZSBvZiB0aGUgcHVibGljIG1ldGhvZHMgb2YgdGhpcworICAgICAqIGNvbXBvbmVudC4gIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgPGNvZGU+Y29uZmlndXJlKCk8L2NvZGU+LAorICAgICAqIGFuZCBiZWZvcmUgYW55IG9mIHRoZSBwdWJsaWMgbWV0aG9kcyBvZiB0aGUgY29tcG9uZW50IGFyZSB1dGlsaXplZC4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTGlmZWN5Y2xlRXhjZXB0aW9uIGlmIHRoaXMgY29tcG9uZW50IGRldGVjdHMgYSBmYXRhbCBlcnJvcgorICAgICAqICB0aGF0IHByZXZlbnRzIHRoaXMgY29tcG9uZW50IGZyb20gYmVpbmcgdXNlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgdGhyb3dzIExpZmVjeWNsZUV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gVmFsaWRhdGUgYW5kIHVwZGF0ZSBvdXIgY3VycmVudCBjb21wb25lbnQgc3RhdGUKKyAgICAgICAgaWYgKHN0YXJ0ZWQpCisgICAgICAgICAgICB0aHJvdyBuZXcgTGlmZWN5Y2xlRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygiYWNjZXNzTG9nVmFsdmUuYWxyZWFkeVN0YXJ0ZWQiKSk7CisgICAgICAgIGxpZmVjeWNsZS5maXJlTGlmZWN5Y2xlRXZlbnQoU1RBUlRfRVZFTlQsIG51bGwpOworICAgICAgICBzdGFydGVkID0gdHJ1ZTsKKworICAgICAgICAvLyBJbml0aWFsaXplIHRoZSB0aW1lWm9uZSwgRGF0ZSBmb3JtYXR0ZXJzLCBhbmQgY3VycmVudERhdGUKKyAgICAgICAgVGltZVpvbmUgdHogPSBUaW1lWm9uZS5nZXREZWZhdWx0KCk7CisgICAgICAgIHRpbWVab25lID0gY2FsY3VsYXRlVGltZVpvbmVPZmZzZXQodHouZ2V0UmF3T2Zmc2V0KCkpOworCisgICAgICAgIGlmIChmaWxlRGF0ZUZvcm1hdD09bnVsbCB8fCBmaWxlRGF0ZUZvcm1hdC5sZW5ndGgoKT09MCkKKyAgICAgICAgICAgIGZpbGVEYXRlRm9ybWF0ID0gInl5eXktTU0tZGQiOworICAgICAgICBkYXRlRm9ybWF0dGVyID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoZmlsZURhdGVGb3JtYXQpOworICAgICAgICBkYXRlRm9ybWF0dGVyLnNldFRpbWVab25lKHR6KTsKKyAgICAgICAgZGF5Rm9ybWF0dGVyID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoImRkIik7CisgICAgICAgIGRheUZvcm1hdHRlci5zZXRUaW1lWm9uZSh0eik7CisgICAgICAgIG1vbnRoRm9ybWF0dGVyID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoIk1NIik7CisgICAgICAgIG1vbnRoRm9ybWF0dGVyLnNldFRpbWVab25lKHR6KTsKKyAgICAgICAgeWVhckZvcm1hdHRlciA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJ5eXl5Iik7CisgICAgICAgIHllYXJGb3JtYXR0ZXIuc2V0VGltZVpvbmUodHopOworICAgICAgICB0aW1lRm9ybWF0dGVyID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoIkhIOm1tOnNzIik7CisgICAgICAgIHRpbWVGb3JtYXR0ZXIuc2V0VGltZVpvbmUodHopOworICAgICAgICBjdXJyZW50RGF0ZSA9IG5ldyBEYXRlKCk7CisgICAgICAgIGRhdGVTdGFtcCA9IGRhdGVGb3JtYXR0ZXIuZm9ybWF0KGN1cnJlbnREYXRlKTsKKyAgICAgICAgdGltZVRha2VuRm9ybWF0dGVyID0gbmV3IERlY2ltYWxGb3JtYXQoIjAuMDAwIik7CisKKyAgICAgICAgb3BlbigpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHcmFjZWZ1bGx5IHRlcm1pbmF0ZSB0aGUgYWN0aXZlIHVzZSBvZiB0aGUgcHVibGljIG1ldGhvZHMgb2YgdGhpcworICAgICAqIGNvbXBvbmVudC4gIFRoaXMgbWV0aG9kIHNob3VsZCBiZSB0aGUgbGFzdCBvbmUgY2FsbGVkIG9uIGEgZ2l2ZW4KKyAgICAgKiBpbnN0YW5jZSBvZiB0aGlzIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTGlmZWN5Y2xlRXhjZXB0aW9uIGlmIHRoaXMgY29tcG9uZW50IGRldGVjdHMgYSBmYXRhbCBlcnJvcgorICAgICAqICB0aGF0IG5lZWRzIHRvIGJlIHJlcG9ydGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcCgpIHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb24geworCisgICAgICAgIC8vIFZhbGlkYXRlIGFuZCB1cGRhdGUgb3VyIGN1cnJlbnQgY29tcG9uZW50IHN0YXRlCisgICAgICAgIGlmICghc3RhcnRlZCkKKyAgICAgICAgICAgIHRocm93IG5ldyBMaWZlY3ljbGVFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJhY2Nlc3NMb2dWYWx2ZS5ub3RTdGFydGVkIikpOworICAgICAgICBsaWZlY3ljbGUuZmlyZUxpZmVjeWNsZUV2ZW50KFNUT1BfRVZFTlQsIG51bGwpOworICAgICAgICBzdGFydGVkID0gZmFsc2U7CisKKyAgICAgICAgY2xvc2UoKTsKKworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS92YWx2ZXMvQ29uc3RhbnRzLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdmFsdmVzL0NvbnN0YW50cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4NjQzMjUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdmFsdmVzL0NvbnN0YW50cy5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudmFsdmVzOworCisKKy8qKgorICogTWFuaWZlc3QgY29uc3RhbnRzIGZvciB0aGUgPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS52YWx2ZXM8L2NvZGU+CisgKiBwYWNrYWdlLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBDb25zdGFudHMgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUGFja2FnZSA9ICJvcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcyI7CisKKyAgICAvLyBDb25zdGFudHMgZm9yIHRoZSBBY2Nlc3NMb2dWYWx2ZSBjbGFzcworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQWNjZXNzTG9nIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTU9OX0FMSUFTID0gImNvbW1vbiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1PTl9QQVRURVJOID0gIiVoICVsICV1ICV0IFwiJXJcIiAlcyAlYiI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTUJJTkVEX0FMSUFTID0gImNvbWJpbmVkIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NQklORURfUEFUVEVSTiA9ICIlaCAlbCAldSAldCBcIiVyXCIgJXMgJWIgXCIle1JlZmVyZXJ9aVwiIFwiJXtVc2VyLUFnZW50fWlcIiI7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdmFsdmVzL0Vycm9yUmVwb3J0VmFsdmUuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS92YWx2ZXMvRXJyb3JSZXBvcnRWYWx2ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiM2ZkOWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdmFsdmVzL0Vycm9yUmVwb3J0VmFsdmUuamF2YQpAQCAtMCwwICsxLDMxNSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LTIwMDEsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlczsKKworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLldyaXRlcjsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldFJlc3BvbnNlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5HbG9iYWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLlJlcXVlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuUmVzcG9uc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLlJlcXVlc3RVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5TZXJ2ZXJJbmZvOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5TdHJpbmdNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuSW50cm9zcGVjdGlvblV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuY29tcGF0Lkpka0NvbXBhdDsKKworLyoqCisgKiA8cD5JbXBsZW1lbnRhdGlvbiBvZiBhIFZhbHZlIHRoYXQgb3V0cHV0cyBIVE1MIGVycm9yIHBhZ2VzLjwvcD4KKyAqCisgKiA8cD5UaGlzIFZhbHZlIHNob3VsZCBiZSBhdHRhY2hlZCBhdCB0aGUgSG9zdCBsZXZlbCwgYWx0aG91Z2ggaXQgd2lsbCB3b3JrCisgKiBpZiBhdHRhY2hlZCB0byBhIENvbnRleHQuPC9wPgorICoKKyAqIDxwPkhUTUwgY29kZSBmcm9tIHRoZSBDb2Nvb24gMiBwcm9qZWN0LjwvcD4KKyAqCisgKiBAYXV0aG9yIFJlbXkgTWF1Y2hlcmF0CisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOm5pY29sYWtlbkBzdXBlcmV2YS5pdCI+Tmljb2xhIEtlbiBCYXJvenppPC9hPiBBaXNhCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpzdGVmYW5vQGFwYWNoZS5vcmciPlN0ZWZhbm8gTWF6em9jY2hpPC9hPgorICogQGF1dGhvciBZb2F2IFNoYXBpcmEKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEVycm9yUmVwb3J0VmFsdmUKKyAgICBleHRlbmRzIFZhbHZlQmFzZSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gcmVsYXRlZCB0byB0aGlzIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBpbmZvID0KKyAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEudmFsdmVzLkVycm9yUmVwb3J0VmFsdmUvMS4wIjsKKworCisgICAgLyoqCisgICAgICogVGhlIFN0cmluZ01hbmFnZXIgZm9yIHRoaXMgcGFja2FnZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZ01hbmFnZXIgc20gPQorICAgICAgICBTdHJpbmdNYW5hZ2VyLmdldE1hbmFnZXIoQ29uc3RhbnRzLlBhY2thZ2UpOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgVmFsdmUgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJbmZvKCkgeworCisgICAgICAgIHJldHVybiAoaW5mbyk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBJbnZva2UgdGhlIG5leHQgVmFsdmUgaW4gdGhlIHNlcXVlbmNlLiBXaGVuIHRoZSBpbnZva2UgcmV0dXJucywgY2hlY2sKKyAgICAgKiB0aGUgcmVzcG9uc2Ugc3RhdGUsIGFuZCBvdXRwdXQgYW4gZXJyb3IgcmVwb3J0IGlzIG5lY2Vzc2FyeS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3QgdG8gYmUgcHJvY2Vzc2VkCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBzZXJ2bGV0IHJlc3BvbnNlIHRvIGJlIGNyZWF0ZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgaW52b2tlKFJlcXVlc3QgcmVxdWVzdCwgUmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gUGVyZm9ybSB0aGUgcmVxdWVzdAorICAgICAgICBnZXROZXh0KCkuaW52b2tlKHJlcXVlc3QsIHJlc3BvbnNlKTsKKworICAgICAgICBTZXJ2bGV0UmVxdWVzdCBzcmVxID0gKFNlcnZsZXRSZXF1ZXN0KSByZXF1ZXN0OworICAgICAgICBUaHJvd2FibGUgdGhyb3dhYmxlID0KKyAgICAgICAgICAgIChUaHJvd2FibGUpIHNyZXEuZ2V0QXR0cmlidXRlKEdsb2JhbHMuRVhDRVBUSU9OX0FUVFIpOworCisgICAgICAgIFNlcnZsZXRSZXNwb25zZSBzcmVzcCA9IChTZXJ2bGV0UmVzcG9uc2UpIHJlc3BvbnNlOworICAgICAgICBpZiAoc3Jlc3AuaXNDb21taXR0ZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRocm93YWJsZSAhPSBudWxsKSB7CisKKyAgICAgICAgICAgIC8vIFRoZSByZXNwb25zZSBpcyBhbiBlcnJvcgorICAgICAgICAgICAgcmVzcG9uc2Uuc2V0RXJyb3IoKTsKKworICAgICAgICAgICAgLy8gUmVzZXQgdGhlIHJlc3BvbnNlIChpZiBwb3NzaWJsZSkKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc3Jlc3AucmVzZXQoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IpOworCisgICAgICAgIH0KKworICAgICAgICByZXNwb25zZS5zZXRTdXNwZW5kZWQoZmFsc2UpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXBvcnQocmVxdWVzdCwgcmVzcG9uc2UsIHRocm93YWJsZSk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0dCkgeworICAgICAgICAgICAgdHQucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgU3RyaW5nIHJlbmRlcmluZyBvZiB0aGlzIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIkVycm9yUmVwb3J0VmFsdmVbIik7CisgICAgICAgIHNiLmFwcGVuZChjb250YWluZXIuZ2V0TmFtZSgpKTsKKyAgICAgICAgc2IuYXBwZW5kKCJdIik7CisgICAgICAgIHJldHVybiAoc2IudG9TdHJpbmcoKSk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm90ZWN0ZWQgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBQcmludHMgb3V0IGFuIGVycm9yIHJlcG9ydC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSByZXF1ZXN0IGJlaW5nIHByb2Nlc3NlZAorICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgcmVzcG9uc2UgYmVpbmcgZ2VuZXJhdGVkCisgICAgICogQHBhcmFtIHRocm93YWJsZSBUaGUgZXhjZXB0aW9uIHRoYXQgb2NjdXJyZWQgKHdoaWNoIHBvc3NpYmx5IHdyYXBzCisgICAgICogIGEgcm9vdCBjYXVzZSBleGNlcHRpb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCByZXBvcnQoUmVxdWVzdCByZXF1ZXN0LCBSZXNwb25zZSByZXNwb25zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyb3dhYmxlIHRocm93YWJsZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBEbyBub3RoaW5nIG9uIG5vbi1IVFRQIHJlc3BvbnNlcworICAgICAgICBpbnQgc3RhdHVzQ29kZSA9IHJlc3BvbnNlLmdldFN0YXR1cygpOworCisgICAgICAgIC8vIERvIG5vdGhpbmcgb24gYSAxeHgsIDJ4eCBhbmQgM3h4IHN0YXR1cworICAgICAgICBpZiAoc3RhdHVzQ29kZSA8IDQwMCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvLyBGSVhNRTogUmVzZXQgcGFydCBvZiB0aGUgcmVxdWVzdAorLyoKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChocmVzcG9uc2UuaXNFcnJvcigpKQorICAgICAgICAgICAgICAgIGhyZXNwb25zZS5yZXNldChzdGF0dXNDb2RlLCBtZXNzYWdlKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIDsKKyAgICAgICAgfQorKi8KKworICAgICAgICBUaHJvd2FibGUgcm9vdENhdXNlID0gbnVsbDsKKworICAgICAgICBpZiAodGhyb3dhYmxlICE9IG51bGwpIHsKKworICAgICAgICAgICAgaWYgKHRocm93YWJsZSBpbnN0YW5jZW9mIFNlcnZsZXRFeGNlcHRpb24pCisgICAgICAgICAgICAgICAgcm9vdENhdXNlID0gKChTZXJ2bGV0RXhjZXB0aW9uKSB0aHJvd2FibGUpLmdldFJvb3RDYXVzZSgpOworCisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IFJlcXVlc3RVdGlsLmZpbHRlcihyZXNwb25zZS5nZXRNZXNzYWdlKCkpOworICAgICAgICBpZiAobWVzc2FnZSA9PSBudWxsKQorICAgICAgICAgICAgbWVzc2FnZSA9ICIiOworICAgIAorICAgICAgICAvLyBEbyBub3RoaW5nIGlmIHRoZXJlIGlzIG5vIHJlcG9ydCBmb3IgdGhlIHNwZWNpZmllZCBzdGF0dXMgY29kZQorICAgICAgICBTdHJpbmcgcmVwb3J0ID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlcG9ydCA9IHNtLmdldFN0cmluZygiaHR0cC4iICsgc3RhdHVzQ29kZSwgbWVzc2FnZSk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlcG9ydCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKworICAgICAgICBzYi5hcHBlbmQoIjxodG1sPjxoZWFkPjx0aXRsZT4iKTsKKyAgICAgICAgc2IuYXBwZW5kKFNlcnZlckluZm8uZ2V0U2VydmVySW5mbygpKS5hcHBlbmQoIiAtICIpOworICAgICAgICBzYi5hcHBlbmQoc20uZ2V0U3RyaW5nKCJlcnJvclJlcG9ydFZhbHZlLmVycm9yUmVwb3J0IikpOworICAgICAgICBzYi5hcHBlbmQoIjwvdGl0bGU+Iik7CisgICAgICAgIHNiLmFwcGVuZCgiPHN0eWxlPjwhLS0iKTsKKyAgICAgICAgc2IuYXBwZW5kKG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5Ub21jYXRDU1MuVE9NQ0FUX0NTUyk7CisgICAgICAgIHNiLmFwcGVuZCgiLS0+PC9zdHlsZT4gIik7CisgICAgICAgIHNiLmFwcGVuZCgiPC9oZWFkPjxib2R5PiIpOworICAgICAgICBzYi5hcHBlbmQoIjxoMT4iKTsKKyAgICAgICAgc2IuYXBwZW5kKHNtLmdldFN0cmluZygiZXJyb3JSZXBvcnRWYWx2ZS5zdGF0dXNIZWFkZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiICsgc3RhdHVzQ29kZSwgbWVzc2FnZSkpLmFwcGVuZCgiPC9oMT4iKTsKKyAgICAgICAgc2IuYXBwZW5kKCI8SFIgc2l6ZT1cIjFcIiBub3NoYWRlPVwibm9zaGFkZVwiPiIpOworICAgICAgICBzYi5hcHBlbmQoIjxwPjxiPnR5cGU8L2I+ICIpOworICAgICAgICBpZiAodGhyb3dhYmxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZChzbS5nZXRTdHJpbmcoImVycm9yUmVwb3J0VmFsdmUuZXhjZXB0aW9uUmVwb3J0IikpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2IuYXBwZW5kKHNtLmdldFN0cmluZygiZXJyb3JSZXBvcnRWYWx2ZS5zdGF0dXNSZXBvcnQiKSk7CisgICAgICAgIH0KKyAgICAgICAgc2IuYXBwZW5kKCI8L3A+Iik7CisgICAgICAgIHNiLmFwcGVuZCgiPHA+PGI+Iik7CisgICAgICAgIHNiLmFwcGVuZChzbS5nZXRTdHJpbmcoImVycm9yUmVwb3J0VmFsdmUubWVzc2FnZSIpKTsKKyAgICAgICAgc2IuYXBwZW5kKCI8L2I+IDx1PiIpOworICAgICAgICBzYi5hcHBlbmQobWVzc2FnZSkuYXBwZW5kKCI8L3U+PC9wPiIpOworICAgICAgICBzYi5hcHBlbmQoIjxwPjxiPiIpOworICAgICAgICBzYi5hcHBlbmQoc20uZ2V0U3RyaW5nKCJlcnJvclJlcG9ydFZhbHZlLmRlc2NyaXB0aW9uIikpOworICAgICAgICBzYi5hcHBlbmQoIjwvYj4gPHU+Iik7CisgICAgICAgIHNiLmFwcGVuZChyZXBvcnQpOworICAgICAgICBzYi5hcHBlbmQoIjwvdT48L3A+Iik7CisKKyAgICAgICAgaWYgKHRocm93YWJsZSAhPSBudWxsKSB7CisKKyAgICAgICAgICAgIFN0cmluZyBzdGFja1RyYWNlID0gSmRrQ29tcGF0LmdldEpka0NvbXBhdCgpCisgICAgICAgICAgICAgICAgLmdldFBhcnRpYWxTZXJ2bGV0U3RhY2tUcmFjZSh0aHJvd2FibGUpOworICAgICAgICAgICAgc2IuYXBwZW5kKCI8cD48Yj4iKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChzbS5nZXRTdHJpbmcoImVycm9yUmVwb3J0VmFsdmUuZXhjZXB0aW9uIikpOworICAgICAgICAgICAgc2IuYXBwZW5kKCI8L2I+IDxwcmU+Iik7CisgICAgICAgICAgICBzYi5hcHBlbmQoUmVxdWVzdFV0aWwuZmlsdGVyKHN0YWNrVHJhY2UpKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiPC9wcmU+PC9wPiIpOworCisgICAgICAgICAgICB3aGlsZSAocm9vdENhdXNlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzdGFja1RyYWNlID0gSmRrQ29tcGF0LmdldEpka0NvbXBhdCgpCisgICAgICAgICAgICAgICAgICAgIC5nZXRQYXJ0aWFsU2VydmxldFN0YWNrVHJhY2Uocm9vdENhdXNlKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIjxwPjxiPiIpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChzbS5nZXRTdHJpbmcoImVycm9yUmVwb3J0VmFsdmUucm9vdENhdXNlIikpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiPC9iPiA8cHJlPiIpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChSZXF1ZXN0VXRpbC5maWx0ZXIoc3RhY2tUcmFjZSkpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiPC9wcmU+PC9wPiIpOworICAgICAgICAgICAgICAgIC8vIEluIGNhc2Ugcm9vdCBjYXVzZSBpcyBzb21laG93IGhlYXZpbHkgbmVzdGVkCisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcm9vdENhdXNlID0gKFRocm93YWJsZSlJbnRyb3NwZWN0aW9uVXRpbHMuZ2V0UHJvcGVydHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyb290Q2F1c2UsICJyb290Q2F1c2UiKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICByb290Q2F1c2UgPSBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2IuYXBwZW5kKCI8cD48Yj4iKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChzbS5nZXRTdHJpbmcoImVycm9yUmVwb3J0VmFsdmUubm90ZSIpKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiPC9iPiA8dT4iKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChzbS5nZXRTdHJpbmcoImVycm9yUmVwb3J0VmFsdmUucm9vdENhdXNlSW5Mb2dzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmVySW5mby5nZXRTZXJ2ZXJJbmZvKCkpKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiPC91PjwvcD4iKTsKKworICAgICAgICB9CisKKyAgICAgICAgc2IuYXBwZW5kKCI8SFIgc2l6ZT1cIjFcIiBub3NoYWRlPVwibm9zaGFkZVwiPiIpOworICAgICAgICBzYi5hcHBlbmQoIjxoMz4iKS5hcHBlbmQoU2VydmVySW5mby5nZXRTZXJ2ZXJJbmZvKCkpLmFwcGVuZCgiPC9oMz4iKTsKKyAgICAgICAgc2IuYXBwZW5kKCI8L2JvZHk+PC9odG1sPiIpOworCisgICAgICAgIHRyeSB7CisKKyAgICAgICAgICB0cnkgeworCisgICAgICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9odG1sIik7CisgICAgICAgICAgICByZXNwb25zZS5zZXRDaGFyYWN0ZXJFbmNvZGluZygidXRmLTgiKTsKKworICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisKKyAgICAgICAgICAgICBpZiAoY29udGFpbmVyLmdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICBjb250YWluZXIuZ2V0TG9nZ2VyKCkuZGVidWcoInN0YXR1cy5zZXRDb250ZW50VHlwZSIsIHQpOworCisgICAgICAgICAgfQorCisgICAgICAgICAgV3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFJlcG9ydGVyKCk7CisKKyAgICAgICAgICBpZiAod3JpdGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIElmIHdyaXRlciBpcyBudWxsLCBpdCdzIGFuIGluZGljYXRpb24gdGhhdCB0aGUgcmVzcG9uc2UgaGFzCisgICAgICAgICAgICAvLyBiZWVuIGhhcmQgY29tbWl0dGVkIGFscmVhZHksIHdoaWNoIHNob3VsZCBuZXZlciBoYXBwZW4KKyAgICAgICAgICAgIHdyaXRlci53cml0ZShzYi50b1N0cmluZygpKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgOworCisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICA7CisgICAgICAgIH0KKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdmFsdmVzL0V4dGVuZGVkQWNjZXNzTG9nVmFsdmUuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS92YWx2ZXMvRXh0ZW5kZWRBY2Nlc3NMb2dWYWx2ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjU4NmJjMjYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdmFsdmVzL0V4dGVuZGVkQWNjZXNzTG9nVmFsdmUuamF2YQpAQCAtMCwwICsxLDE0MjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OS0yMDAxLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS52YWx2ZXM7CisKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0LlVSTEVuY29kZXI7CitpbXBvcnQgamF2YS50ZXh0LkRlY2ltYWxGb3JtYXQ7CitpbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5UaW1lWm9uZTsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuQ29va2llOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuUmVxdWVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3Rvci5SZXNwb25zZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuTGlmZWN5Y2xlU3VwcG9ydDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuU2VydmVySW5mbzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuU3RyaW5nTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKKworCisKKy8qKgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIFczYyBFeHRlbmRlZCBMb2cgRmlsZSBGb3JtYXQuIFNlZQorICogaHR0cDovL3d3dy53My5vcmcvVFIvV0QtbG9nZmlsZS5odG1sIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBmb3JtYXQuCisgKgorICogVGhlIGZvbGxvd2luZyBmaWVsZHMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqIDxsaT48Y29kZT5jLWRuczwvY29kZT46ICBDbGllbnQgaG9zdG5hbWU8L2xpPgorICogPGxpPjxjb2RlPmMtaXA8L2NvZGU+OiAgQ2xpZW50IGlwIGFkZHJlc3M8L2xpPgorICogPGxpPjxjb2RlPmJ5dGVzPC9jb2RlPjogIGJ5dGVzIHNlcnZlZDwvbGk+CisgKiA8bGk+PGNvZGU+Y3MtbWV0aG9kPC9jb2RlPjogIHJlcXVlc3QgbWV0aG9kPC9saT4KKyAqIDxsaT48Y29kZT5jcy11cmk8L2NvZGU+OiAgVGhlIGZ1bGwgdXJpIHJlcXVlc3RlZDwvbGk+CisgKiA8bGk+PGNvZGU+Y3MtdXJpLXF1ZXJ5PC9jb2RlPjogIFRoZSBxdWVyeSBzdHJpbmc8L2xpPgorICogPGxpPjxjb2RlPmNzLXVyaS1zdGVtPC9jb2RlPjogIFRoZSB1cmkgd2l0aG91dCBxdWVyeSBzdHJpbmc8L2xpPgorICogPGxpPjxjb2RlPmRhdGU8L2NvZGU+OiAgVGhlIGRhdGUgaW4geXl5eS1tbS1kZCAgZm9ybWF0IGZvciBHTVQ8L2xpPgorICogPGxpPjxjb2RlPnMtZG5zPC9jb2RlPjogVGhlIHNlcnZlciBkbnMgZW50cnkgPC9saT4KKyAqIDxsaT48Y29kZT5zLWlwPC9jb2RlPjogIFRoZSBzZXJ2ZXIgaXAgYWRkcmVzczwvbGk+CisgKiA8bGk+PGNvZGU+Y3MoWFhYKTwvY29kZT46ICBUaGUgdmFsdWUgb2YgaGVhZGVyIFhYWCBmcm9tIGNsaWVudCB0byBzZXJ2ZXI8L2xpPgorICogPGxpPjxjb2RlPnNjKFhYWCk8L2NvZGU+OiBUaGUgdmFsdWUgb2YgaGVhZGVyIFhYWCBmcm9tIHNlcnZlciB0byBjbGllbnQgPC9saT4KKyAqIDxsaT48Y29kZT5zYy1zdGF0dXM8L2NvZGU+OiAgVGhlIHN0YXR1cyBjb2RlPC9saT4KKyAqIDxsaT48Y29kZT50aW1lPC9jb2RlPjogIFRpbWUgdGhlIHJlcXVlc3Qgd2FzIHNlcnZlZDwvbGk+CisgKiA8bGk+PGNvZGU+dGltZS10YWtlbjwvY29kZT46ICBUaW1lIChpbiBzZWNvbmRzKSB0YWtlbiB0byBzZXJ2ZSB0aGUgcmVxdWVzdDwvbGk+CisgKiA8bGk+PGNvZGU+eC1BKFhYWCk8L2NvZGU+OiBQdWxsIFhYWCBhdHRyaWJ1dGUgZnJvbSB0aGUgc2VydmxldCBjb250ZXh0IDwvbGk+CisgKiA8bGk+PGNvZGU+eC1DKFhYWCk8L2NvZGU+OiBQdWxsIHRoZSBmaXJzdCBjb29raWUgb2YgdGhlIG5hbWUgWFhYIDwvbGk+CisgKiA8bGk+PGNvZGU+eC1SKFhYWCk8L2NvZGU+OiBQdWxsIFhYWCBhdHRyaWJ1dGUgZnJvbSB0aGUgc2VydmxldCByZXF1ZXN0IDwvbGk+CisgKiA8bGk+PGNvZGU+eC1TKFhYWCk8L2NvZGU+OiBQdWxsIFhYWCBhdHRyaWJ1dGUgZnJvbSB0aGUgc2Vzc2lvbiA8L2xpPgorICogPGxpPjxjb2RlPngtUCguLi4pPC9jb2RlPjogIENhbGwgcmVxdWVzdC5nZXRQYXJhbWV0ZXIoLi4uKQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBVUkxlbmNvZGUgaXQuIEhlbHBmdWwgdG8gY2FwdHVyZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRhaW4gUE9TVCBwYXJhbWV0ZXJzLgorICogPC9saT4KKyAqIDxsaT5Gb3IgYW55IG9mIHRoZSB4LUgoLi4uKSB0aGUgZm9sbG93aW5nIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBmcm9tIHRoZQorICogICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0T2JqZWN0IDwvbGk+CisgKiA8bGk+PGNvZGU+eC1IKGF1dGhUeXBlKTwvY29kZT46IGdldEF1dGhUeXBlIDwvbGk+CisgKiA8bGk+PGNvZGU+eC1IKGNoYXJhY3RlckVuY29kaW5nKTwvY29kZT46IGdldENoYXJhY3RlckVuY29kaW5nIDwvbGk+CisgKiA8bGk+PGNvZGU+eC1IKGNvbnRlbnRMZW5ndGgpPC9jb2RlPjogZ2V0Q29udGVudExlbmd0aCA8L2xpPgorICogPGxpPjxjb2RlPngtSChsb2NhbGUpPC9jb2RlPjogIGdldExvY2FsZTwvbGk+CisgKiA8bGk+PGNvZGU+eC1IKHByb3RvY29sKTwvY29kZT46IGdldFByb3RvY29sIDwvbGk+CisgKiA8bGk+PGNvZGU+eC1IKHJlbW90ZVVzZXIpPC9jb2RlPjogIGdldFJlbW90ZVVzZXI8L2xpPgorICogPGxpPjxjb2RlPngtSChyZXF1ZXN0ZWRTZXNzaW9uSWQpPC9jb2RlPjogZ2V0R2VxdWVzdGVkU2Vzc2lvbklkPC9saT4KKyAqIDxsaT48Y29kZT54LUgocmVxdWVzdGVkU2Vzc2lvbklkRnJvbUNvb2tpZSk8L2NvZGU+OgorICogICAgICAgICAgICAgICAgICBpc1JlcXVlc3RlZFNlc3Npb25JZEZyb21Db29raWUgPC9saT4KKyAqIDxsaT48Y29kZT54LUgocmVxdWVzdGVkU2Vzc2lvbklkVmFsaWQpPC9jb2RlPjoKKyAqICAgICAgICAgICAgICAgICAgaXNSZXF1ZXN0ZWRTZXNzaW9uSWRWYWxpZDwvbGk+CisgKiA8bGk+PGNvZGU+eC1IKHNjaGVtZSk8L2NvZGU+OiAgZ2V0U2NoZW1lPC9saT4KKyAqIDxsaT48Y29kZT54LUgoc2VjdXJlKTwvY29kZT46ICBpc1NlY3VyZTwvbGk+CisgKiA8L3VsPgorICoKKyAqCisgKgorICogPHA+CisgKiBMb2cgcm90YXRpb24gY2FuIGJlIG9uIG9yIG9mZi4gVGhpcyBpcyBkaWN0YXRlZCBieSB0aGUgcm90YXRhYmxlCisgKiBwcm9wZXJ0eS4KKyAqIDwvcD4KKyAqCisgKiA8cD4KKyAqIEZvciBVTklYIHVzZXJzLCBhbm90aGVyIGZpZWxkIGNhbGxlZCA8Y29kZT5jaGVja0V4aXN0czwvY29kZT5pcyBhbHNvCisgKiBhdmFpbGFibGUuIElmIHNldCB0byB0cnVlLCB0aGUgbG9nIGZpbGUncyBleGlzdGVuY2Ugd2lsbCBiZSBjaGVja2VkIGJlZm9yZQorICogZWFjaCBsb2dnaW5nLiBUaGlzIHdheSBhbiBleHRlcm5hbCBsb2cgcm90YXRvciBjYW4gbW92ZSB0aGUgZmlsZQorICogc29tZXdoZXJlIGFuZCB0b21jYXQgd2lsbCBzdGFydCB3aXRoIGEgbmV3IGZpbGUuCisgKiA8L3A+CisgKgorICogPHA+CisgKiBGb3IgSk1YIGp1bmtpZXMsIGEgcHVibGljIG1ldGhvZCBjYWxsZWQgPC9jb2RlPnJvdGF0ZTwvY29kZT4gaGFzCisgKiBiZWVuIG1hZGUgYXZhaWxhYmxlIHRvIGFsbG93IHlvdSB0byB0ZWxsIHRoaXMgaW5zdGFuY2UgdG8gbW92ZQorICogdGhlIGV4aXN0aW5nIGxvZyBmaWxlIHRvIHNvbWV3aGVyZSBlbHNlIHN0YXJ0IHdyaXRpbmcgYSBuZXcgbG9nIGZpbGUuCisgKiA8L3A+CisgKgorICogPHA+CisgKiBDb25kaXRpb25hbCBsb2dnaW5nIGlzIGFsc28gc3VwcG9ydGVkLiBUaGlzIGNhbiBiZSBkb25lIHdpdGggdGhlCisgKiA8Y29kZT5jb25kaXRpb248L2NvZGU+IHByb3BlcnR5LgorICogSWYgdGhlIHZhbHVlIHJldHVybmVkIGZyb20gU2VydmxldFJlcXVlc3QuZ2V0QXR0cmlidXRlKGNvbmRpdGlvbikKKyAqIHlpZWxkcyBhIG5vbi1udWxsIHZhbHVlLiBUaGUgbG9nZ2luZyB3aWxsIGJlIHNraXBwZWQuCisgKiA8L3A+CisgKgorICogPHA+CisgKiBGb3IgZXh0ZW5kZWQgYXR0cmlidXRlcyBjb21pbmcgZnJvbSBhIGdldEF0dHJpYnV0ZSgpIGNhbGwsCisgKiBpdCBpcyB5b3UgcmVzcG9uc2liaWxpdHkgdG8gZW5zdXJlIHRoZXJlIGFyZSBubyBuZXdsaW5lIG9yCisgKiBjb250cm9sIGNoYXJhY3RlcnMuCisgKiA8L3A+CisgKgorICoKKyAqIEBhdXRob3IgVGltIEZ1bmsKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIEV4dGVuZGVkQWNjZXNzTG9nVmFsdmUKKyAgICBleHRlbmRzIFZhbHZlQmFzZQorICAgIGltcGxlbWVudHMgTGlmZWN5Y2xlIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggZGVmYXVsdCBwcm9wZXJ0eSB2YWx1ZXMuCisgICAgICovCisgICAgcHVibGljIEV4dGVuZGVkQWNjZXNzTG9nVmFsdmUoKSB7CisKKyAgICAgICAgc3VwZXIoKTsKKworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKyAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coRXh0ZW5kZWRBY2Nlc3NMb2dWYWx2ZS5jbGFzcyk7CisKKworICAgIC8qKgorICAgICAqIFRoZSBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIGluZm8gPQorICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS52YWx2ZXMuRXh0ZW5kZWRBY2Nlc3NMb2dWYWx2ZS8xLjAiOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgbGlmZWN5Y2xlIGV2ZW50IHN1cHBvcnQgZm9yIHRoaXMgY29tcG9uZW50LgorICAgICAqLworICAgIHByb3RlY3RlZCBMaWZlY3ljbGVTdXBwb3J0IGxpZmVjeWNsZSA9IG5ldyBMaWZlY3ljbGVTdXBwb3J0KHRoaXMpOworCisKKworICAgIC8qKgorICAgICAqIFRoZSBzdHJpbmcgbWFuYWdlciBmb3IgdGhpcyBwYWNrYWdlLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nTWFuYWdlciBzbSA9CisgICAgICAgIFN0cmluZ01hbmFnZXIuZ2V0TWFuYWdlcihDb25zdGFudHMuUGFja2FnZSk7CisKKworICAgIC8qKgorICAgICAqIEhhcyB0aGlzIGNvbXBvbmVudCBiZWVuIHN0YXJ0ZWQgeWV0PworICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBzdGFydGVkID0gZmFsc2U7CisKKworICAgIC8qKgorICAgICAqIFRoZSBhcy1vZiBkYXRlIGZvciB0aGUgY3VycmVudGx5IG9wZW4gbG9nIGZpbGUsIG9yIGEgemVyby1sZW5ndGgKKyAgICAgKiBzdHJpbmcgaWYgdGhlcmUgaXMgbm8gb3BlbiBsb2cgZmlsZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBkYXRlU3RhbXAgPSAiIjsKKworCisgICAgLyoqCisgICAgICogVGhlIFByaW50V3JpdGVyIHRvIHdoaWNoIHdlIGFyZSBjdXJyZW50bHkgbG9nZ2luZywgaWYgYW55LgorICAgICAqLworICAgIHByaXZhdGUgUHJpbnRXcml0ZXIgd3JpdGVyID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIGZvcm1hdHRlciBmb3IgdGhlIGRhdGUgY29udGFpbmVkIGluIHRoZSBmaWxlIG5hbWUuCisgICAgICovCisgICAgcHJpdmF0ZSBTaW1wbGVEYXRlRm9ybWF0IGZpbGVEYXRlRm9ybWF0dGVyID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogQSBkYXRlIGZvcm1hdHRlciB0byBmb3JtYXQgYSBEYXRlIGludG8gYSBkYXRlIGluIHRoZSBmb3JtYXQKKyAgICAgKiAieXl5eS1NTS1kZCIuCisgICAgICovCisgICAgcHJpdmF0ZSBTaW1wbGVEYXRlRm9ybWF0IGRhdGVGb3JtYXR0ZXIgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBBIGRhdGUgZm9ybWF0dGVyIHRvIGZvcm1hdCBhIERhdGUgaW50byBhIHRpbWUgaW4gdGhlIGZvcm1hdAorICAgICAqICJrazptbTpzcyIgKGtrIGlzIGEgMjQtaG91ciByZXByZXNlbnRhdGlvbiBvZiB0aGUgaG91cikuCisgICAgICovCisgICAgcHJpdmF0ZSBTaW1wbGVEYXRlRm9ybWF0IHRpbWVGb3JtYXR0ZXIgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaW1lIHRha2VuIGZvcm1hdHRlciBmb3IgMyBkZWNpbWFsIHBsYWNlcy4KKyAgICAgKi8KKyAgICAgcHJpdmF0ZSBEZWNpbWFsRm9ybWF0IHRpbWVUYWtlbkZvcm1hdHRlciA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIE15IGlwIGFkZHJlc3MuIExvb2sgaXQgdXAgb25jZSBhbmQgcmVtZW1iZXIgaXQuIER1bXAgdGhpcyBpZiB3ZSBjYW4KKyAgICAgKiBkZXRlcm1pbmUgYW5vdGhlciByZWxpYWJsZSB3YXkgdG8gZ2V0IHNlcnZlciBpcCBhZGRyZXNzIHNpbmNlIHRoaXMKKyAgICAgKiBzZXJ2ZXIgbWF5IGhhdmUgbWFueSBpcCdzLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIG15SXBBZGRyZXNzID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogTXkgZG5zIG5hbWUuIExvb2sgaXQgdXAgb25jZSBhbmQgcmVtZW1iZXIgaXQuIER1bXAgdGhpcyBpZiB3ZSBjYW4KKyAgICAgKiBkZXRlcm1pbmUgYW5vdGhlciByZWxpYWJsZSB3YXkgdG8gZ2V0IHNlcnZlciBuYW1lIGFkZHJlc3Mgc2luY2UgdGhpcworICAgICAqIHNlcnZlciBtYXkgaGF2ZSBtYW55IGlwJ3MuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbXlETlNOYW1lID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogSG9sZGVyIGZvciBhbGwgb2YgdGhlIGZpZWxkcyB0byBsb2cgYWZ0ZXIgdGhlIHBhdHRlcm4gaXMgZGVjb2RlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIEZpZWxkSW5mb1tdIGZpZWxkSW5mb3M7CisKKworICAgIC8qKgorICAgICAqIFRoZSBjdXJyZW50IGxvZyBmaWxlIHdlIGFyZSB3cml0aW5nIHRvLiBIZWxwZnVsIHdoZW4gY2hlY2tFeGlzdHMKKyAgICAgKiBpcyB0cnVlLgorICAgICAqLworICAgIHByaXZhdGUgRmlsZSBjdXJyZW50TG9nRmlsZSA9IG51bGw7CisKKworCisgICAgLyoqCisgICAgICogVGhlIHN5c3RlbSB0aW1lIHdoZW4gd2UgbGFzdCB1cGRhdGVkIHRoZSBEYXRlIHRoYXQgdGhpcyB2YWx2ZQorICAgICAqIHVzZXMgZm9yIGxvZyBsaW5lcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIERhdGUgY3VycmVudERhdGUgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBJbnN0YW50IHdoZW4gdGhlIGxvZyBkYWlseSByb3RhdGlvbiB3YXMgbGFzdCBjaGVja2VkLgorICAgICAqLworICAgIHByaXZhdGUgbG9uZyByb3RhdGlvbkxhc3RDaGVja2VkID0gMEw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggbG9nIGZpbGVzIGFyZSBjcmVhdGVkLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGRpcmVjdG9yeSA9ICJsb2dzIjsKKworCisgICAgLyoqCisgICAgICogVGhlIHBhdHRlcm4gdXNlZCB0byBmb3JtYXQgb3VyIGFjY2VzcyBsb2cgbGluZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcGF0dGVybiA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBwcmVmaXggdGhhdCBpcyBhZGRlZCB0byBsb2cgZmlsZSBmaWxlbmFtZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcHJlZml4ID0gImFjY2Vzc19sb2cuIjsKKworCisgICAgLyoqCisgICAgICogU2hvdWxkIHdlIHJvdGF0ZSBvdXIgbG9nIGZpbGU/IERlZmF1bHQgaXMgdHJ1ZSAobGlrZSBvbGQgYmVoYXZpb3IpCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHJvdGF0YWJsZSA9IHRydWU7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzdWZmaXggdGhhdCBpcyBhZGRlZCB0byBsb2cgZmlsZSBmaWxlbmFtZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgc3VmZml4ID0gIiI7CisKKworICAgIC8qKgorICAgICAqIEFyZSB3ZSBkb2luZyBjb25kaXRpb25hbCBsb2dnaW5nLiBkZWZhdWx0IGZhbHNlLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGNvbmRpdGlvbiA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIERvIHdlIGNoZWNrIGZvciBsb2cgZmlsZSBleGlzdGVuY2U/IEhlbHBmdWwgaWYgYW4gZXh0ZXJuYWwKKyAgICAgKiBhZ2VudCByZW5hbWVzIHRoZSBsb2cgZmlsZSBzbyB3ZSBjYW4gYXV0b21hZ2ljYWxseSByZWNyZWF0ZSBpdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gY2hlY2tFeGlzdHMgPSBmYWxzZTsKKworCisgICAgLyoqCisgICAgICogRGF0ZSBmb3JtYXQgdG8gcGxhY2UgaW4gbG9nIGZpbGUgbmFtZS4gVXNlIGF0IHlvdXIgb3duIHJpc2shCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZmlsZURhdGVGb3JtYXQgPSBudWxsOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggd2UgY3JlYXRlIGxvZyBmaWxlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldERpcmVjdG9yeSgpIHsKKworICAgICAgICByZXR1cm4gKGRpcmVjdG9yeSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIHdlIGNyZWF0ZSBsb2cgZmlsZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGlyZWN0b3J5IFRoZSBuZXcgbG9nIGZpbGUgZGlyZWN0b3J5CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGlyZWN0b3J5KFN0cmluZyBkaXJlY3RvcnkpIHsKKworICAgICAgICB0aGlzLmRpcmVjdG9yeSA9IGRpcmVjdG9yeTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJbmZvKCkgeworCisgICAgICAgIHJldHVybiAoaW5mbyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZm9ybWF0IHBhdHRlcm4uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRQYXR0ZXJuKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5wYXR0ZXJuKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBmb3JtYXQgcGF0dGVybiwgZmlyc3QgdHJhbnNsYXRpbmcgYW55IHJlY29nbml6ZWQgYWxpYXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0dGVybiBUaGUgbmV3IHBhdHRlcm4gcGF0dGVybgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhdHRlcm4oU3RyaW5nIHBhdHRlcm4pIHsKKworICAgICAgICBGaWVsZEluZm9bXSBmPSBkZWNvZGVQYXR0ZXJuKHBhdHRlcm4pOworICAgICAgICBpZiAoZiE9bnVsbCkgeworICAgICAgICAgICAgdGhpcy5wYXR0ZXJuID0gcGF0dGVybjsKKyAgICAgICAgICAgIHRoaXMuZmllbGRJbmZvcyA9IGY7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbG9nIGZpbGUgcHJlZml4LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KCkgeworCisgICAgICAgIHJldHVybiAocHJlZml4KTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBsb2cgZmlsZSBwcmVmaXguCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJlZml4IFRoZSBuZXcgbG9nIGZpbGUgcHJlZml4CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJlZml4KFN0cmluZyBwcmVmaXgpIHsKKworICAgICAgICB0aGlzLnByZWZpeCA9IHByZWZpeDsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRydWUgaWYgbG9ncyBhcmUgYXV0b21hdGljYWxseSByb3RhdGVkLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzUm90YXRhYmxlKCkgeworCisgICAgICAgIHJldHVybiByb3RhdGFibGU7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdmFsdWUgaXMgd2Ugc2hvdWxkIHdlIHJvdGF0ZSB0aGUgbG9ncworICAgICAqCisgICAgICogQHBhcmFtIHJvdGF0YWJsZSB0cnVlIGlzIHdlIHNob3VsZCByb3RhdGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Um90YXRhYmxlKGJvb2xlYW4gcm90YXRhYmxlKSB7CisKKyAgICAgICAgdGhpcy5yb3RhdGFibGUgPSByb3RhdGFibGU7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbG9nIGZpbGUgc3VmZml4LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3VmZml4KCkgeworCisgICAgICAgIHJldHVybiAoc3VmZml4KTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBsb2cgZmlsZSBzdWZmaXguCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3VmZml4IFRoZSBuZXcgbG9nIGZpbGUgc3VmZml4CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3VmZml4KFN0cmluZyBzdWZmaXgpIHsKKworICAgICAgICB0aGlzLnN1ZmZpeCA9IHN1ZmZpeDsKKworICAgIH0KKworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gd2hldGhlciB0aGUgYXR0cmlidXRlIG5hbWUgdG8gbG9vayBmb3Igd2hlbgorICAgICAqIHBlcmZvcm1pbmcgY29uZGl0aW9uYWwgbG9nZ2dpbmcuIElmIG51bGwsIGV2ZXJ5CisgICAgICogcmVxdWVzdCBpcyBsb2dnZWQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDb25kaXRpb24oKSB7CisKKyAgICAgICAgcmV0dXJuIGNvbmRpdGlvbjsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBTZXJ2bGV0UmVxdWVzdC5hdHRyaWJ1dGUgdG8gbG9vayBmb3IgdG8gcGVyZm9ybQorICAgICAqIGNvbmRpdGlvbmFsIGxvZ2dpbmcuIFNldCB0byBudWxsIHRvIGxvZyBldmVyeXRoaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbmRpdGlvbiBTZXQgdG8gbnVsbCB0byBsb2cgZXZlcnl0aGluZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbmRpdGlvbihTdHJpbmcgY29uZGl0aW9uKSB7CisKKyAgICAgICAgdGhpcy5jb25kaXRpb24gPSBjb25kaXRpb247CisKKyAgICB9CisKKworCisgICAgLyoqCisgICAgICogQ2hlY2sgZm9yIGZpbGUgZXhpc3RlbmNlIGJlZm9yZSBsb2dnaW5nLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzQ2hlY2tFeGlzdHMoKSB7CisKKyAgICAgICAgcmV0dXJuIGNoZWNrRXhpc3RzOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgd2hldGhlciB0byBjaGVjayBmb3IgbG9nIGZpbGUgZXhpc3RlbmNlIGJlZm9yZSBsb2dnaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIGNoZWNrRXhpc3RzIHRydWUgbWVhbmluZyB0byBjaGVjayBmb3IgZmlsZSBleGlzdGVuY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2hlY2tFeGlzdHMoYm9vbGVhbiBjaGVja0V4aXN0cykgeworCisgICAgICAgIHRoaXMuY2hlY2tFeGlzdHMgPSBjaGVja0V4aXN0czsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogIFJldHVybiB0aGUgZGF0ZSBmb3JtYXQgZGF0ZSBiYXNlZCBsb2cgcm90YXRpb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRGaWxlRGF0ZUZvcm1hdCgpIHsKKyAgICAgICAgcmV0dXJuIGZpbGVEYXRlRm9ybWF0OworICAgIH0KKworCisgICAgLyoqCisgICAgICogIFNldCB0aGUgZGF0ZSBmb3JtYXQgZGF0ZSBiYXNlZCBsb2cgcm90YXRpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RmlsZURhdGVGb3JtYXQoU3RyaW5nIGZpbGVEYXRlRm9ybWF0KSB7CisgICAgICAgIHRoaXMuZmlsZURhdGVGb3JtYXQgPSAgZmlsZURhdGVGb3JtYXQ7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogTG9nIGEgbWVzc2FnZSBzdW1tYXJpemluZyB0aGUgc3BlY2lmaWVkIHJlcXVlc3QgYW5kIHJlc3BvbnNlLCBhY2NvcmRpbmcKKyAgICAgKiB0byB0aGUgZm9ybWF0IHNwZWNpZmllZCBieSB0aGUgPGNvZGU+cGF0dGVybjwvY29kZT4gcHJvcGVydHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBSZXF1ZXN0IGJlaW5nIHByb2Nlc3NlZAorICAgICAqIEBwYXJhbSByZXNwb25zZSBSZXNwb25zZSBiZWluZyBwcm9jZXNzZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIGhhcyBvY2N1cnJlZAorICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXJyb3IgaGFzIG9jY3VycmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgaW52b2tlKFJlcXVlc3QgcmVxdWVzdCwgUmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gUGFzcyB0aGlzIHJlcXVlc3Qgb24gdG8gdGhlIG5leHQgdmFsdmUgaW4gb3VyIHBpcGVsaW5lCisgICAgICAgIGxvbmcgZW5kVGltZTsKKyAgICAgICAgbG9uZyBydW5UaW1lOworICAgICAgICBsb25nIHN0YXJ0VGltZT1TeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKworICAgICAgICBnZXROZXh0KCkuaW52b2tlKHJlcXVlc3QsIHJlc3BvbnNlKTsKKworICAgICAgICBlbmRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIHJ1blRpbWUgPSBlbmRUaW1lLXN0YXJ0VGltZTsKKworICAgICAgICBpZiAoZmllbGRJbmZvcz09bnVsbCB8fCBjb25kaXRpb24hPW51bGwgJiYKKyAgICAgICAgICAgICAgbnVsbCE9cmVxdWVzdC5nZXRSZXF1ZXN0KCkuZ2V0QXR0cmlidXRlKGNvbmRpdGlvbikpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisKKyAgICAgICAgRGF0ZSBkYXRlID0gZ2V0RGF0ZShlbmRUaW1lKTsKKyAgICAgICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKworICAgICAgICBmb3IgKGludCBpPTA7IGZpZWxkSW5mb3MhPW51bGwgJiYgaTxmaWVsZEluZm9zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBzd2l0Y2goZmllbGRJbmZvc1tpXS50eXBlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBGaWVsZEluZm8uREFUQV9DTElFTlQ6CisgICAgICAgICAgICAgICAgICAgIGlmIChGaWVsZEluZm8uRklFTERfSVA9PWZpZWxkSW5mb3NbaV0ubG9jYXRpb24pCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHJlcXVlc3QuZ2V0UmVxdWVzdCgpLmdldFJlbW90ZUFkZHIoKSk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEZpZWxkSW5mby5GSUVMRF9ETlM9PWZpZWxkSW5mb3NbaV0ubG9jYXRpb24pCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHJlcXVlc3QuZ2V0UmVxdWVzdCgpLmdldFJlbW90ZUhvc3QoKSk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIj9XVEY/Iik7IC8qIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiEgKi8KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBGaWVsZEluZm8uREFUQV9TRVJWRVI6CisgICAgICAgICAgICAgICAgICAgIGlmIChGaWVsZEluZm8uRklFTERfSVA9PWZpZWxkSW5mb3NbaV0ubG9jYXRpb24pCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKG15SXBBZGRyZXNzKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoRmllbGRJbmZvLkZJRUxEX0ROUz09ZmllbGRJbmZvc1tpXS5sb2NhdGlvbikKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQobXlETlNOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiP1dURj8iKTsgLyogVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuISAqLworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEZpZWxkSW5mby5EQVRBX1JFTU9URToKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgnPycpOyAvKiBJIGRvbid0IGtub3cgaG93IHRvIGhhbmRsZSB0aGVzZSEgKi8KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBGaWVsZEluZm8uREFUQV9DTElFTlRfVE9fU0VSVkVSOgorICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGdldENsaWVudFRvU2VydmVyKGZpZWxkSW5mb3NbaV0sIHJlcXVlc3QpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBGaWVsZEluZm8uREFUQV9TRVJWRVJfVE9fQ0xJRU5UOgorICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGdldFNlcnZlclRvQ2xpZW50KGZpZWxkSW5mb3NbaV0sIHJlc3BvbnNlKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRmllbGRJbmZvLkRBVEFfU0VSVkVSX1RPX1JTRVJWRVI6CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoJy0nKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBGaWVsZEluZm8uREFUQV9SU0VSVkVSX1RPX1NFUlZFUjoKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgnLScpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEZpZWxkSW5mby5EQVRBX0FQUF9TUEVDSUZJQzoKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChnZXRBcHBTcGVjaWZpYyhmaWVsZEluZm9zW2ldLCByZXF1ZXN0KSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRmllbGRJbmZvLkRBVEFfU1BFQ0lBTDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKEZpZWxkSW5mby5TUEVDSUFMX0RBVEU9PWZpZWxkSW5mb3NbaV0ubG9jYXRpb24pCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGRhdGVGb3JtYXR0ZXIuZm9ybWF0KGRhdGUpKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoRmllbGRJbmZvLlNQRUNJQUxfVElNRV9UQUtFTj09ZmllbGRJbmZvc1tpXS5sb2NhdGlvbikKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQodGltZVRha2VuRm9ybWF0dGVyLmZvcm1hdChydW5UaW1lLzEwMDBkKSk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEZpZWxkSW5mby5TUEVDSUFMX1RJTUU9PWZpZWxkSW5mb3NbaV0ubG9jYXRpb24pCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHRpbWVGb3JtYXR0ZXIuZm9ybWF0KGRhdGUpKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoRmllbGRJbmZvLlNQRUNJQUxfQllURVM9PWZpZWxkSW5mb3NbaV0ubG9jYXRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGggPSByZXNwb25zZS5nZXRDb250ZW50Q291bnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQobGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCItIik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoRmllbGRJbmZvLlNQRUNJQUxfQ0FDSEVEPT1maWVsZEluZm9zW2ldLmxvY2F0aW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgnLScpOyAvKiBJIGRvbid0IGtub3cgaG93IHRvIGV2YWx1YXRlIHRoaXMhICovCisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIj9XVEY/Iik7IC8qIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiEgKi8KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiP1dURj8iKTsgLyogVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuISAqLworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZmllbGRJbmZvc1tpXS5wb3N0V2hpdGVTcGFjZSE9bnVsbCkgeworICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoZmllbGRJbmZvc1tpXS5wb3N0V2hpdGVTcGFjZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbG9nKHJlc3VsdC50b1N0cmluZygpLCBkYXRlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVuYW1lIHRoZSBleGlzdGluZyBsb2cgZmlsZSB0byBzb21ldGhpbmcgZWxzZS4gVGhlbiBvcGVuIHRoZQorICAgICAqIG9sZCBsb2cgZmlsZSBuYW1lIHVwIG9uY2UgYWdhaW4uIEludGVuZGVkIHRvIGJlIGNhbGxlZCBieSBhIEpNWAorICAgICAqIGFnZW50LgorICAgICAqCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmV3RmlsZU5hbWUgVGhlIGZpbGUgbmFtZSB0byBtb3ZlIHRoZSBsb2cgZmlsZSBlbnRyeSB0bworICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhIGZpbGUgd2FzIHJvdGF0ZWQgd2l0aCBubyBlcnJvcgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiByb3RhdGUoU3RyaW5nIG5ld0ZpbGVOYW1lKSB7CisKKyAgICAgICAgaWYgKGN1cnJlbnRMb2dGaWxlIT1udWxsKSB7CisgICAgICAgICAgICBGaWxlIGhvbGRlciA9IGN1cnJlbnRMb2dGaWxlOworICAgICAgICAgICAgY2xvc2UoKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaG9sZGVyLnJlbmFtZVRvKG5ldyBGaWxlKG5ld0ZpbGVOYW1lKSk7CisgICAgICAgICAgICB9IGNhdGNoKFRocm93YWJsZSBlKXsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3IoInJvdGF0ZSBmYWlsZWQiLCBlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogTWFrZSBzdXJlIGRhdGUgaXMgY29ycmVjdCAqLworICAgICAgICAgICAgY3VycmVudERhdGUgPSBuZXcgRGF0ZShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisgICAgICAgICAgICBkYXRlU3RhbXAgPSBmaWxlRGF0ZUZvcm1hdHRlci5mb3JtYXQoY3VycmVudERhdGUpOworCisgICAgICAgICAgICBvcGVuKCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJpdmF0ZSBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqICBSZXR1cm4gdGhlIGNsaWVudCB0byBzZXJ2ZXIgZGF0YS4KKyAgICAgKiAgQHBhcmFtIGZpZWxkSW5mbyBUaGUgZmllbGQgdG8gZGVjb2RlLgorICAgICAqICBAcGFyYW0gcmVxdWVzdCBUaGUgb2JqZWN0IHdlIHB1bGwgZGF0YSBmcm9tLgorICAgICAqICBAcmV0dXJuIFRoZSBhcHByb3ByaWF0ZSB2YWx1ZS4KKyAgICAgKi8KKyAgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0Q2xpZW50VG9TZXJ2ZXIoRmllbGRJbmZvIGZpZWxkSW5mbywgUmVxdWVzdCByZXF1ZXN0KSB7CisKKyAgICAgICAgc3dpdGNoKGZpZWxkSW5mby5sb2NhdGlvbikgeworICAgICAgICAgICAgY2FzZSBGaWVsZEluZm8uRklFTERfTUVUSE9EOgorICAgICAgICAgICAgICAgIHJldHVybiByZXF1ZXN0LmdldE1ldGhvZCgpOworICAgICAgICAgICAgY2FzZSBGaWVsZEluZm8uRklFTERfVVJJOgorICAgICAgICAgICAgICAgIGlmIChudWxsPT1yZXF1ZXN0LmdldFF1ZXJ5U3RyaW5nKCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKSArICI/IiArIHJlcXVlc3QuZ2V0UXVlcnlTdHJpbmcoKTsKKyAgICAgICAgICAgIGNhc2UgRmllbGRJbmZvLkZJRUxEX1VSSV9TVEVNOgorICAgICAgICAgICAgICAgIHJldHVybiByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKTsKKyAgICAgICAgICAgIGNhc2UgRmllbGRJbmZvLkZJRUxEX1VSSV9RVUVSWToKKyAgICAgICAgICAgICAgICBpZiAobnVsbD09cmVxdWVzdC5nZXRRdWVyeVN0cmluZygpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gIi0iOworICAgICAgICAgICAgICAgIHJldHVybiByZXF1ZXN0LmdldFF1ZXJ5U3RyaW5nKCk7CisgICAgICAgICAgICBjYXNlIEZpZWxkSW5mby5GSUVMRF9IRUFERVI6CisgICAgICAgICAgICAgICAgcmV0dXJuIHdyYXAocmVxdWVzdC5nZXRIZWFkZXIoZmllbGRJbmZvLnZhbHVlKSk7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAiLSI7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqICBSZXR1cm4gdGhlIHNlcnZlciB0byBjbGllbnQgZGF0YS4KKyAgICAgKiAgQHBhcmFtIGZpZWxkSW5mbyBUaGUgZmllbGQgdG8gZGVjb2RlLgorICAgICAqICBAcGFyYW0gcmVzcG9uc2UgVGhlIG9iamVjdCB3ZSBwdWxsIGRhdGEgZnJvbS4KKyAgICAgKiAgQHJldHVybiBUaGUgYXBwcm9wcmlhdGUgdmFsdWUuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0U2VydmVyVG9DbGllbnQoRmllbGRJbmZvIGZpZWxkSW5mbywgUmVzcG9uc2UgcmVzcG9uc2UpIHsKKyAgICAgICAgc3dpdGNoKGZpZWxkSW5mby5sb2NhdGlvbikgeworICAgICAgICAgICAgY2FzZSBGaWVsZEluZm8uRklFTERfU1RBVFVTOgorICAgICAgICAgICAgICAgIHJldHVybiAiIiArIHJlc3BvbnNlLmdldFN0YXR1cygpOworICAgICAgICAgICAgY2FzZSBGaWVsZEluZm8uRklFTERfQ09NTUVOVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gIj8iOyAvKiBOb3QgY29kZWQgeWV0Ki8KKyAgICAgICAgICAgIGNhc2UgRmllbGRJbmZvLkZJRUxEX0hFQURFUjoKKyAgICAgICAgICAgICAgICByZXR1cm4gd3JhcChyZXNwb25zZS5nZXRIZWFkZXIoZmllbGRJbmZvLnZhbHVlKSk7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAiLSI7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdldCBhcHAgc3BlY2lmaWMgZGF0YS4KKyAgICAgKiBAcGFyYW0gZmllbGRJbmZvIFRoZSBmaWVsZCB0byBkZWNvZGUKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBXaGVyZSB3ZSB3aWxsIHB1bGwgdGhlIGRhdGEgZnJvbS4KKyAgICAgKiBAcmV0dXJuIFRoZSBhcHByb3ByaWF0ZSB2YWx1ZQorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGdldEFwcFNwZWNpZmljKEZpZWxkSW5mbyBmaWVsZEluZm8sIFJlcXVlc3QgcmVxdWVzdCkgeworCisgICAgICAgIHN3aXRjaChmaWVsZEluZm8ueFR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgRmllbGRJbmZvLlhfUEFSQU1FVEVSOgorICAgICAgICAgICAgICAgIHJldHVybiB3cmFwKHVybEVuY29kZShyZXF1ZXN0LmdldFBhcmFtZXRlcihmaWVsZEluZm8udmFsdWUpKSk7CisgICAgICAgICAgICBjYXNlIEZpZWxkSW5mby5YX1JFUVVFU1Q6CisgICAgICAgICAgICAgICAgcmV0dXJuIHdyYXAocmVxdWVzdC5nZXRBdHRyaWJ1dGUoZmllbGRJbmZvLnZhbHVlKSk7CisgICAgICAgICAgICBjYXNlIEZpZWxkSW5mby5YX1NFU1NJT046CisgICAgICAgICAgICAgICAgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IG51bGw7CisgICAgICAgICAgICAgICAgaWYgKHJlcXVlc3QhPW51bGwpeworICAgICAgICAgICAgICAgICAgICBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uKGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNlc3Npb24hPW51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd3JhcChzZXNzaW9uLmdldEF0dHJpYnV0ZShmaWVsZEluZm8udmFsdWUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEZpZWxkSW5mby5YX0NPT0tJRToKKyAgICAgICAgICAgICAgICBDb29raWVbXSBjID0gcmVxdWVzdC5nZXRDb29raWVzKCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBjICE9IG51bGwgJiYgaSA8IGMubGVuZ3RoOyBpKyspeworICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGRJbmZvLnZhbHVlLmVxdWFscyhjW2ldLmdldE5hbWUoKSkpeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdyYXAoY1tpXS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEZpZWxkSW5mby5YX0FQUDoKKyAgICAgICAgICAgICAgICByZXR1cm4gd3JhcChyZXF1ZXN0LmdldENvbnRleHQoKS5nZXRTZXJ2bGV0Q29udGV4dCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRBdHRyaWJ1dGUoZmllbGRJbmZvLnZhbHVlKSk7CisgICAgICAgICAgICBjYXNlIEZpZWxkSW5mby5YX1NFUlZMRVRfUkVRVUVTVDoKKyAgICAgICAgICAgICAgICBpZiAoZmllbGRJbmZvLmxvY2F0aW9uPT1GaWVsZEluZm8uWF9MT0NfQVVUSFRZUEUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdyYXAocmVxdWVzdC5nZXRBdXRoVHlwZSgpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZpZWxkSW5mby5sb2NhdGlvbj09RmllbGRJbmZvLlhfTE9DX1JFTU9URVVTRVIpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdyYXAocmVxdWVzdC5nZXRSZW1vdGVVc2VyKCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGRJbmZvLmxvY2F0aW9uPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZEluZm8uWF9MT0NfUkVRVUVTVEVEU0VTU0lPTklEKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB3cmFwKHJlcXVlc3QuZ2V0UmVxdWVzdGVkU2Vzc2lvbklkKCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGRJbmZvLmxvY2F0aW9uPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZEluZm8uWF9MT0NfUkVRVUVTVEVEU0VTU0lPTklERlJPTUNPT0tJRSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gd3JhcCgiIityZXF1ZXN0LmlzUmVxdWVzdGVkU2Vzc2lvbklkRnJvbUNvb2tpZSgpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZpZWxkSW5mby5sb2NhdGlvbj09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRJbmZvLlhfTE9DX1JFUVVFU1RFRFNFU1NJT05JRFZBTElEKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB3cmFwKCIiK3JlcXVlc3QuaXNSZXF1ZXN0ZWRTZXNzaW9uSWRWYWxpZCgpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZpZWxkSW5mby5sb2NhdGlvbj09RmllbGRJbmZvLlhfTE9DX0NPTlRFTlRMRU5HVEgpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdyYXAoIiIrcmVxdWVzdC5nZXRDb250ZW50TGVuZ3RoKCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGRJbmZvLmxvY2F0aW9uPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZEluZm8uWF9MT0NfQ0hBUkFDVEVSRU5DT0RJTkcpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdyYXAocmVxdWVzdC5nZXRDaGFyYWN0ZXJFbmNvZGluZygpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZpZWxkSW5mby5sb2NhdGlvbj09RmllbGRJbmZvLlhfTE9DX0xPQ0FMRSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gd3JhcChyZXF1ZXN0LmdldExvY2FsZSgpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZpZWxkSW5mby5sb2NhdGlvbj09RmllbGRJbmZvLlhfTE9DX1BST1RPQ09MKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB3cmFwKHJlcXVlc3QuZ2V0UHJvdG9jb2woKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmaWVsZEluZm8ubG9jYXRpb249PUZpZWxkSW5mby5YX0xPQ19TQ0hFTUUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdyYXAocmVxdWVzdC5nZXRTY2hlbWUoKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmaWVsZEluZm8ubG9jYXRpb249PUZpZWxkSW5mby5YX0xPQ19TRUNVUkUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdyYXAoIiIrcmVxdWVzdC5pc1NlY3VyZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAiLSI7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqICB1cmxFbmNvZGUgdGhlIGdpdmVuIHN0cmluZy4gSWYgbnVsbCBvciBlbXB0eSwgcmV0dXJuIG51bGwuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgdXJsRW5jb2RlKFN0cmluZyB2YWx1ZSkgeworICAgICAgICBpZiAobnVsbD09dmFsdWUgfHwgdmFsdWUubGVuZ3RoKCk9PTApIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIHJldHVybiBVUkxFbmNvZGVyLmVuY29kZSh2YWx1ZSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiAgV3JhcCB0aGUgaW5jb21pbmcgdmFsdWUgaW50byBxdW90ZXMgYW5kIGVzY2FwZSBhbnkgaW5uZXIKKyAgICAgKiAgcXVvdGVzIHdpdGggZG91YmxlIHF1b3Rlcy4KKyAgICAgKgorICAgICAqICBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gd3JhcCBxdW90ZXMgYXJvdW5kCisgICAgICogIEByZXR1cm4gJy0nIGlmIGVtcHR5IG9mIG51bGwuIE90aGVyd2lzZSwgdG9TdHJpbmcoKSB3aWxsCisgICAgICogICAgIGJlIGNhbGxlZCBvbiB0aGUgb2JqZWN0IGFuZCB0aGUgdmFsdWUgd2lsbCBiZSB3cmFwcGVkCisgICAgICogICAgIGluIHF1b3RlcyBhbmQgYW55IHF1b3RlcyB3aWxsIGJlIGVzY2FwZWQgd2l0aCAyCisgICAgICogICAgIHNldHMgb2YgcXVvdGVzLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHdyYXAoT2JqZWN0IHZhbHVlKSB7CisKKyAgICAgICAgU3RyaW5nIHN2YWx1ZTsKKyAgICAgICAgLy8gRG9lcyB0aGUgdmFsdWUgY29udGFpbiBhICIgPyBJZiBzbyBtdXN0IGVuY29kZSBpdAorICAgICAgICBpZiAodmFsdWU9PW51bGwgfHwgIi0iLmVxdWFscyh2YWx1ZSkpCisgICAgICAgICAgICByZXR1cm4gIi0iOworCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN2YWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCk7CisgICAgICAgICAgICBpZiAoIiIuZXF1YWxzKHN2YWx1ZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuICItIjsKKyAgICAgICAgfSBjYXRjaChUaHJvd2FibGUgZSl7CisgICAgICAgICAgICAvKiBMb2cgZXJyb3IgKi8KKyAgICAgICAgICAgIHJldHVybiAiLSI7CisgICAgICAgIH0KKworICAgICAgICAvKiBXcmFwIGFsbCBxdW90ZXMgaW4gZG91YmxlIHF1b3Rlcy4gKi8KKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoc3ZhbHVlLmxlbmd0aCgpKzIpOworICAgICAgICBidWZmZXIuYXBwZW5kKCciJyk7CisgICAgICAgIGludCBpPTA7CisgICAgICAgIHdoaWxlIChpPHN2YWx1ZS5sZW5ndGgoKSkgeworICAgICAgICAgICAgaW50IGogPSBzdmFsdWUuaW5kZXhPZignIicsIGkpOworICAgICAgICAgICAgaWYgKGo9PS0xKSB7CisgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChzdmFsdWUuc3Vic3RyaW5nKGkpKTsKKyAgICAgICAgICAgICAgICBpPXN2YWx1ZS5sZW5ndGgoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChzdmFsdWUuc3Vic3RyaW5nKGksIGorMSkpOworICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoJyInKTsKKyAgICAgICAgICAgICAgICBpPWorMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGJ1ZmZlci5hcHBlbmQoJyInKTsKKyAgICAgICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDbG9zZSB0aGUgY3VycmVudGx5IG9wZW4gbG9nIGZpbGUgKGlmIGFueSkKKyAgICAgKi8KKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGNsb3NlKCkgeworCisgICAgICAgIGlmICh3cml0ZXIgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgd3JpdGVyLmZsdXNoKCk7CisgICAgICAgIHdyaXRlci5jbG9zZSgpOworICAgICAgICB3cml0ZXIgPSBudWxsOworICAgICAgICBjdXJyZW50TG9nRmlsZSA9IG51bGw7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIExvZyB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UgdG8gdGhlIGxvZyBmaWxlLCBzd2l0Y2hpbmcgZmlsZXMgaWYgdGhlIGRhdGUKKyAgICAgKiBoYXMgY2hhbmdlZCBzaW5jZSB0aGUgcHJldmlvdXMgbG9nIGNhbGwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVzc2FnZSBNZXNzYWdlIHRvIGJlIGxvZ2dlZAorICAgICAqIEBwYXJhbSBkYXRlIHRoZSBjdXJyZW50IERhdGUgb2JqZWN0IChzbyB0aGlzIG1ldGhvZCBkb2Vzbid0IG5lZWQgdG8KKyAgICAgKiAgICAgICAgY3JlYXRlIGEgbmV3IG9uZSkKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgbG9nKFN0cmluZyBtZXNzYWdlLCBEYXRlIGRhdGUpIHsKKworICAgICAgICBpZiAocm90YXRhYmxlKXsKKyAgICAgICAgICAgIC8vIE9ubHkgZG8gYSBsb2dmaWxlIHN3aXRjaCBjaGVjayBvbmNlIGEgc2Vjb25kLCBtYXguCisgICAgICAgICAgICBsb25nIHN5c3RpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgIGlmICgoc3lzdGltZSAtIHJvdGF0aW9uTGFzdENoZWNrZWQpID4gMTAwMCkgeworCisgICAgICAgICAgICAgICAgLy8gV2UgbmVlZCBhIG5ldyBjdXJyZW50RGF0ZQorICAgICAgICAgICAgICAgIGN1cnJlbnREYXRlID0gbmV3IERhdGUoc3lzdGltZSk7CisgICAgICAgICAgICAgICAgcm90YXRpb25MYXN0Q2hlY2tlZCA9IHN5c3RpbWU7CisKKyAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgYSBjaGFuZ2Ugb2YgZGF0ZQorICAgICAgICAgICAgICAgIFN0cmluZyB0c0RhdGUgPSBmaWxlRGF0ZUZvcm1hdHRlci5mb3JtYXQoY3VycmVudERhdGUpOworCisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGRhdGUgaGFzIGNoYW5nZWQsIHN3aXRjaCBsb2cgZmlsZXMKKyAgICAgICAgICAgICAgICBpZiAoIWRhdGVTdGFtcC5lcXVhbHModHNEYXRlKSkgeworICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZGF0ZVN0YW1wLmVxdWFscyh0c0RhdGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlU3RhbXAgPSB0c0RhdGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlbigpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogSW4gY2FzZSBzb21ldGhpbmcgZXh0ZXJuYWwgcm90YXRlZCB0aGUgZmlsZSBpbnN0ZWFkICovCisgICAgICAgIGlmIChjaGVja0V4aXN0cyl7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgICAgICBpZiAoY3VycmVudExvZ0ZpbGUhPW51bGwgJiYgIWN1cnJlbnRMb2dGaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZSgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSl7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbygiYXQgbGVhc3QgdGhpcyB3YXNuJ3Qgc3dhbGxvd2VkIiwgZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvKiBNYWtlIHN1cmUgZGF0ZSBpcyBjb3JyZWN0ICovCisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnREYXRlID0gbmV3IERhdGUoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworICAgICAgICAgICAgICAgICAgICBkYXRlU3RhbXAgPSBmaWxlRGF0ZUZvcm1hdHRlci5mb3JtYXQoY3VycmVudERhdGUpOworCisgICAgICAgICAgICAgICAgICAgIG9wZW4oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBMb2cgdGhpcyBtZXNzYWdlCisgICAgICAgIGlmICh3cml0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4obWVzc2FnZSk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogT3BlbiB0aGUgbmV3IGxvZyBmaWxlIGZvciB0aGUgZGF0ZSBzcGVjaWZpZWQgYnkgPGNvZGU+ZGF0ZVN0YW1wPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIG9wZW4oKSB7CisKKyAgICAgICAgLy8gQ3JlYXRlIHRoZSBkaXJlY3RvcnkgaWYgbmVjZXNzYXJ5CisgICAgICAgIEZpbGUgZGlyID0gbmV3IEZpbGUoZGlyZWN0b3J5KTsKKyAgICAgICAgaWYgKCFkaXIuaXNBYnNvbHV0ZSgpKQorICAgICAgICAgICAgZGlyID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJjYXRhbGluYS5iYXNlIiksIGRpcmVjdG9yeSk7CisgICAgICAgIGRpci5ta2RpcnMoKTsKKworICAgICAgICAvLyBPcGVuIHRoZSBjdXJyZW50IGxvZyBmaWxlCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTdHJpbmcgcGF0aG5hbWU7CisKKyAgICAgICAgICAgIC8vIElmIG5vIHJvdGF0ZSAtIG5vIG5lZWQgZm9yIGRhdGVTdGFtcCBpbiBmaWxlTmFtZQorICAgICAgICAgICAgaWYgKHJvdGF0YWJsZSl7CisgICAgICAgICAgICAgICAgcGF0aG5hbWUgPSBkaXIuZ2V0QWJzb2x1dGVQYXRoKCkgKyBGaWxlLnNlcGFyYXRvciArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ICsgZGF0ZVN0YW1wICsgc3VmZml4OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwYXRobmFtZSA9IGRpci5nZXRBYnNvbHV0ZVBhdGgoKSArIEZpbGUuc2VwYXJhdG9yICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggKyBzdWZmaXg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGN1cnJlbnRMb2dGaWxlID0gbmV3IEZpbGUocGF0aG5hbWUpOworICAgICAgICAgICAgd3JpdGVyID0gbmV3IFByaW50V3JpdGVyKG5ldyBGaWxlV3JpdGVyKHBhdGhuYW1lLCB0cnVlKSwgdHJ1ZSk7CisgICAgICAgICAgICBpZiAoY3VycmVudExvZ0ZpbGUubGVuZ3RoKCk9PTApIHsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiI0ZpZWxkczogIiArIHBhdHRlcm4pOworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCIjVmVyc2lvbjogMS4wIik7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIiNTb2Z0d2FyZTogIiArIFNlcnZlckluZm8uZ2V0U2VydmVySW5mbygpKTsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHdyaXRlciA9IG51bGw7CisgICAgICAgICAgICBjdXJyZW50TG9nRmlsZSA9IG51bGw7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBhIERhdGUgb2JqZWN0IHRoYXQgaXMgYWNjdXJhdGUgdG8gd2l0aGluIG9uZQorICAgICAqIHNlY29uZC4gIElmIGEgdGhyZWFkIGNhbGxzIHRoaXMgbWV0aG9kIHRvIGdldCBhIERhdGUgYW5kIGl0J3MgYmVlbgorICAgICAqIGxlc3MgdGhhbiAxIHNlY29uZCBzaW5jZSBhIG5ldyBEYXRlIHdhcyBjcmVhdGVkLCB0aGlzIG1ldGhvZAorICAgICAqIHNpbXBseSBnaXZlcyBvdXQgdGhlIHNhbWUgRGF0ZSBhZ2FpbiBzbyB0aGF0IHRoZSBzeXN0ZW0gZG9lc24ndAorICAgICAqIHNwZW5kIHRpbWUgY3JlYXRpbmcgRGF0ZSBvYmplY3RzIHVubmVjZXNzYXJpbHkuCisgICAgICovCisgICAgcHJpdmF0ZSBEYXRlIGdldERhdGUobG9uZyBzeXN0aW1lKSB7CisgICAgICAgIC8qIEF2b2lkIGV4dHJhIGNhbGwgdG8gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7ICovCisgICAgICAgIGlmICgwPT1zeXN0aW1lKSB7CisgICAgICAgICAgICBzeXN0aW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBPbmx5IGNyZWF0ZSBhIG5ldyBEYXRlIG9uY2UgcGVyIHNlY29uZCwgbWF4LgorICAgICAgICBpZiAoKHN5c3RpbWUgLSBjdXJyZW50RGF0ZS5nZXRUaW1lKCkpID4gMTAwMCkgeworICAgICAgICAgICAgY3VycmVudERhdGUuc2V0VGltZShzeXN0aW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBjdXJyZW50RGF0ZTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIExpZmVjeWNsZSBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIEFkZCBhIGxpZmVjeWNsZSBldmVudCBsaXN0ZW5lciB0byB0aGlzIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgdG8gYWRkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkTGlmZWN5Y2xlTGlzdGVuZXIoTGlmZWN5Y2xlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKworICAgICAgICBsaWZlY3ljbGUuYWRkTGlmZWN5Y2xlTGlzdGVuZXIobGlzdGVuZXIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGxpZmVjeWNsZSBsaXN0ZW5lcnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbGlmZWN5Y2xlLiBJZiB0aGlzCisgICAgICogTGlmZWN5Y2xlIGhhcyBubyBsaXN0ZW5lcnMgcmVnaXN0ZXJlZCwgYSB6ZXJvLWxlbmd0aCBhcnJheSBpcyByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlmZWN5Y2xlTGlzdGVuZXJbXSBmaW5kTGlmZWN5Y2xlTGlzdGVuZXJzKCkgeworCisgICAgICAgIHJldHVybiBsaWZlY3ljbGUuZmluZExpZmVjeWNsZUxpc3RlbmVycygpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSBsaWZlY3ljbGUgZXZlbnQgbGlzdGVuZXIgZnJvbSB0aGlzIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgdG8gYWRkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlTGlmZWN5Y2xlTGlzdGVuZXIoTGlmZWN5Y2xlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKworICAgICAgICBsaWZlY3ljbGUucmVtb3ZlTGlmZWN5Y2xlTGlzdGVuZXIobGlzdGVuZXIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBQcmVwYXJlIGZvciB0aGUgYmVnaW5uaW5nIG9mIGFjdGl2ZSB1c2Ugb2YgdGhlIHB1YmxpYyBtZXRob2RzIG9mIHRoaXMKKyAgICAgKiBjb21wb25lbnQuICBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIDxjb2RlPmNvbmZpZ3VyZSgpPC9jb2RlPiwKKyAgICAgKiBhbmQgYmVmb3JlIGFueSBvZiB0aGUgcHVibGljIG1ldGhvZHMgb2YgdGhlIGNvbXBvbmVudCBhcmUgdXRpbGl6ZWQuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIExpZmVjeWNsZUV4Y2VwdGlvbiBpZiB0aGlzIGNvbXBvbmVudCBkZXRlY3RzIGEgZmF0YWwgZXJyb3IKKyAgICAgKiAgdGhhdCBwcmV2ZW50cyB0aGlzIGNvbXBvbmVudCBmcm9tIGJlaW5nIHVzZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb24geworCisgICAgICAgIC8vIFZhbGlkYXRlIGFuZCB1cGRhdGUgb3VyIGN1cnJlbnQgY29tcG9uZW50IHN0YXRlCisgICAgICAgIGlmIChzdGFydGVkKQorICAgICAgICAgICAgdGhyb3cgbmV3IExpZmVjeWNsZUV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoImV4dGVuZGVkQWNjZXNzTG9nVmFsdmUuYWxyZWFkeVN0YXJ0ZWQiKSk7CisgICAgICAgIGxpZmVjeWNsZS5maXJlTGlmZWN5Y2xlRXZlbnQoU1RBUlRfRVZFTlQsIG51bGwpOworICAgICAgICBzdGFydGVkID0gdHJ1ZTsKKworICAgICAgICAvLyBJbml0aWFsaXplIHRoZSB0aW1lWm9uZSwgRGF0ZSBmb3JtYXR0ZXJzLCBhbmQgY3VycmVudERhdGUKKyAgICAgICAgVGltZVpvbmUgdHogPSBUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01UIik7CisgICAgICAgIGRhdGVGb3JtYXR0ZXIgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgieXl5eS1NTS1kZCIpOworICAgICAgICBkYXRlRm9ybWF0dGVyLnNldFRpbWVab25lKHR6KTsKKyAgICAgICAgdGltZUZvcm1hdHRlciA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJISDptbTpzcyIpOworICAgICAgICB0aW1lRm9ybWF0dGVyLnNldFRpbWVab25lKHR6KTsKKyAgICAgICAgY3VycmVudERhdGUgPSBuZXcgRGF0ZShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisgICAgICAgIGlmIChmaWxlRGF0ZUZvcm1hdD09bnVsbCB8fCBmaWxlRGF0ZUZvcm1hdC5sZW5ndGgoKT09MCkKKyAgICAgICAgICAgIGZpbGVEYXRlRm9ybWF0ID0gInl5eXktTU0tZGQiOworICAgICAgICBmaWxlRGF0ZUZvcm1hdHRlciA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KGZpbGVEYXRlRm9ybWF0KTsKKyAgICAgICAgZGF0ZVN0YW1wID0gZmlsZURhdGVGb3JtYXR0ZXIuZm9ybWF0KGN1cnJlbnREYXRlKTsKKyAgICAgICAgdGltZVRha2VuRm9ybWF0dGVyID0gbmV3IERlY2ltYWxGb3JtYXQoIjAuMDAwIik7CisKKyAgICAgICAgLyogRXZlcnlib2R5IHNheSBpY2sgLi4uIGljayAqLworICAgICAgICB0cnkgeworICAgICAgICAgICAgSW5ldEFkZHJlc3MgaW5ldEFkZHJlc3MgPSBJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKTsKKyAgICAgICAgICAgIG15SXBBZGRyZXNzID0gaW5ldEFkZHJlc3MuZ2V0SG9zdEFkZHJlc3MoKTsKKyAgICAgICAgICAgIG15RE5TTmFtZSA9IGluZXRBZGRyZXNzLmdldEhvc3ROYW1lKCk7CisgICAgICAgIH0gY2F0Y2goVGhyb3dhYmxlIGUpeworICAgICAgICAgICAgbXlJcEFkZHJlc3M9IjEyNy4wLjAuMSI7CisgICAgICAgICAgICBteUROU05hbWU9ImxvY2FsaG9zdCI7CisgICAgICAgIH0KKworICAgICAgICBvcGVuKCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdyYWNlZnVsbHkgdGVybWluYXRlIHRoZSBhY3RpdmUgdXNlIG9mIHRoZSBwdWJsaWMgbWV0aG9kcyBvZiB0aGlzCisgICAgICogY29tcG9uZW50LiAgVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHRoZSBsYXN0IG9uZSBjYWxsZWQgb24gYSBnaXZlbgorICAgICAqIGluc3RhbmNlIG9mIHRoaXMgY29tcG9uZW50LgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBMaWZlY3ljbGVFeGNlcHRpb24gaWYgdGhpcyBjb21wb25lbnQgZGV0ZWN0cyBhIGZhdGFsIGVycm9yCisgICAgICogIHRoYXQgbmVlZHMgdG8gYmUgcmVwb3J0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdG9wKCkgdGhyb3dzIExpZmVjeWNsZUV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gVmFsaWRhdGUgYW5kIHVwZGF0ZSBvdXIgY3VycmVudCBjb21wb25lbnQgc3RhdGUKKyAgICAgICAgaWYgKCFzdGFydGVkKQorICAgICAgICAgICAgdGhyb3cgbmV3IExpZmVjeWNsZUV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoImV4dGVuZGVkQWNjZXNzTG9nVmFsdmUubm90U3RhcnRlZCIpKTsKKyAgICAgICAgbGlmZWN5Y2xlLmZpcmVMaWZlY3ljbGVFdmVudChTVE9QX0VWRU5ULCBudWxsKTsKKyAgICAgICAgc3RhcnRlZCA9IGZhbHNlOworCisgICAgICAgIGNsb3NlKCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIERlY29kZSB0aGUgZ2l2ZW4gcGF0dGVybi4gSXMgcHVibGljIHNvIGEgcGF0dGVybiBtYXkKKyAgICAgKiBhbGxvd3MgdG8gYmUgdmFsaWRhdGVkLgorICAgICAqIEBwYXJhbSBmaWVsZHMgVGhlIHBhdHRlcm4gdG8gZGVjb2RlCisgICAgICogQHJldHVybiBudWxsIG9uIGVycm9yLiAgT3RoZXJ3aXNlIGFycmF5IG9mIGRlY29kZWQgZmllbGRzCisgICAgICovCisgICAgcHVibGljIEZpZWxkSW5mb1tdIGRlY29kZVBhdHRlcm4oU3RyaW5nIGZpZWxkcykgeworCisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiZGVjb2RlUGF0dGVybiwgZmllbGRzPSIgKyBmaWVsZHMpOworCisgICAgICAgIExpbmtlZExpc3QgbGlzdCA9IG5ldyBMaW5rZWRMaXN0KCk7CisKKyAgICAgICAgLy9JZ25vcmUgbGVhZGluZyB3aGl0ZXNwYWNlLgorICAgICAgICBpbnQgaT0wOworICAgICAgICBmb3IgKDtpPGZpZWxkcy5sZW5ndGgoKSAmJiBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGZpZWxkcy5jaGFyQXQoaSkpO2krKyk7CisKKyAgICAgICAgaWYgKGk+PWZpZWxkcy5sZW5ndGgoKSkgeworICAgICAgICAgICAgbG9nLmluZm8oImZpZWxkcyB3YXMganVzdCBlbXB0eSBvciB3aGl0ZXNwYWNlIik7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIGludCBqOworICAgICAgICB3aGlsZShpPGZpZWxkcy5sZW5ndGgoKSkgeworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiZmllbGRzLnN1YnN0cmluZyhpKT0iICsgZmllbGRzLnN1YnN0cmluZyhpKSk7CisKKyAgICAgICAgICAgIEZpZWxkSW5mbyBjdXJyZW50RmllbGRJbmZvID0gbmV3IEZpZWxkSW5mbygpOworCisKKyAgICAgICAgICAgIGlmIChmaWVsZHMuc3RhcnRzV2l0aCgiZGF0ZSIsaSkpIHsKKyAgICAgICAgICAgICAgICBjdXJyZW50RmllbGRJbmZvLnR5cGUgPSBGaWVsZEluZm8uREFUQV9TUEVDSUFMOworICAgICAgICAgICAgICAgIGN1cnJlbnRGaWVsZEluZm8ubG9jYXRpb24gPSBGaWVsZEluZm8uU1BFQ0lBTF9EQVRFOworICAgICAgICAgICAgICAgIGkrPSJkYXRlIi5sZW5ndGgoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGRzLnN0YXJ0c1dpdGgoInRpbWUtdGFrZW4iLGkpKSB7CisgICAgICAgICAgICAgICAgY3VycmVudEZpZWxkSW5mby50eXBlID0gRmllbGRJbmZvLkRBVEFfU1BFQ0lBTDsKKyAgICAgICAgICAgICAgICBjdXJyZW50RmllbGRJbmZvLmxvY2F0aW9uID0gRmllbGRJbmZvLlNQRUNJQUxfVElNRV9UQUtFTjsKKyAgICAgICAgICAgICAgICBpKz0idGltZS10YWtlbiIubGVuZ3RoKCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGZpZWxkcy5zdGFydHNXaXRoKCJ0aW1lIixpKSkgeworICAgICAgICAgICAgICAgIGN1cnJlbnRGaWVsZEluZm8udHlwZSA9IEZpZWxkSW5mby5EQVRBX1NQRUNJQUw7CisgICAgICAgICAgICAgICAgY3VycmVudEZpZWxkSW5mby5sb2NhdGlvbiA9IEZpZWxkSW5mby5TUEVDSUFMX1RJTUU7CisgICAgICAgICAgICAgICAgaSs9InRpbWUiLmxlbmd0aCgpOworICAgICAgICAgICAgfSBlbHNlIGlmIChmaWVsZHMuc3RhcnRzV2l0aCgiYnl0ZXMiLGkpKSB7CisgICAgICAgICAgICAgICAgY3VycmVudEZpZWxkSW5mby50eXBlID0gRmllbGRJbmZvLkRBVEFfU1BFQ0lBTDsKKyAgICAgICAgICAgICAgICBjdXJyZW50RmllbGRJbmZvLmxvY2F0aW9uID0gRmllbGRJbmZvLlNQRUNJQUxfQllURVM7CisgICAgICAgICAgICAgICAgaSs9ImJ5dGVzIi5sZW5ndGgoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGRzLnN0YXJ0c1dpdGgoImNhY2hlZCIsaSkpIHsKKyAgICAgICAgICAgICAgICBjdXJyZW50RmllbGRJbmZvLnR5cGUgPSBGaWVsZEluZm8uREFUQV9TUEVDSUFMOworICAgICAgICAgICAgICAgIGN1cnJlbnRGaWVsZEluZm8ubG9jYXRpb24gPSBGaWVsZEluZm8uU1BFQ0lBTF9DQUNIRUQ7CisgICAgICAgICAgICAgICAgaSs9ImNhY2hlZCIubGVuZ3RoKCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGZpZWxkcy5zdGFydHNXaXRoKCJjLWlwIixpKSkgeworICAgICAgICAgICAgICAgIGN1cnJlbnRGaWVsZEluZm8udHlwZSA9IEZpZWxkSW5mby5EQVRBX0NMSUVOVDsKKyAgICAgICAgICAgICAgICBjdXJyZW50RmllbGRJbmZvLmxvY2F0aW9uID0gRmllbGRJbmZvLkZJRUxEX0lQOworICAgICAgICAgICAgICAgIGkrPSJjLWlwIi5sZW5ndGgoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGRzLnN0YXJ0c1dpdGgoImMtZG5zIixpKSkgeworICAgICAgICAgICAgICAgIGN1cnJlbnRGaWVsZEluZm8udHlwZSA9IEZpZWxkSW5mby5EQVRBX0NMSUVOVDsKKyAgICAgICAgICAgICAgICBjdXJyZW50RmllbGRJbmZvLmxvY2F0aW9uID0gRmllbGRJbmZvLkZJRUxEX0ROUzsKKyAgICAgICAgICAgICAgICBpKz0iYy1kbnMiLmxlbmd0aCgpOworICAgICAgICAgICAgfSBlbHNlIGlmIChmaWVsZHMuc3RhcnRzV2l0aCgicy1pcCIsaSkpIHsKKyAgICAgICAgICAgICAgICBjdXJyZW50RmllbGRJbmZvLnR5cGUgPSBGaWVsZEluZm8uREFUQV9TRVJWRVI7CisgICAgICAgICAgICAgICAgY3VycmVudEZpZWxkSW5mby5sb2NhdGlvbiA9IEZpZWxkSW5mby5GSUVMRF9JUDsKKyAgICAgICAgICAgICAgICBpKz0icy1pcCIubGVuZ3RoKCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGZpZWxkcy5zdGFydHNXaXRoKCJzLWRucyIsaSkpIHsKKyAgICAgICAgICAgICAgICBjdXJyZW50RmllbGRJbmZvLnR5cGUgPSBGaWVsZEluZm8uREFUQV9TRVJWRVI7CisgICAgICAgICAgICAgICAgY3VycmVudEZpZWxkSW5mby5sb2NhdGlvbiA9IEZpZWxkSW5mby5GSUVMRF9ETlM7CisgICAgICAgICAgICAgICAgaSs9InMtZG5zIi5sZW5ndGgoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGRzLnN0YXJ0c1dpdGgoImNzIixpKSkgeworICAgICAgICAgICAgICAgIGkgPSBkZWNvZGUoZmllbGRzLCBpKzIsIGN1cnJlbnRGaWVsZEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRJbmZvLkRBVEFfQ0xJRU5UX1RPX1NFUlZFUik7CisgICAgICAgICAgICAgICAgaWYgKGk8MCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGZpZWxkcy5zdGFydHNXaXRoKCJzYyIsaSkpIHsKKyAgICAgICAgICAgICAgICBpID0gZGVjb2RlKGZpZWxkcywgaSsyLCBjdXJyZW50RmllbGRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkSW5mby5EQVRBX1NFUlZFUl9UT19DTElFTlQpOworICAgICAgICAgICAgICAgIGlmIChpPDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfSBlbHNlIGlmIChmaWVsZHMuc3RhcnRzV2l0aCgic3IiLGkpKSB7CisgICAgICAgICAgICAgICAgaSA9IGRlY29kZShmaWVsZHMsIGkrMiwgY3VycmVudEZpZWxkSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZEluZm8uREFUQV9TRVJWRVJfVE9fUlNFUlZFUik7CisgICAgICAgICAgICAgICAgaWYgKGk8MCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGZpZWxkcy5zdGFydHNXaXRoKCJycyIsaSkpIHsKKyAgICAgICAgICAgICAgICBpID0gZGVjb2RlKGZpZWxkcywgaSsyLCBjdXJyZW50RmllbGRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkSW5mby5EQVRBX1JTRVJWRVJfVE9fU0VSVkVSKTsKKyAgICAgICAgICAgICAgICBpZiAoaTwwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGRzLnN0YXJ0c1dpdGgoIngiLGkpKSB7CisgICAgICAgICAgICAgICAgaSA9IGRlY29kZUFwcFNwZWNpZmljKGZpZWxkcywgaSwgY3VycmVudEZpZWxkSW5mbyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFVuYWJsZSB0byBkZWNvZGUgLi4uCisgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJ1bmFibGUgdG8gZGVjb2RlIHdpdGggcmVzdCBvZiBjaGFycyBiZWluZzogIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRzLnN1YnN0cmluZyhpKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEJ5IHRoaXMgcG9pbnQgd2Ugc2hvdWxkIGhhdmUgdGhlIGZpZWxkLCBnZXQgdGhlIHdoaXRlc3BhY2UKKyAgICAgICAgICAgIGo9aTsKKyAgICAgICAgICAgIGZvciAoO2o8ZmllbGRzLmxlbmd0aCgpICYmIENoYXJhY3Rlci5pc1doaXRlc3BhY2UoZmllbGRzLmNoYXJBdChqKSk7aisrKTsKKworICAgICAgICAgICAgaWYgKGo+PWZpZWxkcy5sZW5ndGgoKSkgeworICAgICAgICAgICAgICAgIGlmIChqPT1pKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFNwZWNpYWwgY2FzZSAtIGVuZCBvZiBzdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudEZpZWxkSW5mby5wb3N0V2hpdGVTcGFjZSA9ICIiOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRGaWVsZEluZm8ucG9zdFdoaXRlU3BhY2UgPSBmaWVsZHMuc3Vic3RyaW5nKGkpOworICAgICAgICAgICAgICAgICAgICBpPWo7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjdXJyZW50RmllbGRJbmZvLnBvc3RXaGl0ZVNwYWNlID0gZmllbGRzLnN1YnN0cmluZyhpLGopOworICAgICAgICAgICAgICAgIGk9ajsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbGlzdC5hZGQoY3VycmVudEZpZWxkSW5mbyk7CisgICAgICAgIH0KKworICAgICAgICBpPTA7CisgICAgICAgIEZpZWxkSW5mb1tdIGYgPSBuZXcgRmllbGRJbmZvW2xpc3Quc2l6ZSgpXTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBrID0gbGlzdC5pdGVyYXRvcigpOyBrLmhhc05leHQoKTspCisgICAgICAgICAgICAgZltpKytdID0gKEZpZWxkSW5mbylrLm5leHQoKTsKKworICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoImZpbmlzaGVkIGRlY29kaW5nIHdpdGggbGVuZ3RoIG9mOiAiICsgaSk7CisKKyAgICAgICAgcmV0dXJuIGY7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVjb2RlIHRoZSBjcyBvciBzYyBmaWVsZHMuCisgICAgICogUmV0dXJucyBuZWdhdGl2ZSBvbiBlcnJvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWVsZHMgVGhlIHBhdHRlcm4gdG8gZGVjb2RlCisgICAgICogQHBhcmFtIGkgVGhlIHN0cmluZyBpbmRleCB3aGVyZSB3ZSBhcmUgZGVjb2RpbmcuCisgICAgICogQHBhcmFtIGZpZWxkSW5mbyBXaGVyZSB0byBzdG9yZSB0aGUgcmVzdWx0cworICAgICAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIHdlIGFyZSBkZWNvZGluZy4KKyAgICAgKiBAcmV0dXJuIC0xIG9uIGVycm9yLiBPdGhlcndpc2UgdGhlIG5ldyBTdHJpbmcgaW5kZXguCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgZGVjb2RlKFN0cmluZyBmaWVsZHMsIGludCBpLCBGaWVsZEluZm8gZmllbGRJbmZvLCBzaG9ydCB0eXBlKSB7CisKKyAgICAgICAgaWYgKGZpZWxkcy5zdGFydHNXaXRoKCItc3RhdHVzIixpKSkgeworICAgICAgICAgICAgZmllbGRJbmZvLmxvY2F0aW9uID0gRmllbGRJbmZvLkZJRUxEX1NUQVRVUzsKKyAgICAgICAgICAgIGkrPSItc3RhdHVzIi5sZW5ndGgoKTsKKyAgICAgICAgfSBlbHNlIGlmIChmaWVsZHMuc3RhcnRzV2l0aCgiLWNvbW1lbnQiLGkpKSB7CisgICAgICAgICAgICBmaWVsZEluZm8ubG9jYXRpb24gPSBGaWVsZEluZm8uRklFTERfQ09NTUVOVDsKKyAgICAgICAgICAgIGkrPSItY29tbWVudCIubGVuZ3RoKCk7CisgICAgICAgIH0gZWxzZSBpZiAoZmllbGRzLnN0YXJ0c1dpdGgoIi11cmktcXVlcnkiLGkpKSB7CisgICAgICAgICAgICBmaWVsZEluZm8ubG9jYXRpb24gPSBGaWVsZEluZm8uRklFTERfVVJJX1FVRVJZOworICAgICAgICAgICAgaSs9Ii11cmktcXVlcnkiLmxlbmd0aCgpOworICAgICAgICB9IGVsc2UgaWYgKGZpZWxkcy5zdGFydHNXaXRoKCItdXJpLXN0ZW0iLGkpKSB7CisgICAgICAgICAgICBmaWVsZEluZm8ubG9jYXRpb24gPSBGaWVsZEluZm8uRklFTERfVVJJX1NURU07CisgICAgICAgICAgICBpKz0iLXVyaS1zdGVtIi5sZW5ndGgoKTsKKyAgICAgICAgfSBlbHNlIGlmIChmaWVsZHMuc3RhcnRzV2l0aCgiLXVyaSIsaSkpIHsKKyAgICAgICAgICAgIGZpZWxkSW5mby5sb2NhdGlvbiA9IEZpZWxkSW5mby5GSUVMRF9VUkk7CisgICAgICAgICAgICBpKz0iLXVyaSIubGVuZ3RoKCk7CisgICAgICAgIH0gZWxzZSBpZiAoZmllbGRzLnN0YXJ0c1dpdGgoIi1tZXRob2QiLGkpKSB7CisgICAgICAgICAgICBmaWVsZEluZm8ubG9jYXRpb24gPSBGaWVsZEluZm8uRklFTERfTUVUSE9EOworICAgICAgICAgICAgaSs9Ii1tZXRob2QiLmxlbmd0aCgpOworICAgICAgICB9IGVsc2UgaWYgKGZpZWxkcy5zdGFydHNXaXRoKCIoIixpKSkgeworICAgICAgICAgICAgZmllbGRJbmZvLmxvY2F0aW9uID0gRmllbGRJbmZvLkZJRUxEX0hFQURFUjsKKyAgICAgICAgICAgIGkrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTW92ZSBwYXN0IHRoZSAoICovCisgICAgICAgICAgICBpbnQgaiA9IGZpZWxkcy5pbmRleE9mKCcpJywgaSk7CisgICAgICAgICAgICBpZiAoaj09LTEpIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5vdCBmb3VuZCAqLworICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiTm8gY2xvc2luZyApIGZvdW5kIGZvciBpbiBkZWNvZGUiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaWVsZEluZm8udmFsdWUgPSBmaWVsZHMuc3Vic3RyaW5nKGksaik7CisgICAgICAgICAgICBpPWorMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1vdmUgcG9pbnRlciBwYXN0ICkgKi8KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcigiVGhlIG5leHQgY2hhcmFjdGVycyBjb3VsZG4ndCBiZSBkZWNvZGVkOiAiICsgZmllbGRzLnN1YnN0cmluZyhpKSk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBmaWVsZEluZm8udHlwZSA9IHR5cGU7CisgICAgICAgIHJldHVybiBpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgICogRGVjb2RlIGFwcCBzcGVjaWZpYyBsb2cgZW50cnkuCisgICAgICAqCisgICAgICAqIFNwZWNpYWwgZmllbGRzIGFyZSBvZiB0aGUgZm9ybToKKyAgICAgICogeC1DKC4uLikgLSBGb3IgY29va2llCisgICAgICAqIHgtQSguLi4pIC0gVmFsdWUgaW4gc2VydmxldENvbnRleHQKKyAgICAgICogeC1TKC4uLikgLSBWYWx1ZSBpbiBzZXNzaW9uCisgICAgICAqIHgtUiguLi4pIC0gVmFsdWUgaW4gc2VydmxldFJlcXVlc3QKKyAgICAgICogQHBhcmFtIGZpZWxkcyBUaGUgcGF0dGVybiB0byBkZWNvZGUKKyAgICAgICogQHBhcmFtIGkgVGhlIHN0cmluZyBpbmRleCB3aGVyZSB3ZSBhcmUgZGVjb2RpbmcuCisgICAgICAqIEBwYXJhbSBmaWVsZEluZm8gV2hlcmUgdG8gc3RvcmUgdGhlIHJlc3VsdHMKKyAgICAgICogQHJldHVybiAtMSBvbiBlcnJvci4gT3RoZXJ3aXNlIHRoZSBuZXcgU3RyaW5nIGluZGV4LgorICAgICAgKi8KKyAgICBwcml2YXRlIGludCBkZWNvZGVBcHBTcGVjaWZpYyhTdHJpbmcgZmllbGRzLCBpbnQgaSwgRmllbGRJbmZvIGZpZWxkSW5mbykgeworCisgICAgICAgIGZpZWxkSW5mby50eXBlID0gRmllbGRJbmZvLkRBVEFfQVBQX1NQRUNJRklDOworICAgICAgICAvKiBNb3ZlIHBhc3QgJ3gtJyAqLworICAgICAgICBpKz0yOworCisgICAgICAgIGlmIChpPj1maWVsZHMubGVuZ3RoKCkpIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcigiRW5kIG9mIGxpbmUgcmVhY2hlZCBiZWZvcmUgZGVjb2RpbmcgeC0gcGFyYW0iKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaChmaWVsZHMuY2hhckF0KGkpKSB7CisgICAgICAgICAgICBjYXNlICdBJzoKKyAgICAgICAgICAgICAgICBmaWVsZEluZm8ueFR5cGUgPSBGaWVsZEluZm8uWF9BUFA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdDJzoKKyAgICAgICAgICAgICAgICBmaWVsZEluZm8ueFR5cGUgPSBGaWVsZEluZm8uWF9DT09LSUU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdSJzoKKyAgICAgICAgICAgICAgICBmaWVsZEluZm8ueFR5cGUgPSBGaWVsZEluZm8uWF9SRVFVRVNUOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnUyc6CisgICAgICAgICAgICAgICAgZmllbGRJbmZvLnhUeXBlID0gRmllbGRJbmZvLlhfU0VTU0lPTjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ0gnOgorICAgICAgICAgICAgICAgIGZpZWxkSW5mby54VHlwZSA9IEZpZWxkSW5mby5YX1NFUlZMRVRfUkVRVUVTVDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ1AnOgorICAgICAgICAgICAgICAgIGZpZWxkSW5mby54VHlwZSA9IEZpZWxkSW5mby5YX1BBUkFNRVRFUjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgLyogdGVzdCB0aGF0IG5leHQgY2hhciBpcyBhICggKi8KKyAgICAgICAgaWYgKGkrMSE9ZmllbGRzLmluZGV4T2YoJygnLGkpKSB7CisgICAgICAgICAgICBsb2cuZXJyb3IoInggcGFyYW0gaW4gd3JvbmcgZm9ybWF0LiBOZWVkcyB0byBiZSAneC0jKC4uLiknIHJlYWQgdGhlIGRvY3MhIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaSs9MjsgLyogTW92ZSBpbnNpZGUgb2YgdGhlICgpICovCisKKyAgICAgICAgLyogTG9vayBmb3IgZW5kaW5nICkgYW5kIHJldHVybiBlcnJvciBpZiBub3QgZm91bmQuICovCisgICAgICAgIGludCBqID0gZmllbGRzLmluZGV4T2YoJyknLGkpOworICAgICAgICBpZiAoaj09LTEpIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcigieCBwYXJhbSBpbiB3cm9uZyBmb3JtYXQuIE5vIGNsb3NpbmcgJyknISIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgZmllbGRJbmZvLnZhbHVlID0gZmllbGRzLnN1YnN0cmluZyhpLGopOworCisgICAgICAgIGlmIChmaWVsZEluZm8ueFR5cGUgPT0gRmllbGRJbmZvLlhfU0VSVkxFVF9SRVFVRVNUKSB7CisgICAgICAgICAgICBpZiAoImF1dGhUeXBlIi5lcXVhbHMoZmllbGRJbmZvLnZhbHVlKSl7CisgICAgICAgICAgICAgICAgZmllbGRJbmZvLmxvY2F0aW9uID0gRmllbGRJbmZvLlhfTE9DX0FVVEhUWVBFOworICAgICAgICAgICAgfSBlbHNlIGlmICgicmVtb3RlVXNlciIuZXF1YWxzKGZpZWxkSW5mby52YWx1ZSkpeworICAgICAgICAgICAgICAgIGZpZWxkSW5mby5sb2NhdGlvbiA9IEZpZWxkSW5mby5YX0xPQ19SRU1PVEVVU0VSOworICAgICAgICAgICAgfSBlbHNlIGlmICgicmVxdWVzdGVkU2Vzc2lvbklkIi5lcXVhbHMoZmllbGRJbmZvLnZhbHVlKSl7CisgICAgICAgICAgICAgICAgZmllbGRJbmZvLmxvY2F0aW9uID0gRmllbGRJbmZvLlhfTE9DX1JFUVVFU1RFRFNFU1NJT05JRDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoInJlcXVlc3RlZFNlc3Npb25JZEZyb21Db29raWUiLmVxdWFscyhmaWVsZEluZm8udmFsdWUpKXsKKyAgICAgICAgICAgICAgICBmaWVsZEluZm8ubG9jYXRpb24gPSBGaWVsZEluZm8uWF9MT0NfUkVRVUVTVEVEU0VTU0lPTklERlJPTUNPT0tJRTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoInJlcXVlc3RlZFNlc3Npb25JZFZhbGlkIi5lcXVhbHMoZmllbGRJbmZvLnZhbHVlKSl7CisgICAgICAgICAgICAgICAgZmllbGRJbmZvLmxvY2F0aW9uID0gRmllbGRJbmZvLlhfTE9DX1JFUVVFU1RFRFNFU1NJT05JRFZBTElEOworICAgICAgICAgICAgfSBlbHNlIGlmICgiY29udGVudExlbmd0aCIuZXF1YWxzKGZpZWxkSW5mby52YWx1ZSkpeworICAgICAgICAgICAgICAgIGZpZWxkSW5mby5sb2NhdGlvbiA9IEZpZWxkSW5mby5YX0xPQ19DT05URU5UTEVOR1RIOworICAgICAgICAgICAgfSBlbHNlIGlmICgiY2hhcmFjdGVyRW5jb2RpbmciLmVxdWFscyhmaWVsZEluZm8udmFsdWUpKXsKKyAgICAgICAgICAgICAgICBmaWVsZEluZm8ubG9jYXRpb24gPSBGaWVsZEluZm8uWF9MT0NfQ0hBUkFDVEVSRU5DT0RJTkc7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCJsb2NhbGUiLmVxdWFscyhmaWVsZEluZm8udmFsdWUpKXsKKyAgICAgICAgICAgICAgICBmaWVsZEluZm8ubG9jYXRpb24gPSBGaWVsZEluZm8uWF9MT0NfTE9DQUxFOworICAgICAgICAgICAgfSBlbHNlIGlmICgicHJvdG9jb2wiLmVxdWFscyhmaWVsZEluZm8udmFsdWUpKXsKKyAgICAgICAgICAgICAgICBmaWVsZEluZm8ubG9jYXRpb24gPSBGaWVsZEluZm8uWF9MT0NfUFJPVE9DT0w7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCJzY2hlbWUiLmVxdWFscyhmaWVsZEluZm8udmFsdWUpKXsKKyAgICAgICAgICAgICAgICBmaWVsZEluZm8ubG9jYXRpb24gPSBGaWVsZEluZm8uWF9MT0NfU0NIRU1FOworICAgICAgICAgICAgfSBlbHNlIGlmICgic2VjdXJlIi5lcXVhbHMoZmllbGRJbmZvLnZhbHVlKSl7CisgICAgICAgICAgICAgICAgZmllbGRJbmZvLmxvY2F0aW9uID0gRmllbGRJbmZvLlhfTE9DX1NFQ1VSRTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJ4IHBhcmFtIGZvciBzZXJ2bGV0IHJlcXVlc3QsIGNvdWxkbid0IGRlY29kZSB2YWx1ZTogIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRJbmZvLmxvY2F0aW9uKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gaisxOworCisgICAgfQorCisKK30KKworLyoqCisgKiBBIHNpbXBsZSBoZWxwZXIgZm9yIGRlY29kaW5nIHRoZSBwYXR0ZXJuLgorICovCitjbGFzcyBGaWVsZEluZm8geworICAgIC8qCisgICAgICAgVGhlIGdvYWwgb2YgdGhlIGNvbnN0YW50cyBsaXN0ZWQgYmVsb3cgaXMgdG8gbWFrZSB0aGUgY29uc3RydWN0aW9uIG9mIHRoZSBsb2cKKyAgICAgICBlbnRyeSBhcyBxdWljayBhcyBwb3NzaWJsZSB2aWEgbnVtZXJjaSBkZWNvZGluZ3Mgb2YgdGhlIG1ldGhvZHMgdG8gY2FsbCBpbnN0ZWFkCisgICAgICAgb2YgcGVyZm9ybWluZyBtYW55IFN0cmluZyBjb21wYXJpc29ucyBvbiBlYWNoIGxvZ2dpbmcgcmVxdWVzdC4KKyAgICAqLworCisgICAgLyogV2hlcmUgdGhlIGRhdGEgaXMgbG9jYXRlZC4gKi8KKyAgICBzdGF0aWMgZmluYWwgc2hvcnQgREFUQV9DTElFTlQgPSAwOworICAgIHN0YXRpYyBmaW5hbCBzaG9ydCBEQVRBX1NFUlZFUiA9IDE7CisgICAgc3RhdGljIGZpbmFsIHNob3J0IERBVEFfUkVNT1RFID0gMjsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnQgREFUQV9DTElFTlRfVE9fU0VSVkVSID0gMzsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnQgREFUQV9TRVJWRVJfVE9fQ0xJRU5UID0gNDsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnQgREFUQV9TRVJWRVJfVE9fUlNFUlZFUiA9IDU7IC8qIEhlcmUgdG8gaG9ub3IgdGhlIHNwZWMuICovCisgICAgc3RhdGljIGZpbmFsIHNob3J0IERBVEFfUlNFUlZFUl9UT19TRVJWRVIgPSA2OyAvKiBIZXJlIHRvIGhvbm9yIHRoZSBzcGVjLiAqLworICAgIHN0YXRpYyBmaW5hbCBzaG9ydCBEQVRBX0FQUF9TUEVDSUZJQyA9IDc7CisgICAgc3RhdGljIGZpbmFsIHNob3J0IERBVEFfU1BFQ0lBTCA9IDg7CisKKyAgICAvKiBUaGUgdHlwZSBvZiBzcGVjaWFsIGZpZWxkcy4gKi8KKyAgICBzdGF0aWMgZmluYWwgc2hvcnQgU1BFQ0lBTF9EQVRFICAgICAgICAgPSAxOworICAgIHN0YXRpYyBmaW5hbCBzaG9ydCBTUEVDSUFMX1RJTUVfVEFLRU4gICA9IDI7CisgICAgc3RhdGljIGZpbmFsIHNob3J0IFNQRUNJQUxfVElNRSAgICAgICAgID0gMzsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnQgU1BFQ0lBTF9CWVRFUyAgICAgICAgPSA0OworICAgIHN0YXRpYyBmaW5hbCBzaG9ydCBTUEVDSUFMX0NBQ0hFRCAgICAgICA9IDU7CisKKyAgICAvKiBXaGVyZSB0byBwdWxsIHRoZSBkYXRhIGZvciBwcmVmaXhlZCB2YWx1ZXMgKi8KKyAgICBzdGF0aWMgZmluYWwgc2hvcnQgRklFTERfSVAgICAgICAgICAgICA9IDE7CisgICAgc3RhdGljIGZpbmFsIHNob3J0IEZJRUxEX0ROUyAgICAgICAgICAgPSAyOworICAgIHN0YXRpYyBmaW5hbCBzaG9ydCBGSUVMRF9TVEFUVVMgICAgICAgID0gMzsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnQgRklFTERfQ09NTUVOVCAgICAgICA9IDQ7CisgICAgc3RhdGljIGZpbmFsIHNob3J0IEZJRUxEX01FVEhPRCAgICAgICAgPSA1OworICAgIHN0YXRpYyBmaW5hbCBzaG9ydCBGSUVMRF9VUkkgICAgICAgICAgID0gNjsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnQgRklFTERfVVJJX1NURU0gICAgICA9IDc7CisgICAgc3RhdGljIGZpbmFsIHNob3J0IEZJRUxEX1VSSV9RVUVSWSAgICAgPSA4OworICAgIHN0YXRpYyBmaW5hbCBzaG9ydCBGSUVMRF9IRUFERVIgICAgICAgID0gOTsKKworCisgICAgLyogQXBwbGljYXRpb24gU3BlY2lmaWMgcGFyYW1ldGVycyAqLworICAgIHN0YXRpYyBmaW5hbCBzaG9ydCBYX1JFUVVFU1QgPSAxOyAvKiBGb3IgeCBhcHAgc3BlY2lmaWMgKi8KKyAgICBzdGF0aWMgZmluYWwgc2hvcnQgWF9TRVNTSU9OID0gMjsgLyogRm9yIHggYXBwIHNwZWNpZmljICovCisgICAgc3RhdGljIGZpbmFsIHNob3J0IFhfQ09PS0lFICA9IDM7IC8qIEZvciB4IGFwcCBzcGVjaWZpYyAqLworICAgIHN0YXRpYyBmaW5hbCBzaG9ydCBYX0FQUCAgICAgPSA0OyAvKiBGb3IgeCBhcHAgc3BlY2lmaWMgKi8KKyAgICBzdGF0aWMgZmluYWwgc2hvcnQgWF9TRVJWTEVUX1JFUVVFU1QgPSA1OyAvKiBGb3IgeCBhcHAgc3BlY2lmaWMgKi8KKyAgICBzdGF0aWMgZmluYWwgc2hvcnQgWF9QQVJBTUVURVIgPSA2OyAvKiBGb3IgeCBhcHAgc3BlY2lmaWMgKi8KKworICAgIHN0YXRpYyBmaW5hbCBzaG9ydCBYX0xPQ19BVVRIVFlQRSAgICAgICAgICAgICAgICAgICAgICAgPSAxOworICAgIHN0YXRpYyBmaW5hbCBzaG9ydCBYX0xPQ19SRU1PVEVVU0VSICAgICAgICAgICAgICAgICAgICAgPSAyOworICAgIHN0YXRpYyBmaW5hbCBzaG9ydCBYX0xPQ19SRVFVRVNURURTRVNTSU9OSUQgICAgICAgICAgICAgPSAzOworICAgIHN0YXRpYyBmaW5hbCBzaG9ydCBYX0xPQ19SRVFVRVNURURTRVNTSU9OSURGUk9NQ09PS0lFICAgPSA0OworICAgIHN0YXRpYyBmaW5hbCBzaG9ydCBYX0xPQ19SRVFVRVNURURTRVNTSU9OSURWQUxJRCAgICAgICAgPSA1OworICAgIHN0YXRpYyBmaW5hbCBzaG9ydCBYX0xPQ19DT05URU5UTEVOR1RIICAgICAgICAgICAgICAgICAgPSA2OworICAgIHN0YXRpYyBmaW5hbCBzaG9ydCBYX0xPQ19DSEFSQUNURVJFTkNPRElORyAgICAgICAgICAgICAgPSA3OworICAgIHN0YXRpYyBmaW5hbCBzaG9ydCBYX0xPQ19MT0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAgPSA4OworICAgIHN0YXRpYyBmaW5hbCBzaG9ydCBYX0xPQ19QUk9UT0NPTCAgICAgICAgICAgICAgICAgICAgICAgPSA5OworICAgIHN0YXRpYyBmaW5hbCBzaG9ydCBYX0xPQ19TQ0hFTUUgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMDsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnQgWF9MT0NfU0VDVVJFICAgICAgICAgICAgICAgICAgICAgICAgID0gMTE7CisKKworCisgICAgLyoqIFRoZSBmaWVsZCB0eXBlICovCisgICAgc2hvcnQgdHlwZTsKKworICAgIC8qKiBXaGVyZSB0byBwdWxsIHRoZSBkYXRhIGZyb20/IElja3kgdmFyaWFibGUgbmFtZS4gKi8KKyAgICBzaG9ydCBsb2NhdGlvbjsKKworICAgIC8qKiBUaGUgeC0gc3BlY2lmaWMgcGxhY2UgdG8gcHVsbCB0aGUgZGF0YSBmcm9tLiAqLworICAgIHNob3J0IHhUeXBlOworCisgICAgLyoqIFRoZSBmaWVsZCB2YWx1ZSBpZiBuZWVkZWQuIE5lZWRlZCBmb3IgaGVhZGVycyBhbmQgYXBwIHNwZWNpZmljLiAqLworICAgIFN0cmluZyB2YWx1ZTsKKworICAgIC8qKiBBbnkgd2hpdGUgc3BhY2UgYWZ0ZXIgdGhpcyBmaWVsZD8gUHV0IGl0IGhlcmUuICovCisgICAgU3RyaW5nIHBvc3RXaGl0ZVNwYWNlID0gbnVsbDsKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3ZhbHZlcy9KREJDQWNjZXNzTG9nVmFsdmUuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS92YWx2ZXMvSkRCQ0FjY2Vzc0xvZ1ZhbHZlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNjMTVlOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS92YWx2ZXMvSkRCQ0FjY2Vzc0xvZ1ZhbHZlLmphdmEKQEAgLTAsMCArMSw2ODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OS0yMDAxLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS52YWx2ZXM7CisKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5zcWwuQ29ubmVjdGlvbjsKK2ltcG9ydCBqYXZhLnNxbC5Ecml2ZXI7CitpbXBvcnQgamF2YS5zcWwuUHJlcGFyZWRTdGF0ZW1lbnQ7CitpbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc3FsLlRpbWVzdGFtcDsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuUmVxdWVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3Rvci5SZXNwb25zZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuTGlmZWN5Y2xlU3VwcG9ydDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuU3RyaW5nTWFuYWdlcjsKKworLyoqCisgKiA8cD4KKyAqIFRoaXMgVG9tY2F0IGV4dGVuc2lvbiBsb2dzIHNlcnZlciBhY2Nlc3MgZGlyZWN0bHkgdG8gYSBkYXRhYmFzZSwgYW5kIGNhbiAKKyAqIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgcmVndWxhciBmaWxlLWJhc2VkIGFjY2VzcyBsb2cgaW1wbGVtZW50ZWQgaW4gCisgKiBBY2Nlc3NMb2dWYWx2ZS4KKyAqIFRvIHVzZSwgY29weSBpbnRvIHRoZSBzZXJ2ZXIvY2xhc3NlcyBkaXJlY3Rvcnkgb2YgdGhlIFRvbWNhdCBpbnN0YWxsYXRpb24KKyAqIGFuZCBjb25maWd1cmUgaW4gc2VydmVyLnhtbCBhczoKKyAqIDxwcmU+CisgKiAJCSZsdDtWYWx2ZSBjbGFzc05hbWU9IkFjY2Vzc0xvZ0RCVmFsdmUiCisgKiAgICAgICAgCWRyaXZlck5hbWU9IjxpPnlvdXJfamRiY19kcml2ZXI8L2k+IgorICogICAgICAgIAljb25uZWN0aW9uVVJMPSI8aT55b3VyX2pkYmNfdXJsPC9pPiIKKyAqICAgICAgICAJcGF0dGVybj0iY29tYmluZWQiIHJlc29sdmVIb3N0cz0iZmFsc2UiCisgKiAJCS8mZ3Q7CisgKiA8L3ByZT4KKyAqIDwvcD4KKyAqIDxwPgorICogTWFueSBwYXJhbWV0ZXJzIGNhbiBiZSBjb25maWd1cmVkLCBzdWNoIGFzIHRoZSBkYXRhYmFzZSBjb25uZWN0aW9uICh3aXRoCisgKiA8Y29kZT5kcml2ZXJOYW1lPC9jb2RlPiBhbmQgPGNvZGU+Y29ubmVjdGlvblVSTDwvY29kZT4pLAorICogdGhlIHRhYmxlIG5hbWUgKDxjb2RlPnRhYmxlTmFtZTwvY29kZT4pCisgKiBhbmQgdGhlIGZpZWxkIG5hbWVzIChjb3JyZXNwb25kaW5nIHRvIHRoZSBnZXQvc2V0IG1ldGhvZCBuYW1lcykuCisgKiBUaGUgc2FtZSBvcHRpb25zIGFzIEFjY2Vzc0xvZ1ZhbHZlIGFyZSBzdXBwb3J0ZWQsIHN1Y2ggYXMKKyAqIDxjb2RlPnJlc29sdmVIb3N0czwvY29kZT4gYW5kIDxjb2RlPnBhdHRlcm48L2NvZGU+ICgiY29tbW9uIiBvciAiY29tYmluZWQiIAorICogb25seSkuCisgKiA8L3A+CisgKiA8cD4KKyAqIFdoZW4gVG9tY2F0IGlzIHN0YXJ0ZWQsIGEgZGF0YWJhc2UgY29ubmVjdGlvbiAod2l0aCBhdXRvUmVjb25uZWN0IG9wdGlvbikKKyAqIGlzIGNyZWF0ZWQgYW5kIHVzZWQgZm9yIGFsbCB0aGUgbG9nIGFjdGl2aXR5LiBXaGVuIFRvbWNhdCBpcyBzaHV0ZG93biwgdGhlCisgKiBkYXRhYmFzZSBjb25uZWN0aW9uIGlzIGNsb3NlZC4KKyAqIFRoaXMgbG9nZ2VyIGNhbiBiZSB1c2VkIGF0IHRoZSBsZXZlbCBvZiB0aGUgRW5naW5lIGNvbnRleHQgKGJlaW5nIHNoYXJlZAorICogYnkgYWxsIHRoZSBkZWZpbmVkIGhvc3RzKSBvciB0aGUgSG9zdCBjb250ZXh0IChvbmUgaW5zdGFuY2Ugb2YgdGhlIGxvZ2dlciAKKyAqIHBlciBob3N0LCBwb3NzaWJseSB1c2luZyBkaWZmZXJlbnQgZGF0YWJhc2VzKS4KKyAqIDwvcD4KKyAqIDxwPgorICogVGhlIGRhdGFiYXNlIHRhYmxlIGNhbiBiZSBjcmVhdGVkIHdpdGggdGhlIGZvbGxvd2luZyBjb21tYW5kOgorICogPC9wPgorICogPHByZT4KKyAqIENSRUFURSBUQUJMRSBhY2Nlc3MgKAorICogaWQgSU5UIFVOU0lHTkVEIEFVVE9fSU5DUkVNRU5UIE5PVCBOVUxMLAorICogdHMgVElNRVNUQU1QIE5PVCBOVUxMLAorICogcmVtb3RlSG9zdCBDSEFSKDE1KSBOT1QgTlVMTCwKKyAqIHVzZXIgQ0hBUigxNSksCisgKiB0aW1lc3RhbXAgVElNRVNUQU1QIE5PVCBOVUxMLAorICogdmlydHVhbEhvc3QgVkFSQ0hBUig2NCkgTk9UIE5VTEwsCisgKiBtZXRob2QgVkFSQ0hBUig4KSBOT1QgTlVMTCwKKyAqIHF1ZXJ5IFZBUkNIQVIoMjU1KSBOT1QgTlVMTCwKKyAqIHN0YXR1cyBTTUFMTElOVCBVTlNJR05FRCBOT1QgTlVMTCwKKyAqIGJ5dGVzIElOVCBVTlNJR05FRCBOT1QgTlVMTCwKKyAqIHJlZmVyZXIgVkFSQ0hBUigxMjgpLAorICogdXNlckFnZW50IFZBUkNIQVIoMTI4KSwKKyAqIFBSSU1BUlkgS0VZIChpZCksCisgKiBJTkRFWCAodHMpLAorICogSU5ERVggKHJlbW90ZUhvc3QpLAorICogSU5ERVggKHZpcnR1YWxIb3N0KSwKKyAqIElOREVYIChxdWVyeSksCisgKiBJTkRFWCAodXNlckFnZW50KQorICogKTsKKyAqIDwvcHJlPgorICogPHA+CisgKiBJZiB0aGUgdGFibGUgaXMgY3JlYXRlZCBhcyBhYm92ZSwgaXRzIG5hbWUgYW5kIHRoZSBmaWVsZCBuYW1lcyBkb24ndCBuZWVkIAorICogdG8gYmUgZGVmaW5lZC4KKyAqIDwvcD4KKyAqIDxwPgorICogSWYgdGhlIHJlcXVlc3QgbWV0aG9kIGlzICJjb21tb24iLCBvbmx5IHRoZXNlIGZpZWxkcyBhcmUgdXNlZDoKKyAqIDxjb2RlPnJlbW90ZUhvc3QsIHVzZXIsIHRpbWVTdGFtcCwgcXVlcnksIHN0YXR1cywgYnl0ZXM8L2NvZGU+CisgKiA8L3A+CisgKiA8cD4KKyAqIDxpPlRPIERPOiBwcm92aWRlIG9wdGlvbiBmb3IgZXhjbHVkaW5nIGxvZ2dpbmcgb2YgY2VydGFpbiBNSU1FIHR5cGVzLjwvaT4KKyAqIDwvcD4KKyAqIAorICogQGF1dGhvciBBbmRyZSBkZSBKZXN1cworICogQGF1dGhvciBQZXRlciBSb3NzYmFjaAorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBKREJDQWNjZXNzTG9nVmFsdmUgCisgICAgZXh0ZW5kcyBWYWx2ZUJhc2UgCisgICAgaW1wbGVtZW50cyBMaWZlY3ljbGUgeworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworICAgIC8qKgorICAgICAqIENsYXNzIGNvbnN0cnVjdG9yLiBJbml0aWFsaXplcyB0aGUgZmllbGRzIHdpdGggdGhlIGRlZmF1bHQgdmFsdWVzLgorICAgICAqIFRoZSBkZWZhdWx0cyBhcmU6CisgICAgICogPHByZT4KKyAgICAgKiAJCWRyaXZlck5hbWUgPSBudWxsOworICAgICAqIAkJY29ubmVjdGlvblVSTCA9IG51bGw7CisgICAgICogCQl0YWJsZU5hbWUgPSAiYWNjZXNzIjsKKyAgICAgKiAJCXJlbW90ZUhvc3RGaWVsZCA9ICJyZW1vdGVIb3N0IjsKKyAgICAgKiAJCXVzZXJGaWVsZCA9ICJ1c2VyIjsKKyAgICAgKiAJCXRpbWVzdGFtcEZpZWxkID0gInRpbWVzdGFtcCI7CisgICAgICogCQl2aXJ0dWFsSG9zdEZpZWxkID0gInZpcnR1YWxIb3N0IjsKKyAgICAgKiAJCW1ldGhvZEZpZWxkID0gIm1ldGhvZCI7CisgICAgICogCQlxdWVyeUZpZWxkID0gInF1ZXJ5IjsKKyAgICAgKiAJCXN0YXR1c0ZpZWxkID0gInN0YXR1cyI7CisgICAgICogCQlieXRlc0ZpZWxkID0gImJ5dGVzIjsKKyAgICAgKiAJCXJlZmVyZXJGaWVsZCA9ICJyZWZlcmVyIjsKKyAgICAgKiAJCXVzZXJBZ2VudEZpZWxkID0gInVzZXJBZ2VudCI7CisgICAgICogCQlwYXR0ZXJuID0gImNvbW1vbiI7CisgICAgICogCQlyZXNvbHZlSG9zdHMgPSBmYWxzZTsKKyAgICAgKiA8L3ByZT4KKyAgICAgKi8KKyAgICBwdWJsaWMgSkRCQ0FjY2Vzc0xvZ1ZhbHZlKCkgeworICAgICAgICBzdXBlcigpOworICAgICAgICBkcml2ZXJOYW1lID0gbnVsbDsKKyAgICAgICAgY29ubmVjdGlvblVSTCA9IG51bGw7CisgICAgICAgIHRhYmxlTmFtZSA9ICJhY2Nlc3MiOworICAgICAgICByZW1vdGVIb3N0RmllbGQgPSAicmVtb3RlSG9zdCI7CisgICAgICAgIHVzZXJGaWVsZCA9ICJ1c2VyIjsKKyAgICAgICAgdGltZXN0YW1wRmllbGQgPSAidGltZXN0YW1wIjsKKyAgICAgICAgdmlydHVhbEhvc3RGaWVsZCA9ICJ2aXJ0dWFsSG9zdCI7CisgICAgICAgIG1ldGhvZEZpZWxkID0gIm1ldGhvZCI7CisgICAgICAgIHF1ZXJ5RmllbGQgPSAicXVlcnkiOworICAgICAgICBzdGF0dXNGaWVsZCA9ICJzdGF0dXMiOworICAgICAgICBieXRlc0ZpZWxkID0gImJ5dGVzIjsKKyAgICAgICAgcmVmZXJlckZpZWxkID0gInJlZmVyZXIiOworICAgICAgICB1c2VyQWdlbnRGaWVsZCA9ICJ1c2VyQWdlbnQiOworICAgICAgICBwYXR0ZXJuID0gImNvbW1vbiI7CisgICAgICAgIHJlc29sdmVIb3N0cyA9IGZhbHNlOworICAgICAgICBjb25uID0gbnVsbDsKKyAgICAgICAgcHMgPSBudWxsOworICAgICAgICBjdXJyZW50VGltZU1pbGxpcyA9IG5ldyBqYXZhLnV0aWwuRGF0ZSgpLmdldFRpbWUoKTsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgIC8qKgorICAgICAqIFRoZSBjb25uZWN0aW9uIHVzZXJuYW1lIHRvIHVzZSB3aGVuIHRyeWluZyB0byBjb25uZWN0IHRvIHRoZSBkYXRhYmFzZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGNvbm5lY3Rpb25OYW1lID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIGNvbm5lY3Rpb24gVVJMIHRvIHVzZSB3aGVuIHRyeWluZyB0byBjb25uZWN0IHRvIHRoZSBkYXRhYmFzZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGNvbm5lY3Rpb25QYXNzd29yZCA9IG51bGw7CisKKyAgIC8qKgorICAgICAqIEluc3RhbmNlIG9mIHRoZSBKREJDIERyaXZlciBjbGFzcyB3ZSB1c2UgYXMgYSBjb25uZWN0aW9uIGZhY3RvcnkuCisgICAgICovCisgICAgcHJvdGVjdGVkIERyaXZlciBkcml2ZXIgPSBudWxsOworCisKKyAgICBwcml2YXRlIFN0cmluZyBkcml2ZXJOYW1lOworICAgIHByaXZhdGUgU3RyaW5nIGNvbm5lY3Rpb25VUkw7CisgICAgcHJpdmF0ZSBTdHJpbmcgdGFibGVOYW1lOworICAgIHByaXZhdGUgU3RyaW5nIHJlbW90ZUhvc3RGaWVsZDsKKyAgICBwcml2YXRlIFN0cmluZyB1c2VyRmllbGQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgdGltZXN0YW1wRmllbGQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgdmlydHVhbEhvc3RGaWVsZDsKKyAgICBwcml2YXRlIFN0cmluZyBtZXRob2RGaWVsZDsKKyAgICBwcml2YXRlIFN0cmluZyBxdWVyeUZpZWxkOworICAgIHByaXZhdGUgU3RyaW5nIHN0YXR1c0ZpZWxkOworICAgIHByaXZhdGUgU3RyaW5nIGJ5dGVzRmllbGQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgcmVmZXJlckZpZWxkOworICAgIHByaXZhdGUgU3RyaW5nIHVzZXJBZ2VudEZpZWxkOworICAgIHByaXZhdGUgU3RyaW5nIHBhdHRlcm47CisgICAgcHJpdmF0ZSBib29sZWFuIHJlc29sdmVIb3N0czsKKworCisgICAgcHJpdmF0ZSBDb25uZWN0aW9uIGNvbm47CisgICAgcHJpdmF0ZSBQcmVwYXJlZFN0YXRlbWVudCBwczsKKworCisgICAgcHJpdmF0ZSBsb25nIGN1cnJlbnRUaW1lTWlsbGlzOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBpbmZvID0gCisgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcy5KREJDQWNjZXNzTG9nVmFsdmUvMS4wIjsKKworCisgICAgLyoqCisgICAgICogVGhlIGxpZmVjeWNsZSBldmVudCBzdXBwb3J0IGZvciB0aGlzIGNvbXBvbmVudC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTGlmZWN5Y2xlU3VwcG9ydCBsaWZlY3ljbGUgPSBuZXcgTGlmZWN5Y2xlU3VwcG9ydCh0aGlzKTsKKworCisgICAgLyoqCisgICAgICogVGhlIHN0cmluZyBtYW5hZ2VyIGZvciB0aGlzIHBhY2thZ2UuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmdNYW5hZ2VyIHNtID0gU3RyaW5nTWFuYWdlci5nZXRNYW5hZ2VyKENvbnN0YW50cy5QYWNrYWdlKTsKKworCisgICAgLyoqCisgICAgICogSGFzIHRoaXMgY29tcG9uZW50IGJlZW4gc3RhcnRlZCB5ZXQ/CisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHN0YXJ0ZWQgPSBmYWxzZTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB1c2VybmFtZSB0byB1c2UgdG8gY29ubmVjdCB0byB0aGUgZGF0YWJhc2UuCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbm5lY3Rpb25OYW1lKCkgeworICAgICAgICByZXR1cm4gY29ubmVjdGlvbk5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSB1c2VybmFtZSB0byB1c2UgdG8gY29ubmVjdCB0byB0aGUgZGF0YWJhc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbk5hbWUgVXNlcm5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb25uZWN0aW9uTmFtZShTdHJpbmcgY29ubmVjdGlvbk5hbWUpIHsKKyAgICAgICAgdGhpcy5jb25uZWN0aW9uTmFtZSA9IGNvbm5lY3Rpb25OYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGRhdGFiYXNlIGRyaXZlciBuYW1lLgorICAgICAqIAorICAgICAqIEBwYXJhbSBkcml2ZXJOYW1lIFRoZSBjb21wbGV0ZSBuYW1lIG9mIHRoZSBkYXRhYmFzZSBkcml2ZXIgY2xhc3MuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RHJpdmVyTmFtZShTdHJpbmcgZHJpdmVyTmFtZSkgeworICAgICAgICB0aGlzLmRyaXZlck5hbWUgPSBkcml2ZXJOYW1lOworICAgIH0KKworICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBwYXNzd29yZCB0byB1c2UgdG8gY29ubmVjdCB0byB0aGUgZGF0YWJhc2UuCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbm5lY3Rpb25QYXNzd29yZCgpIHsKKyAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb25QYXNzd29yZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHBhc3N3b3JkIHRvIHVzZSB0byBjb25uZWN0IHRvIHRoZSBkYXRhYmFzZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uUGFzc3dvcmQgVXNlciBwYXNzd29yZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbm5lY3Rpb25QYXNzd29yZChTdHJpbmcgY29ubmVjdGlvblBhc3N3b3JkKSB7CisgICAgICAgIHRoaXMuY29ubmVjdGlvblBhc3N3b3JkID0gY29ubmVjdGlvblBhc3N3b3JkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIEpEQkMgVVJMIGZvciB0aGUgZGF0YWJhc2Ugd2hlcmUgdGhlIGxvZyBpcyBzdG9yZWQuCisgICAgICogCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25VUkwgVGhlIEpEQkMgVVJMIG9mIHRoZSBkYXRhYmFzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb25uZWN0aW9uVVJMKFN0cmluZyBjb25uZWN0aW9uVVJMKSB7CisgICAgICAgIHRoaXMuY29ubmVjdGlvblVSTCA9IGNvbm5lY3Rpb25VUkw7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSB0YWJsZSB3aGVyZSB0aGUgbG9ncyBhcmUgc3RvcmVkLgorICAgICAqIAorICAgICAqIEBwYXJhbSB0YWJsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHRhYmxlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRhYmxlTmFtZShTdHJpbmcgdGFibGVOYW1lKSB7CisgICAgICAgIHRoaXMudGFibGVOYW1lID0gdGFibGVOYW1lOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgZmllbGQgY29udGFpbmluZyB0aGUgcmVtb3RlIGhvc3QuCisgICAgICogCisgICAgICogQHBhcmFtIHJlbW90ZUhvc3RGaWVsZCBUaGUgbmFtZSBvZiB0aGUgcmVtb3RlIGhvc3QgZmllbGQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVtb3RlSG9zdEZpZWxkKFN0cmluZyByZW1vdGVIb3N0RmllbGQpIHsKKyAgICAgICAgdGhpcy5yZW1vdGVIb3N0RmllbGQgPSByZW1vdGVIb3N0RmllbGQ7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSBmaWVsZCBjb250YWluaW5nIHRoZSByZW1vdGUgdXNlciBuYW1lLgorICAgICAqIAorICAgICAqIEBwYXJhbSB1c2VyRmllbGQgVGhlIG5hbWUgb2YgdGhlIHJlbW90ZSB1c2VyIGZpZWxkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVzZXJGaWVsZChTdHJpbmcgdXNlckZpZWxkKSB7CisgICAgICAgIHRoaXMudXNlckZpZWxkID0gdXNlckZpZWxkOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgZmllbGQgY29udGFpbmluZyB0aGUgc2VydmVyLWRldGVybWluZWQgdGltZXN0YW1wLgorICAgICAqIAorICAgICAqIEBwYXJhbSB0aW1lc3RhbXBGaWVsZCBUaGUgbmFtZSBvZiB0aGUgc2VydmVyLWRldGVybWluZWQgdGltZXN0YW1wIGZpZWxkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRpbWVzdGFtcEZpZWxkKFN0cmluZyB0aW1lc3RhbXBGaWVsZCkgeworICAgICAgICB0aGlzLnRpbWVzdGFtcEZpZWxkID0gdGltZXN0YW1wRmllbGQ7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSBmaWVsZCBjb250YWluaW5nIHRoZSB2aXJ0dWFsIGhvc3QgaW5mb3JtYXRpb24gCisgICAgICogKHRoaXMgaXMgaW4gZmFjdCB0aGUgc2VydmVyIG5hbWUpLgorICAgICAqIAorICAgICAqIEBwYXJhbSB2aXJ0dWFsSG9zdEZpZWxkIFRoZSBuYW1lIG9mIHRoZSB2aXJ0dWFsIGhvc3QgZmllbGQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VmlydHVhbEhvc3RGaWVsZChTdHJpbmcgdmlydHVhbEhvc3RGaWVsZCkgeworICAgICAgICB0aGlzLnZpcnR1YWxIb3N0RmllbGQgPSB2aXJ0dWFsSG9zdEZpZWxkOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgZmllbGQgY29udGFpbmluZyB0aGUgSFRUUCByZXF1ZXN0IG1ldGhvZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbWV0aG9kRmllbGQgVGhlIG5hbWUgb2YgdGhlIEhUVFAgcmVxdWVzdCBtZXRob2QgZmllbGQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWV0aG9kRmllbGQoU3RyaW5nIG1ldGhvZEZpZWxkKSB7CisgICAgICAgIHRoaXMubWV0aG9kRmllbGQgPSBtZXRob2RGaWVsZDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIGZpZWxkIGNvbnRhaW5pbmcgdGhlIFVSTCBwYXJ0IG9mIHRoZSBIVFRQIHF1ZXJ5LgorICAgICAqIAorICAgICAqIEBwYXJhbSBxdWVyeUZpZWxkIFRoZSBuYW1lIG9mIHRoZSBmaWVsZCBjb250YWluaW5nIHRoZSBVUkwgcGFydCBvZiAKKyAgICAgKiB0aGUgSFRUUCBxdWVyeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRRdWVyeUZpZWxkKFN0cmluZyBxdWVyeUZpZWxkKSB7CisgICAgICAgIHRoaXMucXVlcnlGaWVsZCA9IHF1ZXJ5RmllbGQ7CisgICAgfQorCisKKyAgLyoqCisgICAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIGZpZWxkIGNvbnRhaW5pbmcgdGhlIEhUVFAgcmVzcG9uc2Ugc3RhdHVzIGNvZGUuCisgICAqIAorICAgKiBAcGFyYW0gc3RhdHVzRmllbGQgVGhlIG5hbWUgb2YgdGhlIEhUVFAgcmVzcG9uc2Ugc3RhdHVzIGNvZGUgZmllbGQuCisgICAqLyAgCisgICAgcHVibGljIHZvaWQgc2V0U3RhdHVzRmllbGQoU3RyaW5nIHN0YXR1c0ZpZWxkKSB7CisgICAgICAgIHRoaXMuc3RhdHVzRmllbGQgPSBzdGF0dXNGaWVsZDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIGZpZWxkIGNvbnRhaW5pbmcgdGhlIG51bWJlciBvZiBieXRlcyByZXR1cm5lZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYnl0ZXNGaWVsZCBUaGUgbmFtZSBvZiB0aGUgcmV0dXJuZWQgYnl0ZXMgZmllbGQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Qnl0ZXNGaWVsZChTdHJpbmcgYnl0ZXNGaWVsZCkgeworICAgICAgICB0aGlzLmJ5dGVzRmllbGQgPSBieXRlc0ZpZWxkOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgZmllbGQgY29udGFpbmluZyB0aGUgcmVmZXJlci4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcmVmZXJlckZpZWxkIFRoZSByZWZlcmVyIGZpZWxkIG5hbWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVmZXJlckZpZWxkKFN0cmluZyByZWZlcmVyRmllbGQpIHsKKyAgICAgICAgdGhpcy5yZWZlcmVyRmllbGQgPSByZWZlcmVyRmllbGQ7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSBmaWVsZCBjb250YWluaW5nIHRoZSB1c2VyIGFnZW50LgorICAgICAqIAorICAgICAqIEBwYXJhbSB1c2VyQWdlbnRGaWVsZCBUaGUgbmFtZSBvZiB0aGUgdXNlciBhZ2VudCBmaWVsZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVc2VyQWdlbnRGaWVsZChTdHJpbmcgdXNlckFnZW50RmllbGQpIHsKKyAgICAgICAgdGhpcy51c2VyQWdlbnRGaWVsZCA9IHVzZXJBZ2VudEZpZWxkOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbG9nZ2luZyBwYXR0ZXJuLiBUaGUgcGF0dGVybnMgc3VwcG9ydGVkIGNvcnJlc3BvbmQgdG8gdGhlIAorICAgICAqIGZpbGUtYmFzZWQgImNvbW1vbiIgYW5kICJjb21iaW5lZCIuIFRoZXNlIGFyZSB0cmFuc2xhdGVkIGludG8gdGhlIHVzZSAKKyAgICAgKiBvZiB0YWJsZXMgY29udGFpbmluZyBlaXRoZXIgc2V0IG9mIGZpZWxkcy4KKyAgICAgKiA8UD48ST5UTyBETzogbW9yZSBmbGV4aWJsZSBmaWVsZCBjaG9pY2VzLjwvST48L1A+CisgICAgICogCisgICAgICogQHBhcmFtIHBhdHRlcm4gVGhlIG5hbWUgb2YgdGhlIGxvZ2dpbmcgcGF0dGVybi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXR0ZXJuKFN0cmluZyBwYXR0ZXJuKSB7CisgICAgICAgIHRoaXMucGF0dGVybiA9IHBhdHRlcm47CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgSVAgaG9zdCBuYW1lIHJlc29sdXRpb24gaXMgZG9uZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcmVzb2x2ZUhvc3RzICJ0cnVlIiBvciAiZmFsc2UiLCBpZiBob3N0IElQIHJlc29sdXRpb24gCisgICAgICogaXMgZGVzaXJlZCBvciBub3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVzb2x2ZUhvc3RzKFN0cmluZyByZXNvbHZlSG9zdHMpIHsKKyAgICAgICAgdGhpcy5yZXNvbHZlSG9zdHMgPSBuZXcgQm9vbGVhbihyZXNvbHZlSG9zdHMpLmJvb2xlYW5WYWx1ZSgpOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGlzIGludm9rZWQgYnkgVG9tY2F0IG9uIGVhY2ggcXVlcnkuCisgICAgICogCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIFJlcXVlc3Qgb2JqZWN0LgorICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgUmVzcG9uc2Ugb2JqZWN0LgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBTaG91bGQgbm90IGJlIHRocm93bi4KKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gRGF0YWJhc2UgU1FMRXhjZXB0aW9uIGlzIHdyYXBwZWQgCisgICAgICogaW4gYSBTZXJ2bGV0RXhjZXB0aW9uLgorICAgICAqLyAgICAKKyAgICBwdWJsaWMgdm9pZCBpbnZva2UoUmVxdWVzdCByZXF1ZXN0LCBSZXNwb25zZSByZXNwb25zZSkgCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgZ2V0TmV4dCgpLmludm9rZShyZXF1ZXN0LCByZXNwb25zZSk7CisKKyAgICAgICAgU3RyaW5nIHJlbW90ZUhvc3QgPSAiIjsKKyAgICAgICAgaWYocmVzb2x2ZUhvc3RzKQorICAgICAgICAgICAgcmVtb3RlSG9zdCA9IHJlcXVlc3QuZ2V0UmVtb3RlSG9zdCgpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZW1vdGVIb3N0ID0gcmVxdWVzdC5nZXRSZW1vdGVBZGRyKCk7CisgICAgICAgIFN0cmluZyB1c2VyID0gIiI7CisgICAgICAgIGlmKHJlcXVlc3QgIT0gbnVsbCkKKyAgICAgICAgICAgIHVzZXIgPSByZXF1ZXN0LmdldFJlbW90ZVVzZXIoKTsKKyAgICAgICAgU3RyaW5nIHF1ZXJ5PSIiOworICAgICAgICBpZihyZXF1ZXN0ICE9IG51bGwpCisgICAgICAgICAgICBxdWVyeSA9IHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpOworICAgICAgICBpbnQgYnl0ZXMgPSByZXNwb25zZS5nZXRDb250ZW50Q291bnQoKTsKKyAgICAgICAgaWYoYnl0ZXMgPCAwKQorICAgICAgICAgICAgYnl0ZXMgPSAwOworICAgICAgICBpbnQgc3RhdHVzID0gcmVzcG9uc2UuZ2V0U3RhdHVzKCk7CisgICAgICAgIGlmIChwYXR0ZXJuLmVxdWFscygiY29tYmluZWQiKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyB2aXJ0dWFsSG9zdCA9ICIiOworICAgICAgICAgICAgICAgIGlmKHJlcXVlc3QgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgdmlydHVhbEhvc3QgPSByZXF1ZXN0LmdldFNlcnZlck5hbWUoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbWV0aG9kID0gIiI7CisgICAgICAgICAgICAgICAgaWYocmVxdWVzdCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSByZXF1ZXN0LmdldE1ldGhvZCgpOworICAgICAgICAgICAgICAgIFN0cmluZyByZWZlcmVyID0gIiI7CisgICAgICAgICAgICAgICAgaWYocmVxdWVzdCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICByZWZlcmVyID0gcmVxdWVzdC5nZXRIZWFkZXIoInJlZmVyZXIiKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdXNlckFnZW50ID0gIiI7CisgICAgICAgICAgICAgICAgaWYocmVxdWVzdCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB1c2VyQWdlbnQgPSByZXF1ZXN0LmdldEhlYWRlcigidXNlci1hZ2VudCIpOworICAgICAgICB9CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgIGludCBudW1iZXJPZlRyaWVzID0gMjsKKyAgICAgICAgICB3aGlsZSAobnVtYmVyT2ZUcmllcz4wKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG9wZW4oKTsKKyAgICAKKyAgICAgICAgICAgICAgICBwcy5zZXRTdHJpbmcoMSwgcmVtb3RlSG9zdCk7CisgICAgICAgICAgICAgICAgcHMuc2V0U3RyaW5nKDIsIHVzZXIpOworICAgICAgICAgICAgICAgIHBzLnNldFRpbWVzdGFtcCgzLCBuZXcgVGltZXN0YW1wKGdldEN1cnJlbnRUaW1lTWlsbGlzKCkpKTsKKyAgICAgICAgICAgICAgICBwcy5zZXRTdHJpbmcoNCwgcXVlcnkpOworICAgICAgICAgICAgICAgIHBzLnNldEludCg1LCBzdGF0dXMpOworICAgICAgICAgICAgICAgIHBzLnNldEludCg2LCBieXRlcyk7CisgICAgICAgICAgICAgICAgaWYgKHBhdHRlcm4uZXF1YWxzKCJjb21iaW5lZCIpKSB7CisgICAgIAorICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB2aXJ0dWFsSG9zdCA9ICIiOworICAgICAgICAgICAgICAgICAgICAgIGlmKHJlcXVlc3QgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICB2aXJ0dWFsSG9zdCA9IHJlcXVlc3QuZ2V0U2VydmVyTmFtZSgpOworICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtZXRob2QgPSAiIjsKKyAgICAgICAgICAgICAgICAgICAgICBpZihyZXF1ZXN0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gcmVxdWVzdC5nZXRNZXRob2QoKTsKKyAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVmZXJlciA9ICIiOworICAgICAgICAgICAgICAgICAgICAgIGlmKHJlcXVlc3QgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVyID0gcmVxdWVzdC5nZXRIZWFkZXIoInJlZmVyZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdXNlckFnZW50ID0gIiI7CisgICAgICAgICAgICAgICAgICAgICAgaWYocmVxdWVzdCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJBZ2VudCA9IHJlcXVlc3QuZ2V0SGVhZGVyKCJ1c2VyLWFnZW50Iik7CisgICAgICAgICAgICAgICAgICAgICAgcHMuc2V0U3RyaW5nKDcsIHZpcnR1YWxIb3N0KTsKKyAgICAgICAgICAgICAgICAgICAgICBwcy5zZXRTdHJpbmcoOCwgbWV0aG9kKTsKKyAgICAgICAgICAgICAgICAgICAgICBwcy5zZXRTdHJpbmcoOSwgcmVmZXJlcik7CisgICAgICAgICAgICAgICAgICAgICAgcHMuc2V0U3RyaW5nKDEwLCB1c2VyQWdlbnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwcy5leGVjdXRlVXBkYXRlKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIExvZyB0aGUgcHJvYmxlbSBmb3IgcG9zdGVyaXR5CisgICAgICAgICAgICAgICAgICBjb250YWluZXIuZ2V0TG9nZ2VyKCkuZXJyb3Ioc20uZ2V0U3RyaW5nKCJqZGJjQWNjZXNzTG9nVmFsdmUuZXhjZXB0aW9uIiksIGUpOworCisgICAgICAgICAgICAgICAgLy8gQ2xvc2UgdGhlIGNvbm5lY3Rpb24gc28gdGhhdCBpdCBnZXRzIHJlb3BlbmVkIG5leHQgdGltZQorICAgICAgICAgICAgICAgIGlmIChjb25uICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGNsb3NlKCk7CisgICAgICAgICAgICAgIH0KKyAgICAJICAgICAgbnVtYmVyT2ZUcmllcy0tOyAgICAgICAgCisgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQkKKworCisgICAgLyoqCisgICAgICogQWRkcyBhIExpZmVjeWNsZSBsaXN0ZW5lci4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRvIGFkZC4KKyAgICAgKi8gIAorICAgIHB1YmxpYyB2b2lkIGFkZExpZmVjeWNsZUxpc3RlbmVyKExpZmVjeWNsZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisKKyAgICAgICAgbGlmZWN5Y2xlLmFkZExpZmVjeWNsZUxpc3RlbmVyKGxpc3RlbmVyKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBsaWZlY3ljbGUgbGlzdGVuZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGxpZmVjeWNsZS4gSWYgdGhpcyAKKyAgICAgKiBMaWZlY3ljbGUgaGFzIG5vIGxpc3RlbmVycyByZWdpc3RlcmVkLCBhIHplcm8tbGVuZ3RoIGFycmF5IGlzIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBMaWZlY3ljbGVMaXN0ZW5lcltdIGZpbmRMaWZlY3ljbGVMaXN0ZW5lcnMoKSB7CisKKyAgICAgICAgcmV0dXJuIGxpZmVjeWNsZS5maW5kTGlmZWN5Y2xlTGlzdGVuZXJzKCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgYSBMaWZlY3ljbGUgbGlzdGVuZXIuCisgICAgICogCisgICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciB0byByZW1vdmUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlTGlmZWN5Y2xlTGlzdGVuZXIoTGlmZWN5Y2xlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKworICAgICAgICBsaWZlY3ljbGUucmVtb3ZlTGlmZWN5Y2xlTGlzdGVuZXIobGlzdGVuZXIpOworCisgICAgfQorCisgICAgLyoqCisgICAgICogT3BlbiAoaWYgbmVjZXNzYXJ5KSBhbmQgcmV0dXJuIGEgZGF0YWJhc2UgY29ubmVjdGlvbiBmb3IgdXNlIGJ5CisgICAgICogdGhpcyBBY2Nlc3NMb2dWYWx2ZS4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gU1FMRXhjZXB0aW9uIGlmIGEgZGF0YWJhc2UgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgb3BlbigpIHRocm93cyBTUUxFeGNlcHRpb24geworCisgICAgICAgIC8vIERvIG5vdGhpbmcgaWYgdGhlcmUgaXMgYSBkYXRhYmFzZSBjb25uZWN0aW9uIGFscmVhZHkgb3BlbgorICAgICAgICBpZiAoY29ubiAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIDsKKworICAgICAgICAvLyBJbnN0YW50aWF0ZSBvdXIgZGF0YWJhc2UgZHJpdmVyIGlmIG5lY2Vzc2FyeQorICAgICAgICBpZiAoZHJpdmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgQ2xhc3MgY2xhenogPSBDbGFzcy5mb3JOYW1lKGRyaXZlck5hbWUpOworICAgICAgICAgICAgICAgIGRyaXZlciA9IChEcml2ZXIpIGNsYXp6Lm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBTUUxFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gT3BlbiBhIG5ldyBjb25uZWN0aW9uCisgICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICBwcm9wcy5wdXQoImF1dG9SZWNvbm5lY3QiLCAidHJ1ZSIpOworICAgICAgICBpZiAoY29ubmVjdGlvbk5hbWUgIT0gbnVsbCkKKyAgICAgICAgICAgIHByb3BzLnB1dCgidXNlciIsIGNvbm5lY3Rpb25OYW1lKTsKKyAgICAgICAgaWYgKGNvbm5lY3Rpb25QYXNzd29yZCAhPSBudWxsKQorICAgICAgICAgICAgcHJvcHMucHV0KCJwYXNzd29yZCIsIGNvbm5lY3Rpb25QYXNzd29yZCk7CisgICAgICAgIGNvbm4gPSBkcml2ZXIuY29ubmVjdChjb25uZWN0aW9uVVJMLCBwcm9wcyk7CisgICAgICAgIGNvbm4uc2V0QXV0b0NvbW1pdCh0cnVlKTsKKyAgICAgICAgaWYgKHBhdHRlcm4uZXF1YWxzKCJjb21tb24iKSkgeworICAgICAgICAgICAgICAgIHBzID0gY29ubi5wcmVwYXJlU3RhdGVtZW50CisgICAgICAgICAgICAgICAgICAgICgiSU5TRVJUIElOVE8gIiArIHRhYmxlTmFtZSArICIgKCIgCisgICAgICAgICAgICAgICAgICAgICArIHJlbW90ZUhvc3RGaWVsZCArICIsICIgKyB1c2VyRmllbGQgKyAiLCAiCisgICAgICAgICAgICAgICAgICAgICArIHRpbWVzdGFtcEZpZWxkICsiLCAiICsgcXVlcnlGaWVsZCArICIsICIKKyAgICAgICAgICAgICAgICAgICAgICsgc3RhdHVzRmllbGQgKyAiLCAiICsgYnl0ZXNGaWVsZCAKKyAgICAgICAgICAgICAgICAgICAgICsgIikgVkFMVUVTKD8sID8sID8sID8sID8sID8pIik7CisgICAgICAgIH0gZWxzZSBpZiAocGF0dGVybi5lcXVhbHMoImNvbWJpbmVkIikpIHsKKyAgICAgICAgICAgICAgICBwcyA9IGNvbm4ucHJlcGFyZVN0YXRlbWVudAorICAgICAgICAgICAgICAgICAgICAoIklOU0VSVCBJTlRPICIgKyB0YWJsZU5hbWUgKyAiICgiIAorICAgICAgICAgICAgICAgICAgICAgKyByZW1vdGVIb3N0RmllbGQgKyAiLCAiICsgdXNlckZpZWxkICsgIiwgIgorICAgICAgICAgICAgICAgICAgICAgKyB0aW1lc3RhbXBGaWVsZCArICIsICIgKyBxdWVyeUZpZWxkICsgIiwgIiAKKyAgICAgICAgICAgICAgICAgICAgICsgc3RhdHVzRmllbGQgKyAiLCAiICsgYnl0ZXNGaWVsZCArICIsICIgCisgICAgICAgICAgICAgICAgICAgICArIHZpcnR1YWxIb3N0RmllbGQgKyAiLCAiICsgbWV0aG9kRmllbGQgKyAiLCAiCisgICAgICAgICAgICAgICAgICAgICArIHJlZmVyZXJGaWVsZCArICIsICIgKyB1c2VyQWdlbnRGaWVsZAorICAgICAgICAgICAgICAgICAgICAgKyAiKSBWQUxVRVMoPywgPywgPywgPywgPywgPywgPywgPywgPywgPykiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENsb3NlIHRoZSBzcGVjaWZpZWQgZGF0YWJhc2UgY29ubmVjdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBjbG9zZSgpIHsKKworICAgICAgICAvLyBEbyBub3RoaW5nIGlmIHRoZSBkYXRhYmFzZSBjb25uZWN0aW9uIGlzIGFscmVhZHkgY2xvc2VkCisgICAgICAgIGlmIChjb25uID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgLy8gQ2xvc2Ugb3VyIHByZXBhcmVkIHN0YXRlbWVudHMgKGlmIGFueSkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHBzLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBmKSB7CisgICAgICAgICAgICA7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5wcyA9IG51bGw7CisKKworCisgICAgICAgIC8vIENsb3NlIHRoaXMgZGF0YWJhc2UgY29ubmVjdGlvbiwgYW5kIGxvZyBhbnkgZXJyb3JzCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjb25uLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBjb250YWluZXIuZ2V0TG9nZ2VyKCkuZXJyb3Ioc20uZ2V0U3RyaW5nKCJqZGJjQWNjZXNzTG9nVmFsZXZlLmNsb3NlIiksIGUpOyAvLyBKdXN0IGxvZyBpdCBoZXJlICAgICAgICAgICAgCisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgIHRoaXMuY29ubiA9IG51bGw7CisgICAgICAgIH0KKworICAgIH0KKyAgICAvKioKKyAgICAgKiBJbnZva2VkIGJ5IFRvbWNhdCBvbiBzdGFydHVwLiBUaGUgZGF0YWJhc2UgY29ubmVjdGlvbiBpcyBzZXQgaGVyZS4KKyAgICAgKiAKKyAgICAgKiBAZXhjZXB0aW9uIExpZmVjeWNsZUV4Y2VwdGlvbiBDYW4gYmUgdGhyb3duIG9uIGxpZmVjeWNsZSAKKyAgICAgKiBpbmNvbnNpc3RlbmNpZXMgb3Igb24gZGF0YWJhc2UgZXJyb3JzIChhcyBhIHdyYXBwZWQgU1FMRXhjZXB0aW9uKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb24geworCisgICAgICAgIGlmIChzdGFydGVkKQorICAgICAgICAgICAgdGhyb3cgbmV3IExpZmVjeWNsZUV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoImFjY2Vzc0xvZ1ZhbHZlLmFscmVhZHlTdGFydGVkIikpOworICAgICAgICBsaWZlY3ljbGUuZmlyZUxpZmVjeWNsZUV2ZW50KFNUQVJUX0VWRU5ULCBudWxsKTsKKyAgICAgICAgc3RhcnRlZCA9IHRydWU7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9wZW4oKSA7ICAgICAgICAKKyAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBMaWZlY3ljbGVFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogSW52b2tlZCBieSB0b21jYXQgb24gc2h1dGRvd24uIFRoZSBkYXRhYmFzZSBjb25uZWN0aW9uIGlzIGNsb3NlZCBoZXJlLgorICAgICAqIAorICAgICAqIEBleGNlcHRpb24gTGlmZWN5Y2xlRXhjZXB0aW9uIENhbiBiZSB0aHJvd24gb24gbGlmZWN5Y2xlIAorICAgICAqIGluY29uc2lzdGVuY2llcyBvciBvbiBkYXRhYmFzZSBlcnJvcnMgKGFzIGEgd3JhcHBlZCBTUUxFeGNlcHRpb24pLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB0aHJvd3MgTGlmZWN5Y2xlRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAoIXN0YXJ0ZWQpCisgICAgICAgICAgICB0aHJvdyBuZXcgTGlmZWN5Y2xlRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygiYWNjZXNzTG9nVmFsdmUubm90U3RhcnRlZCIpKTsKKyAgICAgICAgbGlmZWN5Y2xlLmZpcmVMaWZlY3ljbGVFdmVudChTVE9QX0VWRU5ULCBudWxsKTsKKyAgICAgICAgc3RhcnRlZCA9IGZhbHNlOworICAgICAgICAKKyAgICAgICAgY2xvc2UoKSA7CisgICAgCQorICAgIH0KKworCisgICAgcHVibGljIGxvbmcgZ2V0Q3VycmVudFRpbWVNaWxsaXMoKSB7CisgICAgICAgIGxvbmcgc3lzdGltZSAgPSAgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIGlmICgoc3lzdGltZSAtIGN1cnJlbnRUaW1lTWlsbGlzKSA+IDEwMDApIHsKKyAgICAgICAgICAgIGN1cnJlbnRUaW1lTWlsbGlzICA9ICBuZXcgamF2YS51dGlsLkRhdGUoc3lzdGltZSkuZ2V0VGltZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50VGltZU1pbGxpczsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS92YWx2ZXMvTG9jYWxTdHJpbmdzLnByb3BlcnRpZXMgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdmFsdmVzL0xvY2FsU3RyaW5ncy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwZTBmMTcKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdmFsdmVzL0xvY2FsU3RyaW5ncy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNjkgQEAKK2FjY2Vzc0xvZ1ZhbHZlLmFscmVhZHlTdGFydGVkPUFjY2VzcyBMb2dnZXIgaGFzIGFscmVhZHkgYmVlbiBzdGFydGVkCithY2Nlc3NMb2dWYWx2ZS5ub3RTdGFydGVkPUFjY2VzcyBMb2dnZXIgaGFzIG5vdCB5ZXQgYmVlbiBzdGFydGVkCitjZXJ0aWZpY2F0ZXNWYWx2ZS5hbHJlYWR5U3RhcnRlZD1DZXJ0aWZpY2F0ZXMgVmFsdmUgaGFzIGFscmVhZHkgYmVlbiBzdGFydGVkCitjZXJ0aWZpY2F0ZXNWYWx2ZS5ub3RTdGFydGVkPUNlcnRpZmljYXRlcyBWYWx2ZSBoYXMgbm90IHlldCBiZWVuIHN0YXJ0ZWQKK2ludGVyY2VwdG9yVmFsdmUuYWxyZWFkeVN0YXJ0ZWQ9SW50ZXJjZXB0b3IgVmFsdmUgaGFzIGFscmVhZHkgYmVlbiBzdGFydGVkCitpbnRlcmNlcHRvclZhbHZlLm5vdFN0YXJ0ZWQ9SW50ZXJjZXB0b3IgVmFsdmUgaGFzIG5vdCB5ZXQgYmVlbiBzdGFydGVkCityZXF1ZXN0RmlsdGVyVmFsdmUubmV4dD1ObyAnbmV4dCcgdmFsdmUgaGFzIGJlZW4gY29uZmlndXJlZAorcmVxdWVzdEZpbHRlclZhbHZlLnN5bnRheD1TeW50YXggZXJyb3IgaW4gcmVxdWVzdCBmaWx0ZXIgcGF0dGVybiB7MH0KK3JlcXVlc3RMaXN0ZW5lclZhbHZlLnJlcXVlc3RJbml0PUV4Y2VwdGlvbiBzZW5kaW5nIHJlcXVlc3QgaW5pdGlhbGl6ZWQgbGlmZWN5Y2xlIGV2ZW50IHRvIGxpc3RlbmVyIGluc3RhbmNlIG9mIGNsYXNzIHswfQorcmVxdWVzdExpc3RlbmVyVmFsdmUucmVxdWVzdERlc3Ryb3k9RXhjZXB0aW9uIHNlbmRpbmcgcmVxdWVzdCBkZXN0cm95ZWQgbGlmZWN5Y2xlIGV2ZW50IHRvIGxpc3RlbmVyIGluc3RhbmNlIG9mIGNsYXNzIHswfQordmFsdmVCYXNlLm5vTmV4dD1Db25maWd1cmF0aW9uIGVycm9yOiBObyAnbmV4dCcgdmFsdmUgY29uZmlndXJlZAoramRiY0FjY2Vzc0xvZ1ZhbHZlLmV4Y2VwdGlvbj1FeGNlcHRpb24gcGVyZm9ybWluZyBpbnNlcnQgYWNjZXNzIGVudHJ5CitqZGJjQWNjZXNzTG9nVmFsdmUuY2xvc2U9RXhjZXB0aW9uIGNsb3NpbmcgZGF0YWJhc2UgY29ubmVjdGlvbgorCisjIEVycm9yIHJlcG9ydCB2YWx2ZQorZXJyb3JSZXBvcnRWYWx2ZS5lcnJvclJlcG9ydD1FcnJvciByZXBvcnQKK2Vycm9yUmVwb3J0VmFsdmUuc3RhdHVzSGVhZGVyPUhUVFAgU3RhdHVzIHswfSAtIHsxfQorZXJyb3JSZXBvcnRWYWx2ZS5leGNlcHRpb25SZXBvcnQ9RXhjZXB0aW9uIHJlcG9ydAorZXJyb3JSZXBvcnRWYWx2ZS5zdGF0dXNSZXBvcnQ9U3RhdHVzIHJlcG9ydAorZXJyb3JSZXBvcnRWYWx2ZS5tZXNzYWdlPW1lc3NhZ2UKK2Vycm9yUmVwb3J0VmFsdmUuZGVzY3JpcHRpb249ZGVzY3JpcHRpb24KK2Vycm9yUmVwb3J0VmFsdmUuZXhjZXB0aW9uPWV4Y2VwdGlvbgorZXJyb3JSZXBvcnRWYWx2ZS5yb290Q2F1c2U9cm9vdCBjYXVzZQorZXJyb3JSZXBvcnRWYWx2ZS5ub3RlPW5vdGUKK2Vycm9yUmVwb3J0VmFsdmUucm9vdENhdXNlSW5Mb2dzPVRoZSBmdWxsIHN0YWNrIHRyYWNlIG9mIHRoZSByb290IGNhdXNlIGlzIGF2YWlsYWJsZSBpbiB0aGUgezB9IGxvZ3MuCisKKyMgSFRUUCBzdGF0dXMgcmVwb3J0cworaHR0cC4xMDA9VGhlIGNsaWVudCBtYXkgY29udGludWUgKHswfSkuCitodHRwLjEwMT1UaGUgc2VydmVyIGlzIHN3aXRjaGluZyBwcm90b2NvbHMgYWNjb3JkaW5nIHRvIHRoZSAiVXBncmFkZSIgaGVhZGVyICh7MH0pLgoraHR0cC4yMDE9VGhlIHJlcXVlc3Qgc3VjY2VlZGVkIGFuZCBhIG5ldyByZXNvdXJjZSAoezB9KSBoYXMgYmVlbiBjcmVhdGVkIG9uIHRoZSBzZXJ2ZXIuCitodHRwLjIwMj1UaGlzIHJlcXVlc3Qgd2FzIGFjY2VwdGVkIGZvciBwcm9jZXNzaW5nLCBidXQgaGFzIG5vdCBiZWVuIGNvbXBsZXRlZCAoezB9KS4KK2h0dHAuMjAzPVRoZSBtZXRhIGluZm9ybWF0aW9uIHByZXNlbnRlZCBieSB0aGUgY2xpZW50IGRpZCBub3Qgb3JpZ2luYXRlIGZyb20gdGhlIHNlcnZlciAoezB9KS4KK2h0dHAuMjA0PVRoZSByZXF1ZXN0IHN1Y2NlZWRlZCBidXQgdGhlcmUgaXMgbm8gaW5mb3JtYXRpb24gdG8gcmV0dXJuICh7MH0pLgoraHR0cC4yMDU9VGhlIGNsaWVudCBzaG91bGQgcmVzZXQgdGhlIGRvY3VtZW50IHZpZXcgd2hpY2ggY2F1c2VkIHRoaXMgcmVxdWVzdCB0byBiZSBzZW50ICh7MH0pLgoraHR0cC4yMDY9VGhlIHNlcnZlciBoYXMgZnVsZmlsbGVkIGEgcGFydGlhbCBHRVQgcmVxdWVzdCBmb3IgdGhpcyByZXNvdXJjZSAoezB9KS4KK2h0dHAuMjA3PU11bHRpcGxlIHN0YXR1cyB2YWx1ZXMgaGF2ZSBiZWVuIHJldHVybmVkICh7MH0pLgoraHR0cC4zMDA9VGhlIHJlcXVlc3RlZCByZXNvdXJjZSAoezB9KSBjb3JyZXNwb25kcyB0byBhbnkgb25lIG9mIGEgc2V0IG9mIHJlcHJlc2VudGF0aW9ucywgZWFjaCB3aXRoIGl0cyBvd24gc3BlY2lmaWMgbG9jYXRpb24uCitodHRwLjMwMT1UaGUgcmVxdWVzdGVkIHJlc291cmNlICh7MH0pIGhhcyBtb3ZlZCBwZXJtYW5lbnRseSB0byBhIG5ldyBsb2NhdGlvbi4KK2h0dHAuMzAyPVRoZSByZXF1ZXN0ZWQgcmVzb3VyY2UgKHswfSkgaGFzIG1vdmVkIHRlbXBvcmFyaWx5IHRvIGEgbmV3IGxvY2F0aW9uLgoraHR0cC4zMDM9VGhlIHJlc3BvbnNlIHRvIHRoaXMgcmVxdWVzdCBjYW4gYmUgZm91bmQgdW5kZXIgYSBkaWZmZXJlbnQgVVJJICh7MH0pLgoraHR0cC4zMDQ9VGhlIHJlcXVlc3RlZCByZXNvdXJjZSAoezB9KSBpcyBhdmFpbGFibGUgYW5kIGhhcyBub3QgYmVlbiBtb2RpZmllZC4KK2h0dHAuMzA1PVRoZSByZXF1ZXN0ZWQgcmVzb3VyY2UgKHswfSkgbXVzdCBiZSBhY2Nlc3NlZCB0aHJvdWdoIHRoZSBwcm94eSBnaXZlbiBieSB0aGUgIkxvY2F0aW9uIiBoZWFkZXIuCitodHRwLjQwMD1UaGUgcmVxdWVzdCBzZW50IGJ5IHRoZSBjbGllbnQgd2FzIHN5bnRhY3RpY2FsbHkgaW5jb3JyZWN0ICh7MH0pLgoraHR0cC40MDE9VGhpcyByZXF1ZXN0IHJlcXVpcmVzIEhUVFAgYXV0aGVudGljYXRpb24gKHswfSkuCitodHRwLjQwMj1QYXltZW50IGlzIHJlcXVpcmVkIGZvciBhY2Nlc3MgdG8gdGhpcyByZXNvdXJjZSAoezB9KS4KK2h0dHAuNDAzPUFjY2VzcyB0byB0aGUgc3BlY2lmaWVkIHJlc291cmNlICh7MH0pIGhhcyBiZWVuIGZvcmJpZGRlbi4KK2h0dHAuNDA0PVRoZSByZXF1ZXN0ZWQgcmVzb3VyY2UgKHswfSkgaXMgbm90IGF2YWlsYWJsZS4KK2h0dHAuNDA1PVRoZSBzcGVjaWZpZWQgSFRUUCBtZXRob2QgaXMgbm90IGFsbG93ZWQgZm9yIHRoZSByZXF1ZXN0ZWQgcmVzb3VyY2UgKHswfSkuCitodHRwLjQwNj1UaGUgcmVzb3VyY2UgaWRlbnRpZmllZCBieSB0aGlzIHJlcXVlc3QgaXMgb25seSBjYXBhYmxlIG9mIGdlbmVyYXRpbmcgcmVzcG9uc2VzIHdpdGggY2hhcmFjdGVyaXN0aWNzIG5vdCBhY2NlcHRhYmxlIGFjY29yZGluZyB0byB0aGUgcmVxdWVzdCAiYWNjZXB0IiBoZWFkZXJzICh7MH0pLgoraHR0cC40MDc9VGhlIGNsaWVudCBtdXN0IGZpcnN0IGF1dGhlbnRpY2F0ZSBpdHNlbGYgd2l0aCB0aGUgcHJveHkgKHswfSkuCitodHRwLjQwOD1UaGUgY2xpZW50IGRpZCBub3QgcHJvZHVjZSBhIHJlcXVlc3Qgd2l0aGluIHRoZSB0aW1lIHRoYXQgdGhlIHNlcnZlciB3YXMgcHJlcGFyZWQgdG8gd2FpdCAoezB9KS4KK2h0dHAuNDA5PVRoZSByZXF1ZXN0IGNvdWxkIG5vdCBiZSBjb21wbGV0ZWQgZHVlIHRvIGEgY29uZmxpY3Qgd2l0aCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgcmVzb3VyY2UgKHswfSkuCitodHRwLjQxMD1UaGUgcmVxdWVzdGVkIHJlc291cmNlICh7MH0pIGlzIG5vIGxvbmdlciBhdmFpbGFibGUsIGFuZCBubyBmb3J3YXJkaW5nIGFkZHJlc3MgaXMga25vd24uCitodHRwLjQxMT1UaGlzIHJlcXVlc3QgY2Fubm90IGJlIGhhbmRsZWQgd2l0aG91dCBhIGRlZmluZWQgY29udGVudCBsZW5ndGggKHswfSkuCitodHRwLjQxMj1BIHNwZWNpZmllZCBwcmVjb25kaXRpb24gaGFzIGZhaWxlZCBmb3IgdGhpcyByZXF1ZXN0ICh7MH0pLgoraHR0cC40MTM9VGhlIHJlcXVlc3QgZW50aXR5IGlzIGxhcmdlciB0aGFuIHRoZSBzZXJ2ZXIgaXMgd2lsbGluZyBvciBhYmxlIHRvIHByb2Nlc3MuCitodHRwLjQxND1UaGUgc2VydmVyIHJlZnVzZWQgdGhpcyByZXF1ZXN0IGJlY2F1c2UgdGhlIHJlcXVlc3QgVVJJIHdhcyB0b28gbG9uZyAoezB9KS4KK2h0dHAuNDE1PVRoZSBzZXJ2ZXIgcmVmdXNlZCB0aGlzIHJlcXVlc3QgYmVjYXVzZSB0aGUgcmVxdWVzdCBlbnRpdHkgaXMgaW4gYSBmb3JtYXQgbm90IHN1cHBvcnRlZCBieSB0aGUgcmVxdWVzdGVkIHJlc291cmNlIGZvciB0aGUgcmVxdWVzdGVkIG1ldGhvZCAoezB9KS4KK2h0dHAuNDE2PVRoZSByZXF1ZXN0ZWQgYnl0ZSByYW5nZSBjYW5ub3QgYmUgc2F0aXNmaWVkICh7MH0pLgoraHR0cC40MTc9VGhlIGV4cGVjdGF0aW9uIGdpdmVuIGluIHRoZSAiRXhwZWN0IiByZXF1ZXN0IGhlYWRlciAoezB9KSBjb3VsZCBub3QgYmUgZnVsZmlsbGVkLgoraHR0cC40MjI9VGhlIHNlcnZlciB1bmRlcnN0b29kIHRoZSBjb250ZW50IHR5cGUgYW5kIHN5bnRheCBvZiB0aGUgcmVxdWVzdCBidXQgd2FzIHVuYWJsZSB0byBwcm9jZXNzIHRoZSBjb250YWluZWQgaW5zdHJ1Y3Rpb25zICh7MH0pLgoraHR0cC40MjM9VGhlIHNvdXJjZSBvciBkZXN0aW5hdGlvbiByZXNvdXJjZSBvZiBhIG1ldGhvZCBpcyBsb2NrZWQgKHswfSkuCitodHRwLjUwMD1UaGUgc2VydmVyIGVuY291bnRlcmVkIGFuIGludGVybmFsIGVycm9yICh7MH0pIHRoYXQgcHJldmVudGVkIGl0IGZyb20gZnVsZmlsbGluZyB0aGlzIHJlcXVlc3QuCitodHRwLjUwMT1UaGUgc2VydmVyIGRvZXMgbm90IHN1cHBvcnQgdGhlIGZ1bmN0aW9uYWxpdHkgbmVlZGVkIHRvIGZ1bGZpbGwgdGhpcyByZXF1ZXN0ICh7MH0pLgoraHR0cC41MDI9VGhpcyBzZXJ2ZXIgcmVjZWl2ZWQgYW4gaW52YWxpZCByZXNwb25zZSBmcm9tIGEgc2VydmVyIGl0IGNvbnN1bHRlZCB3aGVuIGFjdGluZyBhcyBhIHByb3h5IG9yIGdhdGV3YXkgKHswfSkuCitodHRwLjUwMz1UaGUgcmVxdWVzdGVkIHNlcnZpY2UgKHswfSkgaXMgbm90IGN1cnJlbnRseSBhdmFpbGFibGUuCitodHRwLjUwND1UaGUgc2VydmVyIHJlY2VpdmVkIGEgdGltZW91dCBmcm9tIGFuIHVwc3RyZWFtIHNlcnZlciB3aGlsZSBhY3RpbmcgYXMgYSBnYXRld2F5IG9yIHByb3h5ICh7MH0pLgoraHR0cC41MDU9VGhlIHNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IHRoZSByZXF1ZXN0ZWQgSFRUUCBwcm90b2NvbCB2ZXJzaW9uICh7MH0pLgoraHR0cC41MDc9VGhlIHJlc291cmNlIGRvZXMgbm90IGhhdmUgc3VmZmljaWVudCBzcGFjZSB0byByZWNvcmQgdGhlIHN0YXRlIG9mIHRoZSByZXNvdXJjZSBhZnRlciBleGVjdXRpb24gb2YgdGhpcyBtZXRob2QgKHswfSkuCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdmFsdmVzL0xvY2FsU3RyaW5nc19lcy5wcm9wZXJ0aWVzIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3ZhbHZlcy9Mb2NhbFN0cmluZ3NfZXMucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODg0NzYxCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3ZhbHZlcy9Mb2NhbFN0cmluZ3NfZXMucHJvcGVydGllcwpAQCAtMCwwICsxLDY5IEBACithY2Nlc3NMb2dWYWx2ZS5hbHJlYWR5U3RhcnRlZD1FbCBSZWdpc3RyYWRvciBkZSBhY2Nlc29zIHlhIHNlIGhhYu1hIGluaWNpYWRvCithY2Nlc3NMb2dWYWx2ZS5ub3RTdGFydGVkPUVsIFJlZ2lzdHJhZG9yIGRlIGFjY2Vzb3Mgbm8gc2UgaGEgaW5pY2lhZG8KK2NlcnRpZmljYXRlc1ZhbHZlLmFscmVhZHlTdGFydGVkPUxhIHbhbHZ1bGEgZGUgY2VydGlmaWNhZG9zIHlhIHNlIGhhYu1hIGluaWNpYWRvCitjZXJ0aWZpY2F0ZXNWYWx2ZS5ub3RTdGFydGVkPUxhIHbhbHZ1bGEgZGUgY2VydGlmaWNhZG9zIG5vIHNlIGhhIGluaWNpYWRvCitpbnRlcmNlcHRvclZhbHZlLmFscmVhZHlTdGFydGVkPUxhIHbhbHZ1bGEgaW50ZXJjZXB0b3JhIHlhIHNlIGhhYu1hIGluaWNpYWRvCitpbnRlcmNlcHRvclZhbHZlLm5vdFN0YXJ0ZWQ9TGEgduFsdnVsYSBpbnRlcmNlcHRvcmEgbm8gc2UgaGEgaW5pY2lhZG8KK3JlcXVlc3RGaWx0ZXJWYWx2ZS5uZXh0PU5vIGhheSAnc2lndWllbnRlJyB24Wx2dWxhIGNvbmZpZ3VyYWRhCityZXF1ZXN0RmlsdGVyVmFsdmUuc3ludGF4PUVycm9yIGRlIHNpbnTheGlzIGVuIHBldGljafNuIGRlIGZpbHRybyBwYXRy824gezB9CityZXF1ZXN0TGlzdGVuZXJWYWx2ZS5yZXF1ZXN0SW5pdD1VbmEgZXhjZXBjafNuIGR1cmFudGUgZWwgZW527W8gZGUgcmVxdWVyaW1pZW50byBoYSBpbmljaWFkbyB1biBldmVudG8gZGUgY2ljbG8gZGUgdmlkYSAobGlmZWN5Y2xlIGV2ZW50KSBwYXJhIGxhIGluc3RhbmNpYSBkZSBjbGFzZSBhIGxhIGVzY3VjaGEgKGxpc3RlbmVyKSB7MH0KK3JlcXVlc3RMaXN0ZW5lclZhbHZlLnJlcXVlc3REZXN0cm95PVVuYSBleGNlcGNp824gZHVyYW50ZSBlbCBlbnbtbyBkZSByZXF1ZXJpbWllbnRvIGhhIGRlc3Ryde1kbyB1biBldmVudG8gZGUgY2ljbG8gZGUgdmlkYSAobGlmZWN5Y2xlIGV2ZW50KSBwYXJhIGxhIGluc3RhbmNpYSBkZSBjbGFzZSBhIGxhIGVzY3VjaGEgKGxpc3RlbmVyKSB7MH0KK3ZhbHZlQmFzZS5ub05leHQ9RXJyb3IgZGUgY29uZmlndXJhY2nzbjogTm8gaGF5ICdzaWd1aWVudGUnIHbhbHZ1bGEgY29uZmlndXJhZGEKK2pkYmNBY2Nlc3NMb2dWYWx2ZS5leGNlcHRpb249RXhjZXBjafNuIHJlYWxpemFuZG8gZW50cmFkYSBkZSBhY2Nlc28gYSBpbnNlcmNp824KK2pkYmNBY2Nlc3NMb2dWYWx2ZS5jbG9zZT1FeGNlcGNp824gY2VycmFuZG8gY29uZXhp824gYSBiYXNlIGRlIGRhdG9zCisKKyMgRXJyb3IgcmVwb3J0IHZhbHZlCitlcnJvclJlcG9ydFZhbHZlLmVycm9yUmVwb3J0PUluZm9ybWUgZGUgRXJyb3IKK2Vycm9yUmVwb3J0VmFsdmUuc3RhdHVzSGVhZGVyPUVzdGFkbyBIVFRQIHswfSAtIHsxfQorZXJyb3JSZXBvcnRWYWx2ZS5leGNlcHRpb25SZXBvcnQ9SW5mb3JtZSBkZSBFeGNlcGNp824KK2Vycm9yUmVwb3J0VmFsdmUuc3RhdHVzUmVwb3J0PUluZm9ybWUgZGUgZXN0YWRvCitlcnJvclJlcG9ydFZhbHZlLm1lc3NhZ2U9bWVuc2FqZQorZXJyb3JSZXBvcnRWYWx2ZS5kZXNjcmlwdGlvbj1kZXNjcmlwY2nzbgorZXJyb3JSZXBvcnRWYWx2ZS5leGNlcHRpb249ZXhjZXBjafNuCitlcnJvclJlcG9ydFZhbHZlLnJvb3RDYXVzZT1jYXVzYSByYe16CitlcnJvclJlcG9ydFZhbHZlLm5vdGU9bm90YQorZXJyb3JSZXBvcnRWYWx2ZS5yb290Q2F1c2VJbkxvZ3M9TGEgdHJhemEgY29tcGxldGEgZGUgbGEgY2F1c2EgZGUgZXN0ZSBlcnJvciBzZSBlbmN1ZW50cmEgZW4gbG9zIGFyY2hpdm9zIGRlIGRpYXJpbyBkZSB7MH0uCisKKyMgSFRUUCBzdGF0dXMgcmVwb3J0cworaHR0cC4xMDA9RWwgY2xpZW50ZSBwdWVkZSBjb250aW51YXIgKHswfSkuCitodHRwLjEwMT1FbCBzZXJ2aWRvciBlc3ThIGNvbm11dGFuZG8gcHJvdG9jb2xvcyBjb24gYXJyZWdsbyBhIGxhIGNhYmVjZXJhICJVcGdyYWRlIiAoezB9KS4KK2h0dHAuMjAxPUVsIHJlcXVlcmltaWVudG8gdHV2byDpeGl0byB5IHVuIG51ZXZvIHJlY3Vyc28gKHswfSkgaGEgc2lkbyBjcmVhZG8gZW4gZWwgc2Vydmlkb3IuCitodHRwLjIwMj1Fc3RlIHJlcXVlcmltaWVudG8gaGEgc2lkbyBhY2VwdGFkbyBwYXJhIHNlciBwcm9jZXNhZG8sIHBlcm8gbm8gaGEgc2lkbyBjb21wbGV0YWRvICh7MH0pLgoraHR0cC4yMDM9TGEgaW5mb3JtYWNp824gbWV0YSBwcmVzZW50YWRhIHBvciBlbCBjbGllbnRlIG5vIHNlIG9yaWdpbvMgZGVzZGUgZWwgc2Vydmlkb3IgKHswfSkuCitodHRwLjIwND1FbCByZXF1ZXJpbWllbnRvIHR1dm8g6XhpdG8gcGVybyBubyBoYXkgaW5mb3JtYWNp824gcXVlIGRldm9sdmVyICh7MH0pLgoraHR0cC4yMDU9RWwgY2xpZW50ZSBubyBkZWJlcu1hIGRlIGxpbXBpYXIgbGEgdmlzdGEgZGVsIGRvY3VtZW50byBxdWUgY2F1c/MgcXVlIGVzdGUgcmVxdWVyaW1pZW50byBmdWVyYSBlbnZpYWRvICh7MH0pLgoraHR0cC4yMDY9RWwgc2Vydmlkb3IgaGEgcmVsbGVuYWRvIHBhY2nhbG1lbnRlIHVuIHJlcXVlcmltaWVudG8gR0VUIHBhcmEgZXN0ZSByZWN1cnNvICh7MH0pLgoraHR0cC4yMDc9U2UgaGFuIGRldnVlbHRvIHZhbG9yZXMgbfpsdGlwbGVzIGRlIGVzdGFkbyAoezB9KS4KK2h0dHAuMzAwPUVsIHJlY3Vyc28gcmVxdWVyaWRvICh7MH0pIGNvcnJlc3BvbmRlIGEgdW5hIGN1YWxxdWllcmEgZGUgdW4gY29uanVudG8gZGUgcmVwcmVzZW50YWNpb25lcywgY2FkYSB1bmEgY29uIHN1IHByb3BpYSBsb2NhbGl6YWNp824gZXNwZWPtZmljYS4KK2h0dHAuMzAxPUVsIHJlY3Vyc28gcmVxdWVyaWRvICh7MH0pIGhhIHNpZG8gbW92aWRvIHBlcm1hbuludGVtZW50ZSBhIHVuYSBudWV2YSBsb2NhbGl6YWNp824uCitodHRwLjMwMj1FbCByZWN1cnNvIHJlcXVlcmlkbyAoezB9KSBoYSBzaWRvIG1vdmlkbyB0ZW1wb3LhbG1lbnRlIGEgdW5hIG51ZXZhIGxvY2FsaXphY2nzbi4KK2h0dHAuMzAzPUxhIHJlc3B1ZXN0YSBhIGVzdGUgcmVxdWVyaW1pZW50byBzZSBwdWVkZSBoYWxsYXIgYmFqbyB1bmEgVVJJIGRpZmVyZW50ZSAoezB9KS4KK2h0dHAuMzA0PUVsIHJlY3Vyc28gcmVxdWVyaWRvICh7MH0pIGVzdOEgZGlzcG9uaWJsZSB5IG5vIGhhIHNpZG8gbW9kaWZpY2Fkby4KK2h0dHAuMzA1PUVsIHJlY3Vyc28gcmVxdWVyaWRvICh7MH0pIGRlYmUgZGUgc2VyIGFjY2VkaWRvIGEgdHJhdulzIGRlbCBhcG9kZXJhZG8gKHByb3h5KSBkYWRvIG1lZGlhbnRlIGxhIGNhYmVjZXJhICJMb2NhdGlvbiIuCitodHRwLjQwMD1FbCByZXF1ZXJpbWllbnRvIGVudmlhZG8gcG9yIGVsIGNsaWVudGUgZXJhIHNpbnThY3RpY2FtZW50ZSBpbmNvcnJlY3RvICh7MH0pLgoraHR0cC40MDE9RXN0ZSByZXF1ZXJpbWllbnRvIHJlcXVpZXJlIGF1dGVudGljYWNp824gSFRUUCAoezB9KS4KK2h0dHAuNDAyPVNlIHJlcXVpZXJlIHBhZ28gcGFyYSBhY2NlZGVyIGEgZXN0ZSByZWN1cnNvICh7MH0pLgoraHR0cC40MDM9RWwgYWNjZXNvIGFsIHJlY3Vyc28gZXNwZWNpZmljYWRvICh7MH0pIGhhIHNpZG8gcHJvaGliaWRvLgoraHR0cC40MDQ9RWwgcmVjdXJzbyByZXF1ZXJpZG8gKHswfSkgbm8gZXN04SBkaXNwb25pYmxlLgoraHR0cC40MDU9RWwgbel0b2RvIEhUVFAgZXNwZWNpZmljYWRvIG5vIGVzdOEgcGVybWl0aWRvIHBhcmEgZWwgcmVjdXJzbyByZXF1ZXJpZG8gKHswfSkuCitodHRwLjQwNj1FbCByZWN1cnNvIGlkZW50aWZpY2FkbyBwb3IgZXN0ZSByZXF1ZXJpbWllbnRvIHPzbG8gZXMgY2FwYXogZGUgZ2VuZXJhciByZXNwdWVzdGFzIGNvbiBjYXJhY3Rlcu1zdGljYXMgbm8gYWNlcHRhYmxlcyBjb24gYXJyZWdsbyBhIGxhcyBjYWJlY2VyYXMgImFjY2VwdCIgZGUgcmVxdWVyaW1pZW50byAoezB9KS4KK2h0dHAuNDA3PUVsIGNsaWVudGUgZGViZSBkZSBzZXIgcHJpbWVybyBhdXRlbnRpY2FkbyBlbiBlbCBhcG9kZXJhZG8gKHswfSkuCitodHRwLjQwOD1FbCBjbGllbnRlIG5vIHByb2R1am8gdW4gcmVxdWVyaW1pZW50byBkZW50cm8gZGVsIHRpZW1wbyBlbiBxdWUgZWwgc2Vydmlkb3IgZXN0YWJhIHByZXBhcmFkbyBlc3BlcmFuZG8gKHswfSkuCitodHRwLjQwOT1FbCByZXF1ZXJpbWllbnRvIG5vIHB1ZG8gc2VyIGNvbXBsZXRhZG8gZGViaWRvIGEgdW4gY29uZmxpY3RvIGNvbiBlbCBlc3RhZG8gYWN0dWFsIGRlbCByZWN1cnNvICh7MH0pLgoraHR0cC40MTA9RWwgcmVjdXJzbyByZXF1ZXJpZG8gKHswfSkgeWEgbm8gZXN04SBkaXNwb25pYmxlIHkgbm8gc2UgY29ub2NlIGRpcmVjY2nzbiBkZSByZWVudu1vLgoraHR0cC40MTE9RXN0ZSByZXF1ZXJpbWllbnRvIG5vIHB1ZWRlIHNlciBtYW5lamFkbyBzaW4gdW4gdGFtYfFvIGRlZmluaWRvIGRlIGNvbnRlbmlkbyAoezB9KS4KK2h0dHAuNDEyPVVuYSBwcmVjb25kaWNp824gZXNwZWNpZmljYWRhIGhhIGZhbGxhZG8gcGFyYSBlc3RlIHJlcXVlcmltaWVudG8gKHswfSkuCitodHRwLjQxMz1MYSBlbnRpZGFkIGRlIHJlcXVlcmltaWVudG8gZXMgbWF5b3IgZGUgbG8gcXVlIGVsIHNlcnZpZG9yIHF1aWVyZSBvIHB1ZWRlIHByb2Nlc2FyLgoraHR0cC40MTQ9RWwgc2Vydmlkb3IgcmVjaGF68yBlc3RlIHJlcXVlcmltaWVudG8gcG9ycXVlIGxhIFVSSSByZXF1ZXJpZGEgZXJhIGRlbWFzaWFkbyBsYXJnYSAoezB9KS4KK2h0dHAuNDE1PUVsIHNlcnZpZG9yIHJlY2hhevMgZXN0ZSByZXF1ZXJpbWllbnRvIHBvcnF1ZSBsYSBlbnRpZGFkIHJlcXVlcmlkYSBzZSBlbmN1ZW50cmEgZW4gdW4gZm9ybWF0byBubyBzb3BvcnRhZG8gcG9yIGVsIHJlY3Vyc28gcmVxdWVyaWRvIHBhcmEgZWwgbel0b2RvIHJlcXVlcmlkbyAoezB9KS4KK2h0dHAuNDE2PUVsIHJhbmdvIGRlIGJ5dGUgcmVxdWVyaWRvIG5vIHB1ZWRlIHNlciBzYXRpc2ZlY2hvICh7MH0pLgoraHR0cC40MTc9TG8gcXVlIHNlIGVzcGVyYSBkYWRvIHBvciBsYSBjYWJlY2VyYSAiRXhwZWN0IiBkZSByZXF1ZXJpbWllbnRvICh7MH0pIG5vIHB1ZG8gc2VyIGNvbXBsZXRhZG8uCitodHRwLjQyMj1FbCBzZXJ2aWRvciBlbnRlbmRp8yBlbCB0aXBvIGRlIGNvbnRlbmlkbyB5IGxhIHNpbnTheGlzIGRlbCByZXF1ZXJpbWllbnRvIHBlcm8gbm8gcHVkbyBwcm9jZXNhciBsYXMgaW5zdHJ1Y2Npb25lcyBjb250ZW5pZGFzICh7MH0pLgoraHR0cC40MjM9TGEgZnVlbnRlIG8gcmVjdXJzbyBkZSBkZXN0aW5vIGRlIHVuIG3pdG9kbyBlc3ThIGJsb3F1ZWFkYSAoezB9KS4KK2h0dHAuNTAwPUVsIHNlcnZpZG9yIGVuY29udHLzIHVuIGVycm9yIGludGVybm8gKHswfSkgcXVlIGhpem8gcXVlIG5vIHB1ZGllcmEgcmVsbGVuYXIgZXN0ZSByZXF1ZXJpbWllbnRvLgoraHR0cC41MDE9RWwgc2Vydmlkb3Igbm8gc29wb3J0YSBsYSBmdW5jaW9uYWxpZGFkIG5lY2VzYXJpYSBwYXJhIHJlbGxlbmFyIGVzdGUgcmVxdWVyaW1pZW50byAoezB9KS4KK2h0dHAuNTAyPUVzdGUgc2Vydmlkb3IgcmVjaWJp8yB1bmEgcmVzcHVlc3RhIGluduFsaWRhIGRlc2RlIHVuIHNlcnZpZG9yIHF1ZSBjb25zdWx08yBjdWFuZG8gYWN0dWFiYSBjb21vIGFwb2RlcmFkbyBvIHBhc2FyZWxhICh7MH0pLgoraHR0cC41MDM9RWwgc2VydmljaW8gcmVxdWVyaWRvICh7MH0pIG5vIGVzdOEgZGlzcG9uaWJsZSBlbiBlc3RlIG1vbWVudG8uCitodHRwLjUwND1FbCBzZXJ2aWRvciByZWNpYmnzIHVuIFRpZW1wbyBBZ290YWRvIGRlc2RlIHVuIHNlcnZpZG9yIHN1cGVyaW9yIGN1YW5kbyBhY3R1YWJhIGNvbW8gcGFzYXJlbGEgbyBhcG9kZXJhZG8gKHswfSkuCitodHRwLjUwNT1FbCBzZXJ2aWRvciBubyBzb3BvcnRhIGxhIHZlcnNp824gZGUgcHJvdG9jb2xvIEhUVFAgcmVxdWVyaWRhICh7MH0pLgoraHR0cC41MDc9RWwgcmVjdXJzbyBubyB0aWVuZSBlc3BhY2lvIHN1ZmljaWVudGUgcGFyYSByZWdpc3RyYXIgZWwgZXN0YWRvIGRlbCByZWN1cnNvIHRyYXMgbGEgZWplY3VjafNuIGRlIGVzdGUgbel0b2RvICh7MH0pLgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3ZhbHZlcy9Mb2NhbFN0cmluZ3NfZnIucHJvcGVydGllcyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS92YWx2ZXMvTG9jYWxTdHJpbmdzX2ZyLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQzNDc4YgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS92YWx2ZXMvTG9jYWxTdHJpbmdzX2ZyLnByb3BlcnRpZXMKQEAgLTAsMCArMSw2NyBAQAorYWNjZXNzTG9nVmFsdmUuYWxyZWFkeVN0YXJ0ZWQ9TGUgdHJhY2V1ciBkJydhY2PocyBhIGTpauAg6XTpIGTpbWFycukKK2FjY2Vzc0xvZ1ZhbHZlLm5vdFN0YXJ0ZWQ9TGUgdHJhY2V1ciBkJydhY2PocyBuJydhIHBhcyBlbmNvcmUg6XTpIGTpbWFycukKK2NlcnRpZmljYXRlc1ZhbHZlLmFscmVhZHlTdGFydGVkPUxhIFZhbHZlIGRlIENlcnRpZmljYXRzIGEgZOlq4CDpdOkgZOltYXJy6WUKK2NlcnRpZmljYXRlc1ZhbHZlLm5vdFN0YXJ0ZWQ9TGEgVmFsdmUgZGUgQ2VydGlmaWNhdHMgbicnYSBwYXMgZW5jb3JlIOl06SBk6W1hcnLpZQoraW50ZXJjZXB0b3JWYWx2ZS5hbHJlYWR5U3RhcnRlZD1MYSBWYWx2ZSBkJydJbnRlcmNlcHRpb24gYSBk6WrgIOl06SBk6W1hcnLpCitpbnRlcmNlcHRvclZhbHZlLm5vdFN0YXJ0ZWQ9TGEgVmFsdmUgZCcnSW50ZXJjZXB0aW9uIG4nJ2EgcGFzIGVuY29yZSDpdOkgZOltYXJy6WUKK3JlcXVlc3RGaWx0ZXJWYWx2ZS5uZXh0PUF1Y3VuZSBWYWx2ZSAnc3VpdmFudGUnIG4nJ2Eg6XTpIGNvbmZpZ3Vy6WUKK3JlcXVlc3RGaWx0ZXJWYWx2ZS5zeW50YXg9RXJyZXVyIGRlIHN5bnRoYXhlIGRhbnMgbGUgcGF0dGVybiBkZSBmaWx0cmUgZGUgcmVxdep0ZSB7MH0KK3JlcXVlc3RMaXN0ZW5lclZhbHZlLnJlcXVlc3RJbml0PVVuZSBleGNlcHRpb24gbG9ycyBkZSBsJydlbnZvaSBkZSByZXF16nRlIGEgaW5pdGnpIHVuIOl26G5lbWVudCBjeWNsZSBkZSB2aWUgKGxpZmVjeWNsZSBldmVudCkgcG91ciBsJydpbnN0YW5jZSBkZSBjbGFzc2Ug4CBsJ+ljb3V0ZSAobGlzdGVuZXIpIHswfQorcmVxdWVzdExpc3RlbmVyVmFsdmUucmVxdWVzdERlc3Ryb3k9VW5lIGV4Y2VwdGlvbiBsb3JzIGRlIGwnJ2Vudm9pIGRlIHJlcXXqdGUgYSBk6XRydWl0IHVuIOl26G5lbWVudCBjeWNsZSBkZSB2aWUgKGxpZmVjeWNsZSBldmVudCkgcG91ciBsJydpbnN0YW5jZSBkZSBjbGFzc2Ug4CBsJ+ljb3V0ZSAobGlzdGVuZXIpIHswfQordmFsdmVCYXNlLm5vTmV4dD1FcnJldXIgZGUgY29uZmlndXJhdGlvbiBlcnJvcjogQXVjdW5lIFZhbHZlICdzdWl2YW50ZScgbicnYSDpdOkgY29uZmlndXLpZQorCisjIEVycm9yIHJlcG9ydCB2YWx2ZQorZXJyb3JSZXBvcnRWYWx2ZS5lcnJvclJlcG9ydD1SYXBwb3J0IGQnJ2VycmV1cgorZXJyb3JSZXBvcnRWYWx2ZS5zdGF0dXNIZWFkZXI9RXRhdCBIVFRQIHswfSAtIHsxfQorZXJyb3JSZXBvcnRWYWx2ZS5leGNlcHRpb25SZXBvcnQ9UmFwcG9ydCBkJydleGNlcHRpb24KK2Vycm9yUmVwb3J0VmFsdmUuc3RhdHVzUmVwb3J0PVJhcHBvcnQgZCcn6XRhdAorZXJyb3JSZXBvcnRWYWx2ZS5tZXNzYWdlPW1lc3NhZ2UKK2Vycm9yUmVwb3J0VmFsdmUuZGVzY3JpcHRpb249ZGVzY3JpcHRpb24KK2Vycm9yUmVwb3J0VmFsdmUuZXhjZXB0aW9uPWV4Y2VwdGlvbgorZXJyb3JSZXBvcnRWYWx2ZS5yb290Q2F1c2U9Y2F1c2UgbehyZQorZXJyb3JSZXBvcnRWYWx2ZS5ub3RlPW5vdGUKK2Vycm9yUmVwb3J0VmFsdmUucm9vdENhdXNlSW5Mb2dzPUxhIHRyYWNlIGNvbXBs6HRlIGRlIGxhIGNhdXNlIG3ocmUgZGUgY2V0dGUgZXJyZXVyIGVzdCBkaXNwb25pYmxlIGRhbnMgbGVzIGZpY2hpZXJzIGpvdXJuYXV4IGRlIHswfS4KKworIyBIVFRQIHN0YXR1cyByZXBvcnRzCitodHRwLjEwMD1MZSBjbGllbnQgcGV1dCBjb250aW51ZXIgKHswfSkuCitodHRwLjEwMT1MZSBzZXJ2ZXVyIGNoYW5nZSBkZSBwcm90b2NvbGVzIHN1aXZhbnQgbGEgZGlyZWN0aXZlICJVcGdyYWRlIiBkZSBsJydlbnTqdGUgKHswfSkuCitodHRwLjIwMT1MYSByZXF16nRlIGEgcul1c3NpIGV0IHVuZSBub3V2ZWxsZSByZXNzb3VyY2UgKHswfSkgYSDpdOkgY3LpZWUgc3VyIGxlIHNlcnZldXIuCitodHRwLjIwMj1MYSByZXF16nRlIGEg6XTpIGFjY2VwdOkgcG91ciB0cmFpdGVtZW50LCBtYWlzIG4nJ2EgcGFzIOl06SB0ZXJtaW7pZSAoezB9KS4KK2h0dHAuMjAzPUwnJ2luZm9ybWF0aW9uIG1ldGEgcHLpc2VudOllIHBhciBsZSBjbGllbnQgbicnYSBwYXMgcG91ciBvcmlnaW5lIGNlIHNlcnZlciAoezB9KS4KK2h0dHAuMjA0PUxhIHJlcXXqdGUgYSBy6XVzc2kgbWFpcyBpbCBuJyd5IGEgYXVjdW5lIGluZm9ybWF0aW9uIOAgcmV0b3VybmVyICh7MH0pLgoraHR0cC4yMDU9TGUgY2xpZW50IGRvaXQgcmVtZXR0cmUg4CB66XJvIGxhIHZ1ZSBkZSBkb2N1bWVudCBxdWkgYSBjYXVz6WUgbCcnZW52b2kgZGUgY2V0dGUgcmVxdep0ZSAoezB9KS4KK2h0dHAuMjA2PUxlIHNlcnZldXIgYSBzYXRpc2ZhaXQgdW5lIHJlcXXqdGUgR0VUIHBhcnRpZWxsZSBwb3VyIGNldHRlIHJlc3NvdXJjZSAoezB9KS4KK2h0dHAuMjA3PVBsdXNpZXVycyB2YWxldXJzIGQnJ+l0YXRzIG9udCDpdOkgcmV0b3VybullcyAoezB9KS4KK2h0dHAuMzAwPUxhIHJlc3NvdXJjZSBkZW1hbmTpZSAoezB9KSBjb3JyZXNwb25kIOAgcGx1c2lldXJzIHJlcHLpc2VudGF0aW9ucywgY2hhY3VuZSBhdmVjIHNhIHByb3ByZSBsb2NhbGlzYXRpb24uCitodHRwLjMwMT1MYSByZXNzb3VyY2UgZGVtYW5k6WUgKHswfSkgYSDpdOkgZOlwbGFj6WUgZGUgZmHnb24gcGVybWFuZW50ZSB2ZXJzIHVuZSBub3V2ZWxsZSBsb2NhbGlzYXRpb24uCitodHRwLjMwMj1MYSByZXNzb3VyY2UgZGVtYW5k6WUgKHswfSkgYSDpdOkgZOlwbGFj6WUgZGUgZmHnb24gdGVtcG9yYWlyZSB2ZXJzIHVuZSBub3V2ZWxsZSBsb2NhbGlzYXRpb24uCitodHRwLjMwMz1MYSBy6XBvbnNlIOAgY2V0dGUgcmVxdep0ZSBwZXV0IOp0cmUgdHJvdXbpZSDgIHVuZSBVUkkgZGlmZulyZW50ZSAoezB9KS4KK2h0dHAuMzA0PUxhIHJlc3NvdXJjZSBkZW1hbmTpZSAoezB9KSBlc3QgZGlzcG9uaWJsZSBldCBuJydhIHBhcyDpdOkgbW9kaWZp6WUuCitodHRwLjMwNT1MYSByZXNzb3VyY2UgZGVtYW5k6WUgKHswfSkgZG9pdCDqdHJlIGFjY+lk6WUgYXUgdHJhdmVycyBkdSByZWxhaXMgaW5kaXF16SBwYXIgbGEgZGlyZWN0aXZlICJMb2NhdGlvbiIgZGUgbCcnZW506nRlLgoraHR0cC40MDA9TGEgcmVxdep0ZSBlbnZveellIHBhciBsZSBjbGllbnQg6XRhaXQgc3ludGF4aXF1ZW1lbnQgaW5jb3JyZWN0ZSAoezB9KS4KK2h0dHAuNDAxPUxhIHJlcXXqdGUgbuljZXNzaXRlIHVuZSBhdXRoZW50aWZpY2F0aW9uIEhUVFAgKHswfSkuCitodHRwLjQwMj1VbiBwYWllbWVudCBlc3QgZGVtYW5k6SBwb3VyIGFjY+lkZXIg4CBjZXR0ZSByZXNzb3VyY2UgKHswfSkuCitodHRwLjQwMz1MJydhY2PocyDgIGxhIHJlc3NvdXJjZSBkZW1hbmTpZSAoezB9KSBhIOl06SBpbnRlcmRpdC4KK2h0dHAuNDA0PUxhIHJlc3NvdXJjZSBkZW1hbmTpZSAoezB9KSBuJydlc3QgcGFzIGRpc3BvbmlibGUuCitodHRwLjQwNT1MYSBt6XRob2RlIEhUVFAgc3DpY2lmaellIG4nJ2VzdCBwYXMgYXV0b3Jpc+llIHBvdXIgbGEgcmVzc291cmNlIGRlbWFuZOllICh7MH0pLgoraHR0cC40MDY9TGEgcmVzc291cmNlIGlkZW50aWZp6WUgcGFyIGNldHRlIHJlcXXqdGUgbicnZXN0IGNhcGFibGUgZGUgZ+lu6XJlciBkZXMgculwb25zZXMgcXUnJ2F2ZWMgZGVzIGNhcmFjdOlyaXN0aXF1ZXMgaW5jb21wYXRpYmxlIGF2ZWMgbGEgZGlyZWN0aXZlICJhY2NlcHQiIHBy6XNlbnRlIGRhbnMgbCcnZW506nRlIGRlIHJlcXXqdGUgKHswfSkuCitodHRwLjQwNz1MZSBjbGllbnQgZG9pdCBkJydhYm9yZCBzJydhdXRoZW50aWZpZXIgYXVwcuhzIGR1IHJlbGFpcyAoezB9KS4KK2h0dHAuNDA4PUxlIGNsaWVudCBuJydhIHBhcyBwcm9kdWl0IGRlIHJlcXXqdGUgcGVuZGFudCBsZSB0ZW1wcyBkJydhdHRlbnRlIGR1IHNlcnZldXIgKHswfSkuCitodHRwLjQwOT1MYSByZXF16nRlIG5lIHBldXQg6nRyZSBmaW5hbGlz6WUgc3VpdGUg4CB1biBjb25mbGl0IGxp6SDgIGwnJ+l0YXQgZGUgbGEgcmVzc291cmNlICh7MH0pLgoraHR0cC40MTA9TGEgcmVzc291cmNlIGRlbWFuZOllICh7MH0pIG4nJ2VzdCBwYXMgZGlzcG9uaWJsZSwgZXQgYXVjdW5lIGFkZHJlc3NlIGRlIHJlYm9uZCAoZm9yd2FyZGluZykgbicnZXN0IGNvbm51ZS4KK2h0dHAuNDExPUxhIHJlcXXqdGUgbmUgcGV1dCDqdHJlIHRyYWl06WUgc2FucyBk6WZpbml0aW9uIGQnJ3VuZSB0YWlsbGUgZGUgY29udGVudSAoY29udGVudCBsZW5ndGgpICh7MH0pLgoraHR0cC40MTI9VW5lIGNvbmRpdGlvbiBwculhbGFibGUgZGVtYW5k6WUgYSDpY2hvdellIHBvdXIgY2V0dGUgcmVxdep0ZSAoezB9KS4KK2h0dHAuNDEzPUwnZW50aXTpIGRlIHJlcXXqdGUgZXN0IHBsdXMgaW1wb3J0YW50ZSBxdWUgY2UgcXVlIGxlIHNlcnZldXIgdmV1dCBvdSBwZXV0IHRyYWl0ZXIuCitodHRwLjQxND1MZSBzZXJ2ZXVyIGEgcmVmdXPpIGNldHRlIHJlcXXqdGUgY2FyIFVSSSBkZSByZXF16nRlIGVzdCB0cm9wIGxvbmd1ZSAoezB9KS4KK2h0dHAuNDE1PUxlIHNlcnZldXIgYSByZWZ1c+kgY2V0dGUgcmVxdep0ZSBjYXIgbCcnZW50aXTpIGRlIHJlcXXqdGUgZXN0IGRhbnMgdW4gZm9ybWF0IG5vbiBzdXBwb3J06SBwYXIgbGEgcmVzc291cmNlIGRlbWFuZOllIGF2ZWMgbGEgbel0aG9kZSBzcOljaWZp6WUgKHswfSkuCitodHRwLjQxNj1MYSBwbGFjZSBkJ29jdGV0cyAoYnl0ZSByYW5nZSkgbmUgcGV1dCDqdHJlIHNhdGlzZmFpdGUgKHswfSkuCitodHRwLjQxNz1MJydhdHRlbnRlIGluZGlxdekgZGFucyBsYSBkaXJlY3RpdmUgIkV4cGVjdCIgZGUgbCcnZW506nRlIGRlIHJlcXXqdGUgKHswfSkgbmUgcGV1dCDqdHJlIHNhdGlzZmFpdGUuCitodHRwLjQyMj1MZSBzZXJ2ZXVyIGEgY29tcHJpcyBsZSB0eXBlIGRlIGNvbnRlbnUgKGNvbnRlbnQgdHlwZSkgYWluc2kgcXVlIGxhIHN5bnRoYXhlIGRlIGxhIHJlcXXqdGUgbWFpcyBhIOl06SBpbmNhcGFibGUgZGUgdHJhaXRlciBsZXMgaW5zdHJ1Y3Rpb25zIGNvbnRlbnVlcyAoezB9KS4KK2h0dHAuNDIzPUxhIHJlc3NvdXJjZSBzb3VyY2Ugb3UgZGVzdGluYXRpb24gZGUgbGEgbel0aG9kZSBlc3Qgdulycm91aWxs6WUgKHswfSkuCitodHRwLjUwMD1MZSBzZXJ2ZXVyIGEgcmVuY29udHLpIHVuZSBlcnJldXIgaW50ZXJuZSAoezB9KSBxdWkgbCcnYSBlbXDqY2jpIGRlIHNhdGlzZmFpcmUgbGEgcmVxdep0ZS4KK2h0dHAuNTAxPUxlIHNlcnZldXIgbmUgc3VwcG9ydGUgcGFzIGxhIGZvbmN0aW9ubmFsaXTpIGRlbWFuZOllIHBvdXIgc2F0aXNmYWlyZSBjZXR0ZSByZXF16nRlICh7MH0pLgoraHR0cC41MDI9TGUgc2VydmV1ciBhIHJl53UgdW5lIHLpcG9uc2UgaW52YWxpZGUgZCd1biBzZXJ2ZXVyIHF1JydpbCBjb25zdWx0YWl0IGVuIHRhbnQgcXVlIHJlbGFpcyBvdSBwYXNzZXJlbGxlICh7MH0pLgoraHR0cC41MDM9TGUgc2VydmljZSBkZW1hbmTpICh7MH0pIG4nJ2VzdCBwYXMgZGlzcG9uaWJsZSBhY3R1ZWxsZW1lbnQuCitodHRwLjUwND1MZSBzZXJ2ZXVyIGEgcmXndSB1biBk6XBhc3NlbWVudCBkZSBkZWxhaXMgKHRpbWVvdXQpIGQnJ3VuIHNlcnZldXIgYW1vbnQgcXUnJ2lsIGNvbnN1bHRhaXQgZW4gdGFudCBxdWUgcmVsYWlzIG91IHBhc3NlcmVsbGUgKHswfSkuCitodHRwLjUwNT1MZSBzZXJ2ZXVyIG5lIHN1cHBvcnRlIHBhcyBsYSB2ZXJzaW9uIGRlIHByb3RvY29sZSBIVFRQIGRlbWFuZOkgKHswfSkuCitodHRwLjUwNz1MYSByZXNzb3VyY2UgbicnYSBwYXMgYXNzZXogZCcnZXNwYWNlIHBvdXIgZW5yZWdpc3RyZXIgbCcn6XRhdCBkZSBsYSByZXNzb3VyY2UgYXBy6HMgZXjpY3V0aW9uIGRlIGNldHRlIG3pdGhvZGUgKHswfSkuCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdmFsdmVzL0xvY2FsU3RyaW5nc19qYS5wcm9wZXJ0aWVzIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3ZhbHZlcy9Mb2NhbFN0cmluZ3NfamEucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmY0MDk2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3ZhbHZlcy9Mb2NhbFN0cmluZ3NfamEucHJvcGVydGllcwpAQCAtMCwwICsxLDI0IEBACithY2Nlc3NMb2dWYWx2ZS5hbHJlYWR5U3RhcnRlZD1cdTMwYTJcdTMwYWZcdTMwYmJcdTMwYjlcdTMwZWRcdTMwYWNcdTMwZmNcdTMwNmZcdTY1ZTJcdTMwNmJcdThkNzdcdTUyZDVcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkKK2FjY2Vzc0xvZ1ZhbHZlLm5vdFN0YXJ0ZWQ9XHUzMGEyXHUzMGFmXHUzMGJiXHUzMGI5XHUzMGVkXHUzMGFjXHUzMGZjXHUzMDZmXHUzMDdlXHUzMDYwXHU4ZDc3XHU1MmQ1XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzCitjZXJ0aWZpY2F0ZXNWYWx2ZS5hbHJlYWR5U3RhcnRlZD1cdThhOGRcdThhM2NcdTMwZDBcdTMwZWJcdTMwZDZcdTMwNmZcdTY1ZTJcdTMwNmJcdThkNzdcdTUyZDVcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkKK2NlcnRpZmljYXRlc1ZhbHZlLm5vdFN0YXJ0ZWQ9XHU4YThkXHU4YTNjXHUzMGQwXHUzMGViXHUzMGQ2XHUzMDZmXHUzMDdlXHUzMDYwXHU4ZDc3XHU1MmQ1XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzCitpbnRlcmNlcHRvclZhbHZlLmFscmVhZHlTdGFydGVkPVx1MzBhNFx1MzBmM1x1MzBiZlx1MzBmY1x1MzBiYlx1MzBkN1x1MzBiZlx1MzBkMFx1MzBlYlx1MzBkNlx1MzA2Zlx1NjVlMlx1MzA2Ylx1OGQ3N1x1NTJkNVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OQoraW50ZXJjZXB0b3JWYWx2ZS5ub3RTdGFydGVkPVx1MzBhNFx1MzBmM1x1MzBiZlx1MzBmY1x1MzBiYlx1MzBkN1x1MzBiZlx1MzBkMFx1MzBlYlx1MzBkNlx1MzA2Zlx1MzA3ZVx1MzA2MFx1OGQ3N1x1NTJkNVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5MworcmVxdWVzdEZpbHRlclZhbHZlLm5leHQ9XHU2YjIxXHUzMDZlXHUzMGQwXHUzMGViXHUzMGQ2XHUzMDRjXHU4YTJkXHU1YjlhXHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzCityZXF1ZXN0RmlsdGVyVmFsdmUuc3ludGF4PVx1MzBlYVx1MzBhZlx1MzBhOFx1MzBiOVx1MzBjOFx1MzBkNVx1MzBhM1x1MzBlYlx1MzBiZlx1MzBkMVx1MzBiZlx1MzBmY1x1MzBmMyB7MH0gXHUzMDZiXHU2OWNiXHU2NTg3XHUzMGE4XHUzMGU5XHUzMGZjXHUzMDRjXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDU5CityZXF1ZXN0TGlzdGVuZXJWYWx2ZS5yZXF1ZXN0SW5pdD1cdTMwYWZcdTMwZTlcdTMwYjkgezB9IFx1MzA2ZVx1MzBlYVx1MzBiOVx1MzBjYVx1MzBhNFx1MzBmM1x1MzBiOVx1MzBiZlx1MzBmM1x1MzBiOVx1MzA2Ylx1NTIxZFx1NjcxZlx1NTMxNlx1MzA1OVx1MzA4Ylx1MzBlOVx1MzBhNFx1MzBkNVx1MzBiNVx1MzBhNFx1MzBhZlx1MzBlYlx1MzBhNFx1MzBkOVx1MzBmM1x1MzBjOFx1MzA2ZVx1MzBlYVx1MzBhZlx1MzBhOFx1MzBiOVx1MzBjOFx1MzA5Mlx1OTAwMVx1NGZlMVx1NGUyZFx1MzA2ZVx1NGY4Ylx1NTkxNlx1MzA2N1x1MzA1OQorcmVxdWVzdExpc3RlbmVyVmFsdmUucmVxdWVzdERlc3Ryb3k9XHUzMGFmXHUzMGU5XHUzMGI5IHswfSBcdTMwNmVcdTMwZWFcdTMwYjlcdTMwY2FcdTMwYTRcdTMwZjNcdTMwYjlcdTMwYmZcdTMwZjNcdTMwYjlcdTMwNmJcdTVlYzNcdTY4YzRcdTMwNTlcdTMwOGJcdTMwZTlcdTMwYTRcdTMwZDVcdTMwYjVcdTMwYTRcdTMwYWZcdTMwZWJcdTMwYTRcdTMwZDlcdTMwZjNcdTMwYzhcdTMwNmVcdTMwZWFcdTMwYWZcdTMwYThcdTMwYjlcdTMwYzhcdTMwOTJcdTkwMDFcdTRmZTFcdTRlMmRcdTMwNmVcdTRmOGJcdTU5MTZcdTMwNjdcdTMwNTkKK2pkYmNBY2Nlc3NMb2dWYWx2ZS5leGNlcHRpb249XHUzMGEyXHUzMGFmXHUzMGJiXHUzMGI5XHUzMGE4XHUzMGYzXHUzMGM4XHUzMGVhXHUzMDZlXHU2MzNmXHU1MTY1XHUzMDkyXHU1YjlmXHU4ODRjXHU0ZTJkXHUzMDZlXHU0ZjhiXHU1OTE2XHUzMDY3XHUzMDU5CitqZGJjQWNjZXNzTG9nVmFsdmUuY2xvc2U9XHUzMGM3XHUzMGZjXHUzMGJmXHUzMGQ5XHUzMGZjXHUzMGI5XHU2M2E1XHU3ZDlhXHUzMDkyXHUzMGFmXHUzMGVkXHUzMGZjXHUzMGJhXHU0ZTJkXHUzMDZlXHU0ZjhiXHU1OTE2XHUzMDY3XHUzMDU5CisKKyMgRXJyb3IgcmVwb3J0IHZhbHZlCit2YWx2ZUJhc2Uubm9OZXh0PVx1OGEyZFx1NWI5YVx1MzBhOFx1MzBlOVx1MzBmYzogXHU2YjIxXHUzMDZlXHUzMGQwXHUzMGViXHUzMGQ2XHUzMDRjXHU4YTJkXHU1YjlhXHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzCitlcnJvclJlcG9ydFZhbHZlLnN0YXR1c0hlYWRlcj1IVFRQXHUzMGI5XHUzMGM2XHUzMGZjXHUzMGJmXHUzMGI5IHswfSAtIHsxfQorZXJyb3JSZXBvcnRWYWx2ZS5leGNlcHRpb25SZXBvcnQ9XHU0ZjhiXHU1OTE2XHUzMGVjXHUzMGRkXHUzMGZjXHUzMGM4CitlcnJvclJlcG9ydFZhbHZlLnN0YXR1c1JlcG9ydD1cdTMwYjlcdTMwYzZcdTMwZmNcdTMwYmZcdTMwYjlcdTMwZWNcdTMwZGRcdTMwZmNcdTMwYzgKK2Vycm9yUmVwb3J0VmFsdmUubWVzc2FnZT1cdTMwZTFcdTMwYzNcdTMwYmJcdTMwZmNcdTMwYjgKK2Vycm9yUmVwb3J0VmFsdmUuZGVzY3JpcHRpb249XHU4YWFjXHU2NjBlCitlcnJvclJlcG9ydFZhbHZlLmV4Y2VwdGlvbj1cdTRmOGJcdTU5MTYKK2Vycm9yUmVwb3J0VmFsdmUucm9vdENhdXNlPVx1NTM5Zlx1NTZlMAorZXJyb3JSZXBvcnRWYWx2ZS5ub3RlPVx1NmNlOFx1NjEwZgorZXJyb3JSZXBvcnRWYWx2ZS5yb290Q2F1c2VJbkxvZ3M9XHU1MzlmXHU1NmUwXHUzMDZlXHUzMDU5XHUzMDc5XHUzMDY2XHUzMDZlXHUzMGI5XHUzMGJmXHUzMGMzXHUzMGFmXHUzMGM4XHUzMGVjXHUzMGZjXHUzMGI5XHUzMDZmXHUzMDAxezB9XHUzMDZlXHUzMGVkXHUzMGIwXHUzMDZiXHU4YTE4XHU5MzMyXHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdmFsdmVzL1BlcnNpc3RlbnRWYWx2ZS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3ZhbHZlcy9QZXJzaXN0ZW50VmFsdmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWZiMDNkCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3ZhbHZlcy9QZXJzaXN0ZW50VmFsdmUuamF2YQpAQCAtMCwwICsxLDIxMSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LTIwMDEsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlczsKKworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5NYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuU2Vzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlN0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLlJlcXVlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuUmVzcG9uc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkSG9zdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnNlc3Npb24uUGVyc2lzdGVudE1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLlN0cmluZ01hbmFnZXI7CisKKworLyoqCisgKiBWYWx2ZSB0aGF0IGltcGxlbWVudHMgdGhlIGRlZmF1bHQgYmFzaWMgYmVoYXZpb3IgZm9yIHRoZQorICogPGNvZGU+U3RhbmRhcmRIb3N0PC9jb2RlPiBjb250YWluZXIgaW1wbGVtZW50YXRpb24uCisgKiA8cD4KKyAqIDxiPlVTQUdFIENPTlNUUkFJTlQ8L2I+OiBUbyB3b3JrIGNvcnJlY3RseSBpdCByZXF1aXJlcyBhICBQZXJzaXN0ZW50TWFuYWdlci4KKyAqCisgKiBAYXV0aG9yIEplYW4tRnJlZGVyaWMgQ2xlcmUKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIFBlcnNpc3RlbnRWYWx2ZQorICAgIGV4dGVuZHMgVmFsdmVCYXNlIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIHRoaXMgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGluZm8gPQorICAgICAgICAib3JnLmFwYWNoZS5jYXRhbGluYS52YWx2ZXMuUGVyc2lzdGVudFZhbHZlLzEuMCI7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzdHJpbmcgbWFuYWdlciBmb3IgdGhpcyBwYWNrYWdlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ01hbmFnZXIgc20gPQorICAgICAgICBTdHJpbmdNYW5hZ2VyLmdldE1hbmFnZXIoQ29uc3RhbnRzLlBhY2thZ2UpOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgVmFsdmUgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJbmZvKCkgeworCisgICAgICAgIHJldHVybiAoaW5mbyk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBTZWxlY3QgdGhlIGFwcHJvcHJpYXRlIGNoaWxkIENvbnRleHQgdG8gcHJvY2VzcyB0aGlzIHJlcXVlc3QsCisgICAgICogYmFzZWQgb24gdGhlIHNwZWNpZmllZCByZXF1ZXN0IFVSSS4gIElmIG5vIG1hdGNoaW5nIENvbnRleHQgY2FuCisgICAgICogYmUgZm91bmQsIHJldHVybiBhbiBhcHByb3ByaWF0ZSBIVFRQIGVycm9yLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgUmVxdWVzdCB0byBiZSBwcm9jZXNzZWQKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgUmVzcG9uc2UgdG8gYmUgcHJvZHVjZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycmVkCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBlcnJvciBvY2N1cnJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGludm9rZShSZXF1ZXN0IHJlcXVlc3QsIFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIFNlbGVjdCB0aGUgQ29udGV4dCB0byBiZSB1c2VkIGZvciB0aGlzIFJlcXVlc3QKKyAgICAgICAgU3RhbmRhcmRIb3N0IGhvc3QgPSAoU3RhbmRhcmRIb3N0KSBnZXRDb250YWluZXIoKTsKKyAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gcmVxdWVzdC5nZXRDb250ZXh0KCk7CisgICAgICAgIGlmIChjb250ZXh0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgc20uZ2V0U3RyaW5nKCJzdGFuZGFyZEhvc3Qubm9Db250ZXh0IikpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gQmluZCB0aGUgY29udGV4dCBDTCB0byB0aGUgY3VycmVudCB0aHJlYWQKKyAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIKKyAgICAgICAgICAgIChjb250ZXh0LmdldExvYWRlcigpLmdldENsYXNzTG9hZGVyKCkpOworCisgICAgICAgIC8vIFVwZGF0ZSB0aGUgc2Vzc2lvbiBsYXN0IGFjY2VzcyB0aW1lIGZvciBvdXIgc2Vzc2lvbiAoaWYgYW55KQorICAgICAgICBTdHJpbmcgc2Vzc2lvbklkID0gcmVxdWVzdC5nZXRSZXF1ZXN0ZWRTZXNzaW9uSWQoKTsKKyAgICAgICAgTWFuYWdlciBtYW5hZ2VyID0gY29udGV4dC5nZXRNYW5hZ2VyKCk7CisgICAgICAgIGlmIChzZXNzaW9uSWQgIT0gbnVsbCAmJiBtYW5hZ2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChtYW5hZ2VyIGluc3RhbmNlb2YgUGVyc2lzdGVudE1hbmFnZXIpIHsKKyAgICAgICAgICAgICAgICBTdG9yZSBzdG9yZSA9ICgoUGVyc2lzdGVudE1hbmFnZXIpIG1hbmFnZXIpLmdldFN0b3JlKCk7CisgICAgICAgICAgICAgICAgaWYgKHN0b3JlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgU2Vzc2lvbiBzZXNzaW9uID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24gPSBzdG9yZS5sb2FkKHNlc3Npb25JZCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXIuZ2V0TG9nZ2VyKCkuZXJyb3IoImRlc2VyaWFsaXplRXJyb3IiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNlc3Npb24uaXNWYWxpZCgpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTZXNzaW9uU3RhbGUoc2Vzc2lvbiwgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5lci5nZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXIuZ2V0TG9nZ2VyKCkuZGVidWcoInNlc3Npb24gc3dhcHBlZCBpbiBpcyBpbnZhbGlkIG9yIGV4cGlyZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmV4cGlyZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlLnJlbW92ZShzZXNzaW9uSWQpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLnNldE1hbmFnZXIobWFuYWdlcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2Vzc2lvbi5zZXRJZChzZXNzaW9uSWQpOyBPbmx5IGlmIG5ldyA/Pz8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYW5hZ2VyLmFkZChzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAoKFN0YW5kYXJkU2Vzc2lvbilzZXNzaW9uKS5hY3RpdmF0ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uYWNjZXNzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvbnRhaW5lci5nZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgY29udGFpbmVyLmdldExvZ2dlcigpLmRlYnVnKCJzZXNzaW9uSWQ6ICIgKyBzZXNzaW9uSWQpOworCisgICAgICAgIC8vIEFzayB0aGUgbmV4dCB2YWx2ZSB0byBwcm9jZXNzIHRoZSByZXF1ZXN0LgorICAgICAgICBnZXROZXh0KCkuaW52b2tlKHJlcXVlc3QsIHJlc3BvbnNlKTsKKworICAgICAgICAvLyBSZWFkIHRoZSBzZXNzaW9uaWQgYWZ0ZXIgdGhlIHJlc3BvbnNlLgorICAgICAgICAvLyBIdHRwU2Vzc2lvbiBoc2VzcyA9IGhyZXEuZ2V0U2Vzc2lvbihmYWxzZSk7CisgICAgICAgIEh0dHBTZXNzaW9uIGhzZXNzOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaHNlc3MgPSByZXF1ZXN0LmdldFNlc3Npb24oKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBoc2VzcyA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIG5ld3Nlc3Npb25JZCA9IG51bGw7CisgICAgICAgIGlmIChoc2VzcyE9bnVsbCkKKyAgICAgICAgICAgIG5ld3Nlc3Npb25JZCA9IGhzZXNzLmdldElkKCk7CisKKyAgICAgICAgaWYgKGNvbnRhaW5lci5nZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgY29udGFpbmVyLmdldExvZ2dlcigpLmRlYnVnKCJuZXdzZXNzaW9uSWQ6ICIgKyBuZXdzZXNzaW9uSWQpOworICAgICAgICBpZiAobmV3c2Vzc2lvbklkIT1udWxsKSB7CisgICAgICAgICAgICAvKiBzdG9yZSB0aGUgc2Vzc2lvbiBpbiB0aGUgc3RvcmUgYW5kIHJlbW92ZSBpdCBmcm9tIHRoZSBtYW5hZ2VyICovCisgICAgICAgICAgICBpZiAobWFuYWdlciBpbnN0YW5jZW9mIFBlcnNpc3RlbnRNYW5hZ2VyKSB7CisgICAgICAgICAgICAgICAgU2Vzc2lvbiBzZXNzaW9uID0gbWFuYWdlci5maW5kU2Vzc2lvbihuZXdzZXNzaW9uSWQpOworICAgICAgICAgICAgICAgIFN0b3JlIHN0b3JlID0gKChQZXJzaXN0ZW50TWFuYWdlcikgbWFuYWdlcikuZ2V0U3RvcmUoKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RvcmUgIT0gbnVsbCAmJiBzZXNzaW9uIT1udWxsICYmCisgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uaXNWYWxpZCgpICYmCisgICAgICAgICAgICAgICAgICAgICFpc1Nlc3Npb25TdGFsZShzZXNzaW9uLCBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gKChTdGFuZGFyZFNlc3Npb24pc2Vzc2lvbikucGFzc2l2YXRlKCk7CisgICAgICAgICAgICAgICAgICAgIHN0b3JlLnNhdmUoc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICgoUGVyc2lzdGVudE1hbmFnZXIpIG1hbmFnZXIpLnJlbW92ZVN1cGVyKHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLnJlY3ljbGUoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoY29udGFpbmVyLmdldExvZ2dlcigpLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXIuZ2V0TG9nZ2VyKCkuZGVidWcoIm5ld3Nlc3Npb25JZCBzdG9yZTogIiArIHN0b3JlICsgIiBzZXNzaW9uOiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbiArICIgdmFsaWQ6ICIgKyBzZXNzaW9uLmlzVmFsaWQoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgU3RhbGVkOiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTZXNzaW9uU3RhbGUoc2Vzc2lvbiwgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpKTsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5lci5nZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBjb250YWluZXIuZ2V0TG9nZ2VyKCkuZGVidWcoIm5ld3Nlc3Npb25JZCBNYW5hZ2VyOiAiICsgbWFuYWdlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZSB3aGV0aGVyIHRoZSBzZXNzaW9uIGhhcyBiZWVuIGlkbGUgZm9yIGxvbmdlcgorICAgICAqIHRoYW4gaXRzIGV4cGlyYXRpb24gZGF0ZSBhcyBvZiB0aGUgc3VwcGxpZWQgdGltZS4KKyAgICAgKgorICAgICAqIEZJWE1FOiBQcm9iYWJseSBiZWxvbmdzIGluIHRoZSBTZXNzaW9uIGNsYXNzLgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGlzU2Vzc2lvblN0YWxlKFNlc3Npb24gc2Vzc2lvbiwgbG9uZyB0aW1lTm93KSB7CisgCisgICAgICAgIGludCBtYXhJbmFjdGl2ZUludGVydmFsID0gc2Vzc2lvbi5nZXRNYXhJbmFjdGl2ZUludGVydmFsKCk7CisgICAgICAgIGlmIChtYXhJbmFjdGl2ZUludGVydmFsID49IDApIHsKKyAgICAgICAgICAgIGludCB0aW1lSWRsZSA9IC8vIFRydW5jYXRlLCBkbyBub3Qgcm91bmQgdXAKKyAgICAgICAgICAgICAgICAoaW50KSAoKHRpbWVOb3cgLSBzZXNzaW9uLmdldExhc3RBY2Nlc3NlZFRpbWUoKSkgLyAxMDAwTCk7CisgICAgICAgICAgICBpZiAodGltZUlkbGUgPj0gbWF4SW5hY3RpdmVJbnRlcnZhbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorIAorICAgICAgICByZXR1cm4gZmFsc2U7CisgCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdmFsdmVzL1JlbW90ZUFkZHJWYWx2ZS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3ZhbHZlcy9SZW1vdGVBZGRyVmFsdmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODI5ODI1Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3ZhbHZlcy9SZW1vdGVBZGRyVmFsdmUuamF2YQpAQCAtMCwwICsxLDg1IEBACisvKgorICogQ29weXJpZ2h0IDE5OTktMjAwMSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudmFsdmVzOworCisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3Rvci5SZXF1ZXN0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLlJlc3BvbnNlOworCisKKy8qKgorICogQ29uY3JldGUgaW1wbGVtZW50YXRpb24gb2YgPGNvZGU+UmVxdWVzdEZpbHRlclZhbHZlPC9jb2RlPiB0aGF0IGZpbHRlcnMKKyAqIGJhc2VkIG9uIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHJlbW90ZSBjbGllbnQncyBJUCBhZGRyZXNzLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgUmVtb3RlQWRkclZhbHZlCisgICAgZXh0ZW5kcyBSZXF1ZXN0RmlsdGVyVmFsdmUgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gdGhpcyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgaW5mbyA9CisgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcy5SZW1vdGVBZGRyVmFsdmUvMS4wIjsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIFZhbHZlIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5mbygpIHsKKworICAgICAgICByZXR1cm4gKGluZm8pOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogRXh0cmFjdCB0aGUgZGVzaXJlZCByZXF1ZXN0IHByb3BlcnR5LCBhbmQgcGFzcyBpdCAoYWxvbmcgd2l0aCB0aGUKKyAgICAgKiBzcGVjaWZpZWQgcmVxdWVzdCBhbmQgcmVzcG9uc2Ugb2JqZWN0cykgdG8gdGhlIHByb3RlY3RlZAorICAgICAqIDxjb2RlPnByb2Nlc3MoKTwvY29kZT4gbWV0aG9kIHRvIHBlcmZvcm0gdGhlIGFjdHVhbCBmaWx0ZXJpbmcuCisgICAgICogVGhpcyBtZXRob2QgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBhIGNvbmNyZXRlIHN1YmNsYXNzLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB0byBiZSBwcm9jZXNzZWQKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIHNlcnZsZXQgcmVzcG9uc2UgdG8gYmUgY3JlYXRlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbnZva2UoUmVxdWVzdCByZXF1ZXN0LCBSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICBwcm9jZXNzKHJlcXVlc3QuZ2V0UmVxdWVzdCgpLmdldFJlbW90ZUFkZHIoKSwgcmVxdWVzdCwgcmVzcG9uc2UpOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS92YWx2ZXMvUmVtb3RlSG9zdFZhbHZlLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdmFsdmVzL1JlbW90ZUhvc3RWYWx2ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkYmYzMjgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdmFsdmVzL1JlbW90ZUhvc3RWYWx2ZS5qYXZhCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OS0yMDAxLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS52YWx2ZXM7CisKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLlJlcXVlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuUmVzcG9uc2U7CisKKworLyoqCisgKiBDb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiA8Y29kZT5SZXF1ZXN0RmlsdGVyVmFsdmU8L2NvZGU+IHRoYXQgZmlsdGVycworICogYmFzZWQgb24gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgcmVtb3RlIGNsaWVudCdzIElQIGFkZHJlc3MuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBSZW1vdGVIb3N0VmFsdmUKKyAgICBleHRlbmRzIFJlcXVlc3RGaWx0ZXJWYWx2ZSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gcmVsYXRlZCB0byB0aGlzIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBpbmZvID0KKyAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEudmFsdmVzLlJlbW90ZUhvc3RWYWx2ZS8xLjAiOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgVmFsdmUgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJbmZvKCkgeworCisgICAgICAgIHJldHVybiAoaW5mbyk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBFeHRyYWN0IHRoZSBkZXNpcmVkIHJlcXVlc3QgcHJvcGVydHksIGFuZCBwYXNzIGl0IChhbG9uZyB3aXRoIHRoZQorICAgICAqIHNwZWNpZmllZCByZXF1ZXN0IGFuZCByZXNwb25zZSBvYmplY3RzKSB0byB0aGUgcHJvdGVjdGVkCisgICAgICogPGNvZGU+cHJvY2VzcygpPC9jb2RlPiBtZXRob2QgdG8gcGVyZm9ybSB0aGUgYWN0dWFsIGZpbHRlcmluZy4KKyAgICAgKiBUaGlzIG1ldGhvZCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IGEgY29uY3JldGUgc3ViY2xhc3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHRvIGJlIHByb2Nlc3NlZAorICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgc2VydmxldCByZXNwb25zZSB0byBiZSBjcmVhdGVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0IGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGludm9rZShSZXF1ZXN0IHJlcXVlc3QsIFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIHByb2Nlc3MocmVxdWVzdC5nZXRSZXF1ZXN0KCkuZ2V0UmVtb3RlSG9zdCgpLCByZXF1ZXN0LCByZXNwb25zZSk7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3ZhbHZlcy9SZXF1ZXN0RHVtcGVyVmFsdmUuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS92YWx2ZXMvUmVxdWVzdER1bXBlclZhbHZlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM5N2M1MwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS92YWx2ZXMvUmVxdWVzdER1bXBlclZhbHZlLmphdmEKQEAgLTAsMCArMSwxOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OS0yMDAxLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS52YWx2ZXM7CisKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworCitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5Db29raWU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3Rvci5SZXF1ZXN0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLlJlc3BvbnNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5TdHJpbmdNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKKworCisvKioKKyAqIDxwPkltcGxlbWVudGF0aW9uIG9mIGEgVmFsdmUgdGhhdCBsb2dzIGludGVyZXN0aW5nIGNvbnRlbnRzIGZyb20gdGhlCisgKiBzcGVjaWZpZWQgUmVxdWVzdCAoYmVmb3JlIHByb2Nlc3NpbmcpIGFuZCB0aGUgY29ycmVzcG9uZGluZyBSZXNwb25zZQorICogKGFmdGVyIHByb2Nlc3NpbmcpLiAgSXQgaXMgZXNwZWNpYWxseSB1c2VmdWwgaW4gZGVidWdnaW5nIHByb2JsZW1zCisgKiByZWxhdGVkIHRvIGhlYWRlcnMgYW5kIGNvb2tpZXMuPC9wPgorICoKKyAqIDxwPlRoaXMgVmFsdmUgbWF5IGJlIGF0dGFjaGVkIHRvIGFueSBDb250YWluZXIsIGRlcGVuZGluZyBvbiB0aGUgZ3JhbnVsYXJpdHkKKyAqIG9mIHRoZSBsb2dnaW5nIHlvdSB3aXNoIHRvIHBlcmZvcm0uPC9wPgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgUmVxdWVzdER1bXBlclZhbHZlCisgICAgZXh0ZW5kcyBWYWx2ZUJhc2UgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gdGhpcyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgaW5mbyA9CisgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcy5SZXF1ZXN0RHVtcGVyVmFsdmUvMS4wIjsKKworCisgICAgLyoqCisgICAgICogVGhlIFN0cmluZ01hbmFnZXIgZm9yIHRoaXMgcGFja2FnZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZ01hbmFnZXIgc20gPQorICAgICAgICBTdHJpbmdNYW5hZ2VyLmdldE1hbmFnZXIoQ29uc3RhbnRzLlBhY2thZ2UpOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgVmFsdmUgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJbmZvKCkgeworCisgICAgICAgIHJldHVybiAoaW5mbyk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBMb2cgdGhlIGludGVyZXN0aW5nIHJlcXVlc3QgcGFyYW1ldGVycywgaW52b2tlIHRoZSBuZXh0IFZhbHZlIGluIHRoZQorICAgICAqIHNlcXVlbmNlLCBhbmQgbG9nIHRoZSBpbnRlcmVzdGluZyByZXNwb25zZSBwYXJhbWV0ZXJzLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB0byBiZSBwcm9jZXNzZWQKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIHNlcnZsZXQgcmVzcG9uc2UgdG8gYmUgY3JlYXRlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbnZva2UoUmVxdWVzdCByZXF1ZXN0LCBSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICBMb2cgbG9nID0gY29udGFpbmVyLmdldExvZ2dlcigpOworICAgICAgICAKKyAgICAgICAgLy8gTG9nIHByZS1zZXJ2aWNlIGluZm9ybWF0aW9uCisgICAgICAgIGxvZy5pbmZvKCJSRVFVRVNUIFVSSSAgICAgICA9IiArIHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpKTsKKyAgICAgICAgbG9nLmluZm8oIiAgICAgICAgICBhdXRoVHlwZT0iICsgcmVxdWVzdC5nZXRBdXRoVHlwZSgpKTsKKyAgICAgICAgbG9nLmluZm8oIiBjaGFyYWN0ZXJFbmNvZGluZz0iICsgcmVxdWVzdC5nZXRDaGFyYWN0ZXJFbmNvZGluZygpKTsKKyAgICAgICAgbG9nLmluZm8oIiAgICAgY29udGVudExlbmd0aD0iICsgcmVxdWVzdC5nZXRDb250ZW50TGVuZ3RoKCkpOworICAgICAgICBsb2cuaW5mbygiICAgICAgIGNvbnRlbnRUeXBlPSIgKyByZXF1ZXN0LmdldENvbnRlbnRUeXBlKCkpOworICAgICAgICBsb2cuaW5mbygiICAgICAgIGNvbnRleHRQYXRoPSIgKyByZXF1ZXN0LmdldENvbnRleHRQYXRoKCkpOworICAgICAgICBDb29raWUgY29va2llc1tdID0gcmVxdWVzdC5nZXRDb29raWVzKCk7CisgICAgICAgIGlmIChjb29raWVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29va2llcy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICBsb2cuaW5mbygiICAgICAgICAgICAgY29va2llPSIgKyBjb29raWVzW2ldLmdldE5hbWUoKSArICI9IiArCisgICAgICAgICAgICAgICAgICAgIGNvb2tpZXNbaV0uZ2V0VmFsdWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgRW51bWVyYXRpb24gaG5hbWVzID0gcmVxdWVzdC5nZXRIZWFkZXJOYW1lcygpOworICAgICAgICB3aGlsZSAoaG5hbWVzLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICBTdHJpbmcgaG5hbWUgPSAoU3RyaW5nKSBobmFtZXMubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgIEVudW1lcmF0aW9uIGh2YWx1ZXMgPSByZXF1ZXN0LmdldEhlYWRlcnMoaG5hbWUpOworICAgICAgICAgICAgd2hpbGUgKGh2YWx1ZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgaHZhbHVlID0gKFN0cmluZykgaHZhbHVlcy5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgICAgIGxvZy5pbmZvKCIgICAgICAgICAgICBoZWFkZXI9IiArIGhuYW1lICsgIj0iICsgaHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBsb2cuaW5mbygiICAgICAgICAgICAgbG9jYWxlPSIgKyByZXF1ZXN0LmdldExvY2FsZSgpKTsKKyAgICAgICAgbG9nLmluZm8oIiAgICAgICAgICAgIG1ldGhvZD0iICsgcmVxdWVzdC5nZXRNZXRob2QoKSk7CisgICAgICAgIEVudW1lcmF0aW9uIHBuYW1lcyA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyTmFtZXMoKTsKKyAgICAgICAgd2hpbGUgKHBuYW1lcy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgU3RyaW5nIHBuYW1lID0gKFN0cmluZykgcG5hbWVzLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICBTdHJpbmcgcHZhbHVlc1tdID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXJWYWx1ZXMocG5hbWUpOworICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIocG5hbWUpOworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgnPScpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwdmFsdWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGkgPiAwKQorICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCIsICIpOworICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQocHZhbHVlc1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb2cuaW5mbygiICAgICAgICAgcGFyYW1ldGVyPSIgKyByZXN1bHQudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgbG9nLmluZm8oIiAgICAgICAgICBwYXRoSW5mbz0iICsgcmVxdWVzdC5nZXRQYXRoSW5mbygpKTsKKyAgICAgICAgbG9nLmluZm8oIiAgICAgICAgICBwcm90b2NvbD0iICsgcmVxdWVzdC5nZXRQcm90b2NvbCgpKTsKKyAgICAgICAgbG9nLmluZm8oIiAgICAgICBxdWVyeVN0cmluZz0iICsgcmVxdWVzdC5nZXRRdWVyeVN0cmluZygpKTsKKyAgICAgICAgbG9nLmluZm8oIiAgICAgICAgcmVtb3RlQWRkcj0iICsgcmVxdWVzdC5nZXRSZW1vdGVBZGRyKCkpOworICAgICAgICBsb2cuaW5mbygiICAgICAgICByZW1vdGVIb3N0PSIgKyByZXF1ZXN0LmdldFJlbW90ZUhvc3QoKSk7CisgICAgICAgIGxvZy5pbmZvKCIgICAgICAgIHJlbW90ZVVzZXI9IiArIHJlcXVlc3QuZ2V0UmVtb3RlVXNlcigpKTsKKyAgICAgICAgbG9nLmluZm8oInJlcXVlc3RlZFNlc3Npb25JZD0iICsgcmVxdWVzdC5nZXRSZXF1ZXN0ZWRTZXNzaW9uSWQoKSk7CisgICAgICAgIGxvZy5pbmZvKCIgICAgICAgICAgICBzY2hlbWU9IiArIHJlcXVlc3QuZ2V0U2NoZW1lKCkpOworICAgICAgICBsb2cuaW5mbygiICAgICAgICBzZXJ2ZXJOYW1lPSIgKyByZXF1ZXN0LmdldFNlcnZlck5hbWUoKSk7CisgICAgICAgIGxvZy5pbmZvKCIgICAgICAgIHNlcnZlclBvcnQ9IiArIHJlcXVlc3QuZ2V0U2VydmVyUG9ydCgpKTsKKyAgICAgICAgbG9nLmluZm8oIiAgICAgICBzZXJ2bGV0UGF0aD0iICsgcmVxdWVzdC5nZXRTZXJ2bGV0UGF0aCgpKTsKKyAgICAgICAgbG9nLmluZm8oIiAgICAgICAgICBpc1NlY3VyZT0iICsgcmVxdWVzdC5pc1NlY3VyZSgpKTsKKyAgICAgICAgbG9nLmluZm8oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOworCisgICAgICAgIC8vIFBlcmZvcm0gdGhlIHJlcXVlc3QKKyAgICAgICAgZ2V0TmV4dCgpLmludm9rZShyZXF1ZXN0LCByZXNwb25zZSk7CisKKyAgICAgICAgLy8gTG9nIHBvc3Qtc2VydmljZSBpbmZvcm1hdGlvbgorICAgICAgICBsb2cuaW5mbygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7CisgICAgICAgIGxvZy5pbmZvKCIgICAgICAgICAgYXV0aFR5cGU9IiArIHJlcXVlc3QuZ2V0QXV0aFR5cGUoKSk7CisgICAgICAgIGxvZy5pbmZvKCIgICAgIGNvbnRlbnRMZW5ndGg9IiArIHJlc3BvbnNlLmdldENvbnRlbnRMZW5ndGgoKSk7CisgICAgICAgIGxvZy5pbmZvKCIgICAgICAgY29udGVudFR5cGU9IiArIHJlc3BvbnNlLmdldENvbnRlbnRUeXBlKCkpOworICAgICAgICBDb29raWUgcmNvb2tpZXNbXSA9IHJlc3BvbnNlLmdldENvb2tpZXMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByY29va2llcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgbG9nLmluZm8oIiAgICAgICAgICAgIGNvb2tpZT0iICsgcmNvb2tpZXNbaV0uZ2V0TmFtZSgpICsgIj0iICsKKyAgICAgICAgICAgICAgICByY29va2llc1tpXS5nZXRWYWx1ZSgpICsgIjsgZG9tYWluPSIgKworICAgICAgICAgICAgICAgIHJjb29raWVzW2ldLmdldERvbWFpbigpICsgIjsgcGF0aD0iICsgcmNvb2tpZXNbaV0uZ2V0UGF0aCgpKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgcmhuYW1lc1tdID0gcmVzcG9uc2UuZ2V0SGVhZGVyTmFtZXMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByaG5hbWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBTdHJpbmcgcmh2YWx1ZXNbXSA9IHJlc3BvbnNlLmdldEhlYWRlclZhbHVlcyhyaG5hbWVzW2ldKTsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgcmh2YWx1ZXMubGVuZ3RoOyBqKyspCisgICAgICAgICAgICAgICAgbG9nLmluZm8oIiAgICAgICAgICAgIGhlYWRlcj0iICsgcmhuYW1lc1tpXSArICI9IiArIHJodmFsdWVzW2pdKTsKKyAgICAgICAgfQorICAgICAgICBsb2cuaW5mbygiICAgICAgICAgICBtZXNzYWdlPSIgKyByZXNwb25zZS5nZXRNZXNzYWdlKCkpOworICAgICAgICBsb2cuaW5mbygiICAgICAgICByZW1vdGVVc2VyPSIgKyByZXF1ZXN0LmdldFJlbW90ZVVzZXIoKSk7CisgICAgICAgIGxvZy5pbmZvKCIgICAgICAgICAgICBzdGF0dXM9IiArIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgbG9nLmluZm8oIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBTdHJpbmcgcmVuZGVyaW5nIG9mIHRoaXMgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiUmVxdWVzdER1bXBlclZhbHZlWyIpOworICAgICAgICBpZiAoY29udGFpbmVyICE9IG51bGwpCisgICAgICAgICAgICBzYi5hcHBlbmQoY29udGFpbmVyLmdldE5hbWUoKSk7CisgICAgICAgIHNiLmFwcGVuZCgiXSIpOworICAgICAgICByZXR1cm4gKHNiLnRvU3RyaW5nKCkpOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS92YWx2ZXMvUmVxdWVzdEZpbHRlclZhbHZlLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdmFsdmVzL1JlcXVlc3RGaWx0ZXJWYWx2ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3YWE2ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdmFsdmVzL1JlcXVlc3RGaWx0ZXJWYWx2ZS5qYXZhCkBAIC0wLDAgKzEsMjkyIEBACisvKgorICogQ29weXJpZ2h0IDE5OTktMjAwMSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudmFsdmVzOworCisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm5TeW50YXhFeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3Rvci5SZXF1ZXN0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLlJlc3BvbnNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5TdHJpbmdNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuY29tcGF0Lkpka0NvbXBhdDsKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiBhIFZhbHZlIHRoYXQgcGVyZm9ybXMgZmlsdGVyaW5nIGJhc2VkIG9uIGNvbXBhcmluZyB0aGUKKyAqIGFwcHJvcHJpYXRlIHJlcXVlc3QgcHJvcGVydHkgKHNlbGVjdGVkIGJhc2VkIG9uIHdoaWNoIHN1YmNsYXNzIHlvdSBjaG9vc2UKKyAqIHRvIGNvbmZpZ3VyZSBpbnRvIHlvdXIgQ29udGFpbmVyJ3MgcGlwZWxpbmUpIGFnYWluc3QgYSBzZXQgb2YgcmVndWxhcgorICogZXhwcmVzc2lvbnMgY29uZmlndXJlZCBmb3IgdGhpcyBWYWx2ZS4KKyAqIDxwPgorICogVGhpcyB2YWx2ZSBpcyBjb25maWd1cmVkIGJ5IHNldHRpbmcgdGhlIDxjb2RlPmFsbG93PC9jb2RlPiBhbmQvb3IKKyAqIDxjb2RlPmRlbnk8L2NvZGU+IHByb3BlcnRpZXMgdG8gYSBjb21tYS1kZWxpbWl0ZWQgbGlzdCBvZiByZWd1bGFyCisgKiBleHByZXNzaW9ucyAoaW4gdGhlIHN5bnRheCBzdXBwb3J0ZWQgYnkgdGhlIGpha2FydGEtcmVnZXhwIGxpYnJhcnkpIHRvCisgKiB3aGljaCB0aGUgYXBwcm9wcmlhdGUgcmVxdWVzdCBwcm9wZXJ0eSB3aWxsIGJlIGNvbXBhcmVkLiAgRXZhbHVhdGlvbgorICogcHJvY2VlZHMgYXMgZm9sbG93czoKKyAqIDx1bD4KKyAqIDxsaT5UaGUgc3ViY2xhc3MgZXh0cmFjdHMgdGhlIHJlcXVlc3QgcHJvcGVydHkgdG8gYmUgZmlsdGVyZWQsIGFuZAorICogICAgIGNhbGxzIHRoZSBjb21tb24gPGNvZGU+cHJvY2VzcygpPC9jb2RlPiBtZXRob2QuCisgKiA8bGk+SWYgdGhlcmUgYXJlIGFueSBkZW55IGV4cHJlc3Npb25zIGNvbmZpZ3VyZWQsIHRoZSBwcm9wZXJ0eSB3aWxsCisgKiAgICAgYmUgY29tcGFyZWQgdG8gZWFjaCBzdWNoIGV4cHJlc3Npb24uICBJZiBhIG1hdGNoIGlzIGZvdW5kLCB0aGlzCisgKiAgICAgcmVxdWVzdCB3aWxsIGJlIHJlamVjdGVkIHdpdGggYSAiRm9yYmlkZGVuIiBIVFRQIHJlc3BvbnNlLjwvbGk+CisgKiA8bGk+SWYgdGhlcmUgYXJlIGFueSBhbGxvdyBleHByZXNzaW9ucyBjb25maWd1cmVkLCB0aGUgcHJvcGVydHkgd2lsbAorICogICAgIGJlIGNvbXBhcmVkIHRvIGVhY2ggc3VjaCBleHByZXNzaW9uLiAgSWYgYSBtYXRjaCBpcyBmb3VuZCwgdGhpcworICogICAgIHJlcXVlc3Qgd2lsbCBiZSBhbGxvd2VkIHRvIHBhc3MgdGhyb3VnaCB0byB0aGUgbmV4dCBWYWx2ZSBpbiB0aGUKKyAqICAgICBjdXJyZW50IHBpcGVsaW5lLjwvbGk+CisgKiA8bGk+SWYgb25lIG9yIG1vcmUgZGVueSBleHByZXNzaW9ucyB3YXMgc3BlY2lmaWVkIGJ1dCBubyBhbGxvdyBleHByZXNzaW9ucywKKyAqICAgICBhbGxvdyB0aGlzIHJlcXVlc3QgdG8gcGFzcyB0aHJvdWdoIChiZWNhdXNlIG5vbmUgb2YgdGhlIGRlbnkKKyAqICAgICBleHByZXNzaW9ucyBtYXRjaGVkIGl0KS4KKyAqIDxsaT5UaGUgcmVxdWVzdCB3aWxsIGJlIHJlamVjdGVkIHdpdGggYSAiRm9yYmlkZGVuIiBIVFRQIHJlc3BvbnNlLjwvbGk+CisgKiA8L3VsPgorICogPHA+CisgKiBUaGlzIFZhbHZlIG1heSBiZSBhdHRhY2hlZCB0byBhbnkgQ29udGFpbmVyLCBkZXBlbmRpbmcgb24gdGhlIGdyYW51bGFyaXR5CisgKiBvZiB0aGUgZmlsdGVyaW5nIHlvdSB3aXNoIHRvIHBlcmZvcm0uCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBSZXF1ZXN0RmlsdGVyVmFsdmUKKyAgICBleHRlbmRzIFZhbHZlQmFzZSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENsYXNzIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBKREsgY29tcGF0aWJpbGl0eSBzdXBwb3J0CisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmRrQ29tcGF0IGpka0NvbXBhdCA9IEpka0NvbXBhdC5nZXRKZGtDb21wYXQoKTsKKworCisgICAgLyoqCisgICAgICogVGhlIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gdGhpcyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgaW5mbyA9CisgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcy5SZXF1ZXN0RmlsdGVyVmFsdmUvMS4wIjsKKworCisgICAgLyoqCisgICAgICogVGhlIFN0cmluZ01hbmFnZXIgZm9yIHRoaXMgcGFja2FnZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZ01hbmFnZXIgc20gPQorICAgICAgICBTdHJpbmdNYW5hZ2VyLmdldE1hbmFnZXIoQ29uc3RhbnRzLlBhY2thZ2UpOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIGNvbW1hLWRlbGltaXRlZCBzZXQgb2YgPGNvZGU+YWxsb3c8L2NvZGU+IGV4cHJlc3Npb25zLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgYWxsb3cgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc2V0IG9mIDxjb2RlPmFsbG93PC9jb2RlPiByZWd1bGFyIGV4cHJlc3Npb25zIHdlIHdpbGwgZXZhbHVhdGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIFBhdHRlcm4gYWxsb3dzW10gPSBuZXcgUGF0dGVyblswXTsKKworCisgICAgLyoqCisgICAgICogVGhlIHNldCBvZiA8Y29kZT5kZW55PC9jb2RlPiByZWd1bGFyIGV4cHJlc3Npb25zIHdlIHdpbGwgZXZhbHVhdGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIFBhdHRlcm4gZGVuaWVzW10gPSBuZXcgUGF0dGVyblswXTsKKworCisgICAgLyoqCisgICAgICogVGhlIGNvbW1hLWRlbGltaXRlZCBzZXQgb2YgPGNvZGU+ZGVueTwvY29kZT4gZXhwcmVzc2lvbnMuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBkZW55ID0gbnVsbDsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIGNvbW1hLWRlbGltaXRlZCBzZXQgb2YgdGhlIDxjb2RlPmFsbG93PC9jb2RlPiBleHByZXNzaW9ucworICAgICAqIGNvbmZpZ3VyZWQgZm9yIHRoaXMgVmFsdmUsIGlmIGFueTsgb3RoZXJ3aXNlLCByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRBbGxvdygpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMuYWxsb3cpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNvbW1hLWRlbGltaXRlZCBzZXQgb2YgdGhlIDxjb2RlPmFsbG93PC9jb2RlPiBleHByZXNzaW9ucworICAgICAqIGNvbmZpZ3VyZWQgZm9yIHRoaXMgVmFsdmUsIGlmIGFueS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhbGxvdyBUaGUgbmV3IHNldCBvZiBhbGxvdyBleHByZXNzaW9ucworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEFsbG93KFN0cmluZyBhbGxvdykgeworCisgICAgICAgIHRoaXMuYWxsb3cgPSBhbGxvdzsKKyAgICAgICAgYWxsb3dzID0gcHJlY2FsY3VsYXRlKGFsbG93KTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgY29tbWEtZGVsaW1pdGVkIHNldCBvZiB0aGUgPGNvZGU+ZGVueTwvY29kZT4gZXhwcmVzc2lvbnMKKyAgICAgKiBjb25maWd1cmVkIGZvciB0aGlzIFZhbHZlLCBpZiBhbnk7IG90aGVyd2lzZSwgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVueSgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMuZGVueSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY29tbWEtZGVsaW1pdGVkIHNldCBvZiB0aGUgPGNvZGU+ZGVueTwvY29kZT4gZXhwcmVzc2lvbnMKKyAgICAgKiBjb25maWd1cmVkIGZvciB0aGlzIFZhbHZlLCBpZiBhbnkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGVueSBUaGUgbmV3IHNldCBvZiBkZW55IGV4cHJlc3Npb25zCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVueShTdHJpbmcgZGVueSkgeworCisgICAgICAgIHRoaXMuZGVueSA9IGRlbnk7CisgICAgICAgIGRlbmllcyA9IHByZWNhbGN1bGF0ZShkZW55KTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgVmFsdmUgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJbmZvKCkgeworCisgICAgICAgIHJldHVybiAoaW5mbyk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBFeHRyYWN0IHRoZSBkZXNpcmVkIHJlcXVlc3QgcHJvcGVydHksIGFuZCBwYXNzIGl0IChhbG9uZyB3aXRoIHRoZQorICAgICAqIHNwZWNpZmllZCByZXF1ZXN0IGFuZCByZXNwb25zZSBvYmplY3RzKSB0byB0aGUgcHJvdGVjdGVkCisgICAgICogPGNvZGU+cHJvY2VzcygpPC9jb2RlPiBtZXRob2QgdG8gcGVyZm9ybSB0aGUgYWN0dWFsIGZpbHRlcmluZy4KKyAgICAgKiBUaGlzIG1ldGhvZCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IGEgY29uY3JldGUgc3ViY2xhc3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHRvIGJlIHByb2Nlc3NlZAorICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgc2VydmxldCByZXNwb25zZSB0byBiZSBjcmVhdGVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0IGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGludm9rZShSZXF1ZXN0IHJlcXVlc3QsIFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb247CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm90ZWN0ZWQgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYW4gYXJyYXkgb2YgcmVndWxhciBleHByZXNzaW9uIG9iamVjdHMgaW5pdGlhbGl6ZWQgZnJvbSB0aGUKKyAgICAgKiBzcGVjaWZpZWQgYXJndW1lbnQsIHdoaWNoIG11c3QgYmUgPGNvZGU+bnVsbDwvY29kZT4gb3IgYSBjb21tYS1kZWxpbWl0ZWQKKyAgICAgKiBsaXN0IG9mIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0IFRoZSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBwYXR0ZXJucworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgb25lIG9mIHRoZSBwYXR0ZXJucyBoYXMKKyAgICAgKiAgaW52YWxpZCBzeW50YXgKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUGF0dGVybltdIHByZWNhbGN1bGF0ZShTdHJpbmcgbGlzdCkgeworCisgICAgICAgIGlmIChsaXN0ID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKG5ldyBQYXR0ZXJuWzBdKTsKKyAgICAgICAgbGlzdCA9IGxpc3QudHJpbSgpOworICAgICAgICBpZiAobGlzdC5sZW5ndGgoKSA8IDEpCisgICAgICAgICAgICByZXR1cm4gKG5ldyBQYXR0ZXJuWzBdKTsKKyAgICAgICAgbGlzdCArPSAiLCI7CisKKyAgICAgICAgQXJyYXlMaXN0IHJlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgd2hpbGUgKGxpc3QubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICBpbnQgY29tbWEgPSBsaXN0LmluZGV4T2YoJywnKTsKKyAgICAgICAgICAgIGlmIChjb21tYSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBTdHJpbmcgcGF0dGVybiA9IGxpc3Quc3Vic3RyaW5nKDAsIGNvbW1hKS50cmltKCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJlTGlzdC5hZGQoUGF0dGVybi5jb21waWxlKHBhdHRlcm4pKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFBhdHRlcm5TeW50YXhFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUgPSBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInJlcXVlc3RGaWx0ZXJWYWx2ZS5zeW50YXgiLCBwYXR0ZXJuKSk7CisgICAgICAgICAgICAgICAgamRrQ29tcGF0LmNoYWluRXhjZXB0aW9uKGlhZSwgZSk7CisgICAgICAgICAgICAgICAgdGhyb3cgaWFlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGlzdCA9IGxpc3Quc3Vic3RyaW5nKGNvbW1hICsgMSk7CisgICAgICAgIH0KKworICAgICAgICBQYXR0ZXJuIHJlQXJyYXlbXSA9IG5ldyBQYXR0ZXJuW3JlTGlzdC5zaXplKCldOworICAgICAgICByZXR1cm4gKChQYXR0ZXJuW10pIHJlTGlzdC50b0FycmF5KHJlQXJyYXkpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUGVyZm9ybSB0aGUgZmlsdGVyaW5nIHRoYXQgaGFzIGJlZW4gY29uZmlndXJlZCBmb3IgdGhpcyBWYWx2ZSwgbWF0Y2hpbmcKKyAgICAgKiBhZ2FpbnN0IHRoZSBzcGVjaWZpZWQgcmVxdWVzdCBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm9wZXJ0eSBUaGUgcmVxdWVzdCBwcm9wZXJ0eSBvbiB3aGljaCB0byBmaWx0ZXIKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHRvIGJlIHByb2Nlc3NlZAorICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgc2VydmxldCByZXNwb25zZSB0byBiZSBwcm9jZXNzZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcHJvY2VzcyhTdHJpbmcgcHJvcGVydHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXF1ZXN0IHJlcXVlc3QsIFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIENoZWNrIHRoZSBkZW55IHBhdHRlcm5zLCBpZiBhbnkKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZW5pZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChkZW5pZXNbaV0ubWF0Y2hlcihwcm9wZXJ0eSkubWF0Y2hlcygpKSB7CisgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfRk9SQklEREVOKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBDaGVjayB0aGUgYWxsb3cgcGF0dGVybnMsIGlmIGFueQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFsbG93cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKGFsbG93c1tpXS5tYXRjaGVyKHByb3BlcnR5KS5tYXRjaGVzKCkpIHsKKyAgICAgICAgICAgICAgICBnZXROZXh0KCkuaW52b2tlKHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBBbGxvdyBpZiBkZW5pZXMgc3BlY2lmaWVkIGJ1dCBub3QgYWxsb3dzCisgICAgICAgIGlmICgoZGVuaWVzLmxlbmd0aCA+IDApICYmIChhbGxvd3MubGVuZ3RoID09IDApKSB7CisgICAgICAgICAgICBnZXROZXh0KCkuaW52b2tlKHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIERlbnkgdGhpcyByZXF1ZXN0CisgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcihIdHRwU2VydmxldFJlc3BvbnNlLlNDX0ZPUkJJRERFTik7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3ZhbHZlcy9WYWx2ZUJhc2UuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS92YWx2ZXMvVmFsdmVCYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUyMGRhNQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS92YWx2ZXMvVmFsdmVCYXNlLmphdmEKQEAgLTAsMCArMSwyOTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OS0yMDAxLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS52YWx2ZXM7CisKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuUmVnaXN0cmF0aW9uOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NYWxmb3JtZWRPYmplY3ROYW1lRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRhaW5lZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5FbmdpbmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Ib3N0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuUGlwZWxpbmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5WYWx2ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLldyYXBwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuUmVxdWVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvbm5lY3Rvci5SZXNwb25zZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuQ29udGFpbmVyQmFzZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuU3RyaW5nTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKKworCisvKioKKyAqIENvbnZlbmllbmNlIGJhc2UgY2xhc3MgZm9yIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgPGI+VmFsdmU8L2I+IGludGVyZmFjZS4KKyAqIEEgc3ViY2xhc3MgPHN0cm9uZz5NVVNUPC9zdHJvbmc+IGltcGxlbWVudCBhbiA8Y29kZT5pbnZva2UoKTwvY29kZT4KKyAqIG1ldGhvZCB0byBwcm92aWRlIHRoZSByZXF1aXJlZCBmdW5jdGlvbmFsaXR5LCBhbmQgPHN0cm9uZz5NQVk8L3N0cm9uZz4KKyAqIGltcGxlbWVudCB0aGUgPGNvZGU+TGlmZWN5Y2xlPC9jb2RlPiBpbnRlcmZhY2UgdG8gcHJvdmlkZSBjb25maWd1cmF0aW9uCisgKiBtYW5hZ2VtZW50IGFuZCBsaWZlY3ljbGUgc3VwcG9ydC4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGFic3RyYWN0IGNsYXNzIFZhbHZlQmFzZQorICAgIGltcGxlbWVudHMgQ29udGFpbmVkLCBWYWx2ZSwgTUJlYW5SZWdpc3RyYXRpb24geworICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhWYWx2ZUJhc2UuY2xhc3MpOworCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBDb250YWluZXIgd2hvc2UgcGlwZWxpbmUgdGhpcyBWYWx2ZSBpcyBhIGNvbXBvbmVudCBvZi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ29udGFpbmVyIGNvbnRhaW5lciA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIERlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgVmFsdmUgaW1wbGVtZW50YXRpb24uICBUaGlzIHZhbHVlCisgICAgICogc2hvdWxkIGJlIG92ZXJyaWRkZW4gYnkgc3ViY2xhc3Nlcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBpbmZvID0KKyAgICAgICAgIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5WYWx2ZUJhc2UvMS4wIjsKKworCisgICAgLyoqCisgICAgICogVGhlIG5leHQgVmFsdmUgaW4gdGhlIHBpcGVsaW5lIHRoaXMgVmFsdmUgaXMgYSBjb21wb25lbnQgb2YuCisgICAgICovCisgICAgcHJvdGVjdGVkIFZhbHZlIG5leHQgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc3RyaW5nIG1hbmFnZXIgZm9yIHRoaXMgcGFja2FnZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZ01hbmFnZXIgc20gPQorICAgICAgICBTdHJpbmdNYW5hZ2VyLmdldE1hbmFnZXIoQ29uc3RhbnRzLlBhY2thZ2UpOworCisKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBDb250YWluZXIgd2l0aCB3aGljaCB0aGlzIFZhbHZlIGlzIGFzc29jaWF0ZWQsIGlmIGFueS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29udGFpbmVyIGdldENvbnRhaW5lcigpIHsKKworICAgICAgICByZXR1cm4gKGNvbnRhaW5lcik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgQ29udGFpbmVyIHdpdGggd2hpY2ggdGhpcyBWYWx2ZSBpcyBhc3NvY2lhdGVkLCBpZiBhbnkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBuZXcgYXNzb2NpYXRlZCBjb250YWluZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb250YWluZXIoQ29udGFpbmVyIGNvbnRhaW5lcikgeworCisgICAgICAgIHRoaXMuY29udGFpbmVyID0gY29udGFpbmVyOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBWYWx2ZSBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEluZm8oKSB7CisKKyAgICAgICAgcmV0dXJuIChpbmZvKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBuZXh0IFZhbHZlIGluIHRoaXMgcGlwZWxpbmUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMKKyAgICAgKiBpcyB0aGUgbGFzdCBWYWx2ZSBpbiB0aGUgcGlwZWxpbmUuCisgICAgICovCisgICAgcHVibGljIFZhbHZlIGdldE5leHQoKSB7CisKKyAgICAgICAgcmV0dXJuIChuZXh0KTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBWYWx2ZSB0aGF0IGZvbGxvd3MgdGhpcyBvbmUgaW4gdGhlIHBpcGVsaW5lIGl0IGlzIHBhcnQgb2YuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdmUgVGhlIG5ldyBuZXh0IHZhbHZlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TmV4dChWYWx2ZSB2YWx2ZSkgeworCisgICAgICAgIHRoaXMubmV4dCA9IHZhbHZlOworCisgICAgfQorCisKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogVGhlIGltcGxlbWVudGF0aW9uLXNwZWNpZmljIGxvZ2ljIHJlcHJlc2VudGVkIGJ5IHRoaXMgVmFsdmUuICBTZWUgdGhlCisgICAgICogVmFsdmUgZGVzY3JpcHRpb24gZm9yIHRoZSBub3JtYWwgZGVzaWduIHBhdHRlcm5zIGZvciB0aGlzIG1ldGhvZC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIG1ldGhvZCA8c3Ryb25nPk1VU1Q8L3N0cm9uZz4gYmUgcHJvdmlkZWQgYnkgYSBzdWJjbGFzcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3QgdG8gYmUgcHJvY2Vzc2VkCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBzZXJ2bGV0IHJlc3BvbnNlIHRvIGJlIGNyZWF0ZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgaW52b2tlKFJlcXVlc3QgcmVxdWVzdCwgUmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbjsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tIEpNWCBhbmQgUmVnaXN0cmF0aW9uICAtLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHByb3RlY3RlZCBTdHJpbmcgZG9tYWluOworICAgIHByb3RlY3RlZCBPYmplY3ROYW1lIG9uYW1lOworICAgIHByb3RlY3RlZCBNQmVhblNlcnZlciBtc2VydmVyOworICAgIHByb3RlY3RlZCBPYmplY3ROYW1lIGNvbnRyb2xsZXI7CisKKyAgICBwdWJsaWMgT2JqZWN0TmFtZSBnZXRPYmplY3ROYW1lKCkgeworICAgICAgICByZXR1cm4gb25hbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0T2JqZWN0TmFtZShPYmplY3ROYW1lIG9uYW1lKSB7CisgICAgICAgIHRoaXMub25hbWUgPSBvbmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldERvbWFpbigpIHsKKyAgICAgICAgcmV0dXJuIGRvbWFpbjsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0TmFtZSBwcmVSZWdpc3RlcihNQmVhblNlcnZlciBzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSBuYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgb25hbWU9bmFtZTsKKyAgICAgICAgbXNlcnZlcj1zZXJ2ZXI7CisgICAgICAgIGRvbWFpbj1uYW1lLmdldERvbWFpbigpOworCisKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcG9zdFJlZ2lzdGVyKEJvb2xlYW4gcmVnaXN0cmF0aW9uRG9uZSkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHByZURlcmVnaXN0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwb3N0RGVyZWdpc3RlcigpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0TmFtZSBnZXRDb250cm9sbGVyKCkgeworICAgICAgICByZXR1cm4gY29udHJvbGxlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDb250cm9sbGVyKE9iamVjdE5hbWUgY29udHJvbGxlcikgeworICAgICAgICB0aGlzLmNvbnRyb2xsZXIgPSBjb250cm9sbGVyOworICAgIH0KKworICAgIC8qKiBGcm9tIHRoZSBuYW1lLCBleHRyYWN0IHRoZSBwYXJlbnQgb2JqZWN0IG5hbWUKKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx2ZU5hbWUgVGhlIHZhbHZlIG5hbWUKKyAgICAgKiBAcmV0dXJuIE9iamVjdE5hbWUgVGhlIHBhcmVudCBuYW1lCisgICAgICovCisgICAgcHVibGljIE9iamVjdE5hbWUgZ2V0UGFyZW50TmFtZSggT2JqZWN0TmFtZSB2YWx2ZU5hbWUgKSB7CisKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdE5hbWUgY3JlYXRlT2JqZWN0TmFtZShTdHJpbmcgZG9tYWluLCBPYmplY3ROYW1lIHBhcmVudCkKKyAgICAgICAgICAgIHRocm93cyBNYWxmb3JtZWRPYmplY3ROYW1lRXhjZXB0aW9uCisgICAgeworICAgICAgICBDb250YWluZXIgY29udGFpbmVyPXRoaXMuZ2V0Q29udGFpbmVyKCk7CisgICAgICAgIGlmKCBjb250YWluZXIgPT0gbnVsbCB8fCAhIChjb250YWluZXIgaW5zdGFuY2VvZiBDb250YWluZXJCYXNlKSApCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgQ29udGFpbmVyQmFzZSBjb250YWluZXJCYXNlPShDb250YWluZXJCYXNlKWNvbnRhaW5lcjsKKyAgICAgICAgUGlwZWxpbmUgcGlwZT1jb250YWluZXJCYXNlLmdldFBpcGVsaW5lKCk7CisgICAgICAgIFZhbHZlIHZhbHZlc1tdPXBpcGUuZ2V0VmFsdmVzKCk7CisKKyAgICAgICAgLyogQ29tcHV0ZSB0aGUgInBhcmVudCBuYW1lIiBwYXJ0ICovCisgICAgICAgIFN0cmluZyBwYXJlbnROYW1lPSIiOworICAgICAgICBpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgRW5naW5lKSB7CisgICAgICAgIH0gZWxzZSBpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgSG9zdCkgeworICAgICAgICAgICAgcGFyZW50TmFtZT0iLGhvc3Q9IiArY29udGFpbmVyLmdldE5hbWUoKTsKKyAgICAgICAgfSBlbHNlIGlmIChjb250YWluZXIgaW5zdGFuY2VvZiBDb250ZXh0KSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXRoID0gKChDb250ZXh0KWNvbnRhaW5lcikuZ2V0UGF0aCgpOworICAgICAgICAgICAgICAgICAgICBpZiAocGF0aC5sZW5ndGgoKSA8IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhdGggPSAiLyI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgSG9zdCBob3N0ID0gKEhvc3QpIGNvbnRhaW5lci5nZXRQYXJlbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgcGFyZW50TmFtZT0iLHBhdGg9IiArIHBhdGggKyAiLGhvc3Q9IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdC5nZXROYW1lKCk7CisgICAgICAgIH0gZWxzZSBpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgV3JhcHBlcikgeworICAgICAgICAgICAgQ29udGV4dCBjdHggPSAoQ29udGV4dCkgY29udGFpbmVyLmdldFBhcmVudCgpOworICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBjdHguZ2V0UGF0aCgpOworICAgICAgICAgICAgaWYgKHBhdGgubGVuZ3RoKCkgPCAxKSB7CisgICAgICAgICAgICAgICAgcGF0aCA9ICIvIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEhvc3QgaG9zdCA9IChIb3N0KSBjdHguZ2V0UGFyZW50KCk7CisgICAgICAgICAgICBwYXJlbnROYW1lPSIsc2VydmxldD0iICsgY29udGFpbmVyLmdldE5hbWUoKSArCisgICAgICAgICAgICAgICAgICAgICIscGF0aD0iICsgcGF0aCArICIsaG9zdD0iICsgaG9zdC5nZXROYW1lKCk7CisgICAgICAgIH0KKyAgICAgICAgbG9nLmRlYnVnKCJ2YWx2ZSBwYXJlbnQ9IiArIHBhcmVudE5hbWUgKyAiICIgKyBwYXJlbnQpOworCisgICAgICAgIFN0cmluZyBjbGFzc05hbWU9dGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKTsKKyAgICAgICAgaW50IHBlcmlvZCA9IGNsYXNzTmFtZS5sYXN0SW5kZXhPZignLicpOworICAgICAgICBpZiAocGVyaW9kID49IDApCisgICAgICAgICAgICBjbGFzc05hbWUgPSBjbGFzc05hbWUuc3Vic3RyaW5nKHBlcmlvZCArIDEpOworCisgICAgICAgIGludCBzZXE9MDsKKyAgICAgICAgZm9yKCBpbnQgaT0wOyBpPHZhbHZlcy5sZW5ndGg7IGkrKyApIHsKKyAgICAgICAgICAgIC8vIEZpbmQgb3RoZXIgdmFsdmVzIHdpdGggdGhlIHNhbWUgbmFtZQorICAgICAgICAgICAgaWYgKHZhbHZlc1tpXSA9PSB0aGlzKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiggdmFsdmVzW2ldIT1udWxsICYmCisgICAgICAgICAgICAgICAgICAgIHZhbHZlc1tpXS5nZXRDbGFzcygpID09IHRoaXMuZ2V0Q2xhc3MoKSApIHsKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkR1cGxpY2F0ZSAiICsgdmFsdmVzW2ldICsgIiAiICsgdGhpcyArICIgIiArIGNvbnRhaW5lcik7CisgICAgICAgICAgICAgICAgc2VxKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIGV4dD0iIjsKKyAgICAgICAgaWYoIHNlcSA+IDAgKSB7CisgICAgICAgICAgICBleHQ9IixzZXE9IiArIHNlcTsKKyAgICAgICAgfQorCisgICAgICAgIE9iamVjdE5hbWUgb2JqZWN0TmFtZSA9IAorICAgICAgICAgICAgbmV3IE9iamVjdE5hbWUoIGRvbWFpbiArICI6dHlwZT1WYWx2ZSxuYW1lPSIgKyBjbGFzc05hbWUgKyBleHQgKyBwYXJlbnROYW1lKTsKKyAgICAgICAgbG9nLmRlYnVnKCJ2YWx2ZSBvYmplY3RuYW1lID0gIitvYmplY3ROYW1lKTsKKyAgICAgICAgcmV0dXJuIG9iamVjdE5hbWU7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0gSk1YIGRhdGEgIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBwdWJsaWMgT2JqZWN0TmFtZSBnZXRDb250YWluZXJOYW1lKCkgeworICAgICAgICBpZiggY29udGFpbmVyPT0gbnVsbCkgcmV0dXJuIG51bGw7CisgICAgICAgIHJldHVybiAoKENvbnRhaW5lckJhc2UpY29udGFpbmVyKS5nZXRKbXhOYW1lKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3ZhbHZlcy9tYmVhbnMtZGVzY3JpcHRvcnMueG1sIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL3ZhbHZlcy9tYmVhbnMtZGVzY3JpcHRvcnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMzc4YjEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdmFsdmVzL21iZWFucy1kZXNjcmlwdG9ycy54bWwKQEAgLTAsMCArMSwyMTcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPG1iZWFucy1kZXNjcmlwdG9ycz4KKworICA8bWJlYW4gbmFtZT0iQWNjZXNzTG9nVmFsdmUiCisgICAgICAgICBkZXNjcmlwdGlvbj0iVmFsdmUgdGhhdCBnZW5lcmF0ZXMgYSB3ZWIgc2VydmVyIGFjY2VzcyBsb2ciCisgICAgICAgICBkb21haW49IkNhdGFsaW5hIgorICAgICAgICAgZ3JvdXA9IlZhbHZlIgorICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS5jYXRhbGluYS52YWx2ZXMuQWNjZXNzTG9nVmFsdmUiPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc05hbWUiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iRnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIG1hbmFnZWQgb2JqZWN0IgorICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29udGFpbmVyTmFtZSIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJPYmplY3QgbmFtZSBvZiB0aGUgY29udGFpbmVyIgorICAgICAgICAgICAgICAgdHlwZT0iamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lIi8+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9ImRpcmVjdG9yeSIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgZGlyZWN0b3J5IGluIHdoaWNoIGxvZyBmaWxlcyBhcmUgY3JlYXRlZCIKKyAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJwYXR0ZXJuIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBwYXR0ZXJuIHVzZWQgdG8gZm9ybWF0IG91ciBhY2Nlc3MgbG9nIGxpbmVzIgorICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJwcmVmaXgiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIHByZWZpeCB0aGF0IGlzIGFkZGVkIHRvIGxvZyBmaWxlIGZpbGVuYW1lcyIKKyAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0icmVzb2x2ZUhvc3RzIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlJlc29sdmUgaG9zdHMiCisgICAgICAgICAgICAgICBpcz0idHJ1ZSIKKyAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iLz4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0icm90YXRhYmxlIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IkZsYWcgdG8gaW5kaWNhdGUgYXV0b21hdGljIGxvZyByb3RhdGlvbi4iCisgICAgICAgICAgICAgICBpcz0idHJ1ZSIKKyAgICAgICAgICAgICAgIHR5cGU9ImJvb2xlYW4iLz4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3VmZml4IgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBzdWZmaXggdGhhdCBpcyBhZGRlZCB0byBsb2cgZmlsZSBmaWxlbmFtZXMiCisgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9ImNvbmRpdGlvbiIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgdmFsdWUgdG8gbG9vayBmb3IgY29uZGl0aW9uYWwgbG9nZ2luZy4iCisgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9ImZpbGVEYXRlRm9ybWF0IgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBmb3JtYXQgZm9yIHRoZSBkYXRlIGRhdGUgYmFzZWQgbG9nIHJvdGF0aW9uLiIKKyAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKyAgPC9tYmVhbj4KKworICA8bWJlYW4gbmFtZT0iRXJyb3JSZXBvcnRWYWx2ZSIKKyAgICAgICAgIGRlc2NyaXB0aW9uPSJJbXBsZW1lbnRhdGlvbiBvZiBhIFZhbHZlIHRoYXQgb3V0cHV0cyBIVE1MIGVycm9yIHBhZ2VzIgorICAgICAgICAgZG9tYWluPSJDYXRhbGluYSIKKyAgICAgICAgIGdyb3VwPSJWYWx2ZSIKKyAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUuY2F0YWxpbmEudmFsdmVzLkVycm9yUmVwb3J0VmFsdmUiPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc05hbWUiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iRnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIG1hbmFnZWQgb2JqZWN0IgorICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29udGFpbmVyTmFtZSIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJPYmplY3QgbmFtZSBvZiB0aGUgY29udGFpbmVyIgorICAgICAgICAgICAgICAgdHlwZT0iamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lIi8+CisKKyAgPC9tYmVhbj4KKworICA8bWJlYW4gbmFtZT0iRXh0ZW5kZWRBY2Nlc3NMb2dWYWx2ZSIKKyAgICAgICAgIGRlc2NyaXB0aW9uPSJWYWx2ZSB0aGF0IGdlbmVyYXRlcyBhIHdlYiBzZXJ2ZXIgYWNjZXNzIGxvZyIKKyAgICAgICAgIGRvbWFpbj0iQ2F0YWxpbmEiCisgICAgICAgICBncm91cD0iVmFsdmUiCisgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcy5FeHRlbmRlZEFjY2Vzc0xvZ1ZhbHZlIj4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NOYW1lIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IkZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBtYW5hZ2VkIG9iamVjdCIKKyAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9ImNvbnRhaW5lck5hbWUiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iT2JqZWN0IG5hbWUgb2YgdGhlIGNvbnRhaW5lciIKKyAgICAgICAgICAgICAgIHR5cGU9ImphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZSIvPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJkaXJlY3RvcnkiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIGRpcmVjdG9yeSBpbiB3aGljaCBsb2cgZmlsZXMgYXJlIGNyZWF0ZWQiCisgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0icGF0dGVybiIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgcGF0dGVybiB1c2VkIHRvIGZvcm1hdCBvdXIgYWNjZXNzIGxvZyBsaW5lcyIKKyAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0icHJlZml4IgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBwcmVmaXggdGhhdCBpcyBhZGRlZCB0byBsb2cgZmlsZSBmaWxlbmFtZXMiCisgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9InJvdGF0YWJsZSIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJSb3RhdGUgbG9nIgorICAgICAgICAgICAgICAgaXM9InRydWUiCisgICAgICAgICAgICAgICB0eXBlPSJib29sZWFuIi8+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9ImNvbmRpdGlvbiIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgdmFsdWUgdG8gbG9vayBmb3IgY29uZGl0aW9uYWwgbG9nZ2luZy4iCisgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9ImNoZWNrRXhpc3RzIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IkNoZWNrIGZvciBmaWxlIGV4aXN0ZW5jZSBiZWZvcmUgZWFjaCBsb2dnaW5nLiIKKyAgICAgICAgICAgICAgIGlzPSJ0cnVlIgorICAgICAgICAgICAgICAgdHlwZT0iYm9vbGVhbiIvPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJzdWZmaXgiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIHN1ZmZpeCB0aGF0IGlzIGFkZGVkIHRvIGxvZyBmaWxlIGZpbGVuYW1lcyIKKyAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmlsZURhdGVGb3JtYXQiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIGZvcm1hdCBmb3IgdGhlIGRhdGUgZGF0ZSBiYXNlZCBsb2cgcm90YXRpb24uIgorICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorCisgICAgPG9wZXJhdGlvbiBuYW1lPSJyb3RhdGUiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iTW92ZSB0aGUgZXhpc3RpbmcgbG9nIGZpbGUgdG8gYSBuZXcgbmFtZSIKKyAgICAgICAgICAgICAgIGltcGFjdD0iQUNUSU9OIgorICAgICAgICAgICAgICAgcmV0dXJuVHlwZT0iYm9vbGVhbiI+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9Im5ld0ZpbGVOYW1lIgorICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iRmlsZSBuYW1lIHRvIG1vdmUgdGhlIGxvZyBmaWxlIHRvLiIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorICAgIDwvb3BlcmF0aW9uPgorCisgIDwvbWJlYW4+CisKKyAgPG1iZWFuIG5hbWU9IlJlbW90ZUFkZHJWYWx2ZSIKKyAgICAgICAgIGRlc2NyaXB0aW9uPSJDb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiBSZXF1ZXN0RmlsdGVyVmFsdmUgdGhhdCAgZmlsdGVycyBiYXNlZCBvbiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByZW1vdGUgY2xpZW50J3MgSVAgYWRkcmVzcyIKKyAgICAgICAgIGRvbWFpbj0iQ2F0YWxpbmEiCisgICAgICAgICBncm91cD0iVmFsdmUiCisgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcy5SZW1vdGVBZGRyVmFsdmUiPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJhbGxvdyIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgY29tbWEtZGVsaW1pdGVkIHNldCBvZiBhbGxvdyBleHByZXNzaW9ucyIKKyAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29udGFpbmVyTmFtZSIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJPYmplY3QgbmFtZSBvZiB0aGUgY29udGFpbmVyIgorICAgICAgICAgICAgICAgdHlwZT0iamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lIi8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0iY2xhc3NOYW1lIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IkZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBtYW5hZ2VkIG9iamVjdCIKKyAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0iZGVueSIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgY29tbWEtZGVsaW1pdGVkIHNldCBvZiBkZW55IGV4cHJlc3Npb25zIgorICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorCisgIDwvbWJlYW4+CisKKyAgPG1iZWFuIG5hbWU9IlJlbW90ZUhvc3RWYWx2ZSIKKyAgICAgICAgIGRlc2NyaXB0aW9uPSJDb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiBSZXF1ZXN0RmlsdGVyVmFsdmUgdGhhdAorICAgICAgICAgZmlsdGVycyBiYXNlZCBvbiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByZW1vdGUKKyAgICAgICAgIGNsaWVudCdzIGhvc3QgbmFtZSIKKyAgICAgICAgIGRvbWFpbj0iQ2F0YWxpbmEiCisgICAgICAgICBncm91cD0iVmFsdmUiCisgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcy5SZW1vdGVIb3N0VmFsdmUiPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImFsbG93IgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBjb21tYS1kZWxpbWl0ZWQgc2V0IG9mIGFsbG93IGV4cHJlc3Npb25zIgorICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb250YWluZXJOYW1lIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249Ik9iamVjdCBuYW1lIG9mIHRoZSBjb250YWluZXIiCisgICAgICAgICAgICAgICB0eXBlPSJqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWUiLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJjbGFzc05hbWUiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iRnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIG1hbmFnZWQgb2JqZWN0IgorICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJkZW55IgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBjb21tYS1kZWxpbWl0ZWQgc2V0IG9mIGRlbnkgZXhwcmVzc2lvbnMiCisgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisKKyAgPC9tYmVhbj4KKworICA8bWJlYW4gbmFtZT0iUmVxdWVzdER1bXBlclZhbHZlIgorICAgICAgICAgZGVzY3JpcHRpb249IkltcGxlbWVudGF0aW9uIG9mIGEgVmFsdmUgdGhhdCBsb2dzIGludGVyZXN0aW5nIGNvbnRlbnRzIGZyb20gdGhlIHNwZWNpZmllZCBSZXF1ZXN0IGFuZCB0aGUgY29ycmVzcG9uZGluZyBSZXNwb25zZSIKKyAgICAgICAgIGRvbWFpbj0iQ2F0YWxpbmEiCisgICAgICAgICBncm91cD0iVmFsdmUiCisgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcy5SZXF1ZXN0RHVtcGVyVmFsdmUiPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb250YWluZXJOYW1lIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249Ik9iamVjdCBuYW1lIG9mIHRoZSBjb250YWluZXIiCisgICAgICAgICAgICAgICB0eXBlPSJqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWUiLz4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NOYW1lIgorICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IkZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBtYW5hZ2VkIG9iamVjdCIKKyAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8+CisKKyAgPC9tYmVhbj4KKworICA8bWJlYW4gbmFtZT0iUmVxdWVzdExpc3RlbmVyVmFsdmUiCisgICAgICAgICBkZXNjcmlwdGlvbj0iVmFsdmUgdGhhdCBoYW5kbGVzIHJlcXVlc3QgaW5pdGlhbGl6YXRpb24gYW5kIGRlc3Ryb3kgZXZlbnRzIgorICAgICAgICAgZG9tYWluPSJDYXRhbGluYSIKKyAgICAgICAgIGdyb3VwPSJWYWx2ZSIKKyAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUuY2F0YWxpbmEudmFsdmVzLlJlcXVlc3RMaXN0ZW5lclZhbHZlIj4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJjbGFzc05hbWUiCisgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iRnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIG1hbmFnZWQgb2JqZWN0IgorICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29udGFpbmVyTmFtZSIKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJPYmplY3QgbmFtZSBvZiB0aGUgY29udGFpbmVyIgorICAgICAgICAgICAgICAgdHlwZT0iamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lIi8+CisKKyAgPC9tYmVhbj4KKworPC9tYmVhbnMtZGVzY3JpcHRvcnM+CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdmFsdmVzL3BhY2thZ2UuaHRtbCBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS92YWx2ZXMvcGFja2FnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzY2QwYWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvdmFsdmVzL3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDEyIEBACis8Ym9keT4KKworPHA+VGhpcyBwYWNrYWdlIGNvbnRhaW5zIGEgdmFyaWV0eSBvZiBzbWFsbCBWYWx2ZSBpbXBsZW1lbnRhdGlvbnMgdGhhdCBkbworbm90IHdhcnJhbnQgYmVpbmcgcGFja2FnZWQgc2VwYXJhdGVseS4gIEluIGFkZGl0aW9uLCB0aGVyZSBpcyBhIGNvbnZlbmllbmNlCitiYXNlIGNsYXNzICg8Y29kZT5WYWx2ZUJhc2U8L2NvZGU+KSB0aGF0IHN1cHBvcnRzIHRoZSB1c3VhbCBtZWNoYW5pc21zIGZvcgoraW5jbHVkaW5nIGN1c3RvbSBWYWx2ZXMgaW50byB0aGUgY29ycmVzcG9uZGluZyBQaXBlbGluZS48L3A+CisKKzxwPk90aGVyIHBhY2thZ2VzIHRoYXQgaW5jbHVkZSBWYWx2ZXMgaW5jbHVkZQorPGNvZGU+b3JnLmFwYWNoZS50b21jYXQubG9nZ2VyPC9jb2RlPiBhbmQKKzxjb2RlPm9yZy5hcGFjaGUudG9tY2F0LnNlY3VyaXR5PC9jb2RlPi48L3A+CisKKzwvYm9keT4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvQ29uc3RhbnRzLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL0NvbnN0YW50cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyN2M4ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL0NvbnN0YW50cy5qYXZhCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8gCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm5hbWluZzsKKworCisvKioKKyAqIFN0YXRpYyBjb25zdGFudHMgZm9yIHRoaXMgcGFja2FnZS4KKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgQ29uc3RhbnRzIHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBhY2thZ2UgPSAib3JnLmFwYWNoZS5uYW1pbmciOworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL0NvbnRleHRBY2Nlc3NDb250cm9sbGVyLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL0NvbnRleHRBY2Nlc3NDb250cm9sbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI1MGY0MwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvQ29udGV4dEFjY2Vzc0NvbnRyb2xsZXIuamF2YQpAQCAtMCwwICsxLDEyOCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLyAKKworCitwYWNrYWdlIG9yZy5hcGFjaGUubmFtaW5nOworCitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKKworLyoqCisgKiBIYW5kbGVzIHRoZSBhY2Nlc3MgY29udHJvbCBvbiB0aGUgSk5ESSBjb250ZXh0cy4KKyAqCisgKiBAYXV0aG9yIFJlbXkgTWF1Y2hlcmF0CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBDb250ZXh0QWNjZXNzQ29udHJvbGxlciB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBDYXRhbGluYSBjb250ZXh0IG5hbWVzIG9uIHdoaWNoIHdyaXRpbmcgaXMgbm90IGFsbG93ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgSGFzaHRhYmxlIHJlYWRPbmx5Q29udGV4dHMgPSBuZXcgSGFzaHRhYmxlKCk7CisKKworICAgIC8qKgorICAgICAqIFNlY3VyaXR5IHRva2VucyByZXBvc2l0b3J5LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIEhhc2h0YWJsZSBzZWN1cml0eVRva2VucyA9IG5ldyBIYXNodGFibGUoKTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFNldCBhIHNlY3VyaXR5IHRva2VuIGZvciBhIGNvbnRleHQuIENhbiBiZSBzZXQgb25seSBvbmNlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIGNvbnRleHQKKyAgICAgKiBAcGFyYW0gdG9rZW4gU2VjdXJpdHkgdG9rZW4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0U2VjdXJpdHlUb2tlbihPYmplY3QgbmFtZSwgT2JqZWN0IHRva2VuKSB7CisgICAgICAgIGlmICgoIXNlY3VyaXR5VG9rZW5zLmNvbnRhaW5zS2V5KG5hbWUpKSAmJiAodG9rZW4gIT0gbnVsbCkpIHsKKyAgICAgICAgICAgIHNlY3VyaXR5VG9rZW5zLnB1dChuYW1lLCB0b2tlbik7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhIHNlY3VyaXR5IHRva2VuIGZvciBhIGNvbnRleHQuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgY29udGV4dAorICAgICAqIEBwYXJhbSB0b2tlbiBTZWN1cml0eSB0b2tlbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB1bnNldFNlY3VyaXR5VG9rZW4oT2JqZWN0IG5hbWUsIE9iamVjdCB0b2tlbikgeworICAgICAgICBpZiAoY2hlY2tTZWN1cml0eVRva2VuKG5hbWUsIHRva2VuKSkgeworICAgICAgICAgICAgc2VjdXJpdHlUb2tlbnMucmVtb3ZlKG5hbWUpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDaGVjayBhIHN1Ym1pdHRlZCBzZWN1cml0eSB0b2tlbi4gVGhlIHN1Ym1pdHRlZCB0b2tlbiBtdXN0IGJlIGVxdWFsIHRvCisgICAgICogdGhlIHRva2VuIHByZXNlbnQgaW4gdGhlIHJlcG9zaXRvcnkuIElmIG5vIHRva2VuIGlzIHByZXNlbnQgZm9yIHRoZSAKKyAgICAgKiBjb250ZXh0LCB0aGVuIHJldHVybnMgdHJ1ZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBjb250ZXh0CisgICAgICogQHBhcmFtIHRva2VuIFN1Ym1pdHRlZCBzZWN1cml0eSB0b2tlbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjaGVja1NlY3VyaXR5VG9rZW4KKyAgICAgICAgKE9iamVjdCBuYW1lLCBPYmplY3QgdG9rZW4pIHsKKyAgICAgICAgT2JqZWN0IHJlZlRva2VuID0gc2VjdXJpdHlUb2tlbnMuZ2V0KG5hbWUpOworICAgICAgICBpZiAocmVmVG9rZW4gPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAodHJ1ZSk7CisgICAgICAgIGlmICgocmVmVG9rZW4gIT0gbnVsbCkgJiYgKHJlZlRva2VuLmVxdWFscyh0b2tlbikpKQorICAgICAgICAgICAgcmV0dXJuICh0cnVlKTsKKyAgICAgICAgcmV0dXJuIChmYWxzZSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBbGxvdyB3cml0aW5nIHRvIGEgY29udGV4dC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBjb250ZXh0CisgICAgICogQHBhcmFtIHRva2VuIFNlY3VyaXR5IHRva2VuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFdyaXRhYmxlKE9iamVjdCBuYW1lLCBPYmplY3QgdG9rZW4pIHsKKyAgICAgICAgaWYgKGNoZWNrU2VjdXJpdHlUb2tlbihuYW1lLCB0b2tlbikpCisgICAgICAgICAgICByZWFkT25seUNvbnRleHRzLnJlbW92ZShuYW1lKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB3aGV0aGVyIG9yIG5vdCBhIGNvbnRleHQgaXMgd3JpdGFibGUuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgY29udGV4dAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRSZWFkT25seShPYmplY3QgbmFtZSkgeworICAgICAgICByZWFkT25seUNvbnRleHRzLnB1dChuYW1lLCBuYW1lKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybnMgaWYgYSBjb250ZXh0IGlzIHdyaXRhYmxlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIGNvbnRleHQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNXcml0YWJsZShPYmplY3QgbmFtZSkgeworICAgICAgICByZXR1cm4gIShyZWFkT25seUNvbnRleHRzLmNvbnRhaW5zS2V5KG5hbWUpKTsKKyAgICB9CisKKworfQorCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL0NvbnRleHRCaW5kaW5ncy5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9Db250ZXh0QmluZGluZ3MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGIzYmQzCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9Db250ZXh0QmluZGluZ3MuamF2YQpAQCAtMCwwICsxLDM2MiBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLyAKKworCitwYWNrYWdlIG9yZy5hcGFjaGUubmFtaW5nOworCitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm5hbWluZy5Db250ZXh0OworCisvKioKKyAqIEhhbmRsZXMgdGhlIGFzc29jaWF0aW9ucyA6CisgKiA8dWw+CisgKiA8bGk+Q2F0YWxpbmEgY29udGV4dCBuYW1lIHdpdGggdGhlIE5hbWluZ0NvbnRleHQ8L2xpPgorICogPGxpPkNhbGxpbmcgdGhyZWFkIHdpdGggdGhlIE5hbWluZ0NvbnRleHQ8L2xpPgorICogPC91bD4KKyAqCisgKiBAYXV0aG9yIFJlbXkgTWF1Y2hlcmF0CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBDb250ZXh0QmluZGluZ3MgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogQmluZGluZ3MgbmFtZSAtIG5hbWluZyBjb250ZXh0LiBLZXllZCBieSBuYW1lLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIEhhc2h0YWJsZSBjb250ZXh0TmFtZUJpbmRpbmdzID0gbmV3IEhhc2h0YWJsZSgpOworCisKKyAgICAvKioKKyAgICAgKiBCaW5kaW5ncyB0aHJlYWQgLSBuYW1pbmcgY29udGV4dC4gS2V5ZWQgYnkgdGhyZWFkIGlkLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIEhhc2h0YWJsZSB0aHJlYWRCaW5kaW5ncyA9IG5ldyBIYXNodGFibGUoKTsKKworCisgICAgLyoqCisgICAgICogQmluZGluZ3MgdGhyZWFkIC0gbmFtZS4gS2V5ZWQgYnkgdGhyZWFkIGlkLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIEhhc2h0YWJsZSB0aHJlYWROYW1lQmluZGluZ3MgPSBuZXcgSGFzaHRhYmxlKCk7CisKKworICAgIC8qKgorICAgICAqIEJpbmRpbmdzIGNsYXNzIGxvYWRlciAtIG5hbWluZyBjb250ZXh0LiBLZXllZCBieSBDTCBpZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBIYXNodGFibGUgY2xCaW5kaW5ncyA9IG5ldyBIYXNodGFibGUoKTsKKworCisgICAgLyoqCisgICAgICogQmluZGluZ3MgY2xhc3MgbG9hZGVyIC0gbmFtZS4gS2V5ZWQgYnkgQ0wgaWQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgSGFzaHRhYmxlIGNsTmFtZUJpbmRpbmdzID0gbmV3IEhhc2h0YWJsZSgpOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc3RyaW5nIG1hbmFnZXIgZm9yIHRoaXMgcGFja2FnZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZ01hbmFnZXIgc20gPSAKKyAgICAgICAgU3RyaW5nTWFuYWdlci5nZXRNYW5hZ2VyKENvbnN0YW50cy5QYWNrYWdlKTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIEJpbmRzIGEgY29udGV4dCBuYW1lLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIGNvbnRleHQKKyAgICAgKiBAcGFyYW0gY29udGV4dCBBc3NvY2lhdGVkIG5hbWluZyBjb250ZXh0IGluc3RhbmNlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGJpbmRDb250ZXh0KE9iamVjdCBuYW1lLCBDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgYmluZENvbnRleHQobmFtZSwgY29udGV4dCwgbnVsbCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBCaW5kcyBhIGNvbnRleHQgbmFtZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBjb250ZXh0CisgICAgICogQHBhcmFtIGNvbnRleHQgQXNzb2NpYXRlZCBuYW1pbmcgY29udGV4dCBpbnN0YW5jZQorICAgICAqIEBwYXJhbSB0b2tlbiBTZWN1cml0eSB0b2tlbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBiaW5kQ29udGV4dChPYmplY3QgbmFtZSwgQ29udGV4dCBjb250ZXh0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHRva2VuKSB7CisgICAgICAgIGlmIChDb250ZXh0QWNjZXNzQ29udHJvbGxlci5jaGVja1NlY3VyaXR5VG9rZW4obmFtZSwgdG9rZW4pKQorICAgICAgICAgICAgY29udGV4dE5hbWVCaW5kaW5ncy5wdXQobmFtZSwgY29udGV4dCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBVbmJpbmQgY29udGV4dCBuYW1lLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIGNvbnRleHQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgdW5iaW5kQ29udGV4dChPYmplY3QgbmFtZSkgeworICAgICAgICB1bmJpbmRDb250ZXh0KG5hbWUsIG51bGwpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVW5iaW5kIGNvbnRleHQgbmFtZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBjb250ZXh0CisgICAgICogQHBhcmFtIHRva2VuIFNlY3VyaXR5IHRva2VuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHVuYmluZENvbnRleHQoT2JqZWN0IG5hbWUsIE9iamVjdCB0b2tlbikgeworICAgICAgICBpZiAoQ29udGV4dEFjY2Vzc0NvbnRyb2xsZXIuY2hlY2tTZWN1cml0eVRva2VuKG5hbWUsIHRva2VuKSkKKyAgICAgICAgICAgIGNvbnRleHROYW1lQmluZGluZ3MucmVtb3ZlKG5hbWUpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0cmlldmUgYSBuYW1pbmcgY29udGV4dC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBjb250ZXh0CisgICAgICovCisgICAgc3RhdGljIENvbnRleHQgZ2V0Q29udGV4dChPYmplY3QgbmFtZSkgeworICAgICAgICByZXR1cm4gKENvbnRleHQpIGNvbnRleHROYW1lQmluZGluZ3MuZ2V0KG5hbWUpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQmluZHMgYSBuYW1pbmcgY29udGV4dCB0byBhIHRocmVhZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBjb250ZXh0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGJpbmRUaHJlYWQoT2JqZWN0IG5hbWUpIAorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgYmluZFRocmVhZChuYW1lLCBudWxsKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEJpbmRzIGEgbmFtaW5nIGNvbnRleHQgdG8gYSB0aHJlYWQuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgY29udGV4dAorICAgICAqIEBwYXJhbSB0b2tlbiBTZWN1cml0eSB0b2tlbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBiaW5kVGhyZWFkKE9iamVjdCBuYW1lLCBPYmplY3QgdG9rZW4pIAorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKENvbnRleHRBY2Nlc3NDb250cm9sbGVyLmNoZWNrU2VjdXJpdHlUb2tlbihuYW1lLCB0b2tlbikpIHsKKyAgICAgICAgICAgIENvbnRleHQgY29udGV4dCA9IChDb250ZXh0KSBjb250ZXh0TmFtZUJpbmRpbmdzLmdldChuYW1lKTsKKyAgICAgICAgICAgIGlmIChjb250ZXh0ID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5hbWluZ0V4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJjb250ZXh0QmluZGluZ3MudW5rbm93bkNvbnRleHQiLCBuYW1lKSk7CisgICAgICAgICAgICB0aHJlYWRCaW5kaW5ncy5wdXQoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSwgY29udGV4dCk7CisgICAgICAgICAgICB0aHJlYWROYW1lQmluZGluZ3MucHV0KFRocmVhZC5jdXJyZW50VGhyZWFkKCksIG5hbWUpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBVbmJpbmRzIGEgbmFtaW5nIGNvbnRleHQgdG8gYSB0aHJlYWQuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgY29udGV4dAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB1bmJpbmRUaHJlYWQoT2JqZWN0IG5hbWUpIHsKKyAgICAgICAgdW5iaW5kVGhyZWFkKG5hbWUsIG51bGwpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVW5iaW5kcyBhIG5hbWluZyBjb250ZXh0IHRvIGEgdGhyZWFkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIGNvbnRleHQKKyAgICAgKiBAcGFyYW0gdG9rZW4gU2VjdXJpdHkgdG9rZW4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgdW5iaW5kVGhyZWFkKE9iamVjdCBuYW1lLCBPYmplY3QgdG9rZW4pIHsKKyAgICAgICAgaWYgKENvbnRleHRBY2Nlc3NDb250cm9sbGVyLmNoZWNrU2VjdXJpdHlUb2tlbihuYW1lLCB0b2tlbikpIHsKKyAgICAgICAgICAgIHRocmVhZEJpbmRpbmdzLnJlbW92ZShUaHJlYWQuY3VycmVudFRocmVhZCgpKTsKKyAgICAgICAgICAgIHRocmVhZE5hbWVCaW5kaW5ncy5yZW1vdmUoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgbmFtaW5nIGNvbnRleHQgYm91bmQgdG8gYSB0aHJlYWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDb250ZXh0IGdldFRocmVhZCgpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICBDb250ZXh0IGNvbnRleHQgPSAKKyAgICAgICAgICAgIChDb250ZXh0KSB0aHJlYWRCaW5kaW5ncy5nZXQoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSk7CisgICAgICAgIGlmIChjb250ZXh0ID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgTmFtaW5nRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygiY29udGV4dEJpbmRpbmdzLm5vQ29udGV4dEJvdW5kVG9UaHJlYWQiKSk7CisgICAgICAgIHJldHVybiBjb250ZXh0OworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSBuYW1pbmcgY29udGV4dCBuYW1lIGJvdW5kIHRvIGEgdGhyZWFkLgorICAgICAqLworICAgIHN0YXRpYyBPYmplY3QgZ2V0VGhyZWFkTmFtZSgpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICBPYmplY3QgbmFtZSA9IHRocmVhZE5hbWVCaW5kaW5ncy5nZXQoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSk7CisgICAgICAgIGlmIChuYW1lID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgTmFtaW5nRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygiY29udGV4dEJpbmRpbmdzLm5vQ29udGV4dEJvdW5kVG9UaHJlYWQiKSk7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGVzdHMgaWYgY3VycmVudCB0aHJlYWQgaXMgYm91bmQgdG8gYSBjb250ZXh0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1RocmVhZEJvdW5kKCkgeworICAgICAgICByZXR1cm4gKHRocmVhZEJpbmRpbmdzLmNvbnRhaW5zS2V5KFRocmVhZC5jdXJyZW50VGhyZWFkKCkpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEJpbmRzIGEgbmFtaW5nIGNvbnRleHQgdG8gYSBjbGFzcyBsb2FkZXIuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgY29udGV4dAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBiaW5kQ2xhc3NMb2FkZXIoT2JqZWN0IG5hbWUpIAorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgYmluZENsYXNzTG9hZGVyKG5hbWUsIG51bGwpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQmluZHMgYSBuYW1pbmcgY29udGV4dCB0byBhIHRocmVhZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBjb250ZXh0CisgICAgICogQHBhcmFtIHRva2VuIFNlY3VyaXR5IHRva2VuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGJpbmRDbGFzc0xvYWRlcihPYmplY3QgbmFtZSwgT2JqZWN0IHRva2VuKSAKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIGJpbmRDbGFzc0xvYWRlcgorICAgICAgICAgICAgKG5hbWUsIHRva2VuLCBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEJpbmRzIGEgbmFtaW5nIGNvbnRleHQgdG8gYSB0aHJlYWQuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgY29udGV4dAorICAgICAqIEBwYXJhbSB0b2tlbiBTZWN1cml0eSB0b2tlbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBiaW5kQ2xhc3NMb2FkZXIoT2JqZWN0IG5hbWUsIE9iamVjdCB0b2tlbiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICBpZiAoQ29udGV4dEFjY2Vzc0NvbnRyb2xsZXIuY2hlY2tTZWN1cml0eVRva2VuKG5hbWUsIHRva2VuKSkgeworICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gKENvbnRleHQpIGNvbnRleHROYW1lQmluZGluZ3MuZ2V0KG5hbWUpOworICAgICAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTmFtaW5nRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoImNvbnRleHRCaW5kaW5ncy51bmtub3duQ29udGV4dCIsIG5hbWUpKTsKKyAgICAgICAgICAgIGNsQmluZGluZ3MucHV0KGNsYXNzTG9hZGVyLCBjb250ZXh0KTsKKyAgICAgICAgICAgIGNsTmFtZUJpbmRpbmdzLnB1dChjbGFzc0xvYWRlciwgbmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFVuYmluZHMgYSBuYW1pbmcgY29udGV4dCB0byBhIGNsYXNzIGxvYWRlci4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBjb250ZXh0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHVuYmluZENsYXNzTG9hZGVyKE9iamVjdCBuYW1lKSB7CisgICAgICAgIHVuYmluZENsYXNzTG9hZGVyKG5hbWUsIG51bGwpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVW5iaW5kcyBhIG5hbWluZyBjb250ZXh0IHRvIGEgY2xhc3MgbG9hZGVyLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIGNvbnRleHQKKyAgICAgKiBAcGFyYW0gdG9rZW4gU2VjdXJpdHkgdG9rZW4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgdW5iaW5kQ2xhc3NMb2FkZXIoT2JqZWN0IG5hbWUsIE9iamVjdCB0b2tlbikgeworICAgICAgICB1bmJpbmRDbGFzc0xvYWRlcihuYW1lLCB0b2tlbiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVW5iaW5kcyBhIG5hbWluZyBjb250ZXh0IHRvIGEgY2xhc3MgbG9hZGVyLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIGNvbnRleHQKKyAgICAgKiBAcGFyYW0gdG9rZW4gU2VjdXJpdHkgdG9rZW4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgdW5iaW5kQ2xhc3NMb2FkZXIoT2JqZWN0IG5hbWUsIE9iamVjdCB0b2tlbiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKSB7CisgICAgICAgIGlmIChDb250ZXh0QWNjZXNzQ29udHJvbGxlci5jaGVja1NlY3VyaXR5VG9rZW4obmFtZSwgdG9rZW4pKSB7CisgICAgICAgICAgICBPYmplY3QgbiA9IGNsTmFtZUJpbmRpbmdzLmdldChjbGFzc0xvYWRlcik7CisgICAgICAgICAgICBpZiAoKG49PW51bGwpIHx8ICEobi5lcXVhbHMobmFtZSkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2xCaW5kaW5ncy5yZW1vdmUoY2xhc3NMb2FkZXIpOworICAgICAgICAgICAgY2xOYW1lQmluZGluZ3MucmVtb3ZlKGNsYXNzTG9hZGVyKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSBuYW1pbmcgY29udGV4dCBib3VuZCB0byBhIGNsYXNzIGxvYWRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENvbnRleHQgZ2V0Q2xhc3NMb2FkZXIoKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgQ2xhc3NMb2FkZXIgY2wgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOworICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBudWxsOworICAgICAgICBkbyB7CisgICAgICAgICAgICBjb250ZXh0ID0gKENvbnRleHQpIGNsQmluZGluZ3MuZ2V0KGNsKTsKKyAgICAgICAgICAgIGlmIChjb250ZXh0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAoKGNsID0gY2wuZ2V0UGFyZW50KCkpICE9IG51bGwpOworICAgICAgICB0aHJvdyBuZXcgTmFtaW5nRXhjZXB0aW9uCisgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJjb250ZXh0QmluZGluZ3Mubm9Db250ZXh0Qm91bmRUb0NMIikpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSBuYW1pbmcgY29udGV4dCBuYW1lIGJvdW5kIHRvIGEgY2xhc3MgbG9hZGVyLgorICAgICAqLworICAgIHN0YXRpYyBPYmplY3QgZ2V0Q2xhc3NMb2FkZXJOYW1lKCkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIENsYXNzTG9hZGVyIGNsID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKKyAgICAgICAgT2JqZWN0IG5hbWUgPSBudWxsOworICAgICAgICBkbyB7CisgICAgICAgICAgICBuYW1lID0gY2xOYW1lQmluZGluZ3MuZ2V0KGNsKTsKKyAgICAgICAgICAgIGlmIChuYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmFtZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAoKGNsID0gY2wuZ2V0UGFyZW50KCkpICE9IG51bGwpOworICAgICAgICB0aHJvdyBuZXcgTmFtaW5nRXhjZXB0aW9uCisgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJjb250ZXh0QmluZGluZ3Mubm9Db250ZXh0Qm91bmRUb0NMIikpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGVzdHMgaWYgY3VycmVudCBjbGFzcyBsb2FkZXIgaXMgYm91bmQgdG8gYSBjb250ZXh0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0NsYXNzTG9hZGVyQm91bmQoKSB7CisgICAgICAgIENsYXNzTG9hZGVyIGNsID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKKyAgICAgICAgZG8geworICAgICAgICAgICAgaWYgKGNsQmluZGluZ3MuY29udGFpbnNLZXkoY2wpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gd2hpbGUgKChjbCA9IGNsLmdldFBhcmVudCgpKSAhPSBudWxsKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL0VqYlJlZi5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9FamJSZWYuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzU4Y2I4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9FamJSZWYuamF2YQpAQCAtMCwwICsxLDEzNyBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLyAKKworCitwYWNrYWdlIG9yZy5hcGFjaGUubmFtaW5nOworCitpbXBvcnQgamF2YXgubmFtaW5nLkNvbnRleHQ7CitpbXBvcnQgamF2YXgubmFtaW5nLlJlZmVyZW5jZTsKK2ltcG9ydCBqYXZheC5uYW1pbmcuU3RyaW5nUmVmQWRkcjsKKworLyoqCisgKiBSZXByZXNlbnRzIGEgcmVmZXJlbmNlIGFkZHJlc3MgdG8gYW4gRUpCLgorICoKKyAqIEBhdXRob3IgUmVteSBNYXVjaGVyYXQKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEVqYlJlZgorICAgIGV4dGVuZHMgUmVmZXJlbmNlIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RhbnRzCisKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgZmFjdG9yeSBmb3IgdGhpcyByZWZlcmVuY2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9GQUNUT1JZID0gCisgICAgICAgIG9yZy5hcGFjaGUubmFtaW5nLmZhY3RvcnkuQ29uc3RhbnRzLkRFRkFVTFRfRUpCX0ZBQ1RPUlk7CisKKworICAgIC8qKgorICAgICAqIEVKQiB0eXBlIGFkZHJlc3MgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFID0gInR5cGUiOworCisKKyAgICAvKioKKyAgICAgKiBSZW1vdGUgaW50ZXJmYWNlIGNsYXNzbmFtZSBhZGRyZXNzIHR5cGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVNT1RFID0gInJlbW90ZSI7CisKKworICAgIC8qKgorICAgICAqIExpbmsgYWRkcmVzcyB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJTksgPSAibGluayI7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvKioKKyAgICAgKiBFSkIgUmVmZXJlbmNlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBlamJUeXBlIEVKQiB0eXBlCisgICAgICogQHBhcmFtIGhvbWUgSG9tZSBpbnRlcmZhY2UgY2xhc3NuYW1lCisgICAgICogQHBhcmFtIHJlbW90ZSBSZW1vdGUgaW50ZXJmYWNlIGNsYXNzbmFtZQorICAgICAqIEBwYXJhbSBsaW5rIEVKQiBsaW5rCisgICAgICovCisgICAgcHVibGljIEVqYlJlZihTdHJpbmcgZWpiVHlwZSwgU3RyaW5nIGhvbWUsIFN0cmluZyByZW1vdGUsIFN0cmluZyBsaW5rKSB7CisgICAgICAgIHRoaXMoZWpiVHlwZSwgaG9tZSwgcmVtb3RlLCBsaW5rLCBudWxsLCBudWxsKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEVKQiBSZWZlcmVuY2UuCisgICAgICogCisgICAgICogQHBhcmFtIGVqYlR5cGUgRUpCIHR5cGUKKyAgICAgKiBAcGFyYW0gaG9tZSBIb21lIGludGVyZmFjZSBjbGFzc25hbWUKKyAgICAgKiBAcGFyYW0gcmVtb3RlIFJlbW90ZSBpbnRlcmZhY2UgY2xhc3NuYW1lCisgICAgICogQHBhcmFtIGxpbmsgRUpCIGxpbmsKKyAgICAgKi8KKyAgICBwdWJsaWMgRWpiUmVmKFN0cmluZyBlamJUeXBlLCBTdHJpbmcgaG9tZSwgU3RyaW5nIHJlbW90ZSwgU3RyaW5nIGxpbmssCisgICAgICAgICAgICAgICAgICBTdHJpbmcgZmFjdG9yeSwgU3RyaW5nIGZhY3RvcnlMb2NhdGlvbikgeworICAgICAgICBzdXBlcihob21lLCBmYWN0b3J5LCBmYWN0b3J5TG9jYXRpb24pOworICAgICAgICBTdHJpbmdSZWZBZGRyIHJlZkFkZHIgPSBudWxsOworICAgICAgICBpZiAoZWpiVHlwZSAhPSBudWxsKSB7CisgICAgICAgICAgICByZWZBZGRyID0gbmV3IFN0cmluZ1JlZkFkZHIoVFlQRSwgZWpiVHlwZSk7CisgICAgICAgICAgICBhZGQocmVmQWRkcik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlbW90ZSAhPSBudWxsKSB7CisgICAgICAgICAgICByZWZBZGRyID0gbmV3IFN0cmluZ1JlZkFkZHIoUkVNT1RFLCByZW1vdGUpOworICAgICAgICAgICAgYWRkKHJlZkFkZHIpOworICAgICAgICB9CisgICAgICAgIGlmIChsaW5rICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJlZkFkZHIgPSBuZXcgU3RyaW5nUmVmQWRkcihMSU5LLCBsaW5rKTsKKyAgICAgICAgICAgIGFkZChyZWZBZGRyKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFJlZkFkZHIgTWV0aG9kcworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUmVmZXJlbmNlIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSBjbGFzcyBuYW1lIG9mIHRoZSBmYWN0b3J5IG9mIHRoZSBvYmplY3QgdG8gd2hpY2ggdGhpcyAKKyAgICAgKiByZWZlcmVuY2UgcmVmZXJzLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmFjdG9yeUNsYXNzTmFtZSgpIHsKKyAgICAgICAgU3RyaW5nIGZhY3RvcnkgPSBzdXBlci5nZXRGYWN0b3J5Q2xhc3NOYW1lKCk7CisgICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWN0b3J5OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmFjdG9yeSA9IFN5c3RlbS5nZXRQcm9wZXJ0eShDb250ZXh0Lk9CSkVDVF9GQUNUT1JJRVMpOworICAgICAgICAgICAgaWYgKGZhY3RvcnkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gREVGQVVMVF9GQUNUT1JZOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL0puZGlQZXJtaXNzaW9uLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL0puZGlQZXJtaXNzaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM0ZTgxMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvSm5kaVBlcm1pc3Npb24uamF2YQpAQCAtMCwwICsxLDYxIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovIAorCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5uYW1pbmc7CisKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkJhc2ljUGVybWlzc2lvbjsKKworLyoqCisgKiBKYXZhIFNlY3VyaXR5TWFuYWdlciBQZXJtaXNzaW9uIGNsYXNzIGZvciBKTkRJIG5hbWUgYmFzZWQgZmlsZSByZXNvdXJjZXMKKyAqIDxwPgorICogVGhlIEpuZGlQZXJtaXNzaW9uIGV4dGVuZHMgdGhlIEJhc2ljUGVybWlzc2lvbi4KKyAqIFRoZSBwZXJtaXNzaW9uIG5hbWUgaXMgYSBmdWxsIG9yIHBhcnRpYWwgam5kaSByZXNvdXJjZSBuYW1lLgorICogQW4gKiBjYW4gYmUgdXNlZCBhdCB0aGUgZW5kIG9mIHRoZSBuYW1lIHRvIG1hdGNoIGFsbCBuYW1lZAorICogcmVzb3VyY2VzIHRoYXQgc3RhcnQgd2l0aCBuYW1lLiAgVGhlcmUgYXJlIG5vIGFjdGlvbnMuPC9wPgorICogPHA+CisgKiBFeGFtcGxlIHRoYXQgZ3JhbnRzIHBlcm1pc3Npb24gdG8gcmVhZCBhbGwgSk5ESSBmaWxlIGJhc2VkIHJlc291cmNlczoKKyAqIDxsaT4gcGVybWlzc2lvbiBvcmcuYXBhY2hlLm5hbWluZy5KbmRpUGVybWlzc2lvbiAiKiI7PC9saT4KKyAqIDwvcD4KKyAqCisgKiBAYXV0aG9yIEdsZW5uIE5pZWxzZW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIEpuZGlQZXJtaXNzaW9uIGV4dGVuZHMgQmFzaWNQZXJtaXNzaW9uIHsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBKbmRpUGVybWlzc2lvbiB3aXRoIG5vIGFjdGlvbnMKKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIC0gSk5ESSByZXNvdXJjZSBwYXRoIG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgSm5kaVBlcm1pc3Npb24oU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBKbmRpUGVybWlzc2lvbiB3aXRoIGFjdGlvbnMKKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIC0gSk5ESSByZXNvdXJjZSBwYXRoIG5hbWUKKyAgICAgKiBAcGFyYW0gYWN0aW9ucyAtIEpOREkgYWN0aW9ucyAobm9uZSBkZWZpbmVkKQorICAgICAqLworICAgIHB1YmxpYyBKbmRpUGVybWlzc2lvbihTdHJpbmcgbmFtZSwgU3RyaW5nIGFjdGlvbnMpIHsKKyAgICAgICAgc3VwZXIobmFtZSxhY3Rpb25zKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvTG9jYWxTdHJpbmdzLnByb3BlcnRpZXMgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL0xvY2FsU3RyaW5ncy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllZTdjNDgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL0xvY2FsU3RyaW5ncy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTEgQEAKK2NvbnRleHRCaW5kaW5ncy51bmtub3duQ29udGV4dD1Vbmtub3duIGNvbnRleHQgbmFtZSA6IHswfQorY29udGV4dEJpbmRpbmdzLm5vQ29udGV4dEJvdW5kVG9UaHJlYWQ9Tm8gbmFtaW5nIGNvbnRleHQgYm91bmQgdG8gdGhpcyB0aHJlYWQKK2NvbnRleHRCaW5kaW5ncy5ub0NvbnRleHRCb3VuZFRvQ0w9Tm8gbmFtaW5nIGNvbnRleHQgYm91bmQgdG8gdGhpcyBjbGFzcyBsb2FkZXIKK3NlbGVjdG9yQ29udGV4dC5ub0phdmFVcmw9VGhpcyBjb250ZXh0IG11c3QgYmUgYWNjZXNzZWQgdGhyb3VnaHQgYSBqYXZhOiBVUkwKK25hbWluZ0NvbnRleHQuY29udGV4dEV4cGVjdGVkPU5hbWUgaXMgbm90IGJvdW5kIHRvIGEgQ29udGV4dAorbmFtaW5nQ29udGV4dC5mYWlsUmVzb2x2aW5nUmVmZXJlbmNlPVVuZXhwZWN0ZWQgZXhjZXB0aW9uIHJlc29sdmluZyByZWZlcmVuY2UKK25hbWluZ0NvbnRleHQubmFtZU5vdEJvdW5kPU5hbWUgezB9IGlzIG5vdCBib3VuZCBpbiB0aGlzIENvbnRleHQKK25hbWluZ0NvbnRleHQucmVhZE9ubHk9Q29udGV4dCBpcyByZWFkIG9ubHkKK25hbWluZ0NvbnRleHQuaW52YWxpZE5hbWU9TmFtZSBpcyBub3QgdmFsaWQKK25hbWluZ0NvbnRleHQuYWxyZWFkeUJvdW5kPU5hbWUgezB9IGlzIGFscmVhZHkgYm91bmQgaW4gdGhpcyBDb250ZXh0CituYW1pbmdDb250ZXh0Lm5vQWJzb2x1dGVOYW1lPUNhbid0IGdlbmVyYXRlIGFuIGFic29sdXRlIG5hbWUgZm9yIHRoaXMgbmFtZXNwYWNlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9Mb2NhbFN0cmluZ3NfZXMucHJvcGVydGllcyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvTG9jYWxTdHJpbmdzX2VzLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWMyYzJiNgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvTG9jYWxTdHJpbmdzX2VzLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxNiBAQAorIyAkSWQkCisKKyMgbGFuZ3VhZ2UgZXMKKworIyBwYWNrYWdlIG9yZy5hcGFjaGUubmFtaW5nCisKKworY29udGV4dEJpbmRpbmdzLnVua25vd25Db250ZXh0PUNvbnRleHRvIHswfSBkZXNjb25vY2lkbyAKK2NvbnRleHRCaW5kaW5ncy5ub0NvbnRleHRCb3VuZFRvVGhyZWFkPU5vIGhheSBjb250ZXh0byBkZSBub21icmVzIGFzb2NpYWRvIGEgZXN0ZSBoaWxvCitzZWxlY3RvckNvbnRleHQubm9KYXZhVXJsPUVzdGUgY29udGV4dG8gZGViZSBkZSBzZXIgYWNjZWRpZG8gYSB0cmF2ZXMgZGUgdW5hIFVSTCBkZSB0aXBvIGphdmE6CituYW1pbmdDb250ZXh0LmNvbnRleHRFeHBlY3RlZD1FbCBub21icmUgbm8gZXN0YSBhc29jaWFkbyBhIG5pbmd1biBDb250ZXh0bworbmFtaW5nQ29udGV4dC5uYW1lTm90Qm91bmQ9RWwgbm9tYnJlIHswfSBubyBlc3RlIGFzb2NpYWRvIGEgZXN0ZSBjb250ZXh0bworbmFtaW5nQ29udGV4dC5yZWFkT25seT1FbCBjb250ZXh0byBlcyBkZSBzb2xvIGxlY3R1cmEKK25hbWluZ0NvbnRleHQuaW52YWxpZE5hbWU9Tm9tYnJlIG5vIHZhbGlkbworbmFtaW5nQ29udGV4dC5ub0Fic29sdXRlTmFtZT1ObyBzZSBwdWVkZSBnZW5lcmFyIHVuIG5vbWJyZSBhYnNvbHV0byBwYXJhIGVzdGUgZXNwYWNpbyBkZSBub21icmVzCituYW1pbmdDb250ZXh0LmFscmVhZHlCb3VuZD1FbCBub21icmUgezB9IGVzdGUgeWEgYXNvY2lhZG8gZW4gZXN0ZSBDb250ZXh0bwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9Mb2NhbFN0cmluZ3NfZnIucHJvcGVydGllcyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvTG9jYWxTdHJpbmdzX2ZyLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTExYTYwMgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvTG9jYWxTdHJpbmdzX2ZyLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxMSBAQAorY29udGV4dEJpbmRpbmdzLnVua25vd25Db250ZXh0PU5vbSBkZSBDb250ZXh0ZSBpbmNvbm51IDogezB9Citjb250ZXh0QmluZGluZ3Mubm9Db250ZXh0Qm91bmRUb1RocmVhZD1BdWN1biBDb250ZXh0ZSBkZSBub21tYWdlIGxp6SDgIGNlIHRocmVhZAorY29udGV4dEJpbmRpbmdzLm5vQ29udGV4dEJvdW5kVG9DTD1BdWN1biBDb250ZXh0ZSBkZSBub21tYWdlIGxp6SDgIGNlIGNoYXJnZXVyIGRlIGNsYXNzZXMKK3NlbGVjdG9yQ29udGV4dC5ub0phdmFVcmw9Q2UgQ29udGV4dGUgZG9pdCDqdHJlIGFjY+lk6SBwYXIgdW5lIGphdmE6IFVSTAorbmFtaW5nQ29udGV4dC5jb250ZXh0RXhwZWN0ZWQ9TGUgTm9tIG4nJ2VzdCBwYXMgbGnpIOAgdW4gQ29udGV4dGUKK25hbWluZ0NvbnRleHQuZmFpbFJlc29sdmluZ1JlZmVyZW5jZT1VbmUgZXJyZXVyIHMgZXN0IHByb2R1aXRlIGR1cmFudCBsYSBy6XNvbHV0aW9uIGRlIGxhIHLpZulyZW5jZQorbmFtaW5nQ29udGV4dC5uYW1lTm90Qm91bmQ9TGUgTm9tIHswfSBuJydlc3QgcGFzIGxp6SDgIGNlIENvbnRleHRlCituYW1pbmdDb250ZXh0LnJlYWRPbmx5PUxlIENvbnRleHRlIGVzdCBlbiBsZWN0dXJlIHNldWxlCituYW1pbmdDb250ZXh0LmludmFsaWROYW1lPUxlIE5vbSBlc3QgaW52YWxpZGUKK25hbWluZ0NvbnRleHQuYWxyZWFkeUJvdW5kPUxlIE5vbSB7MH0gZXN0IGTpauAgbGnpIOAgY2UgQ29udGV4dGUKK25hbWluZ0NvbnRleHQubm9BYnNvbHV0ZU5hbWU9SW1wb3NzaWJsZSBkZSBn6W7pcmVyIHVuIG5vbSBhYnNvbHUgcG91ciBjZXQgZXNwYWNlIGRlIG5vbW1hZ2UgKG5hbWVzcGFjZSkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL0xvY2FsU3RyaW5nc19qYS5wcm9wZXJ0aWVzIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9Mb2NhbFN0cmluZ3NfamEucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDA3ZWZkCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9Mb2NhbFN0cmluZ3NfamEucHJvcGVydGllcwpAQCAtMCwwICsxLDExIEBACitjb250ZXh0QmluZGluZ3MudW5rbm93bkNvbnRleHQ9XHU2NzJhXHU3N2U1XHUzMDZlXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4XHU1NDBkXHUzMDY3XHUzMDU5OiB7MH0KK2NvbnRleHRCaW5kaW5ncy5ub0NvbnRleHRCb3VuZFRvVGhyZWFkPVx1NTQwZFx1NTI0ZFx1NGVkOFx1MzA1MVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBhZFx1MzBiOVx1MzBjOFx1MzA2Zlx1MzA1M1x1MzA2ZVx1MzBiOVx1MzBlY1x1MzBjM1x1MzBjOVx1MzA2Ylx1MzBkMFx1MzBhNFx1MzBmM1x1MzBjOVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5MworY29udGV4dEJpbmRpbmdzLm5vQ29udGV4dEJvdW5kVG9DTD1cdTU0MGRcdTUyNGRcdTRlZDhcdTMwNTFcdTMwYjNcdTMwZjNcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzhcdTMwNmZcdTMwNTNcdTMwNmVcdTMwYWZcdTMwZTlcdTMwYjlcdTMwZWRcdTMwZmNcdTMwYzBcdTMwNmJcdTMwZDBcdTMwYTRcdTMwZjNcdTMwYzlcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNWJcdTMwOTMKK3NlbGVjdG9yQ29udGV4dC5ub0phdmFVcmw9XHUzMDUzXHUzMDZlXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4XHUzMDZiXHUzMDZmamF2YTogVVJMXHUzMDkyXHU3NTI4XHUzMDQ0XHUzMDY2XHUzMGEyXHUzMGFmXHUzMGJiXHUzMGI5XHUzMDU1XHUzMDhjXHUzMDZkXHUzMDcwXHUzMDQ0XHUzMDUxXHUzMDdlXHUzMDViXHUzMDkzCituYW1pbmdDb250ZXh0LmNvbnRleHRFeHBlY3RlZD1cdTU0MGRcdTUyNGRcdTMwNGNcdTMwYjNcdTMwZjNcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzhcdTMwNmJcdTMwZDBcdTMwYTRcdTMwZjNcdTMwYzlcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNWJcdTMwOTMKK25hbWluZ0NvbnRleHQuZmFpbFJlc29sdmluZ1JlZmVyZW5jZT1cdTUzYzJcdTcxNjdcdTMwNmVcdTg5ZTNcdTZjN2FcdTRlMmRcdTMwNmJcdTRlODhcdTZlMmNcdTMwNTdcdTMwNmFcdTMwNDRcdTRmOGJcdTU5MTZcdTMwNGNcdTc2N2FcdTc1MWZcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWYKK25hbWluZ0NvbnRleHQubmFtZU5vdEJvdW5kPVx1NTQwZFx1NTI0ZCB7MH0gXHUzMDZmXHUzMDUzXHUzMDZlXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4XHUzMDZiXHUzMGQwXHUzMGE0XHUzMGYzXHUzMGM5XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzCituYW1pbmdDb250ZXh0LnJlYWRPbmx5PVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBhZFx1MzBiOVx1MzBjOFx1MzA2Zlx1MzBlYVx1MzBmY1x1MzBjOVx1MzBhYVx1MzBmM1x1MzBlYVx1MzBmY1x1MzA2N1x1MzA1OQorbmFtaW5nQ29udGV4dC5pbnZhbGlkTmFtZT1cdTU0MGRcdTUyNGRcdTMwNmZcdTcxMjFcdTUyYjlcdTMwNjdcdTMwNTkKK25hbWluZ0NvbnRleHQuYWxyZWFkeUJvdW5kPVx1NTQwZFx1NTI0ZCB7MH0gXHUzMDZmXHU2NWUyXHUzMDZiXHUzMDUzXHUzMDZlXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4XHUzMDZiXHUzMGQwXHUzMGE0XHUzMGYzXHUzMGM5XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5CituYW1pbmdDb250ZXh0Lm5vQWJzb2x1dGVOYW1lPVx1MzA1M1x1MzA2ZVx1NTQwZFx1NTI0ZFx1N2E3YVx1OTU5M1x1MzA2Ylx1N2Q3Nlx1NWJmZVx1NTQwZFx1MzA5Mlx1NzUxZlx1NjIxMFx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5MwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9OYW1lUGFyc2VySW1wbC5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9OYW1lUGFyc2VySW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2MTZlNDIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL05hbWVQYXJzZXJJbXBsLmphdmEKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLyAKKworCitwYWNrYWdlIG9yZy5hcGFjaGUubmFtaW5nOworCitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWVQYXJzZXI7CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWU7CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuQ29tcG9zaXRlTmFtZTsKKworLyoqCisgKiBQYXJzZXMgbmFtZXMuCisgKgorICogQGF1dGhvciBSZW15IE1hdWNoZXJhdAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgTmFtZVBhcnNlckltcGwgCisgICAgaW1wbGVtZW50cyBOYW1lUGFyc2VyIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE5hbWVQYXJzZXIgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBQYXJzZXMgYSBuYW1lIGludG8gaXRzIGNvbXBvbmVudHMuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgVGhlIG5vbi1udWxsIHN0cmluZyBuYW1lIHRvIHBhcnNlCisgICAgICogQHJldHVybiBBIG5vbi1udWxsIHBhcnNlZCBmb3JtIG9mIHRoZSBuYW1lIHVzaW5nIHRoZSBuYW1pbmcgY29udmVudGlvbiAKKyAgICAgKiBvZiB0aGlzIHBhcnNlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgTmFtZSBwYXJzZShTdHJpbmcgbmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgQ29tcG9zaXRlTmFtZShuYW1lKTsKKyAgICB9CisKKworfQorCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL05hbWluZ0NvbnRleHQuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvTmFtaW5nQ29udGV4dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmYjljOWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL05hbWluZ0NvbnRleHQuamF2YQpAQCAtMCwwICsxLDkwNyBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLyAKKworCitwYWNrYWdlIG9yZy5hcGFjaGUubmFtaW5nOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YXgubmFtaW5nLkNvbnRleHQ7CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWU7CitpbXBvcnQgamF2YXgubmFtaW5nLkxpbmtSZWY7CitpbXBvcnQgamF2YXgubmFtaW5nLkNvbXBvc2l0ZU5hbWU7CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWVQYXJzZXI7CitpbXBvcnQgamF2YXgubmFtaW5nLlJlZmVyZW5jZWFibGU7CitpbXBvcnQgamF2YXgubmFtaW5nLlJlZmVyZW5jZTsKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtaW5nRW51bWVyYXRpb247CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtZUFscmVhZHlCb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm5hbWluZy5Ob3RDb250ZXh0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm5hbWluZy5Jbml0aWFsQ29udGV4dDsKK2ltcG9ydCBqYXZheC5uYW1pbmcuT3BlcmF0aW9uTm90U3VwcG9ydGVkRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm5hbWluZy5zcGkuTmFtaW5nTWFuYWdlcjsKKworLyoqCisgKiBDYXRhbGluYSBKTkRJIENvbnRleHQgaW1wbGVtZW50YXRpb24uCisgKgorICogQGF1dGhvciBSZW15IE1hdWNoZXJhdAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworcHVibGljIGNsYXNzIE5hbWluZ0NvbnRleHQgaW1wbGVtZW50cyBDb250ZXh0IHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RhbnRzCisKKworICAgIC8qKgorICAgICAqIE5hbWUgcGFyc2VyIGZvciB0aGlzIGNvbnRleHQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBOYW1lUGFyc2VyIG5hbWVQYXJzZXIgPSBuZXcgTmFtZVBhcnNlckltcGwoKTsKKworCisgICAgcHJpdmF0ZSBzdGF0aWMgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGxvZyA9CisgICAgICAgIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3RvcnkuZ2V0TG9nKE5hbWluZ0NvbnRleHQuY2xhc3MpOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgLyoqCisgICAgICogQnVpbGRzIGEgbmFtaW5nIGNvbnRleHQgdXNpbmcgdGhlIGdpdmVuIGVudmlyb25tZW50LgorICAgICAqLworICAgIHB1YmxpYyBOYW1pbmdDb250ZXh0KEhhc2h0YWJsZSBlbnYsIFN0cmluZyBuYW1lKSAKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMuYmluZGluZ3MgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICB0aGlzLmVudiA9IG5ldyBIYXNodGFibGUoKTsKKyAgICAgICAgLy8gRklYTUUgPyBDb3VsZCBiZSBwdXQgaW4gdGhlIGVudmlyb25tZW50ID8KKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgLy8gUG9wdWxhdGluZyB0aGUgZW52aXJvbm1lbnQgaGFzaHRhYmxlCisgICAgICAgIGlmIChlbnYgIT0gbnVsbCApIHsKKyAgICAgICAgICAgIEVudW1lcmF0aW9uIGVudkVudHJpZXMgPSBlbnYua2V5cygpOworICAgICAgICAgICAgd2hpbGUgKGVudkVudHJpZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZW50cnlOYW1lID0gKFN0cmluZykgZW52RW50cmllcy5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgICAgIGFkZFRvRW52aXJvbm1lbnQoZW50cnlOYW1lLCBlbnYuZ2V0KGVudHJ5TmFtZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBCdWlsZHMgYSBuYW1pbmcgY29udGV4dCB1c2luZyB0aGUgZ2l2ZW4gZW52aXJvbm1lbnQuCisgICAgICovCisgICAgcHVibGljIE5hbWluZ0NvbnRleHQoSGFzaHRhYmxlIGVudiwgU3RyaW5nIG5hbWUsIEhhc2hNYXAgYmluZGluZ3MpIAorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgdGhpcyhlbnYsIG5hbWUpOworICAgICAgICB0aGlzLmJpbmRpbmdzID0gYmluZGluZ3M7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogRW52aXJvbm1lbnQuCisgICAgICovCisgICAgcHJvdGVjdGVkIEhhc2h0YWJsZSBlbnY7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzdHJpbmcgbWFuYWdlciBmb3IgdGhpcyBwYWNrYWdlLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmdNYW5hZ2VyIHNtID0gU3RyaW5nTWFuYWdlci5nZXRNYW5hZ2VyKENvbnN0YW50cy5QYWNrYWdlKTsKKworCisgICAgLyoqCisgICAgICogQmluZGluZ3MgaW4gdGhpcyBDb250ZXh0LgorICAgICAqLworICAgIHByb3RlY3RlZCBIYXNoTWFwIGJpbmRpbmdzOworCisKKyAgICAvKioKKyAgICAgKiBOYW1lIG9mIHRoZSBhc3NvY2lhdGVkIENhdGFsaW5hIENvbnRleHQuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBuYW1lOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29udGV4dCBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgbmFtZWQgb2JqZWN0LiBJZiBuYW1lIGlzIGVtcHR5LCByZXR1cm5zIGEgbmV3IGluc3RhbmNlIAorICAgICAqIG9mIHRoaXMgY29udGV4dCAod2hpY2ggcmVwcmVzZW50cyB0aGUgc2FtZSBuYW1pbmcgY29udGV4dCBhcyB0aGlzIAorICAgICAqIGNvbnRleHQsIGJ1dCBpdHMgZW52aXJvbm1lbnQgbWF5IGJlIG1vZGlmaWVkIGluZGVwZW5kZW50bHkgYW5kIGl0IG1heSAKKyAgICAgKiBiZSBhY2Nlc3NlZCBjb25jdXJyZW50bHkpLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBvYmplY3QgdG8gbG9vayB1cAorICAgICAqIEByZXR1cm4gdGhlIG9iamVjdCBib3VuZCB0byBuYW1lCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBsb29rdXAoTmFtZSBuYW1lKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGxvb2t1cChuYW1lLCB0cnVlKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgbmFtZWQgb2JqZWN0LgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBvYmplY3QgdG8gbG9vayB1cAorICAgICAqIEByZXR1cm4gdGhlIG9iamVjdCBib3VuZCB0byBuYW1lCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBsb29rdXAoU3RyaW5nIG5hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbG9va3VwKG5ldyBDb21wb3NpdGVOYW1lKG5hbWUpLCB0cnVlKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEJpbmRzIGEgbmFtZSB0byBhbiBvYmplY3QuIEFsbCBpbnRlcm1lZGlhdGUgY29udGV4dHMgYW5kIHRoZSB0YXJnZXQgCisgICAgICogY29udGV4dCAodGhhdCBuYW1lZCBieSBhbGwgYnV0IHRlcm1pbmFsIGF0b21pYyBjb21wb25lbnQgb2YgdGhlIG5hbWUpIAorICAgICAqIG11c3QgYWxyZWFkeSBleGlzdC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSB0byBiaW5kOyBtYXkgbm90IGJlIGVtcHR5CisgICAgICogQHBhcmFtIG9iaiB0aGUgb2JqZWN0IHRvIGJpbmQ7IHBvc3NpYmx5IG51bGwKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWVBbHJlYWR5Qm91bmRFeGNlcHRpb24gaWYgbmFtZSBpcyBhbHJlYWR5IGJvdW5kCisgICAgICogQGV4Y2VwdGlvbiBJbnZhbGlkQXR0cmlidXRlc0V4Y2VwdGlvbiBpZiBvYmplY3QgZGlkIG5vdCBzdXBwbHkgYWxsIAorICAgICAqIG1hbmRhdG9yeSBhdHRyaWJ1dGVzCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYmluZChOYW1lIG5hbWUsIE9iamVjdCBvYmopCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICBiaW5kKG5hbWUsIG9iaiwgZmFsc2UpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQmluZHMgYSBuYW1lIHRvIGFuIG9iamVjdC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSB0byBiaW5kOyBtYXkgbm90IGJlIGVtcHR5CisgICAgICogQHBhcmFtIG9iaiB0aGUgb2JqZWN0IHRvIGJpbmQ7IHBvc3NpYmx5IG51bGwKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWVBbHJlYWR5Qm91bmRFeGNlcHRpb24gaWYgbmFtZSBpcyBhbHJlYWR5IGJvdW5kCisgICAgICogQGV4Y2VwdGlvbiBJbnZhbGlkQXR0cmlidXRlc0V4Y2VwdGlvbiBpZiBvYmplY3QgZGlkIG5vdCBzdXBwbHkgYWxsIAorICAgICAqIG1hbmRhdG9yeSBhdHRyaWJ1dGVzCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYmluZChTdHJpbmcgbmFtZSwgT2JqZWN0IG9iaikKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIGJpbmQobmV3IENvbXBvc2l0ZU5hbWUobmFtZSksIG9iaik7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBCaW5kcyBhIG5hbWUgdG8gYW4gb2JqZWN0LCBvdmVyd3JpdGluZyBhbnkgZXhpc3RpbmcgYmluZGluZy4gQWxsIAorICAgICAqIGludGVybWVkaWF0ZSBjb250ZXh0cyBhbmQgdGhlIHRhcmdldCBjb250ZXh0ICh0aGF0IG5hbWVkIGJ5IGFsbCBidXQgCisgICAgICogdGVybWluYWwgYXRvbWljIGNvbXBvbmVudCBvZiB0aGUgbmFtZSkgbXVzdCBhbHJlYWR5IGV4aXN0LgorICAgICAqIDxwPgorICAgICAqIElmIHRoZSBvYmplY3QgaXMgYSBEaXJDb250ZXh0LCBhbnkgZXhpc3RpbmcgYXR0cmlidXRlcyBhc3NvY2lhdGVkIHdpdGggCisgICAgICogdGhlIG5hbWUgYXJlIHJlcGxhY2VkIHdpdGggdGhvc2Ugb2YgdGhlIG9iamVjdC4gT3RoZXJ3aXNlLCBhbnkgCisgICAgICogZXhpc3RpbmcgYXR0cmlidXRlcyBhc3NvY2lhdGVkIHdpdGggdGhlIG5hbWUgcmVtYWluIHVuY2hhbmdlZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSB0byBiaW5kOyBtYXkgbm90IGJlIGVtcHR5CisgICAgICogQHBhcmFtIG9iaiB0aGUgb2JqZWN0IHRvIGJpbmQ7IHBvc3NpYmx5IG51bGwKKyAgICAgKiBAZXhjZXB0aW9uIEludmFsaWRBdHRyaWJ1dGVzRXhjZXB0aW9uIGlmIG9iamVjdCBkaWQgbm90IHN1cHBseSBhbGwgCisgICAgICogbWFuZGF0b3J5IGF0dHJpYnV0ZXMKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWJpbmQoTmFtZSBuYW1lLCBPYmplY3Qgb2JqKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgYmluZChuYW1lLCBvYmosIHRydWUpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQmluZHMgYSBuYW1lIHRvIGFuIG9iamVjdCwgb3ZlcndyaXRpbmcgYW55IGV4aXN0aW5nIGJpbmRpbmcuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgdG8gYmluZDsgbWF5IG5vdCBiZSBlbXB0eQorICAgICAqIEBwYXJhbSBvYmogdGhlIG9iamVjdCB0byBiaW5kOyBwb3NzaWJseSBudWxsCisgICAgICogQGV4Y2VwdGlvbiBJbnZhbGlkQXR0cmlidXRlc0V4Y2VwdGlvbiBpZiBvYmplY3QgZGlkIG5vdCBzdXBwbHkgYWxsIAorICAgICAqIG1hbmRhdG9yeSBhdHRyaWJ1dGVzCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmViaW5kKFN0cmluZyBuYW1lLCBPYmplY3Qgb2JqKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgcmViaW5kKG5ldyBDb21wb3NpdGVOYW1lKG5hbWUpLCBvYmopOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVW5iaW5kcyB0aGUgbmFtZWQgb2JqZWN0LiBSZW1vdmVzIHRoZSB0ZXJtaW5hbCBhdG9taWMgbmFtZSBpbiBuYW1lIAorICAgICAqIGZyb20gdGhlIHRhcmdldCBjb250ZXh0LS10aGF0IG5hbWVkIGJ5IGFsbCBidXQgdGhlIHRlcm1pbmFsIGF0b21pYyAKKyAgICAgKiBwYXJ0IG9mIG5hbWUuCisgICAgICogPHA+CisgICAgICogVGhpcyBtZXRob2QgaXMgaWRlbXBvdGVudC4gSXQgc3VjY2VlZHMgZXZlbiBpZiB0aGUgdGVybWluYWwgYXRvbWljIAorICAgICAqIG5hbWUgaXMgbm90IGJvdW5kIGluIHRoZSB0YXJnZXQgY29udGV4dCwgYnV0IHRocm93cyAKKyAgICAgKiBOYW1lTm90Rm91bmRFeGNlcHRpb24gaWYgYW55IG9mIHRoZSBpbnRlcm1lZGlhdGUgY29udGV4dHMgZG8gbm90IGV4aXN0LiAKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSB0byBiaW5kOyBtYXkgbm90IGJlIGVtcHR5CisgICAgICogQGV4Y2VwdGlvbiBOYW1lTm90Rm91bmRFeGNlcHRpb24gaWYgYW4gaW50ZXJtZWRpYXRlIGNvbnRleHQgZG9lcyBub3QgCisgICAgICogZXhpc3QKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB1bmJpbmQoTmFtZSBuYW1lKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgY2hlY2tXcml0YWJsZSgpOworICAgICAgICAKKwl3aGlsZSAoKCFuYW1lLmlzRW1wdHkoKSkgJiYgKG5hbWUuZ2V0KDApLmxlbmd0aCgpID09IDApKQorCSAgICBuYW1lID0gbmFtZS5nZXRTdWZmaXgoMSk7CisgICAgICAgIGlmIChuYW1lLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBOYW1pbmdFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJuYW1pbmdDb250ZXh0LmludmFsaWROYW1lIikpOworICAgICAgICAKKyAgICAgICAgTmFtaW5nRW50cnkgZW50cnkgPSAoTmFtaW5nRW50cnkpIGJpbmRpbmdzLmdldChuYW1lLmdldCgwKSk7CisgICAgICAgIAorICAgICAgICBpZiAoZW50cnkgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE5hbWVOb3RGb3VuZEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoIm5hbWluZ0NvbnRleHQubmFtZU5vdEJvdW5kIiwgbmFtZS5nZXQoMCkpKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKG5hbWUuc2l6ZSgpID4gMSkgeworICAgICAgICAgICAgaWYgKGVudHJ5LnR5cGUgPT0gTmFtaW5nRW50cnkuQ09OVEVYVCkgeworICAgICAgICAgICAgICAgICgoQ29udGV4dCkgZW50cnkudmFsdWUpLnVuYmluZChuYW1lLmdldFN1ZmZpeCgxKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOYW1pbmdFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygibmFtaW5nQ29udGV4dC5jb250ZXh0RXhwZWN0ZWQiKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBiaW5kaW5ncy5yZW1vdmUobmFtZS5nZXQoMCkpOworICAgICAgICB9CisgICAgICAgIAorICAgIH0KKworCisgICAgLyoqCisgICAgICogVW5iaW5kcyB0aGUgbmFtZWQgb2JqZWN0LgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIHRvIGJpbmQ7IG1heSBub3QgYmUgZW1wdHkKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWVOb3RGb3VuZEV4Y2VwdGlvbiBpZiBhbiBpbnRlcm1lZGlhdGUgY29udGV4dCBkb2VzIG5vdCAKKyAgICAgKiBleGlzdAorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHVuYmluZChTdHJpbmcgbmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHVuYmluZChuZXcgQ29tcG9zaXRlTmFtZShuYW1lKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBCaW5kcyBhIG5ldyBuYW1lIHRvIHRoZSBvYmplY3QgYm91bmQgdG8gYW4gb2xkIG5hbWUsIGFuZCB1bmJpbmRzIHRoZSAKKyAgICAgKiBvbGQgbmFtZS4gQm90aCBuYW1lcyBhcmUgcmVsYXRpdmUgdG8gdGhpcyBjb250ZXh0LiBBbnkgYXR0cmlidXRlcyAKKyAgICAgKiBhc3NvY2lhdGVkIHdpdGggdGhlIG9sZCBuYW1lIGJlY29tZSBhc3NvY2lhdGVkIHdpdGggdGhlIG5ldyBuYW1lLiAKKyAgICAgKiBJbnRlcm1lZGlhdGUgY29udGV4dHMgb2YgdGhlIG9sZCBuYW1lIGFyZSBub3QgY2hhbmdlZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb2xkTmFtZSB0aGUgbmFtZSBvZiB0aGUgZXhpc3RpbmcgYmluZGluZzsgbWF5IG5vdCBiZSBlbXB0eQorICAgICAqIEBwYXJhbSBuZXdOYW1lIHRoZSBuYW1lIG9mIHRoZSBuZXcgYmluZGluZzsgbWF5IG5vdCBiZSBlbXB0eQorICAgICAqIEBleGNlcHRpb24gTmFtZUFscmVhZHlCb3VuZEV4Y2VwdGlvbiBpZiBuZXdOYW1lIGlzIGFscmVhZHkgYm91bmQKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW5hbWUoTmFtZSBvbGROYW1lLCBOYW1lIG5ld05hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICBPYmplY3QgdmFsdWUgPSBsb29rdXAob2xkTmFtZSk7CisgICAgICAgIGJpbmQobmV3TmFtZSwgdmFsdWUpOworICAgICAgICB1bmJpbmQob2xkTmFtZSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBCaW5kcyBhIG5ldyBuYW1lIHRvIHRoZSBvYmplY3QgYm91bmQgdG8gYW4gb2xkIG5hbWUsIGFuZCB1bmJpbmRzIHRoZSAKKyAgICAgKiBvbGQgbmFtZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb2xkTmFtZSB0aGUgbmFtZSBvZiB0aGUgZXhpc3RpbmcgYmluZGluZzsgbWF5IG5vdCBiZSBlbXB0eQorICAgICAqIEBwYXJhbSBuZXdOYW1lIHRoZSBuYW1lIG9mIHRoZSBuZXcgYmluZGluZzsgbWF5IG5vdCBiZSBlbXB0eQorICAgICAqIEBleGNlcHRpb24gTmFtZUFscmVhZHlCb3VuZEV4Y2VwdGlvbiBpZiBuZXdOYW1lIGlzIGFscmVhZHkgYm91bmQKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW5hbWUoU3RyaW5nIG9sZE5hbWUsIFN0cmluZyBuZXdOYW1lKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgcmVuYW1lKG5ldyBDb21wb3NpdGVOYW1lKG9sZE5hbWUpLCBuZXcgQ29tcG9zaXRlTmFtZShuZXdOYW1lKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBFbnVtZXJhdGVzIHRoZSBuYW1lcyBib3VuZCBpbiB0aGUgbmFtZWQgY29udGV4dCwgYWxvbmcgd2l0aCB0aGUgY2xhc3MgCisgICAgICogbmFtZXMgb2Ygb2JqZWN0cyBib3VuZCB0byB0aGVtLiBUaGUgY29udGVudHMgb2YgYW55IHN1YmNvbnRleHRzIGFyZSAKKyAgICAgKiBub3QgaW5jbHVkZWQuCisgICAgICogPHA+CisgICAgICogSWYgYSBiaW5kaW5nIGlzIGFkZGVkIHRvIG9yIHJlbW92ZWQgZnJvbSB0aGlzIGNvbnRleHQsIGl0cyBlZmZlY3Qgb24gCisgICAgICogYW4gZW51bWVyYXRpb24gcHJldmlvdXNseSByZXR1cm5lZCBpcyB1bmRlZmluZWQuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbnRleHQgdG8gbGlzdAorICAgICAqIEByZXR1cm4gYW4gZW51bWVyYXRpb24gb2YgdGhlIG5hbWVzIGFuZCBjbGFzcyBuYW1lcyBvZiB0aGUgYmluZGluZ3MgaW4gCisgICAgICogdGhpcyBjb250ZXh0LiBFYWNoIGVsZW1lbnQgb2YgdGhlIGVudW1lcmF0aW9uIGlzIG9mIHR5cGUgTmFtZUNsYXNzUGFpci4KKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgTmFtaW5nRW51bWVyYXRpb24gbGlzdChOYW1lIG5hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICAvLyBSZW1vdmluZyBlbXB0eSBwYXJ0cworICAgICAgICB3aGlsZSAoKCFuYW1lLmlzRW1wdHkoKSkgJiYgKG5hbWUuZ2V0KDApLmxlbmd0aCgpID09IDApKQorICAgICAgICAgICAgbmFtZSA9IG5hbWUuZ2V0U3VmZml4KDEpOworICAgICAgICBpZiAobmFtZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTmFtaW5nQ29udGV4dEVudW1lcmF0aW9uKGJpbmRpbmdzLnZhbHVlcygpLml0ZXJhdG9yKCkpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBOYW1pbmdFbnRyeSBlbnRyeSA9IChOYW1pbmdFbnRyeSkgYmluZGluZ3MuZ2V0KG5hbWUuZ2V0KDApKTsKKyAgICAgICAgCisgICAgICAgIGlmIChlbnRyeSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTmFtZU5vdEZvdW5kRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygibmFtaW5nQ29udGV4dC5uYW1lTm90Qm91bmQiLCBuYW1lLmdldCgwKSkpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoZW50cnkudHlwZSAhPSBOYW1pbmdFbnRyeS5DT05URVhUKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTmFtaW5nRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygibmFtaW5nQ29udGV4dC5jb250ZXh0RXhwZWN0ZWQiKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICgoQ29udGV4dCkgZW50cnkudmFsdWUpLmxpc3QobmFtZS5nZXRTdWZmaXgoMSkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogRW51bWVyYXRlcyB0aGUgbmFtZXMgYm91bmQgaW4gdGhlIG5hbWVkIGNvbnRleHQsIGFsb25nIHdpdGggdGhlIGNsYXNzIAorICAgICAqIG5hbWVzIG9mIG9iamVjdHMgYm91bmQgdG8gdGhlbS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgY29udGV4dCB0byBsaXN0CisgICAgICogQHJldHVybiBhbiBlbnVtZXJhdGlvbiBvZiB0aGUgbmFtZXMgYW5kIGNsYXNzIG5hbWVzIG9mIHRoZSBiaW5kaW5ncyBpbiAKKyAgICAgKiB0aGlzIGNvbnRleHQuIEVhY2ggZWxlbWVudCBvZiB0aGUgZW51bWVyYXRpb24gaXMgb2YgdHlwZSBOYW1lQ2xhc3NQYWlyLgorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBOYW1pbmdFbnVtZXJhdGlvbiBsaXN0KFN0cmluZyBuYW1lKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGxpc3QobmV3IENvbXBvc2l0ZU5hbWUobmFtZSkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogRW51bWVyYXRlcyB0aGUgbmFtZXMgYm91bmQgaW4gdGhlIG5hbWVkIGNvbnRleHQsIGFsb25nIHdpdGggdGhlIAorICAgICAqIG9iamVjdHMgYm91bmQgdG8gdGhlbS4gVGhlIGNvbnRlbnRzIG9mIGFueSBzdWJjb250ZXh0cyBhcmUgbm90IAorICAgICAqIGluY2x1ZGVkLgorICAgICAqIDxwPgorICAgICAqIElmIGEgYmluZGluZyBpcyBhZGRlZCB0byBvciByZW1vdmVkIGZyb20gdGhpcyBjb250ZXh0LCBpdHMgZWZmZWN0IG9uIAorICAgICAqIGFuIGVudW1lcmF0aW9uIHByZXZpb3VzbHkgcmV0dXJuZWQgaXMgdW5kZWZpbmVkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBjb250ZXh0IHRvIGxpc3QKKyAgICAgKiBAcmV0dXJuIGFuIGVudW1lcmF0aW9uIG9mIHRoZSBiaW5kaW5ncyBpbiB0aGlzIGNvbnRleHQuIAorICAgICAqIEVhY2ggZWxlbWVudCBvZiB0aGUgZW51bWVyYXRpb24gaXMgb2YgdHlwZSBCaW5kaW5nLgorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBOYW1pbmdFbnVtZXJhdGlvbiBsaXN0QmluZGluZ3MoTmFtZSBuYW1lKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gUmVtb3ZpbmcgZW1wdHkgcGFydHMKKyAgICAgICAgd2hpbGUgKCghbmFtZS5pc0VtcHR5KCkpICYmIChuYW1lLmdldCgwKS5sZW5ndGgoKSA9PSAwKSkKKyAgICAgICAgICAgIG5hbWUgPSBuYW1lLmdldFN1ZmZpeCgxKTsKKyAgICAgICAgaWYgKG5hbWUuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IE5hbWluZ0NvbnRleHRCaW5kaW5nc0VudW1lcmF0aW9uKGJpbmRpbmdzLnZhbHVlcygpLml0ZXJhdG9yKCkpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBOYW1pbmdFbnRyeSBlbnRyeSA9IChOYW1pbmdFbnRyeSkgYmluZGluZ3MuZ2V0KG5hbWUuZ2V0KDApKTsKKyAgICAgICAgCisgICAgICAgIGlmIChlbnRyeSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTmFtZU5vdEZvdW5kRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygibmFtaW5nQ29udGV4dC5uYW1lTm90Qm91bmQiLCBuYW1lLmdldCgwKSkpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoZW50cnkudHlwZSAhPSBOYW1pbmdFbnRyeS5DT05URVhUKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTmFtaW5nRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygibmFtaW5nQ29udGV4dC5jb250ZXh0RXhwZWN0ZWQiKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICgoQ29udGV4dCkgZW50cnkudmFsdWUpLmxpc3RCaW5kaW5ncyhuYW1lLmdldFN1ZmZpeCgxKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBFbnVtZXJhdGVzIHRoZSBuYW1lcyBib3VuZCBpbiB0aGUgbmFtZWQgY29udGV4dCwgYWxvbmcgd2l0aCB0aGUgCisgICAgICogb2JqZWN0cyBib3VuZCB0byB0aGVtLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBjb250ZXh0IHRvIGxpc3QKKyAgICAgKiBAcmV0dXJuIGFuIGVudW1lcmF0aW9uIG9mIHRoZSBiaW5kaW5ncyBpbiB0aGlzIGNvbnRleHQuIAorICAgICAqIEVhY2ggZWxlbWVudCBvZiB0aGUgZW51bWVyYXRpb24gaXMgb2YgdHlwZSBCaW5kaW5nLgorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBOYW1pbmdFbnVtZXJhdGlvbiBsaXN0QmluZGluZ3MoU3RyaW5nIG5hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbGlzdEJpbmRpbmdzKG5ldyBDb21wb3NpdGVOYW1lKG5hbWUpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIERlc3Ryb3lzIHRoZSBuYW1lZCBjb250ZXh0IGFuZCByZW1vdmVzIGl0IGZyb20gdGhlIG5hbWVzcGFjZS4gQW55IAorICAgICAqIGF0dHJpYnV0ZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBuYW1lIGFyZSBhbHNvIHJlbW92ZWQuIEludGVybWVkaWF0ZSAKKyAgICAgKiBjb250ZXh0cyBhcmUgbm90IGRlc3Ryb3llZC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBpZGVtcG90ZW50LiBJdCBzdWNjZWVkcyBldmVuIGlmIHRoZSB0ZXJtaW5hbCBhdG9taWMgCisgICAgICogbmFtZSBpcyBub3QgYm91bmQgaW4gdGhlIHRhcmdldCBjb250ZXh0LCBidXQgdGhyb3dzIAorICAgICAqIE5hbWVOb3RGb3VuZEV4Y2VwdGlvbiBpZiBhbnkgb2YgdGhlIGludGVybWVkaWF0ZSBjb250ZXh0cyBkbyBub3QgZXhpc3QuIAorICAgICAqIAorICAgICAqIEluIGEgZmVkZXJhdGVkIG5hbWluZyBzeXN0ZW0sIGEgY29udGV4dCBmcm9tIG9uZSBuYW1pbmcgc3lzdGVtIG1heSBiZSAKKyAgICAgKiBib3VuZCB0byBhIG5hbWUgaW4gYW5vdGhlci4gT25lIGNhbiBzdWJzZXF1ZW50bHkgbG9vayB1cCBhbmQgcGVyZm9ybSAKKyAgICAgKiBvcGVyYXRpb25zIG9uIHRoZSBmb3JlaWduIGNvbnRleHQgdXNpbmcgYSBjb21wb3NpdGUgbmFtZS4gSG93ZXZlciwgYW4gCisgICAgICogYXR0ZW1wdCBkZXN0cm95IHRoZSBjb250ZXh0IHVzaW5nIHRoaXMgY29tcG9zaXRlIG5hbWUgd2lsbCBmYWlsIHdpdGggCisgICAgICogTm90Q29udGV4dEV4Y2VwdGlvbiwgYmVjYXVzZSB0aGUgZm9yZWlnbiBjb250ZXh0IGlzIG5vdCBhICJzdWJjb250ZXh0IiAKKyAgICAgKiBvZiB0aGUgY29udGV4dCBpbiB3aGljaCBpdCBpcyBib3VuZC4gSW5zdGVhZCwgdXNlIHVuYmluZCgpIHRvIHJlbW92ZSAKKyAgICAgKiB0aGUgYmluZGluZyBvZiB0aGUgZm9yZWlnbiBjb250ZXh0LiBEZXN0cm95aW5nIHRoZSBmb3JlaWduIGNvbnRleHQgCisgICAgICogcmVxdWlyZXMgdGhhdCB0aGUgZGVzdHJveVN1YmNvbnRleHQoKSBiZSBwZXJmb3JtZWQgb24gYSBjb250ZXh0IGZyb20gCisgICAgICogdGhlIGZvcmVpZ24gY29udGV4dCdzICJuYXRpdmUiIG5hbWluZyBzeXN0ZW0uCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbnRleHQgdG8gYmUgZGVzdHJveWVkOyBtYXkgbm90IGJlIGVtcHR5CisgICAgICogQGV4Y2VwdGlvbiBOYW1lTm90Rm91bmRFeGNlcHRpb24gaWYgYW4gaW50ZXJtZWRpYXRlIGNvbnRleHQgZG9lcyBub3QgCisgICAgICogZXhpc3QKKyAgICAgKiBAZXhjZXB0aW9uIE5vdENvbnRleHRFeGNlcHRpb24gaWYgdGhlIG5hbWUgaXMgYm91bmQgYnV0IGRvZXMgbm90IG5hbWUgCisgICAgICogYSBjb250ZXh0LCBvciBkb2VzIG5vdCBuYW1lIGEgY29udGV4dCBvZiB0aGUgYXBwcm9wcmlhdGUgdHlwZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3lTdWJjb250ZXh0KE5hbWUgbmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIAorICAgICAgICBjaGVja1dyaXRhYmxlKCk7CisgICAgICAgIAorCXdoaWxlICgoIW5hbWUuaXNFbXB0eSgpKSAmJiAobmFtZS5nZXQoMCkubGVuZ3RoKCkgPT0gMCkpCisJICAgIG5hbWUgPSBuYW1lLmdldFN1ZmZpeCgxKTsKKyAgICAgICAgaWYgKG5hbWUuaXNFbXB0eSgpKQorICAgICAgICAgICAgdGhyb3cgbmV3IE5hbWluZ0V4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoIm5hbWluZ0NvbnRleHQuaW52YWxpZE5hbWUiKSk7CisgICAgICAgIAorICAgICAgICBOYW1pbmdFbnRyeSBlbnRyeSA9IChOYW1pbmdFbnRyeSkgYmluZGluZ3MuZ2V0KG5hbWUuZ2V0KDApKTsKKyAgICAgICAgCisgICAgICAgIGlmIChlbnRyeSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTmFtZU5vdEZvdW5kRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygibmFtaW5nQ29udGV4dC5uYW1lTm90Qm91bmQiLCBuYW1lLmdldCgwKSkpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAobmFtZS5zaXplKCkgPiAxKSB7CisgICAgICAgICAgICBpZiAoZW50cnkudHlwZSA9PSBOYW1pbmdFbnRyeS5DT05URVhUKSB7CisgICAgICAgICAgICAgICAgKChDb250ZXh0KSBlbnRyeS52YWx1ZSkudW5iaW5kKG5hbWUuZ2V0U3VmZml4KDEpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5hbWluZ0V4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJuYW1pbmdDb250ZXh0LmNvbnRleHRFeHBlY3RlZCIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChlbnRyeS50eXBlID09IE5hbWluZ0VudHJ5LkNPTlRFWFQpIHsKKyAgICAgICAgICAgICAgICAoKENvbnRleHQpIGVudHJ5LnZhbHVlKS5jbG9zZSgpOworICAgICAgICAgICAgICAgIGJpbmRpbmdzLnJlbW92ZShuYW1lLmdldCgwKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb3RDb250ZXh0RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoIm5hbWluZ0NvbnRleHQuY29udGV4dEV4cGVjdGVkIikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgIH0KKworCisgICAgLyoqCisgICAgICogRGVzdHJveXMgdGhlIG5hbWVkIGNvbnRleHQgYW5kIHJlbW92ZXMgaXQgZnJvbSB0aGUgbmFtZXNwYWNlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBjb250ZXh0IHRvIGJlIGRlc3Ryb3llZDsgbWF5IG5vdCBiZSBlbXB0eQorICAgICAqIEBleGNlcHRpb24gTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGlmIGFuIGludGVybWVkaWF0ZSBjb250ZXh0IGRvZXMgbm90IAorICAgICAqIGV4aXN0CisgICAgICogQGV4Y2VwdGlvbiBOb3RDb250ZXh0RXhjZXB0aW9uIGlmIHRoZSBuYW1lIGlzIGJvdW5kIGJ1dCBkb2VzIG5vdCBuYW1lIAorICAgICAqIGEgY29udGV4dCwgb3IgZG9lcyBub3QgbmFtZSBhIGNvbnRleHQgb2YgdGhlIGFwcHJvcHJpYXRlIHR5cGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkZXN0cm95U3ViY29udGV4dChTdHJpbmcgbmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIGRlc3Ryb3lTdWJjb250ZXh0KG5ldyBDb21wb3NpdGVOYW1lKG5hbWUpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW5kIGJpbmRzIGEgbmV3IGNvbnRleHQuIENyZWF0ZXMgYSBuZXcgY29udGV4dCB3aXRoIHRoZSBnaXZlbiAKKyAgICAgKiBuYW1lIGFuZCBiaW5kcyBpdCBpbiB0aGUgdGFyZ2V0IGNvbnRleHQgKHRoYXQgbmFtZWQgYnkgYWxsIGJ1dCAKKyAgICAgKiB0ZXJtaW5hbCBhdG9taWMgY29tcG9uZW50IG9mIHRoZSBuYW1lKS4gQWxsIGludGVybWVkaWF0ZSBjb250ZXh0cyBhbmQgCisgICAgICogdGhlIHRhcmdldCBjb250ZXh0IG11c3QgYWxyZWFkeSBleGlzdC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgY29udGV4dCB0byBjcmVhdGU7IG1heSBub3QgYmUgZW1wdHkKKyAgICAgKiBAcmV0dXJuIHRoZSBuZXdseSBjcmVhdGVkIGNvbnRleHQKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWVBbHJlYWR5Qm91bmRFeGNlcHRpb24gaWYgbmFtZSBpcyBhbHJlYWR5IGJvdW5kCisgICAgICogQGV4Y2VwdGlvbiBJbnZhbGlkQXR0cmlidXRlc0V4Y2VwdGlvbiBpZiBjcmVhdGlvbiBvZiB0aGUgc3ViY29udGV4dCAKKyAgICAgKiByZXF1aXJlcyBzcGVjaWZpY2F0aW9uIG9mIG1hbmRhdG9yeSBhdHRyaWJ1dGVzCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIENvbnRleHQgY3JlYXRlU3ViY29udGV4dChOYW1lIG5hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICBjaGVja1dyaXRhYmxlKCk7CisgICAgICAgIAorICAgICAgICBDb250ZXh0IG5ld0NvbnRleHQgPSBuZXcgTmFtaW5nQ29udGV4dChlbnYsIHRoaXMubmFtZSk7CisgICAgICAgIGJpbmQobmFtZSwgbmV3Q29udGV4dCk7CisgICAgICAgIAorICAgICAgICByZXR1cm4gbmV3Q29udGV4dDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW5kIGJpbmRzIGEgbmV3IGNvbnRleHQuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbnRleHQgdG8gY3JlYXRlOyBtYXkgbm90IGJlIGVtcHR5CisgICAgICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCBjb250ZXh0CisgICAgICogQGV4Y2VwdGlvbiBOYW1lQWxyZWFkeUJvdW5kRXhjZXB0aW9uIGlmIG5hbWUgaXMgYWxyZWFkeSBib3VuZAorICAgICAqIEBleGNlcHRpb24gSW52YWxpZEF0dHJpYnV0ZXNFeGNlcHRpb24gaWYgY3JlYXRpb24gb2YgdGhlIHN1YmNvbnRleHQgCisgICAgICogcmVxdWlyZXMgc3BlY2lmaWNhdGlvbiBvZiBtYW5kYXRvcnkgYXR0cmlidXRlcworICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBDb250ZXh0IGNyZWF0ZVN1YmNvbnRleHQoU3RyaW5nIG5hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICByZXR1cm4gY3JlYXRlU3ViY29udGV4dChuZXcgQ29tcG9zaXRlTmFtZShuYW1lKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIG5hbWVkIG9iamVjdCwgZm9sbG93aW5nIGxpbmtzIGV4Y2VwdCBmb3IgdGhlIHRlcm1pbmFsIAorICAgICAqIGF0b21pYyBjb21wb25lbnQgb2YgdGhlIG5hbWUuIElmIHRoZSBvYmplY3QgYm91bmQgdG8gbmFtZSBpcyBub3QgYSAKKyAgICAgKiBsaW5rLCByZXR1cm5zIHRoZSBvYmplY3QgaXRzZWxmLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBvYmplY3QgdG8gbG9vayB1cAorICAgICAqIEByZXR1cm4gdGhlIG9iamVjdCBib3VuZCB0byBuYW1lLCBub3QgZm9sbG93aW5nIHRoZSB0ZXJtaW5hbCBsaW5rIAorICAgICAqIChpZiBhbnkpLgorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgbG9va3VwTGluayhOYW1lIG5hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbG9va3VwKG5hbWUsIGZhbHNlKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgbmFtZWQgb2JqZWN0LCBmb2xsb3dpbmcgbGlua3MgZXhjZXB0IGZvciB0aGUgdGVybWluYWwgCisgICAgICogYXRvbWljIGNvbXBvbmVudCBvZiB0aGUgbmFtZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgb2JqZWN0IHRvIGxvb2sgdXAKKyAgICAgKiBAcmV0dXJuIHRoZSBvYmplY3QgYm91bmQgdG8gbmFtZSwgbm90IGZvbGxvd2luZyB0aGUgdGVybWluYWwgbGluayAKKyAgICAgKiAoaWYgYW55KS4KKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGxvb2t1cExpbmsoU3RyaW5nIG5hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbG9va3VwKG5ldyBDb21wb3NpdGVOYW1lKG5hbWUpLCBmYWxzZSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIHBhcnNlciBhc3NvY2lhdGVkIHdpdGggdGhlIG5hbWVkIGNvbnRleHQuIEluIGEgCisgICAgICogZmVkZXJhdGlvbiBvZiBuYW1lc3BhY2VzLCBkaWZmZXJlbnQgbmFtaW5nIHN5c3RlbXMgd2lsbCBwYXJzZSBuYW1lcyAKKyAgICAgKiBkaWZmZXJlbnRseS4gVGhpcyBtZXRob2QgYWxsb3dzIGFuIGFwcGxpY2F0aW9uIHRvIGdldCBhIHBhcnNlciBmb3IgCisgICAgICogcGFyc2luZyBuYW1lcyBpbnRvIHRoZWlyIGF0b21pYyBjb21wb25lbnRzIHVzaW5nIHRoZSBuYW1pbmcgY29udmVudGlvbiAKKyAgICAgKiBvZiBhIHBhcnRpY3VsYXIgbmFtaW5nIHN5c3RlbS4gV2l0aGluIGFueSBzaW5nbGUgbmFtaW5nIHN5c3RlbSwgCisgICAgICogTmFtZVBhcnNlciBvYmplY3RzIHJldHVybmVkIGJ5IHRoaXMgbWV0aG9kIG11c3QgYmUgZXF1YWwgKHVzaW5nIHRoZSAKKyAgICAgKiBlcXVhbHMoKSB0ZXN0KS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgY29udGV4dCBmcm9tIHdoaWNoIHRvIGdldCB0aGUgcGFyc2VyCisgICAgICogQHJldHVybiBhIG5hbWUgcGFyc2VyIHRoYXQgY2FuIHBhcnNlIGNvbXBvdW5kIG5hbWVzIGludG8gdGhlaXIgYXRvbWljIAorICAgICAqIGNvbXBvbmVudHMKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgTmFtZVBhcnNlciBnZXROYW1lUGFyc2VyKE5hbWUgbmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisKKwl3aGlsZSAoKCFuYW1lLmlzRW1wdHkoKSkgJiYgKG5hbWUuZ2V0KDApLmxlbmd0aCgpID09IDApKQorCSAgICBuYW1lID0gbmFtZS5nZXRTdWZmaXgoMSk7CisgICAgICAgIGlmIChuYW1lLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVybiBuYW1lUGFyc2VyOworCisgICAgICAgIGlmIChuYW1lLnNpemUoKSA+IDEpIHsKKyAgICAgICAgICAgIE9iamVjdCBvYmogPSBiaW5kaW5ncy5nZXQobmFtZS5nZXQoMCkpOworICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRleHQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKChDb250ZXh0KSBvYmopLmdldE5hbWVQYXJzZXIobmFtZS5nZXRTdWZmaXgoMSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm90Q29udGV4dEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJuYW1pbmdDb250ZXh0LmNvbnRleHRFeHBlY3RlZCIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBuYW1lUGFyc2VyOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIHBhcnNlciBhc3NvY2lhdGVkIHdpdGggdGhlIG5hbWVkIGNvbnRleHQuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbnRleHQgZnJvbSB3aGljaCB0byBnZXQgdGhlIHBhcnNlcgorICAgICAqIEByZXR1cm4gYSBuYW1lIHBhcnNlciB0aGF0IGNhbiBwYXJzZSBjb21wb3VuZCBuYW1lcyBpbnRvIHRoZWlyIGF0b21pYyAKKyAgICAgKiBjb21wb25lbnRzCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIE5hbWVQYXJzZXIgZ2V0TmFtZVBhcnNlcihTdHJpbmcgbmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBnZXROYW1lUGFyc2VyKG5ldyBDb21wb3NpdGVOYW1lKG5hbWUpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvbXBvc2VzIHRoZSBuYW1lIG9mIHRoaXMgY29udGV4dCB3aXRoIGEgbmFtZSByZWxhdGl2ZSB0byB0aGlzIGNvbnRleHQuCisgICAgICogPHA+CisgICAgICogR2l2ZW4gYSBuYW1lIChuYW1lKSByZWxhdGl2ZSB0byB0aGlzIGNvbnRleHQsIGFuZCB0aGUgbmFtZSAocHJlZml4KSAKKyAgICAgKiBvZiB0aGlzIGNvbnRleHQgcmVsYXRpdmUgdG8gb25lIG9mIGl0cyBhbmNlc3RvcnMsIHRoaXMgbWV0aG9kIHJldHVybnMgCisgICAgICogdGhlIGNvbXBvc2l0aW9uIG9mIHRoZSB0d28gbmFtZXMgdXNpbmcgdGhlIHN5bnRheCBhcHByb3ByaWF0ZSBmb3IgdGhlIAorICAgICAqIG5hbWluZyBzeXN0ZW0ocykgaW52b2x2ZWQuIFRoYXQgaXMsIGlmIG5hbWUgbmFtZXMgYW4gb2JqZWN0IHJlbGF0aXZlIAorICAgICAqIHRvIHRoaXMgY29udGV4dCwgdGhlIHJlc3VsdCBpcyB0aGUgbmFtZSBvZiB0aGUgc2FtZSBvYmplY3QsIGJ1dCAKKyAgICAgKiByZWxhdGl2ZSB0byB0aGUgYW5jZXN0b3IgY29udGV4dC4gTm9uZSBvZiB0aGUgbmFtZXMgbWF5IGJlIG51bGwuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgYSBuYW1lIHJlbGF0aXZlIHRvIHRoaXMgY29udGV4dAorICAgICAqIEBwYXJhbSBwcmVmaXggdGhlIG5hbWUgb2YgdGhpcyBjb250ZXh0IHJlbGF0aXZlIHRvIG9uZSBvZiBpdHMgYW5jZXN0b3JzCisgICAgICogQHJldHVybiB0aGUgY29tcG9zaXRpb24gb2YgcHJlZml4IGFuZCBuYW1lCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIE5hbWUgY29tcG9zZU5hbWUoTmFtZSBuYW1lLCBOYW1lIHByZWZpeCkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisJcHJlZml4ID0gKE5hbWUpIG5hbWUuY2xvbmUoKTsKKwlyZXR1cm4gcHJlZml4LmFkZEFsbChuYW1lKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvbXBvc2VzIHRoZSBuYW1lIG9mIHRoaXMgY29udGV4dCB3aXRoIGEgbmFtZSByZWxhdGl2ZSB0byB0aGlzIGNvbnRleHQuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgYSBuYW1lIHJlbGF0aXZlIHRvIHRoaXMgY29udGV4dAorICAgICAqIEBwYXJhbSBwcmVmaXggdGhlIG5hbWUgb2YgdGhpcyBjb250ZXh0IHJlbGF0aXZlIHRvIG9uZSBvZiBpdHMgYW5jZXN0b3JzCisgICAgICogQHJldHVybiB0aGUgY29tcG9zaXRpb24gb2YgcHJlZml4IGFuZCBuYW1lCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBjb21wb3NlTmFtZShTdHJpbmcgbmFtZSwgU3RyaW5nIHByZWZpeCkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBwcmVmaXggKyAiLyIgKyBuYW1lOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQWRkcyBhIG5ldyBlbnZpcm9ubWVudCBwcm9wZXJ0eSB0byB0aGUgZW52aXJvbm1lbnQgb2YgdGhpcyBjb250ZXh0LiBJZiAKKyAgICAgKiB0aGUgcHJvcGVydHkgYWxyZWFkeSBleGlzdHMsIGl0cyB2YWx1ZSBpcyBvdmVyd3JpdHRlbi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcHJvcE5hbWUgdGhlIG5hbWUgb2YgdGhlIGVudmlyb25tZW50IHByb3BlcnR5IHRvIGFkZDsgbWF5IG5vdCAKKyAgICAgKiBiZSBudWxsCisgICAgICogQHBhcmFtIHByb3BWYWwgdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSB0byBhZGQ7IG1heSBub3QgYmUgbnVsbAorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgYWRkVG9FbnZpcm9ubWVudChTdHJpbmcgcHJvcE5hbWUsIE9iamVjdCBwcm9wVmFsKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGVudi5wdXQocHJvcE5hbWUsIHByb3BWYWwpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlcyBhbiBlbnZpcm9ubWVudCBwcm9wZXJ0eSBmcm9tIHRoZSBlbnZpcm9ubWVudCBvZiB0aGlzIGNvbnRleHQuIAorICAgICAqIAorICAgICAqIEBwYXJhbSBwcm9wTmFtZSB0aGUgbmFtZSBvZiB0aGUgZW52aXJvbm1lbnQgcHJvcGVydHkgdG8gcmVtb3ZlOyAKKyAgICAgKiBtYXkgbm90IGJlIG51bGwKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IHJlbW92ZUZyb21FbnZpcm9ubWVudChTdHJpbmcgcHJvcE5hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZW52LnJlbW92ZShwcm9wTmFtZSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIGVudmlyb25tZW50IGluIGVmZmVjdCBmb3IgdGhpcyBjb250ZXh0LiBTZWUgY2xhc3MgCisgICAgICogZGVzY3JpcHRpb24gZm9yIG1vcmUgZGV0YWlscyBvbiBlbnZpcm9ubWVudCBwcm9wZXJ0aWVzLiAKKyAgICAgKiBUaGUgY2FsbGVyIHNob3VsZCBub3QgbWFrZSBhbnkgY2hhbmdlcyB0byB0aGUgb2JqZWN0IHJldHVybmVkOiB0aGVpciAKKyAgICAgKiBlZmZlY3Qgb24gdGhlIGNvbnRleHQgaXMgdW5kZWZpbmVkLiBUaGUgZW52aXJvbm1lbnQgb2YgdGhpcyBjb250ZXh0IAorICAgICAqIG1heSBiZSBjaGFuZ2VkIHVzaW5nIGFkZFRvRW52aXJvbm1lbnQoKSBhbmQgcmVtb3ZlRnJvbUVudmlyb25tZW50KCkuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgZW52aXJvbm1lbnQgb2YgdGhpcyBjb250ZXh0OyBuZXZlciBudWxsCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIEhhc2h0YWJsZSBnZXRFbnZpcm9ubWVudCgpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZW52OworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ2xvc2VzIHRoaXMgY29udGV4dC4gVGhpcyBtZXRob2QgcmVsZWFzZXMgdGhpcyBjb250ZXh0J3MgcmVzb3VyY2VzIAorICAgICAqIGltbWVkaWF0ZWx5LCBpbnN0ZWFkIG9mIHdhaXRpbmcgZm9yIHRoZW0gdG8gYmUgcmVsZWFzZWQgYXV0b21hdGljYWxseSAKKyAgICAgKiBieSB0aGUgZ2FyYmFnZSBjb2xsZWN0b3IuCisgICAgICogVGhpcyBtZXRob2QgaXMgaWRlbXBvdGVudDogaW52b2tpbmcgaXQgb24gYSBjb250ZXh0IHRoYXQgaGFzIGFscmVhZHkgCisgICAgICogYmVlbiBjbG9zZWQgaGFzIG5vIGVmZmVjdC4gSW52b2tpbmcgYW55IG90aGVyIG1ldGhvZCBvbiBhIGNsb3NlZCAKKyAgICAgKiBjb250ZXh0IGlzIG5vdCBhbGxvd2VkLCBhbmQgcmVzdWx0cyBpbiB1bmRlZmluZWQgYmVoYXZpb3VyLgorICAgICAqIAorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIGVudi5jbGVhcigpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSBmdWxsIG5hbWUgb2YgdGhpcyBjb250ZXh0IHdpdGhpbiBpdHMgb3duIG5hbWVzcGFjZS4KKyAgICAgKiA8cD4KKyAgICAgKiBNYW55IG5hbWluZyBzZXJ2aWNlcyBoYXZlIGEgbm90aW9uIG9mIGEgImZ1bGwgbmFtZSIgZm9yIG9iamVjdHMgaW4gCisgICAgICogdGhlaXIgcmVzcGVjdGl2ZSBuYW1lc3BhY2VzLiBGb3IgZXhhbXBsZSwgYW4gTERBUCBlbnRyeSBoYXMgYSAKKyAgICAgKiBkaXN0aW5ndWlzaGVkIG5hbWUsIGFuZCBhIEROUyByZWNvcmQgaGFzIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUuIFRoaXMgCisgICAgICogbWV0aG9kIGFsbG93cyB0aGUgY2xpZW50IGFwcGxpY2F0aW9uIHRvIHJldHJpZXZlIHRoaXMgbmFtZS4gVGhlIHN0cmluZyAKKyAgICAgKiByZXR1cm5lZCBieSB0aGlzIG1ldGhvZCBpcyBub3QgYSBKTkRJIGNvbXBvc2l0ZSBuYW1lIGFuZCBzaG91bGQgbm90IGJlIAorICAgICAqIHBhc3NlZCBkaXJlY3RseSB0byBjb250ZXh0IG1ldGhvZHMuIEluIG5hbWluZyBzeXN0ZW1zIGZvciB3aGljaCB0aGUgCisgICAgICogbm90aW9uIG9mIGZ1bGwgbmFtZSBkb2VzIG5vdCBtYWtlIHNlbnNlLCAKKyAgICAgKiBPcGVyYXRpb25Ob3RTdXBwb3J0ZWRFeGNlcHRpb24gaXMgdGhyb3duLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhpcyBjb250ZXh0J3MgbmFtZSBpbiBpdHMgb3duIG5hbWVzcGFjZTsgbmV2ZXIgbnVsbAorICAgICAqIEBleGNlcHRpb24gT3BlcmF0aW9uTm90U3VwcG9ydGVkRXhjZXB0aW9uIGlmIHRoZSBuYW1pbmcgc3lzdGVtIGRvZXMgCisgICAgICogbm90IGhhdmUgdGhlIG5vdGlvbiBvZiBhIGZ1bGwgbmFtZQorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZUluTmFtZXNwYWNlKCkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHRocm93ICBuZXcgT3BlcmF0aW9uTm90U3VwcG9ydGVkRXhjZXB0aW9uCisgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJuYW1pbmdDb250ZXh0Lm5vQWJzb2x1dGVOYW1lIikpOworICAgICAgICAvL0ZJWE1FID8KKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm90ZWN0ZWQgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIG5hbWVkIG9iamVjdC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgb2JqZWN0IHRvIGxvb2sgdXAKKyAgICAgKiBAcGFyYW0gcmVzb2x2ZUxpbmtzIElmIHRydWUsIHRoZSBsaW5rcyB3aWxsIGJlIHJlc29sdmVkCisgICAgICogQHJldHVybiB0aGUgb2JqZWN0IGJvdW5kIHRvIG5hbWUKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgT2JqZWN0IGxvb2t1cChOYW1lIG5hbWUsIGJvb2xlYW4gcmVzb2x2ZUxpbmtzKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBSZW1vdmluZyBlbXB0eSBwYXJ0cworICAgICAgICB3aGlsZSAoKCFuYW1lLmlzRW1wdHkoKSkgJiYgKG5hbWUuZ2V0KDApLmxlbmd0aCgpID09IDApKQorICAgICAgICAgICAgbmFtZSA9IG5hbWUuZ2V0U3VmZml4KDEpOworICAgICAgICBpZiAobmFtZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIC8vIElmIG5hbWUgaXMgZW1wdHksIGEgbmV3bHkgYWxsb2NhdGVkIG5hbWluZyBjb250ZXh0IGlzIHJldHVybmVkCisgICAgICAgICAgICByZXR1cm4gbmV3IE5hbWluZ0NvbnRleHQoZW52LCB0aGlzLm5hbWUsIGJpbmRpbmdzKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgTmFtaW5nRW50cnkgZW50cnkgPSAoTmFtaW5nRW50cnkpIGJpbmRpbmdzLmdldChuYW1lLmdldCgwKSk7CisgICAgICAgIAorICAgICAgICBpZiAoZW50cnkgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE5hbWVOb3RGb3VuZEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoIm5hbWluZ0NvbnRleHQubmFtZU5vdEJvdW5kIiwgbmFtZS5nZXQoMCkpKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKG5hbWUuc2l6ZSgpID4gMSkgeworICAgICAgICAgICAgLy8gSWYgdGhlIHNpemUgb2YgdGhlIG5hbWUgaXMgZ3JlYXRlciB0aGF0IDEsIHRoZW4gd2UgZ28gdGhyb3VnaCBhCisgICAgICAgICAgICAvLyBudW1iZXIgb2Ygc3ViY29udGV4dHMuCisgICAgICAgICAgICBpZiAoZW50cnkudHlwZSAhPSBOYW1pbmdFbnRyeS5DT05URVhUKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5hbWluZ0V4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJuYW1pbmdDb250ZXh0LmNvbnRleHRFeHBlY3RlZCIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAoKENvbnRleHQpIGVudHJ5LnZhbHVlKS5sb29rdXAobmFtZS5nZXRTdWZmaXgoMSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKChyZXNvbHZlTGlua3MpICYmIChlbnRyeS50eXBlID09IE5hbWluZ0VudHJ5LkxJTktfUkVGKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBsaW5rID0gKChMaW5rUmVmKSBlbnRyeS52YWx1ZSkuZ2V0TGlua05hbWUoKTsKKyAgICAgICAgICAgICAgICBpZiAobGluay5zdGFydHNXaXRoKCIuIikpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gTGluayByZWxhdGl2ZSB0byB0aGlzIGNvbnRleHQKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvb2t1cChsaW5rLnN1YnN0cmluZygxKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChuZXcgSW5pdGlhbENvbnRleHQoZW52KSkubG9va3VwKGxpbmspOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZW50cnkudHlwZSA9PSBOYW1pbmdFbnRyeS5SRUZFUkVOQ0UpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBPYmplY3Qgb2JqID0gTmFtaW5nTWFuYWdlci5nZXRPYmplY3RJbnN0YW5jZQorICAgICAgICAgICAgICAgICAgICAgICAgKGVudHJ5LnZhbHVlLCBuYW1lLCB0aGlzLCBlbnYpOworICAgICAgICAgICAgICAgICAgICBpZiAob2JqICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LnZhbHVlID0gb2JqOworICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkudHlwZSA9IE5hbWluZ0VudHJ5LkVOVFJZOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBvYmo7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBsb2cud2FybihzbS5nZXRTdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJuYW1pbmdDb250ZXh0LmZhaWxSZXNvbHZpbmdSZWZlcmVuY2UiKSwgZSk7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBOYW1pbmdFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5LnZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgIH0KKworCisgICAgLyoqCisgICAgICogQmluZHMgYSBuYW1lIHRvIGFuIG9iamVjdC4gQWxsIGludGVybWVkaWF0ZSBjb250ZXh0cyBhbmQgdGhlIHRhcmdldCAKKyAgICAgKiBjb250ZXh0ICh0aGF0IG5hbWVkIGJ5IGFsbCBidXQgdGVybWluYWwgYXRvbWljIGNvbXBvbmVudCBvZiB0aGUgbmFtZSkgCisgICAgICogbXVzdCBhbHJlYWR5IGV4aXN0LgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIHRvIGJpbmQ7IG1heSBub3QgYmUgZW1wdHkKKyAgICAgKiBAcGFyYW0gb2JqIHRoZSBvYmplY3QgdG8gYmluZDsgcG9zc2libHkgbnVsbAorICAgICAqIEBwYXJhbSByZWJpbmQgaWYgdHJ1ZSwgdGhlbiBwZXJmb3JtIGEgcmViaW5kIChpZSwgb3ZlcndyaXRlKQorICAgICAqIEBleGNlcHRpb24gTmFtZUFscmVhZHlCb3VuZEV4Y2VwdGlvbiBpZiBuYW1lIGlzIGFscmVhZHkgYm91bmQKKyAgICAgKiBAZXhjZXB0aW9uIEludmFsaWRBdHRyaWJ1dGVzRXhjZXB0aW9uIGlmIG9iamVjdCBkaWQgbm90IHN1cHBseSBhbGwgCisgICAgICogbWFuZGF0b3J5IGF0dHJpYnV0ZXMKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBiaW5kKE5hbWUgbmFtZSwgT2JqZWN0IG9iaiwgYm9vbGVhbiByZWJpbmQpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICAKKyAgICAgICAgY2hlY2tXcml0YWJsZSgpOworICAgICAgICAKKwl3aGlsZSAoKCFuYW1lLmlzRW1wdHkoKSkgJiYgKG5hbWUuZ2V0KDApLmxlbmd0aCgpID09IDApKQorCSAgICBuYW1lID0gbmFtZS5nZXRTdWZmaXgoMSk7CisgICAgICAgIGlmIChuYW1lLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBOYW1pbmdFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJuYW1pbmdDb250ZXh0LmludmFsaWROYW1lIikpOworICAgICAgICAKKyAgICAgICAgTmFtaW5nRW50cnkgZW50cnkgPSAoTmFtaW5nRW50cnkpIGJpbmRpbmdzLmdldChuYW1lLmdldCgwKSk7CisgICAgICAgIAorICAgICAgICBpZiAobmFtZS5zaXplKCkgPiAxKSB7CisgICAgICAgICAgICBpZiAoZW50cnkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOYW1lTm90Rm91bmRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygibmFtaW5nQ29udGV4dC5uYW1lTm90Qm91bmQiLCBuYW1lLmdldCgwKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGVudHJ5LnR5cGUgPT0gTmFtaW5nRW50cnkuQ09OVEVYVCkgeworICAgICAgICAgICAgICAgIGlmIChyZWJpbmQpIHsKKyAgICAgICAgICAgICAgICAgICAgKChDb250ZXh0KSBlbnRyeS52YWx1ZSkucmViaW5kKG5hbWUuZ2V0U3VmZml4KDEpLCBvYmopOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICgoQ29udGV4dCkgZW50cnkudmFsdWUpLmJpbmQobmFtZS5nZXRTdWZmaXgoMSksIG9iaik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTmFtaW5nRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoIm5hbWluZ0NvbnRleHQuY29udGV4dEV4cGVjdGVkIikpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCghcmViaW5kKSAmJiAoZW50cnkgIT0gbnVsbCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTmFtZUFscmVhZHlCb3VuZEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJuYW1pbmdDb250ZXh0LmFscmVhZHlCb3VuZCIsIG5hbWUuZ2V0KDApKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIEdldHRpbmcgdGhlIHR5cGUgb2YgdGhlIG9iamVjdCBhbmQgd3JhcHBpbmcgaXQgd2l0aGluIGEgbmV3CisgICAgICAgICAgICAgICAgLy8gTmFtaW5nRW50cnkKKyAgICAgICAgICAgICAgICBPYmplY3QgdG9CaW5kID0gCisgICAgICAgICAgICAgICAgICAgIE5hbWluZ01hbmFnZXIuZ2V0U3RhdGVUb0JpbmQob2JqLCBuYW1lLCB0aGlzLCBlbnYpOworICAgICAgICAgICAgICAgIGlmICh0b0JpbmQgaW5zdGFuY2VvZiBDb250ZXh0KSB7CisgICAgICAgICAgICAgICAgICAgIGVudHJ5ID0gbmV3IE5hbWluZ0VudHJ5KG5hbWUuZ2V0KDApLCB0b0JpbmQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1pbmdFbnRyeS5DT05URVhUKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRvQmluZCBpbnN0YW5jZW9mIExpbmtSZWYpIHsKKyAgICAgICAgICAgICAgICAgICAgZW50cnkgPSBuZXcgTmFtaW5nRW50cnkobmFtZS5nZXQoMCksIHRvQmluZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWluZ0VudHJ5LkxJTktfUkVGKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRvQmluZCBpbnN0YW5jZW9mIFJlZmVyZW5jZSkgeworICAgICAgICAgICAgICAgICAgICBlbnRyeSA9IG5ldyBOYW1pbmdFbnRyeShuYW1lLmdldCgwKSwgdG9CaW5kLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtaW5nRW50cnkuUkVGRVJFTkNFKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRvQmluZCBpbnN0YW5jZW9mIFJlZmVyZW5jZWFibGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdG9CaW5kID0gKChSZWZlcmVuY2VhYmxlKSB0b0JpbmQpLmdldFJlZmVyZW5jZSgpOworICAgICAgICAgICAgICAgICAgICBlbnRyeSA9IG5ldyBOYW1pbmdFbnRyeShuYW1lLmdldCgwKSwgdG9CaW5kLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtaW5nRW50cnkuUkVGRVJFTkNFKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBlbnRyeSA9IG5ldyBOYW1pbmdFbnRyeShuYW1lLmdldCgwKSwgdG9CaW5kLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtaW5nRW50cnkuRU5UUlkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBiaW5kaW5ncy5wdXQobmFtZS5nZXQoMCksIGVudHJ5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB3cml0aW5nIGlzIGFsbG93ZWQgb24gdGhpcyBjb250ZXh0LgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGlzV3JpdGFibGUoKSB7CisgICAgICAgIHJldHVybiBDb250ZXh0QWNjZXNzQ29udHJvbGxlci5pc1dyaXRhYmxlKG5hbWUpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhyb3dzIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBDb250ZXh0IGlzIG5vdCB3cml0YWJsZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja1dyaXRhYmxlKCkgCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICBpZiAoIWlzV3JpdGFibGUoKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBOYW1pbmdFeGNlcHRpb24oc20uZ2V0U3RyaW5nKCJuYW1pbmdDb250ZXh0LnJlYWRPbmx5IikpOworICAgIH0KKworCit9CisKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvTmFtaW5nQ29udGV4dEJpbmRpbmdzRW51bWVyYXRpb24uamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvTmFtaW5nQ29udGV4dEJpbmRpbmdzRW51bWVyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWMxYzRhCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9OYW1pbmdDb250ZXh0QmluZGluZ3NFbnVtZXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8gCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm5hbWluZzsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworaW1wb3J0IGphdmF4Lm5hbWluZy5CaW5kaW5nOworaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1pbmdFbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtaW5nRXhjZXB0aW9uOworCisvKioKKyAqIE5hbWluZyBlbnVtZXJhdGlvbiBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBAYXV0aG9yIFJlbXkgTWF1Y2hlcmF0CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBOYW1pbmdDb250ZXh0QmluZGluZ3NFbnVtZXJhdGlvbiAKKyAgICBpbXBsZW1lbnRzIE5hbWluZ0VudW1lcmF0aW9uIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworICAgIHB1YmxpYyBOYW1pbmdDb250ZXh0QmluZGluZ3NFbnVtZXJhdGlvbihJdGVyYXRvciBlbnRyaWVzKSB7CisgICAgCWl0ZXJhdG9yID0gZW50cmllczsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBVbmRlcmx5aW5nIGVudW1lcmF0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCBJdGVyYXRvciBpdGVyYXRvcjsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgbmV4dCBlbGVtZW50IGluIHRoZSBlbnVtZXJhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IG5leHQoKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5leHRFbGVtZW50KCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBtb3JlIGVsZW1lbnRzIGluIHRoZSBlbnVtZXJhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNNb3JlKCkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBpdGVyYXRvci5oYXNOZXh0KCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDbG9zZXMgdGhpcyBlbnVtZXJhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgIH0KKworCisgICAgcHVibGljIGJvb2xlYW4gaGFzTW9yZUVsZW1lbnRzKCkgeworICAgICAgICByZXR1cm4gaXRlcmF0b3IuaGFzTmV4dCgpOworICAgIH0KKworCisgICAgcHVibGljIE9iamVjdCBuZXh0RWxlbWVudCgpIHsKKyAgICAgICAgTmFtaW5nRW50cnkgZW50cnkgPSAoTmFtaW5nRW50cnkpIGl0ZXJhdG9yLm5leHQoKTsKKyAgICAgICAgcmV0dXJuIG5ldyBCaW5kaW5nKGVudHJ5Lm5hbWUsIGVudHJ5LnZhbHVlLmdldENsYXNzKCkuZ2V0TmFtZSgpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LnZhbHVlLCB0cnVlKTsKKyAgICB9CisKKworfQorCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL05hbWluZ0NvbnRleHRFbnVtZXJhdGlvbi5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9OYW1pbmdDb250ZXh0RW51bWVyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2IzZGU0Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9OYW1pbmdDb250ZXh0RW51bWVyYXRpb24uamF2YQpAQCAtMCwwICsxLDk1IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovIAorCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5uYW1pbmc7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtZUNsYXNzUGFpcjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtaW5nRW51bWVyYXRpb247CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWluZ0V4Y2VwdGlvbjsKKworLyoqCisgKiBOYW1pbmcgZW51bWVyYXRpb24gaW1wbGVtZW50YXRpb24uCisgKgorICogQGF1dGhvciBSZW15IE1hdWNoZXJhdAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgTmFtaW5nQ29udGV4dEVudW1lcmF0aW9uIAorICAgIGltcGxlbWVudHMgTmFtaW5nRW51bWVyYXRpb24geworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgcHVibGljIE5hbWluZ0NvbnRleHRFbnVtZXJhdGlvbihJdGVyYXRvciBlbnRyaWVzKSB7CisgICAgCWl0ZXJhdG9yID0gZW50cmllczsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBVbmRlcmx5aW5nIGVudW1lcmF0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCBJdGVyYXRvciBpdGVyYXRvcjsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgbmV4dCBlbGVtZW50IGluIHRoZSBlbnVtZXJhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IG5leHQoKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5leHRFbGVtZW50KCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBtb3JlIGVsZW1lbnRzIGluIHRoZSBlbnVtZXJhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNNb3JlKCkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBpdGVyYXRvci5oYXNOZXh0KCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDbG9zZXMgdGhpcyBlbnVtZXJhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgIH0KKworCisgICAgcHVibGljIGJvb2xlYW4gaGFzTW9yZUVsZW1lbnRzKCkgeworICAgICAgICByZXR1cm4gaXRlcmF0b3IuaGFzTmV4dCgpOworICAgIH0KKworCisgICAgcHVibGljIE9iamVjdCBuZXh0RWxlbWVudCgpIHsKKyAgICAgICAgTmFtaW5nRW50cnkgZW50cnkgPSAoTmFtaW5nRW50cnkpIGl0ZXJhdG9yLm5leHQoKTsKKyAgICAgICAgcmV0dXJuIG5ldyBOYW1lQ2xhc3NQYWlyKGVudHJ5Lm5hbWUsIGVudHJ5LnZhbHVlLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICB9CisKKworfQorCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL05hbWluZ0VudHJ5LmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL05hbWluZ0VudHJ5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQyODI4NgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvTmFtaW5nRW50cnkuamF2YQpAQCAtMCwwICsxLDgwIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovIAorCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5uYW1pbmc7CisKKworLyoqCisgKiBSZXByZXNlbnRzIGEgYmluZGluZyBpbiBhIE5hbWluZ0NvbnRleHQuCisgKgorICogQGF1dGhvciBSZW15IE1hdWNoZXJhdAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgTmFtaW5nRW50cnkgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdGFudHMKKworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5UUlkgPSAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExJTktfUkVGID0gMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRUZFUkVOQ0UgPSAyOworICAgIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTlRFWFQgPSAxMDsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworICAgIHB1YmxpYyBOYW1pbmdFbnRyeShTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlLCBpbnQgdHlwZSkgeworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIHR5cGUgaW5zdGFuY2UgdmFyaWFibGUgaXMgdXNlZCB0byBhdm9pZCB1bnNpbmcgUlRUSSB3aGVuIGRvaW5nCisgICAgICogbG9va3Vwcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHR5cGU7CisgICAgcHVibGljIFN0cmluZyBuYW1lOworICAgIHB1YmxpYyBPYmplY3QgdmFsdWU7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBPYmplY3QgTWV0aG9kcworCisKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgICAgICBpZiAoKG9iaiAhPSBudWxsKSAmJiAob2JqIGluc3RhbmNlb2YgTmFtaW5nRW50cnkpKSB7CisgICAgICAgICAgICByZXR1cm4gbmFtZS5lcXVhbHMoKChOYW1pbmdFbnRyeSkgb2JqKS5uYW1lKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgcmV0dXJuIG5hbWUuaGFzaENvZGUoKTsKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9OYW1pbmdTZXJ2aWNlLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL05hbWluZ1NlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmNlNjI0Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9OYW1pbmdTZXJ2aWNlLmphdmEKQEAgLTAsMCArMSwyMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8gCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5uYW1pbmc7CisKK2ltcG9ydCBqYXZheC5uYW1pbmcuQ29udGV4dDsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk5vdGlmaWNhdGlvbkJyb2FkY2FzdGVyU3VwcG9ydDsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuUmVnaXN0cmF0aW9uOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuQXR0cmlidXRlQ2hhbmdlTm90aWZpY2F0aW9uOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTm90aWZpY2F0aW9uOworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBOYW1pbmdTZXJ2aWNlIEpNWCBNQmVhbi4KKyAqIAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86cmVtbUBhcGFjaGUub3JnIj5SZW15IE1hdWNoZXJhdDwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgTmFtaW5nU2VydmljZQorICAgIGV4dGVuZHMgTm90aWZpY2F0aW9uQnJvYWRjYXN0ZXJTdXBwb3J0CisgICAgaW1wbGVtZW50cyBOYW1pbmdTZXJ2aWNlTUJlYW4sIE1CZWFuUmVnaXN0cmF0aW9uIHsKKyAgICAKKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBTdGF0dXMgb2YgdGhlIFNsaWRlIGRvbWFpbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBzdGF0ZSA9IFNUT1BQRUQ7CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogTm90aWZpY2F0aW9uIHNlcXVlbmNlIG51bWJlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIGxvbmcgc2VxdWVuY2VOdW1iZXIgPSAwOworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIE9sZCBVUkwgcGFja2FnZXMgdmFsdWUuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgb2xkVXJsVmFsdWUgPSAiIjsKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBPbGQgaW5pdGlhbCBjb250ZXh0IHZhbHVlLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIG9sZEljVmFsdWUgPSAiIjsKKyAgICAKKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE1CZWFuUmVnaXN0cmF0aW9uIE1ldGhvZHMKKyAgICAKKyAgICAKKyAgICBwdWJsaWMgT2JqZWN0TmFtZSBwcmVSZWdpc3RlcihNQmVhblNlcnZlciBzZXJ2ZXIsIE9iamVjdE5hbWUgbmFtZSkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgT2JqZWN0TmFtZShPQkpFQ1RfTkFNRSk7CisgICAgfQorICAgIAorICAgIAorICAgIHB1YmxpYyB2b2lkIHBvc3RSZWdpc3RlcihCb29sZWFuIHJlZ2lzdHJhdGlvbkRvbmUpIHsKKyAgICAgICAgaWYgKCFyZWdpc3RyYXRpb25Eb25lLmJvb2xlYW5WYWx1ZSgpKQorICAgICAgICAgICAgZGVzdHJveSgpOworICAgIH0KKyAgICAKKyAgICAKKyAgICBwdWJsaWMgdm9pZCBwcmVEZXJlZ2lzdGVyKCkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgfQorICAgIAorICAgIAorICAgIHB1YmxpYyB2b2lkIHBvc3REZXJlZ2lzdGVyKCkgeworICAgICAgICBkZXN0cm95KCk7CisgICAgfQorICAgIAorICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNsaWRlTUJlYW4gTWV0aG9kcworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFJldHJ1bnMgdGhlIENhdGFsaW5hIGNvbXBvbmVudCBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIE5BTUU7CisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHN0YXRlLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0U3RhdGUoKSB7CisgICAgICAgIHJldHVybiBzdGF0ZTsKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3RhdGUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTdGF0ZVN0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIHN0YXRlc1tzdGF0ZV07CisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFN0YXJ0IHRoZSBzZXJ2bGV0IGNvbnRhaW5lci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydCgpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAKKyAgICAgICAgTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbiA9IG51bGw7CisgICAgICAgIAorICAgICAgICBpZiAoc3RhdGUgIT0gU1RPUFBFRCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgCisgICAgICAgIHN0YXRlID0gU1RBUlRJTkc7CisgICAgICAgIAorICAgICAgICAvLyBOb3RpZnlpbmcgdGhlIE1CRWFuIHNlcnZlciB0aGF0IHdlJ3JlIHN0YXJ0aW5nCisgICAgICAgIAorICAgICAgICBub3RpZmljYXRpb24gPSBuZXcgQXR0cmlidXRlQ2hhbmdlTm90aWZpY2F0aW9uCisgICAgICAgICAgICAodGhpcywgc2VxdWVuY2VOdW1iZXIrKywgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCksIAorICAgICAgICAgICAgICJTdGFydGluZyAiICsgTkFNRSwgIlN0YXRlIiwgImphdmEubGFuZy5JbnRlZ2VyIiwgCisgICAgICAgICAgICAgbmV3IEludGVnZXIoU1RPUFBFRCksIG5ldyBJbnRlZ2VyKFNUQVJUSU5HKSk7CisgICAgICAgIHNlbmROb3RpZmljYXRpb24obm90aWZpY2F0aW9uKTsKKyAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9ICJvcmcuYXBhY2hlLm5hbWluZyI7CisgICAgICAgICAgICBTdHJpbmcgb2xkVmFsdWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoQ29udGV4dC5VUkxfUEtHX1BSRUZJWEVTKTsKKyAgICAgICAgICAgIGlmIChvbGRWYWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgb2xkVXJsVmFsdWUgPSBvbGRWYWx1ZTsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IG9sZFZhbHVlICsgIjoiICsgdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoQ29udGV4dC5VUkxfUEtHX1BSRUZJWEVTLCB2YWx1ZSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG9sZFZhbHVlID0gU3lzdGVtLmdldFByb3BlcnR5KENvbnRleHQuSU5JVElBTF9DT05URVhUX0ZBQ1RPUlkpOworICAgICAgICAgICAgaWYgKChvbGRWYWx1ZSAhPSBudWxsKSAmJiAob2xkVmFsdWUubGVuZ3RoKCkgPiAwKSkgeworICAgICAgICAgICAgICAgIG9sZEljVmFsdWUgPSBvbGRWYWx1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KENvbnRleHQuSU5JVElBTF9DT05URVhUX0ZBQ1RPUlksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5QYWNrYWdlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIuamF2YS5qYXZhVVJMQ29udGV4dEZhY3RvcnkiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgc3RhdGUgPSBTVE9QUEVEOworICAgICAgICAgICAgbm90aWZpY2F0aW9uID0gbmV3IEF0dHJpYnV0ZUNoYW5nZU5vdGlmaWNhdGlvbgorICAgICAgICAgICAgICAgICh0aGlzLCBzZXF1ZW5jZU51bWJlcisrLCBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSwgCisgICAgICAgICAgICAgICAgICJTdG9wcGVkICIgKyBOQU1FLCAiU3RhdGUiLCAiamF2YS5sYW5nLkludGVnZXIiLCAKKyAgICAgICAgICAgICAgICAgbmV3IEludGVnZXIoU1RBUlRJTkcpLCBuZXcgSW50ZWdlcihTVE9QUEVEKSk7CisgICAgICAgICAgICBzZW5kTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbik7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHN0YXRlID0gU1RBUlRFRDsKKyAgICAgICAgbm90aWZpY2F0aW9uID0gbmV3IEF0dHJpYnV0ZUNoYW5nZU5vdGlmaWNhdGlvbgorICAgICAgICAgICAgKHRoaXMsIHNlcXVlbmNlTnVtYmVyKyssIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpLCAKKyAgICAgICAgICAgICAiU3RhcnRlZCAiICsgTkFNRSwgIlN0YXRlIiwgImphdmEubGFuZy5JbnRlZ2VyIiwgCisgICAgICAgICAgICAgbmV3IEludGVnZXIoU1RBUlRJTkcpLCBuZXcgSW50ZWdlcihTVEFSVEVEKSk7CisgICAgICAgIHNlbmROb3RpZmljYXRpb24obm90aWZpY2F0aW9uKTsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFN0b3AgdGhlIHNlcnZsZXQgY29udGFpbmVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB7CisgICAgICAgIAorICAgICAgICBOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uID0gbnVsbDsKKyAgICAgICAgCisgICAgICAgIGlmIChzdGF0ZSAhPSBTVEFSVEVEKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAKKyAgICAgICAgc3RhdGUgPSBTVE9QUElORzsKKyAgICAgICAgCisgICAgICAgIG5vdGlmaWNhdGlvbiA9IG5ldyBBdHRyaWJ1dGVDaGFuZ2VOb3RpZmljYXRpb24KKyAgICAgICAgICAgICh0aGlzLCBzZXF1ZW5jZU51bWJlcisrLCBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSwgCisgICAgICAgICAgICAgIlN0b3BwaW5nICIgKyBOQU1FLCAiU3RhdGUiLCAiamF2YS5sYW5nLkludGVnZXIiLCAKKyAgICAgICAgICAgICBuZXcgSW50ZWdlcihTVEFSVEVEKSwgbmV3IEludGVnZXIoU1RPUFBJTkcpKTsKKyAgICAgICAgc2VuZE5vdGlmaWNhdGlvbihub3RpZmljYXRpb24pOworICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KENvbnRleHQuVVJMX1BLR19QUkVGSVhFUywgb2xkVXJsVmFsdWUpOworICAgICAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KENvbnRleHQuSU5JVElBTF9DT05URVhUX0ZBQ1RPUlksIG9sZEljVmFsdWUpOworICAgICAgICAgICAgCisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIEZJWE1FCisgICAgICAgICAgICB0LnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHN0YXRlID0gU1RPUFBFRDsKKyAgICAgICAgCisgICAgICAgIG5vdGlmaWNhdGlvbiA9IG5ldyBBdHRyaWJ1dGVDaGFuZ2VOb3RpZmljYXRpb24KKyAgICAgICAgICAgICh0aGlzLCBzZXF1ZW5jZU51bWJlcisrLCBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSwgCisgICAgICAgICAgICAgIlN0b3BwZWQgIiArIE5BTUUsICJTdGF0ZSIsICJqYXZhLmxhbmcuSW50ZWdlciIsIAorICAgICAgICAgICAgIG5ldyBJbnRlZ2VyKFNUT1BQSU5HKSwgbmV3IEludGVnZXIoU1RPUFBFRCkpOworICAgICAgICBzZW5kTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbik7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBEZXN0cm95IHNlcnZsZXQgY29udGFpbmVyIChpZiBhbnkgaXMgcnVubmluZykuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZGVzdHJveSgpIHsKKyAgICAgICAgCisgICAgICAgIGlmIChnZXRTdGF0ZSgpICE9IFNUT1BQRUQpCisgICAgICAgICAgICBzdG9wKCk7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvTmFtaW5nU2VydmljZU1CZWFuLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL05hbWluZ1NlcnZpY2VNQmVhbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyYTU3ODUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL05hbWluZ1NlcnZpY2VNQmVhbi5qYXZhCkBAIC0wLDAgKzEsOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8gCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5uYW1pbmc7CisKKy8qKgorICogTmFtaW5nIE1CZWFuIGludGVyZmFjZS4KKyAqIAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86cmVtbUBhcGFjaGUub3JnIj5SZW15IE1hdWNoZXJhdDwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworCitwdWJsaWMgaW50ZXJmYWNlIE5hbWluZ1NlcnZpY2VNQmVhbiB7CisgICAgCisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RhbnRzCisgICAgCisgICAgCisgICAgLyoqCisgICAgICogU3RhdHVzIGNvbnN0YW50cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIHN0YXRlcyA9IAorICAgIHsiU3RvcHBlZCIsICJTdG9wcGluZyIsICJTdGFydGluZyIsICJTdGFydGVkIn07CisgICAgCisgICAgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RPUFBFRCAgPSAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUT1BQSU5HID0gMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFSVElORyA9IDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBUlRFRCAgPSAzOworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIENvbXBvbmVudCBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUUgPSAiQXBhY2hlIEpOREkgTmFtaW5nIFNlcnZpY2UiOworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIE9iamVjdCBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9CSkVDVF9OQU1FID0gIjpzZXJ2aWNlPU5hbWluZyI7CisgICAgCisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEludGVyZmFjZSBNZXRob2RzCisgICAgCisgICAgCisgICAgLyoqCisgICAgICogUmV0cnVucyB0aGUgSk5ESSBjb21wb25lbnQgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzdGF0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFN0YXRlKCk7CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3RhdGUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTdGF0ZVN0cmluZygpOworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFN0YXJ0IHRoZSBzZXJ2bGV0IGNvbnRhaW5lci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydCgpCisgICAgICAgIHRocm93cyBFeGNlcHRpb247CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogU3RvcCB0aGUgc2VydmxldCBjb250YWluZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcCgpOworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIERlc3Ryb3kgc2VydmxldCBjb250YWluZXIgKGlmIGFueSBpcyBydW5uaW5nKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkZXN0cm95KCk7CisgICAgCisgICAgCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL1Jlc291cmNlRW52UmVmLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL1Jlc291cmNlRW52UmVmLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVlMDFjMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvUmVzb3VyY2VFbnZSZWYuamF2YQpAQCAtMCwwICsxLDk4IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovIAorCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5uYW1pbmc7CisKK2ltcG9ydCBqYXZheC5uYW1pbmcuQ29udGV4dDsKK2ltcG9ydCBqYXZheC5uYW1pbmcuUmVmZXJlbmNlOworCisvKioKKyAqIFJlcHJlc2VudHMgYSByZWZlcmVuY2UgYWRkcmVzcyB0byBhIHJlc291cmNlIGVudmlyb25tZW50LgorICoKKyAqIEBhdXRob3IgUmVteSBNYXVjaGVyYXQKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIFJlc291cmNlRW52UmVmCisgICAgZXh0ZW5kcyBSZWZlcmVuY2UgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdGFudHMKKworCisgICAgLyoqCisgICAgICogRGVmYXVsdCBmYWN0b3J5IGZvciB0aGlzIHJlZmVyZW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0ZBQ1RPUlkgPSAKKyAgICAgICAgb3JnLmFwYWNoZS5uYW1pbmcuZmFjdG9yeS5Db25zdGFudHMuREVGQVVMVF9SRVNPVVJDRV9FTlZfRkFDVE9SWTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworICAgIC8qKgorICAgICAqIFJlc291cmNlIGVudiByZWZlcmVuY2UuCisgICAgICogCisgICAgICogQHBhcmFtIHJlc291cmNlVHlwZSBUeXBlCisgICAgICovCisgICAgcHVibGljIFJlc291cmNlRW52UmVmKFN0cmluZyByZXNvdXJjZVR5cGUpIHsKKyAgICAgICAgc3VwZXIocmVzb3VyY2VUeXBlKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlc291cmNlIGVudiByZWZlcmVuY2UuCisgICAgICogCisgICAgICogQHBhcmFtIHJlc291cmNlVHlwZSBUeXBlCisgICAgICogQHBhcmFtIGZhY3RvcnkgVGhlIGZhY3RvcnkgY2xhc3MKKyAgICAgKiBAcGFyYW0gZmFjdG9yeUxvY2F0aW9uIFRoZSBmYWN0b3J5IGxvY2F0aW9uCisgICAgICovCisgICAgcHVibGljIFJlc291cmNlRW52UmVmKFN0cmluZyByZXNvdXJjZVR5cGUsIFN0cmluZyBmYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZmFjdG9yeUxvY2F0aW9uKSB7CisgICAgICAgIHN1cGVyKHJlc291cmNlVHlwZSwgZmFjdG9yeSwgZmFjdG9yeUxvY2F0aW9uKTsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUmVmZXJlbmNlIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSBjbGFzcyBuYW1lIG9mIHRoZSBmYWN0b3J5IG9mIHRoZSBvYmplY3QgdG8gd2hpY2ggdGhpcyAKKyAgICAgKiByZWZlcmVuY2UgcmVmZXJzLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmFjdG9yeUNsYXNzTmFtZSgpIHsKKyAgICAgICAgU3RyaW5nIGZhY3RvcnkgPSBzdXBlci5nZXRGYWN0b3J5Q2xhc3NOYW1lKCk7CisgICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWN0b3J5OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmFjdG9yeSA9IFN5c3RlbS5nZXRQcm9wZXJ0eShDb250ZXh0Lk9CSkVDVF9GQUNUT1JJRVMpOworICAgICAgICAgICAgaWYgKGZhY3RvcnkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gREVGQVVMVF9GQUNUT1JZOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL1Jlc291cmNlTGlua1JlZi5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9SZXNvdXJjZUxpbmtSZWYuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2U5Y2UxCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9SZXNvdXJjZUxpbmtSZWYuamF2YQpAQCAtMCwwICsxLDExMCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLyAKKworCitwYWNrYWdlIG9yZy5hcGFjaGUubmFtaW5nOworCitpbXBvcnQgamF2YXgubmFtaW5nLkNvbnRleHQ7CitpbXBvcnQgamF2YXgubmFtaW5nLlJlZmVyZW5jZTsKK2ltcG9ydCBqYXZheC5uYW1pbmcuU3RyaW5nUmVmQWRkcjsKKworLyoqCisgKiBSZXByZXNlbnRzIGEgcmVmZXJlbmNlIGFkZHJlc3MgdG8gYSByZXNvdXJjZS4KKyAqCisgKiBAYXV0aG9yIFJlbXkgTWF1Y2hlcmF0CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBSZXNvdXJjZUxpbmtSZWYKKyAgICBleHRlbmRzIFJlZmVyZW5jZSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0YW50cworCisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGZhY3RvcnkgZm9yIHRoaXMgcmVmZXJlbmNlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRkFDVE9SWSA9IAorICAgICAgICBvcmcuYXBhY2hlLm5hbWluZy5mYWN0b3J5LkNvbnN0YW50cy5ERUZBVUxUX1JFU09VUkNFX0xJTktfRkFDVE9SWTsKKworCisgICAgLyoqCisgICAgICogRGVzY3JpcHRpb24gYWRkcmVzcyB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdMT0JBTE5BTUUgPSAiZ2xvYmFsTmFtZSI7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvKioKKyAgICAgKiBSZXNvdXJjZUxpbmsgUmVmZXJlbmNlLgorICAgICAqIAorICAgICAqIEBwYXJhbSByZXNvdXJjZUNsYXNzIFJlc291cmNlIGNsYXNzCisgICAgICogQHBhcmFtIGdsb2JhbE5hbWUgR2xvYmFsIG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgUmVzb3VyY2VMaW5rUmVmKFN0cmluZyByZXNvdXJjZUNsYXNzLCBTdHJpbmcgZ2xvYmFsTmFtZSkgeworICAgICAgICB0aGlzKHJlc291cmNlQ2xhc3MsIGdsb2JhbE5hbWUsIG51bGwsIG51bGwpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVzb3VyY2VMaW5rIFJlZmVyZW5jZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VDbGFzcyBSZXNvdXJjZSBjbGFzcworICAgICAqIEBwYXJhbSBnbG9iYWxOYW1lIEdsb2JhbCBuYW1lCisgICAgICovCisgICAgcHVibGljIFJlc291cmNlTGlua1JlZihTdHJpbmcgcmVzb3VyY2VDbGFzcywgU3RyaW5nIGdsb2JhbE5hbWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZhY3RvcnksIFN0cmluZyBmYWN0b3J5TG9jYXRpb24pIHsKKyAgICAgICAgc3VwZXIocmVzb3VyY2VDbGFzcywgZmFjdG9yeSwgZmFjdG9yeUxvY2F0aW9uKTsKKyAgICAgICAgU3RyaW5nUmVmQWRkciByZWZBZGRyID0gbnVsbDsKKyAgICAgICAgaWYgKGdsb2JhbE5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgcmVmQWRkciA9IG5ldyBTdHJpbmdSZWZBZGRyKEdMT0JBTE5BTUUsIGdsb2JhbE5hbWUpOworICAgICAgICAgICAgYWRkKHJlZkFkZHIpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFJlZmVyZW5jZSBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgY2xhc3MgbmFtZSBvZiB0aGUgZmFjdG9yeSBvZiB0aGUgb2JqZWN0IHRvIHdoaWNoIHRoaXMgCisgICAgICogcmVmZXJlbmNlIHJlZmVycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEZhY3RvcnlDbGFzc05hbWUoKSB7CisgICAgICAgIFN0cmluZyBmYWN0b3J5ID0gc3VwZXIuZ2V0RmFjdG9yeUNsYXNzTmFtZSgpOworICAgICAgICBpZiAoZmFjdG9yeSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFjdG9yeTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZhY3RvcnkgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoQ29udGV4dC5PQkpFQ1RfRkFDVE9SSUVTKTsKKyAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIERFRkFVTFRfRkFDVE9SWTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9SZXNvdXJjZVJlZi5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9SZXNvdXJjZVJlZi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5ZDZkMGIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL1Jlc291cmNlUmVmLmphdmEKQEAgLTAsMCArMSwxNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8gCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm5hbWluZzsKKworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKKworaW1wb3J0IGphdmF4Lm5hbWluZy5Db250ZXh0OworaW1wb3J0IGphdmF4Lm5hbWluZy5SZWZBZGRyOworaW1wb3J0IGphdmF4Lm5hbWluZy5SZWZlcmVuY2U7CitpbXBvcnQgamF2YXgubmFtaW5nLlN0cmluZ1JlZkFkZHI7CisKKy8qKgorICogUmVwcmVzZW50cyBhIHJlZmVyZW5jZSBhZGRyZXNzIHRvIGEgcmVzb3VyY2UuCisgKgorICogQGF1dGhvciBSZW15IE1hdWNoZXJhdAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgUmVzb3VyY2VSZWYKKyAgICBleHRlbmRzIFJlZmVyZW5jZSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0YW50cworCisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGZhY3RvcnkgZm9yIHRoaXMgcmVmZXJlbmNlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRkFDVE9SWSA9IAorICAgICAgICBvcmcuYXBhY2hlLm5hbWluZy5mYWN0b3J5LkNvbnN0YW50cy5ERUZBVUxUX1JFU09VUkNFX0ZBQ1RPUlk7CisKKworICAgIC8qKgorICAgICAqIERlc2NyaXB0aW9uIGFkZHJlc3MgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTiA9ICJkZXNjcmlwdGlvbiI7CisKKworICAgIC8qKgorICAgICAqIFNjb3BlIGFkZHJlc3MgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQ09QRSA9ICJzY29wZSI7CisKKworICAgIC8qKgorICAgICAqIEF1dGggYWRkcmVzcyB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFVVEggPSAiYXV0aCI7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvKioKKyAgICAgKiBSZXNvdXJjZSBSZWZlcmVuY2UuCisgICAgICogCisgICAgICogQHBhcmFtIHJlc291cmNlQ2xhc3MgUmVzb3VyY2UgY2xhc3MKKyAgICAgKiBAcGFyYW0gc2NvcGUgUmVzb3VyY2Ugc2NvcGUKKyAgICAgKiBAcGFyYW0gYXV0aCBSZXNvdXJjZSBhdXRoZXRpY2F0aW9uCisgICAgICovCisgICAgcHVibGljIFJlc291cmNlUmVmKFN0cmluZyByZXNvdXJjZUNsYXNzLCBTdHJpbmcgZGVzY3JpcHRpb24sIAorICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2NvcGUsIFN0cmluZyBhdXRoKSB7CisgICAgICAgIHRoaXMocmVzb3VyY2VDbGFzcywgZGVzY3JpcHRpb24sIHNjb3BlLCBhdXRoLCBudWxsLCBudWxsKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlc291cmNlIFJlZmVyZW5jZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VDbGFzcyBSZXNvdXJjZSBjbGFzcworICAgICAqIEBwYXJhbSBzY29wZSBSZXNvdXJjZSBzY29wZQorICAgICAqIEBwYXJhbSBhdXRoIFJlc291cmNlIGF1dGhldGljYXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgUmVzb3VyY2VSZWYoU3RyaW5nIHJlc291cmNlQ2xhc3MsIFN0cmluZyBkZXNjcmlwdGlvbiwgCisgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzY29wZSwgU3RyaW5nIGF1dGgsIFN0cmluZyBmYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZmFjdG9yeUxvY2F0aW9uKSB7CisgICAgICAgIHN1cGVyKHJlc291cmNlQ2xhc3MsIGZhY3RvcnksIGZhY3RvcnlMb2NhdGlvbik7CisgICAgICAgIFN0cmluZ1JlZkFkZHIgcmVmQWRkciA9IG51bGw7CisgICAgICAgIGlmIChkZXNjcmlwdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICByZWZBZGRyID0gbmV3IFN0cmluZ1JlZkFkZHIoREVTQ1JJUFRJT04sIGRlc2NyaXB0aW9uKTsKKyAgICAgICAgICAgIGFkZChyZWZBZGRyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2NvcGUgIT0gbnVsbCkgeworICAgICAgICAgICAgcmVmQWRkciA9IG5ldyBTdHJpbmdSZWZBZGRyKFNDT1BFLCBzY29wZSk7CisgICAgICAgICAgICBhZGQocmVmQWRkcik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGF1dGggIT0gbnVsbCkgeworICAgICAgICAgICAgcmVmQWRkciA9IG5ldyBTdHJpbmdSZWZBZGRyKEFVVEgsIGF1dGgpOworICAgICAgICAgICAgYWRkKHJlZkFkZHIpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFJlZmVyZW5jZSBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgY2xhc3MgbmFtZSBvZiB0aGUgZmFjdG9yeSBvZiB0aGUgb2JqZWN0IHRvIHdoaWNoIHRoaXMgCisgICAgICogcmVmZXJlbmNlIHJlZmVycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEZhY3RvcnlDbGFzc05hbWUoKSB7CisgICAgICAgIFN0cmluZyBmYWN0b3J5ID0gc3VwZXIuZ2V0RmFjdG9yeUNsYXNzTmFtZSgpOworICAgICAgICBpZiAoZmFjdG9yeSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFjdG9yeTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZhY3RvcnkgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoQ29udGV4dC5PQkpFQ1RfRkFDVE9SSUVTKTsKKyAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIERFRkFVTFRfRkFDVE9SWTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIFN0cmluZyByZW5kZXJpbmcgb2YgdGhpcyBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCJSZXNvdXJjZVJlZlsiKTsKKyAgICAgICAgc2IuYXBwZW5kKCJjbGFzc05hbWU9Iik7CisgICAgICAgIHNiLmFwcGVuZChnZXRDbGFzc05hbWUoKSk7CisgICAgICAgIHNiLmFwcGVuZCgiLGZhY3RvcnlDbGFzc0xvY2F0aW9uPSIpOworICAgICAgICBzYi5hcHBlbmQoZ2V0RmFjdG9yeUNsYXNzTG9jYXRpb24oKSk7CisgICAgICAgIHNiLmFwcGVuZCgiLGZhY3RvcnlDbGFzc05hbWU9Iik7CisgICAgICAgIHNiLmFwcGVuZChnZXRGYWN0b3J5Q2xhc3NOYW1lKCkpOworICAgICAgICBFbnVtZXJhdGlvbiByZWZBZGRycyA9IGdldEFsbCgpOworICAgICAgICB3aGlsZSAocmVmQWRkcnMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgIFJlZkFkZHIgcmVmQWRkciA9IChSZWZBZGRyKSByZWZBZGRycy5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgc2IuYXBwZW5kKCIse3R5cGU9Iik7CisgICAgICAgICAgICBzYi5hcHBlbmQocmVmQWRkci5nZXRUeXBlKCkpOworICAgICAgICAgICAgc2IuYXBwZW5kKCIsY29udGVudD0iKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChyZWZBZGRyLmdldENvbnRlbnQoKSk7CisgICAgICAgICAgICBzYi5hcHBlbmQoIn0iKTsKKyAgICAgICAgfQorICAgICAgICBzYi5hcHBlbmQoIl0iKTsKKyAgICAgICAgcmV0dXJuIChzYi50b1N0cmluZygpKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9TZWxlY3RvckNvbnRleHQuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvU2VsZWN0b3JDb250ZXh0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ0NzlhYwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvU2VsZWN0b3JDb250ZXh0LmphdmEKQEAgLTAsMCArMSw2OTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8gCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm5hbWluZzsKKworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YXgubmFtaW5nLkNvbnRleHQ7CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWU7CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWVQYXJzZXI7CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWluZ0VudW1lcmF0aW9uOworaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1pbmdFeGNlcHRpb247CisKKy8qKgorICogQ2F0YWxpbmEgSk5ESSBDb250ZXh0IGltcGxlbWVudGF0aW9uLgorICoKKyAqIEBhdXRob3IgUmVteSBNYXVjaGVyYXQKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIFNlbGVjdG9yQ29udGV4dCBpbXBsZW1lbnRzIENvbnRleHQgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdGFudHMKKworCisgICAgLyoqCisgICAgICogTmFtZXNwYWNlIFVSTC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBwcmVmaXggPSAiamF2YToiOworCisKKyAgICAvKioKKyAgICAgKiBOYW1lc3BhY2UgVVJMIGxlbmd0aC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBwcmVmaXhMZW5ndGggPSBwcmVmaXgubGVuZ3RoKCk7CisKKworICAgIC8qKgorICAgICAqIEluaXRpYWwgY29udGV4dCBwcmVmaXguCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNfUFJFRklYID0gIklDXyI7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvKioKKyAgICAgKiBCdWlsZHMgYSBDYXRhbGluYSBzZWxlY3RvciBjb250ZXh0IHVzaW5nIHRoZSBnaXZlbiBlbnZpcm9ubWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2VsZWN0b3JDb250ZXh0KEhhc2h0YWJsZSBlbnYpIHsKKyAgICAgICAgdGhpcy5lbnYgPSBlbnY7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBCdWlsZHMgYSBDYXRhbGluYSBzZWxlY3RvciBjb250ZXh0IHVzaW5nIHRoZSBnaXZlbiBlbnZpcm9ubWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2VsZWN0b3JDb250ZXh0KEhhc2h0YWJsZSBlbnYsIGJvb2xlYW4gaW5pdGlhbENvbnRleHQpIHsKKyAgICAgICAgdGhpcyhlbnYpOworICAgICAgICB0aGlzLmluaXRpYWxDb250ZXh0ID0gaW5pdGlhbENvbnRleHQ7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogRW52aXJvbm1lbnQuCisgICAgICovCisgICAgcHJvdGVjdGVkIEhhc2h0YWJsZSBlbnY7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzdHJpbmcgbWFuYWdlciBmb3IgdGhpcyBwYWNrYWdlLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmdNYW5hZ2VyIHNtID0gU3RyaW5nTWFuYWdlci5nZXRNYW5hZ2VyKENvbnN0YW50cy5QYWNrYWdlKTsKKworCisgICAgLyoqCisgICAgICogUmVxdWVzdCBmb3IgYW4gaW5pdGlhbCBjb250ZXh0LgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGluaXRpYWxDb250ZXh0ID0gZmFsc2U7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb250ZXh0IE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSBuYW1lZCBvYmplY3QuIElmIG5hbWUgaXMgZW1wdHksIHJldHVybnMgYSBuZXcgaW5zdGFuY2UgCisgICAgICogb2YgdGhpcyBjb250ZXh0ICh3aGljaCByZXByZXNlbnRzIHRoZSBzYW1lIG5hbWluZyBjb250ZXh0IGFzIHRoaXMgCisgICAgICogY29udGV4dCwgYnV0IGl0cyBlbnZpcm9ubWVudCBtYXkgYmUgbW9kaWZpZWQgaW5kZXBlbmRlbnRseSBhbmQgaXQgbWF5IAorICAgICAqIGJlIGFjY2Vzc2VkIGNvbmN1cnJlbnRseSkuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIG9iamVjdCB0byBsb29rIHVwCisgICAgICogQHJldHVybiB0aGUgb2JqZWN0IGJvdW5kIHRvIG5hbWUKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGxvb2t1cChOYW1lIG5hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICAvLyBTdHJpcCB0aGUgVVJMIGhlYWRlcgorICAgICAgICAvLyBGaW5kIHRoZSBhcHByb3ByaWF0ZSBOYW1pbmdDb250ZXh0IGFjY29yZGluZyB0byB0aGUgY3VycmVudCBiaW5kaW5ncworICAgICAgICAvLyBFeGVjdXRlIHRoZSBsb29rdXAgb24gdGhhdCBjb250ZXh0CisgICAgICAgIHJldHVybiBnZXRCb3VuZENvbnRleHQoKS5sb29rdXAocGFyc2VOYW1lKG5hbWUpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgbmFtZWQgb2JqZWN0LgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBvYmplY3QgdG8gbG9vayB1cAorICAgICAqIEByZXR1cm4gdGhlIG9iamVjdCBib3VuZCB0byBuYW1lCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBsb29rdXAoU3RyaW5nIG5hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICAvLyBTdHJpcCB0aGUgVVJMIGhlYWRlcgorICAgICAgICAvLyBGaW5kIHRoZSBhcHByb3ByaWF0ZSBOYW1pbmdDb250ZXh0IGFjY29yZGluZyB0byB0aGUgY3VycmVudCBiaW5kaW5ncworICAgICAgICAvLyBFeGVjdXRlIHRoZSBsb29rdXAgb24gdGhhdCBjb250ZXh0CisgICAgICAgIHJldHVybiBnZXRCb3VuZENvbnRleHQoKS5sb29rdXAocGFyc2VOYW1lKG5hbWUpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEJpbmRzIGEgbmFtZSB0byBhbiBvYmplY3QuIEFsbCBpbnRlcm1lZGlhdGUgY29udGV4dHMgYW5kIHRoZSB0YXJnZXQgCisgICAgICogY29udGV4dCAodGhhdCBuYW1lZCBieSBhbGwgYnV0IHRlcm1pbmFsIGF0b21pYyBjb21wb25lbnQgb2YgdGhlIG5hbWUpIAorICAgICAqIG11c3QgYWxyZWFkeSBleGlzdC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSB0byBiaW5kOyBtYXkgbm90IGJlIGVtcHR5CisgICAgICogQHBhcmFtIG9iaiB0aGUgb2JqZWN0IHRvIGJpbmQ7IHBvc3NpYmx5IG51bGwKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWVBbHJlYWR5Qm91bmRFeGNlcHRpb24gaWYgbmFtZSBpcyBhbHJlYWR5IGJvdW5kCisgICAgICogQGV4Y2VwdGlvbiBJbnZhbGlkQXR0cmlidXRlc0V4Y2VwdGlvbiBpZiBvYmplY3QgZGlkIG5vdCBzdXBwbHkgYWxsIAorICAgICAqIG1hbmRhdG9yeSBhdHRyaWJ1dGVzCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYmluZChOYW1lIG5hbWUsIE9iamVjdCBvYmopCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICBnZXRCb3VuZENvbnRleHQoKS5iaW5kKHBhcnNlTmFtZShuYW1lKSwgb2JqKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEJpbmRzIGEgbmFtZSB0byBhbiBvYmplY3QuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgdG8gYmluZDsgbWF5IG5vdCBiZSBlbXB0eQorICAgICAqIEBwYXJhbSBvYmogdGhlIG9iamVjdCB0byBiaW5kOyBwb3NzaWJseSBudWxsCisgICAgICogQGV4Y2VwdGlvbiBOYW1lQWxyZWFkeUJvdW5kRXhjZXB0aW9uIGlmIG5hbWUgaXMgYWxyZWFkeSBib3VuZAorICAgICAqIEBleGNlcHRpb24gSW52YWxpZEF0dHJpYnV0ZXNFeGNlcHRpb24gaWYgb2JqZWN0IGRpZCBub3Qgc3VwcGx5IGFsbCAKKyAgICAgKiBtYW5kYXRvcnkgYXR0cmlidXRlcworICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGJpbmQoU3RyaW5nIG5hbWUsIE9iamVjdCBvYmopCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICBnZXRCb3VuZENvbnRleHQoKS5iaW5kKHBhcnNlTmFtZShuYW1lKSwgb2JqKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEJpbmRzIGEgbmFtZSB0byBhbiBvYmplY3QsIG92ZXJ3cml0aW5nIGFueSBleGlzdGluZyBiaW5kaW5nLiBBbGwgCisgICAgICogaW50ZXJtZWRpYXRlIGNvbnRleHRzIGFuZCB0aGUgdGFyZ2V0IGNvbnRleHQgKHRoYXQgbmFtZWQgYnkgYWxsIGJ1dCAKKyAgICAgKiB0ZXJtaW5hbCBhdG9taWMgY29tcG9uZW50IG9mIHRoZSBuYW1lKSBtdXN0IGFscmVhZHkgZXhpc3QuCisgICAgICogPHA+CisgICAgICogSWYgdGhlIG9iamVjdCBpcyBhIERpckNvbnRleHQsIGFueSBleGlzdGluZyBhdHRyaWJ1dGVzIGFzc29jaWF0ZWQgd2l0aCAKKyAgICAgKiB0aGUgbmFtZSBhcmUgcmVwbGFjZWQgd2l0aCB0aG9zZSBvZiB0aGUgb2JqZWN0LiBPdGhlcndpc2UsIGFueSAKKyAgICAgKiBleGlzdGluZyBhdHRyaWJ1dGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmFtZSByZW1haW4gdW5jaGFuZ2VkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIHRvIGJpbmQ7IG1heSBub3QgYmUgZW1wdHkKKyAgICAgKiBAcGFyYW0gb2JqIHRoZSBvYmplY3QgdG8gYmluZDsgcG9zc2libHkgbnVsbAorICAgICAqIEBleGNlcHRpb24gSW52YWxpZEF0dHJpYnV0ZXNFeGNlcHRpb24gaWYgb2JqZWN0IGRpZCBub3Qgc3VwcGx5IGFsbCAKKyAgICAgKiBtYW5kYXRvcnkgYXR0cmlidXRlcworICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlYmluZChOYW1lIG5hbWUsIE9iamVjdCBvYmopCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICBnZXRCb3VuZENvbnRleHQoKS5yZWJpbmQocGFyc2VOYW1lKG5hbWUpLCBvYmopOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQmluZHMgYSBuYW1lIHRvIGFuIG9iamVjdCwgb3ZlcndyaXRpbmcgYW55IGV4aXN0aW5nIGJpbmRpbmcuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgdG8gYmluZDsgbWF5IG5vdCBiZSBlbXB0eQorICAgICAqIEBwYXJhbSBvYmogdGhlIG9iamVjdCB0byBiaW5kOyBwb3NzaWJseSBudWxsCisgICAgICogQGV4Y2VwdGlvbiBJbnZhbGlkQXR0cmlidXRlc0V4Y2VwdGlvbiBpZiBvYmplY3QgZGlkIG5vdCBzdXBwbHkgYWxsIAorICAgICAqIG1hbmRhdG9yeSBhdHRyaWJ1dGVzCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmViaW5kKFN0cmluZyBuYW1lLCBPYmplY3Qgb2JqKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgZ2V0Qm91bmRDb250ZXh0KCkucmViaW5kKHBhcnNlTmFtZShuYW1lKSwgb2JqKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFVuYmluZHMgdGhlIG5hbWVkIG9iamVjdC4gUmVtb3ZlcyB0aGUgdGVybWluYWwgYXRvbWljIG5hbWUgaW4gbmFtZSAKKyAgICAgKiBmcm9tIHRoZSB0YXJnZXQgY29udGV4dC0tdGhhdCBuYW1lZCBieSBhbGwgYnV0IHRoZSB0ZXJtaW5hbCBhdG9taWMgCisgICAgICogcGFydCBvZiBuYW1lLgorICAgICAqIDxwPgorICAgICAqIFRoaXMgbWV0aG9kIGlzIGlkZW1wb3RlbnQuIEl0IHN1Y2NlZWRzIGV2ZW4gaWYgdGhlIHRlcm1pbmFsIGF0b21pYyAKKyAgICAgKiBuYW1lIGlzIG5vdCBib3VuZCBpbiB0aGUgdGFyZ2V0IGNvbnRleHQsIGJ1dCB0aHJvd3MgCisgICAgICogTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGlmIGFueSBvZiB0aGUgaW50ZXJtZWRpYXRlIGNvbnRleHRzIGRvIG5vdCBleGlzdC4gCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgdG8gYmluZDsgbWF5IG5vdCBiZSBlbXB0eQorICAgICAqIEBleGNlcHRpb24gTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGlmIGFuIGludGVybWVkaWF0ZSBjb250ZXh0IGRvZXMgbm90IAorICAgICAqIGV4aXN0CisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgdW5iaW5kKE5hbWUgbmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIGdldEJvdW5kQ29udGV4dCgpLnVuYmluZChwYXJzZU5hbWUobmFtZSkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVW5iaW5kcyB0aGUgbmFtZWQgb2JqZWN0LgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIHRvIGJpbmQ7IG1heSBub3QgYmUgZW1wdHkKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWVOb3RGb3VuZEV4Y2VwdGlvbiBpZiBhbiBpbnRlcm1lZGlhdGUgY29udGV4dCBkb2VzIG5vdCAKKyAgICAgKiBleGlzdAorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHVuYmluZChTdHJpbmcgbmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIGdldEJvdW5kQ29udGV4dCgpLnVuYmluZChwYXJzZU5hbWUobmFtZSkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQmluZHMgYSBuZXcgbmFtZSB0byB0aGUgb2JqZWN0IGJvdW5kIHRvIGFuIG9sZCBuYW1lLCBhbmQgdW5iaW5kcyB0aGUgCisgICAgICogb2xkIG5hbWUuIEJvdGggbmFtZXMgYXJlIHJlbGF0aXZlIHRvIHRoaXMgY29udGV4dC4gQW55IGF0dHJpYnV0ZXMgCisgICAgICogYXNzb2NpYXRlZCB3aXRoIHRoZSBvbGQgbmFtZSBiZWNvbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBuZXcgbmFtZS4gCisgICAgICogSW50ZXJtZWRpYXRlIGNvbnRleHRzIG9mIHRoZSBvbGQgbmFtZSBhcmUgbm90IGNoYW5nZWQuCisgICAgICogCisgICAgICogQHBhcmFtIG9sZE5hbWUgdGhlIG5hbWUgb2YgdGhlIGV4aXN0aW5nIGJpbmRpbmc7IG1heSBub3QgYmUgZW1wdHkKKyAgICAgKiBAcGFyYW0gbmV3TmFtZSB0aGUgbmFtZSBvZiB0aGUgbmV3IGJpbmRpbmc7IG1heSBub3QgYmUgZW1wdHkKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWVBbHJlYWR5Qm91bmRFeGNlcHRpb24gaWYgbmV3TmFtZSBpcyBhbHJlYWR5IGJvdW5kCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVuYW1lKE5hbWUgb2xkTmFtZSwgTmFtZSBuZXdOYW1lKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgZ2V0Qm91bmRDb250ZXh0KCkucmVuYW1lKHBhcnNlTmFtZShvbGROYW1lKSwgcGFyc2VOYW1lKG5ld05hbWUpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEJpbmRzIGEgbmV3IG5hbWUgdG8gdGhlIG9iamVjdCBib3VuZCB0byBhbiBvbGQgbmFtZSwgYW5kIHVuYmluZHMgdGhlIAorICAgICAqIG9sZCBuYW1lLgorICAgICAqIAorICAgICAqIEBwYXJhbSBvbGROYW1lIHRoZSBuYW1lIG9mIHRoZSBleGlzdGluZyBiaW5kaW5nOyBtYXkgbm90IGJlIGVtcHR5CisgICAgICogQHBhcmFtIG5ld05hbWUgdGhlIG5hbWUgb2YgdGhlIG5ldyBiaW5kaW5nOyBtYXkgbm90IGJlIGVtcHR5CisgICAgICogQGV4Y2VwdGlvbiBOYW1lQWxyZWFkeUJvdW5kRXhjZXB0aW9uIGlmIG5ld05hbWUgaXMgYWxyZWFkeSBib3VuZAorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbmFtZShTdHJpbmcgb2xkTmFtZSwgU3RyaW5nIG5ld05hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICBnZXRCb3VuZENvbnRleHQoKS5yZW5hbWUocGFyc2VOYW1lKG9sZE5hbWUpLCBwYXJzZU5hbWUobmV3TmFtZSkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogRW51bWVyYXRlcyB0aGUgbmFtZXMgYm91bmQgaW4gdGhlIG5hbWVkIGNvbnRleHQsIGFsb25nIHdpdGggdGhlIGNsYXNzIAorICAgICAqIG5hbWVzIG9mIG9iamVjdHMgYm91bmQgdG8gdGhlbS4gVGhlIGNvbnRlbnRzIG9mIGFueSBzdWJjb250ZXh0cyBhcmUgCisgICAgICogbm90IGluY2x1ZGVkLgorICAgICAqIDxwPgorICAgICAqIElmIGEgYmluZGluZyBpcyBhZGRlZCB0byBvciByZW1vdmVkIGZyb20gdGhpcyBjb250ZXh0LCBpdHMgZWZmZWN0IG9uIAorICAgICAqIGFuIGVudW1lcmF0aW9uIHByZXZpb3VzbHkgcmV0dXJuZWQgaXMgdW5kZWZpbmVkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBjb250ZXh0IHRvIGxpc3QKKyAgICAgKiBAcmV0dXJuIGFuIGVudW1lcmF0aW9uIG9mIHRoZSBuYW1lcyBhbmQgY2xhc3MgbmFtZXMgb2YgdGhlIGJpbmRpbmdzIGluIAorICAgICAqIHRoaXMgY29udGV4dC4gRWFjaCBlbGVtZW50IG9mIHRoZSBlbnVtZXJhdGlvbiBpcyBvZiB0eXBlIE5hbWVDbGFzc1BhaXIuCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIE5hbWluZ0VudW1lcmF0aW9uIGxpc3QoTmFtZSBuYW1lKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGdldEJvdW5kQ29udGV4dCgpLmxpc3QocGFyc2VOYW1lKG5hbWUpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEVudW1lcmF0ZXMgdGhlIG5hbWVzIGJvdW5kIGluIHRoZSBuYW1lZCBjb250ZXh0LCBhbG9uZyB3aXRoIHRoZSBjbGFzcyAKKyAgICAgKiBuYW1lcyBvZiBvYmplY3RzIGJvdW5kIHRvIHRoZW0uCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbnRleHQgdG8gbGlzdAorICAgICAqIEByZXR1cm4gYW4gZW51bWVyYXRpb24gb2YgdGhlIG5hbWVzIGFuZCBjbGFzcyBuYW1lcyBvZiB0aGUgYmluZGluZ3MgaW4gCisgICAgICogdGhpcyBjb250ZXh0LiBFYWNoIGVsZW1lbnQgb2YgdGhlIGVudW1lcmF0aW9uIGlzIG9mIHR5cGUgTmFtZUNsYXNzUGFpci4KKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgTmFtaW5nRW51bWVyYXRpb24gbGlzdChTdHJpbmcgbmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBnZXRCb3VuZENvbnRleHQoKS5saXN0KHBhcnNlTmFtZShuYW1lKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBFbnVtZXJhdGVzIHRoZSBuYW1lcyBib3VuZCBpbiB0aGUgbmFtZWQgY29udGV4dCwgYWxvbmcgd2l0aCB0aGUgCisgICAgICogb2JqZWN0cyBib3VuZCB0byB0aGVtLiBUaGUgY29udGVudHMgb2YgYW55IHN1YmNvbnRleHRzIGFyZSBub3QgCisgICAgICogaW5jbHVkZWQuCisgICAgICogPHA+CisgICAgICogSWYgYSBiaW5kaW5nIGlzIGFkZGVkIHRvIG9yIHJlbW92ZWQgZnJvbSB0aGlzIGNvbnRleHQsIGl0cyBlZmZlY3Qgb24gCisgICAgICogYW4gZW51bWVyYXRpb24gcHJldmlvdXNseSByZXR1cm5lZCBpcyB1bmRlZmluZWQuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbnRleHQgdG8gbGlzdAorICAgICAqIEByZXR1cm4gYW4gZW51bWVyYXRpb24gb2YgdGhlIGJpbmRpbmdzIGluIHRoaXMgY29udGV4dC4gCisgICAgICogRWFjaCBlbGVtZW50IG9mIHRoZSBlbnVtZXJhdGlvbiBpcyBvZiB0eXBlIEJpbmRpbmcuCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIE5hbWluZ0VudW1lcmF0aW9uIGxpc3RCaW5kaW5ncyhOYW1lIG5hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZ2V0Qm91bmRDb250ZXh0KCkubGlzdEJpbmRpbmdzKHBhcnNlTmFtZShuYW1lKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBFbnVtZXJhdGVzIHRoZSBuYW1lcyBib3VuZCBpbiB0aGUgbmFtZWQgY29udGV4dCwgYWxvbmcgd2l0aCB0aGUgCisgICAgICogb2JqZWN0cyBib3VuZCB0byB0aGVtLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBjb250ZXh0IHRvIGxpc3QKKyAgICAgKiBAcmV0dXJuIGFuIGVudW1lcmF0aW9uIG9mIHRoZSBiaW5kaW5ncyBpbiB0aGlzIGNvbnRleHQuIAorICAgICAqIEVhY2ggZWxlbWVudCBvZiB0aGUgZW51bWVyYXRpb24gaXMgb2YgdHlwZSBCaW5kaW5nLgorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBOYW1pbmdFbnVtZXJhdGlvbiBsaXN0QmluZGluZ3MoU3RyaW5nIG5hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZ2V0Qm91bmRDb250ZXh0KCkubGlzdEJpbmRpbmdzKHBhcnNlTmFtZShuYW1lKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBEZXN0cm95cyB0aGUgbmFtZWQgY29udGV4dCBhbmQgcmVtb3ZlcyBpdCBmcm9tIHRoZSBuYW1lc3BhY2UuIEFueSAKKyAgICAgKiBhdHRyaWJ1dGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmFtZSBhcmUgYWxzbyByZW1vdmVkLiBJbnRlcm1lZGlhdGUgCisgICAgICogY29udGV4dHMgYXJlIG5vdCBkZXN0cm95ZWQuCisgICAgICogPHA+CisgICAgICogVGhpcyBtZXRob2QgaXMgaWRlbXBvdGVudC4gSXQgc3VjY2VlZHMgZXZlbiBpZiB0aGUgdGVybWluYWwgYXRvbWljIAorICAgICAqIG5hbWUgaXMgbm90IGJvdW5kIGluIHRoZSB0YXJnZXQgY29udGV4dCwgYnV0IHRocm93cyAKKyAgICAgKiBOYW1lTm90Rm91bmRFeGNlcHRpb24gaWYgYW55IG9mIHRoZSBpbnRlcm1lZGlhdGUgY29udGV4dHMgZG8gbm90IGV4aXN0LiAKKyAgICAgKiAKKyAgICAgKiBJbiBhIGZlZGVyYXRlZCBuYW1pbmcgc3lzdGVtLCBhIGNvbnRleHQgZnJvbSBvbmUgbmFtaW5nIHN5c3RlbSBtYXkgYmUgCisgICAgICogYm91bmQgdG8gYSBuYW1lIGluIGFub3RoZXIuIE9uZSBjYW4gc3Vic2VxdWVudGx5IGxvb2sgdXAgYW5kIHBlcmZvcm0gCisgICAgICogb3BlcmF0aW9ucyBvbiB0aGUgZm9yZWlnbiBjb250ZXh0IHVzaW5nIGEgY29tcG9zaXRlIG5hbWUuIEhvd2V2ZXIsIGFuIAorICAgICAqIGF0dGVtcHQgZGVzdHJveSB0aGUgY29udGV4dCB1c2luZyB0aGlzIGNvbXBvc2l0ZSBuYW1lIHdpbGwgZmFpbCB3aXRoIAorICAgICAqIE5vdENvbnRleHRFeGNlcHRpb24sIGJlY2F1c2UgdGhlIGZvcmVpZ24gY29udGV4dCBpcyBub3QgYSAic3ViY29udGV4dCIgCisgICAgICogb2YgdGhlIGNvbnRleHQgaW4gd2hpY2ggaXQgaXMgYm91bmQuIEluc3RlYWQsIHVzZSB1bmJpbmQoKSB0byByZW1vdmUgCisgICAgICogdGhlIGJpbmRpbmcgb2YgdGhlIGZvcmVpZ24gY29udGV4dC4gRGVzdHJveWluZyB0aGUgZm9yZWlnbiBjb250ZXh0IAorICAgICAqIHJlcXVpcmVzIHRoYXQgdGhlIGRlc3Ryb3lTdWJjb250ZXh0KCkgYmUgcGVyZm9ybWVkIG9uIGEgY29udGV4dCBmcm9tIAorICAgICAqIHRoZSBmb3JlaWduIGNvbnRleHQncyAibmF0aXZlIiBuYW1pbmcgc3lzdGVtLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBjb250ZXh0IHRvIGJlIGRlc3Ryb3llZDsgbWF5IG5vdCBiZSBlbXB0eQorICAgICAqIEBleGNlcHRpb24gTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGlmIGFuIGludGVybWVkaWF0ZSBjb250ZXh0IGRvZXMgbm90IAorICAgICAqIGV4aXN0CisgICAgICogQGV4Y2VwdGlvbiBOb3RDb250ZXh0RXhjZXB0aW9uIGlmIHRoZSBuYW1lIGlzIGJvdW5kIGJ1dCBkb2VzIG5vdCBuYW1lIAorICAgICAqIGEgY29udGV4dCwgb3IgZG9lcyBub3QgbmFtZSBhIGNvbnRleHQgb2YgdGhlIGFwcHJvcHJpYXRlIHR5cGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkZXN0cm95U3ViY29udGV4dChOYW1lIG5hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICBnZXRCb3VuZENvbnRleHQoKS5kZXN0cm95U3ViY29udGV4dChwYXJzZU5hbWUobmFtZSkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogRGVzdHJveXMgdGhlIG5hbWVkIGNvbnRleHQgYW5kIHJlbW92ZXMgaXQgZnJvbSB0aGUgbmFtZXNwYWNlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBjb250ZXh0IHRvIGJlIGRlc3Ryb3llZDsgbWF5IG5vdCBiZSBlbXB0eQorICAgICAqIEBleGNlcHRpb24gTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGlmIGFuIGludGVybWVkaWF0ZSBjb250ZXh0IGRvZXMgbm90IAorICAgICAqIGV4aXN0CisgICAgICogQGV4Y2VwdGlvbiBOb3RDb250ZXh0RXhjZXB0aW9uIGlmIHRoZSBuYW1lIGlzIGJvdW5kIGJ1dCBkb2VzIG5vdCBuYW1lIAorICAgICAqIGEgY29udGV4dCwgb3IgZG9lcyBub3QgbmFtZSBhIGNvbnRleHQgb2YgdGhlIGFwcHJvcHJpYXRlIHR5cGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkZXN0cm95U3ViY29udGV4dChTdHJpbmcgbmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIGdldEJvdW5kQ29udGV4dCgpLmRlc3Ryb3lTdWJjb250ZXh0KHBhcnNlTmFtZShuYW1lKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFuZCBiaW5kcyBhIG5ldyBjb250ZXh0LiBDcmVhdGVzIGEgbmV3IGNvbnRleHQgd2l0aCB0aGUgZ2l2ZW4gCisgICAgICogbmFtZSBhbmQgYmluZHMgaXQgaW4gdGhlIHRhcmdldCBjb250ZXh0ICh0aGF0IG5hbWVkIGJ5IGFsbCBidXQgCisgICAgICogdGVybWluYWwgYXRvbWljIGNvbXBvbmVudCBvZiB0aGUgbmFtZSkuIEFsbCBpbnRlcm1lZGlhdGUgY29udGV4dHMgYW5kIAorICAgICAqIHRoZSB0YXJnZXQgY29udGV4dCBtdXN0IGFscmVhZHkgZXhpc3QuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbnRleHQgdG8gY3JlYXRlOyBtYXkgbm90IGJlIGVtcHR5CisgICAgICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCBjb250ZXh0CisgICAgICogQGV4Y2VwdGlvbiBOYW1lQWxyZWFkeUJvdW5kRXhjZXB0aW9uIGlmIG5hbWUgaXMgYWxyZWFkeSBib3VuZAorICAgICAqIEBleGNlcHRpb24gSW52YWxpZEF0dHJpYnV0ZXNFeGNlcHRpb24gaWYgY3JlYXRpb24gb2YgdGhlIHN1YmNvbnRleHQgCisgICAgICogcmVxdWlyZXMgc3BlY2lmaWNhdGlvbiBvZiBtYW5kYXRvcnkgYXR0cmlidXRlcworICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBDb250ZXh0IGNyZWF0ZVN1YmNvbnRleHQoTmFtZSBuYW1lKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGdldEJvdW5kQ29udGV4dCgpLmNyZWF0ZVN1YmNvbnRleHQocGFyc2VOYW1lKG5hbWUpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW5kIGJpbmRzIGEgbmV3IGNvbnRleHQuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbnRleHQgdG8gY3JlYXRlOyBtYXkgbm90IGJlIGVtcHR5CisgICAgICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCBjb250ZXh0CisgICAgICogQGV4Y2VwdGlvbiBOYW1lQWxyZWFkeUJvdW5kRXhjZXB0aW9uIGlmIG5hbWUgaXMgYWxyZWFkeSBib3VuZAorICAgICAqIEBleGNlcHRpb24gSW52YWxpZEF0dHJpYnV0ZXNFeGNlcHRpb24gaWYgY3JlYXRpb24gb2YgdGhlIHN1YmNvbnRleHQgCisgICAgICogcmVxdWlyZXMgc3BlY2lmaWNhdGlvbiBvZiBtYW5kYXRvcnkgYXR0cmlidXRlcworICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBDb250ZXh0IGNyZWF0ZVN1YmNvbnRleHQoU3RyaW5nIG5hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZ2V0Qm91bmRDb250ZXh0KCkuY3JlYXRlU3ViY29udGV4dChwYXJzZU5hbWUobmFtZSkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSBuYW1lZCBvYmplY3QsIGZvbGxvd2luZyBsaW5rcyBleGNlcHQgZm9yIHRoZSB0ZXJtaW5hbCAKKyAgICAgKiBhdG9taWMgY29tcG9uZW50IG9mIHRoZSBuYW1lLiBJZiB0aGUgb2JqZWN0IGJvdW5kIHRvIG5hbWUgaXMgbm90IGEgCisgICAgICogbGluaywgcmV0dXJucyB0aGUgb2JqZWN0IGl0c2VsZi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgb2JqZWN0IHRvIGxvb2sgdXAKKyAgICAgKiBAcmV0dXJuIHRoZSBvYmplY3QgYm91bmQgdG8gbmFtZSwgbm90IGZvbGxvd2luZyB0aGUgdGVybWluYWwgbGluayAKKyAgICAgKiAoaWYgYW55KS4KKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGxvb2t1cExpbmsoTmFtZSBuYW1lKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGdldEJvdW5kQ29udGV4dCgpLmxvb2t1cExpbmsocGFyc2VOYW1lKG5hbWUpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgbmFtZWQgb2JqZWN0LCBmb2xsb3dpbmcgbGlua3MgZXhjZXB0IGZvciB0aGUgdGVybWluYWwgCisgICAgICogYXRvbWljIGNvbXBvbmVudCBvZiB0aGUgbmFtZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgb2JqZWN0IHRvIGxvb2sgdXAKKyAgICAgKiBAcmV0dXJuIHRoZSBvYmplY3QgYm91bmQgdG8gbmFtZSwgbm90IGZvbGxvd2luZyB0aGUgdGVybWluYWwgbGluayAKKyAgICAgKiAoaWYgYW55KS4KKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGxvb2t1cExpbmsoU3RyaW5nIG5hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZ2V0Qm91bmRDb250ZXh0KCkubG9va3VwTGluayhwYXJzZU5hbWUobmFtZSkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSBwYXJzZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBuYW1lZCBjb250ZXh0LiBJbiBhIAorICAgICAqIGZlZGVyYXRpb24gb2YgbmFtZXNwYWNlcywgZGlmZmVyZW50IG5hbWluZyBzeXN0ZW1zIHdpbGwgcGFyc2UgbmFtZXMgCisgICAgICogZGlmZmVyZW50bHkuIFRoaXMgbWV0aG9kIGFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byBnZXQgYSBwYXJzZXIgZm9yIAorICAgICAqIHBhcnNpbmcgbmFtZXMgaW50byB0aGVpciBhdG9taWMgY29tcG9uZW50cyB1c2luZyB0aGUgbmFtaW5nIGNvbnZlbnRpb24gCisgICAgICogb2YgYSBwYXJ0aWN1bGFyIG5hbWluZyBzeXN0ZW0uIFdpdGhpbiBhbnkgc2luZ2xlIG5hbWluZyBzeXN0ZW0sIAorICAgICAqIE5hbWVQYXJzZXIgb2JqZWN0cyByZXR1cm5lZCBieSB0aGlzIG1ldGhvZCBtdXN0IGJlIGVxdWFsICh1c2luZyB0aGUgCisgICAgICogZXF1YWxzKCkgdGVzdCkuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbnRleHQgZnJvbSB3aGljaCB0byBnZXQgdGhlIHBhcnNlcgorICAgICAqIEByZXR1cm4gYSBuYW1lIHBhcnNlciB0aGF0IGNhbiBwYXJzZSBjb21wb3VuZCBuYW1lcyBpbnRvIHRoZWlyIGF0b21pYyAKKyAgICAgKiBjb21wb25lbnRzCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIE5hbWVQYXJzZXIgZ2V0TmFtZVBhcnNlcihOYW1lIG5hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZ2V0Qm91bmRDb250ZXh0KCkuZ2V0TmFtZVBhcnNlcihwYXJzZU5hbWUobmFtZSkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSBwYXJzZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBuYW1lZCBjb250ZXh0LgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBjb250ZXh0IGZyb20gd2hpY2ggdG8gZ2V0IHRoZSBwYXJzZXIKKyAgICAgKiBAcmV0dXJuIGEgbmFtZSBwYXJzZXIgdGhhdCBjYW4gcGFyc2UgY29tcG91bmQgbmFtZXMgaW50byB0aGVpciBhdG9taWMgCisgICAgICogY29tcG9uZW50cworICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBOYW1lUGFyc2VyIGdldE5hbWVQYXJzZXIoU3RyaW5nIG5hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZ2V0Qm91bmRDb250ZXh0KCkuZ2V0TmFtZVBhcnNlcihwYXJzZU5hbWUobmFtZSkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29tcG9zZXMgdGhlIG5hbWUgb2YgdGhpcyBjb250ZXh0IHdpdGggYSBuYW1lIHJlbGF0aXZlIHRvIHRoaXMgY29udGV4dC4KKyAgICAgKiA8cD4KKyAgICAgKiBHaXZlbiBhIG5hbWUgKG5hbWUpIHJlbGF0aXZlIHRvIHRoaXMgY29udGV4dCwgYW5kIHRoZSBuYW1lIChwcmVmaXgpIAorICAgICAqIG9mIHRoaXMgY29udGV4dCByZWxhdGl2ZSB0byBvbmUgb2YgaXRzIGFuY2VzdG9ycywgdGhpcyBtZXRob2QgcmV0dXJucyAKKyAgICAgKiB0aGUgY29tcG9zaXRpb24gb2YgdGhlIHR3byBuYW1lcyB1c2luZyB0aGUgc3ludGF4IGFwcHJvcHJpYXRlIGZvciB0aGUgCisgICAgICogbmFtaW5nIHN5c3RlbShzKSBpbnZvbHZlZC4gVGhhdCBpcywgaWYgbmFtZSBuYW1lcyBhbiBvYmplY3QgcmVsYXRpdmUgCisgICAgICogdG8gdGhpcyBjb250ZXh0LCB0aGUgcmVzdWx0IGlzIHRoZSBuYW1lIG9mIHRoZSBzYW1lIG9iamVjdCwgYnV0IAorICAgICAqIHJlbGF0aXZlIHRvIHRoZSBhbmNlc3RvciBjb250ZXh0LiBOb25lIG9mIHRoZSBuYW1lcyBtYXkgYmUgbnVsbC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSBhIG5hbWUgcmVsYXRpdmUgdG8gdGhpcyBjb250ZXh0CisgICAgICogQHBhcmFtIHByZWZpeCB0aGUgbmFtZSBvZiB0aGlzIGNvbnRleHQgcmVsYXRpdmUgdG8gb25lIG9mIGl0cyBhbmNlc3RvcnMKKyAgICAgKiBAcmV0dXJuIHRoZSBjb21wb3NpdGlvbiBvZiBwcmVmaXggYW5kIG5hbWUKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgTmFtZSBjb21wb3NlTmFtZShOYW1lIG5hbWUsIE5hbWUgcHJlZml4KQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKwlwcmVmaXggPSAoTmFtZSkgbmFtZS5jbG9uZSgpOworCXJldHVybiBwcmVmaXguYWRkQWxsKG5hbWUpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29tcG9zZXMgdGhlIG5hbWUgb2YgdGhpcyBjb250ZXh0IHdpdGggYSBuYW1lIHJlbGF0aXZlIHRvIHRoaXMgY29udGV4dC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSBhIG5hbWUgcmVsYXRpdmUgdG8gdGhpcyBjb250ZXh0CisgICAgICogQHBhcmFtIHByZWZpeCB0aGUgbmFtZSBvZiB0aGlzIGNvbnRleHQgcmVsYXRpdmUgdG8gb25lIG9mIGl0cyBhbmNlc3RvcnMKKyAgICAgKiBAcmV0dXJuIHRoZSBjb21wb3NpdGlvbiBvZiBwcmVmaXggYW5kIG5hbWUKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGNvbXBvc2VOYW1lKFN0cmluZyBuYW1lLCBTdHJpbmcgcHJlZml4KQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHByZWZpeCArICIvIiArIG5hbWU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgbmV3IGVudmlyb25tZW50IHByb3BlcnR5IHRvIHRoZSBlbnZpcm9ubWVudCBvZiB0aGlzIGNvbnRleHQuIElmIAorICAgICAqIHRoZSBwcm9wZXJ0eSBhbHJlYWR5IGV4aXN0cywgaXRzIHZhbHVlIGlzIG92ZXJ3cml0dGVuLgorICAgICAqIAorICAgICAqIEBwYXJhbSBwcm9wTmFtZSB0aGUgbmFtZSBvZiB0aGUgZW52aXJvbm1lbnQgcHJvcGVydHkgdG8gYWRkOyBtYXkgbm90IAorICAgICAqIGJlIG51bGwKKyAgICAgKiBAcGFyYW0gcHJvcFZhbCB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IHRvIGFkZDsgbWF5IG5vdCBiZSBudWxsCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBhZGRUb0Vudmlyb25tZW50KFN0cmluZyBwcm9wTmFtZSwgT2JqZWN0IHByb3BWYWwpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZ2V0Qm91bmRDb250ZXh0KCkuYWRkVG9FbnZpcm9ubWVudChwcm9wTmFtZSwgcHJvcFZhbCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIGFuIGVudmlyb25tZW50IHByb3BlcnR5IGZyb20gdGhlIGVudmlyb25tZW50IG9mIHRoaXMgY29udGV4dC4gCisgICAgICogCisgICAgICogQHBhcmFtIHByb3BOYW1lIHRoZSBuYW1lIG9mIHRoZSBlbnZpcm9ubWVudCBwcm9wZXJ0eSB0byByZW1vdmU7IAorICAgICAqIG1heSBub3QgYmUgbnVsbAorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgcmVtb3ZlRnJvbUVudmlyb25tZW50KFN0cmluZyBwcm9wTmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBnZXRCb3VuZENvbnRleHQoKS5yZW1vdmVGcm9tRW52aXJvbm1lbnQocHJvcE5hbWUpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSBlbnZpcm9ubWVudCBpbiBlZmZlY3QgZm9yIHRoaXMgY29udGV4dC4gU2VlIGNsYXNzIAorICAgICAqIGRlc2NyaXB0aW9uIGZvciBtb3JlIGRldGFpbHMgb24gZW52aXJvbm1lbnQgcHJvcGVydGllcy4gCisgICAgICogVGhlIGNhbGxlciBzaG91bGQgbm90IG1ha2UgYW55IGNoYW5nZXMgdG8gdGhlIG9iamVjdCByZXR1cm5lZDogdGhlaXIgCisgICAgICogZWZmZWN0IG9uIHRoZSBjb250ZXh0IGlzIHVuZGVmaW5lZC4gVGhlIGVudmlyb25tZW50IG9mIHRoaXMgY29udGV4dCAKKyAgICAgKiBtYXkgYmUgY2hhbmdlZCB1c2luZyBhZGRUb0Vudmlyb25tZW50KCkgYW5kIHJlbW92ZUZyb21FbnZpcm9ubWVudCgpLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGVudmlyb25tZW50IG9mIHRoaXMgY29udGV4dDsgbmV2ZXIgbnVsbAorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBIYXNodGFibGUgZ2V0RW52aXJvbm1lbnQoKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGdldEJvdW5kQ29udGV4dCgpLmdldEVudmlyb25tZW50KCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDbG9zZXMgdGhpcyBjb250ZXh0LiBUaGlzIG1ldGhvZCByZWxlYXNlcyB0aGlzIGNvbnRleHQncyByZXNvdXJjZXMgCisgICAgICogaW1tZWRpYXRlbHksIGluc3RlYWQgb2Ygd2FpdGluZyBmb3IgdGhlbSB0byBiZSByZWxlYXNlZCBhdXRvbWF0aWNhbGx5IAorICAgICAqIGJ5IHRoZSBnYXJiYWdlIGNvbGxlY3Rvci4KKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBpZGVtcG90ZW50OiBpbnZva2luZyBpdCBvbiBhIGNvbnRleHQgdGhhdCBoYXMgYWxyZWFkeSAKKyAgICAgKiBiZWVuIGNsb3NlZCBoYXMgbm8gZWZmZWN0LiBJbnZva2luZyBhbnkgb3RoZXIgbWV0aG9kIG9uIGEgY2xvc2VkIAorICAgICAqIGNvbnRleHQgaXMgbm90IGFsbG93ZWQsIGFuZCByZXN1bHRzIGluIHVuZGVmaW5lZCBiZWhhdmlvdXIuCisgICAgICogCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xvc2UoKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgZ2V0Qm91bmRDb250ZXh0KCkuY2xvc2UoKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgZnVsbCBuYW1lIG9mIHRoaXMgY29udGV4dCB3aXRoaW4gaXRzIG93biBuYW1lc3BhY2UuCisgICAgICogPHA+CisgICAgICogTWFueSBuYW1pbmcgc2VydmljZXMgaGF2ZSBhIG5vdGlvbiBvZiBhICJmdWxsIG5hbWUiIGZvciBvYmplY3RzIGluIAorICAgICAqIHRoZWlyIHJlc3BlY3RpdmUgbmFtZXNwYWNlcy4gRm9yIGV4YW1wbGUsIGFuIExEQVAgZW50cnkgaGFzIGEgCisgICAgICogZGlzdGluZ3Vpc2hlZCBuYW1lLCBhbmQgYSBETlMgcmVjb3JkIGhhcyBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lLiBUaGlzIAorICAgICAqIG1ldGhvZCBhbGxvd3MgdGhlIGNsaWVudCBhcHBsaWNhdGlvbiB0byByZXRyaWV2ZSB0aGlzIG5hbWUuIFRoZSBzdHJpbmcgCisgICAgICogcmV0dXJuZWQgYnkgdGhpcyBtZXRob2QgaXMgbm90IGEgSk5ESSBjb21wb3NpdGUgbmFtZSBhbmQgc2hvdWxkIG5vdCBiZSAKKyAgICAgKiBwYXNzZWQgZGlyZWN0bHkgdG8gY29udGV4dCBtZXRob2RzLiBJbiBuYW1pbmcgc3lzdGVtcyBmb3Igd2hpY2ggdGhlIAorICAgICAqIG5vdGlvbiBvZiBmdWxsIG5hbWUgZG9lcyBub3QgbWFrZSBzZW5zZSwgCisgICAgICogT3BlcmF0aW9uTm90U3VwcG9ydGVkRXhjZXB0aW9uIGlzIHRocm93bi4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoaXMgY29udGV4dCdzIG5hbWUgaW4gaXRzIG93biBuYW1lc3BhY2U7IG5ldmVyIG51bGwKKyAgICAgKiBAZXhjZXB0aW9uIE9wZXJhdGlvbk5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBpZiB0aGUgbmFtaW5nIHN5c3RlbSBkb2VzIAorICAgICAqIG5vdCBoYXZlIHRoZSBub3Rpb24gb2YgYSBmdWxsIG5hbWUKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVJbk5hbWVzcGFjZSgpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICByZXR1cm4gcHJlZml4OworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3RlY3RlZCBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgYm91bmQgY29udGV4dC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ29udGV4dCBnZXRCb3VuZENvbnRleHQoKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAoaW5pdGlhbENvbnRleHQpIHsKKyAgICAgICAgICAgIFN0cmluZyBJQ05hbWUgPSBJQ19QUkVGSVg7CisgICAgICAgICAgICBpZiAoQ29udGV4dEJpbmRpbmdzLmlzVGhyZWFkQm91bmQoKSkgeworICAgICAgICAgICAgICAgIElDTmFtZSArPSBDb250ZXh0QmluZGluZ3MuZ2V0VGhyZWFkTmFtZSgpOworICAgICAgICAgICAgfSBlbHNlIGlmIChDb250ZXh0QmluZGluZ3MuaXNDbGFzc0xvYWRlckJvdW5kKCkpIHsKKyAgICAgICAgICAgICAgICBJQ05hbWUgKz0gQ29udGV4dEJpbmRpbmdzLmdldENsYXNzTG9hZGVyTmFtZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29udGV4dCBpbml0aWFsQ29udGV4dCA9IENvbnRleHRCaW5kaW5ncy5nZXRDb250ZXh0KElDTmFtZSk7CisgICAgICAgICAgICBpZiAoaW5pdGlhbENvbnRleHQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIEFsbG9jYXRpbmcgYSBuZXcgY29udGV4dCBhbmQgYmluZGluZyBpdCB0byB0aGUgYXBwcm9wcmlhdGUgCisgICAgICAgICAgICAgICAgLy8gbmFtZQorICAgICAgICAgICAgICAgIGluaXRpYWxDb250ZXh0ID0gbmV3IE5hbWluZ0NvbnRleHQoZW52LCBJQ05hbWUpOworICAgICAgICAgICAgICAgIENvbnRleHRCaW5kaW5ncy5iaW5kQ29udGV4dChJQ05hbWUsIGluaXRpYWxDb250ZXh0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBpbml0aWFsQ29udGV4dDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChDb250ZXh0QmluZGluZ3MuaXNUaHJlYWRCb3VuZCgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIENvbnRleHRCaW5kaW5ncy5nZXRUaHJlYWQoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIENvbnRleHRCaW5kaW5ncy5nZXRDbGFzc0xvYWRlcigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFN0cmlwcyB0aGUgVVJMIGhlYWRlci4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBwYXJzZWQgbmFtZQorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIHRoZXJlIGlzIG5vICJqYXZhOiIgaGVhZGVyIG9yIGlmIG5vIAorICAgICAqIG5hbWluZyBjb250ZXh0IGhhcyBiZWVuIGJvdW5kIHRvIHRoaXMgdGhyZWFkCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBwYXJzZU5hbWUoU3RyaW5nIG5hbWUpIAorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgCisJaWYgKCghaW5pdGlhbENvbnRleHQpICYmIChuYW1lLnN0YXJ0c1dpdGgocHJlZml4KSkpIHsKKyAgICAgICAgICAgIHJldHVybiAobmFtZS5zdWJzdHJpbmcocHJlZml4TGVuZ3RoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoaW5pdGlhbENvbnRleHQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKG5hbWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTmFtaW5nRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInNlbGVjdG9yQ29udGV4dC5ub0phdmFVcmwiKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTdHJpcHMgdGhlIFVSTCBoZWFkZXIuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgcGFyc2VkIG5hbWUKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiB0aGVyZSBpcyBubyAiamF2YToiIGhlYWRlciBvciBpZiBubyAKKyAgICAgKiBuYW1pbmcgY29udGV4dCBoYXMgYmVlbiBib3VuZCB0byB0aGlzIHRocmVhZAorICAgICAqLworICAgIHByb3RlY3RlZCBOYW1lIHBhcnNlTmFtZShOYW1lIG5hbWUpIAorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKworCWlmICgoIWluaXRpYWxDb250ZXh0KSAmJiAoIW5hbWUuaXNFbXB0eSgpKSAKKyAgICAgICAgICAgICYmIChuYW1lLmdldCgwKS5lcXVhbHMocHJlZml4KSkpIHsKKyAgICAgICAgICAgIHJldHVybiAobmFtZS5nZXRTdWZmaXgoMSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGluaXRpYWxDb250ZXh0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChuYW1lKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5hbWluZ0V4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJzZWxlY3RvckNvbnRleHQubm9KYXZhVXJsIikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKworfQorCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL1N0cmluZ01hbmFnZXIuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvU3RyaW5nTWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZGEwYjMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL1N0cmluZ01hbmFnZXIuamF2YQpAQCAtMCwwICsxLDIxNyBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLyAKKworCitwYWNrYWdlIG9yZy5hcGFjaGUubmFtaW5nOworCitpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKKworLyoqCisgKiBBbiBpbnRlcm5hdGlvbmFsaXphdGlvbiAvIGxvY2FsaXphdGlvbiBoZWxwZXIgY2xhc3Mgd2hpY2ggcmVkdWNlcworICogdGhlIGJvdGhlciBvZiBoYW5kbGluZyBSZXNvdXJjZUJ1bmRsZXMgYW5kIHRha2VzIGNhcmUgb2YgdGhlCisgKiBjb21tb24gY2FzZXMgb2YgbWVzc2FnZSBmb3JtYXRpbmcgd2hpY2ggb3RoZXJ3aXNlIHJlcXVpcmUgdGhlCisgKiBjcmVhdGlvbiBvZiBPYmplY3QgYXJyYXlzIGFuZCBzdWNoLgorICoKKyAqIDxwPlRoZSBTdHJpbmdNYW5hZ2VyIG9wZXJhdGVzIG9uIGEgcGFja2FnZSBiYXNpcy4gT25lIFN0cmluZ01hbmFnZXIKKyAqIHBlciBwYWNrYWdlIGNhbiBiZSBjcmVhdGVkIGFuZCBhY2Nlc3NlZCB2aWEgdGhlIGdldE1hbmFnZXIgbWV0aG9kCisgKiBjYWxsLgorICoKKyAqIDxwPlRoZSBTdHJpbmdNYW5hZ2VyIHdpbGwgbG9vayBmb3IgYSBSZXNvdXJjZUJ1bmRsZSBuYW1lZCBieQorICogdGhlIHBhY2thZ2UgbmFtZSBnaXZlbiBwbHVzIHRoZSBzdWZmaXggb2YgIkxvY2FsU3RyaW5ncyIuIEluCisgKiBwcmFjdGljZSwgdGhpcyBtZWFucyB0aGF0IHRoZSBsb2NhbGl6ZWQgaW5mb3JtYXRpb24gd2lsbCBiZSBjb250YWluZWQKKyAqIGluIGEgTG9jYWxTdHJpbmdzLnByb3BlcnRpZXMgZmlsZSBsb2NhdGVkIGluIHRoZSBwYWNrYWdlCisgKiBkaXJlY3Rvcnkgb2YgdGhlIGNsYXNzcGF0aC4KKyAqCisgKiA8cD5QbGVhc2Ugc2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGUgZm9yCisgKiBtb3JlIGluZm9ybWF0aW9uLgorICoKKyAqIEBhdXRob3IgSmFtZXMgRHVuY2FuIERhdmlkc29uIFtkdW5jYW5AZW5nLnN1bi5jb21dCisgKiBAYXV0aG9yIEphbWVzIFRvZGQgW2dvbnpvQGVuZy5zdW4uY29tXQorICovCisKK3B1YmxpYyBjbGFzcyBTdHJpbmdNYW5hZ2VyIHsKKworICAgIC8qKgorICAgICAqIFRoZSBSZXNvdXJjZUJ1bmRsZSBmb3IgdGhpcyBTdHJpbmdNYW5hZ2VyLgorICAgICAqLworICAgIAorICAgIHByaXZhdGUgUmVzb3VyY2VCdW5kbGUgYnVuZGxlOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBTdHJpbmdNYW5hZ2VyIGZvciBhIGdpdmVuIHBhY2thZ2UuIFRoaXMgaXMgYQorICAgICAqIHByaXZhdGUgbWV0aG9kIGFuZCBhbGwgYWNjZXNzIHRvIGl0IGlzIGFyYml0cmF0ZWQgYnkgdGhlCisgICAgICogc3RhdGljIGdldE1hbmFnZXIgbWV0aG9kIGNhbGwgc28gdGhhdCBvbmx5IG9uZSBTdHJpbmdNYW5hZ2VyCisgICAgICogcGVyIHBhY2thZ2Ugd2lsbCBiZSBjcmVhdGVkLgorICAgICAqCisgICAgICogQHBhcmFtIHBhY2thZ2VOYW1lIE5hbWUgb2YgcGFja2FnZSB0byBjcmVhdGUgU3RyaW5nTWFuYWdlciBmb3IuCisgICAgICovCisKKyAgICBwcml2YXRlIFN0cmluZ01hbmFnZXIoU3RyaW5nIHBhY2thZ2VOYW1lKSB7CisJU3RyaW5nIGJ1bmRsZU5hbWUgPSBwYWNrYWdlTmFtZSArICIuTG9jYWxTdHJpbmdzIjsKKwlidW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoYnVuZGxlTmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGEgc3RyaW5nIGZyb20gdGhlIHVuZGVybHlpbmcgcmVzb3VyY2UgYnVuZGxlLgorICAgICAqCisgICAgICogQHBhcmFtIGtleSAKKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7CisgICAgICAgIGlmIChrZXkgPT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJrZXkgaXMgbnVsbCI7CisKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbihtc2cpOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIHN0ciA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKwkgICAgc3RyID0gYnVuZGxlLmdldFN0cmluZyhrZXkpOworICAgICAgICB9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gbXJlKSB7CisgICAgICAgICAgICBzdHIgPSAiQ2Fubm90IGZpbmQgbWVzc2FnZSBhc3NvY2lhdGVkIHdpdGgga2V5ICciICsga2V5ICsgIiciOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHN0cjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSBzdHJpbmcgZnJvbSB0aGUgdW5kZXJseWluZyByZXNvdXJjZSBidW5kbGUgYW5kIGZvcm1hdAorICAgICAqIGl0IHdpdGggdGhlIGdpdmVuIHNldCBvZiBhcmd1bWVudHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5CisgICAgICogQHBhcmFtIGFyZ3MKKyAgICAgKi8KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MpIHsKKwlTdHJpbmcgaVN0cmluZyA9IG51bGw7CisgICAgICAgIFN0cmluZyB2YWx1ZSA9IGdldFN0cmluZyhrZXkpOworCisJLy8gdGhpcyBjaGVjayBmb3IgdGhlIHJ1bnRpbWUgZXhjZXB0aW9uIGlzIHNvbWUgcHJlIDEuMS42CisJLy8gVk0ncyBkb24ndCBkbyBhbiBhdXRvbWF0aWMgdG9TdHJpbmcoKSBvbiB0aGUgcGFzc2VkIGluCisJLy8gb2JqZWN0cyBhbmQgYmFyZiBvdXQKKwkKKwl0cnkgeworICAgICAgICAgICAgLy8gZW5zdXJlIHRoZSBhcmd1bWVudHMgYXJlIG5vdCBudWxsIHNvIHByZSAxLjIgVk0ncyBkb24ndCBiYXJmCisgICAgICAgICAgICBPYmplY3Qgbm9uTnVsbEFyZ3NbXSA9IGFyZ3M7CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8YXJncy5sZW5ndGg7IGkrKykgeworCQlpZiAoYXJnc1tpXSA9PSBudWxsKSB7CisJCSAgICBpZiAobm9uTnVsbEFyZ3M9PWFyZ3MpIG5vbk51bGxBcmdzPShPYmplY3RbXSlhcmdzLmNsb25lKCk7CisJCSAgICBub25OdWxsQXJnc1tpXSA9ICJudWxsIjsKKwkJfQorCSAgICB9CisgCisgICAgICAgICAgICBpU3RyaW5nID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQodmFsdWUsIG5vbk51bGxBcmdzKTsKKwl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWFlKSB7CisJICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJICAgIGJ1Zi5hcHBlbmQodmFsdWUpOworCSAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKKwkJYnVmLmFwcGVuZCgiIGFyZ1siICsgaSArICJdPSIgKyBhcmdzW2ldKTsKKwkgICAgfQorCSAgICBpU3RyaW5nID0gYnVmLnRvU3RyaW5nKCk7CisJfQorCXJldHVybiBpU3RyaW5nOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhIHN0cmluZyBmcm9tIHRoZSB1bmRlcmx5aW5nIHJlc291cmNlIGJ1bmRsZSBhbmQgZm9ybWF0IGl0CisgICAgICogd2l0aCB0aGUgZ2l2ZW4gb2JqZWN0IGFyZ3VtZW50LiBUaGlzIGFyZ3VtZW50IGNhbiBvZiBjb3Vyc2UgYmUKKyAgICAgKiBhIFN0cmluZyBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5CisgICAgICogQHBhcmFtIGFyZworICAgICAqLworCisgICAgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0IGFyZykgeworCU9iamVjdFtdIGFyZ3MgPSBuZXcgT2JqZWN0W10ge2FyZ307CisJcmV0dXJuIGdldFN0cmluZyhrZXksIGFyZ3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhIHN0cmluZyBmcm9tIHRoZSB1bmRlcmx5aW5nIHJlc291cmNlIGJ1bmRsZSBhbmQgZm9ybWF0IGl0CisgICAgICogd2l0aCB0aGUgZ2l2ZW4gb2JqZWN0IGFyZ3VtZW50cy4gVGhlc2UgYXJndW1lbnRzIGNhbiBvZiBjb3Vyc2UKKyAgICAgKiBiZSBTdHJpbmcgb2JqZWN0cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBrZXkKKyAgICAgKiBAcGFyYW0gYXJnMQorICAgICAqIEBwYXJhbSBhcmcyCisgICAgICovCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3QgYXJnMSwgT2JqZWN0IGFyZzIpIHsKKwlPYmplY3RbXSBhcmdzID0gbmV3IE9iamVjdFtdIHthcmcxLCBhcmcyfTsKKwlyZXR1cm4gZ2V0U3RyaW5nKGtleSwgYXJncyk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEdldCBhIHN0cmluZyBmcm9tIHRoZSB1bmRlcmx5aW5nIHJlc291cmNlIGJ1bmRsZSBhbmQgZm9ybWF0IGl0CisgICAgICogd2l0aCB0aGUgZ2l2ZW4gb2JqZWN0IGFyZ3VtZW50cy4gVGhlc2UgYXJndW1lbnRzIGNhbiBvZiBjb3Vyc2UKKyAgICAgKiBiZSBTdHJpbmcgb2JqZWN0cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBrZXkKKyAgICAgKiBAcGFyYW0gYXJnMQorICAgICAqIEBwYXJhbSBhcmcyCisgICAgICogQHBhcmFtIGFyZzMKKyAgICAgKi8KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdCBhcmcxLCBPYmplY3QgYXJnMiwKKwkJCSAgICBPYmplY3QgYXJnMykgeworCU9iamVjdFtdIGFyZ3MgPSBuZXcgT2JqZWN0W10ge2FyZzEsIGFyZzIsIGFyZzN9OworCXJldHVybiBnZXRTdHJpbmcoa2V5LCBhcmdzKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogR2V0IGEgc3RyaW5nIGZyb20gdGhlIHVuZGVybHlpbmcgcmVzb3VyY2UgYnVuZGxlIGFuZCBmb3JtYXQgaXQKKyAgICAgKiB3aXRoIHRoZSBnaXZlbiBvYmplY3QgYXJndW1lbnRzLiBUaGVzZSBhcmd1bWVudHMgY2FuIG9mIGNvdXJzZQorICAgICAqIGJlIFN0cmluZyBvYmplY3RzLgorICAgICAqCisgICAgICogQHBhcmFtIGtleQorICAgICAqIEBwYXJhbSBhcmcxCisgICAgICogQHBhcmFtIGFyZzIKKyAgICAgKiBAcGFyYW0gYXJnMworICAgICAqIEBwYXJhbSBhcmc0CisgICAgICovCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3QgYXJnMSwgT2JqZWN0IGFyZzIsCisJCQkgICAgT2JqZWN0IGFyZzMsIE9iamVjdCBhcmc0KSB7CisJT2JqZWN0W10gYXJncyA9IG5ldyBPYmplY3RbXSB7YXJnMSwgYXJnMiwgYXJnMywgYXJnNH07CisJcmV0dXJuIGdldFN0cmluZyhrZXksIGFyZ3MpOworICAgIH0gICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIFNUQVRJQyBTVVBQT1JUIE1FVEhPRFMKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgcHJpdmF0ZSBzdGF0aWMgSGFzaHRhYmxlIG1hbmFnZXJzID0gbmV3IEhhc2h0YWJsZSgpOworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBTdHJpbmdNYW5hZ2VyIGZvciBhIHBhcnRpY3VsYXIgcGFja2FnZS4gSWYgYSBtYW5hZ2VyIGZvcgorICAgICAqIGEgcGFja2FnZSBhbHJlYWR5IGV4aXN0cywgaXQgd2lsbCBiZSByZXVzZWQsIGVsc2UgYSBuZXcKKyAgICAgKiBTdHJpbmdNYW5hZ2VyIHdpbGwgYmUgY3JlYXRlZCBhbmQgcmV0dXJuZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFja2FnZU5hbWUKKyAgICAgKi8KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIFN0cmluZ01hbmFnZXIgZ2V0TWFuYWdlcihTdHJpbmcgcGFja2FnZU5hbWUpIHsKKwlTdHJpbmdNYW5hZ2VyIG1nciA9IChTdHJpbmdNYW5hZ2VyKW1hbmFnZXJzLmdldChwYWNrYWdlTmFtZSk7CisJaWYgKG1nciA9PSBudWxsKSB7CisJICAgIG1nciA9IG5ldyBTdHJpbmdNYW5hZ2VyKHBhY2thZ2VOYW1lKTsKKwkgICAgbWFuYWdlcnMucHV0KHBhY2thZ2VOYW1lLCBtZ3IpOworCX0KKwlyZXR1cm4gbWdyOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvVHJhbnNhY3Rpb25SZWYuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvVHJhbnNhY3Rpb25SZWYuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjFjMTBlCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9UcmFuc2FjdGlvblJlZi5qYXZhCkBAIC0wLDAgKzEsOTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8gCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm5hbWluZzsKKworaW1wb3J0IGphdmF4Lm5hbWluZy5Db250ZXh0OworaW1wb3J0IGphdmF4Lm5hbWluZy5SZWZlcmVuY2U7CisKKy8qKgorICogUmVwcmVzZW50cyBhIHJlZmVyZW5jZSBhZGRyZXNzIHRvIGEgdHJhbnNhY3Rpb24uCisgKgorICogQGF1dGhvciBSZW15IE1hdWNoZXJhdAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgVHJhbnNhY3Rpb25SZWYKKyAgICBleHRlbmRzIFJlZmVyZW5jZSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0YW50cworCisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGZhY3RvcnkgZm9yIHRoaXMgcmVmZXJlbmNlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRkFDVE9SWSA9IAorICAgICAgICBvcmcuYXBhY2hlLm5hbWluZy5mYWN0b3J5LkNvbnN0YW50cy5ERUZBVUxUX1RSQU5TQUNUSU9OX0ZBQ1RPUlk7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvKioKKyAgICAgKiBSZXNvdXJjZSBSZWZlcmVuY2UuCisgICAgICovCisgICAgcHVibGljIFRyYW5zYWN0aW9uUmVmKCkgeworICAgICAgICB0aGlzKG51bGwsIG51bGwpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVzb3VyY2UgUmVmZXJlbmNlLgorICAgICAqCisgICAgICogQHBhcmFtIGZhY3RvcnkgVGhlIGZhY3RvcnkgY2xhc3MKKyAgICAgKiBAcGFyYW0gZmFjdG9yeUxvY2F0aW9uIFRoZSBmYWN0b3J5IGxvY2F0aW9uCisgICAgICovCisgICAgcHVibGljIFRyYW5zYWN0aW9uUmVmKFN0cmluZyBmYWN0b3J5LCBTdHJpbmcgZmFjdG9yeUxvY2F0aW9uKSB7CisgICAgICAgIHN1cGVyKCJqYXZheC50cmFuc2FjdGlvbi5Vc2VyVHJhbnNhY3Rpb24iLCBmYWN0b3J5LCBmYWN0b3J5TG9jYXRpb24pOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBSZWZlcmVuY2UgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIGNsYXNzIG5hbWUgb2YgdGhlIGZhY3Rvcnkgb2YgdGhlIG9iamVjdCB0byB3aGljaCB0aGlzIAorICAgICAqIHJlZmVyZW5jZSByZWZlcnMuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRGYWN0b3J5Q2xhc3NOYW1lKCkgeworICAgICAgICBTdHJpbmcgZmFjdG9yeSA9IHN1cGVyLmdldEZhY3RvcnlDbGFzc05hbWUoKTsKKyAgICAgICAgaWYgKGZhY3RvcnkgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhY3Rvcnk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmYWN0b3J5ID0gU3lzdGVtLmdldFByb3BlcnR5KENvbnRleHQuT0JKRUNUX0ZBQ1RPUklFUyk7CisgICAgICAgICAgICBpZiAoZmFjdG9yeSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBERUZBVUxUX0ZBQ1RPUlk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvZmFjdG9yeS9CZWFuRmFjdG9yeS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9mYWN0b3J5L0JlYW5GYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU5MzhlMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvZmFjdG9yeS9CZWFuRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMjQ1IEBACisvKgorICogQ29weXJpZ2h0IDE5OTktMjAwMSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLm5hbWluZy5mYWN0b3J5OworCitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWU7CitpbXBvcnQgamF2YXgubmFtaW5nLkNvbnRleHQ7CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuUmVmZXJlbmNlOworaW1wb3J0IGphdmF4Lm5hbWluZy5SZWZBZGRyOworaW1wb3J0IGphdmF4Lm5hbWluZy5zcGkuT2JqZWN0RmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm5hbWluZy5SZXNvdXJjZVJlZjsKKworaW1wb3J0IGphdmEuYmVhbnMuSW50cm9zcGVjdG9yOworaW1wb3J0IGphdmEuYmVhbnMuQmVhbkluZm87CitpbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eURlc2NyaXB0b3I7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CisKKy8qKgorICogT2JqZWN0IGZhY3RvcnkgZm9yIGFueSBSZXNvdXJjZSBjb25mb3JtaW5nIHRvIHRoZSBKYXZhQmVhbiBzcGVjLgorICogCisgKiA8cD5UaGlzIGZhY3RvcnkgY2FuIGJlIGNvbmZpZ3VyZWQgaW4gYSA8Y29kZT4mbHQ7RGVmYXVsdENvbnRleHQmZ3Q7PC9jb2RlPgorICogb3IgPGNvZGU+Jmx0O0NvbnRleHQmZ3Q7PC9jb2RlPiBlbGVtZW50IGluIHlvdXIgPGNvZGU+Y29uZi9zZXJ2ZXIueG1sPC9jb2RlPgorICogY29uZmlndXJhdGlvbiBmaWxlLiAgQW4gZXhhbXBsZSBvZiBmYWN0b3J5IGNvbmZpZ3VyYXRpb24gaXM6PC9wPgorICogPHByZT4KKyAqICZsdDtSZXNvdXJjZSBuYW1lPSJqZGJjL215RGF0YVNvdXJjZSIgYXV0aD0iU0VSVkxFVCIKKyAqICAgdHlwZT0ib3JhY2xlLmpkYmMucG9vbC5PcmFjbGVDb25uZWN0aW9uQ2FjaGVJbXBsIi8mZ3Q7CisgKiAmbHQ7UmVzb3VyY2VQYXJhbXMgbmFtZT0iamRiYy9teURhdGFTb3VyY2UiJmd0OworICogICAmbHQ7cGFyYW1ldGVyJmd0OworICogICAgICZsdDtuYW1lJmd0O2ZhY3RvcnkmbHQ7L25hbWUmZ3Q7CisgKiAgICAgJmx0O3ZhbHVlJmd0O29yZy5hcGFjaGUubmFtaW5nLmZhY3RvcnkuQmVhbkZhY3RvcnkmbHQ7L3ZhbHVlJmd0OworICogICAmbHQ7L3BhcmFtZXRlciZndDsKKyAqICAgJmx0O3BhcmFtZXRlciZndDsKKyAqICAgICAmbHQ7bmFtZSZndDtkcml2ZXJUeXBlJmx0Oy9uYW1lJmd0OworICogICAgICZsdDt2YWx1ZSZndDt0aGluJmx0Oy92YWx1ZSZndDsKKyAqICAgJmx0Oy9wYXJhbWV0ZXImZ3Q7CisgKiAgICZsdDtwYXJhbWV0ZXImZ3Q7CisgKiAgICAgJmx0O25hbWUmZ3Q7c2VydmVyTmFtZSZsdDsvbmFtZSZndDsKKyAqICAgICAmbHQ7dmFsdWUmZ3Q7aHVlJmx0Oy92YWx1ZSZndDsKKyAqICAgJmx0Oy9wYXJhbWV0ZXImZ3Q7CisgKiAgICZsdDtwYXJhbWV0ZXImZ3Q7CisgKiAgICAgJmx0O25hbWUmZ3Q7bmV0d29ya1Byb3RvY29sJmx0Oy9uYW1lJmd0OworICogICAgICZsdDt2YWx1ZSZndDt0Y3AmbHQ7L3ZhbHVlJmd0OworICogICAmbHQ7L3BhcmFtZXRlciZndDsgCisgKiAgICZsdDtwYXJhbWV0ZXImZ3Q7CisgKiAgICAgJmx0O25hbWUmZ3Q7ZGF0YWJhc2VOYW1lJmx0Oy9uYW1lJmd0OworICogICAgICZsdDt2YWx1ZSZndDtYWFhYJmx0Oy92YWx1ZSZndDsKKyAqICAgJmx0Oy9wYXJhbWV0ZXImZ3Q7CisgKiAgICZsdDtwYXJhbWV0ZXImZ3Q7CisgKiAgICAgJmx0O25hbWUmZ3Q7cG9ydE51bWJlciZsdDsvbmFtZSZndDsKKyAqICAgICAmbHQ7dmFsdWUmZ3Q7Tk5OTiZsdDsvdmFsdWUmZ3Q7CisgKiAgICZsdDsvcGFyYW1ldGVyJmd0OworICogICAmbHQ7cGFyYW1ldGVyJmd0OworICogICAgICZsdDtuYW1lJmd0O3VzZXImbHQ7L25hbWUmZ3Q7CisgKiAgICAgJmx0O3ZhbHVlJmd0O1hYWFgmbHQ7L3ZhbHVlJmd0OworICogICAmbHQ7L3BhcmFtZXRlciZndDsKKyAqICAgJmx0O3BhcmFtZXRlciZndDsKKyAqICAgICAmbHQ7bmFtZSZndDtwYXNzd29yZCZsdDsvbmFtZSZndDsKKyAqICAgICAmbHQ7dmFsdWUmZ3Q7WFhYWCZsdDsvdmFsdWUmZ3Q7CisgKiAgICZsdDsvcGFyYW1ldGVyJmd0OworICogICAmbHQ7cGFyYW1ldGVyJmd0OworICogICAgICZsdDtuYW1lJmd0O21heExpbWl0Jmx0Oy9uYW1lJmd0OworICogICAgICZsdDt2YWx1ZSZndDs1Jmx0Oy92YWx1ZSZndDsKKyAqICAgJmx0Oy9wYXJhbWV0ZXImZ3Q7CisgKiAmbHQ7L1Jlc291cmNlUGFyYW1zJmd0OworICogPC9wcmU+CisgKgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86YW5lciBhdCBuY3N0ZWNoLmNvbSI+QW5lciBQZXJlejwvYT4KKyAqLworcHVibGljIGNsYXNzIEJlYW5GYWN0b3J5CisgICAgaW1wbGVtZW50cyBPYmplY3RGYWN0b3J5IHsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdGFudHMKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBPYmplY3RGYWN0b3J5IE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IEJlYW4gaW5zdGFuY2UuCisgICAgICogCisgICAgICogQHBhcmFtIG9iaiBUaGUgcmVmZXJlbmNlIG9iamVjdCBkZXNjcmliaW5nIHRoZSBCZWFuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRPYmplY3RJbnN0YW5jZShPYmplY3Qgb2JqLCBOYW1lIG5hbWUsIENvbnRleHQgbmFtZUN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhc2h0YWJsZSBlbnZpcm9ubWVudCkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFJlc291cmNlUmVmKSB7CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgUmVmZXJlbmNlIHJlZiA9IChSZWZlcmVuY2UpIG9iajsKKyAgICAgICAgICAgICAgICBTdHJpbmcgYmVhbkNsYXNzTmFtZSA9IHJlZi5nZXRDbGFzc05hbWUoKTsKKyAgICAgICAgICAgICAgICBDbGFzcyBiZWFuQ2xhc3MgPSBudWxsOworICAgICAgICAgICAgICAgIENsYXNzTG9hZGVyIHRjbCA9IAorICAgICAgICAgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOworICAgICAgICAgICAgICAgIGlmICh0Y2wgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgYmVhbkNsYXNzID0gdGNsLmxvYWRDbGFzcyhiZWFuQ2xhc3NOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBiZWFuQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKGJlYW5DbGFzc05hbWUpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoYmVhbkNsYXNzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5hbWluZ0V4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgKCJDbGFzcyBub3QgZm91bmQ6ICIgKyBiZWFuQ2xhc3NOYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgQmVhbkluZm8gYmkgPSBJbnRyb3NwZWN0b3IuZ2V0QmVhbkluZm8oYmVhbkNsYXNzKTsKKyAgICAgICAgICAgICAgICBQcm9wZXJ0eURlc2NyaXB0b3JbXSBwZGEgPSBiaS5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgT2JqZWN0IGJlYW4gPSBiZWFuQ2xhc3MubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBFbnVtZXJhdGlvbiBlID0gcmVmLmdldEFsbCgpOworICAgICAgICAgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBSZWZBZGRyIHJhID0gKFJlZkFkZHIpIGUubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByb3BOYW1lID0gcmEuZ2V0VHlwZSgpOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BOYW1lLmVxdWFscyhDb25zdGFudHMuRkFDVE9SWSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3BOYW1lLmVxdWFscygic2NvcGUiKSB8fCBwcm9wTmFtZS5lcXVhbHMoImF1dGgiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IChTdHJpbmcpcmEuZ2V0Q29udGVudCgpOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgT2JqZWN0W10gdmFsdWVBcnJheSA9IG5ldyBPYmplY3RbMV07CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGk8cGRhLmxlbmd0aDsgaSsrKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwZGFbaV0uZ2V0TmFtZSgpLmVxdWFscyhwcm9wTmFtZSkpIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzIHByb3BUeXBlID0gcGRhW2ldLmdldFByb3BlcnR5VHlwZSgpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BUeXBlLmVxdWFscyhTdHJpbmcuY2xhc3MpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlQXJyYXlbMF0gPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BUeXBlLmVxdWFscyhDaGFyYWN0ZXIuY2xhc3MpIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgcHJvcFR5cGUuZXF1YWxzKGNoYXIuY2xhc3MpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlQXJyYXlbMF0gPSBuZXcgQ2hhcmFjdGVyKHZhbHVlLmNoYXJBdCgwKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9wVHlwZS5lcXVhbHMoQnl0ZS5jbGFzcykgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBwcm9wVHlwZS5lcXVhbHMoYnl0ZS5jbGFzcykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVBcnJheVswXSA9IG5ldyBCeXRlKHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BUeXBlLmVxdWFscyhTaG9ydC5jbGFzcykgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBwcm9wVHlwZS5lcXVhbHMoc2hvcnQuY2xhc3MpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlQXJyYXlbMF0gPSBuZXcgU2hvcnQodmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcFR5cGUuZXF1YWxzKEludGVnZXIuY2xhc3MpIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgcHJvcFR5cGUuZXF1YWxzKGludC5jbGFzcykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVBcnJheVswXSA9IG5ldyBJbnRlZ2VyKHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BUeXBlLmVxdWFscyhMb25nLmNsYXNzKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHByb3BUeXBlLmVxdWFscyhsb25nLmNsYXNzKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUFycmF5WzBdID0gbmV3IExvbmcodmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcFR5cGUuZXF1YWxzKEZsb2F0LmNsYXNzKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHByb3BUeXBlLmVxdWFscyhmbG9hdC5jbGFzcykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVBcnJheVswXSA9IG5ldyBGbG9hdCh2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9wVHlwZS5lcXVhbHMoRG91YmxlLmNsYXNzKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHByb3BUeXBlLmVxdWFscyhkb3VibGUuY2xhc3MpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlQXJyYXlbMF0gPSBuZXcgRG91YmxlKHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BUeXBlLmVxdWFscyhCb29sZWFuLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgcHJvcFR5cGUuZXF1YWxzKGJvb2xlYW4uY2xhc3MpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlQXJyYXlbMF0gPSBuZXcgQm9vbGVhbih2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5hbWluZ0V4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJTdHJpbmcgY29udmVyc2lvbiBmb3IgcHJvcGVydHkgdHlwZSAnIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcHJvcFR5cGUuZ2V0TmFtZSgpICsgIicgbm90IGF2YWlsYWJsZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRob2Qgc2V0UHJvcCA9IHBkYVtpXS5nZXRXcml0ZU1ldGhvZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXRQcm9wICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0UHJvcC5pbnZva2UoYmVhbiwgdmFsdWVBcnJheSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5hbWluZ0V4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJXcml0ZSBub3QgYWxsb3dlZCBmb3IgcHJvcGVydHk6ICIgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwcm9wTmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT0gcGRhLmxlbmd0aCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5hbWluZ0V4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiTm8gc2V0IG1ldGhvZCBmb3VuZCBmb3IgcHJvcGVydHk6ICIgKyBwcm9wTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBiZWFuOworCisgICAgICAgICAgICB9IGNhdGNoIChqYXZhLmJlYW5zLkludHJvc3BlY3Rpb25FeGNlcHRpb24gaWUpIHsKKyAgICAgICAgICAgICAgICBOYW1pbmdFeGNlcHRpb24gbmUgPSBuZXcgTmFtaW5nRXhjZXB0aW9uKGllLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAgICAgbmUuc2V0Um9vdENhdXNlKGllKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKGphdmEubGFuZy5JbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGlhZSkgeworICAgICAgICAgICAgICAgIE5hbWluZ0V4Y2VwdGlvbiBuZSA9IG5ldyBOYW1pbmdFeGNlcHRpb24oaWFlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAgICAgbmUuc2V0Um9vdENhdXNlKGlhZSk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmU7CisgICAgICAgICAgICB9IGNhdGNoIChqYXZhLmxhbmcuSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBpZTIpIHsKKyAgICAgICAgICAgICAgICBOYW1pbmdFeGNlcHRpb24gbmUgPSBuZXcgTmFtaW5nRXhjZXB0aW9uKGllMi5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgIG5lLnNldFJvb3RDYXVzZShpZTIpOworICAgICAgICAgICAgICAgIHRocm93IG5lOworICAgICAgICAgICAgfSBjYXRjaCAoamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBpdGUpIHsKKyAgICAgICAgICAgICAgICBOYW1pbmdFeGNlcHRpb24gbmUgPSBuZXcgTmFtaW5nRXhjZXB0aW9uKGl0ZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgIG5lLnNldFJvb3RDYXVzZShpdGUpOworICAgICAgICAgICAgICAgIHRocm93IG5lOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9mYWN0b3J5L0NvbnN0YW50cy5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9mYWN0b3J5L0NvbnN0YW50cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjZWViMGMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL2ZhY3RvcnkvQ29uc3RhbnRzLmphdmEKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLyAKKworCitwYWNrYWdlIG9yZy5hcGFjaGUubmFtaW5nLmZhY3Rvcnk7CisKKworLyoqCisgKiBTdGF0aWMgY29uc3RhbnRzIGZvciB0aGlzIHBhY2thZ2UuCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIENvbnN0YW50cyB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQYWNrYWdlID0gIm9yZy5hcGFjaGUubmFtaW5nLmZhY3RvcnkiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9SRVNPVVJDRV9GQUNUT1JZID0gCisgICAgICAgIFBhY2thZ2UgKyAiLlJlc291cmNlRmFjdG9yeSI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1JFU09VUkNFX0xJTktfRkFDVE9SWSA9IAorICAgICAgICBQYWNrYWdlICsgIi5SZXNvdXJjZUxpbmtGYWN0b3J5IjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfVFJBTlNBQ1RJT05fRkFDVE9SWSA9IAorICAgICAgICBQYWNrYWdlICsgIi5UcmFuc2FjdGlvbkZhY3RvcnkiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9SRVNPVVJDRV9FTlZfRkFDVE9SWSA9IAorICAgICAgICBQYWNrYWdlICsgIi5SZXNvdXJjZUVudkZhY3RvcnkiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9FSkJfRkFDVE9SWSA9IAorICAgICAgICBQYWNrYWdlICsgIi5FamJGYWN0b3J5IjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERCQ1BfREFUQVNPVVJDRV9GQUNUT1JZID0gCisgICAgICAgICJvcmcuYXBhY2hlLnRvbWNhdC5kYmNwLmRiY3AuQmFzaWNEYXRhU291cmNlRmFjdG9yeSI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUEVORUpCX0VKQl9GQUNUT1JZID0gCisgICAgICAgIFBhY2thZ2UgKyAiLk9wZW5FamJGYWN0b3J5IjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9CSkVDVF9GQUNUT1JJRVMgPSAiIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBQ1RPUlkgPSAiZmFjdG9yeSI7CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvZmFjdG9yeS9FamJGYWN0b3J5LmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL2ZhY3RvcnkvRWpiRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5MDRkNzUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL2ZhY3RvcnkvRWpiRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMTU3IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovIAorCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5uYW1pbmcuZmFjdG9yeTsKKworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWU7CitpbXBvcnQgamF2YXgubmFtaW5nLkNvbnRleHQ7CitpbXBvcnQgamF2YXgubmFtaW5nLkluaXRpYWxDb250ZXh0OworaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1pbmdFeGNlcHRpb247CitpbXBvcnQgamF2YXgubmFtaW5nLlJlZmVyZW5jZTsKK2ltcG9ydCBqYXZheC5uYW1pbmcuUmVmQWRkcjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuc3BpLk9iamVjdEZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5uYW1pbmcuRWpiUmVmOworCisvKioKKyAqIE9iamVjdCBmYWN0b3J5IGZvciBFSkJzLgorICogCisgKiBAYXV0aG9yIFJlbXkgTWF1Y2hlcmF0CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBFamJGYWN0b3J5CisgICAgaW1wbGVtZW50cyBPYmplY3RGYWN0b3J5IHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0YW50cworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE9iamVjdEZhY3RvcnkgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBDcmV0ZSBhIG5ldyBFSkIgaW5zdGFuY2UuCisgICAgICogCisgICAgICogQHBhcmFtIG9iaiBUaGUgcmVmZXJlbmNlIG9iamVjdCBkZXNjcmliaW5nIHRoZSBEYXRhU291cmNlCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRPYmplY3RJbnN0YW5jZShPYmplY3Qgb2JqLCBOYW1lIG5hbWUsIENvbnRleHQgbmFtZUN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhc2h0YWJsZSBlbnZpcm9ubWVudCkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIAorICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgRWpiUmVmKSB7CisgICAgICAgICAgICBSZWZlcmVuY2UgcmVmID0gKFJlZmVyZW5jZSkgb2JqOworCisgICAgICAgICAgICAvLyBJZiBlamItbGluayBoYXMgYmVlbiBzcGVjaWZpZWQsIHJlc29sdmluZyB0aGUgbGluayB1c2luZyBKTkRJCisgICAgICAgICAgICBSZWZBZGRyIGxpbmtSZWZBZGRyID0gcmVmLmdldChFamJSZWYuTElOSyk7CisgICAgICAgICAgICBpZiAobGlua1JlZkFkZHIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIFJldHJpZXZpbmcgdGhlIEVKQiBsaW5rCisgICAgICAgICAgICAgICAgU3RyaW5nIGVqYkxpbmsgPSBsaW5rUmVmQWRkci5nZXRDb250ZW50KCkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBPYmplY3QgYmVhbk9iaiA9IChuZXcgSW5pdGlhbENvbnRleHQoKSkubG9va3VwKGVqYkxpbmspOworICAgICAgICAgICAgICAgIC8vIExvYWQgaG9tZSBpbnRlcmZhY2UgYW5kIGNoZWNraW5nIGlmIGJlYW4gY29ycmVjdGx5CisgICAgICAgICAgICAgICAgLy8gaW1wbGVtZW50cyBzcGVjaWZpZWQgaG9tZSBpbnRlcmZhY2UKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgIFN0cmluZyBob21lQ2xhc3NOYW1lID0gcmVmLmdldENsYXNzTmFtZSgpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIENsYXNzIGhvbWUgPSBDbGFzcy5mb3JOYW1lKGhvbWVDbGFzc05hbWUpOworICAgICAgICAgICAgICAgICAgICBpZiAoaG9tZS5pc0luc3RhbmNlKGJlYW5PYmopKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkJlYW4gb2YgdHlwZSAiIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgYmVhbk9iai5nZXRDbGFzcygpLmdldE5hbWUoKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgaW1wbGVtZW50cyBob21lIGludGVyZmFjZSAiIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaG9tZS5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJCZWFuIG9mIHR5cGUgIiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGJlYW5PYmouZ2V0Q2xhc3MoKS5nZXROYW1lKCkgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRvZXNuJ3QgaW1wbGVtZW50IGhvbWUgaW50ZXJmYWNlICIgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBob21lLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTmFtaW5nRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJCZWFuIG9mIHR5cGUgIiArIGJlYW5PYmouZ2V0Q2xhc3MoKS5nZXROYW1lKCkgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkb2Vzbid0IGltcGxlbWVudCBob21lIGludGVyZmFjZSAiIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGhvbWUuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNvdWxkbid0IGxvYWQgaG9tZSBpbnRlcmZhY2UgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBob21lQ2xhc3NOYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gYmVhbk9iajsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgT2JqZWN0RmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKKyAgICAgICAgICAgIFJlZkFkZHIgZmFjdG9yeVJlZkFkZHIgPSByZWYuZ2V0KENvbnN0YW50cy5GQUNUT1JZKTsKKyAgICAgICAgICAgIGlmIChmYWN0b3J5UmVmQWRkciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gVXNpbmcgdGhlIHNwZWNpZmllZCBmYWN0b3J5CisgICAgICAgICAgICAgICAgU3RyaW5nIGZhY3RvcnlDbGFzc05hbWUgPSAKKyAgICAgICAgICAgICAgICAgICAgZmFjdG9yeVJlZkFkZHIuZ2V0Q29udGVudCgpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgLy8gTG9hZGluZyBmYWN0b3J5CisgICAgICAgICAgICAgICAgQ2xhc3NMb2FkZXIgdGNsID0gCisgICAgICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7CisgICAgICAgICAgICAgICAgQ2xhc3MgZmFjdG9yeUNsYXNzID0gbnVsbDsKKyAgICAgICAgICAgICAgICBpZiAodGNsICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhY3RvcnlDbGFzcyA9IHRjbC5sb2FkQ2xhc3MoZmFjdG9yeUNsYXNzTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2goQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yeUNsYXNzID0gQ2xhc3MuZm9yTmFtZShmYWN0b3J5Q2xhc3NOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZmFjdG9yeUNsYXNzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhY3RvcnkgPSAoT2JqZWN0RmFjdG9yeSkgZmFjdG9yeUNsYXNzLm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2goVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGphdmF4RWpiRmFjdG9yeUNsYXNzTmFtZSA9CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YXguZWpiLkZhY3RvcnkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLk9QRU5FSkJfRUpCX0ZBQ1RPUlkpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGZhY3RvcnkgPSAoT2JqZWN0RmFjdG9yeSkKKyAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzLmZvck5hbWUoamF2YXhFamJGYWN0b3J5Q2xhc3NOYW1lKS5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2goVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFjdG9yeS5nZXRPYmplY3RJbnN0YW5jZQorICAgICAgICAgICAgICAgICAgICAob2JqLCBuYW1lLCBuYW1lQ3R4LCBlbnZpcm9ubWVudCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOYW1pbmdFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgKCJDYW5ub3QgY3JlYXRlIHJlc291cmNlIGluc3RhbmNlIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBudWxsOworCisgICAgfQorCisKK30KKwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9mYWN0b3J5L01haWxTZXNzaW9uRmFjdG9yeS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9mYWN0b3J5L01haWxTZXNzaW9uRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5ODJlYjQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL2ZhY3RvcnkvTWFpbFNlc3Npb25GYWN0b3J5LmphdmEKQEAgLTAsMCArMSwxMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OS0yMDAxLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUubmFtaW5nLmZhY3Rvcnk7CisKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworaW1wb3J0IGphdmF4Lm1haWwuU2Vzc2lvbjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtZTsKK2ltcG9ydCBqYXZheC5uYW1pbmcuQ29udGV4dDsKK2ltcG9ydCBqYXZheC5uYW1pbmcuUmVmQWRkcjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuUmVmZXJlbmNlOworaW1wb3J0IGphdmF4Lm5hbWluZy5zcGkuT2JqZWN0RmFjdG9yeTsKKworLyoqCisgKiA8cD5GYWN0b3J5IGNsYXNzIHRoYXQgY3JlYXRlcyBhIEpOREkgbmFtZWQgSmF2YU1haWwgU2Vzc2lvbiBmYWN0b3J5LAorICogd2hpY2ggY2FuIGJlIHVzZWQgZm9yIG1hbmFnaW5nIGluYm91bmQgYW5kIG91dGJvdW5kIGVsZWN0cm9uaWMgbWFpbAorICogbWVzc2FnZXMgdmlhIEphdmFNYWlsIEFQSXMuICBBbGwgbWVzc2FnaW5nIGVudmlyb25tZW50IHByb3BlcnRpZXMKKyAqIGRlc2NyaWJlZCBpbiB0aGUgSmF2YU1haWwgU3BlY2lmaWNhdGlvbiBtYXkgYmUgcGFzc2VkIHRvIHRoZSBTZXNzaW9uCisgKiBmYWN0b3J5OyBob3dldmVyIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllcyBhcmUgdGhlIG1vc3QgY29tbW9ubHkgdXNlZDo8L3A+CisgKiA8dWw+CisgKiA8bGk+CisgKiA8bGk+PHN0cm9uZz5tYWlsLnNtdHAuaG9zdDwvc3Ryb25nPiAtIEhvc3RuYW1lIGZvciBvdXRib3VuZCB0cmFuc3BvcnQKKyAqICAgICBjb25uZWN0aW9ucy4gIERlZmF1bHRzIHRvIDxjb2RlPmxvY2FsaG9zdDwvY29kZT4gaWYgbm90IHNwZWNpZmllZC48L2xpPgorICogPC91bD4KKyAqCisgKiA8cD5UaGlzIGZhY3RvcnkgY2FuIGJlIGNvbmZpZ3VyZWQgaW4gYSA8Y29kZT4mbHQ7RGVmYXVsdENvbnRleHQmZ3Q7PC9jb2RlPgorICogb3IgPGNvZGU+Jmx0O0NvbnRleHQmZ3Q7PC9jb2RlPiBlbGVtZW50IGluIHlvdXIgPGNvZGU+Y29uZi9zZXJ2ZXIueG1sPC9jb2RlPgorICogY29uZmlndXJhdGlvbiBmaWxlLiAgQW4gZXhhbXBsZSBvZiBmYWN0b3J5IGNvbmZpZ3VyYXRpb24gaXM6PC9wPgorICogPHByZT4KKyAqICZsdDtSZXNvdXJjZSBuYW1lPSJtYWlsL3NtdHAiIGF1dGg9IkNPTlRBSU5FUiIKKyAqICAgICAgICAgICB0eXBlPSJqYXZheC5tYWlsLlNlc3Npb24iLyZndDsKKyAqICZsdDtSZXNvdXJjZVBhcmFtcyBuYW1lPSJtYWlsL3NtdHAiJmd0OworICogICAmbHQ7cGFyYW1ldGVyJmd0OworICogICAgICZsdDtuYW1lJmd0O2ZhY3RvcnkmbHQ7L25hbWUmZ3Q7CisgKiAgICAgJmx0O3ZhbHVlJmd0O29yZy5hcGFjaGUubmFtaW5nLmZhY3RvcnkuTWFpbFNlc3Npb25GYWN0b3J5Jmx0Oy92YWx1ZSZndDsKKyAqICAgJmx0Oy9wYXJhbWV0ZXImZ3Q7CisgKiAgICZsdDtwYXJhbWV0ZXImZ3Q7CisgKiAgICAgJmx0O25hbWUmZ3Q7bWFpbC5zbXRwLmhvc3QmbHQ7L25hbWUmZ3Q7CisgKiAgICAgJmx0O3ZhbHVlJmd0O21haWwubXljb21wYW55LmNvbSZsdDsvdmFsdWUmZ3Q7CisgKiAgICZsdDsvcGFyYW1ldGVyJmd0OworICogJmx0Oy9SZXNvdXJjZVBhcmFtcyZndDsKKyAqIDwvcHJlPgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgTWFpbFNlc3Npb25GYWN0b3J5IGltcGxlbWVudHMgT2JqZWN0RmFjdG9yeSB7CisKKworICAgIC8qKgorICAgICAqIFRoZSBKYXZhIHR5cGUgZm9yIHdoaWNoIHRoaXMgZmFjdG9yeSBrbm93cyBob3cgdG8gY3JlYXRlIG9iamVjdHMuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgZmFjdG9yeVR5cGUgPSAiamF2YXgubWFpbC5TZXNzaW9uIjsKKworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuZCByZXR1cm4gYW4gb2JqZWN0IGluc3RhbmNlIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBjaGFyYWN0ZXJpc3RpY3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVmT2JqIFJlZmVyZW5jZSBpbmZvcm1hdGlvbiBjb250YWluaW5nIG91ciBwYXJhbWV0ZXJzLCBvciBudWxsCisgICAgICogIGlmIHRoZXJlIGFyZSBubyBwYXJhbWV0ZXJzCisgICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhpcyBvYmplY3QsIHJlbGF0aXZlIHRvIGNvbnRleHQsIG9yIG51bGwKKyAgICAgKiAgaWYgdGhlcmUgaXMgbm8gbmFtZQorICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIHdoaWNoIG5hbWUgaXMgcmVsYXRpdmUsIG9yIG51bGwgaWYgbmFtZQorICAgICAqICBpcyByZWxhdGl2ZSB0byB0aGUgZGVmYXVsdCBpbml0aWFsIGNvbnRleHQKKyAgICAgKiBAcGFyYW0gZW52IEVudmlyb25tZW50IHZhcmlhYmxlcywgb3IgbnVsbCBpZiB0aGVyZSBhcmUgbm9uZQorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyBvYmplY3QgY3JlYXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldE9iamVjdEluc3RhbmNlKE9iamVjdCByZWZPYmosIE5hbWUgbmFtZSwgQ29udGV4dCBjb250ZXh0LAorCQkJCSAgICBIYXNodGFibGUgZW52KSB0aHJvd3MgRXhjZXB0aW9uIAorICAgIHsKKworICAgICAgICAvLyBSZXR1cm4gbnVsbCBpZiB3ZSBjYW5ub3QgY3JlYXRlIGFuIG9iamVjdCBvZiB0aGUgcmVxdWVzdGVkIHR5cGUKKwlmaW5hbCBSZWZlcmVuY2UgcmVmID0gKFJlZmVyZW5jZSkgcmVmT2JqOworICAgICAgICBpZiAoIXJlZi5nZXRDbGFzc05hbWUoKS5lcXVhbHMoZmFjdG9yeVR5cGUpKQorICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKworICAgICAgICAvLyBDcmVhdGUgYSBuZXcgU2Vzc2lvbiBpbnNpZGUgYSBkb1ByaXZpbGVnZWQgYmxvY2ssIHNvIHRoYXQgSmF2YU1haWwKKyAgICAgICAgLy8gY2FuIHJlYWQgaXRzIGRlZmF1bHQgcHJvcGVydGllcyB3aXRob3V0IHRocm93aW5nIFNlY3VyaXR5CisgICAgICAgIC8vIGV4Y2VwdGlvbnMKKyAgICAgICAgcmV0dXJuIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKCBuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKKwkJcHVibGljIE9iamVjdCBydW4oKSB7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBKYXZhTWFpbCBwcm9wZXJ0aWVzIHdlIHdpbGwgdXNlCisgICAgICAgICAgICAgICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICAgICAgICAgICAgICBwcm9wcy5wdXQoIm1haWwudHJhbnNwb3J0LnByb3RvY29sIiwgInNtdHAiKTsKKyAgICAgICAgICAgICAgICAgICAgcHJvcHMucHV0KCJtYWlsLnNtdHAuaG9zdCIsICJsb2NhbGhvc3QiKTsKKyAgICAgICAgICAgICAgICAgICAgRW51bWVyYXRpb24gYXR0cnMgPSByZWYuZ2V0QWxsKCk7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChhdHRycy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgUmVmQWRkciBhdHRyID0gKFJlZkFkZHIpIGF0dHJzLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoImZhY3RvcnkiLmVxdWFscyhhdHRyLmdldFR5cGUoKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9wcy5wdXQoYXR0ci5nZXRUeXBlKCksIChTdHJpbmcpIGF0dHIuZ2V0Q29udGVudCgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhbmQgcmV0dXJuIHRoZSBuZXcgU2Vzc2lvbiBvYmplY3QKKyAgICAgICAgICAgICAgICAgICAgU2Vzc2lvbiBzZXNzaW9uID0gU2Vzc2lvbi5nZXRJbnN0YW5jZShwcm9wcywgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoc2Vzc2lvbik7CisKKwkJfQorCSAgICB9ICk7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9mYWN0b3J5L09wZW5FamJGYWN0b3J5LmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL2ZhY3RvcnkvT3BlbkVqYkZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2VhYzhmCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9mYWN0b3J5L09wZW5FamJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw4OSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLyAKKworCitwYWNrYWdlIG9yZy5hcGFjaGUubmFtaW5nLmZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm5hbWluZy5FamJSZWY7CisKK2ltcG9ydCBqYXZheC5uYW1pbmcuQ29udGV4dDsKK2ltcG9ydCBqYXZheC5uYW1pbmcuSW5pdGlhbENvbnRleHQ7CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWU7CitpbXBvcnQgamF2YXgubmFtaW5nLlJlZmVyZW5jZTsKK2ltcG9ydCBqYXZheC5uYW1pbmcuUmVmQWRkcjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuc3BpLk9iamVjdEZhY3Rvcnk7CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworLyoqCisgKiBPYmplY3QgZmFjdG9yeSBmb3IgRUpCcy4KKyAqIAorICogQGF1dGhvciBKYWNlayBMYXNrb3dza2kKKyAqIEBhdXRob3IgUmVteSBNYXVjaGVyYXQKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KK3B1YmxpYyBjbGFzcyBPcGVuRWpiRmFjdG9yeSBpbXBsZW1lbnRzIE9iamVjdEZhY3RvcnkgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdGFudHMKKworCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9PUEVORUpCX0ZBQ1RPUlkgPSAKKyAgICAgICAgIm9yZy5vcGVuZWpiLmNsaWVudC5Mb2NhbEluaXRpYWxDb250ZXh0RmFjdG9yeSI7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE9iamVjdEZhY3RvcnkgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBDcmV0ZSBhIG5ldyBFSkIgaW5zdGFuY2UgdXNpbmcgT3BlbkVKQi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb2JqIFRoZSByZWZlcmVuY2Ugb2JqZWN0IGRlc2NyaWJpbmcgdGhlIERhdGFTb3VyY2UKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldE9iamVjdEluc3RhbmNlKE9iamVjdCBvYmosIE5hbWUgbmFtZSwgQ29udGV4dCBuYW1lQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFzaHRhYmxlIGVudmlyb25tZW50KQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBPYmplY3QgYmVhbk9iaiA9IG51bGw7CisKKyAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIEVqYlJlZikgeworCisgICAgICAgICAgICBSZWZlcmVuY2UgcmVmID0gKFJlZmVyZW5jZSkgb2JqOworCisgICAgICAgICAgICBTdHJpbmcgZmFjdG9yeSA9IERFRkFVTFRfT1BFTkVKQl9GQUNUT1JZOworICAgICAgICAgICAgUmVmQWRkciBmYWN0b3J5UmVmQWRkciA9IHJlZi5nZXQoIm9wZW5lamIuZmFjdG9yeSIpOworICAgICAgICAgICAgaWYgKGZhY3RvcnlSZWZBZGRyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBSZXRyaWV2aW5nIHRoZSBPcGVuRUpCIGZhY3RvcnkKKyAgICAgICAgICAgICAgICBmYWN0b3J5ID0gZmFjdG9yeVJlZkFkZHIuZ2V0Q29udGVudCgpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFByb3BlcnRpZXMgZW52ID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgICAgIGVudi5wdXQoQ29udGV4dC5JTklUSUFMX0NPTlRFWFRfRkFDVE9SWSwgZmFjdG9yeSk7CisKKyAgICAgICAgICAgIFJlZkFkZHIgbGlua1JlZkFkZHIgPSByZWYuZ2V0KCJvcGVuZWpiLmxpbmsiKTsKKyAgICAgICAgICAgIGlmIChsaW5rUmVmQWRkciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGVqYkxpbmsgPSBsaW5rUmVmQWRkci5nZXRDb250ZW50KCkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBiZWFuT2JqID0gKG5ldyBJbml0aWFsQ29udGV4dChlbnYpKS5sb29rdXAoZWpiTGluayk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBiZWFuT2JqOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvZmFjdG9yeS9SZXNvdXJjZUVudkZhY3RvcnkuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvZmFjdG9yeS9SZXNvdXJjZUVudkZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjQyMzFlCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9mYWN0b3J5L1Jlc291cmNlRW52RmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMTEwIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovIAorCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5uYW1pbmcuZmFjdG9yeTsKKworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWU7CitpbXBvcnQgamF2YXgubmFtaW5nLkNvbnRleHQ7CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuUmVmZXJlbmNlOworaW1wb3J0IGphdmF4Lm5hbWluZy5SZWZBZGRyOworaW1wb3J0IGphdmF4Lm5hbWluZy5zcGkuT2JqZWN0RmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm5hbWluZy5SZXNvdXJjZUVudlJlZjsKKworLyoqCisgKiBPYmplY3QgZmFjdG9yeSBmb3IgUmVzb3VyY2VzIGVudi4KKyAqIAorICogQGF1dGhvciBSZW15IE1hdWNoZXJhdAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgUmVzb3VyY2VFbnZGYWN0b3J5CisgICAgaW1wbGVtZW50cyBPYmplY3RGYWN0b3J5IHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0YW50cworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE9iamVjdEZhY3RvcnkgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBDcmV0ZSBhIG5ldyBSZXNvdXJjZSBlbnYgaW5zdGFuY2UuCisgICAgICogCisgICAgICogQHBhcmFtIG9iaiBUaGUgcmVmZXJlbmNlIG9iamVjdCBkZXNjcmliaW5nIHRoZSBEYXRhU291cmNlCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRPYmplY3RJbnN0YW5jZShPYmplY3Qgb2JqLCBOYW1lIG5hbWUsIENvbnRleHQgbmFtZUN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhc2h0YWJsZSBlbnZpcm9ubWVudCkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIAorICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgUmVzb3VyY2VFbnZSZWYpIHsKKyAgICAgICAgICAgIFJlZmVyZW5jZSByZWYgPSAoUmVmZXJlbmNlKSBvYmo7CisgICAgICAgICAgICBPYmplY3RGYWN0b3J5IGZhY3RvcnkgPSBudWxsOworICAgICAgICAgICAgUmVmQWRkciBmYWN0b3J5UmVmQWRkciA9IHJlZi5nZXQoQ29uc3RhbnRzLkZBQ1RPUlkpOworICAgICAgICAgICAgaWYgKGZhY3RvcnlSZWZBZGRyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBVc2luZyB0aGUgc3BlY2lmaWVkIGZhY3RvcnkKKyAgICAgICAgICAgICAgICBTdHJpbmcgZmFjdG9yeUNsYXNzTmFtZSA9IAorICAgICAgICAgICAgICAgICAgICBmYWN0b3J5UmVmQWRkci5nZXRDb250ZW50KCkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAvLyBMb2FkaW5nIGZhY3RvcnkKKyAgICAgICAgICAgICAgICBDbGFzc0xvYWRlciB0Y2wgPSAKKyAgICAgICAgICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKKyAgICAgICAgICAgICAgICBDbGFzcyBmYWN0b3J5Q2xhc3MgPSBudWxsOworICAgICAgICAgICAgICAgIGlmICh0Y2wgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yeUNsYXNzID0gdGNsLmxvYWRDbGFzcyhmYWN0b3J5Q2xhc3NOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3J5Q2xhc3MgPSBDbGFzcy5mb3JOYW1lKGZhY3RvcnlDbGFzc05hbWUpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChmYWN0b3J5Q2xhc3MgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yeSA9IChPYmplY3RGYWN0b3J5KSBmYWN0b3J5Q2xhc3MubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gTm90ZTogTm8gZGVmYXVsdHMgaGVyZQorICAgICAgICAgICAgaWYgKGZhY3RvcnkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWN0b3J5LmdldE9iamVjdEluc3RhbmNlCisgICAgICAgICAgICAgICAgICAgIChvYmosIG5hbWUsIG5hbWVDdHgsIGVudmlyb25tZW50KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5hbWluZ0V4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAoIkNhbm5vdCBjcmVhdGUgcmVzb3VyY2UgaW5zdGFuY2UiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBudWxsOworCisgICAgfQorCisKK30KKwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9mYWN0b3J5L1Jlc291cmNlRmFjdG9yeS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9mYWN0b3J5L1Jlc291cmNlRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0MzJmMTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL2ZhY3RvcnkvUmVzb3VyY2VGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwxNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8gCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm5hbWluZy5mYWN0b3J5OworCitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtZTsKK2ltcG9ydCBqYXZheC5uYW1pbmcuQ29udGV4dDsKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm5hbWluZy5SZWZlcmVuY2U7CitpbXBvcnQgamF2YXgubmFtaW5nLlJlZkFkZHI7CitpbXBvcnQgamF2YXgubmFtaW5nLnNwaS5PYmplY3RGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUubmFtaW5nLlJlc291cmNlUmVmOworCisvKioKKyAqIE9iamVjdCBmYWN0b3J5IGZvciBSZXNvdXJjZXMuCisgKiAKKyAqIEBhdXRob3IgUmVteSBNYXVjaGVyYXQKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIFJlc291cmNlRmFjdG9yeQorICAgIGltcGxlbWVudHMgT2JqZWN0RmFjdG9yeSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdGFudHMKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBPYmplY3RGYWN0b3J5IE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogQ3JldGUgYSBuZXcgRGF0YVNvdXJjZSBpbnN0YW5jZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb2JqIFRoZSByZWZlcmVuY2Ugb2JqZWN0IGRlc2NyaWJpbmcgdGhlIERhdGFTb3VyY2UKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldE9iamVjdEluc3RhbmNlKE9iamVjdCBvYmosIE5hbWUgbmFtZSwgQ29udGV4dCBuYW1lQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFzaHRhYmxlIGVudmlyb25tZW50KQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgCisgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBSZXNvdXJjZVJlZikgeworICAgICAgICAgICAgUmVmZXJlbmNlIHJlZiA9IChSZWZlcmVuY2UpIG9iajsKKyAgICAgICAgICAgIE9iamVjdEZhY3RvcnkgZmFjdG9yeSA9IG51bGw7CisgICAgICAgICAgICBSZWZBZGRyIGZhY3RvcnlSZWZBZGRyID0gcmVmLmdldChDb25zdGFudHMuRkFDVE9SWSk7CisgICAgICAgICAgICBpZiAoZmFjdG9yeVJlZkFkZHIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIFVzaW5nIHRoZSBzcGVjaWZpZWQgZmFjdG9yeQorICAgICAgICAgICAgICAgIFN0cmluZyBmYWN0b3J5Q2xhc3NOYW1lID0gCisgICAgICAgICAgICAgICAgICAgIGZhY3RvcnlSZWZBZGRyLmdldENvbnRlbnQoKS50b1N0cmluZygpOworICAgICAgICAgICAgICAgIC8vIExvYWRpbmcgZmFjdG9yeQorICAgICAgICAgICAgICAgIENsYXNzTG9hZGVyIHRjbCA9IAorICAgICAgICAgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOworICAgICAgICAgICAgICAgIENsYXNzIGZhY3RvcnlDbGFzcyA9IG51bGw7CisgICAgICAgICAgICAgICAgaWYgKHRjbCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3J5Q2xhc3MgPSB0Y2wubG9hZENsYXNzKGZhY3RvcnlDbGFzc05hbWUpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5hbWluZ0V4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGNyZWF0ZSByZXNvdXJjZSBmYWN0b3J5LCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uOiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3J5Q2xhc3MgPSBDbGFzcy5mb3JOYW1lKGZhY3RvcnlDbGFzc05hbWUpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5hbWluZ0V4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGNyZWF0ZSByZXNvdXJjZSBmYWN0b3J5LCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uOiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZmFjdG9yeUNsYXNzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhY3RvcnkgPSAoT2JqZWN0RmFjdG9yeSkgZmFjdG9yeUNsYXNzLm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2goVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0IGluc3RhbmNlb2YgTmFtaW5nRXhjZXB0aW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IChOYW1pbmdFeGNlcHRpb24pdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBOYW1pbmdFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBjcmVhdGUgcmVzb3VyY2UgZmFjdG9yeSBpbnN0YW5jZSwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAocmVmLmdldENsYXNzTmFtZSgpLmVxdWFscygiamF2YXguc3FsLkRhdGFTb3VyY2UiKSkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgamF2YXhTcWxEYXRhU291cmNlRmFjdG9yeUNsYXNzTmFtZSA9CisgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmF4LnNxbC5EYXRhU291cmNlLkZhY3RvcnkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5EQkNQX0RBVEFTT1VSQ0VfRkFDVE9SWSk7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3J5ID0gKE9iamVjdEZhY3RvcnkpIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzLmZvck5hbWUoamF2YXhTcWxEYXRhU291cmNlRmFjdG9yeUNsYXNzTmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaChUaHJvd2FibGUgdCkgeworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlZi5nZXRDbGFzc05hbWUoKS5lcXVhbHMoImphdmF4Lm1haWwuU2Vzc2lvbiIpKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBqYXZheE1haWxTZXNzaW9uRmFjdG9yeUNsYXNzTmFtZSA9CisgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmF4Lm1haWwuU2Vzc2lvbi5GYWN0b3J5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5uYW1pbmcuZmFjdG9yeS5NYWlsU2Vzc2lvbkZhY3RvcnkiKTsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhY3RvcnkgPSAoT2JqZWN0RmFjdG9yeSkgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MuZm9yTmFtZShqYXZheE1haWxTZXNzaW9uRmFjdG9yeUNsYXNzTmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGZhY3RvcnkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWN0b3J5LmdldE9iamVjdEluc3RhbmNlCisgICAgICAgICAgICAgICAgICAgIChvYmosIG5hbWUsIG5hbWVDdHgsIGVudmlyb25tZW50KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5hbWluZ0V4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAoIkNhbm5vdCBjcmVhdGUgcmVzb3VyY2UgaW5zdGFuY2UiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICB9CisKKworfQorCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL2ZhY3RvcnkvUmVzb3VyY2VMaW5rRmFjdG9yeS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9mYWN0b3J5L1Jlc291cmNlTGlua0ZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2RlZjQwCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9mYWN0b3J5L1Jlc291cmNlTGlua0ZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDEwNyBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLyAKKworCitwYWNrYWdlIG9yZy5hcGFjaGUubmFtaW5nLmZhY3Rvcnk7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworCitpbXBvcnQgamF2YXgubmFtaW5nLkNvbnRleHQ7CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWU7CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuUmVmQWRkcjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuUmVmZXJlbmNlOworaW1wb3J0IGphdmF4Lm5hbWluZy5zcGkuT2JqZWN0RmFjdG9yeTsKKworaW1wb3J0IG9yZy5hcGFjaGUubmFtaW5nLlJlc291cmNlTGlua1JlZjsKKworCisvKioKKyAqIDxwPk9iamVjdCBmYWN0b3J5IGZvciByZXNvdXJjZSBsaW5rcy48L3A+CisgKiAKKyAqIEBhdXRob3IgUmVteSBNYXVjaGVyYXQKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIFJlc291cmNlTGlua0ZhY3RvcnkKKyAgICBpbXBsZW1lbnRzIE9iamVjdEZhY3RvcnkgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTdGF0aWMgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIEdsb2JhbCBuYW1pbmcgY29udGV4dC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBDb250ZXh0IGdsb2JhbENvbnRleHQgPSBudWxsOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBnbG9iYWwgY29udGV4dCAobm90ZTogY2FuIG9ubHkgYmUgdXNlZCBvbmNlKS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmV3R2xvYmFsQ29udGV4dCBuZXcgZ2xvYmFsIGNvbnRleHQgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0R2xvYmFsQ29udGV4dChDb250ZXh0IG5ld0dsb2JhbENvbnRleHQpIHsKKyAgICAgICAgaWYgKGdsb2JhbENvbnRleHQgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgZ2xvYmFsQ29udGV4dCA9IG5ld0dsb2JhbENvbnRleHQ7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBPYmplY3RGYWN0b3J5IE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IERhdGFTb3VyY2UgaW5zdGFuY2UuCisgICAgICogCisgICAgICogQHBhcmFtIG9iaiBUaGUgcmVmZXJlbmNlIG9iamVjdCBkZXNjcmliaW5nIHRoZSBEYXRhU291cmNlCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRPYmplY3RJbnN0YW5jZShPYmplY3Qgb2JqLCBOYW1lIG5hbWUsIENvbnRleHQgbmFtZUN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhc2h0YWJsZSBlbnZpcm9ubWVudCkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIAorICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBSZXNvdXJjZUxpbmtSZWYpKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgLy8gQ2FuIHdlIHByb2Nlc3MgdGhpcyByZXF1ZXN0PworICAgICAgICBSZWZlcmVuY2UgcmVmID0gKFJlZmVyZW5jZSkgb2JqOworCisgICAgICAgIFN0cmluZyB0eXBlID0gcmVmLmdldENsYXNzTmFtZSgpOworCisgICAgICAgIC8vIFJlYWQgdGhlIGdsb2JhbCByZWYgYWRkcgorICAgICAgICBTdHJpbmcgZ2xvYmFsTmFtZSA9IG51bGw7CisgICAgICAgIFJlZkFkZHIgcmVmQWRkciA9IHJlZi5nZXQoUmVzb3VyY2VMaW5rUmVmLkdMT0JBTE5BTUUpOworICAgICAgICBpZiAocmVmQWRkciAhPSBudWxsKSB7CisgICAgICAgICAgICBnbG9iYWxOYW1lID0gcmVmQWRkci5nZXRDb250ZW50KCkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIE9iamVjdCByZXN1bHQgPSBudWxsOworICAgICAgICAgICAgcmVzdWx0ID0gZ2xvYmFsQ29udGV4dC5sb29rdXAoZ2xvYmFsTmFtZSk7CisgICAgICAgICAgICAvLyBGSVhNRTogQ2hlY2sgdHlwZQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAobnVsbCk7CisKKyAgICAgICAgCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvZmFjdG9yeS9TZW5kTWFpbEZhY3RvcnkuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvZmFjdG9yeS9TZW5kTWFpbEZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGZlYzQ4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9mYWN0b3J5L1NlbmRNYWlsRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMTI1IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5uYW1pbmcuZmFjdG9yeTsKKworaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YXgubWFpbC5TZXNzaW9uOworaW1wb3J0IGphdmF4Lm1haWwuaW50ZXJuZXQuSW50ZXJuZXRBZGRyZXNzOworaW1wb3J0IGphdmF4Lm1haWwuaW50ZXJuZXQuTWltZU1lc3NhZ2U7CitpbXBvcnQgamF2YXgubWFpbC5pbnRlcm5ldC5NaW1lUGFydDsKK2ltcG9ydCBqYXZheC5tYWlsLmludGVybmV0Lk1pbWVQYXJ0RGF0YVNvdXJjZTsKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtZTsKK2ltcG9ydCBqYXZheC5uYW1pbmcuQ29udGV4dDsKK2ltcG9ydCBqYXZheC5uYW1pbmcuUmVmZXJlbmNlOworaW1wb3J0IGphdmF4Lm5hbWluZy5SZWZBZGRyOworaW1wb3J0IGphdmF4Lm5hbWluZy5zcGkuT2JqZWN0RmFjdG9yeTsKKworLyoqCisgKiBGYWN0b3J5IGNsYXNzIHRoYXQgY3JlYXRlcyBhIEpOREkgbmFtZWQgamF2YW1haWwgTWltZVBhcnREYXRhU291cmNlCisgKiBvYmplY3Qgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHNlbmRpbmcgZW1haWwgdXNpbmcgU01UUC4KKyAqIDxwPgorICogQ2FuIGJlIGNvbmZpZ3VyZWQgaW4gdGhlIERlZmF1bHRDb250ZXh0IG9yIENvbnRleHQgc2NvcGUKKyAqIG9mIHlvdXIgc2VydmVyLnhtbCBjb25maWd1cmF0aW9uIGZpbGUuCisgKiA8cD4KKyAqIEV4YW1wbGU6CisgKiA8cD4KKyAqIDxwcmU+CisgKiAmbHQ7UmVzb3VyY2UgbmFtZT0ibWFpbC9zZW5kIiBhdXRoPSJDT05UQUlORVIiCisgKiAgICAgICAgICAgdHlwZT0iamF2YXgubWFpbC5pbnRlcm5ldC5NaW1lUGFydERhdGFTb3VyY2UiLz4KKyAqICZsdDtSZXNvdXJjZVBhcmFtcyBuYW1lPSJtYWlsL3NlbmQiPgorICogICAmbHQ7cGFyYW1ldGVyPiZsdDtuYW1lPmZhY3RvcnkmbHQ7L25hbWU+CisgKiAgICAgJmx0O3ZhbHVlPm9yZy5hcGFjaGUubmFtaW5nLmZhY3RvcnkuU2VuZE1haWxGYWN0b3J5Jmx0Oy92YWx1ZT4KKyAqICAgJmx0Oy9wYXJhbWV0ZXI+CisgKiAgICZsdDtwYXJhbWV0ZXI+Jmx0O25hbWU+bWFpbC5zbXRwLmhvc3QmbHQ7L25hbWU+CisgKiAgICAgJmx0O3ZhbHVlPnlvdXIuc210cC5ob3N0Jmx0Oy92YWx1ZT4KKyAqICAgJmx0Oy9wYXJhbWV0ZXI+CisgKiAgICZsdDtwYXJhbWV0ZXI+Jmx0O25hbWU+bWFpbC5zbXRwLnVzZXImbHQ7L25hbWU+CisgKiAgICAgJmx0O3ZhbHVlPnNvbWV1c2VyJmx0Oy92YWx1ZT4KKyAqICAgJmx0Oy9wYXJhbWV0ZXI+CisgKiAgICZsdDtwYXJhbWV0ZXI+Jmx0O25hbWU+bWFpbC5mcm9tJmx0Oy9uYW1lPgorICogICAgICZsdDt2YWx1ZT5zb21ldXNlckBzb21lLmhvc3QmbHQ7L3ZhbHVlPgorICogICAmbHQ7L3BhcmFtZXRlcj4KKyAqICAgJmx0O3BhcmFtZXRlcj4mbHQ7bmFtZT5tYWlsLnNtdHAuc2VuZHBhcnRpYWwmbHQ7L25hbWU+CisgKiAgICAgJmx0O3ZhbHVlPnRydWUmbHQ7L3ZhbHVlPgorICogICAmbHQ7L3BhcmFtZXRlcj4KKyAqICAmbHQ7cGFyYW1ldGVyPiZsdDtuYW1lPm1haWwuc210cC5kc24ubm90aWZ5Jmx0Oy9uYW1lPgorICogICAgICZsdDt2YWx1ZT5GQUlMVVJFJmx0Oy92YWx1ZT4KKyAqICAgJmx0Oy9wYXJhbWV0ZXI+CisgKiAgICZsdDtwYXJhbWV0ZXI+Jmx0O25hbWU+bWFpbC5zbXRwLmRzbi5yZXQmbHQ7L25hbWU+CisgKiAgICAgJmx0O3ZhbHVlPkZVTEwmbHQ7L3ZhbHVlPgorICogICAmbHQ7L3BhcmFtZXRlcj4KKyAqICZsdDsvUmVzb3VyY2VQYXJhbXM+CisgKiA8L3ByZT4KKyAqCisgKiBAYXV0aG9yIEdsZW5uIE5pZWxzZW4gUmljaCBDYXRsZXR0CisgKi8KKworcHVibGljIGNsYXNzIFNlbmRNYWlsRmFjdG9yeSBpbXBsZW1lbnRzIE9iamVjdEZhY3RvcnkgCit7CisgICAgLy8gVGhlIGNsYXNzIG5hbWUgZm9yIHRoZSBqYXZhbWFpbCBNaW1lTWVzc2FnZURhdGFTb3VyY2UKKyAgICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIERhdGFTb3VyY2VDbGFzc05hbWUgPSAKKwkiamF2YXgubWFpbC5pbnRlcm5ldC5NaW1lUGFydERhdGFTb3VyY2UiOworCisgICAgcHVibGljIE9iamVjdCBnZXRPYmplY3RJbnN0YW5jZShPYmplY3QgUmVmT2JqLCBOYW1lIE5tLCBDb250ZXh0IEN0eCwKKwkJCQkgICAgSGFzaHRhYmxlIEVudikgdGhyb3dzIEV4Y2VwdGlvbiAKKyAgICB7CisJZmluYWwgUmVmZXJlbmNlIFJlZiA9IChSZWZlcmVuY2UpUmVmT2JqOworCisJLy8gQ3JlYXRpb24gb2YgdGhlIERhdGFTb3VyY2UgaXMgd3JhcHBlZCBpbnNpZGUgYSBkb1ByaXZpbGVnZWQKKwkvLyBzbyB0aGF0IGphdmFtYWlsIGNhbiByZWFkIGl0cyBkZWZhdWx0IHByb3BlcnRpZXMgd2l0aG91dAorCS8vIHRocm93aW5nIFNlY3VyaXR5IEV4Y2VwdGlvbnMKKwlpZiAoUmVmLmdldENsYXNzTmFtZSgpLmVxdWFscyhEYXRhU291cmNlQ2xhc3NOYW1lKSkgeworCSAgICByZXR1cm4gQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoIG5ldyBQcml2aWxlZ2VkQWN0aW9uKCkKKwkgICAgeworCQlwdWJsaWMgT2JqZWN0IHJ1bigpIHsKKyAgICAgICAgCSAgICAvLyBzZXQgdXAgdGhlIHNtdHAgc2Vzc2lvbiB0aGF0IHdpbGwgc2VuZCB0aGUgbWVzc2FnZQorCSAgICAgICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOworCQkgICAgLy8gZW51bWVyYXRpb24gb2YgYWxsIHJlZmFkZHIKKwkJICAgIEVudW1lcmF0aW9uIGxpc3QgPSBSZWYuZ2V0QWxsKCk7CisJCSAgICAvLyBjdXJyZW50IHJlZmFkZHIgdG8gYmUgc2V0CisJCSAgICBSZWZBZGRyIHJlZmFkZHI7CisJICAgICAgICAgICAgLy8gc2V0IHRyYW5zcG9ydCB0byBzbXRwCisJICAgICAgICAgICAgcHJvcHMucHV0KCJtYWlsLnRyYW5zcG9ydC5wcm90b2NvbCIsICJzbXRwIik7CisKKwkJICAgIHdoaWxlIChsaXN0Lmhhc01vcmVFbGVtZW50cygpKSB7CisJCQlyZWZhZGRyID0gKFJlZkFkZHIpbGlzdC5uZXh0RWxlbWVudCgpOworCisJCQkvLyBzZXQgcHJvcGVydHkKKwkJCXByb3BzLnB1dChyZWZhZGRyLmdldFR5cGUoKSwgKFN0cmluZylyZWZhZGRyLmdldENvbnRlbnQoKSk7CisJCSAgICB9CisJCSAgICBNaW1lTWVzc2FnZSBtZXNzYWdlID0gbmV3IE1pbWVNZXNzYWdlKAorCQkJU2Vzc2lvbi5nZXRJbnN0YW5jZShwcm9wcykpOworCQkgICAgdHJ5IHsKKwkJCVN0cmluZyBmcm9tID0gKFN0cmluZylSZWYuZ2V0KCJtYWlsLmZyb20iKS5nZXRDb250ZW50KCk7CisJCSAgICAgICAgbWVzc2FnZS5zZXRGcm9tKG5ldyBJbnRlcm5ldEFkZHJlc3MoZnJvbSkpOworCQkgICAgICAgIG1lc3NhZ2Uuc2V0U3ViamVjdCgiIik7CisJCSAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkge30KKwkJICAgIE1pbWVQYXJ0RGF0YVNvdXJjZSBtZHMgPSBuZXcgTWltZVBhcnREYXRhU291cmNlKAorCQkJKE1pbWVQYXJ0KW1lc3NhZ2UpOworCQkgICAgcmV0dXJuIG1kczsKKwkJfQorCSAgICB9ICk7CisJfQorCWVsc2UgeyAvLyBXZSBjYW4ndCBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIERhdGFTb3VyY2UKKwkgICAgcmV0dXJuIG51bGw7CisJfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvZmFjdG9yeS9UcmFuc2FjdGlvbkZhY3RvcnkuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvZmFjdG9yeS9UcmFuc2FjdGlvbkZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGE3MGQ0Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9mYWN0b3J5L1RyYW5zYWN0aW9uRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMTEwIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovIAorCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5uYW1pbmcuZmFjdG9yeTsKKworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWU7CitpbXBvcnQgamF2YXgubmFtaW5nLkNvbnRleHQ7CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuUmVmZXJlbmNlOworaW1wb3J0IGphdmF4Lm5hbWluZy5SZWZBZGRyOworaW1wb3J0IGphdmF4Lm5hbWluZy5zcGkuT2JqZWN0RmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm5hbWluZy5UcmFuc2FjdGlvblJlZjsKKworLyoqCisgKiBPYmplY3QgZmFjdG9yeSBmb3IgVXNlciB0cmFzYWN0aW9ucy4KKyAqIAorICogQGF1dGhvciBSZW15IE1hdWNoZXJhdAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgVHJhbnNhY3Rpb25GYWN0b3J5CisgICAgaW1wbGVtZW50cyBPYmplY3RGYWN0b3J5IHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0YW50cworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE9iamVjdEZhY3RvcnkgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBDcmV0ZSBhIG5ldyBVc2VyIHRyYW5zYWN0aW9uIGluc3RhbmNlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBvYmogVGhlIHJlZmVyZW5jZSBvYmplY3QgZGVzY3JpYmluZyB0aGUgRGF0YVNvdXJjZQorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0SW5zdGFuY2UoT2JqZWN0IG9iaiwgTmFtZSBuYW1lLCBDb250ZXh0IG5hbWVDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYXNodGFibGUgZW52aXJvbm1lbnQpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAKKyAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFRyYW5zYWN0aW9uUmVmKSB7CisgICAgICAgICAgICBSZWZlcmVuY2UgcmVmID0gKFJlZmVyZW5jZSkgb2JqOworICAgICAgICAgICAgT2JqZWN0RmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKKyAgICAgICAgICAgIFJlZkFkZHIgZmFjdG9yeVJlZkFkZHIgPSByZWYuZ2V0KENvbnN0YW50cy5GQUNUT1JZKTsKKyAgICAgICAgICAgIGlmIChmYWN0b3J5UmVmQWRkciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gVXNpbmcgdGhlIHNwZWNpZmllZCBmYWN0b3J5CisgICAgICAgICAgICAgICAgU3RyaW5nIGZhY3RvcnlDbGFzc05hbWUgPSAKKyAgICAgICAgICAgICAgICAgICAgZmFjdG9yeVJlZkFkZHIuZ2V0Q29udGVudCgpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgLy8gTG9hZGluZyBmYWN0b3J5CisgICAgICAgICAgICAgICAgQ2xhc3NMb2FkZXIgdGNsID0gCisgICAgICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7CisgICAgICAgICAgICAgICAgQ2xhc3MgZmFjdG9yeUNsYXNzID0gbnVsbDsKKyAgICAgICAgICAgICAgICBpZiAodGNsICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhY3RvcnlDbGFzcyA9IHRjbC5sb2FkQ2xhc3MoZmFjdG9yeUNsYXNzTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2goQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yeUNsYXNzID0gQ2xhc3MuZm9yTmFtZShmYWN0b3J5Q2xhc3NOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZmFjdG9yeUNsYXNzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhY3RvcnkgPSAoT2JqZWN0RmFjdG9yeSkgZmFjdG9yeUNsYXNzLm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2goVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFjdG9yeS5nZXRPYmplY3RJbnN0YW5jZQorICAgICAgICAgICAgICAgICAgICAob2JqLCBuYW1lLCBuYW1lQ3R4LCBlbnZpcm9ubWVudCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOYW1pbmdFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgKCJDYW5ub3QgY3JlYXRlIHJlc291cmNlIGluc3RhbmNlIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIAorICAgIH0KKworCit9CisKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvZmFjdG9yeS9wYWNrYWdlLmh0bWwgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL2ZhY3RvcnkvcGFja2FnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxOGNiMDcKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL2ZhY3RvcnkvcGFja2FnZS5odG1sCkBAIC0wLDAgKzEsNyBAQAorPGJvZHk+CisKKzxwPlRoaXMgcGFja2FnZSBjb250YWlucyBvYmplY3QgZmFjdG9yaWVzIHVzZWQgYnkgdGhlIG5hbWluZyBzZXJ2aWNlLjwvcD4KKworPHA+PC9wPgorCis8L2JvZHk+CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL2phdmEvamF2YVVSTENvbnRleHRGYWN0b3J5LmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL2phdmEvamF2YVVSTENvbnRleHRGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY1ODY5YgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvamF2YS9qYXZhVVJMQ29udGV4dEZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDExMSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLyAKKworCitwYWNrYWdlIG9yZy5hcGFjaGUubmFtaW5nLmphdmE7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1lOworaW1wb3J0IGphdmF4Lm5hbWluZy5Db250ZXh0OworaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1pbmdFeGNlcHRpb247CitpbXBvcnQgamF2YXgubmFtaW5nLnNwaS5PYmplY3RGYWN0b3J5OworaW1wb3J0IGphdmF4Lm5hbWluZy5zcGkuSW5pdGlhbENvbnRleHRGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUubmFtaW5nLlNlbGVjdG9yQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLm5hbWluZy5OYW1pbmdDb250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUubmFtaW5nLkNvbnRleHRCaW5kaW5nczsKKworLyoqCisgKiBDb250ZXh0IGZhY3RvcnkgZm9yIHRoZSAiamF2YToiIG5hbWVzcGFjZS4KKyAqIDxwPgorICogPGI+SW1wb3J0YW50IG5vdGU8L2I+IDogVGhpcyBmYWN0b3J5IE1VU1QgYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSAiamF2YSIgVVJMCisgKiBwcmVmaXgsIHdoaWNoIGNhbiBiZSBkb25lIGJ5IGVpdGhlciA6CisgKiA8dWw+CisgKiA8bGk+QWRkaW5nIGEgCisgKiBqYXZhLm5hbWluZy5mYWN0b3J5LnVybC5wa2dzPW9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5uYW1pbmcgcHJvcGVydHkKKyAqIHRvIHRoZSBKTkRJIHByb3BlcnRpZXMgZmlsZTwvbGk+CisgKiA8bGk+U2V0dGluZyBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBuYW1lZCBDb250ZXh0LlVSTF9QS0dfUFJFRklYRVMgd2l0aCAKKyAqIGl0cyB2YWx1ZSBpbmNsdWRpbmcgdGhlIG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5uYW1pbmcgcGFja2FnZSBuYW1lLiAKKyAqIE1vcmUgZGV0YWlsIGFib3V0IHRoaXMgY2FuIGJlIGZvdW5kIGluIHRoZSBKTkRJIGRvY3VtZW50YXRpb24gOiAKKyAqIHtAbGluayBqYXZheC5uYW1pbmcuc3BpLk5hbWluZ01hbmFnZXIjZ2V0VVJMQ29udGV4dChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnV0aWwuSGFzaHRhYmxlKX0uPC9saT4KKyAqIDwvdWw+CisgKiAKKyAqIEBhdXRob3IgUmVteSBNYXVjaGVyYXQKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIGphdmFVUkxDb250ZXh0RmFjdG9yeQorICAgIGltcGxlbWVudHMgT2JqZWN0RmFjdG9yeSwgSW5pdGlhbENvbnRleHRGYWN0b3J5IHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0YW50cworCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQUlOID0gImluaXRpYWxDb250ZXh0IjsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIEluaXRpYWwgY29udGV4dC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIENvbnRleHQgaW5pdGlhbENvbnRleHQgPSBudWxsOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gT2JqZWN0RmFjdG9yeSBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIENyZXRlIGEgbmV3IENvbnRleHQncyBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldE9iamVjdEluc3RhbmNlKE9iamVjdCBvYmosIE5hbWUgbmFtZSwgQ29udGV4dCBuYW1lQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFzaHRhYmxlIGVudmlyb25tZW50KQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKChDb250ZXh0QmluZGluZ3MuaXNUaHJlYWRCb3VuZCgpKSB8fCAKKyAgICAgICAgICAgIChDb250ZXh0QmluZGluZ3MuaXNDbGFzc0xvYWRlckJvdW5kKCkpKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFNlbGVjdG9yQ29udGV4dChlbnZpcm9ubWVudCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0IGEgbmV3ICh3cml0YWJsZSkgaW5pdGlhbCBjb250ZXh0LgorICAgICAqLworICAgIHB1YmxpYyBDb250ZXh0IGdldEluaXRpYWxDb250ZXh0KEhhc2h0YWJsZSBlbnZpcm9ubWVudCkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChDb250ZXh0QmluZGluZ3MuaXNUaHJlYWRCb3VuZCgpIHx8IAorICAgICAgICAgICAgKENvbnRleHRCaW5kaW5ncy5pc0NsYXNzTG9hZGVyQm91bmQoKSkpIHsKKyAgICAgICAgICAgIC8vIFJlZGlyZWN0IHRoZSByZXF1ZXN0IHRvIHRoZSBib3VuZCBpbml0aWFsIGNvbnRleHQKKyAgICAgICAgICAgIHJldHVybiBuZXcgU2VsZWN0b3JDb250ZXh0KGVudmlyb25tZW50LCB0cnVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIElmIHRoZSB0aHJlYWQgaXMgbm90IGJvdW5kLCByZXR1cm4gYSBzaGFyZWQgd3JpdGFibGUgY29udGV4dAorICAgICAgICAgICAgaWYgKGluaXRpYWxDb250ZXh0ID09IG51bGwpCisgICAgICAgICAgICAgICAgaW5pdGlhbENvbnRleHQgPSBuZXcgTmFtaW5nQ29udGV4dChlbnZpcm9ubWVudCwgTUFJTik7CisgICAgICAgICAgICByZXR1cm4gaW5pdGlhbENvbnRleHQ7CisgICAgICAgIH0KKyAgICB9CisKKworfQorCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL2phdmEvcGFja2FnZS5odG1sIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9qYXZhL3BhY2thZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDBmNzY0Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9qYXZhL3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDcgQEAKKzxib2R5PgorCis8cD5UaGlzIHBhY2thZ2UgY29udGFpbnMgdGhlIFVSTCBjb250ZXh0IGZhY3RvcnkgZm9yIHRoZSAiamF2YSIgbmFtZXNwYWNlLjwvcD4KKworPHA+PC9wPgorCis8L2JvZHk+CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL3BhY2thZ2UuaHRtbCBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvcGFja2FnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkNWY5ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDcgQEAKKzxib2R5PgorCis8cD5UaGlzIHBhY2thZ2UgY29udGFpbnMgYSBtZW1vcnkgYmFzZWQgbmFtaW5nIHNlcnZpY2UgcHJvdmlkZXIuPC9wPgorCis8cD48L3A+CisKKzwvYm9keT4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvcmVzb3VyY2VzL0Jhc2VEaXJDb250ZXh0LmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL3Jlc291cmNlcy9CYXNlRGlyQ29udGV4dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhNzdkMzIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL3Jlc291cmNlcy9CYXNlRGlyQ29udGV4dC5qYXZhCkBAIC0wLDAgKzEsMTIwOCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLyAKKworCitwYWNrYWdlIG9yZy5hcGFjaGUubmFtaW5nLnJlc291cmNlczsKKworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CisKK2ltcG9ydCBqYXZheC5uYW1pbmcuQ29udGV4dDsKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtZTsKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtZVBhcnNlcjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtaW5nRW51bWVyYXRpb247CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuZGlyZWN0b3J5LkF0dHJpYnV0ZXM7CitpbXBvcnQgamF2YXgubmFtaW5nLmRpcmVjdG9yeS5EaXJDb250ZXh0OworaW1wb3J0IGphdmF4Lm5hbWluZy5kaXJlY3RvcnkuTW9kaWZpY2F0aW9uSXRlbTsKK2ltcG9ydCBqYXZheC5uYW1pbmcuZGlyZWN0b3J5LlNlYXJjaENvbnRyb2xzOworCitpbXBvcnQgb3JnLmFwYWNoZS5uYW1pbmcuTmFtZVBhcnNlckltcGw7CitpbXBvcnQgb3JnLmFwYWNoZS5uYW1pbmcuU3RyaW5nTWFuYWdlcjsKKworLyoqCisgKiBEaXJlY3RvcnkgQ29udGV4dCBpbXBsZW1lbnRhdGlvbiBoZWxwZXIgY2xhc3MuCisgKgorICogQGF1dGhvciBSZW15IE1hdWNoZXJhdAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZURpckNvbnRleHQgaW1wbGVtZW50cyBEaXJDb250ZXh0IHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RhbnRzCisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvKioKKyAgICAgKiBCdWlsZHMgYSBiYXNlIGRpcmVjdG9yeSBjb250ZXh0LgorICAgICAqLworICAgIHB1YmxpYyBCYXNlRGlyQ29udGV4dCgpIHsKKyAgICAgICAgdGhpcy5lbnYgPSBuZXcgSGFzaHRhYmxlKCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBCdWlsZHMgYSBiYXNlIGRpcmVjdG9yeSBjb250ZXh0IHVzaW5nIHRoZSBnaXZlbiBlbnZpcm9ubWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQmFzZURpckNvbnRleHQoSGFzaHRhYmxlIGVudikgeworICAgICAgICB0aGlzLmVudiA9IGVudjsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZG9jdW1lbnQgYmFzZSBwYXRoLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZG9jQmFzZSA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIEVudmlyb25tZW50LgorICAgICAqLworICAgIHByb3RlY3RlZCBIYXNodGFibGUgZW52OworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc3RyaW5nIG1hbmFnZXIgZm9yIHRoaXMgcGFja2FnZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nTWFuYWdlciBzbSA9IFN0cmluZ01hbmFnZXIuZ2V0TWFuYWdlcihDb25zdGFudHMuUGFja2FnZSk7CisKKworICAgIC8qKgorICAgICAqIE5hbWUgcGFyc2VyIGZvciB0aGlzIGNvbnRleHQuCisgICAgICovCisgICAgcHJvdGVjdGVkIGZpbmFsIE5hbWVQYXJzZXIgbmFtZVBhcnNlciA9IG5ldyBOYW1lUGFyc2VySW1wbCgpOworCisKKyAgICAvKioKKyAgICAgKiBDYWNoZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gY2FjaGVkID0gdHJ1ZTsKKworCisgICAgLyoqCisgICAgICogQ2FjaGUgVFRMLgorICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgY2FjaGVUVEwgPSA1MDAwOyAvLyA1cworCisKKyAgICAvKioKKyAgICAgKiBNYXggc2l6ZSBvZiByZXNvdXJjZXMgd2hpY2ggd2lsbCBoYXZlIHRoZWlyIGNvbnRlbnQgY2FjaGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgY2FjaGVNYXhTaXplID0gMTAyNDA7IC8vIDEwIE1CCisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGRvY3VtZW50IHJvb3QgZm9yIHRoaXMgY29tcG9uZW50LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RG9jQmFzZSgpIHsKKwlyZXR1cm4gKHRoaXMuZG9jQmFzZSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGRvY3VtZW50IHJvb3QgZm9yIHRoaXMgY29tcG9uZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGRvY0Jhc2UgVGhlIG5ldyBkb2N1bWVudCByb290CisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgc3BlY2lmaWVkIHZhbHVlIGlzIG5vdAorICAgICAqICBzdXBwb3J0ZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvbgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoaXMgd291bGQgY3JlYXRlIGEKKyAgICAgKiAgbWFsZm9ybWVkIFVSTAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERvY0Jhc2UoU3RyaW5nIGRvY0Jhc2UpIHsKKworCS8vIFZhbGlkYXRlIHRoZSBmb3JtYXQgb2YgdGhlIHByb3Bvc2VkIGRvY3VtZW50IHJvb3QKKwlpZiAoZG9jQmFzZSA9PSBudWxsKQorCSAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisJCShzbS5nZXRTdHJpbmcoInJlc291cmNlcy5udWxsIikpOworCisJLy8gQ2hhbmdlIHRoZSBkb2N1bWVudCByb290IHByb3BlcnR5CisJdGhpcy5kb2NCYXNlID0gZG9jQmFzZTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IGNhY2hlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDYWNoZWQoYm9vbGVhbiBjYWNoZWQpIHsKKyAgICAgICAgdGhpcy5jYWNoZWQgPSBjYWNoZWQ7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBJcyBjYWNoZWQgPworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzQ2FjaGVkKCkgeworICAgICAgICByZXR1cm4gY2FjaGVkOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IGNhY2hlIFRUTC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDYWNoZVRUTChpbnQgY2FjaGVUVEwpIHsKKyAgICAgICAgdGhpcy5jYWNoZVRUTCA9IGNhY2hlVFRMOworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0IGNhY2hlIFRUTC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldENhY2hlVFRMKCkgeworICAgICAgICByZXR1cm4gY2FjaGVUVEw7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgY2FjaGUgaW4gS0IuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRDYWNoZU1heFNpemUoKSB7CisgICAgICAgIHJldHVybiBjYWNoZU1heFNpemU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgY2FjaGUgaW4gS0IuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2FjaGVNYXhTaXplKGludCBjYWNoZU1heFNpemUpIHsKKyAgICAgICAgdGhpcy5jYWNoZU1heFNpemUgPSBjYWNoZU1heFNpemU7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogQWxsb2NhdGUgcmVzb3VyY2VzIGZvciB0aGlzIGRpcmVjdG9yeSBjb250ZXh0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFsbG9jYXRlKCkgeworICAgICAgICA7IC8vIE5vIGFjdGlvbiB0YWtlbiBieSB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbgorICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVsZWFzZSBhbnkgcmVzb3VyY2VzIGFsbG9jYXRlZCBmb3IgdGhpcyBkaXJlY3RvcnkgY29udGV4dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWxlYXNlKCkgeworICAgICAgICA7IC8vIE5vIGFjdGlvbiB0YWtlbiBieSB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbgorICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29udGV4dCBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgbmFtZWQgb2JqZWN0LiBJZiBuYW1lIGlzIGVtcHR5LCByZXR1cm5zIGEgbmV3IGluc3RhbmNlIAorICAgICAqIG9mIHRoaXMgY29udGV4dCAod2hpY2ggcmVwcmVzZW50cyB0aGUgc2FtZSBuYW1pbmcgY29udGV4dCBhcyB0aGlzIAorICAgICAqIGNvbnRleHQsIGJ1dCBpdHMgZW52aXJvbm1lbnQgbWF5IGJlIG1vZGlmaWVkIGluZGVwZW5kZW50bHkgYW5kIGl0IG1heSAKKyAgICAgKiBiZSBhY2Nlc3NlZCBjb25jdXJyZW50bHkpLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBvYmplY3QgdG8gbG9vayB1cAorICAgICAqIEByZXR1cm4gdGhlIG9iamVjdCBib3VuZCB0byBuYW1lCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBsb29rdXAoTmFtZSBuYW1lKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGxvb2t1cChuYW1lLnRvU3RyaW5nKCkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSBuYW1lZCBvYmplY3QuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIG9iamVjdCB0byBsb29rIHVwCisgICAgICogQHJldHVybiB0aGUgb2JqZWN0IGJvdW5kIHRvIG5hbWUKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgT2JqZWN0IGxvb2t1cChTdHJpbmcgbmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbjsKKworCisgICAgLyoqCisgICAgICogQmluZHMgYSBuYW1lIHRvIGFuIG9iamVjdC4gQWxsIGludGVybWVkaWF0ZSBjb250ZXh0cyBhbmQgdGhlIHRhcmdldCAKKyAgICAgKiBjb250ZXh0ICh0aGF0IG5hbWVkIGJ5IGFsbCBidXQgdGVybWluYWwgYXRvbWljIGNvbXBvbmVudCBvZiB0aGUgbmFtZSkgCisgICAgICogbXVzdCBhbHJlYWR5IGV4aXN0LgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIHRvIGJpbmQ7IG1heSBub3QgYmUgZW1wdHkKKyAgICAgKiBAcGFyYW0gb2JqIHRoZSBvYmplY3QgdG8gYmluZDsgcG9zc2libHkgbnVsbAorICAgICAqIEBleGNlcHRpb24gTmFtZUFscmVhZHlCb3VuZEV4Y2VwdGlvbiBpZiBuYW1lIGlzIGFscmVhZHkgYm91bmQKKyAgICAgKiBAZXhjZXB0aW9uIEludmFsaWRBdHRyaWJ1dGVzRXhjZXB0aW9uIGlmIG9iamVjdCBkaWQgbm90IHN1cHBseSBhbGwgCisgICAgICogbWFuZGF0b3J5IGF0dHJpYnV0ZXMKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBiaW5kKE5hbWUgbmFtZSwgT2JqZWN0IG9iaikKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIGJpbmQobmFtZS50b1N0cmluZygpLCBvYmopOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQmluZHMgYSBuYW1lIHRvIGFuIG9iamVjdC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSB0byBiaW5kOyBtYXkgbm90IGJlIGVtcHR5CisgICAgICogQHBhcmFtIG9iaiB0aGUgb2JqZWN0IHRvIGJpbmQ7IHBvc3NpYmx5IG51bGwKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWVBbHJlYWR5Qm91bmRFeGNlcHRpb24gaWYgbmFtZSBpcyBhbHJlYWR5IGJvdW5kCisgICAgICogQGV4Y2VwdGlvbiBJbnZhbGlkQXR0cmlidXRlc0V4Y2VwdGlvbiBpZiBvYmplY3QgZGlkIG5vdCBzdXBwbHkgYWxsIAorICAgICAqIG1hbmRhdG9yeSBhdHRyaWJ1dGVzCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYmluZChTdHJpbmcgbmFtZSwgT2JqZWN0IG9iaikKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIGJpbmQobmFtZSwgb2JqLCBudWxsKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEJpbmRzIGEgbmFtZSB0byBhbiBvYmplY3QsIG92ZXJ3cml0aW5nIGFueSBleGlzdGluZyBiaW5kaW5nLiBBbGwgCisgICAgICogaW50ZXJtZWRpYXRlIGNvbnRleHRzIGFuZCB0aGUgdGFyZ2V0IGNvbnRleHQgKHRoYXQgbmFtZWQgYnkgYWxsIGJ1dCAKKyAgICAgKiB0ZXJtaW5hbCBhdG9taWMgY29tcG9uZW50IG9mIHRoZSBuYW1lKSBtdXN0IGFscmVhZHkgZXhpc3QuCisgICAgICogPHA+CisgICAgICogSWYgdGhlIG9iamVjdCBpcyBhIERpckNvbnRleHQsIGFueSBleGlzdGluZyBhdHRyaWJ1dGVzIGFzc29jaWF0ZWQgd2l0aCAKKyAgICAgKiB0aGUgbmFtZSBhcmUgcmVwbGFjZWQgd2l0aCB0aG9zZSBvZiB0aGUgb2JqZWN0LiBPdGhlcndpc2UsIGFueSAKKyAgICAgKiBleGlzdGluZyBhdHRyaWJ1dGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmFtZSByZW1haW4gdW5jaGFuZ2VkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIHRvIGJpbmQ7IG1heSBub3QgYmUgZW1wdHkKKyAgICAgKiBAcGFyYW0gb2JqIHRoZSBvYmplY3QgdG8gYmluZDsgcG9zc2libHkgbnVsbAorICAgICAqIEBleGNlcHRpb24gSW52YWxpZEF0dHJpYnV0ZXNFeGNlcHRpb24gaWYgb2JqZWN0IGRpZCBub3Qgc3VwcGx5IGFsbCAKKyAgICAgKiBtYW5kYXRvcnkgYXR0cmlidXRlcworICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlYmluZChOYW1lIG5hbWUsIE9iamVjdCBvYmopCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICByZWJpbmQobmFtZS50b1N0cmluZygpLCBvYmopOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQmluZHMgYSBuYW1lIHRvIGFuIG9iamVjdCwgb3ZlcndyaXRpbmcgYW55IGV4aXN0aW5nIGJpbmRpbmcuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgdG8gYmluZDsgbWF5IG5vdCBiZSBlbXB0eQorICAgICAqIEBwYXJhbSBvYmogdGhlIG9iamVjdCB0byBiaW5kOyBwb3NzaWJseSBudWxsCisgICAgICogQGV4Y2VwdGlvbiBJbnZhbGlkQXR0cmlidXRlc0V4Y2VwdGlvbiBpZiBvYmplY3QgZGlkIG5vdCBzdXBwbHkgYWxsIAorICAgICAqIG1hbmRhdG9yeSBhdHRyaWJ1dGVzCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmViaW5kKFN0cmluZyBuYW1lLCBPYmplY3Qgb2JqKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgcmViaW5kKG5hbWUsIG9iaiwgbnVsbCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBVbmJpbmRzIHRoZSBuYW1lZCBvYmplY3QuIFJlbW92ZXMgdGhlIHRlcm1pbmFsIGF0b21pYyBuYW1lIGluIG5hbWUgCisgICAgICogZnJvbSB0aGUgdGFyZ2V0IGNvbnRleHQtLXRoYXQgbmFtZWQgYnkgYWxsIGJ1dCB0aGUgdGVybWluYWwgYXRvbWljIAorICAgICAqIHBhcnQgb2YgbmFtZS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBpZGVtcG90ZW50LiBJdCBzdWNjZWVkcyBldmVuIGlmIHRoZSB0ZXJtaW5hbCBhdG9taWMgCisgICAgICogbmFtZSBpcyBub3QgYm91bmQgaW4gdGhlIHRhcmdldCBjb250ZXh0LCBidXQgdGhyb3dzIAorICAgICAqIE5hbWVOb3RGb3VuZEV4Y2VwdGlvbiBpZiBhbnkgb2YgdGhlIGludGVybWVkaWF0ZSBjb250ZXh0cyBkbyBub3QgZXhpc3QuIAorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIHRvIGJpbmQ7IG1heSBub3QgYmUgZW1wdHkKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWVOb3RGb3VuZEV4Y2VwdGlvbiBpZiBhbiBpbnRlcm1lZGlhdGUgY29udGV4dCBkb2VzIG5vdCAKKyAgICAgKiBleGlzdAorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHVuYmluZChOYW1lIG5hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICB1bmJpbmQobmFtZS50b1N0cmluZygpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFVuYmluZHMgdGhlIG5hbWVkIG9iamVjdC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSB0byBiaW5kOyBtYXkgbm90IGJlIGVtcHR5CisgICAgICogQGV4Y2VwdGlvbiBOYW1lTm90Rm91bmRFeGNlcHRpb24gaWYgYW4gaW50ZXJtZWRpYXRlIGNvbnRleHQgZG9lcyBub3QgCisgICAgICogZXhpc3QKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB1bmJpbmQoU3RyaW5nIG5hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb247CisKKworICAgIC8qKgorICAgICAqIEJpbmRzIGEgbmV3IG5hbWUgdG8gdGhlIG9iamVjdCBib3VuZCB0byBhbiBvbGQgbmFtZSwgYW5kIHVuYmluZHMgdGhlIAorICAgICAqIG9sZCBuYW1lLiBCb3RoIG5hbWVzIGFyZSByZWxhdGl2ZSB0byB0aGlzIGNvbnRleHQuIEFueSBhdHRyaWJ1dGVzIAorICAgICAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgb2xkIG5hbWUgYmVjb21lIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmV3IG5hbWUuIAorICAgICAqIEludGVybWVkaWF0ZSBjb250ZXh0cyBvZiB0aGUgb2xkIG5hbWUgYXJlIG5vdCBjaGFuZ2VkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBvbGROYW1lIHRoZSBuYW1lIG9mIHRoZSBleGlzdGluZyBiaW5kaW5nOyBtYXkgbm90IGJlIGVtcHR5CisgICAgICogQHBhcmFtIG5ld05hbWUgdGhlIG5hbWUgb2YgdGhlIG5ldyBiaW5kaW5nOyBtYXkgbm90IGJlIGVtcHR5CisgICAgICogQGV4Y2VwdGlvbiBOYW1lQWxyZWFkeUJvdW5kRXhjZXB0aW9uIGlmIG5ld05hbWUgaXMgYWxyZWFkeSBib3VuZAorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbmFtZShOYW1lIG9sZE5hbWUsIE5hbWUgbmV3TmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHJlbmFtZShvbGROYW1lLnRvU3RyaW5nKCksIG5ld05hbWUudG9TdHJpbmcoKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBCaW5kcyBhIG5ldyBuYW1lIHRvIHRoZSBvYmplY3QgYm91bmQgdG8gYW4gb2xkIG5hbWUsIGFuZCB1bmJpbmRzIHRoZSAKKyAgICAgKiBvbGQgbmFtZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb2xkTmFtZSB0aGUgbmFtZSBvZiB0aGUgZXhpc3RpbmcgYmluZGluZzsgbWF5IG5vdCBiZSBlbXB0eQorICAgICAqIEBwYXJhbSBuZXdOYW1lIHRoZSBuYW1lIG9mIHRoZSBuZXcgYmluZGluZzsgbWF5IG5vdCBiZSBlbXB0eQorICAgICAqIEBleGNlcHRpb24gTmFtZUFscmVhZHlCb3VuZEV4Y2VwdGlvbiBpZiBuZXdOYW1lIGlzIGFscmVhZHkgYm91bmQKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCByZW5hbWUoU3RyaW5nIG9sZE5hbWUsIFN0cmluZyBuZXdOYW1lKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uOworCisKKyAgICAvKioKKyAgICAgKiBFbnVtZXJhdGVzIHRoZSBuYW1lcyBib3VuZCBpbiB0aGUgbmFtZWQgY29udGV4dCwgYWxvbmcgd2l0aCB0aGUgY2xhc3MgCisgICAgICogbmFtZXMgb2Ygb2JqZWN0cyBib3VuZCB0byB0aGVtLiBUaGUgY29udGVudHMgb2YgYW55IHN1YmNvbnRleHRzIGFyZSAKKyAgICAgKiBub3QgaW5jbHVkZWQuCisgICAgICogPHA+CisgICAgICogSWYgYSBiaW5kaW5nIGlzIGFkZGVkIHRvIG9yIHJlbW92ZWQgZnJvbSB0aGlzIGNvbnRleHQsIGl0cyBlZmZlY3Qgb24gCisgICAgICogYW4gZW51bWVyYXRpb24gcHJldmlvdXNseSByZXR1cm5lZCBpcyB1bmRlZmluZWQuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbnRleHQgdG8gbGlzdAorICAgICAqIEByZXR1cm4gYW4gZW51bWVyYXRpb24gb2YgdGhlIG5hbWVzIGFuZCBjbGFzcyBuYW1lcyBvZiB0aGUgYmluZGluZ3MgaW4gCisgICAgICogdGhpcyBjb250ZXh0LiBFYWNoIGVsZW1lbnQgb2YgdGhlIGVudW1lcmF0aW9uIGlzIG9mIHR5cGUgTmFtZUNsYXNzUGFpci4KKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgTmFtaW5nRW51bWVyYXRpb24gbGlzdChOYW1lIG5hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbGlzdChuYW1lLnRvU3RyaW5nKCkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogRW51bWVyYXRlcyB0aGUgbmFtZXMgYm91bmQgaW4gdGhlIG5hbWVkIGNvbnRleHQsIGFsb25nIHdpdGggdGhlIGNsYXNzIAorICAgICAqIG5hbWVzIG9mIG9iamVjdHMgYm91bmQgdG8gdGhlbS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgY29udGV4dCB0byBsaXN0CisgICAgICogQHJldHVybiBhbiBlbnVtZXJhdGlvbiBvZiB0aGUgbmFtZXMgYW5kIGNsYXNzIG5hbWVzIG9mIHRoZSBiaW5kaW5ncyBpbiAKKyAgICAgKiB0aGlzIGNvbnRleHQuIEVhY2ggZWxlbWVudCBvZiB0aGUgZW51bWVyYXRpb24gaXMgb2YgdHlwZSBOYW1lQ2xhc3NQYWlyLgorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBOYW1pbmdFbnVtZXJhdGlvbiBsaXN0KFN0cmluZyBuYW1lKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uOworCisKKyAgICAvKioKKyAgICAgKiBFbnVtZXJhdGVzIHRoZSBuYW1lcyBib3VuZCBpbiB0aGUgbmFtZWQgY29udGV4dCwgYWxvbmcgd2l0aCB0aGUgCisgICAgICogb2JqZWN0cyBib3VuZCB0byB0aGVtLiBUaGUgY29udGVudHMgb2YgYW55IHN1YmNvbnRleHRzIGFyZSBub3QgCisgICAgICogaW5jbHVkZWQuCisgICAgICogPHA+CisgICAgICogSWYgYSBiaW5kaW5nIGlzIGFkZGVkIHRvIG9yIHJlbW92ZWQgZnJvbSB0aGlzIGNvbnRleHQsIGl0cyBlZmZlY3Qgb24gCisgICAgICogYW4gZW51bWVyYXRpb24gcHJldmlvdXNseSByZXR1cm5lZCBpcyB1bmRlZmluZWQuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbnRleHQgdG8gbGlzdAorICAgICAqIEByZXR1cm4gYW4gZW51bWVyYXRpb24gb2YgdGhlIGJpbmRpbmdzIGluIHRoaXMgY29udGV4dC4gCisgICAgICogRWFjaCBlbGVtZW50IG9mIHRoZSBlbnVtZXJhdGlvbiBpcyBvZiB0eXBlIEJpbmRpbmcuCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIE5hbWluZ0VudW1lcmF0aW9uIGxpc3RCaW5kaW5ncyhOYW1lIG5hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbGlzdEJpbmRpbmdzKG5hbWUudG9TdHJpbmcoKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBFbnVtZXJhdGVzIHRoZSBuYW1lcyBib3VuZCBpbiB0aGUgbmFtZWQgY29udGV4dCwgYWxvbmcgd2l0aCB0aGUgCisgICAgICogb2JqZWN0cyBib3VuZCB0byB0aGVtLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBjb250ZXh0IHRvIGxpc3QKKyAgICAgKiBAcmV0dXJuIGFuIGVudW1lcmF0aW9uIG9mIHRoZSBiaW5kaW5ncyBpbiB0aGlzIGNvbnRleHQuIAorICAgICAqIEVhY2ggZWxlbWVudCBvZiB0aGUgZW51bWVyYXRpb24gaXMgb2YgdHlwZSBCaW5kaW5nLgorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBOYW1pbmdFbnVtZXJhdGlvbiBsaXN0QmluZGluZ3MoU3RyaW5nIG5hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb247CisKKworICAgIC8qKgorICAgICAqIERlc3Ryb3lzIHRoZSBuYW1lZCBjb250ZXh0IGFuZCByZW1vdmVzIGl0IGZyb20gdGhlIG5hbWVzcGFjZS4gQW55IAorICAgICAqIGF0dHJpYnV0ZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBuYW1lIGFyZSBhbHNvIHJlbW92ZWQuIEludGVybWVkaWF0ZSAKKyAgICAgKiBjb250ZXh0cyBhcmUgbm90IGRlc3Ryb3llZC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBpZGVtcG90ZW50LiBJdCBzdWNjZWVkcyBldmVuIGlmIHRoZSB0ZXJtaW5hbCBhdG9taWMgCisgICAgICogbmFtZSBpcyBub3QgYm91bmQgaW4gdGhlIHRhcmdldCBjb250ZXh0LCBidXQgdGhyb3dzIAorICAgICAqIE5hbWVOb3RGb3VuZEV4Y2VwdGlvbiBpZiBhbnkgb2YgdGhlIGludGVybWVkaWF0ZSBjb250ZXh0cyBkbyBub3QgZXhpc3QuIAorICAgICAqIAorICAgICAqIEluIGEgZmVkZXJhdGVkIG5hbWluZyBzeXN0ZW0sIGEgY29udGV4dCBmcm9tIG9uZSBuYW1pbmcgc3lzdGVtIG1heSBiZSAKKyAgICAgKiBib3VuZCB0byBhIG5hbWUgaW4gYW5vdGhlci4gT25lIGNhbiBzdWJzZXF1ZW50bHkgbG9vayB1cCBhbmQgcGVyZm9ybSAKKyAgICAgKiBvcGVyYXRpb25zIG9uIHRoZSBmb3JlaWduIGNvbnRleHQgdXNpbmcgYSBjb21wb3NpdGUgbmFtZS4gSG93ZXZlciwgYW4gCisgICAgICogYXR0ZW1wdCBkZXN0cm95IHRoZSBjb250ZXh0IHVzaW5nIHRoaXMgY29tcG9zaXRlIG5hbWUgd2lsbCBmYWlsIHdpdGggCisgICAgICogTm90Q29udGV4dEV4Y2VwdGlvbiwgYmVjYXVzZSB0aGUgZm9yZWlnbiBjb250ZXh0IGlzIG5vdCBhICJzdWJjb250ZXh0IiAKKyAgICAgKiBvZiB0aGUgY29udGV4dCBpbiB3aGljaCBpdCBpcyBib3VuZC4gSW5zdGVhZCwgdXNlIHVuYmluZCgpIHRvIHJlbW92ZSAKKyAgICAgKiB0aGUgYmluZGluZyBvZiB0aGUgZm9yZWlnbiBjb250ZXh0LiBEZXN0cm95aW5nIHRoZSBmb3JlaWduIGNvbnRleHQgCisgICAgICogcmVxdWlyZXMgdGhhdCB0aGUgZGVzdHJveVN1YmNvbnRleHQoKSBiZSBwZXJmb3JtZWQgb24gYSBjb250ZXh0IGZyb20gCisgICAgICogdGhlIGZvcmVpZ24gY29udGV4dCdzICJuYXRpdmUiIG5hbWluZyBzeXN0ZW0uCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbnRleHQgdG8gYmUgZGVzdHJveWVkOyBtYXkgbm90IGJlIGVtcHR5CisgICAgICogQGV4Y2VwdGlvbiBOYW1lTm90Rm91bmRFeGNlcHRpb24gaWYgYW4gaW50ZXJtZWRpYXRlIGNvbnRleHQgZG9lcyBub3QgCisgICAgICogZXhpc3QKKyAgICAgKiBAZXhjZXB0aW9uIE5vdENvbnRleHRFeGNlcHRpb24gaWYgdGhlIG5hbWUgaXMgYm91bmQgYnV0IGRvZXMgbm90IG5hbWUgCisgICAgICogYSBjb250ZXh0LCBvciBkb2VzIG5vdCBuYW1lIGEgY29udGV4dCBvZiB0aGUgYXBwcm9wcmlhdGUgdHlwZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3lTdWJjb250ZXh0KE5hbWUgbmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIGRlc3Ryb3lTdWJjb250ZXh0KG5hbWUudG9TdHJpbmcoKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBEZXN0cm95cyB0aGUgbmFtZWQgY29udGV4dCBhbmQgcmVtb3ZlcyBpdCBmcm9tIHRoZSBuYW1lc3BhY2UuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbnRleHQgdG8gYmUgZGVzdHJveWVkOyBtYXkgbm90IGJlIGVtcHR5CisgICAgICogQGV4Y2VwdGlvbiBOYW1lTm90Rm91bmRFeGNlcHRpb24gaWYgYW4gaW50ZXJtZWRpYXRlIGNvbnRleHQgZG9lcyBub3QgCisgICAgICogZXhpc3QKKyAgICAgKiBAZXhjZXB0aW9uIE5vdENvbnRleHRFeGNlcHRpb24gaWYgdGhlIG5hbWUgaXMgYm91bmQgYnV0IGRvZXMgbm90IG5hbWUgCisgICAgICogYSBjb250ZXh0LCBvciBkb2VzIG5vdCBuYW1lIGEgY29udGV4dCBvZiB0aGUgYXBwcm9wcmlhdGUgdHlwZQorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGRlc3Ryb3lTdWJjb250ZXh0KFN0cmluZyBuYW1lKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uOworCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFuZCBiaW5kcyBhIG5ldyBjb250ZXh0LiBDcmVhdGVzIGEgbmV3IGNvbnRleHQgd2l0aCB0aGUgZ2l2ZW4gCisgICAgICogbmFtZSBhbmQgYmluZHMgaXQgaW4gdGhlIHRhcmdldCBjb250ZXh0ICh0aGF0IG5hbWVkIGJ5IGFsbCBidXQgCisgICAgICogdGVybWluYWwgYXRvbWljIGNvbXBvbmVudCBvZiB0aGUgbmFtZSkuIEFsbCBpbnRlcm1lZGlhdGUgY29udGV4dHMgYW5kIAorICAgICAqIHRoZSB0YXJnZXQgY29udGV4dCBtdXN0IGFscmVhZHkgZXhpc3QuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbnRleHQgdG8gY3JlYXRlOyBtYXkgbm90IGJlIGVtcHR5CisgICAgICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCBjb250ZXh0CisgICAgICogQGV4Y2VwdGlvbiBOYW1lQWxyZWFkeUJvdW5kRXhjZXB0aW9uIGlmIG5hbWUgaXMgYWxyZWFkeSBib3VuZAorICAgICAqIEBleGNlcHRpb24gSW52YWxpZEF0dHJpYnV0ZXNFeGNlcHRpb24gaWYgY3JlYXRpb24gb2YgdGhlIHN1YmNvbnRleHQgCisgICAgICogcmVxdWlyZXMgc3BlY2lmaWNhdGlvbiBvZiBtYW5kYXRvcnkgYXR0cmlidXRlcworICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBDb250ZXh0IGNyZWF0ZVN1YmNvbnRleHQoTmFtZSBuYW1lKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZVN1YmNvbnRleHQobmFtZS50b1N0cmluZygpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW5kIGJpbmRzIGEgbmV3IGNvbnRleHQuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbnRleHQgdG8gY3JlYXRlOyBtYXkgbm90IGJlIGVtcHR5CisgICAgICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCBjb250ZXh0CisgICAgICogQGV4Y2VwdGlvbiBOYW1lQWxyZWFkeUJvdW5kRXhjZXB0aW9uIGlmIG5hbWUgaXMgYWxyZWFkeSBib3VuZAorICAgICAqIEBleGNlcHRpb24gSW52YWxpZEF0dHJpYnV0ZXNFeGNlcHRpb24gaWYgY3JlYXRpb24gb2YgdGhlIHN1YmNvbnRleHQgCisgICAgICogcmVxdWlyZXMgc3BlY2lmaWNhdGlvbiBvZiBtYW5kYXRvcnkgYXR0cmlidXRlcworICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBDb250ZXh0IGNyZWF0ZVN1YmNvbnRleHQoU3RyaW5nIG5hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICByZXR1cm4gY3JlYXRlU3ViY29udGV4dChuYW1lLCBudWxsKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgbmFtZWQgb2JqZWN0LCBmb2xsb3dpbmcgbGlua3MgZXhjZXB0IGZvciB0aGUgdGVybWluYWwgCisgICAgICogYXRvbWljIGNvbXBvbmVudCBvZiB0aGUgbmFtZS4gSWYgdGhlIG9iamVjdCBib3VuZCB0byBuYW1lIGlzIG5vdCBhIAorICAgICAqIGxpbmssIHJldHVybnMgdGhlIG9iamVjdCBpdHNlbGYuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIG9iamVjdCB0byBsb29rIHVwCisgICAgICogQHJldHVybiB0aGUgb2JqZWN0IGJvdW5kIHRvIG5hbWUsIG5vdCBmb2xsb3dpbmcgdGhlIHRlcm1pbmFsIGxpbmsgCisgICAgICogKGlmIGFueSkuCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBsb29rdXBMaW5rKE5hbWUgbmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBsb29rdXBMaW5rKG5hbWUudG9TdHJpbmcoKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIG5hbWVkIG9iamVjdCwgZm9sbG93aW5nIGxpbmtzIGV4Y2VwdCBmb3IgdGhlIHRlcm1pbmFsIAorICAgICAqIGF0b21pYyBjb21wb25lbnQgb2YgdGhlIG5hbWUuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIG9iamVjdCB0byBsb29rIHVwCisgICAgICogQHJldHVybiB0aGUgb2JqZWN0IGJvdW5kIHRvIG5hbWUsIG5vdCBmb2xsb3dpbmcgdGhlIHRlcm1pbmFsIGxpbmsgCisgICAgICogKGlmIGFueSkuCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IE9iamVjdCBsb29rdXBMaW5rKFN0cmluZyBuYW1lKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uOworCisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIHBhcnNlciBhc3NvY2lhdGVkIHdpdGggdGhlIG5hbWVkIGNvbnRleHQuIEluIGEgCisgICAgICogZmVkZXJhdGlvbiBvZiBuYW1lc3BhY2VzLCBkaWZmZXJlbnQgbmFtaW5nIHN5c3RlbXMgd2lsbCBwYXJzZSBuYW1lcyAKKyAgICAgKiBkaWZmZXJlbnRseS4gVGhpcyBtZXRob2QgYWxsb3dzIGFuIGFwcGxpY2F0aW9uIHRvIGdldCBhIHBhcnNlciBmb3IgCisgICAgICogcGFyc2luZyBuYW1lcyBpbnRvIHRoZWlyIGF0b21pYyBjb21wb25lbnRzIHVzaW5nIHRoZSBuYW1pbmcgY29udmVudGlvbiAKKyAgICAgKiBvZiBhIHBhcnRpY3VsYXIgbmFtaW5nIHN5c3RlbS4gV2l0aGluIGFueSBzaW5nbGUgbmFtaW5nIHN5c3RlbSwgCisgICAgICogTmFtZVBhcnNlciBvYmplY3RzIHJldHVybmVkIGJ5IHRoaXMgbWV0aG9kIG11c3QgYmUgZXF1YWwgKHVzaW5nIHRoZSAKKyAgICAgKiBlcXVhbHMoKSB0ZXN0KS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgY29udGV4dCBmcm9tIHdoaWNoIHRvIGdldCB0aGUgcGFyc2VyCisgICAgICogQHJldHVybiBhIG5hbWUgcGFyc2VyIHRoYXQgY2FuIHBhcnNlIGNvbXBvdW5kIG5hbWVzIGludG8gdGhlaXIgYXRvbWljIAorICAgICAqIGNvbXBvbmVudHMKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgTmFtZVBhcnNlciBnZXROYW1lUGFyc2VyKE5hbWUgbmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgTmFtZVBhcnNlckltcGwoKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgcGFyc2VyIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmFtZWQgY29udGV4dC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgY29udGV4dCBmcm9tIHdoaWNoIHRvIGdldCB0aGUgcGFyc2VyCisgICAgICogQHJldHVybiBhIG5hbWUgcGFyc2VyIHRoYXQgY2FuIHBhcnNlIGNvbXBvdW5kIG5hbWVzIGludG8gdGhlaXIgYXRvbWljIAorICAgICAqIGNvbXBvbmVudHMKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgTmFtZVBhcnNlciBnZXROYW1lUGFyc2VyKFN0cmluZyBuYW1lKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBOYW1lUGFyc2VySW1wbCgpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29tcG9zZXMgdGhlIG5hbWUgb2YgdGhpcyBjb250ZXh0IHdpdGggYSBuYW1lIHJlbGF0aXZlIHRvIHRoaXMgY29udGV4dC4KKyAgICAgKiA8cD4KKyAgICAgKiBHaXZlbiBhIG5hbWUgKG5hbWUpIHJlbGF0aXZlIHRvIHRoaXMgY29udGV4dCwgYW5kIHRoZSBuYW1lIChwcmVmaXgpIAorICAgICAqIG9mIHRoaXMgY29udGV4dCByZWxhdGl2ZSB0byBvbmUgb2YgaXRzIGFuY2VzdG9ycywgdGhpcyBtZXRob2QgcmV0dXJucyAKKyAgICAgKiB0aGUgY29tcG9zaXRpb24gb2YgdGhlIHR3byBuYW1lcyB1c2luZyB0aGUgc3ludGF4IGFwcHJvcHJpYXRlIGZvciB0aGUgCisgICAgICogbmFtaW5nIHN5c3RlbShzKSBpbnZvbHZlZC4gVGhhdCBpcywgaWYgbmFtZSBuYW1lcyBhbiBvYmplY3QgcmVsYXRpdmUgCisgICAgICogdG8gdGhpcyBjb250ZXh0LCB0aGUgcmVzdWx0IGlzIHRoZSBuYW1lIG9mIHRoZSBzYW1lIG9iamVjdCwgYnV0IAorICAgICAqIHJlbGF0aXZlIHRvIHRoZSBhbmNlc3RvciBjb250ZXh0LiBOb25lIG9mIHRoZSBuYW1lcyBtYXkgYmUgbnVsbC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSBhIG5hbWUgcmVsYXRpdmUgdG8gdGhpcyBjb250ZXh0CisgICAgICogQHBhcmFtIHByZWZpeCB0aGUgbmFtZSBvZiB0aGlzIGNvbnRleHQgcmVsYXRpdmUgdG8gb25lIG9mIGl0cyBhbmNlc3RvcnMKKyAgICAgKiBAcmV0dXJuIHRoZSBjb21wb3NpdGlvbiBvZiBwcmVmaXggYW5kIG5hbWUKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgTmFtZSBjb21wb3NlTmFtZShOYW1lIG5hbWUsIE5hbWUgcHJlZml4KQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKwlwcmVmaXggPSAoTmFtZSkgbmFtZS5jbG9uZSgpOworCXJldHVybiBwcmVmaXguYWRkQWxsKG5hbWUpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29tcG9zZXMgdGhlIG5hbWUgb2YgdGhpcyBjb250ZXh0IHdpdGggYSBuYW1lIHJlbGF0aXZlIHRvIHRoaXMgY29udGV4dC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSBhIG5hbWUgcmVsYXRpdmUgdG8gdGhpcyBjb250ZXh0CisgICAgICogQHBhcmFtIHByZWZpeCB0aGUgbmFtZSBvZiB0aGlzIGNvbnRleHQgcmVsYXRpdmUgdG8gb25lIG9mIGl0cyBhbmNlc3RvcnMKKyAgICAgKiBAcmV0dXJuIHRoZSBjb21wb3NpdGlvbiBvZiBwcmVmaXggYW5kIG5hbWUKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGNvbXBvc2VOYW1lKFN0cmluZyBuYW1lLCBTdHJpbmcgcHJlZml4KQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHByZWZpeCArICIvIiArIG5hbWU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgbmV3IGVudmlyb25tZW50IHByb3BlcnR5IHRvIHRoZSBlbnZpcm9ubWVudCBvZiB0aGlzIGNvbnRleHQuIElmIAorICAgICAqIHRoZSBwcm9wZXJ0eSBhbHJlYWR5IGV4aXN0cywgaXRzIHZhbHVlIGlzIG92ZXJ3cml0dGVuLgorICAgICAqIAorICAgICAqIEBwYXJhbSBwcm9wTmFtZSB0aGUgbmFtZSBvZiB0aGUgZW52aXJvbm1lbnQgcHJvcGVydHkgdG8gYWRkOyBtYXkgbm90IAorICAgICAqIGJlIG51bGwKKyAgICAgKiBAcGFyYW0gcHJvcFZhbCB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IHRvIGFkZDsgbWF5IG5vdCBiZSBudWxsCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBhZGRUb0Vudmlyb25tZW50KFN0cmluZyBwcm9wTmFtZSwgT2JqZWN0IHByb3BWYWwpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZW52LnB1dChwcm9wTmFtZSwgcHJvcFZhbCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIGFuIGVudmlyb25tZW50IHByb3BlcnR5IGZyb20gdGhlIGVudmlyb25tZW50IG9mIHRoaXMgY29udGV4dC4gCisgICAgICogCisgICAgICogQHBhcmFtIHByb3BOYW1lIHRoZSBuYW1lIG9mIHRoZSBlbnZpcm9ubWVudCBwcm9wZXJ0eSB0byByZW1vdmU7IAorICAgICAqIG1heSBub3QgYmUgbnVsbAorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgcmVtb3ZlRnJvbUVudmlyb25tZW50KFN0cmluZyBwcm9wTmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBlbnYucmVtb3ZlKHByb3BOYW1lKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgZW52aXJvbm1lbnQgaW4gZWZmZWN0IGZvciB0aGlzIGNvbnRleHQuIFNlZSBjbGFzcyAKKyAgICAgKiBkZXNjcmlwdGlvbiBmb3IgbW9yZSBkZXRhaWxzIG9uIGVudmlyb25tZW50IHByb3BlcnRpZXMuIAorICAgICAqIFRoZSBjYWxsZXIgc2hvdWxkIG5vdCBtYWtlIGFueSBjaGFuZ2VzIHRvIHRoZSBvYmplY3QgcmV0dXJuZWQ6IHRoZWlyIAorICAgICAqIGVmZmVjdCBvbiB0aGUgY29udGV4dCBpcyB1bmRlZmluZWQuIFRoZSBlbnZpcm9ubWVudCBvZiB0aGlzIGNvbnRleHQgCisgICAgICogbWF5IGJlIGNoYW5nZWQgdXNpbmcgYWRkVG9FbnZpcm9ubWVudCgpIGFuZCByZW1vdmVGcm9tRW52aXJvbm1lbnQoKS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBlbnZpcm9ubWVudCBvZiB0aGlzIGNvbnRleHQ7IG5ldmVyIG51bGwKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgSGFzaHRhYmxlIGdldEVudmlyb25tZW50KCkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBlbnY7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDbG9zZXMgdGhpcyBjb250ZXh0LiBUaGlzIG1ldGhvZCByZWxlYXNlcyB0aGlzIGNvbnRleHQncyByZXNvdXJjZXMgCisgICAgICogaW1tZWRpYXRlbHksIGluc3RlYWQgb2Ygd2FpdGluZyBmb3IgdGhlbSB0byBiZSByZWxlYXNlZCBhdXRvbWF0aWNhbGx5IAorICAgICAqIGJ5IHRoZSBnYXJiYWdlIGNvbGxlY3Rvci4KKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBpZGVtcG90ZW50OiBpbnZva2luZyBpdCBvbiBhIGNvbnRleHQgdGhhdCBoYXMgYWxyZWFkeSAKKyAgICAgKiBiZWVuIGNsb3NlZCBoYXMgbm8gZWZmZWN0LiBJbnZva2luZyBhbnkgb3RoZXIgbWV0aG9kIG9uIGEgY2xvc2VkIAorICAgICAqIGNvbnRleHQgaXMgbm90IGFsbG93ZWQsIGFuZCByZXN1bHRzIGluIHVuZGVmaW5lZCBiZWhhdmlvdXIuCisgICAgICogCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xvc2UoKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgZW52LmNsZWFyKCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIGZ1bGwgbmFtZSBvZiB0aGlzIGNvbnRleHQgd2l0aGluIGl0cyBvd24gbmFtZXNwYWNlLgorICAgICAqIDxwPgorICAgICAqIE1hbnkgbmFtaW5nIHNlcnZpY2VzIGhhdmUgYSBub3Rpb24gb2YgYSAiZnVsbCBuYW1lIiBmb3Igb2JqZWN0cyBpbiAKKyAgICAgKiB0aGVpciByZXNwZWN0aXZlIG5hbWVzcGFjZXMuIEZvciBleGFtcGxlLCBhbiBMREFQIGVudHJ5IGhhcyBhIAorICAgICAqIGRpc3Rpbmd1aXNoZWQgbmFtZSwgYW5kIGEgRE5TIHJlY29yZCBoYXMgYSBmdWxseSBxdWFsaWZpZWQgbmFtZS4gVGhpcyAKKyAgICAgKiBtZXRob2QgYWxsb3dzIHRoZSBjbGllbnQgYXBwbGljYXRpb24gdG8gcmV0cmlldmUgdGhpcyBuYW1lLiBUaGUgc3RyaW5nIAorICAgICAqIHJldHVybmVkIGJ5IHRoaXMgbWV0aG9kIGlzIG5vdCBhIEpOREkgY29tcG9zaXRlIG5hbWUgYW5kIHNob3VsZCBub3QgYmUgCisgICAgICogcGFzc2VkIGRpcmVjdGx5IHRvIGNvbnRleHQgbWV0aG9kcy4gSW4gbmFtaW5nIHN5c3RlbXMgZm9yIHdoaWNoIHRoZSAKKyAgICAgKiBub3Rpb24gb2YgZnVsbCBuYW1lIGRvZXMgbm90IG1ha2Ugc2Vuc2UsIAorICAgICAqIE9wZXJhdGlvbk5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBpcyB0aHJvd24uCisgICAgICogCisgICAgICogQHJldHVybiB0aGlzIGNvbnRleHQncyBuYW1lIGluIGl0cyBvd24gbmFtZXNwYWNlOyBuZXZlciBudWxsCisgICAgICogQGV4Y2VwdGlvbiBPcGVyYXRpb25Ob3RTdXBwb3J0ZWRFeGNlcHRpb24gaWYgdGhlIG5hbWluZyBzeXN0ZW0gZG9lcyAKKyAgICAgKiBub3QgaGF2ZSB0aGUgbm90aW9uIG9mIGEgZnVsbCBuYW1lCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXROYW1lSW5OYW1lc3BhY2UoKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBEaXJDb250ZXh0IE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIGFsbCBvZiB0aGUgYXR0cmlidXRlcyBhc3NvY2lhdGVkIHdpdGggYSBuYW1lZCBvYmplY3QuIAorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHNldCBvZiBhdHRyaWJ1dGVzIGFzc29jaWF0ZWQgd2l0aCBuYW1lLiAKKyAgICAgKiBSZXR1cm5zIGFuIGVtcHR5IGF0dHJpYnV0ZSBzZXQgaWYgbmFtZSBoYXMgbm8gYXR0cmlidXRlczsgbmV2ZXIgbnVsbC4KKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgb2JqZWN0IGZyb20gd2hpY2ggdG8gcmV0cmlldmUgYXR0cmlidXRlcworICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBBdHRyaWJ1dGVzIGdldEF0dHJpYnV0ZXMoTmFtZSBuYW1lKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGdldEF0dHJpYnV0ZXMobmFtZS50b1N0cmluZygpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyBhbGwgb2YgdGhlIGF0dHJpYnV0ZXMgYXNzb2NpYXRlZCB3aXRoIGEgbmFtZWQgb2JqZWN0LgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHNldCBvZiBhdHRyaWJ1dGVzIGFzc29jaWF0ZWQgd2l0aCBuYW1lCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIG9iamVjdCBmcm9tIHdoaWNoIHRvIHJldHJpZXZlIGF0dHJpYnV0ZXMKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgQXR0cmlidXRlcyBnZXRBdHRyaWJ1dGVzKFN0cmluZyBuYW1lKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGdldEF0dHJpYnV0ZXMobmFtZSwgbnVsbCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgc2VsZWN0ZWQgYXR0cmlidXRlcyBhc3NvY2lhdGVkIHdpdGggYSBuYW1lZCBvYmplY3QuIAorICAgICAqIFNlZSB0aGUgY2xhc3MgZGVzY3JpcHRpb24gcmVnYXJkaW5nIGF0dHJpYnV0ZSBtb2RlbHMsIGF0dHJpYnV0ZSB0eXBlIAorICAgICAqIG5hbWVzLCBhbmQgb3BlcmF0aW9uYWwgYXR0cmlidXRlcy4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSByZXF1ZXN0ZWQgYXR0cmlidXRlczsgbmV2ZXIgbnVsbAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBvYmplY3QgZnJvbSB3aGljaCB0byByZXRyaWV2ZSBhdHRyaWJ1dGVzCisgICAgICogQHBhcmFtIGF0dHJJZHMgdGhlIGlkZW50aWZpZXJzIG9mIHRoZSBhdHRyaWJ1dGVzIHRvIHJldHJpZXZlLiBudWxsIAorICAgICAqIGluZGljYXRlcyB0aGF0IGFsbCBhdHRyaWJ1dGVzIHNob3VsZCBiZSByZXRyaWV2ZWQ7IGFuIGVtcHR5IGFycmF5IAorICAgICAqIGluZGljYXRlcyB0aGF0IG5vbmUgc2hvdWxkIGJlIHJldHJpZXZlZAorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBBdHRyaWJ1dGVzIGdldEF0dHJpYnV0ZXMoTmFtZSBuYW1lLCBTdHJpbmdbXSBhdHRySWRzKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGdldEF0dHJpYnV0ZXMobmFtZS50b1N0cmluZygpLCBhdHRySWRzKTsKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHNlbGVjdGVkIGF0dHJpYnV0ZXMgYXNzb2NpYXRlZCB3aXRoIGEgbmFtZWQgb2JqZWN0LgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHJlcXVlc3RlZCBhdHRyaWJ1dGVzOyBuZXZlciBudWxsCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIG9iamVjdCBmcm9tIHdoaWNoIHRvIHJldHJpZXZlIGF0dHJpYnV0ZXMKKyAgICAgKiBAcGFyYW0gYXR0cklkcyB0aGUgaWRlbnRpZmllcnMgb2YgdGhlIGF0dHJpYnV0ZXMgdG8gcmV0cmlldmUuIG51bGwgCisgICAgICogaW5kaWNhdGVzIHRoYXQgYWxsIGF0dHJpYnV0ZXMgc2hvdWxkIGJlIHJldHJpZXZlZDsgYW4gZW1wdHkgYXJyYXkgCisgICAgICogaW5kaWNhdGVzIHRoYXQgbm9uZSBzaG91bGQgYmUgcmV0cmlldmVkCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IEF0dHJpYnV0ZXMgZ2V0QXR0cmlidXRlcyhTdHJpbmcgbmFtZSwgU3RyaW5nW10gYXR0cklkcykKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbjsKKworCisgICAgLyoqCisgICAgICogTW9kaWZpZXMgdGhlIGF0dHJpYnV0ZXMgYXNzb2NpYXRlZCB3aXRoIGEgbmFtZWQgb2JqZWN0LiBUaGUgb3JkZXIgb2YgCisgICAgICogdGhlIG1vZGlmaWNhdGlvbnMgaXMgbm90IHNwZWNpZmllZC4gV2hlcmUgcG9zc2libGUsIHRoZSBtb2RpZmljYXRpb25zIAorICAgICAqIGFyZSBwZXJmb3JtZWQgYXRvbWljYWxseS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgb2JqZWN0IHdob3NlIGF0dHJpYnV0ZXMgd2lsbCBiZSB1cGRhdGVkCisgICAgICogQHBhcmFtIG1vZF9vcCB0aGUgbW9kaWZpY2F0aW9uIG9wZXJhdGlvbiwgb25lIG9mOiBBRERfQVRUUklCVVRFLCAKKyAgICAgKiBSRVBMQUNFX0FUVFJJQlVURSwgUkVNT1ZFX0FUVFJJQlVURQorICAgICAqIEBwYXJhbSBhdHRycyB0aGUgYXR0cmlidXRlcyB0byBiZSB1c2VkIGZvciB0aGUgbW9kaWZpY2F0aW9uOyBtYXkgbm90IAorICAgICAqIGJlIG51bGwKKyAgICAgKiBAZXhjZXB0aW9uIEF0dHJpYnV0ZU1vZGlmaWNhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgbW9kaWZpY2F0aW9uIGNhbm5vdCBiZQorICAgICAqIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBtb2RpZnlBdHRyaWJ1dGVzKE5hbWUgbmFtZSwgaW50IG1vZF9vcCwgQXR0cmlidXRlcyBhdHRycykKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIG1vZGlmeUF0dHJpYnV0ZXMobmFtZS50b1N0cmluZygpLCBtb2Rfb3AsIGF0dHJzKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIE1vZGlmaWVzIHRoZSBhdHRyaWJ1dGVzIGFzc29jaWF0ZWQgd2l0aCBhIG5hbWVkIG9iamVjdC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgb2JqZWN0IHdob3NlIGF0dHJpYnV0ZXMgd2lsbCBiZSB1cGRhdGVkCisgICAgICogQHBhcmFtIG1vZF9vcCB0aGUgbW9kaWZpY2F0aW9uIG9wZXJhdGlvbiwgb25lIG9mOiBBRERfQVRUUklCVVRFLCAKKyAgICAgKiBSRVBMQUNFX0FUVFJJQlVURSwgUkVNT1ZFX0FUVFJJQlVURQorICAgICAqIEBwYXJhbSBhdHRycyB0aGUgYXR0cmlidXRlcyB0byBiZSB1c2VkIGZvciB0aGUgbW9kaWZpY2F0aW9uOyBtYXkgbm90IAorICAgICAqIGJlIG51bGwKKyAgICAgKiBAZXhjZXB0aW9uIEF0dHJpYnV0ZU1vZGlmaWNhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgbW9kaWZpY2F0aW9uIGNhbm5vdCBiZQorICAgICAqIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBtb2RpZnlBdHRyaWJ1dGVzCisgICAgICAgIChTdHJpbmcgbmFtZSwgaW50IG1vZF9vcCwgQXR0cmlidXRlcyBhdHRycykKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbjsKKworCisgICAgLyoqCisgICAgICogTW9kaWZpZXMgdGhlIGF0dHJpYnV0ZXMgYXNzb2NpYXRlZCB3aXRoIGEgbmFtZWQgb2JqZWN0IHVzaW5nIGFuIGFuIAorICAgICAqIG9yZGVyZWQgbGlzdCBvZiBtb2RpZmljYXRpb25zLiBUaGUgbW9kaWZpY2F0aW9ucyBhcmUgcGVyZm9ybWVkIGluIHRoZSAKKyAgICAgKiBvcmRlciBzcGVjaWZpZWQuIEVhY2ggbW9kaWZpY2F0aW9uIHNwZWNpZmllcyBhIG1vZGlmaWNhdGlvbiBvcGVyYXRpb24gCisgICAgICogY29kZSBhbmQgYW4gYXR0cmlidXRlIG9uIHdoaWNoIHRvIG9wZXJhdGUuIFdoZXJlIHBvc3NpYmxlLCB0aGUgCisgICAgICogbW9kaWZpY2F0aW9ucyBhcmUgcGVyZm9ybWVkIGF0b21pY2FsbHkuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIG9iamVjdCB3aG9zZSBhdHRyaWJ1dGVzIHdpbGwgYmUgdXBkYXRlZAorICAgICAqIEBwYXJhbSBtb2RzIGFuIG9yZGVyZWQgc2VxdWVuY2Ugb2YgbW9kaWZpY2F0aW9ucyB0byBiZSBwZXJmb3JtZWQ7IG1heSAKKyAgICAgKiBub3QgYmUgbnVsbAorICAgICAqIEBleGNlcHRpb24gQXR0cmlidXRlTW9kaWZpY2F0aW9uRXhjZXB0aW9uIGlmIHRoZSBtb2RpZmljYXRpb24gY2Fubm90IGJlCisgICAgICogY29tcGxldGVkIHN1Y2Nlc3NmdWxseQorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG1vZGlmeUF0dHJpYnV0ZXMoTmFtZSBuYW1lLCBNb2RpZmljYXRpb25JdGVtW10gbW9kcykKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIG1vZGlmeUF0dHJpYnV0ZXMobmFtZS50b1N0cmluZygpLCBtb2RzKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIE1vZGlmaWVzIHRoZSBhdHRyaWJ1dGVzIGFzc29jaWF0ZWQgd2l0aCBhIG5hbWVkIG9iamVjdCB1c2luZyBhbiBhbiAKKyAgICAgKiBvcmRlcmVkIGxpc3Qgb2YgbW9kaWZpY2F0aW9ucy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgb2JqZWN0IHdob3NlIGF0dHJpYnV0ZXMgd2lsbCBiZSB1cGRhdGVkCisgICAgICogQHBhcmFtIG1vZHMgYW4gb3JkZXJlZCBzZXF1ZW5jZSBvZiBtb2RpZmljYXRpb25zIHRvIGJlIHBlcmZvcm1lZDsgbWF5IAorICAgICAqIG5vdCBiZSBudWxsCisgICAgICogQGV4Y2VwdGlvbiBBdHRyaWJ1dGVNb2RpZmljYXRpb25FeGNlcHRpb24gaWYgdGhlIG1vZGlmaWNhdGlvbiBjYW5ub3QgYmUKKyAgICAgKiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5CisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgbW9kaWZ5QXR0cmlidXRlcyhTdHJpbmcgbmFtZSwgTW9kaWZpY2F0aW9uSXRlbVtdIG1vZHMpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb247CisKKworICAgIC8qKgorICAgICAqIEJpbmRzIGEgbmFtZSB0byBhbiBvYmplY3QsIGFsb25nIHdpdGggYXNzb2NpYXRlZCBhdHRyaWJ1dGVzLiBJZiBhdHRycyAKKyAgICAgKiBpcyBudWxsLCB0aGUgcmVzdWx0aW5nIGJpbmRpbmcgd2lsbCBoYXZlIHRoZSBhdHRyaWJ1dGVzIGFzc29jaWF0ZWQgCisgICAgICogd2l0aCBvYmogaWYgb2JqIGlzIGEgRGlyQ29udGV4dCwgYW5kIG5vIGF0dHJpYnV0ZXMgb3RoZXJ3aXNlLiBJZiBhdHRycyAKKyAgICAgKiBpcyBub24tbnVsbCwgdGhlIHJlc3VsdGluZyBiaW5kaW5nIHdpbGwgaGF2ZSBhdHRycyBhcyBpdHMgYXR0cmlidXRlczsgCisgICAgICogYW55IGF0dHJpYnV0ZXMgYXNzb2NpYXRlZCB3aXRoIG9iaiBhcmUgaWdub3JlZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSB0byBiaW5kOyBtYXkgbm90IGJlIGVtcHR5CisgICAgICogQHBhcmFtIG9iaiB0aGUgb2JqZWN0IHRvIGJpbmQ7IHBvc3NpYmx5IG51bGwKKyAgICAgKiBAcGFyYW0gYXR0cnMgdGhlIGF0dHJpYnV0ZXMgdG8gYXNzb2NpYXRlIHdpdGggdGhlIGJpbmRpbmcKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWVBbHJlYWR5Qm91bmRFeGNlcHRpb24gaWYgbmFtZSBpcyBhbHJlYWR5IGJvdW5kCisgICAgICogQGV4Y2VwdGlvbiBJbnZhbGlkQXR0cmlidXRlc0V4Y2VwdGlvbiBpZiBzb21lICJtYW5kYXRvcnkiIGF0dHJpYnV0ZXMgCisgICAgICogb2YgdGhlIGJpbmRpbmcgYXJlIG5vdCBzdXBwbGllZAorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGJpbmQoTmFtZSBuYW1lLCBPYmplY3Qgb2JqLCBBdHRyaWJ1dGVzIGF0dHJzKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgYmluZChuYW1lLnRvU3RyaW5nKCksIG9iaiwgYXR0cnMpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQmluZHMgYSBuYW1lIHRvIGFuIG9iamVjdCwgYWxvbmcgd2l0aCBhc3NvY2lhdGVkIGF0dHJpYnV0ZXMuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgdG8gYmluZDsgbWF5IG5vdCBiZSBlbXB0eQorICAgICAqIEBwYXJhbSBvYmogdGhlIG9iamVjdCB0byBiaW5kOyBwb3NzaWJseSBudWxsCisgICAgICogQHBhcmFtIGF0dHJzIHRoZSBhdHRyaWJ1dGVzIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBiaW5kaW5nCisgICAgICogQGV4Y2VwdGlvbiBOYW1lQWxyZWFkeUJvdW5kRXhjZXB0aW9uIGlmIG5hbWUgaXMgYWxyZWFkeSBib3VuZAorICAgICAqIEBleGNlcHRpb24gSW52YWxpZEF0dHJpYnV0ZXNFeGNlcHRpb24gaWYgc29tZSAibWFuZGF0b3J5IiBhdHRyaWJ1dGVzIAorICAgICAqIG9mIHRoZSBiaW5kaW5nIGFyZSBub3Qgc3VwcGxpZWQKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBiaW5kKFN0cmluZyBuYW1lLCBPYmplY3Qgb2JqLCBBdHRyaWJ1dGVzIGF0dHJzKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uOworCisKKyAgICAvKioKKyAgICAgKiBCaW5kcyBhIG5hbWUgdG8gYW4gb2JqZWN0LCBhbG9uZyB3aXRoIGFzc29jaWF0ZWQgYXR0cmlidXRlcywgCisgICAgICogb3ZlcndyaXRpbmcgYW55IGV4aXN0aW5nIGJpbmRpbmcuIElmIGF0dHJzIGlzIG51bGwgYW5kIG9iaiBpcyBhIAorICAgICAqIERpckNvbnRleHQsIHRoZSBhdHRyaWJ1dGVzIGZyb20gb2JqIGFyZSB1c2VkLiBJZiBhdHRycyBpcyBudWxsIGFuZCBvYmogCisgICAgICogaXMgbm90IGEgRGlyQ29udGV4dCwgYW55IGV4aXN0aW5nIGF0dHJpYnV0ZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBvYmplY3QKKyAgICAgKiBhbHJlYWR5IGJvdW5kIGluIHRoZSBkaXJlY3RvcnkgcmVtYWluIHVuY2hhbmdlZC4gSWYgYXR0cnMgaXMgbm9uLW51bGwsIAorICAgICAqIGFueSBleGlzdGluZyBhdHRyaWJ1dGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgb2JqZWN0IGFscmVhZHkgYm91bmQgaW4gCisgICAgICogdGhlIGRpcmVjdG9yeSBhcmUgcmVtb3ZlZCBhbmQgYXR0cnMgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBuYW1lZCAKKyAgICAgKiBvYmplY3QuIElmIG9iaiBpcyBhIERpckNvbnRleHQgYW5kIGF0dHJzIGlzIG5vbi1udWxsLCB0aGUgYXR0cmlidXRlcyAKKyAgICAgKiBvZiBvYmogYXJlIGlnbm9yZWQuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgdG8gYmluZDsgbWF5IG5vdCBiZSBlbXB0eQorICAgICAqIEBwYXJhbSBvYmogdGhlIG9iamVjdCB0byBiaW5kOyBwb3NzaWJseSBudWxsCisgICAgICogQHBhcmFtIGF0dHJzIHRoZSBhdHRyaWJ1dGVzIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBiaW5kaW5nCisgICAgICogQGV4Y2VwdGlvbiBJbnZhbGlkQXR0cmlidXRlc0V4Y2VwdGlvbiBpZiBzb21lICJtYW5kYXRvcnkiIGF0dHJpYnV0ZXMgCisgICAgICogb2YgdGhlIGJpbmRpbmcgYXJlIG5vdCBzdXBwbGllZAorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlYmluZChOYW1lIG5hbWUsIE9iamVjdCBvYmosIEF0dHJpYnV0ZXMgYXR0cnMpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICByZWJpbmQobmFtZS50b1N0cmluZygpLCBvYmosIGF0dHJzKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEJpbmRzIGEgbmFtZSB0byBhbiBvYmplY3QsIGFsb25nIHdpdGggYXNzb2NpYXRlZCBhdHRyaWJ1dGVzLCAKKyAgICAgKiBvdmVyd3JpdGluZyBhbnkgZXhpc3RpbmcgYmluZGluZy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSB0byBiaW5kOyBtYXkgbm90IGJlIGVtcHR5CisgICAgICogQHBhcmFtIG9iaiB0aGUgb2JqZWN0IHRvIGJpbmQ7IHBvc3NpYmx5IG51bGwKKyAgICAgKiBAcGFyYW0gYXR0cnMgdGhlIGF0dHJpYnV0ZXMgdG8gYXNzb2NpYXRlIHdpdGggdGhlIGJpbmRpbmcKKyAgICAgKiBAZXhjZXB0aW9uIEludmFsaWRBdHRyaWJ1dGVzRXhjZXB0aW9uIGlmIHNvbWUgIm1hbmRhdG9yeSIgYXR0cmlidXRlcyAKKyAgICAgKiBvZiB0aGUgYmluZGluZyBhcmUgbm90IHN1cHBsaWVkCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgcmViaW5kKFN0cmluZyBuYW1lLCBPYmplY3Qgb2JqLCBBdHRyaWJ1dGVzIGF0dHJzKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uOworCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFuZCBiaW5kcyBhIG5ldyBjb250ZXh0LCBhbG9uZyB3aXRoIGFzc29jaWF0ZWQgYXR0cmlidXRlcy4gCisgICAgICogVGhpcyBtZXRob2QgY3JlYXRlcyBhIG5ldyBzdWJjb250ZXh0IHdpdGggdGhlIGdpdmVuIG5hbWUsIGJpbmRzIGl0IGluIAorICAgICAqIHRoZSB0YXJnZXQgY29udGV4dCAodGhhdCBuYW1lZCBieSBhbGwgYnV0IHRlcm1pbmFsIGF0b21pYyBjb21wb25lbnQgb2YgCisgICAgICogdGhlIG5hbWUpLCBhbmQgYXNzb2NpYXRlcyB0aGUgc3VwcGxpZWQgYXR0cmlidXRlcyB3aXRoIHRoZSBuZXdseSAKKyAgICAgKiBjcmVhdGVkIG9iamVjdC4gQWxsIGludGVybWVkaWF0ZSBhbmQgdGFyZ2V0IGNvbnRleHRzIG11c3QgYWxyZWFkeSAKKyAgICAgKiBleGlzdC4gSWYgYXR0cnMgaXMgbnVsbCwgdGhpcyBtZXRob2QgaXMgZXF1aXZhbGVudCB0byAKKyAgICAgKiBDb250ZXh0LmNyZWF0ZVN1YmNvbnRleHQoKS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgY29udGV4dCB0byBjcmVhdGU7IG1heSBub3QgYmUgZW1wdHkKKyAgICAgKiBAcGFyYW0gYXR0cnMgdGhlIGF0dHJpYnV0ZXMgdG8gYXNzb2NpYXRlIHdpdGggdGhlIG5ld2x5IGNyZWF0ZWQgY29udGV4dAorICAgICAqIEByZXR1cm4gdGhlIG5ld2x5IGNyZWF0ZWQgY29udGV4dAorICAgICAqIEBleGNlcHRpb24gTmFtZUFscmVhZHlCb3VuZEV4Y2VwdGlvbiBpZiB0aGUgbmFtZSBpcyBhbHJlYWR5IGJvdW5kCisgICAgICogQGV4Y2VwdGlvbiBJbnZhbGlkQXR0cmlidXRlc0V4Y2VwdGlvbiBpZiBhdHRycyBkb2VzIG5vdCBjb250YWluIGFsbCAKKyAgICAgKiB0aGUgbWFuZGF0b3J5IGF0dHJpYnV0ZXMgcmVxdWlyZWQgZm9yIGNyZWF0aW9uCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIERpckNvbnRleHQgY3JlYXRlU3ViY29udGV4dChOYW1lIG5hbWUsIEF0dHJpYnV0ZXMgYXR0cnMpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICByZXR1cm4gY3JlYXRlU3ViY29udGV4dChuYW1lLnRvU3RyaW5nKCksIGF0dHJzKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW5kIGJpbmRzIGEgbmV3IGNvbnRleHQsIGFsb25nIHdpdGggYXNzb2NpYXRlZCBhdHRyaWJ1dGVzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBjb250ZXh0IHRvIGNyZWF0ZTsgbWF5IG5vdCBiZSBlbXB0eQorICAgICAqIEBwYXJhbSBhdHRycyB0aGUgYXR0cmlidXRlcyB0byBhc3NvY2lhdGUgd2l0aCB0aGUgbmV3bHkgY3JlYXRlZCBjb250ZXh0CisgICAgICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCBjb250ZXh0CisgICAgICogQGV4Y2VwdGlvbiBOYW1lQWxyZWFkeUJvdW5kRXhjZXB0aW9uIGlmIHRoZSBuYW1lIGlzIGFscmVhZHkgYm91bmQKKyAgICAgKiBAZXhjZXB0aW9uIEludmFsaWRBdHRyaWJ1dGVzRXhjZXB0aW9uIGlmIGF0dHJzIGRvZXMgbm90IGNvbnRhaW4gYWxsIAorICAgICAqIHRoZSBtYW5kYXRvcnkgYXR0cmlidXRlcyByZXF1aXJlZCBmb3IgY3JlYXRpb24KKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgRGlyQ29udGV4dCBjcmVhdGVTdWJjb250ZXh0KFN0cmluZyBuYW1lLCBBdHRyaWJ1dGVzIGF0dHJzKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uOworCisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIHNjaGVtYSBhc3NvY2lhdGVkIHdpdGggdGhlIG5hbWVkIG9iamVjdC4gVGhlIHNjaGVtYSAKKyAgICAgKiBkZXNjcmliZXMgcnVsZXMgcmVnYXJkaW5nIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIG5hbWVzcGFjZSBhbmQgdGhlIAorICAgICAqIGF0dHJpYnV0ZXMgc3RvcmVkIHdpdGhpbiBpdC4gVGhlIHNjaGVtYSBzcGVjaWZpZXMgd2hhdCB0eXBlcyBvZiAKKyAgICAgKiBvYmplY3RzIGNhbiBiZSBhZGRlZCB0byB0aGUgZGlyZWN0b3J5IGFuZCB3aGVyZSB0aGV5IGNhbiBiZSBhZGRlZDsgCisgICAgICogd2hhdCBtYW5kYXRvcnkgYW5kIG9wdGlvbmFsIGF0dHJpYnV0ZXMgYW4gb2JqZWN0IGNhbiBoYXZlLiBUaGUgcmFuZ2UgCisgICAgICogb2Ygc3VwcG9ydCBmb3Igc2NoZW1hcyBpcyBkaXJlY3Rvcnktc3BlY2lmaWMuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIG9iamVjdCB3aG9zZSBzY2hlbWEgaXMgdG8gYmUgcmV0cmlldmVkCisgICAgICogQHJldHVybiB0aGUgc2NoZW1hIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29udGV4dDsgbmV2ZXIgbnVsbAorICAgICAqIEBleGNlcHRpb24gT3BlcmF0aW9uTm90U3VwcG9ydGVkRXhjZXB0aW9uIGlmIHNjaGVtYSBub3Qgc3VwcG9ydGVkCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIERpckNvbnRleHQgZ2V0U2NoZW1hKE5hbWUgbmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBnZXRTY2hlbWEobmFtZS50b1N0cmluZygpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgc2NoZW1hIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmFtZWQgb2JqZWN0LgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBvYmplY3Qgd2hvc2Ugc2NoZW1hIGlzIHRvIGJlIHJldHJpZXZlZAorICAgICAqIEByZXR1cm4gdGhlIHNjaGVtYSBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbnRleHQ7IG5ldmVyIG51bGwKKyAgICAgKiBAZXhjZXB0aW9uIE9wZXJhdGlvbk5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBpZiBzY2hlbWEgbm90IHN1cHBvcnRlZAorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBEaXJDb250ZXh0IGdldFNjaGVtYShTdHJpbmcgbmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbjsKKworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIGEgY29udGV4dCBjb250YWluaW5nIHRoZSBzY2hlbWEgb2JqZWN0cyBvZiB0aGUgbmFtZWQgCisgICAgICogb2JqZWN0J3MgY2xhc3MgZGVmaW5pdGlvbnMuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIG9iamVjdCB3aG9zZSBvYmplY3QgY2xhc3MgZGVmaW5pdGlvbiBpcyB0byAKKyAgICAgKiBiZSByZXRyaWV2ZWQKKyAgICAgKiBAcmV0dXJuIHRoZSBEaXJDb250ZXh0IGNvbnRhaW5pbmcgdGhlIG5hbWVkIG9iamVjdCdzIGNsYXNzIAorICAgICAqIGRlZmluaXRpb25zOyBuZXZlciBudWxsCisgICAgICogQGV4Y2VwdGlvbiBPcGVyYXRpb25Ob3RTdXBwb3J0ZWRFeGNlcHRpb24gaWYgc2NoZW1hIG5vdCBzdXBwb3J0ZWQKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgRGlyQ29udGV4dCBnZXRTY2hlbWFDbGFzc0RlZmluaXRpb24oTmFtZSBuYW1lKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGdldFNjaGVtYUNsYXNzRGVmaW5pdGlvbihuYW1lLnRvU3RyaW5nKCkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIGEgY29udGV4dCBjb250YWluaW5nIHRoZSBzY2hlbWEgb2JqZWN0cyBvZiB0aGUgbmFtZWQgCisgICAgICogb2JqZWN0J3MgY2xhc3MgZGVmaW5pdGlvbnMuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIG9iamVjdCB3aG9zZSBvYmplY3QgY2xhc3MgZGVmaW5pdGlvbiBpcyB0byAKKyAgICAgKiBiZSByZXRyaWV2ZWQKKyAgICAgKiBAcmV0dXJuIHRoZSBEaXJDb250ZXh0IGNvbnRhaW5pbmcgdGhlIG5hbWVkIG9iamVjdCdzIGNsYXNzIAorICAgICAqIGRlZmluaXRpb25zOyBuZXZlciBudWxsCisgICAgICogQGV4Y2VwdGlvbiBPcGVyYXRpb25Ob3RTdXBwb3J0ZWRFeGNlcHRpb24gaWYgc2NoZW1hIG5vdCBzdXBwb3J0ZWQKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgRGlyQ29udGV4dCBnZXRTY2hlbWFDbGFzc0RlZmluaXRpb24oU3RyaW5nIG5hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb247CisKKworICAgIC8qKgorICAgICAqIFNlYXJjaGVzIGluIGEgc2luZ2xlIGNvbnRleHQgZm9yIG9iamVjdHMgdGhhdCBjb250YWluIGEgc3BlY2lmaWVkIHNldCAKKyAgICAgKiBvZiBhdHRyaWJ1dGVzLCBhbmQgcmV0cmlldmVzIHNlbGVjdGVkIGF0dHJpYnV0ZXMuIFRoZSBzZWFyY2ggaXMgCisgICAgICogcGVyZm9ybWVkIHVzaW5nIHRoZSBkZWZhdWx0IFNlYXJjaENvbnRyb2xzIHNldHRpbmdzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBjb250ZXh0IHRvIHNlYXJjaAorICAgICAqIEBwYXJhbSBtYXRjaGluZ0F0dHJpYnV0ZXMgdGhlIGF0dHJpYnV0ZXMgdG8gc2VhcmNoIGZvci4gSWYgZW1wdHkgb3IgCisgICAgICogbnVsbCwgYWxsIG9iamVjdHMgaW4gdGhlIHRhcmdldCBjb250ZXh0IGFyZSByZXR1cm5lZC4KKyAgICAgKiBAcGFyYW0gYXR0cmlidXRlc1RvUmV0dXJuIHRoZSBhdHRyaWJ1dGVzIHRvIHJldHVybi4gbnVsbCBpbmRpY2F0ZXMgCisgICAgICogdGhhdCBhbGwgYXR0cmlidXRlcyBhcmUgdG8gYmUgcmV0dXJuZWQ7IGFuIGVtcHR5IGFycmF5IGluZGljYXRlcyB0aGF0IAorICAgICAqIG5vbmUgYXJlIHRvIGJlIHJldHVybmVkLgorICAgICAqIEByZXR1cm4gYSBub24tbnVsbCBlbnVtZXJhdGlvbiBvZiBTZWFyY2hSZXN1bHQgb2JqZWN0cy4gRWFjaCAKKyAgICAgKiBTZWFyY2hSZXN1bHQgY29udGFpbnMgdGhlIGF0dHJpYnV0ZXMgaWRlbnRpZmllZCBieSBhdHRyaWJ1dGVzVG9SZXR1cm4gCisgICAgICogYW5kIHRoZSBuYW1lIG9mIHRoZSBjb3JyZXNwb25kaW5nIG9iamVjdCwgbmFtZWQgcmVsYXRpdmUgdG8gdGhlIAorICAgICAqIGNvbnRleHQgbmFtZWQgYnkgbmFtZS4KKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgTmFtaW5nRW51bWVyYXRpb24gc2VhcmNoKE5hbWUgbmFtZSwgQXR0cmlidXRlcyBtYXRjaGluZ0F0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBhdHRyaWJ1dGVzVG9SZXR1cm4pCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICByZXR1cm4gc2VhcmNoKG5hbWUudG9TdHJpbmcoKSwgbWF0Y2hpbmdBdHRyaWJ1dGVzLCBhdHRyaWJ1dGVzVG9SZXR1cm4pOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2VhcmNoZXMgaW4gYSBzaW5nbGUgY29udGV4dCBmb3Igb2JqZWN0cyB0aGF0IGNvbnRhaW4gYSBzcGVjaWZpZWQgc2V0IAorICAgICAqIG9mIGF0dHJpYnV0ZXMsIGFuZCByZXRyaWV2ZXMgc2VsZWN0ZWQgYXR0cmlidXRlcy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgY29udGV4dCB0byBzZWFyY2gKKyAgICAgKiBAcGFyYW0gbWF0Y2hpbmdBdHRyaWJ1dGVzIHRoZSBhdHRyaWJ1dGVzIHRvIHNlYXJjaCBmb3IuIElmIGVtcHR5IG9yIAorICAgICAqIG51bGwsIGFsbCBvYmplY3RzIGluIHRoZSB0YXJnZXQgY29udGV4dCBhcmUgcmV0dXJuZWQuCisgICAgICogQHBhcmFtIGF0dHJpYnV0ZXNUb1JldHVybiB0aGUgYXR0cmlidXRlcyB0byByZXR1cm4uIG51bGwgaW5kaWNhdGVzIAorICAgICAqIHRoYXQgYWxsIGF0dHJpYnV0ZXMgYXJlIHRvIGJlIHJldHVybmVkOyBhbiBlbXB0eSBhcnJheSBpbmRpY2F0ZXMgdGhhdCAKKyAgICAgKiBub25lIGFyZSB0byBiZSByZXR1cm5lZC4KKyAgICAgKiBAcmV0dXJuIGEgbm9uLW51bGwgZW51bWVyYXRpb24gb2YgU2VhcmNoUmVzdWx0IG9iamVjdHMuIEVhY2ggCisgICAgICogU2VhcmNoUmVzdWx0IGNvbnRhaW5zIHRoZSBhdHRyaWJ1dGVzIGlkZW50aWZpZWQgYnkgYXR0cmlidXRlc1RvUmV0dXJuIAorICAgICAqIGFuZCB0aGUgbmFtZSBvZiB0aGUgY29ycmVzcG9uZGluZyBvYmplY3QsIG5hbWVkIHJlbGF0aXZlIHRvIHRoZSAKKyAgICAgKiBjb250ZXh0IG5hbWVkIGJ5IG5hbWUuCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IE5hbWluZ0VudW1lcmF0aW9uIHNlYXJjaAorICAgICAgICAoU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZXMgbWF0Y2hpbmdBdHRyaWJ1dGVzLAorICAgICAgICAgU3RyaW5nW10gYXR0cmlidXRlc1RvUmV0dXJuKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uOworCisKKyAgICAvKioKKyAgICAgKiBTZWFyY2hlcyBpbiBhIHNpbmdsZSBjb250ZXh0IGZvciBvYmplY3RzIHRoYXQgY29udGFpbiBhIHNwZWNpZmllZCBzZXQgCisgICAgICogb2YgYXR0cmlidXRlcy4gVGhpcyBtZXRob2QgcmV0dXJucyBhbGwgdGhlIGF0dHJpYnV0ZXMgb2Ygc3VjaCBvYmplY3RzLiAKKyAgICAgKiBJdCBpcyBlcXVpdmFsZW50IHRvIHN1cHBseWluZyBudWxsIGFzIHRoZSBhdHJpYnV0ZXNUb1JldHVybiBwYXJhbWV0ZXIgCisgICAgICogdG8gdGhlIG1ldGhvZCBzZWFyY2goTmFtZSwgQXR0cmlidXRlcywgU3RyaW5nW10pLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBjb250ZXh0IHRvIHNlYXJjaAorICAgICAqIEBwYXJhbSBtYXRjaGluZ0F0dHJpYnV0ZXMgdGhlIGF0dHJpYnV0ZXMgdG8gc2VhcmNoIGZvci4gSWYgZW1wdHkgb3IgCisgICAgICogbnVsbCwgYWxsIG9iamVjdHMgaW4gdGhlIHRhcmdldCBjb250ZXh0IGFyZSByZXR1cm5lZC4KKyAgICAgKiBAcmV0dXJuIGEgbm9uLW51bGwgZW51bWVyYXRpb24gb2YgU2VhcmNoUmVzdWx0IG9iamVjdHMuIEVhY2ggCisgICAgICogU2VhcmNoUmVzdWx0IGNvbnRhaW5zIHRoZSBhdHRyaWJ1dGVzIGlkZW50aWZpZWQgYnkgYXR0cmlidXRlc1RvUmV0dXJuIAorICAgICAqIGFuZCB0aGUgbmFtZSBvZiB0aGUgY29ycmVzcG9uZGluZyBvYmplY3QsIG5hbWVkIHJlbGF0aXZlIHRvIHRoZSAKKyAgICAgKiBjb250ZXh0IG5hbWVkIGJ5IG5hbWUuCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIE5hbWluZ0VudW1lcmF0aW9uIHNlYXJjaChOYW1lIG5hbWUsIEF0dHJpYnV0ZXMgbWF0Y2hpbmdBdHRyaWJ1dGVzKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHNlYXJjaChuYW1lLnRvU3RyaW5nKCksIG1hdGNoaW5nQXR0cmlidXRlcyk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZWFyY2hlcyBpbiBhIHNpbmdsZSBjb250ZXh0IGZvciBvYmplY3RzIHRoYXQgY29udGFpbiBhIHNwZWNpZmllZCBzZXQgCisgICAgICogb2YgYXR0cmlidXRlcy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgY29udGV4dCB0byBzZWFyY2gKKyAgICAgKiBAcGFyYW0gbWF0Y2hpbmdBdHRyaWJ1dGVzIHRoZSBhdHRyaWJ1dGVzIHRvIHNlYXJjaCBmb3IuIElmIGVtcHR5IG9yIAorICAgICAqIG51bGwsIGFsbCBvYmplY3RzIGluIHRoZSB0YXJnZXQgY29udGV4dCBhcmUgcmV0dXJuZWQuCisgICAgICogQHJldHVybiBhIG5vbi1udWxsIGVudW1lcmF0aW9uIG9mIFNlYXJjaFJlc3VsdCBvYmplY3RzLiBFYWNoIAorICAgICAqIFNlYXJjaFJlc3VsdCBjb250YWlucyB0aGUgYXR0cmlidXRlcyBpZGVudGlmaWVkIGJ5IGF0dHJpYnV0ZXNUb1JldHVybiAKKyAgICAgKiBhbmQgdGhlIG5hbWUgb2YgdGhlIGNvcnJlc3BvbmRpbmcgb2JqZWN0LCBuYW1lZCByZWxhdGl2ZSB0byB0aGUgCisgICAgICogY29udGV4dCBuYW1lZCBieSBuYW1lLgorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBOYW1pbmdFbnVtZXJhdGlvbiBzZWFyY2gKKyAgICAgICAgKFN0cmluZyBuYW1lLCBBdHRyaWJ1dGVzIG1hdGNoaW5nQXR0cmlidXRlcykKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbjsKKworCisgICAgLyoqCisgICAgICogU2VhcmNoZXMgaW4gdGhlIG5hbWVkIGNvbnRleHQgb3Igb2JqZWN0IGZvciBlbnRyaWVzIHRoYXQgc2F0aXNmeSB0aGUgCisgICAgICogZ2l2ZW4gc2VhcmNoIGZpbHRlci4gUGVyZm9ybXMgdGhlIHNlYXJjaCBhcyBzcGVjaWZpZWQgYnkgdGhlIHNlYXJjaCAKKyAgICAgKiBjb250cm9scy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgY29udGV4dCBvciBvYmplY3QgdG8gc2VhcmNoCisgICAgICogQHBhcmFtIGZpbHRlciB0aGUgZmlsdGVyIGV4cHJlc3Npb24gdG8gdXNlIGZvciB0aGUgc2VhcmNoOyBtYXkgbm90IGJlIAorICAgICAqIG51bGwKKyAgICAgKiBAcGFyYW0gY29ucyB0aGUgc2VhcmNoIGNvbnRyb2xzIHRoYXQgY29udHJvbCB0aGUgc2VhcmNoLiBJZiBudWxsLCAKKyAgICAgKiB0aGUgZGVmYXVsdCBzZWFyY2ggY29udHJvbHMgYXJlIHVzZWQgKGVxdWl2YWxlbnQgdG8gCisgICAgICogKG5ldyBTZWFyY2hDb250cm9scygpKSkuCisgICAgICogQHJldHVybiBhbiBlbnVtZXJhdGlvbiBvZiBTZWFyY2hSZXN1bHRzIG9mIHRoZSBvYmplY3RzIHRoYXQgc2F0aXNmeSAKKyAgICAgKiB0aGUgZmlsdGVyOyBuZXZlciBudWxsCisgICAgICogQGV4Y2VwdGlvbiBJbnZhbGlkU2VhcmNoRmlsdGVyRXhjZXB0aW9uIGlmIHRoZSBzZWFyY2ggZmlsdGVyIHNwZWNpZmllZCAKKyAgICAgKiBpcyBub3Qgc3VwcG9ydGVkIG9yIHVuZGVyc3Rvb2QgYnkgdGhlIHVuZGVybHlpbmcgZGlyZWN0b3J5CisgICAgICogQGV4Y2VwdGlvbiBJbnZhbGlkU2VhcmNoQ29udHJvbHNFeGNlcHRpb24gaWYgdGhlIHNlYXJjaCBjb250cm9scyAKKyAgICAgKiBjb250YWluIGludmFsaWQgc2V0dGluZ3MKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgTmFtaW5nRW51bWVyYXRpb24gc2VhcmNoCisgICAgICAgIChOYW1lIG5hbWUsIFN0cmluZyBmaWx0ZXIsIFNlYXJjaENvbnRyb2xzIGNvbnMpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICByZXR1cm4gc2VhcmNoKG5hbWUudG9TdHJpbmcoKSwgZmlsdGVyLCBjb25zKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNlYXJjaGVzIGluIHRoZSBuYW1lZCBjb250ZXh0IG9yIG9iamVjdCBmb3IgZW50cmllcyB0aGF0IHNhdGlzZnkgdGhlIAorICAgICAqIGdpdmVuIHNlYXJjaCBmaWx0ZXIuIFBlcmZvcm1zIHRoZSBzZWFyY2ggYXMgc3BlY2lmaWVkIGJ5IHRoZSBzZWFyY2ggCisgICAgICogY29udHJvbHMuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbnRleHQgb3Igb2JqZWN0IHRvIHNlYXJjaAorICAgICAqIEBwYXJhbSBmaWx0ZXIgdGhlIGZpbHRlciBleHByZXNzaW9uIHRvIHVzZSBmb3IgdGhlIHNlYXJjaDsgbWF5IG5vdCBiZSAKKyAgICAgKiBudWxsCisgICAgICogQHBhcmFtIGNvbnMgdGhlIHNlYXJjaCBjb250cm9scyB0aGF0IGNvbnRyb2wgdGhlIHNlYXJjaC4gSWYgbnVsbCwgCisgICAgICogdGhlIGRlZmF1bHQgc2VhcmNoIGNvbnRyb2xzIGFyZSB1c2VkIChlcXVpdmFsZW50IHRvIAorICAgICAqIChuZXcgU2VhcmNoQ29udHJvbHMoKSkpLgorICAgICAqIEByZXR1cm4gYW4gZW51bWVyYXRpb24gb2YgU2VhcmNoUmVzdWx0cyBvZiB0aGUgb2JqZWN0cyB0aGF0IHNhdGlzZnkgCisgICAgICogdGhlIGZpbHRlcjsgbmV2ZXIgbnVsbAorICAgICAqIEBleGNlcHRpb24gSW52YWxpZFNlYXJjaEZpbHRlckV4Y2VwdGlvbiBpZiB0aGUgc2VhcmNoIGZpbHRlciAKKyAgICAgKiBzcGVjaWZpZWQgaXMgbm90IHN1cHBvcnRlZCBvciB1bmRlcnN0b29kIGJ5IHRoZSB1bmRlcmx5aW5nIGRpcmVjdG9yeQorICAgICAqIEBleGNlcHRpb24gSW52YWxpZFNlYXJjaENvbnRyb2xzRXhjZXB0aW9uIGlmIHRoZSBzZWFyY2ggY29udHJvbHMgCisgICAgICogY29udGFpbiBpbnZhbGlkIHNldHRpbmdzCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IE5hbWluZ0VudW1lcmF0aW9uIHNlYXJjaChTdHJpbmcgbmFtZSwgU3RyaW5nIGZpbHRlciwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWFyY2hDb250cm9scyBjb25zKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uOworCisKKyAgICAvKioKKyAgICAgKiBTZWFyY2hlcyBpbiB0aGUgbmFtZWQgY29udGV4dCBvciBvYmplY3QgZm9yIGVudHJpZXMgdGhhdCBzYXRpc2Z5IHRoZSAKKyAgICAgKiBnaXZlbiBzZWFyY2ggZmlsdGVyLiBQZXJmb3JtcyB0aGUgc2VhcmNoIGFzIHNwZWNpZmllZCBieSB0aGUgc2VhcmNoIAorICAgICAqIGNvbnRyb2xzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBjb250ZXh0IG9yIG9iamVjdCB0byBzZWFyY2gKKyAgICAgKiBAcGFyYW0gZmlsdGVyRXhwciB0aGUgZmlsdGVyIGV4cHJlc3Npb24gdG8gdXNlIGZvciB0aGUgc2VhcmNoLiAKKyAgICAgKiBUaGUgZXhwcmVzc2lvbiBtYXkgY29udGFpbiB2YXJpYWJsZXMgb2YgdGhlIGZvcm0gIntpfSIgd2hlcmUgaSBpcyBhIAorICAgICAqIG5vbm5lZ2F0aXZlIGludGVnZXIuIE1heSBub3QgYmUgbnVsbC4KKyAgICAgKiBAcGFyYW0gZmlsdGVyQXJncyB0aGUgYXJyYXkgb2YgYXJndW1lbnRzIHRvIHN1YnN0aXR1dGUgZm9yIHRoZSAKKyAgICAgKiB2YXJpYWJsZXMgaW4gZmlsdGVyRXhwci4gVGhlIHZhbHVlIG9mIGZpbHRlckFyZ3NbaV0gd2lsbCByZXBsYWNlIGVhY2ggCisgICAgICogb2NjdXJyZW5jZSBvZiAie2l9Ii4gSWYgbnVsbCwgZXF1aXZhbGVudCB0byBhbiBlbXB0eSBhcnJheS4KKyAgICAgKiBAcGFyYW0gY29ucyB0aGUgc2VhcmNoIGNvbnRyb2xzIHRoYXQgY29udHJvbCB0aGUgc2VhcmNoLiBJZiBudWxsLCB0aGUgCisgICAgICogZGVmYXVsdCBzZWFyY2ggY29udHJvbHMgYXJlIHVzZWQgKGVxdWl2YWxlbnQgdG8gKG5ldyBTZWFyY2hDb250cm9scygpKSkuCisgICAgICogQHJldHVybiBhbiBlbnVtZXJhdGlvbiBvZiBTZWFyY2hSZXN1bHRzIG9mIHRoZSBvYmplY3RzIHRoYXQgc2F0aXN5IHRoZSAKKyAgICAgKiBmaWx0ZXI7IG5ldmVyIG51bGwKKyAgICAgKiBAZXhjZXB0aW9uIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiBmaWx0ZXJFeHByIGNvbnRhaW5zIHtpfSAKKyAgICAgKiBleHByZXNzaW9ucyB3aGVyZSBpIGlzIG91dHNpZGUgdGhlIGJvdW5kcyBvZiB0aGUgYXJyYXkgZmlsdGVyQXJncworICAgICAqIEBleGNlcHRpb24gSW52YWxpZFNlYXJjaENvbnRyb2xzRXhjZXB0aW9uIGlmIGNvbnMgY29udGFpbnMgaW52YWxpZCAKKyAgICAgKiBzZXR0aW5ncworICAgICAqIEBleGNlcHRpb24gSW52YWxpZFNlYXJjaEZpbHRlckV4Y2VwdGlvbiBpZiBmaWx0ZXJFeHByIHdpdGggZmlsdGVyQXJncyAKKyAgICAgKiByZXByZXNlbnRzIGFuIGludmFsaWQgc2VhcmNoIGZpbHRlcgorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBOYW1pbmdFbnVtZXJhdGlvbiBzZWFyY2goTmFtZSBuYW1lLCBTdHJpbmcgZmlsdGVyRXhwciwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RbXSBmaWx0ZXJBcmdzLCBTZWFyY2hDb250cm9scyBjb25zKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHNlYXJjaChuYW1lLnRvU3RyaW5nKCksIGZpbHRlckV4cHIsIGZpbHRlckFyZ3MsIGNvbnMpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2VhcmNoZXMgaW4gdGhlIG5hbWVkIGNvbnRleHQgb3Igb2JqZWN0IGZvciBlbnRyaWVzIHRoYXQgc2F0aXNmeSB0aGUgCisgICAgICogZ2l2ZW4gc2VhcmNoIGZpbHRlci4gUGVyZm9ybXMgdGhlIHNlYXJjaCBhcyBzcGVjaWZpZWQgYnkgdGhlIHNlYXJjaCAKKyAgICAgKiBjb250cm9scy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgY29udGV4dCBvciBvYmplY3QgdG8gc2VhcmNoCisgICAgICogQHBhcmFtIGZpbHRlckV4cHIgdGhlIGZpbHRlciBleHByZXNzaW9uIHRvIHVzZSBmb3IgdGhlIHNlYXJjaC4gCisgICAgICogVGhlIGV4cHJlc3Npb24gbWF5IGNvbnRhaW4gdmFyaWFibGVzIG9mIHRoZSBmb3JtICJ7aX0iIHdoZXJlIGkgaXMgYSAKKyAgICAgKiBub25uZWdhdGl2ZSBpbnRlZ2VyLiBNYXkgbm90IGJlIG51bGwuCisgICAgICogQHBhcmFtIGZpbHRlckFyZ3MgdGhlIGFycmF5IG9mIGFyZ3VtZW50cyB0byBzdWJzdGl0dXRlIGZvciB0aGUgCisgICAgICogdmFyaWFibGVzIGluIGZpbHRlckV4cHIuIFRoZSB2YWx1ZSBvZiBmaWx0ZXJBcmdzW2ldIHdpbGwgcmVwbGFjZSBlYWNoIAorICAgICAqIG9jY3VycmVuY2Ugb2YgIntpfSIuIElmIG51bGwsIGVxdWl2YWxlbnQgdG8gYW4gZW1wdHkgYXJyYXkuCisgICAgICogQHBhcmFtIGNvbnMgdGhlIHNlYXJjaCBjb250cm9scyB0aGF0IGNvbnRyb2wgdGhlIHNlYXJjaC4gSWYgbnVsbCwgdGhlIAorICAgICAqIGRlZmF1bHQgc2VhcmNoIGNvbnRyb2xzIGFyZSB1c2VkIChlcXVpdmFsZW50IHRvIChuZXcgU2VhcmNoQ29udHJvbHMoKSkpLgorICAgICAqIEByZXR1cm4gYW4gZW51bWVyYXRpb24gb2YgU2VhcmNoUmVzdWx0cyBvZiB0aGUgb2JqZWN0cyB0aGF0IHNhdGlzeSB0aGUgCisgICAgICogZmlsdGVyOyBuZXZlciBudWxsCisgICAgICogQGV4Y2VwdGlvbiBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgZmlsdGVyRXhwciBjb250YWlucyB7aX0gCisgICAgICogZXhwcmVzc2lvbnMgd2hlcmUgaSBpcyBvdXRzaWRlIHRoZSBib3VuZHMgb2YgdGhlIGFycmF5IGZpbHRlckFyZ3MKKyAgICAgKiBAZXhjZXB0aW9uIEludmFsaWRTZWFyY2hDb250cm9sc0V4Y2VwdGlvbiBpZiBjb25zIGNvbnRhaW5zIGludmFsaWQgCisgICAgICogc2V0dGluZ3MKKyAgICAgKiBAZXhjZXB0aW9uIEludmFsaWRTZWFyY2hGaWx0ZXJFeGNlcHRpb24gaWYgZmlsdGVyRXhwciB3aXRoIGZpbHRlckFyZ3MgCisgICAgICogcmVwcmVzZW50cyBhbiBpbnZhbGlkIHNlYXJjaCBmaWx0ZXIKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgTmFtaW5nRW51bWVyYXRpb24gc2VhcmNoCisgICAgICAgIChTdHJpbmcgbmFtZSwgU3RyaW5nIGZpbHRlckV4cHIsIAorICAgICAgICAgT2JqZWN0W10gZmlsdGVyQXJncywgU2VhcmNoQ29udHJvbHMgY29ucykKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbjsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3RlY3RlZCBNZXRob2RzCisKKworfQorCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL3Jlc291cmNlcy9DYWNoZUVudHJ5LmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL3Jlc291cmNlcy9DYWNoZUVudHJ5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJhYzg2MQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvcmVzb3VyY2VzL0NhY2hlRW50cnkuamF2YQpAQCAtMCwwICsxLDY3IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovIAorCitwYWNrYWdlIG9yZy5hcGFjaGUubmFtaW5nLnJlc291cmNlczsKKworaW1wb3J0IGphdmF4Lm5hbWluZy5kaXJlY3RvcnkuRGlyQ29udGV4dDsKKworLyoqCisgKiBJbXBsZW1lbnRzIGEgY2FjaGUgZW50cnkuCisgKiAKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnJlbW1AYXBhY2hlLm9yZyI+UmVteSBNYXVjaGVyYXQ8L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBDYWNoZUVudHJ5IHsKKyAgICAKKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICBwdWJsaWMgbG9uZyB0aW1lc3RhbXAgPSAtMTsKKyAgICBwdWJsaWMgU3RyaW5nIG5hbWUgPSBudWxsOworICAgIHB1YmxpYyBSZXNvdXJjZUF0dHJpYnV0ZXMgYXR0cmlidXRlcyA9IG51bGw7CisgICAgcHVibGljIFJlc291cmNlIHJlc291cmNlID0gbnVsbDsKKyAgICBwdWJsaWMgRGlyQ29udGV4dCBjb250ZXh0ID0gbnVsbDsKKyAgICBwdWJsaWMgYm9vbGVhbiBleGlzdHMgPSB0cnVlOworICAgIHB1YmxpYyBsb25nIGFjY2Vzc0NvdW50ID0gMDsKKyAgICBwdWJsaWMgaW50IHNpemUgPSAxOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICBwdWJsaWMgdm9pZCByZWN5Y2xlKCkgeworICAgICAgICB0aW1lc3RhbXAgPSAtMTsKKyAgICAgICAgbmFtZSA9IG51bGw7CisgICAgICAgIGF0dHJpYnV0ZXMgPSBudWxsOworICAgICAgICByZXNvdXJjZSA9IG51bGw7CisgICAgICAgIGNvbnRleHQgPSBudWxsOworICAgICAgICBleGlzdHMgPSB0cnVlOworICAgICAgICBhY2Nlc3NDb3VudCA9IDA7CisgICAgICAgIHNpemUgPSAxOworICAgIH0KKworCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICgiQ2FjaGUgZW50cnk6ICIgKyBuYW1lICsgIlxuIgorICAgICAgICAgICAgICAgICsgIkV4aXN0czogIiArIGV4aXN0cyArICJcbiIKKyAgICAgICAgICAgICAgICArICJBdHRyaWJ1dGVzOiAiICsgYXR0cmlidXRlcyArICJcbiIKKyAgICAgICAgICAgICAgICArICJSZXNvdXJjZTogIiArIHJlc291cmNlICsgIlxuIgorICAgICAgICAgICAgICAgICsgIkNvbnRleHQ6ICIgKyBjb250ZXh0KTsKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9yZXNvdXJjZXMvQ29uc3RhbnRzLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL3Jlc291cmNlcy9Db25zdGFudHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTA1YTIyCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9yZXNvdXJjZXMvQ29uc3RhbnRzLmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLyAKKworCitwYWNrYWdlIG9yZy5hcGFjaGUubmFtaW5nLnJlc291cmNlczsKKworCisvKioKKyAqIFN0YXRpYyBjb25zdGFudHMgZm9yIHRoaXMgcGFja2FnZS4KKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgQ29uc3RhbnRzIHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1RPQ09MX0hBTkRMRVJfVkFSSUFCTEUgPSAKKyAgICAgICAgImphdmEucHJvdG9jb2wuaGFuZGxlci5wa2dzIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBhY2thZ2UgPSAib3JnLmFwYWNoZS5uYW1pbmcucmVzb3VyY2VzIjsKKworICAgIC8vIERlZmF1bHQgbmFtZXNwYWNlIG5hbWUKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX05BTUVTUEFDRSA9ICJEQVY6IjsKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9yZXNvdXJjZXMvRGlyQ29udGV4dFVSTENvbm5lY3Rpb24uamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvcmVzb3VyY2VzL0RpckNvbnRleHRVUkxDb25uZWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmEzOWNkYwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvcmVzb3VyY2VzL0RpckNvbnRleHRVUkxDb25uZWN0aW9uLmphdmEKQEAgLTAsMCArMSwzNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8gCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5uYW1pbmcucmVzb3VyY2VzOworCitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEubmV0LlVSTENvbm5lY3Rpb247CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbjsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1pbmdFbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtZUNsYXNzUGFpcjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuZGlyZWN0b3J5LkRpckNvbnRleHQ7CitpbXBvcnQgamF2YXgubmFtaW5nLmRpcmVjdG9yeS5BdHRyaWJ1dGU7CitpbXBvcnQgamF2YXgubmFtaW5nLmRpcmVjdG9yeS5BdHRyaWJ1dGVzOworaW1wb3J0IG9yZy5hcGFjaGUubmFtaW5nLkpuZGlQZXJtaXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUubmFtaW5nLnJlc291cmNlcy5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm5hbWluZy5yZXNvdXJjZXMuUmVzb3VyY2VBdHRyaWJ1dGVzOworCisvKioKKyAqIENvbm5lY3Rpb24gdG8gYSBKTkRJIGRpcmVjdG9yeSBjb250ZXh0LgorICogPHAvPgorICogTm90ZTogQWxsIHRoZSBvYmplY3QgYXR0cmlidXRlIG5hbWVzIGFyZSB0aGUgV2ViREFWIG5hbWVzLCBub3QgdGhlIEhUVFAgCisgKiBuYW1lcywgc28gdGhpcyBjbGFzcyBvdmVycmlkZXMgc29tZSBtZXRob2RzIGZyb20gVVJMQ29ubmVjdGlvbiB0byBkbyB0aGUKKyAqIHF1ZXJpZXMgdXNpbmcgdGhlIHJpZ2h0IG5hbWVzLiBDb250ZW50IGhhbmRsZXIgaXMgYWxzbyBub3QgdXNlZDsgdGhlIAorICogY29udGVudCBpcyBkaXJlY3RseSByZXR1cm5lZC4KKyAqIAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86cmVtbUBhcGFjaGUub3JnIj5SZW15IE1hdWNoZXJhdDwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIERpckNvbnRleHRVUkxDb25uZWN0aW9uIAorICAgIGV4dGVuZHMgVVJMQ29ubmVjdGlvbiB7CisgICAgCisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisgICAgCisgICAgCisgICAgcHVibGljIERpckNvbnRleHRVUkxDb25uZWN0aW9uKERpckNvbnRleHQgY29udGV4dCwgVVJMIHVybCkgeworICAgICAgICBzdXBlcih1cmwpOworICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICgiRGlyZWN0b3J5IGNvbnRleHQgY2FuJ3QgYmUgbnVsbCIpOworICAgICAgICBpZiAoU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMucGVybWlzc2lvbiA9IG5ldyBKbmRpUGVybWlzc2lvbih1cmwudG9TdHJpbmcoKSk7CisJfQorICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0OworICAgIH0KKyAgICAKKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBEaXJlY3RvcnkgY29udGV4dC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRGlyQ29udGV4dCBjb250ZXh0OworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIEFzc29jaWF0ZWQgcmVzb3VyY2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIFJlc291cmNlIHJlc291cmNlOworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIEFzc29jaWF0ZWQgRGlyQ29udGV4dC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRGlyQ29udGV4dCBjb2xsZWN0aW9uOworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIE90aGVyIHVua25vd24gb2JqZWN0LgorICAgICAqLworICAgIHByb3RlY3RlZCBPYmplY3Qgb2JqZWN0OworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIEF0dHJpYnV0ZXMuCisgICAgICovCisgICAgcHJvdGVjdGVkIEF0dHJpYnV0ZXMgYXR0cmlidXRlczsKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBEYXRlLgorICAgICAqLworICAgIHByb3RlY3RlZCBsb25nIGRhdGU7CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogUGVybWlzc2lvbgorICAgICAqLworICAgIHByb3RlY3RlZCBQZXJtaXNzaW9uIHBlcm1pc3Npb247CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIENvbm5lY3QgdG8gdGhlIERpckNvbnRleHQsIGFuZCByZXRyaXZlIHRoZSBib3VuZCBvYmplY3QsIGFzIHdlbGwgYXMKKyAgICAgKiBpdHMgYXR0cmlidXRlcy4gSWYgbm8gb2JqZWN0IGlzIGJvdW5kIHdpdGggdGhlIG5hbWUgc3BlY2lmaWVkIGluIHRoZQorICAgICAqIFVSTCwgdGhlbiBhbiBJT0V4Y2VwdGlvbiBpcyB0aHJvd24uCisgICAgICogCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBPYmplY3Qgbm90IGZvdW5kCisgICAgICovCisgICAgcHVibGljIHZvaWQgY29ubmVjdCgpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIAorICAgICAgICBpZiAoIWNvbm5lY3RlZCkgeworICAgICAgICAgICAgCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGRhdGUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IGdldFVSTCgpLmdldEZpbGUoKTsKKyAgICAgICAgICAgICAgICBpZiAoY29udGV4dCBpbnN0YW5jZW9mIFByb3h5RGlyQ29udGV4dCkgeworICAgICAgICAgICAgICAgICAgICBQcm94eURpckNvbnRleHQgcHJveHlEaXJDb250ZXh0ID0gCisgICAgICAgICAgICAgICAgICAgICAgICAoUHJveHlEaXJDb250ZXh0KSBjb250ZXh0OworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaG9zdE5hbWUgPSBwcm94eURpckNvbnRleHQuZ2V0SG9zdE5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNvbnRleHROYW1lID0gcHJveHlEaXJDb250ZXh0LmdldENvbnRleHROYW1lKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChob3N0TmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhdGguc3RhcnRzV2l0aCgiLyIgKyBob3N0TmFtZSArICIvIikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKGhvc3ROYW1lLmxlbmd0aCgpKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoY29udGV4dE5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXRoLnN0YXJ0c1dpdGgoY29udGV4dE5hbWUgKyAiLyIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoID0gcGF0aC5zdWJzdHJpbmcoY29udGV4dE5hbWUubGVuZ3RoKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG9iamVjdCA9IGNvbnRleHQubG9va3VwKHBhdGgpOworICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMgPSBjb250ZXh0LmdldEF0dHJpYnV0ZXMocGF0aCk7CisgICAgICAgICAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFJlc291cmNlKQorICAgICAgICAgICAgICAgICAgICByZXNvdXJjZSA9IChSZXNvdXJjZSkgb2JqZWN0OworICAgICAgICAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBEaXJDb250ZXh0KQorICAgICAgICAgICAgICAgICAgICBjb2xsZWN0aW9uID0gKERpckNvbnRleHQpIG9iamVjdDsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gT2JqZWN0IG5vdCBmb3VuZAorICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBjb25uZWN0ZWQgPSB0cnVlOworICAgICAgICAgICAgCisgICAgICAgIH0KKyAgICAgICAgCisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY29udGVudCBsZW5ndGggdmFsdWUuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRDb250ZW50TGVuZ3RoKCkgeworICAgICAgICByZXR1cm4gZ2V0SGVhZGVyRmllbGRJbnQoUmVzb3VyY2VBdHRyaWJ1dGVzLkNPTlRFTlRfTEVOR1RILCAtMSk7CisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY29udGVudCB0eXBlIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGUoKSB7CisgICAgICAgIHJldHVybiBnZXRIZWFkZXJGaWVsZChSZXNvdXJjZUF0dHJpYnV0ZXMuQ09OVEVOVF9UWVBFKTsKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBsYXN0IG1vZGlmaWVkIGRhdGUuCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0RGF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIGRhdGU7CisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbGFzdCBtb2RpZmllZCBkYXRlLgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldExhc3RNb2RpZmllZCgpIHsKKworICAgICAgICBpZiAoIWNvbm5lY3RlZCkgeworICAgICAgICAgICAgLy8gVHJ5IHRvIGNvbm5lY3QgKHNpbGVudGx5KQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjb25uZWN0KCk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoYXR0cmlidXRlcyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgQXR0cmlidXRlIGxhc3RNb2RpZmllZCA9IAorICAgICAgICAgICAgYXR0cmlidXRlcy5nZXQoUmVzb3VyY2VBdHRyaWJ1dGVzLkxBU1RfTU9ESUZJRUQpOworICAgICAgICBpZiAobGFzdE1vZGlmaWVkICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgRGF0ZSBsbURhdGUgPSAoRGF0ZSkgbGFzdE1vZGlmaWVkLmdldCgpOworICAgICAgICAgICAgICAgIHJldHVybiBsbURhdGUuZ2V0VGltZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBzcGVjaWZpZWQgaGVhZGVyIGZpZWxkLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SGVhZGVyRmllbGQoU3RyaW5nIG5hbWUpIHsKKworICAgICAgICBpZiAoIWNvbm5lY3RlZCkgeworICAgICAgICAgICAgLy8gVHJ5IHRvIGNvbm5lY3QgKHNpbGVudGx5KQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjb25uZWN0KCk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChhdHRyaWJ1dGVzID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworCisgICAgICAgIEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLmdldChuYW1lKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGUuZ2V0KCkudG9TdHJpbmcoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIFNob3VsZG4ndCBoYXBwZW4sIHVubGVzcyB0aGUgYXR0cmlidXRlIGhhcyBubyB2YWx1ZQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIEdldCBvYmplY3QgY29udGVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldENvbnRlbnQoKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAKKyAgICAgICAgaWYgKCFjb25uZWN0ZWQpCisgICAgICAgICAgICBjb25uZWN0KCk7CisgICAgICAgIAorICAgICAgICBpZiAocmVzb3VyY2UgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBnZXRJbnB1dFN0cmVhbSgpOworICAgICAgICBpZiAoY29sbGVjdGlvbiAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb247CisgICAgICAgIGlmIChvYmplY3QgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBvYmplY3Q7CisgICAgICAgIAorICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCk7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBHZXQgb2JqZWN0IGNvbnRlbnQuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRDb250ZW50KENsYXNzW10gY2xhc3NlcykKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgCisgICAgICAgIE9iamVjdCBvYmplY3QgPSBnZXRDb250ZW50KCk7CisgICAgICAgIAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChjbGFzc2VzW2ldLmlzSW5zdGFuY2Uob2JqZWN0KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0OworICAgICAgICB9CisgICAgICAgIAorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIEdldCBpbnB1dCBzdHJlYW0uCisgICAgICovCisgICAgcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkgCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIAorICAgICAgICBpZiAoIWNvbm5lY3RlZCkKKyAgICAgICAgICAgIGNvbm5lY3QoKTsKKyAgICAgICAgCisgICAgICAgIGlmIChyZXNvdXJjZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBSZW9wZW4gcmVzb3VyY2UKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGNvbnRleHQubG9va3VwKGdldFVSTCgpLmdldEZpbGUoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChOYW1pbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICByZXR1cm4gKHJlc291cmNlLnN0cmVhbUNvbnRlbnQoKSk7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIFBlcm1pc3Npb24gZm9yIHRoaXMgVVJMCisgICAgICovCisgICAgcHVibGljIFBlcm1pc3Npb24gZ2V0UGVybWlzc2lvbigpIHsKKworICAgICAgICByZXR1cm4gcGVybWlzc2lvbjsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIExpc3QgY2hpbGRyZW4gb2YgdGhpcyBjb2xsZWN0aW9uLiBUaGUgbmFtZXMgZ2l2ZW4gYXJlIHJlbGF0aXZlIHRvIHRoaXMKKyAgICAgKiBVUkkncyBwYXRoLiBUaGUgZnVsbCB1cmkgb2YgdGhlIGNoaWxkcmVuIGlzIHRoZW4gOiBwYXRoICsgIi8iICsgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRW51bWVyYXRpb24gbGlzdCgpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIAorICAgICAgICBpZiAoIWNvbm5lY3RlZCkgeworICAgICAgICAgICAgY29ubmVjdCgpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoKHJlc291cmNlID09IG51bGwpICYmIChjb2xsZWN0aW9uID09IG51bGwpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIFZlY3RvciByZXN1bHQgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIAorICAgICAgICBpZiAoY29sbGVjdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIE5hbWluZ0VudW1lcmF0aW9uIGVudW1lcmF0aW9uID0gY29udGV4dC5saXN0KGdldFVSTCgpLmdldEZpbGUoKSk7CisgICAgICAgICAgICAgICAgd2hpbGUgKGVudW1lcmF0aW9uLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgICAgIE5hbWVDbGFzc1BhaXIgbmNwID0gKE5hbWVDbGFzc1BhaXIpIGVudW1lcmF0aW9uLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRFbGVtZW50KG5jcC5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gVW5leHBlY3RlZCBleGNlcHRpb24KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiByZXN1bHQuZWxlbWVudHMoKTsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIAorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9yZXNvdXJjZXMvRGlyQ29udGV4dFVSTFN0cmVhbUhhbmRsZXIuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvcmVzb3VyY2VzL0RpckNvbnRleHRVUkxTdHJlYW1IYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFhNTNjMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvcmVzb3VyY2VzL0RpckNvbnRleHRVUkxTdHJlYW1IYW5kbGVyLmphdmEKQEAgLTAsMCArMSwyMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8gCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5uYW1pbmcucmVzb3VyY2VzOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS5uZXQuVVJMQ29ubmVjdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkxTdHJlYW1IYW5kbGVyOworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CisKK2ltcG9ydCBqYXZheC5uYW1pbmcuZGlyZWN0b3J5LkRpckNvbnRleHQ7CisKKy8qKgorICogU3RyZWFtIGhhbmRsZXIgdG8gYSBKTkRJIGRpcmVjdG9yeSBjb250ZXh0LgorICogCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpyZW1tQGFwYWNoZS5vcmciPlJlbXkgTWF1Y2hlcmF0PC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgRGlyQ29udGV4dFVSTFN0cmVhbUhhbmRsZXIgCisgICAgZXh0ZW5kcyBVUkxTdHJlYW1IYW5kbGVyIHsKKyAgICAKKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKyAgICAKKyAgICAKKyAgICBwdWJsaWMgRGlyQ29udGV4dFVSTFN0cmVhbUhhbmRsZXIoKSB7CisgICAgfQorICAgIAorICAgIAorICAgIHB1YmxpYyBEaXJDb250ZXh0VVJMU3RyZWFtSGFuZGxlcihEaXJDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsKKyAgICB9CisgICAgCisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVmFyaWFibGVzCisgICAgCisgICAgCisgICAgLyoqCisgICAgICogQmluZGluZ3MgY2xhc3MgbG9hZGVyIC0gZGlyZWN0b3J5IGNvbnRleHQuIEtleWVkIGJ5IENMIGlkLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIEhhc2h0YWJsZSBjbEJpbmRpbmdzID0gbmV3IEhhc2h0YWJsZSgpOworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIEJpbmRpbmdzIHRocmVhZCAtIGRpcmVjdG9yeSBjb250ZXh0LiBLZXllZCBieSB0aHJlYWQgaWQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgSGFzaHRhYmxlIHRocmVhZEJpbmRpbmdzID0gbmV3IEhhc2h0YWJsZSgpOworICAgIAorICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIERpcmVjdG9yeSBjb250ZXh0LgorICAgICAqLworICAgIHByb3RlY3RlZCBEaXJDb250ZXh0IGNvbnRleHQgPSBudWxsOworICAgIAorICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworICAgIAorICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFVSTFN0cmVhbUhhbmRsZXIgTWV0aG9kcworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIE9wZW5zIGEgY29ubmVjdGlvbiB0byB0aGUgb2JqZWN0IHJlZmVyZW5jZWQgYnkgdGhlIDxjb2RlPlVSTDwvY29kZT4gCisgICAgICogYXJndW1lbnQuCisgICAgICovCisgICAgcHJvdGVjdGVkIFVSTENvbm5lY3Rpb24gb3BlbkNvbm5lY3Rpb24oVVJMIHUpIAorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBEaXJDb250ZXh0IGN1cnJlbnRDb250ZXh0ID0gdGhpcy5jb250ZXh0OworICAgICAgICBpZiAoY3VycmVudENvbnRleHQgPT0gbnVsbCkKKyAgICAgICAgICAgIGN1cnJlbnRDb250ZXh0ID0gZ2V0KCk7CisgICAgICAgIHJldHVybiBuZXcgRGlyQ29udGV4dFVSTENvbm5lY3Rpb24oY3VycmVudENvbnRleHQsIHUpOworICAgIH0KKyAgICAKKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGphdmEucHJvdG9jb2wuaGFuZGxlci5wa2dzIHN5c3RlbSBwcm9wZXJ0eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0UHJvdG9jb2xIYW5kbGVyKCkgeworICAgICAgICBTdHJpbmcgdmFsdWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoQ29uc3RhbnRzLlBST1RPQ09MX0hBTkRMRVJfVkFSSUFCTEUpOworICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgdmFsdWUgPSBDb25zdGFudHMuUGFja2FnZTsKKyAgICAgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eShDb25zdGFudHMuUFJPVE9DT0xfSEFORExFUl9WQVJJQUJMRSwgdmFsdWUpOworICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoQ29uc3RhbnRzLlBhY2thZ2UpID09IC0xKSB7CisgICAgICAgICAgICB2YWx1ZSArPSAifCIgKyBDb25zdGFudHMuUGFja2FnZTsKKyAgICAgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eShDb25zdGFudHMuUFJPVE9DT0xfSEFORExFUl9WQVJJQUJMRSwgdmFsdWUpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdGhyZWFkIG9yIHRoZSBjb250ZXh0IGNsYXNzIGxvYWRlciBvZiB0aGUgY3VycmVudCAKKyAgICAgKiB0aHJlYWQgaXMgYm91bmQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQm91bmQoKSB7CisgICAgICAgIHJldHVybiAoY2xCaW5kaW5ncy5jb250YWluc0tleQorICAgICAgICAgICAgICAgIChUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpKSkKKyAgICAgICAgICAgIHx8ICh0aHJlYWRCaW5kaW5ncy5jb250YWluc0tleShUaHJlYWQuY3VycmVudFRocmVhZCgpKSk7CisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIEJpbmRzIGEgZGlyZWN0b3J5IGNvbnRleHQgdG8gYSBjbGFzcyBsb2FkZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGJpbmQoRGlyQ29udGV4dCBkaXJDb250ZXh0KSB7CisgICAgICAgIENsYXNzTG9hZGVyIGN1cnJlbnRDTCA9IAorICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKKyAgICAgICAgaWYgKGN1cnJlbnRDTCAhPSBudWxsKQorICAgICAgICAgICAgY2xCaW5kaW5ncy5wdXQoY3VycmVudENMLCBkaXJDb250ZXh0KTsKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogVW5iaW5kcyBhIGRpcmVjdG9yeSBjb250ZXh0IHRvIGEgY2xhc3MgbG9hZGVyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB1bmJpbmQoKSB7CisgICAgICAgIENsYXNzTG9hZGVyIGN1cnJlbnRDTCA9IAorICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKKyAgICAgICAgaWYgKGN1cnJlbnRDTCAhPSBudWxsKQorICAgICAgICAgICAgY2xCaW5kaW5ncy5yZW1vdmUoY3VycmVudENMKTsKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogQmluZHMgYSBkaXJlY3RvcnkgY29udGV4dCB0byBhIHRocmVhZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYmluZFRocmVhZChEaXJDb250ZXh0IGRpckNvbnRleHQpIHsKKyAgICAgICAgdGhyZWFkQmluZGluZ3MucHV0KFRocmVhZC5jdXJyZW50VGhyZWFkKCksIGRpckNvbnRleHQpOworICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBVbmJpbmRzIGEgZGlyZWN0b3J5IGNvbnRleHQgdG8gYSB0aHJlYWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHVuYmluZFRocmVhZCgpIHsKKyAgICAgICAgdGhyZWFkQmluZGluZ3MucmVtb3ZlKFRocmVhZC5jdXJyZW50VGhyZWFkKCkpOworICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGJvdW5kIGNvbnRleHQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBEaXJDb250ZXh0IGdldCgpIHsKKworICAgICAgICBEaXJDb250ZXh0IHJlc3VsdCA9IG51bGw7CisKKyAgICAgICAgVGhyZWFkIGN1cnJlbnRUaHJlYWQgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpOworICAgICAgICBDbGFzc0xvYWRlciBjdXJyZW50Q0wgPSBjdXJyZW50VGhyZWFkLmdldENvbnRleHRDbGFzc0xvYWRlcigpOworCisgICAgICAgIC8vIENoZWNraW5nIENMIGJpbmRpbmcKKyAgICAgICAgcmVzdWx0ID0gKERpckNvbnRleHQpIGNsQmluZGluZ3MuZ2V0KGN1cnJlbnRDTCk7CisgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisKKyAgICAgICAgLy8gQ2hlY2tpbmcgdGhyZWFkIGJpZGluZworICAgICAgICByZXN1bHQgPSAoRGlyQ29udGV4dCkgdGhyZWFkQmluZGluZ3MuZ2V0KGN1cnJlbnRUaHJlYWQpOworCisgICAgICAgIC8vIENoZWNraW5nIHBhcmVudCBDTCBiaW5kaW5nCisgICAgICAgIGN1cnJlbnRDTCA9IGN1cnJlbnRDTC5nZXRQYXJlbnQoKTsKKyAgICAgICAgd2hpbGUgKGN1cnJlbnRDTCAhPSBudWxsKSB7CisgICAgICAgICAgICByZXN1bHQgPSAoRGlyQ29udGV4dCkgY2xCaW5kaW5ncy5nZXQoY3VycmVudENMKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgY3VycmVudENMID0gY3VycmVudENMLmdldFBhcmVudCgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiSWxsZWdhbCBjbGFzcyBsb2FkZXIgYmluZGluZyIpOworCisgICAgICAgIHJldHVybiByZXN1bHQ7CisKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogQmluZHMgYSBkaXJlY3RvcnkgY29udGV4dCB0byBhIGNsYXNzIGxvYWRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYmluZChDbGFzc0xvYWRlciBjbCwgRGlyQ29udGV4dCBkaXJDb250ZXh0KSB7CisgICAgICAgIGNsQmluZGluZ3MucHV0KGNsLCBkaXJDb250ZXh0KTsKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogVW5iaW5kcyBhIGRpcmVjdG9yeSBjb250ZXh0IHRvIGEgY2xhc3MgbG9hZGVyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB1bmJpbmQoQ2xhc3NMb2FkZXIgY2wpIHsKKyAgICAgICAgY2xCaW5kaW5ncy5yZW1vdmUoY2wpOworICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGJvdW5kIGNvbnRleHQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBEaXJDb250ZXh0IGdldChDbGFzc0xvYWRlciBjbCkgeworICAgICAgICByZXR1cm4gKERpckNvbnRleHQpIGNsQmluZGluZ3MuZ2V0KGNsKTsKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogR2V0IHRoZSBib3VuZCBjb250ZXh0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgRGlyQ29udGV4dCBnZXQoVGhyZWFkIHRocmVhZCkgeworICAgICAgICByZXR1cm4gKERpckNvbnRleHQpIHRocmVhZEJpbmRpbmdzLmdldCh0aHJlYWQpOworICAgIH0KKyAgICAKKyAgICAKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvcmVzb3VyY2VzL0RpckNvbnRleHRVUkxTdHJlYW1IYW5kbGVyRmFjdG9yeS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9yZXNvdXJjZXMvRGlyQ29udGV4dFVSTFN0cmVhbUhhbmRsZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzIzOWY0MQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvcmVzb3VyY2VzL0RpckNvbnRleHRVUkxTdHJlYW1IYW5kbGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8gCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5uYW1pbmcucmVzb3VyY2VzOworCitpbXBvcnQgamF2YS5uZXQuVVJMU3RyZWFtSGFuZGxlcjsKK2ltcG9ydCBqYXZhLm5ldC5VUkxTdHJlYW1IYW5kbGVyRmFjdG9yeTsKKworLyoqCisgKiBGYWN0b3J5IGZvciBTdHJlYW0gaGFuZGxlcnMgdG8gYSBKTkRJIGRpcmVjdG9yeSBjb250ZXh0LgorICogCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpyZW1tQGFwYWNoZS5vcmciPlJlbXkgTWF1Y2hlcmF0PC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgRGlyQ29udGV4dFVSTFN0cmVhbUhhbmRsZXJGYWN0b3J5IAorICAgIGltcGxlbWVudHMgVVJMU3RyZWFtSGFuZGxlckZhY3RvcnkgeworICAgIAorICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworICAgIAorICAgIAorICAgIHB1YmxpYyBEaXJDb250ZXh0VVJMU3RyZWFtSGFuZGxlckZhY3RvcnkoKSB7CisgICAgfQorICAgIAorICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworICAgIAorICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworICAgIAorICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVVJMU3RyZWFtSGFuZGxlckZhY3RvcnkgTWV0aG9kcworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgVVJMU3RyZWFtSGFuZGxlciBpbnN0YW5jZSB3aXRoIHRoZSBzcGVjaWZpZWQgcHJvdG9jb2wuCisgICAgICogV2lsbCByZXR1cm4gbnVsbCBpZiB0aGUgcHJvdG9jb2wgaXMgbm90IDxjb2RlPmpuZGk8L2NvZGU+LgorICAgICAqIAorICAgICAqIEBwYXJhbSBwcm90b2NvbCB0aGUgcHJvdG9jb2wgKG11c3QgYmUgImpuZGkiIGhlcmUpCisgICAgICogQHJldHVybiBhIFVSTFN0cmVhbUhhbmRsZXIgZm9yIHRoZSBqbmRpIHByb3RvY29sLCBvciBudWxsIGlmIHRoZSAKKyAgICAgKiBwcm90b2NvbCBpcyBub3QgSk5ESQorICAgICAqLworICAgIHB1YmxpYyBVUkxTdHJlYW1IYW5kbGVyIGNyZWF0ZVVSTFN0cmVhbUhhbmRsZXIoU3RyaW5nIHByb3RvY29sKSB7CisgICAgICAgIGlmIChwcm90b2NvbC5lcXVhbHMoImpuZGkiKSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBEaXJDb250ZXh0VVJMU3RyZWFtSGFuZGxlcigpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL3Jlc291cmNlcy9GaWxlRGlyQ29udGV4dC5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9yZXNvdXJjZXMvRmlsZURpckNvbnRleHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzlkZmNlCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9yZXNvdXJjZXMvRmlsZURpckNvbnRleHQuamF2YQpAQCAtMCwwICsxLDExMTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUubmFtaW5nLnJlc291cmNlczsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworCitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWVBbHJlYWR5Qm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWluZ0VudW1lcmF0aW9uOworaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1pbmdFeGNlcHRpb247CitpbXBvcnQgamF2YXgubmFtaW5nLk9wZXJhdGlvbk5vdFN1cHBvcnRlZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuZGlyZWN0b3J5LkF0dHJpYnV0ZXM7CitpbXBvcnQgamF2YXgubmFtaW5nLmRpcmVjdG9yeS5EaXJDb250ZXh0OworaW1wb3J0IGphdmF4Lm5hbWluZy5kaXJlY3RvcnkuTW9kaWZpY2F0aW9uSXRlbTsKK2ltcG9ydCBqYXZheC5uYW1pbmcuZGlyZWN0b3J5LlNlYXJjaENvbnRyb2xzOworCitpbXBvcnQgb3JnLmFwYWNoZS5uYW1pbmcuTmFtaW5nQ29udGV4dEJpbmRpbmdzRW51bWVyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5uYW1pbmcuTmFtaW5nQ29udGV4dEVudW1lcmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUubmFtaW5nLk5hbWluZ0VudHJ5OworCisvKioKKyAqIEZpbGVzeXN0ZW0gRGlyZWN0b3J5IENvbnRleHQgaW1wbGVtZW50YXRpb24gaGVscGVyIGNsYXNzLgorICoKKyAqIEBhdXRob3IgUmVteSBNYXVjaGVyYXQKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEZpbGVEaXJDb250ZXh0IGV4dGVuZHMgQmFzZURpckNvbnRleHQgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGxvZz0KKyAgICAgICAgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeS5nZXRMb2coIEZpbGVEaXJDb250ZXh0LmNsYXNzICk7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdGFudHMKKworCisgICAgLyoqCisgICAgICogVGhlIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIHN0cmluZyBmb3IgdGhpcyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBCVUZGRVJfU0laRSA9IDIwNDg7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvKioKKyAgICAgKiBCdWlsZHMgYSBmaWxlIGRpcmVjdG9yeSBjb250ZXh0IHVzaW5nIHRoZSBnaXZlbiBlbnZpcm9ubWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmlsZURpckNvbnRleHQoKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBCdWlsZHMgYSBmaWxlIGRpcmVjdG9yeSBjb250ZXh0IHVzaW5nIHRoZSBnaXZlbiBlbnZpcm9ubWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmlsZURpckNvbnRleHQoSGFzaHRhYmxlIGVudikgeworICAgICAgICBzdXBlcihlbnYpOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBkb2N1bWVudCBiYXNlIGRpcmVjdG9yeS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRmlsZSBiYXNlID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogQWJzb2x1dGUgbm9ybWFsaXplZCBmaWxlbmFtZSBvZiB0aGUgYmFzZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGFic29sdXRlQmFzZSA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIENhc2Ugc2Vuc2l0aXZpdHkuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gY2FzZVNlbnNpdGl2ZSA9IHRydWU7CisKKworICAgIC8qKgorICAgICAqIEFsbG93IGxpbmtpbmcuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gYWxsb3dMaW5raW5nID0gZmFsc2U7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGRvY3VtZW50IHJvb3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZG9jQmFzZSBUaGUgbmV3IGRvY3VtZW50IHJvb3QKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBzcGVjaWZpZWQgdmFsdWUgaXMgbm90CisgICAgICogIHN1cHBvcnRlZCBieSB0aGlzIGltcGxlbWVudGF0aW9uCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhpcyB3b3VsZCBjcmVhdGUgYQorICAgICAqICBtYWxmb3JtZWQgVVJMCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RG9jQmFzZShTdHJpbmcgZG9jQmFzZSkgeworCisgICAgLy8gVmFsaWRhdGUgdGhlIGZvcm1hdCBvZiB0aGUgcHJvcG9zZWQgZG9jdW1lbnQgcm9vdAorICAgIGlmIChkb2NCYXNlID09IG51bGwpCisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgKHNtLmdldFN0cmluZygicmVzb3VyY2VzLm51bGwiKSk7CisKKyAgICAvLyBDYWxjdWxhdGUgYSBGaWxlIG9iamVjdCByZWZlcmVuY2luZyB0aGlzIGRvY3VtZW50IGJhc2UgZGlyZWN0b3J5CisgICAgYmFzZSA9IG5ldyBGaWxlKGRvY0Jhc2UpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYmFzZSA9IGJhc2UuZ2V0Q2Fub25pY2FsRmlsZSgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBJZ25vcmUKKyAgICAgICAgfQorCisgICAgLy8gVmFsaWRhdGUgdGhhdCB0aGUgZG9jdW1lbnQgYmFzZSBpcyBhbiBleGlzdGluZyBkaXJlY3RvcnkKKyAgICBpZiAoIWJhc2UuZXhpc3RzKCkgfHwgIWJhc2UuaXNEaXJlY3RvcnkoKSB8fCAhYmFzZS5jYW5SZWFkKCkpCisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgKHNtLmdldFN0cmluZygiZmlsZVJlc291cmNlcy5iYXNlIiwgZG9jQmFzZSkpOworICAgICAgICB0aGlzLmFic29sdXRlQmFzZSA9IGJhc2UuZ2V0QWJzb2x1dGVQYXRoKCk7CisgICAgICAgIHN1cGVyLnNldERvY0Jhc2UoZG9jQmFzZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCBjYXNlIHNlbnNpdGl2aXR5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENhc2VTZW5zaXRpdmUoYm9vbGVhbiBjYXNlU2Vuc2l0aXZlKSB7CisgICAgICAgIHRoaXMuY2FzZVNlbnNpdGl2ZSA9IGNhc2VTZW5zaXRpdmU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBJcyBjYXNlIHNlbnNpdGl2ZSA/CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlKCkgeworICAgICAgICByZXR1cm4gY2FzZVNlbnNpdGl2ZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCBhbGxvdyBsaW5raW5nLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEFsbG93TGlua2luZyhib29sZWFuIGFsbG93TGlua2luZykgeworICAgICAgICB0aGlzLmFsbG93TGlua2luZyA9IGFsbG93TGlua2luZzsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIElzIGxpbmtpbmcgYWxsb3dlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRBbGxvd0xpbmtpbmcoKSB7CisgICAgICAgIHJldHVybiBhbGxvd0xpbmtpbmc7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmVsZWFzZSBhbnkgcmVzb3VyY2VzIGFsbG9jYXRlZCBmb3IgdGhpcyBkaXJlY3RvcnkgY29udGV4dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWxlYXNlKCkgeworCisgICAgICAgIGNhc2VTZW5zaXRpdmUgPSB0cnVlOworICAgICAgICBhbGxvd0xpbmtpbmcgPSBmYWxzZTsKKyAgICAgICAgYWJzb2x1dGVCYXNlID0gbnVsbDsKKyAgICAgICAgYmFzZSA9IG51bGw7CisgICAgICAgIHN1cGVyLnJlbGVhc2UoKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29udGV4dCBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgbmFtZWQgb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIG9iamVjdCB0byBsb29rIHVwCisgICAgICogQHJldHVybiB0aGUgb2JqZWN0IGJvdW5kIHRvIG5hbWUKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGxvb2t1cChTdHJpbmcgbmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIE9iamVjdCByZXN1bHQgPSBudWxsOworICAgICAgICBGaWxlIGZpbGUgPSBmaWxlKG5hbWUpOworCisgICAgICAgIGlmIChmaWxlID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgTmFtaW5nRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygicmVzb3VyY2VzLm5vdEZvdW5kIiwgbmFtZSkpOworCisgICAgICAgIGlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgIEZpbGVEaXJDb250ZXh0IHRlbXBDb250ZXh0ID0gbmV3IEZpbGVEaXJDb250ZXh0KGVudik7CisgICAgICAgICAgICB0ZW1wQ29udGV4dC5zZXREb2NCYXNlKGZpbGUuZ2V0UGF0aCgpKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IHRlbXBDb250ZXh0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzdWx0ID0gbmV3IEZpbGVSZXNvdXJjZShmaWxlKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXN1bHQ7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFVuYmluZHMgdGhlIG5hbWVkIG9iamVjdC4gUmVtb3ZlcyB0aGUgdGVybWluYWwgYXRvbWljIG5hbWUgaW4gbmFtZQorICAgICAqIGZyb20gdGhlIHRhcmdldCBjb250ZXh0LS10aGF0IG5hbWVkIGJ5IGFsbCBidXQgdGhlIHRlcm1pbmFsIGF0b21pYworICAgICAqIHBhcnQgb2YgbmFtZS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBpZGVtcG90ZW50LiBJdCBzdWNjZWVkcyBldmVuIGlmIHRoZSB0ZXJtaW5hbCBhdG9taWMKKyAgICAgKiBuYW1lIGlzIG5vdCBib3VuZCBpbiB0aGUgdGFyZ2V0IGNvbnRleHQsIGJ1dCB0aHJvd3MKKyAgICAgKiBOYW1lTm90Rm91bmRFeGNlcHRpb24gaWYgYW55IG9mIHRoZSBpbnRlcm1lZGlhdGUgY29udGV4dHMgZG8gbm90IGV4aXN0LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgdG8gYmluZDsgbWF5IG5vdCBiZSBlbXB0eQorICAgICAqIEBleGNlcHRpb24gTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGlmIGFuIGludGVybWVkaWF0ZSBjb250ZXh0IGRvZXMgbm90CisgICAgICogZXhpc3QKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB1bmJpbmQoU3RyaW5nIG5hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworCisgICAgICAgIEZpbGUgZmlsZSA9IGZpbGUobmFtZSk7CisKKyAgICAgICAgaWYgKGZpbGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBOYW1pbmdFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJyZXNvdXJjZXMubm90Rm91bmQiLCBuYW1lKSk7CisKKyAgICAgICAgaWYgKCFmaWxlLmRlbGV0ZSgpKQorICAgICAgICAgICAgdGhyb3cgbmV3IE5hbWluZ0V4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInJlc291cmNlcy51bmJpbmRGYWlsZWQiLCBuYW1lKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEJpbmRzIGEgbmV3IG5hbWUgdG8gdGhlIG9iamVjdCBib3VuZCB0byBhbiBvbGQgbmFtZSwgYW5kIHVuYmluZHMgdGhlCisgICAgICogb2xkIG5hbWUuIEJvdGggbmFtZXMgYXJlIHJlbGF0aXZlIHRvIHRoaXMgY29udGV4dC4gQW55IGF0dHJpYnV0ZXMKKyAgICAgKiBhc3NvY2lhdGVkIHdpdGggdGhlIG9sZCBuYW1lIGJlY29tZSBhc3NvY2lhdGVkIHdpdGggdGhlIG5ldyBuYW1lLgorICAgICAqIEludGVybWVkaWF0ZSBjb250ZXh0cyBvZiB0aGUgb2xkIG5hbWUgYXJlIG5vdCBjaGFuZ2VkLgorICAgICAqCisgICAgICogQHBhcmFtIG9sZE5hbWUgdGhlIG5hbWUgb2YgdGhlIGV4aXN0aW5nIGJpbmRpbmc7IG1heSBub3QgYmUgZW1wdHkKKyAgICAgKiBAcGFyYW0gbmV3TmFtZSB0aGUgbmFtZSBvZiB0aGUgbmV3IGJpbmRpbmc7IG1heSBub3QgYmUgZW1wdHkKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWVBbHJlYWR5Qm91bmRFeGNlcHRpb24gaWYgbmV3TmFtZSBpcyBhbHJlYWR5IGJvdW5kCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVuYW1lKFN0cmluZyBvbGROYW1lLCBTdHJpbmcgbmV3TmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisKKyAgICAgICAgRmlsZSBmaWxlID0gZmlsZShvbGROYW1lKTsKKworICAgICAgICBpZiAoZmlsZSA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IE5hbWluZ0V4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInJlc291cmNlcy5ub3RGb3VuZCIsIG9sZE5hbWUpKTsKKworICAgICAgICBGaWxlIG5ld0ZpbGUgPSBuZXcgRmlsZShiYXNlLCBuZXdOYW1lKTsKKworICAgICAgICBmaWxlLnJlbmFtZVRvKG5ld0ZpbGUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBFbnVtZXJhdGVzIHRoZSBuYW1lcyBib3VuZCBpbiB0aGUgbmFtZWQgY29udGV4dCwgYWxvbmcgd2l0aCB0aGUgY2xhc3MKKyAgICAgKiBuYW1lcyBvZiBvYmplY3RzIGJvdW5kIHRvIHRoZW0uIFRoZSBjb250ZW50cyBvZiBhbnkgc3ViY29udGV4dHMgYXJlCisgICAgICogbm90IGluY2x1ZGVkLgorICAgICAqIDxwPgorICAgICAqIElmIGEgYmluZGluZyBpcyBhZGRlZCB0byBvciByZW1vdmVkIGZyb20gdGhpcyBjb250ZXh0LCBpdHMgZWZmZWN0IG9uCisgICAgICogYW4gZW51bWVyYXRpb24gcHJldmlvdXNseSByZXR1cm5lZCBpcyB1bmRlZmluZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgY29udGV4dCB0byBsaXN0CisgICAgICogQHJldHVybiBhbiBlbnVtZXJhdGlvbiBvZiB0aGUgbmFtZXMgYW5kIGNsYXNzIG5hbWVzIG9mIHRoZSBiaW5kaW5ncyBpbgorICAgICAqIHRoaXMgY29udGV4dC4gRWFjaCBlbGVtZW50IG9mIHRoZSBlbnVtZXJhdGlvbiBpcyBvZiB0eXBlIE5hbWVDbGFzc1BhaXIuCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIE5hbWluZ0VudW1lcmF0aW9uIGxpc3QoU3RyaW5nIG5hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworCisgICAgICAgIEZpbGUgZmlsZSA9IGZpbGUobmFtZSk7CisKKyAgICAgICAgaWYgKGZpbGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBOYW1pbmdFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJyZXNvdXJjZXMubm90Rm91bmQiLCBuYW1lKSk7CisKKyAgICAgICAgcmV0dXJuIG5ldyBOYW1pbmdDb250ZXh0RW51bWVyYXRpb24obGlzdChmaWxlKS5pdGVyYXRvcigpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogRW51bWVyYXRlcyB0aGUgbmFtZXMgYm91bmQgaW4gdGhlIG5hbWVkIGNvbnRleHQsIGFsb25nIHdpdGggdGhlCisgICAgICogb2JqZWN0cyBib3VuZCB0byB0aGVtLiBUaGUgY29udGVudHMgb2YgYW55IHN1YmNvbnRleHRzIGFyZSBub3QKKyAgICAgKiBpbmNsdWRlZC4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiBhIGJpbmRpbmcgaXMgYWRkZWQgdG8gb3IgcmVtb3ZlZCBmcm9tIHRoaXMgY29udGV4dCwgaXRzIGVmZmVjdCBvbgorICAgICAqIGFuIGVudW1lcmF0aW9uIHByZXZpb3VzbHkgcmV0dXJuZWQgaXMgdW5kZWZpbmVkLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbnRleHQgdG8gbGlzdAorICAgICAqIEByZXR1cm4gYW4gZW51bWVyYXRpb24gb2YgdGhlIGJpbmRpbmdzIGluIHRoaXMgY29udGV4dC4KKyAgICAgKiBFYWNoIGVsZW1lbnQgb2YgdGhlIGVudW1lcmF0aW9uIGlzIG9mIHR5cGUgQmluZGluZy4KKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgTmFtaW5nRW51bWVyYXRpb24gbGlzdEJpbmRpbmdzKFN0cmluZyBuYW1lKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKworICAgICAgICBGaWxlIGZpbGUgPSBmaWxlKG5hbWUpOworCisgICAgICAgIGlmIChmaWxlID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgTmFtaW5nRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygicmVzb3VyY2VzLm5vdEZvdW5kIiwgbmFtZSkpOworCisgICAgICAgIHJldHVybiBuZXcgTmFtaW5nQ29udGV4dEJpbmRpbmdzRW51bWVyYXRpb24obGlzdChmaWxlKS5pdGVyYXRvcigpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogRGVzdHJveXMgdGhlIG5hbWVkIGNvbnRleHQgYW5kIHJlbW92ZXMgaXQgZnJvbSB0aGUgbmFtZXNwYWNlLiBBbnkKKyAgICAgKiBhdHRyaWJ1dGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmFtZSBhcmUgYWxzbyByZW1vdmVkLiBJbnRlcm1lZGlhdGUKKyAgICAgKiBjb250ZXh0cyBhcmUgbm90IGRlc3Ryb3llZC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBpZGVtcG90ZW50LiBJdCBzdWNjZWVkcyBldmVuIGlmIHRoZSB0ZXJtaW5hbCBhdG9taWMKKyAgICAgKiBuYW1lIGlzIG5vdCBib3VuZCBpbiB0aGUgdGFyZ2V0IGNvbnRleHQsIGJ1dCB0aHJvd3MKKyAgICAgKiBOYW1lTm90Rm91bmRFeGNlcHRpb24gaWYgYW55IG9mIHRoZSBpbnRlcm1lZGlhdGUgY29udGV4dHMgZG8gbm90IGV4aXN0LgorICAgICAqCisgICAgICogSW4gYSBmZWRlcmF0ZWQgbmFtaW5nIHN5c3RlbSwgYSBjb250ZXh0IGZyb20gb25lIG5hbWluZyBzeXN0ZW0gbWF5IGJlCisgICAgICogYm91bmQgdG8gYSBuYW1lIGluIGFub3RoZXIuIE9uZSBjYW4gc3Vic2VxdWVudGx5IGxvb2sgdXAgYW5kIHBlcmZvcm0KKyAgICAgKiBvcGVyYXRpb25zIG9uIHRoZSBmb3JlaWduIGNvbnRleHQgdXNpbmcgYSBjb21wb3NpdGUgbmFtZS4gSG93ZXZlciwgYW4KKyAgICAgKiBhdHRlbXB0IGRlc3Ryb3kgdGhlIGNvbnRleHQgdXNpbmcgdGhpcyBjb21wb3NpdGUgbmFtZSB3aWxsIGZhaWwgd2l0aAorICAgICAqIE5vdENvbnRleHRFeGNlcHRpb24sIGJlY2F1c2UgdGhlIGZvcmVpZ24gY29udGV4dCBpcyBub3QgYSAic3ViY29udGV4dCIKKyAgICAgKiBvZiB0aGUgY29udGV4dCBpbiB3aGljaCBpdCBpcyBib3VuZC4gSW5zdGVhZCwgdXNlIHVuYmluZCgpIHRvIHJlbW92ZQorICAgICAqIHRoZSBiaW5kaW5nIG9mIHRoZSBmb3JlaWduIGNvbnRleHQuIERlc3Ryb3lpbmcgdGhlIGZvcmVpZ24gY29udGV4dAorICAgICAqIHJlcXVpcmVzIHRoYXQgdGhlIGRlc3Ryb3lTdWJjb250ZXh0KCkgYmUgcGVyZm9ybWVkIG9uIGEgY29udGV4dCBmcm9tCisgICAgICogdGhlIGZvcmVpZ24gY29udGV4dCdzICJuYXRpdmUiIG5hbWluZyBzeXN0ZW0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgY29udGV4dCB0byBiZSBkZXN0cm95ZWQ7IG1heSBub3QgYmUgZW1wdHkKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWVOb3RGb3VuZEV4Y2VwdGlvbiBpZiBhbiBpbnRlcm1lZGlhdGUgY29udGV4dCBkb2VzIG5vdAorICAgICAqIGV4aXN0CisgICAgICogQGV4Y2VwdGlvbiBOb3RDb250ZXh0RXhjZXB0aW9uIGlmIHRoZSBuYW1lIGlzIGJvdW5kIGJ1dCBkb2VzIG5vdCBuYW1lCisgICAgICogYSBjb250ZXh0LCBvciBkb2VzIG5vdCBuYW1lIGEgY29udGV4dCBvZiB0aGUgYXBwcm9wcmlhdGUgdHlwZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3lTdWJjb250ZXh0KFN0cmluZyBuYW1lKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgdW5iaW5kKG5hbWUpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSBuYW1lZCBvYmplY3QsIGZvbGxvd2luZyBsaW5rcyBleGNlcHQgZm9yIHRoZSB0ZXJtaW5hbAorICAgICAqIGF0b21pYyBjb21wb25lbnQgb2YgdGhlIG5hbWUuIElmIHRoZSBvYmplY3QgYm91bmQgdG8gbmFtZSBpcyBub3QgYQorICAgICAqIGxpbmssIHJldHVybnMgdGhlIG9iamVjdCBpdHNlbGYuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgb2JqZWN0IHRvIGxvb2sgdXAKKyAgICAgKiBAcmV0dXJuIHRoZSBvYmplY3QgYm91bmQgdG8gbmFtZSwgbm90IGZvbGxvd2luZyB0aGUgdGVybWluYWwgbGluaworICAgICAqIChpZiBhbnkpLgorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgbG9va3VwTGluayhTdHJpbmcgbmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIE5vdGUgOiBMaW5rcyBhcmUgbm90IHN1cHBvcnRlZAorICAgICAgICByZXR1cm4gbG9va3VwKG5hbWUpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSBmdWxsIG5hbWUgb2YgdGhpcyBjb250ZXh0IHdpdGhpbiBpdHMgb3duIG5hbWVzcGFjZS4KKyAgICAgKiA8cD4KKyAgICAgKiBNYW55IG5hbWluZyBzZXJ2aWNlcyBoYXZlIGEgbm90aW9uIG9mIGEgImZ1bGwgbmFtZSIgZm9yIG9iamVjdHMgaW4KKyAgICAgKiB0aGVpciByZXNwZWN0aXZlIG5hbWVzcGFjZXMuIEZvciBleGFtcGxlLCBhbiBMREFQIGVudHJ5IGhhcyBhCisgICAgICogZGlzdGluZ3Vpc2hlZCBuYW1lLCBhbmQgYSBETlMgcmVjb3JkIGhhcyBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lLiBUaGlzCisgICAgICogbWV0aG9kIGFsbG93cyB0aGUgY2xpZW50IGFwcGxpY2F0aW9uIHRvIHJldHJpZXZlIHRoaXMgbmFtZS4gVGhlIHN0cmluZworICAgICAqIHJldHVybmVkIGJ5IHRoaXMgbWV0aG9kIGlzIG5vdCBhIEpOREkgY29tcG9zaXRlIG5hbWUgYW5kIHNob3VsZCBub3QgYmUKKyAgICAgKiBwYXNzZWQgZGlyZWN0bHkgdG8gY29udGV4dCBtZXRob2RzLiBJbiBuYW1pbmcgc3lzdGVtcyBmb3Igd2hpY2ggdGhlCisgICAgICogbm90aW9uIG9mIGZ1bGwgbmFtZSBkb2VzIG5vdCBtYWtlIHNlbnNlLAorICAgICAqIE9wZXJhdGlvbk5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBpcyB0aHJvd24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoaXMgY29udGV4dCdzIG5hbWUgaW4gaXRzIG93biBuYW1lc3BhY2U7IG5ldmVyIG51bGwKKyAgICAgKiBAZXhjZXB0aW9uIE9wZXJhdGlvbk5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBpZiB0aGUgbmFtaW5nIHN5c3RlbSBkb2VzCisgICAgICogbm90IGhhdmUgdGhlIG5vdGlvbiBvZiBhIGZ1bGwgbmFtZQorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZUluTmFtZXNwYWNlKCkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBkb2NCYXNlOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRGlyQ29udGV4dCBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyBzZWxlY3RlZCBhdHRyaWJ1dGVzIGFzc29jaWF0ZWQgd2l0aCBhIG5hbWVkIG9iamVjdC4KKyAgICAgKiBTZWUgdGhlIGNsYXNzIGRlc2NyaXB0aW9uIHJlZ2FyZGluZyBhdHRyaWJ1dGUgbW9kZWxzLCBhdHRyaWJ1dGUgdHlwZQorICAgICAqIG5hbWVzLCBhbmQgb3BlcmF0aW9uYWwgYXR0cmlidXRlcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHJlcXVlc3RlZCBhdHRyaWJ1dGVzOyBuZXZlciBudWxsCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIG9iamVjdCBmcm9tIHdoaWNoIHRvIHJldHJpZXZlIGF0dHJpYnV0ZXMKKyAgICAgKiBAcGFyYW0gYXR0cklkcyB0aGUgaWRlbnRpZmllcnMgb2YgdGhlIGF0dHJpYnV0ZXMgdG8gcmV0cmlldmUuIG51bGwKKyAgICAgKiBpbmRpY2F0ZXMgdGhhdCBhbGwgYXR0cmlidXRlcyBzaG91bGQgYmUgcmV0cmlldmVkOyBhbiBlbXB0eSBhcnJheQorICAgICAqIGluZGljYXRlcyB0aGF0IG5vbmUgc2hvdWxkIGJlIHJldHJpZXZlZAorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBBdHRyaWJ1dGVzIGdldEF0dHJpYnV0ZXMoU3RyaW5nIG5hbWUsIFN0cmluZ1tdIGF0dHJJZHMpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworCisgICAgICAgIC8vIEJ1aWxkaW5nIGF0dHJpYnV0ZSBsaXN0CisgICAgICAgIEZpbGUgZmlsZSA9IGZpbGUobmFtZSk7CisKKyAgICAgICAgaWYgKGZpbGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBOYW1pbmdFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJyZXNvdXJjZXMubm90Rm91bmQiLCBuYW1lKSk7CisKKyAgICAgICAgcmV0dXJuIG5ldyBGaWxlUmVzb3VyY2VBdHRyaWJ1dGVzKGZpbGUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBNb2RpZmllcyB0aGUgYXR0cmlidXRlcyBhc3NvY2lhdGVkIHdpdGggYSBuYW1lZCBvYmplY3QuIFRoZSBvcmRlciBvZgorICAgICAqIHRoZSBtb2RpZmljYXRpb25zIGlzIG5vdCBzcGVjaWZpZWQuIFdoZXJlIHBvc3NpYmxlLCB0aGUgbW9kaWZpY2F0aW9ucworICAgICAqIGFyZSBwZXJmb3JtZWQgYXRvbWljYWxseS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBvYmplY3Qgd2hvc2UgYXR0cmlidXRlcyB3aWxsIGJlIHVwZGF0ZWQKKyAgICAgKiBAcGFyYW0gbW9kX29wIHRoZSBtb2RpZmljYXRpb24gb3BlcmF0aW9uLCBvbmUgb2Y6IEFERF9BVFRSSUJVVEUsCisgICAgICogUkVQTEFDRV9BVFRSSUJVVEUsIFJFTU9WRV9BVFRSSUJVVEUKKyAgICAgKiBAcGFyYW0gYXR0cnMgdGhlIGF0dHJpYnV0ZXMgdG8gYmUgdXNlZCBmb3IgdGhlIG1vZGlmaWNhdGlvbjsgbWF5IG5vdAorICAgICAqIGJlIG51bGwKKyAgICAgKiBAZXhjZXB0aW9uIEF0dHJpYnV0ZU1vZGlmaWNhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgbW9kaWZpY2F0aW9uIGNhbm5vdCBiZQorICAgICAqIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBtb2RpZnlBdHRyaWJ1dGVzKFN0cmluZyBuYW1lLCBpbnQgbW9kX29wLCBBdHRyaWJ1dGVzIGF0dHJzKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogTW9kaWZpZXMgdGhlIGF0dHJpYnV0ZXMgYXNzb2NpYXRlZCB3aXRoIGEgbmFtZWQgb2JqZWN0IHVzaW5nIGFuIGFuCisgICAgICogb3JkZXJlZCBsaXN0IG9mIG1vZGlmaWNhdGlvbnMuIFRoZSBtb2RpZmljYXRpb25zIGFyZSBwZXJmb3JtZWQgaW4gdGhlCisgICAgICogb3JkZXIgc3BlY2lmaWVkLiBFYWNoIG1vZGlmaWNhdGlvbiBzcGVjaWZpZXMgYSBtb2RpZmljYXRpb24gb3BlcmF0aW9uCisgICAgICogY29kZSBhbmQgYW4gYXR0cmlidXRlIG9uIHdoaWNoIHRvIG9wZXJhdGUuIFdoZXJlIHBvc3NpYmxlLCB0aGUKKyAgICAgKiBtb2RpZmljYXRpb25zIGFyZSBwZXJmb3JtZWQgYXRvbWljYWxseS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBvYmplY3Qgd2hvc2UgYXR0cmlidXRlcyB3aWxsIGJlIHVwZGF0ZWQKKyAgICAgKiBAcGFyYW0gbW9kcyBhbiBvcmRlcmVkIHNlcXVlbmNlIG9mIG1vZGlmaWNhdGlvbnMgdG8gYmUgcGVyZm9ybWVkOyBtYXkKKyAgICAgKiBub3QgYmUgbnVsbAorICAgICAqIEBleGNlcHRpb24gQXR0cmlidXRlTW9kaWZpY2F0aW9uRXhjZXB0aW9uIGlmIHRoZSBtb2RpZmljYXRpb24gY2Fubm90IGJlCisgICAgICogY29tcGxldGVkIHN1Y2Nlc3NmdWxseQorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG1vZGlmeUF0dHJpYnV0ZXMoU3RyaW5nIG5hbWUsIE1vZGlmaWNhdGlvbkl0ZW1bXSBtb2RzKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQmluZHMgYSBuYW1lIHRvIGFuIG9iamVjdCwgYWxvbmcgd2l0aCBhc3NvY2lhdGVkIGF0dHJpYnV0ZXMuIElmIGF0dHJzCisgICAgICogaXMgbnVsbCwgdGhlIHJlc3VsdGluZyBiaW5kaW5nIHdpbGwgaGF2ZSB0aGUgYXR0cmlidXRlcyBhc3NvY2lhdGVkCisgICAgICogd2l0aCBvYmogaWYgb2JqIGlzIGEgRGlyQ29udGV4dCwgYW5kIG5vIGF0dHJpYnV0ZXMgb3RoZXJ3aXNlLiBJZiBhdHRycworICAgICAqIGlzIG5vbi1udWxsLCB0aGUgcmVzdWx0aW5nIGJpbmRpbmcgd2lsbCBoYXZlIGF0dHJzIGFzIGl0cyBhdHRyaWJ1dGVzOworICAgICAqIGFueSBhdHRyaWJ1dGVzIGFzc29jaWF0ZWQgd2l0aCBvYmogYXJlIGlnbm9yZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSB0byBiaW5kOyBtYXkgbm90IGJlIGVtcHR5CisgICAgICogQHBhcmFtIG9iaiB0aGUgb2JqZWN0IHRvIGJpbmQ7IHBvc3NpYmx5IG51bGwKKyAgICAgKiBAcGFyYW0gYXR0cnMgdGhlIGF0dHJpYnV0ZXMgdG8gYXNzb2NpYXRlIHdpdGggdGhlIGJpbmRpbmcKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWVBbHJlYWR5Qm91bmRFeGNlcHRpb24gaWYgbmFtZSBpcyBhbHJlYWR5IGJvdW5kCisgICAgICogQGV4Y2VwdGlvbiBJbnZhbGlkQXR0cmlidXRlc0V4Y2VwdGlvbiBpZiBzb21lICJtYW5kYXRvcnkiIGF0dHJpYnV0ZXMKKyAgICAgKiBvZiB0aGUgYmluZGluZyBhcmUgbm90IHN1cHBsaWVkCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYmluZChTdHJpbmcgbmFtZSwgT2JqZWN0IG9iaiwgQXR0cmlidXRlcyBhdHRycykKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gTm90ZTogTm8gY3VzdG9tIGF0dHJpYnV0ZXMgYWxsb3dlZAorCisgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGJhc2UsIG5hbWUpOworICAgICAgICBpZiAoZmlsZS5leGlzdHMoKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBOYW1lQWxyZWFkeUJvdW5kRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygicmVzb3VyY2VzLmFscmVhZHlCb3VuZCIsIG5hbWUpKTsKKworICAgICAgICByZWJpbmQobmFtZSwgb2JqLCBhdHRycyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEJpbmRzIGEgbmFtZSB0byBhbiBvYmplY3QsIGFsb25nIHdpdGggYXNzb2NpYXRlZCBhdHRyaWJ1dGVzLAorICAgICAqIG92ZXJ3cml0aW5nIGFueSBleGlzdGluZyBiaW5kaW5nLiBJZiBhdHRycyBpcyBudWxsIGFuZCBvYmogaXMgYQorICAgICAqIERpckNvbnRleHQsIHRoZSBhdHRyaWJ1dGVzIGZyb20gb2JqIGFyZSB1c2VkLiBJZiBhdHRycyBpcyBudWxsIGFuZCBvYmoKKyAgICAgKiBpcyBub3QgYSBEaXJDb250ZXh0LCBhbnkgZXhpc3RpbmcgYXR0cmlidXRlcyBhc3NvY2lhdGVkIHdpdGggdGhlIG9iamVjdAorICAgICAqIGFscmVhZHkgYm91bmQgaW4gdGhlIGRpcmVjdG9yeSByZW1haW4gdW5jaGFuZ2VkLiBJZiBhdHRycyBpcyBub24tbnVsbCwKKyAgICAgKiBhbnkgZXhpc3RpbmcgYXR0cmlidXRlcyBhc3NvY2lhdGVkIHdpdGggdGhlIG9iamVjdCBhbHJlYWR5IGJvdW5kIGluCisgICAgICogdGhlIGRpcmVjdG9yeSBhcmUgcmVtb3ZlZCBhbmQgYXR0cnMgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBuYW1lZAorICAgICAqIG9iamVjdC4gSWYgb2JqIGlzIGEgRGlyQ29udGV4dCBhbmQgYXR0cnMgaXMgbm9uLW51bGwsIHRoZSBhdHRyaWJ1dGVzCisgICAgICogb2Ygb2JqIGFyZSBpZ25vcmVkLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgdG8gYmluZDsgbWF5IG5vdCBiZSBlbXB0eQorICAgICAqIEBwYXJhbSBvYmogdGhlIG9iamVjdCB0byBiaW5kOyBwb3NzaWJseSBudWxsCisgICAgICogQHBhcmFtIGF0dHJzIHRoZSBhdHRyaWJ1dGVzIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBiaW5kaW5nCisgICAgICogQGV4Y2VwdGlvbiBJbnZhbGlkQXR0cmlidXRlc0V4Y2VwdGlvbiBpZiBzb21lICJtYW5kYXRvcnkiIGF0dHJpYnV0ZXMKKyAgICAgKiBvZiB0aGUgYmluZGluZyBhcmUgbm90IHN1cHBsaWVkCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmViaW5kKFN0cmluZyBuYW1lLCBPYmplY3Qgb2JqLCBBdHRyaWJ1dGVzIGF0dHJzKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBOb3RlOiBObyBjdXN0b20gYXR0cmlidXRlcyBhbGxvd2VkCisgICAgICAgIC8vIENoZWNrIG9iaiB0eXBlCisKKyAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoYmFzZSwgbmFtZSk7CisKKyAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBudWxsOworICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgUmVzb3VyY2UpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaXMgPSAoKFJlc291cmNlKSBvYmopLnN0cmVhbUNvbnRlbnQoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBJbnB1dFN0cmVhbSkgeworICAgICAgICAgICAgaXMgPSAoSW5wdXRTdHJlYW0pIG9iajsKKyAgICAgICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBEaXJDb250ZXh0KSB7CisgICAgICAgICAgICBpZiAoZmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgIGlmICghZmlsZS5kZWxldGUoKSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5hbWluZ0V4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygicmVzb3VyY2VzLmJpbmRGYWlsZWQiLCBuYW1lKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWZpbGUubWtkaXIoKSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTmFtaW5nRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInJlc291cmNlcy5iaW5kRmFpbGVkIiwgbmFtZSkpOworICAgICAgICB9CisgICAgICAgIGlmIChpcyA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IE5hbWluZ0V4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInJlc291cmNlcy5iaW5kRmFpbGVkIiwgbmFtZSkpOworCisgICAgICAgIC8vIE9wZW4gb3MKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBvcyA9IG51bGw7CisgICAgICAgICAgICBieXRlIGJ1ZmZlcltdID0gbmV3IGJ5dGVbQlVGRkVSX1NJWkVdOworICAgICAgICAgICAgaW50IGxlbiA9IC0xOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpOworICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgICAgICAgIGxlbiA9IGlzLnJlYWQoYnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxlbiA9PSAtMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBvcy53cml0ZShidWZmZXIsIDAsIGxlbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBpZiAob3MgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgb3MuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICBpcy5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTmFtaW5nRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygicmVzb3VyY2VzLmJpbmRGYWlsZWQiLCBlKSk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbmQgYmluZHMgYSBuZXcgY29udGV4dCwgYWxvbmcgd2l0aCBhc3NvY2lhdGVkIGF0dHJpYnV0ZXMuCisgICAgICogVGhpcyBtZXRob2QgY3JlYXRlcyBhIG5ldyBzdWJjb250ZXh0IHdpdGggdGhlIGdpdmVuIG5hbWUsIGJpbmRzIGl0IGluCisgICAgICogdGhlIHRhcmdldCBjb250ZXh0ICh0aGF0IG5hbWVkIGJ5IGFsbCBidXQgdGVybWluYWwgYXRvbWljIGNvbXBvbmVudCBvZgorICAgICAqIHRoZSBuYW1lKSwgYW5kIGFzc29jaWF0ZXMgdGhlIHN1cHBsaWVkIGF0dHJpYnV0ZXMgd2l0aCB0aGUgbmV3bHkKKyAgICAgKiBjcmVhdGVkIG9iamVjdC4gQWxsIGludGVybWVkaWF0ZSBhbmQgdGFyZ2V0IGNvbnRleHRzIG11c3QgYWxyZWFkeQorICAgICAqIGV4aXN0LiBJZiBhdHRycyBpcyBudWxsLCB0aGlzIG1ldGhvZCBpcyBlcXVpdmFsZW50IHRvCisgICAgICogQ29udGV4dC5jcmVhdGVTdWJjb250ZXh0KCkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgY29udGV4dCB0byBjcmVhdGU7IG1heSBub3QgYmUgZW1wdHkKKyAgICAgKiBAcGFyYW0gYXR0cnMgdGhlIGF0dHJpYnV0ZXMgdG8gYXNzb2NpYXRlIHdpdGggdGhlIG5ld2x5IGNyZWF0ZWQgY29udGV4dAorICAgICAqIEByZXR1cm4gdGhlIG5ld2x5IGNyZWF0ZWQgY29udGV4dAorICAgICAqIEBleGNlcHRpb24gTmFtZUFscmVhZHlCb3VuZEV4Y2VwdGlvbiBpZiB0aGUgbmFtZSBpcyBhbHJlYWR5IGJvdW5kCisgICAgICogQGV4Y2VwdGlvbiBJbnZhbGlkQXR0cmlidXRlc0V4Y2VwdGlvbiBpZiBhdHRycyBkb2VzIG5vdCBjb250YWluIGFsbAorICAgICAqIHRoZSBtYW5kYXRvcnkgYXR0cmlidXRlcyByZXF1aXJlZCBmb3IgY3JlYXRpb24KKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgRGlyQ29udGV4dCBjcmVhdGVTdWJjb250ZXh0KFN0cmluZyBuYW1lLCBBdHRyaWJ1dGVzIGF0dHJzKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKworICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShiYXNlLCBuYW1lKTsKKyAgICAgICAgaWYgKGZpbGUuZXhpc3RzKCkpCisgICAgICAgICAgICB0aHJvdyBuZXcgTmFtZUFscmVhZHlCb3VuZEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInJlc291cmNlcy5hbHJlYWR5Qm91bmQiLCBuYW1lKSk7CisgICAgICAgIGlmICghZmlsZS5ta2RpcigpKQorICAgICAgICAgICAgdGhyb3cgbmV3IE5hbWluZ0V4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInJlc291cmNlcy5iaW5kRmFpbGVkIiwgbmFtZSkpOworICAgICAgICByZXR1cm4gKERpckNvbnRleHQpIGxvb2t1cChuYW1lKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSBzY2hlbWEgYXNzb2NpYXRlZCB3aXRoIHRoZSBuYW1lZCBvYmplY3QuIFRoZSBzY2hlbWEKKyAgICAgKiBkZXNjcmliZXMgcnVsZXMgcmVnYXJkaW5nIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIG5hbWVzcGFjZSBhbmQgdGhlCisgICAgICogYXR0cmlidXRlcyBzdG9yZWQgd2l0aGluIGl0LiBUaGUgc2NoZW1hIHNwZWNpZmllcyB3aGF0IHR5cGVzIG9mCisgICAgICogb2JqZWN0cyBjYW4gYmUgYWRkZWQgdG8gdGhlIGRpcmVjdG9yeSBhbmQgd2hlcmUgdGhleSBjYW4gYmUgYWRkZWQ7CisgICAgICogd2hhdCBtYW5kYXRvcnkgYW5kIG9wdGlvbmFsIGF0dHJpYnV0ZXMgYW4gb2JqZWN0IGNhbiBoYXZlLiBUaGUgcmFuZ2UKKyAgICAgKiBvZiBzdXBwb3J0IGZvciBzY2hlbWFzIGlzIGRpcmVjdG9yeS1zcGVjaWZpYy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBvYmplY3Qgd2hvc2Ugc2NoZW1hIGlzIHRvIGJlIHJldHJpZXZlZAorICAgICAqIEByZXR1cm4gdGhlIHNjaGVtYSBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbnRleHQ7IG5ldmVyIG51bGwKKyAgICAgKiBAZXhjZXB0aW9uIE9wZXJhdGlvbk5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBpZiBzY2hlbWEgbm90IHN1cHBvcnRlZAorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBEaXJDb250ZXh0IGdldFNjaGVtYShTdHJpbmcgbmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBPcGVyYXRpb25Ob3RTdXBwb3J0ZWRFeGNlcHRpb24oKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyBhIGNvbnRleHQgY29udGFpbmluZyB0aGUgc2NoZW1hIG9iamVjdHMgb2YgdGhlIG5hbWVkCisgICAgICogb2JqZWN0J3MgY2xhc3MgZGVmaW5pdGlvbnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgb2JqZWN0IHdob3NlIG9iamVjdCBjbGFzcyBkZWZpbml0aW9uIGlzIHRvCisgICAgICogYmUgcmV0cmlldmVkCisgICAgICogQHJldHVybiB0aGUgRGlyQ29udGV4dCBjb250YWluaW5nIHRoZSBuYW1lZCBvYmplY3QncyBjbGFzcworICAgICAqIGRlZmluaXRpb25zOyBuZXZlciBudWxsCisgICAgICogQGV4Y2VwdGlvbiBPcGVyYXRpb25Ob3RTdXBwb3J0ZWRFeGNlcHRpb24gaWYgc2NoZW1hIG5vdCBzdXBwb3J0ZWQKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgRGlyQ29udGV4dCBnZXRTY2hlbWFDbGFzc0RlZmluaXRpb24oU3RyaW5nIG5hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgT3BlcmF0aW9uTm90U3VwcG9ydGVkRXhjZXB0aW9uKCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZWFyY2hlcyBpbiBhIHNpbmdsZSBjb250ZXh0IGZvciBvYmplY3RzIHRoYXQgY29udGFpbiBhIHNwZWNpZmllZCBzZXQKKyAgICAgKiBvZiBhdHRyaWJ1dGVzLCBhbmQgcmV0cmlldmVzIHNlbGVjdGVkIGF0dHJpYnV0ZXMuIFRoZSBzZWFyY2ggaXMKKyAgICAgKiBwZXJmb3JtZWQgdXNpbmcgdGhlIGRlZmF1bHQgU2VhcmNoQ29udHJvbHMgc2V0dGluZ3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgY29udGV4dCB0byBzZWFyY2gKKyAgICAgKiBAcGFyYW0gbWF0Y2hpbmdBdHRyaWJ1dGVzIHRoZSBhdHRyaWJ1dGVzIHRvIHNlYXJjaCBmb3IuIElmIGVtcHR5IG9yCisgICAgICogbnVsbCwgYWxsIG9iamVjdHMgaW4gdGhlIHRhcmdldCBjb250ZXh0IGFyZSByZXR1cm5lZC4KKyAgICAgKiBAcGFyYW0gYXR0cmlidXRlc1RvUmV0dXJuIHRoZSBhdHRyaWJ1dGVzIHRvIHJldHVybi4gbnVsbCBpbmRpY2F0ZXMKKyAgICAgKiB0aGF0IGFsbCBhdHRyaWJ1dGVzIGFyZSB0byBiZSByZXR1cm5lZDsgYW4gZW1wdHkgYXJyYXkgaW5kaWNhdGVzIHRoYXQKKyAgICAgKiBub25lIGFyZSB0byBiZSByZXR1cm5lZC4KKyAgICAgKiBAcmV0dXJuIGEgbm9uLW51bGwgZW51bWVyYXRpb24gb2YgU2VhcmNoUmVzdWx0IG9iamVjdHMuIEVhY2gKKyAgICAgKiBTZWFyY2hSZXN1bHQgY29udGFpbnMgdGhlIGF0dHJpYnV0ZXMgaWRlbnRpZmllZCBieSBhdHRyaWJ1dGVzVG9SZXR1cm4KKyAgICAgKiBhbmQgdGhlIG5hbWUgb2YgdGhlIGNvcnJlc3BvbmRpbmcgb2JqZWN0LCBuYW1lZCByZWxhdGl2ZSB0byB0aGUKKyAgICAgKiBjb250ZXh0IG5hbWVkIGJ5IG5hbWUuCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIE5hbWluZ0VudW1lcmF0aW9uIHNlYXJjaChTdHJpbmcgbmFtZSwgQXR0cmlidXRlcyBtYXRjaGluZ0F0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBhdHRyaWJ1dGVzVG9SZXR1cm4pCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNlYXJjaGVzIGluIGEgc2luZ2xlIGNvbnRleHQgZm9yIG9iamVjdHMgdGhhdCBjb250YWluIGEgc3BlY2lmaWVkIHNldAorICAgICAqIG9mIGF0dHJpYnV0ZXMuIFRoaXMgbWV0aG9kIHJldHVybnMgYWxsIHRoZSBhdHRyaWJ1dGVzIG9mIHN1Y2ggb2JqZWN0cy4KKyAgICAgKiBJdCBpcyBlcXVpdmFsZW50IHRvIHN1cHBseWluZyBudWxsIGFzIHRoZSBhdHJpYnV0ZXNUb1JldHVybiBwYXJhbWV0ZXIKKyAgICAgKiB0byB0aGUgbWV0aG9kIHNlYXJjaChOYW1lLCBBdHRyaWJ1dGVzLCBTdHJpbmdbXSkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgY29udGV4dCB0byBzZWFyY2gKKyAgICAgKiBAcGFyYW0gbWF0Y2hpbmdBdHRyaWJ1dGVzIHRoZSBhdHRyaWJ1dGVzIHRvIHNlYXJjaCBmb3IuIElmIGVtcHR5IG9yCisgICAgICogbnVsbCwgYWxsIG9iamVjdHMgaW4gdGhlIHRhcmdldCBjb250ZXh0IGFyZSByZXR1cm5lZC4KKyAgICAgKiBAcmV0dXJuIGEgbm9uLW51bGwgZW51bWVyYXRpb24gb2YgU2VhcmNoUmVzdWx0IG9iamVjdHMuIEVhY2gKKyAgICAgKiBTZWFyY2hSZXN1bHQgY29udGFpbnMgdGhlIGF0dHJpYnV0ZXMgaWRlbnRpZmllZCBieSBhdHRyaWJ1dGVzVG9SZXR1cm4KKyAgICAgKiBhbmQgdGhlIG5hbWUgb2YgdGhlIGNvcnJlc3BvbmRpbmcgb2JqZWN0LCBuYW1lZCByZWxhdGl2ZSB0byB0aGUKKyAgICAgKiBjb250ZXh0IG5hbWVkIGJ5IG5hbWUuCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIE5hbWluZ0VudW1lcmF0aW9uIHNlYXJjaChTdHJpbmcgbmFtZSwgQXR0cmlidXRlcyBtYXRjaGluZ0F0dHJpYnV0ZXMpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNlYXJjaGVzIGluIHRoZSBuYW1lZCBjb250ZXh0IG9yIG9iamVjdCBmb3IgZW50cmllcyB0aGF0IHNhdGlzZnkgdGhlCisgICAgICogZ2l2ZW4gc2VhcmNoIGZpbHRlci4gUGVyZm9ybXMgdGhlIHNlYXJjaCBhcyBzcGVjaWZpZWQgYnkgdGhlIHNlYXJjaAorICAgICAqIGNvbnRyb2xzLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbnRleHQgb3Igb2JqZWN0IHRvIHNlYXJjaAorICAgICAqIEBwYXJhbSBmaWx0ZXIgdGhlIGZpbHRlciBleHByZXNzaW9uIHRvIHVzZSBmb3IgdGhlIHNlYXJjaDsgbWF5IG5vdCBiZQorICAgICAqIG51bGwKKyAgICAgKiBAcGFyYW0gY29ucyB0aGUgc2VhcmNoIGNvbnRyb2xzIHRoYXQgY29udHJvbCB0aGUgc2VhcmNoLiBJZiBudWxsLAorICAgICAqIHRoZSBkZWZhdWx0IHNlYXJjaCBjb250cm9scyBhcmUgdXNlZCAoZXF1aXZhbGVudCB0bworICAgICAqIChuZXcgU2VhcmNoQ29udHJvbHMoKSkpLgorICAgICAqIEByZXR1cm4gYW4gZW51bWVyYXRpb24gb2YgU2VhcmNoUmVzdWx0cyBvZiB0aGUgb2JqZWN0cyB0aGF0IHNhdGlzZnkKKyAgICAgKiB0aGUgZmlsdGVyOyBuZXZlciBudWxsCisgICAgICogQGV4Y2VwdGlvbiBJbnZhbGlkU2VhcmNoRmlsdGVyRXhjZXB0aW9uIGlmIHRoZSBzZWFyY2ggZmlsdGVyIHNwZWNpZmllZAorICAgICAqIGlzIG5vdCBzdXBwb3J0ZWQgb3IgdW5kZXJzdG9vZCBieSB0aGUgdW5kZXJseWluZyBkaXJlY3RvcnkKKyAgICAgKiBAZXhjZXB0aW9uIEludmFsaWRTZWFyY2hDb250cm9sc0V4Y2VwdGlvbiBpZiB0aGUgc2VhcmNoIGNvbnRyb2xzCisgICAgICogY29udGFpbiBpbnZhbGlkIHNldHRpbmdzCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIE5hbWluZ0VudW1lcmF0aW9uIHNlYXJjaChTdHJpbmcgbmFtZSwgU3RyaW5nIGZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlYXJjaENvbnRyb2xzIGNvbnMpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNlYXJjaGVzIGluIHRoZSBuYW1lZCBjb250ZXh0IG9yIG9iamVjdCBmb3IgZW50cmllcyB0aGF0IHNhdGlzZnkgdGhlCisgICAgICogZ2l2ZW4gc2VhcmNoIGZpbHRlci4gUGVyZm9ybXMgdGhlIHNlYXJjaCBhcyBzcGVjaWZpZWQgYnkgdGhlIHNlYXJjaAorICAgICAqIGNvbnRyb2xzLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbnRleHQgb3Igb2JqZWN0IHRvIHNlYXJjaAorICAgICAqIEBwYXJhbSBmaWx0ZXJFeHByIHRoZSBmaWx0ZXIgZXhwcmVzc2lvbiB0byB1c2UgZm9yIHRoZSBzZWFyY2guCisgICAgICogVGhlIGV4cHJlc3Npb24gbWF5IGNvbnRhaW4gdmFyaWFibGVzIG9mIHRoZSBmb3JtICJ7aX0iIHdoZXJlIGkgaXMgYQorICAgICAqIG5vbm5lZ2F0aXZlIGludGVnZXIuIE1heSBub3QgYmUgbnVsbC4KKyAgICAgKiBAcGFyYW0gZmlsdGVyQXJncyB0aGUgYXJyYXkgb2YgYXJndW1lbnRzIHRvIHN1YnN0aXR1dGUgZm9yIHRoZQorICAgICAqIHZhcmlhYmxlcyBpbiBmaWx0ZXJFeHByLiBUaGUgdmFsdWUgb2YgZmlsdGVyQXJnc1tpXSB3aWxsIHJlcGxhY2UgZWFjaAorICAgICAqIG9jY3VycmVuY2Ugb2YgIntpfSIuIElmIG51bGwsIGVxdWl2YWxlbnQgdG8gYW4gZW1wdHkgYXJyYXkuCisgICAgICogQHBhcmFtIGNvbnMgdGhlIHNlYXJjaCBjb250cm9scyB0aGF0IGNvbnRyb2wgdGhlIHNlYXJjaC4gSWYgbnVsbCwgdGhlCisgICAgICogZGVmYXVsdCBzZWFyY2ggY29udHJvbHMgYXJlIHVzZWQgKGVxdWl2YWxlbnQgdG8gKG5ldyBTZWFyY2hDb250cm9scygpKSkuCisgICAgICogQHJldHVybiBhbiBlbnVtZXJhdGlvbiBvZiBTZWFyY2hSZXN1bHRzIG9mIHRoZSBvYmplY3RzIHRoYXQgc2F0aXN5IHRoZQorICAgICAqIGZpbHRlcjsgbmV2ZXIgbnVsbAorICAgICAqIEBleGNlcHRpb24gQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIGZpbHRlckV4cHIgY29udGFpbnMge2l9CisgICAgICogZXhwcmVzc2lvbnMgd2hlcmUgaSBpcyBvdXRzaWRlIHRoZSBib3VuZHMgb2YgdGhlIGFycmF5IGZpbHRlckFyZ3MKKyAgICAgKiBAZXhjZXB0aW9uIEludmFsaWRTZWFyY2hDb250cm9sc0V4Y2VwdGlvbiBpZiBjb25zIGNvbnRhaW5zIGludmFsaWQKKyAgICAgKiBzZXR0aW5ncworICAgICAqIEBleGNlcHRpb24gSW52YWxpZFNlYXJjaEZpbHRlckV4Y2VwdGlvbiBpZiBmaWx0ZXJFeHByIHdpdGggZmlsdGVyQXJncworICAgICAqIHJlcHJlc2VudHMgYW4gaW52YWxpZCBzZWFyY2ggZmlsdGVyCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIE5hbWluZ0VudW1lcmF0aW9uIHNlYXJjaChTdHJpbmcgbmFtZSwgU3RyaW5nIGZpbHRlckV4cHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RbXSBmaWx0ZXJBcmdzLCBTZWFyY2hDb250cm9scyBjb25zKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvdGVjdGVkIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgY29udGV4dC1yZWxhdGl2ZSBwYXRoLCBiZWdpbm5pbmcgd2l0aCBhICIvIiwgdGhhdCByZXByZXNlbnRzCisgICAgICogdGhlIGNhbm9uaWNhbCB2ZXJzaW9uIG9mIHRoZSBzcGVjaWZpZWQgcGF0aCBhZnRlciAiLi4iIGFuZCAiLiIgZWxlbWVudHMKKyAgICAgKiBhcmUgcmVzb2x2ZWQgb3V0LiAgSWYgdGhlIHNwZWNpZmllZCBwYXRoIGF0dGVtcHRzIHRvIGdvIG91dHNpZGUgdGhlCisgICAgICogYm91bmRhcmllcyBvZiB0aGUgY3VycmVudCBjb250ZXh0IChpLmUuIHRvbyBtYW55ICIuLiIgcGF0aCBlbGVtZW50cworICAgICAqIGFyZSBwcmVzZW50KSwgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGluc3RlYWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0aCBQYXRoIHRvIGJlIG5vcm1hbGl6ZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIG5vcm1hbGl6ZShTdHJpbmcgcGF0aCkgeworCisgICAgU3RyaW5nIG5vcm1hbGl6ZWQgPSBwYXRoOworCisgICAgLy8gTm9ybWFsaXplIHRoZSBzbGFzaGVzIGFuZCBhZGQgbGVhZGluZyBzbGFzaCBpZiBuZWNlc3NhcnkKKyAgICBpZiAobm9ybWFsaXplZC5pbmRleE9mKCdcXCcpID49IDApCisgICAgICAgIG5vcm1hbGl6ZWQgPSBub3JtYWxpemVkLnJlcGxhY2UoJ1xcJywgJy8nKTsKKyAgICBpZiAoIW5vcm1hbGl6ZWQuc3RhcnRzV2l0aCgiLyIpKQorICAgICAgICBub3JtYWxpemVkID0gIi8iICsgbm9ybWFsaXplZDsKKworICAgIC8vIFJlc29sdmUgb2NjdXJyZW5jZXMgb2YgIi8vIiBpbiB0aGUgbm9ybWFsaXplZCBwYXRoCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgaW50IGluZGV4ID0gbm9ybWFsaXplZC5pbmRleE9mKCIvLyIpOworICAgICAgICBpZiAoaW5kZXggPCAwKQorICAgICAgICBicmVhazsKKyAgICAgICAgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZWQuc3Vic3RyaW5nKDAsIGluZGV4KSArCisgICAgICAgIG5vcm1hbGl6ZWQuc3Vic3RyaW5nKGluZGV4ICsgMSk7CisgICAgfQorCisgICAgLy8gUmVzb2x2ZSBvY2N1cnJlbmNlcyBvZiAiLy4vIiBpbiB0aGUgbm9ybWFsaXplZCBwYXRoCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgaW50IGluZGV4ID0gbm9ybWFsaXplZC5pbmRleE9mKCIvLi8iKTsKKyAgICAgICAgaWYgKGluZGV4IDwgMCkKKyAgICAgICAgYnJlYWs7CisgICAgICAgIG5vcm1hbGl6ZWQgPSBub3JtYWxpemVkLnN1YnN0cmluZygwLCBpbmRleCkgKworICAgICAgICBub3JtYWxpemVkLnN1YnN0cmluZyhpbmRleCArIDIpOworICAgIH0KKworICAgIC8vIFJlc29sdmUgb2NjdXJyZW5jZXMgb2YgIi8uLi8iIGluIHRoZSBub3JtYWxpemVkIHBhdGgKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBpbnQgaW5kZXggPSBub3JtYWxpemVkLmluZGV4T2YoIi8uLi8iKTsKKyAgICAgICAgaWYgKGluZGV4IDwgMCkKKyAgICAgICAgYnJlYWs7CisgICAgICAgIGlmIChpbmRleCA9PSAwKQorICAgICAgICByZXR1cm4gKG51bGwpOyAgLy8gVHJ5aW5nIHRvIGdvIG91dHNpZGUgb3VyIGNvbnRleHQKKyAgICAgICAgaW50IGluZGV4MiA9IG5vcm1hbGl6ZWQubGFzdEluZGV4T2YoJy8nLCBpbmRleCAtIDEpOworICAgICAgICBub3JtYWxpemVkID0gbm9ybWFsaXplZC5zdWJzdHJpbmcoMCwgaW5kZXgyKSArCisgICAgICAgIG5vcm1hbGl6ZWQuc3Vic3RyaW5nKGluZGV4ICsgMyk7CisgICAgfQorCisgICAgLy8gUmV0dXJuIHRoZSBub3JtYWxpemVkIHBhdGggdGhhdCB3ZSBoYXZlIGNvbXBsZXRlZAorICAgIHJldHVybiAobm9ybWFsaXplZCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIEZpbGUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgc3BlY2lmaWVkIG5vcm1hbGl6ZWQKKyAgICAgKiBjb250ZXh0LXJlbGF0aXZlIHBhdGggaWYgaXQgZXhpc3RzIGFuZCBpcyByZWFkYWJsZS4gIE90aGVyd2lzZSwKKyAgICAgKiByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOb3JtYWxpemVkIGNvbnRleHQtcmVsYXRpdmUgcGF0aCAod2l0aCBsZWFkaW5nICcvJykKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRmlsZSBmaWxlKFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoYmFzZSwgbmFtZSk7CisgICAgICAgIGlmIChmaWxlLmV4aXN0cygpICYmIGZpbGUuY2FuUmVhZCgpKSB7CisKKyAgICAgICAgCWlmIChhbGxvd0xpbmtpbmcpCisgICAgICAgIAkJcmV0dXJuIGZpbGU7CisgICAgICAgIAkKKyAgICAgICAgICAgIC8vIENoZWNrIHRoYXQgdGhpcyBmaWxlIGJlbG9uZ3MgdG8gb3VyIHJvb3QgcGF0aAorICAgICAgICAgICAgU3RyaW5nIGNhblBhdGggPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjYW5QYXRoID0gZmlsZS5nZXRDYW5vbmljYWxQYXRoKCk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2FuUGF0aCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgZ29pbmcgb3V0c2lkZSBvZiB0aGUgd2ViIGFwcGxpY2F0aW9uIHJvb3QKKyAgICAgICAgICAgIGlmICghY2FuUGF0aC5zdGFydHNXaXRoKGFic29sdXRlQmFzZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQ2FzZSBzZW5zaXRpdml0eSBjaGVjaworICAgICAgICAgICAgaWYgKGNhc2VTZW5zaXRpdmUpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZUFic1BhdGggPSBmaWxlLmdldEFic29sdXRlUGF0aCgpOworICAgICAgICAgICAgICAgIGlmIChmaWxlQWJzUGF0aC5lbmRzV2l0aCgiLiIpKQorICAgICAgICAgICAgICAgICAgICBmaWxlQWJzUGF0aCA9IGZpbGVBYnNQYXRoICsgIi8iOworICAgICAgICAgICAgICAgIFN0cmluZyBhYnNQYXRoID0gbm9ybWFsaXplKGZpbGVBYnNQYXRoKTsKKyAgICAgICAgICAgICAgICBpZiAoY2FuUGF0aCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBjYW5QYXRoID0gbm9ybWFsaXplKGNhblBhdGgpOworICAgICAgICAgICAgICAgIGlmICgoYWJzb2x1dGVCYXNlLmxlbmd0aCgpIDwgYWJzUGF0aC5sZW5ndGgoKSkKKyAgICAgICAgICAgICAgICAgICAgJiYgKGFic29sdXRlQmFzZS5sZW5ndGgoKSA8IGNhblBhdGgubGVuZ3RoKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGFic1BhdGggPSBhYnNQYXRoLnN1YnN0cmluZyhhYnNvbHV0ZUJhc2UubGVuZ3RoKCkgKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChjYW5QYXRoID09IG51bGwpIHx8IChhYnNQYXRoID09IG51bGwpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgICAgIGlmIChhYnNQYXRoLmVxdWFscygiIikpCisgICAgICAgICAgICAgICAgICAgICAgICBhYnNQYXRoID0gIi8iOworICAgICAgICAgICAgICAgICAgICBjYW5QYXRoID0gY2FuUGF0aC5zdWJzdHJpbmcoYWJzb2x1dGVCYXNlLmxlbmd0aCgpICsgMSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjYW5QYXRoLmVxdWFscygiIikpCisgICAgICAgICAgICAgICAgICAgICAgICBjYW5QYXRoID0gIi8iOworICAgICAgICAgICAgICAgICAgICBpZiAoIWNhblBhdGguZXF1YWxzKGFic1BhdGgpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmlsZTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogTGlzdCB0aGUgcmVzb3VyY2VzIHdoaWNoIGFyZSBtZW1iZXJzIG9mIGEgY29sbGVjdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWxlIENvbGxlY3Rpb24KKyAgICAgKiBAcmV0dXJuIFZlY3RvciBjb250YWluZyBOYW1pbmdFbnRyeSBvYmplY3RzCisgICAgICovCisgICAgcHJvdGVjdGVkIEFycmF5TGlzdCBsaXN0KEZpbGUgZmlsZSkgeworCisgICAgICAgIEFycmF5TGlzdCBlbnRyaWVzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBpZiAoIWZpbGUuaXNEaXJlY3RvcnkoKSkKKyAgICAgICAgICAgIHJldHVybiBlbnRyaWVzOworICAgICAgICBTdHJpbmdbXSBuYW1lcyA9IGZpbGUubGlzdCgpOworICAgICAgICBpZiAobmFtZXM9PW51bGwpIHsKKyAgICAgICAgICAgIC8qIFNvbWUgSU8gZXJyb3Igb2NjdXJyZWQgc3VjaCBhcyBiYWQgZmlsZSBwZXJtaXNzaW9ucy4KKyAgICAgICAgICAgICAgIFByZXZlbnQgYSBOUEUgd2l0aCBBcnJheXMuc29ydChuYW1lcykgKi8KKyAgICAgICAgICAgIGxvZy53YXJuKHNtLmdldFN0cmluZygiZmlsZVJlc291cmNlcy5saXN0aW5nTnVsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSkpOworICAgICAgICAgICAgcmV0dXJuIGVudHJpZXM7CisgICAgICAgIH0KKworICAgICAgICBBcnJheXMuc29ydChuYW1lcyk7ICAgICAgICAgICAgIC8vIFNvcnQgYWxwaGFiZXRpY2FsbHkKKyAgICAgICAgaWYgKG5hbWVzID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZW50cmllczsKKyAgICAgICAgTmFtaW5nRW50cnkgZW50cnkgPSBudWxsOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHsKKworICAgICAgICAgICAgRmlsZSBjdXJyZW50RmlsZSA9IG5ldyBGaWxlKGZpbGUsIG5hbWVzW2ldKTsKKyAgICAgICAgICAgIE9iamVjdCBvYmplY3QgPSBudWxsOworICAgICAgICAgICAgaWYgKGN1cnJlbnRGaWxlLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgICAgICBGaWxlRGlyQ29udGV4dCB0ZW1wQ29udGV4dCA9IG5ldyBGaWxlRGlyQ29udGV4dChlbnYpOworICAgICAgICAgICAgICAgIHRlbXBDb250ZXh0LnNldERvY0Jhc2UoZmlsZS5nZXRQYXRoKCkpOworICAgICAgICAgICAgICAgIG9iamVjdCA9IHRlbXBDb250ZXh0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBvYmplY3QgPSBuZXcgRmlsZVJlc291cmNlKGN1cnJlbnRGaWxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVudHJ5ID0gbmV3IE5hbWluZ0VudHJ5KG5hbWVzW2ldLCBvYmplY3QsIE5hbWluZ0VudHJ5LkVOVFJZKTsKKyAgICAgICAgICAgIGVudHJpZXMuYWRkKGVudHJ5KTsKKworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGVudHJpZXM7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZpbGVSZXNvdXJjZSBJbm5lciBDbGFzcworCisKKyAgICAvKioKKyAgICAgKiBUaGlzIHNwZWNpYWxpemVkIHJlc291cmNlIGltcGxlbWVudGF0aW9uIGF2b2lkcyBvcGVuaW5nIHRoZSBJcHV0U3RyZWFtCisgICAgICogdG8gdGhlIGZpbGUgcmlnaHQgYXdheSAod2hpY2ggd291bGQgcHV0IGEgbG9jayBvbiB0aGUgZmlsZSkuCisgICAgICovCisgICAgcHJvdGVjdGVkIGNsYXNzIEZpbGVSZXNvdXJjZSBleHRlbmRzIFJlc291cmNlIHsKKworCisgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9yCisKKworICAgICAgICBwdWJsaWMgRmlsZVJlc291cmNlKEZpbGUgZmlsZSkgeworICAgICAgICAgICAgdGhpcy5maWxlID0gZmlsZTsKKyAgICAgICAgfQorCisKKyAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE1lbWJlciBWYXJpYWJsZXMKKworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBc3NvY2lhdGVkIGZpbGUgb2JqZWN0LgorICAgICAgICAgKi8KKyAgICAgICAgcHJvdGVjdGVkIEZpbGUgZmlsZTsKKworCisgICAgICAgIC8qKgorICAgICAgICAgKiBGaWxlIGxlbmd0aC4KKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCBsb25nIGxlbmd0aCA9IC0xTDsKKworCisgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBSZXNvdXJjZSBNZXRob2RzCisKKworICAgICAgICAvKioKKyAgICAgICAgICogQ29udGVudCBhY2Nlc3Nvci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBJbnB1dFN0cmVhbQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIElucHV0U3RyZWFtIHN0cmVhbUNvbnRlbnQoKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChiaW5hcnlDb250ZW50ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuc3RyZWFtQ29udGVudCgpOworICAgICAgICB9CisKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGaWxlUmVzb3VyY2VBdHRyaWJ1dGVzIElubmVyIENsYXNzCisKKworICAgIC8qKgorICAgICAqIFRoaXMgc3BlY2lhbGl6ZWQgcmVzb3VyY2UgYXR0cmlidXRlIGltcGxlbWVudGF0aW9uIGRvZXMgc29tZSBsYXp5CisgICAgICogcmVhZGluZyAodG8gc3BlZWQgdXAgc2ltcGxlIGNoZWNrcywgbGlrZSBjaGVja2luZyB0aGUgbGFzdCBtb2RpZmllZAorICAgICAqIGRhdGUpLgorICAgICAqLworICAgIHByb3RlY3RlZCBjbGFzcyBGaWxlUmVzb3VyY2VBdHRyaWJ1dGVzIGV4dGVuZHMgUmVzb3VyY2VBdHRyaWJ1dGVzIHsKKworCisgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9yCisKKworICAgICAgICBwdWJsaWMgRmlsZVJlc291cmNlQXR0cmlidXRlcyhGaWxlIGZpbGUpIHsKKyAgICAgICAgICAgIHRoaXMuZmlsZSA9IGZpbGU7CisgICAgICAgIH0KKworICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTWVtYmVyIFZhcmlhYmxlcworCisKKyAgICAgICAgcHJvdGVjdGVkIEZpbGUgZmlsZTsKKworCisgICAgICAgIHByb3RlY3RlZCBib29sZWFuIGFjY2Vzc2VkID0gZmFsc2U7CisKKworICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBSZXNvdXJjZUF0dHJpYnV0ZXMgTWV0aG9kcworCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIElzIGNvbGxlY3Rpb24uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0NvbGxlY3Rpb24oKSB7CisgICAgICAgICAgICBpZiAoIWFjY2Vzc2VkKSB7CisgICAgICAgICAgICAgICAgY29sbGVjdGlvbiA9IGZpbGUuaXNEaXJlY3RvcnkoKTsKKyAgICAgICAgICAgICAgICBhY2Nlc3NlZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuaXNDb2xsZWN0aW9uKCk7CisgICAgICAgIH0KKworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgY29udGVudCBsZW5ndGguCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gY29udGVudCBsZW5ndGggdmFsdWUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBsb25nIGdldENvbnRlbnRMZW5ndGgoKSB7CisgICAgICAgICAgICBpZiAoY29udGVudExlbmd0aCAhPSAtMUwpCisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnRMZW5ndGg7CisgICAgICAgICAgICBjb250ZW50TGVuZ3RoID0gZmlsZS5sZW5ndGgoKTsKKyAgICAgICAgICAgIHJldHVybiBjb250ZW50TGVuZ3RoOworICAgICAgICB9CisKKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IGNyZWF0aW9uIHRpbWUuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gY3JlYXRpb24gdGltZSB2YWx1ZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGxvbmcgZ2V0Q3JlYXRpb24oKSB7CisgICAgICAgICAgICBpZiAoY3JlYXRpb24gIT0gLTFMKQorICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGlvbjsKKyAgICAgICAgICAgIGNyZWF0aW9uID0gZmlsZS5sYXN0TW9kaWZpZWQoKTsKKyAgICAgICAgICAgIHJldHVybiBjcmVhdGlvbjsKKyAgICAgICAgfQorCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCBjcmVhdGlvbiBkYXRlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIENyZWF0aW9uIGRhdGUgdmFsdWUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBEYXRlIGdldENyZWF0aW9uRGF0ZSgpIHsKKyAgICAgICAgICAgIGlmIChjcmVhdGlvbiA9PSAtMUwpIHsKKyAgICAgICAgICAgICAgICBjcmVhdGlvbiA9IGZpbGUubGFzdE1vZGlmaWVkKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0Q3JlYXRpb25EYXRlKCk7CisgICAgICAgIH0KKworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgbGFzdCBtb2RpZmllZCB0aW1lLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIGxhc3RNb2RpZmllZCB0aW1lIHZhbHVlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgbG9uZyBnZXRMYXN0TW9kaWZpZWQoKSB7CisgICAgICAgICAgICBpZiAobGFzdE1vZGlmaWVkICE9IC0xTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbGFzdE1vZGlmaWVkOworICAgICAgICAgICAgbGFzdE1vZGlmaWVkID0gZmlsZS5sYXN0TW9kaWZpZWQoKTsKKyAgICAgICAgICAgIHJldHVybiBsYXN0TW9kaWZpZWQ7CisgICAgICAgIH0KKworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgbGFzdE1vZGlmaWVkIGRhdGUuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gTGFzdE1vZGlmaWVkIGRhdGUgdmFsdWUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBEYXRlIGdldExhc3RNb2RpZmllZERhdGUoKSB7CisgICAgICAgICAgICBpZiAobGFzdE1vZGlmaWVkID09IC0xTCkgeworICAgICAgICAgICAgICAgIGxhc3RNb2RpZmllZCA9IGZpbGUubGFzdE1vZGlmaWVkKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0TGFzdE1vZGlmaWVkRGF0ZSgpOworICAgICAgICB9CisKKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IG5hbWUuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gTmFtZSB2YWx1ZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBuYW1lID0gZmlsZS5nZXROYW1lKCk7CisgICAgICAgICAgICByZXR1cm4gbmFtZTsKKyAgICAgICAgfQorCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCByZXNvdXJjZSB0eXBlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIFN0cmluZyByZXNvdXJjZSB0eXBlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlVHlwZSgpIHsKKyAgICAgICAgICAgIGlmICghYWNjZXNzZWQpIHsKKyAgICAgICAgICAgICAgICBjb2xsZWN0aW9uID0gZmlsZS5pc0RpcmVjdG9yeSgpOworICAgICAgICAgICAgICAgIGFjY2Vzc2VkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRSZXNvdXJjZVR5cGUoKTsKKyAgICAgICAgfQorCisKKyAgICB9CisKKworfQorCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL3Jlc291cmNlcy9JbW11dGFibGVOYW1lTm90Rm91bmRFeGNlcHRpb24uamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvcmVzb3VyY2VzL0ltbXV0YWJsZU5hbWVOb3RGb3VuZEV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkZWYzZDIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL3Jlc291cmNlcy9JbW11dGFibGVOYW1lTm90Rm91bmRFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovIAorCitwYWNrYWdlIG9yZy5hcGFjaGUubmFtaW5nLnJlc291cmNlczsKKworaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1lOworaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1lTm90Rm91bmRFeGNlcHRpb247CisKKy8qKgorICogSW1tdXRhYmxlIGV4Y2VwdGlvbiB0byBhdm9pZCB1c2VsZXNzIG9iamVjdCBjcmVhdGlvbiBieSB0aGUgcHJveHkgY29udGV4dC4KKyAqIFRoaXMgc2hvdWxkIGJlIHVzZWQgb25seSBieSB0aGUgcHJveHkgY29udGV4dC4gQWN0dWFsIGNvbnRleHRzIHNob3VsZCByZXR1cm4KKyAqIHByb3Blcmx5IHBvcHVsYXRlZCBleGNlcHRpb25zLgorICogCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpyZW1tQGFwYWNoZS5vcmciPlJlbXkgTWF1Y2hlcmF0PC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgSW1tdXRhYmxlTmFtZU5vdEZvdW5kRXhjZXB0aW9uCisgICAgZXh0ZW5kcyBOYW1lTm90Rm91bmRFeGNlcHRpb24geworCisgICAgcHVibGljIHZvaWQgYXBwZW5kUmVtYWluaW5nQ29tcG9uZW50KFN0cmluZyBuYW1lKSB7fQorICAgIHB1YmxpYyB2b2lkIGFwcGVuZFJlbWFpbmluZ05hbWUoTmFtZSBuYW1lKSB7fQorICAgIHB1YmxpYyB2b2lkIHNldFJlbWFpbmluZ05hbWUoTmFtZSBuYW1lKSB7fQorICAgIHB1YmxpYyB2b2lkIHNldFJlc29sdmVyTmFtZShOYW1lIG5hbWUpIHt9CisgICAgcHVibGljIHZvaWQgc2V0Um9vdENhdXNlKFRocm93YWJsZSBlKSB7fQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL3Jlc291cmNlcy9Mb2NhbFN0cmluZ3MucHJvcGVydGllcyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvcmVzb3VyY2VzL0xvY2FsU3RyaW5ncy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNzEzMmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL3Jlc291cmNlcy9Mb2NhbFN0cmluZ3MucHJvcGVydGllcwpAQCAtMCwwICsxLDIxIEBACitmaWxlUmVzb3VyY2VzLmJhc2U9RG9jdW1lbnQgYmFzZSB7MH0gZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90IGEgcmVhZGFibGUgZGlyZWN0b3J5CitmaWxlUmVzb3VyY2VzLmxpc3RpbmdOdWxsPUNvdWxkIG5vdCBnZXQgZGlyIGxpc3RpbmcgZm9yIHswfQord2FyUmVzb3VyY2VzLm5vdFdhcj1Eb2MgYmFzZSBtdXN0IHBvaW50IHRvIGEgV0FSIGZpbGUKK3dhclJlc291cmNlcy5pbnZhbGlkV2FyPUludmFsaWQgb3IgdW5yZWFkYWJsZSBXQVIgZmlsZSA6IHswfQoramFyUmVzb3VyY2VzLnN5bnRheD1Eb2N1bWVudCBiYXNlIHswfSBtdXN0IHN0YXJ0IHdpdGggJ2phcjonIGFuZCBlbmQgd2l0aCAnIS8nCityZXNvdXJjZXMuYWxyZWFkeVN0YXJ0ZWQ9UmVzb3VyY2VzIGhhcyBhbHJlYWR5IGJlZW4gc3RhcnRlZAorcmVzb3VyY2VzLmNvbm5lY3Q9Q2Fubm90IGNvbm5lY3QgdG8gZG9jdW1lbnQgYmFzZSB7MH0KK3Jlc291cmNlcy5pbnB1dD1DYW5ub3QgY3JlYXRlIGlucHV0IHN0cmVhbSBmb3IgcmVzb3VyY2UgezB9CityZXNvdXJjZXMubm90U3RhcnRlZD1SZXNvdXJjZXMgaGFzIG5vdCB5ZXQgYmVlbiBzdGFydGVkCityZXNvdXJjZXMubnVsbD1Eb2N1bWVudCBiYXNlIGNhbm5vdCBiZSBudWxsCityZXNvdXJjZXMubm90Rm91bmQ9UmVzb3VyY2UgezB9IG5vdCBmb3VuZAorcmVzb3VyY2VzLnBhdGg9Q29udGV4dCByZWxhdGl2ZSBwYXRoIHswfSBtdXN0IHN0YXJ0IHdpdGggJy8nCityZXNvdXJjZXMuYWxyZWFkeUJvdW5kPU5hbWUgezB9IGlzIGFscmVhZHkgYm91bmQgaW4gdGhpcyBDb250ZXh0CityZXNvdXJjZXMuYmluZEZhaWxlZD1CaW5kIGZhaWxlZDogezB9CityZXNvdXJjZXMudW5iaW5kRmFpbGVkPVVuYmluZCBmYWlsZWQ6IHswfQorc3RhbmRhcmRSZXNvdXJjZXMuYWxyZWFkeVN0YXJ0ZWQ9UmVzb3VyY2VzIGhhcyBhbHJlYWR5IGJlZW4gc3RhcnRlZAorc3RhbmRhcmRSZXNvdXJjZXMuZGlyZWN0b3J5PUZpbGUgYmFzZSB7MH0gaXMgbm90IGEgZGlyZWN0b3J5CitzdGFuZGFyZFJlc291cmNlcy5leGlzdHM9RmlsZSBiYXNlIHswfSBkb2VzIG5vdCBleGlzdAorc3RhbmRhcmRSZXNvdXJjZXMubm90U3RhcnRlZD1SZXNvdXJjZXMgaGFzIG5vdCB5ZXQgYmVlbiBzdGFydGVkCitzdGFuZGFyZFJlc291cmNlcy5udWxsPURvY3VtZW50IGJhc2UgY2Fubm90IGJlIG51bGwKK3N0YW5kYXJkUmVzb3VyY2VzLnNsYXNoPURvY3VtZW50IGJhc2UgezB9IG11c3Qgbm90IGVuZCB3aXRoIGEgc2xhc2gKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvcmVzb3VyY2VzL0xvY2FsU3RyaW5nc19lcy5wcm9wZXJ0aWVzIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9yZXNvdXJjZXMvTG9jYWxTdHJpbmdzX2VzLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVjNDVkMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvcmVzb3VyY2VzL0xvY2FsU3RyaW5nc19lcy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMjAgQEAKK2ZpbGVSZXNvdXJjZXMuYmFzZT1FbCBEb2N1bWVudG8gYmFzZSB7MH0gbm8gZXhpc3RlIG8gbm8gZXMgdW4gZGlyZWN0b3JpbyBsZWdpYmxlCit3YXJSZXNvdXJjZXMubm90V2FyPURvYyBiYXNlIGRlYmUgZGUgYXB1bnRhciBhIHVuIGFyY2hpdm8gV0FSCit3YXJSZXNvdXJjZXMuaW52YWxpZFdhcj1BcmNoaXZvIFdBUiBpbnbhbGlkbyBvIGlsZWdpYmxlOiB7MH0KK2phclJlc291cmNlcy5zeW50YXg9RG9jdW1lbnRvIGJhc2UgezB9IGRlYmUgZGUgZW1wZXphciBjb24gJ2phcjonIHkgYWNhYmFyIGNvbiAnIS8nCityZXNvdXJjZXMuYWxyZWFkeVN0YXJ0ZWQ9WWEgaGFuIHNpZG8gYXJyYW5jYWRvcyBsb3MgUmVjdXJzb3MKK3Jlc291cmNlcy5jb25uZWN0PU5vIHB1ZWRvIGNvbmVjdGFyIGEgZG9jdW1lbnRvIGJhc2UgezB9CityZXNvdXJjZXMuaW5wdXQ9Tm8gcHVlZG8gY3JlYXIgZmx1am8gKHN0cmVhbSkgZGUgZW50cmFkYSBwYXJhIHJlY3Vyc28gezB9CityZXNvdXJjZXMubm90U3RhcnRlZD1B+m4gbm8gaGFuIHNpZG8gYXJyYW5jYWRvcyBsb3MgUmVjdXJzb3MKK3Jlc291cmNlcy5udWxsPUVsIERvY3VtZW50byBiYXNlIG5vIHB1ZWRlIHNlciBudWxvCityZXNvdXJjZXMubm90Rm91bmQ9UmVjdXJzbyB7MH0gbm8gaGFsbGFkbworcmVzb3VyY2VzLnBhdGg9VHJheWVjdG9yaWEgcmVsYXRpdmEgYSBjb250ZXh0byB7MH0gZGViZSBkZSBjb21lbnphciBjb24gJy8nCityZXNvdXJjZXMuYWxyZWFkeUJvdW5kPUVsIE5vbWJyZSB7MH0geWEgaGEgc2lkbyBjYW1iaWFkbyAoYm91bmQpIGVuIGVzdGUgQ29udGV4dG8KK3Jlc291cmNlcy5iaW5kRmFpbGVkPUZhbGzzIGVsIENhbWJpbyAoQmluZCk6IHswfQorcmVzb3VyY2VzLnVuYmluZEZhaWxlZD1GYWxs8yBlbCBEZXNjYW1iaW8gKFVuYmluZCk6IHswfQorc3RhbmRhcmRSZXNvdXJjZXMuYWxyZWFkeVN0YXJ0ZWQ9WWEgaGFuIHNpZG8gYXJyYW5jYWRvcyBsb3MgUmVjdXJzb3MKK3N0YW5kYXJkUmVzb3VyY2VzLmRpcmVjdG9yeT1FbCBhcmNoaXZvIGJhc2UgezB9IG5vIGVzIHVuIGRpcmVjdG9yaW8KK3N0YW5kYXJkUmVzb3VyY2VzLmV4aXN0cz1FbCBhcmNoaXZvIGJhc2UgezB9IG5vIGV4aXN0ZQorc3RhbmRhcmRSZXNvdXJjZXMubm90U3RhcnRlZD1B+m4gbm8gaGFuIHNpZG8gYXJyYW5jYWRvcyBsb3MgUmVjdXJzb3MKK3N0YW5kYXJkUmVzb3VyY2VzLm51bGw9RWwgRG9jdW1lbnRvIGJhc2Ugbm8gcHVlZGUgc2VyIG51bG8KK3N0YW5kYXJkUmVzb3VyY2VzLnNsYXNoPUVsIERvY3VtZW50byBiYXNlIHswfSBubyBkZWJlIGRlIHRlcm1pbmFyIGNvbiB1bmEgYmFycmEKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvcmVzb3VyY2VzL0xvY2FsU3RyaW5nc19mci5wcm9wZXJ0aWVzIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9yZXNvdXJjZXMvTG9jYWxTdHJpbmdzX2ZyLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJkNDY5MAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvcmVzb3VyY2VzL0xvY2FsU3RyaW5nc19mci5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMjAgQEAKK2ZpbGVSZXNvdXJjZXMuYmFzZT1MZSBkb2N1bWVudCBiYXNlIHswfSBuJydleGlzdGUgcGFzIG91IG4nJ2VzdCBwYXMgdW4gculwZXJ0b2lyZSBsaXNpYmxlCit3YXJSZXNvdXJjZXMubm90V2FyPURvYyBiYXNlIGRvaXQgcG9pbnTpIHZlcnMgdW4gZmljaGllciBXQVIKK3dhclJlc291cmNlcy5pbnZhbGlkV2FyPUZpY2hpZXIgV0FSIGludmFsaWRlIG91IGlsbGlzaWJsZSAgOiB7MH0KK2phclJlc291cmNlcy5zeW50YXg9TGUgZG9jdW1lbnQgYmFzZSB7MH0gZG9pdCBjb21tZW5j6SBwYXIgJ2phcjonIGV0IGZpbmlyIGF2ZWMgJyEvJworcmVzb3VyY2VzLmFscmVhZHlTdGFydGVkPUxlcyBSZXNzb3VyY2VzIG9udCBk6WrgIOl06SBk6W1hcnLpZXMKK3Jlc291cmNlcy5jb25uZWN0PUltcG9zc2libGUgZGUgc2UgY29ubmVjdGVyIGF1IGRvY3VtZW50IGJhc2UgezB9CityZXNvdXJjZXMuaW5wdXQ9SW1wb3NzaWJsZSBkZSBjcullciBsJ2lucHV0IHN0cmVhbSBwb3VyIGxhIHJlc3NvdXJjZSB7MH0KK3Jlc291cmNlcy5ub3RTdGFydGVkPUxlcyByZXNzb3VyY2VzIG4nJ29udCBwYXMgZW5jb3JlIOl06SBk6W1hcnLpZXMKK3Jlc291cmNlcy5udWxsPUxlIGRvY3VtZW50IGJhc2UgbmUgcGV1dCDqdHJlIG51bAorcmVzb3VyY2VzLm5vdEZvdW5kPUxhIHJlc3NvdXJjZSB7MH0gZXN0IGludHJvdXZhYmxlCityZXNvdXJjZXMucGF0aD1MZSBjaGVtaW4gcmVsYXRpZiBkZSBjb250ZXh0IHswfSBkb2l0IGNvbW1lbmPpIHBhciAnLycKK3Jlc291cmNlcy5hbHJlYWR5Qm91bmQ9TGUgbm9tIHswfSBlc3QgZOlq4CBy6WbpcmVuY+kgcGFyIGNlIGNvbnRleHRlCityZXNvdXJjZXMuYmluZEZhaWxlZD1MZSBsaWFnZSBhIOljaG916TogezB9CityZXNvdXJjZXMudW5iaW5kRmFpbGVkPUxlIGTpbGlhZ2UgYSDpY2hvdek6IHswfQorc3RhbmRhcmRSZXNvdXJjZXMuYWxyZWFkeVN0YXJ0ZWQ9TGVzIHJlc3NvdXJjZXMgb250IGTpamEg6XTpIGTpbWFycullcworc3RhbmRhcmRSZXNvdXJjZXMuZGlyZWN0b3J5PUxlIGZpbGUgYmFzZSB7MH0gbicnZXN0IHBhcyB1biBy6XBlcnRvaXJlCitzdGFuZGFyZFJlc291cmNlcy5leGlzdHM9TGUgZmlsZSBiYXNlIHswfSBuJydleGlzdGUgcGFzCitzdGFuZGFyZFJlc291cmNlcy5ub3RTdGFydGVkPUxlcyByZXNzb3VyY2VzIG4nJ29udCBwYXMgZW5jb3JlIOl06SBk6W1hcnLpZXMKK3N0YW5kYXJkUmVzb3VyY2VzLm51bGw9TGUgZG9jdW1lbnQgYmFzZSBuZSBwZXV0IOp0cmUgbnVsCitzdGFuZGFyZFJlc291cmNlcy5zbGFzaD1MZSBkb2N1bWVudCBiYXNlIHswfSBuZSBkb2l0IHBhcyBzZSB0ZXJtaW5lciBwYXIgdW4gJy8nCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL3Jlc291cmNlcy9Mb2NhbFN0cmluZ3NfamEucHJvcGVydGllcyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvcmVzb3VyY2VzL0xvY2FsU3RyaW5nc19qYS5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NDIwNGQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL3Jlc291cmNlcy9Mb2NhbFN0cmluZ3NfamEucHJvcGVydGllcwpAQCAtMCwwICsxLDIxIEBACitmaWxlUmVzb3VyY2VzLmJhc2U9XHUzMGM5XHUzMGFkXHUzMGU1XHUzMGUxXHUzMGYzXHUzMGM4XHUzMGQ5XHUzMGZjXHUzMGI5IHswfSBcdTMwNGNcdTViNThcdTU3MjhcdTMwNTdcdTMwNmFcdTMwNDRcdTMwMDFcdTUzYzhcdTMwNmZcdThhYWRcdTMwODFcdTMwNmFcdTMwNDRcdTMwYzdcdTMwYTNcdTMwZWNcdTMwYWZcdTMwYzhcdTMwZWFcdTMwNjdcdTMwNTkKK2ZpbGVSZXNvdXJjZXMubGlzdGluZ051bGw9ezB9IFx1MzA2ZVx1MzBjN1x1MzBhM1x1MzBlY1x1MzBhZlx1MzBjOFx1MzBlYVx1MzA2ZVx1MzBlYVx1MzBiOVx1MzBjOFx1MzA5Mlx1NTNkNlx1NWY5N1x1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5Mword2FyUmVzb3VyY2VzLm5vdFdhcj1cdTMwYzlcdTMwYWRcdTMwZTVcdTMwZTFcdTMwZjNcdTMwYzhcdTMwZDlcdTMwZmNcdTMwYjlcdTMwNmZXQVJcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTMwOTJcdTc5M2FcdTMwNTVcdTMwNmFcdTMwNTFcdTMwOGNcdTMwNzBcdTMwNDRcdTMwNTFcdTMwN2VcdTMwNWJcdTMwOTMKK3dhclJlc291cmNlcy5pbnZhbGlkV2FyPVx1NzEyMVx1NTJiOVx1NTNjOFx1MzA2Zlx1OGFhZFx1MzA4MVx1MzA2YVx1MzA0NFdBUlx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA2N1x1MzA1OSA6IHswfQoramFyUmVzb3VyY2VzLnN5bnRheD1cdTMwYzlcdTMwYWRcdTMwZTVcdTMwZTFcdTMwZjNcdTMwYzhcdTMwZDlcdTMwZmNcdTMwYjkgezB9IFx1MzA2ZidqYXI6J1x1MzA2N1x1NTljYlx1MzA3ZVx1MzA4YVx1MzAwMSchLydcdTMwNjdcdTdkNDJcdTMwODlcdTMwNmFcdTMwNTFcdTMwOGNcdTMwNzBcdTMwNDRcdTMwNTFcdTMwN2VcdTMwNWJcdTMwOTMKK3Jlc291cmNlcy5hbHJlYWR5U3RhcnRlZD1cdTMwZWFcdTMwYmRcdTMwZmNcdTMwYjlcdTMwNmZcdTY1ZTJcdTMwNmJcdThkNzdcdTUyZDVcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkKK3Jlc291cmNlcy5jb25uZWN0PVx1MzBjOVx1MzBhZFx1MzBlNVx1MzBlMVx1MzBmM1x1MzBjOFx1MzBkOVx1MzBmY1x1MzBiOSB7MH0gXHUzMDZiXHU2M2E1XHU3ZDlhXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzCityZXNvdXJjZXMuaW5wdXQ9XHUzMGVhXHUzMGJkXHUzMGZjXHUzMGI5IHswfSBcdTMwNmJcdTUxNjVcdTUyOWJcdTMwYjlcdTMwYzhcdTMwZWFcdTMwZmNcdTMwZTBcdTMwOTJcdTRmNWNcdTYyMTBcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMKK3Jlc291cmNlcy5ub3RTdGFydGVkPVx1MzBlYVx1MzBiZFx1MzBmY1x1MzBiOVx1MzA2Zlx1MzA3ZVx1MzA2MFx1OGQ3N1x1NTJkNVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5MworcmVzb3VyY2VzLm51bGw9XHUzMGM5XHUzMGFkXHUzMGU1XHUzMGUxXHUzMGYzXHUzMGM4XHUzMGQ5XHUzMGZjXHUzMGI5XHUzMDZmbnVsbFx1MzA2N1x1MzA0Mlx1MzA2M1x1MzA2Nlx1MzA2Zlx1MzA0NFx1MzA1MVx1MzA3ZVx1MzA1Ylx1MzA5MworcmVzb3VyY2VzLm5vdEZvdW5kPVx1MzBlYVx1MzBiZFx1MzBmY1x1MzBiOSB7MH0gXHUzMDRjXHU4OThiXHUzMDY0XHUzMDRiXHUzMDhhXHUzMDdlXHUzMDViXHUzMDkzCityZXNvdXJjZXMucGF0aD1cdTMwYjNcdTMwZjNcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzhcdTc2ZjhcdTViZmVcdTMwZDFcdTMwYjkgezB9IFx1MzA2ZicvJ1x1MzA2N1x1NTljYlx1MzA3ZVx1MzA4OVx1MzA2YVx1MzA1MVx1MzA4Y1x1MzA3MFx1MzA0NFx1MzA1MVx1MzA3ZVx1MzA1Ylx1MzA5MworcmVzb3VyY2VzLmFscmVhZHlCb3VuZD1cdTU0MGRcdTUyNGQgezB9IFx1MzA2Zlx1NjVlMlx1MzA2Ylx1MzA1M1x1MzA2ZVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBhZFx1MzBiOVx1MzBjOFx1MzA2Ylx1MzBkMFx1MzBhNFx1MzBmM1x1MzBjOVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OQorcmVzb3VyY2VzLmJpbmRGYWlsZWQ9XHUzMGQwXHUzMGE0XHUzMGYzXHUzMGM5XHUzMDRjXHU1OTMxXHU2NTU3XHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmOiB7MH0KK3Jlc291cmNlcy51bmJpbmRGYWlsZWQ9XHUzMGEyXHUzMGYzXHUzMGQwXHUzMGE0XHUzMGYzXHUzMGM5XHUzMDRjXHU1OTMxXHU2NTU3XHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmOiB7MH0KK3N0YW5kYXJkUmVzb3VyY2VzLmFscmVhZHlTdGFydGVkPVx1MzBlYVx1MzBiZFx1MzBmY1x1MzBiOVx1MzA2Zlx1NjVlMlx1MzA2Ylx1OGQ3N1x1NTJkNVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OQorc3RhbmRhcmRSZXNvdXJjZXMuZGlyZWN0b3J5PVx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzBkOVx1MzBmY1x1MzBiOSB7MH0gXHUzMDZmXHUzMGM3XHUzMGEzXHUzMGVjXHUzMGFmXHUzMGM4XHUzMGVhXHUzMDY3XHUzMDZmXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDViXHUzMDkzCitzdGFuZGFyZFJlc291cmNlcy5leGlzdHM9XHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMGQ5XHUzMGZjXHUzMGI5IHswfSBcdTMwNmZcdTViNThcdTU3MjhcdTMwNTdcdTMwN2VcdTMwNWJcdTMwOTMKK3N0YW5kYXJkUmVzb3VyY2VzLm5vdFN0YXJ0ZWQ9XHUzMGVhXHUzMGJkXHUzMGZjXHUzMGI5XHUzMDRjXHUzMDdlXHUzMDYwXHU4ZDc3XHU1MmQ1XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzCitzdGFuZGFyZFJlc291cmNlcy5udWxsPVx1MzBjOVx1MzBhZFx1MzBlNVx1MzBlMVx1MzBmM1x1MzBjOFx1MzBkOVx1MzBmY1x1MzBiOVx1MzA2Zm51bGxcdTMwNjdcdTMwNDJcdTMwNjNcdTMwNjZcdTMwNmZcdTMwNDRcdTMwNTFcdTMwN2VcdTMwNWJcdTMwOTMKK3N0YW5kYXJkUmVzb3VyY2VzLnNsYXNoPVx1MzBjOVx1MzBhZFx1MzBlNVx1MzBlMVx1MzBmM1x1MzBjOFx1MzBkOVx1MzBmY1x1MzBiOSB7MH0gXHUzMDZmXHUzMGI5XHUzMGU5XHUzMGMzXHUzMGI3XHUzMGU1XHUzMDY3XHU3ZDQyXHUzMDYzXHUzMDY2XHUzMDZmXHUzMDQ0XHUzMDUxXHUzMDdlXHUzMDViXHUzMDkzCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL3Jlc291cmNlcy9Qcm94eURpckNvbnRleHQuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvcmVzb3VyY2VzL1Byb3h5RGlyQ29udGV4dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwYmYxOWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL3Jlc291cmNlcy9Qcm94eURpckNvbnRleHQuamF2YQpAQCAtMCwwICsxLDE2MjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8gCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm5hbWluZy5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworCitpbXBvcnQgamF2YXgubmFtaW5nLkNvbnRleHQ7CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWU7CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtZVBhcnNlcjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtaW5nRW51bWVyYXRpb247CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuZGlyZWN0b3J5LkF0dHJpYnV0ZXM7CitpbXBvcnQgamF2YXgubmFtaW5nLmRpcmVjdG9yeS5EaXJDb250ZXh0OworaW1wb3J0IGphdmF4Lm5hbWluZy5kaXJlY3RvcnkuTW9kaWZpY2F0aW9uSXRlbTsKK2ltcG9ydCBqYXZheC5uYW1pbmcuZGlyZWN0b3J5LlNlYXJjaENvbnRyb2xzOworCitpbXBvcnQgb3JnLmFwYWNoZS5uYW1pbmcuU3RyaW5nTWFuYWdlcjsKKworLyoqCisgKiBQcm94eSBEaXJlY3RvcnkgQ29udGV4dCBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBAYXV0aG9yIFJlbXkgTWF1Y2hlcmF0CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBQcm94eURpckNvbnRleHQgaW1wbGVtZW50cyBEaXJDb250ZXh0IHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RhbnRzCisKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFWFQgPSAiY29udGV4dCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSE9TVCA9ICJob3N0IjsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworICAgIC8qKgorICAgICAqIEJ1aWxkcyBhIHByb3h5IGRpcmVjdG9yeSBjb250ZXh0IHVzaW5nIHRoZSBnaXZlbiBlbnZpcm9ubWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgUHJveHlEaXJDb250ZXh0KEhhc2h0YWJsZSBlbnYsIERpckNvbnRleHQgZGlyQ29udGV4dCkgeworICAgICAgICB0aGlzLmVudiA9IGVudjsKKyAgICAgICAgdGhpcy5kaXJDb250ZXh0ID0gZGlyQ29udGV4dDsKKyAgICAgICAgaWYgKGRpckNvbnRleHQgaW5zdGFuY2VvZiBCYXNlRGlyQ29udGV4dCkgeworICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSBwYXJhbWV0ZXJzIGJhc2VkIG9uIHRoZSBhc3NvY2lhdGVkIGRpciBjb250ZXh0LCBsaWtlCisgICAgICAgICAgICAvLyB0aGUgY2FjaGluZyBwb2xpY3kuCisgICAgICAgICAgICBCYXNlRGlyQ29udGV4dCBiYXNlRGlyQ29udGV4dCA9IChCYXNlRGlyQ29udGV4dCkgZGlyQ29udGV4dDsKKyAgICAgICAgICAgIGlmIChiYXNlRGlyQ29udGV4dC5pc0NhY2hlZCgpKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgY2FjaGUgPSAoUmVzb3VyY2VDYWNoZSkgCisgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcy5mb3JOYW1lKGNhY2hlQ2xhc3NOYW1lKS5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vRklYTUUKKyAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FjaGUuc2V0Q2FjaGVNYXhTaXplKGJhc2VEaXJDb250ZXh0LmdldENhY2hlTWF4U2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBjYWNoZVRUTCA9IGJhc2VEaXJDb250ZXh0LmdldENhY2hlVFRMKCk7CisgICAgICAgICAgICAgICAgY2FjaGVPYmplY3RNYXhTaXplID0gYmFzZURpckNvbnRleHQuZ2V0Q2FjaGVNYXhTaXplKCkgLyAyMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBob3N0TmFtZSA9IChTdHJpbmcpIGVudi5nZXQoSE9TVCk7CisgICAgICAgIGNvbnRleHROYW1lID0gKFN0cmluZykgZW52LmdldChDT05URVhUKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEJ1aWxkcyBhIGNsb25lIG9mIHRoaXMgcHJveHkgZGlyIGNvbnRleHQsIHdyYXBwaW5nIHRoZSBnaXZlbiBkaXJlY3RvcnkKKyAgICAgKiBjb250ZXh0LCBhbmQgc2hhcmluZyB0aGUgc2FtZSBjYWNoZS4KKyAgICAgKi8KKyAgICAvLyBUT0RPOiBSZWZhY3RvciB1c2luZyB0aGUgcHJveHkgZmllbGQKKyAgICAvKgorICAgIHByb3RlY3RlZCBQcm94eURpckNvbnRleHQoUHJveHlEaXJDb250ZXh0IHByb3h5RGlyQ29udGV4dCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXJDb250ZXh0IGRpckNvbnRleHQsIFN0cmluZyB2UGF0aCkgeworICAgICAgICB0aGlzLmVudiA9IHByb3h5RGlyQ29udGV4dC5lbnY7CisgICAgICAgIHRoaXMuZGlyQ29udGV4dCA9IGRpckNvbnRleHQ7CisgICAgICAgIHRoaXMudlBhdGggPSB2UGF0aDsKKyAgICAgICAgdGhpcy5jYWNoZSA9IHByb3h5RGlyQ29udGV4dC5jYWNoZTsKKyAgICAgICAgdGhpcy5jYWNoZU1heFNpemUgPSBwcm94eURpckNvbnRleHQuY2FjaGVNYXhTaXplOworICAgICAgICB0aGlzLmNhY2hlU2l6ZSA9IHByb3h5RGlyQ29udGV4dC5jYWNoZVNpemU7CisgICAgICAgIHRoaXMuY2FjaGVUVEwgPSBwcm94eURpckNvbnRleHQuY2FjaGVUVEw7CisgICAgICAgIHRoaXMuY2FjaGVPYmplY3RNYXhTaXplID0gcHJveHlEaXJDb250ZXh0LmNhY2hlT2JqZWN0TWF4U2l6ZTsKKyAgICAgICAgdGhpcy5ub3RGb3VuZENhY2hlID0gcHJveHlEaXJDb250ZXh0Lm5vdEZvdW5kQ2FjaGU7CisgICAgICAgIHRoaXMuaG9zdE5hbWUgPSBwcm94eURpckNvbnRleHQuaG9zdE5hbWU7CisgICAgICAgIHRoaXMuY29udGV4dE5hbWUgPSBwcm94eURpckNvbnRleHQuY29udGV4dE5hbWU7CisgICAgfQorICAgICovCisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBQcm94eSBEaXJDb250ZXh0IChlaXRoZXIgdGhpcyBvciB0aGUgcmVhbCBwcm94eSkuCisgICAgICovCisgICAgcHJvdGVjdGVkIFByb3h5RGlyQ29udGV4dCBwcm94eSA9IHRoaXM7CisKKworICAgIC8qKgorICAgICAqIEVudmlyb25tZW50LgorICAgICAqLworICAgIHByb3RlY3RlZCBIYXNodGFibGUgZW52OworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc3RyaW5nIG1hbmFnZXIgZm9yIHRoaXMgcGFja2FnZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nTWFuYWdlciBzbSA9IFN0cmluZ01hbmFnZXIuZ2V0TWFuYWdlcihDb25zdGFudHMuUGFja2FnZSk7CisKKworICAgIC8qKgorICAgICAqIEFzc29jaWF0ZWQgRGlyQ29udGV4dC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRGlyQ29udGV4dCBkaXJDb250ZXh0OworCisKKyAgICAvKioKKyAgICAgKiBWaXJ0dWFsIHBhdGguCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyB2UGF0aCA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIEhvc3QgbmFtZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGhvc3ROYW1lOworCisKKyAgICAvKioKKyAgICAgKiBDb250ZXh0IG5hbWUuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBjb250ZXh0TmFtZTsKKworCisgICAgLyoqCisgICAgICogQ2FjaGUgY2xhc3MuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBjYWNoZUNsYXNzTmFtZSA9IAorICAgICAgICAib3JnLmFwYWNoZS5uYW1pbmcucmVzb3VyY2VzLlJlc291cmNlQ2FjaGUiOworCisKKyAgICAvKioKKyAgICAgKiBDYWNoZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUmVzb3VyY2VDYWNoZSBjYWNoZSA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIENhY2hlIFRUTC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IGNhY2hlVFRMID0gNTAwMDsgLy8gNXMKKworCisgICAgLyoqCisgICAgICogTWF4IHNpemUgb2YgcmVzb3VyY2VzIHdoaWNoIHdpbGwgaGF2ZSB0aGVpciBjb250ZW50IGNhY2hlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IGNhY2hlT2JqZWN0TWF4U2l6ZSA9IDUxMjsgLy8gNTEyIEtCCisKKworICAgIC8qKgorICAgICAqIEltbXV0YWJsZSBuYW1lIG5vdCBmb3VuZCBleGNlcHRpb24uCisgICAgICovCisgICAgcHJvdGVjdGVkIE5hbWVOb3RGb3VuZEV4Y2VwdGlvbiBub3RGb3VuZEV4Y2VwdGlvbiA9CisgICAgICAgIG5ldyBJbW11dGFibGVOYW1lTm90Rm91bmRFeGNlcHRpb24oKTsKKworCisgICAgLyoqCisgICAgICogTm9uIGNhY2hlYWJsZSByZXNvdXJjZXMuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZ1tdIG5vbkNhY2hlYWJsZSA9IHsgIi9XRUItSU5GL2xpYi8iLCAiL1dFQi1JTkYvY2xhc3Nlcy8iIH07CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGNhY2hlIHVzZWQgZm9yIHRoaXMgY29udGV4dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgUmVzb3VyY2VDYWNoZSBnZXRDYWNoZSgpIHsKKyAgICAgICAgcmV0dXJuIGNhY2hlOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBhY3R1YWwgZGlyZWN0b3J5IGNvbnRleHQgd2UgYXJlIHdyYXBwaW5nLgorICAgICAqLworICAgIHB1YmxpYyBEaXJDb250ZXh0IGdldERpckNvbnRleHQoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmRpckNvbnRleHQ7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGRvY3VtZW50IHJvb3QgZm9yIHRoaXMgY29tcG9uZW50LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RG9jQmFzZSgpIHsKKyAgICAgICAgaWYgKGRpckNvbnRleHQgaW5zdGFuY2VvZiBCYXNlRGlyQ29udGV4dCkKKyAgICAgICAgICAgIHJldHVybiAoKEJhc2VEaXJDb250ZXh0KSBkaXJDb250ZXh0KS5nZXREb2NCYXNlKCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgaG9zdCBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SG9zdE5hbWUoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmhvc3ROYW1lOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjb250ZXh0IG5hbWUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDb250ZXh0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuY29udGV4dE5hbWU7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb250ZXh0IE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSBuYW1lZCBvYmplY3QuIElmIG5hbWUgaXMgZW1wdHksIHJldHVybnMgYSBuZXcgaW5zdGFuY2UgCisgICAgICogb2YgdGhpcyBjb250ZXh0ICh3aGljaCByZXByZXNlbnRzIHRoZSBzYW1lIG5hbWluZyBjb250ZXh0IGFzIHRoaXMgCisgICAgICogY29udGV4dCwgYnV0IGl0cyBlbnZpcm9ubWVudCBtYXkgYmUgbW9kaWZpZWQgaW5kZXBlbmRlbnRseSBhbmQgaXQgbWF5IAorICAgICAqIGJlIGFjY2Vzc2VkIGNvbmN1cnJlbnRseSkuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIG9iamVjdCB0byBsb29rIHVwCisgICAgICogQHJldHVybiB0aGUgb2JqZWN0IGJvdW5kIHRvIG5hbWUKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGxvb2t1cChOYW1lIG5hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICBDYWNoZUVudHJ5IGVudHJ5ID0gY2FjaGVMb29rdXAobmFtZS50b1N0cmluZygpKTsKKyAgICAgICAgaWYgKGVudHJ5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmICghZW50cnkuZXhpc3RzKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbm90Rm91bmRFeGNlcHRpb247CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZW50cnkucmVzb3VyY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIENoZWNrIGNvbnRlbnQgY2FjaGluZy4KKyAgICAgICAgICAgICAgICByZXR1cm4gZW50cnkucmVzb3VyY2U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBlbnRyeS5jb250ZXh0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIE9iamVjdCBvYmplY3QgPSBkaXJDb250ZXh0Lmxvb2t1cChwYXJzZU5hbWUobmFtZSkpOworICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgSW5wdXRTdHJlYW0pCisgICAgICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlKChJbnB1dFN0cmVhbSkgb2JqZWN0KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgbmFtZWQgb2JqZWN0LgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBvYmplY3QgdG8gbG9vayB1cAorICAgICAqIEByZXR1cm4gdGhlIG9iamVjdCBib3VuZCB0byBuYW1lCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBsb29rdXAoU3RyaW5nIG5hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICBDYWNoZUVudHJ5IGVudHJ5ID0gY2FjaGVMb29rdXAobmFtZSk7CisgICAgICAgIGlmIChlbnRyeSAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoIWVudHJ5LmV4aXN0cykgeworICAgICAgICAgICAgICAgIHRocm93IG5vdEZvdW5kRXhjZXB0aW9uOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGVudHJ5LnJlc291cmNlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZW50cnkucmVzb3VyY2U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBlbnRyeS5jb250ZXh0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIE9iamVjdCBvYmplY3QgPSBkaXJDb250ZXh0Lmxvb2t1cChwYXJzZU5hbWUobmFtZSkpOworICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgSW5wdXRTdHJlYW0pIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2UoKElucHV0U3RyZWFtKSBvYmplY3QpOworICAgICAgICB9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIERpckNvbnRleHQpIHsKKyAgICAgICAgICAgIHJldHVybiBvYmplY3Q7CisgICAgICAgIH0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgUmVzb3VyY2UpIHsKKyAgICAgICAgICAgIHJldHVybiBvYmplY3Q7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbQorICAgICAgICAgICAgICAgIChvYmplY3QudG9TdHJpbmcoKS5nZXRCeXRlcygpKSk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEJpbmRzIGEgbmFtZSB0byBhbiBvYmplY3QuIEFsbCBpbnRlcm1lZGlhdGUgY29udGV4dHMgYW5kIHRoZSB0YXJnZXQgCisgICAgICogY29udGV4dCAodGhhdCBuYW1lZCBieSBhbGwgYnV0IHRlcm1pbmFsIGF0b21pYyBjb21wb25lbnQgb2YgdGhlIG5hbWUpIAorICAgICAqIG11c3QgYWxyZWFkeSBleGlzdC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSB0byBiaW5kOyBtYXkgbm90IGJlIGVtcHR5CisgICAgICogQHBhcmFtIG9iaiB0aGUgb2JqZWN0IHRvIGJpbmQ7IHBvc3NpYmx5IG51bGwKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWVBbHJlYWR5Qm91bmRFeGNlcHRpb24gaWYgbmFtZSBpcyBhbHJlYWR5IGJvdW5kCisgICAgICogQGV4Y2VwdGlvbiBJbnZhbGlkQXR0cmlidXRlc0V4Y2VwdGlvbiBpZiBvYmplY3QgZGlkIG5vdCBzdXBwbHkgYWxsIAorICAgICAqIG1hbmRhdG9yeSBhdHRyaWJ1dGVzCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYmluZChOYW1lIG5hbWUsIE9iamVjdCBvYmopCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICBkaXJDb250ZXh0LmJpbmQocGFyc2VOYW1lKG5hbWUpLCBvYmopOworICAgICAgICBjYWNoZVVubG9hZChuYW1lLnRvU3RyaW5nKCkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQmluZHMgYSBuYW1lIHRvIGFuIG9iamVjdC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSB0byBiaW5kOyBtYXkgbm90IGJlIGVtcHR5CisgICAgICogQHBhcmFtIG9iaiB0aGUgb2JqZWN0IHRvIGJpbmQ7IHBvc3NpYmx5IG51bGwKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWVBbHJlYWR5Qm91bmRFeGNlcHRpb24gaWYgbmFtZSBpcyBhbHJlYWR5IGJvdW5kCisgICAgICogQGV4Y2VwdGlvbiBJbnZhbGlkQXR0cmlidXRlc0V4Y2VwdGlvbiBpZiBvYmplY3QgZGlkIG5vdCBzdXBwbHkgYWxsIAorICAgICAqIG1hbmRhdG9yeSBhdHRyaWJ1dGVzCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYmluZChTdHJpbmcgbmFtZSwgT2JqZWN0IG9iaikKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIGRpckNvbnRleHQuYmluZChwYXJzZU5hbWUobmFtZSksIG9iaik7CisgICAgICAgIGNhY2hlVW5sb2FkKG5hbWUpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQmluZHMgYSBuYW1lIHRvIGFuIG9iamVjdCwgb3ZlcndyaXRpbmcgYW55IGV4aXN0aW5nIGJpbmRpbmcuIEFsbCAKKyAgICAgKiBpbnRlcm1lZGlhdGUgY29udGV4dHMgYW5kIHRoZSB0YXJnZXQgY29udGV4dCAodGhhdCBuYW1lZCBieSBhbGwgYnV0IAorICAgICAqIHRlcm1pbmFsIGF0b21pYyBjb21wb25lbnQgb2YgdGhlIG5hbWUpIG11c3QgYWxyZWFkeSBleGlzdC4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiB0aGUgb2JqZWN0IGlzIGEgRGlyQ29udGV4dCwgYW55IGV4aXN0aW5nIGF0dHJpYnV0ZXMgYXNzb2NpYXRlZCB3aXRoIAorICAgICAqIHRoZSBuYW1lIGFyZSByZXBsYWNlZCB3aXRoIHRob3NlIG9mIHRoZSBvYmplY3QuIE90aGVyd2lzZSwgYW55IAorICAgICAqIGV4aXN0aW5nIGF0dHJpYnV0ZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBuYW1lIHJlbWFpbiB1bmNoYW5nZWQuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgdG8gYmluZDsgbWF5IG5vdCBiZSBlbXB0eQorICAgICAqIEBwYXJhbSBvYmogdGhlIG9iamVjdCB0byBiaW5kOyBwb3NzaWJseSBudWxsCisgICAgICogQGV4Y2VwdGlvbiBJbnZhbGlkQXR0cmlidXRlc0V4Y2VwdGlvbiBpZiBvYmplY3QgZGlkIG5vdCBzdXBwbHkgYWxsIAorICAgICAqIG1hbmRhdG9yeSBhdHRyaWJ1dGVzCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmViaW5kKE5hbWUgbmFtZSwgT2JqZWN0IG9iaikKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIGRpckNvbnRleHQucmViaW5kKHBhcnNlTmFtZShuYW1lKSwgb2JqKTsKKyAgICAgICAgY2FjaGVVbmxvYWQobmFtZS50b1N0cmluZygpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEJpbmRzIGEgbmFtZSB0byBhbiBvYmplY3QsIG92ZXJ3cml0aW5nIGFueSBleGlzdGluZyBiaW5kaW5nLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIHRvIGJpbmQ7IG1heSBub3QgYmUgZW1wdHkKKyAgICAgKiBAcGFyYW0gb2JqIHRoZSBvYmplY3QgdG8gYmluZDsgcG9zc2libHkgbnVsbAorICAgICAqIEBleGNlcHRpb24gSW52YWxpZEF0dHJpYnV0ZXNFeGNlcHRpb24gaWYgb2JqZWN0IGRpZCBub3Qgc3VwcGx5IGFsbCAKKyAgICAgKiBtYW5kYXRvcnkgYXR0cmlidXRlcworICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlYmluZChTdHJpbmcgbmFtZSwgT2JqZWN0IG9iaikKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIGRpckNvbnRleHQucmViaW5kKHBhcnNlTmFtZShuYW1lKSwgb2JqKTsKKyAgICAgICAgY2FjaGVVbmxvYWQobmFtZSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBVbmJpbmRzIHRoZSBuYW1lZCBvYmplY3QuIFJlbW92ZXMgdGhlIHRlcm1pbmFsIGF0b21pYyBuYW1lIGluIG5hbWUgCisgICAgICogZnJvbSB0aGUgdGFyZ2V0IGNvbnRleHQtLXRoYXQgbmFtZWQgYnkgYWxsIGJ1dCB0aGUgdGVybWluYWwgYXRvbWljIAorICAgICAqIHBhcnQgb2YgbmFtZS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBpZGVtcG90ZW50LiBJdCBzdWNjZWVkcyBldmVuIGlmIHRoZSB0ZXJtaW5hbCBhdG9taWMgCisgICAgICogbmFtZSBpcyBub3QgYm91bmQgaW4gdGhlIHRhcmdldCBjb250ZXh0LCBidXQgdGhyb3dzIAorICAgICAqIE5hbWVOb3RGb3VuZEV4Y2VwdGlvbiBpZiBhbnkgb2YgdGhlIGludGVybWVkaWF0ZSBjb250ZXh0cyBkbyBub3QgZXhpc3QuIAorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIHRvIGJpbmQ7IG1heSBub3QgYmUgZW1wdHkKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWVOb3RGb3VuZEV4Y2VwdGlvbiBpZiBhbiBpbnRlcm1lZGlhdGUgY29udGV4dCBkb2VzIG5vdCAKKyAgICAgKiBleGlzdAorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHVuYmluZChOYW1lIG5hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICBkaXJDb250ZXh0LnVuYmluZChwYXJzZU5hbWUobmFtZSkpOworICAgICAgICBjYWNoZVVubG9hZChuYW1lLnRvU3RyaW5nKCkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVW5iaW5kcyB0aGUgbmFtZWQgb2JqZWN0LgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIHRvIGJpbmQ7IG1heSBub3QgYmUgZW1wdHkKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWVOb3RGb3VuZEV4Y2VwdGlvbiBpZiBhbiBpbnRlcm1lZGlhdGUgY29udGV4dCBkb2VzIG5vdCAKKyAgICAgKiBleGlzdAorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHVuYmluZChTdHJpbmcgbmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIGRpckNvbnRleHQudW5iaW5kKHBhcnNlTmFtZShuYW1lKSk7CisgICAgICAgIGNhY2hlVW5sb2FkKG5hbWUpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQmluZHMgYSBuZXcgbmFtZSB0byB0aGUgb2JqZWN0IGJvdW5kIHRvIGFuIG9sZCBuYW1lLCBhbmQgdW5iaW5kcyB0aGUgCisgICAgICogb2xkIG5hbWUuIEJvdGggbmFtZXMgYXJlIHJlbGF0aXZlIHRvIHRoaXMgY29udGV4dC4gQW55IGF0dHJpYnV0ZXMgCisgICAgICogYXNzb2NpYXRlZCB3aXRoIHRoZSBvbGQgbmFtZSBiZWNvbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBuZXcgbmFtZS4gCisgICAgICogSW50ZXJtZWRpYXRlIGNvbnRleHRzIG9mIHRoZSBvbGQgbmFtZSBhcmUgbm90IGNoYW5nZWQuCisgICAgICogCisgICAgICogQHBhcmFtIG9sZE5hbWUgdGhlIG5hbWUgb2YgdGhlIGV4aXN0aW5nIGJpbmRpbmc7IG1heSBub3QgYmUgZW1wdHkKKyAgICAgKiBAcGFyYW0gbmV3TmFtZSB0aGUgbmFtZSBvZiB0aGUgbmV3IGJpbmRpbmc7IG1heSBub3QgYmUgZW1wdHkKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWVBbHJlYWR5Qm91bmRFeGNlcHRpb24gaWYgbmV3TmFtZSBpcyBhbHJlYWR5IGJvdW5kCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVuYW1lKE5hbWUgb2xkTmFtZSwgTmFtZSBuZXdOYW1lKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgZGlyQ29udGV4dC5yZW5hbWUocGFyc2VOYW1lKG9sZE5hbWUpLCBwYXJzZU5hbWUobmV3TmFtZSkpOworICAgICAgICBjYWNoZVVubG9hZChvbGROYW1lLnRvU3RyaW5nKCkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQmluZHMgYSBuZXcgbmFtZSB0byB0aGUgb2JqZWN0IGJvdW5kIHRvIGFuIG9sZCBuYW1lLCBhbmQgdW5iaW5kcyB0aGUgCisgICAgICogb2xkIG5hbWUuCisgICAgICogCisgICAgICogQHBhcmFtIG9sZE5hbWUgdGhlIG5hbWUgb2YgdGhlIGV4aXN0aW5nIGJpbmRpbmc7IG1heSBub3QgYmUgZW1wdHkKKyAgICAgKiBAcGFyYW0gbmV3TmFtZSB0aGUgbmFtZSBvZiB0aGUgbmV3IGJpbmRpbmc7IG1heSBub3QgYmUgZW1wdHkKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWVBbHJlYWR5Qm91bmRFeGNlcHRpb24gaWYgbmV3TmFtZSBpcyBhbHJlYWR5IGJvdW5kCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVuYW1lKFN0cmluZyBvbGROYW1lLCBTdHJpbmcgbmV3TmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIGRpckNvbnRleHQucmVuYW1lKHBhcnNlTmFtZShvbGROYW1lKSwgcGFyc2VOYW1lKG5ld05hbWUpKTsKKyAgICAgICAgY2FjaGVVbmxvYWQob2xkTmFtZSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBFbnVtZXJhdGVzIHRoZSBuYW1lcyBib3VuZCBpbiB0aGUgbmFtZWQgY29udGV4dCwgYWxvbmcgd2l0aCB0aGUgY2xhc3MgCisgICAgICogbmFtZXMgb2Ygb2JqZWN0cyBib3VuZCB0byB0aGVtLiBUaGUgY29udGVudHMgb2YgYW55IHN1YmNvbnRleHRzIGFyZSAKKyAgICAgKiBub3QgaW5jbHVkZWQuCisgICAgICogPHA+CisgICAgICogSWYgYSBiaW5kaW5nIGlzIGFkZGVkIHRvIG9yIHJlbW92ZWQgZnJvbSB0aGlzIGNvbnRleHQsIGl0cyBlZmZlY3Qgb24gCisgICAgICogYW4gZW51bWVyYXRpb24gcHJldmlvdXNseSByZXR1cm5lZCBpcyB1bmRlZmluZWQuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbnRleHQgdG8gbGlzdAorICAgICAqIEByZXR1cm4gYW4gZW51bWVyYXRpb24gb2YgdGhlIG5hbWVzIGFuZCBjbGFzcyBuYW1lcyBvZiB0aGUgYmluZGluZ3MgaW4gCisgICAgICogdGhpcyBjb250ZXh0LiBFYWNoIGVsZW1lbnQgb2YgdGhlIGVudW1lcmF0aW9uIGlzIG9mIHR5cGUgTmFtZUNsYXNzUGFpci4KKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgTmFtaW5nRW51bWVyYXRpb24gbGlzdChOYW1lIG5hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZGlyQ29udGV4dC5saXN0KHBhcnNlTmFtZShuYW1lKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBFbnVtZXJhdGVzIHRoZSBuYW1lcyBib3VuZCBpbiB0aGUgbmFtZWQgY29udGV4dCwgYWxvbmcgd2l0aCB0aGUgY2xhc3MgCisgICAgICogbmFtZXMgb2Ygb2JqZWN0cyBib3VuZCB0byB0aGVtLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBjb250ZXh0IHRvIGxpc3QKKyAgICAgKiBAcmV0dXJuIGFuIGVudW1lcmF0aW9uIG9mIHRoZSBuYW1lcyBhbmQgY2xhc3MgbmFtZXMgb2YgdGhlIGJpbmRpbmdzIGluIAorICAgICAqIHRoaXMgY29udGV4dC4gRWFjaCBlbGVtZW50IG9mIHRoZSBlbnVtZXJhdGlvbiBpcyBvZiB0eXBlIE5hbWVDbGFzc1BhaXIuCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIE5hbWluZ0VudW1lcmF0aW9uIGxpc3QoU3RyaW5nIG5hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZGlyQ29udGV4dC5saXN0KHBhcnNlTmFtZShuYW1lKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBFbnVtZXJhdGVzIHRoZSBuYW1lcyBib3VuZCBpbiB0aGUgbmFtZWQgY29udGV4dCwgYWxvbmcgd2l0aCB0aGUgCisgICAgICogb2JqZWN0cyBib3VuZCB0byB0aGVtLiBUaGUgY29udGVudHMgb2YgYW55IHN1YmNvbnRleHRzIGFyZSBub3QgCisgICAgICogaW5jbHVkZWQuCisgICAgICogPHA+CisgICAgICogSWYgYSBiaW5kaW5nIGlzIGFkZGVkIHRvIG9yIHJlbW92ZWQgZnJvbSB0aGlzIGNvbnRleHQsIGl0cyBlZmZlY3Qgb24gCisgICAgICogYW4gZW51bWVyYXRpb24gcHJldmlvdXNseSByZXR1cm5lZCBpcyB1bmRlZmluZWQuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbnRleHQgdG8gbGlzdAorICAgICAqIEByZXR1cm4gYW4gZW51bWVyYXRpb24gb2YgdGhlIGJpbmRpbmdzIGluIHRoaXMgY29udGV4dC4gCisgICAgICogRWFjaCBlbGVtZW50IG9mIHRoZSBlbnVtZXJhdGlvbiBpcyBvZiB0eXBlIEJpbmRpbmcuCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIE5hbWluZ0VudW1lcmF0aW9uIGxpc3RCaW5kaW5ncyhOYW1lIG5hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZGlyQ29udGV4dC5saXN0QmluZGluZ3MocGFyc2VOYW1lKG5hbWUpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEVudW1lcmF0ZXMgdGhlIG5hbWVzIGJvdW5kIGluIHRoZSBuYW1lZCBjb250ZXh0LCBhbG9uZyB3aXRoIHRoZSAKKyAgICAgKiBvYmplY3RzIGJvdW5kIHRvIHRoZW0uCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbnRleHQgdG8gbGlzdAorICAgICAqIEByZXR1cm4gYW4gZW51bWVyYXRpb24gb2YgdGhlIGJpbmRpbmdzIGluIHRoaXMgY29udGV4dC4gCisgICAgICogRWFjaCBlbGVtZW50IG9mIHRoZSBlbnVtZXJhdGlvbiBpcyBvZiB0eXBlIEJpbmRpbmcuCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIE5hbWluZ0VudW1lcmF0aW9uIGxpc3RCaW5kaW5ncyhTdHJpbmcgbmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBkaXJDb250ZXh0Lmxpc3RCaW5kaW5ncyhwYXJzZU5hbWUobmFtZSkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogRGVzdHJveXMgdGhlIG5hbWVkIGNvbnRleHQgYW5kIHJlbW92ZXMgaXQgZnJvbSB0aGUgbmFtZXNwYWNlLiBBbnkgCisgICAgICogYXR0cmlidXRlcyBhc3NvY2lhdGVkIHdpdGggdGhlIG5hbWUgYXJlIGFsc28gcmVtb3ZlZC4gSW50ZXJtZWRpYXRlIAorICAgICAqIGNvbnRleHRzIGFyZSBub3QgZGVzdHJveWVkLgorICAgICAqIDxwPgorICAgICAqIFRoaXMgbWV0aG9kIGlzIGlkZW1wb3RlbnQuIEl0IHN1Y2NlZWRzIGV2ZW4gaWYgdGhlIHRlcm1pbmFsIGF0b21pYyAKKyAgICAgKiBuYW1lIGlzIG5vdCBib3VuZCBpbiB0aGUgdGFyZ2V0IGNvbnRleHQsIGJ1dCB0aHJvd3MgCisgICAgICogTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGlmIGFueSBvZiB0aGUgaW50ZXJtZWRpYXRlIGNvbnRleHRzIGRvIG5vdCBleGlzdC4gCisgICAgICogCisgICAgICogSW4gYSBmZWRlcmF0ZWQgbmFtaW5nIHN5c3RlbSwgYSBjb250ZXh0IGZyb20gb25lIG5hbWluZyBzeXN0ZW0gbWF5IGJlIAorICAgICAqIGJvdW5kIHRvIGEgbmFtZSBpbiBhbm90aGVyLiBPbmUgY2FuIHN1YnNlcXVlbnRseSBsb29rIHVwIGFuZCBwZXJmb3JtIAorICAgICAqIG9wZXJhdGlvbnMgb24gdGhlIGZvcmVpZ24gY29udGV4dCB1c2luZyBhIGNvbXBvc2l0ZSBuYW1lLiBIb3dldmVyLCBhbiAKKyAgICAgKiBhdHRlbXB0IGRlc3Ryb3kgdGhlIGNvbnRleHQgdXNpbmcgdGhpcyBjb21wb3NpdGUgbmFtZSB3aWxsIGZhaWwgd2l0aCAKKyAgICAgKiBOb3RDb250ZXh0RXhjZXB0aW9uLCBiZWNhdXNlIHRoZSBmb3JlaWduIGNvbnRleHQgaXMgbm90IGEgInN1YmNvbnRleHQiIAorICAgICAqIG9mIHRoZSBjb250ZXh0IGluIHdoaWNoIGl0IGlzIGJvdW5kLiBJbnN0ZWFkLCB1c2UgdW5iaW5kKCkgdG8gcmVtb3ZlIAorICAgICAqIHRoZSBiaW5kaW5nIG9mIHRoZSBmb3JlaWduIGNvbnRleHQuIERlc3Ryb3lpbmcgdGhlIGZvcmVpZ24gY29udGV4dCAKKyAgICAgKiByZXF1aXJlcyB0aGF0IHRoZSBkZXN0cm95U3ViY29udGV4dCgpIGJlIHBlcmZvcm1lZCBvbiBhIGNvbnRleHQgZnJvbSAKKyAgICAgKiB0aGUgZm9yZWlnbiBjb250ZXh0J3MgIm5hdGl2ZSIgbmFtaW5nIHN5c3RlbS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgY29udGV4dCB0byBiZSBkZXN0cm95ZWQ7IG1heSBub3QgYmUgZW1wdHkKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWVOb3RGb3VuZEV4Y2VwdGlvbiBpZiBhbiBpbnRlcm1lZGlhdGUgY29udGV4dCBkb2VzIG5vdCAKKyAgICAgKiBleGlzdAorICAgICAqIEBleGNlcHRpb24gTm90Q29udGV4dEV4Y2VwdGlvbiBpZiB0aGUgbmFtZSBpcyBib3VuZCBidXQgZG9lcyBub3QgbmFtZSAKKyAgICAgKiBhIGNvbnRleHQsIG9yIGRvZXMgbm90IG5hbWUgYSBjb250ZXh0IG9mIHRoZSBhcHByb3ByaWF0ZSB0eXBlCisgICAgICovCisgICAgcHVibGljIHZvaWQgZGVzdHJveVN1YmNvbnRleHQoTmFtZSBuYW1lKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgZGlyQ29udGV4dC5kZXN0cm95U3ViY29udGV4dChwYXJzZU5hbWUobmFtZSkpOworICAgICAgICBjYWNoZVVubG9hZChuYW1lLnRvU3RyaW5nKCkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogRGVzdHJveXMgdGhlIG5hbWVkIGNvbnRleHQgYW5kIHJlbW92ZXMgaXQgZnJvbSB0aGUgbmFtZXNwYWNlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBjb250ZXh0IHRvIGJlIGRlc3Ryb3llZDsgbWF5IG5vdCBiZSBlbXB0eQorICAgICAqIEBleGNlcHRpb24gTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGlmIGFuIGludGVybWVkaWF0ZSBjb250ZXh0IGRvZXMgbm90IAorICAgICAqIGV4aXN0CisgICAgICogQGV4Y2VwdGlvbiBOb3RDb250ZXh0RXhjZXB0aW9uIGlmIHRoZSBuYW1lIGlzIGJvdW5kIGJ1dCBkb2VzIG5vdCBuYW1lIAorICAgICAqIGEgY29udGV4dCwgb3IgZG9lcyBub3QgbmFtZSBhIGNvbnRleHQgb2YgdGhlIGFwcHJvcHJpYXRlIHR5cGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkZXN0cm95U3ViY29udGV4dChTdHJpbmcgbmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIGRpckNvbnRleHQuZGVzdHJveVN1YmNvbnRleHQocGFyc2VOYW1lKG5hbWUpKTsKKyAgICAgICAgY2FjaGVVbmxvYWQobmFtZSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFuZCBiaW5kcyBhIG5ldyBjb250ZXh0LiBDcmVhdGVzIGEgbmV3IGNvbnRleHQgd2l0aCB0aGUgZ2l2ZW4gCisgICAgICogbmFtZSBhbmQgYmluZHMgaXQgaW4gdGhlIHRhcmdldCBjb250ZXh0ICh0aGF0IG5hbWVkIGJ5IGFsbCBidXQgCisgICAgICogdGVybWluYWwgYXRvbWljIGNvbXBvbmVudCBvZiB0aGUgbmFtZSkuIEFsbCBpbnRlcm1lZGlhdGUgY29udGV4dHMgYW5kIAorICAgICAqIHRoZSB0YXJnZXQgY29udGV4dCBtdXN0IGFscmVhZHkgZXhpc3QuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbnRleHQgdG8gY3JlYXRlOyBtYXkgbm90IGJlIGVtcHR5CisgICAgICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCBjb250ZXh0CisgICAgICogQGV4Y2VwdGlvbiBOYW1lQWxyZWFkeUJvdW5kRXhjZXB0aW9uIGlmIG5hbWUgaXMgYWxyZWFkeSBib3VuZAorICAgICAqIEBleGNlcHRpb24gSW52YWxpZEF0dHJpYnV0ZXNFeGNlcHRpb24gaWYgY3JlYXRpb24gb2YgdGhlIHN1YmNvbnRleHQgCisgICAgICogcmVxdWlyZXMgc3BlY2lmaWNhdGlvbiBvZiBtYW5kYXRvcnkgYXR0cmlidXRlcworICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBDb250ZXh0IGNyZWF0ZVN1YmNvbnRleHQoTmFtZSBuYW1lKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gZGlyQ29udGV4dC5jcmVhdGVTdWJjb250ZXh0KHBhcnNlTmFtZShuYW1lKSk7CisgICAgICAgIGNhY2hlVW5sb2FkKG5hbWUudG9TdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBjb250ZXh0OworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbmQgYmluZHMgYSBuZXcgY29udGV4dC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgY29udGV4dCB0byBjcmVhdGU7IG1heSBub3QgYmUgZW1wdHkKKyAgICAgKiBAcmV0dXJuIHRoZSBuZXdseSBjcmVhdGVkIGNvbnRleHQKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWVBbHJlYWR5Qm91bmRFeGNlcHRpb24gaWYgbmFtZSBpcyBhbHJlYWR5IGJvdW5kCisgICAgICogQGV4Y2VwdGlvbiBJbnZhbGlkQXR0cmlidXRlc0V4Y2VwdGlvbiBpZiBjcmVhdGlvbiBvZiB0aGUgc3ViY29udGV4dCAKKyAgICAgKiByZXF1aXJlcyBzcGVjaWZpY2F0aW9uIG9mIG1hbmRhdG9yeSBhdHRyaWJ1dGVzCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIENvbnRleHQgY3JlYXRlU3ViY29udGV4dChTdHJpbmcgbmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIENvbnRleHQgY29udGV4dCA9IGRpckNvbnRleHQuY3JlYXRlU3ViY29udGV4dChwYXJzZU5hbWUobmFtZSkpOworICAgICAgICBjYWNoZVVubG9hZChuYW1lKTsKKyAgICAgICAgcmV0dXJuIGNvbnRleHQ7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIG5hbWVkIG9iamVjdCwgZm9sbG93aW5nIGxpbmtzIGV4Y2VwdCBmb3IgdGhlIHRlcm1pbmFsIAorICAgICAqIGF0b21pYyBjb21wb25lbnQgb2YgdGhlIG5hbWUuIElmIHRoZSBvYmplY3QgYm91bmQgdG8gbmFtZSBpcyBub3QgYSAKKyAgICAgKiBsaW5rLCByZXR1cm5zIHRoZSBvYmplY3QgaXRzZWxmLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBvYmplY3QgdG8gbG9vayB1cAorICAgICAqIEByZXR1cm4gdGhlIG9iamVjdCBib3VuZCB0byBuYW1lLCBub3QgZm9sbG93aW5nIHRoZSB0ZXJtaW5hbCBsaW5rIAorICAgICAqIChpZiBhbnkpLgorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgbG9va3VwTGluayhOYW1lIG5hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZGlyQ29udGV4dC5sb29rdXBMaW5rKHBhcnNlTmFtZShuYW1lKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIG5hbWVkIG9iamVjdCwgZm9sbG93aW5nIGxpbmtzIGV4Y2VwdCBmb3IgdGhlIHRlcm1pbmFsIAorICAgICAqIGF0b21pYyBjb21wb25lbnQgb2YgdGhlIG5hbWUuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIG9iamVjdCB0byBsb29rIHVwCisgICAgICogQHJldHVybiB0aGUgb2JqZWN0IGJvdW5kIHRvIG5hbWUsIG5vdCBmb2xsb3dpbmcgdGhlIHRlcm1pbmFsIGxpbmsgCisgICAgICogKGlmIGFueSkuCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBsb29rdXBMaW5rKFN0cmluZyBuYW1lKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGRpckNvbnRleHQubG9va3VwTGluayhwYXJzZU5hbWUobmFtZSkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSBwYXJzZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBuYW1lZCBjb250ZXh0LiBJbiBhIAorICAgICAqIGZlZGVyYXRpb24gb2YgbmFtZXNwYWNlcywgZGlmZmVyZW50IG5hbWluZyBzeXN0ZW1zIHdpbGwgcGFyc2UgbmFtZXMgCisgICAgICogZGlmZmVyZW50bHkuIFRoaXMgbWV0aG9kIGFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byBnZXQgYSBwYXJzZXIgZm9yIAorICAgICAqIHBhcnNpbmcgbmFtZXMgaW50byB0aGVpciBhdG9taWMgY29tcG9uZW50cyB1c2luZyB0aGUgbmFtaW5nIGNvbnZlbnRpb24gCisgICAgICogb2YgYSBwYXJ0aWN1bGFyIG5hbWluZyBzeXN0ZW0uIFdpdGhpbiBhbnkgc2luZ2xlIG5hbWluZyBzeXN0ZW0sIAorICAgICAqIE5hbWVQYXJzZXIgb2JqZWN0cyByZXR1cm5lZCBieSB0aGlzIG1ldGhvZCBtdXN0IGJlIGVxdWFsICh1c2luZyB0aGUgCisgICAgICogZXF1YWxzKCkgdGVzdCkuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbnRleHQgZnJvbSB3aGljaCB0byBnZXQgdGhlIHBhcnNlcgorICAgICAqIEByZXR1cm4gYSBuYW1lIHBhcnNlciB0aGF0IGNhbiBwYXJzZSBjb21wb3VuZCBuYW1lcyBpbnRvIHRoZWlyIGF0b21pYyAKKyAgICAgKiBjb21wb25lbnRzCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIE5hbWVQYXJzZXIgZ2V0TmFtZVBhcnNlcihOYW1lIG5hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZGlyQ29udGV4dC5nZXROYW1lUGFyc2VyKHBhcnNlTmFtZShuYW1lKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIHBhcnNlciBhc3NvY2lhdGVkIHdpdGggdGhlIG5hbWVkIGNvbnRleHQuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbnRleHQgZnJvbSB3aGljaCB0byBnZXQgdGhlIHBhcnNlcgorICAgICAqIEByZXR1cm4gYSBuYW1lIHBhcnNlciB0aGF0IGNhbiBwYXJzZSBjb21wb3VuZCBuYW1lcyBpbnRvIHRoZWlyIGF0b21pYyAKKyAgICAgKiBjb21wb25lbnRzCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIE5hbWVQYXJzZXIgZ2V0TmFtZVBhcnNlcihTdHJpbmcgbmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBkaXJDb250ZXh0LmdldE5hbWVQYXJzZXIocGFyc2VOYW1lKG5hbWUpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvbXBvc2VzIHRoZSBuYW1lIG9mIHRoaXMgY29udGV4dCB3aXRoIGEgbmFtZSByZWxhdGl2ZSB0byB0aGlzIGNvbnRleHQuCisgICAgICogPHA+CisgICAgICogR2l2ZW4gYSBuYW1lIChuYW1lKSByZWxhdGl2ZSB0byB0aGlzIGNvbnRleHQsIGFuZCB0aGUgbmFtZSAocHJlZml4KSAKKyAgICAgKiBvZiB0aGlzIGNvbnRleHQgcmVsYXRpdmUgdG8gb25lIG9mIGl0cyBhbmNlc3RvcnMsIHRoaXMgbWV0aG9kIHJldHVybnMgCisgICAgICogdGhlIGNvbXBvc2l0aW9uIG9mIHRoZSB0d28gbmFtZXMgdXNpbmcgdGhlIHN5bnRheCBhcHByb3ByaWF0ZSBmb3IgdGhlIAorICAgICAqIG5hbWluZyBzeXN0ZW0ocykgaW52b2x2ZWQuIFRoYXQgaXMsIGlmIG5hbWUgbmFtZXMgYW4gb2JqZWN0IHJlbGF0aXZlIAorICAgICAqIHRvIHRoaXMgY29udGV4dCwgdGhlIHJlc3VsdCBpcyB0aGUgbmFtZSBvZiB0aGUgc2FtZSBvYmplY3QsIGJ1dCAKKyAgICAgKiByZWxhdGl2ZSB0byB0aGUgYW5jZXN0b3IgY29udGV4dC4gTm9uZSBvZiB0aGUgbmFtZXMgbWF5IGJlIG51bGwuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgYSBuYW1lIHJlbGF0aXZlIHRvIHRoaXMgY29udGV4dAorICAgICAqIEBwYXJhbSBwcmVmaXggdGhlIG5hbWUgb2YgdGhpcyBjb250ZXh0IHJlbGF0aXZlIHRvIG9uZSBvZiBpdHMgYW5jZXN0b3JzCisgICAgICogQHJldHVybiB0aGUgY29tcG9zaXRpb24gb2YgcHJlZml4IGFuZCBuYW1lCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIE5hbWUgY29tcG9zZU5hbWUoTmFtZSBuYW1lLCBOYW1lIHByZWZpeCkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHByZWZpeCA9IChOYW1lKSBuYW1lLmNsb25lKCk7CisJcmV0dXJuIHByZWZpeC5hZGRBbGwobmFtZSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDb21wb3NlcyB0aGUgbmFtZSBvZiB0aGlzIGNvbnRleHQgd2l0aCBhIG5hbWUgcmVsYXRpdmUgdG8gdGhpcyBjb250ZXh0LgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIGEgbmFtZSByZWxhdGl2ZSB0byB0aGlzIGNvbnRleHQKKyAgICAgKiBAcGFyYW0gcHJlZml4IHRoZSBuYW1lIG9mIHRoaXMgY29udGV4dCByZWxhdGl2ZSB0byBvbmUgb2YgaXRzIGFuY2VzdG9ycworICAgICAqIEByZXR1cm4gdGhlIGNvbXBvc2l0aW9uIG9mIHByZWZpeCBhbmQgbmFtZQorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgY29tcG9zZU5hbWUoU3RyaW5nIG5hbWUsIFN0cmluZyBwcmVmaXgpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICByZXR1cm4gcHJlZml4ICsgIi8iICsgbmFtZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEFkZHMgYSBuZXcgZW52aXJvbm1lbnQgcHJvcGVydHkgdG8gdGhlIGVudmlyb25tZW50IG9mIHRoaXMgY29udGV4dC4gSWYgCisgICAgICogdGhlIHByb3BlcnR5IGFscmVhZHkgZXhpc3RzLCBpdHMgdmFsdWUgaXMgb3ZlcndyaXR0ZW4uCisgICAgICogCisgICAgICogQHBhcmFtIHByb3BOYW1lIHRoZSBuYW1lIG9mIHRoZSBlbnZpcm9ubWVudCBwcm9wZXJ0eSB0byBhZGQ7IG1heSBub3QgCisgICAgICogYmUgbnVsbAorICAgICAqIEBwYXJhbSBwcm9wVmFsIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgdG8gYWRkOyBtYXkgbm90IGJlIG51bGwKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGFkZFRvRW52aXJvbm1lbnQoU3RyaW5nIHByb3BOYW1lLCBPYmplY3QgcHJvcFZhbCkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBkaXJDb250ZXh0LmFkZFRvRW52aXJvbm1lbnQocHJvcE5hbWUsIHByb3BWYWwpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlcyBhbiBlbnZpcm9ubWVudCBwcm9wZXJ0eSBmcm9tIHRoZSBlbnZpcm9ubWVudCBvZiB0aGlzIGNvbnRleHQuIAorICAgICAqIAorICAgICAqIEBwYXJhbSBwcm9wTmFtZSB0aGUgbmFtZSBvZiB0aGUgZW52aXJvbm1lbnQgcHJvcGVydHkgdG8gcmVtb3ZlOyAKKyAgICAgKiBtYXkgbm90IGJlIG51bGwKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IHJlbW92ZUZyb21FbnZpcm9ubWVudChTdHJpbmcgcHJvcE5hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZGlyQ29udGV4dC5yZW1vdmVGcm9tRW52aXJvbm1lbnQocHJvcE5hbWUpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSBlbnZpcm9ubWVudCBpbiBlZmZlY3QgZm9yIHRoaXMgY29udGV4dC4gU2VlIGNsYXNzIAorICAgICAqIGRlc2NyaXB0aW9uIGZvciBtb3JlIGRldGFpbHMgb24gZW52aXJvbm1lbnQgcHJvcGVydGllcy4gCisgICAgICogVGhlIGNhbGxlciBzaG91bGQgbm90IG1ha2UgYW55IGNoYW5nZXMgdG8gdGhlIG9iamVjdCByZXR1cm5lZDogdGhlaXIgCisgICAgICogZWZmZWN0IG9uIHRoZSBjb250ZXh0IGlzIHVuZGVmaW5lZC4gVGhlIGVudmlyb25tZW50IG9mIHRoaXMgY29udGV4dCAKKyAgICAgKiBtYXkgYmUgY2hhbmdlZCB1c2luZyBhZGRUb0Vudmlyb25tZW50KCkgYW5kIHJlbW92ZUZyb21FbnZpcm9ubWVudCgpLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGVudmlyb25tZW50IG9mIHRoaXMgY29udGV4dDsgbmV2ZXIgbnVsbAorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBIYXNodGFibGUgZ2V0RW52aXJvbm1lbnQoKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGRpckNvbnRleHQuZ2V0RW52aXJvbm1lbnQoKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENsb3NlcyB0aGlzIGNvbnRleHQuIFRoaXMgbWV0aG9kIHJlbGVhc2VzIHRoaXMgY29udGV4dCdzIHJlc291cmNlcyAKKyAgICAgKiBpbW1lZGlhdGVseSwgaW5zdGVhZCBvZiB3YWl0aW5nIGZvciB0aGVtIHRvIGJlIHJlbGVhc2VkIGF1dG9tYXRpY2FsbHkgCisgICAgICogYnkgdGhlIGdhcmJhZ2UgY29sbGVjdG9yLgorICAgICAqIFRoaXMgbWV0aG9kIGlzIGlkZW1wb3RlbnQ6IGludm9raW5nIGl0IG9uIGEgY29udGV4dCB0aGF0IGhhcyBhbHJlYWR5IAorICAgICAqIGJlZW4gY2xvc2VkIGhhcyBubyBlZmZlY3QuIEludm9raW5nIGFueSBvdGhlciBtZXRob2Qgb24gYSBjbG9zZWQgCisgICAgICogY29udGV4dCBpcyBub3QgYWxsb3dlZCwgYW5kIHJlc3VsdHMgaW4gdW5kZWZpbmVkIGJlaGF2aW91ci4KKyAgICAgKiAKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICBkaXJDb250ZXh0LmNsb3NlKCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIGZ1bGwgbmFtZSBvZiB0aGlzIGNvbnRleHQgd2l0aGluIGl0cyBvd24gbmFtZXNwYWNlLgorICAgICAqIDxwPgorICAgICAqIE1hbnkgbmFtaW5nIHNlcnZpY2VzIGhhdmUgYSBub3Rpb24gb2YgYSAiZnVsbCBuYW1lIiBmb3Igb2JqZWN0cyBpbiAKKyAgICAgKiB0aGVpciByZXNwZWN0aXZlIG5hbWVzcGFjZXMuIEZvciBleGFtcGxlLCBhbiBMREFQIGVudHJ5IGhhcyBhIAorICAgICAqIGRpc3Rpbmd1aXNoZWQgbmFtZSwgYW5kIGEgRE5TIHJlY29yZCBoYXMgYSBmdWxseSBxdWFsaWZpZWQgbmFtZS4gVGhpcyAKKyAgICAgKiBtZXRob2QgYWxsb3dzIHRoZSBjbGllbnQgYXBwbGljYXRpb24gdG8gcmV0cmlldmUgdGhpcyBuYW1lLiBUaGUgc3RyaW5nIAorICAgICAqIHJldHVybmVkIGJ5IHRoaXMgbWV0aG9kIGlzIG5vdCBhIEpOREkgY29tcG9zaXRlIG5hbWUgYW5kIHNob3VsZCBub3QgYmUgCisgICAgICogcGFzc2VkIGRpcmVjdGx5IHRvIGNvbnRleHQgbWV0aG9kcy4gSW4gbmFtaW5nIHN5c3RlbXMgZm9yIHdoaWNoIHRoZSAKKyAgICAgKiBub3Rpb24gb2YgZnVsbCBuYW1lIGRvZXMgbm90IG1ha2Ugc2Vuc2UsIAorICAgICAqIE9wZXJhdGlvbk5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBpcyB0aHJvd24uCisgICAgICogCisgICAgICogQHJldHVybiB0aGlzIGNvbnRleHQncyBuYW1lIGluIGl0cyBvd24gbmFtZXNwYWNlOyBuZXZlciBudWxsCisgICAgICogQGV4Y2VwdGlvbiBPcGVyYXRpb25Ob3RTdXBwb3J0ZWRFeGNlcHRpb24gaWYgdGhlIG5hbWluZyBzeXN0ZW0gZG9lcyAKKyAgICAgKiBub3QgaGF2ZSB0aGUgbm90aW9uIG9mIGEgZnVsbCBuYW1lCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lSW5OYW1lc3BhY2UoKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGRpckNvbnRleHQuZ2V0TmFtZUluTmFtZXNwYWNlKCk7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBEaXJDb250ZXh0IE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIGFsbCBvZiB0aGUgYXR0cmlidXRlcyBhc3NvY2lhdGVkIHdpdGggYSBuYW1lZCBvYmplY3QuIAorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHNldCBvZiBhdHRyaWJ1dGVzIGFzc29jaWF0ZWQgd2l0aCBuYW1lLiAKKyAgICAgKiBSZXR1cm5zIGFuIGVtcHR5IGF0dHJpYnV0ZSBzZXQgaWYgbmFtZSBoYXMgbm8gYXR0cmlidXRlczsgbmV2ZXIgbnVsbC4KKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgb2JqZWN0IGZyb20gd2hpY2ggdG8gcmV0cmlldmUgYXR0cmlidXRlcworICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBBdHRyaWJ1dGVzIGdldEF0dHJpYnV0ZXMoTmFtZSBuYW1lKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgQ2FjaGVFbnRyeSBlbnRyeSA9IGNhY2hlTG9va3VwKG5hbWUudG9TdHJpbmcoKSk7CisgICAgICAgIGlmIChlbnRyeSAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoIWVudHJ5LmV4aXN0cykgeworICAgICAgICAgICAgICAgIHRocm93IG5vdEZvdW5kRXhjZXB0aW9uOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGVudHJ5LmF0dHJpYnV0ZXM7CisgICAgICAgIH0KKyAgICAgICAgQXR0cmlidXRlcyBhdHRyaWJ1dGVzID0gZGlyQ29udGV4dC5nZXRBdHRyaWJ1dGVzKHBhcnNlTmFtZShuYW1lKSk7CisgICAgICAgIGlmICghKGF0dHJpYnV0ZXMgaW5zdGFuY2VvZiBSZXNvdXJjZUF0dHJpYnV0ZXMpKSB7CisgICAgICAgICAgICBhdHRyaWJ1dGVzID0gbmV3IFJlc291cmNlQXR0cmlidXRlcyhhdHRyaWJ1dGVzKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYXR0cmlidXRlczsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyBhbGwgb2YgdGhlIGF0dHJpYnV0ZXMgYXNzb2NpYXRlZCB3aXRoIGEgbmFtZWQgb2JqZWN0LgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHNldCBvZiBhdHRyaWJ1dGVzIGFzc29jaWF0ZWQgd2l0aCBuYW1lCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIG9iamVjdCBmcm9tIHdoaWNoIHRvIHJldHJpZXZlIGF0dHJpYnV0ZXMKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgQXR0cmlidXRlcyBnZXRBdHRyaWJ1dGVzKFN0cmluZyBuYW1lKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgQ2FjaGVFbnRyeSBlbnRyeSA9IGNhY2hlTG9va3VwKG5hbWUpOworICAgICAgICBpZiAoZW50cnkgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKCFlbnRyeS5leGlzdHMpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBub3RGb3VuZEV4Y2VwdGlvbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBlbnRyeS5hdHRyaWJ1dGVzOworICAgICAgICB9CisgICAgICAgIEF0dHJpYnV0ZXMgYXR0cmlidXRlcyA9IGRpckNvbnRleHQuZ2V0QXR0cmlidXRlcyhwYXJzZU5hbWUobmFtZSkpOworICAgICAgICBpZiAoIShhdHRyaWJ1dGVzIGluc3RhbmNlb2YgUmVzb3VyY2VBdHRyaWJ1dGVzKSkgeworICAgICAgICAgICAgYXR0cmlidXRlcyA9IG5ldyBSZXNvdXJjZUF0dHJpYnV0ZXMoYXR0cmlidXRlcyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZXM7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgc2VsZWN0ZWQgYXR0cmlidXRlcyBhc3NvY2lhdGVkIHdpdGggYSBuYW1lZCBvYmplY3QuIAorICAgICAqIFNlZSB0aGUgY2xhc3MgZGVzY3JpcHRpb24gcmVnYXJkaW5nIGF0dHJpYnV0ZSBtb2RlbHMsIGF0dHJpYnV0ZSB0eXBlIAorICAgICAqIG5hbWVzLCBhbmQgb3BlcmF0aW9uYWwgYXR0cmlidXRlcy4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSByZXF1ZXN0ZWQgYXR0cmlidXRlczsgbmV2ZXIgbnVsbAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBvYmplY3QgZnJvbSB3aGljaCB0byByZXRyaWV2ZSBhdHRyaWJ1dGVzCisgICAgICogQHBhcmFtIGF0dHJJZHMgdGhlIGlkZW50aWZpZXJzIG9mIHRoZSBhdHRyaWJ1dGVzIHRvIHJldHJpZXZlLiBudWxsIAorICAgICAqIGluZGljYXRlcyB0aGF0IGFsbCBhdHRyaWJ1dGVzIHNob3VsZCBiZSByZXRyaWV2ZWQ7IGFuIGVtcHR5IGFycmF5IAorICAgICAqIGluZGljYXRlcyB0aGF0IG5vbmUgc2hvdWxkIGJlIHJldHJpZXZlZAorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBBdHRyaWJ1dGVzIGdldEF0dHJpYnV0ZXMoTmFtZSBuYW1lLCBTdHJpbmdbXSBhdHRySWRzKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgQXR0cmlidXRlcyBhdHRyaWJ1dGVzID0gCisgICAgICAgICAgICBkaXJDb250ZXh0LmdldEF0dHJpYnV0ZXMocGFyc2VOYW1lKG5hbWUpLCBhdHRySWRzKTsKKyAgICAgICAgaWYgKCEoYXR0cmlidXRlcyBpbnN0YW5jZW9mIFJlc291cmNlQXR0cmlidXRlcykpIHsKKyAgICAgICAgICAgIGF0dHJpYnV0ZXMgPSBuZXcgUmVzb3VyY2VBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhdHRyaWJ1dGVzOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHNlbGVjdGVkIGF0dHJpYnV0ZXMgYXNzb2NpYXRlZCB3aXRoIGEgbmFtZWQgb2JqZWN0LgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHJlcXVlc3RlZCBhdHRyaWJ1dGVzOyBuZXZlciBudWxsCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIG9iamVjdCBmcm9tIHdoaWNoIHRvIHJldHJpZXZlIGF0dHJpYnV0ZXMKKyAgICAgKiBAcGFyYW0gYXR0cklkcyB0aGUgaWRlbnRpZmllcnMgb2YgdGhlIGF0dHJpYnV0ZXMgdG8gcmV0cmlldmUuIG51bGwgCisgICAgICogaW5kaWNhdGVzIHRoYXQgYWxsIGF0dHJpYnV0ZXMgc2hvdWxkIGJlIHJldHJpZXZlZDsgYW4gZW1wdHkgYXJyYXkgCisgICAgICogaW5kaWNhdGVzIHRoYXQgbm9uZSBzaG91bGQgYmUgcmV0cmlldmVkCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgIHB1YmxpYyBBdHRyaWJ1dGVzIGdldEF0dHJpYnV0ZXMoU3RyaW5nIG5hbWUsIFN0cmluZ1tdIGF0dHJJZHMpCisgICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgQXR0cmlidXRlcyBhdHRyaWJ1dGVzID0gCisgICAgICAgICAgICBkaXJDb250ZXh0LmdldEF0dHJpYnV0ZXMocGFyc2VOYW1lKG5hbWUpLCBhdHRySWRzKTsKKyAgICAgICAgaWYgKCEoYXR0cmlidXRlcyBpbnN0YW5jZW9mIFJlc291cmNlQXR0cmlidXRlcykpIHsKKyAgICAgICAgICAgIGF0dHJpYnV0ZXMgPSBuZXcgUmVzb3VyY2VBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhdHRyaWJ1dGVzOworICAgICB9CisKKworICAgIC8qKgorICAgICAqIE1vZGlmaWVzIHRoZSBhdHRyaWJ1dGVzIGFzc29jaWF0ZWQgd2l0aCBhIG5hbWVkIG9iamVjdC4gVGhlIG9yZGVyIG9mIAorICAgICAqIHRoZSBtb2RpZmljYXRpb25zIGlzIG5vdCBzcGVjaWZpZWQuIFdoZXJlIHBvc3NpYmxlLCB0aGUgbW9kaWZpY2F0aW9ucyAKKyAgICAgKiBhcmUgcGVyZm9ybWVkIGF0b21pY2FsbHkuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIG9iamVjdCB3aG9zZSBhdHRyaWJ1dGVzIHdpbGwgYmUgdXBkYXRlZAorICAgICAqIEBwYXJhbSBtb2Rfb3AgdGhlIG1vZGlmaWNhdGlvbiBvcGVyYXRpb24sIG9uZSBvZjogQUREX0FUVFJJQlVURSwgCisgICAgICogUkVQTEFDRV9BVFRSSUJVVEUsIFJFTU9WRV9BVFRSSUJVVEUKKyAgICAgKiBAcGFyYW0gYXR0cnMgdGhlIGF0dHJpYnV0ZXMgdG8gYmUgdXNlZCBmb3IgdGhlIG1vZGlmaWNhdGlvbjsgbWF5IG5vdCAKKyAgICAgKiBiZSBudWxsCisgICAgICogQGV4Y2VwdGlvbiBBdHRyaWJ1dGVNb2RpZmljYXRpb25FeGNlcHRpb24gaWYgdGhlIG1vZGlmaWNhdGlvbiBjYW5ub3QgYmUKKyAgICAgKiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5CisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgbW9kaWZ5QXR0cmlidXRlcyhOYW1lIG5hbWUsIGludCBtb2Rfb3AsIEF0dHJpYnV0ZXMgYXR0cnMpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICBkaXJDb250ZXh0Lm1vZGlmeUF0dHJpYnV0ZXMocGFyc2VOYW1lKG5hbWUpLCBtb2Rfb3AsIGF0dHJzKTsKKyAgICAgICAgY2FjaGVVbmxvYWQobmFtZS50b1N0cmluZygpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIE1vZGlmaWVzIHRoZSBhdHRyaWJ1dGVzIGFzc29jaWF0ZWQgd2l0aCBhIG5hbWVkIG9iamVjdC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgb2JqZWN0IHdob3NlIGF0dHJpYnV0ZXMgd2lsbCBiZSB1cGRhdGVkCisgICAgICogQHBhcmFtIG1vZF9vcCB0aGUgbW9kaWZpY2F0aW9uIG9wZXJhdGlvbiwgb25lIG9mOiBBRERfQVRUUklCVVRFLCAKKyAgICAgKiBSRVBMQUNFX0FUVFJJQlVURSwgUkVNT1ZFX0FUVFJJQlVURQorICAgICAqIEBwYXJhbSBhdHRycyB0aGUgYXR0cmlidXRlcyB0byBiZSB1c2VkIGZvciB0aGUgbW9kaWZpY2F0aW9uOyBtYXkgbm90IAorICAgICAqIGJlIG51bGwKKyAgICAgKiBAZXhjZXB0aW9uIEF0dHJpYnV0ZU1vZGlmaWNhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgbW9kaWZpY2F0aW9uIGNhbm5vdCBiZQorICAgICAqIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBtb2RpZnlBdHRyaWJ1dGVzKFN0cmluZyBuYW1lLCBpbnQgbW9kX29wLCBBdHRyaWJ1dGVzIGF0dHJzKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgZGlyQ29udGV4dC5tb2RpZnlBdHRyaWJ1dGVzKHBhcnNlTmFtZShuYW1lKSwgbW9kX29wLCBhdHRycyk7CisgICAgICAgIGNhY2hlVW5sb2FkKG5hbWUpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogTW9kaWZpZXMgdGhlIGF0dHJpYnV0ZXMgYXNzb2NpYXRlZCB3aXRoIGEgbmFtZWQgb2JqZWN0IHVzaW5nIGFuIGFuIAorICAgICAqIG9yZGVyZWQgbGlzdCBvZiBtb2RpZmljYXRpb25zLiBUaGUgbW9kaWZpY2F0aW9ucyBhcmUgcGVyZm9ybWVkIGluIHRoZSAKKyAgICAgKiBvcmRlciBzcGVjaWZpZWQuIEVhY2ggbW9kaWZpY2F0aW9uIHNwZWNpZmllcyBhIG1vZGlmaWNhdGlvbiBvcGVyYXRpb24gCisgICAgICogY29kZSBhbmQgYW4gYXR0cmlidXRlIG9uIHdoaWNoIHRvIG9wZXJhdGUuIFdoZXJlIHBvc3NpYmxlLCB0aGUgCisgICAgICogbW9kaWZpY2F0aW9ucyBhcmUgcGVyZm9ybWVkIGF0b21pY2FsbHkuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIG9iamVjdCB3aG9zZSBhdHRyaWJ1dGVzIHdpbGwgYmUgdXBkYXRlZAorICAgICAqIEBwYXJhbSBtb2RzIGFuIG9yZGVyZWQgc2VxdWVuY2Ugb2YgbW9kaWZpY2F0aW9ucyB0byBiZSBwZXJmb3JtZWQ7IG1heSAKKyAgICAgKiBub3QgYmUgbnVsbAorICAgICAqIEBleGNlcHRpb24gQXR0cmlidXRlTW9kaWZpY2F0aW9uRXhjZXB0aW9uIGlmIHRoZSBtb2RpZmljYXRpb24gY2Fubm90IGJlCisgICAgICogY29tcGxldGVkIHN1Y2Nlc3NmdWxseQorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG1vZGlmeUF0dHJpYnV0ZXMoTmFtZSBuYW1lLCBNb2RpZmljYXRpb25JdGVtW10gbW9kcykKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIGRpckNvbnRleHQubW9kaWZ5QXR0cmlidXRlcyhwYXJzZU5hbWUobmFtZSksIG1vZHMpOworICAgICAgICBjYWNoZVVubG9hZChuYW1lLnRvU3RyaW5nKCkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogTW9kaWZpZXMgdGhlIGF0dHJpYnV0ZXMgYXNzb2NpYXRlZCB3aXRoIGEgbmFtZWQgb2JqZWN0IHVzaW5nIGFuIGFuIAorICAgICAqIG9yZGVyZWQgbGlzdCBvZiBtb2RpZmljYXRpb25zLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBvYmplY3Qgd2hvc2UgYXR0cmlidXRlcyB3aWxsIGJlIHVwZGF0ZWQKKyAgICAgKiBAcGFyYW0gbW9kcyBhbiBvcmRlcmVkIHNlcXVlbmNlIG9mIG1vZGlmaWNhdGlvbnMgdG8gYmUgcGVyZm9ybWVkOyBtYXkgCisgICAgICogbm90IGJlIG51bGwKKyAgICAgKiBAZXhjZXB0aW9uIEF0dHJpYnV0ZU1vZGlmaWNhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgbW9kaWZpY2F0aW9uIGNhbm5vdCBiZQorICAgICAqIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBtb2RpZnlBdHRyaWJ1dGVzKFN0cmluZyBuYW1lLCBNb2RpZmljYXRpb25JdGVtW10gbW9kcykKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIGRpckNvbnRleHQubW9kaWZ5QXR0cmlidXRlcyhwYXJzZU5hbWUobmFtZSksIG1vZHMpOworICAgICAgICBjYWNoZVVubG9hZChuYW1lKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEJpbmRzIGEgbmFtZSB0byBhbiBvYmplY3QsIGFsb25nIHdpdGggYXNzb2NpYXRlZCBhdHRyaWJ1dGVzLiBJZiBhdHRycyAKKyAgICAgKiBpcyBudWxsLCB0aGUgcmVzdWx0aW5nIGJpbmRpbmcgd2lsbCBoYXZlIHRoZSBhdHRyaWJ1dGVzIGFzc29jaWF0ZWQgCisgICAgICogd2l0aCBvYmogaWYgb2JqIGlzIGEgRGlyQ29udGV4dCwgYW5kIG5vIGF0dHJpYnV0ZXMgb3RoZXJ3aXNlLiBJZiBhdHRycyAKKyAgICAgKiBpcyBub24tbnVsbCwgdGhlIHJlc3VsdGluZyBiaW5kaW5nIHdpbGwgaGF2ZSBhdHRycyBhcyBpdHMgYXR0cmlidXRlczsgCisgICAgICogYW55IGF0dHJpYnV0ZXMgYXNzb2NpYXRlZCB3aXRoIG9iaiBhcmUgaWdub3JlZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSB0byBiaW5kOyBtYXkgbm90IGJlIGVtcHR5CisgICAgICogQHBhcmFtIG9iaiB0aGUgb2JqZWN0IHRvIGJpbmQ7IHBvc3NpYmx5IG51bGwKKyAgICAgKiBAcGFyYW0gYXR0cnMgdGhlIGF0dHJpYnV0ZXMgdG8gYXNzb2NpYXRlIHdpdGggdGhlIGJpbmRpbmcKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWVBbHJlYWR5Qm91bmRFeGNlcHRpb24gaWYgbmFtZSBpcyBhbHJlYWR5IGJvdW5kCisgICAgICogQGV4Y2VwdGlvbiBJbnZhbGlkQXR0cmlidXRlc0V4Y2VwdGlvbiBpZiBzb21lICJtYW5kYXRvcnkiIGF0dHJpYnV0ZXMgCisgICAgICogb2YgdGhlIGJpbmRpbmcgYXJlIG5vdCBzdXBwbGllZAorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGJpbmQoTmFtZSBuYW1lLCBPYmplY3Qgb2JqLCBBdHRyaWJ1dGVzIGF0dHJzKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgZGlyQ29udGV4dC5iaW5kKHBhcnNlTmFtZShuYW1lKSwgb2JqLCBhdHRycyk7CisgICAgICAgIGNhY2hlVW5sb2FkKG5hbWUudG9TdHJpbmcoKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBCaW5kcyBhIG5hbWUgdG8gYW4gb2JqZWN0LCBhbG9uZyB3aXRoIGFzc29jaWF0ZWQgYXR0cmlidXRlcy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSB0byBiaW5kOyBtYXkgbm90IGJlIGVtcHR5CisgICAgICogQHBhcmFtIG9iaiB0aGUgb2JqZWN0IHRvIGJpbmQ7IHBvc3NpYmx5IG51bGwKKyAgICAgKiBAcGFyYW0gYXR0cnMgdGhlIGF0dHJpYnV0ZXMgdG8gYXNzb2NpYXRlIHdpdGggdGhlIGJpbmRpbmcKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWVBbHJlYWR5Qm91bmRFeGNlcHRpb24gaWYgbmFtZSBpcyBhbHJlYWR5IGJvdW5kCisgICAgICogQGV4Y2VwdGlvbiBJbnZhbGlkQXR0cmlidXRlc0V4Y2VwdGlvbiBpZiBzb21lICJtYW5kYXRvcnkiIGF0dHJpYnV0ZXMgCisgICAgICogb2YgdGhlIGJpbmRpbmcgYXJlIG5vdCBzdXBwbGllZAorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGJpbmQoU3RyaW5nIG5hbWUsIE9iamVjdCBvYmosIEF0dHJpYnV0ZXMgYXR0cnMpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICBkaXJDb250ZXh0LmJpbmQocGFyc2VOYW1lKG5hbWUpLCBvYmosIGF0dHJzKTsKKyAgICAgICAgY2FjaGVVbmxvYWQobmFtZSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBCaW5kcyBhIG5hbWUgdG8gYW4gb2JqZWN0LCBhbG9uZyB3aXRoIGFzc29jaWF0ZWQgYXR0cmlidXRlcywgCisgICAgICogb3ZlcndyaXRpbmcgYW55IGV4aXN0aW5nIGJpbmRpbmcuIElmIGF0dHJzIGlzIG51bGwgYW5kIG9iaiBpcyBhIAorICAgICAqIERpckNvbnRleHQsIHRoZSBhdHRyaWJ1dGVzIGZyb20gb2JqIGFyZSB1c2VkLiBJZiBhdHRycyBpcyBudWxsIGFuZCBvYmogCisgICAgICogaXMgbm90IGEgRGlyQ29udGV4dCwgYW55IGV4aXN0aW5nIGF0dHJpYnV0ZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBvYmplY3QKKyAgICAgKiBhbHJlYWR5IGJvdW5kIGluIHRoZSBkaXJlY3RvcnkgcmVtYWluIHVuY2hhbmdlZC4gSWYgYXR0cnMgaXMgbm9uLW51bGwsIAorICAgICAqIGFueSBleGlzdGluZyBhdHRyaWJ1dGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgb2JqZWN0IGFscmVhZHkgYm91bmQgaW4gCisgICAgICogdGhlIGRpcmVjdG9yeSBhcmUgcmVtb3ZlZCBhbmQgYXR0cnMgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBuYW1lZCAKKyAgICAgKiBvYmplY3QuIElmIG9iaiBpcyBhIERpckNvbnRleHQgYW5kIGF0dHJzIGlzIG5vbi1udWxsLCB0aGUgYXR0cmlidXRlcyAKKyAgICAgKiBvZiBvYmogYXJlIGlnbm9yZWQuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgdG8gYmluZDsgbWF5IG5vdCBiZSBlbXB0eQorICAgICAqIEBwYXJhbSBvYmogdGhlIG9iamVjdCB0byBiaW5kOyBwb3NzaWJseSBudWxsCisgICAgICogQHBhcmFtIGF0dHJzIHRoZSBhdHRyaWJ1dGVzIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBiaW5kaW5nCisgICAgICogQGV4Y2VwdGlvbiBJbnZhbGlkQXR0cmlidXRlc0V4Y2VwdGlvbiBpZiBzb21lICJtYW5kYXRvcnkiIGF0dHJpYnV0ZXMgCisgICAgICogb2YgdGhlIGJpbmRpbmcgYXJlIG5vdCBzdXBwbGllZAorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlYmluZChOYW1lIG5hbWUsIE9iamVjdCBvYmosIEF0dHJpYnV0ZXMgYXR0cnMpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICBkaXJDb250ZXh0LnJlYmluZChwYXJzZU5hbWUobmFtZSksIG9iaiwgYXR0cnMpOworICAgICAgICBjYWNoZVVubG9hZChuYW1lLnRvU3RyaW5nKCkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQmluZHMgYSBuYW1lIHRvIGFuIG9iamVjdCwgYWxvbmcgd2l0aCBhc3NvY2lhdGVkIGF0dHJpYnV0ZXMsIAorICAgICAqIG92ZXJ3cml0aW5nIGFueSBleGlzdGluZyBiaW5kaW5nLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIHRvIGJpbmQ7IG1heSBub3QgYmUgZW1wdHkKKyAgICAgKiBAcGFyYW0gb2JqIHRoZSBvYmplY3QgdG8gYmluZDsgcG9zc2libHkgbnVsbAorICAgICAqIEBwYXJhbSBhdHRycyB0aGUgYXR0cmlidXRlcyB0byBhc3NvY2lhdGUgd2l0aCB0aGUgYmluZGluZworICAgICAqIEBleGNlcHRpb24gSW52YWxpZEF0dHJpYnV0ZXNFeGNlcHRpb24gaWYgc29tZSAibWFuZGF0b3J5IiBhdHRyaWJ1dGVzIAorICAgICAqIG9mIHRoZSBiaW5kaW5nIGFyZSBub3Qgc3VwcGxpZWQKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWJpbmQoU3RyaW5nIG5hbWUsIE9iamVjdCBvYmosIEF0dHJpYnV0ZXMgYXR0cnMpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICBkaXJDb250ZXh0LnJlYmluZChwYXJzZU5hbWUobmFtZSksIG9iaiwgYXR0cnMpOworICAgICAgICBjYWNoZVVubG9hZChuYW1lKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW5kIGJpbmRzIGEgbmV3IGNvbnRleHQsIGFsb25nIHdpdGggYXNzb2NpYXRlZCBhdHRyaWJ1dGVzLiAKKyAgICAgKiBUaGlzIG1ldGhvZCBjcmVhdGVzIGEgbmV3IHN1YmNvbnRleHQgd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgYmluZHMgaXQgaW4gCisgICAgICogdGhlIHRhcmdldCBjb250ZXh0ICh0aGF0IG5hbWVkIGJ5IGFsbCBidXQgdGVybWluYWwgYXRvbWljIGNvbXBvbmVudCBvZiAKKyAgICAgKiB0aGUgbmFtZSksIGFuZCBhc3NvY2lhdGVzIHRoZSBzdXBwbGllZCBhdHRyaWJ1dGVzIHdpdGggdGhlIG5ld2x5IAorICAgICAqIGNyZWF0ZWQgb2JqZWN0LiBBbGwgaW50ZXJtZWRpYXRlIGFuZCB0YXJnZXQgY29udGV4dHMgbXVzdCBhbHJlYWR5IAorICAgICAqIGV4aXN0LiBJZiBhdHRycyBpcyBudWxsLCB0aGlzIG1ldGhvZCBpcyBlcXVpdmFsZW50IHRvIAorICAgICAqIENvbnRleHQuY3JlYXRlU3ViY29udGV4dCgpLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBjb250ZXh0IHRvIGNyZWF0ZTsgbWF5IG5vdCBiZSBlbXB0eQorICAgICAqIEBwYXJhbSBhdHRycyB0aGUgYXR0cmlidXRlcyB0byBhc3NvY2lhdGUgd2l0aCB0aGUgbmV3bHkgY3JlYXRlZCBjb250ZXh0CisgICAgICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCBjb250ZXh0CisgICAgICogQGV4Y2VwdGlvbiBOYW1lQWxyZWFkeUJvdW5kRXhjZXB0aW9uIGlmIHRoZSBuYW1lIGlzIGFscmVhZHkgYm91bmQKKyAgICAgKiBAZXhjZXB0aW9uIEludmFsaWRBdHRyaWJ1dGVzRXhjZXB0aW9uIGlmIGF0dHJzIGRvZXMgbm90IGNvbnRhaW4gYWxsIAorICAgICAqIHRoZSBtYW5kYXRvcnkgYXR0cmlidXRlcyByZXF1aXJlZCBmb3IgY3JlYXRpb24KKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgRGlyQ29udGV4dCBjcmVhdGVTdWJjb250ZXh0KE5hbWUgbmFtZSwgQXR0cmlidXRlcyBhdHRycykKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIERpckNvbnRleHQgY29udGV4dCA9IAorICAgICAgICAgICAgZGlyQ29udGV4dC5jcmVhdGVTdWJjb250ZXh0KHBhcnNlTmFtZShuYW1lKSwgYXR0cnMpOworICAgICAgICBjYWNoZVVubG9hZChuYW1lLnRvU3RyaW5nKCkpOworICAgICAgICByZXR1cm4gY29udGV4dDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW5kIGJpbmRzIGEgbmV3IGNvbnRleHQsIGFsb25nIHdpdGggYXNzb2NpYXRlZCBhdHRyaWJ1dGVzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBjb250ZXh0IHRvIGNyZWF0ZTsgbWF5IG5vdCBiZSBlbXB0eQorICAgICAqIEBwYXJhbSBhdHRycyB0aGUgYXR0cmlidXRlcyB0byBhc3NvY2lhdGUgd2l0aCB0aGUgbmV3bHkgY3JlYXRlZCBjb250ZXh0CisgICAgICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCBjb250ZXh0CisgICAgICogQGV4Y2VwdGlvbiBOYW1lQWxyZWFkeUJvdW5kRXhjZXB0aW9uIGlmIHRoZSBuYW1lIGlzIGFscmVhZHkgYm91bmQKKyAgICAgKiBAZXhjZXB0aW9uIEludmFsaWRBdHRyaWJ1dGVzRXhjZXB0aW9uIGlmIGF0dHJzIGRvZXMgbm90IGNvbnRhaW4gYWxsIAorICAgICAqIHRoZSBtYW5kYXRvcnkgYXR0cmlidXRlcyByZXF1aXJlZCBmb3IgY3JlYXRpb24KKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgRGlyQ29udGV4dCBjcmVhdGVTdWJjb250ZXh0KFN0cmluZyBuYW1lLCBBdHRyaWJ1dGVzIGF0dHJzKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgRGlyQ29udGV4dCBjb250ZXh0ID0gCisgICAgICAgICAgICBkaXJDb250ZXh0LmNyZWF0ZVN1YmNvbnRleHQocGFyc2VOYW1lKG5hbWUpLCBhdHRycyk7CisgICAgICAgIGNhY2hlVW5sb2FkKG5hbWUpOworICAgICAgICByZXR1cm4gY29udGV4dDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgc2NoZW1hIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmFtZWQgb2JqZWN0LiBUaGUgc2NoZW1hIAorICAgICAqIGRlc2NyaWJlcyBydWxlcyByZWdhcmRpbmcgdGhlIHN0cnVjdHVyZSBvZiB0aGUgbmFtZXNwYWNlIGFuZCB0aGUgCisgICAgICogYXR0cmlidXRlcyBzdG9yZWQgd2l0aGluIGl0LiBUaGUgc2NoZW1hIHNwZWNpZmllcyB3aGF0IHR5cGVzIG9mIAorICAgICAqIG9iamVjdHMgY2FuIGJlIGFkZGVkIHRvIHRoZSBkaXJlY3RvcnkgYW5kIHdoZXJlIHRoZXkgY2FuIGJlIGFkZGVkOyAKKyAgICAgKiB3aGF0IG1hbmRhdG9yeSBhbmQgb3B0aW9uYWwgYXR0cmlidXRlcyBhbiBvYmplY3QgY2FuIGhhdmUuIFRoZSByYW5nZSAKKyAgICAgKiBvZiBzdXBwb3J0IGZvciBzY2hlbWFzIGlzIGRpcmVjdG9yeS1zcGVjaWZpYy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgb2JqZWN0IHdob3NlIHNjaGVtYSBpcyB0byBiZSByZXRyaWV2ZWQKKyAgICAgKiBAcmV0dXJuIHRoZSBzY2hlbWEgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb250ZXh0OyBuZXZlciBudWxsCisgICAgICogQGV4Y2VwdGlvbiBPcGVyYXRpb25Ob3RTdXBwb3J0ZWRFeGNlcHRpb24gaWYgc2NoZW1hIG5vdCBzdXBwb3J0ZWQKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgRGlyQ29udGV4dCBnZXRTY2hlbWEoTmFtZSBuYW1lKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGRpckNvbnRleHQuZ2V0U2NoZW1hKHBhcnNlTmFtZShuYW1lKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIHNjaGVtYSBhc3NvY2lhdGVkIHdpdGggdGhlIG5hbWVkIG9iamVjdC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgb2JqZWN0IHdob3NlIHNjaGVtYSBpcyB0byBiZSByZXRyaWV2ZWQKKyAgICAgKiBAcmV0dXJuIHRoZSBzY2hlbWEgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb250ZXh0OyBuZXZlciBudWxsCisgICAgICogQGV4Y2VwdGlvbiBPcGVyYXRpb25Ob3RTdXBwb3J0ZWRFeGNlcHRpb24gaWYgc2NoZW1hIG5vdCBzdXBwb3J0ZWQKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgRGlyQ29udGV4dCBnZXRTY2hlbWEoU3RyaW5nIG5hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZGlyQ29udGV4dC5nZXRTY2hlbWEocGFyc2VOYW1lKG5hbWUpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyBhIGNvbnRleHQgY29udGFpbmluZyB0aGUgc2NoZW1hIG9iamVjdHMgb2YgdGhlIG5hbWVkIAorICAgICAqIG9iamVjdCdzIGNsYXNzIGRlZmluaXRpb25zLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBvYmplY3Qgd2hvc2Ugb2JqZWN0IGNsYXNzIGRlZmluaXRpb24gaXMgdG8gCisgICAgICogYmUgcmV0cmlldmVkCisgICAgICogQHJldHVybiB0aGUgRGlyQ29udGV4dCBjb250YWluaW5nIHRoZSBuYW1lZCBvYmplY3QncyBjbGFzcyAKKyAgICAgKiBkZWZpbml0aW9uczsgbmV2ZXIgbnVsbAorICAgICAqIEBleGNlcHRpb24gT3BlcmF0aW9uTm90U3VwcG9ydGVkRXhjZXB0aW9uIGlmIHNjaGVtYSBub3Qgc3VwcG9ydGVkCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIERpckNvbnRleHQgZ2V0U2NoZW1hQ2xhc3NEZWZpbml0aW9uKE5hbWUgbmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBkaXJDb250ZXh0LmdldFNjaGVtYUNsYXNzRGVmaW5pdGlvbihwYXJzZU5hbWUobmFtZSkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIGEgY29udGV4dCBjb250YWluaW5nIHRoZSBzY2hlbWEgb2JqZWN0cyBvZiB0aGUgbmFtZWQgCisgICAgICogb2JqZWN0J3MgY2xhc3MgZGVmaW5pdGlvbnMuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIG9iamVjdCB3aG9zZSBvYmplY3QgY2xhc3MgZGVmaW5pdGlvbiBpcyB0byAKKyAgICAgKiBiZSByZXRyaWV2ZWQKKyAgICAgKiBAcmV0dXJuIHRoZSBEaXJDb250ZXh0IGNvbnRhaW5pbmcgdGhlIG5hbWVkIG9iamVjdCdzIGNsYXNzIAorICAgICAqIGRlZmluaXRpb25zOyBuZXZlciBudWxsCisgICAgICogQGV4Y2VwdGlvbiBPcGVyYXRpb25Ob3RTdXBwb3J0ZWRFeGNlcHRpb24gaWYgc2NoZW1hIG5vdCBzdXBwb3J0ZWQKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgRGlyQ29udGV4dCBnZXRTY2hlbWFDbGFzc0RlZmluaXRpb24oU3RyaW5nIG5hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZGlyQ29udGV4dC5nZXRTY2hlbWFDbGFzc0RlZmluaXRpb24ocGFyc2VOYW1lKG5hbWUpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNlYXJjaGVzIGluIGEgc2luZ2xlIGNvbnRleHQgZm9yIG9iamVjdHMgdGhhdCBjb250YWluIGEgc3BlY2lmaWVkIHNldCAKKyAgICAgKiBvZiBhdHRyaWJ1dGVzLCBhbmQgcmV0cmlldmVzIHNlbGVjdGVkIGF0dHJpYnV0ZXMuIFRoZSBzZWFyY2ggaXMgCisgICAgICogcGVyZm9ybWVkIHVzaW5nIHRoZSBkZWZhdWx0IFNlYXJjaENvbnRyb2xzIHNldHRpbmdzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBjb250ZXh0IHRvIHNlYXJjaAorICAgICAqIEBwYXJhbSBtYXRjaGluZ0F0dHJpYnV0ZXMgdGhlIGF0dHJpYnV0ZXMgdG8gc2VhcmNoIGZvci4gSWYgZW1wdHkgb3IgCisgICAgICogbnVsbCwgYWxsIG9iamVjdHMgaW4gdGhlIHRhcmdldCBjb250ZXh0IGFyZSByZXR1cm5lZC4KKyAgICAgKiBAcGFyYW0gYXR0cmlidXRlc1RvUmV0dXJuIHRoZSBhdHRyaWJ1dGVzIHRvIHJldHVybi4gbnVsbCBpbmRpY2F0ZXMgCisgICAgICogdGhhdCBhbGwgYXR0cmlidXRlcyBhcmUgdG8gYmUgcmV0dXJuZWQ7IGFuIGVtcHR5IGFycmF5IGluZGljYXRlcyB0aGF0IAorICAgICAqIG5vbmUgYXJlIHRvIGJlIHJldHVybmVkLgorICAgICAqIEByZXR1cm4gYSBub24tbnVsbCBlbnVtZXJhdGlvbiBvZiBTZWFyY2hSZXN1bHQgb2JqZWN0cy4gRWFjaCAKKyAgICAgKiBTZWFyY2hSZXN1bHQgY29udGFpbnMgdGhlIGF0dHJpYnV0ZXMgaWRlbnRpZmllZCBieSBhdHRyaWJ1dGVzVG9SZXR1cm4gCisgICAgICogYW5kIHRoZSBuYW1lIG9mIHRoZSBjb3JyZXNwb25kaW5nIG9iamVjdCwgbmFtZWQgcmVsYXRpdmUgdG8gdGhlIAorICAgICAqIGNvbnRleHQgbmFtZWQgYnkgbmFtZS4KKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgTmFtaW5nRW51bWVyYXRpb24gc2VhcmNoKE5hbWUgbmFtZSwgQXR0cmlidXRlcyBtYXRjaGluZ0F0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBhdHRyaWJ1dGVzVG9SZXR1cm4pCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZGlyQ29udGV4dC5zZWFyY2gocGFyc2VOYW1lKG5hbWUpLCBtYXRjaGluZ0F0dHJpYnV0ZXMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlc1RvUmV0dXJuKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNlYXJjaGVzIGluIGEgc2luZ2xlIGNvbnRleHQgZm9yIG9iamVjdHMgdGhhdCBjb250YWluIGEgc3BlY2lmaWVkIHNldCAKKyAgICAgKiBvZiBhdHRyaWJ1dGVzLCBhbmQgcmV0cmlldmVzIHNlbGVjdGVkIGF0dHJpYnV0ZXMuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbnRleHQgdG8gc2VhcmNoCisgICAgICogQHBhcmFtIG1hdGNoaW5nQXR0cmlidXRlcyB0aGUgYXR0cmlidXRlcyB0byBzZWFyY2ggZm9yLiBJZiBlbXB0eSBvciAKKyAgICAgKiBudWxsLCBhbGwgb2JqZWN0cyBpbiB0aGUgdGFyZ2V0IGNvbnRleHQgYXJlIHJldHVybmVkLgorICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVzVG9SZXR1cm4gdGhlIGF0dHJpYnV0ZXMgdG8gcmV0dXJuLiBudWxsIGluZGljYXRlcyAKKyAgICAgKiB0aGF0IGFsbCBhdHRyaWJ1dGVzIGFyZSB0byBiZSByZXR1cm5lZDsgYW4gZW1wdHkgYXJyYXkgaW5kaWNhdGVzIHRoYXQgCisgICAgICogbm9uZSBhcmUgdG8gYmUgcmV0dXJuZWQuCisgICAgICogQHJldHVybiBhIG5vbi1udWxsIGVudW1lcmF0aW9uIG9mIFNlYXJjaFJlc3VsdCBvYmplY3RzLiBFYWNoIAorICAgICAqIFNlYXJjaFJlc3VsdCBjb250YWlucyB0aGUgYXR0cmlidXRlcyBpZGVudGlmaWVkIGJ5IGF0dHJpYnV0ZXNUb1JldHVybiAKKyAgICAgKiBhbmQgdGhlIG5hbWUgb2YgdGhlIGNvcnJlc3BvbmRpbmcgb2JqZWN0LCBuYW1lZCByZWxhdGl2ZSB0byB0aGUgCisgICAgICogY29udGV4dCBuYW1lZCBieSBuYW1lLgorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBOYW1pbmdFbnVtZXJhdGlvbiBzZWFyY2goU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZXMgbWF0Y2hpbmdBdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gYXR0cmlidXRlc1RvUmV0dXJuKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGRpckNvbnRleHQuc2VhcmNoKHBhcnNlTmFtZShuYW1lKSwgbWF0Y2hpbmdBdHRyaWJ1dGVzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXNUb1JldHVybik7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZWFyY2hlcyBpbiBhIHNpbmdsZSBjb250ZXh0IGZvciBvYmplY3RzIHRoYXQgY29udGFpbiBhIHNwZWNpZmllZCBzZXQgCisgICAgICogb2YgYXR0cmlidXRlcy4gVGhpcyBtZXRob2QgcmV0dXJucyBhbGwgdGhlIGF0dHJpYnV0ZXMgb2Ygc3VjaCBvYmplY3RzLiAKKyAgICAgKiBJdCBpcyBlcXVpdmFsZW50IHRvIHN1cHBseWluZyBudWxsIGFzIHRoZSBhdHJpYnV0ZXNUb1JldHVybiBwYXJhbWV0ZXIgCisgICAgICogdG8gdGhlIG1ldGhvZCBzZWFyY2goTmFtZSwgQXR0cmlidXRlcywgU3RyaW5nW10pLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBjb250ZXh0IHRvIHNlYXJjaAorICAgICAqIEBwYXJhbSBtYXRjaGluZ0F0dHJpYnV0ZXMgdGhlIGF0dHJpYnV0ZXMgdG8gc2VhcmNoIGZvci4gSWYgZW1wdHkgb3IgCisgICAgICogbnVsbCwgYWxsIG9iamVjdHMgaW4gdGhlIHRhcmdldCBjb250ZXh0IGFyZSByZXR1cm5lZC4KKyAgICAgKiBAcmV0dXJuIGEgbm9uLW51bGwgZW51bWVyYXRpb24gb2YgU2VhcmNoUmVzdWx0IG9iamVjdHMuIEVhY2ggCisgICAgICogU2VhcmNoUmVzdWx0IGNvbnRhaW5zIHRoZSBhdHRyaWJ1dGVzIGlkZW50aWZpZWQgYnkgYXR0cmlidXRlc1RvUmV0dXJuIAorICAgICAqIGFuZCB0aGUgbmFtZSBvZiB0aGUgY29ycmVzcG9uZGluZyBvYmplY3QsIG5hbWVkIHJlbGF0aXZlIHRvIHRoZSAKKyAgICAgKiBjb250ZXh0IG5hbWVkIGJ5IG5hbWUuCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIE5hbWluZ0VudW1lcmF0aW9uIHNlYXJjaChOYW1lIG5hbWUsIEF0dHJpYnV0ZXMgbWF0Y2hpbmdBdHRyaWJ1dGVzKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGRpckNvbnRleHQuc2VhcmNoKHBhcnNlTmFtZShuYW1lKSwgbWF0Y2hpbmdBdHRyaWJ1dGVzKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNlYXJjaGVzIGluIGEgc2luZ2xlIGNvbnRleHQgZm9yIG9iamVjdHMgdGhhdCBjb250YWluIGEgc3BlY2lmaWVkIHNldCAKKyAgICAgKiBvZiBhdHRyaWJ1dGVzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBjb250ZXh0IHRvIHNlYXJjaAorICAgICAqIEBwYXJhbSBtYXRjaGluZ0F0dHJpYnV0ZXMgdGhlIGF0dHJpYnV0ZXMgdG8gc2VhcmNoIGZvci4gSWYgZW1wdHkgb3IgCisgICAgICogbnVsbCwgYWxsIG9iamVjdHMgaW4gdGhlIHRhcmdldCBjb250ZXh0IGFyZSByZXR1cm5lZC4KKyAgICAgKiBAcmV0dXJuIGEgbm9uLW51bGwgZW51bWVyYXRpb24gb2YgU2VhcmNoUmVzdWx0IG9iamVjdHMuIEVhY2ggCisgICAgICogU2VhcmNoUmVzdWx0IGNvbnRhaW5zIHRoZSBhdHRyaWJ1dGVzIGlkZW50aWZpZWQgYnkgYXR0cmlidXRlc1RvUmV0dXJuIAorICAgICAqIGFuZCB0aGUgbmFtZSBvZiB0aGUgY29ycmVzcG9uZGluZyBvYmplY3QsIG5hbWVkIHJlbGF0aXZlIHRvIHRoZSAKKyAgICAgKiBjb250ZXh0IG5hbWVkIGJ5IG5hbWUuCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIE5hbWluZ0VudW1lcmF0aW9uIHNlYXJjaChTdHJpbmcgbmFtZSwgQXR0cmlidXRlcyBtYXRjaGluZ0F0dHJpYnV0ZXMpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZGlyQ29udGV4dC5zZWFyY2gocGFyc2VOYW1lKG5hbWUpLCBtYXRjaGluZ0F0dHJpYnV0ZXMpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2VhcmNoZXMgaW4gdGhlIG5hbWVkIGNvbnRleHQgb3Igb2JqZWN0IGZvciBlbnRyaWVzIHRoYXQgc2F0aXNmeSB0aGUgCisgICAgICogZ2l2ZW4gc2VhcmNoIGZpbHRlci4gUGVyZm9ybXMgdGhlIHNlYXJjaCBhcyBzcGVjaWZpZWQgYnkgdGhlIHNlYXJjaCAKKyAgICAgKiBjb250cm9scy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgY29udGV4dCBvciBvYmplY3QgdG8gc2VhcmNoCisgICAgICogQHBhcmFtIGZpbHRlciB0aGUgZmlsdGVyIGV4cHJlc3Npb24gdG8gdXNlIGZvciB0aGUgc2VhcmNoOyBtYXkgbm90IGJlIAorICAgICAqIG51bGwKKyAgICAgKiBAcGFyYW0gY29ucyB0aGUgc2VhcmNoIGNvbnRyb2xzIHRoYXQgY29udHJvbCB0aGUgc2VhcmNoLiBJZiBudWxsLCAKKyAgICAgKiB0aGUgZGVmYXVsdCBzZWFyY2ggY29udHJvbHMgYXJlIHVzZWQgKGVxdWl2YWxlbnQgdG8gCisgICAgICogKG5ldyBTZWFyY2hDb250cm9scygpKSkuCisgICAgICogQHJldHVybiBhbiBlbnVtZXJhdGlvbiBvZiBTZWFyY2hSZXN1bHRzIG9mIHRoZSBvYmplY3RzIHRoYXQgc2F0aXNmeSAKKyAgICAgKiB0aGUgZmlsdGVyOyBuZXZlciBudWxsCisgICAgICogQGV4Y2VwdGlvbiBJbnZhbGlkU2VhcmNoRmlsdGVyRXhjZXB0aW9uIGlmIHRoZSBzZWFyY2ggZmlsdGVyIHNwZWNpZmllZCAKKyAgICAgKiBpcyBub3Qgc3VwcG9ydGVkIG9yIHVuZGVyc3Rvb2QgYnkgdGhlIHVuZGVybHlpbmcgZGlyZWN0b3J5CisgICAgICogQGV4Y2VwdGlvbiBJbnZhbGlkU2VhcmNoQ29udHJvbHNFeGNlcHRpb24gaWYgdGhlIHNlYXJjaCBjb250cm9scyAKKyAgICAgKiBjb250YWluIGludmFsaWQgc2V0dGluZ3MKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgTmFtaW5nRW51bWVyYXRpb24gc2VhcmNoKE5hbWUgbmFtZSwgU3RyaW5nIGZpbHRlciwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWFyY2hDb250cm9scyBjb25zKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGRpckNvbnRleHQuc2VhcmNoKHBhcnNlTmFtZShuYW1lKSwgZmlsdGVyLCBjb25zKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNlYXJjaGVzIGluIHRoZSBuYW1lZCBjb250ZXh0IG9yIG9iamVjdCBmb3IgZW50cmllcyB0aGF0IHNhdGlzZnkgdGhlIAorICAgICAqIGdpdmVuIHNlYXJjaCBmaWx0ZXIuIFBlcmZvcm1zIHRoZSBzZWFyY2ggYXMgc3BlY2lmaWVkIGJ5IHRoZSBzZWFyY2ggCisgICAgICogY29udHJvbHMuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbnRleHQgb3Igb2JqZWN0IHRvIHNlYXJjaAorICAgICAqIEBwYXJhbSBmaWx0ZXIgdGhlIGZpbHRlciBleHByZXNzaW9uIHRvIHVzZSBmb3IgdGhlIHNlYXJjaDsgbWF5IG5vdCBiZSAKKyAgICAgKiBudWxsCisgICAgICogQHBhcmFtIGNvbnMgdGhlIHNlYXJjaCBjb250cm9scyB0aGF0IGNvbnRyb2wgdGhlIHNlYXJjaC4gSWYgbnVsbCwgCisgICAgICogdGhlIGRlZmF1bHQgc2VhcmNoIGNvbnRyb2xzIGFyZSB1c2VkIChlcXVpdmFsZW50IHRvIAorICAgICAqIChuZXcgU2VhcmNoQ29udHJvbHMoKSkpLgorICAgICAqIEByZXR1cm4gYW4gZW51bWVyYXRpb24gb2YgU2VhcmNoUmVzdWx0cyBvZiB0aGUgb2JqZWN0cyB0aGF0IHNhdGlzZnkgCisgICAgICogdGhlIGZpbHRlcjsgbmV2ZXIgbnVsbAorICAgICAqIEBleGNlcHRpb24gSW52YWxpZFNlYXJjaEZpbHRlckV4Y2VwdGlvbiBpZiB0aGUgc2VhcmNoIGZpbHRlciAKKyAgICAgKiBzcGVjaWZpZWQgaXMgbm90IHN1cHBvcnRlZCBvciB1bmRlcnN0b29kIGJ5IHRoZSB1bmRlcmx5aW5nIGRpcmVjdG9yeQorICAgICAqIEBleGNlcHRpb24gSW52YWxpZFNlYXJjaENvbnRyb2xzRXhjZXB0aW9uIGlmIHRoZSBzZWFyY2ggY29udHJvbHMgCisgICAgICogY29udGFpbiBpbnZhbGlkIHNldHRpbmdzCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIE5hbWluZ0VudW1lcmF0aW9uIHNlYXJjaChTdHJpbmcgbmFtZSwgU3RyaW5nIGZpbHRlciwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWFyY2hDb250cm9scyBjb25zKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGRpckNvbnRleHQuc2VhcmNoKHBhcnNlTmFtZShuYW1lKSwgZmlsdGVyLCBjb25zKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNlYXJjaGVzIGluIHRoZSBuYW1lZCBjb250ZXh0IG9yIG9iamVjdCBmb3IgZW50cmllcyB0aGF0IHNhdGlzZnkgdGhlIAorICAgICAqIGdpdmVuIHNlYXJjaCBmaWx0ZXIuIFBlcmZvcm1zIHRoZSBzZWFyY2ggYXMgc3BlY2lmaWVkIGJ5IHRoZSBzZWFyY2ggCisgICAgICogY29udHJvbHMuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbnRleHQgb3Igb2JqZWN0IHRvIHNlYXJjaAorICAgICAqIEBwYXJhbSBmaWx0ZXJFeHByIHRoZSBmaWx0ZXIgZXhwcmVzc2lvbiB0byB1c2UgZm9yIHRoZSBzZWFyY2guIAorICAgICAqIFRoZSBleHByZXNzaW9uIG1heSBjb250YWluIHZhcmlhYmxlcyBvZiB0aGUgZm9ybSAie2l9IiB3aGVyZSBpIGlzIGEgCisgICAgICogbm9ubmVnYXRpdmUgaW50ZWdlci4gTWF5IG5vdCBiZSBudWxsLgorICAgICAqIEBwYXJhbSBmaWx0ZXJBcmdzIHRoZSBhcnJheSBvZiBhcmd1bWVudHMgdG8gc3Vic3RpdHV0ZSBmb3IgdGhlIAorICAgICAqIHZhcmlhYmxlcyBpbiBmaWx0ZXJFeHByLiBUaGUgdmFsdWUgb2YgZmlsdGVyQXJnc1tpXSB3aWxsIHJlcGxhY2UgZWFjaCAKKyAgICAgKiBvY2N1cnJlbmNlIG9mICJ7aX0iLiBJZiBudWxsLCBlcXVpdmFsZW50IHRvIGFuIGVtcHR5IGFycmF5LgorICAgICAqIEBwYXJhbSBjb25zIHRoZSBzZWFyY2ggY29udHJvbHMgdGhhdCBjb250cm9sIHRoZSBzZWFyY2guIElmIG51bGwsIHRoZSAKKyAgICAgKiBkZWZhdWx0IHNlYXJjaCBjb250cm9scyBhcmUgdXNlZCAoZXF1aXZhbGVudCB0byAobmV3IFNlYXJjaENvbnRyb2xzKCkpKS4KKyAgICAgKiBAcmV0dXJuIGFuIGVudW1lcmF0aW9uIG9mIFNlYXJjaFJlc3VsdHMgb2YgdGhlIG9iamVjdHMgdGhhdCBzYXRpc3kgdGhlIAorICAgICAqIGZpbHRlcjsgbmV2ZXIgbnVsbAorICAgICAqIEBleGNlcHRpb24gQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIGZpbHRlckV4cHIgY29udGFpbnMge2l9IAorICAgICAqIGV4cHJlc3Npb25zIHdoZXJlIGkgaXMgb3V0c2lkZSB0aGUgYm91bmRzIG9mIHRoZSBhcnJheSBmaWx0ZXJBcmdzCisgICAgICogQGV4Y2VwdGlvbiBJbnZhbGlkU2VhcmNoQ29udHJvbHNFeGNlcHRpb24gaWYgY29ucyBjb250YWlucyBpbnZhbGlkIAorICAgICAqIHNldHRpbmdzCisgICAgICogQGV4Y2VwdGlvbiBJbnZhbGlkU2VhcmNoRmlsdGVyRXhjZXB0aW9uIGlmIGZpbHRlckV4cHIgd2l0aCBmaWx0ZXJBcmdzIAorICAgICAqIHJlcHJlc2VudHMgYW4gaW52YWxpZCBzZWFyY2ggZmlsdGVyCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIE5hbWluZ0VudW1lcmF0aW9uIHNlYXJjaChOYW1lIG5hbWUsIFN0cmluZyBmaWx0ZXJFeHByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0W10gZmlsdGVyQXJncywgU2VhcmNoQ29udHJvbHMgY29ucykKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBkaXJDb250ZXh0LnNlYXJjaChwYXJzZU5hbWUobmFtZSksIGZpbHRlckV4cHIsIGZpbHRlckFyZ3MsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ucyk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZWFyY2hlcyBpbiB0aGUgbmFtZWQgY29udGV4dCBvciBvYmplY3QgZm9yIGVudHJpZXMgdGhhdCBzYXRpc2Z5IHRoZSAKKyAgICAgKiBnaXZlbiBzZWFyY2ggZmlsdGVyLiBQZXJmb3JtcyB0aGUgc2VhcmNoIGFzIHNwZWNpZmllZCBieSB0aGUgc2VhcmNoIAorICAgICAqIGNvbnRyb2xzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBjb250ZXh0IG9yIG9iamVjdCB0byBzZWFyY2gKKyAgICAgKiBAcGFyYW0gZmlsdGVyRXhwciB0aGUgZmlsdGVyIGV4cHJlc3Npb24gdG8gdXNlIGZvciB0aGUgc2VhcmNoLiAKKyAgICAgKiBUaGUgZXhwcmVzc2lvbiBtYXkgY29udGFpbiB2YXJpYWJsZXMgb2YgdGhlIGZvcm0gIntpfSIgd2hlcmUgaSBpcyBhIAorICAgICAqIG5vbm5lZ2F0aXZlIGludGVnZXIuIE1heSBub3QgYmUgbnVsbC4KKyAgICAgKiBAcGFyYW0gZmlsdGVyQXJncyB0aGUgYXJyYXkgb2YgYXJndW1lbnRzIHRvIHN1YnN0aXR1dGUgZm9yIHRoZSAKKyAgICAgKiB2YXJpYWJsZXMgaW4gZmlsdGVyRXhwci4gVGhlIHZhbHVlIG9mIGZpbHRlckFyZ3NbaV0gd2lsbCByZXBsYWNlIGVhY2ggCisgICAgICogb2NjdXJyZW5jZSBvZiAie2l9Ii4gSWYgbnVsbCwgZXF1aXZhbGVudCB0byBhbiBlbXB0eSBhcnJheS4KKyAgICAgKiBAcGFyYW0gY29ucyB0aGUgc2VhcmNoIGNvbnRyb2xzIHRoYXQgY29udHJvbCB0aGUgc2VhcmNoLiBJZiBudWxsLCB0aGUgCisgICAgICogZGVmYXVsdCBzZWFyY2ggY29udHJvbHMgYXJlIHVzZWQgKGVxdWl2YWxlbnQgdG8gKG5ldyBTZWFyY2hDb250cm9scygpKSkuCisgICAgICogQHJldHVybiBhbiBlbnVtZXJhdGlvbiBvZiBTZWFyY2hSZXN1bHRzIG9mIHRoZSBvYmplY3RzIHRoYXQgc2F0aXN5IHRoZSAKKyAgICAgKiBmaWx0ZXI7IG5ldmVyIG51bGwKKyAgICAgKiBAZXhjZXB0aW9uIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiBmaWx0ZXJFeHByIGNvbnRhaW5zIHtpfSAKKyAgICAgKiBleHByZXNzaW9ucyB3aGVyZSBpIGlzIG91dHNpZGUgdGhlIGJvdW5kcyBvZiB0aGUgYXJyYXkgZmlsdGVyQXJncworICAgICAqIEBleGNlcHRpb24gSW52YWxpZFNlYXJjaENvbnRyb2xzRXhjZXB0aW9uIGlmIGNvbnMgY29udGFpbnMgaW52YWxpZCAKKyAgICAgKiBzZXR0aW5ncworICAgICAqIEBleGNlcHRpb24gSW52YWxpZFNlYXJjaEZpbHRlckV4Y2VwdGlvbiBpZiBmaWx0ZXJFeHByIHdpdGggZmlsdGVyQXJncyAKKyAgICAgKiByZXByZXNlbnRzIGFuIGludmFsaWQgc2VhcmNoIGZpbHRlcgorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBOYW1pbmdFbnVtZXJhdGlvbiBzZWFyY2goU3RyaW5nIG5hbWUsIFN0cmluZyBmaWx0ZXJFeHByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0W10gZmlsdGVyQXJncywgU2VhcmNoQ29udHJvbHMgY29ucykKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBkaXJDb250ZXh0LnNlYXJjaChwYXJzZU5hbWUobmFtZSksIGZpbHRlckV4cHIsIGZpbHRlckFyZ3MsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ucyk7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSBuYW1lZCBvYmplY3QgYXMgYSBjYWNoZSBlbnRyeSwgd2l0aG91dCBhbnkgZXhjZXB0aW9uLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBvYmplY3QgdG8gbG9vayB1cAorICAgICAqIEByZXR1cm4gdGhlIGNhY2hlIGVudHJ5IGJvdW5kIHRvIG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgQ2FjaGVFbnRyeSBsb29rdXBDYWNoZShTdHJpbmcgbmFtZSkgeworICAgICAgICBDYWNoZUVudHJ5IGVudHJ5ID0gY2FjaGVMb29rdXAobmFtZSk7CisgICAgICAgIGlmIChlbnRyeSA9PSBudWxsKSB7CisgICAgICAgICAgICBlbnRyeSA9IG5ldyBDYWNoZUVudHJ5KCk7CisgICAgICAgICAgICBlbnRyeS5uYW1lID0gbmFtZTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgT2JqZWN0IG9iamVjdCA9IGRpckNvbnRleHQubG9va3VwKHBhcnNlTmFtZShuYW1lKSk7CisgICAgICAgICAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIElucHV0U3RyZWFtKSB7CisgICAgICAgICAgICAgICAgICAgIGVudHJ5LnJlc291cmNlID0gbmV3IFJlc291cmNlKChJbnB1dFN0cmVhbSkgb2JqZWN0KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIERpckNvbnRleHQpIHsKKyAgICAgICAgICAgICAgICAgICAgZW50cnkuY29udGV4dCA9IChEaXJDb250ZXh0KSBvYmplY3Q7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBSZXNvdXJjZSkgeworICAgICAgICAgICAgICAgICAgICBlbnRyeS5yZXNvdXJjZSA9IChSZXNvdXJjZSkgb2JqZWN0OworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGVudHJ5LnJlc291cmNlID0gbmV3IFJlc291cmNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbQorICAgICAgICAgICAgICAgICAgICAgICAgKG9iamVjdC50b1N0cmluZygpLmdldEJ5dGVzKCkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQXR0cmlidXRlcyBhdHRyaWJ1dGVzID0gZGlyQ29udGV4dC5nZXRBdHRyaWJ1dGVzKHBhcnNlTmFtZShuYW1lKSk7CisgICAgICAgICAgICAgICAgaWYgKCEoYXR0cmlidXRlcyBpbnN0YW5jZW9mIFJlc291cmNlQXR0cmlidXRlcykpIHsKKyAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcyA9IG5ldyBSZXNvdXJjZUF0dHJpYnV0ZXMoYXR0cmlidXRlcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVudHJ5LmF0dHJpYnV0ZXMgPSAoUmVzb3VyY2VBdHRyaWJ1dGVzKSBhdHRyaWJ1dGVzOworICAgICAgICAgICAgfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBlbnRyeS5leGlzdHMgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZW50cnk7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvdGVjdGVkIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUGFyc2VzIGEgbmFtZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBwYXJzZWQgbmFtZQorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgcGFyc2VOYW1lKFN0cmluZyBuYW1lKSAKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUGFyc2VzIGEgbmFtZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBwYXJzZWQgbmFtZQorICAgICAqLworICAgIHByb3RlY3RlZCBOYW1lIHBhcnNlTmFtZShOYW1lIG5hbWUpIAorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBMb29rdXAgaW4gY2FjaGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIENhY2hlRW50cnkgY2FjaGVMb29rdXAoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgaWYgKGNhY2hlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICBpZiAobmFtZSA9PSBudWxsKQorICAgICAgICAgICAgbmFtZSA9ICIiOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vbkNhY2hlYWJsZS5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKG5hbWUuc3RhcnRzV2l0aChub25DYWNoZWFibGVbaV0pKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBDYWNoZUVudHJ5IGNhY2hlRW50cnkgPSBjYWNoZS5sb29rdXAobmFtZSk7CisgICAgICAgIGlmIChjYWNoZUVudHJ5ID09IG51bGwpIHsKKyAgICAgICAgICAgIGNhY2hlRW50cnkgPSBuZXcgQ2FjaGVFbnRyeSgpOworICAgICAgICAgICAgY2FjaGVFbnRyeS5uYW1lID0gbmFtZTsKKyAgICAgICAgICAgIC8vIExvYWQgZW50cnkKKyAgICAgICAgICAgIGNhY2hlTG9hZChjYWNoZUVudHJ5KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICghdmFsaWRhdGUoY2FjaGVFbnRyeSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIXJldmFsaWRhdGUoY2FjaGVFbnRyeSkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FjaGVVbmxvYWQoY2FjaGVFbnRyeS5uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjYWNoZUVudHJ5LnRpbWVzdGFtcCA9IAorICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyBjYWNoZVRUTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYWNoZUVudHJ5LmFjY2Vzc0NvdW50Kys7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChjYWNoZUVudHJ5KTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFZhbGlkYXRlIGVudHJ5LgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlKENhY2hlRW50cnkgZW50cnkpIHsKKyAgICAgICAgaWYgKCgoIWVudHJ5LmV4aXN0cykKKyAgICAgICAgICAgICB8fCAoZW50cnkuY29udGV4dCAhPSBudWxsKQorICAgICAgICAgICAgIHx8ICgoZW50cnkucmVzb3VyY2UgIT0gbnVsbCkgCisgICAgICAgICAgICAgICAgICYmIChlbnRyeS5yZXNvdXJjZS5nZXRDb250ZW50KCkgIT0gbnVsbCkpKQorICAgICAgICAgICAgJiYgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIDwgZW50cnkudGltZXN0YW1wKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV2YWxpZGF0ZSBlbnRyeS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiByZXZhbGlkYXRlKENhY2hlRW50cnkgZW50cnkpIHsKKyAgICAgICAgLy8gR2V0IHRoZSBhdHRyaWJ1dGVzIGF0IHRoZSBnaXZlbiBwYXRoLCBhbmQgY2hlY2sgdGhlIGxhc3QgCisgICAgICAgIC8vIG1vZGlmaWNhdGlvbiBkYXRlCisgICAgICAgIGlmICghZW50cnkuZXhpc3RzKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoZW50cnkuYXR0cmlidXRlcyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBsb25nIGxhc3RNb2RpZmllZCA9IGVudHJ5LmF0dHJpYnV0ZXMuZ2V0TGFzdE1vZGlmaWVkKCk7CisgICAgICAgIGxvbmcgY29udGVudExlbmd0aCA9IGVudHJ5LmF0dHJpYnV0ZXMuZ2V0Q29udGVudExlbmd0aCgpOworICAgICAgICBpZiAobGFzdE1vZGlmaWVkIDw9IDApCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBBdHRyaWJ1dGVzIHRlbXBBdHRyaWJ1dGVzID0gZGlyQ29udGV4dC5nZXRBdHRyaWJ1dGVzKGVudHJ5Lm5hbWUpOworICAgICAgICAgICAgUmVzb3VyY2VBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMgPSBudWxsOworICAgICAgICAgICAgaWYgKCEodGVtcEF0dHJpYnV0ZXMgaW5zdGFuY2VvZiBSZXNvdXJjZUF0dHJpYnV0ZXMpKSB7CisgICAgICAgICAgICAgICAgYXR0cmlidXRlcyA9IG5ldyBSZXNvdXJjZUF0dHJpYnV0ZXModGVtcEF0dHJpYnV0ZXMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzID0gKFJlc291cmNlQXR0cmlidXRlcykgdGVtcEF0dHJpYnV0ZXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb25nIGxhc3RNb2RpZmllZDIgPSBhdHRyaWJ1dGVzLmdldExhc3RNb2RpZmllZCgpOworICAgICAgICAgICAgbG9uZyBjb250ZW50TGVuZ3RoMiA9IGF0dHJpYnV0ZXMuZ2V0Q29udGVudExlbmd0aCgpOworICAgICAgICAgICAgcmV0dXJuIChsYXN0TW9kaWZpZWQgPT0gbGFzdE1vZGlmaWVkMikgCisgICAgICAgICAgICAgICAgJiYgKGNvbnRlbnRMZW5ndGggPT0gY29udGVudExlbmd0aDIpOworICAgICAgICB9IGNhdGNoIChOYW1pbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBMb2FkIGVudHJ5IGludG8gY2FjaGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgY2FjaGVMb2FkKENhY2hlRW50cnkgZW50cnkpIHsKKworICAgICAgICBTdHJpbmcgbmFtZSA9IGVudHJ5Lm5hbWU7CisKKyAgICAgICAgLy8gUmV0cmlldmUgbWlzc2luZyBpbmZvCisgICAgICAgIGJvb2xlYW4gZXhpc3RzID0gdHJ1ZTsKKworICAgICAgICAvLyBSZXRyaWV2aW5nIGF0dHJpYnV0ZXMKKyAgICAgICAgaWYgKGVudHJ5LmF0dHJpYnV0ZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMgPSBkaXJDb250ZXh0LmdldEF0dHJpYnV0ZXMoZW50cnkubmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKCEoYXR0cmlidXRlcyBpbnN0YW5jZW9mIFJlc291cmNlQXR0cmlidXRlcykpIHsKKyAgICAgICAgICAgICAgICAgICAgZW50cnkuYXR0cmlidXRlcyA9IAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJlc291cmNlQXR0cmlidXRlcyhhdHRyaWJ1dGVzKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBlbnRyeS5hdHRyaWJ1dGVzID0gKFJlc291cmNlQXR0cmlidXRlcykgYXR0cmlidXRlczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChOYW1pbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGV4aXN0cyA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gUmV0cml2aW5nIG9iamVjdAorICAgICAgICBpZiAoKGV4aXN0cykgJiYgKGVudHJ5LnJlc291cmNlID09IG51bGwpICYmIChlbnRyeS5jb250ZXh0ID09IG51bGwpKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIE9iamVjdCBvYmplY3QgPSBkaXJDb250ZXh0Lmxvb2t1cChuYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgSW5wdXRTdHJlYW0pIHsKKyAgICAgICAgICAgICAgICAgICAgZW50cnkucmVzb3VyY2UgPSBuZXcgUmVzb3VyY2UoKElucHV0U3RyZWFtKSBvYmplY3QpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgRGlyQ29udGV4dCkgeworICAgICAgICAgICAgICAgICAgICBlbnRyeS5jb250ZXh0ID0gKERpckNvbnRleHQpIG9iamVjdDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFJlc291cmNlKSB7CisgICAgICAgICAgICAgICAgICAgIGVudHJ5LnJlc291cmNlID0gKFJlc291cmNlKSBvYmplY3Q7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZW50cnkucmVzb3VyY2UgPSBuZXcgUmVzb3VyY2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtCisgICAgICAgICAgICAgICAgICAgICAgICAob2JqZWN0LnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZXhpc3RzID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBMb2FkIG9iamVjdCBjb250ZW50CisgICAgICAgIGlmICgoZXhpc3RzKSAmJiAoZW50cnkucmVzb3VyY2UgIT0gbnVsbCkgCisgICAgICAgICAgICAmJiAoZW50cnkucmVzb3VyY2UuZ2V0Q29udGVudCgpID09IG51bGwpIAorICAgICAgICAgICAgJiYgKGVudHJ5LmF0dHJpYnV0ZXMuZ2V0Q29udGVudExlbmd0aCgpID49IDApCisgICAgICAgICAgICAmJiAoZW50cnkuYXR0cmlidXRlcy5nZXRDb250ZW50TGVuZ3RoKCkgPCAKKyAgICAgICAgICAgICAgICAoY2FjaGVPYmplY3RNYXhTaXplICogMTAyNCkpKSB7CisgICAgICAgICAgICBpbnQgbGVuZ3RoID0gKGludCkgZW50cnkuYXR0cmlidXRlcy5nZXRDb250ZW50TGVuZ3RoKCk7CisgICAgICAgICAgICAvLyBUaGUgZW50cnkgc2l6ZSBpcyAxICsgdGhlIHJlc291cmNlIHNpemUgaW4gS0IsIGlmIGl0IHdpbGwgYmUgCisgICAgICAgICAgICAvLyBjYWNoZWQKKyAgICAgICAgICAgIGVudHJ5LnNpemUgKz0gKGVudHJ5LmF0dHJpYnV0ZXMuZ2V0Q29udGVudExlbmd0aCgpIC8gMTAyNCk7CisgICAgICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlzID0gZW50cnkucmVzb3VyY2Uuc3RyZWFtQ29udGVudCgpOworICAgICAgICAgICAgICAgIGludCBwb3MgPSAwOworICAgICAgICAgICAgICAgIGJ5dGVbXSBiID0gbmV3IGJ5dGVbbGVuZ3RoXTsKKyAgICAgICAgICAgICAgICB3aGlsZSAocG9zIDwgbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBuID0gaXMucmVhZChiLCBwb3MsIGxlbmd0aCAtIHBvcyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChuIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBwb3MgPSBwb3MgKyBuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbnRyeS5yZXNvdXJjZS5zZXRDb250ZW50KGIpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIDsgLy8gSWdub3JlCisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpcyAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgaXMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIDsgLy8gSWdub3JlCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gU2V0IGV4aXN0ZW5jZSBmbGFnCisgICAgICAgIGVudHJ5LmV4aXN0cyA9IGV4aXN0czsKKworICAgICAgICAvLyBTZXQgdGltZXN0YW1wCisgICAgICAgIGVudHJ5LnRpbWVzdGFtcCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgY2FjaGVUVEw7CisKKyAgICAgICAgLy8gQWRkIG5ldyBlbnRyeSB0byBjYWNoZQorICAgICAgICBzeW5jaHJvbml6ZWQgKGNhY2hlKSB7CisgICAgICAgICAgICAvLyBDaGVjayBjYWNoZSBzaXplLCBhbmQgcmVtb3ZlIGVsZW1lbnRzIGlmIHRvbyBiaWcKKyAgICAgICAgICAgIGlmIChjYWNoZS5hbGxvY2F0ZShlbnRyeS5zaXplKSkgeworICAgICAgICAgICAgICAgIGNhY2hlLmxvYWQoZW50cnkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBlbnRyeSBmcm9tIGNhY2hlLgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGNhY2hlVW5sb2FkKFN0cmluZyBuYW1lKSB7CisgICAgICAgIGlmIChjYWNoZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBzeW5jaHJvbml6ZWQgKGNhY2hlKSB7CisgICAgICAgICAgICByZXR1cm4gY2FjaGUudW5sb2FkKG5hbWUpOworICAgICAgICB9CisgICAgfQorCisKK30KKwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9yZXNvdXJjZXMvUmVjeWNsYWJsZU5hbWluZ0VudW1lcmF0aW9uLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL3Jlc291cmNlcy9SZWN5Y2xhYmxlTmFtaW5nRW51bWVyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGFlYzhkCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9yZXNvdXJjZXMvUmVjeWNsYWJsZU5hbWluZ0VudW1lcmF0aW9uLmphdmEKQEAgLTAsMCArMSwxMTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8gCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm5hbWluZy5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1pbmdFbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtaW5nRXhjZXB0aW9uOworCisvKioKKyAqIE5hbWluZyBlbnVtZXJhdGlvbiBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBAYXV0aG9yIFJlbXkgTWF1Y2hlcmF0CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBSZWN5Y2xhYmxlTmFtaW5nRW51bWVyYXRpb24gCisgICAgaW1wbGVtZW50cyBOYW1pbmdFbnVtZXJhdGlvbiB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICBwdWJsaWMgUmVjeWNsYWJsZU5hbWluZ0VudW1lcmF0aW9uKFZlY3RvciBlbnRyaWVzKSB7CisgICAgICAgIHRoaXMuZW50cmllcyA9IGVudHJpZXM7CisgICAgICAgIHJlY3ljbGUoKTsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBFbnRyaWVzLgorICAgICAqLworICAgIHByb3RlY3RlZCBWZWN0b3IgZW50cmllczsKKworCisgICAgLyoqCisgICAgICogVW5kZXJseWluZyBlbnVtZXJhdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRW51bWVyYXRpb24gZW51bWVyYXRpb247CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIG5leHQgZWxlbWVudCBpbiB0aGUgZW51bWVyYXRpb24uCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBuZXh0KCkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXh0RWxlbWVudCgpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgbW9yZSBlbGVtZW50cyBpbiB0aGUgZW51bWVyYXRpb24uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaGFzTW9yZSgpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZW51bWVyYXRpb24uaGFzTW9yZUVsZW1lbnRzKCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDbG9zZXMgdGhpcyBlbnVtZXJhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgIH0KKworCisgICAgcHVibGljIGJvb2xlYW4gaGFzTW9yZUVsZW1lbnRzKCkgeworICAgICAgICByZXR1cm4gZW51bWVyYXRpb24uaGFzTW9yZUVsZW1lbnRzKCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgT2JqZWN0IG5leHRFbGVtZW50KCkgeworICAgICAgICByZXR1cm4gZW51bWVyYXRpb24ubmV4dEVsZW1lbnQoKTsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBhY2thZ2UgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZWN5Y2xlLgorICAgICAqLworICAgIHZvaWQgcmVjeWNsZSgpIHsKKyAgICAJZW51bWVyYXRpb24gPSBlbnRyaWVzLmVsZW1lbnRzKCk7CisgICAgfQorCisKK30KKwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9yZXNvdXJjZXMvUmVzb3VyY2UuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvcmVzb3VyY2VzL1Jlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTIzZTNiNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvcmVzb3VyY2VzL1Jlc291cmNlLmphdmEKQEAgLTAsMCArMSwxMTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8gCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5uYW1pbmcucmVzb3VyY2VzOworCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKy8qKgorICogRW5jYXBzdWx0ZXMgdGhlIGNvbnRlbnRzIG9mIGEgcmVzb3VyY2UuCisgKiAKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnJlbW1AYXBhY2hlLm9yZyI+UmVteSBNYXVjaGVyYXQ8L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBSZXNvdXJjZSB7CisgICAgCisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisgICAgCisgICAgCisgICAgcHVibGljIFJlc291cmNlKCkgeworICAgIH0KKyAgICAKKyAgICAKKyAgICBwdWJsaWMgUmVzb3VyY2UoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHsKKyAgICAgICAgc2V0Q29udGVudChpbnB1dFN0cmVhbSk7CisgICAgfQorICAgIAorICAgIAorICAgIHB1YmxpYyBSZXNvdXJjZShieXRlW10gYmluYXJ5Q29udGVudCkgeworICAgICAgICBzZXRDb250ZW50KGJpbmFyeUNvbnRlbnQpOworICAgIH0KKyAgICAKKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBCaW5hcnkgY29udGVudC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYnl0ZVtdIGJpbmFyeUNvbnRlbnQgPSBudWxsOworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIElucHV0IHN0cmVhbS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBudWxsOworICAgIAorICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIENvbnRlbnQgYWNjZXNzb3IuCisgICAgICogCisgICAgICogQHJldHVybiBJbnB1dFN0cmVhbQorICAgICAqLworICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBzdHJlYW1Db250ZW50KCkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGJpbmFyeUNvbnRlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiaW5hcnlDb250ZW50KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaW5wdXRTdHJlYW07CisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIENvbnRlbnQgYWNjZXNzb3IuCisgICAgICogCisgICAgICogQHJldHVybiBiaW5hcnkgY29udGVudAorICAgICAqLworICAgIHB1YmxpYyBieXRlW10gZ2V0Q29udGVudCgpIHsKKyAgICAgICAgcmV0dXJuIGJpbmFyeUNvbnRlbnQ7CisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIENvbnRlbnQgbXV0YXRvci4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gaW5wdXRTdHJlYW0gTmV3IGlucHV0IHN0cmVhbQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbnRlbnQoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHsKKyAgICAgICAgdGhpcy5pbnB1dFN0cmVhbSA9IGlucHV0U3RyZWFtOworICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBDb250ZW50IG11dGF0b3IuCisgICAgICogCisgICAgICogQHBhcmFtIGJpbmFyeUNvbnRlbnQgTmV3IGJpbiBjb250ZW50CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29udGVudChieXRlW10gYmluYXJ5Q29udGVudCkgeworICAgICAgICB0aGlzLmJpbmFyeUNvbnRlbnQgPSBiaW5hcnlDb250ZW50OworICAgIH0KKyAgICAKKyAgICAKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvcmVzb3VyY2VzL1Jlc291cmNlQXR0cmlidXRlcy5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9yZXNvdXJjZXMvUmVzb3VyY2VBdHRyaWJ1dGVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdiMWE0NgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvcmVzb3VyY2VzL1Jlc291cmNlQXR0cmlidXRlcy5qYXZhCkBAIC0wLDAgKzEsOTAzIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovIAorCitwYWNrYWdlIG9yZy5hcGFjaGUubmFtaW5nLnJlc291cmNlczsKKworaW1wb3J0IGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5UaW1lWm9uZTsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWluZ0VudW1lcmF0aW9uOworaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1pbmdFeGNlcHRpb247CitpbXBvcnQgamF2YXgubmFtaW5nLmRpcmVjdG9yeS5BdHRyaWJ1dGU7CitpbXBvcnQgamF2YXgubmFtaW5nLmRpcmVjdG9yeS5BdHRyaWJ1dGVzOworaW1wb3J0IGphdmF4Lm5hbWluZy5kaXJlY3RvcnkuQmFzaWNBdHRyaWJ1dGU7CisKKy8qKgorICogQXR0cmlidXRlcyBpbXBsZW1lbnRhdGlvbi4KKyAqIAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86cmVtbUBhcGFjaGUub3JnIj5SZW15IE1hdWNoZXJhdDwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIFJlc291cmNlQXR0cmlidXRlcyBpbXBsZW1lbnRzIEF0dHJpYnV0ZXMgeworICAgIAorICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0YW50cworICAgIAorICAgIAorICAgIC8vIERlZmF1bHQgYXR0cmlidXRlIG5hbWVzCisgICAgCisgICAgLyoqCisgICAgICogQ3JlYXRpb24gZGF0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVElPTl9EQVRFID0gImNyZWF0aW9uZGF0ZSI7CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogQ3JlYXRpb24gZGF0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTFRFUk5BVEVfQ1JFQVRJT05fREFURSA9ICJjcmVhdGlvbi1kYXRlIjsKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBMYXN0IG1vZGlmaWNhdGlvbiBkYXRlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExBU1RfTU9ESUZJRUQgPSAiZ2V0bGFzdG1vZGlmaWVkIjsKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBMYXN0IG1vZGlmaWNhdGlvbiBkYXRlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFMVEVSTkFURV9MQVNUX01PRElGSUVEID0gImxhc3QtbW9kaWZpZWQiOworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIE5hbWUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRSA9ICJkaXNwbGF5bmFtZSI7CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogVHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFID0gInJlc291cmNldHlwZSI7CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogVHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTFRFUk5BVEVfVFlQRSA9ICJjb250ZW50LXR5cGUiOworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFNvdXJjZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT1VSQ0UgPSAic291cmNlIjsKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBNSU1FIHR5cGUgb2YgdGhlIGNvbnRlbnQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9UWVBFID0gImdldGNvbnRlbnR0eXBlIjsKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBDb250ZW50IGxhbmd1YWdlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfTEFOR1VBR0UgPSAiZ2V0Y29udGVudGxhbmd1YWdlIjsKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBDb250ZW50IGxlbmd0aC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX0xFTkdUSCA9ICJnZXRjb250ZW50bGVuZ3RoIjsKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBDb250ZW50IGxlbmd0aC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTFRFUk5BVEVfQ09OVEVOVF9MRU5HVEggPSAiY29udGVudC1sZW5ndGgiOworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIEVUYWcuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVRBRyA9ICJnZXRldGFnIjsKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBDb2xsZWN0aW9uIHR5cGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MTEVDVElPTl9UWVBFID0gIjxjb2xsZWN0aW9uLz4iOworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIEhUVFAgZGF0ZSBmb3JtYXQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTaW1wbGVEYXRlRm9ybWF0IGZvcm1hdCA9CisgICAgICAgIG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJFRUUsIGRkIE1NTSB5eXl5IEhIOm1tOnNzIHp6eiIsIExvY2FsZS5VUyk7CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogRGF0ZSBmb3JtYXRzIHVzaW5nIGZvciBEYXRlIHBhcnNpbmcuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTaW1wbGVEYXRlRm9ybWF0IGZvcm1hdHNbXSA9IHsKKyAgICAgICAgbmV3IFNpbXBsZURhdGVGb3JtYXQoIkVFRSwgZGQgTU1NIHl5eXkgSEg6bW06c3Mgenp6IiwgTG9jYWxlLlVTKSwKKyAgICAgICAgbmV3IFNpbXBsZURhdGVGb3JtYXQoIkVFRUVFRSwgZGQtTU1NLXl5IEhIOm1tOnNzIHp6eiIsIExvY2FsZS5VUyksCisgICAgICAgIG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJFRUUgTU1NTSBkIEhIOm1tOnNzIHl5eXkiLCBMb2NhbGUuVVMpCisgICAgfTsKKyAgICAKKyAgICAKKyAgICBwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFRpbWVab25lIGdtdFpvbmUgPSBUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01UIik7CisKKworICAgIC8qKgorICAgICAqIEdNVCB0aW1lem9uZSAtIGFsbCBIVFRQIGRhdGVzIGFyZSBvbiBHTVQKKyAgICAgKi8KKyAgICBzdGF0aWMgeworCisgICAgICAgIGZvcm1hdC5zZXRUaW1lWm9uZShnbXRab25lKTsKKworICAgICAgICBmb3JtYXRzWzBdLnNldFRpbWVab25lKGdtdFpvbmUpOworICAgICAgICBmb3JtYXRzWzFdLnNldFRpbWVab25lKGdtdFpvbmUpOworICAgICAgICBmb3JtYXRzWzJdLnNldFRpbWVab25lKGdtdFpvbmUpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgICAqLworICAgIHB1YmxpYyBSZXNvdXJjZUF0dHJpYnV0ZXMoKSB7CisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIE1lcmdlcyB3aXRoIGFub3RoZXIgYXR0cmlidXRlIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgUmVzb3VyY2VBdHRyaWJ1dGVzKEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgeworICAgICAgICB0aGlzLmF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzOworICAgIH0KKyAgICAKKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogQ29sbGVjdGlvbiBmbGFnLgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGNvbGxlY3Rpb24gPSBmYWxzZTsKKworCisgICAgLyoqCisgICAgICogQ29udGVudCBsZW5ndGguCisgICAgICovCisgICAgcHJvdGVjdGVkIGxvbmcgY29udGVudExlbmd0aCA9IC0xOworCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGlvbiB0aW1lLgorICAgICAqLworICAgIHByb3RlY3RlZCBsb25nIGNyZWF0aW9uID0gLTE7CisKKworICAgIC8qKgorICAgICAqIENyZWF0aW9uIGRhdGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIERhdGUgY3JlYXRpb25EYXRlID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogTGFzdCBtb2RpZmllZCB0aW1lLgorICAgICAqLworICAgIHByb3RlY3RlZCBsb25nIGxhc3RNb2RpZmllZCA9IC0xOworCisKKyAgICAvKioKKyAgICAgKiBMYXN0IG1vZGlmaWVkIGRhdGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIERhdGUgbGFzdE1vZGlmaWVkRGF0ZSA9IG51bGw7CisKKyAgICAKKyAgICAvKioKKyAgICAgKiBMYXN0IG1vZGlmaWVkIGRhdGUgaW4gSFRUUCBmb3JtYXQuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBsYXN0TW9kaWZpZWRIdHRwID0gbnVsbDsKKyAgICAKKworICAgIC8qKgorICAgICAqIE1JTUUgdHlwZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIG1pbWVUeXBlID0gbnVsbDsKKyAgICAKKworICAgIC8qKgorICAgICAqIE5hbWUuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogV2VhayBFVGFnLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgd2Vha0VUYWcgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBTdHJvbmcgRVRhZy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHN0cm9uZ0VUYWcgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBFeHRlcm5hbCBhdHRyaWJ1dGVzLgorICAgICAqLworICAgIHByb3RlY3RlZCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMgPSBudWxsOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogSXMgY29sbGVjdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0NvbGxlY3Rpb24oKSB7CisgICAgICAgIGlmIChhdHRyaWJ1dGVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiAoZ2V0UmVzb3VyY2VUeXBlKCkuZXF1YWxzKENPTExFQ1RJT05fVFlQRSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIChjb2xsZWN0aW9uKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgY29sbGVjdGlvbiBmbGFnLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbGxlY3Rpb24gTmV3IGZsYWcgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb2xsZWN0aW9uKGJvb2xlYW4gY29sbGVjdGlvbikgeworICAgICAgICB0aGlzLmNvbGxlY3Rpb24gPSBjb2xsZWN0aW9uOworICAgICAgICBpZiAoYXR0cmlidXRlcyAhPSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSAiIjsKKyAgICAgICAgICAgIGlmIChjb2xsZWN0aW9uKQorICAgICAgICAgICAgICAgIHZhbHVlID0gQ09MTEVDVElPTl9UWVBFOworICAgICAgICAgICAgYXR0cmlidXRlcy5wdXQoVFlQRSwgdmFsdWUpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIEdldCBjb250ZW50IGxlbmd0aC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGNvbnRlbnQgbGVuZ3RoIHZhbHVlCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0Q29udGVudExlbmd0aCgpIHsKKyAgICAgICAgaWYgKGNvbnRlbnRMZW5ndGggIT0gLTFMKQorICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnRMZW5ndGg7CisgICAgICAgIGlmIChhdHRyaWJ1dGVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLmdldChDT05URU5UX0xFTkdUSCk7CisgICAgICAgICAgICBpZiAoYXR0cmlidXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBhdHRyaWJ1dGUuZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIExvbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRMZW5ndGggPSAoKExvbmcpIHZhbHVlKS5sb25nVmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudExlbmd0aCA9IExvbmcucGFyc2VMb25nKHZhbHVlLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IC8vIElnbm9yZQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgOyAvLyBObyB2YWx1ZSBmb3IgdGhlIGF0dHJpYnV0ZQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29udGVudExlbmd0aDsKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogU2V0IGNvbnRlbnQgbGVuZ3RoLgorICAgICAqIAorICAgICAqIEBwYXJhbSBjb250ZW50TGVuZ3RoIE5ldyBjb250ZW50IGxlbmd0aCB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbnRlbnRMZW5ndGgobG9uZyBjb250ZW50TGVuZ3RoKSB7CisgICAgICAgIHRoaXMuY29udGVudExlbmd0aCA9IGNvbnRlbnRMZW5ndGg7CisgICAgICAgIGlmIChhdHRyaWJ1dGVzICE9IG51bGwpCisgICAgICAgICAgICBhdHRyaWJ1dGVzLnB1dChDT05URU5UX0xFTkdUSCwgbmV3IExvbmcoY29udGVudExlbmd0aCkpOworICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBHZXQgY3JlYXRpb24gdGltZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGNyZWF0aW9uIHRpbWUgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRDcmVhdGlvbigpIHsKKyAgICAgICAgaWYgKGNyZWF0aW9uICE9IC0xTCkKKyAgICAgICAgICAgIHJldHVybiBjcmVhdGlvbjsKKyAgICAgICAgaWYgKGNyZWF0aW9uRGF0ZSAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGNyZWF0aW9uRGF0ZS5nZXRUaW1lKCk7CisgICAgICAgIGlmIChhdHRyaWJ1dGVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLmdldChDUkVBVElPTl9EQVRFKTsKKyAgICAgICAgICAgIGlmIChhdHRyaWJ1dGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGF0dHJpYnV0ZS5nZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTG9uZykgeworICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRpb24gPSAoKExvbmcpIHZhbHVlKS5sb25nVmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0aW9uID0gKChEYXRlKSB2YWx1ZSkuZ2V0VGltZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRpb25EYXRlID0gKERhdGUpIHZhbHVlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNyZWF0aW9uRGF0ZVZhbHVlID0gdmFsdWUudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIERhdGUgcmVzdWx0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBhcnNpbmcgdGhlIEhUVFAgRGF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IChyZXN1bHQgPT0gbnVsbCkgJiYgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaSA8IGZvcm1hdHMubGVuZ3RoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZm9ybWF0c1tpXS5wYXJzZShjcmVhdGlvbkRhdGVWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRpb24gPSByZXN1bHQuZ2V0VGltZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0aW9uRGF0ZSA9IHJlc3VsdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIDsgLy8gTm8gdmFsdWUgZm9yIHRoZSBhdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNyZWF0aW9uOworICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgY3JlYXRpb24uCisgICAgICogCisgICAgICogQHBhcmFtIGNyZWF0aW9uIE5ldyBjcmVhdGlvbiB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENyZWF0aW9uKGxvbmcgY3JlYXRpb24pIHsKKyAgICAgICAgdGhpcy5jcmVhdGlvbiA9IGNyZWF0aW9uOworICAgICAgICB0aGlzLmNyZWF0aW9uRGF0ZSA9IG51bGw7CisgICAgICAgIGlmIChhdHRyaWJ1dGVzICE9IG51bGwpCisgICAgICAgICAgICBhdHRyaWJ1dGVzLnB1dChDUkVBVElPTl9EQVRFLCBuZXcgRGF0ZShjcmVhdGlvbikpOworICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBHZXQgY3JlYXRpb24gZGF0ZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIENyZWF0aW9uIGRhdGUgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgRGF0ZSBnZXRDcmVhdGlvbkRhdGUoKSB7CisgICAgICAgIGlmIChjcmVhdGlvbkRhdGUgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBjcmVhdGlvbkRhdGU7CisgICAgICAgIGlmIChjcmVhdGlvbiAhPSAtMUwpIHsKKyAgICAgICAgICAgIGNyZWF0aW9uRGF0ZSA9IG5ldyBEYXRlKGNyZWF0aW9uKTsKKyAgICAgICAgICAgIHJldHVybiBjcmVhdGlvbkRhdGU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgQXR0cmlidXRlIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMuZ2V0KENSRUFUSU9OX0RBVEUpOworICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gYXR0cmlidXRlLmdldCgpOworICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBMb25nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGlvbiA9ICgoTG9uZykgdmFsdWUpLmxvbmdWYWx1ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRpb25EYXRlID0gbmV3IERhdGUoY3JlYXRpb24pOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRpb24gPSAoKERhdGUpIHZhbHVlKS5nZXRUaW1lKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGlvbkRhdGUgPSAoRGF0ZSkgdmFsdWU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY3JlYXRpb25EYXRlVmFsdWUgPSB2YWx1ZS50b1N0cmluZygpOworICAgICAgICAgICAgICAgICAgICAgICAgRGF0ZSByZXN1bHQgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gUGFyc2luZyB0aGUgSFRUUCBEYXRlCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgKHJlc3VsdCA9PSBudWxsKSAmJiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpIDwgZm9ybWF0cy5sZW5ndGgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBmb3JtYXRzW2ldLnBhcnNlKGNyZWF0aW9uRGF0ZVZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGlvbiA9IHJlc3VsdC5nZXRUaW1lKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRpb25EYXRlID0gcmVzdWx0OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgOyAvLyBObyB2YWx1ZSBmb3IgdGhlIGF0dHJpYnV0ZQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3JlYXRpb25EYXRlOworICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBDcmVhdGlvbiBkYXRlIG11dGF0b3IuCisgICAgICogCisgICAgICogQHBhcmFtIGNyZWF0aW9uRGF0ZSBOZXcgY3JlYXRpb24gZGF0ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENyZWF0aW9uRGF0ZShEYXRlIGNyZWF0aW9uRGF0ZSkgeworICAgICAgICB0aGlzLmNyZWF0aW9uID0gY3JlYXRpb25EYXRlLmdldFRpbWUoKTsKKyAgICAgICAgdGhpcy5jcmVhdGlvbkRhdGUgPSBjcmVhdGlvbkRhdGU7CisgICAgICAgIGlmIChhdHRyaWJ1dGVzICE9IG51bGwpCisgICAgICAgICAgICBhdHRyaWJ1dGVzLnB1dChDUkVBVElPTl9EQVRFLCBjcmVhdGlvbkRhdGUpOworICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBHZXQgbGFzdCBtb2RpZmllZCB0aW1lLgorICAgICAqIAorICAgICAqIEByZXR1cm4gbGFzdE1vZGlmaWVkIHRpbWUgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRMYXN0TW9kaWZpZWQoKSB7CisgICAgICAgIGlmIChsYXN0TW9kaWZpZWQgIT0gLTFMKQorICAgICAgICAgICAgcmV0dXJuIGxhc3RNb2RpZmllZDsKKyAgICAgICAgaWYgKGxhc3RNb2RpZmllZERhdGUgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBsYXN0TW9kaWZpZWREYXRlLmdldFRpbWUoKTsKKyAgICAgICAgaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgQXR0cmlidXRlIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMuZ2V0KExBU1RfTU9ESUZJRUQpOworICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gYXR0cmlidXRlLmdldCgpOworICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBMb25nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsYXN0TW9kaWZpZWQgPSAoKExvbmcpIHZhbHVlKS5sb25nVmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RNb2RpZmllZCA9ICgoRGF0ZSkgdmFsdWUpLmdldFRpbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RNb2RpZmllZERhdGUgPSAoRGF0ZSkgdmFsdWU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFzdE1vZGlmaWVkRGF0ZVZhbHVlID0gdmFsdWUudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIERhdGUgcmVzdWx0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBhcnNpbmcgdGhlIEhUVFAgRGF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IChyZXN1bHQgPT0gbnVsbCkgJiYgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaSA8IGZvcm1hdHMubGVuZ3RoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRzW2ldLnBhcnNlKGxhc3RNb2RpZmllZERhdGVWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdE1vZGlmaWVkID0gcmVzdWx0LmdldFRpbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0TW9kaWZpZWREYXRlID0gcmVzdWx0OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgOyAvLyBObyB2YWx1ZSBmb3IgdGhlIGF0dHJpYnV0ZQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbGFzdE1vZGlmaWVkOworICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgbGFzdCBtb2RpZmllZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbGFzdE1vZGlmaWVkIE5ldyBsYXN0IG1vZGlmaWVkIHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TGFzdE1vZGlmaWVkKGxvbmcgbGFzdE1vZGlmaWVkKSB7CisgICAgICAgIHRoaXMubGFzdE1vZGlmaWVkID0gbGFzdE1vZGlmaWVkOworICAgICAgICB0aGlzLmxhc3RNb2RpZmllZERhdGUgPSBudWxsOworICAgICAgICBpZiAoYXR0cmlidXRlcyAhPSBudWxsKQorICAgICAgICAgICAgYXR0cmlidXRlcy5wdXQoTEFTVF9NT0RJRklFRCwgbmV3IERhdGUobGFzdE1vZGlmaWVkKSk7CisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFNldCBsYXN0IG1vZGlmaWVkIGRhdGUuCisgICAgICogCisgICAgICogQHBhcmFtIGxhc3RNb2RpZmllZCBOZXcgbGFzdCBtb2RpZmllZCBkYXRlIHZhbHVlCisgICAgICogQGRlcHJlY2F0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMYXN0TW9kaWZpZWQoRGF0ZSBsYXN0TW9kaWZpZWQpIHsKKyAgICAgICAgc2V0TGFzdE1vZGlmaWVkRGF0ZShsYXN0TW9kaWZpZWQpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0IGxhc3RNb2RpZmllZCBkYXRlLgorICAgICAqIAorICAgICAqIEByZXR1cm4gTGFzdE1vZGlmaWVkIGRhdGUgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgRGF0ZSBnZXRMYXN0TW9kaWZpZWREYXRlKCkgeworICAgICAgICBpZiAobGFzdE1vZGlmaWVkRGF0ZSAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGxhc3RNb2RpZmllZERhdGU7CisgICAgICAgIGlmIChsYXN0TW9kaWZpZWQgIT0gLTFMKSB7CisgICAgICAgICAgICBsYXN0TW9kaWZpZWREYXRlID0gbmV3IERhdGUobGFzdE1vZGlmaWVkKTsKKyAgICAgICAgICAgIHJldHVybiBsYXN0TW9kaWZpZWREYXRlOworICAgICAgICB9CisgICAgICAgIGlmIChhdHRyaWJ1dGVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLmdldChMQVNUX01PRElGSUVEKTsKKyAgICAgICAgICAgIGlmIChhdHRyaWJ1dGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGF0dHJpYnV0ZS5nZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTG9uZykgeworICAgICAgICAgICAgICAgICAgICAgICAgbGFzdE1vZGlmaWVkID0gKChMb25nKSB2YWx1ZSkubG9uZ1ZhbHVlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBsYXN0TW9kaWZpZWREYXRlID0gbmV3IERhdGUobGFzdE1vZGlmaWVkKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RNb2RpZmllZCA9ICgoRGF0ZSkgdmFsdWUpLmdldFRpbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RNb2RpZmllZERhdGUgPSAoRGF0ZSkgdmFsdWU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFzdE1vZGlmaWVkRGF0ZVZhbHVlID0gdmFsdWUudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIERhdGUgcmVzdWx0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBhcnNpbmcgdGhlIEhUVFAgRGF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IChyZXN1bHQgPT0gbnVsbCkgJiYgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaSA8IGZvcm1hdHMubGVuZ3RoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRzW2ldLnBhcnNlKGxhc3RNb2RpZmllZERhdGVWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdE1vZGlmaWVkID0gcmVzdWx0LmdldFRpbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0TW9kaWZpZWREYXRlID0gcmVzdWx0OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgOyAvLyBObyB2YWx1ZSBmb3IgdGhlIGF0dHJpYnV0ZQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbGFzdE1vZGlmaWVkRGF0ZTsKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogTGFzdCBtb2RpZmllZCBkYXRlIG11dGF0b3IuCisgICAgICogCisgICAgICogQHBhcmFtIGxhc3RNb2RpZmllZERhdGUgTmV3IGxhc3QgbW9kaWZpZWQgZGF0ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExhc3RNb2RpZmllZERhdGUoRGF0ZSBsYXN0TW9kaWZpZWREYXRlKSB7CisgICAgICAgIHRoaXMubGFzdE1vZGlmaWVkID0gbGFzdE1vZGlmaWVkRGF0ZS5nZXRUaW1lKCk7CisgICAgICAgIHRoaXMubGFzdE1vZGlmaWVkRGF0ZSA9IGxhc3RNb2RpZmllZERhdGU7CisgICAgICAgIGlmIChhdHRyaWJ1dGVzICE9IG51bGwpCisgICAgICAgICAgICBhdHRyaWJ1dGVzLnB1dChMQVNUX01PRElGSUVELCBsYXN0TW9kaWZpZWREYXRlKTsKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBsYXN0TW9kaWZpZWRIdHRwLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFzdE1vZGlmaWVkSHR0cCgpIHsKKyAgICAgICAgaWYgKGxhc3RNb2RpZmllZEh0dHAgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBsYXN0TW9kaWZpZWRIdHRwOworICAgICAgICBEYXRlIG1vZGlmaWVkRGF0ZSA9IGdldExhc3RNb2RpZmllZERhdGUoKTsKKyAgICAgICAgaWYgKG1vZGlmaWVkRGF0ZSA9PSBudWxsKSB7CisgICAgICAgICAgICBtb2RpZmllZERhdGUgPSBnZXRDcmVhdGlvbkRhdGUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobW9kaWZpZWREYXRlID09IG51bGwpIHsKKyAgICAgICAgICAgIG1vZGlmaWVkRGF0ZSA9IG5ldyBEYXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgc3luY2hyb25pemVkIChmb3JtYXQpIHsKKyAgICAgICAgICAgIGxhc3RNb2RpZmllZEh0dHAgPSBmb3JtYXQuZm9ybWF0KG1vZGlmaWVkRGF0ZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGxhc3RNb2RpZmllZEh0dHA7CisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIEBwYXJhbSBsYXN0TW9kaWZpZWRIdHRwIFRoZSBsYXN0TW9kaWZpZWRIdHRwIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMYXN0TW9kaWZpZWRIdHRwKFN0cmluZyBsYXN0TW9kaWZpZWRIdHRwKSB7CisgICAgICAgIHRoaXMubGFzdE1vZGlmaWVkSHR0cCA9IGxhc3RNb2RpZmllZEh0dHA7CisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbWltZVR5cGUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRNaW1lVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIG1pbWVUeXBlOworICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gbWltZVR5cGUgVGhlIG1pbWVUeXBlIHRvIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNaW1lVHlwZShTdHJpbmcgbWltZVR5cGUpIHsKKyAgICAgICAgdGhpcy5taW1lVHlwZSA9IG1pbWVUeXBlOworICAgIH0KKworICAgIAorICAgIC8qKgorICAgICAqIEdldCBuYW1lLgorICAgICAqIAorICAgICAqIEByZXR1cm4gTmFtZSB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBuYW1lOworICAgICAgICBpZiAoYXR0cmlidXRlcyAhPSBudWxsKSB7CisgICAgICAgICAgICBBdHRyaWJ1dGUgYXR0cmlidXRlID0gYXR0cmlidXRlcy5nZXQoTkFNRSk7CisgICAgICAgICAgICBpZiAoYXR0cmlidXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBuYW1lID0gYXR0cmlidXRlLmdldCgpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgOyAvLyBObyB2YWx1ZSBmb3IgdGhlIGF0dHJpYnV0ZQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCBuYW1lLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIE5ldyBuYW1lIHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICBpZiAoYXR0cmlidXRlcyAhPSBudWxsKQorICAgICAgICAgICAgYXR0cmlidXRlcy5wdXQoTkFNRSwgbmFtZSk7CisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIEdldCByZXNvdXJjZSB0eXBlLgorICAgICAqIAorICAgICAqIEByZXR1cm4gU3RyaW5nIHJlc291cmNlIHR5cGUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlVHlwZSgpIHsKKyAgICAgICAgU3RyaW5nIHJlc3VsdCA9IG51bGw7CisgICAgICAgIGlmIChhdHRyaWJ1dGVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLmdldChUWVBFKTsKKyAgICAgICAgICAgIGlmIChhdHRyaWJ1dGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGF0dHJpYnV0ZS5nZXQoKS50b1N0cmluZygpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIDsgLy8gTm8gdmFsdWUgZm9yIHRoZSBhdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7CisgICAgICAgICAgICBpZiAoY29sbGVjdGlvbikKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBDT0xMRUNUSU9OX1RZUEU7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gIiI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogVHlwZSBtdXRhdG9yLgorICAgICAqIAorICAgICAqIEBwYXJhbSByZXNvdXJjZVR5cGUgTmV3IHJlc291cmNlIHR5cGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZVR5cGUoU3RyaW5nIHJlc291cmNlVHlwZSkgeworICAgICAgICBjb2xsZWN0aW9uID0gcmVzb3VyY2VUeXBlLmVxdWFscyhDT0xMRUNUSU9OX1RZUEUpOworICAgICAgICBpZiAoYXR0cmlidXRlcyAhPSBudWxsKQorICAgICAgICAgICAgYXR0cmlidXRlcy5wdXQoVFlQRSwgcmVzb3VyY2VUeXBlKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdldCBFVGFnLgorICAgICAqIAorICAgICAqIEByZXR1cm4gV2VhayBFVGFnCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRFVGFnKCkgeworICAgICAgICByZXR1cm4gZ2V0RVRhZyhmYWxzZSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHZXQgRVRhZy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc3Ryb25nIElmIHRydWUsIHRoZSBzdHJvbmcgRVRhZyB3aWxsIGJlIHJldHVybmVkCisgICAgICogQHJldHVybiBFVGFnCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRFVGFnKGJvb2xlYW4gc3Ryb25nKSB7CisgICAgICAgIFN0cmluZyByZXN1bHQgPSBudWxsOworICAgICAgICBpZiAoYXR0cmlidXRlcyAhPSBudWxsKSB7CisgICAgICAgICAgICBBdHRyaWJ1dGUgYXR0cmlidXRlID0gYXR0cmlidXRlcy5nZXQoRVRBRyk7CisgICAgICAgICAgICBpZiAoYXR0cmlidXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBhdHRyaWJ1dGUuZ2V0KCkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChOYW1pbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICA7IC8vIE5vIHZhbHVlIGZvciB0aGUgYXR0cmlidXRlCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChzdHJvbmcpIHsKKyAgICAgICAgICAgIC8vIFRoZSBzdHJvbmcgRVRhZyBtdXN0IGFsd2F5cyBiZSBjYWxjdWxhdGVkIGJ5IHRoZSByZXNvdXJjZXMKKyAgICAgICAgICAgIHJlc3VsdCA9IHN0cm9uZ0VUYWc7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBUaGUgd2Vha0VUYWcgaXMgY29udGVudExlbmdodCArIGxhc3RNb2RpZmllZAorICAgICAgICAgICAgaWYgKHdlYWtFVGFnID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB3ZWFrRVRhZyA9ICJXL1wiIiArIGdldENvbnRlbnRMZW5ndGgoKSArICItIiAKKyAgICAgICAgICAgICAgICAgICAgKyBnZXRMYXN0TW9kaWZpZWQoKSArICJcIiI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXN1bHQgPSB3ZWFrRVRhZzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHN0cm9uZyBFVGFnLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEVUYWcoU3RyaW5nIGVUYWcpIHsKKyAgICAgICAgdGhpcy5zdHJvbmdFVGFnID0gZVRhZzsKKyAgICAgICAgaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKKyAgICAgICAgICAgIGF0dHJpYnV0ZXMucHV0KEVUQUcsIGVUYWcpOworICAgIH0KKworICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEF0dHJpYnV0ZXMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBHZXQgYXR0cmlidXRlLgorICAgICAqLworICAgIHB1YmxpYyBBdHRyaWJ1dGUgZ2V0KFN0cmluZyBhdHRySUQpIHsKKyAgICAgICAgaWYgKGF0dHJpYnV0ZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGF0dHJJRC5lcXVhbHMoQ1JFQVRJT05fREFURSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEJhc2ljQXR0cmlidXRlKENSRUFUSU9OX0RBVEUsIGdldENyZWF0aW9uRGF0ZSgpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYXR0cklELmVxdWFscyhBTFRFUk5BVEVfQ1JFQVRJT05fREFURSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEJhc2ljQXR0cmlidXRlKEFMVEVSTkFURV9DUkVBVElPTl9EQVRFLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENyZWF0aW9uRGF0ZSgpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYXR0cklELmVxdWFscyhMQVNUX01PRElGSUVEKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQmFzaWNBdHRyaWJ1dGUoTEFTVF9NT0RJRklFRCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMYXN0TW9kaWZpZWREYXRlKCkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChhdHRySUQuZXF1YWxzKEFMVEVSTkFURV9MQVNUX01PRElGSUVEKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQmFzaWNBdHRyaWJ1dGUoQUxURVJOQVRFX0xBU1RfTU9ESUZJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMYXN0TW9kaWZpZWREYXRlKCkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChhdHRySUQuZXF1YWxzKE5BTUUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCYXNpY0F0dHJpYnV0ZShOQU1FLCBnZXROYW1lKCkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChhdHRySUQuZXF1YWxzKFRZUEUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCYXNpY0F0dHJpYnV0ZShUWVBFLCBnZXRSZXNvdXJjZVR5cGUoKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGF0dHJJRC5lcXVhbHMoQUxURVJOQVRFX1RZUEUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCYXNpY0F0dHJpYnV0ZShBTFRFUk5BVEVfVFlQRSwgZ2V0UmVzb3VyY2VUeXBlKCkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChhdHRySUQuZXF1YWxzKENPTlRFTlRfTEVOR1RIKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQmFzaWNBdHRyaWJ1dGUoQ09OVEVOVF9MRU5HVEgsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IExvbmcoZ2V0Q29udGVudExlbmd0aCgpKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGF0dHJJRC5lcXVhbHMoQUxURVJOQVRFX0NPTlRFTlRfTEVOR1RIKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQmFzaWNBdHRyaWJ1dGUoQUxURVJOQVRFX0NPTlRFTlRfTEVOR1RILCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBMb25nKGdldENvbnRlbnRMZW5ndGgoKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZXMuZ2V0KGF0dHJJRCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFB1dCBhdHRyaWJ1dGUuCisgICAgICovCisgICAgcHVibGljIEF0dHJpYnV0ZSBwdXQoQXR0cmlidXRlIGF0dHJpYnV0ZSkgeworICAgICAgICBpZiAoYXR0cmlidXRlcyA9PSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiBwdXQoYXR0cmlidXRlLmdldElEKCksIGF0dHJpYnV0ZS5nZXQoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChOYW1pbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZXMucHV0KGF0dHJpYnV0ZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogUHV0IGF0dHJpYnV0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQXR0cmlidXRlIHB1dChTdHJpbmcgYXR0cklELCBPYmplY3QgdmFsKSB7CisgICAgICAgIGlmIChhdHRyaWJ1dGVzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOyAvLyBObyByZWFzb24gdG8gaW1wbGVtZW50IHRoaXMKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGVzLnB1dChhdHRySUQsIHZhbCk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogUmVtb3ZlIGF0dHJpYnV0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQXR0cmlidXRlIHJlbW92ZShTdHJpbmcgYXR0cklEKSB7CisgICAgICAgIGlmIChhdHRyaWJ1dGVzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOyAvLyBObyByZWFzb24gdG8gaW1wbGVtZW50IHRoaXMKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGVzLnJlbW92ZShhdHRySUQpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIEdldCBhbGwgYXR0cmlidXRlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTmFtaW5nRW51bWVyYXRpb24gZ2V0QWxsKCkgeworICAgICAgICBpZiAoYXR0cmlidXRlcyA9PSBudWxsKSB7CisgICAgICAgICAgICBWZWN0b3IgYXR0cmlidXRlcyA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZXMuYWRkRWxlbWVudChuZXcgQmFzaWNBdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ1JFQVRJT05fREFURSwgZ2V0Q3JlYXRpb25EYXRlKCkpKTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZXMuYWRkRWxlbWVudChuZXcgQmFzaWNBdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTEFTVF9NT0RJRklFRCwgZ2V0TGFzdE1vZGlmaWVkRGF0ZSgpKSk7CisgICAgICAgICAgICBhdHRyaWJ1dGVzLmFkZEVsZW1lbnQobmV3IEJhc2ljQXR0cmlidXRlKE5BTUUsIGdldE5hbWUoKSkpOworICAgICAgICAgICAgYXR0cmlidXRlcy5hZGRFbGVtZW50KG5ldyBCYXNpY0F0dHJpYnV0ZShUWVBFLCBnZXRSZXNvdXJjZVR5cGUoKSkpOworICAgICAgICAgICAgYXR0cmlidXRlcy5hZGRFbGVtZW50CisgICAgICAgICAgICAgICAgKG5ldyBCYXNpY0F0dHJpYnV0ZShDT05URU5UX0xFTkdUSCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTG9uZyhnZXRDb250ZW50TGVuZ3RoKCkpKSk7CisgICAgICAgICAgICByZXR1cm4gbmV3IFJlY3ljbGFibGVOYW1pbmdFbnVtZXJhdGlvbihhdHRyaWJ1dGVzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGVzLmdldEFsbCgpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIEdldCBhbGwgYXR0cmlidXRlIElEcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTmFtaW5nRW51bWVyYXRpb24gZ2V0SURzKCkgeworICAgICAgICBpZiAoYXR0cmlidXRlcyA9PSBudWxsKSB7CisgICAgICAgICAgICBWZWN0b3IgYXR0cmlidXRlSURzID0gbmV3IFZlY3RvcigpOworICAgICAgICAgICAgYXR0cmlidXRlSURzLmFkZEVsZW1lbnQoQ1JFQVRJT05fREFURSk7CisgICAgICAgICAgICBhdHRyaWJ1dGVJRHMuYWRkRWxlbWVudChMQVNUX01PRElGSUVEKTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZUlEcy5hZGRFbGVtZW50KE5BTUUpOworICAgICAgICAgICAgYXR0cmlidXRlSURzLmFkZEVsZW1lbnQoVFlQRSk7CisgICAgICAgICAgICBhdHRyaWJ1dGVJRHMuYWRkRWxlbWVudChDT05URU5UX0xFTkdUSCk7CisgICAgICAgICAgICByZXR1cm4gbmV3IFJlY3ljbGFibGVOYW1pbmdFbnVtZXJhdGlvbihhdHRyaWJ1dGVJRHMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZXMuZ2V0SURzKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSBudW1iZXIgb2YgYXR0cmlidXRlcyBpbiB0aGUgYXR0cmlidXRlIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHNpemUoKSB7CisgICAgICAgIGlmIChhdHRyaWJ1dGVzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiA1OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZXMuc2l6ZSgpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIENsb25lIHRoZSBhdHRyaWJ1dGVzIG9iamVjdCAoV0FSTklORzogZmFrZSBjbG9uaW5nKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogQ2FzZSBzZW5zaXRpdml0eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0Nhc2VJZ25vcmVkKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIAorICAgIAorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9yZXNvdXJjZXMvUmVzb3VyY2VDYWNoZS5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9yZXNvdXJjZXMvUmVzb3VyY2VDYWNoZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1NzFjZDYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL3Jlc291cmNlcy9SZXNvdXJjZUNhY2hlLmphdmEKQEAgLTAsMCArMSw0MTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8gCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5uYW1pbmcucmVzb3VyY2VzOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CisKKy8qKgorICogSW1wbGVtZW50cyBhIHNwZWNpYWwgcHVycG9zZSBjYWNoZS4KKyAqIAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86cmVtbUBhcGFjaGUub3JnIj5SZW15IE1hdWNoZXJhdDwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIFJlc291cmNlQ2FjaGUgeworICAgIAorICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworICAgIAorICAgIAorICAgIHB1YmxpYyBSZXNvdXJjZUNhY2hlKCkgeworICAgIH0KKyAgICAKKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBDYWNoZS4KKyAgICAgKiBQYXRoIC0+IENhY2hlIGVudHJ5LgorICAgICAqLworICAgIHByb3RlY3RlZCBDYWNoZUVudHJ5W10gY2FjaGUgPSBuZXcgQ2FjaGVFbnRyeVswXTsKKworCisgICAgLyoqCisgICAgICogTm90IGZvdW5kIGNhY2hlLgorICAgICAqLworICAgIHByb3RlY3RlZCBIYXNoTWFwIG5vdEZvdW5kQ2FjaGUgPSBuZXcgSGFzaE1hcCgpOworCisKKyAgICAvKioKKyAgICAgKiBNYXggc2l6ZSBvZiByZXNvdXJjZXMgd2hpY2ggd2lsbCBoYXZlIHRoZWlyIGNvbnRlbnQgY2FjaGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgY2FjaGVNYXhTaXplID0gMTAyNDA7IC8vIDEwIE1CCisKKworICAgIC8qKgorICAgICAqIE1heCBhbW91bnQgb2YgcmVtb3ZhbHMgZHVyaW5nIGEgbWFrZSBzcGFjZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IG1heEFsbG9jYXRlSXRlcmF0aW9ucyA9IDIwOworCisKKyAgICAvKioKKyAgICAgKiBFbnRyeSBoaXQgcmF0aW8gYXQgd2hpY2ggYW4gZW50cnkgd2lsbCBuZXZlciBiZSByZW1vdmVkIGZyb20gdGhlIGNhY2hlLgorICAgICAqIENvbXBhcmVkIHdpdGggZW50cnkuYWNjZXNzIC8gaGl0c0NvdW50CisgICAgICovCisgICAgcHJvdGVjdGVkIGxvbmcgZGVzaXJlZEVudHJ5QWNjZXNzUmF0aW8gPSAzOworCisKKyAgICAvKioKKyAgICAgKiBTcGFyZSBhbW91bnQgb2Ygbm90IGZvdW5kIGVudHJpZXMuCisgICAgICovCisgICAgcHJvdGVjdGVkIGludCBzcGFyZU5vdEZvdW5kRW50cmllcyA9IDUwMDsKKworCisgICAgLyoqCisgICAgICogQ3VycmVudCBjYWNoZSBzaXplIGluIEtCLgorICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgY2FjaGVTaXplID0gMDsKKworCisgICAgLyoqCisgICAgICogTnVtYmVyIG9mIGFjY2Vzc2VzIHRvIHRoZSBjYWNoZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgbG9uZyBhY2Nlc3NDb3VudCA9IDA7CisKKworICAgIC8qKgorICAgICAqIE51bWJlciBvZiBjYWNoZSBoaXRzLgorICAgICAqLworICAgIHByb3RlY3RlZCBsb25nIGhpdHNDb3VudCA9IDA7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGFjY2VzcyBjb3VudC4KKyAgICAgKiBOb3RlOiBVcGRhdGUgaXMgbm90IHN5bmNlZCwgc28gdGhlIG51bWJlciBtYXkgbm90IGJlIGNvbXBsZXRlbHkgCisgICAgICogYWNjdXJhdGUuCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0QWNjZXNzQ291bnQoKSB7CisgICAgICAgIHJldHVybiBhY2Nlc3NDb3VudDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSBjYWNoZSBpbiBLQi4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldENhY2hlTWF4U2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIGNhY2hlTWF4U2l6ZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSBjYWNoZSBpbiBLQi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDYWNoZU1heFNpemUoaW50IGNhY2hlTWF4U2l6ZSkgeworICAgICAgICB0aGlzLmNhY2hlTWF4U2l6ZSA9IGNhY2hlTWF4U2l6ZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY3VycmVudCBjYWNoZSBzaXplIGluIEtCLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0Q2FjaGVTaXplKCkgeworICAgICAgICByZXR1cm4gY2FjaGVTaXplOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGRlc2lyZWQgZW50cnkgYWNjZXNzIHJhdGlvLgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldERlc2lyZWRFbnRyeUFjY2Vzc1JhdGlvKCkgeworICAgICAgICByZXR1cm4gZGVzaXJlZEVudHJ5QWNjZXNzUmF0aW87CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGRlc2lyZWQgZW50cnkgYWNjZXNzIHJhdGlvLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERlc2lyZWRFbnRyeUFjY2Vzc1JhdGlvKGxvbmcgZGVzaXJlZEVudHJ5QWNjZXNzUmF0aW8pIHsKKyAgICAgICAgdGhpcy5kZXNpcmVkRW50cnlBY2Nlc3NSYXRpbyA9IGRlc2lyZWRFbnRyeUFjY2Vzc1JhdGlvOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBudW1iZXIgb2YgY2FjaGUgaGl0cy4KKyAgICAgKiBOb3RlOiBVcGRhdGUgaXMgbm90IHN5bmNlZCwgc28gdGhlIG51bWJlciBtYXkgbm90IGJlIGNvbXBsZXRlbHkgCisgICAgICogYWNjdXJhdGUuCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0SGl0c0NvdW50KCkgeworICAgICAgICByZXR1cm4gaGl0c0NvdW50OworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBtYXhpbXVtIGFtb3VudCBvZiBpdGVyYXRpb25zIGR1cmluZyBhIHNwYWNlIGFsbG9jYXRpb24uCisgICAgICovCisgICAgcHVibGljIGludCBnZXRNYXhBbGxvY2F0ZUl0ZXJhdGlvbnMoKSB7CisgICAgICAgIHJldHVybiBtYXhBbGxvY2F0ZUl0ZXJhdGlvbnM7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG1heGltdW0gYW1vdW50IG9mIGl0ZXJhdGlvbnMgZHVyaW5nIGEgc3BhY2UgYWxsb2NhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNYXhBbGxvY2F0ZUl0ZXJhdGlvbnMoaW50IG1heEFsbG9jYXRlSXRlcmF0aW9ucykgeworICAgICAgICB0aGlzLm1heEFsbG9jYXRlSXRlcmF0aW9ucyA9IG1heEFsbG9jYXRlSXRlcmF0aW9uczsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgYW1vdW50IG9mIHNwYXJlIG5vdCBmb3VuZCBlbnRyaWVzLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0U3BhcmVOb3RGb3VuZEVudHJpZXMoKSB7CisgICAgICAgIHJldHVybiBzcGFyZU5vdEZvdW5kRW50cmllczsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYW1vdW50IG9mIHNwYXJlIG5vdCBmb3VuZCBlbnRyaWVzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNwYXJlTm90Rm91bmRFbnRyaWVzKGludCBzcGFyZU5vdEZvdW5kRW50cmllcykgeworICAgICAgICB0aGlzLnNwYXJlTm90Rm91bmRFbnRyaWVzID0gc3BhcmVOb3RGb3VuZEVudHJpZXM7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgcHVibGljIGJvb2xlYW4gYWxsb2NhdGUoaW50IHNwYWNlKSB7CisKKyAgICAgICAgaW50IHRvRnJlZSA9IHNwYWNlIC0gKGNhY2hlTWF4U2l6ZSAtIGNhY2hlU2l6ZSk7CisKKyAgICAgICAgaWYgKHRvRnJlZSA8PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEluY3JlYXNlIHRoZSBhbW91bnQgdG8gZnJlZSBzbyB0aGF0IGFsbG9jYXRlIHdvbid0IGhhdmUgdG8gcnVuIHJpZ2h0CisgICAgICAgIC8vIGF3YXkgYWdhaW4KKyAgICAgICAgdG9GcmVlICs9IChjYWNoZU1heFNpemUgLyAyMCk7CisKKyAgICAgICAgaW50IHNpemUgPSBub3RGb3VuZENhY2hlLnNpemUoKTsKKyAgICAgICAgaWYgKHNpemUgPiBzcGFyZU5vdEZvdW5kRW50cmllcykgeworICAgICAgICAgICAgbm90Rm91bmRDYWNoZS5jbGVhcigpOworICAgICAgICAgICAgY2FjaGVTaXplIC09IHNpemU7CisgICAgICAgICAgICB0b0ZyZWUgLT0gc2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0b0ZyZWUgPD0gMCkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBpbnQgYXR0ZW1wdHMgPSAwOworICAgICAgICBpbnQgZW50cmllc0ZvdW5kID0gMDsKKyAgICAgICAgbG9uZyB0b3RhbFNwYWNlID0gMDsKKyAgICAgICAgaW50W10gdG9SZW1vdmUgPSBuZXcgaW50W21heEFsbG9jYXRlSXRlcmF0aW9uc107CisgICAgICAgIHdoaWxlICh0b0ZyZWUgPiAwKSB7CisgICAgICAgICAgICBpZiAoYXR0ZW1wdHMgPT0gbWF4QWxsb2NhdGVJdGVyYXRpb25zKSB7CisgICAgICAgICAgICAgICAgLy8gR2l2ZSB1cCwgbm8gY2hhbmdlcyBhcmUgbWFkZSB0byB0aGUgY3VycmVudCBjYWNoZQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0b0ZyZWUgPiAwKSB7CisgICAgICAgICAgICAgICAgLy8gUmFuZG9tbHkgc2VsZWN0IGFuIGVudHJ5IGluIHRoZSBhcnJheQorICAgICAgICAgICAgICAgIGludCBlbnRyeVBvcyA9IC0xOworICAgICAgICAgICAgICAgIGJvb2xlYW4gdW5pcXVlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoIXVuaXF1ZSkgeworICAgICAgICAgICAgICAgICAgICB1bmlxdWUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBlbnRyeVBvcyA9IChpbnQpIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKGNhY2hlLmxlbmd0aCAtIDEpKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gR3VhcmFudGVlIHVuaXF1ZW5lc3MKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzRm91bmQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRvUmVtb3ZlW2ldID09IGVudHJ5UG9zKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pcXVlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbG9uZyBlbnRyeUFjY2Vzc1JhdGlvID0gCisgICAgICAgICAgICAgICAgICAgICgoY2FjaGVbZW50cnlQb3NdLmFjY2Vzc0NvdW50ICogMTAwKSAvIGFjY2Vzc0NvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAoZW50cnlBY2Nlc3NSYXRpbyA8IGRlc2lyZWRFbnRyeUFjY2Vzc1JhdGlvKSB7CisgICAgICAgICAgICAgICAgICAgIHRvUmVtb3ZlW2VudHJpZXNGb3VuZF0gPSBlbnRyeVBvczsKKyAgICAgICAgICAgICAgICAgICAgdG90YWxTcGFjZSArPSBjYWNoZVtlbnRyeVBvc10uc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgdG9GcmVlIC09IGNhY2hlW2VudHJ5UG9zXS5zaXplOworICAgICAgICAgICAgICAgICAgICBlbnRyaWVzRm91bmQrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdHRlbXB0cysrOworICAgICAgICB9CisKKyAgICAgICAgLy8gTm93IHJlbW92ZSB0aGUgc2VsZWN0ZWQgZW50cmllcworICAgICAgICBqYXZhLnV0aWwuQXJyYXlzLnNvcnQodG9SZW1vdmUsIDAsIGVudHJpZXNGb3VuZCk7CisgICAgICAgIENhY2hlRW50cnlbXSBuZXdDYWNoZSA9IG5ldyBDYWNoZUVudHJ5W2NhY2hlLmxlbmd0aCAtIGVudHJpZXNGb3VuZF07CisgICAgICAgIGludCBwb3MgPSAwOworICAgICAgICBpbnQgbiA9IC0xOworICAgICAgICBpZiAoZW50cmllc0ZvdW5kID4gMCkgeworICAgICAgICAgICAgbiA9IHRvUmVtb3ZlWzBdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjYWNoZS5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChpID09IG4pIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChwb3MgKyAxKSA8IGVudHJpZXNGb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbiA9IHRvUmVtb3ZlW3BvcyArIDFdOworICAgICAgICAgICAgICAgICAgICAgICAgcG9zKys7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwb3MrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIG4gPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG5ld0NhY2hlW2kgLSBwb3NdID0gY2FjaGVbaV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNhY2hlID0gbmV3Q2FjaGU7CisgICAgICAgIGNhY2hlU2l6ZSAtPSB0b3RhbFNwYWNlOworCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgfQorCisKKyAgICBwdWJsaWMgQ2FjaGVFbnRyeSBsb29rdXAoU3RyaW5nIG5hbWUpIHsKKworICAgICAgICBDYWNoZUVudHJ5IGNhY2hlRW50cnkgPSBudWxsOworICAgICAgICBhY2Nlc3NDb3VudCsrOworICAgICAgICBpbnQgcG9zID0gZmluZChjYWNoZSwgbmFtZSk7CisgICAgICAgIGlmICgocG9zICE9IC0xKSAmJiAobmFtZS5lcXVhbHMoY2FjaGVbcG9zXS5uYW1lKSkpIHsKKyAgICAgICAgICAgIGNhY2hlRW50cnkgPSBjYWNoZVtwb3NdOworICAgICAgICB9CisgICAgICAgIGlmIChjYWNoZUVudHJ5ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY2FjaGVFbnRyeSA9IChDYWNoZUVudHJ5KSBub3RGb3VuZENhY2hlLmdldChuYW1lKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gSWdub3JlOiB0aGUgcmVsaWFiaWxpdHkgb2YgdGhpcyBsb29rdXAgaXMgbm90IGNyaXRpY2FsCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNhY2hlRW50cnkgIT0gbnVsbCkgeworICAgICAgICAgICAgaGl0c0NvdW50Kys7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNhY2hlRW50cnk7CisKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIGxvYWQoQ2FjaGVFbnRyeSBlbnRyeSkgeworICAgICAgICBpZiAoZW50cnkuZXhpc3RzKSB7CisgICAgICAgICAgICBpbnNlcnRDYWNoZShlbnRyeSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBub3RGb3VuZENhY2hlLnB1dChlbnRyeS5uYW1lLCBlbnRyeSk7CisgICAgICAgIH0KKyAgICAgICAgY2FjaGVTaXplICs9IGVudHJ5LnNpemU7CisgICAgfQorCisKKyAgICBwdWJsaWMgYm9vbGVhbiB1bmxvYWQoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgQ2FjaGVFbnRyeSByZW1vdmVkRW50cnkgPSByZW1vdmVDYWNoZShuYW1lKTsKKyAgICAgICAgaWYgKHJlbW92ZWRFbnRyeSAhPSBudWxsKSB7CisgICAgICAgICAgICBjYWNoZVNpemUgLT0gcmVtb3ZlZEVudHJ5LnNpemU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChub3RGb3VuZENhY2hlLnJlbW92ZShuYW1lKSAhPSBudWxsKSB7CisgICAgICAgICAgICBjYWNoZVNpemUtLTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEZpbmQgYSBtYXAgZWxlbW50IGdpdmVuIGl0cyBuYW1lIGluIGEgc29ydGVkIGFycmF5IG9mIG1hcCBlbGVtZW50cy4KKyAgICAgKiBUaGlzIHdpbGwgcmV0dXJuIHRoZSBpbmRleCBmb3IgdGhlIGNsb3Nlc3QgaW5mZXJpb3Igb3IgZXF1YWwgaXRlbSBpbiB0aGUKKyAgICAgKiBnaXZlbiBhcnJheS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgZmluZChDYWNoZUVudHJ5W10gbWFwLCBTdHJpbmcgbmFtZSkgeworCisgICAgICAgIGludCBhID0gMDsKKyAgICAgICAgaW50IGIgPSBtYXAubGVuZ3RoIC0gMTsKKworICAgICAgICAvLyBTcGVjaWFsIGNhc2VzOiAtMSBhbmQgMAorICAgICAgICBpZiAoYiA9PSAtMSkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGlmIChuYW1lLmNvbXBhcmVUbyhtYXBbMF0ubmFtZSkgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGIgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBpID0gKGIgKyBhKSAvIDI7CisgICAgICAgICAgICBpbnQgcmVzdWx0ID0gbmFtZS5jb21wYXJlVG8obWFwW2ldLm5hbWUpOworICAgICAgICAgICAgaWYgKHJlc3VsdCA+IDApIHsKKyAgICAgICAgICAgICAgICBhID0gaTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzdWx0ID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYiA9IGk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKGIgLSBhKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgaW50IHJlc3VsdDIgPSBuYW1lLmNvbXBhcmVUbyhtYXBbYl0ubmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKHJlc3VsdDIgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBhOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBJbnNlcnQgaW50byB0aGUgcmlnaHQgcGxhY2UgaW4gYSBzb3J0ZWQgTWFwRWxlbWVudCBhcnJheSwgYW5kIHByZXZlbnQKKyAgICAgKiBkdXBsaWNhdGVzLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBpbnNlcnRDYWNoZShDYWNoZUVudHJ5IG5ld0VsZW1lbnQpIHsKKyAgICAgICAgQ2FjaGVFbnRyeVtdIG9sZENhY2hlID0gY2FjaGU7CisgICAgICAgIGludCBwb3MgPSBmaW5kKG9sZENhY2hlLCBuZXdFbGVtZW50Lm5hbWUpOworICAgICAgICBpZiAoKHBvcyAhPSAtMSkgJiYgKG5ld0VsZW1lbnQubmFtZS5lcXVhbHMob2xkQ2FjaGVbcG9zXS5uYW1lKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBDYWNoZUVudHJ5W10gbmV3Q2FjaGUgPSBuZXcgQ2FjaGVFbnRyeVtjYWNoZS5sZW5ndGggKyAxXTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShvbGRDYWNoZSwgMCwgbmV3Q2FjaGUsIDAsIHBvcyArIDEpOworICAgICAgICBuZXdDYWNoZVtwb3MgKyAxXSA9IG5ld0VsZW1lbnQ7CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkKKyAgICAgICAgICAgIChvbGRDYWNoZSwgcG9zICsgMSwgbmV3Q2FjaGUsIHBvcyArIDIsIG9sZENhY2hlLmxlbmd0aCAtIHBvcyAtIDEpOworICAgICAgICBjYWNoZSA9IG5ld0NhY2hlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEluc2VydCBpbnRvIHRoZSByaWdodCBwbGFjZSBpbiBhIHNvcnRlZCBNYXBFbGVtZW50IGFycmF5LgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgQ2FjaGVFbnRyeSByZW1vdmVDYWNoZShTdHJpbmcgbmFtZSkgeworICAgICAgICBDYWNoZUVudHJ5W10gb2xkQ2FjaGUgPSBjYWNoZTsKKyAgICAgICAgaW50IHBvcyA9IGZpbmQob2xkQ2FjaGUsIG5hbWUpOworICAgICAgICBpZiAoKHBvcyAhPSAtMSkgJiYgKG5hbWUuZXF1YWxzKG9sZENhY2hlW3Bvc10ubmFtZSkpKSB7CisgICAgICAgICAgICBDYWNoZUVudHJ5W10gbmV3Q2FjaGUgPSBuZXcgQ2FjaGVFbnRyeVtjYWNoZS5sZW5ndGggLSAxXTsKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkob2xkQ2FjaGUsIDAsIG5ld0NhY2hlLCAwLCBwb3MpOworICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShvbGRDYWNoZSwgcG9zICsgMSwgbmV3Q2FjaGUsIHBvcywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZENhY2hlLmxlbmd0aCAtIHBvcyAtIDEpOworICAgICAgICAgICAgY2FjaGUgPSBuZXdDYWNoZTsKKyAgICAgICAgICAgIHJldHVybiBvbGRDYWNoZVtwb3NdOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL3Jlc291cmNlcy9XQVJEaXJDb250ZXh0LmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL3Jlc291cmNlcy9XQVJEaXJDb250ZXh0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzlmZDk1MQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvcmVzb3VyY2VzL1dBUkRpckNvbnRleHQuamF2YQpAQCAtMCwwICsxLDk1MSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLyAKKworCitwYWNrYWdlIG9yZy5hcGFjaGUubmFtaW5nLnJlc291cmNlczsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7CitpbXBvcnQgamF2YS51dGlsLnppcC5aaXBFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLnppcC5aaXBGaWxlOworCitpbXBvcnQgamF2YXgubmFtaW5nLkNvbXBvc2l0ZU5hbWU7CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWU7CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWluZ0VudW1lcmF0aW9uOworaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1pbmdFeGNlcHRpb247CitpbXBvcnQgamF2YXgubmFtaW5nLk9wZXJhdGlvbk5vdFN1cHBvcnRlZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuZGlyZWN0b3J5LkF0dHJpYnV0ZXM7CitpbXBvcnQgamF2YXgubmFtaW5nLmRpcmVjdG9yeS5EaXJDb250ZXh0OworaW1wb3J0IGphdmF4Lm5hbWluZy5kaXJlY3RvcnkuTW9kaWZpY2F0aW9uSXRlbTsKK2ltcG9ydCBqYXZheC5uYW1pbmcuZGlyZWN0b3J5LlNlYXJjaENvbnRyb2xzOworCitpbXBvcnQgb3JnLmFwYWNoZS5uYW1pbmcuTmFtaW5nQ29udGV4dEJpbmRpbmdzRW51bWVyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5uYW1pbmcuTmFtaW5nQ29udGV4dEVudW1lcmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUubmFtaW5nLk5hbWluZ0VudHJ5OworCisvKioKKyAqIFdBUiBEaXJlY3RvcnkgQ29udGV4dCBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBAYXV0aG9yIFJlbXkgTWF1Y2hlcmF0CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBXQVJEaXJDb250ZXh0IGV4dGVuZHMgQmFzZURpckNvbnRleHQgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGxvZz0KKyAgICAgICAgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeS5nZXRMb2coIFdBUkRpckNvbnRleHQuY2xhc3MgKTsKKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgLyoqCisgICAgICogQnVpbGRzIGEgV0FSIGRpcmVjdG9yeSBjb250ZXh0IHVzaW5nIHRoZSBnaXZlbiBlbnZpcm9ubWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgV0FSRGlyQ29udGV4dCgpIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEJ1aWxkcyBhIFdBUiBkaXJlY3RvcnkgY29udGV4dCB1c2luZyB0aGUgZ2l2ZW4gZW52aXJvbm1lbnQuCisgICAgICovCisgICAgcHVibGljIFdBUkRpckNvbnRleHQoSGFzaHRhYmxlIGVudikgeworICAgICAgICBzdXBlcihlbnYpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgdXNlZCBmb3IgcmV0dXJuaW5nIGZha2Ugc3ViY29udGV4dHMuCisgICAgICovCisgICAgcHJvdGVjdGVkIFdBUkRpckNvbnRleHQoWmlwRmlsZSBiYXNlLCBFbnRyeSBlbnRyaWVzKSB7CisgICAgICAgIHRoaXMuYmFzZSA9IGJhc2U7CisgICAgICAgIHRoaXMuZW50cmllcyA9IGVudHJpZXM7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIFdBUiBmaWxlLgorICAgICAqLworICAgIHByb3RlY3RlZCBaaXBGaWxlIGJhc2UgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBXQVIgZW50cmllcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRW50cnkgZW50cmllcyA9IG51bGw7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGRvY3VtZW50IHJvb3QuCisgICAgICogCisgICAgICogQHBhcmFtIGRvY0Jhc2UgVGhlIG5ldyBkb2N1bWVudCByb290CisgICAgICogCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHNwZWNpZmllZCB2YWx1ZSBpcyBub3QKKyAgICAgKiAgc3VwcG9ydGVkIGJ5IHRoaXMgaW1wbGVtZW50YXRpb24KKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGlzIHdvdWxkIGNyZWF0ZSBhCisgICAgICogIG1hbGZvcm1lZCBVUkwKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREb2NCYXNlKFN0cmluZyBkb2NCYXNlKSB7CisKKwkvLyBWYWxpZGF0ZSB0aGUgZm9ybWF0IG9mIHRoZSBwcm9wb3NlZCBkb2N1bWVudCByb290CisJaWYgKGRvY0Jhc2UgPT0gbnVsbCkKKwkgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorCQkoc20uZ2V0U3RyaW5nKCJyZXNvdXJjZXMubnVsbCIpKTsKKwlpZiAoIShkb2NCYXNlLmVuZHNXaXRoKCIud2FyIikpKQorCSAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisJCShzbS5nZXRTdHJpbmcoIndhclJlc291cmNlcy5ub3RXYXIiKSk7CisKKwkvLyBDYWxjdWxhdGUgYSBGaWxlIG9iamVjdCByZWZlcmVuY2luZyB0aGlzIGRvY3VtZW50IGJhc2UgZGlyZWN0b3J5CisJRmlsZSBiYXNlID0gbmV3IEZpbGUoZG9jQmFzZSk7CisKKwkvLyBWYWxpZGF0ZSB0aGF0IHRoZSBkb2N1bWVudCBiYXNlIGlzIGFuIGV4aXN0aW5nIGRpcmVjdG9yeQorCWlmICghYmFzZS5leGlzdHMoKSB8fCAhYmFzZS5jYW5SZWFkKCkgfHwgYmFzZS5pc0RpcmVjdG9yeSgpKQorCSAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisJCShzbS5nZXRTdHJpbmcoIndhclJlc291cmNlcy5pbnZhbGlkV2FyIiwgZG9jQmFzZSkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdGhpcy5iYXNlID0gbmV3IFppcEZpbGUoYmFzZSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKwkJKHNtLmdldFN0cmluZygid2FyUmVzb3VyY2VzLmludmFsaWRXYXIiLCBlLmdldE1lc3NhZ2UoKSkpOworICAgICAgICB9CisgICAgICAgIHN1cGVyLnNldERvY0Jhc2UoZG9jQmFzZSk7CisKKyAgICAgICAgbG9hZEVudHJpZXMoKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJlbGVhc2UgYW55IHJlc291cmNlcyBhbGxvY2F0ZWQgZm9yIHRoaXMgZGlyZWN0b3J5IGNvbnRleHQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKKworICAgICAgICBlbnRyaWVzID0gbnVsbDsKKyAgICAgICAgaWYgKGJhc2UgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBiYXNlLmNsb3NlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgbG9nLndhcm4KKyAgICAgICAgICAgICAgICAgICAgKCJFeGNlcHRpb24gY2xvc2luZyBXQVIgRmlsZSAiICsgYmFzZS5nZXROYW1lKCksIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJhc2UgPSBudWxsOworICAgICAgICBzdXBlci5yZWxlYXNlKCk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnRleHQgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIG5hbWVkIG9iamVjdC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgb2JqZWN0IHRvIGxvb2sgdXAKKyAgICAgKiBAcmV0dXJuIHRoZSBvYmplY3QgYm91bmQgdG8gbmFtZQorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgbG9va3VwKFN0cmluZyBuYW1lKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGxvb2t1cChuZXcgQ29tcG9zaXRlTmFtZShuYW1lKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIG5hbWVkIG9iamVjdC4gSWYgbmFtZSBpcyBlbXB0eSwgcmV0dXJucyBhIG5ldyBpbnN0YW5jZSAKKyAgICAgKiBvZiB0aGlzIGNvbnRleHQgKHdoaWNoIHJlcHJlc2VudHMgdGhlIHNhbWUgbmFtaW5nIGNvbnRleHQgYXMgdGhpcyAKKyAgICAgKiBjb250ZXh0LCBidXQgaXRzIGVudmlyb25tZW50IG1heSBiZSBtb2RpZmllZCBpbmRlcGVuZGVudGx5IGFuZCBpdCBtYXkgCisgICAgICogYmUgYWNjZXNzZWQgY29uY3VycmVudGx5KS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgb2JqZWN0IHRvIGxvb2sgdXAKKyAgICAgKiBAcmV0dXJuIHRoZSBvYmplY3QgYm91bmQgdG8gbmFtZQorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgbG9va3VwKE5hbWUgbmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChuYW1lLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICBFbnRyeSBlbnRyeSA9IHRyZWVMb29rdXAobmFtZSk7CisgICAgICAgIGlmIChlbnRyeSA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IE5hbWluZ0V4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInJlc291cmNlcy5ub3RGb3VuZCIsIG5hbWUpKTsKKyAgICAgICAgWmlwRW50cnkgemlwRW50cnkgPSBlbnRyeS5nZXRFbnRyeSgpOworICAgICAgICBpZiAoemlwRW50cnkuaXNEaXJlY3RvcnkoKSkKKyAgICAgICAgICAgIHJldHVybiBuZXcgV0FSRGlyQ29udGV4dChiYXNlLCBlbnRyeSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBuZXcgV0FSUmVzb3VyY2UoZW50cnkuZ2V0RW50cnkoKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBVbmJpbmRzIHRoZSBuYW1lZCBvYmplY3QuIFJlbW92ZXMgdGhlIHRlcm1pbmFsIGF0b21pYyBuYW1lIGluIG5hbWUgCisgICAgICogZnJvbSB0aGUgdGFyZ2V0IGNvbnRleHQtLXRoYXQgbmFtZWQgYnkgYWxsIGJ1dCB0aGUgdGVybWluYWwgYXRvbWljIAorICAgICAqIHBhcnQgb2YgbmFtZS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBpZGVtcG90ZW50LiBJdCBzdWNjZWVkcyBldmVuIGlmIHRoZSB0ZXJtaW5hbCBhdG9taWMgCisgICAgICogbmFtZSBpcyBub3QgYm91bmQgaW4gdGhlIHRhcmdldCBjb250ZXh0LCBidXQgdGhyb3dzIAorICAgICAqIE5hbWVOb3RGb3VuZEV4Y2VwdGlvbiBpZiBhbnkgb2YgdGhlIGludGVybWVkaWF0ZSBjb250ZXh0cyBkbyBub3QgZXhpc3QuIAorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIHRvIGJpbmQ7IG1heSBub3QgYmUgZW1wdHkKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWVOb3RGb3VuZEV4Y2VwdGlvbiBpZiBhbiBpbnRlcm1lZGlhdGUgY29udGV4dCBkb2VzIG5vdCAKKyAgICAgKiBleGlzdAorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHVuYmluZChTdHJpbmcgbmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBPcGVyYXRpb25Ob3RTdXBwb3J0ZWRFeGNlcHRpb24oKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEJpbmRzIGEgbmV3IG5hbWUgdG8gdGhlIG9iamVjdCBib3VuZCB0byBhbiBvbGQgbmFtZSwgYW5kIHVuYmluZHMgdGhlIAorICAgICAqIG9sZCBuYW1lLiBCb3RoIG5hbWVzIGFyZSByZWxhdGl2ZSB0byB0aGlzIGNvbnRleHQuIEFueSBhdHRyaWJ1dGVzIAorICAgICAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgb2xkIG5hbWUgYmVjb21lIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmV3IG5hbWUuIAorICAgICAqIEludGVybWVkaWF0ZSBjb250ZXh0cyBvZiB0aGUgb2xkIG5hbWUgYXJlIG5vdCBjaGFuZ2VkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBvbGROYW1lIHRoZSBuYW1lIG9mIHRoZSBleGlzdGluZyBiaW5kaW5nOyBtYXkgbm90IGJlIGVtcHR5CisgICAgICogQHBhcmFtIG5ld05hbWUgdGhlIG5hbWUgb2YgdGhlIG5ldyBiaW5kaW5nOyBtYXkgbm90IGJlIGVtcHR5CisgICAgICogQGV4Y2VwdGlvbiBOYW1lQWxyZWFkeUJvdW5kRXhjZXB0aW9uIGlmIG5ld05hbWUgaXMgYWxyZWFkeSBib3VuZAorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbmFtZShTdHJpbmcgb2xkTmFtZSwgU3RyaW5nIG5ld05hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgT3BlcmF0aW9uTm90U3VwcG9ydGVkRXhjZXB0aW9uKCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBFbnVtZXJhdGVzIHRoZSBuYW1lcyBib3VuZCBpbiB0aGUgbmFtZWQgY29udGV4dCwgYWxvbmcgd2l0aCB0aGUgY2xhc3MgCisgICAgICogbmFtZXMgb2Ygb2JqZWN0cyBib3VuZCB0byB0aGVtLiBUaGUgY29udGVudHMgb2YgYW55IHN1YmNvbnRleHRzIGFyZSAKKyAgICAgKiBub3QgaW5jbHVkZWQuCisgICAgICogPHA+CisgICAgICogSWYgYSBiaW5kaW5nIGlzIGFkZGVkIHRvIG9yIHJlbW92ZWQgZnJvbSB0aGlzIGNvbnRleHQsIGl0cyBlZmZlY3Qgb24gCisgICAgICogYW4gZW51bWVyYXRpb24gcHJldmlvdXNseSByZXR1cm5lZCBpcyB1bmRlZmluZWQuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbnRleHQgdG8gbGlzdAorICAgICAqIEByZXR1cm4gYW4gZW51bWVyYXRpb24gb2YgdGhlIG5hbWVzIGFuZCBjbGFzcyBuYW1lcyBvZiB0aGUgYmluZGluZ3MgaW4gCisgICAgICogdGhpcyBjb250ZXh0LiBFYWNoIGVsZW1lbnQgb2YgdGhlIGVudW1lcmF0aW9uIGlzIG9mIHR5cGUgTmFtZUNsYXNzUGFpci4KKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgTmFtaW5nRW51bWVyYXRpb24gbGlzdChTdHJpbmcgbmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBsaXN0KG5ldyBDb21wb3NpdGVOYW1lKG5hbWUpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEVudW1lcmF0ZXMgdGhlIG5hbWVzIGJvdW5kIGluIHRoZSBuYW1lZCBjb250ZXh0LCBhbG9uZyB3aXRoIHRoZSBjbGFzcyAKKyAgICAgKiBuYW1lcyBvZiBvYmplY3RzIGJvdW5kIHRvIHRoZW0uIFRoZSBjb250ZW50cyBvZiBhbnkgc3ViY29udGV4dHMgYXJlIAorICAgICAqIG5vdCBpbmNsdWRlZC4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiBhIGJpbmRpbmcgaXMgYWRkZWQgdG8gb3IgcmVtb3ZlZCBmcm9tIHRoaXMgY29udGV4dCwgaXRzIGVmZmVjdCBvbiAKKyAgICAgKiBhbiBlbnVtZXJhdGlvbiBwcmV2aW91c2x5IHJldHVybmVkIGlzIHVuZGVmaW5lZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgY29udGV4dCB0byBsaXN0CisgICAgICogQHJldHVybiBhbiBlbnVtZXJhdGlvbiBvZiB0aGUgbmFtZXMgYW5kIGNsYXNzIG5hbWVzIG9mIHRoZSBiaW5kaW5ncyBpbiAKKyAgICAgKiB0aGlzIGNvbnRleHQuIEVhY2ggZWxlbWVudCBvZiB0aGUgZW51bWVyYXRpb24gaXMgb2YgdHlwZSBOYW1lQ2xhc3NQYWlyLgorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBOYW1pbmdFbnVtZXJhdGlvbiBsaXN0KE5hbWUgbmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChuYW1lLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVybiBuZXcgTmFtaW5nQ29udGV4dEVudW1lcmF0aW9uKGxpc3QoZW50cmllcykuaXRlcmF0b3IoKSk7CisgICAgICAgIEVudHJ5IGVudHJ5ID0gdHJlZUxvb2t1cChuYW1lKTsKKyAgICAgICAgaWYgKGVudHJ5ID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgTmFtaW5nRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygicmVzb3VyY2VzLm5vdEZvdW5kIiwgbmFtZSkpOworICAgICAgICByZXR1cm4gbmV3IE5hbWluZ0NvbnRleHRFbnVtZXJhdGlvbihsaXN0KGVudHJ5KS5pdGVyYXRvcigpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEVudW1lcmF0ZXMgdGhlIG5hbWVzIGJvdW5kIGluIHRoZSBuYW1lZCBjb250ZXh0LCBhbG9uZyB3aXRoIHRoZSAKKyAgICAgKiBvYmplY3RzIGJvdW5kIHRvIHRoZW0uIFRoZSBjb250ZW50cyBvZiBhbnkgc3ViY29udGV4dHMgYXJlIG5vdCAKKyAgICAgKiBpbmNsdWRlZC4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiBhIGJpbmRpbmcgaXMgYWRkZWQgdG8gb3IgcmVtb3ZlZCBmcm9tIHRoaXMgY29udGV4dCwgaXRzIGVmZmVjdCBvbiAKKyAgICAgKiBhbiBlbnVtZXJhdGlvbiBwcmV2aW91c2x5IHJldHVybmVkIGlzIHVuZGVmaW5lZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgY29udGV4dCB0byBsaXN0CisgICAgICogQHJldHVybiBhbiBlbnVtZXJhdGlvbiBvZiB0aGUgYmluZGluZ3MgaW4gdGhpcyBjb250ZXh0LiAKKyAgICAgKiBFYWNoIGVsZW1lbnQgb2YgdGhlIGVudW1lcmF0aW9uIGlzIG9mIHR5cGUgQmluZGluZy4KKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgTmFtaW5nRW51bWVyYXRpb24gbGlzdEJpbmRpbmdzKFN0cmluZyBuYW1lKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGxpc3RCaW5kaW5ncyhuZXcgQ29tcG9zaXRlTmFtZShuYW1lKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBFbnVtZXJhdGVzIHRoZSBuYW1lcyBib3VuZCBpbiB0aGUgbmFtZWQgY29udGV4dCwgYWxvbmcgd2l0aCB0aGUgCisgICAgICogb2JqZWN0cyBib3VuZCB0byB0aGVtLiBUaGUgY29udGVudHMgb2YgYW55IHN1YmNvbnRleHRzIGFyZSBub3QgCisgICAgICogaW5jbHVkZWQuCisgICAgICogPHA+CisgICAgICogSWYgYSBiaW5kaW5nIGlzIGFkZGVkIHRvIG9yIHJlbW92ZWQgZnJvbSB0aGlzIGNvbnRleHQsIGl0cyBlZmZlY3Qgb24gCisgICAgICogYW4gZW51bWVyYXRpb24gcHJldmlvdXNseSByZXR1cm5lZCBpcyB1bmRlZmluZWQuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbnRleHQgdG8gbGlzdAorICAgICAqIEByZXR1cm4gYW4gZW51bWVyYXRpb24gb2YgdGhlIGJpbmRpbmdzIGluIHRoaXMgY29udGV4dC4gCisgICAgICogRWFjaCBlbGVtZW50IG9mIHRoZSBlbnVtZXJhdGlvbiBpcyBvZiB0eXBlIEJpbmRpbmcuCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIE5hbWluZ0VudW1lcmF0aW9uIGxpc3RCaW5kaW5ncyhOYW1lIG5hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICBpZiAobmFtZS5pc0VtcHR5KCkpCisgICAgICAgICAgICByZXR1cm4gbmV3IE5hbWluZ0NvbnRleHRCaW5kaW5nc0VudW1lcmF0aW9uKGxpc3QoZW50cmllcykuaXRlcmF0b3IoKSk7CisgICAgICAgIEVudHJ5IGVudHJ5ID0gdHJlZUxvb2t1cChuYW1lKTsKKyAgICAgICAgaWYgKGVudHJ5ID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgTmFtaW5nRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygicmVzb3VyY2VzLm5vdEZvdW5kIiwgbmFtZSkpOworICAgICAgICByZXR1cm4gbmV3IE5hbWluZ0NvbnRleHRCaW5kaW5nc0VudW1lcmF0aW9uKGxpc3QoZW50cnkpLml0ZXJhdG9yKCkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogRGVzdHJveXMgdGhlIG5hbWVkIGNvbnRleHQgYW5kIHJlbW92ZXMgaXQgZnJvbSB0aGUgbmFtZXNwYWNlLiBBbnkgCisgICAgICogYXR0cmlidXRlcyBhc3NvY2lhdGVkIHdpdGggdGhlIG5hbWUgYXJlIGFsc28gcmVtb3ZlZC4gSW50ZXJtZWRpYXRlIAorICAgICAqIGNvbnRleHRzIGFyZSBub3QgZGVzdHJveWVkLgorICAgICAqIDxwPgorICAgICAqIFRoaXMgbWV0aG9kIGlzIGlkZW1wb3RlbnQuIEl0IHN1Y2NlZWRzIGV2ZW4gaWYgdGhlIHRlcm1pbmFsIGF0b21pYyAKKyAgICAgKiBuYW1lIGlzIG5vdCBib3VuZCBpbiB0aGUgdGFyZ2V0IGNvbnRleHQsIGJ1dCB0aHJvd3MgCisgICAgICogTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGlmIGFueSBvZiB0aGUgaW50ZXJtZWRpYXRlIGNvbnRleHRzIGRvIG5vdCBleGlzdC4gCisgICAgICogCisgICAgICogSW4gYSBmZWRlcmF0ZWQgbmFtaW5nIHN5c3RlbSwgYSBjb250ZXh0IGZyb20gb25lIG5hbWluZyBzeXN0ZW0gbWF5IGJlIAorICAgICAqIGJvdW5kIHRvIGEgbmFtZSBpbiBhbm90aGVyLiBPbmUgY2FuIHN1YnNlcXVlbnRseSBsb29rIHVwIGFuZCBwZXJmb3JtIAorICAgICAqIG9wZXJhdGlvbnMgb24gdGhlIGZvcmVpZ24gY29udGV4dCB1c2luZyBhIGNvbXBvc2l0ZSBuYW1lLiBIb3dldmVyLCBhbiAKKyAgICAgKiBhdHRlbXB0IGRlc3Ryb3kgdGhlIGNvbnRleHQgdXNpbmcgdGhpcyBjb21wb3NpdGUgbmFtZSB3aWxsIGZhaWwgd2l0aCAKKyAgICAgKiBOb3RDb250ZXh0RXhjZXB0aW9uLCBiZWNhdXNlIHRoZSBmb3JlaWduIGNvbnRleHQgaXMgbm90IGEgInN1YmNvbnRleHQiIAorICAgICAqIG9mIHRoZSBjb250ZXh0IGluIHdoaWNoIGl0IGlzIGJvdW5kLiBJbnN0ZWFkLCB1c2UgdW5iaW5kKCkgdG8gcmVtb3ZlIAorICAgICAqIHRoZSBiaW5kaW5nIG9mIHRoZSBmb3JlaWduIGNvbnRleHQuIERlc3Ryb3lpbmcgdGhlIGZvcmVpZ24gY29udGV4dCAKKyAgICAgKiByZXF1aXJlcyB0aGF0IHRoZSBkZXN0cm95U3ViY29udGV4dCgpIGJlIHBlcmZvcm1lZCBvbiBhIGNvbnRleHQgZnJvbSAKKyAgICAgKiB0aGUgZm9yZWlnbiBjb250ZXh0J3MgIm5hdGl2ZSIgbmFtaW5nIHN5c3RlbS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgY29udGV4dCB0byBiZSBkZXN0cm95ZWQ7IG1heSBub3QgYmUgZW1wdHkKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWVOb3RGb3VuZEV4Y2VwdGlvbiBpZiBhbiBpbnRlcm1lZGlhdGUgY29udGV4dCBkb2VzIG5vdCAKKyAgICAgKiBleGlzdAorICAgICAqIEBleGNlcHRpb24gTm90Q29udGV4dEV4Y2VwdGlvbiBpZiB0aGUgbmFtZSBpcyBib3VuZCBidXQgZG9lcyBub3QgbmFtZSAKKyAgICAgKiBhIGNvbnRleHQsIG9yIGRvZXMgbm90IG5hbWUgYSBjb250ZXh0IG9mIHRoZSBhcHByb3ByaWF0ZSB0eXBlCisgICAgICovCisgICAgcHVibGljIHZvaWQgZGVzdHJveVN1YmNvbnRleHQoU3RyaW5nIG5hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgT3BlcmF0aW9uTm90U3VwcG9ydGVkRXhjZXB0aW9uKCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIG5hbWVkIG9iamVjdCwgZm9sbG93aW5nIGxpbmtzIGV4Y2VwdCBmb3IgdGhlIHRlcm1pbmFsIAorICAgICAqIGF0b21pYyBjb21wb25lbnQgb2YgdGhlIG5hbWUuIElmIHRoZSBvYmplY3QgYm91bmQgdG8gbmFtZSBpcyBub3QgYSAKKyAgICAgKiBsaW5rLCByZXR1cm5zIHRoZSBvYmplY3QgaXRzZWxmLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBvYmplY3QgdG8gbG9vayB1cAorICAgICAqIEByZXR1cm4gdGhlIG9iamVjdCBib3VuZCB0byBuYW1lLCBub3QgZm9sbG93aW5nIHRoZSB0ZXJtaW5hbCBsaW5rIAorICAgICAqIChpZiBhbnkpLgorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgbG9va3VwTGluayhTdHJpbmcgbmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIE5vdGUgOiBMaW5rcyBhcmUgbm90IHN1cHBvcnRlZAorICAgICAgICByZXR1cm4gbG9va3VwKG5hbWUpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSBmdWxsIG5hbWUgb2YgdGhpcyBjb250ZXh0IHdpdGhpbiBpdHMgb3duIG5hbWVzcGFjZS4KKyAgICAgKiA8cD4KKyAgICAgKiBNYW55IG5hbWluZyBzZXJ2aWNlcyBoYXZlIGEgbm90aW9uIG9mIGEgImZ1bGwgbmFtZSIgZm9yIG9iamVjdHMgaW4gCisgICAgICogdGhlaXIgcmVzcGVjdGl2ZSBuYW1lc3BhY2VzLiBGb3IgZXhhbXBsZSwgYW4gTERBUCBlbnRyeSBoYXMgYSAKKyAgICAgKiBkaXN0aW5ndWlzaGVkIG5hbWUsIGFuZCBhIEROUyByZWNvcmQgaGFzIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUuIFRoaXMgCisgICAgICogbWV0aG9kIGFsbG93cyB0aGUgY2xpZW50IGFwcGxpY2F0aW9uIHRvIHJldHJpZXZlIHRoaXMgbmFtZS4gVGhlIHN0cmluZyAKKyAgICAgKiByZXR1cm5lZCBieSB0aGlzIG1ldGhvZCBpcyBub3QgYSBKTkRJIGNvbXBvc2l0ZSBuYW1lIGFuZCBzaG91bGQgbm90IGJlIAorICAgICAqIHBhc3NlZCBkaXJlY3RseSB0byBjb250ZXh0IG1ldGhvZHMuIEluIG5hbWluZyBzeXN0ZW1zIGZvciB3aGljaCB0aGUgCisgICAgICogbm90aW9uIG9mIGZ1bGwgbmFtZSBkb2VzIG5vdCBtYWtlIHNlbnNlLCAKKyAgICAgKiBPcGVyYXRpb25Ob3RTdXBwb3J0ZWRFeGNlcHRpb24gaXMgdGhyb3duLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhpcyBjb250ZXh0J3MgbmFtZSBpbiBpdHMgb3duIG5hbWVzcGFjZTsgbmV2ZXIgbnVsbAorICAgICAqIEBleGNlcHRpb24gT3BlcmF0aW9uTm90U3VwcG9ydGVkRXhjZXB0aW9uIGlmIHRoZSBuYW1pbmcgc3lzdGVtIGRvZXMgCisgICAgICogbm90IGhhdmUgdGhlIG5vdGlvbiBvZiBhIGZ1bGwgbmFtZQorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZUluTmFtZXNwYWNlKCkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBkb2NCYXNlOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRGlyQ29udGV4dCBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyBzZWxlY3RlZCBhdHRyaWJ1dGVzIGFzc29jaWF0ZWQgd2l0aCBhIG5hbWVkIG9iamVjdC4gCisgICAgICogU2VlIHRoZSBjbGFzcyBkZXNjcmlwdGlvbiByZWdhcmRpbmcgYXR0cmlidXRlIG1vZGVscywgYXR0cmlidXRlIHR5cGUgCisgICAgICogbmFtZXMsIGFuZCBvcGVyYXRpb25hbCBhdHRyaWJ1dGVzLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHJlcXVlc3RlZCBhdHRyaWJ1dGVzOyBuZXZlciBudWxsCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIG9iamVjdCBmcm9tIHdoaWNoIHRvIHJldHJpZXZlIGF0dHJpYnV0ZXMKKyAgICAgKiBAcGFyYW0gYXR0cklkcyB0aGUgaWRlbnRpZmllcnMgb2YgdGhlIGF0dHJpYnV0ZXMgdG8gcmV0cmlldmUuIG51bGwgCisgICAgICogaW5kaWNhdGVzIHRoYXQgYWxsIGF0dHJpYnV0ZXMgc2hvdWxkIGJlIHJldHJpZXZlZDsgYW4gZW1wdHkgYXJyYXkgCisgICAgICogaW5kaWNhdGVzIHRoYXQgbm9uZSBzaG91bGQgYmUgcmV0cmlldmVkCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIEF0dHJpYnV0ZXMgZ2V0QXR0cmlidXRlcyhTdHJpbmcgbmFtZSwgU3RyaW5nW10gYXR0cklkcykKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBnZXRBdHRyaWJ1dGVzKG5ldyBDb21wb3NpdGVOYW1lKG5hbWUpLCBhdHRySWRzKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyBhbGwgb2YgdGhlIGF0dHJpYnV0ZXMgYXNzb2NpYXRlZCB3aXRoIGEgbmFtZWQgb2JqZWN0LiAKKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBzZXQgb2YgYXR0cmlidXRlcyBhc3NvY2lhdGVkIHdpdGggbmFtZS4gCisgICAgICogUmV0dXJucyBhbiBlbXB0eSBhdHRyaWJ1dGUgc2V0IGlmIG5hbWUgaGFzIG5vIGF0dHJpYnV0ZXM7IG5ldmVyIG51bGwuCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIG9iamVjdCBmcm9tIHdoaWNoIHRvIHJldHJpZXZlIGF0dHJpYnV0ZXMKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgQXR0cmlidXRlcyBnZXRBdHRyaWJ1dGVzKE5hbWUgbmFtZSwgU3RyaW5nW10gYXR0cklkcykKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIAorICAgICAgICBFbnRyeSBlbnRyeSA9IG51bGw7CisgICAgICAgIGlmIChuYW1lLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIGVudHJ5ID0gZW50cmllczsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZW50cnkgPSB0cmVlTG9va3VwKG5hbWUpOworICAgICAgICBpZiAoZW50cnkgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBOYW1pbmdFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJyZXNvdXJjZXMubm90Rm91bmQiLCBuYW1lKSk7CisgICAgICAgIAorICAgICAgICBaaXBFbnRyeSB6aXBFbnRyeSA9IGVudHJ5LmdldEVudHJ5KCk7CisKKyAgICAgICAgUmVzb3VyY2VBdHRyaWJ1dGVzIGF0dHJzID0gbmV3IFJlc291cmNlQXR0cmlidXRlcygpOworICAgICAgICBhdHRycy5zZXRDcmVhdGlvbkRhdGUobmV3IERhdGUoemlwRW50cnkuZ2V0VGltZSgpKSk7CisgICAgICAgIGF0dHJzLnNldE5hbWUoZW50cnkuZ2V0TmFtZSgpKTsKKyAgICAgICAgaWYgKCF6aXBFbnRyeS5pc0RpcmVjdG9yeSgpKQorICAgICAgICAgICAgYXR0cnMuc2V0UmVzb3VyY2VUeXBlKCIiKTsKKyAgICAgICAgYXR0cnMuc2V0Q29udGVudExlbmd0aCh6aXBFbnRyeS5nZXRTaXplKCkpOworICAgICAgICBhdHRycy5zZXRMYXN0TW9kaWZpZWQoemlwRW50cnkuZ2V0VGltZSgpKTsKKyAgICAgICAgCisgICAgICAgIHJldHVybiBhdHRyczsKKyAgICAgICAgCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBNb2RpZmllcyB0aGUgYXR0cmlidXRlcyBhc3NvY2lhdGVkIHdpdGggYSBuYW1lZCBvYmplY3QuIFRoZSBvcmRlciBvZiAKKyAgICAgKiB0aGUgbW9kaWZpY2F0aW9ucyBpcyBub3Qgc3BlY2lmaWVkLiBXaGVyZSBwb3NzaWJsZSwgdGhlIG1vZGlmaWNhdGlvbnMgCisgICAgICogYXJlIHBlcmZvcm1lZCBhdG9taWNhbGx5LgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBvYmplY3Qgd2hvc2UgYXR0cmlidXRlcyB3aWxsIGJlIHVwZGF0ZWQKKyAgICAgKiBAcGFyYW0gbW9kX29wIHRoZSBtb2RpZmljYXRpb24gb3BlcmF0aW9uLCBvbmUgb2Y6IEFERF9BVFRSSUJVVEUsIAorICAgICAqIFJFUExBQ0VfQVRUUklCVVRFLCBSRU1PVkVfQVRUUklCVVRFCisgICAgICogQHBhcmFtIGF0dHJzIHRoZSBhdHRyaWJ1dGVzIHRvIGJlIHVzZWQgZm9yIHRoZSBtb2RpZmljYXRpb247IG1heSBub3QgCisgICAgICogYmUgbnVsbAorICAgICAqIEBleGNlcHRpb24gQXR0cmlidXRlTW9kaWZpY2F0aW9uRXhjZXB0aW9uIGlmIHRoZSBtb2RpZmljYXRpb24gY2Fubm90IGJlCisgICAgICogY29tcGxldGVkIHN1Y2Nlc3NmdWxseQorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG1vZGlmeUF0dHJpYnV0ZXMoU3RyaW5nIG5hbWUsIGludCBtb2Rfb3AsIEF0dHJpYnV0ZXMgYXR0cnMpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgT3BlcmF0aW9uTm90U3VwcG9ydGVkRXhjZXB0aW9uKCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBNb2RpZmllcyB0aGUgYXR0cmlidXRlcyBhc3NvY2lhdGVkIHdpdGggYSBuYW1lZCBvYmplY3QgdXNpbmcgYW4gYW4gCisgICAgICogb3JkZXJlZCBsaXN0IG9mIG1vZGlmaWNhdGlvbnMuIFRoZSBtb2RpZmljYXRpb25zIGFyZSBwZXJmb3JtZWQgaW4gdGhlIAorICAgICAqIG9yZGVyIHNwZWNpZmllZC4gRWFjaCBtb2RpZmljYXRpb24gc3BlY2lmaWVzIGEgbW9kaWZpY2F0aW9uIG9wZXJhdGlvbiAKKyAgICAgKiBjb2RlIGFuZCBhbiBhdHRyaWJ1dGUgb24gd2hpY2ggdG8gb3BlcmF0ZS4gV2hlcmUgcG9zc2libGUsIHRoZSAKKyAgICAgKiBtb2RpZmljYXRpb25zIGFyZSBwZXJmb3JtZWQgYXRvbWljYWxseS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgb2JqZWN0IHdob3NlIGF0dHJpYnV0ZXMgd2lsbCBiZSB1cGRhdGVkCisgICAgICogQHBhcmFtIG1vZHMgYW4gb3JkZXJlZCBzZXF1ZW5jZSBvZiBtb2RpZmljYXRpb25zIHRvIGJlIHBlcmZvcm1lZDsgbWF5IAorICAgICAqIG5vdCBiZSBudWxsCisgICAgICogQGV4Y2VwdGlvbiBBdHRyaWJ1dGVNb2RpZmljYXRpb25FeGNlcHRpb24gaWYgdGhlIG1vZGlmaWNhdGlvbiBjYW5ub3QgYmUKKyAgICAgKiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5CisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgbW9kaWZ5QXR0cmlidXRlcyhTdHJpbmcgbmFtZSwgTW9kaWZpY2F0aW9uSXRlbVtdIG1vZHMpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgT3BlcmF0aW9uTm90U3VwcG9ydGVkRXhjZXB0aW9uKCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBCaW5kcyBhIG5hbWUgdG8gYW4gb2JqZWN0LCBhbG9uZyB3aXRoIGFzc29jaWF0ZWQgYXR0cmlidXRlcy4gSWYgYXR0cnMgCisgICAgICogaXMgbnVsbCwgdGhlIHJlc3VsdGluZyBiaW5kaW5nIHdpbGwgaGF2ZSB0aGUgYXR0cmlidXRlcyBhc3NvY2lhdGVkIAorICAgICAqIHdpdGggb2JqIGlmIG9iaiBpcyBhIERpckNvbnRleHQsIGFuZCBubyBhdHRyaWJ1dGVzIG90aGVyd2lzZS4gSWYgYXR0cnMgCisgICAgICogaXMgbm9uLW51bGwsIHRoZSByZXN1bHRpbmcgYmluZGluZyB3aWxsIGhhdmUgYXR0cnMgYXMgaXRzIGF0dHJpYnV0ZXM7IAorICAgICAqIGFueSBhdHRyaWJ1dGVzIGFzc29jaWF0ZWQgd2l0aCBvYmogYXJlIGlnbm9yZWQuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgdG8gYmluZDsgbWF5IG5vdCBiZSBlbXB0eQorICAgICAqIEBwYXJhbSBvYmogdGhlIG9iamVjdCB0byBiaW5kOyBwb3NzaWJseSBudWxsCisgICAgICogQHBhcmFtIGF0dHJzIHRoZSBhdHRyaWJ1dGVzIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBiaW5kaW5nCisgICAgICogQGV4Y2VwdGlvbiBOYW1lQWxyZWFkeUJvdW5kRXhjZXB0aW9uIGlmIG5hbWUgaXMgYWxyZWFkeSBib3VuZAorICAgICAqIEBleGNlcHRpb24gSW52YWxpZEF0dHJpYnV0ZXNFeGNlcHRpb24gaWYgc29tZSAibWFuZGF0b3J5IiBhdHRyaWJ1dGVzIAorICAgICAqIG9mIHRoZSBiaW5kaW5nIGFyZSBub3Qgc3VwcGxpZWQKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBiaW5kKFN0cmluZyBuYW1lLCBPYmplY3Qgb2JqLCBBdHRyaWJ1dGVzIGF0dHJzKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IE9wZXJhdGlvbk5vdFN1cHBvcnRlZEV4Y2VwdGlvbigpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQmluZHMgYSBuYW1lIHRvIGFuIG9iamVjdCwgYWxvbmcgd2l0aCBhc3NvY2lhdGVkIGF0dHJpYnV0ZXMsIAorICAgICAqIG92ZXJ3cml0aW5nIGFueSBleGlzdGluZyBiaW5kaW5nLiBJZiBhdHRycyBpcyBudWxsIGFuZCBvYmogaXMgYSAKKyAgICAgKiBEaXJDb250ZXh0LCB0aGUgYXR0cmlidXRlcyBmcm9tIG9iaiBhcmUgdXNlZC4gSWYgYXR0cnMgaXMgbnVsbCBhbmQgb2JqIAorICAgICAqIGlzIG5vdCBhIERpckNvbnRleHQsIGFueSBleGlzdGluZyBhdHRyaWJ1dGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgb2JqZWN0CisgICAgICogYWxyZWFkeSBib3VuZCBpbiB0aGUgZGlyZWN0b3J5IHJlbWFpbiB1bmNoYW5nZWQuIElmIGF0dHJzIGlzIG5vbi1udWxsLCAKKyAgICAgKiBhbnkgZXhpc3RpbmcgYXR0cmlidXRlcyBhc3NvY2lhdGVkIHdpdGggdGhlIG9iamVjdCBhbHJlYWR5IGJvdW5kIGluIAorICAgICAqIHRoZSBkaXJlY3RvcnkgYXJlIHJlbW92ZWQgYW5kIGF0dHJzIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmFtZWQgCisgICAgICogb2JqZWN0LiBJZiBvYmogaXMgYSBEaXJDb250ZXh0IGFuZCBhdHRycyBpcyBub24tbnVsbCwgdGhlIGF0dHJpYnV0ZXMgCisgICAgICogb2Ygb2JqIGFyZSBpZ25vcmVkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIHRvIGJpbmQ7IG1heSBub3QgYmUgZW1wdHkKKyAgICAgKiBAcGFyYW0gb2JqIHRoZSBvYmplY3QgdG8gYmluZDsgcG9zc2libHkgbnVsbAorICAgICAqIEBwYXJhbSBhdHRycyB0aGUgYXR0cmlidXRlcyB0byBhc3NvY2lhdGUgd2l0aCB0aGUgYmluZGluZworICAgICAqIEBleGNlcHRpb24gSW52YWxpZEF0dHJpYnV0ZXNFeGNlcHRpb24gaWYgc29tZSAibWFuZGF0b3J5IiBhdHRyaWJ1dGVzIAorICAgICAqIG9mIHRoZSBiaW5kaW5nIGFyZSBub3Qgc3VwcGxpZWQKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWJpbmQoU3RyaW5nIG5hbWUsIE9iamVjdCBvYmosIEF0dHJpYnV0ZXMgYXR0cnMpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgT3BlcmF0aW9uTm90U3VwcG9ydGVkRXhjZXB0aW9uKCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFuZCBiaW5kcyBhIG5ldyBjb250ZXh0LCBhbG9uZyB3aXRoIGFzc29jaWF0ZWQgYXR0cmlidXRlcy4gCisgICAgICogVGhpcyBtZXRob2QgY3JlYXRlcyBhIG5ldyBzdWJjb250ZXh0IHdpdGggdGhlIGdpdmVuIG5hbWUsIGJpbmRzIGl0IGluIAorICAgICAqIHRoZSB0YXJnZXQgY29udGV4dCAodGhhdCBuYW1lZCBieSBhbGwgYnV0IHRlcm1pbmFsIGF0b21pYyBjb21wb25lbnQgb2YgCisgICAgICogdGhlIG5hbWUpLCBhbmQgYXNzb2NpYXRlcyB0aGUgc3VwcGxpZWQgYXR0cmlidXRlcyB3aXRoIHRoZSBuZXdseSAKKyAgICAgKiBjcmVhdGVkIG9iamVjdC4gQWxsIGludGVybWVkaWF0ZSBhbmQgdGFyZ2V0IGNvbnRleHRzIG11c3QgYWxyZWFkeSAKKyAgICAgKiBleGlzdC4gSWYgYXR0cnMgaXMgbnVsbCwgdGhpcyBtZXRob2QgaXMgZXF1aXZhbGVudCB0byAKKyAgICAgKiBDb250ZXh0LmNyZWF0ZVN1YmNvbnRleHQoKS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgY29udGV4dCB0byBjcmVhdGU7IG1heSBub3QgYmUgZW1wdHkKKyAgICAgKiBAcGFyYW0gYXR0cnMgdGhlIGF0dHJpYnV0ZXMgdG8gYXNzb2NpYXRlIHdpdGggdGhlIG5ld2x5IGNyZWF0ZWQgY29udGV4dAorICAgICAqIEByZXR1cm4gdGhlIG5ld2x5IGNyZWF0ZWQgY29udGV4dAorICAgICAqIEBleGNlcHRpb24gTmFtZUFscmVhZHlCb3VuZEV4Y2VwdGlvbiBpZiB0aGUgbmFtZSBpcyBhbHJlYWR5IGJvdW5kCisgICAgICogQGV4Y2VwdGlvbiBJbnZhbGlkQXR0cmlidXRlc0V4Y2VwdGlvbiBpZiBhdHRycyBkb2VzIG5vdCBjb250YWluIGFsbCAKKyAgICAgKiB0aGUgbWFuZGF0b3J5IGF0dHJpYnV0ZXMgcmVxdWlyZWQgZm9yIGNyZWF0aW9uCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIERpckNvbnRleHQgY3JlYXRlU3ViY29udGV4dChTdHJpbmcgbmFtZSwgQXR0cmlidXRlcyBhdHRycykKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBPcGVyYXRpb25Ob3RTdXBwb3J0ZWRFeGNlcHRpb24oKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgc2NoZW1hIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmFtZWQgb2JqZWN0LiBUaGUgc2NoZW1hIAorICAgICAqIGRlc2NyaWJlcyBydWxlcyByZWdhcmRpbmcgdGhlIHN0cnVjdHVyZSBvZiB0aGUgbmFtZXNwYWNlIGFuZCB0aGUgCisgICAgICogYXR0cmlidXRlcyBzdG9yZWQgd2l0aGluIGl0LiBUaGUgc2NoZW1hIHNwZWNpZmllcyB3aGF0IHR5cGVzIG9mIAorICAgICAqIG9iamVjdHMgY2FuIGJlIGFkZGVkIHRvIHRoZSBkaXJlY3RvcnkgYW5kIHdoZXJlIHRoZXkgY2FuIGJlIGFkZGVkOyAKKyAgICAgKiB3aGF0IG1hbmRhdG9yeSBhbmQgb3B0aW9uYWwgYXR0cmlidXRlcyBhbiBvYmplY3QgY2FuIGhhdmUuIFRoZSByYW5nZSAKKyAgICAgKiBvZiBzdXBwb3J0IGZvciBzY2hlbWFzIGlzIGRpcmVjdG9yeS1zcGVjaWZpYy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgb2JqZWN0IHdob3NlIHNjaGVtYSBpcyB0byBiZSByZXRyaWV2ZWQKKyAgICAgKiBAcmV0dXJuIHRoZSBzY2hlbWEgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb250ZXh0OyBuZXZlciBudWxsCisgICAgICogQGV4Y2VwdGlvbiBPcGVyYXRpb25Ob3RTdXBwb3J0ZWRFeGNlcHRpb24gaWYgc2NoZW1hIG5vdCBzdXBwb3J0ZWQKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgRGlyQ29udGV4dCBnZXRTY2hlbWEoU3RyaW5nIG5hbWUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgT3BlcmF0aW9uTm90U3VwcG9ydGVkRXhjZXB0aW9uKCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgYSBjb250ZXh0IGNvbnRhaW5pbmcgdGhlIHNjaGVtYSBvYmplY3RzIG9mIHRoZSBuYW1lZCAKKyAgICAgKiBvYmplY3QncyBjbGFzcyBkZWZpbml0aW9ucy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgb2JqZWN0IHdob3NlIG9iamVjdCBjbGFzcyBkZWZpbml0aW9uIGlzIHRvIAorICAgICAqIGJlIHJldHJpZXZlZAorICAgICAqIEByZXR1cm4gdGhlIERpckNvbnRleHQgY29udGFpbmluZyB0aGUgbmFtZWQgb2JqZWN0J3MgY2xhc3MgCisgICAgICogZGVmaW5pdGlvbnM7IG5ldmVyIG51bGwKKyAgICAgKiBAZXhjZXB0aW9uIE9wZXJhdGlvbk5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBpZiBzY2hlbWEgbm90IHN1cHBvcnRlZAorICAgICAqIEBleGNlcHRpb24gTmFtaW5nRXhjZXB0aW9uIGlmIGEgbmFtaW5nIGV4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBEaXJDb250ZXh0IGdldFNjaGVtYUNsYXNzRGVmaW5pdGlvbihTdHJpbmcgbmFtZSkKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBPcGVyYXRpb25Ob3RTdXBwb3J0ZWRFeGNlcHRpb24oKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNlYXJjaGVzIGluIGEgc2luZ2xlIGNvbnRleHQgZm9yIG9iamVjdHMgdGhhdCBjb250YWluIGEgc3BlY2lmaWVkIHNldCAKKyAgICAgKiBvZiBhdHRyaWJ1dGVzLCBhbmQgcmV0cmlldmVzIHNlbGVjdGVkIGF0dHJpYnV0ZXMuIFRoZSBzZWFyY2ggaXMgCisgICAgICogcGVyZm9ybWVkIHVzaW5nIHRoZSBkZWZhdWx0IFNlYXJjaENvbnRyb2xzIHNldHRpbmdzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBjb250ZXh0IHRvIHNlYXJjaAorICAgICAqIEBwYXJhbSBtYXRjaGluZ0F0dHJpYnV0ZXMgdGhlIGF0dHJpYnV0ZXMgdG8gc2VhcmNoIGZvci4gSWYgZW1wdHkgb3IgCisgICAgICogbnVsbCwgYWxsIG9iamVjdHMgaW4gdGhlIHRhcmdldCBjb250ZXh0IGFyZSByZXR1cm5lZC4KKyAgICAgKiBAcGFyYW0gYXR0cmlidXRlc1RvUmV0dXJuIHRoZSBhdHRyaWJ1dGVzIHRvIHJldHVybi4gbnVsbCBpbmRpY2F0ZXMgCisgICAgICogdGhhdCBhbGwgYXR0cmlidXRlcyBhcmUgdG8gYmUgcmV0dXJuZWQ7IGFuIGVtcHR5IGFycmF5IGluZGljYXRlcyB0aGF0IAorICAgICAqIG5vbmUgYXJlIHRvIGJlIHJldHVybmVkLgorICAgICAqIEByZXR1cm4gYSBub24tbnVsbCBlbnVtZXJhdGlvbiBvZiBTZWFyY2hSZXN1bHQgb2JqZWN0cy4gRWFjaCAKKyAgICAgKiBTZWFyY2hSZXN1bHQgY29udGFpbnMgdGhlIGF0dHJpYnV0ZXMgaWRlbnRpZmllZCBieSBhdHRyaWJ1dGVzVG9SZXR1cm4gCisgICAgICogYW5kIHRoZSBuYW1lIG9mIHRoZSBjb3JyZXNwb25kaW5nIG9iamVjdCwgbmFtZWQgcmVsYXRpdmUgdG8gdGhlIAorICAgICAqIGNvbnRleHQgbmFtZWQgYnkgbmFtZS4KKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgTmFtaW5nRW51bWVyYXRpb24gc2VhcmNoKFN0cmluZyBuYW1lLCBBdHRyaWJ1dGVzIG1hdGNoaW5nQXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIGF0dHJpYnV0ZXNUb1JldHVybikKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBPcGVyYXRpb25Ob3RTdXBwb3J0ZWRFeGNlcHRpb24oKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNlYXJjaGVzIGluIGEgc2luZ2xlIGNvbnRleHQgZm9yIG9iamVjdHMgdGhhdCBjb250YWluIGEgc3BlY2lmaWVkIHNldCAKKyAgICAgKiBvZiBhdHRyaWJ1dGVzLiBUaGlzIG1ldGhvZCByZXR1cm5zIGFsbCB0aGUgYXR0cmlidXRlcyBvZiBzdWNoIG9iamVjdHMuIAorICAgICAqIEl0IGlzIGVxdWl2YWxlbnQgdG8gc3VwcGx5aW5nIG51bGwgYXMgdGhlIGF0cmlidXRlc1RvUmV0dXJuIHBhcmFtZXRlciAKKyAgICAgKiB0byB0aGUgbWV0aG9kIHNlYXJjaChOYW1lLCBBdHRyaWJ1dGVzLCBTdHJpbmdbXSkuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbnRleHQgdG8gc2VhcmNoCisgICAgICogQHBhcmFtIG1hdGNoaW5nQXR0cmlidXRlcyB0aGUgYXR0cmlidXRlcyB0byBzZWFyY2ggZm9yLiBJZiBlbXB0eSBvciAKKyAgICAgKiBudWxsLCBhbGwgb2JqZWN0cyBpbiB0aGUgdGFyZ2V0IGNvbnRleHQgYXJlIHJldHVybmVkLgorICAgICAqIEByZXR1cm4gYSBub24tbnVsbCBlbnVtZXJhdGlvbiBvZiBTZWFyY2hSZXN1bHQgb2JqZWN0cy4gRWFjaCAKKyAgICAgKiBTZWFyY2hSZXN1bHQgY29udGFpbnMgdGhlIGF0dHJpYnV0ZXMgaWRlbnRpZmllZCBieSBhdHRyaWJ1dGVzVG9SZXR1cm4gCisgICAgICogYW5kIHRoZSBuYW1lIG9mIHRoZSBjb3JyZXNwb25kaW5nIG9iamVjdCwgbmFtZWQgcmVsYXRpdmUgdG8gdGhlIAorICAgICAqIGNvbnRleHQgbmFtZWQgYnkgbmFtZS4KKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgTmFtaW5nRW51bWVyYXRpb24gc2VhcmNoKFN0cmluZyBuYW1lLCBBdHRyaWJ1dGVzIG1hdGNoaW5nQXR0cmlidXRlcykKKyAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBPcGVyYXRpb25Ob3RTdXBwb3J0ZWRFeGNlcHRpb24oKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNlYXJjaGVzIGluIHRoZSBuYW1lZCBjb250ZXh0IG9yIG9iamVjdCBmb3IgZW50cmllcyB0aGF0IHNhdGlzZnkgdGhlIAorICAgICAqIGdpdmVuIHNlYXJjaCBmaWx0ZXIuIFBlcmZvcm1zIHRoZSBzZWFyY2ggYXMgc3BlY2lmaWVkIGJ5IHRoZSBzZWFyY2ggCisgICAgICogY29udHJvbHMuCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbnRleHQgb3Igb2JqZWN0IHRvIHNlYXJjaAorICAgICAqIEBwYXJhbSBmaWx0ZXIgdGhlIGZpbHRlciBleHByZXNzaW9uIHRvIHVzZSBmb3IgdGhlIHNlYXJjaDsgbWF5IG5vdCBiZSAKKyAgICAgKiBudWxsCisgICAgICogQHBhcmFtIGNvbnMgdGhlIHNlYXJjaCBjb250cm9scyB0aGF0IGNvbnRyb2wgdGhlIHNlYXJjaC4gSWYgbnVsbCwgCisgICAgICogdGhlIGRlZmF1bHQgc2VhcmNoIGNvbnRyb2xzIGFyZSB1c2VkIChlcXVpdmFsZW50IHRvIAorICAgICAqIChuZXcgU2VhcmNoQ29udHJvbHMoKSkpLgorICAgICAqIEByZXR1cm4gYW4gZW51bWVyYXRpb24gb2YgU2VhcmNoUmVzdWx0cyBvZiB0aGUgb2JqZWN0cyB0aGF0IHNhdGlzZnkgCisgICAgICogdGhlIGZpbHRlcjsgbmV2ZXIgbnVsbAorICAgICAqIEBleGNlcHRpb24gSW52YWxpZFNlYXJjaEZpbHRlckV4Y2VwdGlvbiBpZiB0aGUgc2VhcmNoIGZpbHRlciBzcGVjaWZpZWQgCisgICAgICogaXMgbm90IHN1cHBvcnRlZCBvciB1bmRlcnN0b29kIGJ5IHRoZSB1bmRlcmx5aW5nIGRpcmVjdG9yeQorICAgICAqIEBleGNlcHRpb24gSW52YWxpZFNlYXJjaENvbnRyb2xzRXhjZXB0aW9uIGlmIHRoZSBzZWFyY2ggY29udHJvbHMgCisgICAgICogY29udGFpbiBpbnZhbGlkIHNldHRpbmdzCisgICAgICogQGV4Y2VwdGlvbiBOYW1pbmdFeGNlcHRpb24gaWYgYSBuYW1pbmcgZXhjZXB0aW9uIGlzIGVuY291bnRlcmVkCisgICAgICovCisgICAgcHVibGljIE5hbWluZ0VudW1lcmF0aW9uIHNlYXJjaChTdHJpbmcgbmFtZSwgU3RyaW5nIGZpbHRlciwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWFyY2hDb250cm9scyBjb25zKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IE9wZXJhdGlvbk5vdFN1cHBvcnRlZEV4Y2VwdGlvbigpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2VhcmNoZXMgaW4gdGhlIG5hbWVkIGNvbnRleHQgb3Igb2JqZWN0IGZvciBlbnRyaWVzIHRoYXQgc2F0aXNmeSB0aGUgCisgICAgICogZ2l2ZW4gc2VhcmNoIGZpbHRlci4gUGVyZm9ybXMgdGhlIHNlYXJjaCBhcyBzcGVjaWZpZWQgYnkgdGhlIHNlYXJjaCAKKyAgICAgKiBjb250cm9scy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgY29udGV4dCBvciBvYmplY3QgdG8gc2VhcmNoCisgICAgICogQHBhcmFtIGZpbHRlckV4cHIgdGhlIGZpbHRlciBleHByZXNzaW9uIHRvIHVzZSBmb3IgdGhlIHNlYXJjaC4gCisgICAgICogVGhlIGV4cHJlc3Npb24gbWF5IGNvbnRhaW4gdmFyaWFibGVzIG9mIHRoZSBmb3JtICJ7aX0iIHdoZXJlIGkgaXMgYSAKKyAgICAgKiBub25uZWdhdGl2ZSBpbnRlZ2VyLiBNYXkgbm90IGJlIG51bGwuCisgICAgICogQHBhcmFtIGZpbHRlckFyZ3MgdGhlIGFycmF5IG9mIGFyZ3VtZW50cyB0byBzdWJzdGl0dXRlIGZvciB0aGUgCisgICAgICogdmFyaWFibGVzIGluIGZpbHRlckV4cHIuIFRoZSB2YWx1ZSBvZiBmaWx0ZXJBcmdzW2ldIHdpbGwgcmVwbGFjZSBlYWNoIAorICAgICAqIG9jY3VycmVuY2Ugb2YgIntpfSIuIElmIG51bGwsIGVxdWl2YWxlbnQgdG8gYW4gZW1wdHkgYXJyYXkuCisgICAgICogQHBhcmFtIGNvbnMgdGhlIHNlYXJjaCBjb250cm9scyB0aGF0IGNvbnRyb2wgdGhlIHNlYXJjaC4gSWYgbnVsbCwgdGhlIAorICAgICAqIGRlZmF1bHQgc2VhcmNoIGNvbnRyb2xzIGFyZSB1c2VkIChlcXVpdmFsZW50IHRvIChuZXcgU2VhcmNoQ29udHJvbHMoKSkpLgorICAgICAqIEByZXR1cm4gYW4gZW51bWVyYXRpb24gb2YgU2VhcmNoUmVzdWx0cyBvZiB0aGUgb2JqZWN0cyB0aGF0IHNhdGlzeSB0aGUgCisgICAgICogZmlsdGVyOyBuZXZlciBudWxsCisgICAgICogQGV4Y2VwdGlvbiBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgZmlsdGVyRXhwciBjb250YWlucyB7aX0gCisgICAgICogZXhwcmVzc2lvbnMgd2hlcmUgaSBpcyBvdXRzaWRlIHRoZSBib3VuZHMgb2YgdGhlIGFycmF5IGZpbHRlckFyZ3MKKyAgICAgKiBAZXhjZXB0aW9uIEludmFsaWRTZWFyY2hDb250cm9sc0V4Y2VwdGlvbiBpZiBjb25zIGNvbnRhaW5zIGludmFsaWQgCisgICAgICogc2V0dGluZ3MKKyAgICAgKiBAZXhjZXB0aW9uIEludmFsaWRTZWFyY2hGaWx0ZXJFeGNlcHRpb24gaWYgZmlsdGVyRXhwciB3aXRoIGZpbHRlckFyZ3MgCisgICAgICogcmVwcmVzZW50cyBhbiBpbnZhbGlkIHNlYXJjaCBmaWx0ZXIKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gaXMgZW5jb3VudGVyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgTmFtaW5nRW51bWVyYXRpb24gc2VhcmNoKFN0cmluZyBuYW1lLCBTdHJpbmcgZmlsdGVyRXhwciwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RbXSBmaWx0ZXJBcmdzLCBTZWFyY2hDb250cm9scyBjb25zKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IE9wZXJhdGlvbk5vdFN1cHBvcnRlZEV4Y2VwdGlvbigpOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3RlY3RlZCBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIE5vcm1hbGl6ZSB0aGUgbmFtZSBvZiBhbiBlbnRyeSByZWFkIGZyb20gdGhlIFppcC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIG5vcm1hbGl6ZShaaXBFbnRyeSBlbnRyeSkgeworCisgICAgICAgIFN0cmluZyByZXN1bHQgPSAiLyIgKyBlbnRyeS5nZXROYW1lKCk7CisgICAgICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQuc3Vic3RyaW5nKDAsIHJlc3VsdC5sZW5ndGgoKSAtIDEpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSB0cmVlIG9mIHRoZSBlbnRyaWVzIGNvbnRhaW5lZCBpbiBhIFdBUiBmaWxlLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGxvYWRFbnRyaWVzKCkgeworCisgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgIEVudW1lcmF0aW9uIGVudHJ5TGlzdCA9IGJhc2UuZW50cmllcygpOworICAgICAgICAgICAgZW50cmllcyA9IG5ldyBFbnRyeSgiLyIsIG5ldyBaaXBFbnRyeSgiLyIpKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgd2hpbGUgKGVudHJ5TGlzdC5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIFppcEVudHJ5IGVudHJ5ID0gKFppcEVudHJ5KSBlbnRyeUxpc3QubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IG5vcm1hbGl6ZShlbnRyeSk7CisgICAgICAgICAgICAgICAgaW50IHBvcyA9IG5hbWUubGFzdEluZGV4T2YoJy8nKTsKKyAgICAgICAgICAgICAgICAvLyBDaGVjayB0aGF0IHBhcmVudCBlbnRyaWVzIGV4aXN0IGFuZCwgaWYgbm90LCBjcmVhdGUgdGhlbS4KKyAgICAgICAgICAgICAgICAvLyBUaGlzIGZpeGVzIGEgYnVnIGZvciB3YXIgZmlsZXMgdGhhdCBkb24ndCByZWNvcmQgc2VwYXJhdGUKKyAgICAgICAgICAgICAgICAvLyB6aXAgZW50cmllcyBmb3IgdGhlIGRpcmVjdG9yaWVzLgorICAgICAgICAgICAgICAgIGludCBjdXJyZW50UG9zID0gLTE7CisgICAgICAgICAgICAgICAgaW50IGxhc3RQb3MgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlICgoY3VycmVudFBvcyA9IG5hbWUuaW5kZXhPZignLycsIGxhc3RQb3MpKSAhPSAtMSkgeworICAgICAgICAgICAgICAgICAgICBOYW1lIHBhcmVudE5hbWUgPSBuZXcgQ29tcG9zaXRlTmFtZShuYW1lLnN1YnN0cmluZygwLCBsYXN0UG9zKSk7CisgICAgICAgICAgICAgICAgICAgIE5hbWUgY2hpbGROYW1lID0gbmV3IENvbXBvc2l0ZU5hbWUobmFtZS5zdWJzdHJpbmcoMCwgY3VycmVudFBvcykpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZW50cnlOYW1lID0gbmFtZS5zdWJzdHJpbmcobGFzdFBvcywgY3VycmVudFBvcyk7CisgICAgICAgICAgICAgICAgICAgIC8vIFBhcmVudCBzaG91bGQgaGF2ZSBiZWVuIGNyZWF0ZWQgaW4gbGFzdCBjeWNsZSB0aHJvdWdoCisgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgbG9vcAorICAgICAgICAgICAgICAgICAgICBFbnRyeSBwYXJlbnQgPSB0cmVlTG9va3VwKHBhcmVudE5hbWUpOworICAgICAgICAgICAgICAgICAgICBFbnRyeSBjaGlsZCA9IHRyZWVMb29rdXAoY2hpbGROYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBlbnRyeSBmb3IgbWlzc2luZyBlbnRyeSBhbmQgc3RyaXAgb2ZmCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbGVhZGluZyAnLycgY2hhcmFjdGVyIGFuZCBhcHBlbmRlZCBvbiBieSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vcm1hbGl6ZSBtZXRob2QgYW5kIGFkZCAnLycgY2hhcmFjdGVyIHRvIGVuZCB0bworICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2lnbmlmeSB0aGF0IGl0IGlzIGEgZGlyZWN0b3J5IGVudHJ5CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgemlwTmFtZSA9IG5hbWUuc3Vic3RyaW5nKDEsIGN1cnJlbnRQb3MpICsgIi8iOworICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQgPSBuZXcgRW50cnkoZW50cnlOYW1lLCBuZXcgWmlwRW50cnkoemlwTmFtZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC5hZGRDaGlsZChjaGlsZCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gSW5jcmVtZW50IGxhc3RQb3MKKyAgICAgICAgICAgICAgICAgICAgbGFzdFBvcyA9IGN1cnJlbnRQb3MgKyAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTdHJpbmcgZW50cnlOYW1lID0gbmFtZS5zdWJzdHJpbmcocG9zICsgMSwgbmFtZS5sZW5ndGgoKSk7CisgICAgICAgICAgICAgICAgTmFtZSBjb21wb3NpdGVOYW1lID0gbmV3IENvbXBvc2l0ZU5hbWUobmFtZS5zdWJzdHJpbmcoMCwgcG9zKSk7CisgICAgICAgICAgICAgICAgRW50cnkgcGFyZW50ID0gdHJlZUxvb2t1cChjb21wb3NpdGVOYW1lKTsKKyAgICAgICAgICAgICAgICBFbnRyeSBjaGlsZCA9IG5ldyBFbnRyeShlbnRyeU5hbWUsIGVudHJ5KTsKKyAgICAgICAgICAgICAgICBpZiAocGFyZW50ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHBhcmVudC5hZGRDaGlsZChjaGlsZCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBFbnRyeSB0cmVlIGxvb2t1cC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRW50cnkgdHJlZUxvb2t1cChOYW1lIG5hbWUpIHsKKyAgICAgICAgaWYgKG5hbWUuaXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuIGVudHJpZXM7CisgICAgICAgIEVudHJ5IGN1cnJlbnRFbnRyeSA9IGVudHJpZXM7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmFtZS5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKG5hbWUuZ2V0KGkpLmxlbmd0aCgpID09IDApCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBjdXJyZW50RW50cnkgPSBjdXJyZW50RW50cnkuZ2V0Q2hpbGQobmFtZS5nZXQoaSkpOworICAgICAgICAgICAgaWYgKGN1cnJlbnRFbnRyeSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50RW50cnk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBMaXN0IGNoaWxkcmVuIGFzIG9iamVjdHMuCisgICAgICovCisgICAgcHJvdGVjdGVkIEFycmF5TGlzdCBsaXN0KEVudHJ5IGVudHJ5KSB7CisgICAgICAgIAorICAgICAgICBBcnJheUxpc3QgZW50cmllcyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgRW50cnlbXSBjaGlsZHJlbiA9IGVudHJ5LmdldENoaWxkcmVuKCk7CisgICAgICAgIEFycmF5cy5zb3J0KGNoaWxkcmVuKTsKKyAgICAgICAgTmFtaW5nRW50cnkgbmFtaW5nRW50cnkgPSBudWxsOworICAgICAgICAKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgWmlwRW50cnkgY3VycmVudCA9IGNoaWxkcmVuW2ldLmdldEVudHJ5KCk7CisgICAgICAgICAgICBPYmplY3Qgb2JqZWN0ID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChjdXJyZW50LmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgICAgICBvYmplY3QgPSBuZXcgV0FSRGlyQ29udGV4dChiYXNlLCBjaGlsZHJlbltpXSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG9iamVjdCA9IG5ldyBXQVJSZXNvdXJjZShjdXJyZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5hbWluZ0VudHJ5ID0gbmV3IE5hbWluZ0VudHJ5CisgICAgICAgICAgICAgICAgKGNoaWxkcmVuW2ldLmdldE5hbWUoKSwgb2JqZWN0LCBOYW1pbmdFbnRyeS5FTlRSWSk7CisgICAgICAgICAgICBlbnRyaWVzLmFkZChuYW1pbmdFbnRyeSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiBlbnRyaWVzOworICAgICAgICAKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRW50cmllcyBJbm5lciBDbGFzcworCisKKyAgICAvKioKKyAgICAgKiBFbnRyaWVzIHN0cnVjdHVyZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgY2xhc3MgRW50cnkgaW1wbGVtZW50cyBDb21wYXJhYmxlIHsKKworCisgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9yCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgcHVibGljIEVudHJ5KFN0cmluZyBuYW1lLCBaaXBFbnRyeSBlbnRyeSkgeworICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgICAgIHRoaXMuZW50cnkgPSBlbnRyeTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNZW1iZXIgVmFyaWFibGVzCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gbnVsbDsKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBwcm90ZWN0ZWQgWmlwRW50cnkgZW50cnkgPSBudWxsOworICAgICAgICAKKyAgICAgICAgCisgICAgICAgIHByb3RlY3RlZCBFbnRyeSBjaGlsZHJlbltdID0gbmV3IEVudHJ5WzBdOworICAgICAgICAKKyAgICAgICAgCisgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgcHVibGljIGludCBjb21wYXJlVG8oT2JqZWN0IG8pIHsKKyAgICAgICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBFbnRyeSkpCisgICAgICAgICAgICAgICAgcmV0dXJuICgrMSk7CisgICAgICAgICAgICByZXR1cm4gKG5hbWUuY29tcGFyZVRvKCgoRW50cnkpIG8pLmdldE5hbWUoKSkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFppcEVudHJ5IGdldEVudHJ5KCkgeworICAgICAgICAgICAgcmV0dXJuIGVudHJ5OworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBwdWJsaWMgdm9pZCBhZGRDaGlsZChFbnRyeSBlbnRyeSkgeworICAgICAgICAgICAgRW50cnlbXSBuZXdDaGlsZHJlbiA9IG5ldyBFbnRyeVtjaGlsZHJlbi5sZW5ndGggKyAxXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgbmV3Q2hpbGRyZW5baV0gPSBjaGlsZHJlbltpXTsKKyAgICAgICAgICAgIG5ld0NoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aF0gPSBlbnRyeTsKKyAgICAgICAgICAgIGNoaWxkcmVuID0gbmV3Q2hpbGRyZW47CisgICAgICAgIH0KKworCisgICAgICAgIHB1YmxpYyBFbnRyeVtdIGdldENoaWxkcmVuKCkgeworICAgICAgICAgICAgcmV0dXJuIGNoaWxkcmVuOworICAgICAgICB9CisKKworICAgICAgICBwdWJsaWMgRW50cnkgZ2V0Q2hpbGQoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoY2hpbGRyZW5baV0ubmFtZS5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkcmVuW2ldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFdBUlJlc291cmNlIElubmVyIENsYXNzCisKKworICAgIC8qKgorICAgICAqIFRoaXMgc3BlY2lhbGl6ZWQgcmVzb3VyY2UgaW1wbGVtZW50YXRpb24gYXZvaWRzIG9wZW5pbmcgdGhlIElwdXRTdHJlYW0KKyAgICAgKiB0byB0aGUgV0FSIHJpZ2h0IGF3YXkuCisgICAgICovCisgICAgcHJvdGVjdGVkIGNsYXNzIFdBUlJlc291cmNlIGV4dGVuZHMgUmVzb3VyY2UgeworICAgICAgICAKKyAgICAgICAgCisgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9yCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgcHVibGljIFdBUlJlc291cmNlKFppcEVudHJ5IGVudHJ5KSB7CisgICAgICAgICAgICB0aGlzLmVudHJ5ID0gZW50cnk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTWVtYmVyIFZhcmlhYmxlcworICAgICAgICAKKyAgICAgICAgCisgICAgICAgIHByb3RlY3RlZCBaaXBFbnRyeSBlbnRyeTsKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworICAgICAgICAKKyAgICAgICAgCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb250ZW50IGFjY2Vzc29yLgorICAgICAgICAgKiAKKyAgICAgICAgICogQHJldHVybiBJbnB1dFN0cmVhbQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIElucHV0U3RyZWFtIHN0cmVhbUNvbnRlbnQoKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYgKGJpbmFyeUNvbnRlbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbSA9IGJhc2UuZ2V0SW5wdXRTdHJlYW0oZW50cnkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKFppcEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzdXBlci5zdHJlYW1Db250ZW50KCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIAorICAgIH0KKworCit9CisKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvcmVzb3VyY2VzL2puZGkvSGFuZGxlci5qYXZhIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy9zaGFyZS9vcmcvYXBhY2hlL25hbWluZy9yZXNvdXJjZXMvam5kaS9IYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAzOTg3ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvcmVzb3VyY2VzL2puZGkvSGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8gCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5uYW1pbmcucmVzb3VyY2VzLmpuZGk7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm5hbWluZy5yZXNvdXJjZXMuRGlyQ29udGV4dFVSTFN0cmVhbUhhbmRsZXI7CisKKy8qKgorICogU3RyZWFtIGhhbmRsZXIgdG8gYSBKTkRJIGRpcmVjdG9yeSBjb250ZXh0LgorICogCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpyZW1tQGFwYWNoZS5vcmciPlJlbXkgTWF1Y2hlcmF0PC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgSGFuZGxlciAKKyAgICBleHRlbmRzIERpckNvbnRleHRVUkxTdHJlYW1IYW5kbGVyIHsKKyAgICAKKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKyAgICAKKyAgICAKKyAgICBwdWJsaWMgSGFuZGxlcigpIHsKKyAgICB9CisgICAgCisgICAgCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL3Jlc291cmNlcy9wYWNrYWdlLmh0bWwgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3NoYXJlL29yZy9hcGFjaGUvbmFtaW5nL3Jlc291cmNlcy9wYWNrYWdlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJkYzU2YQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvc2hhcmUvb3JnL2FwYWNoZS9uYW1pbmcvcmVzb3VyY2VzL3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDE1IEBACis8Ym9keT4KKworPHA+VGhpcyBwYWNrYWdlIGNvbnRhaW5zIHRoZSByZXNvdXJjZXMgZGlyZWN0b3J5IGNvbnRleHQgaW1wbGVtZXRhdGlvbi4KK1RoaXMgaW5jbHVkZXMgOgorPHVsPgorPGxpPkEgQ2FjaGVEaXJDb250ZXh0IHdoaWNoIGhhbmRsZXMgY2FjaGluZyBhbmQgYWN0cyBhcyBhIHByb3h5IGZvciB0aGUgcmVhbCAKK3Jlc291cmNlcyBjb250ZXh0PC9saT4KKzxsaT5BIEZpbGVEaXJDb250ZXh0LCBhbiBpbXBsZW1lbnRhdGlvbiBvZiBEaXJDb250ZXh0IHRvIGFjY2VzcyB0aGUgCitmaWxlc3lzdGVtPC9saT4KKzwvdWw+Cis8L3A+CisKKzxwPjwvcD4KKworPC9ib2R5PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy90ZW1wL1JFQURNRS50eHQgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3RlbXAvUkVBRE1FLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODE2YzFkCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy90ZW1wL1JFQURNRS50eHQKQEAgLTAsMCArMSw1IEBACitUaGlzIHRlbXAgZGlyZWN0b3J5IGlzIHVzZWQgYnkgdGhlIEpWTSBmb3IgdGVtcG9yYXJ5IGZpbGUgc3RvcmFnZS4KK1RoZSBKVk0gaXMgY29uZmlndXJlZCB0byB1c2UgdGhpcyBhcyBpdHMgamF2YS5pby50bXBkaXIgaW4gdGhlCitjYXRhbGluYS5zaCBhbmQgY2F0YWxpbmEuYmF0IHNjcmlwdHMuICBUb21jYXQgaXMgY29uZmlndXJlZCB0byB1c2UKK3RoaXMgdGVtcG9yYXJ5IGRpcmVjdG9yeSByYXRoZXIgdGhhbiBpdHMgZGVmYXVsdCBmb3Igc2VjdXJpdHkgcmVhc29ucy4KK1RoZSB0ZW1wIGRpcmVjdG9yeSBtdXN0IGV4aXN0IGZvciBUb21jYXQgdG8gd29yayBjb3JyZWN0bHkuCmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL0Nvb2tpZVRvb2xzVGVzdENhc2UuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvQ29va2llVG9vbHNUZXN0Q2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4YzBiZWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL0Nvb2tpZVRvb2xzVGVzdENhc2UuamF2YQpAQCAtMCwwICsxLDE1MyBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLyAKKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbDsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5Db29raWU7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7CisKKworLyoqCisgKiBVbml0IHRlc3RzIGZvciB0aGUgPGNvZGU+Q29va2llVG9vbHM8L2NvZGU+IGNsYXNzLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgQ29va2llVG9vbHNUZXN0Q2FzZSBleHRlbmRzIFRlc3RDYXNlIHsKKworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NbXSkgeworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRlc3RDYXNlIHN0YXJ0ZWQiKTsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogQSAidmVyc2lvbiAwIiBjb29raWUuCisgICAgICovCisgICAgcHJvdGVjdGVkIENvb2tpZSB2ZXJzaW9uMCA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIEEgInZlcnNpb24gMSIgY29va2llLgorICAgICAqLworICAgIHByb3RlY3RlZCBDb29raWUgdmVyc2lvbjEgPSBudWxsOworCisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyB0ZXN0IGNhc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSB0ZXN0IGNhc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgQ29va2llVG9vbHNUZXN0Q2FzZShTdHJpbmcgbmFtZSkgeworCisgICAgICAgIHN1cGVyKG5hbWUpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gT3ZlcmFsbCBUZXN0IE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogU2V0IHVwIGluc3RhbmNlIHZhcmlhYmxlcyByZXF1aXJlZCBieSB0aGlzIHRlc3QgY2FzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKworICAgICAgICB2ZXJzaW9uMCA9IG5ldyBDb29raWUoIlZlcnNpb24gMCBOYW1lIiwgIlZlcnNpb24gMCBWYWx1ZSIpOworICAgICAgICB2ZXJzaW9uMC5zZXRDb21tZW50KCJWZXJzaW9uIDAgQ29tbWVudCIpOworICAgICAgICB2ZXJzaW9uMC5zZXREb21haW4oImxvY2FsaG9zdCIpOworICAgICAgICB2ZXJzaW9uMC5zZXRQYXRoKCIvdmVyc2lvbjAiKTsKKyAgICAgICAgdmVyc2lvbjAuc2V0VmVyc2lvbigwKTsKKworICAgICAgICB2ZXJzaW9uMSA9IG5ldyBDb29raWUoIlZlcnNpb24gMSBOYW1lIiwgIlZlcnNpb24gMSBWYWx1ZSIpOworICAgICAgICB2ZXJzaW9uMS5zZXRDb21tZW50KCJWZXJzaW9uIDEgQ29tbWVudCIpOworICAgICAgICB2ZXJzaW9uMS5zZXREb21haW4oImxvY2FsaG9zdCIpOworICAgICAgICB2ZXJzaW9uMS5zZXRQYXRoKCIvdmVyc2lvbjEiKTsKKyAgICAgICAgdmVyc2lvbjEuc2V0VmVyc2lvbigxKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB0ZXN0cyBpbmNsdWRlZCBpbiB0aGlzIHRlc3Qgc3VpdGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeworCisgICAgICAgIHJldHVybiAobmV3IFRlc3RTdWl0ZShDb29raWVUb29sc1Rlc3RDYXNlLmNsYXNzKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRlYXIgZG93biBpbnN0YW5jZSB2YXJpYWJsZXMgcmVxdWlyZWQgYnkgdGhpcyB0ZXN0IGNhc2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB7CisKKyAgICAgICAgdmVyc2lvbjAgPSBudWxsOworICAgICAgICB2ZXJzaW9uMSA9IG51bGw7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbmRpdmlkdWFsIFRlc3QgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBDaGVjayB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgPGNvZGU+Z2V0Q29va2llSGVhZGVyTmFtZSgpPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Q29va2llSGVhZGVyTmFtZSgpIHsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIlZlcnNpb24gMCBjb29raWUgaGVhZGVyIG5hbWUiLCAiU2V0LUNvb2tpZSIsCisgICAgICAgICAgICAgICAgICAgICBDb29raWVUb29scy5nZXRDb29raWVIZWFkZXJOYW1lKHZlcnNpb24wKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiVmVyc2lvbiAxIGNvb2tpZSBoZWFkZXIgbmFtZSIsICJTZXQtQ29va2llMiIsCisgICAgICAgICAgICAgICAgICAgICBDb29raWVUb29scy5nZXRDb29raWVIZWFkZXJOYW1lKHZlcnNpb24xKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENoZWNrIHRoZSB2YWx1ZSByZXR1cm5lZCBieSA8Y29kZT5nZXRDb29raWVIZWFkZXJWYWx1ZSgpPC9jb2RlPgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRDb29raWVIZWFkZXJWYWx1ZSgpIHsKKworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBudWxsOworCisgICAgICAgIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBDb29raWVUb29scy5nZXRDb29raWVIZWFkZXJWYWx1ZSh2ZXJzaW9uMCwgc2IpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlZlcnNpb24gMCBjb29raWUgaGVhZGVyIHZhbHVlIiwKKyAgICAgICAgICAgICAgICAgICAgICJWZXJzaW9uIDAgTmFtZT1WZXJzaW9uIDAgVmFsdWU7RG9tYWluPWxvY2FsaG9zdDtQYXRoPS92ZXJzaW9uMCIsCisgICAgICAgICAgICAgICAgICAgICBzYi50b1N0cmluZygpKTsKKworICAgICAgICBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgQ29va2llVG9vbHMuZ2V0Q29va2llSGVhZGVyVmFsdWUodmVyc2lvbjEsIHNiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJWZXJzaW9uIDEgY29va2llIGhlYWRlciB2YWx1ZSIsCisgICAgICAgICAgICAgICAgICAgICAiVmVyc2lvbiAxIE5hbWU9XCJWZXJzaW9uIDEgVmFsdWVcIjtWZXJzaW9uPTE7Q29tbWVudD1cIlZlcnNpb24gMSBDb21tZW50XCI7RG9tYWluPWxvY2FsaG9zdDtEaXNjYXJkO1BhdGg9XCIvdmVyc2lvbjFcIiIsCisgICAgICAgICAgICAgICAgICAgICBzYi50b1N0cmluZygpKTsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL1VSTFRlc3RDYXNlLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9jYXRhbGluYS91dGlsL1VSTFRlc3RDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjViYWU4MAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvdGVzdC9vcmcvYXBhY2hlL2NhdGFsaW5hL3V0aWwvVVJMVGVzdENhc2UuamF2YQpAQCAtMCwwICsxLDYzOSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLyAKKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbDsKKworCitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworCisKKy8qKgorICogVW5pdCB0ZXN0cyBmb3IgdGhlIDxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5VUkw8L2NvZGU+IGNsYXNzLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgVVJMVGVzdENhc2UgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgdGVzdCBjYXNlLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgdGVzdCBjYXNlCisgICAgICovCisgICAgcHVibGljIFVSTFRlc3RDYXNlKFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgc3VwZXIobmFtZSk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBPdmVyYWxsIFRlc3QgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBTZXQgdXAgaW5zdGFuY2UgdmFyaWFibGVzIHJlcXVpcmVkIGJ5IHRoaXMgdGVzdCBjYXNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworCisgICAgICAgIDsgLy8gTm8gYWN0aW9uIHJlcXVpcmVkCisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdGVzdHMgaW5jbHVkZWQgaW4gdGhpcyB0ZXN0IHN1aXRlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKKworICAgICAgICByZXR1cm4gKG5ldyBUZXN0U3VpdGUoVVJMVGVzdENhc2UuY2xhc3MpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGVhciBkb3duIGluc3RhbmNlIHZhcmlhYmxlcyByZXF1aXJlZCBieSB0aGlzIHRlc3QgY2FzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKKworICAgICAgICA7IC8vIE5vIGFjdGlvbiByZXF1aXJlZAorCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5kaXZpZHVhbCBUZXN0IE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogTmVnYXRpdmUgdGVzdHMgZm9yIGFic29sdXRlIFVSTCBzdHJpbmdzIGluIHZhcmlvdXMgcGF0dGVybnMuICBFYWNoIG9mCisgICAgICogdGhlc2Ugc2hvdWxkIHRocm93IDxjb2RlPk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdE5lZ2F0aXZlQWJzb2x1dGUoKSB7CisKKyAgICAgICAgbmVnYXRpdmUoImluZGV4Lmh0bWwiKTsKKyAgICAgICAgbmVnYXRpdmUoImluZGV4Lmh0bWwjcmVmIik7CisgICAgICAgIG5lZ2F0aXZlKCJpbmRleC5odG1sP25hbWU9dmFsdWUiKTsKKyAgICAgICAgbmVnYXRpdmUoImluZGV4Lmh0bWw/bmFtZT12YWx1ZSNyZWYiKTsKKworICAgICAgICBuZWdhdGl2ZSgiL2luZGV4Lmh0bWwiKTsKKyAgICAgICAgbmVnYXRpdmUoIi9pbmRleC5odG1sI3JlZiIpOworICAgICAgICBuZWdhdGl2ZSgiL2luZGV4Lmh0bWw/bmFtZT12YWx1ZSIpOworICAgICAgICBuZWdhdGl2ZSgiL2luZGV4Lmh0bWw/bmFtZT12YWx1ZSNyZWYiKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogTmVnYXRpdmUgdGVzdHMgZm9yIDxjb2RlPm5vcm1hbGl6ZSgpPC9jb2RlPi4gIEF0dGVtcHRzIHRvIG5vcm1hbGl6ZQorICAgICAqIHRoZXNlIGxlZ2FsIFVSTHMgc2hvdWxkIHRocm93IDxjb2RlPk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdE5lZ2F0aXZlTm9ybWFsaXplKCkgeworCisgICAgICAgIG5vcm1hbGl6ZSgiaHR0cDovL2xvY2FsaG9zdC8uLiIpOworICAgICAgICBub3JtYWxpemUoImh0dHA6Ly9sb2NhbGhvc3QvLi4jcmVmIik7CisgICAgICAgIG5vcm1hbGl6ZSgiaHR0cDovL2xvY2FsaG9zdC8uLj9uYW1lPXZhbHVlIik7CisgICAgICAgIG5vcm1hbGl6ZSgiaHR0cDovL2xvY2FsaG9zdC8uLj9uYW1lPXZhbHVlI3JlZiIpOworCisgICAgICAgIG5vcm1hbGl6ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwLy4uIik7CisgICAgICAgIG5vcm1hbGl6ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwLy4uI3JlZiIpOworICAgICAgICBub3JtYWxpemUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC8uLj9uYW1lPXZhbHVlIik7CisgICAgICAgIG5vcm1hbGl6ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwLy4uP25hbWU9dmFsdWUjcmVmIik7CisgCisgICAgICAgIG5vcm1hbGl6ZSgiaHR0cDovL2xvY2FsaG9zdC8uLi8iKTsKKyAgICAgICAgbm9ybWFsaXplKCJodHRwOi8vbG9jYWxob3N0Ly4uLyNyZWYiKTsKKyAgICAgICAgbm9ybWFsaXplKCJodHRwOi8vbG9jYWxob3N0Ly4uLz9uYW1lPXZhbHVlIik7CisgICAgICAgIG5vcm1hbGl6ZSgiaHR0cDovL2xvY2FsaG9zdC8uLi8/bmFtZT12YWx1ZSNyZWYiKTsKKworICAgICAgICBub3JtYWxpemUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC8uLi8iKTsKKyAgICAgICAgbm9ybWFsaXplKCJodHRwOi8vbG9jYWxob3N0OjgwODAvLi4vI3JlZiIpOworICAgICAgICBub3JtYWxpemUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC8uLi8/bmFtZT12YWx1ZSIpOworICAgICAgICBub3JtYWxpemUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC8uLi8/bmFtZT12YWx1ZSNyZWYiKTsKKyAKKyAgICAgICAgbm9ybWFsaXplKCJodHRwOi8vbG9jYWxob3N0L2luZGV4Lmh0bWwvLi4vLi4vZm9vLmh0bWwiKTsKKyAgICAgICAgbm9ybWFsaXplKCJodHRwOi8vbG9jYWxob3N0L2luZGV4Lmh0bWwvLi4vLi4vZm9vLmh0bWwjcmVmIik7CisgICAgICAgIG5vcm1hbGl6ZSgiaHR0cDovL2xvY2FsaG9zdC9pbmRleC5odG1sLy4uLy4uL2Zvby5odG1sP25hbWU9dmFsdWUiKTsKKyAgICAgICAgbm9ybWFsaXplKCJodHRwOi8vbG9jYWxob3N0L2luZGV4Lmh0bWwvLi4vLi4vZm9vLmh0bWw/bmFtZT12YWx1ZSNyZWYiKTsKKworICAgICAgICBub3JtYWxpemUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9pbmRleC5odG1sLy4uLy4uL2Zvby5odG1sIik7CisgICAgICAgIG5vcm1hbGl6ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2luZGV4Lmh0bWwvLi4vLi4vZm9vLmh0bWwjcmVmIik7CisgICAgICAgIG5vcm1hbGl6ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2luZGV4Lmh0bWwvLi4vLi4vZm9vLmh0bWw/bmFtZT12YWx1ZSIpOworICAgICAgICBub3JtYWxpemUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9pbmRleC5odG1sLy4uLy4uL2Zvby5odG1sP25hbWU9dmFsdWUjcmVmIik7CisgCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBOZWdhdGl2ZSB0ZXN0cyBmb3IgcmVsYXRpdmUgVVJMIHN0cmluZ3MgaW4gdmFyaW91cyBwYXR0ZXJucy4gIEVhY2ggb2YKKyAgICAgKiB0aGVzZSBzaG91bGQgdGhyb3cgPGNvZGU+TWFsZm9ybWVkVVJMRXhjZXB0aW9uPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmVnYXRpdmVSZWxhdGl2ZSgpIHsKKworICAgICAgICAvLyBDb21tZW50ZWQgb3V0IGJlY2F1c2UgamF2YS5uZXQuVVJMIGlnbm9yZXMgZXh0cmFuZW91cyAiLi4vIgorICAgICAgICAvLyAgICAgICAgbmVnYXRpdmUoImh0dHA6Ly9hL2IvYy9kO3A/cSIsICIuLi8uLi8uLi9nIik7CisgICAgICAgIC8vICAgICAgICBuZWdhdGl2ZSgiaHR0cDovL2EvYi9jL2Q7cD9xIiwgIi8uLi9nIik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFBvc2l0aXZlIHRlc3RzIGZvciBhYnNvbHV0ZSBVUkwgc3RyaW5ncyBpbiB2YXJpb3VzIHBhdHRlcm5zLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RQb3NpdGl2ZUFic29sdXRlKCkgeworCisgICAgICAgIHBvc2l0aXZlKCJodHRwOi8vYS9iL2MvZDtwP3EiKTsKKworICAgICAgICBwb3NpdGl2ZSgiaHR0cDovL2xvY2FsaG9zdC9pbmRleC5odG1sIik7CisgICAgICAgIHBvc2l0aXZlKCJodHRwOi8vbG9jYWxob3N0L2luZGV4Lmh0bWwjcmVmIik7CisgICAgICAgIHBvc2l0aXZlKCJodHRwOi8vbG9jYWxob3N0L2luZGV4Lmh0bWw/bmFtZT12YWx1ZSIpOworICAgICAgICBwb3NpdGl2ZSgiaHR0cDovL2xvY2FsaG9zdC9pbmRleC5odG1sP25hbWU9dmFsdWUjcmVmIik7CisKKyAgICAgICAgcG9zaXRpdmUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9pbmRleC5odG1sIik7CisgICAgICAgIHBvc2l0aXZlKCJodHRwOi8vbG9jYWxob3N0OjgwODAvaW5kZXguaHRtbCNyZWYiKTsKKyAgICAgICAgcG9zaXRpdmUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9pbmRleC5odG1sP25hbWU9dmFsdWUiKTsKKyAgICAgICAgcG9zaXRpdmUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9pbmRleC5odG1sP25hbWU9dmFsdWUjcmVmIik7CisKKyAgICAgICAgcG9zaXRpdmUoImh0dHA6Ly9sb2NhbGhvc3QvaW5kZXguaHRtbC8uIik7CisgICAgICAgIHBvc2l0aXZlKCJodHRwOi8vbG9jYWxob3N0L2luZGV4Lmh0bWwvLiNyZWYiKTsKKyAgICAgICAgcG9zaXRpdmUoImh0dHA6Ly9sb2NhbGhvc3QvaW5kZXguaHRtbC8uP25hbWU9dmFsdWUiKTsKKyAgICAgICAgcG9zaXRpdmUoImh0dHA6Ly9sb2NhbGhvc3QvaW5kZXguaHRtbC8uP25hbWU9dmFsdWUjcmVmIik7CisKKyAgICAgICAgcG9zaXRpdmUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9pbmRleC5odG1sLy4iKTsKKyAgICAgICAgcG9zaXRpdmUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9pbmRleC5odG1sLy4jcmVmIik7CisgICAgICAgIHBvc2l0aXZlKCJodHRwOi8vbG9jYWxob3N0OjgwODAvaW5kZXguaHRtbC8uP25hbWU9dmFsdWUiKTsKKyAgICAgICAgcG9zaXRpdmUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9pbmRleC5odG1sLy4/bmFtZT12YWx1ZSNyZWYiKTsKKworICAgICAgICBwb3NpdGl2ZSgiaHR0cDovL2xvY2FsaG9zdC9pbmRleC5odG1sL2Zvby8uLiIpOworICAgICAgICBwb3NpdGl2ZSgiaHR0cDovL2xvY2FsaG9zdC9pbmRleC5odG1sL2Zvby8uLiNyZWYiKTsKKyAgICAgICAgcG9zaXRpdmUoImh0dHA6Ly9sb2NhbGhvc3QvaW5kZXguaHRtbC9mb28vLi4/bmFtZT12YWx1ZSIpOworICAgICAgICBwb3NpdGl2ZSgiaHR0cDovL2xvY2FsaG9zdC9pbmRleC5odG1sL2Zvby8uLj9uYW1lPXZhbHVlI3JlZiIpOworCisgICAgICAgIHBvc2l0aXZlKCJodHRwOi8vbG9jYWxob3N0OjgwODAvaW5kZXguaHRtbC9mb28vLi4iKTsKKyAgICAgICAgcG9zaXRpdmUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9pbmRleC5odG1sL2Zvby8uLiNyZWYiKTsKKyAgICAgICAgcG9zaXRpdmUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9pbmRleC5odG1sL2Zvby8uLj9uYW1lPXZhbHVlIik7CisgICAgICAgIHBvc2l0aXZlKCJodHRwOi8vbG9jYWxob3N0OjgwODAvaW5kZXguaHRtbC9mb28vLi4/bmFtZT12YWx1ZSNyZWYiKTsKKworICAgICAgICBwb3NpdGl2ZSgiaHR0cDovL2xvY2FsaG9zdC9pbmRleC5odG1sLy4uL2Zvby5odG1sIik7CisgICAgICAgIHBvc2l0aXZlKCJodHRwOi8vbG9jYWxob3N0L2luZGV4Lmh0bWwvLi4vZm9vLmh0bWwjcmVmIik7CisgICAgICAgIHBvc2l0aXZlKCJodHRwOi8vbG9jYWxob3N0L2luZGV4Lmh0bWwvLi4vZm9vLmh0bWw/bmFtZT12YWx1ZSIpOworICAgICAgICBwb3NpdGl2ZSgiaHR0cDovL2xvY2FsaG9zdC9pbmRleC5odG1sLy4uL2Zvby5odG1sP25hbWU9dmFsdWUjcmVmIik7CisKKyAgICAgICAgcG9zaXRpdmUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9pbmRleC5odG1sLy4uL2Zvby5odG1sIik7CisgICAgICAgIHBvc2l0aXZlKCJodHRwOi8vbG9jYWxob3N0OjgwODAvaW5kZXguaHRtbC8uLi9mb28uaHRtbCNyZWYiKTsKKyAgICAgICAgcG9zaXRpdmUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9pbmRleC5odG1sLy4uL2Zvby5odG1sP25hbWU9dmFsdWUiKTsKKyAgICAgICAgcG9zaXRpdmUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9pbmRleC5odG1sLy4uL2Zvby5odG1sP25hbWU9dmFsdWUjcmVmIik7CisKKyAgICAgICAgcG9zaXRpdmUoImh0dHA6Ly9sb2NhbGhvc3QiKTsKKyAgICAgICAgcG9zaXRpdmUoImh0dHA6Ly9sb2NhbGhvc3QjcmVmIik7CisgICAgICAgIHBvc2l0aXZlKCJodHRwOi8vbG9jYWxob3N0P25hbWU9dmFsdWUiKTsKKyAgICAgICAgcG9zaXRpdmUoImh0dHA6Ly9sb2NhbGhvc3Q/bmFtZT12YWx1ZSNyZWYiKTsKKworICAgICAgICBwb3NpdGl2ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwIik7CisgICAgICAgIHBvc2l0aXZlKCJodHRwOi8vbG9jYWxob3N0OjgwODAjcmVmIik7CisgICAgICAgIHBvc2l0aXZlKCJodHRwOi8vbG9jYWxob3N0OjgwODA/bmFtZT12YWx1ZSIpOworICAgICAgICBwb3NpdGl2ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwP25hbWU9dmFsdWUjcmVmIik7CisKKyAgICAgICAgcG9zaXRpdmUoImh0dHA6Ly9sb2NhbGhvc3QvIik7CisgICAgICAgIHBvc2l0aXZlKCJodHRwOi8vbG9jYWxob3N0LyNyZWYiKTsKKyAgICAgICAgcG9zaXRpdmUoImh0dHA6Ly9sb2NhbGhvc3QvP25hbWU9dmFsdWUiKTsKKyAgICAgICAgcG9zaXRpdmUoImh0dHA6Ly9sb2NhbGhvc3QvP25hbWU9dmFsdWUjcmVmIik7CisKKyAgICAgICAgcG9zaXRpdmUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC8iKTsKKyAgICAgICAgcG9zaXRpdmUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC8jcmVmIik7CisgICAgICAgIHBvc2l0aXZlKCJodHRwOi8vbG9jYWxob3N0OjgwODAvP25hbWU9dmFsdWUiKTsKKyAgICAgICAgcG9zaXRpdmUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC8/bmFtZT12YWx1ZSNyZWYiKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUG9zaXRpdmUgdGVzdHMgZm9yIG5vcm1hbGl6aW5nIGFic29sdXRlIFVSTCBzdHJpbmdzIGluIHZhcmlvdXMgcGF0dGVybnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFBvc2l0aXZlTm9ybWFsaXplKCkgeworCisgICAgICAgIG5vcm1hbGl6ZSgiaHR0cDovL2EvYi9jL2Q7cD9xIiwKKyAgICAgICAgICAgICAgICAgICJodHRwOi8vYS9iL2MvZDtwP3EiKTsKKworICAgICAgICBub3JtYWxpemUoImh0dHA6Ly9sb2NhbGhvc3QvaW5kZXguaHRtbCIsCisgICAgICAgICAgICAgICAgICAiaHR0cDovL2xvY2FsaG9zdC9pbmRleC5odG1sIik7CisgICAgICAgIG5vcm1hbGl6ZSgiaHR0cDovL2xvY2FsaG9zdC9pbmRleC5odG1sI3JlZiIsCisgICAgICAgICAgICAgICAgICAiaHR0cDovL2xvY2FsaG9zdC9pbmRleC5odG1sI3JlZiIpOworICAgICAgICBub3JtYWxpemUoImh0dHA6Ly9sb2NhbGhvc3QvaW5kZXguaHRtbD9uYW1lPXZhbHVlIiwKKyAgICAgICAgICAgICAgICAgICJodHRwOi8vbG9jYWxob3N0L2luZGV4Lmh0bWw/bmFtZT12YWx1ZSIpOworICAgICAgICBub3JtYWxpemUoImh0dHA6Ly9sb2NhbGhvc3QvaW5kZXguaHRtbD9uYW1lPXZhbHVlI3JlZiIsCisgICAgICAgICAgICAgICAgICAiaHR0cDovL2xvY2FsaG9zdC9pbmRleC5odG1sP25hbWU9dmFsdWUjcmVmIik7CisKKyAgICAgICAgbm9ybWFsaXplKCJodHRwOi8vbG9jYWxob3N0OjgwODAvaW5kZXguaHRtbCIsCisgICAgICAgICAgICAgICAgICAiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2luZGV4Lmh0bWwiKTsKKyAgICAgICAgbm9ybWFsaXplKCJodHRwOi8vbG9jYWxob3N0OjgwODAvaW5kZXguaHRtbCNyZWYiLAorICAgICAgICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9pbmRleC5odG1sI3JlZiIpOworICAgICAgICBub3JtYWxpemUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9pbmRleC5odG1sP25hbWU9dmFsdWUiLAorICAgICAgICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9pbmRleC5odG1sP25hbWU9dmFsdWUiKTsKKyAgICAgICAgbm9ybWFsaXplKCJodHRwOi8vbG9jYWxob3N0OjgwODAvaW5kZXguaHRtbD9uYW1lPXZhbHVlI3JlZiIsCisgICAgICAgICAgICAgICAgICAiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2luZGV4Lmh0bWw/bmFtZT12YWx1ZSNyZWYiKTsKKworICAgICAgICBub3JtYWxpemUoImh0dHA6Ly9sb2NhbGhvc3QvLi9pbmRleC5odG1sIiwKKyAgICAgICAgICAgICAgICAgICJodHRwOi8vbG9jYWxob3N0L2luZGV4Lmh0bWwiKTsKKyAgICAgICAgbm9ybWFsaXplKCJodHRwOi8vbG9jYWxob3N0Ly4vaW5kZXguaHRtbCNyZWYiLAorICAgICAgICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3QvaW5kZXguaHRtbCNyZWYiKTsKKyAgICAgICAgbm9ybWFsaXplKCJodHRwOi8vbG9jYWxob3N0Ly4vaW5kZXguaHRtbD9uYW1lPXZhbHVlIiwKKyAgICAgICAgICAgICAgICAgICJodHRwOi8vbG9jYWxob3N0L2luZGV4Lmh0bWw/bmFtZT12YWx1ZSIpOworICAgICAgICBub3JtYWxpemUoImh0dHA6Ly9sb2NhbGhvc3QvLi9pbmRleC5odG1sP25hbWU9dmFsdWUjcmVmIiwKKyAgICAgICAgICAgICAgICAgICJodHRwOi8vbG9jYWxob3N0L2luZGV4Lmh0bWw/bmFtZT12YWx1ZSNyZWYiKTsKKworICAgICAgICBub3JtYWxpemUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC8uL2luZGV4Lmh0bWwiLAorICAgICAgICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9pbmRleC5odG1sIik7CisgICAgICAgIG5vcm1hbGl6ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwLy4vaW5kZXguaHRtbCNyZWYiLAorICAgICAgICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9pbmRleC5odG1sI3JlZiIpOworICAgICAgICBub3JtYWxpemUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC8uL2luZGV4Lmh0bWw/bmFtZT12YWx1ZSIsCisgICAgICAgICAgICAgICAgICAiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2luZGV4Lmh0bWw/bmFtZT12YWx1ZSIpOworICAgICAgICBub3JtYWxpemUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC8uL2luZGV4Lmh0bWw/bmFtZT12YWx1ZSNyZWYiLAorICAgICAgICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9pbmRleC5odG1sP25hbWU9dmFsdWUjcmVmIik7CisKKyAgICAgICAgbm9ybWFsaXplKCJodHRwOi8vbG9jYWxob3N0L2luZGV4Lmh0bWwvLiIsCisgICAgICAgICAgICAgICAgICAiaHR0cDovL2xvY2FsaG9zdC9pbmRleC5odG1sLyIpOworICAgICAgICBub3JtYWxpemUoImh0dHA6Ly9sb2NhbGhvc3QvaW5kZXguaHRtbC8uI3JlZiIsCisgICAgICAgICAgICAgICAgICAiaHR0cDovL2xvY2FsaG9zdC9pbmRleC5odG1sLyNyZWYiKTsKKyAgICAgICAgbm9ybWFsaXplKCJodHRwOi8vbG9jYWxob3N0L2luZGV4Lmh0bWwvLj9uYW1lPXZhbHVlIiwKKyAgICAgICAgICAgICAgICAgICJodHRwOi8vbG9jYWxob3N0L2luZGV4Lmh0bWwvP25hbWU9dmFsdWUiKTsKKyAgICAgICAgbm9ybWFsaXplKCJodHRwOi8vbG9jYWxob3N0L2luZGV4Lmh0bWwvLj9uYW1lPXZhbHVlI3JlZiIsCisgICAgICAgICAgICAgICAgICAiaHR0cDovL2xvY2FsaG9zdC9pbmRleC5odG1sLz9uYW1lPXZhbHVlI3JlZiIpOworCisgICAgICAgIG5vcm1hbGl6ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2luZGV4Lmh0bWwvLiIsCisgICAgICAgICAgICAgICAgICAiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2luZGV4Lmh0bWwvIik7CisgICAgICAgIG5vcm1hbGl6ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2luZGV4Lmh0bWwvLiNyZWYiLAorICAgICAgICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9pbmRleC5odG1sLyNyZWYiKTsKKyAgICAgICAgbm9ybWFsaXplKCJodHRwOi8vbG9jYWxob3N0OjgwODAvaW5kZXguaHRtbC8uP25hbWU9dmFsdWUiLAorICAgICAgICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9pbmRleC5odG1sLz9uYW1lPXZhbHVlIik7CisgICAgICAgIG5vcm1hbGl6ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2luZGV4Lmh0bWwvLj9uYW1lPXZhbHVlI3JlZiIsCisgICAgICAgICAgICAgICAgICAiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2luZGV4Lmh0bWwvP25hbWU9dmFsdWUjcmVmIik7CisKKyAgICAgICAgbm9ybWFsaXplKCJodHRwOi8vbG9jYWxob3N0L2luZGV4Lmh0bWwvLi8iLAorICAgICAgICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3QvaW5kZXguaHRtbC8iKTsKKyAgICAgICAgbm9ybWFsaXplKCJodHRwOi8vbG9jYWxob3N0L2luZGV4Lmh0bWwvLi8jcmVmIiwKKyAgICAgICAgICAgICAgICAgICJodHRwOi8vbG9jYWxob3N0L2luZGV4Lmh0bWwvI3JlZiIpOworICAgICAgICBub3JtYWxpemUoImh0dHA6Ly9sb2NhbGhvc3QvaW5kZXguaHRtbC8uLz9uYW1lPXZhbHVlIiwKKyAgICAgICAgICAgICAgICAgICJodHRwOi8vbG9jYWxob3N0L2luZGV4Lmh0bWwvP25hbWU9dmFsdWUiKTsKKyAgICAgICAgbm9ybWFsaXplKCJodHRwOi8vbG9jYWxob3N0L2luZGV4Lmh0bWwvLi8/bmFtZT12YWx1ZSNyZWYiLAorICAgICAgICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3QvaW5kZXguaHRtbC8/bmFtZT12YWx1ZSNyZWYiKTsKKworICAgICAgICBub3JtYWxpemUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9pbmRleC5odG1sLy4vIiwKKyAgICAgICAgICAgICAgICAgICJodHRwOi8vbG9jYWxob3N0OjgwODAvaW5kZXguaHRtbC8iKTsKKyAgICAgICAgbm9ybWFsaXplKCJodHRwOi8vbG9jYWxob3N0OjgwODAvaW5kZXguaHRtbC8uLyNyZWYiLAorICAgICAgICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9pbmRleC5odG1sLyNyZWYiKTsKKyAgICAgICAgbm9ybWFsaXplKCJodHRwOi8vbG9jYWxob3N0OjgwODAvaW5kZXguaHRtbC8uLz9uYW1lPXZhbHVlIiwKKyAgICAgICAgICAgICAgICAgICJodHRwOi8vbG9jYWxob3N0OjgwODAvaW5kZXguaHRtbC8/bmFtZT12YWx1ZSIpOworICAgICAgICBub3JtYWxpemUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9pbmRleC5odG1sLy4vP25hbWU9dmFsdWUjcmVmIiwKKyAgICAgICAgICAgICAgICAgICJodHRwOi8vbG9jYWxob3N0OjgwODAvaW5kZXguaHRtbC8/bmFtZT12YWx1ZSNyZWYiKTsKKworICAgICAgICBub3JtYWxpemUoImh0dHA6Ly9sb2NhbGhvc3QvZm9vLmh0bWwvLi4vaW5kZXguaHRtbCIsCisgICAgICAgICAgICAgICAgICAiaHR0cDovL2xvY2FsaG9zdC9pbmRleC5odG1sIik7CisgICAgICAgIG5vcm1hbGl6ZSgiaHR0cDovL2xvY2FsaG9zdC9mb28uaHRtbC8uLi9pbmRleC5odG1sI3JlZiIsCisgICAgICAgICAgICAgICAgICAiaHR0cDovL2xvY2FsaG9zdC9pbmRleC5odG1sI3JlZiIpOworICAgICAgICBub3JtYWxpemUoImh0dHA6Ly9sb2NhbGhvc3QvZm9vLmh0bWwvLi4vaW5kZXguaHRtbD9uYW1lPXZhbHVlIiwKKyAgICAgICAgICAgICAgICAgICJodHRwOi8vbG9jYWxob3N0L2luZGV4Lmh0bWw/bmFtZT12YWx1ZSIpOworICAgICAgICBub3JtYWxpemUoImh0dHA6Ly9sb2NhbGhvc3QvZm9vLmh0bWwvLi4vaW5kZXguaHRtbD9uYW1lPXZhbHVlI3JlZiIsCisgICAgICAgICAgICAgICAgICAiaHR0cDovL2xvY2FsaG9zdC9pbmRleC5odG1sP25hbWU9dmFsdWUjcmVmIik7CisKKyAgICAgICAgbm9ybWFsaXplKCJodHRwOi8vbG9jYWxob3N0OjgwODAvZm9vLmh0bWwvLi4vaW5kZXguaHRtbCIsCisgICAgICAgICAgICAgICAgICAiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2luZGV4Lmh0bWwiKTsKKyAgICAgICAgbm9ybWFsaXplKCJodHRwOi8vbG9jYWxob3N0OjgwODAvZm9vLmh0bWwvLi4vaW5kZXguaHRtbCNyZWYiLAorICAgICAgICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9pbmRleC5odG1sI3JlZiIpOworICAgICAgICBub3JtYWxpemUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9mb28uaHRtbC8uLi9pbmRleC5odG1sP25hbWU9dmFsdWUiLAorICAgICAgICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9pbmRleC5odG1sP25hbWU9dmFsdWUiKTsKKyAgICAgICAgbm9ybWFsaXplKCJodHRwOi8vbG9jYWxob3N0OjgwODAvZm9vLmh0bWwvLi4vaW5kZXguaHRtbD9uYW1lPXZhbHVlI3JlZiIsCisgICAgICAgICAgICAgICAgICAiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2luZGV4Lmh0bWw/bmFtZT12YWx1ZSNyZWYiKTsKKworICAgICAgICBub3JtYWxpemUoImh0dHA6Ly9sb2NhbGhvc3QvaW5kZXguaHRtbC9mb28uaHRtbC8uLiIsCisgICAgICAgICAgICAgICAgICAiaHR0cDovL2xvY2FsaG9zdC9pbmRleC5odG1sLyIpOworICAgICAgICBub3JtYWxpemUoImh0dHA6Ly9sb2NhbGhvc3QvaW5kZXguaHRtbC9mb28uaHRtbC8uLiNyZWYiLAorICAgICAgICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3QvaW5kZXguaHRtbC8jcmVmIik7CisgICAgICAgIG5vcm1hbGl6ZSgiaHR0cDovL2xvY2FsaG9zdC9pbmRleC5odG1sL2Zvby5odG1sLy4uP25hbWU9dmFsdWUiLAorICAgICAgICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3QvaW5kZXguaHRtbC8/bmFtZT12YWx1ZSIpOworICAgICAgICBub3JtYWxpemUoImh0dHA6Ly9sb2NhbGhvc3QvaW5kZXguaHRtbC9mb28uaHRtbC8uLj9uYW1lPXZhbHVlI3JlZiIsCisgICAgICAgICAgICAgICAgICAiaHR0cDovL2xvY2FsaG9zdC9pbmRleC5odG1sLz9uYW1lPXZhbHVlI3JlZiIpOworCisgICAgICAgIG5vcm1hbGl6ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2luZGV4Lmh0bWwvZm9vLmh0bWwvLi4iLAorICAgICAgICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9pbmRleC5odG1sLyIpOworICAgICAgICBub3JtYWxpemUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9pbmRleC5odG1sL2Zvby5odG1sLy4uI3JlZiIsCisgICAgICAgICAgICAgICAgICAiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2luZGV4Lmh0bWwvI3JlZiIpOworICAgICAgICBub3JtYWxpemUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9pbmRleC5odG1sL2Zvby5odG1sLy4uP25hbWU9dmFsdWUiLAorICAgICAgICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9pbmRleC5odG1sLz9uYW1lPXZhbHVlIik7CisgICAgICAgIG5vcm1hbGl6ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2luZGV4Lmh0bWwvZm9vLmh0bWwvLi4/bmFtZT12YWx1ZSNyZWYiLAorICAgICAgICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9pbmRleC5odG1sLz9uYW1lPXZhbHVlI3JlZiIpOworCisgICAgICAgIG5vcm1hbGl6ZSgiaHR0cDovL2xvY2FsaG9zdC9pbmRleC5odG1sL2Zvby5odG1sLy4uLyIsCisgICAgICAgICAgICAgICAgICAiaHR0cDovL2xvY2FsaG9zdC9pbmRleC5odG1sLyIpOworICAgICAgICBub3JtYWxpemUoImh0dHA6Ly9sb2NhbGhvc3QvaW5kZXguaHRtbC9mb28uaHRtbC8uLi8jcmVmIiwKKyAgICAgICAgICAgICAgICAgICJodHRwOi8vbG9jYWxob3N0L2luZGV4Lmh0bWwvI3JlZiIpOworICAgICAgICBub3JtYWxpemUoImh0dHA6Ly9sb2NhbGhvc3QvaW5kZXguaHRtbC9mb28uaHRtbC8uLi8/bmFtZT12YWx1ZSIsCisgICAgICAgICAgICAgICAgICAiaHR0cDovL2xvY2FsaG9zdC9pbmRleC5odG1sLz9uYW1lPXZhbHVlIik7CisgICAgICAgIG5vcm1hbGl6ZSgiaHR0cDovL2xvY2FsaG9zdC9pbmRleC5odG1sL2Zvby5odG1sLy4uLz9uYW1lPXZhbHVlI3JlZiIsCisgICAgICAgICAgICAgICAgICAiaHR0cDovL2xvY2FsaG9zdC9pbmRleC5odG1sLz9uYW1lPXZhbHVlI3JlZiIpOworCisgICAgICAgIG5vcm1hbGl6ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2luZGV4Lmh0bWwvZm9vLmh0bWwvLi4vIiwKKyAgICAgICAgICAgICAgICAgICJodHRwOi8vbG9jYWxob3N0OjgwODAvaW5kZXguaHRtbC8iKTsKKyAgICAgICAgbm9ybWFsaXplKCJodHRwOi8vbG9jYWxob3N0OjgwODAvaW5kZXguaHRtbC9mb28uaHRtbC8uLi8jcmVmIiwKKyAgICAgICAgICAgICAgICAgICJodHRwOi8vbG9jYWxob3N0OjgwODAvaW5kZXguaHRtbC8jcmVmIik7CisgICAgICAgIG5vcm1hbGl6ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2luZGV4Lmh0bWwvZm9vLmh0bWwvLi4vP25hbWU9dmFsdWUiLAorICAgICAgICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9pbmRleC5odG1sLz9uYW1lPXZhbHVlIik7CisgICAgICAgIG5vcm1hbGl6ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2luZGV4Lmh0bWwvZm9vLmh0bWwvLi4vP25hbWU9dmFsdWUjcmVmIiwKKyAgICAgICAgICAgICAgICAgICJodHRwOi8vbG9jYWxob3N0OjgwODAvaW5kZXguaHRtbC8/bmFtZT12YWx1ZSNyZWYiKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUG9zaXRpdmUgdGVzdHMgZm9yIHJlbGF0aXZlIFVSTCBzdHJpbmdzIGluIHZhcmlvdXMgcGF0dGVybnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFBvc2l0aXZlUmVsYXRpdmUoKSB7CisKKyAgICAgICAgLy8gVGVzdCBjYXNlcyBiYXNlZCBvbiBSRkMgMjM5NiwgQXBwZW5kaXggQworICAgICAgICBwb3NpdGl2ZSgiaHR0cDovL2EvYi9jL2Q7cD9xIiwgImh0dHA6aCIpOworICAgICAgICBwb3NpdGl2ZSgiaHR0cDovL2EvYi9jL2Q7cD9xIiwgImciKTsKKyAgICAgICAgcG9zaXRpdmUoImh0dHA6Ly9hL2IvYy9kO3A/cSIsICIuL2ciKTsKKyAgICAgICAgcG9zaXRpdmUoImh0dHA6Ly9hL2IvYy9kO3A/cSIsICJnLyIpOworICAgICAgICBwb3NpdGl2ZSgiaHR0cDovL2EvYi9jL2Q7cD9xIiwgIi9nIik7CisgICAgICAgIC8vICAgICAgICBwb3NpdGl2ZSgiaHR0cDovL2EvYi9jL2Q7cD9xIiwgIi8vZyIpOworICAgICAgICBwb3NpdGl2ZSgiaHR0cDovL2EvYi9jL2Q7cD9xIiwgIj95Iik7CisgICAgICAgIHBvc2l0aXZlKCJodHRwOi8vYS9iL2MvZDtwP3EiLCAiZz95Iik7CisgICAgICAgIC8vICAgICAgICBwb3NpdGl2ZSgiaHR0cDovL2EvYi9jL2Q7cD9xIiwgIiNzIik7CisgICAgICAgIHBvc2l0aXZlKCJodHRwOi8vYS9iL2MvZDtwP3EiLCAiZyNzIik7CisgICAgICAgIHBvc2l0aXZlKCJodHRwOi8vYS9iL2MvZDtwP3EiLCAiZz95I3MiKTsKKyAgICAgICAgcG9zaXRpdmUoImh0dHA6Ly9hL2IvYy9kO3A/cSIsICI7eCIpOworICAgICAgICBwb3NpdGl2ZSgiaHR0cDovL2EvYi9jL2Q7cD9xIiwgImc7eCIpOworICAgICAgICBwb3NpdGl2ZSgiaHR0cDovL2EvYi9jL2Q7cD9xIiwgImc7eD95I3MiKTsKKyAgICAgICAgcG9zaXRpdmUoImh0dHA6Ly9hL2IvYy9kO3A/cSIsICIuIik7CisgICAgICAgIHBvc2l0aXZlKCJodHRwOi8vYS9iL2MvZDtwP3EiLCAiLi8iKTsKKyAgICAgICAgcG9zaXRpdmUoImh0dHA6Ly9hL2IvYy9kO3A/cSIsICIuLiIpOworICAgICAgICBwb3NpdGl2ZSgiaHR0cDovL2EvYi9jL2Q7cD9xIiwgIi4uLyIpOworICAgICAgICBwb3NpdGl2ZSgiaHR0cDovL2EvYi9jL2Q7cD9xIiwgIi4uL2ciKTsKKyAgICAgICAgcG9zaXRpdmUoImh0dHA6Ly9hL2IvYy9kO3A/cSIsICIuLi8uLiIpOworICAgICAgICBwb3NpdGl2ZSgiaHR0cDovL2EvYi9jL2Q7cD9xIiwgIi4uLy4uLyIpOworICAgICAgICBwb3NpdGl2ZSgiaHR0cDovL2EvYi9jL2Q7cD9xIiwgIi4uLy4uL2ciKTsKKyAgICAgICAgLy8gQ29tbWVudGVkIGJlY2F1c2UgamF2YS5uZXQuVVJMIGRvZXNuJ3Qgbm9ybWFsaXplIG91dCB0aGUgIi8uLyI/Pz8/CisgICAgICAgIC8vICAgICAgICBwb3NpdGl2ZSgiaHR0cDovL2EvYi9jL2Q7cD9xIiwgIi8uL2ciKTsKKyAgICAgICAgcG9zaXRpdmUoImh0dHA6Ly9hL2IvYy9kO3A/cSIsICJnLiIpOworICAgICAgICBwb3NpdGl2ZSgiaHR0cDovL2EvYi9jL2Q7cD9xIiwgIi5nIik7CisgICAgICAgIHBvc2l0aXZlKCJodHRwOi8vYS9iL2MvZDtwP3EiLCAiZy4uIik7CisgICAgICAgIHBvc2l0aXZlKCJodHRwOi8vYS9iL2MvZDtwP3EiLCAiLi5nIik7CisgICAgICAgIHBvc2l0aXZlKCJodHRwOi8vYS9iL2MvZDtwP3EiLCAiLi8uLi9nIik7CisgICAgICAgIHBvc2l0aXZlKCJodHRwOi8vYS9iL2MvZDtwP3EiLCAiLi9nLy4iKTsKKyAgICAgICAgcG9zaXRpdmUoImh0dHA6Ly9hL2IvYy9kO3A/cSIsICJnLy4vaCIpOworICAgICAgICBwb3NpdGl2ZSgiaHR0cDovL2EvYi9jL2Q7cD9xIiwgImcvLi4vaCIpOworICAgICAgICBwb3NpdGl2ZSgiaHR0cDovL2EvYi9jL2Q7cD9xIiwgImc7eD0xLy4veSIpOworICAgICAgICBwb3NpdGl2ZSgiaHR0cDovL2EvYi9jL2Q7cD9xIiwgImc7eD0xLy4uL3kiKTsKKyAgICAgICAgcG9zaXRpdmUoImh0dHA6Ly9hL2IvYy9kO3A/cSIsICJnP3kvLi94Iik7CisgICAgICAgIHBvc2l0aXZlKCJodHRwOi8vYS9iL2MvZDtwP3EiLCAiZz95Ly4uL3giKTsKKyAgICAgICAgcG9zaXRpdmUoImh0dHA6Ly9hL2IvYy9kO3A/cSIsICJnI3MvLi94Iik7CisgICAgICAgIHBvc2l0aXZlKCJodHRwOi8vYS9iL2MvZDtwP3EiLCAiZyNzLy4uL3giKTsKKyAgICAgICAgcG9zaXRpdmUoImh0dHA6Ly9hL2IiLCAiYyIpOworICAgICAgICBwb3NpdGl2ZSgiaHR0cDovL2EvYi8iLCAiYyIpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcml2YXRlIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogQ2hlY2sgdGhhdCBib3RoIG91ciBVUkwgY2xhc3MgYW5kIDxjb2RlPmphdmEubmV0LlVSTDwvY29kZT4gdGhyb3cKKyAgICAgKiA8Y29kZT5NYWxmb3JtZWRVUkxFeGNlcHRpb248L2NvZGU+IG9uIGFuIGFic29sdXRlIFVSTCBzcGVjaWZpY2F0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHNwZWMgQWJzb2x1dGUgVVJMIHNwZWNpZmljYXRpb24gdG8gYmUgY2hlY2tlZAorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBuZWdhdGl2ZShTdHJpbmcgc3BlYykgeworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBqYXZhLm5ldC5VUkwgdXJsID0gbmV3IGphdmEubmV0LlVSTChzcGVjKTsKKyAgICAgICAgICAgIGZhaWwoc3BlYyArICIgc2hvdWxkIGhhdmUgZmFpbGVkIG9uIGphdmEubmV0LlVSTCAiICsKKyAgICAgICAgICAgICAgICAgImJ1dCByZXR1cm5lZCAiICsgdXJsLnRvRXh0ZXJuYWxGb3JtKCkpOworICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgOyAvLyBFeHBlY3RlZCByZXNwb25zZQorICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFVSTCB1cmwgPSBuZXcgVVJMKHNwZWMpOworICAgICAgICAgICAgZmFpbChzcGVjICsgIiBzaG91bGQgaGF2ZSBmYWlsZWQgb24gdGVzdGVkIFVSTCAiICsKKyAgICAgICAgICAgICAgICAgImJ1dCByZXR1cm5lZCAiICsgdXJsLnRvRXh0ZXJuYWxGb3JtKCkpOworICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgOyAvLyBFeHBlY3RlZCByZXNwb25zZQorICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENoZWNrIHRoYXQgYm90aCBvdXIgVVJMIGNsYXNzIGFuZCA8Y29kZT5qYXZhLm5ldC5VUkw8L2NvZGU+IHRocm93CisgICAgICogPGNvZGU+TWFsZm9ybWVkVVJMRXhjZXB0aW9uPC9jb2RlPiBvbiBhbiBhYnNvbHV0ZSBVUkwgc3BlY2lmaWNhdGlvbgorICAgICAqIHBsdXMgdGhlIGNvcnJlc3BvbmRpbmcgcmVsYXRpdmUgVVJMIHNwZWNpZmljYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWJzIEFic29sdXRlIFVSTCBzcGVjaWZpY2F0aW9uIHRvIGJlIGNoZWNrZWQKKyAgICAgKiBAcGFyYW0gcmVsIFJlbGF0aXZlIFVSTCBzcGVjaWZpY2F0aW9uIHRvIGJlIGNoZWNrZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgbmVnYXRpdmUoU3RyaW5nIGFicywgU3RyaW5nIHJlbCkgeworCisgICAgICAgIGphdmEubmV0LlVSTCBiYXNlTmV0ID0gbnVsbDsKKyAgICAgICAgVVJMIGJhc2VVcmwgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBiYXNlTmV0ID0gbmV3IGphdmEubmV0LlVSTChhYnMpOworICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbChhYnMgKyAiIG5ldCBVUkwgdGhyZXcgIiArIGUpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGJhc2VVcmwgPSBuZXcgVVJMKGFicyk7CisgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKGFicyArICIgdXJsIFVSTCB0aHJldyAiICsgZSk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgamF2YS5uZXQuVVJMIHVybCA9IG5ldyBqYXZhLm5ldC5VUkwoYmFzZU5ldCwgcmVsKTsKKyAgICAgICAgICAgIGZhaWwocmVsICsgIiBzaG91bGQgaGF2ZSBmYWlsZWQgb24gamF2YS5uZXQuVVJMICIgKworICAgICAgICAgICAgICAgICAiYnV0IHJldHVybmVkICIgKyB1cmwudG9FeHRlcm5hbEZvcm0oKSk7CisgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICA7IC8vIEV4cGVjdGVkIHJlc3BvbnNlCisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgVVJMIHVybCA9IG5ldyBVUkwoYmFzZVVybCwgcmVsKTsKKyAgICAgICAgICAgIGZhaWwocmVsICsgIiBzaG91bGQgaGF2ZSBmYWlsZWQgb24gdGVzdGVkIFVSTCAiICsKKyAgICAgICAgICAgICAgICAgImJ1dCByZXR1cm5lZCAiICsgdXJsLnRvRXh0ZXJuYWxGb3JtKCkpOworICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgOyAvLyBFeHBlY3RlZCByZXNwb25zZQorICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEF0dGVtcHRzIHRvIG5vcm1hbGl6ZSB0aGUgc3BlY2lmaWVkIFVSTCBzaG91bGQgdGhyb3cKKyAgICAgKiBNYWxmb3JtZWRVUkxFeGNlcHRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3BlYyBVbm5vcm1hbGl6ZWQgdmVyc2lvbiBvZiB0aGUgVVJMIHNwZWNpZmljYXRpb24KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgbm9ybWFsaXplKFN0cmluZyBzcGVjKSB7CisKKyAgICAgICAgVVJMIHVybCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB1cmwgPSBuZXcgVVJMKHNwZWMpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgZmFpbChzcGVjICsgIiBzaG91bGQgbm90IGhhdmUgdGhyb3duICIgKyB0KTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB1cmwubm9ybWFsaXplKCk7CisgICAgICAgICAgICBmYWlsKHNwZWMgKyAiLm5vcm1hbGl6ZSgpIHNob3VsZCBoYXZlIHRocm93biBNVUUiKTsKKyAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIDsgLy8gRXhwZWN0ZWQgcmVzdWx0CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogSXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIG5vcm1hbGl6ZSB0aGUgc3BlY2lmaWVkIFVSTCBpbnRvIHRoZQorICAgICAqIHNwZWNpZmllZCBub3JtYWxpemVkIGZvcm0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3BlYyBVbm5vcm1hbGl6ZWQgdmVyc2lvbiBvZiB0aGUgVVJMIHNwZWNpZmljYXRpb24KKyAgICAgKiBAcGFyYW0gbm9ybSBOb3JtYWxpemVkIHZlcnNpb24gb2YgdGhlIFVSTCBzcGVjaWZpY2F0aW9uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIG5vcm1hbGl6ZShTdHJpbmcgc3BlYywgU3RyaW5nIG5vcm0pIHsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgVVJMIHVybCA9IG5ldyBVUkwoc3BlYyk7CisgICAgICAgICAgICB1cmwubm9ybWFsaXplKCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoc3BlYyArICIubm9ybWFsaXplKCkiLCBub3JtLCB1cmwudG9FeHRlcm5hbEZvcm0oKSk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICBmYWlsKHNwZWMgKyAiLm5vcm1hbGl6ZSgpIHRocmV3ICIgKyB0KTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDaGVjayB0aGUgZGV0YWlscyBvZiBvdXIgVVJMIGNsYXNzIGFnYWluc3QgPGNvZGU+amF2YS5uZXQuVVJMPC9jb2RlPgorICAgICAqIGZvciBhbiBhYnNvbHV0ZSBVUkwgc3BlY2lmaWNhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzcGVjIEFic29sdXRlIFVSTCBzcGVjaWZpY2F0aW9uIHRvIGJlIGNoZWNrZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcG9zaXRpdmUoU3RyaW5nIHNwZWMpIHsKKworICAgICAgICAvLyBDb21wYXJlIHJlc3VsdHMgd2l0aCB3aGF0IGphdmEubmV0LlVSTCByZXR1cm5zCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBVUkwgdXJsID0gbmV3IFVSTChzcGVjKTsKKyAgICAgICAgICAgIGphdmEubmV0LlVSTCBuZXQgPSBuZXcgamF2YS5uZXQuVVJMKHNwZWMpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNwZWMgKyAiIHRvRXh0ZXJuYWxGb3JtKCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5ldC50b0V4dGVybmFsRm9ybSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVybC50b0V4dGVybmFsRm9ybSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhzcGVjICsgIi5nZXRBdXRob3JpdHkoKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgbmV0LmdldEF1dGhvcml0eSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVybC5nZXRBdXRob3JpdHkoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoc3BlYyArICIuZ2V0RmlsZSgpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBuZXQuZ2V0RmlsZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVybC5nZXRGaWxlKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNwZWMgKyAiLmdldEhvc3QoKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgbmV0LmdldEhvc3QoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1cmwuZ2V0SG9zdCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhzcGVjICsgIi5nZXRQYXRoKCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5ldC5nZXRQYXRoKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgdXJsLmdldFBhdGgoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoc3BlYyArICIuZ2V0UG9ydCgpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBuZXQuZ2V0UG9ydCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVybC5nZXRQb3J0KCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNwZWMgKyAiLmdldFByb3RvY29sKCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5ldC5nZXRQcm90b2NvbCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVybC5nZXRQcm90b2NvbCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhzcGVjICsgIi5nZXRRdWVyeSgpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBuZXQuZ2V0UXVlcnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1cmwuZ2V0UXVlcnkoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoc3BlYyArICIuZ2V0UmVmKCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5ldC5nZXRSZWYoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1cmwuZ2V0UmVmKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNwZWMgKyAiLmdldFVzZXJJbmZvKCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5ldC5nZXRVc2VySW5mbygpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVybC5nZXRVc2VySW5mbygpKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIGZhaWwoc3BlYyArICIgcG9zaXRpdmUgdGVzdCB0aHJldyAiICsgdCk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ2hlY2sgdGhlIGRldGFpbHMgb2Ygb3VyIFVSTCBjbGFzcyBhZ2FpbnN0IDxjb2RlPmphdmEubmV0LlVSTDwvY29kZT4KKyAgICAgKiBmb3IgYSByZWxhdGl2ZSBVUkwgc3BlY2lmaWNhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhYnMgQWJzb2x1dGUgVVJMIHNwZWNpZmljYXRpb24gZm9yIGJhc2UgcmVmZXJlbmNlCisgICAgICogQHBhcmFtIHJlbCBSZWxhdGl2ZSBVUkwgc3BlY2lmaWNhdGlvbiB0byByZXNvbHZlCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHBvc2l0aXZlKFN0cmluZyBhYnMsIFN0cmluZyByZWwpIHsKKworICAgICAgICAvLyBDb21wYXJlIHJlc3VsdHMgd2l0aCB3aGF0IGphdmEubmV0LlVSTCByZXR1cm5zCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBVUkwgdXJsQmFzZSA9IG5ldyBVUkwoYWJzKTsKKyAgICAgICAgICAgIGphdmEubmV0LlVSTCBuZXRCYXNlID0gbmV3IGphdmEubmV0LlVSTChhYnMpOworICAgICAgICAgICAgVVJMIHVybCA9IG5ldyBVUkwodXJsQmFzZSwgcmVsKTsKKyAgICAgICAgICAgIGphdmEubmV0LlVSTCBuZXQgPSBuZXcgamF2YS5uZXQuVVJMKG5ldEJhc2UsIHJlbCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVsICsgIiB0b0V4dGVybmFsRm9ybSgpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBuZXQudG9FeHRlcm5hbEZvcm0oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1cmwudG9FeHRlcm5hbEZvcm0oKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVsICsgIi5nZXRBdXRob3JpdHkoKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgbmV0LmdldEF1dGhvcml0eSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVybC5nZXRBdXRob3JpdHkoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVsICsgIi5nZXRGaWxlKCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5ldC5nZXRGaWxlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgdXJsLmdldEZpbGUoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVsICsgIi5nZXRIb3N0KCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5ldC5nZXRIb3N0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgdXJsLmdldEhvc3QoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVsICsgIi5nZXRQYXRoKCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5ldC5nZXRQYXRoKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgdXJsLmdldFBhdGgoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVsICsgIi5nZXRQb3J0KCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5ldC5nZXRQb3J0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgdXJsLmdldFBvcnQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVsICsgIi5nZXRQcm90b2NvbCgpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBuZXQuZ2V0UHJvdG9jb2woKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1cmwuZ2V0UHJvdG9jb2woKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVsICsgIi5nZXRRdWVyeSgpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBuZXQuZ2V0UXVlcnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1cmwuZ2V0UXVlcnkoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVsICsgIi5nZXRSZWYoKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgbmV0LmdldFJlZigpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVybC5nZXRSZWYoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVsICsgIi5nZXRVc2VySW5mbygpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBuZXQuZ2V0VXNlckluZm8oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1cmwuZ2V0VXNlckluZm8oKSk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICBmYWlsKHJlbCArICIgcG9zaXRpdmUgdGVzdCB0aHJldyAiICsgdCk7CisgICAgICAgIH0KKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvY2F0YWxpbmEvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9uYW1pbmcvcmVzb3VyY2VzL0Jhc2VEaXJDb250ZXh0VGVzdENhc2UuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvdGVzdC9vcmcvYXBhY2hlL25hbWluZy9yZXNvdXJjZXMvQmFzZURpckNvbnRleHRUZXN0Q2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhYjRhY2EKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9uYW1pbmcvcmVzb3VyY2VzL0Jhc2VEaXJDb250ZXh0VGVzdENhc2UuamF2YQpAQCAtMCwwICsxLDU0MSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLyAKKworCitwYWNrYWdlIG9yZy5hcGFjaGUubmFtaW5nLnJlc291cmNlczsKKworaW1wb3J0IGphdmEudXRpbC5EYXRlOworCitpbXBvcnQgamF2YXgubmFtaW5nLkJpbmRpbmc7CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWVDbGFzc1BhaXI7CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWluZ0VudW1lcmF0aW9uOworaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1pbmdFeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC5uYW1pbmcuZGlyZWN0b3J5LkF0dHJpYnV0ZTsKK2ltcG9ydCBqYXZheC5uYW1pbmcuZGlyZWN0b3J5LkF0dHJpYnV0ZXM7CitpbXBvcnQgamF2YXgubmFtaW5nLmRpcmVjdG9yeS5EaXJDb250ZXh0OworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7CisKKworLyoqCisgKiA8cD5CYXNpYyB1bml0IHRlc3RzIGZvciB0aGUgPGNvZGU+amF2YXgubmFtaW5nLmRpcmVjdG9yeS5EaXJDb250ZXh0PC9jb2RlPgorICogaW1wbGVtZW50YXRpb25zLiAgVGhpcyBjbGFzcyBtdXN0IGJlIHN1YmNsYXNzZWQgZm9yIGVhY2ggaW5kaXZpZHVhbAorICogPGNvZGU+RGlyQ29udGV4dDwvY29kZT4gaW1wbGVtZW50YXRpb24uPC9wPgorICoKKyAqIDxwPjxzdHJvbmc+V0FSTklORzwvc3Ryb25nPjogIFRoZXNlIHRlc3RzIG1ha2UgY2VydGFpbiBhc3N1bXB0aW9ucyB0aGF0CisgKiBjYW4gZ2VuZXJhdGUgImZhbHNlIG5lZ2F0aXZlIiByZXN1bHRzIGlmIHRoZXkgYXJlIHZpb2xhdGVkOjwvcD4KKyAqIDx1bD4KKyAqIDxsaT5UaGUgcGF0aG5hbWUgb2YgYSBkaXJlY3RvcnkgKG9yIFdBUiBmaWxlKSBjb250YWluaW5nIHRoZSBzdGF0aWMKKyAqICAgICByZXNvdXJjZXMgb2YgdGhlIDxjb2RlPi9leGFtcGxlczwvY29kZT4gd2ViIGFwcGxpY2F0aW9uIHNoaXBwZWQKKyAqICAgICB3aXRoIFRvbWNhdCBpcyBwYXNzZWQgdG8gb3VyIHRlc3QgY2xhc3MgYXMgYSBzeXN0ZW0gcHJvcGVydHkKKyAqICAgICBuYW1lZCA8Y29kZT5kb2MuYmFzZTwvY29kZT4uPC9saT4KKyAqIDxsaT5UaGUgZW50cnkgbmFtZXMgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIHRvcC1sZXZlbCBEaXJDb250ZXh0IG9mCisgKiAgICAgdGhlIHN0YXRpYyByZXNvdXJjZXMgYXJlIGVudW1lcmF0ZWQgaW4gdGhlIDxjb2RlPnRvcExldmVsTmFtZXM8L2NvZGU+CisgKiAgICAgdmFyaWFibGUuPC9saT4KKyAqIDxsaT5UaGUgZW50cnkgbmFtZXMgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIFdFQi1JTkYgRGlyQ29udGV4dCBvZgorICogICAgIHRoZSBzdGF0aWMgcmVzb3VyY2VzIGFyZSBlbnVtZXJhdGVkIGluIHRoZSA8Y29kZT53ZWJJbmZOYW1lczwvY29kZT4KKyAqICAgICB2YXJpYWJsZS48L2xpPgorICogPGxpPlRoZSBlbnRyeSBuYW1lcyBpbiBlaXRoZXIgdGhlIHRvcC1sZXZlbCBvciBXRUItSU5GIERpckNvbnRleHQgY29udGV4dHMKKyAqICAgICB0aGF0IHNob3VsZCB0aGVtc2VsdmVzIGJlIDxjb2RlPkRpckNvbnRleHQ8L2NvZGU+IGltcGxlbWVudGF0aW9ucyAoaS5lLgorICogICAgICJzdWJkaXJlY3RvcmllcyIgaW4gdGhlIHN0YXRpYyByZXNvdXJjZXMgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uKQorICogICAgIGFyZSBlbnVtZXJhdGVkIGluIHRoZSA8Y29kZT5kaXJDb250ZXh0TmFtZXM8L2NvZGU+IHZhcmlhYmxlLjwvbGk+CisgKiA8L3VsPgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZURpckNvbnRleHRUZXN0Q2FzZSBleHRlbmRzIFRlc3RDYXNlIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIEEgZGlyZWN0b3J5IGNvbnRleHQgaW1wbGVtZW50YXRpb24gdG8gYmUgdGVzdGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCBEaXJDb250ZXh0IGNvbnRleHQgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgcGF0aG5hbWUgb2YgdGhlIGRvY3VtZW50IGJhc2UgZGlyZWN0b3J5IGZvciB0aGlzIGRpcmVjdG9yeSBjb250ZXh0LgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZG9jQmFzZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiZG9jLmJhc2UiKTsKKworCisgICAgLyoqCisgICAgICogRW50cnkgbmFtZXMgdGhhdCBtdXN0IGJlIERpckNvbnRleHRzLiAgTmFtZXMgbm90IG9uIHRoaXMgbGlzdCBhcmUKKyAgICAgKiBhc3N1bWVkIHRvIGJlIFJlc291cmNlcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBkaXJDb250ZXh0TmFtZXNbXSA9CisgICAgeyAiY2xhc3NlcyIsICJpbWFnZXMiLCAianNwIiwgImxpYiIsICJNRVRBLUlORiIsICJXRUItSU5GIiB9OworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc2V0IG9mIG5hbWVzIHRoYXQgc2hvdWxkIGJlIHByZXNlbnQgaW4gdGhlIHRvcC1sZXZlbAorICAgICAqIGRpcmVjdG9yeSBjb250ZXh0LgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIHRvcExldmVsTmFtZXNbXSA9CisgICAgeyAiaW5kZXguanNwIiwgImpha2FydGEtYmFubmVyLmdpZiIsICJ0b21jYXQuZ2lmIiwgInRvbWNhdC1wb3dlci5naWYiLCAiTUVUQS1JTkYiLCAiV0VCLUlORiIgfTsKKworICAgIC8qKgorICAgICAqIFRoZSBzZXQgb2YgbmFtZXMgdGhhdCBzaG91bGQgYmUgcHJlc2VudCBpbiB0aGUgV0VCLUlORgorICAgICAqIGRpcmVjdG9yeSBjb250ZXh0LgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIHdlYkluZk5hbWVzW10gPQorICAgIHsgImNsYXNzZXMiLCAianNwIiwgImxpYiIsICJ3ZWIueG1sIiB9OworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc2V0IG9mIG5hbWVzIHRoYXQgc2hvdWxkIGJlIGF0dHJpYnV0ZXMgb2YgV0VCLUlORi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyB3ZWJJbmZBdHRyc1tdID0KKyAgICB7ICJjcmVhdGlvbmRhdGUiLCAiZGlzcGxheW5hbWUiLCAiZ2V0Y29udGVudGxlbmd0aCIsICJnZXRsYXN0bW9kaWZpZWQiLAorICAgICAgInJlc291cmNldHlwZSIgfTsKKworCisgICAgLyoqCisgICAgICogVGhlIHNldCBvZiBuYW1lcyB0aGF0IHNob3VsZCBiZSBhdHRyaWJ1dGVzIG9mIFdFQi1JTkYvd2ViLnhtbC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyB3ZWJYbWxBdHRyc1tdID0KKyAgICB7ICJjcmVhdGlvbmRhdGUiLCAiZGlzcGxheW5hbWUiLCAiZ2V0Y29udGVudGxlbmd0aCIsICJnZXRsYXN0bW9kaWZpZWQiLAorICAgICAgInJlc291cmNldHlwZSIgfTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIHRlc3QgY2FzZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIHRlc3QgY2FzZQorICAgICAqLworICAgIHB1YmxpYyBCYXNlRGlyQ29udGV4dFRlc3RDYXNlKFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgc3VwZXIobmFtZSk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBPdmVyYWxsIFRlc3QgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBTZXQgdXAgaW5zdGFuY2UgdmFyaWFibGVzIHJlcXVpcmVkIGJ5IHRoaXMgdGVzdCBjYXNlLiAgVGhpcyBtZXRob2QKKyAgICAgKiA8c3Ryb25nPk1VU1Q8L3N0cm9uZz4gYmUgaW1wbGVtZW50ZWQgYnkgYSBzdWJjbGFzcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRVcCgpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHRlc3RzIGluY2x1ZGVkIGluIHRoaXMgdGVzdCBzdWl0ZS4gIFRoaXMgbWV0aG9kCisgICAgICogPHN0cm9uZz5NVVNUPC9zdHJvbmc+IGJlIGltcGxlbWVudGVkIGJ5IGEgc3ViY2xhc3MuCisgICAgICovCisgICAgLy8gcHVibGljIGFic3RyYWN0IHN0YXRpYyBUZXN0IHN1aXRlKCk7CisKKworICAgIC8qKgorICAgICAqIFRlYXIgZG93biBpbnN0YW5jZSB2YXJpYWJsZXMgcmVxdWlyZWQgYnkgdGhpcyB0ZXN0IGNhc2UuICBUaGlzIG1ldGhvZAorICAgICAqIDxzdHJvbmc+TVVTVDwvc3Ryb25nPiBiZSBpbXBsZW1lbnRlZCBieSBhIHN1YmNsYXNzLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHRlYXJEb3duKCk7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbmRpdmlkdWFsIFRlc3QgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBUZXN0IHRoZSBhdHRyaWJ1dGVzIHJldHVybmVkIGZvciB0aGUgPGNvZGU+V0VCLUlORjwvY29kZT4gZW50cnkuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgdGVzdEdldEF0dHJpYnV0ZXNXZWJJbmYoKTsKKworCisgICAgLyoqCisgICAgICogVGVzdCB0aGUgYXR0cmlidXRlcyByZXR1cm5lZCBmb3IgdGhlIDxjb2RlPldFQi1JTkYvd2ViLnhtbDwvY29kZT4KKyAgICAgKiBlbnRyeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB0ZXN0R2V0QXR0cmlidXRlc1dlYlhtbCgpOworCisKKyAgICAvKioKKyAgICAgKiBXZSBzaG91bGQgYmUgYWJsZSB0byBsaXN0IHRoZSBjb250ZW50cyBvZiB0aGUgdG9wLWxldmVsIGNvbnRleHQgaXRzZWxmLAorICAgICAqIGFuZCBsb2NhdGUgc29tZSBlbnRyaWVzIHdlIGtub3cgYXJlIHRoZXJlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RMaXN0VG9wTGV2ZWwoKSB7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNoZWNrTGlzdChjb250ZXh0Lmxpc3QoIiIpLCB0b3BMZXZlbE5hbWVzKTsKKyAgICAgICAgfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIk5hbWluZ0V4Y2VwdGlvbjogIiArIGUpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFdlIHNob3VsZCBiZSBhYmxlIHRvIGxpc3QgdGhlIGNvbnRlbnRzIG9mIHRoZSBXRUItSU5GIGVudHJ5LAorICAgICAqIGFuZCBsb2NhdGUgc29tZSBlbnRyaWVzIHdlIGtub3cgYXJlIHRoZXJlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RMaXN0V2ViSW5mRGlyZWN0KCkgeworCisgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgIC8vIExvb2sgdXAgdGhlIFdFQi1JTkYgZW50cnkKKyAgICAgICAgICAgIE9iamVjdCB3ZWJJbmZFbnRyeSA9IGNvbnRleHQubG9va3VwKCJXRUItSU5GIik7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJGb3VuZCBXRUItSU5GIGVudHJ5Iiwgd2ViSW5mRW50cnkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiV0VCLUlORiBlbnRyeSBpcyBhIERpckNvbnRleHQiLAorICAgICAgICAgICAgICAgICAgIHdlYkluZkVudHJ5IGluc3RhbmNlb2YgRGlyQ29udGV4dCk7CisgICAgICAgICAgICBEaXJDb250ZXh0IHdlYkluZkNvbnRleHQgPSAoRGlyQ29udGV4dCkgd2ViSW5mRW50cnk7CisKKyAgICAgICAgICAgIC8vIENoZWNrIHRoZSBjb250ZW50cyBvZiB0aGUgV0VCLUlORiBjb250ZXh0IGRpcmVjdGx5CisgICAgICAgICAgICBjaGVja0xpc3Qod2ViSW5mQ29udGV4dC5saXN0KCIiKSwgd2ViSW5mTmFtZXMpOworCisgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJOYW1pbmdFeGNlcHRpb246ICIgKyBlKTsKKyAgICAgICAgfQorCisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFdlIHNob3VsZCBiZSBhYmxlIHRvIGxpc3QgdGhlIGNvbnRlbnRzIG9mIHRoZSBXRUItSU5GIGVudHJ5LAorICAgICAqIGFuZCBsb2NhdGUgc29tZSBlbnRyaWVzIHdlIGtub3cgYXJlIHRoZXJlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RMaXN0V2ViSW5mSW5kaXJlY3QoKSB7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNoZWNrTGlzdChjb250ZXh0Lmxpc3QoIldFQi1JTkYiKSwgd2ViSW5mTmFtZXMpOworICAgICAgICB9IGNhdGNoIChOYW1pbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiTmFtaW5nRXhjZXB0aW9uOiAiICsgZSk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogV2Ugc2hvdWxkIGJlIGFibGUgdG8gbGlzdCB0aGUgYmluZGluZ3Mgb2YgdGhlIHRvcC1sZXZlbCBjb250ZXh0IGl0c2VsZiwKKyAgICAgKiBhbmQgbG9jYXRlIHNvbWUgZW50cmllcyB3ZSBrbm93IGFyZSB0aGVyZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGlzdEJpbmRpbmdzVG9wTGV2ZWwoKSB7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNoZWNrTGlzdEJpbmRpbmdzKGNvbnRleHQubGlzdEJpbmRpbmdzKCIiKSwgdG9wTGV2ZWxOYW1lcyk7CisgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJOYW1pbmdFeGNlcHRpb246ICIgKyBlKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBXZSBzaG91bGQgYmUgYWJsZSB0byBsaXN0IHRoZSBiaW5kaW5ncyBvZiB0aGUgV0VCLUlORiBlbnRyeSwKKyAgICAgKiBhbmQgbG9jYXRlIHNvbWUgZW50cmllcyB3ZSBrbm93IGFyZSB0aGVyZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGlzdEJpbmRpbmdzV2ViSW5mRGlyZWN0KCkgeworCisgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgIC8vIExvb2sgdXAgdGhlIFdFQi1JTkYgZW50cnkKKyAgICAgICAgICAgIE9iamVjdCB3ZWJJbmZFbnRyeSA9IGNvbnRleHQubG9va3VwKCJXRUItSU5GIik7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJGb3VuZCBXRUItSU5GIGVudHJ5Iiwgd2ViSW5mRW50cnkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiV0VCLUlORiBlbnRyeSBpcyBhIERpckNvbnRleHQiLAorICAgICAgICAgICAgICAgICAgIHdlYkluZkVudHJ5IGluc3RhbmNlb2YgRGlyQ29udGV4dCk7CisgICAgICAgICAgICBEaXJDb250ZXh0IHdlYkluZkNvbnRleHQgPSAoRGlyQ29udGV4dCkgd2ViSW5mRW50cnk7CisKKyAgICAgICAgICAgIC8vIENoZWNrIHRoZSBiaW5kaW5ncyBvZiB0aGUgV0VCLUlORiBjb250ZXh0IGRpcmVjdGx5CisgICAgICAgICAgICBjaGVja0xpc3RCaW5kaW5ncyh3ZWJJbmZDb250ZXh0Lmxpc3RCaW5kaW5ncygiIiksIHdlYkluZk5hbWVzKTsKKworICAgICAgICB9IGNhdGNoIChOYW1pbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiTmFtaW5nRXhjZXB0aW9uOiAiICsgZSk7CisgICAgICAgIH0KKworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBXZSBzaG91bGQgYmUgYWJsZSB0byBsaXN0IHRoZSBiaW5kaW5ncyBvZiB0aGUgV0VCLUlORiBlbnRyeSwKKyAgICAgKiBhbmQgbG9jYXRlIHNvbWUgZW50cmllcyB3ZSBrbm93IGFyZSB0aGVyZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGlzdEJpbmRpbmdzV2ViSW5mSW5kaXJlY3QoKSB7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNoZWNrTGlzdEJpbmRpbmdzKGNvbnRleHQubGlzdEJpbmRpbmdzKCJXRUItSU5GIiksIHdlYkluZk5hbWVzKTsKKyAgICAgICAgfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIk5hbWluZ0V4Y2VwdGlvbjogIiArIGUpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFN1cHBvcnQgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBDaGVjayB0aGUgcmVzdWx0cyBvZiBhIGxpc3QoKSBjYWxsIGFnYWluc3QgdGhlIHNwZWNpZmllZCBlbnRyeSBsaXN0LgorICAgICAqCisgICAgICogQHBhcmFtIGVudW0gVGhlIG5hbWluZyBlbnVtZXJhdGlvbiB3ZSBhcmUgY2hlY2tpbmcKKyAgICAgKiBAcGFyYW0gbGlzdCBUaGUgbGlzdCBvZiBlbnRyeSBuYW1lcyB3ZSBhcmUgZXhwZWN0aW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gb2NjdXJzCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tMaXN0KE5hbWluZ0VudW1lcmF0aW9uIG5lLCBTdHJpbmcgbGlzdFtdKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKworICAgICAgICBTdHJpbmcgY29udGV4dENsYXNzTmFtZSA9IGNvbnRleHQuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7CisKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiTmFtaW5nRW51bWVyYXRpb24gaXMgbm90IG51bGwiLCBuZSk7CisgICAgICAgIHdoaWxlIChuZS5oYXNNb3JlKCkpIHsKKworICAgICAgICAgICAgT2JqZWN0IG5leHQgPSBuZS5uZXh0KCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJsaXN0KCkgcmV0dXJucyBOYW1lQ2xhc3NQYWlyIGluc3RhbmNlcyIsCisgICAgICAgICAgICAgICAgICAgbmV4dCBpbnN0YW5jZW9mIE5hbWVDbGFzc1BhaXIpOworICAgICAgICAgICAgTmFtZUNsYXNzUGFpciBuY3AgPSAoTmFtZUNsYXNzUGFpcikgbmV4dDsKKworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiTmFtZSAnIiArIG5jcC5nZXROYW1lKCkgKyAiJyBpcyBleHBlY3RlZCIsCisgICAgICAgICAgICAgICAgICAgaXNMaXN0ZWQobmNwLmdldE5hbWUoKSwgbGlzdCkpOworCisgICAgICAgICAgICBpZiAoaXNEaXJDb250ZXh0KG5jcC5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiQ2xhc3MgJyIgKyBuY3AuZ2V0Q2xhc3NOYW1lKCkgKyAiJyBpcyAnIiArCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRDbGFzc05hbWUgKyAiJyIsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRDbGFzc05hbWUuZXF1YWxzKG5jcC5nZXRDbGFzc05hbWUoKSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhc3NlcnRUcnVlKCJSZWxhdGl2ZSBpcyAndHJ1ZSciLCBuY3AuaXNSZWxhdGl2ZSgpKTsKKworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENoZWNrIHRoZSByZXN1bHRzIG9mIGEgbGlzdEJpbmRpbmdzKCkgY2FsbCBhZ2FpbnN0IHRoZQorICAgICAqIHNwZWNpZmllZCBlbnRyeSBsaXN0LgorICAgICAqCisgICAgICogQHBhcmFtIGVudW0gVGhlIG5hbWluZyBlbnVtZXJhdGlvbiB3ZSBhcmUgY2hlY2tpbmcKKyAgICAgKiBAcGFyYW0gbGlzdCBUaGUgbGlzdCBvZiBlbnRyeSBuYW1lcyB3ZSBhcmUgZXhwZWN0aW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIE5hbWluZ0V4Y2VwdGlvbiBpZiBhIG5hbWluZyBleGNlcHRpb24gb2NjdXJzCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tMaXN0QmluZGluZ3MoTmFtaW5nRW51bWVyYXRpb24gbmUsIFN0cmluZyBsaXN0W10pCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworCisgICAgICAgIFN0cmluZyBjb250ZXh0Q2xhc3NOYW1lID0gY29udGV4dC5nZXRDbGFzcygpLmdldE5hbWUoKTsKKworICAgICAgICBhc3NlcnROb3ROdWxsKCJOYW1pbmdFbnVtZXJhdGlvbiBpcyBub3QgbnVsbCIsIG5lKTsKKyAgICAgICAgd2hpbGUgKG5lLmhhc01vcmUoKSkgeworCisgICAgICAgICAgICBPYmplY3QgbmV4dCA9IG5lLm5leHQoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoImxpc3RCaW5kaW5ncygpIHJldHVybnMgQmluZGluZyBpbnN0YW5jZXMiLAorICAgICAgICAgICAgICAgICAgIG5leHQgaW5zdGFuY2VvZiBCaW5kaW5nKTsKKyAgICAgICAgICAgIEJpbmRpbmcgYiA9IChCaW5kaW5nKSBuZXh0OworCisgICAgICAgICAgICBhc3NlcnRUcnVlKCJOYW1lICciICsgYi5nZXROYW1lKCkgKyAiJyBpcyBleHBlY3RlZCIsCisgICAgICAgICAgICAgICAgICAgaXNMaXN0ZWQoYi5nZXROYW1lKCksIGxpc3QpKTsKKworICAgICAgICAgICAgaWYgKGlzRGlyQ29udGV4dChiLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJDbGFzcyAnIiArIGIuZ2V0Q2xhc3NOYW1lKCkgKyAiJyBpcyAnIiArCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRDbGFzc05hbWUgKyAiJyIsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRDbGFzc05hbWUuZXF1YWxzKGIuZ2V0Q2xhc3NOYW1lKCkpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiUmVsYXRpdmUgaXMgJ3RydWUnIiwgYi5pc1JlbGF0aXZlKCkpOworCisgICAgICAgICAgICBPYmplY3Qgb2JqZWN0ID0gYi5nZXRPYmplY3QoKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoIk5hbWUgJyIgKyBiLmdldE5hbWUoKSArICInIGhhcyBhIG5vbi1udWxsIG9iamVjdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCk7CisgICAgICAgICAgICBpZihpc0RpckNvbnRleHQoYi5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAJYXNzZXJ0VHJ1ZSgiRW50cnkgJyIgKyBiLmdldE5hbWUoKSArICInIGlzIGEgRGlyQ29udGV4dCIsCisgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QgaW5zdGFuY2VvZiBEaXJDb250ZXh0KTsgICAgICAgICAgCQorICAgICAgICAgICAgfSAgZWxzZSB7CisgICAgICAgICAgICAJYXNzZXJ0VHJ1ZSgiRW50cnkgJyIgKyBiLmdldE5hbWUoKSArICInIGlzIGEgUmVzb3VyY2UiLAorICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QgaW5zdGFuY2VvZiBSZXNvdXJjZSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ2hlY2sgdGhlIGF0dHJpYnV0ZXMgYXNzb2NpYXRlZCB3aXRoIGEgV0VCLUlORiBlbnRyeS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhdHRycyBUaGUgYXR0cmlidXRlcyBmb3IgdGhpcyBlbnRyeQorICAgICAqIEBwYXJhbSBjcmVhdGlvbkRhdGUgVGhlIGNyZWF0aW9uIGRhdGUgZm9yIHRoaXMgZW50cnkKKyAgICAgKiBAcGFyYW0gY29udGVudExlbmd0aCBUaGUgY29udGVudCBsZW5ndGggZm9yIHRoaXMgZW50cnkKKyAgICAgKiBAcGFyYW0gZGlzcGxheU5hbWUgVGhlIGRpc3BsYXkgbmFtZSBmb3IgdGhpcyBlbnRyeQorICAgICAqIEBwYXJhbSBsYXN0TW9kaWZpZWREYXRlIFRoZSBsYXN0IG1vZGlmaWVkIGRhdGUgZm9yIHRoaXMgZW50cnkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja1dlYkluZkF0dHJpYnV0ZXMoQXR0cmlidXRlcyBhdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0ZSBjcmVhdGlvbkRhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgY29udGVudExlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRpc3BsYXlOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRlIGxhc3RNb2RpZmllZERhdGUpCisgICAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworCisgICAgICAgIGFzc2VydE5vdE51bGwoImdldEF0dHJpYnV0ZXMoKSByZXR1cm5lZCBub24tbnVsbCIsIGF0dHJzKTsKKworICAgICAgICBOYW1pbmdFbnVtZXJhdGlvbiBuZSA9IGF0dHJzLmdldEFsbCgpOworICAgICAgICBhc3NlcnROb3ROdWxsKCJnZXRBbGwoKSByZXR1cm5lZCBub24tbnVsbCIsIG5lKTsKKyAgICAgICAgd2hpbGUgKG5lLmhhc01vcmUoKSkgeworCisgICAgICAgICAgICBPYmplY3QgbmV4dCA9IG5lLm5leHQoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoImdldEFsbCgpIHJldHVybnMgQXR0cmlidXRlIGluc3RhbmNlcyIsCisgICAgICAgICAgICAgICAgICAgbmV4dCBpbnN0YW5jZW9mIEF0dHJpYnV0ZSk7CisgICAgICAgICAgICBBdHRyaWJ1dGUgYXR0ciA9IChBdHRyaWJ1dGUpIG5leHQ7CisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGF0dHIuZ2V0SUQoKTsKKyAgICAgICAgICAgIGludCBpbmRleCA9IGdldEluZGV4KG5hbWUsIHdlYkluZkF0dHJzKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIldFQi1JTkYgYXR0cmlidXRlICciICsgbmFtZSArICInIGlzIGV4cGVjdGVkIiwKKyAgICAgICAgICAgICAgICAgICBpbmRleCA+PSAwKTsKKyAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGF0dHIuZ2V0KCk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJnZXQoKSByZXR1cm5lZCBub24tbnVsbCIsIHZhbHVlKTsKKworICAgICAgICAgICAgaWYgKG5hbWUuZXF1YWxzKCJjcmVhdGlvbmRhdGUiKSkgeworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIkNyZWF0aW9uIGRhdGUgaXMgYSBkYXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgaW5zdGFuY2VvZiBEYXRlKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJDcmVhdGlvbiBkYXRlIGVxdWFscyAiICsgY3JlYXRpb25EYXRlLAorICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGlvbkRhdGUuZXF1YWxzKChEYXRlKSB2YWx1ZSkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscygiZGlzcGxheW5hbWUiKSkgeworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIkRpc3BsYXkgbmFtZSBpcyBhIHN0cmluZyIsCisgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJEaXNwbGF5IG5hbWUgZXF1YWxzICIgKyBkaXNwbGF5TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheU5hbWUuZXF1YWxzKChTdHJpbmcpIHZhbHVlKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKCJnZXRjb250ZW50bGVuZ3RoIikpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJDb250ZW50IGxlbmd0aCBpcyBhIGxvbmciLAorICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBpbnN0YW5jZW9mIExvbmcpOworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIkNvbnRlbnQgbGVuZ3RoIGVxdWFscyAiICsgY29udGVudExlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29udGVudExlbmd0aCA9PSAoKExvbmcpIHZhbHVlKS5sb25nVmFsdWUoKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKCJnZXRsYXN0bW9kaWZpZWQiKSkgeworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIkxhc3QgbW9kaWZpZWQgZGF0ZSBpcyBhIGRhdGUiLAorICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBpbnN0YW5jZW9mIERhdGUpOworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIkxhc3QgbW9kaWZpZWQgZGF0ZSBpcyAiICsgbGFzdE1vZGlmaWVkRGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgbGFzdE1vZGlmaWVkRGF0ZS5lcXVhbHMoKERhdGUpIHZhbHVlKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDaGVjayB0aGUgYXR0cmlidXRlcyBhc3NvY2lhdGVkIHdpdGggYSBXRUItSU5GL3dlYi54bWwgZW50cnkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXR0cnMgVGhlIGF0dHJpYnV0ZXMgZm9yIHRoaXMgZW50cnkKKyAgICAgKiBAcGFyYW0gY3JlYXRpb25EYXRlIFRoZSBjcmVhdGlvbiBkYXRlIGZvciB0aGlzIGVudHJ5CisgICAgICogQHBhcmFtIGNvbnRlbnRMZW5ndGggVGhlIGNvbnRlbnQgbGVuZ3RoIGZvciB0aGlzIGVudHJ5CisgICAgICogQHBhcmFtIGRpc3BsYXlOYW1lIFRoZSBkaXNwbGF5IG5hbWUgZm9yIHRoaXMgZW50cnkKKyAgICAgKiBAcGFyYW0gbGFzdE1vZGlmaWVkRGF0ZSBUaGUgbGFzdCBtb2RpZmllZCBkYXRlIGZvciB0aGlzIGVudHJ5CisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tXZWJYbWxBdHRyaWJ1dGVzKEF0dHJpYnV0ZXMgYXR0cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGUgY3JlYXRpb25EYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGNvbnRlbnRMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBkaXNwbGF5TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0ZSBsYXN0TW9kaWZpZWREYXRlKQorICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKworICAgICAgICBhc3NlcnROb3ROdWxsKCJnZXRBdHRyaWJ1dGVzKCkgcmV0dXJuZWQgbm9uLW51bGwiLCBhdHRycyk7CisKKyAgICAgICAgTmFtaW5nRW51bWVyYXRpb24gbmUgPSBhdHRycy5nZXRBbGwoKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiZ2V0QWxsKCkgcmV0dXJuZWQgbm9uLW51bGwiLCBuZSk7CisgICAgICAgIHdoaWxlIChuZS5oYXNNb3JlKCkpIHsKKworICAgICAgICAgICAgT2JqZWN0IG5leHQgPSBuZS5uZXh0KCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJnZXRBbGwoKSByZXR1cm5zIEF0dHJpYnV0ZSBpbnN0YW5jZXMiLAorICAgICAgICAgICAgICAgICAgIG5leHQgaW5zdGFuY2VvZiBBdHRyaWJ1dGUpOworICAgICAgICAgICAgQXR0cmlidXRlIGF0dHIgPSAoQXR0cmlidXRlKSBuZXh0OworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBhdHRyLmdldElEKCk7CisgICAgICAgICAgICBpbnQgaW5kZXggPSBnZXRJbmRleChuYW1lLCB3ZWJYbWxBdHRycyk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJXRUItSU5GL3dlYi54bWwgYXR0cmlidXRlICciICsgbmFtZSArICInIGlzIGV4cGVjdGVkIiwKKyAgICAgICAgICAgICAgICAgICBpbmRleCA+PSAwKTsKKyAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGF0dHIuZ2V0KCk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJnZXQoKSByZXR1cm5lZCBub24tbnVsbCIsIHZhbHVlKTsKKworICAgICAgICAgICAgaWYgKG5hbWUuZXF1YWxzKCJjcmVhdGlvbmRhdGUiKSkgeworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIkNyZWF0aW9uIGRhdGUgaXMgYSBkYXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgaW5zdGFuY2VvZiBEYXRlKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJDcmVhdGlvbiBkYXRlIGVxdWFscyAiICsgY3JlYXRpb25EYXRlLAorICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGlvbkRhdGUuZXF1YWxzKChEYXRlKSB2YWx1ZSkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscygiZGlzcGxheW5hbWUiKSkgeworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIkRpc3BsYXkgbmFtZSBpcyBhIHN0cmluZyIsCisgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJEaXNwbGF5IG5hbWUgZXF1YWxzICIgKyBkaXNwbGF5TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheU5hbWUuZXF1YWxzKChTdHJpbmcpIHZhbHVlKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKCJnZXRjb250ZW50bGVuZ3RoIikpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJDb250ZW50IGxlbmd0aCBpcyBhIGxvbmciLAorICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBpbnN0YW5jZW9mIExvbmcpOworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIkNvbnRlbnQgbGVuZ3RoIGVxdWFscyAiICsgY29udGVudExlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29udGVudExlbmd0aCA9PSAoKExvbmcpIHZhbHVlKS5sb25nVmFsdWUoKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKCJnZXRsYXN0bW9kaWZpZWQiKSkgeworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIkxhc3QgbW9kaWZpZWQgZGF0ZSBpcyBhIGRhdGUiLAorICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBpbnN0YW5jZW9mIERhdGUpOworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIkxhc3QgbW9kaWZpZWQgZGF0ZSBpcyAiICsgbGFzdE1vZGlmaWVkRGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgbGFzdE1vZGlmaWVkRGF0ZS5lcXVhbHMoKERhdGUpIHZhbHVlKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBzcGVjaWZpZWQgbmFtZSBpbiB0aGUgc3BlY2lmaWVkIGxpc3QsIG9yCisgICAgICogLTEgaWYgdGhlIG5hbWUgaXMgbm90IHByZXNlbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIHRvIGJlIGxvb2tlZCB1cAorICAgICAqIEBwYXJhbSBsaXN0IExpc3Qgb2YgbmFtZXMgdG8gYmUgY2hlY2tlZAorICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgZ2V0SW5kZXgoU3RyaW5nIG5hbWUsIFN0cmluZyBsaXN0W10pIHsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChuYW1lLmVxdWFscyhsaXN0W2ldKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKGkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoLTEpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBJcyBhbiBlbnRyeSBvZiB0aGUgc3BlY2lmaWVkIG5hbWUgc3VwcG9zZWQgdG8gYmUgYSBEaXJDb250ZXh0PworICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSB0byBiZSBjaGVja2VkCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNEaXJDb250ZXh0KFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgcmV0dXJuIChpc0xpc3RlZChuYW1lLCBkaXJDb250ZXh0TmFtZXMpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3BlY2lmaWVkIG5hbWUgaXMgZm91bmQgaW4gdGhlCisgICAgICogc3BlY2lmaWVkIGxpc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIHRvIGJlIGxvb2tlZCB1cAorICAgICAqIEBwYXJhbSBsaXN0IExpc3QgdG8gYmUgbG9va2VkIHVwIGludG8KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0xpc3RlZChTdHJpbmcgbmFtZSwgU3RyaW5nIGxpc3RbXSkgeworCisgICAgICAgIHJldHVybiAoZ2V0SW5kZXgobmFtZSwgbGlzdCkgPj0gMCk7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy90ZXN0L29yZy9hcGFjaGUvbmFtaW5nL3Jlc291cmNlcy9GaWxlRGlyQ29udGV4dFRlc3RDYXNlLmphdmEgYi9jb250YWluZXIvY2F0YWxpbmEvc3JjL3Rlc3Qvb3JnL2FwYWNoZS9uYW1pbmcvcmVzb3VyY2VzL0ZpbGVEaXJDb250ZXh0VGVzdENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGZlZWM4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL2NhdGFsaW5hL3NyYy90ZXN0L29yZy9hcGFjaGUvbmFtaW5nL3Jlc291cmNlcy9GaWxlRGlyQ29udGV4dFRlc3RDYXNlLmphdmEKQEAgLTAsMCArMSwxNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8gCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm5hbWluZy5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKKworaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1pbmdFeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC5uYW1pbmcuZGlyZWN0b3J5LkF0dHJpYnV0ZTsKK2ltcG9ydCBqYXZheC5uYW1pbmcuZGlyZWN0b3J5LkF0dHJpYnV0ZXM7CitpbXBvcnQgamF2YXgubmFtaW5nLmRpcmVjdG9yeS5EaXJDb250ZXh0OworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7CisKKworLyoqCisgKiBVbml0IHRlc3RzIGZvciA8Y29kZT5vcmcuYXBhY2hlLm5hbWluZy5yZXNvdXJjZXMuRmlsZURpckNvbnRleHQ8L2NvZGU+LgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgRmlsZURpckNvbnRleHRUZXN0Q2FzZSBleHRlbmRzIEJhc2VEaXJDb250ZXh0VGVzdENhc2UgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgdGVzdCBjYXNlLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgdGVzdCBjYXNlCisgICAgICovCisgICAgcHVibGljIEZpbGVEaXJDb250ZXh0VGVzdENhc2UoU3RyaW5nIG5hbWUpIHsKKworICAgICAgICBzdXBlcihuYW1lKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE92ZXJhbGwgVGVzdCBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFNldCB1cCBpbnN0YW5jZSB2YXJpYWJsZXMgcmVxdWlyZWQgYnkgdGhpcyB0ZXN0IGNhc2UuICBUaGlzIG1ldGhvZAorICAgICAqIDxzdHJvbmc+TVVTVDwvc3Ryb25nPiBiZSBpbXBsZW1lbnRlZCBieSBhIHN1YmNsYXNzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworCisgICAgICAgIGNvbnRleHQgPSBuZXcgRmlsZURpckNvbnRleHQoKTsKKyAgICAgICAgKChGaWxlRGlyQ29udGV4dCkgY29udGV4dCkuc2V0RG9jQmFzZShkb2NCYXNlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB0ZXN0cyBpbmNsdWRlZCBpbiB0aGlzIHRlc3Qgc3VpdGUuICBUaGlzIG1ldGhvZAorICAgICAqIDxzdHJvbmc+TVVTVDwvc3Ryb25nPiBiZSBpbXBsZW1lbnRlZCBieSBhIHN1YmNsYXNzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKKworICAgICAgICByZXR1cm4gKG5ldyBUZXN0U3VpdGUoRmlsZURpckNvbnRleHRUZXN0Q2FzZS5jbGFzcykpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUZWFyIGRvd24gaW5zdGFuY2UgdmFyaWFibGVzIHJlcXVpcmVkIGJ5IHRoaXMgdGVzdCBjYXNlLiAgVGhpcyBtZXRob2QKKyAgICAgKiA8c3Ryb25nPk1VU1Q8L3N0cm9uZz4gYmUgaW1wbGVtZW50ZWQgYnkgYSBzdWJjbGFzcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKKworICAgICAgICBjb250ZXh0ID0gbnVsbDsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluZGl2aWR1YWwgVGVzdCBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFRlc3QgdGhlIGF0dHJpYnV0ZXMgcmV0dXJuZWQgZm9yIHRoZSA8Y29kZT5XRUItSU5GPC9jb2RlPiBlbnRyeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QXR0cmlidXRlc1dlYkluZigpIHsKKworICAgICAgICB0cnkgeworCisgICAgICAgICAgICAvLyBJZGVudGlmeSBhIGxvY2FsIGZpbGUgb2JqZWN0IGZvciBXRUItSU5GCisgICAgICAgICAgICBGaWxlIGRvY0Jhc2VGaWxlID0gbmV3IEZpbGUoZG9jQmFzZSk7CisgICAgICAgICAgICBGaWxlIHdlYkluZkZpbGUgPSBuZXcgRmlsZShkb2NCYXNlRmlsZSwgIldFQi1JTkYiKTsKKworICAgICAgICAgICAgLy8gTG9vayB1cCB0aGUgYXR0cmlidXRlcyBmb3IgdGhlIFdFQi1JTkYgZW50cnkKKyAgICAgICAgICAgIEF0dHJpYnV0ZXMgYXR0cmlidXRlcyA9IGNvbnRleHQuZ2V0QXR0cmlidXRlcygiV0VCLUlORiIpOworCisgICAgICAgICAgICAvLyBFbnVtZXJhdGUgYW5kIGNoZWNrIHRoZSBhdHRyaWJ1dGVzIGZvciB0aGlzIGVudHJ5CisgICAgICAgICAgICBjaGVja1dlYkluZkF0dHJpYnV0ZXMoYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGF0ZSh3ZWJJbmZGaWxlLmxhc3RNb2RpZmllZCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWJJbmZGaWxlLmxlbmd0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXRUItSU5GIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGF0ZSh3ZWJJbmZGaWxlLmxhc3RNb2RpZmllZCgpKSk7CisKKyAgICAgICAgfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGUpIHsKKworICAgICAgICAgICAgZmFpbCgiTmFtaW5nRXhjZXB0aW9uOiAiICsgZSk7CisKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUZXN0IHRoZSBhdHRyaWJ1dGVzIHJldHVybmVkIGZvciB0aGUgPGNvZGU+V0VCLUlORi93ZWIueG1sPC9jb2RlPgorICAgICAqIGVudHJ5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBdHRyaWJ1dGVzV2ViWG1sKCkgeworCisgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgIC8vIElkZW50aWZ5IGEgbG9jYWwgZmlsZSBvYmplY3QgZm9yIFdFQi1JTkYvd2ViLnhtbAorICAgICAgICAgICAgRmlsZSBkb2NCYXNlRmlsZSA9IG5ldyBGaWxlKGRvY0Jhc2UpOworICAgICAgICAgICAgRmlsZSB3ZWJJbmZGaWxlID0gbmV3IEZpbGUoZG9jQmFzZUZpbGUsICJXRUItSU5GIik7CisgICAgICAgICAgICBGaWxlIHdlYlhtbEZpbGUgPSBuZXcgRmlsZSh3ZWJJbmZGaWxlLCAid2ViLnhtbCIpOworCisgICAgICAgICAgICAvLyBMb29rIHVwIHRoZSBhdHRyaWJ1dGVzIGZvciB0aGUgV0VCLUlORiBlbnRyeQorICAgICAgICAgICAgQXR0cmlidXRlcyBhdHRyaWJ1dGVzID0gY29udGV4dC5nZXRBdHRyaWJ1dGVzKCJXRUItSU5GL3dlYi54bWwiKTsKKworICAgICAgICAgICAgLy8gRW51bWVyYXRlIGFuZCBjaGVjayB0aGUgYXR0cmlidXRlcyBmb3IgdGhpcyBlbnRyeQorICAgICAgICAgICAgY2hlY2tXZWJYbWxBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERhdGUod2ViWG1sRmlsZS5sYXN0TW9kaWZpZWQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2ViWG1sRmlsZS5sZW5ndGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2ViLnhtbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERhdGUod2ViWG1sRmlsZS5sYXN0TW9kaWZpZWQoKSkpOworCisgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisKKyAgICAgICAgICAgIGZhaWwoIk5hbWluZ0V4Y2VwdGlvbjogICIgKyBlKTsKKworICAgICAgICB9CisKKyAgICB9CisKKworfQorCisKKwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL2NhdGFsaW5hL3NyYy90ZXN0L29yZy9hcGFjaGUvbmFtaW5nL3Jlc291cmNlcy9XQVJEaXJDb250ZXh0VGVzdENhc2UuamF2YSBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvdGVzdC9vcmcvYXBhY2hlL25hbWluZy9yZXNvdXJjZXMvV0FSRGlyQ29udGV4dFRlc3RDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc5MDgwNgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9jYXRhbGluYS9zcmMvdGVzdC9vcmcvYXBhY2hlL25hbWluZy9yZXNvdXJjZXMvV0FSRGlyQ29udGV4dFRlc3RDYXNlLmphdmEKQEAgLTAsMCArMSwxNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8gCisKKworcGFja2FnZSBvcmcuYXBhY2hlLm5hbWluZy5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IGphdmEudXRpbC5EYXRlOworCitpbXBvcnQgamF2YS51dGlsLmphci5KYXJFbnRyeTsKK2ltcG9ydCBqYXZhLnV0aWwuamFyLkphckZpbGU7CisKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtaW5nRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXgubmFtaW5nLmRpcmVjdG9yeS5BdHRyaWJ1dGU7CitpbXBvcnQgamF2YXgubmFtaW5nLmRpcmVjdG9yeS5BdHRyaWJ1dGVzOworaW1wb3J0IGphdmF4Lm5hbWluZy5kaXJlY3RvcnkuRGlyQ29udGV4dDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworCisKKy8qKgorICogVW5pdCB0ZXN0cyBmb3IgPGNvZGU+b3JnLmFwYWNoZS5uYW1pbmcucmVzb3VyY2VzLldBUkRpckNvbnRleHQ8L2NvZGU+LgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgV0FSRGlyQ29udGV4dFRlc3RDYXNlIGV4dGVuZHMgQmFzZURpckNvbnRleHRUZXN0Q2FzZSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyB0ZXN0IGNhc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSB0ZXN0IGNhc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgV0FSRGlyQ29udGV4dFRlc3RDYXNlKFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgc3VwZXIobmFtZSk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBPdmVyYWxsIFRlc3QgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBTZXQgdXAgaW5zdGFuY2UgdmFyaWFibGVzIHJlcXVpcmVkIGJ5IHRoaXMgdGVzdCBjYXNlLiAgVGhpcyBtZXRob2QKKyAgICAgKiA8c3Ryb25nPk1VU1Q8L3N0cm9uZz4gYmUgaW1wbGVtZW50ZWQgYnkgYSBzdWJjbGFzcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKworICAgICAgICBjb250ZXh0ID0gbmV3IFdBUkRpckNvbnRleHQoKTsKKyAgICAgICAgKChXQVJEaXJDb250ZXh0KSBjb250ZXh0KS5zZXREb2NCYXNlKGRvY0Jhc2UpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHRlc3RzIGluY2x1ZGVkIGluIHRoaXMgdGVzdCBzdWl0ZS4gIFRoaXMgbWV0aG9kCisgICAgICogPHN0cm9uZz5NVVNUPC9zdHJvbmc+IGJlIGltcGxlbWVudGVkIGJ5IGEgc3ViY2xhc3MuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeworCisgICAgICAgIHJldHVybiAobmV3IFRlc3RTdWl0ZShXQVJEaXJDb250ZXh0VGVzdENhc2UuY2xhc3MpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGVhciBkb3duIGluc3RhbmNlIHZhcmlhYmxlcyByZXF1aXJlZCBieSB0aGlzIHRlc3QgY2FzZS4gIFRoaXMgbWV0aG9kCisgICAgICogPHN0cm9uZz5NVVNUPC9zdHJvbmc+IGJlIGltcGxlbWVudGVkIGJ5IGEgc3ViY2xhc3MuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB7CisKKyAgICAgICAgY29udGV4dCA9IG51bGw7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbmRpdmlkdWFsIFRlc3QgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBUZXN0IHRoZSBhdHRyaWJ1dGVzIHJldHVybmVkIGZvciB0aGUgPGNvZGU+V0VCLUlORjwvY29kZT4gZW50cnkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEdldEF0dHJpYnV0ZXNXZWJJbmYoKSB7CisKKyAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgLy8gTG9vayB1cCB0aGUgYXR0cmlidXRlcyBvZiB0aGlzIFdBUiBmaWxlIGVudHJ5CisgICAgICAgICAgICBKYXJGaWxlIGphckZpbGUgPSBuZXcgSmFyRmlsZShkb2NCYXNlKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoIkNyZWF0ZWQgSmFyRmlsZSBmb3IgIiArIGRvY0Jhc2UsIGphckZpbGUpOworICAgICAgICAgICAgSmFyRW50cnkgamFyRW50cnkgPQorICAgICAgICAgICAgICAgIChKYXJFbnRyeSkgamFyRmlsZS5nZXRFbnRyeSgiV0VCLUlORiIpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiQ3JlYXRlZCBKYXJFbnRyeSBmb3IgV0VCLUlORiIsIGphckVudHJ5KTsKKworICAgICAgICAgICAgLy8gTG9vayB1cCB0aGUgYXR0cmlidXRlcyBmb3IgdGhlIFdFQi1JTkYgZW50cnkKKyAgICAgICAgICAgIEF0dHJpYnV0ZXMgYXR0cmlidXRlcyA9IGNvbnRleHQuZ2V0QXR0cmlidXRlcygiV0VCLUlORiIpOworCisgICAgICAgICAgICAvLyBFbnVtZXJhdGUgYW5kIGNoZWNrIHRoZSBhdHRyaWJ1dGVzIGZvciB0aGlzIGVudHJ5CisgICAgICAgICAgICBjaGVja1dlYkluZkF0dHJpYnV0ZXMoYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGF0ZShqYXJFbnRyeS5nZXRUaW1lKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphckVudHJ5LmdldFNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV0VCLUlORiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERhdGUoamFyRW50cnkuZ2V0VGltZSgpKSk7CisKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCisgICAgICAgICAgICBmYWlsKCJJT0V4Y2VwdGlvbjogIiArIGUpOworCisgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisKKyAgICAgICAgICAgIGZhaWwoIk5hbWluZ0V4Y2VwdGlvbjogIiArIGUpOworCisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGVzdCB0aGUgYXR0cmlidXRlcyByZXR1cm5lZCBmb3IgdGhlIDxjb2RlPldFQi1JTkYvd2ViLnhtbDwvY29kZT4KKyAgICAgKiBlbnRyeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QXR0cmlidXRlc1dlYlhtbCgpIHsKKworICAgICAgICB0cnkgeworCisgICAgICAgICAgICAvLyBMb29rIHVwIHRoZSBhdHRyaWJ1dGVzIG9mIHRoaXMgV0FSIGZpbGUgZW50cnkKKyAgICAgICAgICAgIEphckZpbGUgamFyRmlsZSA9IG5ldyBKYXJGaWxlKGRvY0Jhc2UpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiQ3JlYXRlZCBKYXJGaWxlIGZvciAiICsgZG9jQmFzZSwgamFyRmlsZSk7CisgICAgICAgICAgICBKYXJFbnRyeSBqYXJFbnRyeSA9CisgICAgICAgICAgICAgICAgKEphckVudHJ5KSBqYXJGaWxlLmdldEVudHJ5KCJXRUItSU5GL3dlYi54bWwiKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoIkNyZWF0ZWQgSmFyRW50cnkgZm9yIFdFQi1JTkYvd2ViLnhtbCIsIGphckVudHJ5KTsKKworICAgICAgICAgICAgLy8gTG9vayB1cCB0aGUgYXR0cmlidXRlcyBmb3IgdGhlIFdFQi1JTkYvd2ViLnhtbCBlbnRyeQorICAgICAgICAgICAgQXR0cmlidXRlcyBhdHRyaWJ1dGVzID0gY29udGV4dC5nZXRBdHRyaWJ1dGVzKCJXRUItSU5GL3dlYi54bWwiKTsKKworICAgICAgICAgICAgLy8gRW51bWVyYXRlIGFuZCBjaGVjayB0aGUgYXR0cmlidXRlcyBmb3IgdGhpcyBlbnRyeQorICAgICAgICAgICAgY2hlY2tXZWJYbWxBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERhdGUoamFyRW50cnkuZ2V0VGltZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXJFbnRyeS5nZXRTaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndlYi54bWwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEYXRlKGphckVudHJ5LmdldFRpbWUoKSkpOworCisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb246ICIgKyBlKTsKKworICAgICAgICB9IGNhdGNoIChOYW1pbmdFeGNlcHRpb24gZSkgeworCisgICAgICAgICAgICBmYWlsKCJOYW1pbmdFeGNlcHRpb246ICAiICsgZSk7CisKKyAgICAgICAgfQorCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9ldGMvbXg0ai5saWNlbnNlIGIvY29udGFpbmVyL2V0Yy9teDRqLmxpY2Vuc2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjgxZWJlZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9ldGMvbXg0ai5saWNlbnNlCkBAIC0wLDAgKzEsNTEgQEAKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBUaGUgTVg0SiBMaWNlbnNlLCBWZXJzaW9uIDEuMAorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMSBNWDRKLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKKyAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKKyAqICAgICAgICBNWDRKIHByb2plY3QgKGh0dHA6Ly9teDRqLnNvdXJjZWZvcmdlLm5ldCkuIgorICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAorICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KKyAqCisgKiA0LiBUaGUgbmFtZXMgIk1YNEoiIGFuZCAibXg0aiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKKyAqICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYmlvcm5fc3RlZWRvbUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQKKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiTVg0SiIsCisgKiAgICBub3IgbWF5ICJNWDRKIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIFNpbW9uZSBCb3JkZXQuCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQ0FSTE9TIFFVSVJPWiBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgorICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55CisgKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgTVg0Si4gIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uCisgKiBNWDRKLCBwbGVhc2Ugc2VlCisgKiA8aHR0cDovL214NGouc291cmNlZm9yZ2UubmV0Pi4KKyAqLwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvYnVpbGQueG1sIGIvY29udGFpbmVyL21vZHVsZXMvYnVpbGQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjZDYzZDMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9idWlsZC54bWwKQEAgLTAsMCArMSw3MiBAQAorPHByb2plY3QgbmFtZT0iTW9kdWxlcyIgZGVmYXVsdD0iZGlzdCIgYmFzZWRpcj0iLiI+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PSBJbml0aWFsaXplIFByb3BlcnR5IFZhbHVlcyA9PT09PT09PT09PT09PT09PT09IC0tPgorCisgIDwhLS0gU2VlICJidWlsZC5wcm9wZXJ0aWVzLnNhbXBsZSIgaW4gdGhlIHRvcCBsZXZlbCBkaXJlY3RvcnkgZm9yIGFsbCAgICAgLS0+CisgIDwhLS0gcHJvcGVydHkgdmFsdWVzIHlvdSBtdXN0IGN1c3RvbWl6ZSBmb3Igc3VjY2Vzc2Z1bCBidWlsZGluZyEhISAgICAgICAgLS0+CisgIDwhLS1wcm9wZXJ0eSBmaWxlPSJidWlsZC5wcm9wZXJ0aWVzIi8+CisgIDxwcm9wZXJ0eSBmaWxlPSIuLi9idWlsZC5wcm9wZXJ0aWVzIi8+CisgIDxwcm9wZXJ0eSBmaWxlPSIke3VzZXIuaG9tZX0vYnVpbGQucHJvcGVydGllcyIvLS0+CisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09IEJVSUxEOiBDcmVhdGUgRGlyZWN0b3JpZXMgPT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJidWlsZC1wcmVwYXJlIj4KKyAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJqZGsxLjQucHJlc2VudCIgY2xhc3NuYW1lPSJqYXZhLm5pby5CdWZmZXIiIC8+CisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09IEJVSUxEOiBDb21waWxlIFN1YnByb2plY3RzID09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPCEtLSBBZGQgYSBuZXcgdGFyZ2V0IGZvciBlYWNoIG1vZHVsZSBzdWJwcm9qZWN0IC0tPgorCisgIDx0YXJnZXQgbmFtZT0iY2x1c3RlciIgaWY9ImpkazEuNC5wcmVzZW50Ij4KKyAgICA8YW50IGRpcj0iJHtiYXNlZGlyfS9jbHVzdGVyIiB0YXJnZXQ9ImRpc3QiLz4KKyAgPC90YXJnZXQ+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09IEJVSUxEOiBDb21waWxlIFNlcnZlciBDb21wb25lbnRzID09PT09PT09PT09PT09PT09IC0tPgorICA8IS0tIFVwZGF0ZSB0aGUgZGVwZW5kcyBsaXN0IGZvciBlYWNoIHN1YnByb2plY3QgLS0+CisgIDx0YXJnZXQgbmFtZT0iYnVpbGQiIGRlcGVuZHM9ImJ1aWxkLXByZXBhcmUsY2x1c3RlciIvPgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PSBCVUlMRDogQ2xlYW4gRGlyZWN0b3J5ID09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJidWlsZC1jbGVhbiI+CisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PSBCVUlMRDogUmVidWlsZCBFdmVyeXRoaW5nID09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJhbGwiIGRlcGVuZHM9ImJ1aWxkLWNsZWFuLGRpc3QiLz4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT0gREVQTE9ZOiBEZXBsb3kgV2ViYXBwcyBQcm9qZWN0cyA9PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iZGVwbG95IiBkZXBlbmRzPSJkaXN0IgorICAgZGVzY3JpcHRpb249IkJ1aWxkIGFuZCBkZXBsb3kgTW9kdWxlcyBjb21wb25lbnQiPgorCisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PSBESVNUOiBDcmVhdGUgRGlzdHJpYnV0aW9uIEZpbGVzID09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJkaXN0IiBkZXBlbmRzPSJidWlsZCIvPgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PSBESVNUOiBDbGVhbiBEaXJlY3RvcnkgPT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJkaXN0LWNsZWFuIj4KKyAgPC90YXJnZXQ+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PT0gQ29udmVuaWVudCBTeW5vbnltcyA9PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImNsZWFuIiBkZXBlbmRzPSJidWlsZC1jbGVhbixkaXN0LWNsZWFuIgorICAgZGVzY3JpcHRpb249IkNsZWFuIGJ1aWxkIGFuZCBkaXN0IGRpcmVjdG9yaWVzIi8+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PSBURVNUOiBDb21waWxlIFVuaXQgVGVzdHMgPT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImJ1aWxkLXRlc3RzIiBkZXBlbmRzPSJkaXN0IiBpZj0ianVuaXQucHJlc2VudCI+CisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT0gVEVTVDogRXhlY3V0ZSBVbml0IFRlc3RzID09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJ0ZXN0IiBpZj0ianVuaXQucHJlc2VudCIKKyAgIGRlc2NyaXB0aW9uPSJSdW4gYWxsIHVuaXQgdGVzdCBjYXNlcyI+CisgIDwvdGFyZ2V0PgorCisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvYnVpbGQueG1sIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9idWlsZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZmOGY1NwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvYnVpbGQueG1sCkBAIC0wLDAgKzEsMTM0IEBACis8cHJvamVjdCBuYW1lPSJDbHVzdGVyIiBkZWZhdWx0PSJkaXN0IiBiYXNlZGlyPSIuIj4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09IEluaXRpYWxpemUgUHJvcGVydHkgVmFsdWVzID09PT09PT09PT09PT09PT09PT0gLS0+CisKKyAgPCEtLSBTZWUgImJ1aWxkLnByb3BlcnRpZXMuc2FtcGxlIiBpbiB0aGUgdG9wIGxldmVsIGRpcmVjdG9yeSBmb3IgYWxsICAgICAtLT4KKyAgPCEtLSBwcm9wZXJ0eSB2YWx1ZXMgeW91IG11c3QgY3VzdG9taXplIGZvciBzdWNjZXNzZnVsIGJ1aWxkaW5nISEhICAgICAgICAtLT4KKyAgPCEtLXByb3BlcnR5IGZpbGU9ImJ1aWxkLnByb3BlcnRpZXMiLz4KKyAgPHByb3BlcnR5IGZpbGU9Ii4uL2J1aWxkLnByb3BlcnRpZXMiLz4KKyAgPHByb3BlcnR5IGZpbGU9IiR7dXNlci5ob21lfS9idWlsZC5wcm9wZXJ0aWVzIi8tLT4KKworICA8IS0tIEJ1aWxkIERlZmF1bHRzIC0tPgorICA8cHJvcGVydHkgbmFtZT0iY2F0YWxpbmEuYnVpbGQiICAgICBsb2NhdGlvbj0iLi4vLi4iLz4KKyAgPHByb3BlcnR5IG5hbWU9ImNsdXN0ZXIuYnVpbGQiICAgICB2YWx1ZT0iJHtjYXRhbGluYS5ob21lfS9tb2R1bGVzL2NsdXN0ZXIvYnVpbGQiLz4KKyAgPHByb3BlcnR5IG5hbWU9ImNsdXN0ZXIuZGlzdCIgICAgIHZhbHVlPSIke2NhdGFsaW5hLmhvbWV9L21vZHVsZXMvY2x1c3Rlci9kaXN0Ii8+CisKKyAgICA8IS0tIENvbnN0cnVjdCBDYXRhbGluYSBjbGFzc3BhdGggLS0+CisgIDxwYXRoIGlkPSJjbHVzdGVyLmNsYXNzcGF0aCI+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NhdGFsaW5hLmJ1aWxkfS9zZXJ2ZXIvbGliL2NhdGFsaW5hLmphciIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjYXRhbGluYS5idWlsZH0vc2VydmVyL2xpYi90b21jYXQtdXRpbC5qYXIiLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y29tbW9ucy1sb2dnaW5nLmphcn0iLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7am14Lmphcn0iLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y2F0YWxpbmEuYnVpbGR9L2NvbW1vbi9saWIvc2VydmxldC1hcGkuamFyIi8+CisgIDwvcGF0aD4KKworICAgIDwhLS0gU291cmNlIHBhdGggLS0+CisgIDxwYXRoIGlkPSJqYXZhZG9jLnNvdXJjZXBhdGgiPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0ic3JjL3NoYXJlIi8+CisgIDwvcGF0aD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PSBCVUlMRDogU2V0IGNvbXBpbGUgZmxhZ3MgPT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iZmxhZ3MiPgorICAgIDwhLS0gSkRLIGZsYWdzIC0tPgorICAgIDxhdmFpbGFibGUgcHJvcGVydHk9Impkay4xLjIucHJlc2VudCIgY2xhc3NuYW1lPSJqYXZhLnV0aWwuSGFzaE1hcCIgLz4KKyAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJqZGsuMS4zLnByZXNlbnQiIAorICAgICBjbGFzc25hbWU9ImphdmEubGFuZy5yZWZsZWN0LlByb3h5IiAvPgorICAgIDxhdmFpbGFibGUgcHJvcGVydHk9Impkay4xLjQucHJlc2VudCIgY2xhc3NuYW1lPSJqYXZhLm5pby5CdWZmZXIiIC8+CisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09IEJVSUxEOiBTZXQgY29tcGlsZSBmbGFncyA9PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJmbGFncy5kaXNwbGF5IiBkZXBlbmRzPSJmbGFncyIgdW5sZXNzPSJmbGFncy5oaWRlIj4KKworICAgIDxlY2hvIG1lc3NhZ2U9Ii0tLSBCdWlsZCBlbnZpcm9ubWVudCBmb3IgQ2F0YWxpbmEgLS0tIiAvPgorCisgICAgPGVjaG8gbWVzc2FnZT0iSWYgJHtwcm9wZXJ0eV9uYW1lfSBpcyBkaXNwbGF5ZWQsIHRoZW4gdGhlIHByb3BlcnR5IGlzIG5vdCBzZXQpIiAvPgorCisgICAgPGVjaG8gbWVzc2FnZT0iLS0tIEJ1aWxkIG9wdGlvbnMgLS0tIiAvPgorICAgIDxlY2hvIG1lc3NhZ2U9ImZ1bGwuZGlzdD0ke2Z1bGwuZGlzdH0iIC8+CisgICAgPGVjaG8gbWVzc2FnZT0iYnVpbGQuc3lzY2xhc3NwYXRoPSR7YnVpbGQuc3lzY2xhc3NwYXRofSIgLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJjb21waWxlLmRlYnVnPSR7Y29tcGlsZS5kZWJ1Z30iIC8+CisgICAgPGVjaG8gbWVzc2FnZT0iY29tcGlsZS5kZXByZWNhdGlvbj0ke2NvbXBpbGUuZGVwcmVjYXRpb259IiAvPgorICAgIDxlY2hvIG1lc3NhZ2U9ImNvbXBpbGUub3B0aW1pemU9JHtjb21waWxlLm9wdGltaXplfSIgLz4KKworICAgIDxlY2hvIG1lc3NhZ2U9Ii0tLSBBbnQgRmxhZ3MgLS0tIiAvPgorICAgIDxlY2hvIG1lc3NhZ2U9IiZsdDtzdHlsZSZndDsgdGFzayBhdmFpbGFibGUgKHJlcXVpcmVkKT0ke3N0eWxlLmF2YWlsYWJsZX0iIC8+CisKKyAgICA8ZWNobyBtZXNzYWdlPSItLS0gSkRLIC0tLSIgLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJqZGsuMS4yLnByZXNlbnQ9JHtqZGsuMS4yLnByZXNlbnR9IiAvPgorICAgIDxlY2hvIG1lc3NhZ2U9Impkay4xLjMucHJlc2VudD0ke2pkay4xLjMucHJlc2VudH0iIC8+CisgICAgPGVjaG8gbWVzc2FnZT0iamRrLjEuNC5wcmVzZW50PSR7amRrLjEuNC5wcmVzZW50fSIgLz4KKworICA8L3RhcmdldD4KKworICA8IS0tID09PT09PT09PT09PT09PT09PT0gQlVJTEQ6IENyZWF0ZSBEaXJlY3RvcmllcyA9PT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImJ1aWxkLXByZXBhcmUiPgorICAgIDxta2RpciBkaXI9IiR7Y2F0YWxpbmEuYnVpbGR9Ii8+CisgICAgPG1rZGlyIGRpcj0iJHtjYXRhbGluYS5idWlsZH0vY2xhc3NlcyIvPgorICAgIDxta2RpciBkaXI9IiR7Y2x1c3Rlci5kaXN0fSIvPgorICA8L3RhcmdldD4KKworCisKKworICA8IS0tID09PT09PT09PT09PT09PT0gQlVJTEQ6IENvbXBpbGUgQ2F0YWxpbmEgQ29tcG9uZW50cyA9PT09PT09PT09PT09PT09IC0tPgorICAKKyAgPHRhcmdldCBuYW1lPSJidWlsZC1jYXRhbGluYS1jbHVzdGVyIiBkZXBlbmRzPSJidWlsZC1wcmVwYXJlIj4KKyAgICA8IS0tIENvbXBpbGUgaW50ZXJuYWwgc2VydmVyIGNvbXBvbmVudHMgLS0+CisgICAgPGphdmFjIHNyY2Rpcj0iJHtiYXNlZGlyfS9zcmMvc2hhcmUiIGRlc3RkaXI9IiR7Y2F0YWxpbmEuYnVpbGR9L2NsYXNzZXMiCisgICAgICAgICAgIGRlYnVnPSIke2NvbXBpbGUuZGVidWd9IiBkZXByZWNhdGlvbj0iJHtjb21waWxlLmRlcHJlY2F0aW9ufSIKKyAgICAgICAgICAgb3B0aW1pemU9IiR7Y29tcGlsZS5vcHRpbWl6ZX0iCisgICAgICAgICAgIGV4Y2x1ZGVzPSIqKi9DVlMvKioiPgorICAgICAgPGNsYXNzcGF0aCByZWZpZD0iY2x1c3Rlci5jbGFzc3BhdGgiIC8+CisgICAgPC9qYXZhYz4KKyAgICA8Y29weSBmaWxlPSIke2Jhc2VkaXJ9L3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvTG9jYWxTdHJpbmdzLnByb3BlcnRpZXMiCisgICAgCSAgdG9maWxlPSIke2NhdGFsaW5hLmJ1aWxkfS9jbGFzc2VzL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9Mb2NhbFN0cmluZ3MucHJvcGVydGllcyIvPgorICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PSBCVUlMRDogQ3JlYXRlIENhdGFsaW5hIEphdmFkb2NzID09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iamF2YWRvYyI+CisgICAgPGRlbGV0ZSBkaXI9IiR7Y2F0YWxpbmEuYnVpbGR9L2phdmFkb2MiLz4KKyAgICA8bWtkaXIgZGlyPSIke2NhdGFsaW5hLmJ1aWxkfS9qYXZhZG9jIi8+CisgICAgPGphdmFkb2MgcGFja2FnZW5hbWVzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLiosb3JnLmFwYWNoZS5uYW1pbmcuKiIKKyAgICAgIGNsYXNzcGF0aHJlZj0iY2F0YWxpbmEuY2xhc3NwYXRoIgorICAgICAgc291cmNlcGF0aHJlZj0iamF2YWRvYy5zb3VyY2VwYXRoIgorICAgICAgZGVzdGRpcj0iJHtjYXRhbGluYS5idWlsZH0vamF2YWRvYyIKKyAgICAgIGF1dGhvcj0idHJ1ZSIKKyAgICAgIHZlcnNpb249InRydWUiCisgICAgICB3aW5kb3d0aXRsZT0iQ2F0YWxpbmEgSW50ZXJuYWwgQVBJIERvY3VtZW50YXRpb24iCisgICAgICBkb2N0aXRsZT0iQ2F0YWxpbmEgQVBJIgorICAgICAgYm90dG9tPSJDb3B5cmlnaHQgJiMxNjk7IDIwMDAtMjAwMiBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIgorICAgIC8+CisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PSBCVUlMRDogQ2xlYW4gRGlyZWN0b3J5ID09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJidWlsZC1jbGVhbiI+CisgICAgPGRlbGV0ZSBkaXI9IiR7Y2F0YWxpbmEuYnVpbGR9Ii8+CisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PSBCVUlMRDogUmVidWlsZCBFdmVyeXRoaW5nID09PT09PT09PT09PT09PT09PT09PSAtLT4KKworCisKKworICA8IS0tID09PT09PT09PT09PT09PT0gRElTVDogQ3JlYXRlIERpc3RyaWJ1dGlvbiA9PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImRpc3QiIGRlcGVuZHM9ImJ1aWxkLWNhdGFsaW5hLWNsdXN0ZXIiPgorICAgIAorICAgIDxqYXIgZGVzdGZpbGU9IiR7Y2x1c3Rlci5kaXN0fS9jYXRhbGluYS1jbHVzdGVyLmphciIKKyAgICAgICAgIGJhc2VkaXI9IiR7Y2F0YWxpbmEuYnVpbGR9L2NsYXNzZXMiPgorICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci8qKiIgLz4KKyAgICA8L2phcj4KKyAgPC90YXJnZXQ+CisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT0gRElTVDogQ2xlYW4gRGlyZWN0b3J5ID09PT09PT09PT09PT09PT09PT09PSAtLT4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PSBDb252ZW5pZW50IFN5bm9ueW1zID09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9ldGMvY2x1c3Rlci1zZXJ2ZXIueG1sIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9ldGMvY2x1c3Rlci1zZXJ2ZXIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiYjVlZDAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL2V0Yy9jbHVzdGVyLXNlcnZlci54bWwKQEAgLTAsMCArMSwzNjggQEAKKzwhLS0gRXhhbXBsZSBTZXJ2ZXIgQ29uZmlndXJhdGlvbiBGaWxlICAtIFNlYXJjaCBmb3IgQ2x1c3Rlci0tPgorPCEtLSBOb3RlIHRoYXQgY29tcG9uZW50IGVsZW1lbnRzIGFyZSBuZXN0ZWQgY29ycmVzcG9uZGluZyB0byB0aGVpcgorICAgICBwYXJlbnQtY2hpbGQgcmVsYXRpb25zaGlwcyB3aXRoIGVhY2ggb3RoZXIgLS0+CisKKzwhLS0gQSAiU2VydmVyIiBpcyBhIHNpbmdsZXRvbiBlbGVtZW50IHRoYXQgcmVwcmVzZW50cyB0aGUgZW50aXJlIEpWTSwKKyAgICAgd2hpY2ggbWF5IGNvbnRhaW4gb25lIG9yIG1vcmUgIlNlcnZpY2UiIGluc3RhbmNlcy4gIFRoZSBTZXJ2ZXIKKyAgICAgbGlzdGVucyBmb3IgYSBzaHV0ZG93biBjb21tYW5kIG9uIHRoZSBpbmRpY2F0ZWQgcG9ydC4KKworICAgICBOb3RlOiAgQSAiU2VydmVyIiBpcyBub3QgaXRzZWxmIGEgIkNvbnRhaW5lciIsIHNvIHlvdSBtYXkgbm90CisgICAgIGRlZmluZSBzdWJjb21wb25lbnRzIHN1Y2ggYXMgIlZhbHZlcyIgb3IgIkxvZ2dlcnMiIGF0IHRoaXMgbGV2ZWwuCisgLS0+CisKKzxTZXJ2ZXIgcG9ydD0iODAwNSIgc2h1dGRvd249IlNIVVRET1dOIiBkZWJ1Zz0iMCI+CisKKworICA8IS0tIENvbW1lbnQgdGhlc2UgZW50cmllcyBvdXQgdG8gZGlzYWJsZSBKTVggTUJlYW5zIHN1cHBvcnQgLS0+CisgIDwhLS0gWW91IG1heSBhbHNvIGNvbmZpZ3VyZSBjdXN0b20gY29tcG9uZW50cyAoZS5nLiBWYWx2ZXMvUmVhbG1zKSBieSAKKyAgICAgICBpbmNsdWRpbmcgeW91ciBvd24gbWJlYW4tZGVzY3JpcHRvciBmaWxlKHMpLCBhbmQgc2V0dGluZyB0aGUgCisgICAgICAgImRlc2NyaXB0b3JzIiBhdHRyaWJ1dGUgdG8gcG9pbnQgdG8gYSAnOycgc2VwZXJhdGVkIGxpc3Qgb2YgcGF0aHMKKyAgICAgICAoaW4gdGhlIENsYXNzTG9hZGVyIHNlbnNlKSBvZiBmaWxlcyB0byBhZGQgdG8gdGhlIGRlZmF1bHQgbGlzdC4KKyAgICAgICBlLmcuIGRlc2NyaXB0b3JzPSIvY29tL215ZmlybS9teXBhY2thZ2UvbWJlYW4tZGVzY3JpcHRvci54bWwiCisgIC0tPgorICA8TGlzdGVuZXIgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLm1iZWFucy5TZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lciIKKyAgICAgICAgICAgIGRlYnVnPSIwIi8+CisgIDxMaXN0ZW5lciBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEubWJlYW5zLkdsb2JhbFJlc291cmNlc0xpZmVjeWNsZUxpc3RlbmVyIgorICAgICAgICAgICAgZGVidWc9IjAiLz4KKyAgCisgIDwhLS0gR2xvYmFsIEpOREkgcmVzb3VyY2VzIC0tPgorICA8R2xvYmFsTmFtaW5nUmVzb3VyY2VzPgorCisgICAgPCEtLSBUZXN0IGVudHJ5IGZvciBkZW1vbnN0cmF0aW9uIHB1cnBvc2VzIC0tPgorICAgIDxFbnZpcm9ubWVudCBuYW1lPSJzaW1wbGVWYWx1ZSIgdHlwZT0iamF2YS5sYW5nLkludGVnZXIiIHZhbHVlPSIzMCIvPgorCisgICAgPCEtLSBFZGl0YWJsZSB1c2VyIGRhdGFiYXNlIHRoYXQgY2FuIGFsc28gYmUgdXNlZCBieQorICAgICAgICAgVXNlckRhdGFiYXNlUmVhbG0gdG8gYXV0aGVudGljYXRlIHVzZXJzIC0tPgorICAgIDxSZXNvdXJjZSBuYW1lPSJVc2VyRGF0YWJhc2UiIGF1dGg9IkNvbnRhaW5lciIKKyAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5Vc2VyRGF0YWJhc2UiCisgICAgICAgZGVzY3JpcHRpb249IlVzZXIgZGF0YWJhc2UgdGhhdCBjYW4gYmUgdXBkYXRlZCBhbmQgc2F2ZWQiPgorICAgIDwvUmVzb3VyY2U+CisgICAgPFJlc291cmNlUGFyYW1zIG5hbWU9IlVzZXJEYXRhYmFzZSI+CisgICAgICA8cGFyYW1ldGVyPgorICAgICAgICA8bmFtZT5mYWN0b3J5PC9uYW1lPgorICAgICAgICA8dmFsdWU+b3JnLmFwYWNoZS5jYXRhbGluYS51c2Vycy5NZW1vcnlVc2VyRGF0YWJhc2VGYWN0b3J5PC92YWx1ZT4KKyAgICAgIDwvcGFyYW1ldGVyPgorICAgICAgPHBhcmFtZXRlcj4KKyAgICAgICAgPG5hbWU+cGF0aG5hbWU8L25hbWU+CisgICAgICAgIDx2YWx1ZT5jb25mL3RvbWNhdC11c2Vycy54bWw8L3ZhbHVlPgorICAgICAgPC9wYXJhbWV0ZXI+CisgICAgPC9SZXNvdXJjZVBhcmFtcz4KKworICA8L0dsb2JhbE5hbWluZ1Jlc291cmNlcz4KKworICA8IS0tIEEgIlNlcnZpY2UiIGlzIGEgY29sbGVjdGlvbiBvZiBvbmUgb3IgbW9yZSAiQ29ubmVjdG9ycyIgdGhhdCBzaGFyZQorICAgICAgIGEgc2luZ2xlICJDb250YWluZXIiIChhbmQgdGhlcmVmb3JlIHRoZSB3ZWIgYXBwbGljYXRpb25zIHZpc2libGUKKyAgICAgICB3aXRoaW4gdGhhdCBDb250YWluZXIpLiAgTm9ybWFsbHksIHRoYXQgQ29udGFpbmVyIGlzIGFuICJFbmdpbmUiLAorICAgICAgIGJ1dCB0aGlzIGlzIG5vdCByZXF1aXJlZC4KKworICAgICAgIE5vdGU6ICBBICJTZXJ2aWNlIiBpcyBub3QgaXRzZWxmIGEgIkNvbnRhaW5lciIsIHNvIHlvdSBtYXkgbm90CisgICAgICAgZGVmaW5lIHN1YmNvbXBvbmVudHMgc3VjaCBhcyAiVmFsdmVzIiBvciAiTG9nZ2VycyIgYXQgdGhpcyBsZXZlbC4KKyAgIC0tPgorCisgIDwhLS0gRGVmaW5lIHRoZSBUb21jYXQgU3RhbmQtQWxvbmUgU2VydmljZSAtLT4KKyAgPFNlcnZpY2UgbmFtZT0iVG9tY2F0LVN0YW5kYWxvbmUiPgorCisgICAgPCEtLSBBICJDb25uZWN0b3IiIHJlcHJlc2VudHMgYW4gZW5kcG9pbnQgYnkgd2hpY2ggcmVxdWVzdHMgYXJlIHJlY2VpdmVkCisgICAgICAgICBhbmQgcmVzcG9uc2VzIGFyZSByZXR1cm5lZC4gIEVhY2ggQ29ubmVjdG9yIHBhc3NlcyByZXF1ZXN0cyBvbiB0byB0aGUKKyAgICAgICAgIGFzc29jaWF0ZWQgIkNvbnRhaW5lciIgKG5vcm1hbGx5IGFuIEVuZ2luZSkgZm9yIHByb2Nlc3NpbmcuCisKKyAgICAgICAgIEJ5IGRlZmF1bHQsIGEgbm9uLVNTTCBIVFRQLzEuMSBDb25uZWN0b3IgaXMgZXN0YWJsaXNoZWQgb24gcG9ydCA4MDgwLgorICAgICAgICAgWW91IGNhbiBhbHNvIGVuYWJsZSBhbiBTU0wgSFRUUC8xLjEgQ29ubmVjdG9yIG9uIHBvcnQgODQ0MyBieQorICAgICAgICAgZm9sbG93aW5nIHRoZSBpbnN0cnVjdGlvbnMgYmVsb3cgYW5kIHVuY29tbWVudGluZyB0aGUgc2Vjb25kIENvbm5lY3RvcgorICAgICAgICAgZW50cnkuICBTU0wgc3VwcG9ydCByZXF1aXJlcyB0aGUgZm9sbG93aW5nIHN0ZXBzIChzZWUgdGhlIFNTTCBDb25maWcKKyAgICAgICAgIEhPV1RPIGluIHRoZSBUb21jYXQgNSBkb2N1bWVudGF0aW9uIGJ1bmRsZSBmb3IgbW9yZSBkZXRhaWxlZAorICAgICAgICAgaW5zdHJ1Y3Rpb25zKToKKyAgICAgICAgICogSWYgeW91ciBKREsgdmVyc2lvbiAxLjMgb3IgcHJpb3IsIGRvd25sb2FkIGFuZCBpbnN0YWxsIEpTU0UgMS4wLjIgb3IKKyAgICAgICAgICAgbGF0ZXIsIGFuZCBwdXQgdGhlIEpBUiBmaWxlcyBpbnRvICIkSkFWQV9IT01FL2pyZS9saWIvZXh0Ii4KKyAgICAgICAgICogRXhlY3V0ZToKKyAgICAgICAgICAgICAlSkFWQV9IT01FJVxiaW5ca2V5dG9vbCAtZ2Vua2V5IC1hbGlhcyB0b21jYXQgLWtleWFsZyBSU0EgKFdpbmRvd3MpCisgICAgICAgICAgICAgJEpBVkFfSE9NRS9iaW4va2V5dG9vbCAtZ2Vua2V5IC1hbGlhcyB0b21jYXQgLWtleWFsZyBSU0EgIChVbml4KQorICAgICAgICAgICB3aXRoIGEgcGFzc3dvcmQgdmFsdWUgb2YgImNoYW5nZWl0IiBmb3IgYm90aCB0aGUgY2VydGlmaWNhdGUgYW5kCisgICAgICAgICAgIHRoZSBrZXlzdG9yZSBpdHNlbGYuCisKKyAgICAgICAgIEJ5IGRlZmF1bHQsIEROUyBsb29rdXBzIGFyZSBlbmFibGVkIHdoZW4gYSB3ZWIgYXBwbGljYXRpb24gY2FsbHMKKyAgICAgICAgIHJlcXVlc3QuZ2V0UmVtb3RlSG9zdCgpLiAgVGhpcyBjYW4gaGF2ZSBhbiBhZHZlcnNlIGltcGFjdCBvbgorICAgICAgICAgcGVyZm9ybWFuY2UsIHNvIHlvdSBjYW4gZGlzYWJsZSBpdCBieSBzZXR0aW5nIHRoZQorICAgICAgICAgImVuYWJsZUxvb2t1cHMiIGF0dHJpYnV0ZSB0byAiZmFsc2UiLiAgV2hlbiBETlMgbG9va3VwcyBhcmUgZGlzYWJsZWQsCisgICAgICAgICByZXF1ZXN0LmdldFJlbW90ZUhvc3QoKSB3aWxsIHJldHVybiB0aGUgU3RyaW5nIHZlcnNpb24gb2YgdGhlCisgICAgICAgICBJUCBhZGRyZXNzIG9mIHRoZSByZW1vdGUgY2xpZW50LgorICAgIC0tPgorCisgICAgPCEtLSBEZWZpbmUgYSBub24tU1NMIENveW90ZSBIVFRQLzEuMSBDb25uZWN0b3Igb24gcG9ydCA4MDgwIC0tPgorICAgIDxDb25uZWN0b3IgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNveW90ZS50b21jYXQ1LkNveW90ZUNvbm5lY3RvciIKKyAgICAgICAgICAgICAgIHBvcnQ9IjgwODAiIG1pblByb2Nlc3NvcnM9IjUiIG1heFByb2Nlc3NvcnM9IjEwMCIKKyAgICAgICAgICAgICAgIGVuYWJsZUxvb2t1cHM9InRydWUiIHJlZGlyZWN0UG9ydD0iODQ0MyIgYWNjZXB0Q291bnQ9IjEwMCIKKyAgICAgICAgICAgICAgIGRlYnVnPSIwIiBjb25uZWN0aW9uVGltZW91dD0iMjAwMDAiIAorICAgICAgICAgICAgICAgZGlzYWJsZVVwbG9hZFRpbWVvdXQ9InRydWUiIC8+CisgICAgPCEtLSBOb3RlIDogVG8gZGlzYWJsZSBjb25uZWN0aW9uIHRpbWVvdXRzLCBzZXQgY29ubmVjdGlvblRpbWVvdXQgdmFsdWUKKyAgICAgdG8gLTEgLS0+CisKKyAgICA8IS0tIERlZmluZSBhIFNTTCBDb3lvdGUgSFRUUC8xLjEgQ29ubmVjdG9yIG9uIHBvcnQgODQ0MyAtLT4KKyAgICA8IS0tCisgICAgPENvbm5lY3RvciBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY295b3RlLnRvbWNhdDUuQ295b3RlQ29ubmVjdG9yIgorICAgICAgICAgICAgICAgcG9ydD0iODQ0MyIgbWluUHJvY2Vzc29ycz0iNSIgbWF4UHJvY2Vzc29ycz0iNzUiCisgICAgICAgICAgICAgICBlbmFibGVMb29rdXBzPSJ0cnVlIiBkaXNhYmxlVXBsb2FkVGltZW91dD0idHJ1ZSIKKyAgICAgICAgICAgYWNjZXB0Q291bnQ9IjEwMCIgZGVidWc9IjAiIHNjaGVtZT0iaHR0cHMiIHNlY3VyZT0idHJ1ZSI+CisgICAgICA8RmFjdG9yeSBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY295b3RlLnRvbWNhdDUuQ295b3RlU2VydmVyU29ja2V0RmFjdG9yeSIKKyAgICAgICAgICAgICAgIGNsaWVudEF1dGg9ImZhbHNlIiBwcm90b2NvbD0iVExTIiAvPgorICAgIDwvQ29ubmVjdG9yPgorICAgIC0tPgorCisgICAgPCEtLSBEZWZpbmUgYSBDb3lvdGUvSksyIEFKUCAxLjMgQ29ubmVjdG9yIG9uIHBvcnQgODAwOSAtLT4KKyAgICA8Q29ubmVjdG9yIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jb3lvdGUudG9tY2F0NS5Db3lvdGVDb25uZWN0b3IiCisgICAgICAgICAgICAgICBwb3J0PSI4MDA5IiBtaW5Qcm9jZXNzb3JzPSI1IiBtYXhQcm9jZXNzb3JzPSI3NSIKKyAgICAgICAgICAgICAgIGVuYWJsZUxvb2t1cHM9InRydWUiIHJlZGlyZWN0UG9ydD0iODQ0MyIKKyAgICAgICAgICAgICAgIGFjY2VwdENvdW50PSIxMCIgZGVidWc9IjAiCisgICAgICAgICAgICAgICBwcm90b2NvbEhhbmRsZXJDbGFzc05hbWU9Im9yZy5hcGFjaGUuamsuc2VydmVyLkprQ295b3RlSGFuZGxlciIvPgorCisgICAgPCEtLSBEZWZpbmUgYSBQcm94aWVkIEhUVFAvMS4xIENvbm5lY3RvciBvbiBwb3J0IDgwODIgLS0+CisgICAgPCEtLSBTZWUgcHJveHkgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB1c2luZyB0aGlzLiAtLT4KKyAgICA8IS0tCisgICAgPENvbm5lY3RvciBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY295b3RlLnRvbWNhdDUuQ295b3RlQ29ubmVjdG9yIgorICAgICAgICAgICAgICAgcG9ydD0iODA4MiIgbWluUHJvY2Vzc29ycz0iNSIgbWF4UHJvY2Vzc29ycz0iNzUiCisgICAgICAgICAgICAgICBlbmFibGVMb29rdXBzPSJ0cnVlIgorICAgICAgICAgICAgICAgYWNjZXB0Q291bnQ9IjEwMCIgZGVidWc9IjAiIGNvbm5lY3Rpb25UaW1lb3V0PSIyMDAwMCIKKyAgICAgICAgICAgICAgIHByb3h5UG9ydD0iODAiIGRpc2FibGVVcGxvYWRUaW1lb3V0PSJ0cnVlIiAvPgorICAgIC0tPgorCisgICAgPCEtLSBBbiBFbmdpbmUgcmVwcmVzZW50cyB0aGUgZW50cnkgcG9pbnQgKHdpdGhpbiBDYXRhbGluYSkgdGhhdCBwcm9jZXNzZXMKKyAgICAgICAgIGV2ZXJ5IHJlcXVlc3QuICBUaGUgRW5naW5lIGltcGxlbWVudGF0aW9uIGZvciBUb21jYXQgc3RhbmQgYWxvbmUKKyAgICAgICAgIGFuYWx5emVzIHRoZSBIVFRQIGhlYWRlcnMgaW5jbHVkZWQgd2l0aCB0aGUgcmVxdWVzdCwgYW5kIHBhc3NlcyB0aGVtCisgICAgICAgICBvbiB0byB0aGUgYXBwcm9wcmlhdGUgSG9zdCAodmlydHVhbCBob3N0KS4gLS0+CisKKyAgICA8IS0tIFlvdSBzaG91bGQgc2V0IGp2bVJvdXRlIHRvIHN1cHBvcnQgbG9hZC1iYWxhbmNpbmcgdmlhIEpLL0pLMiBpZSA6CisgICAgPEVuZ2luZSBuYW1lPSJTdGFuZGFsb25lIiBkZWZhdWx0SG9zdD0ibG9jYWxob3N0IiBkZWJ1Zz0iMCIgam12Um91dGU9Imp2bTEiPiAgICAgICAgIAorICAgIC0tPiAKKyAgICAgICAgIAorICAgIDwhLS0gRGVmaW5lIHRoZSB0b3AgbGV2ZWwgY29udGFpbmVyIGluIG91ciBjb250YWluZXIgaGllcmFyY2h5IC0tPgorICAgIDxFbmdpbmUgbmFtZT0iU3RhbmRhbG9uZSIgZGVmYXVsdEhvc3Q9ImxvY2FsaG9zdCIgZGVidWc9IjAiPgorCisgICAgICA8IS0tIFRoZSByZXF1ZXN0IGR1bXBlciB2YWx2ZSBkdW1wcyB1c2VmdWwgZGVidWdnaW5nIGluZm9ybWF0aW9uIGFib3V0CisgICAgICAgICAgIHRoZSByZXF1ZXN0IGhlYWRlcnMgYW5kIGNvb2tpZXMgdGhhdCB3ZXJlIHJlY2VpdmVkLCBhbmQgdGhlIHJlc3BvbnNlCisgICAgICAgICAgIGhlYWRlcnMgYW5kIGNvb2tpZXMgdGhhdCB3ZXJlIHNlbnQsIGZvciBhbGwgcmVxdWVzdHMgcmVjZWl2ZWQgYnkKKyAgICAgICAgICAgdGhpcyBpbnN0YW5jZSBvZiBUb21jYXQuICBJZiB5b3UgY2FyZSBvbmx5IGFib3V0IHJlcXVlc3RzIHRvIGEKKyAgICAgICAgICAgcGFydGljdWxhciB2aXJ0dWFsIGhvc3QsIG9yIGEgcGFydGljdWxhciBhcHBsaWNhdGlvbiwgbmVzdCB0aGlzCisgICAgICAgICAgIGVsZW1lbnQgaW5zaWRlIHRoZSBjb3JyZXNwb25kaW5nIDxIb3N0PiBvciA8Q29udGV4dD4gZW50cnkgaW5zdGVhZC4KKworICAgICAgICAgICBGb3IgYSBzaW1pbGFyIG1lY2hhbmlzbSB0aGF0IGlzIHBvcnRhYmxlIHRvIGFsbCBTZXJ2bGV0IDIuNAorICAgICAgICAgICBjb250YWluZXJzLCBjaGVjayBvdXQgdGhlICJSZXF1ZXN0RHVtcGVyRmlsdGVyIiBGaWx0ZXIgaW4gdGhlCisgICAgICAgICAgIGV4YW1wbGUgYXBwbGljYXRpb24gKHRoZSBzb3VyY2UgZm9yIHRoaXMgZmlsdGVyIG1heSBiZSBmb3VuZCBpbgorICAgICAgICAgICAiJENBVEFMSU5BX0hPTUUvd2ViYXBwcy9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvZmlsdGVycyIpLgorCisgICAgICAgICAgIFJlcXVlc3QgZHVtcGluZyBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LiAgVW5jb21tZW50IHRoZSBmb2xsb3dpbmcKKyAgICAgICAgICAgZWxlbWVudCB0byBlbmFibGUgaXQuIC0tPgorICAgICAgPCEtLQorICAgICAgPFZhbHZlIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS52YWx2ZXMuUmVxdWVzdER1bXBlclZhbHZlIi8+CisgICAgICAtLT4KKworICAgICAgPCEtLSBHbG9iYWwgbG9nZ2VyIHVubGVzcyBvdmVycmlkZGVuIGF0IGxvd2VyIGxldmVscyAtLT4KKyAgICAgIDxMb2dnZXIgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmxvZ2dlci5GaWxlTG9nZ2VyIgorICAgICAgICAgICAgICBwcmVmaXg9ImNhdGFsaW5hX2xvZy4iIHN1ZmZpeD0iLnR4dCIKKyAgICAgICAgICAgICAgdGltZXN0YW1wPSJ0cnVlIi8+CisKKyAgICAgIDwhLS0gQmVjYXVzZSB0aGlzIFJlYWxtIGlzIGhlcmUsIGFuIGluc3RhbmNlIHdpbGwgYmUgc2hhcmVkIGdsb2JhbGx5IC0tPgorCisgICAgICA8IS0tIFRoaXMgUmVhbG0gdXNlcyB0aGUgVXNlckRhdGFiYXNlIGNvbmZpZ3VyZWQgaW4gdGhlIGdsb2JhbCBKTkRJCisgICAgICAgICAgIHJlc291cmNlcyB1bmRlciB0aGUga2V5ICJVc2VyRGF0YWJhc2UiLiAgQW55IGVkaXRzCisgICAgICAgICAgIHRoYXQgYXJlIHBlcmZvcm1lZCBhZ2FpbnN0IHRoaXMgVXNlckRhdGFiYXNlIGFyZSBpbW1lZGlhdGVseQorICAgICAgICAgICBhdmFpbGFibGUgZm9yIHVzZSBieSB0aGUgUmVhbG0uICAtLT4KKyAgICAgIDxSZWFsbSBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEucmVhbG0uVXNlckRhdGFiYXNlUmVhbG0iCisgICAgICAgICAgICAgICAgIGRlYnVnPSIwIiByZXNvdXJjZU5hbWU9IlVzZXJEYXRhYmFzZSIvPgorCisgICAgICA8IS0tIENvbW1lbnQgb3V0IHRoZSBvbGQgcmVhbG0gYnV0IGxlYXZlIGhlcmUgZm9yIG5vdyBpbiBjYXNlIHdlCisgICAgICAgICAgIG5lZWQgdG8gZ28gYmFjayBxdWlja2x5IC0tPgorICAgICAgPCEtLQorICAgICAgPFJlYWxtIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5yZWFsbS5NZW1vcnlSZWFsbSIgLz4KKyAgICAgIC0tPgorCisgICAgICA8IS0tIFJlcGxhY2UgdGhlIGFib3ZlIFJlYWxtIHdpdGggb25lIG9mIHRoZSBmb2xsb3dpbmcgdG8gZ2V0IGEgUmVhbG0KKyAgICAgICAgICAgc3RvcmVkIGluIGEgZGF0YWJhc2UgYW5kIGFjY2Vzc2VkIHZpYSBKREJDIC0tPgorCisgICAgICA8IS0tCisgICAgICA8UmVhbG0gIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5yZWFsbS5KREJDUmVhbG0iIGRlYnVnPSI5OSIKKyAgICAgICAgICAgICBkcml2ZXJOYW1lPSJvcmcuZ2p0Lm1tLm15c3FsLkRyaXZlciIKKyAgICAgICAgICBjb25uZWN0aW9uVVJMPSJqZGJjOm15c3FsOi8vbG9jYWxob3N0L2F1dGhvcml0eSIKKyAgICAgICAgIGNvbm5lY3Rpb25OYW1lPSJ0ZXN0IiBjb25uZWN0aW9uUGFzc3dvcmQ9InRlc3QiCisgICAgICAgICAgICAgIHVzZXJUYWJsZT0idXNlcnMiIHVzZXJOYW1lQ29sPSJ1c2VyX25hbWUiIHVzZXJDcmVkQ29sPSJ1c2VyX3Bhc3MiCisgICAgICAgICAgdXNlclJvbGVUYWJsZT0idXNlcl9yb2xlcyIgcm9sZU5hbWVDb2w9InJvbGVfbmFtZSIgLz4KKyAgICAgIC0tPgorCisgICAgICA8IS0tCisgICAgICA8UmVhbG0gIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5yZWFsbS5KREJDUmVhbG0iIGRlYnVnPSI5OSIKKyAgICAgICAgICAgICBkcml2ZXJOYW1lPSJvcmFjbGUuamRiYy5kcml2ZXIuT3JhY2xlRHJpdmVyIgorICAgICAgICAgIGNvbm5lY3Rpb25VUkw9ImpkYmM6b3JhY2xlOnRoaW46QG50c2VydmVyOjE1MjE6T1JDTCIKKyAgICAgICAgIGNvbm5lY3Rpb25OYW1lPSJzY290dCIgY29ubmVjdGlvblBhc3N3b3JkPSJ0aWdlciIKKyAgICAgICAgICAgICAgdXNlclRhYmxlPSJ1c2VycyIgdXNlck5hbWVDb2w9InVzZXJfbmFtZSIgdXNlckNyZWRDb2w9InVzZXJfcGFzcyIKKyAgICAgICAgICB1c2VyUm9sZVRhYmxlPSJ1c2VyX3JvbGVzIiByb2xlTmFtZUNvbD0icm9sZV9uYW1lIiAvPgorICAgICAgLS0+CisKKyAgICAgIDwhLS0KKyAgICAgIDxSZWFsbSAgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtLkpEQkNSZWFsbSIgZGVidWc9Ijk5IgorICAgICAgICAgICAgIGRyaXZlck5hbWU9InN1bi5qZGJjLm9kYmMuSmRiY09kYmNEcml2ZXIiCisgICAgICAgICAgY29ubmVjdGlvblVSTD0iamRiYzpvZGJjOkNBVEFMSU5BIgorICAgICAgICAgICAgICB1c2VyVGFibGU9InVzZXJzIiB1c2VyTmFtZUNvbD0idXNlcl9uYW1lIiB1c2VyQ3JlZENvbD0idXNlcl9wYXNzIgorICAgICAgICAgIHVzZXJSb2xlVGFibGU9InVzZXJfcm9sZXMiIHJvbGVOYW1lQ29sPSJyb2xlX25hbWUiIC8+CisgICAgICAtLT4KKworICAgICAgPCEtLSBEZWZpbmUgdGhlIGRlZmF1bHQgdmlydHVhbCBob3N0IC0tPgorICAgICAgPEhvc3QgbmFtZT0ibG9jYWxob3N0IiBkZWJ1Zz0iMCIgYXBwQmFzZT0id2ViYXBwcyIKKyAgICAgICB1bnBhY2tXQVJzPSJ0cnVlIiBhdXRvRGVwbG95PSJ0cnVlIj4KKyAgICAgICAKKyAgICAgICAgCisgICAgICAgIDwhLS0gRGVmaW5lcyBhIGNsdXN0ZXIgZm9yIHRoaXMgbm9kZSwKKyAgICAgICAgICAgICBCeSBkZWZpbmluZyB0aGlzIGVsZW1lbnQsIG1lYW5zIHRoYXQgZXZlcnkgbWFuYWdlciB3aWxsIGJlIGNoYW5nZWQuCisgICAgICAgICAgICAgU28gd2hlbiBydW5uaW5nIGEgY2x1c3Rlciwgb25seSBtYWtlIHN1cmUgdGhhdCB5b3UgaGF2ZSB3ZWJhcHBzIGluIHRoZXJlCisgICAgICAgICAgICAgdGhhdCBuZWVkIHRvIGJlIGNsdXN0ZXJlZCBhbmQgcmVtb3ZlIHRoZSBvdGhlciBvbmVzLgorICAgICAgICAgICAgIEEgY2x1c3RlciBoYXMgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOgorICAgICAgICAgICAgIAorICAgICAgICAgICAgIGNsYXNzTmFtZSA9IHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgY2x1c3RlciBjbGFzcworICAgICAgICAgICAgIAorICAgICAgICAgICAgIG5hbWUgPSBhIGRlc2NyaXB0aXZlIG5hbWUgZm9yIHlvdXIgY2x1c3RlciwgY2FuIGJlIGFueXRoaW5nCisgICAgICAgICAgICAgCisgICAgICAgICAgICAgZGVidWcgPSB0aGUgZGVidWcgbGV2ZWwsIGhpZ2hlciBtZWFucyBtb3JlIG91dHB1dAorICAgICAgICAgICAgIAorICAgICAgICAgICAgIG1jYXN0QWRkciA9IHRoZSBtdWx0aWNhc3QgYWRkcmVzcywgaGFzIHRvIGJlIHRoZSBzYW1lIGZvciBhbGwgdGhlIG5vZGVzCisgICAgICAgICAgICAgCisgICAgICAgICAgICAgbWNhc3RQb3J0ID0gdGhlIG11bHRpY2FzdCBwb3J0LCBoYXMgdG8gYmUgdGhlIHNhbWUgZm9yIGFsbCB0aGUgbm9kZXMKKyAgICAgICAgICAgICAKKyAgICAgICAgICAgICBtY2FzdEZyZXF1ZW5jeSA9IHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGluIGJldHdlZW4gc2VuZGluZyBhICJJJ20gYWxpdmUiIGhlYXJ0YmVhdAorICAgICAgICAgICAgIAorICAgICAgICAgICAgIG1jYXN0RHJvcFRpbWUgPSB0aGUgbnVtYmVyIGEgbWlsbGlzZWNvbmRzIGJlZm9yZSBhIG5vZGUgaXMgY29uc2lkZXJlZCAiZGVhZCIgaWYgbm8gaGVhcnRiZWF0IGlzIHJlY2VpdmVkCisgICAgICAgICAgICAgCisgICAgICAgICAgICAgdGNwVGhyZWFkQ291bnQgPSB0aGUgbnVtYmVyIG9mIHRocmVhZHMgdG8gaGFuZGxlIGluY29taW5nIHJlcGxpY2F0aW9uIHJlcXVlc3RzLCBvcHRpbWFsIHdvdWxkIGJlIHRoZSBzYW1lIGFtb3VudCBvZiB0aHJlYWRzIGFzIG5vZGVzIAorCisgICAgICAgICAgICAgdGNwTGlzdGVuQWRkcmVzcyA9IHRoZSBsaXN0ZW4gYWRkcmVzcyAoYmluZCBhZGRyZXNzKSBmb3IgVENQIGNsdXN0ZXIgcmVxdWVzdCBvbiB0aGlzIGhvc3QsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBjYXNlIG9mIG11bHRpcGxlIGV0aGVybmV0IGNhcmRzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvIG1lYW5zIHRoYXQgYWRkcmVzcyBiZWNvbWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLmdldEhvc3RBZGRyZXNzKCkKKworICAgICAgICAgICAgIHRjcExpc3RlblBvcnQgPSB0aGUgdGNwIGxpc3RlbiBwb3J0CisgICAgICAgICAgICAgCisgICAgICAgICAgICAgdGNwU2VsZWN0b3JUaW1lb3V0ID0gdGhlIHRpbWVvdXQgKG1zKSBmb3IgdGhlIFNlbGVjdG9yLnNlbGVjdCgpIG1ldGhvZCBpbiBjYXNlIHRoZSBPUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhcyBhIHdha3VwIGJ1ZyBpbiBqYXZhLm5pby4gU2V0IHRvIDAgZm9yIG5vIHRpbWVvdXQKKworICAgICAgICAgICAgIHByaW50VG9TY3JlZW4gPSB0cnVlIG1lYW5zIHRoYXQgbWFuYWdlcnMgd2lsbCBhbHNvIHByaW50IHRvIHN0ZC5vdXQKKworICAgICAgICAgICAgIGV4cGlyZVNlc3Npb25zT25TaHV0ZG93biA9IHRydWUgbWVhbnMgdGhhdCAKKworICAgICAgICAgICAgIHVzZURpcnR5RmxhZyA9IHRydWUgbWVhbnMgdGhhdCB3ZSBvbmx5IHJlcGxpY2F0ZSBhIHNlc3Npb24gYWZ0ZXIgc2V0QXR0cmlidXRlLHJlbW92ZUF0dHJpYnV0ZSBoYXMgYmVlbiBjYWxsZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgbWVhbnMgdG8gcmVwbGljYXRlIHRoZSBzZXNzaW9uIGFmdGVyIGVhY2ggcmVxdWVzdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSBtZWFucyB0aGF0IHJlcGxpY2F0aW9uIHdvdWxkIHdvcmsgZm9yIHRoZSBmb2xsb3dpbmcgcGllY2Ugb2YgY29kZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8JQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhc2hNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLnNldEF0dHJpYnV0ZSgibWFwIixtYXApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcC5wdXQoImtleSIsInZhbHVlIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJT4KKyAgICAgICAgLS0+ICAgICAgICAgICAgIAorICAgICAgICAgICAgIAorICAgICAgICAgICAgCisgICAgICAgIDxDbHVzdGVyICBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci50Y3AuU2ltcGxlVGNwQ2x1c3RlciIKKyAgICAgICAgICAgICAgICAgIG5hbWU9IkZpbGlwc0NsdXN0ZXIiCisgICAgICAgICAgICAgICAgICBkZWJ1Zz0iMTAiCisgICAgICAgICAgICAgICAgICBzZXJ2aWNlY2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5tY2FzdC5NY2FzdFNlcnZpY2UiCisgICAgICAgICAgICAgICAgICBtY2FzdEFkZHI9IjIyOC4wLjAuNCIKKyAgICAgICAgICAgICAgICAgIG1jYXN0UG9ydD0iNDU1NjQiCisgICAgICAgICAgICAgICAgICBtY2FzdEZyZXF1ZW5jeT0iNTAwIgorICAgICAgICAgICAgICAgICAgbWNhc3REcm9wVGltZT0iMzAwMCIKKyAgICAgICAgICAgICAgICAgIHRjcFRocmVhZENvdW50PSIyIgorICAgICAgICAgICAgICAgICAgdGNwTGlzdGVuQWRkcmVzcz0iYXV0byIKKyAgICAgICAgICAgICAgICAgIHRjcExpc3RlblBvcnQ9IjQwMDEiCisgICAgICAgICAgICAgICAgICB0Y3BTZWxlY3RvclRpbWVvdXQ9IjEwMCIKKyAgICAgICAgICAgICAgICAgIHByaW50VG9TY3JlZW49ImZhbHNlIgorICAgICAgICAgICAgICAgICAgZXhwaXJlU2Vzc2lvbnNPblNodXRkb3duPSJmYWxzZSIKKyAgICAgICAgICAgICAgICAgIHVzZURpcnR5RmxhZz0idHJ1ZSIKKyAgICAgICAgLz4KKyAgICAgICAgCisgICAgICAgIDwhLS0KKyAgICAgICAgICAgIFdoZW4gY29uZmlndXJpbmcgZm9yIGNsdXN0ZXJpbmcsIHlvdSBhbHNvIGFkZCBpbiBhIHZhbHZlIHRvIGNhdGNoIGFsbCB0aGUgcmVxdWVzdHMKKyAgICAgICAgICAgIGNvbWluZyBpbiwgYXQgdGhlIGVuZCBvZiB0aGUgcmVxdWVzdCwgdGhlIHNlc3Npb24gbWF5IG9yIG1heSBub3QgYmUgcmVwbGljYXRlZC4KKyAgICAgICAgICAgIEEgc2Vzc2lvbiBpcyByZXBsaWNhdGVkIGlmIGFuZCBvbmx5IGlmIGFsbCB0aGUgY29uZGl0aW9ucyBhcmUgbWV0OgorICAgICAgICAgICAgMS4gdXNlRGlydHlGbGFnIGlzIHRydWUgb3Igc2V0QXR0cmlidXRlIG9yIHJlbW92ZUF0dHJpYnV0ZSBoYXMgYmVlbiBjYWxsZWQgQU5ECisgICAgICAgICAgICAyLiBhIHNlc3Npb24gZXhpc3RzIChoYXMgYmVlbiBjcmVhdGVkKQorICAgICAgICAgICAgMy4gdGhlIHJlcXVlc3QgaXMgbm90IHRyYXBwZWQgYnkgdGhlICJmaWx0ZXIiIGF0dHJpYnV0ZQorICAgICAgICAgICAgCisgICAgICAgICAgICBUaGUgZmlsdGVyIGF0dHJpYnV0ZSBpcyB0byBmaWx0ZXIgb3V0IHJlcXVlc3RzIHRoYXQgY291bGQgbm90IG1vZGlmeSB0aGUgc2Vzc2lvbiwKKyAgICAgICAgICAgIGhlbmNlIHdlIGRvbid0IHJlcGxpY2F0ZSB0aGUgc2Vzc2lvbiBhZnRlciB0aGUgZW5kIG9mIHRoaXMgcmVxdWVzdC4KKyAgICAgICAgICAgIFRoZSBmaWx0ZXIgaXMgbmVnYXRpdmUsIGllLCBhbnl0aGluZyB5b3UgcHV0IGluIHRoZSBmaWx0ZXIsIHlvdSBtZWFuIHRvIGZpbHRlciBvdXQsCisgICAgICAgICAgICBpZSwgbm8gcmVwbGljYXRpb24gd2lsbCBiZSBkb25lIG9uIHJlcXVlc3RzIHRoYXQgbWF0Y2ggb25lIG9mIHRoZSBmaWx0ZXJzLgorICAgICAgICAgICAgVGhlIGZpbHRlciBhdHRyaWJ1dGUgaXMgZGVsaW1pdGVkIGJ5IDssIHNvIHlvdSBjYW4ndCBlc2NhcGUgb3V0IDsgZXZlbiBpZiB5b3Ugd2FudGVkIHRvLgorICAgICAgICAgICAgCisgICAgICAgICAgICBmaWx0ZXI9Ii4qXC5naWY7LipcLmpzOyIgbWVhbnMgdGhhdCB3ZSB3aWxsIG5vdCByZXBsaWNhdGUgdGhlIHNlc3Npb24gYWZ0ZXIgcmVxdWVzdHMgd2l0aCB0aGUgVVJJCisgICAgICAgICAgICBlbmRpbmcgd2l0aCAuZ2lmIGFuZCAuanMgYXJlIGludGVyY2VwdGVkLgorICAgICAgICAtLT4KKyAgICAgICAgICAgIAorICAgICAgICA8VmFsdmUgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIudGNwLlJlcGxpY2F0aW9uVmFsdmUiCisgICAgICAgICAgICAgICBmaWx0ZXI9Ii4qXC5naWY7LipcLmpzOy4qXC5qcGc7LipcLmh0bTsuKlwuaHRtbDsuKlwudHh0OyIvPgorCisgICAgICA8IS0tIEFkZCB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgaWYgeW91IHdhbnQgdG8gdHVybiBYTUwgdmFsaWRhdGlvbgorICAgICAgICAgICBvbi4gUmVtZW1iZXIgdG8gY29tbWVudCB0aGUgSG9zdCBlbGVtZW50IGFib3ZlLiAKKyAgICAgICAgICAgCisgICAgICAgICAgIE5vdGU6IFhNTCBTY2hlbWEgdmFsaWRhdGlvbm4gd2lsbCB3b3JrcyB3aXRoIFhlcmNlcyAyLjAuMSBvciAKKyAgICAgICAgICAgWGVyY2VzIDIuMS4gWGVyY2VzIDIuMC4yIGFuZCBYZXJjZXMgMi4yIGhhdmUgYnVncyB0aGF0IHByZXZlbnQgCisgICAgICAgICAgIHRoZWlyIHVzZSB3aXRoIFRvbWNhdC0tPgorICAgICAgPCEtLQorICAgICAgPEhvc3QgbmFtZT0ibG9jYWxob3N0IiBkZWJ1Zz0iMCIgYXBwQmFzZT0id2ViYXBwcyIKKyAgICAgICB1bnBhY2tXQVJzPSJ0cnVlIiBhdXRvRGVwbG95PSJ0cnVlIgorICAgICAgIHhtbFZhbGlkYXRpb249InRydWUiIHhtbE5hbWVzcGFjZUF3YXJlPSJ0cnVlIj4KKyAgICAgIC0tPgorCisgICAgICAgIDwhLS0gVW5jb21tZW50IHRoaXMgdG8gY2x1c3RlciB0aGlzIGhvc3QgdXNpbmcgSmF2YUdyb3Vwcy4gVGhlCisgICAgICAgICAgICAgcHJvdG9jb2wgYXR0cmlidXRlIGNhbiBiZSB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgSmF2YUdyb3VwcworICAgICAgICAgICAgIG5ldHdvcmsgc3RhY2sgKHRoZSBkZWZhdWx0cyBhcmUgdXNlZCBpZiBpdCdzIG5vdCBzcGVjaWZpZWQpLiAtLT4KKyAgICAgICAgPCEtLQorICAgICAgICA8Q2x1c3RlciBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5KR0NsdXN0ZXIiLz4KKyAgICAgICAgLS0+CisKKyAgICAgICAgPCEtLSBOb3JtYWxseSwgdXNlcnMgbXVzdCBhdXRoZW50aWNhdGUgdGhlbXNlbHZlcyB0byBlYWNoIHdlYiBhcHAKKyAgICAgICAgICAgICBpbmRpdmlkdWFsbHkuICBVbmNvbW1lbnQgdGhlIGZvbGxvd2luZyBlbnRyeSBpZiB5b3Ugd291bGQgbGlrZQorICAgICAgICAgICAgIGEgdXNlciB0byBiZSBhdXRoZW50aWNhdGVkIHRoZSBmaXJzdCB0aW1lIHRoZXkgZW5jb3VudGVyIGEKKyAgICAgICAgICAgICByZXNvdXJjZSBwcm90ZWN0ZWQgYnkgYSBzZWN1cml0eSBjb25zdHJhaW50LCBhbmQgdGhlbiBoYXZlIHRoYXQKKyAgICAgICAgICAgICB1c2VyIGlkZW50aXR5IG1haW50YWluZWQgYWNyb3NzICphbGwqIHdlYiBhcHBsaWNhdGlvbnMgY29udGFpbmVkCisgICAgICAgICAgICAgaW4gdGhpcyB2aXJ0dWFsIGhvc3QuIC0tPgorICAgICAgICA8IS0tCisgICAgICAgIDxWYWx2ZSBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuYXV0aGVudGljYXRvci5TaW5nbGVTaWduT24iCisgICAgICAgICAgICAgICAgICAgZGVidWc9IjAiLz4KKyAgICAgICAgLS0+CisgICAgICAgIAorICAgICAgICA8IS0tIEFjY2VzcyBsb2cgcHJvY2Vzc2VzIGFsbCByZXF1ZXN0cyBmb3IgdGhpcyB2aXJ0dWFsIGhvc3QuICBCeQorICAgICAgICAgICAgIGRlZmF1bHQsIGxvZyBmaWxlcyBhcmUgY3JlYXRlZCBpbiB0aGUgImxvZ3MiIGRpcmVjdG9yeSByZWxhdGl2ZSB0bworICAgICAgICAgICAgICRDQVRBTElOQV9IT01FLiAgSWYgeW91IHdpc2gsIHlvdSBjYW4gc3BlY2lmeSBhIGRpZmZlcmVudAorICAgICAgICAgICAgIGRpcmVjdG9yeSB3aXRoIHRoZSAiZGlyZWN0b3J5IiBhdHRyaWJ1dGUuICBTcGVjaWZ5IGVpdGhlciBhIHJlbGF0aXZlCisgICAgICAgICAgICAgKHRvICRDQVRBTElOQV9IT01FKSBvciBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBkZXNpcmVkIGRpcmVjdG9yeS4KKyAgICAgICAgLS0+CisgICAgICAgIDwhLS0KKyAgICAgICAgPFZhbHZlIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS52YWx2ZXMuQWNjZXNzTG9nVmFsdmUiCisgICAgICAgICAgICAgICAgIGRpcmVjdG9yeT0ibG9ncyIgIHByZWZpeD0ibG9jYWxob3N0X2FjY2Vzc19sb2cuIiBzdWZmaXg9Ii50eHQiCisgICAgICAgICAgICAgICAgIHBhdHRlcm49ImNvbW1vbiIgcmVzb2x2ZUhvc3RzPSJmYWxzZSIvPgorICAgICAgICAtLT4KKworICAgICAgICA8IS0tIExvZ2dlciBzaGFyZWQgYnkgYWxsIENvbnRleHRzIHJlbGF0ZWQgdG8gdGhpcyB2aXJ0dWFsIGhvc3QuICBCeQorICAgICAgICAgICAgIGRlZmF1bHQgKHdoZW4gdXNpbmcgRmlsZUxvZ2dlciksIGxvZyBmaWxlcyBhcmUgY3JlYXRlZCBpbiB0aGUgImxvZ3MiCisgICAgICAgICAgICAgZGlyZWN0b3J5IHJlbGF0aXZlIHRvICRDQVRBTElOQV9IT01FLiAgSWYgeW91IHdpc2gsIHlvdSBjYW4gc3BlY2lmeQorICAgICAgICAgICAgIGEgZGlmZmVyZW50IGRpcmVjdG9yeSB3aXRoIHRoZSAiZGlyZWN0b3J5IiBhdHRyaWJ1dGUuICBTcGVjaWZ5IGVpdGhlciBhCisgICAgICAgICAgICAgcmVsYXRpdmUgKHRvICRDQVRBTElOQV9IT01FKSBvciBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBkZXNpcmVkCisgICAgICAgICAgICAgZGlyZWN0b3J5Li0tPgorICAgICAgICA8TG9nZ2VyIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5sb2dnZXIuRmlsZUxvZ2dlciIKKyAgICAgICAgICAgICAgICAgZGlyZWN0b3J5PSJsb2dzIiAgcHJlZml4PSJsb2NhbGhvc3RfbG9nLiIgc3VmZml4PSIudHh0IgorICAgICAgICAgICAgdGltZXN0YW1wPSJ0cnVlIi8+CisKKyAgICAgICAgPCEtLSBEZWZpbmUgcHJvcGVydGllcyBmb3IgZWFjaCB3ZWIgYXBwbGljYXRpb24uICBUaGlzIGlzIG9ubHkgbmVlZGVkCisgICAgICAgICAgICAgaWYgeW91IHdhbnQgdG8gc2V0IG5vbi1kZWZhdWx0IHByb3BlcnRpZXMsIG9yIGhhdmUgd2ViIGFwcGxpY2F0aW9uCisgICAgICAgICAgICAgZG9jdW1lbnQgcm9vdHMgaW4gcGxhY2VzIG90aGVyIHRoYW4gdGhlIHZpcnR1YWwgaG9zdCdzIGFwcEJhc2UKKyAgICAgICAgICAgICBkaXJlY3RvcnkuICAtLT4KKworICAgICAgICA8IS0tIFRvbWNhdCBSb290IENvbnRleHQgLS0+CisgICAgICAgIDwhLS0KKyAgICAgICAgPENvbnRleHQgcGF0aD0iL3JlcHRlc3QiIGRvY0Jhc2U9InJlcHRlc3QiIGRlYnVnPSIwIj4KKyAgICAgICAgICAgIAorICAgICAgICA8L0NvbnRleHQ+CisgICAgICAgIC0tPgorICAgICAgICAKKworICAgICAgPC9Ib3N0PgorCisgICAgPC9FbmdpbmU+CisKKyAgPC9TZXJ2aWNlPgorCis8L1NlcnZlcj4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9DYXRhbGluYUNsdXN0ZXIuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9DYXRhbGluYUNsdXN0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODczM2Y1Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL0NhdGFsaW5hQ2x1c3Rlci5qYXZhCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5DbHVzdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5pby5MaXN0ZW5DYWxsYmFjazsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlZhbHZlOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLk1hbmFnZXI7CisKKy8qKgorICogQSA8Yj5DYXRhbGluYUNsdXN0ZXI8L2I+IGludGVyZmFjZSBhbGxvd3MgdG8gcGx1ZyBpbiBhbmQgb3V0IHRoZSAKKyAqIGRpZmZlcmVudCBjbHVzdGVyIGltcGxlbWVudGF0aW9ucworICoKKyAqIEBhdXRob3IgRmlsaXAgSGFuaWsKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQsICREYXRlJAorICovCisKK3B1YmxpYyBpbnRlcmZhY2UgQ2F0YWxpbmFDbHVzdGVyCisgICAgZXh0ZW5kcyBDbHVzdGVyLExpc3RlbkNhbGxiYWNrIHsKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworICAgIC8qKgorICAgICAqIERlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgY29tcG9uZW50IGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgaW5mbyA9ICJDYXRhbGluYUNsdXN0ZXIvMS4wIjsKKyAgICAKKyAgICAvKioKKyAgICAgKiBTdGFydCB0aGUgY2x1c3RlciwgdGhlIG93bmluZyBjb250YWluZXIgd2lsbCBpbnZva2UgdGhpcworICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIC0gaWYgZmFpbHVyZSB0byBzdGFydCBjbHVzdGVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnQoKSB0aHJvd3MgRXhjZXB0aW9uOworICAgIAorICAgIC8qKgorICAgICAqIFN0b3BzIHRoZSBjbHVzdGVyLCB0aGUgb3duaW5nIGNvbnRhaW5lciB3aWxsIGludm9rZSB0aGlzCisgICAgICogQHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdG9wKCkgdGhyb3dzIExpZmVjeWNsZUV4Y2VwdGlvbjsKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBhc3NvY2lhdGVzIGxvZ2dlciB3aXRoIHRoaXMgY2x1c3RlcgorICAgICAqIEByZXR1cm4gTG9nCisgICAgICovCisgICAgcHVibGljIExvZyBnZXRMb2dnZXIoKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBTZW5kcyBhIG1lc3NhZ2UgdG8gYWxsIHRoZSBtZW1iZXJzIGluIHRoZSBjbHVzdGVyCisgICAgICogQHBhcmFtIG1zZyBTZXNzaW9uTWVzc2FnZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNlbmQoQ2x1c3Rlck1lc3NhZ2UgbXNnKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBTZW5kcyBhIG1lc3NhZ2UgdG8gYSBzcGVjaWZpYyBtZW1iZXIgaW4gdGhlIGNsdXN0ZXIKKyAgICAgKiBAcGFyYW0gbXNnIFNlc3Npb25NZXNzYWdlCisgICAgICogQHBhcmFtIGRlc3QgTWVtYmVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2VuZChDbHVzdGVyTWVzc2FnZSBtc2csIE1lbWJlciBkZXN0KTsKKyAgICAKKyAgICAvKioKKyAgICAgKiByZXR1cm5zIGFsbCB0aGUgbWVtYmVycyBjdXJyZW50bHkgcGFydGljaXBhdGluZyBpbiB0aGUgY2x1c3RlcgorICAgICAqIEByZXR1cm4gTWVtYmVyW10KKyAgICAgKi8KKyAgICBwdWJsaWMgTWVtYmVyW10gZ2V0TWVtYmVycygpOworICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbWVtYmVyIHRoYXQgcmVwcmVzZW50cyB0aGlzIG5vZGUuCisgICAgICogQHJldHVybiBNZW1iZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgTWVtYmVyIGdldExvY2FsTWVtYmVyKCk7CisgICAgCisgICAgcHVibGljIHZvaWQgc2V0Q2x1c3RlclNlbmRlcihDbHVzdGVyU2VuZGVyIHNlbmRlcik7CisgICAgCisgICAgcHVibGljIENsdXN0ZXJTZW5kZXIgZ2V0Q2x1c3RlclNlbmRlcigpOworICAgIAorICAgIHB1YmxpYyB2b2lkIHNldENsdXN0ZXJSZWNlaXZlcihDbHVzdGVyUmVjZWl2ZXIgcmVjZWl2ZXIpOworICAgIAorICAgIHB1YmxpYyBDbHVzdGVyUmVjZWl2ZXIgZ2V0Q2x1c3RlclJlY2VpdmVyKCk7CisgICAgCisgICAgcHVibGljIHZvaWQgc2V0TWVtYmVyc2hpcFNlcnZpY2UoTWVtYmVyc2hpcFNlcnZpY2Ugc2VydmljZSk7CisgICAgCisgICAgcHVibGljIE1lbWJlcnNoaXBTZXJ2aWNlIGdldE1lbWJlcnNoaXBTZXJ2aWNlKCk7CisgICAgCisgICAgcHVibGljIHZvaWQgYWRkVmFsdmUoVmFsdmUgdmFsdmUpOworICAgIAorICAgIHB1YmxpYyB2b2lkIGFkZENsdXN0ZXJMaXN0ZW5lcihNZXNzYWdlTGlzdGVuZXIgbGlzdGVuZXIpOworICAgIAorICAgIHB1YmxpYyB2b2lkIHJlbW92ZUNsdXN0ZXJMaXN0ZW5lcihNZXNzYWdlTGlzdGVuZXIgbGlzdGVuZXIpOworICAgIAorICAgIHB1YmxpYyB2b2lkIHNldENsdXN0ZXJEZXBsb3llcihDbHVzdGVyRGVwbG95ZXIgZGVwbG95ZXIpOworICAgIAorICAgIHB1YmxpYyBDbHVzdGVyRGVwbG95ZXIgZ2V0Q2x1c3RlckRlcGxveWVyKCk7CisgICAgCisgICAgcHVibGljIE1hbmFnZXIgZ2V0TWFuYWdlcihTdHJpbmcgbmFtZSk7CisgICAgcHVibGljIHZvaWQgcmVtb3ZlTWFuYWdlcihTdHJpbmcgbmFtZSk7CisgICAgCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvQ2x1c3RlckRlcGxveWVyLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvQ2x1c3RlckRlcGxveWVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzlhMzUxOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9DbHVzdGVyRGVwbG95ZXIuamF2YQpAQCAtMCwwICsxLDExMyBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3RlcjsKKworLyoqCisgKiBBIDxiPkNsdXN0ZXJEZXBsb3llcjwvYj4gaW50ZXJmYWNlIGFsbG93cyB0byBwbHVnIGluIGFuZCBvdXQgdGhlCisgKiBkaWZmZXJlbnQgZGVwbG95bWVudCBpbXBsZW1lbnRhdGlvbnMKKyAqCisgKiBAYXV0aG9yIEZpbGlwIEhhbmlrCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kLCAkRGF0ZSQKKyAqLworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworCitwdWJsaWMgaW50ZXJmYWNlIENsdXN0ZXJEZXBsb3llciBleHRlbmRzIE1lc3NhZ2VMaXN0ZW5lciB7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY2x1c3RlciB0aGUgY2x1c3RlciBkZXBsb3llciBpcyBhc3NvY2lhdGVkIHdpdGgKKyAgICAgKiBAcmV0dXJuIENhdGFsaW5hQ2x1c3RlcgorICAgICAqLworICAgIHB1YmxpYyBDYXRhbGluYUNsdXN0ZXIgZ2V0Q2x1c3RlcigpOworCisgICAgLyoqCisgICAgICogQXNzb2NpYXRlcyB0aGUgY2x1c3RlciBkZXBsb3llciB3aXRoIGEgY2x1c3RlcgorICAgICAqIEBwYXJhbSBjbHVzdGVyIENhdGFsaW5hQ2x1c3RlcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENsdXN0ZXIoQ2F0YWxpbmFDbHVzdGVyIGNsdXN0ZXIpOworCisgICAgLyoqCisgICAgICogRGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBjb21wb25lbnQgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBpbmZvID0gIkNsdXN0ZXJEZXBsb3llci8xLjAiOworICAgIC8qKgorICAgICAqIFN0YXJ0IHRoZSBjbHVzdGVyIGRlcGxveWVyLCB0aGUgb3duaW5nIGNvbnRhaW5lciB3aWxsIGludm9rZSB0aGlzCisgICAgICogQHRocm93cyBFeGNlcHRpb24gLSBpZiBmYWlsdXJlIHRvIHN0YXJ0IGNsdXN0ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHRocm93cyBFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBTdG9wcyB0aGUgY2x1c3RlciBkZXBsb3llciwgdGhlIG93bmluZyBjb250YWluZXIgd2lsbCBpbnZva2UgdGhpcworICAgICAqIEB0aHJvd3MgTGlmZWN5Y2xlRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcCgpIHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBkZXBsb3llciBmb3IgdGhpcyBjbHVzdGVyIGRlcGxveWVyIHRvIHVzZS4KKyAgICAgKiBAcGFyYW0gZGVwbG95ZXIgRGVwbG95ZXIKKyAgICAgKi8KKyAgICAvLyBGSVhNRQorICAgIC8vcHVibGljIHZvaWQgc2V0RGVwbG95ZXIoRGVwbG95ZXIgZGVwbG95ZXIpOworCisgICAgLyoqCisgICAgICogSW5zdGFsbCBhIG5ldyB3ZWIgYXBwbGljYXRpb24sIHdob3NlIHdlYiBhcHBsaWNhdGlvbiBhcmNoaXZlIGlzIGF0IHRoZQorICAgICAqIHNwZWNpZmllZCBVUkwsIGludG8gdGhpcyBjb250YWluZXIgYW5kIGFsbCB0aGUgb3RoZXIKKyAgICAgKiBtZW1iZXJzIG9mIHRoZSBjbHVzdGVyIHdpdGggdGhlIHNwZWNpZmllZCBjb250ZXh0IHBhdGguCisgICAgICogQSBjb250ZXh0IHBhdGggb2YgIiIgKHRoZSBlbXB0eSBzdHJpbmcpIHNob3VsZCBiZSB1c2VkIGZvciB0aGUgcm9vdAorICAgICAqIGFwcGxpY2F0aW9uIGZvciB0aGlzIGNvbnRhaW5lci4gIE90aGVyd2lzZSwgdGhlIGNvbnRleHQgcGF0aCBtdXN0CisgICAgICogc3RhcnQgd2l0aCBhIHNsYXNoLgorICAgICAqIDxwPgorICAgICAqIElmIHRoaXMgYXBwbGljYXRpb24gaXMgc3VjY2Vzc2Z1bGx5IGluc3RhbGxlZCBsb2NhbGx5LCAKKyAgICAgKiBhIENvbnRhaW5lckV2ZW50IG9mIHR5cGUKKyAgICAgKiA8Y29kZT5JTlNUQUxMX0VWRU5UPC9jb2RlPiB3aWxsIGJlIHNlbnQgdG8gYWxsIHJlZ2lzdGVyZWQgbGlzdGVuZXJzLAorICAgICAqIHdpdGggdGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Q29udGV4dDwvY29kZT4gYXMgYW4gYXJndW1lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dFBhdGggVGhlIGNvbnRleHQgcGF0aCB0byB3aGljaCB0aGlzIGFwcGxpY2F0aW9uIHNob3VsZAorICAgICAqICBiZSBpbnN0YWxsZWQgKG11c3QgYmUgdW5pcXVlKQorICAgICAqIEBwYXJhbSB3YXIgQSBVUkwgb2YgdHlwZSAiamFyOiIgdGhhdCBwb2ludHMgdG8gYSBXQVIgZmlsZSwgb3IgdHlwZQorICAgICAqICAiZmlsZToiIHRoYXQgcG9pbnRzIHRvIGFuIHVucGFja2VkIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgY29udGFpbmluZworICAgICAqICB0aGUgd2ViIGFwcGxpY2F0aW9uIHRvIGJlIGluc3RhbGxlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHNwZWNpZmllZCBjb250ZXh0IHBhdGgKKyAgICAgKiAgaXMgbWFsZm9ybWVkIChpdCBtdXN0IGJlICIiIG9yIHN0YXJ0IHdpdGggYSBzbGFzaCkKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGUgc3BlY2lmaWVkIGNvbnRleHQgcGF0aAorICAgICAqICBpcyBhbHJlYWR5IGF0dGFjaGVkIHRvIGFuIGV4aXN0aW5nIHdlYiBhcHBsaWNhdGlvbgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIHdhcyBlbmNvdW50ZXJlZAorICAgICAqICBkdXJpbmcgaW5zdGFsbGF0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgaW5zdGFsbChTdHJpbmcgY29udGV4dFBhdGgsIFVSTCB3YXIpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhbiBleGlzdGluZyB3ZWIgYXBwbGljYXRpb24sIGF0dGFjaGVkIHRvIHRoZSBzcGVjaWZpZWQgY29udGV4dAorICAgICAqIHBhdGguICBJZiB0aGlzIGFwcGxpY2F0aW9uIGlzIHN1Y2Nlc3NmdWxseSByZW1vdmVkLCBhCisgICAgICogQ29udGFpbmVyRXZlbnQgb2YgdHlwZSA8Y29kZT5SRU1PVkVfRVZFTlQ8L2NvZGU+IHdpbGwgYmUgc2VudCB0byBhbGwKKyAgICAgKiByZWdpc3RlcmVkIGxpc3RlbmVycywgd2l0aCB0aGUgcmVtb3ZlZCA8Y29kZT5Db250ZXh0PC9jb2RlPiBhcworICAgICAqIGFuIGFyZ3VtZW50LiBEZWxldGVzIHRoZSB3ZWIgYXBwbGljYXRpb24gd2FyIGZpbGUgYW5kL29yIGRpcmVjdG9yeQorICAgICAqIGlmIHRoZXkgZXhpc3QgaW4gdGhlIEhvc3QncyBhcHBCYXNlLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHRQYXRoIFRoZSBjb250ZXh0IHBhdGggb2YgdGhlIGFwcGxpY2F0aW9uIHRvIGJlIHJlbW92ZWQKKyAgICAgKiBAcGFyYW0gdW5kZXBsb3kgYm9vbGVhbiBmbGFnIHRvIHJlbW92ZSB3ZWIgYXBwbGljYXRpb24gZnJvbSBzZXJ2ZXIKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBzcGVjaWZpZWQgY29udGV4dCBwYXRoCisgICAgICogIGlzIG1hbGZvcm1lZCAoaXQgbXVzdCBiZSAiIiBvciBzdGFydCB3aXRoIGEgc2xhc2gpCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHNwZWNpZmllZCBjb250ZXh0IHBhdGggZG9lcworICAgICAqICBub3QgaWRlbnRpZnkgYSBjdXJyZW50bHkgaW5zdGFsbGVkIHdlYiBhcHBsaWNhdGlvbgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycyBkdXJpbmcKKyAgICAgKiAgcmVtb3ZhbAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZShTdHJpbmcgY29udGV4dFBhdGgsIGJvb2xlYW4gdW5kZXBsb3kpIHRocm93cyBJT0V4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9DbHVzdGVyTWFuYWdlci5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL0NsdXN0ZXJNYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUxYzgxZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9DbHVzdGVyTWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXI7CisKKy8qKgorICogVGhlIGNvbW1vbiBpbnRlcmZhY2UgdXNlZCBieSBhbGwgY2x1c3RlciBtYW5hZ2VyLgorICogVGhpcyBpcyBzbyB0aGF0IHdlIGNhbiBoYXZlIGEgbW9yZSBwbHVnZ2FibGUgd2F5CisgKiBvZiBzd2FwcGluZyBzZXNzaW9uIG1hbmFnZXJzIGZvciBkaWZmZXJlbnQgYWxnb3JpdGhtcy4KKyAqCisgKiBAYXV0aG9yIEZpbGlwIEhhbmlrCisKKyAqLworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5NYW5hZ2VyOworCisKK3B1YmxpYyBpbnRlcmZhY2UgQ2x1c3Rlck1hbmFnZXIgZXh0ZW5kcyBNYW5hZ2VyIHsKKworICAgLyoqCisgICAgKiBBIG1lc3NhZ2Ugd2FzIHJlY2VpdmVkIGZyb20gYW5vdGhlciBub2RlLCB0aGlzCisgICAgKiBpcyB0aGUgY2FsbGJhY2sgbWV0aG9kIHRvIGltcGxlbWVudCBpZiB5b3UgYXJlIGludGVyZXN0ZWQgaW4KKyAgICAqIHJlY2VpdmluZyByZXBsaWNhdGlvbiBtZXNzYWdlcy4KKyAgICAqIEBwYXJhbSBtc2cgLSB0aGUgbWVzc2FnZSByZWNlaXZlZC4KKyAgICAqLworICAgcHVibGljIHZvaWQgbWVzc2FnZURhdGFSZWNlaXZlZChDbHVzdGVyTWVzc2FnZSBtc2cpOworCisgICAvKioKKyAgICAqIFdoZW4gdGhlIHJlcXVlc3QgaGFzIGJlZW4gY29tcGxldGVkLCB0aGUgcmVwbGljYXRpb24gdmFsdmUKKyAgICAqIHdpbGwgbm90aWZ5IHRoZSBtYW5hZ2VyLCBhbmQgdGhlIG1hbmFnZXIgd2lsbCBkZWNpZGUgd2hldGhlcgorICAgICogYW55IHJlcGxpY2F0aW9uIGlzIG5lZWRlZCBvciBub3QuCisgICAgKiBJZiB0aGVyZSBpcyBhIG5lZWQgZm9yIHJlcGxpY2F0aW9uLCB0aGUgbWFuYWdlciB3aWxsCisgICAgKiBjcmVhdGUgYSBzZXNzaW9uIG1lc3NhZ2UgYW5kIHRoYXQgd2lsbCBiZSByZXBsaWNhdGVkLgorICAgICogVGhlIGNsdXN0ZXIgZGV0ZXJtaW5lcyB3aGVyZSBpdCBnZXRzIHNlbnQuCisgICAgKiBAcGFyYW0gc2Vzc2lvbklkIC0gdGhlIHNlc3Npb25JZCB0aGF0IGp1c3QgY29tcGxldGVkLgorICAgICogQHJldHVybiBhIFNlc3Npb25NZXNzYWdlIHRvIGJlIHNlbnQsCisgICAgKi8KKyAgIHB1YmxpYyBDbHVzdGVyTWVzc2FnZSByZXF1ZXN0Q29tcGxldGVkKFN0cmluZyBzZXNzaW9uSWQpOworCisgICAvKioKKyAgICAqIFdoZW4gdGhlIG1hbmFnZXIgZXhwaXJlcyBzZXNzaW9uIG5vdCB0aWVkIHRvIGEgcmVxdWVzdC4KKyAgICAqIFRoZSBjbHVzdGVyIHdpbGwgcGVyaW9kaWNhbGx5IGFzayBmb3IgYSBsaXN0IG9mIHNlc3Npb25zCisgICAgKiB0aGF0IHNob3VsZCBleHBpcmUgYW5kIHRoYXQgc2hvdWxkIGJlIHNlbnQgYWNyb3NzIHRoZSB3aXJlLgorICAgICogQHJldHVybiBTdHJpbmdbXSBUaGUgaW52YWxpZGF0ZWQgc2Vzc2lvbnMKKyAgICAqLworICAgcHVibGljIFN0cmluZ1tdIGdldEludmFsaWRhdGVkU2Vzc2lvbnMoKTsKKyAgIAorICAgLyoqCisgICAgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIG1hbmFnZXIsIHR5cGljYWxseSB0aGUgY29udGV4dCBuYW1lIHN1Y2ggYXMgL3JlcGxpY2F0b3IKKyAgICAqIEByZXR1cm4gU3RyaW5nCisgICAgKi8KKyAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOworICAgCisgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKTsKKyAgIAorICAgcHVibGljIHZvaWQgc2V0RXhwaXJlU2Vzc2lvbnNPblNodXRkb3duKGJvb2xlYW4gZXhwaXJlU2Vzc2lvbnNPblNodXRkb3duKTsKKyAgIAorICAgcHVibGljIHZvaWQgc2V0VXNlRGlydHlGbGFnKGJvb2xlYW4gdXNlRGlydHlGbGFnKTsKKyAgIAorICAgcHVibGljIHZvaWQgc2V0Q2x1c3RlcihDYXRhbGluYUNsdXN0ZXIgY2x1c3Rlcik7CisgICAKKyAgIHB1YmxpYyBib29sZWFuIGdldE5vdGlmeUxpc3RlbmVyc09uUmVwbGljYXRpb24oKTsKKyAgIAorICAgcHVibGljIHZvaWQgc2V0Tm90aWZ5TGlzdGVuZXJzT25SZXBsaWNhdGlvbihib29sZWFuIG5vdGlmeUxpc3RlbmVyc09uUmVwbGljYXRpb24pOworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvQ2x1c3Rlck1lc3NhZ2UuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9DbHVzdGVyTWVzc2FnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2NzI1MTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvQ2x1c3Rlck1lc3NhZ2UuamF2YQpAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3RlcjsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworCitwdWJsaWMgaW50ZXJmYWNlIENsdXN0ZXJNZXNzYWdlCisgICAgZXh0ZW5kcyBTZXJpYWxpemFibGUgeworICAgIC8qKgorICAgICAqIEdldCB0aGUgYWRkcmVzcyB0aGF0IHRoaXMgbWVzc2FnZSBvcmlnaW5hdGVkIGZyb20uICBUaGlzIHdvdWxkIGJlIHNldAorICAgICAqIGlmIHRoZSBtZXNzYWdlIHdhcyBiZWluZyByZWxheWVkIGZyb20gYSBob3N0IG90aGVyIHRoYW4gdGhlIG9uZQorICAgICAqIHRoYXQgb3JpZ2luYWxseSBzZW50IGl0LgorICAgICAqLworICAgIHB1YmxpYyBNZW1iZXIgZ2V0QWRkcmVzcygpOworCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IHRoZSBjbHVzdGVyIGJlZm9yZSBzZW5kaW5nIGl0IHRvIHRoZSBvdGhlcgorICAgICAqIG5vZGVzCisgICAgICogQHBhcmFtIG1lbWJlciBNZW1iZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBZGRyZXNzKE1lbWJlciBtZW1iZXIpOworCisgICAgLyoqCisgICAgICogVGltZXN0YW1wIG1lc3NhZ2UKKyAgICAgKiBAcmV0dXJuIGxvbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRUaW1lc3RhbXAoKTsKKworICAgIC8qKgorICAgICAqIENhbGxlZCBieSB0aGUgY2x1c3RlciBiZWZvcmUgc2VuZGluZyBvdXQKKyAgICAgKiB0aGUgbWVzc2FnZQorICAgICAqIEBwYXJhbSB0aW1lc3RhbXAgbG9uZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRpbWVzdGFtcChsb25nIHRpbWVzdGFtcCk7CisKKyAgICAvKioKKyAgICAgKiBFYWNoIG1lc3NhZ2UgbXVzdCBoYXZlIGEgdW5pcXVlIElELCBpbiBjYXNlIG9mIHVzaW5nIGFzeW5jIHJlcGxpY2F0aW9uLAorICAgICAqIGFuZCBhIHNtYXJ0IHF1ZXVlLCB0aGlzIGlkIGlzIHVzZWQgdG8gcmVwbGFjZSBtZXNzYWdlcyBub3QgeWV0IHNlbnQKKyAgICAgKiBAcmV0dXJuIFN0cmluZworICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VW5pcXVlSWQoKTsKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL0NsdXN0ZXJSZWNlaXZlci5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL0NsdXN0ZXJSZWNlaXZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4Y2NmODIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvQ2x1c3RlclJlY2VpdmVyLmphdmEKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3RlcjsKKworCisKK3B1YmxpYyBpbnRlcmZhY2UgQ2x1c3RlclJlY2VpdmVyCit7CisKKyAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uOworCisgICAgcHVibGljIHZvaWQgc3RvcCgpOworCisgICAgcHVibGljIHZvaWQgc2V0Q2F0YWxpbmFDbHVzdGVyKENhdGFsaW5hQ2x1c3RlciBjbHVzdGVyKTsKKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRJc1NlbmRlclN5bmNocm9uaXplZChib29sZWFuIGlzU2VuZGVyU3luY2hyb25pemVkKTsKKyAgICAKKyAgICBwdWJsaWMgU3RyaW5nIGdldEhvc3QoKTsKKyAgICAKKyAgICBwdWJsaWMgaW50IGdldFBvcnQoKTsKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL0NsdXN0ZXJTZW5kZXIuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9DbHVzdGVyU2VuZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM5YmU1NQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9DbHVzdGVyU2VuZGVyLmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3RlcjsKKworCisKK3B1YmxpYyBpbnRlcmZhY2UgQ2x1c3RlclNlbmRlcgoreworCisgICAgcHVibGljIHZvaWQgYWRkKE1lbWJlciBtZW1iZXIpOworCisgICAgcHVibGljIHZvaWQgcmVtb3ZlKE1lbWJlciBtZW1iZXIpOworCisgICAgcHVibGljIHZvaWQgc3RhcnQoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworICAgIHB1YmxpYyB2b2lkIHN0b3AoKTsKKworICAgIHB1YmxpYyB2b2lkIHNlbmRNZXNzYWdlKFN0cmluZyBtZXNzYWdlSWQsIGJ5dGVbXSBpbmRhdGEsIE1lbWJlciBtZW1iZXIpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uOworCisgICAgcHVibGljIHZvaWQgc2VuZE1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2VJZCwgYnl0ZVtdIGluZGF0YSkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb247CisgICAgCisgICAgcHVibGljIGJvb2xlYW4gZ2V0SXNTZW5kZXJTeW5jaHJvbml6ZWQoKTsKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL0NsdXN0ZXJTZXNzaW9uLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvQ2x1c3RlclNlc3Npb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWY5OGE4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL0NsdXN0ZXJTZXNzaW9uLmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5TZXNzaW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbjsKKworcHVibGljIGludGVyZmFjZSBDbHVzdGVyU2Vzc2lvbiBleHRlbmRzIFNlc3Npb24sIEh0dHBTZXNzaW9uIHsKKyAgIC8qKgorICAgICogcmV0dXJucyB0cnVlIGlmIHRoaXMgc2Vzc2lvbiBpcyB0aGUgcHJpbWFyeSBzZXNzaW9uLCBpZiB0aGF0IGlzIHRoZQorICAgICogY2FzZSwgdGhlIG1hbmFnZXIgY2FuIGV4cGlyZSBpdCB1cG9uIHRpbWVvdXQuCisgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhpcyBzZXNzaW9uIGlzIHByaW1hcnkKKyAgICAqLworICAgcHVibGljIGJvb2xlYW4gaXNQcmltYXJ5U2Vzc2lvbigpOworCisgICAvKioKKyAgICAqIFNldHMgd2hldGhlciB0aGlzIGlzIHRoZSBwcmltYXJ5IHNlc3Npb24gb3Igbm90LgorICAgICogQHBhcmFtIHByaW1hcnlTZXNzaW9uIEZsYWcgdmFsdWUKKyAgICAqLworICAgcHVibGljIHZvaWQgc2V0UHJpbWFyeVNlc3Npb24oYm9vbGVhbiBwcmltYXJ5U2Vzc2lvbik7CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9Db25zdGFudHMuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9Db25zdGFudHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmVjOWM0Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL0NvbnN0YW50cy5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3RlcjsKKworLyoqCisgKiBNYW5pZmVzdCBjb25zdGFudHMgZm9yIHRoZSA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXI8L2NvZGU+CisgKiBwYWNrYWdlLgorICoKKyAqIEBhdXRob3IgQmlwIFRoZWxpbgorICogQHZlcnNpb24gJFJldmlzaW9uJCwgJERhdGUkCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIENvbnN0YW50cyB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUGFja2FnZSA9ICJvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIiOworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL0xvY2FsU3RyaW5ncy5wcm9wZXJ0aWVzIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL0xvY2FsU3RyaW5ncy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiMTM3ODkKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvTG9jYWxTdHJpbmdzLnByb3BlcnRpZXMKQEAgLTAsMCArMSBAQAorCmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvTWVtYmVyLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvTWVtYmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZmMjY1YwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9NZW1iZXIuamF2YQpAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyOworCisvKioKKyAqIFRoZSBNZW1iZXIgaW50ZXJmYWNlLCBkZWZpbmVzIGEgbWVtYmVyIGluIHRoZSBDbHVzdGVyLgorICogQSBtZW1iZXIgaXMgYSBUb21jYXQgcHJvY2VzcyB0aGF0IHBhcnRpY2lwYXRlcyBpbiBzZXNzaW9uIHJlcGxpY2F0aW9uLjxCUj4KKyAqIEVhY2ggbWVtYmVyIGNhbiBjYXJyeSBhIHNldCBvZiBwcm9wZXJ0aWVzLCBkZWZpbmVkIGJ5IHRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24uPEJSPgorICogRm9yIFRDUCByZXBsaWNhdGlvbiBoYXMgYmVlbiB0YXJnZXRlZCBmb3IgdGhlIGZpcnN0IHJlbGVhc2UsIHRoZSBob3N0bmFtZSBhbmQgbGlzdGVuIHBvcnQKKyAqIG9mIHRoZSBtZW1iZXIgaXMgZGVmaW5lZCBhcyBoYXJkY29kZWQgc3R1ZmYuPEJSPgorICogVGhlIE1lbWJlciBpbnRlcmZhY2UgdG9nZXRoZXIgd2l0aCBNZW1iZXJzaGlwTGlzdGVuZXIsIE1lbWJlcnNoaXBTZXJ2aWNlIGFyZSBpbnRlcmZhY2VzIHVzZWQgdG8KKyAqIHN3aXRjaCBvdXQgdGhlIHNlcnZpY2UgdXNlZCB0byBlc3RhYmxpc2ggbWVtYmVyc2hpcCBpbiBiZXR3ZWVuIHRoZSBjbHVzdGVyIG5vZGVzLgorICoKKyAqIEBhdXRob3IgRmlsaXAgSGFuaWsKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQsICREYXRlJAorICovCisKKworcHVibGljIGludGVyZmFjZSBNZW1iZXIgeworICAgIC8qKgorICAgICAqIFJldHVybiBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBwcm9wZXJ0aWVzIGFib3V0IHRoaXMgY2x1c3RlciBub2RlLgorICAgICAqLworICAgIHB1YmxpYyBqYXZhLnV0aWwuSGFzaE1hcCBnZXRNZW1iZXJQcm9wZXJ0aWVzKCk7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGlzIG5vZGUsIHNob3VsZCBiZSB1bmlxdWUgd2l0aGluIHRoZSBjbHVzdGVyLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIFRDUCBsaXN0ZW4gaG9zdCBmb3IgdGhlIFRDUCBpbXBsZW1lbnRhdGlvbgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SG9zdCgpOworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIFRDUCBsaXN0ZW4gcG9ydGZvciB0aGUgVENQIGltcGxlbWVudGF0aW9uCisgICAgICovCisgICAgcHVibGljIGludCBnZXRQb3J0KCk7CisKKyAgICAvKioKKyAgICAgKiBDb250YWlucyBpbmZvcm1hdGlvbiBvbiBob3cgbG9uZyB0aGlzIG1lbWJlciBoYXMgYmVlbiBvbmxpbmUuCisgICAgICogVGhlIHJlc3VsdCBpcyB0aGUgbnVtYmVyIG9mIG1pbGxpIHNlY29uZHMgdGhpcyBtZW1iZXIgaGFzIGJlZW4KKyAgICAgKiBicm9hZGNhc3RpbmcgaXRzIG1lbWJlcnNoaXAgdG8gdGhlIGNsdXN0ZXIuCisgICAgICogQHJldHVybiBuciBvZiBtaWxsaXNlY29uZHMgc2luY2UgdGhpcyBtZW1iZXIgc3RhcnRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRNZW1iZXJBbGl2ZVRpbWUoKTsKKyAgICAKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9NZW1iZXJzaGlwTGlzdGVuZXIuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9NZW1iZXJzaGlwTGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGI5YzdmCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL01lbWJlcnNoaXBMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXI7CisKKy8qKgorICogVGhlIE1lbWJlcnNoaXBMaXN0ZW5lciBpbnRlcmZhY2UgaXMgdXNlZCBhcyBhIGNhbGxiYWNrIHRvIHRoZQorICogbWVtYmVyc2hpcCBzZXJ2aWNlLiBJdCBoYXMgdHdvIG1ldGhvZHMgdGhhdCB3aWxsIG5vdGlmeSB0aGUgbGlzdGVuZXIKKyAqIHdoZW4gYSBtZW1iZXIgaGFzIGpvaW5lZCB0aGUgY2x1c3RlciBhbmQgd2hlbiBhIG1lbWJlciBoYXMgZGlzYXBwZWFyZWQgKGNyYXNoZWQpCisgKgorICogQGF1dGhvciBGaWxpcCBIYW5paworICogQHZlcnNpb24gJFJldmlzaW9uJCwgJERhdGUkCisgKi8KKworCitwdWJsaWMgaW50ZXJmYWNlIE1lbWJlcnNoaXBMaXN0ZW5lciB7CisgICAgcHVibGljIHZvaWQgbWVtYmVyQWRkZWQoTWVtYmVyIG1lbWJlcik7CisgICAgcHVibGljIHZvaWQgbWVtYmVyRGlzYXBwZWFyZWQoTWVtYmVyIG1lbWJlcik7CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvTWVtYmVyc2hpcFNlcnZpY2UuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9NZW1iZXJzaGlwU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5OTYyNTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvTWVtYmVyc2hpcFNlcnZpY2UuamF2YQpAQCAtMCwwICsxLDg2IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyOworCisvKioKKyAqIFRoZSBtZW1iZXJzaGlwIHNlcnZpY2UgaGVscHMgdGhlIGNsdXN0ZXIgZGV0ZXJtaW5lIHRoZSBtZW1iZXJzaGlwCisgKiBsb2dpYyBpbiB0aGUgY2x1c3Rlci4KKyAqIEBhdXRob3IgRmlsaXAgSGFuaWsKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQsICREYXRlJAorICovCisKKworcHVibGljIGludGVyZmFjZSBNZW1iZXJzaGlwU2VydmljZSB7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgbWVtYmVyc2hpcCBzZXJ2aWNlLiBUaGlzIG11c3QgYmUgY2FsbGVkIGJlZm9yZQorICAgICAqIHRoZSA8Y29kZT5zdGFydCgpPC9jb2RlPiBtZXRob2QgaXMgY2FsbGVkLgorICAgICAqIFRoZSBwcm9wZXJ0aWVzIGFyZSBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYy4KKyAgICAgKiBAcGFyYW0gcHJvcGVydGllcyAtIHRvIGJlIHVzZWQgdG8gY29uZmlndXJlIHRoZSBtZW1iZXJzaGlwIHNlcnZpY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJvcGVydGllcyhqYXZhLnV0aWwuUHJvcGVydGllcyBwcm9wZXJ0aWVzKTsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgY29uZmlndXJhdGlvbiB1c2VkLgorICAgICAqLworICAgIHB1YmxpYyBqYXZhLnV0aWwuUHJvcGVydGllcyBnZXRQcm9wZXJ0aWVzKCk7CisgICAgLyoqCisgICAgICogU3RhcnRzIHRoZSBtZW1iZXJzaGlwIHNlcnZpY2UuIElmIGEgbWVtYmVyc2hpcCBsaXN0ZW5lcnMgaXMgYWRkZWQKKyAgICAgKiB0aGUgbGlzdGVuZXIgd2lsbCBzdGFydCB0byByZWNlaXZlIG1lbWJlcnNoaXAgZXZlbnRzLgorICAgICAqIFBlcmZvcm1zIGEgc3RhcnQgbGV2ZWwgMSBhbmQgMgorICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiBpZiB0aGUgc2VydmljZSBmYWlscyB0byBzdGFydC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogU3RhcnRzIHRoZSBtZW1iZXJzaGlwIHNlcnZpY2UuIElmIGEgbWVtYmVyc2hpcCBsaXN0ZW5lcnMgaXMgYWRkZWQKKyAgICAgKiB0aGUgbGlzdGVuZXIgd2lsbCBzdGFydCB0byByZWNlaXZlIG1lbWJlcnNoaXAgZXZlbnRzLgorICAgICAqIEBwYXJhbSBsZXZlbCAtIGxldmVsIDEgc3RhcnRzIGxpc3RlbmluZyBmb3IgbWVtYmVycywgbGV2ZWwgMiAKKyAgICAgKiBzdGFydHMgYnJvYWQgY2FzdGluZyB0aGUgc2VydmVyCisgICAgICogQHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uIGlmIHRoZSBzZXJ2aWNlIGZhaWxzIHRvIHN0YXJ0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0KGludCBsZXZlbCkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb247CisKKworICAgIC8qKgorICAgICAqIFN0b3BzIHRoZSBtZW1iZXJzaGlwIHNlcnZpY2UKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdG9wKCk7CisgICAgLyoqCisgICAgICogUmV0dXJucyBhIGxpc3Qgb2YgYWxsIHRoZSBtZW1iZXJzIGluIHRoZSBjbHVzdGVyLgorICAgICAqLworICAgIHB1YmxpYyBNZW1iZXJbXSBnZXRNZW1iZXJzKCk7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbWVtYmVyIG9iamVjdCB0aGF0IGRlZmluZXMgdGhpcyBtZW1iZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgTWVtYmVyIGdldExvY2FsTWVtYmVyKCk7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBsb2NhbCBtZW1iZXIgcHJvcGVydGllcyBmb3IgYnJvYWRjYXN0aW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TG9jYWxNZW1iZXJQcm9wZXJ0aWVzKFN0cmluZyBsaXN0ZW5Ib3N0LCBpbnQgbGlzdGVuUG9ydCk7CisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbWVtYmVyc2hpcCBsaXN0ZW5lciwgb25seSBvbmUgbGlzdGVuZXIgY2FuIGJlIGFkZGVkLgorICAgICAqIElmIHlvdSBjYWxsIHRoaXMgbWV0aG9kIHR3aWNlLCB0aGUgbGFzdCBsaXN0ZW5lciB3aWxsIGJlIHVzZWQuCisgICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZE1lbWJlcnNoaXBMaXN0ZW5lcihNZW1iZXJzaGlwTGlzdGVuZXIgbGlzdGVuZXIpOworICAgIC8qKgorICAgICAqIHJlbW92ZXMgdGhlIG1lbWJlcnNoaXAgbGlzdGVuZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlTWVtYmVyc2hpcExpc3RlbmVyKCk7CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9NZXNzYWdlTGlzdGVuZXIuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9NZXNzYWdlTGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjg5YmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL01lc3NhZ2VMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyOworCitwdWJsaWMgaW50ZXJmYWNlIE1lc3NhZ2VMaXN0ZW5lciB7CisgICAgCisgICAgcHVibGljIHZvaWQgbWVzc2FnZVJlY2VpdmVkKENsdXN0ZXJNZXNzYWdlIG1zZyk7CisgICAgCisgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KENsdXN0ZXJNZXNzYWdlIG1zZyk7CisgICAgCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBsaXN0ZW5lcik7CisgICAgCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpOworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvZGVwbG95L0Zhcm1XYXJEZXBsb3llci5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL2RlcGxveS9GYXJtV2FyRGVwbG95ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzRkMjkwCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL2RlcGxveS9GYXJtV2FyRGVwbG95ZXIuamF2YQpAQCAtMCwwICsxLDM3MSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5kZXBsb3k7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuQ2x1c3RlckRlcGxveWVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5DbHVzdGVyTWVzc2FnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuQ2F0YWxpbmFDbHVzdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuTWVtYmVyOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworCisvKioKKyAqIDxwPgorICogQSBmYXJtIHdhciBkZXBsb3llciBpcyBhIGNsYXNzIHRoYXQgaXMgYWJsZSB0bworICogZGVwbG95L3VuZGVwbG95IHdlYiBhcHBsaWNhdGlvbnMgaW4gV0FSIGZvcm0KKyAqIHdpdGhpbiB0aGUgY2x1c3Rlci48L3A+CisgKiBBbnkgaG9zdCBjYW4gYWN0IGFzIHRoZSBhZG1pbiwgYW5kIHdpbGwgaGF2ZSB0aHJlZSBkaXJlY3RvcmllcworICogPHVsPgorICogPGxpPiBkZXBsb3lEaXIgLSB0aGUgZGlyZWN0b3J5IHdoZXJlIHdlIHdhdGNoIGZvciBjaGFuZ2VzPC9saT4KKyAqIDxsaT4gYXBwbGljYXRpb25EaXIgLSB0aGUgZGlyZWN0b3J5IHdoZXJlIHdlIGluc3RhbGwgYXBwbGljYXRpb25zPC9saT4KKyAqIDxsaT4gdGVtcERpciAtIGEgdGVtcG9yYXJ5RGlyZWN0b3J5IHRvIHN0b3JlIGJpbmFyeSBkYXRhIHdoZW4gZG93bmxvYWRpbmcgYSB3YXIKKyAqICAgICAgZnJvbSB0aGUgY2x1c3RlciA8L2xpPgorICogPC91bD4KKyAqIEN1cnJlbnRseSB3ZSBvbmx5IHN1cHBvcnQgZGVwbG95bWVudCBvZiBXQVIgZmlsZXMgc2luY2UgdGhleSBhcmUgZWFzaWVyIHRvIHNlbmQKKyAqIGFjcm9zcyB0aGUgd2lyZS4KKyAqCisgKiBAYXV0aG9yIEZpbGlwIEhhbmlrCisgKiBAdmVyc2lvbiAxLjAKKyAqLworcHVibGljIGNsYXNzIEZhcm1XYXJEZXBsb3llciBpbXBsZW1lbnRzIENsdXN0ZXJEZXBsb3llciwgRmlsZUNoYW5nZUxpc3RlbmVyIHsKKyAgICAvKi0tU3RhdGljIFZhcmlhYmxlcy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGxvZyA9CisgICAgICAgIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3RvcnkuZ2V0TG9nKEZhcm1XYXJEZXBsb3llci5jbGFzcyk7CisgICAgLyotLUluc3RhbmNlIFZhcmlhYmxlcy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBwcm90ZWN0ZWQgQ2F0YWxpbmFDbHVzdGVyIGNsdXN0ZXIgPSBudWxsOworICAgIHByb3RlY3RlZCBib29sZWFuIHN0YXJ0ZWQgPSBmYWxzZTsgLy9kZWZhdWx0IDUgc2Vjb25kcworICAgIHByb3RlY3RlZCBIYXNoTWFwIGZpbGVGYWN0b3JpZXMgPSBuZXcgSGFzaE1hcCgpOworICAgIHByb3RlY3RlZCBTdHJpbmcgZGVwbG95RGlyOworICAgIHByb3RlY3RlZCBTdHJpbmcgdGVtcERpcjsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHdhdGNoRGlyOworICAgIHByb3RlY3RlZCBib29sZWFuIHdhdGNoRW5hYmxlZCA9IGZhbHNlOworICAgIHByb3RlY3RlZCBXYXJXYXRjaGVyIHdhdGNoZXIgPSBudWxsOworICAgIC8qLS1Db25zdHJ1Y3Rvci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgcHVibGljIEZhcm1XYXJEZXBsb3llcigpIHsKKyAgICB9CisKKyAgICAvKi0tTG9naWMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChzdGFydGVkKXJldHVybjsKKyAgICAgICAgZ2V0Q2x1c3RlcigpLmFkZENsdXN0ZXJMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgaWYgKHdhdGNoRW5hYmxlZCkgeworICAgICAgICAgICAgd2F0Y2hlciA9IG5ldyBXYXJXYXRjaGVyKHRoaXMsIG5ldyBGaWxlKGdldFdhdGNoRGlyKCkpLCAobG9uZykgNTAwMCk7CisgICAgICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQod2F0Y2hlcik7CisgICAgICAgICAgICB0LnN0YXJ0KCk7CisgICAgICAgICAgICBsb2cuaW5mbygiQ2x1c3RlciBkZXBsb3ltZW50IGlzIHdhdGNoaW5nICIgKyBnZXRXYXRjaERpcigpICsKKyAgICAgICAgICAgICAgICAgICAgICIgZm9yIGNoYW5nZXMuIik7CisgICAgICAgIH0gLy9lbmQgaWYKKyAgICAgICAgc3RhcnRlZCA9IHRydWU7CisgICAgICAgIGxvZy5pbmZvKCJDbHVzdGVyIEZhcm1XYXJEZXBsb3llciBzdGFydGVkLiIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB0aHJvd3MgTGlmZWN5Y2xlRXhjZXB0aW9uIHsKKyAgICAgICAgc3RhcnRlZCA9IGZhbHNlOworICAgICAgICBnZXRDbHVzdGVyKCkucmVtb3ZlQ2x1c3Rlckxpc3RlbmVyKHRoaXMpOworICAgICAgICBpZiAod2F0Y2hlciAhPSBudWxsKSB3YXRjaGVyLnN0b3AoKTsKKyAgICAgICAgbG9nLmluZm8oIkNsdXN0ZXIgRmFybVdhckRlcGxveWVyIHN0b3BwZWQuIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xlYW5EZXBsb3lEaXIoKSB7CisgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAiTWV0aG9kIGNsZWFuRGVwbG95RGlyKCkgbm90IHlldCBpbXBsZW1lbnRlZC4iKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsYmFjayBmcm9tIHRoZSBjbHVzdGVyLCB3aGVuIGEgbWVzc2FnZSBpcyByZWNlaXZlZCwKKyAgICAgKiBUaGUgY2x1c3RlciB3aWxsIGJyb2FkY2FzdCBpdCBpbnZva2luZyB0aGUgbWVzc2FnZVJlY2VpdmVkCisgICAgICogb24gdGhlIHJlY2VpdmVyLgorICAgICAqIEBwYXJhbSBtc2cgQ2x1c3Rlck1lc3NhZ2UgLSB0aGUgbWVzc2FnZSByZWNlaXZlZCBmcm9tIHRoZSBjbHVzdGVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgbWVzc2FnZVJlY2VpdmVkKENsdXN0ZXJNZXNzYWdlIG1zZykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKG1zZyBpbnN0YW5jZW9mIEZpbGVNZXNzYWdlICYmIG1zZyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgRmlsZU1lc3NhZ2UgZm1zZyA9IChGaWxlTWVzc2FnZSkgbXNnOworICAgICAgICAgICAgICAgIEZpbGVNZXNzYWdlRmFjdG9yeSBmYWN0b3J5ID0gZ2V0RmFjdG9yeShmbXNnKTsKKyAgICAgICAgICAgICAgICBpZiAoZmFjdG9yeS53cml0ZU1lc3NhZ2UoZm1zZykpIHsKKyAgICAgICAgICAgICAgICAgICAgLy9sYXN0IG1lc3NhZ2UgcmVjZWl2ZWQKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBmYWN0b3J5LmdldEZpbGUoKS5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghbmFtZS5lbmRzV2l0aCgiLndhciIpKQorICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IG5hbWUgKyAiLndhciI7CisgICAgICAgICAgICAgICAgICAgIEZpbGUgZGVwbG95YWJsZSA9IG5ldyBGaWxlKGdldERlcGxveURpcigpLCBuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgZmFjdG9yeS5nZXRGaWxlKCkucmVuYW1lVG8oZGVwbG95YWJsZSk7CisgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FCisgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0RGVwbG95ZXIoKS5maW5kRGVwbG95ZWRBcHAoZm1zZy5nZXRDb250ZXh0UGF0aCgpKSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldERlcGxveWVyKCkucmVtb3ZlKGZtc2cuZ2V0Q29udGV4dFBhdGgoKSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiB4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgcmVtb3ZpbmcgZXhpc3RpbmcgY29udGV4dCBiZWZvcmUgaW5zdGFsbGluZyBhIG5ldyBvbmUuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB4KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBnZXREZXBsb3llcigpLmluc3RhbGwoZm1zZy5nZXRDb250ZXh0UGF0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwbG95YWJsZS50b1VSTCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIHJlbW92ZUZhY3RvcnkoZm1zZyk7CisgICAgICAgICAgICAgICAgfSAvL2VuZCBpZgorICAgICAgICAgICAgfSBlbHNlIGlmIChtc2cgaW5zdGFuY2VvZiBVbmRlcGxveU1lc3NhZ2UgJiYgbXNnICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBVbmRlcGxveU1lc3NhZ2UgdW1zZyA9IChVbmRlcGxveU1lc3NhZ2UpIG1zZzsKKyAgICAgICAgICAgICAgICAvLyBGSVhNRQorICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgaWYgKGdldERlcGxveWVyKCkuZmluZERlcGxveWVkQXBwKHVtc2cuZ2V0Q29udGV4dFBhdGgoKSkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgZ2V0RGVwbG95ZXIoKS5yZW1vdmUodW1zZy5nZXRDb250ZXh0UGF0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bXNnLmdldFVuZGVwbG95KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgfSAvL2VuZCBpZgorICAgICAgICB9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIHgpIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcigiVW5hYmxlIHRvIHJlYWQgZmFybSBkZXBsb3kgZmlsZSBtZXNzYWdlLiIsIHgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCBGaWxlTWVzc2FnZUZhY3RvcnkgZ2V0RmFjdG9yeShGaWxlTWVzc2FnZSBtc2cpIHRocm93cworICAgICAgICBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgIEZpbGUgdG1wRmlsZSA9IG5ldyBGaWxlKG1zZy5nZXRGaWxlTmFtZSgpKTsKKyAgICAgICAgRmlsZSB3cml0ZVRvRmlsZSA9IG5ldyBGaWxlKGdldFRlbXBEaXIoKSwgdG1wRmlsZS5nZXROYW1lKCkpOworICAgICAgICBGaWxlTWVzc2FnZUZhY3RvcnkgZmFjdG9yeSA9IChGaWxlTWVzc2FnZUZhY3RvcnkpIGZpbGVGYWN0b3JpZXMuZ2V0KG1zZy4KKyAgICAgICAgICAgIGdldEZpbGVOYW1lKCkpOworICAgICAgICBpZiAoZmFjdG9yeSA9PSBudWxsKSB7CisgICAgICAgICAgICBmYWN0b3J5ID0gRmlsZU1lc3NhZ2VGYWN0b3J5LmdldEluc3RhbmNlKHdyaXRlVG9GaWxlLCB0cnVlKTsKKyAgICAgICAgICAgIGZpbGVGYWN0b3JpZXMucHV0KG1zZy5nZXRGaWxlTmFtZSgpLCBmYWN0b3J5KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFjdG9yeTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVGYWN0b3J5KEZpbGVNZXNzYWdlIG1zZykgeworICAgICAgICBmaWxlRmFjdG9yaWVzLnJlbW92ZShtc2cuZ2V0RmlsZU5hbWUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQmVmb3JlIHRoZSBjbHVzdGVyIGludm9rZXMgbWVzc2FnZVJlY2VpdmVkIHRoZQorICAgICAqIGNsdXN0ZXIgd2lsbCBhc2sgdGhlIHJlY2VpdmVyIHRvIGFjY2VwdCBvciBkZWNsaW5lIHRoZSBtZXNzYWdlLAorICAgICAqIEluIHRoZSBmdXR1cmUsIHdoZW4gbWVzc2FnZXMgZ2V0IGJpZywgdGhlIGFjY2VwdCBtZXRob2Qgd2lsbCBvbmx5IHRha2UKKyAgICAgKiBhIG1lc3NhZ2UgaGVhZGVyCisgICAgICogQHBhcmFtIG1zZyBDbHVzdGVyTWVzc2FnZQorICAgICAqIEByZXR1cm4gYm9vbGVhbiAtIHJldHVybnMgdHJ1ZSB0byBpbmRpY2F0ZSB0aGF0IG1lc3NhZ2VSZWNlaXZlZAorICAgICAqIHNob3VsZCBiZSBpbnZva2VkLiBJZiBmYWxzZSBpcyByZXR1cm5lZCwgdGhlIG1lc3NhZ2VSZWNlaXZlZCBtZXRob2QKKyAgICAgKiB3aWxsIG5vdCBiZSBpbnZva2VkLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdChDbHVzdGVyTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgcmV0dXJuIChtc2cgaW5zdGFuY2VvZiBGaWxlTWVzc2FnZSkgfHwKKyAgICAgICAgICAgIChtc2cgaW5zdGFuY2VvZiBVbmRlcGxveU1lc3NhZ2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluc3RhbGwgYSBuZXcgd2ViIGFwcGxpY2F0aW9uLCB3aG9zZSB3ZWIgYXBwbGljYXRpb24gYXJjaGl2ZSBpcyBhdCB0aGUKKyAgICAgKiBzcGVjaWZpZWQgVVJMLCBpbnRvIHRoaXMgY29udGFpbmVyIGFuZCBhbGwgdGhlIG90aGVyCisgICAgICogbWVtYmVycyBvZiB0aGUgY2x1c3RlciB3aXRoIHRoZSBzcGVjaWZpZWQgY29udGV4dCBwYXRoLgorICAgICAqIEEgY29udGV4dCBwYXRoIG9mICIiICh0aGUgZW1wdHkgc3RyaW5nKSBzaG91bGQgYmUgdXNlZCBmb3IgdGhlIHJvb3QKKyAgICAgKiBhcHBsaWNhdGlvbiBmb3IgdGhpcyBjb250YWluZXIuICBPdGhlcndpc2UsIHRoZSBjb250ZXh0IHBhdGggbXVzdAorICAgICAqIHN0YXJ0IHdpdGggYSBzbGFzaC4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiB0aGlzIGFwcGxpY2F0aW9uIGlzIHN1Y2Nlc3NmdWxseSBpbnN0YWxsZWQgbG9jYWxseSwKKyAgICAgKiBhIENvbnRhaW5lckV2ZW50IG9mIHR5cGUKKyAgICAgKiA8Y29kZT5JTlNUQUxMX0VWRU5UPC9jb2RlPiB3aWxsIGJlIHNlbnQgdG8gYWxsIHJlZ2lzdGVyZWQgbGlzdGVuZXJzLAorICAgICAqIHdpdGggdGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Q29udGV4dDwvY29kZT4gYXMgYW4gYXJndW1lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dFBhdGggVGhlIGNvbnRleHQgcGF0aCB0byB3aGljaCB0aGlzIGFwcGxpY2F0aW9uIHNob3VsZAorICAgICAqICBiZSBpbnN0YWxsZWQgKG11c3QgYmUgdW5pcXVlKQorICAgICAqIEBwYXJhbSB3YXIgQSBVUkwgb2YgdHlwZSAiamFyOiIgdGhhdCBwb2ludHMgdG8gYSBXQVIgZmlsZSwgb3IgdHlwZQorICAgICAqICAiZmlsZToiIHRoYXQgcG9pbnRzIHRvIGFuIHVucGFja2VkIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgY29udGFpbmluZworICAgICAqICB0aGUgd2ViIGFwcGxpY2F0aW9uIHRvIGJlIGluc3RhbGxlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHNwZWNpZmllZCBjb250ZXh0IHBhdGgKKyAgICAgKiAgaXMgbWFsZm9ybWVkIChpdCBtdXN0IGJlICIiIG9yIHN0YXJ0IHdpdGggYSBzbGFzaCkKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGUgc3BlY2lmaWVkIGNvbnRleHQgcGF0aAorICAgICAqICBpcyBhbHJlYWR5IGF0dGFjaGVkIHRvIGFuIGV4aXN0aW5nIHdlYiBhcHBsaWNhdGlvbgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIHdhcyBlbmNvdW50ZXJlZAorICAgICAqICBkdXJpbmcgaW5zdGFsbGF0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgaW5zdGFsbChTdHJpbmcgY29udGV4dFBhdGgsIFVSTCB3YXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgCS8vIEZJWE1FCisgICAgCS8qCisgICAgICAgIGlmIChnZXREZXBsb3llcigpLmZpbmREZXBsb3llZEFwcChjb250ZXh0UGF0aCkgIT0gbnVsbCkKKyAgICAgICAgICAgIGdldERlcGxveWVyKCkucmVtb3ZlKGNvbnRleHRQYXRoLCB0cnVlKTsKKyAgICAgICAgICAgIC8vc3RlcCAxLiBJbnN0YWxsIGl0IGxvY2FsbHkKKyAgICAgICAgZ2V0RGVwbG95ZXIoKS5pbnN0YWxsKGNvbnRleHRQYXRoLCB3YXIpOworICAgICAgICAqLworICAgICAgICAvL3N0ZXAgMi4gU2VuZCBpdCB0byBlYWNoIG1lbWJlciBpbiB0aGUgY2x1c3RlcgorICAgICAgICBNZW1iZXJbXSBtZW1iZXJzID0gZ2V0Q2x1c3RlcigpLmdldE1lbWJlcnMoKTsKKyAgICAgICAgTWVtYmVyIGxvY2FsTWVtYmVyID0gZ2V0Q2x1c3RlcigpLmdldExvY2FsTWVtYmVyKCk7CisgICAgICAgIEZpbGVNZXNzYWdlRmFjdG9yeSBmYWN0b3J5ID0gRmlsZU1lc3NhZ2VGYWN0b3J5LmdldEluc3RhbmNlKG5ldyBGaWxlKAorICAgICAgICAgICAgd2FyLmdldEZpbGUoKSksIGZhbHNlKTsKKyAgICAgICAgRmlsZU1lc3NhZ2UgbXNnID0gbmV3IEZpbGVNZXNzYWdlKGxvY2FsTWVtYmVyLCB3YXIuZ2V0RmlsZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dFBhdGgpOworICAgICAgICBtc2cgPSBmYWN0b3J5LnJlYWRNZXNzYWdlKG1zZyk7CisgICAgICAgIHdoaWxlIChtc2cgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZW1iZXJzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgZ2V0Q2x1c3RlcigpLnNlbmQobXNnLCBtZW1iZXJzW2ldKTsKKyAgICAgICAgICAgIH0gLy9mb3IKKyAgICAgICAgICAgIG1zZyA9IGZhY3RvcnkucmVhZE1lc3NhZ2UobXNnKTsKKyAgICAgICAgfSAvL3doaWxlCisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlIGFuIGV4aXN0aW5nIHdlYiBhcHBsaWNhdGlvbiwgYXR0YWNoZWQgdG8gdGhlIHNwZWNpZmllZCBjb250ZXh0CisgICAgICogcGF0aC4gIElmIHRoaXMgYXBwbGljYXRpb24gaXMgc3VjY2Vzc2Z1bGx5IHJlbW92ZWQsIGEKKyAgICAgKiBDb250YWluZXJFdmVudCBvZiB0eXBlIDxjb2RlPlJFTU9WRV9FVkVOVDwvY29kZT4gd2lsbCBiZSBzZW50IHRvIGFsbAorICAgICAqIHJlZ2lzdGVyZWQgbGlzdGVuZXJzLCB3aXRoIHRoZSByZW1vdmVkIDxjb2RlPkNvbnRleHQ8L2NvZGU+IGFzCisgICAgICogYW4gYXJndW1lbnQuIERlbGV0ZXMgdGhlIHdlYiBhcHBsaWNhdGlvbiB3YXIgZmlsZSBhbmQvb3IgZGlyZWN0b3J5CisgICAgICogaWYgdGhleSBleGlzdCBpbiB0aGUgSG9zdCdzIGFwcEJhc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dFBhdGggVGhlIGNvbnRleHQgcGF0aCBvZiB0aGUgYXBwbGljYXRpb24gdG8gYmUgcmVtb3ZlZAorICAgICAqIEBwYXJhbSB1bmRlcGxveSBib29sZWFuIGZsYWcgdG8gcmVtb3ZlIHdlYiBhcHBsaWNhdGlvbiBmcm9tIHNlcnZlcgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHNwZWNpZmllZCBjb250ZXh0IHBhdGgKKyAgICAgKiAgaXMgbWFsZm9ybWVkIChpdCBtdXN0IGJlICIiIG9yIHN0YXJ0IHdpdGggYSBzbGFzaCkKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgc3BlY2lmaWVkIGNvbnRleHQgcGF0aCBkb2VzCisgICAgICogIG5vdCBpZGVudGlmeSBhIGN1cnJlbnRseSBpbnN0YWxsZWQgd2ViIGFwcGxpY2F0aW9uCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzIGR1cmluZworICAgICAqICByZW1vdmFsCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlKFN0cmluZyBjb250ZXh0UGF0aCwgYm9vbGVhbiB1bmRlcGxveSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgbG9nLmluZm8oIkNsdXN0ZXIgd2lkZSByZW1vdmUgb2Ygd2ViIGFwcCAiICsgY29udGV4dFBhdGgpOworICAgICAgICAvL3N0ZXAgMS4gUmVtb3ZlIGl0IGxvY2FsbHkKKyAgICAgICAgCisgICAgICAgIC8vIEZJWE1FCisgICAgICAgIC8qCisgICAgICAgIGlmIChnZXREZXBsb3llcigpLmZpbmREZXBsb3llZEFwcChjb250ZXh0UGF0aCkgIT0gbnVsbCkKKyAgICAgICAgICAgIGdldERlcGxveWVyKCkucmVtb3ZlKGNvbnRleHRQYXRoLCB1bmRlcGxveSk7CisgICAgICAgICAgICAqLworICAgICAgICAgICAgLy9zdGVwIDIuIFNlbmQgaXQgdG8gZWFjaCBtZW1iZXIgaW4gdGhlIGNsdXN0ZXIKKyAgICAgICAgTWVtYmVyW10gbWVtYmVycyA9IGdldENsdXN0ZXIoKS5nZXRNZW1iZXJzKCk7CisgICAgICAgIE1lbWJlciBsb2NhbE1lbWJlciA9IGdldENsdXN0ZXIoKS5nZXRMb2NhbE1lbWJlcigpOworICAgICAgICBVbmRlcGxveU1lc3NhZ2UgbXNnID0gbmV3IFVuZGVwbG95TWVzc2FnZShsb2NhbE1lbWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmRlcGxveToiICsgY29udGV4dFBhdGggKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dFBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVwbG95KTsKKyAgICAgICAgY2x1c3Rlci5zZW5kKG1zZyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZmlsZU1vZGlmaWVkKEZpbGUgbmV3V2FyKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBGaWxlIGRlcGxveVdhciA9IG5ldyBGaWxlKGdldERlcGxveURpcigpLG5ld1dhci5nZXROYW1lKCkpOworICAgICAgICAgICAgY29weShuZXdXYXIsZGVwbG95V2FyKTsKKyAgICAgICAgICAgIFN0cmluZyBjb250ZXh0TmFtZSA9ICIvIiArIGRlcGxveVdhci5nZXROYW1lKCkuc3Vic3RyaW5nKDAsCisgICAgICAgICAgICAgICAgZGVwbG95V2FyLmdldE5hbWUoKS5sYXN0SW5kZXhPZigiLndhciIpKTsKKyAgICAgICAgICAgIGxvZy5pbmZvKCJJbnN0YWxsaW5nIHdlYmFwcFsiICsgY29udGV4dE5hbWUgKyAiXSBmcm9tICIgKyBkZXBsb3lXYXIuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZW1vdmUoY29udGV4dE5hbWUsIHRydWUpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIHgpIHsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIk5vIHJlbW92YWwiLCB4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGluc3RhbGwoY29udGV4dE5hbWUsIGRlcGxveVdhci50b1VSTCgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIHgpIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcigiVW5hYmxlIHRvIGluc3RhbGwgV0FSIGZpbGUiLCB4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGZpbGVSZW1vdmVkKEZpbGUgcmVtb3ZlV2FyKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTdHJpbmcgY29udGV4dE5hbWUgPSAiLyIgKyByZW1vdmVXYXIuZ2V0TmFtZSgpLnN1YnN0cmluZygwLAorICAgICAgICAgICAgICAgIHJlbW92ZVdhci5nZXROYW1lKCkubGFzdEluZGV4T2YoIi53YXIiKSk7CisgICAgICAgICAgICBsb2cuaW5mbygiUmVtb3Zpbmcgd2ViYXBwWyIgKyBjb250ZXh0TmFtZSArICJdIik7CisgICAgICAgICAgICByZW1vdmUoY29udGV4dE5hbWUsIHRydWUpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24geCkgeworICAgICAgICAgICAgbG9nLmVycm9yKCJVbmFibGUgdG8gcmVtb3ZlIFdBUiBmaWxlIiwgeCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKi0tSW5zdGFuY2UgR2V0dGVycy9TZXR0ZXJzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIHB1YmxpYyBDYXRhbGluYUNsdXN0ZXIgZ2V0Q2x1c3RlcigpIHsKKyAgICAgICAgcmV0dXJuIGNsdXN0ZXI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q2x1c3RlcihDYXRhbGluYUNsdXN0ZXIgY2x1c3RlcikgeworICAgICAgICB0aGlzLmNsdXN0ZXIgPSBjbHVzdGVyOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbGlzdGVuZXIpIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLmVxdWFscyhsaXN0ZW5lcik7CisgICAgfQorCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLmhhc2hDb2RlKCk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXREZXBsb3lEaXIoKSB7CisgICAgICAgIHJldHVybiBkZXBsb3lEaXI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RGVwbG95RGlyKFN0cmluZyBkZXBsb3lEaXIpIHsKKyAgICAgICAgdGhpcy5kZXBsb3lEaXIgPSBkZXBsb3lEaXI7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRUZW1wRGlyKCkgeworICAgICAgICByZXR1cm4gdGVtcERpcjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUZW1wRGlyKFN0cmluZyB0ZW1wRGlyKSB7CisgICAgICAgIHRoaXMudGVtcERpciA9IHRlbXBEaXI7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRXYXRjaERpcigpIHsKKyAgICAgICAgcmV0dXJuIHdhdGNoRGlyOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFdhdGNoRGlyKFN0cmluZyB3YXRjaERpcikgeworICAgICAgICB0aGlzLndhdGNoRGlyID0gd2F0Y2hEaXI7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNXYXRjaEVuYWJsZWQoKSB7CisgICAgICAgIHJldHVybiB3YXRjaEVuYWJsZWQ7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZ2V0V2F0Y2hFbmFibGVkKCkgeworICAgICAgICByZXR1cm4gd2F0Y2hFbmFibGVkOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFdhdGNoRW5hYmxlZChib29sZWFuIHdhdGNoRW5hYmxlZCkgeworICAgICAgICB0aGlzLndhdGNoRW5hYmxlZCA9IHdhdGNoRW5hYmxlZDsKKyAgICB9CisgICAgCisgICAgLyoqCisKKworCisgICAgLyoqCisgICAgICogQ29weSBhIGZpbGUgdG8gdGhlIHNwZWNpZmllZCB0ZW1wIGRpcmVjdG9yeS4gVGhpcyBpcyByZXF1aXJlZCBvbmx5CisgICAgICogYmVjYXVzZSBKYXNwZXIgZGVwZW5kcyBvbiBpdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gY29weShGaWxlIGZyb20sIEZpbGUgdG8pIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICggIXRvLmV4aXN0cygpICkgdG8uY3JlYXRlTmV3RmlsZSgpOworICAgICAgICAgICAgamF2YS5pby5GaWxlSW5wdXRTdHJlYW0gaXMgPSBuZXcgamF2YS5pby5GaWxlSW5wdXRTdHJlYW0oZnJvbSk7CisgICAgICAgICAgICBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW0gb3MgPSBuZXcgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtKHRvLGZhbHNlKTsKKyAgICAgICAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVs0MDk2XTsKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgICAgaW50IGxlbiA9IGlzLnJlYWQoYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAobGVuIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgb3Mud3JpdGUoYnVmLCAwLCBsZW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaXMuY2xvc2UoKTsKKyAgICAgICAgICAgIG9zLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcigiVW5hYmxlIHRvIGNvcHkgZmlsZSBmcm9tOiIrZnJvbSsiIHRvOiIrdG8sZSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvZGVwbG95L0ZpbGVDaGFuZ2VMaXN0ZW5lci5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL2RlcGxveS9GaWxlQ2hhbmdlTGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWJjYWYzCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL2RlcGxveS9GaWxlQ2hhbmdlTGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDIzIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLmRlcGxveTsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKK3B1YmxpYyBpbnRlcmZhY2UgRmlsZUNoYW5nZUxpc3RlbmVyIHsKKyAgICBwdWJsaWMgdm9pZCBmaWxlTW9kaWZpZWQoRmlsZSBmKTsKKyAgICBwdWJsaWMgdm9pZCBmaWxlUmVtb3ZlZChGaWxlIGYpOworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL2RlcGxveS9GaWxlTWVzc2FnZS5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL2RlcGxveS9GaWxlTWVzc2FnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlMzIyMjYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvZGVwbG95L0ZpbGVNZXNzYWdlLmphdmEKQEAgLTAsMCArMSwxMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuZGVwbG95OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLkNsdXN0ZXJNZXNzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5NZW1iZXI7CitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CisKKy8qKgorICogQ29udGFpbnMgdGhlIGRhdGEgZm9yIGEgZmlsZSBiZWluZyB0cmFuc2ZlcnJlZCBvdmVyIFRDUCwgdGhpcyBpcyAKKyAqIGVzc2VudGlhbGx5IGEgZnJhZ21lbnQgb2YgYSBmaWxlLCByZWFkIGFuZCB3cml0dGVuIGJ5IHRoZSBGaWxlTWVzc2FnZUZhY3RvcnkKKyAqIEBhdXRob3IgRmlsaXAgSGFuaWsKKyAqIEB2ZXJzaW9uIDEuMAorICovCisKK3B1YmxpYyBjbGFzcyBGaWxlTWVzc2FnZSBpbXBsZW1lbnRzIENsdXN0ZXJNZXNzYWdlLCBTZXJpYWxpemFibGUgeworICAgIHByaXZhdGUgaW50IG1lc3NhZ2VOdW1iZXI7CisgICAgcHJpdmF0ZSBieXRlW10gZGF0YTsKKyAgICBwcml2YXRlIGludCBkYXRhTGVuZ3RoOworICAgIHByaXZhdGUgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLk1lbWJlciBhZGRyZXNzOworICAgIAorICAgIHByaXZhdGUgbG9uZyB0aW1lc3RhbXA7CisgICAgcHJpdmF0ZSBsb25nIHRvdGFsTGVuZ3RoOworICAgIHByaXZhdGUgbG9uZyB0b3RhbE5yT2ZNc2dzOworICAgIHByaXZhdGUgU3RyaW5nIGZpbGVOYW1lOworICAgIHByaXZhdGUgU3RyaW5nIGNvbnRleHRQYXRoOworICAgIAorICAgIHB1YmxpYyBGaWxlTWVzc2FnZShNZW1iZXIgc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjb250ZXh0UGF0aCkgeworICAgICAgICB0aGlzLmFkZHJlc3M9c291cmNlOworICAgICAgICB0aGlzLmZpbGVOYW1lPWZpbGVOYW1lOworICAgICAgICB0aGlzLmNvbnRleHRQYXRoPWNvbnRleHRQYXRoOworICAgIH0KKyAgICAKKyAgICAvKgorICAgIHB1YmxpYyB2b2lkIHdyaXRlRXh0ZXJuYWwoT2JqZWN0T3V0cHV0IG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgcmVhZEV4dGVybmFsKE9iamVjdElucHV0IGluKSB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgCisgICAgfQorICAgICovCisgICAKKyAgICBwdWJsaWMgaW50IGdldE1lc3NhZ2VOdW1iZXIoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlTnVtYmVyOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlTnVtYmVyKGludCBtZXNzYWdlTnVtYmVyKSB7CisgICAgICAgIHRoaXMubWVzc2FnZU51bWJlciA9IG1lc3NhZ2VOdW1iZXI7CisgICAgfQorICAgIHB1YmxpYyBsb25nIGdldFRvdGFsTnJPZk1zZ3MoKSB7CisgICAgICAgIHJldHVybiB0b3RhbE5yT2ZNc2dzOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBzZXRUb3RhbE5yT2ZNc2dzKGxvbmcgdG90YWxOck9mTXNncykgeworICAgICAgICB0aGlzLnRvdGFsTnJPZk1zZ3MgPSB0b3RhbE5yT2ZNc2dzOworICAgIH0KKyAgICBwdWJsaWMgYnl0ZVtdIGdldERhdGEoKSB7CisgICAgICAgIHJldHVybiBkYXRhOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBzZXREYXRhKGJ5dGVbXSBkYXRhLCBpbnQgbGVuZ3RoKSB7CisgICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7CisgICAgICAgIHRoaXMuZGF0YUxlbmd0aCA9IGxlbmd0aDsKKyAgICB9CisgICAgcHVibGljIGludCBnZXREYXRhTGVuZ3RoKCkgeworICAgICAgICByZXR1cm4gZGF0YUxlbmd0aDsKKyAgICB9CisgICAgcHVibGljIHZvaWQgc2V0RGF0YUxlbmd0aChpbnQgZGF0YUxlbmd0aCkgeworICAgICAgICB0aGlzLmRhdGFMZW5ndGggPSBkYXRhTGVuZ3RoOworICAgIH0KKyAgICBwdWJsaWMgbG9uZyBnZXRUb3RhbExlbmd0aCgpIHsKKyAgICAgICAgcmV0dXJuIHRvdGFsTGVuZ3RoOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBzZXRUb3RhbExlbmd0aChsb25nIHRvdGFsTGVuZ3RoKSB7CisgICAgICAgIHRoaXMudG90YWxMZW5ndGggPSB0b3RhbExlbmd0aDsKKyAgICB9CisgICAgcHVibGljIG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5NZW1iZXIgZ2V0QWRkcmVzcygpIHsKKyAgICAgICAgcmV0dXJuIGFkZHJlc3M7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHNldEFkZHJlc3Mob3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLk1lbWJlciBhZGRyZXNzKSB7CisgICAgICAgIHRoaXMuYWRkcmVzcyA9IGFkZHJlc3M7CisgICAgfQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0VW5pcXVlSWQoKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKGdldEZpbGVOYW1lKCkpOworICAgICAgICByZXN1bHQuYXBwZW5kKCIjLSMiKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChnZXRNZXNzYWdlTnVtYmVyKCkpOworICAgICAgICByZXN1bHQuYXBwZW5kKCIjLSMiKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisgICAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBnZXRUaW1lc3RhbXAoKSB7CisgICAgICAgIHJldHVybiB0aW1lc3RhbXA7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHNldFRpbWVzdGFtcChsb25nIHRpbWVzdGFtcCkgeworICAgICAgICB0aGlzLnRpbWVzdGFtcCA9IHRpbWVzdGFtcDsKKyAgICB9CisgICAgcHVibGljIFN0cmluZyBnZXRGaWxlTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIGZpbGVOYW1lOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBzZXRGaWxlTmFtZShTdHJpbmcgZmlsZU5hbWUpIHsKKyAgICAgICAgdGhpcy5maWxlTmFtZSA9IGZpbGVOYW1lOworICAgIH0KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRleHRQYXRoKCkgeworICAgICAgICByZXR1cm4gY29udGV4dFBhdGg7CisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9kZXBsb3kvRmlsZU1lc3NhZ2VGYWN0b3J5LmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvZGVwbG95L0ZpbGVNZXNzYWdlRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjMGZkNTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvZGVwbG95L0ZpbGVNZXNzYWdlRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMjQ4IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLmRlcGxveTsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CisvKioKKyAqIFRoaXMgZmFjdG9yeSBpcyB1c2VkIHRvIHJlYWQgZmlsZXMgYW5kIHdyaXRlIGZpbGVzIGJ5IHNwbGl0dGluZyB0aGVtIHVwIGludG8gc21hbGxlcgorICogbWVzc2FnZXMuIFNvIHRoYXQgZW50aXJlIGZpbGVzIGRvbid0IGhhdmUgdG8gYmUgcmVhZCBpbnRvIG1lbW9yeS48QlI+CisgKiBUaGUgZmFjdG9yeSBjYW4gYmUgdXNlZCBhcyBhIHJlYWRlciBvciB3cml0ZXIgYnV0IG5vdCBib3RoIGF0IHRoZSBzYW1lIHRpbWUuCisgKiBXaGVuIGRvbmUgcmVhZGluZyBvciB3cml0aW5nIHRoZSBmYWN0b3J5IHdpbGwgY2xvc2UgdGhlIGlucHV0IG9yIG91dHB1dCBzdHJlYW1zCisgKiBhbmQgbWFyayB0aGUgZmFjdG9yeSBhcyBjbG9zZWQuIEl0IGlzIG5vdCBwb3NzaWJsZSB0byB1c2UgaXQgYWZ0ZXIgdGhhdC48QlI+CisgKiBUbyBmb3JjZSBhIGNsZWFudXAsIGNhbGwgY2xlYW51cCgpIGZyb20gdGhlIGNhbGxpbmcgb2JqZWN0LjxCUj4KKyAqIFRoaXMgY2xhc3MgaXMgbm90IHRocmVhZCBzYWZlLiAKKyAqIEBhdXRob3IgRmlsaXAgSGFuaWsKKyAqIEB2ZXJzaW9uIDEuMAorICovCitwdWJsaWMgY2xhc3MgRmlsZU1lc3NhZ2VGYWN0b3J5IHsKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd2UgcmVhZCBmcm9tIGZpbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRUFEX1NJWkUgPSAxMDI0KjEwOyAvLzEwa2IKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgZmlsZSB0aGF0IHdlIGFyZSByZWFkaW5nL3dyaXRpbmcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRmlsZSBmaWxlID0gbnVsbDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBUcnVlIG1lYW5zIHRoYXQgd2UgYXJlIHdyaXRpbmcgd2l0aCB0aGlzIGZhY3RvcnkuCisgICAgICogRmFsc2UgbWVhbnMgdGhhdCB3ZSBhcmUgcmVhZGluZyB3aXRoIHRoaXMgZmFjdG9yeQorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIG9wZW5Gb3JXcml0ZTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBPbmNlIHRoZSBmYWN0b3J5IGlzIHVzZWQsIGl0IGNhbiBub3QgYmUgcmV1c2VkLgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGNsb3NlZCA9IGZhbHNlOworICAgIAorICAgIC8qKgorICAgICAqIFdoZW4gb3BlbkZvcldyaXRlPWZhbHNlLCB0aGUgaW5wdXQgc3RyZWFtIAorICAgICAqIGlzIGhlbGQgYnkgdGhpcyB2YXJpYWJsZQorICAgICAqLworICAgIHByb3RlY3RlZCBGaWxlSW5wdXRTdHJlYW0gaW47CisgICAgCisgICAgLyoqCisgICAgICogV2hlbiBvcGVuRm9yV3JpdGU9dHJ1ZSwgdGhlIG91dHB1dCBzdHJlYW0gCisgICAgICogaXMgaGVsZCBieSB0aGlzIHZhcmlhYmxlCisgICAgICovCisgICAgcHJvdGVjdGVkIEZpbGVPdXRwdXRTdHJlYW0gb3V0OworICAgIAorICAgIC8qKgorICAgICAqIFRoZSBudW1iZXIgb2YgbWVzc2FnZXMgd2UgaGF2ZSByZWFkIG9yIHdyaXR0ZW4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IG5yT2ZNZXNzYWdlc1Byb2Nlc3NlZCA9IDA7CisgICAgCisgICAgLyoqCisgICAgICogVGhlIHRvdGFsIHNpemUgb2YgdGhlIGZpbGUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgbG9uZyBzaXplID0gMDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIHBhY2tldHMgdGhhdCB3ZSBzcGxpdCB0aGlzIGZpbGUgaW50bworICAgICAqLworICAgIHByb3RlY3RlZCBsb25nIHRvdGFsTnJPZk1lc3NhZ2VzID0gMDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgYnl0ZXMgdGhhdCB3ZSBob2xkIHRoZSBkYXRhIGluLCBub3QgdGhyZWFkIHNhZmUuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJ5dGVbXSBkYXRhID0gbmV3IGJ5dGVbUkVBRF9TSVpFXTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBQcml2YXRlIGNvbnN0cnVjdG9yLCBlaXRoZXIgaW5zdGFudGlhdGVzIGEgZmFjdG9yeSB0byByZWFkIG9yIHdyaXRlLjxCUj4KKyAgICAgKiBXaGVuIG9wZW5Gb3JXcml0ZT09dHJ1ZSwgdGhlbiBhIHRoZSBmaWxlLCBmLCB3aWxsIGJlIGNyZWF0ZWQgYW5kIGFuIG91dHB1dCAKKyAgICAgKiBzdHJlYW0gaXMgb3BlbmVkIHRvIHdyaXRlIHRvIGl0LjxCUj4KKyAgICAgKiBXaGVuIG9wZW5Gb3JXcml0ZT09ZmFsc2UsIGFuIGlucHV0IHN0cmVhbSBpcyBvcGVuZWQsIHRoZSBmaWxlIGhhcyB0byBleGlzdC4KKyAgICAgKiBAcGFyYW0gZiBGaWxlIC0gdGhlIGZpbGUgdG8gYmUgcmVhZC93cml0dGVuCisgICAgICogQHBhcmFtIG9wZW5Gb3JXcml0ZSBib29sZWFuIC0gdHJ1ZSBtZWFucyB3ZSBhcmUgd3JpdGluZyB0byB0aGUgZmlsZSwgZmFsc2UgCisgICAgICogbWVhbnMgd2UgYXJlIHJlYWRpbmcgZnJvbSB0aGUgZmlsZQorICAgICAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIC0gaWYgdGhlIGZpbGUgdG8gYmUgcmVhZCBkb2Vzbid0IGV4aXN0CisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiAtIGlmIHRoZSBzeXN0ZW0gZmFpbHMgdG8gb3BlbiBpbnB1dC9vdXRwdXQgc3RyZWFtcyB0byB0aGUgZmlsZQorICAgICAqIG9yIGlmIGl0IGZhaWxzIHRvIGNyZWF0ZSB0aGUgZmlsZSB0byBiZSB3cml0dGVuIHRvLgorICAgICAqLworICAgIHByaXZhdGUgRmlsZU1lc3NhZ2VGYWN0b3J5KEZpbGUgZiwgYm9vbGVhbiBvcGVuRm9yV3JpdGUpIAorICAgICAgICB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbnsKKyAgICAgICAgdGhpcy5maWxlID0gZjsKKyAgICAgICAgdGhpcy5vcGVuRm9yV3JpdGUgPSBvcGVuRm9yV3JpdGU7CisgICAgICAgIGlmICggb3BlbkZvcldyaXRlICkgeworICAgICAgICAgICAgaWYgKCFmaWxlLmV4aXN0cygpKSBmaWxlLmNyZWF0ZU5ld0ZpbGUoKTsKKyAgICAgICAgICAgIG91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGYpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2l6ZSA9IGZpbGUubGVuZ3RoKCk7CisgICAgICAgICAgICB0b3RhbE5yT2ZNZXNzYWdlcyA9IChzaXplIC8gUkVBRF9TSVpFKSArIDE7CisgICAgICAgICAgICBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZik7CisgICAgICAgIH0vL2VuZCBpZgorICAgICAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBmYWN0b3J5IHRvIHJlYWQgb3Igd3JpdGUgZnJvbSBhIGZpbGUuCisgICAgICogV2hlbiBvcGVuaW5nIGZvciByZWFkLCB0aGUgcmVhZE1lc3NhZ2UgY2FuIGJlIGludm9rZWQsIGFuZCB3aGVuCisgICAgICogb3BlbmluZyBmb3Igd3JpdGUgdGhlIHdyaXRlTWVzc2FnZSBjYW4gYmUgaW52b2tlZC4KKyAgICAgKiBAcGFyYW0gZiBGaWxlIC0gdGhlIGZpbGUgdG8gYmUgcmVhZCBvciB3cml0dGVuCisgICAgICogQHBhcmFtIG9wZW5Gb3JXcml0ZSBib29sZWFuIC0gdHJ1ZSwgbWVhbnMgd2UgYXJlIHdyaXRpbmcgdG8gdGhlIGZpbGUsIGZhbHNlIG1lYW5zIHdlIGFyZSAKKyAgICAgKiByZWFkaW5nIGZyb20gaXQgCisgICAgICogQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gLSBpZiB0aGUgZmlsZSB0byBiZSByZWFkIGRvZXNuJ3QgZXhpc3QKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIC0gaWYgaXQgZmFpbHMgdG8gY3JlYXRlIHRoZSBmaWxlIHRoYXQgaXMgdG8gYmUgd3JpdHRlbgorICAgICAqIEByZXR1cm4gRmlsZU1lc3NhZ2VGYWN0b3J5IAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgRmlsZU1lc3NhZ2VGYWN0b3J5IGdldEluc3RhbmNlKEZpbGUgZiwgYm9vbGVhbiBvcGVuRm9yV3JpdGUpIAorICAgICAgICB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgRmlsZU1lc3NhZ2VGYWN0b3J5KGYsb3BlbkZvcldyaXRlKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmVhZHMgZmlsZSBkYXRhIGludG8gdGhlIGZpbGUgbWVzc2FnZSBhbmQgc2V0cyB0aGUgCisgICAgICogc2l6ZSwgdG90YWxMZW5ndGgsIHRvdGFsTnJPZk1zZ3MgYW5kIHRoZSBtZXNzYWdlIG51bWJlcjxCUj4KKyAgICAgKiBJZiBFT0YgaXMgcmVhY2hlZCwgdGhlIGZhY3RvcnkgcmV0dXJucyBudWxsLCBhbmQgY2xvc2VzIGl0c2VsZiwKKyAgICAgKiBvdGhlcndpc2UgdGhlIHNhbWUgbWVzc2FnZSBpcyByZXR1cm5lZCBhcyB3YXMgcGFzc2VkIGluLgorICAgICAqIFRoaXMgbWFrZXMgc3VyZSB0aGF0IG5vdCBtb3JlIG1lbW9yeSBpcyBldmVyIHVzZWQuIAorICAgICAqIFRvIHJlbWVtYmVyLCBuZWl0aGVyIHRoZSBmaWxlIG1lc3NhZ2Ugb3IgdGhlIGZhY3RvcnkgYXJlIHRocmVhZCBzYWZlLgorICAgICAqIGRvbnQgaGFuZCBvZmYgdGhlIG1lc3NhZ2UgdG8gb25lIHRocmVhZCBhbmQgcmVhZCB0aGUgc2FtZSB3aXRoIGFub3RoZXIuIAorICAgICAqIEBwYXJhbSBmIEZpbGVNZXNzYWdlIC0gdGhlIG1lc3NhZ2UgdG8gYmUgcG9wdWxhdGVkIHdpdGggZmlsZSBkYXRhCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gLSBpZiB0aGUgZmFjdG9yeSBpcyBmb3Igd3JpdGluZyBvciBpcyBjbG9zZWQKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIC0gaWYgYSBmaWxlIHJlYWQgZXhjZXB0aW9uIG9jY3VycworICAgICAqIEByZXR1cm4gRmlsZU1lc3NhZ2UgLSByZXR1cm5zIHRoZSBzYW1lIG1lc3NhZ2UgcGFzc2VkIGluIGFzIGEgcGFyYW1ldGVyLCBvciBudWxsIGlmIEVPRgorICAgICAqLworICAgIHB1YmxpYyBGaWxlTWVzc2FnZSByZWFkTWVzc2FnZShGaWxlTWVzc2FnZSBmKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGNoZWNrU3RhdGUoZmFsc2UpOworICAgICAgICBpbnQgbGVuZ3RoID0gaW4ucmVhZChkYXRhKTsKKyAgICAgICAgaWYgKCBsZW5ndGggPT0gLTEgKSB7CisgICAgICAgICAgICBjbGVhbnVwKCk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGYuc2V0RGF0YShkYXRhLCBsZW5ndGgpOworICAgICAgICAgICAgZi5zZXRUb3RhbExlbmd0aChzaXplKTsKKyAgICAgICAgICAgIGYuc2V0VG90YWxOck9mTXNncyh0b3RhbE5yT2ZNZXNzYWdlcyk7CisgICAgICAgICAgICBmLnNldE1lc3NhZ2VOdW1iZXIoKytuck9mTWVzc2FnZXNQcm9jZXNzZWQpOworICAgICAgICAgICAgcmV0dXJuIGY7CisgICAgICAgIH0vL2VuZCBpZgorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgYSBtZXNzYWdlIHRvIGZpbGUuIElmIChtc2cuZ2V0TWVzc2FnZU51bWJlcigpID09IG1zZy5nZXRUb3RhbE5yT2ZNc2dzKCkpCisgICAgICogdGhlIG91dHB1dCBzdHJlYW0gd2lsbCBiZSBjbG9zZWQgYWZ0ZXIgd3JpdGluZy4gIAorICAgICAqIEBwYXJhbSBtc2cgRmlsZU1lc3NhZ2UgLSBtZXNzYWdlIGNvbnRhaW5pbmcgZGF0YSB0byBiZSB3cml0dGVuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gLSBpZiB0aGUgZmFjdG9yeSBpcyBvcGVuZWQgZm9yIHJlYWQgb3IgY2xvc2VkCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiAtIGlmIGEgZmlsZSB3cml0ZSBlcnJvciBvY2N1cnMKKyAgICAgKiBAcmV0dXJuIHJldHVybnMgdHJ1ZSBpZiB0aGUgZmlsZSBpcyBjb21wbGV0ZSBhbmQgb3V0cHV0c3RyZWFtIGlzIGNsb3NlZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHdyaXRlTWVzc2FnZShGaWxlTWVzc2FnZSBtc2cpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCAhb3BlbkZvcldyaXRlICkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2FuJ3Qgd3JpdGUgbWVzc2FnZSwgdGhpcyBmYWN0b3J5IGlzIHJlYWRpbmcuIik7CisgICAgICAgIG91dC53cml0ZShtc2cuZ2V0RGF0YSgpLDAsbXNnLmdldERhdGFMZW5ndGgoKSk7CisgICAgICAgIG5yT2ZNZXNzYWdlc1Byb2Nlc3NlZCsrOworICAgICAgICBvdXQuZmx1c2goKTsKKyAgICAgICAgaWYgKCBtc2cuZ2V0TWVzc2FnZU51bWJlcigpID09IG1zZy5nZXRUb3RhbE5yT2ZNc2dzKCkgKSB7CisgICAgICAgICAgICBvdXQuY2xvc2UoKTsKKyAgICAgICAgICAgIGNsZWFudXAoKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9Ly9lbmQgaWYKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0vL3dyaXRlTWVzc2FnZQorICAgIAorICAgIC8qKgorICAgICAqIENsb3NlcyB0aGUgZmFjdG9yeSwgaXRzIHN0cmVhbXMgYW5kIHNldHMgYWxsIGl0cyByZWZlcmVuY2VzIHRvIG51bGwKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbGVhbnVwKCkgeworICAgICAgICBpZiAoIGluICE9IG51bGwgKSB0cnkgeyBpbi5jbG9zZSgpOyB9IGNhdGNoICggRXhjZXB0aW9uIGlnbm9yZSApe30KKyAgICAgICAgaWYgKCBvdXQgIT0gbnVsbCApIHRyeSB7IG91dC5jbG9zZSgpOyB9IGNhdGNoICggRXhjZXB0aW9uIGlnbm9yZSApe30KKyAgICAgICAgaW4gPSBudWxsOworICAgICAgICBvdXQgPSBudWxsOworICAgICAgICBzaXplID0gMDsKKyAgICAgICAgY2xvc2VkID0gdHJ1ZTsKKyAgICAgICAgZGF0YSA9IG51bGw7CisgICAgICAgIG5yT2ZNZXNzYWdlc1Byb2Nlc3NlZCA9IDA7CisgICAgICAgIHRvdGFsTnJPZk1lc3NhZ2VzID0gMDsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBmYWN0b3J5IGlzIGFibGUgdG8gcGVyZm9ybSB0aGUgCisgICAgICogZnVuY3Rpb24gaXQgaXMgYXNrZWQgdG8gZG8uIEludm9rZWQgYnkgcmVhZE1lc3NhZ2Uvd3JpdGVNZXNzYWdlIGJlZm9yZQorICAgICAqIHRob3NlIG1ldGhvZHMgcHJvY2VlZC4KKyAgICAgKiBAcGFyYW0gb3BlbkZvcldyaXRlIGJvb2xlYW4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrU3RhdGUoYm9vbGVhbiBvcGVuRm9yV3JpdGUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworICAgICAgICBpZiAoIHRoaXMub3BlbkZvcldyaXRlICE9IG9wZW5Gb3JXcml0ZSApIHsKKyAgICAgICAgICAgIGNsZWFudXAoKTsKKyAgICAgICAgICAgIGlmICggb3BlbkZvcldyaXRlICkgIAorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbid0IHdyaXRlIG1lc3NhZ2UsIHRoaXMgZmFjdG9yeSBpcyByZWFkaW5nLiIpOworICAgICAgICAgICAgZWxzZSAKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW4ndCByZWFkIG1lc3NhZ2UsIHRoaXMgZmFjdG9yeSBpcyB3cml0aW5nLiIpOworICAgICAgICB9CisgICAgICAgIGlmICggdGhpcy5jbG9zZWQgKSB7CisgICAgICAgICAgICBjbGVhbnVwKCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJGYWN0b3J5IGhhcyBiZWVuIGNsb3NlZC4iKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAgICAgCisgICAgLyoqCisgICAgICogRXhhbXBsZSB1c2FnZS4KKyAgICAgKiBAcGFyYW0gYXJncyBTdHJpbmdbXSwgYXJnc1swXSAtIHJlYWQgZnJvbSBmaWxlbmFtZSwgYXJnc1sxXSB3cml0ZSB0byBmaWxlbmFtZQorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJVc2FnZTogRmlsZU1lc3NhZ2VGYWN0b3J5IGZpbGVUb0JlUmVhZCBmaWxlVG9CZVdyaXR0ZW4iKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJVc2FnZTogVGhpcyB3aWxsIG1ha2UgYSBjb3B5IG9mIHRoZSBmaWxlIG9uIHRoZSBsb2NhbCBmaWxlIHN5c3RlbSIpOworICAgICAgICBGaWxlTWVzc2FnZUZhY3RvcnkgcmVhZCA9IGdldEluc3RhbmNlKG5ldyBGaWxlKGFyZ3NbMF0pLGZhbHNlKTsKKyAgICAgICAgRmlsZU1lc3NhZ2VGYWN0b3J5IHdyaXRlID0gZ2V0SW5zdGFuY2UobmV3IEZpbGUoYXJnc1sxXSksdHJ1ZSk7CisgICAgICAgIEZpbGVNZXNzYWdlIG1zZyA9IG5ldyBGaWxlTWVzc2FnZShudWxsLGFyZ3NbMF0sYXJnc1swXSk7CisgICAgICAgIG1zZyA9IHJlYWQucmVhZE1lc3NhZ2UobXNnKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFeHBlY3RpbmcgdG8gd3JpdGUgIiArIG1zZy5nZXRUb3RhbE5yT2ZNc2dzKCkrIiBtZXNzYWdlcy4iKTsKKyAgICAgICAgaW50IGNudCA9IDA7CisgICAgICAgIHdoaWxlICggbXNnICE9IG51bGwgKSB7CisgICAgICAgICAgICB3cml0ZS53cml0ZU1lc3NhZ2UobXNnKTsKKyAgICAgICAgICAgIGNudCsrOworICAgICAgICAgICAgbXNnID0gcmVhZC5yZWFkTWVzc2FnZShtc2cpOworICAgICAgICB9Ly93aGlsZQorICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkFjdHVhbGx5IHdyb3RlICIgKyBjbnQrIiBtZXNzYWdlcy4iKTsKKyAgICB9Ly8vbWFpbgorICAgIAorICAgIHB1YmxpYyBGaWxlIGdldEZpbGUoKSB7CisgICAgICAgIHJldHVybiBmaWxlOworICAgIH0KKyAgICAKKyAgICAKKyAgICAKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL2RlcGxveS9VbmRlcGxveU1lc3NhZ2UuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9kZXBsb3kvVW5kZXBsb3lNZXNzYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2MzYTEyNgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9kZXBsb3kvVW5kZXBsb3lNZXNzYWdlLmphdmEKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5kZXBsb3k7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuQ2x1c3Rlck1lc3NhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLk1lbWJlcjsKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKK3B1YmxpYyBjbGFzcyBVbmRlcGxveU1lc3NhZ2UgaW1wbGVtZW50cyBDbHVzdGVyTWVzc2FnZSxTZXJpYWxpemFibGUgeworICAgIHByaXZhdGUgTWVtYmVyIGFkZHJlc3M7CisgICAgcHJpdmF0ZSBsb25nIHRpbWVzdGFtcDsKKyAgICBwcml2YXRlIFN0cmluZyB1bmlxdWVJZDsKKyAgICBwcml2YXRlIFN0cmluZyBjb250ZXh0UGF0aDsKKyAgICBwcml2YXRlIGJvb2xlYW4gdW5kZXBsb3k7CisgICAgCisgICAgcHVibGljIFVuZGVwbG95TWVzc2FnZSgpIHt9IC8vZm9yIHNlcmlhbGl6YXRpb24KKyAgICBwdWJsaWMgVW5kZXBsb3lNZXNzYWdlKE1lbWJlciBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyB0aW1lc3RhbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdW5pcXVlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY29udGV4dFBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHVuZGVwbG95KSB7CisgICAgICAgIHRoaXMuYWRkcmVzcyAgPSBhZGRyZXNzOworICAgICAgICB0aGlzLnRpbWVzdGFtcD0gdGltZXN0YW1wOworICAgICAgICB0aGlzLnVuZGVwbG95ID0gdW5kZXBsb3k7CisgICAgICAgIHRoaXMudW5pcXVlSWQgPSB1bmlxdWVJZDsKKyAgICAgICAgdGhpcy51bmRlcGxveSA9IHVuZGVwbG95OworICAgICAgICB0aGlzLmNvbnRleHRQYXRoID0gY29udGV4dFBhdGg7CisgICAgfQorCisgICAgcHVibGljIE1lbWJlciBnZXRBZGRyZXNzKCkgeworICAgICAgICByZXR1cm4gYWRkcmVzczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBZGRyZXNzKE1lbWJlciBhZGRyZXNzKSB7CisgICAgICAgIHRoaXMuYWRkcmVzcyA9IGFkZHJlc3M7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgZ2V0VGltZXN0YW1wKCkgeworICAgICAgICByZXR1cm4gdGltZXN0YW1wOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFRpbWVzdGFtcChsb25nIHRpbWVzdGFtcCkgeworICAgICAgICB0aGlzLnRpbWVzdGFtcCA9IHRpbWVzdGFtcDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFVuaXF1ZUlkKCkgeworICAgICAgICByZXR1cm4gdW5pcXVlSWQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VW5pcXVlSWQoU3RyaW5nIHVuaXF1ZUlkKSB7CisgICAgICAgIHRoaXMudW5pcXVlSWQgPSB1bmlxdWVJZDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRleHRQYXRoKCkgeworICAgICAgICByZXR1cm4gY29udGV4dFBhdGg7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q29udGV4dFBhdGgoU3RyaW5nIGNvbnRleHRQYXRoKSB7CisgICAgICAgIHRoaXMuY29udGV4dFBhdGggPSBjb250ZXh0UGF0aDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRVbmRlcGxveSgpIHsKKyAgICAgICAgcmV0dXJuIHVuZGVwbG95OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVuZGVwbG95KGJvb2xlYW4gdW5kZXBsb3kpIHsKKyAgICAgICAgdGhpcy51bmRlcGxveSA9IHVuZGVwbG95OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9kZXBsb3kvV2FyV2F0Y2hlci5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL2RlcGxveS9XYXJXYXRjaGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc2ODAzNAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9kZXBsb3kvV2FyV2F0Y2hlci5qYXZhCkBAIC0wLDAgKzEsMjE4IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLmRlcGxveTsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisvKioKKyAqIDxwPlRoZSA8Yj5XYXJXYXRjaGVyPC9iPiB3YXRjaGVzIHRoZSBkZXBsb3lEaXIgZm9yIGNoYW5nZXMgbWFkZSB0bworICogdGhlIGRpcmVjdG9yeSAoYWRkaW5nIG5ldyBXQVIgZmlsZXMtPmRlcGxveSBvciByZW1vdmUgV0FSIGZpbGVzLT51bmRlcGxveSkKKyAqIEFuZCBub3RpZmllcyBhIGxpc3RlbmVyIG9mIHRoZSBjaGFuZ2VzIG1hZGU8L3A+ICAgIAorICogCisgKiBAYXV0aG9yIEZpbGlwIEhhbmlrCisgKiBAdmVyc2lvbiAxLjAKKyAqLworCitwdWJsaWMgY2xhc3MgV2FyV2F0Y2hlciBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKKworICAgIC8qLS1TdGF0aWMgVmFyaWFibGVzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2cgbG9nID0KKyAgICAgICAgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeS5nZXRMb2coIFdhcldhdGNoZXIuY2xhc3MgKTsKKworICAgIC8qLS1JbnN0YW5jZSBWYXJpYWJsZXMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgLyoqCisgICAgICogRGlyZWN0b3J5IHRvIHdhdGNoIGZvciB3YXIgZmlsZXMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRmlsZSBkZXBsb3lEaXIgPSBudWxsOworCisgICAgLyoqCisgICAgICogUGFyZW50IHRvIGJlIG5vdGlmaWVkIG9mIGNoYW5nZXMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRmlsZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gbnVsbDsKKyAgICAKKyAgICAvKioKKyAgICAgKiAKKyAgICAgKiBDaGVjayBpbnRlcnZhbAorICAgICAqLworICAgIHByb3RlY3RlZCBsb25nIGludGVydmFsID0gNTAwMDsgLy81IHNlY29uZHMKKyAgICAKKyAgICAvKioKKyAgICAgKiBSdW4gc3RhdHVzIAorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGFsaXZlID0gdHJ1ZTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBDdXJyZW50bHkgZGVwbG95ZWQgZmlsZXMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTWFwIGN1cnJlbnRTdGF0dXMgPSBuZXcgSGFzaE1hcCgpOworICAgIAorICAgIC8qLS1Db25zdHJ1Y3Rvci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICAKKyAgICBwdWJsaWMgV2FyV2F0Y2hlcihGaWxlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgRmlsZSBkZXBsb3lEaXIsCisgICAgICAgICAgICAgICAgICAgICAgbG9uZyBpbnRlcnZhbCkgeworICAgICAgICB0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXI7CisgICAgICAgIHRoaXMuZGVwbG95RGlyID0gZGVwbG95RGlyOworICAgICAgICB0aGlzLmludGVydmFsID0gaW50ZXJ2YWw7CisgICAgfQorCisgICAgLyotLUxvZ2ljLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgIHdoaWxlICggYWxpdmUgKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIEZpbGVbXSBsaXN0ID0gZGVwbG95RGlyLmxpc3RGaWxlcyhuZXcgV2FyRmlsdGVyKCkpOworICAgICAgICAgICAgICAgIGlmICggbGlzdCA9PSBudWxsICkgbGlzdCA9IG5ldyBGaWxlWzBdOworICAgICAgICAgICAgICAgIC8vZmlyc3QgbWFrZSBzdXJlIGFsbCB0aGUgZmlsZXMgYXJlIGxpc3RlZCBpbiBvdXIgY3VycmVudCBzdGF0dXMKKyAgICAgICAgICAgICAgICBmb3IgKCBpbnQgaT0wOyBpPGxpc3QubGVuZ3RoOyBpKysgKSB7CisgICAgICAgICAgICAgICAgICAgIGFkZFdhckluZm8obGlzdFtpXSk7CisgICAgICAgICAgICAgICAgfS8vZm9yCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy9jaGVjayBhbGwgdGhlIHN0YXR1cyBjb2RlcyBhbmQgdXBkYXRlIHRoZSBGYXJtRGVwbG95ZXIKKyAgICAgICAgICAgICAgICBmb3IgKCBJdGVyYXRvciBpPWN1cnJlbnRTdGF0dXMuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICAgICAgTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSlpLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgV2FySW5mbyBpbmZvID0gKFdhckluZm8pZW50cnkuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGNoZWNrID0gaW5mby5jaGVjaygpOyAKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBjaGVjayA9PSAxICkgeworICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIuZmlsZU1vZGlmaWVkKGluZm8uZ2V0V2FyKCkpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCBjaGVjayA9PSAtMSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLmZpbGVSZW1vdmVkKGluZm8uZ2V0V2FyKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgLy9ubyBuZWVkIHRvIGtlZXAgaW4gbWVtb3J5CisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50U3RhdHVzLnJlbW92ZShpbmZvLmdldFdhcigpKTsKKyAgICAgICAgICAgICAgICAgICAgfS8vZW5kIGlmCisgICAgICAgICAgICAgICAgfS8vZm9yCisKKyAgICAgICAgICAgICAgICAvL3NsZWVwIGZvciB0aGUgc2V0IGludGVydmFsCisgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKGludGVydmFsKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKCBFeGNlcHRpb24geCApIHsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIlVuYWJsZSB0byB3YXRjaCBmb3IgV0FSIGRlcGxveW1lbnRzIGluIGNsdXN0ZXIuIix4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfS8vd2hpbGUKKyAgICB9Ly9ydW4KKyAgICAKKyAgICBwcm90ZWN0ZWQgdm9pZCBhZGRXYXJJbmZvKEZpbGUgZikgeyAKKyAgICAgICAgV2FySW5mbyBpbmZvID0gKFdhckluZm8pY3VycmVudFN0YXR1cy5nZXQoZi5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgIGlmICggaW5mbyA9PSBudWxsICkgeworICAgICAgICAgICAgaW5mbyA9IG5ldyBXYXJJbmZvKGYpOworICAgICAgICAgICAgaW5mby5zZXRMYXN0U3RhdGUoLTEpOyAvL2Fzc3VtZSBmaWxlIGlzIG5vbiBleGlzdGVudAorICAgICAgICAgICAgY3VycmVudFN0YXR1cy5wdXQoZi5nZXRBYnNvbHV0ZVBhdGgoKSxpbmZvKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzdG9wKCkgeworICAgICAgICBhbGl2ZSA9IGZhbHNlOworICAgICAgICBjdXJyZW50U3RhdHVzLmNsZWFyKCk7CisgICAgICAgIGxpc3RlbmVyID0gbnVsbDsKKyAgICB9CisgICAgCisgICAgCisgICAgCisgICAgLyotLUlubmVyIGNsYXNzZXMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICAKKworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIEZpbGUgbmFtZSBmaWx0ZXIgZm9yIHdhciBmaWxlcworICAgICAqLworICAgIHByb3RlY3RlZCBjbGFzcyBXYXJGaWx0ZXIgaW1wbGVtZW50cyBqYXZhLmlvLkZpbGVuYW1lRmlsdGVyIHsKKyAgICAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgcGF0aCwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgICAgIGlmICggbmFtZSA9PSBudWxsICkgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIG5hbWUuZW5kc1dpdGgoIi53YXIiKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBGaWxlIGluZm9ybWF0aW9uIG9uIGV4aXN0aW5nIFdBUiBmaWxlcworICAgICAqLworICAgIHByb3RlY3RlZCBjbGFzcyBXYXJJbmZvIHsKKyAgICAgICAgcHJvdGVjdGVkIEZpbGUgd2FyID0gbnVsbDsKKyAgICAgICAgcHJvdGVjdGVkIGxvbmcgbGFzdENoZWNrZWQgPSAwOworICAgICAgICBwcm90ZWN0ZWQgbG9uZyBsYXN0U3RhdGUgPSAwOworICAgICAgICAKKyAgICAgICAgcHVibGljIFdhckluZm8oRmlsZSB3YXIpIHsKKyAgICAgICAgICAgIHRoaXMud2FyID0gd2FyOworICAgICAgICAgICAgdGhpcy5sYXN0Q2hlY2tlZCA9IHdhci5sYXN0TW9kaWZpZWQoKTsKKyAgICAgICAgICAgIGlmICggIXdhci5leGlzdHMoKSApIGxhc3RTdGF0ZSA9IC0xOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgYm9vbGVhbiBtb2RpZmllZCgpIHsKKyAgICAgICAgICAgIHJldHVybiB3YXIuZXhpc3RzKCkgJiYgCisgICAgICAgICAgICAgICAgd2FyLmxhc3RNb2RpZmllZCgpID4gbGFzdENoZWNrZWQ7CisgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICBwdWJsaWMgYm9vbGVhbiBleGlzdHMoKSB7CisgICAgICAgICAgICByZXR1cm4gd2FyLmV4aXN0cygpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyAKKyAgICAgICAgICogMSBpZiB0aGUgZmlsZSBoYXMgYmVlbiBhZGRlZC9tb2RpZmllZCwgCisgICAgICAgICAqIDAgaWYgdGhlIGZpbGUgaXMgdW5jaGFuZ2VkIGFuZCAKKyAgICAgICAgICogLTEgaWYgdGhlIGZpbGUgaGFzIGJlZW4gcmVtb3ZlZAorICAgICAgICAgKiBAcmV0dXJuIGludCAxPWZpbGUgYWRkZWQ7IDA9dW5jaGFuZ2VkOyAtMT1maWxlIHJlbW92ZWQKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBpbnQgY2hlY2soKSB7CisgICAgICAgICAgICAvL2ZpbGUgdW5jaGFuZ2VkIGJ5IGRlZmF1bHQKKyAgICAgICAgICAgIGludCByZXN1bHQgPSAwOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoIG1vZGlmaWVkKCkgKSB7CisgICAgICAgICAgICAgICAgLy9maWxlIGhhcyBjaGFuZ2VkIC0gdGltZXN0YW1wCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gMTsKKyAgICAgICAgICAgICAgICBsYXN0U3RhdGUgPSByZXN1bHQ7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCAoIWV4aXN0cygpKSAmJiAoIShsYXN0U3RhdGU9PS0xKSkgKSB7CisgICAgICAgICAgICAgICAgLy9maWxlIHdhcyByZW1vdmVkCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gLTE7CisgICAgICAgICAgICAgICAgbGFzdFN0YXRlID0gcmVzdWx0OworICAgICAgICAgICAgfSBlbHNlIGlmICggKGxhc3RTdGF0ZT09LTEpICYmIGV4aXN0cygpICkgeworICAgICAgICAgICAgICAgIC8vZmlsZSB3YXMgYWRkZWQKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAxOworICAgICAgICAgICAgICAgIGxhc3RTdGF0ZSA9IHJlc3VsdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRoaXMubGFzdENoZWNrZWQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBGaWxlIGdldFdhcigpIHsKKyAgICAgICAgICAgIHJldHVybiB3YXI7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgICAgICByZXR1cm4gd2FyLmdldEFic29sdXRlUGF0aCgpLmhhc2hDb2RlKCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpIHsKKyAgICAgICAgICAgIGlmICggb3RoZXIgaW5zdGFuY2VvZiBXYXJJbmZvICkgeworICAgICAgICAgICAgICAgIFdhckluZm8gd28gPSAoV2FySW5mbylvdGhlcjsKKyAgICAgICAgICAgICAgICByZXR1cm4gd28uZ2V0V2FyKCkuZXF1YWxzKGdldFdhcigpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRMYXN0U3RhdGUoaW50IGxhc3RTdGF0ZSkgeworICAgICAgICAgICAgdGhpcy5sYXN0U3RhdGUgPSBsYXN0U3RhdGU7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgfQorICAgIAorICAgIAorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvaW8vSmRrMTNPYmplY3RSZWFkZXIuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9pby9KZGsxM09iamVjdFJlYWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwMzU3ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvaW8vSmRrMTNPYmplY3RSZWFkZXIuamF2YQpAQCAtMCwwICsxLDc1IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLmlvOworCisvKioKKyAqIFRoZSBvYmplY3QgcmVhZGVyIG9iamVjdCBpcyBhbiBvYmplY3QgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoCisgKiBqYXZhLm5pbyBUQ1AgbWVzc2FnZXMuIFRoaXMgb2JqZWN0IHN0b3JlcyB0aGUgbWVzc2FnZSBieXRlcyBpbiBhCisgKiA8Y29kZT5YQnl0ZUJ1ZmZlcjwvY29kZT4gdW50aWwgYSBmdWxsIHBhY2thZ2UgaGFzIGJlZW4gcmVjZWl2ZWQuCisgKiBXaGVuIGEgZnVsbCBwYWNrYWdlIGhhcyBiZWVuIHJlY2VpdmVkLCB0aGUgYXBwZW5kIG1ldGhvZCB3aWxsIGNhbGwgbWVzc2FnZURhdGFSZWNlaXZlZAorICogb24gdGhlIGNhbGxiYWNrIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBvYmplY3QgcmVhZGVyLjxCUj4KKyAqIFRoaXMgb2JqZWN0IHVzZXMgYW4gWEJ5dGVCdWZmZXIgd2hpY2ggaXMgYW4gZXh0ZW5kYWJsZSBvYmplY3QgYnVmZmVyIHRoYXQgYWxzbyBhbGxvd3MKKyAqIGZvciBtZXNzYWdlIGVuY29kaW5nIGFuZCBkZWNvZGluZy4KKyAqCisgKiBAYXV0aG9yIEZpbGlwIEhhbmlrCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kLCAkRGF0ZSQKKyAqLworCitpbXBvcnQgamF2YS5uZXQuU29ja2V0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5pby5YQnl0ZUJ1ZmZlcjsKK3B1YmxpYyBjbGFzcyBKZGsxM09iamVjdFJlYWRlcgoreworICAgIHByaXZhdGUgU29ja2V0IHNvY2tldDsKKyAgICBwcml2YXRlIExpc3RlbkNhbGxiYWNrIGNhbGxiYWNrOworICAgIHByaXZhdGUgWEJ5dGVCdWZmZXIgYnVmZmVyOworCisgICAgcHVibGljIEpkazEzT2JqZWN0UmVhZGVyKCBTb2NrZXQgc29ja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RlbkNhbGxiYWNrIGNhbGxiYWNrICkgIHsKKyAgICAgICAgdGhpcy5zb2NrZXQgPSBzb2NrZXQ7CisgICAgICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICAgICAgdGhpcy5idWZmZXIgPSBuZXcgWEJ5dGVCdWZmZXIoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGFwcGVuZChieXRlW10gZGF0YSxpbnQgb2ZmLGludCBsZW4pIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKKyAgICAgICAgYnVmZmVyLmFwcGVuZChkYXRhLG9mZixsZW4pOworICAgICAgICBpbnQgcGtnQ250ID0gMDsKKyAgICAgICAgYm9vbGVhbiBwa2dFeGlzdHMgPSBidWZmZXIuZG9lc1BhY2thZ2VFeGlzdCgpOworICAgICAgICB3aGlsZSAoIHBrZ0V4aXN0cyApIHsKKyAgICAgICAgICAgIGJ5dGVbXSBiID0gYnVmZmVyLmV4dHJhY3RQYWNrYWdlKHRydWUpOworICAgICAgICAgICAgY2FsbGJhY2subWVzc2FnZURhdGFSZWNlaXZlZChiKTsKKyAgICAgICAgICAgIHBrZ0NudCsrOworICAgICAgICAgICAgcGtnRXhpc3RzID0gYnVmZmVyLmRvZXNQYWNrYWdlRXhpc3QoKTsKKyAgICAgICAgfS8vZW5kIGlmCisgICAgICAgIHJldHVybiBwa2dDbnQ7CisgICAgfQorCisgICAgcHVibGljIGludCBleGVjdXRlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gYXBwZW5kKG5ldyBieXRlWzBdLDAsMCk7CisgICAgfQorCisgICAgcHVibGljIGludCB3cml0ZShieXRlW10gZGF0YSkKKyAgICAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgc29ja2V0LmdldE91dHB1dFN0cmVhbSgpLndyaXRlKGRhdGEpOworICAgICAgIHJldHVybiAwOworCisgICAgfQorCisKKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvaW8vTGlzdGVuQ2FsbGJhY2suamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9pby9MaXN0ZW5DYWxsYmFjay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmM2RmNTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvaW8vTGlzdGVuQ2FsbGJhY2suamF2YQpAQCAtMCwwICsxLDM2IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLmlvOworCisvKioKKyAqIFRoZSBsaXN0ZW4gY2FsbGJhY2sgaW50ZXJmYWNlIGlzIHVzZWQgYnkgdGhlIHJlcGxpY2F0aW9uIHN5c3RlbQorICogd2hlbiBkYXRhIGhhcyBiZWVuIHJlY2VpdmVkLiBUaGUgaW50ZXJmYWNlIGRvZXMgbm90IGNhcmUgYWJvdXQKKyAqIG9iamVjdHMgYW5kIG1hcnNoYWxsaW5nIGFuZCBqdXN0IHBhc3NlcyB0aGUgYnl0ZXMgc3RyYWlnaHQgdGhyb3VnaC4KKyAqIEBhdXRob3IgRmlsaXAgSGFuaWsKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQsICREYXRlJAorICovCisKKworcHVibGljIGludGVyZmFjZSBMaXN0ZW5DYWxsYmFjaworeworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGlzIGludm9rZWQgb24gdGhlIGNhbGxiYWNrIG9iamVjdCB0byBub3RpZnkgaXQgdGhhdCBuZXcgZGF0YSBoYXMKKyAgICAgKiBiZWVuIHJlY2VpdmVkIGZyb20gb25lIG9mIHRoZSBjbHVzdGVyIG5vZGVzLgorICAgICAqIEBwYXJhbSBkYXRhIC0gdGhlIG1lc3NhZ2UgYnl0ZXMgcmVjZWl2ZWQgZnJvbSB0aGUgY2x1c3Rlci9yZXBsaWNhdGlvbiBzeXN0ZW0KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBtZXNzYWdlRGF0YVJlY2VpdmVkKGJ5dGVbXSBkYXRhKTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvaW8vT2JqZWN0UmVhZGVyLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvaW8vT2JqZWN0UmVhZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY4ZDQzMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9pby9PYmplY3RSZWFkZXIuamF2YQpAQCAtMCwwICsxLDg0IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLmlvOworCisvKioKKyAqIFRoZSBvYmplY3QgcmVhZGVyIG9iamVjdCBpcyBhbiBvYmplY3QgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoCisgKiBqYXZhLm5pbyBUQ1AgbWVzc2FnZXMuIFRoaXMgb2JqZWN0IHN0b3JlcyB0aGUgbWVzc2FnZSBieXRlcyBpbiBhCisgKiA8Y29kZT5YQnl0ZUJ1ZmZlcjwvY29kZT4gdW50aWwgYSBmdWxsIHBhY2thZ2UgaGFzIGJlZW4gcmVjZWl2ZWQuCisgKiBXaGVuIGEgZnVsbCBwYWNrYWdlIGhhcyBiZWVuIHJlY2VpdmVkLCB0aGUgYXBwZW5kIG1ldGhvZCB3aWxsIGNhbGwgbWVzc2FnZURhdGFSZWNlaXZlZAorICogb24gdGhlIGNhbGxiYWNrIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBvYmplY3QgcmVhZGVyLjxCUj4KKyAqIFRoaXMgb2JqZWN0IHVzZXMgYW4gWEJ5dGVCdWZmZXIgd2hpY2ggaXMgYW4gZXh0ZW5kYWJsZSBvYmplY3QgYnVmZmVyIHRoYXQgYWxzbyBhbGxvd3MKKyAqIGZvciBtZXNzYWdlIGVuY29kaW5nIGFuZCBkZWNvZGluZy4KKyAqCisgKiBAYXV0aG9yIEZpbGlwIEhhbmlrCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kLCAkRGF0ZSQKKyAqLworCitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU29ja2V0Q2hhbm5lbDsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5TZWxlY3RvcjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5pby5YQnl0ZUJ1ZmZlcjsKK3B1YmxpYyBjbGFzcyBPYmplY3RSZWFkZXIKK3sKKyAgICBwcml2YXRlIFNvY2tldENoYW5uZWwgY2hhbm5lbDsKKyAgICBwcml2YXRlIFNlbGVjdG9yIHNlbGVjdG9yOworICAgIHByaXZhdGUgTGlzdGVuQ2FsbGJhY2sgY2FsbGJhY2s7CisgICAgcHJpdmF0ZSBYQnl0ZUJ1ZmZlciBidWZmZXI7CisKKyAgICBwdWJsaWMgT2JqZWN0UmVhZGVyKCBTb2NrZXRDaGFubmVsIGNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0b3Igc2VsZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdGVuQ2FsbGJhY2sgY2FsbGJhY2sgKSAgeworICAgICAgICB0aGlzLmNoYW5uZWwgPSBjaGFubmVsOworICAgICAgICB0aGlzLnNlbGVjdG9yID0gc2VsZWN0b3I7CisgICAgICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICAgICAgdGhpcy5idWZmZXIgPSBuZXcgWEJ5dGVCdWZmZXIoKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBTb2NrZXRDaGFubmVsIGdldENoYW5uZWwoKSAgeworICAgICAgICByZXR1cm4gdGhpcy5jaGFubmVsOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgYXBwZW5kKGJ5dGVbXSBkYXRhLGludCBvZmYsaW50IGxlbikgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOworICAgICAgICBidWZmZXIuYXBwZW5kKGRhdGEsb2ZmLGxlbik7CisgICAgICAgIGludCBwa2dDbnQgPSBidWZmZXIuY291bnRQYWNrYWdlcygpOworICAgICAgICByZXR1cm4gcGtnQ250OworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZXhlY3V0ZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgaW50IHBrZ0NudCA9IDA7CisgICAgICAgIGJvb2xlYW4gcGtnRXhpc3RzID0gYnVmZmVyLmRvZXNQYWNrYWdlRXhpc3QoKTsKKyAgICAgICAgd2hpbGUgKCBwa2dFeGlzdHMgKSB7CisgICAgICAgICAgICBieXRlW10gYiA9IGJ1ZmZlci5leHRyYWN0UGFja2FnZSh0cnVlKTsKKyAgICAgICAgICAgIGNhbGxiYWNrLm1lc3NhZ2VEYXRhUmVjZWl2ZWQoYik7CisgICAgICAgICAgICBwa2dDbnQrKzsKKyAgICAgICAgICAgIHBrZ0V4aXN0cyA9IGJ1ZmZlci5kb2VzUGFja2FnZUV4aXN0KCk7CisgICAgICAgIH0vL2VuZCBpZgorICAgICAgICByZXR1cm4gcGtnQ250OworICAgIH0KKworICAgIHB1YmxpYyBpbnQgd3JpdGUoQnl0ZUJ1ZmZlciBidWYpCisgICAgICAgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gZ2V0Q2hhbm5lbCgpLndyaXRlKGJ1Zik7CisgICAgfQorCisKKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvaW8vWEJ5dGVCdWZmZXIuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9pby9YQnl0ZUJ1ZmZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMzQ2OWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvaW8vWEJ5dGVCdWZmZXIuamF2YQpAQCAtMCwwICsxLDM5OSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5pbzsKKworLyoqCisgKiBUaGUgWEJ5dGVCdWZmZXIgcHJvdmlkZXMgYSBkdWFsIGZ1bmN0aW9uYWxpdHkuCisgKiBPbmUsIGl0IHN0b3JlcyBtZXNzYWdlIGJ5dGVzIGFuZCBhdXRvbWF0aWNhbGx5IGV4dGVuZHMgdGhlIGJ5dGUgYnVmZmVyIGlmIG5lZWRlZC48QlI+CisgKiBUd28sIGl0IGNhbiBlbmNvZGUgYW5kIGRlY29kZSBwYWNrYWdlcyBzbyB0aGF0IHRoZXkgY2FuIGJlIGRlZmluZWQgYW5kIGlkZW50aWZpZWQKKyAqIGFzIHRoZXkgY29tZSBpbiBvbiBhIHNvY2tldC4KKyAqCisgKiBAYXV0aG9yIEZpbGlwIEhhbmlrCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kLCAkRGF0ZSQKKyAqLworCisKK3B1YmxpYyBjbGFzcyBYQnl0ZUJ1ZmZlcgoreworICAgIAorICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGxvZyA9CisgICAgICAgIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3RvcnkuZ2V0TG9nKCBYQnl0ZUJ1ZmZlci5jbGFzcyApOworICAgIAorICAgIC8qKgorICAgICAqIFRoaXMgaXMgYSBwYWNrYWdlIGhlYWRlciwgNyBieXRlcworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZVtdIFNUQVJUX0RBVEEgPSB7NzAsNzYsODQsNTAsNDgsNDgsNTB9OworICAgIC8qKgorICAgICAqIFRoaXMgaXMgdGhlIHBhY2thZ2UgZm9vdGVyLCA3IGJ5dGVzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlW10gRU5EX0RBVEEgPSB7ODQsNzYsNzAsNTAsNDgsNDgsNTF9OworICAgIC8vQSBwYWNrYWdlIGxvb2tzIGxpa2UsIGFsd2F5cy4KKyAgICAvKioKKyAgICAgKiBTVEFSVF9EQVRBIC0gNyBieXRlcworICAgICAqIFNJWkUgICAgICAgLSA0IGJ5dGVzIC0gc2l6ZSBvZiB0aGUgZGF0YSBwYWNrYWdlCisgICAgICogREFUQSAgICAgICAtIHNob3VsZCBiZSBhcyBtYW55IGJ5dGVzIGFzIHRoZSBwcmV2IFNJWkUKKyAgICAgKiBFTkRfREFUQSAgIC0gNyBieXRlcworICAgICAqLworCisgICAgLyoqCisgICAgICogRGVmYXVsdCBzaXplIG9uIHRoZSBpbml0aWFsIGJ5dGUgYnVmZmVyCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludCBERUZfU0laRSA9IDEwMjQ7CisgICAgLyoqCisgICAgICogRGVmYXVsdCBzaXplIHRvIGV4dGVuZCB0aGUgYnVmZmVyIHdpdGgKKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IERFRl9FWFQgID0gMTAyNDsKKyAgICAvKioKKyAgICAgKiBWYXJpYWJsZSB0byBob2xkIHRoZSBkYXRhCisgICAgICovCisgICAgcHJvdGVjdGVkIGJ5dGVbXSBidWYgPSBudWxsOworICAgIC8qKgorICAgICAqIEN1cnJlbnQgbGVuZ3RoIG9mIGRhdGEgaW4gdGhlIGJ1ZmZlcgorICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgYnVmU2l6ZSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IFhCeXRlQnVmZmVyCisgICAgICogQHBhcmFtIHNpemUgLSB0aGUgaW5pdGlhbCBzaXplIG9mIHRoZSBieXRlIGJ1ZmZlcgorICAgICAqLworICAgIHB1YmxpYyBYQnl0ZUJ1ZmZlcihpbnQgc2l6ZSkgeworICAgICAgICBidWYgPSBuZXcgYnl0ZVtzaXplXTsKKyAgICB9Ly9YQnl0ZUJ1ZmZlcgorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBYQnl0ZUJ1ZmZlciB3aXRoIGFuIGluaXRpYWwgc2l6ZSBvZiAxMDI0IGJ5dGVzCisgICAgICovCisgICAgcHVibGljIFhCeXRlQnVmZmVyKCkgIHsKKyAgICAgICAgdGhpcyhERUZfU0laRSk7CisgICAgfS8vWEJ5dGVCdWZmZXIKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGJ5dGVzIGluIHRoZSBidWZmZXIsIGluIGl0cyBleGFjdCBsZW5ndGgKKyAgICAgKi8KKyAgICBwdWJsaWMgYnl0ZVtdIGdldEJ5dGVzKCkgeworICAgICAgICBieXRlW10gYiA9IG5ldyBieXRlW2J1ZlNpemVdOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZiwwLGIsMCxidWZTaXplKTsKKyAgICAgICAgcmV0dXJuIGI7CisgICAgfS8vZ2V0Qnl0ZXMKKworICAgIC8qKgorICAgICAqIFJlc2V0cyB0aGUgYnVmZmVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgICAgIGJ1ZlNpemUgPSAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFwcGVuZHMgdGhlIGRhdGEgdG8gdGhlIGJ1ZmZlci4gSWYgdGhlIGRhdGEgaXMgaW5jb3JyZWN0bHkgZm9ybWF0dGVkLCBpZSwgdGhlIGRhdGEgc2hvdWxkIGFsd2F5cyBzdGFydCB3aXRoIHRoZQorICAgICAqIGhlYWRlciwgZmFsc2Ugd2lsbCBiZSByZXR1cm5lZCBhbmQgdGhlIGRhdGEgd2lsbCBiZSBkaXNjYXJkZWQuCisgICAgICogQHBhcmFtIGIgLSBieXRlcyB0byBiZSBhcHBlbmRlZAorICAgICAqIEBwYXJhbSBvZmYgLSB0aGUgb2Zmc2V0IHRvIGV4dHJhY3QgZGF0YSBmcm9tCisgICAgICogQHBhcmFtIGxlbiAtIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYXBwZW5kLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZGF0YSB3YXMgYXBwZW5kZWQgY29ycmVjdGx5LiBSZXR1cm5zIGZhbHNlIGlmIHRoZSBwYWNrYWdlIGlzIGluY29ycmVjdCwgaWUgbWlzc2luZyBoZWFkZXIgb3Igc29tZXRoaW5nLCBvciB0aGUgbGVuZ3RoIG9mIGRhdGEgaXMgMAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGFwcGVuZChieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikgeworICAgICAgICBpZiAoKG9mZiA8IDApIHx8IChvZmYgPiBiLmxlbmd0aCkgfHwgKGxlbiA8IDApIHx8CisgICAgICAgICAgICAoKG9mZiArIGxlbikgPiBiLmxlbmd0aCkgfHwgKChvZmYgKyBsZW4pIDwgMCkpICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworICAgICAgICB9IGVsc2UgaWYgKGxlbiA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0vL2VuZCBpZgorCisgICAgICAgIGludCBuZXdjb3VudCA9IGJ1ZlNpemUgKyBsZW47CisgICAgICAgIGlmIChuZXdjb3VudCA+IGJ1Zi5sZW5ndGgpIHsKKyAgICAgICAgICAgIGJ5dGUgbmV3YnVmW10gPSBuZXcgYnl0ZVtNYXRoLm1heChidWYubGVuZ3RoIDw8IDEsIG5ld2NvdW50KV07CisgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZiwgMCwgbmV3YnVmLCAwLCBidWZTaXplKTsKKyAgICAgICAgICAgIGJ1ZiA9IG5ld2J1ZjsKKyAgICAgICAgfQorICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGIsIG9mZiwgYnVmLCBidWZTaXplLCBsZW4pOworICAgICAgICBidWZTaXplID0gbmV3Y291bnQ7CisKKyAgICAgICAgaWYgKGJ1ZlNpemUgPiBTVEFSVF9EQVRBLmxlbmd0aCAmJiAoZmlyc3RJbmRleE9mKGJ1ZiwwLFNUQVJUX0RBVEEpPT0tMSkpeworICAgICAgICAgICAgYnVmU2l6ZSA9IDA7CisgICAgICAgICAgICBsb2cuZXJyb3IoIkRpc2NhcmRlZCB0aGUgcGFja2FnZSwgaW52YWxpZCBoZWFkZXIiKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9Ly9hcHBlbmQKKworCisgICAgLyoqCisgICAgICogSW50ZXJuYWwgbWVjaGFuaXNtIHRvIG1ha2UgYSBjaGVjayBpZiBhIGNvbXBsZXRlIHBhY2thZ2UgZXhpc3RzCisgICAgICogd2l0aGluIHRoZSBidWZmZXIKKyAgICAgKiBAcmV0dXJuIC0gdHJ1ZSBpZiBhIGNvbXBsZXRlIHBhY2thZ2UgKGhlYWRlcixzaXplLGRhdGEsZm9vdGVyKSBleGlzdHMgd2l0aGluIHRoZSBidWZmZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGNvdW50UGFja2FnZXMoKQorICAgIHsKKyAgICAgICAgaW50IGNudCA9IDA7CisgICAgICAgIGludCBwb3MgPSBTVEFSVF9EQVRBLmxlbmd0aDsKKyAgICAgICAgaW50IHN0YXJ0ID0gMDsKKworICAgICAgICB3aGlsZSAoIHN0YXJ0IDwgYnVmU2l6ZSApIHsKKyAgICAgICAgICAgIC8vZmlyc3QgY2hlY2sgc3RhcnQgaGVhZGVyCisgICAgICAgICAgICBpbnQgaW5kZXggPSBYQnl0ZUJ1ZmZlci5maXJzdEluZGV4T2YoYnVmLHN0YXJ0LFNUQVJUX0RBVEEpOworICAgICAgICAgICAgLy9pZiB0aGUgaGVhZGVyIChTVEFSVF9EQVRBKSBpc24ndCB0aGUgZmlyc3QgdGhpbmcgb3IKKyAgICAgICAgICAgIC8vdGhlIGJ1ZmZlciBpc24ndCBldmVuIDEwIGJ5dGVzCisgICAgICAgICAgICBpZiAoIGluZGV4ICE9IHN0YXJ0IHx8ICgoYnVmU2l6ZS1zdGFydCk8MTApICkgYnJlYWs7CisgICAgICAgICAgICAvL3RoZW4gZ2V0IHRoZSBzaXplIDQgYnl0ZXMKKyAgICAgICAgICAgIGludCBzaXplID0gdG9JbnQoYnVmLCBwb3MpOworICAgICAgICAgICAgLy9ub3cgdGhlIHRvdGFsIGJ1ZmZlciBoYXMgdG8gYmUgbG9uZyBlbm91Z2ggdG8gaG9sZAorICAgICAgICAgICAgLy9TVEFSVF9EQVRBLmxlbmd0aCs0K3NpemUrRU5EX0RBVEEubGVuZ3RoCisgICAgICAgICAgICBwb3MgPSBzdGFydCArIFNUQVJUX0RBVEEubGVuZ3RoICsgNCArIHNpemU7CisgICAgICAgICAgICBpZiAoIChwb3MgKyBFTkRfREFUQS5sZW5ndGgpID4gYnVmU2l6ZSkgYnJlYWs7CisgICAgICAgICAgICAvL2FuZCBmaW5hbGx5IGNoZWNrIHRoZSBmb290ZXIgb2YgdGhlIHBhY2thZ2UgRU5EX0RBVEEKKyAgICAgICAgICAgIGludCBuZXdwb3MgPSBmaXJzdEluZGV4T2YoYnVmLCBwb3MsIEVORF9EQVRBKTsKKyAgICAgICAgICAgIC8vbWlzbWF0Y2gsIHRoZXJlIGlzIG5vIHBhY2thZ2UKKyAgICAgICAgICAgIGlmIChuZXdwb3MgIT0gcG9zKSBicmVhazsKKyAgICAgICAgICAgIC8vaW5jcmVhc2UgdGhlIHBhY2tldCBjb3VudAorICAgICAgICAgICAgY250Kys7CisgICAgICAgICAgICAvL3Jlc2V0IHRoZSB2YWx1ZXMKKyAgICAgICAgICAgIHN0YXJ0ID0gcG9zICsgRU5EX0RBVEEubGVuZ3RoOworICAgICAgICAgICAgcG9zID0gc3RhcnQgKyBTVEFSVF9EQVRBLmxlbmd0aDsKKyAgICAgICAgfS8vd2hpbGUKKyAgICAgICAgcmV0dXJuIGNudDsKKyAgICB9Ly9nZXRTaXplCisKKyAgICAvKioKKyAgICAgKiBNZXRob2QgdG8gY2hlY2sgaWYgYSBwYWNrYWdlIGV4aXN0cyBpbiB0aGlzIGJ5dGUgYnVmZmVyLgorICAgICAqIEByZXR1cm4gLSB0cnVlIGlmIGEgY29tcGxldGUgcGFja2FnZSAoaGVhZGVyLHNpemUsZGF0YSxmb290ZXIpIGV4aXN0cyB3aXRoaW4gdGhlIGJ1ZmZlcgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGRvZXNQYWNrYWdlRXhpc3QoKSAgeworICAgICAgICByZXR1cm4gKGNvdW50UGFja2FnZXMoKT4wKTsKKyAgICB9Ly9kb2VzUGFja2FnZUV4aXN0CisKKyAgICAvKioKKyAgICAgKiBFeHRyYWN0cyB0aGUgbWVzc2FnZSBieXRlcyBmcm9tIGEgcGFja2FnZS4KKyAgICAgKiBJZiBubyBwYWNrYWdlIGV4aXN0cywgYSBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCisgICAgICogQHBhcmFtIGNsZWFyRnJvbUJ1ZmZlciAtIGlmIHRydWUsIHRoZSBwYWNrYWdlIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBieXRlIGJ1ZmZlcgorICAgICAqIEByZXR1cm4gLSByZXR1cm5zIHRoZSBhY3R1YWwgbWVzc2FnZSBieXRlcyAoaGVhZGVyLCBzaXplIGFuZCBmb290ZXIgbm90IGluY2x1ZGVkKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYnl0ZVtdIGV4dHJhY3RQYWNrYWdlKGJvb2xlYW4gY2xlYXJGcm9tQnVmZmVyKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgIGludCBwc2l6ZSA9IGNvdW50UGFja2FnZXMoKTsKKyAgICAgICAgaWYgKCBwc2l6ZSA9PSAwICkgdGhyb3cgbmV3IGphdmEubGFuZy5JbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk5vIHBhY2thZ2UgZXhpc3RzIGluIFhCeXRlQnVmZmVyIik7CisgICAgICAgIGludCBzaXplID0gdG9JbnQoYnVmLCBTVEFSVF9EQVRBLmxlbmd0aCk7CisgICAgICAgIGJ5dGVbXSBkYXRhID0gbmV3IGJ5dGVbc2l6ZV07CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmLFNUQVJUX0RBVEEubGVuZ3RoKzQsZGF0YSwwLHNpemUpOworICAgICAgICBpZiAoIGNsZWFyRnJvbUJ1ZmZlciApIHsKKyAgICAgICAgICAgIGludCB0b3RhbHNpemUgPSBTVEFSVF9EQVRBLmxlbmd0aCArIDQgKyBzaXplICsgRU5EX0RBVEEubGVuZ3RoOworICAgICAgICAgICAgYnVmU2l6ZSA9IGJ1ZlNpemUgLSB0b3RhbHNpemU7CisgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZiwgdG90YWxzaXplLCBidWYsIDAsIGJ1ZlNpemUpOworICAgICAgICB9CisgICAgICAgIGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmluID0gbmV3IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW0oZGF0YSk7CisgICAgICAgIGphdmEudXRpbC56aXAuR1pJUElucHV0U3RyZWFtIGdpbiA9IG5ldyBqYXZhLnV0aWwuemlwLkdaSVBJbnB1dFN0cmVhbShiaW4pOworICAgICAgICBieXRlW10gdG1wID0gbmV3IGJ5dGVbMTAyNF07CisgICAgICAgIGJ5dGVbXSByZXN1bHQgPSBuZXcgYnl0ZVswXTsKKyAgICAgICAgaW50IGxlbmd0aCA9IGdpbi5yZWFkKHRtcCk7CisgICAgICAgIHdoaWxlICggbGVuZ3RoID4gMCApIHsKKyAgICAgICAgICAgIGJ5dGVbXSB0bXBkYXRhID0gcmVzdWx0OworICAgICAgICAgICAgcmVzdWx0ID0gbmV3IGJ5dGVbcmVzdWx0Lmxlbmd0aCtsZW5ndGhdOworICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSh0bXBkYXRhLDAscmVzdWx0LDAsdG1wZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSh0bXAsMCxyZXN1bHQsdG1wZGF0YS5sZW5ndGgsbGVuZ3RoKTsKKyAgICAgICAgICAgIGxlbmd0aCA9IGdpbi5yZWFkKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgZ2luLmNsb3NlKCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfS8vZXh0cmFjdFBhY2thZ2UKKworICAgIC8qKgorICAgICAqIENvbnZlcnQgZm91ciBieXRlcyB0byBhbiBpbnQKKyAgICAgKiBAcGFyYW0gYiAtIHRoZSBieXRlIGFycmF5IGNvbnRhaW5pbmcgdGhlIGZvdXIgYnl0ZXMKKyAgICAgKiBAcGFyYW0gb2ZmIC0gdGhlIG9mZnNldAorICAgICAqIEByZXR1cm4gdGhlIGludGVnZXIgdmFsdWUgY29uc3RydWN0ZWQgZnJvbSB0aGUgZm91ciBieXRlcworICAgICAqIEBleGNlcHRpb24gamF2YS5sYW5nLkFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50IHRvSW50KGJ5dGVbXSBiLGludCBvZmYpeworICAgICAgICByZXR1cm4gKCAoIChpbnQpIGJbb2ZmKzNdKSAmIDB4RkYpICsKKyAgICAgICAgICAgICggKCAoIChpbnQpIGJbb2ZmKzJdKSAmIDB4RkYpIDw8IDgpICsKKyAgICAgICAgICAgICggKCAoIChpbnQpIGJbb2ZmKzFdKSAmIDB4RkYpIDw8IDE2KSArCisgICAgICAgICAgICAoICggKCAoaW50KSBiW29mZiswXSkgJiAweEZGKSA8PCAyNCk7CisgICAgfS8vdG9JbnQKKworICAgIC8qKgorICAgICAqIENvbnZlcnQgZWlnaHQgYnl0ZXMgdG8gYSBsb25nCisgICAgICogQHBhcmFtIGIgLSB0aGUgYnl0ZSBhcnJheSBjb250YWluaW5nIHRoZSBmb3VyIGJ5dGVzCisgICAgICogQHBhcmFtIG9mZiAtIHRoZSBvZmZzZXQKKyAgICAgKiBAcmV0dXJuIHRoZSBsb25nIHZhbHVlIGNvbnN0cnVjdGVkIGZyb20gdGhlIGVpZ2h0IGJ5dGVzCisgICAgICogQGV4Y2VwdGlvbiBqYXZhLmxhbmcuQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBsb25nIHRvTG9uZyhieXRlW10gYixpbnQgb2ZmKXsKKyAgICAgICAgcmV0dXJuICggKCAobG9uZykgYltvZmYrN10pICYgMHhGRikgKworICAgICAgICAgICAgKCAoICggKGxvbmcpIGJbb2ZmKzZdKSAmIDB4RkYpIDw8IDgpICsKKyAgICAgICAgICAgICggKCAoIChsb25nKSBiW29mZis1XSkgJiAweEZGKSA8PCAxNikgKworICAgICAgICAgICAgKCAoICggKGxvbmcpIGJbb2ZmKzRdKSAmIDB4RkYpIDw8IDI0KSArCisgICAgICAgICAgICAoICggKCAobG9uZykgYltvZmYrM10pICYgMHhGRikgPDwgMzIpICsKKyAgICAgICAgICAgICggKCAoIChsb25nKSBiW29mZisyXSkgJiAweEZGKSA8PCA0MCkgKworICAgICAgICAgICAgKCAoICggKGxvbmcpIGJbb2ZmKzFdKSAmIDB4RkYpIDw8IDQ4KSArCisgICAgICAgICAgICAoICggKCAobG9uZykgYltvZmYrMF0pICYgMHhGRikgPDwgNTYpOworICAgIH0vL3RvSW50CisKKworICAgIC8qKgorICAgICAqIENvbnZlcnRzIGFuIGludGVnZXIgdG8gZm91ciBieXRlcworICAgICAqIEBwYXJhbSBuIC0gdGhlIGludGVnZXIKKyAgICAgKiBAcmV0dXJuIC0gZm91ciBieXRlcyBpbiBhbiBhcnJheQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIHRvQnl0ZXMoaW50IG4pIHsKKyAgICAgICAgYnl0ZVtdIGIgPSBuZXcgYnl0ZVs0XTsKKyAgICAgICAgYlszXSA9IChieXRlKSAobik7CisgICAgICAgIG4gPj4+PSA4OworICAgICAgICBiWzJdID0gKGJ5dGUpIChuKTsKKyAgICAgICAgbiA+Pj49IDg7CisgICAgICAgIGJbMV0gPSAoYnl0ZSkgKG4pOworICAgICAgICBuID4+Pj0gODsKKyAgICAgICAgYlswXSA9IChieXRlKSAobik7CisgICAgICAgIHJldHVybiBiOworICAgIH0gLy90b0J5dGVzCisKKworICAgIC8qKgorICAgICAqIENvbnZlcnRzIGFuIGxvbmcgdG8gZWlnaHQgYnl0ZXMKKyAgICAgKiBAcGFyYW0gbiAtIHRoZSBsb25nCisgICAgICogQHJldHVybiAtIGVpZ2h0IGJ5dGVzIGluIGFuIGFycmF5CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBieXRlW10gdG9CeXRlcyhsb25nIG4pIHsKKyAgICAgICAgYnl0ZVtdIGIgPSBuZXcgYnl0ZVs4XTsKKyAgICAgICAgYls3XSA9IChieXRlKSAobik7CisgICAgICAgIG4gPj4+PSA4OworICAgICAgICBiWzZdID0gKGJ5dGUpIChuKTsKKyAgICAgICAgbiA+Pj49IDg7CisgICAgICAgIGJbNV0gPSAoYnl0ZSkgKG4pOworICAgICAgICBuID4+Pj0gODsKKyAgICAgICAgYls0XSA9IChieXRlKSAobik7CisgICAgICAgIG4gPj4+PSA4OworICAgICAgICBiWzNdID0gKGJ5dGUpIChuKTsKKyAgICAgICAgbiA+Pj49IDg7CisgICAgICAgIGJbMl0gPSAoYnl0ZSkgKG4pOworICAgICAgICBuID4+Pj0gODsKKyAgICAgICAgYlsxXSA9IChieXRlKSAobik7CisgICAgICAgIG4gPj4+PSA4OworICAgICAgICBiWzBdID0gKGJ5dGUpIChuKTsKKyAgICAgICAgcmV0dXJuIGI7CisgICAgfSAvL3RvQnl0ZXMKKworCisgICAgLyoqCisgICAgICogU2ltaWxhciB0byBhIFN0cmluZy5JbmRleE9mLCBidXQgdXNlcyBwdXJlIGJ5dGVzCisgICAgICogQHBhcmFtIHNyYyAtIHRoZSBzb3VyY2UgYnl0ZXMgdG8gYmUgc2VhcmNoZWQKKyAgICAgKiBAcGFyYW0gc3JjT2ZmIC0gb2Zmc2V0IG9uIHRoZSBzb3VyY2UgYnVmZmVyCisgICAgICogQHBhcmFtIGZpbmQgLSB0aGUgc3RyaW5nIHRvIGJlIGZvdW5kIHdpdGhpbiBzcmMKKyAgICAgKiBAcmV0dXJuIC0gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBtYXRjaGluZyBieXRlLiAtMSBpZiB0aGUgZmluZCBhcnJheSBpcyBub3QgZm91bmQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCBmaXJzdEluZGV4T2YoYnl0ZVtdIHNyYywgaW50IHNyY09mZiwgYnl0ZVtdIGZpbmQpeworICAgICAgICBpbnQgcmVzdWx0ID0gLTE7CisgICAgICAgIGlmIChmaW5kLmxlbmd0aCA+IHNyYy5sZW5ndGgpIHJldHVybiByZXN1bHQ7CisgICAgICAgIGlmIChmaW5kLmxlbmd0aCA9PSAwIHx8IHNyYy5sZW5ndGggPT0gMCkgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgaWYgKHNyY09mZiA+PSBzcmMubGVuZ3RoICkgdGhyb3cgbmV3IGphdmEubGFuZy5BcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKKyAgICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOworICAgICAgICBpbnQgc3JjbGVuID0gc3JjLmxlbmd0aDsKKyAgICAgICAgaW50IGZpbmRsZW4gPSBmaW5kLmxlbmd0aDsKKyAgICAgICAgYnl0ZSBmaXJzdCA9IGZpbmRbMF07CisgICAgICAgIGludCBwb3MgPSBzcmNPZmY7CisgICAgICAgIHdoaWxlICghZm91bmQpIHsKKyAgICAgICAgICAgIC8vZmluZCB0aGUgZmlyc3QgYnl0ZQorICAgICAgICAgICAgd2hpbGUgKHBvcyA8IHNyY2xlbil7CisgICAgICAgICAgICAgICAgaWYgKGZpcnN0ID09IHNyY1twb3NdKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBwb3MrKzsKKyAgICAgICAgICAgIH0gLy93aGlsZQorICAgICAgICAgICAgaWYgKHBvcyA+PSBzcmNsZW4pCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgICAgICAvL3dlIGZvdW5kIHRoZSBmaXJzdCBjaGFyYWN0ZXIKKyAgICAgICAgICAgIC8vbWF0Y2ggdGhlIHJlc3Qgb2YgdGhlIGJ5dGVzIC0gdGhleSBoYXZlIHRvIG1hdGNoCisgICAgICAgICAgICBpZiAoIChzcmNsZW4gLSBwb3MpIDwgZmluZGxlbikKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAvL2Fzc3VtZSBpdCBkb2VzIGV4aXN0CisgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMTsgKCAoaSA8IGZpbmRsZW4pICYmIGZvdW5kKTsgaSsrKQorICAgICAgICAgICAgICAgIGZvdW5kID0gZm91bmQgJiYgKGZpbmRbaV0gPT0gc3JjW3BvcyArIGldKTsKKyAgICAgICAgICAgIGlmIChmb3VuZCkKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBwb3M7CisgICAgICAgICAgICBlbHNlIGlmICggKHNyY2xlbiAtIHBvcykgPCBmaW5kbGVuKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsgLy9ubyBtb3JlIG1hdGNoZXMgcG9zc2libGUKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBwb3MrKzsKKyAgICAgICAgfSAvL3doaWxlCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfSAvL2ZpcnN0SW5kZXhPZgorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGNvbXBsZXRlIGRhdGEgcGFja2FnZQorICAgICAqIEBwYXJhbSBpbmRhdGEgLSB0aGUgbWVzc2FnZSBkYXRhIHRvIGJlIGNvbnRhaW5lZCB3aXRoaW4gdGhlIHBhY2thZ2UKKyAgICAgKiBAcmV0dXJuIC0gYSBmdWxsIHBhY2thZ2UgKGhlYWRlcixzaXplLGRhdGEsZm9vdGVyKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIGNyZWF0ZURhdGFQYWNrYWdlKGJ5dGVbXSBpbmRhdGEpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uICB7CisgICAgICAgIGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJvdXQgPSBuZXcgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0oaW5kYXRhLmxlbmd0aC8yKTsKKyAgICAgICAgamF2YS51dGlsLnppcC5HWklQT3V0cHV0U3RyZWFtIGdvdXQgPSBuZXcgamF2YS51dGlsLnppcC5HWklQT3V0cHV0U3RyZWFtKGJvdXQpOworICAgICAgICBnb3V0LndyaXRlKGluZGF0YSk7CisgICAgICAgIGdvdXQuZmx1c2goKTsKKyAgICAgICAgZ291dC5jbG9zZSgpOworICAgICAgICBieXRlW10gZGF0YSA9IGJvdXQudG9CeXRlQXJyYXkoKTsKKyAgICAgICAgYnl0ZVtdIHJlc3VsdCA9IG5ldyBieXRlW1NUQVJUX0RBVEEubGVuZ3RoKzQrZGF0YS5sZW5ndGgrRU5EX0RBVEEubGVuZ3RoXTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShTVEFSVF9EQVRBLDAscmVzdWx0LDAsU1RBUlRfREFUQS5sZW5ndGgpOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHRvQnl0ZXMoZGF0YS5sZW5ndGgpLDAscmVzdWx0LFNUQVJUX0RBVEEubGVuZ3RoLDQpOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGRhdGEsMCxyZXN1bHQsU1RBUlRfREFUQS5sZW5ndGgrNCxkYXRhLmxlbmd0aCk7CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoRU5EX0RBVEEsMCxyZXN1bHQsU1RBUlRfREFUQS5sZW5ndGgrNCtkYXRhLmxlbmd0aCxFTkRfREFUQS5sZW5ndGgpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0vL2NyZWF0ZURhdGFQYWNrYWdlCisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICBsb2cuaW5mbygiQmVmb3JlPSIrSW50ZWdlci5NQVhfVkFMVUUpOworICAgICAgIGJ5dGVbXSBkID0gdG9CeXRlcyhJbnRlZ2VyLk1BWF9WQUxVRSk7CisgICAgICAgbG9nLmluZm8oIkFmdGVyPSIrdG9JbnQoZCwwKSk7CisKKworICAgICAgIGxvZy5pbmZvKCJCZWZvcmU9IitMb25nLk1BWF9WQUxVRSk7CisgICAgICAgZCA9IHRvQnl0ZXMoTG9uZy5NQVhfVkFMVUUpOworICAgICAgIGxvZy5pbmZvKCJBZnRlcj0iK3RvTG9uZyhkLDApKTsKKworICAgICAgIGxvZy5pbmZvKCJCZWZvcmU9IiArIDQ1NjQ1NjQpOworICAgICAgIGQgPSB0b0J5dGVzKChsb25nKTQ1NjQ1NjQpOworICAgICAgIGxvZy5pbmZvKCJBZnRlcj0iICsgdG9Mb25nKGQsIDApKTsKKworICAgICAgIGJ5dGVbXSBkMSA9IGNyZWF0ZURhdGFQYWNrYWdlKG5ldyBieXRlW10gezF9KTsKKyAgICAgICBieXRlW10gZDIgPSBjcmVhdGVEYXRhUGFja2FnZShuZXcgYnl0ZVtdIHsyfSk7CisgICAgICAgYnl0ZVtdIGQzID0gY3JlYXRlRGF0YVBhY2thZ2UobmV3IGJ5dGVbXSB7M30pOworICAgICAgIGJ5dGVbXSB0ZXN0ID0gbmV3IGJ5dGVbZDEubGVuZ3RoK2QyLmxlbmd0aCtkMy5sZW5ndGgrNV07CisgICAgICAgU3lzdGVtLmFycmF5Y29weShkMSwwLHRlc3QsMCxkMS5sZW5ndGgpOworICAgICAgIFN5c3RlbS5hcnJheWNvcHkoZDIsMCx0ZXN0LGQxLmxlbmd0aCxkMi5sZW5ndGgpOworICAgICAgIFN5c3RlbS5hcnJheWNvcHkoZDMsMCx0ZXN0LGQyLmxlbmd0aCtkMS5sZW5ndGgsZDMubGVuZ3RoKTsKKyAgICAgICBwcmludEJ1ZihkMSk7CisgICAgICAgcHJpbnRCdWYoZDIpOworICAgICAgIHByaW50QnVmKGQzKTsKKyAgICAgICBwcmludEJ1Zih0ZXN0KTsKKyAgICAgICBYQnl0ZUJ1ZmZlciBiID0gbmV3IFhCeXRlQnVmZmVyKCk7CisgICAgICAgYi5hcHBlbmQodGVzdCwwLHRlc3QubGVuZ3RoKTsKKyAgICAgICBpbnQgcyA9IGIuY291bnRQYWNrYWdlcygpOworICAgICAgIGxvZy5pbmZvKCJOciBvZiBwYWNrYWdlcz0iK3MpOworICAgICAgIHdoaWxlICggcyA+IDAgKSB7CisgICAgICAgICAgIGQgPSBiLmV4dHJhY3RQYWNrYWdlKHRydWUpOworICAgICAgICAgICBsb2cuaW5mbygiUGFja2FnZSBkMT0iKTsKKyAgICAgICAgICAgcHJpbnRCdWYoZCk7CisgICAgICAgICAgIHMtLTsKKyAgICAgICB9Ly93aGlsZQorCisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHByaW50QnVmKGJ5dGVbXSBiKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGZvciAoIGludCBpPTA7IGk8Yi5sZW5ndGg7IGkrKyApIHsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoYltpXSArICIgIik7CisgICAgICAgIH0KKyAgICAgICAgbG9nLmluZm8oYnVmKTsKKyAgICB9CisKK30vL2NsYXNzCmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvbWJlYW5zLWRlc2NyaXB0b3JzLnhtbCBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9tYmVhbnMtZGVzY3JpcHRvcnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMzI5ODEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvbWJlYW5zLWRlc2NyaXB0b3JzLnhtbApAQCAtMCwwICsxLDEwMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8bWJlYW5zLWRlc2NyaXB0b3JzPgorCisgIDxtYmVhbiAgICAgICAgIG5hbWU9IlNpbXBsZVRjcENsdXN0ZXIiCisgICAgICAgICAgICBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEubWJlYW5zLkNsYXNzTmFtZU1CZWFuIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJUY3AgQ2x1c3RlciBpbXBsZW1lbnRhdGlvbiIKKyAgICAgICAgICAgICAgIGRvbWFpbj0iQ2F0YWxpbmEiCisgICAgICAgICAgICAgICAgZ3JvdXA9IkNsdXN0ZXIiCisgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci50Y3AuU2ltcGxlVGNwQ2x1c3RlciI+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0icHJvdG9jb2xTdGFjayIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iSmF2YUdyb3VwcyBwcm90b2NvbCBzdGFjayBzZWxlY3Rpb24iCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciLz4KKworICA8L21iZWFuPgorCisKKyAgPG1iZWFuICAgICAgICAgbmFtZT0iU2ltcGxlVGNwUmVwbGljYXRpb25NYW5hZ2VyIgorICAgICAgICAgICAgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLm1iZWFucy5DbGFzc05hbWVNQmVhbiIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQ2x1c3RlcmVkIGltcGxlbWVudGF0aW9uIG9mIHRoZSBNYW5hZ2VyIGludGVyZmFjZSIKKyAgICAgICAgICAgICAgIGRvbWFpbj0iQ2F0YWxpbmEiCisgICAgICAgICAgICAgICAgZ3JvdXA9Ik1hbmFnZXIiCisgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci50Y3AuU2ltcGxlVGNwUmVwbGljYXRpb25NYW5hZ2VyIj4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJhbGdvcml0aG0iCisgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBtZXNzYWdlIGRpZ2VzdCBhbGdvcml0aG0gdG8gYmUgdXNlZCB3aGVuIGdlbmVyYXRpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbiBpZGVudGlmaWVycyIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImNoZWNrSW50ZXJ2YWwiCisgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBpbnRlcnZhbCAoaW4gc2Vjb25kcykgYmV0d2VlbiBjaGVja3MgZm9yIGV4cGlyZWQKKyAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbnMiCisgICAgICAgICAgICAgICAgIHR5cGU9ImludCIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImNsYXNzTmFtZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iRnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIG1hbmFnZWQgb2JqZWN0IgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImRlYnVnIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgZGVidWdnaW5nIGRldGFpbCBsZXZlbCBmb3IgdGhpcyBjb21wb25lbnQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImludCIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImRpc3RyaWJ1dGFibGUiCisgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBkaXN0cmlidXRhYmxlIGZsYWcgZm9yIFNlc3Npb25zIGNyZWF0ZWQgYnkgdGhpcworICAgICAgICAgICAgICAgICAgICAgICBNYW5hZ2VyIgorICAgICAgICAgICAgICAgICB0eXBlPSJib29sZWFuIi8+CisKKyAgICA8YXR0cmlidXRlICAgbmFtZT0iZW50cm9weSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iQSBTdHJpbmcgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyIHVzZWQgdG8gaW5jcmVhc2UgdGhlCisgICAgICAgICAgICAgICAgICAgICAgIGVudHJvcHkgb2YgdGhlIGluaXRpYWxpemF0aW9uIG9mIG91ciByYW5kb20gbnVtYmVyCisgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRvciIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9Im1hbmFnZWRSZXNvdXJjZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIG1hbmFnZWQgcmVzb3VyY2UgdGhpcyBNQmVhbiBpcyBhc3NvY2lhdGVkIHdpdGgiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5PYmplY3QiLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJtYXhBY3RpdmVTZXNzaW9ucyIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIG1heGltdW0gbnVtYmVyIG9mIGFjdGl2ZSBTZXNzaW9ucyBhbGxvd2VkLCBvciAtMQorICAgICAgICAgICAgICAgICAgICAgICBmb3Igbm8gbGltaXQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImludCIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9Im1heEluYWN0aXZlSW50ZXJ2YWwiCisgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBkZWZhdWx0IG1heGltdW0gaW5hY3RpdmUgaW50ZXJ2YWwgZm9yIFNlc3Npb25zCisgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZWQgYnkgdGhpcyBNYW5hZ2VyIgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJuYW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgZGVzY3JpcHRpdmUgbmFtZSBvZiB0aGlzIE1hbmFnZXIgaW1wbGVtZW50YXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgKGZvciBsb2dnaW5nKSIKKyAgICAgICAgICAgICAgICAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgIHdyaXRlYWJsZT0iZmFsc2UiLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJwYXRobmFtZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iUGF0aCBuYW1lIG9mIHRoZSBkaXNrIGZpbGUgaW4gd2hpY2ggYWN0aXZlIHNlc3Npb25zIgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisKKyAgPC9tYmVhbj4KKworCisKKzxtYmVhbiAgICAgICAgIG5hbWU9IlJlcGxpY2F0aW9uVmFsdmUiCisgICAgICAgICAgICBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEubWJlYW5zLkNsYXNzTmFtZU1CZWFuIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJWYWx2ZSBmb3Igc2ltcGxlIHRjcCByZXBsaWNhdGlvbiIKKyAgICAgICAgICAgICAgIGRvbWFpbj0iQ2F0YWxpbmEiCisgICAgICAgICAgICAgICAgZ3JvdXA9IlZhbHZlIgorICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIudGNwLlJlcGxpY2F0aW9uVmFsdmUiPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImNsYXNzTmFtZSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iRnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIG1hbmFnZWQgb2JqZWN0IgorICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgd3JpdGVhYmxlPSJmYWxzZSIvPgorCisgICAgPGF0dHJpYnV0ZSAgIG5hbWU9ImRlYnVnIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJUaGUgZGVidWdnaW5nIGRldGFpbCBsZXZlbCBmb3IgdGhpcyBjb21wb25lbnQiCisgICAgICAgICAgICAgICAgIHR5cGU9ImludCIvPgorCisgIDwvbWJlYW4+CisKKworPC9tYmVhbnMtZGVzY3JpcHRvcnM+CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvbWNhc3QvTWNhc3RNZW1iZXIuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9tY2FzdC9NY2FzdE1lbWJlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhNTAwOWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvbWNhc3QvTWNhc3RNZW1iZXIuamF2YQpAQCAtMCwwICsxLDI5NCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5tY2FzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5NZW1iZXI7CisKKy8qKgorICogQSA8Yj5tZW1iZXJzaGlwPC9iPiBpbXBsZW1lbnRhdGlvbiB1c2luZyBzaW1wbGUgbXVsdGljYXN0LgorICogVGhpcyBpcyB0aGUgcmVwcmVzZW50YXRpb24gb2YgYSBtdWx0aWNhc3QgbWVtYmVyLgorICogQ2FycmllcyB0aGUgaG9zdCwgYW5kIHBvcnQgb2YgdGhlIHRoaXMgb3Igb3RoZXIgY2x1c3RlciBub2Rlcy4KKyAqCisgKiBAYXV0aG9yIEZpbGlwIEhhbmlrCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kLCAkRGF0ZSQKKyAqLworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLmlvLlhCeXRlQnVmZmVyOworcHVibGljIGNsYXNzIE1jYXN0TWVtYmVyIGltcGxlbWVudHMgTWVtYmVyLCBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7CisKKyAgICAvKioKKyAgICAgKiBEaWdpdHMsIHVzZWQgZm9yICJzdXBlcmZhc3QiIGRlLXNlcmlhbGl6YXRpb24gb2YgYW4KKyAgICAgKiBJUCBhZGRyZXNzCisgICAgICovCisgICAgZmluYWwgdHJhbnNpZW50IHN0YXRpYyBjaGFyW10gZGlnaXRzID0geworICAgICAgICAnMCcsICcxJywgJzInLCAnMycsICc0JywgJzUnLAorICAgICAgICAnNicsICc3JywgJzgnLCAnOSd9OworCisgICAgLyoqCisgICAgICogUHVibGljIHByb3BlcnRpZXMgc3BlY2lmaWMgdG8gdGhpcyBpbXBsZW1lbnRhdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgdHJhbnNpZW50IFN0cmluZyBUQ1BfTElTVEVOX1BPUlQgPSAidGNwTGlzdGVuUG9ydCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCB0cmFuc2llbnQgU3RyaW5nIFRDUF9MSVNURU5fSE9TVCA9ICJ0Y3BMaXN0ZW5Ib3N0IjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIHRyYW5zaWVudCBTdHJpbmcgTUVNQkVSX05BTUUgPSAibWVtYmVyTmFtZSI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbGlzdGVuIGhvc3QgZm9yIHRoaXMgbWVtYmVyCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBob3N0OworICAgIC8qKgorICAgICAqIFRoZSB0Y3AgbGlzdGVuIHBvcnQgZm9yIHRoaXMgbWVtYmVyCisgICAgICovCisgICAgcHJvdGVjdGVkIGludCBwb3J0OworICAgIC8qKgorICAgICAqIFRoZSBuYW1lIGZvciB0aGlzIG1lbWJlciwgaGFzIGJlIGJlIHVuaXF1ZSB3aXRoaW4gdGhlIGNsdXN0ZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKyAgICAvKioKKyAgICAgKiBDb3VudGVyIGZvciBob3cgbWFueSBtZXNzYWdlcyBoYXZlIGJlZW4gc2VudCBmcm9tIHRoaXMgbWVtYmVyCisgICAgICovCisgICAgcHJvdGVjdGVkIGludCBtc2dDb3VudCA9IDA7CisgICAgLyoqCisgICAgICogVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgc2luY2UgdGhpcyBtZW1iZXJzIHdhcworICAgICAqIGNyZWF0ZWQsIGlzIGtlcHQgdHJhY2sgb2YgdXNpbmcgdGhlIHN0YXJ0IHRpbWUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgbG9uZyBtZW1iZXJBbGl2ZVRpbWUgPSAwOworCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgbWVtYmVyIG9iamVjdAorICAgICAqIEBwYXJhbSBuYW1lIC0gdGhlIG5hbWUgb2YgdGhpcyBtZW1iZXIsIGNsdXN0ZXIgdW5pcXVlCisgICAgICogQHBhcmFtIGhvc3QgLSB0aGUgdGNwIGxpc3RlbiBob3N0CisgICAgICogQHBhcmFtIHBvcnQgLSB0aGUgdGNwIGxpc3RlbiBwb3J0CisgICAgICovCisgICAgcHVibGljIE1jYXN0TWVtYmVyKFN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaG9zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgYWxpdmVUaW1lKSB7CisgICAgICAgIHRoaXMuaG9zdCA9IGhvc3Q7CisgICAgICAgIHRoaXMucG9ydCA9IHBvcnQ7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMubWVtYmVyQWxpdmVUaW1lPWFsaXZlVGltZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBIYXNobWFwIGNvbnRhaW5pbmcgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOjxCUj4KKyAgICAgKiAxLiB0Y3BMaXN0ZW5Qb3J0IC0gdGhlIHBvcnQgdGhpcyBtZW1iZXIgbGlzdGVucyB0byBmb3IgbWVzc2FnZXMgLSBzdHJpbmc8QlI+CisgICAgICogMi4gdGNwTGlzdGVuSG9zdCAtIHRoZSBob3N0IGFkZHJlc3Mgb2YgdGhpcyBtZW1iZXIgLSBzdHJpbmc8QlI+CisgICAgICogMy4gbWVtYmVyTmFtZSAgICAtIHRoZSBuYW1lIG9mIHRoaXMgbWVtYmVyIC0gc3RyaW5nPEJSPgorICAgICAqLworICAgIHB1YmxpYyBqYXZhLnV0aWwuSGFzaE1hcCBnZXRNZW1iZXJQcm9wZXJ0aWVzKCkgeworICAgICAgICBqYXZhLnV0aWwuSGFzaE1hcCBtYXAgPSBuZXcgamF2YS51dGlsLkhhc2hNYXAoMik7CisgICAgICAgIG1hcC5wdXQoTWNhc3RNZW1iZXIuVENQX0xJU1RFTl9IT1NULHRoaXMuaG9zdCk7CisgICAgICAgIG1hcC5wdXQoTWNhc3RNZW1iZXIuVENQX0xJU1RFTl9QT1JULFN0cmluZy52YWx1ZU9mKHRoaXMucG9ydCkpOworICAgICAgICBtYXAucHV0KE1jYXN0TWVtYmVyLk1FTUJFUl9OQU1FLG5hbWUpOworICAgICAgICByZXR1cm4gbWFwOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluY3JlbWVudCB0aGUgbWVzc2FnZSBjb3VudC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBpbmMoKSB7CisgICAgICAgIG1zZ0NvdW50Kys7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgZGF0YSBwYWNrYWdlIHRvIHNlbmQgb3ZlciB0aGUgd2lyZSByZXByZXNlbnRpbmcgdGhpcyBtZW1iZXIuCisgICAgICogVGhpcyBpcyBmYXN0ZXIgdGhhbiBzZXJpYWxpemF0aW9uLgorICAgICAqIEByZXR1cm4gLSB0aGUgYnl0ZXMgZm9yIHRoaXMgbWVtYmVyIGRlc2VyaWFsaXplZAorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIGJ5dGVbXSBnZXREYXRhKGxvbmcgc3RhcnRUaW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy9wYWNrYWdlIGxvb2tzIGxpa2UKKyAgICAgICAgLy9hbGl2ZSAtIDggYnl0ZXMKKyAgICAgICAgLy9wb3J0IC0gNCBieXRlcworICAgICAgICAvL2hvc3QgLSA0IGJ5dGVzCisgICAgICAgIC8vbmFtZSAtIHJlbWFpbmluZyBieXRlcworICAgICAgICBieXRlW10gbmFtZWQgPSBnZXROYW1lKCkuZ2V0Qnl0ZXMoKTsKKyAgICAgICAgYnl0ZVtdIGFkZHIgPSBqYXZhLm5ldC5JbmV0QWRkcmVzcy5nZXRCeU5hbWUoaG9zdCkuZ2V0QWRkcmVzcygpOworICAgICAgICBieXRlW10gZGF0YSA9IG5ldyBieXRlWzgrNCthZGRyLmxlbmd0aCtuYW1lZC5sZW5ndGhdOworICAgICAgICBsb25nIGFsaXZlPVN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpLXN0YXJ0VGltZTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShYQnl0ZUJ1ZmZlci50b0J5dGVzKChsb25nKWFsaXZlKSwwLGRhdGEsMCw4KTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShYQnl0ZUJ1ZmZlci50b0J5dGVzKHBvcnQpLDAsZGF0YSw4LDQpOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGFkZHIsMCxkYXRhLDEyLGFkZHIubGVuZ3RoKTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShuYW1lZCwwLGRhdGEsOCs0K2FkZHIubGVuZ3RoLG5hbWVkLmxlbmd0aCk7CisgICAgICAgIHJldHVybiBkYXRhOworICAgIH0KKyAgICAvKioKKyAgICAgKiBEZXNlcmlhbGl6ZXMgYSBtZW1iZXIgZnJvbSBkYXRhIHNlbnQgb3ZlciB0aGUgd2lyZQorICAgICAqIEBwYXJhbSBkYXRhIC0gdGhlIGJ5dGVzIHJlY2VpdmVkCisgICAgICogQHJldHVybiBhIG1lbWJlciBvYmplY3QuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBNY2FzdE1lbWJlciBnZXRNZW1iZXIoYnl0ZVtdIGRhdGEpIHsKKyAgICAgICAvL3BhY2thZ2UgbG9va3MgbGlrZQorICAgICAgIC8vYWxpdmUgLSA4IGJ5dGVzCisgICAgICAgLy9wb3J0IC0gNCBieXRlcworICAgICAgIC8vaG9zdCAtIDQgYnl0ZXMKKyAgICAgICAvL25hbWUgLSByZW1haW5pbmcgYnl0ZXMKKyAgICAgICBieXRlW10gYWxpdmVkID0gbmV3IGJ5dGVbOF07CisgICAgICAgU3lzdGVtLmFycmF5Y29weShkYXRhLCAwLCBhbGl2ZWQsIDAsIDgpOworICAgICAgIGJ5dGVbXSBwb3J0ZCA9IG5ldyBieXRlWzRdOworICAgICAgIFN5c3RlbS5hcnJheWNvcHkoZGF0YSwgOCwgcG9ydGQsIDAsIDQpOworICAgICAgIGJ5dGVbXSBhZGRyID0gbmV3IGJ5dGVbNF07CisgICAgICAgU3lzdGVtLmFycmF5Y29weShkYXRhLCAxMiwgYWRkciwgMCwgNCk7CisgICAgICAgYnl0ZVtdIG5hbWVkID0gbmV3IGJ5dGVbZGF0YS5sZW5ndGggLSAxNl07CisgICAgICAgU3lzdGVtLmFycmF5Y29weShkYXRhLCAxNiwgbmFtZWQsIDAsIG5hbWVkLmxlbmd0aCk7CisgICAgICAgcmV0dXJuIG5ldyBNY2FzdE1lbWJlcihuZXcgU3RyaW5nKG5hbWVkKSwgYWRkcmVzc1RvU3RyaW5nKGFkZHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEJ5dGVCdWZmZXIudG9JbnQocG9ydGQsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEJ5dGVCdWZmZXIudG9Mb25nKGFsaXZlZCwgMCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGlzIG9iamVjdAorICAgICAqIEByZXR1cm4gYSB1bmlxdWUgbmFtZSB0byB0aGUgY2x1c3RlcgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBsaXN0ZW4gcG9ydCBvZiB0aGlzIG1lbWJlcgorICAgICAqIEByZXR1cm4gLSB0Y3AgbGlzdGVuIHBvcnQKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFBvcnQoKSAgeworICAgICAgICByZXR1cm4gdGhpcy5wb3J0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgVENQIGxpc3RlbiBob3N0IGZvciB0aGlzIG1lbWJlcgorICAgICAqIEByZXR1cm4gSVAgYWRkcmVzcyBvciBob3N0IG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEhvc3QoKSAgeworICAgICAgICByZXR1cm4gdGhpcy5ob3N0OworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnRhaW5zIGluZm9ybWF0aW9uIG9uIGhvdyBsb25nIHRoaXMgbWVtYmVyIGhhcyBiZWVuIG9ubGluZS4KKyAgICAgKiBUaGUgcmVzdWx0IGlzIHRoZSBudW1iZXIgb2YgbWlsbGkgc2Vjb25kcyB0aGlzIG1lbWJlciBoYXMgYmVlbgorICAgICAqIGJyb2FkY2FzdGluZyBpdHMgbWVtYmVyc2hpcCB0byB0aGUgY2x1c3Rlci4KKyAgICAgKiBAcmV0dXJuIG5yIG9mIG1pbGxpc2Vjb25kcyBzaW5jZSB0aGlzIG1lbWJlciBzdGFydGVkLgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldE1lbWJlckFsaXZlVGltZSgpIHsKKyAgICAgICByZXR1cm4gbWVtYmVyQWxpdmVUaW1lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1lbWJlckFsaXZlVGltZShsb25nIHRpbWUpIHsKKyAgICAgICBtZW1iZXJBbGl2ZVRpbWU9dGltZTsKKyAgICB9CisKKworCisgICAgLyoqCisgICAgICogU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0CisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpICB7CisgICAgICAgIHJldHVybiAib3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLm1jYXN0Lk1jYXN0TWVtYmVyWyIrbmFtZSsiLCIraG9zdCsiLCIrcG9ydCsiLCBhbGl2ZT0iK21lbWJlckFsaXZlVGltZSsiXSI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2hhc2hDb2RlKCkKKyAgICAgKiBAcmV0dXJuCisgICAgICovCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubmFtZS5oYXNoQ29kZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcGFyYW0gbyBpcyBhIE1jYXN0TWVtYmVyIHdpdGggdGhlIHNhbWUgbmFtZQorICAgICAqIEBwYXJhbSBvCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICAgIGlmICggbyBpbnN0YW5jZW9mIE1jYXN0TWVtYmVyICkgICAgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMubmFtZS5lcXVhbHMoKChNY2FzdE1lbWJlcilvKS5nZXROYW1lKCkpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0cyBmb3IgYnl0ZXMgKGlwIGFkZHJlc3MpIHRvIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGl0PEJSPgorICAgICAqIEhpZ2hseSBvcHRpbWl6ZWQgbWV0aG9kLgorICAgICAqIEBwYXJhbSBhZGRyZXNzICg0IGJ5dGVzIGlwIGFkZHJlc3MpCisgICAgICogQHJldHVybiBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhhdCBpcCBhZGRyZXNzCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGFkZHJlc3NUb1N0cmluZyhieXRlW10gYWRkcmVzcykgeworICAgICAgICBpbnQgcSwgciA9IDA7CisgICAgICAgIGludCBjaGFyUG9zID0gMTU7CisgICAgICAgIGNoYXJbXSBidWYgPSBuZXcgY2hhclsxNV07CisgICAgICAgIGNoYXIgZG90ID0gJy4nOworCisgICAgICAgIGludCBpID0gYWRkcmVzc1szXSAmIDB4RkY7CisgICAgICAgIGZvciAoOyA7ICkKKyAgICAgICAgeworICAgICAgICAgICAgcSA9IChpICogNTI0MjkpID4+PiAoMTkpOworICAgICAgICAgICAgciA9IGkgLSAoIChxIDw8IDMpICsgKHEgPDwgMSkpOworICAgICAgICAgICAgYnVmWy0tY2hhclBvc10gPSBkaWdpdHNbcl07CisgICAgICAgICAgICBpID0gcTsKKyAgICAgICAgICAgIGlmIChpID09IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnVmWy0tY2hhclBvc10gPSBkb3Q7CisgICAgICAgIGkgPSBhZGRyZXNzWzJdICYgMHhGRjsKKyAgICAgICAgZm9yICg7IDsgKQorICAgICAgICB7CisgICAgICAgICAgICBxID0gKGkgKiA1MjQyOSkgPj4+ICgxOSk7CisgICAgICAgICAgICByID0gaSAtICggKHEgPDwgMykgKyAocSA8PCAxKSk7CisgICAgICAgICAgICBidWZbLS1jaGFyUG9zXSA9IGRpZ2l0c1tyXTsKKyAgICAgICAgICAgIGkgPSBxOworICAgICAgICAgICAgaWYgKGkgPT0gMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBidWZbLS1jaGFyUG9zXSA9IGRvdDsKKworICAgICAgICBpID0gYWRkcmVzc1sxXSAmIDB4RkY7CisgICAgICAgIGZvciAoOyA7ICkKKyAgICAgICAgeworICAgICAgICAgICAgcSA9IChpICogNTI0MjkpID4+PiAoMTkpOworICAgICAgICAgICAgciA9IGkgLSAoIChxIDw8IDMpICsgKHEgPDwgMSkpOworICAgICAgICAgICAgYnVmWy0tY2hhclBvc10gPSBkaWdpdHNbcl07CisgICAgICAgICAgICBpID0gcTsKKyAgICAgICAgICAgIGlmIChpID09IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBidWZbLS1jaGFyUG9zXSA9IGRvdDsKKyAgICAgICAgaSA9IGFkZHJlc3NbMF0gJiAweEZGOworCisgICAgICAgIGZvciAoOyA7ICkKKyAgICAgICAgeworICAgICAgICAgICAgcSA9IChpICogNTI0MjkpID4+PiAoMTkpOworICAgICAgICAgICAgciA9IGkgLSAoIChxIDw8IDMpICsgKHEgPDwgMSkpOworICAgICAgICAgICAgYnVmWy0tY2hhclBvc10gPSBkaWdpdHNbcl07CisgICAgICAgICAgICBpID0gcTsKKyAgICAgICAgICAgIGlmIChpID09IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoYnVmLCBjaGFyUG9zLCAxNSAtIGNoYXJQb3MpOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBzZXRIb3N0KFN0cmluZyBob3N0KSB7CisgICAgICAgIHRoaXMuaG9zdCA9IGhvc3Q7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHNldE1zZ0NvdW50KGludCBtc2dDb3VudCkgeworICAgICAgICB0aGlzLm1zZ0NvdW50ID0gbXNnQ291bnQ7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgc2V0UG9ydChpbnQgcG9ydCkgeworICAgICAgICB0aGlzLnBvcnQgPSBwb3J0OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9tY2FzdC9NY2FzdE1lbWJlcnNoaXAuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9tY2FzdC9NY2FzdE1lbWJlcnNoaXAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzFlYjUxCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL21jYXN0L01jYXN0TWVtYmVyc2hpcC5qYXZhCkBAIC0wLDAgKzEsMTY1IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLm1jYXN0OworCisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKKy8qKgorICogQSA8Yj5tZW1iZXJzaGlwPC9iPiBpbXBsZW1lbnRhdGlvbiB1c2luZyBzaW1wbGUgbXVsdGljYXN0LgorICogVGhpcyBpcyB0aGUgcmVwcmVzZW50YXRpb24gb2YgYSBtdWx0aWNhc3QgbWVtYmVyc2hpcC4KKyAqIFRoaXMgY2xhc3MgaXMgcmVzcG9uc2libGUgZm9yIG1haW50YWluaW5nIGEgbGlzdCBvZiBhY3RpdmUgY2x1c3RlciBub2RlcyBpbiB0aGUgY2x1c3Rlci4KKyAqIElmIGEgbm9kZSBmYWlscyB0byBzZW5kIG91dCBhIGhlYXJ0YmVhdCwgdGhlIG5vZGUgd2lsbCBiZSBkaXNtaXNzZWQuCisgKgorICogQGF1dGhvciBGaWxpcCBIYW5paworICogQHZlcnNpb24gJFJldmlzaW9uJCwgJERhdGUkCisgKi8KKworCitwdWJsaWMgY2xhc3MgTWNhc3RNZW1iZXJzaGlwCit7CisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2YgdGhpcyBtZW1iZXJzaGlwLCBoYXMgdG8gYmUgdGhlIHNhbWUgYXMgdGhlIG5hbWUgZm9yIHRoZSBsb2NhbAorICAgICAqIG1lbWJlcgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgbmFtZTsKKyAgICAvKioKKyAgICAgKiBBIG1hcCBvZiBhbGwgdGhlIG1lbWJlcnMgaW4gdGhlIGNsdXN0ZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIEhhc2hNYXAgbWFwID0gbmV3IGphdmEudXRpbC5IYXNoTWFwKCk7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IG1lbWJlcnNoaXAKKyAgICAgKiBAcGFyYW0gbXlOYW1lIC0gaGFzIHRvIGJlIHRoZSBuYW1lIG9mIHRoZSBsb2NhbCBtZW1iZXIuIFVzZWQgdG8gZmlsdGVyIHRoZSBsb2NhbCBtZW1iZXIgZnJvbSB0aGUgY2x1c3RlciBtZW1iZXJzaGlwCisgICAgICovCisgICAgcHVibGljIE1jYXN0TWVtYmVyc2hpcChTdHJpbmcgbXlOYW1lKSB7CisgICAgICAgIG5hbWUgPSBteU5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzZXQgdGhlIG1lbWJlcnNoaXAgYW5kIHN0YXJ0IG92ZXIgZnJlc2guCisgICAgICogSWUsIGRlbGV0ZSBhbGwgdGhlIG1lbWJlcnMgYW5kIHdhaXQgZm9yIHRoZW0gdG8gcGluZyBhZ2FpbiBhbmQgam9pbiB0aGlzIG1lbWJlcnNoaXAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVzZXQoKSB7CisgICAgICAgIG1hcC5jbGVhcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE5vdGlmeSB0aGUgbWVtYmVyc2hpcCB0aGF0IHRoaXMgbWVtYmVyIGhhcyBhbm5vdW5jZWQgaXRzZWxmLgorICAgICAqCisgICAgICogQHBhcmFtIG0gLSB0aGUgbWVtYmVyIHRoYXQganVzdCBwaW5nZWQgdXMKKyAgICAgKiBAcmV0dXJuIC0gdHJ1ZSBpZiB0aGlzIG1lbWJlciBpcyBuZXcgdG8gdGhlIGNsdXN0ZXIsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBAcmV0dXJuIC0gZmFsc2UgaWYgdGhpcyBtZW1iZXIgaXMgdGhlIGxvY2FsIG1lbWJlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gbWVtYmVyQWxpdmUoTWNhc3RNZW1iZXIgbSkgeworICAgICAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOworICAgICAgICAvL2lnbm9yZSBvdXJzZWx2ZXMKKyAgICAgICAgaWYgKCBtLmdldE5hbWUoKS5lcXVhbHMobmFtZSkgKSByZXR1cm4gcmVzdWx0OworCisgICAgICAgIC8vcmV0dXJuIHRydWUgaWYgdGhlIG1lbWJlcnNoaXAgaGFzIGNoYW5nZWQKKyAgICAgICAgTWJyRW50cnkgZW50cnkgPSAoTWJyRW50cnkpbWFwLmdldChtLmdldE5hbWUoKSk7CisgICAgICAgIGlmICggZW50cnkgPT0gbnVsbCApIHsKKyAgICAgICAgICAgIGVudHJ5ID0gbmV3IE1ickVudHJ5KG0pOworICAgICAgICAgICAgbWFwLnB1dChtLmdldE5hbWUoKSxlbnRyeSk7CisgICAgICAgICAgICByZXN1bHQgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy91cGRhdGUgdGhlIG1lbWJlciBhbGl2ZSB0aW1lCisgICAgICAgICAgICBlbnRyeS5nZXRNZW1iZXIoKS5zZXRNZW1iZXJBbGl2ZVRpbWUobS5nZXRNZW1iZXJBbGl2ZVRpbWUoKSk7CisgICAgICAgIH0vL2VuZCBpZgorICAgICAgICBlbnRyeS5hY2Nlc3NlZCgpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJ1bnMgYSByZWZyZXNoIGN5Y2xlIGFuZCByZXR1cm5zIGEgbGlzdCBvZiBtZW1iZXJzIHRoYXQgaGFzIGV4cGlyZWQuCisgICAgICogVGhpcyBhbHNvIHJlbW92ZXMgdGhlIG1lbWJlcnMgZnJvbSB0aGUgbWVtYmVyc2hpcCwgaW4gc3VjaCBhIHdheSB0aGF0CisgICAgICogZ2V0TWVtYmVycygpID0gZ2V0TWVtYmVycygpIC0gZXhwaXJlKCkKKyAgICAgKiBAcGFyYW0gbWF4dGltZSAtIHRoZSBtYXggdGltZSBhIG1lbWJlciBjYW4gcmVtYWluIHVuYW5ub3VuY2VkIGJlZm9yZSBpdCBpcyBjb25zaWRlcmVkIGRlYWQuCisgICAgICogQHJldHVybiB0aGUgbGlzdCBvZiBleHBpcmVkIG1lbWJlcnMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIE1jYXN0TWVtYmVyW10gZXhwaXJlKGxvbmcgbWF4dGltZSkgeworICAgICAgICBNYnJFbnRyeVtdIG1lbWJlcnMgPSBnZXRNZW1iZXJFbnRyaWVzKCk7CisgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgbGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7CisgICAgICAgIGZvciAoaW50IGk9MDsgaTxtZW1iZXJzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBNYnJFbnRyeSBlbnRyeSA9IG1lbWJlcnNbaV07CisgICAgICAgICAgICBpZiAoIGVudHJ5Lmhhc0V4cGlyZWQobWF4dGltZSkgKSB7CisgICAgICAgICAgICAgICAgbGlzdC5hZGQoZW50cnkuZ2V0TWVtYmVyKCkpOworICAgICAgICAgICAgfS8vZW5kIGlmCisgICAgICAgIH0vL3doaWxlCisgICAgICAgIE1jYXN0TWVtYmVyW10gcmVzdWx0ID0gbmV3IE1jYXN0TWVtYmVyW2xpc3Quc2l6ZSgpXTsKKyAgICAgICAgbGlzdC50b0FycmF5KHJlc3VsdCk7CisgICAgICAgIGZvciAoIGludCBqPTA7IGo8cmVzdWx0Lmxlbmd0aDsgaisrKSBtYXAucmVtb3ZlKHJlc3VsdFtqXS5nZXROYW1lKCkpOworICAgICAgICByZXR1cm4gcmVzdWx0OworCisgICAgfS8vZXhwaXJlCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5pbmcgYSBsaXN0IG9mIGFsbCB0aGUgbWVtYmVycyBpbiB0aGUgbWVtYmVyc2hpcAorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgTWNhc3RNZW1iZXJbXSBnZXRNZW1iZXJzKCkgeworICAgICAgICBNY2FzdE1lbWJlcltdIHJlc3VsdCA9IG5ldyBNY2FzdE1lbWJlclttYXAuc2l6ZSgpXTsKKyAgICAgICAgamF2YS51dGlsLkl0ZXJhdG9yIGkgPSBtYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOworICAgICAgICBpbnQgcG9zID0gMDsKKyAgICAgICAgd2hpbGUgKCBpLmhhc05leHQoKSApCisgICAgICAgICAgICByZXN1bHRbcG9zKytdID0gKChNYnJFbnRyeSkoKGphdmEudXRpbC5NYXAuRW50cnkpaS5uZXh0KCkpLmdldFZhbHVlKCkpLmdldE1lbWJlcigpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgTWJyRW50cnlbXSBnZXRNZW1iZXJFbnRyaWVzKCkKKyAgICB7CisgICAgICAgIE1ickVudHJ5W10gcmVzdWx0ID0gbmV3IE1ickVudHJ5W21hcC5zaXplKCldOworICAgICAgICBqYXZhLnV0aWwuSXRlcmF0b3IgaSA9IG1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7CisgICAgICAgIGludCBwb3MgPSAwOworICAgICAgICB3aGlsZSAoIGkuaGFzTmV4dCgpICkKKyAgICAgICAgICAgIHJlc3VsdFtwb3MrK10gPSAoKE1ickVudHJ5KSgoamF2YS51dGlsLk1hcC5FbnRyeSlpLm5leHQoKSkuZ2V0VmFsdWUoKSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBJbm5lciBjbGFzcyB0aGF0IHJlcHJlc2VudHMgYSBtZW1iZXIgZW50cnkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIE1ickVudHJ5CisgICAgeworCisgICAgICAgIHByb3RlY3RlZCBNY2FzdE1lbWJlciBtYnI7CisgICAgICAgIHByb3RlY3RlZCBsb25nIGxhc3RIZWFyZEZyb207CisgICAgICAgIHB1YmxpYyBNYnJFbnRyeShNY2FzdE1lbWJlciBtYnIpIHsKKyAgICAgICAgICAgIHRoaXMubWJyID0gbWJyOworICAgICAgICB9CisgICAgICAgIC8qKgorICAgICAgICAgKiBJbmRpY2F0ZSB0aGF0IHRoaXMgbWVtYmVyIGhhcyBiZWVuIGFjY2Vzc2VkLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgYWNjZXNzZWQoKXsKKyAgICAgICAgICAgIGxhc3RIZWFyZEZyb20gPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgfQorICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJuIHRoZSBhY3R1YWwgTWNhc3RNZW1iZXIgb2JqZWN0CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgTWNhc3RNZW1iZXIgZ2V0TWVtYmVyKCkgeworICAgICAgICAgICAgcmV0dXJuIG1icjsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDaGVjayBpZiB0aGlzIGR1ZGUgaGFzIGV4cGlyZWQKKyAgICAgICAgICogQHBhcmFtIG1heHRpbWUgVGhlIHRpbWUgdGhyZXNob2xkCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNFeHBpcmVkKGxvbmcgbWF4dGltZSkgeworICAgICAgICAgICAgbG9uZyBkZWx0YSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gbGFzdEhlYXJkRnJvbTsKKyAgICAgICAgICAgIHJldHVybiBkZWx0YSA+IG1heHRpbWU7CisgICAgICAgIH0KKyAgICB9Ly9NYnJFbnRyeQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL21jYXN0L01jYXN0U2VydmljZS5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL21jYXN0L01jYXN0U2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjOThmM2YKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvbWNhc3QvTWNhc3RTZXJ2aWNlLmphdmEKQEAgLTAsMCArMSwyODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIubWNhc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuTWVtYmVyc2hpcFNlcnZpY2U7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLk1lbWJlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuTWVtYmVyc2hpcExpc3RlbmVyOworCisvKioKKyAqIEEgPGI+bWVtYmVyc2hpcDwvYj4gaW1wbGVtZW50YXRpb24gdXNpbmcgc2ltcGxlIG11bHRpY2FzdC4KKyAqIFRoaXMgaXMgdGhlIHJlcHJlc2VudGF0aW9uIG9mIGEgbXVsdGljYXN0IG1lbWJlcnNoaXAgc2VydmljZS4KKyAqIFRoaXMgY2xhc3MgaXMgcmVzcG9uc2libGUgZm9yIG1haW50YWluaW5nIGEgbGlzdCBvZiBhY3RpdmUgY2x1c3RlciBub2RlcyBpbiB0aGUgY2x1c3Rlci4KKyAqIElmIGEgbm9kZSBmYWlscyB0byBzZW5kIG91dCBhIGhlYXJ0YmVhdCwgdGhlIG5vZGUgd2lsbCBiZSBkaXNtaXNzZWQuCisgKgorICogQGF1dGhvciBGaWxpcCBIYW5paworICogQHZlcnNpb24gJFJldmlzaW9uJCwgJERhdGUkCisgKi8KKworCitwdWJsaWMgY2xhc3MgTWNhc3RTZXJ2aWNlIGltcGxlbWVudHMgTWVtYmVyc2hpcFNlcnZpY2UsTWVtYmVyc2hpcExpc3RlbmVyIHsKKworICAgIHByaXZhdGUgc3RhdGljIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZyBsb2cgPQorICAgICAgICBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5LmdldExvZyggTWNhc3RTZXJ2aWNlLmNsYXNzICk7CisgICAgLyoqCisgICAgICogVGhlIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIHByb3BlcnRpZXMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAvKioKKyAgICAgKiBBIGhhbmRsZSB0byB0aGUgYWN0dWFsIGxvdyBsZXZlbCBpbXBsZW1lbnRhdGlvbgorICAgICAqLworICAgIHByb3RlY3RlZCBNY2FzdFNlcnZpY2VJbXBsIGltcGw7CisgICAgLyoqCisgICAgICogQSBtZW1iZXJzaGlwIGxpc3RlbmVyIGRlbGVnYXRlIChzaG91bGQgYmUgdGhlIGNsdXN0ZXIgOikKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTWVtYmVyc2hpcExpc3RlbmVyIGxpc3RlbmVyOworICAgIC8qKgorICAgICAqIFRoZSBsb2NhbCBtZW1iZXIKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTWNhc3RNZW1iZXIgbG9jYWxNZW1iZXIgOworICAgIHByaXZhdGUgaW50IG1jYXN0U29UaW1lb3V0OworICAgIHByaXZhdGUgaW50IG1jYXN0VFRMOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbWVtYmVyc2hpcCBzZXJ2aWNlLgorICAgICAqLworICAgIHB1YmxpYyBNY2FzdFNlcnZpY2UoKSB7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm9wZXJ0aWVzPEJSPkFsbCBhcmUgcmVxdWlyZWQ8QlI+CisgICAgICogMS4gbWNhc3RQb3J0IC0gdGhlIHBvcnQgdG8gbGlzdGVuIHRvPEJSPgorICAgICAqIDIuIG1jYXN0QWRkcmVzcyAtIHRoZSBtY2FzdCBncm91cCBhZGRyZXNzPEJSPgorICAgICAqIDMuIGJpbmRBZGRyZXNzIC0gdGhlIGJpbmQgYWRkcmVzcyBpZiBhbnkgLSBvbmx5IG9uZSB0aGF0IGNhbiBiZSBudWxsPEJSPgorICAgICAqIDQuIG1lbWJlckRyb3BUaW1lIC0gdGhlIHRpbWUgYSBtZW1iZXIgaXMgZ29uZSBiZWZvcmUgaXQgaXMgY29uc2lkZXJlZCBnb25lLjxCUj4KKyAgICAgKiA1LiBtc2dGcmVxdWVuY3kgLSB0aGUgZnJlcXVlbmN5IG9mIHNlbmRpbmcgbWVzc2FnZXM8QlI+CisgICAgICogNi4gdGNwTGlzdGVuUG9ydCAtIHRoZSBwb3J0IHRoaXMgbWVtYmVyIGxpc3RlbnMgdG88QlI+CisgICAgICogNy4gdGNwTGlzdGVuSG9zdCAtIHRoZSBiaW5kIGFkZHJlc3Mgb2YgdGhpcyBtZW1iZXI8QlI+CisgICAgICogQGV4Y2VwdGlvbiBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGEgcHJvcGVydHkgaXMgbWlzc2luZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0aWVzKFByb3BlcnRpZXMgcHJvcGVydGllcykgeworICAgICAgICBoYXNQcm9wZXJ0eShwcm9wZXJ0aWVzLCJtY2FzdFBvcnQiKTsKKyAgICAgICAgaGFzUHJvcGVydHkocHJvcGVydGllcywibWNhc3RBZGRyZXNzIik7CisgICAgICAgIGhhc1Byb3BlcnR5KHByb3BlcnRpZXMsIm1lbWJlckRyb3BUaW1lIik7CisgICAgICAgIGhhc1Byb3BlcnR5KHByb3BlcnRpZXMsIm1zZ0ZyZXF1ZW5jeSIpOworICAgICAgICBoYXNQcm9wZXJ0eShwcm9wZXJ0aWVzLCJ0Y3BMaXN0ZW5Qb3J0Iik7CisgICAgICAgIGhhc1Byb3BlcnR5KHByb3BlcnRpZXMsInRjcExpc3Rlbkhvc3QiKTsKKyAgICAgICAgdGhpcy5wcm9wZXJ0aWVzID0gcHJvcGVydGllczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHByb3BlcnRpZXMsIHNlZSBzZXRQcm9wZXJ0aWVzCisgICAgICovCisgICAgcHVibGljIFByb3BlcnRpZXMgZ2V0UHJvcGVydGllcygpIHsKKyAgICAgICAgcmV0dXJuIHByb3BlcnRpZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBsb2NhbCBtZW1iZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgTWVtYmVyIGdldExvY2FsTWVtYmVyKCkgeworICAgICAgICBsb2NhbE1lbWJlci5zZXRNZW1iZXJBbGl2ZVRpbWUoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCktaW1wbC5nZXRTZXJ2aWNlU3RhcnRUaW1lKCkpOworICAgICAgICByZXR1cm4gbG9jYWxNZW1iZXI7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldHMgdGhlIGxvY2FsIG1lbWJlciBwcm9wZXJ0aWVzIGZvciBicm9hZGNhc3RpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMb2NhbE1lbWJlclByb3BlcnRpZXMoU3RyaW5nIGxpc3Rlbkhvc3QsIGludCBsaXN0ZW5Qb3J0KSB7CisgICAgICAgIHByb3BlcnRpZXMuc2V0UHJvcGVydHkoInRjcExpc3Rlbkhvc3QiLGxpc3Rlbkhvc3QpOworICAgICAgICBwcm9wZXJ0aWVzLnNldFByb3BlcnR5KCJ0Y3BMaXN0ZW5Qb3J0IixTdHJpbmcudmFsdWVPZihsaXN0ZW5Qb3J0KSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNldE1jYXN0QWRkcihTdHJpbmcgYWRkcikgeworICAgICAgICBwcm9wZXJ0aWVzLnNldFByb3BlcnR5KCJtY2FzdEFkZHJlc3MiLCBhZGRyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRNY2FzdEJpbmRBZGRyZXNzKFN0cmluZyBiaW5kYWRkcikgeworICAgICAgICBwcm9wZXJ0aWVzLnNldFByb3BlcnR5KCJtY2FzdEJpbmRBZGRyZXNzIiwgYmluZGFkZHIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1jYXN0UG9ydChpbnQgcG9ydCkgeworICAgICAgICBwcm9wZXJ0aWVzLnNldFByb3BlcnR5KCJtY2FzdFBvcnQiLCBTdHJpbmcudmFsdWVPZihwb3J0KSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TWNhc3RGcmVxdWVuY3kobG9uZyB0aW1lKSB7CisgICAgICAgIHByb3BlcnRpZXMuc2V0UHJvcGVydHkoIm1zZ0ZyZXF1ZW5jeSIsIFN0cmluZy52YWx1ZU9mKHRpbWUpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRNY2FzdERyb3BUaW1lKGxvbmcgdGltZSkgeworICAgICAgICBwcm9wZXJ0aWVzLnNldFByb3BlcnR5KCJtZW1iZXJEcm9wVGltZSIsIFN0cmluZy52YWx1ZU9mKHRpbWUpKTsKKyAgICB9CisKKworCisKKyAgICAvKioKKyAgICAgKiBDaGVjayBpZiBhIHJlcXVpcmVkIHByb3BlcnR5IGlzIGF2YWlsYWJsZS4KKyAgICAgKiBAcGFyYW0gcHJvcGVydGllcyBUaGUgc2V0IG9mIHByb3BlcnRpZXMKKyAgICAgKiBAcGFyYW0gbmFtZSBUaGUgcHJvcGVydHkgdG8gY2hlY2sgZm9yCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgaGFzUHJvcGVydHkoUHJvcGVydGllcyBwcm9wZXJ0aWVzLCBTdHJpbmcgbmFtZSl7CisgICAgICAgIGlmICggcHJvcGVydGllcy5nZXRQcm9wZXJ0eShuYW1lKT09bnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVxdWlyZWQgcHJvcGVydHkgXCIiK25hbWUrIlwiIGlzIG1pc3NpbmcuIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnQgYnJvYWRjYXN0aW5nIGFuZCBsaXN0ZW5pbmcgdG8gbWVtYmVyc2hpcCBwaW5ncworICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiBpZiBhIElPIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24geworICAgICAgICBzdGFydCgxKTsKKyAgICAgICAgc3RhcnQoMik7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHN0YXJ0KGludCBsZXZlbCkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24geworICAgICAgICBpZiAoIGltcGwgIT0gbnVsbCApIHsKKyAgICAgICAgICAgIGltcGwuc3RhcnQobGV2ZWwpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBob3N0ID0gZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnR5KCJ0Y3BMaXN0ZW5Ib3N0Iik7CisgICAgICAgIGludCBwb3J0ID0gSW50ZWdlci5wYXJzZUludChnZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydHkoInRjcExpc3RlblBvcnQiKSk7CisgICAgICAgIFN0cmluZyBuYW1lID0gInRjcDovLyIraG9zdCsiOiIrcG9ydDsKKyAgICAgICAgaWYgKCBsb2NhbE1lbWJlciA9PSBudWxsICkgeworICAgICAgICAgICAgbG9jYWxNZW1iZXIgPSBuZXcgTWNhc3RNZW1iZXIobmFtZSwgaG9zdCwgcG9ydCwgMTAwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxvY2FsTWVtYmVyLnNldE5hbWUobmFtZSk7CisgICAgICAgICAgICBsb2NhbE1lbWJlci5zZXRIb3N0KGhvc3QpOworICAgICAgICAgICAgbG9jYWxNZW1iZXIuc2V0UG9ydChwb3J0KTsKKyAgICAgICAgICAgIGxvY2FsTWVtYmVyLnNldE1lbWJlckFsaXZlVGltZSgxMDApOworICAgICAgICB9CisgICAgICAgIGphdmEubmV0LkluZXRBZGRyZXNzIGJpbmQgPSBudWxsOworICAgICAgICBpZiAoIHByb3BlcnRpZXMuZ2V0UHJvcGVydHkoIm1jYXN0QmluZEFkZHJlc3MiKSE9IG51bGwgKSB7CisgICAgICAgICAgICBiaW5kID0gamF2YS5uZXQuSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKHByb3BlcnRpZXMuZ2V0UHJvcGVydHkoIm1jYXN0QmluZEFkZHJlc3MiKSk7CisgICAgICAgIH0KKyAgICAgICAgaW50IHR0bCA9IC0xOworICAgICAgICBpbnQgc29UaW1lb3V0ID0gLTE7CisgICAgICAgIGlmICggcHJvcGVydGllcy5nZXRQcm9wZXJ0eSgibWNhc3RUVEwiKSAhPSBudWxsICkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB0dGwgPSBJbnRlZ2VyLnBhcnNlSW50KHByb3BlcnRpZXMuZ2V0UHJvcGVydHkoIm1jYXN0VFRMIikpOworICAgICAgICAgICAgfSBjYXRjaCAoIEV4Y2VwdGlvbiB4ICkgeworICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiVW5hYmxlIHRvIHBhcnNlIG1jYXN0VFRMPSIrcHJvcGVydGllcy5nZXRQcm9wZXJ0eSgibWNhc3RUVEwiKSx4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIHByb3BlcnRpZXMuZ2V0UHJvcGVydHkoIm1jYXN0U29UaW1lb3V0IikgIT0gbnVsbCApIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc29UaW1lb3V0ID0gSW50ZWdlci5wYXJzZUludChwcm9wZXJ0aWVzLmdldFByb3BlcnR5KCJtY2FzdFNvVGltZW91dCIpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKCBFeGNlcHRpb24geCApIHsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIlVuYWJsZSB0byBwYXJzZSBtY2FzdFNvVGltZW91dD0iK3Byb3BlcnRpZXMuZ2V0UHJvcGVydHkoIm1jYXN0U29UaW1lb3V0IikseCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpbXBsID0gbmV3IE1jYXN0U2VydmljZUltcGwoKE1jYXN0TWVtYmVyKWxvY2FsTWVtYmVyLExvbmcucGFyc2VMb25nKHByb3BlcnRpZXMuZ2V0UHJvcGVydHkoIm1zZ0ZyZXF1ZW5jeSIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvbmcucGFyc2VMb25nKHByb3BlcnRpZXMuZ2V0UHJvcGVydHkoIm1lbWJlckRyb3BUaW1lIikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlci5wYXJzZUludChwcm9wZXJ0aWVzLmdldFByb3BlcnR5KCJtY2FzdFBvcnQiKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5uZXQuSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKHByb3BlcnRpZXMuZ2V0UHJvcGVydHkoIm1jYXN0QWRkcmVzcyIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR0bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvVGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMpOworCisgICAgICAgIGltcGwuc3RhcnQobGV2ZWwpOworICAgICAgICBsb2cuaW5mbygiU2xlZXBpbmcgZm9yICIrKExvbmcucGFyc2VMb25nKHByb3BlcnRpZXMuZ2V0UHJvcGVydHkoIm1zZ0ZyZXF1ZW5jeSIpKSo0KSsiIHNlY3MgdG8gZXN0YWJsaXNoIGNsdXN0ZXIgbWVtYmVyc2hpcCIpOworICAgICAgICBUaHJlYWQuc2xlZXAoKExvbmcucGFyc2VMb25nKHByb3BlcnRpZXMuZ2V0UHJvcGVydHkoIm1zZ0ZyZXF1ZW5jeSIpKSo0KSk7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdG9wIGJyb2FkY2FzdGluZyBhbmQgbGlzdGVuaW5nIHRvIG1lbWJlcnNoaXAgcGluZ3MKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdG9wKCkgeworICAgICAgICB0cnkgIHsKKyAgICAgICAgICAgIGlmICggaW1wbCAhPSBudWxsKSBpbXBsLnN0b3AoKTsKKyAgICAgICAgfSBjYXRjaCAoIEV4Y2VwdGlvbiB4KSAgeworICAgICAgICAgICAgbG9nLmVycm9yKCJVbmFibGUgdG8gc3RvcCB0aGUgbWNhc3Qgc2VydmljZS4iLHgpOworICAgICAgICB9CisgICAgICAgIGltcGwgPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhbGwgdGhlIG1lbWJlcnMKKyAgICAgKi8KKyAgICBwdWJsaWMgTWVtYmVyW10gZ2V0TWVtYmVycygpIHsKKyAgICAgICAgaWYgKCBpbXBsID09IG51bGwgfHwgaW1wbC5tZW1iZXJzaGlwID09IG51bGwgKSByZXR1cm4gbnVsbDsKKyAgICAgICAgcmV0dXJuIGltcGwubWVtYmVyc2hpcC5nZXRNZW1iZXJzKCk7CisgICAgfQorICAgIC8qKgorICAgICAqIEFkZCBhIG1lbWJlcnNoaXAgbGlzdGVuZXIsIHRoaXMgdmVyc2lvbiBvbmx5IHN1cHBvcnRzIG9uZSBsaXN0ZW5lciBwZXIgc2VydmljZSwKKyAgICAgKiBzbyBjYWxsaW5nIHRoaXMgbWV0aG9kIHR3aWNlIHdpbGwgcmVzdWx0IGluIG9ubHkgdGhlIHNlY29uZCBsaXN0ZW5lciBiZWluZyBhY3RpdmUuCisgICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZE1lbWJlcnNoaXBMaXN0ZW5lcihNZW1iZXJzaGlwTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgdGhpcy5saXN0ZW5lciA9IGxpc3RlbmVyOworICAgIH0KKyAgICAvKioKKyAgICAgKiBSZW1vdmUgdGhlIG1lbWJlcnNoaXAgbGlzdGVuZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVNZW1iZXJzaGlwTGlzdGVuZXIoKXsKKyAgICAgICAgbGlzdGVuZXIgPSBudWxsOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG1lbWJlckFkZGVkKE1lbWJlciBtZW1iZXIpIHsKKyAgICAgICAgaWYgKCBsaXN0ZW5lciE9bnVsbCApIGxpc3RlbmVyLm1lbWJlckFkZGVkKG1lbWJlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGJhY2sgZnJvbSB0aGUgaW1wbCB3aGVuIGEgbmV3IG1lbWJlciBoYXMgYmVlbiByZWNlaXZlZAorICAgICAqIEBwYXJhbSBtZW1iZXIgVGhlIG1lbWJlcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG1lbWJlckRpc2FwcGVhcmVkKE1lbWJlciBtZW1iZXIpCisgICAgeworICAgICAgICBpZiAoIGxpc3RlbmVyIT1udWxsICkgbGlzdGVuZXIubWVtYmVyRGlzYXBwZWFyZWQobWVtYmVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTaW1wbGUgdGVzdCBwcm9ncmFtCisgICAgICogQHBhcmFtIGFyZ3MgQ29tbWFuZC1saW5lIGFyZ3VtZW50cworICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIElmIGFuIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBsb2cuaW5mbygiVXNhZ2UgTWNhc3RTZXJ2aWNlIGhvc3RuYW1lIHRjcHBvcnQiKTsKKyAgICAgICAgTWNhc3RTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgTWNhc3RTZXJ2aWNlKCk7CisgICAgICAgIGphdmEudXRpbC5Qcm9wZXJ0aWVzIHAgPSBuZXcgamF2YS51dGlsLlByb3BlcnRpZXMoKTsKKyAgICAgICAgcC5zZXRQcm9wZXJ0eSgibWNhc3RQb3J0IiwiNTU1NSIpOworICAgICAgICBwLnNldFByb3BlcnR5KCJtY2FzdEFkZHJlc3MiLCIyMjQuMTAuMTAuMTAiKTsKKyAgICAgICAgcC5zZXRQcm9wZXJ0eSgiYmluZEFkZHJlc3MiLCJsb2NhbGhvc3QiKTsKKyAgICAgICAgcC5zZXRQcm9wZXJ0eSgibWVtYmVyRHJvcFRpbWUiLCIzMDAwIik7CisgICAgICAgIHAuc2V0UHJvcGVydHkoIm1zZ0ZyZXF1ZW5jeSIsIjUwMCIpOworICAgICAgICBwLnNldFByb3BlcnR5KCJ0Y3BMaXN0ZW5Qb3J0IixhcmdzWzFdKTsKKyAgICAgICAgcC5zZXRQcm9wZXJ0eSgidGNwTGlzdGVuSG9zdCIsYXJnc1swXSk7CisgICAgICAgIHNlcnZpY2Uuc2V0UHJvcGVydGllcyhwKTsKKyAgICAgICAgc2VydmljZS5zdGFydCgpOworICAgICAgICBUaHJlYWQuc2xlZXAoNjAqMTAwMCo2MCk7CisgICAgfQorICAgIHB1YmxpYyBpbnQgZ2V0TWNhc3RTb1RpbWVvdXQoKSB7CisgICAgICAgIHJldHVybiBtY2FzdFNvVGltZW91dDsKKyAgICB9CisgICAgcHVibGljIHZvaWQgc2V0TWNhc3RTb1RpbWVvdXQoaW50IG1jYXN0U29UaW1lb3V0KSB7CisgICAgICAgIHRoaXMubWNhc3RTb1RpbWVvdXQgPSBtY2FzdFNvVGltZW91dDsKKyAgICAgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eSgibWNhc3RTb1RpbWVvdXQiLCBTdHJpbmcudmFsdWVPZihtY2FzdFNvVGltZW91dCkpOworICAgIH0KKyAgICBwdWJsaWMgaW50IGdldE1jYXN0VFRMKCkgeworICAgICAgICByZXR1cm4gbWNhc3RUVEw7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHNldE1jYXN0VFRMKGludCBtY2FzdFRUTCkgeworICAgICAgICB0aGlzLm1jYXN0VFRMID0gbWNhc3RUVEw7CisgICAgICAgIHByb3BlcnRpZXMuc2V0UHJvcGVydHkoIm1jYXN0VFRMIiwgU3RyaW5nLnZhbHVlT2YobWNhc3RUVEwpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvbWNhc3QvTWNhc3RTZXJ2aWNlSW1wbC5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL21jYXN0L01jYXN0U2VydmljZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTI3NTVlCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL21jYXN0L01jYXN0U2VydmljZUltcGwuamF2YQpAQCAtMCwwICsxLDI2NyBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5tY2FzdDsKKworLyoqCisgKiBBIDxiPm1lbWJlcnNoaXA8L2I+IGltcGxlbWVudGF0aW9uIHVzaW5nIHNpbXBsZSBtdWx0aWNhc3QuCisgKiBUaGlzIGlzIHRoZSByZXByZXNlbnRhdGlvbiBvZiBhIG11bHRpY2FzdCBtZW1iZXJzaGlwIHNlcnZpY2UuCisgKiBUaGlzIGNsYXNzIGlzIHJlc3BvbnNpYmxlIGZvciBtYWludGFpbmluZyBhIGxpc3Qgb2YgYWN0aXZlIGNsdXN0ZXIgbm9kZXMgaW4gdGhlIGNsdXN0ZXIuCisgKiBJZiBhIG5vZGUgZmFpbHMgdG8gc2VuZCBvdXQgYSBoZWFydGJlYXQsIHRoZSBub2RlIHdpbGwgYmUgZGlzbWlzc2VkLgorICogVGhpcyBpcyB0aGUgbG93IGxldmVsIGltcGxlbWVudGF0aW9uIHRoYXQgaGFuZGxlcyB0aGUgbXVsdGljYXN0aW5nIHNvY2tldHMuCisgKiBOZWVkIHRvIGZpeCB0aGlzLCBjb3VsZCB1c2UgamF2YS5uaW8gYW5kIG9ubHkgbmVlZCBvbmUgdGhyZWFkIHRvIHNlbmQgYW5kIHJlY2VpdmUsIG9yCisgKiBqdXN0IHVzZSBhIHRpbWVvdXQgb24gdGhlIHJlY2VpdmUKKyAqIEBhdXRob3IgRmlsaXAgSGFuaWsKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQsICREYXRlJAorICovCisKK2ltcG9ydCBqYXZhLm5ldC5NdWx0aWNhc3RTb2NrZXQ7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzcyA7CitpbXBvcnQgamF2YS5uZXQuRGF0YWdyYW1QYWNrZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLk1lbWJlcnNoaXBMaXN0ZW5lcjsKK3B1YmxpYyBjbGFzcyBNY2FzdFNlcnZpY2VJbXBsCit7CisgICAgcHJpdmF0ZSBzdGF0aWMgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGxvZyA9CisgICAgICAgIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3RvcnkuZ2V0TG9nKCBNY2FzdFNlcnZpY2UuY2xhc3MgKTsKKyAgICAvKioKKyAgICAgKiBJbnRlcm5hbCBmbGFnIHVzZWQgZm9yIHRoZSBsaXN0ZW4gdGhyZWFkIHRoYXQgbGlzdGVucyB0byB0aGUgbXVsdGljYXN0aW5nIHNvY2tldC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBkb1J1biA9IGZhbHNlOworICAgIC8qKgorICAgICAqIFNvY2tldCB0aGF0IHdlIGludGVuZCB0byBsaXN0ZW4gdG8KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTXVsdGljYXN0U29ja2V0IHNvY2tldDsKKyAgICAvKioKKyAgICAgKiBUaGUgbG9jYWwgbWVtYmVyIHRoYXQgd2UgaW50ZW5kIHRvIGJyb2FkIGNhc3Qgb3ZlciBhbmQgb3ZlciBhZ2FpbgorICAgICAqLworICAgIHByb3RlY3RlZCBNY2FzdE1lbWJlciBtZW1iZXI7CisgICAgLyoqCisgICAgICogVGhlIG11bHRpY2FzdCBhZGRyZXNzCisgICAgICovCisgICAgcHJvdGVjdGVkIEluZXRBZGRyZXNzIGFkZHJlc3M7CisgICAgLyoqCisgICAgICogVGhlIG11bHRpY2FzdCBwb3J0CisgICAgICovCisgICAgcHJvdGVjdGVkIGludCBwb3J0OworICAgIC8qKgorICAgICAqIFRoZSB0aW1lIGl0IHRha2VzIGZvciBhIG1lbWJlciB0byBleHBpcmUuCisgICAgICovCisgICAgcHJvdGVjdGVkIGxvbmcgdGltZVRvRXhwaXJhdGlvbjsKKyAgICAvKioKKyAgICAgKiBIb3cgb2Z0ZW4gdG8gd2Ugc2VuZCBvdXQgYSBicm9hZGNhc3Qgc2F5aW5nIHdlIGFyZSBhbGl2ZSwgbXVzdCBiZSBzbWFsbGVyIHRoYW4gdGltZVRvRXhwaXJhdGlvbgorICAgICAqLworICAgIHByb3RlY3RlZCBsb25nIHNlbmRGcmVxdWVuY3k7CisgICAgLyoqCisgICAgICogUmV1c2UgdGhlIHNlbmRQYWNrZXQsIG5vIG5lZWQgdG8gY3JlYXRlIGEgbmV3IG9uZSBldmVyeXRpbWUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRGF0YWdyYW1QYWNrZXQgc2VuZFBhY2tldDsKKyAgICAvKioKKyAgICAgKiBSZXVzZSB0aGUgcmVjZWl2ZVBhY2tldCwgbm8gbmVlZCB0byBjcmVhdGUgYSBuZXcgb25lIGV2ZXJ5dGltZQorICAgICAqLworICAgIHByb3RlY3RlZCBEYXRhZ3JhbVBhY2tldCByZWNlaXZlUGFja2V0OworICAgIC8qKgorICAgICAqIFRoZSBtZW1iZXJzaGlwLCB1c2VkIHNvIHRoYXQgd2UgY2FsY3VsYXRlIG1lbWJlcnNoaXBzIHdoZW4gdGhleSBhcnJpdmUgb3IgZG9uJ3QgYXJyaXZlCisgICAgICovCisgICAgcHJvdGVjdGVkIE1jYXN0TWVtYmVyc2hpcCBtZW1iZXJzaGlwOworICAgIC8qKgorICAgICAqIFRoZSBhY3R1YWwgbGlzdGVuZXIsIGZvciBjYWxsYmFjayB3aGVuIHNoaXRzIGdvZXMgZG93bgorICAgICAqLworICAgIHByb3RlY3RlZCBNZW1iZXJzaGlwTGlzdGVuZXIgc2VydmljZTsKKyAgICAvKioKKyAgICAgKiBUaHJlYWQgdG8gbGlzdGVuIGZvciBwaW5ncworICAgICAqLworICAgIHByb3RlY3RlZCBSZWNlaXZlclRocmVhZCByZWNlaXZlcjsKKyAgICAvKioKKyAgICAgKiBUaHJlYWQgdG8gc2VuZCBwaW5ncworICAgICAqLworICAgIHByb3RlY3RlZCBTZW5kZXJUaHJlYWQgc2VuZGVyOworCisgICAgLyoqCisgICAgICogV2hlbiB3YXMgdGhlIHNlcnZpY2Ugc3RhcnRlZAorICAgICAqLworICAgIHByb3RlY3RlZCBsb25nIHNlcnZpY2VTdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAKKyAgICBwcm90ZWN0ZWQgaW50IG1jYXN0VFRMID0gLTE7CisgICAgcHJvdGVjdGVkIGludCBtY2FzdFNvVGltZW91dCA9IC0xOworICAgIHByb3RlY3RlZCBJbmV0QWRkcmVzcyBtY2FzdEJpbmRBZGRyZXNzID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBtY2FzdCBzZXJ2aWNlIGltcGwKKyAgICAgKiBAcGFyYW0gbWVtYmVyIC0gdGhlIGxvY2FsIG1lbWJlcgorICAgICAqIEBwYXJhbSBzZW5kRnJlcXVlbmN5IC0gdGhlIHRpbWUgKG1zKSBpbiBiZXR3ZWVuIHBpbmdzIHNlbnQgb3V0CisgICAgICogQHBhcmFtIGV4cGlyZVRpbWUgLSB0aGUgdGltZSAobXMpIGZvciBhIG1lbWJlciB0byBleHBpcmUKKyAgICAgKiBAcGFyYW0gcG9ydCAtIHRoZSBtY2FzdCBwb3J0CisgICAgICogQHBhcmFtIGJpbmQgLSB0aGUgYmluZCBhZGRyZXNzIChub3Qgc3VyZSB0aGlzIGlzIHVzZWQgeWV0KQorICAgICAqIEBwYXJhbSBtY2FzdEFkZHJlc3MgLSB0aGUgbWNhc3QgYWRkcmVzcworICAgICAqIEBwYXJhbSBzZXJ2aWNlIC0gdGhlIGNhbGxiYWNrIHNlcnZpY2UKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIE1jYXN0U2VydmljZUltcGwoCisgICAgICAgIE1jYXN0TWVtYmVyIG1lbWJlciwKKyAgICAgICAgbG9uZyBzZW5kRnJlcXVlbmN5LAorICAgICAgICBsb25nIGV4cGlyZVRpbWUsCisgICAgICAgIGludCBwb3J0LAorICAgICAgICBJbmV0QWRkcmVzcyBiaW5kLAorICAgICAgICBJbmV0QWRkcmVzcyBtY2FzdEFkZHJlc3MsCisgICAgICAgIGludCB0dGwsCisgICAgICAgIGludCBzb1RpbWVvdXQsCisgICAgICAgIE1lbWJlcnNoaXBMaXN0ZW5lciBzZXJ2aWNlKQorICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMubWVtYmVyID0gbWVtYmVyOworICAgICAgICBhZGRyZXNzID0gbWNhc3RBZGRyZXNzOworICAgICAgICB0aGlzLnBvcnQgPSBwb3J0OworICAgICAgICB0aGlzLm1jYXN0U29UaW1lb3V0ID0gc29UaW1lb3V0OworICAgICAgICB0aGlzLm1jYXN0VFRMID0gdHRsOworICAgICAgICB0aGlzLm1jYXN0QmluZEFkZHJlc3MgPSBiaW5kOworICAgICAgICBzZXR1cFNvY2tldCgpOworICAgICAgICBzZW5kUGFja2V0ID0gbmV3IERhdGFncmFtUGFja2V0KG5ldyBieXRlWzEwMDBdLDEwMDApOworICAgICAgICBzZW5kUGFja2V0LnNldEFkZHJlc3MoYWRkcmVzcyk7CisgICAgICAgIHNlbmRQYWNrZXQuc2V0UG9ydChwb3J0KTsKKyAgICAgICAgcmVjZWl2ZVBhY2tldCA9IG5ldyBEYXRhZ3JhbVBhY2tldChuZXcgYnl0ZVsxMDAwXSwxMDAwKTsKKyAgICAgICAgcmVjZWl2ZVBhY2tldC5zZXRBZGRyZXNzKGFkZHJlc3MpOworICAgICAgICByZWNlaXZlUGFja2V0LnNldFBvcnQocG9ydCk7CisgICAgICAgIG1lbWJlcnNoaXAgPSBuZXcgTWNhc3RNZW1iZXJzaGlwKG1lbWJlci5nZXROYW1lKCkpOworICAgICAgICB0aW1lVG9FeHBpcmF0aW9uID0gZXhwaXJlVGltZTsKKyAgICAgICAgdGhpcy5zZXJ2aWNlID0gc2VydmljZTsKKyAgICAgICAgdGhpcy5zZW5kRnJlcXVlbmN5ID0gc2VuZEZyZXF1ZW5jeTsKKyAgICB9CisgICAgCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0dXBTb2NrZXQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAobWNhc3RCaW5kQWRkcmVzcyAhPSBudWxsKSBzb2NrZXQgPSBuZXcgTXVsdGljYXN0U29ja2V0KG5ldyBqYXZhLm5ldC4KKyAgICAgICAgICAgIEluZXRTb2NrZXRBZGRyZXNzKG1jYXN0QmluZEFkZHJlc3MsIHBvcnQpKTsKKyAgICAgICAgZWxzZSBzb2NrZXQgPSBuZXcgTXVsdGljYXN0U29ja2V0KHBvcnQpOworICAgICAgICBpZiAobWNhc3RCaW5kQWRkcmVzcyAhPSBudWxsKSB7CisgICAgICAgICAgICBsb2cuaW5mbygiU2V0dGluZyBtdWx0aWhvbWUgbXVsdGljYXN0IGludGVyZmFjZSB0bzoiICsKKyAgICAgICAgICAgICAgICAgICAgIG1jYXN0QmluZEFkZHJlc3MpOworICAgICAgICAgICAgc29ja2V0LnNldEludGVyZmFjZShtY2FzdEJpbmRBZGRyZXNzKTsKKyAgICAgICAgfSAvL2VuZCBpZgorICAgICAgICBpZiAoIG1jYXN0U29UaW1lb3V0ID49IDAgKSB7CisgICAgICAgICAgICBsb2cuaW5mbygiU2V0dGluZyBjbHVzdGVyIG1jYXN0IHNvVGltZW91dCB0byAiK21jYXN0U29UaW1lb3V0KTsKKyAgICAgICAgICAgIHNvY2tldC5zZXRTb1RpbWVvdXQobWNhc3RTb1RpbWVvdXQpOworICAgICAgICB9CisgICAgICAgIGlmICggbWNhc3RUVEwgPj0gMCApIHsKKyAgICAgICAgICAgIGxvZy5pbmZvKCJTZXR0aW5nIGNsdXN0ZXIgbWNhc3QgVFRMIHRvICIgKyBtY2FzdFRUTCk7CisgICAgICAgICAgICBzb2NrZXQuc2V0VGltZVRvTGl2ZShtY2FzdFRUTCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdGFydCB0aGUgc2VydmljZQorICAgICAqIEBwYXJhbSBsZXZlbCAxIHN0YXJ0cyB0aGUgcmVjZWl2ZXIsIGxldmVsIDIgc3RhcnRzIHRoZSBzZW5kZXIKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZSBzZXJ2aWNlIGZhaWxzIHRvIHN0YXJ0CisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlIHNlcnZpY2UgaXMgYWxyZWFkeSBzdGFydGVkCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHN0YXJ0KGludCBsZXZlbCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCBzZW5kZXIgIT0gbnVsbCAmJiByZWNlaXZlciAhPSBudWxsICkgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiU2VydmljZSBhbHJlYWR5IHJ1bm5pbmcuIik7CisgICAgICAgIGlmICggbGV2ZWwgPT0gMSApIHsKKyAgICAgICAgICAgIHNvY2tldC5qb2luR3JvdXAoYWRkcmVzcyk7CisgICAgICAgICAgICBkb1J1biA9IHRydWU7CisgICAgICAgICAgICByZWNlaXZlciA9IG5ldyBSZWNlaXZlclRocmVhZCgpOworICAgICAgICAgICAgcmVjZWl2ZXIuc2V0RGFlbW9uKHRydWUpOworICAgICAgICAgICAgcmVjZWl2ZXIuc3RhcnQoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIGxldmVsPT0yICkgeworICAgICAgICAgICAgc2VydmljZVN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICAgICAgc2VuZGVyID0gbmV3IFNlbmRlclRocmVhZChzZW5kRnJlcXVlbmN5KTsKKyAgICAgICAgICAgIHNlbmRlci5zZXREYWVtb24odHJ1ZSk7CisgICAgICAgICAgICBzZW5kZXIuc3RhcnQoKTsKKyAgICAgICAgICAgIAorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RvcHMgdGhlIHNlcnZpY2UKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZSBzZXJ2aWNlIGZhaWxzIHRvIGRpc2Nvbm5lY3QgZnJvbSB0aGUgc29ja2V0cworICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdG9wKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgc29ja2V0LmxlYXZlR3JvdXAoYWRkcmVzcyk7CisgICAgICAgIGRvUnVuID0gZmFsc2U7CisgICAgICAgIHNlbmRlciA9IG51bGw7CisgICAgICAgIHJlY2VpdmVyID0gbnVsbDsKKyAgICAgICAgc2VydmljZVN0YXJ0VGltZSA9IExvbmcuTUFYX1ZBTFVFOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlY2VpdmUgYSBkYXRhZ3JhbSBwYWNrZXQsIGxvY2tpbmcgd2FpdAorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWNlaXZlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgc29ja2V0LnJlY2VpdmUocmVjZWl2ZVBhY2tldCk7CisgICAgICAgIGJ5dGVbXSBkYXRhID0gbmV3IGJ5dGVbcmVjZWl2ZVBhY2tldC5nZXRMZW5ndGgoKV07CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkocmVjZWl2ZVBhY2tldC5nZXREYXRhKCkscmVjZWl2ZVBhY2tldC5nZXRPZmZzZXQoKSxkYXRhLDAsZGF0YS5sZW5ndGgpOworICAgICAgICBNY2FzdE1lbWJlciBtID0gTWNhc3RNZW1iZXIuZ2V0TWVtYmVyKGRhdGEpOworICAgICAgICBpZiAoIG1lbWJlcnNoaXAubWVtYmVyQWxpdmUobSkgKSB7CisgICAgICAgICAgICBzZXJ2aWNlLm1lbWJlckFkZGVkKG0pOworICAgICAgICB9CisgICAgICAgIE1jYXN0TWVtYmVyW10gZXhwaXJlZCA9IG1lbWJlcnNoaXAuZXhwaXJlKHRpbWVUb0V4cGlyYXRpb24pOworICAgICAgICBmb3IgKCBpbnQgaT0wOyBpPGV4cGlyZWQubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBzZXJ2aWNlLm1lbWJlckRpc2FwcGVhcmVkKGV4cGlyZWRbaV0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbmQgYSBwaW5nCisgICAgICogQHRocm93cyBFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZW5kKCkgdGhyb3dzIEV4Y2VwdGlvbnsKKyAgICAgICAgbWVtYmVyLmluYygpOworICAgICAgICBieXRlW10gZGF0YSA9IG1lbWJlci5nZXREYXRhKHRoaXMuc2VydmljZVN0YXJ0VGltZSk7CisgICAgICAgIERhdGFncmFtUGFja2V0IHAgPSBuZXcgRGF0YWdyYW1QYWNrZXQoZGF0YSxkYXRhLmxlbmd0aCk7CisgICAgICAgIHAuc2V0QWRkcmVzcyhhZGRyZXNzKTsKKyAgICAgICAgcC5zZXRQb3J0KHBvcnQpOworICAgICAgICBzb2NrZXQuc2VuZChwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBnZXRTZXJ2aWNlU3RhcnRUaW1lKCkgeworICAgICAgIHJldHVybiB0aGlzLnNlcnZpY2VTdGFydFRpbWU7CisgICAgfQorCisKKyAgICBwdWJsaWMgY2xhc3MgUmVjZWl2ZXJUaHJlYWQgZXh0ZW5kcyBUaHJlYWQgeworICAgICAgICBwdWJsaWMgUmVjZWl2ZXJUaHJlYWQoKSB7CisgICAgICAgICAgICBzdXBlcigpOworICAgICAgICAgICAgc2V0TmFtZSgiQ2x1c3Rlci1NZW1iZXJzaGlwUmVjZWl2ZXIiKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICB3aGlsZSAoIGRvUnVuICkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHJlY2VpdmUoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoICggRXhjZXB0aW9uIHggKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKCJFcnJvciByZWNlaXZpbmcgbWNhc3QgcGFja2FnZS4iLHgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0vL2NsYXNzIFJlY2VpdmVyVGhyZWFkCisKKyAgICBwdWJsaWMgY2xhc3MgU2VuZGVyVGhyZWFkIGV4dGVuZHMgVGhyZWFkIHsKKyAgICAgICAgbG9uZyB0aW1lOworICAgICAgICBwdWJsaWMgU2VuZGVyVGhyZWFkKGxvbmcgdGltZSkgeworICAgICAgICAgICAgdGhpcy50aW1lID0gdGltZTsKKyAgICAgICAgICAgIHNldE5hbWUoIkNsdXN0ZXItTWVtYmVyc2hpcFNlbmRlciIpOworCisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgd2hpbGUgKCBkb1J1biApIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBzZW5kKCk7CisgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCh0aW1lKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoICggRXhjZXB0aW9uIHggKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKCJVbmFibGUgdG8gc2VuZCBtY2FzdCBtZXNzYWdlLiIseCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfS8vY2xhc3MgU2VuZGVyVGhyZWFkCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvcGFja2FnZS5odG1sIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3BhY2thZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTgzYTBkCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDExIEBACis8Ym9keT4KKworPHA+VGhpcyBwYWNrYWdlIGNvbnRhaW5zIGNvZGUgZm9yIENsdXN0ZXJpbmcsIHRoZSBiYXNlIGNsYXNzCitvZiBhIENsdXN0ZXIgaXMgPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5DbHVzdGVyPC9jb2RlPiBpbXBsZW1lbnRhdGlvbnMKK29mIHRoaXMgY2xhc3MgaXMgZG9uZSB3aGVuIGltcGxlbWVudGluZyBhIG5ldyBDbHVzdGVyIHByb3RvY29sPC9wPgorCis8cD5UaGUgb25seSBDbHVzdGVyIHByb3RvY29sIGN1cnJlbnRseSBpbXBsZW1lbnRlZCBpcyBhIEphdmFHcm91cHMgYmFzZWQ8YnI+CismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8Yj5KR0NsdXN0ZXIuamF2YTwvYj4KKzwvcD4KKworPC9ib2R5PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3Nlc3Npb24vRGVsdGFNYW5hZ2VyLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvc2Vzc2lvbi9EZWx0YU1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDNmOTg5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3Nlc3Npb24vRGVsdGFNYW5hZ2VyLmphdmEKQEAgLTAsMCArMSwxMDAwIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuc2Vzc2lvbjsKKworaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VFdmVudDsKK2ltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7CitpbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Db250YWluZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Db250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Mb2FkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5TZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5DdXN0b21PYmplY3RJbnB1dFN0cmVhbTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuTGlmZWN5Y2xlU3VwcG9ydDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuc2Vzc2lvbi5NYW5hZ2VyQmFzZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuQ2x1c3Rlck1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLkNsdXN0ZXJNZXNzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5NZW1iZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLkNhdGFsaW5hQ2x1c3RlcjsKKworCisvKioKKyAqIFRoZSBEZWx0YU1hbmFnZXIgbWFuYWdlcyByZXBsaWNhdGVkIHNlc3Npb25zIGJ5IG9ubHkKKyAqIHJlcGxpY2F0aW5nIHRoZSBkZWx0YXMgaW4gZGF0YS4gRm9yIGFwcGxpY2F0aW9ucyB3cml0dGVuCisgKiB0byBoYW5kbGUgdGhpcywgdGhlIERlbHRhTWFuYWdlciBpcyB0aGUgb3B0aW1hbCB3YXkgb2YgcmVwbGljYXRpbmcgZGF0YS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgYWxtb3N0IGlkZW50aWNhbCB0byBTdGFuZGFyZE1hbmFnZXIgd2l0aCBhIGRpZmZlcmVuY2UgaW4KKyAqIGhvdyBpdCBwZXJzaXN0cyBzZXNzaW9ucyBhbmQgc29tZSBtb2RpZmljYXRpb25zIHRvIGl0LgorICoKKyAqIDxiPklNUExFTUVOVEFUSU9OIE5PVEU8L2I+OiAgQ29ycmVjdCBiZWhhdmlvciBvZiBzZXNzaW9uIHN0b3JpbmcgYW5kCisgKiByZWxvYWRpbmcgZGVwZW5kcyB1cG9uIGV4dGVybmFsIGNhbGxzIHRvIHRoZSA8Y29kZT5zdGFydCgpPC9jb2RlPiBhbmQKKyAqIDxjb2RlPnN0b3AoKTwvY29kZT4gbWV0aG9kcyBvZiB0aGlzIGNsYXNzIGF0IHRoZSBjb3JyZWN0IHRpbWVzLgorICoKKyAqIEBhdXRob3IgRmlsaXAgSGFuaWsKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQGF1dGhvciBKZWFuLUZyYW5jb2lzIEFyY2FuZAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgRGVsdGFNYW5hZ2VyCisgICAgZXh0ZW5kcyBNYW5hZ2VyQmFzZQorICAgIGltcGxlbWVudHMgTGlmZWN5Y2xlLCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyLCBDbHVzdGVyTWFuYWdlciB7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNlY3VyaXR5IENsYXNzZXMKKworCisgICAgcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2cgbG9nID0KKyAgICAgICAgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeS5nZXRMb2coIERlbHRhTWFuYWdlci5jbGFzcyApOworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBpbmZvID0gIkRlbHRhTWFuYWdlci8xLjAiOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgbGlmZWN5Y2xlIGV2ZW50IHN1cHBvcnQgZm9yIHRoaXMgY29tcG9uZW50LgorICAgICAqLworICAgIHByb3RlY3RlZCBMaWZlY3ljbGVTdXBwb3J0IGxpZmVjeWNsZSA9IG5ldyBMaWZlY3ljbGVTdXBwb3J0KHRoaXMpOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgYWN0aXZlIFNlc3Npb25zIGFsbG93ZWQsIG9yIC0xIGZvciBubyBsaW1pdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBtYXhBY3RpdmVTZXNzaW9ucyA9IC0xOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVzY3JpcHRpdmUgbmFtZSBvZiB0aGlzIE1hbmFnZXIgaW1wbGVtZW50YXRpb24gKGZvciBsb2dnaW5nKS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBtYW5hZ2VyTmFtZSA9ICJEZWx0YU1hbmFnZXIiOworICAgIAorICAgIHByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFBhdGggbmFtZSBvZiB0aGUgZGlzayBmaWxlIGluIHdoaWNoIGFjdGl2ZSBzZXNzaW9ucyBhcmUgc2F2ZWQKKyAgICAgKiB3aGVuIHdlIHN0b3AsIGFuZCBmcm9tIHdoaWNoIHRoZXNlIHNlc3Npb25zIGFyZSBsb2FkZWQgd2hlbiB3ZSBzdGFydC4KKyAgICAgKiBBIDxjb2RlPm51bGw8L2NvZGU+IHZhbHVlIGluZGljYXRlcyB0aGF0IG5vIHBlcnNpc3RlbmNlIGlzIGRlc2lyZWQuCisgICAgICogSWYgdGhpcyBwYXRobmFtZSBpcyByZWxhdGl2ZSwgaXQgd2lsbCBiZSByZXNvbHZlZCBhZ2FpbnN0IHRoZQorICAgICAqIHRlbXBvcmFyeSB3b3JraW5nIGRpcmVjdG9yeSBwcm92aWRlZCBieSBvdXIgY29udGV4dCwgYXZhaWxhYmxlIHZpYQorICAgICAqIHRoZSA8Y29kZT5qYXZheC5zZXJ2bGV0LmNvbnRleHQudGVtcGRpcjwvY29kZT4gY29udGV4dCBhdHRyaWJ1dGUuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcGF0aG5hbWUgPSAiU0VTU0lPTlMuc2VyIjsKKworCisgICAgLyoqCisgICAgICogSGFzIHRoaXMgY29tcG9uZW50IGJlZW4gc3RhcnRlZCB5ZXQ/CisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHN0YXJ0ZWQgPSBmYWxzZTsKKworCisgICAgaW50IHJlamVjdGVkU2Vzc2lvbnM9MDsKKyAgICBpbnQgZXhwaXJlZFNlc3Npb25zPTA7CisgICAgbG9uZyBwcm9jZXNzaW5nVGltZT0wOworCisgICAgcHJpdmF0ZSBDYXRhbGluYUNsdXN0ZXIgY2x1c3RlciA9IG51bGw7CisgICAgcHJpdmF0ZSBib29sZWFuIHN0YXRlVHJhbnNmZXJyZWQ7CisgICAgcHJpdmF0ZSBib29sZWFuIHVzZURpcnR5RmxhZzsKKyAgICBwcml2YXRlIGJvb2xlYW4gZXhwaXJlU2Vzc2lvbnNPblNodXRkb3duOworICAgIHByaXZhdGUgYm9vbGVhbiBwcmludFRvU2NyZWVuOworICAgIAorICAgIHByaXZhdGUgYm9vbGVhbiBub3RpZnlMaXN0ZW5lcnNPblJlcGxpY2F0aW9uID0gZmFsc2U7CisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcgorICAgIHB1YmxpYyBEZWx0YU1hbmFnZXIoKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgQ29udGFpbmVyIHdpdGggd2hpY2ggdGhpcyBNYW5hZ2VyIGhhcyBiZWVuIGFzc29jaWF0ZWQuICBJZgorICAgICAqIGl0IGlzIGEgQ29udGV4dCAodGhlIHVzdWFsIGNhc2UpLCBsaXN0ZW4gZm9yIGNoYW5nZXMgdG8gdGhlIHNlc3Npb24KKyAgICAgKiB0aW1lb3V0IHByb3BlcnR5LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRhaW5lciBUaGUgYXNzb2NpYXRlZCBDb250YWluZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb250YWluZXIoQ29udGFpbmVyIGNvbnRhaW5lcikgeworCisgICAgICAgIC8vIERlLXJlZ2lzdGVyIGZyb20gdGhlIG9sZCBDb250YWluZXIgKGlmIGFueSkKKyAgICAgICAgaWYgKCh0aGlzLmNvbnRhaW5lciAhPSBudWxsKSAmJiAodGhpcy5jb250YWluZXIgaW5zdGFuY2VvZiBDb250ZXh0KSkKKyAgICAgICAgICAgICgoQ29udGV4dCkgdGhpcy5jb250YWluZXIpLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7CisKKyAgICAgICAgLy8gRGVmYXVsdCBwcm9jZXNzaW5nIHByb3ZpZGVkIGJ5IG91ciBzdXBlcmNsYXNzCisgICAgICAgIHN1cGVyLnNldENvbnRhaW5lcihjb250YWluZXIpOworCisgICAgICAgIC8vIFJlZ2lzdGVyIHdpdGggdGhlIG5ldyBDb250YWluZXIgKGlmIGFueSkKKyAgICAgICAgaWYgKCh0aGlzLmNvbnRhaW5lciAhPSBudWxsKSAmJiAodGhpcy5jb250YWluZXIgaW5zdGFuY2VvZiBDb250ZXh0KSkgeworICAgICAgICAgICAgc2V0TWF4SW5hY3RpdmVJbnRlcnZhbAorICAgICAgICAgICAgICAgICggKChDb250ZXh0KSB0aGlzLmNvbnRhaW5lcikuZ2V0U2Vzc2lvblRpbWVvdXQoKSo2MCApOworICAgICAgICAgICAgKChDb250ZXh0KSB0aGlzLmNvbnRhaW5lcikuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBNYW5hZ2VyIGltcGxlbWVudGF0aW9uIGFuZAorICAgICAqIHRoZSBjb3JyZXNwb25kaW5nIHZlcnNpb24gbnVtYmVyLCBpbiB0aGUgZm9ybWF0CisgICAgICogPGNvZGU+Jmx0O2Rlc2NyaXB0aW9uJmd0Oy8mbHQ7dmVyc2lvbiZndDs8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5mbygpIHsKKworICAgICAgICByZXR1cm4gKGluZm8pOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG1heGltdW0gbnVtYmVyIG9mIGFjdGl2ZSBTZXNzaW9ucyBhbGxvd2VkLCBvciAtMSBmb3IKKyAgICAgKiBubyBsaW1pdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldE1heEFjdGl2ZVNlc3Npb25zKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5tYXhBY3RpdmVTZXNzaW9ucyk7CisKKyAgICB9CisKKyAgICAvKiogTnVtYmVyIG9mIHNlc3Npb24gY3JlYXRpb25zIHRoYXQgZmFpbGVkIGR1ZSB0byBtYXhBY3RpdmVTZXNzaW9ucworICAgICAqCisgICAgICogQHJldHVybiBUaGUgY291bnQKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFJlamVjdGVkU2Vzc2lvbnMoKSB7CisgICAgICAgIHJldHVybiByZWplY3RlZFNlc3Npb25zOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFJlamVjdGVkU2Vzc2lvbnMoaW50IHJlamVjdGVkU2Vzc2lvbnMpIHsKKyAgICAgICAgdGhpcy5yZWplY3RlZFNlc3Npb25zID0gcmVqZWN0ZWRTZXNzaW9uczsKKyAgICB9CisKKyAgICAvKiogTnVtYmVyIG9mIHNlc3Npb25zIHRoYXQgZXhwaXJlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGNvdW50CisgICAgICovCisgICAgcHVibGljIGludCBnZXRFeHBpcmVkU2Vzc2lvbnMoKSB7CisgICAgICAgIHJldHVybiBleHBpcmVkU2Vzc2lvbnM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RXhwaXJlZFNlc3Npb25zKGludCBleHBpcmVkU2Vzc2lvbnMpIHsKKyAgICAgICAgdGhpcy5leHBpcmVkU2Vzc2lvbnMgPSBleHBpcmVkU2Vzc2lvbnM7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgZ2V0UHJvY2Vzc2luZ1RpbWUoKSB7CisgICAgICAgIHJldHVybiBwcm9jZXNzaW5nVGltZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9jZXNzaW5nVGltZShsb25nIHByb2Nlc3NpbmdUaW1lKSB7CisgICAgICAgIHRoaXMucHJvY2Vzc2luZ1RpbWUgPSBwcm9jZXNzaW5nVGltZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIGFjdGl2ZXMgU2Vzc2lvbnMgYWxsb3dlZCwgb3IgLTEgZm9yCisgICAgICogbm8gbGltaXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWF4IFRoZSBuZXcgbWF4aW11bSBudW1iZXIgb2Ygc2Vzc2lvbnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNYXhBY3RpdmVTZXNzaW9ucyhpbnQgbWF4KSB7CisKKyAgICAgICAgaW50IG9sZE1heEFjdGl2ZVNlc3Npb25zID0gdGhpcy5tYXhBY3RpdmVTZXNzaW9uczsKKyAgICAgICAgdGhpcy5tYXhBY3RpdmVTZXNzaW9ucyA9IG1heDsKKyAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoIm1heEFjdGl2ZVNlc3Npb25zIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEludGVnZXIob2xkTWF4QWN0aXZlU2Vzc2lvbnMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSW50ZWdlcih0aGlzLm1heEFjdGl2ZVNlc3Npb25zKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZGVzY3JpcHRpdmUgc2hvcnQgbmFtZSBvZiB0aGlzIE1hbmFnZXIgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCisgICAgICAgIHJldHVybiAobmFtZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2Vzc2lvbiBwZXJzaXN0ZW5jZSBwYXRobmFtZSwgaWYgYW55LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aG5hbWUoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLnBhdGhuYW1lKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzZXNzaW9uIHBlcnNpc3RlbmNlIHBhdGhuYW1lIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuICBJZiBubworICAgICAqIHBlcnNpc3RlbmNlIHN1cHBvcnQgaXMgZGVzaXJlZCwgc2V0IHRoZSBwYXRobmFtZSB0byA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXRobmFtZSBOZXcgc2Vzc2lvbiBwZXJzaXN0ZW5jZSBwYXRobmFtZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhdGhuYW1lKFN0cmluZyBwYXRobmFtZSkgeworCisgICAgICAgIFN0cmluZyBvbGRQYXRobmFtZSA9IHRoaXMucGF0aG5hbWU7CisgICAgICAgIHRoaXMucGF0aG5hbWUgPSBwYXRobmFtZTsKKyAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoInBhdGhuYW1lIiwgb2xkUGF0aG5hbWUsIHRoaXMucGF0aG5hbWUpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhbmQgcmV0dXJuIGEgbmV3IHNlc3Npb24gb2JqZWN0LCBiYXNlZCBvbiB0aGUgZGVmYXVsdAorICAgICAqIHNldHRpbmdzIHNwZWNpZmllZCBieSB0aGlzIE1hbmFnZXIncyBwcm9wZXJ0aWVzLiAgVGhlIHNlc3Npb24KKyAgICAgKiBpZCB3aWxsIGJlIGFzc2lnbmVkIGJ5IHRoaXMgbWV0aG9kLCBhbmQgYXZhaWxhYmxlIHZpYSB0aGUgZ2V0SWQoKQorICAgICAqIG1ldGhvZCBvZiB0aGUgcmV0dXJuZWQgc2Vzc2lvbi4gIElmIGEgbmV3IHNlc3Npb24gY2Fubm90IGJlIGNyZWF0ZWQKKyAgICAgKiBmb3IgYW55IHJlYXNvbiwgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgYSBuZXcgc2Vzc2lvbiBjYW5ub3QgYmUKKyAgICAgKiAgaW5zdGFudGlhdGVkIGZvciBhbnkgcmVhc29uCisgICAgICoKKyAgICAgKiBDb25zdHJ1Y3QgYW5kIHJldHVybiBhIG5ldyBzZXNzaW9uIG9iamVjdCwgYmFzZWQgb24gdGhlIGRlZmF1bHQKKyAgICAgKiBzZXR0aW5ncyBzcGVjaWZpZWQgYnkgdGhpcyBNYW5hZ2VyJ3MgcHJvcGVydGllcy4gIFRoZSBzZXNzaW9uCisgICAgICogaWQgd2lsbCBiZSBhc3NpZ25lZCBieSB0aGlzIG1ldGhvZCwgYW5kIGF2YWlsYWJsZSB2aWEgdGhlIGdldElkKCkKKyAgICAgKiBtZXRob2Qgb2YgdGhlIHJldHVybmVkIHNlc3Npb24uICBJZiBhIG5ldyBzZXNzaW9uIGNhbm5vdCBiZSBjcmVhdGVkCisgICAgICogZm9yIGFueSByZWFzb24sIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIGEgbmV3IHNlc3Npb24gY2Fubm90IGJlCisgICAgICogIGluc3RhbnRpYXRlZCBmb3IgYW55IHJlYXNvbgorICAgICAqLworICAgIHB1YmxpYyBTZXNzaW9uIGNyZWF0ZVNlc3Npb24oKSB7CisgICAgICAgIHJldHVybiBjcmVhdGVTZXNzaW9uKHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyBTZXNzaW9uIGNyZWF0ZVNlc3Npb24oYm9vbGVhbiBkaXN0cmlidXRlKSB7CisKKyAgICAgIGlmICgobWF4QWN0aXZlU2Vzc2lvbnMgPj0gMCkgJiYKKyAgICAgICAgICAoc2Vzc2lvbnMuc2l6ZSgpID49IG1heEFjdGl2ZVNlc3Npb25zKSkgeworICAgICAgICAgICAgcmVqZWN0ZWRTZXNzaW9ucysrOworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInN0YW5kYXJkTWFuYWdlci5jcmVhdGVTZXNzaW9uLmlzZSIpKTsKKyAgICAgICAgfQorCisgICAgICAvLyBSZWN5Y2xlIG9yIGNyZWF0ZSBhIFNlc3Npb24gaW5zdGFuY2UKKyAgICAgIERlbHRhU2Vzc2lvbiBzZXNzaW9uID0gZ2V0TmV3RGVsdGFTZXNzaW9uKCk7CisgICAgICBTdHJpbmcgc2Vzc2lvbklkID0gZ2VuZXJhdGVTZXNzaW9uSWQoKTsKKworICAgICAgU3RyaW5nIGp2bVJvdXRlID0gZ2V0SnZtUm91dGUoKTsKKyAgICAgIC8vIEB0b2RvIE1vdmUgYXBwZW5kaW5nIG9mIGp2bVJvdXRlIGdlbmVyYXRlU2Vzc2lvbklkKCk/Pz8KKyAgICAgIGlmIChqdm1Sb3V0ZSAhPSBudWxsKSB7CisgICAgICAgIHNlc3Npb25JZCArPSAnLicgKyBqdm1Sb3V0ZTsKKyAgICAgIH0KKyAgICAgIHN5bmNocm9uaXplZCAoc2Vzc2lvbnMpIHsKKyAgICAgICAgd2hpbGUgKHNlc3Npb25zLmdldChzZXNzaW9uSWQpICE9IG51bGwpIHsgLy8gR3VhcmFudGVlIHVuaXF1ZW5lc3MKKyAgICAgICAgICBkdXBsaWNhdGVzKys7CisgICAgICAgICAgc2Vzc2lvbklkID0gZ2VuZXJhdGVTZXNzaW9uSWQoKTsKKyAgICAgICAgICAvLyBAdG9kbyBNb3ZlIGFwcGVuZGluZyBvZiBqdm1Sb3V0ZSBnZW5lcmF0ZVNlc3Npb25JZCgpPz8/CisgICAgICAgICAgaWYgKGp2bVJvdXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNlc3Npb25JZCArPSAnLicgKyBqdm1Sb3V0ZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgc2Vzc2lvbi5zZXROZXcodHJ1ZSk7CisgICAgICBzZXNzaW9uLnNldFZhbGlkKHRydWUpOworICAgICAgc2Vzc2lvbi5zZXRDcmVhdGlvblRpbWUoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworICAgICAgc2Vzc2lvbi5zZXRNYXhJbmFjdGl2ZUludGVydmFsKHRoaXMubWF4SW5hY3RpdmVJbnRlcnZhbCk7CisgICAgICBzZXNzaW9uLnNldElkKHNlc3Npb25JZCk7CisgICAgICBzZXNzaW9uLnJlc2V0RGVsdGFSZXF1ZXN0KCk7CisgICAgICAvLyBJbml0aWFsaXplIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBuZXcgc2Vzc2lvbiBhbmQgcmV0dXJuIGl0CisgICAgICAKKyAgICAgIHNlc3Npb25Db3VudGVyKys7CisgICAgICAKKyAgICAgIAorICAgICAgaWYgKCBkaXN0cmlidXRlICkgeworICAgICAgICAgIFNlc3Npb25NZXNzYWdlIG1zZyA9IG5ldyBTZXNzaW9uTWVzc2FnZUltcGwoCisgICAgICAgICAgICAgIGdldE5hbWUoKSwKKyAgICAgICAgICAgICAgU2Vzc2lvbk1lc3NhZ2UuRVZUX1NFU1NJT05fQ1JFQVRFRCwKKyAgICAgICAgICAgICAgbnVsbCwKKyAgICAgICAgICAgICAgc2Vzc2lvbklkLAorICAgICAgICAgICAgICBzZXNzaW9uSWQrU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworICAgICAgICAgIGNsdXN0ZXIuc2VuZChtc2cpOworICAgICAgICAgIHNlc3Npb24ucmVzZXREZWx0YVJlcXVlc3QoKTsKKyAgICAgIH0KKyAgICAgIGxvZy5kZWJ1ZygiQ3JlYXRlZCBhIERlbHRhU2Vzc2lvbiB3aXRoIElkWyIrc2Vzc2lvbi5nZXRJZCgpKyJdIFRvdGFsIGNvdW50PSIrc2Vzc2lvbnMuc2l6ZSgpKTsKKyAgICAgIAorICAgICAgcmV0dXJuIChzZXNzaW9uKTsKKworICAgIH0KKworCisKKyAgICAvKioKKyAgICAgKiBHZXQgbmV3IHNlc3Npb24gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZG9Mb2FkKCkgbWV0aG9kLgorICAgICAqLworICAgIHByb3RlY3RlZCBEZWx0YVNlc3Npb24gZ2V0TmV3RGVsdGFTZXNzaW9uKCkgeworICAgICAgICByZXR1cm4gbmV3IERlbHRhU2Vzc2lvbih0aGlzKTsKKyAgICB9CisKKworICAgIHByaXZhdGUgRGVsdGFSZXF1ZXN0IGxvYWREZWx0YVJlcXVlc3QoRGVsdGFTZXNzaW9uIHNlc3Npb24sIGJ5dGVbXSBkYXRhKSB0aHJvd3MKKyAgICAgICAgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBmaXMgPSBudWxsOworICAgICAgICBSZXBsaWNhdGlvblN0cmVhbSBvaXMgPSBudWxsOworICAgICAgICBMb2FkZXIgbG9hZGVyID0gbnVsbDsKKyAgICAgICAgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIgPSBudWxsOworICAgICAgICAvL2ZpeCB0byBiZSBhYmxlIHRvIHJ1biB0aGUgRGVsdGFNYW5hZ2VyCisgICAgICAgIC8vc3RhbmQgYWxvbmUgd2l0aG91dCBhIGNvbnRhaW5lci4KKyAgICAgICAgLy91c2UgdGhlIFRocmVhZHMgY29udGV4dCBjbGFzcyBsb2FkZXIKKyAgICAgICAgaWYgKCBjb250YWluZXIgIT0gbnVsbCApIAorICAgICAgICAgICAgbG9hZGVyID0gY29udGFpbmVyLmdldExvYWRlcigpOworICAgICAgICBpZiAoIGxvYWRlciAhPSBudWxsICkgCisgICAgICAgICAgICBjbGFzc0xvYWRlciA9IGxvYWRlci5nZXRDbGFzc0xvYWRlcigpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBjbGFzc0xvYWRlciA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7CisgICAgICAgIC8vZW5kIGZpeAorICAgICAgICBmaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oZGF0YSk7CisgICAgICAgIG9pcyA9IG5ldyBSZXBsaWNhdGlvblN0cmVhbShmaXMsY2xhc3NMb2FkZXIpOworICAgICAgICBzZXNzaW9uLmdldERlbHRhUmVxdWVzdCgpLnJlYWRFeHRlcm5hbChvaXMpOworICAgICAgICBvaXMuY2xvc2UoKTsKKyAgICAgICAgcmV0dXJuIHNlc3Npb24uZ2V0RGVsdGFSZXF1ZXN0KCk7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgYnl0ZVtdIHVubG9hZERlbHRhUmVxdWVzdChEZWx0YVJlcXVlc3QgZGVsdGFSZXF1ZXN0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYm9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICBPYmplY3RPdXRwdXRTdHJlYW0gb29zID0gbmV3IE9iamVjdE91dHB1dFN0cmVhbShib3MpOworICAgICAgICBkZWx0YVJlcXVlc3Qud3JpdGVFeHRlcm5hbChvb3MpOworICAgICAgICBvb3MuZmx1c2goKTsKKyAgICAgICAgb29zLmNsb3NlKCk7CisgICAgICAgIHJldHVybiBib3MudG9CeXRlQXJyYXkoKTsKKyAgICB9CisgICAgLyoqCisgICAgICogTG9hZCBhbnkgY3VycmVudGx5IGFjdGl2ZSBzZXNzaW9ucyB0aGF0IHdlcmUgcHJldmlvdXNseSB1bmxvYWRlZAorICAgICAqIHRvIHRoZSBhcHByb3ByaWF0ZSBwZXJzaXN0ZW5jZSBtZWNoYW5pc20sIGlmIGFueS4gIElmIHBlcnNpc3RlbmNlIGlzIG5vdAorICAgICAqIHN1cHBvcnRlZCwgdGhpcyBtZXRob2QgcmV0dXJucyB3aXRob3V0IGRvaW5nIGFueXRoaW5nLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGlmIGEgc2VyaWFsaXplZCBjbGFzcyBjYW5ub3QgYmUKKyAgICAgKiAgZm91bmQgZHVyaW5nIHRoZSByZWxvYWQKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZG9Mb2FkKGJ5dGVbXSBkYXRhKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCisgICAgICAgIC8vIEluaXRpYWxpemUgb3VyIGludGVybmFsIGRhdGEgc3RydWN0dXJlcworICAgICAgICAvL3Nlc3Npb25zLmNsZWFyKCk7IC8vc2hvdWxkIG5vdCBkbyB0aGlzCisgICAgICAgIC8vIE9wZW4gYW4gaW5wdXQgc3RyZWFtIHRvIHRoZSBzcGVjaWZpZWQgcGF0aG5hbWUsIGlmIGFueQorICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBmaXMgPSBudWxsOworICAgICAgICBPYmplY3RJbnB1dFN0cmVhbSBvaXMgPSBudWxsOworICAgICAgICBMb2FkZXIgbG9hZGVyID0gbnVsbDsKKyAgICAgICAgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGRhdGEpOworICAgICAgICAgICAgQnVmZmVyZWRJbnB1dFN0cmVhbSBiaXMgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShmaXMpOworICAgICAgICAgICAgaWYgKGNvbnRhaW5lciAhPSBudWxsKQorICAgICAgICAgICAgICAgIGxvYWRlciA9IGNvbnRhaW5lci5nZXRMb2FkZXIoKTsKKyAgICAgICAgICAgIGlmIChsb2FkZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBjbGFzc0xvYWRlciA9IGxvYWRlci5nZXRDbGFzc0xvYWRlcigpOworICAgICAgICAgICAgaWYgKGNsYXNzTG9hZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBvaXMgPSBuZXcgQ3VzdG9tT2JqZWN0SW5wdXRTdHJlYW0oYmlzLCBjbGFzc0xvYWRlcik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG9pcyA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShiaXMpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2cuZXJyb3Ioc20uZ2V0U3RyaW5nKCJzdGFuZGFyZE1hbmFnZXIubG9hZGluZy5pb2UiLCBlKSwgZSk7CisgICAgICAgICAgICBpZiAob2lzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBvaXMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBmKSB7CisgICAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb2lzID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgIH0KKworICAgICAgICAvLyBMb2FkIHRoZSBwcmV2aW91c2x5IHVubG9hZGVkIGFjdGl2ZSBzZXNzaW9ucworICAgICAgICBzeW5jaHJvbml6ZWQgKHNlc3Npb25zKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIEludGVnZXIgY291bnQgPSAoSW50ZWdlcikgb2lzLnJlYWRPYmplY3QoKTsKKyAgICAgICAgICAgICAgICBpbnQgbiA9IGNvdW50LmludFZhbHVlKCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgRGVsdGFTZXNzaW9uIHNlc3Npb24gPSBnZXROZXdEZWx0YVNlc3Npb24oKTsKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5yZWFkT2JqZWN0RGF0YShvaXMpOworICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLnNldE1hbmFnZXIodGhpcyk7CisgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uc2V0VmFsaWQodHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uc2V0UHJpbWFyeVNlc3Npb24oZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAvL2luIGNhc2UgdGhlIG5vZGVzIGluIHRoZSBjbHVzdGVyIGFyZSBvdXQgb2YgCisgICAgICAgICAgICAgICAgICAgIC8vdGltZSBzeW5jaCwgdGhpcyB3aWxsIG1ha2Ugc3VyZSB0aGF0IHdlIGhhdmUgdGhlCisgICAgICAgICAgICAgICAgICAgIC8vY29ycmVjdCB0aW1lc3RhbXAsIGlzVmFsaWQgcmV0dXJucyB0cnVlLCBjYXVzZSBhY2Nlc3NDb3VudD0xCisgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uYWNjZXNzKCk7CisgICAgICAgICAgICAgICAgICAgIC8vbWFrZSBzdXJlIHRoYXQgdGhlIHNlc3Npb24gZ2V0cyByZWFkeSB0byBleHBpcmUgaWYgbmVlZGVkCisgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uc2V0QWNjZXNzQ291bnQoMCk7CisgICAgICAgICAgICAgICAgICAgIHNlc3Npb25zLnB1dChzZXNzaW9uLmdldElkKCksIHNlc3Npb24pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICBsb2cuZXJyb3Ioc20uZ2V0U3RyaW5nKCJzdGFuZGFyZE1hbmFnZXIubG9hZGluZy5jbmZlIiwgZSksIGUpOworICAgICAgICAgICAgICAgIGlmIChvaXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgb2lzLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBvaXMgPSBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICBsb2cuZXJyb3Ioc20uZ2V0U3RyaW5nKCJzdGFuZGFyZE1hbmFnZXIubG9hZGluZy5pb2UiLCBlKSwgZSk7CisgICAgICAgICAgICAgICAgaWYgKG9pcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvaXMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZikgeworICAgICAgICAgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG9pcyA9IG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIC8vIENsb3NlIHRoZSBpbnB1dCBzdHJlYW0KKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpZiAob2lzICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBvaXMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBmKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZWQKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisKKworCisKKyAgICAvKioKKyAgICAgKiBTYXZlIGFueSBjdXJyZW50bHkgYWN0aXZlIHNlc3Npb25zIGluIHRoZSBhcHByb3ByaWF0ZSBwZXJzaXN0ZW5jZQorICAgICAqIG1lY2hhbmlzbSwgaWYgYW55LiAgSWYgcGVyc2lzdGVuY2UgaXMgbm90IHN1cHBvcnRlZCwgdGhpcyBtZXRob2QKKyAgICAgKiByZXR1cm5zIHdpdGhvdXQgZG9pbmcgYW55dGhpbmcuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwcml2YXRlIGJ5dGVbXSBkb1VubG9hZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKworICAgICAgICAvLyBPcGVuIGFuIG91dHB1dCBzdHJlYW0gdG8gdGhlIHNwZWNpZmllZCBwYXRobmFtZSwgaWYgYW55CisgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBmb3MgPSBudWxsOworICAgICAgICBPYmplY3RPdXRwdXRTdHJlYW0gb29zID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIG9vcyA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0obmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKGZvcykpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2cuZXJyb3Ioc20uZ2V0U3RyaW5nKCJzdGFuZGFyZE1hbmFnZXIudW5sb2FkaW5nLmlvZSIsIGUpLCBlKTsKKyAgICAgICAgICAgIGlmIChvb3MgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIG9vcy5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGYpIHsKKyAgICAgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvb3MgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFdyaXRlIHRoZSBudW1iZXIgb2YgYWN0aXZlIHNlc3Npb25zLCBmb2xsb3dlZCBieSB0aGUgZGV0YWlscworICAgICAgICBBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgc3luY2hyb25pemVkIChzZXNzaW9ucykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBvb3Mud3JpdGVPYmplY3QobmV3IEludGVnZXIoc2Vzc2lvbnMuc2l6ZSgpKSk7CisgICAgICAgICAgICAgICAgSXRlcmF0b3IgZWxlbWVudHMgPSBzZXNzaW9ucy52YWx1ZXMoKS5pdGVyYXRvcigpOworICAgICAgICAgICAgICAgIHdoaWxlIChlbGVtZW50cy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgRGVsdGFTZXNzaW9uIHNlc3Npb24gPQorICAgICAgICAgICAgICAgICAgICAgICAgKERlbHRhU2Vzc2lvbikgZWxlbWVudHMubmV4dCgpOworICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZChzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi53cml0ZU9iamVjdERhdGEob29zKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb29zLmZsdXNoKCk7CisgICAgICAgICAgICAgICAgb29zLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgb29zID0gbnVsbDsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3Ioc20uZ2V0U3RyaW5nKCJzdGFuZGFyZE1hbmFnZXIudW5sb2FkaW5nLmlvZSIsIGUpLCBlKTsKKyAgICAgICAgICAgICAgICBpZiAob29zICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9vcy5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgb29zID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEZsdXNoIGFuZCBjbG9zZSB0aGUgb3V0cHV0IHN0cmVhbQorICAgICAgICByZXR1cm4gZm9zLnRvQnl0ZUFycmF5KCk7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTGlmZWN5Y2xlIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogQWRkIGEgbGlmZWN5Y2xlIGV2ZW50IGxpc3RlbmVyIHRvIHRoaXMgY29tcG9uZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciB0byBhZGQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRMaWZlY3ljbGVMaXN0ZW5lcihMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lcikgeworCisgICAgICAgIGxpZmVjeWNsZS5hZGRMaWZlY3ljbGVMaXN0ZW5lcihsaXN0ZW5lcik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbGlmZWN5Y2xlIGxpc3RlbmVycyBhc3NvY2lhdGVkIHdpdGggdGhpcyBsaWZlY3ljbGUuIElmIHRoaXMKKyAgICAgKiBMaWZlY3ljbGUgaGFzIG5vIGxpc3RlbmVycyByZWdpc3RlcmVkLCBhIHplcm8tbGVuZ3RoIGFycmF5IGlzIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBMaWZlY3ljbGVMaXN0ZW5lcltdIGZpbmRMaWZlY3ljbGVMaXN0ZW5lcnMoKSB7CisKKyAgICAgICAgcmV0dXJuIGxpZmVjeWNsZS5maW5kTGlmZWN5Y2xlTGlzdGVuZXJzKCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhIGxpZmVjeWNsZSBldmVudCBsaXN0ZW5lciBmcm9tIHRoaXMgY29tcG9uZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciB0byByZW1vdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVMaWZlY3ljbGVMaXN0ZW5lcihMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lcikgeworCisgICAgICAgIGxpZmVjeWNsZS5yZW1vdmVMaWZlY3ljbGVMaXN0ZW5lcihsaXN0ZW5lcik7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcmVwYXJlIGZvciB0aGUgYmVnaW5uaW5nIG9mIGFjdGl2ZSB1c2Ugb2YgdGhlIHB1YmxpYyBtZXRob2RzIG9mIHRoaXMKKyAgICAgKiBjb21wb25lbnQuICBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIDxjb2RlPmNvbmZpZ3VyZSgpPC9jb2RlPiwKKyAgICAgKiBhbmQgYmVmb3JlIGFueSBvZiB0aGUgcHVibGljIG1ldGhvZHMgb2YgdGhlIGNvbXBvbmVudCBhcmUgdXRpbGl6ZWQuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIExpZmVjeWNsZUV4Y2VwdGlvbiBpZiB0aGlzIGNvbXBvbmVudCBkZXRlY3RzIGEgZmF0YWwgZXJyb3IKKyAgICAgKiAgdGhhdCBwcmV2ZW50cyB0aGlzIGNvbXBvbmVudCBmcm9tIGJlaW5nIHVzZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb24geworICAgICAgICBpZiggISBpbml0aWFsaXplZCApCisgICAgICAgICAgICBpbml0KCk7CisKKyAgICAgICAgLy8gVmFsaWRhdGUgYW5kIHVwZGF0ZSBvdXIgY3VycmVudCBjb21wb25lbnQgc3RhdGUKKyAgICAgICAgaWYgKHN0YXJ0ZWQpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBzdGFydGVkID0gdHJ1ZTsKKyAgICAgICAgbGlmZWN5Y2xlLmZpcmVMaWZlY3ljbGVFdmVudChTVEFSVF9FVkVOVCwgbnVsbCk7CisgICAgICAgIAorCisgICAgICAgIC8vIEZvcmNlIGluaXRpYWxpemF0aW9uIG9mIHRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgorICAgICAgICBTdHJpbmcgZHVtbXkgPSBnZW5lcmF0ZVNlc3Npb25JZCgpOworCisgICAgICAgIC8vIExvYWQgdW5sb2FkZWQgc2Vzc2lvbnMsIGlmIGFueQorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy90aGUgY2hhbm5lbCBpcyBhbHJlYWR5IHJ1bm5pbmcKKyAgICAgICAgICAgIGxvZy5pbmZvKCJTdGFydGluZyBjbHVzdGVyaW5nIG1hbmFnZXIuLi46IitnZXROYW1lKCkpOworICAgICAgICAgICAgaWYgKCBjbHVzdGVyID09IG51bGwgKSB7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJTdGFydGluZy4uLiBubyBjbHVzdGVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbnRleHQ6IitnZXROYW1lKCkpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNsdXN0ZXIuZ2V0TWVtYmVycygpLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICBNZW1iZXIgbWJyID0gY2x1c3Rlci5nZXRNZW1iZXJzKClbMF07CisgICAgICAgICAgICAgICAgU2Vzc2lvbk1lc3NhZ2UgbXNnID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IFNlc3Npb25NZXNzYWdlSW1wbCh0aGlzLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlc3Npb25NZXNzYWdlLkVWVF9HRVRfQUxMX1NFU1NJT05TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHRVQtQUxMIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHRVQtQUxMLSIrZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICAvL2p1c3QgdG8gbWFrZSBzdXJlIHRoZSBvdGhlciBzZXJ2ZXIgaGFzIHRoZSBjb250ZXh0IHN0YXJ0ZWQKKy8vICAgICAgICAgICAgICAgIGxvbmcgdGltZXRvd2FpdCA9IDIwMDAwLW1ici5nZXRNZW1iZXJBbGl2ZVRpbWUoKTsKKy8vICAgICAgICAgICAgICAgIGlmICggdGltZXRvd2FpdCA+IDAgKSB7CisvLyAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oIlRoZSBvdGhlciBzZXJ2ZXIgaGFzIG5vdCBiZWVuIGFyb3VuZCBtb3JlIHRoYW4gMjAgc2Vjb25kcywgd2lsbCBzbGVlcCBmb3IgIit0aW1ldG93YWl0KyIgbXMuIGluIG9yZGVyIHRvIGxldCBpdCBzdGFydHVwIik7CisvLyAgICAgICAgICAgICAgICAgICAgdHJ5IHsgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zbGVlcCh0aW1ldG93YWl0KTsgfSBjYXRjaCAoIEV4Y2VwdGlvbiB4ICkge30KKy8vICAgICAgICAgICAgICAgIH0vL2VuZCBpZgorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vcmVxdWVzdCBzZXNzaW9uIHN0YXRlCisgICAgICAgICAgICAgICAgY2x1c3Rlci5zZW5kKG1zZywgbWJyKTsKKyAgICAgICAgICAgICAgICBsb2cud2FybigiTWFuYWdlclsiK2dldE5hbWUoKSsiXSwgcmVxdWVzdGluZyBzZXNzaW9uIHN0YXRlIGZyb20gIittYnIrCisgICAgICAgICAgICAgICAgICAgICAgICAgIi4gVGhpcyBvcGVyYXRpb24gd2lsbCB0aW1lb3V0IGlmIG5vIHNlc3Npb24gc3RhdGUgaGFzIGJlZW4gcmVjZWl2ZWQgd2l0aGluICIrCisgICAgICAgICAgICAgICAgICAgICAgICAgIjYwIHNlY29uZHMiKTsKKyAgICAgICAgICAgICAgICBsb25nIHJlcVN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICAgICAgbG9uZyByZXFOb3cgPSAwOworICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNUaW1lb3V0PWZhbHNlOworICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDApOworICAgICAgICAgICAgICAgICAgICB9Y2F0Y2ggKCBFeGNlcHRpb24gc2xlZXApIHt9CisgICAgICAgICAgICAgICAgICAgIHJlcU5vdyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICAgICAgICAgICAgICBpc1RpbWVvdXQ9KChyZXFOb3ctcmVxU3RhcnQpPigxMDAwKjYwKSk7CisgICAgICAgICAgICAgICAgfSB3aGlsZSAoICghZ2V0U3RhdGVUcmFuc2ZlcnJlZCgpKSAmJiAoIWlzVGltZW91dCkpOworICAgICAgICAgICAgICAgIGlmICggaXNUaW1lb3V0IHx8ICghZ2V0U3RhdGVUcmFuc2ZlcnJlZCgpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJNYW5hZ2VyWyIrZ2V0TmFtZSgpKyJdLCBObyBzZXNzaW9uIHN0YXRlIHJlY2VpdmVkLCB0aW1pbmcgb3V0LiIpOworICAgICAgICAgICAgICAgIH1lbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oIk1hbmFnZXJbIitnZXROYW1lKCkrIl0sIHNlc3Npb24gc3RhdGUgcmVjZWl2ZWQgaW4gIisocmVxTm93LXJlcVN0YXJ0KSsiIG1zLiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbG9nLmluZm8oIk1hbmFnZXJbIitnZXROYW1lKCkrIl0sIHNraXBwaW5nIHN0YXRlIHRyYW5zZmVyLiBObyBtZW1iZXJzIGFjdGl2ZSBpbiBjbHVzdGVyIGdyb3VwLiIpOworICAgICAgICAgICAgfS8vZW5kIGlmCisKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcihzbS5nZXRTdHJpbmcoInN0YW5kYXJkTWFuYWdlci5tYW5hZ2VyTG9hZCIpLCB0KTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHcmFjZWZ1bGx5IHRlcm1pbmF0ZSB0aGUgYWN0aXZlIHVzZSBvZiB0aGUgcHVibGljIG1ldGhvZHMgb2YgdGhpcworICAgICAqIGNvbXBvbmVudC4gIFRoaXMgbWV0aG9kIHNob3VsZCBiZSB0aGUgbGFzdCBvbmUgY2FsbGVkIG9uIGEgZ2l2ZW4KKyAgICAgKiBpbnN0YW5jZSBvZiB0aGlzIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTGlmZWN5Y2xlRXhjZXB0aW9uIGlmIHRoaXMgY29tcG9uZW50IGRldGVjdHMgYSBmYXRhbCBlcnJvcgorICAgICAqICB0aGF0IG5lZWRzIHRvIGJlIHJlcG9ydGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcCgpIHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb24geworCisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiU3RvcHBpbmciKTsKKworICAgICAgICAvLyBWYWxpZGF0ZSBhbmQgdXBkYXRlIG91ciBjdXJyZW50IGNvbXBvbmVudCBzdGF0ZQorICAgICAgICBpZiAoIXN0YXJ0ZWQpCisgICAgICAgICAgICB0aHJvdyBuZXcgTGlmZWN5Y2xlRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygic3RhbmRhcmRNYW5hZ2VyLm5vdFN0YXJ0ZWQiKSk7CisgICAgICAgIGxpZmVjeWNsZS5maXJlTGlmZWN5Y2xlRXZlbnQoU1RPUF9FVkVOVCwgbnVsbCk7CisgICAgICAgIHN0YXJ0ZWQgPSBmYWxzZTsKKworICAgICAgICAvLyBFeHBpcmUgYWxsIGFjdGl2ZSBzZXNzaW9ucworICAgICAgICBpZiAoIHRoaXMuZ2V0RXhwaXJlU2Vzc2lvbnNPblNodXRkb3duKCkgKSB7CisgICAgICAgICAgICBsb2cuaW5mbygiRXhwaXJpbmcgc2Vzc2lvbnMgdXBvbiBzaHV0ZG93biIpOworICAgICAgICAgICAgU2Vzc2lvbiBzZXNzaW9uc1tdID0gZmluZFNlc3Npb25zKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlc3Npb25zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgRGVsdGFTZXNzaW9uIHNlc3Npb24gPSAoRGVsdGFTZXNzaW9uKSBzZXNzaW9uc1tpXTsKKyAgICAgICAgICAgICAgICBpZiAoIXNlc3Npb24uaXNWYWxpZCgpKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmV4cGlyZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgICAgIH0gLy9jYXRjaAorICAgICAgICAgICAgfSAvL2ZvcgorICAgICAgICB9Ly9lbmQgaWYKKworICAgICAgICAvLyBSZXF1aXJlIGEgbmV3IHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGlmIHdlIGFyZSByZXN0YXJ0ZWQKKyAgICAgICAgdGhpcy5yYW5kb20gPSBudWxsOworCisgICAgICAgIGlmKCBpbml0aWFsaXplZCApIHsKKyAgICAgICAgICAgIGRlc3Ryb3koKTsKKyAgICAgICAgfQorICAgICAgICBnZXRDbHVzdGVyKCkucmVtb3ZlTWFuYWdlcihnZXROYW1lKCkpOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgcHJvcGVydHkgY2hhbmdlIGV2ZW50cyBmcm9tIG91ciBhc3NvY2lhdGVkIENvbnRleHQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnQgVGhlIHByb3BlcnR5IGNoYW5nZSBldmVudCB0aGF0IGhhcyBvY2N1cnJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKKworICAgICAgICAvLyBWYWxpZGF0ZSB0aGUgc291cmNlIG9mIHRoaXMgZXZlbnQKKyAgICAgICAgaWYgKCEoZXZlbnQuZ2V0U291cmNlKCkgaW5zdGFuY2VvZiBDb250ZXh0KSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gKENvbnRleHQpIGV2ZW50LmdldFNvdXJjZSgpOworCisgICAgICAgIC8vIFByb2Nlc3MgYSByZWxldmFudCBwcm9wZXJ0eSBjaGFuZ2UKKyAgICAgICAgaWYgKGV2ZW50LmdldFByb3BlcnR5TmFtZSgpLmVxdWFscygic2Vzc2lvblRpbWVvdXQiKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBzZXRNYXhJbmFjdGl2ZUludGVydmFsCisgICAgICAgICAgICAgICAgICAgICggKChJbnRlZ2VyKSBldmVudC5nZXROZXdWYWx1ZSgpKS5pbnRWYWx1ZSgpKjYwICk7CisgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxvZy5lcnJvcihzbS5nZXRTdHJpbmcoInN0YW5kYXJkTWFuYWdlci5zZXNzaW9uVGltZW91dCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5nZXROZXdWYWx1ZSgpLnRvU3RyaW5nKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUmVwbGljYXRpb24gTWV0aG9kcworCisgICAgLyoqCisgICAgICAgICogQSBtZXNzYWdlIHdhcyByZWNlaXZlZCBmcm9tIGFub3RoZXIgbm9kZSwgdGhpcworICAgICAgICAqIGlzIHRoZSBjYWxsYmFjayBtZXRob2QgdG8gaW1wbGVtZW50IGlmIHlvdSBhcmUgaW50ZXJlc3RlZCBpbgorICAgICAgICAqIHJlY2VpdmluZyByZXBsaWNhdGlvbiBtZXNzYWdlcy4KKyAgICAgICAgKiBAcGFyYW0gbXNnIC0gdGhlIG1lc3NhZ2UgcmVjZWl2ZWQuCisgICAgICAgICovCisgICAgICAgcHVibGljIHZvaWQgbWVzc2FnZURhdGFSZWNlaXZlZChDbHVzdGVyTWVzc2FnZSBjbXNnKSB7CisgICAgICAgICAgIGlmICggY21zZyBpbnN0YW5jZW9mIFNlc3Npb25NZXNzYWdlICkgeworICAgICAgICAgICAgICAgU2Vzc2lvbk1lc3NhZ2UgbXNnID0gKFNlc3Npb25NZXNzYWdlKWNtc2c7CisgICAgICAgICAgICAgICBtZXNzYWdlUmVjZWl2ZWQobXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZy5nZXRBZGRyZXNzKCkgIT0gbnVsbCA/IChNZW1iZXIpIG1zZy5nZXRBZGRyZXNzKCkgOiBudWxsKTsKKyAgICAgICAgICAgfQorICAgICAgIH0KKworICAgICAgIC8qKgorICAgICAgICAqIFdoZW4gdGhlIHJlcXVlc3QgaGFzIGJlZW4gY29tcGxldGVkLCB0aGUgcmVwbGljYXRpb24gdmFsdmUKKyAgICAgICAgKiB3aWxsIG5vdGlmeSB0aGUgbWFuYWdlciwgYW5kIHRoZSBtYW5hZ2VyIHdpbGwgZGVjaWRlIHdoZXRoZXIKKyAgICAgICAgKiBhbnkgcmVwbGljYXRpb24gaXMgbmVlZGVkIG9yIG5vdC4KKyAgICAgICAgKiBJZiB0aGVyZSBpcyBhIG5lZWQgZm9yIHJlcGxpY2F0aW9uLCB0aGUgbWFuYWdlciB3aWxsCisgICAgICAgICogY3JlYXRlIGEgc2Vzc2lvbiBtZXNzYWdlIGFuZCB0aGF0IHdpbGwgYmUgcmVwbGljYXRlZC4KKyAgICAgICAgKiBUaGUgY2x1c3RlciBkZXRlcm1pbmVzIHdoZXJlIGl0IGdldHMgc2VudC4KKyAgICAgICAgKiBAcGFyYW0gc2Vzc2lvbklkIC0gdGhlIHNlc3Npb25JZCB0aGF0IGp1c3QgY29tcGxldGVkLgorICAgICAgICAqIEByZXR1cm4gYSBTZXNzaW9uTWVzc2FnZSB0byBiZSBzZW50LAorICAgICAgICAqLworICAgICAgIHB1YmxpYyBDbHVzdGVyTWVzc2FnZSByZXF1ZXN0Q29tcGxldGVkKFN0cmluZyBzZXNzaW9uSWQpIHsKKyAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgIERlbHRhU2Vzc2lvbiBzZXNzaW9uID0gKERlbHRhU2Vzc2lvbikgZmluZFNlc3Npb24oc2Vzc2lvbklkKTsKKyAgICAgICAgICAgICAgIERlbHRhUmVxdWVzdCBkZWx0YVJlcXVlc3QgPSBzZXNzaW9uLmdldERlbHRhUmVxdWVzdCgpOworICAgICAgICAgICAgICAgU2Vzc2lvbk1lc3NhZ2UgbXNnID0gbnVsbDsKKyAgICAgICAgICAgICAgIGlmIChkZWx0YVJlcXVlc3QuZ2V0U2l6ZSgpID4gMCkgeworICAgCisgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGRhdGEgPSB1bmxvYWREZWx0YVJlcXVlc3QoZGVsdGFSZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICAgICBtc2cgPSBuZXcgU2Vzc2lvbk1lc3NhZ2VJbXBsKG5hbWUsIFNlc3Npb25NZXNzYWdlLkVWVF9TRVNTSU9OX0RFTFRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCtTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5yZXNldERlbHRhUmVxdWVzdCgpOworICAgICAgICAgICAgICAgfSBlbHNlIGlmICggIXNlc3Npb24uaXNQcmltYXJ5U2Vzc2lvbigpICkgeworICAgICAgICAgICAgICAgICAgIG1zZyA9IG5ldyBTZXNzaW9uTWVzc2FnZUltcGwoZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXNzaW9uTWVzc2FnZS5FVlRfU0VTU0lPTl9BQ0NFU1NFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQrU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgc2Vzc2lvbi5zZXRQcmltYXJ5U2Vzc2lvbih0cnVlKTsKKyAgICAgICAgICAgICAgIC8vY2hlY2sgdG8gc2VlIGlmIHdlIG5lZWQgdG8gc2VuZCBvdXQgYW4gYWNjZXNzIG1lc3NhZ2UKKyAgICAgICAgICAgICAgIGlmICggKG1zZyA9PSBudWxsKSApIHsKKyAgICAgICAgICAgICAgICAgICBsb25nIHJlcGxEZWx0YSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc2Vzc2lvbi5nZXRMYXN0VGltZVJlcGxpY2F0ZWQoKTsKKyAgICAgICAgICAgICAgICAgICBpZiAoIHJlcGxEZWx0YSA+IChnZXRNYXhJbmFjdGl2ZUludGVydmFsKCkqMTAwMCkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIG1zZyA9IG5ldyBTZXNzaW9uTWVzc2FnZUltcGwoZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2Vzc2lvbk1lc3NhZ2UuRVZUX1NFU1NJT05fQUNDRVNTRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkK1N5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKKyAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgIC8vdXBkYXRlIGxhc3QgcmVwbGljYXRlZCB0aW1lCisgICAgICAgICAgICAgICBpZiAoIG1zZyAhPSBudWxsICkgc2Vzc2lvbi5zZXRMYXN0VGltZVJlcGxpY2F0ZWQoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworICAgICAgICAgICAgICAgcmV0dXJuIG1zZzsKKyAgICAgICAgICAgfQorICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24geCkgeworICAgICAgICAgICAgICAgbG9nLmVycm9yKCJVbmFibGUgdG8gc2VyaWFsaXplIGRlbHRhIHJlcXVlc3QiLCB4KTsKKyAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICB9CisgICAKKyAgICAgICB9CisgICAgICAgCisgICAgICAgcHJvdGVjdGVkIHZvaWQgc2Vzc2lvbkV4cGlyZWQoU3RyaW5nIGlkKSB7CisgICAgICAgICAgIFNlc3Npb25NZXNzYWdlIG1zZyA9IG5ldyBTZXNzaW9uTWVzc2FnZUltcGwoZ2V0TmFtZSgpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlc3Npb25NZXNzYWdlLkVWVF9TRVNTSU9OX0VYUElSRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCsiLUVYUElSRUQtTVNHIik7CisgICAgICAgICAgIGNsdXN0ZXIuc2VuZChtc2cpOworICAgICAgIH0KKyAgIAorICAgICAgIC8qKgorICAgICAgICAqIFdoZW4gdGhlIG1hbmFnZXIgZXhwaXJlcyBzZXNzaW9uIG5vdCB0aWVkIHRvIGEgcmVxdWVzdC4KKyAgICAgICAgKiBUaGUgY2x1c3RlciB3aWxsIHBlcmlvZGljYWxseSBhc2sgZm9yIGEgbGlzdCBvZiBzZXNzaW9ucworICAgICAgICAqIHRoYXQgc2hvdWxkIGV4cGlyZSBhbmQgdGhhdCBzaG91bGQgYmUgc2VudCBhY3Jvc3MgdGhlIHdpcmUuCisgICAgICAgICogQHJldHVybgorICAgICAgICAqLworICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRJbnZhbGlkYXRlZFNlc3Npb25zKCkgeworICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1swXTsKKyAgICAgICB9CisKKworICAgICAgIC8qKgorICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgcmVjZWl2ZWQgdGhyZWFkIHdoZW4gYSBTZXNzaW9uTWVzc2FnZSBoYXMKKyAgICAgICAgKiBiZWVuIHJlY2VpdmVkIGZyb20gb25lIG9mIHRoZSBvdGhlciBub2RlcyBpbiB0aGUgY2x1c3Rlci4KKyAgICAgICAgKiBAcGFyYW0gbXNnIC0gdGhlIG1lc3NhZ2UgcmVjZWl2ZWQKKyAgICAgICAgKiBAcGFyYW0gc2VuZGVyIC0gdGhlIHNlbmRlciBvZiB0aGUgbWVzc2FnZSwgdGhpcyBpcyB1c2VkIGlmIHdlIHJlY2VpdmUgYQorICAgICAgICAqICAgICAgICAgICAgICAgICBFVlRfR0VUX0FMTF9TRVNTSU9OIG1lc3NhZ2UsIHNvIHRoYXQgd2Ugb25seSByZXBseSB0bworICAgICAgICAqICAgICAgICAgICAgICAgICB0aGUgcmVxdWVzdGluZyBub2RlCisgICAgICAgICovCisgICAgICAgcHJvdGVjdGVkIHZvaWQgbWVzc2FnZVJlY2VpdmVkKFNlc3Npb25NZXNzYWdlIG1zZywgTWVtYmVyIHNlbmRlcikgeworICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJNYW5hZ2VyICgiK25hbWUrIikgUmVjZWl2ZWQgU2Vzc2lvbk1lc3NhZ2Ugb2YgdHlwZT0iICsgbXNnLmdldEV2ZW50VHlwZVN0cmluZygpKyIgZnJvbSAiK3NlbmRlcik7CisgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgeworICAgICAgICAgICAgICAgICAgIGNhc2UgU2Vzc2lvbk1lc3NhZ2UuRVZUX0dFVF9BTExfU0VTU0lPTlM6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgLy9nZXQgYSBsaXN0IG9mIGFsbCB0aGUgc2Vzc2lvbiBmcm9tIHRoaXMgbWFuYWdlcgorICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk1hbmFnZXIgKCIrbmFtZSsiKSB1bmxvYWRpbmcgc2Vzc2lvbnMiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGRhdGEgPSBkb1VubG9hZCgpOworICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk1hbmFnZXIgKCIrbmFtZSsiKSB1bmxvYWRpbmcgc2Vzc2lvbnMgY29tcGxldGUiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgU2Vzc2lvbk1lc3NhZ2UgbmV3bXNnID0gbmV3IFNlc3Npb25NZXNzYWdlSW1wbChuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU2Vzc2lvbk1lc3NhZ2UuRVZUX0FMTF9TRVNTSU9OX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLCAiU0VTU0lPTi1TVEFURSIsIlNFU1NJT04tU1RBVEUtIitnZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICAgICBjbHVzdGVyLnNlbmQobmV3bXNnLCBzZW5kZXIpOworICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgY2FzZSBTZXNzaW9uTWVzc2FnZS5FVlRfQUxMX1NFU1NJT05fREFUQTogeworICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk1hbmFnZXIgKCIrbmFtZSsiKSByZWNlaXZlZCBzZXNzaW9uIHN0YXRlIGRhdGEuIik7CisgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBkYXRhID0gbXNnLmdldFNlc3Npb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgZG9Mb2FkKGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk1hbmFnZXIgKCIrbmFtZSsiKSBzdGF0ZSBkZXNlcmlhbGl6ZWQuIik7CisgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlVHJhbnNmZXJyZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgY2FzZSBTZXNzaW9uTWVzc2FnZS5FVlRfU0VTU0lPTl9DUkVBVEVEOiB7CisgICAgICAgICAgICAgICAgICAgICAgIERlbHRhU2Vzc2lvbiBzZXNzaW9uID0gKERlbHRhU2Vzc2lvbiljcmVhdGVTZXNzaW9uKGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5zZXRJZChtc2cuZ2V0U2Vzc2lvbklEKCkpOworICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLnNldE5ldyhmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uc2V0UHJpbWFyeVNlc3Npb24oZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLnJlc2V0RGVsdGFSZXF1ZXN0KCk7CisgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICBjYXNlIFNlc3Npb25NZXNzYWdlLkVWVF9TRVNTSU9OX0VYUElSRUQ6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgRGVsdGFTZXNzaW9uIHNlc3Npb24gPSAoRGVsdGFTZXNzaW9uKWZpbmRTZXNzaW9uKG1zZy5nZXRTZXNzaW9uSUQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZXhwaXJlKHRydWUsZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICB9IC8vZW5kIGlmCisgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICBjYXNlIFNlc3Npb25NZXNzYWdlLkVWVF9TRVNTSU9OX0FDQ0VTU0VEOiB7CisgICAgICAgICAgICAgICAgICAgICAgIERlbHRhU2Vzc2lvbiBzZXNzaW9uID0gKERlbHRhU2Vzc2lvbilmaW5kU2Vzc2lvbihtc2cuZ2V0U2Vzc2lvbklEKCkpOworICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmFjY2VzcygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5zZXRQcmltYXJ5U2Vzc2lvbihmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmVuZEFjY2VzcygpOworICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICBjYXNlIFNlc3Npb25NZXNzYWdlLkVWVF9TRVNTSU9OX0RFTFRBIDogeworICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gZGVsdGEgPSBtc2cuZ2V0U2Vzc2lvbigpOworICAgICAgICAgICAgICAgICAgICAgICBEZWx0YVNlc3Npb24gc2Vzc2lvbiA9IChEZWx0YVNlc3Npb24pZmluZFNlc3Npb24obXNnLmdldFNlc3Npb25JRCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlc3Npb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVsdGFSZXF1ZXN0IGRyZXEgPSBsb2FkRGVsdGFSZXF1ZXN0KHNlc3Npb24sIGRlbHRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyZXEuZXhlY3V0ZShzZXNzaW9uLG5vdGlmeUxpc3RlbmVyc09uUmVwbGljYXRpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5zZXRQcmltYXJ5U2Vzc2lvbihmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgICAgICAgICAgICAgIC8vd2UgZGlkbid0IHJlY29nbml6ZSB0aGUgbWVzc2FnZSB0eXBlLCBkbyBub3RoaW5nCisgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIH0gLy9zd2l0Y2gKKyAgICAgICAgICAgfQorICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIHgpIHsKKyAgICAgICAgICAgICAgIGxvZy5lcnJvcigiVW5hYmxlIHRvIHJlY2VpdmUgbWVzc2FnZSB0aHJvdWdoIFRDUCBjaGFubmVsIiwgeCk7CisgICAgICAgICAgIH0KKyAgICAgICB9CisKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJpdmF0ZSBNZXRob2RzCisKKyAgICBwdWJsaWMgdm9pZCBiYWNrZ3JvdW5kUHJvY2VzcygpIHsKKyAgICAgICAgcHJvY2Vzc0V4cGlyZXMoKTsKKyAgICB9CisgICAgLyoqCisgICAgICogSW52YWxpZGF0ZSBhbGwgc2Vzc2lvbnMgdGhhdCBoYXZlIGV4cGlyZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHJvY2Vzc0V4cGlyZXMoKSB7CisgICAgICAgIGxvbmcgdGltZU5vdyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICBTZXNzaW9uIHNlc3Npb25zW10gPSBmaW5kU2Vzc2lvbnMoKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlc3Npb25zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBEZWx0YVNlc3Npb24gc2Vzc2lvbiA9IChEZWx0YVNlc3Npb24pIHNlc3Npb25zW2ldOworICAgICAgICAgICAgaWYgKCFzZXNzaW9uLmlzVmFsaWQoKSkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGV4cGlyZWRTZXNzaW9ucysrOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcihzbS5nZXRTdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgic3RhbmRhcmRNYW5hZ2VyLmV4cGlyZUV4Y2VwdGlvbiIpLCB0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbG9uZyB0aW1lRW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIHByb2Nlc3NpbmdUaW1lICs9ICggdGltZUVuZCAtIHRpbWVOb3cgKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRTdGF0ZVRyYW5zZmVycmVkKCkgeworICAgICAgICByZXR1cm4gc3RhdGVUcmFuc2ZlcnJlZDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTdGF0ZVRyYW5zZmVycmVkKGJvb2xlYW4gc3RhdGVUcmFuc2ZlcnJlZCkgeworICAgICAgICB0aGlzLnN0YXRlVHJhbnNmZXJyZWQgPSBzdGF0ZVRyYW5zZmVycmVkOworICAgIH0KKworICAgIHB1YmxpYyBDYXRhbGluYUNsdXN0ZXIgZ2V0Q2x1c3RlcigpIHsKKyAgICAgICAgcmV0dXJuIGNsdXN0ZXI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q2x1c3RlcihDYXRhbGluYUNsdXN0ZXIgY2x1c3RlcikgeworICAgICAgICB0aGlzLmNsdXN0ZXIgPSBjbHVzdGVyOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGxvYWQoKSB7CisKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1bmxvYWQoKSB7CisKKyAgICB9CisgICAgcHVibGljIGJvb2xlYW4gZ2V0VXNlRGlydHlGbGFnKCkgeworICAgICAgICByZXR1cm4gdXNlRGlydHlGbGFnOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBzZXRVc2VEaXJ0eUZsYWcoYm9vbGVhbiB1c2VEaXJ0eUZsYWcpIHsKKyAgICAgICAgdGhpcy51c2VEaXJ0eUZsYWcgPSB1c2VEaXJ0eUZsYWc7CisgICAgfQorICAgIHB1YmxpYyBib29sZWFuIGdldEV4cGlyZVNlc3Npb25zT25TaHV0ZG93bigpIHsKKyAgICAgICAgcmV0dXJuIGV4cGlyZVNlc3Npb25zT25TaHV0ZG93bjsKKyAgICB9CisgICAgcHVibGljIHZvaWQgc2V0RXhwaXJlU2Vzc2lvbnNPblNodXRkb3duKGJvb2xlYW4gZXhwaXJlU2Vzc2lvbnNPblNodXRkb3duKSB7CisgICAgICAgIHRoaXMuZXhwaXJlU2Vzc2lvbnNPblNodXRkb3duID0gZXhwaXJlU2Vzc2lvbnNPblNodXRkb3duOworICAgIH0KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRQcmludFRvU2NyZWVuKCkgeworICAgICAgICByZXR1cm4gcHJpbnRUb1NjcmVlbjsKKyAgICB9CisgICAgcHVibGljIHZvaWQgc2V0UHJpbnRUb1NjcmVlbihib29sZWFuIHByaW50VG9TY3JlZW4pIHsKKyAgICAgICAgdGhpcy5wcmludFRvU2NyZWVuID0gcHJpbnRUb1NjcmVlbjsKKyAgICB9CisgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXROb3RpZnlMaXN0ZW5lcnNPblJlcGxpY2F0aW9uKCkgeworICAgICAgICByZXR1cm4gbm90aWZ5TGlzdGVuZXJzT25SZXBsaWNhdGlvbjsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgc2V0Tm90aWZ5TGlzdGVuZXJzT25SZXBsaWNhdGlvbihib29sZWFuIG5vdGlmeUxpc3RlbmVyc09uUmVwbGljYXRpb24pIHsKKyAgICAgICAgdGhpcy5ub3RpZnlMaXN0ZW5lcnNPblJlcGxpY2F0aW9uID0gbm90aWZ5TGlzdGVuZXJzT25SZXBsaWNhdGlvbjsKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3Nlc3Npb24vRGVsdGFSZXF1ZXN0LmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvc2Vzc2lvbi9EZWx0YVJlcXVlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2E2MGFkCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3Nlc3Npb24vRGVsdGFSZXF1ZXN0LmphdmEKQEAgLTAsMCArMSwzMTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5zZXNzaW9uOworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byB0cmFjayB0aGUgc2VyaWVzIG9mIGFjdGlvbnMgdGhhdCBoYXBwZW5zIHdoZW4KKyAqIGEgcmVxdWVzdCBpcyBleGVjdXRlZC4gVGhlc2UgYWN0aW9ucyB3aWxsIHRoZW4gdHJhbnNsYXRlIGludG8gaW52b2thdGlvbnMgb2YgbWV0aG9kcyAKKyAqIG9uIHRoZSBhY3R1YWwgc2Vzc2lvbi4KKyAqIFRoaXMgY2xhc3MgaXMgTk9UIHRocmVhZCBzYWZlLiBPbmUgRGVsdGFSZXF1ZXN0IHBlciBzZXNzaW9uCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpmaGFuaWtAYXBhY2hlLm9yZyI+RmlsaXAgSGFuaWs8L2E+CisgKiBAdmVyc2lvbiAxLjAKKyAqLworCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS5pby5FeHRlcm5hbGl6YWJsZTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaW5jaXBhbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtLkdlbmVyaWNQcmluY2lwYWw7CisKKworcHVibGljIGNsYXNzIERlbHRhUmVxdWVzdCBpbXBsZW1lbnRzIEV4dGVybmFsaXphYmxlIHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfQVRUUklCVVRFID0gMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX1BSSU5DSVBBTCA9IDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9JU05FVyA9IDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9NQVhJTlRFUlZBTCA9IDM7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQ1RJT05fU0VUID0gMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQ1RJT05fUkVNT1ZFID0gMTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfUFJJTkNJUEFMID0gIl9fU0VUX19QUklOQ0lQQUxfXyI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9NQVhJTlRFUlZBTCA9ICJfX1NFVF9fTUFYSU5URVJWQUxfXyI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9JU05FVyA9ICJfX1NFVF9fSVNORVdfXyI7CisKKyAgICBwcml2YXRlIFN0cmluZyBzZXNzaW9uSWQ7CisgICAgcHJpdmF0ZSBMaW5rZWRMaXN0IGFjdGlvbnMgPSBuZXcgTGlua2VkTGlzdCgpOworICAgIHByaXZhdGUgTGlua2VkTGlzdCBhY3Rpb25Qb29sID0gbmV3IExpbmtlZExpc3QoKTsKKyAgICAKKyAgICBwcml2YXRlIGJvb2xlYW4gcmVjb3JkQWxsQWN0aW9ucyA9IGZhbHNlOworCisgICAgcHVibGljIERlbHRhUmVxdWVzdCgpIHsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIHB1YmxpYyBEZWx0YVJlcXVlc3QoU3RyaW5nIHNlc3Npb25JZCwgYm9vbGVhbiByZWNvcmRBbGxBY3Rpb25zKSB7CisgICAgICAgIHRoaXMucmVjb3JkQWxsQWN0aW9ucz1yZWNvcmRBbGxBY3Rpb25zOworICAgICAgICBzZXRTZXNzaW9uSWQoc2Vzc2lvbklkKTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIGludCBhY3Rpb24gPSAodmFsdWU9PW51bGwpP0FDVElPTl9SRU1PVkU6QUNUSU9OX1NFVDsKKyAgICAgICAgYWRkQWN0aW9uKFRZUEVfQVRUUklCVVRFLGFjdGlvbixuYW1lLHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgaW50IGFjdGlvbiA9IEFDVElPTl9SRU1PVkU7CisgICAgICAgIGFkZEFjdGlvbihUWVBFX0FUVFJJQlVURSxhY3Rpb24sbmFtZSxudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRNYXhJbmFjdGl2ZUludGVydmFsKGludCBpbnRlcnZhbCkgeworICAgICAgICBpbnQgYWN0aW9uID0gQUNUSU9OX1NFVDsKKyAgICAgICAgYWRkQWN0aW9uKFRZUEVfTUFYSU5URVJWQUwsYWN0aW9uLE5BTUVfTUFYSU5URVJWQUwsbmV3IEludGVnZXIoaW50ZXJ2YWwpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQcmluY2lwYWwoUHJpbmNpcGFsIHApIHsKKyAgICAgICAgaW50IGFjdGlvbiA9IChwPT1udWxsKT9BQ1RJT05fUkVNT1ZFOkFDVElPTl9TRVQ7CisgICAgICAgIFNlcmlhbGl6YWJsZVByaW5jaXBhbCBzcCA9IG51bGw7CisgICAgICAgIGlmICggcCAhPSBudWxsICkgeworICAgICAgICAgICAgc3AgPSBTZXJpYWxpemFibGVQcmluY2lwYWwuY3JlYXRlUHJpbmNpcGFsKChHZW5lcmljUHJpbmNpcGFsKXApOworICAgICAgICB9CisgICAgICAgIGFkZEFjdGlvbihUWVBFX1BSSU5DSVBBTCxhY3Rpb24sTkFNRV9QUklOQ0lQQUwsc3ApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE5ldyhib29sZWFuIG4pIHsKKyAgICAgICAgaW50IGFjdGlvbiA9IEFDVElPTl9TRVQ7CisgICAgICAgIGFkZEFjdGlvbihUWVBFX0lTTkVXLGFjdGlvbixOQU1FX0lTTkVXLG5ldyBCb29sZWFuKG4pKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBhZGRBY3Rpb24oaW50IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgQXR0cmlidXRlSW5mbyBpbmZvID0gbnVsbDsKKyAgICAgICAgaWYgKCB0aGlzLmFjdGlvblBvb2wuc2l6ZSgpID4gMCApIHsKKyAgICAgICAgICAgIGluZm8gPSAoQXR0cmlidXRlSW5mbylhY3Rpb25Qb29sLnJlbW92ZUZpcnN0KCk7CisgICAgICAgICAgICBpbmZvLmluaXQodHlwZSxhY3Rpb24sbmFtZSx2YWx1ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbmZvID0gbmV3IEF0dHJpYnV0ZUluZm8odHlwZSwgYWN0aW9uLCBuYW1lLCB2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgLy9pZiB3ZSBoYXZlIGFscmVhZHkgZG9uZSBzb21ldGhpbmcgdG8gdGhpcyBhdHRyaWJ1dGUsIG1ha2Ugc3VyZQorICAgICAgICAvL3dlIGRvbid0IHNlbmQgbXVsdGlwbGUgYWN0aW9ucyBhY3Jvc3MgdGhlIHdpcmUKKyAgICAgICAgaWYgKCAhcmVjb3JkQWxsQWN0aW9ucykgYWN0aW9ucy5yZW1vdmUoaW5mbyk7CisgICAgICAgIC8vYWRkIHRoZSBhY3Rpb24KKyAgICAgICAgYWN0aW9ucy5hZGRMYXN0KGluZm8pOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKERlbHRhU2Vzc2lvbiBzZXNzaW9uKSB7CisgICAgICAgIGV4ZWN1dGUoc2Vzc2lvbix0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKERlbHRhU2Vzc2lvbiBzZXNzaW9uLCBib29sZWFuIG5vdGlmeUxpc3RlbmVycykgeworICAgICAgICBpZiAoICF0aGlzLnNlc3Npb25JZC5lcXVhbHMoIHNlc3Npb24uZ2V0SWQoKSApICkKKyAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTZXNzaW9uIGlkIG1pc21hdGNoLCBub3QgZXhlY3V0aW5nIHRoZSBkZWx0YSByZXF1ZXN0Iik7CisgICAgICAgIHNlc3Npb24uYWNjZXNzKCk7CisgICAgICAgIGZvciAoIGludCBpPTA7IGk8YWN0aW9ucy5zaXplKCk7IGkrKyApIHsKKyAgICAgICAgICAgIEF0dHJpYnV0ZUluZm8gaW5mbyA9IChBdHRyaWJ1dGVJbmZvKWFjdGlvbnMuZ2V0KGkpOworICAgICAgICAgICAgc3dpdGNoICggaW5mby5nZXRUeXBlKCkgKSB7CisgICAgICAgICAgICAgICAgY2FzZSBUWVBFX0FUVFJJQlVURTogeworICAgICAgICAgICAgICAgICAgICBpZiAoIGluZm8uZ2V0QWN0aW9uKCkgPT0gQUNUSU9OX1NFVCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uc2V0QXR0cmlidXRlKGluZm8uZ2V0TmFtZSgpLCBpbmZvLmdldFZhbHVlKCksbm90aWZ5TGlzdGVuZXJzLGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgfSAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5yZW1vdmVBdHRyaWJ1dGUoaW5mby5nZXROYW1lKCksbm90aWZ5TGlzdGVuZXJzLGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfS8vY2FzZQorICAgICAgICAgICAgICAgIGNhc2UgVFlQRV9JU05FVzogeworICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLnNldE5ldygoKEJvb2xlYW4paW5mby5nZXRWYWx1ZSgpKS5ib29sZWFuVmFsdWUoKSxmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0vL2Nhc2UKKyAgICAgICAgICAgICAgICBjYXNlIFRZUEVfTUFYSU5URVJWQUw6IHsKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5zZXRNYXhJbmFjdGl2ZUludGVydmFsKCgoSW50ZWdlcilpbmZvLmdldFZhbHVlKCkpLmludFZhbHVlKCksZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9Ly9jYXNlCisgICAgICAgICAgICAgICAgY2FzZSBUWVBFX1BSSU5DSVBBTDogeworICAgICAgICAgICAgICAgICAgICBQcmluY2lwYWwgcCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIGlmICggaW5mby5nZXRBY3Rpb24oKSA9PSBBQ1RJT05fU0VUICkgeworICAgICAgICAgICAgICAgICAgICAgICAgU2VyaWFsaXphYmxlUHJpbmNpcGFsIHNwID0gKFNlcmlhbGl6YWJsZVByaW5jaXBhbClpbmZvLmdldFZhbHVlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwID0gKFByaW5jaXBhbClzcC5nZXRQcmluY2lwYWwoc2Vzc2lvbi5nZXRNYW5hZ2VyKCkuZ2V0Q29udGFpbmVyKCkuZ2V0UmVhbG0oKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5zZXRQcmluY2lwYWwocCxmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0vL2Nhc2UKKyAgICAgICAgICAgICAgICBkZWZhdWx0IDogdGhyb3cgbmV3IGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgYXR0cmlidXRlIGluZm8gdHlwZT0iK2luZm8pOworICAgICAgICAgICAgfS8vc3dpdGNoCisgICAgICAgIH0vL2ZvcgorICAgICAgICBzZXNzaW9uLmVuZEFjY2VzcygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgeworICAgICAgICB3aGlsZSAoIGFjdGlvbnMuc2l6ZSgpID4gMCApIHsKKyAgICAgICAgICAgIEF0dHJpYnV0ZUluZm8gaW5mbyA9IChBdHRyaWJ1dGVJbmZvKWFjdGlvbnMucmVtb3ZlRmlyc3QoKTsKKyAgICAgICAgICAgIGluZm8ucmVjeWNsZSgpOworICAgICAgICAgICAgYWN0aW9uUG9vbC5hZGRMYXN0KGluZm8pOworICAgICAgICB9CisgICAgICAgIGFjdGlvbnMuY2xlYXIoKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIFN0cmluZyBnZXRTZXNzaW9uSWQoKSB7CisgICAgICAgIHJldHVybiBzZXNzaW9uSWQ7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHNldFNlc3Npb25JZChTdHJpbmcgc2Vzc2lvbklkKSB7CisgICAgICAgIHRoaXMuc2Vzc2lvbklkID0gc2Vzc2lvbklkOworICAgICAgICBpZiAoIHNlc3Npb25JZCA9PSBudWxsICkgeworICAgICAgICAgICAgbmV3IEV4Y2VwdGlvbigiU2Vzc2lvbiBJZCBpcyBudWxsIGZvciBzZXRTZXNzaW9uSWQiKS5maWxsSW5TdGFja1RyYWNlKCkucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcHVibGljIGludCBnZXRTaXplKCkgeworICAgICAgICByZXR1cm4gYWN0aW9ucy5zaXplKCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgICAgICBhY3Rpb25zLmNsZWFyKCk7CisgICAgICAgIGFjdGlvblBvb2wuY2xlYXIoKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgcmVhZEV4dGVybmFsKGphdmEuaW8uT2JqZWN0SW5wdXQgaW4pIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uLAorICAgICAgICBqYXZhLmxhbmcuQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIC8vc2Vzc2lvbklkIC0gU3RyaW5nCisgICAgICAgIC8vcmVjb3JkQWxsIC0gYm9vbGVhbgorICAgICAgICAvL3NpemUgLSBpbnQKKyAgICAgICAgLy9BdHRyaWJ1dGVJbmZvIC0gaW4gYW4gYXJyYXkKKyAgICAgICAgcmVzZXQoKTsKKyAgICAgICAgc2Vzc2lvbklkID0gaW4ucmVhZFVURigpOworICAgICAgICByZWNvcmRBbGxBY3Rpb25zID0gaW4ucmVhZEJvb2xlYW4oKTsKKyAgICAgICAgaW50IGNudCA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgaWYgKGFjdGlvbnMgPT0gbnVsbCkKKyAgICAgICAgICAgIGFjdGlvbnMgPSBuZXcgTGlua2VkTGlzdCgpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBhY3Rpb25zLmNsZWFyKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY250OyBpKyspIHsKKyAgICAgICAgICAgIEF0dHJpYnV0ZUluZm8gaW5mbyA9IG51bGw7CisgICAgICAgICAgICBpZiAodGhpcy5hY3Rpb25Qb29sLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBpbmZvID0gKEF0dHJpYnV0ZUluZm8pIGFjdGlvblBvb2wucmVtb3ZlRmlyc3QoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGluZm8gPSBuZXcgQXR0cmlidXRlSW5mbygtMSwtMSxudWxsLG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5mby5yZWFkRXh0ZXJuYWwoaW4pOworICAgICAgICAgICAgYWN0aW9ucy5hZGRMYXN0KGluZm8pOworICAgICAgICB9Ly9mb3IKKyAgICB9CisgICAgICAgIAorCisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZUV4dGVybmFsKGphdmEuaW8uT2JqZWN0T3V0cHV0IG91dCApIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgLy9zZXNzaW9uSWQgLSBTdHJpbmcKKyAgICAgICAgLy9yZWNvcmRBbGwgLSBib29sZWFuCisgICAgICAgIC8vc2l6ZSAtIGludAorICAgICAgICAvL0F0dHJpYnV0ZUluZm8gLSBpbiBhbiBhcnJheQorICAgICAgICBvdXQud3JpdGVVVEYoZ2V0U2Vzc2lvbklkKCkpOworICAgICAgICBvdXQud3JpdGVCb29sZWFuKHJlY29yZEFsbEFjdGlvbnMpOworICAgICAgICBvdXQud3JpdGVJbnQoZ2V0U2l6ZSgpKTsKKyAgICAgICAgZm9yICggaW50IGk9MDsgaTxnZXRTaXplKCk7IGkrKyApIHsKKyAgICAgICAgICAgIEF0dHJpYnV0ZUluZm8gaW5mbyA9IChBdHRyaWJ1dGVJbmZvKWFjdGlvbnMuZ2V0KGkpOworICAgICAgICAgICAgaW5mby53cml0ZUV4dGVybmFsKG91dCk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBBdHRyaWJ1dGVJbmZvIGltcGxlbWVudHMgamF2YS5pby5FeHRlcm5hbGl6YWJsZSB7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIG5hbWUgPSBudWxsOworICAgICAgICBwcml2YXRlIE9iamVjdCB2YWx1ZSA9IG51bGw7CisgICAgICAgIHByaXZhdGUgaW50IGFjdGlvbjsKKyAgICAgICAgcHJpdmF0ZSBpbnQgdHlwZTsKKworICAgICAgICBwdWJsaWMgQXR0cmlidXRlSW5mbygpIHt9CisKKyAgICAgICAgcHVibGljIEF0dHJpYnV0ZUluZm8oaW50IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgICAgIHN1cGVyKCk7CisgICAgICAgICAgICBpbml0KHR5cGUsYWN0aW9uLG5hbWUsdmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgaW5pdChpbnQgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZSkgeworICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgICAgIHRoaXMuYWN0aW9uID0gYWN0aW9uOworICAgICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKKyAgICAgICAgICAgIHJldHVybiB0eXBlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBnZXRBY3Rpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gYWN0aW9uOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICAgICAgcmV0dXJuIG5hbWUuaGFzaENvZGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuYW1lOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgdm9pZCByZWN5Y2xlKCkgeworICAgICAgICAgICAgbmFtZSA9IG51bGw7CisgICAgICAgICAgICB2YWx1ZSA9IG51bGw7CisgICAgICAgICAgICB0eXBlPS0xOworICAgICAgICAgICAgYWN0aW9uPS0xOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICAgICAgICBpZiAoICEgKG8gaW5zdGFuY2VvZiBBdHRyaWJ1dGVJbmZvICkgKSByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBBdHRyaWJ1dGVJbmZvIG90aGVyID0gIChBdHRyaWJ1dGVJbmZvKW87CisgICAgICAgICAgICByZXR1cm4gb3RoZXIuZ2V0TmFtZSgpLmVxdWFscyh0aGlzLmdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyB2b2lkIHJlYWRFeHRlcm5hbChqYXZhLmlvLk9iamVjdElucHV0IGluICkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sCisgICAgICAgICAgICBqYXZhLmxhbmcuQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAvL3R5cGUgLSBpbnQKKyAgICAgICAgICAgIC8vYWN0aW9uIC0gaW50CisgICAgICAgICAgICAvL25hbWUgLSBTdHJpbmcKKyAgICAgICAgICAgIC8vdmFsdWUgLSBvYmplY3QKKyAgICAgICAgICAgIHR5cGUgPSBpbi5yZWFkSW50KCk7CisgICAgICAgICAgICBhY3Rpb24gPSBpbi5yZWFkSW50KCk7CisgICAgICAgICAgICBuYW1lID0gaW4ucmVhZFVURigpOworICAgICAgICAgICAgdmFsdWUgPSBpbi5yZWFkT2JqZWN0KCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZUV4dGVybmFsKGphdmEuaW8uT2JqZWN0T3V0cHV0IG91dCkgdGhyb3dzIGphdmEuaW8uCisgICAgICAgICAgICBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAvL3R5cGUgLSBpbnQKKyAgICAgICAgICAgIC8vYWN0aW9uIC0gaW50CisgICAgICAgICAgICAvL25hbWUgLSBTdHJpbmcKKyAgICAgICAgICAgIC8vdmFsdWUgLSBvYmplY3QKKyAgICAgICAgICAgIG91dC53cml0ZUludChnZXRUeXBlKCkpOworICAgICAgICAgICAgb3V0LndyaXRlSW50KGdldEFjdGlvbigpKTsKKyAgICAgICAgICAgIG91dC53cml0ZVVURihnZXROYW1lKCkpOworICAgICAgICAgICAgb3V0LndyaXRlT2JqZWN0KGdldFZhbHVlKCkpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoIkF0dHJpYnV0ZUluZm9bdHlwZT0iKTsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoZ2V0VHlwZSgpKS5hcHBlbmQoIiwgYWN0aW9uPSIpLmFwcGVuZChnZXRBY3Rpb24oKSk7CisgICAgICAgICAgICBidWYuYXBwZW5kKCIsIG5hbWU9IikuYXBwZW5kKGdldE5hbWUoKSkuYXBwZW5kKCIsIHZhbHVlPSIpLmFwcGVuZChnZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiwgYWRkcj0iKS5hcHBlbmQoc3VwZXIudG9TdHJpbmcoKSkuYXBwZW5kKCJdIik7CisgICAgICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3Nlc3Npb24vRGVsdGFTZXNzaW9uLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvc2Vzc2lvbi9EZWx0YVNlc3Npb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTFhNDU5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3Nlc3Npb24vRGVsdGFTZXNzaW9uLmphdmEKQEAgLTAsMCArMSwxNzM2IEBACisKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5zZXNzaW9uOworCisKK2ltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlU3VwcG9ydDsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uTm90U2VyaWFsaXphYmxlRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaW5jaXBhbDsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uQXR0cmlidXRlTGlzdGVuZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uQmluZGluZ0V2ZW50OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbkJpbmRpbmdMaXN0ZW5lcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb25Db250ZXh0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbkV2ZW50OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbkxpc3RlbmVyOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Db250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlNlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5TZXNzaW9uRXZlbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5TZXNzaW9uTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLkVudW1lcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLlN0cmluZ01hbmFnZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnNlc3Npb24uQ29uc3RhbnRzOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5DbHVzdGVyU2Vzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtLkdlbmVyaWNQcmluY2lwYWw7CisvKioKKyAqCisgKiBTaW1pbGFyIHRvIHRoZSBTdGFuZGFyZFNlc3Npb24sIHRoaXMgY29kZSBpcyBpZGVudGljYWwsIGJ1dCBmb3IgdXBkYXRlCisgKiBhbmQgc29tZSBzbWFsbCBpc3N1ZXMsIHNpbXBseSBjb3BpZWQgaW4gdGhlIGZpcnN0IHJlbGVhc2UuCisgKiBUaGlzIHNlc3Npb24gd2lsbCBrZWVwIHRyYWNrIG9mIGRlbHRhcyBkdXJpbmcgYSByZXF1ZXN0LgorICogPHA+CisgKiA8Yj5JTVBMRU1FTlRBVElPTiBOT1RFPC9iPjogIEFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50cyBib3RoIHRoZQorICogaW50ZXJuYWwgKFNlc3Npb24pIGFuZCBhcHBsaWNhdGlvbiBsZXZlbCAoSHR0cFNlc3Npb24pIHZpZXcgb2YgdGhlIHNlc3Npb24uCisgKiBIb3dldmVyLCBiZWNhdXNlIHRoZSBjbGFzcyBpdHNlbGYgaXMgbm90IGRlY2xhcmVkIHB1YmxpYywgSmF2YSBsb2dpYyBvdXRzaWRlCisgKiBvZiB0aGUgPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5zZXNzaW9uPC9jb2RlPiBwYWNrYWdlIGNhbm5vdCBjYXN0IGFuCisgKiBIdHRwU2Vzc2lvbiB2aWV3IG9mIHRoaXMgaW5zdGFuY2UgYmFjayB0byBhIFNlc3Npb24gdmlldy4KKyAqIDxwPgorICogPGI+SU1QTEVNRU5UQVRJT04gTk9URTwvYj46ICBJZiB5b3UgYWRkIGZpZWxkcyB0byB0aGlzIGNsYXNzLCB5b3UgbXVzdAorICogbWFrZSBzdXJlIHRoYXQgeW91IGNhcnJ5IHRoZW0gb3ZlciBpbiB0aGUgcmVhZC93cml0ZU9iamVjdCBtZXRob2RzIHNvCisgKiB0aGF0IHRoaXMgY2xhc3MgaXMgcHJvcGVybHkgc2VyaWFsaXplZC4KKyAqCisgKiBAYXV0aG9yIEZpbGlwIEhhbmlrCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEBhdXRob3IgU2VhbiBMZWdhc3NpY2sKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpvbkBsYXRjaGtleS5jb20iPkpvbiBTLiBTdGV2ZW5zPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgRGVsdGFTZXNzaW9uCisgICAgaW1wbGVtZW50cyBIdHRwU2Vzc2lvbiwgU2Vzc2lvbiwgU2VyaWFsaXphYmxlLAorICAgICAgICAgICAgICAgQ2x1c3RlclNlc3Npb24geworCisgICAgcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2cgbG9nID0KKyAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5LmdldExvZyggRGVsdGFNYW5hZ2VyLmNsYXNzICk7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgU2Vzc2lvbiBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBNYW5hZ2VyLgorICAgICAqCisgICAgICogQHBhcmFtIG1hbmFnZXIgVGhlIG1hbmFnZXIgd2l0aCB3aGljaCB0aGlzIFNlc3Npb24gaXMgYXNzb2NpYXRlZAorICAgICAqLworICAgIHB1YmxpYyBEZWx0YVNlc3Npb24oTWFuYWdlciBtYW5hZ2VyKSB7CisKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBkdW1teSBhdHRyaWJ1dGUgdmFsdWUgc2VyaWFsaXplZCB3aGVuIGEgTm90U2VyaWFsaXphYmxlRXhjZXB0aW9uIGlzCisgICAgICogZW5jb3VudGVyZWQgaW4gPGNvZGU+d3JpdGVPYmplY3QoKTwvY29kZT4uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVF9TRVJJQUxJWkVEID0KKyAgICAgICAgIl9fX05PVF9TRVJJQUxJWkFCTEVfRVhDRVBUSU9OX19fIjsKKworCisgICAgLyoqCisgICAgICogVGhlIGNvbGxlY3Rpb24gb2YgdXNlciBkYXRhIGF0dHJpYnV0ZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgU2Vzc2lvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIEhhc2hNYXAgYXR0cmlidXRlcyA9IG5ldyBIYXNoTWFwKCk7CisKKworICAgIC8qKgorICAgICAqIFRoZSBhdXRoZW50aWNhdGlvbiB0eXBlIHVzZWQgdG8gYXV0aGVudGljYXRlIG91ciBjYWNoZWQgUHJpbmNpcGFsLAorICAgICAqIGlmIGFueS4gIE5PVEU6ICBUaGlzIHZhbHVlIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgc2VyaWFsaXplZAorICAgICAqIHZlcnNpb24gb2YgdGhpcyBvYmplY3QuCisgICAgICovCisgICAgcHJpdmF0ZSB0cmFuc2llbnQgU3RyaW5nIGF1dGhUeXBlID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIDxjb2RlPmphdmEubGFuZy5NZXRob2Q8L2NvZGU+IGZvciB0aGUKKyAgICAgKiA8Y29kZT5maXJlQ29udGFpbmVyRXZlbnQoKTwvY29kZT4gbWV0aG9kIG9mIHRoZQorICAgICAqIDxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZENvbnRleHQ8L2NvZGU+IG1ldGhvZCwKKyAgICAgKiBpZiBvdXIgQ29udGV4dCBpbXBsZW1lbnRhdGlvbiBpcyBvZiB0aGlzIGNsYXNzLiAgVGhpcyB2YWx1ZSBpcworICAgICAqIGNvbXB1dGVkIGR5bmFtaWNhbGx5IHRoZSBmaXJzdCB0aW1lIGl0IGlzIG5lZWRlZCwgb3IgYWZ0ZXIKKyAgICAgKiBhIHNlc3Npb24gcmVsb2FkIChzaW5jZSBpdCBpcyBkZWNsYXJlZCB0cmFuc2llbnQpLgorICAgICAqLworICAgIHByaXZhdGUgdHJhbnNpZW50IE1ldGhvZCBjb250YWluZXJFdmVudE1ldGhvZCA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBtZXRob2Qgc2lnbmF0dXJlIGZvciB0aGUgPGNvZGU+ZmlyZUNvbnRhaW5lckV2ZW50PC9jb2RlPiBtZXRob2QuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3MgY29udGFpbmVyRXZlbnRUeXBlc1tdID0KKyAgICB7IFN0cmluZy5jbGFzcywgT2JqZWN0LmNsYXNzIH07CisKKworICAgIC8qKgorICAgICAqIFRoZSB0aW1lIHRoaXMgc2Vzc2lvbiB3YXMgY3JlYXRlZCwgaW4gbWlsbGlzZWNvbmRzIHNpbmNlIG1pZG5pZ2h0LAorICAgICAqIEphbnVhcnkgMSwgMTk3MCBHTVQuCisgICAgICovCisgICAgcHJpdmF0ZSBsb25nIGNyZWF0aW9uVGltZSA9IDBMOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVidWdnaW5nIGRldGFpbCBsZXZlbCBmb3IgdGhpcyBjb21wb25lbnQuICBOT1RFOiAgVGhpcyB2YWx1ZQorICAgICAqIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgc2VyaWFsaXplZCB2ZXJzaW9uIG9mIHRoaXMgb2JqZWN0LgorICAgICAqLworICAgIHByaXZhdGUgdHJhbnNpZW50IGludCBkZWJ1ZyA9IDA7CisKKworICAgIC8qKgorICAgICAqIFdlIGFyZSBjdXJyZW50bHkgcHJvY2Vzc2luZyBhIHNlc3Npb24gZXhwaXJhdGlvbiwgc28gYnlwYXNzCisgICAgICogY2VydGFpbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gdGVzdHMuICBOT1RFOiAgVGhpcyB2YWx1ZSBpcyBub3QKKyAgICAgKiBpbmNsdWRlZCBpbiB0aGUgc2VyaWFsaXplZCB2ZXJzaW9uIG9mIHRoaXMgb2JqZWN0LgorICAgICAqLworICAgIHByaXZhdGUgdHJhbnNpZW50IGJvb2xlYW4gZXhwaXJpbmcgPSBmYWxzZTsKKworCisgICAgLyoqCisgICAgICogVGhlIGZhY2FkZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBzZXNzaW9uLiAgTk9URTogIFRoaXMgdmFsdWUgaXMgbm90CisgICAgICogaW5jbHVkZWQgaW4gdGhlIHNlcmlhbGl6ZWQgdmVyc2lvbiBvZiB0aGlzIG9iamVjdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHRyYW5zaWVudCBEZWx0YVNlc3Npb25GYWNhZGUgZmFjYWRlID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIHNlc3Npb24gaWRlbnRpZmllciBvZiB0aGlzIFNlc3Npb24uCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgaWQgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBEZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBkZXNjcmliaW5nIHRoaXMgU2Vzc2lvbiBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgaW5mbyA9ICJEZWx0YVNlc3Npb24vMS4wIjsKKworCisgICAgLyoqCisgICAgICogVGhlIGxhc3QgYWNjZXNzZWQgdGltZSBmb3IgdGhpcyBTZXNzaW9uLgorICAgICAqLworICAgIHByaXZhdGUgbG9uZyBsYXN0QWNjZXNzZWRUaW1lID0gY3JlYXRpb25UaW1lOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc2Vzc2lvbiBldmVudCBsaXN0ZW5lcnMgZm9yIHRoaXMgU2Vzc2lvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHRyYW5zaWVudCBBcnJheUxpc3QgbGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdCgpOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgTWFuYWdlciB3aXRoIHdoaWNoIHRoaXMgU2Vzc2lvbiBpcyBhc3NvY2lhdGVkLgorICAgICAqLworICAgIHByaXZhdGUgdHJhbnNpZW50IE1hbmFnZXIgbWFuYWdlciA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBtYXhpbXVtIHRpbWUgaW50ZXJ2YWwsIGluIHNlY29uZHMsIGJldHdlZW4gY2xpZW50IHJlcXVlc3RzIGJlZm9yZQorICAgICAqIHRoZSBzZXJ2bGV0IGNvbnRhaW5lciBtYXkgaW52YWxpZGF0ZSB0aGlzIHNlc3Npb24uICBBIG5lZ2F0aXZlIHRpbWUKKyAgICAgKiBpbmRpY2F0ZXMgdGhhdCB0aGUgc2Vzc2lvbiBzaG91bGQgbmV2ZXIgdGltZSBvdXQuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgbWF4SW5hY3RpdmVJbnRlcnZhbCA9IC0xOworCisKKyAgICAvKioKKyAgICAgKiBGbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGlzIHNlc3Npb24gaXMgbmV3IG9yIG5vdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaXNOZXcgPSBmYWxzZTsKKworCisgICAgLyoqCisgICAgICogRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhpcyBzZXNzaW9uIGlzIHZhbGlkIG9yIG5vdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaXNWYWxpZCA9IGZhbHNlOworCisKKyAgICAvKioKKyAgICAgKiBJbnRlcm5hbCBub3RlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBzZXNzaW9uIGJ5IENhdGFsaW5hIGNvbXBvbmVudHMKKyAgICAgKiBhbmQgZXZlbnQgbGlzdGVuZXJzLiAgPGI+SU1QTEVNRU5UQVRJT04gTk9URTo8L2I+IFRoaXMgb2JqZWN0IGlzCisgICAgICogPGVtPm5vdDwvZW0+IHNhdmVkIGFuZCByZXN0b3JlZCBhY3Jvc3Mgc2Vzc2lvbiBzZXJpYWxpemF0aW9ucyEKKyAgICAgKi8KKyAgICBwcml2YXRlIHRyYW5zaWVudCBIYXNoTWFwIG5vdGVzID0gbmV3IEhhc2hNYXAoKTsKKworCisgICAgLyoqCisgICAgICogVGhlIGF1dGhlbnRpY2F0ZWQgUHJpbmNpcGFsIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNlc3Npb24sIGlmIGFueS4KKyAgICAgKiA8Yj5JTVBMRU1FTlRBVElPTiBOT1RFOjwvYj4gIFRoaXMgb2JqZWN0IGlzIDxpPm5vdDwvaT4gc2F2ZWQgYW5kCisgICAgICogcmVzdG9yZWQgYWNyb3NzIHNlc3Npb24gc2VyaWFsaXphdGlvbnMhCisgICAgICovCisgICAgcHJpdmF0ZSB0cmFuc2llbnQgUHJpbmNpcGFsIHByaW5jaXBhbCA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzdHJpbmcgbWFuYWdlciBmb3IgdGhpcyBwYWNrYWdlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZ01hbmFnZXIgc20gPQorICAgICAgICBTdHJpbmdNYW5hZ2VyLmdldE1hbmFnZXIoQ29uc3RhbnRzLlBhY2thZ2UpOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgSFRUUCBzZXNzaW9uIGNvbnRleHQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc2Vzc2lvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBIdHRwU2Vzc2lvbkNvbnRleHQgc2Vzc2lvbkNvbnRleHQgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgcHJvcGVydHkgY2hhbmdlIHN1cHBvcnQgZm9yIHRoaXMgY29tcG9uZW50LiAgTk9URTogIFRoaXMgdmFsdWUKKyAgICAgKiBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIHNlcmlhbGl6ZWQgdmVyc2lvbiBvZiB0aGlzIG9iamVjdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHRyYW5zaWVudCBQcm9wZXJ0eUNoYW5nZVN1cHBvcnQgc3VwcG9ydCA9CisgICAgICAgIG5ldyBQcm9wZXJ0eUNoYW5nZVN1cHBvcnQodGhpcyk7CisKKworICAgIC8qKgorICAgICAqIFRoZSBjdXJyZW50IGFjY2Vzc2VkIHRpbWUgZm9yIHRoaXMgc2Vzc2lvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIGxvbmcgdGhpc0FjY2Vzc2VkVGltZSA9IGNyZWF0aW9uVGltZTsKKworCisgICAgLyoqCisgICAgICogb25seSB0aGUgcHJpbWFyeSBzZXNzaW9uIHdpbGwgZXhwaXJlLCBvciBiZSBhYmxlIHRvCisgICAgICogZXhwaXJlIGR1ZSB0byBpbmFjdGl2aXR5LiBUaGlzIGlzIHNldCB0byBmYWxzZQorICAgICAqIGFzIHNvb24gYXMgSSByZWNlaXZlIHRoaXMgc2Vzc2lvbiBvdmVyIHRoZSB3aXJlIGluCisgICAgICogYSBzZXNzaW9uIG1lc3NhZ2UuIFRoYXQgbWVhbnMgdGhhdCBzb21lb25lIGVsc2UgaGFzCisgICAgICogbWFkZSBhIHJlcXVlc3Qgb24gYW5vdGhlciBzZXJ2ZXIuCisgICAgICovCisgICAgcHJpdmF0ZSB0cmFuc2llbnQgYm9vbGVhbiBpc1ByaW1hcnlTZXNzaW9uID0gdHJ1ZTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgZGVsdGEgcmVxdWVzdCBjb250YWlucyBhbGwgdGhlIGFjdGlvbiBpbmZvCisgICAgICogCisgICAgICovCisgICAgcHJpdmF0ZSB0cmFuc2llbnQgRGVsdGFSZXF1ZXN0IGRlbHRhUmVxdWVzdCA9IG51bGw7CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogTGFzdCB0aW1lIHRoZSBzZXNzaW9uIHdhcyByZXBsaWNhdGQsIHVzZWQgZm9yIGRpc3RyaWJ1dGVkIAorICAgICAqIGV4cGlyaW5nIG9mIHNlc3Npb24KKyAgICAgKi8KKyAgICBwcml2YXRlIHRyYW5zaWVudCBsb25nIGxhc3RUaW1lUmVwbGljYXRlZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIAorICAgIC8qKgorICAgICAqIFRoZSBhY2Nlc3MgY291bnQgZm9yIHRoaXMgc2Vzc2lvbgorICAgICAqLworICAgIHByb3RlY3RlZCB0cmFuc2llbnQgaW50IGFjY2Vzc0NvdW50ID0gMDsKKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTZXNzaW9uIFByb3BlcnRpZXMKKworICAgIC8qKgorICAgICAqIHJldHVybnMgdHJ1ZSBpZiB0aGlzIHNlc3Npb24gaXMgdGhlIHByaW1hcnkgc2Vzc2lvbiwgaWYgdGhhdCBpcyB0aGUKKyAgICAgKiBjYXNlLCB0aGUgbWFuYWdlciBjYW4gZXhwaXJlIGl0IHVwb24gdGltZW91dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ByaW1hcnlTZXNzaW9uKCkgeworICAgICAgIHJldHVybiBpc1ByaW1hcnlTZXNzaW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgd2hldGhlciB0aGlzIGlzIHRoZSBwcmltYXJ5IHNlc3Npb24gb3Igbm90LgorICAgICAqIEBwYXJhbSBwcmltYXJ5U2Vzc2lvbiBGbGFnIHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJpbWFyeVNlc3Npb24oYm9vbGVhbiBwcmltYXJ5U2Vzc2lvbikgeworICAgICAgICB0aGlzLmlzUHJpbWFyeVNlc3Npb249cHJpbWFyeVNlc3Npb247CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBhdXRoZW50aWNhdGlvbiB0eXBlIHVzZWQgdG8gYXV0aGVudGljYXRlIG91ciBjYWNoZWQKKyAgICAgKiBQcmluY2lwYWwsIGlmIGFueS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEF1dGhUeXBlKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5hdXRoVHlwZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYXV0aGVudGljYXRpb24gdHlwZSB1c2VkIHRvIGF1dGhlbnRpY2F0ZSBvdXIgY2FjaGVkCisgICAgICogUHJpbmNpcGFsLCBpZiBhbnkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXV0aFR5cGUgVGhlIG5ldyBjYWNoZWQgYXV0aGVudGljYXRpb24gdHlwZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEF1dGhUeXBlKFN0cmluZyBhdXRoVHlwZSkgeworCisgICAgICAgIFN0cmluZyBvbGRBdXRoVHlwZSA9IHRoaXMuYXV0aFR5cGU7CisgICAgICAgIHRoaXMuYXV0aFR5cGUgPSBhdXRoVHlwZTsKKyAgICAgICAgc3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoImF1dGhUeXBlIiwgb2xkQXV0aFR5cGUsIHRoaXMuYXV0aFR5cGUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNyZWF0aW9uIHRpbWUgZm9yIHRoaXMgc2Vzc2lvbi4gIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUKKyAgICAgKiBNYW5hZ2VyIHdoZW4gYW4gZXhpc3RpbmcgU2Vzc2lvbiBpbnN0YW5jZSBpcyByZXVzZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGltZSBUaGUgbmV3IGNyZWF0aW9uIHRpbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDcmVhdGlvblRpbWUobG9uZyB0aW1lKSB7CisKKyAgICAgICAgdGhpcy5jcmVhdGlvblRpbWUgPSB0aW1lOworICAgICAgICB0aGlzLmxhc3RBY2Nlc3NlZFRpbWUgPSB0aW1lOworICAgICAgICB0aGlzLnRoaXNBY2Nlc3NlZFRpbWUgPSB0aW1lOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNlc3Npb24gaWRlbnRpZmllciBmb3IgdGhpcyBzZXNzaW9uLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7CisKKyAgICAgICAgcmV0dXJuICh0aGlzLmlkKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzZXNzaW9uIGlkZW50aWZpZXIgZm9yIHRoaXMgc2Vzc2lvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpZCBUaGUgbmV3IHNlc3Npb24gaWRlbnRpZmllcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBpZCkgeworCisgICAgICAgIGlmICgodGhpcy5pZCAhPSBudWxsKSAmJiAobWFuYWdlciAhPSBudWxsKSkKKyAgICAgICAgICAgIG1hbmFnZXIucmVtb3ZlKHRoaXMpOworCisgICAgICAgIHRoaXMuaWQgPSBpZDsKKworICAgICAgICBpZiAobWFuYWdlciAhPSBudWxsKQorICAgICAgICAgICAgbWFuYWdlci5hZGQodGhpcyk7CisgICAgICAgIHRlbGxOZXcoKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEluZm9ybSB0aGUgbGlzdGVuZXJzIGFib3V0IHRoZSBuZXcgc2Vzc2lvbi4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlbGxOZXcoKSB7CisKKyAgICAgICAgLy8gTm90aWZ5IGludGVyZXN0ZWQgc2Vzc2lvbiBldmVudCBsaXN0ZW5lcnMKKyAgICAgICAgZmlyZVNlc3Npb25FdmVudChTZXNzaW9uLlNFU1NJT05fQ1JFQVRFRF9FVkVOVCwgbnVsbCk7CisKKyAgICAgICAgLy8gTm90aWZ5IGludGVyZXN0ZWQgYXBwbGljYXRpb24gZXZlbnQgbGlzdGVuZXJzCisgICAgICAgIENvbnRleHQgY29udGV4dCA9IChDb250ZXh0KSBtYW5hZ2VyLmdldENvbnRhaW5lcigpOworICAgICAgICAvL2ZpeCBmb3Igc3RhbmRhbG9uZSBtYW5hZ2VyIHdpdGhvdXQgY29udGFpbmVyCisgICAgICAgIGlmICggY29udGV4dCAhPSBudWxsICkgeyAKKyAgICAgICAgICAgIE9iamVjdCBsaXN0ZW5lcnNbXSA9IGNvbnRleHQuZ2V0QXBwbGljYXRpb25MaWZlY3ljbGVMaXN0ZW5lcnMoKTsKKyAgICAgICAgICAgIGlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEh0dHBTZXNzaW9uRXZlbnQgZXZlbnQgPQorICAgICAgICAgICAgICAgICAgICBuZXcgSHR0cFNlc3Npb25FdmVudChnZXRTZXNzaW9uKCkpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghIChsaXN0ZW5lcnNbaV0gaW5zdGFuY2VvZiBIdHRwU2Vzc2lvbkxpc3RlbmVyKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICBIdHRwU2Vzc2lvbkxpc3RlbmVyIGxpc3RlbmVyID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChIdHRwU2Vzc2lvbkxpc3RlbmVyKSBsaXN0ZW5lcnNbaV07CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaXJlQ29udGFpbmVyRXZlbnQoY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmVmb3JlU2Vzc2lvbkNyZWF0ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLnNlc3Npb25DcmVhdGVkKGV2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpcmVDb250YWluZXJFdmVudChjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZnRlclNlc3Npb25DcmVhdGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcmVDb250YWluZXJFdmVudChjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWZ0ZXJTZXNzaW9uQ3JlYXRlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgLSBzaG91bGQgd2UgZG8gYW55dGhpbmcgYmVzaWRlcyBsb2cgdGhlc2U/CisgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3Ioc20uZ2V0U3RyaW5nKCJzdGFuZGFyZFNlc3Npb24uc2Vzc2lvbkV2ZW50IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0vL2VuZCBpZgorICAgICAgICAvL2VuZCBmaXgKKworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBTZXNzaW9uIGltcGxlbWVudGF0aW9uIGFuZAorICAgICAqIHRoZSBjb3JyZXNwb25kaW5nIHZlcnNpb24gbnVtYmVyLCBpbiB0aGUgZm9ybWF0CisgICAgICogPGNvZGU+Jmx0O2Rlc2NyaXB0aW9uJmd0Oy8mbHQ7dmVyc2lvbiZndDs8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5mbygpIHsKKworICAgICAgICByZXR1cm4gKGluZm8pOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGxhc3QgdGltZSB0aGUgY2xpZW50IHNlbnQgYSByZXF1ZXN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzCisgICAgICogc2Vzc2lvbiwgYXMgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgc2luY2UgbWlkbmlnaHQsIEphbnVhcnkgMSwgMTk3MAorICAgICAqIEdNVC4gIEFjdGlvbnMgdGhhdCB5b3VyIGFwcGxpY2F0aW9uIHRha2VzLCBzdWNoIGFzIGdldHRpbmcgb3Igc2V0dGluZworICAgICAqIGEgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzZXNzaW9uLCBkbyBub3QgYWZmZWN0IHRoZSBhY2Nlc3MgdGltZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRMYXN0QWNjZXNzZWRUaW1lKCkgeworICAgICAgICBpZiAoICFpc1ZhbGlkICkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICBzbS5nZXRTdHJpbmcoInN0YW5kYXJkU2Vzc2lvbi5nZXRMYXN0QWNjZXNzZWRUaW1lIikpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICh0aGlzLmxhc3RBY2Nlc3NlZFRpbWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIE1hbmFnZXIgd2l0aGluIHdoaWNoIHRoaXMgU2Vzc2lvbiBpcyB2YWxpZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWFuYWdlciBnZXRNYW5hZ2VyKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5tYW5hZ2VyKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBNYW5hZ2VyIHdpdGhpbiB3aGljaCB0aGlzIFNlc3Npb24gaXMgdmFsaWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFuYWdlciBUaGUgbmV3IE1hbmFnZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNYW5hZ2VyKE1hbmFnZXIgbWFuYWdlcikgeworCisgICAgICAgIHRoaXMubWFuYWdlciA9IG1hbmFnZXI7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbWF4aW11bSB0aW1lIGludGVydmFsLCBpbiBzZWNvbmRzLCBiZXR3ZWVuIGNsaWVudCByZXF1ZXN0cworICAgICAqIGJlZm9yZSB0aGUgc2VydmxldCBjb250YWluZXIgd2lsbCBpbnZhbGlkYXRlIHRoZSBzZXNzaW9uLiAgQSBuZWdhdGl2ZQorICAgICAqIHRpbWUgaW5kaWNhdGVzIHRoYXQgdGhlIHNlc3Npb24gc2hvdWxkIG5ldmVyIHRpbWUgb3V0LgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0TWF4SW5hY3RpdmVJbnRlcnZhbCgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMubWF4SW5hY3RpdmVJbnRlcnZhbCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbWF4aW11bSB0aW1lIGludGVydmFsLCBpbiBzZWNvbmRzLCBiZXR3ZWVuIGNsaWVudCByZXF1ZXN0cworICAgICAqIGJlZm9yZSB0aGUgc2VydmxldCBjb250YWluZXIgd2lsbCBpbnZhbGlkYXRlIHRoZSBzZXNzaW9uLiAgQSBuZWdhdGl2ZQorICAgICAqIHRpbWUgaW5kaWNhdGVzIHRoYXQgdGhlIHNlc3Npb24gc2hvdWxkIG5ldmVyIHRpbWUgb3V0LgorICAgICAqCisgICAgICogQHBhcmFtIGludGVydmFsIFRoZSBuZXcgbWF4aW11bSBpbnRlcnZhbAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1heEluYWN0aXZlSW50ZXJ2YWwoaW50IGludGVydmFsKSB7CisgICAgICAgIHNldE1heEluYWN0aXZlSW50ZXJ2YWwoaW50ZXJ2YWwsdHJ1ZSk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHNldE1heEluYWN0aXZlSW50ZXJ2YWwoaW50IGludGVydmFsLCBib29sZWFuIGFkZERlbHRhUmVxdWVzdCkgeworCisgICAgICAgIHRoaXMubWF4SW5hY3RpdmVJbnRlcnZhbCA9IGludGVydmFsOworICAgICAgICBpZiAoaXNWYWxpZCAmJiBpbnRlcnZhbCA9PSAwKSB7CisgICAgICAgICAgICBleHBpcmUoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICggYWRkRGVsdGFSZXF1ZXN0ICYmIChkZWx0YVJlcXVlc3QhPW51bGwpICkgZGVsdGFSZXF1ZXN0LnNldE1heEluYWN0aXZlSW50ZXJ2YWwoaW50ZXJ2YWwpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgPGNvZGU+aXNOZXc8L2NvZGU+IGZsYWcgZm9yIHRoaXMgc2Vzc2lvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpc05ldyBUaGUgbmV3IHZhbHVlIGZvciB0aGUgPGNvZGU+aXNOZXc8L2NvZGU+IGZsYWcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXROZXcoYm9vbGVhbiBpc05ldykgeworICAgICAgICBzZXROZXcoaXNOZXcsdHJ1ZSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNldE5ldyhib29sZWFuIGlzTmV3LCBib29sZWFuIGFkZERlbHRhUmVxdWVzdCkgeworICAgICAgICB0aGlzLmlzTmV3ID0gaXNOZXc7CisgICAgICAgIGlmIChhZGREZWx0YVJlcXVlc3QgJiYgKGRlbHRhUmVxdWVzdCE9bnVsbCkpIGRlbHRhUmVxdWVzdC5zZXROZXcoaXNOZXcpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBhdXRoZW50aWNhdGVkIFByaW5jaXBhbCB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFNlc3Npb24uCisgICAgICogVGhpcyBwcm92aWRlcyBhbiA8Y29kZT5BdXRoZW50aWNhdG9yPC9jb2RlPiB3aXRoIGEgbWVhbnMgdG8gY2FjaGUgYQorICAgICAqIHByZXZpb3VzbHkgYXV0aGVudGljYXRlZCBQcmluY2lwYWwsIGFuZCBhdm9pZCBwb3RlbnRpYWxseSBleHBlbnNpdmUKKyAgICAgKiA8Y29kZT5SZWFsbS5hdXRoZW50aWNhdGUoKTwvY29kZT4gY2FsbHMgb24gZXZlcnkgcmVxdWVzdC4gIElmIHRoZXJlCisgICAgICogaXMgbm8gY3VycmVudCBhc3NvY2lhdGVkIFByaW5jaXBhbCwgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBQcmluY2lwYWwgZ2V0UHJpbmNpcGFsKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5wcmluY2lwYWwpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGF1dGhlbnRpY2F0ZWQgUHJpbmNpcGFsIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgU2Vzc2lvbi4KKyAgICAgKiBUaGlzIHByb3ZpZGVzIGFuIDxjb2RlPkF1dGhlbnRpY2F0b3I8L2NvZGU+IHdpdGggYSBtZWFucyB0byBjYWNoZSBhCisgICAgICogcHJldmlvdXNseSBhdXRoZW50aWNhdGVkIFByaW5jaXBhbCwgYW5kIGF2b2lkIHBvdGVudGlhbGx5IGV4cGVuc2l2ZQorICAgICAqIDxjb2RlPlJlYWxtLmF1dGhlbnRpY2F0ZSgpPC9jb2RlPiBjYWxscyBvbiBldmVyeSByZXF1ZXN0LgorICAgICAqCisgICAgICogQHBhcmFtIHByaW5jaXBhbCBUaGUgbmV3IFByaW5jaXBhbCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByaW5jaXBhbChQcmluY2lwYWwgcHJpbmNpcGFsKSB7CisgICAgICAgIHNldFByaW5jaXBhbChwcmluY2lwYWwsdHJ1ZSk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHNldFByaW5jaXBhbChQcmluY2lwYWwgcHJpbmNpcGFsLGJvb2xlYW4gYWRkRGVsdGFSZXF1ZXN0KSB7CisgICAgICAgIFByaW5jaXBhbCBvbGRQcmluY2lwYWwgPSB0aGlzLnByaW5jaXBhbDsKKyAgICAgICAgdGhpcy5wcmluY2lwYWwgPSBwcmluY2lwYWw7CisgICAgICAgIHN1cHBvcnQuZmlyZVByb3BlcnR5Q2hhbmdlKCJwcmluY2lwYWwiLCBvbGRQcmluY2lwYWwsIHRoaXMucHJpbmNpcGFsKTsKKyAgICAgICAgaWYgKGFkZERlbHRhUmVxdWVzdCAmJiAoZGVsdGFSZXF1ZXN0IT1udWxsKSkgZGVsdGFSZXF1ZXN0LnNldFByaW5jaXBhbChwcmluY2lwYWwpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSA8Y29kZT5IdHRwU2Vzc2lvbjwvY29kZT4gZm9yIHdoaWNoIHRoaXMgb2JqZWN0CisgICAgICogaXMgdGhlIGZhY2FkZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgSHR0cFNlc3Npb24gZ2V0U2Vzc2lvbigpIHsKKworICAgICAgICBpZiAoZmFjYWRlID09IG51bGwpeworICAgICAgICAgICAgaWYgKFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSAhPSBudWxsKXsKKyAgICAgICAgICAgICAgICBmaW5hbCBEZWx0YVNlc3Npb24gZnNlc3Npb24gPSB0aGlzOworICAgICAgICAgICAgICAgIGZhY2FkZSA9IChEZWx0YVNlc3Npb25GYWNhZGUpQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRBY3Rpb24oKXsKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGVsdGFTZXNzaW9uRmFjYWRlKGZzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmYWNhZGUgPSBuZXcgRGVsdGFTZXNzaW9uRmFjYWRlKHRoaXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAoZmFjYWRlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSA8Y29kZT5pc1ZhbGlkPC9jb2RlPiBmbGFnIGZvciB0aGlzIHNlc3Npb24uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpIHsKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgaWYgKHRoaXMuZXhwaXJpbmcpeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKGFjY2Vzc0NvdW50ID4gMCApIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAobWF4SW5hY3RpdmVJbnRlcnZhbCA+PSAwKSB7CisgICAgICAgICAgICBsb25nIHRpbWVOb3cgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgIGludCB0aW1lSWRsZSA9IChpbnQpICgodGltZU5vdyAtIGxhc3RBY2Nlc3NlZFRpbWUpIC8gMTAwMEwpOworICAgICAgICAgICAgaWYgKCAodGltZUlkbGUgPj0gbWF4SW5hY3RpdmVJbnRlcnZhbCkgJiYgKGlzUHJpbWFyeVNlc3Npb24oKSkgKSB7CisgICAgICAgICAgICAgICAgZXhwaXJlKHRydWUpOworICAgICAgICAgICAgfSBlbHNlIGlmICggdGltZUlkbGUgPj0gKDIqbWF4SW5hY3RpdmVJbnRlcnZhbCkgKSB7CisgICAgICAgICAgICAgICAgLy9pZiB0aGUgc2Vzc2lvbiBoYXMgYmVlbiBpZGxlIHR3aWNlIGFzIGxvbmcgYXMgYWxsb3dlZCwKKyAgICAgICAgICAgICAgICAvL3RoZSBwcmltYXJ5IHNlc3Npb24gaGFzIHByb2JhYmx5IGNyYXNoZWQsIGFuZCBubyBvdGhlcgorICAgICAgICAgICAgICAgIC8vcmVxdWVzdHMgYXJlIGNvbWluZyBpbi4gdGhhdCBpcyB3aHkgd2UgZG8gdGhpcy4gb3RoZXJ3aXNlCisgICAgICAgICAgICAgICAgLy93ZSB3b3VsZCBoYXZlIGEgbWVtb3J5IGxlYWsKKyAgICAgICAgICAgICAgICBleHBpcmUodHJ1ZSxmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKHRoaXMuaXNWYWxpZCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIDxjb2RlPmlzVmFsaWQ8L2NvZGU+IGZsYWcgZm9yIHRoaXMgc2Vzc2lvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpc1ZhbGlkIFRoZSBuZXcgdmFsdWUgZm9yIHRoZSA8Y29kZT5pc1ZhbGlkPC9jb2RlPiBmbGFnCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VmFsaWQoYm9vbGVhbiBpc1ZhbGlkKSB7CisKKyAgICAgICAgdGhpcy5pc1ZhbGlkID0gaXNWYWxpZDsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU2Vzc2lvbiBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBVcGRhdGUgdGhlIGFjY2Vzc2VkIHRpbWUgaW5mb3JtYXRpb24gZm9yIHRoaXMgc2Vzc2lvbi4gIFRoaXMgbWV0aG9kCisgICAgICogc2hvdWxkIGJlIGNhbGxlZCBieSB0aGUgY29udGV4dCB3aGVuIGEgcmVxdWVzdCBjb21lcyBpbiBmb3IgYSBwYXJ0aWN1bGFyCisgICAgICogc2Vzc2lvbiwgZXZlbiBpZiB0aGUgYXBwbGljYXRpb24gZG9lcyBub3QgcmVmZXJlbmNlIGl0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFjY2VzcygpIHsKKworICAgICAgICB0aGlzLmxhc3RBY2Nlc3NlZFRpbWUgPSB0aGlzLnRoaXNBY2Nlc3NlZFRpbWU7CisgICAgICAgIHRoaXMudGhpc0FjY2Vzc2VkVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCisgICAgICAgIGV2YWx1YXRlSWZWYWxpZCgpOworICAgICAgICAKKyAgICAgICAgYWNjZXNzQ291bnQrKzsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIGVuZEFjY2VzcygpIHsKKyAgICAgICAgaXNOZXcgPSBmYWxzZTsKKyAgICAgICAgYWNjZXNzQ291bnQtLTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEFkZCBhIHNlc3Npb24gZXZlbnQgbGlzdGVuZXIgdG8gdGhpcyBjb21wb25lbnQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkU2Vzc2lvbkxpc3RlbmVyKFNlc3Npb25MaXN0ZW5lciBsaXN0ZW5lcikgeworCisgICAgICAgIHN5bmNocm9uaXplZCAobGlzdGVuZXJzKSB7CisgICAgICAgICAgICBsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtIHRoZSBpbnRlcm5hbCBwcm9jZXNzaW5nIHJlcXVpcmVkIHRvIGludmFsaWRhdGUgdGhpcyBzZXNzaW9uLAorICAgICAqIHdpdGhvdXQgdHJpZ2dlcmluZyBhbiBleGNlcHRpb24gaWYgdGhlIHNlc3Npb24gaGFzIGFscmVhZHkgZXhwaXJlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleHBpcmUoKSB7CisKKyAgICAgICAgZXhwaXJlKHRydWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtIHRoZSBpbnRlcm5hbCBwcm9jZXNzaW5nIHJlcXVpcmVkIHRvIGludmFsaWRhdGUgdGhpcyBzZXNzaW9uLAorICAgICAqIHdpdGhvdXQgdHJpZ2dlcmluZyBhbiBleGNlcHRpb24gaWYgdGhlIHNlc3Npb24gaGFzIGFscmVhZHkgZXhwaXJlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBub3RpZnkgU2hvdWxkIHdlIG5vdGlmeSBsaXN0ZW5lcnMgYWJvdXQgdGhlIGRlbWlzZSBvZgorICAgICAqICB0aGlzIHNlc3Npb24/CisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhwaXJlKGJvb2xlYW4gbm90aWZ5KSB7CisgICAgICAgIGV4cGlyZShub3RpZnksdHJ1ZSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIGV4cGlyZShib29sZWFuIG5vdGlmeSwgYm9vbGVhbiBub3RpZnlDbHVzdGVyKSB7CisKKyAgICAgICAgLy8gTWFyayB0aGlzIHNlc3Npb24gYXMgImJlaW5nIGV4cGlyZWQiIGlmIG5lZWRlZAorICAgICAgICBpZiAoZXhwaXJpbmcpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIFN0cmluZyBleHBpcmVkSWQgPSBnZXRJZCgpOworCisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworCisgICAgICAgICAgICBpZiAobWFuYWdlciA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgZXhwaXJpbmcgPSB0cnVlOworCisgICAgICAgICAgICAvLyBOb3RpZnkgaW50ZXJlc3RlZCBhcHBsaWNhdGlvbiBldmVudCBsaXN0ZW5lcnMKKyAgICAgICAgICAgIC8vIEZJWE1FIC0gQXNzdW1lcyB3ZSBjYWxsIGxpc3RlbmVycyBpbiByZXZlcnNlIG9yZGVyCisgICAgICAgICAgICBDb250ZXh0IGNvbnRleHQgPSAoQ29udGV4dCkgbWFuYWdlci5nZXRDb250YWluZXIoKTsKKyAgICAgICAgICAgIC8vZml4IGZvciBzdGFuZGFsb25lIG1hbmFnZXIgd2l0aG91dCBjb250YWluZXIKKyAgICAgICAgICAgIGlmICggY29udGV4dCAhPSBudWxsICkgeworICAgICAgICAgICAgICAgIE9iamVjdCBsaXN0ZW5lcnNbXSA9IGNvbnRleHQuZ2V0QXBwbGljYXRpb25MaWZlY3ljbGVMaXN0ZW5lcnMoKTsKKyAgICAgICAgICAgICAgICBpZiAobm90aWZ5ICYmIChsaXN0ZW5lcnMgIT0gbnVsbCkpIHsKKyAgICAgICAgICAgICAgICAgICAgSHR0cFNlc3Npb25FdmVudCBldmVudCA9CisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSHR0cFNlc3Npb25FdmVudChnZXRTZXNzaW9uKCkpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGogPSAobGlzdGVuZXJzLmxlbmd0aCAtIDEpIC0gaTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIChsaXN0ZW5lcnNbal0gaW5zdGFuY2VvZiBIdHRwU2Vzc2lvbkxpc3RlbmVyKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXNzaW9uTGlzdGVuZXIgbGlzdGVuZXIgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChIdHRwU2Vzc2lvbkxpc3RlbmVyKSBsaXN0ZW5lcnNbal07CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcmVDb250YWluZXJFdmVudChjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmVmb3JlU2Vzc2lvbkRlc3Ryb3llZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5zZXNzaW9uRGVzdHJveWVkKGV2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJlQ29udGFpbmVyRXZlbnQoY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFmdGVyU2Vzc2lvbkRlc3Ryb3llZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyZUNvbnRhaW5lckV2ZW50KGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWZ0ZXJTZXNzaW9uRGVzdHJveWVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIC0gc2hvdWxkIHdlIGRvIGFueXRoaW5nIGJlc2lkZXMgbG9nIHRoZXNlPworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcihzbS5nZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdGFuZGFyZFNlc3Npb24uc2Vzc2lvbkV2ZW50IiksIHQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfS8vZW5kIGlmCisgICAgICAgICAgICAvL2VuZCBmaXgKKyAgICAgICAgICAgIGFjY2Vzc0NvdW50PTA7CisgICAgICAgICAgICBzZXRWYWxpZChmYWxzZSk7CisKKyAgICAgICAgICAgIC8vIFJlbW92ZSB0aGlzIHNlc3Npb24gZnJvbSBvdXIgbWFuYWdlcidzIGFjdGl2ZSBzZXNzaW9ucworICAgICAgICAgICAgaWYgKG1hbmFnZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBtYW5hZ2VyLnJlbW92ZSh0aGlzKTsKKworICAgICAgICAgICAgLy8gTm90aWZ5IGludGVyZXN0ZWQgc2Vzc2lvbiBldmVudCBsaXN0ZW5lcnMKKyAgICAgICAgICAgIGlmIChub3RpZnkpIHsKKyAgICAgICAgICAgICAgICBmaXJlU2Vzc2lvbkV2ZW50KFNlc3Npb24uU0VTU0lPTl9ERVNUUk9ZRURfRVZFTlQsIG51bGwpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBXZSBoYXZlIGNvbXBsZXRlZCBleHBpcmUgb2YgdGhpcyBzZXNzaW9uCisgICAgICAgICAgICBleHBpcmluZyA9IGZhbHNlOworCisgICAgICAgICAgICAvLyBVbmJpbmQgYW55IG9iamVjdHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc2Vzc2lvbgorICAgICAgICAgICAgU3RyaW5nIGtleXNbXSA9IGtleXMoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICByZW1vdmVBdHRyaWJ1dGVJbnRlcm5hbChrZXlzW2ldLCBub3RpZnksIGZhbHNlKTsKKworCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmICggbm90aWZ5Q2x1c3RlciApIHsKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk5vdGlmeWluZyBjbHVzdGVyIG9mIGV4cGlyYXRpb24gcHJpbWFyeT0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBpc1ByaW1hcnlTZXNzaW9uKCkgKyAiIGlkPSIgKyBleHBpcmVkSWQpOworICAgICAgICAgICAgICAgICggKERlbHRhTWFuYWdlcikgbWFuYWdlcikuc2Vzc2lvbkV4cGlyZWQoZXhwaXJlZElkKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgb2JqZWN0IGJvdW5kIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIHRvIHRoZSBpbnRlcm5hbCBub3RlcworICAgICAqIGZvciB0aGlzIHNlc3Npb24sIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHN1Y2ggYmluZGluZyBleGlzdHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBub3RlIHRvIGJlIHJldHVybmVkCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXROb3RlKFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgc3luY2hyb25pemVkIChub3RlcykgeworICAgICAgICAgICAgcmV0dXJuIChub3Rlcy5nZXQobmFtZSkpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhbiBJdGVyYXRvciBjb250YWluaW5nIHRoZSBTdHJpbmcgbmFtZXMgb2YgYWxsIG5vdGVzIGJpbmRpbmdzCisgICAgICogdGhhdCBleGlzdCBmb3IgdGhpcyBzZXNzaW9uLgorICAgICAqLworICAgIHB1YmxpYyBJdGVyYXRvciBnZXROb3RlTmFtZXMoKSB7CisKKyAgICAgICAgc3luY2hyb25pemVkIChub3RlcykgeworICAgICAgICAgICAgcmV0dXJuIChub3Rlcy5rZXlTZXQoKS5pdGVyYXRvcigpKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZWxlYXNlIGFsbCBvYmplY3QgcmVmZXJlbmNlcywgYW5kIGluaXRpYWxpemUgaW5zdGFuY2UgdmFyaWFibGVzLCBpbgorICAgICAqIHByZXBhcmF0aW9uIGZvciByZXVzZSBvZiB0aGlzIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWN5Y2xlKCkgeworCisgICAgICAgIC8vIFJlc2V0IHRoZSBpbnN0YW5jZSB2YXJpYWJsZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgU2Vzc2lvbgorICAgICAgICBhdHRyaWJ1dGVzLmNsZWFyKCk7CisgICAgICAgIHNldEF1dGhUeXBlKG51bGwpOworICAgICAgICBjcmVhdGlvblRpbWUgPSAwTDsKKyAgICAgICAgZXhwaXJpbmcgPSBmYWxzZTsKKyAgICAgICAgaWQgPSBudWxsOworICAgICAgICBsYXN0QWNjZXNzZWRUaW1lID0gMEw7CisgICAgICAgIG1heEluYWN0aXZlSW50ZXJ2YWwgPSAtMTsKKyAgICAgICAgYWNjZXNzQ291bnQgPSAwOworICAgICAgICBub3Rlcy5jbGVhcigpOworICAgICAgICBzZXRQcmluY2lwYWwobnVsbCk7CisgICAgICAgIGlzTmV3ID0gZmFsc2U7CisgICAgICAgIGlzVmFsaWQgPSBmYWxzZTsKKyAgICAgICAgbWFuYWdlciA9IG51bGw7CisgICAgICAgIGRlbHRhUmVxdWVzdC5jbGVhcigpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYW55IG9iamVjdCBib3VuZCB0byB0aGUgc3BlY2lmaWVkIG5hbWUgaW4gdGhlIGludGVybmFsIG5vdGVzCisgICAgICogZm9yIHRoaXMgc2Vzc2lvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIG5vdGUgdG8gYmUgcmVtb3ZlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZU5vdGUoU3RyaW5nIG5hbWUpIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKG5vdGVzKSB7CisgICAgICAgICAgICBub3Rlcy5yZW1vdmUobmFtZSk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGEgc2Vzc2lvbiBldmVudCBsaXN0ZW5lciBmcm9tIHRoaXMgY29tcG9uZW50LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVNlc3Npb25MaXN0ZW5lcihTZXNzaW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKGxpc3RlbmVycykgeworICAgICAgICAgICAgbGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQmluZCBhbiBvYmplY3QgdG8gYSBzcGVjaWZpZWQgbmFtZSBpbiB0aGUgaW50ZXJuYWwgbm90ZXMgYXNzb2NpYXRlZAorICAgICAqIHdpdGggdGhpcyBzZXNzaW9uLCByZXBsYWNpbmcgYW55IGV4aXN0aW5nIGJpbmRpbmcgZm9yIHRoaXMgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgdG8gd2hpY2ggdGhlIG9iamVjdCBzaG91bGQgYmUgYm91bmQKKyAgICAgKiBAcGFyYW0gdmFsdWUgT2JqZWN0IHRvIGJlIGJvdW5kIHRvIHRoZSBzcGVjaWZpZWQgbmFtZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE5vdGUoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAobm90ZXMpIHsKKyAgICAgICAgICAgIG5vdGVzLnB1dChuYW1lLCB2YWx1ZSk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBzYi5hcHBlbmQoIlN0YW5kYXJkU2Vzc2lvblsiKTsKKyAgICAgICAgc2IuYXBwZW5kKGlkKTsKKyAgICAgICAgc2IuYXBwZW5kKCJdIik7CisgICAgICAgIHJldHVybiAoc2IudG9TdHJpbmcoKSk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTZXNzaW9uIFBhY2thZ2UgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZWFkIGEgc2VyaWFsaXplZCB2ZXJzaW9uIG9mIHRoZSBjb250ZW50cyBvZiB0aGlzIHNlc3Npb24gb2JqZWN0IGZyb20KKyAgICAgKiB0aGUgc3BlY2lmaWVkIG9iamVjdCBpbnB1dCBzdHJlYW0sIHdpdGhvdXQgcmVxdWlyaW5nIHRoYXQgdGhlCisgICAgICogU3RhbmRhcmRTZXNzaW9uIGl0c2VsZiBoYXZlIGJlZW4gc2VyaWFsaXplZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJlYW0gVGhlIG9iamVjdCBpbnB1dCBzdHJlYW0gdG8gcmVhZCBmcm9tCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIENsYXNzTm90Rm91bmRFeGNlcHRpb24gaWYgYW4gdW5rbm93biBjbGFzcyBpcyBzcGVjaWZpZWQKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWFkT2JqZWN0RGF0YShPYmplY3RJbnB1dFN0cmVhbSBzdHJlYW0pCisgICAgICAgIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgcmVhZE9iamVjdChzdHJlYW0pOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBXcml0ZSBhIHNlcmlhbGl6ZWQgdmVyc2lvbiBvZiB0aGUgY29udGVudHMgb2YgdGhpcyBzZXNzaW9uIG9iamVjdCB0bworICAgICAqIHRoZSBzcGVjaWZpZWQgb2JqZWN0IG91dHB1dCBzdHJlYW0sIHdpdGhvdXQgcmVxdWlyaW5nIHRoYXQgdGhlCisgICAgICogU3RhbmRhcmRTZXNzaW9uIGl0c2VsZiBoYXZlIGJlZW4gc2VyaWFsaXplZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJlYW0gVGhlIG9iamVjdCBvdXRwdXQgc3RyZWFtIHRvIHdyaXRlIHRvCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3cml0ZU9iamVjdERhdGEoT2JqZWN0T3V0cHV0U3RyZWFtIHN0cmVhbSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICB3cml0ZU9iamVjdChzdHJlYW0pOworCisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHJlc2V0RGVsdGFSZXF1ZXN0KCkgeworICAgICAgICBpZiAoIGRlbHRhUmVxdWVzdCA9PSBudWxsICkgeworICAgICAgICAgICAgZGVsdGFSZXF1ZXN0ID0gbmV3IERlbHRhUmVxdWVzdChnZXRJZCgpLGZhbHNlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRlbHRhUmVxdWVzdC5yZXNldCgpOworICAgICAgICAgICAgZGVsdGFSZXF1ZXN0LnNldFNlc3Npb25JZChnZXRJZCgpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgRGVsdGFSZXF1ZXN0IGdldERlbHRhUmVxdWVzdCgpIHsKKyAgICAgICAgaWYgKCBkZWx0YVJlcXVlc3QgPT0gbnVsbCApIHJlc2V0RGVsdGFSZXF1ZXN0KCk7CisgICAgICAgIHJldHVybiBkZWx0YVJlcXVlc3Q7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEh0dHBTZXNzaW9uIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB0aW1lIHdoZW4gdGhpcyBzZXNzaW9uIHdhcyBjcmVhdGVkLCBpbiBtaWxsaXNlY29uZHMgc2luY2UKKyAgICAgKiBtaWRuaWdodCwgSmFudWFyeSAxLCAxOTcwIEdNVC4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbiBhbgorICAgICAqICBpbnZhbGlkYXRlZCBzZXNzaW9uCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0Q3JlYXRpb25UaW1lKCkgeworCisgICAgICAgaWYgKCFleHBpcmluZyAmJiAhaXNWYWxpZCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJzdGFuZGFyZFNlc3Npb24uZ2V0Q3JlYXRpb25UaW1lLmlzZSIpKTsKKworICAgICAgICByZXR1cm4gKHRoaXMuY3JlYXRpb25UaW1lKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBTZXJ2bGV0Q29udGV4dCB0byB3aGljaCB0aGlzIHNlc3Npb24gYmVsb25ncy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2VydmxldENvbnRleHQgZ2V0U2VydmxldENvbnRleHQoKSB7CisKKyAgICAgICAgaWYgKG1hbmFnZXIgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIENvbnRleHQgY29udGV4dCA9IChDb250ZXh0KSBtYW5hZ2VyLmdldENvbnRhaW5lcigpOworICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIChjb250ZXh0LmdldFNlcnZsZXRDb250ZXh0KCkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNlc3Npb24gY29udGV4dCB3aXRoIHdoaWNoIHRoaXMgc2Vzc2lvbiBpcyBhc3NvY2lhdGVkLgorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQgQXMgb2YgVmVyc2lvbiAyLjEsIHRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQgYW5kIGhhcyBubworICAgICAqICByZXBsYWNlbWVudC4gIEl0IHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uIG9mIHRoZQorICAgICAqICBKYXZhIFNlcnZsZXQgQVBJLgorICAgICAqLworICAgIHB1YmxpYyBIdHRwU2Vzc2lvbkNvbnRleHQgZ2V0U2Vzc2lvbkNvbnRleHQoKSB7CisKKyAgICAgICAgaWYgKHNlc3Npb25Db250ZXh0ID09IG51bGwpCisgICAgICAgICAgICBzZXNzaW9uQ29udGV4dCA9IG5ldyBTdGFuZGFyZFNlc3Npb25Db250ZXh0KCk7CisgICAgICAgIHJldHVybiAoc2Vzc2lvbkNvbnRleHQpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tSHR0cFNlc3Npb24gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBvYmplY3QgYm91bmQgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgaW4gdGhpcyBzZXNzaW9uLCBvcgorICAgICAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIG9iamVjdCBpcyBib3VuZCB3aXRoIHRoYXQgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0byBiZSByZXR1cm5lZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIG9uIGFuCisgICAgICogIGludmFsaWRhdGVkIHNlc3Npb24KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSkgeworCisgICAgICAgIGlmICghaXNWYWxpZCgpKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInN0YW5kYXJkU2Vzc2lvbi5nZXRBdHRyaWJ1dGUuaXNlIikpOworCisgICAgICAgIHN5bmNocm9uaXplZCAoYXR0cmlidXRlcykgeworICAgICAgICAgICAgcmV0dXJuIChhdHRyaWJ1dGVzLmdldChuYW1lKSk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGFuIDxjb2RlPkVudW1lcmF0aW9uPC9jb2RlPiBvZiA8Y29kZT5TdHJpbmc8L2NvZGU+IG9iamVjdHMKKyAgICAgKiBjb250YWluaW5nIHRoZSBuYW1lcyBvZiB0aGUgb2JqZWN0cyBib3VuZCB0byB0aGlzIHNlc3Npb24uCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgb24gYW4KKyAgICAgKiAgaW52YWxpZGF0ZWQgc2Vzc2lvbgorICAgICAqLworICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRBdHRyaWJ1dGVOYW1lcygpIHsKKworICAgICAgICBpZiAoIWlzVmFsaWQoKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJzdGFuZGFyZFNlc3Npb24uZ2V0QXR0cmlidXRlTmFtZXMuaXNlIikpOworCisgICAgICAgIHN5bmNocm9uaXplZCAoYXR0cmlidXRlcykgeworICAgICAgICAgICAgcmV0dXJuIChuZXcgRW51bWVyYXRvcihhdHRyaWJ1dGVzLmtleVNldCgpLCB0cnVlKSk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBvYmplY3QgYm91bmQgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgaW4gdGhpcyBzZXNzaW9uLCBvcgorICAgICAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIG9iamVjdCBpcyBib3VuZCB3aXRoIHRoYXQgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIHZhbHVlIHRvIGJlIHJldHVybmVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgb24gYW4KKyAgICAgKiAgaW52YWxpZGF0ZWQgc2Vzc2lvbgorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQgQXMgb2YgVmVyc2lvbiAyLjIsIHRoaXMgbWV0aG9kIGlzIHJlcGxhY2VkIGJ5CisgICAgICogIDxjb2RlPmdldEF0dHJpYnV0ZSgpPC9jb2RlPgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoU3RyaW5nIG5hbWUpIHsKKworICAgICAgICByZXR1cm4gKGdldEF0dHJpYnV0ZShuYW1lKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2V0IG9mIG5hbWVzIG9mIG9iamVjdHMgYm91bmQgdG8gdGhpcyBzZXNzaW9uLiAgSWYgdGhlcmUKKyAgICAgKiBhcmUgbm8gc3VjaCBvYmplY3RzLCBhIHplcm8tbGVuZ3RoIGFycmF5IGlzIHJldHVybmVkLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIG9uIGFuCisgICAgICogIGludmFsaWRhdGVkIHNlc3Npb24KKyAgICAgKgorICAgICAqIEBkZXByZWNhdGVkIEFzIG9mIFZlcnNpb24gMi4yLCB0aGlzIG1ldGhvZCBpcyByZXBsYWNlZCBieQorICAgICAqICA8Y29kZT5nZXRBdHRyaWJ1dGVOYW1lcygpPC9jb2RlPgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWx1ZU5hbWVzKCkgeworCisgICAgICAgIGlmICghaXNWYWxpZCgpKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInN0YW5kYXJkU2Vzc2lvbi5nZXRWYWx1ZU5hbWVzLmlzZSIpKTsKKworICAgICAgICByZXR1cm4gKGtleXMoKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEludmFsaWRhdGVzIHRoaXMgc2Vzc2lvbiBhbmQgdW5iaW5kcyBhbnkgb2JqZWN0cyBib3VuZCB0byBpdC4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbgorICAgICAqICBhbiBpbnZhbGlkYXRlZCBzZXNzaW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgaW52YWxpZGF0ZSgpIHsKKworICAgICAgICBpZiAoIWlzVmFsaWQoKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJzdGFuZGFyZFNlc3Npb24uaW52YWxpZGF0ZS5pc2UiKSk7CisKKyAgICAgICAgLy8gQ2F1c2UgdGhpcyBzZXNzaW9uIHRvIGV4cGlyZQorICAgICAgICBleHBpcmUoKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjbGllbnQgZG9lcyBub3QgeWV0IGtub3cgYWJvdXQgdGhlCisgICAgICogc2Vzc2lvbiwgb3IgaWYgdGhlIGNsaWVudCBjaG9vc2VzIG5vdCB0byBqb2luIHRoZSBzZXNzaW9uLiAgRm9yCisgICAgICogZXhhbXBsZSwgaWYgdGhlIHNlcnZlciB1c2VkIG9ubHkgY29va2llLWJhc2VkIHNlc3Npb25zLCBhbmQgdGhlIGNsaWVudAorICAgICAqIGhhcyBkaXNhYmxlZCB0aGUgdXNlIG9mIGNvb2tpZXMsIHRoZW4gYSBzZXNzaW9uIHdvdWxkIGJlIG5ldyBvbiBlYWNoCisgICAgICogcmVxdWVzdC4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbiBhbgorICAgICAqICBpbnZhbGlkYXRlZCBzZXNzaW9uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNOZXcoKSB7CisKKyAgICAgICAgaWYgKCFpc1ZhbGlkKCkpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygic3RhbmRhcmRTZXNzaW9uLmlzTmV3LmlzZSIpKTsKKworICAgICAgICByZXR1cm4gKHRoaXMuaXNOZXcpOworCisgICAgfQorCisKKworICAgIC8qKgorICAgICAqIEJpbmQgYW4gb2JqZWN0IHRvIHRoaXMgc2Vzc2lvbiwgdXNpbmcgdGhlIHNwZWNpZmllZCBuYW1lLiAgSWYgYW4gb2JqZWN0CisgICAgICogb2YgdGhlIHNhbWUgbmFtZSBpcyBhbHJlYWR5IGJvdW5kIHRvIHRoaXMgc2Vzc2lvbiwgdGhlIG9iamVjdCBpcworICAgICAqIHJlcGxhY2VkLgorICAgICAqIDxwPgorICAgICAqIEFmdGVyIHRoaXMgbWV0aG9kIGV4ZWN1dGVzLCBhbmQgaWYgdGhlIG9iamVjdCBpbXBsZW1lbnRzCisgICAgICogPGNvZGU+SHR0cFNlc3Npb25CaW5kaW5nTGlzdGVuZXI8L2NvZGU+LCB0aGUgY29udGFpbmVyIGNhbGxzCisgICAgICogPGNvZGU+dmFsdWVCb3VuZCgpPC9jb2RlPiBvbiB0aGUgb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSB0byB3aGljaCB0aGUgb2JqZWN0IGlzIGJvdW5kLCBjYW5ub3QgYmUgbnVsbAorICAgICAqIEBwYXJhbSB2YWx1ZSBPYmplY3QgdG8gYmUgYm91bmQsIGNhbm5vdCBiZSBudWxsCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgb24gYW4KKyAgICAgKiAgaW52YWxpZGF0ZWQgc2Vzc2lvbgorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQgQXMgb2YgVmVyc2lvbiAyLjIsIHRoaXMgbWV0aG9kIGlzIHJlcGxhY2VkIGJ5CisgICAgICogIDxjb2RlPnNldEF0dHJpYnV0ZSgpPC9jb2RlPgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHB1dFZhbHVlKFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsKKworICAgICAgICBzZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgdGhlIG9iamVjdCBib3VuZCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBmcm9tIHRoaXMgc2Vzc2lvbi4gIElmCisgICAgICogdGhlIHNlc3Npb24gZG9lcyBub3QgaGF2ZSBhbiBvYmplY3QgYm91bmQgd2l0aCB0aGlzIG5hbWUsIHRoaXMgbWV0aG9kCisgICAgICogZG9lcyBub3RoaW5nLgorICAgICAqIDxwPgorICAgICAqIEFmdGVyIHRoaXMgbWV0aG9kIGV4ZWN1dGVzLCBhbmQgaWYgdGhlIG9iamVjdCBpbXBsZW1lbnRzCisgICAgICogPGNvZGU+SHR0cFNlc3Npb25CaW5kaW5nTGlzdGVuZXI8L2NvZGU+LCB0aGUgY29udGFpbmVyIGNhbGxzCisgICAgICogPGNvZGU+dmFsdWVVbmJvdW5kKCk8L2NvZGU+IG9uIHRoZSBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBvYmplY3QgdG8gcmVtb3ZlIGZyb20gdGhpcyBzZXNzaW9uLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIG9uIGFuCisgICAgICogIGludmFsaWRhdGVkIHNlc3Npb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHsKKworICAgICAgICByZW1vdmVBdHRyaWJ1dGUobmFtZSwgdHJ1ZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGUgb2JqZWN0IGJvdW5kIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGZyb20gdGhpcyBzZXNzaW9uLiAgSWYKKyAgICAgKiB0aGUgc2Vzc2lvbiBkb2VzIG5vdCBoYXZlIGFuIG9iamVjdCBib3VuZCB3aXRoIHRoaXMgbmFtZSwgdGhpcyBtZXRob2QKKyAgICAgKiBkb2VzIG5vdGhpbmcuCisgICAgICogPHA+CisgICAgICogQWZ0ZXIgdGhpcyBtZXRob2QgZXhlY3V0ZXMsIGFuZCBpZiB0aGUgb2JqZWN0IGltcGxlbWVudHMKKyAgICAgKiA8Y29kZT5IdHRwU2Vzc2lvbkJpbmRpbmdMaXN0ZW5lcjwvY29kZT4sIHRoZSBjb250YWluZXIgY2FsbHMKKyAgICAgKiA8Y29kZT52YWx1ZVVuYm91bmQoKTwvY29kZT4gb24gdGhlIG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIG9iamVjdCB0byByZW1vdmUgZnJvbSB0aGlzIHNlc3Npb24uCisgICAgICogQHBhcmFtIG5vdGlmeSBTaG91bGQgd2Ugbm90aWZ5IGludGVyZXN0ZWQgbGlzdGVuZXJzIHRoYXQgdGhpcworICAgICAqICBhdHRyaWJ1dGUgaXMgYmVpbmcgcmVtb3ZlZD8KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbiBhbgorICAgICAqICBpbnZhbGlkYXRlZCBzZXNzaW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlQXR0cmlidXRlKFN0cmluZyBuYW1lLCBib29sZWFuIG5vdGlmeSkgeworICAgICAgICByZW1vdmVBdHRyaWJ1dGUobmFtZSxub3RpZnksdHJ1ZSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHJlbW92ZUF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgYm9vbGVhbiBub3RpZnksIGJvb2xlYW4gYWRkRGVsdGFSZXF1ZXN0KSB7CisKKyAgICAgICAgLy8gVmFsaWRhdGUgb3VyIGN1cnJlbnQgc3RhdGUKKyAgICAgICAgaWYgKCFpc1ZhbGlkKCkpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygic3RhbmRhcmRTZXNzaW9uLnJlbW92ZUF0dHJpYnV0ZS5pc2UiKSk7CisgICAgICAgIHJlbW92ZUF0dHJpYnV0ZUludGVybmFsKG5hbWUsbm90aWZ5LGFkZERlbHRhUmVxdWVzdCk7CisgICAgfQorICAgIAorICAgIAorCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBvYmplY3QgYm91bmQgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgZnJvbSB0aGlzIHNlc3Npb24uICBJZgorICAgICAqIHRoZSBzZXNzaW9uIGRvZXMgbm90IGhhdmUgYW4gb2JqZWN0IGJvdW5kIHdpdGggdGhpcyBuYW1lLCB0aGlzIG1ldGhvZAorICAgICAqIGRvZXMgbm90aGluZy4KKyAgICAgKiA8cD4KKyAgICAgKiBBZnRlciB0aGlzIG1ldGhvZCBleGVjdXRlcywgYW5kIGlmIHRoZSBvYmplY3QgaW1wbGVtZW50cworICAgICAqIDxjb2RlPkh0dHBTZXNzaW9uQmluZGluZ0xpc3RlbmVyPC9jb2RlPiwgdGhlIGNvbnRhaW5lciBjYWxscworICAgICAqIDxjb2RlPnZhbHVlVW5ib3VuZCgpPC9jb2RlPiBvbiB0aGUgb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgb2JqZWN0IHRvIHJlbW92ZSBmcm9tIHRoaXMgc2Vzc2lvbi4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbiBhbgorICAgICAqICBpbnZhbGlkYXRlZCBzZXNzaW9uCisgICAgICoKKyAgICAgKiBAZGVwcmVjYXRlZCBBcyBvZiBWZXJzaW9uIDIuMiwgdGhpcyBtZXRob2QgaXMgcmVwbGFjZWQgYnkKKyAgICAgKiAgPGNvZGU+cmVtb3ZlQXR0cmlidXRlKCk8L2NvZGU+CisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlVmFsdWUoU3RyaW5nIG5hbWUpIHsKKworICAgICAgICByZW1vdmVBdHRyaWJ1dGUobmFtZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEJpbmQgYW4gb2JqZWN0IHRvIHRoaXMgc2Vzc2lvbiwgdXNpbmcgdGhlIHNwZWNpZmllZCBuYW1lLiAgSWYgYW4gb2JqZWN0CisgICAgICogb2YgdGhlIHNhbWUgbmFtZSBpcyBhbHJlYWR5IGJvdW5kIHRvIHRoaXMgc2Vzc2lvbiwgdGhlIG9iamVjdCBpcworICAgICAqIHJlcGxhY2VkLgorICAgICAqIDxwPgorICAgICAqIEFmdGVyIHRoaXMgbWV0aG9kIGV4ZWN1dGVzLCBhbmQgaWYgdGhlIG9iamVjdCBpbXBsZW1lbnRzCisgICAgICogPGNvZGU+SHR0cFNlc3Npb25CaW5kaW5nTGlzdGVuZXI8L2NvZGU+LCB0aGUgY29udGFpbmVyIGNhbGxzCisgICAgICogPGNvZGU+dmFsdWVCb3VuZCgpPC9jb2RlPiBvbiB0aGUgb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSB0byB3aGljaCB0aGUgb2JqZWN0IGlzIGJvdW5kLCBjYW5ub3QgYmUgbnVsbAorICAgICAqIEBwYXJhbSB2YWx1ZSBPYmplY3QgdG8gYmUgYm91bmQsIGNhbm5vdCBiZSBudWxsCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gYWRkIGEKKyAgICAgKiAgbm9uLXNlcmlhbGl6YWJsZSBvYmplY3QgaW4gYW4gZW52aXJvbm1lbnQgbWFya2VkIGRpc3RyaWJ1dGFibGUuCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIG9uIGFuCisgICAgICogIGludmFsaWRhdGVkIHNlc3Npb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICBzZXRBdHRyaWJ1dGUobmFtZSx2YWx1ZSx0cnVlLCB0cnVlKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUsIGJvb2xlYW4gbm90aWZ5LCBib29sZWFuIGFkZERlbHRhUmVxdWVzdCkgeworCisgICAgICAgIC8vIE5hbWUgY2Fubm90IGJlIG51bGwKKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJzdGFuZGFyZFNlc3Npb24uc2V0QXR0cmlidXRlLm5hbWVudWxsIikpOworCisgICAgICAgIC8vIE51bGwgdmFsdWUgaXMgdGhlIHNhbWUgYXMgcmVtb3ZlQXR0cmlidXRlKCkKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgIHJlbW92ZUF0dHJpYnV0ZShuYW1lKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggISAodmFsdWUgaW5zdGFuY2VvZiBqYXZhLmlvLlNlcmlhbGl6YWJsZSkgKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBdHRyaWJ1dGUgWyIrbmFtZSsiXSBpcyBub3Qgc2VyaWFsaXphYmxlIik7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChhZGREZWx0YVJlcXVlc3QgJiYgKGRlbHRhUmVxdWVzdCE9bnVsbCkpIGRlbHRhUmVxdWVzdC5zZXRBdHRyaWJ1dGUobmFtZSx2YWx1ZSk7CisKKyAgICAgICAgLy8gVmFsaWRhdGUgb3VyIGN1cnJlbnQgc3RhdGUKKyAgICAgICAgaWYgKCFpc1ZhbGlkKCkpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygic3RhbmRhcmRTZXNzaW9uLnNldEF0dHJpYnV0ZS5pc2UiKSk7CisgICAgICAgIGlmICgobWFuYWdlciAhPSBudWxsKSAmJiBtYW5hZ2VyLmdldERpc3RyaWJ1dGFibGUoKSAmJgorICAgICAgICAgICEodmFsdWUgaW5zdGFuY2VvZiBTZXJpYWxpemFibGUpKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoInN0YW5kYXJkU2Vzc2lvbi5zZXRBdHRyaWJ1dGUuaWFlIikpOworCisgICAgICAgIAorICAgICAgICAvLyBDb25zdHJ1Y3QgYW4gZXZlbnQgd2l0aCB0aGUgbmV3IHZhbHVlCisgICAgICAgIEh0dHBTZXNzaW9uQmluZGluZ0V2ZW50IGV2ZW50ID0gbnVsbDsKKyAgICAgICAgCisgICAgICAgIC8vIENhbGwgdGhlIHZhbHVlQm91bmQoKSBtZXRob2QgaWYgbmVjZXNzYXJ5CisgICAgICAgIGlmICggdmFsdWUgaW5zdGFuY2VvZiBIdHRwU2Vzc2lvbkJpbmRpbmdMaXN0ZW5lciAmJiBub3RpZnkpIHsKKyAgICAgICAgICAgIGV2ZW50ID0gbmV3IEh0dHBTZXNzaW9uQmluZGluZ0V2ZW50KGdldFNlc3Npb24oKSwgbmFtZSwgdmFsdWUpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAoIChIdHRwU2Vzc2lvbkJpbmRpbmdMaXN0ZW5lcikgdmFsdWUpLnZhbHVlQm91bmQoZXZlbnQpOworICAgICAgICAgICAgfSBjYXRjaCAoIEV4Y2VwdGlvbiB4ICkgeworICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiU2Vzc2lvbiBiaW5kaW5nIGxpc3RlbmVyIHRocm93IGFuIGV4Y2VwdGlvbiIseCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIFJlcGxhY2Ugb3IgYWRkIHRoaXMgYXR0cmlidXRlCisgICAgICAgIE9iamVjdCB1bmJvdW5kID0gYXR0cmlidXRlcy5wdXQobmFtZSwgdmFsdWUpOworCisgICAgICAgIC8vIENhbGwgdGhlIHZhbHVlVW5ib3VuZCgpIG1ldGhvZCBpZiBuZWNlc3NhcnkKKyAgICAgICAgaWYgKCh1bmJvdW5kICE9IG51bGwpICYmIG5vdGlmeSAmJgorICAgICAgICAgICAgKHVuYm91bmQgaW5zdGFuY2VvZiBIdHRwU2Vzc2lvbkJpbmRpbmdMaXN0ZW5lcikpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgKCAoSHR0cFNlc3Npb25CaW5kaW5nTGlzdGVuZXIpIHVuYm91bmQpLnZhbHVlVW5ib3VuZAorICAgICAgICAgICAgICAgICAgICAobmV3IEh0dHBTZXNzaW9uQmluZGluZ0V2ZW50KCAoSHR0cFNlc3Npb24pZ2V0U2Vzc2lvbigpLCBuYW1lKSk7CisgICAgICAgICAgICB9IGNhdGNoICggRXhjZXB0aW9uIHggKSB7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJTZXNzaW9uIGJpbmRpbmcgbGlzdGVuZXIgdGhyb3cgYW4gZXhjZXB0aW9uIix4KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvL2RvbnQgbm90aWZ5IGFueSBsaXN0ZW5lcnMKKyAgICAgICAgaWYgKCFub3RpZnkpIHJldHVybjsKKworCisKKyAgICAgICAgLy8gTm90aWZ5IGludGVyZXN0ZWQgYXBwbGljYXRpb24gZXZlbnQgbGlzdGVuZXJzCisgICAgICAgIENvbnRleHQgY29udGV4dCA9IChDb250ZXh0KSBtYW5hZ2VyLmdldENvbnRhaW5lcigpOworICAgICAgICAvL2ZpeCBmb3Igc3RhbmRhbG9uZSBtYW5hZ2VyIHdpdGhvdXQgY29udGFpbmVyCisgICAgICAgIGlmICggY29udGV4dCAhPSBudWxsICkgeworICAgICAgICAgICAgT2JqZWN0IGxpc3RlbmVyc1tdID0gY29udGV4dC5nZXRBcHBsaWNhdGlvbkV2ZW50TGlzdGVuZXJzKCk7CisgICAgICAgICAgICBpZiAobGlzdGVuZXJzID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoISAobGlzdGVuZXJzW2ldIGluc3RhbmNlb2YgSHR0cFNlc3Npb25BdHRyaWJ1dGVMaXN0ZW5lcikpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIEh0dHBTZXNzaW9uQXR0cmlidXRlTGlzdGVuZXIgbGlzdGVuZXIgPQorICAgICAgICAgICAgICAgICAgICAoSHR0cFNlc3Npb25BdHRyaWJ1dGVMaXN0ZW5lcikgbGlzdGVuZXJzW2ldOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh1bmJvdW5kICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpcmVDb250YWluZXJFdmVudChjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZWZvcmVTZXNzaW9uQXR0cmlidXRlUmVwbGFjZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQgPSBuZXcgSHR0cFNlc3Npb25CaW5kaW5nRXZlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdldFNlc3Npb24oKSwgbmFtZSwgdW5ib3VuZCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5hdHRyaWJ1dGVSZXBsYWNlZChldmVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmaXJlQ29udGFpbmVyRXZlbnQoY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWZ0ZXJTZXNzaW9uQXR0cmlidXRlUmVwbGFjZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpcmVDb250YWluZXJFdmVudChjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZWZvcmVTZXNzaW9uQXR0cmlidXRlQWRkZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQgPSBuZXcgSHR0cFNlc3Npb25CaW5kaW5nRXZlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdldFNlc3Npb24oKSwgbmFtZSwgdW5ib3VuZCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5hdHRyaWJ1dGVBZGRlZChldmVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmaXJlQ29udGFpbmVyRXZlbnQoY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWZ0ZXJTZXNzaW9uQXR0cmlidXRlQWRkZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodW5ib3VuZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyZUNvbnRhaW5lckV2ZW50KGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZnRlclNlc3Npb25BdHRyaWJ1dGVSZXBsYWNlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyZUNvbnRhaW5lckV2ZW50KGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZnRlclNlc3Npb25BdHRyaWJ1dGVBZGRlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRSAtIHNob3VsZCB3ZSBkbyBhbnl0aGluZyBiZXNpZGVzIGxvZyB0aGVzZT8KKyAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKHNtLmdldFN0cmluZygic3RhbmRhcmRTZXNzaW9uLmF0dHJpYnV0ZUV2ZW50IiksIHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gLy9mb3IKKyAgICAgICAgfS8vZW5kIGlmCisgICAgICAgIC8vZW5kIGZpeAorCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBIdHRwU2Vzc2lvbiBQcml2YXRlIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmVhZCBhIHNlcmlhbGl6ZWQgdmVyc2lvbiBvZiB0aGlzIHNlc3Npb24gb2JqZWN0IGZyb20gdGhlIHNwZWNpZmllZAorICAgICAqIG9iamVjdCBpbnB1dCBzdHJlYW0uCisgICAgICogPHA+CisgICAgICogPGI+SU1QTEVNRU5UQVRJT04gTk9URTwvYj46ICBUaGUgcmVmZXJlbmNlIHRvIHRoZSBvd25pbmcgTWFuYWdlcgorICAgICAqIGlzIG5vdCByZXN0b3JlZCBieSB0aGlzIG1ldGhvZCwgYW5kIG11c3QgYmUgc2V0IGV4cGxpY2l0bHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyZWFtIFRoZSBpbnB1dCBzdHJlYW0gdG8gcmVhZCBmcm9tCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIENsYXNzTm90Rm91bmRFeGNlcHRpb24gaWYgYW4gdW5rbm93biBjbGFzcyBpcyBzcGVjaWZpZWQKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcmVhZE9iamVjdChPYmplY3RJbnB1dFN0cmVhbSBzdHJlYW0pCisgICAgICAgIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gRGVzZXJpYWxpemUgdGhlIHNjYWxhciBpbnN0YW5jZSB2YXJpYWJsZXMgKGV4Y2VwdCBNYW5hZ2VyKQorICAgICAgICBhdXRoVHlwZSA9IG51bGw7ICAgICAgICAvLyBUcmFuc2llbnQgb25seQorICAgICAgICBjcmVhdGlvblRpbWUgPSAoKExvbmcpIHN0cmVhbS5yZWFkT2JqZWN0KCkpLmxvbmdWYWx1ZSgpOworICAgICAgICBsYXN0QWNjZXNzZWRUaW1lID0gKChMb25nKSBzdHJlYW0ucmVhZE9iamVjdCgpKS5sb25nVmFsdWUoKTsKKyAgICAgICAgbWF4SW5hY3RpdmVJbnRlcnZhbCA9ICgoSW50ZWdlcikgc3RyZWFtLnJlYWRPYmplY3QoKSkuaW50VmFsdWUoKTsKKyAgICAgICAgaXNOZXcgPSAoKEJvb2xlYW4pIHN0cmVhbS5yZWFkT2JqZWN0KCkpLmJvb2xlYW5WYWx1ZSgpOworICAgICAgICBpc1ZhbGlkID0gKChCb29sZWFuKSBzdHJlYW0ucmVhZE9iamVjdCgpKS5ib29sZWFuVmFsdWUoKTsKKyAgICAgICAgdGhpc0FjY2Vzc2VkVGltZSA9ICgoTG9uZykgc3RyZWFtLnJlYWRPYmplY3QoKSkubG9uZ1ZhbHVlKCk7CisgICAgICAgIGJvb2xlYW4gaGFzUHJpbmNpcGFsID0gc3RyZWFtLnJlYWRCb29sZWFuKCk7CisgICAgICAgIHByaW5jaXBhbCA9IG51bGw7ICAgCisgICAgICAgIGlmICggaGFzUHJpbmNpcGFsICkgeworICAgICAgICAgICAgcHJpbmNpcGFsID0gU2VyaWFsaXphYmxlUHJpbmNpcGFsLnJlYWRQcmluY2lwYWwoc3RyZWFtLGdldE1hbmFnZXIoKS5nZXRDb250YWluZXIoKS5nZXRSZWFsbSgpKTsKKyAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgIC8vICAgICAgICBzZXRJZCgoU3RyaW5nKSBzdHJlYW0ucmVhZE9iamVjdCgpKTsKKyAgICAgICAgaWQgPSAoU3RyaW5nKSBzdHJlYW0ucmVhZE9iamVjdCgpOworICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoInJlYWRPYmplY3QoKSBsb2FkaW5nIHNlc3Npb24gIiArIGlkKTsKKworICAgICAgICAvLyBEZXNlcmlhbGl6ZSB0aGUgYXR0cmlidXRlIGNvdW50IGFuZCBhdHRyaWJ1dGUgdmFsdWVzCisgICAgICAgIGlmIChhdHRyaWJ1dGVzID09IG51bGwpCisgICAgICAgICAgICBhdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgaW50IG4gPSAoKEludGVnZXIpIHN0cmVhbS5yZWFkT2JqZWN0KCkpLmludFZhbHVlKCk7CisgICAgICAgIGJvb2xlYW4gaXNWYWxpZFNhdmUgPSBpc1ZhbGlkOworICAgICAgICBpc1ZhbGlkID0gdHJ1ZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZykgc3RyZWFtLnJlYWRPYmplY3QoKTsKKyAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IChPYmplY3QpIHN0cmVhbS5yZWFkT2JqZWN0KCk7CisgICAgICAgICAgICBpZiAoKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSAmJiAodmFsdWUuZXF1YWxzKE5PVF9TRVJJQUxJWkVEKSkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisvLyAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKy8vICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiICBsb2FkaW5nIGF0dHJpYnV0ZSAnIiArIG5hbWUgKworLy8gICAgICAgICAgICAgICAgICAgICInIHdpdGggdmFsdWUgJyIgKyB2YWx1ZSArICInIik7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGF0dHJpYnV0ZXMpIHsKKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLnB1dChuYW1lLCB2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaXNWYWxpZCA9IGlzVmFsaWRTYXZlOworICAgIH0KKworCisgICAgLyoqCisgICAgICogV3JpdGUgYSBzZXJpYWxpemVkIHZlcnNpb24gb2YgdGhpcyBzZXNzaW9uIG9iamVjdCB0byB0aGUgc3BlY2lmaWVkCisgICAgICogb2JqZWN0IG91dHB1dCBzdHJlYW0uCisgICAgICogPHA+CisgICAgICogPGI+SU1QTEVNRU5UQVRJT04gTk9URTwvYj46ICBUaGUgb3duaW5nIE1hbmFnZXIgd2lsbCBub3QgYmUgc3RvcmVkCisgICAgICogaW4gdGhlIHNlcmlhbGl6ZWQgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBTZXNzaW9uLiAgQWZ0ZXIgY2FsbGluZworICAgICAqIDxjb2RlPnJlYWRPYmplY3QoKTwvY29kZT4sIHlvdSBtdXN0IHNldCB0aGUgYXNzb2NpYXRlZCBNYW5hZ2VyCisgICAgICogZXhwbGljaXRseS4KKyAgICAgKiA8cD4KKyAgICAgKiA8Yj5JTVBMRU1FTlRBVElPTiBOT1RFPC9iPjogIEFueSBhdHRyaWJ1dGUgdGhhdCBpcyBub3QgU2VyaWFsaXphYmxlCisgICAgICogd2lsbCBiZSB1bmJvdW5kIGZyb20gdGhlIHNlc3Npb24sIHdpdGggYXBwcm9wcmlhdGUgYWN0aW9ucyBpZiBpdAorICAgICAqIGltcGxlbWVudHMgSHR0cFNlc3Npb25CaW5kaW5nTGlzdGVuZXIuICBJZiB5b3UgZG8gbm90IHdhbnQgYW55IHN1Y2gKKyAgICAgKiBhdHRyaWJ1dGVzLCBiZSBzdXJlIHRoZSA8Y29kZT5kaXN0cmlidXRhYmxlPC9jb2RlPiBwcm9wZXJ0eSBvZiB0aGUKKyAgICAgKiBhc3NvY2lhdGVkIE1hbmFnZXIgaXMgc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmVhbSBUaGUgb3V0cHV0IHN0cmVhbSB0byB3cml0ZSB0bworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KE9iamVjdE91dHB1dFN0cmVhbSBzdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gV3JpdGUgdGhlIHNjYWxhciBpbnN0YW5jZSB2YXJpYWJsZXMgKGV4Y2VwdCBNYW5hZ2VyKQorICAgICAgICBzdHJlYW0ud3JpdGVPYmplY3QobmV3IExvbmcoY3JlYXRpb25UaW1lKSk7CisgICAgICAgIHN0cmVhbS53cml0ZU9iamVjdChuZXcgTG9uZyhsYXN0QWNjZXNzZWRUaW1lKSk7CisgICAgICAgIHN0cmVhbS53cml0ZU9iamVjdChuZXcgSW50ZWdlcihtYXhJbmFjdGl2ZUludGVydmFsKSk7CisgICAgICAgIHN0cmVhbS53cml0ZU9iamVjdChuZXcgQm9vbGVhbihpc05ldykpOworICAgICAgICBzdHJlYW0ud3JpdGVPYmplY3QobmV3IEJvb2xlYW4oaXNWYWxpZCkpOworICAgICAgICBzdHJlYW0ud3JpdGVPYmplY3QobmV3IExvbmcodGhpc0FjY2Vzc2VkVGltZSkpOworICAgICAgICBzdHJlYW0ud3JpdGVCb29sZWFuKGdldFByaW5jaXBhbCgpIT1udWxsKTsKKyAgICAgICAgaWYgKGdldFByaW5jaXBhbCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIFNlcmlhbGl6YWJsZVByaW5jaXBhbC53cml0ZVByaW5jaXBhbCgoR2VuZXJpY1ByaW5jaXBhbClwcmluY2lwYWwsc3RyZWFtKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgc3RyZWFtLndyaXRlT2JqZWN0KGlkKTsKKyAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nLmRlYnVnKCJ3cml0ZU9iamVjdCgpIHN0b3Jpbmcgc2Vzc2lvbiAiICsgaWQpOworCisgICAgICAgIC8vIEFjY3VtdWxhdGUgdGhlIG5hbWVzIG9mIHNlcmlhbGl6YWJsZSBhbmQgbm9uLXNlcmlhbGl6YWJsZSBhdHRyaWJ1dGVzCisgICAgICAgIFN0cmluZyBrZXlzW10gPSBrZXlzKCk7CisgICAgICAgIEFycmF5TGlzdCBzYXZlTmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIEFycmF5TGlzdCBzYXZlVmFsdWVzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IG51bGw7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGF0dHJpYnV0ZXMpIHsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IGF0dHJpYnV0ZXMuZ2V0KGtleXNbaV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFNlcmlhbGl6YWJsZSkgeworICAgICAgICAgICAgICAgIHNhdmVOYW1lcy5hZGQoa2V5c1tpXSk7CisgICAgICAgICAgICAgICAgc2F2ZVZhbHVlcy5hZGQodmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gU2VyaWFsaXplIHRoZSBhdHRyaWJ1dGUgY291bnQgYW5kIHRoZSBTZXJpYWxpemFibGUgYXR0cmlidXRlcworICAgICAgICBpbnQgbiA9IHNhdmVOYW1lcy5zaXplKCk7CisgICAgICAgIHN0cmVhbS53cml0ZU9iamVjdChuZXcgSW50ZWdlcihuKSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICBzdHJlYW0ud3JpdGVPYmplY3QoKFN0cmluZykgc2F2ZU5hbWVzLmdldChpKSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHN0cmVhbS53cml0ZU9iamVjdChzYXZlVmFsdWVzLmdldChpKSk7CisvLyAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisvLyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgIHN0b3JpbmcgYXR0cmlidXRlICciICsgc2F2ZU5hbWVzLmdldChpKSArCisvLyAgICAgICAgICAgICAgICAgICAgICAgICInIHdpdGggdmFsdWUgJyIgKyBzYXZlVmFsdWVzLmdldChpKSArICInIik7CisgICAgICAgICAgICB9IGNhdGNoIChOb3RTZXJpYWxpemFibGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxvZy5lcnJvcihzbS5nZXRTdHJpbmcoInN0YW5kYXJkU2Vzc2lvbi5ub3RTZXJpYWxpemFibGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZU5hbWVzLmdldChpKSwgaWQpLCBlKTsKKyAgICAgICAgICAgICAgICBzdHJlYW0ud3JpdGVPYmplY3QoTk9UX1NFUklBTElaRUQpOworICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiICBzdG9yaW5nIGF0dHJpYnV0ZSAnIiArIHNhdmVOYW1lcy5nZXQoaSkgKworICAgICAgICAgICAgICAgICAgICAgICAgIicgd2l0aCB2YWx1ZSBOT1RfU0VSSUFMSVpFRCIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKworICAgIHByaXZhdGUgdm9pZCBldmFsdWF0ZUlmVmFsaWQoKSB7CisgICAgICAgIC8qCisgICAgICAgICAqIElmIHRoaXMgc2Vzc2lvbiBoYXMgZXhwaXJlZCBvciBpcyBpbiB0aGUgcHJvY2VzcyBvZiBleHBpcmluZyBvcgorICAgICAgICAgKiB3aWxsIG5ldmVyIGV4cGlyZSwgcmV0dXJuCisgICAgICAgICAqLworICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCB8fCBleHBpcmluZyB8fCBtYXhJbmFjdGl2ZUludGVydmFsIDwgMCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBpc1ZhbGlkKCk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByaXZhdGUgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBGaXJlIGNvbnRhaW5lciBldmVudHMgaWYgdGhlIENvbnRleHQgaW1wbGVtZW50YXRpb24gaXMgdGhlCisgICAgICogPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkQ29udGV4dDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IGZvciB3aGljaCB0byBmaXJlIGV2ZW50cworICAgICAqIEBwYXJhbSB0eXBlIEV2ZW50IHR5cGUKKyAgICAgKiBAcGFyYW0gZGF0YSBFdmVudCBkYXRhCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBvY2N1cnJlZCBkdXJpbmcgZXZlbnQgZmlyaW5nCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGZpcmVDb250YWluZXJFdmVudChDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdHlwZSwgT2JqZWN0IGRhdGEpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIGlmICghIm9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZENvbnRleHQiLmVxdWFscworICAgICAgICAgICAgKGNvbnRleHQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICByZXR1cm47IC8vIENvbnRhaW5lciBldmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQKKyAgICAgICAgfQorICAgICAgICAvLyBOT1RFOiAgUmFjZSBjb25kaXRpb24gaXMgaGFybWxlc3MsIHNvIGRvIG5vdCBzeW5jaHJvbml6ZQorICAgICAgICBpZiAoY29udGFpbmVyRXZlbnRNZXRob2QgPT0gbnVsbCkgeworICAgICAgICAgICAgY29udGFpbmVyRXZlbnRNZXRob2QgPQorICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0Q2xhc3MoKS5nZXRNZXRob2QoImZpcmVDb250YWluZXJFdmVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJFdmVudFR5cGVzKTsKKyAgICAgICAgfQorICAgICAgICBPYmplY3QgY29udGFpbmVyRXZlbnRQYXJhbXNbXSA9IG5ldyBPYmplY3RbMl07CisgICAgICAgIGNvbnRhaW5lckV2ZW50UGFyYW1zWzBdID0gdHlwZTsKKyAgICAgICAgY29udGFpbmVyRXZlbnRQYXJhbXNbMV0gPSBkYXRhOworICAgICAgICBjb250YWluZXJFdmVudE1ldGhvZC5pbnZva2UoY29udGV4dCwgY29udGFpbmVyRXZlbnRQYXJhbXMpOworCisgICAgfQorCisKKworICAgIC8qKgorICAgICAqIE5vdGlmeSBhbGwgc2Vzc2lvbiBldmVudCBsaXN0ZW5lcnMgdGhhdCBhIHBhcnRpY3VsYXIgZXZlbnQgaGFzCisgICAgICogb2NjdXJyZWQgZm9yIHRoaXMgU2Vzc2lvbi4gIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHBlcmZvcm1zCisgICAgICogdGhpcyBub3RpZmljYXRpb24gc3luY2hyb25vdXNseSB1c2luZyB0aGUgY2FsbGluZyB0aHJlYWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHlwZSBFdmVudCB0eXBlCisgICAgICogQHBhcmFtIGRhdGEgRXZlbnQgZGF0YQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGZpcmVTZXNzaW9uRXZlbnQoU3RyaW5nIHR5cGUsIE9iamVjdCBkYXRhKSB7CisgICAgICAgIGlmIChsaXN0ZW5lcnMuc2l6ZSgpIDwgMSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgU2Vzc2lvbkV2ZW50IGV2ZW50ID0gbmV3IFNlc3Npb25FdmVudCh0aGlzLCB0eXBlLCBkYXRhKTsKKyAgICAgICAgU2Vzc2lvbkxpc3RlbmVyIGxpc3RbXSA9IG5ldyBTZXNzaW9uTGlzdGVuZXJbMF07CisgICAgICAgIHN5bmNocm9uaXplZCAobGlzdGVuZXJzKSB7CisgICAgICAgICAgICBsaXN0ID0gKFNlc3Npb25MaXN0ZW5lcltdKSBsaXN0ZW5lcnMudG9BcnJheShsaXN0KTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKyl7CisgICAgICAgICAgICAoKFNlc3Npb25MaXN0ZW5lcikgbGlzdFtpXSkuc2Vzc2lvbkV2ZW50KGV2ZW50KTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG5hbWVzIG9mIGFsbCBjdXJyZW50bHkgZGVmaW5lZCBzZXNzaW9uIGF0dHJpYnV0ZXMKKyAgICAgKiBhcyBhbiBhcnJheSBvZiBTdHJpbmdzLiAgSWYgdGhlcmUgYXJlIG5vIGRlZmluZWQgYXR0cmlidXRlcywgYQorICAgICAqIHplcm8tbGVuZ3RoIGFycmF5IGlzIHJldHVybmVkLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmdbXSBrZXlzKCkgeworCisgICAgICAgIFN0cmluZyByZXN1bHRzW10gPSBuZXcgU3RyaW5nWzBdOworICAgICAgICBzeW5jaHJvbml6ZWQgKGF0dHJpYnV0ZXMpIHsKKyAgICAgICAgICAgIHJldHVybiAoKFN0cmluZ1tdKSBhdHRyaWJ1dGVzLmtleVNldCgpLnRvQXJyYXkocmVzdWx0cykpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdmFsdWUgb2YgYW4gYXR0cmlidXRlIHdpdGhvdXQgYSBjaGVjayBmb3IgdmFsaWRpdHkuCisgICAgICovCisgICAgcHJvdGVjdGVkIE9iamVjdCBnZXRBdHRyaWJ1dGVJbnRlcm5hbChTdHJpbmcgbmFtZSkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAoYXR0cmlidXRlcykgeworICAgICAgICAgICAgcmV0dXJuIChhdHRyaWJ1dGVzLmdldChuYW1lKSk7CisgICAgICAgIH0KKworICAgIH0KKyAgICAKKyAgICBwcm90ZWN0ZWQgdm9pZCByZW1vdmVBdHRyaWJ1dGVJbnRlcm5hbChTdHJpbmcgbmFtZSwgYm9vbGVhbiBub3RpZnksIGJvb2xlYW4gYWRkRGVsdGFSZXF1ZXN0KSB7CisKKyAgICAgICAgLy8gUmVtb3ZlIHRoaXMgYXR0cmlidXRlIGZyb20gb3VyIGNvbGxlY3Rpb24KKyAgICAgICAgT2JqZWN0IHZhbHVlID0gYXR0cmlidXRlcy5yZW1vdmUobmFtZSk7CisgICAgICAgIGlmICggdmFsdWUgPT0gbnVsbCApIHJldHVybjsKKworICAgICAgICBpZiAoYWRkRGVsdGFSZXF1ZXN0ICYmIChkZWx0YVJlcXVlc3QhPW51bGwpKSBkZWx0YVJlcXVlc3QucmVtb3ZlQXR0cmlidXRlKG5hbWUpOworCisgICAgICAgIC8vIERvIHdlIG5lZWQgdG8gZG8gdmFsdWVVbmJvdW5kKCkgYW5kIGF0dHJpYnV0ZVJlbW92ZWQoKSBub3RpZmljYXRpb24/CisgICAgICAgIGlmICghbm90aWZ5KSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBDYWxsIHRoZSB2YWx1ZVVuYm91bmQoKSBtZXRob2QgaWYgbmVjZXNzYXJ5CisgICAgICAgIEh0dHBTZXNzaW9uQmluZGluZ0V2ZW50IGV2ZW50ID0KKyAgICAgICAgICBuZXcgSHR0cFNlc3Npb25CaW5kaW5nRXZlbnQoKEh0dHBTZXNzaW9uKSBnZXRTZXNzaW9uKCksIG5hbWUsIHZhbHVlKTsKKyAgICAgICAgaWYgKCh2YWx1ZSAhPSBudWxsKSAmJgorICAgICAgICAgICAgKHZhbHVlIGluc3RhbmNlb2YgSHR0cFNlc3Npb25CaW5kaW5nTGlzdGVuZXIpKQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAoIChIdHRwU2Vzc2lvbkJpbmRpbmdMaXN0ZW5lcikgdmFsdWUpLnZhbHVlVW5ib3VuZChldmVudCk7CisgICAgICAgICAgICB9IGNhdGNoICggRXhjZXB0aW9uIHggKSB7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJTZXNzaW9uIGJpbmRpbmcgbGlzdGVuZXIgdGhyb3cgYW4gZXhjZXB0aW9uIix4KTsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgIC8vIE5vdGlmeSBpbnRlcmVzdGVkIGFwcGxpY2F0aW9uIGV2ZW50IGxpc3RlbmVycworICAgICAgICBDb250ZXh0IGNvbnRleHQgPSAoQ29udGV4dCkgbWFuYWdlci5nZXRDb250YWluZXIoKTsKKyAgICAgICAgLy9maXggZm9yIHN0YW5kYWxvbmUgbWFuYWdlciB3aXRob3V0IGNvbnRhaW5lcgorICAgICAgICBpZiAoIGNvbnRleHQgIT0gbnVsbCApIHsKKyAgICAgICAgICAgIE9iamVjdCBsaXN0ZW5lcnNbXSA9IGNvbnRleHQuZ2V0QXBwbGljYXRpb25FdmVudExpc3RlbmVycygpOworICAgICAgICAgICAgaWYgKGxpc3RlbmVycyA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKCEgKGxpc3RlbmVyc1tpXSBpbnN0YW5jZW9mIEh0dHBTZXNzaW9uQXR0cmlidXRlTGlzdGVuZXIpKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBIdHRwU2Vzc2lvbkF0dHJpYnV0ZUxpc3RlbmVyIGxpc3RlbmVyID0KKyAgICAgICAgICAgICAgICAgICAgKEh0dHBTZXNzaW9uQXR0cmlidXRlTGlzdGVuZXIpIGxpc3RlbmVyc1tpXTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBmaXJlQ29udGFpbmVyRXZlbnQoY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZWZvcmVTZXNzaW9uQXR0cmlidXRlUmVtb3ZlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLmF0dHJpYnV0ZVJlbW92ZWQoZXZlbnQpOworICAgICAgICAgICAgICAgICAgICBmaXJlQ29udGFpbmVyRXZlbnQoY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZnRlclNlc3Npb25BdHRyaWJ1dGVSZW1vdmVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmlyZUNvbnRhaW5lckV2ZW50KGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFmdGVyU2Vzc2lvbkF0dHJpYnV0ZVJlbW92ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRSAtIHNob3VsZCB3ZSBkbyBhbnl0aGluZyBiZXNpZGVzIGxvZyB0aGVzZT8KKyAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKHNtLmdldFN0cmluZygic3RhbmRhcmRTZXNzaW9uLmF0dHJpYnV0ZUV2ZW50IiksIHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gLy9mb3IKKyAgICAgICAgfS8vZW5kIGlmCisgICAgICAgIC8vZW5kIGZpeAorCisgICAgfQorCisgICAgCisgICAgcHJvdGVjdGVkIGxvbmcgZ2V0TGFzdFRpbWVSZXBsaWNhdGVkKCkgeworICAgICAgICByZXR1cm4gbGFzdFRpbWVSZXBsaWNhdGVkOworICAgIH0KKyAgICAKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRMYXN0VGltZVJlcGxpY2F0ZWQobG9uZyBsYXN0VGltZVJlcGxpY2F0ZWQpIHsKKyAgICAgICAgdGhpcy5sYXN0VGltZVJlcGxpY2F0ZWQgPSBsYXN0VGltZVJlcGxpY2F0ZWQ7CisgICAgfQorICAKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRBY2Nlc3NDb3VudChpbnQgYWNjZXNzQ291bnQpIHsKKyAgICAgIHRoaXMuYWNjZXNzQ291bnQgPSBhY2Nlc3NDb3VudDsKKyAgICB9CisgIAorICAgIHByb3RlY3RlZCBpbnQgZ2V0QWNjZXNzQ291bnQoKSB7CisgICAgICByZXR1cm4gYWNjZXNzQ291bnQ7CisgICAgfQorCit9CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJpdmF0ZSBDbGFzcworCisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBhIGR1bW15IGltcGxlbWVudGF0aW9uIG9mIHRoZSA8Y29kZT5IdHRwU2Vzc2lvbkNvbnRleHQ8L2NvZGU+CisgKiBpbnRlcmZhY2UsIHRvIGNvbmZvcm0gdG8gdGhlIHJlcXVpcmVtZW50IHRoYXQgc3VjaCBhbiBvYmplY3QgYmUgcmV0dXJuZWQKKyAqIHdoZW4gPGNvZGU+SHR0cFNlc3Npb24uZ2V0U2Vzc2lvbkNvbnRleHQoKTwvY29kZT4gaXMgY2FsbGVkLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICoKKyAqIEBkZXByZWNhdGVkIEFzIG9mIEphdmEgU2VydmxldCBBUEkgMi4xIHdpdGggbm8gcmVwbGFjZW1lbnQuICBUaGUKKyAqICBpbnRlcmZhY2Ugd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHZlcnNpb24gb2YgdGhpcyBBUEkuCisgKi8KKworZmluYWwgY2xhc3MgU3RhbmRhcmRTZXNzaW9uQ29udGV4dCBpbXBsZW1lbnRzIEh0dHBTZXNzaW9uQ29udGV4dCB7CisKKworICAgIHByaXZhdGUgSGFzaE1hcCBkdW1teSA9IG5ldyBIYXNoTWFwKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNlc3Npb24gaWRlbnRpZmllcnMgb2YgYWxsIHNlc3Npb25zIGRlZmluZWQKKyAgICAgKiB3aXRoaW4gdGhpcyBjb250ZXh0LgorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQgQXMgb2YgSmF2YSBTZXJ2bGV0IEFQSSAyLjEgd2l0aCBubyByZXBsYWNlbWVudC4KKyAgICAgKiAgVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gYW4gZW1wdHkgPGNvZGU+RW51bWVyYXRpb248L2NvZGU+CisgICAgICogIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgdmVyc2lvbiBvZiB0aGUgQVBJLgorICAgICAqLworICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRJZHMoKSB7CisKKyAgICAgICAgcmV0dXJuIChuZXcgRW51bWVyYXRvcihkdW1teSkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIDxjb2RlPkh0dHBTZXNzaW9uPC9jb2RlPiBhc3NvY2lhdGVkIHdpdGggdGhlCisgICAgICogc3BlY2lmaWVkIHNlc3Npb24gaWRlbnRpZmllci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpZCBTZXNzaW9uIGlkZW50aWZpZXIgZm9yIHdoaWNoIHRvIGxvb2sgdXAgYSBzZXNzaW9uCisgICAgICoKKyAgICAgKiBAZGVwcmVjYXRlZCBBcyBvZiBKYXZhIFNlcnZsZXQgQVBJIDIuMSB3aXRoIG5vIHJlcGxhY2VtZW50LgorICAgICAqICBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiBudWxsIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYQorICAgICAqICBmdXR1cmUgdmVyc2lvbiBvZiB0aGUgQVBJLgorICAgICAqLworICAgIHB1YmxpYyBIdHRwU2Vzc2lvbiBnZXRTZXNzaW9uKFN0cmluZyBpZCkgeworCisgICAgICAgIHJldHVybiAobnVsbCk7CisKKyAgICB9CisKKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvc2Vzc2lvbi9EZWx0YVNlc3Npb25GYWNhZGUuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9zZXNzaW9uL0RlbHRhU2Vzc2lvbkZhY2FkZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkNmFiMjQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvc2Vzc2lvbi9EZWx0YVNlc3Npb25GYWNhZGUuamF2YQpAQCAtMCwwICsxLDE1OSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnNlc3Npb247CisKKworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbkNvbnRleHQ7CisKKworLyoqCisgKiBGYWNhZGUgZm9yIHRoZSBEZWx0YVNlc3Npb24gb2JqZWN0LgorICoKKyAqIEBhdXRob3IgUmVteSBNYXVjaGVyYXQKKyAqIEBhdXRob3IgRmlsaXAgSGFuaWsKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIERlbHRhU2Vzc2lvbkZhY2FkZQorICAgIGltcGxlbWVudHMgSHR0cFNlc3Npb24geworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IHNlc3Npb24gZmFjYWRlLgorICAgICAqLworICAgIHB1YmxpYyBEZWx0YVNlc3Npb25GYWNhZGUoRGVsdGFTZXNzaW9uIHNlc3Npb24pIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgdGhpcy5zZXNzaW9uID0gKEh0dHBTZXNzaW9uKSBzZXNzaW9uOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IHNlc3Npb24gZmFjYWRlLgorICAgICAqLworICAgIHB1YmxpYyBEZWx0YVNlc3Npb25GYWNhZGUoSHR0cFNlc3Npb24gc2Vzc2lvbikgeworICAgICAgICBzdXBlcigpOworICAgICAgICB0aGlzLnNlc3Npb24gPSBzZXNzaW9uOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFdyYXBwZWQgc2Vzc2lvbiBvYmplY3QuCisgICAgICovCisgICAgcHJpdmF0ZSBIdHRwU2Vzc2lvbiBzZXNzaW9uID0gbnVsbDsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBIdHRwU2Vzc2lvbiBNZXRob2RzCisKKworICAgIHB1YmxpYyBsb25nIGdldENyZWF0aW9uVGltZSgpIHsKKyAgICAgICAgcmV0dXJuIHNlc3Npb24uZ2V0Q3JlYXRpb25UaW1lKCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkgeworICAgICAgICByZXR1cm4gc2Vzc2lvbi5nZXRJZCgpOworICAgIH0KKworCisgICAgcHVibGljIGxvbmcgZ2V0TGFzdEFjY2Vzc2VkVGltZSgpIHsKKyAgICAgICAgcmV0dXJuIHNlc3Npb24uZ2V0TGFzdEFjY2Vzc2VkVGltZSgpOworICAgIH0KKworCisgICAgcHVibGljIFNlcnZsZXRDb250ZXh0IGdldFNlcnZsZXRDb250ZXh0KCkgeworICAgICAgICAvLyBGSVhNRSA6IEZhY2FkZSB0aGlzIG9iamVjdCA/CisgICAgICAgIHJldHVybiBzZXNzaW9uLmdldFNlcnZsZXRDb250ZXh0KCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXRNYXhJbmFjdGl2ZUludGVydmFsKGludCBpbnRlcnZhbCkgeworICAgICAgICBzZXNzaW9uLnNldE1heEluYWN0aXZlSW50ZXJ2YWwoaW50ZXJ2YWwpOworICAgIH0KKworCisgICAgcHVibGljIGludCBnZXRNYXhJbmFjdGl2ZUludGVydmFsKCkgeworICAgICAgICByZXR1cm4gc2Vzc2lvbi5nZXRNYXhJbmFjdGl2ZUludGVydmFsKCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgSHR0cFNlc3Npb25Db250ZXh0IGdldFNlc3Npb25Db250ZXh0KCkgeworICAgICAgICByZXR1cm4gc2Vzc2lvbi5nZXRTZXNzaW9uQ29udGV4dCgpOworICAgIH0KKworCisgICAgcHVibGljIE9iamVjdCBnZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIHNlc3Npb24uZ2V0QXR0cmlidXRlKG5hbWUpOworICAgIH0KKworCisgICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZShTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gc2Vzc2lvbi5nZXRBdHRyaWJ1dGUobmFtZSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0QXR0cmlidXRlTmFtZXMoKSB7CisgICAgICAgIHJldHVybiBzZXNzaW9uLmdldEF0dHJpYnV0ZU5hbWVzKCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsdWVOYW1lcygpIHsKKyAgICAgICAgcmV0dXJuIHNlc3Npb24uZ2V0VmFsdWVOYW1lcygpOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgc2Vzc2lvbi5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgcHV0VmFsdWUoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICBzZXNzaW9uLnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc2Vzc2lvbi5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVWYWx1ZShTdHJpbmcgbmFtZSkgeworICAgICAgICBzZXNzaW9uLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIGludmFsaWRhdGUoKSB7CisgICAgICAgIHNlc3Npb24uaW52YWxpZGF0ZSgpOworICAgIH0KKworCisgICAgcHVibGljIGJvb2xlYW4gaXNOZXcoKSB7CisgICAgICAgIHJldHVybiBzZXNzaW9uLmlzTmV3KCk7CisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9zZXNzaW9uL1JlcGxpY2F0ZWRTZXNzaW9uLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvc2Vzc2lvbi9SZXBsaWNhdGVkU2Vzc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2YTRmNjMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvc2Vzc2lvbi9SZXBsaWNhdGVkU2Vzc2lvbi5qYXZhCkBAIC0wLDAgKzEsMjg2IEBACisKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuc2Vzc2lvbjsKKworLyoqCisgKiBUaXRsZTogICAgICAgIFRvbWNhdCBTZXNzaW9uIFJlcGxpY2F0aW9uIGZvciBUb21jYXQgNC4wIDxCUj4KKyAqIERlc2NyaXB0aW9uOiAgQSB2ZXJ5IHNpbXBsZSBzdHJhaWdodCBmb3J3YXJkIGltcGxlbWVudGF0aW9uIG9mCisgKiAgICAgICAgICAgICAgIHNlc3Npb24gcmVwbGljYXRpb24gb2Ygc2VydmVycyBpbiBhIGNsdXN0ZXIuPEJSPgorICogICAgICAgICAgICAgICBUaGlzIHNlc3Npb24gcmVwbGljYXRpb24gaXMgaW1wbGVtZW50ZWQgImxpdmUiLiBCeSBsaXZlCisgKiAgICAgICAgICAgICAgIEkgbWVhbiwgd2hlbiBhIHNlc3Npb24gYXR0cmlidXRlIGlzIGFkZGVkIGludG8gYSBzZXNzaW9uIG9uIE5vZGUgQQorICogICAgICAgICAgICAgICBhIG1lc3NhZ2UgaXMgYnJvYWRjYXN0ZWQgdG8gb3RoZXIgbWVzc2FnZXMgYW5kIHNldEF0dHJpYnV0ZSBpcyBjYWxsZWQgb24gdGhlIHJlcGxpY2F0ZWQKKyAqICAgICAgICAgICAgICAgc2Vzc2lvbnMuPEJSPgorICogICAgICAgICAgICAgICBBIGZ1bGwgZGVzY3JpcHRpb24gb2YgdGhpcyBpbXBsZW1lbnRhdGlvbiBjYW4gYmUgZm91bmQgdW5kZXIKKyAqICAgICAgICAgICAgICAgPGhyZWY9Imh0dHA6Ly93d3cuZmlsaXAubmV0L3RvbWNhdC8iPkZpbGlwJ3MgVG9tY2F0IFBhZ2U8L2E+PEJSPgorICoKKyAqIENvcHlyaWdodDogICAgU2VlIGFwYWNoZSBsaWNlbnNlCisgKiBDb21wYW55OiAgICAgIHd3dy5maWxpcC5uZXQKKyAqIEBhdXRob3IgIDxhIGhyZWY9Im1haWx0bzptYWlsQGZpbGlwLm5ldCI+RmlsaXAgSGFuaWs8L2E+CisgKiBAdmVyc2lvbiAxLjAgZm9yIFRDIDQuMAorICogRGVzY3JpcHRpb246PEJSPgorICogVGhlIFJlcGxpY2F0ZWRTZXNzaW9uIGNsYXNzIGlzIGEgc2ltcGxlIGV4dGVuc2lvbiBvZiB0aGUgU3RhbmRhcmRTZXNzaW9uIGNsYXNzCisgKiBJdCBvdmVycmlkZXMgYSBmZXcgbWV0aG9kcyAoc2V0QXR0cmlidXRlLCByZW1vdmVBdHRyaWJ1dGUsIGV4cGlyZSwgYWNjZXNzKSBhbmQgaGFzCisgKiBob29rcyBpbnRvIHRoZSBJbk1lbW9yeVJlcGxpY2F0aW9uTWFuYWdlciB0byBicm9hZGNhc3QgYW5kIHJlY2VpdmUgZXZlbnRzIGZyb20gdGhlIGNsdXN0ZXIuPEJSPgorICogVGhpcyBjbGFzcyBpbmhlcml0cyB0aGUgcmVhZE9iamVjdERhdGEgYW5kIHdyaXRlT2JqZWN0IGRhdGEgbWV0aG9kcyBmcm9tIHRoZSBTdGFuZGFyZFNlc3Npb24KKyAqIGFuZCBkb2VzIG5vdCBjb250YWluIGFueSBzZXJpYWxpemFibGUgZWxlbWVudHMgaW4gYWRkaXRpb24gdG8gdGhlIGluaGVyaXRlZCBvbmVzIGZyb20gdGhlIFN0YW5kYXJkU2Vzc2lvbgorICoKKyAqLworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTWFuYWdlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5zZWN1cml0eS5QcmluY2lwYWw7CisKK3B1YmxpYyBjbGFzcyBSZXBsaWNhdGVkU2Vzc2lvbiBleHRlbmRzIG9yZy5hcGFjaGUuY2F0YWxpbmEuc2Vzc2lvbi5TdGFuZGFyZFNlc3Npb24KK2ltcGxlbWVudHMgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLkNsdXN0ZXJTZXNzaW9ueworCisgICAgcHJpdmF0ZSB0cmFuc2llbnQgTWFuYWdlciBtTWFuYWdlciA9IG51bGw7CisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNEaXJ0eSA9IGZhbHNlOworICAgIHByaXZhdGUgdHJhbnNpZW50IGxvbmcgbGFzdEFjY2Vzc1dhc0Rpc3RyaWJ1dGVkID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgcHJpdmF0ZSBib29sZWFuIGlzUHJpbWFyeVNlc3Npb249dHJ1ZTsKKyAgICAKKworICAgIHB1YmxpYyBSZXBsaWNhdGVkU2Vzc2lvbihNYW5hZ2VyIG1hbmFnZXIpIHsKKyAgICAgICAgc3VwZXIobWFuYWdlcik7CisgICAgICAgIG1NYW5hZ2VyID0gbWFuYWdlcjsKKyAgICB9CisKKworICAgIHB1YmxpYyBib29sZWFuIGlzRGlydHkoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGlzRGlydHk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SXNEaXJ0eShib29sZWFuIGRpcnR5KQorICAgIHsKKyAgICAgICAgaXNEaXJ0eSA9IGRpcnR5OworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgc2V0TGFzdEFjY2Vzc1dhc0Rpc3RyaWJ1dGVkKGxvbmcgdGltZSkgeworICAgICAgICBsYXN0QWNjZXNzV2FzRGlzdHJpYnV0ZWQgPSB0aW1lOworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGdldExhc3RBY2Nlc3NXYXNEaXN0cmlidXRlZCgpIHsKKyAgICAgICAgcmV0dXJuIGxhc3RBY2Nlc3NXYXNEaXN0cmlidXRlZDsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUF0dHJpYnV0ZShTdHJpbmcgbmFtZSkgeworICAgICAgICBzZXRJc0RpcnR5KHRydWUpOworICAgICAgICBzdXBlci5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogc2VlIHBhcmVudCBkZXNjcmlwdGlvbiwKKyAgICAgKiBwbHVzIHdlIGFsc28gbm90aWZ5IG90aGVyIG5vZGVzIGluIHRoZSBjbHVzdGVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlQXR0cmlidXRlKFN0cmluZyBuYW1lLCBib29sZWFuIG5vdGlmeSkgeworICAgICAgICBzZXRJc0RpcnR5KHRydWUpOworICAgICAgICBzdXBlci5yZW1vdmVBdHRyaWJ1dGUobmFtZSxub3RpZnkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0cyBhbiBhdHRyaWJ1dGUgYW5kIG5vdGlmaWVzIHRoZSBvdGhlciBub2RlcyBpbiB0aGUgY2x1c3RlcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKQorICAgIHsKKyAgICAgICAgaWYgKCB2YWx1ZSA9PSBudWxsICkgeworICAgICAgICAgIHJlbW92ZUF0dHJpYnV0ZShuYW1lKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBqYXZhLmlvLlNlcmlhbGl6YWJsZSkpCisgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVmFsdWUgZm9yIGF0dHJpYnV0ZSAiK25hbWUrIiBpcyBub3Qgc2VyaWFsaXphYmxlLiIpOworICAgICAgICBzZXRJc0RpcnR5KHRydWUpOworICAgICAgICBzdXBlci5zZXRBdHRyaWJ1dGUobmFtZSx2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TWF4SW5hY3RpdmVJbnRlcnZhbChpbnQgaW50ZXJ2YWwpIHsKKyAgICAgICAgc2V0SXNEaXJ0eSh0cnVlKTsKKyAgICAgICAgc3VwZXIuc2V0TWF4SW5hY3RpdmVJbnRlcnZhbChpbnRlcnZhbCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBtYW5hZ2VyIGZvciB0aGlzIHNlc3Npb24KKyAgICAgKiBAcGFyYW0gbWdyIC0gdGhlIHNlcnZlcnMgSW5NZW1vcnlSZXBsaWNhdGlvbk1hbmFnZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNYW5hZ2VyKFNpbXBsZVRjcFJlcGxpY2F0aW9uTWFuYWdlciBtZ3IpCisgICAgeworICAgICAgICBtTWFuYWdlciA9IG1ncjsKKyAgICAgICAgc3VwZXIuc2V0TWFuYWdlcihtZ3IpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBhdXRoZW50aWNhdGVkIFByaW5jaXBhbCB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFNlc3Npb24uCisgICAgICogVGhpcyBwcm92aWRlcyBhbiA8Y29kZT5BdXRoZW50aWNhdG9yPC9jb2RlPiB3aXRoIGEgbWVhbnMgdG8gY2FjaGUgYQorICAgICAqIHByZXZpb3VzbHkgYXV0aGVudGljYXRlZCBQcmluY2lwYWwsIGFuZCBhdm9pZCBwb3RlbnRpYWxseSBleHBlbnNpdmUKKyAgICAgKiA8Y29kZT5SZWFsbS5hdXRoZW50aWNhdGUoKTwvY29kZT4gY2FsbHMgb24gZXZlcnkgcmVxdWVzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcmluY2lwYWwgVGhlIG5ldyBQcmluY2lwYWwsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcmluY2lwYWwoUHJpbmNpcGFsIHByaW5jaXBhbCkgeworICAgICAgICBzdXBlci5zZXRQcmluY2lwYWwocHJpbmNpcGFsKTsKKyAgICAgICAgc2V0SXNEaXJ0eSh0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBleHBpcmUoKSB7CisgICAgICAgIFNpbXBsZVRjcFJlcGxpY2F0aW9uTWFuYWdlciBtZ3IgPShTaW1wbGVUY3BSZXBsaWNhdGlvbk1hbmFnZXIpZ2V0TWFuYWdlcigpOworICAgICAgICBtZ3Iuc2Vzc2lvbkludmFsaWRhdGVkKGdldElkKCkpOworICAgICAgICBzZXRJc0RpcnR5KHRydWUpOworICAgICAgICBzdXBlci5leHBpcmUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbnZhbGlkYXRlKCkgeworICAgICAgICBTaW1wbGVUY3BSZXBsaWNhdGlvbk1hbmFnZXIgbWdyID0oU2ltcGxlVGNwUmVwbGljYXRpb25NYW5hZ2VyKWdldE1hbmFnZXIoKTsKKyAgICAgICAgbWdyLnNlc3Npb25JbnZhbGlkYXRlZChnZXRJZCgpKTsKKyAgICAgICAgc2V0SXNEaXJ0eSh0cnVlKTsKKyAgICAgICAgc3VwZXIuaW52YWxpZGF0ZSgpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVhZCBhIHNlcmlhbGl6ZWQgdmVyc2lvbiBvZiB0aGUgY29udGVudHMgb2YgdGhpcyBzZXNzaW9uIG9iamVjdCBmcm9tCisgICAgICogdGhlIHNwZWNpZmllZCBvYmplY3QgaW5wdXQgc3RyZWFtLCB3aXRob3V0IHJlcXVpcmluZyB0aGF0IHRoZQorICAgICAqIFN0YW5kYXJkU2Vzc2lvbiBpdHNlbGYgaGF2ZSBiZWVuIHNlcmlhbGl6ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyZWFtIFRoZSBvYmplY3QgaW5wdXQgc3RyZWFtIHRvIHJlYWQgZnJvbQorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGlmIGFuIHVua25vd24gY2xhc3MgaXMgc3BlY2lmaWVkCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVhZE9iamVjdERhdGEoT2JqZWN0SW5wdXRTdHJlYW0gc3RyZWFtKQorICAgICAgICB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCisgICAgICAgIHN1cGVyLnJlYWRPYmplY3REYXRhKHN0cmVhbSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFdyaXRlIGEgc2VyaWFsaXplZCB2ZXJzaW9uIG9mIHRoZSBjb250ZW50cyBvZiB0aGlzIHNlc3Npb24gb2JqZWN0IHRvCisgICAgICogdGhlIHNwZWNpZmllZCBvYmplY3Qgb3V0cHV0IHN0cmVhbSwgd2l0aG91dCByZXF1aXJpbmcgdGhhdCB0aGUKKyAgICAgKiBTdGFuZGFyZFNlc3Npb24gaXRzZWxmIGhhdmUgYmVlbiBzZXJpYWxpemVkLgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmVhbSBUaGUgb2JqZWN0IG91dHB1dCBzdHJlYW0gdG8gd3JpdGUgdG8KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHdyaXRlT2JqZWN0RGF0YShPYmplY3RPdXRwdXRTdHJlYW0gc3RyZWFtKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIHN1cGVyLndyaXRlT2JqZWN0RGF0YShzdHJlYW0pOworCisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBpZCwgYm9vbGVhbiB0ZWxsTmV3KSB7CisKKyAgICAgICAgaWYgKCh0aGlzLmlkICE9IG51bGwpICYmIChtYW5hZ2VyICE9IG51bGwpKQorICAgICAgICAgICAgbWFuYWdlci5yZW1vdmUodGhpcyk7CisKKyAgICAgICAgdGhpcy5pZCA9IGlkOworCisgICAgICAgIGlmIChtYW5hZ2VyICE9IG51bGwpCisgICAgICAgICAgICBtYW5hZ2VyLmFkZCh0aGlzKTsKKyAgICAgICAgaWYgKHRlbGxOZXcpIHRlbGxOZXcoKTsKKyAgICB9CisgICAgCisgICAgCisKKworCisKKworCisgICAgLyoqCisgICAgICogcmV0dXJucyB0cnVlIGlmIHRoaXMgc2Vzc2lvbiBpcyB0aGUgcHJpbWFyeSBzZXNzaW9uLCBpZiB0aGF0IGlzIHRoZQorICAgICAqIGNhc2UsIHRoZSBtYW5hZ2VyIGNhbiBleHBpcmUgaXQgdXBvbiB0aW1lb3V0LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzUHJpbWFyeVNlc3Npb24oKSB7CisgICAgICAgIHJldHVybiBpc1ByaW1hcnlTZXNzaW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgd2hldGhlciB0aGlzIGlzIHRoZSBwcmltYXJ5IHNlc3Npb24gb3Igbm90LgorICAgICAqIEBwYXJhbSBwcmltYXJ5U2Vzc2lvbiBGbGFnIHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJpbWFyeVNlc3Npb24oYm9vbGVhbiBwcmltYXJ5U2Vzc2lvbikgeworICAgICAgICB0aGlzLmlzUHJpbWFyeVNlc3Npb249cHJpbWFyeVNlc3Npb247CisgICAgfQorCisKKworCisgICAgLyoqCisgICAgICogSW1wbGVtZW50cyBhIGxvZyBtZXRob2QgdG8gbG9nIHRocm91Z2ggdGhlIG1hbmFnZXIKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBsb2coU3RyaW5nIG1lc3NhZ2UpIHsKKworICAgICAgICBpZiAoKG1NYW5hZ2VyICE9IG51bGwpICYmIChtTWFuYWdlciBpbnN0YW5jZW9mIFNpbXBsZVRjcFJlcGxpY2F0aW9uTWFuYWdlcikpIHsKKyAgICAgICAgICAgICgoU2ltcGxlVGNwUmVwbGljYXRpb25NYW5hZ2VyKSBtTWFuYWdlcikubG9nLmRlYnVnKCJSZXBsaWNhdGVkU2Vzc2lvbjogIiArIG1lc3NhZ2UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJSZXBsaWNhdGVkU2Vzc2lvbjogIiArIG1lc3NhZ2UpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBsb2coU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSB4KSB7CisKKyAgICAgICAgaWYgKChtTWFuYWdlciAhPSBudWxsKSAmJiAobU1hbmFnZXIgaW5zdGFuY2VvZiBTaW1wbGVUY3BSZXBsaWNhdGlvbk1hbmFnZXIpKSB7CisgICAgICAgICAgICAoKFNpbXBsZVRjcFJlcGxpY2F0aW9uTWFuYWdlcikgbU1hbmFnZXIpLmxvZy5lcnJvcigiUmVwbGljYXRlZFNlc3Npb246ICIgKyBtZXNzYWdlLHgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJSZXBsaWNhdGVkU2Vzc2lvbjogIiArIG1lc3NhZ2UpOworICAgICAgICAgICAgeC5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoIlJlcGxpY2F0ZWRTZXNzaW9uIGlkPSIpOworICAgICAgICBidWYuYXBwZW5kKGdldElkKCkpLmFwcGVuZCgiIHJlZj0iKS5hcHBlbmQoc3VwZXIudG9TdHJpbmcoKSkuYXBwZW5kKCJcbiIpOworICAgICAgICBqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IGdldEF0dHJpYnV0ZU5hbWVzKCk7CisgICAgICAgIHdoaWxlICggZS5oYXNNb3JlRWxlbWVudHMoKSApIHsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZyllLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBnZXRBdHRyaWJ1dGUobmFtZSk7CisgICAgICAgICAgICBidWYuYXBwZW5kKCJcdG5hbWU9IikuYXBwZW5kKG5hbWUpLmFwcGVuZCgiOyB2YWx1ZT0iKS5hcHBlbmQodmFsdWUpLmFwcGVuZCgiXG4iKTsKKyAgICAgICAgfQorICAgICAgICBidWYuYXBwZW5kKCJcdExhc3RBY2Nlc3M9IikuYXBwZW5kKGdldExhc3RBY2Nlc3NlZFRpbWUoKSkuYXBwZW5kKCJcbiIpOworICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgfQorICAgIHB1YmxpYyBpbnQgZ2V0QWNjZXNzQ291bnQoKSB7CisgICAgICAgIHJldHVybiBhY2Nlc3NDb3VudDsKKyAgICB9CisgICAgcHVibGljIHZvaWQgc2V0QWNjZXNzQ291bnQoaW50IGFjY2Vzc0NvdW50KSB7CisgICAgICAgIHRoaXMuYWNjZXNzQ291bnQgPSBhY2Nlc3NDb3VudDsKKyAgICB9CisgICAgcHVibGljIGxvbmcgZ2V0TGFzdEFjY2Vzc2VkVGltZSgpIHsKKyAgICAgICAgcmV0dXJuIGxhc3RBY2Nlc3NlZFRpbWU7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHNldExhc3RBY2Nlc3NlZFRpbWUobG9uZyBsYXN0QWNjZXNzZWRUaW1lKSB7CisgICAgICAgIHRoaXMubGFzdEFjY2Vzc2VkVGltZSA9IGxhc3RBY2Nlc3NlZFRpbWU7CisgICAgfQorICAgIHB1YmxpYyBsb25nIGdldFRoaXNBY2Nlc3NlZFRpbWUoKSB7CisgICAgICAgIHJldHVybiB0aGlzQWNjZXNzZWRUaW1lOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBzZXRUaGlzQWNjZXNzZWRUaW1lKGxvbmcgdGhpc0FjY2Vzc2VkVGltZSkgeworICAgICAgICB0aGlzLnRoaXNBY2Nlc3NlZFRpbWUgPSB0aGlzQWNjZXNzZWRUaW1lOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3Nlc3Npb24vUmVwbGljYXRpb25TdHJlYW0uamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9zZXNzaW9uL1JlcGxpY2F0aW9uU3RyZWFtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQwYzE1ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9zZXNzaW9uL1JlcGxpY2F0aW9uU3RyZWFtLmphdmEKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnNlc3Npb247CisKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk9iamVjdFN0cmVhbUNsYXNzOworCisvKioKKyAqIEN1c3RvbSBzdWJjbGFzcyBvZiA8Y29kZT5PYmplY3RJbnB1dFN0cmVhbTwvY29kZT4gdGhhdCBsb2FkcyBmcm9tIHRoZQorICogY2xhc3MgbG9hZGVyIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbi4gIFRoaXMgYWxsb3dzIGNsYXNzZXMgZGVmaW5lZCBvbmx5CisgKiB3aXRoIHRoZSB3ZWIgYXBwbGljYXRpb24gdG8gYmUgZm91bmQgY29ycmVjdGx5LgorICoKKyAqIEBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEBAYXV0aG9yIEJpcCBUaGVsaW4KKyAqIEBAdmVyc2lvbiAkUmV2aXNpb24kLCAkRGF0ZSQKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgUmVwbGljYXRpb25TdHJlYW0KKyAgICBleHRlbmRzIE9iamVjdElucHV0U3RyZWFtIHsKKworCisgICAgLyoqCisgICAgICogVGhlIGNsYXNzIGxvYWRlciB3ZSB3aWxsIHVzZSB0byByZXNvbHZlIGNsYXNzZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBDbGFzc0xvYWRlciBjbGFzc0xvYWRlciA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgaW5zdGFuY2Ugb2YgQ3VzdG9tT2JqZWN0SW5wdXRTdHJlYW0KKyAgICAgKgorICAgICAqIEBAcGFyYW0gc3RyZWFtIFRoZSBpbnB1dCBzdHJlYW0gd2Ugd2lsbCByZWFkIGZyb20KKyAgICAgKiBAQHBhcmFtIGNsYXNzTG9hZGVyIFRoZSBjbGFzcyBsb2FkZXIgdXNlZCB0byBpbnN0YW50aWF0ZSBvYmplY3RzCisgICAgICoKKyAgICAgKiBAQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIFJlcGxpY2F0aW9uU3RyZWFtKElucHV0U3RyZWFtIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgc3VwZXIoc3RyZWFtKTsKKyAgICAgICAgdGhpcy5jbGFzc0xvYWRlciA9IGNsYXNzTG9hZGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIExvYWQgdGhlIGxvY2FsIGNsYXNzIGVxdWl2YWxlbnQgb2YgdGhlIHNwZWNpZmllZCBzdHJlYW0gY2xhc3MKKyAgICAgKiBkZXNjcmlwdGlvbiwgYnkgdXNpbmcgdGhlIGNsYXNzIGxvYWRlciBhc3NpZ25lZCB0byB0aGlzIENvbnRleHQuCisgICAgICoKKyAgICAgKiBAQHBhcmFtIGNsYXNzRGVzYyBDbGFzcyBkZXNjcmlwdGlvbiBmcm9tIHRoZSBpbnB1dCBzdHJlYW0KKyAgICAgKgorICAgICAqIEBAZXhjZXB0aW9uIENsYXNzTm90Rm91bmRFeGNlcHRpb24gaWYgdGhpcyBjbGFzcyBjYW5ub3QgYmUgZm91bmQKKyAgICAgKiBAQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIENsYXNzIHJlc29sdmVDbGFzcyhPYmplY3RTdHJlYW1DbGFzcyBjbGFzc0Rlc2MpCisgICAgICAgIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBuYW1lID0gY2xhc3NEZXNjLmdldE5hbWUoKTsKKyAgICAgICAgYm9vbGVhbiB0cnlSZXBGaXJzdCA9IG5hbWUuc3RhcnRzV2l0aCgib3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyIik7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHRyeVJlcEZpcnN0ICkgcmV0dXJuIGZpbmRSZXBsaWNhdGlvbkNsYXNzKG5hbWUpOworICAgICAgICAgICAgZWxzZSByZXR1cm4gZmluZFdlYmFwcENsYXNzKG5hbWUpOworICAgICAgICB9CisgICAgICAgIGNhdGNoICggRXhjZXB0aW9uIHggKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHRyeVJlcEZpcnN0ICkgcmV0dXJuIGZpbmRXZWJhcHBDbGFzcyhuYW1lKTsKKyAgICAgICAgICAgIGVsc2UgcmV0dXJuIGZpbmRSZXBsaWNhdGlvbkNsYXNzKG5hbWUpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyBDbGFzcyBmaW5kUmVwbGljYXRpb25DbGFzcyhTdHJpbmcgbmFtZSkKKyAgICAgICAgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIENsYXNzLmZvck5hbWUobmFtZSwgZmFsc2UsIGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7CisgICAgfQorCisgICAgcHVibGljIENsYXNzIGZpbmRXZWJhcHBDbGFzcyhTdHJpbmcgbmFtZSkKKyAgICAgICAgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIENsYXNzLmZvck5hbWUobmFtZSwgZmFsc2UsIGNsYXNzTG9hZGVyKTsKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3Nlc3Npb24vU2VyaWFsaXphYmxlUHJpbmNpcGFsLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvc2Vzc2lvbi9TZXJpYWxpemFibGVQcmluY2lwYWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTBmMjdiCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3Nlc3Npb24vU2VyaWFsaXphYmxlUHJpbmNpcGFsLmphdmEKQEAgLTAsMCArMSwxODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5zZXNzaW9uOworCisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuUmVhbG07CisKKworLyoqCisgKiBHZW5lcmljIGltcGxlbWVudGF0aW9uIG9mIDxzdHJvbmc+amF2YS5zZWN1cml0eS5QcmluY2lwYWw8L3N0cm9uZz4gdGhhdAorICogaXMgYXZhaWxhYmxlIGZvciB1c2UgYnkgPGNvZGU+UmVhbG08L2NvZGU+IGltcGxlbWVudGF0aW9ucy4KKyAqIFRoZSBHZW5lcmljUHJpbmNpcGFsIGRvZXMgTk9UIGltcGxlbWVudCBzZXJpYWxpemFibGUgYW5kIEkgZGlkbid0IHdhbnQgdG8gY2hhbmdlIHRoYXQgaW1wbGVtZW50YXRpb24KKyAqIGhlbmNlIEkgaW1wbGVtZW50ZWQgdGhpcyBvbmUgaW5zdGVhZC4KKyAqIEBhdXRob3IgRmlsaXAgSGFuaWsKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtLkdlbmVyaWNQcmluY2lwYWw7CitwdWJsaWMgY2xhc3MgU2VyaWFsaXphYmxlUHJpbmNpcGFsICBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKyAgICBwdWJsaWMgU2VyaWFsaXphYmxlUHJpbmNpcGFsKCkKKyAgICB7CisgICAgICAgIHN1cGVyKCk7CisgICAgfQorICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBQcmluY2lwYWwsIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIFJlYWxtLCBmb3IgdGhlCisgICAgICogc3BlY2lmaWVkIHVzZXJuYW1lIGFuZCBwYXNzd29yZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWFsbSBUaGUgUmVhbG0gdGhhdCBvd25zIHRoaXMgUHJpbmNpcGFsCisgICAgICogQHBhcmFtIG5hbWUgVGhlIHVzZXJuYW1lIG9mIHRoZSB1c2VyIHJlcHJlc2VudGVkIGJ5IHRoaXMgUHJpbmNpcGFsCisgICAgICogQHBhcmFtIHBhc3N3b3JkIENyZWRlbnRpYWxzIHVzZWQgdG8gYXV0aGVudGljYXRlIHRoaXMgdXNlcgorICAgICAqLworICAgIHB1YmxpYyBTZXJpYWxpemFibGVQcmluY2lwYWwoUmVhbG0gcmVhbG0sIFN0cmluZyBuYW1lLCBTdHJpbmcgcGFzc3dvcmQpIHsKKworICAgICAgICB0aGlzKHJlYWxtLCBuYW1lLCBwYXNzd29yZCwgbnVsbCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBQcmluY2lwYWwsIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIFJlYWxtLCBmb3IgdGhlCisgICAgICogc3BlY2lmaWVkIHVzZXJuYW1lIGFuZCBwYXNzd29yZCwgd2l0aCB0aGUgc3BlY2lmaWVkIHJvbGUgbmFtZXMKKyAgICAgKiAoYXMgU3RyaW5ncykuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVhbG0gVGhlIFJlYWxtIHRoYXQgb3ducyB0aGlzIHByaW5jaXBhbAorICAgICAqIEBwYXJhbSBuYW1lIFRoZSB1c2VybmFtZSBvZiB0aGUgdXNlciByZXByZXNlbnRlZCBieSB0aGlzIFByaW5jaXBhbAorICAgICAqIEBwYXJhbSBwYXNzd29yZCBDcmVkZW50aWFscyB1c2VkIHRvIGF1dGhlbnRpY2F0ZSB0aGlzIHVzZXIKKyAgICAgKiBAcGFyYW0gcm9sZXMgTGlzdCBvZiByb2xlcyAobXVzdCBiZSBTdHJpbmdzKSBwb3NzZXNzZWQgYnkgdGhpcyB1c2VyCisgICAgICovCisgICAgcHVibGljIFNlcmlhbGl6YWJsZVByaW5jaXBhbChSZWFsbSByZWFsbSwgU3RyaW5nIG5hbWUsIFN0cmluZyBwYXNzd29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0IHJvbGVzKSB7CisKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgdGhpcy5yZWFsbSA9IHJlYWxtOworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB0aGlzLnBhc3N3b3JkID0gcGFzc3dvcmQ7CisgICAgICAgIGlmIChyb2xlcyAhPSBudWxsKSB7CisgICAgICAgICAgICB0aGlzLnJvbGVzID0gbmV3IFN0cmluZ1tyb2xlcy5zaXplKCldOworICAgICAgICAgICAgdGhpcy5yb2xlcyA9IChTdHJpbmdbXSkgcm9sZXMudG9BcnJheSh0aGlzLnJvbGVzKTsKKyAgICAgICAgICAgIGlmICh0aGlzLnJvbGVzLmxlbmd0aCA+IDApCisgICAgICAgICAgICAgICAgQXJyYXlzLnNvcnQodGhpcy5yb2xlcyk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFRoZSB1c2VybmFtZSBvZiB0aGUgdXNlciByZXByZXNlbnRlZCBieSB0aGlzIFByaW5jaXBhbC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gKHRoaXMubmFtZSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgYXV0aGVudGljYXRpb24gY3JlZGVudGlhbHMgZm9yIHRoZSB1c2VyIHJlcHJlc2VudGVkIGJ5CisgICAgICogdGhpcyBQcmluY2lwYWwuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBwYXNzd29yZCA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhc3N3b3JkKCkgeworICAgICAgICByZXR1cm4gKHRoaXMucGFzc3dvcmQpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIFJlYWxtIHdpdGggd2hpY2ggdGhpcyBQcmluY2lwYWwgaXMgYXNzb2NpYXRlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdHJhbnNpZW50IFJlYWxtIHJlYWxtID0gbnVsbDsKKworICAgIHB1YmxpYyBSZWFsbSBnZXRSZWFsbSgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLnJlYWxtKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRSZWFsbShSZWFsbSByZWFsbSkgeworICAgICAgICB0aGlzLnJlYWxtID0gcmVhbG07CisgICAgfQorCisKKworCisgICAgLyoqCisgICAgICogVGhlIHNldCBvZiByb2xlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyB1c2VyLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgcm9sZXNbXSA9IG5ldyBTdHJpbmdbMF07CisKKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0Um9sZXMoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5yb2xlcyk7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdCwgd2hpY2ggZXhwb3NlcyBvbmx5CisgICAgICogaW5mb3JtYXRpb24gdGhhdCBzaG91bGQgYmUgcHVibGljLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiU2VyaWFsaXphYmxlUHJpbmNpcGFsWyIpOworICAgICAgICBzYi5hcHBlbmQodGhpcy5uYW1lKTsKKyAgICAgICAgc2IuYXBwZW5kKCJdIik7CisgICAgICAgIHJldHVybiAoc2IudG9TdHJpbmcoKSk7CisKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFNlcmlhbGl6YWJsZVByaW5jaXBhbCBjcmVhdGVQcmluY2lwYWwoR2VuZXJpY1ByaW5jaXBhbCBwcmluY2lwYWwpCisgICAgeworICAgICAgICBpZiAoIHByaW5jaXBhbD09bnVsbCkgcmV0dXJuIG51bGw7CisgICAgICAgIHJldHVybiBuZXcgU2VyaWFsaXphYmxlUHJpbmNpcGFsKHByaW5jaXBhbC5nZXRSZWFsbSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmluY2lwYWwuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmluY2lwYWwuZ2V0UGFzc3dvcmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbmNpcGFsLmdldFJvbGVzKCkhPW51bGw/QXJyYXlzLmFzTGlzdChwcmluY2lwYWwuZ2V0Um9sZXMoKSk6bnVsbCk7CisgICAgfQorCisgICAgcHVibGljIEdlbmVyaWNQcmluY2lwYWwgZ2V0UHJpbmNpcGFsKCBSZWFsbSByZWFsbSApCisgICAgeworICAgICAgICByZXR1cm4gbmV3IEdlbmVyaWNQcmluY2lwYWwocmVhbG0sbmFtZSxwYXNzd29yZCxnZXRSb2xlcygpIT1udWxsP0FycmF5cy5hc0xpc3QoZ2V0Um9sZXMoKSk6bnVsbCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgR2VuZXJpY1ByaW5jaXBhbCByZWFkUHJpbmNpcGFsKGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0gaW4sIFJlYWxtIHJlYWxtKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbnsKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBpbi5yZWFkVVRGKCk7CisgICAgICAgIFN0cmluZyBwd2QgPSBpbi5yZWFkVVRGKCk7CisgICAgICAgIGludCBzaXplID0gaW4ucmVhZEludCgpOworICAgICAgICBTdHJpbmdbXSByb2xlcyA9IG5ldyBTdHJpbmdbc2l6ZV07CisgICAgICAgIGZvciAoIGludCBpPTA7IGk8c2l6ZTsgaSsrICkgcm9sZXNbaV0gPSBpbi5yZWFkVVRGKCk7CisgICAgICAgIHJldHVybiBuZXcgR2VuZXJpY1ByaW5jaXBhbChyZWFsbSxuYW1lLHB3ZCxBcnJheXMuYXNMaXN0KHJvbGVzKSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZVByaW5jaXBhbChHZW5lcmljUHJpbmNpcGFsIHAsIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICBvdXQud3JpdGVVVEYocC5nZXROYW1lKCkpOworICAgICAgICBvdXQud3JpdGVVVEYocC5nZXRQYXNzd29yZCgpKTsKKyAgICAgICAgU3RyaW5nW10gcm9sZXMgPSBwLmdldFJvbGVzKCk7CisgICAgICAgIGlmICggcm9sZXMgPT0gbnVsbCApIHJvbGVzID0gbmV3IFN0cmluZ1swXTsKKyAgICAgICAgb3V0LndyaXRlSW50KHJvbGVzLmxlbmd0aCk7CisgICAgICAgIGZvciAoIGludCBpPTA7IGk8cm9sZXMubGVuZ3RoOyBpKysgKSBvdXQud3JpdGVVVEYocm9sZXNbaV0pOworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvc2Vzc2lvbi9TZXNzaW9uTWVzc2FnZS5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3Nlc3Npb24vU2Vzc2lvbk1lc3NhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2UwYjc3Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3Nlc3Npb24vU2Vzc2lvbk1lc3NhZ2UuamF2YQpAQCAtMCwwICsxLDk4IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5zZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5DbHVzdGVyTWVzc2FnZTsKKworLyoqCisgKgorICogPEI+Q2xhc3MgRGVzY3JpcHRpb246PC9CPjxCUj4KKyAqIFRoZSBTZXNzaW9uTWVzc2FnZSBjbGFzcyBpcyBhIGNsYXNzIHRoYXQgaXMgdXNlZCB3aGVuIGEgc2Vzc2lvbiBoYXMgYmVlbgorICogY3JlYXRlZCwgbW9kaWZpZWQsIGV4cGlyZWQgaW4gYSBUb21jYXQgY2x1c3RlciBub2RlLjxCUj4KKyAqCisgKiBUaGUgZm9sbG93aW5nIGV2ZW50cyBhcmUgY3VycmVudGx5IGF2YWlsYWJsZToKKyAqIDx1bD4KKyAqICAgPGxpPjxwcmU+cHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZUX1NFU1NJT05fQ1JFQVRFRDwvcHJlPjxsaT4KKyAqICAgPGxpPjxwcmU+cHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZUX1NFU1NJT05fQUNDRVNTRUQ8L3ByZT48bGk+CisgKiAgIDxsaT48cHJlPnB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWVF9BVFRSSUJVVEVfQURERUQ8L3ByZT48bGk+CisgKiAgIDxsaT48cHJlPnB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWVF9BVFRSSUJVVEVfUkVNT1ZFRDwvcHJlPjxsaT4KKyAqICAgPGxpPjxwcmU+cHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZUX1NFU1NJT05fRVhQSVJFRF9XT05PVElGWTwvcHJlPjxsaT4KKyAqICAgPGxpPjxwcmU+cHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZUX1NFU1NJT05fRVhQSVJFRF9XTk9USUZZPC9wcmU+PGxpPgorICogICA8bGk+PHByZT5wdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVlRfR0VUX0FMTF9TRVNTSU9OUzwvcHJlPjxsaT4KKyAqICAgPGxpPjxwcmU+cHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZUX1NFVF9VU0VSX1BSSU5DSVBBTDwvcHJlPjxsaT4KKyAqICAgPGxpPjxwcmU+cHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZUX1NFVF9TRVNTSU9OX05PVEU8L3ByZT48bGk+CisgKiAgIDxsaT48cHJlPnB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWVF9SRU1PVkVfU0VTU0lPTl9OT1RFPC9wcmU+PGxpPgorICogPC91bD4KKyAqCisgKi8KKworcHVibGljIGludGVyZmFjZSBTZXNzaW9uTWVzc2FnZSBleHRlbmRzIENsdXN0ZXJNZXNzYWdlLCBqYXZhLmlvLlNlcmlhbGl6YWJsZQoreworCisgICAgLyoqCisgICAgICogRXZlbnQgdHlwZSB1c2VkIHdoZW4gYSBzZXNzaW9uIGhhcyBiZWVuIGNyZWF0ZWQgb24gYSBub2RlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZUX1NFU1NJT05fQ1JFQVRFRCA9IDE7CisgICAgLyoqCisgICAgICogRXZlbnQgdHlwZSB1c2VkIHdoZW4gYSBzZXNzaW9uIGhhcyBleHBpcmVkCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZUX1NFU1NJT05fRVhQSVJFRCA9IDI7CisKKyAgICAvKioKKyAgICAgKiBFdmVudCB0eXBlIHVzZWQgd2hlbiBhIHNlc3Npb24gaGFzIGJlZW4gYWNjZXNzZWQgKGllLCBsYXN0IGFjY2VzcyB0aW1lCisgICAgICogaGFzIGJlZW4gdXBkYXRlZC4gVGhpcyBpcyB1c2VkIHNvIHRoYXQgdGhlIHJlcGxpY2F0ZWQgc2Vzc2lvbnMgd2lsbCBub3QgZXhwaXJlCisgICAgICogb24gdGhlIG5ldHdvcmsKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVlRfU0VTU0lPTl9BQ0NFU1NFRCA9IDM7CisgICAgLyoqCisgICAgICogRXZlbnQgdHlwZSB1c2VkIHdoZW4gYSBzZXJ2ZXIgY29tZXMgb25saW5lIGZvciB0aGUgZmlyc3QgdGltZS4KKyAgICAgKiBUaGUgZmlyc3QgdGhpbmcgdGhlIG5ld2x5IHN0YXJ0ZWQgc2VydmVyIHdhbnRzIHRvIGRvIGlzIHRvIGdyYWIgdGhlCisgICAgICogYWxsIHRoZSBzZXNzaW9ucyBmcm9tIG9uZSBvZiB0aGUgbm9kZXMgYW5kIGtlZXAgdGhlIHNhbWUgc3RhdGUgaW4gdGhlcmUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVlRfR0VUX0FMTF9TRVNTSU9OUyA9IDQ7CisgICAgLyoqCisgICAgICogRXZlbnQgdHlwZSB1c2VkIHdoZW4gYW4gYXR0cmlidXRlIGhhcyBiZWVuIGFkZGVkIHRvIGEgc2Vzc2lvbiwKKyAgICAgKiB0aGUgYXR0cmlidXRlIHdpbGwgYmUgc2VudCB0byBhbGwgdGhlIG90aGVyIG5vZGVzIGluIHRoZSBjbHVzdGVyCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZUX1NFU1NJT05fREVMVEEgID0gMTM7CisKKyAgICAvKioKKyAgICAgKiBXaGVuIGEgc2Vzc2lvbiBzdGF0ZSBpcyB0cmFuc2ZlcnJlZCwgdGhpcyBpcyB0aGUgZXZlbnQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZUX0FMTF9TRVNTSU9OX0RBVEEgPSAxMjsKKyAgICAKKworICAgIAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGV4dE5hbWUoKTsKKyAgICAKKyAgICBwdWJsaWMgU3RyaW5nIGdldEV2ZW50VHlwZVN0cmluZygpOworICAgIAorICAgIC8qKgorICAgICAqIHJldHVybnMgdGhlIGV2ZW50IHR5cGUKKyAgICAgKiBAcmV0dXJuIG9uZSBvZiB0aGUgZXZlbnQgdHlwZXMgRVZUX1hYWFgKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEV2ZW50VHlwZSgpOyAKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBzZXJpYWxpemVkIGRhdGEgZm9yIHRoZSBzZXNzaW9uCisgICAgICovCisgICAgcHVibGljIGJ5dGVbXSBnZXRTZXNzaW9uKCk7CisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgc2Vzc2lvbiBJRCBmb3IgdGhlIHNlc3Npb24KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFNlc3Npb25JRCgpOworICAgIAorCisKK30vL1Nlc3Npb25NZXNzYWdlCmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvc2Vzc2lvbi9TZXNzaW9uTWVzc2FnZUltcGwuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9zZXNzaW9uL1Nlc3Npb25NZXNzYWdlSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyODEwMjcKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvc2Vzc2lvbi9TZXNzaW9uTWVzc2FnZUltcGwuamF2YQpAQCAtMCwwICsxLDE1NyBAQAorcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuc2Vzc2lvbjsKKworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLk1lbWJlcjsKKy8qKgorICogPHA+VGl0bGU6IDwvcD4KKyAqIDxwPkRlc2NyaXB0aW9uOiA8L3A+CisgKiA8cD5Db3B5cmlnaHQ6IENvcHlyaWdodCAoYykgMjAwNDwvcD4KKyAqIDxwPkNvbXBhbnk6IDwvcD4KKyAqIEBhdXRob3Igbm90IGF0dHJpYnV0YWJsZQorICogQHZlcnNpb24gMS4wCisgKi8KKworcHVibGljIGNsYXNzIFNlc3Npb25NZXNzYWdlSW1wbCBpbXBsZW1lbnRzIFNlc3Npb25NZXNzYWdlLCBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7CisgICAgcHVibGljIFNlc3Npb25NZXNzYWdlSW1wbCgpIHsKKyAgICB9CisgICAgCisgICAgCisgICAgLyoKKworICAgICAqIFByaXZhdGUgc2VyaWFsaXphYmxlIHZhcmlhYmxlcyB0byBrZWVwIHRoZSBtZXNzYWdlcyBzdGF0ZQorICAgICAqLworICAgIHByaXZhdGUgaW50IG1FdnRUeXBlID0gLTE7CisgICAgcHJpdmF0ZSBieXRlW10gbVNlc3Npb247CisgICAgcHJpdmF0ZSBTdHJpbmcgbVNlc3Npb25JRDsKKyAgICBwcml2YXRlIE1lbWJlciBtU3JjOworICAgIHByaXZhdGUgU3RyaW5nIG1Db250ZXh0TmFtZTsKKyAgICBwcml2YXRlIGxvbmcgc2VyaWFsaXphdGlvblRpbWVzdGFtcDsKKyAgICBwcml2YXRlIFN0cmluZyB1bmlxdWVJZDsKKworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIHNlc3Npb24gbWVzc2FnZS4gRGVwZW5kaW5nIG9uIHdoYXQgZXZlbnQgdHlwZSB5b3Ugd2FudCB0aGlzCisgICAgICogbWVzc2FnZSB0byByZXByZXNlbnQsIHlvdSBwb3B1bGF0ZSB0aGUgZGlmZmVyZW50IHBhcmFtZXRlcnMgaW4gdGhlIGNvbnN0cnVjdG9yPEJSPgorICAgICAqIFRoZSBmb2xsb3dpbmcgcnVsZXMgYXBwbHkgZGVwZW5kZW50IG9uIHdoYXQgZXZlbnQgdHlwZSBhcmd1bWVudCB5b3UgdXNlOjxCUj4KKyAgICAgKiA8Qj5FVlRfU0VTU0lPTl9DUkVBVEVEPC9CPjxCUj4KKyAgICAgKiAgICBUaGUgcGFyYW1ldGVyczogc2Vzc2lvbiwgc2Vzc2lvbklEIG11c3QgYmUgc2V0LjxCUj4KKyAgICAgKiA8Qj5FVlRfU0VTU0lPTl9FWFBJUkVEPC9CPjxCUj4KKyAgICAgKiAgICBUaGUgcGFyYW1ldGVyczogc2Vzc2lvbklEIG11c3QgYmUgc2V0LjxCUj4KKyAgICAgKiA8Qj5FVlRfU0VTU0lPTl9BQ0NFU1NFRDwvQj48QlI+CisgICAgICogICAgVGhlIHBhcmFtZXRlcnM6IHNlc3Npb25JRCBtdXN0IGJlIHNldC48QlI+CisgICAgICogPEI+RVZUX1NFU1NJT05fRVhQSVJFRF9YWFhYPC9CPjxCUj4KKyAgICAgKiAgICBUaGUgcGFyYW1ldGVyczogc2Vzc2lvbklEIG11c3QgYmUgc2V0LjxCUj4KKyAgICAgKiA8Qj5FVlRfQVRUUklCVVRFX0FEREVEPC9CPjxCUj4KKyAgICAgKiAgICBUaGUgcGFyYW1ldGVyczogc2Vzc2lvbklELCBhdHRyTmFtZSwgYXR0clZhbHVlIG11c3QgYmUgc2V0LjxCUj4KKyAgICAgKiA8Qj5FVlRfQVRUUklCVVRFX1JFTU9WRUQ8L0I+PEJSPgorICAgICAqICAgIFRoZSBwYXJhbWV0ZXJzOiBzZXNzaW9uSUQsIGF0dHJOYW1lIG11c3QgYmUgc2V0LjxCUj4KKyAgICAgKiA8Qj5FVlRfU0VUX1VTRVJfUFJJTkNJUEFMPC9CPjxCUj4KKyAgICAgKiAgICBUaGUgcGFyYW1ldGVyczogc2Vzc2lvbklELCBwcmluY2lwYWw8QlI+CisgICAgICogPEI+RVZUX1JFTU9WRV9TRVNTSU9OX05PVEU8L0I+PEJSPgorICAgICAqICAgIFRoZSBwYXJhbWV0ZXJzOiBzZXNzaW9uSUQsIGF0dHJOYW1lPAorICAgICAqIDxCPkVWVF9TRVRfU0VTU0lPTl9OT1RFPC9CPjxCUj4KKyAgICAgKiAgICBUaGUgcGFyYW1ldGVyczogc2Vzc2lvbklELCBhdHRyTmFtZSwgYXR0clZhbHVlCisgICAgICogQHBhcmFtIGV2ZW50dHlwZSAtIG9uZSBvZiB0aGUgOCBldmVudCB0eXBlIGRlZmluZWQgaW4gdGhpcyBjbGFzcworICAgICAqIEBwYXJhbSBzZXNzaW9uIC0gdGhlIHNlcmlhbGl6ZWQgYnl0ZSBhcnJheSBvZiB0aGUgc2Vzc2lvbiBpdHNlbGYKKyAgICAgKiBAcGFyYW0gc2Vzc2lvbklEIC0gdGhlIGlkIHRoYXQgaWRlbnRpZmllcyB0aGlzIHNlc3Npb24KKyAgICAgKiBAcGFyYW0gYXR0ck5hbWUgLSB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIGFkZGVkL3JlbW92ZWQKKyAgICAgKiBAcGFyYW0gYXR0clZhbHVlIC0gdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgYWRkZWQKKworICAgICAqLworICAgIHByaXZhdGUgU2Vzc2lvbk1lc3NhZ2VJbXBsKCBTdHJpbmcgY29udGV4dE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXZlbnR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2Vzc2lvbklEKQorICAgIHsKKyAgICAgICAgbUV2dFR5cGUgPSBldmVudHR5cGU7CisgICAgICAgIG1TZXNzaW9uID0gc2Vzc2lvbjsKKyAgICAgICAgbVNlc3Npb25JRCA9IHNlc3Npb25JRDsKKyAgICAgICAgbUNvbnRleHROYW1lID0gY29udGV4dE5hbWU7CisgICAgICAgIHVuaXF1ZUlkID0gc2Vzc2lvbklEOworICAgIH0KKworICAgIHB1YmxpYyBTZXNzaW9uTWVzc2FnZUltcGwoIFN0cmluZyBjb250ZXh0TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBldmVudHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZXNzaW9uSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdW5pcXVlSUQpCisgICAgeworICAgICAgICB0aGlzKGNvbnRleHROYW1lLGV2ZW50dHlwZSxzZXNzaW9uLHNlc3Npb25JRCk7CisgICAgICAgIHVuaXF1ZUlkID0gdW5pcXVlSUQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogcmV0dXJucyB0aGUgZXZlbnQgdHlwZQorICAgICAqIEByZXR1cm4gb25lIG9mIHRoZSBldmVudCB0eXBlcyBFVlRfWFhYWAorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0RXZlbnRUeXBlKCkgeyByZXR1cm4gbUV2dFR5cGU7IH0KKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBzZXJpYWxpemVkIGRhdGEgZm9yIHRoZSBzZXNzaW9uCisgICAgICovCisgICAgcHVibGljIGJ5dGVbXSBnZXRTZXNzaW9uKCkgeyByZXR1cm4gbVNlc3Npb247fQorICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIHNlc3Npb24gSUQgZm9yIHRoZSBzZXNzaW9uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTZXNzaW9uSUQoKXsgcmV0dXJuIG1TZXNzaW9uSUQ7IH0KKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUKKyAgICAgKi8KKy8vICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlTmFtZSgpIHsgcmV0dXJuIG1BdHRyaWJ1dGVOYW1lOyB9CisgICAgLyoqCisgICAgICogdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUKKyAgICAgKi8KKy8vICAgIHB1YmxpYyBPYmplY3QgZ2V0QXR0cmlidXRlVmFsdWUoKSB7cmV0dXJuIG1BdHRyaWJ1dGVWYWx1ZTsgfQorCisvLyAgICBwdWJsaWMgU2VyaWFsaXphYmxlUHJpbmNpcGFsIGdldFByaW5jaXBhbCgpIHsgcmV0dXJuIG1QcmluY2lwYWw7fQorCisgICAgcHVibGljIHZvaWQgc2V0VGltZXN0YW1wKGxvbmcgdGltZSkge3NlcmlhbGl6YXRpb25UaW1lc3RhbXA9dGltZTt9CisgICAgcHVibGljIGxvbmcgZ2V0VGltZXN0YW1wKCkgeyByZXR1cm4gc2VyaWFsaXphdGlvblRpbWVzdGFtcDt9CisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgZXZlbnQgdHlwZSBpbiBhIHN0cmluZyByZXByZXNlbnRhdGluZywgdXNlZnVsIGZvciBkZWJ1Z2dpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEV2ZW50VHlwZVN0cmluZygpCisgICAgeworICAgICAgICBzd2l0Y2ggKG1FdnRUeXBlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEVWVF9TRVNTSU9OX0NSRUFURUQgOiByZXR1cm4gIlNFU1NJT04tTU9ESUZJRUQiOworICAgICAgICAgICAgY2FzZSBFVlRfU0VTU0lPTl9FWFBJUkVEIDogcmV0dXJuICJTRVNTSU9OLUVYUElSRUQiOworICAgICAgICAgICAgY2FzZSBFVlRfU0VTU0lPTl9BQ0NFU1NFRCA6IHJldHVybiAiU0VTU0lPTi1BQ0NFU1NFRCI7CisgICAgICAgICAgICBjYXNlIEVWVF9HRVRfQUxMX1NFU1NJT05TIDogcmV0dXJuICJTRVNTSU9OLUdFVC1BTEwiOworICAgICAgICAgICAgY2FzZSBFVlRfU0VTU0lPTl9ERUxUQSA6IHJldHVybiAiU0VTU0lPTi1ERUxUQSI7CisgICAgICAgICAgICBjYXNlIEVWVF9BTExfU0VTU0lPTl9EQVRBIDogcmV0dXJuICJBTEwtU0VTU0lPTi1EQVRBIjsKKyAgICAgICAgICAgIGRlZmF1bHQgOiByZXR1cm4gIlVOS05PV04tRVZFTlQtVFlQRSI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGFkZHJlc3MgdGhhdCB0aGlzIG1lc3NhZ2Ugb3JpZ2luYXRlZCBmcm9tLiAgVGhpcyB3b3VsZCBiZSBzZXQKKyAgICAgKiBpZiB0aGUgbWVzc2FnZSB3YXMgYmVpbmcgcmVsYXllZCBmcm9tIGEgaG9zdCBvdGhlciB0aGFuIHRoZSBvbmUKKyAgICAgKiB0aGF0IG9yaWdpbmFsbHkgc2VudCBpdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWVtYmVyIGdldEFkZHJlc3MoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubVNyYzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVc2UgdGhpcyBtZXRob2QgdG8gc2V0IHRoZSBhZGRyZXNzIHRoYXQgdGhpcyBtZXNzYWdlIG9yaWdpbmF0ZWQgZnJvbS4KKyAgICAgKiBUaGlzIGNhbiBiZSB1c2VkIHdoZW4gcmUtc2VuZGluZyB0aGUgRVZUX0dFVF9BTExfU0VTU0lPTlMgbWVzc2FnZSB0bworICAgICAqIGFub3RoZXIgbWFjaGluZSBpbiB0aGUgZ3JvdXAuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QWRkcmVzcyhNZW1iZXIgc3JjKQorICAgIHsKKyAgICAgICAgdGhpcy5tU3JjID0gc3JjOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGV4dE5hbWUoKSB7CisgICAgICAgcmV0dXJuIG1Db250ZXh0TmFtZTsKKyAgICB9CisgICAgcHVibGljIFN0cmluZyBnZXRVbmlxdWVJZCgpIHsKKyAgICAgICAgcmV0dXJuIHVuaXF1ZUlkOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBzZXRVbmlxdWVJZChTdHJpbmcgdW5pcXVlSWQpIHsKKyAgICAgICAgdGhpcy51bmlxdWVJZCA9IHVuaXF1ZUlkOworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvc2Vzc2lvbi9TaW1wbGVUY3BSZXBsaWNhdGlvbk1hbmFnZXIuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci9zZXNzaW9uL1NpbXBsZVRjcFJlcGxpY2F0aW9uTWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2ODNhOTgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvc2Vzc2lvbi9TaW1wbGVUY3BSZXBsaWNhdGlvbk1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDYwOSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuc2Vzc2lvbjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlNlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLkNhdGFsaW5hQ2x1c3RlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuQ2x1c3Rlck1lc3NhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLk1lbWJlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtLkdlbmVyaWNQcmluY2lwYWw7CisKKy8qKgorICogVGl0bGU6ICAgICAgICBUb21jYXQgU2Vzc2lvbiBSZXBsaWNhdGlvbiBmb3IgVG9tY2F0IDQuMCA8QlI+CisgKiBEZXNjcmlwdGlvbjogIEEgdmVyeSBzaW1wbGUgc3RyYWlnaHQgZm9yd2FyZCBpbXBsZW1lbnRhdGlvbiBvZgorICogICAgICAgICAgICAgICBzZXNzaW9uIHJlcGxpY2F0aW9uIG9mIHNlcnZlcnMgaW4gYSBjbHVzdGVyLjxCUj4KKyAqICAgICAgICAgICAgICAgVGhpcyBzZXNzaW9uIHJlcGxpY2F0aW9uIGlzIGltcGxlbWVudGVkICJsaXZlIi4gQnkgbGl2ZQorICogICAgICAgICAgICAgICBJIG1lYW4sIHdoZW4gYSBzZXNzaW9uIGF0dHJpYnV0ZSBpcyBhZGRlZCBpbnRvIGEgc2Vzc2lvbiBvbiBOb2RlIEEKKyAqICAgICAgICAgICAgICAgYSBtZXNzYWdlIGlzIGJyb2FkY2FzdGVkIHRvIG90aGVyIG1lc3NhZ2VzIGFuZCBzZXRBdHRyaWJ1dGUgaXMgY2FsbGVkIG9uIHRoZQorICogICAgICAgICAgICAgICByZXBsaWNhdGVkIHNlc3Npb25zLjxCUj4KKyAqICAgICAgICAgICAgICAgQSBmdWxsIGRlc2NyaXB0aW9uIG9mIHRoaXMgaW1wbGVtZW50YXRpb24gY2FuIGJlIGZvdW5kIHVuZGVyCisgKiAgICAgICAgICAgICAgIDxocmVmPSJodHRwOi8vd3d3LmZpbGlwLm5ldC90b21jYXQvIj5GaWxpcCdzIFRvbWNhdCBQYWdlPC9hPjxCUj4KKyAqCisgKiBDb3B5cmlnaHQ6ICAgIFNlZSBhcGFjaGUgbGljZW5zZQorICogQ29tcGFueTogICAgICB3d3cuZmlsaXAubmV0CisgKiBAYXV0aG9yICA8YSBocmVmPSJtYWlsdG86bWFpbEBmaWxpcC5uZXQiPkZpbGlwIEhhbmlrPC9hPgorICogQGF1dGhvciBCZWxhIEJhbiAobW9kaWZpY2F0aW9ucyBmb3Igc3luY2hyb25vdXMgcmVwbGljYXRpb24pCisgKiBAdmVyc2lvbiAxLjAgZm9yIFRDIDQuMAorICogRGVzY3JpcHRpb246IFRoZSBJbk1lbW9yeVJlcGxpY2F0aW9uTWFuYWdlciBpcyBhIHNlc3Npb24gbWFuYWdlciB0aGF0IHJlcGxpY2F0ZWQKKyAqIHNlc3Npb24gaW5mb3JtYXRpb24gaW4gbWVtb3J5LiBJdCB1c2VzIDxhIGhyZWY9Ind3dy5qYXZhZ3JvdXBzLmNvbSI+SmF2YUdyb3VwczwvYT4gYXMKKyAqIGEgY29tbXVuaWNhdGlvbiBwcm90b2NvbCB0byBlbnN1cmUgZ3VhcmFudGVlZCBhbmQgb3JkZXJlZCBtZXNzYWdlIGRlbGl2ZXJ5LgorICogSmF2YUdyb3VwcyBhbHNvIHByb3ZpZGVzIGEgdmVyeSBmbGV4aWJsZSBwcm90b2NvbCBzdGFjayB0byBlbnN1cmUgdGhhdCB0aGUgcmVwbGljYXRpb24KKyAqIGNhbiBiZSB1c2VkIGluIGFueSBlbnZpcm9ubWVudC4KKyAqIDxCUj48QlI+CisgKiBUaGUgSW5NZW1vcnlSZXBsaWNhdGlvbk1hbmFnZXIgZXh0ZW5kcyB0aGUgU3RhbmRhcmRNYW5hZ2VyIGhlbmNlIGl0IGFsbG93cyBmb3IgdXMKKyAqIHRvIGluaGVyaXQgYWxsIHRoZSBiYXNpYyBzZXNzaW9uIG1hbmFnZW1lbnQgZmVhdHVyZXMgbGlrZSBleHBpcmF0aW9uLCBzZXNzaW9uIGxpc3RlbmVycyBldGMKKyAqIDxCUj48QlI+CisgKiBUbyBjb21tdW5pY2F0ZSB3aXRoIG90aGVyIG5vZGVzIGluIHRoZSBjbHVzdGVyLCB0aGUgSW5NZW1vcnlSZXBsaWNhdGlvbk1hbmFnZXIgc2VuZHMgb3V0IDcgZGlmZmVyZW50IHR5cGUgb2YgbXVsdGljYXN0IG1lc3NhZ2VzCisgKiBhbGwgZGVmaW5lZCBpbiB0aGUgU2Vzc2lvbk1lc3NhZ2UgY2xhc3MuPEJSPgorICogV2hlbiBhIHNlc3Npb24gaXMgcmVwbGljYXRlZCAobm90IGFuIGF0dHJpYnV0ZSBhZGRlZC9yZW1vdmVkKSB0aGUgc2Vzc2lvbiBpcyBzZXJpYWxpemVkIGludG8KKyAqIGEgYnl0ZSBhcnJheSB1c2luZyB0aGUgU3RhbmRhcmRTZXNzaW9uLnJlYWRPYmplY3REYXRhLCBTdGFuZGFyZFNlc3Npb24ud3JpdGVPYmplY3REYXRhIG1ldGhvZHMuCisgKi8KK3B1YmxpYyBjbGFzcyBTaW1wbGVUY3BSZXBsaWNhdGlvbk1hbmFnZXIgZXh0ZW5kcyBvcmcuYXBhY2hlLmNhdGFsaW5hLnNlc3Npb24uU3RhbmRhcmRNYW5hZ2VyCitpbXBsZW1lbnRzIG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5DbHVzdGVyTWFuYWdlcgoreworICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGxvZyA9CisgICAgICAgIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3RvcnkuZ2V0TG9nKCBTaW1wbGVUY3BSZXBsaWNhdGlvbk1hbmFnZXIuY2xhc3MgKTsKKworICAgIC8vdGhlIGNoYW5uZWwgY29uZmlndXJhdGlvbgorICAgIHByb3RlY3RlZCBTdHJpbmcgbUNoYW5uZWxDb25maWcgPSBudWxsOworCisgICAgLy90aGUgZ3JvdXAgbmFtZQorICAgIHByb3RlY3RlZCBTdHJpbmcgbUdyb3VwTmFtZSA9ICJUb21jYXRSZXBsaWNhdGlvbiI7CisKKyAgICAvL3NvbWVob3cgc3RhcnQoKSBnZXRzIGNhbGxlZCBtb3JlIHRoYW4gb25jZQorICAgIHByb3RlY3RlZCBib29sZWFuIG1DaGFubmVsU3RhcnRlZCA9IGZhbHNlOworCisgICAgLy9sb2cgdG8gc2NyZWVuCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gbVByaW50VG9TY3JlZW4gPSB0cnVlOworCisKKworICAgIHByb3RlY3RlZCBib29sZWFuIG1NYW5hZ2VyUnVubmluZyA9IGZhbHNlOworCisgICAgLyoqIFVzZSBzeW5jaHJvbm91cyByYXRoZXIgdGhhbiBhc3luY2hyb25vdXMgcmVwbGljYXRpb24uIEV2ZXJ5IHNlc3Npb24gbW9kaWZpY2F0aW9uIChjcmVhdGlvbiwgY2hhbmdlLCByZW1vdmFsIGV0YykKKyAgICAgKiB3aWxsIGJlIHNlbnQgdG8gYWxsIG1lbWJlcnMuIFRoZSBjYWxsIHdpbGwgdGhlbiB3YWl0IGZvciBtYXggbWlsbGlzZWNvbmRzLCBvciBmb3JldmVyIChpZiB0aW1lb3V0IGlzIDApIGZvcgorICAgICAqIGFsbCByZXNwb25zZXMuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gc3luY2hyb25vdXNSZXBsaWNhdGlvbj10cnVlOworCisgICAgLyoqIFNldCB0byB0cnVlIGlmIHdlIGRvbid0IHdhbnQgdGhlIHNlc3Npb25zIHRvIGV4cGlyZSBvbiBzaHV0ZG93biAqLworICAgIHByb3RlY3RlZCBib29sZWFuIG1FeHBpcmVTZXNzaW9uc09uU2h1dGRvd24gPSB0cnVlOworCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gdXNlRGlydHlGbGFnID0gZmFsc2U7CisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBkaXN0cmlidXRhYmxlID0gdHJ1ZTsKKworICAgIHByb3RlY3RlZCBDYXRhbGluYUNsdXN0ZXIgY2x1c3RlcjsKKworICAgIHByb3RlY3RlZCBqYXZhLnV0aWwuSGFzaE1hcCBpbnZhbGlkYXRlZFNlc3Npb25zID0gbmV3IGphdmEudXRpbC5IYXNoTWFwKCk7CisKKyAgICAvKioKKyAgICAgKiBGbGFnIHRvIGtlZXAgdHJhY2sgaWYgdGhlIHN0YXRlIGhhcyBiZWVuIHRyYW5zZmVycmVkIG9yIG5vdAorICAgICAqIEFzc3VtZXMgZmFsc2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gc3RhdGVUcmFuc2ZlcnJlZCA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBub3RpZnlMaXN0ZW5lcnNPblJlcGxpY2F0aW9uOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IsIGp1c3QgY2FsbHMgc3VwZXIoKQorICAgICAqCisgICAgICovCisgICAgcHVibGljIFNpbXBsZVRjcFJlcGxpY2F0aW9uTWFuYWdlcigpCisgICAgeworICAgICAgICBzdXBlcigpOworICAgIH0KKworCisgICAgcHVibGljIGJvb2xlYW4gaXNNYW5hZ2VyUnVubmluZygpCisgICAgeworICAgICAgICByZXR1cm4gbU1hbmFnZXJSdW5uaW5nOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVzZURpcnR5RmxhZyhib29sZWFuIHVzZWRpcnR5ZmxhZykKKyAgICB7CisgICAgICAgIHRoaXMudXNlRGlydHlGbGFnID0gdXNlZGlydHlmbGFnOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEV4cGlyZVNlc3Npb25zT25TaHV0ZG93bihib29sZWFuIGV4cGlyZVNlc3Npb25zT25TaHV0ZG93bikKKyAgICB7CisgICAgICAgIG1FeHBpcmVTZXNzaW9uc09uU2h1dGRvd24gPSBleHBpcmVTZXNzaW9uc09uU2h1dGRvd247CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q2x1c3RlcihDYXRhbGluYUNsdXN0ZXIgY2x1c3RlcikgeworICAgICAgICBsb2cuZGVidWcoIkNsdXN0ZXIgYXNzb2NpYXRlZCB3aXRoIFNpbXBsZVRjcFJlcGxpY2F0aW9uTWFuYWdlciIpOworICAgICAgICB0aGlzLmNsdXN0ZXIgPSBjbHVzdGVyOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGdldEV4cGlyZVNlc3Npb25zT25TaHV0ZG93bigpCisgICAgeworICAgICAgICByZXR1cm4gbUV4cGlyZVNlc3Npb25zT25TaHV0ZG93bjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQcmludFRvU2NyZWVuKGJvb2xlYW4gcHJpbnR0b3NjcmVlbikKKyAgICB7CisgICAgICAgIGxvZy5kZWJ1ZygiU2V0dGluZyBzY3JlZW4gZGVidWcgdG86IitwcmludHRvc2NyZWVuKTsKKyAgICAgICAgbVByaW50VG9TY3JlZW4gPSBwcmludHRvc2NyZWVuOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFN5bmNocm9ub3VzUmVwbGljYXRpb24oYm9vbGVhbiBmbGFnKQorICAgIHsKKyAgICAgICAgc3luY2hyb25vdXNSZXBsaWNhdGlvbj1mbGFnOworICAgIH0KKworICAgIC8qKgorICAgICAqIE92ZXJyaWRlIHBlcnNpc3RlbmNlIHNpbmNlIHRoZXkgZG9uJ3QgZ28gaGFuZCBpbiBoYW5kIHdpdGggcmVwbGljYXRpb24gZm9yIG5vdy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB1bmxvYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoICFnZXREaXN0cmlidXRhYmxlKCkgKSB7CisgICAgICAgICAgICBzdXBlci51bmxvYWQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBIVFRQIHNlc3Npb24uCisgICAgICogTW9zdCBvZiB0aGUgY29kZSBpbiBoZXJlIGlzIGNvcGllZCBmcm9tIHRoZSBTdGFuZGFyZE1hbmFnZXIuCisgICAgICogVGhpcyBpcyBub3QgcHJldHR5LCB5ZWFoIEkga25vdywgYnV0IGl0IHdhcyBuZWNlc3Nhcnkgc2luY2UgdGhlCisgICAgICogU3RhbmRhcmRNYW5hZ2VyIGhhZCBoYXJkIGNvZGVkIHRoZSBzZXNzaW9uIGluc3RhbnRpYXRpb24gdG8gdGhlIGEKKyAgICAgKiBTdGFuZGFyZFNlc3Npb24sIHdoZW4gd2UgYWN0dWFsbHkgd2FudCB0byBpbnN0YW50aWF0ZSBhIFJlcGxpY2F0ZWRTZXNzaW9uPEJSPgorICAgICAqIElmIHRoZSBjYWxsIGNvbWVzIGZyb20gdGhlIFRvbWNhdCBzZXJ2bGV0IGVuZ2luZSwgYSBTZXNzaW9uTWVzc2FnZSBnb2VzIG91dCB0byB0aGUgb3RoZXIKKyAgICAgKiBub2RlcyBpbiB0aGUgY2x1c3RlciB0aGF0IHRoaXMgc2Vzc2lvbiBoYXMgYmVlbiBjcmVhdGVkLgorICAgICAqIEBwYXJhbSBub3RpZnkgLSBpZiBzZXQgdG8gdHJ1ZSB0aGUgb3RoZXIgbm9kZXMgaW4gdGhlIGNsdXN0ZXIgd2lsbCBiZSBub3RpZmllZC4KKyAgICAgKiAgICAgICAgICAgICAgICAgVGhpcyBmbGFnIGlzIG5lZWRlZCBzbyB0aGF0IHdlIGNhbiBjcmVhdGUgYSBzZXNzaW9uIGJlZm9yZSB3ZSBkZXNlcmlhbGl6ZQorICAgICAqICAgICAgICAgICAgICAgICBhIHJlcGxpY2F0ZWQgb25lCisgICAgICoKKyAgICAgKiBAc2VlIFJlcGxpY2F0ZWRTZXNzaW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIFNlc3Npb24gY3JlYXRlU2Vzc2lvbihib29sZWFuIG5vdGlmeSwgYm9vbGVhbiBzZXRJZCkKKyAgICB7CisKKyAgICAgICAgLy9pbmhlcml0ZWQgZnJvbSB0aGUgYmFzaWMgbWFuYWdlcgorICAgICAgICBpZiAoKGdldE1heEFjdGl2ZVNlc3Npb25zKCkgPj0gMCkgJiYKKyAgICAgICAgICAgKHNlc3Npb25zLnNpemUoKSA+PSBnZXRNYXhBY3RpdmVTZXNzaW9ucygpKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oc20uZ2V0U3RyaW5nKCJzdGFuZGFyZE1hbmFnZXIuY3JlYXRlU2Vzc2lvbi5pc2UiKSk7CisKKworICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSBuZXcgUmVwbGljYXRlZFNlc3Npb24odGhpcyk7CisKKyAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgcHJvcGVydGllcyBvZiB0aGUgbmV3IHNlc3Npb24gYW5kIHJldHVybiBpdAorICAgICAgICBzZXNzaW9uLnNldE5ldyh0cnVlKTsKKyAgICAgICAgc2Vzc2lvbi5zZXRWYWxpZCh0cnVlKTsKKyAgICAgICAgc2Vzc2lvbi5zZXRDcmVhdGlvblRpbWUoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworICAgICAgICBzZXNzaW9uLnNldE1heEluYWN0aXZlSW50ZXJ2YWwodGhpcy5tYXhJbmFjdGl2ZUludGVydmFsKTsKKyAgICAgICAgU3RyaW5nIHNlc3Npb25JZCA9IGdlbmVyYXRlU2Vzc2lvbklkKCk7CisgICAgICAgIFN0cmluZyBqdm1Sb3V0ZSA9IGdldEp2bVJvdXRlKCk7CisgICAgICAgIC8vIEB0b2RvIE1vdmUgYXBwZW5kaW5nIG9mIGp2bVJvdXRlIGdlbmVyYXRlU2Vzc2lvbklkKCk/Pz8KKyAgICAgICAgaWYgKGp2bVJvdXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNlc3Npb25JZCArPSAnLicgKyBqdm1Sb3V0ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIHNldElkICkgc2Vzc2lvbi5zZXRJZChzZXNzaW9uSWQpOworICAgICAgICBpZiAoIG5vdGlmeSAmJiAoY2x1c3RlciE9bnVsbCkgKSB7CisgICAgICAgICAgICAoKFJlcGxpY2F0ZWRTZXNzaW9uKXNlc3Npb24pLnNldElzRGlydHkodHJ1ZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChzZXNzaW9uKTsKKyAgICB9Ly9jcmVhdGVTZXNzaW9uCisKKyAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAvLyBPVkVSUklERSBUSEVTRSBNRVRIT0RTIFRPIElNUExFTUVOVCBUSEUgUkVQTElDQVRJT04KKyAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhbmQgcmV0dXJuIGEgbmV3IHNlc3Npb24gb2JqZWN0LCBiYXNlZCBvbiB0aGUgZGVmYXVsdAorICAgICAqIHNldHRpbmdzIHNwZWNpZmllZCBieSB0aGlzIE1hbmFnZXIncyBwcm9wZXJ0aWVzLiAgVGhlIHNlc3Npb24KKyAgICAgKiBpZCB3aWxsIGJlIGFzc2lnbmVkIGJ5IHRoaXMgbWV0aG9kLCBhbmQgYXZhaWxhYmxlIHZpYSB0aGUgZ2V0SWQoKQorICAgICAqIG1ldGhvZCBvZiB0aGUgcmV0dXJuZWQgc2Vzc2lvbi4gIElmIGEgbmV3IHNlc3Npb24gY2Fubm90IGJlIGNyZWF0ZWQKKyAgICAgKiBmb3IgYW55IHJlYXNvbiwgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgYSBuZXcgc2Vzc2lvbiBjYW5ub3QgYmUKKyAgICAgKiAgaW5zdGFudGlhdGVkIGZvciBhbnkgcmVhc29uCisgICAgICovCisgICAgcHVibGljIFNlc3Npb24gY3JlYXRlU2Vzc2lvbigpCisgICAgeworICAgICAgICAvL2NyZWF0ZSBhIHNlc3Npb24gYW5kIG5vdGlmeSB0aGUgb3RoZXIgbm9kZXMgaW4gdGhlIGNsdXN0ZXIKKyAgICAgICAgU2Vzc2lvbiBzZXNzaW9uID0gIGNyZWF0ZVNlc3Npb24oZ2V0RGlzdHJpYnV0YWJsZSgpLHRydWUpOworICAgICAgICBhZGQoc2Vzc2lvbik7CisgICAgICAgIHJldHVybiBzZXNzaW9uOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNlc3Npb25JbnZhbGlkYXRlZChTdHJpbmcgc2Vzc2lvbklkKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAoIGludmFsaWRhdGVkU2Vzc2lvbnMgKSB7CisgICAgICAgICAgICBpbnZhbGlkYXRlZFNlc3Npb25zLnB1dChzZXNzaW9uSWQsIHNlc3Npb25JZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0SW52YWxpZGF0ZWRTZXNzaW9ucygpIHsKKyAgICAgICAgc3luY2hyb25pemVkICggaW52YWxpZGF0ZWRTZXNzaW9ucyApIHsKKyAgICAgICAgICAgIFN0cmluZ1tdIHJlc3VsdCA9IG5ldyBTdHJpbmdbaW52YWxpZGF0ZWRTZXNzaW9ucy5zaXplKCldOworICAgICAgICAgICAgaW52YWxpZGF0ZWRTZXNzaW9ucy52YWx1ZXMoKS50b0FycmF5KHJlc3VsdCk7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwdWJsaWMgQ2x1c3Rlck1lc3NhZ2UgcmVxdWVzdENvbXBsZXRlZChTdHJpbmcgc2Vzc2lvbklkKQorICAgIHsKKyAgICAgICAgaWYgKCAgIWdldERpc3RyaWJ1dGFibGUoKSApIHsKKyAgICAgICAgICAgIGxvZy53YXJuKCJSZWNlaXZlZCByZXF1ZXN0Q29tcGxldGVkIG1lc3NhZ2UsIGFsdGhvdWdoIHRoaXMgY29udGV4dFsiKworICAgICAgICAgICAgICAgICAgICAgZ2V0TmFtZSgpKyJdIGlzIG5vdCBkaXN0cmlidXRhYmxlLiBJZ25vcmluZyBtZXNzYWdlIik7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICAvL25vdGlmeSBqYXZhZ3JvdXBzCisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIGludmFsaWRhdGVkU2Vzc2lvbnMuZ2V0KHNlc3Npb25JZCkgIT0gbnVsbCApIHsKKyAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKCBpbnZhbGlkYXRlZFNlc3Npb25zICkgeworICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlZFNlc3Npb25zLnJlbW92ZShzZXNzaW9uSWQpOworICAgICAgICAgICAgICAgICAgICBTZXNzaW9uTWVzc2FnZSBtc2cgPSBuZXcgU2Vzc2lvbk1lc3NhZ2VJbXBsKG5hbWUsCisgICAgICAgICAgICAgICAgICAgIFNlc3Npb25NZXNzYWdlLkVWVF9TRVNTSU9OX0VYUElSRUQsCisgICAgICAgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbXNnOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgUmVwbGljYXRlZFNlc3Npb24gc2Vzc2lvbiA9IChSZXBsaWNhdGVkU2Vzc2lvbikgZmluZFNlc3Npb24oCisgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCk7CisgICAgICAgICAgICAgICAgaWYgKHNlc3Npb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAvL3JldHVybiBpbW1lZGlhdGVseSBpZiB0aGUgc2Vzc2lvbiBpcyBub3QgZGlydHkKKyAgICAgICAgICAgICAgICAgICAgaWYgKHVzZURpcnR5RmxhZyAmJiAoIXNlc3Npb24uaXNEaXJ0eSgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy9idXQgYmVmb3JlIHdlIHJldHVybiBkb2luZyBub3RoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgLy9zZWUgaWYgd2Ugc2hvdWxkIHNlbmQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vYW4gdXBkYXRlZCBsYXN0IGFjY2VzcyBtZXNzYWdlIHNvIHRoYXQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vc2Vzc2lvbnMgYWNyb3NzIGNsdXN0ZXIgZG9udCBleHBpcmUKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgaW50ZXJ2YWwgPSBzZXNzaW9uLmdldE1heEluYWN0aXZlSW50ZXJ2YWwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgbGFzdGFjY2Rpc3QgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRMYXN0QWNjZXNzV2FzRGlzdHJpYnV0ZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKChpbnRlcnZhbCoxMDAwKSAvIGxhc3RhY2NkaXN0KTwgMyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXNzaW9uTWVzc2FnZSBhY2Ntc2cgPSBuZXcgU2Vzc2lvbk1lc3NhZ2VJbXBsKG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlc3Npb25NZXNzYWdlLkVWVF9TRVNTSU9OX0FDQ0VTU0VELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5zZXRMYXN0QWNjZXNzV2FzRGlzdHJpYnV0ZWQoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhY2Ntc2c7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uc2V0SXNEaXJ0eShmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlNlbmRpbmcgc2Vzc2lvbiB0byBjbHVzdGVyPSIgKyBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gaWdub3JlKSB7fQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFNlc3Npb25NZXNzYWdlIG1zZyA9IG5ldyBTZXNzaW9uTWVzc2FnZUltcGwobmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNlc3Npb25NZXNzYWdlLkVWVF9TRVNTSU9OX0NSRUFURUQsCisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVNlc3Npb24oc2Vzc2lvbiksCisgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldElkKCksCisgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldElkKCkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbXNnOworICAgICAgICAgICAgICAgIH0gLy9lbmQgaWYKKyAgICAgICAgICAgIH0vL2VuZCBpZgorICAgICAgICB9CisgICAgICAgIGNhdGNoIChFeGNlcHRpb24geCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcigiVW5hYmxlIHRvIHJlcGxpY2F0ZSBzZXNzaW9uIix4KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXJpYWxpemUgYSBzZXNzaW9uIGludG8gYSBieXRlIGFycmF5PEJSPgorICAgICAqIFRoaXMgbWV0aG9kIHNpbXBsZSBjYWxscyB0aGUgd3JpdGVPYmplY3REYXRhIG1ldGhvZCBvbiB0aGUgc2Vzc2lvbgorICAgICAqIGFuZCByZXR1cm5zIHRoZSBieXRlIGRhdGEgZnJvbSB0aGF0IGNhbGwKKyAgICAgKiBAcGFyYW0gc2Vzc2lvbiAtIHRoZSBzZXNzaW9uIHRvIGJlIHNlcmlhbGl6ZWQKKyAgICAgKiBAcmV0dXJuIGEgYnl0ZSBhcnJheSBjb250YWluaW5nIHRoZSBzZXNzaW9uIGRhdGEsIG51bGwgaWYgdGhlIHNlcmlhbGl6YXRpb24gZmFpbGVkCisgICAgICovCisgICAgcHJvdGVjdGVkIGJ5dGVbXSB3cml0ZVNlc3Npb24oIFNlc3Npb24gc2Vzc2lvbiApCisgICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0gc2Vzc2lvbl9kYXRhID0gbmV3IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgICAgICBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSBzZXNzaW9uX291dCA9IG5ldyBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbShzZXNzaW9uX2RhdGEpOworICAgICAgICAgICAgc2Vzc2lvbl9vdXQuZmx1c2goKTsKKyAgICAgICAgICAgIGJvb2xlYW4gaGFzUHJpbmNpcGFsID0gc2Vzc2lvbi5nZXRQcmluY2lwYWwoKSAhPSBudWxsOworICAgICAgICAgICAgc2Vzc2lvbl9vdXQud3JpdGVCb29sZWFuKGhhc1ByaW5jaXBhbCk7CisgICAgICAgICAgICBpZiAoIGhhc1ByaW5jaXBhbCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2Vzc2lvbl9vdXQud3JpdGVPYmplY3QoU2VyaWFsaXphYmxlUHJpbmNpcGFsLmNyZWF0ZVByaW5jaXBhbCgoR2VuZXJpY1ByaW5jaXBhbClzZXNzaW9uLmdldFByaW5jaXBhbCgpKSk7CisgICAgICAgICAgICB9Ly9lbmQgaWYKKyAgICAgICAgICAgICgoUmVwbGljYXRlZFNlc3Npb24pc2Vzc2lvbikud3JpdGVPYmplY3REYXRhKHNlc3Npb25fb3V0KTsKKyAgICAgICAgICAgIHJldHVybiBzZXNzaW9uX2RhdGEudG9CeXRlQXJyYXkoKTsKKworICAgICAgICB9CisgICAgICAgIGNhdGNoICggRXhjZXB0aW9uIHggKQorICAgICAgICB7CisgICAgICAgICAgICBsb2cuZXJyb3IoIkZhaWxlZCB0byBzZXJpYWxpemUgdGhlIHNlc3Npb24hIix4KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWluc3RhbnRpYXRlcyBhIHNlcmlhbGl6ZWQgc2Vzc2lvbiBmcm9tIHRoZSBkYXRhIHBhc3NlZCBpbi4KKyAgICAgKiBUaGlzIHdpbGwgZmlyc3QgY2FsbCBjcmVhdGVTZXNzaW9uKCkgc28gdGhhdCB3ZSBnZXQgYSBmcmVzaCBpbnN0YW5jZSB3aXRoIGFsbAorICAgICAqIHRoZSBtYW5hZ2VycyBzZXQgYW5kIGFsbCB0aGUgdHJhbnNpZW50IGZpZWxkcyB2YWxpZGF0ZWQuCisgICAgICogVGhlbiBpdCBjYWxscyBTZXNzaW9uLnJlYWRPYmplY3REYXRhKGJ5dGVbXSkgdG8gZGVzZXJpYWxpemUgdGhlIG9iamVjdAorICAgICAqIEBwYXJhbSBkYXRhIC0gYSBieXRlIGFycmF5IGNvbnRhaW5pbmcgc2Vzc2lvbiBkYXRhCisgICAgICogQHJldHVybiBhIHZhbGlkIFNlc3Npb24gb2JqZWN0LCBudWxsIGlmIGFuIGVycm9yIG9jY3VycworICAgICAqCisgICAgICovCisgICAgcHJvdGVjdGVkIFNlc3Npb24gcmVhZFNlc3Npb24oIGJ5dGVbXSBkYXRhLCBTdHJpbmcgc2Vzc2lvbklkICkKKyAgICB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtIHNlc3Npb25fZGF0YSA9IG5ldyBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtKGRhdGEpOworICAgICAgICAgICAgUmVwbGljYXRpb25TdHJlYW0gc2Vzc2lvbl9pbiA9IG5ldyBSZXBsaWNhdGlvblN0cmVhbShzZXNzaW9uX2RhdGEsY29udGFpbmVyLmdldExvYWRlcigpLmdldENsYXNzTG9hZGVyKCkpOworCisgICAgICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSBzZXNzaW9uSWQhPW51bGw/dGhpcy5maW5kU2Vzc2lvbihzZXNzaW9uSWQpOm51bGw7CisgICAgICAgICAgICBib29sZWFuIGlzTmV3ID0gKHNlc3Npb249PW51bGwpOworICAgICAgICAgICAgLy9jbGVhciB0aGUgb2xkIHZhbHVlcyBmcm9tIHRoZSBleGlzdGluZyBzZXNzaW9uCisgICAgICAgICAgICBpZiAoIHNlc3Npb24hPW51bGwgKSB7CisgICAgICAgICAgICAgICAgUmVwbGljYXRlZFNlc3Npb24gcnMgPSAoUmVwbGljYXRlZFNlc3Npb24pc2Vzc2lvbjsKKyAgICAgICAgICAgICAgICBycy5leHBpcmUoZmFsc2UpOyAgLy9jbGVhbnMgdXAgdGhlIHByZXZpb3VzIHZhbHVlcywgc2luY2Ugd2UgYXJlIG5vdCBkb2luZyByZW1vdmVzCisgICAgICAgICAgICAgICAgc2Vzc2lvbiA9IG51bGw7CisgICAgICAgICAgICB9Ly9lbmQgaWYKKworICAgICAgICAgICAgaWYgKHNlc3Npb249PW51bGwpIHsKKyAgICAgICAgICAgICAgICBzZXNzaW9uID0gY3JlYXRlU2Vzc2lvbihmYWxzZSwgZmFsc2UpOworICAgICAgICAgICAgICAgIHNlc3Npb25zLnJlbW92ZShzZXNzaW9uLmdldElkKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGJvb2xlYW4gaGFzUHJpbmNpcGFsID0gc2Vzc2lvbl9pbi5yZWFkQm9vbGVhbigpOworICAgICAgICAgICAgU2VyaWFsaXphYmxlUHJpbmNpcGFsIHAgPSBudWxsOworICAgICAgICAgICAgaWYgKCBoYXNQcmluY2lwYWwgKQorICAgICAgICAgICAgICAgIHAgPSAoU2VyaWFsaXphYmxlUHJpbmNpcGFsKXNlc3Npb25faW4ucmVhZE9iamVjdCgpOworICAgICAgICAgICAgKChSZXBsaWNhdGVkU2Vzc2lvbilzZXNzaW9uKS5yZWFkT2JqZWN0RGF0YShzZXNzaW9uX2luKTsKKyAgICAgICAgICAgIGlmICggaGFzUHJpbmNpcGFsICkKKyAgICAgICAgICAgICAgICBzZXNzaW9uLnNldFByaW5jaXBhbChwLmdldFByaW5jaXBhbChnZXRDb250YWluZXIoKS5nZXRSZWFsbSgpKSk7CisgICAgICAgICAgICAoKFJlcGxpY2F0ZWRTZXNzaW9uKXNlc3Npb24pLnNldElkKHNlc3Npb25JZCxpc05ldyk7CisgICAgICAgICAgICBSZXBsaWNhdGVkU2Vzc2lvbiByc2Vzc2lvbiA9IChSZXBsaWNhdGVkU2Vzc2lvbilzZXNzaW9uOyAKKyAgICAgICAgICAgIHJzZXNzaW9uLnNldEFjY2Vzc0NvdW50KDEpOworICAgICAgICAgICAgc2Vzc2lvbi5zZXRNYW5hZ2VyKHRoaXMpOworICAgICAgICAgICAgc2Vzc2lvbi5zZXRWYWxpZCh0cnVlKTsKKyAgICAgICAgICAgIHJzZXNzaW9uLnNldExhc3RBY2Nlc3NlZFRpbWUoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworICAgICAgICAgICAgcnNlc3Npb24uc2V0VGhpc0FjY2Vzc2VkVGltZShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisgICAgICAgICAgICAoKFJlcGxpY2F0ZWRTZXNzaW9uKXNlc3Npb24pLnNldEFjY2Vzc0NvdW50KDApOworICAgICAgICAgICAgc2Vzc2lvbi5zZXROZXcoZmFsc2UpOworLy8gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNlc3Npb24gbG9hZGVkIGlkPSIrc2Vzc2lvbklkICsKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgYWN0dWFsSWQ9IitzZXNzaW9uLmdldElkKCkrIAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBleGlzdHM9Iit0aGlzLnNlc3Npb25zLmNvbnRhaW5zS2V5KHNlc3Npb25JZCkrCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHZhbGlkPSIrcnNlc3Npb24uaXNWYWxpZCgpKTsKKyAgICAgICAgICAgIHJldHVybiBzZXNzaW9uOworCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKCBFeGNlcHRpb24geCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcigiRmFpbGVkIHRvIGRlc2VyaWFsaXplIHRoZSBzZXNzaW9uISIseCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gdGhpcy5uYW1lOworICAgIH0KKyAgICAvKioKKyAgICAgKiBQcmVwYXJlIGZvciB0aGUgYmVnaW5uaW5nIG9mIGFjdGl2ZSB1c2Ugb2YgdGhlIHB1YmxpYyBtZXRob2RzIG9mIHRoaXMKKyAgICAgKiBjb21wb25lbnQuICBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIDxjb2RlPmNvbmZpZ3VyZSgpPC9jb2RlPiwKKyAgICAgKiBhbmQgYmVmb3JlIGFueSBvZiB0aGUgcHVibGljIG1ldGhvZHMgb2YgdGhlIGNvbXBvbmVudCBhcmUgdXRpbGl6ZWQuPEJSPgorICAgICAqIFN0YXJ0cyB0aGUgY2x1c3RlciBjb21tdW5pY2F0aW9uIGNoYW5uZWwsIHRoaXMgd2lsbCBjb25uZWN0IHdpdGggdGhlIG90aGVyIG5vZGVzCisgICAgICogaW4gdGhlIGNsdXN0ZXIsIGFuZCByZXF1ZXN0IHRoZSBjdXJyZW50IHNlc3Npb24gc3RhdGUgdG8gYmUgdHJhbnNmZXJyZWQgdG8gdGhpcyBub2RlLgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoaXMgY29tcG9uZW50IGhhcyBhbHJlYWR5IGJlZW4KKyAgICAgKiAgc3RhcnRlZAorICAgICAqIEBleGNlcHRpb24gTGlmZWN5Y2xlRXhjZXB0aW9uIGlmIHRoaXMgY29tcG9uZW50IGRldGVjdHMgYSBmYXRhbCBlcnJvcgorICAgICAqICB0aGF0IHByZXZlbnRzIHRoaXMgY29tcG9uZW50IGZyb20gYmVpbmcgdXNlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgdGhyb3dzIExpZmVjeWNsZUV4Y2VwdGlvbiB7CisgICAgICAgIG1NYW5hZ2VyUnVubmluZyA9IHRydWU7CisgICAgICAgIHN1cGVyLnN0YXJ0KCk7CisgICAgICAgIC8vc3RhcnQgdGhlIGphdmFncm91cHMgY2hhbm5lbAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy90aGUgY2hhbm5lbCBpcyBhbHJlYWR5IHJ1bm5pbmcKKyAgICAgICAgICAgIGlmICggbUNoYW5uZWxTdGFydGVkICkgcmV0dXJuOworICAgICAgICAgICAgbG9nLmVycm9yKCJTdGFydGluZyBjbHVzdGVyaW5nIG1hbmFnZXIuLi46IitnZXROYW1lKCkpOworICAgICAgICAgICAgaWYgKCBjbHVzdGVyID09IG51bGwgKSB7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJTdGFydGluZy4uLiBubyBjbHVzdGVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbnRleHQ6IitnZXROYW1lKCkpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNsdXN0ZXIuZ2V0TWVtYmVycygpLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICBNZW1iZXIgbWJyID0gY2x1c3Rlci5nZXRNZW1iZXJzKClbMF07CisgICAgICAgICAgICAgICAgU2Vzc2lvbk1lc3NhZ2UgbXNnID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IFNlc3Npb25NZXNzYWdlSW1wbCh0aGlzLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlc3Npb25NZXNzYWdlLkVWVF9HRVRfQUxMX1NFU1NJT05TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHRVQtQUxMIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHRVQtQUxMLSIrdGhpcy5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIGNsdXN0ZXIuc2VuZChtc2csIG1icik7CisgICAgICAgICAgICAgICAgbG9nLndhcm4oIk1hbmFnZXJbIitnZXROYW1lKCkrIl0sIHJlcXVlc3Rpbmcgc2Vzc2lvbiBzdGF0ZSBmcm9tICIrbWJyKworICAgICAgICAgICAgICAgICAgICAgICAgICIuIFRoaXMgb3BlcmF0aW9uIHdpbGwgdGltZW91dCBpZiBubyBzZXNzaW9uIHN0YXRlIGhhcyBiZWVuIHJlY2VpdmVkIHdpdGhpbiAiKworICAgICAgICAgICAgICAgICAgICAgICAgICI2MCBzZWNvbmRzIik7CisgICAgICAgICAgICAgICAgbG9uZyByZXFTdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICAgICAgICAgIGxvbmcgcmVxTm93ID0gMDsKKyAgICAgICAgICAgICAgICBib29sZWFuIGlzVGltZW91dD1mYWxzZTsKKyAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwKTsKKyAgICAgICAgICAgICAgICAgICAgfWNhdGNoICggRXhjZXB0aW9uIHNsZWVwKSB7fQorICAgICAgICAgICAgICAgICAgICByZXFOb3cgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgICAgICAgICAgaXNUaW1lb3V0PSgocmVxTm93LXJlcVN0YXJ0KT4oMTAwMCo2MCkpOworICAgICAgICAgICAgICAgIH0gd2hpbGUgKCAoIWlzU3RhdGVUcmFuc2ZlcnJlZCgpKSAmJiAoIWlzVGltZW91dCkpOworICAgICAgICAgICAgICAgIGlmICggaXNUaW1lb3V0IHx8ICghaXNTdGF0ZVRyYW5zZmVycmVkKCkpICkgeworICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIk1hbmFnZXJbIitnZXROYW1lKCkrIl0sIE5vIHNlc3Npb24gc3RhdGUgcmVjZWl2ZWQsIHRpbWluZyBvdXQuIik7CisgICAgICAgICAgICAgICAgfWVsc2UgeworICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbygiTWFuYWdlclsiK2dldE5hbWUoKSsiXSwgc2Vzc2lvbiBzdGF0ZSByZWNlaXZlZCBpbiAiKyhyZXFOb3ctcmVxU3RhcnQpKyIgbXMuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBsb2cuaW5mbygiTWFuYWdlclsiK2dldE5hbWUoKSsiXSwgc2tpcHBpbmcgc3RhdGUgdHJhbnNmZXIuIE5vIG1lbWJlcnMgYWN0aXZlIGluIGNsdXN0ZXIgZ3JvdXAuIik7CisgICAgICAgICAgICB9Ly9lbmQgaWYKKyAgICAgICAgICAgIG1DaGFubmVsU3RhcnRlZCA9IHRydWU7CisgICAgICAgIH0gIGNhdGNoICggRXhjZXB0aW9uIHggKSB7CisgICAgICAgICAgICBsb2cuZXJyb3IoIlVuYWJsZSB0byBzdGFydCBTaW1wbGVUY3BSZXBsaWNhdGlvbk1hbmFnZXIiLHgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR3JhY2VmdWxseSB0ZXJtaW5hdGUgdGhlIGFjdGl2ZSB1c2Ugb2YgdGhlIHB1YmxpYyBtZXRob2RzIG9mIHRoaXMKKyAgICAgKiBjb21wb25lbnQuICBUaGlzIG1ldGhvZCBzaG91bGQgYmUgdGhlIGxhc3Qgb25lIGNhbGxlZCBvbiBhIGdpdmVuCisgICAgICogaW5zdGFuY2Ugb2YgdGhpcyBjb21wb25lbnQuPEJSPgorICAgICAqIFRoaXMgd2lsbCBkaXNjb25uZWN0IHRoZSBjbHVzdGVyIGNvbW11bmljYXRpb24gY2hhbm5lbCBhbmQgc3RvcCB0aGUgbGlzdGVuZXIgdGhyZWFkLgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoaXMgY29tcG9uZW50IGhhcyBub3QgYmVlbiBzdGFydGVkCisgICAgICogQGV4Y2VwdGlvbiBMaWZlY3ljbGVFeGNlcHRpb24gaWYgdGhpcyBjb21wb25lbnQgZGV0ZWN0cyBhIGZhdGFsIGVycm9yCisgICAgICogIHRoYXQgbmVlZHMgdG8gYmUgcmVwb3J0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdG9wKCkgdGhyb3dzIExpZmVjeWNsZUV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgbU1hbmFnZXJSdW5uaW5nID0gZmFsc2U7CisgICAgICAgIG1DaGFubmVsU3RhcnRlZCA9IGZhbHNlOworICAgICAgICBzdXBlci5zdG9wKCk7CisgICAgICAgIC8vc3RvcCB0aGUgamF2YWdyb3VwIGNoYW5uZWwKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIGNsdXN0ZXIucmVtb3ZlTWFuYWdlcihnZXROYW1lKCkpOworLy8gICAgICAgICAgICBtUmVwbGljYXRpb25MaXN0ZW5lci5zdG9wTGlzdGVuaW5nKCk7CisvLyAgICAgICAgICAgIG1SZXBsaWNhdGlvblRyYW5zbWl0dGVyLnN0b3AoKTsKKy8vICAgICAgICAgICAgc2VydmljZS5zdG9wKCk7CisvLyAgICAgICAgICAgIHNlcnZpY2UgPSBudWxsOworICAgICAgICB9CisgICAgICAgIGNhdGNoICggRXhjZXB0aW9uIHggKQorICAgICAgICB7CisgICAgICAgICAgICBsb2cuZXJyb3IoIlVuYWJsZSB0byBzdG9wIFNpbXBsZVRjcFJlcGxpY2F0aW9uTWFuYWdlciIseCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREaXN0cmlidXRhYmxlKGJvb2xlYW4gZGlzdCkgeworICAgICAgICB0aGlzLmRpc3RyaWJ1dGFibGUgPSBkaXN0OworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGdldERpc3RyaWJ1dGFibGUoKSB7CisgICAgICAgIHJldHVybiBkaXN0cmlidXRhYmxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgcmVjZWl2ZWQgdGhyZWFkIHdoZW4gYSBTZXNzaW9uTWVzc2FnZSBoYXMKKyAgICAgKiBiZWVuIHJlY2VpdmVkIGZyb20gb25lIG9mIHRoZSBvdGhlciBub2RlcyBpbiB0aGUgY2x1c3Rlci4KKyAgICAgKiBAcGFyYW0gbXNnIC0gdGhlIG1lc3NhZ2UgcmVjZWl2ZWQKKyAgICAgKiBAcGFyYW0gc2VuZGVyIC0gdGhlIHNlbmRlciBvZiB0aGUgbWVzc2FnZSwgdGhpcyBpcyB1c2VkIGlmIHdlIHJlY2VpdmUgYQorICAgICAqICAgICAgICAgICAgICAgICBFVlRfR0VUX0FMTF9TRVNTSU9OIG1lc3NhZ2UsIHNvIHRoYXQgd2Ugb25seSByZXBseSB0bworICAgICAqICAgICAgICAgICAgICAgICB0aGUgcmVxdWVzdGluZyBub2RlCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgbWVzc2FnZVJlY2VpdmVkKCBTZXNzaW9uTWVzc2FnZSBtc2csIE1lbWJlciBzZW5kZXIgKSB7CisgICAgICAgIHRyeSAgeworICAgICAgICAgICAgbG9nLmRlYnVnKCJSZWNlaXZlZCBTZXNzaW9uTWVzc2FnZSBvZiB0eXBlPSIrbXNnLmdldEV2ZW50VHlwZVN0cmluZygpKTsKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiUmVjZWl2ZWQgU2Vzc2lvbk1lc3NhZ2Ugc2VuZGVyPSIrc2VuZGVyKTsKKyAgICAgICAgICAgIHN3aXRjaCAoIG1zZy5nZXRFdmVudFR5cGUoKSApIHsKKyAgICAgICAgICAgICAgICBjYXNlIFNlc3Npb25NZXNzYWdlLkVWVF9HRVRfQUxMX1NFU1NJT05TOiB7CisgICAgICAgICAgICAgICAgICAgIC8vZ2V0IGEgbGlzdCBvZiBhbGwgdGhlIHNlc3Npb24gZnJvbSB0aGlzIG1hbmFnZXIKKyAgICAgICAgICAgICAgICAgICAgT2JqZWN0W10gc2Vzc2lvbnMgPSBmaW5kU2Vzc2lvbnMoKTsKKyAgICAgICAgICAgICAgICAgICAgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0gYm91dCA9IG5ldyBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICAgICAgICAgICAgICBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSBvb3V0ID0gbmV3IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtKGJvdXQpOworICAgICAgICAgICAgICAgICAgICBvb3V0LndyaXRlSW50KHNlc3Npb25zLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxzZXNzaW9ucy5sZW5ndGg7IGkrKyl7CisgICAgICAgICAgICAgICAgICAgICAgICBSZXBsaWNhdGVkU2Vzc2lvbiBzZXMgPSAoUmVwbGljYXRlZFNlc3Npb24pc2Vzc2lvbnNbaV07CisgICAgICAgICAgICAgICAgICAgICAgICBvb3V0LndyaXRlVVRGKHNlcy5nZXRJZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBkYXRhID0gd3JpdGVTZXNzaW9uKHNlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBvb3V0LndyaXRlT2JqZWN0KGRhdGEpOworICAgICAgICAgICAgICAgICAgICB9Ly9mb3IKKyAgICAgICAgICAgICAgICAgICAgLy9kb24ndCBzZW5kIGEgbWVzc2FnZSBpZiB3ZSBkb24ndCBoYXZlIHRvCisgICAgICAgICAgICAgICAgICAgIG9vdXQuZmx1c2goKTsKKyAgICAgICAgICAgICAgICAgICAgb291dC5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICBieXRlW10gZGF0YSA9IGJvdXQudG9CeXRlQXJyYXkoKTsKKyAgICAgICAgICAgICAgICAgICAgU2Vzc2lvbk1lc3NhZ2UgbmV3bXNnID0gbmV3IFNlc3Npb25NZXNzYWdlSW1wbChuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgU2Vzc2lvbk1lc3NhZ2UuRVZUX0FMTF9TRVNTSU9OX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLCAiU0VTU0lPTi1TVEFURSIsIlNFU1NJT04tU1RBVEUtIitnZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICBjbHVzdGVyLnNlbmQobmV3bXNnLCBzZW5kZXIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBTZXNzaW9uTWVzc2FnZS5FVlRfQUxMX1NFU1NJT05fREFUQTogeworICAgICAgICAgICAgICAgICAgICBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtIGJpbiA9CisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbShtc2cuZ2V0U2Vzc2lvbigpKTsKKyAgICAgICAgICAgICAgICAgICAgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSBvaW4gPSBuZXcgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbShiaW4pOworICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSA9IG9pbi5yZWFkSW50KCk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoIGludCBpPTA7IGk8c2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaWQgPSBvaW4ucmVhZFVURigpOworICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGRhdGEgPSAoYnl0ZVtdKW9pbi5yZWFkT2JqZWN0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSByZWFkU2Vzc2lvbihkYXRhLGlkKTsKKyAgICAgICAgICAgICAgICAgICAgfS8vZm9yCisgICAgICAgICAgICAgICAgICAgIHN0YXRlVHJhbnNmZXJyZWQ9dHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2UgU2Vzc2lvbk1lc3NhZ2UuRVZUX1NFU1NJT05fQ1JFQVRFRDogeworICAgICAgICAgICAgICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSB0aGlzLnJlYWRTZXNzaW9uKG1zZy5nZXRTZXNzaW9uKCksbXNnLmdldFNlc3Npb25JRCgpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiUmVjZWl2ZWQgcmVwbGljYXRlZCBzZXNzaW9uPSIgKyBzZXNzaW9uICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGlzVmFsaWQ9IiArIHNlc3Npb24uaXNWYWxpZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBTZXNzaW9uTWVzc2FnZS5FVlRfU0VTU0lPTl9FWFBJUkVEOiB7CisgICAgICAgICAgICAgICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IGZpbmRTZXNzaW9uKG1zZy5nZXRTZXNzaW9uSUQoKSk7CisgICAgICAgICAgICAgICAgICAgIGlmICggc2Vzc2lvbiAhPSBudWxsICkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5leHBpcmUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlKHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICB9Ly9lbmQgaWYKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2UgU2Vzc2lvbk1lc3NhZ2UuRVZUX1NFU1NJT05fQUNDRVNTRUQgOnsKKyAgICAgICAgICAgICAgICAgICAgU2Vzc2lvbiBzZXNzaW9uID0gZmluZFNlc3Npb24obXNnLmdldFNlc3Npb25JRCgpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzZXNzaW9uICE9IG51bGwgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmFjY2VzcygpOworICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5lbmRBY2Nlc3MoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGVmYXVsdDogIHsKKyAgICAgICAgICAgICAgICAgICAgLy93ZSBkaWRuJ3QgcmVjb2duaXplIHRoZSBtZXNzYWdlIHR5cGUsIGRvIG5vdGhpbmcKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfS8vc3dpdGNoCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKCBFeGNlcHRpb24geCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcigiVW5hYmxlIHRvIHJlY2VpdmUgbWVzc2FnZSB0aHJvdWdoIFRDUCBjaGFubmVsIix4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG1lc3NhZ2VEYXRhUmVjZWl2ZWQoQ2x1c3Rlck1lc3NhZ2UgY21zZykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKCBjbXNnIGluc3RhbmNlb2YgU2Vzc2lvbk1lc3NhZ2UgKSB7CisgICAgICAgICAgICAgICAgU2Vzc2lvbk1lc3NhZ2UgbXNnID0gKFNlc3Npb25NZXNzYWdlKWNtc2c7CisgICAgICAgICAgICAgICAgbWVzc2FnZVJlY2VpdmVkKG1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnLmdldEFkZHJlc3MoKSAhPSBudWxsID8gKE1lbWJlcikgbXNnLmdldEFkZHJlc3MoKSA6IG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoKFRocm93YWJsZSBleCl7CisgICAgICAgICAgICBsb2cuZXJyb3IoIkluTWVtb3J5UmVwbGljYXRpb25NYW5hZ2VyLm1lc3NhZ2VEYXRhUmVjZWl2ZWQoKSIsIGV4KTsKKyAgICAgICAgfS8vY2F0Y2gKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1N0YXRlVHJhbnNmZXJyZWQoKSB7CisgICAgICAgIHJldHVybiBzdGF0ZVRyYW5zZmVycmVkOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICB9CisgICAgcHVibGljIGJvb2xlYW4gZ2V0Tm90aWZ5TGlzdGVuZXJzT25SZXBsaWNhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG5vdGlmeUxpc3RlbmVyc09uUmVwbGljYXRpb247CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHNldE5vdGlmeUxpc3RlbmVyc09uUmVwbGljYXRpb24oYm9vbGVhbiBub3RpZnlMaXN0ZW5lcnNPblJlcGxpY2F0aW9uKSB7CisgICAgICAgIHRoaXMubm90aWZ5TGlzdGVuZXJzT25SZXBsaWNhdGlvbiA9IG5vdGlmeUxpc3RlbmVyc09uUmVwbGljYXRpb247CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3RjcC9Bc3luY1NvY2tldFNlbmRlci5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3RjcC9Bc3luY1NvY2tldFNlbmRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmNzZjYWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvdGNwL0FzeW5jU29ja2V0U2VuZGVyLmphdmEKQEAgLTAsMCArMSwxNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIudGNwOworCitpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3MgOworaW1wb3J0IGphdmEubmV0LlNvY2tldDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIudXRpbC5TbWFydFF1ZXVlOworcHVibGljIGNsYXNzIEFzeW5jU29ja2V0U2VuZGVyIGltcGxlbWVudHMgSURhdGFTZW5kZXIgeworICAgIHByaXZhdGUgc3RhdGljIGludCB0aHJlYWRDb3VudGVyPTE7CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGxvZyA9CisgICAgICAgIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3RvcnkuZ2V0TG9nKCBBc3luY1NvY2tldFNlbmRlci5jbGFzcyApOworCisgICAgCisgICAgcHJpdmF0ZSBJbmV0QWRkcmVzcyBhZGRyZXNzOworICAgIHByaXZhdGUgaW50IHBvcnQ7CisgICAgcHJpdmF0ZSBTb2NrZXQgc2MgPSBudWxsOworICAgIHByaXZhdGUgYm9vbGVhbiBpc1NvY2tldENvbm5lY3RlZCA9IGZhbHNlOworICAgIHByaXZhdGUgU21hcnRRdWV1ZSBxdWV1ZSA9IG5ldyBTbWFydFF1ZXVlKCk7CisgICAgcHJpdmF0ZSBib29sZWFuIHN1c3BlY3Q7CisgICAgCisgICAgcHJpdmF0ZSBRdWV1ZVRocmVhZCBxdWV1ZVRocmVhZCA9IG51bGw7CisgICAgcHJpdmF0ZSBsb25nIGFja1RpbWVvdXQ7CisgICAgCisgICAgcHVibGljIEFzeW5jU29ja2V0U2VuZGVyKEluZXRBZGRyZXNzIGhvc3QsIGludCBwb3J0KSAgeworICAgICAgICB0aGlzLmFkZHJlc3MgPSBob3N0OworICAgICAgICB0aGlzLnBvcnQgPSBwb3J0OworICAgICAgICBjaGVja1RocmVhZCgpOworICAgICAgICBsb2cuaW5mbygiU3RhcnRlZCBhc3luYyBzZW5kZXIgdGhyZWFkIGZvciBUQ1AgcmVwbGljYXRpb24uIik7CisgICAgfQorCisgICAgcHVibGljIEluZXRBZGRyZXNzIGdldEFkZHJlc3MoKSB7CisgICAgICAgIHJldHVybiBhZGRyZXNzOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0UG9ydCgpIHsKKyAgICAgICAgcmV0dXJuIHBvcnQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY29ubmVjdCgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uICB7CisgICAgICAgIHNjID0gbmV3IFNvY2tldChnZXRBZGRyZXNzKCksZ2V0UG9ydCgpKTsKKyAgICAgICAgaXNTb2NrZXRDb25uZWN0ZWQgPSB0cnVlOworICAgICAgICBjaGVja1RocmVhZCgpOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tUaHJlYWQoKSB7CisgICAgICAgIGlmICggcXVldWVUaHJlYWQgPT0gbnVsbCApIHsKKyAgICAgICAgICAgIHF1ZXVlVGhyZWFkID0gbmV3IFF1ZXVlVGhyZWFkKHRoaXMpOworICAgICAgICAgICAgcXVldWVUaHJlYWQuc2V0RGFlbW9uKHRydWUpOworICAgICAgICAgICAgcXVldWVUaHJlYWQuc3RhcnQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRpc2Nvbm5lY3QoKSAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgc2MuY2xvc2UoKTsKKyAgICAgICAgfWNhdGNoICggRXhjZXB0aW9uIHgpCisgICAgICAgIHt9CisgICAgICAgIGlzU29ja2V0Q29ubmVjdGVkID0gZmFsc2U7CisgICAgICAgIGlmICggcXVldWVUaHJlYWQgIT0gbnVsbCApIHsKKyAgICAgICAgICAgIHF1ZXVlVGhyZWFkLnN0b3BSdW5uaW5nKCk7CisgICAgICAgICAgICBxdWV1ZVRocmVhZCA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNDb25uZWN0ZWQoKSB7CisgICAgICAgIHJldHVybiBpc1NvY2tldENvbm5lY3RlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCbG9ja2luZyBzZW5kCisgICAgICogQHBhcmFtIGRhdGEKKyAgICAgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHNlbmRNZXNzYWdlKGJ5dGVbXSBkYXRhKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiAgeworICAgICAgICBpZiAoICFpc0Nvbm5lY3RlZCgpICkgY29ubmVjdCgpOworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgc2MuZ2V0T3V0cHV0U3RyZWFtKCkud3JpdGUoZGF0YSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKCBqYXZhLmlvLklPRXhjZXB0aW9uIHggKQorICAgICAgICB7CisgICAgICAgICAgICBkaXNjb25uZWN0KCk7CisgICAgICAgICAgICBjb25uZWN0KCk7CisgICAgICAgICAgICBzYy5nZXRPdXRwdXRTdHJlYW0oKS53cml0ZShkYXRhKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZW5kTWVzc2FnZShTdHJpbmcgc2Vzc2lvbklkLCBieXRlW10gZGF0YSkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICBTbWFydFF1ZXVlLlNtYXJ0RW50cnkgZW50cnkgPSBuZXcgU21hcnRRdWV1ZS5TbWFydEVudHJ5KHNlc3Npb25JZCxkYXRhKTsKKyAgICAgICAgcXVldWUuYWRkKGVudHJ5KTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigiU29ja2V0U2VuZGVyWyIpOworICAgICAgICBidWYuYXBwZW5kKGdldEFkZHJlc3MoKSkuYXBwZW5kKCI6IikuYXBwZW5kKGdldFBvcnQoKSkuYXBwZW5kKCJdIik7CisgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKKyAgICB9CisgICAgcHVibGljIGJvb2xlYW4gaXNTdXNwZWN0KCkgeworICAgICAgICByZXR1cm4gc3VzcGVjdDsKKyAgICB9CisgICAgCisgICAgcHVibGljIGJvb2xlYW4gZ2V0U3VzcGVjdCgpIHsKKyAgICAgICAgcmV0dXJuIHN1c3BlY3Q7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNldFN1c3BlY3QoYm9vbGVhbiBzdXNwZWN0KSB7CisgICAgICAgIHRoaXMuc3VzcGVjdCA9IHN1c3BlY3Q7CisgICAgfQorICAgIHB1YmxpYyBsb25nIGdldEFja1RpbWVvdXQoKSB7CisgICAgICAgIHJldHVybiBhY2tUaW1lb3V0OworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBzZXRBY2tUaW1lb3V0KGxvbmcgYWNrVGltZW91dCkgeworICAgICAgICB0aGlzLmFja1RpbWVvdXQgPSBhY2tUaW1lb3V0OworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIGNsYXNzIFF1ZXVlVGhyZWFkIGV4dGVuZHMgVGhyZWFkIHsKKyAgICAgICAgQXN5bmNTb2NrZXRTZW5kZXIgc2VuZGVyOworICAgICAgICBwcml2YXRlIGJvb2xlYW4ga2VlcFJ1bm5pbmcgPSB0cnVlOworCisgICAgICAgIHB1YmxpYyBRdWV1ZVRocmVhZChBc3luY1NvY2tldFNlbmRlciBzZW5kZXIpIHsKKyAgICAgICAgICAgIHRoaXMuc2VuZGVyID0gc2VuZGVyOworICAgICAgICAgICAgc2V0TmFtZSgiQ2x1c3Rlci1Bc3luY1NvY2tldFNlbmRlci0iKyh0aHJlYWRDb3VudGVyKyspKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIHZvaWQgc3RvcFJ1bm5pbmcoKSB7CisgICAgICAgICAgICBrZWVwUnVubmluZyA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICB3aGlsZSAoa2VlcFJ1bm5pbmcpIHsKKyAgICAgICAgICAgICAgICBTbWFydFF1ZXVlLlNtYXJ0RW50cnkgZW50cnkgPSBzZW5kZXIucXVldWUucmVtb3ZlKDUwMDApOworICAgICAgICAgICAgICAgIGlmICggZW50cnkgIT0gbnVsbCApIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBkYXRhID0gKGJ5dGVbXSkgZW50cnkuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRlci5zZW5kTWVzc2FnZShkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIHgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gYXN5bmNocm9ub3VzbHkgc2VuZCBzZXNzaW9uIHcvIGlkPSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmdldEtleSgpKyIgbWVzc2FnZSB3aWxsIGJlIGlnbm9yZWQuIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvdGNwL0lEYXRhU2VuZGVyLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvdGNwL0lEYXRhU2VuZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M2OGY5MAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci90Y3AvSURhdGFTZW5kZXIuamF2YQpAQCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnRjcDsKKworLyoqCisgKiA8cD5UaXRsZTogPC9wPgorICogPHA+RGVzY3JpcHRpb246IDwvcD4KKyAqIDxwPkNvcHlyaWdodDogQ29weXJpZ2h0IChjKSAyMDAyPC9wPgorICogPHA+Q29tcGFueTogPC9wPgorICogQGF1dGhvciBub3QgYXR0cmlidXRhYmxlCisgKiBAdmVyc2lvbiAxLjAKKyAqLworCitwdWJsaWMgaW50ZXJmYWNlIElEYXRhU2VuZGVyCit7CisgICAgcHVibGljIGphdmEubmV0LkluZXRBZGRyZXNzIGdldEFkZHJlc3MoKTsKKyAgICBwdWJsaWMgaW50IGdldFBvcnQoKTsKKyAgICBwdWJsaWMgdm9pZCBjb25uZWN0KCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb247CisgICAgcHVibGljIHZvaWQgZGlzY29ubmVjdCgpOworICAgIHB1YmxpYyB2b2lkIHNlbmRNZXNzYWdlKFN0cmluZyBzZXNzaW9uSWQsIGJ5dGVbXSBkYXRhKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbjsKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0Nvbm5lY3RlZCgpOworICAgIHB1YmxpYyB2b2lkIHNldFN1c3BlY3QoYm9vbGVhbiBzdXNwZWN0KTsKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRTdXNwZWN0KCk7CisgICAgcHVibGljIHZvaWQgc2V0QWNrVGltZW91dChsb25nIHRpbWVvdXQpOworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3RjcC9JRGF0YVNlbmRlckZhY3RvcnkuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci90Y3AvSURhdGFTZW5kZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU1YjEzYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci90Y3AvSURhdGFTZW5kZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci50Y3A7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLk1lbWJlcjsKK2ltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKK3B1YmxpYyBjbGFzcyBJRGF0YVNlbmRlckZhY3RvcnkgeworICAgIHByaXZhdGUgSURhdGFTZW5kZXJGYWN0b3J5KCkgeworICAgIH0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTWU5DX01PREU9InN5bmNocm9ub3VzIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBU1lOQ19NT0RFPSJhc3luY2hyb25vdXMiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBPT0xFRF9TWU5DX01PREU9InBvb2xlZCI7CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBJRGF0YVNlbmRlciBnZXRJRGF0YVNlbmRlcihTdHJpbmcgbW9kZSwgTWVtYmVyIG1icikKKyAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChTWU5DX01PREUuZXF1YWxzKG1vZGUpICkKKyAgICAgICAgICAgIHJldHVybiBuZXcgU29ja2V0U2VuZGVyKEluZXRBZGRyZXNzLmdldEJ5TmFtZShtYnIuZ2V0SG9zdCgpKSxtYnIuZ2V0UG9ydCgpKTsKKyAgICAgICAgZWxzZSBpZiAoIEFTWU5DX01PREUuZXF1YWxzKG1vZGUpICkKKyAgICAgICAgICAgIHJldHVybiBuZXcgQXN5bmNTb2NrZXRTZW5kZXIoSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKG1ici5nZXRIb3N0KCkpLG1ici5nZXRQb3J0KCkpOworICAgICAgICBpZiAoUE9PTEVEX1NZTkNfTU9ERS5lcXVhbHMobW9kZSkgKQorICAgICAgICAgICAgcmV0dXJuIG5ldyBQb29sZWRTb2NrZXRTZW5kZXIoSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKG1ici5nZXRIb3N0KCkpLG1ici5nZXRQb3J0KCkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5pby5JT0V4Y2VwdGlvbigiSW52YWxpZCByZXBsaWNhdGlvbiBtb2RlPSIrbW9kZSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdmFsaWRhdGVNb2RlKFN0cmluZyBtb2RlKSB7CisgICAgICAgIGlmIChTWU5DX01PREUuZXF1YWxzKG1vZGUpIHx8CisgICAgICAgICAgICBBU1lOQ19NT0RFLmVxdWFscyhtb2RlKSB8fAorICAgICAgICAgICAgUE9PTEVEX1NZTkNfTU9ERS5lcXVhbHMobW9kZSkgKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAiUmVwbGljYXRpb24gbW9kZSBoYXMgdG8gYmUgJyIrU1lOQ19NT0RFKyInLCAnIitBU1lOQ19NT0RFKyInIG9yICciK1BPT0xFRF9TWU5DX01PREUrIiciOworICAgICAgICB9CisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci90Y3AvSmRrMTNSZXBsaWNhdGlvbkxpc3RlbmVyLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvdGNwL0pkazEzUmVwbGljYXRpb25MaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyMWM3MTIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvdGNwL0pkazEzUmVwbGljYXRpb25MaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsMTMzIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnRjcDsKKworCisKKworaW1wb3J0IGphdmEubmV0LlNvY2tldDsKK2ltcG9ydCBqYXZhLm5ldC5TZXJ2ZXJTb2NrZXQ7CitpbXBvcnQgamF2YS5uZXQuSW5ldFNvY2tldEFkZHJlc3M7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLmlvLkxpc3RlbkNhbGxiYWNrOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5pby5KZGsxM09iamVjdFJlYWRlcjsKKworLyoqCisgKi8KK3B1YmxpYyBjbGFzcyBKZGsxM1JlcGxpY2F0aW9uTGlzdGVuZXIgaW1wbGVtZW50cyBSdW5uYWJsZQoreworCisgICAgcHJpdmF0ZSBzdGF0aWMgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGxvZyA9CisgICAgICAgIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3RvcnkuZ2V0TG9nKCBKZGsxM1JlcGxpY2F0aW9uTGlzdGVuZXIuY2xhc3MgKTsKKyAgICBwcml2YXRlIFRocmVhZFBvb2wgcG9vbCA9IG51bGw7CisgICAgcHJpdmF0ZSBib29sZWFuIGRvTGlzdGVuID0gZmFsc2U7CisgICAgcHJpdmF0ZSBMaXN0ZW5DYWxsYmFjayBjYWxsYmFjazsKKyAgICBwcml2YXRlIGphdmEubmV0LkluZXRBZGRyZXNzIGJpbmQ7CisgICAgcHJpdmF0ZSBpbnQgcG9ydDsKKyAgICBwcml2YXRlIGxvbmcgdGltZW91dCA9IDA7CisgICAgcHJpdmF0ZSBib29sZWFuIHN5bmNocm9ub3VzID0gZmFsc2U7CisgICAgU2VydmVyU29ja2V0IHNlcnZlclNvY2tldCA9IG51bGw7CisKKyAgICBwdWJsaWMgSmRrMTNSZXBsaWNhdGlvbkxpc3RlbmVyKExpc3RlbkNhbGxiYWNrIGNhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwb29sU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLm5ldC5JbmV0QWRkcmVzcyBiaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHN5bmNocm9ub3VzKQorICAgIHsKKyAgICAgICAgdGhpcy5zeW5jaHJvbm91cz1zeW5jaHJvbm91czsKKyAgICAgICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrOworICAgICAgICB0aGlzLmJpbmQgPSBiaW5kOworICAgICAgICB0aGlzLnBvcnQgPSBwb3J0OworICAgICAgICB0aGlzLnRpbWVvdXQgPSB0aW1lb3V0OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJ1bigpCisgICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgbGlzdGVuKCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKCBFeGNlcHRpb24geCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvZy5mYXRhbCgiVW5hYmxlIHRvIHN0YXJ0IGNsdXN0ZXIgbGlzdGVuZXIuIix4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGxpc3RlbiAoKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBkb0xpc3RlbiA9IHRydWU7CisgICAgICAgIC8vIEdldCB0aGUgYXNzb2NpYXRlZCBTZXJ2ZXJTb2NrZXQgdG8gYmluZCBpdCB3aXRoCisgICAgICAgIHNlcnZlclNvY2tldCA9IG5ldyBTZXJ2ZXJTb2NrZXQoKTsKKyAgICAgICAgc2VydmVyU29ja2V0LmJpbmQgKG5ldyBJbmV0U29ja2V0QWRkcmVzcyAoYmluZCxwb3J0KSk7CisgICAgICAgIHdoaWxlIChkb0xpc3RlbikgeworICAgICAgICAgICAgU29ja2V0IHNvY2tldCA9IHNlcnZlclNvY2tldC5hY2NlcHQoKTsKKyAgICAgICAgICAgIENsdXN0ZXJMaXN0ZW5UaHJlYWQgdCA9IG5ldyBDbHVzdGVyTGlzdGVuVGhyZWFkKHNvY2tldCxuZXcgSmRrMTNPYmplY3RSZWFkZXIoc29ja2V0LGNhbGxiYWNrKSk7CisgICAgICAgICAgICB0LnNldERhZW1vbih0cnVlKTsKKyAgICAgICAgICAgIHQuc3RhcnQoKTsKKyAgICAgICAgfS8vd2hpbGUKKyAgICAgICAgc2VydmVyU29ja2V0LmNsb3NlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RvcExpc3RlbmluZygpeworICAgICAgICBkb0xpc3RlbiA9IGZhbHNlOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc2VydmVyU29ja2V0LmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKCBFeGNlcHRpb24geCApIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcigiVW5hYmxlIHRvIHN0b3AgdGhlIHJlcGxpY2F0aW9uIGxpc3RlbiBzb2NrZXQiLHgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBDbHVzdGVyTGlzdGVuVGhyZWFkIGV4dGVuZHMgVGhyZWFkIHsKKyAgICAgICAgcHJpdmF0ZSBTb2NrZXQgc29ja2V0OworICAgICAgICBwcml2YXRlIEpkazEzT2JqZWN0UmVhZGVyIHJlYWRlcjsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGtlZXBSdW5uaW5nID0gdHJ1ZTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIGFja01zZyA9IG5ldyBieXRlW10gezYsMiwzfTsKKyAgICAgICAgQ2x1c3Rlckxpc3RlblRocmVhZChTb2NrZXQgc29ja2V0LCBKZGsxM09iamVjdFJlYWRlciByZWFkZXIpIHsKKyAgICAgICAgICAgIHRoaXMuc29ja2V0ID0gc29ja2V0OworICAgICAgICAgICAgdGhpcy5yZWFkZXIgPSByZWFkZXI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVsxMDI0XTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoa2VlcFJ1bm5pbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgamF2YS5pby5JbnB1dFN0cmVhbSBpbiA9IHNvY2tldC5nZXRJbnB1dFN0cmVhbSgpOworICAgICAgICAgICAgICAgICAgICBpbnQgY250ID0gaW4ucmVhZChidWZmZXIpOworICAgICAgICAgICAgICAgICAgICBpbnQgYWNrID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBjbnQgPiAwICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWNrID0gcmVhZGVyLmFwcGVuZChidWZmZXIsIDAsIGNudCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCBhY2sgPiAwICkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2VuZEFjaygpOworICAgICAgICAgICAgICAgICAgICAgICAgYWNrLS07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoICggRXhjZXB0aW9uIHggKSB7CisgICAgICAgICAgICAgICAga2VlcFJ1bm5pbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIlVuYWJsZSB0byByZWFkIGRhdGEgZnJvbSBjbGllbnQsIGRpc2Nvbm5lY3RpbmcuIix4KTsKKyAgICAgICAgICAgICAgICB0cnkgeyBzb2NrZXQuY2xvc2UoKTsgfSBjYXRjaCAoIEV4Y2VwdGlvbiBpZ25vcmUgKSB7fQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHNlbmRBY2soKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAvL3NlbmQgYSByZXBseS1hY2tub3dsZWRnZW1lbnQKKyAgICAgICAgICAgIHNvY2tldC5nZXRPdXRwdXRTdHJlYW0oKS53cml0ZShhY2tNc2cpOworICAgICAgICB9CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvdGNwL1Bvb2xlZFNvY2tldFNlbmRlci5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3RjcC9Qb29sZWRTb2NrZXRTZW5kZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODUyODk3Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3RjcC9Qb29sZWRTb2NrZXRTZW5kZXIuamF2YQpAQCAtMCwwICsxLDIzMyBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci50Y3A7CitpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3MgOworaW1wb3J0IGphdmEubmV0LlNvY2tldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKKworLyoqCisgKiA8cD5UaXRsZTogPC9wPgorICogPHA+RGVzY3JpcHRpb246IDwvcD4KKyAqIDxwPkNvcHlyaWdodDogQ29weXJpZ2h0IChjKSAyMDAyPC9wPgorICogPHA+Q29tcGFueTogPC9wPgorICogQGF1dGhvciBub3QgYXR0cmlidXRhYmxlCisgKiBAdmVyc2lvbiAxLjAKKyAqLworCitwdWJsaWMgY2xhc3MgUG9vbGVkU29ja2V0U2VuZGVyIGltcGxlbWVudHMgSURhdGFTZW5kZXIKK3sKKworICAgIHByaXZhdGUgc3RhdGljIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZyBsb2cgPQorICAgICAgICBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5LmdldExvZyggb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLkNhdGFsaW5hQ2x1c3Rlci5jbGFzcyApOworCisgICAgcHJpdmF0ZSBJbmV0QWRkcmVzcyBhZGRyZXNzOworICAgIHByaXZhdGUgaW50IHBvcnQ7CisgICAgcHJpdmF0ZSBTb2NrZXQgc2MgPSBudWxsOworICAgIHByaXZhdGUgYm9vbGVhbiBpc1NvY2tldENvbm5lY3RlZCA9IHRydWU7CisgICAgcHJpdmF0ZSBib29sZWFuIHN1c3BlY3Q7CisgICAgcHJpdmF0ZSBsb25nIGFja1RpbWVvdXQgPSAxNSoxMDAwOyAgLy8xNSBzZWNvbmRzIHNvY2tldCByZWFkIHRpbWVvdXQgKGZvciBhY2tub3dsZWRnZW1lbnQpCisgICAgcHJpdmF0ZSBsb25nIGtlZXBBbGl2ZVRpbWVvdXQgPSA2MCoxMDAwOyAvL2tlZXAgc29ja2V0IG9wZW4gZm9yIG5vIG1vcmUgdGhhbiBvbmUgbWluCisgICAgcHJpdmF0ZSBpbnQga2VlcEFsaXZlTWF4UmVxdWVzdENvdW50ID0gMTAwOyAvL21heCAxMDAgcmVxdWVzdHMgYmVmb3JlIHJlY29ubmVjdGluZworICAgIHByaXZhdGUgbG9uZyBrZWVwQWxpdmVDb25uZWN0VGltZSA9IDA7CisgICAgcHJpdmF0ZSBpbnQga2VlcEFsaXZlQ291bnQgPSAwOworICAgIHByaXZhdGUgaW50IG1heFBvb2xTb2NrZXRMaW1pdCA9IDI1OworCisgICAgcHJpdmF0ZSBTZW5kZXJRdWV1ZSBzZW5kZXJRdWV1ZSA9IG51bGw7CisKKyAgICBwdWJsaWMgUG9vbGVkU29ja2V0U2VuZGVyKEluZXRBZGRyZXNzIGhvc3QsIGludCBwb3J0KQorICAgIHsKKyAgICAgICAgdGhpcy5hZGRyZXNzID0gaG9zdDsKKyAgICAgICAgdGhpcy5wb3J0ID0gcG9ydDsKKyAgICAgICAgc2VuZGVyUXVldWUgPSBuZXcgU2VuZGVyUXVldWUodGhpcyxtYXhQb29sU29ja2V0TGltaXQpOworICAgIH0KKworICAgIHB1YmxpYyBJbmV0QWRkcmVzcyBnZXRBZGRyZXNzKCkKKyAgICB7CisgICAgICAgIHJldHVybiBhZGRyZXNzOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0UG9ydCgpCisgICAgeworICAgICAgICByZXR1cm4gcG9ydDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjb25uZWN0KCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIC8vZG8gbm90aGluZywgaGFwcGVucyBpbiB0aGUgc29ja2V0IHNlbmRlciBpdHNlbGYKKyAgICAgICAgc2VuZGVyUXVldWUub3BlbigpOworICAgICAgICBpc1NvY2tldENvbm5lY3RlZCA9IHRydWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZGlzY29ubmVjdCgpCisgICAgeworICAgICAgICBzZW5kZXJRdWV1ZS5jbG9zZSgpOworICAgICAgICBpc1NvY2tldENvbm5lY3RlZCA9IGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzQ29ubmVjdGVkKCkKKyAgICB7CisgICAgICAgIHJldHVybiBpc1NvY2tldENvbm5lY3RlZDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBY2tUaW1lb3V0KGxvbmcgdGltZW91dCkgeworICAgICAgICB0aGlzLmFja1RpbWVvdXQgPSB0aW1lb3V0OworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGdldEFja1RpbWVvdXQoKSB7CisgICAgICAgIHJldHVybiBhY2tUaW1lb3V0OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1heFBvb2xTb2NrZXRMaW1pdChpbnQgbGltaXQpIHsKKyAgICAgICAgbWF4UG9vbFNvY2tldExpbWl0ID0gbGltaXQ7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRNYXhQb29sU29ja2V0TGltaXQoKSB7CisgICAgICAgIHJldHVybiBtYXhQb29sU29ja2V0TGltaXQ7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBCbG9ja2luZyBzZW5kCisgICAgICogQHBhcmFtIGRhdGEKKyAgICAgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZW5kTWVzc2FnZShTdHJpbmcgc2Vzc2lvbklkLCBieXRlW10gZGF0YSkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIC8vZ2V0IGEgc29ja2V0IHNlbmRlciBmcm9tIHRoZSBwb29sCisgICAgICAgIFNvY2tldFNlbmRlciBzZW5kZXIgPSBzZW5kZXJRdWV1ZS5nZXRTZW5kZXIoMCk7CisgICAgICAgIGlmICggc2VuZGVyID09IG51bGwgKSB7CisgICAgICAgICAgICBsb2cud2FybigiTm8gc29ja2V0IHNlbmRlciBhdmFpbGFibGUgZm9yIGNsaWVudD0iK3RoaXMuZ2V0QWRkcmVzcygpKyI6Iit0aGlzLmdldFBvcnQoKSsiIGRpZCBpdCBkaXNhcHBlYXI/Iik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0vL2VuZCBpZgorICAgICAgICAvL3NlbmQgdGhlIG1lc3NhZ2UKKyAgICAgICAgc2VuZGVyLnNlbmRNZXNzYWdlKHNlc3Npb25JZCxkYXRhKTsKKyAgICAgICAgLy9yZXR1cm4gdGhlIGNvbm5lY3Rpb24gdG8gdGhlIHBvb2wKKyAgICAgICAgc2VuZGVyUXVldWUucmV0dXJuU2VuZGVyKHNlbmRlcik7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoIlBvb2xlZFNvY2tldFNlbmRlclsiKTsKKyAgICAgICAgYnVmLmFwcGVuZChnZXRBZGRyZXNzKCkpLmFwcGVuZCgiOiIpLmFwcGVuZChnZXRQb3J0KCkpLmFwcGVuZCgiXSIpOworICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZ2V0U3VzcGVjdCgpIHsKKyAgICAgICAgcmV0dXJuIHN1c3BlY3Q7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U3VzcGVjdChib29sZWFuIHN1c3BlY3QpIHsKKyAgICAgICAgdGhpcy5zdXNwZWN0ID0gc3VzcGVjdDsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBnZXRLZWVwQWxpdmVUaW1lb3V0KCkgeworICAgICAgICByZXR1cm4ga2VlcEFsaXZlVGltZW91dDsKKyAgICB9CisgICAgcHVibGljIHZvaWQgc2V0S2VlcEFsaXZlVGltZW91dChsb25nIGtlZXBBbGl2ZVRpbWVvdXQpIHsKKyAgICAgICAgdGhpcy5rZWVwQWxpdmVUaW1lb3V0ID0ga2VlcEFsaXZlVGltZW91dDsKKyAgICB9CisgICAgcHVibGljIGludCBnZXRLZWVwQWxpdmVNYXhSZXF1ZXN0Q291bnQoKSB7CisgICAgICAgIHJldHVybiBrZWVwQWxpdmVNYXhSZXF1ZXN0Q291bnQ7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHNldEtlZXBBbGl2ZU1heFJlcXVlc3RDb3VudChpbnQga2VlcEFsaXZlTWF4UmVxdWVzdENvdW50KSB7CisgICAgICAgIHRoaXMua2VlcEFsaXZlTWF4UmVxdWVzdENvdW50ID0ga2VlcEFsaXZlTWF4UmVxdWVzdENvdW50OworICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgU2VuZGVyUXVldWUgeworICAgICAgICBwcml2YXRlIGludCBsaW1pdCA9IDI1OworICAgICAgICBQb29sZWRTb2NrZXRTZW5kZXIgcGFyZW50ID0gbnVsbDsKKyAgICAgICAgcHJpdmF0ZSBMaW5rZWRMaXN0IHF1ZXVlID0gbmV3IExpbmtlZExpc3QoKTsKKyAgICAgICAgcHJpdmF0ZSBMaW5rZWRMaXN0IGludXNlID0gbmV3IExpbmtlZExpc3QoKTsKKyAgICAgICAgcHJpdmF0ZSBPYmplY3QgbXV0ZXggPSBuZXcgT2JqZWN0KCk7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBpc09wZW4gPSB0cnVlOworCisgICAgICAgIHB1YmxpYyBTZW5kZXJRdWV1ZShQb29sZWRTb2NrZXRTZW5kZXIgcGFyZW50LCBpbnQgbGltaXQpIHsKKyAgICAgICAgICAgIHRoaXMubGltaXQgPSBsaW1pdDsKKyAgICAgICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFNvY2tldFNlbmRlciBnZXRTZW5kZXIobG9uZyB0aW1lb3V0KSB7CisgICAgICAgICAgICBTb2NrZXRTZW5kZXIgc2VuZGVyID0gbnVsbDsKKyAgICAgICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgIGxvbmcgZGVsdGEgPSAwOworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobXV0ZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAhaXNPcGVuICkgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiU29ja2V0IHBvb2wgaXMgY2xvc2VkLiIpOworICAgICAgICAgICAgICAgICAgICBpZiAoIHF1ZXVlLnNpemUoKSA+IDAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZW5kZXIgPSAoU29ja2V0U2VuZGVyKSBxdWV1ZS5yZW1vdmVGaXJzdCgpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCBpbnVzZS5zaXplKCkgPCBsaW1pdCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRlciA9IGdldE5ld1NvY2tldFNlbmRlcigpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRleC53YWl0KHRpbWVvdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgfWNhdGNoICggRXhjZXB0aW9uIHggKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9vbGVkU29ja2V0U2VuZGVyLmxvZy53YXJuKCJQb29sU29ja2V0U2VuZGVyLnNlbmRlclF1ZXVlLmdldFNlbmRlciBmYWlsZWQiLHgpOworICAgICAgICAgICAgICAgICAgICAgICAgfS8vY2F0Y2gKKyAgICAgICAgICAgICAgICAgICAgfS8vZW5kIGlmCisgICAgICAgICAgICAgICAgICAgIGlmICggc2VuZGVyICE9IG51bGwgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnVzZS5hZGQoc2VuZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0vL3N5bmNocm9uaXplZAorICAgICAgICAgICAgICAgIGRlbHRhID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydDsKKyAgICAgICAgICAgIH0gd2hpbGUgKCAoaXNPcGVuKSAmJiAoc2VuZGVyID09IG51bGwpICYmICh0aW1lb3V0PT0wP3RydWU6KGRlbHRhPHRpbWVvdXQpKSApOworICAgICAgICAgICAgLy90byBkbworICAgICAgICAgICAgcmV0dXJuIHNlbmRlcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHJldHVyblNlbmRlcihTb2NrZXRTZW5kZXIgc2VuZGVyKSB7CisgICAgICAgICAgICAvL3RvIGRvCisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG11dGV4KSB7CisgICAgICAgICAgICAgICAgcXVldWUuYWRkKHNlbmRlcik7CisgICAgICAgICAgICAgICAgaW51c2UucmVtb3ZlKHNlbmRlcik7CisgICAgICAgICAgICAgICAgbXV0ZXgubm90aWZ5KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFNvY2tldFNlbmRlciBnZXROZXdTb2NrZXRTZW5kZXIoKSB7CisgICAgICAgICAgICAvL25ldyBTb2NrZXRTZW5kZXIoCisgICAgICAgICAgICBTb2NrZXRTZW5kZXIgc2VuZGVyID0gbmV3IFNvY2tldFNlbmRlcihwYXJlbnQuZ2V0QWRkcmVzcygpLHBhcmVudC5nZXRQb3J0KCkpOworICAgICAgICAgICAgc2VuZGVyLnNldEtlZXBBbGl2ZU1heFJlcXVlc3RDb3VudChwYXJlbnQuZ2V0S2VlcEFsaXZlTWF4UmVxdWVzdENvdW50KCkpOworICAgICAgICAgICAgc2VuZGVyLnNldEtlZXBBbGl2ZVRpbWVvdXQocGFyZW50LmdldEtlZXBBbGl2ZVRpbWVvdXQoKSk7CisgICAgICAgICAgICBzZW5kZXIuc2V0QWNrVGltZW91dChwYXJlbnQuZ2V0QWNrVGltZW91dCgpKTsKKyAgICAgICAgICAgIHJldHVybiBzZW5kZXI7CisKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworICAgICAgICAgICAgc3luY2hyb25pemVkIChtdXRleCkgeworICAgICAgICAgICAgICAgIGZvciAoIGludCBpPTA7IGk8cXVldWUuc2l6ZSgpOyBpKysgKSB7CisgICAgICAgICAgICAgICAgICAgIFNvY2tldFNlbmRlciBzZW5kZXIgPSAoU29ja2V0U2VuZGVyKXF1ZXVlLmdldChpKTsKKyAgICAgICAgICAgICAgICAgICAgc2VuZGVyLmRpc2Nvbm5lY3QoKTsKKyAgICAgICAgICAgICAgICB9Ly9mb3IKKyAgICAgICAgICAgICAgICBmb3IgKCBpbnQgaT0wOyBpPGludXNlLnNpemUoKTsgaSsrICkgeworICAgICAgICAgICAgICAgICAgICBTb2NrZXRTZW5kZXIgc2VuZGVyID0gKFNvY2tldFNlbmRlcikgaW51c2UuZ2V0KGkpOworICAgICAgICAgICAgICAgICAgICBzZW5kZXIuZGlzY29ubmVjdCgpOworICAgICAgICAgICAgICAgIH0vL2ZvcgorICAgICAgICAgICAgICAgIHF1ZXVlLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgaW51c2UuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBpc09wZW4gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBtdXRleC5ub3RpZnlBbGwoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIHZvaWQgb3BlbigpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobXV0ZXgpIHsKKyAgICAgICAgICAgICAgICBpc09wZW4gPSB0cnVlOworICAgICAgICAgICAgICAgIG11dGV4Lm5vdGlmeUFsbCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3RjcC9SZXBsaWNhdGlvbkxpc3RlbmVyLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvdGNwL1JlcGxpY2F0aW9uTGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmQ3NTJkCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3RjcC9SZXBsaWNhdGlvbkxpc3RlbmVyLmphdmEKQEAgLTAsMCArMSwyNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIudGNwOworCisKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5TZXJ2ZXJTb2NrZXRDaGFubmVsOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNvY2tldENoYW5uZWw7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0b3I7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0aW9uS2V5OworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdGFibGVDaGFubmVsOworCitpbXBvcnQgamF2YS5uZXQuU2VydmVyU29ja2V0OworaW1wb3J0IGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuaW8uTGlzdGVuQ2FsbGJhY2s7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLmlvLk9iamVjdFJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuQ2F0YWxpbmFDbHVzdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5DbHVzdGVyUmVjZWl2ZXI7CisvKioKKyAqLworcHVibGljIGNsYXNzIFJlcGxpY2F0aW9uTGlzdGVuZXIgaW1wbGVtZW50cyBSdW5uYWJsZSxDbHVzdGVyUmVjZWl2ZXIKK3sKKworICAgIHByaXZhdGUgc3RhdGljIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZyBsb2cgPQorICAgICAgICBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5LmdldExvZyggUmVwbGljYXRpb25MaXN0ZW5lci5jbGFzcyApOworICAgIHByaXZhdGUgVGhyZWFkUG9vbCBwb29sID0gbnVsbDsKKyAgICBwcml2YXRlIGJvb2xlYW4gZG9MaXN0ZW4gPSBmYWxzZTsKKyAgICBwcml2YXRlIExpc3RlbkNhbGxiYWNrIGNhbGxiYWNrOworICAgIHByaXZhdGUgamF2YS5uZXQuSW5ldEFkZHJlc3MgYmluZDsKKyAgICBwcml2YXRlIFN0cmluZyB0Y3BMaXN0ZW5BZGRyZXNzOworICAgIHByaXZhdGUgaW50IHRjcFRocmVhZENvdW50OworICAgIHByaXZhdGUgbG9uZyB0Y3BTZWxlY3RvclRpbWVvdXQ7CisgICAgcHJpdmF0ZSBpbnQgdGNwTGlzdGVuUG9ydDsKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNTZW5kZXJTeW5jaHJvbml6ZWQ7CisgICAgcHJpdmF0ZSBTZWxlY3RvciBzZWxlY3RvciA9IG51bGw7CisgICAgCisgICAgcHJpdmF0ZSBPYmplY3QgaW50ZXJlc3RPcHNNdXRleCA9IG5ldyBPYmplY3QoKTsKKyAgICAKKyAgICBwdWJsaWMgUmVwbGljYXRpb25MaXN0ZW5lcigpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHBvb2wgPSBuZXcgVGhyZWFkUG9vbCh0Y3BUaHJlYWRDb3VudCwgVGNwUmVwbGljYXRpb25UaHJlYWQuY2xhc3MsIGludGVyZXN0T3BzTXV0ZXgpOworICAgICAgICAgICAgaWYgKCAiYXV0byIuZXF1YWxzKHRjcExpc3RlbkFkZHJlc3MpICkgeworICAgICAgICAgICAgICAgIHRjcExpc3RlbkFkZHJlc3MgPSBqYXZhLm5ldC5JbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKS4KKyAgICAgICAgICAgICAgICAgICAgZ2V0SG9zdEFkZHJlc3MoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiU3RhcnRpbmcgcmVwbGljYXRpb24gbGlzdGVuZXIgb24gYWRkcmVzczoiK3RjcExpc3RlbkFkZHJlc3MpOworICAgICAgICAgICAgYmluZCA9IGphdmEubmV0LkluZXRBZGRyZXNzLmdldEJ5TmFtZSh0Y3BMaXN0ZW5BZGRyZXNzKTsKKyAgICAgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZCh0aGlzLCJDbHVzdGVyUmVjZWl2ZXIiKTsKKyAgICAgICAgICAgIHQuc2V0RGFlbW9uKHRydWUpOworICAgICAgICAgICAgdC5zdGFydCgpOworICAgICAgICB9IGNhdGNoICggRXhjZXB0aW9uIHggKSB7CisgICAgICAgICAgICBsb2cuZmF0YWwoIlVuYWJsZSB0byBzdGFydCBjbHVzdGVyIHJlY2VpdmVyIix4KTsKKyAgICAgICAgfQorCisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB7CisgICAgICAgIHN0b3BMaXN0ZW5pbmcoKTsKKyAgICB9CisgICAgCisKKyAgICBwdWJsaWMgdm9pZCBydW4oKQorICAgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIGxpc3RlbigpOworICAgICAgICB9CisgICAgICAgIGNhdGNoICggRXhjZXB0aW9uIHggKQorICAgICAgICB7CisgICAgICAgICAgICBsb2cuZXJyb3IoIlVuYWJsZSB0byBzdGFydCBjbHVzdGVyIGxpc3RlbmVyLiIseCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBsaXN0ZW4gKCkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgZG9MaXN0ZW4gPSB0cnVlOworICAgICAgICAvLyBhbGxvY2F0ZSBhbiB1bmJvdW5kIHNlcnZlciBzb2NrZXQgY2hhbm5lbAorICAgICAgICBTZXJ2ZXJTb2NrZXRDaGFubmVsIHNlcnZlckNoYW5uZWwgPSBTZXJ2ZXJTb2NrZXRDaGFubmVsLm9wZW4oKTsKKyAgICAgICAgLy8gR2V0IHRoZSBhc3NvY2lhdGVkIFNlcnZlclNvY2tldCB0byBiaW5kIGl0IHdpdGgKKyAgICAgICAgU2VydmVyU29ja2V0IHNlcnZlclNvY2tldCA9IHNlcnZlckNoYW5uZWwuc29ja2V0KCk7CisgICAgICAgIC8vIGNyZWF0ZSBhIG5ldyBTZWxlY3RvciBmb3IgdXNlIGJlbG93CisgICAgICAgIHNlbGVjdG9yID0gU2VsZWN0b3Iub3BlbigpOworICAgICAgICAvLyBzZXQgdGhlIHBvcnQgdGhlIHNlcnZlciBjaGFubmVsIHdpbGwgbGlzdGVuIHRvCisgICAgICAgIHNlcnZlclNvY2tldC5iaW5kIChuZXcgSW5ldFNvY2tldEFkZHJlc3MgKGJpbmQsdGNwTGlzdGVuUG9ydCkpOworICAgICAgICAvLyBzZXQgbm9uLWJsb2NraW5nIG1vZGUgZm9yIHRoZSBsaXN0ZW5pbmcgc29ja2V0CisgICAgICAgIHNlcnZlckNoYW5uZWwuY29uZmlndXJlQmxvY2tpbmcgKGZhbHNlKTsKKyAgICAgICAgLy8gcmVnaXN0ZXIgdGhlIFNlcnZlclNvY2tldENoYW5uZWwgd2l0aCB0aGUgU2VsZWN0b3IKKyAgICAgICAgc2VydmVyQ2hhbm5lbC5yZWdpc3RlciAoc2VsZWN0b3IsIFNlbGVjdGlvbktleS5PUF9BQ0NFUFQpOworICAgICAgICB3aGlsZSAoZG9MaXN0ZW4pIHsKKyAgICAgICAgICAgIC8vIHRoaXMgbWF5IGJsb2NrIGZvciBhIGxvbmcgdGltZSwgdXBvbiByZXR1cm4gdGhlCisgICAgICAgICAgICAvLyBzZWxlY3RlZCBzZXQgY29udGFpbnMga2V5cyBvZiB0aGUgcmVhZHkgY2hhbm5lbHMKKyAgICAgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgICAgICBpbnQgbiA9IHNlbGVjdG9yLnNlbGVjdCh0Y3BTZWxlY3RvclRpbWVvdXQpOworICAgICAgICAgICAgICAgIGlmIChuID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLy90aGVyZSBpcyBhIGdvb2QgY2hhbmNlIHRoYXQgd2UgZ290IGhlcmUgCisgICAgICAgICAgICAgICAgICAgIC8vYmVjYXVzZSB0aGUgVGNwUmVwbGljYXRpb25UaHJlYWQgY2FsbGVkCisgICAgICAgICAgICAgICAgICAgIC8vc2VsZWN0b3Igd2FrZXVwKCkuCisgICAgICAgICAgICAgICAgICAgIC8vaWYgdGhhdCBoYXBwZW5zLCB3ZSBtdXN0IGVuc3VyZSB0aGF0IHRoYXQKKyAgICAgICAgICAgICAgICAgICAgLy90aHJlYWQgaGFzIGVub3VnaCB0aW1lIHRvIGNhbGwgaW50ZXJlc3RPcHMKKyAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChpbnRlcmVzdE9wc011dGV4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL2lmIHdlIGdvdCB0aGUgbG9jaywgbWVhbnMgdGhlcmUgYXJlIG5vCisgICAgICAgICAgICAgICAgICAgICAgICAvL2tleXMgdHJ5aW5nIHRvIHJlZ2lzdGVyIGZvciB0aGUgCisgICAgICAgICAgICAgICAgICAgICAgICAvL2ludGVyZXN0T3BzIG1ldGhvZAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBub3RoaW5nIHRvIGRvCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIGdldCBhbiBpdGVyYXRvciBvdmVyIHRoZSBzZXQgb2Ygc2VsZWN0ZWQga2V5cworICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGl0ID0gc2VsZWN0b3Iuc2VsZWN0ZWRLZXlzKCkuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgICAgICAvLyBsb29rIGF0IGVhY2gga2V5IGluIHRoZSBzZWxlY3RlZCBzZXQKKyAgICAgICAgICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbktleSBrZXkgPSAoU2VsZWN0aW9uS2V5KSBpdC5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIC8vIElzIGEgbmV3IGNvbm5lY3Rpb24gY29taW5nIGluPworICAgICAgICAgICAgICAgICAgICBpZiAoa2V5LmlzQWNjZXB0YWJsZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2ZXJTb2NrZXRDaGFubmVsIHNlcnZlciA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNlcnZlclNvY2tldENoYW5uZWwpIGtleS5jaGFubmVsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBTb2NrZXRDaGFubmVsIGNoYW5uZWwgPSBzZXJ2ZXIuYWNjZXB0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlckNoYW5uZWwoc2VsZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25LZXkuT1BfUkVBRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0UmVhZGVyKGNoYW5uZWwsIHNlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gaXMgdGhlcmUgZGF0YSB0byByZWFkIG9uIHRoaXMgY2hhbm5lbD8KKyAgICAgICAgICAgICAgICAgICAgaWYgKGtleS5pc1JlYWRhYmxlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlYWREYXRhRnJvbVNvY2tldChrZXkpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAga2V5LmludGVyZXN0T3BzKGtleS5pbnRlcmVzdE9wcygpICYgKH5TZWxlY3Rpb25LZXkuT1BfV1JJVEUpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBrZXkgZnJvbSBzZWxlY3RlZCBzZXQsIGl0J3MgYmVlbiBoYW5kbGVkCisgICAgICAgICAgICAgICAgICAgIGl0LnJlbW92ZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChqYXZhLm5pby5jaGFubmVscy5DYW5jZWxsZWRLZXlFeGNlcHRpb24gbngpIHsKKyAgICAgICAgICAgICAgICBsb2cud2FybigKKyAgICAgICAgICAgICAgICAgICAgIlJlcGxpY2F0aW9uIGNsaWVudCBkaXNjb25uZWN0ZWQsIGVycm9yIHdoZW4gcG9sbGluZyBrZXkuIElnbm9yaW5nIGNsaWVudC4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24geCkgeworICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiVW5hYmxlIHRvIHByb2Nlc3MgcmVxdWVzdCBpbiBSZXBsaWNhdGlvbkxpc3RlbmVyIiwgeCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSAvL3doaWxlCisgICAgICAgIHNlcnZlckNoYW5uZWwuY2xvc2UoKTsKKyAgICAgICAgc2VsZWN0b3IuY2xvc2UoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdG9wTGlzdGVuaW5nKCl7CisgICAgICAgIGRvTGlzdGVuID0gZmFsc2U7CisgICAgICAgIGlmICggc2VsZWN0b3IgIT0gbnVsbCApIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc2VsZWN0b3IuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICBzZWxlY3RvciA9IG51bGw7CisgICAgICAgICAgICB9IGNhdGNoICggRXhjZXB0aW9uIHggKSB7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJVbmFibGUgdG8gY2xvc2UgY2x1c3RlciByZWNlaXZlciBzZWxlY3Rvci4iLHgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNldENhdGFsaW5hQ2x1c3RlcihDYXRhbGluYUNsdXN0ZXIgY2x1c3RlcikgeworICAgICAgICBjYWxsYmFjayA9IGNsdXN0ZXI7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlciB0aGUgZ2l2ZW4gY2hhbm5lbCB3aXRoIHRoZSBnaXZlbiBzZWxlY3RvciBmb3IKKyAgICAgKiB0aGUgZ2l2ZW4gb3BlcmF0aW9ucyBvZiBpbnRlcmVzdAorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyQ2hhbm5lbCAoU2VsZWN0b3Igc2VsZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3RhYmxlQ2hhbm5lbCBjaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBhdHRhY2gpCisgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChjaGFubmVsID09IG51bGwpIHJldHVybjsgLy8gY291bGQgaGFwcGVuCisgICAgICAgIC8vIHNldCB0aGUgbmV3IGNoYW5uZWwgbm9uLWJsb2NraW5nCisgICAgICAgIGNoYW5uZWwuY29uZmlndXJlQmxvY2tpbmcgKGZhbHNlKTsKKyAgICAgICAgLy8gcmVnaXN0ZXIgaXQgd2l0aCB0aGUgc2VsZWN0b3IKKyAgICAgICAgY2hhbm5lbC5yZWdpc3RlciAoc2VsZWN0b3IsIG9wcywgYXR0YWNoKTsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAvKioKKyAgICAgKiBTYW1wbGUgZGF0YSBoYW5kbGVyIG1ldGhvZCBmb3IgYSBjaGFubmVsIHdpdGggZGF0YSByZWFkeSB0byByZWFkLgorICAgICAqIEBwYXJhbSBrZXkgQSBTZWxlY3Rpb25LZXkgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCBhIGNoYW5uZWwKKyAgICAgKiAgZGV0ZXJtaW5lZCBieSB0aGUgc2VsZWN0b3IgdG8gYmUgcmVhZHkgZm9yIHJlYWRpbmcuICBJZiB0aGUKKyAgICAgKiAgY2hhbm5lbCByZXR1cm5zIGFuIEVPRiBjb25kaXRpb24sIGl0IGlzIGNsb3NlZCBoZXJlLCB3aGljaAorICAgICAqICBhdXRvbWF0aWNhbGx5IGludmFsaWRhdGVzIHRoZSBhc3NvY2lhdGVkIGtleS4gIFRoZSBzZWxlY3RvcgorICAgICAqICB3aWxsIHRoZW4gZGUtcmVnaXN0ZXIgdGhlIGNoYW5uZWwgb24gdGhlIG5leHQgc2VsZWN0IGNhbGwuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcmVhZERhdGFGcm9tU29ja2V0IChTZWxlY3Rpb25LZXkga2V5KQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBUY3BSZXBsaWNhdGlvblRocmVhZCB3b3JrZXIgPSAoVGNwUmVwbGljYXRpb25UaHJlYWQpcG9vbC5nZXRXb3JrZXIoKTsKKyAgICAgICAgaWYgKHdvcmtlciA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBObyB0aHJlYWRzIGF2YWlsYWJsZSwgZG8gbm90aGluZywgdGhlIHNlbGVjdGlvbgorICAgICAgICAgICAgLy8gbG9vcCB3aWxsIGtlZXAgY2FsbGluZyB0aGlzIG1ldGhvZCB1bnRpbCBhCisgICAgICAgICAgICAvLyB0aHJlYWQgYmVjb21lcyBhdmFpbGFibGUuICBUaGlzIGRlc2lnbiBjb3VsZAorICAgICAgICAgICAgLy8gYmUgaW1wcm92ZWQuCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBpbnZva2luZyB0aGlzIHdha2VzIHVwIHRoZSB3b3JrZXIgdGhyZWFkIHRoZW4gcmV0dXJucworICAgICAgICAgICAgd29ya2VyLnNlcnZpY2VDaGFubmVsKGtleSwgaXNTZW5kZXJTeW5jaHJvbml6ZWQpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGNwTGlzdGVuQWRkcmVzcygpIHsKKyAgICAgICAgcmV0dXJuIHRjcExpc3RlbkFkZHJlc3M7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHNldFRjcExpc3RlbkFkZHJlc3MoU3RyaW5nIHRjcExpc3RlbkFkZHJlc3MpIHsKKyAgICAgICAgdGhpcy50Y3BMaXN0ZW5BZGRyZXNzID0gdGNwTGlzdGVuQWRkcmVzczsKKyAgICB9CisgICAgcHVibGljIGludCBnZXRUY3BMaXN0ZW5Qb3J0KCkgeworICAgICAgICByZXR1cm4gdGNwTGlzdGVuUG9ydDsKKyAgICB9CisgICAgcHVibGljIHZvaWQgc2V0VGNwTGlzdGVuUG9ydChpbnQgdGNwTGlzdGVuUG9ydCkgeworICAgICAgICB0aGlzLnRjcExpc3RlblBvcnQgPSB0Y3BMaXN0ZW5Qb3J0OworICAgIH0KKyAgICBwdWJsaWMgbG9uZyBnZXRUY3BTZWxlY3RvclRpbWVvdXQoKSB7CisgICAgICAgIHJldHVybiB0Y3BTZWxlY3RvclRpbWVvdXQ7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHNldFRjcFNlbGVjdG9yVGltZW91dChsb25nIHRjcFNlbGVjdG9yVGltZW91dCkgeworICAgICAgICB0aGlzLnRjcFNlbGVjdG9yVGltZW91dCA9IHRjcFNlbGVjdG9yVGltZW91dDsKKyAgICB9CisgICAgcHVibGljIGludCBnZXRUY3BUaHJlYWRDb3VudCgpIHsKKyAgICAgICAgcmV0dXJuIHRjcFRocmVhZENvdW50OworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBzZXRUY3BUaHJlYWRDb3VudChpbnQgdGNwVGhyZWFkQ291bnQpIHsKKyAgICAgICAgdGhpcy50Y3BUaHJlYWRDb3VudCA9IHRjcFRocmVhZENvdW50OworICAgIH0KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRJc1NlbmRlclN5bmNocm9uaXplZCgpIHsKKyAgICAgICAgcmV0dXJuIGlzU2VuZGVyU3luY2hyb25pemVkOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBzZXRJc1NlbmRlclN5bmNocm9uaXplZChib29sZWFuIGlzU2VuZGVyU3luY2hyb25pemVkKSB7CisgICAgICAgIHRoaXMuaXNTZW5kZXJTeW5jaHJvbml6ZWQgPSBpc1NlbmRlclN5bmNocm9uaXplZDsKKyAgICB9CisgICAgCisgICAgcHVibGljIFN0cmluZyBnZXRIb3N0KCkgeworICAgICAgICByZXR1cm4gZ2V0VGNwTGlzdGVuQWRkcmVzcygpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0UG9ydCgpIHsKKyAgICAgICAgcmV0dXJuIGdldFRjcExpc3RlblBvcnQoKTsKKyAgICB9CisgICAgcHVibGljIE9iamVjdCBnZXRJbnRlcmVzdE9wc011dGV4KCkgeworICAgICAgICByZXR1cm4gaW50ZXJlc3RPcHNNdXRleDsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci90Y3AvUmVwbGljYXRpb25UcmFuc21pdHRlci5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3RjcC9SZXBsaWNhdGlvblRyYW5zbWl0dGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWIwZWE4ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci90Y3AvUmVwbGljYXRpb25UcmFuc21pdHRlci5qYXZhCkBAIC0wLDAgKzEsMTc5IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnRjcDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5pby5YQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuTWVtYmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5DbHVzdGVyU2VuZGVyOworCisgCitwdWJsaWMgY2xhc3MgUmVwbGljYXRpb25UcmFuc21pdHRlciBpbXBsZW1lbnRzIENsdXN0ZXJTZW5kZXIKK3sKKyAgICBwcml2YXRlIHN0YXRpYyBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2cgbG9nID0KKyAgICAgICAgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeS5nZXRMb2coIFJlcGxpY2F0aW9uVHJhbnNtaXR0ZXIuY2xhc3MgKTsKKworICAgIHByaXZhdGUgamF2YS51dGlsLkhhc2hNYXAgbWFwID0gbmV3IGphdmEudXRpbC5IYXNoTWFwKCk7CisgICAgcHVibGljIFJlcGxpY2F0aW9uVHJhbnNtaXR0ZXIoKQorICAgIHsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBsb25nIG5yT2ZSZXF1ZXN0cyA9IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgbG9uZyB0b3RhbEJ5dGVzID0gMDsKKyAgICBwcml2YXRlIFN0cmluZyByZXBsaWNhdGlvbk1vZGU7CisgICAgcHJpdmF0ZSBsb25nIGFja1RpbWVvdXQgPSAxNTAwMDsgLy8xNSBzZWNvbmRzIGJ5IGRlZmF1bHQKKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRTdGF0cyhpbnQgbGVuZ3RoKSB7CisgICAgICAgIG5yT2ZSZXF1ZXN0cysrOworICAgICAgICB0b3RhbEJ5dGVzKz1sZW5ndGg7CisgICAgICAgIGlmICggKG5yT2ZSZXF1ZXN0cyAlIDEwMCkgPT0gMCApIHsKKyAgICAgICAgICAgIGxvZy5pbmZvKCJOciBvZiBieXRlcyBzZW50PSIrdG90YWxCeXRlcysiIG92ZXIgIituck9mUmVxdWVzdHMrIiA9PSIrKHRvdGFsQnl0ZXMvbnJPZlJlcXVlc3RzKSsiIGJ5dGVzL3JlcXVlc3QiKTsKKyAgICAgICAgfQorCisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNldFJlcGxpY2F0aW9uTW9kZShTdHJpbmcgbW9kZSkgeworICAgICAgICBTdHJpbmcgbXNnID0gSURhdGFTZW5kZXJGYWN0b3J5LnZhbGlkYXRlTW9kZShtb2RlKTsKKyAgICAgICAgaWYgKG1zZyA9PSBudWxsKSB7CisgICAgICAgICAgICBsb2cuZGVidWcoIlNldHRpbmcgcmVwbGNhdGlvbiBtb2RlIHRvICIgKyBtb2RlKTsKKyAgICAgICAgICAgIHRoaXMucmVwbGljYXRpb25Nb2RlID0gbW9kZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKG1zZyk7CisKKyAgICB9CisKKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGQoTWVtYmVyIG1lbWJlcikKKyAgICB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBJRGF0YVNlbmRlciBzZW5kZXIgPSBJRGF0YVNlbmRlckZhY3RvcnkuZ2V0SURhdGFTZW5kZXIoCisgICAgICAgICAgICAgICAgcmVwbGljYXRpb25Nb2RlLCBtZW1iZXIpOworICAgICAgICAgICAgU3RyaW5nIGtleSA9IHNlbmRlci5nZXRBZGRyZXNzKCkuZ2V0SG9zdEFkZHJlc3MoKSArICI6IiArCisgICAgICAgICAgICAgICAgc2VuZGVyLmdldFBvcnQoKTsKKyAgICAgICAgICAgIGlmICghbWFwLmNvbnRhaW5zS2V5KGtleSkpCisgICAgICAgICAgICAgICAgbWFwLnB1dChzZW5kZXIuZ2V0QWRkcmVzcygpLmdldEhvc3RBZGRyZXNzKCkgKyAiOiIgKworICAgICAgICAgICAgICAgICAgICAgICAgc2VuZGVyLmdldFBvcnQoKSwgc2VuZGVyKTsKKyAgICAgICAgfWNhdGNoICggamF2YS5pby5JT0V4Y2VwdGlvbiB4ICkgeworICAgICAgICAgICAgbG9nLmVycm9yKCJVbmFibGUgdG8gY3JlYXRlIGFuZCBhZGQgYSBJRGF0YVNlbmRlciBvYmplY3QuIix4KTsKKyAgICAgICAgfQorICAgIH0vL2FkZAorCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZShNZW1iZXIgbWVtYmVyKQorICAgIHsKKyAgICAgICAgU3RyaW5nIGtleSA9IG1lbWJlci5nZXRIb3N0KCkgKyAiOiIgKyBtZW1iZXIuZ2V0UG9ydCgpOworICAgICAgICBJRGF0YVNlbmRlciB0b2JlcmVtb3ZlZCA9IChJRGF0YVNlbmRlcikgbWFwLmdldChrZXkpOworICAgICAgICBpZiAodG9iZXJlbW92ZWQgPT0gbnVsbClyZXR1cm47CisgICAgICAgIHRvYmVyZW1vdmVkLmRpc2Nvbm5lY3QoKTsKKyAgICAgICAgbWFwLnJlbW92ZShrZXkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIC8vZG9uJ3QgaGF2ZSB0byBkbyBzaGl0LCB3ZSBjb25uZWN0IG9uIGRlbWFuZAorICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdG9wKCkKKyAgICB7CisgICAgICAgIGphdmEudXRpbC5JdGVyYXRvciBpID0gbWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKCBpLmhhc05leHQoKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIElEYXRhU2VuZGVyIHNlbmRlciA9IChJRGF0YVNlbmRlcikoKGphdmEudXRpbC5NYXAuRW50cnkpaS5uZXh0KCkpLmdldFZhbHVlKCk7CisgICAgICAgICAgICB0cnkgeyBzZW5kZXIuZGlzY29ubmVjdCgpOyB9IGNhdGNoICggRXhjZXB0aW9uIHggKXt9CisgICAgICAgIH0vL3doaWxlCisgICAgfS8vc3RvcAorCisgICAgcHVibGljIElEYXRhU2VuZGVyW10gZ2V0U2VuZGVycygpCisgICAgeworICAgICAgICBqYXZhLnV0aWwuSXRlcmF0b3IgaSA9IG1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7CisgICAgICAgIGphdmEudXRpbC5WZWN0b3IgdiA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7CisgICAgICAgIHdoaWxlICggaS5oYXNOZXh0KCkgKQorICAgICAgICB7CisgICAgICAgICAgICBJRGF0YVNlbmRlciBzZW5kZXIgPSAoSURhdGFTZW5kZXIpKChqYXZhLnV0aWwuTWFwLkVudHJ5KWkubmV4dCgpKS5nZXRWYWx1ZSgpOworICAgICAgICAgICAgaWYgKCBzZW5kZXIhPW51bGwpIHYuYWRkRWxlbWVudChzZW5kZXIpOworICAgICAgICB9CisgICAgICAgIElEYXRhU2VuZGVyW10gcmVzdWx0ID0gbmV3IElEYXRhU2VuZGVyW3Yuc2l6ZSgpXTsKKyAgICAgICAgdi5jb3B5SW50byhyZXN1bHQpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHNlbmRNZXNzYWdlRGF0YShTdHJpbmcgc2Vzc2lvbklkLCBieXRlW10gZGF0YSwgSURhdGFTZW5kZXIgc2VuZGVyKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiAgeworICAgICAgICBpZiAoIHNlbmRlciA9PSBudWxsICkgdGhyb3cgbmV3IGphdmEuaW8uSU9FeGNlcHRpb24oIlNlbmRlciBub3QgYXZhaWxhYmxlLiBNYWtlIHN1cmUgc2VuZGVyIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSB0byB0aGUgUmVwbGljYXRpb25UcmFuc21pdHRlci4iKTsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghc2VuZGVyLmlzQ29ubmVjdGVkKCkpCisgICAgICAgICAgICAgICAgc2VuZGVyLmNvbm5lY3QoKTsKKyAgICAgICAgICAgIC8vc2V0IHRoZSB0aW1lb3V0LCB3aWxsIGJlIGlnbm9yZWQgYnkgYXN5bmMgc2VuZGVycworICAgICAgICAgICAgc2VuZGVyLnNldEFja1RpbWVvdXQoZ2V0QWNrVGltZW91dCgpKTsKKyAgICAgICAgICAgIHNlbmRlci5zZW5kTWVzc2FnZShzZXNzaW9uSWQsZGF0YSk7CisgICAgICAgICAgICBzZW5kZXIuc2V0U3VzcGVjdChmYWxzZSk7CisgICAgICAgICAgICBhZGRTdGF0cyhkYXRhLmxlbmd0aCk7CisgICAgICAgIH1jYXRjaCAoIEV4Y2VwdGlvbiB4KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoICFzZW5kZXIuZ2V0U3VzcGVjdCgpICkgeworICAgICAgICAgICAgICAgIGxvZy53YXJuKCJVbmFibGUgdG8gc2VuZCByZXBsaWNhdGVkIG1lc3NhZ2UsIGlzIHNlcnZlciBkb3duPyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgeCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZW5kZXIuc2V0U3VzcGVjdCh0cnVlKTsKKworICAgICAgICB9CisKKyAgICB9CisgICAgcHVibGljIHZvaWQgc2VuZE1lc3NhZ2UoU3RyaW5nIHNlc3Npb25JZCwgYnl0ZVtdIGluZGF0YSwgTWVtYmVyIG1lbWJlcikgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGJ5dGVbXSBkYXRhID0gWEJ5dGVCdWZmZXIuY3JlYXRlRGF0YVBhY2thZ2UoaW5kYXRhKTsKKyAgICAgICAgU3RyaW5nIGtleSA9IG1lbWJlci5nZXRIb3N0KCkrIjoiK21lbWJlci5nZXRQb3J0KCk7CisgICAgICAgIElEYXRhU2VuZGVyIHNlbmRlciA9IChJRGF0YVNlbmRlciltYXAuZ2V0KGtleSk7CisgICAgICAgIHNlbmRNZXNzYWdlRGF0YShzZXNzaW9uSWQsZGF0YSxzZW5kZXIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNlbmRNZXNzYWdlKFN0cmluZyBzZXNzaW9uSWQsIGJ5dGVbXSBpbmRhdGEpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCisgICAgeworICAgICAgICAgSURhdGFTZW5kZXJbXSBzZW5kZXJzID0gZ2V0U2VuZGVycygpOworICAgICAgICBieXRlW10gZGF0YSA9IFhCeXRlQnVmZmVyLmNyZWF0ZURhdGFQYWNrYWdlKGluZGF0YSk7CisgICAgICAgIGZvciAoIGludCBpPTA7IGk8c2VuZGVycy5sZW5ndGg7IGkrKyApCisgICAgICAgIHsKKworICAgICAgICAgICAgSURhdGFTZW5kZXIgc2VuZGVyID0gc2VuZGVyc1tpXTsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlRGF0YShzZXNzaW9uSWQsZGF0YSxzZW5kZXIpOworICAgICAgICAgICAgfWNhdGNoICggRXhjZXB0aW9uIHgpCisgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICBpZiAoICFzZW5kZXIuZ2V0U3VzcGVjdCgpKSBsb2cud2FybigiVW5hYmxlIHRvIHNlbmQgcmVwbGljYXRlZCBtZXNzYWdlIHRvICIrc2VuZGVyKyIsIGlzIHNlcnZlciBkb3duPyIseCk7CisgICAgICAgICAgICAgICAgc2VuZGVyLnNldFN1c3BlY3QodHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0vL3doaWxlCisgICAgfQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVwbGljYXRpb25Nb2RlKCkgeworICAgICAgICByZXR1cm4gcmVwbGljYXRpb25Nb2RlOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRJc1NlbmRlclN5bmNocm9uaXplZCgpIHsKKyAgICAgICAgcmV0dXJuIElEYXRhU2VuZGVyRmFjdG9yeS5TWU5DX01PREUuZXF1YWxzKHJlcGxpY2F0aW9uTW9kZSkgfHwKKyAgICAgICAgICAgIElEYXRhU2VuZGVyRmFjdG9yeS5QT09MRURfU1lOQ19NT0RFLmVxdWFscyhyZXBsaWNhdGlvbk1vZGUpOworICAgIH0KKyAgICBwdWJsaWMgbG9uZyBnZXRBY2tUaW1lb3V0KCkgeworICAgICAgICByZXR1cm4gYWNrVGltZW91dDsKKyAgICB9CisgICAgcHVibGljIHZvaWQgc2V0QWNrVGltZW91dChsb25nIGFja1RpbWVvdXQpIHsKKyAgICAgICAgdGhpcy5hY2tUaW1lb3V0ID0gYWNrVGltZW91dDsKKyAgICB9CisKKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvdGNwL1JlcGxpY2F0aW9uVmFsdmUuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci90Y3AvUmVwbGljYXRpb25WYWx2ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1OGIzMzUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvdGNwL1JlcGxpY2F0aW9uVmFsdmUuamF2YQpAQCAtMCwwICsxLDI0NSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci50Y3A7CisKKworCisKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLkNhdGFsaW5hQ2x1c3RlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuQ2x1c3Rlck1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLkNsdXN0ZXJNZXNzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5zZXNzaW9uLlNlc3Npb25NZXNzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29ubmVjdG9yLlJlcXVlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuUmVzcG9uc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLlN0cmluZ01hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS52YWx2ZXMuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudmFsdmVzLlZhbHZlQmFzZTsKKworLyoqCisgKiA8cD5JbXBsZW1lbnRhdGlvbiBvZiBhIFZhbHZlIHRoYXQgbG9ncyBpbnRlcmVzdGluZyBjb250ZW50cyBmcm9tIHRoZQorICogc3BlY2lmaWVkIFJlcXVlc3QgKGJlZm9yZSBwcm9jZXNzaW5nKSBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgUmVzcG9uc2UKKyAqIChhZnRlciBwcm9jZXNzaW5nKS4gIEl0IGlzIGVzcGVjaWFsbHkgdXNlZnVsIGluIGRlYnVnZ2luZyBwcm9ibGVtcworICogcmVsYXRlZCB0byBoZWFkZXJzIGFuZCBjb29raWVzLjwvcD4KKyAqCisgKiA8cD5UaGlzIFZhbHZlIG1heSBiZSBhdHRhY2hlZCB0byBhbnkgQ29udGFpbmVyLCBkZXBlbmRpbmcgb24gdGhlIGdyYW51bGFyaXR5CisgKiBvZiB0aGUgbG9nZ2luZyB5b3Ugd2lzaCB0byBwZXJmb3JtLjwvcD4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIFJlcGxpY2F0aW9uVmFsdmUKKyAgICBleHRlbmRzIFZhbHZlQmFzZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGxvZyA9CisgICAgICAgIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3RvcnkuZ2V0TG9nKCBSZXBsaWNhdGlvblZhbHZlLmNsYXNzICk7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gdGhpcyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgaW5mbyA9CisgICAgICAgICJvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIudGNwLlJlcGxpY2F0aW9uVmFsdmUvMS4wIjsKKworCisgICAgLyoqCisgICAgICogVGhlIFN0cmluZ01hbmFnZXIgZm9yIHRoaXMgcGFja2FnZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZ01hbmFnZXIgc20gPQorICAgICAgICBTdHJpbmdNYW5hZ2VyLmdldE1hbmFnZXIoQ29uc3RhbnRzLlBhY2thZ2UpOworCisgICAgLyoqCisgICAgICogaG9sZHMgZmlsZSBlbmRpbmdzIHRvIG5vdCBjYWxsIGZvciBsaWtlIGltYWdlcyBhbmQgb3RoZXJzCisgICAgICovCisgICAgcHJvdGVjdGVkIGphdmEudXRpbC5yZWdleC5QYXR0ZXJuW10gcmVxRmlsdGVycyA9IG5ldyBqYXZhLnV0aWwucmVnZXguUGF0dGVyblswXTsKKworICAgIHByb3RlY3RlZCBpbnQgZGVidWcgPSAwOworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisgICAgcHVibGljIFJlcGxpY2F0aW9uVmFsdmUoKSB7CisgICAgfQorICAgIC8qKgorICAgICAqIFJldHVybiBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIFZhbHZlIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5mbygpIHsKKworICAgICAgICByZXR1cm4gKGluZm8pOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGxvbmcgdG90YWxSZXF1ZXN0VGltZT0wOworICAgIHByb3RlY3RlZCBzdGF0aWMgbG9uZyB0b3RhbFNlbmRUaW1lPTA7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBsb25nIG5yT2ZSZXF1ZXN0cyA9MDsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGxvbmcgbGFzdFNlbmRUaW1lID0wOworICAgIAorICAgIHByb3RlY3RlZCBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgYWRkQ2x1c3RlclNlbmRUaW1lKGxvbmcgcmVxdWVzdFRpbWUsIGxvbmcgY2x1c3RlclRpbWUpIHsKKyAgICAgICAgdG90YWxTZW5kVGltZSs9Y2x1c3RlclRpbWU7CisgICAgICAgIHRvdGFsUmVxdWVzdFRpbWUrPXJlcXVlc3RUaW1lOworICAgICAgICBuck9mUmVxdWVzdHMrKzsKKyAgICAgICAgaWYgKCAobnJPZlJlcXVlc3RzICUgMTAwKSA9PSAwICkgeworICAgICAgICAgICAgbG9nLmluZm8oIkF2ZXJhZ2UgcmVxdWVzdCB0aW1lPSIrKHRvdGFsUmVxdWVzdFRpbWUvbnJPZlJlcXVlc3RzKSsiIG1zIGZvciAiKworICAgICAgICAgICAgICAgICAgICAgIkNsdXN0ZXIgb3ZlcmhlYWQgdGltZT0iKyh0b3RhbFNlbmRUaW1lL25yT2ZSZXF1ZXN0cykrIiBtcyBmb3IgIisKKyAgICAgICAgICAgICAgICAgICAgIG5yT2ZSZXF1ZXN0cysiIHJlcXVlc3RzIChSZXF1ZXN0PSIrdG90YWxSZXF1ZXN0VGltZSsibXMgQ2x1c3Rlcj0iK3RvdGFsU2VuZFRpbWUrIm1zKS4iKTsKKyAgICAgICAgICAgIGxhc3RTZW5kVGltZT1TeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgfS8vZW5kIGlmCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBMb2cgdGhlIGludGVyZXN0aW5nIHJlcXVlc3QgcGFyYW1ldGVycywgaW52b2tlIHRoZSBuZXh0IFZhbHZlIGluIHRoZQorICAgICAqIHNlcXVlbmNlLCBhbmQgbG9nIHRoZSBpbnRlcmVzdGluZyByZXNwb25zZSBwYXJhbWV0ZXJzLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB0byBiZSBwcm9jZXNzZWQKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIHNlcnZsZXQgcmVzcG9uc2UgdG8gYmUgY3JlYXRlZAorICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSB2YWx2ZSBjb250ZXh0IHVzZWQgdG8gaW52b2tlIHRoZSBuZXh0IHZhbHZlCisgICAgICogIGluIHRoZSBjdXJyZW50IHByb2Nlc3NpbmcgcGlwZWxpbmUKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgaW52b2tlKFJlcXVlc3QgcmVxdWVzdCwgUmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgbG9uZyB0b3RhbHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIC8vdGhpcyBoYXBwZW5zIGJlZm9yZSB0aGUgcmVxdWVzdAorICAgICAgICAvL2xvbmcgX2RlYnVnc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgZ2V0TmV4dCgpLmludm9rZShyZXF1ZXN0LCByZXNwb25zZSk7CisgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJbREVCVUddIFJlZ3VsYXIgaW52b2tlIHRvb2s9IisoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCktX2RlYnVnc3RhcnQpKyIgbXMuIik7CisgICAgICAgIC8vdGhpcyBoYXBwZW5zIGFmdGVyIHRoZSByZXF1ZXN0CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICBIdHRwU2Vzc2lvbiBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uKGZhbHNlKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKCEoIHJlcXVlc3QuZ2V0Q29udGV4dCgpLmdldE1hbmFnZXIoKSBpbnN0YW5jZW9mIENsdXN0ZXJNYW5hZ2VyKSApIHJldHVybjsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgQ2x1c3Rlck1hbmFnZXIgbWFuYWdlciA9IChDbHVzdGVyTWFuYWdlcilyZXF1ZXN0LmdldENvbnRleHQoKS5nZXRNYW5hZ2VyKCk7CisgICAgICAgICAgICBDYXRhbGluYUNsdXN0ZXIgY2x1c3RlciA9IChDYXRhbGluYUNsdXN0ZXIpZ2V0Q29udGFpbmVyKCkuZ2V0Q2x1c3RlcigpOworICAgICAgICAgICAgaWYgKCBjbHVzdGVyID09IG51bGwgKSB7CisgICAgICAgICAgICAgICAgbG9nLndhcm4oIk5vIGNsdXN0ZXIgY29uZmlndXJlZCBmb3IgdGhpcyByZXF1ZXN0LiIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vZmlyc3QgY2hlY2sgZm9yIHNlc3Npb24gaW52YWxpZGF0aW9ucworICAgICAgICAgICAgU3RyaW5nW10gaW52YWxpZElkcz1tYW5hZ2VyLmdldEludmFsaWRhdGVkU2Vzc2lvbnMoKTsKKyAgICAgICAgICAgIGlmICggaW52YWxpZElkcy5sZW5ndGggPiAwICkgeworICAgICAgICAgICAgICAgIGZvciAoIGludCBpPTA7aTxpbnZhbGlkSWRzLmxlbmd0aDsgaSsrICkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgQ2x1c3Rlck1lc3NhZ2UgaW1zZyA9IG1hbmFnZXIucmVxdWVzdENvbXBsZXRlZChpbnZhbGlkSWRzW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbXNnICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2x1c3Rlci5zZW5kKGltc2cpOworICAgICAgICAgICAgICAgICAgICB9Y2F0Y2ggKCBFeGNlcHRpb24geCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiVW5hYmxlIHRvIHNlbmQgc2Vzc2lvbiBpbnZhbGlkIG1lc3NhZ2Ugb3ZlciBjbHVzdGVyLiIseCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0cmluZyBpZCA9IG51bGw7CisgICAgICAgICAgICBpZiAoIHNlc3Npb24gIT0gbnVsbCApCisgICAgICAgICAgICAgICAgaWQgPSBzZXNzaW9uLmdldElkKCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICBpZiAoIGlkID09IG51bGwgKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgaWYgKCAocmVxdWVzdC5nZXRDb250ZXh0KCkuZ2V0TWFuYWdlcigpPT1udWxsKSB8fAorICAgICAgICAgICAgICAgICAoIShyZXF1ZXN0LmdldENvbnRleHQoKS5nZXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBDbHVzdGVyTWFuYWdlcikpKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworCisKKyAgICAgICAgICAgIFN0cmluZyB1cmkgPSByZXF1ZXN0LmdldERlY29kZWRSZXF1ZXN0VVJJKCk7CisgICAgICAgICAgICBib29sZWFuIGZpbHRlcmZvdW5kID0gZmFsc2U7CisKKyAgICAgICAgICAgIGZvciAoIGludCBpPTA7IChpPHJlcUZpbHRlcnMubGVuZ3RoKSAmJiAoIWZpbHRlcmZvdW5kKTsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBqYXZhLnV0aWwucmVnZXguTWF0Y2hlciBtYXRjaGVyID0gcmVxRmlsdGVyc1tpXS5tYXRjaGVyKHVyaSk7CisgICAgICAgICAgICAgICAgZmlsdGVyZm91bmQgPSBtYXRjaGVyLm1hdGNoZXMoKTsKKyAgICAgICAgICAgIH0vL2ZvcgorICAgICAgICAgICAgaWYgKCBmaWx0ZXJmb3VuZCApCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICBsb2cuZGVidWcoIkludm9raW5nIHJlcGxpY2F0aW9uIHJlcXVlc3Qgb24gIit1cmkpOworCisgICAgICAgICAgICAKKyAgICAgICAgICAgIENsdXN0ZXJNZXNzYWdlIG1zZyA9IG1hbmFnZXIucmVxdWVzdENvbXBsZXRlZChpZCk7CisKKyAgICAgICAgICAgIGlmICggbXNnID09IG51bGwgKSByZXR1cm47CisKKyAgICAgICAgICAgIGNsdXN0ZXIuc2VuZChtc2cpOworICAgICAgICAgICAgbG9uZyBzdG9wID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICBhZGRDbHVzdGVyU2VuZFRpbWUoc3RvcC10b3RhbHN0YXJ0LHN0b3Atc3RhcnQpOworCisgICAgICAgIH1jYXRjaCAoRXhjZXB0aW9uIHgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcigiVW5hYmxlIHRvIHBlcmZvcm0gcmVwbGljYXRpb24gcmVxdWVzdC4iLHgpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBTdHJpbmcgcmVuZGVyaW5nIG9mIHRoaXMgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiUmVwbGljYXRpb25WYWx2ZVsiKTsKKyAgICAgICAgaWYgKGNvbnRhaW5lciAhPSBudWxsKQorICAgICAgICAgICAgc2IuYXBwZW5kKGNvbnRhaW5lci5nZXROYW1lKCkpOworICAgICAgICBzYi5hcHBlbmQoIl0iKTsKKyAgICAgICAgcmV0dXJuIChzYi50b1N0cmluZygpKTsKKworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEZpbHRlcihTdHJpbmcgZmlsdGVyKQorICAgIHsKKyAgICAgICAgbG9nLmRlYnVnKCJMb2FkaW5nIHJlcXVlc3QgZmlsdGVycz0iK2ZpbHRlcik7CisgICAgICAgIGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXIgdCA9IG5ldyBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyKGZpbHRlciwiOyIpOworICAgICAgICB0aGlzLnJlcUZpbHRlcnMgPSBuZXcgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm5bdC5jb3VudFRva2VucygpXTsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICB3aGlsZSAoIHQuaGFzTW9yZVRva2VucygpICkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nIHMgPSB0Lm5leHRUb2tlbigpOworICAgICAgICAgICAgbG9nLmRlYnVnKCJSZXF1ZXN0IGZpbHRlcj0iK3MpOworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVxRmlsdGVyc1tpKytdID0gamF2YS51dGlsLnJlZ2V4LlBhdHRlcm4uY29tcGlsZShzKTsKKyAgICAgICAgICAgIH1jYXRjaCAoIEV4Y2VwdGlvbiB4ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIlVuYWJsZSB0byBjb21waWxlIGZpbHRlciAiK3MseCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREZWJ1ZyhpbnQgZGVidWcpCisgICAgeworICAgICAgICB0aGlzLmRlYnVnID0gZGVidWc7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3RlY3RlZCBNZXRob2RzCisKKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvdGNwL1NpbXBsZVRjcENsdXN0ZXIuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci90Y3AvU2ltcGxlVGNwQ2x1c3Rlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllM2U5ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvdGNwL1NpbXBsZVRjcENsdXN0ZXIuamF2YQpAQCAtMCwwICsxLDcyOCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci50Y3A7CisKK2ltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlU3VwcG9ydDsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Db250YWluZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVFdmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZUxpc3RlbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlZhbHZlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5DYXRhbGluYUNsdXN0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLkNsdXN0ZXJNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5DbHVzdGVyTWVzc2FnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5NZW1iZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLk1lbWJlcnNoaXBMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuTWVtYmVyc2hpcFNlcnZpY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLk1lc3NhZ2VMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuc2Vzc2lvbi5TZXNzaW9uTWVzc2FnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuaW8uTGlzdGVuQ2FsbGJhY2s7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnNlc3Npb24uUmVwbGljYXRpb25TdHJlYW07CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLkxpZmVjeWNsZVN1cHBvcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLlN0cmluZ01hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuSW50cm9zcGVjdGlvblV0aWxzOworLyoqCisgKiBBIDxiPkNsdXN0ZXI8L2I+IGltcGxlbWVudGF0aW9uIHVzaW5nIHNpbXBsZSBtdWx0aWNhc3QuCisgKiBSZXNwb25zaWJsZSBmb3Igc2V0dGluZworICogdXAgYSBjbHVzdGVyIGFuZCBwcm92aWRlcyBjYWxsZXJzIHdpdGggYSB2YWxpZCBtdWx0aWNhc3QgcmVjZWl2ZXIvc2VuZGVyLgorICoKKyAqIEBhdXRob3IgRmlsaXAgSGFuaWsKKyAqIEBhdXRob3IgUmVteSBNYXVjaGVyYXQKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQsICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBTaW1wbGVUY3BDbHVzdGVyIAorICAgIGltcGxlbWVudHMgQ2F0YWxpbmFDbHVzdGVyLCBMaWZlY3ljbGUsCisgICAgICAgICAgICAgICBNZW1iZXJzaGlwTGlzdGVuZXIsIExpc3RlbkNhbGxiYWNrLAorICAgICAgICAgICAgICAgTGlmZWN5Y2xlTGlzdGVuZXIgeworCisKKyAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZyBsb2cgPQorICAgICAgICBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5LmdldExvZyggU2ltcGxlVGNwQ2x1c3Rlci5jbGFzcyApOworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIERlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgY29tcG9uZW50IGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIGluZm8gPSAiU2ltcGxlVGNwQ2x1c3Rlci8xLjAiOworCisKKyAgICAvKioKKyAgICAgKiB0aGUgc2VydmljZSB0aGF0IHByb3ZpZGVzIHRoZSBtZW1iZXJzaGlwCisgICAgICovCisgICAgcHJvdGVjdGVkIE1lbWJlcnNoaXBTZXJ2aWNlIG1lbWJlcnNoaXBTZXJ2aWNlID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogV2hldGhlciB0byBleHBpcmUgc2Vzc2lvbnMgd2hlbiBzaHV0dGluZyBkb3duCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gZXhwaXJlU2Vzc2lvbnNPblNodXRkb3duID0gdHJ1ZTsKKyAgICAvKioKKyAgICAgKiBQcmludCBkZWJ1ZyB0byBzdGQub3V0PworICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIHByaW50VG9TY3JlZW4gPSBmYWxzZTsKKyAgICAvKioKKyAgICAgKiBSZXBsaWNhdGUgb25seSBzZXNzaW9ucyB0aGF0IGhhdmUgYmVlbiBtYXJrZWQgZGlydHkKKyAgICAgKiBmYWxzZT1yZXBsaWNhdGUgc2Vzc2lvbnMgYWZ0ZXIgZWFjaCByZXF1ZXN0CisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gdXNlRGlydHlGbGFnID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBOYW1lIGZvciBsb2dnaW5nIHB1cnBvc2UKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGNsdXN0ZXJJbXBOYW1lID0gIlNpbXBsZVRjcENsdXN0ZXIiOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc3RyaW5nIG1hbmFnZXIgZm9yIHRoaXMgcGFja2FnZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nTWFuYWdlciBzbSA9IFN0cmluZ01hbmFnZXIuZ2V0TWFuYWdlcihDb25zdGFudHMuUGFja2FnZSk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY2x1c3RlciBuYW1lIHRvIGpvaW4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGNsdXN0ZXJOYW1lID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIENvbnRhaW5lciBhc3NvY2lhdGVkIHdpdGggdGhpcyBDbHVzdGVyLgorICAgICAqLworICAgIHByb3RlY3RlZCBDb250YWluZXIgY29udGFpbmVyID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIGxpZmVjeWNsZSBldmVudCBzdXBwb3J0IGZvciB0aGlzIGNvbXBvbmVudC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTGlmZWN5Y2xlU3VwcG9ydCBsaWZlY3ljbGUgPSBuZXcgTGlmZWN5Y2xlU3VwcG9ydCh0aGlzKTsKKworCisgICAgLyoqCisgICAgICogSGFzIHRoaXMgY29tcG9uZW50IGJlZW4gc3RhcnRlZD8KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzdGFydGVkID0gZmFsc2U7CisKKworICAgIC8qKgorICAgICAqIFRoZSBwcm9wZXJ0eSBjaGFuZ2Ugc3VwcG9ydCBmb3IgdGhpcyBjb21wb25lbnQuCisgICAgICovCisgICAgcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlU3VwcG9ydCBzdXBwb3J0ID0gbmV3IFByb3BlcnR5Q2hhbmdlU3VwcG9ydCh0aGlzKTsKKworCisgICAgLyoqCisgICAgICogVGhlIGNvbnRleHQgbmFtZSA8LT4gbWFuYWdlciBhc3NvY2lhdGlvbiBmb3IgZGlzdHJpYnV0ZWQgY29udGV4dHMuCisgICAgICovCisgICAgcHJvdGVjdGVkIEhhc2hNYXAgbWFuYWdlcnMgPSBuZXcgSGFzaE1hcCgpOworCisgICAgLyoqCisgICAgICogU2VuZGluZyBTdGF0cworICAgICAqLworICAgIHByaXZhdGUgbG9uZyBuck9mTXNnc1JlY2VpdmVkID0gMDsKKyAgICBwcml2YXRlIGxvbmcgbXNnU2VuZFRpbWUgPSAwOworICAgIHByaXZhdGUgbG9uZyBsYXN0Q2hlY2tlZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIAorICAgIC8vc29ydCBtZW1iZXJzIGJ5IGFsaXZlIHRpbWUKKyAgICBwcm90ZWN0ZWQgTWVtYmVyQ29tcGFyYXRvciBtZW1iZXJDb21wYXJhdG9yID0gbmV3IE1lbWJlckNvbXBhcmF0b3IoKTsKKworICAgIHByaXZhdGUgU3RyaW5nIG1hbmFnZXJDbGFzc05hbWUgPSAib3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnNlc3Npb24uRGVsdGFNYW5hZ2VyIjsKKworICAgIC8qKgorICAgICAqIFNlbmRlciB0byBzZW5kIGRhdGEgd2l0aAorICAgICAqLworICAgIHByaXZhdGUgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLkNsdXN0ZXJTZW5kZXIgY2x1c3RlclNlbmRlcjsKKworICAgIC8qKgorICAgICAqIFJlY2VpdmVyIHRvIHJlZ2lzdGVyIGNhbGwgYmFjayB3aXRoCisgICAgICovCisgICAgcHJpdmF0ZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuQ2x1c3RlclJlY2VpdmVyIGNsdXN0ZXJSZWNlaXZlcjsKKyAgICBwcml2YXRlIG9yZy5hcGFjaGUuY2F0YWxpbmEuVmFsdmUgdmFsdmU7CisgICAgcHJpdmF0ZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuQ2x1c3RlckRlcGxveWVyIGNsdXN0ZXJEZXBsb3llcjsKKyAgICAKKyAgICAvKioKKyAgICAgKiBMaXN0ZW5lcnMgb2YgbWVzc2FnZXMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgVmVjdG9yIGNsdXN0ZXJMaXN0ZW5lcnMgPSBuZXcgVmVjdG9yKCk7CisgICAgCisgICAgLyoqCisgICAgICogQ3VycmVudGx5IG9ubHkgaW1wbGVtZW50ZWQgZm9yIHRoZSBkZWx0YSBtYW5hZ2VyCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIG5vdGlmeUxpc3RlbmVyc09uUmVwbGljYXRpb24gPSB0cnVlOworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKyAgICBwdWJsaWMgU2ltcGxlVGNwQ2x1c3RlcigpIHsKKyAgICB9CisgICAgLyoqCisgICAgICogUmV0dXJuIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgQ2x1c3RlciBpbXBsZW1lbnRhdGlvbiBhbmQKKyAgICAgKiB0aGUgY29ycmVzcG9uZGluZyB2ZXJzaW9uIG51bWJlciwgaW4gdGhlIGZvcm1hdAorICAgICAqIDxjb2RlPiZsdDtkZXNjcmlwdGlvbiZndDsvJmx0O3ZlcnNpb24mZ3Q7PC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEluZm8oKSB7CisgICAgICAgIHJldHVybihpbmZvKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbmFtZSBvZiB0aGUgY2x1c3RlciB0byBqb2luLCBpZiBubyBjbHVzdGVyIHdpdGgKKyAgICAgKiB0aGlzIG5hbWUgaXMgcHJlc2VudCBjcmVhdGUgb25lLgorICAgICAqCisgICAgICogQHBhcmFtIGNsdXN0ZXJOYW1lIFRoZSBjbHVzdGVybmFtZSB0byBqb2luCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2x1c3Rlck5hbWUoU3RyaW5nIGNsdXN0ZXJOYW1lKSB7CisgICAgICAgIHRoaXMuY2x1c3Rlck5hbWUgPSBjbHVzdGVyTmFtZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgY2x1c3RlciB0aGF0IHRoaXMgU2VydmVyIGlzIGN1cnJlbnRseQorICAgICAqIGNvbmZpZ3VyZWQgdG8gb3BlcmF0ZSB3aXRoaW4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBuYW1lIG9mIHRoZSBjbHVzdGVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNlcnZlcgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2x1c3Rlck5hbWUoKSB7CisgICAgICAgIHJldHVybiBjbHVzdGVyTmFtZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgQ29udGFpbmVyIGFzc29jaWF0ZWQgd2l0aCBvdXIgQ2x1c3RlcgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRhaW5lciBUaGUgQ29udGFpbmVyIHRvIHVzZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbnRhaW5lcihDb250YWluZXIgY29udGFpbmVyKSB7CisgICAgICAgIENvbnRhaW5lciBvbGRDb250YWluZXIgPSB0aGlzLmNvbnRhaW5lcjsKKyAgICAgICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7CisgICAgICAgIHN1cHBvcnQuZmlyZVByb3BlcnR5Q2hhbmdlKCJjb250YWluZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRDb250YWluZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbmVyKTsKKyAgICAgICAgLy90aGlzLmNvbnRhaW5lci4KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgQ29udGFpbmVyIGFzc29jaWF0ZWQgd2l0aCBvdXIgQ2x1c3RlcgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgQ29udGFpbmVyIGFzc29jaWF0ZWQgd2l0aCBvdXIgQ2x1c3RlcgorICAgICAqLworICAgIHB1YmxpYyBDb250YWluZXIgZ2V0Q29udGFpbmVyKCkgeworICAgICAgICByZXR1cm4odGhpcy5jb250YWluZXIpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgY29uZmlndXJhYmxlIHByb3RvY29sIHN0YWNrLiBUaGlzIGlzIGEgc2V0dGluZyBpbiBzZXJ2ZXIueG1sCisgICAgICogd2hlcmUgeW91IGNhbiBjb25maWd1cmUgeW91ciBwcm90b2NvbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm90b2NvbCB0aGUgcHJvdG9jb2wgc3RhY2sgLSB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkKKyAgICAgKiB0aGUgc2VydmVyIGNvbmZpZ3VyYXRpb24gYXQgc3RhcnR1cAorICAgICAqIEBzZWUgPGEgaHJlZj0id3d3LmphdmFncm91cHMuY29tIj5KYXZhR3JvdXBzPC9hPiBmb3IgZGV0YWlscworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByb3RvY29sKFN0cmluZyBwcm90b2NvbCkgeworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgcHJvdG9jb2wuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRQcm90b2NvbCgpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIE1lbWJlcltdIGdldE1lbWJlcnMoKSB7CisgICAgICAgIE1lbWJlcltdIG1lbWJlcnMgPSBtZW1iZXJzaGlwU2VydmljZS5nZXRNZW1iZXJzKCk7CisgICAgICAgIC8vc29ydCBieSBhbGl2ZSB0aW1lCisgICAgICAgIGphdmEudXRpbC5BcnJheXMuc29ydChtZW1iZXJzLG1lbWJlckNvbXBhcmF0b3IpOworICAgICAgICByZXR1cm4gbWVtYmVyczsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBtZW1iZXIgdGhhdCByZXByZXNlbnRzIHRoaXMgbm9kZS4KKyAgICAgKiBAcmV0dXJuIE1lbWJlcgorICAgICAqLworICAgIHB1YmxpYyBNZW1iZXIgZ2V0TG9jYWxNZW1iZXIoKSB7CisgICAgICAgIHJldHVybiBtZW1iZXJzaGlwU2VydmljZS5nZXRMb2NhbE1lbWJlcigpOworICAgIH0KKworICAgIAorCisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIE1hbmFnZXIgY3JlYXRlTWFuYWdlcihTdHJpbmcgbmFtZSkgeworICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBsb2cuZGVidWcoIkNyZWF0aW5nIENsdXN0ZXJNYW5hZ2VyIGZvciBjb250ZXh0ICIrbmFtZSArICIgdXNpbmcgY2xhc3MgIitnZXRNYW5hZ2VyQ2xhc3NOYW1lKCkpOworICAgICAgICBDbHVzdGVyTWFuYWdlciBtYW5hZ2VyID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1hbmFnZXIgPSAoQ2x1c3Rlck1hbmFnZXIpZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpLmxvYWRDbGFzcyhnZXRNYW5hZ2VyQ2xhc3NOYW1lKCkpLm5ld0luc3RhbmNlKCk7CisgICAgICAgIH0gY2F0Y2ggKCBFeGNlcHRpb24geCApIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcigiVW5hYmxlIHRvIGxvYWQgY2xhc3MgZm9yIHJlcGxpY2F0aW9uIG1hbmFnZXIiLHgpOworICAgICAgICAgICAgbWFuYWdlciA9IG5ldyBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuc2Vzc2lvbi5TaW1wbGVUY3BSZXBsaWNhdGlvbk1hbmFnZXIoKTsKKyAgICAgICAgfQorICAgICAgICBtYW5hZ2VyLnNldE5hbWUobmFtZSk7CisgICAgICAgIG1hbmFnZXIuc2V0Q2x1c3Rlcih0aGlzKTsKKyAgICAgICAgbWFuYWdlci5zZXREaXN0cmlidXRhYmxlKHRydWUpOworICAgICAgICBtYW5hZ2VyLnNldEV4cGlyZVNlc3Npb25zT25TaHV0ZG93bihleHBpcmVTZXNzaW9uc09uU2h1dGRvd24pOworICAgICAgICBtYW5hZ2VyLnNldFVzZURpcnR5RmxhZyh1c2VEaXJ0eUZsYWcpOworICAgICAgICBtYW5hZ2VyLnNldE5vdGlmeUxpc3RlbmVyc09uUmVwbGljYXRpb24obm90aWZ5TGlzdGVuZXJzT25SZXBsaWNhdGlvbik7CisgICAgICAgIG1hbmFnZXJzLnB1dChuYW1lLG1hbmFnZXIpOworICAgICAgICAKKyAgICAgICAgCisgICAgICAgIHJldHVybiBtYW5hZ2VyOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVNYW5hZ2VyKFN0cmluZyBuYW1lKSB7CisgICAgICAgIG1hbmFnZXJzLnJlbW92ZShuYW1lKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIE1hbmFnZXIgZ2V0TWFuYWdlcihTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gKE1hbmFnZXIpbWFuYWdlcnMuZ2V0KG5hbWUpOworICAgIH0KKyAgICAKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIExpZmVjeWNsZSBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIEFkZCBhIGxpZmVjeWNsZSBldmVudCBsaXN0ZW5lciB0byB0aGlzIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgdG8gYWRkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkTGlmZWN5Y2xlTGlzdGVuZXIoTGlmZWN5Y2xlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgbGlmZWN5Y2xlLmFkZExpZmVjeWNsZUxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbGlmZWN5Y2xlIGxpc3RlbmVycyBhc3NvY2lhdGVkIHdpdGggdGhpcyBsaWZlY3ljbGUuIElmIHRoaXMKKyAgICAgKiBMaWZlY3ljbGUgaGFzIG5vIGxpc3RlbmVycyByZWdpc3RlcmVkLCBhIHplcm8tbGVuZ3RoIGFycmF5IGlzIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBMaWZlY3ljbGVMaXN0ZW5lcltdIGZpbmRMaWZlY3ljbGVMaXN0ZW5lcnMoKSB7CisKKyAgICAgICAgcmV0dXJuIGxpZmVjeWNsZS5maW5kTGlmZWN5Y2xlTGlzdGVuZXJzKCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhIGxpZmVjeWNsZSBldmVudCBsaXN0ZW5lciBmcm9tIHRoaXMgY29tcG9uZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciB0byByZW1vdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVMaWZlY3ljbGVMaXN0ZW5lcihMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBsaWZlY3ljbGUucmVtb3ZlTGlmZWN5Y2xlTGlzdGVuZXIobGlzdGVuZXIpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUHJlcGFyZSBmb3IgdGhlIGJlZ2lubmluZyBvZiBhY3RpdmUgdXNlIG9mIHRoZSBwdWJsaWMgbWV0aG9kcyBvZiB0aGlzCisgICAgICogY29tcG9uZW50LiAgVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBhZnRlciA8Y29kZT5jb25maWd1cmUoKTwvY29kZT4sCisgICAgICogYW5kIGJlZm9yZSBhbnkgb2YgdGhlIHB1YmxpYyBtZXRob2RzIG9mIHRoZSBjb21wb25lbnQgYXJlIHV0aWxpemVkLjxCUj4KKyAgICAgKiBTdGFydHMgdGhlIGNsdXN0ZXIgY29tbXVuaWNhdGlvbiBjaGFubmVsLCB0aGlzIHdpbGwgY29ubmVjdCB3aXRoIHRoZQorICAgICAqIG90aGVyIG5vZGVzIGluIHRoZSBjbHVzdGVyLCBhbmQgcmVxdWVzdCB0aGUgY3VycmVudCBzZXNzaW9uIHN0YXRlIHRvCisgICAgICogYmUgdHJhbnNmZXJyZWQgdG8gdGhpcyBub2RlLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhpcyBjb21wb25lbnQgaGFzIGFscmVhZHkgYmVlbgorICAgICAqICBzdGFydGVkCisgICAgICogQGV4Y2VwdGlvbiBMaWZlY3ljbGVFeGNlcHRpb24gaWYgdGhpcyBjb21wb25lbnQgZGV0ZWN0cyBhIGZhdGFsIGVycm9yCisgICAgICogIHRoYXQgcHJldmVudHMgdGhpcyBjb21wb25lbnQgZnJvbSBiZWluZyB1c2VkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnQoKQorICAgICAgICB0aHJvd3MgTGlmZWN5Y2xlRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHN0YXJ0ZWQpCisgICAgICAgICAgICB0aHJvdyBuZXcgTGlmZWN5Y2xlRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygiY2x1c3Rlci5hbHJlYWR5U3RhcnRlZCIpKTsKKyAgICAgICAgbG9nLmluZm8oIkNsdXN0ZXIgaXMgYWJvdXQgdG8gc3RhcnQiKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiSW52b2tpbmcgYWRkVmFsdmUgb24gIitnZXRDb250YWluZXIoKSsgIiB3aXRoIGNsYXNzPSIrdmFsdmUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgSW50cm9zcGVjdGlvblV0aWxzLmNhbGxNZXRob2ROKGdldENvbnRhaW5lcigpLCAKKyAgICAgICAgICAgICAgICAiYWRkVmFsdmUiLCAKKyAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10gIHt2YWx2ZX0sIAorICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHtUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpLmxvYWRDbGFzcygib3JnLmFwYWNoZS5jYXRhbGluYS5WYWx2ZSIpfSk7CisgICAgICAgICAgICBjbHVzdGVyUmVjZWl2ZXIuc2V0SXNTZW5kZXJTeW5jaHJvbml6ZWQoY2x1c3RlclNlbmRlci5nZXRJc1NlbmRlclN5bmNocm9uaXplZCgpKTsKKyAgICAgICAgICAgIGNsdXN0ZXJSZWNlaXZlci5zZXRDYXRhbGluYUNsdXN0ZXIodGhpcyk7CisgICAgICAgICAgICBjbHVzdGVyUmVjZWl2ZXIuc3RhcnQoKTsKKyAgICAgICAgICAgIGNsdXN0ZXJTZW5kZXIuc3RhcnQoKTsKKyAgICAgICAgICAgIG1lbWJlcnNoaXBTZXJ2aWNlLnNldExvY2FsTWVtYmVyUHJvcGVydGllcyhjbHVzdGVyUmVjZWl2ZXIuZ2V0SG9zdCgpLGNsdXN0ZXJSZWNlaXZlci5nZXRQb3J0KCkpOworICAgICAgICAgICAgbWVtYmVyc2hpcFNlcnZpY2UuYWRkTWVtYmVyc2hpcExpc3RlbmVyKHRoaXMpOworICAgICAgICAgICAgbWVtYmVyc2hpcFNlcnZpY2Uuc3RhcnQoKTsKKyAgICAgICAgICAgIC8vc2V0IHRoZSBkZXBsb3llci4KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYgKCBjbHVzdGVyRGVwbG95ZXIgIT0gbnVsbCApIHsKKyAgICAgICAgICAgICAgICAgICAgY2x1c3RlckRlcGxveWVyLnNldENsdXN0ZXIodGhpcyk7CisgICAgICAgICAgICAgICAgICAgIE9iamVjdCBkZXBsb3llciA9IEludHJvc3BlY3Rpb25VdGlscy5nZXRQcm9wZXJ0eShnZXRDb250YWluZXIoKSwgImRlcGxveWVyIik7CisgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBjbHVzdGVyRGVwbG95ZXIuc2V0RGVwbG95ZXIoIChvcmcuYXBhY2hlLmNhdGFsaW5hLkRlcGxveWVyKSBkZXBsb3llcik7CisgICAgICAgICAgICAgICAgICAgIC8vIGNsdXN0ZXJEZXBsb3llci5zZXREZXBsb3llciggZGVwbG95ZXIpOworICAgICAgICAgICAgICAgICAgICBjbHVzdGVyRGVwbG95ZXIuc3RhcnQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgeCkgeworICAgICAgICAgICAgICAgIGxvZy5mYXRhbCgiVW5hYmxlIHRvIHJldHJpZXZlIHRoZSBjb250YWluZXIgZGVwbG95ZXIuIENsdXN0ZXIgZGVwbG95bWVudCBkaXNhYmxlZC4iLHgpOworICAgICAgICAgICAgfSAvL2NhdGNoCisgICAgICAgICAgICB0aGlzLnN0YXJ0ZWQgPSB0cnVlOworICAgICAgICB9IGNhdGNoICggRXhjZXB0aW9uIHggKSB7CisgICAgICAgICAgICBsb2cuZXJyb3IoIlVuYWJsZSB0byBzdGFydCBjbHVzdGVyLiIseCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgTGlmZWN5Y2xlRXhjZXB0aW9uKHgpOworICAgICAgICB9CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZW5kKENsdXN0ZXJNZXNzYWdlIG1zZywgTWVtYmVyIGRlc3QpIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIG1zZy5zZXRBZGRyZXNzKG1lbWJlcnNoaXBTZXJ2aWNlLmdldExvY2FsTWVtYmVyKCkpOworICAgICAgICAgICAgTWVtYmVyIGRlc3RpbmF0aW9uID0gZGVzdDsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKCBtc2cgaW5zdGFuY2VvZiBTZXNzaW9uTWVzc2FnZSApIHsKKyAgICAgICAgICAgICAgICBTZXNzaW9uTWVzc2FnZSBzbXNnID0gKFNlc3Npb25NZXNzYWdlKSBtc2c7CisgICAgICAgICAgICAgICAgLy9pZiB3ZSByZXF1ZXN0IHNlc3Npb24gc3RhdGUsIHNlbmQgdG8gdGhlIG9sZGVzdCBvZiBtZW1iZXJzCisgICAgICAgICAgICAgICAgaWYgKChkZXN0aW5hdGlvbiA9PSBudWxsKSAmJgorICAgICAgICAgICAgICAgICAgICAoc21zZy5nZXRFdmVudFR5cGUoKSA9PSBTZXNzaW9uTWVzc2FnZS5FVlRfR0VUX0FMTF9TRVNTSU9OUykgJiYKKyAgICAgICAgICAgICAgICAgICAgKG1lbWJlcnNoaXBTZXJ2aWNlLmdldE1lbWJlcnMoKS5sZW5ndGggPiAwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb24gPSBtZW1iZXJzaGlwU2VydmljZS5nZXRNZW1iZXJzKClbMF07CisgICAgICAgICAgICAgICAgfS8vZW5kIGlmCisgICAgICAgICAgICB9Ly9lbmQgaWYKKyAgICAgICAgICAgIG1zZy5zZXRUaW1lc3RhbXAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworICAgICAgICAgICAgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0cyA9IG5ldyBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICAgICAgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtKG91dHMpOworICAgICAgICAgICAgb3V0LndyaXRlT2JqZWN0KG1zZyk7CisgICAgICAgICAgICBieXRlW10gZGF0YSA9IG91dHMudG9CeXRlQXJyYXkoKTsKKyAgICAgICAgICAgIGlmKGRlc3RpbmF0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgIE1lbWJlciB0Y3BkZXN0ID0gZGVzdDsKKyAgICAgICAgICAgICAgICAgIGlmICggKHRjcGRlc3QgIT0gbnVsbCkgJiYgKCFtZW1iZXJzaGlwU2VydmljZS5nZXRMb2NhbE1lbWJlcigpLmVxdWFscyh0Y3BkZXN0KSkpICB7CisgICAgICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJTZW5kZXIuc2VuZE1lc3NhZ2UobXNnLmdldFVuaXF1ZUlkKCksIGRhdGEsIHRjcGRlc3QpOworICAgICAgICAgICAgICAgICAgfS8vZW5kIGlmCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBjbHVzdGVyU2VuZGVyLnNlbmRNZXNzYWdlKG1zZy5nZXRVbmlxdWVJZCgpLGRhdGEpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoICggRXhjZXB0aW9uIHggKSB7CisgICAgICAgICAgICBsb2cuZXJyb3IoIlVuYWJsZSB0byBzZW5kIG1lc3NhZ2UgdGhyb3VnaCBjbHVzdGVyIHNlbmRlci4iLHgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2VuZChDbHVzdGVyTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgc2VuZChtc2csbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR3JhY2VmdWxseSB0ZXJtaW5hdGUgdGhlIGFjdGl2ZSB1c2Ugb2YgdGhlIHB1YmxpYyBtZXRob2RzIG9mIHRoaXMKKyAgICAgKiBjb21wb25lbnQuICBUaGlzIG1ldGhvZCBzaG91bGQgYmUgdGhlIGxhc3Qgb25lIGNhbGxlZCBvbiBhIGdpdmVuCisgICAgICogaW5zdGFuY2Ugb2YgdGhpcyBjb21wb25lbnQuPEJSPgorICAgICAqIFRoaXMgd2lsbCBkaXNjb25uZWN0IHRoZSBjbHVzdGVyIGNvbW11bmljYXRpb24gY2hhbm5lbCBhbmQgc3RvcAorICAgICAqIHRoZSBsaXN0ZW5lciB0aHJlYWQuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGlzIGNvbXBvbmVudCBoYXMgbm90IGJlZW4gc3RhcnRlZAorICAgICAqIEBleGNlcHRpb24gTGlmZWN5Y2xlRXhjZXB0aW9uIGlmIHRoaXMgY29tcG9uZW50IGRldGVjdHMgYSBmYXRhbCBlcnJvcgorICAgICAqICB0aGF0IG5lZWRzIHRvIGJlIHJlcG9ydGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcCgpCisgICAgICAgIHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb24geworCisgICAgICAgIGlmICghc3RhcnRlZCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJjbHVzdGVyLm5vdFN0YXJ0ZWQiKSk7CisgICAgICAgIAorICAgICAgICBtZW1iZXJzaGlwU2VydmljZS5zdG9wKCk7CisgICAgICAgIG1lbWJlcnNoaXBTZXJ2aWNlLnJlbW92ZU1lbWJlcnNoaXBMaXN0ZW5lcigpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgY2x1c3RlclNlbmRlci5zdG9wKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiB4ICkgeworICAgICAgICAgICAgbG9nLmVycm9yKCJVbmFibGUgdG8gc3RvcCBjbHVzdGVyIHNlbmRlci4iLHgpOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjbHVzdGVyUmVjZWl2ZXIuc3RvcCgpOworICAgICAgICAgICAgY2x1c3RlclJlY2VpdmVyLnNldENhdGFsaW5hQ2x1c3RlcihudWxsKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIHggKSB7CisgICAgICAgICAgICBsb2cuZXJyb3IoIlVuYWJsZSB0byBzdG9wIGNsdXN0ZXIgcmVjZWl2ZXIuIix4KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIGNsdXN0ZXJEZXBsb3llciAhPSBudWxsICkgeworICAgICAgICAgICAgY2x1c3RlckRlcGxveWVyLnN0b3AoKTsKKyAgICAgICAgfQorICAgICAgICBzdGFydGVkID0gZmFsc2U7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBtZW1iZXJBZGRlZChNZW1iZXIgbWVtYmVyKSB7CisgICAgICAgIHRyeSAgeworICAgICAgICAgICAgbG9nLmluZm8oIlJlcGxpY2F0aW9uIG1lbWJlciBhZGRlZDoiICsgbWVtYmVyKTsKKyAgICAgICAgICAgIGNsdXN0ZXJTZW5kZXIuYWRkKG1lbWJlcik7CisgICAgICAgIH0gY2F0Y2ggKCBFeGNlcHRpb24geCApIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcigiVW5hYmxlIHRvIGNvbm5lY3QgdG8gcmVwbGljYXRpb24gc3lzdGVtLiIseCk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG1lbWJlckRpc2FwcGVhcmVkKE1lbWJlciBtZW1iZXIpCisgICAgeworICAgICAgICBsb2cuaW5mbygiUmVjZWl2ZWQgbWVtYmVyIGRpc2FwcGVhcmVkOiIrbWVtYmVyKTsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIGNsdXN0ZXJTZW5kZXIucmVtb3ZlKG1lbWJlcik7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKCBFeGNlcHRpb24geCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcigiVW5hYmxlIHJlbW92ZSBjbHVzdGVyIG5vZGUgZnJvbSByZXBsaWNhdGlvbiBzeXN0ZW0uIix4KTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgCisKKyAgICBwdWJsaWMgdm9pZCBzZXRFeHBpcmVTZXNzaW9uc09uU2h1dGRvd24oYm9vbGVhbiBleHBpcmVTZXNzaW9uc09uU2h1dGRvd24peworICAgICAgICB0aGlzLmV4cGlyZVNlc3Npb25zT25TaHV0ZG93biA9IGV4cGlyZVNlc3Npb25zT25TaHV0ZG93bjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQcmludFRvU2NyZWVuKGJvb2xlYW4gcHJpbnRUb1NjcmVlbikgeworICAgICAgICB0aGlzLnByaW50VG9TY3JlZW4gPSBwcmludFRvU2NyZWVuOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBzZXRVc2VEaXJ0eUZsYWcoYm9vbGVhbiB1c2VEaXJ0eUZsYWcpIHsKKyAgICAgICAgdGhpcy51c2VEaXJ0eUZsYWcgPSB1c2VEaXJ0eUZsYWc7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBtZXNzYWdlRGF0YVJlY2VpdmVkKGJ5dGVbXSBkYXRhKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBSZXBsaWNhdGlvblN0cmVhbSBzdHJlYW0gPQorICAgICAgICAgICAgICAgIG5ldyBSZXBsaWNhdGlvblN0cmVhbShuZXcgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbShkYXRhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKTsKKyAgICAgICAgICAgIE9iamVjdCBteW9iaiA9IHN0cmVhbS5yZWFkT2JqZWN0KCk7CisgICAgICAgICAgICBpZiAoIG15b2JqICE9IG51bGwgJiYgbXlvYmogaW5zdGFuY2VvZiBTZXNzaW9uTWVzc2FnZSApIHsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBTZXNzaW9uTWVzc2FnZSBtc2cgPSAoU2Vzc2lvbk1lc3NhZ2UpbXlvYmo7CisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJBc3N1bWluZyBjbG9ja3MgYXJlIHN5bmNoZWQ6IFJlcGxpY2F0aW9uIHRvb2s9IisoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCktbXNnLmdldFRpbWVzdGFtcCgpKSsiIG1zLiIpOworICAgICAgICAgICAgICAgIFN0cmluZyBjdHhuYW1lID0gbXNnLmdldENvbnRleHROYW1lKCk7CisgICAgICAgICAgICAgICAgLy9jaGVjayBpZiB0aGUgbWVzc2FnZSBpcyBhIEVWVF9HRVRfQUxMX1NFU1NJT05TLAorICAgICAgICAgICAgICAgIC8vaWYgc28sIHdhaXQgdW50aWwgd2UgYXJlIGZ1bGx5IHN0YXJ0ZWQgdXAKKyAgICAgICAgICAgICAgICBpZiAoIGN0eG5hbWUgPT0gbnVsbCApIHsKKyAgICAgICAgICAgICAgICAgICAgamF2YS51dGlsLkl0ZXJhdG9yIGkgPSBtYW5hZ2Vycy5rZXlTZXQoKS5pdGVyYXRvcigpOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIGkuaGFzTmV4dCgpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpaS5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBDbHVzdGVyTWFuYWdlciBtZ3IgPSAoQ2x1c3Rlck1hbmFnZXIpIG1hbmFnZXJzLmdldChrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1nciAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1nci5tZXNzYWdlRGF0YVJlY2VpdmVkKG1zZyk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3RoaXMgaGFwcGVucyBhIGxvdCBiZWZvcmUgdGhlIHN5c3RlbSBoYXMgc3RhcnRlZCB1cAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ29udGV4dCBtYW5hZ2VyIGRvZXNuJ3QgZXhpc3Q6IiArIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0vL3doaWxlCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQ2x1c3Rlck1hbmFnZXIgbWdyID0gKENsdXN0ZXJNYW5hZ2VyKSBtYW5hZ2Vycy5nZXQoY3R4bmFtZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtZ3IgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG1nci5tZXNzYWdlRGF0YVJlY2VpdmVkKG1zZyk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKCJDb250ZXh0IG1hbmFnZXIgZG9lc24ndCBleGlzdDoiICsgY3R4bmFtZSk7CisgICAgICAgICAgICAgICAgfS8vZW5kIGlmCisgICAgICAgICAgICB9ICBlbHNlIHsKKyAgICAgICAgICAgICAgICAvL2ludm9rZSBhbGwgdGhlIGxpc3RlbmVycworICAgICAgICAgICAgICAgIGZvciAoIGludCBpPTA7IGk8Y2x1c3Rlckxpc3RlbmVycy5zaXplKCk7IGkrKyApIHsKKyAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUxpc3RlbmVyIGxpc3RlbmVyID0gKE1lc3NhZ2VMaXN0ZW5lciljbHVzdGVyTGlzdGVuZXJzLmVsZW1lbnRBdChpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBteW9iaiE9bnVsbCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIG15b2JqIGluc3RhbmNlb2YgQ2x1c3Rlck1lc3NhZ2UgJiYgCisgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIuYWNjZXB0KChDbHVzdGVyTWVzc2FnZSlteW9iaikgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5tZXNzYWdlUmVjZWl2ZWQoKENsdXN0ZXJNZXNzYWdlKW15b2JqKTsKKyAgICAgICAgICAgICAgICAgICAgfS8vZW5kIGlmCisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIH0vL2ZvcgorICAgICAgICAgICAgfS8vZW5kIGlmCisgICAgICAgICAgICAgICAgCisgICAgICAgIH0gY2F0Y2ggKCBFeGNlcHRpb24geCApIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcigiVW5hYmxlIHRvIGRlc2VyaWFsaXplIHNlc3Npb24gbWVzc2FnZS4iLHgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbGlmZWN5Y2xlRXZlbnQoTGlmZWN5Y2xlRXZlbnQgbGlmZWN5Y2xlRXZlbnQpeworICAgICAgICBsb2cuZGVidWcoIlxubGlmZWN5Y2xlRXZlbnRcblxuVHlwZSIrbGlmZWN5Y2xlRXZlbnQuZ2V0VHlwZSgpKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuRGF0YSIrbGlmZWN5Y2xlRXZlbnQuZ2V0RGF0YSgpKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuXG5cbiIpOworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDbHVzdGVyIFdpZGUgRGVwbG95bWVudHMKKyAgICAvKioKKyAgICAgKiBTdGFydCBhbiBleGlzdGluZyB3ZWIgYXBwbGljYXRpb24sIGF0dGFjaGVkIHRvIHRoZSBzcGVjaWZpZWQgY29udGV4dAorICAgICAqIHBhdGggaW4gYWxsIHRoZSBvdGhlciBub2RlcyBpbiB0aGUgY2x1c3Rlci4KKyAgICAgKiBPbmx5IHN0YXJ0cyBhIHdlYiBhcHBsaWNhdGlvbiBpZiBpdCBpcyBub3QgcnVubmluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0UGF0aCBUaGUgY29udGV4dCBwYXRoIG9mIHRoZSBhcHBsaWNhdGlvbiB0byBiZSBzdGFydGVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgc3BlY2lmaWVkIGNvbnRleHQgcGF0aAorICAgICAqICBpcyBtYWxmb3JtZWQgKGl0IG11c3QgYmUgIiIgb3Igc3RhcnQgd2l0aCBhIHNsYXNoKQorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBzcGVjaWZpZWQgY29udGV4dCBwYXRoIGRvZXMKKyAgICAgKiAgbm90IGlkZW50aWZ5IGEgY3VycmVudGx5IGluc3RhbGxlZCB3ZWIgYXBwbGljYXRpb24KKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMgZHVyaW5nCisgICAgICogIHN0YXJ0dXAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydENvbnRleHQoU3RyaW5nIGNvbnRleHRQYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm47CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBJbnN0YWxsIGEgbmV3IHdlYiBhcHBsaWNhdGlvbiwgd2hvc2Ugd2ViIGFwcGxpY2F0aW9uIGFyY2hpdmUgaXMgYXQgdGhlCisgICAgICogc3BlY2lmaWVkIFVSTCwgaW50byB0aGlzIGNvbnRhaW5lciB3aXRoIHRoZSBzcGVjaWZpZWQgY29udGV4dCBwYXRoLgorICAgICAqIEEgY29udGV4dCBwYXRoIG9mICIiICh0aGUgZW1wdHkgc3RyaW5nKSBzaG91bGQgYmUgdXNlZCBmb3IgdGhlIHJvb3QKKyAgICAgKiBhcHBsaWNhdGlvbiBmb3IgdGhpcyBjb250YWluZXIuICBPdGhlcndpc2UsIHRoZSBjb250ZXh0IHBhdGggbXVzdAorICAgICAqIHN0YXJ0IHdpdGggYSBzbGFzaC4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiB0aGlzIGFwcGxpY2F0aW9uIGlzIHN1Y2Nlc3NmdWxseSBpbnN0YWxsZWQsIGEgQ29udGFpbmVyRXZlbnQgb2YgdHlwZQorICAgICAqIDxjb2RlPlBSRV9JTlNUQUxMX0VWRU5UPC9jb2RlPiB3aWxsIGJlIHNlbnQgdG8gcmVnaXN0ZXJlZCBsaXN0ZW5lcnMKKyAgICAgKiBiZWZvcmUgdGhlIGFzc29jaWF0ZWQgQ29udGV4dCBpcyBzdGFydGVkLCBhbmQgYSBDb250YWluZXJFdmVudCBvZiB0eXBlCisgICAgICogPGNvZGU+SU5TVEFMTF9FVkVOVDwvY29kZT4gd2lsbCBiZSBzZW50IHRvIGFsbCByZWdpc3RlcmVkIGxpc3RlbmVycworICAgICAqIGFmdGVyIHRoZSBhc3NvY2lhdGVkIENvbnRleHQgaXMgc3RhcnRlZCwgd2l0aCB0aGUgbmV3bHkgY3JlYXRlZAorICAgICAqIDxjb2RlPkNvbnRleHQ8L2NvZGU+IGFzIGFuIGFyZ3VtZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHRQYXRoIFRoZSBjb250ZXh0IHBhdGggdG8gd2hpY2ggdGhpcyBhcHBsaWNhdGlvbiBzaG91bGQKKyAgICAgKiAgYmUgaW5zdGFsbGVkIChtdXN0IGJlIHVuaXF1ZSkKKyAgICAgKiBAcGFyYW0gd2FyIEEgVVJMIG9mIHR5cGUgImphcjoiIHRoYXQgcG9pbnRzIHRvIGEgV0FSIGZpbGUsIG9yIHR5cGUKKyAgICAgKiAgImZpbGU6IiB0aGF0IHBvaW50cyB0byBhbiB1bnBhY2tlZCBkaXJlY3Rvcnkgc3RydWN0dXJlIGNvbnRhaW5pbmcKKyAgICAgKiAgdGhlIHdlYiBhcHBsaWNhdGlvbiB0byBiZSBpbnN0YWxsZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBzcGVjaWZpZWQgY29udGV4dCBwYXRoCisgICAgICogIGlzIG1hbGZvcm1lZCAoaXQgbXVzdCBiZSAiIiBvciBzdGFydCB3aXRoIGEgc2xhc2gpCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlIHNwZWNpZmllZCBjb250ZXh0IHBhdGgKKyAgICAgKiAgaXMgYWxyZWFkeSBhdHRhY2hlZCB0byBhbiBleGlzdGluZyB3ZWIgYXBwbGljYXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbnN0YWxsQ29udGV4dChTdHJpbmcgY29udGV4dFBhdGgsIFVSTCB3YXIpIHsKKyAgICAgICAgbG9nLmRlYnVnKCJcblxuXG5cbkNsdXN0ZXIgSW5zdGFsbCBjYWxsZWQgZm9yIGNvbnRleHQ6Iitjb250ZXh0UGF0aCsiXG5cblxuXG4iKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFN0b3AgYW4gZXhpc3Rpbmcgd2ViIGFwcGxpY2F0aW9uLCBhdHRhY2hlZCB0byB0aGUgc3BlY2lmaWVkIGNvbnRleHQKKyAgICAgKiBwYXRoLiAgT25seSBzdG9wcyBhIHdlYiBhcHBsaWNhdGlvbiBpZiBpdCBpcyBydW5uaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHRQYXRoIFRoZSBjb250ZXh0IHBhdGggb2YgdGhlIGFwcGxpY2F0aW9uIHRvIGJlIHN0b3BwZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBzcGVjaWZpZWQgY29udGV4dCBwYXRoCisgICAgICogIGlzIG1hbGZvcm1lZCAoaXQgbXVzdCBiZSAiIiBvciBzdGFydCB3aXRoIGEgc2xhc2gpCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHNwZWNpZmllZCBjb250ZXh0IHBhdGggZG9lcworICAgICAqICBub3QgaWRlbnRpZnkgYSBjdXJyZW50bHkgaW5zdGFsbGVkIHdlYiBhcHBsaWNhdGlvbgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycyB3aGlsZSBzdG9wcGluZworICAgICAqICB0aGUgd2ViIGFwcGxpY2F0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcChTdHJpbmcgY29udGV4dFBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBwdWJsaWMgTG9nIGdldExvZ2dlcigpIHsKKyAgICAgICAgcmV0dXJuIGxvZzsKKyAgICB9CisKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBJbm5lciBDbGFzcworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBQZXJmb3JtYW5jZQorCisgICAgcHJpdmF0ZSB2b2lkIHBlcmZNZXNzYWdlUmVjdmQobG9uZyB0aW1lU2VudCkgeworICAgICAgICBuck9mTXNnc1JlY2VpdmVkKys7CisgICAgICAgIG1zZ1NlbmRUaW1lKz0oU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCktdGltZVNlbnQpOworICAgICAgICBpZiAoIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIGxhc3RDaGVja2VkKSA+IDUwMDAgKSB7CisgICAgICAgICAgICBsb2cuZGVidWcoIkNhbGMgbXNnIHNlbmQgdGltZSB0b3RhbD0iK21zZ1NlbmRUaW1lKyJtcyBudW0gcmVxdWVzdD0iK25yT2ZNc2dzUmVjZWl2ZWQrIiBhdmVyYWdlIHBlciBtc2c9IisobXNnU2VuZFRpbWUvbnJPZk1zZ3NSZWNlaXZlZCkrIm1zLiIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRNYW5hZ2VyQ2xhc3NOYW1lKCkgeworICAgICAgICByZXR1cm4gbWFuYWdlckNsYXNzTmFtZTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgc2V0TWFuYWdlckNsYXNzTmFtZShTdHJpbmcgbWFuYWdlckNsYXNzTmFtZSkgeworICAgICAgICB0aGlzLm1hbmFnZXJDbGFzc05hbWUgPSBtYW5hZ2VyQ2xhc3NOYW1lOworICAgIH0KKyAgICBwdWJsaWMgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLkNsdXN0ZXJTZW5kZXIgZ2V0Q2x1c3RlclNlbmRlcigpIHsKKyAgICAgICAgcmV0dXJuIGNsdXN0ZXJTZW5kZXI7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHNldENsdXN0ZXJTZW5kZXIob3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLkNsdXN0ZXJTZW5kZXIgY2x1c3RlclNlbmRlcikgeworICAgICAgICB0aGlzLmNsdXN0ZXJTZW5kZXIgPSBjbHVzdGVyU2VuZGVyOworICAgIH0KKyAgICBwdWJsaWMgb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLkNsdXN0ZXJSZWNlaXZlciBnZXRDbHVzdGVyUmVjZWl2ZXIoKSB7CisgICAgICAgIHJldHVybiBjbHVzdGVyUmVjZWl2ZXI7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHNldENsdXN0ZXJSZWNlaXZlcihvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuQ2x1c3RlclJlY2VpdmVyIGNsdXN0ZXJSZWNlaXZlcikgeworICAgICAgICB0aGlzLmNsdXN0ZXJSZWNlaXZlciA9IGNsdXN0ZXJSZWNlaXZlcjsKKyAgICB9CisgICAgcHVibGljIE1lbWJlcnNoaXBTZXJ2aWNlIGdldE1lbWJlcnNoaXBTZXJ2aWNlKCkgeworICAgICAgICByZXR1cm4gbWVtYmVyc2hpcFNlcnZpY2U7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHNldE1lbWJlcnNoaXBTZXJ2aWNlKE1lbWJlcnNoaXBTZXJ2aWNlIG1lbWJlcnNoaXBTZXJ2aWNlKSB7CisgICAgICAgIHRoaXMubWVtYmVyc2hpcFNlcnZpY2UgPSBtZW1iZXJzaGlwU2VydmljZTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgYWRkVmFsdmUoVmFsdmUgdmFsdmUpIHsKKyAgICAgICAgdGhpcy52YWx2ZSA9IHZhbHZlOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBhZGRDbHVzdGVyTGlzdGVuZXIoTWVzc2FnZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIGlmICggIWNsdXN0ZXJMaXN0ZW5lcnMuY29udGFpbnMobGlzdGVuZXIpICkgeworICAgICAgICAgICAgY2x1c3Rlckxpc3RlbmVycy5hZGRFbGVtZW50KGxpc3RlbmVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUNsdXN0ZXJMaXN0ZW5lcihNZXNzYWdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgY2x1c3Rlckxpc3RlbmVycy5yZW1vdmVFbGVtZW50KGxpc3RlbmVyKTsKKyAgICB9CisgICAgcHVibGljIG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci5DbHVzdGVyRGVwbG95ZXIgZ2V0Q2x1c3RlckRlcGxveWVyKCkgeworICAgICAgICByZXR1cm4gY2x1c3RlckRlcGxveWVyOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBzZXRDbHVzdGVyRGVwbG95ZXIob3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLkNsdXN0ZXJEZXBsb3llciBjbHVzdGVyRGVwbG95ZXIpIHsKKyAgICAgICAgdGhpcy5jbHVzdGVyRGVwbG95ZXIgPSBjbHVzdGVyRGVwbG95ZXI7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIGdldE5vdGlmeUxpc3RlbmVyc09uUmVwbGljYXRpb24oKSB7CisgICAgICAgIHJldHVybiBub3RpZnlMaXN0ZW5lcnNPblJlcGxpY2F0aW9uOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXROb3RpZnlMaXN0ZW5lcnNPblJlcGxpY2F0aW9uKGJvb2xlYW4gbm90aWZ5TGlzdGVuZXJzT25SZXBsaWNhdGlvbikgeworICAgICAgICB0aGlzLm5vdGlmeUxpc3RlbmVyc09uUmVwbGljYXRpb24gPSBub3RpZnlMaXN0ZW5lcnNPblJlcGxpY2F0aW9uOworICAgIH0KKyAgICAKKyAKKworICAgIAorICAgIAorICAgIHByaXZhdGUgY2xhc3MgTWVtYmVyQ29tcGFyYXRvciBpbXBsZW1lbnRzIGphdmEudXRpbC5Db21wYXJhdG9yIHsKKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgeyAKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBhcmUoKE1lbWJlcilvMSwoTWVtYmVyKW8yKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiB4KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShNZW1iZXIgbTEsIE1lbWJlciBtMikgeworICAgICAgICAgICAgLy9sb25nZXIgYWxpdmUgdGltZSwgbWVhbnMgc29ydCBmaXJzdAorICAgICAgICAgICAgbG9uZyByZXN1bHQgPSBtMi5nZXRNZW1iZXJBbGl2ZVRpbWUoKSAtIG0xLmdldE1lbWJlckFsaXZlVGltZSgpOworICAgICAgICAgICAgaWYgKCByZXN1bHQgPCAwICkgcmV0dXJuIC0xOworICAgICAgICAgICAgZWxzZSBpZiAoIHJlc3VsdCA9PSAwICkgcmV0dXJuIDA7CisgICAgICAgICAgICBlbHNlIHJldHVybiAxOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIAorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvdGNwL1NvY2tldFNlbmRlci5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3RjcC9Tb2NrZXRTZW5kZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTVjMDExCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3RjcC9Tb2NrZXRTZW5kZXIuamF2YQpAQCAtMCwwICsxLDE3NSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY2x1c3Rlci50Y3A7CitpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3MgOworaW1wb3J0IGphdmEubmV0LlNvY2tldDsKKworLyoqCisgKiA8cD5UaXRsZTogPC9wPgorICogPHA+RGVzY3JpcHRpb246IDwvcD4KKyAqIDxwPkNvcHlyaWdodDogQ29weXJpZ2h0IChjKSAyMDAyPC9wPgorICogPHA+Q29tcGFueTogPC9wPgorICogQGF1dGhvciBub3QgYXR0cmlidXRhYmxlCisgKiBAdmVyc2lvbiAxLjAKKyAqLworCitwdWJsaWMgY2xhc3MgU29ja2V0U2VuZGVyIGltcGxlbWVudHMgSURhdGFTZW5kZXIKK3sKKworICAgIHByaXZhdGUgc3RhdGljIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZyBsb2cgPQorICAgICAgICBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5LmdldExvZyggU29ja2V0U2VuZGVyLmNsYXNzICk7CisKKyAgICBwcml2YXRlIEluZXRBZGRyZXNzIGFkZHJlc3M7CisgICAgcHJpdmF0ZSBpbnQgcG9ydDsKKyAgICBwcml2YXRlIFNvY2tldCBzYyA9IG51bGw7CisgICAgcHJpdmF0ZSBib29sZWFuIGlzU29ja2V0Q29ubmVjdGVkID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIHN1c3BlY3Q7CisgICAgcHJpdmF0ZSBsb25nIGFja1RpbWVvdXQgPSAxNSoxMDAwOyAgLy8xNSBzZWNvbmRzIHNvY2tldCByZWFkIHRpbWVvdXQgKGZvciBhY2tub3dsZWRnZW1lbnQpCisgICAgcHJpdmF0ZSBsb25nIGtlZXBBbGl2ZVRpbWVvdXQgPSA2MCoxMDAwOyAvL2tlZXAgc29ja2V0IG9wZW4gZm9yIG5vIG1vcmUgdGhhbiBvbmUgbWluCisgICAgcHJpdmF0ZSBpbnQga2VlcEFsaXZlTWF4UmVxdWVzdENvdW50ID0gMTAwOyAvL21heCAxMDAgcmVxdWVzdHMgYmVmb3JlIHJlY29ubmVjdGluZworICAgIHByaXZhdGUgbG9uZyBrZWVwQWxpdmVDb25uZWN0VGltZSA9IDA7CisgICAgcHJpdmF0ZSBpbnQga2VlcEFsaXZlQ291bnQgPSAwOworCisKKyAgICBwdWJsaWMgU29ja2V0U2VuZGVyKEluZXRBZGRyZXNzIGhvc3QsIGludCBwb3J0KQorICAgIHsKKyAgICAgICAgdGhpcy5hZGRyZXNzID0gaG9zdDsKKyAgICAgICAgdGhpcy5wb3J0ID0gcG9ydDsKKyAgICB9CisKKyAgICBwdWJsaWMgSW5ldEFkZHJlc3MgZ2V0QWRkcmVzcygpCisgICAgeworICAgICAgICByZXR1cm4gYWRkcmVzczsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFBvcnQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHBvcnQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY29ubmVjdCgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCisgICAgeworICAgICAgICBzYyA9IG5ldyBTb2NrZXQoZ2V0QWRkcmVzcygpLGdldFBvcnQoKSk7CisgICAgICAgIHNjLnNldFNvVGltZW91dCgoaW50KWFja1RpbWVvdXQpOworICAgICAgICBpc1NvY2tldENvbm5lY3RlZCA9IHRydWU7CisgICAgICAgIHRoaXMua2VlcEFsaXZlQ291bnQgPSAwOworICAgICAgICB0aGlzLmtlZXBBbGl2ZUNvbm5lY3RUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZGlzY29ubmVjdCgpCisgICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgc2MuY2xvc2UoKTsKKyAgICAgICAgfWNhdGNoICggRXhjZXB0aW9uIHgpCisgICAgICAgIHt9CisgICAgICAgIGlzU29ja2V0Q29ubmVjdGVkID0gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNDb25uZWN0ZWQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGlzU29ja2V0Q29ubmVjdGVkOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNoZWNrSWZEaXNjb25uZWN0KCkgeworICAgICAgICBsb25nIGN0aW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aGlzLmtlZXBBbGl2ZUNvbm5lY3RUaW1lOworICAgICAgICBpZiAoIChjdGltZSA+IHRoaXMua2VlcEFsaXZlVGltZW91dCkgfHwKKyAgICAgICAgICAgICAodGhpcy5rZWVwQWxpdmVDb3VudCA+PSB0aGlzLmtlZXBBbGl2ZU1heFJlcXVlc3RDb3VudCkgKSB7CisgICAgICAgICAgICBkaXNjb25uZWN0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBY2tUaW1lb3V0KGxvbmcgdGltZW91dCkgeworICAgICAgICB0aGlzLmFja1RpbWVvdXQgPSB0aW1lb3V0OworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGdldEFja1RpbWVvdXQoKSB7CisgICAgICAgIHJldHVybiBhY2tUaW1lb3V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEJsb2NraW5nIHNlbmQKKyAgICAgKiBAcGFyYW0gZGF0YQorICAgICAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZW5kTWVzc2FnZShTdHJpbmcgc2Vzc2lvbklkLCBieXRlW10gZGF0YSkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGNoZWNrSWZEaXNjb25uZWN0KCk7CisgICAgICAgIGlmICggIWlzQ29ubmVjdGVkKCkgKSBjb25uZWN0KCk7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBzYy5nZXRPdXRwdXRTdHJlYW0oKS53cml0ZShkYXRhKTsKKyAgICAgICAgICAgIHNjLmdldE91dHB1dFN0cmVhbSgpLmZsdXNoKCk7CisgICAgICAgICAgICB3YWl0Rm9yQWNrKGFja1RpbWVvdXQpOworICAgICAgICB9CisgICAgICAgIGNhdGNoICggamF2YS5pby5JT0V4Y2VwdGlvbiB4ICkKKyAgICAgICAgeworICAgICAgICAgICAgZGlzY29ubmVjdCgpOworICAgICAgICAgICAgY29ubmVjdCgpOworICAgICAgICAgICAgc2MuZ2V0T3V0cHV0U3RyZWFtKCkud3JpdGUoZGF0YSk7CisgICAgICAgICAgICBzYy5nZXRPdXRwdXRTdHJlYW0oKS5mbHVzaCgpOworICAgICAgICAgICAgd2FpdEZvckFjayhhY2tUaW1lb3V0KTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmtlZXBBbGl2ZUNvdW50Kys7CisgICAgICAgIGNoZWNrSWZEaXNjb25uZWN0KCk7CisKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgd2FpdEZvckFjayhsb25nIHRpbWVvdXQpICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgaSA9IHNjLmdldElucHV0U3RyZWFtKCkucmVhZCgpOworICAgICAgICAgICAgd2hpbGUgKCAoaSAhPSAtMSkgJiYgKGkgIT0gMykpIHsKKyAgICAgICAgICAgICAgICBpID0gc2MuZ2V0SW5wdXRTdHJlYW0oKS5yZWFkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKGphdmEubmV0LlNvY2tldFRpbWVvdXRFeGNlcHRpb24geCApIHsKKyAgICAgICAgICAgIGxvZy53YXJuKCJXYXNuJ3QgYWJsZSB0byByZWFkIGFja25vd2xlZGdlbWVudCBmcm9tIHNlcnZlclsiK2dldEFkZHJlc3MoKSsiOiIrZ2V0UG9ydCgpKyJdIGluICIrdGhpcy5hY2tUaW1lb3V0KyIgbXMuIisKKyAgICAgICAgICAgICAgICAgICAgICIgRGlzY29ubmVjdGluZyBzb2NrZXQsIGFuZCB0cnlpbmcgYWdhaW4uIik7CisgICAgICAgICAgICB0aHJvdyB4OworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoIlNvY2tldFNlbmRlclsiKTsKKyAgICAgICAgYnVmLmFwcGVuZChnZXRBZGRyZXNzKCkpLmFwcGVuZCgiOiIpLmFwcGVuZChnZXRQb3J0KCkpLmFwcGVuZCgiXSIpOworICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgfQorICAgIHB1YmxpYyBib29sZWFuIGlzU3VzcGVjdCgpIHsKKyAgICAgICAgcmV0dXJuIHN1c3BlY3Q7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZ2V0U3VzcGVjdCgpIHsKKyAgICAgICAgcmV0dXJuIHN1c3BlY3Q7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U3VzcGVjdChib29sZWFuIHN1c3BlY3QpIHsKKyAgICAgICAgdGhpcy5zdXNwZWN0ID0gc3VzcGVjdDsKKyAgICB9CisgICAgcHVibGljIGxvbmcgZ2V0S2VlcEFsaXZlVGltZW91dCgpIHsKKyAgICAgICAgcmV0dXJuIGtlZXBBbGl2ZVRpbWVvdXQ7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHNldEtlZXBBbGl2ZVRpbWVvdXQobG9uZyBrZWVwQWxpdmVUaW1lb3V0KSB7CisgICAgICAgIHRoaXMua2VlcEFsaXZlVGltZW91dCA9IGtlZXBBbGl2ZVRpbWVvdXQ7CisgICAgfQorICAgIHB1YmxpYyBpbnQgZ2V0S2VlcEFsaXZlTWF4UmVxdWVzdENvdW50KCkgeworICAgICAgICByZXR1cm4ga2VlcEFsaXZlTWF4UmVxdWVzdENvdW50OworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBzZXRLZWVwQWxpdmVNYXhSZXF1ZXN0Q291bnQoaW50IGtlZXBBbGl2ZU1heFJlcXVlc3RDb3VudCkgeworICAgICAgICB0aGlzLmtlZXBBbGl2ZU1heFJlcXVlc3RDb3VudCA9IGtlZXBBbGl2ZU1heFJlcXVlc3RDb3VudDsKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3RjcC9UY3BSZXBsaWNhdGlvblRocmVhZC5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3RjcC9UY3BSZXBsaWNhdGlvblRocmVhZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5MWE2YmUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvdGNwL1RjcFJlcGxpY2F0aW9uVGhyZWFkLmphdmEKQEAgLTAsMCArMSwxNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIudGNwOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0aW9uS2V5OworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU29ja2V0Q2hhbm5lbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIuaW8uT2JqZWN0UmVhZGVyOworCisvKioKKyAgICAgKiBBIHdvcmtlciB0aHJlYWQgY2xhc3Mgd2hpY2ggY2FuIGRyYWluIGNoYW5uZWxzIGFuZCBlY2hvLWJhY2sKKyAgICAgKiB0aGUgaW5wdXQuICBFYWNoIGluc3RhbmNlIGlzIGNvbnN0cnVjdGVkIHdpdGggYSByZWZlcmVuY2UgdG8KKyAgICAgKiB0aGUgb3duaW5nIHRocmVhZCBwb29sIG9iamVjdC4gV2hlbiBzdGFydGVkLCB0aGUgdGhyZWFkIGxvb3BzCisgICAgICogZm9yZXZlciB3YWl0aW5nIHRvIGJlIGF3YWtlbmVkIHRvIHNlcnZpY2UgdGhlIGNoYW5uZWwgYXNzb2NpYXRlZAorICAgICAqIHdpdGggYSBTZWxlY3Rpb25LZXkgb2JqZWN0LgorICAgICAqIFRoZSB3b3JrZXIgaXMgdGFza2VkIGJ5IGNhbGxpbmcgaXRzIHNlcnZpY2VDaGFubmVsKCkgbWV0aG9kCisgICAgICogd2l0aCBhIFNlbGVjdGlvbktleSBvYmplY3QuICBUaGUgc2VydmljZUNoYW5uZWwoKSBtZXRob2Qgc3RvcmVzCisgICAgICogdGhlIGtleSByZWZlcmVuY2UgaW4gdGhlIHRocmVhZCBvYmplY3QgdGhlbiBjYWxscyBub3RpZnkoKQorICAgICAqIHRvIHdha2UgaXQgdXAuICBXaGVuIHRoZSBjaGFubmVsIGhhcyBiZWVuIGRyYWluZWQsIHRoZSB3b3JrZXIKKyAgICAgKiB0aHJlYWQgcmV0dXJucyBpdHNlbGYgdG8gaXRzIHBhcmVudCBwb29sLgorICAgICAqLworcHVibGljIGNsYXNzIFRjcFJlcGxpY2F0aW9uVGhyZWFkIGV4dGVuZHMgV29ya2VyVGhyZWFkCit7CisgICAgcHJpdmF0ZSBzdGF0aWMgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGxvZyA9CisgICAgICAgIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3RvcnkuZ2V0TG9nKCBUY3BSZXBsaWNhdGlvblRocmVhZC5jbGFzcyApOworICAgIHByaXZhdGUgQnl0ZUJ1ZmZlciBidWZmZXIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlICgxMDI0KTsKKyAgICBwcml2YXRlIFNlbGVjdGlvbktleSBrZXk7CisgICAgcHJpdmF0ZSBib29sZWFuIHN5bmNocm9ub3VzPWZhbHNlOworCisgICAgVGNwUmVwbGljYXRpb25UaHJlYWQgKCkKKyAgICB7CisgICAgfQorCisgICAgLy8gbG9vcCBmb3JldmVyIHdhaXRpbmcgZm9yIHdvcmsgdG8gZG8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcnVuKCkKKyAgICB7CisgICAgICAgIHdoaWxlIChkb1J1bikgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAvLyBzbGVlcCBhbmQgcmVsZWFzZSBvYmplY3QgbG9jaworICAgICAgICAgICAgICAgIHRoaXMud2FpdCgpOworICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJUQ1Agd29ya2VyIHRocmVhZCBpbnRlcnJ1cHRlZCBpbiBjbHVzdGVyIixlKTsKKyAgICAgICAgICAgICAgICAvLyBjbGVhciBpbnRlcnJ1cHQgc3RhdHVzCisgICAgICAgICAgICAgICAgVGhyZWFkLmludGVycnVwdGVkKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsJLy8ganVzdCBpbiBjYXNlCisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGRyYWluQ2hhbm5lbCAoa2V5KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgbG9nLmVycm9yICgiVENQIFdvcmtlciB0aHJlYWQgaW4gY2x1c3RlciBjYXVnaHQgJyIKKyAgICAgICAgICAgICAgICAgICAgKyBlICsgIicgY2xvc2luZyBjaGFubmVsIiwgZSk7CisKKyAgICAgICAgICAgICAgICAvLyBjbG9zZSBjaGFubmVsIGFuZCBudWRnZSBzZWxlY3RvcgorICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGtleS5jaGFubmVsKCkuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIlVuYWJsZSB0byBjbG9zZSBjaGFubmVsLiIsZXgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBrZXkuc2VsZWN0b3IoKS53YWtldXAoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGtleSA9IG51bGw7CisgICAgICAgICAgICAvLyBkb25lLCByZWFkeSBmb3IgbW9yZSwgcmV0dXJuIHRvIHBvb2wKKyAgICAgICAgICAgIHRoaXMucG9vbC5yZXR1cm5Xb3JrZXIgKHRoaXMpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIHRvIGluaXRpYXRlIGEgdW5pdCBvZiB3b3JrIGJ5IHRoaXMgd29ya2VyIHRocmVhZAorICAgICAqIG9uIHRoZSBwcm92aWRlZCBTZWxlY3Rpb25LZXkgb2JqZWN0LiAgVGhpcyBtZXRob2QgaXMKKyAgICAgKiBzeW5jaHJvbml6ZWQsIGFzIGlzIHRoZSBydW4oKSBtZXRob2QsIHNvIG9ubHkgb25lIGtleQorICAgICAqIGNhbiBiZSBzZXJ2aWNlZCBhdCBhIGdpdmVuIHRpbWUuCisgICAgICogQmVmb3JlIHdha2luZyB0aGUgd29ya2VyIHRocmVhZCwgYW5kIGJlZm9yZSByZXR1cm5pbmcKKyAgICAgKiB0byB0aGUgbWFpbiBzZWxlY3Rpb24gbG9vcCwgdGhpcyBrZXkncyBpbnRlcmVzdCBzZXQgaXMKKyAgICAgKiB1cGRhdGVkIHRvIHJlbW92ZSBPUF9SRUFELiAgVGhpcyB3aWxsIGNhdXNlIHRoZSBzZWxlY3RvcgorICAgICAqIHRvIGlnbm9yZSByZWFkLXJlYWRpbmVzcyBmb3IgdGhpcyBjaGFubmVsIHdoaWxlIHRoZQorICAgICAqIHdvcmtlciB0aHJlYWQgaXMgc2VydmljaW5nIGl0LgorICAgICAqLworICAgIHN5bmNocm9uaXplZCB2b2lkIHNlcnZpY2VDaGFubmVsIChTZWxlY3Rpb25LZXkga2V5LCBib29sZWFuIHN5bmNocm9ub3VzKQorICAgIHsKKyAgICAgICAgdGhpcy5rZXkgPSBrZXk7CisgICAgICAgIHRoaXMuc3luY2hyb25vdXM9c3luY2hyb25vdXM7CisgICAgICAgIGtleS5pbnRlcmVzdE9wcyAoa2V5LmludGVyZXN0T3BzKCkgJiAoflNlbGVjdGlvbktleS5PUF9SRUFEKSk7CisgICAgICAgIGtleS5pbnRlcmVzdE9wcyAoa2V5LmludGVyZXN0T3BzKCkgJiAoflNlbGVjdGlvbktleS5PUF9XUklURSkpOworICAgICAgICB0aGlzLm5vdGlmeSgpOwkJLy8gYXdha2VuIHRoZSB0aHJlYWQKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgYWN0dWFsIGNvZGUgd2hpY2ggZHJhaW5zIHRoZSBjaGFubmVsIGFzc29jaWF0ZWQgd2l0aAorICAgICAqIHRoZSBnaXZlbiBrZXkuICBUaGlzIG1ldGhvZCBhc3N1bWVzIHRoZSBrZXkgaGFzIGJlZW4KKyAgICAgKiBtb2RpZmllZCBwcmlvciB0byBpbnZvY2F0aW9uIHRvIHR1cm4gb2ZmIHNlbGVjdGlvbgorICAgICAqIGludGVyZXN0IGluIE9QX1JFQUQuICBXaGVuIHRoaXMgbWV0aG9kIGNvbXBsZXRlcyBpdAorICAgICAqIHJlLWVuYWJsZXMgT1BfUkVBRCBhbmQgY2FsbHMgd2FrZXVwKCkgb24gdGhlIHNlbGVjdG9yCisgICAgICogc28gdGhlIHNlbGVjdG9yIHdpbGwgcmVzdW1lIHdhdGNoaW5nIHRoaXMgY2hhbm5lbC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZHJhaW5DaGFubmVsIChTZWxlY3Rpb25LZXkga2V5KQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBib29sZWFuIHBhY2tldFJlY2VpdmVkPWZhbHNlOworICAgICAgICBTb2NrZXRDaGFubmVsIGNoYW5uZWwgPSAoU29ja2V0Q2hhbm5lbCkga2V5LmNoYW5uZWwoKTsKKyAgICAgICAgaW50IGNvdW50OworICAgICAgICBidWZmZXIuY2xlYXIoKTsJCQkvLyBtYWtlIGJ1ZmZlciBlbXB0eQorICAgICAgICBPYmplY3RSZWFkZXIgcmVhZGVyID0gKE9iamVjdFJlYWRlcilrZXkuYXR0YWNobWVudCgpOworICAgICAgICAvLyBsb29wIHdoaWxlIGRhdGEgYXZhaWxhYmxlLCBjaGFubmVsIGlzIG5vbi1ibG9ja2luZworICAgICAgICB3aGlsZSAoKGNvdW50ID0gY2hhbm5lbC5yZWFkIChidWZmZXIpKSA+IDApIHsKKyAgICAgICAgICAgIGJ1ZmZlci5mbGlwKCk7CQkvLyBtYWtlIGJ1ZmZlciByZWFkYWJsZQorICAgICAgICAgICAgaW50IHBrZ2NudCA9IHJlYWRlci5hcHBlbmQoYnVmZmVyLmFycmF5KCksMCxjb3VudCk7CisgICAgICAgICAgICBidWZmZXIuY2xlYXIoKTsJCS8vIG1ha2UgYnVmZmVyIGVtcHR5CisgICAgICAgIH0KKyAgICAgICAgLy9jaGVjayB0byBzZWUgaWYgYW55IGRhdGEgaXMgYXZhaWxhYmxlCisgICAgICAgIGludCBwa2djbnQgPSByZWFkZXIuZXhlY3V0ZSgpOworICAgICAgICB3aGlsZSAoIHBrZ2NudCA+IDAgKSB7CisgICAgICAgICAgICBpZiAoc3luY2hyb25vdXMpIHsKKyAgICAgICAgICAgICAgICBzZW5kQWNrKGtleSxjaGFubmVsKTsKKyAgICAgICAgICAgIH0gLy9lbmQgaWYKKyAgICAgICAgICAgIHBrZ2NudC0tOworICAgICAgICB9CisgICAgICAgIGlmIChjb3VudCA8IDApIHsKKyAgICAgICAgICAgIC8vIGNsb3NlIGNoYW5uZWwgb24gRU9GLCBpbnZhbGlkYXRlcyB0aGUga2V5CisgICAgICAgICAgICBjaGFubmVsLmNsb3NlKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vYWNxdWlyZSB0aGUgaW50ZXJlc3RPcHMgbXV0ZXgKKyAgICAgICAgT2JqZWN0IG11dGV4ID0gdGhpcy5nZXRQb29sKCkuZ2V0SW50ZXJlc3RPcHNNdXRleCgpOworICAgICAgICBzeW5jaHJvbml6ZWQgKG11dGV4KSB7CisgICAgICAgICAgICAvLyBjeWNsZSB0aGUgc2VsZWN0b3Igc28gdGhpcyBrZXkgaXMgYWN0aXZlIGFnYWluCisgICAgICAgICAgICBrZXkuc2VsZWN0b3IoKS53YWtldXAoKTsKKyAgICAgICAgICAgIC8vIHJlc3VtZSBpbnRlcmVzdCBpbiBPUF9SRUFELCBPUF9XUklURQorICAgICAgICAgICAgaW50IHJlc3VtZU9wcyA9IGtleS5pbnRlcmVzdE9wcygpIHwgU2VsZWN0aW9uS2V5Lk9QX1JFQUQ7CisgICAgICAgICAgICBrZXkuaW50ZXJlc3RPcHMocmVzdW1lT3BzKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2VuZEFjayhTZWxlY3Rpb25LZXkga2V5LCBTb2NrZXRDaGFubmVsIGNoYW5uZWwpIHsKKyAgICAgICAgLy9zZW5kIGEgcmVwbHktYWNrbm93bGVkZ2VtZW50CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjaGFubmVsLndyaXRlKEJ5dGVCdWZmZXIud3JhcChuZXcgYnl0ZVtdIHs2LCAyLCAzfSkpOworICAgICAgICB9IGNhdGNoICggamF2YS5pby5JT0V4Y2VwdGlvbiB4ICkgeworICAgICAgICAgICAgbG9nLndhcm4oIlVuYWJsZSB0byBzZW5kIEFDSyBiYWNrIHRocm91Z2ggY2hhbm5lbCwgY2hhbm5lbCBkaXNjb25uZWN0ZWQ/OiAiK3guZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci90Y3AvVGhyZWFkUG9vbC5qYXZhIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3RjcC9UaHJlYWRQb29sLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDYzZTczOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci90Y3AvVGhyZWFkUG9vbC5qYXZhCkBAIC0wLDAgKzEsOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIudGNwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworCisvKioKKyAqIDxwPlRpdGxlOiA8L3A+CisgKiA8cD5EZXNjcmlwdGlvbjogPC9wPgorICogPHA+Q29weXJpZ2h0OiBDb3B5cmlnaHQgKGMpIDIwMDI8L3A+CisgKiA8cD5Db21wYW55OiA8L3A+CisgKiBAYXV0aG9yIG5vdCBhdHRyaWJ1dGFibGUKKyAqIEB2ZXJzaW9uIDEuMAorICovCisKK3B1YmxpYyBjbGFzcyBUaHJlYWRQb29sCit7CisgICAgLyoqCisgICAgICogQSB2ZXJ5IHNpbXBsZSB0aHJlYWQgcG9vbCBjbGFzcy4gIFRoZSBwb29sIHNpemUgaXMgc2V0IGF0CisgICAgICogY29uc3RydWN0aW9uIHRpbWUgYW5kIHJlbWFpbnMgZml4ZWQuICBUaHJlYWRzIGFyZSBjeWNsZWQKKyAgICAgKiB0aHJvdWdoIGEgRklGTyBpZGxlIHF1ZXVlLgorICAgICAqLworCisgICAgTGlzdCBpZGxlID0gbmV3IExpbmtlZExpc3QoKTsKKyAgICBPYmplY3QgbXV0ZXggPSBuZXcgT2JqZWN0KCk7CisgICAgT2JqZWN0IGludGVyZXN0T3BzTXV0ZXggPSBudWxsOworCisgICAgVGhyZWFkUG9vbCAoaW50IHBvb2xTaXplLCBDbGFzcyB0aHJlYWRDbGFzcywgT2JqZWN0IGludGVyZXN0T3BzTXV0ZXgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBmaWxsIHVwIHRoZSBwb29sIHdpdGggd29ya2VyIHRocmVhZHMKKyAgICAgICAgdGhpcy5pbnRlcmVzdE9wc011dGV4ID0gaW50ZXJlc3RPcHNNdXRleDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwb29sU2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBXb3JrZXJUaHJlYWQgdGhyZWFkID0gKFdvcmtlclRocmVhZCl0aHJlYWRDbGFzcy5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgdGhyZWFkLnNldFBvb2wodGhpcyk7CisKKyAgICAgICAgICAgIC8vIHNldCB0aHJlYWQgbmFtZSBmb3IgZGVidWdnaW5nLCBzdGFydCBpdAorICAgICAgICAgICAgdGhyZWFkLnNldE5hbWUgKHRocmVhZENsYXNzLmdldE5hbWUoKSsiWyIgKyAoaSArIDEpKyJdIik7CisgICAgICAgICAgICB0aHJlYWQuc2V0RGFlbW9uKHRydWUpOworICAgICAgICAgICAgdGhyZWFkLnNldFByaW9yaXR5KFRocmVhZC5NQVhfUFJJT1JJVFkpOworICAgICAgICAgICAgdGhyZWFkLnN0YXJ0KCk7CisKKyAgICAgICAgICAgIGlkbGUuYWRkICh0aHJlYWQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluZCBhbiBpZGxlIHdvcmtlciB0aHJlYWQsIGlmIGFueS4gIENvdWxkIHJldHVybiBudWxsLgorICAgICAqLworICAgIFdvcmtlclRocmVhZCBnZXRXb3JrZXIoKQorICAgIHsKKyAgICAgICAgV29ya2VyVGhyZWFkIHdvcmtlciA9IG51bGw7CisKKyAgICAgICAgCisgICAgICAgIHN5bmNocm9uaXplZCAobXV0ZXgpIHsKKyAgICAgICAgICAgIHdoaWxlICggd29ya2VyID09IG51bGwgKSB7CisgICAgICAgICAgICAgICAgaWYgKGlkbGUuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgd29ya2VyID0gKFdvcmtlclRocmVhZCkgaWRsZS5yZW1vdmUoMCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uIHgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vdGhpcyBtZWFucyB0aGF0IHRoZXJlIGFyZSBubyBhdmFpbGFibGUgd29ya2VycworICAgICAgICAgICAgICAgICAgICAgICAgd29ya2VyID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7IG11dGV4LndhaXQoKTsgfSBjYXRjaCAoIGphdmEubGFuZy5JbnRlcnJ1cHRlZEV4Y2VwdGlvbiB4ICkge30KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKHdvcmtlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IHRoZSB3b3JrZXIgdGhyZWFkIHRvIHJldHVybiBpdHNlbGYgdG8gdGhlCisgICAgICogaWRsZSBwb29sLgorICAgICAqLworICAgIHZvaWQgcmV0dXJuV29ya2VyIChXb3JrZXJUaHJlYWQgd29ya2VyKQorICAgIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtdXRleCkgeworICAgICAgICAgICAgaWRsZS5hZGQgKHdvcmtlcik7CisgICAgICAgICAgICBtdXRleC5ub3RpZnkoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBwdWJsaWMgT2JqZWN0IGdldEludGVyZXN0T3BzTXV0ZXgoKSB7CisgICAgICAgIHJldHVybiBpbnRlcmVzdE9wc011dGV4OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci90Y3AvV29ya2VyVGhyZWFkLmphdmEgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvdGNwL1dvcmtlclRocmVhZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyZDU0MWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NsdXN0ZXIvdGNwL1dvcmtlclRocmVhZC5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLmNsdXN0ZXIudGNwOworCisKK3B1YmxpYyBjbGFzcyBXb3JrZXJUaHJlYWQgZXh0ZW5kcyBUaHJlYWQKK3sKKyAgICBwcml2YXRlIHN0YXRpYyBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2cgbG9nID0KKyAgICAgICAgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeS5nZXRMb2coIFdvcmtlclRocmVhZC5jbGFzcyApOworICAgIHByb3RlY3RlZCBUaHJlYWRQb29sIHBvb2w7CisgICAgcHJvdGVjdGVkIGJvb2xlYW4gZG9SdW4gPSB0cnVlOworCisKKyAgICBwdWJsaWMgdm9pZCBzZXRQb29sKFRocmVhZFBvb2wgcG9vbCkgeworICAgICAgICB0aGlzLnBvb2wgPSBwb29sOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgVGhyZWFkUG9vbCBnZXRQb29sKCkgeworICAgICAgICByZXR1cm4gcG9vbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpCisgICAgeworICAgICAgICBkb1J1biA9IGZhbHNlOworICAgICAgICBub3RpZnkoKTsKKworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci91dGlsL1NtYXJ0UXVldWUuamF2YSBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvc3JjL3NoYXJlL29yZy9hcGFjaGUvY2F0YWxpbmEvY2x1c3Rlci91dGlsL1NtYXJ0UXVldWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjkwMWM4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL21vZHVsZXMvY2x1c3Rlci9zcmMvc2hhcmUvb3JnL2FwYWNoZS9jYXRhbGluYS9jbHVzdGVyL3V0aWwvU21hcnRRdWV1ZS5qYXZhCkBAIC0wLDAgKzEsMTYxIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5jbHVzdGVyLnV0aWw7CisKKy8qKgorICogQSBzbWFydCBxdWV1ZSwgdXNlZCBmb3IgYXN5bmMgcmVwbGljYXRpb248QlI+CisgKiB0aGUgInNtYXJ0IiBwYXJ0IG9mIHRoaXMgcXVldWUgaXMgdGhhdCBpZiB0aGUgc2Vzc2lvbiBpcyBhbHJlYWR5IHF1ZXVlZCBmb3IgcmVwbGljYXRpb24sCisgKiBhbmQgaXQgaXMgdXBkYXRlZCBhZ2FpbiwgdGhlIHNlc3Npb24gd2lsbCBzaW1wbHkgYmUgcmVwbGFjZWQsIGhlbmNlIHdlIGRvbid0IAorICogcmVwbGljYXRlIHN0dWZmIHRoYXQgaXMgb2Jzb2xldGUuCisgKiBQdXQgdGhpcyBpbnRvIHV0aWwsIHNpbmNlIGl0IGlzIHF1aXRlICBnZW5lcmljLgorICogCisgKiBAYXV0aG9yIEZpbGlwIEhhbmlrCisgKiBAdmVyc2lvbiAxLjAKKyAqLworIAorCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CisKK3B1YmxpYyBjbGFzcyBTbWFydFF1ZXVlIHsKKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZyBsb2cgPQorICAgICAgICBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5LmdldExvZyggU21hcnRRdWV1ZS5jbGFzcyApOworICAgIAorICAgIC8qKgorICAgICAqIFRoaXMgaXMgdGhlIGFjdHVhbCBxdWV1ZQorICAgICAqLworICAgIHByaXZhdGUgTGlua2VkTGlzdCBxdWV1ZSA9IG5ldyBMaW5rZWRMaXN0KCk7CisgICAgLyoqCisgICAgICogQW5kIHRoaXMgaXMgb25seSBmb3IgcGVyZm9ybWFuY2UsIGZhc3QgbG9va3VwcworICAgICAqLworICAgIHByaXZhdGUgSGFzaE1hcCBxdWV1ZU1hcCA9IG5ldyBIYXNoTWFwKCk7CisgICAgCisgICAgcHJpdmF0ZSBPYmplY3QgbXV0ZXggPSBuZXcgT2JqZWN0KCk7CisgICAgcHVibGljIHN0YXRpYyBpbnQgZGVidWcgPSAwOworICAgIAorICAgIHB1YmxpYyBTbWFydFF1ZXVlKCkgeworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBBZGQgYW4gb2JqZWN0IHRvIHRoZSBxdWV1ZQorICAgICAqIEBwYXJhbSBlbnRyeSAtIHRoZSBzbWFydCBlbnRyeQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZChTbWFydEVudHJ5IGVudHJ5KSB7CisgICAgICAgIC8qbWFrZSBzdXJlIHdlIGFyZSB3aXRoaW4gYSBzeW5jaHJvbml6ZWQgYmxvY2sgc2luY2Ugd2UgYXJlIGRlYWxpbmcgd2l0aCB0d28KKyAgICAgICAgICB1bnN5bmMgY29sbGVjdGlvbnMqLworICAgICAgICBzeW5jaHJvbml6ZWQgKG11dGV4KSB7CisgICAgICAgICAgICAvKmNoZWNrIHRvIHNlZSBpZiB0aGlzIG9iamVjdCBoYXMgYWxyZWFkeSBiZWVuIHF1ZXVlZCovCisgICAgICAgICAgICBTbWFydEVudHJ5IGN1cnJlbnQgPSAoU21hcnRFbnRyeSlxdWV1ZU1hcC5nZXQoZW50cnkuZ2V0S2V5KCkpOworICAgICAgICAgICAgaWYgKCBjdXJyZW50ID09IG51bGwgKSB7CisgICAgICAgICAgICAgICAgLyp0aGUgb2JqZWN0IGhhcyBub3QgYmVlbiBxdWV1ZWQsIGF0IGl0IHRvIHRoZSBlbmQgb2YgdGhlIHF1ZXVlKi8KKyAgICAgICAgICAgICAgICBpZiAoIGRlYnVnICE9IDAgKSBsb2cuZGVidWcoIlsiK1RocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpKyJdW1NtYXJ0UXVldWVdIEFkZGluZyBuZXcgb2JqZWN0PSIrZW50cnkpOworICAgICAgICAgICAgICAgIHF1ZXVlLmFkZExhc3QoZW50cnkpOworICAgICAgICAgICAgICAgIHF1ZXVlTWFwLnB1dChlbnRyeS5nZXRLZXkoKSxlbnRyeSk7CisgICAgICAgICAgICB9ZWxzZSB7CisgICAgICAgICAgICAgICAgLyp0aGUgb2JqZWN0IGhhcyBiZWVuIHF1ZXVlZCwgcmVwbGFjZSB0aGUgdmFsdWUqLworICAgICAgICAgICAgICAgIGlmICggZGVidWcgIT0gMCApIGxvZy5kZWJ1ZygiWyIrVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkrIl1bU21hcnRRdWV1ZV0gUmVwbGFjaW5nIG9sZCBvYmplY3Q9IitjdXJyZW50KTsKKyAgICAgICAgICAgICAgICBjdXJyZW50LnNldFZhbHVlKGVudHJ5LmdldFZhbHVlKCkpOworICAgICAgICAgICAgICAgIGlmICggZGVidWcgIT0gMCApIGxvZy5kZWJ1Zygid2l0aCBuZXcgb2JqZWN0PSIrY3VycmVudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKndha2UgdXAgYWxsIHRoZSB0aHJlYWRzIHRoYXQgYXJlIHdhaXRpbmcgZm9yIHRoZSBsb2NrIHRvIGJlIHJlbGVhc2VkKi8KKyAgICAgICAgICAgIG11dGV4Lm5vdGlmeUFsbCgpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtdXRleCkgeworICAgICAgICAgICAgcmV0dXJuIHF1ZXVlLnNpemUoKTsgICAgICAgICAgICAKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBCbG9ja3MgZm9yZXZlciB1bnRpbCBhbiBlbGVtZW50IGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBxdWV1ZQorICAgICAqLworICAgIHB1YmxpYyBTbWFydEVudHJ5IHJlbW92ZSgpIHsKKyAgICAgICAgcmV0dXJuIHJlbW92ZSgwKTsKKyAgICB9CisgICAgcHVibGljIFNtYXJ0RW50cnkgcmVtb3ZlKGxvbmcgdGltZW91dCkgeworICAgICAgICBTbWFydEVudHJ5IHJlc3VsdCA9IG51bGw7IAorICAgICAgICBsb25nIHN0YXJ0RW50cnkgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgc3luY2hyb25pemVkIChtdXRleCkgeworICAgICAgICAgICAgd2hpbGUgKCBzaXplKCkgPT0gMCApIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIGRlYnVnICE9IDAgKSBsb2cuZGVidWcoIlsiK1RocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpKyJdW1NtYXJ0UXVldWVdIFF1ZXVlIHNsZWVwaW5nIHVudGlsIG9iamVjdCBhZGRlZCBzaXplPSIrc2l6ZSgpKyIuIik7CisgICAgICAgICAgICAgICAgICAgIGlmICggKHRpbWVvdXQgIT0gMCkgJiYgKChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKS1zdGFydEVudHJ5KT50aW1lb3V0KSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG11dGV4LndhaXQodGltZW91dCk7CisgICAgICAgICAgICAgICAgICAgIGlmICggZGVidWcgIT0gMCApIGxvZy5kZWJ1ZygiWyIrVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkrIl1bU21hcnRRdWV1ZV0gUXVldWUgd29rZSB1cCBvciBpbnRlcnJ1cHRlZCBzaXplPSIrc2l6ZSgpKyIuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoKElsbGVnYWxNb25pdG9yU3RhdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgfS8vY2F0Y2gKKyAgICAgICAgICAgIH0vL3doaWxlCisgICAgICAgICAgICAvKmd1YXJhbnRlZWQgdGhhdCB3ZSBhcmUgbm90IGVtcHR5IGJ5IG5vdyovCisgICAgICAgICAgICByZXN1bHQgPSAoU21hcnRFbnRyeSlxdWV1ZS5yZW1vdmVGaXJzdCgpOworICAgICAgICAgICAgcXVldWVNYXAucmVtb3ZlKHJlc3VsdC5nZXRLZXkoKSk7CisgICAgICAgICAgICBpZiAoIGRlYnVnICE9IDAgKSBsb2cuZGVidWcoIlsiK1RocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpKyJdW1NtYXJ0UXVldWVdIFJldHVybmluZz0iK3Jlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgCisgICAgCisgICAgCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTbWFydEVudHJ5IHsKKyAgICAgICAgcHJvdGVjdGVkIE9iamVjdCBrZXk7CisgICAgICAgIHByb3RlY3RlZCBPYmplY3QgdmFsdWU7CisgICAgICAgIHB1YmxpYyBTbWFydEVudHJ5KE9iamVjdCBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgICAgICBpZiAoIGtleSA9PSBudWxsICkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU21hcnRFbnRyeSBrZXkgY2FuIG5vdCBiZSBudWxsLiIpOworICAgICAgICAgICAgaWYgKCB2YWx1ZSA9PSBudWxsICkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU21hcnRFbnRyeSB2YWx1ZSBjYW4gbm90IGJlIG51bGwuIik7CisgICAgICAgICAgICB0aGlzLmtleSA9IGtleTsKKyAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIE9iamVjdCBnZXRLZXkoKSB7CisgICAgICAgICAgICByZXR1cm4ga2V5OworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgICAgIGlmICggdmFsdWUgPT0gbnVsbCApIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlNtYXJ0RW50cnkgdmFsdWUgY2FuIG5vdCBiZSBudWxsLiIpOworICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICAgICAgcmV0dXJuIGtleS5oYXNoQ29kZSgpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKyAgICAgICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBTbWFydEVudHJ5KSkgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgU21hcnRFbnRyeSBvdGhlciA9IChTbWFydEVudHJ5KW87CisgICAgICAgICAgICByZXR1cm4gb3RoZXIuZ2V0S2V5KCkuZXF1YWxzKGdldEtleSgpKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiAiW1NtYXJ0eUVudHJ5IGtleT0iK2tleSsiIHZhbHVlPSIrdmFsdWUrIl0iOworICAgICAgICB9CisgICAgfQorICAgIAorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3RvLWRvLnR4dCBiL2NvbnRhaW5lci9tb2R1bGVzL2NsdXN0ZXIvdG8tZG8udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzN2UzYWUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvbW9kdWxlcy9jbHVzdGVyL3RvLWRvLnR4dApAQCAtMCwwICsxLDEyIEBACisxLiBGaXggZmFybSBkZXBsb3ltZW50IGZvciA1LjUKKzIuIEV4dGVuZCBTdGFuZGFyZFNlc3Npb24gaWYgcG9zc2libGUKKzMuIEltcGxlbWVudCBwcmltYXJ5L3NlY29uZGFyeSByZXBsaWNhdGlvbiBsb2dpYworNC4gSW1wbGVtZW50IGZyYWdtZW50YXRpb24gb2YgbGFyZ2UgcmVwbGljYXRpb24gb2JqZWN0cworNS4gSW1wbGVtZW50YSBOb25TZXJpYWxpemFibGUgaW50ZXJmYWNlIGZvciBzZXNzaW9uIGF0dHJpYnV0ZXMgdGhhdCBkbyBub3QKK3dpc2ggdG8gYmUgcmVwbGljYXRlZAorNi4gSW1wbGVtZW50IGNvbnRleHQgYXR0cmlidXRlIHJlcGxpY2F0aW9uICg/KQorNy4gSk1YIGZyaWVuZGx5Cis4LiBEb2N1bWVudGF0aW9uCis5LiBBZGQgYSBmbGFnIGZvciByZXBsaWNhdGVkICBhdHRyaWJ1dGUgZXZlbnRzLCB0byBlbmFibGUgb3IgZGlzYWJsZSB0aGVtIC0KK0NPTVBMRVRFRAorCmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyLy5jdnNpZ25vcmUgYi9jb250YWluZXIvdGVzdGVyLy5jdnNpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQwYjcxYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvLmN2c2lnbm9yZQpAQCAtMCwwICsxLDIgQEAKK2J1aWxkCitkaXN0CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL2J1aWxkLnhtbCBiL2NvbnRhaW5lci90ZXN0ZXIvYnVpbGQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3ZDAwMjEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL2J1aWxkLnhtbApAQCAtMCwwICsxLDIyNiBAQAorPHByb2plY3QgbmFtZT0iVGVzdGVyIiBkZWZhdWx0PSJidWlsZC1tYWluIiBiYXNlZGlyPSIuIj4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09IEluaXRpYWxpemUgUHJvcGVydHkgVmFsdWVzID09PT09PT09PT09PT09PT09PT0gLS0+CisKKyAgPHByb3BlcnR5IGZpbGU9ImJ1aWxkLnByb3BlcnRpZXMiLz4KKyAgPHByb3BlcnR5IGZpbGU9Ii4uL2J1aWxkLnByb3BlcnRpZXMiLz4KKyAgPHByb3BlcnR5IGZpbGU9IiR7dXNlci5ob21lfS9idWlsZC5wcm9wZXJ0aWVzIi8+CisKKyAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmNvbXBpbGVyIiAgdmFsdWU9Im1vZGVybiIvPgorICA8cHJvcGVydHkgbmFtZT0iYXBpLmhvbWUiIHZhbHVlPSIuLi8uLi9qYWthcnRhLXNlcnZsZXRhcGktNS9kaXN0Ii8+CisgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0ZXIuYnVpbGQiICAgIHZhbHVlPSIke2Jhc2VkaXJ9L2J1aWxkIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0ZXIuZGVwbG95IiAgIHZhbHVlPSIke2Jhc2VkaXJ9Ly4uL2J1aWxkIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0ZXIuZGlzdCIgICAgIHZhbHVlPSIke2Jhc2VkaXJ9L2Rpc3QiLz4KKworICA8IS0tID09PT09PT09PT09PT09PT09PSBEZXJpdmVkIFByb3BlcnR5IFZhbHVlcyA9PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8cHJvcGVydHkgbmFtZT0iYW50LmphciIgICAgICAgICB2YWx1ZT0iJHthbnQuaG9tZX0vbGliL2FudC5qYXIiLz4KKyAgPHByb3BlcnR5IG5hbWU9InNlcnZsZXQtYXBpLmphciIgdmFsdWU9IiR7YXBpLmhvbWV9L2pzcjE1NC9kaXN0L2xpYi9zZXJ2bGV0LWFwaS5qYXIiLz4KKworICA8IS0tID09PT09PT09PT09PT09PT09PT0gQlVJTEQ6IENyZWF0ZSBEaXJlY3RvcmllcyA9PT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImJ1aWxkLXByZXBhcmUiPgorICAgIDxta2RpciBkaXI9IiR7dGVzdGVyLmJ1aWxkfSIvPgorICAgIDxta2RpciBkaXI9IiR7dGVzdGVyLmJ1aWxkfS9iaW4iLz4KKyAgICA8bWtkaXIgZGlyPSIke3Rlc3Rlci5idWlsZH0vY2xhc3NlcyIvPgorICAgIDxta2RpciBkaXI9IiR7dGVzdGVyLmJ1aWxkfS9jb25mIi8+CisgICAgPG1rZGlyIGRpcj0iJHt0ZXN0ZXIuYnVpbGR9L2xpYiIvPgorICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PSBCVUlMRDogQ29weSBTdGF0aWMgRmlsZXMgPT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iYnVpbGQtc3RhdGljIiBkZXBlbmRzPSJidWlsZC1wcmVwYXJlIj4KKworICAgIDwhLS0gRXhlY3V0YWJsZSBDb21tYW5kcyAtLT4KKyAgICA8bWtkaXIgIGRpcj0iJHt0ZXN0ZXIuYnVpbGR9L2JpbiIvPgorICAgIDxjb3B5IHRvZGlyPSIke3Rlc3Rlci5idWlsZH0vYmluIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0ic3JjL2JpbiIgLz4KKyAgICA8L2NvcHk+CisgICAgPGZpeGNybGYgc3JjZGlyPSIke3Rlc3Rlci5idWlsZH0vYmluIiBpbmNsdWRlcz0iKi5zaCIgIGVvbD0ibGYiLz4KKyAgICA8Zml4Y3JsZiBzcmNkaXI9IiR7dGVzdGVyLmJ1aWxkfS9iaW4iIGluY2x1ZGVzPSIqLmJhdCIgZW9sPSJjcmxmIi8+CisgICAgPGNobW9kIHBlcm09Iit4IiBmaWxlPSIke3Rlc3Rlci5idWlsZH0vYmluL3Rlc3Rlci5zaCIvPgorICAgIDxjb3B5IHRvZGlyPSIke3Rlc3Rlci5idWlsZH0vY29uZiI+CisgICAgICA8ZmlsZXNldCBkaXI9InNyYy9jb25mIiAvPgorICAgIDwvY29weT4KKworICAgIDwhLS0gQ29tcGlsZWQgQ2xhc3NlcyAtLT4KKyAgICA8bWtkaXIgIGRpcj0iJHt0ZXN0ZXIuYnVpbGR9L2NsYXNzZXMiLz4KKworICAgIDwhLS0gV2ViIEFwcGxpY2F0aW9uIC0tPgorICAgIDxta2RpciAgZGlyPSIke3Rlc3Rlci5idWlsZH0vd2ViIi8+CisgICAgPGNvcHkgdG9kaXI9IiR7dGVzdGVyLmJ1aWxkfS93ZWIiPgorICAgICAgPGZpbGVzZXQgZGlyPSJ3ZWIiLz4KKyAgICA8L2NvcHk+CisgICAgPG1rZGlyICBkaXI9IiR7dGVzdGVyLmJ1aWxkfS93ZWIvV0VCLUlORi9jbGFzc2VzIi8+CisKKyAgPC90YXJnZXQ+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09IEJVSUxEOiBDb21waWxlIFNlcnZlciBDb21wb25lbnRzID09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImJ1aWxkLW1haW4iIGRlcGVuZHM9ImJ1aWxkLXN0YXRpYyI+CisKKyAgICA8IS0tIENvbXBpbGUgdGVzdGVyIGNvbXBvbmVudHMgYW5kIHRvb2xzIC0tPgorICAgIDxqYXZhYyBzcmNkaXI9InNyYy90ZXN0ZXIiIGRlc3RkaXI9IiR7dGVzdGVyLmJ1aWxkfS9jbGFzc2VzIgorICAgICBjbGFzc3BhdGg9IiR7YW50Lmphcn06JHtzZXJ2bGV0LWFwaS5qYXJ9OiR7eGVyY2VzSW1wbC5qYXJ9IgorICAgICBkZXByZWNhdGlvbj0iJHtjb21waWxlLmRlcHJlY2F0aW9ufSIKKyAgICAgZGVidWc9IiR7Y29tcGlsZS5kZWJ1Z30iIG9wdGltaXplPSJvZmYiCisgICAgIGV4Y2x1ZGVzPSIqKi9DVlMvKioiLz4KKworICAgIDwhLS0gQ29weSBzdGF0aWMgcmVzb3VyY2UgZmlsZXMgLS0+CisgICAgPGNvcHkgdG9kaXI9IiR7dGVzdGVyLmJ1aWxkfS9jbGFzc2VzIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0ic3JjL3Rlc3RlciI+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoucHJvcGVydGllcyIvPgorICAgICAgPC9maWxlc2V0PgorICAgICAgPGZpbGVzZXQgZGlyPSJzcmMvdGVzdGVyIj4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi50eHQiLz4KKyAgICAgIDwvZmlsZXNldD4KKyAgICA8L2NvcHk+CisgICAgPGNvcHkgZmlsZT0iJHt0ZXN0ZXIuYnVpbGR9L2NsYXNzZXMvb3JnL2FwYWNoZS90ZXN0ZXIvdW5zaGFyZWQvVW5zaGFyZWRTZXNzaW9uQmVhbi5jbGFzcyIKKyAgICAgICAgdG9maWxlPSIke3Rlc3Rlci5idWlsZH0vd2ViL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3Rlc3Rlci91bnNoYXJlZC9VbnNoYXJlZFNlc3Npb25CZWFuLmNsYXNzIi8+CisgICAgPGNvcHkgZmlsZT0ic3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9SZXNvdXJjZXMwMS50eHQiCisgICAgICAgIHRvZmlsZT0iJHt0ZXN0ZXIuYnVpbGR9L3dlYi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS90ZXN0ZXIvVW5wYWNrZWQwMS50eHQiLz4KKyAgICA8Y29weSBmaWxlPSJzcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1Jlc291cmNlczAxLnR4dCIKKyAgICAgICAgdG9maWxlPSIke3Rlc3Rlci5idWlsZH0vY2xhc3Nlcy9vcmcvYXBhY2hlL3Rlc3Rlci9zaGFyZWQvU2hhcmVkMDEudHh0Ii8+CisgICAgPGNvcHkgZmlsZT0ic3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9SZXNvdXJjZXMwMS50eHQiCisgICAgICAgIHRvZmlsZT0iJHt0ZXN0ZXIuYnVpbGR9L2NsYXNzZXMvb3JnL2FwYWNoZS90ZXN0ZXIvdW5wc2hhcmVkL1VucFNoYXJlZDAxLnR4dCIvPgorICAgIDxjb3B5IGZpbGU9InNyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvUmVzb3VyY2VzMDMudHh0IgorICAgICAgICB0b2ZpbGU9IiR7dGVzdGVyLmJ1aWxkfS93ZWIvV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvdGVzdGVyL1VucGFja2VkMDMudHh0Ii8+CisgICAgPGNvcHkgZmlsZT0ic3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9SZXNvdXJjZXMwMy50eHQiCisgICAgICAgIHRvZmlsZT0iJHt0ZXN0ZXIuYnVpbGR9L2NsYXNzZXMvb3JnL2FwYWNoZS90ZXN0ZXIvc2hhcmVkL1NoYXJlZDAzLnR4dCIvPgorICAgIDxjb3B5IGZpbGU9InNyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvUmVzb3VyY2VzMDMudHh0IgorICAgICAgICB0b2ZpbGU9IiR7dGVzdGVyLmJ1aWxkfS9jbGFzc2VzL29yZy9hcGFjaGUvdGVzdGVyL3VucHNoYXJlZC9VbnBTaGFyZWQwMy50eHQiLz4KKyAgICA8Y29weSBmaWxlPSJzcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1Jlc291cmNlczA1LnR4dCIKKyAgICAgICAgdG9maWxlPSIke3Rlc3Rlci5idWlsZH0vd2ViL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3Rlc3Rlci9VbnBhY2tlZDA1LnR4dCIvPgorCisgICAgPCEtLSBJbnN0YWxsIFhlcmNlcyAtLT4KKyAgICA8Y29weSAgdG9kaXI9IiR7dGVzdGVyLmJ1aWxkfS93ZWIvV0VCLUlORi9saWIiIGZpbGU9IiR7eGVyY2VzSW1wbC5qYXJ9Ii8+CisgICAgPGNvcHkgIHRvZGlyPSIke3Rlc3Rlci5idWlsZH0vd2ViL1dFQi1JTkYvbGliIiBmaWxlPSIke3htbC1hcGlzLmphcn0iLz4KKworICAgIDwhLS0gQ3JlYXRlIGFuZCBpbnN0YWxsIHRlc3RlciBsaWJyYXJ5IC0tPgorICAgIDxta2RpciAgIGRpcj0iJHt0ZXN0ZXIuYnVpbGR9L3dlYi9XRUItSU5GL2xpYiIvPgorICAgIDxqYXIgamFyZmlsZT0iJHt0ZXN0ZXIuYnVpbGR9L3dlYi9XRUItSU5GL2xpYi90ZXN0ZXIuamFyIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHt0ZXN0ZXIuYnVpbGR9L2NsYXNzZXMiPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi9zaGFyZWQvKiIvPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi91bnNoYXJlZC8qIi8+CisgICAgICA8L2ZpbGVzZXQ+CisgICAgPC9qYXI+CisKKyAgPC90YXJnZXQ+CisKKworICA8IS0tID09PT09PT09PT09PT09PT0gQlVJTEQ6IENyZWF0ZSBUZXN0ZXIgSmF2YWRvY3MgPT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImphdmFkb2MiIGRlcGVuZHM9ImJ1aWxkLW1haW4iPgorICAgIDxkZWxldGUgZGlyPSIke3Rlc3Rlci5idWlsZH0vamF2YWRvYyIvPgorICAgIDxta2RpciBkaXI9IiR7dGVzdGVyLmJ1aWxkfS9qYXZhZG9jIi8+CisgICAgPGphdmFkb2MgcGFja2FnZW5hbWVzPSJvcmcuYXBhY2hlLnRlc3Rlci4qIgorICAgICBjbGFzc3BhdGg9IiR7YW50Lmphcn06JHt0ZXN0ZXIuYnVpbGR9L2NsYXNzZXMiCisgICAgIHNvdXJjZXBhdGg9InNyYy90ZXN0ZXIiCisgICAgIGRlc3RkaXI9IiR7dGVzdGVyLmJ1aWxkfS9qYXZhZG9jIgorICAgICBhdXRob3I9InRydWUiCisgICAgIHZlcnNpb249InRydWUiCisgICAgIHdpbmRvd3RpdGxlPSJUZXN0ZXIgSW50ZXJuYWwgQVBJIERvY3VtZW50YXRpb24iCisgICAgIGRvY3RpdGxlPSJUZXN0ZXIgVG9vbHMgYW5kIFRlc3RzIEFQSSIKKyAgICAgYm90dG9tPSJDb3B5cmlnaHQgJiMxNjk7IDIwMDAtMjAwNCBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIgorICAgIC8+CisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PSBCVUlMRDogQ2xlYW4gRGlyZWN0b3J5ID09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJidWlsZC1jbGVhbiI+CisgICAgPGRlbGV0ZSBkaXI9IiR7dGVzdGVyLmJ1aWxkfSIvPgorICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT0gQlVJTEQ6IFJlYnVpbGQgRXZlcnl0aGluZyA9PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iYWxsIiBkZXBlbmRzPSJidWlsZC1jbGVhbixidWlsZC1tYWluIi8+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PT0gREVQTE9ZOiBDcmVhdGUgRGlyZWN0b3JpZXMgPT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImRlcGxveS1wcmVwYXJlIj4KKyAgICA8bWtkaXIgZGlyPSIke3Rlc3Rlci5kZXBsb3l9Ii8+CisgICAgPG1rZGlyIGRpcj0iJHt0ZXN0ZXIuZGVwbG95fS9iaW4iLz4KKyAgICA8bWtkaXIgZGlyPSIke3Rlc3Rlci5kZXBsb3l9L2NvbmYiLz4KKyAgPC90YXJnZXQ+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PT0gREVQTE9ZOiBDb3B5IFN0YXRpYyBGaWxlcyA9PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImRlcGxveS1zdGF0aWMiIGRlcGVuZHM9ImJ1aWxkLW1haW4sZGVwbG95LXByZXBhcmUiPgorCisgICAgPCEtLSBFeGVjdXRhYmxlIENvbW1hbmRzIC0tPgorICAgIDxjb3B5IHRvZGlyPSIke3Rlc3Rlci5kZXBsb3l9L2JpbiI+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7dGVzdGVyLmJ1aWxkfS9iaW4iIC8+CisgICAgPC9jb3B5PgorICAgIDxmaXhjcmxmIHNyY2Rpcj0iJHt0ZXN0ZXIuZGVwbG95fS9iaW4iIGluY2x1ZGVzPSIqLnNoIiAgZW9sPSJsZiIvPgorICAgIDxmaXhjcmxmIHNyY2Rpcj0iJHt0ZXN0ZXIuZGVwbG95fS9iaW4iIGluY2x1ZGVzPSIqLmJhdCIgZW9sPSJjcmxmIi8+CisgICAgPGNobW9kIHBlcm09Iit4IiBmaWxlPSIke3Rlc3Rlci5kZXBsb3l9L2Jpbi90ZXN0ZXIuc2giLz4KKyAgICA8Y29weSB0b2Rpcj0iJHt0ZXN0ZXIuZGVwbG95fS9jb25mIiBvdmVyd3JpdGU9InRydWUiPgorICAgICAgPGZpbGVzZXQgZGlyPSIke3Rlc3Rlci5idWlsZH0vY29uZiIgLz4KKyAgICA8L2NvcHk+CisKKyAgICA8IS0tIFVucGFja2VkIFNoYXJlZCBDbGFzc2VzIC0tPgorICAgIDxta2RpciAgIGRpcj0iJHt0ZXN0ZXIuZGVwbG95fS9zaGFyZWQvY2xhc3NlcyIvPgorICAgIDxjb3B5ICB0b2Rpcj0iJHt0ZXN0ZXIuZGVwbG95fS9zaGFyZWQvY2xhc3NlcyI+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7dGVzdGVyLmJ1aWxkfS9jbGFzc2VzIj4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovdW5wc2hhcmVkLyoiLz4KKyAgICAgIDwvZmlsZXNldD4KKyAgICA8L2NvcHk+CisKKyAgICA8IS0tIFNoYXJlZCBMaWJyYXJ5IC0tPgorICAgIDxta2RpciAgIGRpcj0iJHt0ZXN0ZXIuZGVwbG95fS9zaGFyZWQvbGliIi8+CisgICAgPGphciBqYXJmaWxlPSIke3Rlc3Rlci5kZXBsb3l9L3NoYXJlZC9saWIvdGVzdGVyLXNoYXJlZC5qYXIiPgorICAgICAgPGZpbGVzZXQgZGlyPSIke3Rlc3Rlci5idWlsZH0vY2xhc3NlcyI+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqL3NoYXJlZC8qIi8+CisgICAgICA8L2ZpbGVzZXQ+CisgICAgPC9qYXI+CisKKyAgICA8IS0tIFdlYiBBcHBsaWNhdGlvbiAtLT4KKyAgICA8bWtkaXIgIGRpcj0iJHt0ZXN0ZXIuZGVwbG95fS93ZWJhcHBzL3Rlc3RlciIvPgorICAgIDxjb3B5IHRvZGlyPSIke3Rlc3Rlci5kZXBsb3l9L3dlYmFwcHMvdGVzdGVyIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHt0ZXN0ZXIuYnVpbGR9L3dlYiIvPgorICAgIDwvY29weT4KKworICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PSBERVBMT1k6IENyZWF0ZSBUZXN0ZXIgSkFSID09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iZGVwbG95LW1haW4iIGRlcGVuZHM9ImRlcGxveS1zdGF0aWMiLz4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PSBERVBMT1k6IERlcGxveSBUZXN0ZXIgQnVpbGQgPT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iZGVwbG95IiBkZXBlbmRzPSJkZXBsb3ktbWFpbiIvPgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09IERFUExPWTogQ2xlYW4gRGlyZWN0b3JpZXMgPT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJkZXBsb3ktY2xlYW4iPgorICAgIDxkZWxldGUgZGlyPSIke3Rlc3Rlci5kZXBsb3l9L3dlYmFwcHMvdGVzdGVyIi8+CisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09IERJU1Q6IENyZWF0ZSBEaXN0cmlidXRpb24gPT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJkaXN0IiBkZXBlbmRzPSJidWlsZC1tYWluIj4KKworICAgIDxta2RpciBkaXI9IiR7dGVzdGVyLmRpc3R9L2JpbiIvPgorICAgIDxjb3B5IHRvZGlyPSIke3Rlc3Rlci5kaXN0fS9iaW4iPgorICAgICAgPGZpbGVzZXQgZGlyPSIke3Rlc3Rlci5idWlsZH0vYmluIiAvPgorICAgIDwvY29weT4KKyAgICA8Zml4Y3JsZiBzcmNkaXI9IiR7dGVzdGVyLmRpc3R9L2JpbiIgaW5jbHVkZXM9Iiouc2giICBlb2w9ImxmIi8+CisgICAgPGZpeGNybGYgc3JjZGlyPSIke3Rlc3Rlci5kaXN0fS9iaW4iIGluY2x1ZGVzPSIqLmJhdCIgZW9sPSJjcmxmIi8+CisgICAgPGNobW9kIHBlcm09Iit4IiBmaWxlPSIke3Rlc3Rlci5kaXN0fS9iaW4vdGVzdGVyLnNoIi8+CisKKyAgICA8bWtkaXIgICBkaXI9IiR7dGVzdGVyLmRpc3R9L3dlYmFwcHMiLz4KKyAgICA8amFyIGphcmZpbGU9IiR7dGVzdGVyLmRpc3R9L3dlYmFwcHMvdGVzdGVyLndhciIKKyAgICAgICAgIGJhc2VkaXI9IiR7dGVzdGVyLmJ1aWxkfS93ZWIiLz4KKworICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09IERJU1Q6IENsZWFuIERpcmVjdG9yeSA9PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iZGlzdC1jbGVhbiI+CisgICAgPGRlbGV0ZSBkaXI9IiR7dGVzdGVyLmRpc3R9Ii8+CisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09IENvbnZlbmllbnQgU3lub255bXMgPT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJjbGVhbiIgZGVwZW5kcz0iYnVpbGQtY2xlYW4sIGRpc3QtY2xlYW4iLz4KKworCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy9iaW4vdGVzdGVyLnhtbCBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL2Jpbi90ZXN0ZXIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0YzdlOWUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy9iaW4vdGVzdGVyLnhtbApAQCAtMCwwICsxLDE5MjMgQEAKKzxwcm9qZWN0IG5hbWU9IlRlc3RlciIgZGVmYXVsdD0iYWxsIj4KKworICA8IS0tID09PT09PT09PT0gR2xvYmFsIFByb3BlcnRpZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8cHJvcGVydHkgbmFtZT0iY2F0YWxpbmEuaG9tZSIgIHZhbHVlPSIuLi8uLi9idWlsZC90b21jYXQtNC4wIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJkZWJ1ZyIgICAgICAgICAgdmFsdWU9IjAiLz4KKyAgPHByb3BlcnR5IG5hbWU9Imhvc3QiICAgICAgICAgICB2YWx1ZT0ibG9jYWxob3N0Ii8+CisgIDxwcm9wZXJ0eSBuYW1lPSJwb3J0IiAgICAgICAgICAgdmFsdWU9IjgwODAiLz4KKzwhLS0gIDxwcm9wZXJ0eSBuYW1lPSJwcm90b2NvbCIgICAgICAgdmFsdWU9IkhUVFAvMS4wIi8+IC0tPgorICA8cHJvcGVydHkgbmFtZT0icHJvdG9jb2wiICAgICAgIHZhbHVlPSJIVFRQLzEuMCIvPiA8IS0tIFVzZSBIdHRwVVJMQ29ubmVjdGlvbiAtLT4KKyAgPHByb3BlcnR5IG5hbWU9ImNvbnRleHQucGF0aCIgICB2YWx1ZT0iL3Rlc3RlciIvPgorICA8cHJvcGVydHkgbmFtZT0ianNwLWV4YW1wbGVzLnBhdGgiICB2YWx1ZT0iL2pzcC1leGFtcGxlcyIvPgorICA8cHJvcGVydHkgbmFtZT0ic2VydmxldHMtZXhhbXBsZXMucGF0aCIgIHZhbHVlPSIvc2VydmxldHMtZXhhbXBsZXMiLz4KKyAgPHByb3BlcnR5IG5hbWU9ImdvbGRlbi5wYXRoIiAgICB2YWx1ZT0iJHtjb250ZXh0LnBhdGh9L2dvbGRlbiIvPgorICA8cHJvcGVydHkgbmFtZT0ibWFuYWdlci5wYXRoIiAgIHZhbHVlPSIvbWFuYWdlciIvPgorICA8cHJvcGVydHkgbmFtZT0icmVsb2FkLnBhdGgiICAgIHZhbHVlPSIvdGVzdGVyIi8+CisgIDx0YXNrZGVmICBuYW1lPSJ0ZXN0ZXIiICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudGVzdGVyLlRlc3RDbGllbnQiPgorICAgIDxjbGFzc3BhdGg+CisgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y2F0YWxpbmEuaG9tZX0vd2ViYXBwcy90ZXN0ZXIvV0VCLUlORi9saWIvdGVzdGVyLmphciIvPgorICAgIDwvY2xhc3NwYXRoPgorICA8L3Rhc2tkZWY+CisKKworICA8dGFyZ2V0IG5hbWU9ImFsbCIgZGVwZW5kcz0iUk9PVCxBdXRoZW50aWNhdGlvbixDYXNlU2Vuc2l0aXZlLERlY29kaW5nLEVycm9yUGFnZSxGaWx0ZXJSZXF1ZXN0LEZpbHRlclJlc3BvbnNlLEpuZGksSnNwLExpZmVjeWNsZSxSZXF1ZXN0RGlzcGF0Y2hlcixSZXNvdXJjZXMsU2VjdXJpdHksU2VydmxldENvbnRleHQsU2VydmxldFJlcXVlc3QsU2VydmxldFJlc3BvbnNlLEh0dHBTZXNzaW9uLFhlcmNlc1Rlc3QiLz4KKworICA8dGFyZ2V0IG5hbWU9IlJPT1QiPgorCisgICAgPCEtLSA9PT09PT09PT09IEJhc2ljIFJ1biBTdGF0ZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKyAgICA8IS0tIFNob3VsZCBiZSBhYmxlIHRvIHNlZSB0aGUgaG9tZSBwYWdlIC0tPgorICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iL2luZGV4LmpzcCIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgIHN0YXR1cz0iMjAwIi8+CisKKyAgICA8IS0tIFNob3VsZCBiZSBhYmxlIHRvIHVzZSByZWxhdGl2ZSBwYXRoIHRvIGRvY3VtZW50IHJvb3QgLS0+CisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2pzcC1leGFtcGxlcy5wYXRofS8uLiIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgIHN0YXR1cz0iMjAwIi8+CisKKyAgICA8IS0tIFNob3VsZCBiZSBhYmxlIHRvIHN1Y2Nlc3NmdWxseSByZXRyaWV2ZSBhIGdvbGRlbiBmaWxlIC0tPgorICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L0dvbGRlbjAxIgorICAgICAgICAgIGdvbGRlbj0iJHtnb2xkZW4ucGF0aH0vR29sZGVuMDEudHh0Ii8+CisKKyAgICA8IS0tIFNob3VsZCBiZSBhYmxlIHRvIHN1Y2Nlc3NmdWxseSByZXRyaWV2ZSBhIGdvbGRlbiBmaWxlIC0tPgorICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1dyYXBwZWRHb2xkZW4wMSIKKyAgICAgICAgICBnb2xkZW49IiR7Z29sZGVuLnBhdGh9L0dvbGRlbjAxLnR4dCIvPgorCisgIDwvdGFyZ2V0PgorCisKKyAgPHRhcmdldCBuYW1lPSJBdXRoZW50aWNhdGlvbiI+CisKKyAgICA8IS0tID09PT09PT09PT0gQXV0aGVudGljYXRpb24gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworICAgIDwhLS0gT25jZSBhIHVzZXIgaGFzIGJlZW4gYXV0aGVudGljYXRlZCwgdGhlIGNvcnJlc3BvbmRpbmcgdXNlciBpZGVudGl0eQorICAgICAgICAgc2hvdWxkIGJlIHZpc2libGUgdG8gYWxsIG90aGVyIHJlcXVlc3RzIGluIHRoaXMgd2ViIGFwcGxpY2F0aW9uLCBldmVuCisgICAgICAgICBmb3IgVVJJcyB0aGF0IGFyZSBub3QgcHJvdGVjdGVkIGJ5IHNlY3VyaXR5IGNvbnN0cmFpbnRzLiAgVGhpcyBpcworICAgICAgICAgdGVzdGVkIGJ5IGludm9raW5nIGEgcHJvdGVjdGVkIFVSSSBmb2xsb3dlZCBieSBhIG5vbi1wcm90ZWN0ZWQgVVJJCisgICAgLS0+CisKKyAgICA8IS0tID09PT09PT09PT0gQmFzaWMgQWNjZXNzIHRvIEF1dGhlbnRpY2F0ZWQgUmVzb3VyY2VzID09PT09PT09PT09PT09PSAtLT4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9wcm90ZWN0ZWQvQXV0aGVudGljYXRpb24wMSIKKyAgICAgICBpbkhlYWRlcnM9IkF1dGhvcml6YXRpb246QmFzaWMgZEc5dFkyRjBPblJ2YldOaGRBPT0iCisgICAgICBvdXRDb250ZW50PSJBdXRoZW50aWNhdGlvbjAxIFBBU1NFRCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICAgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L3Byb3RlY3RlZC9BdXRoZW50aWNhdGlvbjAyIgorICAgICAgIGluSGVhZGVycz0iQXV0aG9yaXphdGlvbjpCYXNpYyBkRzl0WTJGME9uUnZiV05oZEE9PSIKKyAgICAgIG91dENvbnRlbnQ9IkF1dGhlbnRpY2F0aW9uMDIgUEFTU0VEIi8+CisKKyAgICA8IS0tIFRlc3QgaXNVc2VySW5Sb2xlKCkgb24gYWN0dWFsIHJvbGUgYW5kIG9uIGFuIGFsaWFzIChzZXJ2bGV0KSAtLT4KKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vcHJvdGVjdGVkL0F1dGhlbnRpY2F0aW9uMDMiCisgICAgICAgaW5IZWFkZXJzPSJBdXRob3JpemF0aW9uOkJhc2ljIGRHOXRZMkYwT25SdmJXTmhkQT09IgorICAgICAgb3V0Q29udGVudD0iQXV0aGVudGljYXRpb24wMyBQQVNTRUQiLz4KKworICAgIDwhLS0gVGVzdCBpc1VzZXJJblJvbGUoKSBvbiBhY3R1YWwgcm9sZSBhbmQgb24gYW4gYWxpYXMgKEpTUCBwYWdlKSAtLT4KKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vcHJvdGVjdGVkL0F1dGhlbnRpY2F0aW9uMDQiCisgICAgICAgaW5IZWFkZXJzPSJBdXRob3JpemF0aW9uOkJhc2ljIGRHOXRZMkYwT25SdmJXTmhkQT09IgorICAgICAgb3V0Q29udGVudD0iQXV0aGVudGljYXRpb24wNCBQQVNTRUQiLz4KKworICAgIDwhLS0gPT09PT09PT09PSAiQWxsIEFsbG93ZWQiIGFuZCAiQWxsIERpc2FsbG93ZWQiIEFjY2VzcyA9PT09PT09PT09PT09IC0tPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iSFRUUC8xLjAiCisgICAgICAgICAgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L2FsbG93ZWQvQXV0aGVudGljYXRpb24wNSIKKyAgICAgICBpbkhlYWRlcnM9IkF1dGhvcml6YXRpb246QmFzaWMgZEc5dFkyRjBPblJ2YldOaGRBPT0iCisgICAgICBvdXRDb250ZW50PSJBdXRoZW50aWNhdGlvbjA1IFBBU1NFRCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iSFRUUC8xLjAiCisgICAgICAgICAgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L2Rpc2FsbG93ZWQvQXV0aGVudGljYXRpb24wNSIKKyAgICAgICBpbkhlYWRlcnM9IkF1dGhvcml6YXRpb246QmFzaWMgZEc5dFkyRjBPblJ2YldOaGRBPT0iCisgICAgICAgICAgc3RhdHVzPSI0MDMiLz4KKworICA8L3RhcmdldD4KKworCisgIDx0YXJnZXQgbmFtZT0iQ2FzZVNlbnNpdGl2ZSI+CisKKyAgICA8IS0tID09PT09PT09PT0gQ2FzZSBTZW5zaXRpdmUgUmVxdWVzdCBVUkkgTWF0Y2hpbmcgPT09PT09PT09PT09PT09PT09PSAtLT4KKworICAgIDwhLS0gTWFrZSBzdXJlIHRoYXQgc3RhdGljIHJlc291cmNlcyBhcmUgbWF0Y2hlZCBjYXNlIHNlbnNpdGl2ZWx5IC0tPgorICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iL2luZGV4LkhUTUwiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgICBzdGF0dXM9IjQwNCIvPgorCisgICAgPCEtLSBTaG91bGQgYmUgYWJsZSB0byBleGVjdXRlIHRoZSBEYXRlIGV4YW1wbGUgLS0+CisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2pzcC1leGFtcGxlcy5wYXRofS9kYXRlcy9kYXRlLmpzcCIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgIHN0YXR1cz0iMjAwIi8+CisKKyAgICA8IS0tIFNob3VsZCBub3QgYmUgYWJsZSB0byB2aWV3IHRoZSBzb3VyY2Ugb2YgdGhlIERhdGUgZXhhbXBsZSAtLT4KKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7anNwLWV4YW1wbGVzLnBhdGh9L2RhdGVzL2RhdGUuSnNwIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICAgc3RhdHVzPSI0MDQiLz4KKworICAgIDwhLS0gU2hvdWxkIG5vdCBiZSBhYmxlIHRvIHZpZXcgdGhlIHNvdXJjZSBvZiB0aGUgRGF0ZSBleGFtcGxlIC0tPgorICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtqc3AtZXhhbXBsZXMucGF0aH0vZGF0ZXMvRGF0ZS5qc3AiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgICBzdGF0dXM9IjQwNCIvPgorCisgICAgPCEtLSBTaG91bGQgbm90IGJlIGFibGUgdG8gdmlldyB0aGUgc291cmNlIG9mIHRoZSBEYXRlIGV4YW1wbGUgLS0+CisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2pzcC1leGFtcGxlcy5wYXRofS9EYXRlcy9kYXRlLmpzcCIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgIHN0YXR1cz0iNDA0Ii8+CisKKyAgICA8IS0tIFNob3VsZCBiZSBhYmxlIHRvIGV4ZWN1dGUgdGhlIEhlbGxvV29ybGQgc2VydmxldCBleGFtcGxlIC0tPgorICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtzZXJ2bGV0cy1leGFtcGxlcy5wYXRofS9zZXJ2bGV0L0hlbGxvV29ybGRFeGFtcGxlIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICAgc3RhdHVzPSIyMDAiLz4KKworICAgIDwhLS0gU2hvdWxkIG5vdCBiZSBhYmxlIHRvIGV4ZWN1dGUgSGVsbG9Xb3JsZCB3aXRoIGRpZmZlcmVudCBjYXNlcyAtLT4KKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7c2VydmxldHMtZXhhbXBsZXMucGF0aH0vc2VydmxldC9oZWxsb1dvcmxkRXhhbXBsZSIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgIHN0YXR1cz0iNDA0Ii8+CisKKyAgICA8IS0tIFNob3VsZCBub3QgYmUgYWJsZSB0byBleGVjdXRlIEhlbGxvV29ybGQgd2l0aCBkaWZmZXJlbnQgY2FzZXMgLS0+CisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke3NlcnZsZXRzLWV4YW1wbGVzLnBhdGh9L1NlcnZsZXQvSGVsbG9Xb3JsZEV4YW1wbGUiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgICBzdGF0dXM9IjQwNCIvPgorCisgIDwvdGFyZ2V0PgorCisKKyAgPHRhcmdldCBuYW1lPSJEZWNvZGluZyI+CisKKyAgICA8IS0tID09PT09PT09PT0gVVJMIERlY29kaW5nIFRlc3RzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L0RlY29kaW5nMDE/c2VydmxldD0vRGVjb2RpbmcwMSIKKyAgICAgIG91dENvbnRlbnQ9IkRlY29kaW5nMDEgUEFTU0VEIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9EZWNvZGluZzAxL2V4dHJhP3NlcnZsZXQ9L0RlY29kaW5nMDEmYW1wO3BhdGg9L2V4dHJhIgorICAgICAgb3V0Q29udGVudD0iRGVjb2RpbmcwMSBQQVNTRUQiLz4KKyAKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9EZWNvZGluZzAlMzE/c2VydmxldD0vRGVjb2RpbmcwMSIKKyAgICAgIG91dENvbnRlbnQ9IkRlY29kaW5nMDEgUEFTU0VEIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9EZWNvZGluZzAxL2V4dHIlNjE/c2VydmxldD0vRGVjb2RpbmcwMSZhbXA7cGF0aD0vZXh0cmEiCisgICAgICBvdXRDb250ZW50PSJEZWNvZGluZzAxIFBBU1NFRCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vRGVjb2RpbmcwJTMxL2V4dHIlNjE/c2VydmxldD0vRGVjb2RpbmcwMSZhbXA7cGF0aD0vZXh0cmEiCisgICAgICBvdXRDb250ZW50PSJEZWNvZGluZzAxIFBBU1NFRCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vV3JhcHBlZERlY29kaW5nMDE/c2VydmxldD0vV3JhcHBlZERlY29kaW5nMDEiCisgICAgICBvdXRDb250ZW50PSJEZWNvZGluZzAxIFBBU1NFRCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vV3JhcHBlZERlY29kaW5nMDEvZXh0cmE/c2VydmxldD0vV3JhcHBlZERlY29kaW5nMDEmYW1wO3BhdGg9L2V4dHJhIgorICAgICAgb3V0Q29udGVudD0iRGVjb2RpbmcwMSBQQVNTRUQiLz4KKyAKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9XcmFwcGVkRGVjb2RpbmcwJTMxP3NlcnZsZXQ9L1dyYXBwZWREZWNvZGluZzAxIgorICAgICAgb3V0Q29udGVudD0iRGVjb2RpbmcwMSBQQVNTRUQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1dyYXBwZWREZWNvZGluZzAxL2V4dHIlNjE/c2VydmxldD0vV3JhcHBlZERlY29kaW5nMDEmYW1wO3BhdGg9L2V4dHJhIgorICAgICAgb3V0Q29udGVudD0iRGVjb2RpbmcwMSBQQVNTRUQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1dyYXBwZWREZWNvZGluZzAlMzEvZXh0ciU2MT9zZXJ2bGV0PS9XcmFwcGVkRGVjb2RpbmcwMSZhbXA7cGF0aD0vZXh0cmEiCisgICAgICBvdXRDb250ZW50PSJEZWNvZGluZzAxIFBBU1NFRCIvPgorCisgICAgPCEtLSBWZXJpZnkgd2UgY2FuIGFjY2VzcyB0aGUgSlNQIHBhZ2Ugbm9ybWFsbHkgLS0+CisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2pzcC1leGFtcGxlcy5wYXRofS9zbnAvc25vb3AuanNwIgorICAgICAgICAgIHN0YXR1cz0iMjAwIi8+CisKKyAgPC90YXJnZXQ+CisKKworICA8dGFyZ2V0IG5hbWU9IkVycm9yUGFnZSI+CisKKyAgICA8IS0tID09PT09PT09PT0gRXJyb3IgQ29kZSBNYXBwaW5nID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L0Vycm9yUGFnZTAxIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICBvdXRDb250ZW50PSJFcnJvclBhZ2UwMiBQQVNTRUQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1dyYXBwZWRFcnJvclBhZ2UwMSIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgb3V0Q29udGVudD0iRXJyb3JQYWdlMDIgUEFTU0VEIi8+CisKKworICAgIDwhLS0gPT09PT09PT09PSBFeGNlcHRpb24gTWFwcGluZyAoU2VydmxldCBTb3VyY2UpID09PT09PT09PT09PT09PT09PT09IC0tPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vRXJyb3JQYWdlMDMiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgICBzdGF0dXM9IjIwMCIKKyAgICAgIG91dENvbnRlbnQ9IkVycm9yUGFnZTA0IFBBU1NFRCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vV3JhcHBlZEVycm9yUGFnZTAzIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICAgc3RhdHVzPSIyMDAiCisgICAgICBvdXRDb250ZW50PSJFcnJvclBhZ2UwNCBQQVNTRUQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L0Vycm9yUGFnZTA1P3R5cGU9QXJpdGhtZXRpYyIKKyAgICAgICAgICAgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgIHN0YXR1cz0iMjAwIgorICAgICAgb3V0Q29udGVudD0iRXJyb3JQYWdlMDYgUEFTU0VEIC0gU0VSVkxFVCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vV3JhcHBlZEVycm9yUGFnZTA1P3R5cGU9QXJpdGhtZXRpYyIKKyAgICAgICAgICAgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgIHN0YXR1cz0iMjAwIgorICAgICAgb3V0Q29udGVudD0iRXJyb3JQYWdlMDYgUEFTU0VEIC0gU0VSVkxFVCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vRXJyb3JQYWdlMDU/dHlwZT1BcnJheSIKKyAgICAgICAgICAgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgIHN0YXR1cz0iNTAwIgorICAgICAgb3V0Q29udGVudD0iRXJyb3JQYWdlMDYgUEFTU0VEIC0gSlNQIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9XcmFwcGVkRXJyb3JQYWdlMDU/dHlwZT1BcnJheSIKKyAgICAgICAgICAgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgIHN0YXR1cz0iNTAwIgorICAgICAgb3V0Q29udGVudD0iRXJyb3JQYWdlMDYgUEFTU0VEIC0gSlNQIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9FcnJvclBhZ2UwNT90eXBlPU51bWJlciIKKyAgICAgICAgICAgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgIHN0YXR1cz0iNTAwIgorICAgICAgb3V0Q29udGVudD0iRXJyb3JQYWdlMDYgUEFTU0VEIC0gSFRNTCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vV3JhcHBlZEVycm9yUGFnZTA1P3R5cGU9TnVtYmVyIgorICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICAgc3RhdHVzPSI1MDAiCisgICAgICBvdXRDb250ZW50PSJFcnJvclBhZ2UwNiBQQVNTRUQgLSBIVE1MIi8+CisKKyAgICA8IS0tID09PT09PT09PT0gTG9hZCBPbiBTdGFydHVwIEV4Y2VwdGlvbiBIYW5kbGluZyA9PT09PT09PT09PT09PT09PT09PSAtLT4KKworICAgIDwhLS0gTk9URTogSHR0cFVSTENvbm5lY3Rpb24gdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBvbiA1MDNzIC0tPgorICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IkhUVFAvMS4wIgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L0Vycm9yUGFnZTA3IgorICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICAgc3RhdHVzPSI0MDQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IkhUVFAvMS4wIgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1dyYXBwZWRFcnJvclBhZ2UwNyIKKyAgICAgICAgICAgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgIHN0YXR1cz0iNDA0Ii8+CisKKyAgICA8IS0tID09PT09PT09PT0gRXhjZXB0aW9uIE1hcHBpbmcgKEpTUCBTb3VyY2UpID09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L0Vycm9yUGFnZTA4P3R5cGU9QXJpdGhtZXRpYyIKKyAgICAgICAgICAgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgIHN0YXR1cz0iMjAwIgorICAgICAgb3V0Q29udGVudD0iRXJyb3JQYWdlMDYgUEFTU0VEIC0gU0VSVkxFVCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vV3JhcHBlZEVycm9yUGFnZTA4P3R5cGU9QXJpdGhtZXRpYyIKKyAgICAgICAgICAgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgIHN0YXR1cz0iMjAwIgorICAgICAgb3V0Q29udGVudD0iRXJyb3JQYWdlMDYgUEFTU0VEIC0gU0VSVkxFVCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vRXJyb3JQYWdlMDg/dHlwZT1BcnJheSIKKyAgICAgICAgICAgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgIHN0YXR1cz0iNTAwIgorICAgICAgb3V0Q29udGVudD0iRXJyb3JQYWdlMDYgUEFTU0VEIC0gSlNQIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9XcmFwcGVkRXJyb3JQYWdlMDg/dHlwZT1BcnJheSIKKyAgICAgICAgICAgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgIHN0YXR1cz0iNTAwIgorICAgICAgb3V0Q29udGVudD0iRXJyb3JQYWdlMDYgUEFTU0VEIC0gSlNQIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9FcnJvclBhZ2UwOD90eXBlPU51bWJlciIKKyAgICAgICAgICAgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgIHN0YXR1cz0iNTAwIgorICAgICAgb3V0Q29udGVudD0iRXJyb3JQYWdlMDYgUEFTU0VEIC0gSFRNTCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vV3JhcHBlZEVycm9yUGFnZTA4P3R5cGU9TnVtYmVyIgorICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICAgc3RhdHVzPSI1MDAiCisgICAgICBvdXRDb250ZW50PSJFcnJvclBhZ2UwNiBQQVNTRUQgLSBIVE1MIi8+CisKKyAgICA8IS0tID09PT09PT09PT0gRXhjZXB0aW9uIE1hcHBpbmcgKEpTUCBFcnJvciBQYWdlKSA9PT09PT09PT09PT09PT09PT09PSAtLT4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L0Vycm9yUGFnZTA5IgorICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICAgc3RhdHVzPSI1MDAiCisgICAgICBvdXRDb250ZW50PSJFcnJvclBhZ2UxMCBQQVNTRUQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1dyYXBwZWRFcnJvclBhZ2UwOSIKKyAgICAgICAgICAgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgIHN0YXR1cz0iNTAwIgorICAgICAgb3V0Q29udGVudD0iRXJyb3JQYWdlMTAgUEFTU0VEIi8+CisKKyAgPC90YXJnZXQ+CisKKworICA8dGFyZ2V0IG5hbWU9IkZpbHRlclJlcXVlc3QiPgorCisgICAgPCEtLSA9PT09PT09PT09IEFwcGx5IFVwcGVyIENhc2UgRmlsdGVyID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKyAgICA8IS0tIElucHV0IHZpYSBidWZmZXJlZCByZWFkZXIgLS0+CisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iSFRUUC8xLjAiCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vRmlsdGVyUmVxdWVzdDAxP3R5cGU9cmVhZGVyIgorICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICAgc3RhdHVzPSIyMDAiCisgICAgICAgaW5Db250ZW50PSJGaWx0ZXJSZXF1ZXN0MDEgVW53cmFwcGVkIFJlYWRlciBQQVNTRUQiCisgICAgICBvdXRDb250ZW50PSJGSUxURVJSRVFVRVNUMDEgVU5XUkFQUEVEIFJFQURFUiBQQVNTRUQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IkhUVFAvMS4wIgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1dyYXBwZWRGaWx0ZXJSZXF1ZXN0MDE/dHlwZT1yZWFkZXIiCisgICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgICBzdGF0dXM9IjIwMCIKKyAgICAgICBpbkNvbnRlbnQ9IkZpbHRlclJlcXVlc3QwMSBXcmFwcGVkIFJlYWRlciBQQVNTRUQiCisgICAgICBvdXRDb250ZW50PSJGSUxURVJSRVFVRVNUMDEgV1JBUFBFRCBSRUFERVIgUEFTU0VEIi8+CisKKyAgICA8IS0tIElucHV0IHZpYSBzZXJ2bGV0IGlucHV0IHN0cmVhbSAtLT4KKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSJIVFRQLzEuMCIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9GaWx0ZXJSZXF1ZXN0MDE/dHlwZT1yZWFkZXIiCisgICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgICBzdGF0dXM9IjIwMCIKKyAgICAgICBpbkNvbnRlbnQ9IkZpbHRlclJlcXVlc3QwMSBVbndyYXBwZWQgU3RyZWFtIFBBU1NFRCIKKyAgICAgIG91dENvbnRlbnQ9IkZJTFRFUlJFUVVFU1QwMSBVTldSQVBQRUQgU1RSRUFNIFBBU1NFRCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iSFRUUC8xLjAiCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vV3JhcHBlZEZpbHRlclJlcXVlc3QwMT90eXBlPXJlYWRlciIKKyAgICAgICAgICAgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgIHN0YXR1cz0iMjAwIgorICAgICAgIGluQ29udGVudD0iRmlsdGVyUmVxdWVzdDAxIFdyYXBwZWQgU3RyZWFtIFBBU1NFRCIKKyAgICAgIG91dENvbnRlbnQ9IkZJTFRFUlJFUVVFU1QwMSBXUkFQUEVEIFNUUkVBTSBQQVNTRUQiLz4KKworICAgIDwhLS0gPT09PT09PT09PSBTZXJ2bGV0IFNlZXMgQXBwbGljYXRpb24gV3JhcHBlciA9PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSJIVFRQLzEuMCIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L0ZpbHRlclJlcXVlc3QwMj93cmFwPWZhbHNlIgorICAgICAgb3V0Q29udGVudD0iRmlsdGVyUmVxdWVzdDAyIFBBU1NFRCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iSFRUUC8xLjAiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9XcmFwcGVkRmlsdGVyUmVxdWVzdDAyP3dyYXA9dHJ1ZSIKKyAgICAgIG91dENvbnRlbnQ9IkZpbHRlclJlcXVlc3QwMiBQQVNTRUQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IkhUVFAvMS4wIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vRmlsdGVyUmVxdWVzdDAyP3dyYXA9ZmFsc2UmYW1wO2Rpc3BhdGNoPUYiCisgICAgICBvdXRDb250ZW50PSJGaWx0ZXJSZXF1ZXN0MDIgUEFTU0VEIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSJIVFRQLzEuMCIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1dyYXBwZWRGaWx0ZXJSZXF1ZXN0MDI/d3JhcD10cnVlJmFtcDtkaXNwYXRjaD1GIgorICAgICAgb3V0Q29udGVudD0iRmlsdGVyUmVxdWVzdDAyIFBBU1NFRCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iSFRUUC8xLjAiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9GaWx0ZXJSZXF1ZXN0MDI/d3JhcD1mYWxzZSZhbXA7ZGlzcGF0Y2g9SSIKKyAgICAgIG91dENvbnRlbnQ9IkZpbHRlclJlcXVlc3QwMiBQQVNTRUQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IkhUVFAvMS4wIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vV3JhcHBlZEZpbHRlclJlcXVlc3QwMj93cmFwPXRydWUmYW1wO2Rpc3BhdGNoPUkiCisgICAgICBvdXRDb250ZW50PSJGaWx0ZXJSZXF1ZXN0MDIgUEFTU0VEIi8+CisKKyAgPC90YXJnZXQ+CisKKworICA8dGFyZ2V0IG5hbWU9IkZpbHRlclJlc3BvbnNlIj4KKworICAgIDwhLS0gPT09PT09PT09PSBBcHBseSBVcHBlciBDYXNlIEZpbHRlciA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCisgICAgPCEtLSBPdXRwdXQgZnJvbSBhIHNlcnZsZXQgLS0+CisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vRmlsdGVyUmVzcG9uc2UwMSIKKyAgICAgICAgICAgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgIHN0YXR1cz0iMjAwIgorICAgICAgb3V0Q29udGVudD0iRklMVEVSUkVTUE9OU0UwMSBQQVNTRUQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1dyYXBwZWRGaWx0ZXJSZXNwb25zZTAxIgorICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICAgc3RhdHVzPSIyMDAiCisgICAgICBvdXRDb250ZW50PSJGSUxURVJSRVNQT05TRTAxIFBBU1NFRCIvPgorCisgICAgPCEtLSBPdXRwdXQgZnJvbSBhIEpTUCBQYWdlIC0tPgorICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L0ZpbHRlclJlc3BvbnNlMDIuanNwIgorICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICAgc3RhdHVzPSIyMDAiCisgICAgICBvdXRDb250ZW50PSJGSUxURVJSRVNQT05TRTAyIFBBU1NFRCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vV3JhcHBlZEZpbHRlclJlc3BvbnNlMDIuanNwIgorICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICAgc3RhdHVzPSIyMDAiCisgICAgICBvdXRDb250ZW50PSJGSUxURVJSRVNQT05TRTAyIFBBU1NFRCIvPgorCisgICAgPCEtLSBPdXRwdXQgZnJvbSBhIHN0YXRpYyBwYWdlIC0tPgorICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L0ZpbHRlclJlc3BvbnNlMDMudHh0IgorICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICAgc3RhdHVzPSIyMDAiCisgICAgICBvdXRDb250ZW50PSJGSUxURVJSRVNQT05TRTAzIFBBU1NFRCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vV3JhcHBlZEZpbHRlclJlc3BvbnNlMDMudHh0IgorICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICAgc3RhdHVzPSIyMDAiCisgICAgICBvdXRDb250ZW50PSJGSUxURVJSRVNQT05TRTAzIFBBU1NFRCIvPgorCisgICAgPCEtLSA9PT09PT09PT09IFNlcnZsZXQgU2VlcyBBcHBsaWNhdGlvbiBXcmFwcGVyID09PT09PT09PT09PT09PT09PT09PSAtLT4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IkhUVFAvMS4wIgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L0ZpbHRlclJlc3BvbnNlMDQ/d3JhcD1mYWxzZSIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgb3V0Q29udGVudD0iRmlsdGVyUmVzcG9uc2UwNCBQQVNTRUQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IkhUVFAvMS4wIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vV3JhcHBlZEZpbHRlclJlc3BvbnNlMDQ/d3JhcD10cnVlIgorICAgICAgb3V0Q29udGVudD0iRmlsdGVyUmVzcG9uc2UwNCBQQVNTRUQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IkhUVFAvMS4wIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vRmlsdGVyUmVzcG9uc2UwND93cmFwPWZhbHNlJmFtcDtkaXNwYXRjaD1GIgorICAgICAgb3V0Q29udGVudD0iRmlsdGVyUmVzcG9uc2UwNCBQQVNTRUQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IkhUVFAvMS4wIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vV3JhcHBlZEZpbHRlclJlc3BvbnNlMDQ/d3JhcD10cnVlJmFtcDtkaXNwYXRjaD1GIgorICAgICAgb3V0Q29udGVudD0iRmlsdGVyUmVzcG9uc2UwNCBQQVNTRUQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IkhUVFAvMS4wIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vRmlsdGVyUmVzcG9uc2UwND93cmFwPWZhbHNlJmFtcDtkaXNwYXRjaD1JIgorICAgICAgb3V0Q29udGVudD0iRmlsdGVyUmVzcG9uc2UwNCBQQVNTRUQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IkhUVFAvMS4wIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vV3JhcHBlZEZpbHRlclJlc3BvbnNlMDQ/d3JhcD10cnVlJmFtcDtkaXNwYXRjaD1JIgorICAgICAgb3V0Q29udGVudD0iRmlsdGVyUmVzcG9uc2UwNCBQQVNTRUQiLz4KKworICA8L3RhcmdldD4KKworCisgIDx0YXJnZXQgbmFtZT0iSW50ZXJuYWxzIj4KKworCisgICAgPCEtLSA9PT09PT09PT09IEFjY2VzcyBJbnRlcm5hbHMgVmlhIFJlZmxlY3Rpb24gPT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9SZWZsZWN0aW9uMDEiCisgICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgIG91dENvbnRlbnQ9IlJlZmxlY3Rpb24wMSBQQVNTRUQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1dyYXBwZWRSZWZsZWN0aW9uMDEiCisgICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgIG91dENvbnRlbnQ9IlJlZmxlY3Rpb24wMSBQQVNTRUQiLz4KKworICA8L3RhcmdldD4KKworCisgIDx0YXJnZXQgbmFtZT0iSm5kaSI+CisKKyAgICA8IS0tID09PT09PT09PT0gSk5ESSBOYW1pbmcgQ29udGV4dCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworICAgIDwhLS0gUGVyZm9ybSB0aGUgdGVzdHMgYmVmb3JlIHJlc3RhcnRpbmcgdGhlIGFwcGxpY2F0aW9uIC0tPgorICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L0puZGkwMSIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgb3V0Q29udGVudD0iSm5kaTAxIFBBU1NFRCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vV3JhcHBlZEpuZGkwMSIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgb3V0Q29udGVudD0iSm5kaTAxIFBBU1NFRCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vSm5kaTAyIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICBvdXRDb250ZW50PSJKbmRpMDIgUEFTU0VEIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9XcmFwcGVkSm5kaTAyIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICBvdXRDb250ZW50PSJKbmRpMDIgUEFTU0VEIi8+CisKKyAgICA8IS0tIFJlc3RhcnQgdGhpcyB3ZWIgYXBwbGljYXRpb24gLS0+CisgICAgPCEtLSBOT1RFOiBBc3NpZ24gcm9sZSAibWFuYWdlciIgdG8gdXNlciAidG9tY2F0IiBmb3IgdGhpcyB0byB3b3JrIC0tPgorICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgaW5IZWFkZXJzPSJBdXRob3JpemF0aW9uOkJhc2ljIGRHOXRZMkYwT25SdmJXTmhkQT09IgorICAgICAgICAgcmVxdWVzdD0iJHttYW5hZ2VyLnBhdGh9L3JlbG9hZD9wYXRoPSR7cmVsb2FkLnBhdGh9IgorICAgICAgb3V0Q29udGVudD0iT0sgLSAiLz4KKworICAgIDwhLS0gUmVwZWF0IHRoZSB0ZXN0cyB0byBlbnN1cmUgdGhlIG5hbWluZyBjb250ZXh0IGlzIHJlaW5pdGlhbGl6ZWQgLS0+CisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vSm5kaTAxIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICBvdXRDb250ZW50PSJKbmRpMDEgUEFTU0VEIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9XcmFwcGVkSm5kaTAxIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICBvdXRDb250ZW50PSJKbmRpMDEgUEFTU0VEIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9KbmRpMDIiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgIG91dENvbnRlbnQ9IkpuZGkwMiBQQVNTRUQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1dyYXBwZWRKbmRpMDIiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgIG91dENvbnRlbnQ9IkpuZGkwMiBQQVNTRUQiLz4KKworICA8L3RhcmdldD4KKworCisgIDx0YXJnZXQgbmFtZT0iSnNwIj4KKworICAgIDxlY2hvIG1lc3NhZ2U9Ii0tLS0tIEpTUCBBY2Nlc3MgVG8gQmVhbiBDbGFzc2VzIC0tLS0tIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSJIVFRQLzEuMCIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9Kc3BCZWFuczAxLmpzcCIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgb3V0Q29udGVudD0iSnNwQmVhbnMwMSBQQVNTRUQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IkhUVFAvMS4wIgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L0pzcEJlYW5zMDIuanNwIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICBvdXRDb250ZW50PSJKc3BCZWFuczAyIFBBU1NFRCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iSFRUUC8xLjAiCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vSnNwQmVhbnMwMy5qc3AiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgIG91dENvbnRlbnQ9IkpzcEJlYW5zMDMgUEFTU0VEIi8+CisKKyAgICA8ZWNobyBtZXNzYWdlPSItLS0tLSBqc3A6cGFyYW1zIG5vdCBsZWdhbCBpbiBqc3A6aW5jbHVkZS9mb3J3YXJkIC0tLS0tIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSJIVFRQLzEuMCIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9Kc3BQYXJhbXMwMS5qc3AiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgICBzdGF0dXM9IjUwMCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iSFRUUC8xLjAiCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vSnNwUGFyYW1zMDIuanNwIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICAgc3RhdHVzPSI1MDAiLz4KKworICAgIDxlY2hvIG1lc3NhZ2U9Ii0tLS0tIENoYXJhY3RlciBFbmNvZGluZyBhbmQgRXNjYXBpbmcgVGVzdHMgLS0tLS0iLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IkhUVFAvMS4wIgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L0VuY29kaW5nMDEuanNwIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICAgZ29sZGVuPSIke2dvbGRlbi5wYXRofS9FbmNvZGluZzAxLnR4dCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iSFRUUC8xLjAiCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vRW5jb2RpbmcwMi5qc3AiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgICBnb2xkZW49IiR7Z29sZGVuLnBhdGh9L0VuY29kaW5nMDIudHh0Ii8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSJIVFRQLzEuMCIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9FbmNvZGluZzAzLmpzcCIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgIGdvbGRlbj0iJHtnb2xkZW4ucGF0aH0vRW5jb2RpbmcwMy50eHQiLz4KKworICAgIDxlY2hvIG1lc3NhZ2U9Ii0tLS0tIFByb3BlcnR5RWRpdG9yIFN1cHBvcnQgLS0tLS0iLz4KKworPCEtLSBDYW5ub3QgdGVzdCBQcm9wZXJ0eUVkaXRvciBzdXBwb3J0IHVuZGVyIHNlY3VyaXR5IG1hbmFnZXIKKyAgICAgdW5sZXNzIGNhdGFsaW5hLnBvbGljeSBncmFudHMgcmVhZC93cml0ZSBhY2Nlc3MgdG8KKyAgICAgc3lzdGVtIHByb3BlcnRpZXMgLS0+Cis8IS0tCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iSFRUUC8xLjAiCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vUHJvcGVydHkwMS5qc3AiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgICBnb2xkZW49IiR7Z29sZGVuLnBhdGh9L1Byb3BlcnR5MDEudHh0Ii8+CistLT4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IkhUVFAvMS4wIgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1Byb3BlcnR5MDIuanNwIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICAgc3RhdHVzPSI1MDAiLz4KKworICAgIDxlY2hvIG1lc3NhZ2U9Ii0tLS0tIEpTUCBEb2N1bWVudCBQYXJzaW5nIC0tLS0tIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSJIVFRQLzEuMCIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9Kc3BEb2MwMS5qc3AiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgICBnb2xkZW49IiR7Z29sZGVuLnBhdGh9L0pzcERvYzAxLnR4dCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iSFRUUC8xLjAiCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vSnNwRG9jMDIuanNwIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICAgZ29sZGVuPSIke2dvbGRlbi5wYXRofS9Kc3BEb2MwMi50eHQiLz4KKworICAgIDxlY2hvIG1lc3NhZ2U9Ii0tLS0tIGpzcDpmb3J3YXJkIC0tLS0tIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9Kc3BGb3J3YXJkMDEuanNwP3BhdGg9L0pzcEZvcndhcmQwMWEuanNwIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICBvdXRDb250ZW50PSJKc3BGb3J3YXJkMDFhIFBBU1NFRCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vSnNwRm9yd2FyZDAxLmpzcD9wYXRoPS9Gb3J3YXJkMDBhIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICBvdXRDb250ZW50PSJGb3J3YXJkMDBhIFBBU1NFRCIvPgorCisgICAgPGVjaG8gbWVzc2FnZT0iLS0tLS0ganNwOmluY2x1ZGUgZmx1c2g9dHJ1ZSAtLS0tLSIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vSnNwSW5jbHVkZTAxLmpzcD9wYXRoPS9Kc3BJbmNsdWRlMDFhLmpzcCIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgIGdvbGRlbj0iJHtnb2xkZW4ucGF0aH0vSnNwSW5jbHVkZTAxLnR4dCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vSnNwSW5jbHVkZTAxLmpzcD9wYXRoPS9JbmNsdWRlMDBhIgorICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICAgZ29sZGVuPSIke2dvbGRlbi5wYXRofS9Kc3BJbmNsdWRlMDFhLnR4dCIvPgorCisgICAgPGVjaG8gbWVzc2FnZT0iLS0tLS0ganNwOmluY2x1ZGUgZmx1c2g9ZmFsc2UgLS0tLS0iLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L0pzcEluY2x1ZGUwMi5qc3A/cGF0aD0vSnNwSW5jbHVkZTAyYS5qc3AiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgICBnb2xkZW49IiR7Z29sZGVuLnBhdGh9L0pzcEluY2x1ZGUwMi50eHQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L0pzcEluY2x1ZGUwMi5qc3A/cGF0aD0vSW5jbHVkZTAwYSIKKyAgICAgICAgICAgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgIGdvbGRlbj0iJHtnb2xkZW4ucGF0aH0vSnNwSW5jbHVkZTAyYS50eHQiLz4KKworICA8L3RhcmdldD4KKworCisgIDx0YXJnZXQgbmFtZT0iTGlmZWN5Y2xlIj4KKworICAgIDwhLS0gPT09PT09PT09PSBMaWZlY3ljbGUgTWFuYWdlbWVudCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vTGlmZWN5Y2xlMDEiCisgICAgICBvdXRDb250ZW50PSJMaWZlY3ljbGUwMSBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vV3JhcHBlZExpZmVjeWNsZTAxIgorICAgICAgb3V0Q29udGVudD0iTGlmZWN5Y2xlMDEgUEFTU0VEIiBkZWJ1Zz0iJHtkZWJ1Z30iLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L0xpZmVjeWNsZTAyIiBtZXRob2Q9IlBPU1QiCisgICAgICBvdXRDb250ZW50PSJMaWZlY3ljbGUwMiBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vV3JhcHBlZExpZmVjeWNsZTAyIiBtZXRob2Q9IlBPU1QiCisgICAgICBvdXRDb250ZW50PSJMaWZlY3ljbGUwMiBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iSFRUUC8xLjAiCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vTGlmZWN5Y2xlMDM/c3RlcD0xIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICAgc3RhdHVzPSI0MDQiLz4KKworPCEtLSBOT1RFIC0gY2Fubm90IGRvIHRoaXMgYXMgb3JpZ2luYWxseSBpbnRlbmRlZCwgYmVjYXVzZSB0aGUKKyAgICAgc2VydmxldCB3YXMgbWFya2VkIGFzIHBlcm1hbmVudGx5IHVuYXZhaWxhYmxlLCBzbyBqdXN0CisgICAgIGNoZWNrIGZvciBhbm90aGVyIDUwMyBpbnN0ZWFkIQorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iSFRUUC8xLjAiCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vTGlmZWN5Y2xlMDM/c3RlcD0yIgorICAgICAgb3V0Q29udGVudD0iTGlmZWN5Y2xlMDMgUEFTU0VEIiBkZWJ1Zz0iJHtkZWJ1Z30iLz4KKy0tPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iSFRUUC8xLjAiCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vTGlmZWN5Y2xlMDM/c3RlcD0yIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICAgc3RhdHVzPSI0MDQiLz4KKworICA8L3RhcmdldD4KKworCisgIDx0YXJnZXQgbmFtZT0iUmVxdWVzdERpc3BhdGNoZXIiPgorCisgICAgPGVjaG8gbWVzc2FnZT0iLS0tLS0gQmFzaWMgRm9yd2FyZCBGdW5jdGlvbmFsaXR5IC0tLS0tIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9Gb3J3YXJkMDA/cGF0aD0vRm9yd2FyZDAwYSIKKyAgICAgIG91dENvbnRlbnQ9IkZvcndhcmQwMGEgUEFTU0VEIiBkZWJ1Zz0iJHtkZWJ1Z30iLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1dyYXBwZWRGb3J3YXJkMDA/cGF0aD0vRm9yd2FyZDAwYSIKKyAgICAgIG91dENvbnRlbnQ9IkZvcndhcmQwMGEgUEFTU0VEIiBkZWJ1Zz0iJHtkZWJ1Z30iLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L0ZvcndhcmQwMD9wYXRoPS9Gb3J3YXJkMDBiIgorICAgICAgb3V0Q29udGVudD0iRm9yd2FyZDAwYiBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vV3JhcHBlZEZvcndhcmQwMD9wYXRoPS9Gb3J3YXJkMDBiIgorICAgICAgb3V0Q29udGVudD0iRm9yd2FyZDAwYiBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vRm9yd2FyZDAwP3BhdGg9L0ZvcndhcmQwMGMuanNwIgorICAgICAgb3V0Q29udGVudD0iRm9yd2FyZDAwYyBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vV3JhcHBlZEZvcndhcmQwMD9wYXRoPS9Gb3J3YXJkMDBjLmpzcCIKKyAgICAgIG91dENvbnRlbnQ9IkZvcndhcmQwMGMgUEFTU0VEIiBkZWJ1Zz0iJHtkZWJ1Z30iLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L0ZvcndhcmQwMD9wYXRoPSFGb3J3YXJkMDBkIgorICAgICAgb3V0Q29udGVudD0iRm9yd2FyZDAwZCBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vV3JhcHBlZEZvcndhcmQwMD9wYXRoPSFGb3J3YXJkMDBkIgorICAgICAgb3V0Q29udGVudD0iRm9yd2FyZDAwZCBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vRm9yd2FyZDAwP3BhdGg9IUZvcndhcmQwMGUiCisgICAgICBvdXRDb250ZW50PSJGb3J3YXJkMDBlIFBBU1NFRCIgZGVidWc9IiR7ZGVidWd9Ii8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9XcmFwcGVkRm9yd2FyZDAwP3BhdGg9IUZvcndhcmQwMGUiCisgICAgICBvdXRDb250ZW50PSJGb3J3YXJkMDBlIFBBU1NFRCIgZGVidWc9IiR7ZGVidWd9Ii8+CisKKyAgICA8ZWNobyBtZXNzYWdlPSItLS0tLSBCYXNpYyBJbmNsdWRlIEZ1bmN0aW9uYWxpdHkgKGZsdXNoPWZhbHNlKSAtLS0tLSIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vSW5jbHVkZTAwP3BhdGg9L0luY2x1ZGUwMGEmYW1wO2ZsdXNoPWZhbHNlIgorICAgICAgb3V0Q29udGVudD0iSW5jbHVkZTAwYSBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vV3JhcHBlZEluY2x1ZGUwMD9wYXRoPS9JbmNsdWRlMDBhJmFtcDtmbHVzaD1mYWxzZSIKKyAgICAgIG91dENvbnRlbnQ9IkluY2x1ZGUwMGEgUEFTU0VEIiBkZWJ1Zz0iJHtkZWJ1Z30iLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L0luY2x1ZGUwMD9wYXRoPS9JbmNsdWRlMDBiJmFtcDtmbHVzaD1mYWxzZSIKKyAgICAgIG91dENvbnRlbnQ9IkluY2x1ZGUwMGIgUEFTU0VEIiBkZWJ1Zz0iJHtkZWJ1Z30iLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1dyYXBwZWRJbmNsdWRlMDA/cGF0aD0vSW5jbHVkZTAwYiZhbXA7Zmx1c2g9ZmFsc2UiCisgICAgICBvdXRDb250ZW50PSJJbmNsdWRlMDBiIFBBU1NFRCIgZGVidWc9IiR7ZGVidWd9Ii8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9JbmNsdWRlMDA/cGF0aD0vSW5jbHVkZTAwYy5qc3AmYW1wO2ZsdXNoPWZhbHNlIgorICAgICAgb3V0Q29udGVudD0iSW5jbHVkZTAwYyBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vV3JhcHBlZEluY2x1ZGUwMD9wYXRoPS9JbmNsdWRlMDBjLmpzcCZhbXA7Zmx1c2g9ZmFsc2UiCisgICAgICBvdXRDb250ZW50PSJJbmNsdWRlMDBjIFBBU1NFRCIgZGVidWc9IiR7ZGVidWd9Ii8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9JbmNsdWRlMDA/cGF0aD0hSW5jbHVkZTAwZCZhbXA7Zmx1c2g9ZmFsc2UiCisgICAgICBvdXRDb250ZW50PSJJbmNsdWRlMDBkIFBBU1NFRCIgZGVidWc9IiR7ZGVidWd9Ii8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9XcmFwcGVkSW5jbHVkZTAwP3BhdGg9IUluY2x1ZGUwMGQmYW1wO2ZsdXNoPWZhbHNlIgorICAgICAgb3V0Q29udGVudD0iSW5jbHVkZTAwZCBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vSW5jbHVkZTAwP3BhdGg9IUluY2x1ZGUwMGUmYW1wO2ZsdXNoPWZhbHNlIgorICAgICAgb3V0Q29udGVudD0iSW5jbHVkZTAwZSBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vV3JhcHBlZEluY2x1ZGUwMD9wYXRoPSFJbmNsdWRlMDBlJmFtcDtmbHVzaD1mYWxzZSIKKyAgICAgIG91dENvbnRlbnQ9IkluY2x1ZGUwMGUgUEFTU0VEIiBkZWJ1Zz0iJHtkZWJ1Z30iLz4KKworICAgIDxlY2hvIG1lc3NhZ2U9Ii0tLS0tIEJhc2ljIEluY2x1ZGUgKGZsdXNoPXRydWUsIGNyZWF0ZT10cnVlKSAtLS0tLSIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vSW5jbHVkZTAwP3BhdGg9L0luY2x1ZGUwMGEmYW1wO2ZsdXNoPXRydWUmYW1wO2NyZWF0ZT10cnVlIgorICAgICAgb3V0Q29udGVudD0iSW5jbHVkZTAwYSBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vV3JhcHBlZEluY2x1ZGUwMD9wYXRoPS9JbmNsdWRlMDBhJmFtcDtmbHVzaD10cnVlJmFtcDtjcmVhdGU9dHJ1ZSIKKyAgICAgIG91dENvbnRlbnQ9IkluY2x1ZGUwMGEgUEFTU0VEIiBkZWJ1Zz0iJHtkZWJ1Z30iLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L0luY2x1ZGUwMD9wYXRoPS9JbmNsdWRlMDBiJmFtcDtmbHVzaD10cnVlJmFtcDtjcmVhdGU9dHJ1ZSIKKyAgICAgIG91dENvbnRlbnQ9IkluY2x1ZGUwMGIgUEFTU0VEIiBkZWJ1Zz0iJHtkZWJ1Z30iLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1dyYXBwZWRJbmNsdWRlMDA/cGF0aD0vSW5jbHVkZTAwYiZhbXA7Zmx1c2g9dHJ1ZSZhbXA7Y3JlYXRlPXRydWUiCisgICAgICBvdXRDb250ZW50PSJJbmNsdWRlMDBiIFBBU1NFRCIgZGVidWc9IiR7ZGVidWd9Ii8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9JbmNsdWRlMDA/cGF0aD0vSW5jbHVkZTAwYy5qc3AmYW1wO2ZsdXNoPXRydWUmYW1wO2NyZWF0ZT10cnVlIgorICAgICAgb3V0Q29udGVudD0iSW5jbHVkZTAwYyBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vV3JhcHBlZEluY2x1ZGUwMD9wYXRoPS9JbmNsdWRlMDBjLmpzcCZhbXA7Zmx1c2g9dHJ1ZSZhbXA7Y3JlYXRlPXRydWUiCisgICAgICBvdXRDb250ZW50PSJJbmNsdWRlMDBjIFBBU1NFRCIgZGVidWc9IiR7ZGVidWd9Ii8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9JbmNsdWRlMDA/cGF0aD0hSW5jbHVkZTAwZCZhbXA7Zmx1c2g9dHJ1ZSZhbXA7Y3JlYXRlPXRydWUiCisgICAgICBvdXRDb250ZW50PSJJbmNsdWRlMDBkIFBBU1NFRCIgZGVidWc9IiR7ZGVidWd9Ii8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9XcmFwcGVkSW5jbHVkZTAwP3BhdGg9IUluY2x1ZGUwMGQmYW1wO2ZsdXNoPXRydWUmYW1wO2NyZWF0ZT10cnVlIgorICAgICAgb3V0Q29udGVudD0iSW5jbHVkZTAwZCBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vSW5jbHVkZTAwP3BhdGg9IUluY2x1ZGUwMGUmYW1wO2ZsdXNoPXRydWUmYW1wO2NyZWF0ZT10cnVlIgorICAgICAgb3V0Q29udGVudD0iSW5jbHVkZTAwZSBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vV3JhcHBlZEluY2x1ZGUwMD9wYXRoPSFJbmNsdWRlMDBlJmFtcDtmbHVzaD10cnVlJmFtcDtjcmVhdGU9dHJ1ZSIKKyAgICAgIG91dENvbnRlbnQ9IkluY2x1ZGUwMGUgUEFTU0VEIiBkZWJ1Zz0iJHtkZWJ1Z30iLz4KKworICAgIDxlY2hvIG1lc3NhZ2U9Ii0tLS0tIEJhc2ljIEluY2x1ZGUgKGZsdXNoPXRydWUsIGNyZWF0ZT1mYWxzZSkgLS0tLS0iLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L0luY2x1ZGUwMD9wYXRoPS9JbmNsdWRlMDBhJmFtcDtmbHVzaD10cnVlJmFtcDtjcmVhdGU9ZmFsc2UiCisgICAgICBvdXRDb250ZW50PSJJbmNsdWRlMDBhIFBBU1NFRCIgZGVidWc9IiR7ZGVidWd9Ii8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9XcmFwcGVkSW5jbHVkZTAwP3BhdGg9L0luY2x1ZGUwMGEmYW1wO2ZsdXNoPXRydWUmYW1wO2NyZWF0ZT1mYWxzZSIKKyAgICAgIG91dENvbnRlbnQ9IkluY2x1ZGUwMGEgUEFTU0VEIiBkZWJ1Zz0iJHtkZWJ1Z30iLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L0luY2x1ZGUwMD9wYXRoPS9JbmNsdWRlMDBiJmFtcDtmbHVzaD10cnVlJmFtcDtjcmVhdGU9ZmFsc2UiCisgICAgICBvdXRDb250ZW50PSJJbmNsdWRlMDBiIFBBU1NFRCIgZGVidWc9IiR7ZGVidWd9Ii8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9XcmFwcGVkSW5jbHVkZTAwP3BhdGg9L0luY2x1ZGUwMGImYW1wO2ZsdXNoPXRydWUmYW1wO2NyZWF0ZT1mYWxzZSIKKyAgICAgIG91dENvbnRlbnQ9IkluY2x1ZGUwMGIgUEFTU0VEIiBkZWJ1Zz0iJHtkZWJ1Z30iLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L0luY2x1ZGUwMD9wYXRoPS9JbmNsdWRlMDBjLmpzcCZhbXA7Zmx1c2g9dHJ1ZSZhbXA7Y3JlYXRlPWZhbHNlIgorICAgICAgb3V0Q29udGVudD0iSW5jbHVkZTAwYyBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vV3JhcHBlZEluY2x1ZGUwMD9wYXRoPS9JbmNsdWRlMDBjLmpzcCZhbXA7Zmx1c2g9dHJ1ZSZhbXA7Y3JlYXRlPWZhbHNlIgorICAgICAgb3V0Q29udGVudD0iSW5jbHVkZTAwYyBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vSW5jbHVkZTAwP3BhdGg9IUluY2x1ZGUwMGQmYW1wO2ZsdXNoPXRydWUmYW1wO2NyZWF0ZT1mYWxzZSIKKyAgICAgIG91dENvbnRlbnQ9IkluY2x1ZGUwMGQgUEFTU0VEIiBkZWJ1Zz0iJHtkZWJ1Z30iLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1dyYXBwZWRJbmNsdWRlMDA/cGF0aD0hSW5jbHVkZTAwZCZhbXA7Zmx1c2g9dHJ1ZSZhbXA7Y3JlYXRlPWZhbHNlIgorICAgICAgb3V0Q29udGVudD0iSW5jbHVkZTAwZCBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vSW5jbHVkZTAwP3BhdGg9IUluY2x1ZGUwMGUmYW1wO2ZsdXNoPXRydWUmYW1wO2NyZWF0ZT1mYWxzZSIKKyAgICAgIG91dENvbnRlbnQ9IkluY2x1ZGUwMGUgUEFTU0VEIiBkZWJ1Zz0iJHtkZWJ1Z30iLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1dyYXBwZWRJbmNsdWRlMDA/cGF0aD0hSW5jbHVkZTAwZSZhbXA7Zmx1c2g9dHJ1ZSZhbXA7Y3JlYXRlPWZhbHNlIgorICAgICAgb3V0Q29udGVudD0iSW5jbHVkZTAwZSBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIvPgorCisgICAgPGVjaG8gbWVzc2FnZT0iLS0tLS0gRm9yd2FyZCBhbmQgSW5jbHVkZSB0byBTdGF0aWMgUmVzb3VyY2UgLS0tLS0iLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L0ZvcndhcmQwMSIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgb3V0Q29udGVudD0iRm9yd2FyZDAxIFBBU1NFRCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vV3JhcHBlZEZvcndhcmQwMSIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgb3V0Q29udGVudD0iRm9yd2FyZDAxIFBBU1NFRCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vSW5jbHVkZTAxIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICBvdXRDb250ZW50PSJJbmNsdWRlMDEgUEFTU0VEIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9JbmNsdWRlMDEiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICBpbkhlYWRlcnM9IklmLW1vZGlmaWVkLXNpbmNlOiBNb24sIDIwIERlYyAyMDEwIDEyOjEyOjU0IEdNVCIKKyAgICAgIG91dENvbnRlbnQ9IkluY2x1ZGUwMSBQQVNTRUQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1dyYXBwZWRJbmNsdWRlMDEiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgIG91dENvbnRlbnQ9IkluY2x1ZGUwMSBQQVNTRUQiLz4KKworICAgIDxlY2hvIG1lc3NhZ2U9Ii0tLS0tIEluY2x1ZGVkIFNlcnZsZXQgVGhyb3dpbmcgRXhjZXB0aW9ucyAtLS0tLSIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vSW5jbHVkZTAyP2V4Y2VwdGlvbj1JT0V4Y2VwdGlvbiIKKyAgICAgIG91dENvbnRlbnQ9IkluY2x1ZGUwMiBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vSW5jbHVkZTAyP2V4Y2VwdGlvbj1TZXJ2bGV0RXhjZXB0aW9uIgorICAgICAgb3V0Q29udGVudD0iSW5jbHVkZTAyIFBBU1NFRCIgZGVidWc9IiR7ZGVidWd9Ii8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9JbmNsdWRlMDI/ZXhjZXB0aW9uPU51bGxQb2ludGVyRXhjZXB0aW9uIgorICAgICAgb3V0Q29udGVudD0iSW5jbHVkZTAyIFBBU1NFRCIgZGVidWc9IiR7ZGVidWd9Ii8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9XcmFwcGVkSW5jbHVkZTAyP2V4Y2VwdGlvbj1JT0V4Y2VwdGlvbiIKKyAgICAgIG91dENvbnRlbnQ9IkluY2x1ZGUwMiBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vV3JhcHBlZEluY2x1ZGUwMj9leGNlcHRpb249U2VydmxldEV4Y2VwdGlvbiIKKyAgICAgIG91dENvbnRlbnQ9IkluY2x1ZGUwMiBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vV3JhcHBlZEluY2x1ZGUwMj9leGNlcHRpb249TnVsbFBvaW50ZXJFeGNlcHRpb24iCisgICAgICBvdXRDb250ZW50PSJJbmNsdWRlMDIgUEFTU0VEIiBkZWJ1Zz0iJHtkZWJ1Z30iLz4KKworICAgIDxlY2hvIG1lc3NhZ2U9Ii0tLS0tIEZvcndhcmRlZCBTZXJ2bGV0L1BhZ2UgU2V0cyBBdHRyaWJ1dGUgLS0tLS0iLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L0ZvcndhcmQwMz9wYXRoPS9Gb3J3YXJkMDNhIgorICAgICAgb3V0Q29udGVudD0iRm9yd2FyZDAzIFBBU1NFRCIgZGVidWc9IiR7ZGVidWd9Ii8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9XcmFwcGVkRm9yd2FyZDAzP3BhdGg9L0ZvcndhcmQwM2EiCisgICAgICBvdXRDb250ZW50PSJGb3J3YXJkMDMgUEFTU0VEIiBkZWJ1Zz0iJHtkZWJ1Z30iLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L0ZvcndhcmQwMz9wYXRoPS9Gb3J3YXJkMDNiLmpzcCIKKyAgICAgIG91dENvbnRlbnQ9IkZvcndhcmQwMyBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vV3JhcHBlZEZvcndhcmQwMz9wYXRoPS9Gb3J3YXJkMDNiLmpzcCIKKyAgICAgIG91dENvbnRlbnQ9IkZvcndhcmQwMyBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIvPgorCisgICAgPGVjaG8gbWVzc2FnZT0iLS0tLS0gSW5jbHVkZWQgU2VydmxldC9QYWdlIFNldHMgQXR0cmlidXRlIC0tLS0tIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9JbmNsdWRlMDM/cGF0aD0vSW5jbHVkZTAzYSIKKyAgICAgIG91dENvbnRlbnQ9IkluY2x1ZGUwMyBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vV3JhcHBlZEluY2x1ZGUwMz9wYXRoPS9JbmNsdWRlMDNhIgorICAgICAgb3V0Q29udGVudD0iSW5jbHVkZTAzIFBBU1NFRCIgZGVidWc9IiR7ZGVidWd9Ii8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9JbmNsdWRlMDM/cGF0aD0vSW5jbHVkZTAzYi5qc3AiCisgICAgICBvdXRDb250ZW50PSJJbmNsdWRlMDMgUEFTU0VEIiBkZWJ1Zz0iJHtkZWJ1Z30iLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1dyYXBwZWRJbmNsdWRlMDM/cGF0aD0vSW5jbHVkZTAzYi5qc3AiCisgICAgICBvdXRDb250ZW50PSJJbmNsdWRlMDMgUEFTU0VEIiBkZWJ1Zz0iJHtkZWJ1Z30iLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L0luY2x1ZGUwM2MuanNwP3BhdGg9L0luY2x1ZGUwM2EiCisgICAgICBvdXRDb250ZW50PSJJbmNsdWRlMDNjLmpzcCBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vSW5jbHVkZTAzYy5qc3A/cGF0aD0vSW5jbHVkZTAzYi5qc3AiCisgICAgICBvdXRDb250ZW50PSJJbmNsdWRlMDNjLmpzcCBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIvPgorCisgICAgPGVjaG8gbWVzc2FnZT0iLS0tLS0gSW5jbHVkZSBUaGVuIEZvcndhcmQgLS0tLS0iLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L0luY2x1ZGUwNCIKKyAgICAgIG91dENvbnRlbnQ9IkluY2x1ZGUwNGIgUEFTU0VEIiBkZWJ1Zz0iJHtkZWJ1Z30iLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1dyYXBwZWRJbmNsdWRlMDQiCisgICAgICBvdXRDb250ZW50PSJJbmNsdWRlMDRiIFBBU1NFRCIgZGVidWc9IiR7ZGVidWd9Ii8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9JbmNsdWRlMDUuanNwIgorICAgICAgb3V0Q29udGVudD0iSW5jbHVkZTA1YiBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIvPgorCisgICAgPGVjaG8gbWVzc2FnZT0iLS0tLS0gSW5jbHVkZSBUaGVuIEluY2x1ZGUgLS0tLS0iLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L0luY2x1ZGUwNi5qc3AiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgICBnb2xkZW49IiR7Z29sZGVuLnBhdGh9L0luY2x1ZGUwNi50eHQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L0luY2x1ZGUwNyIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgIGdvbGRlbj0iJHtnb2xkZW4ucGF0aH0vSW5jbHVkZTA3LnR4dCIvPgorCisgICAgPGVjaG8gbWVzc2FnZT0iLS0tLS0gRm9yd2FyZCBUaGVuIEZvcndhcmQgLS0tLS0iLz4KKworICAgIDwhLS0gU2VydmxldCB0byBTZXJ2bGV0IHRvIFNlcnZsZXQgLS0+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9Gb3J3YXJkMDQiCisgICAgICBvdXRDb250ZW50PSJGb3J3YXJkMDRiIFBBU1NFRCIgZGVidWc9IiR7ZGVidWd9Ii8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9XcmFwcGVkRm9yd2FyZDA0IgorICAgICAgb3V0Q29udGVudD0iRm9yd2FyZDA0YiBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIvPgorCisgICAgPCEtLSBKU1AgdG8gSlNQIHRvIEpTUCAtLT4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L0ZvcndhcmQwNC5qc3AiCisgICAgICBvdXRDb250ZW50PSJGb3J3YXJkMDRiLmpzcCBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIvPgorCisgICAgPCEtLSBTZXJ2bGV0IHRvIEpTUCB0byBTZXJ2bGV0IC0tPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vRm9yd2FyZDA1IgorICAgICAgb3V0Q29udGVudD0iRm9yd2FyZDA1YiBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vV3JhcHBlZEZvcndhcmQwNSIKKyAgICAgIG91dENvbnRlbnQ9IkZvcndhcmQwNWIgUEFTU0VEIiBkZWJ1Zz0iJHtkZWJ1Z30iLz4KKworICAgIDwhLS0gSlNQIHRvIFNlcnZsZXQgdG8gSlNQIC0tPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vRm9yd2FyZDA1LmpzcCIKKyAgICAgIG91dENvbnRlbnQ9IkZvcndhcmQwNWIuanNwIFBBU1NFRCIgZGVidWc9IiR7ZGVidWd9Ii8+CisKKyAgICA8IS0tIEludm9rZXIgdG8gSlNQIHRvIEludm9rZXIgLS0+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9zZXJ2bGV0L0ZvcndhcmQwNiIKKyAgICAgIG91dENvbnRlbnQ9IkZvcndhcmQwNmIgUEFTU0VEIiBkZWJ1Zz0iJHtkZWJ1Z30iLz4KKworICAgIDwhLS0gSlNQIHRvIEludm9rZXIgdG8gSlNQIC0tPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vRm9yd2FyZDA2LmpzcCIKKyAgICAgIG91dENvbnRlbnQ9IkZvcndhcmQwNmIuanNwIFBBU1NFRCIgZGVidWc9IiR7ZGVidWd9Ii8+CisKKyAgICA8IS0tIFNlcnZsZXQgdG8gSW52b2tlciB0byBTZXJ2bGV0IC0tPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vRm9yd2FyZDA3IgorICAgICAgb3V0Q29udGVudD0iRm9yd2FyZDA3YiBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vV3JhcHBlZEZvcndhcmQwNyIKKyAgICAgIG91dENvbnRlbnQ9IkZvcndhcmQwN2IgUEFTU0VEIiBkZWJ1Zz0iJHtkZWJ1Z30iLz4KKworICAgIDwhLS0gSW52b2tlciB0byBTZXJ2bGV0IHRvIEludm9rZXIgLS0+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9zZXJ2bGV0L0ZvcndhcmQwOCIKKyAgICAgIG91dENvbnRlbnQ9IkZvcndhcmQwOGIgUEFTU0VEIiBkZWJ1Zz0iJHtkZWJ1Z30iLz4KKworICAgIDxlY2hvIG1lc3NhZ2U9Ii0tLS0tIFNlcnZsZXRSZXF1ZXN0LmdldFJlcXVlc3REaXNwYXRjaGVyKCkgLS0tLS0iLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L0ZvcndhcmQwOT9wYXRoPS9Gb3J3YXJkMDBhIgorICAgICAgb3V0Q29udGVudD0iRm9yd2FyZDAwYSBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vV3JhcHBlZEZvcndhcmQwOT9wYXRoPS9Gb3J3YXJkMDBhIgorICAgICAgb3V0Q29udGVudD0iRm9yd2FyZDAwYSBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vRm9yd2FyZDA5P3BhdGg9L0ZvcndhcmQwMGIiCisgICAgICBvdXRDb250ZW50PSJGb3J3YXJkMDBiIFBBU1NFRCIgZGVidWc9IiR7ZGVidWd9Ii8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9XcmFwcGVkRm9yd2FyZDA5P3BhdGg9L0ZvcndhcmQwMGIiCisgICAgICBvdXRDb250ZW50PSJGb3J3YXJkMDBiIFBBU1NFRCIgZGVidWc9IiR7ZGVidWd9Ii8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9Gb3J3YXJkMDk/cGF0aD0vRm9yd2FyZDAwYy5qc3AiCisgICAgICBvdXRDb250ZW50PSJGb3J3YXJkMDBjIFBBU1NFRCIgZGVidWc9IiR7ZGVidWd9Ii8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9XcmFwcGVkRm9yd2FyZDA5P3BhdGg9L0ZvcndhcmQwMGMuanNwIgorICAgICAgb3V0Q29udGVudD0iRm9yd2FyZDAwYyBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vRm9yd2FyZDA5P3BhdGg9Rm9yd2FyZDAwYSIKKyAgICAgIG91dENvbnRlbnQ9IkZvcndhcmQwMGEgUEFTU0VEIiBkZWJ1Zz0iJHtkZWJ1Z30iLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1dyYXBwZWRGb3J3YXJkMDk/cGF0aD1Gb3J3YXJkMDBhIgorICAgICAgb3V0Q29udGVudD0iRm9yd2FyZDAwYSBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vRm9yd2FyZDA5P3BhdGg9Rm9yd2FyZDAwYiIKKyAgICAgIG91dENvbnRlbnQ9IkZvcndhcmQwMGIgUEFTU0VEIiBkZWJ1Zz0iJHtkZWJ1Z30iLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1dyYXBwZWRGb3J3YXJkMDk/cGF0aD1Gb3J3YXJkMDBiIgorICAgICAgb3V0Q29udGVudD0iRm9yd2FyZDAwYiBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vRm9yd2FyZDA5P3BhdGg9Rm9yd2FyZDAwYy5qc3AiCisgICAgICBvdXRDb250ZW50PSJGb3J3YXJkMDBjIFBBU1NFRCIgZGVidWc9IiR7ZGVidWd9Ii8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9XcmFwcGVkRm9yd2FyZDA5P3BhdGg9Rm9yd2FyZDAwYy5qc3AiCisgICAgICBvdXRDb250ZW50PSJGb3J3YXJkMDBjIFBBU1NFRCIgZGVidWc9IiR7ZGVidWd9Ii8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9JbmNsdWRlMDk/cGF0aD0vSW5jbHVkZTAwYSIKKyAgICAgIG91dENvbnRlbnQ9IkluY2x1ZGUwMGEgUEFTU0VEIiBkZWJ1Zz0iJHtkZWJ1Z30iLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1dyYXBwZWRJbmNsdWRlMDk/cGF0aD0vSW5jbHVkZTAwYSIKKyAgICAgIG91dENvbnRlbnQ9IkluY2x1ZGUwMGEgUEFTU0VEIiBkZWJ1Zz0iJHtkZWJ1Z30iLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L0luY2x1ZGUwOT9wYXRoPS9JbmNsdWRlMDBiIgorICAgICAgb3V0Q29udGVudD0iSW5jbHVkZTAwYiBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vV3JhcHBlZEluY2x1ZGUwOT9wYXRoPS9JbmNsdWRlMDBiIgorICAgICAgb3V0Q29udGVudD0iSW5jbHVkZTAwYiBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vSW5jbHVkZTA5P3BhdGg9L0luY2x1ZGUwMGMuanNwIgorICAgICAgb3V0Q29udGVudD0iSW5jbHVkZTAwYyBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vV3JhcHBlZEluY2x1ZGUwOT9wYXRoPS9JbmNsdWRlMDBjLmpzcCIKKyAgICAgIG91dENvbnRlbnQ9IkluY2x1ZGUwMGMgUEFTU0VEIiBkZWJ1Zz0iJHtkZWJ1Z30iLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L0luY2x1ZGUwOT9wYXRoPUluY2x1ZGUwMGEiCisgICAgICBvdXRDb250ZW50PSJJbmNsdWRlMDBhIFBBU1NFRCIgZGVidWc9IiR7ZGVidWd9Ii8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9XcmFwcGVkSW5jbHVkZTA5P3BhdGg9SW5jbHVkZTAwYSIKKyAgICAgIG91dENvbnRlbnQ9IkluY2x1ZGUwMGEgUEFTU0VEIiBkZWJ1Zz0iJHtkZWJ1Z30iLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L0luY2x1ZGUwOT9wYXRoPUluY2x1ZGUwMGIiCisgICAgICBvdXRDb250ZW50PSJJbmNsdWRlMDBiIFBBU1NFRCIgZGVidWc9IiR7ZGVidWd9Ii8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9XcmFwcGVkSW5jbHVkZTA5P3BhdGg9SW5jbHVkZTAwYiIKKyAgICAgIG91dENvbnRlbnQ9IkluY2x1ZGUwMGIgUEFTU0VEIiBkZWJ1Zz0iJHtkZWJ1Z30iLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L0luY2x1ZGUwOT9wYXRoPUluY2x1ZGUwMGMuanNwIgorICAgICAgb3V0Q29udGVudD0iSW5jbHVkZTAwYyBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vV3JhcHBlZEluY2x1ZGUwOT9wYXRoPUluY2x1ZGUwMGMuanNwIgorICAgICAgb3V0Q29udGVudD0iSW5jbHVkZTAwYyBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIvPgorCisgICAgPGVjaG8gbWVzc2FnZT0iLS0tLS0gQ29udGFpbmVyLUNyZWF0ZWQgSW5jbHVkZSBBdHRyaWJ1dGVzIC0tLS0tIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9JbmNsdWRlMTAvZXh0cmEvcGF0aD9uYW1lMT12YWx1ZTEiCisgICAgICBvdXRDb250ZW50PSJJbmNsdWRlMTBhIFBBU1NFRCIgZGVidWc9IiR7ZGVidWd9Ii8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9XcmFwcGVkSW5jbHVkZTEwL2V4dHJhL3BhdGg/bmFtZTE9dmFsdWUxIgorICAgICAgb3V0Q29udGVudD0iSW5jbHVkZTEwYSBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIvPgorCisgICAgPGVjaG8gbWVzc2FnZT0iLS0tLS0gUmVzcG9uc2UgV3JhcHBpbmcgLS0tLS0iLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1Jlc3BvbnNlV3JhcDAxP3R5cGU9RiZhbXA7cGFnZT0vUmVzcG9uc2VXcmFwMDFhIgorICAgICAgb3V0Q29udGVudD0iUkVTUE9OU0VXUkFQMDFBIFBBU1NFRCIgZGVidWc9IiR7ZGVidWd9IiAvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vUmVzcG9uc2VXcmFwMDE/dHlwZT1GJmFtcDtwYWdlPS9SZXNwb25zZVdyYXAwMWIuanNwIgorICAgICAgb3V0Q29udGVudD0iUkVTUE9OU0VXUkFQMDFCIFBBU1NFRCIgZGVidWc9IiR7ZGVidWd9IiAvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vUmVzcG9uc2VXcmFwMDE/dHlwZT1JJmFtcDtwYWdlPS9SZXNwb25zZVdyYXAwMWMiCisgICAgICBvdXRDb250ZW50PSJSRVNQT05TRVdSQVAwMUMgUEFTU0VEIiBkZWJ1Zz0iJHtkZWJ1Z30iIC8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9SZXNwb25zZVdyYXAwMT90eXBlPUkmYW1wO3BhZ2U9L1Jlc3BvbnNlV3JhcDAxZC5qc3AiCisgICAgICBvdXRDb250ZW50PSJSRVNQT05TRVdSQVAwMUQgUEFTU0VEIiBkZWJ1Zz0iJHtkZWJ1Z30iIC8+CisKKyAgPC90YXJnZXQ+CisKKworICA8dGFyZ2V0IG5hbWU9IlJlc291cmNlcyI+CisKKyAgICA8IS0tID09PT09PT09PT0gUG9zaXRpdmUgU2VydmxldENvbnRleHQuZ2V0UmVzb3VyY2UoKSBUZXN0cyA9PT09PT09PT09PSAtLT4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vUmVzb3VyY2VzMDE/bW9kZT1jb250ZXh0JmFtcDtwYXRoPS9XRUItSU5GL3dlYi54bWwiCisgICAgICBvdXRDb250ZW50PSJSZXNvdXJjZXMwMSBQQVNTRUQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vUmVzb3VyY2VzMDE/bW9kZT1jb250ZXh0JmFtcDtwYXRoPS9Gb3J3YXJkMDEudHh0IgorICAgICAgb3V0Q29udGVudD0iUmVzb3VyY2VzMDEgUEFTU0VEIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgICAgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1Jlc291cmNlczAxP21vZGU9Y29udGV4dCZhbXA7cGF0aD0vSW5jbHVkZTAxLnR4dCIKKyAgICAgIG91dENvbnRlbnQ9IlJlc291cmNlczAxIFBBU1NFRCIvPgorCisgICAgPCEtLSA9PT09PT09PT09IFBvc2l0aXZlIENsYXNzLmdldFJlc291cmNlKCkgVGVzdHMgPT09PT09PT09PT09PT09PT09PT0gLS0+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgICAgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1Jlc291cmNlczAxP21vZGU9Y2xhc3MmYW1wO3BhdGg9L29yZy9hcGFjaGUvdGVzdGVyL1Jlc291cmNlczAxLnR4dCIKKyAgICAgIG91dENvbnRlbnQ9IlJlc291cmNlczAxIFBBU1NFRCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9SZXNvdXJjZXMwMT9tb2RlPWNsYXNzJmFtcDtwYXRoPS9vcmcvYXBhY2hlL3Rlc3Rlci9VbnBhY2tlZDAxLnR4dCIKKyAgICAgIG91dENvbnRlbnQ9IlJlc291cmNlczAxIFBBU1NFRCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9SZXNvdXJjZXMwMT9tb2RlPWNsYXNzJmFtcDtwYXRoPS9vcmcvYXBhY2hlL3Rlc3Rlci9zaGFyZWQvU2hhcmVkMDEudHh0IgorICAgICAgb3V0Q29udGVudD0iUmVzb3VyY2VzMDEgUEFTU0VEIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgICAgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1Jlc291cmNlczAxP21vZGU9Y2xhc3MmYW1wO3BhdGg9L29yZy9hcGFjaGUvdGVzdGVyL3VucHNoYXJlZC9VbnBTaGFyZWQwMS50eHQiCisgICAgICBvdXRDb250ZW50PSJSZXNvdXJjZXMwMSBQQVNTRUQiLz4KKworICAgIDwhLS0gPT09PT09PT09PSBOZWdhdGl2ZSBTZXJ2bGV0Q29udGV4dC5nZXRSZXNvdXJjZSgpIFRlc3RzID09PT09PT09PT09IC0tPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9SZXNvdXJjZXMwMj9tb2RlPWNvbnRleHQmYW1wO3BhdGg9L1dFQi1JTkYvd2ViLnhtbC5iYWQiCisgICAgICBvdXRDb250ZW50PSJSZXNvdXJjZXMwMiBQQVNTRUQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vUmVzb3VyY2VzMDI/bW9kZT1jb250ZXh0JmFtcDtwYXRoPS9Gb3J3YXJkMDIudHh0LmJhZCIKKyAgICAgIG91dENvbnRlbnQ9IlJlc291cmNlczAyIFBBU1NFRCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9SZXNvdXJjZXMwMj9tb2RlPWNvbnRleHQmYW1wO3BhdGg9L0luY2x1ZGUwMi50eHQuYmFkIgorICAgICAgb3V0Q29udGVudD0iUmVzb3VyY2VzMDIgUEFTU0VEIi8+CisKKyAgICA8IS0tID09PT09PT09PT0gTmVnYXRpdmUgQ2xhc3MuZ2V0UmVzb3VyY2UoKSBUZXN0cyA9PT09PT09PT09PT09PT09PT09PSAtLT4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vUmVzb3VyY2VzMDI/bW9kZT1jbGFzcyZhbXA7cGF0aD0vb3JnL2FwYWNoZS90ZXN0ZXIvUmVzb3VyY2VzMDIudHh0LmJhZCIKKyAgICAgIG91dENvbnRlbnQ9IlJlc291cmNlczAyIFBBU1NFRCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9SZXNvdXJjZXMwMj9tb2RlPWNsYXNzJmFtcDtwYXRoPS9vcmcvYXBhY2hlL3Rlc3Rlci9VbnBhY2tlZDAyLnR4dC5iYWQiCisgICAgICBvdXRDb250ZW50PSJSZXNvdXJjZXMwMiBQQVNTRUQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vUmVzb3VyY2VzMDI/bW9kZT1jbGFzcyZhbXA7cGF0aD0vb3JnL2FwYWNoZS90ZXN0ZXIvc2hhcmVkL1NoYXJlZDAxLnR4dC5iYWQiCisgICAgICBvdXRDb250ZW50PSJSZXNvdXJjZXMwMiBQQVNTRUQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vUmVzb3VyY2VzMDI/bW9kZT1jbGFzcyZhbXA7cGF0aD0vb3JnL2FwYWNoZS90ZXN0ZXIvdW5wc2hhcmVkL1VucFNoYXJlZDAxLnR4dC5iYWQiCisgICAgICBvdXRDb250ZW50PSJSZXNvdXJjZXMwMiBQQVNTRUQiLz4KKworICAgIDwhLS0gPT09PT09PT09PSBQb3NpdGl2ZSBTZXJ2bGV0Q29udGV4dC5nZXRSZXNvdXJjZUFzU3RyZWFtKCkgVGVzdHMgPT09IC0tPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9SZXNvdXJjZXMwMz9tb2RlPWNvbnRleHQmYW1wO3BhdGg9L1dFQi1JTkYvd2ViLnhtbCIKKyAgICAgIG91dENvbnRlbnQ9IiZsdDs/eG1sIHZlcnNpb249JnF1b3Q7MS4wJnF1b3Q7IGVuY29kaW5nPSZxdW90O0lTTy04ODU5LTEmcXVvdDs/Jmd0OyIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9SZXNvdXJjZXMwMz9tb2RlPWNvbnRleHQmYW1wO3BhdGg9L0ZvcndhcmQwMS50eHQiCisgICAgICBvdXRDb250ZW50PSJGb3J3YXJkMDEgUEFTU0VEIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgICAgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1Jlc291cmNlczAzP21vZGU9Y29udGV4dCZhbXA7cGF0aD0vSW5jbHVkZTAxLnR4dCIKKyAgICAgIG91dENvbnRlbnQ9IkluY2x1ZGUwMSBQQVNTRUQiLz4KKworICAgIDwhLS0gPT09PT09PT09PSBQb3NpdGl2ZSBDbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKCkgVGVzdHMgPT09PT09PT09PT09IC0tPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9SZXNvdXJjZXMwMz9tb2RlPWNsYXNzJmFtcDtwYXRoPS9vcmcvYXBhY2hlL3Rlc3Rlci9SZXNvdXJjZXMwMy50eHQiCisgICAgICBvdXRDb250ZW50PSJSZXNvdXJjZXMwMyBQQVNTRUQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vUmVzb3VyY2VzMDM/bW9kZT1jbGFzcyZhbXA7cGF0aD0vb3JnL2FwYWNoZS90ZXN0ZXIvVW5wYWNrZWQwMy50eHQiCisgICAgICBvdXRDb250ZW50PSJSZXNvdXJjZXMwMyBQQVNTRUQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vUmVzb3VyY2VzMDM/bW9kZT1jbGFzcyZhbXA7cGF0aD0vb3JnL2FwYWNoZS90ZXN0ZXIvc2hhcmVkL1NoYXJlZDAzLnR4dCIKKyAgICAgIG91dENvbnRlbnQ9IlJlc291cmNlczAzIFBBU1NFRCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9SZXNvdXJjZXMwMz9tb2RlPWNsYXNzJmFtcDtwYXRoPS9vcmcvYXBhY2hlL3Rlc3Rlci91bnBzaGFyZWQvVW5wU2hhcmVkMDMudHh0IgorICAgICAgb3V0Q29udGVudD0iUmVzb3VyY2VzMDMgUEFTU0VEIi8+CisKKyAgICA8IS0tID09PT09PT09PT0gTmVnYXRpdmUgU2VydmxldENvbnRleHQuZ2V0UmVzb3VyY2VBc1N0cmVhbSgpIFRlc3RzID09PSAtLT4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vUmVzb3VyY2VzMDQ/bW9kZT1jb250ZXh0JmFtcDtwYXRoPS9XRUItSU5GL3dlYi54bWwuYmFkIgorICAgICAgb3V0Q29udGVudD0iUmVzb3VyY2VzMDQgUEFTU0VEIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgICAgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1Jlc291cmNlczA0P21vZGU9Y29udGV4dCZhbXA7cGF0aD0vRm9yd2FyZDA0LnR4dC5iYWQiCisgICAgICBvdXRDb250ZW50PSJSZXNvdXJjZXMwNCBQQVNTRUQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vUmVzb3VyY2VzMDQ/bW9kZT1jb250ZXh0JmFtcDtwYXRoPS9JbmNsdWRlMDQudHh0LmJhZCIKKyAgICAgIG91dENvbnRlbnQ9IlJlc291cmNlczA0IFBBU1NFRCIvPgorCisgICAgPCEtLSA9PT09PT09PT09IE5lZ2F0aXZlIENsYXNzLmdldFJlc291cmNlQXNTdHJlYW0oKSBUZXN0cyA9PT09PT09PT09PT0gLS0+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgICAgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1Jlc291cmNlczA0P21vZGU9Y2xhc3MmYW1wO3BhdGg9L29yZy9hcGFjaGUvdGVzdGVyL1Jlc291cmNlczA0LnR4dC5iYWQiCisgICAgICBvdXRDb250ZW50PSJSZXNvdXJjZXMwNCBQQVNTRUQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vUmVzb3VyY2VzMDQ/bW9kZT1jbGFzcyZhbXA7cGF0aD0vb3JnL2FwYWNoZS90ZXN0ZXIvVW5wYWNrZWQwNC50eHQuYmFkIgorICAgICAgb3V0Q29udGVudD0iUmVzb3VyY2VzMDQgUEFTU0VEIi8+CisKKyAgICA8IS0tID09PT09PT09PT0gUG9zaXRpdmUgQ29tYmluZWQgZ2V0UmVzb3VyY2UvT3BlbiBUZXN0cyA9PT09PT09PT09PT09PSAtLT4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vUmVzb3VyY2VzMDU/bW9kZT1jb250ZXh0JmFtcDtwYXRoPS9XRUItSU5GL3dlYi54bWwiCisgICAgICBvdXRDb250ZW50PSImbHQ7P3htbCB2ZXJzaW9uPSZxdW90OzEuMCZxdW90OyBlbmNvZGluZz0mcXVvdDtJU08tODg1OS0xJnF1b3Q7PyZndDsiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vUmVzb3VyY2VzMDU/bW9kZT1jb250ZXh0JmFtcDtwYXRoPS9Gb3J3YXJkMDEudHh0IgorICAgICAgb3V0Q29udGVudD0iRm9yd2FyZDAxIFBBU1NFRCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9SZXNvdXJjZXMwNT9tb2RlPWNvbnRleHQmYW1wO3BhdGg9L0luY2x1ZGUwMS50eHQiCisgICAgICBvdXRDb250ZW50PSJJbmNsdWRlMDEgUEFTU0VEIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgICAgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1Jlc291cmNlczA1P21vZGU9Y2xhc3MmYW1wO3BhdGg9L29yZy9hcGFjaGUvdGVzdGVyL1Jlc291cmNlczA1LnR4dCIKKyAgICAgIG91dENvbnRlbnQ9IlJlc291cmNlczA1IFBBU1NFRCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9SZXNvdXJjZXMwNT9tb2RlPWNsYXNzJmFtcDtwYXRoPS9vcmcvYXBhY2hlL3Rlc3Rlci9VbnBhY2tlZDA1LnR4dCIKKyAgICAgIG91dENvbnRlbnQ9IlJlc291cmNlczA1IFBBU1NFRCIvPgorCisgICAgPCEtLSA9PT09PT09PT09IFBvc2l0aXZlIENvbWJpbmVkIGdldFJlc291cmNlL09wZW4vU3RyaW5naWZ5IFRlc3RzID09PT0gLS0+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgICAgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1Jlc291cmNlczA1P21vZGU9Y29udGV4dCZhbXA7cGF0aD0vV0VCLUlORi93ZWIueG1sJmFtcDtzdHJpbmdpZnk9dHJ1ZSIKKyAgICAgIG91dENvbnRlbnQ9IiZsdDs/eG1sIHZlcnNpb249JnF1b3Q7MS4wJnF1b3Q7IGVuY29kaW5nPSZxdW90O0lTTy04ODU5LTEmcXVvdDs/Jmd0OyIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9SZXNvdXJjZXMwNT9tb2RlPWNvbnRleHQmYW1wO3BhdGg9L0ZvcndhcmQwMS50eHQmYW1wO3N0cmluZ2lmeT10cnVlIgorICAgICAgb3V0Q29udGVudD0iRm9yd2FyZDAxIFBBU1NFRCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9SZXNvdXJjZXMwNT9tb2RlPWNvbnRleHQmYW1wO3BhdGg9L0luY2x1ZGUwMS50eHQmYW1wO3N0cmluZ2lmeT10cnVlIgorICAgICAgb3V0Q29udGVudD0iSW5jbHVkZTAxIFBBU1NFRCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9SZXNvdXJjZXMwNT9tb2RlPWNsYXNzJmFtcDtwYXRoPS9vcmcvYXBhY2hlL3Rlc3Rlci9SZXNvdXJjZXMwNS50eHQmYW1wO3N0cmluZ2lmeT10cnVlIgorICAgICAgb3V0Q29udGVudD0iUmVzb3VyY2VzMDUgUEFTU0VEIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgICAgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1Jlc291cmNlczA1P21vZGU9Y2xhc3MmYW1wO3BhdGg9L29yZy9hcGFjaGUvdGVzdGVyL1VucGFja2VkMDUudHh0JmFtcDtzdHJpbmdpZnk9dHJ1ZSIKKyAgICAgIG91dENvbnRlbnQ9IlJlc291cmNlczA1IFBBU1NFRCIvPgorCisgICAgPCEtLSA9PT09PT09PT09IGdldFJlc291cmNlUGF0aHMoKSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgICAgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1Jlc291cmNlczA2P3BhdGg9LyIKKyAgICAgIG91dENvbnRlbnQ9IlJlc291cmNlczA2IFBBU1NFRCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9SZXNvdXJjZXMwNj9wYXRoPS9nb2xkZW4iCisgICAgICBvdXRDb250ZW50PSJSZXNvdXJjZXMwNiBQQVNTRUQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vUmVzb3VyY2VzMDY/cGF0aD0vV0VCLUlORiIKKyAgICAgIG91dENvbnRlbnQ9IlJlc291cmNlczA2IFBBU1NFRCIvPgorCisgIDwvdGFyZ2V0PgorCisKKyAgPHRhcmdldCBuYW1lPSJTZWN1cml0eSI+CisKKyAgICA8IS0tID09PT09PT09PT0gU2VjdXJpdHkgVGVzdHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworICAgIDwhLS0gU2hvdWxkIG5vdCBiZSBhYmxlIHRvIHVzZSByZWxhdGl2ZSBwYXRoIGFib3ZlIGRvY3VtZW50IHJvb3QgLS0+CisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iSFRUUC8xLjAiCisgICAgICAgICByZXF1ZXN0PSIke2pzcC1leGFtcGxlcy5wYXRofS8uLi8uLiIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgIHN0YXR1cz0iNDAwIi8+CisKKyAgICA8IS0tIFNob3VsZCBub3QgYmUgYWJsZSB0byB1c2Ugc3BlY2lhbGx5IGNyYWZ0ZWQgVVJMcyB0byBnZXQgYXJvdW5kIAorICAgICAgICAgc2VjdXJpdHkgY29uc3RyYWludHMgLS0+CisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iSFRUUC8xLjAiCisgICAgICAgICByZXF1ZXN0PSIvdGVzdGVyLy8uL3Byb3RlY3RlZC8vQXV0aGVudGljYXRpb24wMSIgCisgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iIHN0YXR1cz0iNDAxIi8+CisKKyAgICA8IS0tIERlZmF1bHRTZXJ2bGV0IHNob3VsZCBub3QgZGVjb2RlIHRoZSBwYXRoIGFnYWluIC0tPgorICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IkhUVFAvMS4wIgorICAgICAgICAgcmVxdWVzdD0iJHtqc3AtZXhhbXBsZXMucGF0aH0vc25wL3Nub29wJTI1MmVqc3AiCisgICAgICAgICAgc3RhdHVzPSI0MDQiLz4KKworICA8L3RhcmdldD4KKworCisgIDx0YXJnZXQgbmFtZT0iU2VydmxldENvbnRleHQiPgorCisgICAgPCEtLSA9PT09PT09PT09IFNlcnZsZXQgQ29udGV4dCBBdHRyaWJ1dGVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgICAgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L0NvbnRleHQwMCIKKyAgICAgIG91dENvbnRlbnQ9IkNvbnRleHQwMCBQQVNTRUQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vQ29udGV4dDAxIgorICAgICAgb3V0Q29udGVudD0iQ29udGV4dDAxIFBBU1NFRCIvPgorCisgICAgPCEtLSBOT1RFOiBBc3NpZ24gcm9sZSAibWFuYWdlciIgdG8gdXNlciAidG9tY2F0IiBmb3IgdGhpcyB0byB3b3JrIC0tPgorICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgaW5IZWFkZXJzPSJBdXRob3JpemF0aW9uOkJhc2ljIGRHOXRZMkYwT25SdmJXTmhkQT09IgorICAgICAgICAgcmVxdWVzdD0iJHttYW5hZ2VyLnBhdGh9L3JlbG9hZD9wYXRoPSR7cmVsb2FkLnBhdGh9IgorICAgICAgb3V0Q29udGVudD0iT0sgLSAiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vQ29udGV4dDAyIgorICAgICAgb3V0Q29udGVudD0iQ29udGV4dDAyIFBBU1NFRCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9XcmFwcGVkQ29udGV4dDAwIgorICAgICAgb3V0Q29udGVudD0iQ29udGV4dDAwIFBBU1NFRCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9XcmFwcGVkQ29udGV4dDAxIgorICAgICAgb3V0Q29udGVudD0iQ29udGV4dDAxIFBBU1NFRCIvPgorCisgICAgPCEtLSBOT1RFOiBBc3NpZ24gcm9sZSAibWFuYWdlciIgdG8gdXNlciAidG9tY2F0IiBmb3IgdGhpcyB0byB3b3JrIC0tPgorICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgaW5IZWFkZXJzPSJBdXRob3JpemF0aW9uOkJhc2ljIGRHOXRZMkYwT25SdmJXTmhkQT09IgorICAgICAgICAgcmVxdWVzdD0iJHttYW5hZ2VyLnBhdGh9L3JlbG9hZD9wYXRoPSR7cmVsb2FkLnBhdGh9IgorICAgICAgb3V0Q29udGVudD0iT0sgLSAiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vV3JhcHBlZENvbnRleHQwMiIKKyAgICAgIG91dENvbnRlbnQ9IkNvbnRleHQwMiBQQVNTRUQiLz4KKworICA8L3RhcmdldD4KKworCisgIDx0YXJnZXQgbmFtZT0iU2VydmxldFJlcXVlc3QiPgorCisgICAgPCEtLSA9PT09PT09PT09IFBhcmFtZXRlcnMgYW5kIFF1ZXJ5IFN0cmluZ3MgPT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9HZXRQYXJhbWV0ZXIwMT9mb289MSIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgb3V0Q29udGVudD0iR2V0UGFyYW1ldGVyMDEgUEFTU0VEIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9XcmFwcGVkR2V0UGFyYW1ldGVyMDE/Zm9vPTEiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgIG91dENvbnRlbnQ9IkdldFBhcmFtZXRlcjAxIFBBU1NFRCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vR2V0UGFyYW1ldGVyTWFwMDA/QmVzdExhbmd1YWdlPUphdmEmYW1wO0Jlc3RKU1A9SmF2YTIiCisgICAgICBvdXRDb250ZW50PSJHZXRQYXJhbWV0ZXJNYXAwMCBQQVNTRUQiIGRlYnVnPSIke2RlYnVnfSIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vV3JhcHBlZEdldFBhcmFtZXRlck1hcDAwP0Jlc3RMYW5ndWFnZT1KYXZhJmFtcDtCZXN0SlNQPUphdmEyIgorICAgICAgb3V0Q29udGVudD0iR2V0UGFyYW1ldGVyTWFwMDAgUEFTU0VEIiBkZWJ1Zz0iJHtkZWJ1Z30iLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L0dldFF1ZXJ5U3RyaW5nMDE/Zm9vPTEiCisgICAgICBvdXRDb250ZW50PSJHZXRRdWVyeVN0cmluZzAxIFBBU1NFRCIgZGVidWc9IiR7ZGVidWd9Ii8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9XcmFwcGVkR2V0UXVlcnlTdHJpbmcwMT9mb289MSIKKyAgICAgIG91dENvbnRlbnQ9IkdldFF1ZXJ5U3RyaW5nMDEgUEFTU0VEIiBkZWJ1Zz0iJHtkZWJ1Z30iLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iIG1ldGhvZD0iUE9TVCIKKyAgICAgICBpbkhlYWRlcnM9IkNvbnRlbnQtVHlwZTphcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiCisgICAgICAgaW5Db250ZW50PSJiPTMmYW1wO2E9MiIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9BZ2dyZWdhdGUwMT9hPTEiCisgICAgICBvdXRDb250ZW50PSJBZ2dyZWdhdGUwMSBQQVNTRUQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iIG1ldGhvZD0iUE9TVCIKKyAgICAgICBpbkhlYWRlcnM9IkNvbnRlbnQtVHlwZTphcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiCisgICAgICAgaW5Db250ZW50PSJiPTMmYW1wO2E9MiIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9XcmFwcGVkQWdncmVnYXRlMDE/YT0xIgorICAgICAgb3V0Q29udGVudD0iQWdncmVnYXRlMDEgUEFTU0VEIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgICAgZGVidWc9IiR7ZGVidWd9IiBtZXRob2Q9IlBPU1QiCisgICAgICAgaW5IZWFkZXJzPSJDb250ZW50LVR5cGU6YXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIgorICAgICAgIGluQ29udGVudD0iYj0zJmFtcDthPTIiCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vQWdncmVnYXRlMDI/YT0xIgorICAgICAgb3V0Q29udGVudD0iQWdncmVnYXRlMDIgUEFTU0VEIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgICAgZGVidWc9IiR7ZGVidWd9IiBtZXRob2Q9IlBPU1QiCisgICAgICAgaW5IZWFkZXJzPSJDb250ZW50LVR5cGU6YXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIgorICAgICAgIGluQ29udGVudD0iYj0zJmFtcDthPTIiCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vV3JhcHBlZEFnZ3JlZ2F0ZTAyP2E9MSIKKyAgICAgIG91dENvbnRlbnQ9IkFnZ3JlZ2F0ZTAyIFBBU1NFRCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9SZXF1ZXN0MDEiCisgICAgICBvdXRDb250ZW50PSJSZXF1ZXN0MDEgUEFTU0VEIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgICAgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1dyYXBwZWRSZXF1ZXN0MDEiCisgICAgICBvdXRDb250ZW50PSJSZXF1ZXN0MDEgUEFTU0VEIi8+CisKKyAgICA8IS0tID09PT09PT09PT0gT3RoZXIgU2VydmxldFJlcXVlc3QgVGVzdHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworICAgIDwhLS0gSHR0cFVSTENvbm5lY3Rpb24gZG9lcyBub3QgaGFuZGxlIG11bHRpcGxlIGhlYWRlcnMgZm9yIHRoZSBzYW1lCisgICAgICAgICBuYW1lIGNvcnJlY3RseSwgc28gdXNlIG5hdGl2ZSBzb2NrZXQgY29ubmVjdGlvbnMsIHNlbGVjdGVkIGJ5CisgICAgICAgICBzZXR0aW5nIHRoZSBwcm90b2NvbCB0byAiSFRUUC8xLjAiIC0tPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iSFRUUC8xLjAiCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vR2V0SGVhZGVyczAxIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgaW5IZWFkZXJzPSJBY2NlcHQtTGFuZ3VhZ2U6ZW4tdXMjI0FjY2VwdC1MYW5ndWFnZTplbi1nYiIKKyAgICAgIG91dENvbnRlbnQ9IkdldEhlYWRlcnMwMSBQQVNTRUQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IkhUVFAvMS4wIgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1dyYXBwZWRHZXRIZWFkZXJzMDEiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICBpbkhlYWRlcnM9IkFjY2VwdC1MYW5ndWFnZTplbi11cyMjQWNjZXB0LUxhbmd1YWdlOmVuLWdiIgorICAgICAgb3V0Q29udGVudD0iR2V0SGVhZGVyczAxIFBBU1NFRCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vR2V0SW5wdXRTdHJlYW0wMSIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgb3V0Q29udGVudD0iR2V0SW5wdXRTdHJlYW0wMSBQQVNTRUQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1dyYXBwZWRHZXRJbnB1dFN0cmVhbTAxIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICBvdXRDb250ZW50PSJHZXRJbnB1dFN0cmVhbTAxIFBBU1NFRCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iSFRUUC8xLjAiCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vR2V0TG9jYWxlczAxIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgaW5IZWFkZXJzPSJBY2NlcHQtTGFuZ3VhZ2U6ZW4tY2EjI0FjY2VwdC1MYW5ndWFnZTplbi1nYiIKKyAgICAgIG91dENvbnRlbnQ9IkdldExvY2FsZXMwMSBQQVNTRUQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IkhUVFAvMS4wIgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1dyYXBwZWRHZXRMb2NhbGVzMDEiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICBpbkhlYWRlcnM9IkFjY2VwdC1MYW5ndWFnZTplbi1jYSMjQWNjZXB0LUxhbmd1YWdlOmVuLWdiIgorICAgICAgb3V0Q29udGVudD0iR2V0TG9jYWxlczAxIFBBU1NFRCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iSFRUUC8xLjAiCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vR2V0TG9jYWxlczAxIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgaW5IZWFkZXJzPSJBY2NlcHQtTGFuZ3VhZ2U6ZW4tY2EsZW4tZ2IiCisgICAgICBvdXRDb250ZW50PSJHZXRMb2NhbGVzMDEgUEFTU0VEIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSJIVFRQLzEuMCIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9XcmFwcGVkR2V0TG9jYWxlczAxIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgaW5IZWFkZXJzPSJBY2NlcHQtTGFuZ3VhZ2U6ZW4tY2EsZW4tZ2IiCisgICAgICBvdXRDb250ZW50PSJHZXRMb2NhbGVzMDEgUEFTU0VEIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSJIVFRQLzEuMCIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9HZXRMb2NhbGVzMDIiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICBpbkhlYWRlcnM9IkFjY2VwdC1MYW5ndWFnZTplbi1jYSMjQWNjZXB0LUxhbmd1YWdlOmVuLWdiIgorICAgICAgb3V0Q29udGVudD0iR2V0TG9jYWxlczAyIFBBU1NFRCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iSFRUUC8xLjAiCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vV3JhcHBlZEdldExvY2FsZXMwMiIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgIGluSGVhZGVycz0iQWNjZXB0LUxhbmd1YWdlOmVuLWNhIyNBY2NlcHQtTGFuZ3VhZ2U6ZW4tZ2IiCisgICAgICBvdXRDb250ZW50PSJHZXRMb2NhbGVzMDIgUEFTU0VEIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSJIVFRQLzEuMCIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9HZXRMb2NhbGVzMDIiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICBpbkhlYWRlcnM9IkFjY2VwdC1MYW5ndWFnZTplbi1jYSxlbi1nYiIKKyAgICAgIG91dENvbnRlbnQ9IkdldExvY2FsZXMwMiBQQVNTRUQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IkhUVFAvMS4wIgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1dyYXBwZWRHZXRMb2NhbGVzMDIiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICBpbkhlYWRlcnM9IkFjY2VwdC1MYW5ndWFnZTplbi1jYSxlbi1nYiIKKyAgICAgIG91dENvbnRlbnQ9IkdldExvY2FsZXMwMiBQQVNTRUQiLz4KKworICA8L3RhcmdldD4KKworCisgIDx0YXJnZXQgbmFtZT0iU2VydmxldFJlc3BvbnNlIj4KKworCisgICAgPCEtLSA9PT09PT09PT09IE90aGVyIFNlcnZsZXRSZXNwb25zZSBUZXN0cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9SZXNldDAxIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICBvdXRDb250ZW50PSJSZXNldDAxIFBBU1NFRCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vV3JhcHBlZFJlc2V0MDEiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgIG91dENvbnRlbnQ9IlJlc2V0MDEgUEFTU0VEIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9TZXRCdWZmZXJTaXplMDEiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgIG91dENvbnRlbnQ9IlNldEJ1ZmZlclNpemUwMSBQQVNTRUQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1dyYXBwZWRTZXRCdWZmZXJTaXplMDEiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgIG91dENvbnRlbnQ9IlNldEJ1ZmZlclNpemUwMSBQQVNTRUQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1NldExvY2FsZTAxIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICBvdXRDb250ZW50PSJTZXRMb2NhbGUwMSBQQVNTRUQiCisgICAgICBvdXRIZWFkZXJzPSJDb250ZW50LUxhbmd1YWdlOmVuLVVTIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9XcmFwcGVkU2V0TG9jYWxlMDEiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgIG91dENvbnRlbnQ9IlNldExvY2FsZTAxIFBBU1NFRCIKKyAgICAgIG91dEhlYWRlcnM9IkNvbnRlbnQtTGFuZ3VhZ2U6ZW4tVVMiLz4KKworCisgICAgPCEtLSA9PT09PT09PT09IFNlbmRSZWRpcmVjdCBIYW5kbGluZyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKyAgICA8IS0tIEFsc28gY2hlY2sgZGVidWcgb3V0cHV0IHRvIG1ha2Ugc3VyZSBubyBleHRyYSBjb250ZW50IHdhcyBpbmNsdWRlZCAtLT4KKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIiCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vUmVkaXJlY3QwMSIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgb3V0Q29udGVudD0iIgorICAgICAgICAgIHN0YXR1cz0iMzAyIiByZWRpcmVjdD0iZmFsc2UiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9SZWRpcmVjdDAxIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICBvdXRDb250ZW50PSJSZWRpcmVjdDAxYSBQQVNTRUQiIHJlZGlyZWN0PSJ0cnVlIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIiCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vV3JhcHBlZFJlZGlyZWN0MDEiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgIG91dENvbnRlbnQ9IlJlZGlyZWN0MDFhIFBBU1NFRCIgcmVkaXJlY3Q9InRydWUiLz4KKworICAgIDwhLS0gSlNQIHBhZ2UgaW5jbHVkZXMgInJldHVybiIgYWZ0ZXIgcmVkaXJlY3QgLS0+CisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iIgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1JlZGlyZWN0MDIuanNwIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICBvdXRDb250ZW50PSJSZWRpcmVjdDAyYS5qc3AgUEFTU0VEIiByZWRpcmVjdD0idHJ1ZSIvPgorCisgICAgPCEtLSBTYW1lIGFzICJSZWRpcmVjdDAyLmpzcCIgZXhjZXB0IHdpdGhvdXQgdGhlICJyZXR1cm4iIC0tPgorICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9SZWRpcmVjdDAzLmpzcCIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgb3V0Q29udGVudD0iUmVkaXJlY3QwM2EuanNwIFBBU1NFRCIgcmVkaXJlY3Q9InRydWUiLz4KKworICA8L3RhcmdldD4KKworCisgIDx0YXJnZXQgbmFtZT0iSHR0cFNlc3Npb24iPgorCisgICAgPCEtLSA9PT09PT09PT09IFNlc3Npb24gQXR0cmlidXRlIFBlcnNpc3RlbmNlID09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9TZXNzaW9uMDEiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgIG91dENvbnRlbnQ9IlNlc3Npb24wMSBQQVNTRUQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1Nlc3Npb24wMiIgZGVidWc9IiR7ZGVidWd9IgorICAgICBqb2luU2Vzc2lvbj0idHJ1ZSIKKyAgICAgIG91dENvbnRlbnQ9IlNlc3Npb24wMiBQQVNTRUQiLz4KKworICAgIDwhLS0gTk9URTogQXNzaWduIHJvbGUgIm1hbmFnZXIiIHRvIHVzZXIgInRvbWNhdCIgZm9yIHRoaXMgdG8gd29yayAtLT4KKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgICAgZGVidWc9IiR7ZGVidWd9IgorICAgICAgIGluSGVhZGVycz0iQXV0aG9yaXphdGlvbjpCYXNpYyBkRzl0WTJGME9uUnZiV05oZEE9PSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7bWFuYWdlci5wYXRofS9yZWxvYWQ/cGF0aD0ke3JlbG9hZC5wYXRofSIKKyAgICAgIG91dENvbnRlbnQ9Ik9LIC0gIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9TZXNzaW9uMDMiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgam9pblNlc3Npb249InRydWUiCisgICAgICBvdXRDb250ZW50PSJTZXNzaW9uMDMgUEFTU0VEIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9TZXNzaW9uMDQiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgam9pblNlc3Npb249InRydWUiCisgICAgICBvdXRDb250ZW50PSJTZXNzaW9uMDQgUEFTU0VEIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9XcmFwcGVkU2Vzc2lvbjAxIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICBvdXRDb250ZW50PSJTZXNzaW9uMDEgUEFTU0VEIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9XcmFwcGVkU2Vzc2lvbjAyIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgIGpvaW5TZXNzaW9uPSJ0cnVlIgorICAgICAgb3V0Q29udGVudD0iU2Vzc2lvbjAyIFBBU1NFRCIvPgorCisgICAgPCEtLSBOT1RFOiBBc3NpZ24gcm9sZSAibWFuYWdlciIgdG8gdXNlciAidG9tY2F0IiBmb3IgdGhpcyB0byB3b3JrIC0tPgorICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgaW5IZWFkZXJzPSJBdXRob3JpemF0aW9uOkJhc2ljIGRHOXRZMkYwT25SdmJXTmhkQT09IgorICAgICAgICAgcmVxdWVzdD0iJHttYW5hZ2VyLnBhdGh9L3JlbG9hZD9wYXRoPSR7cmVsb2FkLnBhdGh9IgorICAgICAgb3V0Q29udGVudD0iT0sgLSAiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1dyYXBwZWRTZXNzaW9uMDMiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgam9pblNlc3Npb249InRydWUiCisgICAgICBvdXRDb250ZW50PSJTZXNzaW9uMDMgUEFTU0VEIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9XcmFwcGVkU2Vzc2lvbjA0IiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgIGpvaW5TZXNzaW9uPSJ0cnVlIgorICAgICAgb3V0Q29udGVudD0iU2Vzc2lvbjA0IFBBU1NFRCIvPgorCisgICAgPCEtLSBFeGVyY2lzZSBzZXNzaW9uIGV2ZW50IGxpc3RlbmVycyAtLT4KKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9TZXNzaW9uMDUiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgICBnb2xkZW49IiR7Z29sZGVuLnBhdGh9L1Nlc3Npb24wNS50eHQiLz4KKworICAgIDwhLS0gRXhlcmNpc2Ugc2Vzc2lvbiBldmVudCBsaXN0ZW5lcnMgLS0+CisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vV3JhcHBlZFNlc3Npb24wNSIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgIGdvbGRlbj0iJHtnb2xkZW4ucGF0aH0vV3JhcHBlZFNlc3Npb24wNS50eHQiLz4KKworICAgIDwhLS0gU2Vzc2lvbiBjcmVhdGlvbiBhZnRlciByZXNwb25zZSBoYXMgYmVlbiBjb21taXR0ZWQgLS0+CisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vU2Vzc2lvbjA2IiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICBvdXRDb250ZW50PSJTZXNzaW9uMDYgUEFTU0VEIi8+CisKKyAgICA8IS0tIFNlc3Npb24gY3JlYXRpb24gYWZ0ZXIgcmVzcG9uc2UgaGFzIGJlZW4gY29tbWl0dGVkIC0tPgorICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1dyYXBwZWRTZXNzaW9uMDYiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgIG91dENvbnRlbnQ9IlNlc3Npb24wNiBQQVNTRUQiLz4KKworICAgIDwhLS0gPT09PT09PT09PSBQYXNzIEF0dHJpYnV0ZXMgQWNyb3NzIFJlZGlyZWN0ID09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCisgICAgPCEtLSBTZXNzaW9uIG1haW50YWluZWQgYWNyb3NzIHJlZGlyZWN0IC0tPgorICAgIDwhLS0gTk9URTogIFRoZSBmb2xsb3dpbmcgdHdvLXN0ZXAgcGF0dGVybiBpcyByZXF1aXJlZCBiZWNhdXNlCisgICAgICAgICBIdHRwVVJMQ29ubmVjdGlvbiBkb2VzIG5vdCBmb3J3YXJkIHRoZSBzZXNzaW9uIGNvb2tpZSBpdAorICAgICAgICAgcmVjZWl2ZXMgb24gdG8gdGhlIHJlZGlyZWN0ZWQgbG9jYXRpb24gKHRoZSB3YXkgdGhhdCBhCisgICAgICAgICBicm93c2VyIHdpbGwgZG8gc28pIC0tPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vU2Vzc2lvbjA3YS5qc3AiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgICBzdGF0dXM9IjMwMiIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vU2Vzc2lvbjA3Yi5qc3AiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgam9pblNlc3Npb249InRydWUiCisgICAgICBvdXRDb250ZW50PSJTZXNzaW9uMDcgUEFTU0VEIi8+CisKKyAgPC90YXJnZXQ+CisKKworICA8dGFyZ2V0IG5hbWU9IlhlcmNlc1Rlc3QiPgorCisgICAgPCEtLSA9PT09PT09PT09IFhlcmNlcyBTZWFsaW5nIFZpb2xhdGlvbiBUZXN0ID09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9YZXJjZXMwMC5qc3AiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgIG91dENvbnRlbnQ9IlhlcmNlczAwIFBBU1NFRCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vWGVyY2VzMDAiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgIG91dENvbnRlbnQ9IlhlcmNlczAwIFBBU1NFRCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vV3JhcHBlZFhlcmNlczAwIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICBvdXRDb250ZW50PSJYZXJjZXMwMCBQQVNTRUQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1hlcmNlczAxIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICBvdXRDb250ZW50PSJYZXJjZXMwMSBQQVNTRUQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1dyYXBwZWRYZXJjZXMwMSIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgb3V0Q29udGVudD0iWGVyY2VzMDEgUEFTU0VEIi8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9YZXJjZXMwMi5qc3AiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgIG91dENvbnRlbnQ9IlhlcmNlczAyIFBBU1NFRCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vWGVyY2VzMDIiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgIG91dENvbnRlbnQ9IlhlcmNlczAyIFBBU1NFRCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vV3JhcHBlZFhlcmNlczAyIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICBvdXRDb250ZW50PSJYZXJjZXMwMiBQQVNTRUQiLz4KKworICA8L3RhcmdldD4KKworPCEtLQorPHRhcmdldCBuYW1lPSJTU0lUZXN0Ij4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1NTSUluY2x1ZGUwMS5zaHRtbCIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgIGdvbGRlbj0iJHtnb2xkZW4ucGF0aH0vU1NJSW5jbHVkZTAxLnR4dCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vU1NJSW5jbHVkZTAyLnNodG1sIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICAgZ29sZGVuPSIke2dvbGRlbi5wYXRofS9TU0lJbmNsdWRlMDIudHh0Ii8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9TU0lJbmNsdWRlMDMuc2h0bWwiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgICBnb2xkZW49IiR7Z29sZGVuLnBhdGh9L1NTSUluY2x1ZGUwMi50eHQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1NTSUluY2x1ZGUwNC5zaHRtbCIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgIGdvbGRlbj0iJHtnb2xkZW4ucGF0aH0vU1NJSW5jbHVkZTAyLnR4dCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vU1NJSW5jbHVkZTA1LnNodG1sIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICAgZ29sZGVuPSIke2dvbGRlbi5wYXRofS9TU0lJbmNsdWRlMDIudHh0Ii8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9TU0lJbmNsdWRlMDYuc2h0bWwiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgICBnb2xkZW49IiR7Z29sZGVuLnBhdGh9L1NTSUluY2x1ZGUwMi50eHQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1NTSUluY2x1ZGUwNy5zaHRtbCIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgIGdvbGRlbj0iJHtnb2xkZW4ucGF0aH0vU1NJSW5jbHVkZTAyLnR4dCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vU1NJSW5jbHVkZTA4LnNodG1sIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICAgZ29sZGVuPSIke2dvbGRlbi5wYXRofS9TU0lJbmNsdWRlMDIudHh0Ii8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9TU0lJbmNsdWRlMDkuc2h0bWwiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgICBnb2xkZW49IiR7Z29sZGVuLnBhdGh9L1NTSUluY2x1ZGUwMy50eHQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1NTSUNvbmZpZzAxLnNodG1sIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICAgZ29sZGVuPSIke2dvbGRlbi5wYXRofS9TU0lDb25maWcwMS50eHQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1NTSUNvbmZpZzAzLnNodG1sIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICAgZ29sZGVuPSIke2dvbGRlbi5wYXRofS9TU0lDb25maWcwMy50eHQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1NTSUZzaXplMDEuc2h0bWwiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgICBnb2xkZW49IiR7Z29sZGVuLnBhdGh9L1NTSUluY2x1ZGUwMS50eHQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1NTSUZzaXplMDIuc2h0bWwiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgICBnb2xkZW49IiR7Z29sZGVuLnBhdGh9L1NTSUZzaXplMDIudHh0Ii8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9TU0lGc2l6ZTAzLnNodG1sIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICAgZ29sZGVuPSIke2dvbGRlbi5wYXRofS9TU0lGc2l6ZTAyLnR4dCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vU1NJRnNpemUwNC5zaHRtbCIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgIGdvbGRlbj0iJHtnb2xkZW4ucGF0aH0vU1NJRnNpemUwMi50eHQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1NTSUZzaXplMDUuc2h0bWwiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgICBnb2xkZW49IiR7Z29sZGVuLnBhdGh9L1NTSUZzaXplMDIudHh0Ii8+CisKKyAgICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9TU0lGc2l6ZTA2LnNodG1sIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICAgZ29sZGVuPSIke2dvbGRlbi5wYXRofS9TU0lGc2l6ZTAyLnR4dCIvPgorCisgICAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vU1NJRnNpemUwNy5zaHRtbCIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICAgIGdvbGRlbj0iJHtnb2xkZW4ucGF0aH0vU1NJRnNpemUwMi50eHQiLz4KKworICAgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L1NTSUZzaXplMDguc2h0bWwiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgICBnb2xkZW49IiR7Z29sZGVuLnBhdGh9L1NTSUZzaXplMDIudHh0Ii8+CisKKyAgPC90YXJnZXQ+CistLT4KKworPCEtLQorICA8dGFyZ2V0IG5hbWU9IkNHSVRlc3QiPgorCisgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vY2dpLWJpbi9hcnJheS5wbCIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICBnb2xkZW49IiR7Z29sZGVuLnBhdGh9L2FycmF5LnR4dCIvPgorCisgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vY2dpLWJpbi9iaW5hcnkucGw/Y291bnRlcj0xMDIiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgZ29sZGVuPSIke2dvbGRlbi5wYXRofS9iaW5hcnkudHh0Ii8+CisKKyAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9jZ2ktYmluL2NvbmNhdC5wbD9maXJzdF9uYW1lPWphbmUmYW1wO2xhc3RfbmFtZT1qb2huc29uJmFtcDtmaWFuY2VfZmlyc3Q9am9obiZhbXA7ZmlhbmNlX2xhc3Q9c21pdGgiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgZ29sZGVuPSIke2dvbGRlbi5wYXRofS9jb25jYXQudHh0Ii8+CisKKyAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9jZ2ktYmluL2RheXMucGwiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgZ29sZGVuPSIke2dvbGRlbi5wYXRofS9kYXlzLnR4dCIvPgorCisgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vY2dpLWJpbi9kb3doaWxlLnBsP3N0YXJ0PTEwIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgIGdvbGRlbj0iJHtnb2xkZW4ucGF0aH0vZG93aGlsZS50eHQiLz4KKworICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L2NnaS1iaW4vZWxzZS5wbD9mb29kPXNwaW5hY2giIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgZ29sZGVuPSIke2dvbGRlbi5wYXRofS9lbHNlLnR4dCIvPgorCisgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vY2dpLWJpbi9lbHNpZi5wbD9mb29kPWNob2NvbGF0ZSIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICBnb2xkZW49IiR7Z29sZGVuLnBhdGh9L2Vsc2lmLnR4dCIvPgorCisgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vY2dpLWJpbi9leHBvbmVudHMucGw/bnVtYmVyPTImYW1wO3Bvd2VyPTQiIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgZ29sZGVuPSIke2dvbGRlbi5wYXRofS9leHBvbmVudHMudHh0Ii8+CisKKyAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9jZ2ktYmluL2Zvci5wbD9zdGFydD0xMCIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICBnb2xkZW49IiR7Z29sZGVuLnBhdGh9L2Rvd2hpbGUudHh0Ii8+CisKKyAgPHRlc3RlciBob3N0PSIke2hvc3R9IiBwb3J0PSIke3BvcnR9IiBwcm90b2NvbD0iJHtwcm90b2NvbH0iCisgICAgICAgIHJlcXVlc3Q9IiR7Y29udGV4dC5wYXRofS9jZ2ktYmluL2dldGRheS5wbCIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICBnb2xkZW49IiR7Z29sZGVuLnBhdGh9L2dldGRheS50eHQiLz4KKworICA8dGVzdGVyIGhvc3Q9IiR7aG9zdH0iIHBvcnQ9IiR7cG9ydH0iIHByb3RvY29sPSIke3Byb3RvY29sfSIKKyAgICAgICAgcmVxdWVzdD0iJHtjb250ZXh0LnBhdGh9L2NnaS1iaW4vaGVsbG9wZXJsLnBsIiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgIGdvbGRlbj0iJHtnb2xkZW4ucGF0aH0vaGVsbG9wZXJsLnR4dCIvPgorCisgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vY2dpLWJpbi9pZi5wbD9mb29kPXNwaW5hY2giIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgZ29sZGVuPSIke2dvbGRlbi5wYXRofS9lbHNlLnR4dCIvPgorCisgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vY2dpLWJpbi9pbmNyZW1lbnQucGw/Y291bnRlcj03IiBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgIGdvbGRlbj0iJHtnb2xkZW4ucGF0aH0vaW5jcmVtZW50LnR4dCIvPgorCisgIDx0ZXN0ZXIgaG9zdD0iJHtob3N0fSIgcG9ydD0iJHtwb3J0fSIgcHJvdG9jb2w9IiR7cHJvdG9jb2x9IgorICAgICAgICByZXF1ZXN0PSIke2NvbnRleHQucGF0aH0vY2dpLWJpbi9tb2RpZnlhbGwucGw/bnVtYmVyPTI4OSIgZGVidWc9IiR7ZGVidWd9IgorICAgICAgICBnb2xkZW49IiR7Z29sZGVuLnBhdGh9L21vZGlmeWFsbC50eHQiLz4KKworICA8L3RhcmdldD4KKy0tPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy9jb25mL3RvbWNhdC11c2Vycy54bWwgYi9jb250YWluZXIvdGVzdGVyL3NyYy9jb25mL3RvbWNhdC11c2Vycy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJmNTc3YQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL2NvbmYvdG9tY2F0LXVzZXJzLnhtbApAQCAtMCwwICsxLDggQEAKKzw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J3V0Zi04Jz8+Cis8dG9tY2F0LXVzZXJzPgorICA8cm9sZSByb2xlbmFtZT0idG9tY2F0Ii8+CisgIDxyb2xlIHJvbGVuYW1lPSJyb2xlMSIvPgorICA8dXNlciB1c2VybmFtZT0idG9tY2F0IiBwYXNzd29yZD0idG9tY2F0IiByb2xlcz0idG9tY2F0LGFkbWluLG1hbmFnZXIiLz4KKyAgPHVzZXIgdXNlcm5hbWU9InJvbGUxIiBwYXNzd29yZD0idG9tY2F0IiByb2xlcz0icm9sZTEiLz4KKyAgPHVzZXIgdXNlcm5hbWU9ImJvdGgiIHBhc3N3b3JkPSJ0b21jYXQiIHJvbGVzPSJ0b21jYXQscm9sZTEiLz4KKzwvdG9tY2F0LXVzZXJzPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0FnZ3JlZ2F0ZTAxLmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvQWdncmVnYXRlMDEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGNjNTJhCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0FnZ3JlZ2F0ZTAxLmphdmEKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwLCAyMDAxICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lio7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7CisKKy8qKgorICogVGVzdCBhZ2dyZWdhdGlvbiBvZiBxdWVyeSBzdHJpbmcgYW5kIFBPU1QgcGFyYW1ldGVycy4gIEFjY29yZGluZyB0bworICogU2VydmxldCAyLjQgUEZELCBTZWN0aW9uIDQuMSwgYWxsIHN1Y2ggcGFyYW1ldGVycyBzaG91bGQgYmUgYWdncmVnYXRlZCwKKyAqIGFuZCBpZiB0aGVyZSBhcmUgZHVwbGljYXRlIHBhcmFtZXRlciBuYW1lcyBmcm9tIGJvdGggc291cmNlcywgdGhlCisgKiBwYXJhbWV0ZXIgdmFsdWUocykgZnJvbSB0aGUgcXVlcnkgc3RyaW5nIHNob3VsZCBhcHBlYXIgZmlyc3QgaW4gdGhlCisgKiB2YWx1ZXMgcmV0dXJuZWQgYnkgcmVxdWVzdC5nZXRQYXJhbWV0ZXJWYWx1ZXMoKS4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEFnZ3JlZ2F0ZTAxIGV4dGVuZHMgSHR0cFNlcnZsZXQgeworCisgICAgcHVibGljIHZvaWQgZG9Qb3N0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7CisgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworCisgICAgICAgIC8vIEFjY3VtdWxhdGUgYW55IGVycm9ycyB0aGF0IGFyZSBub3RpY2VkCisgICAgICAgIFN0cmluZ0J1ZmZlciBlcnJvcnMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIFN0cmluZyB2YWx1ZXNbXSA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyVmFsdWVzKCJhIik7CisgICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkKKyAgICAgICAgICAgIGVycm9ycy5hcHBlbmQoIiAgUmVjZWl2ZWQgbm8gcGFyYW1ldGVyIHZhbHVlcyBmb3IgJ2EnLiIpOworICAgICAgICBlbHNlIGlmICh2YWx1ZXMubGVuZ3RoICE9IDIpCisgICAgICAgICAgICBlcnJvcnMuYXBwZW5kKCIgIFJlY2VpdmVkICIgKyB2YWx1ZXMubGVuZ3RoICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiBwYXJhbWV0ZXIgdmFsdWVzIGZvciAnYScgaW5zdGVhZCBvZiAyLiIpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmICghIjEiLmVxdWFscyh2YWx1ZXNbMF0pKQorICAgICAgICAgICAgICAgIGVycm9ycy5hcHBlbmQoIiAgRmlyc3QgdmFsdWUgZm9yICdhJyB3YXMgJyIgKyB2YWx1ZXNbMF0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIicgaW5zdGVhZCBvZiAnMScuIik7CisgICAgICAgICAgICBpZiAoISIyIi5lcXVhbHModmFsdWVzWzFdKSkKKyAgICAgICAgICAgICAgICBlcnJvcnMuYXBwZW5kKCIgIFNlY29uZCB2YWx1ZSBmb3IgJ2EnIHdhcyAnIiArIHZhbHVlc1sxXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJyBpbnN0ZWFkIG9mICcyJy4iKTsKKyAgICAgICAgfQorICAgICAgICB2YWx1ZXMgPSByZXF1ZXN0LmdldFBhcmFtZXRlclZhbHVlcygiYiIpOworICAgICAgICBpZiAodmFsdWVzID09IG51bGwpCisgICAgICAgICAgICBlcnJvcnMuYXBwZW5kKCIgIFJlY2VpdmVkIG5vIHBhcmFtZXRlciB2YWx1ZXMgZm9yICdiJy4iKTsKKyAgICAgICAgZWxzZSBpZiAodmFsdWVzLmxlbmd0aCAhPSAxKQorICAgICAgICAgICAgZXJyb3JzLmFwcGVuZCgiICBSZWNlaXZlZCAiICsgdmFsdWVzLmxlbmd0aCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICIgcGFyYW1ldGVyIHZhbHVlcyBmb3IgJ2InIGluc3RlYWQgb2YgMS4iKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAoISIzIi5lcXVhbHModmFsdWVzWzBdKSkKKyAgICAgICAgICAgICAgICBlcnJvcnMuYXBwZW5kKCIgIFZhbHVlIGZvciAnYicgd2FzICciICsgdmFsdWVzWzBdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICInIGluc3RlYWQgb2YgJzMnLiIpOworICAgICAgICB9CisgICAgICAgIEVudW1lcmF0aW9uIG5hbWVzID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXJOYW1lcygpOworICAgICAgICB3aGlsZSAobmFtZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZykgbmFtZXMubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgIGlmICgiYSIuZXF1YWxzKG5hbWUpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKCJiIi5lcXVhbHMobmFtZSkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBlcnJvcnMuYXBwZW5kKCIgIFJlY2VpdmVkIHBhcmFtZXRlciAnIiArIG5hbWUgKyAiJy4iKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlcG9ydCB0aGUgcmVzdWx0cworICAgICAgICBpZiAoZXJyb3JzLmxlbmd0aCgpIDwgMSkKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJBZ2dyZWdhdGUwMSBQQVNTRUQiKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIkFnZ3JlZ2F0ZTAxIEZBSUxFRCAtIiArIGVycm9ycy50b1N0cmluZygpKTsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gU3RhdGljTG9nZ2VyLnJlYWQoKTsKKyAgICAgICAgICAgIGlmIChtZXNzYWdlID09IG51bGwpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihtZXNzYWdlKTsKKyAgICAgICAgfQorICAgICAgICBTdGF0aWNMb2dnZXIucmVzZXQoKTsKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0FnZ3JlZ2F0ZTAyLmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvQWdncmVnYXRlMDIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGY5MGVlCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0FnZ3JlZ2F0ZTAyLmphdmEKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwgMjAwMCwgMjAwMSAsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50ZXN0ZXI7CisKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lio7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7CisKKy8qKgorICogVGVzdCBhZ2dyZWdhdGlvbiBvZiBxdWVyeSBzdHJpbmcgYW5kIFBPU1QgcGFyYW1ldGVycy4gIEFjY29yZGluZyB0bworICogU2VydmxldCAyLjQgUEZELCBTZWN0aW9uIDQuMSwgYWxsIHN1Y2ggcGFyYW1ldGVycyBzaG91bGQgYmUgYWdncmVnYXRlZCwKKyAqIGFuZCBpZiB0aGVyZSBhcmUgZHVwbGljYXRlIHBhcmFtZXRlciBuYW1lcyBmcm9tIGJvdGggc291cmNlcywgdGhlCisgKiBwYXJhbWV0ZXIgdmFsdWUocykgZnJvbSB0aGUgcXVlcnkgc3RyaW5nIHNob3VsZCBhcHBlYXIgZmlyc3QgaW4gdGhlCisgKiB2YWx1ZXMgcmV0dXJuZWQgYnkgcmVxdWVzdC5nZXRQYXJhbWV0ZXJWYWx1ZXMoKS4KKyAqIDxwPgorICogVGhpcyB0ZXN0IGlzIHRoZSBzYW1lIGFzIEFnZ3JlZ2F0ZTAxLCBleGNlcHQgdGhhdCBpdCB1c2VzIHRoZSBuZXcKKyAqIDxjb2RlPmdldFBhcmFtZXRlck1hcCgpPC9jb2RlPiBtZXRob2QgdG8gcmV0cmlldmUgcGFyYW1ldGVyIHZhbHVlcy4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEFnZ3JlZ2F0ZTAyIGV4dGVuZHMgSHR0cFNlcnZsZXQgeworCisgICAgcHVibGljIHZvaWQgZG9Qb3N0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7CisgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworCisgICAgICAgIC8vIEFjY3VtdWxhdGUgYW55IGVycm9ycyB0aGF0IGFyZSBub3RpY2VkCisgICAgICAgIFN0cmluZ0J1ZmZlciBlcnJvcnMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIE1hcCBtYXAgPSByZXF1ZXN0LmdldFBhcmFtZXRlck1hcCgpOworICAgICAgICBpZiAobWFwID09IG51bGwpIHsKKyAgICAgICAgICAgIGVycm9ycy5hcHBlbmQoIiAgTm8gcGFyYW1ldGVyIG1hcCByZXR1cm5lZC4iKTsKKyAgICAgICAgICAgIG1hcCA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIHZhbHVlc1tdID0gKFN0cmluZ1tdKSBtYXAuZ2V0KCJhIik7CisgICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkKKyAgICAgICAgICAgIGVycm9ycy5hcHBlbmQoIiAgUmVjZWl2ZWQgbm8gcGFyYW1ldGVyIHZhbHVlcyBmb3IgJ2EnLiIpOworICAgICAgICBlbHNlIGlmICh2YWx1ZXMubGVuZ3RoICE9IDIpCisgICAgICAgICAgICBlcnJvcnMuYXBwZW5kKCIgIFJlY2VpdmVkICIgKyB2YWx1ZXMubGVuZ3RoICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiBwYXJhbWV0ZXIgdmFsdWVzIGZvciAnYScgaW5zdGVhZCBvZiAyLiIpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmICghIjEiLmVxdWFscyh2YWx1ZXNbMF0pKQorICAgICAgICAgICAgICAgIGVycm9ycy5hcHBlbmQoIiAgRmlyc3QgdmFsdWUgZm9yICdhJyB3YXMgJyIgKyB2YWx1ZXNbMF0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIicgaW5zdGVhZCBvZiAnMScuIik7CisgICAgICAgICAgICBpZiAoISIyIi5lcXVhbHModmFsdWVzWzFdKSkKKyAgICAgICAgICAgICAgICBlcnJvcnMuYXBwZW5kKCIgIFNlY29uZCB2YWx1ZSBmb3IgJ2EnIHdhcyAnIiArIHZhbHVlc1sxXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJyBpbnN0ZWFkIG9mICcyJy4iKTsKKyAgICAgICAgfQorICAgICAgICB2YWx1ZXMgPSAoU3RyaW5nW10pIG1hcC5nZXQoImIiKTsKKyAgICAgICAgaWYgKHZhbHVlcyA9PSBudWxsKQorICAgICAgICAgICAgZXJyb3JzLmFwcGVuZCgiICBSZWNlaXZlZCBubyBwYXJhbWV0ZXIgdmFsdWVzIGZvciAnYicuIik7CisgICAgICAgIGVsc2UgaWYgKHZhbHVlcy5sZW5ndGggIT0gMSkKKyAgICAgICAgICAgIGVycm9ycy5hcHBlbmQoIiAgUmVjZWl2ZWQgIiArIHZhbHVlcy5sZW5ndGggKworICAgICAgICAgICAgICAgICAgICAgICAgICAiIHBhcmFtZXRlciB2YWx1ZXMgZm9yICdiJyBpbnN0ZWFkIG9mIDEuIik7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKCEiMyIuZXF1YWxzKHZhbHVlc1swXSkpCisgICAgICAgICAgICAgICAgZXJyb3JzLmFwcGVuZCgiICBWYWx1ZSBmb3IgJ2InIHdhcyAnIiArIHZhbHVlc1swXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJyBpbnN0ZWFkIG9mICczJy4iKTsKKyAgICAgICAgfQorICAgICAgICBJdGVyYXRvciBuYW1lcyA9IG1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOworICAgICAgICB3aGlsZSAobmFtZXMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIG5hbWVzLm5leHQoKTsKKyAgICAgICAgICAgIGlmICgiYSIuZXF1YWxzKG5hbWUpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKCJiIi5lcXVhbHMobmFtZSkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBlcnJvcnMuYXBwZW5kKCIgIFJlY2VpdmVkIHBhcmFtZXRlciAnIiArIG5hbWUgKyAiJy4iKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlcG9ydCB0aGUgcmVzdWx0cworICAgICAgICBpZiAoZXJyb3JzLmxlbmd0aCgpIDwgMSkKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJBZ2dyZWdhdGUwMiBQQVNTRUQiKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIkFnZ3JlZ2F0ZTAyIEZBSUxFRCAtIiArIGVycm9ycy50b1N0cmluZygpKTsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gU3RhdGljTG9nZ2VyLnJlYWQoKTsKKyAgICAgICAgICAgIGlmIChtZXNzYWdlID09IG51bGwpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihtZXNzYWdlKTsKKyAgICAgICAgfQorICAgICAgICBTdGF0aWNMb2dnZXIucmVzZXQoKTsKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0F1dGhlbnRpY2F0aW9uMDEuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9BdXRoZW50aWNhdGlvbjAxLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFmOTU1NAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9BdXRoZW50aWNhdGlvbjAxLmphdmEKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworLyoqCisgKiBFbnN1cmUgdGhhdCB0aGUgInRvbWNhdCIgdXNlciBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgYXV0aGVudGljYXRlZC4gIFRoaXMKKyAqIHNob3VsZCBiZSBndWFyYW50ZWVkIGJ5IHRoZSBmYWN0IHRoYXQgdGhpcyBVUkkgaXMgcHJvdGVjdGVkIGJ5IGEgc2VjdXJpdHkKKyAqIGNvbnN0cmFpbnQgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEF1dGhlbnRpY2F0aW9uMDEgZXh0ZW5kcyBIdHRwU2VydmxldCB7CisKKyAgICBwdWJsaWMgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9wbGFpbiIpOworICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSByZXNwb25zZS5nZXRXcml0ZXIoKTsKKyAgICAgICAgU3RyaW5nIHJlbW90ZVVzZXIgPSByZXF1ZXN0LmdldFJlbW90ZVVzZXIoKTsKKyAgICAgICAgUHJpbmNpcGFsIHVzZXJQcmluY2lwYWwgPSByZXF1ZXN0LmdldFVzZXJQcmluY2lwYWwoKTsKKyAgICAgICAgU3RyaW5nIGVycm9ycyA9ICIiOworICAgICAgICBpZiAocmVtb3RlVXNlciA9PSBudWxsKQorICAgICAgICAgICAgZXJyb3JzICs9ICIgIGdldFJlbW90ZVVzZXIoKSByZXR1cm5lZCBOVUxMLiI7CisgICAgICAgIGVsc2UgaWYgKCFyZW1vdGVVc2VyLmVxdWFscygidG9tY2F0IikpCisgICAgICAgICAgICBlcnJvcnMgKz0gIiAgcmVtb3RlVXNlcj0iICsgcmVtb3RlVXNlciArICIuIjsKKyAgICAgICAgaWYgKHVzZXJQcmluY2lwYWwgPT0gbnVsbCkKKyAgICAgICAgICAgIGVycm9ycyArPSAiICBnZXRVc2VyUHJpbmNwYWwoKSByZXR1cm5lZCBOVUxMLiI7CisgICAgICAgIGVsc2UgaWYgKCF1c2VyUHJpbmNpcGFsLmdldE5hbWUoKS5lcXVhbHMoInRvbWNhdCIpKQorICAgICAgICAgICAgZXJyb3JzICs9ICIgIHVzZXJQcmluY2lwYWw9IiArIHVzZXJQcmluY2lwYWwuZ2V0TmFtZSgpICsgIi4iOworICAgICAgICBpZiAoKHJlbW90ZVVzZXIgIT0gbnVsbCkgJiYKKyAgICAgICAgICAgICh1c2VyUHJpbmNpcGFsICE9IG51bGwpICYmCisgICAgICAgICAgICAhcmVtb3RlVXNlci5lcXVhbHModXNlclByaW5jaXBhbC5nZXROYW1lKCkpKQorICAgICAgICAgICAgZXJyb3JzICs9ICIgIHJlbW90ZVVzZXI9IiArIHJlbW90ZVVzZXIgKyAiIHVzZXJQcmluY2lwYWw9IiArCisgICAgICAgICAgICAgICAgdXNlclByaW5jaXBhbC5nZXROYW1lKCk7CisgICAgICAgIGlmIChlcnJvcnMubGVuZ3RoKCkgPiAwKQorICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIkF1dGhlbnRpY2F0aW9uMDEgRkFJTEVEOiIgKyBlcnJvcnMpOworICAgICAgICBlbHNlCisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiQXV0aGVudGljYXRpb24wMSBQQVNTRUQiKTsKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0F1dGhlbnRpY2F0aW9uMDIuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9BdXRoZW50aWNhdGlvbjAyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU2OTU0YwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9BdXRoZW50aWNhdGlvbjAyLmphdmEKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworLyoqCisgKiBFbnN1cmUgdGhhdCB0aGUgInRvbWNhdCIgdXNlciBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgYXV0aGVudGljYXRlZC4gIEFsdGhvdWdoCisgKiB0aGlzIFVSSSBpcyBub3QgcHJvdGVjdGVkIGJ5IGEgc2VjdXJpdHkgY29uc3RyYWludCwgdGhlIHRlc3QgY2xpZW50IHdpbGwKKyAqIGhhdmUgYXV0aGVudGljYXRlZCBhIHVzZXIgcHJldmlvdXNseSBieSBjYWxsaW5nICIvQXV0aGVudGljYXRpb24wMSIuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBBdXRoZW50aWNhdGlvbjAyIGV4dGVuZHMgSHR0cFNlcnZsZXQgeworCisgICAgcHVibGljIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvcGxhaW4iKTsKKyAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisgICAgICAgIFN0cmluZyByZW1vdGVVc2VyID0gcmVxdWVzdC5nZXRSZW1vdGVVc2VyKCk7CisgICAgICAgIFByaW5jaXBhbCB1c2VyUHJpbmNpcGFsID0gcmVxdWVzdC5nZXRVc2VyUHJpbmNpcGFsKCk7CisgICAgICAgIFN0cmluZyBlcnJvcnMgPSAiIjsKKyAgICAgICAgaWYgKHJlbW90ZVVzZXIgPT0gbnVsbCkKKyAgICAgICAgICAgIGVycm9ycyArPSAiICBnZXRSZW1vdGVVc2VyKCkgcmV0dXJuZWQgTlVMTC4iOworICAgICAgICBlbHNlIGlmICghcmVtb3RlVXNlci5lcXVhbHMoInRvbWNhdCIpKQorICAgICAgICAgICAgZXJyb3JzICs9ICIgIHJlbW90ZVVzZXI9IiArIHJlbW90ZVVzZXIgKyAiLiI7CisgICAgICAgIGlmICh1c2VyUHJpbmNpcGFsID09IG51bGwpCisgICAgICAgICAgICBlcnJvcnMgKz0gIiAgZ2V0VXNlclByaW5jcGFsKCkgcmV0dXJuZWQgTlVMTC4iOworICAgICAgICBlbHNlIGlmICghdXNlclByaW5jaXBhbC5nZXROYW1lKCkuZXF1YWxzKCJ0b21jYXQiKSkKKyAgICAgICAgICAgIGVycm9ycyArPSAiICB1c2VyUHJpbmNpcGFsPSIgKyB1c2VyUHJpbmNpcGFsLmdldE5hbWUoKSArICIuIjsKKyAgICAgICAgaWYgKChyZW1vdGVVc2VyICE9IG51bGwpICYmCisgICAgICAgICAgICAodXNlclByaW5jaXBhbCAhPSBudWxsKSAmJgorICAgICAgICAgICAgIXJlbW90ZVVzZXIuZXF1YWxzKHVzZXJQcmluY2lwYWwuZ2V0TmFtZSgpKSkKKyAgICAgICAgICAgIGVycm9ycyArPSAiICByZW1vdGVVc2VyPSIgKyByZW1vdGVVc2VyICsgIiB1c2VyUHJpbmNpcGFsPSIgKworICAgICAgICAgICAgICAgIHVzZXJQcmluY2lwYWwuZ2V0TmFtZSgpOworICAgICAgICBpZiAoZXJyb3JzLmxlbmd0aCgpID4gMCkKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJBdXRoZW50aWNhdGlvbjAyIEZBSUxFRDoiICsgZXJyb3JzKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIkF1dGhlbnRpY2F0aW9uMDIgUEFTU0VEIik7CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9BdXRoZW50aWNhdGlvbjAzLmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvQXV0aGVudGljYXRpb24wMy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkMzRkM2IKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvQXV0aGVudGljYXRpb24wMy5qYXZhCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwgMjAwMCwgMjAwMSAsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50ZXN0ZXI7CisKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaW5jaXBhbDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lio7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7CisKKy8qKgorICogRW5zdXJlIHRoYXQgd2UgZ2V0IHRoZSBjb3JyZWN0IHJlc3VsdHMgZnJvbSA8Y29kZT5pc1VzZXJJblJvbGUoKTwvY29kZT4KKyAqIGZvciBhbiBhY3R1YWwgcm9sZSwgYSByb2xlIGFsaWFzZWQgd2l0aCBhCisgKiA8Y29kZT4mbHQ7c2VjdXJpdHktcm9sZS1yZWYmZ3Q7PC9jb2RlPiBlbGVtZW50LCBhbmQgZm9yIGEgcm9sZSB0aGF0IGlzCisgKiBub3QgYXNzaWduZWQgdG8gdGhlIHNwZWNpZmllZCB1c2VyLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgQXV0aGVudGljYXRpb24wMyBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIFByZXBhcmUgdG8gY3JlYXRlIHRoaXMgcmVzcG9uc2UKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvcGxhaW4iKTsKKyAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisgICAgICAgIFN0cmluZ0J1ZmZlciByZXN1bHRzID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCisgICAgICAgIC8vIFZhbGlkYXRlIHRoYXQgd2UgaGF2ZSBiZWVuIGF1dGhlbnRpY2F0ZWQgY29ycmVjdGx5CisgICAgICAgIFN0cmluZyByZW1vdGVVc2VyID0gcmVxdWVzdC5nZXRSZW1vdGVVc2VyKCk7CisgICAgICAgIGlmIChyZW1vdGVVc2VyID09IG51bGwpIHsKKyAgICAgICAgICAgIHJlc3VsdHMuYXBwZW5kKCIgIE5vdCBBdXRoZW50aWNhdGVkLyIpOworICAgICAgICB9IGVsc2UgaWYgKCEidG9tY2F0Ii5lcXVhbHMocmVtb3RlVXNlcikpIHsKKyAgICAgICAgICAgIHJlc3VsdHMuYXBwZW5kKCIgIEF1dGhlbnRpY2F0ZWQgYXMgJyIpOworICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQocmVtb3RlVXNlcik7CisgICAgICAgICAgICByZXN1bHRzLmFwcGVuZCgiJy8iKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFZhbGlkYXRlIHRoYXQgdGhpcyB1c2VyIGlzIHBhcnQgb2YgdGhlICJ0b21jYXQiIHJvbGUKKyAgICAgICAgaWYgKCFyZXF1ZXN0LmlzVXNlckluUm9sZSgidG9tY2F0IikpIHsKKyAgICAgICAgICAgIHJlc3VsdHMuYXBwZW5kKCIgIE5vdCBpbiByb2xlICd0b21jYXQnLyIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gVmFsaWRhdGUgdGhhdCB0aGlzIHVzZXIgaXMgcGFydCBvZiB0aGUgImFsaWFzIiByb2xlCisgICAgICAgIC8vIChtYXBwZWQgdG8gInRvbWNhdCIgaW4gYSA8c2VjdXJpdHktcm9sZS1yZWY+IGVsZW1lbnQKKyAgICAgICAgaWYgKCFyZXF1ZXN0LmlzVXNlckluUm9sZSgiYWxpYXMiKSkgeworICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoIiAgTm90IGluIHJvbGUgJ2FsaWFzJy8iKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFZhbGlkYXRlIHRoYXQgdGhpcyB1c2VyIGlzIE5PVCBwYXJ0IG9mIHRoZSAidW5rbm93biIgcm9sZQorICAgICAgICBpZiAocmVxdWVzdC5pc1VzZXJJblJvbGUoInVua25vd24iKSkgeworICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoIiAgSW4gcm9sZSAndW5rbm93bicvIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBHZW5lcmF0ZSBvdXIgcmVzcG9uc2UKKyAgICAgICAgaWYgKHJlc3VsdHMubGVuZ3RoKCkgPCAxKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiQXV0aGVudGljYXRpb24wMyBQQVNTRUQiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiQXV0aGVudGljYXRpb24wMyBGQUlMRUQgLSIpOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4ocmVzdWx0cy50b1N0cmluZygpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEFkZCB3cmFwcGVyIG1lc3NhZ2VzIGFzIHJlcXVpcmVkCisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IFN0YXRpY0xvZ2dlci5yZWFkKCk7CisgICAgICAgICAgICBpZiAobWVzc2FnZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4obWVzc2FnZSk7CisgICAgICAgIH0KKyAgICAgICAgU3RhdGljTG9nZ2VyLnJlc2V0KCk7CisKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0F1dGhlbnRpY2F0aW9uMDUuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9BdXRoZW50aWNhdGlvbjA1LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdhMzExZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9BdXRoZW50aWNhdGlvbjA1LmphdmEKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwLCAyMDAxICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworLyoqCisgKiBFbnN1cmUgdGhhdCBhIHJlc291cmNlIHByb3RlY3RlZCBhIGEgc2VjdXJpdHkgY29uc3RyYXRpbnQgdGhhdCBhbGxvd3MgYWxsCisgKiByb2xlcyB3aWxsIHBlcm1pdCBhY2Nlc3MgdG8gYW4gYXV0aGVudGljYXRlZCB1c2VyLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgQXV0aGVudGljYXRpb24wNSBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7CisgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisKKyAgICAgICAgU3RyaW5nIHJlbW90ZVVzZXIgPSByZXF1ZXN0LmdldFJlbW90ZVVzZXIoKTsKKyAgICAgICAgaWYgKHJlbW90ZVVzZXIgPT0gbnVsbCkKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiIE5vIHJlbW90ZSB1c2VyIHJldHVybmVkLyIpOworICAgICAgICBlbHNlIGlmICghInRvbWNhdCIuZXF1YWxzKHJlbW90ZVVzZXIpKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiBSZW1vdGUgdXNlciBpcyAnIik7CisgICAgICAgICAgICBzYi5hcHBlbmQocmVtb3RlVXNlcik7CisgICAgICAgICAgICBzYi5hcHBlbmQoIicvIik7CisgICAgICAgIH0KKworICAgICAgICBQcmluY2lwYWwgdXNlclByaW5jaXBhbCA9IHJlcXVlc3QuZ2V0VXNlclByaW5jaXBhbCgpOworICAgICAgICBpZiAodXNlclByaW5jaXBhbCA9PSBudWxsKQorICAgICAgICAgICAgc2IuYXBwZW5kKCIgTm8gdXNlciBwcmluY2lwYWwgcmV0dXJuZWQvIik7CisgICAgICAgIGVsc2UgaWYgKCEidG9tY2F0Ii5lcXVhbHModXNlclByaW5jaXBhbC5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiBVc2VyIHByaW5jaXBhbCBpcyAnIik7CisgICAgICAgICAgICBzYi5hcHBlbmQodXNlclByaW5jaXBhbCk7CisgICAgICAgICAgICBzYi5hcHBlbmQoIicvIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXJlcXVlc3QuaXNVc2VySW5Sb2xlKCJ0b21jYXQiKSkKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiIE5vdCBpbiByb2xlICd0b21jYXQnLyIpOworCisgICAgICAgIGlmIChzYi5sZW5ndGgoKSA8IDEpCisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiQXV0aGVudGljYXRpb24wNSBQQVNTRUQiKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoIkF1dGhlbnRpY2F0aW9uMDUgRkFJTEVEIC0iKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKHNiLnRvU3RyaW5nKCkpOworICAgICAgICB9CisKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gU3RhdGljTG9nZ2VyLnJlYWQoKTsKKyAgICAgICAgICAgIGlmIChtZXNzYWdlID09IG51bGwpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihtZXNzYWdlKTsKKyAgICAgICAgfQorICAgICAgICBTdGF0aWNMb2dnZXIucmVzZXQoKTsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvQ2hhckFycmF5UmVzcG9uc2UuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9DaGFyQXJyYXlSZXNwb25zZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzM2FmMDAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvQ2hhckFycmF5UmVzcG9uc2UuamF2YQpAQCAtMCwwICsxLDcxIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAsIDIwMDEgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisKKy8qKgorICogSHR0cFNlcnZsZXRSZXNwb25zZSB3cmFwcGVyIHRoYXQgY29udmVydHMgYWxsIG91dHB1dCBjaGFyYWN0ZXJzIHRvCisgKiB1cHBlciBjYXNlIHZpYSBhbiBpbnRlcm1lZGlhdGUgYnVmZmVyLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgQ2hhckFycmF5UmVzcG9uc2UgZXh0ZW5kcyBIdHRwU2VydmxldFJlc3BvbnNlV3JhcHBlciB7CisKKworICAgIENoYXJBcnJheVdyaXRlclVwcGVyQ2FzZSB3cml0ZXIgPSBudWxsOworCisgICAgcHVibGljIENoYXJBcnJheVJlc3BvbnNlKEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHsKKyAgICAgICAgc3VwZXIocmVzcG9uc2UpOworICAgICAgICB3cml0ZXIgPSBuZXcgQ2hhckFycmF5V3JpdGVyVXBwZXJDYXNlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZmx1c2hCdWZmZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpbnQgbiA9IDA7CisgICAgICAgIFJlYWRlciByZWFkZXIgPSBnZXRSZWFkZXIoKTsKKyAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gZ2V0UmVzcG9uc2UoKS5nZXRXcml0ZXIoKTsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIGludCBjaCA9IHJlYWRlci5yZWFkKCk7CisgICAgICAgICAgICBpZiAoY2ggPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgbisrOworICAgICAgICAgICAgd3JpdGVyLnByaW50KChjaGFyKSBjaCk7CisgICAgICAgIH0KKyAgICAgICAgd3JpdGVyLnByaW50bG4oIlsiICsgbiArICJdIik7CisgICAgICAgIHRoaXMud3JpdGVyLnJlc2V0KCk7CisgICAgfQorCisgICAgcHVibGljIFJlYWRlciBnZXRSZWFkZXIoKSB7CisgICAgICAgIHJldHVybiAobmV3IENoYXJBcnJheVJlYWRlcih3cml0ZXIudG9DaGFyQXJyYXkoKSkpOworICAgIH0KKworICAgIHB1YmxpYyBQcmludFdyaXRlciBnZXRXcml0ZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gKG5ldyBQcmludFdyaXRlcih3cml0ZXIsIHRydWUpKTsKKyAgICB9CisKKworfQorCisKKwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0NoYXJBcnJheVdyaXRlclVwcGVyQ2FzZS5qYXZhIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0NoYXJBcnJheVdyaXRlclVwcGVyQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MTc1NWEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvQ2hhckFycmF5V3JpdGVyVXBwZXJDYXNlLmphdmEKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwLCAyMDAxICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIENoYXJBcnJheVdyaXRlciB0aGF0IHVwcGVyIGNhc2VzIGl0cyBvdXRwdXQuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBDaGFyQXJyYXlXcml0ZXJVcHBlckNhc2UgZXh0ZW5kcyBDaGFyQXJyYXlXcml0ZXIgeworCisKKyAgICBDaGFyQXJyYXlXcml0ZXIgd3JpdGVyID0gbmV3IENoYXJBcnJheVdyaXRlcigpOworCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisgICAgICAgIHdyaXRlci5jbG9zZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGZsdXNoKCkgeworICAgICAgICB3cml0ZXIuZmx1c2goKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKKyAgICAgICAgd3JpdGVyLnJlc2V0KCk7CisgICAgfQorCisgICAgcHVibGljIGludCBzaXplKCkgeworICAgICAgICByZXR1cm4gKHdyaXRlci5zaXplKCkpOworICAgIH0KKworICAgIHB1YmxpYyBjaGFyW10gdG9DaGFyQXJyYXkoKSB7CisgICAgICAgIHJldHVybiAod3JpdGVyLnRvQ2hhckFycmF5KCkpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAod3JpdGVyLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlKGludCBjKSB7CisgICAgICAgIGNoYXIgY2ggPSAoY2hhcikgYzsKKyAgICAgICAgaWYgKENoYXJhY3Rlci5pc0xvd2VyQ2FzZShjaCkpCisgICAgICAgICAgICBjaCA9IENoYXJhY3Rlci50b1VwcGVyQ2FzZShjaCk7CisgICAgICAgIHdyaXRlci53cml0ZSgoaW50KSBjaCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGUoY2hhciBjW10pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHdyaXRlKGMsIDAsIGMubGVuZ3RoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZShjaGFyIGNbXSwgaW50IG9mZiwgaW50IGxlbikgeworICAgICAgICBmb3IgKGludCBpID0gb2ZmOyBpIDwgKG9mZiArIGxlbik7IGkrKykKKyAgICAgICAgICAgIHdyaXRlKGNbaV0pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlKFN0cmluZyBzdHIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHdyaXRlKHN0ciwgMCwgc3RyLmxlbmd0aCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZShTdHJpbmcgc3RyLCBpbnQgb2ZmLCBpbnQgbGVuKSB7CisgICAgICAgIGZvciAoaW50IGkgPSBvZmY7IGkgPCAob2ZmICsgbGVuKTsgaSsrKQorICAgICAgICAgICAgd3JpdGUoc3RyLmNoYXJBdChpKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVUbyhXcml0ZXIgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB3cml0ZXIud3JpdGVUbyhvdXQpOworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvQ29udGV4dDAwLmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvQ29udGV4dDAwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE0ZDA5MAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9Db250ZXh0MDAuamF2YQpAQCAtMCwwICsxLDY4IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGVzdGVyLnNoYXJlZC5TaGFyZWRTZXNzaW9uQmVhbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRlc3Rlci51bnNoYXJlZC5VbnNoYXJlZFNlc3Npb25CZWFuOworCisKKy8qKgorICogUGFydCAwIG9mIENvbnRleHQgVGVzdHMuICBUaGlzIHNlcnZsZXQgaXMgbmV2ZXIgZXhlY3V0ZWQgZGlyZWN0bHkuICBJdHMKKyAqIHB1cnBvc2UgaXMgdG8gY3JlYXRlIGEgc2VydmxldCBjb250ZXh0IGF0dHJpYnV0ZSBhdCA8Y29kZT5pbml0KCk8L2NvZGU+CisgKiB0aW1lLCBhbmQgcmVtb3ZlIGl0IGF0IDxjb2RlPmRlc3Ryb3koKTwvY29kZT4gdGltZS4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIENvbnRleHQwMCBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworCisgICAgcHVibGljIHZvaWQgZGVzdHJveSgpIHsKKyAgICAgICAgZ2V0U2VydmxldENvbnRleHQoKS5sb2coIkNvbnRleHQwMDogUmVtb3ZpbmcgYXR0cmlidXRlICdjb250ZXh0MDAnIik7CisgICAgICAgIGdldFNlcnZsZXRDb250ZXh0KCkucmVtb3ZlQXR0cmlidXRlKCJjb250ZXh0MDAiKTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIGluaXQoKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7CisgICAgICAgIGdldFNlcnZsZXRDb250ZXh0KCkubG9nKCJDb250ZXh0MDA6IFNldHRpbmcgYXR0cmlidXRlICdjb250ZXh0MDAnIik7CisgICAgICAgIENvbnRleHRCZWFuIGNiID0gbmV3IENvbnRleHRCZWFuKCk7CisgICAgICAgIGNiLnNldFN0cmluZ1Byb3BlcnR5KCJDb250ZXh0MDAiKTsKKyAgICAgICAgZ2V0U2VydmxldENvbnRleHQoKS5zZXRBdHRyaWJ1dGUoImNvbnRleHQwMCIsIGNiKTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9wbGFpbiIpOworICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSByZXNwb25zZS5nZXRXcml0ZXIoKTsKKyAgICAgICAgd3JpdGVyLnByaW50bG4oIkNvbnRleHQwMCBQQVNTRUQiKTsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gU3RhdGljTG9nZ2VyLnJlYWQoKTsKKyAgICAgICAgICAgIGlmIChtZXNzYWdlID09IG51bGwpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihtZXNzYWdlKTsKKyAgICAgICAgfQorICAgICAgICBTdGF0aWNMb2dnZXIucmVzZXQoKTsKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0NvbnRleHQwMS5qYXZhIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0NvbnRleHQwMS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNjBjY2QKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvQ29udGV4dDAxLmphdmEKQEAgLTAsMCArMSwxNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwgMjAwMCAsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50ZXN0ZXI7CisKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lio7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7CitpbXBvcnQgb3JnLmFwYWNoZS50ZXN0ZXIuc2hhcmVkLlNoYXJlZFNlc3Npb25CZWFuOworaW1wb3J0IG9yZy5hcGFjaGUudGVzdGVyLnVuc2hhcmVkLlVuc2hhcmVkU2Vzc2lvbkJlYW47CisKKworLyoqCisgKiBQYXJ0IDEgb2YgQ29udGV4dCBUZXN0cy4gIEV4ZXJjaXNlIHZhcmlvdXMgbWV0aG9kcyBmb3IgZGVhbGluZyB3aXRoCisgKiBzZXJ2bGV0IGNvbnRleHQgYXR0cmlidXRlcy4gIExlYXZlIGFuIGF0dHJpYnV0ZSBuYW1lZCAiY29udGV4dDAxIgorICogcHJlc2VudCwgd2hpY2ggc2hvdWxkIGJlIGVyYXNlZCBhZnRlciBhIHdlYiBhcHBsaWNhdGlvbiByZXN0YXJ0LgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgQ29udGV4dDAxIGV4dGVuZHMgSHR0cFNlcnZsZXQgeworCisgICAgcHVibGljIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvcGxhaW4iKTsKKyAgICAgICAgYm9vbGVhbiBvayA9IHRydWU7CisgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworICAgICAgICBTZXJ2bGV0Q29udGV4dCBjb250ZXh0ID0gZ2V0U2VydmxldENvbnRleHQoKTsKKworICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGVyZSBpcyBubyBleGlzdGluZyBhdHRyaWJ1dGUKKyAgICAgICAgaWYgKG9rKSB7CisgICAgICAgICAgICBpZiAoY29udGV4dC5nZXRBdHRyaWJ1dGUoImNvbnRleHQwMSIpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiQ29udGV4dDAxIEZBSUxFRCAtIEF0dHJpYnV0ZSBhbHJlYWR5IGV4aXN0cyIpOworICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBDcmVhdGUgYW5kIHN0YXNoIGEgY29udGV4dCBhdHRyaWJ1dGUKKyAgICAgICAgaWYgKG9rKSB7CisgICAgICAgICAgICBDb250ZXh0QmVhbiBiZWFuID0gbmV3IENvbnRleHRCZWFuKCk7CisgICAgICAgICAgICBiZWFuLnNldFN0cmluZ1Byb3BlcnR5KCJDb250ZXh0MDEiKTsKKyAgICAgICAgICAgIGNvbnRleHQuc2V0QXR0cmlidXRlKCJjb250ZXh0MDEiLCBiZWFuKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEVuc3VyZSB0aGF0IHdlIGNhbiByZXRyaWV2ZSB0aGUgYXR0cmlidXRlIHN1Y2Nlc3NmdWxseQorICAgICAgICBpZiAob2spIHsKKyAgICAgICAgICAgIE9iamVjdCBiZWFuID0gY29udGV4dC5nZXRBdHRyaWJ1dGUoImNvbnRleHQwMSIpOworICAgICAgICAgICAgaWYgKGJlYW4gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJDb250ZXh0MDEgRkFJTEVEIC0gQ2Fubm90IHJldHJpZXZlIGF0dHJpYnV0ZSIpOworICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAob2spIHsKKyAgICAgICAgICAgICAgICBpZiAoIShiZWFuIGluc3RhbmNlb2YgQ29udGV4dEJlYW4pKSB7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJDb250ZXh0MDEgRkFJTEVEIC0gQmVhbiBpbnN0YW5jZSBvZiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVhbi5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG9rKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gKChDb250ZXh0QmVhbikgYmVhbikuZ2V0U3RyaW5nUHJvcGVydHkoKTsKKyAgICAgICAgICAgICAgICBpZiAoISJDb250ZXh0MDEiLmVxdWFscyh2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIkNvbnRleHQwMSBGQUlMRUQgLSBWYWx1ZSA9ICIgKyB2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG9rKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGxpZmVjeWNsZSA9ICgoQ29udGV4dEJlYW4pIGJlYW4pLmdldExpZmVjeWNsZSgpOworICAgICAgICAgICAgICAgIGlmICghIi9hZGQiLmVxdWFscyhsaWZlY3ljbGUpKSB7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJDb250ZXh0MDEgRkFJTEVEIC0gQmVhbiBsaWZlY3ljbGUgaXMgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpZmVjeWNsZSk7CisgICAgICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gRW5zdXJlIHRoYXQgd2UgY2FuIHVwZGF0ZSB0aGlzIGF0dHJpYnV0ZSBhbmQgY2hlY2sgaXRzIGxpZmVjeWNsZQorICAgICAgICBpZiAob2spIHsKKyAgICAgICAgICAgIENvbnRleHRCZWFuIGJlYW4gPSAoQ29udGV4dEJlYW4pIGNvbnRleHQuZ2V0QXR0cmlidXRlKCJjb250ZXh0MDEiKTsKKyAgICAgICAgICAgIGNvbnRleHQuc2V0QXR0cmlidXRlKCJjb250ZXh0MDEiLCBiZWFuKTsKKyAgICAgICAgICAgIFN0cmluZyBsaWZlY3ljbGUgPSBiZWFuLmdldExpZmVjeWNsZSgpOworICAgICAgICAgICAgaWYgKCEiL2FkZC9yZXAiLmVxdWFscyhsaWZlY3ljbGUpKSB7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIkNvbnRleHQwMSBGQUlMRUQgLSBCZWFuIGxpZmVjeWNsZSBpcyAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWZlY3ljbGUpOworICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBFbnN1cmUgdGhhdCB3ZSBjYW4gcmVtb3ZlIHRoaXMgYXR0cmlidXRlIGFuZCBjaGVjayBpdHMgbGlmZWN5Y2xlCisgICAgICAgIGlmIChvaykgeworICAgICAgICAgICAgQ29udGV4dEJlYW4gYmVhbiA9IChDb250ZXh0QmVhbikgY29udGV4dC5nZXRBdHRyaWJ1dGUoImNvbnRleHQwMSIpOworICAgICAgICAgICAgY29udGV4dC5yZW1vdmVBdHRyaWJ1dGUoImNvbnRleHQwMSIpOworICAgICAgICAgICAgU3RyaW5nIGxpZmVjeWNsZSA9IGJlYW4uZ2V0TGlmZWN5Y2xlKCk7CisgICAgICAgICAgICBpZiAoISIvYWRkL3JlcC9yZW0iLmVxdWFscyhsaWZlY3ljbGUpKSB7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIkNvbnRleHQwMSBGQUlMRUQgLSBCZWFuIGxpZmVjeWNsZSBpcyAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWZlY3ljbGUpOworICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBBZGQgYSBiZWFuIGJhY2sgZm9yIHRoZSByZXN0YXJ0IGFwcGxpY2F0aW9uIHRlc3QKKyAgICAgICAgY29udGV4dC5zZXRBdHRyaWJ1dGUoImNvbnRleHQwMSIsIG5ldyBDb250ZXh0QmVhbigpKTsKKworICAgICAgICAvLyBFbnN1cmUgdGhhdCBzZXRBdHRyaWJ1dGUoIm5hbWUiLCBudWxsKSB3b3JrcyBjb3JyZWN0bHkKKyAgICAgICAgaWYgKG9rKSB7CisgICAgICAgICAgICBjb250ZXh0LnNldEF0dHJpYnV0ZSgiRk9PIiwgIkJBUiIpOworICAgICAgICAgICAgY29udGV4dC5zZXRBdHRyaWJ1dGUoIkZPTyIsIG51bGwpOworICAgICAgICAgICAgaWYgKGNvbnRleHQuZ2V0QXR0cmlidXRlKCJGT08iKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIkNvbnRleHQwMSBGQUlMRUQgLSBzZXRBdHRyaWJ1dGUobmFtZSxudWxsKSIpOworICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXBvcnQgc3VjY2VzcyBpZiBldmVyeXRoaW5nIGlzIHN0aWxsIG9rCisgICAgICAgIGlmIChvaykKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJDb250ZXh0MDEgUEFTU0VEIik7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IFN0YXRpY0xvZ2dlci5yZWFkKCk7CisgICAgICAgICAgICBpZiAobWVzc2FnZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4obWVzc2FnZSk7CisgICAgICAgIH0KKyAgICAgICAgU3RhdGljTG9nZ2VyLnJlc2V0KCk7CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9Db250ZXh0MDIuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9Db250ZXh0MDIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGE2Yzk3Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0NvbnRleHQwMi5qYXZhCkBAIC0wLDAgKzEsMTI5IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGVzdGVyLnNoYXJlZC5TaGFyZWRTZXNzaW9uQmVhbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRlc3Rlci51bnNoYXJlZC5VbnNoYXJlZFNlc3Npb25CZWFuOworCisKKy8qKgorICogUGFydCAyIG9mIENvbnRleHQgVGVzdHMuICBUaGUgY29udGV4dCBhdHRyaWJ1dGUgZnJvbSBDb250ZXh0MDAgc2hvdWxkCisgKiBzdGlsbCBiZSBoZXJlIGFmdGVyIGEgcmVzdGFydCAoYmVjYXVzZSBDb250ZXh0MDAgaXMgYSBsb2FkLW9uLXN0YXJ0dXAKKyAqIHNlcnZsZXQsIHNvIHRoZSA8Y29kZT5pbml0KCk8L2NvZGU+IG1ldGhvZCBzaG91bGQgaGF2ZSBiZWVuIHRyaWdnZXJlZAorICogZHVyaW5nIHRoZSByZXN0YXJ0KS4gIEhvd2V2ZXIsIHRoZSBjb250ZXh0IGF0dHJpYnV0ZSBmcm9tIENvbnRleHQwMQorICogc2hvdWxkIDxzdHJvbmc+bm90PC9zdHJvbmc+IGJlIGhlcmUsIGJlY2F1c2UgY29udGV4dCBhdHRyaWJ1dGVzIHNob3VsZAorICogYmUgY2xlYW5lZCB1cCBkdXJpbmcgYSByZXN0YXJ0LgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgQ29udGV4dDAyIGV4dGVuZHMgSHR0cFNlcnZsZXQgeworCisgICAgcHVibGljIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvcGxhaW4iKTsKKyAgICAgICAgYm9vbGVhbiBvayA9IHRydWU7CisgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworICAgICAgICBTZXJ2bGV0Q29udGV4dCBjb250ZXh0ID0gZ2V0U2VydmxldENvbnRleHQoKTsKKworICAgICAgICAvLyBDaGVjayBmb3IgdGhlIGF0dHJpYnV0ZSBmcm9tIENvbnRleHQwMQorICAgICAgICBpZiAob2spIHsKKyAgICAgICAgICAgIE9iamVjdCBiZWFuID0gY29udGV4dC5nZXRBdHRyaWJ1dGUoImNvbnRleHQwMSIpOworICAgICAgICAgICAgaWYgKGJlYW4gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJDb250ZXh0MDIgRkFJTEVEIC0gY29udGV4dDAxIHZhbHVlICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlYW4pOworICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgICAgICAgICAgY29udGV4dC5yZW1vdmVBdHRyaWJ1dGUoImNvbnRleHQwMSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gQ2hlY2sgZm9yIHRoZSBhdHRyaWJ1dGUgZnJvbSBDb250ZXh0MDAKKyAgICAgICAgaWYgKG9rKSB7CisgICAgICAgICAgICBPYmplY3QgYmVhbiA9IGNvbnRleHQuZ2V0QXR0cmlidXRlKCJjb250ZXh0MDAiKTsKKyAgICAgICAgICAgIGlmIChiZWFuID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiQ29udGV4dDAyIEZBSUxFRCAtIGNvbnRleHQwMCBtaXNzaW5nIik7CisgICAgICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIShiZWFuIGluc3RhbmNlb2YgQ29udGV4dEJlYW4pKSB7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIkNvbnRleHQwMiBGQUlMRUQgLSBjb250ZXh0MDAgY2xhc3MgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVhbi5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gKChDb250ZXh0QmVhbikgYmVhbikuZ2V0U3RyaW5nUHJvcGVydHkoKTsKKyAgICAgICAgICAgICAgICBpZiAoISJDb250ZXh0MDAiLmVxdWFscyh2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIkNvbnRleHQwMiBGQUlMRUQgLSBjb250ZXh0MDAgdmFsdWUgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGlmZWN5Y2xlID0gKChDb250ZXh0QmVhbikgYmVhbikuZ2V0TGlmZWN5Y2xlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghIi9hZGQiLmVxdWFscyhsaWZlY3ljbGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiQ29udGV4dDAyIEZBSUxFRCAtIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGNvbnRleHQwMCBsaWZlY3ljbGUgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWZlY3ljbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIENoZWNrIGZvciB0aGUgYXR0cmlidXRlIGZyb20gQ29udGV4dExpc3RlbmVyMDEKKyAgICAgICAgaWYgKG9rKSB7CisgICAgICAgICAgICBPYmplY3QgYmVhbiA9IGNvbnRleHQuZ2V0QXR0cmlidXRlKCJjb250ZXh0TGlzdGVuZXIwMSIpOworICAgICAgICAgICAgaWYgKGJlYW4gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJDb250ZXh0MDIgRkFJTEVEIC0gY29udGV4dExpc3RlbmVyMDEgbWlzc2luZyIpOworICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCEoYmVhbiBpbnN0YW5jZW9mIENvbnRleHRCZWFuKSkgeworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJDb250ZXh0MDIgRkFJTEVEIC0gY29udGV4dExpc3RlbmVyMDEgY2xhc3MgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVhbi5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gKChDb250ZXh0QmVhbikgYmVhbikuZ2V0U3RyaW5nUHJvcGVydHkoKTsKKyAgICAgICAgICAgICAgICBpZiAoISJDb250ZXh0TGlzdGVuZXIwMSIuZXF1YWxzKHZhbHVlKSkgeworICAgICAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiQ29udGV4dDAyIEZBSUxFRCAtIGNvbnRleHRMaXN0ZW5lcjAxICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUgIiArIHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGlmZWN5Y2xlID0gKChDb250ZXh0QmVhbikgYmVhbikuZ2V0TGlmZWN5Y2xlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghIi9hZGQiLmVxdWFscyhsaWZlY3ljbGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiQ29udGV4dDAyIEZBSUxFRCAtIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGNvbnRleHRMaXN0ZW5lcjAxIGxpZmVjeWNsZSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpZmVjeWNsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gUmVwb3J0IHN1Y2Nlc3MgaWYgZXZlcnl0aGluZyBpcyBzdGlsbCBvaworICAgICAgICBpZiAob2spCisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiQ29udGV4dDAyIFBBU1NFRCIpOworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBTdGF0aWNMb2dnZXIucmVhZCgpOworICAgICAgICAgICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKG1lc3NhZ2UpOworICAgICAgICB9CisgICAgICAgIFN0YXRpY0xvZ2dlci5yZXNldCgpOworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvQ29udGV4dEJlYW4uamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9Db250ZXh0QmVhbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyMzIyYzAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvQ29udGV4dEJlYW4uamF2YQpAQCAtMCwwICsxLDgzIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKKworCisvKioKKyAqIFNpbXBsZSBKYXZhQmVhbiB0byB1c2UgZm9yIGNvbnRleHQgYXR0cmlidXRlIHRlc3RzLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgQ29udGV4dEJlYW4gaW1wbGVtZW50cyBTZXJpYWxpemFibGUgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogVGhlIGxpZmVjeWNsZSBldmVudHMgdGhhdCBoYXZlIGhhcHBlbmVkIG9uIHRoaXMgYmVhbiBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGxpZmVjeWNsZSA9ICIiOworCisgICAgcHVibGljIFN0cmluZyBnZXRMaWZlY3ljbGUoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5saWZlY3ljbGUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldExpZmVjeWNsZShTdHJpbmcgbGlmZWN5Y2xlKSB7CisgICAgICAgIHRoaXMubGlmZWN5Y2xlID0gbGlmZWN5Y2xlOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQSBzdHJpbmcgcHJvcGVydHkuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBzdHJpbmdQcm9wZXJ0eSA9ICJEZWZhdWx0IFN0cmluZyBQcm9wZXJ0eSBWYWx1ZSI7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZ1Byb3BlcnR5KCkgeworICAgICAgICByZXR1cm4gKHRoaXMuc3RyaW5nUHJvcGVydHkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFN0cmluZ1Byb3BlcnR5KFN0cmluZyBzdHJpbmdQcm9wZXJ0eSkgeworICAgICAgICB0aGlzLnN0cmluZ1Byb3BlcnR5ID0gc3RyaW5nUHJvcGVydHk7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgYmVhbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIkNvbnRleHRCZWFuW2xpZmVjeWNsZT0iKTsKKyAgICAgICAgc2IuYXBwZW5kKGxpZmVjeWNsZSk7CisgICAgICAgIHNiLmFwcGVuZCgiLCBzdHJpbmdQcm9wZXJ0eT0iKTsKKyAgICAgICAgc2IuYXBwZW5kKHRoaXMuc3RyaW5nUHJvcGVydHkpOworICAgICAgICBzYi5hcHBlbmQoIl0iKTsKKyAgICAgICAgcmV0dXJuIChzYi50b1N0cmluZygpKTsKKworICAgIH0KKworCit9CisKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9Db250ZXh0TGlzdGVuZXIwMS5qYXZhIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0NvbnRleHRMaXN0ZW5lcjAxLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQzZTI2YgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9Db250ZXh0TGlzdGVuZXIwMS5qYXZhCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwgMjAwMCwgMjAwMSAsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50ZXN0ZXI7CisKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lio7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7CisKKy8qKgorICogQXBwbGljYXRpb24gZXZlbnQgbGlzdGVuZXIgZm9yIGNvbnRleHQgZXZlbnRzLiAgQWxsIGV2ZW50cyB0aGF0IG9jY3VyCisgKiBhcmUgbG9nZ2VkIGFwcHJvcHJpYXRlbHkgdG8gdGhlIHN0YXRpYyBsb2dnZXIuLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgQ29udGV4dExpc3RlbmVyMDEKKyAgICBpbXBsZW1lbnRzIFNlcnZsZXRDb250ZXh0QXR0cmlidXRlTGlzdGVuZXIsIFNlcnZsZXRDb250ZXh0TGlzdGVuZXIgeworCisKKyAgICBwdWJsaWMgdm9pZCBhdHRyaWJ1dGVBZGRlZChTZXJ2bGV0Q29udGV4dEF0dHJpYnV0ZUV2ZW50IGV2ZW50KSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiQ29udGV4dExpc3RlbmVyMDE6IGF0dHJpYnV0ZUFkZGVkKCIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuZ2V0TmFtZSgpICsgIiwiICsgZXZlbnQuZ2V0VmFsdWUoKSArICIpIik7CisgICAgICAgIFNlcnZsZXRDb250ZXh0IGNvbnRleHQgPSAoU2VydmxldENvbnRleHQpIGV2ZW50LmdldFNvdXJjZSgpOworICAgICAgICBjb250ZXh0LmxvZygiQ29udGV4dExpc3RlbmVyMDE6IGF0dHJpYnV0ZUFkZGVkKCIgKworICAgICAgICAgICAgICAgICAgICBldmVudC5nZXROYW1lKCkgKyAiLCIgKyBldmVudC5nZXRWYWx1ZSgpICsgIikiKTsKKyAgICAgICAgaWYgKGV2ZW50LmdldFZhbHVlKCkgaW5zdGFuY2VvZiBDb250ZXh0QmVhbikgeworICAgICAgICAgICAgQ29udGV4dEJlYW4gYmVhbiA9IChDb250ZXh0QmVhbikgZXZlbnQuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgIGJlYW4uc2V0TGlmZWN5Y2xlKGJlYW4uZ2V0TGlmZWN5Y2xlKCkgKyAiL2FkZCIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYXR0cmlidXRlUmVtb3ZlZChTZXJ2bGV0Q29udGV4dEF0dHJpYnV0ZUV2ZW50IGV2ZW50KSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiQ29udGV4dExpc3RlbmVyMDE6IGF0dHJpYnV0ZVJlbW92ZWQoIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5nZXROYW1lKCkgKyAiLCIgKyBldmVudC5nZXRWYWx1ZSgpICsgIikiKTsKKyAgICAgICAgU2VydmxldENvbnRleHQgY29udGV4dCA9IChTZXJ2bGV0Q29udGV4dCkgZXZlbnQuZ2V0U291cmNlKCk7CisgICAgICAgIGNvbnRleHQubG9nKCJDb250ZXh0TGlzdGVuZXIwMTogYXR0cmlidXRlUmVtb3ZlZCgiICsKKyAgICAgICAgICAgICAgICAgICAgZXZlbnQuZ2V0TmFtZSgpICsgIiwiICsgZXZlbnQuZ2V0VmFsdWUoKSArICIpIik7CisgICAgICAgIGlmIChldmVudC5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgQ29udGV4dEJlYW4pIHsKKyAgICAgICAgICAgIENvbnRleHRCZWFuIGJlYW4gPSAoQ29udGV4dEJlYW4pIGV2ZW50LmdldFZhbHVlKCk7CisgICAgICAgICAgICBiZWFuLnNldExpZmVjeWNsZShiZWFuLmdldExpZmVjeWNsZSgpICsgIi9yZW0iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGF0dHJpYnV0ZVJlcGxhY2VkKFNlcnZsZXRDb250ZXh0QXR0cmlidXRlRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJDb250ZXh0TGlzdGVuZXIwMTogYXR0cmlidXRlUmVwbGFjZWQoIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5nZXROYW1lKCkgKyAiLCIgKyBldmVudC5nZXRWYWx1ZSgpICsgIikiKTsKKyAgICAgICAgU2VydmxldENvbnRleHQgY29udGV4dCA9IChTZXJ2bGV0Q29udGV4dCkgZXZlbnQuZ2V0U291cmNlKCk7CisgICAgICAgIGNvbnRleHQubG9nKCJDb250ZXh0TGlzdGVuZXIwMTogYXR0cmlidXRlUmVwbGFjZWQoIiArCisgICAgICAgICAgICAgICAgICAgIGV2ZW50LmdldE5hbWUoKSArICIsIiArIGV2ZW50LmdldFZhbHVlKCkgKyAiKSIpOworICAgICAgICBpZiAoZXZlbnQuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIENvbnRleHRCZWFuKSB7CisgICAgICAgICAgICBDb250ZXh0QmVhbiBiZWFuID0gKENvbnRleHRCZWFuKSBldmVudC5nZXRWYWx1ZSgpOworICAgICAgICAgICAgYmVhbi5zZXRMaWZlY3ljbGUoYmVhbi5nZXRMaWZlY3ljbGUoKSArICIvcmVwIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjb250ZXh0RGVzdHJveWVkKFNlcnZsZXRDb250ZXh0RXZlbnQgZXZlbnQpIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJDb250ZXh0TGlzdGVuZXIwMTogY29udGV4dERlc3Ryb3llZCgpIik7CisgICAgICAgIFNlcnZsZXRDb250ZXh0IGNvbnRleHQgPSAoU2VydmxldENvbnRleHQpIGV2ZW50LmdldFNvdXJjZSgpOworICAgICAgICBjb250ZXh0LmxvZygiQ29udGV4dExpc3RlbmVyMDE6IGNvbnRleHREZXN0cm95ZWQoKSIpOworICAgICAgICBjb250ZXh0LnJlbW92ZUF0dHJpYnV0ZSgiY29udGV4dExpc3RlbmVyMDEiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjb250ZXh0SW5pdGlhbGl6ZWQoU2VydmxldENvbnRleHRFdmVudCBldmVudCkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIkNvbnRleHRMaXN0ZW5lcjAxOiBjb250ZXh0SW5pdGlhbGl6ZWQoKSIpOworICAgICAgICBTZXJ2bGV0Q29udGV4dCBjb250ZXh0ID0gKFNlcnZsZXRDb250ZXh0KSBldmVudC5nZXRTb3VyY2UoKTsKKyAgICAgICAgY29udGV4dC5sb2coIkNvbnRleHRMaXN0ZW5lcjAxOiBjb250ZXh0SW5pdGlhbGl6ZWQoKSIpOworICAgICAgICBDb250ZXh0QmVhbiBiZWFuID0gbmV3IENvbnRleHRCZWFuKCk7CisgICAgICAgIGJlYW4uc2V0U3RyaW5nUHJvcGVydHkoIkNvbnRleHRMaXN0ZW5lcjAxIik7CisgICAgICAgIGNvbnRleHQuc2V0QXR0cmlidXRlKCJjb250ZXh0TGlzdGVuZXIwMSIsIGJlYW4pOworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvQ29udGV4dExpc3RlbmVyMDIuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9Db250ZXh0TGlzdGVuZXIwMi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1MDY5MzUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvQ29udGV4dExpc3RlbmVyMDIuamF2YQpAQCAtMCwwICsxLDY0IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAsIDIwMDEgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5RWRpdG9yTWFuYWdlcjsKK2ltcG9ydCBqYXZhLnNxbC5EYXRlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dEV2ZW50OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHRMaXN0ZW5lcjsKKworCisvKioKKyAqIEFwcGxpY2F0aW9uIGV2ZW50IGxpc3RlbmVyIGZvciBjb250ZXh0IGV2ZW50cy4gIEVuc3VyZXMgdGhhdCB0aGUgcHJvcGVydHkKKyAqIGVkaXRvciBjbGFzc2VzIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbiBhcmUgYXBwcm9wcmlhdGVseSByZWdpc3RlcmVkLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgQ29udGV4dExpc3RlbmVyMDIKKyAgICBpbXBsZW1lbnRzIFNlcnZsZXRDb250ZXh0TGlzdGVuZXIgeworCisKKyAgICBwcml2YXRlIFNlcnZsZXRDb250ZXh0IGNvbnRleHQgPSBudWxsOworCisKKyAgICBwdWJsaWMgdm9pZCBjb250ZXh0RGVzdHJveWVkKFNlcnZsZXRDb250ZXh0RXZlbnQgZXZlbnQpIHsKKyAgICAgICAgY29udGV4dC5sb2coIkNvbnRleHRMaXN0ZW5lcjAyOiBjb250ZXh0RGVzdHJveWVkKCkiKTsKKyAgICAgICAgY29udGV4dCA9IG51bGw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY29udGV4dEluaXRpYWxpemVkKFNlcnZsZXRDb250ZXh0RXZlbnQgZXZlbnQpIHsKKyAgICAgICAgY29udGV4dCA9IChTZXJ2bGV0Q29udGV4dCkgZXZlbnQuZ2V0U291cmNlKCk7CisgICAgICAgIGNvbnRleHQubG9nKCJDb250ZXh0TGlzdGVuZXIwMjogY29udGV4dEluaXRpYWxpemVkKCkiKTsKKyAgICAgICAgUHJvcGVydHlFZGl0b3JNYW5hZ2VyLnJlZ2lzdGVyRWRpdG9yKERhdGUuY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRlUHJvcGVydHlFZGl0b3IuY2xhc3MpOworICAgICAgICBjb250ZXh0LmxvZygiQ29udGV4dExpc3RlbmVyMDI6IGdldEVkaXRvclNlYXJjaFBhdGgoKSAtLT4iKTsKKyAgICAgICAgU3RyaW5nIHNlYXJjaFtdID0gUHJvcGVydHlFZGl0b3JNYW5hZ2VyLmdldEVkaXRvclNlYXJjaFBhdGgoKTsKKyAgICAgICAgaWYgKHNlYXJjaCA9PSBudWxsKQorICAgICAgICAgICAgc2VhcmNoID0gbmV3IFN0cmluZ1swXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZWFyY2gubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBjb250ZXh0LmxvZygiQ29udGV4dExpc3RlbmVyMDI6ICAgIiArIHNlYXJjaFtpXSk7CisgICAgICAgIGNvbnRleHQubG9nKCJDb250ZXh0TGlzdGVuZXIwMjogZmluZEVkaXRvcigpIC0tPiAiICsKKyAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlFZGl0b3JNYW5hZ2VyLmZpbmRFZGl0b3IoRGF0ZS5jbGFzcykpOworICAgICAgICAgICAgICAgCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9EYXRlUHJvcGVydHlFZGl0b3IuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9EYXRlUHJvcGVydHlFZGl0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTU2ZWM1Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0RhdGVQcm9wZXJ0eUVkaXRvci5qYXZhCkBAIC0wLDAgKzEsMTA1IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCitpbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUVkaXRvclN1cHBvcnQ7CitpbXBvcnQgamF2YS50ZXh0LlBhcnNlUG9zaXRpb247CitpbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7CitpbXBvcnQgamF2YS5zcWwuRGF0ZTsKKworLyoqCisgKiBQcm9wZXJ0eUVkaXRvciBpbXBsZW1lbnRhdGlvbiBmb3IgYSBqYXZhLnNxbC5EYXRlIHByb3BlcnR5LgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHJldmlzaW9uICREYXRlJCAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBEYXRlUHJvcGVydHlFZGl0b3IgZXh0ZW5kcyBQcm9wZXJ0eUVkaXRvclN1cHBvcnQgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIGRhdGUgZm9ybWF0IHRvIHdoaWNoIGRhdGVzIGNvbnZlcnRlZCBieSB0aGlzIHByb3BlcnR5IGVkaXRvcgorICAgICAqIG11c3QgY29uZm9ybS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFNpbXBsZURhdGVGb3JtYXQgZm9ybWF0ID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoIk1NL2RkL3l5eXkiKTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIENvbnZlcnQgb3VyIERhdGUgb2JqZWN0IGludG8gYSBTdHJpbmcgdGhhdCBjb25mb3JtcyB0byBvdXIKKyAgICAgKiBzcGVjaWZpZWQgPGNvZGU+Zm9ybWF0PC9jb2RlPiwgYW5kIHJldHVybiBpdC4gIElmIHRoaXMgaXMgbm90CisgICAgICogcG9zc2libGUsIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEFzVGV4dCgpIHsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgRGF0ZSBkYXRlID0gKERhdGUpIGdldFZhbHVlKCk7CisgICAgICAgICAgICByZXR1cm4gKGZvcm1hdC5mb3JtYXQoZGF0ZSkpOworICAgICAgICB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29udmVydCB0aGUgc3BlY2lmaWVkIFN0cmluZyB2YWx1ZSBpbnRvIGEgRGF0ZSwgaWYgaXQgY29uZm9ybXMgdG8KKyAgICAgKiBvdXIgc3BlY2lmaWVkIDxjb2RlPmZvcm1hdDwvY29kZT4gLCBlbHNlIHRocm93IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZSBTdHJpbmcgdmFsdWUgdG8gYmUgY29udmVydGVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBhIGNvbnZlcnNpb24gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QXNUZXh0KFN0cmluZyB2YWx1ZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gVmFsaWRhdGUgdGhlIGZvcm1hdCBvZiB0aGUgaW5wdXQgc3RyaW5nCisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICgiQ2Fubm90IGNvbnZlcnQgbnVsbCBTdHJpbmcgdG8gYSBEYXRlIik7CisgICAgICAgIGlmICh2YWx1ZS5sZW5ndGgoKSAhPSAxMCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoIlN0cmluZyAnIiArIHZhbHVlICsgIicgaGFzIGludmFsaWQgbGVuZ3RoICIgKworICAgICAgICAgICAgICAgICB2YWx1ZS5sZW5ndGgoKSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgeworICAgICAgICAgICAgY2hhciBjaCA9IHZhbHVlLmNoYXJBdChpKTsKKyAgICAgICAgICAgIGlmICgoaSA9PSAyKSB8fCAoaSA9PSA1KSkgeworICAgICAgICAgICAgICAgIGlmIChjaCAhPSAnLycpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICgiU3RyaW5nICciICsgdmFsdWUgKyAiJyBtaXNzaW5nIHNsYXNoIGF0IGluZGV4ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgIGkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoIUNoYXJhY3Rlci5pc0RpZ2l0KGNoKSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgKCJTdHJpbmcgJyIgKyB2YWx1ZSArICInIG1pc3NpbmcgZGlnaXQgYXQgaW5kZXggIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgaSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBDb252ZXJ0IHRoZSBpbmNvbWluZyB2YWx1ZSB0byBhIGphdmEuc3FsLkRhdGUKKyAgICAgICAgamF2YS51dGlsLkRhdGUgdGVtcCA9IGZvcm1hdC5wYXJzZSh2YWx1ZSwgbmV3IFBhcnNlUG9zaXRpb24oMCkpOyAKKyAgICAgICAgamF2YS5zcWwuRGF0ZSBkYXRlID0gbmV3IGphdmEuc3FsLkRhdGUodGVtcC5nZXRUaW1lKCkpOworICAgICAgICBzZXRWYWx1ZShkYXRlKTsKKyAgICB9CisKKyAgICAgICAgCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvRGVjb2RpbmcwMS5qYXZhIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0RlY29kaW5nMDEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjQ3OGZhCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0RlY29kaW5nMDEuamF2YQpAQCAtMCwwICsxLDk4IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAsIDIwMDEgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisKKy8qKgorICogVGVzdCBmb3IgcHJvcGVyIFVSTCBkZWNvZGluZyBvZiB0aGUgZ2V0U2VydmxldFBhdGgoKSBhbmQgZ2V0UGF0aEluZm8oKQorICogbWV0aG9kcyBvZiBIdHRwU2VydmxldFJlcXVlc3QuICBUaGUgZGVzaXJlZCB2YWx1ZXMgYXJlIHNwZWNpZmllZCBieSB0aGUKKyAqIDxzdHJvbmc+c2VydmxldDwvc3Ryb25nPiBhbmQgPHN0cm9uZz5wYXRoPC9zdHJvbmc+IHJlcXVlc3QgcGFyYW1ldGVycywKKyAqIHJlc3BlY3RpdmVseS4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIERlY29kaW5nMDEgZXh0ZW5kcyBIdHRwU2VydmxldCB7CisKKyAgICBwdWJsaWMgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICAvLyBJZGVudGlmeSBvdXIgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCisgICAgICAgIFN0cmluZyBkZXNpcmVkU2VydmxldCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJzZXJ2bGV0Iik7CisgICAgICAgIFN0cmluZyBkZXNpcmVkUGF0aCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJwYXRoIik7CisKKyAgICAgICAgLy8gUHJlcGFyZSBmb3IgdGhlIGRlc2lyZWQgdGVzdAorICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9wbGFpbiIpOworICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSByZXNwb25zZS5nZXRXcml0ZXIoKTsKKyAgICAgICAgU3RyaW5nQnVmZmVyIHJlc3VsdHMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisKKyAgICAgICAgLy8gQ2hlY2sgdGhlIHZhbHVlIHJldHVybmVkIGJ5IGdldFNlcnZsZXRQYXRoKCkKKyAgICAgICAgU3RyaW5nIHNlcnZsZXRQYXRoID0gcmVxdWVzdC5nZXRTZXJ2bGV0UGF0aCgpOworICAgICAgICBpZiAoZGVzaXJlZFNlcnZsZXQgPT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKHNlcnZsZXRQYXRoICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoIiBzZXJ2bGV0UGF0aCBpcyAnIiArIHNlcnZsZXRQYXRoICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJyBpbnN0ZWFkIG9mIE5VTEwvIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoc2VydmxldFBhdGggPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHRzLmFwcGVuZCgiIHNlcnZsZXRQYXRoIGlzIE5VTEwgaW5zdGVhZCBvZiAnIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzaXJlZFBhdGggKyAiJy8iKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCFzZXJ2bGV0UGF0aC5lcXVhbHMoZGVzaXJlZFNlcnZsZXQpKQorICAgICAgICAgICAgICAgIHJlc3VsdHMuYXBwZW5kKCIgc2VydmxldFBhdGggaXMgJyIgKyBzZXJ2bGV0UGF0aCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIicgaW5zdGVhZCBvZiAnIiArIGRlc2lyZWRTZXJ2bGV0ICsgIicvIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBDaGVjayB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgZ2V0UGF0aEluZm8oKQorICAgICAgICBTdHJpbmcgcGF0aEluZm8gPSByZXF1ZXN0LmdldFBhdGhJbmZvKCk7CisgICAgICAgIGlmIChkZXNpcmVkUGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICBpZiAocGF0aEluZm8gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHRzLmFwcGVuZCgiIHBhdGhJbmZvIGlzICciICsgcGF0aEluZm8gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICInIGluc3RlYWQgb2YgTlVMTC8iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChwYXRoSW5mbyA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJlc3VsdHMuYXBwZW5kKCIgcGF0aEluZm8gaXMgTlVMTCBpbnN0ZWFkIG9mICciICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNpcmVkUGF0aCArICInLyIpOworICAgICAgICAgICAgZWxzZSBpZiAoIXBhdGhJbmZvLmVxdWFscyhkZXNpcmVkUGF0aCkpCisgICAgICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoIiBwYXRoSW5mbyBpcyAnIiArIHBhdGhJbmZvICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJyBpbnN0ZWFkIG9mICciICsgZGVzaXJlZFBhdGggKyAiJy8iKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlcG9ydCBzdWNjZXNzIG9yIGZhaWx1cmUKKyAgICAgICAgaWYgKHJlc3VsdHMubGVuZ3RoKCkgPCAxKQorICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIkRlY29kaW5nMDEgUEFTU0VEIik7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgd3JpdGVyLnByaW50KCJEZWNvZGluZzAxIEZBSUxFRCAtIik7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihyZXN1bHRzLnRvU3RyaW5nKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQWRkIHdyYXBwZXIgbWVzc2FnZXMgYXMgcmVxdWlyZWQKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gU3RhdGljTG9nZ2VyLnJlYWQoKTsKKyAgICAgICAgICAgIGlmIChtZXNzYWdlID09IG51bGwpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihtZXNzYWdlKTsKKyAgICAgICAgfQorICAgICAgICBTdGF0aWNMb2dnZXIucmVzZXQoKTsKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0Vycm9yUGFnZTAxLmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvRXJyb3JQYWdlMDEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjk5NmVlCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0Vycm9yUGFnZTAxLmphdmEKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwLCAyMDAxICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworLyoqCisgKiBQYXJ0IDEgb2YgdGhlIEVycm9yUGFnZSBUZXN0cy4gIFJldHVybnMgYSByZXNwb25zZSBzdGF0dXMgY29kZSBvZiA0MTIKKyAqIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX1BSRUNPTkRJVElPTl9GQUlMRUQpIHdoaWNoIGlzIG1hcHBlZCB0byB0aGUKKyAqIEVycm9yUGFnZTAyIHNlcnZsZXQgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEVycm9yUGFnZTAxIGV4dGVuZHMgSHR0cFNlcnZsZXQgeworCisgICAgcHVibGljIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvcGxhaW4iKTsKKyAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisKKyAgICAgICAgLy8gV3JpdGUgYSBGQUlMRUQgbWVzc2FnZSB0aGF0IHNob3VsZCBnZXQgcmVwbGFjZWQgYnkgdGhlIGVycm9yIHRleHQKKyAgICAgICAgd3JpdGVyLnByaW50bG4oIkVycm9yUGFnZTAxIEZBSUxFRCAtIE9yaWdpbmFsIHJlc3BvbnNlIHJldHVybmVkIik7CisKKyAgICAgICAgLy8gUmV0dXJuIHRoZSBhcHByb3ByaWF0ZSByZXNwb25zZSBjb2RlCisgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcihIdHRwU2VydmxldFJlc3BvbnNlLlNDX1BSRUNPTkRJVElPTl9GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3JQYWdlMDEgUmV0dXJuZWQgU3RhdHVzIENvZGUgNDEyIik7CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9FcnJvclBhZ2UwMi5qYXZhIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0Vycm9yUGFnZTAyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYyNGY2NgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9FcnJvclBhZ2UwMi5qYXZhCkBAIC0wLDAgKzEsMTI5IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAsIDIwMDEgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisvKioKKyAqIFBhcnQgMiBvZiB0aGUgRXJyb3JQYWdlIFRlc3RzLiAgU2hvdWxkIGJlIG1hcHBlZCBieSB0aGUgY29udGFpbmVyIHdoZW4KKyAqIHRoZSBFcnJvclBhZ2UwMSBzZXJ2bGV0IHJldHVybnMgdGhlIGFwcHJvcHJpYXRlIHN0YXR1cyBjb2RlLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgRXJyb3JQYWdlMDIgZXh0ZW5kcyBIdHRwU2VydmxldCB7CisKKworICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIHJlc3BvbnNlLnJlc2V0KCk7CisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7CisgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworCisgICAgICAgIC8vIEFjY3VtdWxhdGUgYWxsIHRoZSByZWFzb25zIHRoaXMgcmVxdWVzdCBtaWdodCBmYWlsCisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgT2JqZWN0IHZhbHVlID0gbnVsbDsKKworICAgICAgICB2YWx1ZSA9IHJlcXVlc3QuZ2V0QXR0cmlidXRlKCJqYXZheC5zZXJ2bGV0LmVycm9yLnN0YXR1c19jb2RlIik7CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQorICAgICAgICAgICAgc2IuYXBwZW5kKCIgc3RhdHVzX2NvZGUgaXMgbWlzc2luZy8iKTsKKyAgICAgICAgZWxzZSBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIEludGVnZXIpKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiBzdGF0dXNfY29kZSBjbGFzcyBpcyAiKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCh2YWx1ZS5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICAgICAgICBzYi5hcHBlbmQoIi8iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludCBpbnRWYWx1ZSA9ICgoSW50ZWdlcikgdmFsdWUpLmludFZhbHVlKCk7CisgICAgICAgICAgICBpZiAoaW50VmFsdWUgIT0gSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19QUkVDT05ESVRJT05fRkFJTEVEKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgc3RhdHVzX2NvZGUgaXMgIik7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKHZhbHVlKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIi8iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZhbHVlID0gcmVxdWVzdC5nZXRBdHRyaWJ1dGUoImphdmF4LnNlcnZsZXQuZXJyb3IubWVzc2FnZSIpOworICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiIG1lc3NhZ2UgaXMgbWlzc2luZy8iKTsKKyAgICAgICAgZWxzZSBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiIG1lc3NhZ2UgY2xhc3MgaXMgIik7CisgICAgICAgICAgICBzYi5hcHBlbmQodmFsdWUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgc2IuYXBwZW5kKCIvIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IChTdHJpbmcpIHZhbHVlOworICAgICAgICAgICAgaWYgKCEiRXJyb3JQYWdlMDEgUmV0dXJuZWQgU3RhdHVzIENvZGUgNDEyIi5lcXVhbHMobWVzc2FnZSkpIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiBtZXNzYWdlIGlzICIpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIi8iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZhbHVlID0gcmVxdWVzdC5nZXRBdHRyaWJ1dGUoImphdmF4LnNlcnZsZXQuZXJyb3IucmVxdWVzdF91cmkiKTsKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCisgICAgICAgICAgICBzYi5hcHBlbmQoIiByZXF1ZXN0X3VyaSBpcyBtaXNzaW5nLyIpOworICAgICAgICBlbHNlIGlmICghKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIgcmVxdWVzdF91cmkgY2xhc3MgaXMgIik7CisgICAgICAgICAgICBzYi5hcHBlbmQodmFsdWUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgc2IuYXBwZW5kKCIvIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBTdHJpbmcgcmVxdWVzdF91cmkgPSAoU3RyaW5nKSB2YWx1ZTsKKyAgICAgICAgICAgIFN0cmluZyB0ZXN0MSA9IHJlcXVlc3QuZ2V0Q29udGV4dFBhdGgoKSArICIvRXJyb3JQYWdlMDEiOworICAgICAgICAgICAgU3RyaW5nIHRlc3QyID0gcmVxdWVzdC5nZXRDb250ZXh0UGF0aCgpICsgIi9XcmFwcGVkRXJyb3JQYWdlMDEiOworICAgICAgICAgICAgaWYgKCFyZXF1ZXN0X3VyaS5lcXVhbHModGVzdDEpICYmICFyZXF1ZXN0X3VyaS5lcXVhbHModGVzdDIpKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgcmVxdWVzdF91cmkgaXMgIik7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKHJlcXVlc3RfdXJpKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIi8iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZhbHVlID0gcmVxdWVzdC5nZXRBdHRyaWJ1dGUoImphdmF4LnNlcnZsZXQuZXJyb3Iuc2VydmxldF9uYW1lIik7CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQorICAgICAgICAgICAgc2IuYXBwZW5kKCIgc2VydmxldF9uYW1lIGlzIG1pc3NpbmcvIik7CisgICAgICAgIGVsc2UgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiBzZXJ2bGV0X25hbWUgY2xhc3MgaXMgIik7CisgICAgICAgICAgICBzYi5hcHBlbmQodmFsdWUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgc2IuYXBwZW5kKCIvIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBTdHJpbmcgc2VydmxldF9uYW1lID0gKFN0cmluZykgdmFsdWU7CisgICAgICAgICAgICBpZiAoISJFcnJvclBhZ2UwMSIuZXF1YWxzKHNlcnZsZXRfbmFtZSkpIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiBzZXJ2bGV0X25hbWUgaXMgIik7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKHNlcnZsZXRfbmFtZSk7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIvIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXBvcnQgdWx0aW1hdGUgc3VjY2VzcyBvciBmYWlsdXJlCisgICAgICAgIGlmIChzYi5sZW5ndGgoKSA8IDEpCisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiRXJyb3JQYWdlMDIgUEFTU0VEIik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJFcnJvclBhZ2UwMiBGQUlMRUQgLSIgKyBzYi50b1N0cmluZygpKTsKKworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBTdGF0aWNMb2dnZXIucmVhZCgpOworICAgICAgICAgICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKG1lc3NhZ2UpOworICAgICAgICB9CisgICAgICAgIFN0YXRpY0xvZ2dlci5yZXNldCgpOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9FcnJvclBhZ2UwMy5qYXZhIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0Vycm9yUGFnZTAzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNmMWY1OQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9FcnJvclBhZ2UwMy5qYXZhCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwgMjAwMCwgMjAwMSAsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50ZXN0ZXI7CisKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lio7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7CisKKy8qKgorICogUGFydCAzIG9mIHRoZSBFcnJvclBhZ2UgVGVzdHMuICBUaHJvd3MgYW4gZXhjZXB0aW9uIG9mIGEgc3BlY2lmaWVkIHR5cGUKKyAqICh3cmFwcGVkIGluIGEgc2VydmxldCBleGNlcHRpb24gYXMgcmVxdWlyZWQgYnkgdGhlIHRocm93cyBjbGF1c2UpLCB3aGljaAorICogaXMgbWFwcGVkIHRvIHRoZSBFcnJvclBhZ2UwNCBzZXJ2bGV0IGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBFcnJvclBhZ2UwMyBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7CisgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworCisgICAgICAgIC8vIFdyaXRlIGEgRkFJTEVEIG1lc3NhZ2UgdGhhdCBzaG91bGQgZ2V0IHJlcGxhY2VkIGJ5IHRoZSBlcnJvciB0ZXh0CisgICAgICAgIHdyaXRlci5wcmludGxuKCJFcnJvclBhZ2UwMyBGQUlMRUQgLSBPcmlnaW5hbCByZXNwb25zZSByZXR1cm5lZCIpOworCisgICAgICAgIC8vIFRocm93IHRoZSBzcGVjaWZpZWQgZXhjZXB0aW9uCisgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uCisgICAgICAgICAgICAobmV3IFRlc3RlckV4Y2VwdGlvbigiRXJyb3JQYWdlMDMgVGhyZXcgRXhjZXB0aW9uIikpOworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvRXJyb3JQYWdlMDQuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9FcnJvclBhZ2UwNC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmZjUxMjUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvRXJyb3JQYWdlMDQuamF2YQpAQCAtMCwwICsxLDE0NiBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwLCAyMDAxICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworLyoqCisgKiBQYXJ0IDQgb2YgdGhlIEVycm9yUGFnZSBUZXN0cy4gIFNob3VsZCBiZSBtYXBwZWQgYnkgdGhlIGNvbnRhaW5lciB3aGVuCisgKiB0aGUgRXJyb3JQYWdlMDEgc2VydmxldCByZXR1cm5zIHRoZSBhcHByb3ByaWF0ZSBleGNlcHRpb24uCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBFcnJvclBhZ2UwNCBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworCisgICAgcHVibGljIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgcmVzcG9uc2UucmVzZXQoKTsKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvcGxhaW4iKTsKKyAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisKKyAgICAgICAgLy8gQWNjdW11bGF0ZSBhbGwgdGhlIHJlYXNvbnMgdGhpcyByZXF1ZXN0IG1pZ2h0IGZhaWwKKyAgICAgICAgU2VydmxldEV4Y2VwdGlvbiBleGNlcHRpb24gPSBudWxsOworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIE9iamVjdCB2YWx1ZSA9IG51bGw7CisKKyAgICAgICAgdmFsdWUgPSByZXF1ZXN0LmdldEF0dHJpYnV0ZSgiamF2YXguc2VydmxldC5lcnJvci5leGNlcHRpb24iKTsKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCisgICAgICAgICAgICBzYi5hcHBlbmQoIiBleGNlcHRpb24gaXMgbWlzc2luZy8iKTsKKyAgICAgICAgZWxzZSBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIG9yZy5hcGFjaGUudGVzdGVyLlRlc3RlckV4Y2VwdGlvbikpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiIGV4Y2VwdGlvbiBjbGFzcyBpcyAiKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCh2YWx1ZS5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICAgICAgICBzYi5hcHBlbmQoIi8iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFRlc3RlckV4Y2VwdGlvbiB0ZSA9IChUZXN0ZXJFeGNlcHRpb24pIHZhbHVlOworICAgICAgICAgICAgaWYgKCEiRXJyb3JQYWdlMDMgVGhyZXcgRXhjZXB0aW9uIi5lcXVhbHModGUuZ2V0TWVzc2FnZSgpKSkgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiIGV4Y2VwdGlvbiBtZXNzYWdlIGlzICIpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCh0ZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiLyIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdmFsdWUgPSByZXF1ZXN0LmdldEF0dHJpYnV0ZSgiamF2YXguc2VydmxldC5lcnJvci5leGNlcHRpb25fdHlwZSIpOworICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiIGV4Y2VwdGlvbl90eXBlIGlzIG1pc3NpbmcvIik7CisgICAgICAgIGVsc2UgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBDbGFzcykpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiIGV4Y2VwdGlvbl90eXBlIGNsYXNzIGlzICIpOworICAgICAgICAgICAgc2IuYXBwZW5kKHZhbHVlLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiLyIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQ2xhc3MgY2xhenogPSAoQ2xhc3MpIHZhbHVlOworICAgICAgICAgICAgaWYgKCEib3JnLmFwYWNoZS50ZXN0ZXIuVGVzdGVyRXhjZXB0aW9uIi5lcXVhbHMoY2xhenouZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiIGV4Y2VwdGlvbl90eXBlIGNsYXNzIGlzICIpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChjbGF6ei5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiLyIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdmFsdWUgPSByZXF1ZXN0LmdldEF0dHJpYnV0ZSgiamF2YXguc2VydmxldC5lcnJvci5tZXNzYWdlIik7CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQorICAgICAgICAgICAgc2IuYXBwZW5kKCIgbWVzc2FnZSBpcyBtaXNzaW5nLyIpOworICAgICAgICBlbHNlIGlmICghKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIgbWVzc2FnZSBjbGFzcyBpcyAiKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCh2YWx1ZS5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICAgICAgICBzYi5hcHBlbmQoIi8iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gKFN0cmluZykgdmFsdWU7CisgICAgICAgICAgICBpZiAoISJFcnJvclBhZ2UwMyBUaHJldyBFeGNlcHRpb24iLmVxdWFscyhtZXNzYWdlKSkgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiIG1lc3NhZ2UgaXMgIik7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiLyIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdmFsdWUgPSByZXF1ZXN0LmdldEF0dHJpYnV0ZSgiamF2YXguc2VydmxldC5lcnJvci5yZXF1ZXN0X3VyaSIpOworICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiIHJlcXVlc3RfdXJpIGlzIG1pc3NpbmcvIik7CisgICAgICAgIGVsc2UgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiByZXF1ZXN0X3VyaSBjbGFzcyBpcyAiKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCh2YWx1ZS5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICAgICAgICBzYi5hcHBlbmQoIi8iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFN0cmluZyByZXF1ZXN0X3VyaSA9IChTdHJpbmcpIHZhbHVlOworICAgICAgICAgICAgU3RyaW5nIHRlc3QxID0gcmVxdWVzdC5nZXRDb250ZXh0UGF0aCgpICsgIi9FcnJvclBhZ2UwMyI7CisgICAgICAgICAgICBTdHJpbmcgdGVzdDIgPSByZXF1ZXN0LmdldENvbnRleHRQYXRoKCkgKyAiL1dyYXBwZWRFcnJvclBhZ2UwMyI7CisgICAgICAgICAgICBpZiAoIXJlcXVlc3RfdXJpLmVxdWFscyh0ZXN0MSkgJiYgIXJlcXVlc3RfdXJpLmVxdWFscyh0ZXN0MikpIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiByZXF1ZXN0X3VyaSBpcyAiKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQocmVxdWVzdF91cmkpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiLyIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdmFsdWUgPSByZXF1ZXN0LmdldEF0dHJpYnV0ZSgiamF2YXguc2VydmxldC5lcnJvci5zZXJ2bGV0X25hbWUiKTsKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCisgICAgICAgICAgICBzYi5hcHBlbmQoIiBzZXJ2bGV0X25hbWUgaXMgbWlzc2luZy8iKTsKKyAgICAgICAgZWxzZSBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiIHNlcnZsZXRfbmFtZSBjbGFzcyBpcyAiKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCh2YWx1ZS5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICAgICAgICBzYi5hcHBlbmQoIi8iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFN0cmluZyBzZXJ2bGV0X25hbWUgPSAoU3RyaW5nKSB2YWx1ZTsKKyAgICAgICAgICAgIGlmICghIkVycm9yUGFnZTAzIi5lcXVhbHMoc2VydmxldF9uYW1lKSkgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiIHNlcnZsZXRfbmFtZSBpcyAiKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoc2VydmxldF9uYW1lKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIi8iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlcG9ydCB1bHRpbWF0ZSBzdWNjZXNzIG9yIGZhaWx1cmUKKyAgICAgICAgaWYgKHNiLmxlbmd0aCgpIDwgMSkKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJFcnJvclBhZ2UwNCBQQVNTRUQiKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIkVycm9yUGFnZTA0IEZBSUxFRCAtIiArIHNiLnRvU3RyaW5nKCkpOworCisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IFN0YXRpY0xvZ2dlci5yZWFkKCk7CisgICAgICAgICAgICBpZiAobWVzc2FnZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4obWVzc2FnZSk7CisgICAgICAgIH0KKyAgICAgICAgU3RhdGljTG9nZ2VyLnJlc2V0KCk7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0Vycm9yUGFnZTA1LmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvRXJyb3JQYWdlMDUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzhjNDcxCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0Vycm9yUGFnZTA1LmphdmEKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwLCAyMDAxICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworLyoqCisgKiBQYXJ0IDUgb2YgdGhlIEVycm9yUGFnZSBUZXN0cy4gIFRocm93cyBhIFJ1bnRpbWVFeGNlcHRpb24gb2YgYSB0eXBlCisgKiBzcGVjaWZpZWQgYnkgdGhlIDxjb2RlPnR5cGU8L2NvZGU+IHF1ZXJ5IHBhcmFtZXRlciwgd2hpY2ggbXVzdCBiZSBvbmUKKyAqIG9mIHRoZSBmb2xsb3dpbmc6CisgKiA8dWw+CisgKiA8bGk+PHN0cm9uZz5Bcml0aG1ldGljRXhjZXB0aW9uPC9zdHJvbmc+IC0gRm9yd2FyZGVkIHRvICIvRXJyb3JQYWdlMDYiLjwvbGk+CisgKiA8bGk+PHN0cm9uZz5BcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb248L3N0cm9uZz4gLQorICogICAgIEZvcndhcmRlZCB0byAiL0Vycm9yUGFnZTA2LmpzcCIuPC9saT4KKyAqIDxsaT48c3Ryb25nPk51bWJlckZvcm1hdEV4Y2VwdGlvbjwvc3Ryb25nPiAtCisgKiAgICAgRm9yd2FyZGVkIHRvICIvRXJyb3JQYWdlMDYuaHRtbCIuPC9saT4KKyAqIDwvdWw+CisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBFcnJvclBhZ2UwNSBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7CisgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworCisgICAgICAgIC8vIFdyaXRlIGEgRkFJTEVEIG1lc3NhZ2UgdGhhdCBzaG91bGQgZ2V0IHJlcGxhY2VkIGJ5IHRoZSBlcnJvciB0ZXh0CisgICAgICAgIHdyaXRlci5wcmludGxuKCJFcnJvclBhZ2UwNSBGQUlMRUQgLSBPcmlnaW5hbCByZXNwb25zZSByZXR1cm5lZCIpOworCisgICAgICAgIC8vIFRocm93IHRoZSBzcGVjaWZpZWQgZXhjZXB0aW9uCisgICAgICAgIFN0cmluZyB0eXBlID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoInR5cGUiKTsKKyAgICAgICAgaWYgKCJBcml0aG1ldGljIi5lcXVhbHModHlwZSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBBcml0aG1ldGljRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKCJFcnJvclBhZ2UwNSBUaHJldyBBcml0aG1ldGljRXhjZXB0aW9uIik7CisgICAgICAgIH0gZWxzZSBpZiAoIkFycmF5Ii5lcXVhbHModHlwZSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoIkVycm9yUGFnZTA1IFRocmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiIpOworICAgICAgICB9IGVsc2UgaWYgKCJOdW1iZXIiLmVxdWFscyh0eXBlKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bWJlckZvcm1hdEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICgiRXJyb3JQYWdlMDUgVGhyZXcgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIik7CisgICAgICAgIH0KKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0Vycm9yUGFnZTA2LmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvRXJyb3JQYWdlMDYuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWNmOWYwCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0Vycm9yUGFnZTA2LmphdmEKQEAgLTAsMCArMSwxNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwgMjAwMCwgMjAwMSAsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50ZXN0ZXI7CisKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lio7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7CisKKy8qKgorICogUGFydCA2IG9mIHRoZSBFcnJvclBhZ2UgVGVzdHMuICBTaG91bGQgYmUgbWFwcGVkIGJ5IHRoZSBjb250YWluZXIgd2hlbgorICogdGhlIEVycm9yUGFnZTA1IHNlcnZsZXQgcmV0dXJucyB0aGUgYXBwcm9wcmlhdGUgZXhjZXB0aW9uLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgRXJyb3JQYWdlMDYgZXh0ZW5kcyBIdHRwU2VydmxldCB7CisKKworICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIHJlc3BvbnNlLnJlc2V0KCk7CisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7CisgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworCisgICAgICAgIC8vIEFjY3VtdWxhdGUgYWxsIHRoZSByZWFzb25zIHRoaXMgcmVxdWVzdCBtaWdodCBmYWlsCisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgT2JqZWN0IHZhbHVlID0gbnVsbDsKKworICAgICAgICB2YWx1ZSA9IHJlcXVlc3QuZ2V0QXR0cmlidXRlKCJqYXZheC5zZXJ2bGV0LmVycm9yLmV4Y2VwdGlvbiIpOworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoImV4Y2VwdGlvbiBpcyAnIiArIHZhbHVlICsgIiciKTsKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiIGV4Y2VwdGlvbiBpcyBtaXNzaW5nLyIpOworICAgICAgICB9IGVsc2UgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBqYXZhLmxhbmcuQXJpdGhtZXRpY0V4Y2VwdGlvbikpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiIGV4Y2VwdGlvbiBjbGFzcyBpcyAiKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCh2YWx1ZS5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICAgICAgICBzYi5hcHBlbmQoIi8iKTsKKyAgICAgICAgfQorCisgICAgICAgIHZhbHVlID0gcmVxdWVzdC5nZXRBdHRyaWJ1dGUoImphdmF4LnNlcnZsZXQuZXJyb3IuZXhjZXB0aW9uX3R5cGUiKTsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJleGNlcHRpb25fdHlwZSBpcyAnIiArIHZhbHVlICsgIiciKTsKKyAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpCisgICAgICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoImV4Y2VwdGlvbl90eXBlIGNsYXNzIGlzICciICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS5nZXRDbGFzcygpLmdldE5hbWUoKSArICInIik7CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQorICAgICAgICAgICAgc2IuYXBwZW5kKCIgZXhjZXB0aW9uX3R5cGUgaXMgbWlzc2luZy8iKTsKKyAgICAgICAgZWxzZSBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIENsYXNzKSkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIgZXhjZXB0aW9uX3R5cGUgY2xhc3MgaXMgIik7CisgICAgICAgICAgICBzYi5hcHBlbmQodmFsdWUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgc2IuYXBwZW5kKCIvIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBDbGFzcyBjbGF6eiA9IChDbGFzcykgdmFsdWU7CisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGNsYXp6LmdldE5hbWUoKTsKKyAgICAgICAgICAgIGlmICghImphdmEubGFuZy5Bcml0aG1ldGljRXhjZXB0aW9uIi5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiBleGNlcHRpb25fdHlwZSBpcyAiKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQobmFtZSk7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIvIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2YWx1ZSA9IHJlcXVlc3QuZ2V0QXR0cmlidXRlKCJqYXZheC5zZXJ2bGV0LmVycm9yLm1lc3NhZ2UiKTsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJtZXNzYWdlIGlzICciICsgdmFsdWUgKyAiJyIpOworICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiIG1lc3NhZ2UgaXMgbWlzc2luZy8iKTsKKyAgICAgICAgZWxzZSBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiIG1lc3NhZ2UgY2xhc3MgaXMgIik7CisgICAgICAgICAgICBzYi5hcHBlbmQodmFsdWUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgc2IuYXBwZW5kKCIvIik7CisgICAgICAgIH0gZWxzZSBpZiAoISJFcnJvclBhZ2UwNSBUaHJldyBBcml0aG1ldGljRXhjZXB0aW9uIi5lcXVhbHModmFsdWUpICYmCisgICAgICAgICAgICAgICAgICAgISJFcnJvclBhZ2UwOCBUaHJldyBBcml0aG1ldGljRXhjZXB0aW9uIi5lcXVhbHModmFsdWUpKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiBtZXNzYWdlIGlzIG5vdCBjb3JyZWN0Iik7CisgICAgICAgIH0KKworICAgICAgICB2YWx1ZSA9IHJlcXVlc3QuZ2V0QXR0cmlidXRlKCJqYXZheC5zZXJ2bGV0LmVycm9yLnJlcXVlc3RfdXJpIik7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgicmVxdWVzdF91cmkgaXMgJyIgKyB2YWx1ZSArICInIik7CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQorICAgICAgICAgICAgc2IuYXBwZW5kKCIgcmVxdWVzdF91cmkgaXMgbWlzc2luZy8iKTsKKyAgICAgICAgZWxzZSBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiIHJlcXVlc3RfdXJpIGNsYXNzIGlzICIpOworICAgICAgICAgICAgc2IuYXBwZW5kKHZhbHVlLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiLyIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU3RyaW5nIHJlcXVlc3RfdXJpID0gKFN0cmluZykgdmFsdWU7CisgICAgICAgICAgICBTdHJpbmcgdGVzdDEgPSByZXF1ZXN0LmdldENvbnRleHRQYXRoKCkgKyAiL0Vycm9yUGFnZTA1IjsKKyAgICAgICAgICAgIFN0cmluZyB0ZXN0MiA9IHJlcXVlc3QuZ2V0Q29udGV4dFBhdGgoKSArICIvV3JhcHBlZEVycm9yUGFnZTA1IjsKKyAgICAgICAgICAgIFN0cmluZyB0ZXN0MyA9IHJlcXVlc3QuZ2V0Q29udGV4dFBhdGgoKSArICIvRXJyb3JQYWdlMDgiOworICAgICAgICAgICAgU3RyaW5nIHRlc3Q0ID0gcmVxdWVzdC5nZXRDb250ZXh0UGF0aCgpICsgIi9XcmFwcGVkRXJyb3JQYWdlMDgiOworICAgICAgICAgICAgaWYgKCFyZXF1ZXN0X3VyaS5lcXVhbHModGVzdDEpICYmICFyZXF1ZXN0X3VyaS5lcXVhbHModGVzdDIpICYmCisgICAgICAgICAgICAgICAgIXJlcXVlc3RfdXJpLmVxdWFscyh0ZXN0MykgJiYgIXJlcXVlc3RfdXJpLmVxdWFscyh0ZXN0NCkpIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiByZXF1ZXN0X3VyaSBpcyAiKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQocmVxdWVzdF91cmkpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiLyIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdmFsdWUgPSByZXF1ZXN0LmdldEF0dHJpYnV0ZSgiamF2YXguc2VydmxldC5lcnJvci5zZXJ2bGV0X25hbWUiKTsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJzZXJ2bGV0X25hbWUgaXMgJyIgKyB2YWx1ZSArICInIik7CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQorICAgICAgICAgICAgc2IuYXBwZW5kKCIgc2VydmxldF9uYW1lIGlzIG1pc3NpbmcvIik7CisgICAgICAgIGVsc2UgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiBzZXJ2bGV0X25hbWUgY2xhc3MgaXMgIik7CisgICAgICAgICAgICBzYi5hcHBlbmQodmFsdWUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgc2IuYXBwZW5kKCIvIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBTdHJpbmcgc2VydmxldF9uYW1lID0gKFN0cmluZykgdmFsdWU7CisgICAgICAgICAgICBpZiAoISJFcnJvclBhZ2UwNSIuZXF1YWxzKHNlcnZsZXRfbmFtZSkgJiYKKyAgICAgICAgICAgICAgICAhIkVycm9yUGFnZTA4Ii5lcXVhbHMoc2VydmxldF9uYW1lKSkgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiIHNlcnZsZXRfbmFtZSBpcyAiKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoc2VydmxldF9uYW1lKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIi8iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlcG9ydCB1bHRpbWF0ZSBzdWNjZXNzIG9yIGZhaWx1cmUKKyAgICAgICAgaWYgKHNiLmxlbmd0aCgpIDwgMSkKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJFcnJvclBhZ2UwNiBQQVNTRUQgLSBTRVJWTEVUIik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJFcnJvclBhZ2UwNiBGQUlMRUQgLSIgKyBzYi50b1N0cmluZygpKTsKKworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBTdGF0aWNMb2dnZXIucmVhZCgpOworICAgICAgICAgICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKG1lc3NhZ2UpOworICAgICAgICB9CisgICAgICAgIFN0YXRpY0xvZ2dlci5yZXNldCgpOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9FcnJvclBhZ2UwNy5qYXZhIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0Vycm9yUGFnZTA3LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU5MDYyYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9FcnJvclBhZ2UwNy5qYXZhCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwgMjAwMCwgMjAwMSAsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50ZXN0ZXI7CisKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lio7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7CisKKy8qKgorICogUGFydCA3IG9mIHRoZSBlcnJvciBwYWdlIHRlc3RzLiAgVGhpcyBzZXJ2bGV0IGlzIGNvbmZpZ3VyZWQgYXMKKyAqIDxjb2RlPmxvYWQtb24tc3RhcnR1cDwvY29kZT4gaW4gdGhlIHdlYi54bWwgZmlsZSwgYW5kIHNob3VsZCByZXR1cm4KKyAqIHN0YXR1cyA1MDMgKHNlcnZpY2UgdW5hdmFpbGFibGUpIHdoZW4gaXQgaXMgY2FsbGVkIGxhdGVyLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgRXJyb3JQYWdlMDcgZXh0ZW5kcyBIdHRwU2VydmxldCB7CisKKyAgICBwdWJsaWMgdm9pZCBpbml0KCkgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgVW5hdmFpbGFibGVFeGNlcHRpb24KKyAgICAgICAgICAgICgiRXJyb3JQYWdlMDcgVGhyZXcgVW5hdmFpbGFibGVFeGNlcHRpb24gaW4gaW5pdCgpIik7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9wbGFpbiIpOworICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSByZXNwb25zZS5nZXRXcml0ZXIoKTsKKyAgICAgICAgd3JpdGVyLnByaW50bG4oIkVycm9yUGFnZTA3IEZBSUxFRCAtIENhbGxlZCB1bmF2YWlsYWJsZSBzZXJ2bGV0Iik7CisKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gU3RhdGljTG9nZ2VyLnJlYWQoKTsKKyAgICAgICAgICAgIGlmIChtZXNzYWdlID09IG51bGwpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihtZXNzYWdlKTsKKyAgICAgICAgfQorICAgICAgICBTdGF0aWNMb2dnZXIucmVzZXQoKTsKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0ZpbHRlclJlcXVlc3QwMS5qYXZhIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0ZpbHRlclJlcXVlc3QwMS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjZTI3OGYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvRmlsdGVyUmVxdWVzdDAxLmphdmEKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwLCAyMDAxICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisKKy8qKgorICogUG9zaXRpdmUgdGVzdCBmb3IgYmVpbmcgYWJsZSB0byBmaWx0ZXIgaW5wdXQuICBUaGUgaW5wdXQgd2lsbCBiZSBlY2hvZWQKKyAqIGJhY2sgaW4gdGhlIHJlc3BvbnNlLCBhZnRlciBoYXZpbmcgYmVlbiBjb252ZXJ0ZWQgdG8gdXBwZXIgY2FzZSBieSB0aGUKKyAqIGFzc29jaWF0ZWQgZmlsdGVyLiAgVXNlIHJlcXVlc3QgcGFyYW1ldGVyIDxjb2RlPnR5cGU8L2NvZGU+IHRvIGRldGVybWluZQorICogd2hldGhlciB0byBjYWxsIGdldFJlYWRlcigpICgicmVhZGVyIikgb3IgZ2V0SW5wdXRTdHJlYW0oKSAoInN0cmVhbSIpLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgRmlsdGVyUmVxdWVzdDAxIGV4dGVuZHMgSHR0cFNlcnZsZXQgeworCisgICAgcHVibGljIHZvaWQgc2VydmljZShIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvcGxhaW4iKTsKKyAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKworICAgICAgICBTdHJpbmcgdHlwZSA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJ0eXBlIik7CisgICAgICAgIGlmICh0eXBlID09IG51bGwpCisgICAgICAgICAgICB0eXBlID0gInJlYWRlciI7CisgICAgICAgIGlmICh0eXBlLmVxdWFsc0lnbm9yZUNhc2UoInJlYWRlciIpKSB7CisgICAgICAgICAgICBCdWZmZXJlZFJlYWRlciBiciA9IHJlcXVlc3QuZ2V0UmVhZGVyKCk7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgIGludCBjID0gYnIucmVhZCgpOworICAgICAgICAgICAgICAgIGlmIChjIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKChjaGFyKSBjKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyLmNsb3NlKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBTZXJ2bGV0SW5wdXRTdHJlYW0gc2lzID0gcmVxdWVzdC5nZXRJbnB1dFN0cmVhbSgpOworICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICBpbnQgYyA9IHNpcy5yZWFkKCk7CisgICAgICAgICAgICAgICAgaWYgKGMgPCAwKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoKGNoYXIpIGMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2lzLmNsb3NlKCk7CisgICAgICAgIH0KKworICAgICAgICB3cml0ZXIucHJpbnRsbihzYi50b1N0cmluZygpKTsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gU3RhdGljTG9nZ2VyLnJlYWQoKTsKKyAgICAgICAgICAgIGlmIChtZXNzYWdlID09IG51bGwpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihtZXNzYWdlKTsKKyAgICAgICAgfQorICAgICAgICBTdGF0aWNMb2dnZXIucmVzZXQoKTsKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0ZpbHRlclJlcXVlc3QwMi5qYXZhIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0ZpbHRlclJlcXVlc3QwMi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MDc1MGIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvRmlsdGVyUmVxdWVzdDAyLmphdmEKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwLCAyMDAxICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisKKy8qKgorICogVmVyaWZ5IHRoYXQgcmVxdWVzdCBhbmQgcmVzcG9uc2Ugd3JhcHBlcnMgYWRkZWQgYnkgYSBGaWx0ZXIgYXJlIGluIGZhY3QKKyAqIHZpc2libGUgdG8gdGhlIGNhbGxlZCBzZXJ2bGV0LgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgRmlsdGVyUmVxdWVzdDAyIGV4dGVuZHMgSHR0cFNlcnZsZXQgeworCisgICAgcHVibGljIHZvaWQgc2VydmljZShIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvcGxhaW4iKTsKKyAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisKKyAgICAgICAgU3RyaW5nIGRpc3BhdGNoID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoImRpc3BhdGNoIik7CisgICAgICAgIGlmICgiRiIuZXF1YWxzKGRpc3BhdGNoKSkgeworICAgICAgICAgICAgUmVxdWVzdERpc3BhdGNoZXIgcmQgPQorICAgICAgICAgICAgICAgIGdldFNlcnZsZXRDb250ZXh0KCkuZ2V0UmVxdWVzdERpc3BhdGNoZXIoIi9GaWx0ZXJSZXF1ZXN0MDJhIik7CisgICAgICAgICAgICBpZiAocmQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiRmlsdGVyUmVxdWVzdDAyIEZBSUxFRCAtIE5vIGZvcndhcmQgcmVxdWVzdCBkaXNwYXRjaGVyIik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmQuZm9yd2FyZChyZXF1ZXN0LCByZXNwb25zZSk7CisgICAgICAgIH0gZWxzZSBpZiAoIkkiLmVxdWFscyhkaXNwYXRjaCkpIHsKKyAgICAgICAgICAgIFJlcXVlc3REaXNwYXRjaGVyIHJkID0KKyAgICAgICAgICAgICAgICBnZXRTZXJ2bGV0Q29udGV4dCgpLmdldFJlcXVlc3REaXNwYXRjaGVyKCIvRmlsdGVyUmVxdWVzdDAyYSIpOworICAgICAgICAgICAgaWYgKHJkID09IG51bGwpCisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIkZpbHRlclJlcXVlc3QwMiBGQUlMRUQgLSBObyBpbmNsdWRlIHJlcXVlc3QgZGlzcGF0Y2hlciIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJkLmluY2x1ZGUocmVxdWVzdCwgcmVzcG9uc2UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU3RyaW5nIHdyYXAgPSByZXF1ZXN0LmdldFBhcmFtZXRlcigid3JhcCIpOworICAgICAgICAgICAgaWYgKCJmYWxzZSIuZXF1YWxzKHdyYXApKSB7CisgICAgICAgICAgICAgICAgaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBUZXN0ZXJIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyKQorICAgICAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiRmlsdGVyUmVxdWVzdDAyIEZBSUxFRCAtIFJlcXVlc3Qgd2FzIHdyYXBwZWQiKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJGaWx0ZXJSZXF1ZXN0MDIgUEFTU0VEIik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCIvV3JhcHBlZEZpbHRlclJlcXVlc3QwMiIuZXF1YWxzKHJlcXVlc3QuZ2V0U2VydmxldFBhdGgoKSkpIHsKKyAgICAgICAgICAgICAgICBpZiAocmVxdWVzdCBpbnN0YW5jZW9mIFRlc3Rlckh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIpCisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJGaWx0ZXJSZXF1ZXN0MDIgUEFTU0VEIik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiRmlsdGVyUmVxdWVzdDAyIEZBSUxFRCAtIFdyYXBwZXIgY2xhc3MgaXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHJlcXVlc3QuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gU3RhdGljTG9nZ2VyLnJlYWQoKTsKKyAgICAgICAgICAgIGlmIChtZXNzYWdlID09IG51bGwpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihtZXNzYWdlKTsKKyAgICAgICAgfQorICAgICAgICBTdGF0aWNMb2dnZXIucmVzZXQoKTsKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0ZpbHRlclJlcXVlc3QwMmEuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9GaWx0ZXJSZXF1ZXN0MDJhLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA5MzZkNQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9GaWx0ZXJSZXF1ZXN0MDJhLmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwLCAyMDAxICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisKKy8qKgorICogVmVyaWZ5IHRoYXQgcmVxdWVzdCBhbmQgcmVzcG9uc2Ugd3JhcHBlcnMgYWRkZWQgYnkgYSBGaWx0ZXIgYXJlIGluIGZhY3QKKyAqIHZpc2libGUgdG8gdGhlIGNhbGxlZCBzZXJ2bGV0LgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgRmlsdGVyUmVxdWVzdDAyYSBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworCisgICAgcHVibGljIHZvaWQgc2VydmljZShIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvcGxhaW4iKTsKKyAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisgICAgICAgIFN0cmluZyB3cmFwID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoIndyYXAiKTsKKworICAgICAgICBpZiAoImZhbHNlIi5lcXVhbHMod3JhcCkpIHsKKyAgICAgICAgICAgIGlmIChyZXF1ZXN0IGluc3RhbmNlb2YgVGVzdGVySHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlcikKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiRmlsdGVyUmVxdWVzdDAyIEZBSUxFRCAtIFJlcXVlc3Qgd2FzIHdyYXBwZWQiKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiRmlsdGVyUmVxdWVzdDAyIFBBU1NFRCIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBUZXN0ZXJIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyKQorICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJGaWx0ZXJSZXF1ZXN0MDIgUEFTU0VEIik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIkZpbHRlclJlcXVlc3QwMiBGQUlMRUQgLSBXcmFwcGVyIGNsYXNzIGlzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHJlcXVlc3QuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgICB9CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0ZpbHRlclJlc3BvbnNlMDEuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9GaWx0ZXJSZXNwb25zZTAxLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNkYzJkOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9GaWx0ZXJSZXNwb25zZTAxLmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwLCAyMDAxICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisKKy8qKgorICogUG9zaXRpdmUgdGVzdCBmb3IgYmVpbmcgYWJsZSB0byBmaWx0ZXIgb3V0cHV0LiAgVGhlIG91dHB1dCBzaG91bGQgYmUKKyAqIGZpbHRlcmVkIGFuZCBjb252ZXJ0ZWQgdG8gdXBwZXIgY2FzZSBiZWZvcmUgcmV0dXJuIHRvIHRoZSBjbGllbnQuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBGaWx0ZXJSZXNwb25zZTAxIGV4dGVuZHMgSHR0cFNlcnZsZXQgeworCisgICAgcHVibGljIHZvaWQgc2VydmljZShIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvcGxhaW4iKTsKKyAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisKKyAgICAgICAgd3JpdGVyLnByaW50bG4oIkZpbHRlclJlc3BvbnNlMDEgUEFTU0VEIik7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IFN0YXRpY0xvZ2dlci5yZWFkKCk7CisgICAgICAgICAgICBpZiAobWVzc2FnZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4obWVzc2FnZSk7CisgICAgICAgIH0KKyAgICAgICAgU3RhdGljTG9nZ2VyLnJlc2V0KCk7CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9GaWx0ZXJSZXNwb25zZTA0LmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvRmlsdGVyUmVzcG9uc2UwNC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjYjQ3YTgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvRmlsdGVyUmVzcG9uc2UwNC5qYXZhCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwgMjAwMCwgMjAwMSAsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50ZXN0ZXI7CisKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworCisvKioKKyAqIFZlcmlmeSB0aGF0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHdyYXBwZXJzIGFkZGVkIGJ5IGEgRmlsdGVyIGFyZSBpbiBmYWN0CisgKiB2aXNpYmxlIHRvIHRoZSBjYWxsZWQgc2VydmxldC4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEZpbHRlclJlc3BvbnNlMDQgZXh0ZW5kcyBIdHRwU2VydmxldCB7CisKKyAgICBwdWJsaWMgdm9pZCBzZXJ2aWNlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9wbGFpbiIpOworICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSByZXNwb25zZS5nZXRXcml0ZXIoKTsKKworICAgICAgICBTdHJpbmcgZGlzcGF0Y2ggPSByZXF1ZXN0LmdldFBhcmFtZXRlcigiZGlzcGF0Y2giKTsKKyAgICAgICAgaWYgKCJGIi5lcXVhbHMoZGlzcGF0Y2gpKSB7CisgICAgICAgICAgICBSZXF1ZXN0RGlzcGF0Y2hlciByZCA9CisgICAgICAgICAgICAgICAgZ2V0U2VydmxldENvbnRleHQoKS5nZXRSZXF1ZXN0RGlzcGF0Y2hlcigiL0ZpbHRlclJlc3BvbnNlMDRhIik7CisgICAgICAgICAgICBpZiAocmQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiRmlsdGVyUmVzcG9uc2UwNCBGQUlMRUQgLSBObyBmb3J3YXJkIHJlcXVlc3QgZGlzcGF0Y2hlciIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJkLmZvcndhcmQocmVxdWVzdCwgcmVzcG9uc2UpOworICAgICAgICB9IGVsc2UgaWYgKCJJIi5lcXVhbHMoZGlzcGF0Y2gpKSB7CisgICAgICAgICAgICBSZXF1ZXN0RGlzcGF0Y2hlciByZCA9CisgICAgICAgICAgICAgICAgZ2V0U2VydmxldENvbnRleHQoKS5nZXRSZXF1ZXN0RGlzcGF0Y2hlcigiL0ZpbHRlclJlc3BvbnNlMDRhIik7CisgICAgICAgICAgICBpZiAocmQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiRmlsdGVyUmVzcG9uc2UwNCBGQUlMRUQgLSBObyBpbmNsdWRlIHJlcXVlc3QgZGlzcGF0Y2hlciIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJkLmluY2x1ZGUocmVxdWVzdCwgcmVzcG9uc2UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU3RyaW5nIHdyYXAgPSByZXF1ZXN0LmdldFBhcmFtZXRlcigid3JhcCIpOworICAgICAgICAgICAgaWYgKCJmYWxzZSIuZXF1YWxzKHdyYXApKSB7CisgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlIGluc3RhbmNlb2YgVGVzdGVySHR0cFNlcnZsZXRSZXNwb25zZVdyYXBwZXIpCisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJGaWx0ZXJSZXNwb25zZTA0IEZBSUxFRCAtIFJlc3BvbnNlIHdhcyB3cmFwcGVkIik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiRmlsdGVyUmVzcG9uc2UwNCBQQVNTRUQiKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIi9XcmFwcGVkRmlsdGVyUmVzcG9uc2UwNCIuZXF1YWxzKHJlcXVlc3QuZ2V0U2VydmxldFBhdGgoKSkpIHsKKyAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UgaW5zdGFuY2VvZiBUZXN0ZXJIdHRwU2VydmxldFJlc3BvbnNlV3JhcHBlcikKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIkZpbHRlclJlc3BvbnNlMDQgUEFTU0VEIik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiRmlsdGVyUmVzcG9uc2UwNCBGQUlMRUQgLSBXcmFwcGVyIGNsYXNzIGlzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyByZXNwb25zZS5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBTdGF0aWNMb2dnZXIucmVhZCgpOworICAgICAgICAgICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKG1lc3NhZ2UpOworICAgICAgICB9CisgICAgICAgIFN0YXRpY0xvZ2dlci5yZXNldCgpOworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvRmlsdGVyUmVzcG9uc2UwNGEuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9GaWx0ZXJSZXNwb25zZTA0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4MTdiODgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvRmlsdGVyUmVzcG9uc2UwNGEuamF2YQpAQCAtMCwwICsxLDYyIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAsIDIwMDEgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuKjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lio7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7CisKKworLyoqCisgKiBWZXJpZnkgdGhhdCByZXF1ZXN0IGFuZCByZXNwb25zZSB3cmFwcGVycyBhZGRlZCBieSBhIEZpbHRlciBhcmUgaW4gZmFjdAorICogdmlzaWJsZSB0byB0aGUgY2FsbGVkIHNlcnZsZXQuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBGaWx0ZXJSZXNwb25zZTA0YSBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworCisgICAgcHVibGljIHZvaWQgc2VydmljZShIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvcGxhaW4iKTsKKyAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisgICAgICAgIFN0cmluZyB3cmFwID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoIndyYXAiKTsKKworICAgICAgICBpZiAoImZhbHNlIi5lcXVhbHMod3JhcCkpIHsKKyAgICAgICAgICAgIGlmIChyZXNwb25zZSBpbnN0YW5jZW9mIFRlc3Rlckh0dHBTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyKQorICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJGaWx0ZXJSZXNwb25zZTA0IEZBSUxFRCAtIFJlc3BvbnNlIHdhcyB3cmFwcGVkIik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIkZpbHRlclJlc3BvbnNlMDQgUEFTU0VEIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAocmVzcG9uc2UgaW5zdGFuY2VvZiBUZXN0ZXJIdHRwU2VydmxldFJlc3BvbnNlV3JhcHBlcikKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiRmlsdGVyUmVzcG9uc2UwNCBQQVNTRUQiKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiRmlsdGVyUmVzcG9uc2UwNCBGQUlMRUQgLSBXcmFwcGVyIGNsYXNzIGlzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHJlc3BvbnNlLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9Gb3J3YXJkMDAuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9Gb3J3YXJkMDAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGVjYTM4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0ZvcndhcmQwMC5qYXZhCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwgMjAwMCwgMjAwMSAsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50ZXN0ZXI7CisKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lio7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7CisKKy8qKgorICogRXhlcmNpc2UgYmFzaWMgZm9yd2FyZGluZyBmdW5jdGlvbmFsaXR5LgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgRm9yd2FyZDAwIGV4dGVuZHMgSHR0cFNlcnZsZXQgeworCisKKyAgICBwdWJsaWMgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICAvLyBQcmVwYXJlIHRoaXMgcmVzcG9uc2UKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9wbGFpbiIpOworCVByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworCisgICAgICAgIC8vIEFjcXVpcmUgdGhlIHBhdGggdG8gd2hpY2ggd2Ugd2lsbCBpc3N1ZSBhIGZvcndhcmQKKyAgICAgICAgU3RyaW5nIHBhdGggPSByZXF1ZXN0LmdldFBhcmFtZXRlcigicGF0aCIpOworICAgICAgICBpZiAocGF0aCA9PSBudWxsKQorICAgICAgICAgICAgcGF0aCA9ICIvRm9yd2FyZDAwYSI7CisKKyAgICAgICAgLy8gQ3JlYXRlIGEgcmVxdWVzdCBkaXNwYXRjaGVyIGFuZCBjYWxsIGZvcndhcmQoKSBvbiBpdAorICAgICAgICBSZXF1ZXN0RGlzcGF0Y2hlciByZCA9IG51bGw7CisgICAgICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoIiEiKSkKKyAgICAgICAgICAgIHJkID0gZ2V0U2VydmxldENvbnRleHQoKS5nZXROYW1lZERpc3BhdGNoZXIocGF0aC5zdWJzdHJpbmcoMSkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZCA9IGdldFNlcnZsZXRDb250ZXh0KCkuZ2V0UmVxdWVzdERpc3BhdGNoZXIocGF0aCk7CisgICAgICAgIGlmIChyZCA9PSBudWxsKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiBObyBSZXF1ZXN0RGlzcGF0Y2hlciByZXR1cm5lZC8iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChzYi5sZW5ndGgoKSA8IDEpCisgICAgICAgICAgICAgICAgcmQuZm9yd2FyZChyZXF1ZXN0LCByZXNwb25zZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBXcml0ZSBvdXIgcmVzcG9uc2UgaWYgYW4gZXJyb3Igb2NjdXJyZWQKKyAgICAgICAgaWYgKHNiLmxlbmd0aCgpID49IDEpIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiRm9yd2FyZDAwIEZBSUxFRCAtIik7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihzYi50b1N0cmluZygpKTsKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBTdGF0aWNMb2dnZXIucmVhZCgpOworICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKG1lc3NhZ2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFN0YXRpY0xvZ2dlci5yZXNldCgpOworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvRm9yd2FyZDAwYS5qYXZhIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0ZvcndhcmQwMGEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDI5ZGNlCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0ZvcndhcmQwMGEuamF2YQpAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAsIDIwMDEgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisvKioKKyAqIEV4ZXJjaXNlIGJhc2ljIGZvcndhcmRpbmcgZnVuY3Rpb25hbGl0eS4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEZvcndhcmQwMGEgZXh0ZW5kcyBIdHRwU2VydmxldCB7CisKKworICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIFByZXBhcmUgdGhpcyByZXNwb25zZQorICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7CisJUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisKKyAgICAgICAgLy8gV3JpdGUgb3VyIHJlc3BvbnNlIGlmIGFuIGVycm9yIG9jY3VycmVkCisgICAgICAgIHdyaXRlci5wcmludCgiRm9yd2FyZDAwYSBQQVNTRUQiKTsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gU3RhdGljTG9nZ2VyLnJlYWQoKTsKKyAgICAgICAgICAgIGlmIChtZXNzYWdlID09IG51bGwpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihtZXNzYWdlKTsKKyAgICAgICAgfQorICAgICAgICBTdGF0aWNMb2dnZXIucmVzZXQoKTsKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0ZvcndhcmQwMGQuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9Gb3J3YXJkMDBkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI0Mjk1ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9Gb3J3YXJkMDBkLmphdmEKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwLCAyMDAxICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworLyoqCisgKiBFeGVyY2lzZSBiYXNpYyBmb3J3YXJkaW5nIGZ1bmN0aW9uYWxpdHkuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBGb3J3YXJkMDBkIGV4dGVuZHMgSHR0cFNlcnZsZXQgeworCisKKyAgICBwdWJsaWMgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICAvLyBQcmVwYXJlIHRoaXMgcmVzcG9uc2UKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9wbGFpbiIpOworCVByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworCisgICAgICAgIC8vIFdyaXRlIG91ciByZXNwb25zZSBpZiBhbiBlcnJvciBvY2N1cnJlZAorICAgICAgICB3cml0ZXIucHJpbnQoIkZvcndhcmQwMGQgUEFTU0VEIik7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IFN0YXRpY0xvZ2dlci5yZWFkKCk7CisgICAgICAgICAgICBpZiAobWVzc2FnZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4obWVzc2FnZSk7CisgICAgICAgIH0KKyAgICAgICAgU3RhdGljTG9nZ2VyLnJlc2V0KCk7CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9Gb3J3YXJkMDEuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9Gb3J3YXJkMDEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDg1MGM4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0ZvcndhcmQwMS5qYXZhCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwgMjAwMCAsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50ZXN0ZXI7CisKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaW5jaXBhbDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lio7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7CisKKy8qKgorICogUG9zaXRpdmUgdGVzdCBmb3IgZm9yd2FyZGluZyB0byBhIHN0YXRpYyByZXNvdXJjZS4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEZvcndhcmQwMSBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7CisgICAgICAgIFJlcXVlc3REaXNwYXRjaGVyIHJkID0KKyAgICAgICAgICAgIGdldFNlcnZsZXRDb250ZXh0KCkuZ2V0UmVxdWVzdERpc3BhdGNoZXIoIi9Gb3J3YXJkMDEudHh0Iik7CisgICAgICAgIGlmIChyZCA9PSBudWxsKSB7CisgICAgICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSByZXNwb25zZS5nZXRXcml0ZXIoKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJGb3J3YXJkMDEgRkFJTEVEIC0gTm8gUmVxdWVzdERpc3BhdGNoZXIgcmV0dXJuZWQiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICByZC5mb3J3YXJkKHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICAgICAgU3RhdGljTG9nZ2VyLnJlc2V0KCk7CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9Gb3J3YXJkMDMuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9Gb3J3YXJkMDMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmRjYTBmCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0ZvcndhcmQwMy5qYXZhCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwgMjAwMCwgMjAwMSAsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50ZXN0ZXI7CisKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lio7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7CisKKy8qKgorICogVGVzdCB0byBlbnN1cmUgdGhhdCBhIGZvcndhcmRlZC10byBzZXJ2bGV0IGNhbiByZWNlaXZlIHJlcXVlc3QgYXR0cmlidXRlcworICogc2V0IGJ5IHRoZSBjYWxsaW5nIHNlcnZsZXQsIGFzIHdlbGwgYXMgc2V0IHRoZWlyIG93biByZXF1ZXN0IGF0dHJpYnV0ZXMuCisgKgorICogVGhlIHRlc3QgZm9yd2FyZHMgdG8gZWl0aGVyIGEgc2VydmxldCAoIi9Gb3J3YXJkMDNhIikgb3IgYSBKU1AgcGFnZQorICogKCIvRm9yd2FyZDAzYi5qc3AiKSBkZXBlbmRpbmcgb24gdGhlIHZhbHVlIHNwZWNpZmllZCBmb3IgdGhlICJwYXRoIgorICogcGFyYW1ldGVyLiAgVGhlIGRlZmF1bHQgaXMgdGhlIHNlcnZsZXQuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBGb3J3YXJkMDMgZXh0ZW5kcyBIdHRwU2VydmxldCB7CisKKworICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIFByZXBhcmUgdGhpcyByZXNwb25zZQorICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7CisJUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisKKyAgICAgICAgLy8gQWNxdWlyZSB0aGUgcGF0aCB0byB3aGljaCB3ZSB3aWxsIGlzc3VlIGEgZm9yd2FyZAorICAgICAgICBTdHJpbmcgcGF0aCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJwYXRoIik7CisgICAgICAgIGlmIChwYXRoID09IG51bGwpCisgICAgICAgICAgICBwYXRoID0gIi9Gb3J3YXJkMDNhIjsKKworICAgICAgICAvLyBXcml0ZSB0aGUgcmVxdWVzdCBhdHRyaWJ1dGUgd2Ugd2lsbCBiZSBmb3J3YXJkaW5nCisgICAgICAgIHJlcXVlc3Quc2V0QXR0cmlidXRlKCJGb3J3YXJkMDMiLCAiVGhpcyBpcyB0aGUgZm9yd2FyZGVkIGF0dHJpYnV0ZSIpOworICAgICAgICBpZiAocmVxdWVzdC5nZXRBdHRyaWJ1dGUoIkZvcndhcmQwMyIpID09IG51bGwpCisgICAgICAgICAgICBzYi5hcHBlbmQoIiBDYW5ub3QgcmV0cmlldmUgYXR0cmlidXRlIHRvIGZvcndhcmQvIik7CisKKyAgICAgICAgLy8gQ3JlYXRlIGEgcmVxdWVzdCBkaXNwYXRjaGVyIGFuZCBjYWxsIGZvcndhcmQoKSBvbiBpdAorICAgICAgICBSZXF1ZXN0RGlzcGF0Y2hlciByZCA9CisgICAgICAgICAgICBnZXRTZXJ2bGV0Q29udGV4dCgpLmdldFJlcXVlc3REaXNwYXRjaGVyKHBhdGgpOworICAgICAgICBpZiAocmQgPT0gbnVsbCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIgTm8gUmVxdWVzdERpc3BhdGNoZXIgcmV0dXJuZWQvIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoc2IubGVuZ3RoKCkgPCAxKQorICAgICAgICAgICAgICAgIHJkLmZvcndhcmQocmVxdWVzdCwgcmVzcG9uc2UpOworICAgICAgICB9CisKKyAgICAgICAgLy8gV3JpdGUgb3VyIHJlc3BvbnNlIGlmIGFuIGVycm9yIG9jY3VycmVkCisgICAgICAgIGlmIChzYi5sZW5ndGgoKSA+PSAxKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoIkluY2x1ZGUwMyBGQUlMRUQgLSIpOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oc2IudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gU3RhdGljTG9nZ2VyLnJlYWQoKTsKKyAgICAgICAgICAgICAgICBpZiAobWVzc2FnZSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihtZXNzYWdlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBTdGF0aWNMb2dnZXIucmVzZXQoKTsKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0ZvcndhcmQwM2EuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9Gb3J3YXJkMDNhLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZkZDAzMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9Gb3J3YXJkMDNhLmphdmEKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwLCAyMDAxICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworLyoqCisgKiBUZXN0IHRvIGVuc3VyZSB0aGF0IGEgZm9yd2FyZGVkLXRvIHNlcnZsZXQgY2FuIHJlY2VpdmUgcmVxdWVzdCBhdHRyaWJ1dGVzCisgKiBzZXQgYnkgdGhlIGNhbGxpbmcgc2VydmxldCwgYXMgd2VsbCBhcyBzZXQgdGhlaXIgb3duIHJlcXVlc3QgYXR0cmlidXRlcy4KKyAqCisgKiBUaGUgdGVzdCBmb3J3YXJkcyB0byBlaXRoZXIgYSBzZXJ2bGV0ICgiL0ZvcndhcmQwM2EiKSBvciBhIEpTUCBwYWdlCisgKiAoIi9Gb3J3YXJkMDNiLmpzcCIpIGRlcGVuZGluZyBvbiB0aGUgdmFsdWUgc3BlY2lmaWVkIGZvciB0aGUgInBhdGgiCisgKiBwYXJhbWV0ZXIuICBUaGUgZGVmYXVsdCBpcyB0aGUgc2VydmxldC4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEZvcndhcmQwM2EgZXh0ZW5kcyBIdHRwU2VydmxldCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgc3BlY2lhbHNbXSA9CisgICAgeyAiamF2YXguc2VydmxldC5pbmNsdWRlLnJlcXVlc3RfdXJpIiwKKyAgICAgICJqYXZheC5zZXJ2bGV0LmluY2x1ZGUuY29udGV4dF9wYXRoIiwKKyAgICAgICJqYXZheC5zZXJ2bGV0LmluY2x1ZGUuc2VydmxldF9wYXRoIiwKKyAgICAgICJqYXZheC5zZXJ2bGV0LmluY2x1ZGUucGF0aF9pbmZvIiwKKyAgICAgICJqYXZheC5zZXJ2bGV0LmluY2x1ZGUucXVlcnlfc3RyaW5nIiB9OworCisKKyAgICBwdWJsaWMgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICAvLyBQcmVwYXJlIHRoaXMgcmVzcG9uc2UKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9wbGFpbiIpOworCVByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworCisgICAgICAgIC8vIFZlcmlmeSB0aGF0IHdlIGNhbiByZXRyaWV2ZSB0aGUgZm9yd2FyZGVkIGF0dHJpYnV0ZQorICAgICAgICBpZiAocmVxdWVzdC5nZXRBdHRyaWJ1dGUoIkZvcndhcmQwMyIpID09IG51bGwpCisgICAgICAgICAgICBzYi5hcHBlbmQoIiBDYW5ub3QgcmV0cmlldmUgZm9yd2FyZGVkIGF0dHJpYnV0ZS8iKTsKKworICAgICAgICAvLyBWZXJpZnkgdGhhdCB3ZSBjYW4gc2V0IGFuZCByZXRyaWV2ZSBvdXIgb3duIGF0dHJpYnV0ZQorICAgICAgICByZXF1ZXN0LnNldEF0dHJpYnV0ZSgiRm9yd2FyZDAzYSIsICJUaGlzIGlzIG91ciBvd24gYXR0cmlidXRlIik7CisgICAgICAgIGlmIChyZXF1ZXN0LmdldEF0dHJpYnV0ZSgiRm9yd2FyZDAzYSIpID09IG51bGwpCisgICAgICAgICAgICBzYi5hcHBlbmQoIiBDYW5ub3QgcmV0cmlldmUgb3VyIG93biBhdHRyaWJ1dGUiKTsKKworICAgICAgICAvLyBWZXJpZnkgdGhhdCBubyBzcGVjaWFsIGF0dHJpYnV0ZXMgYXJlIHByZXNlbnQKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzcGVjaWFscy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKHJlcXVlc3QuZ2V0QXR0cmlidXRlKHNwZWNpYWxzW2ldKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgUmV0dXJuZWQgYXR0cmlidXRlICIpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChzcGVjaWFsc1tpXSk7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIvIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBXcml0ZSBvdXIgcmVzcG9uc2UKKyAgICAgICAgaWYgKHNiLmxlbmd0aCgpIDwgMSkKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJGb3J3YXJkMDMgUEFTU0VEIik7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgd3JpdGVyLnByaW50KCJGb3J3YXJkMDMgRkFJTEVEIC0iKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKHNiLnRvU3RyaW5nKCkpOworICAgICAgICB9CisKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gU3RhdGljTG9nZ2VyLnJlYWQoKTsKKyAgICAgICAgICAgIGlmIChtZXNzYWdlID09IG51bGwpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihtZXNzYWdlKTsKKyAgICAgICAgfQorICAgICAgICBTdGF0aWNMb2dnZXIucmVzZXQoKTsKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0ZvcndhcmQwNC5qYXZhIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0ZvcndhcmQwNC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5M2JkMzkKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvRm9yd2FyZDA0LmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwLCAyMDAxICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworLyoqCisgKiBUZXN0aW5nIGZvciBkb3VibGUgZm9yd2FyZGluZy4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEZvcndhcmQwNCBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIFByZXBhcmUgdGhpcyByZXNwb25zZQorICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9wbGFpbiIpOworICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSByZXNwb25zZS5nZXRXcml0ZXIoKTsKKworICAgICAgICAvLyBGb3J3YXJkIHRvIHRoZSBmaXJzdCBzZXJ2bGV0CisgICAgICAgIFJlcXVlc3REaXNwYXRjaGVyIHJkID0KKyAgICAgICAgICAgIGdldFNlcnZsZXRDb250ZXh0KCkuZ2V0UmVxdWVzdERpc3BhdGNoZXIoIi9Gb3J3YXJkMDRhIik7CisgICAgICAgIGlmIChyZCA9PSBudWxsKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiRm9yd2FyZDA0IEZBSUxFRCAtIE5vIHJlcXVlc3QgZGlzcGF0Y2hlciIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBmb3IgL0ZvcndhcmQwNGEiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJkLmZvcndhcmQocmVxdWVzdCwgcmVzcG9uc2UpOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIkZvcndhcmQwNCB0ZXh0IHNob3VsZCBOT1QgYmUgcHJlc2VudCIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gU3RhdGljIGxvZ2dlciBvdXRwdXQgKHNob3VsZCBub3QgYWN0dWFsbHkgYmUgcmVuZGVyZWQpCisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IFN0YXRpY0xvZ2dlci5yZWFkKCk7CisgICAgICAgICAgICBpZiAobWVzc2FnZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4obWVzc2FnZSk7CisgICAgICAgIH0KKyAgICAgICAgU3RhdGljTG9nZ2VyLnJlc2V0KCk7CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9Gb3J3YXJkMDRhLmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvRm9yd2FyZDA0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5YWIzZjMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvRm9yd2FyZDA0YS5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwgMjAwMCwgMjAwMSAsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50ZXN0ZXI7CisKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lio7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7CisKKy8qKgorICogVGVzdGluZyBmb3IgZG91YmxlIGZvcndhcmRpbmcuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBGb3J3YXJkMDRhIGV4dGVuZHMgSHR0cFNlcnZsZXQgeworCisgICAgcHVibGljIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gUHJlcGFyZSB0aGlzIHJlc3BvbnNlCisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7CisgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworCisgICAgICAgIC8vIEZvcndhcmQgdG8gdGhlIHNlY29uZCBzZXJ2bGV0CisgICAgICAgIFJlcXVlc3REaXNwYXRjaGVyIHJkID0KKyAgICAgICAgICAgIGdldFNlcnZsZXRDb250ZXh0KCkuZ2V0UmVxdWVzdERpc3BhdGNoZXIoIi9Gb3J3YXJkMDRiIik7CisgICAgICAgIGlmIChyZCA9PSBudWxsKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiRm9yd2FyZDA0YSBGQUlMRUQgLSBObyByZXF1ZXN0IGRpc3BhdGNoZXIiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZm9yIC9Gb3J3YXJkMDRiIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZC5mb3J3YXJkKHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJGb3J3YXJkMDRhIHRleHQgc2hvdWxkIE5PVCBiZSBwcmVzZW50Iik7CisgICAgICAgIH0KKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0ZvcndhcmQwNGIuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9Gb3J3YXJkMDRiLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU2MWYwOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9Gb3J3YXJkMDRiLmphdmEKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwLCAyMDAxICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworLyoqCisgKiBUZXN0aW5nIGZvciBkb3VibGUgZm9yd2FyZGluZy4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEZvcndhcmQwNGIgZXh0ZW5kcyBIdHRwU2VydmxldCB7CisKKyAgICBwdWJsaWMgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICAvLyBQcmVwYXJlIHRoaXMgcmVzcG9uc2UKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvcGxhaW4iKTsKKyAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisgICAgICAgIHdyaXRlci5wcmludGxuKCJGb3J3YXJkMDRiIFBBU1NFRCIpOworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvRm9yd2FyZDA1LmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvRm9yd2FyZDA1LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZlZjE3ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9Gb3J3YXJkMDUuamF2YQpAQCAtMCwwICsxLDYyIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAsIDIwMDEgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisvKioKKyAqIFRlc3RpbmcgZm9yIGRvdWJsZSBmb3J3YXJkaW5nLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgRm9yd2FyZDA1IGV4dGVuZHMgSHR0cFNlcnZsZXQgeworCisgICAgcHVibGljIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gUHJlcGFyZSB0aGlzIHJlc3BvbnNlCisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7CisgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworCisgICAgICAgIC8vIEZvcndhcmQgdG8gdGhlIGZpcnN0IHNlcnZsZXQKKyAgICAgICAgUmVxdWVzdERpc3BhdGNoZXIgcmQgPQorICAgICAgICAgICAgZ2V0U2VydmxldENvbnRleHQoKS5nZXRSZXF1ZXN0RGlzcGF0Y2hlcigiL0ZvcndhcmQwNWEuanNwIik7CisgICAgICAgIGlmIChyZCA9PSBudWxsKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiRm9yd2FyZDA1IEZBSUxFRCAtIE5vIHJlcXVlc3QgZGlzcGF0Y2hlciIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBmb3IgL0ZvcndhcmQwNWEuanNwIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZC5mb3J3YXJkKHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJGb3J3YXJkMDUgdGV4dCBzaG91bGQgTk9UIGJlIHByZXNlbnQiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFN0YXRpYyBsb2dnZXIgb3V0cHV0IChzaG91bGQgbm90IGFjdHVhbGx5IGJlIHJlbmRlcmVkKQorICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBTdGF0aWNMb2dnZXIucmVhZCgpOworICAgICAgICAgICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKG1lc3NhZ2UpOworICAgICAgICB9CisgICAgICAgIFN0YXRpY0xvZ2dlci5yZXNldCgpOworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvRm9yd2FyZDA1YS5qYXZhIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0ZvcndhcmQwNWEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTExMTZlCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0ZvcndhcmQwNWEuamF2YQpAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAsIDIwMDEgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisvKioKKyAqIFRlc3RpbmcgZm9yIGRvdWJsZSBmb3J3YXJkaW5nLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgRm9yd2FyZDA1YSBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIFByZXBhcmUgdGhpcyByZXNwb25zZQorICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9wbGFpbiIpOworICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSByZXNwb25zZS5nZXRXcml0ZXIoKTsKKworICAgICAgICAvLyBGb3J3YXJkIHRvIHRoZSBzZWNvbmQgc2VydmxldAorICAgICAgICBSZXF1ZXN0RGlzcGF0Y2hlciByZCA9CisgICAgICAgICAgICBnZXRTZXJ2bGV0Q29udGV4dCgpLmdldFJlcXVlc3REaXNwYXRjaGVyKCIvRm9yd2FyZDA1Yi5qc3AiKTsKKyAgICAgICAgaWYgKHJkID09IG51bGwpIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJGb3J3YXJkMDVhIEZBSUxFRCAtIE5vIHJlcXVlc3QgZGlzcGF0Y2hlciIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBmb3IgL0ZvcndhcmQwNWIuanNwIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZC5mb3J3YXJkKHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJGb3J3YXJkMDVhIHRleHQgc2hvdWxkIE5PVCBiZSBwcmVzZW50Iik7CisgICAgICAgIH0KKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0ZvcndhcmQwNWIuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9Gb3J3YXJkMDViLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IyZDYzZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9Gb3J3YXJkMDViLmphdmEKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwLCAyMDAxICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworLyoqCisgKiBUZXN0aW5nIGZvciBkb3VibGUgZm9yd2FyZGluZy4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEZvcndhcmQwNWIgZXh0ZW5kcyBIdHRwU2VydmxldCB7CisKKyAgICBwdWJsaWMgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICAvLyBQcmVwYXJlIHRoaXMgcmVzcG9uc2UKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvcGxhaW4iKTsKKyAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisgICAgICAgIHdyaXRlci5wcmludGxuKCJGb3J3YXJkMDViIFBBU1NFRCIpOworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvRm9yd2FyZDA2LmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvRm9yd2FyZDA2LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVlNDQwNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9Gb3J3YXJkMDYuamF2YQpAQCAtMCwwICsxLDYyIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAsIDIwMDEgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisvKioKKyAqIFRlc3RpbmcgZm9yIGRvdWJsZSBmb3J3YXJkaW5nLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgRm9yd2FyZDA2IGV4dGVuZHMgSHR0cFNlcnZsZXQgeworCisgICAgcHVibGljIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gUHJlcGFyZSB0aGlzIHJlc3BvbnNlCisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7CisgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworCisgICAgICAgIC8vIEZvcndhcmQgdG8gdGhlIGZpcnN0IHNlcnZsZXQKKyAgICAgICAgUmVxdWVzdERpc3BhdGNoZXIgcmQgPQorICAgICAgICAgICAgZ2V0U2VydmxldENvbnRleHQoKS5nZXRSZXF1ZXN0RGlzcGF0Y2hlcigiL0ZvcndhcmQwNmEuanNwIik7CisgICAgICAgIGlmIChyZCA9PSBudWxsKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiRm9yd2FyZDA1IEZBSUxFRCAtIE5vIHJlcXVlc3QgZGlzcGF0Y2hlciIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBmb3IgL0ZvcndhcmQwNmEuanNwIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZC5mb3J3YXJkKHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJGb3J3YXJkMDYgdGV4dCBzaG91bGQgTk9UIGJlIHByZXNlbnQiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFN0YXRpYyBsb2dnZXIgb3V0cHV0IChzaG91bGQgbm90IGFjdHVhbGx5IGJlIHJlbmRlcmVkKQorICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBTdGF0aWNMb2dnZXIucmVhZCgpOworICAgICAgICAgICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKG1lc3NhZ2UpOworICAgICAgICB9CisgICAgICAgIFN0YXRpY0xvZ2dlci5yZXNldCgpOworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvRm9yd2FyZDA2YS5qYXZhIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0ZvcndhcmQwNmEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWU0YmNmCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0ZvcndhcmQwNmEuamF2YQpAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAsIDIwMDEgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisvKioKKyAqIFRlc3RpbmcgZm9yIGRvdWJsZSBmb3J3YXJkaW5nLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgRm9yd2FyZDA2YSBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIFByZXBhcmUgdGhpcyByZXNwb25zZQorICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9wbGFpbiIpOworICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSByZXNwb25zZS5nZXRXcml0ZXIoKTsKKworICAgICAgICAvLyBGb3J3YXJkIHRvIHRoZSBzZWNvbmQgc2VydmxldAorICAgICAgICBSZXF1ZXN0RGlzcGF0Y2hlciByZCA9CisgICAgICAgICAgICBnZXRTZXJ2bGV0Q29udGV4dCgpLmdldFJlcXVlc3REaXNwYXRjaGVyKCIvRm9yd2FyZDA2Yi5qc3AiKTsKKyAgICAgICAgaWYgKHJkID09IG51bGwpIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJGb3J3YXJkMDZhIEZBSUxFRCAtIE5vIHJlcXVlc3QgZGlzcGF0Y2hlciIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBmb3IgL0ZvcndhcmQwNmIuanNwIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZC5mb3J3YXJkKHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJGb3J3YXJkMDZhIHRleHQgc2hvdWxkIE5PVCBiZSBwcmVzZW50Iik7CisgICAgICAgIH0KKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0ZvcndhcmQwNmIuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9Gb3J3YXJkMDZiLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQzNGJjZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9Gb3J3YXJkMDZiLmphdmEKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwLCAyMDAxICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworLyoqCisgKiBUZXN0aW5nIGZvciBkb3VibGUgZm9yd2FyZGluZy4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEZvcndhcmQwNmIgZXh0ZW5kcyBIdHRwU2VydmxldCB7CisKKyAgICBwdWJsaWMgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICAvLyBQcmVwYXJlIHRoaXMgcmVzcG9uc2UKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvcGxhaW4iKTsKKyAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisgICAgICAgIHdyaXRlci5wcmludGxuKCJGb3J3YXJkMDZiIFBBU1NFRCIpOworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvRm9yd2FyZDA3LmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvRm9yd2FyZDA3LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDkwODMxMgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9Gb3J3YXJkMDcuamF2YQpAQCAtMCwwICsxLDYyIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAsIDIwMDEgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisvKioKKyAqIFRlc3RpbmcgZm9yIGRvdWJsZSBmb3J3YXJkaW5nLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgRm9yd2FyZDA3IGV4dGVuZHMgSHR0cFNlcnZsZXQgeworCisgICAgcHVibGljIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gUHJlcGFyZSB0aGlzIHJlc3BvbnNlCisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7CisgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworCisgICAgICAgIC8vIEZvcndhcmQgdG8gdGhlIGZpcnN0IHNlcnZsZXQKKyAgICAgICAgUmVxdWVzdERpc3BhdGNoZXIgcmQgPQorICAgICAgICAgICAgZ2V0U2VydmxldENvbnRleHQoKS5nZXRSZXF1ZXN0RGlzcGF0Y2hlcigiL3NlcnZsZXQvRm9yd2FyZDA3YSIpOworICAgICAgICBpZiAocmQgPT0gbnVsbCkgeworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIkZvcndhcmQwNyBGQUlMRUQgLSBObyByZXF1ZXN0IGRpc3BhdGNoZXIiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZm9yIC9zZXJ2bGV0L0ZvcndhcmQwN2EiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJkLmZvcndhcmQocmVxdWVzdCwgcmVzcG9uc2UpOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIkZvcndhcmQwNyB0ZXh0IHNob3VsZCBOT1QgYmUgcHJlc2VudCIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gU3RhdGljIGxvZ2dlciBvdXRwdXQgKHNob3VsZCBub3QgYWN0dWFsbHkgYmUgcmVuZGVyZWQpCisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IFN0YXRpY0xvZ2dlci5yZWFkKCk7CisgICAgICAgICAgICBpZiAobWVzc2FnZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4obWVzc2FnZSk7CisgICAgICAgIH0KKyAgICAgICAgU3RhdGljTG9nZ2VyLnJlc2V0KCk7CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9Gb3J3YXJkMDdhLmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvRm9yd2FyZDA3YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyMDY5ODAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvRm9yd2FyZDA3YS5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwgMjAwMCwgMjAwMSAsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50ZXN0ZXI7CisKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lio7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7CisKKy8qKgorICogVGVzdGluZyBmb3IgZG91YmxlIGZvcndhcmRpbmcuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBGb3J3YXJkMDdhIGV4dGVuZHMgSHR0cFNlcnZsZXQgeworCisgICAgcHVibGljIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gUHJlcGFyZSB0aGlzIHJlc3BvbnNlCisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7CisgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworCisgICAgICAgIC8vIEZvcndhcmQgdG8gdGhlIHNlY29uZCBzZXJ2bGV0CisgICAgICAgIFJlcXVlc3REaXNwYXRjaGVyIHJkID0KKyAgICAgICAgICAgIGdldFNlcnZsZXRDb250ZXh0KCkuZ2V0UmVxdWVzdERpc3BhdGNoZXIoIi9Gb3J3YXJkMDdiIik7CisgICAgICAgIGlmIChyZCA9PSBudWxsKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiRm9yd2FyZDA3YSBGQUlMRUQgLSBObyByZXF1ZXN0IGRpc3BhdGNoZXIiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZm9yIC9Gb3J3YXJkMDdiIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZC5mb3J3YXJkKHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJGb3J3YXJkMDdhIHRleHQgc2hvdWxkIE5PVCBiZSBwcmVzZW50Iik7CisgICAgICAgIH0KKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0ZvcndhcmQwN2IuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9Gb3J3YXJkMDdiLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRhZmExYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9Gb3J3YXJkMDdiLmphdmEKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwLCAyMDAxICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworLyoqCisgKiBUZXN0aW5nIGZvciBkb3VibGUgZm9yd2FyZGluZy4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEZvcndhcmQwN2IgZXh0ZW5kcyBIdHRwU2VydmxldCB7CisKKyAgICBwdWJsaWMgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICAvLyBQcmVwYXJlIHRoaXMgcmVzcG9uc2UKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvcGxhaW4iKTsKKyAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisgICAgICAgIHdyaXRlci5wcmludGxuKCJGb3J3YXJkMDdiIFBBU1NFRCIpOworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvRm9yd2FyZDA4LmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvRm9yd2FyZDA4LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZmZDk0NQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9Gb3J3YXJkMDguamF2YQpAQCAtMCwwICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAsIDIwMDEgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisvKioKKyAqIFRlc3RpbmcgZm9yIGRvdWJsZSBmb3J3YXJkaW5nLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgRm9yd2FyZDA4IGV4dGVuZHMgSHR0cFNlcnZsZXQgeworCisgICAgcHVibGljIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gUHJlcGFyZSB0aGlzIHJlc3BvbnNlCisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7CisgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworCisgICAgICAgIC8vIEZvcndhcmQgdG8gdGhlIGZpcnN0IHNlcnZsZXQKKyAgICAgICAgbG9nKCJHZXR0aW5nIFJEIGZvciAvRm9yd2FyZDA4YSIpOworICAgICAgICBSZXF1ZXN0RGlzcGF0Y2hlciByZCA9CisgICAgICAgICAgICBnZXRTZXJ2bGV0Q29udGV4dCgpLmdldFJlcXVlc3REaXNwYXRjaGVyKCIvRm9yd2FyZDA4YSIpOworICAgICAgICBpZiAocmQgPT0gbnVsbCkgeworICAgICAgICAgICAgbG9nKCJNaXNzaW5nIFJEIGZvciAvRm9yd2FyZDA4YSIpOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIkZvcndhcmQwOCBGQUlMRUQgLSBObyByZXF1ZXN0IGRpc3BhdGNoZXIiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZm9yIC9Gb3J3YXJkMDhhIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsb2coIkZvcndhcmRpbmcgdG8gL0ZvcndhcmQwOGEiKTsKKyAgICAgICAgICAgIHJkLmZvcndhcmQocmVxdWVzdCwgcmVzcG9uc2UpOworICAgICAgICAgICAgbG9nKCJSZXR1cm5lZCBmcm9tIC9Gb3J3YXJkMDhhIik7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiRm9yd2FyZDA4IHRleHQgc2hvdWxkIE5PVCBiZSBwcmVzZW50Iik7CisgICAgICAgIH0KKworICAgICAgICAvLyBTdGF0aWMgbG9nZ2VyIG91dHB1dCAoc2hvdWxkIG5vdCBhY3R1YWxseSBiZSByZW5kZXJlZCkKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gU3RhdGljTG9nZ2VyLnJlYWQoKTsKKyAgICAgICAgICAgIGlmIChtZXNzYWdlID09IG51bGwpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihtZXNzYWdlKTsKKyAgICAgICAgfQorICAgICAgICBTdGF0aWNMb2dnZXIucmVzZXQoKTsKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0ZvcndhcmQwOGEuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9Gb3J3YXJkMDhhLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU2Nzc1MQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9Gb3J3YXJkMDhhLmphdmEKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwLCAyMDAxICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworLyoqCisgKiBUZXN0aW5nIGZvciBkb3VibGUgZm9yd2FyZGluZy4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEZvcndhcmQwOGEgZXh0ZW5kcyBIdHRwU2VydmxldCB7CisKKyAgICBwdWJsaWMgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICAvLyBQcmVwYXJlIHRoaXMgcmVzcG9uc2UKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvcGxhaW4iKTsKKyAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisKKyAgICAgICAgLy8gRm9yd2FyZCB0byB0aGUgc2Vjb25kIHNlcnZsZXQKKyAgICAgICAgbG9nKCJHZXR0aW5nIFJEIGZvciAvc2VydmxldC9Gb3J3YXJkMDhiIik7CisgICAgICAgIFJlcXVlc3REaXNwYXRjaGVyIHJkID0KKyAgICAgICAgICAgIGdldFNlcnZsZXRDb250ZXh0KCkuZ2V0UmVxdWVzdERpc3BhdGNoZXIoIi9zZXJ2bGV0L0ZvcndhcmQwOGIiKTsKKyAgICAgICAgaWYgKHJkID09IG51bGwpIHsKKyAgICAgICAgICAgIGxvZygiTWlzc2luZyBSRCBmb3IgL3NlcnZsZXQvRm9yd2FyZDA4YiIpOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIkZvcndhcmQwOGEgRkFJTEVEIC0gTm8gcmVxdWVzdCBkaXNwYXRjaGVyIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGZvciAvc2VydmxldC9Gb3J3YXJkMDhiIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsb2coIkZvcndhcmRpbmcgdG8gL3NlcnZsZXQvRm9yd2FyZDA4YiIpOworICAgICAgICAgICAgcmQuZm9yd2FyZChyZXF1ZXN0LCByZXNwb25zZSk7CisgICAgICAgICAgICBsb2coIlJldHVybmVkIGZyb20gL3NlcnZsZXQvRm9yd2FyZDA4YiIpOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIkZvcndhcmQwOGEgdGV4dCBzaG91bGQgTk9UIGJlIHByZXNlbnQiKTsKKyAgICAgICAgfQorCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvRm9yd2FyZDA4Yi5qYXZhIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0ZvcndhcmQwOGIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWMzNjRjCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0ZvcndhcmQwOGIuamF2YQpAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAsIDIwMDEgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisvKioKKyAqIFRlc3RpbmcgZm9yIGRvdWJsZSBmb3J3YXJkaW5nLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgRm9yd2FyZDA4YiBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIFByZXBhcmUgdGhpcyByZXNwb25zZQorICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9wbGFpbiIpOworICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSByZXNwb25zZS5nZXRXcml0ZXIoKTsKKyAgICAgICAgd3JpdGVyLnByaW50bG4oIkZvcndhcmQwOGIgUEFTU0VEIik7CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9Gb3J3YXJkMDkuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9Gb3J3YXJkMDkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzdlYzI1Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0ZvcndhcmQwOS5qYXZhCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwgMjAwMCwgMjAwMSAsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50ZXN0ZXI7CisKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lio7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7CisKKy8qKgorICogRXhlcmNpc2UgYmFzaWMgZm9yd2FyZGluZyBmdW5jdGlvbmFsaXR5IHVzaW5nCisgKiA8Y29kZT5yZXF1ZXN0LmdldFJlcXVlc3REaXNwYXRjaGVyKCk8L2NvZGU+LgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgRm9yd2FyZDA5IGV4dGVuZHMgSHR0cFNlcnZsZXQgeworCisKKyAgICBwdWJsaWMgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICAvLyBQcmVwYXJlIHRoaXMgcmVzcG9uc2UKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9wbGFpbiIpOworCVByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworCisgICAgICAgIC8vIEFjcXVpcmUgdGhlIHBhdGggdG8gd2hpY2ggd2Ugd2lsbCBpc3N1ZSBhIGZvcndhcmQKKyAgICAgICAgU3RyaW5nIHBhdGggPSByZXF1ZXN0LmdldFBhcmFtZXRlcigicGF0aCIpOworICAgICAgICBpZiAocGF0aCA9PSBudWxsKQorICAgICAgICAgICAgcGF0aCA9ICIvRm9yd2FyZDAwYSI7CisKKyAgICAgICAgLy8gQ3JlYXRlIGEgcmVxdWVzdCBkaXNwYXRjaGVyIGFuZCBjYWxsIGZvcndhcmQoKSBvbiBpdAorICAgICAgICBSZXF1ZXN0RGlzcGF0Y2hlciByZCA9IHJlcXVlc3QuZ2V0UmVxdWVzdERpc3BhdGNoZXIocGF0aCk7CisgICAgICAgIGlmIChyZCA9PSBudWxsKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiBObyBSZXF1ZXN0RGlzcGF0Y2hlciByZXR1cm5lZC8iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChzYi5sZW5ndGgoKSA8IDEpCisgICAgICAgICAgICAgICAgcmQuZm9yd2FyZChyZXF1ZXN0LCByZXNwb25zZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBXcml0ZSBvdXIgcmVzcG9uc2UgaWYgYW4gZXJyb3Igb2NjdXJyZWQKKyAgICAgICAgaWYgKHNiLmxlbmd0aCgpID49IDEpIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiRm9yd2FyZDA5IEZBSUxFRCAtIik7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihzYi50b1N0cmluZygpKTsKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBTdGF0aWNMb2dnZXIucmVhZCgpOworICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKG1lc3NhZ2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFN0YXRpY0xvZ2dlci5yZXNldCgpOworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvR2V0SGVhZGVyczAxLmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvR2V0SGVhZGVyczAxLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRlMGY1OQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9HZXRIZWFkZXJzMDEuamF2YQpAQCAtMCwwICsxLDg0IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisvKioKKyAqIFRlc3QgcmV0cmlldmFsIG9mIGhlYWRlcnMuICBUaGUgY2xpZW50IGlzIGV4cGVjdGVkIHRvIHNlbmQgdHdvCisgKiAiQWNjZXB0LUxhbmd1YWdlIiBoZWFkZXJzLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgR2V0SGVhZGVyczAxIGV4dGVuZHMgSHR0cFNlcnZsZXQgeworCisgICAgcHVibGljIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvcGxhaW4iKTsKKyAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisgICAgICAgIEFycmF5TGlzdCB2YWx1ZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIEVudW1lcmF0aW9uIGhlYWRlcnMgPSByZXF1ZXN0LmdldEhlYWRlcnMoIkFjY2VwdC1MYW5ndWFnZSIpOworICAgICAgICB3aGlsZSAoaGVhZGVycy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgU3RyaW5nIGhlYWRlciA9IChTdHJpbmcpIGhlYWRlcnMubmV4dEVsZW1lbnQoKSArICIsIjsKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgICAgaW50IGNvbW1hID0gaGVhZGVyLmluZGV4T2YoIiwiKTsKKyAgICAgICAgICAgICAgICBpZiAoY29tbWEgPCAwKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBoZWFkZXIuc3Vic3RyaW5nKDAsIGNvbW1hKS50cmltKCk7CisgICAgICAgICAgICAgICAgdmFsdWVzLmFkZCh2YWx1ZSk7CisgICAgICAgICAgICAgICAgaGVhZGVyID0gaGVhZGVyLnN1YnN0cmluZyhjb21tYSArIDEpLnRyaW0oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAodmFsdWVzLnNpemUoKSAhPSAyKQorICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIkdldEhlYWRlcnMwMSBGQUlMRUQgLSBSZXR1cm5lZCAiICsgdmFsdWVzLnNpemUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGhlYWRlcnMgaW5zdGVhZCBvZiAyIik7CisgICAgICAgIGVsc2UgaWYgKHZhbHVlcy5nZXQoMCkgPT0gdmFsdWVzLmdldCgxKSkKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJHZXRIZWFkZXJzMDEgRkFJTEVEIC0gUmV0dXJuZWQgaWRlbnRpY2FsIHZhbHVlcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICArIHZhbHVlcy5nZXQoMCkpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGludCBuID0gMDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKCJlbi11cyIuZXF1YWxzKChTdHJpbmcpIHZhbHVlcy5nZXQoaSkpKQorICAgICAgICAgICAgICAgICAgICBuKys7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoImVuLWdiIi5lcXVhbHMoKFN0cmluZykgdmFsdWVzLmdldChpKSkpCisgICAgICAgICAgICAgICAgICAgIG4rKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChuICE9IDIpCisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIkdldEhlYWRlcnMwMSBGQUlMRUQgLSBSZXR1cm5lZCB1bmtub3duIHZhbHVlcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB2YWx1ZXMuZ2V0KDApICsgIiBhbmQgIiArIHZhbHVlcy5nZXQoMSkpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJHZXRIZWFkZXJzMDEgUEFTU0VEIik7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gU3RhdGljTG9nZ2VyLnJlYWQoKTsKKyAgICAgICAgICAgIGlmIChtZXNzYWdlID09IG51bGwpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihtZXNzYWdlKTsKKyAgICAgICAgfQorICAgICAgICBTdGF0aWNMb2dnZXIucmVzZXQoKTsKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0dldElucHV0U3RyZWFtMDEuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9HZXRJbnB1dFN0cmVhbTAxLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRlYzIwNAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9HZXRJbnB1dFN0cmVhbTAxLmphdmEKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworLyoqCisgKiBUZXN0IGdldHRpbmcgdGhlIHNlcnZsZXQgaW5wdXQgc3RyZWFtIGFmdGVyIHdlIGhhdmUgcmV0cmlldmVkIHRoZSByZWFkZXIuCisgKiBUaGlzIHNob3VsZCB0aHJvdyBhbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24uCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBHZXRJbnB1dFN0cmVhbTAxIGV4dGVuZHMgR2VuZXJpY1NlcnZsZXQgeworCisgICAgcHVibGljIHZvaWQgc2VydmljZShTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvcGxhaW4iKTsKKyAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IHJlcXVlc3QuZ2V0UmVhZGVyKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTZXJ2bGV0SW5wdXRTdHJlYW0gc2lzID0gcmVxdWVzdC5nZXRJbnB1dFN0cmVhbSgpOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIkdldElucHV0U3RyZWFtMDEgRkFJTEVEIC0gRGlkIG5vdCB0aHJvdyAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbGxlZ2FsU3RhdGVFeGNlcHRpb24iKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJHZXRJbnB1dFN0cmVhbTAxIFBBU1NFRCIpOworICAgICAgICB9CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IFN0YXRpY0xvZ2dlci5yZWFkKCk7CisgICAgICAgICAgICBpZiAobWVzc2FnZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4obWVzc2FnZSk7CisgICAgICAgIH0KKyAgICAgICAgU3RhdGljTG9nZ2VyLnJlc2V0KCk7CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9HZXRMb2NhbGVzMDEuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9HZXRMb2NhbGVzMDEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzQ2NGJkCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0dldExvY2FsZXMwMS5qYXZhCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwgMjAwMCwgMjAwMSAsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50ZXN0ZXI7CisKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lio7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7CisKKy8qKgorICogUGFydCAxIG9mIHRoZSByZXF1ZXN0IGxvY2FsZSB0ZXN0cy4gIFNob3VsZCByZWNlaXZlIGEgTG9jYWxlIHRoYXQKKyAqIGNvcnJlc3BvbmRzIHRvICJlbl9DQSIgQWNjZXB0LUxhbmd1YWdlIGhlYWRlciB0aGF0IGlzIHNlbnQgZmlyc3QuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBHZXRMb2NhbGVzMDEgZXh0ZW5kcyBIdHRwU2VydmxldCB7CisKKworICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIHJlc3BvbnNlLnJlc2V0KCk7CisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7CisgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworCisgICAgICAgIExvY2FsZSBleHBlY3RlZCA9IG5ldyBMb2NhbGUoImVuIiwgIkNBIik7CisgICAgICAgIExvY2FsZSByZWNlaXZlZCA9IHJlcXVlc3QuZ2V0TG9jYWxlKCk7CisgICAgICAgIGlmIChyZWNlaXZlZCA9PSBudWxsKQorICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIkdldExvY2FsZXMwMSBGQUlMRUQgLSBObyBsb2NhbGUgd2FzIHJlY2VpdmVkIik7CisgICAgICAgIGVsc2UgaWYgKCFleHBlY3RlZC5lcXVhbHMocmVjZWl2ZWQpKQorICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIkdldExvY2FsZXMwMSBGQUlMRUQgLSBFeHBlY3RlZD0nIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZC50b1N0cmluZygpICsgIicgUmVjZWl2ZWQ9JyIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZWQudG9TdHJpbmcoKSArICInIik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJHZXRMb2NhbGVzMDEgUEFTU0VEIik7CisKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gU3RhdGljTG9nZ2VyLnJlYWQoKTsKKyAgICAgICAgICAgIGlmIChtZXNzYWdlID09IG51bGwpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihtZXNzYWdlKTsKKyAgICAgICAgfQorICAgICAgICBTdGF0aWNMb2dnZXIucmVzZXQoKTsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvR2V0TG9jYWxlczAyLmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvR2V0TG9jYWxlczAyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU5YjgxOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9HZXRMb2NhbGVzMDIuamF2YQpAQCAtMCwwICsxLDEwOCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwLCAyMDAxICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworLyoqCisgKiBQYXJ0IDIgb2YgdGhlIHJlcXVlc3QgbG9jYWxlIHRlc3RzLiAgU2hvdWxkIHJlY2VpdmUgYSBMb2NhbGUgdGhhdAorICogY29ycmVzcG9uZHMgdG8gImVuX0NBIiBhbmQgdGhlbiAiZW5fR0IiIGFzIHNlbnQgYnkgdGhlIGNsaWVudCBpbgorICogIkFjY2VwdC1MYW5ndWFnZSIgaGVhZGVycy4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEdldExvY2FsZXMwMiBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworCisgICAgcHVibGljIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgcmVzcG9uc2UucmVzZXQoKTsKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvcGxhaW4iKTsKKyAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgYm9vbGVhbiBvayA9IHRydWU7CisKKyAgICAgICAgRW51bWVyYXRpb24gbG9jYWxlcyA9IHJlcXVlc3QuZ2V0TG9jYWxlcygpOworICAgICAgICBpZiAobG9jYWxlcyA9PSBudWxsKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiBObyBsb2NhbGVzIHJldHVybmVkLyIpOworICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChvaykgeworICAgICAgICAgICAgaWYgKGxvY2FsZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICBMb2NhbGUgZXhwZWN0ZWQgPSBuZXcgTG9jYWxlKCJlbiIsICJDQSIpOworICAgICAgICAgICAgICAgIExvY2FsZSByZWNlaXZlZCA9IChMb2NhbGUpIGxvY2FsZXMubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICBpZiAoIWV4cGVjdGVkLmVxdWFscyhyZWNlaXZlZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgRXhwZWN0ZWQxPSciICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLnRvU3RyaW5nKCkgKyAiJyBSZWNlaXZlZDE9JyIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZWQudG9TdHJpbmcoKSArICInIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiBaZXJvIGxvY2FsZXMgcmV0dXJuZWQvIik7CisgICAgICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChvaykgeworICAgICAgICAgICAgaWYgKGxvY2FsZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICBMb2NhbGUgZXhwZWN0ZWQgPSBuZXcgTG9jYWxlKCJlbiIsICJHQiIpOworICAgICAgICAgICAgICAgIExvY2FsZSByZWNlaXZlZCA9IChMb2NhbGUpIGxvY2FsZXMubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICBpZiAoIWV4cGVjdGVkLmVxdWFscyhyZWNlaXZlZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgRXhwZWN0ZWQyPSciICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLnRvU3RyaW5nKCkgKyAiJyBSZWNlaXZlZDI9JyIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZWQudG9TdHJpbmcoKSArICInIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiBPbmUgbG9jYWxlIHJldHVybmVkLyIpOworICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAob2spIHsKKyAgICAgICAgICAgIGlmIChsb2NhbGVzLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgTW9yZSB0aGFuIHR3byBsb2NhbGVzIHJldHVybmVkLyIpOworICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAob2sgJiYgKHNiLmxlbmd0aCgpIDwgMSkpIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJHZXRMb2NhbGVzMDIgUEFTU0VEIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoIkdldExvY2FsZXMwMiBGQUlMRUQgLSIpOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oc2IudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKworCisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IFN0YXRpY0xvZ2dlci5yZWFkKCk7CisgICAgICAgICAgICBpZiAobWVzc2FnZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4obWVzc2FnZSk7CisgICAgICAgIH0KKyAgICAgICAgU3RhdGljTG9nZ2VyLnJlc2V0KCk7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0dldFBhcmFtZXRlcjAxLmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvR2V0UGFyYW1ldGVyMDEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2NhYjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0dldFBhcmFtZXRlcjAxLmphdmEKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworLyoqCisgKiBUZXN0IHJldHJpZXZhbCBvZiBwYXJhbWV0ZXJzLiAgVGhlIGNsaWVudCBpcyBleHBlY3RlZCB0byBzZW5kIGEgcmVxdWVzdAorICogVVJJIGxpa2UgIi90ZXN0ZXIvR2V0UGFyYW1ldGVyMDE/Zm9vPTEiLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgR2V0UGFyYW1ldGVyMDEgZXh0ZW5kcyBHZW5lcmljU2VydmxldCB7CisKKyAgICBwdWJsaWMgdm9pZCBzZXJ2aWNlKFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9wbGFpbiIpOworICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSByZXNwb25zZS5nZXRXcml0ZXIoKTsKKyAgICAgICAgU3RyaW5nIGV4cGVjdGVkID0gIjEiOworICAgICAgICBTdHJpbmcgcmVzdWx0ID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoImZvbyIpOworICAgICAgICBpZiAoZXhwZWN0ZWQuZXF1YWxzKHJlc3VsdCkpIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJHZXRQYXJhbWV0ZXIwMSBQQVNTRUQiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJHZXRQYXJhbWV0ZXIwMSBGQUlMRUQgLSBSZWNlaXZlZCAnIiArIHJlc3VsdCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJyBpbnN0ZWFkIG9mICciICsgZXhwZWN0ZWQgKyAiJyIpOworICAgICAgICB9CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IFN0YXRpY0xvZ2dlci5yZWFkKCk7CisgICAgICAgICAgICBpZiAobWVzc2FnZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4obWVzc2FnZSk7CisgICAgICAgIH0KKyAgICAgICAgU3RhdGljTG9nZ2VyLnJlc2V0KCk7CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9HZXRQYXJhbWV0ZXJNYXAwMC5qYXZhIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0dldFBhcmFtZXRlck1hcDAwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI5ZWU0MQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9HZXRQYXJhbWV0ZXJNYXAwMC5qYXZhCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwgMjAwMCAsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50ZXN0ZXI7CisKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworLyoqCisgKiBUZXN0IGdldHRpbmcgdGhlIHNlcnZsZXQgaW5wdXQgc3RyZWFtIGFmdGVyIHdlIGhhdmUgcmV0cmlldmVkIHRoZSByZWFkZXIuCisgKiBUaGlzIHNob3VsZCB0aHJvdyBhbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24uCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBHZXRQYXJhbWV0ZXJNYXAwMCBleHRlbmRzIEdlbmVyaWNTZXJ2bGV0IHsKKworICAgIHB1YmxpYyB2b2lkIHNlcnZpY2UoU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7CisgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworICAgICAgICBTdHJpbmcgZXJyb3JzID0gIiI7CisgICAgICAgIE1hcCBtYXAgPSByZXF1ZXN0LmdldFBhcmFtZXRlck1hcCgpOworICAgICAgICBpZiAobWFwID09IG51bGwpCisgICAgICAgICAgICBlcnJvcnMgKz0gIiAgZ2V0UGFyYW1ldGVyTWFwKCkgcmV0dXJuZWQgbnVsbC4iOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmIChtYXAuc2l6ZSgpICE9IDIpCisgICAgICAgICAgICAgICAgZXJyb3JzICs9ICIgIG1hcCBzaXplIGlzICIgKyBtYXAuc2l6ZSgpICsgIi4iOworICAgICAgICAgICAgU3RyaW5nIHZhbHVlMVtdID0gKFN0cmluZ1tdKSBtYXAuZ2V0KCJCZXN0TGFuZ3VhZ2UiKTsKKyAgICAgICAgICAgIGlmICh2YWx1ZTEgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBlcnJvcnMgKz0gIiAgQmVzdExhbmd1YWdlIGlzIE5VTEwuIjsKKyAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlMS5sZW5ndGggIT0gMSkKKyAgICAgICAgICAgICAgICBlcnJvcnMgKz0gIiAgQmVzdExhbmd1YWdlIGhhcyAiICsgdmFsdWUxLmxlbmd0aCArICIgdmFsdWVzLiI7CisgICAgICAgICAgICBlbHNlIGlmICghdmFsdWUxWzBdLmVxdWFscygiSmF2YSIpKQorICAgICAgICAgICAgICAgIGVycm9ycyArPSAiICBCZXN0TGFuZ3VhZ2UgaXMgIiArIHZhbHVlMSArICIuIjsKKyAgICAgICAgICAgIFN0cmluZyB2YWx1ZTJbXSA9IChTdHJpbmdbXSkgbWFwLmdldCgiQmVzdEpTUCIpOworICAgICAgICAgICAgaWYgKHZhbHVlMiA9PSBudWxsKQorICAgICAgICAgICAgICAgIGVycm9ycyArPSAiICBCZXN0SlNQIGlzIE5VTEwuIjsKKyAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlMi5sZW5ndGggIT0gMSkKKyAgICAgICAgICAgICAgICBlcnJvcnMgKz0gIiAgQmVzdEpTUCBoYXMgIiArIHZhbHVlMi5sZW5ndGggKyAiIHZhbHVlcy4iOworICAgICAgICAgICAgZWxzZSBpZiAoIXZhbHVlMlswXS5lcXVhbHMoIkphdmEyIikpCisgICAgICAgICAgICAgICAgZXJyb3JzICs9ICIgIEJlc3RKU1AgaXMgIiArIHZhbHVlMiArICIuIjsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbWFwLnB1dCgiQUJDIiwgIlhZWiIpOworICAgICAgICAgICAgICAgIGVycm9ycyArPSAiICAgbWFwLnB1dCgpIHdhcyBhbGxvd2VkLiI7CisgICAgICAgICAgICAgICAgaWYgKG1hcC5nZXQoIkFCQyIpICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGVycm9ycyArPSAiICBtYXAgaXMgbm90IGltbXV0YWJsZS4iOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoZXJyb3JzLmVxdWFscygiIikpCisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiR2V0UGFyYW1ldGVyTWFwMDAgUEFTU0VEIik7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIkdldFBhcmFtZXRlck1hcDAwIEZBSUxFRDoiICsgZXJyb3JzKTsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBTdGF0aWNMb2dnZXIucmVhZCgpOworICAgICAgICAgICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKG1lc3NhZ2UpOworICAgICAgICB9CisgICAgICAgIFN0YXRpY0xvZ2dlci5yZXNldCgpOworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvR2V0UXVlcnlTdHJpbmcwMS5qYXZhIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0dldFF1ZXJ5U3RyaW5nMDEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzYyMDk5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0dldFF1ZXJ5U3RyaW5nMDEuamF2YQpAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisvKioKKyAqIFRlc3QgcmV0cmlldmFsIG9mIHF1ZXJ5IHN0cmluZy4gIFRoZSBjbGllbnQgaXMgZXhwZWN0ZWQgdG8gc2VuZCBhIHJlcXVlc3QKKyAqIFVSSSBsaWtlICIvdGVzdGVyL0dldFF1ZXJ5U3RyaW5nMDE/Zm9vPTEiLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgR2V0UXVlcnlTdHJpbmcwMSBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7CisgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworICAgICAgICBTdHJpbmcgZXhwZWN0ZWQgPSAiZm9vPTEiOworICAgICAgICBTdHJpbmcgcmVzdWx0ID0gcmVxdWVzdC5nZXRRdWVyeVN0cmluZygpOworICAgICAgICBpZiAoZXhwZWN0ZWQuZXF1YWxzKHJlc3VsdCkpIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJHZXRRdWVyeVN0cmluZzAxIFBBU1NFRCIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIkdldFF1ZXJ5U3RyaW5nMDEgRkFJTEVEIC0gUmVjZWl2ZWQgJyIgKyByZXN1bHQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIicgaW5zdGVhZCBvZiAnIiArIGV4cGVjdGVkICsgIiciKTsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBTdGF0aWNMb2dnZXIucmVhZCgpOworICAgICAgICAgICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKG1lc3NhZ2UpOworICAgICAgICB9CisgICAgICAgIFN0YXRpY0xvZ2dlci5yZXNldCgpOworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvR29sZGVuMDEuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9Hb2xkZW4wMS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzNmU5ODYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvR29sZGVuMDEuamF2YQpAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAsIDIwMDEgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisvKioKKyAqIFNpbXBsZSB0ZXN0IGZvciB0aGUgZ29sZGVuIGZpbGUgbWVjaGFuaXNtLiAgVGhpcyB0ZXN0IGdlbmVyYXRlcyBhIHJlc3BvbnNlCisgKiB3aXRoIGtub3duIGNvbnRlbnRzIGZvciBjb21wYXJpc29uIHRvIHRoZSBnb2xkZW4gZmlsZS4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEdvbGRlbjAxIGV4dGVuZHMgSHR0cFNlcnZsZXQgeworCisKKyAgICBwdWJsaWMgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9wbGFpbiIpOworICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSByZXNwb25zZS5nZXRXcml0ZXIoKTsKKworICAgICAgICB3cml0ZXIucHJpbnRsbigiVGhpcyBpcyB0aGUiKTsKKyAgICAgICAgd3JpdGVyLnByaW50bG4oImZpcnN0IGdvbGRlbiBmaWxlIik7CisgICAgICAgIHdyaXRlci5wcmludGxuKCJ0byBiZSB0ZXN0ZWQuIik7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0luY2x1ZGUwMC5qYXZhIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0luY2x1ZGUwMC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjYWJjMjAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvSW5jbHVkZTAwLmphdmEKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwLCAyMDAxICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworLyoqCisgKiBFeGVyY2lzZSBiYXNpYyBpbmNsdWRpbmcgZnVuY3Rpb25hbGl0eS4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEluY2x1ZGUwMCBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworCisgICAgcHVibGljIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gUHJlcGFyZSB0aGlzIHJlc3BvbnNlCisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvcGxhaW4iKTsKKwlQcmludFdyaXRlciB3cml0ZXIgPSByZXNwb25zZS5nZXRXcml0ZXIoKTsKKworICAgICAgICAvLyBBY3F1aXJlIHRoZSBwYXRoIHRvIHdoaWNoIHdlIHdpbGwgaXNzdWUgYSBpbmNsdWRlCisgICAgICAgIFN0cmluZyBwYXRoID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoInBhdGgiKTsKKyAgICAgICAgaWYgKHBhdGggPT0gbnVsbCkKKyAgICAgICAgICAgIHBhdGggPSAiL0luY2x1ZGUwMGEiOworCisgICAgICAgIC8vIEFjcXVpcmUgdGhlIGZsdXNoIGZsYWcKKyAgICAgICAgYm9vbGVhbiBmbHVzaCA9ICJ0cnVlIi5lcXVhbHMocmVxdWVzdC5nZXRQYXJhbWV0ZXIoImZsdXNoIikpOworCisgICAgICAgIC8vIEFjcXVpcmUgdGhlICJjcmVhdGUgYSBzZXNzaW9uIiBmbGFnCisgICAgICAgIGJvb2xlYW4gY3JlYXRlID0gInRydWUiLmVxdWFscyhyZXF1ZXN0LmdldFBhcmFtZXRlcigiY3JlYXRlIikpOworCisgICAgICAgIC8vIENyZWF0ZSBhIHJlcXVlc3QgZGlzcGF0Y2hlciBhbmQgY2FsbCBpbmNsdWRlKCkgb24gaXQKKyAgICAgICAgUmVxdWVzdERpc3BhdGNoZXIgcmQgPSBudWxsOworICAgICAgICBpZiAocGF0aC5zdGFydHNXaXRoKCIhIikpCisgICAgICAgICAgICByZCA9IGdldFNlcnZsZXRDb250ZXh0KCkuZ2V0TmFtZWREaXNwYXRjaGVyKHBhdGguc3Vic3RyaW5nKDEpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmQgPSBnZXRTZXJ2bGV0Q29udGV4dCgpLmdldFJlcXVlc3REaXNwYXRjaGVyKHBhdGgpOworICAgICAgICBpZiAocmQgPT0gbnVsbCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIgTm8gUmVxdWVzdERpc3BhdGNoZXIgcmV0dXJuZWQvIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBIdHRwU2Vzc2lvbiBzZXNzaW9uOworICAgICAgICAgICAgaWYgKGNyZWF0ZSkgeworICAgICAgICAgICAgICAgIHNlc3Npb24gPSByZXF1ZXN0LmdldFNlc3Npb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChmbHVzaCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmZsdXNoQnVmZmVyKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiBGbHVzaCB0aHJldyBJT0V4Y2VwdGlvbi8iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2IubGVuZ3RoKCkgPCAxKQorICAgICAgICAgICAgICAgIHJkLmluY2x1ZGUocmVxdWVzdCwgcmVzcG9uc2UpOworICAgICAgICB9CisKKyAgICAgICAgLy8gV3JpdGUgb3VyIHJlc3BvbnNlIGlmIGFuIGVycm9yIG9jY3VycmVkCisgICAgICAgIGlmIChzYi5sZW5ndGgoKSA+PSAxKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoIkluY2x1ZGUwMCBGQUlMRUQgLSIpOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oc2IudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gU3RhdGljTG9nZ2VyLnJlYWQoKTsKKyAgICAgICAgICAgICAgICBpZiAobWVzc2FnZSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihtZXNzYWdlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBTdGF0aWNMb2dnZXIucmVzZXQoKTsKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0luY2x1ZGUwMGEuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9JbmNsdWRlMDBhLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVkYjcyMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9JbmNsdWRlMDBhLmphdmEKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwLCAyMDAxICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworLyoqCisgKiBFeGVyY2lzZSBiYXNpYyBpbmNsdWRpbmcgZnVuY3Rpb25hbGl0eS4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEluY2x1ZGUwMGEgZXh0ZW5kcyBIdHRwU2VydmxldCB7CisKKworICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIFByZXBhcmUgdGhpcyByZXNwb25zZQorICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7CisJUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisKKyAgICAgICAgLy8gV3JpdGUgb3VyIHJlc3BvbnNlIGlmIGFuIGVycm9yIG9jY3VycmVkCisgICAgICAgIHdyaXRlci5wcmludCgiSW5jbHVkZTAwYSBQQVNTRUQiKTsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gU3RhdGljTG9nZ2VyLnJlYWQoKTsKKyAgICAgICAgICAgIGlmIChtZXNzYWdlID09IG51bGwpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihtZXNzYWdlKTsKKyAgICAgICAgfQorICAgICAgICBTdGF0aWNMb2dnZXIucmVzZXQoKTsKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0luY2x1ZGUwMGQuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9JbmNsdWRlMDBkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M1MGY0NwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9JbmNsdWRlMDBkLmphdmEKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwLCAyMDAxICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworLyoqCisgKiBFeGVyY2lzZSBiYXNpYyBpbmNsdWRpbmcgZnVuY3Rpb25hbGl0eS4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEluY2x1ZGUwMGQgZXh0ZW5kcyBIdHRwU2VydmxldCB7CisKKworICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIFByZXBhcmUgdGhpcyByZXNwb25zZQorICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7CisJUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisKKyAgICAgICAgLy8gV3JpdGUgb3VyIHJlc3BvbnNlIGlmIGFuIGVycm9yIG9jY3VycmVkCisgICAgICAgIHdyaXRlci5wcmludCgiSW5jbHVkZTAwZCBQQVNTRUQiKTsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gU3RhdGljTG9nZ2VyLnJlYWQoKTsKKyAgICAgICAgICAgIGlmIChtZXNzYWdlID09IG51bGwpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihtZXNzYWdlKTsKKyAgICAgICAgfQorICAgICAgICBTdGF0aWNMb2dnZXIucmVzZXQoKTsKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0luY2x1ZGUwMS5qYXZhIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0luY2x1ZGUwMS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmYjFkZTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvSW5jbHVkZTAxLmphdmEKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworLyoqCisgKiBQb3NpdGl2ZSB0ZXN0IGZvciBpbmNsdWRpbmcgYSBzdGF0aWMgcmVzb3VyY2UuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBJbmNsdWRlMDEgZXh0ZW5kcyBIdHRwU2VydmxldCB7CisKKyAgICBwdWJsaWMgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9wbGFpbiIpOworICAgICAgICBSZXF1ZXN0RGlzcGF0Y2hlciByZCA9CisgICAgICAgICAgICBnZXRTZXJ2bGV0Q29udGV4dCgpLmdldFJlcXVlc3REaXNwYXRjaGVyKCIvSW5jbHVkZTAxLnR4dCIpOworICAgICAgICBpZiAocmQgPT0gbnVsbCkgeworICAgICAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiSW5jbHVkZTAxIEZBSUxFRCAtIE5vIFJlcXVlc3REaXNwYXRjaGVyIHJldHVybmVkIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgcmQuaW5jbHVkZShyZXF1ZXN0LCByZXNwb25zZSk7CisgICAgICAgIFN0YXRpY0xvZ2dlci5yZXNldCgpOworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvSW5jbHVkZTAyLmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvSW5jbHVkZTAyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVkNGY3MwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9JbmNsdWRlMDIuamF2YQpAQCAtMCwwICsxLDEyOCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworLyoqCisgKiBQb3NpdGl2ZSB0ZXN0IGZvciBoYW5kbGluZyBleGNlcHRpb25zIHRocm93biBieSBhbiBpbmNsdWRlZCBzZXJ2bGV0LgorICogUmVxdWVzdCBwYXJhbWV0ZXIgPHN0cm9uZz5leGNlcHRpb248L3N0cm9uZz4gaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGUgdHlwZQorICogb2YgZXhjZXB0aW9uIHRoYXQgc2hvdWxkIGJlIHRocm93biwgd2hpY2ggbXVzdCBiZSBvbmUgb2YKKyAqIDxjb2RlPklPRXhjZXB0aW9uPC9jb2RlPiwgPGNvZGU+U2VydmxldEV4Y2VwdGlvbjwvY29kZT4sIG9yCisgKiA8Y29kZT5TZXJ2bGV0RXhjZXB0aW9uPC9jb2RlPi4gIEFjY29yZGluZyB0byB0aGUgc3BlYywgYW55IGV4Y2VwdGlvbnMgb2YKKyAqIHRoZXNlIHR5cGVzIHNob3VsZCBiZSBwcm9wb2dhdGVkIGJhY2sgdG8gdGhlIGNhbGxlciB1bmNoYW5nZWQuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBJbmNsdWRlMDIgZXh0ZW5kcyBIdHRwU2VydmxldCB7CisKKyAgICBwdWJsaWMgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICBib29sZWFuIG9rID0gdHJ1ZTsKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvcGxhaW4iKTsKKwlQcmludFdyaXRlciB3cml0ZXIgPSByZXNwb25zZS5nZXRXcml0ZXIoKTsKKyAgICAgICAgUmVxdWVzdERpc3BhdGNoZXIgcmQgPQorICAgICAgICAgICAgZ2V0U2VydmxldENvbnRleHQoKS5nZXRSZXF1ZXN0RGlzcGF0Y2hlcigiL0luY2x1ZGUwMmEiKTsKKyAgICAgICAgaWYgKHJkID09IG51bGwpIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJJbmNsdWRlMDIgRkFJTEVEIC0gTm8gUmVxdWVzdERpc3BhdGNoZXIgcmV0dXJuZWQiKTsKKwkgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgfQorCVN0cmluZyB0eXBlID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoImV4Y2VwdGlvbiIpOworCWlmIChvaykgeworCSAgICBpZiAodHlwZSA9PSBudWxsKSB7CisJICAgICAgICB3cml0ZXIucHJpbnRsbigiSW5jbHVkZTAyIEZBSUxFRCAtIE5vIGV4Y2VwdGlvbiB0eXBlIHNwZWNpZmllZCIpOworCQlvayA9IGZhbHNlOworCSAgICB9IGVsc2UgaWYgKCF0eXBlLmVxdWFscygiSU9FeGNlcHRpb24iKSAmJgorCQkgICAgICAgIXR5cGUuZXF1YWxzKCJTZXJ2bGV0RXhjZXB0aW9uIikgJiYKKwkJICAgICAgICF0eXBlLmVxdWFscygiTnVsbFBvaW50ZXJFeGNlcHRpb24iKSkgeworCSAgICAgICAgd3JpdGVyLnByaW50bG4oIkluY2x1ZGUwMiBGQUlMRUQgLSBJbnZhbGlkIGV4Y2VwdGlvbiB0eXBlICIgKworCQkJICAgICAgIHR5cGUgKyAiIHJlcXVlc3RlZCIpOworCQlvayA9IGZhbHNlOworCSAgICB9CisJfQorCisJSU9FeGNlcHRpb24gaW9FeGNlcHRpb24gPSBudWxsOworCVNlcnZsZXRFeGNlcHRpb24gc2VydmxldEV4Y2VwdGlvbiA9IG51bGw7CisJVGhyb3dhYmxlIHRocm93YWJsZSA9IG51bGw7CisJdHJ5IHsKKyAgICAgICAgICAgIGlmIChvaykKKyAgICAgICAgICAgICAgICByZC5pbmNsdWRlKHJlcXVlc3QsIHJlc3BvbnNlKTsKKwl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJICAgIGlvRXhjZXB0aW9uID0gZTsKKwl9IGNhdGNoIChTZXJ2bGV0RXhjZXB0aW9uIGUpIHsKKwkgICAgc2VydmxldEV4Y2VwdGlvbiA9IGU7CisJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKKwkgICAgdGhyb3dhYmxlID0gZTsKKwl9CisKKwlpZiAob2spIHsKKyAgICAgICAgICAgIGlmICh0eXBlLmVxdWFscygiSU9FeGNlcHRpb24iKSkgeworICAgICAgICAgICAgICAgIGlmIChpb0V4Y2VwdGlvbiA9PSBudWxsKSB7CisJCSAgICB3cml0ZXIucHJpbnRsbigiSW5jbHVkZTAyIEZBSUxFRCAtIE5vIElPRXhjZXB0aW9uIHRocm93biIpOworCQkgICAgb2sgPSBmYWxzZTsKKwkJfSBlbHNlIHsKKwkJICAgIFN0cmluZyBtZXNzYWdlID0gaW9FeGNlcHRpb24uZ2V0TWVzc2FnZSgpOworCQkgICAgaWYgKCEiSW5jbHVkZTAyIElPRXhjZXB0aW9uIi5lcXVhbHMobWVzc2FnZSkpIHsKKwkJICAgICAgICB3cml0ZXIucHJpbnRsbigiSW5jbHVkZTAyIEZBSUxFRCAtIElPRXhjZXB0aW9uIHdhcyAiICsKKwkJCQkgICAgICAgbWVzc2FnZSk7CisJCQlvayA9IGZhbHNlOworCQkgICAgfQorCQl9CisJICAgIH0gZWxzZSBpZiAodHlwZS5lcXVhbHMoIlNlcnZsZXRFeGNlcHRpb24iKSkgeworICAgICAgICAgICAgICAgIGlmIChzZXJ2bGV0RXhjZXB0aW9uID09IG51bGwpIHsKKwkJICAgIHdyaXRlci5wcmludGxuKCJJbmNsdWRlMDIgRkFJTEVEIC0gTm8gU2VydmxldEV4Y2VwdGlvbiB0aHJvd24iKTsKKwkJICAgIG9rID0gZmFsc2U7CisJCX0gZWxzZSB7CisJCSAgICBTdHJpbmcgbWVzc2FnZSA9IHNlcnZsZXRFeGNlcHRpb24uZ2V0TWVzc2FnZSgpOworCQkgICAgaWYgKCEiSW5jbHVkZTAyIFNlcnZsZXRFeGNlcHRpb24iLmVxdWFscyhtZXNzYWdlKSkgeworCQkgICAgICAgIHdyaXRlci5wcmludGxuKCJJbmNsdWRlMDIgRkFJTEVEIC0gU2VydmxldEV4Y2VwdGlvbiB3YXMgIiArCisJCQkJICAgICAgIG1lc3NhZ2UpOworCQkJb2sgPSBmYWxzZTsKKwkJICAgIH0KKwkJfQorCSAgICB9IGVsc2UgaWYgKHR5cGUuZXF1YWxzKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiIpKSB7CisgICAgICAgICAgICAgICAgaWYgKHRocm93YWJsZSA9PSBudWxsKSB7CisJCSAgICB3cml0ZXIucHJpbnRsbigiSW5jbHVkZTAyIEZBSUxFRCAtIE5vIE51bGxQb2ludGVyRXhjZXB0aW9uIHRocm93biIpOworCQkgICAgb2sgPSBmYWxzZTsKKwkJfSBlbHNlIGlmICghKHRocm93YWJsZSBpbnN0YW5jZW9mIE51bGxQb2ludGVyRXhjZXB0aW9uKSkgeworCQkgICAgd3JpdGVyLnByaW50bG4oIkluY2x1ZGUwMiBGQUlMRUQgLSBUaHJvd24gRXhjZXB0aW9uIHdhcyAiICsKKwkJCQkgICB0aHJvd2FibGUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworCQkgICAgb2sgPSBmYWxzZTsKKwkJfSBlbHNlIHsKKwkJICAgIFN0cmluZyBtZXNzYWdlID0gdGhyb3dhYmxlLmdldE1lc3NhZ2UoKTsKKwkJICAgIGlmICghIkluY2x1ZGUwMiBOdWxsUG9pbnRlckV4Y2VwdGlvbiIuZXF1YWxzKG1lc3NhZ2UpKSB7CisJCSAgICAgICAgd3JpdGVyLnByaW50bG4oIkluY2x1ZGUwMiBGQUlMRUQgLSBOdWxsUG9pbnRlckV4Y2VwdGlvbiB3YXMgIiArCisJCQkJICAgICAgIG1lc3NhZ2UpOworCQkJb2sgPSBmYWxzZTsKKwkJICAgIH0KKwkJfQorCSAgICB9CisJfQorCisJaWYgKG9rKQorCSAgICB3cml0ZXIucHJpbnRsbigiSW5jbHVkZTAyIFBBU1NFRCIpOworICAgICAgICBTdGF0aWNMb2dnZXIucmVzZXQoKTsKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0luY2x1ZGUwMmEuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9JbmNsdWRlMDJhLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQzNjI2NAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9JbmNsdWRlMDJhLmphdmEKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworLyoqCisgKiBJbmNsdWRlZCBzZXJ2bGV0IGZvciB0aGUgdGVzdCBwZXJmb3JtZWQgYnkgSW5jbHVkZTAyLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgSW5jbHVkZTAyYSBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIFN0cmluZyB0eXBlID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoImV4Y2VwdGlvbiIpOworCWlmICh0eXBlID09IG51bGwpCisJICAgIHJldHVybjsKKwllbHNlIGlmICh0eXBlLmVxdWFscygiSU9FeGNlcHRpb24iKSkKKwkgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJJbmNsdWRlMDIgSU9FeGNlcHRpb24iKTsKKwllbHNlIGlmICh0eXBlLmVxdWFscygiU2VydmxldEV4Y2VwdGlvbiIpKQorCSAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbigiSW5jbHVkZTAyIFNlcnZsZXRFeGNlcHRpb24iKTsKKwllbHNlIGlmICh0eXBlLmVxdWFscygiTnVsbFBvaW50ZXJFeGNlcHRpb24iKSkKKwkgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJJbmNsdWRlMDIgTnVsbFBvaW50ZXJFeGNlcHRpb24iKTsKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0luY2x1ZGUwMy5qYXZhIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0luY2x1ZGUwMy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyZjhhOTAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvSW5jbHVkZTAzLmphdmEKQEAgLTAsMCArMSwxMTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwgMjAwMCwgMjAwMSAsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50ZXN0ZXI7CisKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lio7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7CisKKy8qKgorICogVGVzdCB0byBpbnN1cmUgdGhhdCBhbiBpbmNsdWRlZCBzZXJ2bGV0IGNhbiBzZXQgcmVxdWVzdCBhdHRyaWJ1dGVzIHRoYXQgYXJlCisgKiB2aXNpYmxlIHRvIHRoZSBjYWxsaW5nIHNlcnZsZXQgYWZ0ZXIgdGhlIDxjb2RlPmluY2x1ZGUoKTwvY29kZT4gcmV0dXJucy4KKyAqIFRoZSBzcGVjIGlzIHNpbGVudCBvbiB0aGlzIHRvcGljLCBidXQgaXQgc2VlbXMgY29uc2lzdGVudCB3aXRoIHRoZSBvdmVyYWxsCisgKiBpbnRlbnQgdG8gYmVoYXZlIGluIHRoaXMgbWFubmVyLgorICoKKyAqIFRoZSB0ZXN0IGluY2x1ZGVzIGVpdGhlciBhIHNlcnZsZXQgKCIvSW5jbHVkZTAzYSIpIG9yIGEgSlNQIHBhZ2UKKyAqICgiL0luY2x1ZGUwM2IuanNwIikgZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBzcGVjaWZpZWQgZm9yIHRoZSAicGF0aCIKKyAqIHBhcmFtZXRlci4gIFRoZSBkZWZhdWx0IGlzIHRoZSBzZXJ2bGV0LgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgSW5jbHVkZTAzIGV4dGVuZHMgSHR0cFNlcnZsZXQgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHNwZWNpYWxzW10gPQorICAgIHsgImphdmF4LnNlcnZsZXQuaW5jbHVkZS5yZXF1ZXN0X3VyaSIsCisgICAgICAiamF2YXguc2VydmxldC5pbmNsdWRlLmNvbnRleHRfcGF0aCIsCisgICAgICAiamF2YXguc2VydmxldC5pbmNsdWRlLnNlcnZsZXRfcGF0aCIsCisgICAgICAiamF2YXguc2VydmxldC5pbmNsdWRlLnBhdGhfaW5mbyIsCisgICAgICAiamF2YXguc2VydmxldC5pbmNsdWRlLnF1ZXJ5X3N0cmluZyIgfTsKKworCisgICAgcHVibGljIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gUHJlcGFyZSB0aGlzIHJlc3BvbnNlCisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvcGxhaW4iKTsKKwlQcmludFdyaXRlciB3cml0ZXIgPSByZXNwb25zZS5nZXRXcml0ZXIoKTsKKworICAgICAgICAvLyBBY3F1aXJlIHRoZSBwYXRoIHRvIHdoaWNoIHdlIHdpbGwgaXNzdWUgYW4gaW5jbHVkZQorICAgICAgICBTdHJpbmcgcGF0aCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJwYXRoIik7CisgICAgICAgIGlmIChwYXRoID09IG51bGwpCisgICAgICAgICAgICBwYXRoID0gIi9JbmNsdWRlMDNhIjsKKworICAgICAgICAvLyBDcmVhdGUgYSByZXF1ZXN0IGRpc3BhdGNoZXIgYW5kIGNhbGwgaW5jbHVkZSgpIG9uIGl0CisgICAgICAgIFJlcXVlc3REaXNwYXRjaGVyIHJkID0KKyAgICAgICAgICAgIGdldFNlcnZsZXRDb250ZXh0KCkuZ2V0UmVxdWVzdERpc3BhdGNoZXIocGF0aCk7CisgICAgICAgIGlmIChyZCA9PSBudWxsKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiBObyBSZXF1ZXN0RGlzcGF0Y2hlciByZXR1cm5lZC8iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJkLmluY2x1ZGUocmVxdWVzdCwgcmVzcG9uc2UpOworICAgICAgICB9CisgICAgICAgIHJlc3BvbnNlLnJlc2V0QnVmZmVyKCk7CisKKyAgICAgICAgLy8gV2UgTVVTVCBiZSBhYmxlIHRvIHNlZSB0aGUgYXR0cmlidXRlIGNyZWF0ZWQgYnkgdGhlIGluY2x1ZGVlCisgICAgICAgIFN0cmluZyB2YWx1ZSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB2YWx1ZSA9IChTdHJpbmcpCisgICAgICAgICAgICAgICAgcmVxdWVzdC5nZXRBdHRyaWJ1dGUocGF0aC5zdWJzdHJpbmcoMSkpOworICAgICAgICB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIgUmV0dXJuZWQgYXR0cmlidXRlIG5vdCBvZiB0eXBlIFN0cmluZy8iKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHNiLmxlbmd0aCgpIDwgMSkgJiYgKHZhbHVlID09IG51bGwpKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiBObyBpbmNsdWRlZS1jcmVhdGVkIGF0dHJpYnV0ZSB3YXMgcmV0dXJuZWQvIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBXZSBNVVNUIE5PVCBzZWUgdGhlIHNwZWNpYWwgYXR0cmlidXRlcyBjcmVhdGVkIGJ5IHRoZSBjb250YWluZXIKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzcGVjaWFscy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKHJlcXVlc3QuZ2V0QXR0cmlidXRlKHNwZWNpYWxzW2ldKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgUmV0dXJuZWQgYXR0cmlidXRlICIpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChzcGVjaWFsc1tpXSk7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIvIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBXcml0ZSBvdXIgcmVzcG9uc2UKKyAgICAgICAgaWYgKHNiLmxlbmd0aCgpIDwgMSkKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJJbmNsdWRlMDMgUEFTU0VEIik7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgd3JpdGVyLnByaW50KCJJbmNsdWRlMDMgRkFJTEVEIC0iKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKHNiLnRvU3RyaW5nKCkpOworICAgICAgICB9CisKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gU3RhdGljTG9nZ2VyLnJlYWQoKTsKKyAgICAgICAgICAgIGlmIChtZXNzYWdlID09IG51bGwpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihtZXNzYWdlKTsKKyAgICAgICAgfQorICAgICAgICBTdGF0aWNMb2dnZXIucmVzZXQoKTsKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0luY2x1ZGUwM2EuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9JbmNsdWRlMDNhLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjlmNWE1YwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9JbmNsdWRlMDNhLmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwLCAyMDAxICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworLyoqCisgKiBUZXN0IHRvIGluc3VyZSB0aGF0IGFuIGluY2x1ZGVkIHNlcnZsZXQgY2FuIHNldCByZXF1ZXN0IGF0dHJpYnV0ZXMgdGhhdCBhcmUKKyAqIHZpc2libGUgdG8gdGhlIGNhbGxpbmcgc2VydmxldCBhZnRlciB0aGUgPGNvZGU+aW5jbHVkZSgpPC9jb2RlPiByZXR1cm5zLgorICogVGhlIHNwZWMgaXMgc2lsZW50IG9uIHRoaXMgdG9waWMsIGJ1dCBpdCBzZWVtcyBjb25zaXN0ZW50IHdpdGggdGhlIG92ZXJhbGwKKyAqIGludGVudCB0byBiZWhhdmUgaW4gdGhpcyBtYW5uZXIuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBJbmNsdWRlMDNhIGV4dGVuZHMgSHR0cFNlcnZsZXQgeworCisKKyAgICBwdWJsaWMgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICByZXF1ZXN0LnNldEF0dHJpYnV0ZSgiSW5jbHVkZTAzYSIsICJUaGlzIGlzIGEgbmV3IGF0dHJpYnV0ZSIpOworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvSW5jbHVkZTA0LmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvSW5jbHVkZTA0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM1YmEzMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9JbmNsdWRlMDQuamF2YQpAQCAtMCwwICsxLDc3IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAsIDIwMDEgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisvKioKKyAqIFRlc3QgdG8gZW5zdXJlIHRoYXQgd2UgY2FuIGluY2x1ZGUgYSBzZXJ2bGV0ICh3aXRob3V0IGZsdXNoaW5nIHRoZSBidWZmZXIpLAorICogdGhlbiBmb3J3YXJkIHRvIGFub3RoZXIgc2VydmxldCB0aGF0IHJlcGxhY2VzIHRoZSBvcmlnaW5hbCBjb250ZW50cy4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEluY2x1ZGUwNCBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIFByZXBhcmUgdGhpcyByZXNwb25zZQorICAgICAgICByZXNwb25zZS5zZXRCdWZmZXJTaXplKDgxOTIpOworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7CisJUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisKKyAgICAgICAgLy8gSW5jbHVkZSBvdXIgZmlyc3Qgc3Vic2VydmxldAorICAgICAgICBSZXF1ZXN0RGlzcGF0Y2hlciByZDEgPQorICAgICAgICAgIGdldFNlcnZsZXRDb250ZXh0KCkuZ2V0UmVxdWVzdERpc3BhdGNoZXIoIi9JbmNsdWRlMDRhIik7CisgICAgICAgIGlmIChyZDEgPT0gbnVsbCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIgTm8gUkQgZm9yICcvSW5jbHVkZTA0YScvIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZDEuaW5jbHVkZShyZXF1ZXN0LCByZXNwb25zZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBGb3J3YXJkIHRvIG91ciBzZWNvbmQgc3Vic2VydmxldAorICAgICAgICBSZXF1ZXN0RGlzcGF0Y2hlciByZDIgPQorICAgICAgICAgIGdldFNlcnZsZXRDb250ZXh0KCkuZ2V0UmVxdWVzdERpc3BhdGNoZXIoIi9JbmNsdWRlMDRiIik7CisgICAgICAgIGlmIChyZDIgPT0gbnVsbCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCJObyBSRCBmb3IgJy9JbmNsdWRlMDRiJy8iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByZDIuZm9yd2FyZChyZXF1ZXN0LCByZXNwb25zZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBBcHBlbmQgZXJyb3IgbWVzc2FnZXMgaWYgbmVjZXNzYXJ5CisgICAgICAgIGlmIChzYi5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiSW5jbHVkZTA0IEZBSUxFRCAtIik7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihzYi50b1N0cmluZygpKTsKKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IFN0YXRpY0xvZ2dlci5yZWFkKCk7CisgICAgICAgICAgICBpZiAobWVzc2FnZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4obWVzc2FnZSk7CisgICAgICAgIH0KKyAgICAgICAgU3RhdGljTG9nZ2VyLnJlc2V0KCk7CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9JbmNsdWRlMDRhLmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvSW5jbHVkZTA0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczYWE3NDQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvSW5jbHVkZTA0YS5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwgMjAwMCwgMjAwMSAsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50ZXN0ZXI7CisKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lio7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7CisKKy8qKgorICogRmlyc3Qgc3Vic2VydmxldCBmb3IgImluY2x1ZGUgdGhlbiBmb3J3YXJkIiB0ZXN0LgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgSW5jbHVkZTA0YSBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworCisgICAgcHVibGljIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKwlQcmludFdyaXRlciB3cml0ZXIgPSByZXNwb25zZS5nZXRXcml0ZXIoKTsKKyAgICAgICAgd3JpdGVyLnByaW50bG4oIkluY2x1ZGUwNGEgUEFTU0VEIik7CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9JbmNsdWRlMDRiLmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvSW5jbHVkZTA0Yi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5OWEzYmEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvSW5jbHVkZTA0Yi5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwgMjAwMCwgMjAwMSAsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50ZXN0ZXI7CisKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lio7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7CisKKy8qKgorICogU2Vjb25kIHN1YnNlcnZsZXQgZm9yICJpbmNsdWRlIHRoZW4gZm9yd2FyZCIgdGVzdC4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEluY2x1ZGUwNGIgZXh0ZW5kcyBIdHRwU2VydmxldCB7CisKKworICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisJUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisgICAgICAgIHdyaXRlci5wcmludGxuKCJJbmNsdWRlMDRiIFBBU1NFRCIpOworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvSW5jbHVkZTA2YS5qYXZhIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0luY2x1ZGUwNmEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTExZmFmCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0luY2x1ZGUwNmEuamF2YQpAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAsIDIwMDEgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisvKioKKyAqIEZpcnN0IHN1YnNlcnZsZXQgZm9yICJpbmNsdWRlIHRoZW4gaW5jbHVkZSIgdGVzdC4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEluY2x1ZGUwNmEgZXh0ZW5kcyBIdHRwU2VydmxldCB7CisKKworICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisJUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisgICAgICAgIHdyaXRlci5wcmludGxuKCJJbmNsdWRlMDZhIG91dHB1dCIpOworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvSW5jbHVkZTA3LmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvSW5jbHVkZTA3LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRmOWE1OQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9JbmNsdWRlMDcuamF2YQpAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAsIDIwMDEgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisvKioKKyAqIFRlc3QgdGhhdCBpbnN1cmVzIHdlIGNhbiBpbmNsdWRlIGEgc2VydmxldCB0aGF0IGRvZXMgYSBmb3J3YXJkLCB0aGVuCisgKiBpbmNsdWRlcyBhbm90aGVyIHNlcnZsZXQsIGFuZCB3ZSBzZWUgYWxsIG9mIHRoZSBvdXRwdXQgaW4gdGhlIHJpZ2h0IG9yZGVyLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgSW5jbHVkZTA3IGV4dGVuZHMgSHR0cFNlcnZsZXQgeworCisgICAgcHVibGljIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gUHJlcGFyZSB0aGlzIHJlc3BvbnNlCisgICAgICAgIHJlc3BvbnNlLnNldEJ1ZmZlclNpemUoODE5Mik7CisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7CisJUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisgICAgICAgIHdyaXRlci5wcmludGxuKCJPdXRwdXQgZnJvbSBJbmNsdWRlMDciKTsKKworICAgICAgICAvLyBJbmNsdWRlIG91ciBmaXJzdCBzdWJzZXJ2bGV0CisgICAgICAgIFJlcXVlc3REaXNwYXRjaGVyIHJkMSA9CisgICAgICAgICAgZ2V0U2VydmxldENvbnRleHQoKS5nZXRSZXF1ZXN0RGlzcGF0Y2hlcigiL0luY2x1ZGUwN2EiKTsKKyAgICAgICAgaWYgKHJkMSA9PSBudWxsKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiTm8gUkQgZm9yICcvSW5jbHVkZTA3YSciKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJkMS5pbmNsdWRlKHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEluY2x1ZGUgb3VyIHNlY29uZCBzdWJzZXJ2bGV0CisgICAgICAgIFJlcXVlc3REaXNwYXRjaGVyIHJkMiA9CisgICAgICAgICAgZ2V0U2VydmxldENvbnRleHQoKS5nZXRSZXF1ZXN0RGlzcGF0Y2hlcigiL0luY2x1ZGUwN2MiKTsKKyAgICAgICAgaWYgKHJkMiA9PSBudWxsKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiTm8gUkQgZm9yICcvSW5jbHVkZTA3YyciKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJkMi5pbmNsdWRlKHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEZpbmlzaCB0aGlzIHJlc3BvbnNlCisgICAgICAgIHdyaXRlci5wcmludGxuKCJPdXRwdXQgZnJvbSBJbmNsdWRlMDciKTsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gU3RhdGljTG9nZ2VyLnJlYWQoKTsKKyAgICAgICAgICAgIGlmIChtZXNzYWdlID09IG51bGwpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihtZXNzYWdlKTsKKyAgICAgICAgfQorICAgICAgICBTdGF0aWNMb2dnZXIucmVzZXQoKTsKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0luY2x1ZGUwN2EuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9JbmNsdWRlMDdhLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY4YjU1OAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9JbmNsdWRlMDdhLmphdmEKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwLCAyMDAxICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworLyoqCisgKiBUZXN0IHRoYXQgaW5zdXJlcyB3ZSBjYW4gaW5jbHVkZSBhIHNlcnZsZXQgdGhhdCBkb2VzIGEgZm9yd2FyZCwgdGhlbgorICogaW5jbHVkZXMgYW5vdGhlciBzZXJ2bGV0LCBhbmQgd2Ugc2VlIGFsbCBvZiB0aGUgb3V0cHV0IGluIHRoZSByaWdodCBvcmRlci4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEluY2x1ZGUwN2EgZXh0ZW5kcyBIdHRwU2VydmxldCB7CisKKyAgICBwdWJsaWMgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICAvLyBQcmVwYXJlIHRoaXMgcmVzcG9uc2UKKwlQcmludFdyaXRlciB3cml0ZXIgPSByZXNwb25zZS5nZXRXcml0ZXIoKTsKKworICAgICAgICAvLyBGb3J3YXJkIHRvIG91ciBzdWJzdWJzZXJ2bGV0CisgICAgICAgIFJlcXVlc3REaXNwYXRjaGVyIHJkID0KKyAgICAgICAgICBnZXRTZXJ2bGV0Q29udGV4dCgpLmdldFJlcXVlc3REaXNwYXRjaGVyKCIvSW5jbHVkZTA3YiIpOworICAgICAgICBpZiAocmQgPT0gbnVsbCkgeworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIk5vIFJEIGZvciAnL0luY2x1ZGUwN2InIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZC5pbmNsdWRlKHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICAgICAgfQorCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvSW5jbHVkZTA3Yi5qYXZhIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0luY2x1ZGUwN2IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmUzYWFhCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0luY2x1ZGUwN2IuamF2YQpAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAsIDIwMDEgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisvKioKKyAqIFRlc3QgdGhhdCBpbnN1cmVzIHdlIGNhbiBpbmNsdWRlIGEgc2VydmxldCB0aGF0IGRvZXMgYSBmb3J3YXJkLCB0aGVuCisgKiBpbmNsdWRlcyBhbm90aGVyIHNlcnZsZXQsIGFuZCB3ZSBzZWUgYWxsIG9mIHRoZSBvdXRwdXQgaW4gdGhlIHJpZ2h0IG9yZGVyLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgSW5jbHVkZTA3YiBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIFByZXBhcmUgdGhpcyByZXNwb25zZQorCVByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworICAgICAgICB3cml0ZXIucHJpbnRsbigiT3V0cHV0IGZyb20gSW5jbHVkZTA3YiIpOworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvSW5jbHVkZTA3Yy5qYXZhIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0luY2x1ZGUwN2MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDlmNDQ1Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0luY2x1ZGUwN2MuamF2YQpAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAsIDIwMDEgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisvKioKKyAqIFRlc3QgdGhhdCBpbnN1cmVzIHdlIGNhbiBpbmNsdWRlIGEgc2VydmxldCB0aGF0IGRvZXMgYSBmb3J3YXJkLCB0aGVuCisgKiBpbmNsdWRlcyBhbm90aGVyIHNlcnZsZXQsIGFuZCB3ZSBzZWUgYWxsIG9mIHRoZSBvdXRwdXQgaW4gdGhlIHJpZ2h0IG9yZGVyLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgSW5jbHVkZTA3YyBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIFByZXBhcmUgdGhpcyByZXNwb25zZQorCVByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworICAgICAgICB3cml0ZXIucHJpbnRsbigiT3V0cHV0IGZyb20gSW5jbHVkZTA3YyIpOworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvSW5jbHVkZTA5LmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvSW5jbHVkZTA5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFkMWIzZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9JbmNsdWRlMDkuamF2YQpAQCAtMCwwICsxLDcyIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAsIDIwMDEgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisvKioKKyAqIEV4ZXJjaXNlIGJhc2ljIGluY2x1ZGluZyBmdW5jdGlvbmFsaXR5IHVzaW5nCisgKiA8Y29kZT5yZXF1ZXN0LmdldFJlcXVlc3REaXNwYXRjaGVyKCk8L2NvZGU+LgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgSW5jbHVkZTA5IGV4dGVuZHMgSHR0cFNlcnZsZXQgeworCisKKyAgICBwdWJsaWMgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICAvLyBQcmVwYXJlIHRoaXMgcmVzcG9uc2UKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9wbGFpbiIpOworCVByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworCisgICAgICAgIC8vIEFjcXVpcmUgdGhlIHBhdGggdG8gd2hpY2ggd2Ugd2lsbCBpc3N1ZSBhIGluY2x1ZGUKKyAgICAgICAgU3RyaW5nIHBhdGggPSByZXF1ZXN0LmdldFBhcmFtZXRlcigicGF0aCIpOworICAgICAgICBpZiAocGF0aCA9PSBudWxsKQorICAgICAgICAgICAgcGF0aCA9ICIvSW5jbHVkZTAwYSI7CisKKyAgICAgICAgLy8gQ3JlYXRlIGEgcmVxdWVzdCBkaXNwYXRjaGVyIGFuZCBjYWxsIGluY2x1ZGUoKSBvbiBpdAorICAgICAgICBSZXF1ZXN0RGlzcGF0Y2hlciByZCA9IHJlcXVlc3QuZ2V0UmVxdWVzdERpc3BhdGNoZXIocGF0aCk7CisgICAgICAgIGlmIChyZCA9PSBudWxsKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiBObyBSZXF1ZXN0RGlzcGF0Y2hlciByZXR1cm5lZC8iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChzYi5sZW5ndGgoKSA8IDEpCisgICAgICAgICAgICAgICAgcmQuaW5jbHVkZShyZXF1ZXN0LCByZXNwb25zZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBXcml0ZSBvdXIgcmVzcG9uc2UgaWYgYW4gZXJyb3Igb2NjdXJyZWQKKyAgICAgICAgaWYgKHNiLmxlbmd0aCgpID49IDEpIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiSW5jbHVkZTAwIEZBSUxFRCAtIik7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihzYi50b1N0cmluZygpKTsKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBTdGF0aWNMb2dnZXIucmVhZCgpOworICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKG1lc3NhZ2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFN0YXRpY0xvZ2dlci5yZXNldCgpOworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvSW5jbHVkZTEwLmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvSW5jbHVkZTEwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY2Yjg2YwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9JbmNsdWRlMTAuamF2YQpAQCAtMCwwICsxLDgwIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAsIDIwMDEgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisvKioKKyAqIE1ha2Ugc3VyZSBjb250YWluZXIgc2V0cyB1cCBpbmNsdWRlIHJlcXVlcyBhdHRyaWJ1dGVzLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgSW5jbHVkZTEwIGV4dGVuZHMgSHR0cFNlcnZsZXQgeworCisKKyAgICBwdWJsaWMgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICAvLyBQcmVwYXJlIHRoaXMgcmVzcG9uc2UKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9wbGFpbiIpOworCVByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworCisgICAgICAgIC8vIFBhc3MgY29waWVzIG9mIHRoZSBvcmlnaW5hbCByZXF1ZXN0IHByb3BlcnRpZXMKKyAgICAgICAgcmVxdWVzdC5zZXRBdHRyaWJ1dGUoIm9yaWdpbmFsLnJlcXVlc3RfdXJpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCkpOworICAgICAgICByZXF1ZXN0LnNldEF0dHJpYnV0ZSgib3JpZ2luYWwuY29udGV4dF9wYXRoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5nZXRDb250ZXh0UGF0aCgpKTsKKyAgICAgICAgcmVxdWVzdC5zZXRBdHRyaWJ1dGUoIm9yaWdpbmFsLnNlcnZsZXRfcGF0aCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuZ2V0U2VydmxldFBhdGgoKSk7CisgICAgICAgIHJlcXVlc3Quc2V0QXR0cmlidXRlKCJvcmlnaW5hbC5wYXRoX2luZm8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmdldFBhdGhJbmZvKCkpOworICAgICAgICByZXF1ZXN0LnNldEF0dHJpYnV0ZSgib3JpZ2luYWwucXVlcnlfc3RyaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5nZXRRdWVyeVN0cmluZygpKTsKKworICAgICAgICAvLyBDcmVhdGUgYSByZXF1ZXN0IGRpc3BhdGNoZXIgYW5kIGNhbGwgaW5jbHVkZSgpIG9uIGl0CisgICAgICAgIFJlcXVlc3REaXNwYXRjaGVyIHJkID0KKyAgICAgICAgICAgIGdldFNlcnZsZXRDb250ZXh0KCkuZ2V0UmVxdWVzdERpc3BhdGNoZXIKKyAgICAgICAgICAgICgiL0luY2x1ZGUxMGEvaW5jbHVkZS9wYXRoP25hbWUyPXZhbHVlMiIpOworICAgICAgICBpZiAocmQgPT0gbnVsbCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIgTm8gUmVxdWVzdERpc3BhdGNoZXIgcmV0dXJuZWQvIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoc2IubGVuZ3RoKCkgPCAxKQorICAgICAgICAgICAgICAgIHJkLmluY2x1ZGUocmVxdWVzdCwgcmVzcG9uc2UpOworICAgICAgICB9CisKKyAgICAgICAgLy8gV3JpdGUgb3VyIHJlc3BvbnNlIGlmIGFuIGVycm9yIG9jY3VycmVkCisgICAgICAgIGlmIChzYi5sZW5ndGgoKSA+PSAxKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoIkluY2x1ZGUwMCBGQUlMRUQgLSIpOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oc2IudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gU3RhdGljTG9nZ2VyLnJlYWQoKTsKKyAgICAgICAgICAgICAgICBpZiAobWVzc2FnZSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihtZXNzYWdlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBTdGF0aWNMb2dnZXIucmVzZXQoKTsKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0luY2x1ZGUxMGEuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9JbmNsdWRlMTBhLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU3MzE1YQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9JbmNsdWRlMTBhLmphdmEKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwgMjAwMCwgMjAwMSAsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50ZXN0ZXI7CisKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lio7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7CisKKy8qKgorICogRW5zdXJlIHRoZSBjb3JyZWN0IGNvbnRhaW5lciBtYW5hZ2VkIHJlcXVlc3QgYXR0cmlidXRlcyBhcmUgc2V0LgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgSW5jbHVkZTEwYSBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBzcGVjaWFsc1tdID0KKyAgICB7ICJqYXZheC5zZXJ2bGV0LmluY2x1ZGUucmVxdWVzdF91cmkiLAorICAgICAgImphdmF4LnNlcnZsZXQuaW5jbHVkZS5jb250ZXh0X3BhdGgiLAorICAgICAgImphdmF4LnNlcnZsZXQuaW5jbHVkZS5zZXJ2bGV0X3BhdGgiLAorICAgICAgImphdmF4LnNlcnZsZXQuaW5jbHVkZS5wYXRoX2luZm8iLAorICAgICAgImphdmF4LnNlcnZsZXQuaW5jbHVkZS5xdWVyeV9zdHJpbmciIH07CisKKworICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIFByZXBhcmUgdGhpcyByZXNwb25zZQorICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisKKyAgICAgICAgLy8gVmFsaWRhdGUgdGhlIG9yaWdpbmFsIHJlcXVlc3QgcHJvcGVydGllcworICAgICAgICBTdHJpbmcgdmFsdWUgPSBudWxsOworICAgICAgICB2YWx1ZSA9IChTdHJpbmcpIHJlcXVlc3QuZ2V0QXR0cmlidXRlKCJvcmlnaW5hbC5yZXF1ZXN0X3VyaSIpOworICAgICAgICBpZiAoIXZhbHVlLmVxdWFscyhyZXF1ZXN0LmdldFJlcXVlc3RVUkkoKSkpCisgICAgICAgICAgICBzYi5hcHBlbmQoIiBnZXRSZXF1ZXN0VVJJKCkgaXMgIiArIHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpICsKKyAgICAgICAgICAgICAgICAgICAgICAiIGJ1dCBzaG91bGQgYmUgIiArIHZhbHVlICsgInwiKTsKKyAgICAgICAgdmFsdWUgPSAoU3RyaW5nKSByZXF1ZXN0LmdldEF0dHJpYnV0ZSgib3JpZ2luYWwuY29udGV4dF9wYXRoIik7CisgICAgICAgIGlmICghdmFsdWUuZXF1YWxzKHJlcXVlc3QuZ2V0Q29udGV4dFBhdGgoKSkpCisgICAgICAgICAgICBzYi5hcHBlbmQoIiBnZXRDb250ZXh0UGF0aCgpIGlzICIgKyByZXF1ZXN0LmdldENvbnRleHRQYXRoKCkgKworICAgICAgICAgICAgICAgICAgICAgICIgYnV0IHNob3VsZCBiZSAiICsgdmFsdWUgKyAifCIpOworICAgICAgICB2YWx1ZSA9IChTdHJpbmcpIHJlcXVlc3QuZ2V0QXR0cmlidXRlKCJvcmlnaW5hbC5zZXJ2bGV0X3BhdGgiKTsKKyAgICAgICAgaWYgKCF2YWx1ZS5lcXVhbHMocmVxdWVzdC5nZXRTZXJ2bGV0UGF0aCgpKSkKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiIGdldFNlcnZsZXRQYXRoKCkgaXMgIiArIHJlcXVlc3QuZ2V0U2VydmxldFBhdGgoKSArCisgICAgICAgICAgICAgICAgICAgICAgIiBidXQgc2hvdWxkIGJlICIgKyB2YWx1ZSArICJ8Iik7CisgICAgICAgIHZhbHVlID0gKFN0cmluZykgcmVxdWVzdC5nZXRBdHRyaWJ1dGUoIm9yaWdpbmFsLnBhdGhfaW5mbyIpOworICAgICAgICBpZiAoIXZhbHVlLmVxdWFscyhyZXF1ZXN0LmdldFBhdGhJbmZvKCkpKQorICAgICAgICAgICAgc2IuYXBwZW5kKCIgZ2V0UGF0aEluZm8oKSBpcyAiICsgcmVxdWVzdC5nZXRQYXRoSW5mbygpICsKKyAgICAgICAgICAgICAgICAgICAgICAiIGJ1dCBzaG91bGQgYmUgIiArIHZhbHVlICsgInwiKTsKKyAgICAgICAgdmFsdWUgPSAoU3RyaW5nKSByZXF1ZXN0LmdldEF0dHJpYnV0ZSgib3JpZ2luYWwucXVlcnlfc3RyaW5nIik7CisgICAgICAgIGlmICghdmFsdWUuZXF1YWxzKHJlcXVlc3QuZ2V0UXVlcnlTdHJpbmcoKSkpCisgICAgICAgICAgICBzYi5hcHBlbmQoIiBnZXRRdWVyeVN0cmluZygpIGlzICIgKyByZXF1ZXN0LmdldFF1ZXJ5U3RyaW5nKCkgKworICAgICAgICAgICAgICAgICAgICAgICIgYnV0IHNob3VsZCBiZSAiICsgdmFsdWUgKyAifCIpOworCisgICAgICAgIC8vIFZhbGlkYXRlIHRoZSBjb250YWluZXIgcHJvdmlkZWQgcmVxdWVzdCBhdHRyaWJ1dGVzCisgICAgICAgIHZhbHVlID0gKFN0cmluZykKKyAgICAgICAgICAgIHJlcXVlc3QuZ2V0QXR0cmlidXRlKCJqYXZheC5zZXJ2bGV0LmluY2x1ZGUucmVxdWVzdF91cmkiKTsKKyAgICAgICAgaWYgKCEocmVxdWVzdC5nZXRDb250ZXh0UGF0aCgpICsgIi9JbmNsdWRlMTBhL2luY2x1ZGUvcGF0aCIpLmVxdWFscyh2YWx1ZSkpCisgICAgICAgICAgICBzYi5hcHBlbmQoIiByZXF1ZXN0X3VyaSBpcyAiICsgdmFsdWUgKworICAgICAgICAgICAgICAgICAgICAgICIgYnV0IHNob3VsZCBiZSAiICsgcmVxdWVzdC5nZXRDb250ZXh0UGF0aCgpICsKKyAgICAgICAgICAgICAgICAgICAgICAiL0luY2x1ZGUxMGEvaW5jbHVkZS9wYXRofCIpOworICAgICAgICB2YWx1ZSA9IChTdHJpbmcpCisgICAgICAgICAgICByZXF1ZXN0LmdldEF0dHJpYnV0ZSgiamF2YXguc2VydmxldC5pbmNsdWRlLmNvbnRleHRfcGF0aCIpOworICAgICAgICBpZiAoIXJlcXVlc3QuZ2V0Q29udGV4dFBhdGgoKS5lcXVhbHModmFsdWUpKQorICAgICAgICAgICAgc2IuYXBwZW5kKCIgY29udGV4dF9wYXRoIGlzICIgKyB2YWx1ZSArCisgICAgICAgICAgICAgICAgICAgICAgIiBidXQgc2hvdWxkIGJlICIgKyByZXF1ZXN0LmdldENvbnRleHRQYXRoKCkgKyAifCIpOworICAgICAgICB2YWx1ZSA9IChTdHJpbmcpCisgICAgICAgICAgICByZXF1ZXN0LmdldEF0dHJpYnV0ZSgiamF2YXguc2VydmxldC5pbmNsdWRlLnNlcnZsZXRfcGF0aCIpOworICAgICAgICBpZiAoISIvSW5jbHVkZTEwYSIuZXF1YWxzKHZhbHVlKSkKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiIHNlcnZsZXRfcGF0aCBpcyAiICsgdmFsdWUgKworICAgICAgICAgICAgICAgICAgICAgICIgYnV0IHNob3VsZCBiZSAvSW5jbHVkZTEwYXwiKTsKKyAgICAgICAgdmFsdWUgPSAoU3RyaW5nKQorICAgICAgICAgICAgcmVxdWVzdC5nZXRBdHRyaWJ1dGUoImphdmF4LnNlcnZsZXQuaW5jbHVkZS5wYXRoX2luZm8iKTsKKyAgICAgICAgaWYgKCEiL2luY2x1ZGUvcGF0aCIuZXF1YWxzKHZhbHVlKSkKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiIHBhdGhfaW5mbyBpcyAiICsgdmFsdWUgKworICAgICAgICAgICAgICAgICAgICAgICIgYnV0IHNob3VsZCBiZSAvaW5jbHVkZS9wYXRofCIpOworICAgICAgICB2YWx1ZSA9IChTdHJpbmcpCisgICAgICAgICAgICByZXF1ZXN0LmdldEF0dHJpYnV0ZSgiamF2YXguc2VydmxldC5pbmNsdWRlLnF1ZXJ5X3N0cmluZyIpOworICAgICAgICBpZiAoISJuYW1lMj12YWx1ZTIiLmVxdWFscyh2YWx1ZSkpCisgICAgICAgICAgICBzYi5hcHBlbmQoIiBxdWVyeV9zdHJpbmcgaXMgIiArIHZhbHVlICsKKyAgICAgICAgICAgICAgICAgICAgICAiIGJ1dCBzaG91bGQgYmUgbmFtZTI9dmFsdWUyfCIpOworCisgICAgICAgIC8vIEdlbmVyYXRlIG91ciBzdWNjZXNzIG9yIGZhaWx1cmUgcmVwb3J0CisgICAgICAgIGlmIChzYi5sZW5ndGgoKSA8IDEpCisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiSW5jbHVkZTEwYSBQQVNTRUQiKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIkluY2x1ZGUxMGEgRkFJTEVEIC0iICsgc2IudG9TdHJpbmcoKSk7CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9KbmRpMDEuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9KbmRpMDEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTc3YjI0Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0puZGkwMS5qYXZhCkBAIC0wLDAgKzEsMjA1IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAsIDIwMDEgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YXgubmFtaW5nLkJpbmRpbmc7CitpbXBvcnQgamF2YXgubmFtaW5nLkNvbnRleHQ7CitpbXBvcnQgamF2YXgubmFtaW5nLkluaXRpYWxDb250ZXh0OworaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1pbmdFbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRlc3Rlci5TZXNzaW9uQmVhbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRlc3Rlci5zaGFyZWQuU2hhcmVkU2Vzc2lvbkJlYW47CitpbXBvcnQgb3JnLmFwYWNoZS50ZXN0ZXIudW5wc2hhcmVkLlVucFNoYXJlZFNlc3Npb25CZWFuOworaW1wb3J0IG9yZy5hcGFjaGUudGVzdGVyLnVuc2hhcmVkLlVuc2hhcmVkU2Vzc2lvbkJlYW47CisKKworLyoqCisgKiBOZWdhdGl2ZSB0ZXN0IGZvciBlbnN1cmluZyB0aGF0IHRoZSBuYW1pbmcgY29udGV4dCBwcm92aWRlZCBieSB0aGUgc2VydmxldAorICogY29udGFpbmVyIGlzIGltbXV0YWJsZS4gIE5vIGF0dGVtcHQgdG8gYWRkLCBtb2RpZnksIG9yIGRlbGV0ZSBhbnkgYmluZGluZworICogc2hvdWxkIHN1Y2NlZWQuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBKbmRpMDEgZXh0ZW5kcyBIdHRwU2VydmxldCB7CisKKyAgICBwdWJsaWMgdm9pZCBpbml0KCkgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIEFjY2VzcyB0aGUgbmFtaW5nIGNvbnRleHQgZnJvbSBpbml0KCkKKyAgICAgICAgQ29udGV4dCBjdHggPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgY3R4ID0gbmV3IEluaXRpYWxDb250ZXh0KCk7CisgICAgICAgICAgICBjdHgubG9va3VwKCJqYXZhOi9jb21wIik7CisgICAgICAgICAgICBsb2coImluaXRpYWxpemVkIHN1Y2Nlc3NmdWxseSBpbiBpbml0KCkiKTsKKyAgICAgICAgfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBsb2coIkNhbm5vdCBjcmVhdGUgY29udGV4dCBpbiBpbml0KCkiLCBlKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uKGUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQWNjZXNzIHNvbWUgYXBwbGljYXRpb24gYmVhbnMgZnJvbSBpbml0KCkKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgU2Vzc2lvbkJlYW4gc2IgPSBuZXcgU2Vzc2lvbkJlYW4oKTsKKyAgICAgICAgICAgIGxvZygiT0sgQWNjZXNzaW5nIFNlc3Npb25CZWFuIik7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICBsb2coIkZBSUwgQWNjZXNzaW5nIFNlc3Npb25CZWFuIiwgdCk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgU2hhcmVkU2Vzc2lvbkJlYW4gc2IgPSBuZXcgU2hhcmVkU2Vzc2lvbkJlYW4oKTsKKyAgICAgICAgICAgIGxvZygiT0sgQWNjZXNzaW5nIFNoYXJlZFNlc3Npb25CZWFuIik7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICBsb2coIkZBSUwgQWNjZXNzaW5nIFNoYXJlZFNlc3Npb25CZWFuIiwgdCk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgVW5wU2hhcmVkU2Vzc2lvbkJlYW4gc2IgPSBuZXcgVW5wU2hhcmVkU2Vzc2lvbkJlYW4oKTsKKyAgICAgICAgICAgIGxvZygiT0sgQWNjZXNzaW5nIFVucFNoYXJlZFNlc3Npb25CZWFuIik7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICBsb2coIkZBSUwgQWNjZXNzaW5nIFVucFNoYXJlZFNlc3Npb25CZWFuIiwgdCk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgVW5zaGFyZWRTZXNzaW9uQmVhbiBzYiA9IG5ldyBVbnNoYXJlZFNlc3Npb25CZWFuKCk7CisgICAgICAgICAgICBsb2coIk9LIEFjY2Vzc2luZyBVbnNoYXJlZFNlc3Npb25CZWFuIik7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICBsb2coIkZBSUwgQWNjZXNzaW5nIFVuc2hhcmVkU2Vzc2lvbkJlYW4iLCB0KTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHVibGljIHZvaWQgZGVzdHJveSgpIHsKKyAgICAgICAgQ29udGV4dCBjdHggPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgY3R4ID0gbmV3IEluaXRpYWxDb250ZXh0KCk7CisgICAgICAgICAgICBjdHgubG9va3VwKCJqYXZhOi9jb21wIik7CisgICAgICAgICAgICBsb2coImluaXRpYWxpemVkIHN1Y2Nlc3NmdWxseSBpbiBkZXN0cm95KCkiKTsKKyAgICAgICAgfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBsb2coIkNhbm5vdCBjcmVhdGUgY29udGV4dCBpbiBkZXN0cm95KCkiLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIFByZXBhcmUgdG8gcmVuZGVyIG91ciBvdXRwdXQKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvcGxhaW4iKTsKKyAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgYm9vbGVhbiBvayA9IHRydWU7CisgICAgICAgIE9iamVjdCB2YWx1ZSA9IG51bGw7CisKKyAgICAgICAgLy8gTG9vayB1cCB0aGUgaW5pdGlhbCBjb250ZXh0IHByb3ZpZGVkIGJ5IG91ciBzZXJ2bGV0IGNvbnRhaW5lcgorICAgICAgICBDb250ZXh0IGluaXRDb250ZXh0ID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGluaXRDb250ZXh0ID0gbmV3IEluaXRpYWxDb250ZXh0KCk7CisgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2coIkNyZWF0ZSBpbml0Q29udGV4dCIsIGUpOworICAgICAgICAgICAgc2IuYXBwZW5kKCIgIENhbm5vdCBjcmVhdGUgaW5pdENvbnRleHQuIik7CisgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gTG9vayB1cCB0aGUgZW52aXJvbm1lbnQgY29udGV4dCBwcm92aWRlZCB0byBvdXIgd2ViIGFwcGxpY2F0aW9uCisgICAgICAgIENvbnRleHQgZW52Q29udGV4dCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAob2spIHsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IGluaXRDb250ZXh0Lmxvb2t1cCgiamF2YTpjb21wL2VudiIpOworICAgICAgICAgICAgICAgIGVudkNvbnRleHQgPSAoQ29udGV4dCkgdmFsdWU7CisgICAgICAgICAgICAgICAgaWYgKGVudkNvbnRleHQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiAgTWlzc2luZyBlbnZDb250ZXh0LiIpOworICAgICAgICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiICBlbnZDb250ZXh0IGNsYXNzIGlzICIpOworICAgICAgICAgICAgc2IuYXBwZW5kKHZhbHVlLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiLiIpOworICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZygiQ3JlYXRlIGVudkNvbnRleHQiLCBlKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiICBDYW5ub3QgY3JlYXRlIGVudkNvbnRleHQuIik7CisgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gQXR0ZW1wdCB0byBhZGQgYSBuZXcgYmluZGluZyB0byBvdXIgZW52aXJvbm1lbnQgY29udGV4dAorICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKG9rKSB7CisgICAgICAgICAgICAgICAgZW52Q29udGV4dC5iaW5kKCJuZXdFbnRyeSIsICJOZXcgVmFsdWUiKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiAgQWxsb3dlZCBiaW5kKCkuIik7CisgICAgICAgICAgICAgICAgdmFsdWUgPSBlbnZDb250ZXh0Lmxvb2t1cCgibmV3RW50cnkiKTsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgIEFsbG93ZWQgbG9va3VwKCkgb2YgYWRkZWQgZW50cnkuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CisgICAgICAgICAgICBsb2coIkFkZCBiaW5kaW5nIiwgZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBBdHRlbXB0IHRvIGNoYW5nZSB0aGUgdmFsdWUgb2YgYW4gZXhpc3RpbmcgYmluZGluZworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKG9rKSB7CisgICAgICAgICAgICAgICAgZW52Q29udGV4dC5yZWJpbmQoInN0cmluZ0VudHJ5IiwgIkNoYW5nZWQgVmFsdWUiKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiAgQWxsb3dlZCByZWJpbmQoKS4iKTsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IGVudkNvbnRleHQubG9va3VwKCJzdHJpbmdFbnRyeSIpOworICAgICAgICAgICAgICAgIGlmICgodmFsdWUgIT0gbnVsbCkgJiYKKyAgICAgICAgICAgICAgICAgICAgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSAmJgorICAgICAgICAgICAgICAgICAgICAiQ2hhbmdlZCBWYWx1ZSIuZXF1YWxzKChTdHJpbmcpIHZhbHVlKSkKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgIEFsbG93ZWQgbG9va3VwKCkgb2YgY2hhbmdlZCBlbnRyeS4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKKyAgICAgICAgICAgIGxvZygiQ2hhbmdlIGJpbmRpbmciLCBlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEF0dGVtcHQgdG8gZGVsZXRlIGFuIGV4aXN0aW5nIGJpbmRpbmcKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChvaykgeworICAgICAgICAgICAgICAgIGVudkNvbnRleHQudW5iaW5kKCJieXRlRW50cnkiKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiAgQWxsb3dlZCB1bmJpbmQoKS4iKTsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IGVudkNvbnRleHQubG9va3VwKCJieXRlRW50cnkiKTsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgIEFsbG93ZWQgdW5iaW5kIG9mIGRlbGV0ZWQgZW50cnkuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CisgICAgICAgICAgICBsb2coIkRlbGV0ZSBiaW5kaW5nIiwgZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXBvcnQgb3VyIHVsdGltYXRlIHN1Y2Nlc3Mgb3IgZmFpbHVyZQorICAgICAgICBpZiAoc2IubGVuZ3RoKCkgPCAxKQorICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIkpuZGkwMSBQQVNTRUQiKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoIkpuZGkwMSBGQUlMRUQgLSIpOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oc2IpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQWRkIHdyYXBwZXIgbWVzc2FnZXMgYXMgcmVxdWlyZWQKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gU3RhdGljTG9nZ2VyLnJlYWQoKTsKKyAgICAgICAgICAgIGlmIChtZXNzYWdlID09IG51bGwpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihtZXNzYWdlKTsKKyAgICAgICAgfQorICAgICAgICBTdGF0aWNMb2dnZXIucmVzZXQoKTsKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0puZGkwMi5qYXZhIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0puZGkwMi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkMDY2NTgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvSm5kaTAyLmphdmEKQEAgLTAsMCArMSwzNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwgMjAwMCwgMjAwMSAsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50ZXN0ZXI7CisKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuQmluZGluZzsKK2ltcG9ydCBqYXZheC5uYW1pbmcuQ29udGV4dDsKK2ltcG9ydCBqYXZheC5uYW1pbmcuSW5pdGlhbENvbnRleHQ7CitpbXBvcnQgamF2YXgubmFtaW5nLk5hbWluZ0VudW1lcmF0aW9uOworaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1pbmdFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGVzdGVyLlNlc3Npb25CZWFuOworaW1wb3J0IG9yZy5hcGFjaGUudGVzdGVyLnNoYXJlZC5TaGFyZWRTZXNzaW9uQmVhbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRlc3Rlci51bnBzaGFyZWQuVW5wU2hhcmVkU2Vzc2lvbkJlYW47CitpbXBvcnQgb3JnLmFwYWNoZS50ZXN0ZXIudW5zaGFyZWQuVW5zaGFyZWRTZXNzaW9uQmVhbjsKKworCisvKioKKyAqIFBvc2l0aXZlIHRlc3QgZm9yIGxvb2tpbmcgdXAgZW52aXJvbm1lbnQgZW50cmllcyBmcm9tIHRoZSBuYW1pbmcgY29udGV4dAorICogcHJvdmlkZWQgYnkgdGhlIHNlcnZsZXQgY29udGFpbmVyLiAgVGhlIGxvb2tlZC11cCB2YWx1ZXMgYXJlIGluaXRpYWxpemVkCisgKiB2aWEgPGNvZGU+Jmx0O2Vudi1lbnRyeSZndDs8L2NvZGU+IGVsZW1lbnRzIGluIHRoZSB3ZWIgYXBwbGljYXRpb24KKyAqIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEpuZGkwMiBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworICAgIC8vIE5hbWVzIG9mIHRoZSBrbm93biA8ZW52LWVudHJ5PiBlbGVtZW50cworICAgIFN0cmluZyBuYW1lc1tdID0KKyAgICB7ICJib29sZWFuRW50cnkiLCAiYnl0ZUVudHJ5IiwgImRvdWJsZUVudHJ5IiwgImZsb2F0RW50cnkiLAorICAgICAgImludGVnZXJFbnRyeSIsICJsb25nRW50cnkiLCAic3RyaW5nRW50cnkiLCAibmVzdGVkIiB9OworCisKKyAgICAvLyBSZWZlcmVuY2Ugc29tZSBhcHBsaWNhdGlvbiBjbGFzc2VzIGZvciB0aGUgZmlyc3QgdGltZSBpbiBkZXN0cm95KCkKKyAgICAvLyBhbmQgbG9nIHRoZSByZXN1bHRzCisgICAgcHVibGljIHZvaWQgZGVzdHJveSgpIHsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgU2Vzc2lvbkJlYW4gc2IgPSBuZXcgU2Vzc2lvbkJlYW4oKTsKKyAgICAgICAgICAgIGxvZygiT0sgQWNjZXNzaW5nIFNlc3Npb25CZWFuIik7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICBsb2coIkZBSUwgQWNjZXNzaW5nIFNlc3Npb25CZWFuIiwgdCk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgU2hhcmVkU2Vzc2lvbkJlYW4gc2IgPSBuZXcgU2hhcmVkU2Vzc2lvbkJlYW4oKTsKKyAgICAgICAgICAgIGxvZygiT0sgQWNjZXNzaW5nIFNoYXJlZFNlc3Npb25CZWFuIik7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICBsb2coIkZBSUwgQWNjZXNzaW5nIFNoYXJlZFNlc3Npb25CZWFuIiwgdCk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgVW5wU2hhcmVkU2Vzc2lvbkJlYW4gc2IgPSBuZXcgVW5wU2hhcmVkU2Vzc2lvbkJlYW4oKTsKKyAgICAgICAgICAgIGxvZygiT0sgQWNjZXNzaW5nIFVucFNoYXJlZFNlc3Npb25CZWFuIik7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICBsb2coIkZBSUwgQWNjZXNzaW5nIFVucFNoYXJlZFNlc3Npb25CZWFuIiwgdCk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgVW5zaGFyZWRTZXNzaW9uQmVhbiBzYiA9IG5ldyBVbnNoYXJlZFNlc3Npb25CZWFuKCk7CisgICAgICAgICAgICBsb2coIk9LIEFjY2Vzc2luZyBVbnNoYXJlZFNlc3Npb25CZWFuIik7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICBsb2coIkZBSUwgQWNjZXNzaW5nIFVuc2hhcmVkU2Vzc2lvbkJlYW4iLCB0KTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICAvLyBQcmVwYXJlIHRvIHJlbmRlciBvdXIgb3V0cHV0CisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7CisgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGJvb2xlYW4gb2sgPSB0cnVlOworICAgICAgICBPYmplY3QgdmFsdWUgPSBudWxsOworCisgICAgICAgIC8vIExvb2sgdXAgdGhlIGluaXRpYWwgY29udGV4dCBwcm92aWRlZCBieSBvdXIgc2VydmxldCBjb250YWluZXIKKyAgICAgICAgQ29udGV4dCBpbml0Q29udGV4dCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbml0Q29udGV4dCA9IG5ldyBJbml0aWFsQ29udGV4dCgpOworICAgICAgICB9IGNhdGNoIChOYW1pbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9nKCJDcmVhdGUgaW5pdENvbnRleHQiLCBlKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiICBDYW5ub3QgY3JlYXRlIGluaXRDb250ZXh0LiIpOworICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIExvb2sgdXAgdGhlIGVudmlyb25tZW50IGNvbnRleHQgcHJvdmlkZWQgdG8gb3VyIHdlYiBhcHBsaWNhdGlvbgorICAgICAgICBDb250ZXh0IGVudkNvbnRleHQgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKG9rKSB7CisgICAgICAgICAgICAgICAgdmFsdWUgPSBpbml0Q29udGV4dC5sb29rdXAoImphdmE6Y29tcC9lbnYiKTsKKyAgICAgICAgICAgICAgICBlbnZDb250ZXh0ID0gKENvbnRleHQpIHZhbHVlOworICAgICAgICAgICAgICAgIGlmIChlbnZDb250ZXh0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgIE1pc3NpbmcgZW52Q29udGV4dC4iKTsKKyAgICAgICAgICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiAgZW52Q29udGV4dCBjbGFzcyBpcyAiKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCh2YWx1ZS5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICAgICAgICBzYi5hcHBlbmQoIi4iKTsKKyAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2coIkNyZWF0ZSBlbnZDb250ZXh0IiwgZSk7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiAgQ2Fubm90IGNyZWF0ZSBlbnZDb250ZXh0LiIpOworICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFZhbGlkYXRlIHRoZSBib29sZWFuRW50cnkgZW52aXJvbm1lbnQgZW50cnkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChvaykgeworICAgICAgICAgICAgICAgIHZhbHVlID0gZW52Q29udGV4dC5sb29rdXAoImJvb2xlYW5FbnRyeSIpOworICAgICAgICAgICAgICAgIEJvb2xlYW4gYm9vbGVhblZhbHVlID0gKEJvb2xlYW4pIHZhbHVlOworICAgICAgICAgICAgICAgIGlmICghKGJvb2xlYW5WYWx1ZS5ib29sZWFuVmFsdWUoKSA9PSB0cnVlKSkgeworICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiAgYm9vbGVhblZhbHVlIGlzICIpOworICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoYm9vbGVhblZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIgIGJvb2xlYW5WYWx1ZSBjbGFzcyBpcyAiKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCh2YWx1ZS5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICAgICAgICBzYi5hcHBlbmQoIi4iKTsgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiICBib29sZWFuVmFsdWUgaXMgbWlzc2luZy4iKTsKKyAgICAgICAgfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZygiR2V0IGJvb2xlYW5WYWx1ZSIsIGUpOworICAgICAgICAgICAgc2IuYXBwZW5kKCIgIENhbm5vdCBnZXQgYm9vbGVhblZhbHVlLiIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gVmFsaWRhdGUgdGhlIGJ5dGVFbnRyeSBlbnZpcm9ubWVudCBlbnRyeQorICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKG9rKSB7CisgICAgICAgICAgICAgICAgdmFsdWUgPSBlbnZDb250ZXh0Lmxvb2t1cCgiYnl0ZUVudHJ5Iik7CisgICAgICAgICAgICAgICAgQnl0ZSBieXRlVmFsdWUgPSAoQnl0ZSkgdmFsdWU7CisgICAgICAgICAgICAgICAgaWYgKCEoYnl0ZVZhbHVlLmJ5dGVWYWx1ZSgpID09IDEyMykpIHsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgIGJ5dGVWYWx1ZSBpcyAiKTsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGJ5dGVWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiLiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiICBieXRlVmFsdWUgY2xhc3MgaXMgIik7CisgICAgICAgICAgICBzYi5hcHBlbmQodmFsdWUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgc2IuYXBwZW5kKCIuIik7ICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiAgYnl0ZVZhbHVlIGlzIG1pc3NpbmcuIik7CisgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2coIkdldCBieXRlVmFsdWUiLCBlKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiICBDYW5ub3QgZ2V0IGJ5dGVWYWx1ZS4iKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFZhbGlkYXRlIHRoZSBkb3VibGVFbnRyeSBlbnZpcm9ubWVudCBlbnRyeQorICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKG9rKSB7CisgICAgICAgICAgICAgICAgdmFsdWUgPSBlbnZDb250ZXh0Lmxvb2t1cCgiZG91YmxlRW50cnkiKTsKKyAgICAgICAgICAgICAgICBEb3VibGUgZG91YmxlVmFsdWUgPSAoRG91YmxlKSB2YWx1ZTsKKyAgICAgICAgICAgICAgICBpZiAoIShkb3VibGVWYWx1ZS5kb3VibGVWYWx1ZSgpID09IDEyMy40NSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgIGRvdWJsZVZhbHVlIGlzICIpOworICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoZG91YmxlVmFsdWUpOworICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIi4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiAgZG91YmxlVmFsdWUgY2xhc3MgaXMgIik7CisgICAgICAgICAgICBzYi5hcHBlbmQodmFsdWUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgc2IuYXBwZW5kKCIuIik7ICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiAgZG91YmxlVmFsdWUgaXMgbWlzc2luZy4iKTsKKyAgICAgICAgfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZygiR2V0IGRvdWJsZVZhbHVlIiwgZSk7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiAgQ2Fubm90IGdldCBkb3VibGVWYWx1ZS4iKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFZhbGlkYXRlIHRoZSBmbG9hdEVudHJ5IGVudmlyb25tZW50IGVudHJ5CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAob2spIHsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IGVudkNvbnRleHQubG9va3VwKCJmbG9hdEVudHJ5Iik7CisgICAgICAgICAgICAgICAgRmxvYXQgZmxvYXRWYWx1ZSA9IChGbG9hdCkgdmFsdWU7CisgICAgICAgICAgICAgICAgZmxvYXQgZGlmZmVyZW5jZSA9IGZsb2F0VmFsdWUuZmxvYXRWYWx1ZSgpIC0gKChmbG9hdCkgNTQuMzIpOworICAgICAgICAgICAgICAgIGlmICgoZGlmZmVyZW5jZSA8ICgoZmxvYXQpIC0wLjAxKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgKGRpZmZlcmVuY2UgPiAoKGZsb2F0KSAgMC4wMSkpKSB7CisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiICBmbG9hdFZhbHVlIGlzICIpOworICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoZmxvYXRWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiLiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiICBmbG9hdFZhbHVlIGNsYXNzIGlzICIpOworICAgICAgICAgICAgc2IuYXBwZW5kKHZhbHVlLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiLiIpOyAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIgIGZsb2F0VmFsdWUgaXMgbWlzc2luZy4iKTsKKyAgICAgICAgfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZygiR2V0IGZsb2F0VmFsdWUiLCBlKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiICBDYW5ub3QgZ2V0IGZsb2F0VmFsdWUuIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBWYWxpZGF0ZSB0aGUgaW50ZWdlckVudHJ5IGVudmlyb25tZW50IGVudHJ5CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAob2spIHsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IGVudkNvbnRleHQubG9va3VwKCJpbnRlZ2VyRW50cnkiKTsKKyAgICAgICAgICAgICAgICBJbnRlZ2VyIGludGVnZXJWYWx1ZSA9IChJbnRlZ2VyKSB2YWx1ZTsKKyAgICAgICAgICAgICAgICBpZiAoIShpbnRlZ2VyVmFsdWUuaW50VmFsdWUoKSA9PSAxMjM0NSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgIGludGVnZXJWYWx1ZSBpcyAiKTsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGludGVnZXJWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiLiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiICBpbnRlZ2VyVmFsdWUgY2xhc3MgaXMgIik7CisgICAgICAgICAgICBzYi5hcHBlbmQodmFsdWUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgc2IuYXBwZW5kKCIuIik7ICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiAgaW50ZWdlclZhbHVlIGlzIG1pc3NpbmcuIik7CisgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2coIkdldCBpbnRlZ2VyVmFsdWUiLCBlKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiICBDYW5ub3QgZ2V0IGludGVnZXJWYWx1ZS4iKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFZhbGlkYXRlIHRoZSBsb25nRW50cnkgZW52aXJvbm1lbnQgZW50cnkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChvaykgeworICAgICAgICAgICAgICAgIHZhbHVlID0gZW52Q29udGV4dC5sb29rdXAoImxvbmdFbnRyeSIpOworICAgICAgICAgICAgICAgIExvbmcgbG9uZ1ZhbHVlID0gKExvbmcpIHZhbHVlOworICAgICAgICAgICAgICAgIGlmICghKGxvbmdWYWx1ZS5sb25nVmFsdWUoKSA9PSA1NDMyMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgIGxvbmdWYWx1ZSBpcyAiKTsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGxvbmdWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiLiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiICBsb25nVmFsdWUgY2xhc3MgaXMgIik7CisgICAgICAgICAgICBzYi5hcHBlbmQodmFsdWUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgc2IuYXBwZW5kKCIuIik7ICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiAgbG9uZ1ZhbHVlIGlzIG1pc3NpbmcuIik7CisgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2coIkdldCBsb25nVmFsdWUiLCBlKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiICBDYW5ub3QgZ2V0IGxvbmdWYWx1ZS4iKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFZhbGlkYXRlIHRoZSBzdHJpbmdFbnRyeSBlbnZpcm9ubWVudCBlbnRyeQorICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKG9rKSB7CisgICAgICAgICAgICAgICAgdmFsdWUgPSBlbnZDb250ZXh0Lmxvb2t1cCgic3RyaW5nRW50cnkiKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgc3RyaW5nVmFsdWUgPSAoU3RyaW5nKSB2YWx1ZTsKKyAgICAgICAgICAgICAgICBpZiAoISJTdHJpbmcgVmFsdWUiLmVxdWFscyhzdHJpbmdWYWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgIHN0cmluZ1ZhbHVlIGlzICIpOworICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoc3RyaW5nVmFsdWUpOworICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIi4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiAgc3RyaW5nVmFsdWUgY2xhc3MgaXMgIik7CisgICAgICAgICAgICBzYi5hcHBlbmQodmFsdWUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgc2IuYXBwZW5kKCIuIik7ICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiAgc3RyaW5nVmFsdWUgaXMgbWlzc2luZy4iKTsKKyAgICAgICAgfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZygiR2V0IHN0cmluZ1ZhbHVlIiwgZSk7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiAgQ2Fubm90IGdldCBzdHJpbmdWYWx1ZS4iKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFZhbGlkYXRlIHRoZSBuZXN0ZWRFbnRyeSBlbnZpcm9ubWVudCBlbnRyeQorICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKG9rKSB7CisgICAgICAgICAgICAgICAgdmFsdWUgPSBlbnZDb250ZXh0Lmxvb2t1cCgibmVzdGVkL25lc3RlZEVudHJ5Iik7CisgICAgICAgICAgICAgICAgU3RyaW5nIHN0cmluZ1ZhbHVlID0gKFN0cmluZykgdmFsdWU7CisgICAgICAgICAgICAgICAgaWYgKCEiTmVzdGVkIFZhbHVlIi5lcXVhbHMoc3RyaW5nVmFsdWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiICBzdHJpbmdWYWx1ZSBpcyAiKTsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKHN0cmluZ1ZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIgIHN0cmluZ1ZhbHVlIGNsYXNzIGlzICIpOworICAgICAgICAgICAgc2IuYXBwZW5kKHZhbHVlLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiLiIpOyAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIgIHN0cmluZ1ZhbHVlIGlzIG1pc3NpbmcuIik7CisgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2coIkdldCBzdHJpbmdWYWx1ZSIsIGUpOworICAgICAgICAgICAgc2IuYXBwZW5kKCIgIENhbm5vdCBnZXQgc3RyaW5nVmFsdWUuIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBWYWxpZGF0ZSB0aGF0IHdlIGNhbiBlbnVtZXJhdGUgdGhlIGNvbnRlbnRzIG9mIG91ciBlbnZpcm9ubWVudAorICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKG9rKSB7CisgICAgICAgICAgICAgICAgaW50IGNvdW50c1tdID0gbmV3IGludFtuYW1lcy5sZW5ndGhdOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgICAgIGNvdW50c1tpXSA9IDA7CisgICAgICAgICAgICAgICAgTmFtaW5nRW51bWVyYXRpb24gbmFtaW5nRW51bSA9CisgICAgICAgICAgICAgICAgICAgIGluaXRDb250ZXh0Lmxpc3RCaW5kaW5ncygiamF2YTpjb21wL2VudiIpOworICAgICAgICAgICAgICAgIHdoaWxlIChuYW1pbmdFbnVtLmhhc01vcmUoKSkgeworICAgICAgICAgICAgICAgICAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZykgbmFtaW5nRW51bS5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gYmluZGluZy5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZm91bmQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUuZXF1YWxzKG5hbWVzW2ldKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50c1tpXSsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKQorICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJGb3VuZCBiaW5kaW5nIGZvciAnIiArIG5hbWUgKyAiJyIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb3VudHNbaV0gPCAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiAgTWlzc2luZyBiaW5kaW5nIGZvciAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChuYW1lc1tpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIi4iKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb3VudHNbaV0gPiAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiAgRm91bmQgIik7CisgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoY291bnRzW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiIGJpbmRpbmdzIGZvciAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChuYW1lc1tpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIi4iKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZygiRW51bWVyYXRlIGVudkNvbnRleHQiLCBlKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiICBDYW5ub3QgZW51bWVyYXRlIGVudkNvbnRleHQiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlcG9ydCBvdXIgdWx0aW1hdGUgc3VjY2VzcyBvciBmYWlsdXJlCisgICAgICAgIGlmIChzYi5sZW5ndGgoKSA8IDEpCisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiSm5kaTAyIFBBU1NFRCIpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiSm5kaTAyIEZBSUxFRCAtIik7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihzYik7CisgICAgICAgIH0KKworICAgICAgICAvLyBBZGQgd3JhcHBlciBtZXNzYWdlcyBhcyByZXF1aXJlZAorICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBTdGF0aWNMb2dnZXIucmVhZCgpOworICAgICAgICAgICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKG1lc3NhZ2UpOworICAgICAgICB9CisgICAgICAgIFN0YXRpY0xvZ2dlci5yZXNldCgpOworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvTGlmZWN5Y2xlMDEuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9MaWZlY3ljbGUwMS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiOTQwYzEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvTGlmZWN5Y2xlMDEuamF2YQpAQCAtMCwwICsxLDEwMCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwLCAyMDAxICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisKKy8qKgorICogUG9zaXRpdmUgdGVzdCBmb3Igc2VydmxldCBsaWZlY3ljbGUgbWFuYWdlbWVudC4gIFRoaXMgc2VydmxldCBpcworICogPHN0cm9uZz5ub3Q8L3N0cm9uZz4gZGVjbGFyZWQgdG8gYmUgbG9hZC1vbi1zdGFydHVwLCBhbmQgdGhlIGZpcnN0IHJlcXVlc3QKKyAqIG1hZGUgdG8gaXQgc2hvdWxkIGJlIGEgIkdFVCIuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBMaWZlY3ljbGUwMSBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworICAgIHByaXZhdGUgYm9vbGVhbiBkb3VibGVkID0gZmFsc2U7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaW5pdGlhbGl6ZWQgPSBmYWxzZTsKKworICAgIHB1YmxpYyB2b2lkIGluaXQoKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChpbml0aWFsaXplZCkKKyAgICAgICAgICAgIGRvdWJsZWQgPSB0cnVlOworICAgICAgICBlbHNlCisgICAgICAgICAgICBpbml0aWFsaXplZCA9IHRydWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZGVzdHJveSgpIHsKKyAgICAgICAgaW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9wbGFpbiIpOworICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSByZXNwb25zZS5nZXRXcml0ZXIoKTsKKyAgICAgICAgaWYgKGRvdWJsZWQpIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJMaWZlY3ljbGUwMSBGQUlMRUQgLSBEb3VibGUgaW5pdGlhbGl6YXRpb24iKTsKKyAgICAgICAgfSBlbHNlIGlmIChpbml0aWFsaXplZCkgeworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIkxpZmVjeWNsZTAxIFBBU1NFRCIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIkxpZmVjeWNsZTAxIEZBSUxFRCAtIEdFVCBidXQgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIH0KKworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBTdGF0aWNMb2dnZXIucmVhZCgpOworICAgICAgICAgICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKG1lc3NhZ2UpOworICAgICAgICB9CisgICAgICAgIFN0YXRpY0xvZ2dlci5yZXNldCgpOworCisgICAgfQorCisgICAgcHVibGljIHZvaWQgZG9Qb3N0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7CisgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworICAgICAgICBpZiAoZG91YmxlZCkgeworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIkxpZmVjeWNsZTAxIEZBSUxFRCAtIFBPU1QgYW5kIGRvdWJsZSBpbml0aWFsaXphdGlvbiIpOworICAgICAgICB9IGVsc2UgaWYgKGluaXRpYWxpemVkKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiTGlmZWN5Y2xlMDEgRkFJTEVEIC0gUE9TVCBjYWxsZWQiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJMaWZlY3ljbGUwMSBGQUlMRUQgLSBQT1NUIGFuZCBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IFN0YXRpY0xvZ2dlci5yZWFkKCk7CisgICAgICAgICAgICBpZiAobWVzc2FnZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4obWVzc2FnZSk7CisgICAgICAgIH0KKyAgICAgICAgU3RhdGljTG9nZ2VyLnJlc2V0KCk7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0xpZmVjeWNsZTAyLmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvTGlmZWN5Y2xlMDIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWM2MDhmCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0xpZmVjeWNsZTAyLmphdmEKQEAgLTAsMCArMSwxMDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwgMjAwMCwgMjAwMSAsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50ZXN0ZXI7CisKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworCisvKioKKyAqIFBvc2l0aXZlIHRlc3QgZm9yIHNlcnZsZXQgbGlmZWN5Y2xlIG1hbmFnZW1lbnQuICBUaGlzIHNlcnZsZXQgaXMKKyAqIDxzdHJvbmc+bm90PC9zdHJvbmc+IGRlY2xhcmVkIHRvIGJlIGxvYWQtb24tc3RhcnR1cCwgYW5kIHRoZSBmaXJzdCByZXF1ZXN0CisgKiBtYWRlIHRvIGl0IHNob3VsZCBiZSBhICJQT1NUIi4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIExpZmVjeWNsZTAyIGV4dGVuZHMgSHR0cFNlcnZsZXQgeworCisgICAgcHJpdmF0ZSBib29sZWFuIGRvdWJsZWQgPSBmYWxzZTsKKworICAgIHByaXZhdGUgYm9vbGVhbiBpbml0aWFsaXplZCA9IGZhbHNlOworCisgICAgcHVibGljIHZvaWQgaW5pdCgpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGluaXRpYWxpemVkKQorICAgICAgICAgICAgZG91YmxlZCA9IHRydWU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGluaXRpYWxpemVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkZXN0cm95KCkgeworICAgICAgICBpbml0aWFsaXplZCA9IGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7CisgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworICAgICAgICBpZiAoZG91YmxlZCkgeworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIkxpZmVjeWNsZTAyIEZBSUxFRCAtIEdFVCBhbmQgZG91YmxlIGluaXRpYWxpemF0aW9uIik7CisgICAgICAgIH0gZWxzZSBpZiAoaW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJMaWZlY3ljbGUwMiBGQUlMRUQgLSBHRVQgY2FsbGVkIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiTGlmZWN5Y2xlMDIgRkFJTEVEIC0gR0VUIGFuZCBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IFN0YXRpY0xvZ2dlci5yZWFkKCk7CisgICAgICAgICAgICBpZiAobWVzc2FnZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4obWVzc2FnZSk7CisgICAgICAgIH0KKyAgICAgICAgU3RhdGljTG9nZ2VyLnJlc2V0KCk7CisKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkb1Bvc3QoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvcGxhaW4iKTsKKyAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisgICAgICAgIGlmIChkb3VibGVkKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiTGlmZWN5Y2xlMDIgRkFJTEVEIC0gRG91YmxlIGluaXRpYWxpemF0aW9uIik7CisgICAgICAgIH0gZWxzZSBpZiAoaW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJMaWZlY3ljbGUwMiBQQVNTRUQiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJMaWZlY3ljbGUwMiBGQUlMRUQgLSBQT1NUIGJ1dCBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IFN0YXRpY0xvZ2dlci5yZWFkKCk7CisgICAgICAgICAgICBpZiAobWVzc2FnZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4obWVzc2FnZSk7CisgICAgICAgIH0KKyAgICAgICAgU3RhdGljTG9nZ2VyLnJlc2V0KCk7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0xpZmVjeWNsZTAzLmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvTGlmZWN5Y2xlMDMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTZiY2I2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL0xpZmVjeWNsZTAzLmphdmEKQEAgLTAsMCArMSw5MSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwLCAyMDAxICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisKKy8qKgorICogVGVzdCBmb3Igc2VydmxldCBsaWZlY3ljbGUgbWFuYWdlbWVudC4gIEl0J3MgYmVoYXZpb3IgaXMgY29udHJvbGxlZCBieQorICogYSByZXF1ZXN0IHBhcmFtZXRlciA8c3Ryb25nPnN0ZXA8L3N0cm9uZz4sIHdoaWNoIG11c3QgYmUgc2V0IHRvIG9uZSBvZgorICogdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiA8dWw+CisgKiA8bGk+PGVtPjE8L2VtPiAtIFRocm93IGFuIDxjb2RlPlVuYXZhaWxhYmxlRXhjZXB0aW9uPC9jb2RlPiB0aGF0IGluZGljYXRlcworICogICAgIHBlcm1hbmVudCB1bmF2YWlsYWJsaWxpdHksIHdoaWNoIHNob3VsZCBjYXVzZSB0aGlzIHNlcnZsZXQgaW5zdGFuY2UKKyAqICAgICB0byBiZSBkZXN0cm95ZWQgYW5kIHRocm93biBhd2F5LjwvbGk+CisgKiA8bGk+PGVtPjI8L2VtPiAtIENoZWNrIHRoZSBsaWZlY3ljbGUgdmFyaWFibGVzIHRvIGVuc3VyZSB0aGF0IHRoZSBvbGQKKyAqICAgICBpbnN0YW5jZSB3YXMgbm90IHJldXNlZC48L2xpPgorICogPC91bD4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIExpZmVjeWNsZTAzIGV4dGVuZHMgSHR0cFNlcnZsZXQgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHN0YXRpY1RyYWlsID0gIiI7CisKKyAgICBwcml2YXRlIFN0cmluZyBpbnN0YW5jZVRyYWlsID0gIiI7CisKKyAgICBwdWJsaWMgdm9pZCBpbml0KCkgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24geworICAgICAgICBzdGF0aWNUcmFpbCArPSAiSSI7CisgICAgICAgIGluc3RhbmNlVHJhaWwgKz0gIkkiOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3koKSB7CisgICAgICAgIHN0YXRpY1RyYWlsICs9ICJEIjsKKyAgICAgICAgaW5zdGFuY2VUcmFpbCArPSAiRCI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgc3RhdGljVHJhaWwgKz0gIlMiOworICAgICAgICBpbnN0YW5jZVRyYWlsICs9ICJTIjsKKworICAgICAgICAvLyBGb3Igc3RlcD0xLCB0aHJvdyBhbiBleGNlcHRpb24KKyAgICAgICAgaWYgKCIxIi5lcXVhbHMocmVxdWVzdC5nZXRQYXJhbWV0ZXIoInN0ZXAiKSkpIHsKKyAgICAgICAgICAgIHN0YXRpY1RyYWlsID0gIklTIjsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbmF2YWlsYWJsZUV4Y2VwdGlvbigiTGlmZWN5Y2xlMDMgaXMgcGVybWFuZW50bHkgdW5hdmFpbGFibGUiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEZvciBzdGVwPTIsIGV2YWx1YXRlIHRoZSByZXN1bHRzLgorICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9wbGFpbiIpOworICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSByZXNwb25zZS5nZXRXcml0ZXIoKTsKKyAgICAgICAgaWYgKHN0YXRpY1RyYWlsLmVxdWFscygiSVNESVMiKSAmJiBpbnN0YW5jZVRyYWlsLmVxdWFscygiSVMiKSkKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJMaWZlY3ljbGUwMyBQQVNTRUQiKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIkxpZmVjeWNsZTAzIEZBSUxFRCAtIHN0YXRpY1RyYWlsPSIgKyBzdGF0aWNUcmFpbCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiLCBpbnN0YW5jZVRyYWlsPSIgKyBpbnN0YW5jZVRyYWlsKTsKKworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBTdGF0aWNMb2dnZXIucmVhZCgpOworICAgICAgICAgICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKG1lc3NhZ2UpOworICAgICAgICB9CisgICAgICAgIFN0YXRpY0xvZ2dlci5yZXNldCgpOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9SZWRpcmVjdDAxLmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvUmVkaXJlY3QwMS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyZDcyYzYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvUmVkaXJlY3QwMS5qYXZhCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwgMjAwMCwgMjAwMSAsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50ZXN0ZXI7CisKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lio7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7CisKKworLyoqCisgKiBQb3NpdGl2ZSB0ZXN0IGZvciBIdHRwU2VydmxldFJlc3BvbnNlLnNlbmRSZWRpcmVjdCgpLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgUmVkaXJlY3QwMSBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgYSBzZXJ2bGV0IHJlcXVlc3QgYW5kIGNyZWF0ZSB0aGUgY29ycmVzcG9uZGluZyByZXNwb25zZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9wbGFpbiIpOworICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSByZXNwb25zZS5nZXRXcml0ZXIoKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZFJlZGlyZWN0KHJlcXVlc3QuZ2V0Q29udGV4dFBhdGgoKSArICIvUmVkaXJlY3QwMWEiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJSZWRpcmVjdDAxIEZBSUxFRCAtIFRocmV3IElsbGVnYVN0YXRlRXhjZXB0aW9uIik7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSh3cml0ZXIpOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiUmVkaXJlY3QwMSBGQUlMRUQgLSBPdXRwdXQgdGV4dCBhZnRlciByZWRpcmVjdCIpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24oIlJlZGlyZWN0MDEgUG9zdC1SZWRpcmVjdCBPdXRwdXQgRXJyb3IiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCk7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gU3RhdGljTG9nZ2VyLnJlYWQoKTsKKyAgICAgICAgICAgIGlmIChtZXNzYWdlID09IG51bGwpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihtZXNzYWdlKTsKKyAgICAgICAgfQorICAgICAgICBTdGF0aWNMb2dnZXIucmVzZXQoKTsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvUmVkaXJlY3QwMWEuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9SZWRpcmVjdDAxYS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlZjA0ODgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvUmVkaXJlY3QwMWEuamF2YQpAQCAtMCwwICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAsIDIwMDEgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisKKy8qKgorICogUG9zaXRpdmUgdGVzdCBmb3IgSHR0cFNlcnZsZXRSZXNwb25zZS5zZW5kUmVkaXJlY3QoKS4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIFJlZGlyZWN0MDFhIGV4dGVuZHMgSHR0cFNlcnZsZXQgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUHJvY2VzcyBhIHNlcnZsZXQgcmVxdWVzdCBhbmQgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIHJlc3BvbnNlLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7CisgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworICAgICAgICB3cml0ZXIucHJpbnRsbigiUmVkaXJlY3QwMWEgUEFTU0VEIik7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IFN0YXRpY0xvZ2dlci5yZWFkKCk7CisgICAgICAgICAgICBpZiAobWVzc2FnZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4obWVzc2FnZSk7CisgICAgICAgIH0KKyAgICAgICAgU3RhdGljTG9nZ2VyLnJlc2V0KCk7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1JlZmxlY3Rpb24wMS5qYXZhIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1JlZmxlY3Rpb24wMS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0NTA3NjIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvUmVmbGVjdGlvbjAxLmphdmEKQEAgLTAsMCArMSwxMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwgMjAwMCwgMjAwMSAsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50ZXN0ZXI7CisKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworCisvKioKKyAqIE5lZ2F0aXZlIHRlc3QgZm9yIGFjY2VzcyB0byBDYXRhbGluYSBpbnRlcm5hbHMgdGhyb3VnaCB0aGUgb2JqZWN0cyB0aGF0CisgKiBhcmUgZXhwb3NlZCB0byB0aGlzIHNlcnZsZXQgYnkgdGhlIGNvbnRhaW5lci4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIFJlZmxlY3Rpb24wMSBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworICAgIHB1YmxpYyB2b2lkIHNlcnZpY2UoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7CisgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworICAgICAgICBTdHJpbmdCdWZmZXIgcmVzdWx0cyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKworICAgICAgICAvLyBDaGVjayB0aGUgU2VydmxldENvbmZpZyBvYmplY3QKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFNlcnZsZXRDb25maWcgc2VydmxldENvbmZpZyA9IGdldFNlcnZsZXRDb25maWcoKTsKKyAgICAgICAgICAgIE1ldGhvZCBtZXRob2QgPSBzZXJ2bGV0Q29uZmlnLmdldENsYXNzKCkuZ2V0TWV0aG9kCisgICAgICAgICAgICAgICAgKCJnZXRQYXJlbnQiLCBuZXcgQ2xhc3NbXSB7fSk7CisgICAgICAgICAgICBPYmplY3QgcGFyZW50ID0gbWV0aG9kLmludm9rZShzZXJ2bGV0Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHt9KTsKKyAgICAgICAgICAgIHJlc3VsdHMuYXBwZW5kKCIgQ2FuIHJlZmxlY3Qgb24gU2VydmxldENvbmZpZy8iKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiU2VydmxldENvbmZpZzogIiArIHQpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2hlY2sgdGhlIFNlcnZsZXRDb250ZXh0IG9iamVjdAorICAgICAgICB0cnkgeworICAgICAgICAgICAgU2VydmxldENvbnRleHQgc2VydmxldENvbnRleHQgPSBnZXRTZXJ2bGV0Q29udGV4dCgpOworICAgICAgICAgICAgTWV0aG9kIG1ldGhvZCA9IHNlcnZsZXRDb250ZXh0LmdldENsYXNzKCkuZ2V0TWV0aG9kCisgICAgICAgICAgICAgICAgKCJnZXRSZXNvdXJjZXMiLCBuZXcgQ2xhc3NbXSB7fSk7CisgICAgICAgICAgICBPYmplY3QgcmVzb3VyY2VzID0gbWV0aG9kLmludm9rZShzZXJ2bGV0Q29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7fSk7CisgICAgICAgICAgICByZXN1bHRzLmFwcGVuZCgiIENhbiByZWZsZWN0IG9uIFNlcnZsZXRDb250ZXh0LyIpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJTZXJ2bGV0Q29udGV4dDogIiArIHQpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2hlY2sgdGhlIEh0dHBTZXJ2bGV0UmVxdWVzdCBvYmplY3QKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE1ldGhvZCBtZXRob2QgPSByZXF1ZXN0LmdldENsYXNzKCkuZ2V0TWV0aG9kCisgICAgICAgICAgICAgICAgKCJnZXRJbmZvIiwgbmV3IENsYXNzW10ge30pOworICAgICAgICAgICAgT2JqZWN0IGluZm8gPSBtZXRob2QuaW52b2tlKHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHt9KTsKKyAgICAgICAgICAgIHJlc3VsdHMuYXBwZW5kKCIgQ2FuIHJlZmxlY3Qgb24gSHR0cFNlcnZsZXRSZXF1ZXN0LyIpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJIdHRwU2VydmxldFJlcXVlc3Q6ICIgKyB0KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENoZWNrIHRoZSBIdHRwU2VydmxldFJlc3BvbnNlIG9iamVjdAorICAgICAgICB0cnkgeworICAgICAgICAgICAgTWV0aG9kIG1ldGhvZCA9IHJlcXVlc3QuZ2V0Q2xhc3MoKS5nZXRNZXRob2QKKyAgICAgICAgICAgICAgICAoImdldEluZm8iLCBuZXcgQ2xhc3NbXSB7fSk7CisgICAgICAgICAgICBPYmplY3QgaW5mbyA9IG1ldGhvZC5pbnZva2UocmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10ge30pOworICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoIiBDYW4gcmVmbGVjdCBvbiBIdHRwU2VydmxldFJlc3BvbnNlLyIpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJIdHRwU2VydmxldFJlc3BvbnNlOiAiICsgdCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBDaGVjayB0aGUgSHR0cFNlc3Npb24gb2JqZWN0CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBIdHRwU2Vzc2lvbiBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uKHRydWUpOworICAgICAgICAgICAgTWV0aG9kIG1ldGhvZCA9IHNlc3Npb24uZ2V0Q2xhc3MoKS5nZXRNZXRob2QKKyAgICAgICAgICAgICAgICAoImdldEluZm8iLCBuZXcgQ2xhc3NbXSB7fSk7CisgICAgICAgICAgICByZXN1bHRzLmFwcGVuZCgiIENhbiByZWZsZWN0IG9uIEh0dHBTZXNzaW9uLyIpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJIdHRwU2Vzc2lvbjogIiArIHQpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2hlY2sgdGhlIFJlcXVlc3REaXNwYXRjaGVyIG9iamVjdAorICAgICAgICB0cnkgeworICAgICAgICAgICAgUmVxdWVzdERpc3BhdGNoZXIgcmQgPQorICAgICAgICAgICAgICAgIGdldFNlcnZsZXRDb250ZXh0KCkuZ2V0UmVxdWVzdERpc3BhdGNoZXIoIi9pbmRleC5zaHRtbCIpOworICAgICAgICAgICAgTWV0aG9kIG1ldGhvZCA9IHJkLmdldENsYXNzKCkuZ2V0TWV0aG9kCisgICAgICAgICAgICAgICAgKCJnZXRJbmZvIiwgbmV3IENsYXNzW10ge30pOworICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoIiBDYW4gcmVmbGVjdCBvbiBSZXF1ZXN0RGlzcGF0Y2hlci8iKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiUmVxdWVzdERpc3BhdGNoZXI6ICIgKyB0KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlcG9ydCBmaW5hbCByZXN1bHRzCisgICAgICAgIGlmIChyZXN1bHRzLmxlbmd0aCgpIDwgMSkKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJSZWZsZWN0aW9uMDEgUEFTU0VEIik7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgd3JpdGVyLnByaW50KCJSZWZsZWN0aW9uMDEgRkFJTEVEIC0iKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKHJlc3VsdHMudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBTdGF0aWNMb2dnZXIucmVhZCgpOworICAgICAgICAgICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKG1lc3NhZ2UpOworICAgICAgICB9CisgICAgICAgIFN0YXRpY0xvZ2dlci5yZXNldCgpOworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvUmVxdWVzdDAxLmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvUmVxdWVzdDAxLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE3MDE3ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9SZXF1ZXN0MDEuamF2YQpAQCAtMCwwICsxLDE0MCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworCisvKioKKyAqIFJlcXVlc3QgbGlzdGVuZXIgdGVzdC4gIEV4ZXJjaXNlIHZhcmlvdXMgbWV0aG9kcyBmb3IgZGVhbGluZyB3aXRoCisgKiBzZXJ2bGV0IHJlcXVlc3QgYXR0cmlidXRlcy4gIExlYXZlIGFuIGF0dHJpYnV0ZSBuYW1lZCAicmVxdWVzdDAxIgorICogcHJlc2VudCwgd2hpY2ggc2hvdWxkIGJlIGVyYXNlZCBhZnRlciBhIHdlYiBhcHBsaWNhdGlvbiByZXN0YXJ0LgorICoKKyAqIEBhdXRob3IgSnVzdHluYSBIb3J3YXQKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIFJlcXVlc3QwMSBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7CisgICAgICAgIGJvb2xlYW4gb2sgPSB0cnVlOworICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSByZXNwb25zZS5nZXRXcml0ZXIoKTsKKyAgICAgICAgU2VydmxldENvbnRleHQgY29udGV4dCA9IGdldFNlcnZsZXRDb250ZXh0KCk7CisKKyAgICAgICAgLy8gRW5zdXJlIHRoYXQgdGhlcmUgaXMgbm8gZXhpc3RpbmcgYXR0cmlidXRlCisgICAgICAgIGlmIChvaykgeworICAgICAgICAgICAgaWYgKHJlcXVlc3QuZ2V0QXR0cmlidXRlKCJyZXF1ZXN0MDEiKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIlJlcXVlc3QwMSBGQUlMRUQgLSBBdHRyaWJ1dGUgYWxyZWFkeSBleGlzdHMiKTsKKyAgICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gQ3JlYXRlIGFuZCBzdGFzaCBhIHJlcXVlc3QgYXR0cmlidXRlCisgICAgICAgIGlmIChvaykgeworICAgICAgICAgICAgQ29udGV4dEJlYW4gYmVhbiA9IG5ldyBDb250ZXh0QmVhbigpOworICAgICAgICAgICAgYmVhbi5zZXRTdHJpbmdQcm9wZXJ0eSgiUmVxdWVzdDAxIik7CisgICAgICAgICAgICByZXF1ZXN0LnNldEF0dHJpYnV0ZSgicmVxdWVzdDAxIiwgYmVhbik7CisgICAgICAgIH0KKworICAgICAgICAvLyBFbnN1cmUgdGhhdCB3ZSBjYW4gcmV0cmlldmUgdGhlIGF0dHJpYnV0ZSBzdWNjZXNzZnVsbHkKKyAgICAgICAgaWYgKG9rKSB7CisgICAgICAgICAgICBPYmplY3QgYmVhbiA9IHJlcXVlc3QuZ2V0QXR0cmlidXRlKCJyZXF1ZXN0MDEiKTsKKyAgICAgICAgICAgIGlmIChiZWFuID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiUmVxdWVzdDAxIEZBSUxFRCAtIENhbm5vdCByZXRyaWV2ZSBhdHRyaWJ1dGUiKTsKKyAgICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG9rKSB7CisgICAgICAgICAgICAgICAgaWYgKCEoYmVhbiBpbnN0YW5jZW9mIENvbnRleHRCZWFuKSkgeworICAgICAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiUmVxdWVzdDAxIEZBSUxFRCAtIEJlYW4gaW5zdGFuY2Ugb2YgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlYW4uZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChvaykgeworICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9ICgoQ29udGV4dEJlYW4pIGJlYW4pLmdldFN0cmluZ1Byb3BlcnR5KCk7CisgICAgICAgICAgICAgICAgaWYgKCEiUmVxdWVzdDAxIi5lcXVhbHModmFsdWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJSZXF1ZXN0MDEgRkFJTEVEIC0gVmFsdWUgPSAiICsgdmFsdWUpOworICAgICAgICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChvaykgeworICAgICAgICAgICAgICAgIFN0cmluZyBsaWZlY3ljbGUgPSAoKENvbnRleHRCZWFuKSBiZWFuKS5nZXRMaWZlY3ljbGUoKTsKKyAgICAgICAgICAgICAgICBpZiAoISIvYWRkIi5lcXVhbHMobGlmZWN5Y2xlKSkgeworICAgICAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiUmVxdWVzdDAxIEZBSUxFRCAtIEJlYW4gbGlmZWN5Y2xlIGlzICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWZlY3ljbGUpOworICAgICAgICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEVuc3VyZSB0aGF0IHdlIGNhbiB1cGRhdGUgdGhpcyBhdHRyaWJ1dGUgYW5kIGNoZWNrIGl0cyBsaWZlY3ljbGUKKyAgICAgICAgaWYgKG9rKSB7CisgICAgICAgICAgICBDb250ZXh0QmVhbiBiZWFuID0gKENvbnRleHRCZWFuKSByZXF1ZXN0LmdldEF0dHJpYnV0ZSgicmVxdWVzdDAxIik7CisgICAgICAgICAgICByZXF1ZXN0LnNldEF0dHJpYnV0ZSgicmVxdWVzdDAxIiwgYmVhbik7CisgICAgICAgICAgICBTdHJpbmcgbGlmZWN5Y2xlID0gYmVhbi5nZXRMaWZlY3ljbGUoKTsKKyAgICAgICAgICAgIGlmICghIi9hZGQvcmVwIi5lcXVhbHMobGlmZWN5Y2xlKSkgeworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJSZXF1ZXN0MDEgRkFJTEVEIC0gQmVhbiBsaWZlY3ljbGUgaXMgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlmZWN5Y2xlKTsKKyAgICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gRW5zdXJlIHRoYXQgd2UgY2FuIHJlbW92ZSB0aGlzIGF0dHJpYnV0ZSBhbmQgY2hlY2sgaXRzIGxpZmVjeWNsZQorICAgICAgICBpZiAob2spIHsKKyAgICAgICAgICAgIENvbnRleHRCZWFuIGJlYW4gPSAoQ29udGV4dEJlYW4pIHJlcXVlc3QuZ2V0QXR0cmlidXRlKCJyZXF1ZXN0MDEiKTsKKyAgICAgICAgICAgIHJlcXVlc3QucmVtb3ZlQXR0cmlidXRlKCJyZXF1ZXN0MDEiKTsKKyAgICAgICAgICAgIFN0cmluZyBsaWZlY3ljbGUgPSBiZWFuLmdldExpZmVjeWNsZSgpOworICAgICAgICAgICAgaWYgKCEiL2FkZC9yZXAvcmVtIi5lcXVhbHMobGlmZWN5Y2xlKSkgeworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJSZXF1ZXN0MDEgRkFJTEVEIC0gQmVhbiBsaWZlY3ljbGUgaXMgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlmZWN5Y2xlKTsKKyAgICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gQWRkIGEgYmVhbiBiYWNrIGZvciB0aGUgcmVzdGFydCBhcHBsaWNhdGlvbiB0ZXN0CisgICAgICAgIHJlcXVlc3Quc2V0QXR0cmlidXRlKCJyZXF1ZXN0MDEiLCBuZXcgQ29udGV4dEJlYW4oKSk7CisKKyAgICAgICAgLy8gRW5zdXJlIHRoYXQgc2V0QXR0cmlidXRlKCJuYW1lIiwgbnVsbCkgd29ya3MgY29ycmVjdGx5CisgICAgICAgIGlmIChvaykgeworICAgICAgICAgICAgcmVxdWVzdC5zZXRBdHRyaWJ1dGUoIkZPTyIsICJCQVIiKTsKKyAgICAgICAgICAgIHJlcXVlc3Quc2V0QXR0cmlidXRlKCJGT08iLCBudWxsKTsKKyAgICAgICAgICAgIGlmIChyZXF1ZXN0LmdldEF0dHJpYnV0ZSgiRk9PIikgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJSZXF1ZXN0MDEgRkFJTEVEIC0gc2V0QXR0cmlidXRlKG5hbWUsbnVsbCkiKTsKKyAgICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gUmVwb3J0IHN1Y2Nlc3MgaWYgZXZlcnl0aGluZyBpcyBzdGlsbCBvaworICAgICAgICBpZiAob2spCisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiUmVxdWVzdDAxIFBBU1NFRCIpOworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBTdGF0aWNMb2dnZXIucmVhZCgpOworICAgICAgICAgICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKG1lc3NhZ2UpOworICAgICAgICB9CisgICAgICAgIFN0YXRpY0xvZ2dlci5yZXNldCgpOworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvUmVxdWVzdExpc3RlbmVyMDEuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9SZXF1ZXN0TGlzdGVuZXIwMS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3NTY5M2EKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvUmVxdWVzdExpc3RlbmVyMDEuamF2YQpAQCAtMCwwICsxLDg1IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAsIDIwMDEgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisvKioKKyAqIEFwcGxpY2F0aW9uIGV2ZW50IGxpc3RlbmVyIGZvciByZXF1ZXN0IGV2ZW50cy4gIEFsbCBldmVudHMgdGhhdCBvY2N1cgorICogYXJlIGxvZ2dlZCBhcHByb3ByaWF0ZWx5IHRvIHRoZSBzdGF0aWMgbG9nZ2VyLi4KKyAqCisgKiBAYXV0aG9yIEp1c3R5bmEgSG9yd2F0CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBSZXF1ZXN0TGlzdGVuZXIwMQorICAgIGltcGxlbWVudHMgU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVMaXN0ZW5lciwgU2VydmxldFJlcXVlc3RMaXN0ZW5lciB7CisKKworICAgIHB1YmxpYyB2b2lkIGF0dHJpYnV0ZUFkZGVkKFNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJSZXF1ZXN0TGlzdGVuZXIwMTogYXR0cmlidXRlQWRkZWQoIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5nZXROYW1lKCkgKyAiLCIgKyBldmVudC5nZXRWYWx1ZSgpICsgIikiKTsKKyAgICAgICAgU2VydmxldENvbnRleHQgY29udGV4dCA9IChTZXJ2bGV0Q29udGV4dCkgZXZlbnQuZ2V0U291cmNlKCk7CisgICAgICAgIGNvbnRleHQubG9nKCJSZXF1ZXN0TGlzdGVuZXIwMTogYXR0cmlidXRlQWRkZWQoIiArCisgICAgICAgICAgICAgICAgICAgIGV2ZW50LmdldE5hbWUoKSArICIsIiArIGV2ZW50LmdldFZhbHVlKCkgKyAiKSIpOworICAgICAgICBpZiAoZXZlbnQuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIENvbnRleHRCZWFuKSB7CisgICAgICAgICAgICBDb250ZXh0QmVhbiBiZWFuID0gKENvbnRleHRCZWFuKSBldmVudC5nZXRWYWx1ZSgpOworICAgICAgICAgICAgYmVhbi5zZXRMaWZlY3ljbGUoYmVhbi5nZXRMaWZlY3ljbGUoKSArICIvYWRkIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhdHRyaWJ1dGVSZW1vdmVkKFNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJSZXF1ZXN0TGlzdGVuZXIwMTogYXR0cmlidXRlUmVtb3ZlZCgiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmdldE5hbWUoKSArICIsIiArIGV2ZW50LmdldFZhbHVlKCkgKyAiKSIpOworICAgICAgICBTZXJ2bGV0Q29udGV4dCBjb250ZXh0ID0gKFNlcnZsZXRDb250ZXh0KSBldmVudC5nZXRTb3VyY2UoKTsKKyAgICAgICAgY29udGV4dC5sb2coIlJlcXVlc3RMaXN0ZW5lcjAxOiBhdHRyaWJ1dGVSZW1vdmVkKCIgKworICAgICAgICAgICAgICAgICAgICBldmVudC5nZXROYW1lKCkgKyAiLCIgKyBldmVudC5nZXRWYWx1ZSgpICsgIikiKTsKKyAgICAgICAgaWYgKGV2ZW50LmdldFZhbHVlKCkgaW5zdGFuY2VvZiBDb250ZXh0QmVhbikgeworICAgICAgICAgICAgQ29udGV4dEJlYW4gYmVhbiA9IChDb250ZXh0QmVhbikgZXZlbnQuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgIGJlYW4uc2V0TGlmZWN5Y2xlKGJlYW4uZ2V0TGlmZWN5Y2xlKCkgKyAiL3JlbSIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYXR0cmlidXRlUmVwbGFjZWQoU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVFdmVudCBldmVudCkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlJlcXVlc3RMaXN0ZW5lcjAxOiBhdHRyaWJ1dGVSZXBsYWNlZCgiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmdldE5hbWUoKSArICIsIiArIGV2ZW50LmdldFZhbHVlKCkgKyAiKSIpOworICAgICAgICBTZXJ2bGV0Q29udGV4dCBjb250ZXh0ID0gKFNlcnZsZXRDb250ZXh0KSBldmVudC5nZXRTb3VyY2UoKTsKKyAgICAgICAgY29udGV4dC5sb2coIlJlcXVlc3RMaXN0ZW5lcjAxOiBhdHRyaWJ1dGVSZXBsYWNlZCgiICsKKyAgICAgICAgICAgICAgICAgICAgZXZlbnQuZ2V0TmFtZSgpICsgIiwiICsgZXZlbnQuZ2V0VmFsdWUoKSArICIpIik7CisgICAgICAgIGlmIChldmVudC5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgQ29udGV4dEJlYW4pIHsKKyAgICAgICAgICAgIENvbnRleHRCZWFuIGJlYW4gPSAoQ29udGV4dEJlYW4pIGV2ZW50LmdldFZhbHVlKCk7CisgICAgICAgICAgICBiZWFuLnNldExpZmVjeWNsZShiZWFuLmdldExpZmVjeWNsZSgpICsgIi9yZXAiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlcXVlc3REZXN0cm95ZWQoU2VydmxldFJlcXVlc3RFdmVudCBldmVudCkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlJlcXVlc3RMaXN0ZW5lcjAxOiByZXF1ZXN0RGVzdHJveWVkKCkgLS0gcHJvYmFibHkgY2FjaGVkIGZyb20gcHJldmlvdXMgcmVxdWVzdCIpOworICAgICAgICBTZXJ2bGV0Q29udGV4dCBjb250ZXh0ID0gKFNlcnZsZXRDb250ZXh0KSBldmVudC5nZXRTb3VyY2UoKTsKKyAgICAgICAgY29udGV4dC5sb2coIlJlcXVlc3RMaXN0ZW5lcjAxOiByZXF1ZXN0RGVzdHJveWVkKCkiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZXF1ZXN0SW5pdGlhbGl6ZWQoU2VydmxldFJlcXVlc3RFdmVudCBldmVudCkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlJlcXVlc3RMaXN0ZW5lcjAxOiByZXF1ZXN0SW5pdGlhbGl6ZWQoKSIpOworICAgICAgICBTZXJ2bGV0Q29udGV4dCBjb250ZXh0ID0gKFNlcnZsZXRDb250ZXh0KSBldmVudC5nZXRTb3VyY2UoKTsKKyAgICAgICAgY29udGV4dC5sb2coIlJlcXVlc3RMaXN0ZW5lcjAxOiByZXF1ZXN0SW5pdGlhbGl6ZWQoKSIpOworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvUmVzZXQwMS5qYXZhIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1Jlc2V0MDEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTJhYWE5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1Jlc2V0MDEuamF2YQpAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisKKy8qKgorICogUG9zaXRpdmUgdGVzdCBmb3IgU2VydmxldFJlc3BvbnNlLnJlc2V0KCkuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBSZXNldDAxIGV4dGVuZHMgR2VuZXJpY1NlcnZsZXQgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUHJvY2VzcyBhIHNlcnZsZXQgcmVxdWVzdCBhbmQgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIHJlc3BvbnNlLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXJ2aWNlKFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9wbGFpbiIpOworICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSByZXNwb25zZS5nZXRXcml0ZXIoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJSZXNldDAxIEZBSUxFRCAtIERpZCBub3QgcmVzZXQgYnVmZmVyIik7CisgICAgICAgICAgICByZXNwb25zZS5yZXNldCgpOworICAgICAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvcGxhaW4iKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJSZXNldDAxIFBBU1NFRCIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIlJlc2V0MDEgRkFJTEVEIC0gVGhyZXcgSWxsZWdhU3RhdGVFeGNlcHRpb24iKTsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKHdyaXRlcik7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gU3RhdGljTG9nZ2VyLnJlYWQoKTsKKyAgICAgICAgICAgIGlmIChtZXNzYWdlID09IG51bGwpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihtZXNzYWdlKTsKKyAgICAgICAgfQorICAgICAgICBTdGF0aWNMb2dnZXIucmVzZXQoKTsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvUmVzb3VyY2VzMDEuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9SZXNvdXJjZXMwMS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkZGI3YmMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvUmVzb3VyY2VzMDEuamF2YQpAQCAtMCwwICsxLDg2IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAsIDIwMDEgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lio7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7CisKKworLyoqCisgKiBQb3NpdGl2ZSB0ZXN0IGZvciA8Y29kZT5TZXJ2bGV0Q29udGV4dC5nZXRSZXNvdXJjZSgpPC9jb2RlPiBhcyB3ZWxsIGFzCisgKiA8Y29kZT5DbGFzc0xvYWRlci5nZXRSZXNvdXJjZSgpPC9jb2RlPi4gIE9wZXJhdGlvbiBpcyBjb250cm9sbGVkIGJ5IHF1ZXJ5CisgKiBwYXJhbWV0ZXJzOgorICogPHVsPgorICogPGxpPjxzdHJvbmc+bW9kZTwvc3Ryb25nPiAtIFVzZSA8Y29kZT5jb250ZXh0PC9jb2RlPiBmb3Igc2VydmxldCBjb250ZXh0CisgKiAgICAgdGVzdCwgb3IgPGNvZGU+Y2xhc3M8L2NvZGU+IGZvciBjbGFzcyBsb2FkZXIgdGVzdC4gIFtjb250ZXh0XTwvbGk+CisgKiA8bGk+PHN0cm9uZz5wYXRoPC9zdHJvbmc+IC0gUmVzb3VyY2UgcGF0aCB0byB0aGUgcmVxdWVzdGVkIHJlc291cmNlLAorICogICAgIHN0YXJ0aW5nIHdpdGggYSBzbGFzaC4gIFsvV0VCLUlORi93ZWIueG1sXTwvbGk+CisgKiA8L3VsPgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgUmVzb3VyY2VzMDEgZXh0ZW5kcyBIdHRwU2VydmxldCB7CisKKyAgICBwdWJsaWMgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICAvLyBJZGVudGlmeSBvdXIgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCisgICAgICAgIFN0cmluZyBtb2RlID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoIm1vZGUiKTsKKyAgICAgICAgaWYgKG1vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIG1vZGUgPSAiY29udGV4dCI7CisgICAgICAgIFN0cmluZyBwYXRoID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoInBhdGgiKTsKKyAgICAgICAgaWYgKHBhdGggPT0gbnVsbCkKKyAgICAgICAgICAgIHBhdGggPSAiL1dFQi1JTkYvd2ViLnhtbCI7CisKKyAgICAgICAgLy8gRXhlY3V0ZSB0aGUgZGVzaXJlZCB0ZXN0CisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7CisgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworICAgICAgICBVUkwgdXJsID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICgiY29udGV4dCIuZXF1YWxzKG1vZGUpKQorICAgICAgICAgICAgICAgIHVybCA9IGdldFNlcnZsZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2UocGF0aCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdXJsID0gdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlKHBhdGgpOworICAgICAgICAgICAgaWYgKHVybCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJSZXNvdXJjZXMwMSBGQUlMRUQgLSBObyBVUkwgd2FzIHJldHVybmVkIik7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiUmVzb3VyY2VzMDEgUEFTU0VEIik7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oInVybCA9ICIgKyB1cmwudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiUmVzb3VyY2VzMDEgRkFJTEVEIC0gTWFsZm9ybWVkVVJMRXhjZXB0aW9uOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQWRkIHdyYXBwZXIgbWVzc2FnZXMgYXMgcmVxdWlyZWQKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gU3RhdGljTG9nZ2VyLnJlYWQoKTsKKyAgICAgICAgICAgIGlmIChtZXNzYWdlID09IG51bGwpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihtZXNzYWdlKTsKKyAgICAgICAgfQorICAgICAgICBTdGF0aWNMb2dnZXIucmVzZXQoKTsKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1Jlc291cmNlczAxLnR4dCBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9SZXNvdXJjZXMwMS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc1ZGU1OAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9SZXNvdXJjZXMwMS50eHQKQEAgLTAsMCArMSBAQAorUmVzb3VyY2VzMDEgUEFTU0VECmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvUmVzb3VyY2VzMDIuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9SZXNvdXJjZXMwMi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlMDBjMTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvUmVzb3VyY2VzMDIuamF2YQpAQCAtMCwwICsxLDg1IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAsIDIwMDEgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lio7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7CisKKworLyoqCisgKiBOZWdhdGl2ZSB0ZXN0IGZvciA8Y29kZT5TZXJ2bGV0Q29udGV4dC5nZXRSZXNvdXJjZSgpPC9jb2RlPiBhcyB3ZWxsIGFzCisgKiA8Y29kZT5DbGFzc0xvYWRlci5nZXRSZXNvdXJjZSgpPC9jb2RlPi4gIE9wZXJhdGlvbiBpcyBjb250cm9sbGVkIGJ5IHF1ZXJ5CisgKiBwYXJhbWV0ZXJzOgorICogPHVsPgorICogPGxpPjxzdHJvbmc+bW9kZTwvc3Ryb25nPiAtIFVzZSA8Y29kZT5jb250ZXh0PC9jb2RlPiBmb3Igc2VydmxldCBjb250ZXh0CisgKiAgICAgdGVzdCwgb3IgPGNvZGU+Y2xhc3M8L2NvZGU+IGZvciBjbGFzcyBsb2FkZXIgdGVzdC4gIFtjb250ZXh0XTwvbGk+CisgKiA8bGk+PHN0cm9uZz5wYXRoPC9zdHJvbmc+IC0gUmVzb3VyY2UgcGF0aCB0byB0aGUgcmVxdWVzdGVkIHJlc291cmNlLAorICogICAgIHN0YXJ0aW5nIHdpdGggYSBzbGFzaC4gIFsvV0VCLUlORi93ZWIueG1sXTwvbGk+CisgKiA8L3VsPgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgUmVzb3VyY2VzMDIgZXh0ZW5kcyBIdHRwU2VydmxldCB7CisKKyAgICBwdWJsaWMgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICAvLyBJZGVudGlmeSBvdXIgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCisgICAgICAgIFN0cmluZyBtb2RlID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoIm1vZGUiKTsKKyAgICAgICAgaWYgKG1vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIG1vZGUgPSAiY29udGV4dCI7CisgICAgICAgIFN0cmluZyBwYXRoID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoInBhdGgiKTsKKyAgICAgICAgaWYgKHBhdGggPT0gbnVsbCkKKyAgICAgICAgICAgIHBhdGggPSAiL1dFQi1JTkYvd2ViLnhtbCI7CisKKyAgICAgICAgLy8gRXhlY3V0ZSB0aGUgZGVzaXJlZCB0ZXN0CisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7CisgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworICAgICAgICBVUkwgdXJsID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICgiY29udGV4dCIuZXF1YWxzKG1vZGUpKQorICAgICAgICAgICAgICAgIHVybCA9IGdldFNlcnZsZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2UocGF0aCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdXJsID0gdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlKHBhdGgpOworICAgICAgICAgICAgaWYgKHVybCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJSZXNvdXJjZXMwMiBQQVNTRUQiKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiUmVzb3VyY2VzMDIgRkFJTEVEIC0gUmV0dXJuZWQgVVJMICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybC50b1N0cmluZygpKTsKKyAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJSZXNvdXJjZXMwMiBGQUlMRUQgLSBNYWxmb3JtZWRVUkxFeGNlcHRpb246ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBBZGQgd3JhcHBlciBtZXNzYWdlcyBhcyByZXF1aXJlZAorICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBTdGF0aWNMb2dnZXIucmVhZCgpOworICAgICAgICAgICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKG1lc3NhZ2UpOworICAgICAgICB9CisgICAgICAgIFN0YXRpY0xvZ2dlci5yZXNldCgpOworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvUmVzb3VyY2VzMDMuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9SZXNvdXJjZXMwMy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzNTA1ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvUmVzb3VyY2VzMDMuamF2YQpAQCAtMCwwICsxLDExMCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwLCAyMDAxICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisKKy8qKgorICogUG9zaXRpdmUgdGVzdCBmb3IgPGNvZGU+U2VydmxldENvbnRleHQuZ2V0UmVzb3VyY2VBc1N0cmVhbSgpPC9jb2RlPiBhcyB3ZWxsCisgKiBhcyA8Y29kZT5DbGFzc0xvYWRlci5nZXRSZXNvdXJjZUFzU3RyZWFtKCk8L2NvZGU+LiAgT3BlcmF0aW9uIGlzIGNvbnRyb2xsZWQKKyAqIGJ5IHF1ZXJ5IHBhcmFtZXRlcnM6CisgKiA8dWw+CisgKiA8bGk+PHN0cm9uZz5tb2RlPC9zdHJvbmc+IC0gVXNlIDxjb2RlPmNvbnRleHQ8L2NvZGU+IGZvciBzZXJ2bGV0IGNvbnRleHQKKyAqICAgICB0ZXN0LCBvciA8Y29kZT5jbGFzczwvY29kZT4gZm9yIGNsYXNzIGxvYWRlciB0ZXN0LiAgW2NvbnRleHRdPC9saT4KKyAqIDxsaT48c3Ryb25nPnBhdGg8L3N0cm9uZz4gLSBSZXNvdXJjZSBwYXRoIHRvIHRoZSByZXF1ZXN0ZWQgcmVzb3VyY2UsCisgKiAgICAgc3RhcnRpbmcgd2l0aCBhIHNsYXNoLiAgWy9XRUItSU5GL3dlYi54bWxdPC9saT4KKyAqIDwvdWw+CisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBSZXNvdXJjZXMwMyBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIElkZW50aWZ5IG91ciBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMKKyAgICAgICAgU3RyaW5nIG1vZGUgPSByZXF1ZXN0LmdldFBhcmFtZXRlcigibW9kZSIpOworICAgICAgICBpZiAobW9kZSA9PSBudWxsKQorICAgICAgICAgICAgbW9kZSA9ICJjb250ZXh0IjsKKyAgICAgICAgU3RyaW5nIHBhdGggPSByZXF1ZXN0LmdldFBhcmFtZXRlcigicGF0aCIpOworICAgICAgICBpZiAocGF0aCA9PSBudWxsKQorICAgICAgICAgICAgcGF0aCA9ICIvV0VCLUlORi93ZWIueG1sIjsKKworICAgICAgICAvLyBFeGVjdXRlIHRoZSBkZXNpcmVkIHRlc3QKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvcGxhaW4iKTsKKyAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisgICAgICAgIElucHV0U3RyZWFtIGlzID0gbnVsbDsKKyAgICAgICAgVVJMIHVybCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoImNvbnRleHQiLmVxdWFscyhtb2RlKSkgeworICAgICAgICAgICAgICAgIGlzID0gZ2V0U2VydmxldENvbnRleHQoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKHBhdGgpOworICAgICAgICAgICAgICAgIHVybCA9IGdldFNlcnZsZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2UocGF0aCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlzID0gdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlQXNTdHJlYW0ocGF0aCk7CisgICAgICAgICAgICAgICAgdXJsID0gdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlKHBhdGgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHVybCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKGlzID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJSZXNvdXJjZXMwMyBGQUlMRUQgLSBObyBJUyBvciBVUkwgd2FzIHJldHVybmVkIik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiUmVzb3VyY2VzMDMgRkFJTEVEIC0gUmV0dXJuZWQgSVMgYnV0IG5vIFVSTCIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoaXMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIlJlc291cmNlczAzIEZBSUxFRCAtIFJldHVybmVkIFVSTCBidXQgbm8gSVMiKTsKKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW1SZWFkZXIgaXNyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGlzKTsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBjID0gaXNyLnJlYWQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgY2ggPSAoY2hhcikgYzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaCA8ICcgJykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci5wcmludChjaCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaXNyLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCk7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oInVybCA9ICIgKyB1cmwudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiUmVzb3VyY2VzMDMgRkFJTEVEIC0gTWFsZm9ybWVkVVJMRXhjZXB0aW9uOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiUmVzb3VyY2VzMDMgRkFJTEVEIC0gSU9FeGNlcHRpb246ICIgKyBlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEFkZCB3cmFwcGVyIG1lc3NhZ2VzIGFzIHJlcXVpcmVkCisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IFN0YXRpY0xvZ2dlci5yZWFkKCk7CisgICAgICAgICAgICBpZiAobWVzc2FnZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4obWVzc2FnZSk7CisgICAgICAgIH0KKyAgICAgICAgU3RhdGljTG9nZ2VyLnJlc2V0KCk7CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9SZXNvdXJjZXMwMy50eHQgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvUmVzb3VyY2VzMDMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3MGI0ODQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvUmVzb3VyY2VzMDMudHh0CkBAIC0wLDAgKzEgQEAKK1Jlc291cmNlczAzIFBBU1NFRApkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1Jlc291cmNlczA0LmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvUmVzb3VyY2VzMDQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjRmMTlhCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1Jlc291cmNlczA0LmphdmEKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwLCAyMDAxICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisKKy8qKgorICogTmVnYXRpdmUgdGVzdCBmb3IgPGNvZGU+U2VydmxldENvbnRleHQuZ2V0UmVzb3VyY2VBc1N0cmVhbSgpPC9jb2RlPiBhcyB3ZWxsCisgKiBhcyA8Y29kZT5DbGFzc0xvYWRlci5nZXRSZXNvdXJjZUFzU3RyZWFtKCk8L2NvZGU+LiAgT3BlcmF0aW9uIGlzIGNvbnRyb2xsZWQKKyAqIGJ5IHF1ZXJ5IHBhcmFtZXRlcnM6CisgKiA8dWw+CisgKiA8bGk+PHN0cm9uZz5tb2RlPC9zdHJvbmc+IC0gVXNlIDxjb2RlPmNvbnRleHQ8L2NvZGU+IGZvciBzZXJ2bGV0IGNvbnRleHQKKyAqICAgICB0ZXN0LCBvciA8Y29kZT5jbGFzczwvY29kZT4gZm9yIGNsYXNzIGxvYWRlciB0ZXN0LiAgW2NvbnRleHRdPC9saT4KKyAqIDxsaT48c3Ryb25nPnBhdGg8L3N0cm9uZz4gLSBSZXNvdXJjZSBwYXRoIHRvIHRoZSByZXF1ZXN0ZWQgcmVzb3VyY2UsCisgKiAgICAgc3RhcnRpbmcgd2l0aCBhIHNsYXNoLiAgWy9XRUItSU5GL3dlYi54bWxdPC9saT4KKyAqIDwvdWw+CisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBSZXNvdXJjZXMwNCBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIElkZW50aWZ5IG91ciBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMKKyAgICAgICAgU3RyaW5nIG1vZGUgPSByZXF1ZXN0LmdldFBhcmFtZXRlcigibW9kZSIpOworICAgICAgICBpZiAobW9kZSA9PSBudWxsKQorICAgICAgICAgICAgbW9kZSA9ICJjb250ZXh0IjsKKyAgICAgICAgU3RyaW5nIHBhdGggPSByZXF1ZXN0LmdldFBhcmFtZXRlcigicGF0aCIpOworICAgICAgICBpZiAocGF0aCA9PSBudWxsKQorICAgICAgICAgICAgcGF0aCA9ICIvV0VCLUlORi93ZWIueG1sIjsKKworICAgICAgICAvLyBFeGVjdXRlIHRoZSBkZXNpcmVkIHRlc3QKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvcGxhaW4iKTsKKyAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisgICAgICAgIElucHV0U3RyZWFtIGlzID0gbnVsbDsKKyAgICAgICAgVVJMIHVybCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoImNvbnRleHQiLmVxdWFscyhtb2RlKSkgeworICAgICAgICAgICAgICAgIGlzID0gZ2V0U2VydmxldENvbnRleHQoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKHBhdGgpOworICAgICAgICAgICAgICAgIHVybCA9IGdldFNlcnZsZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2UocGF0aCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlzID0gdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlQXNTdHJlYW0ocGF0aCk7CisgICAgICAgICAgICAgICAgdXJsID0gdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlKHBhdGgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGlzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAodXJsID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJSZXNvdXJjZXMwNCBQQVNTRUQiKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJSZXNvdXJjZXMwNCBGQUlMRUQgLSBTdHJlYW0gaXMgbnVsbCBidXQgVVJMIGlzICIgKyB1cmwpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAodXJsICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJSZXNvdXJjZXMwNCBGQUlMRUQgLSBTdHJlYW0gaXMgbm90IG51bGwgYW5kICBVUkwgaXMgIiArIHVybCk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiUmVzb3VyY2VzMDQgRkFJTEVEIC0gU3RyZWFtIGlzIG5vdCBudWxsIGFuZCBVUkwgaXMgbnVsbCIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIlJlc291cmNlczA0IEZBSUxFRCAtIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbjogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEFkZCB3cmFwcGVyIG1lc3NhZ2VzIGFzIHJlcXVpcmVkCisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IFN0YXRpY0xvZ2dlci5yZWFkKCk7CisgICAgICAgICAgICBpZiAobWVzc2FnZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4obWVzc2FnZSk7CisgICAgICAgIH0KKyAgICAgICAgU3RhdGljTG9nZ2VyLnJlc2V0KCk7CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9SZXNvdXJjZXMwNS5qYXZhIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1Jlc291cmNlczA1LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY0Y2IwYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9SZXNvdXJjZXMwNS5qYXZhCkBAIC0wLDAgKzEsMTQ4IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAsIDIwMDEgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lio7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7CisKKworLyoqCisgKiBQb3NpdGl2ZSB0ZXN0IGZvciA8Y29kZT5TZXJ2bGV0Q29udGV4dC5nZXRSZXNvdXJjZSgpPC9jb2RlPiBhcyB3ZWxsIGFzCisgKiA8Y29kZT5DbGFzc0xvYWRlci5nZXRSZXNvdXJjZSgpPC9jb2RlPi4gIFRoZSBVUkwgcmV0dXJuZWQgYnkKKyAqIHRoZXNlIGNhbGxzIGlzIHRoZW4gb3BlbmVkIHdpdGggPGNvZGU+dXJsLm9wZW5TdHJlYW0oKTwvY29kZT4KKyAqIGluIG9yZGVyIHRvIGVuc3VyZSB0aGF0IHRoZSBjb3JyZWN0IGRhdGEgaXMgYWN0dWFsbHkgcmVhZC4KKyAqIE9wZXJhdGlvbiBpcyBjb250cm9sbGVkIGJ5IHF1ZXJ5IHBhcmFtZXRlcnM6CisgKiA8dWw+CisgKiA8bGk+PHN0cm9uZz5tb2RlPC9zdHJvbmc+IC0gVXNlIDxjb2RlPmNvbnRleHQ8L2NvZGU+IGZvciBzZXJ2bGV0IGNvbnRleHQKKyAqICAgICB0ZXN0LCBvciA8Y29kZT5jbGFzczwvY29kZT4gZm9yIGNsYXNzIGxvYWRlciB0ZXN0LiAgW2NvbnRleHRdPC9saT4KKyAqIDxsaT48c3Ryb25nPnBhdGg8L3N0cm9uZz4gLSBSZXNvdXJjZSBwYXRoIHRvIHRoZSByZXF1ZXN0ZWQgcmVzb3VyY2UsCisgKiAgICAgc3RhcnRpbmcgd2l0aCBhIHNsYXNoLiAgWy9XRUItSU5GL3dlYi54bWxdPC9saT4KKyAqIDxsaT48c3Ryb25nPnN0cmluZ2lmeTwvc3Ryb25nPiAtIElmIHNldCB0byBhbnkgYXJiaXRyYXJ5IHZhbHVlLCB0aGUgVVJMCisgKiAgICAgcmV0dXJuZWQgYnkgZ2V0UmVzb3VyY2UoKSB3aWxsIGJlIGNvbnZlcnRlZCB0byBhIFN0cmluZyBhbmQgdGhlbiBiYWNrCisgKiAgICAgdG8gYSBVUkwgYmVmb3JlIGJlaW5nIG9wZW5lZC4gIFtub3Qgc2V0XTwvbGk+CisgKiA8L3VsPgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgUmVzb3VyY2VzMDUgZXh0ZW5kcyBIdHRwU2VydmxldCB7CisKKyAgICBwdWJsaWMgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICAvLyBJZGVudGlmeSBvdXIgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCisgICAgICAgIFN0cmluZyBtb2RlID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoIm1vZGUiKTsKKyAgICAgICAgaWYgKG1vZGUgPT0gbnVsbCkKKyAgICAgICAgICAgIG1vZGUgPSAiY29udGV4dCI7CisgICAgICAgIFN0cmluZyBwYXRoID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoInBhdGgiKTsKKyAgICAgICAgaWYgKHBhdGggPT0gbnVsbCkKKyAgICAgICAgICAgIHBhdGggPSAiL1dFQi1JTkYvd2ViLnhtbCI7CisgICAgICAgIGJvb2xlYW4gc3RyaW5naWZ5ID0gKHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJzdHJpbmdpZnkiKSAhPSBudWxsKTsKKworICAgICAgICAvLyBQcmVwYXJlIGZvciB0aGUgZGVzaXJlZCB0ZXN0CisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7CisgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IG51bGw7CisgICAgICAgIElucHV0U3RyZWFtUmVhZGVyIGlzciA9IG51bGw7CisgICAgICAgIFVSTCB1cmwgPSBudWxsOworICAgICAgICBTdHJpbmdCdWZmZXIgcmVzdWx0cyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgYm9vbGVhbiBvayA9IHRydWU7CisKKyAgICAgICAgLy8gQWNxdWlyZSB0aGUgYXBwcm9wcmlhdGUgVVJMCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoImNvbnRleHQiLmVxdWFscyhtb2RlKSkKKyAgICAgICAgICAgICAgICB1cmwgPSBnZXRTZXJ2bGV0Q29udGV4dCgpLmdldFJlc291cmNlKHBhdGgpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHVybCA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZShwYXRoKTsKKyAgICAgICAgICAgIGlmICh1cmwgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJlc3VsdHMuYXBwZW5kKCIgTm8gVVJMIHJldHVybmVkIik7CisgICAgICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJlc3VsdHMuYXBwZW5kKCIgZ2V0UmVzb3VyY2UgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIik7CisgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gU3RyaW5naWZ5IHRoZSBVUkwgaWYgcmVxdWVzdGVkCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAob2spIHsKKyAgICAgICAgICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlN0cmluZ2lmeWluZyB0aGUgVVJMIik7CisgICAgICAgICAgICAgICAgU3RyaW5nIHVybFN0cmluZyA9IHVybC50b1N0cmluZygpOworICAgICAgICAgICAgICAgIHVybCA9IG5ldyBVUkwodXJsU3RyaW5nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJlc3VsdHMuYXBwZW5kKCIgc3RyaW5naWZ5IE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gT3BlbiBhbiBpbnB1dCBzdHJlYW0gYW5kIGlucHV0IHN0cmVhbSByZWFkZXIgb24gdGhpcyBVUkwKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChvaykgeworICAgICAgICAgICAgICAgIGlzID0gdXJsLm9wZW5TdHJlYW0oKTsKKyAgICAgICAgICAgICAgICBpc3IgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaXMpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXN1bHRzLmFwcGVuZCgiIE9wZW4gSU9FeGNlcHRpb246ICIgKyBlKTsKKyAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBDb3B5IHRoZSBjb250ZW50cyBvZiB0aGlzIHN0cmVhbSB0byBvdXIgb3V0cHV0CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAob2spIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgICAgICBpbnQgY2ggPSBpc3IucmVhZCgpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5wcmludCgoY2hhcikgY2gpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoIiBDb3B5IElPRXhjZXB0aW9uOiAiICsgZSk7CisgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2xvc2UgdGhlIGlucHV0IHN0cmVhbQorICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKG9rKSB7CisgICAgICAgICAgICAgICAgaXNyLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJlc3VsdHMuYXBwZW5kKCIgQ2xvc2UgSU9FeGNlcHRpb246ICIgKyBlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlcG9ydCBhbnkgZmFpbHVyZXMgd2UgaGF2ZSBlbmNvdW50ZXJlZAorICAgICAgICBpZiAoIW9rKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoIlJlc291cmNlczA1IEZBSUxFRCAtIik7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihyZXN1bHRzLnRvU3RyaW5nKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQWRkIHdyYXBwZXIgbWVzc2FnZXMgYXMgcmVxdWlyZWQKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gU3RhdGljTG9nZ2VyLnJlYWQoKTsKKyAgICAgICAgICAgIGlmIChtZXNzYWdlID09IG51bGwpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihtZXNzYWdlKTsKKyAgICAgICAgfQorICAgICAgICBTdGF0aWNMb2dnZXIucmVzZXQoKTsKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1Jlc291cmNlczA1LnR4dCBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9SZXNvdXJjZXMwNS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBiMDRmMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9SZXNvdXJjZXMwNS50eHQKQEAgLTAsMCArMSBAQAorUmVzb3VyY2VzMDUgUEFTU0VECmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvUmVzb3VyY2VzMDYuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9SZXNvdXJjZXMwNi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMThkZjIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvUmVzb3VyY2VzMDYuamF2YQpAQCAtMCwwICsxLDE3MCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwLCAyMDAxICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisKKy8qKgorICogUG9zaXRpdmUgdGVzdCBmb3IgPGNvZGU+Z2V0UmVzb3VyY2VQYXRocygpPC9jb2RlPiwgd2hpY2ggd2lsbCBzcGVjaWZ5IHRoZQorICogZGlyZWN0b3J5IHBhdGggaW5kaWNhdGVkIGJ5IHRoZSA8c3Ryb25nPnBhdGg8L3N0cm9uZz4gcmVxdWVzdCBwYXJhbWV0ZXIuCisgKiBGb3Iga25vd24gcGF0aHMsIGF0IGxlYXN0IHRoZSBrbm93biBzZXQgb2YgaW5jbHVkZWQgcmVzb3VyY2VzIG11c3QgYmUKKyAqIGZvdW5kIGluIG9yZGVyIHRvIHBhc3MuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBSZXNvdXJjZXMwNiBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworICAgIC8vIFJlc291cmNlIExpc3RzIChpbmNvbXBsZXRlKSBmb3Iga25vd24gZGlyZWN0b3J5IHBhdGhzCisgICAgU3RyaW5nIHJvb3RQYXRoc1tdID0KKyAgICB7ICIvRXJyb3JQYWdlMDYuaHRtbCIsICIvRXJyb3JQYWdlMDYuanNwIiwgIi9Gb3J3YXJkMDEudHh0IiwKKyAgICAgICIvSW5jbHVkZTAxLnR4dCIsICIvV0VCLUlORi8iLCAiL1hlcmNlczAwLmpzcCIsICIvWGVyY2VzMDEueG1sIiwKKyAgICAgICIvWGVyY2VzMDIuanNwIiwgIi9nb2xkZW4vIiwgIi9pbmNsdWRlbWUudHh0IiwgIi9pbmRleC5zaHRtbCIsCisgICAgICAiL3NzaWRpci8iIH07CisKKyAgICBTdHJpbmcgZ29sZGVuUGF0aHNbXSA9CisgICAgeyAiL2dvbGRlbi9Hb2xkZW4wMS50eHQiLCAiL2dvbGRlbi9TU0lDb25maWcwMS50eHQiLAorICAgICAgIi9nb2xkZW4vU1NJQ29uZmlnMDMudHh0IiwgIi9nb2xkZW4vU1NJRnNpemUwMi50eHQiLAorICAgICAgIi9nb2xkZW4vU1NJSW5jbHVkZTAxLnR4dCIsICIvZ29sZGVuL1NTSUluY2x1ZGUwMi50eHQiLAorICAgICAgIi9nb2xkZW4vU2Vzc2lvbjA1LnR4dCIgfTsKKworICAgIFN0cmluZyB3ZWJpbmZQYXRoc1tdID0KKyAgICB7ICIvV0VCLUlORi9jbGFzc2VzLyIsICIvV0VCLUlORi9saWIvIiwgIi9XRUItSU5GL3dlYi54bWwiIH07CisKKworICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIFByZXBhcmUgb3VyIG91dHB1dCB3cml0ZXIKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvcGxhaW4iKTsKKyAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisKKyAgICAgICAgLy8gSWRlbnRpZnkgb3VyIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIFN0cmluZyBwYXRoID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoInBhdGgiKTsKKyAgICAgICAgaWYgKHBhdGggPT0gbnVsbCkKKyAgICAgICAgICAgIHBhdGggPSAiLyI7CisgICAgICAgIFN0cmluZyBwYXRoc1tdID0gbnVsbDsKKyAgICAgICAgaWYgKCIvIi5lcXVhbHMocGF0aCkpCisgICAgICAgICAgICBwYXRocyA9IHJvb3RQYXRoczsKKyAgICAgICAgZWxzZSBpZiAoIi9nb2xkZW4iLmVxdWFscyhwYXRoKSkKKyAgICAgICAgICAgIHBhdGhzID0gZ29sZGVuUGF0aHM7CisgICAgICAgIGVsc2UgaWYgKCIvV0VCLUlORiIuZXF1YWxzKHBhdGgpKQorICAgICAgICAgICAgcGF0aHMgPSB3ZWJpbmZQYXRoczsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiBVbmtub3duIHBhdGggJyIpOworICAgICAgICAgICAgc2IuYXBwZW5kKHBhdGgpOworICAgICAgICAgICAgc2IuYXBwZW5kKCInLyIpOworICAgICAgICB9CisgICAgICAgIGludCBjb3VudHNbXSA9IG51bGw7CisgICAgICAgIGlmIChwYXRocyAhPSBudWxsKQorICAgICAgICAgICAgY291bnRzID0gbmV3IGludFtwYXRocy5sZW5ndGhdOworCisgICAgICAgIC8vIFJlcXVlc3QgdGhlIHNldCBvZiByZXNvdXJjZXMgaW4gdGhlIHNwZWNpZmllZCBwYXRoCisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiUHJvY2Vzc2luZyBwYXRoICciICsgcGF0aCArICInIik7CisgICAgICAgIFN0cmluZyBmaXJzdCA9IG51bGw7CisgICAgICAgIFNldCBzZXQgPSBnZXRTZXJ2bGV0Q29udGV4dCgpLmdldFJlc291cmNlUGF0aHMocGF0aCk7CisgICAgICAgIGlmIChzZXQgPT0gbnVsbCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIgTm8gcmVzb3VyY2VzIHJldHVybmVkLyIpOworICAgICAgICAgICAgc2V0ID0gbmV3IEhhc2hTZXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENvdW50IHRoZSBvY2N1cnJlbmNlcyBvZiB0aGUgcmVzb3VyY2VzIHdlIGtub3cgYWJvdXQKKyAgICAgICAgSXRlcmF0b3IgcmVzb3VyY2VzID0gc2V0Lml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChyZXNvdXJjZXMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBTdHJpbmcgcmVzb3VyY2UgPSAoU3RyaW5nKSByZXNvdXJjZXMubmV4dCgpOworICAgICAgICAgICAgaWYgKGZpcnN0ID09IG51bGwpCisgICAgICAgICAgICAgICAgZmlyc3QgPSByZXNvdXJjZTsKKyAgICAgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiRm91bmQgcmVzb3VyY2UgJyIgKyByZXNvdXJjZSArICInIik7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhdGhzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKHBhdGhzW2ldLmVxdWFscyhyZXNvdXJjZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnRzW2ldKys7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlcG9ydCBvbiBhbnkgbWlzc2luZyBvciBkdXBsaWNhdGVkIHJlc291cmNlcworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhdGhzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoY291bnRzW2ldIDwgMSkgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiIE1pc3NpbmcgcmVzb3VyY2UgJyIpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChwYXRoc1tpXSk7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCInLyIpOworICAgICAgICAgICAgfSBlbHNlIGlmIChjb3VudHNbaV0gPiAyKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgUmVzb3VyY2UgJyIpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChwYXRoc1tpXSk7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCInIG9jY3VycmVkICIpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChjb3VudHNbaV0pOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiIHRpbWVzLyIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gVmVyaWZ5IHRoYXQgdGhlIHJldHVybmVkIHNldCBpcyBpbW11dGFibGUKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN0cmluZyBuZXdFbGVtZW50ID0gIk5FVyBGT08iOworICAgICAgICAgICAgc2V0LmFkZChuZXdFbGVtZW50KTsKKyAgICAgICAgICAgIGlmIChzZXQuY29udGFpbnMobmV3RWxlbWVudCkpCisgICAgICAgICAgICAgIHNiLmFwcGVuZCgiIFNldCBhbGxvd2VkIGFkZCgpLyIpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoZmlyc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNldC5yZW1vdmUoZmlyc3QpOworICAgICAgICAgICAgICAgIGlmICghc2V0LmNvbnRhaW5zKGZpcnN0KSkKKyAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiIFNldCBhbGxvd2VkIHJlbW92ZSgpLyIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzZXQuY2xlYXIoKTsKKyAgICAgICAgICAgIGlmIChzZXQuc2l6ZSgpID09IDApCisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgU2V0IGFsbG93ZWQgY2xlYXIoKS8iKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIDsKKyAgICAgICAgfQorCisKKyAgICAgICAgLy8gUmVwb3J0IGFueSBmYWlsdXJlcyB3ZSBoYXZlIGVuY291bnRlcmVkCisgICAgICAgIGlmIChzYi5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiUmVzb3VyY2VzMDYgRkFJTEVEIC0iKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKHNiLnRvU3RyaW5nKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIlJlc291cmNlczA2IFBBU1NFRCIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQWRkIHdyYXBwZXIgbWVzc2FnZXMgYXMgcmVxdWlyZWQKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gU3RhdGljTG9nZ2VyLnJlYWQoKTsKKyAgICAgICAgICAgIGlmIChtZXNzYWdlID09IG51bGwpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihtZXNzYWdlKTsKKyAgICAgICAgfQorICAgICAgICBTdGF0aWNMb2dnZXIucmVzZXQoKTsKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1Jlc3BvbnNlV3JhcDAxLmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvUmVzcG9uc2VXcmFwMDEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTIyZDgxCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1Jlc3BvbnNlV3JhcDAxLmphdmEKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwLCAyMDAxICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworLyoqCisgKiBCYXNpcyBmb3IgdGVzdGluZyB3cmFwcGVkIHJlc3BvbnNlcyB3aXRoIGNvbWJpbmF0aW9ucyBvZiBmb3J3YXJkaW5nIHRvCisgKiBvciBpbmNsdWRpbmcgYm90aCBzZXJ2bGV0cyBhbmQgSlNQIHBhZ2VzLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgUmVzcG9uc2VXcmFwMDEgZXh0ZW5kcyBIdHRwU2VydmxldCB7CisKKyAgICBwdWJsaWMgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICAvLyBBY3F1aXJlIHJlcXVlc3QgcGFyYW1ldGVycworICAgICAgICBTdHJpbmcgdHlwZSA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJ0eXBlIik7CisgICAgICAgIFN0cmluZyBwYWdlID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoInBhZ2UiKTsKKworICAgICAgICAvLyBQcmVwYXJlIHRoaXMgcmVzcG9uc2UKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvcGxhaW4iKTsKKyAgICAgICAgLy8JUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisKKyAgICAgICAgLy8gRm9yd2FyZCBvciBpbmNsdWRlIGFzIHJlcXVlc3RlZAorICAgICAgICBSZXF1ZXN0RGlzcGF0Y2hlciByZCA9CisgICAgICAgICAgICBnZXRTZXJ2bGV0Q29udGV4dCgpLmdldFJlcXVlc3REaXNwYXRjaGVyKHBhZ2UpOworICAgICAgICBpZiAocmQgPT0gbnVsbCkgeworICAgICAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiUmVzcG9uc2VXcmFwMDEgRkFJTEVEIC0gTm8gcmVxdWVzdCBkaXNwYXRjaGVyIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGZvciAiICsgcGFnZSk7CisgICAgICAgIH0gZWxzZSBpZiAoIkYiLmVxdWFscyh0eXBlKSkgeworICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZVdyYXBwZXIgd3JhcHBlciA9CisgICAgICAgICAgICAgICAgbmV3IENoYXJBcnJheVJlc3BvbnNlKHJlc3BvbnNlKTsKKyAgICAgICAgICAgIHJkLmZvcndhcmQocmVxdWVzdCwgd3JhcHBlcik7CisgICAgICAgICAgICB3cmFwcGVyLmZsdXNoQnVmZmVyKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlV3JhcHBlciB3cmFwcGVyID0KKyAgICAgICAgICAgICAgICBuZXcgQ2hhckFycmF5UmVzcG9uc2UocmVzcG9uc2UpOworICAgICAgICAgICAgcmQuaW5jbHVkZShyZXF1ZXN0LCB3cmFwcGVyKTsKKyAgICAgICAgICAgIHdyYXBwZXIuZmx1c2hCdWZmZXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE5vIGZpbHRlciB3cmFwcGluZyBmb3IgdGhpcyB0ZXN0IHNlcmllcworICAgICAgICBTdGF0aWNMb2dnZXIucmVzZXQoKTsKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1Jlc3BvbnNlV3JhcDAxYS5qYXZhIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1Jlc3BvbnNlV3JhcDAxYS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MzEyMmIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvUmVzcG9uc2VXcmFwMDFhLmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwLCAyMDAxICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworLyoqCisgKiBCYXNpcyBmb3IgdGVzdGluZyB3cmFwcGVkIHJlc3BvbnNlcyB3aXRoIGNvbWJpbmF0aW9ucyBvZiBmb3J3YXJkaW5nIHRvCisgKiBvciBpbmNsdWRpbmcgYm90aCBzZXJ2bGV0cyBhbmQgSlNQIHBhZ2VzLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgUmVzcG9uc2VXcmFwMDFhIGV4dGVuZHMgSHR0cFNlcnZsZXQgeworCisgICAgcHVibGljIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gUHJlcGFyZSB0aGlzIHJlc3BvbnNlCisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7CisgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworICAgICAgICB3cml0ZXIucHJpbnRsbigiUmVzcG9uc2VXcmFwMDFhIFBBU1NFRCIpOworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvUmVzcG9uc2VXcmFwMDFjLmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvUmVzcG9uc2VXcmFwMDFjLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NlMDBmYwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9SZXNwb25zZVdyYXAwMWMuamF2YQpAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAsIDIwMDEgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisvKioKKyAqIEJhc2lzIGZvciB0ZXN0aW5nIHdyYXBwZWQgcmVzcG9uc2VzIHdpdGggY29tYmluYXRpb25zIG9mIGZvcndhcmRpbmcgdG8KKyAqIG9yIGluY2x1ZGluZyBib3RoIHNlcnZsZXRzIGFuZCBKU1AgcGFnZXMuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBSZXNwb25zZVdyYXAwMWMgZXh0ZW5kcyBIdHRwU2VydmxldCB7CisKKyAgICBwdWJsaWMgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICAvLyBQcmVwYXJlIHRoaXMgcmVzcG9uc2UKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvcGxhaW4iKTsKKyAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisgICAgICAgIHdyaXRlci5wcmludGxuKCJSZXNwb25zZVdyYXAwMWMgUEFTU0VEIik7CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9TZXNzaW9uMDEuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9TZXNzaW9uMDEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjM4OGVlCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1Nlc3Npb24wMS5qYXZhCkBAIC0wLDAgKzEsMTM5IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGVzdGVyLnNoYXJlZC5TaGFyZWRTZXNzaW9uQmVhbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRlc3Rlci51bnBzaGFyZWQuVW5wU2hhcmVkU2Vzc2lvbkJlYW47CitpbXBvcnQgb3JnLmFwYWNoZS50ZXN0ZXIudW5zaGFyZWQuVW5zaGFyZWRTZXNzaW9uQmVhbjsKKworCisvKioKKyAqIFBhcnQgMSBvZiBTZXNzaW9uIFRlc3RzLiAgRW5zdXJlcyB0aGF0IHRoZXJlIGlzIG5vIGN1cnJlbnQgc2Vzc2lvbiwgdGhlbgorICogY3JlYXRlcyBhIG5ldyBzZXNzaW9uIGFuZCBzZXRzIGEgc2Vzc2lvbiBhdHRyaWJ1dGUuICBBbHNvLCBlbnN1cmUgdGhhdAorICogY2FsbGluZyBzZXRBdHRyaWJ1dGUoIm5hbWUiLCBudWxsKSBhY3RzIGxpa2UgcmVtb3ZlQXR0cmlidXRlKCkuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBTZXNzaW9uMDEgZXh0ZW5kcyBIdHRwU2VydmxldCB7CisKKyAgICBwdWJsaWMgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9wbGFpbiIpOworICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSByZXNwb25zZS5nZXRXcml0ZXIoKTsKKworICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGVyZSBpcyBubyBjdXJyZW50IHNlc3Npb24KKyAgICAgICAgYm9vbGVhbiBvayA9IHRydWU7CisgICAgICAgIEh0dHBTZXNzaW9uIHNlc3Npb24gPSByZXF1ZXN0LmdldFNlc3Npb24oZmFsc2UpOworICAgICAgICBpZiAoc2Vzc2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiU2Vzc2lvbjAxIEZBSUxFRCAtIFJlcXVlc3RlZCBleGlzdGluZyBzZXNzaW9uICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRJZCgpKTsKKyAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBDcmVhdGUgYSBuZXcgc2Vzc2lvbgorICAgICAgICBpZiAob2spIHsKKyAgICAgICAgICAgIHNlc3Npb24gPSByZXF1ZXN0LmdldFNlc3Npb24odHJ1ZSk7CisgICAgICAgICAgICBpZiAoc2Vzc2lvbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIlNlc3Npb24wMSBGQUlMRUQgLSBObyBzZXNzaW9uIGNyZWF0ZWQiKTsKKyAgICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gU3RvcmUgYW4gYWN0aXZhdGlvbiBldmVudCBsaXN0ZW5lciBpbiB0aGUgc2Vzc2lvbgorICAgICAgICBpZiAob2spIHsKKyAgICAgICAgICAgIHNlc3Npb24uc2V0QXR0cmlidXRlKCJhY3RpdmF0aW9uTGlzdGVuZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNlc3Npb25MaXN0ZW5lcjAzKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gRW5zdXJlIHRoYXQgdGhlcmUgaXMgbm8gZXhpc3RpbmcgYXR0cmlidXRlCisgICAgICAgIGlmIChvaykgeworICAgICAgICAgICAgaWYgKHNlc3Npb24uZ2V0QXR0cmlidXRlKCJzZXNzaW9uQmVhbiIpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiU2Vzc2lvbjAxIEZBSUxFRCAtIEF0dHJpYnV0ZSBhbHJlYWR5IGV4aXN0cyIpOworICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBDcmVhdGUgYW5kIHN0YXNoIGEgc2Vzc2lvbiBhdHRyaWJ1dGUKKyAgICAgICAgaWYgKG9rKSB7CisgICAgICAgICAgICBTZXNzaW9uQmVhbiBiZWFuID0gbmV3IFNlc3Npb25CZWFuKCk7CisgICAgICAgICAgICBiZWFuLnNldFN0cmluZ1Byb3BlcnR5KCJTZXNzaW9uMDEiKTsKKyAgICAgICAgICAgIHNlc3Npb24uc2V0QXR0cmlidXRlKCJzZXNzaW9uQmVhbiIsIGJlYW4pOworICAgICAgICB9CisKKyAgICAgICAgLy8gRW5zdXJlIHRoYXQgd2UgY2FuIHJldHJpZXZlIHRoZSBhdHRyaWJ1dGUgc3VjY2Vzc2Z1bGx5CisgICAgICAgIGlmIChvaykgeworICAgICAgICAgICAgT2JqZWN0IGJlYW4gPSBzZXNzaW9uLmdldEF0dHJpYnV0ZSgic2Vzc2lvbkJlYW4iKTsKKyAgICAgICAgICAgIGlmIChiZWFuID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiU2Vzc2lvbjAxIEZBSUxFRCAtIENhbm5vdCByZXRyaWV2ZSBhdHRyaWJ1dGUiKTsKKyAgICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIGlmICghKGJlYW4gaW5zdGFuY2VvZiBTZXNzaW9uQmVhbikpIHsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiU2Vzc2lvbjAxIEZBSUxFRCAtIEF0dHJpYnV0ZSBpbnN0YW5jZSBvZiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWFuLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSAoKFNlc3Npb25CZWFuKSBiZWFuKS5nZXRTdHJpbmdQcm9wZXJ0eSgpOworICAgICAgICAgICAgICAgIGlmICghIlNlc3Npb24wMSIuZXF1YWxzKHZhbHVlKSkgeworICAgICAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiU2Vzc2lvbjAxIEZBSUxFRCAtIFByb3BlcnR5ID0gIiArIHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBFbnN1cmUgdGhhdCBzZXRBdHRyaWJ1dGUoIm5hbWUiLCBudWxsKSB3b3JrcyBjb3JyZWN0bHkKKyAgICAgICAgaWYgKG9rKSB7CisgICAgICAgICAgICBzZXNzaW9uLnNldEF0dHJpYnV0ZSgiRk9PIiwgIkJBUiIpOworICAgICAgICAgICAgc2Vzc2lvbi5zZXRBdHRyaWJ1dGUoIkZPTyIsIG51bGwpOworICAgICAgICAgICAgaWYgKHNlc3Npb24uZ2V0QXR0cmlidXRlKCJGT08iKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIlNlc3Npb24wMSBGQUlMRUQgLSBzZXRBdHRyaWJ1dGUobmFtZSxudWxsKSIpOworICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBDcmVhdGUgbW9yZSBiZWFucyB0aGF0IHdpbGwgYmUgdXNlZCB0byB0ZXN0IGFwcGxpY2F0aW9uIHJlc3RhcnQKKyAgICAgICAgaWYgKG9rKSB7CisgICAgICAgICAgICBTaGFyZWRTZXNzaW9uQmVhbiBzc2IgPSBuZXcgU2hhcmVkU2Vzc2lvbkJlYW4oKTsKKyAgICAgICAgICAgIHNzYi5zZXRTdHJpbmdQcm9wZXJ0eSgiU2Vzc2lvbjAxIik7CisgICAgICAgICAgICBzZXNzaW9uLnNldEF0dHJpYnV0ZSgic2hhcmVkU2Vzc2lvbkJlYW4iLCBzc2IpOworICAgICAgICAgICAgVW5wU2hhcmVkU2Vzc2lvbkJlYW4gdXNzYiA9IG5ldyBVbnBTaGFyZWRTZXNzaW9uQmVhbigpOworICAgICAgICAgICAgdXNzYi5zZXRTdHJpbmdQcm9wZXJ0eSgiU2Vzc2lvbjAxIik7CisgICAgICAgICAgICBzZXNzaW9uLnNldEF0dHJpYnV0ZSgidW5wU2hhcmVkU2Vzc2lvbkJlYW4iLCB1c3NiKTsKKyAgICAgICAgICAgIFVuc2hhcmVkU2Vzc2lvbkJlYW4gdXNiID0gbmV3IFVuc2hhcmVkU2Vzc2lvbkJlYW4oKTsKKyAgICAgICAgICAgIHVzYi5zZXRTdHJpbmdQcm9wZXJ0eSgiU2Vzc2lvbjAxIik7CisgICAgICAgICAgICBzZXNzaW9uLnNldEF0dHJpYnV0ZSgidW5zaGFyZWRTZXNzaW9uQmVhbiIsIHVzYik7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXBvcnQgc3VjY2VzcyBpZiBldmVyeXRoaW5nIGlzIHN0aWxsIG9rCisgICAgICAgIGlmIChvaykKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJTZXNzaW9uMDEgUEFTU0VEIik7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IFN0YXRpY0xvZ2dlci5yZWFkKCk7CisgICAgICAgICAgICBpZiAobWVzc2FnZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4obWVzc2FnZSk7CisgICAgICAgIH0KKyAgICAgICAgU3RhdGljTG9nZ2VyLnJlc2V0KCk7CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9TZXNzaW9uMDIuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9TZXNzaW9uMDIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWU5MmU3Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1Nlc3Npb24wMi5qYXZhCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwgMjAwMCAsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50ZXN0ZXI7CisKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lio7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7CisKKy8qKgorICogUGFydCAyIG9mIFNlc3Npb24gVGVzdHMuICBFbnN1cmVzIHRoYXQgdGhlcmUgaXMgYW4gZXhpc3Rpbmcgc2Vzc2lvbiwgYW5kCisgKiB0aGF0IHRoZSBzZXNzaW9uIGJlYW4gc3Rhc2hlZCBpbiBQYXJ0IDEgY2FuIGJlIHJldHJpZXZlZCBzdWNjZXNzZnVsbHkuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBTZXNzaW9uMDIgZXh0ZW5kcyBIdHRwU2VydmxldCB7CisKKyAgICBwdWJsaWMgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9wbGFpbiIpOworICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSByZXNwb25zZS5nZXRXcml0ZXIoKTsKKworICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGVyZSBpcyBhIGN1cnJlbnQgc2Vzc2lvbgorICAgICAgICBib29sZWFuIG9rID0gdHJ1ZTsKKyAgICAgICAgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbihmYWxzZSk7CisgICAgICAgIGlmIChzZXNzaW9uID09IG51bGwpIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJTZXNzaW9uMDIgRkFJTEVEIC0gTm8gZXhpc3Rpbmcgc2Vzc2lvbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuZ2V0UmVxdWVzdGVkU2Vzc2lvbklkKCkpOworICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEVuc3VyZSB0aGF0IHdlIGNhbiByZXRyaWV2ZSB0aGUgYXR0cmlidXRlIHN1Y2Nlc3NmdWxseQorICAgICAgICBpZiAob2spIHsKKyAgICAgICAgICAgIE9iamVjdCBiZWFuID0gc2Vzc2lvbi5nZXRBdHRyaWJ1dGUoInNlc3Npb25CZWFuIik7CisgICAgICAgICAgICBpZiAoYmVhbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIlNlc3Npb24wMiBGQUlMRUQgLSBDYW5ub3QgcmV0cmlldmUgYXR0cmlidXRlIik7CisgICAgICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIShiZWFuIGluc3RhbmNlb2YgU2Vzc2lvbkJlYW4pKSB7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIlNlc3Npb24wMiBGQUlMRUQgLSBBdHRyaWJ1dGUgaW5zdGFuY2Ugb2YgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVhbi5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gKChTZXNzaW9uQmVhbikgYmVhbikuZ2V0U3RyaW5nUHJvcGVydHkoKTsKKyAgICAgICAgICAgICAgICBpZiAoISJTZXNzaW9uMDEiLmVxdWFscyh2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIlNlc3Npb24wMiBGQUlMRUQgLSBQcm9wZXJ0eSA9ICIgKyB2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gUmVwb3J0IHN1Y2Nlc3MgaWYgZXZlcnl0aGluZyBpcyBzdGlsbCBvaworICAgICAgICBpZiAob2spCisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiU2Vzc2lvbjAyIFBBU1NFRCIpOworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBTdGF0aWNMb2dnZXIucmVhZCgpOworICAgICAgICAgICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKG1lc3NhZ2UpOworICAgICAgICB9CisgICAgICAgIFN0YXRpY0xvZ2dlci5yZXNldCgpOworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvU2Vzc2lvbjAzLmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvU2Vzc2lvbjAzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJiZDYwYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9TZXNzaW9uMDMuamF2YQpAQCAtMCwwICsxLDE5OCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRlc3Rlci5zaGFyZWQuU2hhcmVkU2Vzc2lvbkJlYW47CitpbXBvcnQgb3JnLmFwYWNoZS50ZXN0ZXIudW5wc2hhcmVkLlVucFNoYXJlZFNlc3Npb25CZWFuOworaW1wb3J0IG9yZy5hcGFjaGUudGVzdGVyLnVuc2hhcmVkLlVuc2hhcmVkU2Vzc2lvbkJlYW47CisKKworLyoqCisgKiBQYXJ0IDMgb2YgU2Vzc2lvbiBUZXN0cy4gIEVuc3VyZXMgdGhhdCB0aGVyZSBpcyBhbiBleGlzdGluZyBzZXNzaW9uLCBhbmQKKyAqIHRoYXQgdGhlIHNlc3Npb24gYmVhbiBzdGFzaGVkIGluIFBhcnQgMSBjYW4gYmUgcmV0cmlldmVkIHN1Y2Nlc3NmdWxseS4KKyAqIFRoZW4sIGl0IHJlbW92ZXMgdGhhdCBhdHRyaWJ1dGUgYW5kIHZlcmlmaWVzIHN1Y2Nlc3NmdWwgcmVtb3ZhbC4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIFNlc3Npb24wMyBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7CisgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworCisgICAgICAgIC8vIEVuc3VyZSB0aGF0IHRoZXJlIGlzIGEgY3VycmVudCBzZXNzaW9uCisgICAgICAgIGJvb2xlYW4gb2sgPSB0cnVlOworICAgICAgICBIdHRwU2Vzc2lvbiBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uKGZhbHNlKTsKKyAgICAgICAgaWYgKHNlc3Npb24gPT0gbnVsbCkgeworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIlNlc3Npb24wMyBGQUlMRUQgLSBObyBleGlzdGluZyBzZXNzaW9uICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5nZXRSZXF1ZXN0ZWRTZXNzaW9uSWQoKSk7CisgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gRW5zdXJlIHRoYXQgd2UgY2FuIHJldHJpZXZlIHRoZSBhdHRyaWJ1dGUgc3VjY2Vzc2Z1bGx5CisJU2Vzc2lvbkJlYW4gYmVhbiA9IG51bGw7CisgICAgICAgIGlmIChvaykgeworICAgICAgICAgICAgT2JqZWN0IG9iamVjdCA9IHNlc3Npb24uZ2V0QXR0cmlidXRlKCJzZXNzaW9uQmVhbiIpOworICAgICAgICAgICAgaWYgKG9iamVjdCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIlNlc3Npb24wMyBGQUlMRUQgLSBDYW5ub3QgcmV0cmlldmUgYXR0cmlidXRlIik7CisgICAgICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIShvYmplY3QgaW5zdGFuY2VvZiBTZXNzaW9uQmVhbikpIHsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiU2Vzc2lvbjAzIEZBSUxFRCAtIEF0dHJpYnV0ZSBpbnN0YW5jZSBvZiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJlYW4gPSAoU2Vzc2lvbkJlYW4pIG9iamVjdDsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBiZWFuLmdldFN0cmluZ1Byb3BlcnR5KCk7CisgICAgICAgICAgICAgICAgaWYgKCEiU2Vzc2lvbjAxIi5lcXVhbHModmFsdWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJTZXNzaW9uMDMgRkFJTEVEIC0gUHJvcGVydHkgPSAiICsgdmFsdWUpOworICAgICAgICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlbW92ZSB0aGUgYXR0cmlidXRlIGFuZCBndWFyYW50ZWUgdGhhdCB0aGlzIHdhcyBzdWNjZXNzZnVsCisgICAgICAgIGlmIChvaykgeworICAgICAgICAgICAgc2Vzc2lvbi5yZW1vdmVBdHRyaWJ1dGUoInNlc3Npb25CZWFuIik7CisgICAgICAgICAgICBpZiAoc2Vzc2lvbi5nZXRBdHRyaWJ1dGUoInNlc3Npb25CZWFuIikgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJTZXNzaW9uMDMgRkFJTEVEIC0gUmVtb3ZhbCBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKwkvLyBWYWxpZGF0ZSB0aGUgYmVhbiBsaWZlY3ljbGUgb2YgdGhpcyBiZWFuCisJaWYgKG9rKSB7CisJICAgIFN0cmluZyBsaWZlY3ljbGUgPSBiZWFuLmdldExpZmVjeWNsZSgpOworCSAgICBpZiAoISIvdmIvc3dwL3NkYS92dSIuZXF1YWxzKGxpZmVjeWNsZSkpIHsKKwkgICAgICAgIHdyaXRlci5wcmludGxuKCJTZXNzaW9uMDMgRkFJTEVEIC0gSW52YWxpZCBiZWFuIGxpZmVjeWNsZSAnIiArCisJCQkgICAgICAgbGlmZWN5Y2xlICsgIiciKTsKKwkJb2sgPSBmYWxzZTsKKwkgICAgfQorCX0KKworICAgICAgICAvLyBSZXRyaWV2ZSBhbmQgdmFsaWRhdGUgdGhlIHNoYXJlZCBzZXNzaW9uIGJlYW4KKyAgICAgICAgU2hhcmVkU2Vzc2lvbkJlYW4gc3NiID0gbnVsbDsKKyAgICAgICAgaWYgKG9rKSB7CisgICAgICAgICAgICBPYmplY3Qgb2JqZWN0ID0gc2Vzc2lvbi5nZXRBdHRyaWJ1dGUoInNoYXJlZFNlc3Npb25CZWFuIik7CisgICAgICAgICAgICBpZiAob2JqZWN0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiU2Vzc2lvbjAzIEZBSUxFRCAtIENhbm5vdCByZXRyaWV2ZSBzc2IiKTsKKyAgICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIGlmICghKG9iamVjdCBpbnN0YW5jZW9mIFNoYXJlZFNlc3Npb25CZWFuKSkgeworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJTZXNzaW9uMDMgRkFJTEVEIC0gU2hhcmVkIGF0dHJpYnV0ZSBjbGFzcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBvYmplY3QuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNzYiA9IChTaGFyZWRTZXNzaW9uQmVhbikgb2JqZWN0OworICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IHNzYi5nZXRTdHJpbmdQcm9wZXJ0eSgpOworICAgICAgICAgICAgICAgIGlmICghIlNlc3Npb24wMSIuZXF1YWxzKHZhbHVlKSkgeworICAgICAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiU2Vzc2lvbjAzIEZBSUxFRCAtIFNoYXJlZCBwcm9wZXJ0eSA9IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLnJlbW92ZUF0dHJpYnV0ZSgic2hhcmVkU2Vzc2lvbkJlYW4iKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxpZmVjeWNsZSA9IHNzYi5nZXRMaWZlY3ljbGUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCEiL3ZiL3N3cC9zZGEvdnUiLmVxdWFscyhsaWZlY3ljbGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiU2Vzc2lvbjAzIEZBSUxFRCAtIFNoYXJlZCBsaWZlY3ljbGUgPSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbGlmZWN5Y2xlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXRyaWV2ZSBhbmQgdmFsaWRhdGUgdGhlIHVucGFja2VkIHNoYXJlZCBzZXNzaW9uIGJlYW4KKyAgICAgICAgVW5wU2hhcmVkU2Vzc2lvbkJlYW4gdXNzYiA9IG51bGw7CisgICAgICAgIGlmIChvaykgeworICAgICAgICAgICAgT2JqZWN0IG9iamVjdCA9IHNlc3Npb24uZ2V0QXR0cmlidXRlKCJ1bnBTaGFyZWRTZXNzaW9uQmVhbiIpOworICAgICAgICAgICAgaWYgKG9iamVjdCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIlNlc3Npb24wMyBGQUlMRUQgLSBDYW5ub3QgcmV0cmlldmUgdXNzYiIpOworICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgVW5wU2hhcmVkU2Vzc2lvbkJlYW4pKSB7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIlNlc3Npb24wMyBGQUlMRUQgLSB1bnBTaGFyZWQgYXR0cmlidXRlIGNsYXNzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG9iamVjdC5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdXNzYiA9IChVbnBTaGFyZWRTZXNzaW9uQmVhbikgb2JqZWN0OworICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IHVzc2IuZ2V0U3RyaW5nUHJvcGVydHkoKTsKKyAgICAgICAgICAgICAgICBpZiAoISJTZXNzaW9uMDEiLmVxdWFscyh2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIlNlc3Npb24wMyBGQUlMRUQgLSB1bnBTaGFyZWQgcHJvcGVydHkgPSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5yZW1vdmVBdHRyaWJ1dGUoInVucFNoYXJlZFNlc3Npb25CZWFuIik7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsaWZlY3ljbGUgPSBzc2IuZ2V0TGlmZWN5Y2xlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghIi92Yi9zd3Avc2RhL3Z1Ii5lcXVhbHMobGlmZWN5Y2xlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIlNlc3Npb24wMyBGQUlMRUQgLSB1bnBTaGFyZWQgbGlmZWN5Y2xlID0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGxpZmVjeWNsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gUmV0cmlldmUgYW5kIHZhbGlkYXRlIHRoZSB1bnNoYXJlZCBzZXNzaW9uIGJlYW4KKyAgICAgICAgVW5zaGFyZWRTZXNzaW9uQmVhbiB1c2IgPSBudWxsOworICAgICAgICBpZiAob2spIHsKKyAgICAgICAgICAgIE9iamVjdCBvYmplY3QgPSBzZXNzaW9uLmdldEF0dHJpYnV0ZSgidW5zaGFyZWRTZXNzaW9uQmVhbiIpOworICAgICAgICAgICAgaWYgKG9iamVjdCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIlNlc3Npb24wMyBGQUlMRUQgLSBDYW5ub3QgcmV0cmlldmUgdXNiIik7CisgICAgICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIShvYmplY3QgaW5zdGFuY2VvZiBVbnNoYXJlZFNlc3Npb25CZWFuKSkgeworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJTZXNzaW9uMDMgRkFJTEVEIC0gVW5zaGFyZWQgYXR0cmlidXRlIGNsYXNzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG9iamVjdC5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdXNiID0gKFVuc2hhcmVkU2Vzc2lvbkJlYW4pIG9iamVjdDsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSB1c2IuZ2V0U3RyaW5nUHJvcGVydHkoKTsKKyAgICAgICAgICAgICAgICBpZiAoISJTZXNzaW9uMDEiLmVxdWFscyh2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIlNlc3Npb24wMyBGQUlMRUQgLSBVbnNoYXJlZCBwcm9wZXJ0eSA9ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5yZW1vdmVBdHRyaWJ1dGUoInVuc2hhcmVkU2Vzc2lvbkJlYW4iKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxpZmVjeWNsZSA9IHVzYi5nZXRMaWZlY3ljbGUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCEiL3ZiL3N3cC9zZGEvdnUiLmVxdWFscyhsaWZlY3ljbGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiU2Vzc2lvbjAzIEZBSUxFRCAtIFVuc2hhcmVkIGxpZmVjeWNsZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiA9ICIgKyBsaWZlY3ljbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgICAgLy8gUmVwb3J0IHN1Y2Nlc3MgaWYgZXZlcnl0aGluZyBpcyBzdGlsbCBvaworICAgICAgICBpZiAob2spCisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiU2Vzc2lvbjAzIFBBU1NFRCIpOworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBTdGF0aWNMb2dnZXIucmVhZCgpOworICAgICAgICAgICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKG1lc3NhZ2UpOworICAgICAgICB9CisgICAgICAgIFN0YXRpY0xvZ2dlci5yZXNldCgpOworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvU2Vzc2lvbjA0LmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvU2Vzc2lvbjA0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjViOTg2OQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9TZXNzaW9uMDQuamF2YQpAQCAtMCwwICsxLDE1NiBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworLyoqCisgKiBQYXJ0IDQgb2YgU2Vzc2lvbiBUZXN0cy4gIEVuc3VyZXMgdGhhdCB0aGVyZSBpcyBhbiBleGlzdGluZyBzZXNzaW9uLCBhbmQKKyAqIHRoYXQgdGhlIHJlcXVlc3RlZCBzZXNzaW9uIGluZm9ybWF0aW9uIG1hdGNoZXMgaXQuICBBbHNvLCBlbnN1cmUgdGhhdCB3ZQorICogY2FuIGludmFsaWRhdGUgdGhpcyBzZXNzaW9uIGFuZCBjcmVhdGUgYSBuZXcgb25lICh3aXRoIGEgZGlmZmVyZW50IHNlc3Npb24KKyAqIGlkZW50aWZpZXIpIHdoaWxlIHByb2Nlc3NpbmcgdGhpcyByZXF1ZXN0LgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgU2Vzc2lvbjA0IGV4dGVuZHMgSHR0cFNlcnZsZXQgeworCisgICAgcHVibGljIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgbG9nKCJTZXNzaW9uMDQgLSBTdGFydGluZywgcmVxdWVzdGVkU2Vzc2lvbklkID0gIiArCisgICAgICAgICAgICByZXF1ZXN0LmdldFJlcXVlc3RlZFNlc3Npb25JZCgpKTsKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvcGxhaW4iKTsKKyAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisKKyAgICAgICAgLy8gRW5zdXJlIHRoYXQgdGhlcmUgaXMgYSBjdXJyZW50IHNlc3Npb24KKyAgICAgICAgU3RyaW5nQnVmZmVyIHJlc3VsdHMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIEh0dHBTZXNzaW9uIG9sZFNlc3Npb24gPSByZXF1ZXN0LmdldFNlc3Npb24oZmFsc2UpOworICAgICAgICBpZiAob2xkU2Vzc2lvbiA9PSBudWxsKQorICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoIiBObyBleGlzdGluZyBzZXNzaW9uLyIpOworCisgICAgICAgIC8vIEFjcXVpcmUgdGhlIHNlc3Npb24gaWRlbnRpZmllciBvZiB0aGUgb2xkIHNlc3Npb24KKyAgICAgICAgU3RyaW5nIG9sZFNlc3Npb25JZCA9IG51bGw7CisgICAgICAgIGlmIChvbGRTZXNzaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgb2xkU2Vzc2lvbklkID0gb2xkU2Vzc2lvbi5nZXRJZCgpOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICByZXN1bHRzLmFwcGVuZCgiIE9sZCBzZXNzaW9uIGlzIGV4cGlyZWQvIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBNYXRjaCBhZ2FpbnN0IHRoZSByZXF1ZXN0ZWQgc2Vzc2lvbiBpZGVudGlmaWVyCisgICAgICAgIFN0cmluZyByZXF1ZXN0ZWRTZXNzaW9uSWQgPSBudWxsOworICAgICAgICBpZiAob2xkU2Vzc2lvbklkICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJlcXVlc3RlZFNlc3Npb25JZCA9IHJlcXVlc3QuZ2V0UmVxdWVzdGVkU2Vzc2lvbklkKCk7CisgICAgICAgICAgICBpZiAocmVxdWVzdGVkU2Vzc2lvbklkID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXN1bHRzLmFwcGVuZCgiIE5vIHJlcXVlc3RlZCBzZXNzaW9uIGlkLyIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoIXJlcXVlc3QuaXNSZXF1ZXN0ZWRTZXNzaW9uSWRWYWxpZCgpKQorICAgICAgICAgICAgICAgICAgICByZXN1bHRzLmFwcGVuZCgiIFJlcXVlc3RlZCBzZXNzaW9uIGlkIGlzIG5vdCB2YWxpZC8iKTsKKyAgICAgICAgICAgICAgICBpZiAoIW9sZFNlc3Npb25JZC5lcXVhbHMocmVxdWVzdGVkU2Vzc2lvbklkKSkgeworICAgICAgICAgICAgICAgICAgICByZXN1bHRzLmFwcGVuZCgiIFJlcXVlc3RlZCBzZXNzaW9uPSIpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRzLmFwcGVuZChyZXF1ZXN0ZWRTZXNzaW9uSWQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRzLmFwcGVuZCgiIE9sZCBzZXNzaW9uPSIpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRzLmFwcGVuZChvbGRTZXNzaW9uSWQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRzLmFwcGVuZCgiLyIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFZlcmlmeSB0aGF0IHdlIHJlY2VpdmVkIHRoZSByZXF1ZXN0ZWQgc2Vzc2lvbiBpZGVudGlmaWVyIGNvcnJlY3RseQorICAgICAgICBpZiAocmVxdWVzdGVkU2Vzc2lvbklkICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmICghcmVxdWVzdC5pc1JlcXVlc3RlZFNlc3Npb25JZEZyb21Db29raWUoKSkKKyAgICAgICAgICAgICAgICByZXN1bHRzLmFwcGVuZCgiIFJlcXVlc3RlZCBzZXNzaW9uIG5vdCBmcm9tIGNvb2tpZS8iKTsKKyAgICAgICAgICAgIGlmIChyZXF1ZXN0LmlzUmVxdWVzdGVkU2Vzc2lvbklkRnJvbVVSTCgpKQorICAgICAgICAgICAgICAgIHJlc3VsdHMuYXBwZW5kKCIgUmVxdWVzdGVkIHNlc3Npb24gZnJvbSBVUkwvIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBWZXJpZnkgdGhhdCB3ZSBjYW4gY3JlYXRlIGFuIGF0dHJpYnV0ZSBpbiB0aGUgb2xkIHNlc3Npb24KKyAgICAgICAgaWYgKG9sZFNlc3Npb24gIT0gbnVsbCkgeworICAgICAgICAgICAgU2Vzc2lvbkJlYW4gYmVhbiA9IG5ldyBTZXNzaW9uQmVhbigpOworICAgICAgICAgICAgYmVhbi5zZXRTdHJpbmdQcm9wZXJ0eSgiU2Vzc2lvbjA0Iik7CisgICAgICAgICAgICBvbGRTZXNzaW9uLnNldEF0dHJpYnV0ZSgic2Vzc2lvbkJlYW4iLCBiZWFuKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFZlcmlmeSB0aGF0IHdlIGNhbiBpbnZhbGlkYXRlIHRoZSBvbGQgc2Vzc2lvbgorICAgICAgICBpZiAob2xkU2Vzc2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG9sZFNlc3Npb24uaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICByZXN1bHRzLmFwcGVuZCgiIE9sZCBzZXNzaW9uIGlzIGFscmVhZHkgaW52YWxpZGF0ZWQvIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBWZXJpZnkgdGhhdCB3ZSBjYW4gY3JlYXRlIGEgbmV3IHNlc3Npb24KKyAgICAgICAgSHR0cFNlc3Npb24gbmV3U2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbih0cnVlKTsKKyAgICAgICAgaWYgKG5ld1Nlc3Npb24gPT0gbnVsbCkgeworICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoIiBDYW5ub3QgY3JlYXRlIG5ldyBzZXNzaW9uLyIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU3RyaW5nIG5ld1Nlc3Npb25JZCA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG5ld1Nlc3Npb25JZCA9IG5ld1Nlc3Npb24uZ2V0SWQoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoIiBOZXcgc2Vzc2lvbiBpcyBhbHJlYWR5IGludmFsaWRhdGVkLyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChvbGRTZXNzaW9uICE9IG51bGwpICYmIChuZXdTZXNzaW9uICE9IG51bGwpKSB7CisgICAgICAgICAgICAgICAgaWYgKG9sZFNlc3Npb24gPT0gbmV3U2Vzc2lvbikKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoIiBvbGRTZXNzaW9uID09IG5ld1Nlc3Npb24vIik7CisgICAgICAgICAgICAgICAgaWYgKG9sZFNlc3Npb24uZXF1YWxzKG5ld1Nlc3Npb24pKQorICAgICAgICAgICAgICAgICAgICByZXN1bHRzLmFwcGVuZCgiIG9sZFNlc3Npb24gZXF1YWxzIG5ld1Nlc3Npb24vIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKG9sZFNlc3Npb25JZCAhPSBudWxsKSAmJiAobmV3U2Vzc2lvbklkICE9IG51bGwpICYmCisgICAgICAgICAgICAgICAgb2xkU2Vzc2lvbklkLmVxdWFscyhuZXdTZXNzaW9uSWQpKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoIiBOZXcgc2Vzc2lvbiBpZCA9IG9sZCBzZXNzaW9uIGlkLyIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gVmVyaWZ5IHRoYXQgdGhlIG9sZCBzZXNzaW9uJ3MgYXR0cmlidXRlIGRpZCBub3QgY2FycnkgZm9yd2FyZAorICAgICAgICBpZiAobmV3U2Vzc2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBTZXNzaW9uQmVhbiBiZWFuID0KKyAgICAgICAgICAgICAgICAoU2Vzc2lvbkJlYW4pIG5ld1Nlc3Npb24uZ2V0QXR0cmlidXRlKCJzZXNzaW9uQmVhbiIpOworICAgICAgICAgICAgaWYgKGJlYW4gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXN1bHRzLmFwcGVuZCgiIE5ldyBzZXNzaW9uIGhhcyBhdHRyaWJ1dGUgYWxyZWFkeS8iKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFN0b3JlIGFuIGFjdGl2YXRpb24gZXZlbnQgbGlzdGVuZXIgaW4gdGhlIHNlc3Npb24KKyAgICAgICAgbmV3U2Vzc2lvbi5zZXRBdHRyaWJ1dGUoImFjdGl2YXRpb25MaXN0ZW5lciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU2Vzc2lvbkxpc3RlbmVyMDMoKSk7CisKKyAgICAgICAgLy8gUmVwb3J0IHN1Y2Nlc3MgaWYgZXZlcnl0aGluZyBpcyBzdGlsbCBvaworICAgICAgICBpZiAocmVzdWx0cy5sZW5ndGgoKSA9PSAwKQorICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIlNlc3Npb24wNCBQQVNTRUQiKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoIlNlc3Npb24wNCBGQUlMRUQgLSIpOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4ocmVzdWx0cy50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBTdGF0aWNMb2dnZXIucmVhZCgpOworICAgICAgICAgICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKG1lc3NhZ2UpOworICAgICAgICB9CisgICAgICAgIFN0YXRpY0xvZ2dlci5yZXNldCgpOworICAgICAgICBsb2coIlNlc3Npb24wNCAtIFN0b3BwaW5nIik7CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9TZXNzaW9uMDUuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9TZXNzaW9uMDUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWQ3NWM2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1Nlc3Npb24wNS5qYXZhCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwgMjAwMCwgMjAwMSAsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50ZXN0ZXI7CisKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lio7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7CisKKy8qKgorICogUGFydCA1IG9mIFNlc3Npb24gVGVzdHMuICBFbnN1cmVzIHRoYXQgdGhlIGFwcHJvcHJpYXRlIHNlc3Npb24gbGlzdGVuZXIKKyAqIGV2ZW50cyBnZXQgY2FsbGVkIGluIHRoZSBhcHByb3ByaWF0ZSBvcmRlci4gIFJlbGllcyBvbiBwcm9wZXIgY29uZmlndXJhdGlvbgorICogb2YgU2Vzc2lvbkxpc3RlbmVyMDEgYW5kIFNlc3Npb25MaXN0ZW5lcjAyIGluIHRoZSB3ZWIueG1sIGZpbGUKKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIFNlc3Npb24wNSBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIFJlc2V0IHRoZSBzdGF0aWMgbG9nZ2VyIHRvIGVuc3VyZSBubyBsZWZ0b3ZlcnMgZXhpc3QKKyAgICAgICAgU3RhdGljTG9nZ2VyLnJlc2V0KCk7CisKKyAgICAgICAgLy8gUGVyZm9ybSBzZXNzaW9uIG1hbmFnZW1lbnQgYWN0aXZpdGllcyB0byB0cmlnZ2VyIGxpc3RlbmVyIGV2ZW50cworICAgICAgICBIdHRwU2Vzc2lvbiBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uKHRydWUpOworICAgICAgICBzZXNzaW9uLnNldEF0dHJpYnV0ZSgiYXR0cmlidXRlMSIsICJ2YWx1ZTEiKTsKKyAgICAgICAgc2Vzc2lvbi5zZXRBdHRyaWJ1dGUoImF0dHJpYnV0ZTEiLCAidmFsdWUyIik7CisgICAgICAgIHNlc3Npb24ucmVtb3ZlQXR0cmlidXRlKCJhdHRyaWJ1dGUxIik7CisgICAgICAgIHNlc3Npb24ucmVtb3ZlQXR0cmlidXRlKCJhdHRyaWJ1dGUyIik7IC8vIE5vdCBwcmVzZW50LCBzbyBubyBsb2dnaW5nCisgICAgICAgIHNlc3Npb24uaW52YWxpZGF0ZSgpOworCisgICAgICAgIC8vIFJlbmRlciB0aGUgcmVzcG9uc2UgKHRvIGJlIGNvbXBhcmVkIGFzIGEgZ29sZGVuIGZpbGUpCisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7CisgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBTdGF0aWNMb2dnZXIucmVhZCgpOworICAgICAgICAgICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKG1lc3NhZ2UpOworICAgICAgICB9CisgICAgICAgIFN0YXRpY0xvZ2dlci5yZXNldCgpOworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvU2Vzc2lvbjA2LmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvU2Vzc2lvbjA2LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzkwMzg4ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9TZXNzaW9uMDYuamF2YQpAQCAtMCwwICsxLDY4IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAsIDIwMDEgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisvKioKKyAqIFBhcnQgNiBvZiBTZXNzaW9uIFRlc3RzLiAgRW5zdXJlcyB0aGF0IGFuIGF0dGVtcHQgdG8gY3JlYXRlIGEgbmV3IHNlc3Npb24KKyAqIGFmdGVyIHRoZSByZXNwb25zZSBoYXMgYmVlbiBjb21taXR0ZWQgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbi4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIFNlc3Npb24wNiBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIFByZXBhcmUgYW5kIGNvbW1pdCBvdXIgcmVzcG9uc2UKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvcGxhaW4iKTsKKyAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisgICAgICAgIHdyaXRlci5wcmludCgiU2Vzc2lvbjA2ICIpOworICAgICAgICByZXNwb25zZS5mbHVzaEJ1ZmZlcigpOworCisgICAgICAgIC8vIEF0dGVtcHQgdG8gY3JlYXRlIGEgbmV3IHNlc3Npb24KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEh0dHBTZXNzaW9uIHNlc3Npb24gPSByZXF1ZXN0LmdldFNlc3Npb24odHJ1ZSk7CisgICAgICAgICAgICBpZiAoc2Vzc2lvbiA9PSBudWxsKQorICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJGQUlMRUQgLSBEaWQgbm90IHRocm93IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJGQUlMRUQgLSBSZXR1cm5lZCBuZXcgc2Vzc2lvbiIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIlBBU1NFRCIpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIkZBSUxFRCAtIFRocmV3ICIgKyB0KTsKKyAgICAgICAgICAgIHQucHJpbnRTdGFja1RyYWNlKHdyaXRlcik7CisgICAgICAgIH0KKworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBTdGF0aWNMb2dnZXIucmVhZCgpOworICAgICAgICAgICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKG1lc3NhZ2UpOworICAgICAgICB9CisgICAgICAgIFN0YXRpY0xvZ2dlci5yZXNldCgpOworICAgICAgICByZXNwb25zZS5mbHVzaEJ1ZmZlcigpOworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvU2Vzc2lvbkJlYW4uamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9TZXNzaW9uQmVhbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkMGJjOGEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvU2Vzc2lvbkJlYW4uamF2YQpAQCAtMCwwICsxLDE2MSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS5zcWwuRGF0ZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb25BY3RpdmF0aW9uTGlzdGVuZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uQmluZGluZ0V2ZW50OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbkJpbmRpbmdMaXN0ZW5lcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb25FdmVudDsKKworCisvKioKKyAqIFNpbXBsZSBKYXZhQmVhbiB0byB1c2UgZm9yIHNlc3Npb24gYXR0cmlidXRlIHRlc3RzLiAgSXQgaXMgU2VyaWFsaXphYmxlCisgKiBzbyB0aGF0IGluc3RhbmNlcyBjYW4gYmUgc2F2ZWQgYW5kIHJlc3RvcmVkIGFjcm9zcyBzZXJ2ZXIgcmVzdGFydHMuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBTZXNzaW9uQmVhbiBpbXBsZW1lbnRzCisgICAgSHR0cFNlc3Npb25BY3RpdmF0aW9uTGlzdGVuZXIsIEh0dHBTZXNzaW9uQmluZGluZ0xpc3RlbmVyLCBTZXJpYWxpemFibGUgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogQSBkYXRlIHByb3BlcnR5IGZvciB1c2Ugd2l0aCBwcm9wZXJ0eSBlZGl0b3IgdGVzdHMuCisgICAgICovCisgICAgcHJvdGVjdGVkIERhdGUgZGF0ZVByb3BlcnR5ID0KKyAgICAgICAgbmV3IERhdGUoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworCisgICAgcHVibGljIERhdGUgZ2V0RGF0ZVByb3BlcnR5KCkgeworICAgICAgICByZXR1cm4gKHRoaXMuZGF0ZVByb3BlcnR5KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREYXRlUHJvcGVydHkoRGF0ZSBkYXRlUHJvcGVydHkpIHsKKyAgICAgICAgdGhpcy5kYXRlUHJvcGVydHkgPSBkYXRlUHJvcGVydHk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgbGlmZWN5Y2xlIGV2ZW50cyB0aGF0IGhhdmUgaGFwcGVuZWQgb24gdGhpcyBiZWFuIGluc3RhbmNlLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgbGlmZWN5Y2xlID0gIiI7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldExpZmVjeWNsZSgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLmxpZmVjeWNsZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TGlmZWN5Y2xlKFN0cmluZyBsaWZlY3ljbGUpIHsKKyAgICAgICAgdGhpcy5saWZlY3ljbGUgPSBsaWZlY3ljbGU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBIHN0cmluZyBwcm9wZXJ0eS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHN0cmluZ1Byb3BlcnR5ID0gIkRlZmF1bHQgU3RyaW5nIFByb3BlcnR5IFZhbHVlIjsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nUHJvcGVydHkoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5zdHJpbmdQcm9wZXJ0eSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U3RyaW5nUHJvcGVydHkoU3RyaW5nIHN0cmluZ1Byb3BlcnR5KSB7CisgICAgICAgIHRoaXMuc3RyaW5nUHJvcGVydHkgPSBzdHJpbmdQcm9wZXJ0eTsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBiZWFuLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiU2Vzc2lvbkJlYW5bbGlmZWN5Y2xlPSIpOworICAgICAgICBzYi5hcHBlbmQodGhpcy5saWZlY3ljbGUpOworICAgICAgICBzYi5hcHBlbmQoIixkYXRlUHJvcGVydHk9Iik7CisgICAgICAgIHNiLmFwcGVuZChkYXRlUHJvcGVydHkpOworICAgICAgICBzYi5hcHBlbmQoIixzdHJpbmdQcm9wZXJ0eT0iKTsKKyAgICAgICAgc2IuYXBwZW5kKHRoaXMuc3RyaW5nUHJvcGVydHkpOworICAgICAgICBzYi5hcHBlbmQoIl0iKTsKKyAgICAgICAgcmV0dXJuIChzYi50b1N0cmluZygpKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBIdHRwU2Vzc2lvbkFjdGl2YXRpb25MaXN0ZW5lciBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJlY2VpdmUgbm90aWZpY2F0aW9uIHRoYXQgdGhpcyBzZXNzaW9uIHdhcyBhY3RpdmF0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnQgVGhlIHNlc3Npb24gZXZlbnQgdGhhdCBoYXMgb2NjdXJyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXNzaW9uRGlkQWN0aXZhdGUoSHR0cFNlc3Npb25FdmVudCBldmVudCkgeworCisgICAgICAgIGxpZmVjeWNsZSArPSAiL3NkYSI7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlY2VpdmUgbm90aWZpY2F0aW9uIHRoYXQgdGhpcyBzZXNzaW9uIHdpbGwgYmUgcGFzc2l2YXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudCBUaGUgc2Vzc2lvbiBldmVudCB0aGF0IGhhcyBvY2N1cnJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNlc3Npb25XaWxsUGFzc2l2YXRlKEh0dHBTZXNzaW9uRXZlbnQgZXZlbnQpIHsKKworICAgICAgICBsaWZlY3ljbGUgKz0gIi9zd3AiOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEh0dHBTZXNzaW9uQmluZGluZ0xpc3RlbmVyIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmVjZWl2ZSBub3RpZmljYXRpb24gdGhhdCB0aGlzIGF0dHJpYnV0ZSBoYXMgYmVlbiBib3VuZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudCBUaGUgc2Vzc2lvbiBldmVudCB0aGF0IGhhcyBvY2N1cnJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHZhbHVlQm91bmQoSHR0cFNlc3Npb25CaW5kaW5nRXZlbnQgZXZlbnQpIHsKKworICAgICAgICBsaWZlY3ljbGUgKz0gIi92YiI7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlY2VpdmUgbm90aWZpY2F0aW9uIHRoYXQgdGhpcyBhdHRyaWJ1dGUgaGFzIGJlZW4gdW5ib3VuZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudCBUaGUgc2Vzc2lvbiBldmVudCB0aGF0IGhhcyBvY2N1cnJlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHZhbHVlVW5ib3VuZChIdHRwU2Vzc2lvbkJpbmRpbmdFdmVudCBldmVudCkgeworCisgICAgICAgIGxpZmVjeWNsZSArPSAiL3Z1IjsKKworICAgIH0KKworCit9CisKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9TZXNzaW9uTGlzdGVuZXIwMS5qYXZhIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1Nlc3Npb25MaXN0ZW5lcjAxLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE4M2NiZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9TZXNzaW9uTGlzdGVuZXIwMS5qYXZhCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwgMjAwMCwgMjAwMSAsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50ZXN0ZXI7CisKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lio7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7CisKKy8qKgorICogQXBwbGljYXRpb24gZXZlbnQgbGlzdGVuZXIgZm9yIHNlc3Npb24gZXZlbnRzLiAgQWxsIGV2ZW50cyB0aGF0IG9jY3VyCisgKiBhcmUgbG9nZ2VkIGFwcHJvcHJpYXRlbHkgdG8gdGhlIHN0YXRpYyBsb2dnZXIuICBJbiBhZGRpdGlvbiwgc2Vzc2lvbgorICogY3JlYXRpb24gYW5kIGRlc3RydWN0aW9uIGV2ZW50cyBhcmUgbG9nZ2VkIHRvIHRoZSBzZXJ2bGV0IGNvbnRleHQgbG9nLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgU2Vzc2lvbkxpc3RlbmVyMDEKKyAgICBpbXBsZW1lbnRzIEh0dHBTZXNzaW9uTGlzdGVuZXIsIEh0dHBTZXNzaW9uQXR0cmlidXRlTGlzdGVuZXIgeworCisKKyAgICBwdWJsaWMgdm9pZCBhdHRyaWJ1dGVBZGRlZChIdHRwU2Vzc2lvbkJpbmRpbmdFdmVudCBldmVudCkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlNlc3Npb25MaXN0ZW5lcjAxOiBhdHRyaWJ1dGVBZGRlZCgiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmdldE5hbWUoKSArICIsIiArIGV2ZW50LmdldFZhbHVlKCkgKyAiKSIpOworICAgICAgICBldmVudC5nZXRTZXNzaW9uKCkuZ2V0U2VydmxldENvbnRleHQoKS5sb2cKKyAgICAgICAgICAgICgiU2Vzc2lvbkxpc3RlbmVyMDE6IGF0dHJpYnV0ZUFkZGVkKCIgKyBldmVudC5nZXRTZXNzaW9uKCkuZ2V0SWQoKQorICAgICAgICAgICAgICsgIiwiICsgZXZlbnQuZ2V0TmFtZSgpICsgIikiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhdHRyaWJ1dGVSZW1vdmVkKEh0dHBTZXNzaW9uQmluZGluZ0V2ZW50IGV2ZW50KSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiU2Vzc2lvbkxpc3RlbmVyMDE6IGF0dHJpYnV0ZVJlbW92ZWQoIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5nZXROYW1lKCkgKyAiLCIgKyBldmVudC5nZXRWYWx1ZSgpICsgIikiKTsKKyAgICAgICAgZXZlbnQuZ2V0U2Vzc2lvbigpLmdldFNlcnZsZXRDb250ZXh0KCkubG9nCisgICAgICAgICAgICAoIlNlc3Npb25MaXN0ZW5lcjAxOiBhdHRyaWJ1dGVSZW1vdmVkKCIgKworICAgICAgICAgICAgIGV2ZW50LmdldFNlc3Npb24oKS5nZXRJZCgpICsgIiwiICsgZXZlbnQuZ2V0TmFtZSgpICsgIikiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhdHRyaWJ1dGVSZXBsYWNlZChIdHRwU2Vzc2lvbkJpbmRpbmdFdmVudCBldmVudCkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlNlc3Npb25MaXN0ZW5lcjAxOiBhdHRyaWJ1dGVSZXBsYWNlZCgiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmdldE5hbWUoKSArICIsIiArIGV2ZW50LmdldFZhbHVlKCkgKyAiKSIpOworICAgICAgICBldmVudC5nZXRTZXNzaW9uKCkuZ2V0U2VydmxldENvbnRleHQoKS5sb2cKKyAgICAgICAgICAgICgiU2Vzc2lvbkxpc3RlbmVyMDE6IGF0dHJpYnV0ZVJlcGxhY2VkKCIgKworICAgICAgICAgICAgIGV2ZW50LmdldFNlc3Npb24oKS5nZXRJZCgpICsgIiwiICsgZXZlbnQuZ2V0TmFtZSgpICsgIikiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXNzaW9uQ3JlYXRlZChIdHRwU2Vzc2lvbkV2ZW50IGV2ZW50KSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiU2Vzc2lvbkxpc3RlbmVyMDE6IHNlc3Npb25DcmVhdGVkKCkiKTsKKyAgICAgICAgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IGV2ZW50LmdldFNlc3Npb24oKTsKKyAgICAgICAgc2Vzc2lvbi5nZXRTZXJ2bGV0Q29udGV4dCgpLmxvZygiU2Vzc2lvbkxpc3RlbmVyMDE6IHNlc3Npb25DcmVhdGVkKCIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0SWQoKSArICIpIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2Vzc2lvbkRlc3Ryb3llZChIdHRwU2Vzc2lvbkV2ZW50IGV2ZW50KSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiU2Vzc2lvbkxpc3RlbmVyMDE6IHNlc3Npb25EZXN0cm95ZWQoKSIpOworICAgICAgICBIdHRwU2Vzc2lvbiBzZXNzaW9uID0gZXZlbnQuZ2V0U2Vzc2lvbigpOworICAgICAgICBzZXNzaW9uLmdldFNlcnZsZXRDb250ZXh0KCkubG9nKCJTZXNzaW9uTGlzdGVuZXIwMTogc2Vzc2lvbkRlc3Ryb3llZCgiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzZXNzaW9uLmdldElkKCkgKyAiKSIpOworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvU2Vzc2lvbkxpc3RlbmVyMDIuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9TZXNzaW9uTGlzdGVuZXIwMi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjMzVhMmMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvU2Vzc2lvbkxpc3RlbmVyMDIuamF2YQpAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAsIDIwMDEgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisvKioKKyAqIEFwcGxpY2F0aW9uIGV2ZW50IGxpc3RlbmVyIGZvciBzZXNzaW9uIGV2ZW50cy4gIEFsbCBldmVudHMgdGhhdCBvY2N1cgorICogYXJlIGxvZ2dlZCBhcHByb3ByaWF0ZWx5IHRvIHRoZSBzdGF0aWMgbG9nZ2VyLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgU2Vzc2lvbkxpc3RlbmVyMDIKKyAgICBpbXBsZW1lbnRzIEh0dHBTZXNzaW9uTGlzdGVuZXIsIEh0dHBTZXNzaW9uQXR0cmlidXRlTGlzdGVuZXIgeworCisKKyAgICBwdWJsaWMgdm9pZCBhdHRyaWJ1dGVBZGRlZChIdHRwU2Vzc2lvbkJpbmRpbmdFdmVudCBldmVudCkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlNlc3Npb25MaXN0ZW5lcjAyOiBhdHRyaWJ1dGVBZGRlZCgiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmdldE5hbWUoKSArICIsIiArIGV2ZW50LmdldFZhbHVlKCkgKyAiKSIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGF0dHJpYnV0ZVJlbW92ZWQoSHR0cFNlc3Npb25CaW5kaW5nRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJTZXNzaW9uTGlzdGVuZXIwMjogYXR0cmlidXRlUmVtb3ZlZCgiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmdldE5hbWUoKSArICIsIiArIGV2ZW50LmdldFZhbHVlKCkgKyAiKSIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGF0dHJpYnV0ZVJlcGxhY2VkKEh0dHBTZXNzaW9uQmluZGluZ0V2ZW50IGV2ZW50KSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiU2Vzc2lvbkxpc3RlbmVyMDI6IGF0dHJpYnV0ZVJlcGxhY2VkKCIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuZ2V0TmFtZSgpICsgIiwiICsgZXZlbnQuZ2V0VmFsdWUoKSArICIpIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2Vzc2lvbkNyZWF0ZWQoSHR0cFNlc3Npb25FdmVudCBldmVudCkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlNlc3Npb25MaXN0ZW5lcjAyOiBzZXNzaW9uQ3JlYXRlZCgpIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2Vzc2lvbkRlc3Ryb3llZChIdHRwU2Vzc2lvbkV2ZW50IGV2ZW50KSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiU2Vzc2lvbkxpc3RlbmVyMDI6IHNlc3Npb25EZXN0cm95ZWQoKSIpOworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvU2Vzc2lvbkxpc3RlbmVyMDMuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9TZXNzaW9uTGlzdGVuZXIwMy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkODhkYWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvU2Vzc2lvbkxpc3RlbmVyMDMuamF2YQpAQCAtMCwwICsxLDY0IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAsIDIwMDEsIDIwMDIgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisKKy8qKgorICogU2Vzc2lvbiBhdHRyaWJ1dGUgdGhhdCBsaXN0ZW5zIHRvIHBhc3NpdmF0aW9uIGFuZCBhY3RpdmF0aW9uIGV2ZW50cy4KKyAqIEFsbCBldmVudHMgdGhhdCBvY2N1ciBhcmUgbG9nZ2VkIHRvIHRoZSBzZXJ2bGV0IGNvbnRleHQgbG9nLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgU2Vzc2lvbkxpc3RlbmVyMDMKKyAgICBpbXBsZW1lbnRzIEh0dHBTZXNzaW9uQWN0aXZhdGlvbkxpc3RlbmVyLCBIdHRwU2Vzc2lvbkJpbmRpbmdMaXN0ZW5lciwKKyAgICAgICAgICAgICAgIFNlcmlhbGl6YWJsZSB7CisKKyAgICBwdWJsaWMgdm9pZCBzZXNzaW9uRGlkQWN0aXZhdGUoSHR0cFNlc3Npb25FdmVudCBldmVudCkgeworICAgICAgICBldmVudC5nZXRTZXNzaW9uKCkuZ2V0U2VydmxldENvbnRleHQoKS5sb2cKKyAgICAgICAgICAgICgiU2Vzc2lvbkxpc3RlbmVyMDM6IHNlc3Npb25EaWRBY3RpdmF0ZSgiICsKKyAgICAgICAgICAgICBldmVudC5nZXRTZXNzaW9uKCkuZ2V0SWQoKSArICIpIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2Vzc2lvbldpbGxQYXNzaXZhdGUoSHR0cFNlc3Npb25FdmVudCBldmVudCkgeworICAgICAgICBldmVudC5nZXRTZXNzaW9uKCkuZ2V0U2VydmxldENvbnRleHQoKS5sb2cKKyAgICAgICAgICAgICgiU2Vzc2lvbkxpc3RlbmVyMDM6IHNlc3Npb25XaWxsUGFzc2l2YXRlKCIgKworICAgICAgICAgICAgIGV2ZW50LmdldFNlc3Npb24oKS5nZXRJZCgpICsgIikiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2YWx1ZUJvdW5kKEh0dHBTZXNzaW9uQmluZGluZ0V2ZW50IGV2ZW50KSB7CisgICAgICAgIGV2ZW50LmdldFNlc3Npb24oKS5nZXRTZXJ2bGV0Q29udGV4dCgpLmxvZworICAgICAgICAgICAgKCJTZXNzaW9uTGlzdGVuZXIwMzogdmFsdWVCb3VuZCgiICsKKyAgICAgICAgICAgICBldmVudC5nZXRTZXNzaW9uKCkuZ2V0SWQoKSArICIsIiArCisgICAgICAgICAgICAgZXZlbnQuZ2V0TmFtZSgpICsgIikiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2YWx1ZVVuYm91bmQoSHR0cFNlc3Npb25CaW5kaW5nRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgZXZlbnQuZ2V0U2Vzc2lvbigpLmdldFNlcnZsZXRDb250ZXh0KCkubG9nCisgICAgICAgICAgICAoIlNlc3Npb25MaXN0ZW5lcjAzOiB2YWx1ZVVuYm91bmQoIiArCisgICAgICAgICAgICAgZXZlbnQuZ2V0U2Vzc2lvbigpLmdldElkKCkgKyAiLCIgKworICAgICAgICAgICAgIGV2ZW50LmdldE5hbWUoKSArICIpIik7CisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9TZXRCdWZmZXJTaXplMDEuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9TZXRCdWZmZXJTaXplMDEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTA2N2RiCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1NldEJ1ZmZlclNpemUwMS5qYXZhCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwgMjAwMCAsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50ZXN0ZXI7CisKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lio7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7CisKKworLyoqCisgKiBOZWdhdGl2ZSB0ZXN0IGZvciBTZXJ2bGV0UmVzcG9uc2Uuc2V0QnVmZmVyU2l6ZSgpLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgU2V0QnVmZmVyU2l6ZTAxIGV4dGVuZHMgR2VuZXJpY1NlcnZsZXQgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUHJvY2VzcyBhIHNlcnZsZXQgcmVxdWVzdCBhbmQgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIHJlc3BvbnNlLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXJ2aWNlKFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9wbGFpbiIpOworICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSByZXNwb25zZS5nZXRXcml0ZXIoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiU2V0QnVmZmVyU2l6ZTAxICIpOworICAgICAgICAgICAgcmVzcG9uc2UuZmx1c2hCdWZmZXIoKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNldEJ1ZmZlclNpemUoMTAwKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJGQUlMRUQgLSBEaWQgbm90IHRocm93IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIlBBU1NFRCIpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiRkFJTEVEIC0gZmx1c2hCdWZmZXIoKSB0aHJldyBJT0V4Y2VwdGlvbiIpOworICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBTdGF0aWNMb2dnZXIucmVhZCgpOworICAgICAgICAgICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKG1lc3NhZ2UpOworICAgICAgICB9CisgICAgICAgIFN0YXRpY0xvZ2dlci5yZXNldCgpOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9TZXRMb2NhbGUwMS5qYXZhIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1NldExvY2FsZTAxLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE4N2E5OQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9TZXRMb2NhbGUwMS5qYXZhCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwgMjAwMCAsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50ZXN0ZXI7CisKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lio7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7CisKKworLyoqCisgKiBQb3NpdGl2ZSB0ZXN0IGZvciBTZXJ2bGV0UmVzcG9uc2Uuc2V0TG9jYWxlKCkuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBTZXRMb2NhbGUwMSBleHRlbmRzIEdlbmVyaWNTZXJ2bGV0IHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgYSBzZXJ2bGV0IHJlcXVlc3QgYW5kIGNyZWF0ZSB0aGUgY29ycmVzcG9uZGluZyByZXNwb25zZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2VydmljZShTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvcGxhaW4iKTsKKyAgICAgICAgcmVzcG9uc2Uuc2V0TG9jYWxlKG5ldyBMb2NhbGUoImVuIiwgIlVTIikpOworICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSByZXNwb25zZS5nZXRXcml0ZXIoKTsKKyAgICAgICAgd3JpdGVyLnByaW50bG4oIlNldExvY2FsZTAxIFBBU1NFRCIpOworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBTdGF0aWNMb2dnZXIucmVhZCgpOworICAgICAgICAgICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKG1lc3NhZ2UpOworICAgICAgICB9CisgICAgICAgIFN0YXRpY0xvZ2dlci5yZXNldCgpOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9TdGF0aWNGaWx0ZXIuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9TdGF0aWNGaWx0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTc4NzgwCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1N0YXRpY0ZpbHRlci5qYXZhCkBAIC0wLDAgKzEsODggQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwgMjAwMCwgMjAwMSAsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50ZXN0ZXI7CisKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lio7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7CisKKy8qKgorICogU2ltcGxlIGZpbHRlciB0byByZXNldCB0aGUgc3RhdGljIGxvZyBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggcmVxdWVzdCwKKyAqIHNvIHRoYXQgbm8gbGVmdG92ZXJzIGZyb20gdGhlIHByZXZpb3VzIHJlcXVlc3QgYXJlIGluYWR2ZXJ0ZW50bHkgaW5jbHVkZWQuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBTdGF0aWNGaWx0ZXIgaW1wbGVtZW50cyBGaWx0ZXIgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIGZpbHRlciBjb25maWd1cmF0aW9uIG9iamVjdCBmb3IgdGhpcyBmaWx0ZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIEZpbHRlckNvbmZpZyBjb25maWcgPSBudWxsOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmVsZWFzZSB0aGlzIEZpbHRlciBpbnN0YW5jZSBmcm9tIHNlcnZpY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZGVzdHJveSgpIHsKKworICAgICAgICBjb25maWcgPSBudWxsOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBXcmFwIHRoaXMgcmVxdWVzdCBhbmQvb3IgcmVzcG9uc2UgYXMgY29uZmlndXJlZCBhbmQgcGFzcyBpdCBvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkb0ZpbHRlcihTZXJ2bGV0UmVxdWVzdCBpblJlcXVlc3QsIFNlcnZsZXRSZXNwb25zZSBpblJlc3BvbnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZpbHRlckNoYWluIGNoYWluKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIFJlc2V0IG91ciBsb2dnZXIgYW5kIHBlcmZvcm0gdGhpcyByZXF1ZXN0CisgICAgICAgIFN0YXRpY0xvZ2dlci5yZXNldCgpOworICAgICAgICBjaGFpbi5kb0ZpbHRlcihpblJlcXVlc3QsIGluUmVzcG9uc2UpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBQbGFjZSB0aGlzIEZpbHRlciBpbnN0YW5jZSBpbnRvIHNlcnZpY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29uZmlnIFRoZSBmaWx0ZXIgY29uZmlndXJhdGlvbiBvYmplY3QKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbml0KEZpbHRlckNvbmZpZyBjb25maWcpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZzsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvU3RhdGljTG9nZ2VyLmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvU3RhdGljTG9nZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJlOTE3YwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9TdGF0aWNMb2dnZXIuamF2YQpAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworCisvKioKKyAqIExvZ2dlciB0aGF0IHVzZXMgYSBzdGF0aWMgbWVzc2FnZSBidWZmZXIgdG8gZmFjaWxpdGF0ZSBpbnRyYS13ZWItYXBwCisgKiByZWNvcmRpbmcgYW5kIHJldHJpZXZhbCBvZiBsb2cgbWVzc2FnZXMuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBTdGF0aWNMb2dnZXIgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTdGF0aWMgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBzZXQgb2YgbWVzc2FnZXMgdGhhdCBoYXZlIGJlZW4gbG9nZ2VkLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgQXJyYXlMaXN0IG1lc3NhZ2VzID0gbmV3IEFycmF5TGlzdCgpOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgaW5kZXggb2YgdGhlIG5leHQgbWVzc2FnZSB0aGF0IHdpbGwgYmUgcmV0cmlldmVkIGJ5IGEgcmVhZCgpIGNhbGwuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBpbnQgcG9zaXRpb24gPSAwOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBuZXh0IG1lc3NhZ2UgdGhhdCBoYXMgYmVlbiBsb2dnZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+CisgICAgICogaWYgdGhlcmUgYXJlIG5vIG1vcmUgbWVzc2FnZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcmVhZCgpIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKG1lc3NhZ2VzKSB7CisgICAgICAgICAgICBpZiAocG9zaXRpb24gPCBtZXNzYWdlcy5zaXplKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuICgoU3RyaW5nKSBtZXNzYWdlcy5nZXQocG9zaXRpb24rKykpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVzZXQgdGhlIG1lc3NhZ2VzIGJ1ZmZlciBhbmQgcG9zaXRpb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHJlc2V0KCkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAobWVzc2FnZXMpIHsKKyAgICAgICAgICAgIG1lc3NhZ2VzLmNsZWFyKCk7CisgICAgICAgICAgICBwb3NpdGlvbiA9IDA7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogV3JpdGUgYSBuZXcgbWVzc2FnZSB0byB0aGUgZW5kIG9mIHRoZSBtZXNzYWdlcyBidWZmZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBiZSBhZGRlZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZShTdHJpbmcgbWVzc2FnZSkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAobWVzc2FnZXMpIHsKKyAgICAgICAgICAgIG1lc3NhZ2VzLmFkZChtZXNzYWdlKTsKKyAgICAgICAgfQorCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9UZXN0Q2xpZW50LmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvVGVzdENsaWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljZTkwYzQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvVGVzdENsaWVudC5qYXZhCkBAIC0wLDAgKzEsMTA0NiBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5uZXQuQ29ubmVjdEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5IdHRwVVJMQ29ubmVjdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CisKKworLyoqCisgKiA8cD5UaGlzIGNsYXNzIGNvbnRhaW5zIGEgPHN0cm9uZz5UYXNrPC9zdHJvbmc+IGZvciBBbnQgdGhhdCBpcyB1c2VkIHRvCisgKiBzZW5kIEhUVFAgcmVxdWVzdHMgdG8gYSBzZXJ2bGV0IGNvbnRhaW5lciwgYW5kIGV4YW1pbmUgdGhlIHJlc3BvbnNlcy4KKyAqIEl0IGlzIHNpbWlsYXIgaW4gcHVycG9zZSB0byB0aGUgPGNvZGU+R1Rlc3Q8L2NvZGU+IHRhc2sgaW4gV2F0Y2hkb2csCisgKiBidXQgdXNlcyB0aGUgSkRLJ3MgSHR0cFVSTENvbm5lY3Rpb24gZm9yIHVuZGVybHlpbmcgY29ubmVjdGl2aXR5LjwvcD4KKyAqCisgKiA8cD5UaGUgdGFzayBpcyByZWdpc3RlcmVkIHdpdGggQW50IHVzaW5nIGEgPGNvZGU+dGFza2RlZjwvY29kZT4gZGlyZWN0aXZlOgorICogPHByZT4KKyAqICAgJmx0O3Rhc2tkZWYgbmFtZT0idGVzdGVyIiBjbGFzc25hbWU9Im9yZy5hcGFjaGUudGVzdGVyLlRlc3RDbGllbnQiJmd0OworICogPC9wcmU+CisgKiBhbmQgYWNjZXB0cyB0aGUgZm9sbG93aW5nIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllczo8L3A+CisgKiA8dWw+CisgKiA8bGk+PHN0cm9uZz5nb2xkZW48L3N0cm9uZz4gLSBUaGUgc2VydmVyLXJlbGF0aXZlIHBhdGggb2YgdGhlIHN0YXRpYworICogICAgIHJlc291cmNlIGNvbnRhaW5pbmcgdGhlIGdvbGRlbiBmaWxlIGZvciB0aGlzIHJlcXVlc3QuPC9saT4KKyAqIDxsaT48c3Ryb25nPmhvc3Q8L3N0cm9uZz4gLSBUaGUgc2VydmVyIG5hbWUgdG8gd2hpY2ggdGhpcyByZXF1ZXN0IHdpbGwgYmUKKyAqICAgICBzZW50LiAgRGVmYXVsdHMgdG8gPGNvZGU+bG9jYWxob3N0PC9jb2RlPiBpZiBub3Qgc3BlY2lmaWVkLjwvbGk+CisgKiA8bGk+PHN0cm9uZz5pbkNvbnRlbnQ8L3N0cm9uZz4gLSBUaGUgZGF0YSBjb250ZW50IHRoYXQgd2lsbCBiZSBzdWJtaXR0ZWQKKyAqICAgICB3aXRoIHRoaXMgcmVxdWVzdC4gIFRoZSB0ZXN0IGNsaWVudCB3aWxsIHRyYW5zcGFyZW50bHkgYWRkIGEgY2FycmlhZ2UKKyAqICAgICByZXR1cm4gYW5kIGxpbmUgZmVlZCwgYW5kIHNldCB0aGUgY29udGVudCBsZW5ndGggaGVhZGVyLCBpZiB0aGlzIGlzCisgKiAgICAgc3BlY2lmaWVkLiAgT3RoZXJ3aXNlLCBubyBjb250ZW50IHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIHJlcXVlc3QuPC9saT4KKyAqIDxsaT48c3Ryb25nPmluSGVhZGVyczwvc3Ryb25nPiAtIFRoZSBzZXQgb2Ygb25lIG9yIG1vcmUgSFRUUCBoZWFkZXJzIHRoYXQKKyAqICAgICB3aWxsIGJlIGluY2x1ZGVkIG9uIHRoZSByZXF1ZXN0LjwvbGk+CisgKiA8bGk+PHN0cm9uZz5tZXNzYWdlPC9zdHJvbmc+IC0gVGhlIEhUVFAgcmVzcG9uc2UgbWVzc2FnZSB0aGF0IGlzIGV4cGVjdGVkCisgKiAgICAgaW4gdGhlIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZlci4gIE5vIGNoZWNrIGlzIG1hZGUgaWYgbm8gbWVzc2FnZQorICogICAgIGlzIHNwZWNpZmllZC48L2xpPgorICogPGxpPjxzdHJvbmc+bWV0aG9kPC9zdHJvbmc+IC0gVGhlIEhUVFAgcmVxdWVzdCBtZXRob2QgdG8gYmUgdXNlZCBvbiB0aGlzCisgKiAgICAgcmVxdWVzdC4gIERlZmF1bHRzIHRvIDxvY2RlPkdFVDwvY29kZT4gaWYgbm90IHNwZWNpZmllZC48L2xpPgorICogPGxpPjxzdHJvbmc+b3V0Q29udGVudDwvc3Ryb25nPiAtIFRoZSBmaXJzdCBsaW5lIG9mIHRoZSByZXNwb25zZSBkYXRhCisgKiAgICAgY29udGVudCB0aGF0IHdlIGV4cGVjdCB0byByZWNlaXZlLiAgTm8gY2hlY2sgaXMgbWFkZSBpZiBubyBjb250ZW50IGlzCisgKiAgICAgc3BlY2lmaWVkLjwvbGk+CisgKiA8bGk+PHN0cm9uZz5vdXRIZWFkZXJzPC9zdHJvbmc+IC0gVGhlIHNldCBvZiBvbmUgb3IgbW9yZSBIVFRQIGhlYWRlcnMgdGhhdAorICogICAgIGFyZSBleHBlY3RlZCBpbiB0aGUgcmVzcG9uc2UgKG9yZGVyIGluZGVwZW5kZW50KS48L2xpPgorICogPGxpPjxzdHJvbmc+cG9ydDwvc3Ryb25nPiAtIFRoZSBwb3J0IG51bWJlciB0byB3aGljaCB0aGlzIHJlcXVlc3Qgd2lsbCBiZQorICogICAgIHNlbnQuICBEZWZhdWx0cyB0byA8Y29kZT44MDgwPC9jb2RlPiBpZiBub3Qgc3BlY2lmaWVkLjwvbGk+CisgKiA8bGk+PHN0cm9uZz5yZWRpcmVjdDwvc3Ryb25nPiAtIElmIHNldCB0byB0cnVlLCBmb2xsb3cgYW55IHJlZGlyZWN0IHRoYXQKKyAqICAgICBpcyByZXR1cm5lZCBieSB0aGUgc2VydmVyLiAgKE9ubHkgd29ya3Mgd2hlbiB1c2luZyBIdHRwVVJMQ29ubmVjdGlvbikuCisgKiAgICAgPC9saT4KKyAqIDxsaT48c3Ryb25nPnJlcXVlc3Q8L3N0cm9uZz4gLSBUaGUgcmVxdWVzdCBVUkkgdG8gYmUgdHJhbnNtaXR0ZWQgZm9yIHRoaXMKKyAqICAgICByZXF1ZXN0LiAgVGhpcyB2YWx1ZSBzaG91bGQgc3RhcnQgd2l0aCBhIHNsYXNoIGNoYXJhY3RlciAoIi8iKSwgYW5kCisgKiAgICAgYmUgdGhlIHNlcnZlci1yZWxhdGl2ZSBVUkkgb2YgdGhlIHJlcXVlc3RlZCByZXNvdXJjZS48L2xpPgorICogPGxpPjxzdHJvbmc+c3RhdHVzPC9zdHJvbmc+IC0gVGhlIEhUVFAgc3RhdHVzIGNvZGUgdGhhdCBpcyBleHBlY3RlZCBpbiB0aGUKKyAqICAgICByZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXIuICBEZWZhdWx0cyB0byA8Y29kZT4yMDA8L2NvZGU+IGlmIG5vdAorICogICAgIHNwZWNpZmllZC4gIFNldCB0byB6ZXJvIHRvIGRpc2FibGUgY2hlY2tpbmcgdGhlIHJldHVybiB2YWx1ZS48L2xpPgorICogPC91bD4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIFRlc3RDbGllbnQgZXh0ZW5kcyBUYXNrIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBzYXZlZCBnb2xkZW4gZmlsZSB3ZSB3aWxsIGNvbXBhcmUgdG8gdGhlIHJlc3BvbnNlLiAgRWFjaCBlbGVtZW50CisgICAgICogY29udGFpbnMgYSBsaW5lIG9mIHRleHQgd2l0aG91dCBhbnkgbGluZSBkZWxpbWl0ZXJzLgorICAgICAqLworICAgIHByb3RlY3RlZCBBcnJheUxpc3Qgc2F2ZUdvbGRlbiA9IG5ldyBBcnJheUxpc3QoKTsKKworCisgICAgLyoqCisgICAgICogVGhlIHNhdmVkIGhlYWRlcnMgd2UgcmVjZWl2ZWQgaW4gb3VyIHJlc3BvbnNlLiAgVGhlIGtleSBpcyB0aGUgaGVhZGVyCisgICAgICogbmFtZSAoY29udmVydGVkIHRvIGxvd2VyIGNhc2UpLCBhbmQgdGhlIHZhbHVlIGlzIGFuIEFycmF5TGlzdCBvZiB0aGUKKyAgICAgKiBzdHJpbmcgdmFsdWUocykgcmVjZWl2ZWQgZm9yIHRoYXQgaGVhZGVyLgorICAgICAqLworICAgIHByb3RlY3RlZCBIYXNoTWFwIHNhdmVIZWFkZXJzID0gbmV3IEhhc2hNYXAoKTsKKworCisgICAgLyoqCisgICAgICogVGhlIHJlc3BvbnNlIGZpbGUgdG8gYmUgY29tcGFyZWQgdG8gdGhlIGdvbGRlbiBmaWxlLiAgRWFjaCBlbGVtZW50CisgICAgICogY29udGFpbnMgYSBsaW5lIG9mIHRleHQgd2l0aG91dCBhbnkgbGluZSBkZWxpbWl0ZXJzLgorICAgICAqLworICAgIHByb3RlY3RlZCBBcnJheUxpc3Qgc2F2ZVJlc3BvbnNlID0gbmV3IEFycmF5TGlzdCgpOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogVGhlIGRlYnVnZ2luZyBkZXRhaWwgbGV2ZWwgZm9yIHRoaXMgZXhlY3V0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgZGVidWcgPSAwOworCisgICAgcHVibGljIGludCBnZXREZWJ1ZygpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLmRlYnVnKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREZWJ1ZyhpbnQgZGVidWcpIHsKKyAgICAgICAgdGhpcy5kZWJ1ZyA9IGRlYnVnOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIHNlcnZlci1yZWxhdGl2ZSByZXF1ZXN0IFVSSSBvZiB0aGUgZ29sZGVuIGZpbGUgZm9yIHRoaXMgcmVxdWVzdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdvbGRlbiA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEdvbGRlbigpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLmdvbGRlbik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0R29sZGVuKFN0cmluZyBnb2xkZW4pIHsKKyAgICAgICAgdGhpcy5nb2xkZW4gPSBnb2xkZW47CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgaG9zdCBuYW1lIHRvIHdoaWNoIHdlIHdpbGwgY29ubmVjdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGhvc3QgPSAibG9jYWxob3N0IjsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SG9zdCgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLmhvc3QpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEhvc3QoU3RyaW5nIGhvc3QpIHsKKyAgICAgICAgdGhpcy5ob3N0ID0gaG9zdDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSBmaXJzdCBsaW5lIG9mIHRoZSByZXF1ZXN0IGRhdGEgdGhhdCB3aWxsIGJlIGluY2x1ZGVkIG9uIHRoaXMKKyAgICAgKiByZXF1ZXN0LgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgaW5Db250ZW50ID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5Db250ZW50KCkgeworICAgICAgICByZXR1cm4gKHRoaXMuaW5Db250ZW50KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJbkNvbnRlbnQoU3RyaW5nIGluQ29udGVudCkgeworICAgICAgICB0aGlzLmluQ29udGVudCA9IGluQ29udGVudDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSBIVFRQIGhlYWRlcnMgdG8gYmUgaW5jbHVkZWQgb24gdGhlIHJlcXVlc3QuICBTeW50YXggaXMKKyAgICAgKiA8Y29kZT57bmFtZX06e3ZhbHVlfVsjI3tuYW1lfTp7dmFsdWV9XSAuLi48L2NvZGU+LgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgaW5IZWFkZXJzID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5IZWFkZXJzKCkgeworICAgICAgICByZXR1cm4gKHRoaXMuaW5IZWFkZXJzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJbkhlYWRlcnMoU3RyaW5nIGluSGVhZGVycykgeworICAgICAgICB0aGlzLmluSGVhZGVycyA9IGluSGVhZGVyczsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNob3VsZCB3ZSBqb2luIHRoZSBzZXNzaW9uIHdob3NlIHNlc3Npb24gaWRlbnRpZmllciB3YXMgcmV0dXJuZWQKKyAgICAgKiBvbiB0aGUgcHJldmlvdXMgcmVxdWVzdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBqb2luU2Vzc2lvbiA9IGZhbHNlOworCisgICAgcHVibGljIGJvb2xlYW4gZ2V0Sm9pblNlc3Npb24oKSB7CisgICAgICAgIHJldHVybiAodGhpcy5qb2luU2Vzc2lvbik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Sm9pblNlc3Npb24oYm9vbGVhbiBqb2luU2Vzc2lvbikgeworICAgICAgICB0aGlzLmpvaW5TZXNzaW9uID0gdHJ1ZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSBIVFRQIHJlc3BvbnNlIG1lc3NhZ2UgdG8gYmUgZXhwZWN0ZWQgaW4gdGhlIHJlc3BvbnNlLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgbWVzc2FnZSA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5tZXNzYWdlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgSFRUUCByZXF1ZXN0IG1ldGhvZCB0aGF0IHdpbGwgYmUgdXNlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIG1ldGhvZCA9ICJHRVQiOworCisgICAgcHVibGljIFN0cmluZyBnZXRNZXRob2QoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5tZXRob2QpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1ldGhvZChTdHJpbmcgbWV0aG9kKSB7CisgICAgICAgIHRoaXMubWV0aG9kID0gbWV0aG9kOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIGZpcnN0IGxpbmUgb2YgdGhlIHJlc3BvbnNlIGRhdGEgY29udGVudCB0aGF0IHdlIGV4cGVjdCB0byByZWNlaXZlLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgb3V0Q29udGVudCA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE91dENvbnRlbnQoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5vdXRDb250ZW50KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRPdXRDb250ZW50KFN0cmluZyBvdXRDb250ZW50KSB7CisgICAgICAgIHRoaXMub3V0Q29udGVudCA9IG91dENvbnRlbnQ7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgSFRUUCBoZWFkZXJzIHRvIGJlIGNoZWNrZWQgb24gdGhlIHJlc3BvbnNlLiAgU3ludGF4IGlzCisgICAgICogPGNvZGU+e25hbWV9Ont2YWx1ZX1bIyN7bmFtZX06e3ZhbHVlfV0gLi4uPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIG91dEhlYWRlcnMgPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXRPdXRIZWFkZXJzKCkgeworICAgICAgICByZXR1cm4gKHRoaXMub3V0SGVhZGVycyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0T3V0SGVhZGVycyhTdHJpbmcgb3V0SGVhZGVycykgeworICAgICAgICB0aGlzLm91dEhlYWRlcnMgPSBvdXRIZWFkZXJzOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIHBvcnQgbnVtYmVyIHRvIHdoaWNoIHdlIHdpbGwgY29ubmVjdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IHBvcnQgPSA4MDgwOworCisgICAgcHVibGljIGludCBnZXRQb3J0KCkgeworICAgICAgICByZXR1cm4gKHRoaXMucG9ydCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UG9ydChpbnQgcG9ydCkgeworICAgICAgICB0aGlzLnBvcnQgPSBwb3J0OworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIHByb3RvY29sIGFuZCB2ZXJzaW9uIHRvIGluY2x1ZGUgaW4gdGhlIHJlcXVlc3QsIGlmIGV4ZWN1dGVkIGFzCisgICAgICogYSBkaXJlY3Qgc29ja2V0IGNvbm5lY3Rpb24uICBMYWNrIG9mIGEgdmFsdWUgaGVyZSBpbmRpY2F0ZXMgdGhhdCBhbgorICAgICAqIEh0dHBVUkxDb25uZWN0aW9uIHNob3VsZCBiZSB1c2VkIGluc3RlYWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBwcm90b2NvbCA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFByb3RvY29sKCkgeworICAgICAgICByZXR1cm4gKHRoaXMucHJvdG9jb2wpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFByb3RvY29sKFN0cmluZyBwcm90b2NvbCkgeworICAgICAgICB0aGlzLnByb3RvY29sID0gcHJvdG9jb2w7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTaG91bGQgd2UgZm9sbG93IHJlZGlyZWN0cyByZXR1cm5lZCBieSB0aGUgc2VydmVyPworICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIHJlZGlyZWN0ID0gZmFsc2U7CisKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRSZWRpcmVjdCgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLnJlZGlyZWN0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRSZWRpcmVjdChib29sZWFuIHJlZGlyZWN0KSB7CisgICAgICAgIHRoaXMucmVkaXJlY3QgPSByZWRpcmVjdDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSByZXF1ZXN0IFVSSSB0byBiZSBzZW50IHRvIHRoZSBzZXJ2ZXIuICBUaGlzIHZhbHVlIGlzIHJlcXVpcmVkLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgcmVxdWVzdCA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlcXVlc3QoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5yZXF1ZXN0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRSZXF1ZXN0KFN0cmluZyByZXF1ZXN0KSB7CisgICAgICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgSFRUUCBzdGF0dXMgY29kZSBleHBlY3RlZCBvbiB0aGUgcmVzcG9uc2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIGludCBzdGF0dXMgPSAyMDA7CisKKyAgICBwdWJsaWMgaW50IGdldFN0YXR1cygpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLnN0YXR1cyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U3RhdHVzKGludCBzdGF0dXMpIHsKKyAgICAgICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFN0YXRpYyBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIHNlc3Npb24gaWRlbnRpZmllciByZXR1cm5lZCBieSB0aGUgbW9zdCByZWNlbnQgcmVxdWVzdCwgb3IKKyAgICAgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcHJldmlvdXMgcmVxdWVzdCBkaWQgbm90IHNwZWNpZnkgYSBzZXNzaW9uCisgICAgICogaWRlbnRpZmllci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBzZXNzaW9uSWQgPSBudWxsOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogRXhlY3V0ZSB0aGUgdGVzdCB0aGF0IGhhcyBiZWVuIGNvbmZpZ3VyZWQgYnkgb3VyIHByb3BlcnR5IHNldHRpbmdzLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiBhbiBleGNlcHRpb24gb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisKKyAgICAgICAgc2F2ZUhlYWRlcnMuY2xlYXIoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRHb2xkZW4oKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9nKCJGQUlMOiAgcmVhZEdvbGRlbigiICsgZ29sZGVuICsgIikiKTsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5vdXQpOworICAgICAgICB9CisgICAgICAgIGlmICgocHJvdG9jb2wgPT0gbnVsbCkgfHwgKHByb3RvY29sLmxlbmd0aCgpID09IDApKQorICAgICAgICAgICAgZXhlY3V0ZUh0dHAoKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZXhlY3V0ZVNvY2tldCgpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvdGVjdGVkIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogRXhlY3V0ZSB0aGUgdGVzdCB2aWEgdXNlIG9mIGFuIEh0dHBVUkxDb25uZWN0aW9uLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiBhbiBleGNlcHRpb24gb2NjdXJzCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZUh0dHAoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworCisgICAgICAgIC8vIENvbnN0cnVjdCBhIHN1bW1hcnkgb2YgdGhlIHJlcXVlc3Qgd2Ugd2lsbCBiZSBzZW5kaW5nCisgICAgICAgIFN0cmluZyBzdW1tYXJ5ID0gIlsiICsgbWV0aG9kICsgIiAiICsgcmVxdWVzdCArICJdIjsKKyAgICAgICAgaWYgKGRlYnVnID49IDEpCisgICAgICAgICAgICBsb2coIlJRU1Q6ICIgKyBzdW1tYXJ5KTsKKyAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gdHJ1ZTsKKyAgICAgICAgU3RyaW5nIHJlc3VsdCA9IG51bGw7CisgICAgICAgIFRocm93YWJsZSB0aHJvd2FibGUgPSBudWxsOworICAgICAgICBIdHRwVVJMQ29ubmVjdGlvbiBjb25uID0gbnVsbDsKKworICAgICAgICB0cnkgeworCisgICAgICAgICAgICAvLyBDb25maWd1cmUgYW4gSHR0cFVSTENvbm5lY3Rpb24gZm9yIHRoaXMgcmVxdWVzdAorICAgICAgICAgICAgVVJMIHVybCA9IG5ldyBVUkwoImh0dHAiLCBob3N0LCBwb3J0LCByZXF1ZXN0KTsKKyAgICAgICAgICAgIGNvbm4gPSAoSHR0cFVSTENvbm5lY3Rpb24pIHVybC5vcGVuQ29ubmVjdGlvbigpOworICAgICAgICAgICAgY29ubi5zZXRBbGxvd1VzZXJJbnRlcmFjdGlvbihmYWxzZSk7CisgICAgICAgICAgICBjb25uLnNldERvSW5wdXQodHJ1ZSk7CisgICAgICAgICAgICBpZiAoaW5Db250ZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjb25uLnNldERvT3V0cHV0KHRydWUpOworICAgICAgICAgICAgICAgIGNvbm4uc2V0UmVxdWVzdFByb3BlcnR5KCJDb250ZW50LUxlbmd0aCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIgKyBpbkNvbnRlbnQubGVuZ3RoKCkpOworICAgICAgICAgICAgICAgIGlmIChkZWJ1ZyA+PSAxKQorICAgICAgICAgICAgICAgICAgICBsb2coIklOUEg6IENvbnRlbnQtTGVuZ3RoOiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQ29udGVudC5sZW5ndGgoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNvbm4uc2V0RG9PdXRwdXQoZmFsc2UpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBTZW5kIHRoZSBzZXNzaW9uIGlkIGNvb2tpZSAoaWYgYW55KQorICAgICAgICAgICAgaWYgKGpvaW5TZXNzaW9uICYmIChzZXNzaW9uSWQgIT0gbnVsbCkpIHsKKyAgICAgICAgICAgICAgICBjb25uLnNldFJlcXVlc3RQcm9wZXJ0eSgiQ29va2llIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSlNFU1NJT05JRD0iICsgc2Vzc2lvbklkKTsKKyAgICAgICAgICAgICAgICBpZiAoZGVidWcgPj0gMSkKKyAgICAgICAgICAgICAgICAgICAgbG9nKCJJTlBIOiBDb29raWU6IEpTRVNTSU9OSUQ9IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodGhpcy5yZWRpcmVjdCAmJiAoZGVidWcgPj0gMSkpCisgICAgICAgICAgICAgICAgbG9nKCJGTEFHOiBzZXRJbnN0YW5jZUZvbGxvd1JlZGlyZWN0cygiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWRpcmVjdCArICIpIik7CisgICAgICAgICAgICBjb25uLnNldEluc3RhbmNlRm9sbG93UmVkaXJlY3RzKHRoaXMucmVkaXJlY3QpOworICAgICAgICAgICAgY29ubi5zZXRSZXF1ZXN0TWV0aG9kKG1ldGhvZCk7CisgICAgICAgICAgICBpZiAoaW5IZWFkZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgaGVhZGVycyA9IGluSGVhZGVyczsKKyAgICAgICAgICAgICAgICB3aGlsZSAoaGVhZGVycy5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGRlbGltaXRlciA9IGhlYWRlcnMuaW5kZXhPZigiIyMiKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlYWRlciA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIGlmIChkZWxpbWl0ZXIgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXIgPSBoZWFkZXJzOworICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVycyA9ICIiOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyID0gaGVhZGVycy5zdWJzdHJpbmcoMCwgZGVsaW1pdGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnN1YnN0cmluZyhkZWxpbWl0ZXIgKyAyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpbnQgY29sb24gPSBoZWFkZXIuaW5kZXhPZigiOiIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY29sb24gPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gaGVhZGVyLnN1YnN0cmluZygwLCBjb2xvbikudHJpbSgpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBoZWFkZXIuc3Vic3RyaW5nKGNvbG9uICsgMSkudHJpbSgpOworICAgICAgICAgICAgICAgICAgICBjb25uLnNldFJlcXVlc3RQcm9wZXJ0eShuYW1lLCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1ZyA+PSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJJTlBIOiAiICsgbmFtZSArICI6ICIgKyB2YWx1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBDb25uZWN0IHRvIHRoZSBzZXJ2ZXIgYW5kIHNlbmQgb3VyIG91dHB1dCBpZiBuZWNlc3NhcnkKKyAgICAgICAgICAgIGNvbm4uY29ubmVjdCgpOworICAgICAgICAgICAgaWYgKGluQ29udGVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKGRlYnVnID49IDEpCisgICAgICAgICAgICAgICAgICAgIGxvZygiSU5QRDogIiArIGluQ29udGVudCk7CisgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG9zID0gY29ubi5nZXRPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGluQ29udGVudC5sZW5ndGgoKTsgaSsrKQorICAgICAgICAgICAgICAgICAgICBvcy53cml0ZShpbkNvbnRlbnQuY2hhckF0KGkpKTsKKyAgICAgICAgICAgICAgICBvcy5jbG9zZSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBBY3F1aXJlIHRoZSByZXNwb25zZSBkYXRhLCBpZiB0aGVyZSBpcyBhbnkKKyAgICAgICAgICAgIFN0cmluZyBvdXREYXRhID0gIiI7CisgICAgICAgICAgICBTdHJpbmcgb3V0VGV4dCA9ICIiOworICAgICAgICAgICAgYm9vbGVhbiBlb2wgPSBmYWxzZTsKKyAgICAgICAgICAgIElucHV0U3RyZWFtIGlzID0gY29ubi5nZXRJbnB1dFN0cmVhbSgpOworICAgICAgICAgICAgaW50IGxpbmVzID0gMDsKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSByZWFkKGlzKTsKKyAgICAgICAgICAgICAgICBpZiAobGluZSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKGxpbmVzID09IDApCisgICAgICAgICAgICAgICAgICAgIG91dERhdGEgPSBsaW5lOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgb3V0VGV4dCArPSBsaW5lICsgIlxyXG4iOworICAgICAgICAgICAgICAgIHNhdmVSZXNwb25zZS5hZGQobGluZSk7CisgICAgICAgICAgICAgICAgbGluZXMrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlzLmNsb3NlKCk7CisKKyAgICAgICAgICAgIC8vIER1bXAgb3V0IHRoZSByZXNwb25zZSBzdHVmZgorICAgICAgICAgICAgaWYgKGRlYnVnID49IDEpCisgICAgICAgICAgICAgICAgbG9nKCJSRVNQOiAiICsgY29ubi5nZXRSZXNwb25zZUNvZGUoKSArICIgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm4uZ2V0UmVzcG9uc2VNZXNzYWdlKCkpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCAxMDAwOyBpKyspIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGNvbm4uZ2V0SGVhZGVyRmllbGRLZXkoaSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gY29ubi5nZXRIZWFkZXJGaWVsZChpKTsKKyAgICAgICAgICAgICAgICBpZiAoKG5hbWUgPT0gbnVsbCkgfHwgKHZhbHVlID09IG51bGwpKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBpZiAoZGVidWcgPj0gMSkKKyAgICAgICAgICAgICAgICAgICAgbG9nKCJIRUFEOiAiICsgbmFtZSArICI6ICIgKyB2YWx1ZSk7CisgICAgICAgICAgICAgICAgc2F2ZShuYW1lLCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgaWYgKCJTZXQtQ29va2llIi5lcXVhbHMobmFtZSkpCisgICAgICAgICAgICAgICAgICAgIHBhcnNlU2Vzc2lvbih2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZGVidWcgPj0gMSkgeworICAgICAgICAgICAgICAgIGxvZygiREFUQTogIiArIG91dERhdGEpOworICAgICAgICAgICAgICAgIGlmIChvdXRUZXh0Lmxlbmd0aCgpID4gMikKKyAgICAgICAgICAgICAgICAgICAgbG9nKCJURVhUOiAiICsgb3V0VGV4dCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFZhbGlkYXRlIHRoZSByZXNwb25zZSBhZ2FpbnN0IG91ciBjcml0ZXJpYQorICAgICAgICAgICAgaWYgKHN1Y2Nlc3MpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSB2YWxpZGF0ZVN0YXR1cyhjb25uLmdldFJlc3BvbnNlQ29kZSgpKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gdmFsaWRhdGVNZXNzYWdlKGNvbm4uZ2V0UmVzcG9uc2VNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN1Y2Nlc3MpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSB2YWxpZGF0ZUhlYWRlcnMoKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gdmFsaWRhdGVEYXRhKG91dERhdGEpOworICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN1Y2Nlc3MpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSB2YWxpZGF0ZUdvbGRlbigpOworICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyA9IGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICBpZiAodCBpbnN0YW5jZW9mIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gNDA0KSB7CisgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAiTm90IEZvdW5kIjsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3dhYmxlID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzdWNjZXNzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAiU3RhdHVzPSIgKyBjb25uLmdldFJlc3BvbnNlQ29kZSgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLCBNZXNzYWdlPSIgKyBjb25uLmdldFJlc3BvbnNlTWVzc2FnZSgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBlLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdGhyb3dhYmxlID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKHQgaW5zdGFuY2VvZiBDb25uZWN0RXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgc3VjY2VzcyA9IGZhbHNlOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IHQuZ2V0TWVzc2FnZSgpOworICAgICAgICAgICAgICAgIHRocm93YWJsZSA9IG51bGw7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSB0LmdldE1lc3NhZ2UoKTsKKyAgICAgICAgICAgICAgICB0aHJvd2FibGUgPSB0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gTG9nIHRoZSByZXN1bHRzIG9mIGV4ZWN1dGluZyB0aGlzIHJlcXVlc3QKKyAgICAgICAgaWYgKHN1Y2Nlc3MpCisgICAgICAgICAgICBsb2coIk9LICIgKyBzdW1tYXJ5KTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBsb2coIkZBSUwgIiArIHN1bW1hcnkgKyAiICIgKyByZXN1bHQpOworICAgICAgICAgICAgaWYgKHRocm93YWJsZSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93YWJsZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogRXhlY3V0ZSB0aGUgdGVzdCB2aWEgdXNlIG9mIGEgc29ja2V0IHdpdGggZGlyZWN0IGlucHV0L291dHB1dC4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgYW4gZXhjZXB0aW9uIG9jY3VycworICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGV4ZWN1dGVTb2NrZXQoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworCisgICAgICAgIC8vIENvbnN0cnVjdCBhIHN1bW1hcnkgb2YgdGhlIHJlcXVlc3Qgd2Ugd2lsbCBiZSBzZW5kaW5nCisgICAgICAgIFN0cmluZyBjb21tYW5kID0gbWV0aG9kICsgIiAiICsgcmVxdWVzdCArICIgIiArIHByb3RvY29sOworICAgICAgICBTdHJpbmcgc3VtbWFyeSA9ICJbIiArIGNvbW1hbmQgKyAiXSI7CisgICAgICAgIGlmIChkZWJ1ZyA+PSAxKQorICAgICAgICAgICAgbG9nKCJSUVNUOiAiICsgc3VtbWFyeSk7CisgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9IHRydWU7CisgICAgICAgIFN0cmluZyByZXN1bHQgPSBudWxsOworICAgICAgICBTb2NrZXQgc29ja2V0ID0gbnVsbDsKKyAgICAgICAgT3V0cHV0U3RyZWFtIG9zID0gbnVsbDsKKyAgICAgICAgUHJpbnRXcml0ZXIgcHcgPSBudWxsOworICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IG51bGw7CisgICAgICAgIFRocm93YWJsZSB0aHJvd2FibGUgPSBudWxsOworICAgICAgICBpbnQgb3V0U3RhdHVzID0gMDsKKyAgICAgICAgU3RyaW5nIG91dE1lc3NhZ2UgPSBudWxsOworCisgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgIC8vIE9wZW4gYSBjbGllbnQgc29ja2V0IGZvciB0aGlzIHJlcXVlc3QKKyAgICAgICAgICAgIHNvY2tldCA9IG5ldyBTb2NrZXQoaG9zdCwgcG9ydCk7CisgICAgICAgICAgICBvcyA9IHNvY2tldC5nZXRPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIHB3ID0gbmV3IFByaW50V3JpdGVyKG9zKTsKKyAgICAgICAgICAgIGlzID0gc29ja2V0LmdldElucHV0U3RyZWFtKCk7CisKKyAgICAgICAgICAgIC8vIFNlbmQgdGhlIGNvbW1hbmQgYW5kIGNvbnRlbnQgbGVuZ3RoIGhlYWRlciAoaWYgYW55KQorICAgICAgICAgICAgcHcucHJpbnQoY29tbWFuZCArICJcclxuIik7CisgICAgICAgICAgICBpZiAoaW5Db250ZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAoZGVidWcgPj0gMSkKKyAgICAgICAgICAgICAgICAgICAgbG9nKCJJTlBIOiAiICsgIkNvbnRlbnQtTGVuZ3RoOiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQ29udGVudC5sZW5ndGgoKSk7CisgICAgICAgICAgICAgICAgcHcucHJpbnQoIkNvbnRlbnQtTGVuZ3RoOiAiICsgaW5Db250ZW50Lmxlbmd0aCgpICsgIlxyXG4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gU2VuZCB0aGUgc2Vzc2lvbiBpZCBjb29raWUgKGlmIGFueSkKKyAgICAgICAgICAgIGlmIChqb2luU2Vzc2lvbiAmJiAoc2Vzc2lvbklkICE9IG51bGwpKSB7CisgICAgICAgICAgICAgICAgcHcucHJpbnRsbigiQ29va2llOiBKU0VTU0lPTklEPSIgKyBzZXNzaW9uSWQpOworICAgICAgICAgICAgICAgIGlmIChkZWJ1ZyA+PSAxKQorICAgICAgICAgICAgICAgICAgICBsb2coIklOUEg6IENvb2tpZTogSlNFU1NJT05JRD0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFNlbmQgdGhlIHNwZWNpZmllZCBoZWFkZXJzIChpZiBhbnkpCisgICAgICAgICAgICBpZiAoaW5IZWFkZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgaGVhZGVycyA9IGluSGVhZGVyczsKKyAgICAgICAgICAgICAgICB3aGlsZSAoaGVhZGVycy5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGRlbGltaXRlciA9IGhlYWRlcnMuaW5kZXhPZigiIyMiKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlYWRlciA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIGlmIChkZWxpbWl0ZXIgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXIgPSBoZWFkZXJzOworICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVycyA9ICIiOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyID0gaGVhZGVycy5zdWJzdHJpbmcoMCwgZGVsaW1pdGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnN1YnN0cmluZyhkZWxpbWl0ZXIgKyAyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpbnQgY29sb24gPSBoZWFkZXIuaW5kZXhPZigiOiIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY29sb24gPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gaGVhZGVyLnN1YnN0cmluZygwLCBjb2xvbikudHJpbSgpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBoZWFkZXIuc3Vic3RyaW5nKGNvbG9uICsgMSkudHJpbSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoZGVidWcgPj0gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiSU5QSDogIiArIG5hbWUgKyAiOiAiICsgdmFsdWUpOworICAgICAgICAgICAgICAgICAgICBwdy5wcmludChuYW1lICsgIjogIiArIHZhbHVlICsgIlxyXG4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdy5wcmludCgiXHJcbiIpOworCisgICAgICAgICAgICAvLyBTZW5kIG91ciBjb250ZW50IChpZiBhbnkpCisgICAgICAgICAgICBpZiAoaW5Db250ZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAoZGVidWcgPj0gMSkKKyAgICAgICAgICAgICAgICAgICAgbG9nKCJJTlBEOiAiICsgaW5Db250ZW50KTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGluQ29udGVudC5sZW5ndGgoKTsgaSsrKQorICAgICAgICAgICAgICAgICAgICBwdy5wcmludChpbkNvbnRlbnQuY2hhckF0KGkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB3LmZsdXNoKCk7CisKKyAgICAgICAgICAgIC8vIFJlYWQgdGhlIHJlc3BvbnNlIHN0YXR1cyBhbmQgYXNzb2NpYXRlZCBtZXNzYWdlCisgICAgICAgICAgICBTdHJpbmcgbGluZSA9IHJlYWQoaXMpOworICAgICAgICAgICAgaWYgKGxpbmUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG91dFN0YXR1cyA9IC0xOworICAgICAgICAgICAgICAgIG91dE1lc3NhZ2UgPSAiTk8gUkVTUE9OU0UiOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBsaW5lID0gbGluZS50cmltKCk7CisgICAgICAgICAgICAgICAgaWYgKGRlYnVnID49IDEpCisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUkVTUDogIiArIGxpbmUpOworICAgICAgICAgICAgICAgIGludCBzcGFjZSA9IGxpbmUuaW5kZXhPZigiICIpOworICAgICAgICAgICAgICAgIGlmIChzcGFjZSA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLnN1YnN0cmluZyhzcGFjZSArIDEpLnRyaW0oKTsKKyAgICAgICAgICAgICAgICAgICAgc3BhY2UgPSBsaW5lLmluZGV4T2YoIiAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNwYWNlIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgb3V0U3RhdHVzID0gSW50ZWdlci5wYXJzZUludChsaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dE1lc3NhZ2UgPSAiIjsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dFN0YXR1cyA9IEludGVnZXIucGFyc2VJbnQobGluZS5zdWJzdHJpbmcoMCwgc3BhY2UpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dE1lc3NhZ2UgPSBsaW5lLnN1YnN0cmluZyhzcGFjZSArIDEpLnRyaW0oKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIG91dFN0YXR1cyA9IC0xOworICAgICAgICAgICAgICAgICAgICBvdXRNZXNzYWdlID0gIk5VTUJFUiBGT1JNQVQgRVhDRVBUSU9OIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZGVidWcgPj0gMSkKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNUQVQ6ICIgKyBvdXRTdGF0dXMgKyAiIE1FU0c6ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRNZXNzYWdlKTsKKworICAgICAgICAgICAgLy8gUmVhZCB0aGUgcmVzcG9uc2UgaGVhZGVycyAoaWYgYW55KQorICAgICAgICAgICAgU3RyaW5nIGhlYWRlck5hbWUgPSBudWxsOworICAgICAgICAgICAgU3RyaW5nIGhlYWRlclZhbHVlID0gbnVsbDsKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgICAgbGluZSA9IHJlYWQoaXMpOworICAgICAgICAgICAgICAgIGlmICgobGluZSA9PSBudWxsKSB8fCAobGluZS5sZW5ndGgoKSA9PSAwKSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgaW50IGNvbG9uID0gbGluZS5pbmRleE9mKCI6Iik7CisgICAgICAgICAgICAgICAgaWYgKGNvbG9uIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoZGVidWcgPj0gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiPz8/PzogIiArIGxpbmUpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGhlYWRlck5hbWUgPSBsaW5lLnN1YnN0cmluZygwLCBjb2xvbikudHJpbSgpOworICAgICAgICAgICAgICAgICAgICBoZWFkZXJWYWx1ZSA9IGxpbmUuc3Vic3RyaW5nKGNvbG9uICsgMSkudHJpbSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoZGVidWcgPj0gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSEVBRDogIiArIGhlYWRlck5hbWUgKyAiOiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIHNhdmUoaGVhZGVyTmFtZSwgaGVhZGVyVmFsdWUpOworICAgICAgICAgICAgICAgICAgICBpZiAoIlNldC1Db29raWUiLmVxdWFscyhoZWFkZXJOYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlU2Vzc2lvbihoZWFkZXJWYWx1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBBY3F1aXJlIHRoZSByZXNwb25zZSBkYXRhIChpZiBhbnkpCisgICAgICAgICAgICBTdHJpbmcgb3V0RGF0YSA9ICIiOworICAgICAgICAgICAgU3RyaW5nIG91dFRleHQgPSAiIjsKKyAgICAgICAgICAgIGludCBsaW5lcyA9IDA7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgIGxpbmUgPSByZWFkKGlzKTsKKyAgICAgICAgICAgICAgICBpZiAobGluZSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKGxpbmVzID09IDApCisgICAgICAgICAgICAgICAgICAgIG91dERhdGEgPSBsaW5lOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgb3V0VGV4dCArPSBsaW5lICsgIlxyXG4iOworICAgICAgICAgICAgICAgIHNhdmVSZXNwb25zZS5hZGQobGluZSk7CisgICAgICAgICAgICAgICAgbGluZXMrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlzLmNsb3NlKCk7CisgICAgICAgICAgICBpZiAoZGVidWcgPj0gMSkgeworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiREFUQTogIiArIG91dERhdGEpOworICAgICAgICAgICAgICAgIGlmIChvdXRUZXh0Lmxlbmd0aCgpID4gMikKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJURVhUOiAiICsgb3V0VGV4dCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFZhbGlkYXRlIHRoZSByZXNwb25zZSBhZ2FpbnN0IG91ciBjcml0ZXJpYQorICAgICAgICAgICAgaWYgKHN1Y2Nlc3MpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSB2YWxpZGF0ZVN0YXR1cyhvdXRTdGF0dXMpOworICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN1Y2Nlc3MpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSB2YWxpZGF0ZU1lc3NhZ2UobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBzdWNjZXNzID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3VjY2VzcykgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IHZhbGlkYXRlSGVhZGVycygpOworICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN1Y2Nlc3MpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSB2YWxpZGF0ZURhdGEob3V0RGF0YSk7CisgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBzdWNjZXNzID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3VjY2VzcykgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IHZhbGlkYXRlR29sZGVuKCk7CisgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBzdWNjZXNzID0gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIHN1Y2Nlc3MgPSBmYWxzZTsKKyAgICAgICAgICAgIHJlc3VsdCA9ICJTdGF0dXM9IiArIG91dFN0YXR1cyArCisgICAgICAgICAgICAgICAgIiwgTWVzc2FnZT0iICsgb3V0TWVzc2FnZTsKKyAgICAgICAgICAgIHRocm93YWJsZSA9IG51bGw7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAocHcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHB3LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHcpIHsKKyAgICAgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChvcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgb3MuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdykgeworICAgICAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGlzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpcy5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB3KSB7CisgICAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc29ja2V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBzb2NrZXQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdykgeworICAgICAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHN1Y2Nlc3MpCisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9LICIgKyBzdW1tYXJ5KTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkZBSUwgIiArIHN1bW1hcnkgKyAiICIgKyByZXN1bHQpOworICAgICAgICAgICAgaWYgKHRocm93YWJsZSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93YWJsZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUGFyc2UgdGhlIHNlc3Npb24gaWRlbnRpZmllciBmcm9tIHRoZSBzcGVjaWZpZWQgU2V0LUNvb2tpZSB2YWx1ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgU2V0LUNvb2tpZSB2YWx1ZSB0byBwYXJzZQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHBhcnNlU2Vzc2lvbihTdHJpbmcgdmFsdWUpIHsKKworICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaW50IGVxdWFscyA9IHZhbHVlLmluZGV4T2YoIkpTRVNTSU9OSUQ9Iik7CisgICAgICAgIGlmIChlcXVhbHMgPCAwKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB2YWx1ZSA9IHZhbHVlLnN1YnN0cmluZyhlcXVhbHMgKyAiSlNFU1NJT05JRD0iLmxlbmd0aCgpKTsKKyAgICAgICAgaW50IHNlbWkgPSB2YWx1ZS5pbmRleE9mKCI7Iik7CisgICAgICAgIGlmIChzZW1pID49IDApCisgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnN1YnN0cmluZygwLCBzZW1pKTsKKworICAgICAgICBpZiAoZGVidWcgPj0gMSkKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU0VTU0lPTiBJRDogIiArIHZhbHVlKTsKKyAgICAgICAgc2Vzc2lvbklkID0gdmFsdWU7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlYWQgYW5kIHJldHVybiB0aGUgbmV4dCBsaW5lIGZyb20gdGhlIHNwZWNpZmllZCBpbnB1dCBzdHJlYW0sIHdpdGgKKyAgICAgKiBubyBjYXJyaWFnZSByZXR1cm4gb3IgbGluZSBmZWVkIGRlbGltaXRlcnMuICBJZgorICAgICAqIGVuZCBvZiBmaWxlIGlzIHJlYWNoZWQsIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpbnN0ZWFkLgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmVhbSBUaGUgaW5wdXQgc3RyZWFtIHRvIHJlYWQgZnJvbQorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyByZWFkKElucHV0U3RyZWFtIHN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgaW50IGIgPSBzdHJlYW0ucmVhZCgpOworICAgICAgICAgICAgaWYgKGIgPCAwKSB7CisgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGgoKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjaGFyIGMgPSAoY2hhcikgYjsKKyAgICAgICAgICAgIGlmIChjID09ICdccicpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBlbHNlIGlmIChjID09ICdcbicpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChjKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKHJlc3VsdC50b1N0cmluZygpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVhZCBhbmQgc2F2ZSB0aGUgY29udGVudHMgb2YgdGhlIGdvbGRlbiBmaWxlIGZvciB0aGlzIHRlc3QsIGlmIGFueS4KKyAgICAgKiBPdGhlcndpc2UsIHRoZSA8Y29kZT5zYXZlR29sZGVuPC9jb2RlPiBsaXN0IHdpbGwgYmUgZW1wdHkuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCByZWFkR29sZGVuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBXYXMgYSBnb2xkZW4gZmlsZSBzcGVjaWZpZWQ/CisgICAgICAgIHNhdmVHb2xkZW4uY2xlYXIoKTsKKyAgICAgICAgaWYgKGdvbGRlbiA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8vIENyZWF0ZSBhIGNvbm5lY3Rpb24gdG8gcmVjZWl2ZSB0aGUgZ29sZGVuIGZpbGUgY29udGVudHMKKyAgICAgICAgVVJMIHVybCA9IG5ldyBVUkwoImh0dHAiLCBob3N0LCBwb3J0LCBnb2xkZW4pOworICAgICAgICBIdHRwVVJMQ29ubmVjdGlvbiBjb25uID0KKyAgICAgICAgICAgIChIdHRwVVJMQ29ubmVjdGlvbikgdXJsLm9wZW5Db25uZWN0aW9uKCk7CisgICAgICAgIGNvbm4uc2V0QWxsb3dVc2VySW50ZXJhY3Rpb24oZmFsc2UpOworICAgICAgICBjb25uLnNldERvSW5wdXQodHJ1ZSk7CisgICAgICAgIGNvbm4uc2V0RG9PdXRwdXQoZmFsc2UpOworICAgICAgICBjb25uLnNldEZvbGxvd1JlZGlyZWN0cyh0cnVlKTsKKyAgICAgICAgY29ubi5zZXRSZXF1ZXN0TWV0aG9kKCJHRVQiKTsKKworICAgICAgICAvLyBDb25uZWN0IHRvIHRoZSBzZXJ2ZXIgYW5kIHJldHJpZXZlIHRoZSBnb2xkZW4gZmlsZQorICAgICAgICBjb25uLmNvbm5lY3QoKTsKKyAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBjb25uLmdldElucHV0U3RyZWFtKCk7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBTdHJpbmcgbGluZSA9IHJlYWQoaXMpOworICAgICAgICAgICAgaWYgKGxpbmUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHNhdmVHb2xkZW4uYWRkKGxpbmUpOworICAgICAgICB9CisgICAgICAgIGlzLmNsb3NlKCk7CisgICAgICAgIGNvbm4uZGlzY29ubmVjdCgpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTYXZlIHRoZSBzcGVjaWZpZWQgaGVhZGVyIG5hbWUgYW5kIHZhbHVlIGluIG91ciBjb2xsZWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgSGVhZGVyIG5hbWUgdG8gc2F2ZQorICAgICAqIEBwYXJhbSB2YWx1ZSBIZWFkZXIgdmFsdWUgdG8gc2F2ZQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNhdmUoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgeworCisgICAgICAgIFN0cmluZyBrZXkgPSBuYW1lLnRvTG93ZXJDYXNlKCk7CisgICAgICAgIEFycmF5TGlzdCBsaXN0ID0gKEFycmF5TGlzdCkgc2F2ZUhlYWRlcnMuZ2V0KGtleSk7CisgICAgICAgIGlmIChsaXN0ID09IG51bGwpIHsKKyAgICAgICAgICAgIGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgICAgICBzYXZlSGVhZGVycy5wdXQoa2V5LCBsaXN0KTsKKyAgICAgICAgfQorICAgICAgICBsaXN0LmFkZCh2YWx1ZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFZhbGlkYXRlIHRoZSBvdXRwdXQgZGF0YSBhZ2FpbnN0IHdoYXQgd2UgZXhwZWN0ZWQuICBSZXR1cm4KKyAgICAgKiA8Y29kZT5udWxsPC9jb2RlPiBmb3Igbm8gcHJvYmxlbXMsIG9yIGFuIGVycm9yIG1lc3NhZ2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGF0YSBUaGUgb3V0cHV0IGRhdGEgdG8gYmUgdGVzdGVkCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyB2YWxpZGF0ZURhdGEoU3RyaW5nIGRhdGEpIHsKKworICAgICAgICBpZiAob3V0Q29udGVudCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgZWxzZSBpZiAoZGF0YS5zdGFydHNXaXRoKG91dENvbnRlbnQpKQorICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuICgiRXhwZWN0ZWQgZGF0YSAnIiArIG91dENvbnRlbnQgKyAiJywgZ290IGRhdGEgJyIgKworICAgICAgICAgICAgICAgICAgICBkYXRhICsgIiciKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogVmFsaWRhdGUgdGhlIHJlc3BvbnNlIGFnYWluc3QgdGhlIGdvbGRlbiBmaWxlIChpZiBhbnkpLiAgUmV0dXJuCisgICAgICogPGNvZGU+bnVsbDwvY29kZT4gZm9yIG5vIHByb2JsZW1zLCBvciBhbiBlcnJvciBtZXNzYWdlLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgdmFsaWRhdGVHb2xkZW4oKSB7CisKKyAgICAgICAgaWYgKGdvbGRlbiA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgYm9vbGVhbiBvayA9IHRydWU7CisgICAgICAgIGlmIChzYXZlR29sZGVuLnNpemUoKSAhPSBzYXZlUmVzcG9uc2Uuc2l6ZSgpKQorICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgaWYgKG9rKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNhdmVHb2xkZW4uc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZ29sZGVuID0gKFN0cmluZykgc2F2ZUdvbGRlbi5nZXQoaSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gKFN0cmluZykgc2F2ZVJlc3BvbnNlLmdldChpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWdvbGRlbi5lcXVhbHMocmVzcG9uc2UpKSB7CisgICAgICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAob2spCisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVYUEVDVEVEOiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNhdmVHb2xkZW4uc2l6ZSgpOyBpKyspCisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKFN0cmluZykgc2F2ZUdvbGRlbi5nZXQoaSkpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJFQ0VJVkVEOiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNhdmVSZXNwb25zZS5zaXplKCk7IGkrKykKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigoU3RyaW5nKSBzYXZlUmVzcG9uc2UuZ2V0KGkpKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsKKyAgICAgICAgcmV0dXJuICgiRmFpbGVkIEdvbGRlbiBGaWxlIENvbXBhcmlzb24iKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogVmFsaWRhdGUgdGhlIHNhdmVkIGhlYWRlcnMgYWdhaW5zdCB0aGUgPGNvZGU+b3V0SGVhZGVyczwvY29kZT4KKyAgICAgKiBwcm9wZXJ0eSwgYW5kIHJldHVybiBhbiBlcnJvciBtZXNzYWdlIGlmIHRoZXJlIGlzIGFueXRoaW5nIG1pc3NpbmcuCisgICAgICogSWYgYWxsIG9mIHRoZSBleHBlY3RlZCBoZWFkZXJzIGFyZSBwcmVzZW50LCByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyB2YWxpZGF0ZUhlYWRlcnMoKSB7CisKKyAgICAgICAgLy8gRG8gd2UgaGF2ZSBhbnkgaGVhZGVycyB0byBjaGVjayBmb3I/CisgICAgICAgIGlmIChvdXRIZWFkZXJzID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworCisgICAgICAgIC8vIENoZWNrIGVhY2ggc3BlY2lmaWVkIG5hbWU6dmFsdWUgY29tYmluYXRpb24KKyAgICAgICAgU3RyaW5nIGhlYWRlcnMgPSBvdXRIZWFkZXJzOworICAgICAgICB3aGlsZSAoaGVhZGVycy5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgIC8vIFBhcnNlIHRoZSBuZXh0IG5hbWU6dmFsdWUgY29tYmluYXRpb24KKyAgICAgICAgICAgIGludCBkZWxpbWl0ZXIgPSBoZWFkZXJzLmluZGV4T2YoIiMjIik7CisgICAgICAgICAgICBTdHJpbmcgaGVhZGVyID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChkZWxpbWl0ZXIgPCAwKSB7CisgICAgICAgICAgICAgICAgaGVhZGVyID0gaGVhZGVyczsKKyAgICAgICAgICAgICAgICBoZWFkZXJzID0gIiI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGhlYWRlciA9IGhlYWRlcnMuc3Vic3RyaW5nKDAsIGRlbGltaXRlcik7CisgICAgICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc3Vic3RyaW5nKGRlbGltaXRlciArIDIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IGNvbG9uID0gaGVhZGVyLmluZGV4T2YoIjoiKTsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gaGVhZGVyLnN1YnN0cmluZygwLCBjb2xvbikudHJpbSgpOworICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gaGVhZGVyLnN1YnN0cmluZyhjb2xvbiArIDEpLnRyaW0oKTsKKyAgICAgICAgICAgIC8vIENoZWNrIGZvciB0aGUgb2NjdXJyZW5jZSBvZiB0aGlzIGhlYWRlcgorICAgICAgICAgICAgQXJyYXlMaXN0IGxpc3QgPSAoQXJyYXlMaXN0KSBzYXZlSGVhZGVycy5nZXQobmFtZS50b0xvd2VyQ2FzZSgpKTsKKyAgICAgICAgICAgIGlmIChsaXN0ID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuICgiTWlzc2luZyBoZWFkZXIgbmFtZSAnIiArIG5hbWUgKyAiJyIpOworICAgICAgICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlLmVxdWFscygoU3RyaW5nKSBsaXN0LmdldChpKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWZvdW5kKQorICAgICAgICAgICAgICAgIHJldHVybiAoIk1pc3NpbmcgaGVhZGVyIG5hbWUgJyIgKyBuYW1lICsgIicgd2l0aCB2YWx1ZSAnIiArCisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSArICInIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBFdmVyeXRoaW5nIHdhcyBmb3VuZCBzdWNjZXNzZnVsbHkKKyAgICAgICAgcmV0dXJuIChudWxsKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogVmFsaWRhdGUgdGhlIHJldHVybmVkIHJlc3BvbnNlIG1lc3NhZ2UgYWdhaW5zdCB3aGF0IHdlIGV4cGVjdGVkLgorICAgICAqIFJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBmb3Igbm8gcHJvYmxlbXMsIG9yIGFuIGVycm9yIG1lc3NhZ2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgcmV0dXJuZWQgcmVzcG9uc2UgbWVzc2FnZQorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgdmFsaWRhdGVNZXNzYWdlKFN0cmluZyBtZXNzYWdlKSB7CisKKyAgICAgICAgaWYgKHRoaXMubWVzc2FnZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgZWxzZSBpZiAodGhpcy5tZXNzYWdlLmVxdWFscyhtZXNzYWdlKSkKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiAoIkV4cGVjdGVkIG1lc3NhZ2U9JyIgKyB0aGlzLm1lc3NhZ2UgKyAiJywgZ290IG1lc3NhZ2U9JyIgKworICAgICAgICAgICAgICAgICAgICBtZXNzYWdlICsgIiciKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogVmFsaWRhdGUgdGhlIHJldHVybmVkIHN0YXR1cyBjb2RlIGFnYWluc3Qgd2hhdCB3ZSBleHBlY3RlZC4gIFJldHVybgorICAgICAqIDxjb2RlPm51bGw8L2NvZGU+IGZvciBubyBwcm9ibGVtcywgb3IgYW4gZXJyb3IgbWVzc2FnZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdGF0dXMgVGhlIHJldHVybmVkIHN0YXR1cyBjb2RlCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyB2YWxpZGF0ZVN0YXR1cyhpbnQgc3RhdHVzKSB7CisKKyAgICAgICAgaWYgKHRoaXMuc3RhdHVzID09IDApCisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICBpZiAodGhpcy5zdGF0dXMgPT0gc3RhdHVzKQorICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuICgiRXhwZWN0ZWQgc3RhdHVzPSIgKyB0aGlzLnN0YXR1cyArICIsIGdvdCBzdGF0dXM9IiArCisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyk7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1Rlc3RlckV4Y2VwdGlvbi5qYXZhIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1Rlc3RlckV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ZThkNGUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvVGVzdGVyRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwLCAyMDAxICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworLyoqCisgKiBHZW5lcmljIGV4Y2VwdGlvbiBjbGFzcyB0byB1c2UgZm9yIHRlc3RpbmcgZXJyb3IgcGFnZSBhc3NlcnRpb25zLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgVGVzdGVyRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGFuIGV4Y2VwdGlvbiB3aXRoIG5vIGFzc29jaWF0ZWQgbWVzc2FnZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgVGVzdGVyRXhjZXB0aW9uKCkgeworCisgICAgICAgIHN1cGVyKCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhbiBleGNlcHRpb24gd2l0aCB0aGUgYXNzb2NpYXRlZCBtZXNzYWdlLgorICAgICAqCisgICAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIGFzc29jaWF0ZWQgbWVzc2FnZQorICAgICAqLworICAgIHB1YmxpYyBUZXN0ZXJFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKKworICAgICAgICBzdXBlcihtZXNzYWdlKTsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvVGVzdGVySHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlci5qYXZhIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1Rlc3Rlckh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDQzZTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1Rlc3Rlckh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIuamF2YQpAQCAtMCwwICsxLDM2MyBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworLyoqCisgKiBUZXN0ZXIgcmVxdWVzdCB3cmFwcGVyIHRoYXQgbG9ncyBhbGwgY2FsbHMgdG8gdGhlIGNvbmZpZ3VyZWQgbG9nZ2VyLAorICogYmVmb3JlIHBhc3NpbmcgdGhlbSBvbiB0byB0aGUgdW5kZXJseWluZyByZXF1ZXN0LgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgVGVzdGVySHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlcgorICAgIGV4dGVuZHMgSHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlciB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcgorCisKKyAgICAvKioKKyAgICAgKiBDb25maWd1cmUgYSBuZXcgcmVxdWVzdCB3cmFwcGVyLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHJlcXVlc3Qgd2UgYXJlIHdyYXBwaW5nCisgICAgICovCisgICAgcHVibGljIFRlc3Rlckh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKworICAgICAgICBzdXBlcihyZXF1ZXN0KTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8vIEZvciBlYWNoIHB1YmxpYyBtZXRob2QsIGxvZyB0aGUgY2FsbCBhbmQgcGFzcyBpdCB0byB0aGUgd3JhcHBlZCByZXNwb25zZQorCisKKyAgICBwdWJsaWMgT2JqZWN0IGdldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3Rlckh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIuZ2V0QXR0cmlidXRlKCkiKTsKKyAgICAgICAgcmV0dXJuIChnZXRSZXF1ZXN0KCkuZ2V0QXR0cmlidXRlKG5hbWUpKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRBdHRyaWJ1dGVOYW1lcygpIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJUZXN0ZXJIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyLmdldEF0dHJpYnV0ZU5hbWVzKCkiKTsKKyAgICAgICAgcmV0dXJuIChnZXRSZXF1ZXN0KCkuZ2V0QXR0cmlidXRlTmFtZXMoKSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEF1dGhUeXBlKCkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3Rlckh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIuZ2V0QXV0aFR5cGUoKSIpOworICAgICAgICByZXR1cm4gKCgoSHR0cFNlcnZsZXRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpLmdldEF1dGhUeXBlKCkpOworICAgIH0KKworCisgICAgcHVibGljIFN0cmluZyBnZXRDaGFyYWN0ZXJFbmNvZGluZygpIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJUZXN0ZXJIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyLmdldENoYXJhY3RlckVuY29kaW5nKCkiKTsKKyAgICAgICAgcmV0dXJuIChnZXRSZXF1ZXN0KCkuZ2V0Q2hhcmFjdGVyRW5jb2RpbmcoKSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgaW50IGdldENvbnRlbnRMZW5ndGgoKSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiVGVzdGVySHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlci5nZXRDb250ZW50TGVuZ3RoKCkiKTsKKyAgICAgICAgcmV0dXJuIChnZXRSZXF1ZXN0KCkuZ2V0Q29udGVudExlbmd0aCgpKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGUoKSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiVGVzdGVySHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlci5nZXRDb250ZW50VHlwZSgpIik7CisgICAgICAgIHJldHVybiAoZ2V0UmVxdWVzdCgpLmdldENvbnRlbnRUeXBlKCkpOworICAgIH0KKworCisgICAgcHVibGljIFN0cmluZyBnZXRDb250ZXh0UGF0aCgpIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJUZXN0ZXJIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyLmdldENvbnRleHRQYXRoKCkiKTsKKyAgICAgICAgcmV0dXJuICgoKEh0dHBTZXJ2bGV0UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKS5nZXRDb250ZXh0UGF0aCgpKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBDb29raWVbXSBnZXRDb29raWVzKCkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3Rlckh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIuZ2V0Q29va2llcygpIik7CisgICAgICAgIHJldHVybiAoKChIdHRwU2VydmxldFJlcXVlc3QpIGdldFJlcXVlc3QoKSkuZ2V0Q29va2llcygpKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBsb25nIGdldERhdGVIZWFkZXIoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJUZXN0ZXJIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyLmdldERhdGVIZWFkZXIoKSIpOworICAgICAgICByZXR1cm4gKCgoSHR0cFNlcnZsZXRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpLmdldERhdGVIZWFkZXIobmFtZSkpOworICAgIH0KKworCisgICAgcHVibGljIFN0cmluZyBnZXRIZWFkZXIoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJUZXN0ZXJIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyLmdldEhlYWRlcigpIik7CisgICAgICAgIHJldHVybiAoKChIdHRwU2VydmxldFJlcXVlc3QpIGdldFJlcXVlc3QoKSkuZ2V0SGVhZGVyKG5hbWUpKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRIZWFkZXJzKFN0cmluZyBuYW1lKSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiVGVzdGVySHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlci5nZXRIZWFkZXJzKCkiKTsKKyAgICAgICAgcmV0dXJuICgoKEh0dHBTZXJ2bGV0UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKS5nZXRIZWFkZXJzKG5hbWUpKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRIZWFkZXJOYW1lcygpIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJUZXN0ZXJIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyLmdldEhlYWRlck5hbWVzKCkiKTsKKyAgICAgICAgcmV0dXJuICgoKEh0dHBTZXJ2bGV0UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKS5nZXRIZWFkZXJOYW1lcygpKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBTZXJ2bGV0SW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3Rlckh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIuZ2V0SW5wdXRTdHJlYW0oKSIpOworICAgICAgICByZXR1cm4gKGdldFJlcXVlc3QoKS5nZXRJbnB1dFN0cmVhbSgpKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBpbnQgZ2V0SW50SGVhZGVyKFN0cmluZyBuYW1lKSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiVGVzdGVySHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlci5nZXRJbnRIZWFkZXIoKSIpOworICAgICAgICByZXR1cm4gKCgoSHR0cFNlcnZsZXRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpLmdldEludEhlYWRlcihuYW1lKSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgTG9jYWxlIGdldExvY2FsZSgpIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJUZXN0ZXJIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyLmdldExvY2FsZSgpIik7CisgICAgICAgIHJldHVybiAoZ2V0UmVxdWVzdCgpLmdldExvY2FsZSgpKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRMb2NhbGVzKCkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3Rlckh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIuZ2V0TG9jYWxlcygpIik7CisgICAgICAgIHJldHVybiAoZ2V0UmVxdWVzdCgpLmdldExvY2FsZXMoKSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE1ldGhvZCgpIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJUZXN0ZXJIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyLmdldE1ldGhvZCgpIik7CisgICAgICAgIHJldHVybiAoKChIdHRwU2VydmxldFJlcXVlc3QpIGdldFJlcXVlc3QoKSkuZ2V0TWV0aG9kKCkpOworICAgIH0KKworCisgICAgcHVibGljIFN0cmluZyBnZXRQYXJhbWV0ZXIoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJUZXN0ZXJIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyLmdldFBhcmFtZXRlcigpIik7CisgICAgICAgIHJldHVybiAoZ2V0UmVxdWVzdCgpLmdldFBhcmFtZXRlcihuYW1lKSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgTWFwIGdldFBhcmFtZXRlck1hcCgpIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJUZXN0ZXJIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyLmdldFBhcmFtZXRlck1hcCgpIik7CisgICAgICAgIHJldHVybiAoZ2V0UmVxdWVzdCgpLmdldFBhcmFtZXRlck1hcCgpKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRQYXJhbWV0ZXJOYW1lcygpIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJUZXN0ZXJIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyLmdldFBhcmFtZXRlck5hbWVzKCkiKTsKKyAgICAgICAgcmV0dXJuIChnZXRSZXF1ZXN0KCkuZ2V0UGFyYW1ldGVyTmFtZXMoKSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0UGFyYW1ldGVyVmFsdWVzKFN0cmluZyBuYW1lKSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiVGVzdGVySHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoKSIpOworICAgICAgICByZXR1cm4gKGdldFJlcXVlc3QoKS5nZXRQYXJhbWV0ZXJWYWx1ZXMobmFtZSkpOworICAgIH0KKworCisgICAgcHVibGljIFN0cmluZyBnZXRQYXRoSW5mbygpIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJUZXN0ZXJIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyLmdldFBhdGhJbmZvKCkiKTsKKyAgICAgICAgcmV0dXJuICgoKEh0dHBTZXJ2bGV0UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKS5nZXRQYXRoSW5mbygpKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aFRyYW5zbGF0ZWQoKSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiVGVzdGVySHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlci5nZXRQYXRoVHJhbnNsYXRlZCgpIik7CisgICAgICAgIHJldHVybiAoKChIdHRwU2VydmxldFJlcXVlc3QpIGdldFJlcXVlc3QoKSkuZ2V0UGF0aFRyYW5zbGF0ZWQoKSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFByb3RvY29sKCkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3Rlckh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIuZ2V0UHJvdG9jb2woKSIpOworICAgICAgICByZXR1cm4gKGdldFJlcXVlc3QoKS5nZXRQcm90b2NvbCgpKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UXVlcnlTdHJpbmcoKSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiVGVzdGVySHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlci5nZXRRdWVyeVN0cmluZygpIik7CisgICAgICAgIHJldHVybiAoKChIdHRwU2VydmxldFJlcXVlc3QpIGdldFJlcXVlc3QoKSkuZ2V0UXVlcnlTdHJpbmcoKSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgQnVmZmVyZWRSZWFkZXIgZ2V0UmVhZGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJUZXN0ZXJIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyLmdldFJlYWRlcigpIik7CisgICAgICAgIHJldHVybiAoZ2V0UmVxdWVzdCgpLmdldFJlYWRlcigpKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVhbFBhdGgoU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJUZXN0ZXJIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyLmdldFJlYWxQYXRoKCkiKTsKKyAgICAgICAgcmV0dXJuIChnZXRSZXF1ZXN0KCkuZ2V0UmVhbFBhdGgocGF0aCkpOworICAgIH0KKworCisgICAgcHVibGljIFN0cmluZyBnZXRSZW1vdGVBZGRyKCkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3Rlckh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIuZ2V0UmVtb3RlQWRkcigpIik7CisgICAgICAgIHJldHVybiAoZ2V0UmVxdWVzdCgpLmdldFJlbW90ZUFkZHIoKSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlbW90ZUhvc3QoKSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiVGVzdGVySHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlci5nZXRSZW1vdGVIb3N0KCkiKTsKKyAgICAgICAgcmV0dXJuIChnZXRSZXF1ZXN0KCkuZ2V0UmVtb3RlSG9zdCgpKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVtb3RlVXNlcigpIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJUZXN0ZXJIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyLmdldFJlbW90ZVVzZXIoKSIpOworICAgICAgICByZXR1cm4gKCgoSHR0cFNlcnZsZXRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpLmdldFJlbW90ZVVzZXIoKSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgUmVxdWVzdERpc3BhdGNoZXIgZ2V0UmVxdWVzdERpc3BhdGNoZXIoU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJUZXN0ZXJIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyLmdldFJlcXVlc3REaXNwYXRjaGVyKCkiKTsKKyAgICAgICAgcmV0dXJuIChnZXRSZXF1ZXN0KCkuZ2V0UmVxdWVzdERpc3BhdGNoZXIocGF0aCkpOworICAgIH0KKworCisgICAgcHVibGljIFN0cmluZyBnZXRSZXF1ZXN0VVJJKCkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3Rlckh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIuZ2V0UmVxdWVzdFVSSSgpIik7CisgICAgICAgIHJldHVybiAoKChIdHRwU2VydmxldFJlcXVlc3QpIGdldFJlcXVlc3QoKSkuZ2V0UmVxdWVzdFVSSSgpKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBTdHJpbmdCdWZmZXIgZ2V0UmVxdWVzdFVSTCgpIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJUZXN0ZXJIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyLmdldFJlcXVlc3RVUkwoKSIpOworICAgICAgICByZXR1cm4gKCgoSHR0cFNlcnZsZXRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpLmdldFJlcXVlc3RVUkwoKSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlcXVlc3RlZFNlc3Npb25JZCgpIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJUZXN0ZXJIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyLmdldFJlcXVlc3RlZFNlc3Npb25JZCgpIik7CisgICAgICAgIHJldHVybiAoKChIdHRwU2VydmxldFJlcXVlc3QpIGdldFJlcXVlc3QoKSkuZ2V0UmVxdWVzdGVkU2Vzc2lvbklkKCkpOworICAgIH0KKworCisgICAgcHVibGljIFN0cmluZyBnZXRTY2hlbWUoKSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiVGVzdGVySHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlci5nZXRTY2hlbWUoKSIpOworICAgICAgICByZXR1cm4gKGdldFJlcXVlc3QoKS5nZXRTY2hlbWUoKSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFNlcnZlck5hbWUoKSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiVGVzdGVySHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlci5nZXRTZXJ2ZXJOYW1lKCkiKTsKKyAgICAgICAgcmV0dXJuIChnZXRSZXF1ZXN0KCkuZ2V0U2VydmVyTmFtZSgpKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBpbnQgZ2V0U2VydmVyUG9ydCgpIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJUZXN0ZXJIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyLmdldFNlcnZlclBvcnQoKSIpOworICAgICAgICByZXR1cm4gKGdldFJlcXVlc3QoKS5nZXRTZXJ2ZXJQb3J0KCkpOworICAgIH0KKworCisgICAgcHVibGljIFN0cmluZyBnZXRTZXJ2bGV0UGF0aCgpIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJUZXN0ZXJIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyLmdldFNlcnZsZXRQYXRoKCkiKTsKKyAgICAgICAgcmV0dXJuICgoKEh0dHBTZXJ2bGV0UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKS5nZXRTZXJ2bGV0UGF0aCgpKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBIdHRwU2Vzc2lvbiBnZXRTZXNzaW9uKCkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3Rlckh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIuZ2V0U2Vzc2lvbigpIik7CisgICAgICAgIHJldHVybiAoKChIdHRwU2VydmxldFJlcXVlc3QpIGdldFJlcXVlc3QoKSkuZ2V0U2Vzc2lvbigpKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBIdHRwU2Vzc2lvbiBnZXRTZXNzaW9uKGJvb2xlYW4gY3JlYXRlKSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiVGVzdGVySHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlci5nZXRTZXNzaW9uKGIpIik7CisgICAgICAgIHJldHVybiAoKChIdHRwU2VydmxldFJlcXVlc3QpIGdldFJlcXVlc3QoKSkuZ2V0U2Vzc2lvbihjcmVhdGUpKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBQcmluY2lwYWwgZ2V0VXNlclByaW5jaXBhbCgpIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJUZXN0ZXJIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyLmdldFVzZXJQcmluY2lwYWwoKSIpOworICAgICAgICByZXR1cm4gKCgoSHR0cFNlcnZsZXRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpLmdldFVzZXJQcmluY2lwYWwoKSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JlcXVlc3RlZFNlc3Npb25JZEZyb21Db29raWUoKSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiVGVzdGVySHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlci5pc1JlcXVlc3RlZFNlc3Npb25JZEZyb21Db29raWUoKSIpOworICAgICAgICByZXR1cm4gKCgoSHR0cFNlcnZsZXRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpLmlzUmVxdWVzdGVkU2Vzc2lvbklkRnJvbUNvb2tpZSgpKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBib29sZWFuIGlzUmVxdWVzdGVkU2Vzc2lvbklkRnJvbVVybCgpIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJUZXN0ZXJIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyLmlzUmVxdWVzdGVkU2Vzc2lvbklkRnJvbVVybCgpIik7CisgICAgICAgIHJldHVybiAoKChIdHRwU2VydmxldFJlcXVlc3QpIGdldFJlcXVlc3QoKSkuaXNSZXF1ZXN0ZWRTZXNzaW9uSWRGcm9tVXJsKCkpOworICAgIH0KKworCisgICAgcHVibGljIGJvb2xlYW4gaXNSZXF1ZXN0ZWRTZXNzaW9uSWRGcm9tVVJMKCkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3Rlckh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIuaXNSZXF1ZXN0ZWRTZXNzaW9uSWRGcm9tVVJMKCkiKTsKKyAgICAgICAgcmV0dXJuICgoKEh0dHBTZXJ2bGV0UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKS5pc1JlcXVlc3RlZFNlc3Npb25JZEZyb21VUkwoKSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JlcXVlc3RlZFNlc3Npb25JZFZhbGlkKCkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3Rlckh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIuaXNSZXF1ZXN0ZWRTZXNzaW9uSWRWYWxpZCgpIik7CisgICAgICAgIHJldHVybiAoKChIdHRwU2VydmxldFJlcXVlc3QpIGdldFJlcXVlc3QoKSkuaXNSZXF1ZXN0ZWRTZXNzaW9uSWRWYWxpZCgpKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBib29sZWFuIGlzU2VjdXJlKCkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3Rlckh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIuaXNTZWN1cmUoKSIpOworICAgICAgICByZXR1cm4gKGdldFJlcXVlc3QoKS5pc1NlY3VyZSgpKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBib29sZWFuIGlzVXNlckluUm9sZShTdHJpbmcgcm9sZSkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3Rlckh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIuaXNVc2VySW5Sb2xlKCkiKTsKKyAgICAgICAgcmV0dXJuICgoKEh0dHBTZXJ2bGV0UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKS5pc1VzZXJJblJvbGUocm9sZSkpOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgcmVtb3ZlQXR0cmlidXRlKFN0cmluZyBuYW1lKSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiVGVzdGVySHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlci5yZW1vdmVBdHRyaWJ1dGUoKSIpOworICAgICAgICBnZXRSZXF1ZXN0KCkucmVtb3ZlQXR0cmlidXRlKG5hbWUpOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJUZXN0ZXJIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyLnNldEF0dHJpYnV0ZSgpIik7CisgICAgICAgIGdldFJlcXVlc3QoKS5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgc2V0Q2hhcmFjdGVyRW5jb2RpbmcoU3RyaW5nIGVuYykKKyAgICAgICAgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24geworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3Rlckh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIuc2V0Q2hhcmFjdGVyRW5jb2RpbmcoKSIpOworICAgICAgICBnZXRSZXF1ZXN0KCkuc2V0Q2hhcmFjdGVyRW5jb2RpbmcoZW5jKTsKKyAgICB9CisKKworCisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1Rlc3Rlckh0dHBTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyLmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvVGVzdGVySHR0cFNlcnZsZXRSZXNwb25zZVdyYXBwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDdiMWNiCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1Rlc3Rlckh0dHBTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyLmphdmEKQEAgLTAsMCArMSwyMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwgMjAwMCAsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50ZXN0ZXI7CisKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lio7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7CisKKy8qKgorICogVGVzdGVyIHJlc3BvbnNlIHdyYXBwZXIgdGhhdCBsb2dzIGFsbCBjYWxscyB0byB0aGUgY29uZmlndXJlZCBsb2dnZXIsCisgKiBiZWZvcmUgcGFzc2luZyB0aGVtIG9uIHRvIHRoZSB1bmRlcmx5aW5nIHJlc3BvbnNlLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgVGVzdGVySHR0cFNlcnZsZXRSZXNwb25zZVdyYXBwZXIKKyAgICBleHRlbmRzIEh0dHBTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9yCisKKworICAgIC8qKgorICAgICAqIENvbmZpZ3VyZSBhIG5ldyByZXNwb25zZSB3cmFwcGVyLgorICAgICAqCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSByZXNwb25zZSB3ZSBhcmUgd3JhcHBpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgVGVzdGVySHR0cFNlcnZsZXRSZXNwb25zZVdyYXBwZXIoSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgeworCisgICAgICAgIHN1cGVyKHJlc3BvbnNlKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8vIEZvciBlYWNoIHB1YmxpYyBtZXRob2QsIGxvZyB0aGUgY2FsbCBhbmQgcGFzcyBpdCB0byB0aGUgd3JhcHBlZCByZXNwb25zZQorCisKKyAgICBwdWJsaWMgdm9pZCBhZGRDb29raWUoQ29va2llIGNvb2tpZSkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3Rlckh0dHBTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyLmFkZENvb2tpZSgpIik7CisgICAgICAgICgoSHR0cFNlcnZsZXRSZXNwb25zZSkgZ2V0UmVzcG9uc2UoKSkuYWRkQ29va2llKGNvb2tpZSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBhZGREYXRlSGVhZGVyKFN0cmluZyBuYW1lLCBsb25nIHZhbHVlKSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiVGVzdGVySHR0cFNlcnZsZXRSZXNwb25zZVdyYXBwZXIuYWRkRGF0ZUhlYWRlcigpIik7CisgICAgICAgICgoSHR0cFNlcnZsZXRSZXNwb25zZSkgZ2V0UmVzcG9uc2UoKSkuYWRkRGF0ZUhlYWRlcihuYW1lLCB2YWx1ZSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBhZGRIZWFkZXIoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3Rlckh0dHBTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyLmFkZEhlYWRlcigpIik7CisgICAgICAgICgoSHR0cFNlcnZsZXRSZXNwb25zZSkgZ2V0UmVzcG9uc2UoKSkuYWRkSGVhZGVyKG5hbWUsIHZhbHVlKTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIGFkZEludEhlYWRlcihTdHJpbmcgbmFtZSwgaW50IHZhbHVlKSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiVGVzdGVySHR0cFNlcnZsZXRSZXNwb25zZVdyYXBwZXIuYWRkSW50SGVhZGVyKCkiKTsKKyAgICAgICAgKChIdHRwU2VydmxldFJlc3BvbnNlKSBnZXRSZXNwb25zZSgpKS5hZGRJbnRIZWFkZXIobmFtZSwgdmFsdWUpOworICAgIH0KKworCisgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNIZWFkZXIoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJUZXN0ZXJIdHRwU2VydmxldFJlc3BvbnNlV3JhcHBlci5jb250YWluc0hlYWRlcigpIik7CisgICAgICAgIHJldHVybiAoKChIdHRwU2VydmxldFJlc3BvbnNlKSBnZXRSZXNwb25zZSgpKS5jb250YWluc0hlYWRlcihuYW1lKSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgU3RyaW5nIGVuY29kZVVSTChTdHJpbmcgdXJsKSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiVGVzdGVySHR0cFNlcnZsZXRSZXNwb25zZVdyYXBwZXIuZW5jb2RlVVJMKCkiKTsKKyAgICAgICAgcmV0dXJuICgoKEh0dHBTZXJ2bGV0UmVzcG9uc2UpIGdldFJlc3BvbnNlKCkpLmVuY29kZVVSTCh1cmwpKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBTdHJpbmcgZW5jb2RlVXJsKFN0cmluZyB1cmwpIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJUZXN0ZXJIdHRwU2VydmxldFJlc3BvbnNlV3JhcHBlci5lbmNvZGVVcmwoKSIpOworICAgICAgICByZXR1cm4gKCgoSHR0cFNlcnZsZXRSZXNwb25zZSkgZ2V0UmVzcG9uc2UoKSkuZW5jb2RlVXJsKHVybCkpOworICAgIH0KKworCisgICAgcHVibGljIFN0cmluZyBlbmNvZGVSZWRpcmVjdFVSTChTdHJpbmcgdXJsKSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiVGVzdGVySHR0cFNlcnZsZXRSZXNwb25zZVdyYXBwZXIuZW5jb2RlUmVkaXJlY3RVUkwoKSIpOworICAgICAgICByZXR1cm4gKCgoSHR0cFNlcnZsZXRSZXNwb25zZSkgZ2V0UmVzcG9uc2UoKSkuZW5jb2RlUmVkaXJlY3RVUkwodXJsKSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgU3RyaW5nIGVuY29kZVJlZGlyZWN0VXJsKFN0cmluZyB1cmwpIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJUZXN0ZXJIdHRwU2VydmxldFJlc3BvbnNlV3JhcHBlci5lbmNvZGVSZWRpcmVjdFVybCgpIik7CisgICAgICAgIHJldHVybiAoKChIdHRwU2VydmxldFJlc3BvbnNlKSBnZXRSZXNwb25zZSgpKS5lbmNvZGVSZWRpcmVjdFVybCh1cmwpKTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIGZsdXNoQnVmZmVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJUZXN0ZXJIdHRwU2VydmxldFJlc3BvbnNlV3JhcHBlci5mbHVzaEJ1ZmZlcigpIik7CisgICAgICAgIGdldFJlc3BvbnNlKCkuZmx1c2hCdWZmZXIoKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBpbnQgZ2V0QnVmZmVyU2l6ZSgpIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJUZXN0ZXJIdHRwU2VydmxldFJlc3BvbnNlV3JhcHBlci5nZXRCdWZmZXJTaXplKCkiKTsKKyAgICAgICAgcmV0dXJuIChnZXRSZXNwb25zZSgpLmdldEJ1ZmZlclNpemUoKSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldENoYXJhY3RlckVuY29kaW5nKCkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3Rlckh0dHBTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyLmdldENoYXJhY3RlckVuY29kaW5nKCkiKTsKKyAgICAgICAgcmV0dXJuIChnZXRSZXNwb25zZSgpLmdldENoYXJhY3RlckVuY29kaW5nKCkpOworICAgIH0KKworCisgICAgcHVibGljIExvY2FsZSBnZXRMb2NhbGUoKSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiVGVzdGVySHR0cFNlcnZsZXRSZXNwb25zZVdyYXBwZXIuZ2V0TG9jYWxlKCkiKTsKKyAgICAgICAgcmV0dXJuIChnZXRSZXNwb25zZSgpLmdldExvY2FsZSgpKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBTZXJ2bGV0T3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiVGVzdGVySHR0cFNlcnZsZXRSZXNwb25zZVdyYXBwZXIuZ2V0T3V0cHV0U3RyZWFtKCkiKTsKKyAgICAgICAgcmV0dXJuIChnZXRSZXNwb25zZSgpLmdldE91dHB1dFN0cmVhbSgpKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBQcmludFdyaXRlciBnZXRXcml0ZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3Rlckh0dHBTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyLmdldFdyaXRlcigpIik7CisgICAgICAgIHJldHVybiAoZ2V0UmVzcG9uc2UoKS5nZXRXcml0ZXIoKSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0NvbW1pdHRlZCgpIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJUZXN0ZXJIdHRwU2VydmxldFJlc3BvbnNlV3JhcHBlci5pc0NvbW1pdHRlZCgpIik7CisgICAgICAgIHJldHVybiAoZ2V0UmVzcG9uc2UoKS5pc0NvbW1pdHRlZCgpKTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3Rlckh0dHBTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyLnJlc2V0KCkiKTsKKyAgICAgICAgZ2V0UmVzcG9uc2UoKS5yZXNldCgpOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgcmVzZXRCdWZmZXIoKSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiVGVzdGVySHR0cFNlcnZsZXRSZXNwb25zZVdyYXBwZXIucmVzZXRCdWZmZXIoKSIpOworICAgICAgICBnZXRSZXNwb25zZSgpLnJlc2V0QnVmZmVyKCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZW5kRXJyb3IoaW50IHNjKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3Rlckh0dHBTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyLnNlbmRFcnJvcihpKSIpOworICAgICAgICAoKEh0dHBTZXJ2bGV0UmVzcG9uc2UpIGdldFJlc3BvbnNlKCkpLnNlbmRFcnJvcihzYyk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZW5kRXJyb3IoaW50IHNjLCBTdHJpbmcgbXNnKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3Rlckh0dHBTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyLnNlbmRFcnJvcihpLHMpIik7CisgICAgICAgICgoSHR0cFNlcnZsZXRSZXNwb25zZSkgZ2V0UmVzcG9uc2UoKSkuc2VuZEVycm9yKHNjLCBtc2cpOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgc2VuZFJlZGlyZWN0KFN0cmluZyBsb2NhdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJUZXN0ZXJIdHRwU2VydmxldFJlc3BvbnNlV3JhcHBlci5zZW5kUmVkaXJlY3QoKSIpOworICAgICAgICAoKEh0dHBTZXJ2bGV0UmVzcG9uc2UpIGdldFJlc3BvbnNlKCkpLnNlbmRSZWRpcmVjdChsb2NhdGlvbik7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXRCdWZmZXJTaXplKGludCBzaXplKSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiVGVzdGVySHR0cFNlcnZsZXRSZXNwb25zZVdyYXBwZXIuc2V0QnVmZmVyU2l6ZSgpIik7CisgICAgICAgIGdldFJlc3BvbnNlKCkuc2V0QnVmZmVyU2l6ZShzaXplKTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldENvbnRlbnRMZW5ndGgoaW50IGxlbikgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3Rlckh0dHBTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyLnNldENvbnRlbnRMZW5ndGgoKSIpOworICAgICAgICBnZXRSZXNwb25zZSgpLnNldENvbnRlbnRMZW5ndGgobGVuKTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldENvbnRlbnRUeXBlKFN0cmluZyB0eXBlKSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiVGVzdGVySHR0cFNlcnZsZXRSZXNwb25zZVdyYXBwZXIuc2V0Q29udGVudFR5cGUoKSIpOworICAgICAgICBnZXRSZXNwb25zZSgpLnNldENvbnRlbnRUeXBlKHR5cGUpOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgc2V0RGF0ZUhlYWRlcihTdHJpbmcgbmFtZSwgbG9uZyB2YWx1ZSkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3Rlckh0dHBTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyLnNldERhdGVIZWFkZXIoKSIpOworICAgICAgICAoKEh0dHBTZXJ2bGV0UmVzcG9uc2UpIGdldFJlc3BvbnNlKCkpLnNldERhdGVIZWFkZXIobmFtZSwgdmFsdWUpOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgc2V0SGVhZGVyKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJUZXN0ZXJIdHRwU2VydmxldFJlc3BvbnNlV3JhcHBlci5zZXRIZWFkZXIoKSIpOworICAgICAgICAoKEh0dHBTZXJ2bGV0UmVzcG9uc2UpIGdldFJlc3BvbnNlKCkpLnNldEhlYWRlcihuYW1lLCB2YWx1ZSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXRJbnRIZWFkZXIoU3RyaW5nIG5hbWUsIGludCB2YWx1ZSkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3Rlckh0dHBTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyLnNldEludEhlYWRlcigpIik7CisgICAgICAgICgoSHR0cFNlcnZsZXRSZXNwb25zZSkgZ2V0UmVzcG9uc2UoKSkuc2V0SW50SGVhZGVyKG5hbWUsIHZhbHVlKTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldExvY2FsZShMb2NhbGUgbG9jYWxlKSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiVGVzdGVySHR0cFNlcnZsZXRSZXNwb25zZVdyYXBwZXIuc2V0TG9jYWxlKCkiKTsKKyAgICAgICAgZ2V0UmVzcG9uc2UoKS5zZXRMb2NhbGUobG9jYWxlKTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldFN0YXR1cyhpbnQgc2MpIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJUZXN0ZXJIdHRwU2VydmxldFJlc3BvbnNlV3JhcHBlci5zZXRTdGF0dXMoaSkiKTsKKyAgICAgICAgKChIdHRwU2VydmxldFJlc3BvbnNlKSBnZXRSZXNwb25zZSgpKS5zZXRTdGF0dXMoc2MpOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgc2V0U3RhdHVzKGludCBzYywgU3RyaW5nIG1zZykgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3Rlckh0dHBTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyLnNldFN0YXR1cyhpLHMpIik7CisgICAgICAgICgoSHR0cFNlcnZsZXRSZXNwb25zZSkgZ2V0UmVzcG9uc2UoKSkuc2V0U3RhdHVzKHNjLCBtc2cpOworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvVGVzdGVyU2VydmxldFJlcXVlc3RXcmFwcGVyLmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvVGVzdGVyU2VydmxldFJlcXVlc3RXcmFwcGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZkMTFhZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9UZXN0ZXJTZXJ2bGV0UmVxdWVzdFdyYXBwZXIuamF2YQpAQCAtMCwwICsxLDIxMSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworLyoqCisgKiBUZXN0ZXIgcmVxdWVzdCB3cmFwcGVyIHRoYXQgbG9ncyBhbGwgY2FsbHMgdG8gdGhlIGNvbmZpZ3VyZWQgbG9nZ2VyLAorICogYmVmb3JlIHBhc3NpbmcgdGhlbSBvbiB0byB0aGUgdW5kZXJseWluZyByZXF1ZXN0LgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgVGVzdGVyU2VydmxldFJlcXVlc3RXcmFwcGVyIGV4dGVuZHMgU2VydmxldFJlcXVlc3RXcmFwcGVyIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9yCisKKworICAgIC8qKgorICAgICAqIENvbmZpZ3VyZSBhIG5ldyByZXF1ZXN0IHdyYXBwZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgcmVxdWVzdCB3ZSBhcmUgd3JhcHBpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgVGVzdGVyU2VydmxldFJlcXVlc3RXcmFwcGVyKFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKworICAgICAgICBzdXBlcihyZXF1ZXN0KTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8vIEZvciBlYWNoIHB1YmxpYyBtZXRob2QsIGxvZyB0aGUgY2FsbCBhbmQgcGFzcyBpdCB0byB0aGUgd3JhcHBlZCByZXNwb25zZQorCisKKyAgICBwdWJsaWMgT2JqZWN0IGdldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3RlclNlcnZsZXRSZXF1ZXN0V3JhcHBlci5nZXRBdHRyaWJ1dGUoKSIpOworICAgICAgICByZXR1cm4gKGdldFJlcXVlc3QoKS5nZXRBdHRyaWJ1dGUobmFtZSkpOworICAgIH0KKworCisgICAgcHVibGljIEVudW1lcmF0aW9uIGdldEF0dHJpYnV0ZU5hbWVzKCkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3RlclNlcnZsZXRSZXF1ZXN0V3JhcHBlci5nZXRBdHRyaWJ1dGVOYW1lcygpIik7CisgICAgICAgIHJldHVybiAoZ2V0UmVxdWVzdCgpLmdldEF0dHJpYnV0ZU5hbWVzKCkpOworICAgIH0KKworCisgICAgcHVibGljIFN0cmluZyBnZXRDaGFyYWN0ZXJFbmNvZGluZygpIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJUZXN0ZXJTZXJ2bGV0UmVxdWVzdFdyYXBwZXIuZ2V0Q2hhcmFjdGVyRW5jb2RpbmcoKSIpOworICAgICAgICByZXR1cm4gKGdldFJlcXVlc3QoKS5nZXRDaGFyYWN0ZXJFbmNvZGluZygpKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBpbnQgZ2V0Q29udGVudExlbmd0aCgpIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJUZXN0ZXJTZXJ2bGV0UmVxdWVzdFdyYXBwZXIuZ2V0Q29udGVudExlbmd0aCgpIik7CisgICAgICAgIHJldHVybiAoZ2V0UmVxdWVzdCgpLmdldENvbnRlbnRMZW5ndGgoKSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRUeXBlKCkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3RlclNlcnZsZXRSZXF1ZXN0V3JhcHBlci5nZXRDb250ZW50VHlwZSgpIik7CisgICAgICAgIHJldHVybiAoZ2V0UmVxdWVzdCgpLmdldENvbnRlbnRUeXBlKCkpOworICAgIH0KKworCisgICAgcHVibGljIFNlcnZsZXRJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiVGVzdGVyU2VydmxldFJlcXVlc3RXcmFwcGVyLmdldElucHV0U3RyZWFtKCkiKTsKKyAgICAgICAgcmV0dXJuIChnZXRSZXF1ZXN0KCkuZ2V0SW5wdXRTdHJlYW0oKSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgTG9jYWxlIGdldExvY2FsZSgpIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJUZXN0ZXJTZXJ2bGV0UmVxdWVzdFdyYXBwZXIuZ2V0TG9jYWxlKCkiKTsKKyAgICAgICAgcmV0dXJuIChnZXRSZXF1ZXN0KCkuZ2V0TG9jYWxlKCkpOworICAgIH0KKworCisgICAgcHVibGljIEVudW1lcmF0aW9uIGdldExvY2FsZXMoKSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiVGVzdGVyU2VydmxldFJlcXVlc3RXcmFwcGVyLmdldExvY2FsZXMoKSIpOworICAgICAgICByZXR1cm4gKGdldFJlcXVlc3QoKS5nZXRMb2NhbGVzKCkpOworICAgIH0KKworCisgICAgcHVibGljIFN0cmluZyBnZXRQYXJhbWV0ZXIoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJUZXN0ZXJTZXJ2bGV0UmVxdWVzdFdyYXBwZXIuZ2V0UGFyYW1ldGVyKCkiKTsKKyAgICAgICAgcmV0dXJuIChnZXRSZXF1ZXN0KCkuZ2V0UGFyYW1ldGVyKG5hbWUpKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBNYXAgZ2V0UGFyYW1ldGVyTWFwKCkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3RlclNlcnZsZXRSZXF1ZXN0V3JhcHBlci5nZXRQYXJhbWV0ZXJNYXAoKSIpOworICAgICAgICByZXR1cm4gKGdldFJlcXVlc3QoKS5nZXRQYXJhbWV0ZXJNYXAoKSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0UGFyYW1ldGVyTmFtZXMoKSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiVGVzdGVyU2VydmxldFJlcXVlc3RXcmFwcGVyLmdldFBhcmFtZXRlck5hbWVzKCkiKTsKKyAgICAgICAgcmV0dXJuIChnZXRSZXF1ZXN0KCkuZ2V0UGFyYW1ldGVyTmFtZXMoKSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0UGFyYW1ldGVyVmFsdWVzKFN0cmluZyBuYW1lKSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiVGVzdGVyU2VydmxldFJlcXVlc3RXcmFwcGVyLmdldFBhcmFtZXRlclZhbHVlcygpIik7CisgICAgICAgIHJldHVybiAoZ2V0UmVxdWVzdCgpLmdldFBhcmFtZXRlclZhbHVlcyhuYW1lKSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFByb3RvY29sKCkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3RlclNlcnZsZXRSZXF1ZXN0V3JhcHBlci5nZXRQcm90b2NvbCgpIik7CisgICAgICAgIHJldHVybiAoZ2V0UmVxdWVzdCgpLmdldFByb3RvY29sKCkpOworICAgIH0KKworCisgICAgcHVibGljIEJ1ZmZlcmVkUmVhZGVyIGdldFJlYWRlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiVGVzdGVyU2VydmxldFJlcXVlc3RXcmFwcGVyLmdldFJlYWRlcigpIik7CisgICAgICAgIHJldHVybiAoZ2V0UmVxdWVzdCgpLmdldFJlYWRlcigpKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVhbFBhdGgoU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJUZXN0ZXJTZXJ2bGV0UmVxdWVzdFdyYXBwZXIuZ2V0UmVhbFBhdGgoKSIpOworICAgICAgICByZXR1cm4gKGdldFJlcXVlc3QoKS5nZXRSZWFsUGF0aChwYXRoKSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlbW90ZUFkZHIoKSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiVGVzdGVyU2VydmxldFJlcXVlc3RXcmFwcGVyLmdldFJlbW90ZUFkZHIoKSIpOworICAgICAgICByZXR1cm4gKGdldFJlcXVlc3QoKS5nZXRSZW1vdGVBZGRyKCkpOworICAgIH0KKworCisgICAgcHVibGljIFN0cmluZyBnZXRSZW1vdGVIb3N0KCkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3RlclNlcnZsZXRSZXF1ZXN0V3JhcHBlci5nZXRSZW1vdGVIb3N0KCkiKTsKKyAgICAgICAgcmV0dXJuIChnZXRSZXF1ZXN0KCkuZ2V0UmVtb3RlSG9zdCgpKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBSZXF1ZXN0RGlzcGF0Y2hlciBnZXRSZXF1ZXN0RGlzcGF0Y2hlcihTdHJpbmcgcGF0aCkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3RlclNlcnZsZXRSZXF1ZXN0V3JhcHBlci5nZXRSZXF1ZXN0RGlzcGF0Y2hlcigpIik7CisgICAgICAgIHJldHVybiAoZ2V0UmVxdWVzdCgpLmdldFJlcXVlc3REaXNwYXRjaGVyKHBhdGgpKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2NoZW1lKCkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3RlclNlcnZsZXRSZXF1ZXN0V3JhcHBlci5nZXRTY2hlbWUoKSIpOworICAgICAgICByZXR1cm4gKGdldFJlcXVlc3QoKS5nZXRTY2hlbWUoKSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFNlcnZlck5hbWUoKSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiVGVzdGVyU2VydmxldFJlcXVlc3RXcmFwcGVyLmdldFNlcnZlck5hbWUoKSIpOworICAgICAgICByZXR1cm4gKGdldFJlcXVlc3QoKS5nZXRTZXJ2ZXJOYW1lKCkpOworICAgIH0KKworCisgICAgcHVibGljIGludCBnZXRTZXJ2ZXJQb3J0KCkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3RlclNlcnZsZXRSZXF1ZXN0V3JhcHBlci5nZXRTZXJ2ZXJQb3J0KCkiKTsKKyAgICAgICAgcmV0dXJuIChnZXRSZXF1ZXN0KCkuZ2V0U2VydmVyUG9ydCgpKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBib29sZWFuIGlzU2VjdXJlKCkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3RlclNlcnZsZXRSZXF1ZXN0V3JhcHBlci5pc1NlY3VyZSgpIik7CisgICAgICAgIHJldHVybiAoZ2V0UmVxdWVzdCgpLmlzU2VjdXJlKCkpOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgcmVtb3ZlQXR0cmlidXRlKFN0cmluZyBuYW1lKSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiVGVzdGVyU2VydmxldFJlcXVlc3RXcmFwcGVyLnJlbW92ZUF0dHJpYnV0ZSgpIik7CisgICAgICAgIGdldFJlcXVlc3QoKS5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3RlclNlcnZsZXRSZXF1ZXN0V3JhcHBlci5zZXRBdHRyaWJ1dGUoKSIpOworICAgICAgICBnZXRSZXF1ZXN0KCkuc2V0QXR0cmlidXRlKG5hbWUsIHZhbHVlKTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldENoYXJhY3RlckVuY29kaW5nKFN0cmluZyBlbmMpCisgICAgICAgIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJUZXN0ZXJTZXJ2bGV0UmVxdWVzdFdyYXBwZXIuc2V0Q2hhcmFjdGVyRW5jb2RpbmcoKSIpOworICAgICAgICBnZXRSZXF1ZXN0KCkuc2V0Q2hhcmFjdGVyRW5jb2RpbmcoZW5jKTsKKyAgICB9CisKKworCisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1Rlc3RlclNlcnZsZXRSZXNwb25zZVdyYXBwZXIuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9UZXN0ZXJTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODkxODg0YwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9UZXN0ZXJTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyLmphdmEKQEAgLTAsMCArMSwxMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwgMjAwMCAsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50ZXN0ZXI7CisKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lio7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7CisKKy8qKgorICogVGVzdGVyIHJlc3BvbnNlIHdyYXBwZXIgdGhhdCBsb2dzIGFsbCBjYWxscyB0byB0aGUgY29uZmlndXJlZCBsb2dnZXIsCisgKiBiZWZvcmUgcGFzc2luZyB0aGVtIG9uIHRvIHRoZSB1bmRlcmx5aW5nIHJlc3BvbnNlLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgVGVzdGVyU2VydmxldFJlc3BvbnNlV3JhcHBlciBleHRlbmRzIFNlcnZsZXRSZXNwb25zZVdyYXBwZXIgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3IKKworCisgICAgLyoqCisgICAgICogQ29uZmlndXJlIGEgbmV3IHJlc3BvbnNlIHdyYXBwZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIHJlc3BvbnNlIHdlIGFyZSB3cmFwcGluZworICAgICAqLworICAgIHB1YmxpYyBUZXN0ZXJTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyKFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgeworCisgICAgICAgIHN1cGVyKHJlc3BvbnNlKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8vIEZvciBlYWNoIHB1YmxpYyBtZXRob2QsIGxvZyB0aGUgY2FsbCBhbmQgcGFzcyBpdCB0byB0aGUgd3JhcHBlZCByZXNwb25zZQorCisKKyAgICBwdWJsaWMgdm9pZCBmbHVzaEJ1ZmZlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiVGVzdGVyU2VydmxldFJlc3BvbnNlV3JhcHBlci5mbHVzaEJ1ZmZlcigpIik7CisgICAgICAgIGdldFJlc3BvbnNlKCkuZmx1c2hCdWZmZXIoKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBpbnQgZ2V0QnVmZmVyU2l6ZSgpIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJUZXN0ZXJTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyLmdldEJ1ZmZlclNpemUoKSIpOworICAgICAgICByZXR1cm4gKGdldFJlc3BvbnNlKCkuZ2V0QnVmZmVyU2l6ZSgpKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2hhcmFjdGVyRW5jb2RpbmcoKSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiVGVzdGVyU2VydmxldFJlc3BvbnNlV3JhcHBlci5nZXRDaGFyYWN0ZXJFbmNvZGluZygpIik7CisgICAgICAgIHJldHVybiAoZ2V0UmVzcG9uc2UoKS5nZXRDaGFyYWN0ZXJFbmNvZGluZygpKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBMb2NhbGUgZ2V0TG9jYWxlKCkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3RlclNlcnZsZXRSZXNwb25zZVdyYXBwZXIuZ2V0TG9jYWxlKCkiKTsKKyAgICAgICAgcmV0dXJuIChnZXRSZXNwb25zZSgpLmdldExvY2FsZSgpKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBTZXJ2bGV0T3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiVGVzdGVyU2VydmxldFJlc3BvbnNlV3JhcHBlci5nZXRPdXRwdXRTdHJlYW0oKSIpOworICAgICAgICByZXR1cm4gKGdldFJlc3BvbnNlKCkuZ2V0T3V0cHV0U3RyZWFtKCkpOworICAgIH0KKworCisgICAgcHVibGljIFByaW50V3JpdGVyIGdldFdyaXRlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiVGVzdGVyU2VydmxldFJlc3BvbnNlV3JhcHBlci5nZXRXcml0ZXIoKSIpOworICAgICAgICByZXR1cm4gKGdldFJlc3BvbnNlKCkuZ2V0V3JpdGVyKCkpOworICAgIH0KKworCisgICAgcHVibGljIGJvb2xlYW4gaXNDb21taXR0ZWQoKSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiVGVzdGVyU2VydmxldFJlc3BvbnNlV3JhcHBlci5pc0NvbW1pdHRlZCgpIik7CisgICAgICAgIHJldHVybiAoZ2V0UmVzcG9uc2UoKS5pc0NvbW1pdHRlZCgpKTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3RlclNlcnZsZXRSZXNwb25zZVdyYXBwZXIucmVzZXQoKSIpOworICAgICAgICBnZXRSZXNwb25zZSgpLnJlc2V0KCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCByZXNldEJ1ZmZlcigpIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJUZXN0ZXJTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyLnJlc2V0QnVmZmVyKCkiKTsKKyAgICAgICAgZ2V0UmVzcG9uc2UoKS5yZXNldEJ1ZmZlcigpOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgc2V0QnVmZmVyU2l6ZShpbnQgc2l6ZSkgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3RlclNlcnZsZXRSZXNwb25zZVdyYXBwZXIuc2V0QnVmZmVyU2l6ZSgpIik7CisgICAgICAgIGdldFJlc3BvbnNlKCkuc2V0QnVmZmVyU2l6ZShzaXplKTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldENvbnRlbnRMZW5ndGgoaW50IGxlbikgeworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlRlc3RlclNlcnZsZXRSZXNwb25zZVdyYXBwZXIuc2V0Q29udGVudExlbmd0aCgpIik7CisgICAgICAgIGdldFJlc3BvbnNlKCkuc2V0Q29udGVudExlbmd0aChsZW4pOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgc2V0Q29udGVudFR5cGUoU3RyaW5nIHR5cGUpIHsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJUZXN0ZXJTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyLnNldENvbnRlbnRUeXBlKCkiKTsKKyAgICAgICAgZ2V0UmVzcG9uc2UoKS5zZXRDb250ZW50VHlwZSh0eXBlKTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldExvY2FsZShMb2NhbGUgbG9jYWxlKSB7CisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiVGVzdGVyU2VydmxldFJlc3BvbnNlV3JhcHBlci5zZXRMb2NhbGUoKSIpOworICAgICAgICBnZXRSZXNwb25zZSgpLnNldExvY2FsZShsb2NhbGUpOworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvVXBwZXJDYXNlRmlsdGVyLmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvVXBwZXJDYXNlRmlsdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE3ZTE1ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9VcHBlckNhc2VGaWx0ZXIuamF2YQpAQCAtMCwwICsxLDYxIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAsIDIwMDEgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisKKy8qKgorICogRmlsdGVyIHRoYXQgc2ltcGx5IHRyYW5zZm9ybXMgaXRzIG91dHB1dCB0byB1cHBlciBjYXNlLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgVXBwZXJDYXNlRmlsdGVyIGltcGxlbWVudHMgRmlsdGVyIHsKKworCisgICAgcHJpdmF0ZSBGaWx0ZXJDb25maWcgY29uZmlnID0gbnVsbDsKKworICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3koKSB7CisgICAgICAgIDsgLy8gTm8gYWN0aW9uIHJlcXVpcmVkCisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW5pdChGaWx0ZXJDb25maWcgY29uZmlnKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRvRmlsdGVyKFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGaWx0ZXJDaGFpbiBjaGFpbikKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICBIdHRwU2VydmxldFJlcXVlc3Qgd3JlcXVlc3QgPQorICAgICAgICAgICAgbmV3IFVwcGVyQ2FzZVJlcXVlc3QoKEh0dHBTZXJ2bGV0UmVxdWVzdCkgcmVxdWVzdCk7CisgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2Ugd3Jlc3BvbnNlID0KKyAgICAgICAgICAgIG5ldyBVcHBlckNhc2VSZXNwb25zZSgoSHR0cFNlcnZsZXRSZXNwb25zZSkgcmVzcG9uc2UpOworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlVwcGVyQ2FzZUZpbHRlci5kb0ZpbHRlcigpIGJlZ2luIik7CisgICAgICAgIGNoYWluLmRvRmlsdGVyKHdyZXF1ZXN0LCB3cmVzcG9uc2UpOworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlVwcGVyQ2FzZUZpbHRlci5kb0ZpbHRlcigpIGVuZCIpOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9VcHBlckNhc2VJbnB1dFN0cmVhbS5qYXZhIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1VwcGVyQ2FzZUlucHV0U3RyZWFtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzgxNGY2MwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9VcHBlckNhc2VJbnB1dFN0cmVhbS5qYXZhCkBAIC0wLDAgKzEsOTggQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwgMjAwMCwgMjAwMSAsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50ZXN0ZXI7CisKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lio7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7CisKKworLyoqCisgKiBTZXJ2bGV0SW5wdXRTdHJlYW0gdGhhdCBjb252ZXJ0cyBhbGwgY2hhcmFjdGVycyB0byB1cHBlciBjYXNlLgorICogV0FSTklORzogIFRoaXMgd2lsbCBvbmx5IHdvcmsgb24gOC1iaXQgY2hhcmFjdGVyIHNldHMhCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBVcHBlckNhc2VJbnB1dFN0cmVhbSBleHRlbmRzIFNlcnZsZXRJbnB1dFN0cmVhbSB7CisKKyAgICBTZXJ2bGV0SW5wdXRTdHJlYW0gc3RyZWFtID0gbnVsbDsKKworICAgIHB1YmxpYyBVcHBlckNhc2VJbnB1dFN0cmVhbShTZXJ2bGV0SW5wdXRTdHJlYW0gc3RyZWFtKQorICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgdGhpcy5zdHJlYW0gPSBzdHJlYW07CisgICAgfQorCisKKyAgICBwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpbnQgYyA9IHN0cmVhbS5yZWFkKCk7CisgICAgICAgIGlmIChjIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAoYyk7CisgICAgICAgIGNoYXIgY2ggPSAoY2hhcikgYzsKKyAgICAgICAgaWYgKENoYXJhY3Rlci5pc0xvd2VyQ2FzZShjaCkpCisgICAgICAgICAgICBjaCA9IENoYXJhY3Rlci50b1VwcGVyQ2FzZShjaCk7CisgICAgICAgIHJldHVybiAoKGludCkgY2gpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgcmVhZChieXRlIGJ1ZltdLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpbnQgbiA9IDA7CisgICAgICAgIGZvciAoaW50IGkgPSBvZmY7IGkgPCAob2ZmICsgbGVuKTsgaSsrKSB7CisgICAgICAgICAgICBpbnQgYyA9IHN0cmVhbS5yZWFkKCk7CisgICAgICAgICAgICBpZiAoYyA8IDApIHsKKyAgICAgICAgICAgICAgICBpZiAobiA9PSAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gKC0xKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNoYXIgY2ggPSAoY2hhcikgYzsKKyAgICAgICAgICAgIGlmIChDaGFyYWN0ZXIuaXNMb3dlckNhc2UoY2gpKQorICAgICAgICAgICAgICAgIGNoID0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGNoKTsKKyAgICAgICAgICAgIGJ1ZltpXSA9IChieXRlKSBjaDsKKyAgICAgICAgICAgIG4rKzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKG4pOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgcmVhZChieXRlIGJ1ZltdKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gKHJlYWQoYnVmLCAwLCBidWYubGVuZ3RoKSk7CisgICAgfQorCisgICAgcHVibGljIGludCByZWFkTGluZShieXRlIGJ1ZltdLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpbnQgbiA9IDA7CisgICAgICAgIGZvciAoaW50IGkgPSBvZmY7IGkgPCAob2ZmICsgbGVuKTsgaSsrKSB7CisgICAgICAgICAgICBpbnQgYyA9IHN0cmVhbS5yZWFkKCk7CisgICAgICAgICAgICBpZiAoYyA8IDApIHsKKyAgICAgICAgICAgICAgICBpZiAobiA9PSAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gKC0xKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNoYXIgY2ggPSAoY2hhcikgYzsKKyAgICAgICAgICAgIGlmIChDaGFyYWN0ZXIuaXNMb3dlckNhc2UoY2gpKQorICAgICAgICAgICAgICAgIGNoID0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGNoKTsKKyAgICAgICAgICAgIGJ1ZltpXSA9IChieXRlKSBjaDsKKyAgICAgICAgICAgIG4rKzsKKyAgICAgICAgICAgIGlmIChjaCA9PSAnXG4nKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHJldHVybiAobik7CisgICAgfQorCit9CisKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9VcHBlckNhc2VPdXRwdXRTdHJlYW0uamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9VcHBlckNhc2VPdXRwdXRTdHJlYW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjRkYWEyCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1VwcGVyQ2FzZU91dHB1dFN0cmVhbS5qYXZhCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwgMjAwMCwgMjAwMSAsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50ZXN0ZXI7CisKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lio7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7CisKKworLyoqCisgKiBTZXJ2bGV0T3V0cHV0U3RyZWFtIHRoYXQgY29udmVydHMgYWxsIGNoYXJhY3RlcnMgdG8gdXBwZXIgY2FzZS4KKyAqIFdBUk5JTkc6ICBUaGlzIHdpbGwgb25seSB3b3JrIG9uIDgtYml0IGNoYXJhY3RlciBzZXRzIQorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgVXBwZXJDYXNlT3V0cHV0U3RyZWFtIGV4dGVuZHMgU2VydmxldE91dHB1dFN0cmVhbSB7CisKKyAgICBTZXJ2bGV0T3V0cHV0U3RyZWFtIHN0cmVhbSA9IG51bGw7CisKKyAgICBwdWJsaWMgVXBwZXJDYXNlT3V0cHV0U3RyZWFtKFNlcnZsZXRPdXRwdXRTdHJlYW0gc3RyZWFtKQorICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgdGhpcy5zdHJlYW0gPSBzdHJlYW07CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGUoaW50IGMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGNoYXIgY2ggPSAoY2hhcikgYzsKKyAgICAgICAgaWYgKENoYXJhY3Rlci5pc0xvd2VyQ2FzZShjaCkpCisgICAgICAgICAgICBjaCA9IENoYXJhY3Rlci50b1VwcGVyQ2FzZShjaCk7CisgICAgICAgIHN0cmVhbS53cml0ZSgoaW50KSBjaCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZSBidWZbXSwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IG9mZjsgaSA8IChvZmYgKyBsZW4pOyBpKyspIHsKKyAgICAgICAgICAgIGNoYXIgY2ggPSAoY2hhcikgYnVmW2ldOworICAgICAgICAgICAgaWYgKENoYXJhY3Rlci5pc0xvd2VyQ2FzZShjaCkpCisgICAgICAgICAgICAgICAgY2ggPSBDaGFyYWN0ZXIudG9VcHBlckNhc2UoY2gpOworICAgICAgICAgICAgc3RyZWFtLndyaXRlKChpbnQpIGNoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlKGJ5dGUgYnVmW10pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHdyaXRlKGJ1ZiwgMCwgYnVmLmxlbmd0aCk7CisgICAgfQorCit9CisKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9VcHBlckNhc2VSZWFkZXIuamF2YSBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9VcHBlckNhc2VSZWFkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDM1MmZiCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1VwcGVyQ2FzZVJlYWRlci5qYXZhCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwgMjAwMCwgMjAwMSAsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50ZXN0ZXI7CisKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lio7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7CisKKworLyoqCisgKiBCdWZmZXJlZFJlYWRlciB0aGF0IGNvbnZlcnRzIGFsbCBjaGFyYWN0ZXJzIHRvIHVwcGVyIGNhc2UuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBVcHBlckNhc2VSZWFkZXIgZXh0ZW5kcyBCdWZmZXJlZFJlYWRlciB7CisKKyAgICBwdWJsaWMgVXBwZXJDYXNlUmVhZGVyKEJ1ZmZlcmVkUmVhZGVyIHJlYWRlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIocmVhZGVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpbnQgYyA9IHN1cGVyLnJlYWQoKTsKKyAgICAgICAgaWYgKGMgPCAwKQorICAgICAgICAgICAgcmV0dXJuIChjKTsKKyAgICAgICAgY2hhciBjaCA9IChjaGFyKSBjOworICAgICAgICBpZiAoQ2hhcmFjdGVyLmlzTG93ZXJDYXNlKGNoKSkKKyAgICAgICAgICAgIGNoID0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGNoKTsKKyAgICAgICAgcmV0dXJuICgoaW50KSBjaCk7CisgICAgfQorCisgICAgcHVibGljIGludCByZWFkKGNoYXIgYnVmW10sIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGludCBuID0gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IG9mZjsgaSA8IChvZmYgKyBsZW4pOyBpKyspIHsKKyAgICAgICAgICAgIGludCBjID0gc3VwZXIucmVhZCgpOworICAgICAgICAgICAgaWYgKGMgPCAwKSB7CisgICAgICAgICAgICAgICAgaWYgKG4gPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgtMSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjaGFyIGNoID0gKGNoYXIpIGM7CisgICAgICAgICAgICBpZiAoQ2hhcmFjdGVyLmlzTG93ZXJDYXNlKGNoKSkKKyAgICAgICAgICAgICAgICBjaCA9IENoYXJhY3Rlci50b1VwcGVyQ2FzZShjaCk7CisgICAgICAgICAgICBidWZbaV0gPSBjaDsKKyAgICAgICAgICAgIG4rKzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKG4pOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgcmVhZChjaGFyIGJ1ZltdKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gKHJlYWQoYnVmLCAwLCBidWYubGVuZ3RoKSk7CisgICAgfQorCit9CisKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9VcHBlckNhc2VSZXF1ZXN0LmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvVXBwZXJDYXNlUmVxdWVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjMDFiZTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvVXBwZXJDYXNlUmVxdWVzdC5qYXZhCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwgMjAwMCwgMjAwMSAsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50ZXN0ZXI7CisKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lio7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7CisKKworLyoqCisgKiBIdHRwU2VydmxldFJlcXVlc3Qgd3JhcHBlciB0aGF0IGNvbnZlcnRzIGFsbCBpbnB1dCBjaGFyYWN0ZXJzIHRvCisgKiB1cHBlciBjYXNlLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgVXBwZXJDYXNlUmVxdWVzdCBleHRlbmRzIEh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIgeworCisKKyAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCA9IG51bGw7CisKKyAgICBwdWJsaWMgVXBwZXJDYXNlUmVxdWVzdChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICBzdXBlcihyZXF1ZXN0KTsKKyAgICAgICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDsKKyAgICB9CisKKyAgICBwdWJsaWMgU2VydmxldElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIChuZXcgVXBwZXJDYXNlSW5wdXRTdHJlYW0ocmVxdWVzdC5nZXRJbnB1dFN0cmVhbSgpKSk7CisgICAgfQorCisgICAgcHVibGljIEJ1ZmZlcmVkUmVhZGVyIGdldFJlYWRlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiAobmV3IFVwcGVyQ2FzZVJlYWRlcihyZXF1ZXN0LmdldFJlYWRlcigpKSk7CisgICAgfQorCisKK30KKworCisKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9VcHBlckNhc2VSZXNwb25zZS5qYXZhIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1VwcGVyQ2FzZVJlc3BvbnNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM5MWMxZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9VcHBlckNhc2VSZXNwb25zZS5qYXZhCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwgMjAwMCwgMjAwMSAsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50ZXN0ZXI7CisKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lio7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7CisKKworLyoqCisgKiBIdHRwU2VydmxldFJlc3BvbnNlIHdyYXBwZXIgdGhhdCBjb252ZXJ0cyBhbGwgb3V0cHV0IGNoYXJhY3RlcnMgdG8KKyAqIHVwcGVyIGNhc2UuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBVcHBlckNhc2VSZXNwb25zZSBleHRlbmRzIEh0dHBTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyIHsKKworCisgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSA9IG51bGw7CisKKyAgICBib29sZWFuIHN0cmVhbSA9IGZhbHNlOyAvLyBXcmFwIG91ciBvd24gb3V0cHV0IHN0cmVhbQorCisgICAgcHVibGljIFVwcGVyQ2FzZVJlc3BvbnNlKEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHsKKyAgICAgICAgdGhpcyhyZXNwb25zZSwgZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyBVcHBlckNhc2VSZXNwb25zZShIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLCBib29sZWFuIHN0cmVhbSkgeworICAgICAgICBzdXBlcihyZXNwb25zZSk7CisgICAgICAgIHRoaXMucmVzcG9uc2UgPSByZXNwb25zZTsKKyAgICAgICAgdGhpcy5zdHJlYW0gPSBzdHJlYW07CisgICAgfQorCisgICAgcHVibGljIFNlcnZsZXRPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIChuZXcgVXBwZXJDYXNlT3V0cHV0U3RyZWFtKHJlc3BvbnNlLmdldE91dHB1dFN0cmVhbSgpKSk7CisgICAgfQorCisgICAgcHVibGljIFByaW50V3JpdGVyIGdldFdyaXRlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChzdHJlYW0pCisgICAgICAgICAgICByZXR1cm4gKG5ldyBQcmludFdyaXRlcihnZXRPdXRwdXRTdHJlYW0oKSwgdHJ1ZSkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gKG5ldyBVcHBlckNhc2VXcml0ZXIocmVzcG9uc2UuZ2V0V3JpdGVyKCkpKTsKKyAgICB9CisKKworfQorCisKKwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1VwcGVyQ2FzZVdyaXRlci5qYXZhIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1VwcGVyQ2FzZVdyaXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMWVhNGYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvVXBwZXJDYXNlV3JpdGVyLmphdmEKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwLCAyMDAxICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworCisvKioKKyAqIFByaW50V3JpdGVyIHRoYXQgY29udmVydHMgYWxsIGNoYXJhY3RlcnMgdG8gdXBwZXIgY2FzZS4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIFVwcGVyQ2FzZVdyaXRlciBleHRlbmRzIFByaW50V3JpdGVyIHsKKworCisgICAgcHVibGljIFVwcGVyQ2FzZVdyaXRlcihQcmludFdyaXRlciB3cml0ZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyKHdyaXRlcik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGUoaW50IGMpIHsKKyAgICAgICAgY2hhciBjaCA9IChjaGFyKSBjOworICAgICAgICBpZiAoQ2hhcmFjdGVyLmlzTG93ZXJDYXNlKGNoKSkKKyAgICAgICAgICAgIGNoID0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGNoKTsKKyAgICAgICAgc3VwZXIud3JpdGUoKGludCkgY2gpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlKGNoYXIgYnVmW10sIGludCBvZmYsIGludCBsZW4pIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IG9mZjsgaSA8IChvZmYgKyBsZW4pOyBpKyspIHsKKyAgICAgICAgICAgIGNoYXIgY2ggPSBidWZbaV07CisgICAgICAgICAgICBpZiAoQ2hhcmFjdGVyLmlzTG93ZXJDYXNlKGNoKSkKKyAgICAgICAgICAgICAgICBjaCA9IENoYXJhY3Rlci50b1VwcGVyQ2FzZShjaCk7CisgICAgICAgICAgICBzdXBlci53cml0ZSgoaW50KSBjaCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZShjaGFyIGJ1ZltdKSB7CisgICAgICAgIHdyaXRlKGJ1ZiwgMCwgYnVmLmxlbmd0aCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGUoU3RyaW5nIHMsIGludCBvZmYsIGludCBsZW4pIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IG9mZjsgaSA8IChvZmYgKyBsZW4pOyBpKyspIHsKKyAgICAgICAgICAgIGNoYXIgY2ggPSBzLmNoYXJBdChpKTsKKyAgICAgICAgICAgIGlmIChDaGFyYWN0ZXIuaXNMb3dlckNhc2UoY2gpKQorICAgICAgICAgICAgICAgIGNoID0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGNoKTsKKyAgICAgICAgICAgIHN1cGVyLndyaXRlKChpbnQpIGNoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlKFN0cmluZyBzKSB7CisgICAgICAgIHdyaXRlKHMsIDAsIHMubGVuZ3RoKCkpOworICAgIH0KKworCit9CisKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9XcmFwcGVyRmlsdGVyLmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvV3JhcHBlckZpbHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyMzVhYjQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvV3JhcHBlckZpbHRlci5qYXZhCkBAIC0wLDAgKzEsMTI0IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisvKioKKyAqIENvbmZpZ3VyYWJsZSBmaWx0ZXIgdGhhdCB3aWxsIHdyYXAgdGhlIHJlcXVlc3QgYW5kL29yIHJlc3BvbnNlIG9iamVjdHMKKyAqIGl0IHBhc3NlcyBvbiB3aXRoIGVpdGhlciBnZW5lcmljIG9yIEhUVFAtc3BlY2lmaWMgd3JhcHBlcnMuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBXcmFwcGVyRmlsdGVyIGltcGxlbWVudHMgRmlsdGVyIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBmaWx0ZXIgY29uZmlndXJhdGlvbiBvYmplY3QgZm9yIHRoaXMgZmlsdGVyLgorICAgICAqLworICAgIHByb3RlY3RlZCBGaWx0ZXJDb25maWcgY29uZmlnID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIHR5cGUgb2Ygd3JhcHBlciBmb3IgZWFjaCByZXF1ZXN0ICgibm9uZSIsICJnZW5lcmljIiwgImh0dHAiKS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHJlcXVlc3RXcmFwcGVyID0gIm5vbmUiOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBvZiB3cmFwcGVyIGZvciBlYWNoIHJlc3BvbnNlICgibm9uZSIsICJnZW5lcmljIiwgImh0dHAiKS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHJlc3BvbnNlV3JhcHBlciA9ICJub25lIjsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJlbGVhc2UgdGhpcyBGaWx0ZXIgaW5zdGFuY2UgZnJvbSBzZXJ2aWNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3koKSB7CisKKyAgICAgICAgY29uZmlnID0gbnVsbDsKKyAgICAgICAgcmVxdWVzdFdyYXBwZXIgPSAibm9uZSI7CisgICAgICAgIHJlc3BvbnNlV3JhcHBlciA9ICJub25lIjsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogV3JhcCB0aGlzIHJlcXVlc3QgYW5kL29yIHJlc3BvbnNlIGFzIGNvbmZpZ3VyZWQgYW5kIHBhc3MgaXQgb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgZG9GaWx0ZXIoU2VydmxldFJlcXVlc3QgaW5SZXF1ZXN0LCBTZXJ2bGV0UmVzcG9uc2UgaW5SZXNwb25zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGaWx0ZXJDaGFpbiBjaGFpbikKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICAvLyBDcmVhdGUgdGhlIGFwcHJvcHJpYXRlIHdyYXBwZXJzCisgICAgICAgIFNlcnZsZXRSZXF1ZXN0IG91dFJlcXVlc3QgPSBpblJlcXVlc3Q7CisgICAgICAgIFNlcnZsZXRSZXNwb25zZSBvdXRSZXNwb25zZSA9IGluUmVzcG9uc2U7CisgICAgICAgIGlmIChyZXF1ZXN0V3JhcHBlci5lcXVhbHMoImdlbmVyaWMiKSkgeworICAgICAgICAgICAgb3V0UmVxdWVzdCA9IG5ldyBUZXN0ZXJTZXJ2bGV0UmVxdWVzdFdyYXBwZXIoaW5SZXF1ZXN0KTsKKyAgICAgICAgfSBlbHNlIGlmIChyZXF1ZXN0V3JhcHBlci5lcXVhbHMoImh0dHAiKSkgeworICAgICAgICAgICAgb3V0UmVxdWVzdCA9IG5ldyBUZXN0ZXJIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyCisgICAgICAgICAgICAgICAgKChIdHRwU2VydmxldFJlcXVlc3QpIGluUmVxdWVzdCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlc3BvbnNlV3JhcHBlci5lcXVhbHMoImdlbmVyaWMiKSkgeworICAgICAgICAgICAgb3V0UmVzcG9uc2UgPSBuZXcgVGVzdGVyU2VydmxldFJlc3BvbnNlV3JhcHBlcihpblJlc3BvbnNlKTsKKyAgICAgICAgfSBlbHNlIGlmIChyZXNwb25zZVdyYXBwZXIuZXF1YWxzKCJodHRwIikpIHsKKyAgICAgICAgICAgIG91dFJlc3BvbnNlID0gbmV3IFRlc3Rlckh0dHBTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyCisgICAgICAgICAgICAgICAgKChIdHRwU2VydmxldFJlc3BvbnNlKSBpblJlc3BvbnNlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFBlcmZvcm0gdGhpcyByZXF1ZXN0CisgICAgICAgIGNoYWluLmRvRmlsdGVyKG91dFJlcXVlc3QsIG91dFJlc3BvbnNlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUGxhY2UgdGhpcyBGaWx0ZXIgaW5zdGFuY2UgaW50byBzZXJ2aWNlLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbmZpZyBUaGUgZmlsdGVyIGNvbmZpZ3VyYXRpb24gb2JqZWN0CisgICAgICovCisgICAgcHVibGljIHZvaWQgaW5pdChGaWx0ZXJDb25maWcgY29uZmlnKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7CisgICAgICAgIFN0cmluZyB2YWx1ZSA9IG51bGw7CisgICAgICAgIHZhbHVlID0gY29uZmlnLmdldEluaXRQYXJhbWV0ZXIoInJlcXVlc3QiKTsKKyAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpCisgICAgICAgICAgICByZXF1ZXN0V3JhcHBlciA9IHZhbHVlOworICAgICAgICB2YWx1ZSA9IGNvbmZpZy5nZXRJbml0UGFyYW1ldGVyKCJyZXNwb25zZSIpOworICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkKKyAgICAgICAgICAgIHJlc3BvbnNlV3JhcHBlciA9IHZhbHVlOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9YZXJjZXMwMS5qYXZhIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1hlcmNlczAxLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE2ZmVlZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9YZXJjZXMwMS5qYXZhCkBAIC0wLDAgKzEsOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwgMjAwMCwgMjAwMSAsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3RlcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworCisvKioKKyAqIEVuc3VyZSB0aGF0IHdlIGNhbiB1c2UgdGhlIFhlcmNlcyBwYXJzZXIgd2hpbGUgaW5jbHVkZWQgaW4gYSB3ZWIgYXBwbGljYXRpb24KKyAqIGV2ZW4gdGhvdWdoIHRoZSBzZXJ2bGV0IGNvbnRhaW5lciBtaWdodCB1dGlsaXplIGl0cyBvd24gcGFyc2VyIGZvciBpbnRlcm5hbAorICogdXNlLgorICoKKyAqIEBhdXRob3IgQW15IFJvaAorICogQGF1dGhvciBDcmFpZyBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBYZXJjZXMwMSBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFBlcmZvcm0gYSBzaW1wbGUgU0FYIHBhcnNlIHVzaW5nIFhlcmNlcyAoYmFzZWQgb24gdGhlIFNBWENvdW50CisgICAgICogZXhhbXBsZSBhcHBsaWNhdGlvbikuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBzZXJ2bGV0IHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXJ2aWNlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uCisgICAgeworCisgICAgICAgIC8vIFByZXBhcmUgb3VyIG91dHB1dCBzdHJlYW0KKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvcGxhaW4iKTsKKyAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisgICAgICAgIGJvb2xlYW4gb2sgPSB0cnVlOworCisgICAgICAgIC8vIENvbnN0cnVjdCBhIG5ldyBpbnN0YW5jZSBvZiBvdXIgcGFyc2VyIGRyaXZlcgorICAgICAgICBVUkwgdXJsID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHVybCA9IGdldFNlcnZsZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2UoIi9YZXJjZXMwMS54bWwiKTsKKyAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJYZXJjZXMwMSBGQUlMRUQgLSAiICsgZSk7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSh3cml0ZXIpOworICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBYZXJjZXMwMVBhcnNlciBwYXJzZXIgPSBuZXcgWGVyY2VzMDFQYXJzZXIoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChvaykKKyAgICAgICAgICAgICAgICBwYXJzZXIucGFyc2UodXJsKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJYZXJjZXMwMSBGQUlMRUQgLSAiICsgZSk7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSh3cml0ZXIpOworICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlcG9ydCBzdWNjZXNzZnVsIGNvbXBsZXRpb24gaWYgT0sKKyAgICAgICAgaWYgKG9rKQorICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIlhlcmNlczAxIFBBU1NFRCIpOworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBTdGF0aWNMb2dnZXIucmVhZCgpOworICAgICAgICAgICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKG1lc3NhZ2UpOworICAgICAgICB9CisgICAgICAgIFN0YXRpY0xvZ2dlci5yZXNldCgpOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9YZXJjZXMwMVBhcnNlci5qYXZhIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL1hlcmNlczAxUGFyc2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjcwYWE4YgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9YZXJjZXMwMVBhcnNlci5qYXZhCkBAIC0wLDAgKzEsMjM0IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAsIDIwMDEgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50ZXN0ZXI7CisKKworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVMaXN0OworaW1wb3J0IG9yZy54bWwuc2F4LkhhbmRsZXJCYXNlOworaW1wb3J0IG9yZy54bWwuc2F4LlBhcnNlcjsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb247CitpbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5QYXJzZXJGYWN0b3J5OworCisKKy8qKgorICogU0FYIHBhcnNlciAoYmFzZWQgb24gU0FYQ291bnQpIHRoYXQgZXhlcmNpc2VzIHRoZSBYZXJjZXMgcGFyc2VyIHdpdGhpbiB0aGUKKyAqIGVudmlyb25tZW50IG9mIGEgd2ViIGFwcGxpY2F0aW9uLgorICoKKyAqIEBhdXRob3IgQW15IFJvaAorICogQGF1dGhvciBDcmFpZyBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBYZXJjZXMwMVBhcnNlciBleHRlbmRzIEhhbmRsZXJCYXNlIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBudW1iZXIgb2YgWE1MIGF0dHJpYnV0ZXMgd2UgaGF2ZSBlbmNvdW50ZXJlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IGF0dHJpYnV0ZXMgPSAwOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgd2UgaGF2ZSBlbmNvdW50ZXJlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IGNoYXJhY3RlcnMgPSAwOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgbnVtYmVyIG9mIFhNTCBlbGVtZW50cyB3ZSBoYXZlIGVuY291bnRlcmVkLgorICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgZWxlbWVudHMgPSAwOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgYW1vdW50IG9mIGlnbm9yYWJsZSB3aGl0ZXNwYWNlIHdlIGhhdmUgZW5jb3VudGVyZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIGludCB3aGl0ZXNwYWNlID0gMDsKKworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogRXhlY3V0ZSB0aGUgcmVxdWVzdGVkIHBhcnNlLgorICAgICAqCisgICAgICogQHBhcmFtIHVybCBUaGUgVVJMIG9mIHRoZSBYTUwgcmVzb3VyY2UgdG8gYmUgcGFyc2VkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbnkgcHJvY2Vzc2luZyBleGNlcHRpb24gb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgcGFyc2UoVVJMIHVybCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gQ29uc3RydWN0IGEgcGFyc2VyIGZvciBvdXIgdXNlCisgICAgICAgIFBhcnNlciBwYXJzZXIgPQorICAgICAgICAgICAgUGFyc2VyRmFjdG9yeS5tYWtlUGFyc2VyKCJvcmcuYXBhY2hlLnhlcmNlcy5wYXJzZXJzLlNBWFBhcnNlciIpOworICAgICAgICBwYXJzZXIuc2V0RG9jdW1lbnRIYW5kbGVyKHRoaXMpOworICAgICAgICBwYXJzZXIuc2V0RXJyb3JIYW5kbGVyKHRoaXMpOworCisgICAgICAgIC8vIFBlcmZvcm0gdGhlIHJlcXVlc3RlZCBwYXJzZQorICAgICAgICBsb25nIGJlZm9yZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICBwYXJzZXIucGFyc2UodXJsLnRvU3RyaW5nKCkpOworICAgICAgICBsb25nIGFmdGVyID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisKKyAgICAgICAgLy8gTG9nIHRoZSByZXN1bHRzCisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiUGFyc2luZyB0aW1lID0gIiArIChhZnRlciAtIGJlZm9yZSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBtaWxsaXNlY29uZHMiKTsKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJQcm9jZXNzZWQgIiArIGVsZW1lbnRzICsgIiBlbGVtZW50cyIpOworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlByb2Nlc3NlZCAiICsgYXR0cmlidXRlcyArICIgYXR0cmlidXRlcyIpOworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlByb2Nlc3NlZCAiICsgY2hhcmFjdGVycyArICIgY2hhcmFjdGVycyIpOworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIlByb2Nlc3NlZCAiICsgd2hpdGVzcGFjZSArICIgd2hpdGVzcGFjZXMiKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNBWCBFcnJvciBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJlY2VpdmUgbm90aWZpY2F0aW9uIG9mIGEgcGFyc2VyIGVycm9yLgorICAgICAqCisgICAgICogQHBhcmFtIGUgVGhlIHBhcnNlciBleGNlcHRpb24gYmVpbmcgcmVwb3J0ZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gU0FYRXhjZXB0aW9uIGlmIGEgcGFyc2luZyBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBlcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBlKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKworICAgICAgICBTdGF0aWNMb2dnZXIud3JpdGUoIltFcnJvcl0gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2NhdGlvblN0cmluZyhlKSArICI6ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRNZXNzYWdlKCkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZWNlaXZlIG5vdGlmaWNhdGlvbiBvZiBhIGZhdGFsIGVycm9yLgorICAgICAqCisgICAgICogQHBhcmFtIGUgVGhlIHBhcnNlciBleGNlcHRpb24gYmVpbmcgcmVwb3J0ZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gU0FYRXhjZXB0aW9uIGlmIGEgcGFyc2luZyBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBmYXRhbEVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGUpIHRocm93cyBTQVhFeGNlcHRpb24geworCisgICAgICAgIFN0YXRpY0xvZ2dlci53cml0ZSgiW0ZhdGFsXSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldExvY2F0aW9uU3RyaW5nKGUpICsgIjogIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmdldE1lc3NhZ2UoKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlY2VpdmUgbm90aWZpY2F0aW9uIG9mIGEgcGFyc2VyIHdhcm5pbmcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZSBUaGUgcGFyc2VyIGV4Y2VwdGlvbiBiZWluZyByZXBvcnRlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBTQVhFeGNlcHRpb24gaWYgYSBwYXJzaW5nIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHdhcm5pbmcoU0FYUGFyc2VFeGNlcHRpb24gZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisKKyAgICAgICAgU3RhdGljTG9nZ2VyLndyaXRlKCJbV2FybmluZ10gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2NhdGlvblN0cmluZyhlKSArICI6ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRNZXNzYWdlKCkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGxvY2F0aW9uIGF0IHdoaWNoIHRoaXMgZXhjZXB0aW9uIG9jY3VycmVkLgorICAgICAqCisgICAgICogQHBhcmFtIGUgVGhlIFNBWFBhcnNlRXhjZXB0aW9uIHdlIGFyZSByZXBvcnRpbmcgb24KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBnZXRMb2NhdGlvblN0cmluZyhTQVhQYXJzZUV4Y2VwdGlvbiBlKSB7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBTdHJpbmcgc3lzdGVtSWQgPSBlLmdldFN5c3RlbUlkKCk7CisgICAgICAgIGlmIChzeXN0ZW1JZCAhPSBudWxsKSB7CisgICAgICAgICAgICBpbnQgaW5kZXggPSBzeXN0ZW1JZC5sYXN0SW5kZXhPZignLycpOworICAgICAgICAgICAgaWYgKGluZGV4ICE9IC0xKQorICAgICAgICAgICAgICAgIHN5c3RlbUlkID0gc3lzdGVtSWQuc3Vic3RyaW5nKGluZGV4ICsgMSk7CisgICAgICAgICAgICBzYi5hcHBlbmQoc3lzdGVtSWQpOworICAgICAgICB9CisgICAgICAgIHNiLmFwcGVuZCgnOicpOworICAgICAgICBzYi5hcHBlbmQoZS5nZXRMaW5lTnVtYmVyKCkpOworICAgICAgICBzYi5hcHBlbmQoJzonKTsKKyAgICAgICAgc2IuYXBwZW5kKGUuZ2V0Q29sdW1uTnVtYmVyKCkpOworICAgICAgICByZXR1cm4gKHNiLnRvU3RyaW5nKCkpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU0FYIEV2ZW50IE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogQ2hhcmFjdGVyIGRhdGEgZXZlbnQgaGFuZGxlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjaCBDaGFyYWN0ZXIgYXJyYXkgY29udGFpbmluZyB0aGUgY2hhcmFjdGVycworICAgICAqIEBwYXJhbSBzdGFydCBTdGFydGluZyBwb3NpdGlvbiBpbiB0aGUgYXJyYXkKKyAgICAgKiBAcGFyYW0gbGVuZ3RoIE51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHByb2Nlc3MKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gU0FYRXhjZXB0aW9uIGlmIGEgcGFyc2luZyBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjaGFyYWN0ZXJzKGNoYXIgY2hbXSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKQorICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKworICAgICAgICBjaGFyYWN0ZXJzICs9IGxlbmd0aDsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogSWdub3JhYmxlIHdoaXRlc3BhY2UgZXZlbnQgaGFuZGxlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjaCBDaGFyYWN0ZXIgYXJyYXkgY29udGFpbmluZyB0aGUgY2hhcmFjdGVycworICAgICAqIEBwYXJhbSBzdGFydCBTdGFydGluZyBwb3NpdGlvbiBpbiB0aGUgYXJyYXkKKyAgICAgKiBAcGFyYW0gbGVuZ3RoIE51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHByb2Nlc3MKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gU0FYRXhjZXB0aW9uIGlmIGEgcGFyc2luZyBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpZ25vcmFibGVXaGl0ZXNwYWNlKGNoYXIgY2hbXSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKQorICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKworICAgICAgICB3aGl0ZXNwYWNlICs9IGxlbmd0aDsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU3RhcnQgb2YgZWxlbWVudCBldmVudCBoYW5kbGVyLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgVGhlIGVsZW1lbnQgdHlwZSBuYW1lCisgICAgICogQHBhcmFtIGF0dHJzIFRoZSBzcGVjaWZpZWQgb3IgZGVmYXVsdGVkIGF0dHJpYnV0ZXMKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gU0FYRXhjZXB0aW9uIGlmIGEgcGFyc2luZyBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZUxpc3QgYXR0cnMpIHsKKworICAgICAgICBlbGVtZW50cysrOworICAgICAgICBpZiAoYXR0cnMgIT0gbnVsbCkKKyAgICAgICAgICAgIGF0dHJpYnV0ZXMgKz0gYXR0cnMuZ2V0TGVuZ3RoKCk7CisKKyAgICB9CisKKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvc2hhcmVkL1NoYXJlZFNlc3Npb25CZWFuLmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvc2hhcmVkL1NoYXJlZFNlc3Npb25CZWFuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDYyMTg3OQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci9zaGFyZWQvU2hhcmVkU2Vzc2lvbkJlYW4uamF2YQpAQCAtMCwwICsxLDE2NSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3Rlci5zaGFyZWQ7CisKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEuc3FsLkRhdGU7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uQWN0aXZhdGlvbkxpc3RlbmVyOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbkJpbmRpbmdFdmVudDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb25CaW5kaW5nTGlzdGVuZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uRXZlbnQ7CisKKworLyoqCisgKiBTaW1wbGUgSmF2YUJlYW4gdG8gdXNlIGZvciBzZXNzaW9uIGF0dHJpYnV0ZSB0ZXN0cy4gIEl0IGlzIFNlcmlhbGl6YWJsZQorICogc28gdGhhdCBpbnN0YW5jZXMgY2FuIGJlIHNhdmVkIGFuZCByZXN0b3JlZCBhY3Jvc3Mgc2VydmVyIHJlc3RhcnRzLgorICogPHA+CisgKiBUaGlzIGlzIGZ1bmN0aW9uYWxseSBlcXVpdmFsZW50IHRvIDxjb2RlPlNlc3Npb25CZWFuPC9jb2RlPiwgYnV0IHN0b3JlZAorICogaW4gYSBkaWZmZXJlbnQgcGFja2FnZSBzbyB0aGF0IGl0IGdldHMgZGVwbG95ZWQgaW50byBhIEpBUiBmaWxlIHVuZGVyCisgKiA8Y29kZT4kQ0FUQUxJTkFfSE9NRS9saWI8L2NvZGU+LgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgU2hhcmVkU2Vzc2lvbkJlYW4gaW1wbGVtZW50cworICAgIEh0dHBTZXNzaW9uQWN0aXZhdGlvbkxpc3RlbmVyLCBIdHRwU2Vzc2lvbkJpbmRpbmdMaXN0ZW5lciwgU2VyaWFsaXphYmxlIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIEEgZGF0ZSBwcm9wZXJ0eSBmb3IgdXNlIHdpdGggcHJvcGVydHkgZWRpdG9yIHRlc3RzLgorICAgICAqLworICAgIHByb3RlY3RlZCBEYXRlIGRhdGVQcm9wZXJ0eSA9CisgICAgICAgIG5ldyBEYXRlKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKKworICAgIHB1YmxpYyBEYXRlIGdldERhdGVQcm9wZXJ0eSgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLmRhdGVQcm9wZXJ0eSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RGF0ZVByb3BlcnR5KERhdGUgZGF0ZVByb3BlcnR5KSB7CisgICAgICAgIHRoaXMuZGF0ZVByb3BlcnR5ID0gZGF0ZVByb3BlcnR5OworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIGxpZmVjeWNsZSBldmVudHMgdGhhdCBoYXZlIGhhcHBlbmVkIG9uIHRoaXMgYmVhbiBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGxpZmVjeWNsZSA9ICIiOworCisgICAgcHVibGljIFN0cmluZyBnZXRMaWZlY3ljbGUoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5saWZlY3ljbGUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldExpZmVjeWNsZShTdHJpbmcgbGlmZWN5Y2xlKSB7CisgICAgICAgIHRoaXMubGlmZWN5Y2xlID0gbGlmZWN5Y2xlOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQSBzdHJpbmcgcHJvcGVydHkuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBzdHJpbmdQcm9wZXJ0eSA9ICJEZWZhdWx0IFN0cmluZyBQcm9wZXJ0eSBWYWx1ZSI7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZ1Byb3BlcnR5KCkgeworICAgICAgICByZXR1cm4gKHRoaXMuc3RyaW5nUHJvcGVydHkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFN0cmluZ1Byb3BlcnR5KFN0cmluZyBzdHJpbmdQcm9wZXJ0eSkgeworICAgICAgICB0aGlzLnN0cmluZ1Byb3BlcnR5ID0gc3RyaW5nUHJvcGVydHk7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgYmVhbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIlNoYXJlZFNlc3Npb25CZWFuW2xpZmVjeWNsZT0iKTsKKyAgICAgICAgc2IuYXBwZW5kKHRoaXMubGlmZWN5Y2xlKTsKKyAgICAgICAgc2IuYXBwZW5kKCIsZGF0ZVByb3BlcnR5PSIpOworICAgICAgICBzYi5hcHBlbmQoZGF0ZVByb3BlcnR5KTsKKyAgICAgICAgc2IuYXBwZW5kKCIsc3RyaW5nUHJvcGVydHk9Iik7CisgICAgICAgIHNiLmFwcGVuZCh0aGlzLnN0cmluZ1Byb3BlcnR5KTsKKyAgICAgICAgc2IuYXBwZW5kKCJdIik7CisgICAgICAgIHJldHVybiAoc2IudG9TdHJpbmcoKSk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSHR0cFNlc3Npb25BY3RpdmF0aW9uTGlzdGVuZXIgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZWNlaXZlIG5vdGlmaWNhdGlvbiB0aGF0IHRoaXMgc2Vzc2lvbiB3YXMgYWN0aXZhdGVkLgorICAgICAqCisgICAgICogQHBhcmFtIGV2ZW50IFRoZSBzZXNzaW9uIGV2ZW50IHRoYXQgaGFzIG9jY3VycmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2Vzc2lvbkRpZEFjdGl2YXRlKEh0dHBTZXNzaW9uRXZlbnQgZXZlbnQpIHsKKworICAgICAgICBsaWZlY3ljbGUgKz0gIi9zZGEiOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZWNlaXZlIG5vdGlmaWNhdGlvbiB0aGF0IHRoaXMgc2Vzc2lvbiB3aWxsIGJlIHBhc3NpdmF0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnQgVGhlIHNlc3Npb24gZXZlbnQgdGhhdCBoYXMgb2NjdXJyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXNzaW9uV2lsbFBhc3NpdmF0ZShIdHRwU2Vzc2lvbkV2ZW50IGV2ZW50KSB7CisKKyAgICAgICAgbGlmZWN5Y2xlICs9ICIvc3dwIjsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBIdHRwU2Vzc2lvbkJpbmRpbmdMaXN0ZW5lciBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJlY2VpdmUgbm90aWZpY2F0aW9uIHRoYXQgdGhpcyBhdHRyaWJ1dGUgaGFzIGJlZW4gYm91bmQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnQgVGhlIHNlc3Npb24gZXZlbnQgdGhhdCBoYXMgb2NjdXJyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB2YWx1ZUJvdW5kKEh0dHBTZXNzaW9uQmluZGluZ0V2ZW50IGV2ZW50KSB7CisKKyAgICAgICAgbGlmZWN5Y2xlICs9ICIvdmIiOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZWNlaXZlIG5vdGlmaWNhdGlvbiB0aGF0IHRoaXMgYXR0cmlidXRlIGhhcyBiZWVuIHVuYm91bmQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnQgVGhlIHNlc3Npb24gZXZlbnQgdGhhdCBoYXMgb2NjdXJyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB2YWx1ZVVuYm91bmQoSHR0cFNlc3Npb25CaW5kaW5nRXZlbnQgZXZlbnQpIHsKKworICAgICAgICBsaWZlY3ljbGUgKz0gIi92dSI7CisKKyAgICB9CisKKworfQorCmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvdW5wc2hhcmVkL1VucFNoYXJlZFNlc3Npb25CZWFuLmphdmEgYi9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvdW5wc2hhcmVkL1VucFNoYXJlZFNlc3Npb25CZWFuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2QwM2RjNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvc3JjL3Rlc3Rlci9vcmcvYXBhY2hlL3Rlc3Rlci91bnBzaGFyZWQvVW5wU2hhcmVkU2Vzc2lvbkJlYW4uamF2YQpAQCAtMCwwICsxLDE2NSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LCAyMDAwICwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRlc3Rlci51bnBzaGFyZWQ7CisKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEuc3FsLkRhdGU7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uQWN0aXZhdGlvbkxpc3RlbmVyOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbkJpbmRpbmdFdmVudDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb25CaW5kaW5nTGlzdGVuZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uRXZlbnQ7CisKKworLyoqCisgKiBTaW1wbGUgSmF2YUJlYW4gdG8gdXNlIGZvciBzZXNzaW9uIGF0dHJpYnV0ZSB0ZXN0cy4gIEl0IGlzIFNlcmlhbGl6YWJsZQorICogc28gdGhhdCBpbnN0YW5jZXMgY2FuIGJlIHNhdmVkIGFuZCByZXN0b3JlZCBhY3Jvc3Mgc2VydmVyIHJlc3RhcnRzLgorICogPHA+CisgKiBUaGlzIGlzIGZ1bmN0aW9uYWxseSBlcXVpdmFsZW50IHRvIDxjb2RlPlNlc3Npb25CZWFuPC9jb2RlPiwgYnV0IHN0b3JlZAorICogaW4gYSBkaWZmZXJlbnQgcGFja2FnZSBzbyB0aGF0IGl0IGdldHMgZGVwbG95ZWQgdW5wYWNrZWQgdW5kZXIKKyAqIDxjb2RlPiRDQVRBTElOQV9IT01FL2NsYXNzZXM8L2NvZGU+LgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgVW5wU2hhcmVkU2Vzc2lvbkJlYW4gaW1wbGVtZW50cworICAgIEh0dHBTZXNzaW9uQWN0aXZhdGlvbkxpc3RlbmVyLCBIdHRwU2Vzc2lvbkJpbmRpbmdMaXN0ZW5lciwgU2VyaWFsaXphYmxlIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIEEgZGF0ZSBwcm9wZXJ0eSBmb3IgdXNlIHdpdGggcHJvcGVydHkgZWRpdG9yIHRlc3RzLgorICAgICAqLworICAgIHByb3RlY3RlZCBEYXRlIGRhdGVQcm9wZXJ0eSA9CisgICAgICAgIG5ldyBEYXRlKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKKworICAgIHB1YmxpYyBEYXRlIGdldERhdGVQcm9wZXJ0eSgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLmRhdGVQcm9wZXJ0eSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RGF0ZVByb3BlcnR5KERhdGUgZGF0ZVByb3BlcnR5KSB7CisgICAgICAgIHRoaXMuZGF0ZVByb3BlcnR5ID0gZGF0ZVByb3BlcnR5OworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIGxpZmVjeWNsZSBldmVudHMgdGhhdCBoYXZlIGhhcHBlbmVkIG9uIHRoaXMgYmVhbiBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGxpZmVjeWNsZSA9ICIiOworCisgICAgcHVibGljIFN0cmluZyBnZXRMaWZlY3ljbGUoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5saWZlY3ljbGUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldExpZmVjeWNsZShTdHJpbmcgbGlmZWN5Y2xlKSB7CisgICAgICAgIHRoaXMubGlmZWN5Y2xlID0gbGlmZWN5Y2xlOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQSBzdHJpbmcgcHJvcGVydHkuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBzdHJpbmdQcm9wZXJ0eSA9ICJEZWZhdWx0IFN0cmluZyBQcm9wZXJ0eSBWYWx1ZSI7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZ1Byb3BlcnR5KCkgeworICAgICAgICByZXR1cm4gKHRoaXMuc3RyaW5nUHJvcGVydHkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFN0cmluZ1Byb3BlcnR5KFN0cmluZyBzdHJpbmdQcm9wZXJ0eSkgeworICAgICAgICB0aGlzLnN0cmluZ1Byb3BlcnR5ID0gc3RyaW5nUHJvcGVydHk7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgYmVhbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIlNoYXJlZFNlc3Npb25CZWFuW2xpZmVjeWNsZT0iKTsKKyAgICAgICAgc2IuYXBwZW5kKHRoaXMubGlmZWN5Y2xlKTsKKyAgICAgICAgc2IuYXBwZW5kKCIsZGF0ZVByb3BlcnR5PSIpOworICAgICAgICBzYi5hcHBlbmQoZGF0ZVByb3BlcnR5KTsKKyAgICAgICAgc2IuYXBwZW5kKCIsc3RyaW5nUHJvcGVydHk9Iik7CisgICAgICAgIHNiLmFwcGVuZCh0aGlzLnN0cmluZ1Byb3BlcnR5KTsKKyAgICAgICAgc2IuYXBwZW5kKCJdIik7CisgICAgICAgIHJldHVybiAoc2IudG9TdHJpbmcoKSk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSHR0cFNlc3Npb25BY3RpdmF0aW9uTGlzdGVuZXIgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZWNlaXZlIG5vdGlmaWNhdGlvbiB0aGF0IHRoaXMgc2Vzc2lvbiB3YXMgYWN0aXZhdGVkLgorICAgICAqCisgICAgICogQHBhcmFtIGV2ZW50IFRoZSBzZXNzaW9uIGV2ZW50IHRoYXQgaGFzIG9jY3VycmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2Vzc2lvbkRpZEFjdGl2YXRlKEh0dHBTZXNzaW9uRXZlbnQgZXZlbnQpIHsKKworICAgICAgICBsaWZlY3ljbGUgKz0gIi9zZGEiOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZWNlaXZlIG5vdGlmaWNhdGlvbiB0aGF0IHRoaXMgc2Vzc2lvbiB3aWxsIGJlIHBhc3NpdmF0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnQgVGhlIHNlc3Npb24gZXZlbnQgdGhhdCBoYXMgb2NjdXJyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXNzaW9uV2lsbFBhc3NpdmF0ZShIdHRwU2Vzc2lvbkV2ZW50IGV2ZW50KSB7CisKKyAgICAgICAgbGlmZWN5Y2xlICs9ICIvc3dwIjsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBIdHRwU2Vzc2lvbkJpbmRpbmdMaXN0ZW5lciBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJlY2VpdmUgbm90aWZpY2F0aW9uIHRoYXQgdGhpcyBhdHRyaWJ1dGUgaGFzIGJlZW4gYm91bmQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnQgVGhlIHNlc3Npb24gZXZlbnQgdGhhdCBoYXMgb2NjdXJyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB2YWx1ZUJvdW5kKEh0dHBTZXNzaW9uQmluZGluZ0V2ZW50IGV2ZW50KSB7CisKKyAgICAgICAgbGlmZWN5Y2xlICs9ICIvdmIiOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZWNlaXZlIG5vdGlmaWNhdGlvbiB0aGF0IHRoaXMgYXR0cmlidXRlIGhhcyBiZWVuIHVuYm91bmQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnQgVGhlIHNlc3Npb24gZXZlbnQgdGhhdCBoYXMgb2NjdXJyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB2YWx1ZVVuYm91bmQoSHR0cFNlc3Npb25CaW5kaW5nRXZlbnQgZXZlbnQpIHsKKworICAgICAgICBsaWZlY3ljbGUgKz0gIi92dSI7CisKKyAgICB9CisKKworfQorCmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3NyYy90ZXN0ZXIvb3JnL2FwYWNoZS90ZXN0ZXIvdW5zaGFyZWQvVW5zaGFyZWRTZXNzaW9uQmVhbi5qYXZhIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL3Vuc2hhcmVkL1Vuc2hhcmVkU2Vzc2lvbkJlYW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzM4NTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci9zcmMvdGVzdGVyL29yZy9hcGFjaGUvdGVzdGVyL3Vuc2hhcmVkL1Vuc2hhcmVkU2Vzc2lvbkJlYW4uamF2YQpAQCAtMCwwICsxLDYxIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksIDIwMDAgLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGVzdGVyLnVuc2hhcmVkOworCisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb25BY3RpdmF0aW9uTGlzdGVuZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uQmluZGluZ0V2ZW50OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbkJpbmRpbmdMaXN0ZW5lcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb25FdmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRlc3Rlci5TZXNzaW9uQmVhbjsKKworCisvKioKKyAqIFNpbXBsZSBKYXZhQmVhbiB0byB1c2UgZm9yIHNlc3Npb24gYXR0cmlidXRlIHRlc3RzLiAgSXQgaXMgU2VyaWFsaXphYmxlCisgKiBzbyB0aGF0IGluc3RhbmNlcyBjYW4gYmUgc2F2ZWQgYW5kIHJlc3RvcmVkIGFjcm9zcyBzZXJ2ZXIgcmVzdGFydHMuCisgKiA8cD4KKyAqIFRoaXMgYmVhbiBpcyBmdW5jdGlvbmFsbHkgZXF1aXZhbGVudCB0bworICogPGNvZGU+b3JnLmFwYWNoZS50ZXN0ZXIuU2Vzc2lvbkJlYW48L2NvZGU+LCBidXQgd2lsbCBiZSBkZXBsb3llZCB1bmRlcgorICogPGNvZGU+L1dFQi1JTkYvY2xhc3NlczwvY29kZT4gaW5zdGVhZCBvZiBpbnNpZGUKKyAqIDxjb2RlPi9XRUItSU5GL2xpYi90ZXN0ZXIuamFyPC9jb2RlPi4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIFVuc2hhcmVkU2Vzc2lvbkJlYW4gZXh0ZW5kcyBTZXNzaW9uQmVhbiBpbXBsZW1lbnRzCisgICAgSHR0cFNlc3Npb25BY3RpdmF0aW9uTGlzdGVuZXIsIEh0dHBTZXNzaW9uQmluZGluZ0xpc3RlbmVyLCBTZXJpYWxpemFibGUgeworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBiZWFuLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiVW5zaGFyZWRTZXNzaW9uQmVhbltsaWZlY3ljbGU9Iik7CisgICAgICAgIHNiLmFwcGVuZCh0aGlzLmxpZmVjeWNsZSk7CisgICAgICAgIHNiLmFwcGVuZCgiLHN0cmluZ1Byb3BlcnR5PSIpOworICAgICAgICBzYi5hcHBlbmQodGhpcy5zdHJpbmdQcm9wZXJ0eSk7CisgICAgICAgIHNiLmFwcGVuZCgiXSIpOworICAgICAgICByZXR1cm4gKHNiLnRvU3RyaW5nKCkpOworCisgICAgfQorCisKK30KKwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvQXV0aGVudGljYXRpb24wNC5qc3AgYi9jb250YWluZXIvdGVzdGVyL3dlYi9BdXRoZW50aWNhdGlvbjA0LmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTFkZDM5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvQXV0aGVudGljYXRpb24wNC5qc3AKQEAgLTAsMCArMSwyNiBAQAorPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvcGxhaW4iICU+PCUKKyAgU3RyaW5nQnVmZmVyIHJlc3VsdHMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgIFN0cmluZyByZW1vdGVVc2VyID0gcmVxdWVzdC5nZXRSZW1vdGVVc2VyKCk7CisgIGlmIChyZW1vdGVVc2VyID09IG51bGwpIHsKKyAgICByZXN1bHRzLmFwcGVuZCgiIE5vdCBBdXRoZW50aWNhdGVkLyIpOworICB9IGVsc2UgaWYgKCEidG9tY2F0Ii5lcXVhbHMocmVtb3RlVXNlcikpIHsKKyAgICByZXN1bHRzLmFwcGVuZCgiIEF1dGhlbnRpY2F0ZWQgYXMgJyIpOworICAgIHJlc3VsdHMuYXBwZW5kKHJlbW90ZVVzZXIpOworICAgIHJlc3VsdHMuYXBwZW5kKCInLyIpOworICB9CisgIGlmICghcmVxdWVzdC5pc1VzZXJJblJvbGUoInRvbWNhdCIpKSB7CisgICAgcmVzdWx0cy5hcHBlbmQoIiBOb3QgaW4gcm9sZSAndG9tY2F0Jy8iKTsKKyAgfQorICBpZiAoIXJlcXVlc3QuaXNVc2VySW5Sb2xlKCJhbGlhcyIpKSB7CisgICAgcmVzdWx0cy5hcHBlbmQoIiBOb3QgaW4gcm9sZSAnYWxpYXMnLyIpOworICB9CisgIGlmIChyZXF1ZXN0LmlzVXNlckluUm9sZSgidW5rbm93biIpKSB7CisgICAgcmVzdWx0cy5hcHBlbmQoIiBJbiByb2xlICd1bmtub3duJy8iKTsKKyAgfQorICBpZiAocmVzdWx0cy5sZW5ndGgoKSA8IDEpIHsKKyAgICBvdXQucHJpbnRsbigiQXV0aGVudGljYXRpb24wNCBQQVNTRUQiKTsKKyAgfSBlbHNlIHsKKyAgICBvdXQucHJpbnQoIkF1dGhlbnRpY2F0aW9uMDQgRkFJTEVEIC0iKTsKKyAgICBvdXQucHJpbnRsbihyZXN1bHRzLnRvU3RyaW5nKCkpOworICB9CislPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvRW5jb2RpbmcwMS5qc3AgYi9jb250YWluZXIvdGVzdGVyL3dlYi9FbmNvZGluZzAxLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjY5MTZhCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvRW5jb2RpbmcwMS5qc3AKQEAgLTAsMCArMSw1IEBACisKKzwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7Y2hhcnNldD1TSklTIiAlPgorCis8aDI+VGVzdCBDaGFyYWN0ZXI8L2gyPgorPGgyPjwlPSJcdTliNWEiJT4gVW5pY29kZSA9IDliNWE8L2hyPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvRW5jb2RpbmcwMi5qc3AgYi9jb250YWluZXIvdGVzdGVyL3dlYi9FbmNvZGluZzAyLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjJjMzNkCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvRW5jb2RpbmcwMi5qc3AKQEAgLTAsMCArMSw5IEBACis8aHRtbD4KKzxoZWFkPgorPHRpdGxlPkVuY29kaW5nMDIuanNwPC90aXRsZT4KKzwvaGVhZD4KKzxib2R5IGJnY29sb3I9IndoaXRlIj4KK1RoaXMgaXMgbGVnYWwgaW4gdGhlIHNwZWM6PGJyPgorPCU9ICJKb2Ugc2FpZCAlXD4gZm9vIiAlPi4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0VuY29kaW5nMDMuanNwIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvRW5jb2RpbmcwMy5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY0YWMxOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0VuY29kaW5nMDMuanNwCkBAIC0wLDAgKzEsOSBAQAorPGh0bWw+Cis8aGVhZD4KKzx0aXRsZT5FbmNvZGluZzAzLmpzcDwvdGl0bGU+Cis8L2hlYWQ+Cis8Ym9keSBiZ2NvbG9yPSJ3aGl0ZSI+CitUaGlzIGlzIG5vdCByZWNvZ25pemVkIGFzIGEgZGVsaW1pdGVyIGVpdGhlcjo8YnI+Cis8JT0gIkpvZSBzYWlkICVcXD4gYmFyIiAlPi4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0Vycm9yUGFnZTA2Lmh0bWwgYi9jb250YWluZXIvdGVzdGVyL3dlYi9FcnJvclBhZ2UwNi5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxZDYyMzIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9FcnJvclBhZ2UwNi5odG1sCkBAIC0wLDAgKzEgQEAKK0Vycm9yUGFnZTA2IFBBU1NFRCAtIEhUTUwKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0Vycm9yUGFnZTA2LmpzcCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0Vycm9yUGFnZTA2LmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODcxYTg3Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvRXJyb3JQYWdlMDYuanNwCkBAIC0wLDAgKzEsMTA2IEBACis8JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9wbGFpbiIgJT48JQorCisgICAgICAgIC8vIEFjY3VtdWxhdGUgYWxsIHRoZSByZWFzb25zIHRoaXMgcmVxdWVzdCBtaWdodCBmYWlsCisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgT2JqZWN0IHZhbHVlID0gbnVsbDsKKworICAgICAgICB2YWx1ZSA9IHJlcXVlc3QuZ2V0QXR0cmlidXRlKCJqYXZheC5zZXJ2bGV0LmVycm9yLmV4Y2VwdGlvbiIpOworICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIgZXhjZXB0aW9uIGlzIG1pc3NpbmcvIik7CisgICAgICAgIH0gZWxzZSBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIGphdmEubGFuZy5BcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24pKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiBleGNlcHRpb24gY2xhc3MgaXMgIik7CisgICAgICAgICAgICBzYi5hcHBlbmQodmFsdWUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgc2IuYXBwZW5kKCIvIik7CisgICAgICAgIH0KKworICAgICAgICB2YWx1ZSA9IHJlcXVlc3QuZ2V0QXR0cmlidXRlKCJqYXZheC5zZXJ2bGV0LmVycm9yLmV4Y2VwdGlvbl90eXBlIik7CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQorICAgICAgICAgICAgc2IuYXBwZW5kKCIgZXhjZXB0aW9uX3R5cGUgaXMgbWlzc2luZy8iKTsKKyAgICAgICAgZWxzZSBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIENsYXNzKSkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIgZXhjZXB0aW9uX3R5cGUgY2xhc3MgaXMgIik7CisgICAgICAgICAgICBzYi5hcHBlbmQodmFsdWUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgc2IuYXBwZW5kKCIvIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBDbGFzcyBjbGF6eiA9IChDbGFzcykgdmFsdWU7CisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGNsYXp6LmdldE5hbWUoKTsKKyAgICAgICAgICAgIGlmICghImphdmEubGFuZy5BcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24iLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiIGV4Y2VwdGlvbl90eXBlIGlzICIpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChuYW1lKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIi8iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZhbHVlID0gcmVxdWVzdC5nZXRBdHRyaWJ1dGUoImphdmF4LnNlcnZsZXQuZXJyb3IubWVzc2FnZSIpOworICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiIG1lc3NhZ2UgaXMgbWlzc2luZy8iKTsKKyAgICAgICAgZWxzZSBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiIG1lc3NhZ2UgY2xhc3MgaXMgIik7CisgICAgICAgICAgICBzYi5hcHBlbmQodmFsdWUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgc2IuYXBwZW5kKCIvIik7CisgICAgICAgIH0gZWxzZSBpZiAoISJFcnJvclBhZ2UwNSBUaHJldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24iLmVxdWFscyh2YWx1ZSkgJiYKKyAgICAgICAgICAgICAgICAgICAhIkVycm9yUGFnZTA4IFRocmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiIuZXF1YWxzKHZhbHVlKSkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIgbWVzc2FnZSBpcyBub3QgY29ycmVjdCIpOworICAgICAgICB9CisKKyAgICAgICAgdmFsdWUgPSByZXF1ZXN0LmdldEF0dHJpYnV0ZSgiamF2YXguc2VydmxldC5lcnJvci5yZXF1ZXN0X3VyaSIpOworICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiIHJlcXVlc3RfdXJpIGlzIG1pc3NpbmcvIik7CisgICAgICAgIGVsc2UgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiByZXF1ZXN0X3VyaSBjbGFzcyBpcyAiKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCh2YWx1ZS5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICAgICAgICBzYi5hcHBlbmQoIi8iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFN0cmluZyByZXF1ZXN0X3VyaSA9IChTdHJpbmcpIHZhbHVlOworICAgICAgICAgICAgU3RyaW5nIHRlc3QxID0gcmVxdWVzdC5nZXRDb250ZXh0UGF0aCgpICsgIi9FcnJvclBhZ2UwNSI7CisgICAgICAgICAgICBTdHJpbmcgdGVzdDIgPSByZXF1ZXN0LmdldENvbnRleHRQYXRoKCkgKyAiL1dyYXBwZWRFcnJvclBhZ2UwNSI7CisgICAgICAgICAgICBTdHJpbmcgdGVzdDMgPSByZXF1ZXN0LmdldENvbnRleHRQYXRoKCkgKyAiL0Vycm9yUGFnZTA4IjsKKyAgICAgICAgICAgIFN0cmluZyB0ZXN0NCA9IHJlcXVlc3QuZ2V0Q29udGV4dFBhdGgoKSArICIvV3JhcHBlZEVycm9yUGFnZTA4IjsKKyAgICAgICAgICAgIGlmICghcmVxdWVzdF91cmkuZXF1YWxzKHRlc3QxKSAmJiAhcmVxdWVzdF91cmkuZXF1YWxzKHRlc3QyKSAmJgorICAgICAgICAgICAgICAgICFyZXF1ZXN0X3VyaS5lcXVhbHModGVzdDMpICYmICFyZXF1ZXN0X3VyaS5lcXVhbHModGVzdDQpKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgcmVxdWVzdF91cmkgaXMgIik7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKHJlcXVlc3RfdXJpKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIi8iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZhbHVlID0gcmVxdWVzdC5nZXRBdHRyaWJ1dGUoImphdmF4LnNlcnZsZXQuZXJyb3Iuc2VydmxldF9uYW1lIik7CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQorICAgICAgICAgICAgc2IuYXBwZW5kKCIgc2VydmxldF9uYW1lIGlzIG1pc3NpbmcvIik7CisgICAgICAgIGVsc2UgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiBzZXJ2bGV0X25hbWUgY2xhc3MgaXMgIik7CisgICAgICAgICAgICBzYi5hcHBlbmQodmFsdWUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgc2IuYXBwZW5kKCIvIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBTdHJpbmcgc2VydmxldF9uYW1lID0gKFN0cmluZykgdmFsdWU7CisgICAgICAgICAgICBpZiAoISJFcnJvclBhZ2UwNSIuZXF1YWxzKHNlcnZsZXRfbmFtZSkgJiYKKyAgICAgICAgICAgICAgICAhIkVycm9yUGFnZTA4Ii5lcXVhbHMoc2VydmxldF9uYW1lKSkgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiIHNlcnZsZXRfbmFtZSBpcyAiKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoc2VydmxldF9uYW1lKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIi8iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlcG9ydCB1bHRpbWF0ZSBzdWNjZXNzIG9yIGZhaWx1cmUKKyAgICAgICAgaWYgKHNiLmxlbmd0aCgpIDwgMSkKKyAgICAgICAgICAgIG91dC5wcmludGxuKCJFcnJvclBhZ2UwNiBQQVNTRUQgLSBKU1AiKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgb3V0LnByaW50bG4oIkVycm9yUGFnZTA2IEZBSUxFRCAtIiArIHNiLnRvU3RyaW5nKCkpOworCislPgorPCUKKyAgRXhjZXB0aW9uIGUgPSAoRXhjZXB0aW9uKQorICAgcmVxdWVzdC5nZXRBdHRyaWJ1dGUoImphdmF4LnNlcnZsZXQuZXJyb3IuZXhjZXB0aW9uIik7CisgIG91dC5wcmludGxuKCJFWENFUFRJT046ICAiICsgZSk7CisgIENsYXNzIGV0ID0gKENsYXNzKQorICAgcmVxdWVzdC5nZXRBdHRyaWJ1dGUoImphdmF4LnNlcnZsZXQuZXJyb3IuZXhjZXB0aW9uX3R5cGUiKTsKKyAgb3V0LnByaW50bG4oIkVYQ0VQVElPTl9UWVBFOiAgIiArIGV0LmdldE5hbWUoKSk7CisgIFN0cmluZyBtID0gKFN0cmluZykKKyAgIHJlcXVlc3QuZ2V0QXR0cmlidXRlKCJqYXZheC5zZXJ2bGV0LmVycm9yLm1lc3NhZ2UiKTsKKyAgb3V0LnByaW50bG4oIk1FU1NBR0U6ICAiICsgbSk7CisgIFN0cmluZyBydSA9IChTdHJpbmcpCisgICByZXF1ZXN0LmdldEF0dHJpYnV0ZSgiamF2YXguc2VydmxldC5lcnJvci5yZXF1ZXN0X3VyaSIpOworICBvdXQucHJpbnRsbigiUkVRVUVTVF9VUkk6ICAiICsgcnUpOworICBTdHJpbmcgc24gPSAoU3RyaW5nKQorICAgcmVxdWVzdC5nZXRBdHRyaWJ1dGUoImphdmF4LnNlcnZsZXQuZXJyb3Iuc2VydmxldF9uYW1lIik7CisgIG91dC5wcmludGxuKCJTRVJWTEVUX05BTUU6ICAiICsgc24pOworJT4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0Vycm9yUGFnZTA4LmpzcCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0Vycm9yUGFnZTA4LmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWQ0MmI5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvRXJyb3JQYWdlMDguanNwCkBAIC0wLDAgKzEsMTkgQEAKKzwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L3BsYWluIiAlPjwlCisKKyAgICAgICAgLy8gV3JpdGUgYSBGQUlMRUQgbWVzc2FnZSB0aGF0IHNob3VsZCBnZXQgcmVwbGFjZWQgYnkgdGhlIGVycm9yIHRleHQKKyAgICAgICAgb3V0LnByaW50bG4oIkVycm9yUGFnZTA4IEZBSUxFRCAtIE9yaWdpbmFsIHJlc3BvbnNlIHJldHVybmVkIik7CisKKyAgICAgICAgLy8gVGhyb3cgdGhlIHNwZWNpZmllZCBleGNlcHRpb24KKyAgICAgICAgU3RyaW5nIHR5cGUgPSByZXF1ZXN0LmdldFBhcmFtZXRlcigidHlwZSIpOworICAgICAgICBpZiAoIkFyaXRobWV0aWMiLmVxdWFscyh0eXBlKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEFyaXRobWV0aWNFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoIkVycm9yUGFnZTA4IFRocmV3IEFyaXRobWV0aWNFeGNlcHRpb24iKTsKKyAgICAgICAgfSBlbHNlIGlmICgiQXJyYXkiLmVxdWFscyh0eXBlKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICAgICAgICAgICAgICAgICgiRXJyb3JQYWdlMDggVGhyZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIik7CisgICAgICAgIH0gZWxzZSBpZiAoIk51bWJlciIuZXF1YWxzKHR5cGUpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVtYmVyRm9ybWF0RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKCJFcnJvclBhZ2UwOCBUaHJldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24iKTsKKyAgICAgICAgfQorCislPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvRXJyb3JQYWdlMDkuanNwIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvRXJyb3JQYWdlMDkuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1YzhlNTkKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9FcnJvclBhZ2UwOS5qc3AKQEAgLTAsMCArMSwxMyBAQAorPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvcGxhaW4iIGVycm9yUGFnZT0iL0Vycm9yUGFnZTEwLmpzcCIgJT48JQorCisgICAgICAgIC8vIFdyaXRlIGEgRkFJTEVEIG1lc3NhZ2UgdGhhdCBzaG91bGQgZ2V0IHJlcGxhY2VkIGJ5IHRoZSBlcnJvciB0ZXh0CisgICAgICAgIG91dC5wcmludGxuKCJFcnJvclBhZ2UwOSBGQUlMRUQgLSBPcmlnaW5hbCByZXNwb25zZSByZXR1cm5lZCIpOworCisgICAgICAgIC8vIFRocm93IHRoZSBzcGVjaWZpZWQgZXhjZXB0aW9uCisgICAgICAgIGludCBpID0gMTsKKyAgICAgICAgaWYgKGkgPiAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKCJFcnJvclBhZ2UwOSBUaHJldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24iKTsKKyAgICAgICAgfQorCislPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvRXJyb3JQYWdlMTAuanNwIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvRXJyb3JQYWdlMTAuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhNjJiZTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9FcnJvclBhZ2UxMC5qc3AKQEAgLTAsMCArMSwzMSBAQAorPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvcGxhaW4iIGlzRXJyb3JQYWdlPSJ0cnVlIiAlPjwlCisKKyAgICAgICAgLy8gQWNjdW11bGF0ZSBhbGwgdGhlIHJlYXNvbnMgdGhpcyByZXF1ZXN0IG1pZ2h0IGZhaWwKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBPYmplY3QgdmFsdWUgPSBudWxsOworCisgICAgICAgIGlmIChleGNlcHRpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIgZXhjZXB0aW9uIGlzIG1pc3NpbmcvIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIShleGNlcHRpb24gaW5zdGFuY2VvZiBqYXZhLmxhbmcuQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKSkgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiIGV4Y2VwdGlvbiBjbGFzcyBpcyAiKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoZXhjZXB0aW9uLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIi8iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghIkVycm9yUGFnZTA5IFRocmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiIuZXF1YWxzKGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkpKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgZXhjZXB0aW9uIG1lc3NhZ2UgaXMgIik7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiLyIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gUmVwb3J0IHVsdGltYXRlIHN1Y2Nlc3Mgb3IgZmFpbHVyZQorICAgICAgICBpZiAoc2IubGVuZ3RoKCkgPCAxKQorICAgICAgICAgICAgb3V0LnByaW50bG4oIkVycm9yUGFnZTEwIFBBU1NFRCIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBvdXQucHJpbnRsbigiRXJyb3JQYWdlMTAgRkFJTEVEIC0iICsgc2IudG9TdHJpbmcoKSk7CisKKyU+Cis8JQorICBvdXQucHJpbnRsbigiRVhDRVBUSU9OOiAgIiArIGV4Y2VwdGlvbik7CislPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvRmlsdGVyUmVzcG9uc2UwMi5qc3AgYi9jb250YWluZXIvdGVzdGVyL3dlYi9GaWx0ZXJSZXNwb25zZTAyLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDY3ZGJjCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvRmlsdGVyUmVzcG9uc2UwMi5qc3AKQEAgLTAsMCArMSwxMCBAQAorPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvcGxhaW4iICU+RmlsdGVyUmVzcG9uc2UwMiBQQVNTRUQKKzwlCisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IG9yZy5hcGFjaGUudGVzdGVyLlN0YXRpY0xvZ2dlci5yZWFkKCk7CisgICAgICAgICAgICBpZiAobWVzc2FnZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgb3V0LnByaW50bG4obWVzc2FnZSk7CisgICAgICAgIH0KKyAgICAgICAgb3JnLmFwYWNoZS50ZXN0ZXIuU3RhdGljTG9nZ2VyLnJlc2V0KCk7CislPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvRmlsdGVyUmVzcG9uc2UwMy50eHQgYi9jb250YWluZXIvdGVzdGVyL3dlYi9GaWx0ZXJSZXNwb25zZTAzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzVkMjIwCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvRmlsdGVyUmVzcG9uc2UwMy50eHQKQEAgLTAsMCArMSBAQAorRmlsdGVyUmVzcG9uc2UwMyBQQVNTRUQKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0ZvcndhcmQwMGIuanNwIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvRm9yd2FyZDAwYi5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJkMjA1MwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0ZvcndhcmQwMGIuanNwCkBAIC0wLDAgKzEsNiBAQAorPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvcGxhaW4iICU+Rm9yd2FyZDAwYiBQQVNTRUQKK3JlcXVlc3RVUkk9PCU9IHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpICU+Citjb250ZXh0UGF0aD08JT0gcmVxdWVzdC5nZXRDb250ZXh0UGF0aCgpICU+CitzZXJ2bGV0UGF0aD08JT0gcmVxdWVzdC5nZXRTZXJ2bGV0UGF0aCgpICU+CitwYXRoSW5mbz08JT0gcmVxdWVzdC5nZXRQYXRoSW5mbygpICU+CitxdWVyeVN0cmluZz08JT0gcmVxdWVzdC5nZXRRdWVyeVN0cmluZygpICU+CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9Gb3J3YXJkMDBjLmpzcCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0ZvcndhcmQwMGMuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1MzUwOWEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9Gb3J3YXJkMDBjLmpzcApAQCAtMCwwICsxLDYgQEAKKzwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L3BsYWluIiAlPkZvcndhcmQwMGMgUEFTU0VECityZXF1ZXN0VVJJPTwlPSByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKSAlPgorY29udGV4dFBhdGg9PCU9IHJlcXVlc3QuZ2V0Q29udGV4dFBhdGgoKSAlPgorc2VydmxldFBhdGg9PCU9IHJlcXVlc3QuZ2V0U2VydmxldFBhdGgoKSAlPgorcGF0aEluZm89PCU9IHJlcXVlc3QuZ2V0UGF0aEluZm8oKSAlPgorcXVlcnlTdHJpbmc9PCU9IHJlcXVlc3QuZ2V0UXVlcnlTdHJpbmcoKSAlPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvRm9yd2FyZDAwZS5qc3AgYi9jb250YWluZXIvdGVzdGVyL3dlYi9Gb3J3YXJkMDBlLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmJhOGM4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvRm9yd2FyZDAwZS5qc3AKQEAgLTAsMCArMSw2IEBACis8JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9wbGFpbiIgJT5Gb3J3YXJkMDBlIFBBU1NFRAorcmVxdWVzdFVSST08JT0gcmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCkgJT4KK2NvbnRleHRQYXRoPTwlPSByZXF1ZXN0LmdldENvbnRleHRQYXRoKCkgJT4KK3NlcnZsZXRQYXRoPTwlPSByZXF1ZXN0LmdldFNlcnZsZXRQYXRoKCkgJT4KK3BhdGhJbmZvPTwlPSByZXF1ZXN0LmdldFBhdGhJbmZvKCkgJT4KK3F1ZXJ5U3RyaW5nPTwlPSByZXF1ZXN0LmdldFF1ZXJ5U3RyaW5nKCkgJT4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0ZvcndhcmQwMS50eHQgYi9jb250YWluZXIvdGVzdGVyL3dlYi9Gb3J3YXJkMDEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3ZDMyY2MKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9Gb3J3YXJkMDEudHh0CkBAIC0wLDAgKzEgQEAKK0ZvcndhcmQwMSBQQVNTRUQKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0ZvcndhcmQwM2IuanNwIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvRm9yd2FyZDAzYi5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjEyYzkwNQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0ZvcndhcmQwM2IuanNwCkBAIC0wLDAgKzEsMzAgQEAKKzwlCisgIFN0cmluZyBzcGVjaWFsc1tdID0KKyAgICB7ICJqYXZheC5zZXJ2bGV0LmluY2x1ZGUucmVxdWVzdF91cmkiLAorICAgICAgImphdmF4LnNlcnZsZXQuaW5jbHVkZS5jb250ZXh0X3BhdGgiLAorICAgICAgImphdmF4LnNlcnZsZXQuaW5jbHVkZS5zZXJ2bGV0X3BhdGgiLAorICAgICAgImphdmF4LnNlcnZsZXQuaW5jbHVkZS5wYXRoX2luZm8iLAorICAgICAgImphdmF4LnNlcnZsZXQuaW5jbHVkZS5xdWVyeV9zdHJpbmciIH07CisKKyAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICBpZiAocmVxdWVzdC5nZXRBdHRyaWJ1dGUoIkZvcndhcmQwMyIpID09IG51bGwpCisgICAgc2IuYXBwZW5kKCIgQ2Fubm90IHJldHJpZXZlIGZvcndhcmRlZCBhdHRyaWJ1dGUvIik7CisgIHJlcXVlc3Quc2V0QXR0cmlidXRlKCJGb3J3YXJkMDNiIiwgIlRoaXMgaXMgb3VyIHZlcnkgb3duIGF0dHJpYnV0ZSIpOworICBpZiAocmVxdWVzdC5nZXRBdHRyaWJ1dGUoIkZvcndhcmQwM2IiKSA9PSBudWxsKQorICAgIHNiLmFwcGVuZCgiIENhbm5vdCByZXRyaWV2ZSBvdXIgb3duIGF0dHJpYnV0ZS8iKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IHNwZWNpYWxzLmxlbmd0aDsgaSsrKSB7CisgICAgaWYgKHJlcXVlc3QuZ2V0QXR0cmlidXRlKHNwZWNpYWxzW2ldKSAhPSBudWxsKSB7CisgICAgICBzYi5hcHBlbmQoIiBFeHBvc2VkIGF0dHJpYnV0ZSAiKTsKKyAgICAgIHNiLmFwcGVuZChzcGVjaWFsc1tpXSk7CisgICAgICBzYi5hcHBlbmQoIi8iKTsKKyAgICB9CisgIH0KKworICBpZiAoc2IubGVuZ3RoKCkgPCAxKSB7CisgICAgb3V0LnByaW50bG4oIkZvcndhcmQwMyBQQVNTRUQiKTsKKyAgfSBlbHNlIHsKKyAgICBvdXQucHJpbnQoIkZvcndhcmQwMyBGQUlMRUQgLSAiKTsKKyAgICBvdXQucHJpbnRsbihzYi50b1N0cmluZygpKTsKKyAgfQorJT4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0ZvcndhcmQwNC5qc3AgYi9jb250YWluZXIvdGVzdGVyL3dlYi9Gb3J3YXJkMDQuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkYWFmNTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9Gb3J3YXJkMDQuanNwCkBAIC0wLDAgKzEgQEAKKzwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L3BsYWluIiAlPjxqc3A6Zm9yd2FyZCBwYWdlPSIvRm9yd2FyZDA0YS5qc3AiLz5Gb3J3YXJkMDQuanNwIEZBSUxFRCAtIENvbnRlbnQgc2hvdWxkIG5vdCBiZSB2aXNpYmxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9Gb3J3YXJkMDRhLmpzcCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0ZvcndhcmQwNGEuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzNjZhMDUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9Gb3J3YXJkMDRhLmpzcApAQCAtMCwwICsxIEBACis8JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9wbGFpbiIgJT48anNwOmZvcndhcmQgcGFnZT0iL0ZvcndhcmQwNGIuanNwIi8+Rm9yd2FyZDA0YS5qc3AgRkFJTEVEIC0gQ29udGVudCBzaG91bGQgbm90IGJlIHZpc2libGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0ZvcndhcmQwNGIuanNwIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvRm9yd2FyZDA0Yi5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJlYTFiZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0ZvcndhcmQwNGIuanNwCkBAIC0wLDAgKzEgQEAKKzwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L3BsYWluIiAlPkZvcndhcmQwNGIuanNwIFBBU1NFRApkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvRm9yd2FyZDA1LmpzcCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0ZvcndhcmQwNS5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGYzZTE0NQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0ZvcndhcmQwNS5qc3AKQEAgLTAsMCArMSBAQAorPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvcGxhaW4iICU+PGpzcDpmb3J3YXJkIHBhZ2U9Ii9Gb3J3YXJkMDVhIi8+Rm9yd2FyZDA1LmpzcCBGQUlMRUQgLSBDb250ZW50IHNob3VsZCBub3QgYmUgdmlzaWJsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvRm9yd2FyZDA1YS5qc3AgYi9jb250YWluZXIvdGVzdGVyL3dlYi9Gb3J3YXJkMDVhLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmZjYzY2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvRm9yd2FyZDA1YS5qc3AKQEAgLTAsMCArMSBAQAorPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvcGxhaW4iICU+PGpzcDpmb3J3YXJkIHBhZ2U9Ii9Gb3J3YXJkMDViIi8+Rm9yd2FyZDA1YS5qc3AgRkFJTEVEIC0gQ29udGVudCBzaG91bGQgbm90IGJlIHZpc2libGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0ZvcndhcmQwNWIuanNwIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvRm9yd2FyZDA1Yi5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY5OWMyMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0ZvcndhcmQwNWIuanNwCkBAIC0wLDAgKzEgQEAKKzwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L3BsYWluIiAlPkZvcndhcmQwNWIuanNwIFBBU1NFRApkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvRm9yd2FyZDA2LmpzcCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0ZvcndhcmQwNi5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdhZmNjOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0ZvcndhcmQwNi5qc3AKQEAgLTAsMCArMSBAQAorPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvcGxhaW4iICU+PGpzcDpmb3J3YXJkIHBhZ2U9Ii9zZXJ2bGV0L0ZvcndhcmQwNmEiLz5Gb3J3YXJkMDYuanNwIEZBSUxFRCAtIENvbnRlbnQgc2hvdWxkIG5vdCBiZSB2aXNpYmxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9Gb3J3YXJkMDZhLmpzcCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0ZvcndhcmQwNmEuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3MDA4ODUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9Gb3J3YXJkMDZhLmpzcApAQCAtMCwwICsxIEBACis8JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9wbGFpbiIgJT48anNwOmZvcndhcmQgcGFnZT0iL3NlcnZsZXQvRm9yd2FyZDA2YiIvPkZvcndhcmQwNmEuanNwIEZBSUxFRCAtIENvbnRlbnQgc2hvdWxkIG5vdCBiZSB2aXNpYmxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9Gb3J3YXJkMDZiLmpzcCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0ZvcndhcmQwNmIuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MWQ3YjEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9Gb3J3YXJkMDZiLmpzcApAQCAtMCwwICsxIEBACis8JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9wbGFpbiIgJT5Gb3J3YXJkMDZiLmpzcCBQQVNTRUQKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0luY2x1ZGUwMGIuanNwIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvSW5jbHVkZTAwYi5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ1ZTY1NAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0luY2x1ZGUwMGIuanNwCkBAIC0wLDAgKzEsNiBAQAorPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvcGxhaW4iIHNlc3Npb249ImZhbHNlIiAlPkluY2x1ZGUwMGIgUEFTU0VECityZXF1ZXN0VVJJPTwlPSByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKSAlPgorY29udGV4dFBhdGg9PCU9IHJlcXVlc3QuZ2V0Q29udGV4dFBhdGgoKSAlPgorc2VydmxldFBhdGg9PCU9IHJlcXVlc3QuZ2V0U2VydmxldFBhdGgoKSAlPgorcGF0aEluZm89PCU9IHJlcXVlc3QuZ2V0UGF0aEluZm8oKSAlPgorcXVlcnlTdHJpbmc9PCU9IHJlcXVlc3QuZ2V0UXVlcnlTdHJpbmcoKSAlPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvSW5jbHVkZTAwYy5qc3AgYi9jb250YWluZXIvdGVzdGVyL3dlYi9JbmNsdWRlMDBjLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjc2YWM0Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvSW5jbHVkZTAwYy5qc3AKQEAgLTAsMCArMSw2IEBACis8JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9wbGFpbiIgc2Vzc2lvbj0iZmFsc2UiJT5JbmNsdWRlMDBjIFBBU1NFRAorcmVxdWVzdFVSST08JT0gcmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCkgJT4KK2NvbnRleHRQYXRoPTwlPSByZXF1ZXN0LmdldENvbnRleHRQYXRoKCkgJT4KK3NlcnZsZXRQYXRoPTwlPSByZXF1ZXN0LmdldFNlcnZsZXRQYXRoKCkgJT4KK3BhdGhJbmZvPTwlPSByZXF1ZXN0LmdldFBhdGhJbmZvKCkgJT4KK3F1ZXJ5U3RyaW5nPTwlPSByZXF1ZXN0LmdldFF1ZXJ5U3RyaW5nKCkgJT4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0luY2x1ZGUwMGUuanNwIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvSW5jbHVkZTAwZS5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZlNDBjMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0luY2x1ZGUwMGUuanNwCkBAIC0wLDAgKzEsNiBAQAorPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvcGxhaW4iIHNlc3Npb249ImZhbHNlIiAlPkluY2x1ZGUwMGUgUEFTU0VECityZXF1ZXN0VVJJPTwlPSByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKSAlPgorY29udGV4dFBhdGg9PCU9IHJlcXVlc3QuZ2V0Q29udGV4dFBhdGgoKSAlPgorc2VydmxldFBhdGg9PCU9IHJlcXVlc3QuZ2V0U2VydmxldFBhdGgoKSAlPgorcGF0aEluZm89PCU9IHJlcXVlc3QuZ2V0UGF0aEluZm8oKSAlPgorcXVlcnlTdHJpbmc9PCU9IHJlcXVlc3QuZ2V0UXVlcnlTdHJpbmcoKSAlPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvSW5jbHVkZTAxLnR4dCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0luY2x1ZGUwMS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmMzMjdiYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0luY2x1ZGUwMS50eHQKQEAgLTAsMCArMSBAQAorSW5jbHVkZTAxIFBBU1NFRApkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvSW5jbHVkZTAzYi5qc3AgYi9jb250YWluZXIvdGVzdGVyL3dlYi9JbmNsdWRlMDNiLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWFkY2IwCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvSW5jbHVkZTAzYi5qc3AKQEAgLTAsMCArMSBAQAorPCUgcmVxdWVzdC5zZXRBdHRyaWJ1dGUoIkluY2x1ZGUwM2IuanNwIiwgIlRoaXMgaXMgYSBuZXcgYXR0cmlidXRlIik7ICU+CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9JbmNsdWRlMDNjLmpzcCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0luY2x1ZGUwM2MuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlZDMzZDAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9JbmNsdWRlMDNjLmpzcApAQCAtMCwwICsxLDMwIEBACis8JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9wbGFpbiIgJT48JQorICAvLyBEdXBsaWNhdGUgbG9naWMgZnJvbSAiSW5jbHVkZTAzLmphdmEiCisgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgU3RyaW5nIHBhdGggPSByZXF1ZXN0LmdldFBhcmFtZXRlcigicGF0aCIpOworICBpZiAocGF0aCA9PSBudWxsKQorICAgIHBhdGggPSAiL0luY2x1ZGUwM2EiOworICBSZXF1ZXN0RGlzcGF0Y2hlciByZCA9CisgICAgZ2V0U2VydmxldENvbnRleHQoKS5nZXRSZXF1ZXN0RGlzcGF0Y2hlcihwYXRoKTsKKyAgaWYgKHJkID09IG51bGwpIHsKKyAgICBzYi5hcHBlbmQoIiBObyBSZXF1ZXN0RGlzcGF0Y2hlciByZXR1cm5lZC8iKTsKKyAgfSBlbHNlIHsKKyAgICByZC5pbmNsdWRlKHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgfQorICByZXNwb25zZS5yZXNldEJ1ZmZlcigpOworICBTdHJpbmcgdmFsdWUgPSBudWxsOworICB0cnkgeworICAgIHZhbHVlID0gKFN0cmluZykgcmVxdWVzdC5nZXRBdHRyaWJ1dGUocGF0aC5zdWJzdHJpbmcoMSkpOworICB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgeworICAgICAgc2IuYXBwZW5kKCIgUmV0dXJuZWQgYXR0cmlidXRlIG5vdCBvZiB0eXBlIFN0cmluZy8iKTsKKyAgfQorICBpZiAoKHNiLmxlbmd0aCgpIDwgMSkgJiYgKHZhbHVlID09IG51bGwpKSB7CisgICAgICBzYi5hcHBlbmQoIiBObyBpbmNsdWRlZS1jcmVhdGVkIGF0dHJpYnV0ZSB3YXMgcmV0dXJuZWQvIik7CisgIH0KKyAgaWYgKHNiLmxlbmd0aCgpIDwgMSkKKyAgICBvdXQucHJpbnRsbigiSW5jbHVkZTAzYy5qc3AgUEFTU0VEIik7CisgIGVsc2UgeworICAgIG91dC5wcmludCgiSW5jbHVkZTAzYy5qc3AgRkFJTEVEIC0iKTsKKyAgICBvdXQucHJpbnRsbihzYi50b1N0cmluZygpKTsKKyAgfQorJT4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0luY2x1ZGUwNS5qc3AgYi9jb250YWluZXIvdGVzdGVyL3dlYi9JbmNsdWRlMDUuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjOTMwNzAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9JbmNsdWRlMDUuanNwCkBAIC0wLDAgKzEgQEAKKzwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L3BsYWluIiAlPjxqc3A6aW5jbHVkZSBwYWdlPSIvSW5jbHVkZTA1YS5qc3AiIGZsdXNoPSJmYWxzZSIvPjxqc3A6Zm9yd2FyZCBwYWdlPSIvSW5jbHVkZTA1Yi5qc3AiLz4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0luY2x1ZGUwNWEuanNwIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvSW5jbHVkZTA1YS5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI4M2NhZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0luY2x1ZGUwNWEuanNwCkBAIC0wLDAgKzEgQEAKK0luY2x1ZGUwNWEgUEFTU0VECmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9JbmNsdWRlMDViLmpzcCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0luY2x1ZGUwNWIuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3ZGYxZWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9JbmNsdWRlMDViLmpzcApAQCAtMCwwICsxIEBACitJbmNsdWRlMDViIFBBU1NFRApkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvSW5jbHVkZTA2LmpzcCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0luY2x1ZGUwNi5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBmNmY4YwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0luY2x1ZGUwNi5qc3AKQEAgLTAsMCArMSwzIEBACis8JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9wbGFpbiIgJT49PT09PT09PT09Cis8anNwOmluY2x1ZGUgcGFnZT0ic2VydmxldC9vcmcuYXBhY2hlLnRlc3Rlci5JbmNsdWRlMDZhIiBmbHVzaD0iZmFsc2UiLz49PT09PT09PT09Cis8anNwOmluY2x1ZGUgcGFnZT0iL0luY2x1ZGUwNmIuanNwIi8+PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvSW5jbHVkZTA2Yi5qc3AgYi9jb250YWluZXIvdGVzdGVyL3dlYi9JbmNsdWRlMDZiLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDdkYmY5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvSW5jbHVkZTA2Yi5qc3AKQEAgLTAsMCArMSBAQAorSW5jbHVkZTA2Yi5qc3Agb3V0cHV0CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9Kc3BCZWFuczAxLmpzcCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0pzcEJlYW5zMDEuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllM2RlMDMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9Kc3BCZWFuczAxLmpzcApAQCAtMCwwICsxLDQgQEAKKzwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L3BsYWluIiAlPjxqc3A6dXNlQmVhbiBpZD0iYmVhbiIgY2xhc3M9Im9yZy5hcGFjaGUudGVzdGVyLlNlc3Npb25CZWFuIi8+SnNwQmVhbnMwMSBQQVNTRUQKK2xpZmVjeWNsZSA9IDwlPSBiZWFuLmdldExpZmVjeWNsZSgpICU+CitzdHJpbmdQcm9wZXJ0eT0gPCU9IGJlYW4uZ2V0U3RyaW5nUHJvcGVydHkoKSAlPgordG9TdHJpbmcgPSA8JT0gYmVhbi50b1N0cmluZygpICU+CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9Kc3BCZWFuczAyLmpzcCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0pzcEJlYW5zMDIuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlMmMzODAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9Kc3BCZWFuczAyLmpzcApAQCAtMCwwICsxLDQgQEAKKzwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L3BsYWluIiAlPjxqc3A6dXNlQmVhbiBpZD0iYmVhbiIgY2xhc3M9Im9yZy5hcGFjaGUudGVzdGVyLnNoYXJlZC5TaGFyZWRTZXNzaW9uQmVhbiIvPkpzcEJlYW5zMDIgUEFTU0VECitsaWZlY3ljbGUgPSA8JT0gYmVhbi5nZXRMaWZlY3ljbGUoKSAlPgorc3RyaW5nUHJvcGVydHk9IDwlPSBiZWFuLmdldFN0cmluZ1Byb3BlcnR5KCkgJT4KK3RvU3RyaW5nID0gPCU9IGJlYW4udG9TdHJpbmcoKSAlPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvSnNwQmVhbnMwMy5qc3AgYi9jb250YWluZXIvdGVzdGVyL3dlYi9Kc3BCZWFuczAzLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDM3ZDZkCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvSnNwQmVhbnMwMy5qc3AKQEAgLTAsMCArMSw0IEBACis8JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9wbGFpbiIgJT48anNwOnVzZUJlYW4gaWQ9ImJlYW4iIGNsYXNzPSJvcmcuYXBhY2hlLnRlc3Rlci51bnNoYXJlZC5VbnNoYXJlZFNlc3Npb25CZWFuIi8+SnNwQmVhbnMwMyBQQVNTRUQKK2xpZmVjeWNsZSA9IDwlPSBiZWFuLmdldExpZmVjeWNsZSgpICU+CitzdHJpbmdQcm9wZXJ0eT0gPCU9IGJlYW4uZ2V0U3RyaW5nUHJvcGVydHkoKSAlPgordG9TdHJpbmcgPSA8JT0gYmVhbi50b1N0cmluZygpICU+CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9Kc3BEb2MwMS5qc3AgYi9jb250YWluZXIvdGVzdGVyL3dlYi9Kc3BEb2MwMS5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQwNWU5ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0pzcERvYzAxLmpzcApAQCAtMCwwICsxLDkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPGpzcDpyb290IHhtbG5zOmpzcD0iaHR0cDovL2phdmEuc3VuLmNvbS9KU1AvUGFnZSIgdmVyc2lvbj0iMS4yIj4KKyAgPGE+dGV4dDxiPjwvYj48L2E+CisgIDxqc3A6dGV4dD4mbHQ7YSZndDt0ZXh0Jmx0O2ImZ3Q7Jmx0Oy9iJmd0OyZsdDsvYSZndDs8L2pzcDp0ZXh0PgorICA8Yz48ZD50ZXh0PC9kPjwvYz4KKyAgPGpzcDp0ZXh0PiZsdDtjJmd0OyZsdDtkJmd0O3RleHQmbHQ7L2QmZ3Q7Jmx0Oy9jJmd0OzwvanNwOnRleHQ+CisgIDxlPjxmPjwvZj50ZXh0PGY+PC9mPjwvZT4KKyAgPGpzcDp0ZXh0PiZsdDtlJmd0OyZsdDtmJmd0OyZsdDsvZiZndDt0ZXh0Jmx0O2YmZ3Q7Jmx0Oy9mJmd0OyZsdDsvZSZndDs8L2pzcDp0ZXh0PgorPC9qc3A6cm9vdD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0pzcERvYzAyLmpzcCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0pzcERvYzAyLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjMzYzI1Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvSnNwRG9jMDIuanNwCkBAIC0wLDAgKzEsNTMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPGpzcDpyb290IHhtbG5zOmpzcD0iaHR0cDovL2phdmEuc3VuLmNvbS9KU1AvUGFnZSIKKyAgdmVyc2lvbj0iMS4yIj4KKzxqc3A6ZGlyZWN0aXZlLnBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbCIvPgorPGpzcDpkaXJlY3RpdmUucGFnZSBpbXBvcnQ9ImphdmEudXRpbC5EYXRlLCBqYXZhLnV0aWwuTG9jYWxlIi8+Cis8anNwOmRpcmVjdGl2ZS5wYWdlIGltcG9ydD0iamF2YS50ZXh0LioiLz4KKworPGpzcDpkZWNsYXJhdGlvbj4KKyAgU3RyaW5nIGdldERhdGEoKSB7CisgICAgcmV0dXJuICJmb28iOworICB9Cis8L2pzcDpkZWNsYXJhdGlvbj4KKworPGh0bWw+Cis8aGVhZD4KKyAgPHRpdGxlPkV4YW1wbGUgSlNQIGluIFhNTCBmb3JtYXQ8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keT4KK1RoaXMgaXMgdGhlIG91dHB1dCBvZiBhIHNpbXBsZSBKU1AgdXNpbmcgWE1MIGZvcm1hdC4gCis8YnIgLz4KKworPGRpdj5Vc2UgYSBqc3A6c2NyaXB0bGV0IHRvIGxvb3AgZnJvbSAxIHRvIDEwOiA8L2Rpdj4KKzxqc3A6c2NyaXB0bGV0PgorLy8gTm90ZSB3ZSBuZWVkIHRvIGRlY2xhcmUgQ0RBVEEgYmVjYXVzZSB3ZSBkb24ndCBlc2NhcGUgdGhlIGxlc3MgdGhhbiBzeW1ib2wKKzwhW0NEQVRBWworICBmb3IgKGludCBpID0gMTsgaTw9MTA7IGkrKykgeworICAgIG91dC5wcmludChpKTsKKyAgICBpZiAoaSA8IDEwKSB7CisgICAgICBvdXQucHJpbnQoIiwgIik7CisgICAgfQorICB9CitdXT4KKzwvanNwOnNjcmlwdGxldD4KKworPCEtLSBCZWNhdXNlIEkgb21pdCBicidzIGVuZCB0YWcsIGRlY2xhcmUgaXQgYXMgQ0RBVEEgLS0+Cis8IVtDREFUQVsKKyAgPGJyPjxicj4KK11dPgorCis8ZGl2IGFsaWduPSJsZWZ0Ij4KKyAgVXNlIGEganNwOmV4cHJlc3Npb24gdG8gd3JpdGUgc29tZXRoaW5nOiAKKyAgPGpzcDpleHByZXNzaW9uPmdldERhdGEoKTwvanNwOmV4cHJlc3Npb24+Cis8L2Rpdj4KKworCis8anNwOnRleHQ+CisgICZsdDtwJmd0O1RoaXMgc2VudGVuY2UgaXMgZW5jbG9zZWQgaW4gYSBqc3A6dGV4dCBlbGVtZW50LiZsdDsvcCZndDsKKzwvanNwOnRleHQ+CisKKzwvYm9keT4KKzwvaHRtbD4KKzwvanNwOnJvb3Q+CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9Kc3BGb3J3YXJkMDEuanNwIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvSnNwRm9yd2FyZDAxLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2UyNjE1Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvSnNwRm9yd2FyZDAxLmpzcApAQCAtMCwwICsxLDIgQEAKKzwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L3BsYWluIiAlPjxqc3A6Zm9yd2FyZCBwYWdlPSI8JT0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoXCJwYXRoXCIpICU+Ii8+CitKc3BGb3J3YXJkMDEgRkFJTEVEIC0gQ29udGVudCBmcm9tIGZvcndhcmRlZC10byBwYWdlIG5vdCBpbmNsdWRlZApkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvSnNwRm9yd2FyZDAxYS5qc3AgYi9jb250YWluZXIvdGVzdGVyL3dlYi9Kc3BGb3J3YXJkMDFhLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDJjMTMyCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvSnNwRm9yd2FyZDAxYS5qc3AKQEAgLTAsMCArMSBAQAorPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvcGxhaW4iICU+SnNwRm9yd2FyZDAxYSBQQVNTRUQKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0pzcEluY2x1ZGUwMS5qc3AgYi9jb250YWluZXIvdGVzdGVyL3dlYi9Kc3BJbmNsdWRlMDEuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmZDdiM2IKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9Kc3BJbmNsdWRlMDEuanNwCkBAIC0wLDAgKzEsNCBAQAorPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvcGxhaW4iICU+VGhpcyBpcyBiZWZvcmUgdGhlIGluY2x1ZGUKKzxqc3A6aW5jbHVkZSBwYWdlPSI8JT0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoXCJwYXRoXCIpICU+IiBmbHVzaD0idHJ1ZSIvPgorVGhpcyBpcyBhZnRlciB0aGUgaW5jbHVkZQorCmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9Kc3BJbmNsdWRlMDFhLmpzcCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0pzcEluY2x1ZGUwMWEuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmNGRkY2MKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9Kc3BJbmNsdWRlMDFhLmpzcApAQCAtMCwwICsxIEBACis8JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9wbGFpbiIgJT5UaGlzIGlzIHRoZSBpbmNsdWRlCmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9Kc3BJbmNsdWRlMDIuanNwIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvSnNwSW5jbHVkZTAyLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2UzNzkwCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvSnNwSW5jbHVkZTAyLmpzcApAQCAtMCwwICsxLDQgQEAKKzwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L3BsYWluIiAlPlRoaXMgaXMgYmVmb3JlIHRoZSBpbmNsdWRlCis8anNwOmluY2x1ZGUgcGFnZT0iPCU9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKFwicGF0aFwiKSAlPiIgZmx1c2g9ImZhbHNlIi8+CitUaGlzIGlzIGFmdGVyIHRoZSBpbmNsdWRlCisKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0pzcEluY2x1ZGUwMmEuanNwIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvSnNwSW5jbHVkZTAyYS5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY0ZGRjYwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0pzcEluY2x1ZGUwMmEuanNwCkBAIC0wLDAgKzEgQEAKKzwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L3BsYWluIiAlPlRoaXMgaXMgdGhlIGluY2x1ZGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0pzcFBhcmFtczAxLmpzcCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0pzcFBhcmFtczAxLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzM3NzVjCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvSnNwUGFyYW1zMDEuanNwCkBAIC0wLDAgKzEsNSBAQAorPGpzcDppbmNsdWRlIHBhZ2U9IkpzcFBhcmFtczAxYS5qc3AiIGZsdXNoPSJ0cnVlIj4KKyAgPGpzcDpwYXJhbXM+CisgICAgPGpzcDpwYXJhbSBuYW1lPSJmb28iIHZhbHVlPSJiYXIiLz4KKyAgPC9qc3A6cGFyYW1zPgorPC9qc3A6aW5jbHVkZT4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0pzcFBhcmFtczAyLmpzcCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL0pzcFBhcmFtczAyLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmE4NmNjCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvSnNwUGFyYW1zMDIuanNwCkBAIC0wLDAgKzEsNSBAQAorPGpzcDpmb3J3YXJkIHBhZ2U9IkpzcFBhcmFtczAxYS5qc3AiPgorICA8anNwOnBhcmFtcz4KKyAgICA8anNwOnBhcmFtIG5hbWU9ImZvbyIgdmFsdWU9ImJhciIvPgorICA8L2pzcDpwYXJhbXM+Cis8L2pzcDpmb3J3YXJkPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvUHJvcGVydHkwMS5qc3AgYi9jb250YWluZXIvdGVzdGVyL3dlYi9Qcm9wZXJ0eTAxLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjFjODMyCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvUHJvcGVydHkwMS5qc3AKQEAgLTAsMCArMSwxMiBAQAorPGh0bWw+Cis8aGVhZD4KKzx0aXRsZT5Qcm9wZXJ0eTAxLmpzcCAtIFBvc2l0aXZlIFByb3BlcnR5RWRpdG9yIFRlc3Q8L3RpdGxlPgorPC9oZWFkPgorPGJvZHkgYmdjb2xvcj0id2hpdGUiPgorPGpzcDp1c2VCZWFuIGlkPSJiZWFuIiBzY29wZT0icmVxdWVzdCIKKyAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS50ZXN0ZXIuU2Vzc2lvbkJlYW4iLz4KKzxqc3A6c2V0UHJvcGVydHkgbmFtZT0iYmVhbiIgcHJvcGVydHk9ImRhdGVQcm9wZXJ0eSIKKyAgICAgICAgICAgICAgICB2YWx1ZT0iMDcvMjUvMjAwMSIvPgorRGF0ZSBwcm9wZXJ0eSBpcyAnPGpzcDpnZXRQcm9wZXJ0eSBuYW1lPSJiZWFuIiBwcm9wZXJ0eT0iZGF0ZVByb3BlcnR5Ii8+Jy4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1Byb3BlcnR5MDIuanNwIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvUHJvcGVydHkwMi5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM2YzllNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1Byb3BlcnR5MDIuanNwCkBAIC0wLDAgKzEsMTIgQEAKKzxodG1sPgorPGhlYWQ+Cis8dGl0bGU+UHJvcGVydHkwMi5qc3AgLSBOZWdhdGl2ZSBQcm9wZXJ0eUVkaXRvciBUZXN0PC90aXRsZT4KKzwvaGVhZD4KKzxib2R5IGJnY29sb3I9IndoaXRlIj4KKzxqc3A6dXNlQmVhbiBpZD0iYmVhbiIgc2NvcGU9InJlcXVlc3QiCisgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUudGVzdGVyLlNlc3Npb25CZWFuIi8+Cis8anNwOnNldFByb3BlcnR5IG5hbWU9ImJlYW4iIHByb3BlcnR5PSJkYXRlUHJvcGVydHkiCisgICAgICAgICAgICAgICAgdmFsdWU9IjA3LzI1LzIwMEEiLz4KK0RhdGUgcHJvcGVydHkgaXMgJzxqc3A6Z2V0UHJvcGVydHkgbmFtZT0iYmVhbiIgcHJvcGVydHk9ImRhdGVQcm9wZXJ0eSIvPicuCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9SZWRpcmVjdDAyLmpzcCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1JlZGlyZWN0MDIuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzNDc3MTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9SZWRpcmVjdDAyLmpzcApAQCAtMCwwICsxIEBACis8JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9wbGFpbiIgJT48JSBTdHJpbmcgZHVtbXkgPSBudWxsOyBpZiAoZHVtbXkgPT0gbnVsbCkgeyByZXNwb25zZS5zZW5kUmVkaXJlY3QocmVxdWVzdC5nZXRDb250ZXh0UGF0aCgpICsgIi9SZWRpcmVjdDAyYS5qc3AiKTsgcmV0dXJuOyB9ICU+UmVkaXJlY3QwMi5qc3AgRkFJTEVEIC0gQ29udGVudCBzaG91bGQgbm90IGJlIHZpc2libGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1JlZGlyZWN0MDJhLmpzcCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1JlZGlyZWN0MDJhLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGE4YWMzCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvUmVkaXJlY3QwMmEuanNwCkBAIC0wLDAgKzEgQEAKKzwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L3BsYWluIiAlPlJlZGlyZWN0MDJhLmpzcCBQQVNTRUQKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1JlZGlyZWN0MDMuanNwIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvUmVkaXJlY3QwMy5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJlZjE0YgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1JlZGlyZWN0MDMuanNwCkBAIC0wLDAgKzEgQEAKKzwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L3BsYWluIiAlPjwlIFN0cmluZyBkdW1teSA9IG51bGw7IGlmIChkdW1teSA9PSBudWxsKSB7IHJlc3BvbnNlLnNlbmRSZWRpcmVjdChyZXF1ZXN0LmdldENvbnRleHRQYXRoKCkgKyAiL1JlZGlyZWN0MDNhLmpzcCIpOyAgfSAlPlJlZGlyZWN0MDMuanNwIEZBSUxFRCAtIENvbnRlbnQgc2hvdWxkIG5vdCBiZSB2aXNpYmxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9SZWRpcmVjdDAzYS5qc3AgYi9jb250YWluZXIvdGVzdGVyL3dlYi9SZWRpcmVjdDAzYS5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFlMDMwYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1JlZGlyZWN0MDNhLmpzcApAQCAtMCwwICsxIEBACis8JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9wbGFpbiIgJT5SZWRpcmVjdDAzYS5qc3AgUEFTU0VECmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9SZXNwb25zZVdyYXAwMWIuanNwIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvUmVzcG9uc2VXcmFwMDFiLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTU0YzliCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvUmVzcG9uc2VXcmFwMDFiLmpzcApAQCAtMCwwICsxIEBACis8JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9wbGFpbiIlPlJlc3BvbnNlV3JhcDAxYiBQQVNTRUQKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1Jlc3BvbnNlV3JhcDAxZC5qc3AgYi9jb250YWluZXIvdGVzdGVyL3dlYi9SZXNwb25zZVdyYXAwMWQuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5NWU3YmUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9SZXNwb25zZVdyYXAwMWQuanNwCkBAIC0wLDAgKzEgQEAKKzwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L3BsYWluIiU+UmVzcG9uc2VXcmFwMDFkIFBBU1NFRApkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvU1NJQ29uZGl0aW9uYWwwMS5zaHRtbCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1NTSUNvbmRpdGlvbmFsMDEuc2h0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI1NWM0YQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1NTSUNvbmRpdGlvbmFsMDEuc2h0bWwKQEAgLTAsMCArMSwxMCBAQAorQmVmb3JlIGlmIGJsb2NrLgorPCEtLSNzZXQgdmFyPSJ0ZXN0IiB2YWx1ZT0idmFsdWUxIiAtLT4KKzwhLS0jaWYgZXhwcj0iXCIkdGVzdFwiID0gXCJ2YWx1ZTFcIiIgLS0+Cit0ZXN0ID0gdmFsdWUxCis8IS0tI2VsaWYgZXhwcj0iXCIkdGVzdFwiID0gXCJ2YWx1ZTJcIiIgLS0+Cit0ZXN0ID0gdmFsdWUyCis8IS0tI2Vsc2UgLS0+Cit0ZXN0ID0gbmVpdGhlciB2YWx1ZTEgb3IgdmFsdWUyCis8IS0tI2VuZGlmIC0tPgorQWZ0ZXIgaWYgYmxvY2suCmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9TU0lDb25kaXRpb25hbDAyLnNodG1sIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvU1NJQ29uZGl0aW9uYWwwMi5zaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGM3ZjI0Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvU1NJQ29uZGl0aW9uYWwwMi5zaHRtbApAQCAtMCwwICsxLDEwIEBACitCZWZvcmUgaWYgYmxvY2suCis8IS0tI3NldCB2YXI9InRlc3QiIHZhbHVlPSJ2YWx1ZTIiIC0tPgorPCEtLSNpZiBleHByPSJcIiR0ZXN0XCIgPSBcInZhbHVlMVwiIiAtLT4KK3Rlc3QgPSB2YWx1ZTEKKzwhLS0jZWxpZiBleHByPSJcIiR0ZXN0XCIgPSBcInZhbHVlMlwiIiAtLT4KK3Rlc3QgPSB2YWx1ZTIKKzwhLS0jZWxzZSAtLT4KK3Rlc3QgPSBuZWl0aGVyIHZhbHVlMSBvciB2YWx1ZTIKKzwhLS0jZW5kaWYgLS0+CitBZnRlciBpZiBibG9jay4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1NTSUNvbmRpdGlvbmFsMDMuc2h0bWwgYi9jb250YWluZXIvdGVzdGVyL3dlYi9TU0lDb25kaXRpb25hbDAzLnNodG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4OGQ3YjIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9TU0lDb25kaXRpb25hbDAzLnNodG1sCkBAIC0wLDAgKzEsOCBAQAorQmVmb3JlIGlmIGJsb2NrLgorPCEtLSNzZXQgdmFyPSJ0ZXN0IiB2YWx1ZT0idW5xdW90ZWQgbXVsdGktd29yZCB2YWx1ZSIgLS0+Cis8IS0tI2lmIGV4cHI9IlwiJHRlc3RcIiA9IHVucXVvdGVkIG11bHRpLXdvcmQgdmFsdWUiIC0tPgordGVzdCA9ICJ1bnF1b3RlZCBtdWx0aS13b3JkIHZhbHVlIgorPCEtLSNlbHNlIC0tPgordGVzdCA9IG5vdCAidW5xdW90ZWQgbXVsdGktd29yZCB2YWx1ZSIKKzwhLS0jZW5kaWYgLS0+CitBZnRlciBpZiBibG9jay4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1NTSUNvbmRpdGlvbmFsMDQuc2h0bWwgYi9jb250YWluZXIvdGVzdGVyL3dlYi9TU0lDb25kaXRpb25hbDA0LnNodG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1ZDUwZjcKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9TU0lDb25kaXRpb25hbDA0LnNodG1sCkBAIC0wLDAgKzEsOCBAQAorPCEtLSNzZXQgdmFyPSJ0ZXN0MSIgdmFsdWU9Im5vdCBvbmUiIC0tPgorPCEtLSNzZXQgdmFyPSJ0ZXN0MiIgdmFsdWU9InR3byIgLS0+Cis8IS0tI3NldCB2YXI9InRlc3QzIiB2YWx1ZT0idGhyZWUiIC0tPgorPCEtLSNpZiBleHByPSJcIiR0ZXN0MVwiID0gXCJvbmVcIiAmJiBcIiR0ZXN0MlwiID0gXCJ0d29cIiB8fCBcIiR0ZXN0M1wiID0gXCJ0aHJlZVwiIiAtLT4KK3RydWUKKzwhLS0jZWxzZSAtLT4KK2ZhbHNlCis8IS0tI2VuZGlmIC0tPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvU1NJQ29uZGl0aW9uYWwwNS5zaHRtbCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1NTSUNvbmRpdGlvbmFsMDUuc2h0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFlMTBlOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1NTSUNvbmRpdGlvbmFsMDUuc2h0bWwKQEAgLTAsMCArMSw4IEBACis8IS0tI3NldCB2YXI9InRlc3QxIiB2YWx1ZT0ibm90IG9uZSIgLS0+Cis8IS0tI3NldCB2YXI9InRlc3QyIiB2YWx1ZT0idHdvIiAtLT4KKzwhLS0jc2V0IHZhcj0idGVzdDMiIHZhbHVlPSJ0aHJlZSIgLS0+Cis8IS0tI2lmIGV4cHI9IlwiJHRlc3QxXCIgPSBcIm9uZVwiICYmIChcIiR0ZXN0MlwiID0gXCJ0d29cIiB8fCBcIiR0ZXN0M1wiID0gXCJ0aHJlZVwiKSIgLS0+Cit0cnVlCis8IS0tI2Vsc2UgLS0+CitmYWxzZQorPCEtLSNlbmRpZiAtLT4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1NTSUNvbmRpdGlvbmFsMDYuc2h0bWwgYi9jb250YWluZXIvdGVzdGVyL3dlYi9TU0lDb25kaXRpb25hbDA2LnNodG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0Y2YxZDQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9TU0lDb25kaXRpb25hbDA2LnNodG1sCkBAIC0wLDAgKzEsMTYgQEAKKzwhLS0jc2V0IHZhcj0idGVzdDEiIHZhbHVlPSJub3Qgb25lIiAtLT4KKzwhLS0jc2V0IHZhcj0idGVzdDIiIHZhbHVlPSJ0d28iIC0tPgorPCEtLSNzZXQgdmFyPSJ0ZXN0MyIgdmFsdWU9InRocmVlIiAtLT4KKzwhLS0jaWYgZXhwcj0iXCIkdGVzdDFcIiA9IFwib25lXCIgfHwgXCIkdGVzdDJcIiA9IFwidHdvXCIiIC0tPgorPCEtLSNpZiBleHByPSJcIiR0ZXN0MVwiID0gXCJvbmVcIiIgLS0+CitvbmUKKzwhLS0jZWxpZiBleHByPSJcIiR0ZXN0MVwiID0gXCJub3Qgb25lXCIiIC0tPgorbm90IG9uZQorPCEtLSNlbmRpZiAtLT4KKzwhLS0jZWxzZSAtLT4KKzwhLS0jaWYgZXhwcj0iXCIkdGVzdDJcIiA9IFwidHdvXCIiIC0tPgordHdvCis8IS0tI2VsaWYgZXhwcj0iXCIkdGVzdDJcIiA9IFwibm90IHR3b1wiIiAtLT4KK25vdCB0d28KKzwhLS0jZW5kaWYgLS0+Cis8IS0tI2VuZGlmIC0tPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvU1NJQ29uZGl0aW9uYWwwNy5zaHRtbCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1NTSUNvbmRpdGlvbmFsMDcuc2h0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM0NTBhMgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1NTSUNvbmRpdGlvbmFsMDcuc2h0bWwKQEAgLTAsMCArMSwxNiBAQAorPCEtLSNzZXQgdmFyPSJ0ZXN0MSIgdmFsdWU9Im5vdCBvbmUiIC0tPgorPCEtLSNzZXQgdmFyPSJ0ZXN0MiIgdmFsdWU9Im5vdCB0d28iIC0tPgorPCEtLSNzZXQgdmFyPSJ0ZXN0MyIgdmFsdWU9InRocmVlIiAtLT4KKzwhLS0jaWYgZXhwcj0iXCIkdGVzdDFcIiA9IFwib25lXCIgfHwgXCIkdGVzdDJcIiA9IFwidHdvXCIiIC0tPgorPCEtLSNpZiBleHByPSJcIiR0ZXN0MVwiID0gXCJvbmVcIiIgLS0+CitvbmUKKzwhLS0jZWxpZiBleHByPSJcIiR0ZXN0MVwiID0gXCJub3Qgb25lXCIiIC0tPgorbm90IG9uZQorPCEtLSNlbmRpZiAtLT4KKzwhLS0jZWxzZSAtLT4KKzwhLS0jaWYgZXhwcj0iXCIkdGVzdDJcIiA9IFwidHdvXCIiIC0tPgordHdvCis8IS0tI2VsaWYgZXhwcj0iXCIkdGVzdDJcIiA9IFwibm90IHR3b1wiIiAtLT4KK25vdCB0d28KKzwhLS0jZW5kaWYgLS0+Cis8IS0tI2VuZGlmIC0tPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvU1NJQ29uZGl0aW9uYWwwOC5zaHRtbCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1NTSUNvbmRpdGlvbmFsMDguc2h0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RlNjQ1ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1NTSUNvbmRpdGlvbmFsMDguc2h0bWwKQEAgLTAsMCArMSw3IEBACis8IS0tI3NldCB2YXI9InRlc3QiIHZhbHVlPSJvbmUiIC0tPgorPCEtLSNpZiBleHByPSJcIiR0ZXN0XCIgPSBcIm9uZVwiIiAtLT4KKzwhLS0jc2V0IHZhcj0idGVzdCIgdmFsdWU9InR3byIgLS0+Cis8IS0tI2Vsc2UgLS0+Cis8IS0tI3NldCB2YXI9InRlc3QiIHZhbHVlPSJ0aHJlZSIgLS0+Cis8IS0tI2VuZGlmIC0tPgorPCEtLSNlY2hvIHZhcj0idGVzdCIgLS0+CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9TU0lDb25maWcwMS5zaHRtbCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1NTSUNvbmZpZzAxLnNodG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmNmQ5YmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9TU0lDb25maWcwMS5zaHRtbApAQCAtMCwwICsxLDIgQEAKKzwhLS0jY29uZmlnIGVycm1zZz0iZXJybXNnOlNvcnJ5IHRoaXMgY29tbWFuZCB3b24ndCB3b3JrLiIgLS0+Cis8IS0tI2ZzaXplIGZpbGU9ImZvby5zaHRtbCIgLS0+CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9TU0lDb25maWcwMy5zaHRtbCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1NTSUNvbmZpZzAzLnNodG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0MjVjZDkKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9TU0lDb25maWcwMy5zaHRtbApAQCAtMCwwICsxLDQgQEAKKzwhLS0jY29uZmlnIHNpemVmbXQ9ImJ5dGVzIiAtLT4KKzwhLS0jZnNpemUgZmlsZT0iaW5jbHVkZW1lLnR4dCIgLS0+Cis8IS0tI2NvbmZpZyBzaXplZm10PSJhYmJyZXYiIC0tPgorPCEtLSNmc2l6ZSBmaWxlPSJpbmNsdWRlbWUudHh0IiAtLT4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1NTSUV4ZWNDR0kuc2h0bWwgYi9jb250YWluZXIvdGVzdGVyL3dlYi9TU0lFeGVjQ0dJLnNodG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwNjA0ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9TU0lFeGVjQ0dJLnNodG1sCkBAIC0wLDAgKzEsMzggQEAKKzxodG1sPiAKKyAgPGhlYWQ+IAorIDx0aXRsZT5leGVjIGNvbW1hbmQgIHRlc3QgZXhhbXBsZXMgPC90aXRsZT4gCisgPC9oZWFkPiAKKyA8Ym9keT4KKworIDwhLS0jZXhlYyBjZ2k9Ii9jZ2ktYmluL2FycmF5LnBsIiAtLT48YnI+CisKKyA8IS0tI2V4ZWMgY2dpPSIvY2dpLWJpbi9iaW5hcnkucGw/Y291bnRlcj0xMDIiIC0tPjxicj4KKworIDwhLS0jZXhlYyBjZ2k9Ii9jZ2ktYmluL2Nob3Jlcy5wbCIgLS0+PGJyPgorCisgPCEtLSNleGVjIGNnaT0iL2NnaS1iaW4vY29uY2F0LnBsP2ZpcnN0X25hbWU9amFuZSZsYXN0X25hbWU9am9obnNvbiZmaWFuY2VfZmlyc3Q9am9obiZmaWFuY2VfbGFzdD1zbWl0aCIgLS0+PGJyPgorCisgPCEtLSNleGVjIGNnaT0iL2NnaS1iaW4vZGF5cy5wbCIgLS0+PGJyPgorCisgPCEtLSNleGVjIGNnaT0iL2NnaS1iaW4vZG93aGlsZS5wbD9zdGFydD0xMCIgLS0+PGJyPgorCisgPCEtLSNleGVjIGNnaT0iL2NnaS1iaW4vZWxzZS5wbD9mb29kPXNwaW5hY2giIC0tPjxicj4KKworIDwhLS0jZXhlYyBjZ2k9Ii9jZ2ktYmluL2Vsc2lmLnBsP2Zvb2Q9Y2hvY29sYXRlIiAtLT48YnI+CisKKyA8IS0tI2V4ZWMgY2dpPSIvY2dpLWJpbi9leHBvbmVudHMucGw/bnVtYmVyPTImcG93ZXI9NCIgLS0+PGJyPgorCisgPCEtLSNleGVjIGNnaT0iL2NnaS1iaW4vZm9yLnBsP3N0YXJ0PTEwIiAtLT48YnI+CisKKyA8IS0tI2V4ZWMgY2dpPSIvY2dpLWJpbi9nZXRkYXkucGwiIC0tPjxicj4KKworIDwhLS0jZXhlYyBjZ2k9Ii9jZ2ktYmluL2hlbGxvcGVybC5jZ2kiIC0tPjxicj4KKworIDwhLS0jZXhlYyBjZ2k9Ii9jZ2ktYmluL2lmLnBsP2Zvb2Q9c3BpbmFjaCIgLS0+PGJyPgorCisgPCEtLSNleGVjIGNnaT0iL2NnaS1iaW4vaW5jcmVtZW50LnBsP2NvdW50ZXI9NyIgLS0+PGJyPgorCisgPCEtLSNleGVjIGNnaT0iL2NnaS1iaW4vbW9kaWZ5YWxsLnBsP251bWJlcj0yODkiIC0tPjxicj4KKworIDwvYm9keT4gCisgPC9odG1sPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvU1NJRXhlY0NtZC5zaHRtbCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1NTSUV4ZWNDbWQuc2h0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIzZTA3NAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1NTSUV4ZWNDbWQuc2h0bWwKQEAgLTAsMCArMSwyMyBAQAorPGh0bWw+CisgIDxoZWFkPgorIDx0aXRsZT5leGVjIGNvbW1hbmQgIHRlc3QgZXhhbXBsZXMgPC90aXRsZT4KKyA8L2hlYWQ+CisgPGJvZHk+CisgCisgPGgzPmhlbGxvLmV4ZQorICAgICAgPCEtLSNleGVjIGNtZD0iaGVsbG8uZXhlIiAtLT4gPC9oMz4KKyAgICAgICB1c2luZyAmbHQ7IS0tI2V4ZWMgY21kPSJoZWxsby5leGUiIC0tJmd0OyA8YnI+CisgICAgICAgCisgPGgzPiBUaGUgVU5JWCBkYXRlIG9mIHRoZSBzZXJ2ZXIgOjoKKyAgICAgIDwhLS0jZXhlYyBjbWQ9ImRhdGUiIC0tPiA8L2gzPgorICAgICAgdXNpbmcgJmx0OyEtLSNleGVjIGNtZD0iZGF0ZSIgLS0mZ3Q7IDxicj4KKworIDxocj4KKworIDxoMz5UaGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSA6OgorICAgICAgPCEtLSNleGVjIGNtZD0icHdkIiAtLT4gPC9oMz4KKyAgICAgICB1c2luZyAmbHQ7IS0tI2V4ZWMgY21kPSJwd2QiIC0tJmd0OyA8YnI+CisKKworIDwvYm9keT4KKyA8L2h0bWw+CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9TU0lGc2l6ZTAxLnNodG1sIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvU1NJRnNpemUwMS5zaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjk3NTk3Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvU1NJRnNpemUwMS5zaHRtbApAQCAtMCwwICsxIEBACis8IS0tI2ZzaXplIC0tPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvU1NJRnNpemUwMi5zaHRtbCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1NTSUZzaXplMDIuc2h0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJjZGU4YwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1NTSUZzaXplMDIuc2h0bWwKQEAgLTAsMCArMSBAQAorPCEtLSNmc2l6ZSBmaWxlPSJpbmNsdWRlbWUudHh0IiAtLT4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1NTSUZzaXplMDMuc2h0bWwgYi9jb250YWluZXIvdGVzdGVyL3dlYi9TU0lGc2l6ZTAzLnNodG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmMzczYmUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9TU0lGc2l6ZTAzLnNodG1sCkBAIC0wLDAgKzEgQEAKKzwhLS0jZnNpemUgZmlsZT0iLi9pbmNsdWRlbWUudHh0IiAtLT4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1NTSUZzaXplMDQuc2h0bWwgYi9jb250YWluZXIvdGVzdGVyL3dlYi9TU0lGc2l6ZTA0LnNodG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NzkxZWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9TU0lGc2l6ZTA0LnNodG1sCkBAIC0wLDAgKzEgQEAKKzwhLS0jZnNpemUgdmlydHVhbD0iaW5jbHVkZW1lLnR4dCIgLS0+CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9TU0lGc2l6ZTA1LnNodG1sIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvU1NJRnNpemUwNS5zaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDlmY2ZhCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvU1NJRnNpemUwNS5zaHRtbApAQCAtMCwwICsxIEBACis8IS0tI2ZzaXplIHZpcnR1YWw9Ii90ZXN0ZXIvaW5jbHVkZW1lLnR4dCIgLS0+CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9TU0lGc2l6ZTA2LnNodG1sIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvU1NJRnNpemUwNi5zaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2ViMzRlCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvU1NJRnNpemUwNi5zaHRtbApAQCAtMCwwICsxIEBACis8IS0tI2ZzaXplIHZpcnR1YWw9InNzaWRpci9pbmNsdWRlbWUudHh0IiAtLT4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1NTSUZzaXplMDcuc2h0bWwgYi9jb250YWluZXIvdGVzdGVyL3dlYi9TU0lGc2l6ZTA3LnNodG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmYzg3NjcKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9TU0lGc2l6ZTA3LnNodG1sCkBAIC0wLDAgKzEgQEAKKzwhLS0jZnNpemUgdmlydHVhbD0iLi9zc2lkaXIvaW5jbHVkZW1lLnR4dCIgLS0+CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9TU0lGc2l6ZTA4LnNodG1sIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvU1NJRnNpemUwOC5zaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTFmYWMyCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvU1NJRnNpemUwOC5zaHRtbApAQCAtMCwwICsxLDIgQEAKKzwhLS0jZnNpemUgZmlsZT0iaW5jbHVkZW1lLnR4dCIKKyAgLS0+CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9TU0lJbmNsdWRlMDEuc2h0bWwgYi9jb250YWluZXIvdGVzdGVyL3dlYi9TU0lJbmNsdWRlMDEuc2h0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M4YjQxNgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1NTSUluY2x1ZGUwMS5zaHRtbApAQCAtMCwwICsxIEBACis8IS0tI2luY2x1ZGUgLS0+CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9TU0lJbmNsdWRlMDIuc2h0bWwgYi9jb250YWluZXIvdGVzdGVyL3dlYi9TU0lJbmNsdWRlMDIuc2h0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZhMzI3MAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1NTSUluY2x1ZGUwMi5zaHRtbApAQCAtMCwwICsxIEBACis8IS0tI2luY2x1ZGUgZmlsZT0iaW5jbHVkZW1lLnR4dCIgLS0+CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9TU0lJbmNsdWRlMDMuc2h0bWwgYi9jb250YWluZXIvdGVzdGVyL3dlYi9TU0lJbmNsdWRlMDMuc2h0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhkNGU5NAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1NTSUluY2x1ZGUwMy5zaHRtbApAQCAtMCwwICsxIEBACis8IS0tI2luY2x1ZGUgZmlsZT0iLi9pbmNsdWRlbWUudHh0IiAtLT4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1NTSUluY2x1ZGUwNC5zaHRtbCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1NTSUluY2x1ZGUwNC5zaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzcxMGEwCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvU1NJSW5jbHVkZTA0LnNodG1sCkBAIC0wLDAgKzEgQEAKKzwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJpbmNsdWRlbWUudHh0IiAtLT4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1NTSUluY2x1ZGUwNS5zaHRtbCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1NTSUluY2x1ZGUwNS5zaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmIxOThhCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvU1NJSW5jbHVkZTA1LnNodG1sCkBAIC0wLDAgKzEgQEAKKzwhLS0jaW5jbHVkZSB2aXJ0dWFsPSIvdGVzdGVyL2luY2x1ZGVtZS50eHQiIC0tPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvU1NJSW5jbHVkZTA2LnNodG1sIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvU1NJSW5jbHVkZTA2LnNodG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiMGIwZDAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9TU0lJbmNsdWRlMDYuc2h0bWwKQEAgLTAsMCArMSBAQAorPCEtLSNpbmNsdWRlIHZpcnR1YWw9InNzaWRpci9pbmNsdWRlbWUudHh0IiAtLT4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1NTSUluY2x1ZGUwNy5zaHRtbCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1NTSUluY2x1ZGUwNy5zaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTk4YTBmCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvU1NJSW5jbHVkZTA3LnNodG1sCkBAIC0wLDAgKzEgQEAKKzwhLS0jaW5jbHVkZSB2aXJ0dWFsPSIuL3NzaWRpci9pbmNsdWRlbWUudHh0IiAtLT4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1NTSUluY2x1ZGUwOC5zaHRtbCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1NTSUluY2x1ZGUwOC5zaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDIzYzZmCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvU1NJSW5jbHVkZTA4LnNodG1sCkBAIC0wLDAgKzEsMiBAQAorPCEtLSNpbmNsdWRlIGZpbGU9ImluY2x1ZGVtZS50eHQiCisgIC0tPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvU1NJSW5jbHVkZTA5LnNodG1sIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvU1NJSW5jbHVkZTA5LnNodG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlYTUxYmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9TU0lJbmNsdWRlMDkuc2h0bWwKQEAgLTAsMCArMSw2IEBACis8IS0tI2luY2x1ZGUgZmlsZT0iaW5jbHVkZW1lLnR4dCIKKyAgLS0+Cis8IS0tI2luY2x1ZGUgZmlsZT0iU1NJSW5jbHVkZTA4LnNodG1sIgorICAtLT4KKzwhLS0jaW5jbHVkZSBmaWxlPSJpbmNsdWRlbWUudHh0IgorICAtLT4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1NTSVZhclN1YjAxLnNodG1sIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvU1NJVmFyU3ViMDEuc2h0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU4MmU2YgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1NTSVZhclN1YjAxLnNodG1sCkBAIC0wLDAgKzEsMyBAQAorPCEtLSNzZXQgdmFyPSJ0ZXN0IiB2YWx1ZT0iJERPQ1VNRU5UX1VSSSIgLS0+Cis8IS0tI2VjaG8gdmFyPSJ0ZXN0IiAtLT4KKwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvU1NJVmFyU3ViMDIuc2h0bWwgYi9jb250YWluZXIvdGVzdGVyL3dlYi9TU0lWYXJTdWIwMi5zaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmY4MWE0Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvU1NJVmFyU3ViMDIuc2h0bWwKQEAgLTAsMCArMSw0IEBACis8IS0tI3NldCB2YXI9InRlc3QiIHZhbHVlPSJ2YWx1ZSBvZiB0ZXN0IiAtLT4KKzwhLS0jc2V0IHZhcj0idGVzdDIiIHZhbHVlPSIke3Rlc3R9IiAtLT4KKzwhLS0jZWNobyB2YXI9InRlc3QyIiAtLT4KKwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvU1NJVmFyU3ViMDMuc2h0bWwgYi9jb250YWluZXIvdGVzdGVyL3dlYi9TU0lWYXJTdWIwMy5zaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzZhNzcyCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvU1NJVmFyU3ViMDMuc2h0bWwKQEAgLTAsMCArMSw1IEBACis8IS0tI3NldCB2YXI9InRlc3QiIHZhbHVlPSJ2YWx1ZSBvZiB0ZXN0IiAtLT4KKzwhLS0jc2V0IHZhcj0idGVzdDIiIHZhbHVlPSJ2YWx1ZSBvZiB0ZXN0MiIgLS0+Cis8IS0tI3NldCB2YXI9InRlc3QzIiB2YWx1ZT0iJHRlc3QgJHRlc3QyIiAtLT4KKzwhLS0jZWNobyB2YXI9InRlc3QzIiAtLT4KKwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvU1NJVmFyU3ViMDQuc2h0bWwgYi9jb250YWluZXIvdGVzdGVyL3dlYi9TU0lWYXJTdWIwNC5zaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTZkOTkxCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvU1NJVmFyU3ViMDQuc2h0bWwKQEAgLTAsMCArMSw1IEBACis8IS0tI3NldCB2YXI9InRlc3QiIHZhbHVlPSJ2YWx1ZSBvZiB0ZXN0IiAtLT4KKzwhLS0jc2V0IHZhcj0idGVzdDIiIHZhbHVlPSJ2YWx1ZSBvZiB0ZXN0MiIgLS0+Cis8IS0tI3NldCB2YXI9InRlc3QzIiB2YWx1ZT0iJHt0ZXN0fSAke3Rlc3QyfSIgLS0+Cis8IS0tI2VjaG8gdmFyPSJ0ZXN0MyIgLS0+CisKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1NTSVZhclN1YjA1LnNodG1sIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvU1NJVmFyU3ViMDUuc2h0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTAxNjM4MQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1NTSVZhclN1YjA1LnNodG1sCkBAIC0wLDAgKzEsNSBAQAorPCEtLSNzZXQgdmFyPSJ0ZXN0IiB2YWx1ZT0idmFsdWUgb2YgdGVzdCIgLS0+Cis8IS0tI3NldCB2YXI9InRlc3QyIiB2YWx1ZT0idmFsdWUgb2YgdGVzdDIiIC0tPgorPCEtLSNzZXQgdmFyPSJ0ZXN0MyIgdmFsdWU9IiR7dGVzdH18JHt0ZXN0Mn0iIC0tPgorPCEtLSNlY2hvIHZhcj0idGVzdDMiIC0tPgorCmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9TU0lWYXJTdWIwNi5zaHRtbCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1NTSVZhclN1YjA2LnNodG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzMDhiYzcKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9TU0lWYXJTdWIwNi5zaHRtbApAQCAtMCwwICsxLDMgQEAKKzwhLS0jc2V0IHZhcj0idGVzdCIgdmFsdWU9InZhbHVlIG9mIHRlc3QiIC0tPgorPCEtLSNzZXQgdmFyPSJ0ZXN0MyIgdmFsdWU9IiR7dGVzdH1cJHt0ZXN0Mn0iIC0tPgorPCEtLSNlY2hvIHZhcj0idGVzdDMiIC0tPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvU2Vzc2lvbjA3YS5qc3AgYi9jb250YWluZXIvdGVzdGVyL3dlYi9TZXNzaW9uMDdhLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDE0MTY1Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvU2Vzc2lvbjA3YS5qc3AKQEAgLTAsMCArMSw1IEBACis8JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9wbGFpbiIgJT48anNwOnVzZUJlYW4gaWQ9InNpbXBsZUJlYW4iCisgICAgc2NvcGU9InNlc3Npb24iIGNsYXNzPSJvcmcuYXBhY2hlLnRlc3Rlci5TZXNzaW9uQmVhbiIvPjwlCisgIHNpbXBsZUJlYW4uc2V0U3RyaW5nUHJvcGVydHkoIkZyb20gU2Vzc2lvbjA3YSIpOworICByZXNwb25zZS5zZW5kUmVkaXJlY3QoIlNlc3Npb24wN2IuanNwIik7CislPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvU2Vzc2lvbjA3Yi5qc3AgYi9jb250YWluZXIvdGVzdGVyL3dlYi9TZXNzaW9uMDdiLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTNkYWE5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvU2Vzc2lvbjA3Yi5qc3AKQEAgLTAsMCArMSw5IEBACis8JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9wbGFpbiIgJT48anNwOnVzZUJlYW4gaWQ9InNpbXBsZUJlYW4iCisgICAgc2NvcGU9InNlc3Npb24iIGNsYXNzPSJvcmcuYXBhY2hlLnRlc3Rlci5TZXNzaW9uQmVhbiIvPjwlCisgIGlmICgiRnJvbSBTZXNzaW9uMDdhIi5lcXVhbHMoc2ltcGxlQmVhbi5nZXRTdHJpbmdQcm9wZXJ0eSgpKSkgeworICAgIG91dC5wcmludGxuKCJTZXNzaW9uMDcgUEFTU0VEIik7CisgIH0gZWxzZSB7CisgICAgb3V0LnByaW50bG4oIlNlc3Npb24wNyBGQUlMRUQgLSBQcm9wZXJ0eSA9ICciICsKKyAgICAgICAgICAgICAgICBzaW1wbGVCZWFuLmdldFN0cmluZ1Byb3BlcnR5KCkgKyAiJyIpOworICB9CislPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvV0VCLUlORi9jZ2kvYXJyYXkucGwgYi9jb250YWluZXIvdGVzdGVyL3dlYi9XRUItSU5GL2NnaS9hcnJheS5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjE0MzVkCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvV0VCLUlORi9jZ2kvYXJyYXkucGwKQEAgLTAsMCArMSwxNiBAQAorIyEvdXNyL2Jpbi9wZXJsCisKK3ByaW50ICJDb250ZW50LXR5cGU6IHRleHQvaHRtbFxuXG4iOworCitAZGF5cyA9ICgiTW9uZGF5IiwgCisgICAgICAgICAiVHVlc2RheSIsIAorICAgICAgICAgIldlZG5lc2RheSIsIAorICAgICAgICAgIlRodXJzZGF5IiwgCisgICAgICAgICAiRnJpZGF5IiwgCisgICAgICAgICAiU2F0dXJkYXkiLCAKKyAgICAgICAgICJTdW5kYXkiKTsKKworcHJpbnQgIlRoZXNlIGFyZSB0aGUgZGF5cyBvZiB0aGUgd2VlazoiOworCitwcmludCAiPHA+IjsKK3ByaW50ICJAZGF5cyI7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvV0VCLUlORi9jZ2kvYmluYXJ5LnBsIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvV0VCLUlORi9jZ2kvYmluYXJ5LnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlZjBkNzQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9XRUItSU5GL2NnaS9iaW5hcnkucGwKQEAgLTAsMCArMSwxNCBAQAorIyEvdXNyL2Jpbi9wZXJsCisKK3JlcXVpcmUgInN1YnBhcnNlZm9ybS5saWIiOworJlBhcnNlX0Zvcm07CisKKyRjb3VudGVyID0gJGZvcm1kYXRheydjb3VudGVyJ307CisKKyRjb3VudGVyICs9MTsKKworcHJpbnQgIkNvbnRlbnQtdHlwZTogdGV4dC9odG1sXG5cbiI7CitwcmludCAiPEZPTlQgU0laRT0rMj5JZiB5b3UgYWRkIG9uZSB0byB5b3VyIG51bWJlciwgdGhlIHJlc3VsdCBpcyA8Qj4kY291bnRlcjwvQj4iOworCiskY291bnRlciArPTU7CitwcmludCAiPFA+SWYgeW91IGFkZCA1IHRvIHRoYXQsIHRoZSByZXN1bHQgaXMgPEI+JGNvdW50ZXI8L0I+PC9GT05UPiI7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvV0VCLUlORi9jZ2kvY29uY2F0LnBsIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvV0VCLUlORi9jZ2kvY29uY2F0LnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlYmFhMTAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9XRUItSU5GL2NnaS9jb25jYXQucGwKQEAgLTAsMCArMSwxMiBAQAorIyEvdXNyL2Jpbi9wZXJsCisKK3JlcXVpcmUgInN1YnBhcnNlZm9ybS5saWIiOworJlBhcnNlX0Zvcm07CisKKyRmaXJzdCA9ICRmb3JtZGF0YXsnZmlyc3RfbmFtZSd9OworJG1hcnJpZWQgPSAkZm9ybWRhdGF7J2ZpYW5jZV9sYXN0J307CisKKyRmdWxsbmFtZSA9ICRmaXJzdCAuICIgIiAuICRtYXJyaWVkOworCitwcmludCAiQ29udGVudC10eXBlOiB0ZXh0L2h0bWxcblxuIjsKK3ByaW50ICJDb25ncmF0dWxhdGlvbnMhIFlvdXIgbWFycmllZCBuYW1lIHdvdWxkIGJlICRmdWxsbmFtZS4iOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1dFQi1JTkYvY2dpL2RheXMucGwgYi9jb250YWluZXIvdGVzdGVyL3dlYi9XRUItSU5GL2NnaS9kYXlzLnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxYjQzNDEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9XRUItSU5GL2NnaS9kYXlzLnBsCkBAIC0wLDAgKzEsOCBAQAorIyEvdXNyL2Jpbi9wZXJsCisKK0BkYXlzID0gKCJNb25kYXkiLCAiVHVlc2RheSIsICJXZWRuZXNkYXkiLCAiVGh1cnNkYXkiLCAiRnJpZGF5IiwgIlNhdHVyZGF5IiwgIlN1bmRheSIpOworCitwcmludCAiQ29udGVudC10eXBlOiB0ZXh0L2h0bWxcblxuIjsKK3ByaW50ICJUaGVzZSBhcmUgdGhlIGRheXMgb2YgdGhlIHdlZWs6IjsKK3ByaW50ICI8UD4iOworcHJpbnQgIkBkYXlzIjsKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1dFQi1JTkYvY2dpL2Rvd2hpbGUucGwgYi9jb250YWluZXIvdGVzdGVyL3dlYi9XRUItSU5GL2NnaS9kb3doaWxlLnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkZWQ5ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9XRUItSU5GL2NnaS9kb3doaWxlLnBsCkBAIC0wLDAgKzEsMTYgQEAKKyMhL3Vzci9iaW4vcGVybAorCityZXF1aXJlICJzdWJwYXJzZWZvcm0ubGliIjsKKyZQYXJzZV9Gb3JtOworCiskc3RhcnQgPSAkZm9ybWRhdGF7J3N0YXJ0J307CisKK3ByaW50ICJDb250ZW50LXR5cGU6IHRleHQvaHRtbFxuXG4iOworcHJpbnQgIjxQPlN0YXJ0aW5nIGNvdW50ZG93bi4uLiI7CisKK2RvIHsKKwlwcmludCAiJHN0YXJ0Li4uICI7CisJLS0kc3RhcnQ7Cit9IHdoaWxlICgkc3RhcnQgPiAwKTsKKworcHJpbnQgIktBQk9PTSEiOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1dFQi1JTkYvY2dpL2Vsc2UucGwgYi9jb250YWluZXIvdGVzdGVyL3dlYi9XRUItSU5GL2NnaS9lbHNlLnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyOTk3NjAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9XRUItSU5GL2NnaS9lbHNlLnBsCkBAIC0wLDAgKzEsMTUgQEAKKyMhL3Vzci9iaW4vcGVybAorCityZXF1aXJlICJzdWJwYXJzZWZvcm0ubGliIjsKKyZQYXJzZV9Gb3JtOworCiskZm9vZCA9ICRmb3JtZGF0YXsnZm9vZCd9OworCitwcmludCAiQ29udGVudC10eXBlOiB0ZXh0L2h0bWxcblxuIjsKKworaWYgKCRmb29kIGVxICJzcGluYWNoIikgeworCQorCXByaW50ICJZb3UgYXRlIHNwaW5hY2gsIHNvIHlvdSBnZXQgZGVzc2VydCEiOworfSBlbHNlIHsKKwlwcmludCAiTm8gc3BpbmFjaCwgbm8gZGVzc2VydCEiOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1dFQi1JTkYvY2dpL2Vsc2lmLnBsIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvV0VCLUlORi9jZ2kvZWxzaWYucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdhMjhlNgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1dFQi1JTkYvY2dpL2Vsc2lmLnBsCkBAIC0wLDAgKzEsMTcgQEAKKyMhL3Vzci9iaW4vcGVybAorCityZXF1aXJlICJzdWJwYXJzZWZvcm0ubGliIjsKKyZQYXJzZV9Gb3JtOworCiskZm9vZCA9ICRmb3JtZGF0YXsnZm9vZCd9OworCitwcmludCAiQ29udGVudC10eXBlOiB0ZXh0L2h0bWxcblxuIjsKKworaWYgKCRmb29kIGVxICJzcGluYWNoIikgeworCQorCXByaW50ICJZb3UgYXRlIHNwaW5hY2gsIHNvIHlvdSBnZXQgZGVzc2VydCEiOworfSBlbHNpZiAoJGZvb2QgZXEgImJyb2Njb2xpIikgeworCXByaW50ICJCcm9jY29saSdzIE9LLiBNYXliZSB5b3UnbGwgZ2V0IGRlc3NlcnQuIjsKK30gZWxzZSB7CisJcHJpbnQgIk5vIHNwaW5hY2gsIG5vIGRlc3NlcnQhIjsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9XRUItSU5GL2NnaS9leHBvbmVudHMucGwgYi9jb250YWluZXIvdGVzdGVyL3dlYi9XRUItSU5GL2NnaS9leHBvbmVudHMucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRkYjExYwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1dFQi1JTkYvY2dpL2V4cG9uZW50cy5wbApAQCAtMCwwICsxLDEzIEBACisjIS91c3IvYmluL3BlcmwKKworcmVxdWlyZSAic3VicGFyc2Vmb3JtLmxpYiI7CismUGFyc2VfRm9ybTsKKworJG51bWJlciA9ICRmb3JtZGF0YXsnbnVtYmVyJ307CiskcG93ZXIgPSAkZm9ybWRhdGF7J3Bvd2VyJ307CisKKyRyZXN1bHQgPSAkbnVtYmVyICoqICRwb3dlcjsKKworcHJpbnQgIkNvbnRlbnQtdHlwZTogdGV4dC9odG1sXG5cbiI7CitwcmludCAiPFA+WW91IGVudGVyZWQgJG51bWJlciB3aXRoIGFuIGV4cG9uZW50IG9mICRwb3dlciI7CitwcmludCAiPFA+JG51bWJlciByYWlzZWQgdG8gdGhlICRwb3dlciBwb3dlciBpcyAkcmVzdWx0LiI7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvV0VCLUlORi9jZ2kvZm9yLnBsIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvV0VCLUlORi9jZ2kvZm9yLnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliZmM5MTgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9XRUItSU5GL2NnaS9mb3IucGwKQEAgLTAsMCArMSwxNSBAQAorIyEvdXNyL2Jpbi9wZXJsCisKK3JlcXVpcmUgInN1YnBhcnNlZm9ybS5saWIiOworJlBhcnNlX0Zvcm07CisKKyRzdGFydCA9ICRmb3JtZGF0YXsnc3RhcnQnfTsKKworcHJpbnQgIkNvbnRlbnQtdHlwZTogdGV4dC9odG1sXG5cbiI7CitwcmludCAiPFA+U3RhcnRpbmcgY291bnRkb3duLi4uIjsKKworZm9yICgkaSA9ICRzdGFydDsgJGkgPiAwOyAtLSRpKSB7CisJcHJpbnQgIiRpLi4uICI7Cit9IAorCitwcmludCAiS0FCT09NISI7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvV0VCLUlORi9jZ2kvZ2V0ZGF5LnBsIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvV0VCLUlORi9jZ2kvZ2V0ZGF5LnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzOTc5ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9XRUItSU5GL2NnaS9nZXRkYXkucGwKQEAgLTAsMCArMSw4IEBACisjIS91c3IvYmluL3BlcmwKKworQGRheXMgPSBxdyhTdW5kYXkgTW9uZGF5IFR1ZXNkYXkgV2VkbmVzZGF5IFRodXJzZGF5IEZyaWRheSBTYXR1cmRheSk7CisKK3ByaW50ICJDb250ZW50LXR5cGU6IHRleHQvaHRtbFxuXG4iOworcHJpbnQgIlRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsgaXMgJGRheXNbMF0iOworCitwcmludCAiPFA+VGhlIHRoaXJkIGRheSBvZiB0aGUgd2VlayBpcyAkZGF5c1syXSI7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvV0VCLUlORi9jZ2kvaGVsbG9wZXJsLnBsIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvV0VCLUlORi9jZ2kvaGVsbG9wZXJsLnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5Y2FhN2IKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9XRUItSU5GL2NnaS9oZWxsb3BlcmwucGwKQEAgLTAsMCArMSw5IEBACisjIS91c3IvYmluL3BlcmwKKworCSR0CT0gIkhlbGxvIFdvcmxkISI7CisJcHJpbnQJPDxFT1Q7CitDb250ZW50LXR5cGU6IHRleHQvaHRtbAorCisJPFRpdGxlPiAkdCA8L1RpdGxlPgorCTxIMT4JJHQgPC9IMT4KK0VPVApkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvV0VCLUlORi9jZ2kvaWYucGwgYi9jb250YWluZXIvdGVzdGVyL3dlYi9XRUItSU5GL2NnaS9pZi5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmQyMzIwCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvV0VCLUlORi9jZ2kvaWYucGwKQEAgLTAsMCArMSwxMyBAQAorIyEvdXNyL2Jpbi9wZXJsCisKK3JlcXVpcmUgInN1YnBhcnNlZm9ybS5saWIiOworJlBhcnNlX0Zvcm07CisKKyRmb29kID0gJGZvcm1kYXRheydmb29kJ307CisKKworCitpZiAoJGZvb2QgZXEgInNwaW5hY2giKSB7CisJcHJpbnQgIkNvbnRlbnQtdHlwZTogdGV4dC9odG1sXG5cbiI7CisJcHJpbnQgIllvdSBhdGUgc3BpbmFjaCwgc28geW91IGdldCBkZXNzZXJ0IVxuIjsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9XRUItSU5GL2NnaS9pbmNyZW1lbnQucGwgYi9jb250YWluZXIvdGVzdGVyL3dlYi9XRUItSU5GL2NnaS9pbmNyZW1lbnQucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIxMTY5ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1dFQi1JTkYvY2dpL2luY3JlbWVudC5wbApAQCAtMCwwICsxLDE5IEBACisjIS91c3IvYmluL3BlcmwKKworcmVxdWlyZSAic3VicGFyc2Vmb3JtLmxpYiI7CismUGFyc2VfRm9ybTsKK3ByaW50ICJDb250ZW50LXR5cGU6IHRleHQvaHRtbFxuXG4iOworCiskY291bnRlciA9ICRmb3JtZGF0YXsnY291bnRlcid9OworCisrKyRjb3VudGVyOworcHJpbnQgIllvdXIgbnVtYmVyIGluY3JlbWVudGVkIGJ5IDEgaXMgJGNvdW50ZXIiOworJHdhdGNoID0gKyskY291bnRlcjsKK3ByaW50ICI8QlI+WW91ciBudW1iZXIsIGluY3JlbWVudGVkIGFnYWluIGJ5IDEsIGlzIG5vdyAkY291bnRlci4gSWYgd2Ugc3RvcmUgdGhhdCBvcGVyYXRpb24sIGl0cyB2YWx1ZSBpcyBhbHNvICR3YXRjaC4iOworCiskY291bnRlciA9ICRmb3JtZGF0YXsnY291bnRlcid9OworcHJpbnQgIjxIUj5MZXQncyBzdGFydCBvdmVyLCB3aXRoIHlvdXIgb3JpZ2luYWwgbnVtYmVyICRjb3VudGVyIjsKKyRjb3VudGVyKys7CitwcmludCAiPEJSPkFnYWluLCB5b3VyIG51bWJlciBpbmNyZW1lbnRlZCBieSAxIGlzICRjb3VudGVyIjsKKyR3YXRjaCA9ICRjb3VudGVyKys7CitwcmludCAiPEJSPk5vdyB3ZSBzdG9yZSB0aGUgdmFsdWUgb2YgeW91ciBudW1iZXIgaW4gYSBzZWNvbmQgdmFyaWFibGUsIHdoaWNoIGlzIG5vdyBlcXVhbCB0byAkd2F0Y2gsIGFuZCB0aGVuIHdlIGluY3JlbWVudCB5b3VyIG51bWJlciBhZ2Fpbi4gSXQncyBub3cgJGNvdW50ZXIuIjsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9XRUItSU5GL2NnaS9tb2RpZnlhbGwucGwgYi9jb250YWluZXIvdGVzdGVyL3dlYi9XRUItSU5GL2NnaS9tb2RpZnlhbGwucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMwODk2OQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1dFQi1JTkYvY2dpL21vZGlmeWFsbC5wbApAQCAtMCwwICsxLDIyIEBACisjIS91c3IvYmluL3BlcmwKKworcmVxdWlyZSAic3VicGFyc2Vmb3JtLmxpYiI7CismUGFyc2VfRm9ybTsKKworQG51bWJlcnMgPSBzcGxpdCgvLC8sICRmb3JtZGF0YXsnbnVtYmVyJ30pOworcHJpbnQgIkNvbnRlbnQtdHlwZTogdGV4dC9odG1sXG5cbiI7CisKK3ByaW50ICJUaGUgbnVtYmVycyB5b3UgZW50ZXJlZCB3ZXJlOiI7Citmb3JlYWNoICRudW1iZXIgKEBudW1iZXJzKSB7CisJcHJpbnQgIjxMST4kbnVtYmVyIjsKKwl9CisJCitmb3JlYWNoICRudW1iZXIoQG51bWJlcnMpIHsKKwkkbnVtYmVyID0gc3FydCgkbnVtYmVyKTsKKwl9CisKK3ByaW50ICI8UD5UaGUgc3F1YXJlIHJvb3RzIG9mIHRob3NlIG51bWJlcnMgYXJlOiAiOworCitmb3JlYWNoICRudW1iZXIoQG51bWJlcnMpIHsKKwlwcmludCAiPExJPiRudW1iZXIiOworCX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9XRUItSU5GL2NnaS9wcmVmZXJlbmNlLnBsIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvV0VCLUlORi9jZ2kvcHJlZmVyZW5jZS5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWI3NWVjCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvV0VCLUlORi9jZ2kvcHJlZmVyZW5jZS5wbApAQCAtMCwwICsxLDkgQEAKKyMhL3Vzci9iaW4vcGVybAorCiskZGl2ID0gNDAgLyA1ICsgMzsKKyRwYXJlbnMgPSA0MCAvICg1ICsgMyk7Ciskc3ViYWRkID0gOSAtIDMgKyA1OworJHBhcmVuc19zdWJhZGQgPSA5IC0gKDMgKyA1KTsKKworcHJpbnQgIkNvbnRlbnQtdHlwZTogdGV4dC9odG1sXG5cbiI7CitwcmludCAiZGl2IGlzICRkaXYsIHBhcmVucyBpcyAkcGFyZW5zLCBzdWJhZGQgaXMgJHN1YmFkZCBhbmQgcGFyZW5zX3N1YmFkZCBpcyAkcGFyZW5zX3N1YmFkZCI7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvV0VCLUlORi9jZ2kvc3VicGFyc2Vmb3JtLmxpYiBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1dFQi1JTkYvY2dpL3N1YnBhcnNlZm9ybS5saWIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzkzNmJlNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1dFQi1JTkYvY2dpL3N1YnBhcnNlZm9ybS5saWIKQEAgLTAsMCArMSw0MyBAQAorc3ViIFBhcnNlX0Zvcm0gCit7CitpZiAoJEVOVnsnUkVRVUVTVF9NRVRIT0QnfSBlcSAnR0VUJykgCit7CisgICAgICAgIEBwYWlycyA9IHNwbGl0KC8mLywgJEVOVnsnUVVFUllfU1RSSU5HJ30pOworfSAKK2Vsc2lmICgkRU5WeydSRVFVRVNUX01FVEhPRCd9IGVxICdQT1NUJykgCit7CisgICAgcmVhZCAoU1RESU4sICRidWZmZXIsICRFTlZ7J0NPTlRFTlRfTEVOR1RIJ30pOworICAgIEBwYWlycyA9IHNwbGl0KC8mLywgJGJ1ZmZlcik7CisJCQorICAgIGlmICgkRU5WeydRVUVSWV9TVFJJTkcnfSkgCisgICAgeworICAgICAgICBAZ2V0cGFpcnMgPXNwbGl0KC8mLywgJEVOVnsnUVVFUllfU1RSSU5HJ30pOworICAgICAgICBwdXNoKEBwYWlycyxAZ2V0cGFpcnMpOworICAgIH0KK30gCitlbHNlIAoreworICAgIHByaW50ICJDb250ZW50LXR5cGU6IHRleHQvaHRtbFxuXG4iOworICAgIHByaW50ICI8UD5Vc2UgUG9zdCBvciBHZXQiOworfQorCitmb3JlYWNoICRwYWlyIChAcGFpcnMpIAoreworICAgICgka2V5LCAkdmFsdWUpID0gc3BsaXQgKC89LywgJHBhaXIpOworICAgICRrZXkgPX4gdHIvKy8gLzsKKyAgICAka2V5ID1+IHMvJShbYS1mQS1GMC05XVthLWZBLUYwLTldKS9wYWNrKCJDIiwgaGV4KCQxKSkvZWc7CisgICAgJHZhbHVlID1+IHRyLysvIC87CisgICAgJHZhbHVlID1+IHMvJShbYS1mQS1GMC05XVthLWZBLUYwLTldKS9wYWNrKCJDIiwgaGV4KCQxKSkvZWc7CisgICAgJHZhbHVlID1+cy88IS0tKC58XG4pKi0tPi8vZzsKKwkKKyAgICBpZiAoJGZvcm1kYXRheyRrZXl9KSAKKyAgICB7CisgICAgICAgICRmb3JtZGF0YXska2V5fSAuPSAiLCAkdmFsdWUiOworICAgIH0gCisgICAgZWxzZSAKKyAgICB7CisgICAgICAgICRmb3JtZGF0YXska2V5fSA9ICR2YWx1ZTsKKyAgICB9Cit9Cit9CQorMTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9XRUItSU5GL2NnaS9zdWJyb3V0aW5lcy5saWIgYi9jb250YWluZXIvdGVzdGVyL3dlYi9XRUItSU5GL2NnaS9zdWJyb3V0aW5lcy5saWIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY2YThhYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1dFQi1JTkYvY2dpL3N1YnJvdXRpbmVzLmxpYgpAQCAtMCwwICsxLDM0IEBACisjIS91c3IvbG9jYWwvYmluL3Blcmw7CisKK3N1YiBjYXAgeworCSRjYXB0ZXh0ID0gJF9bMF07CisJJGNhcHRleHQgPX4gdHIvYS16L0EtWi87CisJcmV0dXJuICRjYXB0ZXh0OworfQorCitzdWIgd2hpY2ggeworCSRicm93c2VyID0gJEVOVnsnSFRUUF9VU0VSX0FHRU5UJ307CisJaWYgKCRicm93c2VyID1+IC9NU0lFLykgeworCQkkYnJvd3NlciA9ICJFeHBsb3JlciI7CisJfSBlbHNpZiAoJGJyb3dzZXIgPX4vTW96aWxsYS8pIHsKKwkJJGJyb3dzZXIgPSAiTmV0c2NhcGUiOworCX0gZWxzZSB7CisJCSRicm93c2VyID0gInNvbWV0aGluZyBiZXNpZGVzIE5ldHNjYXBlIGFuZCBFeHBsb3JlciI7CisJfQorfQorCitzdWIgaGVhZGVyIHsKKwlwcmludCAiPEhUTUw+PEhFQUQ+PFRJVExFPiI7CisJcHJpbnQgIiRfWzBdIjsKKwlwcmludCAiPFRJVExFPjxIRUFEPjxCT0RZPiIKK30KKworc3ViIGZvb3RlciB7CisJcHJpbnQgIjxCT0RZPjxIVE1MPiI7Cit9CisKK3N1YiBtaW1lIHsKKwlwcmludCAiQ29udGVudC10eXBlOiB0ZXh0L2h0bWxcblxuIjsKK30KKworMTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9XRUItSU5GL2NnaS90ZXN0LWNnaS5wbCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1dFQi1JTkYvY2dpL3Rlc3QtY2dpLnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2ZGE5YmQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9XRUItSU5GL2NnaS90ZXN0LWNnaS5wbApAQCAtMCwwICsxLDkzIEBACisjIS91c3IvbG9jYWwvYmluL3BlcmwKKyMKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorIyAgICAgICAgICAgICAgICAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCAgVmVyc2lvbiAxLjEgICAgICAgICAgICAgICAgICoKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjICAgICBDb3B5cmlnaHQgKGMpIDE5OTksIDIwMDAsIDIwMDEgIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gICAgICAgKgorIyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKgorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3JtcywgIHdpdGggb3Igd2l0aG91dCBtb2RpLSAqCisjIGZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6ICAgKgorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlICBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSAqCisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gICAgICAgICAgKgorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMgMi4gUmVkaXN0cmlidXRpb25zICBpbiBiaW5hcnkgIGZvcm0gIG11c3QgIHJlcHJvZHVjZSB0aGUgIGFib3ZlIGNvcHlyaWdodCAqCisjICAgIG5vdGljZSwgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zICBhbmQgdGhlIGZvbGxvd2luZyAgZGlzY2xhaW1lciBpbiB0aGUgKgorIyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAgICoKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uICBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgIGlmIGFueSwgKgorIyAgICBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWdlbWVudDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgIHNvZnR3YXJlIGRldmVsb3BlZCAgYnkgdGhlIEFwYWNoZSAgU29mdHdhcmUgKgorIyAgICAgICAgRm91bmRhdGlvbiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwgaWYgKgorIyAgICBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLiAgICAgICAgICoKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjIDQuIFRoZSBuYW1lcyAgIlRoZSAgSmFrYXJ0YSAgUHJvamVjdCIsICAiVG9tY2F0IiwgIGFuZCAgIkFwYWNoZSAgU29mdHdhcmUgKgorIyAgICBGb3VuZGF0aW9uIiAgbXVzdCBub3QgYmUgdXNlZCAgdG8gZW5kb3JzZSBvciBwcm9tb3RlICBwcm9kdWN0cyBkZXJpdmVkICoKKyMgICAgZnJvbSB0aGlzICBzb2Z0d2FyZSB3aXRob3V0ICBwcmlvciAgd3JpdHRlbiAgcGVybWlzc2lvbi4gIEZvciAgd3JpdHRlbiAqCisjICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IDxhcGFjaGVAYXBhY2hlLm9yZz4uICAgICAgICAgICAgICAgICAgICAgICAgKgorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMgNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIgbm9yIG1heSAqCisjICAgICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgKgorIyAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMgKgorIyBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZICoKKyMgQU5EIEZJVE5FU1MgRk9SICBBIFBBUlRJQ1VMQVIgUFVSUE9TRSAgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCAqCisjIFRIRSBBUEFDSEUgIFNPRlRXQVJFICBGT1VOREFUSU9OIE9SICBJVFMgQ09OVFJJQlVUT1JTICBCRSBMSUFCTEUgIEZPUiBBTlkgKgorIyBESVJFQ1QsICBJTkRJUkVDVCwgICBJTkNJREVOVEFMLCAgU1BFQ0lBTCwgIEVYRU1QTEFSWSwgIE9SICBDT05TRVFVRU5USUFMICoKKyMgREFNQUdFUyAoSU5DTFVESU5HLCAgQlVUIE5PVCBMSU1JVEVEIFRPLCAgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyAqCisjIE9SIFNFUlZJQ0VTOyAgTE9TUyBPRiBVU0UsICBEQVRBLCAgT1IgUFJPRklUUzsgIE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgKgorIyBIT1dFVkVSIENBVVNFRCBBTkQgIE9OIEFOWSAgVEhFT1JZICBPRiAgTElBQklMSVRZLCAgV0hFVEhFUiBJTiAgQ09OVFJBQ1QsICoKKyMgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiAqCisjIEFOWSAgV0FZICBPVVQgT0YgIFRIRSAgVVNFIE9GICBUSElTICBTT0ZUV0FSRSwgIEVWRU4gIElGICBBRFZJU0VEICBPRiBUSEUgKgorIyBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKgorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMgVGhpcyBzb2Z0d2FyZSAgY29uc2lzdHMgb2Ygdm9sdW50YXJ5ICBjb250cmlidXRpb25zIG1hZGUgIGJ5IG1hbnkgaW5kaXZpLSAqCisjIGR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUgaW5mb3JtYXRpb24gKgorIyBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LiAgICoKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKyMKKworcHJpbnQgPDxFT007CitDb250ZW50LXR5cGU6IHRleHQvaHRtbAorCis8aHRtbD4KKzxoZWFkPjx0aXRsZT5DR0kgVGVzdDwvdGl0bGU+PC9oZWFkPgorPGJvZHk+Cis8aDE+Q0dJIFRlc3Q8L2gxPgorPHByZT4KK0VPTQorCitwcmludCAiYXJnYyBpcyAiIC4gKCQjQVJHViArIDEpIC4gIlxuXG4iOworCitwcmludCAiYXJndiBpc1xuIjsKKworZm9yKCRpID0gMDsgJGk8KCQjQVJHVisxKTsgJGkrKykgeworCXByaW50ICRBUkdWWyRpXSAuICJcbiI7Cit9CisKK3ByaW50ICJcbiI7CisJCitmb3JlYWNoICRrZXkgKHNvcnQga2V5cyAlRU5WKSB7CisKKwlwcmludCgiJGtleTogJEVOVnska2V5fVxuIik7CisKK30KKworcHJpbnQgPDxFT007Cis8L3ByZT4KKzwvYm9keT4KKzwvaHRtbD4KK0VPTQorCitjbG9zZSBPVVQ7CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9XRUItSU5GL3dlYi54bWwgYi9jb250YWluZXIvdGVzdGVyL3dlYi9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRkMTllZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1dFQi1JTkYvd2ViLnhtbApAQCAtMCwwICsxLDIwNjAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KKworPCFET0NUWVBFIHdlYi1hcHAKKyAgICBQVUJMSUMgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBXZWIgQXBwbGljYXRpb24gMi4zLy9FTiIKKyAgICAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvd2ViLWFwcF8yXzMuZHRkIj4KKworPCEtLSBEZXBsb3ltZW50IERlc2NyaXB0b3IgZm9yIHRoZSBUZXN0ZXIgV2ViIEFwcGxpY2F0aW9uIC0tPgorCis8d2ViLWFwcD4KKworICAgIDwhLS0gPT09PT09PT09PSBGaWx0ZXIgRGVmaW5pdGlvbnMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCisgICAgPGZpbHRlcj4KKyAgICAgICAgPGZpbHRlci1uYW1lPkdlbmVyaWNGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8ZmlsdGVyLWNsYXNzPm9yZy5hcGFjaGUudGVzdGVyLldyYXBwZXJGaWx0ZXI8L2ZpbHRlci1jbGFzcz4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5yZXF1ZXN0PC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPmdlbmVyaWM8L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+cmVzcG9uc2U8L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+Z2VuZXJpYzwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICA8L2ZpbHRlcj4KKworCisgICAgPGZpbHRlcj4KKyAgICAgICAgPGZpbHRlci1uYW1lPkh0dHBGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8ZmlsdGVyLWNsYXNzPm9yZy5hcGFjaGUudGVzdGVyLldyYXBwZXJGaWx0ZXI8L2ZpbHRlci1jbGFzcz4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5yZXF1ZXN0PC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPmh0dHA8L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+cmVzcG9uc2U8L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+aHR0cDwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICA8L2ZpbHRlcj4KKworCisgICAgPGZpbHRlcj4KKyAgICAgICAgPGZpbHRlci1uYW1lPlN0YXRpY0ZpbHRlcjwvZmlsdGVyLW5hbWU+CisgICAgICAgIDxmaWx0ZXItY2xhc3M+b3JnLmFwYWNoZS50ZXN0ZXIuU3RhdGljRmlsdGVyPC9maWx0ZXItY2xhc3M+CisgICAgPC9maWx0ZXI+CisKKworICAgIDxmaWx0ZXI+CisgICAgICAgIDxmaWx0ZXItbmFtZT5VcHBlckNhc2VGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8ZmlsdGVyLWNsYXNzPm9yZy5hcGFjaGUudGVzdGVyLlVwcGVyQ2FzZUZpbHRlcjwvZmlsdGVyLWNsYXNzPgorICAgIDwvZmlsdGVyPgorCisKKyAgICA8IS0tID09PT09PT09PT0gRmlsdGVyIE1hcHBpbmdzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworICAgIDwhLS0gVXNlIFN0YXRpY0ZpbHRlciBvbiAqYWxsKiByZXF1ZXN0cyB0byBjbGVhciBzdGF0aWMgbG9nIC0tPgorICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPlN0YXRpY0ZpbHRlcjwvZmlsdGVyLW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vKjwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKworICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPkh0dHBGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRBZ2dyZWdhdGUwMTwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKworICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPkh0dHBGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRBZ2dyZWdhdGUwMjwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKworICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPkh0dHBGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRDb250ZXh0MDA8L3VybC1wYXR0ZXJuPgorICAgIDwvZmlsdGVyLW1hcHBpbmc+CisKKyAgICA8ZmlsdGVyLW1hcHBpbmc+CisgICAgICAgIDxmaWx0ZXItbmFtZT5IdHRwRmlsdGVyPC9maWx0ZXItbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9XcmFwcGVkQ29udGV4dDAxPC91cmwtcGF0dGVybj4KKyAgICA8L2ZpbHRlci1tYXBwaW5nPgorCisgICAgPGZpbHRlci1tYXBwaW5nPgorICAgICAgICA8ZmlsdGVyLW5hbWU+SHR0cEZpbHRlcjwvZmlsdGVyLW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZENvbnRleHQwMjwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKworICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPkh0dHBGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWREZWNvZGluZzAxPC91cmwtcGF0dGVybj4KKyAgICA8L2ZpbHRlci1tYXBwaW5nPgorCisgICAgPGZpbHRlci1tYXBwaW5nPgorICAgICAgICA8ZmlsdGVyLW5hbWU+SHR0cEZpbHRlcjwvZmlsdGVyLW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZEVycm9yUGFnZTAxPC91cmwtcGF0dGVybj4KKyAgICA8L2ZpbHRlci1tYXBwaW5nPgorCisgICAgPGZpbHRlci1tYXBwaW5nPgorICAgICAgICA8ZmlsdGVyLW5hbWU+SHR0cEZpbHRlcjwvZmlsdGVyLW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZEVycm9yUGFnZTAyPC91cmwtcGF0dGVybj4KKyAgICA8L2ZpbHRlci1tYXBwaW5nPgorCisgICAgPGZpbHRlci1tYXBwaW5nPgorICAgICAgICA8ZmlsdGVyLW5hbWU+SHR0cEZpbHRlcjwvZmlsdGVyLW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZEVycm9yUGFnZTAzPC91cmwtcGF0dGVybj4KKyAgICA8L2ZpbHRlci1tYXBwaW5nPgorCisgICAgPGZpbHRlci1tYXBwaW5nPgorICAgICAgICA8ZmlsdGVyLW5hbWU+SHR0cEZpbHRlcjwvZmlsdGVyLW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZEVycm9yUGFnZTA0PC91cmwtcGF0dGVybj4KKyAgICA8L2ZpbHRlci1tYXBwaW5nPgorCisgICAgPGZpbHRlci1tYXBwaW5nPgorICAgICAgICA8ZmlsdGVyLW5hbWU+SHR0cEZpbHRlcjwvZmlsdGVyLW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZEVycm9yUGFnZTA1PC91cmwtcGF0dGVybj4KKyAgICA8L2ZpbHRlci1tYXBwaW5nPgorCisgICAgPGZpbHRlci1tYXBwaW5nPgorICAgICAgICA8ZmlsdGVyLW5hbWU+SHR0cEZpbHRlcjwvZmlsdGVyLW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZEVycm9yUGFnZTA2PC91cmwtcGF0dGVybj4KKyAgICA8L2ZpbHRlci1tYXBwaW5nPgorCisgICAgPGZpbHRlci1tYXBwaW5nPgorICAgICAgICA8ZmlsdGVyLW5hbWU+SHR0cEZpbHRlcjwvZmlsdGVyLW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZEVycm9yUGFnZTA3PC91cmwtcGF0dGVybj4KKyAgICA8L2ZpbHRlci1tYXBwaW5nPgorCisgICAgPGZpbHRlci1tYXBwaW5nPgorICAgICAgICA8ZmlsdGVyLW5hbWU+SHR0cEZpbHRlcjwvZmlsdGVyLW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZEVycm9yUGFnZTA4PC91cmwtcGF0dGVybj4KKyAgICA8L2ZpbHRlci1tYXBwaW5nPgorCisgICAgPGZpbHRlci1tYXBwaW5nPgorICAgICAgICA8ZmlsdGVyLW5hbWU+SHR0cEZpbHRlcjwvZmlsdGVyLW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZEVycm9yUGFnZTA5PC91cmwtcGF0dGVybj4KKyAgICA8L2ZpbHRlci1tYXBwaW5nPgorCisgICAgPGZpbHRlci1tYXBwaW5nPgorICAgICAgICA8ZmlsdGVyLW5hbWU+VXBwZXJDYXNlRmlsdGVyPC9maWx0ZXItbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9GaWx0ZXJSZXF1ZXN0MDE8L3VybC1wYXR0ZXJuPgorICAgIDwvZmlsdGVyLW1hcHBpbmc+CisKKyAgICA8ZmlsdGVyLW1hcHBpbmc+CisgICAgICAgIDxmaWx0ZXItbmFtZT5IdHRwRmlsdGVyPC9maWx0ZXItbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9XcmFwcGVkRmlsdGVyUmVxdWVzdDAxPC91cmwtcGF0dGVybj4KKyAgICA8L2ZpbHRlci1tYXBwaW5nPgorCisgICAgPGZpbHRlci1tYXBwaW5nPgorICAgICAgICA8ZmlsdGVyLW5hbWU+VXBwZXJDYXNlRmlsdGVyPC9maWx0ZXItbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9XcmFwcGVkRmlsdGVyUmVxdWVzdDAxPC91cmwtcGF0dGVybj4KKyAgICA8L2ZpbHRlci1tYXBwaW5nPgorCisgICAgPGZpbHRlci1tYXBwaW5nPgorICAgICAgICA8ZmlsdGVyLW5hbWU+SHR0cEZpbHRlcjwvZmlsdGVyLW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZEZpbHRlclJlcXVlc3QwMjwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKworICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPlVwcGVyQ2FzZUZpbHRlcjwvZmlsdGVyLW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vRmlsdGVyUmVzcG9uc2UwMTwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKworICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPkh0dHBGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRGaWx0ZXJSZXNwb25zZTAxPC91cmwtcGF0dGVybj4KKyAgICA8L2ZpbHRlci1tYXBwaW5nPgorCisgICAgPGZpbHRlci1tYXBwaW5nPgorICAgICAgICA8ZmlsdGVyLW5hbWU+VXBwZXJDYXNlRmlsdGVyPC9maWx0ZXItbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9XcmFwcGVkRmlsdGVyUmVzcG9uc2UwMTwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKworICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPlVwcGVyQ2FzZUZpbHRlcjwvZmlsdGVyLW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vRmlsdGVyUmVzcG9uc2UwMi5qc3A8L3VybC1wYXR0ZXJuPgorICAgIDwvZmlsdGVyLW1hcHBpbmc+CisKKyAgICA8ZmlsdGVyLW1hcHBpbmc+CisgICAgICAgIDxmaWx0ZXItbmFtZT5IdHRwRmlsdGVyPC9maWx0ZXItbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9XcmFwcGVkRmlsdGVyUmVzcG9uc2UwMi5qc3A8L3VybC1wYXR0ZXJuPgorICAgIDwvZmlsdGVyLW1hcHBpbmc+CisKKyAgICA8ZmlsdGVyLW1hcHBpbmc+CisgICAgICAgIDxmaWx0ZXItbmFtZT5VcHBlckNhc2VGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRGaWx0ZXJSZXNwb25zZTAyLmpzcDwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKworICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPlVwcGVyQ2FzZUZpbHRlcjwvZmlsdGVyLW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vRmlsdGVyUmVzcG9uc2UwMy50eHQ8L3VybC1wYXR0ZXJuPgorICAgIDwvZmlsdGVyLW1hcHBpbmc+CisKKyAgICA8ZmlsdGVyLW1hcHBpbmc+CisgICAgICAgIDxmaWx0ZXItbmFtZT5IdHRwRmlsdGVyPC9maWx0ZXItbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9XcmFwcGVkRmlsdGVyUmVzcG9uc2UwMy50eHQ8L3VybC1wYXR0ZXJuPgorICAgIDwvZmlsdGVyLW1hcHBpbmc+CisKKyAgICA8ZmlsdGVyLW1hcHBpbmc+CisgICAgICAgIDxmaWx0ZXItbmFtZT5VcHBlckNhc2VGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRGaWx0ZXJSZXNwb25zZTAzLnR4dDwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKworICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPkh0dHBGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRGaWx0ZXJSZXNwb25zZTA0PC91cmwtcGF0dGVybj4KKyAgICA8L2ZpbHRlci1tYXBwaW5nPgorCisgICAgPGZpbHRlci1tYXBwaW5nPgorICAgICAgICA8ZmlsdGVyLW5hbWU+SHR0cEZpbHRlcjwvZmlsdGVyLW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZEZvcndhcmQwMDwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKworICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPkh0dHBGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRGb3J3YXJkMDE8L3VybC1wYXR0ZXJuPgorICAgIDwvZmlsdGVyLW1hcHBpbmc+CisKKyAgICA8ZmlsdGVyLW1hcHBpbmc+CisgICAgICAgIDxmaWx0ZXItbmFtZT5IdHRwRmlsdGVyPC9maWx0ZXItbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9XcmFwcGVkRm9yd2FyZDAzPC91cmwtcGF0dGVybj4KKyAgICA8L2ZpbHRlci1tYXBwaW5nPgorCisgICAgPGZpbHRlci1tYXBwaW5nPgorICAgICAgICA8ZmlsdGVyLW5hbWU+SHR0cEZpbHRlcjwvZmlsdGVyLW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZEZvcndhcmQwNDwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKworICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPkh0dHBGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRGb3J3YXJkMDU8L3VybC1wYXR0ZXJuPgorICAgIDwvZmlsdGVyLW1hcHBpbmc+CisKKyAgICA8ZmlsdGVyLW1hcHBpbmc+CisgICAgICAgIDxmaWx0ZXItbmFtZT5IdHRwRmlsdGVyPC9maWx0ZXItbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9XcmFwcGVkRm9yd2FyZDA5PC91cmwtcGF0dGVybj4KKyAgICA8L2ZpbHRlci1tYXBwaW5nPgorCisgICAgPGZpbHRlci1tYXBwaW5nPgorICAgICAgICA8ZmlsdGVyLW5hbWU+SHR0cEZpbHRlcjwvZmlsdGVyLW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZEdldEhlYWRlcnMwMTwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKworICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPkdlbmVyaWNGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRHZXRJbnB1dFN0cmVhbTAxPC91cmwtcGF0dGVybj4KKyAgICA8L2ZpbHRlci1tYXBwaW5nPgorCisgICAgPGZpbHRlci1tYXBwaW5nPgorICAgICAgICA8ZmlsdGVyLW5hbWU+SHR0cEZpbHRlcjwvZmlsdGVyLW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZEdldExvY2FsZXMwMTwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKworICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPkh0dHBGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRHZXRMb2NhbGVzMDI8L3VybC1wYXR0ZXJuPgorICAgIDwvZmlsdGVyLW1hcHBpbmc+CisKKyAgICA8ZmlsdGVyLW1hcHBpbmc+CisgICAgICAgIDxmaWx0ZXItbmFtZT5HZW5lcmljRmlsdGVyPC9maWx0ZXItbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9XcmFwcGVkR2V0UGFyYW1ldGVyMDE8L3VybC1wYXR0ZXJuPgorICAgIDwvZmlsdGVyLW1hcHBpbmc+CisKKyAgICA8ZmlsdGVyLW1hcHBpbmc+CisgICAgICAgIDxmaWx0ZXItbmFtZT5HZW5lcmljRmlsdGVyPC9maWx0ZXItbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9XcmFwcGVkR2V0UGFyYW1ldGVyTWFwMDA8L3VybC1wYXR0ZXJuPgorICAgIDwvZmlsdGVyLW1hcHBpbmc+CisKKyAgICA8ZmlsdGVyLW1hcHBpbmc+CisgICAgICAgIDxmaWx0ZXItbmFtZT5IdHRwRmlsdGVyPC9maWx0ZXItbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9XcmFwcGVkR2V0UXVlcnlTdHJpbmcwMTwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKworICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPkh0dHBGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRHb2xkZW4wMTwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKworICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPkh0dHBGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRJbmNsdWRlMDA8L3VybC1wYXR0ZXJuPgorICAgIDwvZmlsdGVyLW1hcHBpbmc+CisKKyAgICA8ZmlsdGVyLW1hcHBpbmc+CisgICAgICAgIDxmaWx0ZXItbmFtZT5IdHRwRmlsdGVyPC9maWx0ZXItbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9XcmFwcGVkSW5jbHVkZTAxPC91cmwtcGF0dGVybj4KKyAgICA8L2ZpbHRlci1tYXBwaW5nPgorCisgICAgPGZpbHRlci1tYXBwaW5nPgorICAgICAgICA8ZmlsdGVyLW5hbWU+SHR0cEZpbHRlcjwvZmlsdGVyLW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZEluY2x1ZGUwMjwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKworICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPkh0dHBGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRJbmNsdWRlMDM8L3VybC1wYXR0ZXJuPgorICAgIDwvZmlsdGVyLW1hcHBpbmc+CisKKyAgICA8ZmlsdGVyLW1hcHBpbmc+CisgICAgICAgIDxmaWx0ZXItbmFtZT5IdHRwRmlsdGVyPC9maWx0ZXItbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9XcmFwcGVkSW5jbHVkZTA0PC91cmwtcGF0dGVybj4KKyAgICA8L2ZpbHRlci1tYXBwaW5nPgorCisgICAgPGZpbHRlci1tYXBwaW5nPgorICAgICAgICA8ZmlsdGVyLW5hbWU+SHR0cEZpbHRlcjwvZmlsdGVyLW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZEluY2x1ZGUwOTwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKworICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPkh0dHBGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRJbmNsdWRlMTA8L3VybC1wYXR0ZXJuPgorICAgIDwvZmlsdGVyLW1hcHBpbmc+CisKKyAgICA8ZmlsdGVyLW1hcHBpbmc+CisgICAgICAgIDxmaWx0ZXItbmFtZT5IdHRwRmlsdGVyPC9maWx0ZXItbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9XcmFwcGVkSm5kaTAxPC91cmwtcGF0dGVybj4KKyAgICA8L2ZpbHRlci1tYXBwaW5nPgorCisgICAgPGZpbHRlci1tYXBwaW5nPgorICAgICAgICA8ZmlsdGVyLW5hbWU+SHR0cEZpbHRlcjwvZmlsdGVyLW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZEpuZGkwMjwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKworICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPkh0dHBGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRMaWZlY3ljbGUwMTwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKworICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPkh0dHBGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRMaWZlY3ljbGUwMjwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKworICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPkh0dHBGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRMaWZlY3ljbGUwMzwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKworICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPkh0dHBGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRSZWRpcmVjdDAxPC91cmwtcGF0dGVybj4KKyAgICA8L2ZpbHRlci1tYXBwaW5nPgorCisgICAgPGZpbHRlci1tYXBwaW5nPgorICAgICAgICA8ZmlsdGVyLW5hbWU+SHR0cEZpbHRlcjwvZmlsdGVyLW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZFJlZmxlY3Rpb24wMTwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKworICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPkh0dHBGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRSZXF1ZXN0MDE8L3VybC1wYXR0ZXJuPgorICAgIDwvZmlsdGVyLW1hcHBpbmc+CisKKyAgICA8ZmlsdGVyLW1hcHBpbmc+CisgICAgICAgIDxmaWx0ZXItbmFtZT5HZW5lcmljRmlsdGVyPC9maWx0ZXItbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9XcmFwcGVkUmVzZXQwMTwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKworICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPkh0dHBGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRSZXNvdXJjZXMwMTwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKworICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPkh0dHBGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRSZXNvdXJjZXMwMjwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKworICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPkh0dHBGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRSZXNvdXJjZXMwMzwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKworICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPkh0dHBGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRSZXNvdXJjZXMwNDwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKworICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPkh0dHBGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRSZXNvdXJjZXMwNTwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKworICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPkh0dHBGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRSZXNvdXJjZXMwNjwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKworICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPkh0dHBGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRTZXNzaW9uMDE8L3VybC1wYXR0ZXJuPgorICAgIDwvZmlsdGVyLW1hcHBpbmc+CisKKyAgICA8ZmlsdGVyLW1hcHBpbmc+CisgICAgICAgIDxmaWx0ZXItbmFtZT5IdHRwRmlsdGVyPC9maWx0ZXItbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9XcmFwcGVkU2Vzc2lvbjAyPC91cmwtcGF0dGVybj4KKyAgICA8L2ZpbHRlci1tYXBwaW5nPgorCisgICAgPGZpbHRlci1tYXBwaW5nPgorICAgICAgICA8ZmlsdGVyLW5hbWU+SHR0cEZpbHRlcjwvZmlsdGVyLW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZFNlc3Npb24wMzwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKworICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPkh0dHBGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRTZXNzaW9uMDQ8L3VybC1wYXR0ZXJuPgorICAgIDwvZmlsdGVyLW1hcHBpbmc+CisKKyAgICA8ZmlsdGVyLW1hcHBpbmc+CisgICAgICAgIDxmaWx0ZXItbmFtZT5IdHRwRmlsdGVyPC9maWx0ZXItbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9XcmFwcGVkU2Vzc2lvbjA1PC91cmwtcGF0dGVybj4KKyAgICA8L2ZpbHRlci1tYXBwaW5nPgorCisgICAgPGZpbHRlci1tYXBwaW5nPgorICAgICAgICA8ZmlsdGVyLW5hbWU+SHR0cEZpbHRlcjwvZmlsdGVyLW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZFNlc3Npb24wNjwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKworICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPkdlbmVyaWNGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRTZXRCdWZmZXJTaXplMDE8L3VybC1wYXR0ZXJuPgorICAgIDwvZmlsdGVyLW1hcHBpbmc+CisKKyAgICA8ZmlsdGVyLW1hcHBpbmc+CisgICAgICAgIDxmaWx0ZXItbmFtZT5HZW5lcmljRmlsdGVyPC9maWx0ZXItbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9XcmFwcGVkU2V0TG9jYWxlMDE8L3VybC1wYXR0ZXJuPgorICAgIDwvZmlsdGVyLW1hcHBpbmc+CisKKyAgICA8ZmlsdGVyLW1hcHBpbmc+CisgICAgICAgIDxmaWx0ZXItbmFtZT5IdHRwRmlsdGVyPC9maWx0ZXItbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9XcmFwcGVkWGVyY2VzMDA8L3VybC1wYXR0ZXJuPgorICAgIDwvZmlsdGVyLW1hcHBpbmc+CisKKyAgICA8ZmlsdGVyLW1hcHBpbmc+CisgICAgICAgIDxmaWx0ZXItbmFtZT5IdHRwRmlsdGVyPC9maWx0ZXItbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9XcmFwcGVkWGVyY2VzMDE8L3VybC1wYXR0ZXJuPgorICAgIDwvZmlsdGVyLW1hcHBpbmc+CisKKyAgICA8ZmlsdGVyLW1hcHBpbmc+CisgICAgICAgIDxmaWx0ZXItbmFtZT5IdHRwRmlsdGVyPC9maWx0ZXItbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9XcmFwcGVkWGVyY2VzMDI8L3VybC1wYXR0ZXJuPgorICAgIDwvZmlsdGVyLW1hcHBpbmc+CisKKworICAgIDwhLS0gPT09PT09PT09PSBMaXN0ZW5lciBEZWZpbml0aW9ucyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCisgICAgPGxpc3RlbmVyPgorICAgICAgICA8bGlzdGVuZXItY2xhc3M+b3JnLmFwYWNoZS50ZXN0ZXIuQ29udGV4dExpc3RlbmVyMDE8L2xpc3RlbmVyLWNsYXNzPgorICAgIDwvbGlzdGVuZXI+CisKKzwhLS0gQ2FuIG5vdCBydW4gUHJvcGVydHlFZGl0b3IgdGVzdHMgdW5kZXIgc2VjdXJpdHkgbWFuYWdlciB1bmxlc3MKKyAgICAgY2F0YWxpbmEucG9saWN5IGFsbG93cyByZWFkL3dyaXRlIGFjY2VzcyB0byBzeXN0ZW0gcHJvcGVydGllcyAtLT4KKzwhLS0KKyAgICA8bGlzdGVuZXI+CisgICAgICAgIDxsaXN0ZW5lci1jbGFzcz5vcmcuYXBhY2hlLnRlc3Rlci5Db250ZXh0TGlzdGVuZXIwMjwvbGlzdGVuZXItY2xhc3M+CisgICAgPC9saXN0ZW5lcj4KKy0tPgorCisgICAgPGxpc3RlbmVyPgorICAgICAgICA8bGlzdGVuZXItY2xhc3M+b3JnLmFwYWNoZS50ZXN0ZXIuUmVxdWVzdExpc3RlbmVyMDE8L2xpc3RlbmVyLWNsYXNzPgorICAgIDwvbGlzdGVuZXI+CisKKyAgICA8bGlzdGVuZXI+CisgICAgICAgIDxsaXN0ZW5lci1jbGFzcz5vcmcuYXBhY2hlLnRlc3Rlci5TZXNzaW9uTGlzdGVuZXIwMTwvbGlzdGVuZXItY2xhc3M+CisgICAgPC9saXN0ZW5lcj4KKworICAgIDxsaXN0ZW5lcj4KKyAgICAgICAgPGxpc3RlbmVyLWNsYXNzPm9yZy5hcGFjaGUudGVzdGVyLlNlc3Npb25MaXN0ZW5lcjAyPC9saXN0ZW5lci1jbGFzcz4KKyAgICA8L2xpc3RlbmVyPgorCisKKyAgICA8IS0tID09PT09PT09PT0gU2VydmxldCBEZWZpbml0aW9ucyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkFnZ3JlZ2F0ZTAxPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUudGVzdGVyLkFnZ3JlZ2F0ZTAxPC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkFnZ3JlZ2F0ZTAyPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUudGVzdGVyLkFnZ3JlZ2F0ZTAyPC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkF1dGhlbnRpY2F0aW9uMDE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS50ZXN0ZXIuQXV0aGVudGljYXRpb24wMTwvc2VydmxldC1jbGFzcz4KKyAgICA8L3NlcnZsZXQ+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5BdXRoZW50aWNhdGlvbjAyPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUudGVzdGVyLkF1dGhlbnRpY2F0aW9uMDI8L3NlcnZsZXQtY2xhc3M+CisgICAgPC9zZXJ2bGV0PgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+QXV0aGVudGljYXRpb24wMzwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLnRlc3Rlci5BdXRoZW50aWNhdGlvbjAzPC9zZXJ2bGV0LWNsYXNzPgorICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+CisgICAgICAgICAgICA8cm9sZS1uYW1lPmFsaWFzPC9yb2xlLW5hbWU+CisgICAgICAgICAgICA8cm9sZS1saW5rPnRvbWNhdDwvcm9sZS1saW5rPgorICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkF1dGhlbnRpY2F0aW9uMDQ8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPGpzcC1maWxlPi9BdXRoZW50aWNhdGlvbjA0LmpzcDwvanNwLWZpbGU+CisgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KKyAgICAgICAgICAgIDxyb2xlLW5hbWU+YWxpYXM8L3JvbGUtbmFtZT4KKyAgICAgICAgICAgIDxyb2xlLWxpbms+dG9tY2F0PC9yb2xlLWxpbms+CisgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+CisgICAgPC9zZXJ2bGV0PgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+QXV0aGVudGljYXRpb24wNTwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLnRlc3Rlci5BdXRoZW50aWNhdGlvbjA1PC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkNvbnRleHQwMDwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLnRlc3Rlci5Db250ZXh0MDA8L3NlcnZsZXQtY2xhc3M+CisgICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+OTk8L2xvYWQtb24tc3RhcnR1cD4KKyAgICA8L3NlcnZsZXQ+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5Db250ZXh0MDE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS50ZXN0ZXIuQ29udGV4dDAxPC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkNvbnRleHQwMjwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLnRlc3Rlci5Db250ZXh0MDI8L3NlcnZsZXQtY2xhc3M+CisgICAgPC9zZXJ2bGV0PgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+RGVjb2RpbmcwMTwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLnRlc3Rlci5EZWNvZGluZzAxPC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkVycm9yUGFnZTAxPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUudGVzdGVyLkVycm9yUGFnZTAxPC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkVycm9yUGFnZTAyPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUudGVzdGVyLkVycm9yUGFnZTAyPC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkVycm9yUGFnZTAzPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUudGVzdGVyLkVycm9yUGFnZTAzPC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkVycm9yUGFnZTA0PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUudGVzdGVyLkVycm9yUGFnZTA0PC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkVycm9yUGFnZTA1PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUudGVzdGVyLkVycm9yUGFnZTA1PC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkVycm9yUGFnZTA2PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUudGVzdGVyLkVycm9yUGFnZTA2PC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkVycm9yUGFnZTA3PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUudGVzdGVyLkVycm9yUGFnZTA3PC9zZXJ2bGV0LWNsYXNzPgorICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KKyAgICA8L3NlcnZsZXQ+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5FcnJvclBhZ2UwODwvc2VydmxldC1uYW1lPgorICAgICAgICA8anNwLWZpbGU+L0Vycm9yUGFnZTA4LmpzcDwvanNwLWZpbGU+CisgICAgPC9zZXJ2bGV0PgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+RXJyb3JQYWdlMDk8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPGpzcC1maWxlPi9FcnJvclBhZ2UwOS5qc3A8L2pzcC1maWxlPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkZpbHRlclJlcXVlc3QwMTwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLnRlc3Rlci5GaWx0ZXJSZXF1ZXN0MDE8L3NlcnZsZXQtY2xhc3M+CisgICAgPC9zZXJ2bGV0PgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+RmlsdGVyUmVxdWVzdDAyPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUudGVzdGVyLkZpbHRlclJlcXVlc3QwMjwvc2VydmxldC1jbGFzcz4KKyAgICA8L3NlcnZsZXQ+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5GaWx0ZXJSZXF1ZXN0MDJhPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUudGVzdGVyLkZpbHRlclJlcXVlc3QwMmE8L3NlcnZsZXQtY2xhc3M+CisgICAgPC9zZXJ2bGV0PgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+RmlsdGVyUmVzcG9uc2UwMTwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLnRlc3Rlci5GaWx0ZXJSZXNwb25zZTAxPC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkZpbHRlclJlc3BvbnNlMDQ8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS50ZXN0ZXIuRmlsdGVyUmVzcG9uc2UwNDwvc2VydmxldC1jbGFzcz4KKyAgICA8L3NlcnZsZXQ+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5GaWx0ZXJSZXNwb25zZTA0YTwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLnRlc3Rlci5GaWx0ZXJSZXNwb25zZTA0YTwvc2VydmxldC1jbGFzcz4KKyAgICA8L3NlcnZsZXQ+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5Gb3J3YXJkMDA8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS50ZXN0ZXIuRm9yd2FyZDAwPC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkZvcndhcmQwMGE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS50ZXN0ZXIuRm9yd2FyZDAwYTwvc2VydmxldC1jbGFzcz4KKyAgICA8L3NlcnZsZXQ+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5Gb3J3YXJkMDBiPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxqc3AtZmlsZT4vRm9yd2FyZDAwYi5qc3A8L2pzcC1maWxlPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkZvcndhcmQwMGQ8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS50ZXN0ZXIuRm9yd2FyZDAwZDwvc2VydmxldC1jbGFzcz4KKyAgICA8L3NlcnZsZXQ+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5Gb3J3YXJkMDBlPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxqc3AtZmlsZT4vRm9yd2FyZDAwZS5qc3A8L2pzcC1maWxlPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkZvcndhcmQwMTwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLnRlc3Rlci5Gb3J3YXJkMDE8L3NlcnZsZXQtY2xhc3M+CisgICAgPC9zZXJ2bGV0PgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+Rm9yd2FyZDAzPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUudGVzdGVyLkZvcndhcmQwMzwvc2VydmxldC1jbGFzcz4KKyAgICA8L3NlcnZsZXQ+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5Gb3J3YXJkMDNhPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUudGVzdGVyLkZvcndhcmQwM2E8L3NlcnZsZXQtY2xhc3M+CisgICAgPC9zZXJ2bGV0PgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+Rm9yd2FyZDA0PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUudGVzdGVyLkZvcndhcmQwNDwvc2VydmxldC1jbGFzcz4KKyAgICA8L3NlcnZsZXQ+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5Gb3J3YXJkMDRhPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUudGVzdGVyLkZvcndhcmQwNGE8L3NlcnZsZXQtY2xhc3M+CisgICAgPC9zZXJ2bGV0PgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+Rm9yd2FyZDA0Yjwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLnRlc3Rlci5Gb3J3YXJkMDRiPC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkZvcndhcmQwNTwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLnRlc3Rlci5Gb3J3YXJkMDU8L3NlcnZsZXQtY2xhc3M+CisgICAgPC9zZXJ2bGV0PgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+Rm9yd2FyZDA1YTwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLnRlc3Rlci5Gb3J3YXJkMDVhPC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkZvcndhcmQwNWI8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS50ZXN0ZXIuRm9yd2FyZDA1Yjwvc2VydmxldC1jbGFzcz4KKyAgICA8L3NlcnZsZXQ+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5Gb3J3YXJkMDY8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS50ZXN0ZXIuRm9yd2FyZDA2PC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkZvcndhcmQwNmE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS50ZXN0ZXIuRm9yd2FyZDA2YTwvc2VydmxldC1jbGFzcz4KKyAgICA8L3NlcnZsZXQ+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5Gb3J3YXJkMDZiPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUudGVzdGVyLkZvcndhcmQwNmI8L3NlcnZsZXQtY2xhc3M+CisgICAgPC9zZXJ2bGV0PgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+Rm9yd2FyZDA3PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUudGVzdGVyLkZvcndhcmQwNzwvc2VydmxldC1jbGFzcz4KKyAgICA8L3NlcnZsZXQ+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5Gb3J3YXJkMDdhPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUudGVzdGVyLkZvcndhcmQwN2E8L3NlcnZsZXQtY2xhc3M+CisgICAgPC9zZXJ2bGV0PgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+Rm9yd2FyZDA3Yjwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLnRlc3Rlci5Gb3J3YXJkMDdiPC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkZvcndhcmQwODwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLnRlc3Rlci5Gb3J3YXJkMDg8L3NlcnZsZXQtY2xhc3M+CisgICAgPC9zZXJ2bGV0PgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+Rm9yd2FyZDA4YTwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLnRlc3Rlci5Gb3J3YXJkMDhhPC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkZvcndhcmQwOGI8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS50ZXN0ZXIuRm9yd2FyZDA4Yjwvc2VydmxldC1jbGFzcz4KKyAgICA8L3NlcnZsZXQ+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5Gb3J3YXJkMDk8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS50ZXN0ZXIuRm9yd2FyZDA5PC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkdldEhlYWRlcnMwMTwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLnRlc3Rlci5HZXRIZWFkZXJzMDE8L3NlcnZsZXQtY2xhc3M+CisgICAgPC9zZXJ2bGV0PgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+R2V0SW5wdXRTdHJlYW0wMTwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLnRlc3Rlci5HZXRJbnB1dFN0cmVhbTAxPC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkdldExvY2FsZXMwMTwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLnRlc3Rlci5HZXRMb2NhbGVzMDE8L3NlcnZsZXQtY2xhc3M+CisgICAgPC9zZXJ2bGV0PgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+R2V0TG9jYWxlczAyPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUudGVzdGVyLkdldExvY2FsZXMwMjwvc2VydmxldC1jbGFzcz4KKyAgICA8L3NlcnZsZXQ+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5HZXRQYXJhbWV0ZXIwMTwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLnRlc3Rlci5HZXRQYXJhbWV0ZXIwMTwvc2VydmxldC1jbGFzcz4KKyAgICA8L3NlcnZsZXQ+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5HZXRQYXJhbWV0ZXJNYXAwMDwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLnRlc3Rlci5HZXRQYXJhbWV0ZXJNYXAwMDwvc2VydmxldC1jbGFzcz4KKyAgICA8L3NlcnZsZXQ+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5HZXRRdWVyeVN0cmluZzAxPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUudGVzdGVyLkdldFF1ZXJ5U3RyaW5nMDE8L3NlcnZsZXQtY2xhc3M+CisgICAgPC9zZXJ2bGV0PgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+R29sZGVuMDE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS50ZXN0ZXIuR29sZGVuMDE8L3NlcnZsZXQtY2xhc3M+CisgICAgPC9zZXJ2bGV0PgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+SW5jbHVkZTAwPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUudGVzdGVyLkluY2x1ZGUwMDwvc2VydmxldC1jbGFzcz4KKyAgICA8L3NlcnZsZXQ+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5JbmNsdWRlMDBhPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUudGVzdGVyLkluY2x1ZGUwMGE8L3NlcnZsZXQtY2xhc3M+CisgICAgPC9zZXJ2bGV0PgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+SW5jbHVkZTAwYjwvc2VydmxldC1uYW1lPgorICAgICAgICA8anNwLWZpbGU+L0luY2x1ZGUwMGIuanNwPC9qc3AtZmlsZT4KKyAgICA8L3NlcnZsZXQ+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5JbmNsdWRlMDBkPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUudGVzdGVyLkluY2x1ZGUwMGQ8L3NlcnZsZXQtY2xhc3M+CisgICAgPC9zZXJ2bGV0PgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+SW5jbHVkZTAwZTwvc2VydmxldC1uYW1lPgorICAgICAgICA8anNwLWZpbGU+L0luY2x1ZGUwMGUuanNwPC9qc3AtZmlsZT4KKyAgICA8L3NlcnZsZXQ+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5JbmNsdWRlMDE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS50ZXN0ZXIuSW5jbHVkZTAxPC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkluY2x1ZGUwMjwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLnRlc3Rlci5JbmNsdWRlMDI8L3NlcnZsZXQtY2xhc3M+CisgICAgPC9zZXJ2bGV0PgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+SW5jbHVkZTAyYTwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLnRlc3Rlci5JbmNsdWRlMDJhPC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkluY2x1ZGUwMzwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLnRlc3Rlci5JbmNsdWRlMDM8L3NlcnZsZXQtY2xhc3M+CisgICAgPC9zZXJ2bGV0PgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+SW5jbHVkZTAzYTwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLnRlc3Rlci5JbmNsdWRlMDNhPC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkluY2x1ZGUwNDwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLnRlc3Rlci5JbmNsdWRlMDQ8L3NlcnZsZXQtY2xhc3M+CisgICAgPC9zZXJ2bGV0PgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+SW5jbHVkZTA0YTwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLnRlc3Rlci5JbmNsdWRlMDRhPC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkluY2x1ZGUwNGI8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS50ZXN0ZXIuSW5jbHVkZTA0Yjwvc2VydmxldC1jbGFzcz4KKyAgICA8L3NlcnZsZXQ+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5JbmNsdWRlMDZhPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUudGVzdGVyLkluY2x1ZGUwNmE8L3NlcnZsZXQtY2xhc3M+CisgICAgPC9zZXJ2bGV0PgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+SW5jbHVkZTA3PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUudGVzdGVyLkluY2x1ZGUwNzwvc2VydmxldC1jbGFzcz4KKyAgICA8L3NlcnZsZXQ+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5JbmNsdWRlMDdhPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUudGVzdGVyLkluY2x1ZGUwN2E8L3NlcnZsZXQtY2xhc3M+CisgICAgPC9zZXJ2bGV0PgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+SW5jbHVkZTA3Yjwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLnRlc3Rlci5JbmNsdWRlMDdiPC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkluY2x1ZGUwN2M8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS50ZXN0ZXIuSW5jbHVkZTA3Yzwvc2VydmxldC1jbGFzcz4KKyAgICA8L3NlcnZsZXQ+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5JbmNsdWRlMDk8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS50ZXN0ZXIuSW5jbHVkZTA5PC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkluY2x1ZGUxMDwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLnRlc3Rlci5JbmNsdWRlMTA8L3NlcnZsZXQtY2xhc3M+CisgICAgPC9zZXJ2bGV0PgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+SW5jbHVkZTEwYTwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLnRlc3Rlci5JbmNsdWRlMTBhPC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkpuZGkwMTwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLnRlc3Rlci5KbmRpMDE8L3NlcnZsZXQtY2xhc3M+CisgICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MTwvbG9hZC1vbi1zdGFydHVwPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkpuZGkwMjwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLnRlc3Rlci5KbmRpMDI8L3NlcnZsZXQtY2xhc3M+CisgICAgPC9zZXJ2bGV0PgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+TGlmZWN5Y2xlMDE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS50ZXN0ZXIuTGlmZWN5Y2xlMDE8L3NlcnZsZXQtY2xhc3M+CisgICAgPC9zZXJ2bGV0PgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+TGlmZWN5Y2xlMDI8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS50ZXN0ZXIuTGlmZWN5Y2xlMDI8L3NlcnZsZXQtY2xhc3M+CisgICAgPC9zZXJ2bGV0PgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+TGlmZWN5Y2xlMDM8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS50ZXN0ZXIuTGlmZWN5Y2xlMDM8L3NlcnZsZXQtY2xhc3M+CisgICAgPC9zZXJ2bGV0PgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+UmVkaXJlY3QwMTwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLnRlc3Rlci5SZWRpcmVjdDAxPC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPlJlZGlyZWN0MDFhPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUudGVzdGVyLlJlZGlyZWN0MDFhPC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPlJlZmxlY3Rpb24wMTwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLnRlc3Rlci5SZWZsZWN0aW9uMDE8L3NlcnZsZXQtY2xhc3M+CisgICAgPC9zZXJ2bGV0PgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+UmVxdWVzdDAxPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUudGVzdGVyLlJlcXVlc3QwMTwvc2VydmxldC1jbGFzcz4KKyAgICA8L3NlcnZsZXQ+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5SZXNldDAxPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUudGVzdGVyLlJlc2V0MDE8L3NlcnZsZXQtY2xhc3M+CisgICAgPC9zZXJ2bGV0PgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+UmVzb3VyY2VzMDE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS50ZXN0ZXIuUmVzb3VyY2VzMDE8L3NlcnZsZXQtY2xhc3M+CisgICAgPC9zZXJ2bGV0PgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+UmVzb3VyY2VzMDI8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS50ZXN0ZXIuUmVzb3VyY2VzMDI8L3NlcnZsZXQtY2xhc3M+CisgICAgPC9zZXJ2bGV0PgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+UmVzb3VyY2VzMDM8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS50ZXN0ZXIuUmVzb3VyY2VzMDM8L3NlcnZsZXQtY2xhc3M+CisgICAgPC9zZXJ2bGV0PgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+UmVzb3VyY2VzMDQ8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS50ZXN0ZXIuUmVzb3VyY2VzMDQ8L3NlcnZsZXQtY2xhc3M+CisgICAgPC9zZXJ2bGV0PgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+UmVzb3VyY2VzMDU8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS50ZXN0ZXIuUmVzb3VyY2VzMDU8L3NlcnZsZXQtY2xhc3M+CisgICAgPC9zZXJ2bGV0PgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+UmVzb3VyY2VzMDY8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS50ZXN0ZXIuUmVzb3VyY2VzMDY8L3NlcnZsZXQtY2xhc3M+CisgICAgPC9zZXJ2bGV0PgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+UmVzcG9uc2VXcmFwMDE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS50ZXN0ZXIuUmVzcG9uc2VXcmFwMDE8L3NlcnZsZXQtY2xhc3M+CisgICAgPC9zZXJ2bGV0PgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+UmVzcG9uc2VXcmFwMDFhPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUudGVzdGVyLlJlc3BvbnNlV3JhcDAxYTwvc2VydmxldC1jbGFzcz4KKyAgICA8L3NlcnZsZXQ+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5SZXNwb25zZVdyYXAwMWM8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS50ZXN0ZXIuUmVzcG9uc2VXcmFwMDFjPC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPlNlc3Npb24wMTwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLnRlc3Rlci5TZXNzaW9uMDE8L3NlcnZsZXQtY2xhc3M+CisgICAgPC9zZXJ2bGV0PgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+U2Vzc2lvbjAyPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUudGVzdGVyLlNlc3Npb24wMjwvc2VydmxldC1jbGFzcz4KKyAgICA8L3NlcnZsZXQ+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5TZXNzaW9uMDM8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS50ZXN0ZXIuU2Vzc2lvbjAzPC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPlNlc3Npb24wNDwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLnRlc3Rlci5TZXNzaW9uMDQ8L3NlcnZsZXQtY2xhc3M+CisgICAgPC9zZXJ2bGV0PgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+U2Vzc2lvbjA1PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUudGVzdGVyLlNlc3Npb24wNTwvc2VydmxldC1jbGFzcz4KKyAgICA8L3NlcnZsZXQ+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5TZXNzaW9uMDY8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS50ZXN0ZXIuU2Vzc2lvbjA2PC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPlNldEJ1ZmZlclNpemUwMTwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLnRlc3Rlci5TZXRCdWZmZXJTaXplMDE8L3NlcnZsZXQtY2xhc3M+CisgICAgPC9zZXJ2bGV0PgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+U2V0TG9jYWxlMDE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS50ZXN0ZXIuU2V0TG9jYWxlMDE8L3NlcnZsZXQtY2xhc3M+CisgICAgPC9zZXJ2bGV0PgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+WGVyY2VzMDA8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPGpzcC1maWxlPi9YZXJjZXMwMC5qc3A8L2pzcC1maWxlPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPlhlcmNlczAxPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUudGVzdGVyLlhlcmNlczAxPC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPlhlcmNlczAyPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxqc3AtZmlsZT4vWGVyY2VzMDIuanNwPC9qc3AtZmlsZT4KKyAgICA8L3NlcnZsZXQ+CisKKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPmludm9rZXI8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+CisgICAgICAgICAgb3JnLmFwYWNoZS5jYXRhbGluYS5zZXJ2bGV0cy5JbnZva2VyU2VydmxldAorICAgICAgICA8L3NlcnZsZXQtY2xhc3M+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+ZGVidWc8L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+MDwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4yPC9sb2FkLW9uLXN0YXJ0dXA+CisgICAgPC9zZXJ2bGV0PgorCisKKyAgICA8IS0tID09PT09PT09PT0gU2VydmxldCBNYXBwaW5ncyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5pbnZva2VyPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vc2VydmxldC8qPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDwhLS0gTWFwIENHSSBHYXRld2F5IFNlcnZpY2UgZm9yIHRoaXMgV2ViIEFwcCAtLT4KKzwhLS0KKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPmNnaTwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L2NnaS1iaW4vKjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CistLT4KKworICAgIDwhLS0gTWFwIFNTSSBTZXJ2aWNlIGZvciB0aGlzIFdlYiBBcHAgLS0+Cis8IS0tCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5zc2k8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPiouc2h0bWw8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorLS0+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkFnZ3JlZ2F0ZTAxPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vQWdncmVnYXRlMDE8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5BZ2dyZWdhdGUwMTwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRBZ2dyZWdhdGUwMTwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkFnZ3JlZ2F0ZTAyPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vQWdncmVnYXRlMDI8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5BZ2dyZWdhdGUwMjwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRBZ2dyZWdhdGUwMjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkF1dGhlbnRpY2F0aW9uMDE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9wcm90ZWN0ZWQvQXV0aGVudGljYXRpb24wMTwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkF1dGhlbnRpY2F0aW9uMDI8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9wcm90ZWN0ZWQvQXV0aGVudGljYXRpb24wMjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkF1dGhlbnRpY2F0aW9uMDM8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9wcm90ZWN0ZWQvQXV0aGVudGljYXRpb24wMzwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkF1dGhlbnRpY2F0aW9uMDQ8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9wcm90ZWN0ZWQvQXV0aGVudGljYXRpb24wNDwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkF1dGhlbnRpY2F0aW9uMDU8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9hbGxvd2VkL0F1dGhlbnRpY2F0aW9uMDU8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5BdXRoZW50aWNhdGlvbjA1PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vZGlzYWxsb3dlZC9BdXRoZW50aWNhdGlvbjA1PC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+Q29udGV4dDAwPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vQ29udGV4dDAwPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+Q29udGV4dDAwPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZENvbnRleHQwMDwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkNvbnRleHQwMTwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L0NvbnRleHQwMTwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkNvbnRleHQwMTwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRDb250ZXh0MDE8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5Db250ZXh0MDI8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9Db250ZXh0MDI8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5Db250ZXh0MDI8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9XcmFwcGVkQ29udGV4dDAyPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+RGVjb2RpbmcwMTwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L0RlY29kaW5nMDEvKjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkRlY29kaW5nMDE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9XcmFwcGVkRGVjb2RpbmcwMS8qPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+RXJyb3JQYWdlMDE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9FcnJvclBhZ2UwMTwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkVycm9yUGFnZTAxPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZEVycm9yUGFnZTAxPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+RXJyb3JQYWdlMDI8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9FcnJvclBhZ2UwMjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkVycm9yUGFnZTAyPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZEVycm9yUGFnZTAyPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+RXJyb3JQYWdlMDM8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9FcnJvclBhZ2UwMzwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkVycm9yUGFnZTAzPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZEVycm9yUGFnZTAzPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+RXJyb3JQYWdlMDQ8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9FcnJvclBhZ2UwNDwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkVycm9yUGFnZTA0PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZEVycm9yUGFnZTA0PC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+RXJyb3JQYWdlMDU8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9FcnJvclBhZ2UwNTwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkVycm9yUGFnZTA1PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZEVycm9yUGFnZTA1PC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+RXJyb3JQYWdlMDY8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9FcnJvclBhZ2UwNjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkVycm9yUGFnZTA2PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZEVycm9yUGFnZTA2PC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+RXJyb3JQYWdlMDc8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9FcnJvclBhZ2UwNzwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkVycm9yUGFnZTA3PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZEVycm9yUGFnZTA3PC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+RXJyb3JQYWdlMDg8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9FcnJvclBhZ2UwODwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkVycm9yUGFnZTA4PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZEVycm9yUGFnZTA4PC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+RXJyb3JQYWdlMDk8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9FcnJvclBhZ2UwOTwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkVycm9yUGFnZTA5PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZEVycm9yUGFnZTA5PC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+RmlsdGVyUmVxdWVzdDAxPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vRmlsdGVyUmVxdWVzdDAxPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+RmlsdGVyUmVxdWVzdDAxPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZEZpbHRlclJlcXVlc3QwMTwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkZpbHRlclJlcXVlc3QwMjwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L0ZpbHRlclJlcXVlc3QwMi8qPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+RmlsdGVyUmVxdWVzdDAyPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZEZpbHRlclJlcXVlc3QwMi8qPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+RmlsdGVyUmVxdWVzdDAyYTwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L0ZpbHRlclJlcXVlc3QwMmE8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5GaWx0ZXJSZXNwb25zZTAxPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vRmlsdGVyUmVzcG9uc2UwMTwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkZpbHRlclJlc3BvbnNlMDE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9XcmFwcGVkRmlsdGVyUmVzcG9uc2UwMTwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkZpbHRlclJlc3BvbnNlMDQ8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9GaWx0ZXJSZXNwb25zZTA0Lyo8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5GaWx0ZXJSZXNwb25zZTA0PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZEZpbHRlclJlc3BvbnNlMDQvKjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkZpbHRlclJlc3BvbnNlMDRhPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vRmlsdGVyUmVzcG9uc2UwNGE8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5Gb3J3YXJkMDA8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9Gb3J3YXJkMDA8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5Gb3J3YXJkMDA8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9XcmFwcGVkRm9yd2FyZDAwPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+Rm9yd2FyZDAwYTwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L0ZvcndhcmQwMGE8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5Gb3J3YXJkMDBiPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vRm9yd2FyZDAwYjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkZvcndhcmQwMTwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L0ZvcndhcmQwMTwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkZvcndhcmQwMTwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRGb3J3YXJkMDE8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5Gb3J3YXJkMDM8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9Gb3J3YXJkMDM8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5Gb3J3YXJkMDM8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9XcmFwcGVkRm9yd2FyZDAzPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+Rm9yd2FyZDAzYTwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L0ZvcndhcmQwM2E8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5Gb3J3YXJkMDQ8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9Gb3J3YXJkMDQ8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5Gb3J3YXJkMDQ8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9XcmFwcGVkRm9yd2FyZDA0PC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+Rm9yd2FyZDA0YTwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L0ZvcndhcmQwNGE8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5Gb3J3YXJkMDRiPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vRm9yd2FyZDA0YjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkZvcndhcmQwNTwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L0ZvcndhcmQwNTwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkZvcndhcmQwNTwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRGb3J3YXJkMDU8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5Gb3J3YXJkMDVhPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vRm9yd2FyZDA1YTwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkZvcndhcmQwNWI8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9Gb3J3YXJkMDViPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDwhLS0gTm8gbWFwcGluZ3MgZm9yIEZvcndhcmQwNiBzZXJpZXMsIHVzaW5nIGludm9rZXIgdG8gYWNjZXNzIHRoZW0gLS0+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkZvcndhcmQwNzwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L0ZvcndhcmQwNzwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkZvcndhcmQwNzwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRGb3J3YXJkMDc8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5Gb3J3YXJkMDdhPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vRm9yd2FyZDA3YTwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkZvcndhcmQwN2I8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9Gb3J3YXJkMDdiPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+Rm9yd2FyZDA4PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZEZvcndhcmQwODwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkZvcndhcmQwOGE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9Gb3J3YXJkMDhhPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+Rm9yd2FyZDA4Yjwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L0ZvcndhcmQwOGI8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5Gb3J3YXJkMDk8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9Gb3J3YXJkMDk8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5Gb3J3YXJkMDk8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9XcmFwcGVkRm9yd2FyZDA5PC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+R2V0SGVhZGVyczAxPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vR2V0SGVhZGVyczAxPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+R2V0SGVhZGVyczAxPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZEdldEhlYWRlcnMwMTwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkdldElucHV0U3RyZWFtMDE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9HZXRJbnB1dFN0cmVhbTAxPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+R2V0SW5wdXRTdHJlYW0wMTwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRHZXRJbnB1dFN0cmVhbTAxPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+R2V0TG9jYWxlczAxPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vR2V0TG9jYWxlczAxPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+R2V0TG9jYWxlczAxPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZEdldExvY2FsZXMwMTwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkdldExvY2FsZXMwMjwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L0dldExvY2FsZXMwMjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkdldExvY2FsZXMwMjwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRHZXRMb2NhbGVzMDI8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5HZXRQYXJhbWV0ZXIwMTwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRHZXRQYXJhbWV0ZXIwMTwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkdldFBhcmFtZXRlcjAxPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vR2V0UGFyYW1ldGVyMDE8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5HZXRQYXJhbWV0ZXIwMTwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRHZXRQYXJhbWV0ZXIwMTwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkdldFBhcmFtZXRlck1hcDAwPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vR2V0UGFyYW1ldGVyTWFwMDA8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5HZXRQYXJhbWV0ZXJNYXAwMDwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRHZXRQYXJhbWV0ZXJNYXAwMDwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkdldFF1ZXJ5U3RyaW5nMDE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9HZXRRdWVyeVN0cmluZzAxPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+R2V0UXVlcnlTdHJpbmcwMTwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRHZXRRdWVyeVN0cmluZzAxPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+R29sZGVuMDE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9Hb2xkZW4wMTwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkdvbGRlbjAxPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZEdvbGRlbjAxPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+SW5jbHVkZTAwPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vSW5jbHVkZTAwPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+SW5jbHVkZTAwPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZEluY2x1ZGUwMDwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkluY2x1ZGUwMGE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9JbmNsdWRlMDBhPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+SW5jbHVkZTAwYjwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L0luY2x1ZGUwMGI8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5JbmNsdWRlMDE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9JbmNsdWRlMDE8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5JbmNsdWRlMDE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9XcmFwcGVkSW5jbHVkZTAxPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+SW5jbHVkZTAyPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vSW5jbHVkZTAyPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+SW5jbHVkZTAyPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZEluY2x1ZGUwMjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkluY2x1ZGUwMmE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9JbmNsdWRlMDJhPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+SW5jbHVkZTAyYTwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRJbmNsdWRlMDJhPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+SW5jbHVkZTAzPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vSW5jbHVkZTAzPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+SW5jbHVkZTAzPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZEluY2x1ZGUwMzwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkluY2x1ZGUwM2E8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9JbmNsdWRlMDNhPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+SW5jbHVkZTA0PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vSW5jbHVkZTA0PC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+SW5jbHVkZTA0PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZEluY2x1ZGUwNDwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkluY2x1ZGUwNGE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9JbmNsdWRlMDRhPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+SW5jbHVkZTA0Yjwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L0luY2x1ZGUwNGI8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5JbmNsdWRlMDZhPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vSW5jbHVkZTA2YTwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkluY2x1ZGUwNzwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L0luY2x1ZGUwNzwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkluY2x1ZGUwN2E8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9JbmNsdWRlMDdhPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+SW5jbHVkZTA3Yjwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L0luY2x1ZGUwN2I8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5JbmNsdWRlMDdjPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vSW5jbHVkZTA3YzwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkluY2x1ZGUwOTwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L0luY2x1ZGUwOTwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkluY2x1ZGUwOTwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRJbmNsdWRlMDk8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5JbmNsdWRlMTA8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9JbmNsdWRlMTAvKjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkluY2x1ZGUxMDwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRJbmNsdWRlMTAvKjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkluY2x1ZGUxMGE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9JbmNsdWRlMTBhLyo8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5KbmRpMDE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9KbmRpMDE8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5KbmRpMDE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9XcmFwcGVkSm5kaTAxPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+Sm5kaTAyPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vSm5kaTAyPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+Sm5kaTAyPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZEpuZGkwMjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkxpZmVjeWNsZTAxPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vTGlmZWN5Y2xlMDE8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5MaWZlY3ljbGUwMTwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRMaWZlY3ljbGUwMTwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkxpZmVjeWNsZTAyPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vTGlmZWN5Y2xlMDI8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5MaWZlY3ljbGUwMjwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRMaWZlY3ljbGUwMjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkxpZmVjeWNsZTAzPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vTGlmZWN5Y2xlMDM8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5MaWZlY3ljbGUwMzwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRMaWZlY3ljbGUwMzwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPlJlZGlyZWN0MDE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9SZWRpcmVjdDAxPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+UmVkaXJlY3QwMTwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRSZWRpcmVjdDAxPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+UmVkaXJlY3QwMWE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9SZWRpcmVjdDAxYTwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPlJlZGlyZWN0MDFhPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZFJlZGlyZWN0MDFhPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+UmVmbGVjdGlvbjAxPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vUmVmbGVjdGlvbjAxPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+UmVmbGVjdGlvbjAxPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZFJlZmxlY3Rpb24wMTwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPlJlcXVlc3QwMTwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1JlcXVlc3QwMTwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPlJlcXVlc3QwMTwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRSZXF1ZXN0MDE8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5SZXNldDAxPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vUmVzZXQwMTwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPlJlc2V0MDE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9XcmFwcGVkUmVzZXQwMTwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPlJlc291cmNlczAxPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vUmVzb3VyY2VzMDE8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5SZXNvdXJjZXMwMTwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRSZXNvdXJjZXMwMTwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPlJlc291cmNlczAyPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vUmVzb3VyY2VzMDI8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5SZXNvdXJjZXMwMjwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRSZXNvdXJjZXMwMjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPlJlc291cmNlczAzPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vUmVzb3VyY2VzMDM8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5SZXNvdXJjZXMwMzwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRSZXNvdXJjZXMwMzwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPlJlc291cmNlczA0PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vUmVzb3VyY2VzMDQ8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5SZXNvdXJjZXMwNDwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRSZXNvdXJjZXMwNDwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPlJlc291cmNlczA1PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vUmVzb3VyY2VzMDU8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5SZXNvdXJjZXMwNTwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRSZXNvdXJjZXMwNTwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPlJlc291cmNlczA2PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vUmVzb3VyY2VzMDY8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5SZXNvdXJjZXMwNjwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRSZXNvdXJjZXMwNjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPlJlc3BvbnNlV3JhcDAxPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vUmVzcG9uc2VXcmFwMDE8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5SZXNwb25zZVdyYXAwMWE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9SZXNwb25zZVdyYXAwMWE8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5SZXNwb25zZVdyYXAwMWM8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9SZXNwb25zZVdyYXAwMWM8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5TZXNzaW9uMDE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9TZXNzaW9uMDE8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5TZXNzaW9uMDE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9XcmFwcGVkU2Vzc2lvbjAxPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+U2Vzc2lvbjAyPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vU2Vzc2lvbjAyPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+U2Vzc2lvbjAyPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZFNlc3Npb24wMjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPlNlc3Npb24wMzwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1Nlc3Npb24wMzwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPlNlc3Npb24wMzwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRTZXNzaW9uMDM8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5TZXNzaW9uMDQ8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9TZXNzaW9uMDQ8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5TZXNzaW9uMDQ8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9XcmFwcGVkU2Vzc2lvbjA0PC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+U2Vzc2lvbjA1PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vU2Vzc2lvbjA1PC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+U2Vzc2lvbjA1PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZFNlc3Npb24wNTwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPlNlc3Npb24wNjwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1Nlc3Npb24wNjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPlNlc3Npb24wNjwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L1dyYXBwZWRTZXNzaW9uMDY8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5TZXRCdWZmZXJTaXplMDE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9TZXRCdWZmZXJTaXplMDE8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5TZXRCdWZmZXJTaXplMDE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9XcmFwcGVkU2V0QnVmZmVyU2l6ZTAxPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+U2V0TG9jYWxlMDE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9TZXRMb2NhbGUwMTwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPlNldExvY2FsZTAxPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZFNldExvY2FsZTAxPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+WGVyY2VzMDA8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9YZXJjZXMwMDwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPlhlcmNlczAwPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZFhlcmNlczAwPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+WGVyY2VzMDE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9YZXJjZXMwMTwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPlhlcmNlczAxPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZFhlcmNlczAxPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+WGVyY2VzMDI8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9YZXJjZXMwMjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPlhlcmNlczAyPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vV3JhcHBlZFhlcmNlczAyPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworCisgICAgPCEtLSA9PT09PT09PT09IFNlc3Npb24gQ29uZmlndXJhdGlvbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKyAgICA8c2Vzc2lvbi1jb25maWc+CisgICAgICAgIDxzZXNzaW9uLXRpbWVvdXQ+NTwvc2Vzc2lvbi10aW1lb3V0PgorICAgIDwvc2Vzc2lvbi1jb25maWc+CisKKworICAgIDwhLS0gPT09PT09PT09PSBFcnJvciBQYWdlIE1hcHBpbmdzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCisgICAgPGVycm9yLXBhZ2U+CisgICAgICAgIDxlcnJvci1jb2RlPjQxMjwvZXJyb3ItY29kZT4gIDwhLS0gU0NfUFJFQ09ORElUSU9OX0ZBSUxFRCAtLT4KKyAgICAgICAgPGxvY2F0aW9uPi9FcnJvclBhZ2UwMjwvbG9jYXRpb24+CisgICAgPC9lcnJvci1wYWdlPgorCisgICAgPGVycm9yLXBhZ2U+CisgICAgICAgIDxleGNlcHRpb24tdHlwZT5vcmcuYXBhY2hlLnRlc3Rlci5UZXN0ZXJFeGNlcHRpb248L2V4Y2VwdGlvbi10eXBlPgorICAgICAgICA8bG9jYXRpb24+L0Vycm9yUGFnZTA0PC9sb2NhdGlvbj4KKyAgICA8L2Vycm9yLXBhZ2U+CisKKyAgICA8ZXJyb3ItcGFnZT4KKyAgICAgICAgPGV4Y2VwdGlvbi10eXBlPmphdmEubGFuZy5Bcml0aG1ldGljRXhjZXB0aW9uPC9leGNlcHRpb24tdHlwZT4KKyAgICAgICAgPGxvY2F0aW9uPi9FcnJvclBhZ2UwNjwvbG9jYXRpb24+CisgICAgPC9lcnJvci1wYWdlPgorCisgICAgPGVycm9yLXBhZ2U+CisgICAgICAgIDxleGNlcHRpb24tdHlwZT5qYXZhLmxhbmcuQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uPC9leGNlcHRpb24tdHlwZT4KKyAgICAgICAgPGxvY2F0aW9uPi9FcnJvclBhZ2UwNi5qc3A8L2xvY2F0aW9uPgorICAgIDwvZXJyb3ItcGFnZT4KKworICAgIDxlcnJvci1wYWdlPgorICAgICAgICA8ZXhjZXB0aW9uLXR5cGU+amF2YS5sYW5nLk51bWJlckZvcm1hdEV4Y2VwdGlvbjwvZXhjZXB0aW9uLXR5cGU+CisgICAgICAgIDxsb2NhdGlvbj4vRXJyb3JQYWdlMDYuaHRtbDwvbG9jYXRpb24+CisgICAgPC9lcnJvci1wYWdlPgorCisKKyAgICA8IS0tID09PT09PT09PT0gU2VjdXJpdHkgQ29uc3RyYWludHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworICAgIDxzZWN1cml0eS1jb25zdHJhaW50PgorICAgICAgICA8d2ViLXJlc291cmNlLWNvbGxlY3Rpb24+CisgICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+R2VuZXJhbCBQcm90ZWN0ZWQgQXJlYTwvd2ViLXJlc291cmNlLW5hbWU+CisgICAgICAgICAgICA8dXJsLXBhdHRlcm4+L3Byb3RlY3RlZC8qPC91cmwtcGF0dGVybj4KKyAgICAgICAgPC93ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KKyAgICAgICAgPGF1dGgtY29uc3RyYWludD4KKyAgICAgICAgICAgIDxyb2xlLW5hbWU+dG9tY2F0PC9yb2xlLW5hbWU+CisgICAgICAgIDwvYXV0aC1jb25zdHJhaW50PgorICAgIDwvc2VjdXJpdHktY29uc3RyYWludD4KKworICAgIDxzZWN1cml0eS1jb25zdHJhaW50PgorICAgICAgICA8d2ViLXJlc291cmNlLWNvbGxlY3Rpb24+CisgICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+QWxsIFVzZXJzIEFsbG93ZWQgQXJlYTwvd2ViLXJlc291cmNlLW5hbWU+CisgICAgICAgICAgICA8dXJsLXBhdHRlcm4+L2FsbG93ZWQvKjwvdXJsLXBhdHRlcm4+CisgICAgICAgIDwvd2ViLXJlc291cmNlLWNvbGxlY3Rpb24+CisgICAgICAgIDxhdXRoLWNvbnN0cmFpbnQ+CisgICAgICAgICAgICA8cm9sZS1uYW1lPio8L3JvbGUtbmFtZT4KKyAgICAgICAgPC9hdXRoLWNvbnN0cmFpbnQ+CisgICAgPC9zZWN1cml0eS1jb25zdHJhaW50PgorCisgICAgPHNlY3VyaXR5LWNvbnN0cmFpbnQ+CisgICAgICAgIDx3ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KKyAgICAgICAgICAgIDx3ZWItcmVzb3VyY2UtbmFtZT5ObyBVc2VycyBBbGxvd2VkIEFyZWE8L3dlYi1yZXNvdXJjZS1uYW1lPgorICAgICAgICAgICAgPHVybC1wYXR0ZXJuPi9kaXNhbGxvd2VkLyo8L3VybC1wYXR0ZXJuPgorICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgorICAgICAgICA8YXV0aC1jb25zdHJhaW50PgorICAgICAgICA8L2F1dGgtY29uc3RyYWludD4KKyAgICA8L3NlY3VyaXR5LWNvbnN0cmFpbnQ+CisKKyAgICA8bG9naW4tY29uZmlnPgorICAgICAgICA8YXV0aC1tZXRob2Q+QkFTSUM8L2F1dGgtbWV0aG9kPgorICAgICAgICA8cmVhbG0tbmFtZT5BdXRoZW50aWNhdGlvbiBTZXJ2bGV0PC9yZWFsbS1uYW1lPgorICAgIDwvbG9naW4tY29uZmlnPgorCisgICAgPHNlY3VyaXR5LXJvbGU+CisgICAgICAgIDxkZXNjcmlwdGlvbj5TZWN1cml0eSByb2xlIHdlIGFyZSB0ZXN0aW5nIGZvcjwvZGVzY3JpcHRpb24+CisgICAgICAgIDxyb2xlLW5hbWU+dG9tY2F0PC9yb2xlLW5hbWU+CisgICAgPC9zZWN1cml0eS1yb2xlPgorCisKKyAgICA8IS0tID09PT09PT09PT0gRW52aXJvbm1lbnQgRW50cmllcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworICAgIDxlbnYtZW50cnk+CisgICAgICAgIDxlbnYtZW50cnktbmFtZT5ib29sZWFuRW50cnk8L2Vudi1lbnRyeS1uYW1lPgorICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnRydWU8L2Vudi1lbnRyeS12YWx1ZT4KKyAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Cb29sZWFuPC9lbnYtZW50cnktdHlwZT4KKyAgICA8L2Vudi1lbnRyeT4KKworICAgIDxlbnYtZW50cnk+CisgICAgICAgIDxlbnYtZW50cnktbmFtZT5ieXRlRW50cnk8L2Vudi1lbnRyeS1uYW1lPgorICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPjEyMzwvZW52LWVudHJ5LXZhbHVlPgorICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJ5dGU8L2Vudi1lbnRyeS10eXBlPgorICAgIDwvZW52LWVudHJ5PgorCisgICAgPGVudi1lbnRyeT4KKyAgICAgICAgPGVudi1lbnRyeS1uYW1lPmRvdWJsZUVudHJ5PC9lbnYtZW50cnktbmFtZT4KKyAgICAgICAgPGVudi1lbnRyeS12YWx1ZT4xMjMuNDU8L2Vudi1lbnRyeS12YWx1ZT4KKyAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Eb3VibGU8L2Vudi1lbnRyeS10eXBlPgorICAgIDwvZW52LWVudHJ5PgorCisgICAgPGVudi1lbnRyeT4KKyAgICAgICAgPGVudi1lbnRyeS1uYW1lPmZsb2F0RW50cnk8L2Vudi1lbnRyeS1uYW1lPgorICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPjU0LjMyPC9lbnYtZW50cnktdmFsdWU+CisgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuRmxvYXQ8L2Vudi1lbnRyeS10eXBlPgorICAgIDwvZW52LWVudHJ5PgorCisgICAgPGVudi1lbnRyeT4KKyAgICAgICAgPGVudi1lbnRyeS1uYW1lPmludGVnZXJFbnRyeTwvZW52LWVudHJ5LW5hbWU+CisgICAgICAgIDxlbnYtZW50cnktdmFsdWU+MTIzNDU8L2Vudi1lbnRyeS12YWx1ZT4KKyAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9lbnYtZW50cnktdHlwZT4KKyAgICA8L2Vudi1lbnRyeT4KKworICAgIDxlbnYtZW50cnk+CisgICAgICAgIDxlbnYtZW50cnktbmFtZT5sb25nRW50cnk8L2Vudi1lbnRyeS1uYW1lPgorICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPjU0MzIxPC9lbnYtZW50cnktdmFsdWU+CisgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuTG9uZzwvZW52LWVudHJ5LXR5cGU+CisgICAgPC9lbnYtZW50cnk+CisKKyAgICA8ZW52LWVudHJ5PgorICAgICAgICA8ZW52LWVudHJ5LW5hbWU+c3RyaW5nRW50cnk8L2Vudi1lbnRyeS1uYW1lPgorICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPlN0cmluZyBWYWx1ZTwvZW52LWVudHJ5LXZhbHVlPgorICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLlN0cmluZzwvZW52LWVudHJ5LXR5cGU+CisgICAgPC9lbnYtZW50cnk+CisKKyAgICA8ZW52LWVudHJ5PgorICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmVzdGVkL25lc3RlZEVudHJ5PC9lbnYtZW50cnktbmFtZT4KKyAgICAgICAgPGVudi1lbnRyeS12YWx1ZT5OZXN0ZWQgVmFsdWU8L2Vudi1lbnRyeS12YWx1ZT4KKyAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5TdHJpbmc8L2Vudi1lbnRyeS10eXBlPgorICAgIDwvZW52LWVudHJ5PgorCis8L3dlYi1hcHA+CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9XcmFwcGVkRmlsdGVyUmVzcG9uc2UwMi5qc3AgYi9jb250YWluZXIvdGVzdGVyL3dlYi9XcmFwcGVkRmlsdGVyUmVzcG9uc2UwMi5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTViMzYzNAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1dyYXBwZWRGaWx0ZXJSZXNwb25zZTAyLmpzcApAQCAtMCwwICsxIEBACis8JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9wbGFpbiIgJT5GaWx0ZXJSZXNwb25zZTAyIFBBU1NFRApkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvV3JhcHBlZEZpbHRlclJlc3BvbnNlMDMudHh0IGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvV3JhcHBlZEZpbHRlclJlc3BvbnNlMDMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzNWQyMjAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9XcmFwcGVkRmlsdGVyUmVzcG9uc2UwMy50eHQKQEAgLTAsMCArMSBAQAorRmlsdGVyUmVzcG9uc2UwMyBQQVNTRUQKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1hlcmNlczAwLmpzcCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1hlcmNlczAwLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDk0MTAzCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvWGVyY2VzMDAuanNwCkBAIC0wLDAgKzEsOCBAQAorPCEtLSBUaGlzIEZpbGUgaXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkganNwMlhNTCBjb252ZXJ0ZXIgdG9vbCAtLT4gCis8IS0tIFdyaXR0ZW4gQnkgUmFtZXNoIE1hbmRhdmEvU2FudG9zaCBTaW5naCAtLT4KKzxqc3A6cm9vdAoreG1sbnM6anNwPSJodHRwOi8vamF2YS5zdW4uY29tL0pTUC9QYWdlIiB2ZXJzaW9uPSIxLjIiCis+PGpzcDpkaXJlY3RpdmUucGFnZSBjb250ZW50VHlwZT0idGV4dC9wbGFpbiIKKy8+PGpzcDp0ZXh0PjwhW0NEQVRBW1hlcmNlczAwIFBBU1NFRF1dPjwvanNwOnRleHQ+Cis8L2pzcDpyb290PgorCmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9YZXJjZXMwMS54bWwgYi9jb250YWluZXIvdGVzdGVyL3dlYi9YZXJjZXMwMS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDViYmVlMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1hlcmNlczAxLnhtbApAQCAtMCwwICsxLDQwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHBlcnNvbm5lbD4KKworICA8cGVyc29uIGlkPSJCaWcuQm9zcyI+CisgICAgPG5hbWU+PGZhbWlseT5Cb3NzPC9mYW1pbHk+IDxnaXZlbj5CaWc8L2dpdmVuPjwvbmFtZT4KKyAgICA8ZW1haWw+Y2hpZWZAZm9vLmNvbTwvZW1haWw+CisgICAgPGxpbmsgc3Vib3JkaW5hdGVzPSJvbmUud29ya2VyIHR3by53b3JrZXIgdGhyZWUud29ya2VyIGZvdXIud29ya2VyIGZpdmUud29ya2VyIi8+CisgIDwvcGVyc29uPgorCisgIDxwZXJzb24gaWQ9Im9uZS53b3JrZXIiPgorICAgIDxuYW1lPjxmYW1pbHk+V29ya2VyPC9mYW1pbHk+IDxnaXZlbj5PbmU8L2dpdmVuPjwvbmFtZT4KKyAgICA8ZW1haWw+b25lQGZvby5jb208L2VtYWlsPgorICAgIDxsaW5rIG1hbmFnZXI9IkJpZy5Cb3NzIi8+CisgIDwvcGVyc29uPgorCisgIDxwZXJzb24gaWQ9InR3by53b3JrZXIiPgorICAgIDxuYW1lPjxmYW1pbHk+V29ya2VyPC9mYW1pbHk+IDxnaXZlbj5Ud288L2dpdmVuPjwvbmFtZT4KKyAgICA8ZW1haWw+dHdvQGZvby5jb208L2VtYWlsPgorICAgIDxsaW5rIG1hbmFnZXI9IkJpZy5Cb3NzIi8+CisgIDwvcGVyc29uPgorCisgIDxwZXJzb24gaWQ9InRocmVlLndvcmtlciI+CisgICAgPG5hbWU+PGZhbWlseT5Xb3JrZXI8L2ZhbWlseT4gPGdpdmVuPlRocmVlPC9naXZlbj48L25hbWU+CisgICAgPGVtYWlsPnRocmVlQGZvby5jb208L2VtYWlsPgorICAgIDxsaW5rIG1hbmFnZXI9IkJpZy5Cb3NzIi8+CisgIDwvcGVyc29uPgorCisgIDxwZXJzb24gaWQ9ImZvdXIud29ya2VyIj4KKyAgICA8bmFtZT48ZmFtaWx5PldvcmtlcjwvZmFtaWx5PiA8Z2l2ZW4+Rm91cjwvZ2l2ZW4+PC9uYW1lPgorICAgIDxlbWFpbD5mb3VyQGZvby5jb208L2VtYWlsPgorICAgIDxsaW5rIG1hbmFnZXI9IkJpZy5Cb3NzIi8+CisgIDwvcGVyc29uPgorCisgIDxwZXJzb24gaWQ9ImZpdmUud29ya2VyIj4KKyAgICA8bmFtZT48ZmFtaWx5PldvcmtlcjwvZmFtaWx5PiA8Z2l2ZW4+Rml2ZTwvZ2l2ZW4+PC9uYW1lPgorICAgIDxlbWFpbD5maXZlQGZvby5jb208L2VtYWlsPgorICAgIDxsaW5rIG1hbmFnZXI9IkJpZy5Cb3NzIi8+CisgIDwvcGVyc29uPgorCis8L3BlcnNvbm5lbD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1hlcmNlczAyLmpzcCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL1hlcmNlczAyLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTE4OTg4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvWGVyY2VzMDIuanNwCkBAIC0wLDAgKzEgQEAKKzwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L3BsYWluIiU+WGVyY2VzMDIgUEFTU0VECmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vRW5jb2RpbmcwMS50eHQgYi9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vRW5jb2RpbmcwMS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTEzN2Q4ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9FbmNvZGluZzAxLnR4dApAQCAtMCwwICsxLDUgQEAKKworCisKKzxoMj5UZXN0IENoYXJhY3RlcjwvaDI+Cis8aDI+i5sgVW5pY29kZSA9IDliNWE8L2hyPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL0VuY29kaW5nMDIudHh0IGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL0VuY29kaW5nMDIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkYzcwNzYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vRW5jb2RpbmcwMi50eHQKQEAgLTAsMCArMSw5IEBACis8aHRtbD4KKzxoZWFkPgorPHRpdGxlPkVuY29kaW5nMDIuanNwPC90aXRsZT4KKzwvaGVhZD4KKzxib2R5IGJnY29sb3I9IndoaXRlIj4KK1RoaXMgaXMgbGVnYWwgaW4gdGhlIHNwZWM6PGJyPgorSm9lIHNhaWQgJT4gZm9vLgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL0VuY29kaW5nMDMudHh0IGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL0VuY29kaW5nMDMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjNDc2MjgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vRW5jb2RpbmcwMy50eHQKQEAgLTAsMCArMSw5IEBACis8aHRtbD4KKzxoZWFkPgorPHRpdGxlPkVuY29kaW5nMDMuanNwPC90aXRsZT4KKzwvaGVhZD4KKzxib2R5IGJnY29sb3I9IndoaXRlIj4KK1RoaXMgaXMgbm90IHJlY29nbml6ZWQgYXMgYSBkZWxpbWl0ZXIgZWl0aGVyOjxicj4KK0pvZSBzYWlkICVcPiBiYXIuCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vR29sZGVuMDEudHh0IGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL0dvbGRlbjAxLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjA3MzQwCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL0dvbGRlbjAxLnR4dApAQCAtMCwwICsxLDMgQEAKK1RoaXMgaXMgdGhlCitmaXJzdCBnb2xkZW4gZmlsZQordG8gYmUgdGVzdGVkLgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL0luY2x1ZGUwNi50eHQgYi9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vSW5jbHVkZTA2LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWNlZjc5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL0luY2x1ZGUwNi50eHQKQEAgLTAsMCArMSw1IEBACis9PT09PT09PT09CitJbmNsdWRlMDZhIG91dHB1dAorPT09PT09PT09PQorSW5jbHVkZTA2Yi5qc3Agb3V0cHV0Cis9PT09PT09PT09CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vSW5jbHVkZTA3LnR4dCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9JbmNsdWRlMDcudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NmQyNGEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vSW5jbHVkZTA3LnR4dApAQCAtMCwwICsxLDQgQEAKK091dHB1dCBmcm9tIEluY2x1ZGUwNworT3V0cHV0IGZyb20gSW5jbHVkZTA3YgorT3V0cHV0IGZyb20gSW5jbHVkZTA3YworT3V0cHV0IGZyb20gSW5jbHVkZTA3CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vSnNwRG9jMDEudHh0IGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL0pzcERvYzAxLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTdiYjYyCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL0pzcERvYzAxLnR4dApAQCAtMCwwICsxIEBACis8YT50ZXh0PGIvPjwvYT48YT50ZXh0PGI+PC9iPjwvYT48Yz48ZD50ZXh0PC9kPjwvYz48Yz48ZD50ZXh0PC9kPjwvYz48ZT48Zi8+dGV4dDxmLz48L2U+PGU+PGY+PC9mPnRleHQ8Zj48L2Y+PC9lPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL0pzcERvYzAyLnR4dCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9Kc3BEb2MwMi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFiYzNiZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9Kc3BEb2MwMi50eHQKQEAgLTAsMCArMSw5IEBACis8aHRtbD48aGVhZD48dGl0bGU+RXhhbXBsZSBKU1AgaW4gWE1MIGZvcm1hdDwvdGl0bGU+PC9oZWFkPjxib2R5PgorVGhpcyBpcyB0aGUgb3V0cHV0IG9mIGEgc2ltcGxlIEpTUCB1c2luZyBYTUwgZm9ybWF0LiAKKzxici8+PGRpdj5Vc2UgYSBqc3A6c2NyaXB0bGV0IHRvIGxvb3AgZnJvbSAxIHRvIDEwOiA8L2Rpdj4xLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMAorICA8YnI+PGJyPgorPGRpdiBhbGlnbj0ibGVmdCI+CisgIFVzZSBhIGpzcDpleHByZXNzaW9uIHRvIHdyaXRlIHNvbWV0aGluZzogCisgIGZvbzwvZGl2PgorICA8cD5UaGlzIHNlbnRlbmNlIGlzIGVuY2xvc2VkIGluIGEganNwOnRleHQgZWxlbWVudC48L3A+Cis8L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9Kc3BJbmNsdWRlMDEudHh0IGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL0pzcEluY2x1ZGUwMS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNlN2ViMgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9Kc3BJbmNsdWRlMDEudHh0CkBAIC0wLDAgKzEsNSBAQAorVGhpcyBpcyBiZWZvcmUgdGhlIGluY2x1ZGUKK1RoaXMgaXMgdGhlIGluY2x1ZGUKKworVGhpcyBpcyBhZnRlciB0aGUgaW5jbHVkZQorCmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vSnNwSW5jbHVkZTAxYS50eHQgYi9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vSnNwSW5jbHVkZTAxYS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhiYjI4MgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9Kc3BJbmNsdWRlMDFhLnR4dApAQCAtMCwwICsxLDYgQEAKK1RoaXMgaXMgYmVmb3JlIHRoZSBpbmNsdWRlCitJbmNsdWRlMDBhIFBBU1NFRFNlc3Npb25MaXN0ZW5lcjAxOiBzZXNzaW9uQ3JlYXRlZCgpCitTZXNzaW9uTGlzdGVuZXIwMjogc2Vzc2lvbkNyZWF0ZWQoKQorCitUaGlzIGlzIGFmdGVyIHRoZSBpbmNsdWRlCisKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9Kc3BJbmNsdWRlMDIudHh0IGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL0pzcEluY2x1ZGUwMi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNlN2ViMgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9Kc3BJbmNsdWRlMDIudHh0CkBAIC0wLDAgKzEsNSBAQAorVGhpcyBpcyBiZWZvcmUgdGhlIGluY2x1ZGUKK1RoaXMgaXMgdGhlIGluY2x1ZGUKKworVGhpcyBpcyBhZnRlciB0aGUgaW5jbHVkZQorCmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vSnNwSW5jbHVkZTAyYS50eHQgYi9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vSnNwSW5jbHVkZTAyYS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhiYjI4MgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9Kc3BJbmNsdWRlMDJhLnR4dApAQCAtMCwwICsxLDYgQEAKK1RoaXMgaXMgYmVmb3JlIHRoZSBpbmNsdWRlCitJbmNsdWRlMDBhIFBBU1NFRFNlc3Npb25MaXN0ZW5lcjAxOiBzZXNzaW9uQ3JlYXRlZCgpCitTZXNzaW9uTGlzdGVuZXIwMjogc2Vzc2lvbkNyZWF0ZWQoKQorCitUaGlzIGlzIGFmdGVyIHRoZSBpbmNsdWRlCisKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9Qcm9wZXJ0eTAxLnR4dCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9Qcm9wZXJ0eTAxLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTQ0MGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL1Byb3BlcnR5MDEudHh0CkBAIC0wLDAgKzEsMTAgQEAKKzxodG1sPgorPGhlYWQ+Cis8dGl0bGU+UHJvcGVydHkwMS5qc3AgLSBQb3NpdGl2ZSBQcm9wZXJ0eUVkaXRvciBUZXN0PC90aXRsZT4KKzwvaGVhZD4KKzxib2R5IGJnY29sb3I9IndoaXRlIj4KKworCitEYXRlIHByb3BlcnR5IGlzICcyMDAxLTA3LTI1Jy4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9TU0lDb25kaXRpb25hbDAxLnR4dCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9TU0lDb25kaXRpb25hbDAxLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODBjYmFiCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL1NTSUNvbmRpdGlvbmFsMDEudHh0CkBAIC0wLDAgKzEsNiBAQAorQmVmb3JlIGlmIGJsb2NrLgorCisKK3Rlc3QgPSB2YWx1ZTEKKworQWZ0ZXIgaWYgYmxvY2suCmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vU1NJQ29uZGl0aW9uYWwwMi50eHQgYi9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vU1NJQ29uZGl0aW9uYWwwMi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk3MDFiYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9TU0lDb25kaXRpb25hbDAyLnR4dApAQCAtMCwwICsxLDYgQEAKK0JlZm9yZSBpZiBibG9jay4KKworCit0ZXN0ID0gdmFsdWUyCisKK0FmdGVyIGlmIGJsb2NrLgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL1NTSUNvbmRpdGlvbmFsMDMudHh0IGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL1NTSUNvbmRpdGlvbmFsMDMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1MTQyYzMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vU1NJQ29uZGl0aW9uYWwwMy50eHQKQEAgLTAsMCArMSw2IEBACitCZWZvcmUgaWYgYmxvY2suCisKKwordGVzdCA9ICJ1bnF1b3RlZCBtdWx0aS13b3JkIHZhbHVlIgorCitBZnRlciBpZiBibG9jay4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9TU0lDb25kaXRpb25hbDA0LnR4dCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9TU0lDb25kaXRpb25hbDA0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjM3YzZmCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL1NTSUNvbmRpdGlvbmFsMDQudHh0CkBAIC0wLDAgKzEsNiBAQAorCisKKworCit0cnVlCisKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9TU0lDb25kaXRpb25hbDA1LnR4dCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9TU0lDb25kaXRpb25hbDA1LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDM1NmVhCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL1NTSUNvbmRpdGlvbmFsMDUudHh0CkBAIC0wLDAgKzEsNiBAQAorCisKKworCitmYWxzZQorCmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vU1NJQ29uZGl0aW9uYWwwNi50eHQgYi9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vU1NJQ29uZGl0aW9uYWwwNi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y5YjkzZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9TU0lDb25kaXRpb25hbDA2LnR4dApAQCAtMCwwICsxLDggQEAKKworCisKKworCitub3Qgb25lCisKKwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL1NTSUNvbmRpdGlvbmFsMDcudHh0IGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL1NTSUNvbmRpdGlvbmFsMDcudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3MzMyODcKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vU1NJQ29uZGl0aW9uYWwwNy50eHQKQEAgLTAsMCArMSw4IEBACisKKworCisKKworbm90IHR3bworCisKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9TU0lDb25kaXRpb25hbDA4LnR4dCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9TU0lDb25kaXRpb25hbDA4LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWJlZDg2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL1NTSUNvbmRpdGlvbmFsMDgudHh0CkBAIC0wLDAgKzEsNSBAQAorCisKKworCit0d28KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9TU0lDb25maWcwMS50eHQgYi9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vU1NJQ29uZmlnMDEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiZjNjNjAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vU1NJQ29uZmlnMDEudHh0CkBAIC0wLDAgKzEsMiBAQAorCitlcnJtc2c6U29ycnkgdGhpcyBjb21tYW5kIHdvbid0IHdvcmsuCmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vU1NJQ29uZmlnMDMudHh0IGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL1NTSUNvbmZpZzAzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWI5MmJhCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL1NTSUNvbmZpZzAzLnR4dApAQCAtMCwwICsxLDQgQEAKKworMzQKKworICAgMWsKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9TU0lFeGVjQ0dJLnR4dCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9TU0lFeGVjQ0dJLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGI1YTA0Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL1NTSUV4ZWNDR0kudHh0CkBAIC0wLDAgKzEsNDEgQEAKKzxodG1sPiAKKyAgPGhlYWQ+IAorIDx0aXRsZT5leGVjIGNvbW1hbmQgIHRlc3QgZXhhbXBsZXMgPC90aXRsZT4gCisgPC9oZWFkPiAKKyA8Ym9keT4KKworIFRoZXNlIGFyZSB0aGUgZGF5cyBvZiB0aGUgd2Vlazo8cD5Nb25kYXkgVHVlc2RheSBXZWRuZXNkYXkgVGh1cnNkYXkgRnJpZGF5IFNhdHVyZGF5IFN1bmRheTxicj4KKworIDxGT05UIFNJWkU9KzI+SWYgeW91IGFkZCBvbmUgdG8geW91ciBudW1iZXIsIHRoZSByZXN1bHQgaXMgPEI+MTAzPC9CPjxQPklmIHlvdSBhZGQgNSB0byB0aGF0LCB0aGUgcmVzdWx0IGlzIDxCPjEwODwvQj48L0ZPTlQ+PGJyPgorCisgPFA+T24gV2VkbmVzZGF5LCB3ZSBoYXZlIHRvIG1vcDxQPk9uIEZyaWRheSwgd2UgaGF2ZSB0byB3YXNoIHdpbmRvd3M8UD5PbiBNb25kYXksIHdlIGhhdmUgdG8gdmFjdXVtPGJyPgorCisgQ29uZ3JhdHVsYXRpb25zISBZb3VyIG1hcnJpZWQgbmFtZSB3b3VsZCBiZSBqYW5lIHNtaXRoLjxicj4KKworIFRoZXNlIGFyZSB0aGUgZGF5cyBvZiB0aGUgd2Vlazo8UD5Nb25kYXkgVHVlc2RheSBXZWRuZXNkYXkgVGh1cnNkYXkgRnJpZGF5IFNhdHVyZGF5IFN1bmRheTxicj4KKworIDxQPlN0YXJ0aW5nIGNvdW50ZG93bi4uLjEwLi4uIDkuLi4gOC4uLiA3Li4uIDYuLi4gNS4uLiA0Li4uIDMuLi4gMi4uLiAxLi4uIEtBQk9PTSE8YnI+CisKKyBZb3UgYXRlIHNwaW5hY2gsIHNvIHlvdSBnZXQgZGVzc2VydCE8YnI+CisKKyBObyBzcGluYWNoLCBubyBkZXNzZXJ0ITxicj4KKworIDxQPllvdSBlbnRlcmVkIDIgd2l0aCBhbiBleHBvbmVudCBvZiA0PFA+MiByYWlzZWQgdG8gdGhlIDQgcG93ZXIgaXMgMTYuPGJyPgorCisgPFA+U3RhcnRpbmcgY291bnRkb3duLi4uMTAuLi4gOS4uLiA4Li4uIDcuLi4gNi4uLiA1Li4uIDQuLi4gMy4uLiAyLi4uIDEuLi4gS0FCT09NITxicj4KKworIFRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsgaXMgU3VuZGF5PFA+VGhlIHRoaXJkIGRheSBvZiB0aGUgd2VlayBpcyBUdWVzZGF5PGJyPgorCisgCTxUaXRsZT4gSGVsbG8gV29ybGQhIDwvVGl0bGU+CisJPEgxPglIZWxsbyBXb3JsZCEgPC9IMT4KKzxicj4KKworIFlvdSBhdGUgc3BpbmFjaCwgc28geW91IGdldCBkZXNzZXJ0IQorPGJyPgorCisgWW91ciBudW1iZXIgaW5jcmVtZW50ZWQgYnkgMSBpcyA4PEJSPllvdXIgbnVtYmVyLCBpbmNyZW1lbnRlZCBhZ2FpbiBieSAxLCBpcyBub3cgOS4gSWYgd2Ugc3RvcmUgdGhhdCBvcGVyYXRpb24sIGl0cyB2YWx1ZSBpcyBhbHNvIDkuPEhSPkxldCdzIHN0YXJ0IG92ZXIsIHdpdGggeW91ciBvcmlnaW5hbCBudW1iZXIgNzxCUj5BZ2FpbiwgeW91ciBudW1iZXIgaW5jcmVtZW50ZWQgYnkgMSBpcyA4PEJSPk5vdyB3ZSBzdG9yZSB0aGUgdmFsdWUgb2YgeW91ciBudW1iZXIgaW4gYSBzZWNvbmQgdmFyaWFibGUsIHdoaWNoIGlzIG5vdyBlcXVhbCB0byA4LCBhbmQgdGhlbiB3ZSBpbmNyZW1lbnQgeW91ciBudW1iZXIgYWdhaW4uIEl0J3Mgbm93IDkuPGJyPgorCisgVGhlIG51bWJlcnMgeW91IGVudGVyZWQgd2VyZTo8TEk+Mjg5PFA+VGhlIHNxdWFyZSByb290cyBvZiB0aG9zZSBudW1iZXJzIGFyZTogPExJPjE3PGJyPgorCisgPC9ib2R5PiAKKyA8L2h0bWw+CmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vU1NJRnNpemUwMi50eHQgYi9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vU1NJRnNpemUwMi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU2NGEyNQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9TU0lGc2l6ZTAyLnR4dApAQCAtMCwwICsxIEBACisgICAxawpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL1NTSUluY2x1ZGUwMS50eHQgYi9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vU1NJSW5jbHVkZTAxLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjEzNzg5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL1NTSUluY2x1ZGUwMS50eHQKQEAgLTAsMCArMSBAQAorCmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vU1NJSW5jbHVkZTAyLnR4dCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9TU0lJbmNsdWRlMDIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViYzlkOGEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vU1NJSW5jbHVkZTAyLnR4dApAQCAtMCwwICsxIEBACitUaGlzIGlzIENvbnRlbnQgb2YgImluY2x1ZGVtZS50eHQiCmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vU1NJSW5jbHVkZTAzLnR4dCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9TU0lJbmNsdWRlMDMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiMDU0MjAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vU1NJSW5jbHVkZTAzLnR4dApAQCAtMCwwICsxLDQgQEAKK1RoaXMgaXMgQ29udGVudCBvZiAiaW5jbHVkZW1lLnR4dCIKK1RoaXMgaXMgQ29udGVudCBvZiAiaW5jbHVkZW1lLnR4dCIKKworVGhpcyBpcyBDb250ZW50IG9mICJpbmNsdWRlbWUudHh0IgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL1NTSVZhclN1YjAxLnR4dCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9TU0lWYXJTdWIwMS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RkZWM2OQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9TU0lWYXJTdWIwMS50eHQKQEAgLTAsMCArMSwzIEBACisKKy9TU0lWYXJTdWIwMS5zaHRtbAorCmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vU1NJVmFyU3ViMDIudHh0IGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL1NTSVZhclN1YjAyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzE3ZjE4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL1NTSVZhclN1YjAyLnR4dApAQCAtMCwwICsxLDQgQEAKKworCit2YWx1ZSBvZiB0ZXN0CisKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9TU0lWYXJTdWIwMy50eHQgYi9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vU1NJVmFyU3ViMDMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3NTA1ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vU1NJVmFyU3ViMDMudHh0CkBAIC0wLDAgKzEsNSBAQAorCisKKwordmFsdWUgb2YgdGVzdCB2YWx1ZSBvZiB0ZXN0MgorCmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vU1NJVmFyU3ViMDQudHh0IGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL1NTSVZhclN1YjA0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2Q3NTM4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL1NTSVZhclN1YjA0LnR4dApAQCAtMCwwICsxLDUgQEAKKworCisKK3ZhbHVlIG9mIHRlc3R8dmFsdWUgb2YgdGVzdDIKKwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL1NTSVZhclN1YjA1LnR4dCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9TU0lWYXJTdWIwNS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRmYjNhMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9TU0lWYXJTdWIwNS50eHQKQEAgLTAsMCArMSwzIEBACisKKwordmFsdWUgb2YgdGVzdFwke3Rlc3QyfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL1Nlc3Npb24wNS50eHQgYi9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vU2Vzc2lvbjA1LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODI4ZjdmCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL1Nlc3Npb24wNS50eHQKQEAgLTAsMCArMSwxMCBAQAorU2Vzc2lvbkxpc3RlbmVyMDE6IHNlc3Npb25DcmVhdGVkKCkKK1Nlc3Npb25MaXN0ZW5lcjAyOiBzZXNzaW9uQ3JlYXRlZCgpCitTZXNzaW9uTGlzdGVuZXIwMTogYXR0cmlidXRlQWRkZWQoYXR0cmlidXRlMSx2YWx1ZTEpCitTZXNzaW9uTGlzdGVuZXIwMjogYXR0cmlidXRlQWRkZWQoYXR0cmlidXRlMSx2YWx1ZTEpCitTZXNzaW9uTGlzdGVuZXIwMTogYXR0cmlidXRlUmVwbGFjZWQoYXR0cmlidXRlMSx2YWx1ZTEpCitTZXNzaW9uTGlzdGVuZXIwMjogYXR0cmlidXRlUmVwbGFjZWQoYXR0cmlidXRlMSx2YWx1ZTEpCitTZXNzaW9uTGlzdGVuZXIwMTogYXR0cmlidXRlUmVtb3ZlZChhdHRyaWJ1dGUxLHZhbHVlMikKK1Nlc3Npb25MaXN0ZW5lcjAyOiBhdHRyaWJ1dGVSZW1vdmVkKGF0dHJpYnV0ZTEsdmFsdWUyKQorU2Vzc2lvbkxpc3RlbmVyMDI6IHNlc3Npb25EZXN0cm95ZWQoKQorU2Vzc2lvbkxpc3RlbmVyMDE6IHNlc3Npb25EZXN0cm95ZWQoKQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL1dyYXBwZWRTZXNzaW9uMDUudHh0IGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL1dyYXBwZWRTZXNzaW9uMDUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkZTlkOWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vV3JhcHBlZFNlc3Npb24wNS50eHQKQEAgLTAsMCArMSwxMyBAQAorVGVzdGVySHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlci5nZXRTZXNzaW9uKGIpCitTZXNzaW9uTGlzdGVuZXIwMTogc2Vzc2lvbkNyZWF0ZWQoKQorU2Vzc2lvbkxpc3RlbmVyMDI6IHNlc3Npb25DcmVhdGVkKCkKK1Nlc3Npb25MaXN0ZW5lcjAxOiBhdHRyaWJ1dGVBZGRlZChhdHRyaWJ1dGUxLHZhbHVlMSkKK1Nlc3Npb25MaXN0ZW5lcjAyOiBhdHRyaWJ1dGVBZGRlZChhdHRyaWJ1dGUxLHZhbHVlMSkKK1Nlc3Npb25MaXN0ZW5lcjAxOiBhdHRyaWJ1dGVSZXBsYWNlZChhdHRyaWJ1dGUxLHZhbHVlMSkKK1Nlc3Npb25MaXN0ZW5lcjAyOiBhdHRyaWJ1dGVSZXBsYWNlZChhdHRyaWJ1dGUxLHZhbHVlMSkKK1Nlc3Npb25MaXN0ZW5lcjAxOiBhdHRyaWJ1dGVSZW1vdmVkKGF0dHJpYnV0ZTEsdmFsdWUyKQorU2Vzc2lvbkxpc3RlbmVyMDI6IGF0dHJpYnV0ZVJlbW92ZWQoYXR0cmlidXRlMSx2YWx1ZTIpCitTZXNzaW9uTGlzdGVuZXIwMjogc2Vzc2lvbkRlc3Ryb3llZCgpCitTZXNzaW9uTGlzdGVuZXIwMTogc2Vzc2lvbkRlc3Ryb3llZCgpCitUZXN0ZXJIdHRwU2VydmxldFJlc3BvbnNlV3JhcHBlci5zZXRDb250ZW50VHlwZSgpCitUZXN0ZXJIdHRwU2VydmxldFJlc3BvbnNlV3JhcHBlci5nZXRXcml0ZXIoKQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL2FycmF5LnR4dCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9hcnJheS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU4Yjc4YgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9hcnJheS50eHQKQEAgLTAsMCArMSBAQAorVGhlc2UgYXJlIHRoZSBkYXlzIG9mIHRoZSB3ZWVrOjxwPk1vbmRheSBUdWVzZGF5IFdlZG5lc2RheSBUaHVyc2RheSBGcmlkYXkgU2F0dXJkYXkgU3VuZGF5ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL2JpbmFyeS50eHQgYi9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vYmluYXJ5LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmYyNzExCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL2JpbmFyeS50eHQKQEAgLTAsMCArMSBAQAorPEZPTlQgU0laRT0rMj5JZiB5b3UgYWRkIG9uZSB0byB5b3VyIG51bWJlciwgdGhlIHJlc3VsdCBpcyA8Qj4xMDM8L0I+PFA+SWYgeW91IGFkZCA1IHRvIHRoYXQsIHRoZSByZXN1bHQgaXMgPEI+MTA4PC9CPjwvRk9OVD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vY29uY2F0LnR4dCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9jb25jYXQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxMWU3ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vY29uY2F0LnR4dApAQCAtMCwwICsxIEBACitDb25ncmF0dWxhdGlvbnMhIFlvdXIgbWFycmllZCBuYW1lIHdvdWxkIGJlIGphbmUgc21pdGguCmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vZGF5cy50eHQgYi9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vZGF5cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNlMDg3YwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9kYXlzLnR4dApAQCAtMCwwICsxIEBACitUaGVzZSBhcmUgdGhlIGRheXMgb2YgdGhlIHdlZWs6PFA+TW9uZGF5IFR1ZXNkYXkgV2VkbmVzZGF5IFRodXJzZGF5IEZyaWRheSBTYXR1cmRheSBTdW5kYXkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vZG93aGlsZS50eHQgYi9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vZG93aGlsZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA3NWQ5NQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9kb3doaWxlLnR4dApAQCAtMCwwICsxIEBACis8UD5TdGFydGluZyBjb3VudGRvd24uLi4xMC4uLiA5Li4uIDguLi4gNy4uLiA2Li4uIDUuLi4gNC4uLiAzLi4uIDIuLi4gMS4uLiBLQUJPT00hClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL2Vsc2UudHh0IGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL2Vsc2UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwMTlhMDIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vZWxzZS50eHQKQEAgLTAsMCArMSBAQAorWW91IGF0ZSBzcGluYWNoLCBzbyB5b3UgZ2V0IGRlc3NlcnQhCmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vZWxzaWYudHh0IGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL2Vsc2lmLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGNiMTI3Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL2Vsc2lmLnR4dApAQCAtMCwwICsxIEBACitObyBzcGluYWNoLCBubyBkZXNzZXJ0IQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL2V4cG9uZW50cy50eHQgYi9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vZXhwb25lbnRzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmY0N2U2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL2V4cG9uZW50cy50eHQKQEAgLTAsMCArMSBAQAorPFA+WW91IGVudGVyZWQgMiB3aXRoIGFuIGV4cG9uZW50IG9mIDQ8UD4yIHJhaXNlZCB0byB0aGUgNCBwb3dlciBpcyAxNi4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vZ2V0ZGF5LnR4dCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9nZXRkYXkudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwYWI5YWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9nb2xkZW4vZ2V0ZGF5LnR4dApAQCAtMCwwICsxIEBACitUaGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrIGlzIFN1bmRheTxQPlRoZSB0aGlyZCBkYXkgb2YgdGhlIHdlZWsgaXMgVHVlc2RheQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9oZWxsb3BlcmwudHh0IGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL2hlbGxvcGVybC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU0YmZiMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9oZWxsb3BlcmwudHh0CkBAIC0wLDAgKzEsMiBAQAorCTxUaXRsZT4gSGVsbG8gV29ybGQhIDwvVGl0bGU+CisJPEgxPglIZWxsbyBXb3JsZCEgPC9IMT4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9pbmNyZW1lbnQudHh0IGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL2luY3JlbWVudC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VjZTYyOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9pbmNyZW1lbnQudHh0CkBAIC0wLDAgKzEgQEAKK1lvdXIgbnVtYmVyIGluY3JlbWVudGVkIGJ5IDEgaXMgODxCUj5Zb3VyIG51bWJlciwgaW5jcmVtZW50ZWQgYWdhaW4gYnkgMSwgaXMgbm93IDkuIElmIHdlIHN0b3JlIHRoYXQgb3BlcmF0aW9uLCBpdHMgdmFsdWUgaXMgYWxzbyA5LjxIUj5MZXQncyBzdGFydCBvdmVyLCB3aXRoIHlvdXIgb3JpZ2luYWwgbnVtYmVyIDc8QlI+QWdhaW4sIHlvdXIgbnVtYmVyIGluY3JlbWVudGVkIGJ5IDEgaXMgODxCUj5Ob3cgd2Ugc3RvcmUgdGhlIHZhbHVlIG9mIHlvdXIgbnVtYmVyIGluIGEgc2Vjb25kIHZhcmlhYmxlLCB3aGljaCBpcyBub3cgZXF1YWwgdG8gOCwgYW5kIHRoZW4gd2UgaW5jcmVtZW50IHlvdXIgbnVtYmVyIGFnYWluLiBJdCdzIG5vdyA5LgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9tb2RpZnlhbGwudHh0IGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL21vZGlmeWFsbC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM1NzU1NwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9tb2RpZnlhbGwudHh0CkBAIC0wLDAgKzEgQEAKK1RoZSBudW1iZXJzIHlvdSBlbnRlcmVkIHdlcmU6PExJPjI4OTxQPlRoZSBzcXVhcmUgcm9vdHMgb2YgdGhvc2UgbnVtYmVycyBhcmU6IDxMST4xNwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9wcmVmZXJlbmNlLnR4dCBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL2dvbGRlbi9wcmVmZXJlbmNlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGNkYzE2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvZ29sZGVuL3ByZWZlcmVuY2UudHh0CkBAIC0wLDAgKzEgQEAKK2RpdiBpcyAxMSwgcGFyZW5zIGlzIDUsIHN1YmFkZCBpcyAxMSBhbmQgcGFyZW5zX3N1YmFkZCBpcyAxClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvaW5jbHVkZW1lLnNodG1sIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvaW5jbHVkZW1lLnNodG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzMmNkNzAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvdGVzdGVyL3dlYi9pbmNsdWRlbWUuc2h0bWwKQEAgLTAsMCArMSBAQAorVGhpcyBpcyBDb250ZW50IG9mICJpbmNsdWRlbWUuc2h0bWwiCmRpZmYgLS1naXQgYS9jb250YWluZXIvdGVzdGVyL3dlYi9pbmNsdWRlbWUudHh0IGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvaW5jbHVkZW1lLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTcxMjk2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvaW5jbHVkZW1lLnR4dApAQCAtMCwwICsxIEBACitUaGlzIGlzIENvbnRlbnQgb2YgImluY2x1ZGVtZS50eHQiClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3Rlc3Rlci93ZWIvaW5kZXguc2h0bWwgYi9jb250YWluZXIvdGVzdGVyL3dlYi9pbmRleC5zaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzJjYjE2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvaW5kZXguc2h0bWwKQEAgLTAsMCArMSwxMzkgQEAKKzxodG1sPiAKKyA8aGVhZD4gCisgPHRpdGxlPkNvbmZpZyBjb21tYW5kIGV4YW1wbGVzIDwvdGl0bGU+CisgPC9oZWFkPiAKKyA8Ym9keSBiZ2NvbG9yPXdoaXRlPiAKKworCitTZXR0aW5nIGVycm9ybXNnIHVzaW5nOiAmbHQ7IS0tI2NvbmZpZyBlcnJtc2c9Ii4uLiIgLS0mZ3Q7IDxicj4KKzwhLS0jY29uZmlnIGVycm1zZz0iZXJyb3Jtc2c6IFNvcnJ5IHRoaXMgY29tbWFuZCB3b24ndCB3b3JrLiIgLS0+IAorCitUcnlpbmcgdG8gYWNjZXNzIG5vbi1leGlzdGVudCAiZm9vLnNodG1sIiB1c2luZyAgCismbHQ7IS0tI2ZzaXplIGZpbGU9ImZvby5zaHRtbCIgLS0mZ3Q7Cis8YnI+CisKKzwhLS0jZnNpemUgZmlsZT0iZm9vLnNodG1sIiAtLT4KKzxicj4KKzxicj4KKworVXNpbmcgJmx0OyEtLSNjb25maWcgc2l6ZWZtdD0iYnl0ZXMiIC0tJmd0OworPGJyPgorICAgICAgICAgICAgICBUaGlzIGZpbGUgKCBpbmRleC5zaHRtbDo6c2l6ZS0+IDI2NjUpIGlzIAorIDwhLS0jY29uZmlnIHNpemVmbXQ9ImJ5dGVzIiAtLT4gCisgPCEtLSNmc2l6ZSBmaWxlPSJpbmRleC5zaHRtbCIgLS0+CisgICAgICAgICAgICAgIGJ5dGVzIGluIHNpemUuIAorCis8YnI+Cis8YnI+CisgIFNldHRpbmcgc2l6ZWZtdCB0byBhYmJyZXYgdXNpbmcgOiAmbHQ7IS0tI2NvbmZpZyBzaXplZm10PSJhYmJyZXYiIC0tJmd0OworPGJyPgorCisKKzwhLS0jY29uZmlnIHNpemVmbXQ9ImFiYnJldiIgLS0+CisKK1NpemUgb2YgZmlsZSAiaW5kZXguc2h0bWwgKCBzaXplLT4yNjY1KSIgdXNpbmcgc2l6ZWZtdD1hYmJyZXYgLT4KKzwhLS0jZnNpemUgICBmaWxlPSJpbmRleC5zaHRtbCIgLS0+CisKKzxicj4gPGJyPgorU2l6ZSBvZiBmaWxlICJzYXZlaW5kZXguc2h0bWwoc2l6ZS0+NDY0KSIgdXNpbmcgIDogJmx0OyEtLSNmc2l6ZSBmaWxlPSJzYXZlaW5kZXguc2h0bWwiIC0tJmd0OyAgLT4KKzwhLS0jZnNpemUgICBmaWxlPSJzYXZlaW5kZXguc2h0bWwiIC0tPgorPGJyPjxicj4KKworU2l6ZSBvZiBmaWxlICJjaGVjazEuc2h0bWwoc2l6ZS0+MTAwMCkiIHVzaW5nICA6ICZsdDshLS0jZnNpemUgZmlsZT0iY2hlY2sxLnNodG1sIiAtLSZndDsgIC0+Cis8IS0tI2ZzaXplICAgZmlsZT0iY2hlY2sxLnNodG1sIiAtLT4KKzxicj48YnI+CisKK1NpemUgb2YgZmlsZSAiY2hlY2syLmh0bWwoc2l6ZS0+MTAwMSkiIHVzaW5nICA6ICZsdDshLS0jZnNpemUgZmlsZT0iY2hlY2syLmh0bWwiIC0tJmd0OyAgLT4KKzwhLS0jZnNpemUgICBmaWxlPSJjaGVjazIuaHRtbCIgLS0+Cis8YnI+PGJyPgorCitTaXplIG9mIGZpbGUgImNoZWNrMy5zaHRtbChzaXplLT4xNDk5KSIgdXNpbmcgIDogJmx0OyEtLSNmc2l6ZSBmaWxlPSJjaGVjazMuc2h0bWwiIC0tJmd0OyAgLT4KKzwhLS0jZnNpemUgICBmaWxlPSJjaGVjazMuc2h0bWwiIC0tPgorPGJyPjxicj4KKworU2l6ZSBvZiBmaWxlICJjaGVjazQuc2h0bWwoc2l6ZS0+MTUwMCkiIHVzaW5nICA6ICZsdDshLS0jZnNpemUgZmlsZT0iY2hlY2s0LnNodG1sIiAtLSZndDsgIC0+Cis8IS0tI2ZzaXplICAgZmlsZT0iY2hlY2s0LnNodG1sIiAtLT4KKzxicj48YnI+CisKK1NpemUgb2YgZmlsZSAiY2hlY2s1LnNodG1sKHNpemUtPjE1MDEpIiB1c2luZyAgOiAmbHQ7IS0tI2ZzaXplIGZpbGU9ImNoZWNrNS5zaHRtbCIgLS0mZ3Q7ICAtPgorPCEtLSNmc2l6ZSAgIGZpbGU9ImNoZWNrNS5zaHRtbCIgLS0+Cis8YnI+PGJyPgorCitTaXplIG9mIGZpbGUgImNoZWNrbWUgKCBzaXplLT4xNTM1KSIgdXNpbmcgOiAmbHQ7IS0tI2ZzaXplIGZpbGUiY2hlY2ttZSIgLS0mZ3Q7IC0+IAorPCEtLSNmc2l6ZSAgIGZpbGU9ImNoZWNrbWUiIC0tPgorPGJyPjxicj4KKworU2l6ZSBvZiBmaWxlICJjaGVjazUuaHRtbChzaXplLT4xNTM2KSIgdXNpbmcgIDogJmx0OyEtLSNmc2l6ZSBmaWxlPSJjaGVjazUuaHRtbCIgLS0mZ3Q7ICAtPgorPCEtLSNmc2l6ZSAgIGZpbGU9ImNoZWNrNS5odG1sIiAtLT4KKzxicj48YnI+CisKK1NpemUgb2YgZmlsZSAiY2hlY2s1NS5odG1sKHNpemUtPjE1MzcpIiB1c2luZyAgOiAmbHQ7IS0tI2ZzaXplIGZpbGU9ImNoZWNrNTUuaHRtbCIgLS0mZ3Q7ICAtPgorPCEtLSNmc2l6ZSAgIGZpbGU9ImNoZWNrNTUuaHRtbCIgLS0+Cis8YnI+PGJyPgorCitTaXplIG9mIGZpbGUgImNoZWNrNTU1Lmh0bWwoc2l6ZS0+MTUzOCkiIHVzaW5nICA6ICZsdDshLS0jZnNpemUgZmlsZT0iY2hlY2s1NTUuaHRtbCIgLS0mZ3Q7ICAtPgorPCEtLSNmc2l6ZSAgIGZpbGU9ImNoZWNrNTU1Lmh0bWwiIC0tPgorPGJyPjxicj4KKworU2l6ZSBvZiBmaWxlICJjaGVjazU1NTUuaHRtbChzaXplLT4xNTM5KSIgdXNpbmcgIDogJmx0OyEtLSNmc2l6ZSBmaWxlPSJjaGVjazU1NTUuaHRtbCIgLS0mZ3Q7ICAtPgorPCEtLSNmc2l6ZSAgIGZpbGU9ImNoZWNrNTU1NS5odG1sIiAtLT4KKzxicj48YnI+CisKK1NpemUgb2YgZmlsZSAiY2hlY2s2LnNodG1sKHNpemUtPjE5ODgpIiB1c2luZyAgOiAmbHQ7IS0tI2ZzaXplIGZpbGU9ImNoZWNrNi5zaHRtbCIgLS0mZ3Q7ICAtPgorPCEtLSNmc2l6ZSAgIGZpbGU9ImNoZWNrNi5zaHRtbCIgLS0+Cis8YnI+PGJyPgorCitTaXplIG9mIGZpbGUgImNoZWNrNy5zaHRtbChzaXplLT4xOTk5KSIgdXNpbmcgIDogJmx0OyEtLSNmc2l6ZSBmaWxlPSJjaGVjazcuc2h0bWwiIC0tJmd0OyAgLT4KKzwhLS0jZnNpemUgICBmaWxlPSJjaGVjazcuc2h0bWwiIC0tPgorPGJyPjxicj4KKyA8cD4gCisKKworCisKKyA8Rk9OVCBTSVpFPSsyIENvbG9yPWJsdWU+IHRpbWVmbXQgVGVzdHMgOiA8L0ZPTlQ+CisKKzxicj4gPGJyPgorICBVc2luZyAmbHQ7IS0tI2NvbmZpZyB0aW1lZm10PSIlQSIgLS0mZ3Q7IAorICAgICAgICAgICZsdDshLS0jZWNobyB2YXI9IkRBVEVfTE9DQUwiIC0tJmd0OworPGJyPgorICBEYXkgLT4gIDwhLS0jY29uZmlnIHRpbWVmbXQ9IiVBIiAtLT4KKyAgICAgICAgICAgICAgPCEtLSNlY2hvIHZhcj0iREFURV9MT0NBTCIgLS0+LCAKKzxicj4gPGJyPgorICBVc2luZyAmbHQ7IS0tI2NvbmZpZyB0aW1lZm10PSIlZCIgLS0mZ3Q7PGJyPgorICAgICAgICAgICZsdDshLS0jZWNobyB2YXI9IkRBVEVfTE9DQUwiIC0tJmd0OyAKKyAgPGJyPgorICBEYXkgb2YgTW9udGggLT4gPCEtLSNjb25maWcgdGltZWZtdD0iJWQiIC0tPgorICAgICAgICAgICAgICA8IS0tI2VjaG8gdmFyPSJEQVRFX0xPQ0FMIiAtLT4gCisKKyA8YnI+IDxicj4KKyAgVXNpbmcgJmx0OyEtLSNjb25maWcgdGltZWZtdD0iJUIiIC0tJmd0Ozxicj4KKyAgICAgICAgICAmbHQ7IS0tI2VjaG8gdmFyPSJEQVRFX0xPQ0FMIiAtLSZndDsgCisgIDxicj4KKyAgTW9udGgoZnVsbCkgLT4gPCEtLSNjb25maWcgdGltZWZtdD0iJUIiIC0tPiAKKwkJPCEtLSNlY2hvIHZhcj0iREFURV9MT0NBTCIgLS0+IAorCisgIDxicj4gPGJyPgorICBVc2luZyAmbHQ7IS0tI2NvbmZpZyB0aW1lZm10PSIlYiIgLS0mZ3Q7PGJyPgorICAgICAgICAgICZsdDshLS0jZWNobyB2YXI9IkRBVEVfTE9DQUwiIC0tJmd0OyAKKyAgPGJyPgorICBNb250aChhYmJyZXZpYXRlZCkgLT4gPCEtLSNjb25maWcgdGltZWZtdD0iJWIiIC0tPiAKKwkJCTwhLS0jZWNobyB2YXI9IkRBVEVfTE9DQUwiIC0tPiAKKworICA8YnI+IDxicj4KKyAgVXNpbmcgJmx0OyEtLSNjb25maWcgdGltZWZtdD0iJVkiIC0tJmd0Ozxicj4KKyAgICAgICAgICAmbHQ7IS0tI2VjaG8gdmFyPSJEQVRFX0xPQ0FMIiAtLSZndDsgCisgIDxicj4KKyAgIFllYXIgLT4gIDwhLS0jY29uZmlnIHRpbWVmbXQ9IiVZIgorICAgICAgICAgICAgICAtLT4gPCEtLSNlY2hvIHZhcj0iREFURV9MT0NBTCIgLS0+LiAKKworICA8YnI+IDxicj4KKyAgVXNpbmcgJmx0OyEtLSNjb25maWcgdGltZWZtdD0iJVciIC0tJmd0Ozxicj4KKyAgICAgICAgICAmbHQ7IS0tI2VjaG8gdmFyPSJEQVRFX0xPQ0FMIiAtLSZndDsgCisKKyAgPGJyPgorICBXZWVrIG51bWJlciBvZiB5ZWFyIGFzIGEgZGVjaW1hbCAgbnVtYmVyOiA8IS0tI2NvbmZpZyB0aW1lZm10PSIlVyIgLS0+IAorCQkJCQk8IS0tI2VjaG8gdmFyPSJEQVRFX0xPQ0FMIiAtLT4uIAorCis8L2JvZHk+IAorPC9odG1sPiAKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci90ZXN0ZXIvd2ViL3NzaWRpci9pbmNsdWRlbWUudHh0IGIvY29udGFpbmVyL3Rlc3Rlci93ZWIvc3NpZGlyL2luY2x1ZGVtZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk3MTI5NgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci90ZXN0ZXIvd2ViL3NzaWRpci9pbmNsdWRlbWUudHh0CkBAIC0wLDAgKzEgQEAKK1RoaXMgaXMgQ29udGVudCBvZiAiaW5jbHVkZW1lLnR4dCIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy8uY3ZzaWdub3JlIGIvY29udGFpbmVyL3dlYmFwcHMvLmN2c2lnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDBiNzFhCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvLmN2c2lnbm9yZQpAQCAtMCwwICsxLDIgQEAKK2J1aWxkCitkaXN0CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9ST09UL1dFQi1JTkYvd2ViLnhtbCBiL2NvbnRhaW5lci93ZWJhcHBzL1JPT1QvV0VCLUlORi93ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3OWVjODcKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9ST09UL1dFQi1JTkYvd2ViLnhtbApAQCAtMCwwICsxLDI4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Cis8IS0tCisgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzx3ZWItYXBwIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgorICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvd2ViLWFwcF8yXzQueHNkIgorICAgIHZlcnNpb249IjIuNCI+CisKKyAgPGRpc3BsYXktbmFtZT5XZWxjb21lIHRvIFRvbWNhdDwvZGlzcGxheS1uYW1lPgorICA8ZGVzY3JpcHRpb24+CisgICAgIFdlbGNvbWUgdG8gVG9tY2F0CisgIDwvZGVzY3JpcHRpb24+CisKKzwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL1JPT1QvYWRtaW4vaW5kZXguaHRtbCBiL2NvbnRhaW5lci93ZWJhcHBzL1JPT1QvYWRtaW4vaW5kZXguaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDk0YjYxCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvUk9PVC9hZG1pbi9pbmRleC5odG1sCkBAIC0wLDAgKzEsMTQgQEAKKzwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy9lbiIgImh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAvc3RyaWN0LmR0ZCI+Cis8aHRtbD4KKyAgICA8aGVhZD4KKyAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKyAgICA8dGl0bGU+QWRtaW5pc3RyYXRpb248L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keT4KKworVG9tY2F0J3MgYWRtaW5pc3RyYXRpb24gd2ViIGFwcGxpY2F0aW9uIGlzIG5vIGxvbmdlciBpbnN0YWxsZWQgYnkgZGVmYXVsdC4gRG93bmxvYWQgYW5kIGluc3RhbGwgCit0aGUgImFkbWluIiBwYWNrYWdlIHRvIHVzZSBpdC4KKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvUk9PVC9idWlsZC54bWwgYi9jb250YWluZXIvd2ViYXBwcy9ST09UL2J1aWxkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjI0MzgwCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvUk9PVC9idWlsZC54bWwKQEAgLTAsMCArMSw3NiBAQAorPHByb2plY3QgbmFtZT0iUk9PVCIgZGVmYXVsdD0iYnVpbGQtbWFpbiIgYmFzZWRpcj0iLiI+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PSBJbml0aWFsaXplIFByb3BlcnR5IFZhbHVlcyA9PT09PT09PT09PT09PT09PT09IC0tPgorCisgIDwhLS0gU2VlICJidWlsZC5wcm9wZXJ0aWVzLnNhbXBsZSIgaW4gdGhlIHRvcCBsZXZlbCBkaXJlY3RvcnkgZm9yIGFsbCAgICAgLS0+CisgIDwhLS0gcHJvcGVydHkgdmFsdWVzIHlvdSBtdXN0IGN1c3RvbWl6ZSBmb3Igc3VjY2Vzc2Z1bCBidWlsZGluZyEhISAgICAgICAgLS0+CisgIDxwcm9wZXJ0eSBmaWxlPSJidWlsZC5wcm9wZXJ0aWVzIi8+CisgIDxwcm9wZXJ0eSBmaWxlPSIuLi9idWlsZC5wcm9wZXJ0aWVzIi8+CisgIDxwcm9wZXJ0eSBmaWxlPSIuLi8uLi9idWlsZC5wcm9wZXJ0aWVzIi8+CisgIDxwcm9wZXJ0eSBmaWxlPSIke3VzZXIuaG9tZX0vYnVpbGQucHJvcGVydGllcyIvPgorCisgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5jb21waWxlciIgIHZhbHVlPSJtb2Rlcm4iLz4KKyAgPHByb3BlcnR5IG5hbWU9IndlYmFwcHMuYnVpbGQiICAgdmFsdWU9Ii4uL2J1aWxkIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJ3ZWJhcHBzLmRpc3QiICAgIHZhbHVlPSIuLi9kaXN0Ii8+CisgIDxwcm9wZXJ0eSBuYW1lPSJ3ZWJhcHAubmFtZSIgICAgIHZhbHVlPSJST09UIi8+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT0gQlVJTEQ6IENyZWF0ZSBEaXJlY3RvcmllcyA9PT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImJ1aWxkLXByZXBhcmUiPgorICAgIDxta2RpciBkaXI9IiR7d2ViYXBwcy5idWlsZH0iLz4KKyAgICA8bWtkaXIgZGlyPSIke3dlYmFwcHMuYnVpbGR9LyR7d2ViYXBwLm5hbWV9Ii8+CisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09IEJVSUxEOiBDb3B5IFN0YXRpYyBGaWxlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJidWlsZC1zdGF0aWMiIGRlcGVuZHM9ImJ1aWxkLXByZXBhcmUiPgorICAgIDxjb3B5IHRvZGlyPSIke3dlYmFwcHMuYnVpbGR9LyR7d2ViYXBwLm5hbWV9Ij4KKyAgICAgIDxmaWxlc2V0IGRpcj0iLiI+CisgICAgICAgIDxleGNsdWRlIG5hbWU9ImJ1aWxkLioiLz4KKyAgICAgIDwvZmlsZXNldD4KKyAgICA8L2NvcHk+CisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PSBCVUlMRDogQ29tcGlsZSBTZXJ2ZXIgQ29tcG9uZW50cyA9PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJidWlsZC1tYWluIiBkZXBlbmRzPSJidWlsZC1zdGF0aWMiLz4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT0gQlVJTEQ6IFJlYnVpbGQgRXZlcnl0aGluZyA9PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iYWxsIiBkZXBlbmRzPSJidWlsZC1jbGVhbixidWlsZC1tYWluIgorICAgZGVzY3JpcHRpb249IkNsZWFuIGFuZCBidWlsZCBST09UIHdlYmFwcCIvPgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PSBCVUlMRDogQ2xlYW4gRGlyZWN0b3J5ID09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJidWlsZC1jbGVhbiI+CisgICAgPGRlbGV0ZSBkaXI9IiR7d2ViYXBwcy5idWlsZH0vJHt3ZWJhcHAubmFtZX0iLz4KKyAgPC90YXJnZXQ+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09IERJU1Q6IENyZWF0ZSBEaXJlY3RvcmllcyA9PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImRpc3QtcHJlcGFyZSI+CisgICAgPG1rZGlyIGRpcj0iJHt3ZWJhcHBzLmRpc3R9Ii8+CisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PSBESVNUOiBDcmVhdGUgRGlzdHJpYnV0aW9uIEZpbGVzID09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJkaXN0IiBkZXBlbmRzPSJidWlsZC1tYWluLGRpc3QtcHJlcGFyZSIKKyAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgUk9PVCB3ZWJhcHAgYmluYXJ5IGRpc3RyaWJ1dGlvbiI+CisgICAgICA8amFyICAgamFyZmlsZT0iJHt3ZWJhcHBzLmRpc3R9LyR7d2ViYXBwLm5hbWV9LndhciIKKyAgICAgICAgICAgICBiYXNlZGlyPSIke3dlYmFwcHMuYnVpbGR9LyR7d2ViYXBwLm5hbWV9IiBpbmNsdWRlcz0iKioiLz4KKyAgPC90YXJnZXQ+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09IERJU1Q6IENsZWFuIERpcmVjdG9yeSA9PT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImRpc3QtY2xlYW4iPgorICAgIDxkZWxldGUgZGlyPSIke3dlYmFwcHMuZGlzdH0vJHt3ZWJhcHAubmFtZX0iLz4KKyAgPC90YXJnZXQ+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PT0gQ29udmVuaWVudCBTeW5vbnltcyA9PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImNsZWFuIiBkZXBlbmRzPSJidWlsZC1jbGVhbixkaXN0LWNsZWFuIgorICAgZGVzY3JpcHRpb249IkNsZWFuIGJ1aWxkIGFuZCBkaXN0IGRpcmVjdG9yaWVzIi8+CisKKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvUk9PVC9pbmRleC5qc3AgYi9jb250YWluZXIvd2ViYXBwcy9ST09UL2luZGV4LmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzlmM2U3Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvUk9PVC9pbmRleC5qc3AKQEAgLTAsMCArMSwxOTIgQEAKKzwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy9lbiIgImh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAvc3RyaWN0LmR0ZCI+Cis8JUAgcGFnZSBzZXNzaW9uPSJmYWxzZSIgJT4KKzxodG1sPgorICAgIDxoZWFkPgorICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorICAgIDx0aXRsZT48JT0gYXBwbGljYXRpb24uZ2V0U2VydmVySW5mbygpICU+PC90aXRsZT4KKyAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorICAgICAgPCEtLQorICAgICAgICBib2R5IHsKKyAgICAgICAgICAgIGNvbG9yOiAjMDAwMDAwOworICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRjsKKyAgICAgICAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzOworICAgICAgICAgICAgZm9udC1zaXplOiAxNnB4OworICAgICAgICB9CisKKyAgICAgICAgQTpsaW5rIHsKKyAgICAgICAgICAgIGNvbG9yOiBibHVlCisgICAgICAgIH0KKworICAgICAgICBBOnZpc2l0ZWQgeworICAgICAgICAgICAgY29sb3I6IGJsdWUKKyAgICAgICAgfQorCisgICAgICAgIHRkIHsKKyAgICAgICAgICAgIGNvbG9yOiAjMDAwMDAwOworICAgICAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXM7CisgICAgICAgICAgICBmb250LXNpemU6IDE2cHg7CisgICAgICAgIH0KKworICAgICAgICAuY29kZSB7CisgICAgICAgICAgICBjb2xvcjogIzAwMDAwMDsKKyAgICAgICAgICAgIGZvbnQtZmFtaWx5OiAiQ291cmllciBOZXciLCBDb3VyaWVyOworICAgICAgICAgICAgZm9udC1zaXplOiAxNnB4OworICAgICAgICB9CisgICAgICAtLT4KKyAgICA8L3N0eWxlPgorPC9oZWFkPgorCis8Ym9keT4KKworPCEtLSBIZWFkZXIgLS0+Cis8dGFibGUgd2lkdGg9IjEwMCUiPgorICAgIDx0cj4KKyAgICAgICAgPHRkIGFsaWduPSJsZWZ0IiB3aWR0aD0iMTMwIj48YSBocmVmPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3RvbWNhdC9pbmRleC5odG1sIj48aW1nIHNyYz0idG9tY2F0LmdpZiIgaGVpZ2h0PSI5MiIgd2lkdGg9IjEzMCIgYm9yZGVyPSIwIiBhbHQ9IlRoZSBNaWdodHkgVG9tY2F0IC0gTUVPVyEiPjwvdGQ+CisgICAgICAgIDx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgorICAgICAgICAgICAgPHRhYmxlPgorICAgICAgICAgICAgICAgIDx0cj48dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj48Yj48JT0gYXBwbGljYXRpb24uZ2V0U2VydmVySW5mbygpICU+PC9iPjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPjxhIGhyZWY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvIj48aW1nIHNyYz0iamFrYXJ0YS1iYW5uZXIuZ2lmIiBoZWlnaHQ9IjQ4IiB3aWR0aD0iNTA1IiBib3JkZXI9IjAiIGFsdD0iVGhlIEpha2FydGEgUHJvamVjdCI+PC9hPjwvdGQ+CisgICAgPC90cj4KKzwvdGFibGU+CisKKzxicj4KKworPHRhYmxlPgorICAgIDx0cj4KKworICAgICAgICA8IS0tIFRhYmxlIG9mIENvbnRlbnRzIC0tPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgorICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjEiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyIgYm9yZGVyY29sb3I9IiMwMDAwMDAiPgorICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgPHRkIGJnY29sb3I9IiNEMkE0MUMiIGJvcmRlcmNvbG9yPSIjMDAwMDAwIiBhbGlnbj0ibGVmdCIgbm93cmFwPgorICAgICAgICAgICAgICAgICAgICAgICAgPGZvbnQgZmFjZT0iVmVyZGFuYSIgc2l6ZT0iKzEiPjxpPkFkbWluaXN0cmF0aW9uPC9pPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvZm9udD4KKyAgICAgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgPHRkIGJnY29sb3I9IiNGRkRDNzUiIGJvcmRlcmNvbG9yPSIjMDAwMDAwIiBub3dyYXA+CisgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJtYW5hZ2VyL3N0YXR1cyI+U3RhdHVzPC9hPjxicj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9ImFkbWluIj5Ub21jYXQgQWRtaW5pc3RyYXRpb248L2E+PGJyPgorICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0ibWFuYWdlci9odG1sIj5Ub21jYXQgTWFuYWdlcjwvYT48YnI+CisgICAgICAgICAgICAgICAgICAgICAgICAmbmJzcDsKKyAgICAgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgIDxicj4KKyAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIxIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiIGJvcmRlcmNvbG9yPSIjMDAwMDAwIj4KKyAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgIDx0ZCBiZ2NvbG9yPSIjRDJBNDFDIiBib3JkZXJjb2xvcj0iIzAwMDAwMCIgYWxpZ249ImxlZnQiIG5vd3JhcD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxmb250IGZhY2U9IlZlcmRhbmEiIHNpemU9IisxIj48aT5Eb2N1bWVudGF0aW9uPC9pPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvZm9udD4KKyAgICAgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgPHRkIGJnY29sb3I9IiNGRkRDNzUiIGJvcmRlcmNvbG9yPSIjMDAwMDAwIiBub3dyYXA+CisgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJSRUxFQVNFLU5PVEVTLnR4dCI+UmVsZWFzZSBOb3RlczwvYT48YnI+CisgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJ0b21jYXQtZG9jcy9jaGFuZ2Vsb2cuaHRtbCI+Q2hhbmdlIExvZzwvYT48YnI+CisgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJ0b21jYXQtZG9jcyI+VG9tY2F0IERvY3VtZW50YXRpb248L2E+PGJyPgorICAgICAgICAgICAgICAgICAgICAgICAgJm5ic3A7CisgICAgICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICA8YnI+CisgICAgICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIiBib3JkZXJjb2xvcj0iIzAwMDAwMCI+CisgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICA8dGQgYmdjb2xvcj0iI0QyQTQxQyIgYm9yZGVyY29sb3I9IiMwMDAwMDAiIGFsaWduPSJsZWZ0IiBub3dyYXA+CisgICAgICAgICAgICAgICAgICAgICAgICA8Zm9udCBmYWNlPSJWZXJkYW5hIiBzaXplPSIrMSI+PGk+VG9tY2F0IE9ubGluZTwvaT4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L2ZvbnQ+CisgICAgICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgIDx0ZCBiZ2NvbG9yPSIjRkZEQzc1IiBib3JkZXJjb2xvcj0iIzAwMDAwMCIgbm93cmFwPgorICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy90b21jYXQvIj5Ib21lIFBhZ2U8L2E+PGJyPgorICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy90b21jYXQvYnVncmVwb3J0Lmh0bWwiPkJ1ZyBEYXRhYmFzZTwvYT48YnI+CisgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvYnVnemlsbGEvYnVnbGlzdC5jZ2k/YnVnX3N0YXR1cz1VTkNPTkZJUk1FRCZhbXA7YnVnX3N0YXR1cz1ORVcmYW1wO2J1Z19zdGF0dXM9QVNTSUdORUQmYW1wO2J1Z19zdGF0dXM9UkVPUEVORUQmYW1wO2J1Z19zdGF0dXM9UkVTT0xWRUQmYW1wO3Jlc29sdXRpb249TEFURVImYW1wO3Jlc29sdXRpb249UkVNSU5EJmFtcDtyZXNvbHV0aW9uPS0tLSZhbXA7ZW1haWwxPSZhbXA7ZW1haWx0eXBlMT1zdWJzdHJpbmcmYW1wO2VtYWlsYXNzaWduZWRfdG8xPTEmYW1wO2VtYWlsMj0mYW1wO2VtYWlsdHlwZTI9c3Vic3RyaW5nJmFtcDtlbWFpbHJlcG9ydGVyMj0xJmFtcDtidWdpZHR5cGU9aW5jbHVkZSZhbXA7YnVnX2lkPSZhbXA7Y2hhbmdlZGluPSZhbXA7dm90ZXM9JmFtcDtjaGZpZWxkZnJvbT0mYW1wO2NoZmllbGR0bz1Ob3cmYW1wO2NoZmllbGR2YWx1ZT0mYW1wO3Byb2R1Y3Q9VG9tY2F0KzUmYW1wO3Nob3J0X2Rlc2M9JmFtcDtzaG9ydF9kZXNjX3R5cGU9YWxsd29yZHNzdWJzdHImYW1wO2xvbmdfZGVzYz0mYW1wO2xvbmdfZGVzY190eXBlPWFsbHdvcmRzc3Vic3RyJmFtcDtidWdfZmlsZV9sb2M9JmFtcDtidWdfZmlsZV9sb2NfdHlwZT1hbGx3b3Jkc3N1YnN0ciZhbXA7a2V5d29yZHM9JmFtcDtrZXl3b3Jkc190eXBlPWFueXdvcmRzJmFtcDtmaWVsZDAtMC0wPW5vb3AmYW1wO3R5cGUwLTAtMD1ub29wJmFtcDt2YWx1ZTAtMC0wPSZhbXA7Y21kdHlwZT1kb2l0JmFtcDtvcmRlcj0lMjdJbXBvcnRhbmNlJTI3Ij5PcGVuIEJ1Z3M8L2E+PGJyPgorICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL25hZ295YS5hcGFjaGUub3JnL2V5ZWJyb3dzZS9TdW1tYXJpemVMaXN0P2xpc3RJZD04OCI+VXNlcnMgTWFpbGluZyBMaXN0PC9hPjxicj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9uYWdveWEuYXBhY2hlLm9yZy9leWVicm93c2UvU3VtbWFyaXplTGlzdD9saXN0SWQ9NDYiPkRldmVsb3BlcnMgTWFpbGluZyBMaXN0PC9hPjxicj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9ImlyYzovL2lyYy5mcmVlbm9kZS5uZXQvI3RvbWNhdCI+SVJDPC9hPjxicj4KKyAgICAgICAgICAgICAgICAgICAgICAgICZuYnNwOworICAgICAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgPGJyPgorICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjEiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyIgYm9yZGVyY29sb3I9IiMwMDAwMDAiPgorICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgPHRkIGJnY29sb3I9IiNEMkE0MUMiIGJvcmRlcmNvbG9yPSIjMDAwMDAwIiBhbGlnbj0ibGVmdCIgbm93cmFwPgorICAgICAgICAgICAgICAgICAgICAgICAgPGZvbnQgZmFjZT0iVmVyZGFuYSIgc2l6ZT0iKzEiPjxpPkV4YW1wbGVzPC9pPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvZm9udD4KKyAgICAgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgPHRkIGJnY29sb3I9IiNGRkRDNzUiIGJvcmRlcmNvbG9yPSIjMDAwMDAwIiBub3dyYXA+CisgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJqc3AtZXhhbXBsZXMvIj5KU1AgRXhhbXBsZXM8L2E+PGJyPgorICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0ic2VydmxldHMtZXhhbXBsZXMvIj5TZXJ2bGV0IEV4YW1wbGVzPC9hPjxicj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IndlYmRhdi8iPldlYkRBViBjYXBhYmlsaXRpZXM8L2E+PGJyPgorICAgICAgICAgICAgICAgICAgICAgICAgJm5ic3A7CisgICAgICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICA8YnI+CisgICAgICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIiBib3JkZXJjb2xvcj0iIzAwMDAwMCI+CisgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICA8dGQgYmdjb2xvcj0iI0QyQTQxQyIgYm9yZGVyY29sb3I9IiMwMDAwMDAiIGFsaWduPSJsZWZ0IiBub3dyYXA+CisgICAgICAgICAgICAgICAgICAgICAgICA8Zm9udCBmYWNlPSJWZXJkYW5hIiBzaXplPSIrMSI+PGk+TWlzY2VsbGFuZW91czwvaT4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L2ZvbnQ+CisgICAgICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgIDx0ZCBiZ2NvbG9yPSIjRkZEQzc1IiBib3JkZXJjb2xvcj0iIzAwMDAwMCIgbm93cmFwPgorICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9qc3AiPlN1bidzIEphdmEgU2VydmVyIFBhZ2VzIFNpdGU8L2E+PGJyPgorICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9zZXJ2bGV0Ij5TdW4ncyBTZXJ2bGV0IFNpdGU8L2E+PGJyPgorICAgICAgICAgICAgICAgICAgICAgICAgJm5ic3A7CisgICAgICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgIDwvdGQ+CisKKyAgICAgICAgPHRkPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+CisKKyAgICAgICAgPCEtLSBCb2R5IC0tPgorICAgICAgICA8dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KKyAgICAgICAgICAgIDxwPjxjZW50ZXI+PGI+SWYgeW91J3JlIHNlZWluZyB0aGlzIHBhZ2UgdmlhIGEgd2ViIGJyb3dzZXIsIGl0IG1lYW5zIHlvdSd2ZSBzZXR1cCBUb21jYXQgc3VjY2Vzc2Z1bGx5LiBDb25ncmF0dWxhdGlvbnMhPC9iPjwvY2VudGVyPjwvcD4KKworICAgICAgICAgICAgPHA+QXMgeW91IG1heSBoYXZlIGd1ZXNzZWQgYnkgbm93LCB0aGlzIGlzIHRoZSBkZWZhdWx0IFRvbWNhdCBob21lIHBhZ2UuIEl0IGNhbiBiZSBmb3VuZCBvbiB0aGUgbG9jYWwgZmlsZXN5c3RlbSBhdDoKKyAgICAgICAgICAgIDxibG9ja3F1b3RlPgorICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJjb2RlIj4kQ0FUQUxJTkFfSE9NRS93ZWJhcHBzL1JPT1QvaW5kZXguanNwPC9wPgorICAgICAgICAgICAgPC9ibG9ja3F1b3RlPgorICAgICAgICAgICAgPC9wPgorCisgICAgICAgICAgICA8cD53aGVyZSAiJENBVEFMSU5BX0hPTUUiIGlzIHRoZSByb290IG9mIHRoZSBUb21jYXQgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeS4gSWYgeW91J3JlIHNlZWluZyB0aGlzIHBhZ2UsIGFuZCB5b3UgZG9uJ3QgdGhpbmsgeW91IHNob3VsZCBiZSwgdGhlbiBlaXRoZXIgeW91J3JlIGVpdGhlciBhIHVzZXIgd2hvIGhhcyBhcnJpdmVkIGF0IG5ldyBpbnN0YWxsYXRpb24gb2YgVG9tY2F0LCBvciB5b3UncmUgYW4gYWRtaW5pc3RyYXRvciB3aG8gaGFzbid0IGdvdCBoaXMvaGVyIHNldHVwIHF1aXRlIHJpZ2h0LiBQcm92aWRpbmcgdGhlIGxhdHRlciBpcyB0aGUgY2FzZSwgcGxlYXNlIHJlZmVyIHRvIHRoZSA8YSBocmVmPSJ0b21jYXQtZG9jcyI+VG9tY2F0IERvY3VtZW50YXRpb248L2E+IGZvciBtb3JlIGRldGFpbGVkIHNldHVwIGFuZCBhZG1pbmlzdHJhdGlvbiBpbmZvcm1hdGlvbiB0aGFuIGlzIGZvdW5kIGluIHRoZSBJTlNUQUxMIGZpbGUuPC9wPgorCisgICAgICAgICAgICA8cD48Yj5OT1RFOjwvYj4gVGhpcyBwYWdlIGlzIHByZWNvbXBpbGVkLiBJZiB5b3UgY2hhbmdlIGl0LCB0aGlzIHBhZ2Ugd2lsbCBub3QgY2hhbmdlIHNpbmNlCisgICAgICAgICAgICAgICAgICBpdCB3YXMgY29tcGlsZWQgaW50byBhIHNlcnZsZXQgYXQgYnVpbGQgdGltZS4KKyAgICAgICAgICAgICAgICAgIChTZWUgPHR0PiRDQVRBTElOQV9IT01FL3dlYmFwcHMvUk9PVC9XRUItSU5GL3dlYi54bWw8L3R0PiBhcyB0byBob3cgaXQgd2FzIG1hcHBlZC4pCisgICAgICAgICAgICA8L3A+CisKKyAgICAgICAgICAgIDxwPjxiPk5PVEU6IEZvciBzZWN1cml0eSByZWFzb25zLCB1c2luZyB0aGUgYWRtaW5pc3RyYXRpb24gd2ViYXBwCisgICAgICAgICAgICBpcyByZXN0cmljdGVkIHRvIHVzZXJzIHdpdGggcm9sZSAiYWRtaW4iLiBUaGUgbWFuYWdlciB3ZWJhcHAKKyAgICAgICAgICAgIGlzIHJlc3RyaWN0ZWQgdG8gdXNlcnMgd2l0aCByb2xlICJtYW5hZ2VyIi48L2I+CisgICAgICAgICAgICBVc2VycyBhcmUgZGVmaW5lZCBpbiA8Y29kZT4kQ0FUQUxJTkFfSE9NRS9jb25mL3RvbWNhdC11c2Vycy54bWw8L2NvZGU+LjwvcD4KKworICAgICAgICAgICAgPHA+SW5jbHVkZWQgd2l0aCB0aGlzIHJlbGVhc2UgYXJlIGEgaG9zdCBvZiBzYW1wbGUgU2VydmxldHMgYW5kIEpTUHMgKHdpdGggYXNzb2NpYXRlZCBzb3VyY2UgY29kZSksIGV4dGVuc2l2ZSBkb2N1bWVudGF0aW9uIChpbmNsdWRpbmcgdGhlIFNlcnZsZXQgMi40IGFuZCBKU1AgMi4wIEFQSSBKYXZhRG9jKSwgYW5kIGFuIGludHJvZHVjdG9yeSBndWlkZSB0byBkZXZlbG9waW5nIHdlYiBhcHBsaWNhdGlvbnMuPC9wPgorCisgICAgICAgICAgICA8cD5Ub21jYXQgbWFpbGluZyBsaXN0cyBhcmUgYXZhaWxhYmxlIGF0IHRoZSBKYWthcnRhIHByb2plY3Qgd2ViIHNpdGU6PC9wPgorCisgICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgIDxsaT48Yj48YSBocmVmPSJtYWlsdG86dG9tY2F0LXVzZXItc3Vic2NyaWJlQGpha2FydGEuYXBhY2hlLm9yZyI+dG9tY2F0LXVzZXJAamFrYXJ0YS5hcGFjaGUub3JnPC9hPjwvYj4gZm9yIGdlbmVyYWwgcXVlc3Rpb25zIHJlbGF0ZWQgdG8gY29uZmlndXJpbmcgYW5kIHVzaW5nIFRvbWNhdDwvbGk+CisgICAgICAgICAgICAgICA8bGk+PGI+PGEgaHJlZj0ibWFpbHRvOnRvbWNhdC1kZXYtc3Vic2NyaWJlQGpha2FydGEuYXBhY2hlLm9yZyI+dG9tY2F0LWRldkBqYWthcnRhLmFwYWNoZS5vcmc8L2E+PC9iPiBmb3IgZGV2ZWxvcGVycyB3b3JraW5nIG9uIFRvbWNhdDwvbGk+CisgICAgICAgICAgIDwvdWw+CisKKyAgICAgICAgICAgIDxwPlRoYW5rcyBmb3IgdXNpbmcgVG9tY2F0ITwvcD4KKworICAgICAgICAgICAgPHAgYWxpZ249InJpZ2h0Ij48Zm9udCBzaXplPS0xPjxpbWcgc3JjPSJ0b21jYXQtcG93ZXIuZ2lmIiB3aWR0aD0iNzciIGhlaWdodD0iODAiPjwvZm9udD48YnI+CisgICAgICAgICAgICAmbmJzcDsKKyAgICAgICAgICAgIDxmb250IHNpemU9LTE+Q29weXJpZ2h0ICZjb3B5OyAxOTk5LTIwMDQgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248L2ZvbnQ+PGJyPgorICAgICAgICAgICAgPGZvbnQgc2l6ZT0tMT5BbGwgUmlnaHRzIFJlc2VydmVkPC9mb250PiA8YnI+CisgICAgICAgICAgICAmbmJzcDs8L3A+CisgICAgICAgICAgICA8cCBhbGlnbj0icmlnaHQiPiZuYnNwOzwvcD4KKworICAgICAgICA8L3RkPgorCisgICAgPC90cj4KKzwvdGFibGU+CisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL1JPT1QvamFrYXJ0YS1iYW5uZXIuZ2lmIGIvY29udGFpbmVyL3dlYmFwcHMvUk9PVC9qYWthcnRhLWJhbm5lci5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ5Y2Y4MgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL1JPT1QvamFrYXJ0YS1iYW5uZXIuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL1JPT1QvdG9tY2F0LXBvd2VyLmdpZiBiL2NvbnRhaW5lci93ZWJhcHBzL1JPT1QvdG9tY2F0LXBvd2VyLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWE3NDA0Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvUk9PVC90b21jYXQtcG93ZXIuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL1JPT1QvdG9tY2F0LmdpZiBiL2NvbnRhaW5lci93ZWJhcHBzL1JPT1QvdG9tY2F0LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTc1NjczCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvUk9PVC90b21jYXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9BY3Rpb25UYWcuamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9BY3Rpb25UYWcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmVlMzNjCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL0FjdGlvblRhZy5qYXZhCkBAIC0wLDAgKzEsMTk1IEBACisvKgorICogQ29weXJpZ2h0IDIwMDEsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbjsKKworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkxFbmNvZGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC5Kc3BFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AuSnNwV3JpdGVyOworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLlBhZ2VDb250ZXh0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5Cb2R5VGFnU3VwcG9ydDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnOworCisKKy8qKgorICogPHA+TmVzdGVkIHRhZyB0aGF0IHJlcHJlc2VudHMgYW4gaW5kaXZpZHVhbCAiaW5zdGFudCBhY3Rpb24iLiAgVGhpcyB0YWcKKyAqIGlzIHZhbGlkIDxzdHJvbmc+b25seTwvc3Ryb25nPiB3aGVuIG5lc3RlZCB3aXRoaW4gYW4gQWN0b2luc1RhZyB0YWcuCisgKiBUaGlzIHRhZyBoYXMgdGhlIGZvbGxvd2luZyB1c2VyLXNldHRhYmxlIGF0dHJpYnV0ZXM6PC9wPgorICogPHVsPgorICogPGxpPjxzdHJvbmc+c2VsZWN0ZWQ8L3N0cm9uZz4gLSBTZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBhY3Rpb24KKyAqICAgICBzaG91bGQgYmUgc2VsZWN0ZWQgd2hlbiB0aGUgY29udHJvbCBpcyBpbml0aWFsbHkgZGlzcGxheWVkLjwvbGk+CisgKiA8bGk+PHN0cm9uZz51cmw8L3N0cm9uZz4gLSBVUkwgdG8gd2hpY2ggY29udHJvbCBzaG91bGQgYmUgdHJhbnNmZXJyZWQKKyAqICAgICAoaW4gdGhlIGN1cnJlbnQgZnJhbWUgb3Igd2luZG93KSBpZiB0aGlzIGFjdGlvbiBpcyBzZWxlY3RlZC48L2xpPgorICogPC91bD4KKyAqCisgKiA8cD5JbiBhZGRpdGlvbiwgdGhlIGJvZHkgY29udGVudCBvZiB0aGlzIHRhZyBpcyB1c2VkIGFzIHRoZSB1c2VyLXZpc2libGUKKyAqIGxhYmVsIGZvciB0aGUgYWN0aW9uLCBzbyB0aGF0IGl0IG1heSBiZSBjb252ZW5pZW50bHkgbG9jYWxpemVkLjwvcD4KKyAqCisgKiA8c3Ryb25nPkZJWE1FPC9zdHJvbmc+IC0gSW50ZXJuYXRpb25hbGl6ZSB0aGUgZXhjZXB0aW9uIG1lc3NhZ2VzIQorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgQWN0aW9uVGFnIGV4dGVuZHMgQm9keVRhZ1N1cHBvcnQgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIGxhYmVsIHRoYXQgd2lsbCBiZSByZW5kZXJlZCBmb3IgdGhpcyBhY3Rpb24uCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBsYWJlbCA9IG51bGw7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBTaG91bGQgdGhpcyBhY3Rpb24gYmUgc2VsZWN0ZWQgd2hlbiB0aGUgY29udHJvbCBpcyBpbml0aWFsbHkgZGlzcGxheWVkPworICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIHNlbGVjdGVkID0gZmFsc2U7CisKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRTZWxlY3RlZCgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLnNlbGVjdGVkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZChib29sZWFuIHNlbGVjdGVkKSB7CisgICAgICAgIHRoaXMuc2VsZWN0ZWQgPSBzZWxlY3RlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTaG91bGQgdGhpcyBhY3Rpb24gc2VsZWN0aW9uIGJlIGRpc2FibGVkPyAKKyAgICAgKiBlLmcuIEFjdGlvbiBzZXBhcmF0b3JzIHNob3VsZCBiZSBkaXNhYmxlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBkaXNhYmxlZCA9IGZhbHNlOworCisgICAgcHVibGljIGJvb2xlYW4gZ2V0RGlzYWJsZWQoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5kaXNhYmxlZCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RGlzYWJsZWQoYm9vbGVhbiBkaXNhYmxlZCkgeworICAgICAgICB0aGlzLmRpc2FibGVkID0gZGlzYWJsZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIFVSTCB0byB3aGljaCBjb250cm9sIGlzIHRyYW5zZmVycmVkIGlmIHRoaXMgYWN0aW9uIGlzIHNlbGVjdGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgdXJsID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXJsKCkgeworICAgICAgICByZXR1cm4gKHRoaXMudXJsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVcmwoU3RyaW5nIHVybCkgeworICAgICAgICB0aGlzLnVybCA9IHVybDsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBzdGFydCBvZiB0aGlzIHRhZy4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSnNwRXhjZXB0aW9uIGlmIGEgSlNQIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGRvU3RhcnRUYWcoKSB0aHJvd3MgSnNwRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBob2xkZXIgZm9yIG91ciBsYWJlbCB0ZXh0CisgICAgICAgIHRoaXMubGFiZWwgPSBudWxsOworCisgICAgICAgIC8vIERvIG5vIGZ1cnRoZXIgcHJvY2Vzc2luZyBmb3Igbm93CisgICAgICAgIHJldHVybiAoRVZBTF9CT0RZX1RBRyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIGJvZHkgdGV4dCBvZiB0aGlzIHRhZyAoaWYgYW55KS4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSnNwRXhjZXB0aW9uIGlmIGEgSlNQIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGRvQWZ0ZXJCb2R5KCkgdGhyb3dzIEpzcEV4Y2VwdGlvbiB7CisKKyAgICAgICAgU3RyaW5nIGxhYmVsID0gYm9keUNvbnRlbnQuZ2V0U3RyaW5nKCk7CisgICAgICAgIGlmIChsYWJlbCAhPSBudWxsKSB7CisgICAgICAgICAgICBsYWJlbCA9IGxhYmVsLnRyaW0oKTsKKyAgICAgICAgICAgIGlmIChsYWJlbC5sZW5ndGgoKSA+IDApCisgICAgICAgICAgICAgICAgdGhpcy5sYWJlbCA9IGxhYmVsOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoU0tJUF9CT0RZKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVjb3JkIHRoaXMgYWN0aW9uIHdpdGggb3VyIHN1cnJvdW5kaW5nIEFjdGlvbnNUYWcgaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEpzcEV4Y2VwdGlvbiBpZiBhIHByb2Nlc3NpbmcgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIGludCBkb0VuZFRhZygpIHRocm93cyBKc3BFeGNlcHRpb24geworCisgICAgICAgIC8vIEZpbmQgb3VyIHBhcmVudCBBY3Rpb25zVGFnIGluc3RhbmNlCisgICAgICAgIFRhZyBwYXJlbnQgPSBnZXRQYXJlbnQoKTsKKyAgICAgICAgd2hpbGUgKChwYXJlbnQgIT0gbnVsbCkgJiYgIShwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpb25zVGFnKSkgeworICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50LmdldFBhcmVudCgpOworICAgICAgICB9CisgICAgICAgIGlmICgocGFyZW50ID09IG51bGwpIHx8ICEocGFyZW50IGluc3RhbmNlb2YgQWN0aW9uc1RhZykpCisgICAgICAgICAgICB0aHJvdyBuZXcgSnNwRXhjZXB0aW9uKCJNdXN0IGJlIG5lc3RlZCBpbiBhbiBBY3Rpb25zVGFnIGlzbnRhbmNlIik7CisgICAgICAgIEFjdGlvbnNUYWcgYWN0aW9ucyA9IChBY3Rpb25zVGFnKSBwYXJlbnQ7CisKKyAgICAgICAgLy8gUmVnaXN0ZXIgdGhlIGluZm9ybWF0aW9uIGZvciB0aGUgYWN0aW9uIHJlcHJlc2VudGVkIGJ5CisgICAgICAgIC8vIHRoaXMgYWN0aW9uCisgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0ID0KKyAgICAgICAgICAgIChIdHRwU2VydmxldFJlcXVlc3QpIHBhZ2VDb250ZXh0LmdldFJlcXVlc3QoKTsKKyAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSA9CisgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZSkgcGFnZUNvbnRleHQuZ2V0UmVzcG9uc2UoKTsKKyAgICAgICAgU3RyaW5nIHBhdGggPSBudWxsOworICAgICAgICBpZiAoKHVybCAhPSBudWxsKSAmJiAodXJsLnN0YXJ0c1dpdGgoIi8iKSkpIHsKKyAgICAgICAgICAgIHBhdGggPSByZXF1ZXN0LmdldENvbnRleHRQYXRoKCkgKyB1cmw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwYXRoID0gdXJsOworICAgICAgICB9CisgICAgICAgIGFjdGlvbnMuYWRkQWN0aW9uKGxhYmVsLCBzZWxlY3RlZCwgZGlzYWJsZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmVuY29kZVVSTChwYXRoKSk7CisKKyAgICAgICAgcmV0dXJuIChFVkFMX1BBR0UpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZWxlYXNlIGFsbCBzdGF0ZSBpbmZvcm1hdGlvbiBzZXQgYnkgdGhpcyB0YWcuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKKworICAgICAgICB0aGlzLmxhYmVsID0gbnVsbDsKKyAgICAgICAgdGhpcy5zZWxlY3RlZCA9IGZhbHNlOworICAgICAgICB0aGlzLmRpc2FibGVkID0gZmFsc2U7CisgICAgICAgIHRoaXMudXJsID0gbnVsbDsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vQWN0aW9uc1RhZy5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL0FjdGlvbnNUYWcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2ZkYjMyCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL0FjdGlvbnNUYWcuamF2YQpAQCAtMCwwICsxLDI3OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAxLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW47CisKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMRW5jb2RlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLkpzcEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC5Kc3BXcml0ZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AuUGFnZUNvbnRleHQ7CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0LkJvZHlUYWdTdXBwb3J0OworCisKKy8qKgorICogPHA+SlNQIGN1c3RvbSB0YWcgdGhhdCByZW5kZXJzIGFuICJpbnN0YW50IGFjdGlvbnMiIGNvbnRyb2wuICBUbyB0aGUgdXNlciwKKyAqIGl0IGFwcGVhcnMgYXMgYW4gSFRNTCAmbHQ7c2VsZWN0Jmd0OyBlbGVtZW50IChpLmUuIGEgY29tYm8gYm94KSwgd2l0aAorICogdGhlIGJlaGF2aW9yIG9mIHNlbGVjdGluZyBhIG5ldyBwYWdlIGZvciB0aGUgY3VycmVudCBmcmFtZSBvciB3aW5kb3cgd2hlbgorICogYSBkaWZmZXJlbnQgb3B0aW9uIGlzIHNlbGVjdGVkLCB3aXRob3V0IHJlcXVpcmluZyBhIHN1Ym1pdCBhY3Rpb24uCisgKiBUaGlzIHRhZyBoYXMgdGhlIGZvbGxvd2luZyB1c2VyLXNldHRhYmxlIGF0dHJpYnV0ZXM6PC9wPgorICogPHVsPgorICogPGxpPjxzdHJvbmc+c2l6ZTwvc3Ryb25nPiAtIChJbnRlZ2VyKSBudW1iZXIgb2Ygcm93cyB0aGF0IHdpbGwgYmUgdmlzaWJsZQorICogICAgIHRvIHRoZSB1c2VyLiAgSWYgbm90IHNwZWNpZmllZCwgb25lIHJvdyB3aWxsIGJlIHZpc2libGUuPC9saT4KKyAqIDxsaT48c3Ryb25nPnN0eWxlPC9zdHJvbmc+IC0gVGhlIENTUyBzdHlsZSBjbGFzcyB0byBiZSBhcHBsaWVkIHRvIHRoZQorICogICAgIGVudGlyZSByZW5kZXJlZCBvdXRwdXQgb2YgdGhlIGluc3RhbnQgYWN0aW9ucyBjb250cm9sLCBpZiBhbnkuPC9saT4KKyAqIDwvdWw+CisgKgorICogPHN0cm9uZz5GSVhNRTwvc3Ryb25nPiAtIEludGVybmF0aW9uYWxpemUgdGhlIGV4Y2VwdGlvbiBtZXNzYWdlcyEKKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEFjdGlvbnNUYWcgZXh0ZW5kcyBCb2R5VGFnU3VwcG9ydCB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE1hbmlmZXN0IENvbnN0YW50cworCisKKyAgICAvKioKKyAgICAgKiBBdHRyaWJ1dGUgbmFtZSB1c2VkIHRvIGluZGljYXRlIHRoYXQgd2UgaGF2ZSBnZW5lcmF0ZWQgdGhlIEphdmFTY3JpcHQKKyAgICAgKiBmdW5jdGlvbiBhbHJlYWR5IG9uIHRoZSBjdXJyZW50IHBhZ2UuICBUaGUgdmFsdWUgc3RvcmVkIGZvciB0aGlzCisgICAgICogYXR0cmlidXRlIGlzIGFyYml0cmFyeSAtIG9ubHkgaXRzIGV4aXN0ZW5jZSBpcyByZWxldmFudC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBGVU5DVElPTl9UQUcgPQorICAgICAgICAib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uQWN0aW9uc1RhZy5GVU5DVElPTl9UQUciOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIHNldCBvZiBsYWJlbHMgZm9yIHRoZSBBY3Rpb25zIGRpc3BsYXllZCBieSB0aGlzIGNvbnRyb2wuCisgICAgICovCisgICAgcHJvdGVjdGVkIEFycmF5TGlzdCBsYWJlbHMgPSBuZXcgQXJyYXlMaXN0KCk7CisKKworICAgIC8qKgorICAgICAqIFRoZSBzZXQgb2YgInNlbGVjdGVkIiBmbGFncyBmb3IgQWN0aW9ucyBkaXNwbGF5ZWQgYnkgdGhpcyBjb250cm9sLgorICAgICAqLworICAgIHByb3RlY3RlZCBBcnJheUxpc3Qgc2VsZWN0ZWRzID0gbmV3IEFycmF5TGlzdCgpOworCisgICAgLyoqCisgICAgICogVGhlIHNldCBvZiAiZGlzYWJsZWQiIGZsYWdzIGZvciBBY3Rpb25zIGRpc3BsYXllZCBieSB0aGlzIGNvbnRyb2wuCisgICAgICovCisgICAgcHJvdGVjdGVkIEFycmF5TGlzdCBkaXNhYmxlZHMgPSBuZXcgQXJyYXlMaXN0KCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgc2V0IG9mIFVSTHMgZm9yIHRoZSBBY3Rpb25zIGRpc3BsYXllZCBieSB0aGlzIGNvbnRyb2wuCisgICAgICovCisgICAgcHJvdGVjdGVkIEFycmF5TGlzdCB1cmxzID0gbmV3IEFycmF5TGlzdCgpOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogVGhlIG51bWJlciBvZiBlbGVtZW50cyB0aGF0IHdpbGwgYmUgZGlzcGxheWVkIHRvIHRoZSB1c2VyLgorICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgc2l6ZSA9IDE7CisKKyAgICBwdWJsaWMgaW50IGdldFNpemUoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5zaXplKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTaXplKGludCBzaXplKSB7CisgICAgICAgIHRoaXMuc2l6ZSA9IHNpemU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgQ1NTIHN0eWxlIGNsYXNzIHRvIGJlIGFwcGxpZWQgdG8gdGhlIGVudGlyZSByZW5kZXJlZCBvdXRwdXQKKyAgICAgKiBvZiB0aGlzICJpbnN0YW50IGFjdGlvbnMiIG9iamVjdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHN0eWxlID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3R5bGUoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5zdHlsZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U3R5bGUoU3RyaW5nIHN0eWxlKSB7CisgICAgICAgIHRoaXMuc3R5bGUgPSBzdHlsZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqICBIVE1MIExhYmVsIHRhZyB0ZXh0LgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgbGFiZWwgPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLmxhYmVsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRMYWJlbChTdHJpbmcgbGFiZWwpIHsKKyAgICAgICAgdGhpcy5sYWJlbCA9IGxhYmVsOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKyAgICBwdWJsaWMgaW50IGRvU3RhcnRUYWcoKSB0aHJvd3MgSnNwRXhjZXB0aW9uIHsKKworICAgICAgICB0aGlzLmxhYmVscy5jbGVhcigpOworICAgICAgICB0aGlzLnNlbGVjdGVkcy5jbGVhcigpOworICAgICAgICB0aGlzLnVybHMuY2xlYXIoKTsKKworICAgICAgICByZXR1cm4gKEVWQUxfQk9EWV9UQUcpOworICAgICAgIAorICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZW5kZXIgdGhpcyBpbnN0YW50IGFjdGlvbnMgY29udHJvbC4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSnNwRXhjZXB0aW9uIGlmIGEgcHJvY2Vzc2luZyBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGRvRW5kVGFnKCkgdGhyb3dzIEpzcEV4Y2VwdGlvbiB7CisKKyAgICAgICAgSnNwV3JpdGVyIG91dCA9IHBhZ2VDb250ZXh0LmdldE91dCgpOworCisgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgIC8vIFJlbmRlciAob25jZSBvbmx5KSB0aGUgSmF2YVNjcmlwdCBmdW5jdGlvbiB3ZSBuZWVkCisgICAgICAgICAgICBpZiAocGFnZUNvbnRleHQuZ2V0QXR0cmlidXRlKEZVTkNUSU9OX1RBRykgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCk7CisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIjxzY3JpcHQgbGFuZ3VhZ2U9XCJKYXZhU2NyaXB0XCI+Iik7CisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIjwhLS0iKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiZnVuY3Rpb24gSUFfanVtcE1lbnUodGFyZyxzZWxPYmopIHsiKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiICBkZXN0ID0gc2VsT2JqLm9wdGlvbnNbc2VsT2JqLnNlbGVjdGVkSW5kZXhdLnZhbHVlOyIpOworICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCIgIGlmIChkZXN0Lmxlbmd0aCA+IDApIHsiKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiICAgIGV2YWwodGFyZytcIi5sb2NhdGlvbj0nXCIrZGVzdCtcIidcIik7Iik7CisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIiAgfSIpOworICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCJ9Iik7CisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIi8vLS0+Iik7CisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIjwvc2NyaXB0PiIpOworICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCk7CisgICAgICAgICAgICAgICAgcGFnZUNvbnRleHQuc2V0QXR0cmlidXRlKEZVTkNUSU9OX1RBRywgQm9vbGVhbi5UUlVFKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gUmVuZGVyIExBQkVMIGVsZW1lbnQgZm9yIHNlY3Rpb24gNTA4IGFjY2Vzc2liaWxpdHkKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKGxhYmVsICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoIjxsYWJlbCBmb3I9XCJsYWJlbElkXCI+Iik7CisgICAgICAgICAgICAgICAgb3V0LnByaW50KGxhYmVsKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiPC9sYWJlbD4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFJlbmRlciB0aGUgYmVnaW5uaW5nIG9mIHRoaXMgZWxlbWVudAorICAgICAgICAgICAgb3V0LnByaW50bG4oKTsKKyAgICAgICAgICAgIG91dC5wcmludCgiPHNlbGVjdCIpOworICAgICAgICAgICAgaWYgKHNpemUgPiAxKSB7CisgICAgICAgICAgICAgICAgb3V0LnByaW50KCIgc2l6ZT1cIiIpOworICAgICAgICAgICAgICAgIG91dC5wcmludChzaXplKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoIlwiIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3R5bGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG91dC5wcmludCgiIGNsYXNzPVwiIik7CisgICAgICAgICAgICAgICAgb3V0LnByaW50KHN0eWxlKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoIlwiIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobGFiZWwgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG91dC5wcmludCgiIGlkPVwiIik7CisgICAgICAgICAgICAgICAgb3V0LnByaW50KCJsYWJlbElkIik7CisgICAgICAgICAgICAgICAgb3V0LnByaW50KCJcIiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBvdXQucHJpbnQoIiBvbmNoYW5nZT1cIklBX2p1bXBNZW51KCdzZWxmJyx0aGlzKVwiIik7CisgICAgICAgICAgICBvdXQucHJpbnRsbigiPiIpOworCisgICAgICAgICAgICAvLyBSZW5kZXIgZWFjaCBkZWZpbmVkIGFjdGlvbgorICAgICAgICAgICAgaW50IG4gPSBsYWJlbHMuc2l6ZSgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWwgPSAoU3RyaW5nKSBsYWJlbHMuZ2V0KGkpOworICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VsZWN0ZWQgPSAoKEJvb2xlYW4pIHNlbGVjdGVkcy5nZXQoaSkpLmJvb2xlYW5WYWx1ZSgpOworICAgICAgICAgICAgICAgIGJvb2xlYW4gZGlzYWJsZWQgPSAoKEJvb2xlYW4pIGRpc2FibGVkcy5nZXQoaSkpLmJvb2xlYW5WYWx1ZSgpOyAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBTdHJpbmcgdXJsID0gKFN0cmluZykgdXJscy5nZXQoaSk7CisgICAgICAgICAgICAgICAgb3V0LnByaW50KCI8b3B0aW9uIik7CisgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkKQorICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoIiBzZWxlY3RlZD1cInNlbGVjdGVkXCIiKTsKKyAgICAgICAgICAgICAgICBpZiAoZGlzYWJsZWQpCisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCgiIGRpc2FibGVkPVwidHJ1ZVwiIik7ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIG91dC5wcmludCgiIHZhbHVlPVwiIik7CisgICAgICAgICAgICAgICAgaWYgKHVybCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQodXJsKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoIlwiIik7CisgICAgICAgICAgICAgICAgb3V0LnByaW50KCI+Iik7CisgICAgICAgICAgICAgICAgaWYgKGxhYmVsICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludChsYWJlbCk7CisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIjwvb3B0aW9uPiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBSZW5kZXIgdGhlIGVuZCBvZiB0aGlzIGVsZW1lbnQKKyAgICAgICAgICAgIG91dC5wcmludGxuKCI8L3NlbGVjdD4iKTsKKyAgICAgICAgICAgIG91dC5wcmludGxuKCk7CisKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEpzcEV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAoRVZBTF9QQUdFKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVsZWFzZSBhbGwgc3RhdGUgaW5mb3JtYXRpb24gc2V0IGJ5IHRoaXMgdGFnLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7CisKKyAgICAgICAgdGhpcy5sYWJlbHMuY2xlYXIoKTsKKyAgICAgICAgdGhpcy5zZWxlY3RlZHMuY2xlYXIoKTsKKyAgICAgICAgdGhpcy51cmxzLmNsZWFyKCk7CisKKyAgICAgICAgdGhpcy5zaXplID0gMTsKKyAgICAgICAgdGhpcy5zdHlsZSA9IG51bGw7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBhY2thZ2UgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBuZXcgQWN0aW9uIHRvIHRoZSBzZXQgdGhhdCB3aWxsIGJlIHJlbmRlcmVkIGJ5IHRoaXMgY29udHJvbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsYWJlbCBMb2NhbGl6ZWQgbGFiZWwgdmlzaWJsZSB0byB0aGUgdXNlcgorICAgICAqIEBwYXJhbSBzZWxlY3RlZCBJbml0aWFsIHNlbGVjdGVkIHN0YXRlIG9mIHRoaXMgb3B0aW9uCisgICAgICogQHBhcmFtIGRpc2FibGVkIEFiaWxpdHkgdG8gYmUgc2VsZWN0ZWQgc3RhdGUgb2YgdGhpcyBvcHRpb24KKyAgICAgKiBAcGFyYW0gdXJsIFVSTCB0byB3aGljaCBjb250cm9sIHNob3VsZCBiZSB0cmFuc2ZlcnJlZCBpZiBzZWxlY3RlZAorICAgICAqLworICAgIHZvaWQgYWRkQWN0aW9uKFN0cmluZyBsYWJlbCwgYm9vbGVhbiBzZWxlY3RlZCwgYm9vbGVhbiBkaXNhYmxlZCwgU3RyaW5nIHVybCkgeworCisgICAgICAgIGxhYmVscy5hZGQobGFiZWwpOworICAgICAgICBzZWxlY3RlZHMuYWRkKG5ldyBCb29sZWFuKHNlbGVjdGVkKSk7CisgICAgICAgIGRpc2FibGVkcy5hZGQobmV3IEJvb2xlYW4oZGlzYWJsZWQpKTsKKyAgICAgICAgdXJscy5hZGQodXJsKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3RlY3RlZCBNZXRob2RzCisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL0FwcGxpY2F0aW9uTG9jYWxlcy5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL0FwcGxpY2F0aW9uTG9jYWxlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlNzA2NjIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vQXBwbGljYXRpb25Mb2NhbGVzLmphdmEKQEAgLTAsMCArMSwxMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluOworCisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLkdsb2JhbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvblNlcnZsZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMudXRpbC5NZXNzYWdlUmVzb3VyY2VzOworCisKKy8qKgorICogQ2xhc3MgdG8gaG9sZCB0aGUgTG9jYWxlcyBzdXBwb3J0ZWQgYnkgdGhpcyBwYWNrYWdlLgorICoKKyAqIEBhdXRob3IgUGF0cmljayBMdWJ5CisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIEFwcGxpY2F0aW9uTG9jYWxlcyB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIHRoZSBzZXQgb2YgTG9jYWxlcyBzdXBwb3J0ZWQgYnkgdGhpcyBhcHBsaWNhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXJ2bGV0IEFjdGlvblNlcnZsZXQgd2UgYXJlIGFzc29jaWF0ZWQgd2l0aAorICAgICAqLworICAgIHB1YmxpYyBBcHBsaWNhdGlvbkxvY2FsZXMoQWN0aW9uU2VydmxldCBzZXJ2bGV0KSB7CisKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgTG9jYWxlIGxpc3RbXSA9IExvY2FsZS5nZXRBdmFpbGFibGVMb2NhbGVzKCk7CisgICAgICAgIE1lc3NhZ2VSZXNvdXJjZXMgcmVzb3VyY2VzID0gKE1lc3NhZ2VSZXNvdXJjZXMpCisgICAgICAgICAgICAgICAgc2VydmxldC5nZXRTZXJ2bGV0Q29udGV4dCgpLmdldEF0dHJpYnV0ZShHbG9iYWxzLk1FU1NBR0VTX0tFWSk7CisgICAgICAgIGlmIChyZXNvdXJjZXMgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgU3RyaW5nIGNvbmZpZyA9IHJlc291cmNlcy5nZXRDb25maWcoKTsKKyAgICAgICAgaWYgKGNvbmZpZyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPQorICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoY29uZmlnLCBsaXN0W2ldKTsKKyAgICAgICAgICAgICAgICBpZiAoYnVuZGxlID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGlmIChsaXN0W2ldLmVxdWFscyhidW5kbGUuZ2V0TG9jYWxlKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGxvY2FsZUxhYmVscy5hZGQobGlzdFtpXS5nZXREaXNwbGF5TmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgbG9jYWxlVmFsdWVzLmFkZChsaXN0W2ldLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWRMb2NhbGVzLmFkZChsaXN0W2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoKCBFeGNlcHRpb24gZXggKSB7CisgICAgICAgICAgICAgICAgc2VydmxldC5sb2coIk1pc3NpbmcgbG9jYWxlICIgKyBsaXN0W2ldICk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBzZXQgb2YgTG9jYWxlIGxhYmVscyBzdXBwb3J0ZWQgYnkgdGhpcyBhcHBsaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQXJyYXlMaXN0IGxvY2FsZUxhYmVscyA9IG5ldyBBcnJheUxpc3QoKTsKKworCisgICAgLyoqCisgICAgICogVGhlIHNldCBvZiBMb2NhbGUgdmFsdWVzIHN1cHBvcnRlZCBieSB0aGlzIGFwcGxpY2F0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCBBcnJheUxpc3QgbG9jYWxlVmFsdWVzID0gbmV3IEFycmF5TGlzdCgpOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc2V0IG9mIHN1cHBvcnRlZCBMb2NhbGVzIGZvciB0aGlzIGFwcGxpY2F0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCBBcnJheUxpc3Qgc3VwcG9ydGVkTG9jYWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2V0IG9mIExvY2FsZSBsYWJlbHMgc3VwcG9ydGVkIGJ5IHRoaXMgYXBwbGljYXRpb24uCisgICAgICovCisgICAgcHVibGljIExpc3QgZ2V0TG9jYWxlTGFiZWxzKCkgeworCisgICAgICAgIHJldHVybiAobG9jYWxlTGFiZWxzKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXQgb2YgTG9jYWxlIHZhbHVlcyBzdXBwb3J0ZWQgYnkgdGhpcyBhcHBsaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdCBnZXRMb2NhbGVWYWx1ZXMoKSB7CisKKyAgICAgICAgcmV0dXJuIChsb2NhbGVWYWx1ZXMpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNldCBvZiBMb2NhbGVzIHN1cHBvcnRlZCBieSB0aGlzIGFwcGxpY2F0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBMaXN0IGdldFN1cHBvcnRlZExvY2FsZXMoKSB7CisKKyAgICAgICAgcmV0dXJuIChzdXBwb3J0ZWRMb2NhbGVzKTsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vQXBwbGljYXRpb25SZXNvdXJjZXMucHJvcGVydGllcyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9BcHBsaWNhdGlvblJlc291cmNlcy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMWFkN2UKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vQXBwbGljYXRpb25SZXNvdXJjZXMucHJvcGVydGllcwpAQCAtMCwwICsxLDQ0OCBAQAorYXBwbGljYXRpb24udGl0bGU9VG9tY2F0IFNlcnZlciBBZG1pbmlzdHJhdGlvbgorZXJyb3JzLmhlYWRlcj08aDI+PGZvbnQgY29sb3I9InJlZCI+VmFsaWRhdGlvbiBFcnJvcnM8L2ZvbnQ+PC9oMj5Zb3UgbXVzdCBjb3JyZWN0IHRoZSBmb2xsb3dpbmcgZXJyb3JzIGJlZm9yZSBwcm9jZWVkaW5nOjx1bD4KK2Vycm9ycy5mb290ZXI9PC91bD48aHI+CitlcnJvci5sb2dpbj08bGk+SW52YWxpZCB1c2VybmFtZSBvciBwYXNzd29yZDwvbGk+Citwcm9tcHQudXNlcm5hbWU9VXNlciBOYW1lCitwcm9tcHQucGFzc3dvcmQ9UGFzc3dvcmQKK2J1dHRvbi5sb2dpbj1Mb2dpbgorYnV0dG9uLnJlc2V0PVJlc2V0CitidXR0b24uc2F2ZT1TYXZlCitidXR0b24uY2hhbmdlPUNoYW5nZQorYnV0dG9uLmNhbmNlbD1SZXNldAorYnV0dG9uLmNvbW1pdD1Db21taXQgQ2hhbmdlcworYnV0dG9uLmxvZ291dD1Mb2cgT3V0Citsb2dpbi5lbnRlcj1FbnRlciBhIHVzZXJuYW1lIGFuZCBwYXNzd29yZCB0byBzdGFydCBhIG5ldyBzZXNzaW9uCitsb2dpbi5jaGFuZ2VMYW5ndWFnZT1DaGFuZ2UgdGhlIGxhbmd1YWdlCitlcnJvci5sb2dpbj1JbnZhbGlkIHVzZXJuYW1lIG9yIHBhc3N3b3JkCitlcnJvci50cnlhZ2Fpbj1UbyB0cnkgYWdhaW4sIGNsaWNrCitlcnJvci5oZXJlPWhlcmUKK3Byb21wdC5zb21lVGV4dD1Tb21lIFRleHQKK3Byb21wdC5tb3JlVGV4dD1Nb3JlIFRleHQKK3NhbXBsZS5zb21lVGV4dC5yZXF1aXJlZD08bGk+IlNvbWUgVGV4dCIgY2Fubm90IGJlIGVtcHR5PC9saT4KK3NhbXBsZS5tb3JlVGV4dC5yZXF1aXJlZD08bGk+Ik1vcmUgVGV4dCIgY2Fubm90IGJlIGVtcHR5PC9saT4KK3NhdmUuc3VjY2Vzcz1TYXZlIHN1Y2Vzc2Z1bCEKK3NhdmUuZmFpbD1TYXZlIGZhaWxlZCEKK3NlcnZlci5wb3J0bnVtYmVyPVBvcnQgTnVtYmVyCitzZXJ2ZXIuZGVidWdsZXZlbD1EZWJ1ZyBMZXZlbAorc2VydmVyLnNodXRkb3duPVNodXRkb3duCitzZXJ2ZXIucHJvcGVydGllcz1TZXJ2ZXIgUHJvcGVydGllcword2FybmluZy5oZWFkZXI9PGNlbnRlcj48aDQ+PGZvbnQgY29sb3I9InJlZCI+V2FybmluZyE8L2ZvbnQ+PC9oND48L2NlbnRlcj4gPHVsPgorc2VydmVyLnBvcnQud2FybmluZz08bGk+UG9ydCBudW1iZXIgbGVzcyB0aGFuIDEwMjQgcmVxdWlyZXMgc3BlY2lhbCBzb2Z0d2FyZSBjYXBhYmlsaXRpZXMuCitlcnJvci5wb3J0TnVtYmVyLnJlcXVpcmVkPTxsaT5Qb3J0TnVtYmVyIGNhbm5vdCBiZSBlbXB0eTwvbGk+CitlcnJvci5wb3J0TnVtYmVyLmZvcm1hdD08bGk+UG9ydE51bWJlciBub3QgYSB2YWxpZCBpbnRlZ2VyITwvbGk+CitlcnJvci5wb3J0TnVtYmVyLnJhbmdlPTxsaT5Qb3J0TnVtYmVyIHNlZW1zIG91dCBvZiByYW5nZS4gVmFsaWQgcmFuZ2UgaXMgMS02NTUzNS4gPC9saT4KK2Vycm9yLnNodXRkb3duVGV4dC5sZW5ndGg9PGxpPlNodXRkb3duIFRleHQgbXVzdCBiZSBhdGxlYXN0IDYgY2hhcmFjdGVyczwvbGk+CitlcnJvci5lbmdpbmVOYW1lLnJlcXVpcmVkPTxsaT5FbmdpbmUgbmFtZSBpcyByZXF1aXJlZDwvbGk+CitlcnJvci5hY2NlcHRDb3VudFRleHQucmVxdWlyZWQ9PGxpPkFjY2VwdCBjb3VudCByZXF1aXJlZDwvbGk+CitlcnJvci5hY2NlcHRDb3VudFRleHQuZm9ybWF0PTxsaT5BY2NlcHQgY291bnQgbm90IGEgdmFsaWQgaW50ZWdlciE8L2xpPgorZXJyb3IuYWNjZXB0Q291bnRUZXh0LnJhbmdlPTxsaT5BY2NlcHQgY291bnQgc2VlbXMgb3V0IG9mIHJhbmdlLiBWYWxpZCByYW5nZSBpcyAwLTEyOC4gPC9saT4KK2Vycm9yLmNvbm5UaW1lT3V0VGV4dC5yZXF1aXJlZD08bGk+Q29ubmVjdGlvbiB0aW1lIG91dCByZXF1aXJlZDwvbGk+CitlcnJvci5jb25uVGltZU91dFRleHQuZm9ybWF0PTxsaT5Db25uZWN0aW9uIHRpbWUgb3V0IG5vdCBhIHZhbGlkIGludGVnZXIhPC9saT4KK2Vycm9yLmNvbm5UaW1lT3V0VGV4dC5yYW5nZT08bGk+Q29ubmVjdGlvbiB0aW1lIG91dCBzZWVtcyBvdXQgb2YgcmFuZ2UuIFZhbGlkIHJhbmdlIGlzIDAtNjAwMDAuIDwvbGk+CitlcnJvci5idWZmZXJTaXplVGV4dC5yZXF1aXJlZD08bGk+QnVmZmVyIFNpemUgcmVxdWlyZWQ8L2xpPgorZXJyb3IuYnVmZmVyU2l6ZVRleHQuZm9ybWF0PTxsaT5CdWZmZXIgU2l6ZSBub3QgYSB2YWxpZCBpbnRlZ2VyITwvbGk+CitlcnJvci5idWZmZXJTaXplVGV4dC5yYW5nZT08bGk+QnVmZmVyIFNpemUgc2VlbXMgb3V0IG9mIHJhbmdlLiBWYWxpZCByYW5nZSBpcyAxLTgxOTIuIDwvbGk+CitlcnJvci5hZGRyZXNzLmludmFsaWQ9PGxpPklQIEFkZHJlc3MgaW52YWxpZDwvbGk+CitlcnJvci5yZWRpcmVjdFBvcnRUZXh0LnJlcXVpcmVkPTxsaT5SZWRpcmVjdCBQb3J0IE51bWJlciBjYW5ub3QgYmUgZW1wdHk8L2xpPgorZXJyb3IucmVkaXJlY3RQb3J0VGV4dC5mb3JtYXQ9PGxpPlJlZGlyZWN0IFBvcnQgTnVtYmVyIG5vdCBhIHZhbGlkIGludGVnZXIhPC9saT4KK2Vycm9yLnJlZGlyZWN0UG9ydFRleHQucmFuZ2U9PGxpPlJlZGlyZWN0IFBvcnQgTnVtYmVyIHNlZW1zIG91dCBvZiByYW5nZS4gVmFsaWQgcmFuZ2UgaXMgMS02NTUzNS4gPC9saT4KK2Vycm9yLm1pblByb2Nlc3NvcnNUZXh0LnJlcXVpcmVkPTxsaT5NaW5pbXVtIFByb2Nlc3NvcnMgY2Fubm90IGJlIGVtcHR5PC9saT4KK2Vycm9yLm1pblByb2Nlc3NvcnNUZXh0LmZvcm1hdD08bGk+TWluaW11bSBQcm9jZXNzb3JzIG5vdCBhIHZhbGlkIGludGVnZXIhPC9saT4KK2Vycm9yLm1pblByb2Nlc3NvcnNUZXh0LnJhbmdlPTxsaT5NaW5pbXVtIFByb2Nlc3NvcnMgc2VlbXMgb3V0IG9mIHJhbmdlLiBWYWxpZCByYW5nZSBpcyAxLTUxMi4gPC9saT4KK2Vycm9yLm1heFByb2Nlc3NvcnNUZXh0LnJlcXVpcmVkPTxsaT5NYXhpbXVtIFByb2Nlc3NvcnMgY2Fubm90IGJlIGVtcHR5PC9saT4KK2Vycm9yLm1heFByb2Nlc3NvcnNUZXh0LmZvcm1hdD08bGk+TWF4aW11bSBQcm9jZXNzb3JzIG5vdCBhIHZhbGlkIGludGVnZXIhPC9saT4KK2Vycm9yLm1heFByb2Nlc3NvcnNUZXh0LnJhbmdlPTxsaT5NYXhpbXVtIFByb2Nlc3NvcnMgc2VlbXMgb3V0IG9mIHJhbmdlLiBWYWxpZCByYW5nZSBpcyAxLTUxMi4gQWxzbywgbWF4aW11bSA+PSBtaW5pbXVtLiA8L2xpPgorZXJyb3IucHJveHlOYW1lLmludmFsaWQ9PGxpPlByb3h5IG5hbWUgaXMgaW52YWxpZDwvbGk+CitlcnJvci5wcm94eVBvcnRUZXh0LnJlcXVpcmVkPTxsaT5Qcm94eSBQb3J0IE51bWJlciBjYW5ub3QgYmUgZW1wdHk8L2xpPgorZXJyb3IucHJveHlQb3J0VGV4dC5mb3JtYXQ9PGxpPlByb3h5IFBvcnQgTnVtYmVyIG5vdCBhIHZhbGlkIGludGVnZXIhPC9saT4KK2Vycm9yLnByb3h5UG9ydFRleHQucmFuZ2U9PGxpPlByb3h5IFBvcnQgTnVtYmVyIHNlZW1zIG91dCBvZiByYW5nZS4gVmFsaWQgcmFuZ2UgaXMgMS02NTUzNS4gPC9saT4KK2Vycm9yLmhvc3ROYW1lLmJhZD1JbnZhbGlkIGhvc3QgbmFtZSB7MH0KK2Vycm9yLmhvc3ROYW1lLnJlcXVpcmVkPTxsaT5Ib3N0bmFtZSBpcyByZXF1aXJlZDwvbGk+CitlcnJvci5ob3N0TmFtZS5leGlzdHM9PGxpPkhvc3RuYW1lIGFscmVhZHkgZXhpc3RzPC9saT4KK2Vycm9yLmFwcEJhc2UucmVxdWlyZWQ9PGxpPkFwcGxpY2F0aW9uIEJhc2UgaXMgcmVxdWlyZWQ8L2xpPgorc2VydmljZS5uYW1lPU5hbWUKK3NlcnZpY2UuZW5naW5lLnByb3BzPUVuZ2luZSBQcm9wZXJ0aWVzCitzZXJ2aWNlLmRlZmF1bHRob3N0bmFtZT1EZWZhdWx0IEhvc3RuYW1lCitzZXJ2aWNlLnByb3BlcnRpZXM9U2VydmljZSBQcm9wZXJ0aWVzCitzZXJ2aWNlLnByb3BlcnR5PVByb3BlcnR5CitzZXJ2aWNlLnZhbHVlPVZhbHVlCitzZXJ2aWNlLmNyZWF0ZS5uZXc9Q3JlYXRlIE5ldyBTZXJ2aWNlCithY3Rpb25zLmF2YWlsYWJsZS5hY3Rpb25zPUF2YWlsYWJsZSBBY3Rpb25zCithY3Rpb25zLnNlcnZpY2VzLmNyZWF0ZT1DcmVhdGUgTmV3IFNlcnZpY2UKK2FjdGlvbnMuc2VydmljZXMuZGVsZXRlPURlbGV0ZSBUaGlzIFNlcnZpY2UKK2FjdGlvbnMuc2VydmljZXMuZGVsZXRlcz1EZWxldGUgRXhpc3RpbmcgU2VydmljZXMKK2FjdGlvbnMuc2VydmljZXMuZWRpdD1FZGl0IEV4aXN0aW5nIFNlcnZpY2UKK2FjdGlvbnMuYWNjZXNzbG9nZ2VyLmNyZWF0ZT1DcmVhdGUgTmV3IEFjY2VzcyBMb2dnZXIKK2FjdGlvbnMuYWNjZXNzbG9nZ2VyLmRlbGV0ZT1EZWxldGUgQWNjZXNzIExvZ2dlcgorYWN0aW9ucy5jb25uZWN0b3JzLmNyZWF0ZT1DcmVhdGUgTmV3IENvbm5lY3RvcgorYWN0aW9ucy5jb25uZWN0b3JzLmRlbGV0ZT1EZWxldGUgVGhpcyBDb25uZWN0b3IKK2FjdGlvbnMuY29ubmVjdG9ycy5kZWxldGVzPURlbGV0ZSBFeGlzdGluZyBDb25uZWN0b3JzCithY3Rpb25zLmNvbm5lY3RvcnMuZWRpdD1FZGl0IEV4aXN0aW5nIENvbm5lY3RvcgorYWN0aW9ucy5jb250ZXh0cy5jcmVhdGU9Q3JlYXRlIE5ldyBDb250ZXh0CithY3Rpb25zLmNvbnRleHRzLmRlbGV0ZT1EZWxldGUgVGhpcyBDb250ZXh0CithY3Rpb25zLmNvbnRleHRzLmRlbGV0ZXM9RGVsZXRlIEV4aXN0aW5nIENvbnRleHRzCithY3Rpb25zLmNvbnRleHRzLmVkaXQ9RWRpdCBFeGlzdGluZyBDb250ZXh0CithY3Rpb25zLmRlZmF1bHRjb250ZXh0cy5jcmVhdGU9Q3JlYXRlIE5ldyBEZWZhdWx0Q29udGV4dAorYWN0aW9ucy5kZWZhdWx0Y29udGV4dHMuZGVsZXRlPURlbGV0ZSBUaGlzIERlZmF1bHRDb250ZXh0CithY3Rpb25zLmRlZmF1bHRjb250ZXh0cy5kZWxldGVzPURlbGV0ZSBFeGlzdGluZyBEZWZhdWx0Q29udGV4dAorYWN0aW9ucy5kZWZhdWx0Y29udGV4dHMuZWRpdD1FZGl0IEV4aXN0aW5nIERlZmF1bHRDb250ZXh0CithY3Rpb25zLmdyb3VwLmNyZWF0ZT1DcmVhdGUgTmV3IEdyb3VwCithY3Rpb25zLmdyb3VwLmRlbGV0ZT1EZWxldGUgRXhpc3RpbmcgR3JvdXAKK2FjdGlvbnMuaG9zdHMuY3JlYXRlPUNyZWF0ZSBOZXcgSG9zdAorYWN0aW9ucy5ob3N0cy5kZWxldGU9RGVsZXRlIFRoaXMgSG9zdAorYWN0aW9ucy5ob3N0cy5kZWxldGVzPURlbGV0ZSBFeGlzdGluZyBIb3N0cworYWN0aW9ucy5ob3N0cy5lZGl0PUVkaXQgRXhpc3RpbmcgSG9zdAorYWN0aW9ucy5sb2dnZXJzLmNyZWF0ZT1DcmVhdGUgTmV3IExvZ2dlcgorYWN0aW9ucy5sb2dnZXJzLmRlbGV0ZT1EZWxldGUgVGhpcyBMb2dnZXIKK2FjdGlvbnMubG9nZ2Vycy5kZWxldGVzPURlbGV0ZSBFeGlzdGluZyBMb2dnZXJzCithY3Rpb25zLmxvZ2dlcnMuZWRpdD1FZGl0IEV4aXN0aW5nIExvZ2dlcgorYWN0aW9ucy5yZWFsbXMuY3JlYXRlPUNyZWF0ZSBOZXcgVXNlciBSZWFsbQorYWN0aW9ucy5yZWFsbXMuZGVsZXRlPURlbGV0ZSBUaGlzIFVzZXIgUmVhbG0KK2FjdGlvbnMucmVhbG1zLmRlbGV0ZXM9RGVsZXRlIFVzZXIgUmVhbG1zCithY3Rpb25zLnJlYWxtcy5lZGl0PUVkaXQgRXhpc3RpbmcgUmVhbG0KK2FjdGlvbnMucmVxdWVzdGZpbHRlci5jcmVhdGU9Q3JlYXRlIE5ldyBSZXF1ZXN0IEZpbHRlcgorYWN0aW9ucy5yZXF1ZXN0ZmlsdGVyLmRlbGV0ZT1EZWxldGUgUmVxdWVzdCBGaWx0ZXJzCithY3Rpb25zLnVzZXIuY3JlYXRlPUNyZWF0ZSBOZXcgVXNlcgorYWN0aW9ucy51c2VyLmRlbGV0ZT1EZWxldGUgRXhpc3RpbmcgVXNlcgorYWN0aW9ucy52YWx2ZXMuY3JlYXRlPUNyZWF0ZSBOZXcgVmFsdmUKK2FjdGlvbnMudmFsdmVzLmVkaXQ9RWRpdCBWYWx2ZQorYWN0aW9ucy52YWx2ZXMuZGVsZXRlPURlbGV0ZSBUaGlzIFZhbHZlCithY3Rpb25zLnZhbHZlcy5kZWxldGVzPURlbGV0ZSBFeGlzdGluZyBWYWx2ZXMKK2FjdGlvbnMuYWxpYXMuY3JlYXRlPUNyZWF0ZSBOZXcgQWxpYXNlcworYWN0aW9ucy5hbGlhcy5kZWxldGU9RGVsZXRlIEFsaWFzZXMKK25ldy5hbGlhcz1OZXcgQWxpYXMKK2Nvbm5lY3Rvci50eXBlPVR5cGUKK2Nvbm5lY3Rvci5zY2hlbWU9U2NoZW1lCitjb25uZWN0b3IuYWNjZXB0LmNvdW50PUFjY2VwdCBDb3VudAorY29ubmVjdG9yLmNvbXByZXNzaW9uPUNvbXByZXNzaW9uCitjb25uZWN0b3IuY29ubmVjdGlvbi5saW5nZXI9Q29ubmVjdGlvbiBMaW5nZXIKK2Nvbm5lY3Rvci5jb25uZWN0aW9uLnRpbWVvdXQ9Q29ubmVjdGlvbiBUaW1lb3V0Citjb25uZWN0b3IuY29ubmVjdGlvbi51cGxvYWRUaW1lb3V0PUNvbm5lY3Rpb24gVXBsb2FkIFRpbWVvdXQKK2Nvbm5lY3Rvci5kZWZhdWx0LmJ1ZmZlcj1EZWZhdWx0IEJ1ZmZlciBTaXplCitjb25uZWN0b3IuY29ubmVjdGlvbi5kaXNhYmxlVXBsb2FkVGltZW91dD1EaXNhYmxlIFVwbG9hZCBUaW1lb3V0Citjb25uZWN0b3IuZW5hYmxlLmRucz1FbmFibGUgRE5TIExvb2t1cHMKK2Nvbm5lY3Rvci51cmllbmNvZGluZz1VUkkgRW5jb2RpbmcKK2Nvbm5lY3Rvci51c2VCb2R5RW5jb2RpbmdGb3JVUkk9VXNlIEJvZHkgRW5jb2RpbmcgRm9yIFVSSSBRdWVyeSBQYXJhbWV0ZXJzCitjb25uZWN0b3IuYWxsb3dUcmFjZT1BbGxvdyBUUkFDRSBNZXRob2QKK2Nvbm5lY3Rvci5hZGRyZXNzLmlwPUlQIEFkZHJlc3MKK2Nvbm5lY3Rvci5yZWRpcmVjdC5wb3J0bnVtYmVyPVJlZGlyZWN0IFBvcnQgTnVtYmVyCitjb25uZWN0b3IubWluPU1pbmltdW0KK2Nvbm5lY3Rvci5taWxsaXNlY29uZHM9bWlsbGlzZWNvbmRzCitjb25uZWN0b3IubWF4PU1heGltdW0KK2Nvbm5lY3Rvci5tYXhrZWVwYWxpdmU9TWF4IEtlZXBBbGl2ZSBSZXF1ZXN0cworY29ubmVjdG9yLm1heHNwYXJlPU1heCBTcGFyZSBUaHJlYWRzCitjb25uZWN0b3IubWF4dGhyZWFkcz1NYXggVGhyZWFkcworY29ubmVjdG9yLm1pbnNwYXJlPU1pbiBTcGFyZSBUaHJlYWRzCitjb25uZWN0b3IudGhyZWFkcHJpb3JpdHk9UHJvY2Vzc29yIFRocmVhZCBQcmlvcml0eQorY29ubmVjdG9yLnByb3h5Lm5hbWU9UHJveHkgTmFtZQorY29ubmVjdG9yLnByb3h5LnBvcnRudW1iZXI9UHJveHkgUG9ydCBOdW1iZXIKK2Nvbm5lY3Rvci5hbGdvcml0aG09QWxnb3JpdGhtCitjb25uZWN0b3IuY2lwaGVycz1DaXBoZXJzCitjb25uZWN0b3IuY2xpZW50LmF1dGg9Q2xpZW50IEF1dGhlbnRpY2F0aW9uCitjb25uZWN0b3Iua2V5c3RvcmUuZmlsZW5hbWU9S2V5c3RvcmUgRmlsZW5hbWUKK2Nvbm5lY3Rvci5rZXlzdG9yZS5wYXNzd29yZD1LZXlzdG9yZSBQYXNzd29yZAorY29ubmVjdG9yLmtleXN0b3JlLnR5cGU9S2V5c3RvcmUgVHlwZQorY29ubmVjdG9yLnNzbFByb3RvY29sPVNTTCBQcm90b2NvbAorY29ubmVjdG9yLmtleVBhc3Mud2FybmluZz08bGk+UGxlYXNlIHVzZSBrZXl0b29sIHRvIGdlbmVyYXRlIGNlcnRpZmljYXRlLjwvbGk+Citjb25uZWN0b3Iuc2VjdXJlPVNlY3VyZQorY29ubmVjdG9yLnRjcE5vRGVsYXk9VENQIE5vIERlbGF5IAorY29ubmVjdG9yLnhwb3dlcmVkYnk9WCBQb3dlcmVkIEJ5IAoraG9zdC5wcm9wZXJ0aWVzPUhvc3QgUHJvcGVydGllcworaG9zdC5uYW1lPU5hbWUKK2hvc3QuYmFzZT1BcHBsaWNhdGlvbiBCYXNlCitob3N0LmF1dG9EZXBsb3k9QXV0byBEZXBsb3kKK2hvc3QuZGVwbG95WE1MPURlcGxveSBYTUwKK2hvc3QuZGVwbG95T25TdGFydHVwPURlcGxveSBPbiBTdGFydHVwCitob3N0LndhcnM9VW5wYWNrIFdBUnMKK2hvc3QuYWxpYXNlcz1BbGlhc2VzCitob3N0LmFsaWFzLm5hbWU9QWxpYXMgTmFtZQoraG9zdC54bWxOYW1lc3BhY2VBd2FyZT1YTUwgTmFtZXNwYWNlIEF3YXJlCitob3N0LnhtbFZhbGlkYXRpb249WE1MIFZhbGlkYXRpb24KK2Vycm9yLmFsaWFzTmFtZS5leGlzdHM9PGxpPkFsaWFzIGFscmVhZHkgZXhpc3RzPC9saT4KK2Vycm9yLmFsaWFzTmFtZS5yZXF1aXJlZD08bGk+QWxpYXMgbmFtZSBpcyByZXF1aXJlZDwvbGk+Citjb250ZXh0LnByb3BlcnRpZXM9Q29udGV4dCBQcm9wZXJ0aWVzCitjb250ZXh0LmNvb2tpZXM9Q29va2llcworY29udGV4dC5jcm9zcy5jb250ZXh0PUNyb3NzIENvbnRleHQKK2NvbnRleHQuZG9jQmFzZT1Eb2N1bWVudCBCYXNlCitjb250ZXh0Lm92ZXJyaWRlPU92ZXJyaWRlCitjb250ZXh0LnBhdGg9UGF0aAorY29udGV4dC5yZWxvYWRhYmxlPVJlbG9hZGFibGUKK2NvbnRleHQuc3dhbGxvd091dHB1dD1Td2FsbG93IE91dHB1dAorY29udGV4dC51c2VuYW1pbmc9VXNlIE5hbWluZworY29udGV4dC53b3JrZGlyPVdvcmtpbmcgRGlyZWN0b3J5Citjb250ZXh0LmxvYWRlci5wcm9wZXJ0aWVzPUxvYWRlciBQcm9wZXJ0aWVzCitjb250ZXh0LnNlc3Npb25tZ3IucHJvcGVydGllcz1TZXNzaW9uIE1hbmFnZXIgUHJvcGVydGllcworY29udGV4dC5jaGVja0ludGVydmFsPUNoZWNrIGludGVydmFsCitjb250ZXh0LnNlc3Npb25JZD1TZXNzaW9uIElEIEluaXRpYWxpemVyCitjb250ZXh0Lm1heC5zZXNzaW9ucz1NYXhpbXVtIEFjdGl2ZSBTZXNzaW9ucworY29udGV4dC5hbnRpUmVzb3VyY2VMb2NraW5nPVByZXZlbnQgTG9ja2luZyBSZXNvdXJjZXMKK2NvbnRleHQuYW50aUphckxvY2tpbmc9UHJldmVudCBKYXIgTG9ja2luZworZGVmYXVsdGNvbnRleHQucHJvcGVydGllcz1EZWZhdWx0Q29udGV4dCBQcm9wZXJ0aWVzCitlcnJvci5jb250ZXh0LmRpcmVjdG9yeT1Eb2N1bWVudCBiYXNlIGRvZXMgbm90IGV4aXN0IG9yIGlzIG5vdCBhIHJlYWRhYmxlIGRpcmVjdG9yeQorZXJyb3IuZG9jQmFzZS5yZXF1aXJlZD08bGk+RG9jdW1lbnQgYmFzZSBjYW5ub3QgYmUgbnVsbDwvbGk+CitlcnJvci5wYXRoLnJlcXVpcmVkPTxsaT5QYXRoIGNhbm5vdCBiZSBudWxsPC9saT4KK2Vycm9yLndvcmtEaXIucmVxdWlyZWQ9PGxpPldvcmtpbmcgZGlyZWN0b3J5IGNhbm5vdCBiZSBudWxsPC9saT4KK2Vycm9yLmxkckNoZWNrSW50ZXJ2YWwucmVxdWlyZWQ9PGxpPkxvYWRlciBjaGVjayBpbnRlcnZhbCBjYW5ub3QgYmUgZW1wdHk8L2xpPgorZXJyb3IubGRyQ2hlY2tJbnRlcnZhbC5mb3JtYXQ9PGxpPkxvYWRlciBjaGVjayBpbnRlcnZhbCBub3QgYSB2YWxpZCBpbnRlZ2VyITwvbGk+CitlcnJvci5sZHJDaGVja0ludGVydmFsLnJhbmdlPTxsaT5Mb2FkZXIgY2hlY2sgaW50ZXJ2YWwgc2VlbXMgb3V0IG9mIHJhbmdlLiBWYWxpZCByYW5nZSBpcyAxLTEwMDAuIDwvbGk+CitlcnJvci5tZ3JDaGVja0ludGVydmFsLnJlcXVpcmVkPTxsaT5NYW5hZ2VyIGNoZWNrIGludGVydmFsIGNhbm5vdCBiZSBlbXB0eTwvbGk+CitlcnJvci5tZ3JDaGVja0ludGVydmFsLmZvcm1hdD08bGk+TWFuYWdlciBjaGVjayBpbnRlcnZhbCBub3QgYSB2YWxpZCBpbnRlZ2VyITwvbGk+CitlcnJvci5tZ3JDaGVja0ludGVydmFsLnJhbmdlPTxsaT5NYW5hZ2VyIGNoZWNrIGludGVydmFsIHNlZW1zIG91dCBvZiByYW5nZS4gVmFsaWQgcmFuZ2UgaXMgMS0xMDAwLiA8L2xpPgorZXJyb3IubWdyU2Vzc2lvbklESW5pdC5yZXF1aXJlZD08bGk+U2Vzc2lvbiBNYW5hZ2VyIEluaXRpYWxpemF0aW9uIElEIGNhbm5vdCBiZSBlbXB0eTwvbGk+CitlcnJvci5tZ3JNYXhTZXNzaW9ucy5yZXF1aXJlZD08bGk+TWF4aW11bSBzZXNzaW9ucyBjYW5ub3QgYmUgZW1wdHk8L2xpPgorZXJyb3IubWdyTWF4U2Vzc2lvbnMuZm9ybWF0PTxsaT5NYXhpbXVtIHNlc3Npb25zIG5vdCBhIHZhbGlkIGludGVnZXIhPC9saT4KK2Vycm9yLm1nck1heFNlc3Npb25zLnJhbmdlPTxsaT5NYXhpbXVtIHNlc3Npb25zIHNlZW1zIG91dCBvZiByYW5nZS4gVmFsaWQgcmFuZ2UgaXMgLTEgdG8gMTAwLiA8L2xpPgorbGlzdC5ub25lPShOb25lKQorbG9nZ2VyLmRpcmVjdG9yeT1EaXJlY3RvcnkKK2xvZ2dlci5wcmVmaXg9UHJlZml4Citsb2dnZXIuc3VmZml4PVN1ZmZpeAorbG9nZ2VyLnRpbWVzdGFtcD1UaW1lc3RhbXAKK2xvZ2dlci5maWxlbG9nZ2VyLnByb3BlcnRpZXM9RmlsZWxvZ2dlciBzcGVjaWZpYyBQcm9wZXJ0aWVzCitsb2dnZXIudmVyYm9zaXR5bGV2ZWw9VmVyYm9zaXR5IExldmVsCitlcnJvci5sb2dnZXJOYW1lLmJhZD1JbnZhbGlkIGxvZ2dlciBuYW1lIHswfQorZXJyb3IubG9nZ2VyTmFtZS5leGlzdHM9PGxpPkEgTG9nZ2VyIGFscmVhZHkgZXhpc3RzLjwvbGk+CitlcnJvci5kaXJlY3RvcnkucmVxdWlyZWQ9PGxpPkRpcmVjdG9yeSBjYW5ub3QgYmUgZW1wdHkuPC9saT4KK2Vycm9yLnByZWZpeC5yZXF1aXJlZD08bGk+UHJlZml4IGNhbm5vdCBiZSBlbXB0eS48L2xpPgorZXJyb3Iuc3VmZml4LnJlcXVpcmVkPTxsaT5TdWZmaXggY2Fubm90IGJlIGVtcHR5LjwvbGk+CitlcnJvci52YWx2ZU5hbWUuYmFkPUludmFsaWQgdmFsdmUgbmFtZSB7MH0KK2Vycm9yLnZhdmx2ZU5hbWUuZXhpc3RzPTxsaT5WYWx2ZSBhbHJlYWR5IGV4aXN0czwvbGk+CitlcnJvci5zaW5nbGVTaWduT24uZXhpc3RzPTxsaT5TaW5nbGVTaWduT24gVmFsdmUgYWxyZWFkeSBleGlzdHM8L2xpPgordXNlci5mdWxsTmFtZT1GdWxsIE5hbWUKK3VzZXIuZ3JvdXBzPU1lbWJlciBpbiBHcm91cHMKK3VzZXIubmV3VXNlcj1DcmVhdGUgTmV3IFVzZXIgUHJvcGVydGllcwordXNlci5vbGRVc2VyPUVkaXQgRXhpc3RpbmcgVXNlciBQcm9wZXJ0aWVzCit1c2VyLnBhc3N3b3JkPVBhc3N3b3JkCit1c2VyLnByb3BlcnRpZXM9VXNlciBQcm9wZXJ0aWVzCit1c2VyLnJvbGVzPVNlY3VyaXR5IFJvbGVzCit1c2VyLnVzZXJuYW1lPVVzZXJuYW1lCitlcnJvci5wYXNzd29yZC5yZXF1aXJlZD08bGk+UGFzc3dvcmQgaXMgcmVxdWlyZWQ8L2xpPgorZXJyb3IudXNlcm5hbWUucmVxdWlyZWQ9PGxpPlVzZXJuYW1lIGlzIHJlcXVpcmVkPC9saT4KK2Vycm9yLmdldC5hdHRyaWJ1dGVzPUVycm9yIHJldHJpZXZpbmcgaW5mb3JtYXRpb24gcHJvcGVydGllcy4KK2Vycm9yLnNldC5hdHRyaWJ1dGVzPUVycm9yIHNldHRpbmcgaW5mb3JtYXRpb24gcHJvcGVydGllcy4KK2FjdGlvbnMuZGVsZXRlPURlbGV0ZQorZXJyb3IuZGVmYXVsdEhvc3QucmVxdWlyZWQ9PGxpPkRlZmF1bHQgSG9zdG5hbWUgcmVxdWlyZWQ8L2xpPgorZXJyb3IuZW5naW5lTmFtZS5iYWQ9SW52YWxpZCBlbmdpbmUgbmFtZSB7MH0KK2Vycm9yLmVuZ2luZU5hbWUuZXhpc3RzPTxsaT5FbmdpbmUgTmFtZSBhbHJlYWR5IGV4aXN0czwvbGk+CitlcnJvci5zZXJ2aWNlTmFtZS5iYWQ9SW52YWxpZCBzZXJ2aWNlIG5hbWUgezB9CitlcnJvci5zZXJ2aWNlTmFtZS5yZXF1aXJlZD08bGk+U2VydmljZSBOYW1lIHJlcXVpcmVkPC9saT4KK2Vycm9yLnNlcnZpY2VOYW1lLmV4aXN0cz08bGk+U2VydmljZSBOYW1lIGFscmVhZHkgZXhpc3RzPC9saT4KK2Vycm9yLmpkYmNyZWFsbT1FcnJvciBvY2N1cmVkIGR1cmluZyBzZXR0aW5nIEpEQkNSZWFsbS4KK2Vycm9yLmpuZGlyZWFsbT1FcnJvciBvY2N1cmVkIGR1cmluZyBzZXR0aW5nIEpORElSZWFsbS4KK2Vycm9yLnVzZXJkYnJlYWxtPUVycm9yIG9jY3VyZWQgZHVyaW5nIHNldHRpbmcgVXNlcmRhdGFiYXNlUmVhbG0uCitlcnJvci5kYXRhc291cmNlcmVhbG09RXJyb3Igb2NjdXJlZCBkdXJpbmcgc2V0dGluZyBEYXRhU291cmNlUmVhbG0uCitlcnJvci5yZWFsbU5hbWUuYmFkPUludmFsaWQgcmVhbG0gbmFtZSB7MH0KK2Vycm9yLnJlYWxtTmFtZS5yZXF1aXJlZD08bGk+UmVhbG0gTmFtZSByZXF1aXJlZC48L2xpPgorZXJyb3IucmVhbG1OYW1lLmV4aXN0cz08bGk+QSByZWFsbSBhbHJlYWR5IGV4aXN0cy48L2xpPgorZXJyb3IuY29udGV4dE5hbWUuYmFkPUludmFsaWQgY29udGV4dCBuYW1lIHswfQorZXJyb3IuY29udGV4dE5hbWUuZXhpc3RzPTxsaT5Db250ZXh0IGFscmVhZHkgZXhpc3RzLjwvbGk+CitlcnJvci5kZWZhdWx0Y29udGV4dE5hbWUuZXhpc3RzPTxsaT5EZWZhdWx0Q29udGV4dCBhbHJlYWR5IGV4aXN0cy48L2xpPgorZXJyb3IucGF0aC5wcmVmaXg9PGxpPlBhdGggbXVzdCBiZWdpbiB3aXRoIGEgJy8nLjwvbGk+CitlcnJvci5sb2FkZXJOYW1lLmJhZD1JbnZhbGlkIGxvYWRlciBuYW1lIHswfQorZXJyb3IubWFuYWdlck5hbWUuYmFkPUludmFsaWQgbWFuYWdlciBuYW1lIHswfQorZXJyb3IuY29ubmVjdG9yTmFtZS5iYWQ9SW52YWxpZCBjb25uZWN0b3IgbmFtZSB7MH0KK2Vycm9yLmNvbm5lY3Rvck5hbWUuZXhpc3RzPTxsaT5Db25uZWN0b3IgYWxyZWFkeSBleGlzdHM8L2xpPgorZXJyb3IucGF0dGVybi5yZXF1aXJlZD08bGk+UGF0dGVybiBpcyByZXF1aXJlZDwvbGk+CitlcnJvci52YWx2ZU5hbWUuYmFkPUludmFsaWQgdmFsdmUgbmFtZSB7MH0KK2Vycm9yLnZhbHZlTmFtZS5leGlzdHM9PGxpPlZhbHZlIGFscmVhZHkgZXhpc3RzPC9saT4KK3JlYWxtLmRyaXZlcj1EYXRhYmFzZSBEcml2ZXIKK3JlYWxtLnBhc3N3ZD1EYXRhYmFzZSBQYXNzd29yZAorcmVhbG0udXJsPURhdGFiYXNlIFVSTAorcmVhbG0udXNlck5hbWU9RGF0YWJhc2UgVXNlciBOYW1lCityZWFsbS5kaWdlc3Q9RGlnZXN0IEFsZ29yaXRobQorcmVhbG0ucGFzc3dvcmRDb2w9UGFzc3dvcmQgQ29sdW1uCityZWFsbS5yb2xlTmFtZUNvbD1Sb2xlIE5hbWUgQ29sdW1uCityZWFsbS51c2VyTmFtZUNvbD1Vc2VyIE5hbWUgQ29sdW1uCityZWFsbS51c2VyUm9sZVRhYmxlPVVzZXIgUm9sZSBUYWJsZQorcmVhbG0udXNlclRhYmxlPVVzZXIgVGFibGUKK3JlYWxtLnJlc291cmNlPVJlc291cmNlIE5hbWUKK3JlYWxtLnBhdGhOYW1lPVBhdGggTmFtZQorcmVhbG0uY29ubk5hbWU9Q29ubmVjdGlvbiBOYW1lCityZWFsbS5jb25uUGFzc3dvcmQ9Q29ubmVjdGlvbiBQYXNzd29yZAorcmVhbG0uY29ublVSTD1Db25uZWN0aW9uIFVSTAorcmVhbG0uY29ubkZhY3Rvcnk9Q29udGV4dCBGYWN0b3J5CityZWFsbS5yb2xlQmFzZT1Sb2xlIEJhc2UgRWxlbWVudAorcmVhbG0ucm9sZU5hbWU9Um9sZSBOYW1lCityZWFsbS51c2VyLnJvbGVOYW1lPVVzZXIgUm9sZSBOYW1lCityZWFsbS5wYXR0ZXJuPVJvbGUgU2VhcmNoIFBhdHRlcm4KK3JlYWxtLnJvbGUuc3VidHJlZT1TZWFyY2ggUm9sZSBTdWJ0cmVlCityZWFsbS51c2VyQmFzZT1Vc2VyIEJhc2UgRWxlbWVudAorcmVhbG0udXNlci5zdWJ0cmVlPVNlYXJjaCBVc2VyIFN1YnRyZWUKK3JlYWxtLnVzZXJQYXNzd29yZD1Vc2VyIFBhc3N3b3JkCityZWFsbS51c2VyUGF0dGVybj1Vc2VyIFBhdHRlcm4KK3JlYWxtLnVzZXJTZWFyY2g9VXNlciBTZWFyY2gKK3JlYWxtLmRhdGFTb3VyY2VOYW1lPURhdGFTb3VyY2UgTmFtZQorcmVhbG0ubG9jYWxEYXRhU291cmNlPUxvY2FsIERhdGFTb3VyY2UKK3JlYWxtLnVzZXJDcmVkQ29sPVVzZXIgQ3JlZGVudGlhbCBDb2x1bW4gCit2YWx2ZS5hY2Nlc3MucHJvcGVydGllcz1BY2Nlc3MgTG9nZ2VyIFByb3BlcnRpZXMKK3ZhbHZlLnJlcXVlc3QucHJvcGVydGllcz1SZXF1ZXN0IEZpbHRlciBQcm9wZXJ0aWVzCit2YWx2ZS5zaW5nbGUucHJvcGVydGllcz1TaW5nbGUgU2lnbk9uIFZhbHZlIFByb3BlcnRpZXMKK3ZhbHZlLnJlbW90ZWhvc3QucHJvcGVydGllcz1SZW1vdGUgSG9zdCBWYWx2ZSBQcm9wZXJ0aWVzCit2YWx2ZS5yZW1vdGVhZGRyZXNzLnByb3BlcnRpZXM9UmVtb3RlIEFkZHJlc3MgVmFsdmUgUHJvcGVydGllcwordmFsdmUucmVzb2x2ZUhvc3RzPVJlc29sdmUgSG9zdHMKK3ZhbHZlLnJvdGF0YWJsZT1Sb3RhdGFibGUKK3ZhbHZlLnBhdHRlcm49UGF0dGVybgordmFsdmUuYWxsb3dIb3N0cz1BbGxvdyB0aGVzZSBIb3N0cwordmFsdmUuZGVueUhvc3RzPURlbnkgdGhlc2UgSG9zdHMKK3ZhbHZlLmFsbG93SVBzPUFsbG93IElQIGFkZHJlc3NlcwordmFsdmUuZGVueUlQcz1EZW55IElQIGFkZHJlc3NlcworZXJyb3IuYWxsb3dIb3N0PTxsaT5BbGxvdyBpcyBpbnZhbGlkLiAgTmVlZCB0byBpbmNsdWRlIHRoZSBhZG1pbidzIEhvc3RuYW1lLjwvbGk+CitlcnJvci5kZW55SG9zdD08bGk+RGVueSBpcyBpbnZhbGlkLiAgTmVlZCB0byBleGNsdWRlIHRoZSBhZG1pbidzIEhvc3RuYW1lLjwvbGk+CitlcnJvci5hbGxvd0lQPTxsaT5BbGxvdyBpcyBpbnZhbGlkLiAgTmVlZCB0byBpbmNsdWRlIHRoZSBhZG1pbidzIElQIGFkZHJlc3MuPC9saT4KK2Vycm9yLmRlbnlJUD08bGk+RGVueSBpcyBpbnZhbGlkLiAgTmVlZCB0byBleGNsdWRlIHRoZSBhZG1pbidzIElQIGFkZHJlc3MuPC9saT4KK2Vycm9yLmFsbG93LmRlbnkucmVxdWlyZWQ9PGxpPkFsbG93IG9yIGRlbnkgaXMgcmVxdWlyZWQuPC9saT4KK2Vycm9yLnN5bnRheD08bGk+U3ludGF4IGVycm9yIGluIHJlcXVlc3QgZmlsdGVyIHBhdHRlcm4uPC9saT4KK2Vycm9yLnJlc291cmNlLnJlcXVpcmVkPTxsaT5SZXNvdXJjZSBOYW1lIGlzIHJlcXVpcmVkLjwvbGk+CitlcnJvci5yZXNvdXJjZS5qYXZhcHJlZml4PTxsaT5SZXNvdXJjZSBtdXN0IGhhdmUgImphdmE6IiBwcmVmaXguPC9saT4KK2Vycm9yLnBhdGhOYW1lLnJlcXVpcmVkPTxsaT5QYXRoIE5hbWUgaXMgcmVxdWlyZWQuPC9saT4KK2Vycm9yLmRyaXZlci5yZXF1aXJlZD08bGk+RGF0YWJhc2UgZHJpdmVyIGlzIHJlcXVpcmVkLjwvbGk+CitlcnJvci5yb2xlTmFtZUNvbC5yZXF1aXJlZD08bGk+Um9sZSBuYW1lIGNvbHVtbiBpcyByZXF1aXJlZC48L2xpPgorZXJyb3IudXNlck5hbWVDb2wucmVxdWlyZWQ9PGxpPlVzZXIgbmFtZSBjb2x1bW4gaXMgcmVxdWlyZWQuPC9saT4KK2Vycm9yLnBhc3N3b3JkQ29sLnJlcXVpcmVkPTxsaT5QYXNzd29yZCBjb2x1bW4gaXMgcmVxdWlyZWQuPC9saT4KK2Vycm9yLnVzZXJUYWJsZS5yZXF1aXJlZD08bGk+VXNlciB0YWJsZSBpcyByZXF1aXJlZC48L2xpPgorZXJyb3Iucm9sZVRhYmxlLnJlcXVpcmVkPTxsaT5Vc2VyIHJvbGUgdGFibGUgaXMgcmVxdWlyZWQuPC9saT4KK2Vycm9yLmNvbm5lY3Rpb25QYXNzd29yZC5yZXF1aXJlZD08bGk+RGF0YWJhc2UgcGFzc3dvcmQgaXMgcmVxdWlyZWQuPC9saT4KK2Vycm9yLmNvbm5lY3Rpb25VUkwucmVxdWlyZWQ9PGxpPkRhdGFiYXNlIFVSTCBpcyByZXF1aXJlZC48L2xpPgorZXJyb3IuY29ubmVjdGlvbk5hbWUucmVxdWlyZWQ9PGxpPkRhdGFiYXNlIHVzZXJuYW1lIGlzIHJlcXVpcmVkLjwvbGk+CitlcnJvci5yb2xlTmFtZS5yZXF1aXJlZD08bGk+Um9sZSBuYW1lIGlzIHJlcXVpcmVkLjwvbGk+CitlcnJvci51c2VyUm9sZU5hbWUucmVxdWlyZWQ9PGxpPlVzZXIgUm9sZSBuYW1lIGlzIHJlcXVpcmVkLjwvbGk+CitlcnJvci5kaWdlc3QucmVxdWlyZWQ9PGxpPkRpZ2VzdCBhbGdvcml0aG0gaXMgcmVxdWlyZWQuPC9saT4KK2Vycm9yLnJvbGVCYXNlLnJlcXVpcmVkPTxsaT5Sb2xlIGJhc2UgZWxlbWVudCBpcyByZXF1aXJlZC48L2xpPgorZXJyb3Iucm9sZVBhdHRlcm4ucmVxdWlyZWQ9PGxpPlJvbGUgc2VhcmNoIHBhdHRlcm4gaXMgcmVxdWlyZWQuPC9saT4KK2Vycm9yLnVzZXJCYXNlLnJlcXVpcmVkPTxsaT5Vc2VyIGJhc2UgZWxlbWVudCBpcyByZXF1aXJlZC48L2xpPgorZXJyb3IudXNlclBhc3N3b3JkLnJlcXVpcmVkPTxsaT5Vc2VyIFBhc3N3b3JkIGlzIHJlcXVpcmVkLjwvbGk+CitlcnJvci51c2VyUGF0dGVybi5yZXF1aXJlZD08bGk+VXNlciBwYXR0ZXJuIGlzIHJlcXVpcmVkLjwvbGk+CitlcnJvci51c2VyU2VhcmNoLnJlcXVpcmVkPTxsaT5Vc2VyIHNlYXJjaCBpcyByZXF1aXJlZC48L2xpPgorZXJyb3IudXNlclBhdHRlcm4udXNlclNlYXJjaC5kZWZpbmVkPTxsaT5FaXRoZXIgdXNlclBhdHRlcm4gb3IgdXNlclNlYXJjaCBtdXN0IGJlIHNwZWNpZmllZCBub3QgYm90aC48L2xpPgorZXJyb3IuY29udGV4dEZhY3RvcnkucmVxdWlyZWQ9PGxpPkNvbnRleHQgRmFjdG9yeSBpcyByZXF1aXJlZC48L2xpPgorZXJyb3IuY29ublBhc3N3b3JkLnJlcXVpcmVkPTxsaT5Db25uZWN0aW9uIHBhc3N3b3JkIGlzIHJlcXVpcmVkLjwvbGk+CitlcnJvci5jb25uVVJMLnJlcXVpcmVkPTxsaT5Db25uZWN0aW9uIFVSTCBpcyByZXF1aXJlZC48L2xpPgorZXJyb3IuY29ubk5hbWUucmVxdWlyZWQ9PGxpPkNvbm5lY3Rpb24gbmFtZSBpcyByZXF1aXJlZC48L2xpPgorZXJyb3IuZGF0YVNvdXJjZU5hbWUucmVxdWlyZWQ9PGxpPkRhdGFTb3VyY2UgbmFtZSBpcyByZXF1aXJlZC48L2xpPgorZXJyb3IudXNlckNyZWRDb2wucmVxdWlyZWQ9PGxpPlVzZXIgY3JlZGVudGlhbCBpcyByZXF1aXJlZC48L2xpPgorZXJyb3IudXNlclJvbGVUYWJsZS5yZXF1aXJlZD08bGk+VXNlciByb2xlIHRhYmxlIGlzIHJlcXVpcmVkLjwvbGk+CisKKyMgLS0tLS0tLS0tLSBTZXJ2ZXIgTW9kdWxlIC0tLS0tLS0tLS0KK3NlcnZlci5zZXJ2aWNlLnRyZWVCdWlsZGVyLnN1YnRyZWVOb2RlPVNlcnZpY2UKK3NlcnZlci5zZXJ2aWNlLnRyZWVCdWlsZGVyLmNvbm5lY3Rvcj1Db25uZWN0b3IKK3NlcnZlci5zZXJ2aWNlLnRyZWVCdWlsZGVyLmhvc3Q9SG9zdAorc2VydmVyLnNlcnZpY2UudHJlZUJ1aWxkZXIuY29udGV4dD1Db250ZXh0IAorc2VydmVyLnNlcnZpY2UudHJlZUJ1aWxkZXIubG9nZ2VyRm9yPUxvZ2dlciBmb3IgezB9CitzZXJ2ZXIuc2VydmljZS50cmVlQnVpbGRlci5yZWFsbUZvcj1SZWFsbSBmb3IgezB9IAorc2VydmVyLnNlcnZpY2UudHJlZUJ1aWxkZXIubG9nZ2VyPUxvZ2dlcgorc2VydmVyLnNlcnZpY2UudHJlZUJ1aWxkZXIucmVhbG09UmVhbG0KKworIyAtLS0tLS0tLS0tIFJlc291cmNlcyBNb2R1bGUgLS0tLS0tLS0tLQorcmVzb3VyY2VzLnRyZWVCdWlsZGVyLnN1YnRyZWVOb2RlPVJlc291cmNlcworcmVzb3VyY2VzLnRyZWVCdWlsZGVyLmRhdGFzb3VyY2VzPURhdGEgU291cmNlcworcmVzb3VyY2VzLnRyZWVCdWlsZGVyLm1haWxzZXNzaW9ucz1NYWlsIFNlc3Npb25zCityZXNvdXJjZXMudHJlZUJ1aWxkZXIucmVzb3VyY2VsaW5rcz1SZXNvdXJjZSBMaW5rcworcmVzb3VyY2VzLmVudi5lbnRyaWVzPUVudmlyb25tZW50IEVudHJpZXMKK3Jlc291cmNlcy5lbnYuZW50cnk9RW50cnkgTmFtZQorcmVzb3VyY2VzLmVudi5wcm9wcz1FbnZpcm9ubWVudCBFbnRyeSBQcm9wZXJ0aWVzCityZXNvdXJjZXMuZW52Lm92ZXJyaWRlPU92ZXJyaWRlIEFwcGxpY2F0aW9uIExldmVsIEVudHJpZXMKK3Jlc291cmNlcy5hY3Rpb25zLmVudi5jcmVhdGU9Q3JlYXRlIE5ldyBFbnYgRW50cnkKK3Jlc291cmNlcy5hY3Rpb25zLmVudi5lZGl0PUVkaXQgRW52aXJvbm1lbnQgRW50cnkKK3Jlc291cmNlcy5hY3Rpb25zLmVudi5kZWxldGU9RGVsZXRlIEVudmlyb25tZW50IEVudHJpZXMKK3Jlc291cmNlcy5hY3Rpb25zLmVudi5saXN0PUxpc3QgRXhpc3RpbmcgRW50cmllcworcmVzb3VyY2VzLmRhdGFzcmMuamRiYz1KREJDIERyaXZlcgorcmVzb3VyY2VzLmFjdGlvbnMuZGF0YXNyYz1EYXRhIFNvdXJjZXMKK3Jlc291cmNlcy5hY3Rpb25zLmRhdGFzcmMuY3JlYXRlPUNyZWF0ZSBOZXcgRGF0YSBTb3VyY2UKK3Jlc291cmNlcy5hY3Rpb25zLmRhdGFzcmMuZGVsZXRlPURlbGV0ZSBEYXRhIFNvdXJjZXMKK3Jlc291cmNlcy5hY3Rpb25zLmRhdGFzcmMuZWRpdD1FZGl0IERhdGEgU291cmNlCityZXNvdXJjZXMuZGF0YXNyYy51cmw9RGF0YSBTb3VyY2UgVVJMCityZXNvdXJjZXMuZGF0YXNyYy5qZGJjY2xhc3M9SkRCQyBEcml2ZXIgQ2xhc3MKK3Jlc291cmNlcy5kYXRhc3JjLmNvbm5lY3Rpb25zPUNvbm5lY3Rpb25zCityZXNvdXJjZXMuZGF0YXNyYy5hY3RpdmU9TWF4LiBBY3RpdmUgQ29ubmVjdGlvbnMKK3Jlc291cmNlcy5kYXRhc3JjLmlkbGU9TWF4LiBJZGxlIENvbm5lY3Rpb25zCityZXNvdXJjZXMuZGF0YXNyYy53YWl0PU1heC4gV2FpdCBmb3IgQ29ubmVjdGlvbgorcmVzb3VyY2VzLmRhdGFzcmMudmFsaWRhdGlvbj1WYWxpZGF0aW9uIFF1ZXJ5CityZXNvdXJjZXMuZGF0YXNyYy5qbmRpPUpOREkgTmFtZQorcmVzb3VyY2VzLmFjdGlvbnMubWFpbHNlc3Npb249TWFpbCBTZXNzaW9ucworcmVzb3VyY2VzLmFjdGlvbnMubWFpbHNlc3Npb24uY3JlYXRlPUNyZWF0ZSBOZXcgTWFpbCBTZXNzaW9uCityZXNvdXJjZXMuYWN0aW9ucy5tYWlsc2Vzc2lvbi5kZWxldGU9RGVsZXRlIE1haWwgU2Vzc2lvbgorcmVzb3VyY2VzLmFjdGlvbnMubWFpbHNlc3Npb24uZWRpdD1FZGl0IE1haWwgU2Vzc2lvbgorcmVzb3VyY2VzLm1haWxzZXNzaW9uLm5hbWU9TmFtZQorcmVzb3VyY2VzLm1haWxzZXNzaW9uLm1haWxob3N0PW1haWwuc210cC5ob3N0CityZXNvdXJjZXMuYWN0aW9ucy5yZXNvdXJjZWxrPVJlc291cmNlIExpbmtzCityZXNvdXJjZXMuYWN0aW9ucy5yZXNvdXJjZWxrLmNyZWF0ZT1DcmVhdGUgTmV3IFJlc291cmNlIExpbmsKK3Jlc291cmNlcy5hY3Rpb25zLnJlc291cmNlbGsuZGVsZXRlPURlbGV0ZSBSZXNvdXJjZSBMaW5rCityZXNvdXJjZXMuYWN0aW9ucy5yZXNvdXJjZWxrLmVkaXQ9RWRpdCBSZXNvdXJjZSBMaW5rCityZXNvdXJjZXMucmVzb3VyY2Vsay5uYW1lPU5hbWUKK3Jlc291cmNlcy5yZXNvdXJjZWxrLmdsb2JhbD1HbG9iYWwKK3Jlc291cmNlcy5yZXNvdXJjZWxrLnR5cGU9VHlwZQorcmVzb3VyY2VzLmVycm9yLm5hbWUucmVxdWlyZWQ9PGxpPk5hbWUgaXMgcmVxdWlyZWQuPC9saT4KK3Jlc291cmNlcy5lcnJvci5nbG9iYWwucmVxdWlyZWQ9PGxpPkdsb2JhbCBpcyByZXF1aXJlZC48L2xpPgorcmVzb3VyY2VzLmVycm9yLnR5cGUucmVxdWlyZWQ9PGxpPlR5cGUgaXMgcmVxdWlyZWQuPC9saT4KK3Jlc291cmNlcy5lcnJvci52YWx1ZS5yZXF1aXJlZD08bGk+VmFsdWUgaXMgcmVxdWlyZWQuPC9saT4KK3Jlc291cmNlcy5lcnJvci52YWx1ZS5taXNtYXRjaD08bGk+VHlwZSBhbmQgdmFsdWUgZG8gbm90IHNlZW0gdG8gbWF0Y2guPC9saT4KK3Jlc291cmNlcy5lcnJvci5lbnRyeVR5cGUuaW52YWxpZD08bGk+RW50cnkgVHlwZSBub3QgcmVjb2duaXplZC48L2xpPgorcmVzb3VyY2VzLmVycm9yLmVudHJ5VHlwZS5ub3RpbXBsPTxsaT5WYWxpZGF0aW9uIGZvciB0aGlzIHR5cGUgbm90IGltcGxlbWVudGVkIHlldC48L2xpPgorcmVzb3VyY2VzLmVycm9yLnVybC5yZXF1aXJlZD08bGk+RGF0YSBTb3VyY2UgVVJMIGlzIHJlcXVpcmVkLjwvbGk+CityZXNvdXJjZXMuZXJyb3IuZHJpdmVyQ2xhc3MucmVxdWlyZWQ9PGxpPkpEQkMgRHJpdmVyIENsYXNzIGlzIHJlcXVpcmVkLjwvbGk+CityZXNvdXJjZXMuZXJyb3IuYWN0aXZlLnJlcXVpcmVkPTxsaT5NYXggQWN0aXZlIENvbm5lY3Rpb25zIGlzIHJlcXVpcmVkLjwvbGk+CityZXNvdXJjZXMuZXJyb3IuaWRsZS5yZXF1aXJlZD08bGk+TWF4IElkbGUgQ29ubmVjdGlvbnMgaXMgcmVxdWlyZWQuPC9saT4KK3Jlc291cmNlcy5lcnJvci53YWl0LnJlcXVpcmVkPTxsaT5NYXggV2FpdCBmb3IgYSBDb25uZWN0aW9uIGlzIHJlcXVpcmVkLjwvbGk+CityZXNvdXJjZXMuZXJyb3IubWFpbGhvc3QucmVxdWlyZWQ9PGxpPm1haWwuc210cC5ob3N0IGlzIHJlcXVpcmVkLjwvbGk+CityZXNvdXJjZXMuaW50ZWdlci5lcnJvcj08bGk+SW52YWxpZCBpbnRlZ2VyIGVycm9yLjwvbGk+CityZXNvdXJjZXMuYWN0aW9ucy51c2VyZGIuY3JlYXRlPUNyZWF0ZSBOZXcgVXNlciBEYXRhYmFzZQorcmVzb3VyY2VzLmFjdGlvbnMudXNlcmRiLmVkaXQ9RWRpdCBVc2VyIERhdGFiYXNlCityZXNvdXJjZXMuYWN0aW9ucy51c2VyZGIuZGVsZXRlPURlbGV0ZSBVc2VyIERhdGFiYXNlcworcmVzb3VyY2VzLnVzZXJkYi5sb2NhdGlvbj1Mb2NhdGlvbgorcmVzb3VyY2VzLnVzZXJkYi5mYWN0b3J5PUZhY3RvcnkKK3Jlc291cmNlcy50cmVlQnVpbGRlci5kYXRhYmFzZXM9VXNlciBEYXRhYmFzZXMKK3Jlc291cmNlcy5lcnJvci5wYXRoLnJlcXVpcmVkPTxsaT5QYXRoIGlzIHJlcXVpcmVkPC9saT4KK3Jlc291cmNlcy5lcnJvci5qbmRpTmFtZS5yZXF1aXJlZD08bGk+Sk5ESSBOYW1lIGlzIHJlcXVpcmVkPC9saT4KK3Jlc291cmNlcy5pbnZhbGlkLm5hbWU9PGxpPkludmFsaWQgcmVzb3VyY2UgbmFtZSAtIE5hbWUgYWxyZWFkeSBleGlzdHMuPC9saT4KK3Jlc291cmNlcy5pbnZhbGlkLmVudj08bGk+SW52YWxpZCBlbnZpcm9ubWVudCBuYW1lIC0gTmFtZSBhbHJlYWR5IGV4aXN0cy48L2xpPgorCisjIC0tLS0tLS0tLS0gVXNlciBEYXRhYmFzZSBNb2R1bGUgLS0tLS0tLS0tLQordXNlcnMuYWN0aW9ucy5ncm91cC5jcmVhdGU9Q3JlYXRlIE5ldyBHcm91cAordXNlcnMuYWN0aW9ucy5ncm91cC5kZWxldGU9RGVsZXRlIEV4aXN0aW5nIEdyb3VwcwordXNlcnMuYWN0aW9ucy5ncm91cC5saXN0PUxpc3QgRXhpc3RpbmcgR3JvdXBzCit1c2Vycy5hY3Rpb25zLnJvbGUuY3JlYXRlPUNyZWF0ZSBOZXcgUm9sZQordXNlcnMuYWN0aW9ucy5yb2xlLmRlbGV0ZT1EZWxldGUgRXhpc3RpbmcgUm9sZXMKK3VzZXJzLmFjdGlvbnMucm9sZS5saXN0PUxpc3QgRXhpc3RpbmcgUm9sZXMKK3VzZXJzLmFjdGlvbnMudXNlci5jcmVhdGU9Q3JlYXRlIE5ldyBVc2VyCit1c2Vycy5hY3Rpb25zLnVzZXIuZGVsZXRlPURlbGV0ZSBFeGlzdGluZyBVc2VycwordXNlcnMuYWN0aW9ucy51c2VyLmxpc3Q9TGlzdCBFeGlzdGluZyBVc2VycwordXNlcnMuZGVsZXRlR3JvdXBzLnRpdGxlPURlbGV0ZSBFeGlzdGluZyBHcm91cHMKK3VzZXJzLmRlbGV0ZVJvbGVzLnRpdGxlPURlbGV0ZSBFeGlzdGluZyBSb2xlcwordXNlcnMuZGVsZXRlVXNlcnMudGl0bGU9RGVsZXRlIEV4aXN0aW5nIFVzZXJzCit1c2Vycy5lcnJvci5hdHRyaWJ1dGUuZ2V0PUVycm9yIHJldHJpZXZpbmcgYXR0cmlidXRlIHswfQordXNlcnMuZXJyb3IuYXR0cmlidXRlLnNldD1FcnJvciBtb2RpZnlpbmcgYXR0cmlidXRlIHswfQordXNlcnMuZXJyb3IuaW52b2tlPUVycm9yIGludm9raW5nIG9wZXJhdGlvbiB7MH0KK3VzZXJzLmVycm9yLmdyb3VwbmFtZS5yZXF1aXJlZD1Hcm91cCBOYW1lIGlzIHJlcXVpcmVkCit1c2Vycy5lcnJvci5wYXNzd29yZC5yZXF1aXJlZD1QYXNzd29yZCBpcyByZXF1aXJlZAordXNlcnMuZXJyb3IucXVvdGVzPURvdWJsZSBxdW90ZSBjaGFyYWN0ZXJzIGFyZSBub3QgYWxsb3dlZCBpbiBmaWVsZCB2YWx1ZXMKK3VzZXJzLmVycm9yLnJvbGVuYW1lLnJlcXVpcmVkPVJvbGUgTmFtZSBpcyByZXF1aXJlZAordXNlcnMuZXJyb3Iuc2VsZWN0PUVycm9yIHNlbGVjdGluZyBtYW5hZ2VkIG9iamVjdHMKK3VzZXJzLmVycm9yLnRva2VuPVRyYW5zYWN0aW9uIHN1Ym1pdHRlZCBvdXQgb2Ygb3JkZXIKK3VzZXJzLmVycm9yLnVzZXJuYW1lLnJlcXVpcmVkPTxsaT5Vc2VyIE5hbWUgaXMgcmVxdWlyZWQ8L2xpPgordXNlcnMuZ3JvdXAubmV3R3JvdXA9Q3JlYXRlIE5ldyBHcm91cCBQcm9wZXJ0aWVzCit1c2Vycy5ncm91cC5vbGRHcm91cD1FZGl0IEV4aXN0aW5nIEdyb3VwIFByb3BlcnRpZXMKK3VzZXJzLmdyb3VwLnByb3BlcnRpZXM9R3JvdXAgUHJvcGVydGllcwordXNlcnMubGlzdC5kZXNjcmlwdGlvbj1EZXNjcmlwdGlvbgordXNlcnMubGlzdC5mdWxsTmFtZT1GdWxsIE5hbWUKK3VzZXJzLmxpc3QuZ3JvdXBuYW1lPUdyb3VwIE5hbWUKK3VzZXJzLmxpc3Qucm9sZW5hbWU9Um9sZSBOYW1lCit1c2Vycy5saXN0LnVzZXJuYW1lPVVzZXIgTmFtZQordXNlcnMubGlzdEdyb3Vwcy50aXRsZT1Hcm91cHMgTGlzdAordXNlcnMubGlzdFJvbGVzLnRpdGxlPVJvbGVzIExpc3QKK3VzZXJzLmxpc3RVc2Vycy50aXRsZT1Vc2VycyBMaXN0Cit1c2Vycy5wcm9tcHQuZGVzY3JpcHRpb249RGVzY3JpcHRpb246Cit1c2Vycy5wcm9tcHQuZnVsbE5hbWU9RnVsbCBOYW1lOgordXNlcnMucHJvbXB0Lmdyb3VwbmFtZT1Hcm91cCBOYW1lOgordXNlcnMucHJvbXB0LnBhc3N3b3JkPVBhc3N3b3JkOgordXNlcnMucHJvbXB0LnJvbGVuYW1lPVJvbGUgTmFtZToKK3VzZXJzLnByb21wdC51c2VybmFtZT1Vc2VyIE5hbWU6Cit1c2Vycy5yb2xlLm5ld1JvbGU9Q3JlYXRlIE5ldyBSb2xlIFByb3BlcnRpZXMKK3VzZXJzLnJvbGUub2xkUm9sZT1FZGl0IEV4aXN0aW5nIFJvbGUgUHJvcGVydGllcwordXNlcnMucm9sZS5wcm9wZXJ0aWVzPVJvbGUgUHJvcGVydGllcwordXNlcnMudHJlZUJ1aWxkZXIuZ3JvdXBzTm9kZT1Hcm91cHMKK3VzZXJzLnRyZWVCdWlsZGVyLnJvbGVzTm9kZT1Sb2xlcwordXNlcnMudHJlZUJ1aWxkZXIuc3VidHJlZU5vZGU9VXNlciBEZWZpbml0aW9uCit1c2Vycy50cmVlQnVpbGRlci51c2Vyc05vZGU9VXNlcnMKK3VzZXJzLnVzZXIubmV3VXNlcj1DcmVhdGUgTmV3IFVzZXIgUHJvcGVydGllcwordXNlcnMudXNlci5vbGRVc2VyPUVkaXQgRXhpc3RpbmcgVXNlciBQcm9wZXJ0aWVzCit1c2Vycy51c2VyLnByb3BlcnRpZXM9VXNlciBQcm9wZXJ0aWVzCisjIC0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL0FwcGxpY2F0aW9uUmVzb3VyY2VzX2VzLnByb3BlcnRpZXMgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vQXBwbGljYXRpb25SZXNvdXJjZXNfZXMucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjU1Nzk2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL0FwcGxpY2F0aW9uUmVzb3VyY2VzX2VzLnByb3BlcnRpZXMKQEAgLTAsMCArMSw0MzkgQEAKK2FwcGxpY2F0aW9uLnRpdGxlPUFkbWluaXN0cmFjafNuIGRlbCBTZXJ2aWRvciBUb21jYXQKK2Vycm9ycy5oZWFkZXI9PGgzPjxmb250IGNvbG9yPSJyZWQiPkVycm9yKGVzKSBkZSBWYWxpZGFjafNuPC9mb250PjwvaDM+RGViZSBjb3JyZWdpciBlbC9sb3Mgc2lndWllbnRlKHMpIGVycm9yKGVzKSBhbnRlcyBkZSBjb250aW51YXI6PHVsPgorZXJyb3JzLmZvb3Rlcj08L3VsPjxocj4KK2Vycm9yLmxvZ2luPTxsaT5Ob21icmUgZGUgdXN1YXJpbyBvIGNvbnRyYXNl8WEgaW524WxpZG9zPC9saT4KK3Byb21wdC51c2VybmFtZT1Ob21icmUgZGUgVXN1YXJpbworcHJvbXB0LnBhc3N3b3JkPUNvbnRyYXNl8WEKK2J1dHRvbi5sb2dpbj1Mb2dpbgorYnV0dG9uLnJlc2V0PUxpbXBpYXIKK2J1dHRvbi5zYXZlPUd1YXJkYXIKK2J1dHRvbi5jaGFuZ2U9Q2FtYmlhcgorYnV0dG9uLmNhbmNlbD1DYW5jZWxhcgorYnV0dG9uLmNvbW1pdD1BY29tZXRlciBDYW1iaW9zCitidXR0b24ubG9nb3V0PVNhbGlyCitsb2dpbi5lbnRlcj1JbnRyb2R1emNhIHVuIG5vbWJyZSBkZSB1c3VhcmlvIHkgdW5hIGNvbnRyYXNl8WEgcGFyYSBpbmljaWFyIHVuYSBudWV2YSBzZXNp824KK2xvZ2luLmNoYW5nZUxhbmd1YWdlPUNhbWJpbyBkZSBpZGlvbWEKK2Vycm9yLmxvZ2luPU5vbWJyZSBkZSB1c3VhcmlvIG8gY29udHJhc2XxYSBpbnbhbGlkb3MKK2Vycm9yLnRyeWFnYWluPVBhcmEgaW50ZW50YXIgZGUgbnVldm8sIGhhZ2EgY2xpY2sKK2Vycm9yLmhlcmU9YXF17QorcHJvbXB0LnNvbWVUZXh0PUFsZ/puIFRleHRvCitwcm9tcHQubW9yZVRleHQ9TeFzIFRleHRvCitzYW1wbGUuc29tZVRleHQucmVxdWlyZWQ9PGxpPiJBbGf6biBUZXh0byIgbm8gcHVlZGUgZXN0YXIgdmFj7W88L2xpPgorc2FtcGxlLm1vcmVUZXh0LnJlcXVpcmVkPTxsaT4iTeFzIFRleHRvIiBubyBwdWVkZSBlc3RhciB2YWPtbzwvbGk+CitzYXZlLnN1Y2Nlc3M9oUd1YXJkYXJkbyBjb24g6XhpdG8hCitzYXZlLmZhaWw9oUZhbGxvIGFsIGd1YXJkYXIhCitzZXJ2ZXIucG9ydG51bWJlcj1O+m1lcm8gZGUgUHVlcnRvCitzZXJ2ZXIuZGVidWdsZXZlbD1OaXZlbCBkZSBEZXB1cmFjafNuCitzZXJ2ZXIuc2h1dGRvd249QXBhZ2FyCitzZXJ2ZXIucHJvcGVydGllcz1Qcm9waWVkYWRlcyBkZWwgU2Vydmlkb3IKK3dhcm5pbmcuaGVhZGVyPTxjZW50ZXI+PGg0Pjxmb250IGNvbG9yPSJyZWQiPqFBdmlzbyE8L2ZvbnQ+PC9oND48L2NlbnRlcj4gPHVsPgorc2VydmVyLnBvcnQud2FybmluZz08bGk+RWwgbvptZXJvIGRlIHB1ZXJ0byBpbmZlcmlvciBhIDEwMjQgcmVxdWllcmUgY2FwYWNpZGFkZXMgZXNwZWNpYWxlcyBkZWwgc29mdHdhcmUuPC9saT4KK2Vycm9yLnBvcnROdW1iZXIucmVxdWlyZWQ9PGxpPkVsIG76bWVybyBkZWwgcHVlcnRvIG5vIHB1ZWRlIGVzdGFyIHZhY+1vLjwvbGk+CitlcnJvci5wb3J0TnVtYmVyLmZvcm1hdD08bGk+oUVsIG76bWVybyBkZWwgcHVlcnRvIG5vIGVzIHVuIGVudGVybyB24WxpZG8hIDwvbGk+CitlcnJvci5wb3J0TnVtYmVyLnJhbmdlPTxsaT5FbCBu+m1lcm8gZGVsIHB1ZXJ0byBlc3RhIGZ1ZXJhIGRlbCByYW5nby4gRWwgcmFuZ28gduFsaWRvIGVzIDEtNjU1MzUuPC9saT4KK2Vycm9yLnNodXRkb3duVGV4dC5sZW5ndGg9PGxpPqFMYSBsb25naXR1ZCBkZWwgVGV4dG8gcGFyYSBBcGFnYXIgZGViZSBzZXIgZGUgYWwgbWVub3MgNiBjYXJhY3RlcmVzITwvbGk+CitlcnJvci5lbmdpbmVOYW1lLnJlcXVpcmVkPTxsaT5TZSByZXF1aWVyZSBlbCBub21icmUgZGVsIE1vdG9yPC9saT4KK2Vycm9yLmFjY2VwdENvdW50VGV4dC5yZXF1aXJlZD08bGk+U2UgcmVxdWllcmUgY29udGFkb3IgZGUgQWNlcHRhY2nzbjwvbGk+CitlcnJvci5hY2NlcHRDb3VudFRleHQuZm9ybWF0PTxsaT6hRWwgY29udGFkb3IgZGUgQWNlcHRhY2nzbiBubyBlcyB1biBlbnRlcm8gduFpZG8hPC9saT4KK2Vycm9yLmFjY2VwdENvdW50VGV4dC5yYW5nZT08bGk+RWwgY29udGFkb3IgZGUgYWNlcHRhY2nzbiBwYXJlY2UgZXN0YXIgZnVlcmEgZGUgcmFuZ28uIEVsIHJhbmdvIHbhbGlkbyB2YSBkZSAwLTEyOC4gPC9saT4KK2Vycm9yLmNvbm5UaW1lT3V0VGV4dC5yZXF1aXJlZD08bGk+RWwgdGllbXBvIGRlIGVzcGVyYSBkZSBsYSBjb25leGnzbiBubyBwdWVkZSBlc3RhciB2YWPtby48L2xpPgorZXJyb3IuY29ublRpbWVPdXRUZXh0LmZvcm1hdD08bGk+oUVsIHRpZW1wbyBkZSBlc3BlcmEgZGUgbGEgY29uZXhp824gbm8gZXMgdW4gZW50ZXJvIHbhbGlkbyEgPC9saT4KK2Vycm9yLmNvbm5UaW1lT3V0VGV4dC5yYW5nZT08bGk+RWwgdGllbXBvIGRlIGVzcGVyYSBkZSBsYSBjb25leGnzbiBwYXJlY2UgZXN0YXIgZnVlcmEgZGUgcmFuZ28uIEVsIHJhbmdvIHbhbGlkbyB2YSBkZSAwLTYwMDAwLiA8L2xpPgorZXJyb3IuYnVmZmVyU2l6ZVRleHQucmVxdWlyZWQ9PGxpPlRhbWHxbyBkZWwgQvpmZXIgcmVxdWVyaWRvPC9saT4KK2Vycm9yLmJ1ZmZlclNpemVUZXh0LmZvcm1hdD08bGk+oUVsIFRhbWHxbyBkZWwgQvpmZXIgbm8gZXMgdW4gZW50ZXJvISA8L2xpPgorZXJyb3IuYnVmZmVyU2l6ZVRleHQucmFuZ2U9PGxpPlRhbWHxbyBkZWwgQvpmZXIgcGFyZWNlIGVzdGFyIGZ1ZXJhIGRlbCByYW5nby4gRWwgcmFuZ28gduFsaWRvIHZhIGRlIDEtODE5Mi4gPC9saT4KK2Vycm9yLmFkZHJlc3MuaW52YWxpZD08bGk+RGlyZWNjafNuIElQIGluduFsaWRhPC9saT4KK2Vycm9yLnJlZGlyZWN0UG9ydFRleHQucmVxdWlyZWQ9PGxpPk76bWVybyBkZWwgcHVlcnRvIGRlIHJlZGlyZWNjaW9uYW1pZW50byBubyBwdWVkZSBlc3RhciB2YWPtbyA8L2xpPgorZXJyb3IucmVkaXJlY3RQb3J0VGV4dC5mb3JtYXQ9PGxpPqFFbCBO+m1lcm8gZGVsIHB1ZXJ0byBkZSByZWRpcmVjY2lvbmFtaWVudG8gbm8gZXMgdW4gZW50ZXJvIHbhbGlkbyEgPC9saT4KK2Vycm9yLnJlZGlyZWN0UG9ydFRleHQucmFuZ2U9PGxpPk76bWVybyBkZWwgcHVlcnRvIGRlIHJlZGlyZWNjaW9uYW1pZW50byBwYXJlY2UgZXN0YXIgZnVlcmEgZGUgcmFuZ28uIEVsIHJhbmdvIHbhbGlkbyB2YSBkZSAxLTY1NTM1LjwvbGk+CitlcnJvci5taW5Qcm9jZXNzb3JzVGV4dC5yZXF1aXJlZD08bGk+RWwgbe1uaW1vIGRlIHByb2Nlc2Fkb3JlcyBubyBwdWVkZSBlc3RhciB2YWPtbzwvbGk+CitlcnJvci5taW5Qcm9jZXNzb3JzVGV4dC5mb3JtYXQ9PGxpPqFFbCBN7W5pbW8gZGUgcHJvY2VzYWRvcmVzIG5vIGVzIHVuIGVudGVybyB24WxpZG8hPC9saT4KK2Vycm9yLm1pblByb2Nlc3NvcnNUZXh0LnJhbmdlPTxsaT5FbCBt7W5pbW8gZGUgcHJvY2VzYWRvcmVzIHBhcmVjZSBlc3RhciBmdWVyYSBkZSByYW5nby4gRWwgcmFuZ28gduFsaWRvIHZhIGRlIDEtNTEyLjwvbGk+CitlcnJvci5tYXhQcm9jZXNzb3JzVGV4dC5yZXF1aXJlZD08bGk+RWwgbeF4aW1vIGRlIHByb2Nlc2Fkb3JlcyBubyBwdWVkZSBlc3RhciB2YWPtZG88L2xpPgorZXJyb3IubWF4UHJvY2Vzc29yc1RleHQuZm9ybWF0PTxsaT6hRWwgTeF4aW1vIGRlIHByb2Nlc2Fkb3JlcyBubyBlcyB1biBlbnRlcm8gduFsaWRvITwvbGk+CitlcnJvci5tYXhQcm9jZXNzb3JzVGV4dC5yYW5nZT08bGk+RWwgbeF4aW1vIGRlIHByb2Nlc2Fkb3JlcyBwYXJlY2UgZXN0YXIgZnVlcmEgZGUgcmFuZ28uIEVsIHJhbmdvIHbhbGlkbyB2YSBkZSAxLTUxMi4gVGFtYmnpbiwgbeF4aW1vID4gPSBt7W5pbW8uPC9saT4KK2Vycm9yLnByb3h5TmFtZS5pbnZhbGlkPTxsaT5FbCBub21icmUgZGVsIGFwb2RlcmFkbyAocHJveHkpIGVzIGluduFsaWRvPC9saT4KK2Vycm9yLnByb3h5UG9ydFRleHQucmVxdWlyZWQ9PGxpPkVsIG76bWVybyBkZWwgcHVlcnRvIGRlbCBhcG9kZXJhZG8gKHByb3h5KSBubyBwdWVkZSBlc3RhciB2YWPtbzwvbGk+CitlcnJvci5wcm94eVBvcnRUZXh0LmZvcm1hdD08bGk+oUVsIE76bWVybyBkZWwgcHVlcnRvIGRlbCBhcG9kZXJhZG8gKHByb3h5KSBubyBlcyB1biBlbnRlcm8gduFsaWRvITwvbGk+CitlcnJvci5wcm94eVBvcnRUZXh0LnJhbmdlPTxsaT5FbCBu+m1lcm8gZGVsIHB1ZXJ0byBkZWwgYXBvZGVyYWRvIChwcm94eSkgcGFyZWNlIGVzdGFyIGZ1ZXJhIGRlIHJhbmdvLiBFbCByYW5nbyB24WxpZG8gdmEgZGUgMS02NTUzNS48L2xpPgorZXJyb3IuaG9zdE5hbWUuYmFkPW5vbWJyZSBkZSBt4XF1aW5hIGluduFsaWRhIHswfQorZXJyb3IuaG9zdE5hbWUucmVxdWlyZWQ9PGxpPlNlIHJlcXVpZXJlIGVsIG5vbWJyZSBkZSBt4XF1aW5hPC9saT4KK2Vycm9yLmhvc3ROYW1lLmV4aXN0cz08bGk+WWEgZXhpc3RlIGVsIE5vbWJyZSBkZSBN4XF1aW5hPC9saT4KK2Vycm9yLmFwcEJhc2UucmVxdWlyZWQ9PGxpPlNlIHJlcXVpZXJlIGxhIEJhc2UgZGUgbGEgQXBsaWNhY2nzbjwvbGk+CitzZXJ2aWNlLm5hbWU9Tm9tYnJlCitzZXJ2aWNlLmVuZ2luZS5wcm9wcz1Qcm9waWVkYWRlcyBkZWwgTW90b3IKK3NlcnZpY2UuZGVmYXVsdGhvc3RuYW1lPU5vbWJyZSBkZSBN4XF1aW5hIHBvciBkZWZlY3RvCitzZXJ2aWNlLnByb3BlcnRpZXM9UHJvcGllZGFkZXMgZGVsIFNlcnZpY2lvCitzZXJ2aWNlLnByb3BlcnR5PVByb3BpZWRhZAorc2VydmljZS52YWx1ZT1WYWxvcgorc2VydmljZS5jcmVhdGUubmV3PUNyZWFyIE51ZXZvIFNlcnZpY2lvCithY3Rpb25zLmF2YWlsYWJsZS5hY3Rpb25zPUFjY2lvbmVzIERpc3BvbmlibGVzCithY3Rpb25zLnNlcnZpY2VzLmNyZWF0ZT1DcmVhciBOdWV2byBTZXJ2aWNpbworYWN0aW9ucy5zZXJ2aWNlcy5kZWxldGU9RWxpbWluYXIgRXN0ZSBTZXJ2aWNpbworYWN0aW9ucy5zZXJ2aWNlcy5kZWxldGVzPUVsaW1pbmFyIFNlcnZpY2lvcyBFeGlzdGVudGVzCithY3Rpb25zLnNlcnZpY2VzLmVkaXQ9RWRpdGFyIFNlcnZpY2lvIEV4aXN0ZW50ZQorYWN0aW9ucy5hY2Nlc3Nsb2dnZXIuY3JlYXRlPUNyZWFyIE51ZXZvIChBY2Nlc3MgTG9nZ2VyKSBSZWdpc3RyYWRvciBkZSBBY2Nlc28KK2FjdGlvbnMuYWNjZXNzbG9nZ2VyLmRlbGV0ZT1FbGltaW5hciAoQWNjZXNzIExvZ2dlcikgUmVnaXN0cmFkb3IgZGUgQWNjZXNvCithY3Rpb25zLmNvbm5lY3RvcnMuY3JlYXRlPUNyZWFyIE51ZXZvIENvbmVjdG9yCithY3Rpb25zLmNvbm5lY3RvcnMuZGVsZXRlPUVsaW1pbmFyIGVzdGUgQ29uZWN0b3IKK2FjdGlvbnMuY29ubmVjdG9ycy5kZWxldGVzPUVsaW1pbmFyIENvbmVjdG9yZXMgRXhpc3RlbnRlcworYWN0aW9ucy5jb25uZWN0b3JzLmVkaXQ9RWRpdGFyIENvbmVjdG9yIEV4aXN0ZW50ZQorYWN0aW9ucy5jb250ZXh0cy5jcmVhdGU9Q3JlYXIgTnVldm8gQ29udGV4dG8KK2FjdGlvbnMuY29udGV4dHMuZGVsZXRlPUJvcnJhciBlc3RlIENvbnRleHRvCithY3Rpb25zLmNvbnRleHRzLmRlbGV0ZXM9Qm9ycmFyIENvbnRleHRvcyBFeGlzdGVudGVzCithY3Rpb25zLmNvbnRleHRzLmVkaXQ9RWRpdGFyIENvbnRleHRvIEV4aXN0ZW50ZQorYWN0aW9ucy5kZWZhdWx0Y29udGV4dHMuY3JlYXRlPUNyZWFyIERlZmF1bHRDb250ZXh0IE51ZXZvCithY3Rpb25zLmRlZmF1bHRjb250ZXh0cy5kZWxldGU9Qm9ycmFyIEVzdGUgRGVmYXVsdENvbnRleHQKK2FjdGlvbnMuZGVmYXVsdGNvbnRleHRzLmRlbGV0ZXM9Qm9ycmFyIERlZmF1bHRDb250ZXh0IEV4aXN0ZW50ZQorYWN0aW9ucy5kZWZhdWx0Y29udGV4dHMuZWRpdD1FZGl0YXIgRGVmYXVsdENvbnRleHQgRXhpc3RlbnRlIAorYWN0aW9ucy5ncm91cC5jcmVhdGU9Q3JlYXIgTnVldm8gR3J1cG8KK2FjdGlvbnMuZ3JvdXAuZGVsZXRlPUJvcnJhciBHcnVwbyBFeGlzdGVudGUKK2FjdGlvbnMuaG9zdHMuY3JlYXRlPUNyZWFyIE51ZXZhIE3hcXVpbmEKK2FjdGlvbnMuaG9zdHMuZGVsZXRlPUJvcnJhciBFc3RhIE3hcXVpbmEKK2FjdGlvbnMuaG9zdHMuZGVsZXRlcz1Cb3JyYXIgTeFxdWluYXMgRXhpc3RlbnRlcworYWN0aW9ucy5ob3N0cy5lZGl0PUVkaXRhciBN4XF1aW5hIEV4aXN0ZW50ZQorYWN0aW9ucy5sb2dnZXJzLmNyZWF0ZT1DcmVhciBOdWV2byAoTG9nZ2VyKSBSZWdpc3RyYWRvcgorYWN0aW9ucy5sb2dnZXJzLmRlbGV0ZT1Cb3JyYXIgRXN0ZSAoTG9nZ2VyKSBSZWdpc3RyYWRvcgorYWN0aW9ucy5sb2dnZXJzLmRlbGV0ZXM9Qm9ycmFyIChMb2dnZXJzKSBSZWdpc3RyYWRvcmVzIEV4aXN0ZW50ZXMKK2FjdGlvbnMubG9nZ2Vycy5lZGl0PUVkaXRhciAoTG9nZ2VyKSBSZWdpc3RyYWRvciBFeGlzdGVudGUKK2FjdGlvbnMucmVhbG1zLmNyZWF0ZT1DcmVhciBOdWV2byBSZWlubyAoUmVhbG0pIGRlIFVzdWFyaW8KK2FjdGlvbnMucmVhbG1zLmRlbGV0ZT1Cb3JyYXIgRXN0ZSBSZWlubyAoUmVhbG0pIGRlIFVzdWFyaW8KK2FjdGlvbnMucmVhbG1zLmRlbGV0ZXM9Qm9ycmFyIFJlaW5vcyAoUmVhbG1zKSBkZSBVc3VhcmlvCithY3Rpb25zLnJlYWxtcy5lZGl0PUVkaXRhciBSZWlubyAoUmVhbG0pIEV4aXN0ZW50ZQorYWN0aW9ucy5yZXF1ZXN0ZmlsdGVyLmNyZWF0ZT1DcmVhciBOdWV2byBGaWx0cm8gZGUgUGV0aWNp824KK2FjdGlvbnMucmVxdWVzdGZpbHRlci5kZWxldGU9Qm9ycmFyIEZpbHRyb3MgZGUgUGV0aWNp824KK2FjdGlvbnMudXNlci5jcmVhdGU9Q3JlYXIgTnVldm8gVXN1YXJpbworYWN0aW9ucy51c2VyLmRlbGV0ZT1FbGltaW5hciBVc3VhcmlvIEV4aXN0ZW50ZQorYWN0aW9ucy52YWx2ZXMuY3JlYXRlPUNyZWFyIE51ZXZhIFbhbHZ1bGEKK2FjdGlvbnMudmFsdmVzLmVkaXQ9RWRpdGFyIFbhbHZ1bGEKK2FjdGlvbnMudmFsdmVzLmRlbGV0ZT1Cb3JyYXIgRXN0YSBW4Wx2dWxhCithY3Rpb25zLnZhbHZlcy5kZWxldGVzPUJvcnJhciBW4XZ1bGFzIEV4aXN0ZW50ZXMKK2FjdGlvbnMuYWxpYXMuY3JlYXRlPUNyZWFyIE51ZXZvIEFsaWFzCithY3Rpb25zLmFsaWFzLmRlbGV0ZT1Cb3JyYXIgQWxpYXMKK25ldy5hbGlhcz1OdWV2byBBbGlhcworY29ubmVjdG9yLnR5cGU9VGlwbworY29ubmVjdG9yLnNjaGVtZT1Fc3F1ZW1hCitjb25uZWN0b3IuYWNjZXB0LmNvdW50PUNvbnRhZG9yIGRlIEFjZXB0YWNp824KK2Nvbm5lY3Rvci5jb21wcmVzc2lvbj1Db21wcmVzafNuCitjb25uZWN0b3IuY29ubmVjdGlvbi5saW5nZXI9RGVtb3JhIGRlIGxhIENvbmV4afNuCitjb25uZWN0b3IuY29ubmVjdGlvbi50aW1lb3V0PVRpZW1wbyBkZSBFc3BlcmEgZGUgbGEgQ29uZXhp824KK2Nvbm5lY3Rvci5jb25uZWN0aW9uLnVwbG9hZFRpbWVvdXQ9VGllbXBvIGRlIEVzcGVyYSBkZSBDb25leGnzbiBlbiBsYSBDYXJnYQorY29ubmVjdG9yLmRlZmF1bHQuYnVmZmVyPVRhbWHxbyBwb3IgZGVmZWN0byBkZWwgQvpmZXIKK2Nvbm5lY3Rvci5jb25uZWN0aW9uLmRpc2FibGVVcGxvYWRUaW1lb3V0PURlc2FjdGl2YXIgVGllbXBvIGRlIEVzcGVyYSBkZSBsYSBDYXJnYQorY29ubmVjdG9yLmVuYWJsZS5kbnM9UGVybWl0aXIgQvpzcXVlZGFzIGVuIGVsIEROUworY29ubmVjdG9yLnVyaWVuY29kaW5nPUNvZGlmaWNhY2nzbiBkZSBVUkkKK2Nvbm5lY3Rvci51c2VCb2R5RW5jb2RpbmdGb3JVUkk9VXNhciBDb2RpZmljYWNp824gZGUgQ3VlcnBvIChCb2R5KSBwYXJhIFBhcuFtZXRyb3MgZGUgQ29uc3VsdGEgZGUgVVJJCitjb25uZWN0b3IuYWxsb3dUcmFjZT1QZXJtaXRpciBN6XRvZG8gZGUgVFJBWkEKK2Nvbm5lY3Rvci5hZGRyZXNzLmlwPURpcmVjY2nzbiBJUAorY29ubmVjdG9yLnJlZGlyZWN0LnBvcnRudW1iZXI9TvptZXJvIGRlbCBwdWVydG8gZGUgcmVkaXJlY2Npb25hbWllbnRvCitjb25uZWN0b3IubWluPU3tbmltbworY29ubmVjdG9yLm1pbGxpc2Vjb25kcz1taWxpc2VndW5kb3MKK2Nvbm5lY3Rvci5tYXg9TeF4aW1vCitjb25uZWN0b3IubWF4a2VlcGFsaXZlPVBldGljaW9uZXMgTeF4aW1hcyBkZSBNYW5ldGVyIFZpdmEgKEtlZXBBbGl2ZSkKK2Nvbm5lY3Rvci5tYXhzcGFyZT1N4XguIEhpbG9zIGRlIFJlcHVlc3RvCitjb25uZWN0b3IubWF4dGhyZWFkcz1N4XguIEhpbG9zCitjb25uZWN0b3IubWluc3BhcmU9Te1uLiBIaWxvcyBkZSBSZXB1ZXN0bworY29ubmVjdG9yLnRocmVhZHByaW9yaXR5PVByb2Nlc3NvciBUaHJlYWQgUHJpb3JpdHkKK2Nvbm5lY3Rvci5wcm94eS5uYW1lPU5vbWJyZSBkZWwgQXBvZGVyYWRvIChQcm94eSkKK2Nvbm5lY3Rvci5wcm94eS5wb3J0bnVtYmVyPU76bWVybyBkZSBQdWVydG8gZGVsIEFwb2RlcmFkbyAoUHJveHkpCitjb25uZWN0b3IuYWxnb3JpdGhtPUFsZ29yaXRtbworY29ubmVjdG9yLmNpcGhlcnM9Q2lmcmFkb3MKK2Nvbm5lY3Rvci5jbGllbnQuYXV0aD1BdXRlbnRpY2FjafNuIGRlIENsaWVudGUKK2Nvbm5lY3Rvci5rZXlzdG9yZS5maWxlbmFtZT1Ob21icmUgZGUgQXJjaGl2byBkZSBBbG1hY+luIGRlIENsYXZlcworY29ubmVjdG9yLmtleXN0b3JlLnBhc3N3b3JkPUNvbnRyYXNl8WEgZGUgQWxtYWPpbiBkZSBDbGF2ZXMKK2Nvbm5lY3Rvci5rZXlzdG9yZS50eXBlPVRpcG8gZGUgQWxtYWPpbiBkZSBDbGF2ZXMKK2Nvbm5lY3Rvci5zc2xQcm90b2NvbD1Qcm90b2NvbG8gU1NMCitjb25uZWN0b3Iua2V5UGFzcy53YXJuaW5nPTxsaT5VdGlsaWNlIHBvciBmYXZvciBrZXl0b29sIHBhcmEgZ2VuZXJhciBlbCBjZXJ0aWZpY2Fkby48L2xpPgorY29ubmVjdG9yLnNlY3VyZT1TZWd1cm8KK2Nvbm5lY3Rvci50Y3BOb0RlbGF5PVRDUCBTaW4gUmV0YXJkbworY29ubmVjdG9yLnhwb3dlcmVkYnk9WCBQb3RlbmNpYWRvIE1lZGlhbnRlCitob3N0LnByb3BlcnRpZXM9UHJvcGllZGFkZXMgZGUgbGEgTeFxdWluYQoraG9zdC5uYW1lPU5vbWJyZQoraG9zdC5iYXNlPUJhc2UgRGUgbGEgQXBsaWNhY2nzbgoraG9zdC5hdXRvRGVwbG95PURlc3BsZWdhciBBdXRvbeF0aWNhbWVudGUKK2hvc3QuZGVwbG95WE1MPURlc3BsaWVndWUgWE1MIAoraG9zdC5kZXBsb3lPblN0YXJ0dXA9RGVzcGxpZWd1ZSBFbiBBcnJhbnF1ZSAKK2hvc3Qud2Fycz1EZXNlbXBhcXVldGFyIFdBUnMKK2hvc3QuYWxpYXNlcz1BbGlhc2VzCitob3N0LmFsaWFzLm5hbWU9Tm9tYnJlIGRlIEFsaWFzCitob3N0LnhtbE5hbWVzcGFjZUF3YXJlPUNvbm9jZWRvciBkZSBFc3BhY2lvIGRlIE5vbWJyZXMgWE1MCitob3N0LnhtbFZhbGlkYXRpb249VmFsaWRhY2nzbiBYTUwKK2Vycm9yLmFsaWFzTmFtZS5leGlzdHM9PGxpPkVsIEFsaWFzIHlhIGV4aXN0ZTwvbGk+CitlcnJvci5hbGlhc05hbWUucmVxdWlyZWQ9PGxpPlNlIHJlcXVpZXJlIGVsIG5vbWJyZSBkZSBBbGlhczwvbGk+Citjb250ZXh0LnByb3BlcnRpZXM9UHJvcGllZGFkZXMgZGVsIGNvbnRleHRvCitjb250ZXh0LmNvb2tpZXM9Q29va2llcworY29udGV4dC5jcm9zcy5jb250ZXh0PUNvbnRleHRvIENydXphZG8KK2NvbnRleHQuZG9jQmFzZT1CYXNlIERlbCBEb2N1bWVudG8KK2NvbnRleHQub3ZlcnJpZGU9UGFzYXIgcG9yIEFsdG8KK2NvbnRleHQucGF0aD1UcmF5ZWN0b3JpYQorY29udGV4dC5yZWxvYWRhYmxlPVJlY2FyZ2FibGUKK2NvbnRleHQuc3dhbGxvd091dHB1dD1TYWxpZGEgZGVsIFRyYWdvIChTd2FsbG93KQorY29udGV4dC51c2VuYW1pbmc9VXRpbGl6YXIgZWwgTm9tYnJhbWllbnRvIChOYW1pbmcpCitjb250ZXh0LndvcmtkaXI9RGlyZWN0b3JpbyBkZSBUcmFiYWpvCitjb250ZXh0LmxvYWRlci5wcm9wZXJ0aWVzPVByb3BpZWRhZGVzIGRlbCBjYXJnYWRvcgorY29udGV4dC5zZXNzaW9ubWdyLnByb3BlcnRpZXM9UHJvcGllZGFkZXMgZGVsIGdlc3RvciBkZSBTZXNp824KK2NvbnRleHQuY2hlY2tJbnRlcnZhbD1JbnRlcnZhbG8gZGUgQ2hlcXVlbworY29udGV4dC5zZXNzaW9uSWQ9SW5pY2lhbGl6YWRvciBkZSBsYSBJZGVudGlmaWNhY2nzbiBEZSBsYSBTZXNp824KK2NvbnRleHQubWF4LnNlc3Npb25zPU3heGltYXMgU2VzaW9uZXMgQWN0aXZhcworZGVmYXVsdGNvbnRleHQucHJvcGVydGllcz1Qcm9waWVkYWRlcyBkZSBEZWZhdWx0Q29udGV4dCAKK2Vycm9yLmNvbnRleHQuZGlyZWN0b3J5PUxhIGJhc2UgZGVsIGRvY3VtZW50byBuaSBleGlzdGUgbmkgZXMgdW4gZGlyZWN0b3JpbyBsZWdpYmxlIAorZXJyb3IuZG9jQmFzZS5yZXF1aXJlZD08bGk+TGEgYmFzZSBkZWwgZG9jdW1lbnRvIG5vIHB1ZWRlIHNlciBudWxhPC9saT4KK2Vycm9yLnBhdGgucmVxdWlyZWQ9PGxpPkxhIHRyYXllY3RvcmlhIG5vIHB1ZWRlIHNlciBudWxhPC9saT4KK2Vycm9yLndvcmtEaXIucmVxdWlyZWQ9PGxpPkVsIGRpcmVjdG9yaW8gZGUgdHJhYmFqbyBubyBwdWVkZSBzZXIgbnVsbzwvbGk+CitlcnJvci5sZHJDaGVja0ludGVydmFsLnJlcXVpcmVkPTxsaT5FbCBpbnRlcnZhbG8gZGUgY2hlcXVlbyBkZWwgY2FyZ2Fkb3Igbm8gcHVlZGUgZXN0YXIgdmFj7W88L2xpPgorZXJyb3IubGRyQ2hlY2tJbnRlcnZhbC5mb3JtYXQ9PGxpPqFFbCBJbnRlcnZhbG8gZGUgY2hlcXVlbyBkZWwgY2FyZ2Fkb3Igbm8gdW4gbvptZXJvIGVudGVybyB24WxpZG8hPC9saT4KK2Vycm9yLmxkckNoZWNrSW50ZXJ2YWwucmFuZ2U9PGxpPkVsIGludGVydmFsbyBkZSBjaGVxdWVvIGRlbCBjYXJnYWRvciBwYXJlY2UgZnVlcmEgZGUgcmFuZ28uIEVsIHJhbmdvIHbhbGlkbyB2YSBkZSAxLTEwMDAuPC9saT4KK2Vycm9yLm1nckNoZWNrSW50ZXJ2YWwucmVxdWlyZWQ9PGxpPkVsIGludGVydmFsbyBkZSBjaGVxdWVvIGRlbCBnZXN0b3Igbm8gcHVlZGUgZXN0YXIgdmFj7W88L2xpPgorZXJyb3IubWdyQ2hlY2tJbnRlcnZhbC5mb3JtYXQ9PGxpPqFFbCBJbnRlcnZhbG8gZGVsIGNoZXF1ZW8gZGVsIGdlc3RvciBubyBlcyB1biBu+m1lcm8gZW50ZXJvIHbhbGlkbyE8L2xpPgorZXJyb3IubWdyQ2hlY2tJbnRlcnZhbC5yYW5nZT08bGk+RWwgaW50ZXJ2YWxvIGRlIGNoZXF1ZW8gZGVsIGdlc3RvciBwYXJlY2UgZnVlcmEgZGUgcmFuZ28uIEVsIHJhbmdvIHZhbGlkbyB2YSBkZSAxLTEwMDAuPC9saT4KK2Vycm9yLm1nclNlc3Npb25JREluaXQucmVxdWlyZWQ9PGxpPkxhIGlkZW50aWZpY2FjafNuIGRlIGxhIGluaWNpYWxpemFjafNuIGRlbCBnZXN0b3IgZGUgbGEgc2VzafNuIG5vIHB1ZWRlIGVzdGFyIHZhY+1hPC9saT4KK2Vycm9yLm1nck1heFNlc3Npb25zLnJlcXVpcmVkPTxsaT5MYXMgc2VzaW9uZXMgbeF4aW1hcyBubyBwdWVkZW4gZXN0YXIgdmFj7WFzPC9saT4KK2Vycm9yLm1nck1heFNlc3Npb25zLmZvcm1hdD08bGk+oUxhcyBTZXNpb25lcyBt4XhpbWFzIG5vIHNvbiB1biBlbnRlcm8gduFsaWRvITwvbGk+CitlcnJvci5tZ3JNYXhTZXNzaW9ucy5yYW5nZT08bGk+TGFzIHNlc2lvbmVzIG3heGltYXMgcGFyZWNlbiBlc3RhciBmdWVyYSBkZSByYW5nby4gRWwgcmFuZ28gduFsaWRvIHZhIGRlIC0xIGEgMTAwLjwvbGk+CitsaXN0Lm5vbmU9KE5hZGEpCitsb2dnZXIuZGlyZWN0b3J5PURpcmVjdG9yaW8KK2xvZ2dlci5wcmVmaXg9UHJlZmlqbworbG9nZ2VyLnN1ZmZpeD1TdWZpam8KK2xvZ2dlci50aW1lc3RhbXA9U2VsbG8gdGVtcG9yYWwgKHRpbWVzdGFtcCkKK2xvZ2dlci5maWxlbG9nZ2VyLnByb3BlcnRpZXM9UHJvcGllZGFkZXMgZXNwZWPtZmljYXMgZGVsIFJlZ2lzdHJhZG9yIGRlIEFyY2hpdm8gKEZpbGVMb2dnZXIpCitsb2dnZXIudmVyYm9zaXR5bGV2ZWw9Tml2ZWwgZGUgRGV0YWxsZQorZXJyb3IubG9nZ2VyTmFtZS5iYWQ9Tm9tYnJlIGRlIHJlZ2lzdHJhZG9yIGluduFsaWRvIHswfQorZXJyb3IubG9nZ2VyTmFtZS5leGlzdHM9PGxpPkVsIHJlZ2lzdHJhZG9yIHlhIGV4aXN0ZS48L2xpPgorZXJyb3IuZGlyZWN0b3J5LnJlcXVpcmVkPTxsaT5FbCBEaXJlY3RvcmlvIG5vIHB1ZWRlIGVzdGFyIHZhY+1vLjwvbGk+CitlcnJvci5wcmVmaXgucmVxdWlyZWQ9PGxpPkVsIHByZWZpam8gbm8gcHVlZGUgZXN0YXIgdmFj7W8uPC9saT4KK2Vycm9yLnN1ZmZpeC5yZXF1aXJlZD08bGk+RWwgc3VmaWpvIG5vIHB1ZWRlIGVzdGFyIHZhY+1vLjwvbGk+CitlcnJvci52YWx2ZU5hbWUuYmFkPU5vbWJyZSBkZSB24Wx2dWxhIGluduFsaWRvIHswfQorZXJyb3IudmFsdmVOYW1lLmV4aXN0cz08bGk+WWEgZXhpc3RlIGxhIHbhbHZ1bGE8L2xpPgorZXJyb3Iuc2luZ2xlU2lnbk9uLmV4aXN0cz08bGk+WWEgZXhpc3RlIGxhIHbhbHZ1bGEgZGUgTG9naW4g2m5pY28gKFNpbmdsZVNpZ25Pbik8L2xpPgordXNlci5mdWxsTmFtZT1Ob21icmUgQ29tcGxldG8KK3VzZXIuZ3JvdXBzPU1pZW1icm8gZW4gbG9zIEdydXBvcwordXNlci5uZXdVc2VyPUNyZWFyIE51ZXZhcyBQcm9waWVkYWRlcyBkZSBVc3VhcmlvCit1c2VyLm9sZFVzZXI9RWRpdGFyIFByb3BpZWRhZGVzIHlhIGV4aXN0ZW50ZXMgZGUgVXN1YXJpbwordXNlci5wYXNzd29yZD1Db250cmFzZfFhCit1c2VyLnByb3BlcnRpZXM9UHJvcGllZGFkZXMgZGUgVXN1YXJpbwordXNlci5yb2xlcz1QYXBlbGVzIERlc2VtcGXxYWRvcyBkZSBTZWd1cmlkYWQKK3VzZXIudXNlcm5hbWU9Tm9tYnJlIGRlIFVzdWFyaW8KK2Vycm9yLnBhc3N3b3JkLnJlcXVpcmVkPTxsaT5TZSByZXF1aWVyZSBsYSBjb250cmFzZfFhPC9saT4KK2Vycm9yLnVzZXJuYW1lLnJlcXVpcmVkPTxsaT5TZSByZXF1aWVyZSBlbCBub21icmUgZGUgdXN1YXJpbzwvbGk+CitlcnJvci5nZXQuYXR0cmlidXRlcz1FcnJvciBleHRyYXllbmRvIHByb3BpZWRhZGVzIGRlIGluZm9ybWFjafNuLgorZXJyb3Iuc2V0LmF0dHJpYnV0ZXM9RXJyb3IgcG9uaWVuZG8gcHJvcGllZGFkZXMgZGUgaW5mb3JtYWNp824uCithY3Rpb25zLmRlbGV0ZT1Cb3JyYXIKK2Vycm9yLmRlZmF1bHRIb3N0LnJlcXVpcmVkPTxsaT5FcyBuZWNlc2FybyBlbCBOb21icmUgZGUgTeFxdWluYSBwb3IgZGVmZWN0bzwvbGk+CitlcnJvci5lbmdpbmVOYW1lLmJhZD1Ob21icmUgZGUgbW90b3IgaW524WxpZG97MH0KK2Vycm9yLmVuZ2luZU5hbWUuZXhpc3RzPTxsaT5ZYSBleGlzdGUgZWwgTm9tYnJlIGRlIE1vdG9yPC9saT4KK2Vycm9yLnNlcnZpY2VOYW1lLmJhZD1Ob21icmUgZGUgc2VydmljaW8gaW524WxpZG8gezB9CitlcnJvci5zZXJ2aWNlTmFtZS5yZXF1aXJlZD08bGk+RXMgbmVjZXNhcmlvIGVsIE5vbWJyZSBkZWwgU2VydmljaW88L2xpPgorZXJyb3Iuc2VydmljZU5hbWUuZXhpc3RzPTxsaT5ZYSBleGlzdGUgZWwgTm9tYnJlIGRlbCBTZXJ2aWNpbzwvbGk+CitlcnJvci5qZGJjcmVhbG09SGEgdGVuaWRvIGx1Z2FyIHVuIGVycm9yIGFsIHBvbmVyIHZhbG9yIGRlIEpEQkNSZWFsbS4KK2Vycm9yLmpuZGlyZWFsbT1IYSB0ZW5pZG8gbHVnYXIgdW4gZXJyb3IgYWwgcG9uZXIgdmFsb3IgZGUgSk5ESVJlYWxtLgorZXJyb3IudXNlcmRicmVhbG09SGEgdGVuaWRvIGx1Z2FyIHVuIGVycm9yIGFsIHBvbmVyIHZhbG9yIGRlIFVzZXJkYXRhYmFzZVJlYWxtLgorZXJyb3IucmVhbG1OYW1lLmJhZD1Ob21icmUgZGUgcmVpbm8gaW524WxpZG8gezB9CitlcnJvci5yZWFsbU5hbWUucmVxdWlyZWQ9PGxpPkVzIG5lY2VzYXJpbyBlbCBub21icmUgZGUgUmVpbm8uPC9saT4KK2Vycm9yLnJlYWxtTmFtZS5leGlzdHM9PGxpPllhIGV4aXN0ZSB1biBSZWluby48L2xpPgorZXJyb3IuY29udGV4dE5hbWUuYmFkPU5vbWJyZSBkZSBjb250ZXh0byBpbnbhbGlkbyB7MH0KK2Vycm9yLmNvbnRleHROYW1lLmV4aXN0cz08bGk+WWEgZXhpc3RlIGVsIENvbnRleHRvLjwvbGk+CitlcnJvci5kZWZhdWx0Y29udGV4dE5hbWUuZXhpc3RzPTxsaT5ZYSBleGlzdGUgQ29udGV4dG8gcG9yIERlZmVjdG8gKERlZmF1bHRDb250ZXh0KS48L2xpPgorZXJyb3IucGF0aC5wcmVmaXg9PGxpPkxhIHRyYXllY3RvcmlhIGRlYmUgZGUgY29tZW56YXIgY29uICcvJy48L2xpPgorZXJyb3IubG9hZGVyTmFtZS5iYWQ9Tm9tYnJlIGRlIGNhcmdhZG9yIGluduFsaWRvIHswfQorZXJyb3IubWFuYWdlck5hbWUuYmFkPU5vbWJyZSBkZSBnZXN0b3IgaW524WxpZG8gezB9CitlcnJvci5jb25uZWN0b3JOYW1lLmJhZD1Ob21icmUgZGUgY29uZWN0b3IgaW524WxpZG8gezB9CitlcnJvci5jb25uZWN0b3JOYW1lLmV4aXN0cz08bGk+WWEgZXhpc3RlIGVsIENvbmVjdG9yPC9saT4KK2Vycm9yLnBhdHRlcm4ucmVxdWlyZWQ9PGxpPkVzIG5lY2VzYXJpbyBlbCBQYXRy824gKFBhdHRlcm4pPC9saT4KK2Vycm9yLnZhbHZlTmFtZS5iYWQ9Tm9tYnJlIGRlIHbhbHZ1bGEgaW524WxpZG8gezB9CitlcnJvci52YWx2ZU5hbWUuZXhpc3RzPTxsaT5ZYSBleGlzdGUgbGEgVuFsdnVsYTwvbGk+CityZWFsbS5kcml2ZXI9TWFuZWphZG9yIChEcml2ZXIpIGRlIEJhc2UgZGUgRGF0b3MKK3JlYWxtLnBhc3N3ZD1Db250cmFzZfFhIGRlIGxhIEJhc2UgZGUgRGF0b3MKK3JlYWxtLnVybD1VUkwgZGUgbGEgQmFzZSBkZSBEYXRvcworcmVhbG0udXNlck5hbWU9Tm9tYnJlIGRlIFVzdWFyaW8gZGUgbGEgQmFzZSBkZSBEYXRvcworcmVhbG0uZGlnZXN0PUFsZ29yaXRtbyBSZXN1bWVuIChEaWdlc3QpCityZWFsbS5wYXNzd29yZENvbD1Db2x1bW5hIGRlIENvbnRyYXNl8WEKK3JlYWxtLnJvbGVOYW1lQ29sPUNvbHVtbmEgZGVsIE5vbWJyZSBkZWwgUGFwZWwgRGVzZW1wZfFhZG8gKFJvbGUpCityZWFsbS51c2VyTmFtZUNvbD1Db2x1bW5hIGRlbCBOb21icmUgZGVsIFVzdWFyaW8KK3JlYWxtLnVzZXJSb2xlVGFibGU9VGFibGEgZGVsIFBhcGVsIGRlc2VtcGXxYWRvIHBvciBlbCBVc3VhcmlvCityZWFsbS51c2VyVGFibGU9VGFibGEgZGUgVXN1YXJpbworcmVhbG0ucmVzb3VyY2U9Tm9tYnJlIGRlbCBSZWN1cnNvCityZWFsbS5wYXRoTmFtZT1Ob21icmUgZGUgbGEgVHJheWVjdG9yaWEKK3JlYWxtLmNvbm5OYW1lPU5vbWJyZSBkZSBsYSBDb25leGnzbgorcmVhbG0uY29ublBhc3N3b3JkPUNvbnRyYXNl8WEgZGUgbGEgQ29uZXhp824KK3JlYWxtLmNvbm5VUkw9VVJMIGRlIGxhIENvbmV4afNuCityZWFsbS5jb25uRmFjdG9yeT1G4WJyaWNhIGRlbCBDb250ZXh0bworcmVhbG0ucm9sZUJhc2U9RWxlbWVudG8gQmFzZSBkZWwgUGFwZWwgRGVzZW1wZfFhZG8KK3JlYWxtLnJvbGVOYW1lPU5vbWJyZSBkZWwgUGFwZWwgRGVzZW1wZfFhZG8KK3JlYWxtLnVzZXIucm9sZU5hbWU9Tm9tYnJlIGRlbCBQYXBlbCBEZXNlbXBl8WFkbworcmVhbG0ucGF0dGVybj1QYXRy824gZGUgbGEgQvpzcXVlZGEgZGVsIFBhcGVsIERlc2VtcGXxYWRvCityZWFsbS5yb2xlLnN1YnRyZWU9QnVzY2FyIFN1YuFyYm9sIGRlbCBQYXBlbCBEZXNlbXBl8WFkbworcmVhbG0udXNlckJhc2U9RWxlbWVudG8gQmFzZSBkZSBVc3VhcmlvCityZWFsbS51c2VyLnN1YnRyZWU9QnVzY2FyIFN1YuFyYm9sIGRlIFVzdWFyaW8KK3JlYWxtLnVzZXJQYXNzd29yZD1Db250cmFzZfFhIGRlbCBVc3VhcmlvCityZWFsbS51c2VyUGF0dGVybj1QYXRy824gZGUgVXN1YXJpbworcmVhbG0udXNlclNlYXJjaD1C+nNxdWVkYSBkZSBVc3VhcmlvCit2YWx2ZS5hY2Nlc3MucHJvcGVydGllcz1Qcm9waWVkYWRlcyBkZWwgUmVnaXN0cmFkb3IgZGUgQWNjZXNvCit2YWx2ZS5yZXF1ZXN0LnByb3BlcnRpZXM9UHJvcGllZGFkZXMgZGVsIEZpbHRybyBkZSBSZXF1ZXJpbWllbnRvCit2YWx2ZS5zaW5nbGUucHJvcGVydGllcz1Qcm9waWVkYWRlcyBkZSBsYSB24Wx2dWxhIGRlIFNpZ25PbiDabmljbwordmFsdmUucmVtb3RlaG9zdC5wcm9wZXJ0aWVzPVByb3BpZWRhZGVzIGRlIGxhIFbhbHZ1bGEgZGUgTeFxdWluYSBSZW1vdGEKK3ZhbHZlLnJlbW90ZWFkZHJlc3MucHJvcGVydGllcz1Qcm9waWVkYWRlcyBkZSBsYSBW4Wx2dWxhIGRlIERpcmVjY2nzbiBSZW1vdGEKK3ZhbHZlLnJlc29sdmVIb3N0cz1SZXNvbHZlciBN4XF1aW5hcwordmFsdmUucm90YXRhYmxlPVJvdGF0aXZvCit2YWx2ZS5wYXR0ZXJuPVBhdHLzbgordmFsdmUuYWxsb3dIb3N0cz1QZXJtaXRpciBhIGVzdGFzIE3hcXVpbmFzCit2YWx2ZS5kZW55SG9zdHM9RGVuZWdhciBhIGVzdGFzIE3hcXVpbmFzCit2YWx2ZS5hbGxvd0lQcz1QZXJtaXRpciBhIGRpcmVjY2lvbmVzIElQCit2YWx2ZS5kZW55SVBzPURlbmVnYXIgYSBkaXJlY2Npb25lcyBJUAorZXJyb3IuYWxsb3dIb3N0PTxsaT5QZXJtaXRpciBlcyBpbnbhbGlkby4gRXMgbmVjZXNhcmlvIGluY2x1aXIgZWwgbm9tYnJlIGRlIG3hcXVpbmEgZGVsIGFkbWluaXN0cmFkb3IuPC9saT4KK2Vycm9yLmRlbnlIb3N0PTxsaT5EZW5lZ2FyIGVzIGluduFsaWRvLiBFcyBuZWNlc2FyaW8gZXhjbHVpciBlbCBub21icmUgZGUgbeFxdWluYSBkZWwgYWRtaW5pc3RyYWRvci48L2xpPgorZXJyb3IuYWxsb3dJUD08bGk+UGVybWl0aXIgZXMgaW524WxpZG8uIEVzIG5lY2VzYXJpbyBpbmNsdWlyIGxhIGRpcmVjY2nzbiBJUCBkZWwgYWRtaW5pc3RyYWRvci48L2xpPgorZXJyb3IuZGVueUlQPTxsaT5EZW5lZ2FyIGVzIGluduFsaWRvLiBFcyBuZWNlc2FyaW8gZXhjbHVpciBsYSBkaXJlY2Np824gSVAgZGVsIGFkbWluaXN0cmFkb3IuPC9saT4KK2Vycm9yLmFsbG93LmRlbnkucmVxdWlyZWQ9PGxpPkVzIG5lY2VzYXJpbyBwb25lciBQZXJtaXRpciBvIERlbmVnYXIuPC9saT4KK2Vycm9yLnN5bnRheD08bGk+RXJyb3IgZGUgc2ludOF4aXMgZW4gcGF0cvNuIGRlbCBmaWx0cm8gZGUgbGEgcGV0aWNp824uPC9saT4KK2Vycm9yLnJlc291cmNlLnJlcXVpcmVkPTxsaT5TZSByZXF1aWVyZSBlbCBOb21icmUgZGVsIFJlY3Vyc28uPC9saT4KK2Vycm9yLnJlc291cmNlLmphdmFwcmVmaXg9PGxpPkVsIHJlY3Vyc28gZGViZSBkZSB0ZW5lciBlbCBwcmVmaWpvICJqYXZhOiI8L2xpPgorZXJyb3IucGF0aE5hbWUucmVxdWlyZWQ9PGxpPkVzIG5lY2VzYXJpbyBwb25lciBlbCBub21icmUgZGUgbGEgdHJheWVjdG9yaWEuPC9saT4KK2Vycm9yLmRyaXZlci5yZXF1aXJlZD08bGk+RXMgbmVjZXNhcmlvIHBvbmVyIGVsIG1hbmVqYWRvciAoZHJpdmVyKSBkZSBsYSBiYXNlIGRlIGRhdG9zLjwvbGk+CitlcnJvci5yb2xlTmFtZUNvbC5yZXF1aXJlZD08bGk+RXMgbmVjZXNhcmlvIHBvbmVyIGxhIGNvbHVtbmEgZGVsIG5vbWJyZSBkZSBQYXBlbCBEZXNlbXBl8WFkby48L2xpPgorZXJyb3IudXNlck5hbWVDb2wucmVxdWlyZWQ9PGxpPkVzIG5lY2VzYXJpbyBwb25lciBsYSBjb2x1bW5hIGRlbCBub21icmUgZGUgVXN1YXJpby48L2xpPgorZXJyb3IucGFzc3dvcmRDb2wucmVxdWlyZWQ9PGxpPkVzIG5lY2VzYXJpbyBwb25lciBsYSBjb2x1bW5hIGRlIGxhIENvbnRyYXNl8WEuPC9saT4KK2Vycm9yLnVzZXJUYWJsZS5yZXF1aXJlZD08bGk+RXMgbmVjZXNhcmlvIHBvbmVyIGxhIFRhYmxhIGRlIFVzdWFyaW8uPC9saT4KK2Vycm9yLnJvbGVUYWJsZS5yZXF1aXJlZD08bGk+RXMgbmVjZXNhcmlvIHBvbmVyIGxhIFRhYmxhIGRlbCBQYXBlbCBEZXNlbXBl8WFkbyBwb3IgZWwgVXN1YXJpby48L2xpPgorZXJyb3IuY29ubmVjdGlvblBhc3N3b3JkLnJlcXVpcmVkPTxsaT5FcyBuZWNlc2FyaW8gcG9uZXIgbGEgY29udHJhc2XxYSBkZSBsYSBiYXNlIGRlIGRhdG9zLjwvbGk+CitlcnJvci5jb25uZWN0aW9uVVJMLnJlcXVpcmVkPTxsaT5FcyBuZWNlc2FyaW8gcG9uZXIgbGEgVVJMIGRlIGxhIEJhc2UgZGUgRGF0b3MuPC9saT4KK2Vycm9yLmNvbm5lY3Rpb25OYW1lLnJlcXVpcmVkPTxsaT5FcyBuZWNlc2FyaW8gcG9uZXIgZWwgbm9tYnJlIGRlIHVzdWFyaW8gZGUgbGEgQmFzZSBkZSBEYXRvcy48L2xpPgorZXJyb3Iucm9sZU5hbWUucmVxdWlyZWQ9PGxpPkVzIG5lY2VzYXJpbyBwb25lciBlbCBub21icmUgZGVsIFBhcGVsIERlc2VtcGXxYWRvby48L2xpPgorZXJyb3IudXNlclJvbGVOYW1lLnJlcXVpcmVkPTxsaT5FcyBuZWNlc2FyaW8gcG9uZXIgZWwgbm9tYnJlIGRlbCBQYXBlbCBEZXNlbXBl8WFkbyBwb3IgZWwgVXN1YXJpby48L2xpPgorZXJyb3IuZGlnZXN0LnJlcXVpcmVkPTxsaT5FcyBuZWNlc2FyaW8gcG9uZXIgZWwgYWxnb3JpdG1vIGRlIHJlc3VtZW4gKGRpZ2VzdCkuPC9saT4KK2Vycm9yLnJvbGVCYXNlLnJlcXVpcmVkPTxsaT5FcyBuZWNlc2FyaW8gcG9uZXIgZWwgZWxlbWVudG8gYmFzZSBkZWwgUGFwZWwgRGVzZW1wZfFhZG8uPC9saT4KK2Vycm9yLnJvbGVQYXR0ZXJuLnJlcXVpcmVkPTxsaT5FcyBuZWNlc2FyaW8gcG9uZXIgZWwgcGF0cvNuIGRlIGL6c3F1ZWRhIGRlbCBQYXBlbCBEZXNlbXBl8WFkby48L2xpPgorZXJyb3IudXNlckJhc2UucmVxdWlyZWQ9PGxpPkVzIG5lY2VzYXJpbyBwb25lciBlbCBlbGVtZW50byBiYXNlIGRlbCB1c3VhcmlvLjwvbGk+CitlcnJvci51c2VyUGFzc3dvcmQucmVxdWlyZWQ9PGxpPkVzIG5lY2VzYXJpbyBwb25lciBsYSBDb250cmFzZfFhIGRlbCBVc3VhcmlvLjwvbGk+CitlcnJvci51c2VyUGF0dGVybi5yZXF1aXJlZD08bGk+RXMgbmVjZXNhcmlvIHBvbmVyIGVsIHBhdHLzbiBkZWwgVXN1YXJpby48L2xpPgorZXJyb3IudXNlclNlYXJjaC5yZXF1aXJlZD08bGk+RXMgbmVjZXNhcmlvIHBvbmVyIGxhIGL6c3F1ZWRhIGRlbCB1c3VhcmlvLjwvbGk+CitlcnJvci51c2VyUGF0dGVybi51c2VyU2VhcmNoLmRlZmluZWQ9PGxpPlNlIGRlYmUgZGUgZXNwZWNpZmljYXIgVXNlclBhdHRlcm4gbyB1c2VyU2VhcmNoLCBwZXJvIG5vIGFtYm9zLjwvbGk+CitlcnJvci5jb250ZXh0RmFjdG9yeS5yZXF1aXJlZD08bGk+RXMgbmVjZXNhcmlvIHBvbmVyIGxhIEbhYnJpY2EgZGVsIENvbnRleHRvLjwvbGk+CitlcnJvci5jb25uUGFzc3dvcmQucmVxdWlyZWQ9PGxpPkVzIG5lY2VzYXJpbyBwb25lciBsYSBDb250cmFzZfFhIGRlIGxhIENvbmV4afNuLjwvbGk+CitlcnJvci5jb25uVVJMLnJlcXVpcmVkPTxsaT5FcyBuZWNlc2FyaW8gcG9uZXIgbGEgVVJMIGRlIGxhIENvbmV4afNuLjwvbGk+CitlcnJvci5jb25uTmFtZS5yZXF1aXJlZD08bGk+RXMgbmVjZXNhcmlvIHBvbmVyIGVsIG5vbWJyZSBkZSBDb25leGnzbi48L2xpPgorCisjIC0tLS0tLS0tLS0gU2VydmVyIE1vZHVsZSAtLS0tLS0tLS0tCitzZXJ2ZXIuc2VydmljZS50cmVlQnVpbGRlci5zdWJ0cmVlTm9kZT1TZXJ2aWNpbworc2VydmVyLnNlcnZpY2UudHJlZUJ1aWxkZXIuY29ubmVjdG9yPUNvbmVjdGFkb3IKK3NlcnZlci5zZXJ2aWNlLnRyZWVCdWlsZGVyLmhvc3Q9SG9zdAorc2VydmVyLnNlcnZpY2UudHJlZUJ1aWxkZXIuY29udGV4dD1Db250ZXh0IAorc2VydmVyLnNlcnZpY2UudHJlZUJ1aWxkZXIubG9nZ2VyRm9yPUxvZ2dlciBmb3IgezB9CitzZXJ2ZXIuc2VydmljZS50cmVlQnVpbGRlci5yZWFsbUZvcj1SZWFsbSBmb3IgezB9IAorc2VydmVyLnNlcnZpY2UudHJlZUJ1aWxkZXIubG9nZ2VyPUxvZ2dlcgorc2VydmVyLnNlcnZpY2UudHJlZUJ1aWxkZXIucmVhbG09UmVhbG0KKworIyAtLS0tLS0tLS0tIFJlc291cmNlcyBNb2R1bGUgLS0tLS0tLS0tLQorcmVzb3VyY2VzLnRyZWVCdWlsZGVyLnN1YnRyZWVOb2RlPVJlY3Vyc29zCityZXNvdXJjZXMudHJlZUJ1aWxkZXIuZGF0YXNvdXJjZXM9RnVlbnRlcyBkZSBEYXRvcworcmVzb3VyY2VzLnRyZWVCdWlsZGVyLm1haWxzZXNzaW9ucz1TZXNpb25lcyBkZSBDb3JyZW8KK3Jlc291cmNlcy50cmVlQnVpbGRlci5yZXNvdXJjZWxpbmtzPUVubGFjZXMgZGUgUmVjdXJzbworcmVzb3VyY2VzLmVudi5lbnRyaWVzPUVudHJhZGFzIGRlIEVudG9ybm8KK3Jlc291cmNlcy5lbnYuZW50cnk9Tm9tYnJlIGRlIEVudHJhZGEKK3Jlc291cmNlcy5lbnYucHJvcHM9UHJvcGllZGFkZXMgZGUgbGEgRW50cmFkYSBkZSBFbnRvcm5vCityZXNvdXJjZXMuZW52Lm92ZXJyaWRlPVBhc2FyIHBvciBhbHRvIEVudHJhZGFzIGRlIE5pdmVsIGRlIEFwbGljYWNp824KK3Jlc291cmNlcy5hY3Rpb25zLmVudi5jcmVhdGU9Q3JlYXIgTnVldmEgRW50cmFkYSBkZSBFbnRvcm5vCityZXNvdXJjZXMuYWN0aW9ucy5lbnYuZWRpdD1FZGl0YXIgRW50cmFkYSBkZSBFbnRvcm5vCityZXNvdXJjZXMuYWN0aW9ucy5lbnYuZGVsZXRlPUJvcnJhciBFbnRyYWRhcyBkZSBFbnRvcm5vCityZXNvdXJjZXMuYWN0aW9ucy5lbnYubGlzdD1MaXN0YXIgRW50cmFkYXMgRXhpc3RlbnRlcworcmVzb3VyY2VzLmRhdGFzcmMuamRiYz1NYW5lamFkb3IgSkRCQworcmVzb3VyY2VzLmFjdGlvbnMuZGF0YXNyYz1GdWVudGVzIGRlIERhdG9zCityZXNvdXJjZXMuYWN0aW9ucy5kYXRhc3JjLmNyZWF0ZT1DcmVhciBOdWV2YSBGdWVudGUgZGUgRGF0b3MKK3Jlc291cmNlcy5hY3Rpb25zLmRhdGFzcmMuZGVsZXRlPUJvcnJhciBGdW50ZXMgZGUgRGF0b3MKK3Jlc291cmNlcy5hY3Rpb25zLmRhdGFzcmMuZWRpdD1FZGl0YXIgRnVlbnRlIGRlIERhdG9zCityZXNvdXJjZXMuZGF0YXNyYy51cmw9VVJMIGRlIEZ1ZW50ZSBkZSBEYXRvcworcmVzb3VyY2VzLmRhdGFzcmMuamRiY2NsYXNzPUNsYXNlIGRlIE1hbmVqYWRvciBKREJDCityZXNvdXJjZXMuZGF0YXNyYy5jb25uZWN0aW9ucz1Db25leGlvbmVzCityZXNvdXJjZXMuZGF0YXNyYy5hY3RpdmU9TeF4LiBDb25leGlvbmVzIEFjdGl2YXMKK3Jlc291cmNlcy5kYXRhc3JjLmlkbGU9TeF4LiBDb25leGlvbmVzIE9jaW9zYXMKK3Jlc291cmNlcy5kYXRhc3JjLndhaXQ9TeF4LiBFc3BlcmEgcG9yIGNvbmV4afNuCityZXNvdXJjZXMuZGF0YXNyYy52YWxpZGF0aW9uPUNvbnN1bHRhIGRlIFZhbGlkYWNp824KK3Jlc291cmNlcy5kYXRhc3JjLmpuZGk9Tm9tYnJlIEpOREkKK3Jlc291cmNlcy5hY3Rpb25zLm1haWxzZXNzaW9uPVNlc2lvbmVzIERlIENvcnJlbworcmVzb3VyY2VzLmFjdGlvbnMubWFpbHNlc3Npb24uY3JlYXRlPUNyZWFyIE51ZXZhIFNlc2nzbiBkZSBDb3JyZW8KK3Jlc291cmNlcy5hY3Rpb25zLm1haWxzZXNzaW9uLmRlbGV0ZT1Cb3JyYXIgU2VzafNuIGRlIENvcnJlbworcmVzb3VyY2VzLmFjdGlvbnMubWFpbHNlc3Npb24uZWRpdD1FZGl0YXIgU2VzafNuIGRlIENvcnJlbworcmVzb3VyY2VzLm1haWxzZXNzaW9uLm5hbWU9Tm9tYnJlCityZXNvdXJjZXMubWFpbHNlc3Npb24ubWFpbGhvc3Q9bWFpbC5zbXRwLmhvc3QKK3Jlc291cmNlcy5hY3Rpb25zLnJlc291cmNlbGs9RW5sYWNlcyBkZSBSZWN1cnNvCityZXNvdXJjZXMuYWN0aW9ucy5yZXNvdXJjZWxrLmNyZWF0ZT1DcmVhciBOdWV2byBFbmxhY2UgZGUgUmVjdXJzbworcmVzb3VyY2VzLmFjdGlvbnMucmVzb3VyY2Vsay5kZWxldGU9Qm9ycmFyIEVubGFjZSBkZSBSZWN1cnNvCityZXNvdXJjZXMuYWN0aW9ucy5yZXNvdXJjZWxrLmVkaXQ9RWR0aWFyIEVubGFjZSBkZSBSZWN1cnNvCityZXNvdXJjZXMucmVzb3VyY2Vsay5uYW1lPU5vbWJyZQorcmVzb3VyY2VzLnJlc291cmNlbGsuZ2xvYmFsPUdsb2JhbAorcmVzb3VyY2VzLnJlc291cmNlbGsudHlwZT1UaXBvCityZXNvdXJjZXMuZXJyb3IubmFtZS5yZXF1aXJlZD08bGk+Tm9tYnJlIHJlcXVlcmlkby48L2xpPgorcmVzb3VyY2VzLmVycm9yLmdsb2JhbC5yZXF1aXJlZD08bGk+R2xvYmFsIHJlcXVlcmlkby48L2xpPgorcmVzb3VyY2VzLmVycm9yLnR5cGUucmVxdWlyZWQ9PGxpPlRpcG8gcmVxdWVyaWRvLjwvbGk+CityZXNvdXJjZXMuZXJyb3IudmFsdWUucmVxdWlyZWQ9PGxpPlZhbG9yIHJlcXVlcmlkby48L2xpPgorcmVzb3VyY2VzLmVycm9yLnZhbHVlLm1pc21hdGNoPTxsaT5FbCB0aXBvIHkgZWwgdmFsb3Igbm8gcGFyZWNlbiBjb2luY2lkaXIuPC9saT4KK3Jlc291cmNlcy5lcnJvci5lbnRyeVR5cGUuaW52YWxpZD08bGk+RWwgdGlwbyBkZSBFbnRyYWRhIG5vIHNlIHJlY29ub2NlLjwvbGk+CityZXNvdXJjZXMuZXJyb3IuZW50cnlUeXBlLm5vdGltcGw9PGxpPkxhIFZhbGlkYWNp824gcGFyYSBlc3RlIHRpcG8gbm8gaGEgc2lkbyBpbXBsZW1lbnRhZGEgYfpuLjwvbGk+CityZXNvdXJjZXMuZXJyb3IudXJsLnJlcXVpcmVkPTxsaT5TZSByZXF1aWVyZSBsYSBVUkwgZGUgRnVlbnRlIGRlIERhdG9zLjwvbGk+CityZXNvdXJjZXMuZXJyb3IuZHJpdmVyQ2xhc3MucmVxdWlyZWQ9PGxpPlNlIHJlcXVpZXJlIGxhIENsYXNlIGRlbCBDb25kdWN0b3IgKGRyaXZlcikgZGUgSkRCQy48L2xpPgorcmVzb3VyY2VzLmVycm9yLmFjdGl2ZS5yZXF1aXJlZD08bGk+U2UgcmVxdWllcmVuIGxhcyBjb25leGlvbmVzIGFjdGl2YXMgbeF4aW1hcy48L2xpPgorcmVzb3VyY2VzLmVycm9yLmlkbGUucmVxdWlyZWQ9PGxpPlNlIHJlcXVpZXJlbiBsYXMgY29uZXhpb25lcyBvY2lvc2FzIG3heGltYXMuPC9saT4KK3Jlc291cmNlcy5lcnJvci53YWl0LnJlcXVpcmVkPTxsaT5MYSBlc3BlcmEgbeF4aW1hIHBvciB1bmEgY29uZXhp824gc2UgcmVxdWllcmUuPC9saT4KK3Jlc291cmNlcy5lcnJvci5tYWlsaG9zdC5yZXF1aXJlZD08bGk+bWFpbC5zbXRwLmhvc3Qgc2UgcmVxdWllcmUuPC9saT4KK3Jlc291cmNlcy5pbnRlZ2VyLmVycm9yPTxsaT5FcnJvciBkZSBu+m1lcm8gZW50ZXJvIGluduFsaWRvLjwvbGk+CityZXNvdXJjZXMuYWN0aW9ucy51c2VyZGIuY3JlYXRlPUNyZWFyIE51ZXZhIEJhc2UgZGUgRGF0b3MgZGUgVXN1YXJpbworcmVzb3VyY2VzLmFjdGlvbnMudXNlcmRiLmVkaXQ9RWRpdGFyIEJhc2UgZGUgRGF0b3MgZGUgVXN1YXJpbworcmVzb3VyY2VzLmFjdGlvbnMudXNlcmRiLmRlbGV0ZT1Cb3JyYXIgQmFzZXMgZGUgRGF0b3MgZGUgVXN1YXJpbworcmVzb3VyY2VzLnVzZXJkYi5sb2NhdGlvbj1Mb2NhbGl6YWNp824KK3Jlc291cmNlcy51c2VyZGIuZmFjdG9yeT1G4WJyaWNhCityZXNvdXJjZXMudHJlZUJ1aWxkZXIudXNlcmRicz1CYXNlcyBkZSBEYXRvcyBkZSBVc3VhcmlvCityZXNvdXJjZXMuZXJyb3IucGF0aC5yZXF1aXJlZD08bGk+U2UgcmVxdWllcmUgbGEgVHJheWVjdG9yaWE8L2xpPgorcmVzb3VyY2VzLmVycm9yLmpuZGlOYW1lLnJlcXVpcmVkPTxsaT5TZSByZXF1aWVyZSBlbCBOb21icmUgSk5ESTwvbGk+CityZXNvdXJjZXMuaW52YWxpZC5uYW1lPTxsaT5Ob21icmUgaW524WxpZG8gZGUgcmVjdXJzbyAtIGVsIG5vbWJyZSB5YSBleGlzdGUuPC9saT4KK3Jlc291cmNlcy5pbnZhbGlkLmVudj08bGk+Tm9tYnJlIGluduFsaWRvIGRlIGVudG9ybm8gLSBlbCBub21icmUgeWEgZXhpc3RlLjwvbGk+CisKKyMgLS0tLS0tLS0tLSBVc2VyIERhdGFiYXNlIE1vZHVsZSAtLS0tLS0tLS0tCit1c2Vycy5hY3Rpb25zLmdyb3VwLmNyZWF0ZT1DcmVhciBOdWV2byBHcnVwbwordXNlcnMuYWN0aW9ucy5ncm91cC5kZWxldGU9Qm9ycmFyIEdydXBvcyBFeGlzdGVudGVzCit1c2Vycy5hY3Rpb25zLmdyb3VwLmxpc3Q9TGlzdGFyIEdydXBvcyBFeGlzdGVudGVzCit1c2Vycy5hY3Rpb25zLnJvbGUuY3JlYXRlPUNyZWFyIE51ZXZvIFBhcGVsIGEgRGVzZW1wZfFhcgordXNlcnMuYWN0aW9ucy5yb2xlLmRlbGV0ZT1Cb3JyYXIgUGFwZWxlcyBhIERlc2VtcGXxYXIgeWEgRXhpc3RlbnRlcwordXNlcnMuYWN0aW9ucy5yb2xlLmxpc3Q9TGlzdGFyIFBhcGVsZXMgYSBEZXNlbXBl8WFyIHlhIEV4aXN0ZW50ZXMKK3VzZXJzLmFjdGlvbnMudXNlci5jcmVhdGU9Q3JlYXIgTnVldm8gVXN1YXJpbwordXNlcnMuYWN0aW9ucy51c2VyLmRlbGV0ZT1Cb3JyYXIgVXN1YXJpb3MgeWEgRXhpc3RlbnRlcwordXNlcnMuYWN0aW9ucy51c2VyLmxpc3Q9TGlzdGFyIFVzdWFyaW9zIHlhIEV4aXN0ZW50ZXMKK3VzZXJzLmRlbGV0ZUdyb3Vwcy50aXRsZT1Cb3JyYXIgR3J1cG9zIHlhIEV4aXN0ZW50ZXMKK3VzZXJzLmRlbGV0ZVJvbGVzLnRpdGxlPUJvcnJhciBQYXBlbGVzIGEgRGVzZW1wZfFhciB5YSBFeGlzdGVudGVzCit1c2Vycy5kZWxldGVVc2Vycy50aXRsZT1Cb3JyYXIgVXN1YXJpb3MgeWEgRXhpc3RlbnRlcwordXNlcnMuZXJyb3IuYXR0cmlidXRlLmdldD1FcnJvciByZWN1cGVyYW5kbyBhdHJpYnV0byB7MH0KK3VzZXJzLmVycm9yLmF0dHJpYnV0ZS5zZXQ9RXJyb3IgbW9kaWZpY2FuZG8gYXRyaWJ1dG8gezB9Cit1c2Vycy5lcnJvci5pbnZva2U9RXJyb3IgaW52b2NhbmRvIG9wZXJhY2nzbiB7MH0KK3VzZXJzLmVycm9yLmdyb3VwbmFtZS5yZXF1aXJlZD1TZSByZXF1aWVyZSBlbCBOb21icmUgZGUgR3J1cG8KK3VzZXJzLmVycm9yLnBhc3N3b3JkLnJlcXVpcmVkPUNvbnRyYXNl8WEgUmVxdWVyaWRhCit1c2Vycy5lcnJvci5xdW90ZXM9TGEgZG9ibGUgY29taWxsYSBubyBlc3RhIHBlcm1pdGlkYSBlbiBsb3MgdmFsb3JlcyBkZSBjYW1wbwordXNlcnMuZXJyb3Iucm9sZW5hbWUucmVxdWlyZWQ9U2UgcmVxdWllcmUgZWwgTm9tYnJlIGRlbCBQYXBlbCBhIERlc2VtcGXxYXIKK3VzZXJzLmVycm9yLnNlbGVjdD1FcnJvciBzZWxlY2Npb25hbmRvIG9iamV0b3MgZ2VzdGlvbmFkb3MKK3VzZXJzLmVycm9yLnRva2VuPVRyYW5zYWNjafNuIGVudmlhZGEgZnVlcmEgZGUgc2VydmljaW8KK3VzZXJzLmVycm9yLnVzZXJuYW1lLnJlcXVpcmVkPTxsaT5TZSByZXF1aWVyZSBlbCBub21icmUgZGVsIHVzdWFyaW88L2xpPgordXNlcnMuZ3JvdXAubmV3R3JvdXA9Q3JlYXIgUHJvcGllZGFkZXMgZGUgTnVldm8gR3J1cG8KK3VzZXJzLmdyb3VwLm9sZEdyb3VwPUVkaXRhciBQcm9waWVkYWRlcyBkZSBHcnVwbyB5YSBFeGlzdGVudGUKK3VzZXJzLmdyb3VwLnByb3BlcnRpZXM9UHJvcGllZGFkZXMgZGUgR3J1cG8KK3VzZXJzLmxpc3QuZGVzY3JpcHRpb249RGVzY3JpcGNp824KK3VzZXJzLmxpc3QuZnVsbE5hbWU9Tm9tYnJlIENvbXBsZXRvCit1c2Vycy5saXN0Lmdyb3VwbmFtZT1Ob21icmUgZGUgR3J1cG8KK3VzZXJzLmxpc3Qucm9sZW5hbWU9Tm9tYnJlIGRlIFBhcGVsIGEgRGVzZW1wZfFhcgordXNlcnMubGlzdC51c2VybmFtZT1Ob21icmUgZGUgVXN1YXJpbwordXNlcnMubGlzdEdyb3Vwcy50aXRsZT1MaXN0YSBkZSBHcnVwb3MKK3VzZXJzLmxpc3RSb2xlcy50aXRsZT1MaXN0YSBkZSBQYXBlbGVzIGEgRGVzZW1wZfFhcgordXNlcnMubGlzdFVzZXJzLnRpdGxlPUxpc3RhIGRlIFVzdWFyaW9zCit1c2Vycy5wcm9tcHQuZGVzY3JpcHRpb249RGVzY3JpcGNp8246Cit1c2Vycy5wcm9tcHQuZnVsbE5hbWU9Tm9tYnJlIENvbXBsZXRvOgordXNlcnMucHJvbXB0Lmdyb3VwbmFtZT1Ob21icmUgZGUgR3J1cG86Cit1c2Vycy5wcm9tcHQucGFzc3dvcmQ9Q29udHJhc2XxYToKK3VzZXJzLnByb21wdC5yb2xlbmFtZT1Ob21icmUgZGUgUGFwZWwgYSBEZXNlbXBl8WFyOgordXNlcnMucHJvbXB0LnVzZXJuYW1lPU5vbWJyZSBkZSBVc3VhcmlvOgordXNlcnMucm9sZS5uZXdSb2xlPUNyZWFyIE51ZXZhcyBQcm9waWVkYWRlcyBkZSBQYXBlbCBhIERlc2VtcGXxYXIKK3VzZXJzLnJvbGUub2xkUm9sZT1FZGl0YXIgUHJvcGllZGFkZXMgZGUgUGFwZWwgYSBEZXNlbXBl8WFyIEV4aXN0ZW50ZQordXNlcnMucm9sZS5wcm9wZXJ0aWVzPVByb3BpZWRhZGVzIGRlbCBQYXBlbCBhIERlc2VtcGXxYXIKK3VzZXJzLnRyZWVCdWlsZGVyLmdyb3Vwc05vZGU9R3J1cG9zCit1c2Vycy50cmVlQnVpbGRlci5yb2xlc05vZGU9UGFwZWxlcyBhIERlc2VtcGXxYXIKK3VzZXJzLnRyZWVCdWlsZGVyLnN1YnRyZWVOb2RlPURlZmluaWNp824gZGUgVXN1YXJpbwordXNlcnMudHJlZUJ1aWxkZXIudXNlcnNOb2RlPVVzdWFyaW9zCit1c2Vycy51c2VyLm5ld1VzZXI9Q3JlYXIgTnVldmFzIFByb3BpZWRhZGVzIGRlIFVzdWFyaW8KK3VzZXJzLnVzZXIub2xkVXNlcj1FZGl0YXIgUHJvcGllZGFkZXMgZGUgVXN1YXJpbyBFeGlzdGVudGUKK3VzZXJzLnVzZXIucHJvcGVydGllcz1Qcm9waWVkYWRlcyBkZSBVc3VhcmlvCisjIC0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL0FwcGxpY2F0aW9uUmVzb3VyY2VzX2phLnByb3BlcnRpZXMgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vQXBwbGljYXRpb25SZXNvdXJjZXNfamEucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDI4OWM5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL0FwcGxpY2F0aW9uUmVzb3VyY2VzX2phLnByb3BlcnRpZXMKQEAgLTAsMCArMSw0NDQgQEAKK2FwcGxpY2F0aW9uLnRpdGxlPVRvbWNhdFx1MzBiNVx1MzBmY1x1MzBkMFx1MzBmY1x1N2JhMVx1NzQwNlx1MzBiM1x1MzBmM1x1MzBiZFx1MzBmY1x1MzBlYgorZXJyb3JzLmhlYWRlcj08aDI+PGZvbnRjb2xvcj0icmVkIj5cdTRlMGRcdTZiNjNcdTMwNmFcdTMwYThcdTMwZTlcdTMwZmM8L2ZvbnQ+PC9oMj5cdTViOWZcdTg4NGNcdTMwNTlcdTMwOGJcdTUyNGRcdTMwNmJcdTMwMDFcdTRlMGJcdThhMThcdTMwNmVcdTMwYThcdTMwZTlcdTMwZmNcdTMwOTJcdTRmZWVcdTZiNjNcdTMwNTdcdTMwNjZcdTRlMGJcdTMwNTVcdTMwNDQ6PHVsPgorZXJyb3JzLmZvb3Rlcj08L3VsPjxocj4KK2Vycm9yLmxvZ2luPTxsaT5cdTMwZTZcdTMwZmNcdTMwYjZcdTU0MGRcdTMwN2VcdTMwNWZcdTMwNmZcdTMwZDFcdTMwYjlcdTMwZWZcdTMwZmNcdTMwYzlcdTMwNGNcdTkwNTVcdTMwNDRcdTMwN2VcdTMwNTk8L2xpPgorcHJvbXB0LnVzZXJuYW1lPVx1MzBlNlx1MzBmY1x1MzBiNlx1NTQwZAorcHJvbXB0LnBhc3N3b3JkPVx1MzBkMVx1MzBiOVx1MzBlZlx1MzBmY1x1MzBjOQorYnV0dG9uLmxvZ2luPVx1MzBlZFx1MzBiMFx1MzBhNFx1MzBmMworYnV0dG9uLnJlc2V0PVx1MzBlYVx1MzBiYlx1MzBjM1x1MzBjOAorYnV0dG9uLnNhdmU9XHU0ZmRkXHU1YjU4CitidXR0b24uY2hhbmdlPVx1NTkwOVx1NjZmNAorYnV0dG9uLmNhbmNlbD1cdTMwZWFcdTMwYmJcdTMwYzNcdTMwYzgKK2J1dHRvbi5jb21taXQ9XHU1OTA5XHU2NmY0XHUzMDkyXHU1M2NkXHU2NjIwCitidXR0b24ubG9nb3V0PVx1MzBlZFx1MzBiMFx1MzBhMlx1MzBhNlx1MzBjOAorbG9naW4uZW50ZXI9XHU2NWIwXHUzMDU3XHUzMDQ0XHUzMGJiXHUzMGMzXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDkyXHU5NThiXHU1OWNiXHUzMDU5XHUzMDhiXHUzMDVmXHUzMDgxXHUzMDZiXHUzMGU2XHUzMGZjXHUzMGI2XHU1NDBkXHUzMDY4XHUzMGQxXHUzMGI5XHUzMGVmXHUzMGZjXHUzMGM5XHUzMDkyXHU1MTY1XHU1MjliXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0Citsb2dpbi5jaGFuZ2VMYW5ndWFnZT1cdThhMDBcdThhOWVcdTMwNmVcdTU5MDlcdTY2ZjQKK2Vycm9yLmxvZ2luPVx1MzBlNlx1MzBmY1x1MzBiNlx1NTQwZFx1MzA3ZVx1MzA1Zlx1MzA2Zlx1MzBkMVx1MzBiOVx1MzBlZlx1MzBmY1x1MzBjOVx1MzA0Y1x1OTA1NVx1MzA0NFx1MzA3ZVx1MzA1OQorZXJyb3IudHJ5YWdhaW49XHUzMDgyXHUzMDQ2XHU0ZTAwXHU1ZWE2XHU1YjlmXHU4ODRjXHUzMDU5XHUzMDhiXHUzMDVmXHUzMDgxXHUzMDZiXHUzMGFmXHUzMGVhXHUzMGMzXHUzMGFmXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0CitlcnJvci5oZXJlPVx1MzA1M1x1MzA1MworcHJvbXB0LnNvbWVUZXh0PVNvbWUgVGV4dAorcHJvbXB0Lm1vcmVUZXh0PU1vcmUgVGV4dAorc2FtcGxlLnNvbWVUZXh0LnJlcXVpcmVkPTxsaT4iU29tZSBUZXh0Ilx1MzA2Zlx1N2E3YVx1MzA2Ylx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5MzwvbGk+CitzYW1wbGUubW9yZVRleHQucmVxdWlyZWQ9PGxpPiJNb3JlIFRleHQiXHUzMDZmXHU3YTdhXHUzMDZiXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzPC9saT4KK3NhdmUuc3VjY2Vzcz1cdTRmZGRcdTViNThcdTYyMTBcdTUyOWYhCitzYXZlLmZhaWw9XHU0ZmRkXHU1YjU4XHU1OTMxXHU2NTU3IQorc2VydmVyLnBvcnRudW1iZXI9XHUzMGRkXHUzMGZjXHUzMGM4XHU3NTZhXHU1M2Y3CitzZXJ2ZXIuZGVidWdsZXZlbD1cdTMwYzdcdTMwZDBcdTMwYzNcdTMwYjBcdTMwZWNcdTMwZDlcdTMwZWIKK3NlcnZlci5zaHV0ZG93bj1cdTMwYjdcdTMwZTNcdTMwYzNcdTMwYzhcdTMwYzBcdTMwYTZcdTMwZjMKK3NlcnZlci5wcm9wZXJ0aWVzPVx1MzBiNVx1MzBmY1x1MzBkMFx1MzBmY1x1MzBkN1x1MzBlZFx1MzBkMVx1MzBjNlx1MzBhMword2FybmluZy5oZWFkZXI9PGNlbnRlcj48aDQ+PGZvbnRjb2xvcj0icmVkIj5cdThiNjZcdTU0NGEhPC9mb250PjwvaDQ+PC9jZW50ZXI+PHVsPgorc2VydmVyLnBvcnQud2FybmluZz08bGk+MTAyNFx1NzU2YVx1NGVlNVx1NGUwYlx1MzA2ZVx1MzBkZFx1MzBmY1x1MzBjOFx1NzU2YVx1NTNmN1x1MzA2ZVx1NTIyOVx1NzUyOFx1MzA2Ylx1MzA2Zlx1MzAwMVx1NzI3OVx1NTIyNVx1MzA2YVx1MzBiZFx1MzBkNVx1MzBjOFx1MzBhNlx1MzBhN1x1MzBhMlx1NmEyOVx1OTY1MFx1MzA0Y1x1NWZjNVx1ODk4MVx1MzA2N1x1MzA1OVx1MzAwMgorZXJyb3IucG9ydE51bWJlci5yZXF1aXJlZD08bGk+XHUzMGRkXHUzMGZjXHUzMGM4XHU3NTZhXHU1M2Y3XHUzMDRjXHU2MzA3XHU1YjlhXHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzPC9saT4KK2Vycm9yLnBvcnROdW1iZXIuZm9ybWF0PTxsaT5cdTMwZGRcdTMwZmNcdTMwYzhcdTc1NmFcdTUzZjdcdTMwNGNcdTU5YTVcdTVmNTNcdTMwNmFcdTY1NzRcdTY1NzBcdTMwNjdcdTMwNmZcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTM8L2xpPgorZXJyb3IucG9ydE51bWJlci5yYW5nZT08bGk+XHUzMGRkXHUzMGZjXHUzMGM4XHU3NTZhXHU1M2Y3XHUzMDRjXHU3YmM0XHU1NmYyXHU1OTE2XHUzMDY3XHUzMDU5XHUzMDAyXHU3YmM0XHU1NmYyXHUzMDZmMS02NTUzNVx1MzA2N1x1MzA1OVx1MzAwMjwvbGk+CitlcnJvci5zaHV0ZG93blRleHQubGVuZ3RoPTxsaT5cdTMwYjdcdTMwZTNcdTMwYzNcdTMwYzhcdTMwYzBcdTMwYTZcdTMwZjNcdTMwNmVcdTMwZDFcdTMwYjlcdTMwZWZcdTMwZmNcdTMwYzlcdTMwNmY2XHU1YjU3XHU0ZWU1XHU0ZTBhXHUzMDY3XHUzMDZhXHUzMDUxXHUzMDhjXHUzMDcwXHUzMDQ0XHUzMDUxXHUzMDdlXHUzMDViXHUzMDkzPC9saT4KK2Vycm9yLmVuZ2luZU5hbWUucmVxdWlyZWQ9PGxpPlx1MzBhOFx1MzBmM1x1MzBiOFx1MzBmM1x1NTQwZFx1MzA2Zlx1NzcwMVx1NzU2NVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5MzwvbGk+CitlcnJvci5hY2NlcHRDb3VudFRleHQucmVxdWlyZWQ9PGxpPlx1NTQwY1x1NjY0Mlx1NjNhNVx1N2Q5YVx1NjU3MFx1MzA0Y1x1NWZjNVx1ODk4MVx1MzA2N1x1MzA1OTwvbGk+CitlcnJvci5hY2NlcHRDb3VudFRleHQuZm9ybWF0PTxsaT5cdTU0MGNcdTY2NDJcdTYzYTVcdTdkOWFcdTY1NzBcdTMwNGNcdTU5YTVcdTVmNTNcdTMwNmFcdTY1NzRcdTY1NzBcdTMwNjdcdTMwNmZcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTM8L2xpPgorZXJyb3IuYWNjZXB0Q291bnRUZXh0LnJhbmdlPTxsaT5cdTU0MGNcdTY2NDJcdTYzYTVcdTdkOWFcdTY1NzBcdTMwNGNcdTdiYzRcdTU2ZjJcdTU5MTZcdTMwNjdcdTMwNTkuIFx1N2JjNFx1NTZmMlx1MzA2ZjAtMTI4XHUzMDY3XHUzMDU5XHUzMDAyPC9saT4KK2Vycm9yLmNvbm5UaW1lT3V0VGV4dC5yZXF1aXJlZD08bGk+XHU2M2E1XHU3ZDlhXHUzMGJmXHUzMGE0XHUzMGUwXHUzMGEyXHUzMGE2XHUzMGM4XHUzMDRjXHU1ZmM1XHU4OTgxXHUzMDY3XHUzMDU5PC9saT4KK2Vycm9yLmNvbm5UaW1lT3V0VGV4dC5mb3JtYXQ9PGxpPlx1NjNhNVx1N2Q5YVx1MzBiZlx1MzBhNFx1MzBlMFx1MzBhMlx1MzBhNlx1MzBjOFx1MzA0Y1x1NTlhNVx1NWY1M1x1MzA2YVx1NjU3NFx1NjU3MFx1MzA2N1x1MzA2Zlx1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5MzwvbGk+CitlcnJvci5jb25uVGltZU91dFRleHQucmFuZ2U9PGxpPlx1NjNhNVx1N2Q5YVx1MzBiZlx1MzBhNFx1MzBlMFx1MzBhMlx1MzBhNlx1MzBjOFx1MzA0Y1x1N2JjNFx1NTZmMlx1NTkxNlx1MzA2N1x1MzA1OVx1MzAwMlx1N2JjNFx1NTZmMlx1MzA2ZjAtNjAwMDBcdTMwNjdcdTMwNTlcdTMwMDI8L2xpPgorZXJyb3IuYnVmZmVyU2l6ZVRleHQucmVxdWlyZWQ9PGxpPlx1MzBkMFx1MzBjM1x1MzBkNVx1MzBhMVx1MzBiNVx1MzBhNFx1MzBiYVx1MzA0Y1x1NWZjNVx1ODk4MVx1MzA2N1x1MzA1OTwvbGk+CitlcnJvci5idWZmZXJTaXplVGV4dC5mb3JtYXQ9PGxpPlx1MzBkMFx1MzBjM1x1MzBkNVx1MzBhMVx1MzBiNVx1MzBhNFx1MzBiYVx1MzA0Y1x1NTlhNVx1NWY1M1x1MzA2YVx1NjU3NFx1NjU3MFx1MzA2N1x1MzA2Zlx1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5MzwvbGk+CitlcnJvci5idWZmZXJTaXplVGV4dC5yYW5nZT08bGk+XHUzMGQwXHUzMGMzXHUzMGQ1XHUzMGExXHUzMGI1XHUzMGE0XHUzMGJhXHUzMDRjXHU3YmM0XHU1NmYyXHU1OTE2XHUzMDY3XHUzMDU5XHUzMDAyXHU3YmM0XHU1NmYyXHUzMDZmMS04MTkyXHUzMDY3XHUzMDU5XHUzMDAyPC9saT4KK2Vycm9yLmFkZHJlc3MuaW52YWxpZD08bGk+SVBcdTMwYTJcdTMwYzlcdTMwZWNcdTMwYjlcdTMwNGNcdTRlMGRcdTZiNjNcdTMwNjdcdTMwNTk8L2xpPgorZXJyb3IucmVkaXJlY3RQb3J0VGV4dC5yZXF1aXJlZD08bGk+XHUzMGVhXHUzMGMwXHUzMGE0XHUzMGVjXHUzMGFmXHUzMGM4XHUzMGRkXHUzMGZjXHUzMGM4XHU3NTZhXHU1M2Y3XHUzMDRjXHU2MzA3XHU1YjlhXHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzPC9saT4KK2Vycm9yLnJlZGlyZWN0UG9ydFRleHQuZm9ybWF0PTxsaT5cdTMwZWFcdTMwYzBcdTMwYTRcdTMwZWNcdTMwYWZcdTMwYzhcdTMwZGRcdTMwZmNcdTMwYzhcdTc1NmFcdTUzZjdcdTMwNGNcdTU5YTVcdTVmNTNcdTMwNmFcdTY1NzRcdTY1NzBcdTMwNjdcdTMwNmZcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTM8L2xpPgorZXJyb3IucmVkaXJlY3RQb3J0VGV4dC5yYW5nZT08bGk+XHUzMGVhXHUzMGMwXHUzMGE0XHUzMGVjXHUzMGFmXHUzMGM4XHUzMGRkXHUzMGZjXHUzMGM4XHU3NTZhXHU1M2Y3XHUzMDRjXHU3YmM0XHU1NmYyXHU1OTE2XHUzMDY3XHUzMDU5XHUzMDAyXHU3YmM0XHU1NmYyXHUzMDZmMS02NTUzNVx1MzA2N1x1MzA1OVx1MzAwMjwvbGk+CitlcnJvci5taW5Qcm9jZXNzb3JzVGV4dC5yZXF1aXJlZD08bGk+XHU2NzAwXHU1YzBmXHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5XHU2NTcwXHUzMDRjXHU2MzA3XHU1YjlhXHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzPC9saT4KK2Vycm9yLm1pblByb2Nlc3NvcnNUZXh0LmZvcm1hdD08bGk+XHU2NzAwXHU1YzBmXHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5XHU2NTcwXHUzMDRjXHU1OWE1XHU1ZjUzXHUzMDZhXHU2NTc0XHU2NTcwXHUzMDY3XHUzMDZmXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDViXHUzMDkzPC9saT4KK2Vycm9yLm1pblByb2Nlc3NvcnNUZXh0LnJhbmdlPTxsaT5cdTY3MDBcdTVjMGZcdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjlcdTY1NzBcdTMwNGNcdTdiYzRcdTU2ZjJcdTU5MTZcdTMwNjdcdTMwNTlcdTMwMDJcdTdiYzRcdTU2ZjJcdTMwNmYxLTUxMlx1MzA2N1x1MzA1OVx1MzAwMjwvbGk+CitlcnJvci5tYXhQcm9jZXNzb3JzVGV4dC5yZXF1aXJlZD08bGk+XHU2NzAwXHU1OTI3XHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5XHU2NTcwXHUzMDRjXHU2MzA3XHU1YjlhXHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzPC9saT4KK2Vycm9yLm1heFByb2Nlc3NvcnNUZXh0LmZvcm1hdD08bGk+XHU2NzAwXHU1OTI3XHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5XHU2NTcwXHUzMDRjXHU1OWE1XHU1ZjUzXHUzMDZhXHU2NTc0XHU2NTcwXHUzMDY3XHUzMDZmXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDViXHUzMDkzPC9saT4KK2Vycm9yLm1heFByb2Nlc3NvcnNUZXh0LnJhbmdlPTxsaT5cdTY3MDBcdTU5MjdcdTMwZDdcdTMwZWRcdTMwYmJcdTMwYjlcdTY1NzBcdTMwNGNcdTdiYzRcdTU2ZjJcdTU5MTZcdTMwNjdcdTMwNTlcdTMwMDJcdTdiYzRcdTU2ZjJcdTMwNmYxLTUxMlx1MzA2N1x1MzA1OS4gXHUzMDdlXHUzMDVmXHUzMDAxXHU2NzAwXHU1OTI3XHUzMGQ3XHUzMGVkXHUzMGJiXHUzMGI5XHU2NTcwID49IFx1NjcwMFx1NWMwZlx1MzBkN1x1MzBlZFx1MzBiYlx1MzBiOVx1NjU3MFx1MzAwMVx1MzA2N1x1MzA2YVx1MzA1MVx1MzA4Y1x1MzA3MFx1MzA2YVx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMjwvbGk+CitlcnJvci5wcm94eU5hbWUuaW52YWxpZD08bGk+XHUzMGQ3XHUzMGVkXHUzMGFkXHUzMGI3XHU1NDBkXHUzMDRjXHU0ZTBkXHU2YjYzXHUzMDY3XHUzMDU5PC9saT4KK2Vycm9yLnByb3h5UG9ydFRleHQucmVxdWlyZWQ9PGxpPlx1MzBkN1x1MzBlZFx1MzBhZFx1MzBiN1x1MzBkZFx1MzBmY1x1MzBjOFx1NzU2YVx1NTNmN1x1MzA0Y1x1NjMwN1x1NWI5YVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5MzwvbGk+CitlcnJvci5wcm94eVBvcnRUZXh0LmZvcm1hdD08bGk+XHUzMGQ3XHUzMGVkXHUzMGFkXHUzMGI3XHUzMGRkXHUzMGZjXHUzMGM4XHU3NTZhXHU1M2Y3XHUzMDRjXHU1OWE1XHU1ZjUzXHUzMDZhXHU2NTc0XHU2NTcwXHUzMDY3XHUzMDZmXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDViXHUzMDkzPC9saT4KK2Vycm9yLnByb3h5UG9ydFRleHQucmFuZ2U9PGxpPlx1MzBkN1x1MzBlZFx1MzBhZFx1MzBiN1x1MzBkZFx1MzBmY1x1MzBjOFx1NzU2YVx1NTNmN1x1MzA0Y1x1N2JjNFx1NTZmMlx1NTkxNlx1MzA2N1x1MzA1OVx1MzAwMlx1N2JjNFx1NTZmMlx1MzA2ZjEtNjU1MzVcdTMwNjdcdTMwNTlcdTMwMDI8L2xpPgorZXJyb3IuaG9zdE5hbWUuYmFkPVx1MzBkYlx1MzBiOVx1MzBjOFx1NTQwZCB7MH0gXHUzMDRjXHU0ZTBkXHU2YjYzXHUzMDY3XHUzMDU5CitlcnJvci5ob3N0TmFtZS5yZXF1aXJlZD08bGk+XHUzMGRiXHUzMGI5XHUzMGM4XHU1NDBkXHUzMDZmXHU3NzAxXHU3NTY1XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzPC9saT4KK2Vycm9yLmhvc3ROYW1lLmV4aXN0cz08bGk+XHU1NDBjXHU1NDBkXHUzMDZlXHUzMGRiXHUzMGI5XHUzMGM4XHU1NDBkXHUzMDRjXHU2NWUyXHUzMDZiXHU1YjU4XHU1NzI4XHUzMDU3XHUzMDdlXHUzMDU5PC9saT4KK2Vycm9yLmFwcEJhc2UucmVxdWlyZWQ9PGxpPlx1MzBhMlx1MzBkN1x1MzBlYVx1MzBiMVx1MzBmY1x1MzBiN1x1MzBlN1x1MzBmM1x1MzBkOVx1MzBmY1x1MzBiOVx1MzA2Zlx1NzcwMVx1NzU2NVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5MzwvbGk+CitzZXJ2aWNlLm5hbWU9XHU1NDBkXHU1MjRkCitzZXJ2aWNlLmVuZ2luZS5wcm9wcz1cdTMwYThcdTMwZjNcdTMwYjhcdTMwZjNcdTMwZDdcdTMwZWRcdTMwZDFcdTMwYzZcdTMwYTMKK3NlcnZpY2UuZGVmYXVsdGhvc3RuYW1lPVx1MzBjN1x1MzBkNVx1MzBhOVx1MzBlYlx1MzBjOFx1MzBkYlx1MzBiOVx1MzBjOFx1NTQwZAorc2VydmljZS5wcm9wZXJ0aWVzPVx1MzBiNVx1MzBmY1x1MzBkM1x1MzBiOVx1MzBkN1x1MzBlZFx1MzBkMVx1MzBjNlx1MzBhMworc2VydmljZS5wcm9wZXJ0eT1cdTMwZDdcdTMwZWRcdTMwZDFcdTMwYzZcdTMwYTMKK3NlcnZpY2UudmFsdWU9XHU1MDI0CitzZXJ2aWNlLmNyZWF0ZS5uZXc9XHU2NWIwXHUzMDU3XHUzMDQ0XHUzMGI1XHUzMGZjXHUzMGQzXHUzMGI5XHUzMDZlXHU0ZjVjXHU2MjEwCithY3Rpb25zLmF2YWlsYWJsZS5hY3Rpb25zPVx1NTIyOVx1NzUyOFx1NTNlZlx1ODBmZFx1MzA2YVx1MzBhMlx1MzBhZlx1MzBiN1x1MzBlN1x1MzBmMworYWN0aW9ucy5zZXJ2aWNlcy5jcmVhdGU9XHU2NWIwXHUzMDU3XHUzMDQ0XHUzMGI1XHUzMGZjXHUzMGQzXHUzMGI5XHUzMDZlXHU0ZjVjXHU2MjEwCithY3Rpb25zLnNlcnZpY2VzLmRlbGV0ZT1cdTczZmVcdTU3MjhcdTMwNmVcdTMwYjVcdTMwZmNcdTMwZDNcdTMwYjlcdTMwOTJcdTUyNGFcdTk2NjQKK2FjdGlvbnMuc2VydmljZXMuZGVsZXRlcz1cdTY1ZTJcdTViNThcdTMwNmVcdTMwYjVcdTMwZmNcdTMwZDNcdTMwYjlcdTMwNmVcdTUyNGFcdTk2NjQKK2FjdGlvbnMuc2VydmljZXMuZWRpdD1cdTY1ZTJcdTViNThcdTMwNmVcdTMwYjVcdTMwZmNcdTMwZDNcdTMwYjlcdTMwNmVcdTdkZThcdTk2YzYKK2FjdGlvbnMuYWNjZXNzbG9nZ2VyLmNyZWF0ZT1cdTY1YjBcdTMwNTdcdTMwNDRcdTMwYTJcdTMwYWZcdTMwYmJcdTMwYjlMb2dnZXJcdTMwNmVcdTRmNWNcdTYyMTAKK2FjdGlvbnMuYWNjZXNzbG9nZ2VyLmRlbGV0ZT1cdTMwYTJcdTMwYWZcdTMwYmJcdTMwYjlMb2dnZXJcdTMwNmVcdTUyNGFcdTk2NjQKK2FjdGlvbnMuY29ubmVjdG9ycy5jcmVhdGU9XHU2NWIwXHUzMDU3XHUzMDQ0XHUzMGIzXHUzMGNkXHUzMGFmXHUzMGJmXHUzMDZlXHU0ZjVjXHU2MjEwCithY3Rpb25zLmNvbm5lY3RvcnMuZGVsZXRlPVx1NzNmZVx1NTcyOFx1MzA2ZVx1MzBiM1x1MzBjZFx1MzBhZlx1MzBiZlx1MzA5Mlx1NTI0YVx1OTY2NAorYWN0aW9ucy5jb25uZWN0b3JzLmRlbGV0ZXM9XHU2NWUyXHU1YjU4XHUzMDZlXHUzMGIzXHUzMGNkXHUzMGFmXHUzMGJmXHUzMDZlXHU1MjRhXHU5NjY0CithY3Rpb25zLmNvbm5lY3RvcnMuZWRpdD1cdTY1ZTJcdTViNThcdTMwNmVcdTMwYjNcdTMwY2RcdTMwYWZcdTMwYmZcdTMwNmVcdTdkZThcdTk2YzYKK2FjdGlvbnMuY29udGV4dHMuY3JlYXRlPVx1NjViMFx1MzA1N1x1MzA0NFx1MzBiM1x1MzBmM1x1MzBjNlx1MzBhZFx1MzBiOVx1MzBjOFx1MzA2ZVx1NGY1Y1x1NjIxMAorYWN0aW9ucy5jb250ZXh0cy5kZWxldGU9XHU3M2ZlXHU1NzI4XHUzMDZlXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4XHUzMDkyXHU1MjRhXHU5NjY0CithY3Rpb25zLmNvbnRleHRzLmRlbGV0ZXM9XHU2NWUyXHU1YjU4XHUzMDZlXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4XHUzMDZlXHU1MjRhXHU5NjY0CithY3Rpb25zLmNvbnRleHRzLmVkaXQ9XHU2NWUyXHU1YjU4XHUzMDZlXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4XHUzMDZlXHU3ZGU4XHU5NmM2CithY3Rpb25zLmRlZmF1bHRjb250ZXh0cy5jcmVhdGU9XHU2NWIwXHUzMDU3XHUzMDQ0XHUzMGM3XHUzMGQ1XHUzMGE5XHUzMGViXHUzMGM4XHUzMGIzXHUzMGYzXHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4XHUzMDZlXHU0ZjVjXHU2MjEwCithY3Rpb25zLmRlZmF1bHRjb250ZXh0cy5kZWxldGU9XHU3M2ZlXHU1NzI4XHUzMDZlXHUzMGM3XHUzMGQ1XHUzMGE5XHUzMGViXHUzMGM4XHUzMGIzXHUzMGYzXHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4XHUzMDkyXHU1MjRhXHU5NjY0CithY3Rpb25zLmRlZmF1bHRjb250ZXh0cy5kZWxldGVzPVx1NjVlMlx1NWI1OFx1MzA2ZVx1MzBjN1x1MzBkNVx1MzBhOVx1MzBlYlx1MzBjOFx1MzBiM1x1MzBmM1x1MzBjNlx1MzBhZFx1MzBiOVx1MzBjOFx1MzA2ZVx1NTI0YVx1OTY2NAorYWN0aW9ucy5kZWZhdWx0Y29udGV4dHMuZWRpdD1cdTY1ZTJcdTViNThcdTMwNmVcdTMwYzdcdTMwZDVcdTMwYTlcdTMwZWJcdTMwYzhcdTMwYjNcdTMwZjNcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzhcdTMwNmVcdTdkZThcdTk2YzYKK2FjdGlvbnMuZ3JvdXAuY3JlYXRlPVx1NjViMFx1MzA1N1x1MzA0NFx1MzBiMFx1MzBlYlx1MzBmY1x1MzBkN1x1MzA2ZVx1NGY1Y1x1NjIxMAorYWN0aW9ucy5ncm91cC5kZWxldGU9XHU2NWUyXHU1YjU4XHUzMDZlXHUzMGIwXHUzMGViXHUzMGZjXHUzMGQ3XHUzMDZlXHU1MjRhXHU5NjY0CithY3Rpb25zLmhvc3RzLmNyZWF0ZT1cdTY1YjBcdTMwNTdcdTMwNDRcdTMwZGJcdTMwYjlcdTMwYzhcdTMwNmVcdTRmNWNcdTYyMTAKK2FjdGlvbnMuaG9zdHMuZGVsZXRlPVx1NzNmZVx1NTcyOFx1MzA2ZVx1MzBkYlx1MzBiOVx1MzBjOFx1MzA5Mlx1NTI0YVx1OTY2NAorYWN0aW9ucy5ob3N0cy5kZWxldGVzPVx1NjVlMlx1NWI1OFx1MzA2ZVx1MzBkYlx1MzBiOVx1MzBjOFx1MzA2ZVx1NTI0YVx1OTY2NAorYWN0aW9ucy5ob3N0cy5lZGl0PVx1NjVlMlx1NWI1OFx1MzA2ZVx1MzBkYlx1MzBiOVx1MzBjOFx1MzA2ZVx1N2RlOFx1OTZjNgorYWN0aW9ucy5sb2dnZXJzLmNyZWF0ZT1cdTY1YjBcdTMwNTdcdTMwNDRMb2dnZXJcdTMwNmVcdTRmNWNcdTYyMTAKK2FjdGlvbnMubG9nZ2Vycy5kZWxldGU9XHU3M2ZlXHU1NzI4XHUzMDZlTG9nZ2VyXHUzMDkyXHU1MjRhXHU5NjY0CithY3Rpb25zLmxvZ2dlcnMuZGVsZXRlcz1cdTY1ZTJcdTViNThcdTMwNmVMb2dnZXJzXHUzMDZlXHU1MjRhXHU5NjY0CithY3Rpb25zLmxvZ2dlcnMuZWRpdD1cdTY1ZTJcdTViNThcdTMwNmVMb2dnZXJcdTMwNmVcdTdkZThcdTk2YzYKK2FjdGlvbnMucmVhbG1zLmNyZWF0ZT1cdTY1YjBcdTMwNTdcdTMwNDRcdTMwZTZcdTMwZmNcdTMwYjZcdTMwZWNcdTMwZWJcdTMwZTBcdTMwNmVcdTRmNWNcdTYyMTAKK2FjdGlvbnMucmVhbG1zLmRlbGV0ZT1cdTczZmVcdTU3MjhcdTMwNmVcdTMwZTZcdTMwZmNcdTMwYjZcdTMwZWNcdTMwZWJcdTMwZTBcdTMwNmVcdTUyNGFcdTk2NjQKK2FjdGlvbnMucmVhbG1zLmRlbGV0ZXM9XHUzMGU2XHUzMGZjXHUzMGI2XHUzMGVjXHUzMGViXHUzMGUwXHUzMDZlXHU1MjRhXHU5NjY0CithY3Rpb25zLnJlYWxtcy5lZGl0PVx1NjVlMlx1NWI1OFx1MzA2ZVx1MzBlY1x1MzBlYlx1MzBlMFx1MzA2ZVx1N2RlOFx1OTZjNgorYWN0aW9ucy5yZXF1ZXN0ZmlsdGVyLmNyZWF0ZT1cdTY1YjBcdTMwNTdcdTMwNDRcdTMwZWFcdTMwYWZcdTMwYThcdTMwYjlcdTMwYzhcdTMwZDVcdTMwYTNcdTMwZWJcdTMwYmZcdTMwNmVcdTRmNWNcdTYyMTAKK2FjdGlvbnMucmVxdWVzdGZpbHRlci5kZWxldGU9XHUzMGVhXHUzMGFmXHUzMGE4XHUzMGI5XHUzMGM4XHUzMGQ1XHUzMGEzXHUzMGViXHUzMGJmXHUzMDZlXHU1MjRhXHU5NjY0CithY3Rpb25zLnVzZXIuY3JlYXRlPVx1NjViMFx1MzA1N1x1MzA0NFx1MzBlNlx1MzBmY1x1MzBiNlx1MzA2ZVx1NGY1Y1x1NjIxMAorYWN0aW9ucy51c2VyLmRlbGV0ZT1cdTY1ZTJcdTViNThcdTMwNmVcdTMwZTZcdTMwZmNcdTMwYjZcdTMwNmVcdTUyNGFcdTk2NjQKK2FjdGlvbnMudmFsdmVzLmNyZWF0ZT1cdTY1YjBcdTMwNTdcdTMwNDRcdTMwZDBcdTMwZWJcdTMwZDZcdTMwNmVcdTRmNWNcdTYyMTAKK2FjdGlvbnMudmFsdmVzLmVkaXQ9XHUzMGQwXHUzMGViXHUzMGQ2XHUzMDZlXHU3ZGU4XHU5NmM2CithY3Rpb25zLnZhbHZlcy5kZWxldGU9XHU3M2ZlXHU1NzI4XHUzMDZlXHUzMGQwXHUzMGViXHUzMGQ2XHUzMDkyXHU1MjRhXHU5NjY0CithY3Rpb25zLnZhbHZlcy5kZWxldGVzPVx1NjVlMlx1NWI1OFx1MzA2ZVx1MzBkMFx1MzBlYlx1MzBkNlx1MzA2ZVx1NTI0YVx1OTY2NAorYWN0aW9ucy5hbGlhcy5jcmVhdGU9XHU2NWIwXHUzMDU3XHUzMDQ0XHUzMGE4XHUzMGE0XHUzMGVhXHUzMGEyXHUzMGI5XHUzMDZlXHU0ZjVjXHU2MjEwCithY3Rpb25zLmFsaWFzLmRlbGV0ZT1cdTMwYThcdTMwYTRcdTMwZWFcdTMwYTJcdTMwYjlcdTMwNmVcdTUyNGFcdTk2NjQKK25ldy5hbGlhcz1cdTY1YjBcdTMwNTdcdTMwNDRcdTMwYThcdTMwYTRcdTMwZWFcdTMwYTJcdTMwYjkKK2Nvbm5lY3Rvci50eXBlPVx1N2EyZVx1OTg1ZQorY29ubmVjdG9yLnNjaGVtZT1cdTMwYjlcdTMwYWRcdTMwZmNcdTMwZTAKK2Nvbm5lY3Rvci5hY2NlcHQuY291bnQ9XHU1NDBjXHU2NjQyXHU2M2E1XHU3ZDlhXHU2NTcwCitjb25uZWN0b3IuY29tcHJlc3Npb249XHU1NzI3XHU3ZTJlCitjb25uZWN0b3IuY29ubmVjdGlvbi5saW5nZXI9XHU2M2E1XHU3ZDlhXHUzMDZlXHU2YjhiXHU1YjU4W2xpbmdlcl0KK2Nvbm5lY3Rvci5jb25uZWN0aW9uLnRpbWVvdXQ9XHU2M2E1XHU3ZDlhXHUzMGJmXHUzMGE0XHUzMGUwXHUzMGEyXHUzMGE2XHUzMGM4Citjb25uZWN0b3IuY29ubmVjdGlvbi51cGxvYWRUaW1lb3V0PVx1MzBhMlx1MzBjM1x1MzBkN1x1MzBlZFx1MzBmY1x1MzBjOVx1MzBiZlx1MzBhNFx1MzBlMFx1MzBhMlx1MzBhNlx1MzBjOAorY29ubmVjdG9yLmRlZmF1bHQuYnVmZmVyPVx1MzBjN1x1MzBkNVx1MzBhOVx1MzBlYlx1MzBjOFx1MzBkMFx1MzBjM1x1MzBkNVx1MzBhMVx1MzBiNVx1MzBhNFx1MzBiYQorY29ubmVjdG9yLmNvbm5lY3Rpb24uZGlzYWJsZVVwbG9hZFRpbWVvdXQ9XHUzMGEyXHUzMGMzXHUzMGQ3XHUzMGVkXHUzMGZjXHUzMGM5XHUzMGJmXHUzMGE0XHUzMGUwXHUzMGEyXHUzMGE2XHUzMGM4XHUzMDZlXHU3MTIxXHU1MmI5XHU1MzE2Citjb25uZWN0b3IuZW5hYmxlLmRucz1ETlNcdTMwNmVcdTMwZWJcdTMwYzNcdTMwYWZcdTMwYTJcdTMwYzNcdTMwZDcKK2Nvbm5lY3Rvci51cmllbmNvZGluZz1VUkkgXHUzMGE4XHUzMGYzXHUzMGIzXHUzMGZjXHUzMGM3XHUzMGEzXHUzMGYzXHUzMGIwCitjb25uZWN0b3IudXNlQm9keUVuY29kaW5nRm9yVVJJPVVSSVx1MzBhZlx1MzBhOFx1MzBlYVx1MzBkMVx1MzBlOVx1MzBlMVx1MzBmY1x1MzBiZlx1MzA2Ylx1MzBkY1x1MzBjN1x1MzBhM1x1MzA2ZVx1MzBhOFx1MzBmM1x1MzBiM1x1MzBmY1x1MzBjN1x1MzBhM1x1MzBmM1x1MzBiMFx1MzA5Mlx1NGY3Zlx1NzUyOAorY29ubmVjdG9yLmFsbG93VHJhY2U9VFJBQ0VcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwOTJcdThhMzFcdTUzZWYKK2Nvbm5lY3Rvci5hZGRyZXNzLmlwPUlQXHUzMGEyXHUzMGM5XHUzMGVjXHUzMGI5Citjb25uZWN0b3IucmVkaXJlY3QucG9ydG51bWJlcj1cdTMwZWFcdTMwYzBcdTMwYTRcdTMwZWNcdTMwYWZcdTMwYzhcdTMwZGRcdTMwZmNcdTMwYzhcdTc1NmFcdTUzZjcKK2Nvbm5lY3Rvci5taW49XHU2NzAwXHU1YzBmCitjb25uZWN0b3IubWlsbGlzZWNvbmRzPVx1MzBkZlx1MzBlYVx1NzlkMgorY29ubmVjdG9yLm1heD1cdTY3MDBcdTU5MjcKK2Nvbm5lY3Rvci5tYXhrZWVwYWxpdmU9XHUzMGFkXHUzMGZjXHUzMGQ3XHUzMGEyXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGVhXHUzMGFmXHUzMGE4XHUzMGI5XHUzMGM4XHU2NzAwXHU1OTI3XHU2NTcwCitjb25uZWN0b3IubWF4c3BhcmU9XHU0ZTg4XHU1MDk5XHUzMGI5XHUzMGVjXHUzMGMzXHUzMGM5XHU2NzAwXHU1OTI3XHU2NTcwCitjb25uZWN0b3IubWF4dGhyZWFkcz1cdTMwYjlcdTMwZWNcdTMwYzNcdTMwYzlcdTY3MDBcdTU5MjdcdTY1NzAKK2Nvbm5lY3Rvci5taW5zcGFyZT1cdTRlODhcdTUwOTlcdTMwYjlcdTMwZWNcdTMwYzNcdTMwYzlcdTY3MDBcdTVjMGZcdTY1NzAKK2Nvbm5lY3Rvci50aHJlYWRwcmlvcml0eT1Qcm9jZXNzb3IgVGhyZWFkIFByaW9yaXR5Citjb25uZWN0b3IucHJveHkubmFtZT1cdTMwZDdcdTMwZWRcdTMwYWRcdTMwYjdcdTU0MGQKK2Nvbm5lY3Rvci5wcm94eS5wb3J0bnVtYmVyPVx1MzBkN1x1MzBlZFx1MzBhZFx1MzBiN1x1MzBkZFx1MzBmY1x1MzBjOFx1NzU2YVx1NTNmNworY29ubmVjdG9yLmFsZ29yaXRobT1cdTMwYTJcdTMwZWJcdTMwYjRcdTMwZWFcdTMwYmFcdTMwZTAKK2Nvbm5lY3Rvci5jaXBoZXJzPVx1NjY5N1x1NTNmN1x1NTMxNlx1NjViOVx1NWYwZgorY29ubmVjdG9yLmNsaWVudC5hdXRoPVx1MzBhZlx1MzBlOVx1MzBhNFx1MzBhMlx1MzBmM1x1MzBjOFx1OGE4ZFx1OGEzYworY29ubmVjdG9yLmtleXN0b3JlLmZpbGVuYW1lPVx1MzBhZFx1MzBmY1x1MzBiOVx1MzBjOFx1MzBhMlx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1NTQwZAorY29ubmVjdG9yLmtleXN0b3JlLnBhc3N3b3JkPVx1MzBhZFx1MzBmY1x1MzBiOVx1MzBjOFx1MzBhMlx1MzBkMVx1MzBiOVx1MzBlZlx1MzBmY1x1MzBjOQorY29ubmVjdG9yLmtleXN0b3JlLnR5cGU9XHUzMGFkXHUzMGZjXHUzMGI5XHUzMGM4XHUzMGEyXHUzMDZlXHU3YTJlXHU5ODVlCitjb25uZWN0b3Iuc3NsUHJvdG9jb2w9U1NMXHUzMGQ3XHUzMGVkXHUzMGM4XHUzMGIzXHUzMGViCitjb25uZWN0b3Iua2V5UGFzcy53YXJuaW5nPTxsaT5rZXl0b29sXHUzMDkyXHU0ZjdmXHUzMDYzXHUzMDY2XHU4YTNjXHU2NjBlXHU2NmY4XHUzMDkyXHU0ZjVjXHU2MjEwXHUzMDU3XHUzMDY2XHU0ZTBiXHUzMDU1XHUzMDQ0XHUzMDAyPC9saT4KK2Nvbm5lY3Rvci5zZWN1cmU9U1NMXHU5MDFhXHU0ZmUxCitjb25uZWN0b3IudGNwTm9EZWxheT1UQ1BcdTkwNDVcdTVlZjZcdTcxMjFcdTMwNTcKK2Nvbm5lY3Rvci54cG93ZXJlZGJ5PVggUG93ZXJlZCBCeSBcdTMwZDhcdTMwYzNcdTMwYzAKK2hvc3QucHJvcGVydGllcz1cdTMwZGJcdTMwYjlcdTMwYzhcdTMwZDdcdTMwZWRcdTMwZDFcdTMwYzZcdTMwYTMKK2hvc3QubmFtZT1cdTU0MGRcdTUyNGQKK2hvc3QuYmFzZT1cdTMwYTJcdTMwZDdcdTMwZWFcdTMwYjFcdTMwZmNcdTMwYjdcdTMwZTdcdTMwZjNcdTMwZDlcdTMwZmNcdTMwYjkKK2hvc3QuYXV0b0RlcGxveT1cdTgxZWFcdTUyZDVcdTkxNGRcdTUwOTkKK2hvc3QuZGVwbG95WE1MPVx1OTE0ZFx1NTA5OVhNTAoraG9zdC5kZXBsb3lPblN0YXJ0dXA9XHU4ZDc3XHU1MmQ1XHU2NjQyXHUzMDZlXHU5MTRkXHU1MDk5Citob3N0LndhcnM9V0FSXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMDkyXHU1YzU1XHU5NThiXHUzMDU5XHUzMDhiCitob3N0LmFsaWFzZXM9XHUzMGE4XHUzMGE0XHUzMGVhXHUzMGEyXHUzMGI5Citob3N0LmFsaWFzLm5hbWU9XHUzMGE4XHUzMGE0XHUzMGVhXHUzMGEyXHUzMGI5XHU1NDBkCitob3N0LnhtbE5hbWVzcGFjZUF3YXJlPVhNTFx1NTQwZFx1NTI0ZFx1N2E3YVx1OTU5M1x1NWJmZVx1NWZkYworaG9zdC54bWxWYWxpZGF0aW9uPVhNTFx1NjkxY1x1OGEzYworZXJyb3IuYWxpYXNOYW1lLmV4aXN0cz08bGk+XHU1NDBjXHU1NDBkXHUzMDZlXHUzMGE4XHUzMGE0XHUzMGVhXHUzMGEyXHUzMGI5XHUzMDRjXHU2NWUyXHUzMDZiXHU1YjU4XHU1NzI4XHUzMDU3XHUzMDdlXHUzMDU5PC9saT4KK2Vycm9yLmFsaWFzTmFtZS5yZXF1aXJlZD08bGk+XHUzMGE4XHUzMGE0XHUzMGVhXHUzMGEyXHUzMGI5XHU1NDBkXHUzMDZmXHU3NzAxXHU3NTY1XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzPC9saT4KK2NvbnRleHQucHJvcGVydGllcz1cdTMwYjNcdTMwZjNcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzhcdTMwZDdcdTMwZWRcdTMwZDFcdTMwYzZcdTMwYTMKK2NvbnRleHQuY29va2llcz1cdTMwYWZcdTMwYzNcdTMwYWRcdTMwZmMKK2NvbnRleHQuY3Jvc3MuY29udGV4dD1cdTMwYWZcdTMwZWRcdTMwYjlcdTMwYjNcdTMwZjNcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzgKK2NvbnRleHQuZG9jQmFzZT1cdTMwYzlcdTMwYWRcdTMwZTVcdTMwZTFcdTMwZjNcdTMwYzhcdTMwZDlcdTMwZmNcdTMwYjkKK2NvbnRleHQub3ZlcnJpZGU9XHU0ZTBhXHU2NmY4XHUzMDRkCitjb250ZXh0LnBhdGg9XHUzMGQxXHUzMGI5Citjb250ZXh0LnJlbG9hZGFibGU9XHU1MThkXHUzMGVkXHUzMGZjXHUzMGM5XHU1M2VmXHU4MGZkCitjb250ZXh0LnN3YWxsb3dPdXRwdXQ9XHU2YTE5XHU2ZTk2XHU1MWZhXHU1MjliXHUzMGZiXHU2YTE5XHU2ZTk2XHUzMGE4XHUzMGU5XHUzMGZjXHU1MWZhXHU1MjliXHUzMDkyXHUzMGVkXHUzMGIwXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMDZiXHU1MWZhXHU1MjliCitjb250ZXh0LnVzZW5hbWluZz1cdTMwY2RcdTMwZmNcdTMwZTBcdTMwYjVcdTMwZmNcdTMwZDNcdTMwYjlcdTMwNmVcdTUyMjlcdTc1MjgKK2NvbnRleHQud29ya2Rpcj1cdTMwZWZcdTMwZmNcdTMwYWRcdTMwZjNcdTMwYjBcdTMwYzdcdTMwYTNcdTMwZWNcdTMwYWZcdTMwYzhcdTMwZWEKK2NvbnRleHQubG9hZGVyLnByb3BlcnRpZXM9XHUzMGVkXHUzMGZjXHUzMGMwXHUzMGQ3XHUzMGVkXHUzMGQxXHUzMGM2XHUzMGEzCitjb250ZXh0LnNlc3Npb25tZ3IucHJvcGVydGllcz1cdTMwYmJcdTMwYzNcdTMwYjdcdTMwZTdcdTMwZjNcdTMwZGVcdTMwY2RcdTMwZmNcdTMwYjhcdTMwZTNcdTMwZDdcdTMwZWRcdTMwZDFcdTMwYzZcdTMwYTMKK2NvbnRleHQuY2hlY2tJbnRlcnZhbD1cdTMwYzFcdTMwYTdcdTMwYzNcdTMwYWZcdTk1OTNcdTk2OTQKK2NvbnRleHQuc2Vzc2lvbklkPVx1MzBiYlx1MzBjM1x1MzBiN1x1MzBlN1x1MzBmM0lEXHUzMGE0XHUzMGNiXHUzMGI3XHUzMGUzXHUzMGU5XHUzMGE0XHUzMGI2Citjb250ZXh0Lm1heC5zZXNzaW9ucz1cdTY3MDBcdTU5MjdcdTY3MDlcdTUyYjlcdTMwYmJcdTMwYzNcdTMwYjdcdTMwZTdcdTMwZjNcdTY1NzAKK2RlZmF1bHRjb250ZXh0LnByb3BlcnRpZXM9XHUzMGM3XHUzMGQ1XHUzMGE5XHUzMGViXHUzMGM4XHUzMGIzXHUzMGYzXHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4XHUzMGQ3XHUzMGVkXHUzMGQxXHUzMGM2XHUzMGEzCitlcnJvci5jb250ZXh0LmRpcmVjdG9yeT1cdTMwYzlcdTMwYWRcdTMwZTVcdTMwZTFcdTMwZjNcdTMwYzhcdTMwZDlcdTMwZmNcdTMwYjlcdTMwNGNcdTViNThcdTU3MjhcdTMwNTdcdTMwNmFcdTMwNDRcdWZmMGNcdTUzYzhcdTMwNmZcdThhYWRcdTMwODFcdTMwNmFcdTMwNDRcdTMwYzdcdTMwYTNcdTMwZWNcdTMwYWZcdTMwYzhcdTMwZWFcdTMwNjdcdTMwNTkKK2Vycm9yLmRvY0Jhc2UucmVxdWlyZWQ9PGxpPlx1MzBjOVx1MzBhZFx1MzBlNVx1MzBlMVx1MzBmM1x1MzBjOFx1MzBkOVx1MzBmY1x1MzBiOVx1MzA2Zm51bGxcdTMwNmJcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTM8L2xpPgorZXJyb3IucGF0aC5yZXF1aXJlZD08bGk+XHUzMGQxXHUzMGI5XHUzMDZmbnVsbFx1MzA2Ylx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5MzwvbGk+CitlcnJvci53b3JrRGlyLnJlcXVpcmVkPTxsaT5cdTMwZWZcdTMwZmNcdTMwYWRcdTMwZjNcdTMwYjBcdTMwYzdcdTMwYTNcdTMwZWNcdTMwYWZcdTMwYzhcdTMwZWFcdTMwNmZudWxsXHUzMDZiXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzPC9saT4KK2Vycm9yLmxkckNoZWNrSW50ZXJ2YWwucmVxdWlyZWQ9PGxpPlx1MzBlZFx1MzBmY1x1MzBjMFx1MzBjMVx1MzBhN1x1MzBjM1x1MzBhZlx1OTU5M1x1OTY5NFx1MzA0Y1x1NjMwN1x1NWI5YVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5MzwvbGk+CitlcnJvci5sZHJDaGVja0ludGVydmFsLmZvcm1hdD08bGk+XHUzMGVkXHUzMGZjXHUzMGMwXHUzMGMxXHUzMGE3XHUzMGMzXHUzMGFmXHU5NTkzXHU5Njk0XHUzMDRjXHU1OWE1XHU1ZjUzXHUzMDZhXHU2NTc0XHU2NTcwXHUzMDY3XHUzMDZmXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDViXHUzMDkzPC9saT4KK2Vycm9yLmxkckNoZWNrSW50ZXJ2YWwucmFuZ2U9PGxpPlx1MzBlZFx1MzBmY1x1MzBjMFx1MzBjMVx1MzBhN1x1MzBjM1x1MzBhZlx1OTU5M1x1OTY5NFx1MzA0Y1x1N2JjNFx1NTZmMlx1NTkxNlx1MzA2N1x1MzA1OVx1MzAwMlx1N2JjNFx1NTZmMlx1MzA2ZjEtMTAwMFx1MzA2N1x1MzA1OVx1MzAwMjwvbGk+CitlcnJvci5tZ3JDaGVja0ludGVydmFsLnJlcXVpcmVkPTxsaT5cdTMwZGVcdTMwY2RcdTMwZmNcdTMwYjhcdTMwZTNcdTMwYzFcdTMwYTdcdTMwYzNcdTMwYWZcdTk1OTNcdTk2OTRcdTMwNGNcdTYzMDdcdTViOWFcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNWJcdTMwOTM8L2xpPgorZXJyb3IubWdyQ2hlY2tJbnRlcnZhbC5mb3JtYXQ9PGxpPlx1MzBkZVx1MzBjZFx1MzBmY1x1MzBiOFx1MzBlM1x1MzBjMVx1MzBhN1x1MzBjM1x1MzBhZlx1OTU5M1x1OTY5NFx1MzA0Y1x1NTlhNVx1NWY1M1x1MzA2YVx1NjU3NFx1NjU3MFx1MzA2N1x1MzA2Zlx1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5MzwvbGk+CitlcnJvci5tZ3JDaGVja0ludGVydmFsLnJhbmdlPTxsaT5cdTMwZGVcdTMwY2RcdTMwZmNcdTMwYjhcdTMwZTNcdTMwYzFcdTMwYTdcdTMwYzNcdTMwYWZcdTk1OTNcdTk2OTRcdTMwNGNcdTdiYzRcdTU2ZjJcdTU5MTZcdTMwNjdcdTMwNTlcdTMwMDJcdTdiYzRcdTU2ZjJcdTMwNmYxLTEwMDBcdTMwNjdcdTMwNTlcdTMwMDI8L2xpPgorZXJyb3IubWdyU2Vzc2lvbklESW5pdC5yZXF1aXJlZD08bGk+XHUzMGJiXHUzMGMzXHUzMGI3XHUzMGU3XHUzMGYzXHUzMGRlXHUzMGNkXHUzMGZjXHUzMGI4XHUzMGUzXHU1MjFkXHU2NzFmXHU1MzE2SURcdTMwNGNcdTYzMDdcdTViOWFcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNWJcdTMwOTM8L2xpPgorZXJyb3IubWdyTWF4U2Vzc2lvbnMucmVxdWlyZWQ9PGxpPlx1NjcwMFx1NTkyN1x1MzBiYlx1MzBjM1x1MzBiN1x1MzBlN1x1MzBmM1x1NjU3MFx1MzA0Y1x1NjMwN1x1NWI5YVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5MzwvbGk+CitlcnJvci5tZ3JNYXhTZXNzaW9ucy5mb3JtYXQ9PGxpPlx1NjcwMFx1NTkyN1x1MzBiYlx1MzBjM1x1MzBiN1x1MzBlN1x1MzBmM1x1NjU3MFx1MzA0Y1x1NTlhNVx1NWY1M1x1MzA2YVx1NjU3NFx1NjU3MFx1MzA2N1x1MzA2Zlx1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5MzwvbGk+CitlcnJvci5tZ3JNYXhTZXNzaW9ucy5yYW5nZT08bGk+XHU2NzAwXHU1OTI3XHUzMGJiXHUzMGMzXHUzMGI3XHUzMGU3XHUzMGYzXHU2NTcwXHUzMDRjXHU3YmM0XHU1NmYyXHU1OTE2XHUzMDY3XHUzMDU5XHUzMDAyXHU3YmM0XHU1NmYyXHUzMDZmLTFcdTMwNGJcdTMwODkxMDBcdTMwNjdcdTMwNTlcdTMwMDI8L2xpPgorbGlzdC5ub25lPShOb25lKQorbG9nZ2VyLmRpcmVjdG9yeT1cdTMwYzdcdTMwYTNcdTMwZWNcdTMwYWZcdTMwYzhcdTMwZWEKK2xvZ2dlci5wcmVmaXg9XHUzMGQ3XHUzMGVhXHUzMGQ1XHUzMGEzXHUzMGMzXHUzMGFmXHUzMGI5Citsb2dnZXIuc3VmZml4PVx1MzBiNVx1MzBkNVx1MzBhM1x1MzBjM1x1MzBhZlx1MzBiOQorbG9nZ2VyLnRpbWVzdGFtcD1cdTMwYmZcdTMwYTRcdTMwZTBcdTMwYjlcdTMwYmZcdTMwZjNcdTMwZDcKK2xvZ2dlci5maWxlbG9nZ2VyLnByb3BlcnRpZXM9RmlsZUxvZ2dlclx1NTZmYVx1NjcwOVx1MzA2ZVx1MzBkN1x1MzBlZFx1MzBkMVx1MzBjNlx1MzBhMworbG9nZ2VyLnZlcmJvc2l0eWxldmVsPVx1NTE5N1x1OTU3N1x1MzBlY1x1MzBkOVx1MzBlYgorZXJyb3IubG9nZ2VyTmFtZS5iYWQ9XHU0ZTBkXHU2YjYzXHUzMDZhTG9nZ2VyXHU1NDBkIHswfQorZXJyb3IubG9nZ2VyTmFtZS5leGlzdHM9PGxpPlx1NTQwY1x1NTQwZFx1MzA2ZUxvZ2dlclx1MzA0Y1x1NjVlMlx1MzA2Ylx1NWI1OFx1NTcyOFx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMjwvbGk+CitlcnJvci5kaXJlY3RvcnkucmVxdWlyZWQ9PGxpPlx1MzBjN1x1MzBhM1x1MzBlY1x1MzBhZlx1MzBjOFx1MzBlYVx1MzA0Y1x1NjMwN1x1NWI5YVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMjwvbGk+CitlcnJvci5wcmVmaXgucmVxdWlyZWQ9PGxpPlx1MzBkN1x1MzBlYVx1MzBkNVx1MzBhM1x1MzBjM1x1MzBhZlx1MzBiOVx1MzA0Y1x1NjMwN1x1NWI5YVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMjwvbGk+CitlcnJvci5zdWZmaXgucmVxdWlyZWQ9PGxpPlx1MzBiNVx1MzBkNVx1MzBhM1x1MzBjM1x1MzBhZlx1MzBiOVx1MzA0Y1x1NjMwN1x1NWI5YVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMjwvbGk+CitlcnJvci52YWx2ZU5hbWUuYmFkPVx1NGUwZFx1NmI2M1x1MzA2YVx1MzBkMFx1MzBlYlx1MzBkNlx1NTQwZCB7MH0KK2Vycm9yLnZhdmx2ZU5hbWUuZXhpc3RzPTxsaT5cdTU0MGNcdTU0MGRcdTMwNmVcdTMwZDBcdTMwZWJcdTMwZDZcdTMwNGNcdTY1ZTJcdTMwNmJcdTViNThcdTU3MjhcdTMwNTdcdTMwN2VcdTMwNTk8L2xpPgorZXJyb3Iuc2luZ2xlU2lnbk9uLmV4aXN0cz08bGk+U2luZ2xlU2lnbk9uXHUzMGQwXHUzMGViXHUzMGQ2XHUzMDRjXHU2NWUyXHUzMDZiXHU1YjU4XHU1NzI4XHUzMDU3XHUzMDdlXHUzMDU5PC9saT4KK3VzZXIuZnVsbE5hbWU9XHUzMGQ1XHUzMGViXHUzMGNkXHUzMGZjXHUzMGUwCit1c2VyLmdyb3Vwcz1cdTMwYjBcdTMwZWJcdTMwZmNcdTMwZDdcdTRlMmRcdTMwNmVcdTMwZTFcdTMwZjNcdTMwZDAKK3VzZXIubmV3VXNlcj1cdTY1YjBcdTMwNTdcdTMwNDRcdTMwZTZcdTMwZmNcdTMwYjZcdTMwZDdcdTMwZWRcdTMwZDFcdTMwYzZcdTMwYTNcdTMwNmVcdTRmNWNcdTYyMTAKK3VzZXIub2xkVXNlcj1cdTY1ZTJcdTViNThcdTMwNmVcdTMwZTZcdTMwZmNcdTMwYjZcdTMwZDdcdTMwZWRcdTMwZDFcdTMwYzZcdTMwYTNcdTMwNmVcdTdkZThcdTk2YzYKK3VzZXIucGFzc3dvcmQ9XHUzMGQxXHUzMGI5XHUzMGVmXHUzMGZjXHUzMGM5Cit1c2VyLnByb3BlcnRpZXM9XHUzMGU2XHUzMGZjXHUzMGI2XHUzMGQ3XHUzMGVkXHUzMGQxXHUzMGM2XHUzMGEzCit1c2VyLnJvbGVzPVx1MzBiYlx1MzBhZFx1MzBlNVx1MzBlYVx1MzBjNlx1MzBhM1x1MzBlZFx1MzBmY1x1MzBlYgordXNlci51c2VybmFtZT1cdTMwZTZcdTMwZmNcdTMwYjZcdTU0MGQKK2Vycm9yLnBhc3N3b3JkLnJlcXVpcmVkPTxsaT5cdTMwZDFcdTMwYjlcdTMwZWZcdTMwZmNcdTMwYzlcdTMwNmZcdTc3MDFcdTc1NjVcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTM8L2xpPgorZXJyb3IudXNlcm5hbWUucmVxdWlyZWQ9PGxpPlx1MzBlNlx1MzBmY1x1MzBiNlx1NTQwZFx1MzA2Zlx1NzcwMVx1NzU2NVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5MzwvbGk+CitlcnJvci5nZXQuYXR0cmlidXRlcz1cdTMwZDdcdTMwZWRcdTMwZDFcdTMwYzZcdTMwYTNcdTMwNmVcdTU2ZGVcdTVmYTlcdTY2NDJcdTMwNmJcdTMwYThcdTMwZTlcdTMwZmNcdTMwNGNcdTc2N2FcdTc1MWZcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWZcdTMwMDIKK2Vycm9yLnNldC5hdHRyaWJ1dGVzPVx1MzBkN1x1MzBlZFx1MzBkMVx1MzBjNlx1MzBhM1x1MzA2ZVx1OGEyZFx1NWI5YVx1NjY0Mlx1MzA2Ylx1MzBhOFx1MzBlOVx1MzBmY1x1MzA0Y1x1NzY3YVx1NzUxZlx1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1Zlx1MzAwMgorYWN0aW9ucy5kZWxldGU9XHU1MjRhXHU5NjY0CitlcnJvci5kZWZhdWx0SG9zdC5yZXF1aXJlZD08bGk+XHUzMGM3XHUzMGQ1XHUzMGE5XHUzMGViXHUzMGM4XHUzMGRiXHUzMGI5XHUzMGM4XHU1NDBkXHUzMDRjXHU1ZmM1XHU4OTgxXHUzMDY3XHUzMDU5PC9saT4KK2Vycm9yLmVuZ2luZU5hbWUuYmFkPVx1MzBhOFx1MzBmM1x1MzBiOFx1MzBmM1x1NTQwZCB7MH0gXHUzMDRjXHU0ZTBkXHU2YjYzXHUzMDY3XHUzMDU5CitlcnJvci5lbmdpbmVOYW1lLmV4aXN0cz08bGk+XHUzMGE4XHUzMGYzXHUzMGI4XHUzMGYzXHU1NDBkXHUzMDRjXHU2NWUyXHUzMDZiXHU1YjU4XHU1NzI4XHUzMDU3XHUzMDdlXHUzMDU5PC9saT4KK2Vycm9yLnNlcnZpY2VOYW1lLmJhZD1cdTMwYjVcdTMwZmNcdTMwZDNcdTMwYjlcdTU0MGQgezB9IFx1MzA0Y1x1NGUwZFx1NmI2M1x1MzA2N1x1MzA1OQorZXJyb3Iuc2VydmljZU5hbWUucmVxdWlyZWQ9PGxpPlx1MzBiNVx1MzBmY1x1MzBkM1x1MzBiOVx1NTQwZFx1MzA0Y1x1NWZjNVx1ODk4MVx1MzA2N1x1MzA1OTwvbGk+CitlcnJvci5zZXJ2aWNlTmFtZS5leGlzdHM9PGxpPlx1NTQwY1x1NTQwZFx1MzA2ZVx1MzBiNVx1MzBmY1x1MzBkM1x1MzBiOVx1NTQwZFx1MzA0Y1x1NjVlMlx1MzA2Ylx1NWI1OFx1NTcyOFx1MzA1N1x1MzA3ZVx1MzA1OTwvbGk+CitlcnJvci5qZGJjcmVhbG09SkRCQ1JlYWxtXHUzMDZlXHU4YTJkXHU1YjlhXHU0ZTJkXHUzMDZiXHUzMGE4XHUzMGU5XHUzMGZjXHUzMDRjXHU3NjdhXHU3NTFmXHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmXHUzMDAyCitlcnJvci5qbmRpcmVhbG09Sk5ESVJlYWxtXHUzMDZlXHU4YTJkXHU1YjlhXHU0ZTJkXHUzMDZiXHUzMGE4XHUzMGU5XHUzMGZjXHUzMDRjXHU3NjdhXHU3NTFmXHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmXHUzMDAyCitlcnJvci51c2VyZGJyZWFsbT1Vc2VyZGF0YWJhc2VSZWFsbVx1MzA2ZVx1OGEyZFx1NWI5YVx1NGUyZFx1MzA2Ylx1MzBhOFx1MzBlOVx1MzBmY1x1MzA0Y1x1NzY3YVx1NzUxZlx1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1Zlx1MzAwMgorZXJyb3IucmVhbG1OYW1lLmJhZD1cdTMwZWNcdTMwZWJcdTMwZTBcdTU0MGQgezB9IFx1MzA0Y1x1NGUwZFx1NmI2M1x1MzA2N1x1MzA1OQorZXJyb3IucmVhbG1OYW1lLnJlcXVpcmVkPTxsaT5cdTMwZWNcdTMwZWJcdTMwZTBcdTU0MGRcdTMwNGNcdTVmYzVcdTg5ODFcdTMwNjdcdTMwNTlcdTMwMDI8L2xpPgorZXJyb3IucmVhbG1OYW1lLmV4aXN0cz08bGk+XHU1NDBjXHU1NDBkXHUzMDZlXHUzMGVjXHUzMGViXHUzMGUwXHUzMDRjXHU2NWUyXHUzMDZiXHU1YjU4XHU1NzI4XHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyPC9saT4KK2Vycm9yLmNvbnRleHROYW1lLmJhZD1cdTMwYjNcdTMwZjNcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzhcdTU0MGQgezB9IFx1MzA0Y1x1NGUwZFx1NmI2M1x1MzA2N1x1MzA1OQorZXJyb3IuY29udGV4dE5hbWUuZXhpc3RzPTxsaT5cdTU0MGNcdTU0MGRcdTMwNmVcdTMwYjNcdTMwZjNcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzhcdTMwNGNcdTY1ZTJcdTMwNmJcdTViNThcdTU3MjhcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDI8L2xpPgorZXJyb3IuZGVmYXVsdGNvbnRleHROYW1lLmV4aXN0cz08bGk+XHU1NDBjXHU1NDBkXHUzMDZlXHUzMGM3XHUzMGQ1XHUzMGE5XHUzMGViXHUzMGM4XHUzMGIzXHUzMGYzXHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4XHUzMDRjXHU2NWUyXHUzMDZiXHU1YjU4XHU1NzI4XHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyPC9saT4KK2Vycm9yLnBhdGgucHJlZml4PTxsaT5cdTMwZDFcdTMwYjlcdTMwNmYnLydcdTMwNjdcdTU5Y2JcdTMwN2VcdTMwODlcdTMwNmFcdTMwNTFcdTMwOGNcdTMwNzBcdTMwNmFcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDI8L2xpPgorZXJyb3IubG9hZGVyTmFtZS5iYWQ9XHUzMGVkXHUzMGZjXHUzMGMwXHU1NDBkIHswfSBcdTMwNGNcdTRlMGRcdTZiNjNcdTMwNjdcdTMwNTkKK2Vycm9yLm1hbmFnZXJOYW1lLmJhZD1cdTMwZGVcdTMwY2RcdTMwZmNcdTMwYjhcdTMwZTNcdTU0MGQgezB9IFx1MzA0Y1x1NGUwZFx1NmI2M1x1MzA2N1x1MzA1OQorZXJyb3IuY29ubmVjdG9yTmFtZS5iYWQ9XHUzMGIzXHUzMGNkXHUzMGFmXHUzMGJmXHU1NDBkIHswfSBcdTMwNGNcdTRlMGRcdTZiNjNcdTMwNjdcdTMwNTkKK2Vycm9yLmNvbm5lY3Rvck5hbWUuZXhpc3RzPTxsaT5cdTU0MGNcdTU0MGRcdTMwNmVcdTMwYjNcdTMwY2RcdTMwYWZcdTMwYmZcdTMwNGNcdTY1ZTJcdTMwNmJcdTViNThcdTU3MjhcdTMwNTdcdTMwN2VcdTMwNTk8L2xpPgorZXJyb3IucGF0dGVybi5yZXF1aXJlZD08bGk+XHUzMGQxXHUzMGJmXHUzMGZjXHUzMGYzXHUzMDZmXHU3NzAxXHU3NTY1XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzPC9saT4KK2Vycm9yLnZhbHZlTmFtZS5iYWQ9XHU0ZTBkXHU2YjYzXHUzMDZhXHUzMGQwXHUzMGViXHUzMGQ2XHU1NDBkIHswfQorZXJyb3IudmFsdmVOYW1lLmV4aXN0cz08bGk+XHU1NDBjXHU1NDBkXHUzMDZlXHUzMGQwXHUzMGViXHUzMGQ2XHUzMDRjXHU2NWUyXHUzMDZiXHU1YjU4XHU1NzI4XHUzMDU3XHUzMDdlXHUzMDU5PC9saT4KK3JlYWxtLmRyaXZlcj1cdTMwYzdcdTMwZmNcdTMwYmZcdTMwZDlcdTMwZmNcdTMwYjlcdTMwYzlcdTMwZTlcdTMwYTRcdTMwZDAKK3JlYWxtLnBhc3N3ZD1cdTMwYzdcdTMwZmNcdTMwYmZcdTMwZDlcdTMwZmNcdTMwYjlcdTMwZDFcdTMwYjlcdTMwZWZcdTMwZmNcdTMwYzkKK3JlYWxtLnVybD1cdTMwYzdcdTMwZmNcdTMwYmZcdTMwZDlcdTMwZmNcdTMwYjlVUkwKK3JlYWxtLnVzZXJOYW1lPVx1MzBjN1x1MzBmY1x1MzBiZlx1MzBkOVx1MzBmY1x1MzBiOVx1MzBlNlx1MzBmY1x1MzBiNlx1NTQwZAorcmVhbG0uZGlnZXN0PVx1MzBjMFx1MzBhNFx1MzBiOFx1MzBhN1x1MzBiOVx1MzBjOFx1MzBhMlx1MzBlYlx1MzBiNFx1MzBlYVx1MzBiYVx1MzBlMAorcmVhbG0ucGFzc3dvcmRDb2w9XHUzMGQxXHUzMGI5XHUzMGVmXHUzMGZjXHUzMGM5XHUzMGFiXHUzMGU5XHUzMGUwCityZWFsbS5yb2xlTmFtZUNvbD1cdTMwZWRcdTMwZmNcdTMwZWJcdTU0MGRcdTMwYWJcdTMwZTlcdTMwZTAKK3JlYWxtLnVzZXJOYW1lQ29sPVx1MzBlNlx1MzBmY1x1MzBiNlx1NTQwZFx1MzBhYlx1MzBlOVx1MzBlMAorcmVhbG0udXNlclJvbGVUYWJsZT1cdTMwZTZcdTMwZmNcdTMwYjZcdTMwZWRcdTMwZmNcdTMwZWJcdTMwYzZcdTMwZmNcdTMwZDZcdTMwZWIKK3JlYWxtLnVzZXJUYWJsZT1cdTMwZTZcdTMwZmNcdTMwYjZcdTMwYzZcdTMwZmNcdTMwZDZcdTMwZWIKK3JlYWxtLnJlc291cmNlPVx1MzBlYVx1MzBiZFx1MzBmY1x1MzBiOVx1NTQwZAorcmVhbG0ucGF0aE5hbWU9XHUzMGQxXHUzMGI5XHU1NDBkCityZWFsbS5jb25uTmFtZT1cdTYzYTVcdTdkOWFcdTU0MGQKK3JlYWxtLmNvbm5QYXNzd29yZD1cdTYzYTVcdTdkOWFcdTMwZDFcdTMwYjlcdTMwZWZcdTMwZmNcdTMwYzkKK3JlYWxtLmNvbm5VUkw9XHU2M2E1XHU3ZDlhVVJMCityZWFsbS5jb25uRmFjdG9yeT1cdTMwYjNcdTMwZjNcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzhcdTMwZDVcdTMwYTFcdTMwYWZcdTMwYzhcdTMwZWEKK3JlYWxtLnJvbGVCYXNlPVx1MzBlZFx1MzBmY1x1MzBlYlx1NTdmYVx1NjcyY1x1ODk4MVx1N2QyMAorcmVhbG0ucm9sZU5hbWU9XHUzMGVkXHUzMGZjXHUzMGViXHU1NDBkCityZWFsbS51c2VyLnJvbGVOYW1lPVx1MzBlNlx1MzBmY1x1MzBiNlx1MzBlZFx1MzBmY1x1MzBlYlx1NTQwZAorcmVhbG0ucGF0dGVybj1cdTMwZWRcdTMwZmNcdTMwZWJcdTY5MWNcdTdkMjJcdTMwZDFcdTMwYmZcdTMwZmNcdTMwZjMKK3JlYWxtLnJvbGUuc3VidHJlZT1cdTMwZWRcdTMwZmNcdTMwZWJcdTMwNmVcdTMwYjVcdTMwZDZcdTMwYzRcdTMwZWFcdTMwZmNcdTMwNmVcdTY5MWNcdTdkMjIKK3JlYWxtLnVzZXJCYXNlPVx1MzBlNlx1MzBmY1x1MzBiNlx1NTdmYVx1NjcyY1x1ODk4MVx1N2QyMAorcmVhbG0udXNlci5zdWJ0cmVlPVx1MzBlNlx1MzBmY1x1MzBiNlx1MzA2ZVx1MzBiNVx1MzBkNlx1MzBjNFx1MzBlYVx1MzBmY1x1MzA2ZVx1NjkxY1x1N2QyMgorcmVhbG0udXNlclBhc3N3b3JkPVx1MzBlNlx1MzBmY1x1MzBiNlx1MzBkMVx1MzBiOVx1MzBlZlx1MzBmY1x1MzBjOQorcmVhbG0udXNlclBhdHRlcm49XHUzMGU2XHUzMGZjXHUzMGI2XHUzMGQxXHUzMGJmXHUzMGZjXHUzMGYzCityZWFsbS51c2VyU2VhcmNoPVx1MzBlNlx1MzBmY1x1MzBiNlx1NjkxY1x1N2QyMgorcmVhbG0uZGF0YVNvdXJjZU5hbWU9XHUzMGM3XHUzMGZjXHUzMGJmXHUzMGJkXHUzMGZjXHUzMGI5XHU1NDBkCityZWFsbS5sb2NhbERhdGFTb3VyY2U9XHUzMGVkXHUzMGZjXHUzMGFiXHUzMGViXHUzMGM3XHUzMGZjXHUzMGJmXHUzMGJkXHUzMGZjXHUzMGI5CityZWFsbS51c2VyQ3JlZENvbD09XHUzMGU2XHUzMGZjXHUzMGI2XHUzMGFmXHUzMGVjXHUzMGM3XHUzMGYzXHUzMGI3XHUzMGUzXHUzMGViXHUzMGIzXHUzMGU5XHUzMGUwCit2YWx2ZS5hY2Nlc3MucHJvcGVydGllcz1cdTMwYTJcdTMwYWZcdTMwYmJcdTMwYjlMb2dnZXJcdTMwZDdcdTMwZWRcdTMwZDFcdTMwYzZcdTMwYTMKK3ZhbHZlLnJlcXVlc3QucHJvcGVydGllcz1cdTMwZWFcdTMwYWZcdTMwYThcdTMwYjlcdTMwYzhcdTMwZDVcdTMwYTNcdTMwZWJcdTMwYmZcdTMwZDdcdTMwZWRcdTMwZDFcdTMwYzZcdTMwYTMKK3ZhbHZlLnNpbmdsZS5wcm9wZXJ0aWVzPVx1MzBiN1x1MzBmM1x1MzBiMFx1MzBlYlx1MzBiNVx1MzBhNFx1MzBmM1x1MzBhYVx1MzBmM1x1MzBkMFx1MzBlYlx1MzBkNlx1MzBkN1x1MzBlZFx1MzBkMVx1MzBjNlx1MzBhMwordmFsdmUucmVtb3RlaG9zdC5wcm9wZXJ0aWVzPVx1MzBlYVx1MzBlMlx1MzBmY1x1MzBjOFx1MzBkYlx1MzBiOVx1MzBjOFx1MzBkMFx1MzBlYlx1MzBkNlx1MzBkN1x1MzBlZFx1MzBkMVx1MzBjNlx1MzBhMwordmFsdmUucmVtb3RlYWRkcmVzcy5wcm9wZXJ0aWVzPVx1MzBlYVx1MzBlMlx1MzBmY1x1MzBjOFx1MzBhMlx1MzBjOVx1MzBlY1x1MzBiOVx1MzBkMFx1MzBlYlx1MzBkNlx1MzBkN1x1MzBlZFx1MzBkMVx1MzBjNlx1MzBhMwordmFsdmUucmVzb2x2ZUhvc3RzPVx1MzBkYlx1MzBiOVx1MzBjOFx1NTQwZFx1MzA2ZVx1ODllM1x1NmM3YQordmFsdmUucm90YXRhYmxlPVx1MzBlZFx1MzBmY1x1MzBjNlx1MzBmY1x1MzBjOFx1NTNlZlx1ODBmZAordmFsdmUucGF0dGVybj1cdTMwZDFcdTMwYmZcdTMwZmNcdTMwZjMKK3ZhbHZlLmFsbG93SG9zdHM9XHU4YTMxXHU1M2VmXHUzMDU5XHUzMDhiXHUzMGRiXHUzMGI5XHUzMGM4Cit2YWx2ZS5kZW55SG9zdHM9XHU2MmQyXHU1NDI2XHUzMDU5XHUzMDhiXHUzMGRiXHUzMGI5XHUzMGM4Cit2YWx2ZS5hbGxvd0lQcz1cdThhMzFcdTUzZWZcdTMwNTlcdTMwOGJJUFx1MzBhMlx1MzBjOVx1MzBlY1x1MzBiOQordmFsdmUuZGVueUlQcz1cdTYyZDJcdTU0MjZcdTMwNTlcdTMwOGJJUFx1MzBhMlx1MzBjOVx1MzBlY1x1MzBiOQorZXJyb3IuYWxsb3dIb3N0PTxsaT5hbGxvd1x1MzA0Y1x1NzEyMVx1NTJiOVx1MzA2N1x1MzA1OVx1MzAwMlx1N2JhMVx1NzQwNlx1ODAwNVx1MzA2ZVx1MzBkYlx1MzBiOVx1MzBjOFx1NTQwZFx1MzA5Mlx1NTQyYlx1MzA4MVx1MzA4Ylx1NWZjNVx1ODk4MVx1MzA0Y1x1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1OVx1MzAwMjwvbGk+K2Vycm9yLmRlbnlIb3N0PTxsaT5kZW55XHUzMDRjXHU3MTIxXHU1MmI5XHUzMDY3XHUzMDU5XHUzMDAyXHU3YmExXHU3NDA2XHU4MDA1XHUzMDZlXHUzMGRiXHUzMGI5XHUzMGM4XHU1NDBkXHUzMDkyXHU5NjY0XHUzMDRmXHU1ZmM1XHU4OTgxXHUzMDRjXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDU5XHUzMDAyPC9saT4KK2Vycm9yLmFsbG93SVA9PGxpPmFsbG93XHUzMDRjXHU3MTIxXHU1MmI5XHUzMDY3XHUzMDU5XHUzMDAyXHU3YmExXHU3NDA2XHU4MDA1XHUzMDZlSVBcdTMwYTJcdTMwYzlcdTMwZWNcdTMwYjlcdTMwOTJcdTU0MmJcdTMwODFcdTMwOGJcdTVmYzVcdTg5ODFcdTMwNGNcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNTlcdTMwMDI8L2xpPgorZXJyb3IuZGVueUlQPTxsaT5kZW55XHUzMDRjXHU3MTIxXHU1MmI5XHUzMDY3XHUzMDU5XHUzMDAyXHU3YmExXHU3NDA2XHU4MDA1XHUzMDZlSVBcdTMwYTJcdTMwYzlcdTMwZWNcdTMwYjlcdTMwOTJcdTk2NjRcdTMwNGZcdTVmYzVcdTg5ODFcdTMwNGNcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNTlcdTMwMDI8L2xpPgorZXJyb3IuYWxsb3cuZGVueS5yZXF1aXJlZD08bGk+YWxsb3dcdTUzYzhcdTMwNmZkZW55XHUzMDRjXHU1ZmM1XHU4OTgxXHUzMDY3XHUzMDU5XHUzMDAyPC9saT4KK2Vycm9yLnN5bnRheD08bGk+XHUzMGVhXHUzMGFmXHUzMGE4XHUzMGI5XHUzMGM4XHUzMGQ1XHUzMGEzXHUzMGViXHUzMGJmXHUzMGQxXHUzMGJmXHUzMGZjXHUzMGYzXHUzMDZlXHU0ZTJkXHUzMDY3XHU2OWNiXHU2NTg3XHUzMGE4XHUzMGU5XHUzMGZjXHUzMDY3XHUzMDU5XHUzMDAyPC9saT4KK2Vycm9yLnJlc291cmNlLnJlcXVpcmVkPTxsaT5cdTMwZWFcdTMwYmRcdTMwZmNcdTMwYjlcdTU0MGRcdTMwNmZcdTc3MDFcdTc1NjVcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDI8L2xpPgorZXJyb3IucmVzb3VyY2UuamF2YXByZWZpeD08bGk+XHUzMGVhXHUzMGJkXHUzMGZjXHUzMGI5XHUzMDZiXHUzMDZmImphdmE6Ilx1MzA2ZVx1MzBkN1x1MzBlYVx1MzBkNVx1MzBhM1x1MzBhZlx1MzBiOVx1MzA0Y1x1NWZjNVx1ODk4MVx1MzA2N1x1MzA1OVx1MzAwMjwvbGk+CitlcnJvci5wYXRoTmFtZS5yZXF1aXJlZD08bGk+XHUzMGQxXHUzMGI5XHU1NDBkXHUzMDZmXHU3NzAxXHU3NTY1XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyPC9saT4KK2Vycm9yLmRyaXZlci5yZXF1aXJlZD08bGk+XHUzMGM3XHUzMGZjXHUzMGJmXHUzMGQ5XHUzMGZjXHUzMGI5XHUzMGM5XHUzMGU5XHUzMGE0XHUzMGQwXHUzMDZmXHU3NzAxXHU3NTY1XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyPC9saT4KK2Vycm9yLnJvbGVOYW1lQ29sLnJlcXVpcmVkPTxsaT5cdTMwZWRcdTMwZmNcdTMwZWJcdTU0MGRcdTMwYWJcdTMwZTlcdTMwZTBcdTMwNmZcdTc3MDFcdTc1NjVcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDI8L2xpPgorZXJyb3IudXNlck5hbWVDb2wucmVxdWlyZWQ9PGxpPlx1MzBlNlx1MzBmY1x1MzBiNlx1NTQwZFx1MzBhYlx1MzBlOVx1MzBlMFx1MzA2Zlx1NzcwMVx1NzU2NVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMjwvbGk+CitlcnJvci5wYXNzd29yZENvbC5yZXF1aXJlZD08bGk+XHUzMGQxXHUzMGI5XHUzMGVmXHUzMGZjXHUzMGM5XHUzMGFiXHUzMGU5XHUzMGUwXHUzMDZmXHU3NzAxXHU3NTY1XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyPC9saT4KK2Vycm9yLnVzZXJUYWJsZS5yZXF1aXJlZD08bGk+XHUzMGU2XHUzMGZjXHUzMGI2XHUzMGM2XHUzMGZjXHUzMGQ2XHUzMGViXHUzMDZmXHU3NzAxXHU3NTY1XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyPC9saT4KK2Vycm9yLnJvbGVUYWJsZS5yZXF1aXJlZD08bGk+XHUzMGU2XHUzMGZjXHUzMGI2XHUzMGVkXHUzMGZjXHUzMGViXHUzMGM2XHUzMGZjXHUzMGQ2XHUzMGViXHUzMDZmXHU3NzAxXHU3NTY1XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyPC9saT4KK2Vycm9yLmNvbm5lY3Rpb25QYXNzd29yZC5yZXF1aXJlZD08bGk+XHUzMGM3XHUzMGZjXHUzMGJmXHUzMGQ5XHUzMGZjXHUzMGI5XHUzMGQxXHUzMGI5XHUzMGVmXHUzMGZjXHUzMGM5XHUzMDZmXHU3NzAxXHU3NTY1XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyPC9saT4KK2Vycm9yLmNvbm5lY3Rpb25VUkwucmVxdWlyZWQ9PGxpPlx1MzBjN1x1MzBmY1x1MzBiZlx1MzBkOVx1MzBmY1x1MzBiOVVSTFx1MzA2Zlx1NzcwMVx1NzU2NVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMjwvbGk+CitlcnJvci5jb25uZWN0aW9uTmFtZS5yZXF1aXJlZD08bGk+XHUzMGM3XHUzMGZjXHUzMGJmXHUzMGQ5XHUzMGZjXHUzMGI5XHUzMGU2XHUzMGZjXHUzMGI2XHU1NDBkXHUzMDZmXHU3NzAxXHU3NTY1XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyPC9saT4KK2Vycm9yLnJvbGVOYW1lLnJlcXVpcmVkPTxsaT5cdTMwZWRcdTMwZmNcdTMwZWJcdTU0MGRcdTMwNmZcdTc3MDFcdTc1NjVcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDI8L2xpPgorZXJyb3IudXNlclJvbGVOYW1lLnJlcXVpcmVkPTxsaT5cdTMwZTZcdTMwZmNcdTMwYjZcdTMwZWRcdTMwZmNcdTMwZWJcdTU0MGRcdTMwNmZcdTc3MDFcdTc1NjVcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDI8L2xpPgorZXJyb3IuZGlnZXN0LnJlcXVpcmVkPTxsaT5cdTMwYzBcdTMwYTRcdTMwYjhcdTMwYTdcdTMwYjlcdTMwYzhcdTMwYTJcdTMwZWJcdTMwYjRcdTMwZWFcdTMwYmFcdTMwZTBcdTMwNmZcdTc3MDFcdTc1NjVcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDI8L2xpPgorZXJyb3Iucm9sZUJhc2UucmVxdWlyZWQ9PGxpPlx1MzBlZFx1MzBmY1x1MzBlYlx1NTdmYVx1NjcyY1x1ODk4MVx1N2QyMFx1MzA2Zlx1NzcwMVx1NzU2NVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMjwvbGk+CitlcnJvci5yb2xlUGF0dGVybi5yZXF1aXJlZD08bGk+XHUzMGVkXHUzMGZjXHUzMGViXHU2OTFjXHU3ZDIyXHUzMGQxXHUzMGJmXHUzMGZjXHUzMGYzXHUzMDZmXHU3NzAxXHU3NTY1XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyPC9saT4KK2Vycm9yLnVzZXJCYXNlLnJlcXVpcmVkPTxsaT5cdTMwZTZcdTMwZmNcdTMwYjZcdTU3ZmFcdTY3MmNcdTg5ODFcdTdkMjBcdTMwNmZcdTc3MDFcdTc1NjVcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDI8L2xpPgorZXJyb3IudXNlclBhc3N3b3JkLnJlcXVpcmVkPTxsaT5cdTMwZTZcdTMwZmNcdTMwYjZcdTMwZDFcdTMwYjlcdTMwZWZcdTMwZmNcdTMwYzlcdTMwNmZcdTc3MDFcdTc1NjVcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDI8L2xpPgorZXJyb3IudXNlclBhdHRlcm4ucmVxdWlyZWQ9PGxpPlx1MzBlNlx1MzBmY1x1MzBiNlx1MzBkMVx1MzBiZlx1MzBmY1x1MzBmM1x1MzA2Zlx1NzcwMVx1NzU2NVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMjwvbGk+CitlcnJvci51c2VyU2VhcmNoLnJlcXVpcmVkPTxsaT5cdTMwZTZcdTMwZmNcdTMwYjZcdTY5MWNcdTdkMjJcdTMwNmZcdTc3MDFcdTc1NjVcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDI8L2xpPgorZXJyb3IudXNlclBhdHRlcm4udXNlclNlYXJjaC5kZWZpbmVkPTxsaT5cdTMwZTZcdTMwZmNcdTMwYjZcdTMwZDFcdTMwYmZcdTMwZmNcdTMwZjNcdTMwN2VcdTMwNWZcdTMwNmZcdTMwZTZcdTMwZmNcdTMwYjZcdTY5MWNcdTdkMjJcdTMwNmVcdTMwNDRcdTMwNWFcdTMwOGNcdTMwNGJcdTRlMDBcdTY1YjlcdTMwNmVcdTMwN2ZcdTMwOTJcdTYzMDdcdTViOWFcdTMwNTdcdTMwN2VcdTMwNTkuIFx1NGUyMVx1NjViOVx1NjMwN1x1NWI5YVx1MzA1OVx1MzA4Ylx1MzA1M1x1MzA2OFx1MzA2Zlx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMjwvbGk+CitlcnJvci5jb250ZXh0RmFjdG9yeS5yZXF1aXJlZD08bGk+XHUzMGIzXHUzMGYzXHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4XHUzMGQ1XHUzMGExXHUzMGFmXHUzMGM4XHUzMGVhXHUzMDZmXHU3NzAxXHU3NTY1XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyPC9saT4KK2Vycm9yLmNvbm5QYXNzd29yZC5yZXF1aXJlZD08bGk+XHU2M2E1XHU3ZDlhXHUzMGQxXHUzMGI5XHUzMGVmXHUzMGZjXHUzMGM5XHUzMDZmXHU3NzAxXHU3NTY1XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyPC9saT4KK2Vycm9yLmNvbm5VUkwucmVxdWlyZWQ9PGxpPlx1NjNhNVx1N2Q5YVVSTFx1MzA2Zlx1NzcwMVx1NzU2NVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMjwvbGk+CitlcnJvci5jb25uTmFtZS5yZXF1aXJlZD08bGk+XHU2M2E1XHU3ZDlhXHU1NDBkXHUzMDZmXHU3NzAxXHU3NTY1XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyPC9saT4KK2Vycm9yLmRhdGFTb3VyY2VOYW1lLnJlcXVpcmVkPTxsaT5cdTMwYzdcdTMwZmNcdTMwYmZcdTMwYmRcdTMwZmNcdTMwYjlcdTU0MGRcdTMwNGNcdTVmYzVcdTg5ODFcdTMwNjdcdTMwNTlcdTMwMDI8L2xpPgorZXJyb3IudXNlckNyZWRDb2wucmVxdWlyZWQ9PGxpPlx1MzBlNlx1MzBmY1x1MzBiNlx1MzBhZlx1MzBlY1x1MzBjN1x1MzBmM1x1MzBiN1x1MzBlM1x1MzBlYlx1MzA0Y1x1NWZjNVx1ODk4MVx1MzA2N1x1MzA1OVx1MzAwMjwvbGk+CitlcnJvci51c2VyUm9sZVRhYmxlLnJlcXVpcmVkPTxsaT5cdTMwZTZcdTMwZmNcdTMwYjZcdTMwNmVcdTMwZWRcdTMwZmNcdTMwZWJcdTMwYzZcdTMwZmNcdTMwZDZcdTMwZWJcdTMwNGNcdTVmYzVcdTg5ODFcdTMwNjdcdTMwNTlcdTMwMDI8L2xpPgorCisjIC0tLS0tLS0tLS0gU2VydmVyIE1vZHVsZSAtLS0tLS0tLS0tCitzZXJ2ZXIuc2VydmljZS50cmVlQnVpbGRlci5zdWJ0cmVlTm9kZT1cdTMwYjVcdTMwZmNcdTMwZDNcdTMwYjkKK3NlcnZlci5zZXJ2aWNlLnRyZWVCdWlsZGVyLmNvbm5lY3Rvcj1cdTMwYjNcdTMwY2RcdTMwYWZcdTMwYmYKK3NlcnZlci5zZXJ2aWNlLnRyZWVCdWlsZGVyLmhvc3Q9XHUzMGRiXHUzMGI5XHUzMGM4CitzZXJ2ZXIuc2VydmljZS50cmVlQnVpbGRlci5jb250ZXh0PVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBhZFx1MzBiOVx1MzBjOAorc2VydmVyLnNlcnZpY2UudHJlZUJ1aWxkZXIubG9nZ2VyRm9yPXswfVx1MzA2ZVx1MzBlZFx1MzBhY1x1MzBmYyAKK3NlcnZlci5zZXJ2aWNlLnRyZWVCdWlsZGVyLnJlYWxtRm9yPXswfVx1MzA2ZVx1MzBlY1x1MzBlYlx1MzBlMAorc2VydmVyLnNlcnZpY2UudHJlZUJ1aWxkZXIubG9nZ2VyPVx1MzBlZFx1MzBhY1x1MzBmYyAKK3NlcnZlci5zZXJ2aWNlLnRyZWVCdWlsZGVyLnJlYWxtPVx1MzBlY1x1MzBlYlx1MzBlMAorCisjIC0tLS0tLS0tLS0gUmVzb3VyY2VzIE1vZHVsZSAtLS0tLS0tLS0tCityZXNvdXJjZXMudHJlZUJ1aWxkZXIuc3VidHJlZU5vZGU9XHUzMGVhXHUzMGJkXHUzMGZjXHUzMGI5CityZXNvdXJjZXMudHJlZUJ1aWxkZXIuZGF0YXNvdXJjZXM9XHUzMGM3XHUzMGZjXHUzMGJmXHUzMGJkXHUzMGZjXHUzMGI5CityZXNvdXJjZXMudHJlZUJ1aWxkZXIubWFpbHNlc3Npb25zPVx1MzBlMVx1MzBmY1x1MzBlYlx1MzBiYlx1MzBjM1x1MzBiN1x1MzBlN1x1MzBmMworcmVzb3VyY2VzLnRyZWVCdWlsZGVyLnJlc291cmNlbGlua3M9XHUzMGVhXHUzMGJkXHUzMGZjXHUzMGI5XHUzMGVhXHUzMGYzXHUzMGFmCityZXNvdXJjZXMuZW52LmVudHJpZXM9XHU3NGIwXHU1ODgzXHUzMGE4XHUzMGYzXHUzMGM4XHUzMGVhCityZXNvdXJjZXMuZW52LmVudHJ5PVx1MzBhOFx1MzBmM1x1MzBjOFx1MzBlYVx1NTQwZAorcmVzb3VyY2VzLmVudi5wcm9wcz1cdTc0YjBcdTU4ODNcdTMwYThcdTMwZjNcdTMwYzhcdTMwZWFcdTMwZDdcdTMwZWRcdTMwZDFcdTMwYzZcdTMwYTMKK3Jlc291cmNlcy5lbnYub3ZlcnJpZGU9XHUzMGEyXHUzMGQ3XHUzMGVhXHUzMGIxXHUzMGZjXHUzMGI3XHUzMGU3XHUzMGYzXHUzMGVjXHUzMGQ5XHUzMGViXHUzMGE4XHUzMGYzXHUzMGM4XHUzMGVhXHUzMDkyXHU0ZTBhXHU2NmY4XHUzMDRkCityZXNvdXJjZXMuYWN0aW9ucy5lbnYuY3JlYXRlPVx1NjViMFx1MzA1N1x1MzA0NFx1NzRiMFx1NTg4M1x1MzBhOFx1MzBmM1x1MzBjOFx1MzBlYVx1MzA2ZVx1NGY1Y1x1NjIxMAorcmVzb3VyY2VzLmFjdGlvbnMuZW52LmVkaXQ9XHU3NGIwXHU1ODgzXHUzMGE4XHUzMGYzXHUzMGM4XHUzMGVhXHUzMDZlXHU3ZGU4XHU5NmM2CityZXNvdXJjZXMuYWN0aW9ucy5lbnYuZGVsZXRlPVx1NzRiMFx1NTg4M1x1MzBhOFx1MzBmM1x1MzBjOFx1MzBlYVx1MzA2ZVx1NTI0YVx1OTY2NAorcmVzb3VyY2VzLmFjdGlvbnMuZW52Lmxpc3Q9XHU2NWUyXHU1YjU4XHUzMDZlXHUzMGE4XHUzMGYzXHUzMGM4XHUzMGVhXHUzMDZlXHU0ZTAwXHU4OWE3CityZXNvdXJjZXMuZGF0YXNyYy5qZGJjPUpEQkNcdTMwYzlcdTMwZTlcdTMwYTRcdTMwZDAKK3Jlc291cmNlcy5hY3Rpb25zLmRhdGFzcmM9XHUzMGM3XHUzMGZjXHUzMGJmXHUzMGJkXHUzMGZjXHUzMGI5CityZXNvdXJjZXMuYWN0aW9ucy5kYXRhc3JjLmNyZWF0ZT1cdTY1YjBcdTMwNTdcdTMwNDRcdTMwYzdcdTMwZmNcdTMwYmZcdTMwYmRcdTMwZmNcdTMwYjlcdTMwNmVcdTRmNWNcdTYyMTAKK3Jlc291cmNlcy5hY3Rpb25zLmRhdGFzcmMuZGVsZXRlPVx1MzBjN1x1MzBmY1x1MzBiZlx1MzBiZFx1MzBmY1x1MzBiOVx1MzA2ZVx1NTI0YVx1OTY2NAorcmVzb3VyY2VzLmFjdGlvbnMuZGF0YXNyYy5lZGl0PVx1MzBjN1x1MzBmY1x1MzBiZlx1MzBiZFx1MzBmY1x1MzBiOVx1MzA2ZVx1N2RlOFx1OTZjNgorcmVzb3VyY2VzLmRhdGFzcmMudXJsPVx1MzBjN1x1MzBmY1x1MzBiZlx1MzBiZFx1MzBmY1x1MzBiOVVSTAorcmVzb3VyY2VzLmRhdGFzcmMuamRiY2NsYXNzPUpEQkNcdTMwYzlcdTMwZTlcdTMwYTRcdTMwZDBcdTMwYWZcdTMwZTlcdTMwYjkKK3Jlc291cmNlcy5kYXRhc3JjLmNvbm5lY3Rpb25zPVx1NjNhNVx1N2Q5YQorcmVzb3VyY2VzLmRhdGFzcmMuYWN0aXZlPVx1NjcwOVx1NTJiOVx1MzA2YVx1NjcwMFx1NTkyN1x1NjNhNVx1N2Q5YVx1NjU3MAorcmVzb3VyY2VzLmRhdGFzcmMuaWRsZT1cdTMwYTJcdTMwYTRcdTMwYzlcdTMwZWJcdTcyYjZcdTYxNGJcdTMwNmVcdTY3MDBcdTU5MjdcdTYzYTVcdTdkOWFcdTY1NzAKK3Jlc291cmNlcy5kYXRhc3JjLndhaXQ9XHU2NzAwXHU1OTI3XHU2M2E1XHU3ZDlhXHU1Zjg1XHUzMDYxXHU2NjQyXHU5NTkzCityZXNvdXJjZXMuZGF0YXNyYy52YWxpZGF0aW9uPVx1MzBhZlx1MzBhOFx1MzBlYVx1MzA2ZVx1NjkxY1x1OGEzYworcmVzb3VyY2VzLmRhdGFzcmMuam5kaT1KTkRJXHU1NDBkCityZXNvdXJjZXMuYWN0aW9ucy5tYWlsc2Vzc2lvbj1cdTMwZTFcdTMwZmNcdTMwZWJcdTMwYmJcdTMwYzNcdTMwYjdcdTMwZTdcdTMwZjMKK3Jlc291cmNlcy5hY3Rpb25zLm1haWxzZXNzaW9uLmNyZWF0ZT1cdTY1YjBcdTMwNTdcdTMwNDRcdTMwZTFcdTMwZmNcdTMwZWJcdTMwYmJcdTMwYzNcdTMwYjdcdTMwZTdcdTMwZjNcdTMwNmVcdTRmNWNcdTYyMTAKK3Jlc291cmNlcy5hY3Rpb25zLm1haWxzZXNzaW9uLmRlbGV0ZT1cdTMwZTFcdTMwZmNcdTMwZWJcdTMwYmJcdTMwYzNcdTMwYjdcdTMwZTdcdTMwZjNcdTMwNmVcdTUyNGFcdTk2NjQKK3Jlc291cmNlcy5hY3Rpb25zLm1haWxzZXNzaW9uLmVkaXQ9XHUzMGUxXHUzMGZjXHUzMGViXHUzMGJiXHUzMGMzXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDZlXHU3ZGU4XHU5NmM2CityZXNvdXJjZXMubWFpbHNlc3Npb24ubmFtZT1cdTU0MGRcdTUyNGQKK3Jlc291cmNlcy5tYWlsc2Vzc2lvbi5tYWlsaG9zdD1TTVRQXHUzMGRiXHUzMGI5XHUzMGM4XHU1NDBkCityZXNvdXJjZXMuYWN0aW9ucy5yZXNvdXJjZWxrPVx1MzBlYVx1MzBiZFx1MzBmY1x1MzBiOVx1MzBlYVx1MzBmM1x1MzBhZgorcmVzb3VyY2VzLmFjdGlvbnMucmVzb3VyY2Vsay5jcmVhdGU9XHU2NWIwXHUzMDU3XHUzMDQ0XHUzMGVhXHUzMGJkXHUzMGZjXHUzMGI5XHUzMGVhXHUzMGYzXHUzMGFmXHUzMDZlXHU0ZjVjXHU2MjEwCityZXNvdXJjZXMuYWN0aW9ucy5yZXNvdXJjZWxrLmRlbGV0ZT1cdTMwZWFcdTMwYmRcdTMwZmNcdTMwYjlcdTMwZWFcdTMwZjNcdTMwYWZcdTMwNmVcdTUyNGFcdTk2NjQKK3Jlc291cmNlcy5hY3Rpb25zLnJlc291cmNlbGsuZWRpdD1cdTMwZWFcdTMwYmRcdTMwZmNcdTMwYjlcdTMwZWFcdTMwZjNcdTMwYWZcdTMwNmVcdTdkZThcdTk2YzYKK3Jlc291cmNlcy5yZXNvdXJjZWxrLm5hbWU9XHU1NDBkXHU1MjRkCityZXNvdXJjZXMucmVzb3VyY2Vsay5nbG9iYWw9XHUzMGIwXHUzMGVkXHUzMGZjXHUzMGQwXHUzMGViCityZXNvdXJjZXMucmVzb3VyY2Vsay50eXBlPVx1NTc4YgorcmVzb3VyY2VzLmVycm9yLm5hbWUucmVxdWlyZWQ9PGxpPlx1NTQwZFx1NTI0ZFx1MzA2Zlx1NzcwMVx1NzU2NVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMjwvbGk+CityZXNvdXJjZXMuZXJyb3IuZ2xvYmFsLnJlcXVpcmVkPTxsaT5cdTMwYjBcdTMwZWRcdTMwZmNcdTMwZDBcdTMwZWJcdTMwNmZcdTc3MDFcdTc1NjVcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDI8L2xpPgorcmVzb3VyY2VzLmVycm9yLnR5cGUucmVxdWlyZWQ9PGxpPlx1NTc4Ylx1MzA2Zlx1NzcwMVx1NzU2NVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMjwvbGk+CityZXNvdXJjZXMuZXJyb3IudmFsdWUucmVxdWlyZWQ9PGxpPlx1NTAyNFx1MzA2Zlx1NzcwMVx1NzU2NVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMjwvbGk+CityZXNvdXJjZXMuZXJyb3IudmFsdWUubWlzbWF0Y2g9PGxpPlx1NTc4Ylx1MzA2OFx1NTAyNFx1MzA0Y1x1OTA2OVx1NTQwOFx1MzA1N1x1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMjwvbGk+CityZXNvdXJjZXMuZXJyb3IuZW50cnlUeXBlLmludmFsaWQ9PGxpPlx1MzBhOFx1MzBmM1x1MzBjOFx1MzBlYVx1MzBiZlx1MzBhNFx1MzBkN1x1MzA5Mlx1OGE4ZFx1OGI1OFx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMjwvbGk+CityZXNvdXJjZXMuZXJyb3IuZW50cnlUeXBlLm5vdGltcGw9PGxpPlx1MzA1M1x1MzA2ZVx1NTc4Ylx1MzA2Ylx1NWJmZVx1MzA1OVx1MzA4Ylx1NTlhNVx1NWY1M1x1NjAyN1x1MzBjMVx1MzBhN1x1MzBjM1x1MzBhYlx1MzA2Zlx1MzA3ZVx1MzA2MFx1NWI5Zlx1ODhjNVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMjwvbGk+CityZXNvdXJjZXMuZXJyb3IudXJsLnJlcXVpcmVkPTxsaT5cdTMwYzdcdTMwZmNcdTMwYmZcdTMwYmRcdTMwZmNcdTMwYjlVUkxcdTMwNmZcdTc3MDFcdTc1NjVcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDI8L2xpPgorcmVzb3VyY2VzLmVycm9yLmRyaXZlckNsYXNzLnJlcXVpcmVkPTxsaT5KREJDXHUzMGM5XHUzMGU5XHUzMGE0XHUzMGQwXHUzMGFmXHUzMGU5XHUzMGI5XHUzMDZmXHU3NzAxXHU3NTY1XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyPC9saT4KK3Jlc291cmNlcy5lcnJvci5hY3RpdmUucmVxdWlyZWQ9PGxpPlx1NjcwOVx1NTJiOVx1MzA2YVx1NjcwMFx1NTkyN1x1NjNhNVx1N2Q5YVx1NjU3MFx1MzA2Zlx1NzcwMVx1NzU2NVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMjwvbGk+CityZXNvdXJjZXMuZXJyb3IuaWRsZS5yZXF1aXJlZD08bGk+XHUzMGEyXHUzMGE0XHUzMGM5XHUzMGViXHU3MmI2XHU2MTRiXHUzMDZlXHU2NzAwXHU1OTI3XHU2M2E1XHU3ZDlhXHU2NTcwXHUzMDZmXHU3NzAxXHU3NTY1XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyPC9saT4KK3Jlc291cmNlcy5lcnJvci53YWl0LnJlcXVpcmVkPTxsaT5cdTY3MDBcdTU5MjdcdTYzYTVcdTdkOWFcdTVmODVcdTMwNjFcdTY2NDJcdTk1OTNcdTMwNmZcdTc3MDFcdTc1NjVcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDI8L2xpPgorcmVzb3VyY2VzLmVycm9yLm1haWxob3N0LnJlcXVpcmVkPTxsaT5TTVRQXHUzMGRiXHUzMGI5XHUzMGM4XHU1NDBkXHUzMDZmXHU3NzAxXHU3NTY1XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyPC9saT4KK3Jlc291cmNlcy5pbnRlZ2VyLmVycm9yPTxsaT5cdTRlMGRcdTZiNjNcdTMwNmFcdTY1NzRcdTY1NzBcdTMwNjdcdTMwNTlcdTMwMDI8L2xpPgorcmVzb3VyY2VzLmFjdGlvbnMudXNlcmRiLmNyZWF0ZT1cdTY1YjBcdTMwNTdcdTMwNDRcdTMwZTZcdTMwZmNcdTMwYjZcdTMwYzdcdTMwZmNcdTMwYmZcdTMwZDlcdTMwZmNcdTMwYjlcdTMwNmVcdTRmNWNcdTYyMTAKK3Jlc291cmNlcy5hY3Rpb25zLnVzZXJkYi5lZGl0PVx1MzBlNlx1MzBmY1x1MzBiNlx1MzBjN1x1MzBmY1x1MzBiZlx1MzBkOVx1MzBmY1x1MzBiOVx1MzA2ZVx1N2RlOFx1OTZjNgorcmVzb3VyY2VzLmFjdGlvbnMudXNlcmRiLmRlbGV0ZT1cdTMwZTZcdTMwZmNcdTMwYjZcdTMwYzdcdTMwZmNcdTMwYmZcdTMwZDlcdTMwZmNcdTMwYjlcdTMwNmVcdTUyNGFcdTk2NjQKK3Jlc291cmNlcy51c2VyZGIubG9jYXRpb249XHUzMGVkXHUzMGIxXHUzMGZjXHUzMGI3XHUzMGU3XHUzMGYzCityZXNvdXJjZXMudXNlcmRiLmZhY3Rvcnk9XHUzMGQ1XHUzMGExXHUzMGFmXHUzMGM4XHUzMGVhCityZXNvdXJjZXMudHJlZUJ1aWxkZXIuZGF0YWJhc2VzPVx1MzBlNlx1MzBmY1x1MzBiNlx1MzBjN1x1MzBmY1x1MzBiZlx1MzBkOVx1MzBmY1x1MzBiOQorcmVzb3VyY2VzLmVycm9yLnBhdGgucmVxdWlyZWQ9PGxpPlx1MzBkMVx1MzBiOVx1MzA2Zlx1NzcwMVx1NzU2NVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5MzwvbGk+CityZXNvdXJjZXMuZXJyb3Iuam5kaU5hbWUucmVxdWlyZWQ9PGxpPkpORElcdTU0MGRcdTMwNmZcdTc3MDFcdTc1NjVcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTM8L2xpPgorcmVzb3VyY2VzLmludmFsaWQubmFtZT08bGk+XHU3MTIxXHU1MmI5XHUzMDZhXHUzMGVhXHUzMGJkXHUzMGZjXHUzMGI5XHU1NDBkIC0gXHU1NDBkXHU1MjRkXHUzMDZmXHU2NWUyXHUzMDZiXHU1YjU4XHU1NzI4XHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyPC9saT4KK3Jlc291cmNlcy5pbnZhbGlkLmVudj08bGk+XHU3MTIxXHU1MmI5XHUzMDZhXHU3NGIwXHU1ODgzXHU1NDBkIC0gXHU1NDBkXHU1MjRkXHUzMDZmXHU2NWUyXHUzMDZiXHU1YjU4XHU1NzI4XHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyPC9saT4KKworIyAtLS0tLS0tLS0tIFVzZXIgRGF0YWJhc2UgTW9kdWxlIC0tLS0tLS0tLS0KK3VzZXJzLmFjdGlvbnMuZ3JvdXAuY3JlYXRlPVx1NjViMFx1MzA1N1x1MzA0NFx1MzBiMFx1MzBlYlx1MzBmY1x1MzBkN1x1MzA2ZVx1NGY1Y1x1NjIxMAordXNlcnMuYWN0aW9ucy5ncm91cC5kZWxldGU9XHU2NWUyXHU1YjU4XHUzMDZlXHUzMGIwXHUzMGViXHUzMGZjXHUzMGQ3XHUzMDZlXHU1MjRhXHU5NjY0Cit1c2Vycy5hY3Rpb25zLmdyb3VwLmxpc3Q9XHU2NWUyXHU1YjU4XHUzMDZlXHUzMGIwXHUzMGViXHUzMGZjXHUzMGQ3XHUzMDZlXHU0ZTAwXHU4OWE3Cit1c2Vycy5hY3Rpb25zLnJvbGUuY3JlYXRlPVx1NjViMFx1MzA1N1x1MzA0NFx1MzBlZFx1MzBmY1x1MzBlYlx1MzA2ZVx1NGY1Y1x1NjIxMAordXNlcnMuYWN0aW9ucy5yb2xlLmRlbGV0ZT1cdTY1ZTJcdTViNThcdTMwNmVcdTMwZWRcdTMwZmNcdTMwZWJcdTMwNmVcdTUyNGFcdTk2NjQKK3VzZXJzLmFjdGlvbnMucm9sZS5saXN0PVx1NjVlMlx1NWI1OFx1MzA2ZVx1MzBlZFx1MzBmY1x1MzBlYlx1MzA2ZVx1NGUwMFx1ODlhNwordXNlcnMuYWN0aW9ucy51c2VyLmNyZWF0ZT1cdTY1YjBcdTMwNTdcdTMwNDRcdTMwZTZcdTMwZmNcdTMwYjZcdTMwNmVcdTRmNWNcdTYyMTAKK3VzZXJzLmFjdGlvbnMudXNlci5kZWxldGU9XHU2NWUyXHU1YjU4XHUzMDZlXHUzMGU2XHUzMGZjXHUzMGI2XHUzMDZlXHU1MjRhXHU5NjY0Cit1c2Vycy5hY3Rpb25zLnVzZXIubGlzdD1cdTY1ZTJcdTViNThcdTMwNmVcdTMwZTZcdTMwZmNcdTMwYjZcdTMwNmVcdTRlMDBcdTg5YTcKK3VzZXJzLmRlbGV0ZUdyb3Vwcy50aXRsZT1cdTY1ZTJcdTViNThcdTMwNmVcdTMwYjBcdTMwZWJcdTMwZmNcdTMwZDdcdTMwNmVcdTUyNGFcdTk2NjQKK3VzZXJzLmRlbGV0ZVJvbGVzLnRpdGxlPVx1NjVlMlx1NWI1OFx1MzA2ZVx1MzBlZFx1MzBmY1x1MzBlYlx1MzA2ZVx1NTI0YVx1OTY2NAordXNlcnMuZGVsZXRlVXNlcnMudGl0bGU9XHU2NWUyXHU1YjU4XHUzMDZlXHUzMGU2XHUzMGZjXHUzMGI2XHUzMDZlXHU1MjRhXHU5NjY0Cit1c2Vycy5lcnJvci5hdHRyaWJ1dGUuZ2V0PVx1NWM1ZVx1NjAyN1x1MzA2ZVx1NTZkZVx1NWZhOVx1NjY0Mlx1MzA2Ylx1MzBhOFx1MzBlOVx1MzBmY1x1MzA0Y1x1NzY3YVx1NzUxZlx1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1ZiB7MH0KK3VzZXJzLmVycm9yLmF0dHJpYnV0ZS5zZXQ9XHU1YzVlXHU2MDI3XHUzMDZlXHU1OTA5XHU2NmY0XHU2NjQyXHUzMDZiXHUzMGE4XHUzMGU5XHUzMGZjXHUzMDRjXHU3NjdhXHU3NTFmXHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmIHswfQordXNlcnMuZXJyb3IuaW52b2tlPVx1MzBhYVx1MzBkYVx1MzBlY1x1MzBmY1x1MzBiN1x1MzBlN1x1MzBmM1x1MzA2ZVx1OGQ3N1x1NTJkNVx1NjY0Mlx1MzA2Ylx1MzBhOFx1MzBlOVx1MzBmY1x1MzA0Y1x1NzY3YVx1NzUxZlx1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1ZiB7MH0KK3VzZXJzLmVycm9yLmdyb3VwbmFtZS5yZXF1aXJlZD1cdTMwYjBcdTMwZWJcdTMwZmNcdTMwZDdcdTU0MGRcdTMwNmZcdTc3MDFcdTc1NjVcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMKK3VzZXJzLmVycm9yLnBhc3N3b3JkLnJlcXVpcmVkPVx1MzBkMVx1MzBiOVx1MzBlZlx1MzBmY1x1MzBjOVx1MzA2Zlx1NzcwMVx1NzU2NVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5MwordXNlcnMuZXJyb3IucXVvdGVzPVx1MzBjMFx1MzBkNlx1MzBlYlx1MzBhZlx1MzBhOVx1MzBmY1x1MzBjOFx1MzA2Zlx1MzAwMVx1MzBkNVx1MzBhM1x1MzBmY1x1MzBlYlx1MzBjOVx1NTAyNFx1MzA2Ylx1NTIyOVx1NzUyOFx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5MwordXNlcnMuZXJyb3Iucm9sZW5hbWUucmVxdWlyZWQ9XHUzMGVkXHUzMGZjXHUzMGViXHU1NDBkXHUzMDZmXHU3NzAxXHU3NTY1XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzCit1c2Vycy5lcnJvci5zZWxlY3Q9XHU3YmExXHU3NDA2XHUzMGFhXHUzMGQ2XHUzMGI4XHUzMGE3XHUzMGFmXHUzMGM4XHUzMDZlXHU5MDc4XHU2MjllXHU2NjQyXHUzMDZiXHUzMGE4XHUzMGU5XHUzMGZjXHUzMDRjXHU3NjdhXHU3NTFmXHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmCit1c2Vycy5lcnJvci50b2tlbj1cdTRlMGRcdTkwNjlcdTUyMDdcdTMwNmFcdTMwYzhcdTMwZTlcdTMwZjNcdTMwYjZcdTMwYWZcdTMwYjdcdTMwZTdcdTMwZjNcdTMwNGNcdTc2N2FcdTg4NGNcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNTdcdTMwNWYKK3VzZXJzLmVycm9yLnVzZXJuYW1lLnJlcXVpcmVkPTxsaT5cdTMwZTZcdTMwZmNcdTMwYjZcdTU0MGRcdTMwNmZcdTc3MDFcdTc1NjVcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTM8L2xpPgordXNlcnMuZ3JvdXAubmV3R3JvdXA9XHU2NWIwXHUzMDU3XHUzMDQ0XHUzMGIwXHUzMGViXHUzMGZjXHUzMGQ3XHUzMGQ3XHUzMGVkXHUzMGQxXHUzMGM2XHUzMGEzXHUzMDZlXHU0ZjVjXHU2MjEwCit1c2Vycy5ncm91cC5vbGRHcm91cD1cdTY1ZTJcdTViNThcdTMwNmVcdTMwYjBcdTMwZWJcdTMwZmNcdTMwZDdcdTMwZDdcdTMwZWRcdTMwZDFcdTMwYzZcdTMwYTNcdTMwNmVcdTdkZThcdTk2YzYKK3VzZXJzLmdyb3VwLnByb3BlcnRpZXM9XHUzMGIwXHUzMGViXHUzMGZjXHUzMGQ3XHUzMGQ3XHUzMGVkXHUzMGQxXHUzMGM2XHUzMGEzCit1c2Vycy5saXN0LmRlc2NyaXB0aW9uPVx1OGFhY1x1NjYwZQordXNlcnMubGlzdC5mdWxsTmFtZT1cdTMwZDVcdTMwZWJcdTMwY2RcdTMwZmNcdTMwZTAKK3VzZXJzLmxpc3QuZ3JvdXBuYW1lPVx1MzBiMFx1MzBlYlx1MzBmY1x1MzBkN1x1NTQwZAordXNlcnMubGlzdC5yb2xlbmFtZT1cdTMwZWRcdTMwZmNcdTMwZWJcdTU0MGQKK3VzZXJzLmxpc3QudXNlcm5hbWU9XHUzMGU2XHUzMGZjXHUzMGI2XHU1NDBkCit1c2Vycy5saXN0R3JvdXBzLnRpdGxlPVx1MzBiMFx1MzBlYlx1MzBmY1x1MzBkN1x1NGUwMFx1ODlhNwordXNlcnMubGlzdFJvbGVzLnRpdGxlPVx1MzBlZFx1MzBmY1x1MzBlYlx1NGUwMFx1ODlhNwordXNlcnMubGlzdFVzZXJzLnRpdGxlPVx1MzBlNlx1MzBmY1x1MzBiNlx1NGUwMFx1ODlhNwordXNlcnMucHJvbXB0LmRlc2NyaXB0aW9uPVx1OGFhY1x1NjYwZToKK3VzZXJzLnByb21wdC5mdWxsTmFtZT1cdTMwZDVcdTMwZWJcdTMwY2RcdTMwZmNcdTMwZTA6Cit1c2Vycy5wcm9tcHQuZ3JvdXBuYW1lPVx1MzBiMFx1MzBlYlx1MzBmY1x1MzBkN1x1NTQwZDoKK3VzZXJzLnByb21wdC5wYXNzd29yZD1cdTMwZDFcdTMwYjlcdTMwZWZcdTMwZmNcdTMwYzk6Cit1c2Vycy5wcm9tcHQucm9sZW5hbWU9XHUzMGVkXHUzMGZjXHUzMGViXHU1NDBkOgordXNlcnMucHJvbXB0LnVzZXJuYW1lPVx1MzBlNlx1MzBmY1x1MzBiNlx1NTQwZDoKK3VzZXJzLnJvbGUubmV3Um9sZT1cdTY1YjBcdTMwNTdcdTMwNDRcdTMwZWRcdTMwZmNcdTMwZWJcdTMwZDdcdTMwZWRcdTMwZDFcdTMwYzZcdTMwYTNcdTMwNmVcdTRmNWNcdTYyMTAKK3VzZXJzLnJvbGUub2xkUm9sZT1cdTY1ZTJcdTViNThcdTMwNmVcdTMwZWRcdTMwZmNcdTMwZWJcdTMwZDdcdTMwZWRcdTMwZDFcdTMwYzZcdTMwYTNcdTMwNmVcdTdkZThcdTk2YzYKK3VzZXJzLnJvbGUucHJvcGVydGllcz1cdTMwZWRcdTMwZmNcdTMwZWJcdTMwZDdcdTMwZWRcdTMwZDFcdTMwYzZcdTMwYTMKK3VzZXJzLnRyZWVCdWlsZGVyLmdyb3Vwc05vZGU9XHUzMGIwXHUzMGViXHUzMGZjXHUzMGQ3Cit1c2Vycy50cmVlQnVpbGRlci5yb2xlc05vZGU9XHUzMGVkXHUzMGZjXHUzMGViCit1c2Vycy50cmVlQnVpbGRlci5zdWJ0cmVlTm9kZT1cdTMwZTZcdTMwZmNcdTMwYjZcdTViOWFcdTdmYTkKK3VzZXJzLnRyZWVCdWlsZGVyLnVzZXJzTm9kZT1cdTMwZTZcdTMwZmNcdTMwYjYKK3VzZXJzLnVzZXIubmV3VXNlcj1cdTY1YjBcdTMwNTdcdTMwNDRcdTMwZTZcdTMwZmNcdTMwYjZcdTMwZDdcdTMwZWRcdTMwZDFcdTMwYzZcdTMwYTNcdTMwNmVcdTRmNWNcdTYyMTAKK3VzZXJzLnVzZXIub2xkVXNlcj1cdTY1ZTJcdTViNThcdTMwNmVcdTMwZTZcdTMwZmNcdTMwYjZcdTMwZDdcdTMwZWRcdTMwZDFcdTMwYzZcdTMwYTNcdTMwNmVcdTdkZThcdTk2YzYKK3VzZXJzLnVzZXIucHJvcGVydGllcz1cdTMwZTZcdTMwZmNcdTMwYjZcdTMwZDdcdTMwZWRcdTMwZDFcdTMwYzZcdTMwYTMKKyMgLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLSAtLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vQXBwbGljYXRpb25TZXJ2bGV0LmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vQXBwbGljYXRpb25TZXJ2bGV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJkMzRlMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9BcHBsaWNhdGlvblNlcnZsZXQuamF2YQpAQCAtMCwwICsxLDE2MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAxLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW47CisKK2ltcG9ydCBqYXZhLnRleHQuRGF0ZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlVuYXZhaWxhYmxlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5tb2RlbGVyLlJlZ2lzdHJ5OworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25TZXJ2bGV0OworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLnV0aWwuTWVzc2FnZVJlc291cmNlczsKKworCisvKioKKyAqIFN1YmNsYXNzIG9mIEFjdGlvblNlcnZsZXQgdGhhdCBhZGRzIGNhY2hpbmcgb2YgdGhlIHN1cHBvcnRlZCBsb2NhbGVzIGluIHRoZQorICogQXBwbGljYXRpb25Mb2NhbGVzIGNsYXNzLgorICoKKyAqIEBhdXRob3IgUGF0cmljayBMdWJ5CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBBcHBsaWNhdGlvblNlcnZsZXQgZXh0ZW5kcyBBY3Rpb25TZXJ2bGV0IHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTWFuaWZlc3QgQ29uc3RhbnRzCisKKworICAgIC8qKgorICAgICAqIFRoZSBhcHBsaWNhdGlvbiBzY29wZSBrZXkgdW5kZXIgd2hpY2ggd2Ugc3RvcmUgb3VyCisgICAgICogPGNvZGU+QXBwbGljYXRpb25Mb2NhbGVzPC9jb2RlPiBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBTEVTX0tFWSA9ICJhcHBsaWNhdGlvbkxvY2FsZXMiOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIG1hbmFnZWQgYmVhbnMgUmVnaXN0cnkgdXNlZCB0byBsb29rIHVwIG1ldGFkYXRhLgorICAgICAqLworICAgIHByb3RlY3RlZCBSZWdpc3RyeSByZWdpc3RyeSA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBKTVggTUJlYW5TZXJ2ZXIgd2Ugd2lsbCB1c2UgdG8gbG9vayB1cCBtYW5hZ2VtZW50IGJlYW5zLgorICAgICAqLworICAgIHByb3RlY3RlZCBNQmVhblNlcnZlciBzZXJ2ZXIgPSBudWxsOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIG1ha2UgdGhlIG1hbmFnZWQgYmVhbnMgUmVnaXN0cnkgYXZhaWxhYmxlLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIHRoZSBSZWdpc3RyeSBpcyBub3QgYXZhaWxhYmxlCisgICAgICovCisgICAgcHVibGljIFJlZ2lzdHJ5IGdldFJlZ2lzdHJ5KCkgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIGlmIChyZWdpc3RyeSA9PSBudWxsKQorICAgICAgICAgICAgaW5pdFJlZ2lzdHJ5KCk7CisgICAgICAgIHJldHVybiAodGhpcy5yZWdpc3RyeSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBtYWtlIHRoZSBKTVggTUJlYW5TZXJ2ZXIgYXZhaWxhYmxlLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIHRoZSBNQmVhblNlcnZlciBpcyBub3QgYXZhaWxhYmxlCisgICAgICovCisgICAgcHVibGljIE1CZWFuU2VydmVyIGdldFNlcnZlcigpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICBpZiAoc2VydmVyID09IG51bGwpCisgICAgICAgICAgICBpbml0U2VydmVyKCk7CisgICAgICAgIHJldHVybiAodGhpcy5zZXJ2ZXIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIHRoaXMgc2VydmxldC4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhbiBpbml0aWFsaXphdGlvbiBlcnJvciBvY2N1cnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgaW5pdCgpIHRocm93cyBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb24geworICAgICAgICBzdXBlci5pbml0KCk7CisgICAgICAgIGluaXRBcHBsaWNhdGlvbkxvY2FsZXMoKTsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvdGVjdGVkIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuZCBpbml0aWFsaXplIHRoZSBBcHBsaWNhdGlvbkxvY2FsZXMgb2JqZWN0LCBhbmQgbWFrZSBpdAorICAgICAqIGF2YWlsYWJsZSBhcyBhIHNlcnZsZXQgY29udGV4dCBhdHRyaWJ1dGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgaW5pdEFwcGxpY2F0aW9uTG9jYWxlcygpIHsKKworICAgICAgICBBcHBsaWNhdGlvbkxvY2FsZXMgbG9jYWxlcyA9IG5ldyBBcHBsaWNhdGlvbkxvY2FsZXModGhpcyk7CisgICAgICAgIGdldFNlcnZsZXRDb250ZXh0KCkuc2V0QXR0cmlidXRlKExPQ0FMRVNfS0VZLCBsb2NhbGVzKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogVmFsaWRhdGUgdGhlIGV4aXN0ZW5jZSBvZiB0aGUgUmVnaXN0cnkgdGhhdCBzaG91bGQgaGF2ZSBiZWVuCisgICAgICogcHJvdmlkZWQgdG8gdXMgYnkgYW4gaW5zdGFuY2Ugb2YKKyAgICAgKiA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLm1iZWFuLlNlcnZlckxpZmVjeWNsZUxpc3RlbmVyPC9jb2RlPgorICAgICAqIGVuYWJsZWQgYXQgc3RhcnR1cCB0aW1lLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIHdlIGNhbm5vdCBmaW5kIHRoZSBSZWdpc3RyeQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGluaXRSZWdpc3RyeSgpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICByZWdpc3RyeSA9IFJlZ2lzdHJ5LmdldFJlZ2lzdHJ5KCk7CisgICAgICAgIC8vKFJlZ2lzdHJ5KSBnZXRTZXJ2bGV0Q29udGV4dCgpLmdldEF0dHJpYnV0ZQorICAgICAgICAvLyAgICAoIm9yZy5hcGFjaGUuY2F0YWxpbmEuUmVnaXN0cnkiKTsKKyAgICAgICAgaWYgKHJlZ2lzdHJ5ID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgVW5hdmFpbGFibGVFeGNlcHRpb24oIlJlZ2lzdHJ5IGlzIG5vdCBhdmFpbGFibGUiKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogVmFsaWRhdGUgdGhlIGV4aXN0ZW5jZSBvZiB0aGUgTUJlYW5TZXJ2ZXIgdGhhdCBzaG91bGQgaGF2ZSBiZWVuCisgICAgICogcHJvdmlkZWQgdG8gdXMgYnkgYW4gaW5zdGFuY2Ugb2YKKyAgICAgKiA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLm1iZWFuLlNlcnZlckxpZmVjeWNsZUxpc3RlbmVyPC9jb2RlPgorICAgICAqIGVuYWJsZWQgYXQgc3RhcnR1cCB0aW1lLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIHdlIGNhbm5vdCBmaW5kIHRoZSBNQmVhblNlcnZlcgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGluaXRTZXJ2ZXIoKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgc2VydmVyID0gUmVnaXN0cnkuZ2V0UmVnaXN0cnkoKS5nZXRNQmVhblNlcnZlcigpOworICAgICAgICAvLyhNQmVhblNlcnZlcikgZ2V0U2VydmxldENvbnRleHQoKS5nZXRBdHRyaWJ1dGUKKyAgICAgICAgLy8gICAgKCJvcmcuYXBhY2hlLmNhdGFsaW5hLk1CZWFuU2VydmVyIik7CisgICAgICAgIGlmIChzZXJ2ZXIgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBVbmF2YWlsYWJsZUV4Y2VwdGlvbigiTUJlYW5TZXJ2ZXIgaXMgbm90IGF2YWlsYWJsZSIpOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9BdHRyaWJ1dGVUYWcuamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9BdHRyaWJ1dGVUYWcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTc2MTAyCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL0F0dHJpYnV0ZVRhZy5qYXZhCkBAIC0wLDAgKzEsMjAzIEBACisvKgorICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbjsKKworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC5Kc3BFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AuSnNwV3JpdGVyOworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLlBhZ2VDb250ZXh0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWdTdXBwb3J0OworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5iZWFudXRpbHMuUHJvcGVydHlVdGlsczsKKworCisKKy8qKgorICogQ3VzdG9tIHRhZyB0aGF0IHJldHJpZXZlcyBhIEpNWCBNQmVhbiBhdHRyaWJ1dGUgdmFsdWUsIGFuZCB3cml0ZXMgaXQKKyAqIG91dCB0byB0aGUgY3VycmVudCBvdXRwdXQgc3RyZWFtLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgQXR0cmlidXRlVGFnIGV4dGVuZHMgVGFnU3VwcG9ydCB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgYXR0cmlidXRlIG5hbWUgb24gdGhlIEpNWCBNQmVhbiB0byBiZSByZXRyaWV2ZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBhdHRyaWJ1dGUgPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGUoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5hdHRyaWJ1dGUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgYXR0cmlidXRlKSB7CisgICAgICAgIHRoaXMuYXR0cmlidXRlID0gYXR0cmlidXRlOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIGJlYW4gbmFtZSB0byBiZSByZXRyaWV2ZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLm5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSBwcm9wZXJ0eSBuYW1lIHRvIGJlIHJldHJpZXZlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHByb3BlcnR5ID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5wcm9wZXJ0eSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5KSB7CisgICAgICAgIHRoaXMucHJvcGVydHkgPSBwcm9wZXJ0eTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSBzY29wZSBpbiB3aGljaCB0aGUgYmVhbiBzaG91bGQgYmUgc2VhcmNoZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBzY29wZSA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFNjb3BlKCkgeworICAgICAgICByZXR1cm4gKHRoaXMuc2NvcGUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFNjb3BlKFN0cmluZyBzY29wZSkgeworICAgICAgICB0aGlzLnNjb3BlID0gc2NvcGU7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmVuZGVyIHRoZSBKTVggTUJlYW4gYXR0cmlidXRlIGlkZW50aWZpZWQgYnkgdGhpcyB0YWcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSnNwRXhjZXB0aW9uIGlmIGEgcHJvY2Vzc2luZyBleGNlcHRpb24gb2NjdXJzCisgICAgICovCisgICAgcHVibGljIGludCBkb0VuZFRhZygpIHRocm93cyBKc3BFeGNlcHRpb24geworCisgICAgICAgIC8vIFJldHJpZXZlIHRoZSBvYmplY3QgbmFtZSBpZGVudGlmaWVkIGJ5IG91ciBhdHRyaWJ1dGVzCisgICAgICAgIE9iamVjdCBiZWFuID0gbnVsbDsKKyAgICAgICAgaWYgKHNjb3BlID09IG51bGwpIHsKKyAgICAgICAgICAgIGJlYW4gPSBwYWdlQ29udGV4dC5maW5kQXR0cmlidXRlKG5hbWUpOworICAgICAgICB9IGVsc2UgaWYgKCJwYWdlIi5lcXVhbHNJZ25vcmVDYXNlKHNjb3BlKSkgeworICAgICAgICAgICAgYmVhbiA9IHBhZ2VDb250ZXh0LmdldEF0dHJpYnV0ZShuYW1lLCBQYWdlQ29udGV4dC5QQUdFX1NDT1BFKTsKKyAgICAgICAgfSBlbHNlIGlmICgicmVxdWVzdCIuZXF1YWxzSWdub3JlQ2FzZShzY29wZSkpIHsKKyAgICAgICAgICAgIGJlYW4gPSBwYWdlQ29udGV4dC5nZXRBdHRyaWJ1dGUobmFtZSwgUGFnZUNvbnRleHQuUkVRVUVTVF9TQ09QRSk7CisgICAgICAgIH0gZWxzZSBpZiAoInNlc3Npb24iLmVxdWFsc0lnbm9yZUNhc2Uoc2NvcGUpKSB7CisgICAgICAgICAgICBiZWFuID0gcGFnZUNvbnRleHQuZ2V0QXR0cmlidXRlKG5hbWUsIFBhZ2VDb250ZXh0LlNFU1NJT05fU0NPUEUpOworICAgICAgICB9IGVsc2UgaWYgKCJhcHBsaWNhdGlvbiIuZXF1YWxzSWdub3JlQ2FzZShzY29wZSkpIHsKKyAgICAgICAgICAgIGJlYW4gPSBwYWdlQ29udGV4dC5nZXRBdHRyaWJ1dGUobmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFnZUNvbnRleHQuQVBQTElDQVRJT05fU0NPUEUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IEpzcEV4Y2VwdGlvbigiSW52YWxpZCBzY29wZSB2YWx1ZSAnIiArIHNjb3BlICsgIiciKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYmVhbiA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSnNwRXhjZXB0aW9uKCJObyBiZWFuICciICsgbmFtZSArICInIGZvdW5kIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHByb3BlcnR5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgYmVhbiA9IFByb3BlcnR5VXRpbHMuZ2V0UHJvcGVydHkoYmVhbiwgcHJvcGVydHkpOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSnNwRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgICgiRXhjZXB0aW9uIHJldHJpZXZpbmcgcHJvcGVydHkgJyIgKyBwcm9wZXJ0eSArICInOiAiICsgdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYmVhbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEpzcEV4Y2VwdGlvbigiTm8gcHJvcGVydHkgJyIgKyBwcm9wZXJ0eSArICInIGZvdW5kIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBDb252ZXJ0IHRvIGFuIG9iamVjdCBuYW1lIGFzIG5lY2Vzc2FyeQorICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChiZWFuIGluc3RhbmNlb2YgT2JqZWN0TmFtZSkgeworICAgICAgICAgICAgICAgIG9uYW1lID0gKE9iamVjdE5hbWUpIGJlYW47CisgICAgICAgICAgICB9IGVsc2UgaWYgKGJlYW4gaW5zdGFuY2VvZiBTdHJpbmcpIHsKKyAgICAgICAgICAgICAgICBvbmFtZSA9IG5ldyBPYmplY3ROYW1lKChTdHJpbmcpIGJlYW4pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBvbmFtZSA9IG5ldyBPYmplY3ROYW1lKGJlYW4udG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSnNwRXhjZXB0aW9uKCJFeGNlcHRpb24gY3JlYXRpbmcgb2JqZWN0IG5hbWUgZm9yICciICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVhbiArICInOiAiICsgdCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBBY3F1aXJlIGEgcmVmZXJlbmNlIHRvIG91ciBNQmVhblNlcnZlcgorICAgICAgICBNQmVhblNlcnZlciBtc2VydmVyID0KKyAgICAgICAgICAgIChNQmVhblNlcnZlcikgcGFnZUNvbnRleHQuZ2V0QXR0cmlidXRlCisgICAgICAgICAgICAoIm9yZy5hcGFjaGUuY2F0YWxpbmEuTUJlYW5TZXJ2ZXIiLCBQYWdlQ29udGV4dC5BUFBMSUNBVElPTl9TQ09QRSk7CisgICAgICAgIGlmIChtc2VydmVyID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgSnNwRXhjZXB0aW9uKCJNQmVhblNlcnZlciBpcyBub3QgYXZhaWxhYmxlIik7CisKKyAgICAgICAgLy8gUmV0cmlldmUgdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUgZnJvbSB0aGUgc3BlY2lmaWVkIE1CZWFuCisgICAgICAgIE9iamVjdCB2YWx1ZSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB2YWx1ZSA9IG1zZXJ2ZXIuZ2V0QXR0cmlidXRlKG9uYW1lLCBhdHRyaWJ1dGUpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEpzcEV4Y2VwdGlvbigiRXhjZXB0aW9uIHJldHJpZXZpbmcgYXR0cmlidXRlICciICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlICsgIiciKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlbmRlciB0aGlzIHZhbHVlIHRvIG91ciBjdXJyZW50IG91dHB1dCB3cml0ZXIKKyAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgIEpzcFdyaXRlciBvdXQgPSBwYWdlQ29udGV4dC5nZXRPdXQoKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgb3V0LnByaW50KHZhbHVlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSnNwRXhjZXB0aW9uKCJJT0V4Y2VwdGlvbjogIiArIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gRXZhbHVhdGUgdGhlIHJlbWFpbmRlciBvZiB0aGlzIHBhZ2UKKyAgICAgICAgcmV0dXJuIChFVkFMX1BBR0UpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZWxlYXNlIGFsbCBjdXJyZW50IHN0YXRlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7CisKKyAgICAgICAgYXR0cmlidXRlID0gbnVsbDsKKyAgICAgICAgbmFtZSA9IG51bGw7CisgICAgICAgIHByb3BlcnR5ID0gbnVsbDsKKyAgICAgICAgc2NvcGUgPSBudWxsOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9Db21taXRDaGFuZ2VzQWN0aW9uLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vQ29tbWl0Q2hhbmdlc0FjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxMzJmM2IKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vQ29tbWl0Q2hhbmdlc0FjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTI3IEBACisvKgorICogQ29weXJpZ2h0IDIwMDEsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW47CisKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkVycm9yczsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9ybTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9yd2FyZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKKworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLnV0aWwuTWVzc2FnZVJlc291cmNlczsKKworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3RJbnN0YW5jZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5KTUV4Y2VwdGlvbjsKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiA8c3Ryb25nPkFjdGlvbjwvc3Ryb25nPiB0aGF0IHNhdmVzIHRoZSBjdXJyZW50IHNldHRpbmdzCisgKiBhbmQgd3JpdGVzIHRoZW0gb3V0IHRvIHNlcnZlci54bWwKKyAqCisgKiBAYXV0aG9yIE1hbnZlZW4gS2F1cgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgQ29tbWl0Q2hhbmdlc0FjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgTUJlYW5TZXJ2ZXIgd2Ugd2lsbCBiZSBpbnRlcmFjdGluZyB3aXRoLgorICAgICAqLworICAgIHByaXZhdGUgTUJlYW5TZXJ2ZXIgbUJTZXJ2ZXIgPSBudWxsOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUHJvY2VzcyB0aGUgc3BlY2lmaWVkIEhUVFAgcmVxdWVzdCwgYW5kIGNyZWF0ZSB0aGUgY29ycmVzcG9uZGluZyBIVFRQCisgICAgICogcmVzcG9uc2UgKG9yIGZvcndhcmQgdG8gYW5vdGhlciB3ZWIgY29tcG9uZW50IHRoYXQgd2lsbCBjcmVhdGUgaXQpLgorICAgICAqIFJldHVybiBhbiA8Y29kZT5BY3Rpb25Gb3J3YXJkPC9jb2RlPiBpbnN0YW5jZSBkZXNjcmliaW5nIHdoZXJlIGFuZCBob3cKKyAgICAgKiBjb250cm9sIHNob3VsZCBiZSBmb3J3YXJkZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSByZXNwb25zZSBoYXMKKyAgICAgKiBhbHJlYWR5IGJlZW4gY29tcGxldGVkLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIEFjdGlvbk1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSBhY3Rpb25Gb3JtIFRoZSBvcHRpb25hbCBBY3Rpb25Gb3JtIGJlYW4gZm9yIHRoaXMgcmVxdWVzdCAoaWYgYW55KQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBIVFRQIHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIEhUVFAgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0IGV4Y2VwdGlvbiBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgQWN0aW9uRm9yd2FyZCBwZXJmb3JtKEFjdGlvbk1hcHBpbmcgbWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbkZvcm0gZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICAvLyBBY3F1aXJlIGEgcmVmZXJlbmNlIHRvIHRoZSBNQmVhblNlcnZlciBjb250YWluaW5nIG91ciBNQmVhbnMKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1CU2VydmVyID0gKChBcHBsaWNhdGlvblNlcnZsZXQpIGdldFNlcnZsZXQoKSkuZ2V0U2VydmVyKCk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbgorICAgICAgICAgICAgKCJDYW5ub3QgYWNxdWlyZSBNQmVhblNlcnZlciByZWZlcmVuY2UiLCB0KTsKKyAgICAgICAgfQorCisgICAgICAgLy8gQWNxdWlyZSB0aGUgcmVzb3VyY2VzIHRoYXQgd2UgbmVlZAorICAgICAgICBIdHRwU2Vzc2lvbiBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uKCk7CisgICAgICAgIExvY2FsZSBsb2NhbGUgPSBnZXRMb2NhbGUocmVxdWVzdCk7CisgICAgICAgIE1lc3NhZ2VSZXNvdXJjZXMgcmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VzKHJlcXVlc3QpOworICAgICAgICAKKyAgICAgICBPYmplY3ROYW1lIHNuYW1lID0gbnVsbDsgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgIHNuYW1lID0gbmV3IE9iamVjdE5hbWUoVG9tY2F0VHJlZUJ1aWxkZXIuREVGQVVMVF9ET01BSU4gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9tY2F0VHJlZUJ1aWxkZXIuU0VSVkVSX1RZUEUpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiQ291bGQgbm90IGdldCBTZXJ2ZXIgT2JqZWN0IjsKKyAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cobWVzc2FnZSk7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19CQURfUkVRVUVTVCwgbWVzc2FnZSk7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgIFN0cmluZyBvcGVyYXRpb24gPSAic3RvcmVDb25maWciOworICAgICAgIHRyeSB7ICAgICAgICAgICAKKyAgICAgICAgICAgIG1CU2VydmVyLmludm9rZShzbmFtZSwgb3BlcmF0aW9uLCBudWxsLCBudWxsKTsgICAgICAgICAgICAKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgIChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5pbnZva2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbiksIHQpOworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmludm9rZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uKSk7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOyAgICAgICAgICAgIAorICAgICAgICB9CisgCisKKyAgICAgICAgZ2V0U2VydmxldCgpLmxvZygiRGVidWdnaW5nIC0tIGNoYW5nZXMgc2F2ZWQgdG8gY29uZi9zZXJ2ZXIueG1sIik7CisgICAgICAgIC8vIEZvcndhcmQgY29udHJvbCBiYWNrIHRvIHRoZSBiYW5uZXIKKyAgICAgICAgcmV0dXJuIChtYXBwaW5nLmZpbmRGb3J3YXJkKCJCYW5uZXIiKSk7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL0RhdGFUYWcuamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9EYXRhVGFnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAxOTYyNQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9EYXRhVGFnLmphdmEKQEAgLTAsMCArMSwxMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluOworCisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTEVuY29kZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC5Kc3BFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AuSnNwV3JpdGVyOworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLlBhZ2VDb250ZXh0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5Cb2R5VGFnU3VwcG9ydDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnOworCisKKy8qKgorICogPHA+TmVzdGVkIHRhZyB0aGF0IHJlcHJlc2VudHMgYW4gaW5kaXZpZHVhbCAiZGF0YSIgZm9yIGEgcm93LiAgVGhpcyB0YWcKKyAqIGlzIHZhbGlkIDxzdHJvbmc+b25seTwvc3Ryb25nPiB3aGVuIG5lc3RlZCB3aXRoaW4gYSBSb3dUYWcgdGFnLgorICoKKyAqIDxwPkluIGFkZGl0aW9uLCB0aGUgYm9keSBjb250ZW50IG9mIHRoaXMgdGFnIGlzIHVzZWQgYXMgdGhlIHVzZXItdmlzaWJsZQorICogZGF0YSBmb3IgdGhlIGFjdGlvbiwgc28gdGhhdCBpdCBtYXkgYmUgY29udmVuaWVudGx5IGxvY2FsaXplZC48L3A+CisgKgorICogPHN0cm9uZz5GSVhNRTwvc3Ryb25nPiAtIEludGVybmF0aW9uYWxpemUgdGhlIGV4Y2VwdGlvbiBtZXNzYWdlcyEKKyAqCisgKiBAYXV0aG9yIE1hbnZlZW4gS2F1cgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCisKK3B1YmxpYyBjbGFzcyBEYXRhVGFnIGV4dGVuZHMgQm9keVRhZ1N1cHBvcnQgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIGRhdGEgdGhhdCB3aWxsIGJlIHJlbmRlcmVkIGZvciB0aGlzIHRhYmxlIHJvdy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGRhdGEgPSBudWxsOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUHJvY2VzcyB0aGUgc3RhcnQgb2YgdGhpcyB0YWcuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEpzcEV4Y2VwdGlvbiBpZiBhIEpTUCBleGNlcHRpb24gaGFzIG9jY3VycmVkCisgICAgICovCisgICAgcHVibGljIGludCBkb1N0YXJ0VGFnKCkgdGhyb3dzIEpzcEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgaG9sZGVyIGZvciBvdXIgZGF0YSB0ZXh0CisgICAgICAgIHRoaXMuZGF0YSA9IG51bGw7CisKKyAgICAgICAgLy8gRG8gbm8gZnVydGhlciBwcm9jZXNzaW5nIGZvciBub3cKKyAgICAgICAgcmV0dXJuIChFVkFMX0JPRFlfVEFHKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUHJvY2VzcyB0aGUgYm9keSB0ZXh0IG9mIHRoaXMgdGFnIChpZiBhbnkpLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBKc3BFeGNlcHRpb24gaWYgYSBKU1AgZXhjZXB0aW9uIGhhcyBvY2N1cnJlZAorICAgICAqLworICAgIHB1YmxpYyBpbnQgZG9BZnRlckJvZHkoKSB0aHJvd3MgSnNwRXhjZXB0aW9uIHsKKworICAgICAgICBTdHJpbmcgZGF0YSA9IGJvZHlDb250ZW50LmdldFN0cmluZygpOworICAgICAgICBpZiAoZGF0YSAhPSBudWxsKSB7CisgICAgICAgICAgICBkYXRhID0gZGF0YS50cmltKCk7CisgICAgICAgICAgICBpZiAoZGF0YS5sZW5ndGgoKSA+IDApCisgICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gZGF0YTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKFNLSVBfQk9EWSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlY29yZCB0aGlzIGFjdGlvbiB3aXRoIG91ciBzdXJyb3VuZGluZyBBY3Rpb25zVGFnIGluc3RhbmNlLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBKc3BFeGNlcHRpb24gaWYgYSBwcm9jZXNzaW5nIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBpbnQgZG9FbmRUYWcoKSB0aHJvd3MgSnNwRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBGaW5kIG91ciBwYXJlbnQgQWN0aW9uc1RhZyBpbnN0YW5jZQorICAgICAgICBUYWcgcGFyZW50ID0gZ2V0UGFyZW50KCk7CisgICAgICAgIGlmICgocGFyZW50ID09IG51bGwpIHx8ICEocGFyZW50IGluc3RhbmNlb2YgUm93VGFnKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBKc3BFeGNlcHRpb24oIk11c3QgYmUgbmVzdGVkIGluIGEgcm93VGFnIGlzbnRhbmNlIik7CisgICAgICAgIFJvd1RhZyByb3cgPSAoUm93VGFnKSBwYXJlbnQ7CisKKyAgICAgICAgLy8gUmVnaXN0ZXIgdGhlIGluZm9ybWF0aW9uIGZvciB0aGUgYWN0aW9uIHJlcHJlc2VudGVkIGJ5CisgICAgICAgIC8vIHRoaXMgYWN0aW9uCisgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UgPQorICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UpIHBhZ2VDb250ZXh0LmdldFJlc3BvbnNlKCk7CisgICAgICAgIHJvdy5zZXREYXRhKGRhdGEpOworICAgICAgICAKKyAgICAgICAgcmV0dXJuIChFVkFMX1BBR0UpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZWxlYXNlIGFsbCBzdGF0ZSBpbmZvcm1hdGlvbiBzZXQgYnkgdGhpcyB0YWcuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKKworICAgICAgICB0aGlzLmRhdGEgPSBudWxsOworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vRHVtcFJlZ2lzdHJ5QWN0aW9uLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vRHVtcFJlZ2lzdHJ5QWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU2MjRkOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9EdW1wUmVnaXN0cnlBY3Rpb24uamF2YQpAQCAtMCwwICsxLDg3IEBACisvKgorICogQ29weXJpZ2h0IDIwMDEsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbjsKKworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5tb2RlbGVyLk1hbmFnZWRCZWFuOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5tb2RlbGVyLlJlZ2lzdHJ5OworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkVycm9yczsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9ybTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9yd2FyZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKKworCisvKioKKyAqIFNpbXBsZSBkZWJ1Z2dpbmcgYWN0aW9uIHRoYXQgZHVtcHMgYSBsaXN0IG9mIHRoZSBtYW5hZ2VkIGJlYW5zIHRoYXQgYXJlCisgKiB2aXNpYmxlIGluIG91ciBSZWdpc3RyeS4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIER1bXBSZWdpc3RyeUFjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBzcGVjaWZpZWQgSFRUUCByZXF1ZXN0LCBhbmQgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIEhUVFAKKyAgICAgKiByZXNwb25zZSAob3IgZm9yd2FyZCB0byBhbm90aGVyIHdlYiBjb21wb25lbnQgdGhhdCB3aWxsIGNyZWF0ZSBpdCkuCisgICAgICogUmV0dXJuIGFuIDxjb2RlPkFjdGlvbkZvcndhcmQ8L2NvZGU+IGluc3RhbmNlIGRlc2NyaWJpbmcgd2hlcmUgYW5kIGhvdworICAgICAqIGNvbnRyb2wgc2hvdWxkIGJlIGZvcndhcmRlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHJlc3BvbnNlIGhhcworICAgICAqIGFscmVhZHkgYmVlbiBjb21wbGV0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgQWN0aW9uTWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIGFjdGlvbkZvcm0gVGhlIG9wdGlvbmFsIEFjdGlvbkZvcm0gYmVhbiBmb3IgdGhpcyByZXF1ZXN0IChpZiBhbnkpCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIEhUVFAgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgSFRUUCByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXhjZXB0aW9uIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBBY3Rpb25Gb3J3YXJkIHBlcmZvcm0oQWN0aW9uTWFwcGluZyBtYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uRm9ybSBmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIENyZWF0ZSBhIHJlcXVlc3QgYXR0cmlidXRlIHdpdGggb3VyIGNvbGxlY3Rpb24gb2YgYmVhbnMKKyAgICAgICAgUmVnaXN0cnkgcmVnaXN0cnkgPSAoKEFwcGxpY2F0aW9uU2VydmxldCkgZ2V0U2VydmxldCgpKS5nZXRSZWdpc3RyeSgpOworICAgICAgICBTdHJpbmcgbmFtZXNbXSA9IHJlZ2lzdHJ5LmZpbmRNYW5hZ2VkQmVhbnMoKTsKKyAgICAgICAgQXJyYXlzLnNvcnQobmFtZXMpOworICAgICAgICBNYW5hZ2VkQmVhbiBiZWFuc1tdID0gbmV3IE1hbmFnZWRCZWFuW25hbWVzLmxlbmd0aF07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBiZWFuc1tpXSA9IHJlZ2lzdHJ5LmZpbmRNYW5hZ2VkQmVhbihuYW1lc1tpXSk7CisgICAgICAgIHJlcXVlc3Quc2V0QXR0cmlidXRlKCJiZWFucyIsIGJlYW5zKTsKKworICAgICAgICAvLyBGb3J3YXJkIHRvIHRoZSBjb3JyZXNwb25kaW5nIGRpc3BsYXkgcGFnZQorICAgICAgICByZXR1cm4gKG1hcHBpbmcuZmluZEZvcndhcmQoIkR1bXAgUmVnaXN0cnkgUmVzdWx0cyIpKTsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vRHVtcFNlcnZlckFjdGlvbi5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL0R1bXBTZXJ2ZXJBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTYyYzdmCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL0R1bXBTZXJ2ZXJBY3Rpb24uamF2YQpAQCAtMCwwICsxLDkwIEBACisvKgorICogQ29weXJpZ2h0IDIwMDEsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbjsKKworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRXJyb3JzOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3J3YXJkOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworCisKKy8qKgorICogU2ltcGxlIGRlYnVnZ2luZyBhY3Rpb24gdGhhdCBkdW1wcyBhIGxpc3Qgb2YgdGhlIE1CZWFucyB0aGF0IGFyZQorICogdmlzaWJsZSBpbiBvdXIgTUJlYW5TZXJ2ZXIuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBEdW1wU2VydmVyQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIHNwZWNpZmllZCBIVFRQIHJlcXVlc3QsIGFuZCBjcmVhdGUgdGhlIGNvcnJlc3BvbmRpbmcgSFRUUAorICAgICAqIHJlc3BvbnNlIChvciBmb3J3YXJkIHRvIGFub3RoZXIgd2ViIGNvbXBvbmVudCB0aGF0IHdpbGwgY3JlYXRlIGl0KS4KKyAgICAgKiBSZXR1cm4gYW4gPGNvZGU+QWN0aW9uRm9yd2FyZDwvY29kZT4gaW5zdGFuY2UgZGVzY3JpYmluZyB3aGVyZSBhbmQgaG93CisgICAgICogY29udHJvbCBzaG91bGQgYmUgZm9yd2FyZGVkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcmVzcG9uc2UgaGFzCisgICAgICogYWxyZWFkeSBiZWVuIGNvbXBsZXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBBY3Rpb25NYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gYWN0aW9uRm9ybSBUaGUgb3B0aW9uYWwgQWN0aW9uRm9ybSBiZWFuIGZvciB0aGlzIHJlcXVlc3QgKGlmIGFueSkKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgSFRUUCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBIVFRQIHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBleGNlcHRpb24gb2NjdXJzCisgICAgICovCisgICAgcHVibGljIEFjdGlvbkZvcndhcmQgcGVyZm9ybShBY3Rpb25NYXBwaW5nIG1hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb25Gb3JtIGZvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gQ3JlYXRlIGEgcmVxdWVzdCBhdHRyaWJ1dGUgd2l0aCBvdXIgY29sbGVjdGlvbiBvZiBNQmVhbnMKKyAgICAgICAgTUJlYW5TZXJ2ZXIgc2VydmVyID0gKChBcHBsaWNhdGlvblNlcnZsZXQpIGdldFNlcnZsZXQoKSkuZ2V0U2VydmVyKCk7CisgICAgICAgIEl0ZXJhdG9yIG5hbWVzID0gc2VydmVyLnF1ZXJ5TmFtZXMobnVsbCwgbnVsbCkuaXRlcmF0b3IoKTsKKyAgICAgICAgQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIHdoaWxlIChuYW1lcy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIGxpc3QuYWRkKG5hbWVzLm5leHQoKS50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KGxpc3QpOworICAgICAgICByZXF1ZXN0LnNldEF0dHJpYnV0ZSgibmFtZXMiLCBsaXN0KTsKKworICAgICAgICAvLyBGb3J3YXJkIHRvIHRoZSBjb3JyZXNwb25kaW5nIGRpc3BsYXkgcGFnZQorICAgICAgICByZXR1cm4gKG1hcHBpbmcuZmluZEZvcndhcmQoIkR1bXAgU2VydmVyIFJlc3VsdHMiKSk7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL0xhYmVsVGFnLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vTGFiZWxUYWcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGY3NjE0Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL0xhYmVsVGFnLmphdmEKQEAgLTAsMCArMSwxMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluOworCisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTEVuY29kZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC5Kc3BFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AuSnNwV3JpdGVyOworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLlBhZ2VDb250ZXh0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5Cb2R5VGFnU3VwcG9ydDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnOworCisKKy8qKgorICogPHA+TmVzdGVkIHRhZyB0aGF0IHJlcHJlc2VudHMgYW4gaW5kaXZpZHVhbCAibGFiZWxzIiBmb3IgYSByb3cuICBUaGlzIHRhZworICogaXMgdmFsaWQgPHN0cm9uZz5vbmx5PC9zdHJvbmc+IHdoZW4gbmVzdGVkIHdpdGhpbiBhIFJvd1RhZyB0YWcuCisgKgorICogPHA+SW4gYWRkaXRpb24sIHRoZSBib2R5IGNvbnRlbnQgb2YgdGhpcyB0YWcgaXMgdXNlZCBhcyB0aGUgdXNlci12aXNpYmxlCisgKiBsYWJlbCBmb3IgdGhlIGFjdGlvbiwgc28gdGhhdCBpdCBtYXkgYmUgY29udmVuaWVudGx5IGxvY2FsaXplZC48L3A+CisgKgorICogPHN0cm9uZz5GSVhNRTwvc3Ryb25nPiAtIEludGVybmF0aW9uYWxpemUgdGhlIGV4Y2VwdGlvbiBtZXNzYWdlcyEKKyAqCisgKiBAYXV0aG9yIE1hbnZlZW4gS2F1cgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCisKK3B1YmxpYyBjbGFzcyBMYWJlbFRhZyBleHRlbmRzIEJvZHlUYWdTdXBwb3J0IHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBsYWJlbCB0aGF0IHdpbGwgYmUgcmVuZGVyZWQgZm9yIHRoaXMgYWN0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgbGFiZWwgPSBudWxsOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUHJvY2VzcyB0aGUgc3RhcnQgb2YgdGhpcyB0YWcuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEpzcEV4Y2VwdGlvbiBpZiBhIEpTUCBleGNlcHRpb24gaGFzIG9jY3VycmVkCisgICAgICovCisgICAgcHVibGljIGludCBkb1N0YXJ0VGFnKCkgdGhyb3dzIEpzcEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgaG9sZGVyIGZvciBvdXIgbGFiZWwgdGV4dAorICAgICAgICB0aGlzLmxhYmVsID0gbnVsbDsKKworICAgICAgICAvLyBEbyBubyBmdXJ0aGVyIHByb2Nlc3NpbmcgZm9yIG5vdworICAgICAgICByZXR1cm4gKEVWQUxfQk9EWV9UQUcpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBib2R5IHRleHQgb2YgdGhpcyB0YWcgKGlmIGFueSkuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEpzcEV4Y2VwdGlvbiBpZiBhIEpTUCBleGNlcHRpb24gaGFzIG9jY3VycmVkCisgICAgICovCisgICAgcHVibGljIGludCBkb0FmdGVyQm9keSgpIHRocm93cyBKc3BFeGNlcHRpb24geworCisgICAgICAgIFN0cmluZyBsYWJlbCA9IGJvZHlDb250ZW50LmdldFN0cmluZygpOworICAgICAgICBpZiAobGFiZWwgIT0gbnVsbCkgeworICAgICAgICAgICAgbGFiZWwgPSBsYWJlbC50cmltKCk7CisgICAgICAgICAgICBpZiAobGFiZWwubGVuZ3RoKCkgPiAwKQorICAgICAgICAgICAgICAgIHRoaXMubGFiZWwgPSBsYWJlbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKFNLSVBfQk9EWSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlY29yZCB0aGlzIGFjdGlvbiB3aXRoIG91ciBzdXJyb3VuZGluZyBBY3Rpb25zVGFnIGluc3RhbmNlLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBKc3BFeGNlcHRpb24gaWYgYSBwcm9jZXNzaW5nIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBpbnQgZG9FbmRUYWcoKSB0aHJvd3MgSnNwRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBGaW5kIG91ciBwYXJlbnQgQWN0aW9uc1RhZyBpbnN0YW5jZQorICAgICAgICBUYWcgcGFyZW50ID0gZ2V0UGFyZW50KCk7CisgICAgICAgIGlmICgocGFyZW50ID09IG51bGwpIHx8ICEocGFyZW50IGluc3RhbmNlb2YgUm93VGFnKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBKc3BFeGNlcHRpb24oIk11c3QgYmUgbmVzdGVkIGluIGEgcm93VGFnIGlzbnRhbmNlIik7CisgICAgICAgIFJvd1RhZyByb3cgPSAoUm93VGFnKSBwYXJlbnQ7CisKKyAgICAgICAgLy8gUmVnaXN0ZXIgdGhlIGluZm9ybWF0aW9uIGZvciB0aGUgYWN0aW9uIHJlcHJlc2VudGVkIGJ5CisgICAgICAgIC8vIHRoaXMgYWN0aW9uCisgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UgPQorICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UpIHBhZ2VDb250ZXh0LmdldFJlc3BvbnNlKCk7CisgICAgICAgIHJvdy5zZXRMYWJlbChsYWJlbCk7CisgICAgICAgIAorICAgICAgICByZXR1cm4gKEVWQUxfUEFHRSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbGVhc2UgYWxsIHN0YXRlIGluZm9ybWF0aW9uIHNldCBieSB0aGlzIHRhZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWxlYXNlKCkgeworCisgICAgICAgIHRoaXMubGFiZWwgPSBudWxsOworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vTGFiZWxWYWx1ZUJlYW4uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9MYWJlbFZhbHVlQmVhbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwZGU0Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vTGFiZWxWYWx1ZUJlYW4uamF2YQpAQCAtMCwwICsxLDg3IEBACisvKgorICogQ29weXJpZ2h0IDE5OTktMjAwMSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluOworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CisKKy8qKgorICogU2ltcGxlIEphdmFCZWFuIHRvIHJlcHJlc2VudCBsYWJlbC12YWx1ZSBwYWlycyBmb3IgdXNlIGluIGNvbGxlY3Rpb25zCisgKiB0aGF0IGFyZSB1dGlsaXplZCBieSB0aGUgPGNvZGU+Jmx0O2Zvcm06b3B0aW9ucyZndDs8L2NvZGU+IHRhZy4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIExhYmVsVmFsdWVCZWFuIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBMYWJlbFZhbHVlQmVhbiB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWVzLgorICAgICAqCisgICAgICogQHBhcmFtIGxhYmVsIFRoZSBsYWJlbCB0byBiZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIKKyAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIGJlIHJldHVybmVkIHRvIHRoZSBzZXJ2ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgTGFiZWxWYWx1ZUJlYW4oU3RyaW5nIGxhYmVsLCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgdGhpcy5sYWJlbCA9IGxhYmVsOworICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogVGhlIGxhYmVsIHRvIGJlIGRpc3BsYXllZCB0byB0aGUgdXNlci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGxhYmVsID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5sYWJlbCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgdmFsdWUgdG8gYmUgcmV0dXJuZWQgdG8gdGhlIHNlcnZlci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisgICAgICAgIHJldHVybiAodGhpcy52YWx1ZSk7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIkxhYmVsVmFsdWVCZWFuWyIpOworICAgICAgICBzYi5hcHBlbmQodGhpcy5sYWJlbCk7CisgICAgICAgIHNiLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgc2IuYXBwZW5kKHRoaXMudmFsdWUpOworICAgICAgICBzYi5hcHBlbmQoIl0iKTsKKyAgICAgICAgcmV0dXJuIChzYi50b1N0cmluZygpKTsKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL0xpc3RzLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vTGlzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWFhNGY4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL0xpc3RzLmphdmEKQEAgLTAsMCArMSw2MjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMS0yMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluOworCisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsKKworCisvKioKKyAqIEdlbmVyYWwgcHVycG9zZSB1dGlsaXR5IG1ldGhvZHMgdG8gY3JlYXRlIGxpc3RzIG9mIG9iamVjdHMgdGhhdCBhcmUKKyAqIGNvbW1vbmx5IHJlcXVpcmVkIGluIGJ1aWxkaW5nIHRoZSB1c2VyIGludGVyZmFjZS4gIEluIGFsbCBjYXNlcywgaWYgdGhlcmUKKyAqIGFyZSBubyBtYXRjaGluZyBlbGVtZW50cywgYSB6ZXJvLWxlbmd0aCBsaXN0IChyYXRoZXIgdGhhbiA8Y29kZT5udWxsPC9jb2RlPikKKyAqIGlzIHJldHVybmVkLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQGF1dGhvciBBbXkgUm9oCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBMaXN0cyB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvKioKKyAgICAgKiBQcm90ZWN0ZWQgY29uc3RydWN0b3IgdG8gcHJldmVudCBpbnN0YW50aWF0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCBMaXN0cygpIHsgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFN0YXRpYyBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogUHJlY29tcHV0ZWQgbGlzdCBvZiB2ZXJib3NpdHkgbGV2ZWwgbGFiZWxzIGFuZCB2YWx1ZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgTGlzdCB2ZXJib3NpdHlMZXZlbHMgPSBuZXcgQXJyYXlMaXN0KCk7CisKKyAgICBzdGF0aWMgeworICAgICAgICB2ZXJib3NpdHlMZXZlbHMuYWRkKG5ldyBMYWJlbFZhbHVlQmVhbigiMCIsICIwIikpOworICAgICAgICB2ZXJib3NpdHlMZXZlbHMuYWRkKG5ldyBMYWJlbFZhbHVlQmVhbigiMSIsICIxIikpOworICAgICAgICB2ZXJib3NpdHlMZXZlbHMuYWRkKG5ldyBMYWJlbFZhbHVlQmVhbigiMiIsICIyIikpOworICAgICAgICB2ZXJib3NpdHlMZXZlbHMuYWRkKG5ldyBMYWJlbFZhbHVlQmVhbigiMyIsICIzIikpOworICAgICAgICB2ZXJib3NpdHlMZXZlbHMuYWRkKG5ldyBMYWJlbFZhbHVlQmVhbigiNCIsICI0IikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByZWNvbXB1dGVkIGxpc3Qgb2YgKHRydWUsZmFsc2UpIGxhYmVscyBhbmQgdmFsdWVzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIExpc3QgYm9vbGVhblZhbHVlcyA9IG5ldyBBcnJheUxpc3QoKTsKKworICAgIHN0YXRpYyB7CisgICAgICAgICAgICBib29sZWFuVmFsdWVzLmFkZChuZXcgTGFiZWxWYWx1ZUJlYW4oIlRydWUiLCAidHJ1ZSIpKTsKKyAgICAgICAgICAgIGJvb2xlYW5WYWx1ZXMuYWRkKG5ldyBMYWJlbFZhbHVlQmVhbigiRmFsc2UiLCAiZmFsc2UiKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJlY29tcHV0ZWQgbGlzdCBvZiBjbGllbnRBdXRoIGxhYmxlcyBhbmQgdmFsdWVzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIExpc3QgY2xpZW50QXV0aFZhbHVlcyA9IG5ldyBBcnJheUxpc3QoKTsKKworICAgIHN0YXRpYyB7CisgICAgICAgICAgICBjbGllbnRBdXRoVmFsdWVzLmFkZChuZXcgTGFiZWxWYWx1ZUJlYW4oIlRydWUiLCJ0cnVlIikpOworICAgICAgICAgICAgY2xpZW50QXV0aFZhbHVlcy5hZGQobmV3IExhYmVsVmFsdWVCZWFuKCJGYWxzZSIsImZhbHNlIikpOworICAgICAgICAgICAgY2xpZW50QXV0aFZhbHVlcy5hZGQobmV3IExhYmVsVmFsdWVCZWFuKCJXYW50Iiwid2FudCIpKTsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgPGNvZGU+TGlzdDwvY29kZT4gb2Yge0BsaW5rIExhYmVsVmFsdWVCZWFufXMgZm9yIHRoZSBsZWdhbAorICAgICAqIHNldHRpbmdzIGZvciA8Y29kZT52ZXJib3NpdHk8L2NvZGU+IHByb3BlcnRpZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBMaXN0IGdldFZlcmJvc2l0eUxldmVscygpIHsKKworICAgICAgICByZXR1cm4gKHZlcmJvc2l0eUxldmVscyk7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSA8Y29kZT5MaXN0PC9jb2RlPiBvZiB7QGxpbmsgTGFiZWxWYWx1ZUJlYW59cyBmb3IgdGhlIGxlZ2FsCisgICAgICogc2V0dGluZ3MgZm9yIDxjb2RlPmJvb2xlYW48L2NvZGU+IHByb3BlcnRpZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBMaXN0IGdldEJvb2xlYW5WYWx1ZXMoKSB7CisKKyAgICAgICAgcmV0dXJuIChib29sZWFuVmFsdWVzKTsKKworICAgIH0KKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSA8Y29kZT5MaXN0PC9jb2RlPiBvZiB7QGxpbmsgTGFiZWxWYWx1ZUJlYW59cyBmb3IgdGhlIGxlZ2FsCisgICAgICogc2V0dGluZ3MgZm9yIDxjb2RlPmNsaWVudEF1dGg8L2NvZGU+IHByb3BlcnRpZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBMaXN0IGdldENsaWVudEF1dGhWYWx1ZXMoKSB7CisKKyAgICAgICAgcmV0dXJuIChjbGllbnRBdXRoVmFsdWVzKTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhIGxpc3Qgb2YgPGNvZGU+Q29ubmVjdG9yPC9jb2RlPiBvYmplY3QgbmFtZSBzdHJpbmdzCisgICAgICogZm9yIHRoZSBzcGVjaWZpZWQgPGNvZGU+U2VydmljZTwvY29kZT4gb2JqZWN0IG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWJzZXJ2ZXIgTUJlYW5TZXJ2ZXIgZnJvbSB3aGljaCB0byByZXRyaWV2ZSB0aGUgbGlzdAorICAgICAqIEBwYXJhbSBzZXJ2aWNlIE9iamVjdCBuYW1lIG9mIHRoZSBzZXJ2aWNlIGZvciB3aGljaCB0byBzZWxlY3QgY29ubmVjdG9ycworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgdGhyb3duIHdoaWxlIHJldHJpZXZpbmcgdGhlIGxpc3QKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIExpc3QgZ2V0Q29ubmVjdG9ycyhNQmVhblNlcnZlciBtYnNlcnZlciwgT2JqZWN0TmFtZSBzZXJ2aWNlKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKHNlcnZpY2UuZ2V0RG9tYWluKCkpOworICAgICAgICBzYi5hcHBlbmQoIjp0eXBlPUNvbm5lY3RvciwqIik7CisgICAgICAgIE9iamVjdE5hbWUgc2VhcmNoID0gbmV3IE9iamVjdE5hbWUoc2IudG9TdHJpbmcoKSk7CisgICAgICAgIEFycmF5TGlzdCBjb25uZWN0b3JzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBJdGVyYXRvciBuYW1lcyA9IG1ic2VydmVyLnF1ZXJ5TmFtZXMoc2VhcmNoLCBudWxsKS5pdGVyYXRvcigpOworICAgICAgICB3aGlsZSAobmFtZXMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBjb25uZWN0b3JzLmFkZChuYW1lcy5uZXh0KCkudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgQ29sbGVjdGlvbnMuc29ydChjb25uZWN0b3JzKTsKKyAgICAgICAgcmV0dXJuIChjb25uZWN0b3JzKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgbGlzdCBvZiA8Y29kZT5Db25uZWN0b3I8L2NvZGU+IG9iamVjdCBuYW1lIHN0cmluZ3MKKyAgICAgKiBmb3IgdGhlIHNwZWNpZmllZCA8Y29kZT5TZXJ2aWNlPC9jb2RlPiBvYmplY3QgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYnNlcnZlciBNQmVhblNlcnZlciBmcm9tIHdoaWNoIHRvIHJldHJpZXZlIHRoZSBsaXN0CisgICAgICogQHBhcmFtIHNlcnZpY2UgT2JqZWN0IG5hbWUgb2YgdGhlIHNlcnZpY2UgZm9yIHdoaWNoIHRvIHNlbGVjdCBjb25uZWN0b3JzCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiB0aHJvd24gd2hpbGUgcmV0cmlldmluZyB0aGUgbGlzdAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRDb25uZWN0b3JzKE1CZWFuU2VydmVyIG1ic2VydmVyLCBTdHJpbmcgc2VydmljZSkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgcmV0dXJuIChnZXRDb25uZWN0b3JzKG1ic2VydmVyLCBuZXcgT2JqZWN0TmFtZShzZXJ2aWNlKSkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBsaXN0IG9mIDxjb2RlPkNvbnRleHQ8L2NvZGU+IG9iamVjdCBuYW1lIHN0cmluZ3MKKyAgICAgKiBmb3IgdGhlIHNwZWNpZmllZCA8Y29kZT5Ib3N0PC9jb2RlPiBvYmplY3QgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYnNlcnZlciBNQmVhblNlcnZlciBmcm9tIHdoaWNoIHRvIHJldHJpZXZlIHRoZSBsaXN0CisgICAgICogQHBhcmFtIGhvc3QgT2JqZWN0IG5hbWUgb2YgdGhlIGhvc3QgZm9yIHdoaWNoIHRvIHNlbGVjdCBjb250ZXh0cworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgdGhyb3duIHdoaWxlIHJldHJpZXZpbmcgdGhlIGxpc3QKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIExpc3QgZ2V0Q29udGV4dHMoTUJlYW5TZXJ2ZXIgbWJzZXJ2ZXIsIE9iamVjdE5hbWUgaG9zdCkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihob3N0LmdldERvbWFpbigpKTsKKyAgICAgICAgc2IuYXBwZW5kKCI6ajJlZVR5cGU9V2ViTW9kdWxlLCoiKTsKKyAgICAgICAgT2JqZWN0TmFtZSBzZWFyY2ggPSBuZXcgT2JqZWN0TmFtZShzYi50b1N0cmluZygpKTsKKyAgICAgICAgQXJyYXlMaXN0IGNvbnRleHRzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBJdGVyYXRvciBuYW1lcyA9IG1ic2VydmVyLnF1ZXJ5TmFtZXMoc2VhcmNoLCBudWxsKS5pdGVyYXRvcigpOworICAgICAgICBTdHJpbmcgbmFtZSA9IG51bGw7CisgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPSBudWxsOworICAgICAgICBTdHJpbmcgaG9zdFByZWZpeCA9ICIvLyIraG9zdC5nZXRLZXlQcm9wZXJ0eSgiaG9zdCIpOworICAgICAgICBTdHJpbmcgaG9zdEF0dHIgPSBudWxsOworICAgICAgICB3aGlsZSAobmFtZXMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBuYW1lID0gbmFtZXMubmV4dCgpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICBvbmFtZSA9IG5ldyBPYmplY3ROYW1lKG5hbWUpOworICAgICAgICAgICAgaG9zdEF0dHIgPSBvbmFtZS5nZXRLZXlQcm9wZXJ0eSgibmFtZSIpOworICAgICAgICAgICAgaWYgKGhvc3RBdHRyLnN0YXJ0c1dpdGgoaG9zdFByZWZpeCkpIHsKKyAgICAgICAgICAgICAgICBjb250ZXh0cy5hZGQobmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgQ29sbGVjdGlvbnMuc29ydChjb250ZXh0cyk7CisgICAgICAgIHJldHVybiAoY29udGV4dHMpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBsaXN0IG9mIDxjb2RlPkRlZmF1bHRDb250ZXh0PC9jb2RlPiBvYmplY3QgbmFtZSBzdHJpbmdzCisgICAgICogZm9yIHRoZSBzcGVjaWZpZWQgPGNvZGU+SG9zdDwvY29kZT4gb2JqZWN0IG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWJzZXJ2ZXIgTUJlYW5TZXJ2ZXIgZnJvbSB3aGljaCB0byByZXRyaWV2ZSB0aGUgbGlzdAorICAgICAqIEBwYXJhbSBjb250YWluZXIgT2JqZWN0IG5hbWUgb2YgdGhlIGNvbnRhaW5lciBmb3Igd2hpY2ggdG8gc2VsZWN0IGRlZmF1bHQKKyAgICAgKiBjb250ZXh0cworICAgICAqIEBwYXJhbSBjb250YWluZXJUeXBlIFRoZSB0eXBlIG9mIHRoZSBjb250YWluZXIgZm9yIHdoaWNoIHRvIHNlbGVjdCAKKyAgICAgKiBkZWZhdWx0IGNvbnRleHRzCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiB0aHJvd24gd2hpbGUgcmV0cmlldmluZyB0aGUgbGlzdAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXREZWZhdWx0Q29udGV4dHMoTUJlYW5TZXJ2ZXIgbWJzZXJ2ZXIsIFN0cmluZyAKKyAgICAgICAgY29udGFpbmVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICByZXR1cm4gKGdldERlZmF1bHRDb250ZXh0cyhtYnNlcnZlciwgbmV3IE9iamVjdE5hbWUoY29udGFpbmVyKSkpOworCisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiBhIGxpc3Qgb2YgPGNvZGU+RGVmYXVsdENvbnRleHQ8L2NvZGU+IG9iamVjdCBuYW1lIHN0cmluZ3MKKyAgICAgKiBmb3IgdGhlIHNwZWNpZmllZCA8Y29kZT5Ib3N0PC9jb2RlPiBvYmplY3QgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYnNlcnZlciBNQmVhblNlcnZlciBmcm9tIHdoaWNoIHRvIHJldHJpZXZlIHRoZSBsaXN0CisgICAgICogQHBhcmFtIGNvbnRhaW5lciBPYmplY3QgbmFtZSBvZiB0aGUgY29udGFpbmVyIGZvciB3aGljaCB0byBzZWxlY3QgZGVmYXVsdAorICAgICAqIGNvbnRleHRzCisgICAgICogQHBhcmFtIGNvbnRhaW5lclR5cGUgVGhlIHR5cGUgb2YgdGhlIGNvbnRhaW5lciBmb3Igd2hpY2ggdG8gc2VsZWN0IAorICAgICAqIGRlZmF1bHQgY29udGV4dHMKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIHRocm93biB3aGlsZSByZXRyaWV2aW5nIHRoZSBsaXN0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBMaXN0IGdldERlZmF1bHRDb250ZXh0cyhNQmVhblNlcnZlciBtYnNlcnZlciwgT2JqZWN0TmFtZSAKKyAgICAgICAgY29udGFpbmVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBGSVhNRQorICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKGNvbnRhaW5lci5nZXREb21haW4oKSk7CisgICAgICAgIHNiLmFwcGVuZCgiOnR5cGU9RGVmYXVsdENvbnRleHQiKTsKKyAgICAgICAgU3RyaW5nIHR5cGUgPSBjb250YWluZXIuZ2V0S2V5UHJvcGVydHkoInR5cGUiKTsKKyAgICAgICAgU3RyaW5nIGhvc3QgPSBjb250YWluZXIuZ2V0S2V5UHJvcGVydHkoImhvc3QiKTsKKyAgICAgICAgaWYgKCJIb3N0Ii5lcXVhbHModHlwZSkpIHsKKyAgICAgICAgICAgIGhvc3QgPSBjb250YWluZXIuZ2V0S2V5UHJvcGVydHkoImhvc3QiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaG9zdCAhPSBudWxsKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIixob3N0PSIpOworICAgICAgICAgICAgc2IuYXBwZW5kKGhvc3QpOworICAgICAgICB9CisgICAgICAgIE9iamVjdE5hbWUgc2VhcmNoID0gbmV3IE9iamVjdE5hbWUoc2IudG9TdHJpbmcoKSk7CisgICAgICAgIEFycmF5TGlzdCBkZWZhdWx0Q29udGV4dHMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIEl0ZXJhdG9yIG5hbWVzID0gbWJzZXJ2ZXIucXVlcnlOYW1lcyhzZWFyY2gsIG51bGwpLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChuYW1lcy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gbmFtZXMubmV4dCgpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICBkZWZhdWx0Q29udGV4dHMuYWRkKG5hbWUpOworICAgICAgICB9CisgICAgICAgIENvbGxlY3Rpb25zLnNvcnQoZGVmYXVsdENvbnRleHRzKTsKKyAgICAgICAgcmV0dXJuIChkZWZhdWx0Q29udGV4dHMpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBsaXN0IG9mIDxjb2RlPkNvbnRleHQ8L2NvZGU+IG9iamVjdCBuYW1lIHN0cmluZ3MKKyAgICAgKiBmb3IgdGhlIHNwZWNpZmllZCA8Y29kZT5Ib3N0PC9jb2RlPiBvYmplY3QgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYnNlcnZlciBNQmVhblNlcnZlciBmcm9tIHdoaWNoIHRvIHJldHJpZXZlIHRoZSBsaXN0CisgICAgICogQHBhcmFtIGhvc3QgT2JqZWN0IG5hbWUgb2YgdGhlIGhvc3QgZm9yIHdoaWNoIHRvIHNlbGVjdCBjb250ZXh0cworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgdGhyb3duIHdoaWxlIHJldHJpZXZpbmcgdGhlIGxpc3QKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIExpc3QgZ2V0Q29udGV4dHMoTUJlYW5TZXJ2ZXIgbWJzZXJ2ZXIsIFN0cmluZyBob3N0KQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICByZXR1cm4gKGdldENvbnRleHRzKG1ic2VydmVyLCBuZXcgT2JqZWN0TmFtZShob3N0KSkpOworCisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgbGlzdCBvZiA8Y29kZT5Ib3N0PC9jb2RlPiBvYmplY3QgbmFtZSBzdHJpbmdzCisgICAgICogZm9yIHRoZSBzcGVjaWZpZWQgPGNvZGU+U2VydmljZTwvY29kZT4gb2JqZWN0IG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWJzZXJ2ZXIgTUJlYW5TZXJ2ZXIgZnJvbSB3aGljaCB0byByZXRyaWV2ZSB0aGUgbGlzdAorICAgICAqIEBwYXJhbSBzZXJ2aWNlIE9iamVjdCBuYW1lIG9mIHRoZSBzZXJ2aWNlIGZvciB3aGljaCB0byBzZWxlY3QgaG9zdHMKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIHRocm93biB3aGlsZSByZXRyaWV2aW5nIHRoZSBsaXN0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBMaXN0IGdldEhvc3RzKE1CZWFuU2VydmVyIG1ic2VydmVyLCBPYmplY3ROYW1lIHNlcnZpY2UpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoc2VydmljZS5nZXREb21haW4oKSk7CisgICAgICAgIHNiLmFwcGVuZCgiOnR5cGU9SG9zdCwqIik7CisgICAgICAgIE9iamVjdE5hbWUgc2VhcmNoID0gbmV3IE9iamVjdE5hbWUoc2IudG9TdHJpbmcoKSk7CisgICAgICAgIEFycmF5TGlzdCBob3N0cyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgSXRlcmF0b3IgbmFtZXMgPSBtYnNlcnZlci5xdWVyeU5hbWVzKHNlYXJjaCwgbnVsbCkuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKG5hbWVzLmhhc05leHQoKSkgeworICAgICAgICAgICAgaG9zdHMuYWRkKG5hbWVzLm5leHQoKS50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KGhvc3RzKTsKKyAgICAgICAgcmV0dXJuIChob3N0cyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIGxpc3Qgb2YgPGNvZGU+SG9zdDwvY29kZT4gb2JqZWN0IG5hbWUgc3RyaW5ncworICAgICAqIGZvciB0aGUgc3BlY2lmaWVkIDxjb2RlPlNlcnZpY2U8L2NvZGU+IG9iamVjdCBuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIG1ic2VydmVyIE1CZWFuU2VydmVyIGZyb20gd2hpY2ggdG8gcmV0cmlldmUgdGhlIGxpc3QKKyAgICAgKiBAcGFyYW0gc2VydmljZSBPYmplY3QgbmFtZSBvZiB0aGUgc2VydmljZSBmb3Igd2hpY2ggdG8gc2VsZWN0IGhvc3RzCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiB0aHJvd24gd2hpbGUgcmV0cmlldmluZyB0aGUgbGlzdAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRIb3N0cyhNQmVhblNlcnZlciBtYnNlcnZlciwgU3RyaW5nIHNlcnZpY2UpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIHJldHVybiAoZ2V0SG9zdHMobWJzZXJ2ZXIsIG5ldyBPYmplY3ROYW1lKHNlcnZpY2UpKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIGxpc3Qgb2YgPGNvZGU+UmVhbG08L2NvZGU+IG9iamVjdCBuYW1lIHN0cmluZ3MKKyAgICAgKiBmb3IgdGhlIHNwZWNpZmllZCBjb250YWluZXIgKHNlcnZpY2UsIGhvc3QsIG9yIGNvbnRleHQpIG9iamVjdCBuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIG1ic2VydmVyIE1CZWFuU2VydmVyIGZyb20gd2hpY2ggdG8gcmV0cmlldmUgdGhlIGxpc3QKKyAgICAgKiBAcGFyYW0gY29udGFpbmVyIE9iamVjdCBuYW1lIG9mIHRoZSBjb250YWluZXIgZm9yIHdoaWNoIHRvIHNlbGVjdAorICAgICAqICAgICAgICAgICAgICAgICAgcmVhbG1zCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiB0aHJvd24gd2hpbGUgcmV0cmlldmluZyB0aGUgbGlzdAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRSZWFsbXMoTUJlYW5TZXJ2ZXIgbWJzZXJ2ZXIsIE9iamVjdE5hbWUgY29udGFpbmVyKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBPYmplY3ROYW1lIHNlYXJjaCA9IGdldFNlYXJjaE9iamVjdChjb250YWluZXIsICJSZWFsbSIpOworICAgICAgICBBcnJheUxpc3QgcmVhbG1zID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBJdGVyYXRvciBuYW1lcyA9IG1ic2VydmVyLnF1ZXJ5TmFtZXMoc2VhcmNoLCBudWxsKS5pdGVyYXRvcigpOworICAgICAgICB3aGlsZSAobmFtZXMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICByZWFsbXMuYWRkKG5hbWVzLm5leHQoKS50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHJlYWxtcyk7CisgICAgICAgIHJldHVybiAocmVhbG1zKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgbGlzdCBvZiA8Y29kZT5SZWFsbTwvY29kZT4gb2JqZWN0IG5hbWUgc3RyaW5ncworICAgICAqIGZvciB0aGUgc3BlY2lmaWVkIGNvbnRhaW5lciAoc2VydmljZSwgaG9zdCwgb3IgY29udGV4dCkgb2JqZWN0IG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWJzZXJ2ZXIgTUJlYW5TZXJ2ZXIgZnJvbSB3aGljaCB0byByZXRyaWV2ZSB0aGUgbGlzdAorICAgICAqIEBwYXJhbSBjb250YWluZXIgT2JqZWN0IG5hbWUgb2YgdGhlIGNvbnRhaW5lciBmb3Igd2hpY2ggdG8gc2VsZWN0CisgICAgICogICAgICAgICAgICAgICAgICByZWFsbXMKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIHRocm93biB3aGlsZSByZXRyaWV2aW5nIHRoZSBsaXN0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBMaXN0IGdldFJlYWxtcyhNQmVhblNlcnZlciBtYnNlcnZlciwgU3RyaW5nIGNvbnRhaW5lcikKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgcmV0dXJuIChnZXRSZWFsbXMobWJzZXJ2ZXIsIG5ldyBPYmplY3ROYW1lKGNvbnRhaW5lcikpKTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhIGxpc3Qgb2YgPGNvZGU+VmFsdmU8L2NvZGU+IG9iamVjdCBuYW1lIHN0cmluZ3MKKyAgICAgKiBmb3IgdGhlIHNwZWNpZmllZCBjb250YWluZXIgKHNlcnZpY2UsIGhvc3QsIG9yIGNvbnRleHQpIG9iamVjdCBuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIG1ic2VydmVyIE1CZWFuU2VydmVyIGZyb20gd2hpY2ggdG8gcmV0cmlldmUgdGhlIGxpc3QKKyAgICAgKiBAcGFyYW0gY29udGFpbmVyIE9iamVjdCBuYW1lIG9mIHRoZSBjb250YWluZXIgZm9yIHdoaWNoIHRvIHNlbGVjdAorICAgICAqICAgICAgICAgICAgICAgICAgVmFsdmVzCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiB0aHJvd24gd2hpbGUgcmV0cmlldmluZyB0aGUgbGlzdAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRWYWx2ZXMoTUJlYW5TZXJ2ZXIgbWJzZXJ2ZXIsIE9iamVjdE5hbWUgY29udGFpbmVyKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKGNvbnRhaW5lci5nZXREb21haW4oKSk7CisgICAgICAgIHNiLmFwcGVuZCgiOnR5cGU9VmFsdmUiKTsKKyAgICAgICAgU3RyaW5nIHR5cGUgPSBjb250YWluZXIuZ2V0S2V5UHJvcGVydHkoInR5cGUiKTsKKyAgICAgICAgU3RyaW5nIGoyZWVUeXBlID0gY29udGFpbmVyLmdldEtleVByb3BlcnR5KCJqMmVlVHlwZSIpOworICAgICAgICBzYi5hcHBlbmQoVG9tY2F0VHJlZUJ1aWxkZXIuV0lMRENBUkQpOworICAgICAgICBTdHJpbmcgaG9zdCA9ICIiOworICAgICAgICBTdHJpbmcgcGF0aCA9ICIiOworICAgICAgICBTdHJpbmcgbmFtZSA9IGNvbnRhaW5lci5nZXRLZXlQcm9wZXJ0eSgibmFtZSIpOworICAgICAgICBpZiAoKG5hbWUgIT0gbnVsbCkgJiYgKG5hbWUubGVuZ3RoKCkgPiAwKSkgeworICAgICAgICAgICAgLy8gcGFyZW50IGlzIGNvbnRleHQKKyAgICAgICAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZygyKTsKKyAgICAgICAgICAgIGludCBpID0gbmFtZS5pbmRleE9mKCIvIik7CisgICAgICAgICAgICBob3N0ID0gbmFtZS5zdWJzdHJpbmcoMCxpKTsKKyAgICAgICAgICAgIHBhdGggPSBuYW1lLnN1YnN0cmluZyhpKTsKKyAgICAgICAgfSBlbHNlIGlmICgiSG9zdCIuZXF1YWxzKHR5cGUpKSB7CisgICAgICAgICAgICAvLyBwYXJlbnQgaXMgaG9zdAorICAgICAgICAgICAgaG9zdCA9IGNvbnRhaW5lci5nZXRLZXlQcm9wZXJ0eSgiaG9zdCIpOworICAgICAgICB9ICAgIAorICAgICAgICAKKyAgICAgICAgT2JqZWN0TmFtZSBzZWFyY2ggPSBuZXcgT2JqZWN0TmFtZShzYi50b1N0cmluZygpKTsgICAgICAgIAorICAgICAgICBBcnJheUxpc3QgdmFsdmVzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBJdGVyYXRvciBuYW1lcyA9IG1ic2VydmVyLnF1ZXJ5TmFtZXMoc2VhcmNoLCBudWxsKS5pdGVyYXRvcigpOworICAgICAgICB3aGlsZSAobmFtZXMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBPYmplY3ROYW1lIHZhbHZlID0gKE9iamVjdE5hbWUpIG5hbWVzLm5leHQoKTsKKyAgICAgICAgICAgIFN0cmluZyB2cGF0aCA9IHZhbHZlLmdldEtleVByb3BlcnR5KCJwYXRoIik7ICAgICAgICAgICAgCisgICAgICAgICAgICBTdHJpbmcgdmhvc3QgPSB2YWx2ZS5nZXRLZXlQcm9wZXJ0eSgiaG9zdCIpOworICAgICAgICAgICAgCisgICAgICAgICAgICBTdHJpbmcgdmFsdmVUeXBlID0gbnVsbDsKKyAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSAoU3RyaW5nKSAKKyAgICAgICAgICAgICAgICAgICAgbWJzZXJ2ZXIuZ2V0QXR0cmlidXRlKHZhbHZlLCAiY2xhc3NOYW1lIik7CisgICAgICAgICAgICBpbnQgcGVyaW9kID0gY2xhc3NOYW1lLmxhc3RJbmRleE9mKCIuIik7CisgICAgICAgICAgICBpZiAocGVyaW9kID49IDApCisgICAgICAgICAgICAgICAgdmFsdmVUeXBlID0gY2xhc3NOYW1lLnN1YnN0cmluZyhwZXJpb2QgKyAxKTsKKworICAgICAgICAgICAvLyBSZXR1cm4gb25seSB1c2VyLWNvbmZpZ3VyYWJsZSB2YWx2ZXMuCisgICAgICAgICAgIGlmICgiQWNjZXNzTG9nVmFsdmUiLmVxdWFsc0lnbm9yZUNhc2UodmFsdmVUeXBlKSB8fAorICAgICAgICAgICAgICAgIlJlbW90ZUFkZHJWYWx2ZSIuZXF1YWxzSWdub3JlQ2FzZSh2YWx2ZVR5cGUpIHx8CisgICAgICAgICAgICAgICAiUmVtb3RlSG9zdFZhbHZlIi5lcXVhbHNJZ25vcmVDYXNlKHZhbHZlVHlwZSkgfHwgCisgICAgICAgICAgICAgICAiUmVxdWVzdER1bXBlclZhbHZlIi5lcXVhbHNJZ25vcmVDYXNlKHZhbHZlVHlwZSkgfHwKKyAgICAgICAgICAgICAgICJTaW5nbGVTaWduT24iLmVxdWFsc0lnbm9yZUNhc2UodmFsdmVUeXBlKSkgeworICAgICAgICAgICAgLy8gaWYgc2VydmljZSBpcyB0aGUgY29udGFpbmVyLCB0aGVuIHRoZSB2YWx2ZSBuYW1lCisgICAgICAgICAgICAvLyBzaG91bGQgbm90IGNvbnRhaW4gcGF0aCBvciBob3N0ICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKCJTZXJ2aWNlIi5lcXVhbHNJZ25vcmVDYXNlKHR5cGUpKSB7CisgICAgICAgICAgICAgICAgaWYgKCh2cGF0aCA9PSBudWxsKSAmJiAodmhvc3QgPT0gbnVsbCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsdmVzLmFkZCh2YWx2ZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IAorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoIkhvc3QiLmVxdWFsc0lnbm9yZUNhc2UodHlwZSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoKHZwYXRoID09IG51bGwpICYmIChob3N0LmVxdWFsc0lnbm9yZUNhc2Uodmhvc3QpKSkgeyAKKyAgICAgICAgICAgICAgICAgICAgdmFsdmVzLmFkZCh2YWx2ZS50b1N0cmluZygpKTsgICAgICAKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmICgiV2ViTW9kdWxlIi5lcXVhbHNJZ25vcmVDYXNlKGoyZWVUeXBlKSkgeworICAgICAgICAgICAgICAgIGlmICgocGF0aC5lcXVhbHNJZ25vcmVDYXNlKHZwYXRoKSkgJiYgKGhvc3QuZXF1YWxzSWdub3JlQ2FzZSh2aG9zdCkpKSB7CisgICAgICAgICAgICAgICAgICAgIHZhbHZlcy5hZGQodmFsdmUudG9TdHJpbmcoKSk7ICAgICAgCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICB9CisgICAgICAgIH0gICAgICAgIAorICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHZhbHZlcyk7CisgICAgICAgIHJldHVybiAodmFsdmVzKTsKKyAgICB9CisKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBsaXN0IG9mIDxjb2RlPlZhbHZlPC9jb2RlPiBvYmplY3QgbmFtZSBzdHJpbmdzCisgICAgICogZm9yIHRoZSBzcGVjaWZpZWQgY29udGFpbmVyIChzZXJ2aWNlLCBob3N0LCBvciBjb250ZXh0KSBvYmplY3QgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYnNlcnZlciBNQmVhblNlcnZlciBmcm9tIHdoaWNoIHRvIHJldHJpZXZlIHRoZSBsaXN0CisgICAgICogQHBhcmFtIGNvbnRhaW5lciBPYmplY3QgbmFtZSBvZiB0aGUgY29udGFpbmVyIGZvciB3aGljaCB0byBzZWxlY3QKKyAgICAgKiAgICAgICAgICAgICAgICAgIHZhbHZlcworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgdGhyb3duIHdoaWxlIHJldHJpZXZpbmcgdGhlIGxpc3QKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIExpc3QgZ2V0VmFsdmVzKE1CZWFuU2VydmVyIG1ic2VydmVyLCBTdHJpbmcgY29udGFpbmVyKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICByZXR1cm4gKGdldFZhbHZlcyhtYnNlcnZlciwgbmV3IE9iamVjdE5hbWUoY29udGFpbmVyKSkpOworCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiBhIGxpc3Qgb2YgPGNvZGU+U2VydmVyPC9jb2RlPiBvYmplY3QgbmFtZSBzdHJpbmdzLgorICAgICAqCisgICAgICogQHBhcmFtIG1ic2VydmVyIE1CZWFuU2VydmVyIGZyb20gd2hpY2ggdG8gcmV0cmlldmUgdGhlIGxpc3QKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIHRocm93biB3aGlsZSByZXRyaWV2aW5nIHRoZSBsaXN0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBMaXN0IGdldFNlcnZlcnMoTUJlYW5TZXJ2ZXIgbWJzZXJ2ZXIsIFN0cmluZyBkb21haW4pCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIE9iamVjdE5hbWUgc2VhcmNoID0gbmV3IE9iamVjdE5hbWUoZG9tYWluKyI6dHlwZT1TZXJ2ZXIsKiIpOworICAgICAgICBBcnJheUxpc3Qgc2VydmVycyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgSXRlcmF0b3IgbmFtZXMgPSBtYnNlcnZlci5xdWVyeU5hbWVzKHNlYXJjaCwgbnVsbCkuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKG5hbWVzLmhhc05leHQoKSkgeworICAgICAgICAgICAgc2VydmVycy5hZGQobmFtZXMubmV4dCgpLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgICAgIENvbGxlY3Rpb25zLnNvcnQoc2VydmVycyk7CisgICAgICAgIHJldHVybiAoc2VydmVycyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIGxpc3Qgb2YgPGNvZGU+U2VydmljZTwvY29kZT4gb2JqZWN0IG5hbWUgc3RyaW5ncworICAgICAqIGZvciB0aGUgc3BlY2lmaWVkIDxjb2RlPlNlcnZlcjwvY29kZT4gb2JqZWN0IG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWJzZXJ2ZXIgTUJlYW5TZXJ2ZXIgZnJvbSB3aGljaCB0byByZXRyaWV2ZSB0aGUgbGlzdAorICAgICAqIEBwYXJhbSBzZXJ2ZXIgT2JqZWN0IG5hbWUgb2YgdGhlIHNlcnZlciBmb3Igd2hpY2ggdG8gc2VsZWN0IHNlcnZpY2VzCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiB0aHJvd24gd2hpbGUgcmV0cmlldmluZyB0aGUgbGlzdAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRTZXJ2aWNlcyhNQmVhblNlcnZlciBtYnNlcnZlciwgT2JqZWN0TmFtZSBzZXJ2ZXIpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIC8vU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihzZXJ2ZXIuZ2V0RG9tYWluKCkpOworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCIqOnR5cGU9U2VydmljZSwqIik7CisgICAgICAgIC8vc2IuYXBwZW5kKCI6dHlwZT1TZXJ2aWNlLCoiKTsKKyAgICAgICAgT2JqZWN0TmFtZSBzZWFyY2ggPSBuZXcgT2JqZWN0TmFtZShzYi50b1N0cmluZygpKTsKKyAgICAgICAgQXJyYXlMaXN0IHNlcnZpY2VzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBJdGVyYXRvciBuYW1lcyA9IG1ic2VydmVyLnF1ZXJ5TmFtZXMoc2VhcmNoLCBudWxsKS5pdGVyYXRvcigpOworICAgICAgICB3aGlsZSAobmFtZXMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBzZXJ2aWNlcy5hZGQobmFtZXMubmV4dCgpLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgICAgIENvbGxlY3Rpb25zLnNvcnQoc2VydmljZXMpOworICAgICAgICByZXR1cm4gKHNlcnZpY2VzKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgbGlzdCBvZiA8Y29kZT5TZXJ2aWNlPC9jb2RlPiBvYmplY3QgbmFtZSBzdHJpbmdzCisgICAgICogZm9yIHRoZSBzcGVjaWZpZWQgPGNvZGU+U2VydmVyPC9jb2RlPiBvYmplY3QgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYnNlcnZlciBNQmVhblNlcnZlciBmcm9tIHdoaWNoIHRvIHJldHJpZXZlIHRoZSBsaXN0CisgICAgICogQHBhcmFtIHNlcnZlciBPYmplY3QgbmFtZSBvZiB0aGUgc2VydmVyIGZvciB3aGljaCB0byBzZWxlY3Qgc2VydmljZXMKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIHRocm93biB3aGlsZSByZXRyaWV2aW5nIHRoZSBsaXN0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBMaXN0IGdldFNlcnZpY2VzKE1CZWFuU2VydmVyIG1ic2VydmVyLCBTdHJpbmcgc2VydmVyKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICByZXR1cm4gKGdldFNlcnZpY2VzKG1ic2VydmVyLCBuZXcgT2JqZWN0TmFtZShzZXJ2ZXIpKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgIDxjb2RlPlNlcnZpY2U8L2NvZGU+IG9iamVjdCBuYW1lIHN0cmluZworICAgICAqIHRoYXQgdGhlIGFkbWluIGFwcCBiZWxvbmdzIHRvLgorICAgICAqCisgICAgICogQHBhcmFtIG1ic2VydmVyIE1CZWFuU2VydmVyIGZyb20gd2hpY2ggdG8gcmV0cmlldmUgdGhlIGxpc3QKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBIdHRwIHJlcXVlc3QKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIHRocm93biB3aGlsZSByZXRyaWV2aW5nIHRoZSBsaXN0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QWRtaW5BcHBTZXJ2aWNlCisgICAgICAgIChNQmVhblNlcnZlciBtYnNlcnZlciwgU3RyaW5nIGRvbWFpbiwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIFN0cmluZyBhZG1pbkRvbWFpbiA9IFRvbWNhdFRyZWVCdWlsZGVyLkRFRkFVTFRfRE9NQUlOOworICAgICAgICAvLyBHZXQgdGhlIGFkbWluIGFwcCdzIHNlcnZpY2UgbmFtZQorICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKGFkbWluRG9tYWluKTsKKyAgICAgICAgc2IuYXBwZW5kKCI6dHlwZT1TZXJ2aWNlLCoiKTsKKyAgICAgICAgT2JqZWN0TmFtZSBzZWFyY2ggPSBuZXcgT2JqZWN0TmFtZShzYi50b1N0cmluZygpKTsKKyAgICAgICAgSXRlcmF0b3IgbmFtZXMgPSBtYnNlcnZlci5xdWVyeU5hbWVzKHNlYXJjaCwgbnVsbCkuaXRlcmF0b3IoKTsKKyAgICAgICAgU3RyaW5nIHNlcnZpY2UgPSBudWxsOworICAgICAgICB3aGlsZSAobmFtZXMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBzZXJ2aWNlID0gKChPYmplY3ROYW1lKW5hbWVzLm5leHQoKSkuZ2V0S2V5UHJvcGVydHkoInNlcnZpY2VOYW1lIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNlcnZpY2U7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgIDxjb2RlPkhvc3Q8L2NvZGU+IG9iamVjdCBuYW1lIHN0cmluZworICAgICAqIHRoYXQgdGhlIGFkbWluIGFwcCBiZWxvbmdzIHRvLgorICAgICAqCisgICAgICogQHBhcmFtIG1ic2VydmVyIE1CZWFuU2VydmVyIGZyb20gd2hpY2ggdG8gcmV0cmlldmUgdGhlIGxpc3QKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBIdHRwIHJlcXVlc3QKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIHRocm93biB3aGlsZSByZXRyaWV2aW5nIHRoZSBsaXN0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QWRtaW5BcHBIb3N0CisgICAgICAgIChNQmVhblNlcnZlciBtYnNlcnZlciwgU3RyaW5nIGRvbWFpbiwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAKKyAgICAgICAgLy8gR2V0IHRoZSBhZG1pbiBhcHAncyBob3N0IG5hbWUKKyAgICAgICAgU3RyaW5nIGFkbWluRG9tYWluID0gVG9tY2F0VHJlZUJ1aWxkZXIuREVGQVVMVF9ET01BSU47CisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoYWRtaW5Eb21haW4pOworICAgICAgICBzYi5hcHBlbmQoIjpqMmVlVHlwZT1XZWJNb2R1bGUsKiIpOyAKKyAgICAgICAgT2JqZWN0TmFtZSBzZWFyY2ggPSBuZXcgT2JqZWN0TmFtZShzYi50b1N0cmluZygpKTsKKyAgICAgICAgSXRlcmF0b3IgbmFtZXMgPSBtYnNlcnZlci5xdWVyeU5hbWVzKHNlYXJjaCwgbnVsbCkuaXRlcmF0b3IoKTsKKyAgICAgICAgU3RyaW5nIGNvbnRleHRQYXRoID0gcmVxdWVzdC5nZXRDb250ZXh0UGF0aCgpOworICAgICAgICBTdHJpbmcgaG9zdCA9IG51bGw7CisgICAgICAgIFN0cmluZyBuYW1lID0gbnVsbDsKKyAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9IG51bGw7CisgICAgICAgIHdoaWxlIChuYW1lcy5oYXNOZXh0KCkpIHsgICAgICAgCisgICAgICAgICAgICBuYW1lID0gbmFtZXMubmV4dCgpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICBvbmFtZSA9IG5ldyBPYmplY3ROYW1lKG5hbWUpOworICAgICAgICAgICAgaG9zdCA9IG9uYW1lLmdldEtleVByb3BlcnR5KCJuYW1lIik7CisgICAgICAgICAgICBob3N0ID0gaG9zdC5zdWJzdHJpbmcoMik7CisgICAgICAgICAgICBpbnQgaSA9IGhvc3QuaW5kZXhPZigiLyIpOworICAgICAgICAgICAgaWYgKGNvbnRleHRQYXRoLmVxdWFscyhob3N0LnN1YnN0cmluZyhpKSkpIHsKKyAgICAgICAgICAgICAgICBob3N0ID0gaG9zdC5zdWJzdHJpbmcoMCxpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gaG9zdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaG9zdDsKKworICAgIH0KKworICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiBzZWFyY2ggb2JqZWN0IG5hbWUgdG8gYmUgdXNlZCB0byBxdWVyeS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250YWluZXIgb2JqZWN0IG5hbWUgdG8gcXVlcnkKKyAgICAgKiBAcGFyYW0gdHlwZSB0eXBlIG9mIHRoZSBjb21wb25lbnQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbiBpZiB0aHJvd24gd2hpbGUgcmV0cmlldmluZyB0aGUgbGlzdAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0TmFtZSBnZXRTZWFyY2hPYmplY3QoT2JqZWN0TmFtZSBjb250YWluZXIsIFN0cmluZyB0eXBlKSAgCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgCisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoY29udGFpbmVyLmdldERvbWFpbigpKTsKKyAgICAgICAgc2IuYXBwZW5kKCI6dHlwZT0iK3R5cGUpOworICAgICAgICBTdHJpbmcgY29udGFpbmVyVHlwZSA9IGNvbnRhaW5lci5nZXRLZXlQcm9wZXJ0eSgidHlwZSIpOworICAgICAgICBTdHJpbmcgbmFtZSA9IGNvbnRhaW5lci5nZXRLZXlQcm9wZXJ0eSgibmFtZSIpOworICAgICAgICBpZiAoKG5hbWUgIT0gbnVsbCkgJiYgKG5hbWUubGVuZ3RoKCkgPiAwKSkgeworICAgICAgICAgICAgLy8gcGFyZW50IGlzIGNvbnRleHQKKyAgICAgICAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZygyKTsKKyAgICAgICAgICAgIGludCBpID0gbmFtZS5pbmRleE9mKCIvIik7CisgICAgICAgICAgICBTdHJpbmcgaG9zdCA9IG5hbWUuc3Vic3RyaW5nKDAsaSk7CisgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IG5hbWUuc3Vic3RyaW5nKGkpOworICAgICAgICAgICAgc2IuYXBwZW5kKCIscGF0aD0iKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChwYXRoKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiLGhvc3Q9Iik7CisgICAgICAgICAgICBzYi5hcHBlbmQoaG9zdCk7CisgICAgICAgIH0gZWxzZSBpZiAoIkhvc3QiLmVxdWFscyhjb250YWluZXJUeXBlKSkgeworICAgICAgICAgICAgLy8gcGFyZW50IGlzIGhvc3QKKyAgICAgICAgICAgIFN0cmluZyBob3N0ID0gY29udGFpbmVyLmdldEtleVByb3BlcnR5KCJob3N0Iik7CisgICAgICAgICAgICBzYi5hcHBlbmQoIixob3N0PSIpOworICAgICAgICAgICAgc2IuYXBwZW5kKGhvc3QpOworICAgICAgICB9ICAgIAorICAgICAgICAKKyAgICAgICAgcmV0dXJuIG5ldyBPYmplY3ROYW1lKHNiLnRvU3RyaW5nKCkpOworICAgICAgICAKKyAgICB9CisgICAgCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vTG9nT3V0QWN0aW9uLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vTG9nT3V0QWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU5OWI3OAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9Mb2dPdXRBY3Rpb24uamF2YQpAQCAtMCwwICsxLDgyIEBACisvKgorICogQ29weXJpZ2h0IDIwMDEsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbjsKKworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRXJyb3JzOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3J3YXJkOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworCisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgPHN0cm9uZz5BY3Rpb248L3N0cm9uZz4gdGhhdCBsb2dzIG91dCBvZiB0aGUgY3VycmVudAorICogc2Vzc2lvbiBhbmQgcmV0dXJucyB0byB0aGUgbWFpbiBtZW51ICh3aGljaCB3aWxsIHRyaWdnZXIgdGhlIGxvZ2luIGZvcm0pLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgTG9nT3V0QWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIHNwZWNpZmllZCBIVFRQIHJlcXVlc3QsIGFuZCBjcmVhdGUgdGhlIGNvcnJlc3BvbmRpbmcgSFRUUAorICAgICAqIHJlc3BvbnNlIChvciBmb3J3YXJkIHRvIGFub3RoZXIgd2ViIGNvbXBvbmVudCB0aGF0IHdpbGwgY3JlYXRlIGl0KS4KKyAgICAgKiBSZXR1cm4gYW4gPGNvZGU+QWN0aW9uRm9yd2FyZDwvY29kZT4gaW5zdGFuY2UgZGVzY3JpYmluZyB3aGVyZSBhbmQgaG93CisgICAgICogY29udHJvbCBzaG91bGQgYmUgZm9yd2FyZGVkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcmVzcG9uc2UgaGFzCisgICAgICogYWxyZWFkeSBiZWVuIGNvbXBsZXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBBY3Rpb25NYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gYWN0aW9uRm9ybSBUaGUgb3B0aW9uYWwgQWN0aW9uRm9ybSBiZWFuIGZvciB0aGlzIHJlcXVlc3QgKGlmIGFueSkKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgSFRUUCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBIVFRQIHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBleGNlcHRpb24gb2NjdXJzCisgICAgICovCisgICAgcHVibGljIEFjdGlvbkZvcndhcmQgcGVyZm9ybShBY3Rpb25NYXBwaW5nIG1hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb25Gb3JtIGZvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gSW52YWxpZGF0ZSB0aGUgY3VycmVudCBzZXNzaW9uIGFuZCBjcmVhdGUgYSBuZXcgb25lCisgICAgICAgIEh0dHBTZXNzaW9uIHNlc3Npb24gPSByZXF1ZXN0LmdldFNlc3Npb24oKTsKKyAgICAgICAgc2Vzc2lvbi5pbnZhbGlkYXRlKCk7CisgICAgICAgIHNlc3Npb24gPSByZXF1ZXN0LmdldFNlc3Npb24odHJ1ZSk7CisKKyAgICAgICAgLy8gRm9yd2FyZCBjb250cm9sIGJhY2sgdG8gdGhlIG1haW4gbWVudQorICAgICAgICByZXR1cm4gKG1hcHBpbmcuZmluZEZvcndhcmQoIk1haW4gTWVudSIpKTsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vUm93VGFnLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vUm93VGFnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBkMjIzNAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9Sb3dUYWcuamF2YQpAQCAtMCwwICsxLDE5OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAxLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW47CisKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMRW5jb2RlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLkpzcEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC5Kc3BXcml0ZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AuUGFnZUNvbnRleHQ7CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0LkJvZHlUYWdTdXBwb3J0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWc7CisKKworLyoqCisgKiA8cD5OZXN0ZWQgdGFnIHRoYXQgcmVwcmVzZW50cyBhbiBpbmRpdmlkdWFsICJpbnN0YW50IHRhYmxlIi4gIFRoaXMgdGFnCisgKiBpcyB2YWxpZCA8c3Ryb25nPm9ubHk8L3N0cm9uZz4gd2hlbiBuZXN0ZWQgd2l0aGluIGFuIFRhYmxlVGFnIHRhZy4KKyAqIFRoaXMgdGFnIGhhcyB0aGUgZm9sbG93aW5nIHVzZXItc2V0dGFibGUgYXR0cmlidXRlczo8L3A+CisgKiA8dWw+CisgKiA8bGk+PHN0cm9uZz5oZWFkZXI8L3N0cm9uZz4gLSBJcyB0aGlzICBhIGhlYWRlciByb3c/PC9saT4KKyAqIDxsaT48c3Ryb25nPmxhYmVsPC9zdHJvbmc+IC0gbGFiZWwgdG8gYmUgZGlzcGxheWVkLjwvbGk+CisgKiA8bGk+PHN0cm9uZz5kYXRhPC9zdHJvbmc+IC0gZGF0YSBvZiB0aGUgdGFibGUgZGF0YSBlbGVtZW50LjwvbGk+CisgKiA8bGk+PHN0cm9uZz5sYWJlbFN0eWxlPC9zdHJvbmc+IC0gU3R5bGUgdG8gYmUgYXBwbGllZCB0byB0aGUKKyAqIGxhYmVsIHRhYmxlIGRhdGEgZWxlbWVudC48L2xpPgorICogPGxpPjxzdHJvbmc+ZGF0YVN0eWxlPC9zdHJvbmc+IC0gU3R5bGUgdG8gYmUgYXBwbGllZCB0byB0aGUgZGF0YSB0YWJsZQorICogZGF0YSBlbGVtZW50LjwvbGk+CisgKgorICogPC91bD4KKyAqCisgKiBAYXV0aG9yIE1hbnZlZW4gS2F1cgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgUm93VGFnIGV4dGVuZHMgQm9keVRhZ1N1cHBvcnQgeworICAgIAorICAgIC8qKgorICAgICAqIElzIHRoaXMgdGhlIGhlYWRlciByb3c/CisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaGVhZGVyID0gZmFsc2U7CisgICAgCisgICAgcHVibGljIGJvb2xlYW4gZ2V0SGVhZGVyKCkgeworICAgICAgICByZXR1cm4gKHRoaXMuaGVhZGVyKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgc2V0SGVhZGVyKGJvb2xlYW4gaGVhZGVyKSB7CisgICAgICAgIHRoaXMuaGVhZGVyID0gaGVhZGVyOworICAgIH0gICAgCisgICAgCisgICAgLyoqCisgICAgICogVGhlIGxhYmVsIHRoYXQgd2lsbCBiZSByZW5kZXJlZCBmb3IgdGhpcyByb3cncyB0YWJsZSBkYXRhIGVsZW1lbnQuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBsYWJlbCA9IG51bGw7CisgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRMYWJlbChTdHJpbmcgbGFiZWwpIHsKKyAgICAgICAgdGhpcy5sYWJlbCA9IGxhYmVsOworICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgZGF0YSBvZiB0aGUgdGFibGUgZGF0YSBlbGVtZW50IG9mIHRoaXMgcm93LgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZGF0YSA9IG51bGw7CisgICAgCisgICAgcHVibGljIHZvaWQgc2V0RGF0YShTdHJpbmcgZGF0YSkgeworICAgICAgICB0aGlzLmRhdGEgPSBkYXRhOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgc3R5bGUgb2YgdGhlIGxhYmVsLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgbGFiZWxTdHlsZSA9IG51bGw7CisgICAgCisgICAgcHVibGljIFN0cmluZyBnZXRMYWJlbFN0eWxlKCkgeworICAgICAgICByZXR1cm4gKHRoaXMubGFiZWxTdHlsZSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNldExhYmVsU3R5bGUoU3RyaW5nIGxhYmVsU3R5bGUpIHsKKyAgICAgICAgdGhpcy5sYWJlbFN0eWxlID0gbGFiZWxTdHlsZTsKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogVGhlIHN0eWxlIG9mIHRoZSBkYXRhLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZGF0YVN0eWxlID0gbnVsbDsKKyAgICAKKyAgICBwdWJsaWMgU3RyaW5nIGdldGRhdGFTdHlsZSgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLmRhdGFTdHlsZSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNldGRhdGFTdHlsZShTdHJpbmcgZGF0YVN0eWxlKSB7CisgICAgICAgIHRoaXMuZGF0YVN0eWxlID0gZGF0YVN0eWxlOworICAgIH0KKyAKKyAgICAvKioKKyAgICAgKiBUaGUgc3R5bGVJZCBmb3IgdGhlIGxhYmVsLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgc3R5bGVJZCA9IG51bGw7CisgICAgCisgICAgcHVibGljIFN0cmluZyBnZXRTdHlsZUlkKCkgeworICAgICAgICByZXR1cm4gKHRoaXMuc3R5bGVJZCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNldFN0eWxlSWQoU3RyaW5nIHN0eWxlSWQpIHsKKyAgICAgICAgdGhpcy5zdHlsZUlkID0gc3R5bGVJZDsKKyAgICB9CisgICAgCisgICAgICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIHN0YXJ0IG9mIHRoaXMgdGFnLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBKc3BFeGNlcHRpb24gaWYgYSBKU1AgZXhjZXB0aW9uIGhhcyBvY2N1cnJlZAorICAgICAqLworICAgIHB1YmxpYyBpbnQgZG9TdGFydFRhZygpIHRocm93cyBKc3BFeGNlcHRpb24geworICAgICAgICAKKyAgICAgICAgIC8vIERvIG5vIGZ1cnRoZXIgcHJvY2Vzc2luZyBmb3Igbm93CisgICAgICAgIHJldHVybiAoRVZBTF9CT0RZX1RBRyk7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBib2R5IHRleHQgb2YgdGhpcyB0YWcgKGlmIGFueSkuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEpzcEV4Y2VwdGlvbiBpZiBhIEpTUCBleGNlcHRpb24gaGFzIG9jY3VycmVkCisgICAgICovCisgICAgcHVibGljIGludCBkb0FmdGVyQm9keSgpIHRocm93cyBKc3BFeGNlcHRpb24geworICAgICAgIAorICAgICAgICByZXR1cm4gKFNLSVBfQk9EWSk7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZWNvcmQgdGhpcyBhY3Rpb24gd2l0aCBvdXIgc3Vycm91bmRpbmcgQWN0aW9uc1RhZyBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSnNwRXhjZXB0aW9uIGlmIGEgcHJvY2Vzc2luZyBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGRvRW5kVGFnKCkgdGhyb3dzIEpzcEV4Y2VwdGlvbiB7CisgICAgICAgIAorICAgICAgICAvLyBGaW5kIG91ciBwYXJlbnQgVGFibGVUYWcgaW5zdGFuY2UKKyAgICAgICAgVGFnIHBhcmVudCA9IGdldFBhcmVudCgpOworICAgICAgICB3aGlsZSAoKHBhcmVudCAhPSBudWxsKSAmJiAhKHBhcmVudCBpbnN0YW5jZW9mIFRhYmxlVGFnKSkgeworICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50LmdldFBhcmVudCgpOworICAgICAgICB9CisgICAgICAgIGlmIChwYXJlbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEpzcEV4Y2VwdGlvbigiTXVzdCBiZSBuZXN0ZWQgaW4gYSBUYWJsZVRhZyBpbnN0YW5jZSIpOworICAgICAgICB9CisgICAgICAgIFRhYmxlVGFnIHRhYmxlID0gKFRhYmxlVGFnKSBwYXJlbnQ7CisgICAgICAgIAorICAgICAgICAvLyBSZWdpc3RlciB0aGUgaW5mb3JtYXRpb24gZm9yIHRoZSByb3cgcmVwcmVzZW50ZWQgYnkKKyAgICAgICAgLy8gdGhpcyByb3cKKyAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSA9CisgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlKSBwYWdlQ29udGV4dC5nZXRSZXNwb25zZSgpOworICAgICAgICB0YWJsZS5hZGRSb3coaGVhZGVyLCBsYWJlbCwgZGF0YSwgbGFiZWxTdHlsZSwgZGF0YVN0eWxlLCBzdHlsZUlkKTsKKyAgICAgICAgCisgICAgICAgIHJldHVybiAoRVZBTF9QQUdFKTsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFJlbGVhc2UgYWxsIHN0YXRlIGluZm9ybWF0aW9uIHNldCBieSB0aGlzIHRhZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWxlYXNlKCkgeworICAgICAgICAKKyAgICAgICAgLy9zdXBlci5yZWxlYXNlKCk7CisgICAgICAgIAorICAgICAgICB0aGlzLmhlYWRlcj0gZmFsc2U7CisgICAgICAgIHRoaXMubGFiZWwgPSBudWxsOworICAgICAgICB0aGlzLmRhdGEgPSBudWxsOworICAgICAgICB0aGlzLmxhYmVsU3R5bGUgPSBudWxsOworICAgICAgICB0aGlzLmRhdGFTdHlsZSA9IG51bGw7CisgICAgICAgIHRoaXMuc3R5bGVJZCA9IG51bGw7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9TZXRMb2NhbGVBY3Rpb24uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9TZXRMb2NhbGVBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGQyZTA4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL1NldExvY2FsZUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTAwIEBACisvKgorICogQ29weXJpZ2h0IDIwMDEsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbjsKKworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuR2xvYmFsczsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25FcnJvcnM7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcndhcmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CisKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiA8c3Ryb25nPkFjdGlvbjwvc3Ryb25nPiB0aGF0IHNldHMgdGhlIGN1cnJlbnQgTG9jYWxlCisgKiB0byB0aGUgb25lIHNwZWNpZmllZCBieSB0aGUgPGNvZGU+bG9jYWxlPC9jb2RlPiByZXF1ZXN0IHBhcmFtZXRlci4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIFNldExvY2FsZUFjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBzcGVjaWZpZWQgSFRUUCByZXF1ZXN0LCBhbmQgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIEhUVFAKKyAgICAgKiByZXNwb25zZSAob3IgZm9yd2FyZCB0byBhbm90aGVyIHdlYiBjb21wb25lbnQgdGhhdCB3aWxsIGNyZWF0ZSBpdCkuCisgICAgICogUmV0dXJuIGFuIDxjb2RlPkFjdGlvbkZvcndhcmQ8L2NvZGU+IGluc3RhbmNlIGRlc2NyaWJpbmcgd2hlcmUgYW5kIGhvdworICAgICAqIGNvbnRyb2wgc2hvdWxkIGJlIGZvcndhcmRlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHJlc3BvbnNlIGhhcworICAgICAqIGFscmVhZHkgYmVlbiBjb21wbGV0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgQWN0aW9uTWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIGFjdGlvbkZvcm0gVGhlIG9wdGlvbmFsIEFjdGlvbkZvcm0gYmVhbiBmb3IgdGhpcyByZXF1ZXN0IChpZiBhbnkpCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIEhUVFAgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgSFRUUCByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXhjZXB0aW9uIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBBY3Rpb25Gb3J3YXJkIHBlcmZvcm0oQWN0aW9uTWFwcGluZyBtYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uRm9ybSBmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIFdoYXQgbG9jYWxlIGRvZXMgdGhlIHVzZXIgd2FudCB0byBzd2l0Y2ggdG8/CisgICAgICAgIFN0cmluZyByZXF1ZXN0ZWRMb2NhbGUgPSAoKFNldExvY2FsZUZvcm0pIGZvcm0pLmdldExvY2FsZSgpOworCisgICAgICAgIC8vIFN3aXRjaCB0byB0aGUgc3BlY2lmaWVkIGxvY2FsZSwgaWYgaXQgZXhpc3RzCisgICAgICAgIGlmIChyZXF1ZXN0ZWRMb2NhbGUgIT0gbnVsbCkgeworICAgICAgICAgICAgQXBwbGljYXRpb25Mb2NhbGVzIGxvY2FsZXMgPSAoQXBwbGljYXRpb25Mb2NhbGVzKQorICAgICAgICAgICAgICAgIGdldFNlcnZsZXQoKS5nZXRTZXJ2bGV0Q29udGV4dCgpLmdldEF0dHJpYnV0ZQorICAgICAgICAgICAgICAgIChBcHBsaWNhdGlvblNlcnZsZXQuTE9DQUxFU19LRVkpOworICAgICAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBsb2NhbGVzLmdldFN1cHBvcnRlZExvY2FsZXMoKS5pdGVyYXRvcigpOworICAgICAgICAgICAgTG9jYWxlIGN1cnJlbnRMb2NhbGUgPSBudWxsOworICAgICAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIGN1cnJlbnRMb2NhbGUgPSAoTG9jYWxlKSBpdGVyYXRvci5uZXh0KCk7CisgICAgICAgICAgICAgICAgaWYgKHJlcXVlc3RlZExvY2FsZS5lcXVhbHMoY3VycmVudExvY2FsZS50b1N0cmluZygpKSkgeworICAgICAgICAgICAgICAgICAgICBIdHRwU2Vzc2lvbiBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uKCk7CisgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uc2V0QXR0cmlidXRlKEdsb2JhbHMuTE9DQUxFX0tFWSwgY3VycmVudExvY2FsZSk7CisgICAgICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBmb3JtIGJlYW4gc28gaXQgd2lsbCBnZXQgcmVjcmVhdGVkIG5leHQgdGltZQorICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLnJlbW92ZUF0dHJpYnV0ZShtYXBwaW5nLmdldEF0dHJpYnV0ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gRm9yd2FyZCBjb250cm9sIGJhY2sgdG8gdGhlIG1haW4gbWVudQorICAgICAgICByZXR1cm4gKG1hcHBpbmcuZmluZEZvcndhcmQoIk1haW4gTWVudSIpKTsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vU2V0TG9jYWxlRm9ybS5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL1NldExvY2FsZUZvcm0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjM5ZTcxCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL1NldExvY2FsZUZvcm0uamF2YQpAQCAtMCwwICsxLDg2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDEsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbjsKKworCitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uQmluZGluZ0V2ZW50OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbkJpbmRpbmdMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5HbG9iYWxzOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworCisKKy8qKgorICogRm9ybSBiZWFuIGZvciB0aGUgc2V0IGxvY2FsZSBwYWdlLiAgVGhlIGFjdHVhbCB2YWx1ZSBpcyBjb3BpZWQgd2hlbiB0aGlzCisgKiBiZWFuIGlzIGFkZGVkIGFzIGEgc2Vzc2lvbiBhdHRyaWJ1dGUuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBTZXRMb2NhbGVGb3JtCisgICAgZXh0ZW5kcyBBY3Rpb25Gb3JtCisgICAgaW1wbGVtZW50cyBIdHRwU2Vzc2lvbkJpbmRpbmdMaXN0ZW5lciB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgbG9jYWxlIHdlIGFyZSBjdXJyZW50bHkgcnVubmluZy4KKyAgICAgKi8KKyAgICBTdHJpbmcgbG9jYWxlID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxlKCkgeworICAgICAgICByZXR1cm4gKHRoaXMubG9jYWxlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRMb2NhbGUoU3RyaW5nIGxvY2FsZSkgeworICAgICAgICB0aGlzLmxvY2FsZSA9IGxvY2FsZTsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSHR0cFNlc3Npb25CaW5kaW5nTGlzdGVuZXIgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBXaGVuIHRoaXMgZm9ybSBiZWFuIGlzIGJvdW5kIGludG8gdGhlIHNlc3Npb24sIHBpY2sgdXAgdGhlIHVzZXIncworICAgICAqIGN1cnJlbnQgTG9jYWxlIG9iamVjdCBhbmQgc2V0IHRoZSBjdXJyZW50IHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHZhbHVlQm91bmQoSHR0cFNlc3Npb25CaW5kaW5nRXZlbnQgZXZlbnQpIHsKKworICAgICAgICBIdHRwU2Vzc2lvbiBzZXNzaW9uID0gZXZlbnQuZ2V0U2Vzc2lvbigpOworICAgICAgICBMb2NhbGUgY3VycmVudCA9IChMb2NhbGUpIHNlc3Npb24uZ2V0QXR0cmlidXRlKEdsb2JhbHMuTE9DQUxFX0tFWSk7CisgICAgICAgIGlmIChjdXJyZW50ICE9IG51bGwpCisgICAgICAgICAgICBsb2NhbGUgPSBjdXJyZW50LnRvU3RyaW5nKCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIE5vIGFjdGlvbiBpcyByZXF1aXJlZCB3aGVuIHRoaXMgb2JqZWN0IGlzIHVuYm91bmQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdmFsdWVVbmJvdW5kKEh0dHBTZXNzaW9uQmluZGluZ0V2ZW50IGV2ZW50KSB7CisKKyAgICAgICAgbG9jYWxlID0gbnVsbDsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vU2V0VXBUcmVlQWN0aW9uLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vU2V0VXBUcmVlQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk5NWYzMAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9TZXRVcFRyZWVBY3Rpb24uamF2YQpAQCAtMCwwICsxLDE0NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAxLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW47CisKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25FcnJvcnM7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcndhcmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CisKKworLyoqCisgKiBUZXN0IDxjb2RlPkFjdGlvbjwvY29kZT4gc2V0cyB1cCAgdHJlZSBjb250cm9sIGRhdGEgc3RydWN0dXJlCisgKiBmb3IgdHJlZSB3aWRnZXQKKyAqCisgKiBAYXV0aG9yIEphem1pbiBKb25zb24KKyAqIEBhdXRob3IgTWFudmVlbiBLYXVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBTZXRVcFRyZWVBY3Rpb24gZXh0ZW5kcyBBY3Rpb24geworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9NQUlOX0tFWSA9ICJkb21haW4iOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOSVRfUExVR0lOX01BWCA9IDEwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSRUVCVUlMREVSX0tFWSA9ICJ0cmVlYnVpbGRlcnMiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJPT1ROT0RFTkFNRV9LRVkgPSAicm9vdG5vZGVuYW1lIjsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisgICAgLyoqCisgICAgICogUHJvY2VzcyB0aGUgc3BlY2lmaWVkIEhUVFAgcmVxdWVzdCwgYW5kIGNyZWF0ZSB0aGUgY29ycmVzcG9uZGluZyBIVFRQCisgICAgICogcmVzcG9uc2UgKG9yIGZvcndhcmQgdG8gYW5vdGhlciB3ZWIgY29tcG9uZW50IHRoYXQgd2lsbCBjcmVhdGUgaXQpLgorICAgICAqIFJldHVybiBhbiA8Y29kZT5BY3Rpb25Gb3J3YXJkPC9jb2RlPiBpbnN0YW5jZSBkZXNjcmliaW5nIHdoZXJlIGFuZCBob3cKKyAgICAgKiBjb250cm9sIHNob3VsZCBiZSBmb3J3YXJkZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSByZXNwb25zZSBoYXMKKyAgICAgKiBhbHJlYWR5IGJlZW4gY29tcGxldGVkLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIEFjdGlvbk1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSBhY3Rpb25Gb3JtIFRoZSBvcHRpb25hbCBBY3Rpb25Gb3JtIGJlYW4gZm9yIHRoaXMgcmVxdWVzdCAoaWYgYW55KQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBIVFRQIHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIEhUVFAgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0IGV4Y2VwdGlvbiBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgQWN0aW9uRm9yd2FyZCBwZXJmb3JtKEFjdGlvbk1hcHBpbmcgbWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbkZvcm0gZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICBBcHBsaWNhdGlvblNlcnZsZXQgc2VydmxldCA9IChBcHBsaWNhdGlvblNlcnZsZXQpZ2V0U2VydmxldCgpOworCisgICAgICAgIC8vIEdldHRpbmcgaW5pdCBwYXJtcyBmcm9tIHdlYi54bWwKKworICAgICAgICAvLyBHZXQgdGhlIHN0cmluZyB0byBiZSBkaXNwbGF5ZWQgYXMgcm9vdCBub2RlIHdoaWxlIHJlbmRlcmluZyB0aGUgdHJlZQorICAgICAgICBTdHJpbmcgcm9vdG5vZGVOYW1lID0gCisgICAgICAgICAgICAoU3RyaW5nKXNlcnZsZXQuZ2V0U2VydmxldENvbmZpZygpLmdldEluaXRQYXJhbWV0ZXIoUk9PVE5PREVOQU1FX0tFWSk7CisgICAgICAgIAorICAgICAgICBTdHJpbmcgdHJlZUJ1aWxkZXJzU3RyICA9CisgICAgICAgICAgICAoU3RyaW5nKXNlcnZsZXQuZ2V0U2VydmxldENvbmZpZygpLmdldEluaXRQYXJhbWV0ZXIoVFJFRUJVSUxERVJfS0VZKTsKKyAgICAgICAgCisgICAgICAgIFN0cmluZyBkb21haW4gID0KKyAgICAgICAgICAgIChTdHJpbmcpc2VydmxldC5nZXRTZXJ2bGV0Q29uZmlnKCkuZ2V0SW5pdFBhcmFtZXRlcihET01BSU5fS0VZKTsKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAvLyBNYWtlIHRoZSByb290IG5vZGUgYW5kIHRyZWUgY29udHJvbAorICAgICAgICAKKyAgICAgICAgLy8gVGhlIHJvb3Qgbm9kZSBnZXRzIHJlbmRlcmVkIG9ubHkgaWYgaXRzIHZhbHVlIAorICAgICAgICAvLyBpcyBzZXQgYXMgYW4gaW5pdC1wYXJhbSBpbiB3ZWIueG1sCisgICAgICAgIAorICAgICAgICBUcmVlQ29udHJvbE5vZGUgcm9vdCA9CisgICAgICAgICAgICBuZXcgVHJlZUNvbnRyb2xOb2RlKCJST09ULU5PREUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCByb290bm9kZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXRVcFRyZWUuZG8/c2VsZWN0PVJPT1QtTk9ERSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250ZW50IiwgdHJ1ZSwgZG9tYWluKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgVHJlZUNvbnRyb2wgY29udHJvbCA9IG5ldyBUcmVlQ29udHJvbChyb290KTsKKyAgICAgICAgCisgICAgICAgIGlmKHRyZWVCdWlsZGVyc1N0ciAhPSBudWxsKSB7CisgICAgICAgICAgICBDbGFzcyB0cmVlQnVpbGRlckltcGw7CisgICAgICAgICAgICBUcmVlQnVpbGRlciB0cmVlQnVpbGRlckJhc2U7CisKKyAgICAgICAgICAgIEFycmF5TGlzdCB0cmVlQnVpbGRlcnMgPSBuZXcgQXJyYXlMaXN0KElOSVRfUExVR0lOX01BWCk7CisgICAgICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgICAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHRyZWVCdWlsZGVyc1N0ciwgIiwiKTsKKyAgICAgICAgICAgIHdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKKyAgICAgICAgICAgICAgICB0cmVlQnVpbGRlcnMuYWRkKHN0Lm5leHRUb2tlbigpLnRyaW0oKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKHRyZWVCdWlsZGVycy5zaXplKCkgPT0gMCkKKyAgICAgICAgICAgICAgICB0cmVlQnVpbGRlcnMuYWRkKHRyZWVCdWlsZGVyc1N0ci50cmltKCkpOworCisgICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCB0cmVlQnVpbGRlcnMuc2l6ZSgpOyBpKyspIHsKKworICAgICAgICAgICAgICAgIHRyeXsKKyAgICAgICAgICAgICAgICAgICAgdHJlZUJ1aWxkZXJJbXBsID0gQ2xhc3MuZm9yTmFtZSgoU3RyaW5nKXRyZWVCdWlsZGVycy5nZXQoaSkpOworICAgICAgICAgICAgICAgICAgICB0cmVlQnVpbGRlckJhc2UgPQorICAgICAgICAgICAgICAgICAgICAgICAgKFRyZWVCdWlsZGVyKXRyZWVCdWlsZGVySW1wbC5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgICAgICAgICB0cmVlQnVpbGRlckJhc2UuYnVpbGRUcmVlKGNvbnRyb2wsIHNlcnZsZXQsIHJlcXVlc3QpOworICAgICAgICAgICAgICAgIH1jYXRjaChUaHJvd2FibGUgdCl7CisgICAgICAgICAgICAgICAgICAgIHQucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5vdXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEh0dHBTZXNzaW9uIHNlc3Npb24gPSByZXF1ZXN0LmdldFNlc3Npb24oKTsKKyAgICAgICAgc2Vzc2lvbi5zZXRBdHRyaWJ1dGUoInRyZWVDb250cm9sVGVzdCIsIGNvbnRyb2wpOworCisgICAgICAgICBTdHJpbmcgIG5hbWUgPSByZXF1ZXN0LmdldFBhcmFtZXRlcigic2VsZWN0Iik7CisgICAgICAgICBpZiAobmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICBjb250cm9sLnNlbGVjdE5vZGUobmFtZSk7CisgICAgICAgICAgICAvLyBGb3J3YXJkIGJhY2sgdG8gdGhlIEJsYW5rIHBhZ2UKKyAgICAgICAgICAgIHJldHVybiAobWFwcGluZy5maW5kRm9yd2FyZCgiQmxhbmsiKSk7CisgICAgICAgIH0KKworICAgICAgICAgcmV0dXJuIChtYXBwaW5nLmZpbmRGb3J3YXJkKCJUcmVlIENvbnRyb2wgVGVzdCIpKTsKKworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9UYWJsZVRhZy5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL1RhYmxlVGFnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRjNTMyMAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9UYWJsZVRhZy5qYXZhCkBAIC0wLDAgKzEsMzI3IEBACisvKgorICogQ29weXJpZ2h0IDIwMDEsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbjsKKworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkxFbmNvZGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AuSnNwRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLkpzcFdyaXRlcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC5QYWdlQ29udGV4dDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuQm9keVRhZ1N1cHBvcnQ7CisKKworLyoqCisgKiA8cD5KU1AgY3VzdG9tIHRhZyB0aGF0IHJlbmRlcnMgYW4gImluc3RhbnQgdGFibGUiIGNvbnRyb2wuICBUbyB0aGUgdXNlciwKKyAqIGl0IGFwcGVhcnMgYXMgYW4gSFRNTCAmbHQ7dGFibGUmZ3Q7IGVsZW1lbnQKKyAqIFRoaXMgdGFnIGhhcyB0aGUgZm9sbG93aW5nIHVzZXItc2V0dGFibGUgYXR0cmlidXRlczo8L3A+CisgKiA8dWw+CisgKiA8bGk+PHN0cm9uZz5jb2x1bW5zPC9zdHJvbmc+IC0gKEludGVnZXIpIG51bWJlciBvZiBjb2x1bW5zIGluIHRoZSB0YWJsZS4KKyAqIElmIG5vdCBzcGVjaWZpZWQsIG9uZSB0d28gY29sdW1ucyB3aWxsIGJlIGNyZWF0ZWQuPC9saT4KKyAqIDxsaT48c3Ryb25nPnRhYmxlLWNsYXNzPC9zdHJvbmc+IC0gVGhlIENTUyBzdHlsZSBjbGFzcyB0byBiZSBhcHBsaWVkIHRvIHRoZQorICogICAgIGVudGlyZSByZW5kZXJlZCBvdXRwdXQgb2YgdGhlIGVudGlyZSB0YWJsZSwgaWYgYW55LjwvbGk+CisgKiA8bGk+PHN0cm9uZz5oZWFkZXItcm93LWNsYXNzPC9zdHJvbmc+IC0gVGhlIENTUyBzdHlsZSBjbGFzcyB0byBiZSBhcHBsaWVkIHRvIHRoZQorICogICAgIGVudGlyZSByZW5kZXJlZCBvdXRwdXQgb2YgdGhlIHRhYmxlIGhlYWRlci1yb3csIGlmIGFueS48L2xpPgorICoKKyAqIDwvdWw+CisgKgorICogPHN0cm9uZz5GSVhNRTwvc3Ryb25nPiAtIEludGVybmF0aW9uYWxpemUgdGhlIGV4Y2VwdGlvbiBtZXNzYWdlcyEKKyAqCisgKiBAYXV0aG9yIE1hbnZlZW4gS2F1cgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgVGFibGVUYWcgZXh0ZW5kcyBCb2R5VGFnU3VwcG9ydCB7CisgICAgCisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTWFuaWZlc3QgQ29uc3RhbnRzCisgICAgCisgICAgCisgICAgLyoqCisgICAgICogQXR0cmlidXRlIG5hbWUgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IHdlIGhhdmUgZ2VuZXJhdGVkIHRoZSBKYXZhU2NyaXB0CisgICAgICogZnVuY3Rpb24gYWxyZWFkeSBvbiB0aGUgY3VycmVudCBwYWdlLiAgVGhlIGRhdGEgc3RvcmVkIGZvciB0aGlzCisgICAgICogYXR0cmlidXRlIGlzIGFyYml0cmFyeSAtIG9ubHkgaXRzIGV4aXN0ZW5jZSBpcyByZWxldmFudC4KKyAgICAgKi8KKyAgICAvLyAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEZVTkNUSU9OX1RBRyA9CisgICAgLy8gICAgICAgIm9yZy5hcGFjaGUud2ViYXBwLmFkbWluLlRhYmxlVGFnLkZVTkNUSU9OX1RBRyI7CisgICAgCisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisgICAgCisgICAgCisgICAgLyoqCisgICAgICogVGhlIHNldCBvZiBsYWJlbHMgZm9yIHRoZSByb3dzIGRpc3BsYXllZCBieSB0aGlzIGNvbnRyb2wuCisgICAgICovCisgICAgcHJvdGVjdGVkIEFycmF5TGlzdCBsYWJlbHMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogVGhlIHNldCBvZiBkYXRhcyBmb3IgdGhlIHJvd3MgZGlzcGxheWVkIGJ5IHRoaXMgY29udHJvbC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQXJyYXlMaXN0IGRhdGFzID0gbmV3IEFycmF5TGlzdCgpOworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFRoZSBzZXQgb2YgbGFiZWxTdHlsZXMgZm9yIHRoZSByb3dzIGRpc3BsYXllZCBieSB0aGlzIGNvbnRyb2wuCisgICAgICovCisgICAgcHJvdGVjdGVkIEFycmF5TGlzdCBsYWJlbFN0eWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgc2V0IG9mIGRhdGFTdHlsZXMgZm9yIHRoZSByb3dzIGRpc3BsYXllZCBieSB0aGlzIGNvbnRyb2wuCisgICAgICovCisgICAgcHJvdGVjdGVkIEFycmF5TGlzdCBkYXRhU3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOworICAgIAorICAgIC8qKgorICAgICAqIFRoZSBzZXQgb2YgImhlYWRlcnMiIGZsYWdzIGZvciByb3dzIGRpc3BsYXllZCBieSB0aGlzIGNvbnRyb2wuCisgICAgICovCisgICAgcHJvdGVjdGVkIEFycmF5TGlzdCBoZWFkZXJzID0gbmV3IEFycmF5TGlzdCgpOworICAgIAorICAgIC8qKgorICAgICAqIFRoZSBzZXQgb2Ygc3R5bGVJZHMgZm9yIHRoZSByb3dzIGRpc3BsYXllZCBieSB0aGlzIGNvbnRyb2wuCisgICAgICovCisgICAgcHJvdGVjdGVkIEFycmF5TGlzdCBzdHlsZUlkcyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgCisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisgICAgCisgICAgCisgICAgLyoqCisgICAgICogVGhlIG51bWJlciBvZiBlbGVtZW50cyB0aGF0IHdpbGwgYmUgZGlzcGxheWVkIHRvIHRoZSB1c2VyLgorICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgY29sdW1ucyA9IDI7CisgICAgCisgICAgcHVibGljIGludCBnZXRDb2x1bW5zKCkgeworICAgICAgICByZXR1cm4gKHRoaXMuY29sdW1ucyk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNldENvbHVtbnMoaW50IGNvbHVtbnMpIHsKKyAgICAgICAgdGhpcy5jb2x1bW5zID0gY29sdW1uczsKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogVGhlIENTUyBzdHlsZSBjbGFzcyB0byBiZSBhcHBsaWVkIHRvIHRoZSBlbnRpcmUgcmVuZGVyZWQgb3V0cHV0CisgICAgICogb2YgdGhpcyAiaW5zdGFudCB0YWJsZSIgb2JqZWN0LgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgdGFibGVTdHlsZSA9IG51bGw7CisgICAgCisgICAgcHVibGljIFN0cmluZyBnZXRUYWJsZVN0eWxlKCkgeworICAgICAgICByZXR1cm4gKHRoaXMudGFibGVTdHlsZSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNldFRhYmxlU3R5bGUoU3RyaW5nIHRhYmxlU3R5bGUpIHsKKyAgICAgICAgdGhpcy50YWJsZVN0eWxlID0gdGFibGVTdHlsZTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogVGhlIENTUyBTdHlsZSBmb3IgdGhlIGxpbmVzIGJldHdlZW4gdGFibGUgcm93cy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGxpbmVTdHlsZSA9IG51bGw7CisgICAgCisgICAgcHVibGljIFN0cmluZyBnZXRMaW5lU3R5bGUoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5saW5lU3R5bGUpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRMaW5lU3R5bGUoU3RyaW5nIGxpbmVTdHlsZSkgeworICAgICAgICB0aGlzLmxpbmVTdHlsZSA9IGxpbmVTdHlsZTsKKyAgICB9CisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIHB1YmxpYyBpbnQgZG9TdGFydFRhZygpIHRocm93cyBKc3BFeGNlcHRpb24geworIAorICAgICAgICB0aGlzLmhlYWRlcnMuY2xlYXIoKTsKKyAgICAgICAgdGhpcy5sYWJlbHMuY2xlYXIoKTsKKyAgICAgICAgdGhpcy5kYXRhcy5jbGVhcigpOworICAgICAgICB0aGlzLmxhYmVsU3R5bGVzLmNsZWFyKCk7CisgICAgICAgIHRoaXMuZGF0YVN0eWxlcy5jbGVhcigpOworICAgICAgICB0aGlzLnN0eWxlSWRzLmNsZWFyKCk7CisgICAgICAgIAorICAgICAgICByZXR1cm4gKEVWQUxfQk9EWV9UQUcpOworIAorICAgICB9ICAgIAorCisgICAgCisgICAgLyoqCisgICAgICogUmVuZGVyIHRoaXMgaW5zdGFudCBhY3Rpb25zIGNvbnRyb2wuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEpzcEV4Y2VwdGlvbiBpZiBhIHByb2Nlc3NpbmcgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIGludCBkb0VuZFRhZygpIHRocm93cyBKc3BFeGNlcHRpb24geworICAgICAgICAKKyAgICAgICAgSnNwV3JpdGVyIG91dCA9IHBhZ2VDb250ZXh0LmdldE91dCgpOworICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gUmVuZGVyIHRoZSBiZWdpbm5pbmcgb2YgdGhpcyBlbGVtZW50CisgICAgICAgICAgICBvdXQucHJpbnRsbigpOworICAgICAgICAgICAgb3V0LnByaW50KCI8dGFibGUgIik7CisgICAgICAgICAgICBpZiAoY29sdW1ucyA+IDIpIHsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoIiBjb2x1bW5zPVwiIik7CisgICAgICAgICAgICAgICAgb3V0LnByaW50KGNvbHVtbnMpOworICAgICAgICAgICAgICAgIG91dC5wcmludCgiXCIiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0YWJsZVN0eWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoIiBjbGFzcz1cIiIpOworICAgICAgICAgICAgICAgIG91dC5wcmludCh0YWJsZVN0eWxlKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoIlwiIik7CisgICAgICAgICAgICAgICAgb3V0LnByaW50KCIgYm9yZGVyPVwiMVwiIGNlbGxzcGFjaW5nPVwiMFwiICIpOworICAgICAgICAgICAgICAgIG91dC5wcmludCgiIGNlbGxwYWRkaW5nPVwiMFwiIHdpZHRoPVwiMTAwJVwiICIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3V0LnByaW50bG4oIj4iKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBSZW5kZXIgZWFjaCBkZWZpbmVkIHJvdworICAgICAgICAgICAgaW50IG4gPSBsYWJlbHMuc2l6ZSgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWwgPSAoU3RyaW5nKSBsYWJlbHMuZ2V0KGkpOworICAgICAgICAgICAgICAgIGJvb2xlYW4gaGVhZGVyID0gKChCb29sZWFuKSBoZWFkZXJzLmdldChpKSkuYm9vbGVhblZhbHVlKCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIGRhdGEgPSAoU3RyaW5nKSBkYXRhcy5nZXQoaSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsU3R5bGUgPSAoU3RyaW5nKSBsYWJlbFN0eWxlcy5nZXQoaSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIGRhdGFTdHlsZSA9IChTdHJpbmcpIGRhdGFTdHlsZXMuZ2V0KGkpOworICAgICAgICAgICAgICAgIFN0cmluZyBzdHlsZUlkID0gKFN0cmluZykgc3R5bGVJZHMuZ2V0KGkpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmIChoZWFkZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIjx0ciBjbGFzcz1cImhlYWRlci1yb3dcIiA+Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCIgIDx0aCBzY29wZT1cImNvbFwiIHdpZHRoPVwiMjclXCI+ICIpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoIiAgICA8ZGl2IGFsaWduPVwibGVmdFwiIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChsYWJlbFN0eWxlICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoICIgY2xhc3M9XCIiICsgbGFiZWxTdHlsZSArIlwiIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCgiPiIpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVJZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoIjxsYWJlbCBmb3I9XCIiICsgc3R5bGVJZCArICJcIj4iKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQobGFiZWwpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVJZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoIjwvbGFiZWw+Iik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIiAgICA8L2Rpdj4iKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIiAgPC90aD4iKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIiAgPHRoIHNjb3BlPVwiY29sXCIgd2lkdGg9XCI3MyVcIj4gIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCgiICAgIDxkaXYgYWxpZ249XCJsZWZ0XCIiICk7CisgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhU3R5bGUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCgiIGNsYXNzPVwiIiArIGRhdGFTdHlsZSArICJcIiIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoIj4iKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KGRhdGEpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiICAgIDwvZGl2PiIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoIiAgPC90aD4iKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIjwvdHI+Iik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIjx0cj4iKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIiAgPHRkIHNjb3BlPVwicm93XCIgd2lkdGg9XCIyNyVcIj4gIik7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCgiICAgIDxkaXYgYWxpZ249XCJsZWZ0XCIiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxhYmVsU3R5bGUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCggIiBjbGFzcz1cIiIgKyBsYWJlbFN0eWxlICsiXCIiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KCI+Iik7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZUlkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCgiPGxhYmVsIGZvcj1cIiIgKyBzdHlsZUlkICsgIlwiPiIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludChsYWJlbCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZUlkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCgiPC9sYWJlbD4iKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiICAgIDwvZGl2PiIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiICA8L3RkPiIpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiICA8dGQgd2lkdGg9XCI3MyVcIj4gIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCgiICAgIDxkaXYgYWxpZ249XCJsZWZ0XCIiICk7CisgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhU3R5bGUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCgiIGNsYXNzPVwiIiArIGRhdGFTdHlsZSArICJcIiIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoIj4iKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KGRhdGEpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiICAgIDwvZGl2PiIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoIiAgPC90ZD4iKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIjwvdHI+Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgaWYgKCFoZWFkZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIjx0ciBoZWlnaHQ9XCIxXCI+Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCIgIDx0ZCBjbGFzcz1cIiIrIGxpbmVTdHlsZSArICJcIiBjb2xzcGFuPVwiMlwiPiIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiICAgIDxpbWcgc3JjPVwiXCIgYWx0PVwiXCIgd2lkdGg9XCIxXCIgaGVpZ2h0PVwiMVwiIGJvcmRlcj1cIjBcIj4iKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIiAgPC90ZD4iKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIjwvdHI+Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBSZW5kZXIgdGhlIGVuZCBvZiB0aGlzIGVsZW1lbnQKKyAgICAgICAgICAgIG91dC5wcmludGxuKCI8L3RhYmxlPiIpOworICAgICAgICAgICAgb3V0LnByaW50bG4oKTsKKyAgICAgICAgICAgIAorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSnNwRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICByZXR1cm4gKEVWQUxfUEFHRSk7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZWxlYXNlIGFsbCBzdGF0ZSBpbmZvcm1hdGlvbiBzZXQgYnkgdGhpcyB0YWcuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKKyAgICAgICAgCisgICAgICAgIHRoaXMuaGVhZGVycy5jbGVhcigpOworICAgICAgICB0aGlzLmxhYmVscy5jbGVhcigpOworICAgICAgICB0aGlzLmRhdGFzLmNsZWFyKCk7CisgICAgICAgIHRoaXMubGFiZWxTdHlsZXMuY2xlYXIoKTsKKyAgICAgICAgdGhpcy5kYXRhU3R5bGVzLmNsZWFyKCk7CisgICAgICAgIHRoaXMuY29sdW1ucyA9IDI7CisgICAgICAgIHRoaXMudGFibGVTdHlsZSA9IG51bGw7CisgICAgICAgIHRoaXMubGluZVN0eWxlID0gbnVsbDsKKyAgICAgICAgdGhpcy5zdHlsZUlkcy5jbGVhcigpOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUGFja2FnZSBNZXRob2RzCisgICAgCisgICAgCisgICAgLyoqCisgICAgICogQWRkIGEgbmV3IEFjdGlvbiB0byB0aGUgc2V0IHRoYXQgd2lsbCBiZSByZW5kZXJlZCBieSB0aGlzIGNvbnRyb2wuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGFiZWwgTG9jYWxpemVkIGxhYmVsIHZpc2libGUgdG8gdGhlIHVzZXIKKyAgICAgKiBAcGFyYW0gc2VsZWN0ZWQgSW5pdGlhbCBzZWxlY3RlZCBzdGF0ZSBvZiB0aGlzIG9wdGlvbgorICAgICAqIEBwYXJhbSB1cmwgVVJMIHRvIHdoaWNoIGNvbnRyb2wgc2hvdWxkIGJlIHRyYW5zZmVycmVkIGlmIHNlbGVjdGVkCisgICAgICovCisgICAgCisgICAgdm9pZCBhZGRSb3coYm9vbGVhbiBoZWFkZXIsIFN0cmluZyBsYWJlbCwgU3RyaW5nIGRhdGEsCisgICAgU3RyaW5nIGxhYmVsU3R5bGUsIFN0cmluZyBkYXRhU3R5bGUsIFN0cmluZyBzdHlsZUlkKSB7CisgICAgICAgIAorICAgICAgICBoZWFkZXJzLmFkZChuZXcgQm9vbGVhbihoZWFkZXIpKTsKKyAgICAgICAgbGFiZWxzLmFkZChsYWJlbCk7CisgICAgICAgIGRhdGFzLmFkZChkYXRhKTsKKyAgICAgICAgbGFiZWxTdHlsZXMuYWRkKGxhYmVsU3R5bGUpOworICAgICAgICBkYXRhU3R5bGVzLmFkZChkYXRhU3R5bGUpOworICAgICAgICBzdHlsZUlkcy5hZGQoc3R5bGVJZCk7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvdGVjdGVkIE1ldGhvZHMKKyAgICAKKyAgICAKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9Ub21jYXRUcmVlQnVpbGRlci5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL1RvbWNhdFRyZWVCdWlsZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDYxMDlmNQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9Ub21jYXRUcmVlQnVpbGRlci5qYXZhCkBAIC0wLDAgKzEsNTIyIEBACisvKgorICogQ29weXJpZ2h0IDIwMDEsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW47CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEubmV0LlVSTEVuY29kZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5tb2RlbGVyLk1hbmFnZWRCZWFuOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5tb2RlbGVyLlJlZ2lzdHJ5OworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLkdsb2JhbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRXJyb3JzOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3J3YXJkOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLnV0aWwuTWVzc2FnZVJlc291cmNlczsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LkF0dHJpYnV0ZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXJGYWN0b3J5OworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuUXVlcnlFeHA7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5RdWVyeTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdEluc3RhbmNlOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LkpNRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5BdHRyaWJ1dGVJbmZvOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5JbmZvOworCisvKioKKyAqIDxwPiBJbXBsZW1lbnRhdGlvbiBvZiBUcmVlQnVpbGRlciBpbnRlcmZhY2UgZm9yIFRvbWNhdCBUcmVlIENvbnRyb2xsZXIKKyAqICAgICB0byBidWlsZCBwbHVnaW4gY29tcG9uZW50cyBpbnRvIHRoZSB0cmVlCisgKgorICogQGF1dGhvciBKYXptaW4gSm9uc29uCisgKiBAYXV0aG9yIE1hbnZlZW4gS2F1cgorICogQGF1dGhvciBBbXkgUm9oCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKKworcHVibGljIGNsYXNzIFRvbWNhdFRyZWVCdWlsZGVyIGltcGxlbWVudHMgVHJlZUJ1aWxkZXJ7CisgICAgCisgICAgLy8gVGhpcyBTRVJWRVJfTEFCRUwgbmVlZHMgdG8gYmUgbG9jYWxpemVkCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFNFUlZFUl9MQUJFTCA9ICJUb21jYXQgU2VydmVyIjsKKyAgICAKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBERUZBVUxUX0RPTUFJTiA9ICJDYXRhbGluYSI7CisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU0VSVkVSX1RZUEUgPSAiOnR5cGU9U2VydmVyIjsKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBGQUNUT1JZX1RZUEUgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfRE9NQUlOICsgIjp0eXBlPU1CZWFuRmFjdG9yeSI7CisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU0VSVklDRV9UWVBFID0gIjp0eXBlPVNlcnZpY2UiOworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEVOR0lORV9UWVBFID0gIjp0eXBlPUVuZ2luZSI7CisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ09OTkVDVE9SX1RZUEUgPSAiOnR5cGU9Q29ubmVjdG9yIjsKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBIT1NUX1RZUEUgPSAiOnR5cGU9SG9zdCI7CisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ09OVEVYVF9UWVBFID0gIjp0eXBlPUNvbnRleHQiOworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERFRkFVTFRDT05URVhUX1RZUEUgPSAiOnR5cGU9RGVmYXVsdENvbnRleHQiOworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIExPQURFUl9UWVBFID0gIjp0eXBlPUxvYWRlciI7CisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTUFOQUdFUl9UWVBFID0gIjp0eXBlPU1hbmFnZXIiOworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIExPR0dFUl9UWVBFID0gIjp0eXBlPUxvZ2dlciI7CisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUkVBTE1fVFlQRSA9ICI6dHlwZT1SZWFsbSI7CisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVkFMVkVfVFlQRSA9ICI6dHlwZT1WYWx2ZSI7CisKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBXSUxEQ0FSRCA9ICIsKiI7CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgTUJlYW5TZXJ2ZXIgbUJTZXJ2ZXIgPSBudWxsOworICAgIHByaXZhdGUgTWVzc2FnZVJlc291cmNlcyByZXNvdXJjZXMgPSBudWxsOworICAgIHByaXZhdGUgTG9jYWxlIGxvY2FsZSA9IG51bGw7CisKKyAgICBwdWJsaWMgdm9pZCBidWlsZFRyZWUoVHJlZUNvbnRyb2wgdHJlZUNvbnRyb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFwcGxpY2F0aW9uU2VydmxldCBzZXJ2bGV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBIdHRwU2Vzc2lvbiBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uKCk7CisgICAgICAgICAgICBsb2NhbGUgPSAoTG9jYWxlKSBzZXNzaW9uLmdldEF0dHJpYnV0ZShHbG9iYWxzLkxPQ0FMRV9LRVkpOworICAgICAgICAgICAgbUJTZXJ2ZXIgPSBzZXJ2bGV0LmdldFNlcnZlcigpOworICAgICAgICAgICAgVHJlZUNvbnRyb2xOb2RlIHJvb3QgPSB0cmVlQ29udHJvbC5nZXRSb290KCk7CisgICAgICAgICAgICByZXNvdXJjZXMgPSAoTWVzc2FnZVJlc291cmNlcykKKyAgICAgICAgICAgICAgICBzZXJ2bGV0LmdldFNlcnZsZXRDb250ZXh0KCkuZ2V0QXR0cmlidXRlKEdsb2JhbHMuTUVTU0FHRVNfS0VZKTsKKyAgICAgICAgICAgIGdldFNlcnZlcnMocm9vdCk7CisgICAgICAgIH0gY2F0Y2goVGhyb3dhYmxlIHQpeworICAgICAgICAgICAgdC5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7CisgICAgICAgIH0KKworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdE5hbWUgZ2V0TUJlYW5GYWN0b3J5KCkgCisgICAgICAgICAgICB0aHJvd3MgTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbiB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gbmV3IE9iamVjdE5hbWUoRkFDVE9SWV9UWVBFKTsKKyAgICB9CisgICAgCisKKyAgICAvKioKKyAgICAgKiBBcHBlbmQgbm9kZXMgZm9yIGFsbCBkZWZpbmVkIHNlcnZlcnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcm9vdE5vZGUgUm9vdCBub2RlIGZvciB0aGUgdHJlZSBjb250cm9sIAorICAgICAqIEBwYXJhbSByZXNvdXJjZXMgVGhlIE1lc3NhZ2VSZXNvdXJjZXMgZm9yIG91ciBsb2NhbGl6ZWQgbWVzc2FnZXMKKyAgICAgKiAgbWVzc2FnZXMKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMgYnVpbGRpbmcgdGhlIHRyZWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBnZXRTZXJ2ZXJzKFRyZWVDb250cm9sTm9kZSByb290Tm9kZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIAorICAgICAgICBTdHJpbmcgZG9tYWluID0gcm9vdE5vZGUuZ2V0RG9tYWluKCk7CisgICAgICAgIEl0ZXJhdG9yIHNlcnZlck5hbWVzID0KKyAgICAgICAgICAgIExpc3RzLmdldFNlcnZlcnMobUJTZXJ2ZXIsZG9tYWluKS5pdGVyYXRvcigpOworICAgICAgICB3aGlsZSAoc2VydmVyTmFtZXMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBTdHJpbmcgc2VydmVyTmFtZSA9IChTdHJpbmcpIHNlcnZlck5hbWVzLm5leHQoKTsKKyAgICAgICAgICAgIE9iamVjdE5hbWUgb2JqZWN0TmFtZSA9IG5ldyBPYmplY3ROYW1lKHNlcnZlck5hbWUpOworICAgICAgICAgICAgU3RyaW5nIG5vZGVMYWJlbCA9IFNFUlZFUl9MQUJFTDsKKyAgICAgICAgICAgIFRyZWVDb250cm9sTm9kZSBzZXJ2ZXJOb2RlID0KKyAgICAgICAgICAgICAgICBuZXcgVHJlZUNvbnRyb2xOb2RlKHNlcnZlck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2VydmVyLmdpZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlTGFiZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRWRpdFNlcnZlci5kbz9zZWxlY3Q9IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShzZXJ2ZXJOYW1lKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJm5vZGVMYWJlbD0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKG5vZGVMYWJlbCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udGVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCBkb21haW4pOworICAgICAgICAgICAgcm9vdE5vZGUuYWRkQ2hpbGQoc2VydmVyTm9kZSk7CisgICAgICAgICAgICBnZXRTZXJ2aWNlcyhzZXJ2ZXJOb2RlLCBzZXJ2ZXJOYW1lKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICB9CisgICAgCisKKyAgICAvKioKKyAgICAgKiBBcHBlbmQgbm9kZXMgZm9yIGFsbCBkZWZpbmVkIHNlcnZpY2VzIGZvciB0aGUgc3BlY2lmaWVkIHNlcnZlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXJ2ZXJOb2RlIFNlcnZlciBub2RlIGZvciB0aGUgdHJlZSBjb250cm9sCisgICAgICogQHBhcmFtIHNlcnZlck5hbWUgT2JqZWN0IG5hbWUgb2YgdGhlIHBhcmVudCBzZXJ2ZXIKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VzIFRoZSBNZXNzYWdlUmVzb3VyY2VzIGZvciBvdXIgbG9jYWxpemVkIG1lc3NhZ2VzCisgICAgICogIG1lc3NhZ2VzCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhbiBleGNlcHRpb24gb2NjdXJzIGJ1aWxkaW5nIHRoZSB0cmVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgZ2V0U2VydmljZXMoVHJlZUNvbnRyb2xOb2RlIHNlcnZlck5vZGUsIFN0cmluZyBzZXJ2ZXJOYW1lKSAKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgU3RyaW5nIGRvbWFpbiA9IHNlcnZlck5vZGUuZ2V0RG9tYWluKCk7CisgICAgICAgIEl0ZXJhdG9yIHNlcnZpY2VOYW1lcyA9CisgICAgICAgICAgICBMaXN0cy5nZXRTZXJ2aWNlcyhtQlNlcnZlciwgc2VydmVyTmFtZSkuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKHNlcnZpY2VOYW1lcy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBzZXJ2aWNlTmFtZSA9IChTdHJpbmcpIHNlcnZpY2VOYW1lcy5uZXh0KCk7CisgICAgICAgICAgICBPYmplY3ROYW1lIG9iamVjdE5hbWUgPSBuZXcgT2JqZWN0TmFtZShzZXJ2aWNlTmFtZSk7CisgICAgICAgICAgICBTdHJpbmcgbm9kZUxhYmVsID0KKyAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsIAorICAgICAgICAgICAgICAgICAgICAic2VydmVyLnNlcnZpY2UudHJlZUJ1aWxkZXIuc3VidHJlZU5vZGUiKSArICIgKCIgKworICAgICAgICAgICAgICAgICAgICBvYmplY3ROYW1lLmdldEtleVByb3BlcnR5KCJzZXJ2aWNlTmFtZSIpICsgIikiOworICAgICAgICAgICAgVHJlZUNvbnRyb2xOb2RlIHNlcnZpY2VOb2RlID0KKyAgICAgICAgICAgICAgICBuZXcgVHJlZUNvbnRyb2xOb2RlKHNlcnZpY2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNlcnZpY2UuZ2lmIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVMYWJlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFZGl0U2VydmljZS5kbz9zZWxlY3Q9IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShzZXJ2aWNlTmFtZSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiZub2RlTGFiZWw9IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShub2RlTGFiZWwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRlbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGRvbWFpbik7CisgICAgICAgICAgICBzZXJ2ZXJOb2RlLmFkZENoaWxkKHNlcnZpY2VOb2RlKTsKKyAgICAgICAgICAgIGdldENvbm5lY3RvcnMoc2VydmljZU5vZGUsIHNlcnZpY2VOYW1lKTsKKyAgICAgICAgICAgIGdldERlZmF1bHRDb250ZXh0cyhzZXJ2aWNlTm9kZSwgc2VydmljZU5hbWUpOworICAgICAgICAgICAgZ2V0SG9zdHMoc2VydmljZU5vZGUsIHNlcnZpY2VOYW1lKTsKKyAgICAgICAgICAgIGdldFJlYWxtcyhzZXJ2aWNlTm9kZSwgc2VydmljZU5hbWUpOworICAgICAgICAgICAgZ2V0VmFsdmVzKHNlcnZpY2VOb2RlLCBzZXJ2aWNlTmFtZSk7CisgICAgICAgIH0KKworICAgIH0KKyAgICAKKworICAgIC8qKgorICAgICAqIEFwcGVuZCBub2RlcyBmb3IgYWxsIGRlZmluZWQgY29ubmVjdG9ycyBmb3IgdGhlIHNwZWNpZmllZCBzZXJ2aWNlLgorICAgICAqCisgICAgICogQHBhcmFtIHNlcnZpY2VOb2RlIFNlcnZpY2Ugbm9kZSBmb3IgdGhlIHRyZWUgY29udHJvbAorICAgICAqIEBwYXJhbSBzZXJ2aWNlTmFtZSBPYmplY3QgbmFtZSBvZiB0aGUgcGFyZW50IHNlcnZpY2UKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMgYnVpbGRpbmcgdGhlIHRyZWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBnZXRDb25uZWN0b3JzKFRyZWVDb250cm9sTm9kZSBzZXJ2aWNlTm9kZSwgU3RyaW5nIHNlcnZpY2VOYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbnsKKyAgICAgICAgCisgICAgICAgIFN0cmluZyBkb21haW4gPSBzZXJ2aWNlTm9kZS5nZXREb21haW4oKTsKKyAgICAgICAgSXRlcmF0b3IgY29ubmVjdG9yTmFtZXMgPQorICAgICAgICAgICAgTGlzdHMuZ2V0Q29ubmVjdG9ycyhtQlNlcnZlciwgc2VydmljZU5hbWUpLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChjb25uZWN0b3JOYW1lcy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBjb25uZWN0b3JOYW1lID0gKFN0cmluZykgY29ubmVjdG9yTmFtZXMubmV4dCgpOworICAgICAgICAgICAgT2JqZWN0TmFtZSBvYmplY3ROYW1lID0gbmV3IE9iamVjdE5hbWUoY29ubmVjdG9yTmFtZSk7CisgICAgICAgICAgICBTdHJpbmcgbm9kZUxhYmVsID0KKyAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsIAorICAgICAgICAgICAgICAgICAgICAic2VydmVyLnNlcnZpY2UudHJlZUJ1aWxkZXIuY29ubmVjdG9yIikgKyAiICgiICsgIAorICAgICAgICAgICAgICAgICAgICBvYmplY3ROYW1lLmdldEtleVByb3BlcnR5KCJwb3J0IikgKyAiKSI7CisgICAgICAgICAgICBUcmVlQ29udHJvbE5vZGUgY29ubmVjdG9yTm9kZSA9CisgICAgICAgICAgICAgICAgbmV3IFRyZWVDb250cm9sTm9kZShjb25uZWN0b3JOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvbm5lY3Rvci5naWYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZUxhYmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVkaXRDb25uZWN0b3IuZG8/c2VsZWN0PSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUoY29ubmVjdG9yTmFtZSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiZub2RlTGFiZWw9IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShub2RlTGFiZWwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRlbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGRvbWFpbik7CisgICAgICAgICAgICBzZXJ2aWNlTm9kZS5hZGRDaGlsZChjb25uZWN0b3JOb2RlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKworICAgIC8qKgorICAgICAqIEFwcGVuZCBub2RlcyBmb3IgYWxsIGRlZmluZWQgaG9zdHMgZm9yIHRoZSBzcGVjaWZpZWQgc2VydmljZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXJ2aWNlTm9kZSBTZXJ2aWNlIG5vZGUgZm9yIHRoZSB0cmVlIGNvbnRyb2wKKyAgICAgKiBAcGFyYW0gc2VydmljZU5hbWUgT2JqZWN0IG5hbWUgb2YgdGhlIHBhcmVudCBzZXJ2aWNlCisgICAgICogQHBhcmFtIHJlc291cmNlcyBUaGUgTWVzc2FnZVJlc291cmNlcyBmb3Igb3VyIGxvY2FsaXplZCBtZXNzYWdlcworICAgICAqICBtZXNzYWdlcworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW4gZXhjZXB0aW9uIG9jY3VycyBidWlsZGluZyB0aGUgdHJlZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGdldEhvc3RzKFRyZWVDb250cm9sTm9kZSBzZXJ2aWNlTm9kZSwgU3RyaW5nIHNlcnZpY2VOYW1lKSAKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIAorICAgICAgICBTdHJpbmcgZG9tYWluID0gc2VydmljZU5vZGUuZ2V0RG9tYWluKCk7CisgICAgICAgIEl0ZXJhdG9yIGhvc3ROYW1lcyA9CisgICAgICAgICAgICBMaXN0cy5nZXRIb3N0cyhtQlNlcnZlciwgc2VydmljZU5hbWUpLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChob3N0TmFtZXMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBTdHJpbmcgaG9zdE5hbWUgPSAoU3RyaW5nKSBob3N0TmFtZXMubmV4dCgpOworICAgICAgICAgICAgT2JqZWN0TmFtZSBvYmplY3ROYW1lID0gbmV3IE9iamVjdE5hbWUoaG9zdE5hbWUpOworICAgICAgICAgICAgU3RyaW5nIG5vZGVMYWJlbCA9CisgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAKKyAgICAgICAgICAgICAgICAgICAgInNlcnZlci5zZXJ2aWNlLnRyZWVCdWlsZGVyLmhvc3QiKSArICIgKCIgKworICAgICAgICAgICAgICAgICAgICBvYmplY3ROYW1lLmdldEtleVByb3BlcnR5KCJob3N0IikgKyAiKSI7CisgICAgICAgICAgICBUcmVlQ29udHJvbE5vZGUgaG9zdE5vZGUgPQorICAgICAgICAgICAgICAgIG5ldyBUcmVlQ29udHJvbE5vZGUoaG9zdE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9zdC5naWYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZUxhYmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVkaXRIb3N0LmRvP3NlbGVjdD0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKGhvc3ROYW1lKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJm5vZGVMYWJlbD0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKG5vZGVMYWJlbCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udGVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZG9tYWluKTsKKyAgICAgICAgICAgIHNlcnZpY2VOb2RlLmFkZENoaWxkKGhvc3ROb2RlKTsKKyAgICAgICAgICAgIGdldENvbnRleHRzKGhvc3ROb2RlLCBob3N0TmFtZSk7ICAgICAgICAgICAgCisgICAgICAgICAgICBnZXREZWZhdWx0Q29udGV4dHMoaG9zdE5vZGUsIGhvc3ROYW1lKTsKKyAgICAgICAgICAgIGdldFJlYWxtcyhob3N0Tm9kZSwgaG9zdE5hbWUpOworICAgICAgICAgICAgZ2V0VmFsdmVzKGhvc3ROb2RlLCBob3N0TmFtZSk7CisgICAgICAgIH0KKworICAgIH0gICAgCisKKyAgICAKKyAgICAvKioKKyAgICAgKiBBcHBlbmQgbm9kZXMgZm9yIGFsbCBkZWZpbmVkIGNvbnRleHRzIGZvciB0aGUgc3BlY2lmaWVkIGhvc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaG9zdE5vZGUgSG9zdCBub2RlIGZvciB0aGUgdHJlZSBjb250cm9sCisgICAgICogQHBhcmFtIGhvc3ROYW1lIE9iamVjdCBuYW1lIG9mIHRoZSBwYXJlbnQgaG9zdAorICAgICAqIEBwYXJhbSByZXNvdXJjZXMgVGhlIE1lc3NhZ2VSZXNvdXJjZXMgZm9yIG91ciBsb2NhbGl6ZWQgbWVzc2FnZXMKKyAgICAgKiAgbWVzc2FnZXMKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMgYnVpbGRpbmcgdGhlIHRyZWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBnZXRDb250ZXh0cyhUcmVlQ29udHJvbE5vZGUgaG9zdE5vZGUsIFN0cmluZyBob3N0TmFtZSkgCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAKKyAgICAgICAgU3RyaW5nIGRvbWFpbiA9IGhvc3ROb2RlLmdldERvbWFpbigpOworICAgICAgICBJdGVyYXRvciBjb250ZXh0TmFtZXMgPQorICAgICAgICAgICAgTGlzdHMuZ2V0Q29udGV4dHMobUJTZXJ2ZXIsIGhvc3ROYW1lKS5pdGVyYXRvcigpOworICAgICAgICB3aGlsZSAoY29udGV4dE5hbWVzLmhhc05leHQoKSkgeworICAgICAgICAgICAgU3RyaW5nIGNvbnRleHROYW1lID0gKFN0cmluZykgY29udGV4dE5hbWVzLm5leHQoKTsKKyAgICAgICAgICAgIE9iamVjdE5hbWUgb2JqZWN0TmFtZSA9IG5ldyBPYmplY3ROYW1lKGNvbnRleHROYW1lKTsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gb2JqZWN0TmFtZS5nZXRLZXlQcm9wZXJ0eSgibmFtZSIpOworICAgICAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDIpOworICAgICAgICAgICAgaW50IGkgPSBuYW1lLmluZGV4T2YoIi8iKTsKKyAgICAgICAgICAgIFN0cmluZyBwYXRoID0gbmFtZS5zdWJzdHJpbmcoaSk7CisgICAgICAgICAgICBTdHJpbmcgbm9kZUxhYmVsID0KKyAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsIAorICAgICAgICAgICAgICAgICAgICAic2VydmVyLnNlcnZpY2UudHJlZUJ1aWxkZXIuY29udGV4dCIpICsgIiAoIiArIHBhdGggKyAiKSI7CisgICAgICAgICAgICBUcmVlQ29udHJvbE5vZGUgY29udGV4dE5vZGUgPQorICAgICAgICAgICAgICAgIG5ldyBUcmVlQ29udHJvbE5vZGUoY29udGV4dE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29udGV4dC5naWYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZUxhYmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVkaXRDb250ZXh0LmRvP3NlbGVjdD0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKGNvbnRleHROYW1lKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJm5vZGVMYWJlbD0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKG5vZGVMYWJlbCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udGVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZG9tYWluKTsKKyAgICAgICAgICAgIGhvc3ROb2RlLmFkZENoaWxkKGNvbnRleHROb2RlKTsKKyAgICAgICAgICAgIGdldFJlc291cmNlcyhjb250ZXh0Tm9kZSwgY29udGV4dE5hbWUpOworICAgICAgICAgICAgZ2V0UmVhbG1zKGNvbnRleHROb2RlLCBjb250ZXh0TmFtZSk7CisgICAgICAgICAgICBnZXRWYWx2ZXMoY29udGV4dE5vZGUsIGNvbnRleHROYW1lKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBBcHBlbmQgbm9kZXMgZm9yIGFsbCBkZWZpbmVkIGRlZmF1bHQgY29udGV4dHMgZm9yIHRoZSBzcGVjaWZpZWQgaG9zdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBob3N0Tm9kZSBIb3N0IG5vZGUgZm9yIHRoZSB0cmVlIGNvbnRyb2wKKyAgICAgKiBAcGFyYW0gY29udGFpbmVyTmFtZSBPYmplY3QgbmFtZSBvZiB0aGUgcGFyZW50IGNvbnRhaW5lcgorICAgICAqIEBwYXJhbSBjb250YWluZXJUeXBlIFRoZSB0eXBlIG9mIHRoZSBwYXJlbnQgY29udGFpbmVyCisgICAgICogQHBhcmFtIHJlc291cmNlcyBUaGUgTWVzc2FnZVJlc291cmNlcyBmb3Igb3VyIGxvY2FsaXplZCBtZXNzYWdlcworICAgICAqICBtZXNzYWdlcworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW4gZXhjZXB0aW9uIG9jY3VycyBidWlsZGluZyB0aGUgdHJlZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGdldERlZmF1bHRDb250ZXh0cyhUcmVlQ29udHJvbE5vZGUgaG9zdE5vZGUsIFN0cmluZyBjb250YWluZXJOYW1lKSAKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIAorICAgICAgICBTdHJpbmcgZG9tYWluID0gaG9zdE5vZGUuZ2V0RG9tYWluKCk7CisgICAgICAgIEl0ZXJhdG9yIGRlZmF1bHRDb250ZXh0TmFtZXMgPQorICAgICAgICAgICAgTGlzdHMuZ2V0RGVmYXVsdENvbnRleHRzKG1CU2VydmVyLCBjb250YWluZXJOYW1lKS5pdGVyYXRvcigpOworICAgICAgICB3aGlsZSAoZGVmYXVsdENvbnRleHROYW1lcy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBkZWZhdWx0Q29udGV4dE5hbWUgPSAoU3RyaW5nKSBkZWZhdWx0Q29udGV4dE5hbWVzLm5leHQoKTsKKyAgICAgICAgICAgIE9iamVjdE5hbWUgb2JqZWN0TmFtZSA9IG5ldyBPYmplY3ROYW1lKGRlZmF1bHRDb250ZXh0TmFtZSk7CisgICAgICAgICAgICBTdHJpbmcgbm9kZUxhYmVsID0gIkRlZmF1bHRDb250ZXh0IjsKKyAgICAgICAgICAgIFRyZWVDb250cm9sTm9kZSBkZWZhdWx0Q29udGV4dE5vZGUgPQorICAgICAgICAgICAgICAgIG5ldyBUcmVlQ29udHJvbE5vZGUoZGVmYXVsdENvbnRleHROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRlZmF1bHRDb250ZXh0LmdpZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlTGFiZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRWRpdERlZmF1bHRDb250ZXh0LmRvP3NlbGVjdD0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKGRlZmF1bHRDb250ZXh0TmFtZSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiZub2RlTGFiZWw9IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShub2RlTGFiZWwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRlbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGRvbWFpbik7CisgICAgICAgICAgICBob3N0Tm9kZS5hZGRDaGlsZChkZWZhdWx0Q29udGV4dE5vZGUpOworICAgICAgICAgICAgZ2V0UmVzb3VyY2VzKGRlZmF1bHRDb250ZXh0Tm9kZSwgZGVmYXVsdENvbnRleHROYW1lKTsKKyAgICAgICAgfQorICAgIH0gIAorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIEFwcGVuZCBub2RlcyBmb3IgYW55IGRlZmluZWQgcmVhbG1zIGZvciB0aGUgc3BlY2lmaWVkIGNvbnRhaW5lci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250YWluZXJOb2RlIENvbnRhaW5lciBub2RlIGZvciB0aGUgdHJlZSBjb250cm9sCisgICAgICogQHBhcmFtIGNvbnRhaW5lck5hbWUgT2JqZWN0IG5hbWUgb2YgdGhlIHBhcmVudCBjb250YWluZXIKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMgYnVpbGRpbmcgdGhlIHRyZWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBnZXRSZWFsbXMoVHJlZUNvbnRyb2xOb2RlIGNvbnRhaW5lck5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjb250YWluZXJOYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBTdHJpbmcgZG9tYWluID0gY29udGFpbmVyTm9kZS5nZXREb21haW4oKTsKKyAgICAgICAgSXRlcmF0b3IgcmVhbG1OYW1lcyA9CisgICAgICAgICAgICBMaXN0cy5nZXRSZWFsbXMobUJTZXJ2ZXIsIGNvbnRhaW5lck5hbWUpLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChyZWFsbU5hbWVzLmhhc05leHQoKSkgeworICAgICAgICAgICAgU3RyaW5nIHJlYWxtTmFtZSA9IChTdHJpbmcpIHJlYWxtTmFtZXMubmV4dCgpOworCSAgICBPYmplY3ROYW1lIG9iamVjdE5hbWUgPSBuZXcgT2JqZWN0TmFtZShyZWFsbU5hbWUpOworICAgICAgICAgICAgLy8gQ3JlYXRlIHRyZWUgbm9kZXMgZm9yIG5vbiBKQUFTUmVhbG0gb25seQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtQlNlcnZlci5nZXRBdHRyaWJ1dGUob2JqZWN0TmFtZSwgInZhbGlkYXRlIik7CisgICAgICAgICAgICB9IGNhdGNoIChBdHRyaWJ1dGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIG5vZGVMYWJlbCA9IHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgCisgICAgICAgICAgICAgICAgICAgICJzZXJ2ZXIuc2VydmljZS50cmVlQnVpbGRlci5yZWFsbUZvciIsIAorICAgICAgICAgICAgICAgICAgICBjb250YWluZXJOb2RlLmdldExhYmVsKCkpOworCSAgICAgICAgVHJlZUNvbnRyb2xOb2RlIHJlYWxtTm9kZSA9CisJCSAgICBuZXcgVHJlZUNvbnRyb2xOb2RlKHJlYWxtTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWFsbS5naWYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZUxhYmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVkaXRSZWFsbS5kbz9zZWxlY3Q9IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShyZWFsbU5hbWUpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICImbm9kZUxhYmVsPSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUobm9kZUxhYmVsKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250ZW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBkb21haW4pOworICAgICAgICAgICAgICAgIGNvbnRhaW5lck5vZGUuYWRkQ2hpbGQocmVhbG1Ob2RlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICB9ICAgCisgICAgICAgIAorICAgIAorICAgIC8qKgorICAgICAqIEFwcGVuZCBub2RlcyBmb3IgYW55IGRlZmluZSByZXNvdXJjZXMgZm9yIHRoZSBzcGVjaWZpZWQgQ29udGV4dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250YWluZXJOb2RlIENvbnRhaW5lciBub2RlIGZvciB0aGUgdHJlZSBjb250cm9sCisgICAgICogQHBhcmFtIGNvbnRhaW5lck5hbWUgT2JqZWN0IG5hbWUgb2YgdGhlIHBhcmVudCBjb250YWluZXIKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VzIFRoZSBNZXNzYWdlUmVzb3VyY2VzIGZvciBvdXIgbG9jYWxpemVkIG1lc3NhZ2VzCisgICAgICogIG1lc3NhZ2VzCisgICAgICovCisgICAgcHVibGljIHZvaWQgZ2V0UmVzb3VyY2VzKFRyZWVDb250cm9sTm9kZSBjb250YWluZXJOb2RlLCBTdHJpbmcgY29udGFpbmVyTmFtZSkgCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIFN0cmluZyBkb21haW4gPSBjb250YWluZXJOb2RlLmdldERvbWFpbigpOworICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0gbmV3IE9iamVjdE5hbWUoY29udGFpbmVyTmFtZSk7CisgICAgICAgIFN0cmluZyB0eXBlID0gb25hbWUuZ2V0S2V5UHJvcGVydHkoInR5cGUiKTsKKyAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkgeworICAgICAgICAgICAgdHlwZSA9IG9uYW1lLmdldEtleVByb3BlcnR5KCJqMmVlVHlwZSIpOworICAgICAgICAgICAgaWYgKHR5cGUuZXF1YWxzKCJXZWJNb2R1bGUiKSkgeworICAgICAgICAgICAgICAgIHR5cGUgPSAiQ29udGV4dCI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHR5cGUgPSAiIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgcGF0aCA9ICIiOworICAgICAgICBTdHJpbmcgaG9zdCA9ICIiOworICAgICAgICBTdHJpbmcgbmFtZSA9IG9uYW1lLmdldEtleVByb3BlcnR5KCJuYW1lIik7CisgICAgICAgIGlmICgobmFtZSAhPSBudWxsKSAmJiAobmFtZS5sZW5ndGgoKSA+IDApKSB7CisgICAgICAgICAgICAvLyBjb250ZXh0IHJlc291cmNlCisgICAgICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcoMik7CisgICAgICAgICAgICBpbnQgaSA9IG5hbWUuaW5kZXhPZigiLyIpOworICAgICAgICAgICAgaG9zdCA9IG5hbWUuc3Vic3RyaW5nKDAsaSk7CisgICAgICAgICAgICBwYXRoID0gbmFtZS5zdWJzdHJpbmcoaSk7CisgICAgICAgIH0gICAgIAorICAgICAgICBUcmVlQ29udHJvbE5vZGUgc3VidHJlZSA9IG5ldyBUcmVlQ29udHJvbE5vZGUKKyAgICAgICAgICAgICgiQ29udGV4dCBSZXNvdXJjZSBBZG1pbmlzdHJhdGlvbiAiICsgY29udGFpbmVyTmFtZSwKKyAgICAgICAgICAgICAiZm9sZGVyXzE2X3BhZC5naWYiLAorICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInJlc291cmNlcy50cmVlQnVpbGRlci5zdWJ0cmVlTm9kZSIpLAorICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgImNvbnRlbnQiLAorICAgICAgICAgICAgIHRydWUsIGRvbWFpbik7ICAgICAgICAKKyAgICAgICAgY29udGFpbmVyTm9kZS5hZGRDaGlsZChzdWJ0cmVlKTsKKyAgICAgICAgVHJlZUNvbnRyb2xOb2RlIGRhdGFzb3VyY2VzID0gbmV3IFRyZWVDb250cm9sTm9kZQorICAgICAgICAgICAgKCJDb250ZXh0IERhdGEgU291cmNlcyAiICsgY29udGFpbmVyTmFtZSwKKyAgICAgICAgICAgICJEYXRhc291cmNlLmdpZiIsCisgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJyZXNvdXJjZXMudHJlZUJ1aWxkZXIuZGF0YXNvdXJjZXMiKSwKKyAgICAgICAgICAgICJyZXNvdXJjZXMvbGlzdERhdGFTb3VyY2VzLmRvP3Jlc291cmNldHlwZT0iICsgCisgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUodHlwZSkgKyAiJnBhdGg9IiArCisgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUocGF0aCkgKyAiJmhvc3Q9IiArIAorICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKGhvc3QpICsgIiZkb21haW49IiArIAorICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKGRvbWFpbikgKyAiJmZvcndhcmQ9IiArCisgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUoIkRhdGFTb3VyY2VzIExpc3QgU2V0dXAiKSwKKyAgICAgICAgICAgICJjb250ZW50IiwKKyAgICAgICAgICAgIGZhbHNlLCBkb21haW4pOworICAgICAgICBUcmVlQ29udHJvbE5vZGUgbWFpbHNlc3Npb25zID0gbmV3IFRyZWVDb250cm9sTm9kZQorICAgICAgICAgICAgKCJDb250ZXh0IE1haWwgU2Vzc2lvbnMgIiArIGNvbnRhaW5lck5hbWUsCisgICAgICAgICAgICAiTWFpbHNlc3Npb24uZ2lmIiwKKyAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInJlc291cmNlcy50cmVlQnVpbGRlci5tYWlsc2Vzc2lvbnMiKSwKKyAgICAgICAgICAgICJyZXNvdXJjZXMvbGlzdE1haWxTZXNzaW9ucy5kbz9yZXNvdXJjZXR5cGU9IiArIAorICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHR5cGUpICsgIiZwYXRoPSIgKworICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHBhdGgpICsgIiZob3N0PSIgKyAKKyAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShob3N0KSArICImZG9tYWluPSIgKyAKKyAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShkb21haW4pICsgIiZmb3J3YXJkPSIgKworICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKCJNYWlsU2Vzc2lvbnMgTGlzdCBTZXR1cCIpLAorICAgICAgICAgICAgImNvbnRlbnQiLAorICAgICAgICAgICAgZmFsc2UsIGRvbWFpbik7CisgICAgICAgIFRyZWVDb250cm9sTm9kZSByZXNvdXJjZWxpbmtzID0gbmV3IFRyZWVDb250cm9sTm9kZQorICAgICAgICAgICAgKCJSZXNvdXJjZSBMaW5rcyAiICsgY29udGFpbmVyTmFtZSwKKyAgICAgICAgICAgICJSZXNvdXJjZUxpbmsuZ2lmIiwKKyAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInJlc291cmNlcy50cmVlQnVpbGRlci5yZXNvdXJjZWxpbmtzIiksCisgICAgICAgICAgICAicmVzb3VyY2VzL2xpc3RSZXNvdXJjZUxpbmtzLmRvP3Jlc291cmNldHlwZT0iICsgCisgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUodHlwZSkgKyAiJnBhdGg9IiArCisgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUocGF0aCkgKyAiJmhvc3Q9IiArIAorICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKGhvc3QpICsgIiZkb21haW49IiArIAorICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKGRvbWFpbikgKyAiJmZvcndhcmQ9IiArCisgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUoIlJlc291cmNlTGlua3MgTGlzdCBTZXR1cCIpLAorICAgICAgICAgICAgImNvbnRlbnQiLAorICAgICAgICAgICAgZmFsc2UsIGRvbWFpbik7CisgICAgICAgIFRyZWVDb250cm9sTm9kZSBlbnZzID0gbmV3IFRyZWVDb250cm9sTm9kZQorICAgICAgICAgICAgKCJDb250ZXh0IEVudmlyb25tZW50IEVudHJpZXMgIisgY29udGFpbmVyTmFtZSwKKyAgICAgICAgICAgICJFbnZpcm9ubWVudEVudHJpZXMuZ2lmIiwKKyAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInJlc291cmNlcy5lbnYuZW50cmllcyIpLAorICAgICAgICAgICAgInJlc291cmNlcy9saXN0RW52RW50cmllcy5kbz9yZXNvdXJjZXR5cGU9IiArIAorICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHR5cGUpICsgIiZwYXRoPSIgKworICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHBhdGgpICsgIiZob3N0PSIgKyAKKyAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShob3N0KSArICImZG9tYWluPSIgKyAKKyAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShkb21haW4pICsgIiZmb3J3YXJkPSIgKworICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKCJFbnZFbnRyaWVzIExpc3QgU2V0dXAiKSwKKyAgICAgICAgICAgICJjb250ZW50IiwKKyAgICAgICAgICAgIGZhbHNlLCBkb21haW4pOworICAgICAgICBzdWJ0cmVlLmFkZENoaWxkKGRhdGFzb3VyY2VzKTsKKyAgICAgICAgc3VidHJlZS5hZGRDaGlsZChtYWlsc2Vzc2lvbnMpOworICAgICAgICBzdWJ0cmVlLmFkZENoaWxkKHJlc291cmNlbGlua3MpOworICAgICAgICBzdWJ0cmVlLmFkZENoaWxkKGVudnMpOworICAgIH0KKyAgICAKKyAgICAKKyAgIC8qKgorICAgICAqIEFwcGVuZCBub2RlcyBmb3IgYW55IGRlZmluZWQgdmFsdmVzIGZvciB0aGUgc3BlY2lmaWVkIGNvbnRhaW5lci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250YWluZXJOb2RlIENvbnRhaW5lciBub2RlIGZvciB0aGUgdHJlZSBjb250cm9sCisgICAgICogQHBhcmFtIGNvbnRhaW5lck5hbWUgT2JqZWN0IG5hbWUgb2YgdGhlIHBhcmVudCBjb250YWluZXIKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMgYnVpbGRpbmcgdGhlIHRyZWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBnZXRWYWx2ZXMoVHJlZUNvbnRyb2xOb2RlIGNvbnRhaW5lck5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjb250YWluZXJOYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBTdHJpbmcgZG9tYWluID0gY29udGFpbmVyTm9kZS5nZXREb21haW4oKTsKKyAgICAgICAgSXRlcmF0b3IgdmFsdmVOYW1lcyA9CisgICAgICAgICAgICAgICAgTGlzdHMuZ2V0VmFsdmVzKG1CU2VydmVyLCBjb250YWluZXJOYW1lKS5pdGVyYXRvcigpOyAgICAgICAgCisgICAgICAgIHdoaWxlICh2YWx2ZU5hbWVzLmhhc05leHQoKSkgeworICAgICAgICAgICAgU3RyaW5nIHZhbHZlTmFtZSA9IChTdHJpbmcpIHZhbHZlTmFtZXMubmV4dCgpOworICAgICAgICAgICAgT2JqZWN0TmFtZSBvYmplY3ROYW1lID0gbmV3IE9iamVjdE5hbWUodmFsdmVOYW1lKTsKKyAgICAgICAgICAgIFN0cmluZyBub2RlTGFiZWwgPSAiVmFsdmUgZm9yICIgKyBjb250YWluZXJOb2RlLmdldExhYmVsKCk7CisgICAgICAgICAgICBUcmVlQ29udHJvbE5vZGUgdmFsdmVOb2RlID0KKyAgICAgICAgICAgICAgICBuZXcgVHJlZUNvbnRyb2xOb2RlKHZhbHZlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWYWx2ZS5naWYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZUxhYmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVkaXRWYWx2ZS5kbz9zZWxlY3Q9IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZSh2YWx2ZU5hbWUpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICImbm9kZUxhYmVsPSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUobm9kZUxhYmVsKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJnBhcmVudD0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKGNvbnRhaW5lck5hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRlbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGRvbWFpbik7CisgICAgICAgICAgICBjb250YWluZXJOb2RlLmFkZENoaWxkKHZhbHZlTm9kZSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vVHJlZUJ1aWxkZXIuamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9UcmVlQnVpbGRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNWI3MzMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vVHJlZUJ1aWxkZXIuamF2YQpAQCAtMCwwICsxLDM0IEBACisvKgorICogQ29weXJpZ2h0IDIwMDEsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW47CisKKy8qKgorICogPHA+IEludGVyZmFjZSBmb3IgQWRtaW4gVHJlZSBDb250cm9sbGVyIHRvIGJ1aWxkIHBsdWdpbiBjb21wb25lbnRzCisgKiBpbnRvIHRoZSB0cmVlCisgKgorICogQGF1dGhvciBKYXptaW4gSm9uc29uCisgKiBAdmVyc2lvbgorICovCisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworCitwdWJsaWMgaW50ZXJmYWNlIFRyZWVCdWlsZGVyIHsKKworICAgIHB1YmxpYyB2b2lkIGJ1aWxkVHJlZShUcmVlQ29udHJvbCB0cmVlQ29udHJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQXBwbGljYXRpb25TZXJ2bGV0IHNlcnZsZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KTsKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9UcmVlQ29udHJvbC5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL1RyZWVDb250cm9sLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM1ODRiMAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9UcmVlQ29udHJvbC5qYXZhCkBAIC0wLDAgKzEsMjI5IEBACisvKgorICogQ29weXJpZ2h0IDIwMDEsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbjsKKworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CisKKworLyoqCisgKiA8cD5UaGUgb3ZlcmFsbCBkYXRhIHN0cnVjdHVyZSByZXByZXNlbnRpbmcgYSA8ZW0+dHJlZSBjb250cm9sPC9lbT4KKyAqIHRoYXQgY2FuIGJlIHJlbmRlcmVkIGJ5IHRoZSA8Y29kZT5UcmVlQ29udHJvbFRhZzwvY29kZT4gY3VzdG9tIHRhZy4KKyAqIEVhY2ggbm9kZSBvZiB0aGUgdHJlZSBpcyByZXByZXNlbnRlZCBieSBhbiBpbnN0YW5jZSBvZgorICogPGNvZGU+VHJlZUNvbnRyb2xOb2RlPC9jb2RlPi48L3A+CisgKgorICogQGF1dGhvciBKYXptaW4gSm9uc29uCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIFRyZWVDb250cm9sIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBpbnN0YW5jZSB3aXRoIG5vIHByZWRlZmluZWQgcm9vdCBub2RlLgorICAgICAqLworICAgIHB1YmxpYyBUcmVlQ29udHJvbCgpIHsKKworICAgICAgICBzdXBlcigpOworICAgICAgICBzZXRSb290KG51bGwpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgaW5zdGFuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIHJvb3Qgbm9kZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByb290IFRoZSBuZXcgcm9vdCBub2RlCisgICAgICovCisgICAgcHVibGljIFRyZWVDb250cm9sKFRyZWVDb250cm9sTm9kZSByb290KSB7CisKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgc2V0Um9vdChyb290KTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBjb2xsZWN0aW9uIG9mIG5vZGVzIHRoYXQgcmVwcmVzZW50IHRoaXMgdHJlZSwga2V5ZWQgYnkgbmFtZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgSGFzaE1hcCByZWdpc3RyeSA9IG5ldyBIYXNoTWFwKCk7CisKKworICAgIC8qKgorICAgICAqIFRoZSBtb3N0IHJlY2VudGx5IHNlbGVjdGVkIG5vZGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIFRyZWVDb250cm9sTm9kZSBzZWxlY3RlZCA9IG51bGw7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgcm9vdCBub2RlIG9mIHRoZSBlbnRpcmUgdHJlZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgVHJlZUNvbnRyb2xOb2RlIHJvb3QgPSBudWxsOworCisgICAgcHVibGljIFRyZWVDb250cm9sTm9kZSBnZXRSb290KCkgeworICAgICAgICByZXR1cm4gKHRoaXMucm9vdCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0Um9vdChUcmVlQ29udHJvbE5vZGUgcm9vdCkgeworICAgICAgICBpZiAodGhpcy5yb290ICE9IG51bGwpCisgICAgICAgICAgICByZW1vdmVOb2RlKHRoaXMucm9vdCk7CisgICAgICAgIGlmIChyb290ICE9IG51bGwpCisgICAgICAgICAgICBhZGROb2RlKHJvb3QpOworICAgICAgICByb290LnNldExhc3QodHJ1ZSk7CisgICAgICAgIHRoaXMucm9vdCA9IHJvb3Q7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgY3VycmVudCBkaXNwbGF5YWJsZSAid2lkdGgiIG9mIHRoaXMgdHJlZSAodGhhdCBpcywgdGhlIG1heGltdW0KKyAgICAgKiBkZXB0aCBvZiB0aGUgdmlzaWJsZSBwYXJ0IG9mIHRoZSB0cmVlKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFdpZHRoKCkgeworCisgICAgICAgIGlmIChyb290ID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKDApOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gKGdldFdpZHRoKHJvb3QpKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIEZpbmQgYW5kIHJldHVybiB0aGUgPGNvZGU+VHJlZUNvbnRyb2xOb2RlPC9jb2RlPiBmb3IgdGhlIHNwZWNpZmllZAorICAgICAqIG5vZGUgbmFtZSwgaWYgaXQgZXhpc3RzOyBvdGhlcndpc2UsIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIDxjb2RlPlRyZWVDb250cm9sTm9kZTwvY29kZT4gdG8gYmUgcmV0dXJuZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgVHJlZUNvbnRyb2xOb2RlIGZpbmROb2RlKFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgc3luY2hyb25pemVkIChyZWdpc3RyeSkgeworICAgICAgICAgICAgcmV0dXJuICgoVHJlZUNvbnRyb2xOb2RlKSByZWdpc3RyeS5nZXQobmFtZSkpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIE1hcmsgdGhlIHNwZWNpZmllZCBub2RlIGFzIHRoZSBvbmUtYW5kLW9ubHkgY3VycmVudGx5IHNlbGVjdGVkIG9uZSwKKyAgICAgKiBkZXNlbGVjdGluZyBhbnkgcHJldmlvdXMgbm9kZSB0aGF0IHdhcyBzbyBtYXJrZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbm9kZSBOYW1lIG9mIHRoZSBub2RlIHRvIG1hcmsgYXMgc2VsZWN0ZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+CisgICAgICogIGlmIHRoZXJlIHNob3VsZCBiZSBubyBjdXJyZW50bHkgc2VsZWN0ZWQgbm9kZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNlbGVjdE5vZGUoU3RyaW5nIG5hbWUpIHsKKworICAgICAgICBpZiAoc2VsZWN0ZWQgIT0gbnVsbCkgeworICAgICAgICAgICAgc2VsZWN0ZWQuc2V0U2VsZWN0ZWQoZmFsc2UpOworICAgICAgICAgICAgc2VsZWN0ZWQgPSBudWxsOworICAgICAgICB9CisgICAgICAgIHNlbGVjdGVkID0gZmluZE5vZGUobmFtZSk7CisgICAgICAgIGlmIChzZWxlY3RlZCAhPSBudWxsKQorICAgICAgICAgICAgc2VsZWN0ZWQuc2V0U2VsZWN0ZWQodHJ1ZSk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBhY2thZ2UgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlciB0aGUgc3BlY2lmaWVkIG5vZGUgaW4gb3VyIHJlZ2lzdHJ5IG9mIHRoZSBjb21wbGV0ZSB0cmVlLgorICAgICAqCisgICAgICogQHBhcmFtIG5vZGUgVGhlIDxjb2RlPlRyZWVDb250cm9sTm9kZTwvY29kZT4gdG8gYmUgcmVnaXN0ZXJlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIG5hbWUgb2YgdGhpcyBub2RlCisgICAgICogIGlzIG5vdCB1bmlxdWUKKyAgICAgKi8KKyAgICB2b2lkIGFkZE5vZGUoVHJlZUNvbnRyb2xOb2RlIG5vZGUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworCisgICAgICAgIHN5bmNocm9uaXplZCAocmVnaXN0cnkpIHsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gbm9kZS5nZXROYW1lKCk7CisgICAgICAgICAgICBpZiAocmVnaXN0cnkuY29udGFpbnNLZXkobmFtZSkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTmFtZSAnIiArIG5hbWUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIicgaXMgbm90IHVuaXF1ZSIpOworICAgICAgICAgICAgbm9kZS5zZXRUcmVlKHRoaXMpOworICAgICAgICAgICAgcmVnaXN0cnkucHV0KG5hbWUsIG5vZGUpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENhbGN1bGF0ZSB0aGUgd2lkdGggb2YgdGhlIHN1YnRyZWUgYmVsb3cgdGhlIHNwZWNpZmllZCBub2RlLgorICAgICAqCisgICAgICogQHBhcmFtIG5vZGUgVGhlIG5vZGUgZm9yIHdoaWNoIHRvIGNhbGN1bGF0ZSB0aGUgd2lkdGgKKyAgICAgKi8KKyAgICBpbnQgZ2V0V2lkdGgoVHJlZUNvbnRyb2xOb2RlIG5vZGUpIHsKKworICAgICAgICBpbnQgd2lkdGggPSBub2RlLmdldFdpZHRoKCk7CisgICAgICAgIGlmICghbm9kZS5pc0V4cGFuZGVkKCkpCisgICAgICAgICAgICByZXR1cm4gKHdpZHRoKTsKKyAgICAgICAgVHJlZUNvbnRyb2xOb2RlIGNoaWxkcmVuW10gPSBub2RlLmZpbmRDaGlsZHJlbigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpbnQgY3VycmVudCA9IGdldFdpZHRoKGNoaWxkcmVuW2ldKTsKKyAgICAgICAgICAgIGlmIChjdXJyZW50ID4gd2lkdGgpCisgICAgICAgICAgICAgICAgd2lkdGggPSBjdXJyZW50OworICAgICAgICB9CisgICAgICAgIHJldHVybiAod2lkdGgpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBEZXJlZ2lzdGVyIHRoZSBzcGVjaWZpZWQgbm9kZSwgYXMgd2VsbCBhcyBhbGwgY2hpbGQgbm9kZXMgb2YgdGhpcworICAgICAqIG5vZGUsIGZyb20gb3VyIHJlZ2lzdHJ5IG9mIHRoZSBjb21wbGV0ZSB0cmVlLiAgSWYgdGhpcyBub2RlIGlzIG5vdAorICAgICAqIHByZXNlbnQsIG5vIGFjdGlvbiBpcyB0YWtlbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBub2RlIFRoZSA8Y29kZT5UcmVlQ29udHJvbE5vZGU8L2NvZGU+IHRvIGJlIGRlcmVnaXN0ZXJlZAorICAgICAqLworICAgIHZvaWQgcmVtb3ZlTm9kZShUcmVlQ29udHJvbE5vZGUgbm9kZSkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAocmVnaXN0cnkpIHsKKyAgICAgICAgICAgIFRyZWVDb250cm9sTm9kZSBjaGlsZHJlbltdID0gbm9kZS5maW5kQ2hpbGRyZW4oKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgcmVtb3ZlTm9kZShjaGlsZHJlbltpXSk7CisgICAgICAgICAgICBUcmVlQ29udHJvbE5vZGUgcGFyZW50ID0gbm9kZS5nZXRQYXJlbnQoKTsKKyAgICAgICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHBhcmVudC5yZW1vdmVDaGlsZChub2RlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5vZGUuc2V0UGFyZW50KG51bGwpOworICAgICAgICAgICAgbm9kZS5zZXRUcmVlKG51bGwpOworICAgICAgICAgICAgaWYgKG5vZGUgPT0gdGhpcy5yb290KSB7CisgICAgICAgICAgICAgICAgdGhpcy5yb290ID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlZ2lzdHJ5LnJlbW92ZShub2RlLmdldE5hbWUoKSk7CisgICAgICAgIH0KKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vVHJlZUNvbnRyb2xOb2RlLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vVHJlZUNvbnRyb2xOb2RlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ1YzRmYwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9UcmVlQ29udHJvbE5vZGUuamF2YQpAQCAtMCwwICsxLDM3MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAxLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW47CisKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKKworLyoqCisgKiA8cD5BbiBpbmRpdmlkdWFsIG5vZGUgb2YgYSB0cmVlIGNvbnRyb2wgcmVwcmVzZW50ZWQgYnkgYW4gaW5zdGFuY2Ugb2YKKyAqIDxjb2RlPlRyZWVDb250cm9sPC9jb2RlPiwgYW5kIHJlbmRlcmVkIGJ5IGFuIGluc3RhbmNlIG9mCisgKiA8Y29kZT5UcmVlQ29udHJvbFRhZzwvY29kZT4uPC9wPgorICoKKyAqIEBhdXRob3IgSmF6bWluIEpvbnNvbgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBUcmVlQ29udHJvbE5vZGUgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IFRyZWVDb250cm9sTm9kZSB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIEludGVybmFsIG5hbWUgb2YgdGhpcyBub2RlIChtdXN0IGJlIHVuaXF1ZSB3aXRoaW4KKyAgICAgKiAgdGhlIGVudGlyZSB0cmVlKQorICAgICAqIEBwYXJhbSBpY29uIFBhdGhuYW1lIG9mIHRoZSBpbWFnZSBmaWxlIGZvciB0aGUgaWNvbiB0byBiZSBkaXNwbGF5ZWQKKyAgICAgKiAgd2hlbiB0aGlzIG5vZGUgaXMgdmlzaWJsZSwgcmVsYXRpdmUgdG8gdGhlIGltYWdlIGRpcmVjdG9yeQorICAgICAqICBmb3Igb3VyIGltYWdlcworICAgICAqIEBwYXJhbSBsYWJlbCBUaGUgbGFiZWwgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCB0byB0aGUgdXNlciBpZgorICAgICAqICB0aGlzIG5vZGUgaXMgdmlzaWJsZQorICAgICAqIEBwYXJhbSBhY3Rpb24gVGhlIGh5cGVybGluayB0byBiZSBzZWxlY3RlZCBpZiB0aGUgdXNlcgorICAgICAqICBzZWxlY3RzIHRoaXMgbm9kZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBub2RlJ3MgbGFiZWwgc2hvdWxkCisgICAgICogIG5vdCBiZSBhIGh5cGVybGluaworICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIHdpbmRvdyB0YXJnZXQgaW4gd2hpY2ggdGhlIDxjb2RlPmFjdGlvbjwvY29kZT4KKyAgICAgKiAgaHlwZXJsaW5rJ3MgcmVzdWx0cyB3aWxsIGJlIGRpc3BsYXllZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gZm9yCisgICAgICogIHRoZSBjdXJyZW50IHdpbmRvdworICAgICAqIEBwYXJhbSBleHBhbmRlZCBTaG91bGQgdGhpcyBub2RlIGJlIGV4cGFuZGVkPworICAgICAqLworICAgIHB1YmxpYyBUcmVlQ29udHJvbE5vZGUoU3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaWNvbiwgU3RyaW5nIGxhYmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFjdGlvbiwgU3RyaW5nIHRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZXhwYW5kZWQsIFN0cmluZyBkb21haW4pIHsKKworICAgICAgICBzdXBlcigpOworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB0aGlzLmljb24gPSBpY29uOworICAgICAgICB0aGlzLmxhYmVsID0gbGFiZWw7CisgICAgICAgIHRoaXMuYWN0aW9uID0gYWN0aW9uOworICAgICAgICB0aGlzLnRhcmdldCA9IHRhcmdldDsKKyAgICAgICAgdGhpcy5leHBhbmRlZCA9IGV4cGFuZGVkOworICAgICAgICB0aGlzLmRvbWFpbiA9IGRvbWFpbjsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBzZXQgb2YgY2hpbGQgPGNvZGU+VHJlZUNvbnRyb2xOb2RlczwvY29kZT4gZm9yIHRoaXMgbm9kZSwgaW4gdGhlCisgICAgICogb3JkZXIgdGhhdCB0aGV5IHNob3VsZCBiZSBkaXNwbGF5ZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIEFycmF5TGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBoeXBlcmxpbmsgdG8gd2hpY2ggY29udHJvbCB3aWxsIGJlIGRpcmVjdGVkIGlmIHRoaXMgbm9kZQorICAgICAqIGlzIHNlbGVjdGVkIGJ5IHRoZSB1c2VyLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgYWN0aW9uID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWN0aW9uKCkgeworICAgICAgICByZXR1cm4gKHRoaXMuYWN0aW9uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZG9tYWluIG9mIHRoaXMgbm9kZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGRvbWFpbiA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldERvbWFpbigpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLmRvbWFpbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogSXMgdGhpcyBub2RlIGN1cnJlbnRseSBleHBhbmRlZD8KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBleHBhbmRlZCA9IGZhbHNlOworCisgICAgcHVibGljIGJvb2xlYW4gaXNFeHBhbmRlZCgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLmV4cGFuZGVkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRFeHBhbmRlZChib29sZWFuIGV4cGFuZGVkKSB7CisgICAgICAgIHRoaXMuZXhwYW5kZWQgPSBleHBhbmRlZDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSBwYXRobmFtZSB0byB0aGUgaWNvbiBmaWxlIGRpc3BsYXllZCB3aGVuIHRoaXMgbm9kZSBpcyB2aXNpYmxlLAorICAgICAqIHJlbGF0aXZlIHRvIHRoZSBpbWFnZSBkaXJlY3RvcnkgZm9yIG91ciBpbWFnZXMuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBpY29uID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWNvbigpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLmljb24pOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIGxhYmVsIHRoYXQgd2lsbCBiZSBkaXNwbGF5ZWQgd2hlbiB0aGlzIG5vZGUgaXMgdmlzaWJsZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGxhYmVsID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5sYWJlbCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBJcyB0aGlzIHRoZSBsYXN0IG5vZGUgaW4gdGhlIHNldCBvZiBjaGlsZHJlbiBmb3Igb3VyIHBhcmVudCBub2RlPworICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGxhc3QgPSBmYWxzZTsKKworICAgIHB1YmxpYyBib29sZWFuIGlzTGFzdCgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLmxhc3QpOworICAgIH0KKworICAgIHZvaWQgc2V0TGFzdChib29sZWFuIGxhc3QpIHsKKyAgICAgICAgdGhpcy5sYXN0ID0gbGFzdDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIElzIHRoaXMgYSAibGVhZiIgbm9kZSAoaS5lLiBvbmUgd2l0aCBubyBjaGlsZHJlbik/CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNMZWFmKCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKGNoaWxkcmVuKSB7CisgICAgICAgICAgICByZXR1cm4gKGNoaWxkcmVuLnNpemUoKSA8IDEpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgdW5pcXVlICh3aXRoaW4gdGhlIGVudGlyZSB0cmVlKSBuYW1lIG9mIHRoaXMgbm9kZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gKHRoaXMubmFtZSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgcGFyZW50IG5vZGUgb2YgdGhpcyBub2RlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzCisgICAgICogaXMgdGhlIHJvb3Qgbm9kZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgVHJlZUNvbnRyb2xOb2RlIHBhcmVudCA9IG51bGw7CisKKyAgICBwdWJsaWMgVHJlZUNvbnRyb2xOb2RlIGdldFBhcmVudCgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLnBhcmVudCk7CisgICAgfQorCisgICAgdm9pZCBzZXRQYXJlbnQoVHJlZUNvbnRyb2xOb2RlIHBhcmVudCkgeworICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKKyAgICAgICAgaWYgKHBhcmVudCA9PSBudWxsKQorICAgICAgICAgICAgd2lkdGggPSAxOworICAgICAgICBlbHNlCisgICAgICAgICAgICB3aWR0aCA9IHBhcmVudC5nZXRXaWR0aCgpICsgMTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIElzIHRoaXMgbm9kZSBjdXJyZW50bHkgc2VsZWN0ZWQ/CisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gc2VsZWN0ZWQgPSBmYWxzZTsKKworICAgIHB1YmxpYyBib29sZWFuIGlzU2VsZWN0ZWQoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5zZWxlY3RlZCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U2VsZWN0ZWQoYm9vbGVhbiBzZWxlY3RlZCkgeworICAgICAgICB0aGlzLnNlbGVjdGVkID0gc2VsZWN0ZWQ7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgd2luZG93IHRhcmdldCBmb3IgdGhlIGh5cGVybGluayBpZGVudGlmaWVkIGJ5IHRoZQorICAgICAqIDxjb2RlPmFjdGlvbjwvY29kZT4gcHJvcGVydHksIGlmIHRoaXMgbm9kZSBpcyBzZWxlY3RlZAorICAgICAqIGJ5IHRoZSB1c2VyLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgdGFyZ2V0ID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0KCkgeworICAgICAgICByZXR1cm4gKHRoaXMudGFyZ2V0KTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSA8Y29kZT5UcmVlQ29udHJvbDwvY29kZT4gaW5zdGFuY2UgcmVwcmVzZW50aW5nIHRoZQorICAgICAqIGVudGlyZSB0cmVlLgorICAgICAqLworICAgIHByb3RlY3RlZCBUcmVlQ29udHJvbCB0cmVlID0gbnVsbDsKKworICAgIHB1YmxpYyBUcmVlQ29udHJvbCBnZXRUcmVlKCkgeworICAgICAgICByZXR1cm4gKHRoaXMudHJlZSk7CisgICAgfQorCisgICAgdm9pZCBzZXRUcmVlKFRyZWVDb250cm9sIHRyZWUpIHsKKyAgICAgICAgdGhpcy50cmVlID0gdHJlZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSBkaXNwbGF5IHdpZHRoIG5lY2Vzc2FyeSB0byBkaXNwbGF5IHRoaXMgaXRlbSAoaWYgaXQgaXMgdmlzaWJsZSkuCisgICAgICogSWYgdGhpcyBpdGVtIGlzIG5vdCB2aXNpYmxlLCB0aGUgY2FsY3VsYXRlZCB3aWR0aCB3aWxsIGJlIHRoYXQgb2Ygb3VyCisgICAgICogbW9zdCBpbW1lZGlhdGVseSB2aXNpYmxlIHBhcmVudC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IHdpZHRoID0gMDsKKworICAgIHB1YmxpYyBpbnQgZ2V0V2lkdGgoKSB7CisgICAgICAgIHJldHVybiAodGhpcy53aWR0aCk7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogQWRkIGEgbmV3IGNoaWxkIG5vZGUgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjaGlsZCBUaGUgbmV3IGNoaWxkIG5vZGUKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBuYW1lIG9mIHRoZSBuZXcgY2hpbGQKKyAgICAgKiAgbm9kZSBpcyBub3QgdW5pcXVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQ2hpbGQoVHJlZUNvbnRyb2xOb2RlIGNoaWxkKQorICAgICAgICB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKworICAgICAgICB0cmVlLmFkZE5vZGUoY2hpbGQpOworICAgICAgICBjaGlsZC5zZXRQYXJlbnQodGhpcyk7CisgICAgICAgIHN5bmNocm9uaXplZCAoY2hpbGRyZW4pIHsKKyAgICAgICAgICAgIGludCBuID0gY2hpbGRyZW4uc2l6ZSgpOworICAgICAgICAgICAgaWYgKG4gPiAwKSB7CisgICAgICAgICAgICAgICAgVHJlZUNvbnRyb2xOb2RlIG5vZGUgPSAoVHJlZUNvbnRyb2xOb2RlKSBjaGlsZHJlbi5nZXQobiAtIDEpOworICAgICAgICAgICAgICAgIG5vZGUuc2V0TGFzdChmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjaGlsZC5zZXRMYXN0KHRydWUpOworICAgICAgICAgICAgY2hpbGRyZW4uYWRkKGNoaWxkKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBuZXcgY2hpbGQgbm9kZSBhdCB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uIGluIHRoZSBjaGlsZCBsaXN0LgorICAgICAqCisgICAgICogQHBhcmFtIG9mZnNldCBaZXJvLXJlbGF0aXZlIG9mZnNldCBhdCB3aGljaCB0aGUgbmV3IG5vZGUKKyAgICAgKiAgc2hvdWxkIGJlIGluc2VydGVkCisgICAgICogQHBhcmFtIGNoaWxkIFRoZSBuZXcgY2hpbGQgbm9kZQorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIG5hbWUgb2YgdGhlIG5ldyBjaGlsZAorICAgICAqICBub2RlIGlzIG5vdCB1bmlxdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRDaGlsZChpbnQgb2Zmc2V0LCBUcmVlQ29udHJvbE5vZGUgY2hpbGQpCisgICAgICAgIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworCisgICAgICAgIHRyZWUuYWRkTm9kZShjaGlsZCk7CisgICAgICAgIGNoaWxkLnNldFBhcmVudCh0aGlzKTsKKyAgICAgICAgc3luY2hyb25pemVkIChjaGlsZHJlbikgeworICAgICAgICAgICAgY2hpbGRyZW4uYWRkKG9mZnNldCwgY2hpbGQpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2V0IG9mIGNoaWxkIG5vZGVzIGZvciB0aGlzIG5vZGUuCisgICAgICovCisgICAgcHVibGljIFRyZWVDb250cm9sTm9kZVtdIGZpbmRDaGlsZHJlbigpIHsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKGNoaWxkcmVuKSB7CisgICAgICAgICAgICBUcmVlQ29udHJvbE5vZGUgcmVzdWx0c1tdID0gbmV3IFRyZWVDb250cm9sTm9kZVtjaGlsZHJlbi5zaXplKCldOworICAgICAgICAgICAgcmV0dXJuICgoVHJlZUNvbnRyb2xOb2RlW10pIGNoaWxkcmVuLnRvQXJyYXkocmVzdWx0cykpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGlzIG5vZGUgZnJvbSB0aGUgdHJlZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7CisKKyAgICAgICAgaWYgKHRyZWUgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJlZS5yZW1vdmVOb2RlKHRoaXMpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGUgY2hpbGQgbm9kZSAoYW5kIGFsbCBjaGlsZHJlbiBvZiB0aGF0IGNoaWxkKSBhdCB0aGUKKyAgICAgKiBzcGVjaWZpZWQgcG9zaXRpb24gaW4gdGhlIGNoaWxkIGxpc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb2Zmc2V0IFplcm8tcmVsYXRpdmUgb2Zmc2V0IGF0IHdoaWNoIHRoZSBleGlzdGluZworICAgICAqICBub2RlIHNob3VsZCBiZSByZW1vdmVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlQ2hpbGQoaW50IG9mZnNldCkgeworCisgICAgICAgIHN5bmNocm9uaXplZCAoY2hpbGRyZW4pIHsKKyAgICAgICAgICAgIFRyZWVDb250cm9sTm9kZSBjaGlsZCA9CisgICAgICAgICAgICAgICAgKFRyZWVDb250cm9sTm9kZSkgY2hpbGRyZW4uZ2V0KG9mZnNldCk7CisgICAgICAgICAgICB0cmVlLnJlbW92ZU5vZGUoY2hpbGQpOworICAgICAgICAgICAgY2hpbGQuc2V0UGFyZW50KG51bGwpOworICAgICAgICAgICAgY2hpbGRyZW4ucmVtb3ZlKG9mZnNldCk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUGFja2FnZSBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGNoaWxkIG5vZGUuICBJdCBpcyBhc3N1bWVkIHRoYXQgYWxsIG9mIHRoZQorICAgICAqIGNoaWxkcmVuIG9mIHRoaXMgY2hpbGQgbm9kZSBoYXZlIGFscmVhZHkgYmVlbiByZW1vdmVkLgorICAgICAqCisgICAgICogQHBhcmFtIGNoaWxkIENoaWxkIG5vZGUgdG8gYmUgcmVtb3ZlZAorICAgICAqLworICAgIHZvaWQgcmVtb3ZlQ2hpbGQoVHJlZUNvbnRyb2xOb2RlIGNoaWxkKSB7CisKKyAgICAgICAgaWYgKGNoaWxkID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBzeW5jaHJvbml6ZWQgKGNoaWxkcmVuKSB7CisgICAgICAgICAgICBpbnQgbiA9IGNoaWxkcmVuLnNpemUoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGNoaWxkID09IChUcmVlQ29udHJvbE5vZGUpIGNoaWxkcmVuLmdldChpKSkgeworICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbi5yZW1vdmUoaSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vVHJlZUNvbnRyb2xUYWcuamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9UcmVlQ29udHJvbFRhZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhMGM5NWUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vVHJlZUNvbnRyb2xUYWcuamF2YQpAQCAtMCwwICsxLDUyMCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAxLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW47CisKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMRW5jb2RlcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC5Kc3BFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AuSnNwV3JpdGVyOworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLlBhZ2VDb250ZXh0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWdTdXBwb3J0OworCisKKy8qKgorICogPHA+SlNQIGN1c3RvbSB0YWcgdGhhdCByZW5kZXJzIGEgdHJlZSBjb250cm9sIHJlcHJlc2VudGVkIGJ5IHRoZQorICogPGNvZGU+VHJlZUNvbnRyb2w8L2NvZGU+IGFuZCA8Y29kZT5UcmVlQ29udHJvbE5vZGU8L2NvZGU+IGNsYXNzZXMuCisgKiBUaGlzIHRhZyBoYXMgdGhlIGZvbGxvd2luZyB1c2VyLXNldHRhYmxlIGF0dHJpYnV0ZXM6PC9wPgorICogPHVsPgorICogPGxpPjxzdHJvbmc+YWN0aW9uPC9zdHJvbmc+IC0gSHlwZXJsaW5rIHRvIHdoaWNoIGV4cGFuZC9jb250cmFjdCBhY3Rpb25zCisgKiAgICAgc2hvdWxkIGJlIHNlbnQsIHdpdGggYSBzdHJpbmcgIjxjb2RlPiR7bm9kZX08L2NvZGU+IG1hcmtpbmcgd2hlcmUKKyAqICAgICB0aGUgbm9kZSBuYW1lIG9mIHRoZSBhZmZlY3RlZCBub2RlIHNob3VsZCBiZSBpbmNsdWRlZC48L2xpPgorICogPGxpPjxzdHJvbmc+aW1hZ2VzPC9zdHJvbmc+IC0gTmFtZSBvZiB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGltYWdlcworICogICAgIGZvciBvdXIgaWNvbnMsIHJlbGF0aXZlIHRvIHRoZSBwYWdlIGluY2x1ZGluZyB0aGlzIHRhZy4gIElmIG5vdAorICogICAgIHNwZWNpZmllZCwgZGVmYXVsdHMgdG8gImltYWdlcyIuPC9saT4KKyAqIDxsaT48c3Ryb25nPnNjb3BlPC9zdHJvbmc+IC0gQXR0cmlidXRlIHNjb3BlIGluIHdoaWNoIHRoZSA8Y29kZT50cmVlPC9jb2RlPgorICogICAgIGF0dHJpYnV0ZSBpcyB0byBiZSBmb3VuZCAocGFnZSwgcmVxdWVzdCwgc2Vzc2lvbiwgYXBwbGljYXRpb24pLiAgSWYKKyAqICAgICBub3Qgc3BlY2lmaWVkLCB0aGUgYXR0cmlidXRlIGlzIHNlYXJjaGVkIGZvciBpbiBhbGwgc2NvcGVzLjwvbGk+CisgKiA8bGk+PHN0cm9uZz5zdHlsZTwvc3Ryb25nPiAtIENTUyBzdHlsZSA8Y29kZT5jbGFzczwvY29kZT4gdG8gYmUgYXBwbGllZAorICogICAgIHRvIGJlIGFwcGxpZWQgdG8gdGhlIGVudGlyZSByZW5kZXJlZCBvdXRwdXQgb2YgdGhlIHRyZWUgY29udHJvbC4KKyAqICAgICBJZiBub3Qgc3BlY2lmaWVkLCBubyBzdHlsZSBjbGFzcyBpcyBhcHBsaWVkLjwvbGk+CisgKiA8bGk+PHN0cm9uZz5zdHlsZVNlbGVjdGVkPC9zdHJvbmc+IC0gQ1NTIHN0eWxlIDxjb2RlPmNsYXNzPC9jb2RlPiB0byBiZQorICogICAgIGFwcGxpZWQgdG8gdGhlIHRleHQgb2YgYW55IGVsZW1lbnQgdGhhdCBpcyBjdXJyZW50bHkgc2VsZWN0ZWQuICBJZiBub3QKKyAqICAgICBzcGVjaWZpZWQsIG5vIGFkZGl0aW9uYWwgc3R5bGUgY2xhc3MgaXMgYXBwbGllZC48L2xpPgorICogPGxpPjxzdHJvbmc+c3R5bGVVbnNlbGVjdGVkPC9zdHJvbmc+IC0gQ1NTIHN0eWxlIDxjb2RlPmNsYXNzPC9jb2RlPiB0byBiZQorICogICAgIGFwcGxpZWQgdG8gdGhlIHRleHQgb2YgYW55IGVsZW1lbnQgdGhhdCBpcyBub3QgY3VycmVudGx5IHNlbGVjdGVkLgorICogICAgIElmIG5vdCBzcGVjaWZpZWQsIG5vIGFkZGl0aW9uYWwgc3R5bGUgY2xhc3MgaXMgYXBwbGllZC48L2xpPgorICogPGxpPjxzdHJvbmc+dHJlZTwvc3Ryb25nPiAtIEF0dHJpYnV0ZSBuYW1lIHVuZGVyIHdoaWNoIHRoZQorICogICAgIDxjb2RlPlRyZWVDb250cm9sPC9jb2RlPiBiZWFuIG9mIHRoZSB0cmVlIHdlIGFyZSByZW5kZXJpbmcKKyAqICAgICBpcyBzdG9yZWQsIGluIHRoZSBzY29wZSBzcGVjaWZpZWQgYnkgdGhlIDxjb2RlPnNjb3BlPC9jb2RlPgorICogICAgIGF0dHJpYnV0ZS4gIFRoaXMgYXR0cmlidXRlIGlzIHJlcXVpcmVkLjwvbGk+CisgKiA8L3VsPgorICoKKyAqIDxzdHJvbmc+RklYTUU8L3N0cm9uZz4gLSBJbnRlcm5hdGlvbmFsaXplIHRoZSBleGNlcHRpb24gbWVzc2FnZXMhCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBUcmVlQ29udHJvbFRhZyBleHRlbmRzIFRhZ1N1cHBvcnQgeworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBkaXJlY3RvcnkgbmFtZSBmb3IgaWNvbiBpbWFnZXMuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0lNQUdFUyA9ICJpbWFnZXMiOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgbmFtZXMgb2YgdHJlZSBzdGF0ZSBpbWFnZXMgdGhhdCB3ZSBuZWVkLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1BR0VfSEFORExFX0RPV05fTEFTVCA9ICAgICJoYW5kbGVkb3dubGFzdC5naWYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1BR0VfSEFORExFX0RPV05fTUlERExFID0gICJoYW5kbGVkb3dubWlkZGxlLmdpZiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBJTUFHRV9IQU5ETEVfUklHSFRfTEFTVCA9ICAgImhhbmRsZXJpZ2h0bGFzdC5naWYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1BR0VfSEFORExFX1JJR0hUX01JRERMRSA9ICJoYW5kbGVyaWdodG1pZGRsZS5naWYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1BR0VfTElORV9MQVNUID0gICAgICAgICAgICJsaW5lbGFzdG5vZGUuZ2lmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIElNQUdFX0xJTkVfTUlERExFID0gICAgICAgICAibGluZW1pZGRsZW5vZGUuZ2lmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIElNQUdFX0xJTkVfVkVSVElDQUwgPSAgICAgICAibGluZXZlcnRpY2FsLmdpZiI7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgaHlwZXJsaW5rIHRvIGJlIHVzZWQgZm9yIHN1Ym1pdHRpbmcgcmVxdWVzdHMgdG8gZXhwYW5kIGFuZAorICAgICAqIGNvbnRyYWN0IHRyZWUgbm9kZXMuICBUaGUgcGxhY2Vob2xkZXIgIjxjb2RlPiR7bmFtZX08L2NvZGU+IiB3aWxsCisgICAgICogYmUgcmVwbGFjZWQgYnkgdGhlIDxjb2RlPm5hbWU8L2NvZGU+IHByb3BlcnR5IG9mIHRoZSBjdXJyZW50CisgICAgICogdHJlZSBub2RlLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgYWN0aW9uID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWN0aW9uKCkgeworICAgICAgICByZXR1cm4gKHRoaXMuYWN0aW9uKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBY3Rpb24oU3RyaW5nIGFjdGlvbikgeworICAgICAgICB0aGlzLmFjdGlvbiA9IGFjdGlvbjsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgaW1hZ2VzIGZvciBvdXIgaWNvbnMsCisgICAgICogcmVsYXRpdmUgdG8gdGhlIHBhZ2UgaW5jbHVkaW5nIHRoaXMgdGFnLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgaW1hZ2VzID0gREVGQVVMVF9JTUFHRVM7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEltYWdlcygpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLmltYWdlcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SW1hZ2VzKFN0cmluZyBpbWFnZXMpIHsKKyAgICAgICAgdGhpcy5pbWFnZXMgPSBpbWFnZXM7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgc2NvcGUgaW4gd2hpY2ggdG8gc2VhcmNoIGZvciB0aGUgPGNvZGU+dHJlZTwvY29kZT4KKyAgICAgKiBhdHRyaWJ1dGUuICBNdXN0IGJlICJwYWdlIiwgInJlcXVlc3QiLCAic2Vzc2lvbiIsIG9yICJhcHBsaWNhdGlvbiIKKyAgICAgKiAob3IgPGNvZGU+bnVsbDwvY29kZT4gZm9yIGFuIGFzY2VuZGluZy12aXNpYmlsaXR5IHNlYXJjaCkuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBzY29wZSA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFNjb3BlKCkgeworICAgICAgICByZXR1cm4gKHRoaXMuc2NvcGUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFNjb3BlKFN0cmluZyBzY29wZSkgeworICAgICAgICBpZiAoISJwYWdlIi5lcXVhbHMoc2NvcGUpICYmCisgICAgICAgICAgICAhInJlcXVlc3QiLmVxdWFscyhzY29wZSkgJiYKKyAgICAgICAgICAgICEic2Vzc2lvbiIuZXF1YWxzKHNjb3BlKSAmJgorICAgICAgICAgICAgISJhcHBsaWNhdGlvbiIuZXF1YWxzKHNjb3BlKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgc2NvcGUgJyIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29wZSArICInIik7CisgICAgICAgIHRoaXMuc2NvcGUgPSBzY29wZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSBDU1Mgc3R5bGUgPGNvZGU+Y2xhc3M8L2NvZGU+IHRvIGJlIGFwcGxpZWQgdG8gdGhlIGVudGlyZSB0cmVlLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgc3R5bGUgPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXRTdHlsZSgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLnN0eWxlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTdHlsZShTdHJpbmcgc3R5bGUpIHsKKyAgICAgICAgdGhpcy5zdHlsZSA9IHN0eWxlOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIENTUyBzdHlsZSA8Y29kZT5jbGFzczwvY29kZT4gdG8gYmUgYXBwbGllZCB0byB0aGUgdGV4dAorICAgICAqIG9mIHNlbGVjdGVkIG5vZGVzLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgc3R5bGVTZWxlY3RlZCA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFN0eWxlU2VsZWN0ZWQoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5zdHlsZVNlbGVjdGVkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTdHlsZVNlbGVjdGVkKFN0cmluZyBzdHlsZVNlbGVjdGVkKSB7CisgICAgICAgIHRoaXMuc3R5bGVTZWxlY3RlZCA9IHN0eWxlU2VsZWN0ZWQ7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgQ1NTIHN0eWxlIDxjb2RlPmNsYXNzPC9jb2RlPiB0byBiZSBhcHBsaWVkIHRvIHRoZSB0ZXh0CisgICAgICogb2YgdW5zZWxlY3RlZCBub2Rlcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHN0eWxlVW5zZWxlY3RlZCA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFN0eWxlVW5zZWxlY3RlZCgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLnN0eWxlVW5zZWxlY3RlZCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U3R5bGVVbnNlbGVjdGVkKFN0cmluZyBzdHlsZVVuc2VsZWN0ZWQpIHsKKyAgICAgICAgdGhpcy5zdHlsZVVuc2VsZWN0ZWQgPSBzdHlsZVVuc2VsZWN0ZWQ7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIChpbiB0aGUgc3BlY2lmaWVkIHNjb3BlKSB1bmRlciB3aGljaCBvdXIKKyAgICAgKiA8Y29kZT5UcmVlQ29udHJvbDwvY29kZT4gaW5zdGFuY2UgaXMgc3RvcmVkLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgdHJlZSA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFRyZWUoKSB7CisgICAgICAgIHJldHVybiAodGhpcy50cmVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUcmVlKFN0cmluZyB0cmVlKSB7CisgICAgICAgIHRoaXMudHJlZSA9IHRyZWU7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmVuZGVyIHRoaXMgdHJlZSBjb250cm9sLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBKc3BFeGNlcHRpb24gaWYgYSBwcm9jZXNzaW5nIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBpbnQgZG9FbmRUYWcoKSB0aHJvd3MgSnNwRXhjZXB0aW9uIHsKKworICAgICAgICBUcmVlQ29udHJvbCB0cmVlQ29udHJvbCA9IGdldFRyZWVDb250cm9sKCk7CisgICAgICAgIEpzcFdyaXRlciBvdXQgPSBwYWdlQ29udGV4dC5nZXRPdXQoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG91dC5wcmludAorICAgICAgICAgICAgICAgICgiPHRhYmxlIGJvcmRlcj1cIjBcIiBjZWxsc3BhY2luZz1cIjBcIiBjZWxscGFkZGluZz1cIjBcIiIpOworICAgICAgICAgICAgaWYgKHN0eWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoIiBjbGFzcz1cIiIpOworICAgICAgICAgICAgICAgIG91dC5wcmludChzdHlsZSk7CisgICAgICAgICAgICAgICAgb3V0LnByaW50KCJcIiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3V0LnByaW50bG4oIj4iKTsKKyAgICAgICAgICAgIGludCBsZXZlbCA9IDA7CisgICAgICAgICAgICBUcmVlQ29udHJvbE5vZGUgbm9kZSA9IHRyZWVDb250cm9sLmdldFJvb3QoKTsKKyAgICAgICAgICAgIHJlbmRlcihvdXQsIG5vZGUsIGxldmVsLCB0cmVlQ29udHJvbC5nZXRXaWR0aCgpLCB0cnVlKTsKKyAgICAgICAgICAgIG91dC5wcmludGxuKCI8L3RhYmxlPiIpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSnNwRXhjZXB0aW9uKGUpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIChFVkFMX1BBR0UpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZWxlYXNlIGFsbCBzdGF0ZSBpbmZvcm1hdGlvbiBzZXQgYnkgdGhpcyB0YWcuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKKworICAgICAgICB0aGlzLmFjdGlvbiA9IG51bGw7CisgICAgICAgIHRoaXMuaW1hZ2VzID0gREVGQVVMVF9JTUFHRVM7CisgICAgICAgIHRoaXMuc2NvcGUgPSBudWxsOworICAgICAgICB0aGlzLnN0eWxlID0gbnVsbDsKKyAgICAgICAgdGhpcy5zdHlsZVNlbGVjdGVkID0gbnVsbDsKKyAgICAgICAgdGhpcy5zdHlsZVVuc2VsZWN0ZWQgPSBudWxsOworICAgICAgICB0aGlzLnRyZWUgPSBudWxsOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvdGVjdGVkIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSA8Y29kZT5UcmVlQ29udHJvbDwvY29kZT4gaW5zdGFuY2UgZm9yIHRoZSB0cmVlIGNvbnRyb2wgdGhhdAorICAgICAqIHdlIGFyZSByZW5kZXJpbmcuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEpzcEV4Y2VwdGlvbiBpZiBubyBUcmVlQ29udHJvbCBpbnN0YW5jZSBjYW4gYmUgZm91bmQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgVHJlZUNvbnRyb2wgZ2V0VHJlZUNvbnRyb2woKSB0aHJvd3MgSnNwRXhjZXB0aW9uIHsKKworICAgICAgICBPYmplY3QgdHJlZUNvbnRyb2wgPSBudWxsOworICAgICAgICBpZiAoc2NvcGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHRyZWVDb250cm9sID0gcGFnZUNvbnRleHQuZmluZEF0dHJpYnV0ZSh0cmVlKTsKKyAgICAgICAgZWxzZSBpZiAoInBhZ2UiLmVxdWFscyhzY29wZSkpCisgICAgICAgICAgICB0cmVlQ29udHJvbCA9CisgICAgICAgICAgICAgICAgcGFnZUNvbnRleHQuZ2V0QXR0cmlidXRlKHRyZWUsIFBhZ2VDb250ZXh0LlBBR0VfU0NPUEUpOworICAgICAgICBlbHNlIGlmICgicmVxdWVzdCIuZXF1YWxzKHNjb3BlKSkKKyAgICAgICAgICAgIHRyZWVDb250cm9sID0KKyAgICAgICAgICAgICAgICBwYWdlQ29udGV4dC5nZXRBdHRyaWJ1dGUodHJlZSwgUGFnZUNvbnRleHQuUkVRVUVTVF9TQ09QRSk7CisgICAgICAgIGVsc2UgaWYgKCJzZXNzaW9uIi5lcXVhbHMoc2NvcGUpKQorICAgICAgICAgICAgdHJlZUNvbnRyb2wgPQorICAgICAgICAgICAgICAgIHBhZ2VDb250ZXh0LmdldEF0dHJpYnV0ZSh0cmVlLCBQYWdlQ29udGV4dC5TRVNTSU9OX1NDT1BFKTsKKyAgICAgICAgZWxzZSBpZiAoImFwcGxpY2F0aW9uIi5lcXVhbHMoc2NvcGUpKQorICAgICAgICAgICAgdHJlZUNvbnRyb2wgPQorICAgICAgICAgICAgICAgIHBhZ2VDb250ZXh0LmdldEF0dHJpYnV0ZSh0cmVlLCBQYWdlQ29udGV4dC5BUFBMSUNBVElPTl9TQ09QRSk7CisgICAgICAgIGlmICh0cmVlQ29udHJvbCA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IEpzcEV4Y2VwdGlvbigiQ2Fubm90IGZpbmQgdHJlZSBjb250cm9sIGF0dHJpYnV0ZSAnIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyZWUgKyAiJyIpOworICAgICAgICBlbHNlIGlmICghKHRyZWVDb250cm9sIGluc3RhbmNlb2YgVHJlZUNvbnRyb2wpKQorICAgICAgICAgICAgdGhyb3cgbmV3IEpzcEV4Y2VwdGlvbigiSW52YWxpZCB0cmVlIGNvbnRyb2wgYXR0cmlidXRlICciICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJlZSArICInIik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiAoKFRyZWVDb250cm9sKSB0cmVlQ29udHJvbCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbmRlciB0aGUgc3BlY2lmaWVkIG5vZGUsIGFzIGNvbnRyb2xsZWQgYnkgdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLgorICAgICAqCisgICAgICogQHBhcmFtIG91dCBUaGUgPGNvZGU+SnNwV3JpdGVyPC9jb2RlPiB0byB3aGljaCB3ZSBhcmUgd3JpdGluZworICAgICAqIEBwYXJhbSBub2RlIFRoZSA8Y29kZT5UcmVlQ29udHJvbE5vZGU8L2NvZGU+IHdlIGFyZSBjdXJyZW50bHkKKyAgICAgKiAgcmVuZGVyaW5nCisgICAgICogQHBhcmFtIGxldmVsIFRoZSBpbmRlbnRhdGlvbiBsZXZlbCBvZiB0aGlzIG5vZGUgaW4gdGhlIHRyZWUKKyAgICAgKiBAcGFyYW0gd2lkdGggVG90YWwgZGlzcGxheWFibGUgd2lkdGggb2YgdGhlIHRyZWUKKyAgICAgKiBAcGFyYW0gbGFzdCBJcyB0aGlzIHRoZSBsYXN0IG5vZGUgaW4gYSBsaXN0PworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcmVuZGVyKEpzcFdyaXRlciBvdXQsIFRyZWVDb250cm9sTm9kZSBub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGV2ZWwsIGludCB3aWR0aCwgYm9vbGVhbiBsYXN0KQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UgPQorICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UpIHBhZ2VDb250ZXh0LmdldFJlc3BvbnNlKCk7CisgICAgCisgICAgICAgIC8vIGlmIHRoZSBub2RlIGlzIHJvb3Qgbm9kZSBhbmQgdGhlIGxhYmVsIHZhbHVlIGlzCisgICAgICAgIC8vIG51bGwsIHRoZW4gZG8gbm90IHJlbmRlciByb290IG5vZGUgaW4gdGhlIHRyZWUuCisgICAgICAgIAorICAgICAgICBpZiAoIlJPT1QtTk9ERSIuZXF1YWxzSWdub3JlQ2FzZShub2RlLmdldE5hbWUoKSkgJiYKKyAgICAgICAgKG5vZGUuZ2V0TGFiZWwoKSA9PSBudWxsKSkgeworICAgICAgICAgICAgLy8gUmVuZGVyIHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUKKyAgICAgICAgICAgIFRyZWVDb250cm9sTm9kZSBjaGlsZHJlbltdID0gbm9kZS5maW5kQ2hpbGRyZW4oKTsKKyAgICAgICAgICAgIGludCBsYXN0SW5kZXggPSBjaGlsZHJlbi5sZW5ndGggLSAxOworICAgICAgICAgICAgaW50IG5ld0xldmVsID0gbGV2ZWwgKyAxOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIHJlbmRlcihvdXQsIGNoaWxkcmVuW2ldLCBuZXdMZXZlbCwgd2lkdGgsIGkgPT0gbGFzdEluZGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gUmVuZGVyIHRoZSBiZWdpbm5pbmcgb2YgdGhpcyBub2RlCisgICAgICAgIG91dC5wcmludGxuKCIgIDx0ciB2YWxpZ249XCJtaWRkbGVcIj4iKTsKKworICAgICAgICAvLyBDcmVhdGUgdGhlIGFwcHJvcHJpYXRlIG51bWJlciBvZiBpbmRlbnRzCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGV2ZWw7IGkrKykgeworICAgICAgICAgICAgaW50IGxldmVscyA9IGxldmVsIC0gaTsKKyAgICAgICAgICAgIFRyZWVDb250cm9sTm9kZSBwYXJlbnQgPSBub2RlOworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDE7IGogPD0gbGV2ZWxzOyBqKyspCisgICAgICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50LmdldFBhcmVudCgpOworICAgICAgICAgICAgaWYgKHBhcmVudC5pc0xhc3QoKSkKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoIiAgICA8dGQ+PC90ZD4iKTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIG91dC5wcmludCgiICAgIDx0ZD48aW1nIHNyYz1cIiIpOworICAgICAgICAgICAgICAgIG91dC5wcmludChpbWFnZXMpOworICAgICAgICAgICAgICAgIG91dC5wcmludCgiLyIpOworICAgICAgICAgICAgICAgIG91dC5wcmludChJTUFHRV9MSU5FX1ZFUlRJQ0FMKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoIlwiIGFsdD1cIlwiIGJvcmRlcj1cIjBcIj48L3RkPiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3V0LnByaW50bG4oKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlbmRlciB0aGUgdHJlZSBzdGF0ZSBpbWFnZSBmb3IgdGhpcyBub2RlCisKKyAgICAgICAgLy8gSEFDSyB0byB0YWtlIGludG8gYWNjb3VudCBzcGVjaWFsIGNoYXJhY3RlcnMgbGlrZSA9IGFuZCAmCisgICAgICAgIC8vIGluIHRoZSBub2RlIG5hbWUsIGNvdWxkIHJlbW92ZSB0aGlzIGNvZGUgaWYgZW5jb2RlIFVSTAorICAgICAgICAvLyBhbmQgbGF0ZXIgcmVxdWVzdC5nZXRQYXJhbWV0ZXIoKSBjb3VsZCBkZWFsIHdpdGggPSBhbmQgJgorICAgICAgICAvLyBjaGFyYWN0ZXIgaW4gcGFyYW1ldGVyIHZhbHVlcy4gCisgICAgICAgIFN0cmluZyBlbmNvZGVkTm9kZU5hbWUgPSBVUkxFbmNvZGVyLmVuY29kZShub2RlLmdldE5hbWUoKSk7CisKKyAgICAgICAgU3RyaW5nIGFjdGlvbiA9IHJlcGxhY2UoZ2V0QWN0aW9uKCksICIke25hbWV9IiwgZW5jb2RlZE5vZGVOYW1lKTsKKworICAgICAgICAKKyAgICAgICAgU3RyaW5nIHVwZGF0ZVRyZWVBY3Rpb24gPQorICAgICAgICAgICAgcmVwbGFjZShnZXRBY3Rpb24oKSwgInRyZWU9JHtuYW1lfSIsICJzZWxlY3Q9IiArIGVuY29kZWROb2RlTmFtZSk7CisgICAgICAgIHVwZGF0ZVRyZWVBY3Rpb24gPQorICAgICAgICAgICAgKChIdHRwU2VydmxldFJlc3BvbnNlKSBwYWdlQ29udGV4dC5nZXRSZXNwb25zZSgpKS4KKyAgICAgICAgICAgIGVuY29kZVVSTCh1cGRhdGVUcmVlQWN0aW9uKTsKKworICAgICAgICBvdXQucHJpbnQoIiAgICA8dGQ+Iik7CisgICAgICAgIGlmICgoYWN0aW9uICE9IG51bGwpICYmICFub2RlLmlzTGVhZigpKSB7CisgICAgICAgICAgICBvdXQucHJpbnQoIjxhIGhyZWY9XCIiKTsKKyAgICAgICAgICAgIG91dC5wcmludChyZXNwb25zZS5lbmNvZGVVUkwoYWN0aW9uKSk7CisgICAgICAgICAgICBvdXQucHJpbnQoIlwiPiIpOworICAgICAgICB9CisgICAgICAgIG91dC5wcmludCgiPGltZyBzcmM9XCIiKTsKKyAgICAgICAgb3V0LnByaW50KGltYWdlcyk7CisgICAgICAgIG91dC5wcmludCgiLyIpOworICAgICAgICBpZiAobm9kZS5pc0xlYWYoKSkgeworICAgICAgICAgICAgaWYgKG5vZGUuaXNMYXN0KCkpCisgICAgICAgICAgICAgICAgb3V0LnByaW50KElNQUdFX0xJTkVfTEFTVCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgb3V0LnByaW50KElNQUdFX0xJTkVfTUlERExFKTsKKyAgICAgICAgICAgIG91dC5wcmludCgiXCIgYWx0PVwiIik7CisgICAgICAgIH0gZWxzZSBpZiAobm9kZS5pc0V4cGFuZGVkKCkpIHsKKyAgICAgICAgICAgIGlmIChub2RlLmlzTGFzdCgpKQorICAgICAgICAgICAgICAgIG91dC5wcmludChJTUFHRV9IQU5ETEVfRE9XTl9MQVNUKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoSU1BR0VfSEFORExFX0RPV05fTUlERExFKTsKKyAgICAgICAgICAgIG91dC5wcmludCgiXCIgYWx0PVwiY2xvc2Ugbm9kZSIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKG5vZGUuaXNMYXN0KCkpCisgICAgICAgICAgICAgICAgb3V0LnByaW50KElNQUdFX0hBTkRMRV9SSUdIVF9MQVNUKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoSU1BR0VfSEFORExFX1JJR0hUX01JRERMRSk7CisgICAgICAgICAgICBvdXQucHJpbnQoIlwiIGFsdD1cImV4cGFuZCBub2RlIik7CisgICAgICAgIH0KKyAgICAgICAgb3V0LnByaW50KCJcIiBib3JkZXI9XCIwXCI+Iik7CisgICAgICAgIGlmICgoYWN0aW9uICE9IG51bGwpICYmICFub2RlLmlzTGVhZigpKQorICAgICAgICAgICAgb3V0LnByaW50KCI8L2E+Iik7CisgICAgICAgIG91dC5wcmludGxuKCI8L3RkPiIpOworCisgICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgaHlwZXJsaW5rIGZvciB0aGlzIG5vZGUgKGlmIGFueSkKKyAgICAgICAgU3RyaW5nIGh5cGVybGluayA9IG51bGw7CisgICAgICAgIGlmIChub2RlLmdldEFjdGlvbigpICE9IG51bGwpCisgICAgICAgICAgICBoeXBlcmxpbmsgPSAoKEh0dHBTZXJ2bGV0UmVzcG9uc2UpIHBhZ2VDb250ZXh0LmdldFJlc3BvbnNlKCkpLgorICAgICAgICAgICAgICAgIGVuY29kZVVSTChub2RlLmdldEFjdGlvbigpKTsKKworICAgICAgICAvLyBSZW5kZXIgdGhlIGljb24gZm9yIHRoaXMgbm9kZSAoaWYgYW55KQorICAgICAgICBvdXQucHJpbnQoIiAgICA8dGQgY29sc3Bhbj1cIiIpOworICAgICAgICBvdXQucHJpbnQod2lkdGggLSBsZXZlbCArIDEpOworICAgICAgICBvdXQucHJpbnQoIlwiPiIpOworICAgICAgICBpZiAobm9kZS5nZXRJY29uKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGh5cGVybGluayAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgb3V0LnByaW50KCI8YSBocmVmPVwiIik7CisgICAgICAgICAgICAgICAgb3V0LnByaW50KGh5cGVybGluayk7CisgICAgICAgICAgICAgICAgb3V0LnByaW50KCJcIiIpOworICAgICAgICAgICAgICAgIFN0cmluZyB0YXJnZXQgPSBub2RlLmdldFRhcmdldCgpOworICAgICAgICAgICAgICAgIGlmKHRhcmdldCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCgiIHRhcmdldD1cIiIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQodGFyZ2V0KTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KCJcIiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyB0byByZWZyZXNoIHRoZSB0cmVlIGluIHRoZSBzYW1lICdzZWxmJyBmcmFtZQorICAgICAgICAgICAgICAgIG91dC5wcmludCgiIG9uY2xpY2s9XCIiKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoInNlbGYubG9jYXRpb24uaHJlZj0nIiArIHVwZGF0ZVRyZWVBY3Rpb24gKyAiJyIpOworICAgICAgICAgICAgICAgIG91dC5wcmludCgiXCIiKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoIj4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dC5wcmludCgiPGltZyBzcmM9XCIiKTsKKyAgICAgICAgICAgIG91dC5wcmludChpbWFnZXMpOworICAgICAgICAgICAgb3V0LnByaW50KCIvIik7CisgICAgICAgICAgICBvdXQucHJpbnQobm9kZS5nZXRJY29uKCkpOworICAgICAgICAgICAgb3V0LnByaW50KCJcIiBhbHQ9XCIiKTsKKyAgICAgICAgICAgIG91dC5wcmludCgiXCIgYm9yZGVyPVwiMFwiPiIpOworICAgICAgICAgICAgaWYgKGh5cGVybGluayAhPSBudWxsKQorICAgICAgICAgICAgICAgIG91dC5wcmludCgiPC9hPiIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmVuZGVyIHRoZSBsYWJlbCBmb3IgdGhpcyBub2RlIChpZiBhbnkpCisKKyAgICAgICAgaWYgKG5vZGUuZ2V0TGFiZWwoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgbGFiZWxTdHlsZSA9IG51bGw7CisgICAgICAgICAgICBpZiAobm9kZS5pc1NlbGVjdGVkKCkgJiYgKHN0eWxlU2VsZWN0ZWQgIT0gbnVsbCkpCisgICAgICAgICAgICAgICAgbGFiZWxTdHlsZSA9IHN0eWxlU2VsZWN0ZWQ7CisgICAgICAgICAgICBlbHNlIGlmICghbm9kZS5pc1NlbGVjdGVkKCkgJiYgKHN0eWxlVW5zZWxlY3RlZCAhPSBudWxsKSkKKyAgICAgICAgICAgICAgICBsYWJlbFN0eWxlID0gc3R5bGVVbnNlbGVjdGVkOworICAgICAgICAgICAgaWYgKGh5cGVybGluayAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gTm90ZSB0aGUgbGVhZGluZyBzcGFjZSBzbyB0aGF0IHRoZSB0ZXh0IGhhcyBzb21lIHNwYWNlCisgICAgICAgICAgICAgICAgLy8gYmV0d2VlbiBpdCBhbmQgYW55IHByZWNlZGluZyBpbWFnZXMKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoIiA8YSBocmVmPVwiIik7CisgICAgICAgICAgICAgICAgb3V0LnByaW50KGh5cGVybGluayk7CisgICAgICAgICAgICAgICAgb3V0LnByaW50KCJcIiIpOworICAgICAgICAgICAgICAgIFN0cmluZyB0YXJnZXQgPSBub2RlLmdldFRhcmdldCgpOworICAgICAgICAgICAgICAgIGlmKHRhcmdldCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCgiIHRhcmdldD1cIiIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQodGFyZ2V0KTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KCJcIiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobGFiZWxTdHlsZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCgiIGNsYXNzPVwiIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludChsYWJlbFN0eWxlKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KCJcIiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyB0byByZWZyZXNoIHRoZSB0cmVlIGluIHRoZSBzYW1lICdzZWxmJyBmcmFtZQorICAgICAgICAgICAgICAgIG91dC5wcmludCgiIG9uY2xpY2s9XCIiKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoInNlbGYubG9jYXRpb24uaHJlZj0nIiArIHVwZGF0ZVRyZWVBY3Rpb24gKyAiJyIpOworICAgICAgICAgICAgICAgIG91dC5wcmludCgiXCIiKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoIj4iKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobGFiZWxTdHlsZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgb3V0LnByaW50KCI8c3BhbiBjbGFzcz1cIiIpOworICAgICAgICAgICAgICAgIG91dC5wcmludChsYWJlbFN0eWxlKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoIlwiPiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3V0LnByaW50KG5vZGUuZ2V0TGFiZWwoKSk7CisgICAgICAgICAgICBpZiAoaHlwZXJsaW5rICE9IG51bGwpCisgICAgICAgICAgICAgICAgb3V0LnByaW50KCI8L2E+Iik7CisgICAgICAgICAgICBlbHNlIGlmIChsYWJlbFN0eWxlICE9IG51bGwpCisgICAgICAgICAgICAgICAgb3V0LnByaW50KCI8L3NwYW4+Iik7CisgICAgICAgIH0KKyAgICAgICAgb3V0LnByaW50bG4oIjwvdGQ+Iik7CisKKyAgICAgICAgLy8gUmVuZGVyIHRoZSBlbmQgb2YgdGhpcyBub2RlCisgICAgICAgIG91dC5wcmludGxuKCIgIDwvdHI+Iik7CisKKyAgICAgICAgLy8gUmVuZGVyIHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUKKyAgICAgICAgaWYgKG5vZGUuaXNFeHBhbmRlZCgpKSB7CisgICAgICAgICAgICBUcmVlQ29udHJvbE5vZGUgY2hpbGRyZW5bXSA9IG5vZGUuZmluZENoaWxkcmVuKCk7CisgICAgICAgICAgICBpbnQgbGFzdEluZGV4ID0gY2hpbGRyZW4ubGVuZ3RoIC0gMTsKKyAgICAgICAgICAgIGludCBuZXdMZXZlbCA9IGxldmVsICsgMTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICByZW5kZXIob3V0LCBjaGlsZHJlbltpXSwgbmV3TGV2ZWwsIHdpZHRoLCBpID09IGxhc3RJbmRleCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVwbGFjZSBhbnkgb2NjdXJyZW5jZSBvZiB0aGUgc3BlY2lmaWVkIHBsYWNlaG9sZGVyIGluIHRoZSBzcGVjaWZpZWQKKyAgICAgKiB0ZW1wbGF0ZSBzdHJpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIHJlcGxhY2VtZW50IHZhbHVlLgorICAgICAqCisgICAgICogQHBhcmFtIHRlbXBsYXRlIFBhdHRlcm4gc3RyaW5nIHBvc3NpYmx5IGNvbnRhaW5pbmcgdGhlIHBsYWNlaG9sZGVyCisgICAgICogQHBhcmFtIHBsYWNlaG9sZGVyIFBsYWNlaG9sZGVyIGV4cHJlc3Npb24gdG8gYmUgcmVwbGFjZWQKKyAgICAgKiBAcGFyYW0gdmFsdWUgUmVwbGFjZW1lbnQgdmFsdWUgZm9yIHRoZSBwbGFjZWhvbGRlcgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgcmVwbGFjZShTdHJpbmcgdGVtcGxhdGUsIFN0cmluZyBwbGFjZWhvbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlKSB7CisKKyAgICAgICAgaWYgKHRlbXBsYXRlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICBpZiAoKHBsYWNlaG9sZGVyID09IG51bGwpIHx8ICh2YWx1ZSA9PSBudWxsKSkKKyAgICAgICAgICAgIHJldHVybiAodGVtcGxhdGUpOworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgaW50IGluZGV4ID0gdGVtcGxhdGUuaW5kZXhPZihwbGFjZWhvbGRlcik7CisgICAgICAgICAgICBpZiAoaW5kZXggPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHRlbXAgPSBuZXcgU3RyaW5nQnVmZmVyKHRlbXBsYXRlLnN1YnN0cmluZygwLCBpbmRleCkpOworICAgICAgICAgICAgdGVtcC5hcHBlbmQodmFsdWUpOworICAgICAgICAgICAgdGVtcC5hcHBlbmQodGVtcGxhdGUuc3Vic3RyaW5nKGluZGV4ICsgcGxhY2Vob2xkZXIubGVuZ3RoKCkpKTsKKyAgICAgICAgICAgIHRlbXBsYXRlID0gdGVtcC50b1N0cmluZygpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAodGVtcGxhdGUpOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9UcmVlQ29udHJvbFRlc3RBY3Rpb24uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9UcmVlQ29udHJvbFRlc3RBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmQ0MmNlCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL1RyZWVDb250cm9sVGVzdEFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogQ29weXJpZ2h0IDIwMDEsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbjsKKworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLm5ldC5VUkxEZWNvZGVyOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25FcnJvcnM7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcndhcmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CisKKworLyoqCisgKiBUZXN0IDxjb2RlPkFjdGlvbjwvY29kZT4gdGhhdCBoYW5kbGVzIGV2ZW50cyBmcm9tIHRoZSB0cmVlIGNvbnRyb2wgdGVzdAorICogcGFnZS4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIFRyZWVDb250cm9sVGVzdEFjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBzcGVjaWZpZWQgSFRUUCByZXF1ZXN0LCBhbmQgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIEhUVFAKKyAgICAgKiByZXNwb25zZSAob3IgZm9yd2FyZCB0byBhbm90aGVyIHdlYiBjb21wb25lbnQgdGhhdCB3aWxsIGNyZWF0ZSBpdCkuCisgICAgICogUmV0dXJuIGFuIDxjb2RlPkFjdGlvbkZvcndhcmQ8L2NvZGU+IGluc3RhbmNlIGRlc2NyaWJpbmcgd2hlcmUgYW5kIGhvdworICAgICAqIGNvbnRyb2wgc2hvdWxkIGJlIGZvcndhcmRlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHJlc3BvbnNlIGhhcworICAgICAqIGFscmVhZHkgYmVlbiBjb21wbGV0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgQWN0aW9uTWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIGFjdGlvbkZvcm0gVGhlIG9wdGlvbmFsIEFjdGlvbkZvcm0gYmVhbiBmb3IgdGhpcyByZXF1ZXN0IChpZiBhbnkpCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIEhUVFAgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgSFRUUCByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXhjZXB0aW9uIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBBY3Rpb25Gb3J3YXJkIHBlcmZvcm0oQWN0aW9uTWFwcGluZyBtYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uRm9ybSBmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIGdldFNlcnZsZXQoKS5sb2coIkVudGVyZWQgVHJlZUNvbnRyb2xUZXN0QWN0aW9uOnBlcmZvcm0oKSIpOworCisgICAgICAgIFN0cmluZyBuYW1lID0gbnVsbDsKKyAgICAgICAgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpOworICAgICAgICBUcmVlQ29udHJvbCBjb250cm9sID0KKyAgICAgICAgICAgIChUcmVlQ29udHJvbCkgc2Vzc2lvbi5nZXRBdHRyaWJ1dGUoInRyZWVDb250cm9sVGVzdCIpOworCisgICAgICAgIC8vIEhhbmRsZSBhIHRyZWUgZXhwYW5kL2NvbnRyYWN0IGV2ZW50CisgICAgICAgIG5hbWUgPSByZXF1ZXN0LmdldFBhcmFtZXRlcigidHJlZSIpOworCisgICAgICAgIGlmIChuYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2coIlRyZWUgZXhwYW5kL2NvbnRyYWN0IG9uICIgKyBuYW1lKTsKKworICAgICAgICAgICAgVHJlZUNvbnRyb2xOb2RlIG5vZGUgPSBjb250cm9sLmZpbmROb2RlKG5hbWUpOworCisgICAgICAgICAgICBpZiAobm9kZSAhPSBudWxsKXsKKyAgICAgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nKCJGb3VuZCBOb2RlOiAiICsgbmFtZSk7CisgICAgICAgICAgICAgICAgbm9kZS5zZXRFeHBhbmRlZCghbm9kZS5pc0V4cGFuZGVkKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2coInRyZWUgcGFyYW0gaXMgbnVsbCIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gSGFuZGxlIGEgc2VsZWN0IGl0ZW0gZXZlbnQKKyAgICAgICAgbmFtZSA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJzZWxlY3QiKTsKKyAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZygiU2VsZWN0IGV2ZW50IG9uICIgKyBuYW1lKTsKKyAgICAgICAgICAgIGNvbnRyb2wuc2VsZWN0Tm9kZShuYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEZvcndhcmQgYmFjayB0byB0aGUgdGVzdCBwYWdlCisgICAgICAgIHJldHVybiAobWFwcGluZy5maW5kRm9yd2FyZCgiVHJlZSBDb250cm9sIFRlc3QiKSk7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL2Nvbm5lY3Rvci9BZGRDb25uZWN0b3JBY3Rpb24uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9jb25uZWN0b3IvQWRkQ29ubmVjdG9yQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ1M2NkNgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9jb25uZWN0b3IvQWRkQ29ubmVjdG9yQWN0aW9uLmphdmEKQEAgLTAsMCArMSwxNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMS0yMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLmNvbm5lY3RvcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMRW5jb2RlcjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkVycm9yczsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9ybTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9yd2FyZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy51dGlsLk1lc3NhZ2VSZXNvdXJjZXM7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uTGFiZWxWYWx1ZUJlYW47CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uTGlzdHM7CisKKy8qKgorICogVGhlIDxjb2RlPkFjdGlvbjwvY29kZT4gdGhhdCBzZXRzIHVwIDxlbT5BZGQgQ29ubmVjdG9yPC9lbT4gdHJhbnNhY3Rpb25zLgorICoKKyAqIEBhdXRob3IgTWFudmVlbiBLYXVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBBZGRDb25uZWN0b3JBY3Rpb24gZXh0ZW5kcyBBY3Rpb24geworICAgIAorICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworICAgIAorICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIHNwZWNpZmllZCBIVFRQIHJlcXVlc3QsIGFuZCBjcmVhdGUgdGhlIGNvcnJlc3BvbmRpbmcgSFRUUAorICAgICAqIHJlc3BvbnNlIChvciBmb3J3YXJkIHRvIGFub3RoZXIgd2ViIGNvbXBvbmVudCB0aGF0IHdpbGwgY3JlYXRlIGl0KS4KKyAgICAgKiBSZXR1cm4gYW4gPGNvZGU+QWN0aW9uRm9yd2FyZDwvY29kZT4gaW5zdGFuY2UgZGVzY3JpYmluZyB3aGVyZSBhbmQgaG93CisgICAgICogY29udHJvbCBzaG91bGQgYmUgZm9yd2FyZGVkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcmVzcG9uc2UgaGFzCisgICAgICogYWxyZWFkeSBiZWVuIGNvbXBsZXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBBY3Rpb25NYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gYWN0aW9uRm9ybSBUaGUgb3B0aW9uYWwgQWN0aW9uRm9ybSBiZWFuIGZvciB0aGlzIHJlcXVlc3QgKGlmIGFueSkKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgSFRUUCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBIVFRQIHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBleGNlcHRpb24gb2NjdXJzCisgICAgICovCisgICAgcHVibGljIEFjdGlvbkZvcndhcmQgcGVyZm9ybShBY3Rpb25NYXBwaW5nIG1hcHBpbmcsCisgICAgQWN0aW9uRm9ybSBmb3JtLAorICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKyAgICAgICAgCisgICAgICAgIC8vIEFjcXVpcmUgdGhlIHJlc291cmNlcyB0aGF0IHdlIG5lZWQKKyAgICAgICAgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpOworICAgICAgICAKKyAgICAgICAgLy8gdGhlIHNlcnZpY2UgTmFtZSBpcyBuZWVkZWQgdG8gcmV0cmlldmUgdGhlIGVuZ2luZSBtQmVhbiB0bworICAgICAgICAvLyB3aGljaCB0aGUgbmV3IGNvbm5lY3RvciBtQmVhbiB3aWxsIGJlIGFkZGVkLgorICAgICAgICBTdHJpbmcgc2VydmljZU5hbWUgPSByZXF1ZXN0LmdldFBhcmFtZXRlcigic2VsZWN0Iik7CisgICAgICAgIAorICAgICAgICAvLyBGaWxsIGluIHRoZSBmb3JtIHZhbHVlcyBmb3IgZGlzcGxheSBhbmQgZWRpdGluZworICAgICAgICBDb25uZWN0b3JGb3JtIGNvbm5lY3RvckZtID0gbmV3IENvbm5lY3RvckZvcm0oKTsKKyAgICAgICAgc2Vzc2lvbi5zZXRBdHRyaWJ1dGUoImNvbm5lY3RvckZvcm0iLCBjb25uZWN0b3JGbSk7CisgICAgICAgIGNvbm5lY3RvckZtLnNldEFkbWluQWN0aW9uKCJDcmVhdGUiKTsKKyAgICAgICAgY29ubmVjdG9yRm0uc2V0T2JqZWN0TmFtZSgiIik7CisgICAgICAgIGNvbm5lY3RvckZtLnNldENvbm5lY3Rvck5hbWUoIiIpOworICAgICAgICBTdHJpbmcgdHlwZSA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJ0eXBlIik7CisgICAgICAgIGlmICh0eXBlID09IG51bGwpCisgICAgICAgICAgICB0eXBlID0gIkhUVFAiOyAgICAvLyBkZWZhdWx0IHR5cGUgaXMgSFRUUAorICAgICAgICBjb25uZWN0b3JGbS5zZXRDb25uZWN0b3JUeXBlKHR5cGUpOworICAgICAgICBjb25uZWN0b3JGbS5zZXRTZXJ2aWNlTmFtZShzZXJ2aWNlTmFtZSk7CisgICAgICAgIGlmICgiSFRUUFMiLmVxdWFsc0lnbm9yZUNhc2UodHlwZSkpIHsKKyAgICAgICAgICAgIGNvbm5lY3RvckZtLnNldFNjaGVtZSgiaHR0cHMiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbm5lY3RvckZtLnNldFNjaGVtZSgiaHR0cCIpOyAgICAgICAKKyAgICAgICAgfQorICAgICAgICBjb25uZWN0b3JGbS5zZXRBY2NlcHRDb3VudFRleHQoIjEwIik7CisgICAgICAgIGNvbm5lY3RvckZtLnNldENvbXByZXNzaW9uKCJvZmYiKTsKKyAgICAgICAgY29ubmVjdG9yRm0uc2V0Q29ubkxpbmdlclRleHQoIi0xIik7CisgICAgICAgIGNvbm5lY3RvckZtLnNldENvbm5UaW1lT3V0VGV4dCgiNjAwMDAiKTsKKyAgICAgICAgY29ubmVjdG9yRm0uc2V0Q29ublVwbG9hZFRpbWVPdXRUZXh0KCIzMDAwMDAiKTsKKyAgICAgICAgY29ubmVjdG9yRm0uc2V0QnVmZmVyU2l6ZVRleHQoIjIwNDgiKTsKKyAgICAgICAgY29ubmVjdG9yRm0uc2V0RGlzYWJsZVVwbG9hZFRpbWVvdXQoImZhbHNlIik7CisgICAgICAgIGNvbm5lY3RvckZtLnNldEVuYWJsZUxvb2t1cHMoInRydWUiKTsKKyAgICAgICAgY29ubmVjdG9yRm0uc2V0QWRkcmVzcygiIik7CisgICAgICAgIGNvbm5lY3RvckZtLnNldFBvcnRUZXh0KCIiKTsKKyAgICAgICAgY29ubmVjdG9yRm0uc2V0UmVkaXJlY3RQb3J0VGV4dCgiLTEiKTsKKyAgICAgICAgY29ubmVjdG9yRm0uc2V0TWluUHJvY2Vzc29yc1RleHQoIjUiKTsKKyAgICAgICAgY29ubmVjdG9yRm0uc2V0TWF4UHJvY2Vzc29yc1RleHQoIjIwIik7CisgICAgICAgIGNvbm5lY3RvckZtLnNldE1heEtlZXBBbGl2ZVRleHQoIjEwMCIpOworICAgICAgICBjb25uZWN0b3JGbS5zZXRNYXhTcGFyZSgiNTAiKTsKKyAgICAgICAgY29ubmVjdG9yRm0uc2V0TWF4VGhyZWFkcygiMjAwIik7CisgICAgICAgIGNvbm5lY3RvckZtLnNldE1pblNwYXJlKCI0Iik7CisgICAgICAgIGNvbm5lY3RvckZtLnNldFRocmVhZFByaW9yaXR5KFN0cmluZy52YWx1ZU9mKFRocmVhZC5OT1JNX1BSSU9SSVRZKSk7CisgICAgICAgIGNvbm5lY3RvckZtLnNldFNlY3VyZSgiZmFsc2UiKTsKKyAgICAgICAgY29ubmVjdG9yRm0uc2V0VGNwTm9EZWxheSgidHJ1ZSIpOworICAgICAgICBjb25uZWN0b3JGbS5zZXRYcG93ZXJlZEJ5KCJmYWxzZSIpOworCisgICAgICAgIC8vc3VwcG9ydGVkIG9ubHkgYnkgSFRUUFMKKyAgICAgICAgY29ubmVjdG9yRm0uc2V0QWxnb3JpdGhtKCJTdW5YNTA5Iik7CisgICAgICAgIGNvbm5lY3RvckZtLnNldENsaWVudEF1dGhlbnRpY2F0aW9uKCJmYWxzZSIpOworICAgICAgICBjb25uZWN0b3JGbS5zZXRDaXBoZXJzKCIiKTsKKyAgICAgICAgY29ubmVjdG9yRm0uc2V0S2V5U3RvcmVGaWxlTmFtZSgiIik7CisgICAgICAgIGNvbm5lY3RvckZtLnNldEtleVN0b3JlUGFzc3dvcmQoIiIpOworICAgICAgICBjb25uZWN0b3JGbS5zZXRLZXlTdG9yZVR5cGUoIkpLUyIpOworICAgICAgICBjb25uZWN0b3JGbS5zZXRTc2xQcm90b2NvbCgiVExTIik7CisgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAvLyBzdXBwb3J0ZWQgb25seSBieSBDb3lvdGUgY29ubmVjdG9ycworICAgICAgICBjb25uZWN0b3JGbS5zZXRQcm94eU5hbWUoIiIpOworICAgICAgICBjb25uZWN0b3JGbS5zZXRQcm94eVBvcnRUZXh0KCIwIik7ICAgICAgICAKKyAgICAgICAgCisgICAgICAgIGNvbm5lY3RvckZtLnNldEJvb2xlYW5WYWxzKExpc3RzLmdldEJvb2xlYW5WYWx1ZXMoKSk7ICAgICAgICAgICAgICAgIAorICAgICAgICBjb25uZWN0b3JGbS5zZXRDbGllbnRBdXRoVmFscyhMaXN0cy5nZXRDbGllbnRBdXRoVmFsdWVzKCkpOworICAgICAgICAKKyAgICAgICAgU3RyaW5nIHNjaGVtZVR5cGVzW109IG5ldyBTdHJpbmdbM107CisgICAgICAgIHNjaGVtZVR5cGVzWzBdID0gIkhUVFAiOworICAgICAgICBzY2hlbWVUeXBlc1sxXSA9ICJIVFRQUyI7ICAgICAgICAgICAgICAgIAorICAgICAgICBzY2hlbWVUeXBlc1syXSA9ICJBSlAiOworICAgICAgICAKKyAgICAgICAgQXJyYXlMaXN0IHR5cGVzID0gbmV3IEFycmF5TGlzdCgpOyAgICAKKyAgICAgICAgLy8gdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIHNlbGVjdCBsaXN0IHNob3VsZCBiZSB0aGUgdHlwZSBzZWxlY3RlZAorICAgICAgICB0eXBlcy5hZGQobmV3IExhYmVsVmFsdWVCZWFuKHR5cGUsCisgICAgICAgICAgICAgICAgIkFkZENvbm5lY3Rvci5kbz9zZWxlY3Q9IiArIFVSTEVuY29kZXIuZW5jb2RlKHNlcnZpY2VOYW1lKSAKKyAgICAgICAgICAgICAgICArICImdHlwZT0iICsgdHlwZSkpOyAgICAgICAgCisgICAgICAgICBmb3IgKGludCBpPTA7IGk8IHNjaGVtZVR5cGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoIXR5cGUuZXF1YWxzSWdub3JlQ2FzZShzY2hlbWVUeXBlc1tpXSkpIHsKKyAgICAgICAgICAgICAgICB0eXBlcy5hZGQobmV3IExhYmVsVmFsdWVCZWFuKHNjaGVtZVR5cGVzW2ldLAorICAgICAgICAgICAgICAgICJBZGRDb25uZWN0b3IuZG8/c2VsZWN0PSIgKyBVUkxFbmNvZGVyLmVuY29kZShzZXJ2aWNlTmFtZSkKKyAgICAgICAgICAgICAgICArICImdHlwZT0iICsgc2NoZW1lVHlwZXNbaV0pKTsgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvbm5lY3RvckZtLnNldENvbm5lY3RvclR5cGVWYWxzKHR5cGVzKTsKKyAgICAgICAgCisgICAgICAgIC8vIEZvcndhcmQgdG8gdGhlIGNvbm5lY3RvciBkaXNwbGF5IHBhZ2UKKyAgICAgICAgcmV0dXJuIChtYXBwaW5nLmZpbmRGb3J3YXJkKCJDb25uZWN0b3IiKSk7CisgICAgICAgIAorICAgIH0gICAgICAgIAorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL2Nvbm5lY3Rvci9Db25uZWN0b3JGb3JtLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vY29ubmVjdG9yL0Nvbm5lY3RvckZvcm0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjcxZTY0Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL2Nvbm5lY3Rvci9Db25uZWN0b3JGb3JtLmphdmEKQEAgLTAsMCArMSwxMjA1IEBACisvKgorICogQ29weXJpZ2h0IDIwMDEsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5jb25uZWN0b3I7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25FcnJvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRXJyb3JzOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEZvcm0gYmVhbiBmb3IgdGhlIGNvbm5lY3RvciBwYWdlLgorICoKKyAqIEBhdXRob3IgTWFudmVlbiBLYXVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBDb25uZWN0b3JGb3JtIGV4dGVuZHMgQWN0aW9uRm9ybSB7CisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisgICAgCisgICAgIC8qKgorICAgICAqIFRoZSBhZG1pbmlzdHJhdGl2ZSBhY3Rpb24gcmVwcmVzZW50ZWQgYnkgdGhpcyBmb3JtLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGFkbWluQWN0aW9uID0gIkVkaXQiOworCisgICAgLyoqCisgICAgICogVGhlIG9iamVjdCBuYW1lIG9mIHRoZSBDb25uZWN0b3IgdGhpcyBiZWFuIHJlZmVycyB0by4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBvYmplY3ROYW1lID0gbnVsbDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgb2JqZWN0IG5hbWUgb2YgdGhlIHNlcnZpY2UgdGhpcyBjb25uZWN0b3IgYmVsb25ncyB0by4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBzZXJ2aWNlTmFtZSA9IG51bGw7CisgICAKKyAgICAvKioKKyAgICAgKiBUaGUgdGV4dCBmb3IgdGhlIHNjaGVtZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBzY2hlbWUgPSBudWxsOworCisgICAgLyoqCisgICAgICogVGhlIHRleHQgZm9yIHRoZSBjb25uZWN0b3IgdHlwZS4gCisgICAgICogU3BlY2lmaWVzIGlmIGl0IGlzIGEgQ295b3RlQ29ubmVjdG9yIG9yIEFKUDEzQ29ubmVjdG9yIGV0Yy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBjb25uZWN0b3JUeXBlID0gbnVsbDsgICAgCisgICAgCisgICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciB0aGUgbm9kZSBsYWJlbC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBub2RlTGFiZWwgPSBudWxsOworICAgIAorICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciB0aGUgYWNjZXB0IENvdW50LgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGFjY2VwdENvdW50VGV4dCA9IG51bGw7CisgICAgCisgICAgLyoqCisgICAgICogVGhlIHRleHQgZm9yIHRoZSBhbGdvcml0aG0uCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgYWxnb3JpdGhtID0gbnVsbDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgdGV4dCBmb3IgdGhlIGNpcGhlcnMuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgY2lwaGVycyA9IG51bGw7CisgICAgCisgICAgLyoqCisgICAgICogVGhlIHRleHQgZm9yIHRoZSBDb25uZWN0aW9uIExpbmdlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBjb25uTGluZ2VyVGV4dCA9IG51bGw7CisgICAgCisgICAgLyoqCisgICAgICogVGhlIHRleHQgZm9yIHRoZSBDb25uZWN0aW9uIFRpbWUgT3V0LgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGNvbm5UaW1lT3V0VGV4dCA9IG51bGw7CisgICAgCisgICAgLyoqCisgICAgICogVGhlIHRleHQgZm9yIHRoZSBDb25uZWN0aW9uIFVwbG9hZCBUaW1lIE91dC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBjb25uVXBsb2FkVGltZU91dFRleHQgPSBudWxsOworICAgIAorICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciB0aGUgYnVmZmVyIHNpemUuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgYnVmZmVyU2l6ZVRleHQgPSBudWxsOworICAgIAorICAgIC8qKgorICAgICAqIFRoZSB2YWx1ZSBvZiBkaXNhYmxlIHVwbG9hZCB0aW1lb3V0LgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGRpc2FibGVVcGxvYWRUaW1lb3V0ID0gImZhbHNlIjsKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgdmFsdWUgb2YgZW5hYmxlIExvb2t1cHMuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZW5hYmxlTG9va3VwcyA9ICJmYWxzZSI7CisgICAgCisgICAgLyoqCisgICAgICogVGhlIHZhbHVlIG9mIGNvbXByZXNzaW9uLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGNvbXByZXNzaW9uID0gIm9mZiI7CisgICAgCisgICAgLyoqCisgICAgICogVGhlIHRleHQgZm9yIHRoZSBhZGRyZXNzLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGFkZHJlc3MgPSBudWxsOworICAgIAorICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciB0aGUgbWluUHJvY2Vzc29ycy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBtaW5Qcm9jZXNzb3JzVGV4dCA9IG51bGw7CisgICAgCisgICAgLyoqCisgICAgICogVGhlIHRleHQgZm9yIHRoZSBtYXggUHJvY2Vzc29ycy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBtYXhQcm9jZXNzb3JzVGV4dCA9IG51bGw7CisgICAgCisgICAgLyoqCisgICAgICogVGhlIHRleHQgZm9yIHRoZSBtYXhLZWVwQWxpdmUuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbWF4S2VlcEFsaXZlVGV4dCA9IG51bGw7CisgICAgCisgICAgLyoqCisgICAgICogVGhlIHRleHQgZm9yIHRoZSBtYXhTcGFyZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBtYXhTcGFyZSA9IG51bGw7CisgICAgCisgICAgLyoqCisgICAgICogVGhlIHRleHQgZm9yIHRoZSBtYXhUaHJlYWRzLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIG1heFRocmVhZHMgPSBudWxsOworICAgIAorICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciB0aGUgbWluU3BhcmUuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbWluU3BhcmUgPSBudWxsOworCisgICAgLyoqCisgICAgICogVGhlIHRleHQgZm9yIHRoZSB0aHJlYWRQcmlvcml0eS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyB0aHJlYWRQcmlvcml0eSA9IG51bGw7CisgICAgCisgICAgLyoqCisgICAgICogVGhlIHRleHQgZm9yIHRoZSBVUklFbmNvZGluZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyB1cmlFbmNvZGluZ1RleHQgPSBudWxsOworICAgIAorICAgIC8qKgorICAgICAqIFRoZSB2YWx1ZSBvZiB1c2VCb2R5RW5jb2RpbmdGb3JVUkkuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgdXNlQm9keUVuY29kaW5nRm9yVVJJID0gImZhbHNlIjsKKworICAgIC8qKgorICAgICAqIFRoZSB2YWx1ZSBvZiBhbGxvd1RyYWNlLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGFsbG93VHJhY2UgPSAiZmFsc2UiOworCisgICAgLyoqCisgICAgICogVGhlIHRleHQgZm9yIHRoZSBwb3J0LgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHBvcnRUZXh0ID0gbnVsbDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgdGV4dCBmb3IgdGhlIHJlZGlyZWN0IHBvcnQuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcmVkaXJlY3RQb3J0VGV4dCA9IG51bGw7CisgICAgCisgICAgLyoqCisgICAgICogVGhlIHRleHQgZm9yIHRoZSBwcm94eU5hbWUuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcHJveHlOYW1lID0gbnVsbDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgdGV4dCBmb3IgdGhlIHByb3h5IFBvcnQgTnVtYmVyLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHByb3h5UG9ydFRleHQgPSBudWxsOworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciB0aGUgY29ubmVjdG9yTmFtZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBjb25uZWN0b3JOYW1lID0gbnVsbDsKKyAgICAgICAgCisgICAgLyoqCisgICAgICogV2hldGhlciBjbGllbnQgYXV0aGVudGljYXRpb24gaXMgc3VwcG9ydGVkLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGNsaWVudEF1dGhlbnRpY2F0aW9uID0gImZhbHNlIjsKKyAgICAgICAgCisgICAgLyoqCisgICAgICogVGhlIGtleVN0b3JlIEZpbGVuYW1lLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGtleVN0b3JlRmlsZU5hbWUgPSBudWxsOworICAgICAgICAKKyAgICAvKioKKyAgICAgKiBUaGUga2V5U3RvcmUgUGFzc3dvcmQuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcga2V5U3RvcmVQYXNzd29yZCA9IG51bGw7CisgICAgCisgICAgLyoqCisgICAgICogVGhlIGtleVN0b3JlIFR5cGUuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcga2V5U3RvcmVUeXBlID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciB0aGUgU3NsIFByb3RvY29sLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHNzbFByb3RvY29sPSBudWxsOworICAgIAorICAgIC8qCisgICAgICogUmVwcmVzZW50IGJvb2xlYW4gKHRydWUsIGZhbHNlKSB2YWx1ZXMgZm9yIGVuYWJsZUxvb2t1cHMgZXRjLgorICAgICAqLyAgICAKKyAgICBwcml2YXRlIExpc3QgYm9vbGVhblZhbHMgPSBudWxsOworCisgICAgLyoKKyAgICAgKiBSZXByZXNlbnQgc3VwcG9ydGVkIGNvbm5lY3RvciB0eXBlcy4KKyAgICAgKi8gICAgCisgICAgcHJpdmF0ZSBMaXN0IGNvbm5lY3RvclR5cGVWYWxzID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFJlcHJlc2VudCBzdXBwb3J0ZWQgY2xpZW50QXV0aCB2YWx1ZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBMaXN0IGNsaWVudEF1dGhWYWxzID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFRoZSB2YWx1ZSBvZiBzZWN1cmUuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgc2VjdXJlID0gImZhbHNlIjsKKyAgICAvKioKKyAgICAgKiBUaGUgdmFsdWUgb2YgdGNwTm9EZWxheS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyB0Y3BOb0RlbGF5ID0gInRydWUiOworICAgIAorICAgIC8qKgorICAgICAqIFRoZSB2YWx1ZSBvZiB4cG93ZXJlZEJ5LgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHhwb3dlcmVkQnkgPSAiZmFsc2UiOworICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworICAgIAorICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBhZG1pbmlzdHJhdGl2ZSBhY3Rpb24gcmVwcmVzZW50ZWQgYnkgdGhpcyBmb3JtLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWRtaW5BY3Rpb24oKSB7CisKKyAgICAgICAgcmV0dXJuIHRoaXMuYWRtaW5BY3Rpb247CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYWRtaW5pc3RyYXRpdmUgYWN0aW9uIHJlcHJlc2VudGVkIGJ5IHRoaXMgZm9ybS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBZG1pbkFjdGlvbihTdHJpbmcgYWRtaW5BY3Rpb24pIHsKKworICAgICAgICB0aGlzLmFkbWluQWN0aW9uID0gYWRtaW5BY3Rpb247CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG9iamVjdCBuYW1lIG9mIHRoZSBDb25uZWN0b3IgdGhpcyBiZWFuIHJlZmVycyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE9iamVjdE5hbWUoKSB7CisKKyAgICAgICAgcmV0dXJuIHRoaXMub2JqZWN0TmFtZTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBvYmplY3QgbmFtZSBvZiB0aGUgQ29ubmVjdG9yIHRoaXMgYmVhbiByZWZlcnMgdG8uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0T2JqZWN0TmFtZShTdHJpbmcgb2JqZWN0TmFtZSkgeworCisgICAgICAgIHRoaXMub2JqZWN0TmFtZSA9IG9iamVjdE5hbWU7CisKKyAgICB9CisgICAgCisgICAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG9iamVjdCBuYW1lIG9mIHRoZSBzZXJ2aWNlIHRoaXMgY29ubmVjdG9yIGJlbG9uZ3MgdG8uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlTmFtZSgpIHsKKworICAgICAgICByZXR1cm4gdGhpcy5zZXJ2aWNlTmFtZTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBvYmplY3QgbmFtZSBvZiB0aGUgU2VydmljZSB0aGlzIGNvbm5lY3RvciBiZWxvbmdzIHRvLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VOYW1lKFN0cmluZyBzZXJ2aWNlTmFtZSkgeworCisgICAgICAgIHRoaXMuc2VydmljZU5hbWUgPSBzZXJ2aWNlTmFtZTsKKworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIFNjaGVtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFNjaGVtZSgpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLnNjaGVtZTsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgU2NoZW1lLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNjaGVtZShTdHJpbmcgc2NoZW1lKSB7CisgICAgICAgIAorICAgICAgICB0aGlzLnNjaGVtZSA9IHNjaGVtZTsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgQ29ubmVjdG9yIHR5cGUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDb25uZWN0b3JUeXBlKCkgeworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdG9yVHlwZTsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgQ29ubmVjdG9yIHR5cGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29ubmVjdG9yVHlwZShTdHJpbmcgY29ubmVjdG9yVHlwZSkgeworICAgICAgICAKKyAgICAgICAgdGhpcy5jb25uZWN0b3JUeXBlID0gY29ubmVjdG9yVHlwZTsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbGFiZWwgb2YgdGhlIG5vZGUgdGhhdCB3YXMgY2xpY2tlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5vZGVMYWJlbCgpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLm5vZGVMYWJlbDsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgbm9kZSBsYWJlbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXROb2RlTGFiZWwoU3RyaW5nIG5vZGVMYWJlbCkgeworICAgICAgICAKKyAgICAgICAgdGhpcy5ub2RlTGFiZWwgPSBub2RlTGFiZWw7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGFjY2VwdENvdW50VGV4dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEFjY2VwdENvdW50VGV4dCgpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLmFjY2VwdENvdW50VGV4dDsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgYWNjZXB0Q291bnRUZXh0LgorICAgICAqLworICAgIAorICAgIHB1YmxpYyB2b2lkIHNldEFjY2VwdENvdW50VGV4dChTdHJpbmcgYWNjZXB0Q291bnRUZXh0KSB7CisgICAgICAgIAorICAgICAgICB0aGlzLmFjY2VwdENvdW50VGV4dCA9IGFjY2VwdENvdW50VGV4dDsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgYWxnb3JpdGhtLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWxnb3JpdGhtKCkgeworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXMuYWxnb3JpdGhtOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBhbGdvcml0aG0uCisgICAgICovCisgICAgCisgICAgcHVibGljIHZvaWQgc2V0QWxnb3JpdGhtKFN0cmluZyBhbGdvcml0aG0pIHsKKyAgICAgICAgCisgICAgICAgIHRoaXMuYWxnb3JpdGhtID0gYWxnb3JpdGhtOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjaXBoZXJzLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2lwaGVycygpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLmNpcGhlcnM7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNpcGhlcnMuCisgICAgICovCisgICAgCisgICAgcHVibGljIHZvaWQgc2V0Q2lwaGVycyhTdHJpbmcgY2lwaGVycykgeworICAgICAgICAKKyAgICAgICAgdGhpcy5jaXBoZXJzID0gY2lwaGVyczsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY29ubkxpbmdlclRleHQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDb25uTGluZ2VyVGV4dCgpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLmNvbm5MaW5nZXJUZXh0OworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjb25uTGluZ2VyVGV4dC4KKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRDb25uTGluZ2VyVGV4dChTdHJpbmcgY29ubkxpbmdlclRleHQpIHsKKyAgICAgICAgCisgICAgICAgIHRoaXMuY29ubkxpbmdlclRleHQgPSBjb25uTGluZ2VyVGV4dDsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY29ublRpbWVPdXRUZXh0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29ublRpbWVPdXRUZXh0KCkgeworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXMuY29ublRpbWVPdXRUZXh0OworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjb25uVGltZU91dFRleHQuCisgICAgICovCisgICAgCisgICAgcHVibGljIHZvaWQgc2V0Q29ublRpbWVPdXRUZXh0KFN0cmluZyBjb25uVGltZU91dFRleHQpIHsKKyAgICAgICAgCisgICAgICAgIHRoaXMuY29ublRpbWVPdXRUZXh0ID0gY29ublRpbWVPdXRUZXh0OworICAgICAgICAKKyAgICB9CisgICAgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjb25uVXBsb2FkVGltZU91dFRleHQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDb25uVXBsb2FkVGltZU91dFRleHQoKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy5jb25uVXBsb2FkVGltZU91dFRleHQ7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNvbm5VcGxvYWRUaW1lT3V0VGV4dC4KKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRDb25uVXBsb2FkVGltZU91dFRleHQoU3RyaW5nIGNvbm5VcGxvYWRUaW1lT3V0VGV4dCkgeworICAgICAgICAKKyAgICAgICAgdGhpcy5jb25uVXBsb2FkVGltZU91dFRleHQgPSBjb25uVXBsb2FkVGltZU91dFRleHQ7CisgICAgICAgIAorICAgIH0KKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGJ1ZmZlclNpemVUZXh0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QnVmZmVyU2l6ZVRleHQoKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy5idWZmZXJTaXplVGV4dDsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgYnVmZmVyU2l6ZVRleHQuCisgICAgICovCisgICAgCisgICAgcHVibGljIHZvaWQgc2V0QnVmZmVyU2l6ZVRleHQoU3RyaW5nIGJ1ZmZlclNpemVUZXh0KSB7CisgICAgICAgIAorICAgICAgICB0aGlzLmJ1ZmZlclNpemVUZXh0ID0gYnVmZmVyU2l6ZVRleHQ7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGFkZHJlc3MuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRBZGRyZXNzKCkgeworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXMuYWRkcmVzczsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgYWRkcmVzcy4KKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRBZGRyZXNzKFN0cmluZyBhZGRyZXNzKSB7CisgICAgICAgIAorICAgICAgICB0aGlzLmFkZHJlc3MgPSBhZGRyZXNzOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBwcm94eSBOYW1lLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJveHlOYW1lKCkgeworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXMucHJveHlOYW1lOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBwcm94eSBOYW1lLgorICAgICAqLworICAgIAorICAgIHB1YmxpYyB2b2lkIHNldFByb3h5TmFtZShTdHJpbmcgcHJveHlOYW1lKSB7CisgICAgICAgIAorICAgICAgICB0aGlzLnByb3h5TmFtZSA9IHByb3h5TmFtZTsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcHJveHkgUG9ydCBOdW1iZXJUZXh0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJveHlQb3J0VGV4dCgpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLnByb3h5UG9ydFRleHQ7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHByb3h5IFBvcnQgTnVtYmVyVGV4dC4KKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRQcm94eVBvcnRUZXh0KFN0cmluZyBwcm94eVBvcnRUZXh0KSB7CisgICAgICAgIAorICAgICAgICB0aGlzLnByb3h5UG9ydFRleHQgPSBwcm94eVBvcnRUZXh0OworICAgICAgICAKKyAgICB9CisKKyAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdHJ1ZS9mYWxzZSB2YWx1ZSBvZiBjbGllbnQgYXV0aGVudGljYXRpb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDbGllbnRBdXRoZW50aWNhdGlvbigpIHsKKworICAgICAgICByZXR1cm4gdGhpcy5jbGllbnRBdXRoZW50aWNhdGlvbjsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHdoZXRoZXIgY2xpZW50IGF1dGhlbnRpY2F0aW9uIGlzIHN1cHBvcnRlZCBvciBub3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2xpZW50QXV0aGVudGljYXRpb24oU3RyaW5nIGNsaWVudEF1dGhlbnRpY2F0aW9uKSB7CisKKyAgICAgICAgdGhpcy5jbGllbnRBdXRoZW50aWNhdGlvbiA9IGNsaWVudEF1dGhlbnRpY2F0aW9uOworCisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBvYmplY3QgbmFtZSBvZiB0aGUgc2VydmljZSB0aGlzIGNvbm5lY3RvciBiZWxvbmdzIHRvLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0S2V5U3RvcmVGaWxlTmFtZSgpIHsKKworICAgICAgICByZXR1cm4gdGhpcy5rZXlTdG9yZUZpbGVOYW1lOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG9iamVjdCBuYW1lIG9mIHRoZSBTZXJ2aWNlIHRoaXMgY29ubmVjdG9yIGJlbG9uZ3MgdG8uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0S2V5U3RvcmVGaWxlTmFtZShTdHJpbmcga2V5U3RvcmVGaWxlTmFtZSkgeworCisgICAgICAgIHRoaXMua2V5U3RvcmVGaWxlTmFtZSA9IGtleVN0b3JlRmlsZU5hbWU7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG9iamVjdCBuYW1lIG9mIHRoZSBzZXJ2aWNlIHRoaXMgY29ubmVjdG9yIGJlbG9uZ3MgdG8uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRLZXlTdG9yZVBhc3N3b3JkKCkgeworCisgICAgICAgIHJldHVybiB0aGlzLmtleVN0b3JlUGFzc3dvcmQ7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgb2JqZWN0IG5hbWUgb2YgdGhlIFNlcnZpY2UgdGhpcyBjb25uZWN0b3IgYmVsb25ncyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRLZXlTdG9yZVBhc3N3b3JkKFN0cmluZyBrZXlTdG9yZVBhc3N3b3JkKSB7CisKKyAgICAgICAgdGhpcy5rZXlTdG9yZVBhc3N3b3JkID0ga2V5U3RvcmVQYXNzd29yZDsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUga2V5c3RvcmUgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEtleVN0b3JlVHlwZSgpIHsKKworICAgICAgICByZXR1cm4gdGhpcy5rZXlTdG9yZVR5cGU7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUga2V5c3RvcmUgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRLZXlTdG9yZVR5cGUoU3RyaW5nIGtleVN0b3JlVHlwZSkgeworCisgICAgICAgIHRoaXMua2V5U3RvcmVUeXBlID0ga2V5U3RvcmVUeXBlOworCisgICAgfQorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc3NsUHJvdG9jb2wKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFNzbFByb3RvY29sKCkgeworCisgICAgICAgIHJldHVybiB0aGlzLnNzbFByb3RvY29sOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHNzbFByb3RvY29sLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNzbFByb3RvY29sKFN0cmluZyBzc2xQcm90b2NvbCkgeworCisgICAgICAgIHRoaXMuc3NsUHJvdG9jb2wgPSBzc2xQcm90b2NvbDsKKworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIEVuYWJsZSBsb29rdXAgVGV4dC4KKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgU3RyaW5nIGdldEVuYWJsZUxvb2t1cHMoKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy5lbmFibGVMb29rdXBzOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBFbmFibGUgTG9va3VwIFRleHQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RW5hYmxlTG9va3VwcyhTdHJpbmcgZW5hYmxlTG9va3VwcykgeworICAgICAgICAKKyAgICAgICAgdGhpcy5lbmFibGVMb29rdXBzID0gZW5hYmxlTG9va3VwczsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZGlzYWJsZVVwbG9hZFRpbWVvdXQuCisgICAgICovCisgICAgCisgICAgcHVibGljIFN0cmluZyBnZXREaXNhYmxlVXBsb2FkVGltZW91dCgpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLmRpc2FibGVVcGxvYWRUaW1lb3V0OworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBkaXNhYmxlVXBsb2FkVGltZW91dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREaXNhYmxlVXBsb2FkVGltZW91dChTdHJpbmcgZGlzYWJsZVVwbG9hZFRpbWVvdXQpIHsKKyAgICAgICAgCisgICAgICAgIHRoaXMuZGlzYWJsZVVwbG9hZFRpbWVvdXQgPSBkaXNhYmxlVXBsb2FkVGltZW91dDsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY29tcHJlc3Npb24gVGV4dC4KKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbXByZXNzaW9uKCkgeworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXMuY29tcHJlc3Npb247CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIENvbXByZXNzaW9uIFRleHQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29tcHJlc3Npb24oU3RyaW5nIGNvbXByZXNzaW9uKSB7CisgICAgICAgIAorICAgICAgICB0aGlzLmNvbXByZXNzaW9uID0gY29tcHJlc3Npb247CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGJvb2xlYW5WYWxzLgorICAgICAqLworICAgIHB1YmxpYyBMaXN0IGdldEJvb2xlYW5WYWxzKCkgeworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXMuYm9vbGVhblZhbHM7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGRlYnVnVmFscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRCb29sZWFuVmFscyhMaXN0IGJvb2xlYW5WYWxzKSB7CisgICAgICAgIAorICAgICAgICB0aGlzLmJvb2xlYW5WYWxzID0gYm9vbGVhblZhbHM7CisgICAgICAgIAorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY2xpZW50QXV0aCB2YWx1ZXMuCisgICAgICovCisgICAgcHVibGljIExpc3QgZ2V0Q2xpZW50QXV0aFZhbHMoKSB7CisgICAgICAgIHJldHVybiBjbGllbnRBdXRoVmFsczsKKyAgICB9CisgICAgLyoqCisgICAgICogU2V0IHRoZSBjbGllbnRBdXRoIHZhdWVzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENsaWVudEF1dGhWYWxzKExpc3QgY2xpZW50QXV0aFZhbHMpIHsKKyAgICAgICAgdGhpcy5jbGllbnRBdXRoVmFscyA9IGNsaWVudEF1dGhWYWxzOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG1pbiBQcm9jZXNzb3JzIFRleHQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRNaW5Qcm9jZXNzb3JzVGV4dCgpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLm1pblByb2Nlc3NvcnNUZXh0OworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBtaW5Qcm9jZXNzb3JzIFRleHQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWluUHJvY2Vzc29yc1RleHQoU3RyaW5nIG1pblByb2Nlc3NvcnNUZXh0KSB7CisgICAgICAgIAorICAgICAgICB0aGlzLm1pblByb2Nlc3NvcnNUZXh0ID0gbWluUHJvY2Vzc29yc1RleHQ7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG1heCBwcm9jZXNzb3JzIFRleHQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRNYXhQcm9jZXNzb3JzVGV4dCgpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLm1heFByb2Nlc3NvcnNUZXh0OworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBNYXggUHJvY2Vzc29ycyBUZXh0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1heFByb2Nlc3NvcnNUZXh0KFN0cmluZyBtYXhQcm9jZXNzb3JzVGV4dCkgeworICAgICAgICAKKyAgICAgICAgdGhpcy5tYXhQcm9jZXNzb3JzVGV4dCA9IG1heFByb2Nlc3NvcnNUZXh0OworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBtYXhLZWVwQWxpdmVUZXh0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWF4S2VlcEFsaXZlVGV4dCgpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLm1heEtlZXBBbGl2ZVRleHQ7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG1heEtlZXBBbGl2ZVRleHQuCisgICAgICovCisgICAgCisgICAgcHVibGljIHZvaWQgc2V0TWF4S2VlcEFsaXZlVGV4dChTdHJpbmcgbWF4S2VlcEFsaXZlVGV4dCkgeworICAgICAgICAKKyAgICAgICAgdGhpcy5tYXhLZWVwQWxpdmVUZXh0ID0gbWF4S2VlcEFsaXZlVGV4dDsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbWF4U3BhcmUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRNYXhTcGFyZSgpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLm1heFNwYXJlOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBtYXhTcGFyZS4KKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRNYXhTcGFyZShTdHJpbmcgbWF4U3BhcmUpIHsKKyAgICAgICAgCisgICAgICAgIHRoaXMubWF4U3BhcmUgPSBtYXhTcGFyZTsKKyAgICAgICAgCisgICAgfSAKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG1heFRocmVhZHMuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRNYXhUaHJlYWRzKCkgeworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXMubWF4VGhyZWFkczsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgbWF4VGhyZWFkcy4KKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRNYXhUaHJlYWRzKFN0cmluZyBtYXhUaHJlYWRzKSB7CisgICAgICAgIAorICAgICAgICB0aGlzLm1heFRocmVhZHMgPSBtYXhUaHJlYWRzOworICAgICAgICAKKyAgICB9IAorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbWluU3BhcmUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRNaW5TcGFyZSgpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLm1pblNwYXJlOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBtaW5TcGFyZS4KKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRNaW5TcGFyZShTdHJpbmcgbWluU3BhcmUpIHsKKyAgICAgICAgCisgICAgICAgIHRoaXMubWluU3BhcmUgPSBtaW5TcGFyZTsKKyAgICAgICAgCisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB0aHJlYWRQcmlvcml0eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFRocmVhZFByaW9yaXR5KCkgeworCisgICAgICByZXR1cm4gdGhpcy50aHJlYWRQcmlvcml0eTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdGhyZWFkUHJpb3JpdHkuCisgICAgICovCisgICAgCisgICAgcHVibGljIHZvaWQgc2V0VGhyZWFkUHJpb3JpdHkoU3RyaW5nIHRocmVhZFByaW9yaXR5KSB7CisgICAgICAKKyAgICAgIHRoaXMudGhyZWFkUHJpb3JpdHkgPSB0aHJlYWRQcmlvcml0eTsKKyAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBVUklFbmNvZGluZyB0ZXh0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VVJJRW5jb2RpbmdUZXh0KCkgeworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXMudXJpRW5jb2RpbmdUZXh0OworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBVUklFbmNvZGluZyBUZXh0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVSSUVuY29kaW5nVGV4dChTdHJpbmcgdXJpRW5jb2RpbmdUZXh0KSB7CisgICAgICAgIAorICAgICAgICB0aGlzLnVyaUVuY29kaW5nVGV4dCA9IHVyaUVuY29kaW5nVGV4dDsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdXNlQm9keUVuY29kaW5nRm9yVVJJIFRleHQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRVc2VCb2R5RW5jb2RpbmdGb3JVUklUZXh0KCkgeworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXMudXNlQm9keUVuY29kaW5nRm9yVVJJOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSB1c2VCb2R5RW5jb2RpbmdGb3JVUkkgVGV4dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVc2VCb2R5RW5jb2RpbmdGb3JVUklUZXh0KFN0cmluZyB1c2VCb2R5RW5jb2RpbmdGb3JVUkkpIHsKKyAgICAgICAgCisgICAgICAgIHRoaXMudXNlQm9keUVuY29kaW5nRm9yVVJJID0gdXNlQm9keUVuY29kaW5nRm9yVVJJOworICAgICAgICAKKyAgICB9ICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgYWxsb3dUcmFjZSBUZXh0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWxsb3dUcmFjZVRleHQoKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy5hbGxvd1RyYWNlOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBhbGxvd1RyYWNlIFRleHQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QWxsb3dUcmFjZVRleHQoU3RyaW5nIGFsbG93VHJhY2UpIHsKKyAgICAgICAgCisgICAgICAgIHRoaXMuYWxsb3dUcmFjZSA9IGFsbG93VHJhY2U7CisgICAgICAgIAorICAgIH0gICAgCisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBwb3J0IHRleHQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRQb3J0VGV4dCgpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLnBvcnRUZXh0OworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBwb3J0IFRleHQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UG9ydFRleHQoU3RyaW5nIHBvcnRUZXh0KSB7CisgICAgICAgIAorICAgICAgICB0aGlzLnBvcnRUZXh0ID0gcG9ydFRleHQ7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHBvcnQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRSZWRpcmVjdFBvcnRUZXh0KCkgeworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXMucmVkaXJlY3RQb3J0VGV4dDsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgUmVkaXJlY3QgUG9ydCBUZXh0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlZGlyZWN0UG9ydFRleHQoU3RyaW5nIHJlZGlyZWN0UG9ydFRleHQpIHsKKyAgICAgICAgCisgICAgICAgIHRoaXMucmVkaXJlY3RQb3J0VGV4dCA9IHJlZGlyZWN0UG9ydFRleHQ7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIFNlcnZpY2UgTmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbm5lY3Rvck5hbWUoKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy5jb25uZWN0b3JOYW1lOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBTZXJ2aWNlIE5hbWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29ubmVjdG9yTmFtZShTdHJpbmcgY29ubmVjdG9yTmFtZSkgeworICAgICAgICAKKyAgICAgICAgdGhpcy5jb25uZWN0b3JOYW1lID0gY29ubmVjdG9yTmFtZTsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY29ubmVjdG9yVHlwZVZhbHMuCisgICAgICovCisgICAgcHVibGljIExpc3QgZ2V0Q29ubmVjdG9yVHlwZVZhbHMoKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy5jb25uZWN0b3JUeXBlVmFsczsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgY29ubmVjdG9yVHlwZVZhbHMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29ubmVjdG9yVHlwZVZhbHMoTGlzdCBjb25uZWN0b3JUeXBlVmFscykgeworICAgICAgICAKKyAgICAgICAgdGhpcy5jb25uZWN0b3JUeXBlVmFscyA9IGNvbm5lY3RvclR5cGVWYWxzOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2VjdXJlIFRleHQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTZWN1cmUoKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy5zZWN1cmU7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHNlY3VyZSBUZXh0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNlY3VyZShTdHJpbmcgc2VjdXJlKSB7CisgICAgICAgIAorICAgICAgICB0aGlzLnNlY3VyZSA9IHNlY3VyZTsKKyAgICAgICAgCisgICAgfSAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHRjcE5vRGVsYXkgVGV4dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFRjcE5vRGVsYXkoKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy50Y3BOb0RlbGF5OworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSB0Y3BOb0RlbGF5IFRleHQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VGNwTm9EZWxheShTdHJpbmcgdGNwTm9EZWxheSkgeworICAgICAgICAKKyAgICAgICAgdGhpcy50Y3BOb0RlbGF5ID0gdGNwTm9EZWxheTsKKyAgICAgICAgCisgICAgfSAgIAorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgeHBvd2VyZWRCeSBUZXh0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0WHBvd2VyZWRCeSgpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLnhwb3dlcmVkQnk7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHhwb3dlcmVkQnkgVGV4dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRYcG93ZXJlZEJ5KFN0cmluZyB4cG93ZXJlZEJ5KSB7CisgICAgICAgIAorICAgICAgICB0aGlzLnhwb3dlcmVkQnkgPSB4cG93ZXJlZEJ5OworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisgICAgCisgICAgLyoqCisgICAgICogUmVzZXQgYWxsIHByb3BlcnRpZXMgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgbWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlc2V0KEFjdGlvbk1hcHBpbmcgbWFwcGluZywgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAKKyAgICAgICAgdGhpcy5vYmplY3ROYW1lID0gbnVsbDsKKyAgICAgICAgdGhpcy5jb25uZWN0b3JUeXBlID0gbnVsbDsKKyAgICAgICAgdGhpcy5wb3J0VGV4dCA9IG51bGw7CisgICAgICAgIHRoaXMuYWNjZXB0Q291bnRUZXh0ID0gbnVsbDsKKyAgICAgICAgdGhpcy5jb25uTGluZ2VyVGV4dCA9IG51bGw7CisgICAgICAgIHRoaXMuY29ublRpbWVPdXRUZXh0ID0gbnVsbDsKKyAgICAgICAgdGhpcy5jb25uVXBsb2FkVGltZU91dFRleHQgPSBudWxsOworICAgICAgICB0aGlzLmJ1ZmZlclNpemVUZXh0ID0gbnVsbDsKKyAgICAgICAgdGhpcy5hZGRyZXNzID0gbnVsbDsKKyAgICAgICAgdGhpcy5lbmFibGVMb29rdXBzID0gImZhbHNlIjsKKyAgICAgICAgdGhpcy5jb21wcmVzc2lvbiA9ICJvZmYiOworICAgICAgICB0aGlzLm1pblByb2Nlc3NvcnNUZXh0ID0gbnVsbDsKKyAgICAgICAgdGhpcy5tYXhQcm9jZXNzb3JzVGV4dCA9IG51bGw7CisgICAgICAgIHRoaXMubWF4S2VlcEFsaXZlVGV4dCA9IG51bGw7CisgICAgICAgIHRoaXMubWF4U3BhcmUgPSBudWxsOworICAgICAgICB0aGlzLm1heFRocmVhZHMgPSBudWxsOworICAgICAgICB0aGlzLm1pblNwYXJlID0gbnVsbDsKKyAgICAgICAgdGhpcy50aHJlYWRQcmlvcml0eSA9IG51bGw7CisgICAgICAgIHRoaXMudXJpRW5jb2RpbmdUZXh0ID0gbnVsbDsKKyAgICAgICAgdGhpcy51c2VCb2R5RW5jb2RpbmdGb3JVUkkgPSAiZmFsc2UiOworICAgICAgICB0aGlzLmFsbG93VHJhY2UgPSAiZmFsc2UiOworICAgICAgICB0aGlzLnBvcnRUZXh0ID0gbnVsbDsKKyAgICAgICAgdGhpcy5yZWRpcmVjdFBvcnRUZXh0ID0gbnVsbDsKKyAgICAgICAgdGhpcy5wcm94eU5hbWUgPSBudWxsOworICAgICAgICB0aGlzLnByb3h5UG9ydFRleHQgPSBudWxsOworICAgICAgICB0aGlzLmtleVN0b3JlRmlsZU5hbWUgPSBudWxsOworICAgICAgICB0aGlzLmtleVN0b3JlUGFzc3dvcmQgPSBudWxsOyAgICAgICAgCisgICAgICAgIHRoaXMuY2xpZW50QXV0aGVudGljYXRpb24gPSAiZmFsc2UiOworICAgICAgICB0aGlzLnNlY3VyZSA9ICJmYWxzZSI7CisgICAgICAgIHRoaXMudGNwTm9EZWxheSA9ICJmYWxzZSI7CisgICAgICAgIHRoaXMueHBvd2VyZWRCeSA9ICJmYWxzZSI7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBWYWxpZGF0ZSB0aGUgcHJvcGVydGllcyB0aGF0IGhhdmUgYmVlbiBzZXQgZnJvbSB0aGlzIEhUVFAgcmVxdWVzdCwKKyAgICAgKiBhbmQgcmV0dXJuIGFuIDxjb2RlPkFjdGlvbkVycm9yczwvY29kZT4gb2JqZWN0IHRoYXQgZW5jYXBzdWxhdGVzIGFueQorICAgICAqIHZhbGlkYXRpb24gZXJyb3JzIHRoYXQgaGF2ZSBiZWVuIGZvdW5kLiAgSWYgbm8gZXJyb3JzIGFyZSBmb3VuZCwgcmV0dXJuCisgICAgICogPGNvZGU+bnVsbDwvY29kZT4gb3IgYW4gPGNvZGU+QWN0aW9uRXJyb3JzPC9jb2RlPiBvYmplY3Qgd2l0aCBubworICAgICAqIHJlY29yZGVkIGVycm9yIG1lc3NhZ2VzLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIG1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKi8KKyAgICAKKyAgICBwcml2YXRlIEFjdGlvbkVycm9ycyBlcnJvcnM7CisgICAgCisgICAgcHVibGljIEFjdGlvbkVycm9ycyB2YWxpZGF0ZShBY3Rpb25NYXBwaW5nIG1hcHBpbmcsCisgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAKKyAgICAgICAgZXJyb3JzID0gbmV3IEFjdGlvbkVycm9ycygpOworICAgICAgICAKKyAgICAgICAgU3RyaW5nIHN1Ym1pdCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJzdWJtaXQiKTsKKyAgICAgICAgLy8gZnJvbnQgZW5kIHZhbGlkYXRpb24gd2hlbiBzYXZlIGlzIGNsaWNrZWQuCisgICAgICAgIC8vaWYgKHN1Ym1pdCAhPSBudWxsKSB7CisgIAorICAgICAgICAgICAgLyogVGhlIElQIGFkZHJlc3MgY2FuIGFsc28gYmUgbnVsbCAtLSB3aGljaCBtZWFucyBvcGVuIHRoZQorICAgICAgICAgICAgIHNlcnZlciBzb2NrZXQgb24gKmFsbCogSVAgYWRkcmVzc2VzIGZvciB0aGlzIGhvc3QgKi8KKyAgICAgICAgICAgIGlmICgoYWRkcmVzcy5sZW5ndGgoKSA+IDApICYmICFhZGRyZXNzLmVxdWFsc0lnbm9yZUNhc2UoIiAiKSkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIEluZXRBZGRyZXNzLmdldEJ5TmFtZShhZGRyZXNzKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKCJhZGRyZXNzIiwgbmV3IEFjdGlvbkVycm9yKCJlcnJvci5hZGRyZXNzLmludmFsaWQiKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhZGRyZXNzID0gIiAiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICAvKiBwb3J0cyAqLworICAgICAgICAgICAgbnVtYmVyQ2hlY2soInBvcnROdW1iZXIiLCAgcG9ydFRleHQsIHRydWUsIDEsIDY1NTM1KTsKKyAgICAgICAgICAgIG51bWJlckNoZWNrKCJyZWRpcmVjdFBvcnRUZXh0IiwgIHJlZGlyZWN0UG9ydFRleHQsIHRydWUsIC0xLCA2NTUzNSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8qIHByb2Nlc3NvcnMqLworICAgICAgICAgICAgLy9udW1iZXJDaGVjaygibWluUHJvY2Vzc29yc1RleHQiLCAgbWluUHJvY2Vzc29yc1RleHQsIHRydWUsIDEsIDUxMik7CisgICAgICAgICAgICAvL3RyeSB7CisgICAgICAgICAgICAgICAgLy8gaWYgbWluIGlzIGEgdmFsaWQgaW50ZWdlciwgdGhlbiBjaGVjayB0aGF0IG1heCA+PSBtaW4KKyAgICAgICAgICAgICAgICAvL2ludCBtaW4gPSBJbnRlZ2VyLnBhcnNlSW50KG1pblByb2Nlc3NvcnNUZXh0KTsKKyAgICAgICAgICAgICAgICAvL251bWJlckNoZWNrKCJtYXhQcm9jZXNzb3JzVGV4dCIsICBtYXhQcm9jZXNzb3JzVGV4dCwgdHJ1ZSwgbWluLCA1MTIpOworICAgICAgICAgICAgLy99IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIGNoZWNrIGZvciB0aGUgY29tcGxldGUgcmFuZ2UKKyAgICAgICAgICAgICAgICAvL251bWJlckNoZWNrKCJtYXhQcm9jZXNzb3JzVGV4dCIsICBtYXhQcm9jZXNzb3JzVGV4dCwgdHJ1ZSwgMSwgNTEyKTsKKyAgICAgICAgICAgIC8vfQorICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBwcm94eSAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKChwcm94eU5hbWUhPSBudWxsKSAmJiAocHJveHlOYW1lLmxlbmd0aCgpID4gMCkpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBJbmV0QWRkcmVzcy5nZXRCeU5hbWUocHJveHlOYW1lKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKCJwcm94eU5hbWUiLCBuZXcgQWN0aW9uRXJyb3IoImVycm9yLnByb3h5TmFtZS5pbnZhbGlkIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gICAKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gc3VwcG9ydGVkIG9ubHkgYnkgQ295b3RlIEhUVFAgYW5kIEhUVFBTIGNvbm5lY3RvcnMKKyAgICAgICAgICAgIGlmICghKCJBSlAiLmVxdWFsc0lnbm9yZUNhc2UoY29ubmVjdG9yVHlwZSkpKSB7CisgICAgICAgICAgICAgICAgbnVtYmVyQ2hlY2soImFjY2VwdENvdW50VGV4dCIsIGFjY2VwdENvdW50VGV4dCwgdHJ1ZSwgMCwgMTI4KTsKKyAgICAgICAgICAgICAgICAvL251bWJlckNoZWNrKCJjb25uVGltZU91dFRleHQiLCBjb25uVGltZU91dFRleHQsIHRydWUsIC0xLCA2MDAwMCk7CisgICAgICAgICAgICAgICAgbnVtYmVyQ2hlY2soImJ1ZmZlclNpemVUZXh0IiwgYnVmZmVyU2l6ZVRleHQsIHRydWUsIDEsIDgxOTIpOworICAgICAgICAgICAgICAgIG51bWJlckNoZWNrKCJwcm94eVBvcnRUZXh0IiwgIHByb3h5UG9ydFRleHQsIHRydWUsIDAsIDY1NTM1KTsgIAorICAgICAgICAgICAgfQorICAgICAgICAvL30KKyAgICAgICAgCisgICAgICAgIHJldHVybiBlcnJvcnM7CisgICAgfQorICAgIAorICAgIC8qCisgICAgICogSGVscGVyIG1ldGhvZCB0byBjaGVjayB0aGF0IGl0IGlzIGEgcmVxdWlyZWQgbnVtYmVyIGFuZAorICAgICAqIGlzIGEgdmFsaWQgaW50ZWdlciB3aXRoaW4gdGhlIGdpdmVuIHJhbmdlLiAobWluLCBtYXgpLgorICAgICAqCisgICAgICogQHBhcmFtICBmaWVsZCAgVGhlIGZpZWxkIG5hbWUgaW4gdGhlIGZvcm0gZm9yIHdoaWNoIHRoaXMgZXJyb3Igb2NjdXJlZC4KKyAgICAgKiBAcGFyYW0gIG51bVRleHQgIFRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG51bWJlci4KKyAgICAgKiBAcGFyYW0gcmFuZ2VDaGVjayAgQm9vbGVhbiB2YWx1ZSBzZXQgdG8gdHJ1ZSBvZiByZWFuZ2UgY2hlY2sgc2hvdWxkIGJlIHBlcmZvcm1lZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgbWluICBUaGUgbG93ZXIgbGltaXQgb2YgdGhlIHJhbmdlCisgICAgICogQHBhcmFtICBtYXggIFRoZSB1cHBlciBsaW1pdCBvZiB0aGUgcmFuZ2UKKyAgICAgKgorICAgICAqLworICAgIAorICAgIHB1YmxpYyB2b2lkIG51bWJlckNoZWNrKFN0cmluZyBmaWVsZCwgU3RyaW5nIG51bVRleHQsIGJvb2xlYW4gcmFuZ2VDaGVjaywKKyAgICBpbnQgbWluLCBpbnQgbWF4KSB7CisgICAgICAgIAorICAgICAgICAvKiBDaGVjayBmb3IgJ2lzIHJlcXVpcmVkJyAqLworICAgICAgICBpZiAoKG51bVRleHQgPT0gbnVsbCkgfHwgKG51bVRleHQubGVuZ3RoKCkgPCAxKSkgeworICAgICAgICAgICAgZXJyb3JzLmFkZChmaWVsZCwgbmV3IEFjdGlvbkVycm9yKCJlcnJvci4iK2ZpZWxkKyIucmVxdWlyZWQiKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAKKyAgICAgICAgLypjaGVjayBmb3IgJ211c3QgYmUgYSBudW1iZXInIGluIHRoZSAndmFsaWQgcmFuZ2UnKi8KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaW50IG51bSA9IEludGVnZXIucGFyc2VJbnQobnVtVGV4dCk7CisgICAgICAgICAgICAgICAgLy8gcGVyZm9ybSByYW5nZSBjaGVjayBvbmx5IGlmIHJlcXVpcmVkCisgICAgICAgICAgICAgICAgaWYgKHJhbmdlQ2hlY2spIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChudW0gPCBtaW4pIHx8IChudW0gPiBtYXggKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFjdGlvbkVycm9yKCJlcnJvci4iKyBmaWVsZCArIi5yYW5nZSIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoZmllbGQsCisgICAgICAgICAgICAgICAgbmV3IEFjdGlvbkVycm9yKCJlcnJvci4iKyBmaWVsZCArICIuZm9ybWF0IikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL2Nvbm5lY3Rvci9Db25uZWN0b3JzRm9ybS5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL2Nvbm5lY3Rvci9Db25uZWN0b3JzRm9ybS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxZDRlOTcKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vY29ubmVjdG9yL0Nvbm5lY3RvcnNGb3JtLmphdmEKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLmNvbm5lY3RvcjsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CisKKworLyoqCisgKiBGb3JtIGJlYW4gZm9yIGRlbGV0aW5nIGNvbm5lY3RvcnMuCisgKgorICogQGF1dGhvciBNYW52ZWVuIEthdXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIENvbm5lY3RvcnNGb3JtIGV4dGVuZHMgQWN0aW9uRm9ybSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgb2JqZWN0IG5hbWVzIG9mIHRoZSBjb25uZWN0b3JzIHRvIGJlIGRlbGV0ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgY29ubmVjdG9yc1tdID0gbmV3IFN0cmluZ1swXTsKKworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRDb25uZWN0b3JzKCkgeworICAgICAgICByZXR1cm4gKHRoaXMuY29ubmVjdG9ycyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q29ubmVjdG9ycyhTdHJpbmcgY29ubmVjdG9yc1tdKSB7CisgICAgICAgIHRoaXMuY29ubmVjdG9ycyA9IGNvbm5lY3RvcnM7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmVzZXQgYWxsIHByb3BlcnRpZXMgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgbWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlc2V0KEFjdGlvbk1hcHBpbmcgbWFwcGluZywgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKworICAgICAgICB0aGlzLmNvbm5lY3RvcnMgPSBuZXcgU3RyaW5nWzBdOworCisgICAgfQorICAgICAgICAKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL2Nvbm5lY3Rvci9EZWxldGVDb25uZWN0b3JBY3Rpb24uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9jb25uZWN0b3IvRGVsZXRlQ29ubmVjdG9yQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI2MzY4NgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9jb25uZWN0b3IvRGVsZXRlQ29ubmVjdG9yQWN0aW9uLmphdmEKQEAgLTAsMCArMSwxNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMS0yMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLmNvbm5lY3RvcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRXJyb3JzOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3J3YXJkOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworCitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyRmFjdG9yeTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LlF1ZXJ5RXhwOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuUXVlcnk7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3RJbnN0YW5jZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5KTUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy51dGlsLk1lc3NhZ2VSZXNvdXJjZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5BcHBsaWNhdGlvblNlcnZsZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uVG9tY2F0VHJlZUJ1aWxkZXI7CisKKy8qKgorICogVGhlIDxjb2RlPkFjdGlvbjwvY29kZT4gdGhhdCBzZXRzIHVwIDxlbT5EZWxldGUgQ29ubmVjdG9yczwvZW0+IHRyYW5zYWN0aW9ucy4KKyAqCisgKiBAYXV0aG9yIE1hbnZlZW4gS2F1cgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgRGVsZXRlQ29ubmVjdG9yQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKKyAgICAgICAgCisgICAgLyoqCisgICAgICogVGhlIE1CZWFuU2VydmVyIHdlIHdpbGwgYmUgaW50ZXJhY3Rpbmcgd2l0aC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1CZWFuU2VydmVyIG1CU2VydmVyID0gbnVsbDsKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKyAgICAKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBzcGVjaWZpZWQgSFRUUCByZXF1ZXN0LCBhbmQgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIEhUVFAKKyAgICAgKiByZXNwb25zZSAob3IgZm9yd2FyZCB0byBhbm90aGVyIHdlYiBjb21wb25lbnQgdGhhdCB3aWxsIGNyZWF0ZSBpdCkuCisgICAgICogUmV0dXJuIGFuIDxjb2RlPkFjdGlvbkZvcndhcmQ8L2NvZGU+IGluc3RhbmNlIGRlc2NyaWJpbmcgd2hlcmUgYW5kIGhvdworICAgICAqIGNvbnRyb2wgc2hvdWxkIGJlIGZvcndhcmRlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHJlc3BvbnNlIGhhcworICAgICAqIGFscmVhZHkgYmVlbiBjb21wbGV0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgQWN0aW9uTWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIGFjdGlvbkZvcm0gVGhlIG9wdGlvbmFsIEFjdGlvbkZvcm0gYmVhbiBmb3IgdGhpcyByZXF1ZXN0IChpZiBhbnkpCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIEhUVFAgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgSFRUUCByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXhjZXB0aW9uIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBBY3Rpb25Gb3J3YXJkIHBlcmZvcm0oQWN0aW9uTWFwcGluZyBtYXBwaW5nLAorICAgIEFjdGlvbkZvcm0gZm9ybSwKKyAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgLy8gQWNxdWlyZSB0aGUgcmVzb3VyY2VzIHRoYXQgd2UgbmVlZAorICAgICAgICBIdHRwU2Vzc2lvbiBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uKCk7CisgICAgICAgIExvY2FsZSBsb2NhbGUgPSBnZXRMb2NhbGUocmVxdWVzdCk7CisgICAgICAgIE1lc3NhZ2VSZXNvdXJjZXMgcmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VzKHJlcXVlc3QpOyAgICAKKyAgICAgICAgCisgICAgICAgIC8vIEFjcXVpcmUgYSByZWZlcmVuY2UgdG8gdGhlIE1CZWFuU2VydmVyIGNvbnRhaW5pbmcgb3VyIE1CZWFucworICAgICAgICB0cnkgeworICAgICAgICAgICAgbUJTZXJ2ZXIgPSAoKEFwcGxpY2F0aW9uU2VydmxldCkgZ2V0U2VydmxldCgpKS5nZXRTZXJ2ZXIoKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uCisgICAgICAgICAgICAoIkNhbm5vdCBhY3F1aXJlIE1CZWFuU2VydmVyIHJlZmVyZW5jZSIsIHQpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBTdHJpbmcgZG9tYWluID0gbnVsbDsKKyAgICAgICAgLy8gU2V0IHVwIGEgZm9ybSBiZWFuIGNvbnRhaW5pbmcgdGhlIGN1cnJlbnRseSBzZWxlY3RlZAorICAgICAgICAvLyBvYmplY3RzIHRvIGJlIGRlbGV0ZWQKKyAgICAgICAgQ29ubmVjdG9yc0Zvcm0gY29ubmVjdG9yc0Zvcm0gPSBuZXcgQ29ubmVjdG9yc0Zvcm0oKTsKKyAgICAgICAgU3RyaW5nIHNlbGVjdCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJzZWxlY3QiKTsKKyAgICAgICAgaWYgKHNlbGVjdCAhPSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgY29ubmVjdG9yc1tdID0gbmV3IFN0cmluZ1sxXTsKKyAgICAgICAgICAgIGNvbm5lY3RvcnNbMF0gPSBzZWxlY3Q7CisgICAgICAgICAgICBjb25uZWN0b3JzRm9ybS5zZXRDb25uZWN0b3JzKGNvbm5lY3RvcnMpOworICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBnZXQgdGhlIHNlcnZpY2UgTmFtZSB0aGlzIHNlbGVjdGVkIGhvc3QgYmVsb25ncyB0bworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBkb21haW4gPSAobmV3IE9iamVjdE5hbWUoc2VsZWN0KSkuZ2V0RG9tYWluKCk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKCJFcnJvciBleHRyYWN0aW5nIHNlcnZpY2UgbmFtZSBmcm9tIHRoZSBjb25uZWN0b3IgdG8gYmUgZGVsZXRlZCIsIGUpOworICAgICAgICAgICAgfSAgICAgICAgCisgICAgICAgIH0KKyAgICAgICAgcmVxdWVzdC5zZXRBdHRyaWJ1dGUoImNvbm5lY3RvcnNGb3JtIiwgY29ubmVjdG9yc0Zvcm0pOworICAgICAgICAKKyAgICAgICAgLy8gQWNjdW11bGF0ZSBhIGxpc3Qgb2YgYWxsIGF2YWlsYWJsZSBjb25uZWN0b3JzCisgICAgICAgIEFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN0cmluZyBwYXR0ZXJuID0gZG9tYWluICsgVG9tY2F0VHJlZUJ1aWxkZXIuQ09OTkVDVE9SX1RZUEUgKworICAgICAgICAgICAgICAgIFRvbWNhdFRyZWVCdWlsZGVyLldJTERDQVJEOyAgICAgICAgICAKKyAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZW1zID0KKyAgICAgICAgICAgICAgICBtQlNlcnZlci5xdWVyeU5hbWVzKG5ldyBPYmplY3ROYW1lKHBhdHRlcm4pLCBudWxsKS5pdGVyYXRvcigpOworICAgICAgICAgICAgd2hpbGUgKGl0ZW1zLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIE9iamVjdCBpdGVtID0gaXRlbXMubmV4dCgpOworICAgICAgICAgICAgICAgIGxpc3QuYWRkKGl0ZW0udG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nCisgICAgICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLnNlbGVjdCIpKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3Iuc2VsZWN0IikpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgfSAgICAgIAorICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KGxpc3QpOworICAgICAgICByZXF1ZXN0LnNldEF0dHJpYnV0ZSgiY29ubmVjdG9yc0xpc3QiLCBsaXN0KTsKKyAgICAgICAgCisgICAgICAgIC8vIEZvcndhcmQgdG8gdGhlIGxpc3QgZGlzcGxheSBwYWdlCisgICAgICAgIHJldHVybiAobWFwcGluZy5maW5kRm9yd2FyZCgiQ29ubmVjdG9ycyIpKTsgICAgICAgIAorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9jb25uZWN0b3IvRGVsZXRlQ29ubmVjdG9yc0FjdGlvbi5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL2Nvbm5lY3Rvci9EZWxldGVDb25uZWN0b3JzQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc1ZDRlZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9jb25uZWN0b3IvRGVsZXRlQ29ubmVjdG9yc0FjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTY1IEBACisvKgorICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5jb25uZWN0b3I7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdEluc3RhbmNlOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQubW9kZWxtYmVhbi5Nb2RlbE1CZWFuOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3J3YXJkOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLnV0aWwuTWVzc2FnZVJlc291cmNlczsKKworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkFwcGxpY2F0aW9uU2VydmxldDsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5Ub21jYXRUcmVlQnVpbGRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5UcmVlQ29udHJvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5UcmVlQ29udHJvbE5vZGU7CisKKworLyoqCisgKiBUaGUgPGNvZGU+QWN0aW9uPC9jb2RlPiB0aGF0IGNvbXBsZXRlcyA8ZW0+RGVsZXRlIENvbm5lY3RvcnM8L2VtPgorICogdHJhbnNhY3Rpb25zLgorICoKKyAqIEBhdXRob3IgTWFudmVlbiBLYXVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBEZWxldGVDb25uZWN0b3JzQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKKworCisgICAgLyoqCisgICAgICogU2lnbmF0dXJlIGZvciB0aGUgPGNvZGU+cmVtb3ZlQ29ubmVjdG9yPC9jb2RlPiBvcGVyYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcmVtb3ZlQ29ubmVjdG9yVHlwZXNbXSA9CisgICAgeyAiamF2YS5sYW5nLlN0cmluZyIsICAgICAgLy8gT2JqZWN0IG5hbWUKKyAgICB9OworCisKKyAgICAvKioKKyAgICAgKiBUaGUgTUJlYW5TZXJ2ZXIgd2Ugd2lsbCBiZSBpbnRlcmFjdGluZyB3aXRoLgorICAgICAqLworICAgIHByaXZhdGUgTUJlYW5TZXJ2ZXIgbUJTZXJ2ZXIgPSBudWxsOworICAgIAorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBzcGVjaWZpZWQgSFRUUCByZXF1ZXN0LCBhbmQgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIEhUVFAKKyAgICAgKiByZXNwb25zZSAob3IgZm9yd2FyZCB0byBhbm90aGVyIHdlYiBjb21wb25lbnQgdGhhdCB3aWxsIGNyZWF0ZSBpdCkuCisgICAgICogUmV0dXJuIGFuIDxjb2RlPkFjdGlvbkZvcndhcmQ8L2NvZGU+IGluc3RhbmNlIGRlc2NyaWJpbmcgd2hlcmUgYW5kIGhvdworICAgICAqIGNvbnRyb2wgc2hvdWxkIGJlIGZvcndhcmRlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHJlc3BvbnNlIGhhcworICAgICAqIGFscmVhZHkgYmVlbiBjb21wbGV0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgQWN0aW9uTWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIGFjdGlvbkZvcm0gVGhlIG9wdGlvbmFsIEFjdGlvbkZvcm0gYmVhbiBmb3IgdGhpcyByZXF1ZXN0IChpZiBhbnkpCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIEhUVFAgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgSFRUUCByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXhjZXB0aW9uIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBBY3Rpb25Gb3J3YXJkIHBlcmZvcm0oQWN0aW9uTWFwcGluZyBtYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uRm9ybSBmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworICAgICAgICAKKyAgICAgICAgCisgICAgICAgIC8vIExvb2sgdXAgdGhlIGNvbXBvbmVudHMgd2Ugd2lsbCBiZSB1c2luZyBhcyBuZWVkZWQKKyAgICAgICAgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpOworICAgICAgICBMb2NhbGUgbG9jYWxlID0gZ2V0TG9jYWxlKHJlcXVlc3QpOworICAgICAgICBNZXNzYWdlUmVzb3VyY2VzIHJlc291cmNlcyA9IGdldFJlc291cmNlcyhyZXF1ZXN0KTsKKworICAgICAgICAvLyBBY3F1aXJlIGEgcmVmZXJlbmNlIHRvIHRoZSBNQmVhblNlcnZlciBjb250YWluaW5nIG91ciBNQmVhbnMKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1CU2VydmVyID0gKChBcHBsaWNhdGlvblNlcnZsZXQpIGdldFNlcnZsZXQoKSkuZ2V0U2VydmVyKCk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbgorICAgICAgICAgICAgKCJDYW5ub3QgYWNxdWlyZSBNQmVhblNlcnZlciByZWZlcmVuY2UiLCB0KTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gRGVsZXRlIHRoZSBzcGVjaWZpZWQgQ29ubmVjdG9ycworICAgICAgICBTdHJpbmcgY29ubmVjdG9yc1tdICA9ICgoQ29ubmVjdG9yc0Zvcm0pIGZvcm0pLmdldENvbm5lY3RvcnMoKTsKKyAgICAgICAgU3RyaW5nIHZhbHVlc1tdID0gbmV3IFN0cmluZ1sxXTsKKyAgICAgICAgU3RyaW5nIG9wZXJhdGlvbiA9ICJyZW1vdmVDb25uZWN0b3IiOworICAgICAgICB0cnkgeworCisgICAgICAgICAgICAvLyBMb29rIHVwIG91ciB0cmVlIGNvbnRyb2wgZGF0YSBzdHJ1Y3R1cmUKKyAgICAgICAgICAgIFRyZWVDb250cm9sIGNvbnRyb2wgPSAoVHJlZUNvbnRyb2wpCisgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRBdHRyaWJ1dGUoInRyZWVDb250cm9sVGVzdCIpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gTG9vayB1cCBvdXIgTUJlYW5GYWN0b3J5IE1CZWFuCisgICAgICAgICAgICBPYmplY3ROYW1lIGZuYW1lID0gbnVsbDsKKyAgICAgICAgICAgIFN0cmluZyBkb21haW4gPSBudWxsOworICAgICAgICAgICAgVHJlZUNvbnRyb2xOb2RlIG5vZGUgPSBudWxsOworCisgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIHNwZWNpZmllZCBjb25uZWN0b3JzCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbm5lY3RvcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICB2YWx1ZXNbMF0gPSBjb25uZWN0b3JzW2ldOworICAgICAgICAgICAgICAgIGlmIChjb250cm9sICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udHJvbC5zZWxlY3ROb2RlKG51bGwpOworICAgICAgICAgICAgICAgICAgICBub2RlID0gY29udHJvbC5maW5kTm9kZShjb25uZWN0b3JzW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgZG9tYWluID0gbm9kZS5nZXREb21haW4oKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gTG9vayB1cCBvdXIgTUJlYW5GYWN0b3J5IE1CZWFuCisgICAgICAgICAgICAgICAgICAgIGZuYW1lID0gVG9tY2F0VHJlZUJ1aWxkZXIuZ2V0TUJlYW5GYWN0b3J5KCk7CisgICAgICAgICAgICAgICAgICAgIG1CU2VydmVyLmludm9rZShmbmFtZSwgb3BlcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMsIHJlbW92ZUNvbm5lY3RvclR5cGVzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5yZW1vdmUoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2coIk1pc3NpbmcgVHJlZUNvbnRyb2xOb2RlIGZvciAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdG9yc1tpXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nKCJNaXNzaW5nIFRyZWVDb250cm9sIGF0dHJpYnV0ZSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCisgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nCisgICAgICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmludm9rZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbiksIGUpOworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5pbnZva2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24pKTsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlcG9ydCBzdWNjZXNzZnVsIGNvbXBsZXRpb24gb2YgdGhpcyB0cmFuc2FjdGlvbgorICAgICAgICByZXR1cm4gKG1hcHBpbmcuZmluZEZvcndhcmQoIlNhdmUgU3VjY2Vzc2Z1bCIpKTsKKworICAgIH0KKyAgICAKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9jb25uZWN0b3IvRWRpdENvbm5lY3RvckFjdGlvbi5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL2Nvbm5lY3Rvci9FZGl0Q29ubmVjdG9yQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTIwZjRkOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9jb25uZWN0b3IvRWRpdENvbm5lY3RvckFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjcxIEBACisvKgorICogQ29weXJpZ2h0IDIwMDEtMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5jb25uZWN0b3I7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkVycm9yczsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9ybTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9yd2FyZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy51dGlsLk1lc3NhZ2VSZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0SW5zdGFuY2U7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuSk1FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5BcHBsaWNhdGlvblNlcnZsZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uTGFiZWxWYWx1ZUJlYW47CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uTGlzdHM7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uVG9tY2F0VHJlZUJ1aWxkZXI7CisKKy8qKgorICogVGhlIDxjb2RlPkFjdGlvbjwvY29kZT4gdGhhdCBzZXRzIHVwIDxlbT5FZGl0IENvbm5lY3RvcjwvZW0+IHRyYW5zYWN0aW9ucy4KKyAqCisgKiBAYXV0aG9yIE1hbnZlZW4gS2F1cgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgRWRpdENvbm5lY3RvckFjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisgICAgCisKKyAgICAvKioKKyAgICAgKiBUaGUgTUJlYW5TZXJ2ZXIgd2Ugd2lsbCBiZSBpbnRlcmFjdGluZyB3aXRoLgorICAgICAqLworICAgIHByaXZhdGUgTUJlYW5TZXJ2ZXIgbUJTZXJ2ZXIgPSBudWxsOworICAgIAorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisgICAgCisgICAgLyoqCisgICAgICogUHJvY2VzcyB0aGUgc3BlY2lmaWVkIEhUVFAgcmVxdWVzdCwgYW5kIGNyZWF0ZSB0aGUgY29ycmVzcG9uZGluZyBIVFRQCisgICAgICogcmVzcG9uc2UgKG9yIGZvcndhcmQgdG8gYW5vdGhlciB3ZWIgY29tcG9uZW50IHRoYXQgd2lsbCBjcmVhdGUgaXQpLgorICAgICAqIFJldHVybiBhbiA8Y29kZT5BY3Rpb25Gb3J3YXJkPC9jb2RlPiBpbnN0YW5jZSBkZXNjcmliaW5nIHdoZXJlIGFuZCBob3cKKyAgICAgKiBjb250cm9sIHNob3VsZCBiZSBmb3J3YXJkZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSByZXNwb25zZSBoYXMKKyAgICAgKiBhbHJlYWR5IGJlZW4gY29tcGxldGVkLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIEFjdGlvbk1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSBhY3Rpb25Gb3JtIFRoZSBvcHRpb25hbCBBY3Rpb25Gb3JtIGJlYW4gZm9yIHRoaXMgcmVxdWVzdCAoaWYgYW55KQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBIVFRQIHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIEhUVFAgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0IGV4Y2VwdGlvbiBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgQWN0aW9uRm9yd2FyZCBwZXJmb3JtKEFjdGlvbk1hcHBpbmcgbWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbkZvcm0gZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKyAgICAgICAgCisgICAgICAgIC8vIEFjcXVpcmUgdGhlIHJlc291cmNlcyB0aGF0IHdlIG5lZWQKKyAgICAgICAgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpOworICAgICAgICBMb2NhbGUgbG9jYWxlID0gZ2V0TG9jYWxlKHJlcXVlc3QpOworICAgICAgICBNZXNzYWdlUmVzb3VyY2VzIHJlc291cmNlcyA9IGdldFJlc291cmNlcyhyZXF1ZXN0KTsKKyAgICAgICAgCisgICAgICAgIC8vIEFjcXVpcmUgYSByZWZlcmVuY2UgdG8gdGhlIE1CZWFuU2VydmVyIGNvbnRhaW5pbmcgb3VyIE1CZWFucworICAgICAgICB0cnkgeworICAgICAgICAgICAgbUJTZXJ2ZXIgPSAoKEFwcGxpY2F0aW9uU2VydmxldCkgZ2V0U2VydmxldCgpKS5nZXRTZXJ2ZXIoKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uCisgICAgICAgICAgICAoIkNhbm5vdCBhY3F1aXJlIE1CZWFuU2VydmVyIHJlZmVyZW5jZSIsIHQpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBTZXQgdXAgdGhlIG9iamVjdCBuYW1lcyBvZiB0aGUgTUJlYW5zIHdlIGFyZSBtYW5pcHVsYXRpbmcKKyAgICAgICAgT2JqZWN0TmFtZSBjbmFtZSA9IG51bGw7CisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjbmFtZSA9IG5ldyBPYmplY3ROYW1lKHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJzZWxlY3QiKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9CisgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAiZXJyb3IuY29ubmVjdG9yTmFtZS5iYWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJzZWxlY3QiKSk7CisgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nKG1lc3NhZ2UpOworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfQkFEX1JFUVVFU1QsIG1lc3NhZ2UpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEZpbGwgaW4gdGhlIGZvcm0gdmFsdWVzIGZvciBkaXNwbGF5IGFuZCBlZGl0aW5nCisgICAgICAgIENvbm5lY3RvckZvcm0gY29ubmVjdG9yRm0gPSBuZXcgQ29ubmVjdG9yRm9ybSgpOworICAgICAgICBzZXNzaW9uLnNldEF0dHJpYnV0ZSgiY29ubmVjdG9yRm9ybSIsIGNvbm5lY3RvckZtKTsKKyAgICAgICAgY29ubmVjdG9yRm0uc2V0QWRtaW5BY3Rpb24oIkVkaXQiKTsKKyAgICAgICAgY29ubmVjdG9yRm0uc2V0T2JqZWN0TmFtZShjbmFtZS50b1N0cmluZygpKTsKKyAgICAgICAgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIHNiLmFwcGVuZChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJzZXJ2ZXIuc2VydmljZS50cmVlQnVpbGRlci5jb25uZWN0b3IiKSk7CisgICAgICAgIHNiLmFwcGVuZCgiICgiKTsKKyAgICAgICAgc2IuYXBwZW5kKGNuYW1lLmdldEtleVByb3BlcnR5KCJwb3J0IikpOworICAgICAgICBzYi5hcHBlbmQoIikiKTsKKyAgICAgICAgY29ubmVjdG9yRm0uc2V0Tm9kZUxhYmVsKHNiLnRvU3RyaW5nKCkpOworICAgICAgICBjb25uZWN0b3JGbS5zZXRCb29sZWFuVmFscyhMaXN0cy5nZXRCb29sZWFuVmFsdWVzKCkpOyAgICAgICAgCisgICAgICAgIGNvbm5lY3RvckZtLnNldENsaWVudEF1dGhWYWxzKExpc3RzLmdldENsaWVudEF1dGhWYWx1ZXMoKSk7CisgICAgICAgIAorICAgICAgICBTdHJpbmcgYXR0cmlidXRlID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgLy8gQ29weSBzY2FsYXIgcHJvcGVydGllcworICAgICAgICAgICAgLy8gR2VuZXJhbCBwcm9wZXJ0aWVzCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAic2NoZW1lIjsKKyAgICAgICAgICAgIFN0cmluZyBzY2hlbWUgPSAoU3RyaW5nKSBtQlNlcnZlci5nZXRBdHRyaWJ1dGUoY25hbWUsIGF0dHJpYnV0ZSk7CisgICAgICAgICAgICBjb25uZWN0b3JGbS5zZXRTY2hlbWUoc2NoZW1lKTsKKworICAgICAgICAgICAgYXR0cmlidXRlID0gInByb3RvY29sSGFuZGxlckNsYXNzTmFtZSI7CisgICAgICAgICAgICBTdHJpbmcgaGFuZGxlckNsYXNzTmFtZSA9IAorICAgICAgICAgICAgICAgIChTdHJpbmcpIG1CU2VydmVyLmdldEF0dHJpYnV0ZShjbmFtZSwgYXR0cmlidXRlKTsKKyAgICAgICAgICAgIGludCBwZXJpb2QgPSBoYW5kbGVyQ2xhc3NOYW1lLmxhc3RJbmRleE9mKCcuJyk7CisgICAgICAgICAgICBTdHJpbmcgY29ublR5cGUgPSBoYW5kbGVyQ2xhc3NOYW1lLnN1YnN0cmluZyhwZXJpb2QgKyAxKTsKKyAgICAgICAgICAgIFN0cmluZyBjb25uZWN0b3JUeXBlID0gIkhUVFBTIjsKKyAgICAgICAgICAgIGlmICgiSmtDb3lvdGVIYW5kbGVyIi5lcXVhbHNJZ25vcmVDYXNlKGNvbm5UeXBlKSkgeworICAgICAgICAgICAgICAgIGNvbm5lY3RvclR5cGUgPSAiQUpQIjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIkh0dHAxMVByb3RvY29sIi5lcXVhbHNJZ25vcmVDYXNlKGNvbm5UeXBlKSAmJiAKKyAgICAgICAgICAgICAgICAgICAgICAoImh0dHAiLmVxdWFsc0lnbm9yZUNhc2Uoc2NoZW1lKSkpIHsKKyAgICAgICAgICAgICAgICBjb25uZWN0b3JUeXBlID0gIkhUVFAiOworICAgICAgICAgICAgfSAgICAgICAgICAgICAKKyAgICAgICAgICAgIGNvbm5lY3RvckZtLnNldENvbm5lY3RvclR5cGUoY29ubmVjdG9yVHlwZSk7ICAgICAgICAgICAgCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJhY2NlcHRDb3VudCI7CisgICAgICAgICAgICBjb25uZWN0b3JGbS5zZXRBY2NlcHRDb3VudFRleHQKKyAgICAgICAgICAgICAgICAoU3RyaW5nLnZhbHVlT2YobUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKGNuYW1lLCBhdHRyaWJ1dGUpKSk7ICAgICAgICAgIAorICAgICAgICAgICAgYXR0cmlidXRlID0gImNvbXByZXNzaW9uIjsKKyAgICAgICAgICAgIGNvbm5lY3RvckZtLnNldENvbXByZXNzaW9uCisgICAgICAgICAgICAgICAgKChTdHJpbmcpIG1CU2VydmVyLmdldEF0dHJpYnV0ZShjbmFtZSwgYXR0cmlidXRlKSk7ICAgICAgICAgIAorICAgICAgICAgICAgYXR0cmlidXRlID0gImNvbm5lY3Rpb25MaW5nZXIiOworICAgICAgICAgICAgY29ubmVjdG9yRm0uc2V0Q29ubkxpbmdlclRleHQKKyAgICAgICAgICAgICAgICAoU3RyaW5nLnZhbHVlT2YobUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKGNuYW1lLCBhdHRyaWJ1dGUpKSk7ICAgICAgICAgICAgCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAiY29ubmVjdGlvblRpbWVvdXQiOworICAgICAgICAgICAgY29ubmVjdG9yRm0uc2V0Q29ublRpbWVPdXRUZXh0CisgICAgICAgICAgICAgICAgKFN0cmluZy52YWx1ZU9mKG1CU2VydmVyLmdldEF0dHJpYnV0ZShjbmFtZSwgYXR0cmlidXRlKSkpOyAgICAgICAgICAgICAKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJjb25uZWN0aW9uVXBsb2FkVGltZW91dCI7CisgICAgICAgICAgICBjb25uZWN0b3JGbS5zZXRDb25uVXBsb2FkVGltZU91dFRleHQKKyAgICAgICAgICAgICAgICAoU3RyaW5nLnZhbHVlT2YobUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKGNuYW1lLCBhdHRyaWJ1dGUpKSk7ICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJkaXNhYmxlVXBsb2FkVGltZW91dCI7CisgICAgICAgICAgICBjb25uZWN0b3JGbS5zZXREaXNhYmxlVXBsb2FkVGltZW91dAorICAgICAgICAgICAgICAgIChTdHJpbmcudmFsdWVPZihtQlNlcnZlci5nZXRBdHRyaWJ1dGUoY25hbWUsIGF0dHJpYnV0ZSkpKTsgICAgICAgCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAiYnVmZmVyU2l6ZSI7CisgICAgICAgICAgICBjb25uZWN0b3JGbS5zZXRCdWZmZXJTaXplVGV4dAorICAgICAgICAgICAgICAgIChTdHJpbmcudmFsdWVPZihtQlNlcnZlci5nZXRBdHRyaWJ1dGUoY25hbWUsIGF0dHJpYnV0ZSkpKTsgICAgICAgICAgICAKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJlbmFibGVMb29rdXBzIjsKKyAgICAgICAgICAgIGNvbm5lY3RvckZtLnNldEVuYWJsZUxvb2t1cHMKKyAgICAgICAgICAgICAgICAoU3RyaW5nLnZhbHVlT2YobUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKGNuYW1lLCBhdHRyaWJ1dGUpKSk7ICAgICAgICAgICAgCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAiYWRkcmVzcyI7CisgICAgICAgICAgICBjb25uZWN0b3JGbS5zZXRBZGRyZXNzCisgICAgICAgICAgICAgICAgKChTdHJpbmcpIG1CU2VydmVyLmdldEF0dHJpYnV0ZShjbmFtZSwgYXR0cmlidXRlKSk7ICAgICAgICAgIAorICAgICAgICAgICAgYXR0cmlidXRlID0gIm1heEtlZXBBbGl2ZVJlcXVlc3RzIjsKKyAgICAgICAgICAgIGNvbm5lY3RvckZtLnNldE1heEtlZXBBbGl2ZVRleHQKKyAgICAgICAgICAgICAgICAoU3RyaW5nLnZhbHVlT2YobUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKGNuYW1lLCBhdHRyaWJ1dGUpKSk7ICAgICAgIAorICAgICAgICAgICAgYXR0cmlidXRlID0gIm1heFNwYXJlVGhyZWFkcyI7CisgICAgICAgICAgICBjb25uZWN0b3JGbS5zZXRNYXhTcGFyZQorICAgICAgICAgICAgICAgIChTdHJpbmcudmFsdWVPZihtQlNlcnZlci5nZXRBdHRyaWJ1dGUoY25hbWUsIGF0dHJpYnV0ZSkpKTsgICAgICAgICAKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJtYXhUaHJlYWRzIjsKKyAgICAgICAgICAgIGNvbm5lY3RvckZtLnNldE1heFRocmVhZHMKKyAgICAgICAgICAgICAgICAoU3RyaW5nLnZhbHVlT2YobUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKGNuYW1lLCBhdHRyaWJ1dGUpKSk7ICAgICAgIAorICAgICAgICAgICAgYXR0cmlidXRlID0gIm1pblNwYXJlVGhyZWFkcyI7CisgICAgICAgICAgICBjb25uZWN0b3JGbS5zZXRNaW5TcGFyZQorICAgICAgICAgICAgICAgIChTdHJpbmcudmFsdWVPZihtQlNlcnZlci5nZXRBdHRyaWJ1dGUoY25hbWUsIGF0dHJpYnV0ZSkpKTsgICAgICAgIAorICAgICAgICAgICAgYXR0cmlidXRlID0gInRocmVhZFByaW9yaXR5IjsKKyAgICAgICAgICAgIGNvbm5lY3RvckZtLnNldFRocmVhZFByaW9yaXR5CisgICAgICAgICAgICAgICAgKFN0cmluZy52YWx1ZU9mKG1CU2VydmVyLmdldEF0dHJpYnV0ZShjbmFtZSwgYXR0cmlidXRlKSkpOworICAgICAgICAgICAgYXR0cmlidXRlID0gInNlY3VyZSI7CisgICAgICAgICAgICBjb25uZWN0b3JGbS5zZXRTZWN1cmUKKyAgICAgICAgICAgICAgICAoKChCb29sZWFuKSBtQlNlcnZlci5nZXRBdHRyaWJ1dGUoY25hbWUsIGF0dHJpYnV0ZSkpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgYXR0cmlidXRlID0gInRjcE5vRGVsYXkiOworICAgICAgICAgICAgY29ubmVjdG9yRm0uc2V0VGNwTm9EZWxheQorICAgICAgICAgICAgICAgIChTdHJpbmcudmFsdWVPZihtQlNlcnZlci5nZXRBdHRyaWJ1dGUoY25hbWUsIGF0dHJpYnV0ZSkpKTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJ4cG93ZXJlZEJ5IjsKKyAgICAgICAgICAgIGNvbm5lY3RvckZtLnNldFhwb3dlcmVkQnkKKyAgICAgICAgICAgICAgICAoKChCb29sZWFuKSBtQlNlcnZlci5nZXRBdHRyaWJ1dGUoY25hbWUsIGF0dHJpYnV0ZSkpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgYXR0cmlidXRlID0gIlVSSUVuY29kaW5nIjsKKyAgICAgICAgICAgIGNvbm5lY3RvckZtLnNldFVSSUVuY29kaW5nVGV4dAorICAgICAgICAgICAgICAgICgoU3RyaW5nKSBtQlNlcnZlci5nZXRBdHRyaWJ1dGUoY25hbWUsIGF0dHJpYnV0ZSkpOworICAgICAgICAgICAgYXR0cmlidXRlID0gInVzZUJvZHlFbmNvZGluZ0ZvclVSSSI7CisgICAgICAgICAgICBjb25uZWN0b3JGbS5zZXRVc2VCb2R5RW5jb2RpbmdGb3JVUklUZXh0CisgICAgICAgICAgICAgICAgKCgoQm9vbGVhbikgbUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKGNuYW1lLCBhdHRyaWJ1dGUpKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJhbGxvd1RyYWNlIjsKKyAgICAgICAgICAgIGNvbm5lY3RvckZtLnNldEFsbG93VHJhY2VUZXh0CisgICAgICAgICAgICAgICAgKCgoQm9vbGVhbikgbUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKGNuYW1lLCBhdHRyaWJ1dGUpKS50b1N0cmluZygpKTsKKyAgICAgICAgICAKKyAgICAgICAgICAgIC8vIFBvcnRzCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAicG9ydCI7CisgICAgICAgICAgICBjb25uZWN0b3JGbS5zZXRQb3J0VGV4dAorICAgICAgICAgICAgICAgICgoKEludGVnZXIpIG1CU2VydmVyLmdldEF0dHJpYnV0ZShjbmFtZSwgYXR0cmlidXRlKSkudG9TdHJpbmcoKSk7ICAgICAgICAgICAgCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAicmVkaXJlY3RQb3J0IjsKKyAgICAgICAgICAgIGNvbm5lY3RvckZtLnNldFJlZGlyZWN0UG9ydFRleHQKKyAgICAgICAgICAgICAgICAoKChJbnRlZ2VyKSBtQlNlcnZlci5nZXRBdHRyaWJ1dGUoY25hbWUsIGF0dHJpYnV0ZSkpLnRvU3RyaW5nKCkpOyAgICAgICAgICAgIAorICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBTdXBwb3J0ZWQgYnkgSFRUUCBhbmQgSFRUUFMgb25seQorICAgICAgICAgICAgaWYgKCEoIkFKUCIuZXF1YWxzSWdub3JlQ2FzZShjb25uZWN0b3JUeXBlKSkpIHsKKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgPSAicHJveHlOYW1lIjsKKyAgICAgICAgICAgICAgICBjb25uZWN0b3JGbS5zZXRQcm94eU5hbWUKKyAgICAgICAgICAgICAgICAgICAgKChTdHJpbmcpIG1CU2VydmVyLmdldEF0dHJpYnV0ZShjbmFtZSwgYXR0cmlidXRlKSk7CisgICAgICAgICAgICAgICAgYXR0cmlidXRlID0gInByb3h5UG9ydCI7CisgICAgICAgICAgICAgICAgY29ubmVjdG9yRm0uc2V0UHJveHlQb3J0VGV4dAorICAgICAgICAgICAgICAgICAgICAoKChJbnRlZ2VyKSBtQlNlcnZlci5nZXRBdHRyaWJ1dGUoY25hbWUsIGF0dHJpYnV0ZSkpLnRvU3RyaW5nKCkpOyAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoIkhUVFBTIi5lcXVhbHNJZ25vcmVDYXNlKGNvbm5lY3RvclR5cGUpKSB7CisgICAgICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSByZXN0IG9mIHZhcmlhYmxlcy4gCisgICAgICAgICAgICAgICAgLy8gVGhlc2UgYXJlIHNldCBvbmx5IGZvciBTU0wgY29ubmVjdG9ycy4KKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgPSAiYWxnb3JpdGhtIjsKKyAgICAgICAgICAgICAgICBjb25uZWN0b3JGbS5zZXRBbGdvcml0aG0KKyAgICAgICAgICAgICAgICAgICAgKChTdHJpbmcpIG1CU2VydmVyLmdldEF0dHJpYnV0ZShjbmFtZSwgYXR0cmlidXRlKSk7CisgICAgICAgICAgICAgICAgYXR0cmlidXRlID0gImNsaWVudEF1dGgiOworICAgICAgICAgICAgICAgIGNvbm5lY3RvckZtLnNldENsaWVudEF1dGhlbnRpY2F0aW9uCisgICAgICAgICAgICAgICAgICAgICgoKFN0cmluZykgbUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKGNuYW1lLCBhdHRyaWJ1dGUpKSk7CisgICAgICAgICAgICAgICAgYXR0cmlidXRlID0gImNpcGhlcnMiOworICAgICAgICAgICAgICAgIGNvbm5lY3RvckZtLnNldENpcGhlcnMKKyAgICAgICAgICAgICAgICAgICAgKChTdHJpbmcpIG1CU2VydmVyLmdldEF0dHJpYnV0ZShjbmFtZSwgYXR0cmlidXRlKSk7ICAgCisgICAgICAgICAgICAgICAgYXR0cmlidXRlID0gImtleXN0b3JlRmlsZSI7CisgICAgICAgICAgICAgICAgY29ubmVjdG9yRm0uc2V0S2V5U3RvcmVGaWxlTmFtZQorICAgICAgICAgICAgICAgICAgICAoKFN0cmluZykgbUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKGNuYW1lLCBhdHRyaWJ1dGUpKTsKKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgPSAia2V5c3RvcmVQYXNzIjsKKyAgICAgICAgICAgICAgICBjb25uZWN0b3JGbS5zZXRLZXlTdG9yZVBhc3N3b3JkCisgICAgICAgICAgICAgICAgICAgICgoU3RyaW5nKSBtQlNlcnZlci5nZXRBdHRyaWJ1dGUoY25hbWUsIGF0dHJpYnV0ZSkpOyAgICAgCisgICAgICAgICAgICAgICAgYXR0cmlidXRlID0gImtleXN0b3JlVHlwZSI7CisgICAgICAgICAgICAgICAgY29ubmVjdG9yRm0uc2V0S2V5U3RvcmVUeXBlCisgICAgICAgICAgICAgICAgICAgICgoU3RyaW5nKSBtQlNlcnZlci5nZXRBdHRyaWJ1dGUoY25hbWUsIGF0dHJpYnV0ZSkpOyAgIAorICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJzc2xQcm90b2NvbCI7CisgICAgICAgICAgICAgICAgY29ubmVjdG9yRm0uc2V0U3NsUHJvdG9jb2wKKyAgICAgICAgICAgICAgICAgICAgKChTdHJpbmcpIG1CU2VydmVyLmdldEF0dHJpYnV0ZShjbmFtZSwgYXR0cmlidXRlKSk7ICAgICAgICAgIAorICAgICAgICAgICAgfSAgICAgCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuYXR0cmlidXRlLmdldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSksIHQpOworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5hdHRyaWJ1dGUuZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlKSk7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBGb3J3YXJkIHRvIHRoZSBjb25uZWN0b3IgZGlzcGxheSBwYWdlCisgICAgICAgIHJldHVybiAobWFwcGluZy5maW5kRm9yd2FyZCgiQ29ubmVjdG9yIikpOworICAgICAgICAKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL2Nvbm5lY3Rvci9TYXZlQ29ubmVjdG9yQWN0aW9uLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vY29ubmVjdG9yL1NhdmVDb25uZWN0b3JBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDBjMTI1Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL2Nvbm5lY3Rvci9TYXZlQ29ubmVjdG9yQWN0aW9uLmphdmEKQEAgLTAsMCArMSw0NzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMS0yMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLmNvbm5lY3RvcjsKKworaW1wb3J0IGphdmEubmV0LlVSTEVuY29kZXI7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LkF0dHJpYnV0ZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXJGYWN0b3J5OworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuUXVlcnlFeHA7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5RdWVyeTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdEluc3RhbmNlOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LkpNRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25FcnJvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRXJyb3JzOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3J3YXJkOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLnV0aWwuTWVzc2FnZVJlc291cmNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5BcHBsaWNhdGlvblNlcnZsZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uVG9tY2F0VHJlZUJ1aWxkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uVHJlZUNvbnRyb2w7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uVHJlZUNvbnRyb2xOb2RlOworCisKKy8qKgorICogVGhlIDxjb2RlPkFjdGlvbjwvY29kZT4gdGhhdCBjb21wbGV0ZXMgPGVtPkFkZCBDb25uZWN0b3I8L2VtPiBhbmQKKyAqIDxlbT5FZGl0IENvbm5lY3RvcjwvZW0+IHRyYW5zYWN0aW9ucy4KKyAqCisgKiBAYXV0aG9yIE1hbnZlZW4gS2F1cgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgU2F2ZUNvbm5lY3RvckFjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisgICAgLyoqCisgICAgICogU2lnbmF0dXJlIGZvciB0aGUgPGNvZGU+Y3JlYXRlU3RhbmRhcmRDb25uZWN0b3I8L2NvZGU+IG9wZXJhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBjcmVhdGVTdGFuZGFyZENvbm5lY3RvclR5cGVzW10gPQorICAgIHsgImphdmEubGFuZy5TdHJpbmciLCAgICAvLyBwYXJlbnQKKyAgICAgICJqYXZhLmxhbmcuU3RyaW5nIiwgICAgLy8gYWRkcmVzcworICAgICAgImludCIgICAgICAgICAgICAgICAgICAvLyBwb3J0ICAgICAgCisgICAgfTsKKworICAgIC8qKgorICAgICAqIFRoZSBNQmVhblNlcnZlciB3ZSB3aWxsIGJlIGludGVyYWN0aW5nIHdpdGguCisgICAgICovCisgICAgcHJpdmF0ZSBNQmVhblNlcnZlciBtQlNlcnZlciA9IG51bGw7CisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisgICAgCisgICAgCisgICAgLyoqCisgICAgICogUHJvY2VzcyB0aGUgc3BlY2lmaWVkIEhUVFAgcmVxdWVzdCwgYW5kIGNyZWF0ZSB0aGUgY29ycmVzcG9uZGluZyBIVFRQCisgICAgICogcmVzcG9uc2UgKG9yIGZvcndhcmQgdG8gYW5vdGhlciB3ZWIgY29tcG9uZW50IHRoYXQgd2lsbCBjcmVhdGUgaXQpLgorICAgICAqIFJldHVybiBhbiA8Y29kZT5BY3Rpb25Gb3J3YXJkPC9jb2RlPiBpbnN0YW5jZSBkZXNjcmliaW5nIHdoZXJlIGFuZCBob3cKKyAgICAgKiBjb250cm9sIHNob3VsZCBiZSBmb3J3YXJkZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSByZXNwb25zZSBoYXMKKyAgICAgKiBhbHJlYWR5IGJlZW4gY29tcGxldGVkLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIEFjdGlvbk1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSBhY3Rpb25Gb3JtIFRoZSBvcHRpb25hbCBBY3Rpb25Gb3JtIGJlYW4gZm9yIHRoaXMgcmVxdWVzdCAoaWYgYW55KQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBIVFRQIHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIEhUVFAgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0IGV4Y2VwdGlvbiBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgQWN0aW9uRm9yd2FyZCBwZXJmb3JtKEFjdGlvbk1hcHBpbmcgbWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbkZvcm0gZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKyAgICAgICAgCisgICAgICAgIC8vIEFjcXVpcmUgdGhlIHJlc291cmNlcyB0aGF0IHdlIG5lZWQKKyAgICAgICAgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpOworICAgICAgICBMb2NhbGUgbG9jYWxlID0gZ2V0TG9jYWxlKHJlcXVlc3QpOworICAgICAgICBNZXNzYWdlUmVzb3VyY2VzIHJlc291cmNlcyA9IGdldFJlc291cmNlcyhyZXF1ZXN0KTsKKyAgICAgICAgCisgICAgICAgIC8vIEFjcXVpcmUgYSByZWZlcmVuY2UgdG8gdGhlIE1CZWFuU2VydmVyIGNvbnRhaW5pbmcgb3VyIE1CZWFucworICAgICAgICB0cnkgeworICAgICAgICAgICAgbUJTZXJ2ZXIgPSAoKEFwcGxpY2F0aW9uU2VydmxldCkgZ2V0U2VydmxldCgpKS5nZXRTZXJ2ZXIoKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uCisgICAgICAgICAgICAoIkNhbm5vdCBhY3F1aXJlIE1CZWFuU2VydmVyIHJlZmVyZW5jZSIsIHQpOworICAgICAgICB9ICAgIAorICAgICAgICAKKyAgICAgICAgLy8gSWRlbnRpZnkgdGhlIHJlcXVlc3RlZCBhY3Rpb24KKyAgICAgICAgQ29ubmVjdG9yRm9ybSBjZm9ybSA9IChDb25uZWN0b3JGb3JtKSBmb3JtOworICAgICAgICBTdHJpbmcgYWRtaW5BY3Rpb24gPSBjZm9ybS5nZXRBZG1pbkFjdGlvbigpOworICAgICAgICBTdHJpbmcgY09iamVjdE5hbWUgPSBjZm9ybS5nZXRPYmplY3ROYW1lKCk7CisgICAgICAgIFN0cmluZyBjb25uZWN0b3JUeXBlID0gY2Zvcm0uZ2V0Q29ubmVjdG9yVHlwZSgpOworICAgICAgICBPYmplY3ROYW1lIGNvbmFtZSA9IG51bGw7CisKKyAgICAgICAgLy8gUGVyZm9ybSBhICJDcmVhdGUgQ29ubmVjdG9yIiB0cmFuc2FjdGlvbiAoaWYgcmVxdWVzdGVkKQorICAgICAgICBpZiAoIkNyZWF0ZSIuZXF1YWxzKGFkbWluQWN0aW9uKSkgeworCisgICAgICAgICAgICBTdHJpbmcgb3BlcmF0aW9uID0gbnVsbDsKKyAgICAgICAgICAgIE9iamVjdCB2YWx1ZXNbXSA9IG51bGw7CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgLy8gZ2V0IHNlcnZpY2UgbmFtZSB3aGljaCBpcyBzYW1lIGFzIGRvbWFpbgorICAgICAgICAgICAgICAgIFN0cmluZyBzZXJ2aWNlTmFtZSA9IGNmb3JtLmdldFNlcnZpY2VOYW1lKCk7CisgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSBzb25hbWUgPSBuZXcgT2JqZWN0TmFtZShzZXJ2aWNlTmFtZSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIGRvbWFpbiA9IHNvbmFtZS5nZXREb21haW4oKTsKKyAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKGRvbWFpbik7CisgICAgICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNlYXJjaFNCID0gbmV3IFN0cmluZ0J1ZmZlcigiKiIpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChUb21jYXRUcmVlQnVpbGRlci5DT05ORUNUT1JfVFlQRSk7CisgICAgICAgICAgICAgICAgc2VhcmNoU0IuYXBwZW5kKFRvbWNhdFRyZWVCdWlsZGVyLkNPTk5FQ1RPUl9UWVBFKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIixwb3J0PSIgKyBjZm9ybS5nZXRQb3J0VGV4dCgpKTsKKyAgICAgICAgICAgICAgICBzZWFyY2hTQi5hcHBlbmQoIixwb3J0PSIgKyBjZm9ybS5nZXRQb3J0VGV4dCgpKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBPYmplY3ROYW1lIHNlYXJjaCA9IG5ldyBPYmplY3ROYW1lKHNlYXJjaFNCLnRvU3RyaW5nKCkrIiwqIik7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgU3RyaW5nIGFkZHJlc3MgPSBjZm9ybS5nZXRBZGRyZXNzKCk7CisgICAgICAgICAgICAgICAgaWYgKChhZGRyZXNzIT1udWxsKSAmJiAoYWRkcmVzcy5sZW5ndGgoKT4wKSAmJiAKKyAgICAgICAgICAgICAgICAgICAgICAgICghYWRkcmVzcy5lcXVhbHNJZ25vcmVDYXNlKCIgIikpKSB7CisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiLGFkZHJlc3M9IiArIGFkZHJlc3MpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MgPSBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0gbmV3IE9iamVjdE5hbWUoc2IudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGUgcmVxdWVzdGVkIGNvbm5lY3RvciBuYW1lIGFuZCBwb3J0IGlzIHVuaXF1ZQorICAgICAgICAgICAgICAgIGlmIChtQlNlcnZlci5pc1JlZ2lzdGVyZWQob25hbWUpIHx8CisgICAgICAgICAgICAgICAgICAgICghbUJTZXJ2ZXIucXVlcnlOYW1lcyhzZWFyY2gsIG51bGwpLmlzRW1wdHkoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgQWN0aW9uRXJyb3JzIGVycm9ycyA9IG5ldyBBY3Rpb25FcnJvcnMoKTsKKyAgICAgICAgICAgICAgICAgICAgZXJyb3JzLmFkZCgiY29ubmVjdG9yTmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFjdGlvbkVycm9yKCJlcnJvci5jb25uZWN0b3JOYW1lLmV4aXN0cyIpKTsKKyAgICAgICAgICAgICAgICAgICAgc2F2ZUVycm9ycyhyZXF1ZXN0LCBlcnJvcnMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG5ldyBBY3Rpb25Gb3J3YXJkKG1hcHBpbmcuZ2V0SW5wdXQoKSkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIExvb2sgdXAgb3VyIE1CZWFuRmFjdG9yeSBNQmVhbgorICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgZm5hbWUgPSBUb21jYXRUcmVlQnVpbGRlci5nZXRNQmVhbkZhY3RvcnkoKTsKKworICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBDb25uZWN0b3Igb2JqZWN0CisgICAgICAgICAgICAgICAgdmFsdWVzID0gbmV3IE9iamVjdFszXTsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgdmFsdWVzWzBdID0gc2VydmljZU5hbWU7ICAvL3NlcnZpY2UgcGFyZW50IG9iamVjdCBuYW1lCisgICAgICAgICAgICAgICAgdmFsdWVzWzFdID0gYWRkcmVzczsKKyAgICAgICAgICAgICAgICB2YWx1ZXNbMl0gPSBuZXcgSW50ZWdlcihjZm9ybS5nZXRQb3J0VGV4dCgpKTsKKworICAgICAgICAgICAgICAgIGlmICgiSFRUUCIuZXF1YWxzSWdub3JlQ2FzZShjb25uZWN0b3JUeXBlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uID0gImNyZWF0ZUh0dHBDb25uZWN0b3IiOyAvLyBIVFRQCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgiSFRUUFMiLmVxdWFsc0lnbm9yZUNhc2UoY29ubmVjdG9yVHlwZSkpIHsgCisgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24gPSAiY3JlYXRlSHR0cHNDb25uZWN0b3IiOyAgIC8vIEhUVFBTCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbiA9ICJjcmVhdGVBanBDb25uZWN0b3IiOyAgIC8vIEFKUChIVFRQKSAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBjT2JqZWN0TmFtZSA9IChTdHJpbmcpCisgICAgICAgICAgICAgICAgICAgIG1CU2VydmVyLmludm9rZShmbmFtZSwgb3BlcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLCBjcmVhdGVTdGFuZGFyZENvbm5lY3RvclR5cGVzKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIG5ldyBDb25uZWN0b3IgdG8gb3VyIHRyZWUgY29udHJvbCBub2RlCisgICAgICAgICAgICAgICAgVHJlZUNvbnRyb2wgY29udHJvbCA9IChUcmVlQ29udHJvbCkKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRBdHRyaWJ1dGUoInRyZWVDb250cm9sVGVzdCIpOworICAgICAgICAgICAgICAgIGlmIChjb250cm9sICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhcmVudE5hbWUgPSBzZXJ2aWNlTmFtZTsKKyAgICAgICAgICAgICAgICAgICAgVHJlZUNvbnRyb2xOb2RlIHBhcmVudE5vZGUgPSBjb250cm9sLmZpbmROb2RlKHBhcmVudE5hbWUpOworICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50Tm9kZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbm9kZUxhYmVsID0gcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2VydmVyLnNlcnZpY2UudHJlZUJ1aWxkZXIuY29ubmVjdG9yIikgKyAiICgiICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Zvcm0uZ2V0UG9ydFRleHQoKSArICIpIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBlbmNvZGVkTmFtZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUoY09iamVjdE5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgVHJlZUNvbnRyb2xOb2RlIGNoaWxkTm9kZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFRyZWVDb250cm9sTm9kZShjT2JqZWN0TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb25uZWN0b3IuZ2lmIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVMYWJlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFZGl0Q29ubmVjdG9yLmRvP3NlbGVjdD0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZWROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRlbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgZG9tYWluKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FLS10aGUgbm9kZSBzaG91bGQgYmUgbmV4dCB0byB0aGUgcmVzdCBvZiAKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBDb25uZWN0b3Igbm9kZXMuLgorICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50Tm9kZS5hZGRDaGlsZChjaGlsZE5vZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgLSBmb3JjZSBhIHJlZGlzcGxheQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiQ2Fubm90IGZpbmQgcGFyZW50IG5vZGUgJyIgKyBwYXJlbnROYW1lICsgIiciKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAgICAgICAgICgiQ2Fubm90IGZpbmQgVHJlZUNvbnRyb2xOb2RlISIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKworICAgICAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmludm9rZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24pLCBlKTsKKyAgICAgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuaW52b2tlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbikpOworICAgICAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgLy8gUGVyZm9ybSBhdHRyaWJ1dGUgdXBkYXRlcyBhcyByZXF1ZXN0ZWQKKyAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZSA9IG51bGw7CisgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgIGNvbmFtZSA9IG5ldyBPYmplY3ROYW1lKGNPYmplY3ROYW1lKTsKKworICAgICAgICAgICAgYXR0cmlidXRlID0gImFjY2VwdENvdW50IjsKKyAgICAgICAgICAgIGludCBhY2NlcHRDb3VudCA9IDYwMDAwOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBhY2NlcHRDb3VudCA9IEludGVnZXIucGFyc2VJbnQoY2Zvcm0uZ2V0QWNjZXB0Q291bnRUZXh0KCkpOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICBhY2NlcHRDb3VudCA9IDYwMDAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUJTZXJ2ZXIuc2V0QXR0cmlidXRlKGNvbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKCJhY2NlcHRDb3VudCIsIG5ldyBJbnRlZ2VyKGFjY2VwdENvdW50KSkpOyAgICAKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJjb21wcmVzc2lvbiI7ICAKKyAgICAgICAgICAgIFN0cmluZyBjb21wcmVzc2lvbiA9IGNmb3JtLmdldENvbXByZXNzaW9uKCk7CisgICAgICAgICAgICBpZiAoKGNvbXByZXNzaW9uICE9IG51bGwpICYmIChjb21wcmVzc2lvbi5sZW5ndGgoKT4wKSkgeyAKKyAgICAgICAgICAgICAgICBtQlNlcnZlci5zZXRBdHRyaWJ1dGUoY29uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKCJjb21wcmVzc2lvbiIsIGNvbXByZXNzaW9uKSk7CisgICAgICAgICAgICB9ICAgICAgICAKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJjb25uZWN0aW9uTGluZ2VyIjsKKyAgICAgICAgICAgIGludCBjb25uZWN0aW9uTGluZ2VyID0gLTE7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25MaW5nZXIgPSBJbnRlZ2VyLnBhcnNlSW50KGNmb3JtLmdldENvbm5MaW5nZXJUZXh0KCkpOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICBjb25uZWN0aW9uTGluZ2VyID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1CU2VydmVyLnNldEF0dHJpYnV0ZShjb25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZSgiY29ubmVjdGlvbkxpbmdlciIsIG5ldyBJbnRlZ2VyKGNvbm5lY3Rpb25MaW5nZXIpKSk7IAorICAgICAgICAgICAgYXR0cmlidXRlID0gImNvbm5lY3Rpb25UaW1lb3V0IjsKKyAgICAgICAgICAgIGludCBjb25uZWN0aW9uVGltZW91dCA9IDA7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25UaW1lb3V0ID0gSW50ZWdlci5wYXJzZUludChjZm9ybS5nZXRDb25uVGltZU91dFRleHQoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25UaW1lb3V0ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1CU2VydmVyLnNldEF0dHJpYnV0ZShjb25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZSgiY29ubmVjdGlvblRpbWVvdXQiLCBuZXcgSW50ZWdlcihjb25uZWN0aW9uVGltZW91dCkpKTsgICAgICAgICAgICAKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJjb25uZWN0aW9uVXBsb2FkVGltZW91dCI7CisgICAgICAgICAgICBpbnQgY29ubmVjdGlvblVwbG9hZFRpbWVvdXQgPSAwOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjb25uZWN0aW9uVXBsb2FkVGltZW91dCA9IEludGVnZXIucGFyc2VJbnQoY2Zvcm0uZ2V0Q29ublVwbG9hZFRpbWVPdXRUZXh0KCkpOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICBjb25uZWN0aW9uVXBsb2FkVGltZW91dCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQlNlcnZlci5zZXRBdHRyaWJ1dGUoY29uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoImNvbm5lY3Rpb25VcGxvYWRUaW1lb3V0IiwgbmV3IEludGVnZXIoY29ubmVjdGlvblVwbG9hZFRpbWVvdXQpKSk7ICAgICAgICAKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJidWZmZXJTaXplIjsKKyAgICAgICAgICAgIGludCBidWZmZXJTaXplID0gMjA0ODsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgYnVmZmVyU2l6ZSA9IEludGVnZXIucGFyc2VJbnQoY2Zvcm0uZ2V0QnVmZmVyU2l6ZVRleHQoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgIGJ1ZmZlclNpemUgPSAyMDQ4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUJTZXJ2ZXIuc2V0QXR0cmlidXRlKGNvbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKCJidWZmZXJTaXplIiwgbmV3IEludGVnZXIoYnVmZmVyU2l6ZSkpKTsgICAgCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAiZGlzYWJsZVVwbG9hZFRpbWVvdXQiOworICAgICAgICAgICAgbUJTZXJ2ZXIuc2V0QXR0cmlidXRlKGNvbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKCJkaXNhYmxlVXBsb2FkVGltZW91dCIsIG5ldyBCb29sZWFuKGNmb3JtLmdldERpc2FibGVVcGxvYWRUaW1lb3V0KCkpKSk7ICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAiZW5hYmxlTG9va3VwcyI7CisgICAgICAgICAgICBtQlNlcnZlci5zZXRBdHRyaWJ1dGUoY29uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoImVuYWJsZUxvb2t1cHMiLCBuZXcgQm9vbGVhbihjZm9ybS5nZXRFbmFibGVMb29rdXBzKCkpKSk7ICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJyZWRpcmVjdFBvcnQiOworICAgICAgICAgICAgaW50IHJlZGlyZWN0UG9ydCA9IDA7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJlZGlyZWN0UG9ydCA9IEludGVnZXIucGFyc2VJbnQoY2Zvcm0uZ2V0UmVkaXJlY3RQb3J0VGV4dCgpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgcmVkaXJlY3RQb3J0ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1CU2VydmVyLnNldEF0dHJpYnV0ZShjb25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZSgicmVkaXJlY3RQb3J0IiwgbmV3IEludGVnZXIocmVkaXJlY3RQb3J0KSkpOyAKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJtaW5Qcm9jZXNzb3JzIjsKKyAgICAgICAgICAgIGludCBtaW5Qcm9jZXNzb3JzID0gNTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbWluUHJvY2Vzc29ycyA9IEludGVnZXIucGFyc2VJbnQoY2Zvcm0uZ2V0TWluUHJvY2Vzc29yc1RleHQoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgIG1pblByb2Nlc3NvcnMgPSA1OworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy9tQlNlcnZlci5zZXRBdHRyaWJ1dGUoY29uYW1lLAorICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZSgibWluUHJvY2Vzc29ycyIsIG5ldyBJbnRlZ2VyKG1pblByb2Nlc3NvcnMpKSk7IAorICAgICAgICAgICAgYXR0cmlidXRlID0gIm1heFByb2Nlc3NvcnMiOworICAgICAgICAgICAgaW50IG1heFByb2Nlc3NvcnMgPSAyMDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbWF4UHJvY2Vzc29ycyA9IEludGVnZXIucGFyc2VJbnQoY2Zvcm0uZ2V0TWF4UHJvY2Vzc29yc1RleHQoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgIG1heFByb2Nlc3NvcnMgPSAyMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vbUJTZXJ2ZXIuc2V0QXR0cmlidXRlKGNvbmFtZSwKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoIm1heFByb2Nlc3NvcnMiLCBuZXcgSW50ZWdlcihtYXhQcm9jZXNzb3JzKSkpOyAKKyAgICAgICAKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJtYXhLZWVwQWxpdmVSZXF1ZXN0cyI7CisgICAgICAgICAgICBpbnQgbWF4S2VlcEFsaXZlUmVxdWVzdHMgPSAxMDA7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1heEtlZXBBbGl2ZVJlcXVlc3RzID0gSW50ZWdlci5wYXJzZUludChjZm9ybS5nZXRNYXhLZWVwQWxpdmVUZXh0KCkpOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICBtYXhLZWVwQWxpdmVSZXF1ZXN0cyA9IDEwMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1CU2VydmVyLnNldEF0dHJpYnV0ZShjb25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZSgibWF4S2VlcEFsaXZlUmVxdWVzdHMiLCBuZXcgSW50ZWdlcihtYXhLZWVwQWxpdmVSZXF1ZXN0cykpKTsgCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAibWF4U3BhcmVUaHJlYWRzIjsKKyAgICAgICAgICAgIGludCBtYXhTcGFyZSA9IDUwOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtYXhTcGFyZSA9IEludGVnZXIucGFyc2VJbnQoY2Zvcm0uZ2V0TWF4U3BhcmUoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgIG1heFNwYXJlID0gNTA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQlNlcnZlci5zZXRBdHRyaWJ1dGUoY29uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoYXR0cmlidXRlLCAobmV3IEludGVnZXIobWF4U3BhcmUpKS50b1N0cmluZygpKSk7IAorICAgICAgICAgICAgYXR0cmlidXRlID0gIm1heFRocmVhZHMiOworICAgICAgICAgICAgaW50IG1heFRocmVhZHMgPSAyMDA7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1heFRocmVhZHMgPSBJbnRlZ2VyLnBhcnNlSW50KGNmb3JtLmdldE1heFRocmVhZHMoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgIG1heFRocmVhZHMgPSAyMDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQlNlcnZlci5zZXRBdHRyaWJ1dGUoY29uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoYXR0cmlidXRlLCAobmV3IEludGVnZXIobWF4VGhyZWFkcykpLnRvU3RyaW5nKCkpKTsgCisJCQkKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJtaW5TcGFyZVRocmVhZHMiOworICAgICAgICAgICAgaW50IG1pblNwYXJlID0gNDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbWluU3BhcmUgPSBJbnRlZ2VyLnBhcnNlSW50KGNmb3JtLmdldE1pblNwYXJlKCkpOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICBtaW5TcGFyZSA9IDQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQlNlcnZlci5zZXRBdHRyaWJ1dGUoY29uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoYXR0cmlidXRlLCAobmV3IEludGVnZXIobWluU3BhcmUpKS50b1N0cmluZygpKSk7IAorCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAidGhyZWFkUHJpb3JpdHkiOworICAgICAgICAgICAgaW50IHRocmVhZFByaW9yaXR5ID0gVGhyZWFkLk5PUk1fUFJJT1JJVFk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHRocmVhZFByaW9yaXR5ID0gSW50ZWdlci5wYXJzZUludChjZm9ybS5nZXRUaHJlYWRQcmlvcml0eSgpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgdGhyZWFkUHJpb3JpdHkgPSBUaHJlYWQuTk9STV9QUklPUklUWTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1CU2VydmVyLnNldEF0dHJpYnV0ZShjb25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZShhdHRyaWJ1dGUsIChuZXcgSW50ZWdlcih0aHJlYWRQcmlvcml0eSkpKSk7CisJCQkJICAKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJzZWN1cmUiOworICAgICAgICAgICAgbUJTZXJ2ZXIuc2V0QXR0cmlidXRlKGNvbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKCJzZWN1cmUiLCBuZXcgQm9vbGVhbihjZm9ybS5nZXRTZWN1cmUoKSkpKTsgICAgCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAidGNwTm9EZWxheSI7CisgICAgICAgICAgICBtQlNlcnZlci5zZXRBdHRyaWJ1dGUoY29uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoInRjcE5vRGVsYXkiLCBuZXcgQm9vbGVhbihjZm9ybS5nZXRUY3BOb0RlbGF5KCkpKSk7ICAgIAorICAgICAgICAgICAgCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAieHBvd2VyZWRCeSI7CisgICAgICAgICAgICBtQlNlcnZlci5zZXRBdHRyaWJ1dGUoY29uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoInhwb3dlcmVkQnkiLCBuZXcgQm9vbGVhbihjZm9ybS5nZXRYcG93ZXJlZEJ5KCkpKSk7ICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJVUklFbmNvZGluZyI7CisgICAgICAgICAgICBTdHJpbmcgdXJpRW5jID0gY2Zvcm0uZ2V0VVJJRW5jb2RpbmdUZXh0KCk7CisgICAgICAgICAgICBpZiAoKHVyaUVuYyAhPSBudWxsKSAmJiAodXJpRW5jLmxlbmd0aCgpPT0wKSkgeworICAgICAgICAgICAgICAgIHVyaUVuYyA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQlNlcnZlci5zZXRBdHRyaWJ1dGUoY29uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoYXR0cmlidXRlLCB1cmlFbmMpKTsgICAgICAgICAgICAKKworICAgICAgICAgICAgYXR0cmlidXRlID0gInVzZUJvZHlFbmNvZGluZ0ZvclVSSSI7CisgICAgICAgICAgICBtQlNlcnZlci5zZXRBdHRyaWJ1dGUoY29uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoYXR0cmlidXRlLCBuZXcgQm9vbGVhbihjZm9ybS5nZXRVc2VCb2R5RW5jb2RpbmdGb3JVUklUZXh0KCkpKSk7CisKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJhbGxvd1RyYWNlIjsKKyAgICAgICAgICAgIG1CU2VydmVyLnNldEF0dHJpYnV0ZShjb25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZShhdHRyaWJ1dGUsIG5ldyBCb29sZWFuKGNmb3JtLmdldEFsbG93VHJhY2VUZXh0KCkpKSk7CisKKyAgICAgICAgICAgIC8vIHByb3h5IG5hbWUgYW5kIHBvcnQgZG8gbm90IGV4aXN0IGZvciBBSlAgY29ubmVjdG9yCisgICAgICAgICAgICBpZiAoISgiQUpQIi5lcXVhbHNJZ25vcmVDYXNlKGNvbm5lY3RvclR5cGUpKSkgeworICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJwcm94eU5hbWUiOyAgCisgICAgICAgICAgICAgICAgU3RyaW5nIHByb3h5TmFtZSA9IGNmb3JtLmdldFByb3h5TmFtZSgpOworICAgICAgICAgICAgICAgIGlmICgocHJveHlOYW1lICE9IG51bGwpICYmIChwcm94eU5hbWUubGVuZ3RoKCk+MCkpIHsgCisgICAgICAgICAgICAgICAgICAgIG1CU2VydmVyLnNldEF0dHJpYnV0ZShjb25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZSgicHJveHlOYW1lIiwgcHJveHlOYW1lKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJwcm94eVBvcnQiOworICAgICAgICAgICAgICAgIGludCBwcm94eVBvcnQgPSAwOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHByb3h5UG9ydCA9IEludGVnZXIucGFyc2VJbnQoY2Zvcm0uZ2V0UHJveHlQb3J0VGV4dCgpKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgICAgICBwcm94eVBvcnQgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtQlNlcnZlci5zZXRBdHRyaWJ1dGUoY29uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZSgicHJveHlQb3J0IiwgbmV3IEludGVnZXIocHJveHlQb3J0KSkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gSFRUUFMgc3BlY2lmaWMgcHJvcGVydGllcworICAgICAgICAgICAgaWYoIkhUVFBTIi5lcXVhbHNJZ25vcmVDYXNlKGNvbm5lY3RvclR5cGUpKSB7CisgICAgICAgICAgICAgICAgYXR0cmlidXRlID0gImFsZ29yaXRobSI7CisgICAgICAgICAgICAgICAgU3RyaW5nIGFsZ29yaXRobSA9IGNmb3JtLmdldEFsZ29yaXRobSgpOworICAgICAgICAgICAgICAgIGlmICgoYWxnb3JpdGhtICE9IG51bGwpICYmIChhbGdvcml0aG0ubGVuZ3RoKCk+MCkpIAorICAgICAgICAgICAgICAgICAgICBtQlNlcnZlci5zZXRBdHRyaWJ1dGUoY29uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZSgiYWxnb3JpdGhtIiwgYWxnb3JpdGhtKSk7ICAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgPSAiY2xpZW50QXV0aCI7ICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBtQlNlcnZlci5zZXRBdHRyaWJ1dGUoY29uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZSgiY2xpZW50QXV0aCIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Zvcm0uZ2V0Q2xpZW50QXV0aGVudGljYXRpb24oKSkpOyAgIAorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJjaXBoZXJzIjsKKyAgICAgICAgICAgICAgICBTdHJpbmcgY2lwaGVycyA9IGNmb3JtLmdldENpcGhlcnMoKTsKKyAgICAgICAgICAgICAgICBpZiAoKGNpcGhlcnMgIT0gbnVsbCkgJiYgKGNpcGhlcnMubGVuZ3RoKCk+MCkpIAorICAgICAgICAgICAgICAgICAgICBtQlNlcnZlci5zZXRBdHRyaWJ1dGUoY29uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZSgiY2lwaGVycyIsIGNpcGhlcnMpKTsgICAgICAgICAgIAorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJrZXlzdG9yZUZpbGUiOworICAgICAgICAgICAgICAgIFN0cmluZyBrZXlGaWxlID0gY2Zvcm0uZ2V0S2V5U3RvcmVGaWxlTmFtZSgpOworICAgICAgICAgICAgICAgIGlmICgoa2V5RmlsZSAhPSBudWxsKSAmJiAoa2V5RmlsZS5sZW5ndGgoKT4wKSkgCisgICAgICAgICAgICAgICAgICAgIG1CU2VydmVyLnNldEF0dHJpYnV0ZShjb25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKCJrZXlzdG9yZUZpbGUiLCBrZXlGaWxlKSk7ICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgYXR0cmlidXRlID0gImtleXN0b3JlUGFzcyI7CisgICAgICAgICAgICAgICAgU3RyaW5nIGtleVBhc3MgPSBjZm9ybS5nZXRLZXlTdG9yZVBhc3N3b3JkKCk7CisgICAgICAgICAgICAgICAgaWYgKChrZXlQYXNzICE9IG51bGwpICYmIChrZXlQYXNzLmxlbmd0aCgpPjApKSAKKyAgICAgICAgICAgICAgICAgICAgbUJTZXJ2ZXIuc2V0QXR0cmlidXRlKGNvbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoImtleXN0b3JlUGFzcyIsIGtleVBhc3MpKTsgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIHJlcXVlc3Quc2V0QXR0cmlidXRlKCJ3YXJuaW5nIiwgImNvbm5lY3Rvci5rZXlQYXNzLndhcm5pbmciKTsgIAorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJrZXlzdG9yZVR5cGUiOworICAgICAgICAgICAgICAgIFN0cmluZyBrZXlUeXBlID0gY2Zvcm0uZ2V0S2V5U3RvcmVUeXBlKCk7CisgICAgICAgICAgICAgICAgaWYgKChrZXlUeXBlICE9IG51bGwpICYmIChrZXlUeXBlLmxlbmd0aCgpPjApKSAKKyAgICAgICAgICAgICAgICAgICAgbUJTZXJ2ZXIuc2V0QXR0cmlidXRlKGNvbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoImtleXN0b3JlVHlwZSIsIGtleVR5cGUpKTsgICAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgPSAic3NsUHJvdG9jb2wiOworICAgICAgICAgICAgICAgIFN0cmluZyBzc2xQcm90b2NvbCA9IGNmb3JtLmdldFNzbFByb3RvY29sKCk7CisgICAgICAgICAgICAgICAgaWYgKChzc2xQcm90b2NvbCAhPSBudWxsKSAmJiAoc3NsUHJvdG9jb2wubGVuZ3RoKCk+MCkpIAorICAgICAgICAgICAgICAgICAgICBtQlNlcnZlci5zZXRBdHRyaWJ1dGUoY29uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZSgic3NsUHJvdG9jb2wiLCBzc2xQcm90b2NvbCkpOyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgfQorIAorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCisgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nCisgICAgICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmF0dHJpYnV0ZS5zZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUpLCBlKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuYXR0cmlidXRlLnNldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSkpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgfQorICAgICAgICAvLyBGb3J3YXJkIHRvIHRoZSBzdWNjZXNzIHJlcG9ydGluZyBwYWdlCisgICAgICAgIHNlc3Npb24ucmVtb3ZlQXR0cmlidXRlKG1hcHBpbmcuZ2V0QXR0cmlidXRlKCkpOworICAgICAgICByZXR1cm4gKG1hcHBpbmcuZmluZEZvcndhcmQoIlNhdmUgU3VjY2Vzc2Z1bCIpKTsKKyAgICAgICAgCisgICAgfQorICAgIAorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL2NvbnRleHQvQWRkQ29udGV4dEFjdGlvbi5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL2NvbnRleHQvQWRkQ29udGV4dEFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0M2ZkYmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vY29udGV4dC9BZGRDb250ZXh0QWN0aW9uLmphdmEKQEAgLTAsMCArMSwxMTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMS0yMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLmNvbnRleHQ7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRXJyb3JzOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3J3YXJkOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLnV0aWwuTWVzc2FnZVJlc291cmNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5MYWJlbFZhbHVlQmVhbjsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5MaXN0czsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5Ub21jYXRUcmVlQnVpbGRlcjsKKy8qKgorICogVGhlIDxjb2RlPkFjdGlvbjwvY29kZT4gdGhhdCBzZXRzIHVwIDxlbT5BZGQgQ29udGV4dDwvZW0+IHRyYW5zYWN0aW9ucy4KKyAqCisgKiBAYXV0aG9yIE1hbnZlZW4gS2F1cgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgQWRkQ29udGV4dEFjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisgICAgCisgICAgLyoqCisgICAgICogUHJvY2VzcyB0aGUgc3BlY2lmaWVkIEhUVFAgcmVxdWVzdCwgYW5kIGNyZWF0ZSB0aGUgY29ycmVzcG9uZGluZyBIVFRQCisgICAgICogcmVzcG9uc2UgKG9yIGZvcndhcmQgdG8gYW5vdGhlciB3ZWIgY29tcG9uZW50IHRoYXQgd2lsbCBjcmVhdGUgaXQpLgorICAgICAqIFJldHVybiBhbiA8Y29kZT5BY3Rpb25Gb3J3YXJkPC9jb2RlPiBpbnN0YW5jZSBkZXNjcmliaW5nIHdoZXJlIGFuZCBob3cKKyAgICAgKiBjb250cm9sIHNob3VsZCBiZSBmb3J3YXJkZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSByZXNwb25zZSBoYXMKKyAgICAgKiBhbHJlYWR5IGJlZW4gY29tcGxldGVkLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIEFjdGlvbk1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSBhY3Rpb25Gb3JtIFRoZSBvcHRpb25hbCBBY3Rpb25Gb3JtIGJlYW4gZm9yIHRoaXMgcmVxdWVzdCAoaWYgYW55KQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBIVFRQIHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIEhUVFAgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0IGV4Y2VwdGlvbiBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgQWN0aW9uRm9yd2FyZCBwZXJmb3JtKEFjdGlvbk1hcHBpbmcgbWFwcGluZywKKyAgICBBY3Rpb25Gb3JtIGZvcm0sCisgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworICAgICAgICAKKyAgICAgICAgLy8gQWNxdWlyZSB0aGUgcmVzb3VyY2VzIHRoYXQgd2UgbmVlZAorICAgICAgICBIdHRwU2Vzc2lvbiBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uKCk7CisgICAgICAgIExvY2FsZSBsb2NhbGUgPSBnZXRMb2NhbGUocmVxdWVzdCk7CisgICAgICAgIE1lc3NhZ2VSZXNvdXJjZXMgcmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VzKHJlcXVlc3QpOworICAgICAgICAKKyAgICAgICAgLy8gRmlsbCBpbiB0aGUgZm9ybSB2YWx1ZXMgZm9yIGRpc3BsYXkgYW5kIGVkaXRpbmcKKyAgICAgICAgQ29udGV4dEZvcm0gY29udGV4dEZtID0gbmV3IENvbnRleHRGb3JtKCk7CisgICAgICAgIHNlc3Npb24uc2V0QXR0cmlidXRlKCJjb250ZXh0Rm9ybSIsIGNvbnRleHRGbSk7CisgICAgICAgIGNvbnRleHRGbS5zZXRBZG1pbkFjdGlvbigiQ3JlYXRlIik7CisgICAgICAgIGNvbnRleHRGbS5zZXRPYmplY3ROYW1lKCIiKTsKKyAgICAgICAgU3RyaW5nIHBhcmVudCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJwYXJlbnQiKTsKKyAgICAgICAgY29udGV4dEZtLnNldFBhcmVudE9iamVjdE5hbWUocGFyZW50KTsKKyAgICAgICAgaW50IGkgPSBwYXJlbnQuaW5kZXhPZigiOiIpOworICAgICAgICBTdHJpbmcgZG9tYWluID0gcGFyZW50LnN1YnN0cmluZygwLCBpKTsKKyAgICAgICAgaW50IHBvc2l0aW9uID0gcGFyZW50LmluZGV4T2YoIiwiKTsKKyAgICAgICAgU3RyaW5nIGxvYWRlciA9IGRvbWFpbiArIFRvbWNhdFRyZWVCdWlsZGVyLkxPQURFUl9UWVBFICsgCisgICAgICAgICAgICAgICAgcGFyZW50LnN1YnN0cmluZyhwb3NpdGlvbiwgcGFyZW50Lmxlbmd0aCgpKTsKKyAgICAgICAgU3RyaW5nIG1hbmFnZXIgPSBkb21haW4gKyBUb21jYXRUcmVlQnVpbGRlci5NQU5BR0VSX1RZUEUgKyAKKyAgICAgICAgICAgICAgICBwYXJlbnQuc3Vic3RyaW5nKHBvc2l0aW9uLCBwYXJlbnQubGVuZ3RoKCkpOworICAgICAgICBjb250ZXh0Rm0uc2V0TG9hZGVyT2JqZWN0TmFtZShsb2FkZXIpOworICAgICAgICBjb250ZXh0Rm0uc2V0TWFuYWdlck9iamVjdE5hbWUobWFuYWdlcik7IAorICAgICAgICBjb250ZXh0Rm0uc2V0Tm9kZUxhYmVsKCIiKTsKKyAgICAgICAgY29udGV4dEZtLnNldENvb2tpZXMoIiIpOworICAgICAgICBjb250ZXh0Rm0uc2V0Q3Jvc3NDb250ZXh0KCJmYWxzZSIpOworICAgICAgICBjb250ZXh0Rm0uc2V0RG9jQmFzZSgiIik7CisgICAgICAgIGNvbnRleHRGbS5zZXRPdmVycmlkZSgiZmFsc2UiKTsKKyAgICAgICAgY29udGV4dEZtLnNldFBhdGgoIiIpOworICAgICAgICBjb250ZXh0Rm0uc2V0UmVsb2FkYWJsZSgiZmFsc2UiKTsKKyAgICAgICAgY29udGV4dEZtLnNldFN3YWxsb3dPdXRwdXQoImZhbHNlIik7CisgICAgICAgIGNvbnRleHRGbS5zZXRVc2VOYW1pbmcoImZhbHNlIik7CisgICAgICAgIGNvbnRleHRGbS5zZXRXb3JrRGlyKCIiKTsgICAgICAgIAorICAgICAgICBjb250ZXh0Rm0uc2V0UGF0aCgiIik7CisgICAgICAgIC8vbG9hZGVyIGluaXRpYWxpemF0aW9uCisgICAgICAgIC8vY29udGV4dEZtLnNldExkckNoZWNrSW50ZXJ2YWwoIjE1Iik7CisgICAgICAgIGNvbnRleHRGbS5zZXRMZHJSZWxvYWRhYmxlKCJmYWxzZSIpOworICAgICAgICAvL21hbmFnZXIgaW5pdGlhbGl6YXRpb24KKyAgICAgICAgLy9jb250ZXh0Rm0uc2V0TWdyQ2hlY2tJbnRlcnZhbCgiNjAiKTsKKyAgICAgICAgY29udGV4dEZtLnNldE1nck1heFNlc3Npb25zKCItMSIpOworICAgICAgICBjb250ZXh0Rm0uc2V0TWdyU2Vzc2lvbklESW5pdCgiIik7CisgICAgICAgIAorICAgICAgICBjb250ZXh0Rm0uc2V0Qm9vbGVhblZhbHMoTGlzdHMuZ2V0Qm9vbGVhblZhbHVlcygpKTsgICAgICAgIAorICAgICAgICAKKyAgICAgICAgLy8gRm9yd2FyZCB0byB0aGUgY29udGV4dCBkaXNwbGF5IHBhZ2UKKyAgICAgICAgcmV0dXJuIChtYXBwaW5nLmZpbmRGb3J3YXJkKCJDb250ZXh0IikpOworICAgICAgICAKKyAgICB9ICAgIAorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL2NvbnRleHQvQ29udGV4dEZvcm0uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9jb250ZXh0L0NvbnRleHRGb3JtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ3YTU1MgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9jb250ZXh0L0NvbnRleHRGb3JtLmphdmEKQEAgLTAsMCArMSw3NTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLmNvbnRleHQ7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25FcnJvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRXJyb3JzOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEZvcm0gYmVhbiBmb3IgdGhlIGNvbnRleHQgcGFnZS4KKyAqCisgKiBAYXV0aG9yIE1hbnZlZW4gS2F1cgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgQ29udGV4dEZvcm0gZXh0ZW5kcyBBY3Rpb25Gb3JtIHsKKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKyAgICAKKyAgIC8qKgorICAgICAqIFRoZSBhZG1pbmlzdHJhdGl2ZSBhY3Rpb24gcmVwcmVzZW50ZWQgYnkgdGhpcyBmb3JtLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGFkbWluQWN0aW9uID0gIkVkaXQiOworCisgICAgLyoqCisgICAgICogVGhlIG9iamVjdCBuYW1lIG9mIHRoZSBDb250ZXh0IHRoaXMgYmVhbiByZWZlcnMgdG8uCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgb2JqZWN0TmFtZSA9IG51bGw7CisgICAKKyAgICAvKioKKyAgICAgKiBUaGUgb2JqZWN0IG5hbWUgb2YgdGhlIHBhcmVudCBvZiB0aGlzIENvbnRleHQuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcGFyZW50T2JqZWN0TmFtZSA9IG51bGw7CisgICAKKyAgIC8qKgorICAgICAqIFRoZSBvYmplY3QgbmFtZSBvZiB0aGUgbG9hZGVyIG9mIHRoaXMgQ29udGV4dC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBsb2FkZXJPYmplY3ROYW1lID0gbnVsbDsKKyAgIAorICAgIC8qKgorICAgICAqIFRoZSBvYmplY3QgbmFtZSBvZiB0aGUgbWFuYWdlciBvZiB0aGlzIENvbnRleHQuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbWFuYWdlck9iamVjdE5hbWUgPSBudWxsOworICAgCisgICAgLyoqCisgICAgICogVGhlIHRleHQgZm9yIHRoZSBub2RlIGxhYmVsLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIG5vZGVMYWJlbCA9IG51bGw7CisgICAgCisgICAgLyoqCisgICAgICogVGhlIHZhbHVlIG9mIGNvb2tpZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgY29va2llcyA9ICJmYWxzZSI7CisgICAgCisgICAgLyoqCisgICAgICogVGhlIHZhbHVlIG9mIGNyb3NzIGNvbnRleHQuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgY3Jvc3NDb250ZXh0ID0gImZhbHNlIjsKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgdGV4dCBmb3IgdGhlIGRvY3VtZW50IEJhc2UuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZG9jQmFzZSA9IG51bGw7CisgICAgCisgICAgLyoqCisgICAgICogVGhlIHRleHQgZm9yIG92ZXJyaWRlIGJvb2xlYW4uCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgb3ZlcnJpZGUgPSAiZmFsc2UiOworICAgIAorICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciB0aGUgY29udGV4dCBwYXRoIGZvciB0aGlzIGNvbnRleHQuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcGF0aCA9IG51bGw7CisgICAgCisgICAgLyoqCisgICAgICogVGhlIHRleHQgZm9yIHJlbG9hZGFibGUgYm9vbGVhbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyByZWxvYWRhYmxlID0gImZhbHNlIjsKKworICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciBzd2FsbG93T3V0cHV0IGJvb2xlYW4uCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgc3dhbGxvd091dHB1dCA9ICJmYWxzZSI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdGV4dCBmb3IgdXNlIG5hbWluZyBib29sZWFuLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHVzZU5hbWluZyA9ICJmYWxzZSI7CisgICAgCisgICAgLyoqCisgICAgICogVGhlIHRleHQgZm9yIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBmb3IgdGhpcyBjb250ZXh0LgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHdvcmtEaXIgPSBudWxsOworICAgIAorICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciB0aGUgbG9hZGVyIGNoZWNrIGludGVydmFsLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGxkckNoZWNrSW50ZXJ2YWwgPSAiMTUiOworICAgIAorICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciB0aGUgYm9vbGVhbiB2YWx1ZSBvZiBsb2FkZXIgcmVsb2FkYWJsZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBsZHJSZWxvYWRhYmxlID0gImZhbHNlIjsKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgdGV4dCBmb3IgdGhlIHNlc3Npb24gbWFuYWdlciBjaGVjayBpbnRlcnZhbC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBtZ3JDaGVja0ludGVydmFsID0gIjYwIjsKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgdGV4dCBmb3IgdGhlIHNlc3Npb24gbWdyIHNlc3Npb24gSUQgaW5pdGlhbGl6ZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbWdyU2Vzc2lvbklESW5pdCA9ICIiOworICAgIAorICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciB0aGUgc2Vzc2lvbiBtZ3IgbWF4IGFjdGl2ZSBzZXNzaW9ucy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBtZ3JNYXhTZXNzaW9ucyA9ICIwIjsKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgdGV4dCBmb3IgdGhlIGFudGkgcmVzb3VyY2UgbG9ja2luZyBmbGFnLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGFudGlSZXNvdXJjZUxvY2tpbmcgPSAiZmFsc2UiOworCisgICAgLyoqCisgICAgICogVGhlIHRleHQgZm9yIHRoZSBhbnRpIGphciBsb2NraW5nIGZsYWcuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgYW50aUphckxvY2tpbmcgPSAiZmFsc2UiOworCisgICAgLyoKKyAgICAgKiBSZXByZXNlbnQgYm9vbGVhbiAodHJ1ZSwgZmFsc2UpIHZhbHVlcyBmb3IgY29va2llcyBldGMuCisgICAgICovCisgICAgcHJpdmF0ZSBMaXN0IGJvb2xlYW5WYWxzID0gbnVsbDsKKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKyAgICAgCisgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGFkbWluaXN0cmF0aXZlIGFjdGlvbiByZXByZXNlbnRlZCBieSB0aGlzIGZvcm0uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRBZG1pbkFjdGlvbigpIHsKKworICAgICAgICByZXR1cm4gdGhpcy5hZG1pbkFjdGlvbjsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBhZG1pbmlzdHJhdGl2ZSBhY3Rpb24gcmVwcmVzZW50ZWQgYnkgdGhpcyBmb3JtLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEFkbWluQWN0aW9uKFN0cmluZyBhZG1pbkFjdGlvbikgeworCisgICAgICAgIHRoaXMuYWRtaW5BY3Rpb24gPSBhZG1pbkFjdGlvbjsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgb2JqZWN0IG5hbWUgb2YgdGhlIENvbnRleHQgdGhpcyBiZWFuIHJlZmVycyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE9iamVjdE5hbWUoKSB7CisKKyAgICAgICAgcmV0dXJuIHRoaXMub2JqZWN0TmFtZTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgb2JqZWN0IG5hbWUgb2YgdGhlIENvbnRleHQgdGhpcyBiZWFuIHJlZmVycyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPYmplY3ROYW1lKFN0cmluZyBvYmplY3ROYW1lKSB7CisKKyAgICAgICAgdGhpcy5vYmplY3ROYW1lID0gb2JqZWN0TmFtZTsKKworICAgIH0gICAgCisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBwYXJlbnQgb2JqZWN0IG5hbWUgb2YgdGhlIENvbnRleHQgdGhpcyBiZWFuIHJlZmVycyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhcmVudE9iamVjdE5hbWUoKSB7CisKKyAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50T2JqZWN0TmFtZTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcGFyZW50IG9iamVjdCBuYW1lIG9mIHRoZSBDb250ZXh0IHRoaXMgYmVhbiByZWZlcnMgdG8uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGFyZW50T2JqZWN0TmFtZShTdHJpbmcgcGFyZW50T2JqZWN0TmFtZSkgeworCisgICAgICAgIHRoaXMucGFyZW50T2JqZWN0TmFtZSA9IHBhcmVudE9iamVjdE5hbWU7CisKKyAgICB9CisgICAgCisgICAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGxvYWRlciBvYmplY3QgbmFtZSBvZiB0aGUgQ29udGV4dCB0aGlzIGJlYW4gcmVmZXJzIHRvLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9hZGVyT2JqZWN0TmFtZSgpIHsKKworICAgICAgICByZXR1cm4gdGhpcy5sb2FkZXJPYmplY3ROYW1lOworCisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBsb2FkZXIgb2JqZWN0IG5hbWUgb2YgdGhlIENvbnRleHQgdGhpcyBiZWFuIHJlZmVycyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMb2FkZXJPYmplY3ROYW1lKFN0cmluZyBsb2FkZXJPYmplY3ROYW1lKSB7CisKKyAgICAgICAgdGhpcy5sb2FkZXJPYmplY3ROYW1lID0gbG9hZGVyT2JqZWN0TmFtZTsKKworICAgIH0KKyAgICAKKyAgICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbWFuYWdlciBvYmplY3QgbmFtZSBvZiB0aGUgQ29udGV4dCB0aGlzIGJlYW4gcmVmZXJzIHRvLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWFuYWdlck9iamVjdE5hbWUoKSB7CisKKyAgICAgICAgcmV0dXJuIHRoaXMubWFuYWdlck9iamVjdE5hbWU7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG1hbmFnZXIgb2JqZWN0IG5hbWUgb2YgdGhlIENvbnRleHQgdGhpcyBiZWFuIHJlZmVycyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNYW5hZ2VyT2JqZWN0TmFtZShTdHJpbmcgbWFuYWdlck9iamVjdE5hbWUpIHsKKworICAgICAgICB0aGlzLm1hbmFnZXJPYmplY3ROYW1lID0gbWFuYWdlck9iamVjdE5hbWU7CisKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBsYWJlbCBvZiB0aGUgbm9kZSB0aGF0IHdhcyBjbGlja2VkLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Tm9kZUxhYmVsKCkgeworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXMubm9kZUxhYmVsOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBub2RlIGxhYmVsLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE5vZGVMYWJlbChTdHJpbmcgbm9kZUxhYmVsKSB7CisgICAgICAgIAorICAgICAgICB0aGlzLm5vZGVMYWJlbCA9IG5vZGVMYWJlbDsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgYm9vbGVhblZhbHMuCisgICAgICovCisgICAgcHVibGljIExpc3QgZ2V0Qm9vbGVhblZhbHMoKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy5ib29sZWFuVmFsczsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgZGVidWdWYWxzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEJvb2xlYW5WYWxzKExpc3QgYm9vbGVhblZhbHMpIHsKKyAgICAgICAgCisgICAgICAgIHRoaXMuYm9vbGVhblZhbHMgPSBib29sZWFuVmFsczsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgQ29va2llcy4KKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgU3RyaW5nIGdldENvb2tpZXMoKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy5jb29raWVzOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBDb29raWVzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvb2tpZXMoU3RyaW5nIGNvb2tpZXMpIHsKKyAgICAgICAgCisgICAgICAgIHRoaXMuY29va2llcyA9IGNvb2tpZXM7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIENyb3NzIENvbnRleHQuCisgICAgICovCisgICAgCisgICAgcHVibGljIFN0cmluZyBnZXRDcm9zc0NvbnRleHQoKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy5jcm9zc0NvbnRleHQ7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIENyb3NzIENvbnRleHQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q3Jvc3NDb250ZXh0KFN0cmluZyBjcm9zc0NvbnRleHQpIHsKKyAgICAgICAgCisgICAgICAgIHRoaXMuY3Jvc3NDb250ZXh0ID0gY3Jvc3NDb250ZXh0OworICAgICAgICAKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBEb2N1bWVudCBCYXNlIFRleHQuCisgICAgICovCisgICAgCisgICAgcHVibGljIFN0cmluZyBnZXREb2NCYXNlKCkgeworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXMuZG9jQmFzZTsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgZG9jdW1lbnQgQmFzZSB0ZXh0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERvY0Jhc2UoU3RyaW5nIGRvY0Jhc2UpIHsKKyAgICAgICAgCisgICAgICAgIHRoaXMuZG9jQmFzZSA9IGRvY0Jhc2U7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIE92ZXJyaWRlIGJvb2xlYW4gdmFsdWUuCisgICAgICovCisgICAgCisgICAgcHVibGljIFN0cmluZyBnZXRPdmVycmlkZSgpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLm92ZXJyaWRlOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBvdmVycmlkZSB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPdmVycmlkZShTdHJpbmcgb3ZlcnJpZGUpIHsKKyAgICAgICAgCisgICAgICAgIHRoaXMub3ZlcnJpZGUgPSBvdmVycmlkZTsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY29udGV4dCBwYXRoLgorICAgICAqLworICAgIAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLnBhdGg7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNvbnRleHQgcGF0aCB0ZXh0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhdGgoU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgCisgICAgICAgIHRoaXMucGF0aCA9IHBhdGg7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHJlbG9hZGFibGUgYm9vbGVhbiB2YWx1ZS4KKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlbG9hZGFibGUoKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy5yZWxvYWRhYmxlOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSByZWxvYWRhYmxlIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlbG9hZGFibGUoU3RyaW5nIHJlbG9hZGFibGUpIHsKKyAgICAgICAgCisgICAgICAgIHRoaXMucmVsb2FkYWJsZSA9IHJlbG9hZGFibGU7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHN3YWxsb3dPdXRwdXQgYm9vbGVhbiB2YWx1ZS4KKyAgICAgKi8KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3dhbGxvd091dHB1dCgpIHsKKworICAgICAgICByZXR1cm4gdGhpcy5zd2FsbG93T3V0cHV0OworCisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzd2FsbG93T3V0cHV0IHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFN3YWxsb3dPdXRwdXQoU3RyaW5nIHN3YWxsb3dPdXRwdXQpIHsKKworICAgICAgICB0aGlzLnN3YWxsb3dPdXRwdXQgPSBzd2FsbG93T3V0cHV0OworCisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB1c2UgbmFtaW5nIGJvb2xlYW4gdmFsdWUuCisgICAgICovCisgICAgCisgICAgcHVibGljIFN0cmluZyBnZXRVc2VOYW1pbmcoKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy51c2VOYW1pbmc7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHVzZU5hbWluZyB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVc2VOYW1pbmcoU3RyaW5nIHVzZU5hbWluZykgeworICAgICAgICAKKyAgICAgICAgdGhpcy51c2VOYW1pbmcgPSB1c2VOYW1pbmc7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIFdvcmtpbmcgRGlyZWN0b3J5LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0V29ya0RpcigpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLndvcmtEaXI7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHdvcmtpbmcgZGlyZWN0b3J5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFdvcmtEaXIoU3RyaW5nIHdvcmtEaXIpIHsKKyAgICAgICAgCisgICAgICAgIHRoaXMud29ya0RpciA9IHdvcmtEaXI7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGxvYWRlciBjaGVjayBpbnRlcnZhbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldExkckNoZWNrSW50ZXJ2YWwoKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy5sZHJDaGVja0ludGVydmFsOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBsb2FkZXIgQ2hlY2sgSW50ZXJ2YWwuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TGRyQ2hlY2tJbnRlcnZhbChTdHJpbmcgbGRyQ2hlY2tJbnRlcnZhbCkgeworICAgICAgICAKKyAgICAgICAgdGhpcy5sZHJDaGVja0ludGVydmFsID0gbGRyQ2hlY2tJbnRlcnZhbDsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbG9hZGVyIHJlbG9hZGFibGUgYm9vbGVhbiB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldExkclJlbG9hZGFibGUoKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy5sZHJSZWxvYWRhYmxlOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBsb2FkZXIgcmVsb2FkYWJsZSB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMZHJSZWxvYWRhYmxlKFN0cmluZyBsZHJSZWxvYWRhYmxlKSB7CisgICAgICAgIAorICAgICAgICB0aGlzLmxkclJlbG9hZGFibGUgPSBsZHJSZWxvYWRhYmxlOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXNzaW9uIG1hbmFnZXIgY2hlY2sgaW50ZXJ2YWwuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRNZ3JDaGVja0ludGVydmFsKCkgeworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXMubWdyQ2hlY2tJbnRlcnZhbDsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgc2Vzc2lvbiBtYW5hZ2VyIENoZWNrIEludGVydmFsLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1nckNoZWNrSW50ZXJ2YWwoU3RyaW5nIG1nckNoZWNrSW50ZXJ2YWwpIHsKKyAgICAgICAgCisgICAgICAgIHRoaXMubWdyQ2hlY2tJbnRlcnZhbCA9IG1nckNoZWNrSW50ZXJ2YWw7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNlc3Npb24gSUQgaW5pdGlhbGl6ZXIuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRNZ3JTZXNzaW9uSURJbml0KCkgeworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXMubWdyU2Vzc2lvbklESW5pdDsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgbWdyIFNlc3Npb24gSUQgSW5pdGl6aWFsaXplci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNZ3JTZXNzaW9uSURJbml0KFN0cmluZyBtZ3JTZXNzaW9uSURJbml0KSB7CisgICAgICAgIAorICAgICAgICB0aGlzLm1nclNlc3Npb25JREluaXQgPSBtZ3JTZXNzaW9uSURJbml0OworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBTZXNzaW9uIG1nciBtYXhpbXVtIGFjdGl2ZSBzZXNzaW9ucy4KKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgU3RyaW5nIGdldE1nck1heFNlc3Npb25zKCkgeworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXMubWdyTWF4U2Vzc2lvbnM7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIFNlc3Npb24gbWdyIG1heGltdW0gYWN0aXZlIHNlc3Npb25zLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1nck1heFNlc3Npb25zKFN0cmluZyBtZ3JNYXhTZXNzaW9ucykgeworICAgICAgICAKKyAgICAgICAgdGhpcy5tZ3JNYXhTZXNzaW9ucyA9IG1nck1heFNlc3Npb25zOworICAgICAgICAKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGFudGkgcmVzb3VjZSBsb2NraW5nIGZsYWcKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEFudGlSZXNvdXJjZUxvY2tpbmcoKSB7CisgICAgICAgIHJldHVybiBhbnRpUmVzb3VyY2VMb2NraW5nOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYW50aSByZXNvdXJjZSBsb2NraW5nIGZsYWcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBbnRpUmVzb3VyY2VMb2NraW5nKFN0cmluZyBhcmwpIHsKKwlhbnRpUmVzb3VyY2VMb2NraW5nID0gYXJsOworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBhbnRpIGphciBsb2NraW5nIGZsYWcKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEFudGlKYXJMb2NraW5nKCkgeworICAgICAgICByZXR1cm4gYW50aUphckxvY2tpbmc7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBhbnRpIGphciBsb2NraW5nIGZsYWcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBbnRpSmFyTG9ja2luZyhTdHJpbmcgYWpsKSB7CisgICAgICAgIGFudGlKYXJMb2NraW5nID0gYWpsOworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworICAgIAorICAgIC8qKgorICAgICAqIFJlc2V0IGFsbCBwcm9wZXJ0aWVzIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIG1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZXNldChBY3Rpb25NYXBwaW5nIG1hcHBpbmcsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgIAorICAgICAgICB0aGlzLm9iamVjdE5hbWUgPSBudWxsOworICAgICAgICB0aGlzLnBhcmVudE9iamVjdE5hbWUgPSBudWxsOworICAgICAgICB0aGlzLmxvYWRlck9iamVjdE5hbWUgPSBudWxsOworICAgICAgICB0aGlzLm1hbmFnZXJPYmplY3ROYW1lID0gbnVsbDsKKyAgICAgICAgCisgICAgICAgIC8vIGNvbnRleHQgcHJvcGVydGllcworICAgICAgICB0aGlzLmNvb2tpZXMgPSAiZmFsc2UiOworICAgICAgICB0aGlzLmNyb3NzQ29udGV4dCA9ICJmYWxzZSI7CisgICAgICAgIHRoaXMuZG9jQmFzZSA9IG51bGw7CisgICAgICAgIHRoaXMub3ZlcnJpZGU9ICJmYWxzZSI7CisgICAgICAgIHRoaXMucGF0aCA9IG51bGw7CisgICAgICAgIHRoaXMucmVsb2FkYWJsZSA9ICJmYWxzZSI7CisgICAgICAgIHRoaXMuc3dhbGxvd091dHB1dCA9ICJmYWxzZSI7CisgICAgICAgIHRoaXMuYW50aVJlc291cmNlTG9ja2luZyA9ICJmYWxzZSI7CisgICAgICAgIHRoaXMuYW50aUphckxvY2tpbmcgPSAiZmFsc2UiOworCisgICAgICAgIC8vIGxvYWRlciBwcm9wZXJ0aWVzCisgICAgICAgIHRoaXMubGRyQ2hlY2tJbnRlcnZhbCA9ICIxNSI7CisgICAgICAgIHRoaXMubGRyUmVsb2FkYWJsZSA9ICJ0cnVlIjsKKyAgICAgICAgCisgICAgICAgIC8vIHNlc3Npb24gbWFuYWdlciBwcm9wZXJ0aWVzCisgICAgICAgIHRoaXMubWdyQ2hlY2tJbnRlcnZhbCA9ICI2MCI7CisgICAgICAgIHRoaXMubWdyU2Vzc2lvbklESW5pdCA9ICIwIjsKKyAgICAgICAgdGhpcy5tZ3JNYXhTZXNzaW9ucyA9ICItMSI7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJlbmRlciB0aGlzIG9iamVjdCBhcyBhIFN0cmluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIkNvbnRleHRGb3JtW2FkbWluQWN0aW9uPSIpOworICAgICAgICBzYi5hcHBlbmQoYWRtaW5BY3Rpb24pOworICAgICAgICBzYi5hcHBlbmQoIixkb2NCYXNlPSIpOworICAgICAgICBzYi5hcHBlbmQoZG9jQmFzZSk7CisgICAgICAgIHNiLmFwcGVuZCgiLHBhdGg9Iik7CisgICAgICAgIHNiLmFwcGVuZChwYXRoKTsKKyAgICAgICAgc2IuYXBwZW5kKCIsY29va2llcz0iKTsKKyAgICAgICAgc2IuYXBwZW5kKGNvb2tpZXMpOworICAgICAgICBzYi5hcHBlbmQoIixjcm9zc0NvbnRleHQ9Iik7CisgICAgICAgIHNiLmFwcGVuZChjcm9zc0NvbnRleHQpOworICAgICAgICBzYi5hcHBlbmQoIixvdmVycmlkZT0iKTsKKyAgICAgICAgc2IuYXBwZW5kKG92ZXJyaWRlKTsKKyAgICAgICAgc2IuYXBwZW5kKCIscmVsb2FkYWJsZT0iKTsKKyAgICAgICAgc2IuYXBwZW5kKHJlbG9hZGFibGUpOworICAgICAgICBzYi5hcHBlbmQoIixzd2FsbG93T3V0cHV0PSIpOworICAgICAgICBzYi5hcHBlbmQoc3dhbGxvd091dHB1dCk7CisKKyAgICAgICAgLy8gbG9hZGVyIHByb3BlcnRpZXMKKyAgICAgICAgc2IuYXBwZW5kKCIsbGRyQ2hlY2tJbnRlcnZhbD0iKTsKKyAgICAgICAgc2IuYXBwZW5kKGxkckNoZWNrSW50ZXJ2YWwpOyAgICAgICAgCisgICAgICAgIHNiLmFwcGVuZCgiLGxkclJlbG9hZGFibGU9Iik7CisgICAgICAgIHNiLmFwcGVuZChsZHJSZWxvYWRhYmxlKTsKKyAgICAgICAgLy8gbWFuYWdlciBwcm9wZXJ0aWVzCisgICAgICAgIHNiLmFwcGVuZCgiLG1nckNoZWNrSW50ZXJ2YWw9Iik7CisgICAgICAgIHNiLmFwcGVuZChtZ3JDaGVja0ludGVydmFsKTsKKyAgICAgICAgc2IuYXBwZW5kKCIsbWdyU2Vzc2lvbklESW5pdD0iKTsKKyAgICAgICAgc2IuYXBwZW5kKG1nclNlc3Npb25JREluaXQpOworICAgICAgICBzYi5hcHBlbmQoIixtZ3JNYXhTZXNzaW9ucz0iKTsKKyAgICAgICAgc2IuYXBwZW5kKG1nck1heFNlc3Npb25zKTsKKyAgICAgICAgLy8gb2JqZWN0IG5hbWVzCisgICAgICAgIHNiLmFwcGVuZCgiJyxvYmplY3ROYW1lPSciKTsKKyAgICAgICAgc2IuYXBwZW5kKG9iamVjdE5hbWUpOworICAgICAgICBzYi5hcHBlbmQoIicscGFyZW50T2JqZWN0TmFtZT0iKTsKKyAgICAgICAgc2IuYXBwZW5kKHBhcmVudE9iamVjdE5hbWUpOworICAgICAgICBzYi5hcHBlbmQoIicsbG9hZGVyT2JqZWN0TmFtZT0iKTsKKyAgICAgICAgc2IuYXBwZW5kKGxvYWRlck9iamVjdE5hbWUpOworICAgICAgICBzYi5hcHBlbmQoIicsbWFuYWdlck9iamVjdE5hbWU9Iik7CisgICAgICAgIHNiLmFwcGVuZChtYW5hZ2VyT2JqZWN0TmFtZSk7CisgICAgICAgIHNiLmFwcGVuZCgiXSIpOworICAgICAgICByZXR1cm4gKHNiLnRvU3RyaW5nKCkpOworCisgICAgfQorICAgIC8qKgorICAgICAqIFZhbGlkYXRlIHRoZSBwcm9wZXJ0aWVzIHRoYXQgaGF2ZSBiZWVuIHNldCBmcm9tIHRoaXMgSFRUUCByZXF1ZXN0LAorICAgICAqIGFuZCByZXR1cm4gYW4gPGNvZGU+QWN0aW9uRXJyb3JzPC9jb2RlPiBvYmplY3QgdGhhdCBlbmNhcHN1bGF0ZXMgYW55CisgICAgICogdmFsaWRhdGlvbiBlcnJvcnMgdGhhdCBoYXZlIGJlZW4gZm91bmQuICBJZiBubyBlcnJvcnMgYXJlIGZvdW5kLCByZXR1cm4KKyAgICAgKiA8Y29kZT5udWxsPC9jb2RlPiBvciBhbiA8Y29kZT5BY3Rpb25FcnJvcnM8L2NvZGU+IG9iamVjdCB3aXRoIG5vCisgICAgICogcmVjb3JkZWQgZXJyb3IgbWVzc2FnZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgbWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqLworICAgIAorICAgIHByaXZhdGUgQWN0aW9uRXJyb3JzIGVycm9yczsKKyAgICAKKyAgICBwdWJsaWMgQWN0aW9uRXJyb3JzIHZhbGlkYXRlKEFjdGlvbk1hcHBpbmcgbWFwcGluZywKKyAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICAKKyAgICAgICAgZXJyb3JzID0gbmV3IEFjdGlvbkVycm9ycygpOworICAgICAgICAKKyAgICAgICAgU3RyaW5nIHN1Ym1pdCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJzdWJtaXQiKTsKKyAgICAgICAgCisgICAgICAgIC8vIGZyb250IGVuZCB2YWxpZGF0aW9uIHdoZW4gc2F2ZSBpcyBjbGlja2VkLgorICAgICAgICAvL2lmIChzdWJtaXQgIT0gbnVsbCkgeworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBkb2NCYXNlIGNhbm5vdCBiZSBudWxsCisgICAgICAgICAgICBpZiAoKGRvY0Jhc2UgPT0gbnVsbCkgfHwgKGRvY0Jhc2UubGVuZ3RoKCkgPCAxKSkgeworICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoImRvY0Jhc2UiLCBuZXcgQWN0aW9uRXJyb3IoImVycm9yLmRvY0Jhc2UucmVxdWlyZWQiKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIGlmIHBhdGggaXMgZW1wdHksIGl0J3Mgcm9vdCBjb250ZXh0CisgICAgICAgICAgICAvLyB2YWxpZGF0ZSBjb250ZXh0IHN0YXJ0aW5nIHdpdGggIi8iIG9ubHkgYXQgdGhlIHRpbWUgb2YgY29udGV4dCBjcmVhdGlvbi4KKyAgICAgICAgICAgIGlmICgiQ3JlYXRlIi5lcXVhbHNJZ25vcmVDYXNlKGFkbWluQWN0aW9uKSAmJiAhcGF0aC5zdGFydHNXaXRoKCIvIikpIHsKKyAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKCJwYXRoIiwgbmV3IEFjdGlvbkVycm9yKCJlcnJvci5wYXRoLnByZWZpeCIpKTsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vaWYgKCh3b3JrRGlyID09IG51bGwpIHx8ICh3b3JrRGlyLmxlbmd0aCgpIDwgMSkpIHsKKyAgICAgICAgICAgIC8vICAgIGVycm9ycy5hZGQoIndvcmtEaXIiLCBuZXcgQWN0aW9uRXJyb3IoImVycm9yLndvcmtEaXIucmVxdWlyZWQiKSk7CisgICAgICAgICAgICAvL30KKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gbG9hZGVyIHByb3BlcnRpZXMKKyAgICAgICAgICAgIC8vIEZJWE1FLS0gdmVyaWZ5IGlmIHRoZXNlIHJhbmdlcyBhcmUgb2suCisgICAgICAgICAgICBudW1iZXJDaGVjaygibGRyQ2hlY2tJbnRlcnZhbCIsIGxkckNoZWNrSW50ZXJ2YWwgICwgdHJ1ZSwgMCwgMTAwMDApOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBzZXNzaW9uIG1hbmFnZXIgcHJvcGVydGllcyAgICAgICAgICAgIAorICAgICAgICAgICAgbnVtYmVyQ2hlY2soIm1nckNoZWNrSW50ZXJ2YWwiLCAgbWdyQ2hlY2tJbnRlcnZhbCwgdHJ1ZSwgMCwgMTAwMDApOworICAgICAgICAgICAgbnVtYmVyQ2hlY2soIm1nck1heFNlc3Npb25zIiwgIG1nck1heFNlc3Npb25zLCBmYWxzZSwgLTEsIDEwMCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vaWYgKChtZ3JTZXNzaW9uSURJbml0ID09IG51bGwpIHx8IChtZ3JTZXNzaW9uSURJbml0Lmxlbmd0aCgpIDwgMSkpIHsKKyAgICAgICAgICAgIC8vICAgIGVycm9ycy5hZGQoIm1nclNlc3Npb25JREluaXQiLCBuZXcgQWN0aW9uRXJyb3IoImVycm9yLm1nclNlc3Npb25JREluaXQucmVxdWlyZWQiKSk7CisgICAgICAgICAgICAvL30KKyAgICAgICAgLy99CisgICAgICAgIAorICAgICAgICByZXR1cm4gZXJyb3JzOworICAgIH0KKyAgICAKKyAgICAvKgorICAgICAqIEhlbHBlciBtZXRob2QgdG8gY2hlY2sgdGhhdCBpdCBpcyBhIHJlcXVpcmVkIG51bWJlciBhbmQKKyAgICAgKiBpcyBhIHZhbGlkIGludGVnZXIgd2l0aGluIHRoZSBnaXZlbiByYW5nZS4gKG1pbiwgbWF4KS4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgZmllbGQgIFRoZSBmaWVsZCBuYW1lIGluIHRoZSBmb3JtIGZvciB3aGljaCB0aGlzIGVycm9yIG9jY3VyZWQuCisgICAgICogQHBhcmFtICBudW1UZXh0ICBUaGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBudW1iZXIuCisgICAgICogQHBhcmFtIHJhbmdlQ2hlY2sgIEJvb2xlYW4gdmFsdWUgc2V0IHRvIHRydWUgb2YgcmVhbmdlIGNoZWNrIHNob3VsZCBiZSBwZXJmb3JtZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gIG1pbiAgVGhlIGxvd2VyIGxpbWl0IG9mIHRoZSByYW5nZQorICAgICAqIEBwYXJhbSAgbWF4ICBUaGUgdXBwZXIgbGltaXQgb2YgdGhlIHJhbmdlCisgICAgICoKKyAgICAgKi8KKyAgICAKKyAgICBwcml2YXRlIHZvaWQgbnVtYmVyQ2hlY2soU3RyaW5nIGZpZWxkLCBTdHJpbmcgbnVtVGV4dCwgYm9vbGVhbiByYW5nZUNoZWNrLAorICAgIGludCBtaW4sIGludCBtYXgpIHsKKyAgICAgICAgCisgICAgICAgIC8vIENoZWNrIGZvciAnaXMgcmVxdWlyZWQnCisgICAgICAgIGlmICgobnVtVGV4dCA9PSBudWxsKSB8fCAobnVtVGV4dC5sZW5ndGgoKSA8IDEpKSB7CisgICAgICAgICAgICBlcnJvcnMuYWRkKGZpZWxkLCBuZXcgQWN0aW9uRXJyb3IoImVycm9yLiIrZmllbGQrIi5yZXF1aXJlZCIpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gY2hlY2sgZm9yICdtdXN0IGJlIGEgbnVtYmVyJyBpbiB0aGUgJ3ZhbGlkIHJhbmdlJworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpbnQgbnVtID0gSW50ZWdlci5wYXJzZUludChudW1UZXh0KTsKKyAgICAgICAgICAgICAgICAvLyBwZXJmb3JtIHJhbmdlIGNoZWNrIG9ubHkgaWYgcmVxdWlyZWQKKyAgICAgICAgICAgICAgICBpZiAocmFuZ2VDaGVjaykgeworICAgICAgICAgICAgICAgICAgICBpZiAoKG51bSA8IG1pbikgfHwgKG51bSA+IG1heCApKQorICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLmFkZCggZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQWN0aW9uRXJyb3IoImVycm9yLiIrIGZpZWxkICsiLnJhbmdlIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZXJyb3JzLmFkZChmaWVsZCwKKyAgICAgICAgICAgICAgICBuZXcgQWN0aW9uRXJyb3IoImVycm9yLiIrIGZpZWxkICsgIi5mb3JtYXQiKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vY29udGV4dC9Db250ZXh0c0Zvcm0uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9jb250ZXh0L0NvbnRleHRzRm9ybS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjY2YyZmEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vY29udGV4dC9Db250ZXh0c0Zvcm0uamF2YQpAQCAtMCwwICsxLDY4IEBACisvKgorICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uY29udGV4dDsKKworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9ybTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKKworCisvKioKKyAqIEZvcm0gYmVhbiBmb3IgZGVsZXRpbmcgY29udGV4dHMuCisgKgorICogQGF1dGhvciBNYW52ZWVuIEthdXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIENvbnRleHRzRm9ybSBleHRlbmRzIEFjdGlvbkZvcm0geworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogVGhlIG9iamVjdCBuYW1lcyBvZiB0aGUgY29udGV4dHMgdG8gYmUgZGVsZXRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBjb250ZXh0c1tdID0gbmV3IFN0cmluZ1swXTsKKworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRDb250ZXh0cygpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLmNvbnRleHRzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDb250ZXh0cyhTdHJpbmcgY29udGV4dHNbXSkgeworICAgICAgICB0aGlzLmNvbnRleHRzID0gY29udGV4dHM7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmVzZXQgYWxsIHByb3BlcnRpZXMgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgbWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlc2V0KEFjdGlvbk1hcHBpbmcgbWFwcGluZywgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKworICAgICAgICB0aGlzLmNvbnRleHRzID0gbmV3IFN0cmluZ1swXTsKKworICAgIH0KKyAgICAgICAgCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9jb250ZXh0L0RlbGV0ZUNvbnRleHRBY3Rpb24uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9jb250ZXh0L0RlbGV0ZUNvbnRleHRBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjk5NDlhCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL2NvbnRleHQvRGVsZXRlQ29udGV4dEFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTcyIEBACisvKgorICogQ29weXJpZ2h0IDIwMDEtMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLmNvbnRleHQ7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkVycm9yczsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9ybTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9yd2FyZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKKworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlckZhY3Rvcnk7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5RdWVyeUV4cDsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LlF1ZXJ5OworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0SW5zdGFuY2U7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuSk1FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMudXRpbC5NZXNzYWdlUmVzb3VyY2VzOworCitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uQXBwbGljYXRpb25TZXJ2bGV0OworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLlRvbWNhdFRyZWVCdWlsZGVyOworCisvKioKKyAqIFRoZSA8Y29kZT5BY3Rpb248L2NvZGU+IHRoYXQgc2V0cyB1cCA8ZW0+RGVsZXRlIENvbnRleHRzPC9lbT4gdHJhbnNhY3Rpb25zLgorICoKKyAqIEBhdXRob3IgTWFudmVlbiBLYXVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBEZWxldGVDb250ZXh0QWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKKyAgICAKKworICAgIC8qKgorICAgICAqIFRoZSBNQmVhblNlcnZlciB3ZSB3aWxsIGJlIGludGVyYWN0aW5nIHdpdGguCisgICAgICovCisgICAgcHJpdmF0ZSBNQmVhblNlcnZlciBtQlNlcnZlciA9IG51bGw7CisgICAgCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKyAgICAKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBzcGVjaWZpZWQgSFRUUCByZXF1ZXN0LCBhbmQgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIEhUVFAKKyAgICAgKiByZXNwb25zZSAob3IgZm9yd2FyZCB0byBhbm90aGVyIHdlYiBjb21wb25lbnQgdGhhdCB3aWxsIGNyZWF0ZSBpdCkuCisgICAgICogUmV0dXJuIGFuIDxjb2RlPkFjdGlvbkZvcndhcmQ8L2NvZGU+IGluc3RhbmNlIGRlc2NyaWJpbmcgd2hlcmUgYW5kIGhvdworICAgICAqIGNvbnRyb2wgc2hvdWxkIGJlIGZvcndhcmRlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHJlc3BvbnNlIGhhcworICAgICAqIGFscmVhZHkgYmVlbiBjb21wbGV0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgQWN0aW9uTWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIGFjdGlvbkZvcm0gVGhlIG9wdGlvbmFsIEFjdGlvbkZvcm0gYmVhbiBmb3IgdGhpcyByZXF1ZXN0IChpZiBhbnkpCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIEhUVFAgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgSFRUUCByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXhjZXB0aW9uIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBBY3Rpb25Gb3J3YXJkIHBlcmZvcm0oQWN0aW9uTWFwcGluZyBtYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uRm9ybSBmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworICAgICAgICAKKworICAgICAgICAvLyBBY3F1aXJlIHRoZSByZXNvdXJjZXMgdGhhdCB3ZSBuZWVkCisgICAgICAgIEh0dHBTZXNzaW9uIHNlc3Npb24gPSByZXF1ZXN0LmdldFNlc3Npb24oKTsKKyAgICAgICAgTG9jYWxlIGxvY2FsZSA9IGdldExvY2FsZShyZXF1ZXN0KTsKKyAgICAgICAgTWVzc2FnZVJlc291cmNlcyByZXNvdXJjZXMgPSBnZXRSZXNvdXJjZXMocmVxdWVzdCk7CisgICAgICAgIAorICAgICAgICAvLyBBY3F1aXJlIGEgcmVmZXJlbmNlIHRvIHRoZSBNQmVhblNlcnZlciBjb250YWluaW5nIG91ciBNQmVhbnMKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1CU2VydmVyID0gKChBcHBsaWNhdGlvblNlcnZsZXQpIGdldFNlcnZsZXQoKSkuZ2V0U2VydmVyKCk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbgorICAgICAgICAgICAgKCJDYW5ub3QgYWNxdWlyZSBNQmVhblNlcnZlciByZWZlcmVuY2UiLCB0KTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gb2JqZWN0IG5hbWUgdGhhdCBmb3JtcyB0aGUgYmFzaXMgb2YgdGhlIHNlYXJjaCBwYXR0ZXJuCisgICAgICAgIC8vIHRvIGdldCBsaXN0IG9mIGFsbCBhdmFpbGFibGUgY29udGV4dHMKKyAgICAgICAgU3RyaW5nIHBhdHRlcm5PYmplY3QgPSBudWxsOworICAgICAgICAKKyAgICAgICAgLy8gU2V0IHVwIGEgZm9ybSBiZWFuIGNvbnRhaW5pbmcgdGhlIGN1cnJlbnRseSBzZWxlY3RlZAorICAgICAgICAvLyBvYmplY3RzIHRvIGJlIGRlbGV0ZWQKKyAgICAgICAgQ29udGV4dHNGb3JtIGNvbnRleHRzRm9ybSA9IG5ldyBDb250ZXh0c0Zvcm0oKTsKKyAgICAgICAgU3RyaW5nIHNlbGVjdCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJzZWxlY3QiKTsKKyAgICAgICAgaWYgKHNlbGVjdCAhPSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgY29udGV4dHNbXSA9IG5ldyBTdHJpbmdbMV07CisgICAgICAgICAgICBjb250ZXh0c1swXSA9IHNlbGVjdDsKKyAgICAgICAgICAgIGNvbnRleHRzRm9ybS5zZXRDb250ZXh0cyhjb250ZXh0cyk7CisgICAgICAgICAgICBwYXR0ZXJuT2JqZWN0ID0gc2VsZWN0OworICAgICAgICB9ICAgICAgICAKKyAgICAgICAgcmVxdWVzdC5zZXRBdHRyaWJ1dGUoImNvbnRleHRzRm9ybSIsIGNvbnRleHRzRm9ybSk7CisgICAgICAgICAgICAgICAgCisgICAgICAgIC8vIGdldCB0aGUgcGFyZW50IGhvc3Qgb2JqZWN0IG5hbWUKKyAgICAgICAgU3RyaW5nIHBhcmVudCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJwYXJlbnQiKTsKKyAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsKSB7ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgcGF0dGVybk9iamVjdCA9IHBhcmVudDsKKyAgICAgICAgfSAKKyAgICAgICAgCisgICAgICAgIC8vIEFjY3VtdWxhdGUgYSBsaXN0IG9mIGFsbCBhdmFpbGFibGUgY29udGV4dHMKKyAgICAgICAgQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBPYmplY3ROYW1lIHBvbmFtZSA9IG5ldyBPYmplY3ROYW1lKHBhdHRlcm5PYmplY3QpOworICAgICAgICAgICAgU3RyaW5nIGRvbWFpbiA9IHBvbmFtZS5nZXREb21haW4oKTsKKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoZG9tYWluKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiOmoyZWVUeXBlPVdlYk1vZHVsZSwqIik7CisgICAgICAgICAgICBPYmplY3ROYW1lIHNlYXJjaCA9IG5ldyBPYmplY3ROYW1lKHNiLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgLy8gZ2V0IGFsbCBhdmFpbGFibGUgY29udGV4dHMgb25seSBmb3IgdGhpcyBob3N0CisgICAgICAgICAgICBJdGVyYXRvciBpdGVtcyA9CisgICAgICAgICAgICAgICAgbUJTZXJ2ZXIucXVlcnlOYW1lcyhzZWFyY2gsIG51bGwpLml0ZXJhdG9yKCk7CisgICAgICAgICAgICBTdHJpbmcgaXRlbSA9IG51bGw7CisgICAgICAgICAgICBTdHJpbmcgaG9zdCA9IHBvbmFtZS5nZXRLZXlQcm9wZXJ0eSgiaG9zdCIpOworICAgICAgICAgICAgaWYgKGhvc3Q9PW51bGwpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHBvbmFtZS5nZXRLZXlQcm9wZXJ0eSgibmFtZSIpOworICAgICAgICAgICAgICAgIGlmICgobmFtZSAhPSBudWxsKSAmJiAobmFtZS5sZW5ndGgoKSA+IDApKSB7CisgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZygyKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGkgPSBuYW1lLmluZGV4T2YoIi8iKTsKKyAgICAgICAgICAgICAgICAgICAgaG9zdCA9IG5hbWUuc3Vic3RyaW5nKDAsaSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nIGhvc3RQcmVmaXggPSAiLy8iK2hvc3Q7CisgICAgICAgICAgICBTdHJpbmcgaG9zdEF0dHIgPSBudWxsOworICAgICAgICAgICAgd2hpbGUgKGl0ZW1zLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIGl0ZW0gPSBpdGVtcy5uZXh0KCkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0gbmV3IE9iamVjdE5hbWUoaXRlbSk7CisgICAgICAgICAgICAgICAgaG9zdEF0dHIgPSBvbmFtZS5nZXRLZXlQcm9wZXJ0eSgibmFtZSIpOworICAgICAgICAgICAgICAgIGlmIChob3N0QXR0ci5zdGFydHNXaXRoKGhvc3RQcmVmaXgpKSB7CisgICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKGl0ZW0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3Iuc2VsZWN0IikpOworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5zZWxlY3QiKSk7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICB9CisgICAgICAgIENvbGxlY3Rpb25zLnNvcnQobGlzdCk7CisgICAgICAgIHJlcXVlc3Quc2V0QXR0cmlidXRlKCJjb250ZXh0c0xpc3QiLCBsaXN0KTsKKyAgICAgICAgCisgICAgICAgIC8vIEZvcndhcmQgdG8gdGhlIGxpc3QgZGlzcGxheSBwYWdlCisgICAgICAgIHJldHVybiAobWFwcGluZy5maW5kRm9yd2FyZCgiQ29udGV4dHMiKSk7CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9jb250ZXh0L0RlbGV0ZUNvbnRleHRzQWN0aW9uLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vY29udGV4dC9EZWxldGVDb250ZXh0c0FjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyMmIwZDQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vY29udGV4dC9EZWxldGVDb250ZXh0c0FjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTU4IEBACisvKgorICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5jb250ZXh0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3RJbnN0YW5jZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lm1vZGVsbWJlYW4uTW9kZWxNQmVhbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9ybTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9yd2FyZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy51dGlsLk1lc3NhZ2VSZXNvdXJjZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5BcHBsaWNhdGlvblNlcnZsZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uVG9tY2F0VHJlZUJ1aWxkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uVHJlZUNvbnRyb2w7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uVHJlZUNvbnRyb2xOb2RlOworCisKKy8qKgorICogVGhlIDxjb2RlPkFjdGlvbjwvY29kZT4gdGhhdCBjb21wbGV0ZXMgPGVtPkRlbGV0ZSBDb250ZXh0czwvZW0+CisgKiB0cmFuc2FjdGlvbnMuCisgKgorICogQGF1dGhvciBNYW52ZWVuIEthdXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIERlbGV0ZUNvbnRleHRzQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKKworCisgICAgLyoqCisgICAgICogU2lnbmF0dXJlIGZvciB0aGUgPGNvZGU+cmVtb3ZlQ29udGV4dDwvY29kZT4gb3BlcmF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHJlbW92ZUNvbnRleHRUeXBlc1tdID0KKyAgICB7ICJqYXZhLmxhbmcuU3RyaW5nIiwgICAgICAvLyBPYmplY3QgbmFtZQorICAgIH07CisKKworICAgIC8qKgorICAgICAqIFRoZSBNQmVhblNlcnZlciB3ZSB3aWxsIGJlIGludGVyYWN0aW5nIHdpdGguCisgICAgICovCisgICAgcHJpdmF0ZSBNQmVhblNlcnZlciBtQlNlcnZlciA9IG51bGw7CisgICAgCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBzcGVjaWZpZWQgSFRUUCByZXF1ZXN0LCBhbmQgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIEhUVFAKKyAgICAgKiByZXNwb25zZSAob3IgZm9yd2FyZCB0byBhbm90aGVyIHdlYiBjb21wb25lbnQgdGhhdCB3aWxsIGNyZWF0ZSBpdCkuCisgICAgICogUmV0dXJuIGFuIDxjb2RlPkFjdGlvbkZvcndhcmQ8L2NvZGU+IGluc3RhbmNlIGRlc2NyaWJpbmcgd2hlcmUgYW5kIGhvdworICAgICAqIGNvbnRyb2wgc2hvdWxkIGJlIGZvcndhcmRlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHJlc3BvbnNlIGhhcworICAgICAqIGFscmVhZHkgYmVlbiBjb21wbGV0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgQWN0aW9uTWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIGFjdGlvbkZvcm0gVGhlIG9wdGlvbmFsIEFjdGlvbkZvcm0gYmVhbiBmb3IgdGhpcyByZXF1ZXN0IChpZiBhbnkpCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIEhUVFAgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgSFRUUCByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXhjZXB0aW9uIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBBY3Rpb25Gb3J3YXJkIHBlcmZvcm0oQWN0aW9uTWFwcGluZyBtYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uRm9ybSBmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworICAgICAgICAKKyAgICAgICAgCisgICAgICAgIC8vIExvb2sgdXAgdGhlIGNvbXBvbmVudHMgd2Ugd2lsbCBiZSB1c2luZyBhcyBuZWVkZWQKKyAgICAgICAgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpOworICAgICAgICBMb2NhbGUgbG9jYWxlID0gZ2V0TG9jYWxlKHJlcXVlc3QpOworICAgICAgICBNZXNzYWdlUmVzb3VyY2VzIHJlc291cmNlcyA9IGdldFJlc291cmNlcyhyZXF1ZXN0KTsKKworICAgICAgICAvLyBBY3F1aXJlIGEgcmVmZXJlbmNlIHRvIHRoZSBNQmVhblNlcnZlciBjb250YWluaW5nIG91ciBNQmVhbnMKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1CU2VydmVyID0gKChBcHBsaWNhdGlvblNlcnZsZXQpIGdldFNlcnZsZXQoKSkuZ2V0U2VydmVyKCk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbgorICAgICAgICAgICAgKCJDYW5ub3QgYWNxdWlyZSBNQmVhblNlcnZlciByZWZlcmVuY2UiLCB0KTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gRGVsZXRlIHRoZSBzcGVjaWZpZWQgQ29udGV4dHMKKyAgICAgICAgU3RyaW5nIGNvbnRleHRzW10gID0gKChDb250ZXh0c0Zvcm0pIGZvcm0pLmdldENvbnRleHRzKCk7CisgICAgICAgIFN0cmluZyB2YWx1ZXNbXSA9IG5ldyBTdHJpbmdbMV07CisgICAgICAgIFN0cmluZyBvcGVyYXRpb24gPSAicmVtb3ZlQ29udGV4dCI7CisKKyAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgLy8gTG9vayB1cCBvdXIgdHJlZSBjb250cm9sIGRhdGEgc3RydWN0dXJlCisgICAgICAgICAgICBUcmVlQ29udHJvbCBjb250cm9sID0gKFRyZWVDb250cm9sKQorICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0QXR0cmlidXRlKCJ0cmVlQ29udHJvbFRlc3QiKTsKKworICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBzcGVjaWZpZWQgY29udGV4dHMKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29udGV4dHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICB2YWx1ZXNbMF0gPSBjb250ZXh0c1tpXTsKKyAgICAgICAgICAgICAgICBpZiAoY29udHJvbCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wuc2VsZWN0Tm9kZShudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgVHJlZUNvbnRyb2xOb2RlIG5vZGUgPSBjb250cm9sLmZpbmROb2RlKGNvbnRleHRzW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRvbWFpbiA9IG5vZGUuZ2V0RG9tYWluKCk7CisgICAgICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgZm5hbWUgPSBUb21jYXRUcmVlQnVpbGRlci5nZXRNQmVhbkZhY3RvcnkoKTsKKyAgICAgICAgICAgICAgICAgICAgbUJTZXJ2ZXIuaW52b2tlKGZuYW1lLCBvcGVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcywgcmVtb3ZlQ29udGV4dFR5cGVzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5yZW1vdmUoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2coIk1pc3NpbmcgVHJlZUNvbnRyb2xOb2RlIGZvciAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dHNbaV0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZygiTWlzc2luZyBUcmVlQ29udHJvbCBhdHRyaWJ1dGUiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuaW52b2tlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uKSwgZSk7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsCisgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmludm9rZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbikpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKworICAgICAgICB9CisKKyAgICAgICAgLy8gUmVwb3J0IHN1Y2Nlc3NmdWwgY29tcGxldGlvbiBvZiB0aGlzIHRyYW5zYWN0aW9uCisgICAgICAgIHJldHVybiAobWFwcGluZy5maW5kRm9yd2FyZCgiU2F2ZSBTdWNjZXNzZnVsIikpOworCisgICAgfQorICAgIAorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL2NvbnRleHQvRWRpdENvbnRleHRBY3Rpb24uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9jb250ZXh0L0VkaXRDb250ZXh0QWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVmNWU1ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9jb250ZXh0L0VkaXRDb250ZXh0QWN0aW9uLmphdmEKQEAgLTAsMCArMSwyNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMS0yMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLmNvbnRleHQ7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkVycm9yczsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9ybTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9yd2FyZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy51dGlsLk1lc3NhZ2VSZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0SW5zdGFuY2U7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuSk1FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5BcHBsaWNhdGlvblNlcnZsZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uTGFiZWxWYWx1ZUJlYW47CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uTGlzdHM7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uVG9tY2F0VHJlZUJ1aWxkZXI7CisKKy8qKgorICogVGhlIDxjb2RlPkFjdGlvbjwvY29kZT4gdGhhdCBzZXRzIHVwIDxlbT5FZGl0IENvbnRleHQ8L2VtPiB0cmFuc2FjdGlvbnMuCisgKgorICogQGF1dGhvciBNYW52ZWVuIEthdXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEVkaXRDb250ZXh0QWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKKyAgICAKKworICAgIC8qKgorICAgICAqIFRoZSBNQmVhblNlcnZlciB3ZSB3aWxsIGJlIGludGVyYWN0aW5nIHdpdGguCisgICAgICovCisgICAgcHJpdmF0ZSBNQmVhblNlcnZlciBtQlNlcnZlciA9IG51bGw7CisgICAgCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKyAgICAKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBzcGVjaWZpZWQgSFRUUCByZXF1ZXN0LCBhbmQgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIEhUVFAKKyAgICAgKiByZXNwb25zZSAob3IgZm9yd2FyZCB0byBhbm90aGVyIHdlYiBjb21wb25lbnQgdGhhdCB3aWxsIGNyZWF0ZSBpdCkuCisgICAgICogUmV0dXJuIGFuIDxjb2RlPkFjdGlvbkZvcndhcmQ8L2NvZGU+IGluc3RhbmNlIGRlc2NyaWJpbmcgd2hlcmUgYW5kIGhvdworICAgICAqIGNvbnRyb2wgc2hvdWxkIGJlIGZvcndhcmRlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHJlc3BvbnNlIGhhcworICAgICAqIGFscmVhZHkgYmVlbiBjb21wbGV0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgQWN0aW9uTWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIGFjdGlvbkZvcm0gVGhlIG9wdGlvbmFsIEFjdGlvbkZvcm0gYmVhbiBmb3IgdGhpcyByZXF1ZXN0IChpZiBhbnkpCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIEhUVFAgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgSFRUUCByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXhjZXB0aW9uIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBBY3Rpb25Gb3J3YXJkIHBlcmZvcm0oQWN0aW9uTWFwcGluZyBtYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uRm9ybSBmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworICAgICAgICAKKyAgICAgICAgLy8gQWNxdWlyZSB0aGUgcmVzb3VyY2VzIHRoYXQgd2UgbmVlZAorICAgICAgICBIdHRwU2Vzc2lvbiBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uKCk7CisgICAgICAgIExvY2FsZSBsb2NhbGUgPSBnZXRMb2NhbGUocmVxdWVzdCk7CisgICAgICAgIE1lc3NhZ2VSZXNvdXJjZXMgcmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VzKHJlcXVlc3QpOworICAgICAgICAKKyAgICAgICAgLy8gQWNxdWlyZSBhIHJlZmVyZW5jZSB0byB0aGUgTUJlYW5TZXJ2ZXIgY29udGFpbmluZyBvdXIgTUJlYW5zCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtQlNlcnZlciA9ICgoQXBwbGljYXRpb25TZXJ2bGV0KSBnZXRTZXJ2bGV0KCkpLmdldFNlcnZlcigpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24KKyAgICAgICAgICAgICgiQ2Fubm90IGFjcXVpcmUgTUJlYW5TZXJ2ZXIgcmVmZXJlbmNlIiwgdCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIFNldCB1cCB0aGUgb2JqZWN0IG5hbWVzIG9mIHRoZSBNQmVhbnMgd2UgYXJlIG1hbmlwdWxhdGluZworICAgICAgICAvLyBDb250ZXh0IG1CZWFuCisgICAgICAgIE9iamVjdE5hbWUgY25hbWUgPSBudWxsOworICAgICAgICAvLyBMb2FkZXIgbUJlYW4KKyAgICAgICAgT2JqZWN0TmFtZSBsbmFtZSA9IG51bGw7CisgICAgICAgIC8vIE1hbmFnZXIgbUJlYW4gCisgICAgICAgIE9iamVjdE5hbWUgbW5hbWUgPSBudWxsOworICAgICAgICAKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNuYW1lID0gbmV3IE9iamVjdE5hbWUocmVxdWVzdC5nZXRQYXJhbWV0ZXIoInNlbGVjdCIpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0KKyAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJlcnJvci5jb250ZXh0TmFtZS5iYWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJzZWxlY3QiKSk7CisgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nKG1lc3NhZ2UpOworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfQkFEX1JFUVVFU1QsIG1lc3NhZ2UpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgbmFtZSA9IGNuYW1lLmdldEtleVByb3BlcnR5KCJuYW1lIik7CisgICAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZygyKTsKKyAgICAgICAgaW50IGkgPSBuYW1lLmluZGV4T2YoIi8iKTsKKyAgICAgICAgU3RyaW5nIGhvc3QgPSBuYW1lLnN1YnN0cmluZygwLGkpOworICAgICAgICBTdHJpbmcgcGF0aCA9IG5hbWUuc3Vic3RyaW5nKGkpOworICAgICAgICAvLyBHZXQgdGhlIGNvcnJlc3BvbmRpbmcgbG9hZGVyCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoY25hbWUuZ2V0RG9tYWluKCkpOworICAgICAgICAgICAgc2IuYXBwZW5kKCI6dHlwZT1Mb2FkZXIiKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiLHBhdGg9IitwYXRoKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiLGhvc3Q9Iitob3N0KTsKKyAgICAgICAgICAgIGxuYW1lID0gbmV3IE9iamVjdE5hbWUoc2IudG9TdHJpbmcoKSk7CisgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPQorICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgImVycm9yLm1hbmFnZXJOYW1lLmJhZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi50b1N0cmluZygpKTsKKyAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cobWVzc2FnZSk7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19CQURfUkVRVUVTVCwgbWVzc2FnZSk7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgLy8gU2Vzc2lvbiBtYW5hZ2VyIHByb3BlcnRpZXMKKyAgICAgICAgLy8gR2V0IHRoZSBjb3JyZXNwb25kaW5nIFNlc3Npb24gTWFuYWdlciBtQmVhbgorICAgICAgICB0cnkgeworICAgICAgICAgICAgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKGNuYW1lLmdldERvbWFpbigpKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiOnR5cGU9TWFuYWdlciIpOworICAgICAgICAgICAgc2IuYXBwZW5kKCIscGF0aD0iK3BhdGgpOworICAgICAgICAgICAgc2IuYXBwZW5kKCIsaG9zdD0iK2hvc3QpOworICAgICAgICAgICAgbW5hbWUgPSBuZXcgT2JqZWN0TmFtZShzYi50b1N0cmluZygpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0KKyAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZSgiZXJyb3IubWFuYWdlck5hbWUuYmFkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZyhtZXNzYWdlKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcihIdHRwU2VydmxldFJlc3BvbnNlLlNDX0JBRF9SRVFVRVNULCBtZXNzYWdlKTsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBGaWxsIGluIHRoZSBmb3JtIHZhbHVlcyBmb3IgZGlzcGxheSBhbmQgZWRpdGluZworICAgICAgICBDb250ZXh0Rm9ybSBjb250ZXh0Rm0gPSBuZXcgQ29udGV4dEZvcm0oKTsKKyAgICAgICAgc2Vzc2lvbi5zZXRBdHRyaWJ1dGUoImNvbnRleHRGb3JtIiwgY29udGV4dEZtKTsKKyAgICAgICAgY29udGV4dEZtLnNldEFkbWluQWN0aW9uKCJFZGl0Iik7CisgICAgICAgIGNvbnRleHRGbS5zZXRPYmplY3ROYW1lKGNuYW1lLnRvU3RyaW5nKCkpOworICAgICAgICBjb250ZXh0Rm0uc2V0TG9hZGVyT2JqZWN0TmFtZShsbmFtZS50b1N0cmluZygpKTsKKyAgICAgICAgY29udGV4dEZtLnNldE1hbmFnZXJPYmplY3ROYW1lKG1uYW1lLnRvU3RyaW5nKCkpOworICAgICAgICBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgc2IuYXBwZW5kKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInNlcnZlci5zZXJ2aWNlLnRyZWVCdWlsZGVyLmNvbnRleHQiKSk7CisgICAgICAgIHNiLmFwcGVuZCgiICgiKTsKKyAgICAgICAgc2IuYXBwZW5kKHBhdGgpOworICAgICAgICBzYi5hcHBlbmQoIikiKTsKKyAgICAgICAgY29udGV4dEZtLnNldE5vZGVMYWJlbChzYi50b1N0cmluZygpKTsKKyAgICAgICAgY29udGV4dEZtLnNldEJvb2xlYW5WYWxzKExpc3RzLmdldEJvb2xlYW5WYWx1ZXMoKSk7CisgICAgICAgCisgICAgICAgIFN0cmluZyBhdHRyaWJ1dGUgPSBudWxsOworICAgICAgICB0cnkgeworCisgICAgICAgICAgICAvLyBDb3B5IHNjYWxhciBwcm9wZXJ0aWVzCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAicGF0aCI7CisgICAgICAgICAgICBjb250ZXh0Rm0uc2V0UGF0aAorICAgICAgICAgICAgICAgICgoU3RyaW5nKSBtQlNlcnZlci5nZXRBdHRyaWJ1dGUoY25hbWUsIGF0dHJpYnV0ZSkpOworICAgICAgICAgICAgYXR0cmlidXRlID0gImNvb2tpZXMiOworICAgICAgICAgICAgY29udGV4dEZtLnNldENvb2tpZXMKKyAgICAgICAgICAgICAgICAoKChCb29sZWFuKSBtQlNlcnZlci5nZXRBdHRyaWJ1dGUoY25hbWUsIGF0dHJpYnV0ZSkpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgYXR0cmlidXRlID0gImNyb3NzQ29udGV4dCI7CisgICAgICAgICAgICBjb250ZXh0Rm0uc2V0Q3Jvc3NDb250ZXh0CisgICAgICAgICAgICAgICAgKCgoQm9vbGVhbikgbUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKGNuYW1lLCBhdHRyaWJ1dGUpKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJkb2NCYXNlIjsKKyAgICAgICAgICAgIGNvbnRleHRGbS5zZXREb2NCYXNlCisgICAgICAgICAgICAgICAgKChTdHJpbmcpIG1CU2VydmVyLmdldEF0dHJpYnV0ZShjbmFtZSwgYXR0cmlidXRlKSk7CisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAid29ya0RpciI7CisgICAgICAgICAgICBjb250ZXh0Rm0uc2V0V29ya0RpcgorICAgICAgICAgICAgICAgICgoU3RyaW5nKSBtQlNlcnZlci5nZXRBdHRyaWJ1dGUoY25hbWUsIGF0dHJpYnV0ZSkpOworICAgICAgICAgICAgYXR0cmlidXRlID0gInVzZU5hbWluZyI7CisgICAgICAgICAgICBjb250ZXh0Rm0uc2V0VXNlTmFtaW5nCisgICAgICAgICAgICAgICAgKCgoQm9vbGVhbikgbUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKGNuYW1lLCBhdHRyaWJ1dGUpKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJyZWxvYWRhYmxlIjsKKyAgICAgICAgICAgIGNvbnRleHRGbS5zZXRSZWxvYWRhYmxlCisgICAgICAgICAgICAgICAgKCgoQm9vbGVhbikgbUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKGNuYW1lLCBhdHRyaWJ1dGUpKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJzd2FsbG93T3V0cHV0IjsKKyAgICAgICAgICAgIGNvbnRleHRGbS5zZXRTd2FsbG93T3V0cHV0CisgICAgICAgICAgICAgICAgKCgoQm9vbGVhbikgbUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKGNuYW1lLCBhdHRyaWJ1dGUpKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJvdmVycmlkZSI7CisgICAgICAgICAgICBjb250ZXh0Rm0uc2V0T3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAoKChCb29sZWFuKSBtQlNlcnZlci5nZXRBdHRyaWJ1dGUoY25hbWUsIGF0dHJpYnV0ZSkpLnRvU3RyaW5nKCkpOworCisJICAgIGF0dHJpYnV0ZSA9ICJhbnRpSkFSTG9ja2luZyI7CisJICAgIGNvbnRleHRGbS5zZXRBbnRpSmFyTG9ja2luZworCQkoKChCb29sZWFuKSBtQlNlcnZlci5nZXRBdHRyaWJ1dGUoY25hbWUsIGF0dHJpYnV0ZSkpLnRvU3RyaW5nKCkpOworCSAgICBhdHRyaWJ1dGUgPSAiYW50aVJlc291cmNlTG9ja2luZyI7CisJICAgIGNvbnRleHRGbS5zZXRBbnRpUmVzb3VyY2VMb2NraW5nCisJCSgoKEJvb2xlYW4pIG1CU2VydmVyLmdldEF0dHJpYnV0ZShjbmFtZSwgYXR0cmlidXRlKSkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAvLyBsb2FkZXIgcHJvcGVydGllcworICAgICAgICAgICAgLy9hdHRyaWJ1dGUgPSAiY2hlY2tJbnRlcnZhbCI7CisgICAgICAgICAgICAvL2NvbnRleHRGbS5zZXRMZHJDaGVja0ludGVydmFsCisgICAgICAgICAgICAvLyAgICAoKChJbnRlZ2VyKSBtQlNlcnZlci5nZXRBdHRyaWJ1dGUobG5hbWUsIGF0dHJpYnV0ZSkpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgYXR0cmlidXRlID0gInJlbG9hZGFibGUiOworICAgICAgICAgICAgY29udGV4dEZtLnNldExkclJlbG9hZGFibGUKKyAgICAgICAgICAgICAgICAoKChCb29sZWFuKSBtQlNlcnZlci5nZXRBdHRyaWJ1dGUobG5hbWUsIGF0dHJpYnV0ZSkpLnRvU3RyaW5nKCkpOworCisgICAgICAgICAgICAvLyBtYW5hZ2VyIHByb3BlcnRpZXMKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJlbnRyb3B5IjsKKyAgICAgICAgICAgIGNvbnRleHRGbS5zZXRNZ3JTZXNzaW9uSURJbml0CisgICAgICAgICAgICAgICAgKChTdHJpbmcpIG1CU2VydmVyLmdldEF0dHJpYnV0ZShtbmFtZSwgYXR0cmlidXRlKSk7CisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAibWF4QWN0aXZlU2Vzc2lvbnMiOworICAgICAgICAgICAgY29udGV4dEZtLnNldE1nck1heFNlc3Npb25zCisgICAgICAgICAgICAgICAgKCgoSW50ZWdlcikgbUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKG1uYW1lLCBhdHRyaWJ1dGUpKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIC8vYXR0cmlidXRlID0gImNoZWNrSW50ZXJ2YWwiOworICAgICAgICAgICAgLy9jb250ZXh0Rm0uc2V0TWdyQ2hlY2tJbnRlcnZhbAorICAgICAgICAgICAgLy8gICAgKCgoSW50ZWdlcikgbUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKG1uYW1lLCBhdHRyaWJ1dGUpKS50b1N0cmluZygpKTsKKworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZworICAgICAgICAgICAgICAgIChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5hdHRyaWJ1dGUuZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlKSwgdCk7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsCisgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmF0dHJpYnV0ZS5nZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUpKTsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIEZvcndhcmQgdG8gdGhlIGNvbnRleHQgZGlzcGxheSBwYWdlCisgICAgICAgIHJldHVybiAobWFwcGluZy5maW5kRm9yd2FyZCgiQ29udGV4dCIpKTsKKyAgICAgICAgCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9jb250ZXh0L1NhdmVDb250ZXh0QWN0aW9uLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vY29udGV4dC9TYXZlQ29udGV4dEFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyNTIwMmQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vY29udGV4dC9TYXZlQ29udGV4dEFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTEwIEBACisvKgorICogQ29weXJpZ2h0IDIwMDEtMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5jb250ZXh0OworCisKK2ltcG9ydCBqYXZhLm5ldC5VUkxFbmNvZGVyOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5BdHRyaWJ1dGU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyRmFjdG9yeTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LlF1ZXJ5RXhwOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuUXVlcnk7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3RJbnN0YW5jZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5KTUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLm1vZGVsZXIuUmVnaXN0cnk7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRXJyb3I7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkVycm9yczsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9ybTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9yd2FyZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy51dGlsLk1lc3NhZ2VSZXNvdXJjZXM7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uQXBwbGljYXRpb25TZXJ2bGV0OworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLlRvbWNhdFRyZWVCdWlsZGVyOworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLlRyZWVDb250cm9sOworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLlRyZWVDb250cm9sTm9kZTsKKworCisKKy8qKgorICogVGhlIDxjb2RlPkFjdGlvbjwvY29kZT4gdGhhdCBjb21wbGV0ZXMgPGVtPkFkZCBDb250ZXh0PC9lbT4gYW5kCisgKiA8ZW0+RWRpdCBDb250ZXh0PC9lbT4gdHJhbnNhY3Rpb25zLgorICoKKyAqIEBhdXRob3IgTWFudmVlbiBLYXVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBTYXZlQ29udGV4dEFjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisgICAgLyoqCisgICAgICogU2lnbmF0dXJlIGZvciB0aGUgPGNvZGU+Y3JlYXRlU3RhbmRhcmRDb250ZXh0PC9jb2RlPiBvcGVyYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgY3JlYXRlU3RhbmRhcmRDb250ZXh0VHlwZXNbXSA9CisgICAgeyAiamF2YS5sYW5nLlN0cmluZyIsICAgICAvLyBwYXJlbnQKKyAgICAgICJqYXZhLmxhbmcuU3RyaW5nIiwgICAgIC8vIHBhdGgKKyAgICAgICJqYXZhLmxhbmcuU3RyaW5nIiwgICAgIC8vIGRvY0Jhc2UKKyAgICB9OworCisgICAvKioKKyAgICAgKiBTaWduYXR1cmUgZm9yIHRoZSA8Y29kZT5jcmVhdGVTdGFuZGFyZExvYWRlcjwvY29kZT4gb3BlcmF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGNyZWF0ZVN0YW5kYXJkTG9hZGVyVHlwZXNbXSA9CisgICAgeyAiamF2YS5sYW5nLlN0cmluZyIsICAgICAvLyBwYXJlbnQKKyAgICB9OworCisgICAvKioKKyAgICAgKiBTaWduYXR1cmUgZm9yIHRoZSA8Y29kZT5jcmVhdGVTdGFuZGFyZE1hbmFnZXI8L2NvZGU+IG9wZXJhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBjcmVhdGVTdGFuZGFyZE1hbmFnZXJUeXBlc1tdID0KKyAgICB7ICJqYXZhLmxhbmcuU3RyaW5nIiwgICAgIC8vIHBhcmVudAorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBTaWduYXR1cmUgZm9yIHRoZSA8Y29kZT5yZW1vdmVDb250ZXh0PC9jb2RlPiBvcGVyYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcmVtb3ZlQ29udGV4dFR5cGVzW10gPQorICAgIHsgImphdmEubGFuZy5TdHJpbmciLCAgICAgIC8vIE9iamVjdCBuYW1lCisgICAgfTsKKyAgICAgICAgCisgICAgLyoqCisgICAgICogVGhlIE1CZWFuU2VydmVyIHdlIHdpbGwgYmUgaW50ZXJhY3Rpbmcgd2l0aC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1CZWFuU2VydmVyIG1CU2VydmVyID0gbnVsbDsKKyAgICAKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIHNwZWNpZmllZCBIVFRQIHJlcXVlc3QsIGFuZCBjcmVhdGUgdGhlIGNvcnJlc3BvbmRpbmcgSFRUUAorICAgICAqIHJlc3BvbnNlIChvciBmb3J3YXJkIHRvIGFub3RoZXIgd2ViIGNvbXBvbmVudCB0aGF0IHdpbGwgY3JlYXRlIGl0KS4KKyAgICAgKiBSZXR1cm4gYW4gPGNvZGU+QWN0aW9uRm9yd2FyZDwvY29kZT4gaW5zdGFuY2UgZGVzY3JpYmluZyB3aGVyZSBhbmQgaG93CisgICAgICogY29udHJvbCBzaG91bGQgYmUgZm9yd2FyZGVkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcmVzcG9uc2UgaGFzCisgICAgICogYWxyZWFkeSBiZWVuIGNvbXBsZXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBBY3Rpb25NYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gYWN0aW9uRm9ybSBUaGUgb3B0aW9uYWwgQWN0aW9uRm9ybSBiZWFuIGZvciB0aGlzIHJlcXVlc3QgKGlmIGFueSkKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgSFRUUCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBIVFRQIHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBleGNlcHRpb24gb2NjdXJzCisgICAgICovCisgICAgcHVibGljIEFjdGlvbkZvcndhcmQgcGVyZm9ybShBY3Rpb25NYXBwaW5nIG1hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb25Gb3JtIGZvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisgICAgICAgIAorICAgICAgICAvLyBBY3F1aXJlIHRoZSByZXNvdXJjZXMgdGhhdCB3ZSBuZWVkCisgICAgICAgIEh0dHBTZXNzaW9uIHNlc3Npb24gPSByZXF1ZXN0LmdldFNlc3Npb24oKTsKKyAgICAgICAgTG9jYWxlIGxvY2FsZSA9IGdldExvY2FsZShyZXF1ZXN0KTsKKyAgICAgICAgTWVzc2FnZVJlc291cmNlcyByZXNvdXJjZXMgPSBnZXRSZXNvdXJjZXMocmVxdWVzdCk7CisgICAgICAgIAorICAgICAgICAvLyBBY3F1aXJlIGEgcmVmZXJlbmNlIHRvIHRoZSBNQmVhblNlcnZlciBjb250YWluaW5nIG91ciBNQmVhbnMKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1CU2VydmVyID0gKChBcHBsaWNhdGlvblNlcnZsZXQpIGdldFNlcnZsZXQoKSkuZ2V0U2VydmVyKCk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbgorICAgICAgICAgICAgKCJDYW5ub3QgYWNxdWlyZSBNQmVhblNlcnZlciByZWZlcmVuY2UiLCB0KTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gSWRlbnRpZnkgdGhlIHJlcXVlc3RlZCBhY3Rpb24KKyAgICAgICAgQ29udGV4dEZvcm0gY2Zvcm0gPSAoQ29udGV4dEZvcm0pIGZvcm07CisgICAgICAgIFN0cmluZyBhZG1pbkFjdGlvbiA9IGNmb3JtLmdldEFkbWluQWN0aW9uKCk7CisgICAgICAgIFN0cmluZyBjT2JqZWN0TmFtZSA9IGNmb3JtLmdldE9iamVjdE5hbWUoKTsKKyAgICAgICAgU3RyaW5nIGxPYmplY3ROYW1lID0gY2Zvcm0uZ2V0TG9hZGVyT2JqZWN0TmFtZSgpOworICAgICAgICBTdHJpbmcgbU9iamVjdE5hbWUgPSBjZm9ybS5nZXRNYW5hZ2VyT2JqZWN0TmFtZSgpOworICAgICAgICBpZiAoKGNmb3JtLmdldFBhdGgoKSA9PSBudWxsKSB8fCAoY2Zvcm0uZ2V0UGF0aCgpLmxlbmd0aCgpPDEpKSB7CisgICAgICAgICAgICBjZm9ybS5zZXRQYXRoKCIvIik7CisgICAgICAgIH0KKyAgICAgICAKKyAgICAgICAgLy8gUGVyZm9ybSBhICJDcmVhdGUgQ29udGV4dCIgdHJhbnNhY3Rpb24gKGlmIHJlcXVlc3RlZCkKKyAgICAgICAgaWYgKCJDcmVhdGUiLmVxdWFscyhhZG1pbkFjdGlvbikpIHsKKworICAgICAgICAgICAgU3RyaW5nIG9wZXJhdGlvbiA9IG51bGw7CisgICAgICAgICAgICBPYmplY3QgdmFsdWVzW10gPSBudWxsOworICAgICAgICAgICAgCisgICAgICAgICAgICB0cnkgeyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIHBhcmVudCBob3N0IG5hbWUKKyAgICAgICAgICAgICAgICBTdHJpbmcgcGFyZW50TmFtZSA9IGNmb3JtLmdldFBhcmVudE9iamVjdE5hbWUoKTsKKyAgICAgICAgICAgICAgICBPYmplY3ROYW1lIGhvbmFtZSA9IG5ldyBPYmplY3ROYW1lKHBhcmVudE5hbWUpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIEVuc3VyZSB0aGF0IHRoZSByZXF1ZXN0ZWQgY29udGV4dCBuYW1lIGlzIHVuaXF1ZQorICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3ROYW1lKGhvbmFtZS5nZXREb21haW4oKSArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjpqMmVlVHlwZT1XZWJNb2R1bGUsbmFtZT0vLyIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9uYW1lLmdldEtleVByb3BlcnR5KCJob3N0IikgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmb3JtLmdldFBhdGgoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRSBzZXQgSjJFRUFwcGxpY2F0aW9uIGFuZCBKMkVFU2VydmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLEoyRUVBcHBsaWNhdGlvbj1ub25lLEoyRUVTZXJ2ZXI9bm9uZSIpOyAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAobUJTZXJ2ZXIuaXNSZWdpc3RlcmVkKG9uYW1lKSkgeworICAgICAgICAgICAgICAgICAgICBBY3Rpb25FcnJvcnMgZXJyb3JzID0gbmV3IEFjdGlvbkVycm9ycygpOworICAgICAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKCJjb250ZXh0TmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFjdGlvbkVycm9yKCJlcnJvci5jb250ZXh0TmFtZS5leGlzdHMiKSk7CisgICAgICAgICAgICAgICAgICAgIHNhdmVFcnJvcnMocmVxdWVzdCwgZXJyb3JzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChuZXcgQWN0aW9uRm9yd2FyZChtYXBwaW5nLmdldElucHV0KCkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gTG9vayB1cCBvdXIgTUJlYW5GYWN0b3J5IE1CZWFuCisgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSBmbmFtZSA9IAorICAgICAgICAgICAgICAgICAgICBUb21jYXRUcmVlQnVpbGRlci5nZXRNQmVhbkZhY3RvcnkoKTsKKworICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBTdGFuZGFyZENvbnRleHQgb2JqZWN0CisgICAgICAgICAgICAgICAgdmFsdWVzID0gbmV3IE9iamVjdFszXTsKKyAgICAgICAgICAgICAgICB2YWx1ZXNbMF0gPSBwYXJlbnROYW1lOworICAgICAgICAgICAgICAgIHZhbHVlc1sxXSA9IGNmb3JtLmdldFBhdGgoKTsKKyAgICAgICAgICAgICAgICB2YWx1ZXNbMl0gPSBjZm9ybS5nZXREb2NCYXNlKCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgb3BlcmF0aW9uID0gImNyZWF0ZVN0YW5kYXJkQ29udGV4dCI7CisgICAgICAgICAgICAgICAgY09iamVjdE5hbWUgPSAoU3RyaW5nKQorICAgICAgICAgICAgICAgICAgICBtQlNlcnZlci5pbnZva2UoZm5hbWUsIG9wZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcywgY3JlYXRlU3RhbmRhcmRDb250ZXh0VHlwZXMpOworICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBMb2FkZXIgb2JqZWN0CisgICAgICAgICAgICAgICAgdmFsdWVzID0gbmV3IFN0cmluZ1sxXTsKKyAgICAgICAgICAgICAgICAvLyBwYXJlbnQgb2YgbG9hZGVyIGlzIHRoZSBuZXdseSBjcmVhdGVkIGNvbnRleHQKKyAgICAgICAgICAgICAgICB2YWx1ZXNbMF0gPSBjT2JqZWN0TmFtZS50b1N0cmluZygpOworICAgICAgICAgICAgICAgIG9wZXJhdGlvbiA9ICJjcmVhdGVXZWJhcHBMb2FkZXIiOworICAgICAgICAgICAgICAgIGxPYmplY3ROYW1lID0gKFN0cmluZykKKyAgICAgICAgICAgICAgICAgICAgbUJTZXJ2ZXIuaW52b2tlKGZuYW1lLCBvcGVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMsIGNyZWF0ZVN0YW5kYXJkTG9hZGVyVHlwZXMpOyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgU3RhbmRhcmRNYW5hZ2VyIG9iamVjdAorICAgICAgICAgICAgICAgIHZhbHVlcyA9IG5ldyBTdHJpbmdbMV07CisgICAgICAgICAgICAgICAgLy8gcGFyZW50IG9mIG1hbmFnZXIgaXMgdGhlIG5ld2x5IGNyZWF0ZWQgQ29udGV4dAorICAgICAgICAgICAgICAgIHZhbHVlc1swXSA9IGNPYmplY3ROYW1lLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgb3BlcmF0aW9uID0gImNyZWF0ZVN0YW5kYXJkTWFuYWdlciI7CisgICAgICAgICAgICAgICAgbU9iamVjdE5hbWUgPSAoU3RyaW5nKQorICAgICAgICAgICAgICAgICAgICBtQlNlcnZlci5pbnZva2UoZm5hbWUsIG9wZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcywgY3JlYXRlU3RhbmRhcmRNYW5hZ2VyVHlwZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAobU9iamVjdE5hbWU9PW51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uID0gInJlbW92ZUxvYWRlciI7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlc1swXSA9IGxPYmplY3ROYW1lOworICAgICAgICAgICAgICAgICAgICBtQlNlcnZlci5pbnZva2UoZm5hbWUsIG9wZXJhdGlvbiwgdmFsdWVzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUNvbnRleHRUeXBlcyk7CisgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbiA9ICJyZW1vdmVDb250ZXh0IjsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVzWzBdID0gY09iamVjdE5hbWU7CisgICAgICAgICAgICAgICAgICAgIG1CU2VydmVyLmludm9rZShmbmFtZSwgb3BlcmF0aW9uLCB2YWx1ZXMsIAorICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlQ29udGV4dFR5cGVzKTsKKyAgICAgICAgICAgICAgICAgICAgUmVnaXN0cnkuZ2V0UmVnaXN0cnkoKS51bnJlZ2lzdGVyQ29tcG9uZW50KG5ldyBPYmplY3ROYW1lKGNPYmplY3ROYW1lKSk7CisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3Quc2V0QXR0cmlidXRlKCJ3YXJuaW5nIiwgImVycm9yLmNvbnRleHQuZGlyZWN0b3J5Iik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAobWFwcGluZy5maW5kRm9yd2FyZCgiU2F2ZSBVbnN1Y2Nlc3NmdWwiKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgbmV3IENvbnRleHQgdG8gb3VyIHRyZWUgY29udHJvbCBub2RlCisgICAgICAgICAgICAgICAgYWRkVG9UcmVlQ29udHJvbE5vZGUob25hbWUsIGNPYmplY3ROYW1lLCBwYXJlbnROYW1lLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcywgc2Vzc2lvbiwgbG9jYWxlKTsgICAgICAgICAgICAgICAgICAgICAKKworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nCisgICAgICAgICAgICAgICAgICAgIChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5pbnZva2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uKSwgZSk7CisgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmludm9rZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24pKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKG51bGwpOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIC8vIFBlcmZvcm0gYXR0cmlidXRlIHVwZGF0ZXMgYXMgcmVxdWVzdGVkCisgICAgICAgIFN0cmluZyBhdHRyaWJ1dGUgPSBudWxsOworICAgICAgICB0cnkgeworCisgICAgICAgICAgICBPYmplY3ROYW1lIGNvbmFtZSA9IG5ldyBPYmplY3ROYW1lKGNPYmplY3ROYW1lKTsKKyAgICAgICAgICAgIE9iamVjdE5hbWUgbG9uYW1lID0gbmV3IE9iamVjdE5hbWUobE9iamVjdE5hbWUpOworICAgICAgICAgICAgT2JqZWN0TmFtZSBtb25hbWUgPSBuZXcgT2JqZWN0TmFtZShtT2JqZWN0TmFtZSk7CisKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJwYXRoIjsKKyAgICAgICAgICAgIFN0cmluZyBwYXRoID0gIiI7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHBhdGggPSBjZm9ybS5nZXRQYXRoKCk7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgIHBhdGggPSAiIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1CU2VydmVyLnNldEF0dHJpYnV0ZShjb25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZSgicGF0aCIsIHBhdGgpKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgYXR0cmlidXRlID0gIndvcmtEaXIiOworICAgICAgICAgICAgU3RyaW5nIHdvcmtEaXIgPSAiIjsKKyAgICAgICAgICAgIHdvcmtEaXIgPSBjZm9ybS5nZXRXb3JrRGlyKCk7CisgICAgICAgICAgICBpZiAoKHdvcmtEaXIhPW51bGwpICYmICh3b3JrRGlyLmxlbmd0aCgpPj0xKSkgeworICAgICAgICAgICAgICAgIG1CU2VydmVyLnNldEF0dHJpYnV0ZShjb25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZSgid29ya0RpciIsIHdvcmtEaXIpKTsKKyAgICAgICAgICAgIH0KKyAKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJjb29raWVzIjsKKyAgICAgICAgICAgIFN0cmluZyBjb29raWVzID0gImZhbHNlIjsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY29va2llcyA9IGNmb3JtLmdldENvb2tpZXMoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgY29va2llcyA9ICJmYWxzZSI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQlNlcnZlci5zZXRBdHRyaWJ1dGUoY29uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoImNvb2tpZXMiLCBuZXcgQm9vbGVhbihjb29raWVzKSkpOworCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAiY3Jvc3NDb250ZXh0IjsKKyAgICAgICAgICAgIFN0cmluZyBjcm9zc0NvbnRleHQgPSAiZmFsc2UiOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjcm9zc0NvbnRleHQgPSBjZm9ybS5nZXRDcm9zc0NvbnRleHQoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgY3Jvc3NDb250ZXh0ID0gImZhbHNlIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1CU2VydmVyLnNldEF0dHJpYnV0ZShjb25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZSgiY3Jvc3NDb250ZXh0IiwgbmV3IEJvb2xlYW4oY3Jvc3NDb250ZXh0KSkpOworCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAib3ZlcnJpZGUiOworICAgICAgICAgICAgU3RyaW5nIG92ZXJyaWRlID0gImZhbHNlIjsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgb3ZlcnJpZGUgPSBjZm9ybS5nZXRPdmVycmlkZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICBvdmVycmlkZSA9ICJmYWxzZSI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQlNlcnZlci5zZXRBdHRyaWJ1dGUoY29uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoIm92ZXJyaWRlIiwgbmV3IEJvb2xlYW4ob3ZlcnJpZGUpKSk7CisKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJyZWxvYWRhYmxlIjsKKyAgICAgICAgICAgIFN0cmluZyByZWxvYWRhYmxlID0gImZhbHNlIjsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmVsb2FkYWJsZSA9IGNmb3JtLmdldFJlbG9hZGFibGUoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgcmVsb2FkYWJsZSA9ICJmYWxzZSI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQlNlcnZlci5zZXRBdHRyaWJ1dGUoY29uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoInJlbG9hZGFibGUiLCBuZXcgQm9vbGVhbihyZWxvYWRhYmxlKSkpOworCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAic3dhbGxvd091dHB1dCI7CisgICAgICAgICAgICBTdHJpbmcgc3dhbGxvd091dHB1dCA9ICJmYWxzZSI7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHN3YWxsb3dPdXRwdXQgPSBjZm9ybS5nZXRTd2FsbG93T3V0cHV0KCk7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgIHN3YWxsb3dPdXRwdXQgPSAiZmFsc2UiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUJTZXJ2ZXIuc2V0QXR0cmlidXRlKGNvbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKCJzd2FsbG93T3V0cHV0IiwgbmV3IEJvb2xlYW4oc3dhbGxvd091dHB1dCkpKTsKKworICAgICAgICAgICAgYXR0cmlidXRlID0gInVzZU5hbWluZyI7CisgICAgICAgICAgICBTdHJpbmcgdXNlTmFtaW5nID0gImZhbHNlIjsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdXNlTmFtaW5nID0gY2Zvcm0uZ2V0VXNlTmFtaW5nKCk7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgIHVzZU5hbWluZyA9ICJmYWxzZSI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQlNlcnZlci5zZXRBdHRyaWJ1dGUoY29uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoInVzZU5hbWluZyIsIG5ldyBCb29sZWFuKHVzZU5hbWluZykpKTsKKworICAgICAgICAgICAgYXR0cmlidXRlID0gImFudGlKQVJMb2NraW5nIjsKKyAgICAgICAgICAgIFN0cmluZyBhbnRpSmFyTG9ja2luZyA9IGNmb3JtLmdldEFudGlKYXJMb2NraW5nKCk7CisgICAgICAgICAgICBtQlNlcnZlci5zZXRBdHRyaWJ1dGUoY29uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoImFudGlKQVJMb2NraW5nIiwgbmV3IEJvb2xlYW4oYW50aUphckxvY2tpbmcpKSk7CisKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJhbnRpUmVzb3VyY2VMb2NraW5nIjsKKyAgICAgICAgICAgIFN0cmluZyBhbnRpUmVzb3VyY2VMb2NraW5nID0gY2Zvcm0uZ2V0QW50aVJlc291cmNlTG9ja2luZygpOworICAgICAgICAgICAgbUJTZXJ2ZXIuc2V0QXR0cmlidXRlKGNvbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKCJhbnRpUmVzb3VyY2VMb2NraW5nIiwgbmV3IEJvb2xlYW4oYW50aVJlc291cmNlTG9ja2luZykpKTsKKworCSAgICAKKyAgICAgICAgICAgIC8vIExvYWRlciBwcm9wZXJ0aWVzICAgICAgICAgICAgCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAicmVsb2FkYWJsZSI7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJlbG9hZGFibGUgPSBjZm9ybS5nZXRMZHJSZWxvYWRhYmxlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgIHJlbG9hZGFibGUgPSAiZmFsc2UiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUJTZXJ2ZXIuc2V0QXR0cmlidXRlKGxvbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKCJyZWxvYWRhYmxlIiwgbmV3IEJvb2xlYW4ocmVsb2FkYWJsZSkpKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy9hdHRyaWJ1dGUgPSAiY2hlY2tJbnRlcnZhbCI7CisgICAgICAgICAgICAvL2ludCBjaGVja0ludGVydmFsID0gMTU7CisgICAgICAgICAgICAvL3RyeSB7CisgICAgICAgICAgICAvLyAgICBjaGVja0ludGVydmFsID0gSW50ZWdlci5wYXJzZUludChjZm9ybS5nZXRMZHJDaGVja0ludGVydmFsKCkpOworICAgICAgICAgICAgLy99IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgLy8gICAgY2hlY2tJbnRlcnZhbCA9IDE1OworICAgICAgICAgICAgLy99CisgICAgICAgICAgICAvL21CU2VydmVyLnNldEF0dHJpYnV0ZShsb25hbWUsCisgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKCJjaGVja0ludGVydmFsIiwgbmV3IEludGVnZXIoY2hlY2tJbnRlcnZhbCkpKTsKKworICAgICAgICAgICAgLy8gTWFuYWdlciBwcm9wZXJ0aWVzICAgICAgICAgICAgCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAiZW50cm9weSI7CisgICAgICAgICAgICBTdHJpbmcgZW50cm9weSA9IGNmb3JtLmdldE1nclNlc3Npb25JREluaXQoKTsKKyAgICAgICAgICAgIGlmICgoZW50cm9weSE9bnVsbCkgJiYgKGVudHJvcHkubGVuZ3RoKCk+PTEpKSB7CisgICAgICAgICAgICAgICAgbUJTZXJ2ZXIuc2V0QXR0cmlidXRlKG1vbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKCJlbnRyb3B5IixlbnRyb3B5KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vYXR0cmlidXRlID0gImNoZWNrSW50ZXJ2YWwiOworICAgICAgICAgICAgLy90cnkgeworICAgICAgICAgICAgLy8gICAgY2hlY2tJbnRlcnZhbCA9IEludGVnZXIucGFyc2VJbnQoY2Zvcm0uZ2V0TWdyQ2hlY2tJbnRlcnZhbCgpKTsKKyAgICAgICAgICAgIC8vfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIC8vICAgIGNoZWNrSW50ZXJ2YWwgPSA2MDsKKyAgICAgICAgICAgIC8vfQorICAgICAgICAgICAgLy9tQlNlcnZlci5zZXRBdHRyaWJ1dGUobW9uYW1lLAorICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZSgiY2hlY2tJbnRlcnZhbCIsIG5ldyBJbnRlZ2VyKGNoZWNrSW50ZXJ2YWwpKSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJtYXhBY3RpdmVTZXNzaW9ucyI7CisgICAgICAgICAgICBpbnQgbWF4QWN0aXZlU2Vzc2lvbnMgPSAtMTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbWF4QWN0aXZlU2Vzc2lvbnMgPSBJbnRlZ2VyLnBhcnNlSW50KGNmb3JtLmdldE1nck1heFNlc3Npb25zKCkpOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICBtYXhBY3RpdmVTZXNzaW9ucyA9IC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUJTZXJ2ZXIuc2V0QXR0cmlidXRlKG1vbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKCJtYXhBY3RpdmVTZXNzaW9ucyIsIG5ldyBJbnRlZ2VyKG1heEFjdGl2ZVNlc3Npb25zKSkpOworCisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisKKyAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuYXR0cmlidXRlLnNldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSksIGUpOworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5hdHRyaWJ1dGUuc2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlKSk7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBGb3J3YXJkIHRvIHRoZSBzdWNjZXNzIHJlcG9ydGluZyBwYWdlCisgICAgICAgIHNlc3Npb24ucmVtb3ZlQXR0cmlidXRlKG1hcHBpbmcuZ2V0QXR0cmlidXRlKCkpOworICAgICAgICByZXR1cm4gKG1hcHBpbmcuZmluZEZvcndhcmQoIlNhdmUgU3VjY2Vzc2Z1bCIpKTsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIEFwcGVuZCBub2RlcyBmb3IgYW55IGRlZmluZSByZXNvdXJjZXMgZm9yIHRoZSBzcGVjaWZpZWQgQ29udGV4dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250YWluZXJOb2RlIENvbnRhaW5lciBub2RlIGZvciB0aGUgdHJlZSBjb250cm9sCisgICAgICogQHBhcmFtIGNvbnRhaW5lck5hbWUgT2JqZWN0IG5hbWUgb2YgdGhlIHBhcmVudCBjb250YWluZXIKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VzIFRoZSBNZXNzYWdlUmVzb3VyY2VzIGZvciBvdXIgbG9jYWxpemVkIG1lc3NhZ2VzCisgICAgICogIG1lc3NhZ2VzCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkVG9UcmVlQ29udHJvbE5vZGUoT2JqZWN0TmFtZSBvbmFtZSwgU3RyaW5nIGNvbnRhaW5lck5hbWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhcmVudE5hbWUsIE1lc3NhZ2VSZXNvdXJjZXMgcmVzb3VyY2VzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXNzaW9uIHNlc3Npb24sIExvY2FsZSBsb2NhbGUpIAorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBTdHJpbmcgZG9tYWluID0gb25hbWUuZ2V0RG9tYWluKCk7CisgICAgICAgIFRyZWVDb250cm9sIGNvbnRyb2wgPSAoVHJlZUNvbnRyb2wpIHNlc3Npb24uZ2V0QXR0cmlidXRlKCJ0cmVlQ29udHJvbFRlc3QiKTsKKyAgICAgICAgaWYgKGNvbnRyb2wgIT0gbnVsbCkgeworICAgICAgICAgICAgVHJlZUNvbnRyb2xOb2RlIHBhcmVudE5vZGUgPSBjb250cm9sLmZpbmROb2RlKHBhcmVudE5hbWUpOworICAgICAgICAgICAgaWYgKHBhcmVudE5vZGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFN0cmluZyB0eXBlID0gIkNvbnRleHQiOworICAgICAgICAgICAgICAgIFN0cmluZyBwYXRoID0gIiI7CisgICAgICAgICAgICAgICAgU3RyaW5nIGhvc3QgPSAiIjsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IG9uYW1lLmdldEtleVByb3BlcnR5KCJuYW1lIik7CisgICAgICAgICAgICAgICAgaWYgKChuYW1lICE9IG51bGwpICYmIChuYW1lLmxlbmd0aCgpID4gMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDIpOworICAgICAgICAgICAgICAgICAgICBpbnQgaSA9IG5hbWUuaW5kZXhPZigiLyIpOworICAgICAgICAgICAgICAgICAgICBob3N0ID0gbmFtZS5zdWJzdHJpbmcoMCxpKTsKKyAgICAgICAgICAgICAgICAgICAgcGF0aCA9IG5hbWUuc3Vic3RyaW5nKGkpOyAKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU3RyaW5nIG5vZGVMYWJlbCA9IAorICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJzZXJ2ZXIuc2VydmljZS50cmVlQnVpbGRlci5jb250ZXh0IikgKyAKKyAgICAgICAgICAgICAgICAgICAgIiAoIiArIHBhdGggKyAiKSI7CisgICAgICAgICAgICAgICAgU3RyaW5nIGVuY29kZWROYW1lID0gVVJMRW5jb2Rlci5lbmNvZGUob25hbWUudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgVHJlZUNvbnRyb2xOb2RlIGNoaWxkTm9kZSA9IAorICAgICAgICAgICAgICAgICAgICBuZXcgVHJlZUNvbnRyb2xOb2RlKG9uYW1lLnRvU3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvbnRleHQuZ2lmIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlTGFiZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVkaXRDb250ZXh0LmRvP3NlbGVjdD0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udGVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgZG9tYWluKTsKKyAgICAgICAgICAgICAgICBwYXJlbnROb2RlLmFkZENoaWxkKGNoaWxkTm9kZSk7CisgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIEZJWE1FIC0gZm9yY2UgYSByZWRpc3BsYXkKKyAgICAgICAgICAgICAgICBUcmVlQ29udHJvbE5vZGUgc3VidHJlZSA9IG5ldyBUcmVlQ29udHJvbE5vZGUKKyAgICAgICAgICAgICAgICAgICAgKCJDb250ZXh0IFJlc291cmNlIEFkbWluaXN0cmF0aW9uICIgKyBjb250YWluZXJOYW1lLAorICAgICAgICAgICAgICAgICAgICAiZm9sZGVyXzE2X3BhZC5naWYiLAorICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJyZXNvdXJjZXMudHJlZUJ1aWxkZXIuc3VidHJlZU5vZGUiKSwKKyAgICAgICAgICAgICAgICAgICAgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgImNvbnRlbnQiLAorICAgICAgICAgICAgICAgICAgICB0cnVlLCBkb21haW4pOyAgICAgICAgCisgICAgICAgICAgICAgICAgY2hpbGROb2RlLmFkZENoaWxkKHN1YnRyZWUpOworICAgICAgICAgICAgICAgIFRyZWVDb250cm9sTm9kZSBkYXRhc291cmNlcyA9IG5ldyBUcmVlQ29udHJvbE5vZGUKKyAgICAgICAgICAgICAgICAgICAgKCJDb250ZXh0IERhdGEgU291cmNlcyAiICsgY29udGFpbmVyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIkRhdGFzb3VyY2UuZ2lmIiwKKyAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAicmVzb3VyY2VzLnRyZWVCdWlsZGVyLmRhdGFzb3VyY2VzIiksCisgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZXMvbGlzdERhdGFTb3VyY2VzLmRvP3Jlc291cmNldHlwZT0iICsgCisgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHR5cGUpICsgIiZwYXRoPSIgKworICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShwYXRoKSArICImaG9zdD0iICsgCisgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKGhvc3QpICsgIiZmb3J3YXJkPSIgKworICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZSgiRGF0YVNvdXJjZXMgTGlzdCBTZXR1cCIpLAorICAgICAgICAgICAgICAgICAgICAiY29udGVudCIsCisgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBkb21haW4pOworICAgICAgICAgICAgICAgIFRyZWVDb250cm9sTm9kZSBtYWlsc2Vzc2lvbnMgPSBuZXcgVHJlZUNvbnRyb2xOb2RlCisgICAgICAgICAgICAgICAgICAgICgiQ29udGV4dCBNYWlsIFNlc3Npb25zICIgKyBjb250YWluZXJOYW1lLAorICAgICAgICAgICAgICAgICAgICAiTWFpbHNlc3Npb24uZ2lmIiwKKyAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAicmVzb3VyY2VzLnRyZWVCdWlsZGVyLm1haWxzZXNzaW9ucyIpLAorICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VzL2xpc3RNYWlsU2Vzc2lvbnMuZG8/cmVzb3VyY2V0eXBlPSIgKyAKKyAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUodHlwZSkgKyAiJnBhdGg9IiArCisgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHBhdGgpICsgIiZob3N0PSIgKyAKKyAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUoaG9zdCkgKyAiJmZvcndhcmQ9IiArCisgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKCJNYWlsU2Vzc2lvbnMgTGlzdCBTZXR1cCIpLAorICAgICAgICAgICAgICAgICAgICAiY29udGVudCIsCisgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBkb21haW4pOworICAgICAgICAgICAgICAgIFRyZWVDb250cm9sTm9kZSByZXNvdXJjZWxpbmtzID0gbmV3IFRyZWVDb250cm9sTm9kZQorICAgICAgICAgICAgICAgICAgICAoIlJlc291cmNlIExpbmtzICIgKyBjb250YWluZXJOYW1lLAorICAgICAgICAgICAgICAgICAgICAiUmVzb3VyY2VMaW5rLmdpZiIsCisgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInJlc291cmNlcy50cmVlQnVpbGRlci5yZXNvdXJjZWxpbmtzIiksCisgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZXMvbGlzdFJlc291cmNlTGlua3MuZG8/cmVzb3VyY2V0eXBlPSIgKyAKKyAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUodHlwZSkgKyAiJnBhdGg9IiArCisgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHBhdGgpICsgIiZob3N0PSIgKyAKKyAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUoaG9zdCkgKyAiJmZvcndhcmQ9IiArCisgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKCJSZXNvdXJjZUxpbmtzIExpc3QgU2V0dXAiKSwKKyAgICAgICAgICAgICAgICAgICAgImNvbnRlbnQiLAorICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZG9tYWluKTsKKyAgICAgICAgICAgICAgICBUcmVlQ29udHJvbE5vZGUgZW52cyA9IG5ldyBUcmVlQ29udHJvbE5vZGUKKyAgICAgICAgICAgICAgICAgICAgKCJDb250ZXh0IEVudmlyb25tZW50IEVudHJpZXMgIisgY29udGFpbmVyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIkVudmlyb25tZW50RW50cmllcy5naWYiLAorICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUgLCJyZXNvdXJjZXMuZW52LmVudHJpZXMiKSwKKyAgICAgICAgICAgICAgICAgICAgInJlc291cmNlcy9saXN0RW52RW50cmllcy5kbz9yZXNvdXJjZXR5cGU9IiArIAorICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZSh0eXBlKSArICImcGF0aD0iICsKKyAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUocGF0aCkgKyAiJmhvc3Q9IiArIAorICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShob3N0KSArICImZm9yd2FyZD0iICsKKyAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUoIkVudkVudHJpZXMgTGlzdCBTZXR1cCIpLAorICAgICAgICAgICAgICAgICAgICAiY29udGVudCIsCisgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBkb21haW4pOworICAgICAgICAgICAgICAgIHN1YnRyZWUuYWRkQ2hpbGQoZGF0YXNvdXJjZXMpOworICAgICAgICAgICAgICAgIHN1YnRyZWUuYWRkQ2hpbGQobWFpbHNlc3Npb25zKTsKKyAgICAgICAgICAgICAgICBzdWJ0cmVlLmFkZENoaWxkKHJlc291cmNlbGlua3MpOworICAgICAgICAgICAgICAgIHN1YnRyZWUuYWRkQ2hpbGQoZW52cyk7ICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAgICAgICAgICgiQ2Fubm90IGZpbmQgcGFyZW50IG5vZGUgJyIgKyBwYXJlbnROYW1lICsgIiciKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIH1lbHNlIHsKKyAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2coIkNhbm5vdCBmaW5kIFRyZWVDb250cm9sTm9kZSEiKTsKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIH0gICAgCisgICAgICAgIAorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL2RlZmF1bHRjb250ZXh0L0FkZERlZmF1bHRDb250ZXh0QWN0aW9uLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vZGVmYXVsdGNvbnRleHQvQWRkRGVmYXVsdENvbnRleHRBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWI2MTYxCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL2RlZmF1bHRjb250ZXh0L0FkZERlZmF1bHRDb250ZXh0QWN0aW9uLmphdmEKQEAgLTAsMCArMSwxMjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMS0yMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLmRlZmF1bHRjb250ZXh0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkVycm9yczsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9ybTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9yd2FyZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy51dGlsLk1lc3NhZ2VSZXNvdXJjZXM7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uTGFiZWxWYWx1ZUJlYW47CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uTGlzdHM7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uVG9tY2F0VHJlZUJ1aWxkZXI7CisvKioKKyAqIFRoZSA8Y29kZT5BY3Rpb248L2NvZGU+IHRoYXQgc2V0cyB1cCA8ZW0+QWRkIERlZmF1bHRDb250ZXh0PC9lbT4gdHJhbnNhY3Rpb25zLgorICoKKyAqIEBhdXRob3IgQW15IFJvaAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgQWRkRGVmYXVsdENvbnRleHRBY3Rpb24gZXh0ZW5kcyBBY3Rpb24geworICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworICAgIAorICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIHNwZWNpZmllZCBIVFRQIHJlcXVlc3QsIGFuZCBjcmVhdGUgdGhlIGNvcnJlc3BvbmRpbmcgSFRUUAorICAgICAqIHJlc3BvbnNlIChvciBmb3J3YXJkIHRvIGFub3RoZXIgd2ViIGNvbXBvbmVudCB0aGF0IHdpbGwgY3JlYXRlIGl0KS4KKyAgICAgKiBSZXR1cm4gYW4gPGNvZGU+QWN0aW9uRm9yd2FyZDwvY29kZT4gaW5zdGFuY2UgZGVzY3JpYmluZyB3aGVyZSBhbmQgaG93CisgICAgICogY29udHJvbCBzaG91bGQgYmUgZm9yd2FyZGVkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcmVzcG9uc2UgaGFzCisgICAgICogYWxyZWFkeSBiZWVuIGNvbXBsZXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBBY3Rpb25NYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gYWN0aW9uRm9ybSBUaGUgb3B0aW9uYWwgQWN0aW9uRm9ybSBiZWFuIGZvciB0aGlzIHJlcXVlc3QgKGlmIGFueSkKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgSFRUUCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBIVFRQIHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBleGNlcHRpb24gb2NjdXJzCisgICAgICovCisgICAgcHVibGljIEFjdGlvbkZvcndhcmQgcGVyZm9ybShBY3Rpb25NYXBwaW5nIG1hcHBpbmcsIEFjdGlvbkZvcm0gZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisgICAgICAgIAorICAgICAgICAvLyBBY3F1aXJlIHRoZSByZXNvdXJjZXMgdGhhdCB3ZSBuZWVkCisgICAgICAgIEh0dHBTZXNzaW9uIHNlc3Npb24gPSByZXF1ZXN0LmdldFNlc3Npb24oKTsKKyAgICAgICAgTG9jYWxlIGxvY2FsZSA9IGdldExvY2FsZShyZXF1ZXN0KTsKKyAgICAgICAgTWVzc2FnZVJlc291cmNlcyByZXNvdXJjZXMgPSBnZXRSZXNvdXJjZXMocmVxdWVzdCk7CisgICAgICAgIAorICAgICAgICAvLyBGaWxsIGluIHRoZSBmb3JtIHZhbHVlcyBmb3IgZGlzcGxheSBhbmQgZWRpdGluZworICAgICAgICBEZWZhdWx0Q29udGV4dEZvcm0gZGVmYXVsdENvbnRleHRGbSA9IG5ldyBEZWZhdWx0Q29udGV4dEZvcm0oKTsKKyAgICAgICAgc2Vzc2lvbi5zZXRBdHRyaWJ1dGUoImRlZmF1bHRDb250ZXh0Rm9ybSIsIGRlZmF1bHRDb250ZXh0Rm0pOworICAgICAgICBkZWZhdWx0Q29udGV4dEZtLnNldEFkbWluQWN0aW9uKCJDcmVhdGUiKTsKKyAgICAgICAgZGVmYXVsdENvbnRleHRGbS5zZXRPYmplY3ROYW1lKCIiKTsKKyAgICAgICAgU3RyaW5nIHNlcnZpY2UgPSByZXF1ZXN0LmdldFBhcmFtZXRlcigic2VydmljZU5hbWUiKTsKKyAgICAgICAgU3RyaW5nIHBhcmVudCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJwYXJlbnQiKTsKKyAgICAgICAgU3RyaW5nIGRlZmF1bHRDb250ZXh0ID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIGRvbWFpbiA9IG51bGw7CisgICAgICAgIGlmIChzZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGRvbWFpbiA9IHNlcnZpY2Uuc3Vic3RyaW5nKDAsc2VydmljZS5pbmRleE9mKCI6IikpOworICAgICAgICAgICAgZGVmYXVsdENvbnRleHQgPSBkb21haW4gKyBUb21jYXRUcmVlQnVpbGRlci5ERUZBVUxUQ09OVEVYVF9UWVBFOworICAgICAgICAgICAgZGVmYXVsdENvbnRleHRGbS5zZXRQYXJlbnRPYmplY3ROYW1lKHNlcnZpY2UpOworICAgICAgICB9IGVsc2UgaWYgKHBhcmVudCAhPSBudWxsKSB7CisgICAgICAgICAgICBkb21haW4gPSBwYXJlbnQuc3Vic3RyaW5nKDAscGFyZW50LmluZGV4T2YoIjoiKSk7CisgICAgICAgICAgICBkZWZhdWx0Q29udGV4dEZtLnNldFBhcmVudE9iamVjdE5hbWUocGFyZW50KTsKKyAgICAgICAgICAgIGludCBwb3NpdGlvbiA9IHBhcmVudC5pbmRleE9mKCIsIik7CisgICAgICAgICAgICBkZWZhdWx0Q29udGV4dCA9IGRvbWFpbiArIFRvbWNhdFRyZWVCdWlsZGVyLkRFRkFVTFRDT05URVhUX1RZUEUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC5zdWJzdHJpbmcocG9zaXRpb24sIHBhcmVudC5sZW5ndGgoKSk7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdENvbnRleHRGbS5zZXRPYmplY3ROYW1lKGRlZmF1bHRDb250ZXh0KTsgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgaW50IHBvc2l0aW9uID0gZGVmYXVsdENvbnRleHQuaW5kZXhPZigiLCIpOworICAgICAgICBTdHJpbmcgbG9hZGVyID0gZG9tYWluICsgVG9tY2F0VHJlZUJ1aWxkZXIuTE9BREVSX1RZUEU7CisgICAgICAgIFN0cmluZyBtYW5hZ2VyID0gZG9tYWluICsgVG9tY2F0VHJlZUJ1aWxkZXIuTUFOQUdFUl9UWVBFOworICAgICAgICBpZiAocG9zaXRpb24gPiAwKSB7CisgICAgICAgICAgICBsb2FkZXIgKz0gZGVmYXVsdENvbnRleHQuc3Vic3RyaW5nKHBvc2l0aW9uLCBkZWZhdWx0Q29udGV4dC5sZW5ndGgoKSk7CisgICAgICAgICAgICBtYW5hZ2VyICs9IGRlZmF1bHRDb250ZXh0LnN1YnN0cmluZyhwb3NpdGlvbiwgZGVmYXVsdENvbnRleHQubGVuZ3RoKCkpOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHRDb250ZXh0Rm0uc2V0TG9hZGVyT2JqZWN0TmFtZShsb2FkZXIpOworICAgICAgICBkZWZhdWx0Q29udGV4dEZtLnNldE1hbmFnZXJPYmplY3ROYW1lKG1hbmFnZXIpOyAKKyAgICAgICAgZGVmYXVsdENvbnRleHRGbS5zZXROb2RlTGFiZWwoIiIpOworICAgICAgICBkZWZhdWx0Q29udGV4dEZtLnNldENvb2tpZXMoInRydWUiKTsKKyAgICAgICAgZGVmYXVsdENvbnRleHRGbS5zZXRDcm9zc0NvbnRleHQoInRydWUiKTsKKyAgICAgICAgZGVmYXVsdENvbnRleHRGbS5zZXRSZWxvYWRhYmxlKCJmYWxzZSIpOworICAgICAgICBkZWZhdWx0Q29udGV4dEZtLnNldFN3YWxsb3dPdXRwdXQoImZhbHNlIik7CisgICAgICAgIGRlZmF1bHRDb250ZXh0Rm0uc2V0VXNlTmFtaW5nKCJ0cnVlIik7CisgICAgICAgIC8vbG9hZGVyIGluaXRpYWxpemF0aW9uCisgICAgICAgIGRlZmF1bHRDb250ZXh0Rm0uc2V0TGRyQ2hlY2tJbnRlcnZhbCgiMTUiKTsKKyAgICAgICAgZGVmYXVsdENvbnRleHRGbS5zZXRMZHJSZWxvYWRhYmxlKCJmYWxzZSIpOworICAgICAgICAvL21hbmFnZXIgaW5pdGlhbGl6YXRpb24KKyAgICAgICAgZGVmYXVsdENvbnRleHRGbS5zZXRNZ3JDaGVja0ludGVydmFsKCI2MCIpOworICAgICAgICBkZWZhdWx0Q29udGV4dEZtLnNldE1nck1heFNlc3Npb25zKCItMSIpOworICAgICAgICBkZWZhdWx0Q29udGV4dEZtLnNldE1nclNlc3Npb25JREluaXQoIiIpOworICAgICAgICAKKyAgICAgICAgZGVmYXVsdENvbnRleHRGbS5zZXRCb29sZWFuVmFscyhMaXN0cy5nZXRCb29sZWFuVmFsdWVzKCkpOyAgICAgICAgCisgICAgICAgIAorICAgICAgICAvLyBGb3J3YXJkIHRvIHRoZSBjb250ZXh0IGRpc3BsYXkgcGFnZQorICAgICAgICByZXR1cm4gKG1hcHBpbmcuZmluZEZvcndhcmQoIkRlZmF1bHRDb250ZXh0IikpOworICAgICAgICAKKyAgICB9ICAgIAorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL2RlZmF1bHRjb250ZXh0L0RlZmF1bHRDb250ZXh0Rm9ybS5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL2RlZmF1bHRjb250ZXh0L0RlZmF1bHRDb250ZXh0Rm9ybS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1ZGYxM2YKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vZGVmYXVsdGNvbnRleHQvRGVmYXVsdENvbnRleHRGb3JtLmphdmEKQEAgLTAsMCArMSw1OTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLmRlZmF1bHRjb250ZXh0OworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRXJyb3I7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkVycm9yczsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9ybTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKK2ltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBGb3JtIGJlYW4gZm9yIHRoZSBkZWZhdWx0IGNvbnRleHQgcGFnZS4KKyAqCisgKiBAYXV0aG9yIEFteSBSb2gKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIERlZmF1bHRDb250ZXh0Rm9ybSBleHRlbmRzIEFjdGlvbkZvcm0geworICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworICAgIAorICAgLyoqCisgICAgICogVGhlIGFkbWluaXN0cmF0aXZlIGFjdGlvbiByZXByZXNlbnRlZCBieSB0aGlzIGZvcm0uCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgYWRtaW5BY3Rpb24gPSAiRWRpdCI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgb2JqZWN0IG5hbWUgb2YgdGhlIERlZmF1bHRDb250ZXh0IHRoaXMgYmVhbiByZWZlcnMgdG8uCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgb2JqZWN0TmFtZSA9IG51bGw7CisgICAKKyAgICAvKioKKyAgICAgKiBUaGUgb2JqZWN0IG5hbWUgb2YgdGhlIHBhcmVudCBvZiB0aGlzIERlZmF1bHRDb250ZXh0LgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHBhcmVudE9iamVjdE5hbWUgPSBudWxsOworICAgCisgICAgLyoqCisgICAgICogVGhlIG9iamVjdCBuYW1lIG9mIHRoZSBsb2FkZXIgb2YgdGhpcyBEZWZhdWx0Q29udGV4dC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBsb2FkZXJPYmplY3ROYW1lID0gbnVsbDsKKyAgIAorICAgIC8qKgorICAgICAqIFRoZSBvYmplY3QgbmFtZSBvZiB0aGUgbWFuYWdlciBvZiB0aGlzIERlZmF1bHRDb250ZXh0LgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIG1hbmFnZXJPYmplY3ROYW1lID0gbnVsbDsKKyAgIAorICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciB0aGUgbm9kZSBsYWJlbC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBub2RlTGFiZWwgPSBudWxsOworICAgIAorICAgIC8qKgorICAgICAqIFRoZSB2YWx1ZSBvZiBjb29raWVzLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGNvb2tpZXMgPSAidHJ1ZSI7CisgICAgCisgICAgLyoqCisgICAgICogVGhlIHZhbHVlIG9mIGNyb3NzIGNvbnRleHQuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgY3Jvc3NDb250ZXh0ID0gInRydWUiOworICAgIAorICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciByZWxvYWRhYmxlIGJvb2xlYW4uCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcmVsb2FkYWJsZSA9ICJmYWxzZSI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdGV4dCBmb3Igc3dhbGxvd091dHB1dCBib29sZWFuLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHN3YWxsb3dPdXRwdXQgPSAiZmFsc2UiOworCisgICAgLyoqCisgICAgICogVGhlIHRleHQgZm9yIHVzZSBuYW1pbmcgYm9vbGVhbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyB1c2VOYW1pbmcgPSAidHJ1ZSI7CisgICAgCisgICAgLyoqCisgICAgICogVGhlIHRleHQgZm9yIHRoZSBsb2FkZXIgY2hlY2sgaW50ZXJ2YWwuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbGRyQ2hlY2tJbnRlcnZhbCA9ICIxNSI7CisgICAgCisgICAgLyoqCisgICAgICogVGhlIHRleHQgZm9yIHRoZSBib29sZWFuIHZhbHVlIG9mIGxvYWRlciByZWxvYWRhYmxlLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGxkclJlbG9hZGFibGUgPSAiZmFsc2UiOworICAgIAorICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciB0aGUgc2Vzc2lvbiBtYW5hZ2VyIGNoZWNrIGludGVydmFsLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIG1nckNoZWNrSW50ZXJ2YWwgPSAiNjAiOworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciB0aGUgc2Vzc2lvbiBtZ3Igc2Vzc2lvbiBJRCBpbml0aWFsaXplci4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBtZ3JTZXNzaW9uSURJbml0ID0gIiI7CisgICAgCisgICAgLyoqCisgICAgICogVGhlIHRleHQgZm9yIHRoZSBzZXNzaW9uIG1nciBtYXggYWN0aXZlIHNlc3Npb25zLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIG1nck1heFNlc3Npb25zID0gIjAiOworICAgIAorICAgIC8qCisgICAgICogUmVwcmVzZW50IGJvb2xlYW4gKHRydWUsIGZhbHNlKSB2YWx1ZXMgZm9yIGNvb2tpZXMgZXRjLgorICAgICAqLworICAgIHByaXZhdGUgTGlzdCBib29sZWFuVmFscyA9IG51bGw7CisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisgICAgIAorICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBhZG1pbmlzdHJhdGl2ZSBhY3Rpb24gcmVwcmVzZW50ZWQgYnkgdGhpcyBmb3JtLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWRtaW5BY3Rpb24oKSB7CisKKyAgICAgICAgcmV0dXJuIHRoaXMuYWRtaW5BY3Rpb247CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYWRtaW5pc3RyYXRpdmUgYWN0aW9uIHJlcHJlc2VudGVkIGJ5IHRoaXMgZm9ybS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBZG1pbkFjdGlvbihTdHJpbmcgYWRtaW5BY3Rpb24pIHsKKworICAgICAgICB0aGlzLmFkbWluQWN0aW9uID0gYWRtaW5BY3Rpb247CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG9iamVjdCBuYW1lIG9mIHRoZSBEZWZhdWx0Q29udGV4dCB0aGlzIGJlYW4gcmVmZXJzIHRvLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0T2JqZWN0TmFtZSgpIHsKKworICAgICAgICByZXR1cm4gdGhpcy5vYmplY3ROYW1lOworCisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBvYmplY3QgbmFtZSBvZiB0aGUgRGVmYXVsdENvbnRleHQgdGhpcyBiZWFuIHJlZmVycyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPYmplY3ROYW1lKFN0cmluZyBvYmplY3ROYW1lKSB7CisKKyAgICAgICAgdGhpcy5vYmplY3ROYW1lID0gb2JqZWN0TmFtZTsKKworICAgIH0gICAgCisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBwYXJlbnQgb2JqZWN0IG5hbWUgb2YgdGhlIERlZmF1bHRDb250ZXh0IHRoaXMgYmVhbiByZWZlcnMgdG8uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRQYXJlbnRPYmplY3ROYW1lKCkgeworCisgICAgICAgIHJldHVybiB0aGlzLnBhcmVudE9iamVjdE5hbWU7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHBhcmVudCBvYmplY3QgbmFtZSBvZiB0aGUgRGVmYXVsdENvbnRleHQgdGhpcyBiZWFuIHJlZmVycyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXJlbnRPYmplY3ROYW1lKFN0cmluZyBwYXJlbnRPYmplY3ROYW1lKSB7CisKKyAgICAgICAgdGhpcy5wYXJlbnRPYmplY3ROYW1lID0gcGFyZW50T2JqZWN0TmFtZTsKKworICAgIH0KKyAgICAKKyAgICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbG9hZGVyIG9iamVjdCBuYW1lIG9mIHRoZSBEZWZhdWx0Q29udGV4dCB0aGlzIGJlYW4gcmVmZXJzIHRvLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9hZGVyT2JqZWN0TmFtZSgpIHsKKworICAgICAgICByZXR1cm4gdGhpcy5sb2FkZXJPYmplY3ROYW1lOworCisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBsb2FkZXIgb2JqZWN0IG5hbWUgb2YgdGhlIERlZmF1bHRDb250ZXh0IHRoaXMgYmVhbiByZWZlcnMgdG8uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TG9hZGVyT2JqZWN0TmFtZShTdHJpbmcgbG9hZGVyT2JqZWN0TmFtZSkgeworCisgICAgICAgIHRoaXMubG9hZGVyT2JqZWN0TmFtZSA9IGxvYWRlck9iamVjdE5hbWU7CisKKyAgICB9CisgICAgCisgICAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG1hbmFnZXIgb2JqZWN0IG5hbWUgb2YgdGhlIERlZmF1bHRDb250ZXh0IHRoaXMgYmVhbiByZWZlcnMgdG8uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRNYW5hZ2VyT2JqZWN0TmFtZSgpIHsKKworICAgICAgICByZXR1cm4gdGhpcy5tYW5hZ2VyT2JqZWN0TmFtZTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbWFuYWdlciBvYmplY3QgbmFtZSBvZiB0aGUgRGVmYXVsdENvbnRleHQgdGhpcyBiZWFuIHJlZmVycyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNYW5hZ2VyT2JqZWN0TmFtZShTdHJpbmcgbWFuYWdlck9iamVjdE5hbWUpIHsKKworICAgICAgICB0aGlzLm1hbmFnZXJPYmplY3ROYW1lID0gbWFuYWdlck9iamVjdE5hbWU7CisKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBsYWJlbCBvZiB0aGUgbm9kZSB0aGF0IHdhcyBjbGlja2VkLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Tm9kZUxhYmVsKCkgeworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXMubm9kZUxhYmVsOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBub2RlIGxhYmVsLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE5vZGVMYWJlbChTdHJpbmcgbm9kZUxhYmVsKSB7CisgICAgICAgIAorICAgICAgICB0aGlzLm5vZGVMYWJlbCA9IG5vZGVMYWJlbDsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgYm9vbGVhblZhbHMuCisgICAgICovCisgICAgcHVibGljIExpc3QgZ2V0Qm9vbGVhblZhbHMoKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy5ib29sZWFuVmFsczsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgZGVidWdWYWxzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEJvb2xlYW5WYWxzKExpc3QgYm9vbGVhblZhbHMpIHsKKyAgICAgICAgCisgICAgICAgIHRoaXMuYm9vbGVhblZhbHMgPSBib29sZWFuVmFsczsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgQ29va2llcy4KKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgU3RyaW5nIGdldENvb2tpZXMoKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy5jb29raWVzOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBDb29raWVzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvb2tpZXMoU3RyaW5nIGNvb2tpZXMpIHsKKyAgICAgICAgCisgICAgICAgIHRoaXMuY29va2llcyA9IGNvb2tpZXM7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIENyb3NzIENvbnRleHQuCisgICAgICovCisgICAgCisgICAgcHVibGljIFN0cmluZyBnZXRDcm9zc0NvbnRleHQoKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy5jcm9zc0NvbnRleHQ7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIENyb3NzIENvbnRleHQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q3Jvc3NDb250ZXh0KFN0cmluZyBjcm9zc0NvbnRleHQpIHsKKyAgICAgICAgCisgICAgICAgIHRoaXMuY3Jvc3NDb250ZXh0ID0gY3Jvc3NDb250ZXh0OworICAgICAgICAKKyAgICB9CisgICAgICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcmVsb2FkYWJsZSBib29sZWFuIHZhbHVlLgorICAgICAqLworCisgICAgcHVibGljIFN0cmluZyBnZXRSZWxvYWRhYmxlKCkgeworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXMucmVsb2FkYWJsZTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcmVsb2FkYWJsZSB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZWxvYWRhYmxlKFN0cmluZyByZWxvYWRhYmxlKSB7CisKKyAgICAgICAgdGhpcy5yZWxvYWRhYmxlID0gcmVsb2FkYWJsZTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc3dhbGxvd091dHB1dCBib29sZWFuIHZhbHVlLgorICAgICAqLworCisgICAgcHVibGljIFN0cmluZyBnZXRTd2FsbG93T3V0cHV0KCkgeworCisgICAgICAgIHJldHVybiB0aGlzLnN3YWxsb3dPdXRwdXQ7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHN3YWxsb3dPdXRwdXQgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3dhbGxvd091dHB1dChTdHJpbmcgc3dhbGxvd091dHB1dCkgeworCisgICAgICAgIHRoaXMuc3dhbGxvd091dHB1dCA9IHN3YWxsb3dPdXRwdXQ7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHVzZSBuYW1pbmcgYm9vbGVhbiB2YWx1ZS4KKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgU3RyaW5nIGdldFVzZU5hbWluZygpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLnVzZU5hbWluZzsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgdXNlTmFtaW5nIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVzZU5hbWluZyhTdHJpbmcgdXNlTmFtaW5nKSB7CisgICAgICAgIAorICAgICAgICB0aGlzLnVzZU5hbWluZyA9IHVzZU5hbWluZzsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbG9hZGVyIGNoZWNrIGludGVydmFsLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGRyQ2hlY2tJbnRlcnZhbCgpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLmxkckNoZWNrSW50ZXJ2YWw7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGxvYWRlciBDaGVjayBJbnRlcnZhbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMZHJDaGVja0ludGVydmFsKFN0cmluZyBsZHJDaGVja0ludGVydmFsKSB7CisgICAgICAgIAorICAgICAgICB0aGlzLmxkckNoZWNrSW50ZXJ2YWwgPSBsZHJDaGVja0ludGVydmFsOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBsb2FkZXIgcmVsb2FkYWJsZSBib29sZWFuIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGRyUmVsb2FkYWJsZSgpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLmxkclJlbG9hZGFibGU7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGxvYWRlciByZWxvYWRhYmxlIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExkclJlbG9hZGFibGUoU3RyaW5nIGxkclJlbG9hZGFibGUpIHsKKyAgICAgICAgCisgICAgICAgIHRoaXMubGRyUmVsb2FkYWJsZSA9IGxkclJlbG9hZGFibGU7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHNlc3Npb24gbWFuYWdlciBjaGVjayBpbnRlcnZhbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE1nckNoZWNrSW50ZXJ2YWwoKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy5tZ3JDaGVja0ludGVydmFsOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzZXNzaW9uIG1hbmFnZXIgQ2hlY2sgSW50ZXJ2YWwuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWdyQ2hlY2tJbnRlcnZhbChTdHJpbmcgbWdyQ2hlY2tJbnRlcnZhbCkgeworICAgICAgICAKKyAgICAgICAgdGhpcy5tZ3JDaGVja0ludGVydmFsID0gbWdyQ2hlY2tJbnRlcnZhbDsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2Vzc2lvbiBJRCBpbml0aWFsaXplci4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE1nclNlc3Npb25JREluaXQoKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy5tZ3JTZXNzaW9uSURJbml0OworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBtZ3IgU2Vzc2lvbiBJRCBJbml0aXppYWxpemVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1nclNlc3Npb25JREluaXQoU3RyaW5nIG1nclNlc3Npb25JREluaXQpIHsKKyAgICAgICAgCisgICAgICAgIHRoaXMubWdyU2Vzc2lvbklESW5pdCA9IG1nclNlc3Npb25JREluaXQ7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIFNlc3Npb24gbWdyIG1heGltdW0gYWN0aXZlIHNlc3Npb25zLgorICAgICAqLworICAgIAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWdyTWF4U2Vzc2lvbnMoKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy5tZ3JNYXhTZXNzaW9uczsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgU2Vzc2lvbiBtZ3IgbWF4aW11bSBhY3RpdmUgc2Vzc2lvbnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWdyTWF4U2Vzc2lvbnMoU3RyaW5nIG1nck1heFNlc3Npb25zKSB7CisgICAgICAgIAorICAgICAgICB0aGlzLm1nck1heFNlc3Npb25zID0gbWdyTWF4U2Vzc2lvbnM7CisgICAgICAgIAorICAgIH0KKyAgICAgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisgICAgCisgICAgLyoqCisgICAgICogUmVzZXQgYWxsIHByb3BlcnRpZXMgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgbWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlc2V0KEFjdGlvbk1hcHBpbmcgbWFwcGluZywgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgCisgICAgICAgIHRoaXMub2JqZWN0TmFtZSA9IG51bGw7CisgICAgICAgIHRoaXMucGFyZW50T2JqZWN0TmFtZSA9IG51bGw7CisgICAgICAgIHRoaXMubG9hZGVyT2JqZWN0TmFtZSA9IG51bGw7CisgICAgICAgIHRoaXMubWFuYWdlck9iamVjdE5hbWUgPSBudWxsOworICAgICAgICAKKyAgICAgICAgLy8gZGVmYXVsdCBjb250ZXh0IHByb3BlcnRpZXMKKyAgICAgICAgdGhpcy5jb29raWVzID0gInRydWUiOworICAgICAgICB0aGlzLmNyb3NzQ29udGV4dCA9ICJ0cnVlIjsKKyAgICAgICAgdGhpcy5yZWxvYWRhYmxlID0gImZhbHNlIjsKKyAgICAgICAgdGhpcy5zd2FsbG93T3V0cHV0ID0gImZhbHNlIjsKKyAgICAgICAgdGhpcy51c2VOYW1pbmcgPSAidHJ1ZSI7CisgICAgICAgIAorICAgICAgICAvLyBsb2FkZXIgcHJvcGVydGllcworICAgICAgICB0aGlzLmxkckNoZWNrSW50ZXJ2YWwgPSAiMTUiOworICAgICAgICB0aGlzLmxkclJlbG9hZGFibGUgPSAidHJ1ZSI7CisgICAgICAgIAorICAgICAgICAvLyBzZXNzaW9uIG1hbmFnZXIgcHJvcGVydGllcworICAgICAgICB0aGlzLm1nckNoZWNrSW50ZXJ2YWwgPSAiNjAiOworICAgICAgICB0aGlzLm1nclNlc3Npb25JREluaXQgPSAiMCI7CisgICAgICAgIHRoaXMubWdyTWF4U2Vzc2lvbnMgPSAiLTEiOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZW5kZXIgdGhpcyBvYmplY3QgYXMgYSBTdHJpbmcuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCJEZWZhdWx0Q29udGV4dEZvcm1bYWRtaW5BY3Rpb249Iik7CisgICAgICAgIHNiLmFwcGVuZChhZG1pbkFjdGlvbik7CisgICAgICAgIHNiLmFwcGVuZCgiLGNvb2tpZXM9Iik7CisgICAgICAgIHNiLmFwcGVuZChjb29raWVzKTsKKyAgICAgICAgc2IuYXBwZW5kKCIsY3Jvc3NDb250ZXh0PSIpOworICAgICAgICBzYi5hcHBlbmQoY3Jvc3NDb250ZXh0KTsKKyAgICAgICAgc2IuYXBwZW5kKCIscmVsb2FkYWJsZT0iKTsKKyAgICAgICAgc2IuYXBwZW5kKHJlbG9hZGFibGUpOworICAgICAgICBzYi5hcHBlbmQoIixzd2FsbG93T3V0cHV0PSIpOworICAgICAgICBzYi5hcHBlbmQoc3dhbGxvd091dHB1dCk7CisgICAgICAgIHNiLmFwcGVuZCgiLHVzZU5hbWluZz0iKTsKKyAgICAgICAgc2IuYXBwZW5kKHVzZU5hbWluZyk7ICAgICAgICAKKyAgICAgICAgLy8gbG9hZGVyIHByb3BlcnRpZXMKKyAgICAgICAgc2IuYXBwZW5kKCIsbGRyQ2hlY2tJbnRlcnZhbD0iKTsKKyAgICAgICAgc2IuYXBwZW5kKGxkckNoZWNrSW50ZXJ2YWwpOyAgICAgICAgCisgICAgICAgIHNiLmFwcGVuZCgiLGxkclJlbG9hZGFibGU9Iik7CisgICAgICAgIHNiLmFwcGVuZChsZHJSZWxvYWRhYmxlKTsKKyAgICAgICAgLy8gbWFuYWdlciBwcm9wZXJ0aWVzCisgICAgICAgIHNiLmFwcGVuZCgiLG1nckNoZWNrSW50ZXJ2YWw9Iik7CisgICAgICAgIHNiLmFwcGVuZChtZ3JDaGVja0ludGVydmFsKTsKKyAgICAgICAgc2IuYXBwZW5kKCIsbWdyU2Vzc2lvbklESW5pdD0iKTsKKyAgICAgICAgc2IuYXBwZW5kKG1nclNlc3Npb25JREluaXQpOworICAgICAgICBzYi5hcHBlbmQoIixtZ3JNYXhTZXNzaW9ucz0iKTsKKyAgICAgICAgc2IuYXBwZW5kKG1nck1heFNlc3Npb25zKTsKKyAgICAgICAgLy8gb2JqZWN0IG5hbWVzCisgICAgICAgIHNiLmFwcGVuZCgiJyxvYmplY3ROYW1lPSciKTsKKyAgICAgICAgc2IuYXBwZW5kKG9iamVjdE5hbWUpOworICAgICAgICBzYi5hcHBlbmQoIicscGFyZW50T2JqZWN0TmFtZT0iKTsKKyAgICAgICAgc2IuYXBwZW5kKHBhcmVudE9iamVjdE5hbWUpOworICAgICAgICBzYi5hcHBlbmQoIicsbG9hZGVyT2JqZWN0TmFtZT0iKTsKKyAgICAgICAgc2IuYXBwZW5kKGxvYWRlck9iamVjdE5hbWUpOworICAgICAgICBzYi5hcHBlbmQoIicsbWFuYWdlck9iamVjdE5hbWU9Iik7CisgICAgICAgIHNiLmFwcGVuZChtYW5hZ2VyT2JqZWN0TmFtZSk7CisgICAgICAgIHNiLmFwcGVuZCgiXSIpOworICAgICAgICByZXR1cm4gKHNiLnRvU3RyaW5nKCkpOworCisgICAgfQorICAgIC8qKgorICAgICAqIFZhbGlkYXRlIHRoZSBwcm9wZXJ0aWVzIHRoYXQgaGF2ZSBiZWVuIHNldCBmcm9tIHRoaXMgSFRUUCByZXF1ZXN0LAorICAgICAqIGFuZCByZXR1cm4gYW4gPGNvZGU+QWN0aW9uRXJyb3JzPC9jb2RlPiBvYmplY3QgdGhhdCBlbmNhcHN1bGF0ZXMgYW55CisgICAgICogdmFsaWRhdGlvbiBlcnJvcnMgdGhhdCBoYXZlIGJlZW4gZm91bmQuICBJZiBubyBlcnJvcnMgYXJlIGZvdW5kLCByZXR1cm4KKyAgICAgKiA8Y29kZT5udWxsPC9jb2RlPiBvciBhbiA8Y29kZT5BY3Rpb25FcnJvcnM8L2NvZGU+IG9iamVjdCB3aXRoIG5vCisgICAgICogcmVjb3JkZWQgZXJyb3IgbWVzc2FnZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgbWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqLworICAgIAorICAgIHByaXZhdGUgQWN0aW9uRXJyb3JzIGVycm9yczsKKyAgICAKKyAgICBwdWJsaWMgQWN0aW9uRXJyb3JzIHZhbGlkYXRlKEFjdGlvbk1hcHBpbmcgbWFwcGluZywKKyAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICAKKyAgICAgICAgZXJyb3JzID0gbmV3IEFjdGlvbkVycm9ycygpOworICAgICAgICAKKyAgICAgICAgU3RyaW5nIHN1Ym1pdCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJzdWJtaXQiKTsKKyAgICAgICAgCisgICAgICAgIC8vIGZyb250IGVuZCB2YWxpZGF0aW9uIHdoZW4gc2F2ZSBpcyBjbGlja2VkLgorICAgICAgICBpZiAoc3VibWl0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gbG9hZGVyIHByb3BlcnRpZXMKKyAgICAgICAgICAgIC8vIEZJWE1FLS0gdmVyaWZ5IGlmIHRoZXNlIHJhbmdlcyBhcmUgb2suCisgICAgICAgICAgICBudW1iZXJDaGVjaygibGRyQ2hlY2tJbnRlcnZhbCIsIGxkckNoZWNrSW50ZXJ2YWwgICwgdHJ1ZSwgMCwgMTAwMDApOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBzZXNzaW9uIG1hbmFnZXIgcHJvcGVydGllcyAgICAgICAgICAgIAorICAgICAgICAgICAgbnVtYmVyQ2hlY2soIm1nckNoZWNrSW50ZXJ2YWwiLCAgbWdyQ2hlY2tJbnRlcnZhbCwgdHJ1ZSwgMCwgMTAwMDApOworICAgICAgICAgICAgbnVtYmVyQ2hlY2soIm1nck1heFNlc3Npb25zIiwgIG1nck1heFNlc3Npb25zLCBmYWxzZSwgLTEsIDEwMCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vaWYgKChtZ3JTZXNzaW9uSURJbml0ID09IG51bGwpIHx8IChtZ3JTZXNzaW9uSURJbml0Lmxlbmd0aCgpIDwgMSkpIHsKKyAgICAgICAgICAgIC8vICAgIGVycm9ycy5hZGQoIm1nclNlc3Npb25JREluaXQiLCBuZXcgQWN0aW9uRXJyb3IoImVycm9yLm1nclNlc3Npb25JREluaXQucmVxdWlyZWQiKSk7CisgICAgICAgICAgICAvL30KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIGVycm9yczsKKyAgICB9CisgICAgCisgICAgLyoKKyAgICAgKiBIZWxwZXIgbWV0aG9kIHRvIGNoZWNrIHRoYXQgaXQgaXMgYSByZXF1aXJlZCBudW1iZXIgYW5kCisgICAgICogaXMgYSB2YWxpZCBpbnRlZ2VyIHdpdGhpbiB0aGUgZ2l2ZW4gcmFuZ2UuIChtaW4sIG1heCkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gIGZpZWxkICBUaGUgZmllbGQgbmFtZSBpbiB0aGUgZm9ybSBmb3Igd2hpY2ggdGhpcyBlcnJvciBvY2N1cmVkLgorICAgICAqIEBwYXJhbSAgbnVtVGV4dCAgVGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgbnVtYmVyLgorICAgICAqIEBwYXJhbSByYW5nZUNoZWNrICBCb29sZWFuIHZhbHVlIHNldCB0byB0cnVlIG9mIHJlYW5nZSBjaGVjayBzaG91bGQgYmUgcGVyZm9ybWVkLgorICAgICAqCisgICAgICogQHBhcmFtICBtaW4gIFRoZSBsb3dlciBsaW1pdCBvZiB0aGUgcmFuZ2UKKyAgICAgKiBAcGFyYW0gIG1heCAgVGhlIHVwcGVyIGxpbWl0IG9mIHRoZSByYW5nZQorICAgICAqCisgICAgICovCisgICAgCisgICAgcHJpdmF0ZSB2b2lkIG51bWJlckNoZWNrKFN0cmluZyBmaWVsZCwgU3RyaW5nIG51bVRleHQsIGJvb2xlYW4gcmFuZ2VDaGVjaywKKyAgICBpbnQgbWluLCBpbnQgbWF4KSB7CisgICAgICAgIAorICAgICAgICAvLyBDaGVjayBmb3IgJ2lzIHJlcXVpcmVkJworICAgICAgICBpZiAoKG51bVRleHQgPT0gbnVsbCkgfHwgKG51bVRleHQubGVuZ3RoKCkgPCAxKSkgeworICAgICAgICAgICAgZXJyb3JzLmFkZChmaWVsZCwgbmV3IEFjdGlvbkVycm9yKCJlcnJvci4iK2ZpZWxkKyIucmVxdWlyZWQiKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIGNoZWNrIGZvciAnbXVzdCBiZSBhIG51bWJlcicgaW4gdGhlICd2YWxpZCByYW5nZScKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaW50IG51bSA9IEludGVnZXIucGFyc2VJbnQobnVtVGV4dCk7CisgICAgICAgICAgICAgICAgLy8gcGVyZm9ybSByYW5nZSBjaGVjayBvbmx5IGlmIHJlcXVpcmVkCisgICAgICAgICAgICAgICAgaWYgKHJhbmdlQ2hlY2spIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChudW0gPCBtaW4pIHx8IChudW0gPiBtYXggKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFjdGlvbkVycm9yKCJlcnJvci4iKyBmaWVsZCArIi5yYW5nZSIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoZmllbGQsCisgICAgICAgICAgICAgICAgbmV3IEFjdGlvbkVycm9yKCJlcnJvci4iKyBmaWVsZCArICIuZm9ybWF0IikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL2RlZmF1bHRjb250ZXh0L0RlZmF1bHRDb250ZXh0c0Zvcm0uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9kZWZhdWx0Y29udGV4dC9EZWZhdWx0Q29udGV4dHNGb3JtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdhMDg0NgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9kZWZhdWx0Y29udGV4dC9EZWZhdWx0Q29udGV4dHNGb3JtLmphdmEKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLmRlZmF1bHRjb250ZXh0OworCisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworCisKKy8qKgorICogRm9ybSBiZWFuIGZvciBkZWxldGluZyBkZWZhdWx0IGNvbnRleHRzLgorICoKKyAqIEBhdXRob3IgQW15IFJvaAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgRGVmYXVsdENvbnRleHRzRm9ybSBleHRlbmRzIEFjdGlvbkZvcm0geworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogVGhlIG9iamVjdCBuYW1lcyBvZiB0aGUgZGVmYXVsdCBjb250ZXh0cyB0byBiZSBkZWxldGVkLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGRlZmF1bHRDb250ZXh0c1tdID0gbmV3IFN0cmluZ1swXTsKKworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXREZWZhdWx0Q29udGV4dHMoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5kZWZhdWx0Q29udGV4dHMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHRDb250ZXh0cyhTdHJpbmcgZGVmYXVsdENvbnRleHRzW10pIHsKKyAgICAgICAgdGhpcy5kZWZhdWx0Q29udGV4dHMgPSBkZWZhdWx0Q29udGV4dHM7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmVzZXQgYWxsIHByb3BlcnRpZXMgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgbWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlc2V0KEFjdGlvbk1hcHBpbmcgbWFwcGluZywgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKworICAgICAgICB0aGlzLmRlZmF1bHRDb250ZXh0cyA9IG5ldyBTdHJpbmdbMF07CisKKyAgICB9CisgICAgICAgIAorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vZGVmYXVsdGNvbnRleHQvRGVsZXRlRGVmYXVsdENvbnRleHRBY3Rpb24uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9kZWZhdWx0Y29udGV4dC9EZWxldGVEZWZhdWx0Q29udGV4dEFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwNmFlODEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vZGVmYXVsdGNvbnRleHQvRGVsZXRlRGVmYXVsdENvbnRleHRBY3Rpb24uamF2YQpAQCAtMCwwICsxLDE2MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAxLTIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5kZWZhdWx0Y29udGV4dDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRXJyb3JzOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3J3YXJkOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworCitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyRmFjdG9yeTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LlF1ZXJ5RXhwOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuUXVlcnk7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3RJbnN0YW5jZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5KTUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy51dGlsLk1lc3NhZ2VSZXNvdXJjZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5BcHBsaWNhdGlvblNlcnZsZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uVG9tY2F0VHJlZUJ1aWxkZXI7CisKKy8qKgorICogVGhlIDxjb2RlPkFjdGlvbjwvY29kZT4gdGhhdCBzZXRzIHVwIDxlbT5EZWxldGUgRGVmYXVsdENvbnRleHRzPC9lbT4gdHJhbnNhY3Rpb25zLgorICoKKyAqIEBhdXRob3IgQW15IFJvaAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgRGVsZXRlRGVmYXVsdENvbnRleHRBY3Rpb24gZXh0ZW5kcyBBY3Rpb24geworICAgIAorCisgICAgLyoqCisgICAgICogVGhlIE1CZWFuU2VydmVyIHdlIHdpbGwgYmUgaW50ZXJhY3Rpbmcgd2l0aC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1CZWFuU2VydmVyIG1CU2VydmVyID0gbnVsbDsKKyAgICAKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworICAgIAorICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIHNwZWNpZmllZCBIVFRQIHJlcXVlc3QsIGFuZCBjcmVhdGUgdGhlIGNvcnJlc3BvbmRpbmcgSFRUUAorICAgICAqIHJlc3BvbnNlIChvciBmb3J3YXJkIHRvIGFub3RoZXIgd2ViIGNvbXBvbmVudCB0aGF0IHdpbGwgY3JlYXRlIGl0KS4KKyAgICAgKiBSZXR1cm4gYW4gPGNvZGU+QWN0aW9uRm9yd2FyZDwvY29kZT4gaW5zdGFuY2UgZGVzY3JpYmluZyB3aGVyZSBhbmQgaG93CisgICAgICogY29udHJvbCBzaG91bGQgYmUgZm9yd2FyZGVkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcmVzcG9uc2UgaGFzCisgICAgICogYWxyZWFkeSBiZWVuIGNvbXBsZXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBBY3Rpb25NYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gYWN0aW9uRm9ybSBUaGUgb3B0aW9uYWwgQWN0aW9uRm9ybSBiZWFuIGZvciB0aGlzIHJlcXVlc3QgKGlmIGFueSkKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgSFRUUCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBIVFRQIHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBleGNlcHRpb24gb2NjdXJzCisgICAgICovCisgICAgcHVibGljIEFjdGlvbkZvcndhcmQgcGVyZm9ybShBY3Rpb25NYXBwaW5nIG1hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb25Gb3JtIGZvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisgICAgICAgIAorCisgICAgICAgIC8vIEFjcXVpcmUgdGhlIHJlc291cmNlcyB0aGF0IHdlIG5lZWQKKyAgICAgICAgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpOworICAgICAgICBMb2NhbGUgbG9jYWxlID0gZ2V0TG9jYWxlKHJlcXVlc3QpOworICAgICAgICBNZXNzYWdlUmVzb3VyY2VzIHJlc291cmNlcyA9IGdldFJlc291cmNlcyhyZXF1ZXN0KTsKKyAgICAgICAgCisgICAgICAgIC8vIEFjcXVpcmUgYSByZWZlcmVuY2UgdG8gdGhlIE1CZWFuU2VydmVyIGNvbnRhaW5pbmcgb3VyIE1CZWFucworICAgICAgICB0cnkgeworICAgICAgICAgICAgbUJTZXJ2ZXIgPSAoKEFwcGxpY2F0aW9uU2VydmxldCkgZ2V0U2VydmxldCgpKS5nZXRTZXJ2ZXIoKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uCisgICAgICAgICAgICAoIkNhbm5vdCBhY3F1aXJlIE1CZWFuU2VydmVyIHJlZmVyZW5jZSIsIHQpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBvYmplY3QgbmFtZSB0aGF0IGZvcm1zIHRoZSBiYXNpcyBvZiB0aGUgc2VhcmNoIHBhdHRlcm4KKyAgICAgICAgLy8gdG8gZ2V0IGxpc3Qgb2YgYWxsIGF2YWlsYWJsZSBkZWZhdWx0IGNvbnRleHRzCisgICAgICAgIFN0cmluZyBwYXR0ZXJuT2JqZWN0ID0gbnVsbDsKKyAgICAgICAgCisgICAgICAgIC8vIFNldCB1cCBhIGZvcm0gYmVhbiBjb250YWluaW5nIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQKKyAgICAgICAgLy8gb2JqZWN0cyB0byBiZSBkZWxldGVkCisgICAgICAgIERlZmF1bHRDb250ZXh0c0Zvcm0gZGVmYXVsdENvbnRleHRzRm9ybSA9IG5ldyBEZWZhdWx0Q29udGV4dHNGb3JtKCk7CisgICAgICAgIFN0cmluZyBzZWxlY3QgPSByZXF1ZXN0LmdldFBhcmFtZXRlcigic2VsZWN0Iik7CisgICAgICAgIGlmIChzZWxlY3QgIT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nIGRlZmF1bHRDb250ZXh0c1tdID0gbmV3IFN0cmluZ1sxXTsKKyAgICAgICAgICAgIGRlZmF1bHRDb250ZXh0c1swXSA9IHNlbGVjdDsKKyAgICAgICAgICAgIGRlZmF1bHRDb250ZXh0c0Zvcm0uc2V0RGVmYXVsdENvbnRleHRzKGRlZmF1bHRDb250ZXh0cyk7CisgICAgICAgICAgICBwYXR0ZXJuT2JqZWN0ID0gc2VsZWN0OworICAgICAgICB9ICAgICAgICAKKyAgICAgICAgcmVxdWVzdC5zZXRBdHRyaWJ1dGUoImRlZmF1bHRDb250ZXh0c0Zvcm0iLCBkZWZhdWx0Q29udGV4dHNGb3JtKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgLy8gZ2V0IHRoZSBwYXJlbnQgaG9zdCBvYmplY3QgbmFtZQorICAgICAgICBTdHJpbmcgcGFyZW50ID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoInBhcmVudCIpOworICAgICAgICBpZiAocGFyZW50ICE9IG51bGwpIHsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBwYXR0ZXJuT2JqZWN0ID0gcGFyZW50OworICAgICAgICB9IAorICAgICAgICAKKyAgICAgICAgLy8gRklYTUUgZGVsZXRlIERlZmF1bHRDb250ZXh0IG5vdCBzdXBwb3J0ZWQgeWV0CisgICAgICAgIC8vIEFjY3VtdWxhdGUgYSBsaXN0IG9mIGFsbCBhdmFpbGFibGUgY29udGV4dHMKKyAgICAgICAgQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBPYmplY3ROYW1lIHBvbmFtZSA9IG5ldyBPYmplY3ROYW1lKHBhdHRlcm5PYmplY3QpOworICAgICAgICAgICAgU3RyaW5nIGhvc3QgPSBwb25hbWUuZ2V0S2V5UHJvcGVydHkoImhvc3QiKTsKKyAgICAgICAgICAgIFN0cmluZyBwYXR0ZXJuID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChob3N0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBwYXR0ZXJuID0gcG9uYW1lLmdldERvbWFpbigpKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVG9tY2F0VHJlZUJ1aWxkZXIuREVGQVVMVENPTlRFWFRfVFlQRSArCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRvbWNhdFRyZWVCdWlsZGVyLldJTERDQVJEICsgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAiLGhvc3Q9IiArIHBvbmFtZS5nZXRLZXlQcm9wZXJ0eSgiaG9zdCIpOyAKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcGF0dGVybiA9IHBvbmFtZS5nZXREb21haW4oKSsgCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRvbWNhdFRyZWVCdWlsZGVyLkRFRkFVTFRDT05URVhUX1RZUEU7IAorICAgICAgICAgICAgfSAgIAorICAgICAgICAgICAgLy8gZ2V0IGFsbCBhdmFpbGFibGUgY29udGV4dHMgb25seSBmb3IgdGhpcyBob3N0CisgICAgICAgICAgICBJdGVyYXRvciBpdGVtcyA9CisgICAgICAgICAgICAgICAgbUJTZXJ2ZXIucXVlcnlOYW1lcyhuZXcgT2JqZWN0TmFtZShwYXR0ZXJuKSwgbnVsbCkuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIHdoaWxlIChpdGVtcy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBsaXN0LmFkZChpdGVtcy5uZXh0KCkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nCisgICAgICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLnNlbGVjdCIpKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3Iuc2VsZWN0IikpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgfQorICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KGxpc3QpOworICAgICAgICByZXF1ZXN0LnNldEF0dHJpYnV0ZSgiY29udGV4dHNMaXN0IiwgbGlzdCk7CisgICAgICAgIAorICAgICAgICAvLyBGb3J3YXJkIHRvIHRoZSBsaXN0IGRpc3BsYXkgcGFnZQorICAgICAgICByZXR1cm4gKG1hcHBpbmcuZmluZEZvcndhcmQoIkRlZmF1bHRDb250ZXh0cyIpKTsKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL2RlZmF1bHRjb250ZXh0L0RlbGV0ZURlZmF1bHRDb250ZXh0c0FjdGlvbi5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL2RlZmF1bHRjb250ZXh0L0RlbGV0ZURlZmF1bHRDb250ZXh0c0FjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1YjBkZGQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vZGVmYXVsdGNvbnRleHQvRGVsZXRlRGVmYXVsdENvbnRleHRzQWN0aW9uLmphdmEKQEAgLTAsMCArMSwxNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLmRlZmF1bHRjb250ZXh0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3RJbnN0YW5jZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lm1vZGVsbWJlYW4uTW9kZWxNQmVhbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9ybTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9yd2FyZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy51dGlsLk1lc3NhZ2VSZXNvdXJjZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5BcHBsaWNhdGlvblNlcnZsZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uVG9tY2F0VHJlZUJ1aWxkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uVHJlZUNvbnRyb2w7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uVHJlZUNvbnRyb2xOb2RlOworCisKKy8qKgorICogVGhlIDxjb2RlPkFjdGlvbjwvY29kZT4gdGhhdCBjb21wbGV0ZXMgPGVtPkRlbGV0ZSBEZWZhdWx0IENvbnRleHRzPC9lbT4KKyAqIHRyYW5zYWN0aW9ucy4KKyAqCisgKiBAYXV0aG9yIEFteSBSb2gKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIERlbGV0ZURlZmF1bHRDb250ZXh0c0FjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisKKworICAgIC8qKgorICAgICAqIFNpZ25hdHVyZSBmb3IgdGhlIDxjb2RlPnJlbW92ZURlZmF1bHRDb250ZXh0PC9jb2RlPiBvcGVyYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcmVtb3ZlRGVmYXVsdENvbnRleHRUeXBlc1tdID0KKyAgICB7ICJqYXZhLmxhbmcuU3RyaW5nIiwgICAgICAvLyBPYmplY3QgbmFtZQorICAgIH07CisKKworICAgIC8qKgorICAgICAqIFRoZSBNQmVhblNlcnZlciB3ZSB3aWxsIGJlIGludGVyYWN0aW5nIHdpdGguCisgICAgICovCisgICAgcHJpdmF0ZSBNQmVhblNlcnZlciBtQlNlcnZlciA9IG51bGw7CisgICAgCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBzcGVjaWZpZWQgSFRUUCByZXF1ZXN0LCBhbmQgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIEhUVFAKKyAgICAgKiByZXNwb25zZSAob3IgZm9yd2FyZCB0byBhbm90aGVyIHdlYiBjb21wb25lbnQgdGhhdCB3aWxsIGNyZWF0ZSBpdCkuCisgICAgICogUmV0dXJuIGFuIDxjb2RlPkFjdGlvbkZvcndhcmQ8L2NvZGU+IGluc3RhbmNlIGRlc2NyaWJpbmcgd2hlcmUgYW5kIGhvdworICAgICAqIGNvbnRyb2wgc2hvdWxkIGJlIGZvcndhcmRlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHJlc3BvbnNlIGhhcworICAgICAqIGFscmVhZHkgYmVlbiBjb21wbGV0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgQWN0aW9uTWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIGFjdGlvbkZvcm0gVGhlIG9wdGlvbmFsIEFjdGlvbkZvcm0gYmVhbiBmb3IgdGhpcyByZXF1ZXN0IChpZiBhbnkpCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIEhUVFAgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgSFRUUCByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXhjZXB0aW9uIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBBY3Rpb25Gb3J3YXJkIHBlcmZvcm0oQWN0aW9uTWFwcGluZyBtYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uRm9ybSBmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworICAgICAgICAKKyAgICAgICAgCisgICAgICAgIC8vIExvb2sgdXAgdGhlIGNvbXBvbmVudHMgd2Ugd2lsbCBiZSB1c2luZyBhcyBuZWVkZWQKKyAgICAgICAgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpOworICAgICAgICBMb2NhbGUgbG9jYWxlID0gZ2V0TG9jYWxlKHJlcXVlc3QpOworICAgICAgICBNZXNzYWdlUmVzb3VyY2VzIHJlc291cmNlcyA9IGdldFJlc291cmNlcyhyZXF1ZXN0KTsKKworICAgICAgICAvLyBBY3F1aXJlIGEgcmVmZXJlbmNlIHRvIHRoZSBNQmVhblNlcnZlciBjb250YWluaW5nIG91ciBNQmVhbnMKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1CU2VydmVyID0gKChBcHBsaWNhdGlvblNlcnZsZXQpIGdldFNlcnZsZXQoKSkuZ2V0U2VydmVyKCk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbgorICAgICAgICAgICAgKCJDYW5ub3QgYWNxdWlyZSBNQmVhblNlcnZlciByZWZlcmVuY2UiLCB0KTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAvLyA9PSBmaXggdGhpcyBsYXRlcgorICAgICAgICAvLyBEZWxldGUgdGhlIHNwZWNpZmllZCBEZWZhdWx0Q29udGV4dAorICAgICAgICBTdHJpbmcgZGVmYXVsdENvbnRleHRzW10gID0gKChEZWZhdWx0Q29udGV4dHNGb3JtKSBmb3JtKS5nZXREZWZhdWx0Q29udGV4dHMoKTsKKyAgICAgICAgU3RyaW5nIHZhbHVlc1tdID0gbmV3IFN0cmluZ1sxXTsKKyAgICAgICAgU3RyaW5nIG9wZXJhdGlvbiA9ICJyZW1vdmVEZWZhdWx0Q29udGV4dCI7CisKKyAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgLy8gTG9vayB1cCBvdXIgdHJlZSBjb250cm9sIGRhdGEgc3RydWN0dXJlCisgICAgICAgICAgICBUcmVlQ29udHJvbCBjb250cm9sID0gKFRyZWVDb250cm9sKQorICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0QXR0cmlidXRlKCJ0cmVlQ29udHJvbFRlc3QiKTsKKworICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBzcGVjaWZpZWQgZGVmYXVsdCBjb250ZXh0cworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZWZhdWx0Q29udGV4dHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICB2YWx1ZXNbMF0gPSBkZWZhdWx0Q29udGV4dHNbaV07CisgICAgICAgICAgICAgICAgaWYgKGNvbnRyb2wgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBjb250cm9sLnNlbGVjdE5vZGUobnVsbCk7CisgICAgICAgICAgICAgICAgICAgIFRyZWVDb250cm9sTm9kZSBub2RlID0gY29udHJvbC5maW5kTm9kZShkZWZhdWx0Q29udGV4dHNbaV0pOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZG9tYWluID0gbm9kZS5nZXREb21haW4oKTsKKyAgICAgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSBmbmFtZSA9IFRvbWNhdFRyZWVCdWlsZGVyLmdldE1CZWFuRmFjdG9yeSgpOworICAgICAgICAgICAgICAgICAgICBtQlNlcnZlci5pbnZva2UoZm5hbWUsIG9wZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLCByZW1vdmVEZWZhdWx0Q29udGV4dFR5cGVzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5yZW1vdmUoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2coIk1pc3NpbmcgVHJlZUNvbnRyb2xOb2RlIGZvciAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdENvbnRleHRzW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2coIk1pc3NpbmcgVHJlZUNvbnRyb2wgYXR0cmlidXRlIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nCisgICAgICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmludm9rZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbiksIGUpOworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5pbnZva2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24pKTsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlcG9ydCBzdWNjZXNzZnVsIGNvbXBsZXRpb24gb2YgdGhpcyB0cmFuc2FjdGlvbgorICAgICAgICByZXR1cm4gKG1hcHBpbmcuZmluZEZvcndhcmQoIlNhdmUgU3VjY2Vzc2Z1bCIpKTsKKworICAgIH0KKyAgICAKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9kZWZhdWx0Y29udGV4dC9FZGl0RGVmYXVsdENvbnRleHRBY3Rpb24uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9kZWZhdWx0Y29udGV4dC9FZGl0RGVmYXVsdENvbnRleHRBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzJkODUzCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL2RlZmF1bHRjb250ZXh0L0VkaXREZWZhdWx0Q29udGV4dEFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjIzIEBACisvKgorICogQ29weXJpZ2h0IDIwMDEtMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5kZWZhdWx0Y29udGV4dDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRXJyb3JzOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3J3YXJkOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLnV0aWwuTWVzc2FnZVJlc291cmNlczsKKworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3RJbnN0YW5jZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5KTUV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkFwcGxpY2F0aW9uU2VydmxldDsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5MYWJlbFZhbHVlQmVhbjsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5MaXN0czsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5Ub21jYXRUcmVlQnVpbGRlcjsKKworLyoqCisgKiBUaGUgPGNvZGU+QWN0aW9uPC9jb2RlPiB0aGF0IHNldHMgdXAgPGVtPkVkaXQgRGVmYXVsdENvbnRleHQ8L2VtPiB0cmFuc2FjdGlvbnMuCisgKgorICogQGF1dGhvciBBbXkgUm9oCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBFZGl0RGVmYXVsdENvbnRleHRBY3Rpb24gZXh0ZW5kcyBBY3Rpb24geworICAgIAorCisgICAgLyoqCisgICAgICogVGhlIE1CZWFuU2VydmVyIHdlIHdpbGwgYmUgaW50ZXJhY3Rpbmcgd2l0aC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1CZWFuU2VydmVyIG1CU2VydmVyID0gbnVsbDsKKyAgICAKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworICAgIAorICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIHNwZWNpZmllZCBIVFRQIHJlcXVlc3QsIGFuZCBjcmVhdGUgdGhlIGNvcnJlc3BvbmRpbmcgSFRUUAorICAgICAqIHJlc3BvbnNlIChvciBmb3J3YXJkIHRvIGFub3RoZXIgd2ViIGNvbXBvbmVudCB0aGF0IHdpbGwgY3JlYXRlIGl0KS4KKyAgICAgKiBSZXR1cm4gYW4gPGNvZGU+QWN0aW9uRm9yd2FyZDwvY29kZT4gaW5zdGFuY2UgZGVzY3JpYmluZyB3aGVyZSBhbmQgaG93CisgICAgICogY29udHJvbCBzaG91bGQgYmUgZm9yd2FyZGVkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcmVzcG9uc2UgaGFzCisgICAgICogYWxyZWFkeSBiZWVuIGNvbXBsZXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBBY3Rpb25NYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gYWN0aW9uRm9ybSBUaGUgb3B0aW9uYWwgQWN0aW9uRm9ybSBiZWFuIGZvciB0aGlzIHJlcXVlc3QgKGlmIGFueSkKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgSFRUUCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBIVFRQIHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBleGNlcHRpb24gb2NjdXJzCisgICAgICovCisgICAgcHVibGljIEFjdGlvbkZvcndhcmQgcGVyZm9ybShBY3Rpb25NYXBwaW5nIG1hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb25Gb3JtIGZvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisgICAgICAgIAorICAgICAgICAvLyBBY3F1aXJlIHRoZSByZXNvdXJjZXMgdGhhdCB3ZSBuZWVkCisgICAgICAgIEh0dHBTZXNzaW9uIHNlc3Npb24gPSByZXF1ZXN0LmdldFNlc3Npb24oKTsKKyAgICAgICAgTG9jYWxlIGxvY2FsZSA9IGdldExvY2FsZShyZXF1ZXN0KTsKKyAgICAgICAgTWVzc2FnZVJlc291cmNlcyByZXNvdXJjZXMgPSBnZXRSZXNvdXJjZXMocmVxdWVzdCk7CisgICAgICAgIAorICAgICAgICAvLyBBY3F1aXJlIGEgcmVmZXJlbmNlIHRvIHRoZSBNQmVhblNlcnZlciBjb250YWluaW5nIG91ciBNQmVhbnMKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1CU2VydmVyID0gKChBcHBsaWNhdGlvblNlcnZsZXQpIGdldFNlcnZsZXQoKSkuZ2V0U2VydmVyKCk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbgorICAgICAgICAgICAgKCJDYW5ub3QgYWNxdWlyZSBNQmVhblNlcnZlciByZWZlcmVuY2UiLCB0KTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gU2V0IHVwIHRoZSBvYmplY3QgbmFtZXMgb2YgdGhlIE1CZWFucyB3ZSBhcmUgbWFuaXB1bGF0aW5nCisgICAgICAgIC8vIERlZmF1bHRDb250ZXh0IG1CZWFuCisgICAgICAgIE9iamVjdE5hbWUgY25hbWUgPSBudWxsOworICAgICAgICAvLyBMb2FkZXIgbUJlYW4KKyAgICAgICAgT2JqZWN0TmFtZSBsbmFtZSA9IG51bGw7CisgICAgICAgIC8vIE1hbmFnZXIgbUJlYW4gCisgICAgICAgIE9iamVjdE5hbWUgbW5hbWUgPSBudWxsOworICAgICAgICAKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNuYW1lID0gbmV3IE9iamVjdE5hbWUocmVxdWVzdC5nZXRQYXJhbWV0ZXIoInNlbGVjdCIpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0KKyAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJlcnJvci5jb250ZXh0TmFtZS5iYWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJzZWxlY3QiKSk7CisgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nKG1lc3NhZ2UpOworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfQkFEX1JFUVVFU1QsIG1lc3NhZ2UpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gR2V0IHRoZSBjb3JyZXNwb25kaW5nIGxvYWRlcgorICAgICAgICB0cnkgeworICAgICAgICAgICAgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKGNuYW1lLmdldERvbWFpbigpKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiOnR5cGU9RGVmYXVsdExvYWRlciIpOworICAgICAgICAgICAgU3RyaW5nIGhvc3QgPSBjbmFtZS5nZXRLZXlQcm9wZXJ0eSgiaG9zdCIpOworICAgICAgICAgICAgaWYgKGhvc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiLGhvc3Q9Iik7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGhvc3QpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbG5hbWUgPSBuZXcgT2JqZWN0TmFtZShzYi50b1N0cmluZygpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0KKyAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZSgiZXJyb3IubWFuYWdlck5hbWUuYmFkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZyhtZXNzYWdlKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcihIdHRwU2VydmxldFJlc3BvbnNlLlNDX0JBRF9SRVFVRVNULCBtZXNzYWdlKTsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBTZXNzaW9uIG1hbmFnZXIgcHJvcGVydGllcworICAgICAgICAvLyBHZXQgdGhlIGNvcnJlc3BvbmRpbmcgU2Vzc2lvbiBNYW5hZ2VyIG1CZWFuCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoY25hbWUuZ2V0RG9tYWluKCkpOworICAgICAgICAgICAgc2IuYXBwZW5kKCI6dHlwZT1EZWZhdWx0TWFuYWdlciIpOworICAgICAgICAgICAgU3RyaW5nIGhvc3QgPSBjbmFtZS5nZXRLZXlQcm9wZXJ0eSgiaG9zdCIpOworICAgICAgICAgICAgaWYgKGhvc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiLGhvc3Q9Iik7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGhvc3QpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbW5hbWUgPSBuZXcgT2JqZWN0TmFtZShzYi50b1N0cmluZygpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0KKyAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJlcnJvci5tYW5hZ2VyTmFtZS5iYWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IudG9TdHJpbmcoKSk7CisgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nKG1lc3NhZ2UpOworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfQkFEX1JFUVVFU1QsIG1lc3NhZ2UpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEZpbGwgaW4gdGhlIGZvcm0gdmFsdWVzIGZvciBkaXNwbGF5IGFuZCBlZGl0aW5nCisgICAgICAgIERlZmF1bHRDb250ZXh0Rm9ybSBkZWZhdWx0Q29udGV4dEZtID0gbmV3IERlZmF1bHRDb250ZXh0Rm9ybSgpOworICAgICAgICBzZXNzaW9uLnNldEF0dHJpYnV0ZSgiZGVmYXVsdENvbnRleHRGb3JtIiwgZGVmYXVsdENvbnRleHRGbSk7CisgICAgICAgIGRlZmF1bHRDb250ZXh0Rm0uc2V0QWRtaW5BY3Rpb24oIkVkaXQiKTsKKyAgICAgICAgZGVmYXVsdENvbnRleHRGbS5zZXRPYmplY3ROYW1lKGNuYW1lLnRvU3RyaW5nKCkpOworICAgICAgICBkZWZhdWx0Q29udGV4dEZtLnNldExvYWRlck9iamVjdE5hbWUobG5hbWUudG9TdHJpbmcoKSk7CisgICAgICAgIGRlZmF1bHRDb250ZXh0Rm0uc2V0TWFuYWdlck9iamVjdE5hbWUobW5hbWUudG9TdHJpbmcoKSk7CisgICAgICAgIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiRGVmYXVsdENvbnRleHQiKTsKKyAgICAgICAgZGVmYXVsdENvbnRleHRGbS5zZXROb2RlTGFiZWwoc2IudG9TdHJpbmcoKSk7CisgICAgICAgIGRlZmF1bHRDb250ZXh0Rm0uc2V0Qm9vbGVhblZhbHMoTGlzdHMuZ2V0Qm9vbGVhblZhbHVlcygpKTsKKyAgICAgICAKKyAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZSA9IG51bGw7CisgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgIC8vIENvcHkgc2NhbGFyIHByb3BlcnRpZXMKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJjb29raWVzIjsKKyAgICAgICAgICAgIGRlZmF1bHRDb250ZXh0Rm0uc2V0Q29va2llcworICAgICAgICAgICAgICAgICgoKEJvb2xlYW4pIG1CU2VydmVyLmdldEF0dHJpYnV0ZShjbmFtZSwgYXR0cmlidXRlKSkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAiY3Jvc3NDb250ZXh0IjsKKyAgICAgICAgICAgIGRlZmF1bHRDb250ZXh0Rm0uc2V0Q3Jvc3NDb250ZXh0CisgICAgICAgICAgICAgICAgKCgoQm9vbGVhbikgbUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKGNuYW1lLCBhdHRyaWJ1dGUpKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJ1c2VOYW1pbmciOworICAgICAgICAgICAgZGVmYXVsdENvbnRleHRGbS5zZXRVc2VOYW1pbmcKKyAgICAgICAgICAgICAgICAoKChCb29sZWFuKSBtQlNlcnZlci5nZXRBdHRyaWJ1dGUoY25hbWUsIGF0dHJpYnV0ZSkpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgYXR0cmlidXRlID0gInJlbG9hZGFibGUiOworICAgICAgICAgICAgZGVmYXVsdENvbnRleHRGbS5zZXRSZWxvYWRhYmxlCisgICAgICAgICAgICAgICAgKCgoQm9vbGVhbikgbUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKGNuYW1lLCBhdHRyaWJ1dGUpKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJzd2FsbG93T3V0cHV0IjsKKyAgICAgICAgICAgIGRlZmF1bHRDb250ZXh0Rm0uc2V0U3dhbGxvd091dHB1dAorICAgICAgICAgICAgICAgICgoKEJvb2xlYW4pIG1CU2VydmVyLmdldEF0dHJpYnV0ZShjbmFtZSwgYXR0cmlidXRlKSkudG9TdHJpbmcoKSk7CisKKyAgICAgICAgICAgIC8vIGxvYWRlciBwcm9wZXJ0aWVzCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAiY2hlY2tJbnRlcnZhbCI7CisgICAgICAgICAgICBkZWZhdWx0Q29udGV4dEZtLnNldExkckNoZWNrSW50ZXJ2YWwKKyAgICAgICAgICAgICAgICAoKChJbnRlZ2VyKSBtQlNlcnZlci5nZXRBdHRyaWJ1dGUobG5hbWUsIGF0dHJpYnV0ZSkpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgYXR0cmlidXRlID0gInJlbG9hZGFibGUiOworICAgICAgICAgICAgZGVmYXVsdENvbnRleHRGbS5zZXRMZHJSZWxvYWRhYmxlCisgICAgICAgICAgICAgICAgKCgoQm9vbGVhbikgbUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKGxuYW1lLCBhdHRyaWJ1dGUpKS50b1N0cmluZygpKTsKKworICAgICAgICAgICAgLy8gbWFuYWdlciBwcm9wZXJ0aWVzCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAiZW50cm9weSI7CisgICAgICAgICAgICBkZWZhdWx0Q29udGV4dEZtLnNldE1nclNlc3Npb25JREluaXQKKyAgICAgICAgICAgICAgICAoKFN0cmluZykgbUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKG1uYW1lLCBhdHRyaWJ1dGUpKTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJtYXhBY3RpdmVTZXNzaW9ucyI7CisgICAgICAgICAgICBkZWZhdWx0Q29udGV4dEZtLnNldE1nck1heFNlc3Npb25zCisgICAgICAgICAgICAgICAgKCgoSW50ZWdlcikgbUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKG1uYW1lLCBhdHRyaWJ1dGUpKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJjaGVja0ludGVydmFsIjsKKyAgICAgICAgICAgIGRlZmF1bHRDb250ZXh0Rm0uc2V0TWdyQ2hlY2tJbnRlcnZhbAorICAgICAgICAgICAgICAgICgoKEludGVnZXIpIG1CU2VydmVyLmdldEF0dHJpYnV0ZShtbmFtZSwgYXR0cmlidXRlKSkudG9TdHJpbmcoKSk7CisKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuYXR0cmlidXRlLmdldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSksIHQpOworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5hdHRyaWJ1dGUuZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlKSk7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBGb3J3YXJkIHRvIHRoZSBkZWZhdWx0IGNvbnRleHQgZGlzcGxheSBwYWdlCisgICAgICAgIHJldHVybiAobWFwcGluZy5maW5kRm9yd2FyZCgiRGVmYXVsdENvbnRleHQiKSk7CisgICAgICAgIAorICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vZGVmYXVsdGNvbnRleHQvU2F2ZURlZmF1bHRDb250ZXh0QWN0aW9uLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vZGVmYXVsdGNvbnRleHQvU2F2ZURlZmF1bHRDb250ZXh0QWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc0NGQzZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9kZWZhdWx0Y29udGV4dC9TYXZlRGVmYXVsdENvbnRleHRBY3Rpb24uamF2YQpAQCAtMCwwICsxLDQ0OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAxLTIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uZGVmYXVsdGNvbnRleHQ7CisKKworaW1wb3J0IGphdmEubmV0LlVSTEVuY29kZXI7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LkF0dHJpYnV0ZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXJGYWN0b3J5OworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuUXVlcnlFeHA7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5RdWVyeTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdEluc3RhbmNlOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LkpNRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25FcnJvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRXJyb3JzOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3J3YXJkOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLnV0aWwuTWVzc2FnZVJlc291cmNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5BcHBsaWNhdGlvblNlcnZsZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uVG9tY2F0VHJlZUJ1aWxkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uVHJlZUNvbnRyb2w7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uVHJlZUNvbnRyb2xOb2RlOworCisKKworLyoqCisgKiBUaGUgPGNvZGU+QWN0aW9uPC9jb2RlPiB0aGF0IGNvbXBsZXRlcyA8ZW0+QWRkIERlZmF1bHQgQ29udGV4dDwvZW0+IGFuZAorICogPGVtPkVkaXQgRGVmYXVsdCBDb250ZXh0PC9lbT4gdHJhbnNhY3Rpb25zLgorICoKKyAqIEBhdXRob3IgQW15IFJvaAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgU2F2ZURlZmF1bHRDb250ZXh0QWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKyAgICAvKioKKyAgICAgKiBTaWduYXR1cmUgZm9yIHRoZSA8Y29kZT5jcmVhdGVEZWZhdWx0Q29udGV4dDwvY29kZT4gb3BlcmF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGNyZWF0ZURlZmF1bHRDb250ZXh0VHlwZXNbXSA9CisgICAgeyAiamF2YS5sYW5nLlN0cmluZyIsICAgICAvLyBwYXJlbnQKKyAgICB9OworCisgICAvKioKKyAgICAgKiBTaWduYXR1cmUgZm9yIHRoZSA8Y29kZT5jcmVhdGVTdGFuZGFyZExvYWRlcjwvY29kZT4gb3BlcmF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGNyZWF0ZVN0YW5kYXJkTG9hZGVyVHlwZXNbXSA9CisgICAgeyAiamF2YS5sYW5nLlN0cmluZyIsICAgICAvLyBwYXJlbnQKKyAgICB9OworCisgICAvKioKKyAgICAgKiBTaWduYXR1cmUgZm9yIHRoZSA8Y29kZT5jcmVhdGVTdGFuZGFyZE1hbmFnZXI8L2NvZGU+IG9wZXJhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBjcmVhdGVTdGFuZGFyZE1hbmFnZXJUeXBlc1tdID0KKyAgICB7ICJqYXZhLmxhbmcuU3RyaW5nIiwgICAgIC8vIHBhcmVudAorICAgIH07CisgICAgCisgICAgLyoqCisgICAgICogVGhlIE1CZWFuU2VydmVyIHdlIHdpbGwgYmUgaW50ZXJhY3Rpbmcgd2l0aC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1CZWFuU2VydmVyIG1CU2VydmVyID0gbnVsbDsKKyAgICAKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIHNwZWNpZmllZCBIVFRQIHJlcXVlc3QsIGFuZCBjcmVhdGUgdGhlIGNvcnJlc3BvbmRpbmcgSFRUUAorICAgICAqIHJlc3BvbnNlIChvciBmb3J3YXJkIHRvIGFub3RoZXIgd2ViIGNvbXBvbmVudCB0aGF0IHdpbGwgY3JlYXRlIGl0KS4KKyAgICAgKiBSZXR1cm4gYW4gPGNvZGU+QWN0aW9uRm9yd2FyZDwvY29kZT4gaW5zdGFuY2UgZGVzY3JpYmluZyB3aGVyZSBhbmQgaG93CisgICAgICogY29udHJvbCBzaG91bGQgYmUgZm9yd2FyZGVkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcmVzcG9uc2UgaGFzCisgICAgICogYWxyZWFkeSBiZWVuIGNvbXBsZXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBBY3Rpb25NYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gYWN0aW9uRm9ybSBUaGUgb3B0aW9uYWwgQWN0aW9uRm9ybSBiZWFuIGZvciB0aGlzIHJlcXVlc3QgKGlmIGFueSkKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgSFRUUCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBIVFRQIHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBleGNlcHRpb24gb2NjdXJzCisgICAgICovCisgICAgcHVibGljIEFjdGlvbkZvcndhcmQgcGVyZm9ybShBY3Rpb25NYXBwaW5nIG1hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb25Gb3JtIGZvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisgICAgICAgIAorICAgICAgICAvLyBBY3F1aXJlIHRoZSByZXNvdXJjZXMgdGhhdCB3ZSBuZWVkCisgICAgICAgIEh0dHBTZXNzaW9uIHNlc3Npb24gPSByZXF1ZXN0LmdldFNlc3Npb24oKTsKKyAgICAgICAgTG9jYWxlIGxvY2FsZSA9IGdldExvY2FsZShyZXF1ZXN0KTsKKyAgICAgICAgTWVzc2FnZVJlc291cmNlcyByZXNvdXJjZXMgPSBnZXRSZXNvdXJjZXMocmVxdWVzdCk7CisgICAgICAgIAorICAgICAgICAvLyBBY3F1aXJlIGEgcmVmZXJlbmNlIHRvIHRoZSBNQmVhblNlcnZlciBjb250YWluaW5nIG91ciBNQmVhbnMKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1CU2VydmVyID0gKChBcHBsaWNhdGlvblNlcnZsZXQpIGdldFNlcnZsZXQoKSkuZ2V0U2VydmVyKCk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbgorICAgICAgICAgICAgKCJDYW5ub3QgYWNxdWlyZSBNQmVhblNlcnZlciByZWZlcmVuY2UiLCB0KTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gSWRlbnRpZnkgdGhlIHJlcXVlc3RlZCBhY3Rpb24KKyAgICAgICAgRGVmYXVsdENvbnRleHRGb3JtIGNmb3JtID0gKERlZmF1bHRDb250ZXh0Rm9ybSkgZm9ybTsKKyAgICAgICAgU3RyaW5nIGFkbWluQWN0aW9uID0gY2Zvcm0uZ2V0QWRtaW5BY3Rpb24oKTsKKyAgICAgICAgU3RyaW5nIGNPYmplY3ROYW1lID0gY2Zvcm0uZ2V0T2JqZWN0TmFtZSgpOworICAgICAgICBTdHJpbmcgbE9iamVjdE5hbWUgPSBjZm9ybS5nZXRMb2FkZXJPYmplY3ROYW1lKCk7CisgICAgICAgIFN0cmluZyBtT2JqZWN0TmFtZSA9IGNmb3JtLmdldE1hbmFnZXJPYmplY3ROYW1lKCk7CisgICAgICAgCisgICAgICAgIC8vIFBlcmZvcm0gYSAiQ3JlYXRlIERlZmF1bHRDb250ZXh0IiB0cmFuc2FjdGlvbiAoaWYgcmVxdWVzdGVkKQorICAgICAgICBpZiAoIkNyZWF0ZSIuZXF1YWxzKGFkbWluQWN0aW9uKSkgeworCisgICAgICAgICAgICBTdHJpbmcgb3BlcmF0aW9uID0gbnVsbDsKKyAgICAgICAgICAgIE9iamVjdCB2YWx1ZXNbXSA9IG51bGw7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBwYXJlbnQgbmFtZQorICAgICAgICAgICAgICAgIFN0cmluZyBwYXJlbnROYW1lID0gY2Zvcm0uZ2V0UGFyZW50T2JqZWN0TmFtZSgpOworICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgcG9uYW1lID0gbmV3IE9iamVjdE5hbWUocGFyZW50TmFtZSk7CisKKyAgICAgICAgICAgICAgICBTdHJpbmcgaG9zdCA9IHBvbmFtZS5nZXRLZXlQcm9wZXJ0eSgiaG9zdCIpOworICAgICAgICAgICAgICAgIFN0cmluZyBkb21haW4gPSBwb25hbWUuZ2V0RG9tYWluKCk7CisgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9IG51bGw7CisgICAgICAgICAgICAgICAgLy8gRW5zdXJlIHRoYXQgdGhlIHJlcXVlc3RlZCBkZWZhdWx0IGNvbnRleHQgbmFtZSBpcyB1bmlxdWUKKyAgICAgICAgICAgICAgICBpZiAoaG9zdCE9bnVsbCkgeworICAgICAgICAgICAgICAgICAgICBvbmFtZSA9IG5ldyBPYmplY3ROYW1lKGRvbWFpbiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9tY2F0VHJlZUJ1aWxkZXIuREVGQVVMVENPTlRFWFRfVFlQRSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIixob3N0PSIgKyBob3N0KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBvbmFtZSA9IG5ldyBPYmplY3ROYW1lKGRvbWFpbiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9tY2F0VHJlZUJ1aWxkZXIuREVGQVVMVENPTlRFWFRfVFlQRSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmIChtQlNlcnZlci5pc1JlZ2lzdGVyZWQob25hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIEFjdGlvbkVycm9ycyBlcnJvcnMgPSBuZXcgQWN0aW9uRXJyb3JzKCk7CisgICAgICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoImNvbnRleHROYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQWN0aW9uRXJyb3IoImVycm9yLmRlZmF1bHRjb250ZXh0TmFtZS5leGlzdHMiKSk7CisgICAgICAgICAgICAgICAgICAgIHNhdmVFcnJvcnMocmVxdWVzdCwgZXJyb3JzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChuZXcgQWN0aW9uRm9yd2FyZChtYXBwaW5nLmdldElucHV0KCkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gTG9vayB1cCBvdXIgTUJlYW5GYWN0b3J5IE1CZWFuCisgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSBmbmFtZSA9IFRvbWNhdFRyZWVCdWlsZGVyLmdldE1CZWFuRmFjdG9yeSgpOworCisgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IERlZmF1bHRDb250ZXh0IG9iamVjdAorICAgICAgICAgICAgICAgIHZhbHVlcyA9IG5ldyBPYmplY3RbMV07CisgICAgICAgICAgICAgICAgdmFsdWVzWzBdID0gcGFyZW50TmFtZTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBvcGVyYXRpb24gPSAiY3JlYXRlRGVmYXVsdENvbnRleHQiOworICAgICAgICAgICAgICAgIGNPYmplY3ROYW1lID0gKFN0cmluZykKKyAgICAgICAgICAgICAgICAgICAgbUJTZXJ2ZXIuaW52b2tlKGZuYW1lLCBvcGVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMsIGNyZWF0ZURlZmF1bHRDb250ZXh0VHlwZXMpOworCisgICAgICAgICAgICAgICAgLy8qIENyZWF0ZSBhIG5ldyBMb2FkZXIgb2JqZWN0CisgICAgICAgICAgICAgICAgdmFsdWVzID0gbmV3IFN0cmluZ1sxXTsKKyAgICAgICAgICAgICAgICAvLyBwYXJlbnQgb2YgbG9hZGVyIGlzIHRoZSBuZXdseSBjcmVhdGVkIGNvbnRleHQKKyAgICAgICAgICAgICAgICB2YWx1ZXNbMF0gPSBjT2JqZWN0TmFtZS50b1N0cmluZygpOworICAgICAgICAgICAgICAgIG9wZXJhdGlvbiA9ICJjcmVhdGVXZWJhcHBMb2FkZXIiOworICAgICAgICAgICAgICAgIGxPYmplY3ROYW1lID0gKFN0cmluZykKKyAgICAgICAgICAgICAgICAgICAgbUJTZXJ2ZXIuaW52b2tlKGZuYW1lLCBvcGVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMsIGNyZWF0ZVN0YW5kYXJkTG9hZGVyVHlwZXMpOyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgU3RhbmRhcmRNYW5hZ2VyIG9iamVjdAorICAgICAgICAgICAgICAgIHZhbHVlcyA9IG5ldyBTdHJpbmdbMV07CisgICAgICAgICAgICAgICAgLy8gcGFyZW50IG9mIG1hbmFnZXIgaXMgdGhlIG5ld2x5IGNyZWF0ZWQgQ29udGV4dAorICAgICAgICAgICAgICAgIHZhbHVlc1swXSA9IGNPYmplY3ROYW1lLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgb3BlcmF0aW9uID0gImNyZWF0ZVN0YW5kYXJkTWFuYWdlciI7CisgICAgICAgICAgICAgICAgbU9iamVjdE5hbWUgPSAoU3RyaW5nKQorICAgICAgICAgICAgICAgICAgICBtQlNlcnZlci5pbnZva2UoZm5hbWUsIG9wZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcywgY3JlYXRlU3RhbmRhcmRNYW5hZ2VyVHlwZXMpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgbmV3IERlZmF1bHQgQ29udGV4dCB0byBvdXIgdHJlZSBjb250cm9sIG5vZGUKKyAgICAgICAgICAgICAgICBhZGRUb1RyZWVDb250cm9sTm9kZShvbmFtZSwgY09iamVjdE5hbWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50TmFtZSwgcmVzb3VyY2VzLCBzZXNzaW9uLCBsb2NhbGUpOworCisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmludm9rZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24pLCBlKTsKKyAgICAgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuaW52b2tlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbikpOworICAgICAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgLy8gUGVyZm9ybSBhdHRyaWJ1dGUgdXBkYXRlcyBhcyByZXF1ZXN0ZWQKKyAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZSA9IG51bGw7CisgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgIE9iamVjdE5hbWUgY29uYW1lID0gbmV3IE9iamVjdE5hbWUoY09iamVjdE5hbWUpOworICAgICAgICAgICAgT2JqZWN0TmFtZSBsb25hbWUgPSBuZXcgT2JqZWN0TmFtZShsT2JqZWN0TmFtZSk7CisgICAgICAgICAgICBPYmplY3ROYW1lIG1vbmFtZSA9IG5ldyBPYmplY3ROYW1lKG1PYmplY3ROYW1lKTsKKyAKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJjb29raWVzIjsKKyAgICAgICAgICAgIFN0cmluZyBjb29raWVzID0gImZhbHNlIjsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY29va2llcyA9IGNmb3JtLmdldENvb2tpZXMoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgY29va2llcyA9ICJmYWxzZSI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQlNlcnZlci5zZXRBdHRyaWJ1dGUoY29uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoImNvb2tpZXMiLCBuZXcgQm9vbGVhbihjb29raWVzKSkpOworCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAiY3Jvc3NDb250ZXh0IjsKKyAgICAgICAgICAgIFN0cmluZyBjcm9zc0NvbnRleHQgPSAiZmFsc2UiOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjcm9zc0NvbnRleHQgPSBjZm9ybS5nZXRDcm9zc0NvbnRleHQoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgY3Jvc3NDb250ZXh0ID0gImZhbHNlIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1CU2VydmVyLnNldEF0dHJpYnV0ZShjb25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZSgiY3Jvc3NDb250ZXh0IiwgbmV3IEJvb2xlYW4oY3Jvc3NDb250ZXh0KSkpOworCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAicmVsb2FkYWJsZSI7CisgICAgICAgICAgICBTdHJpbmcgcmVsb2FkYWJsZSA9ICJmYWxzZSI7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJlbG9hZGFibGUgPSBjZm9ybS5nZXRSZWxvYWRhYmxlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgIHJlbG9hZGFibGUgPSAiZmFsc2UiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUJTZXJ2ZXIuc2V0QXR0cmlidXRlKGNvbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKCJyZWxvYWRhYmxlIiwgbmV3IEJvb2xlYW4ocmVsb2FkYWJsZSkpKTsKKworICAgICAgICAgICAgYXR0cmlidXRlID0gInN3YWxsb3dPdXRwdXQiOworICAgICAgICAgICAgU3RyaW5nIHN3YWxsb3dPdXRwdXQgPSAiZmFsc2UiOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBzd2FsbG93T3V0cHV0ID0gY2Zvcm0uZ2V0U3dhbGxvd091dHB1dCgpOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICBzd2FsbG93T3V0cHV0ID0gImZhbHNlIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1CU2VydmVyLnNldEF0dHJpYnV0ZShjb25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZSgic3dhbGxvd091dHB1dCIsIG5ldyBCb29sZWFuKHN3YWxsb3dPdXRwdXQpKSk7CisKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJ1c2VOYW1pbmciOworICAgICAgICAgICAgU3RyaW5nIHVzZU5hbWluZyA9ICJmYWxzZSI7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHVzZU5hbWluZyA9IGNmb3JtLmdldFVzZU5hbWluZygpOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICB1c2VOYW1pbmcgPSAiZmFsc2UiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUJTZXJ2ZXIuc2V0QXR0cmlidXRlKGNvbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKCJ1c2VOYW1pbmciLCBuZXcgQm9vbGVhbih1c2VOYW1pbmcpKSk7CisKKyAgICAgICAgICAgIC8vIExvYWRlciBwcm9wZXJ0aWVzICAgICAgICAgICAgCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAicmVsb2FkYWJsZSI7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJlbG9hZGFibGUgPSBjZm9ybS5nZXRMZHJSZWxvYWRhYmxlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgIHJlbG9hZGFibGUgPSAiZmFsc2UiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUJTZXJ2ZXIuc2V0QXR0cmlidXRlKGxvbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKCJyZWxvYWRhYmxlIiwgbmV3IEJvb2xlYW4ocmVsb2FkYWJsZSkpKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgYXR0cmlidXRlID0gImNoZWNrSW50ZXJ2YWwiOworICAgICAgICAgICAgaW50IGNoZWNrSW50ZXJ2YWwgPSAxNTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY2hlY2tJbnRlcnZhbCA9IEludGVnZXIucGFyc2VJbnQoY2Zvcm0uZ2V0TGRyQ2hlY2tJbnRlcnZhbCgpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgY2hlY2tJbnRlcnZhbCA9IDE1OworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUJTZXJ2ZXIuc2V0QXR0cmlidXRlKGxvbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKCJjaGVja0ludGVydmFsIiwgbmV3IEludGVnZXIoY2hlY2tJbnRlcnZhbCkpKTsKKworICAgICAgICAgICAgLy8gTWFuYWdlciBwcm9wZXJ0aWVzICAgICAgICAgICAgCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAiZW50cm9weSI7CisgICAgICAgICAgICBTdHJpbmcgZW50cm9weSA9IGNmb3JtLmdldE1nclNlc3Npb25JREluaXQoKTsKKyAgICAgICAgICAgIGlmICgoZW50cm9weSE9bnVsbCkgJiYgKGVudHJvcHkubGVuZ3RoKCk+PTEpKSB7CisgICAgICAgICAgICAgICAgbUJTZXJ2ZXIuc2V0QXR0cmlidXRlKG1vbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKCJlbnRyb3B5IixlbnRyb3B5KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJjaGVja0ludGVydmFsIjsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY2hlY2tJbnRlcnZhbCA9IEludGVnZXIucGFyc2VJbnQoY2Zvcm0uZ2V0TWdyQ2hlY2tJbnRlcnZhbCgpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgY2hlY2tJbnRlcnZhbCA9IDYwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUJTZXJ2ZXIuc2V0QXR0cmlidXRlKG1vbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKCJjaGVja0ludGVydmFsIiwgbmV3IEludGVnZXIoY2hlY2tJbnRlcnZhbCkpKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgYXR0cmlidXRlID0gIm1heEFjdGl2ZVNlc3Npb25zIjsKKyAgICAgICAgICAgIGludCBtYXhBY3RpdmVTZXNzaW9ucyA9IC0xOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtYXhBY3RpdmVTZXNzaW9ucyA9IEludGVnZXIucGFyc2VJbnQoY2Zvcm0uZ2V0TWdyTWF4U2Vzc2lvbnMoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgIG1heEFjdGl2ZVNlc3Npb25zID0gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQlNlcnZlci5zZXRBdHRyaWJ1dGUobW9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoIm1heEFjdGl2ZVNlc3Npb25zIiwgbmV3IEludGVnZXIobWF4QWN0aXZlU2Vzc2lvbnMpKSk7CisKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKworICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZworICAgICAgICAgICAgICAgIChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5hdHRyaWJ1dGUuc2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlKSwgZSk7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsCisgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmF0dHJpYnV0ZS5zZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUpKTsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIEZvcndhcmQgdG8gdGhlIHN1Y2Nlc3MgcmVwb3J0aW5nIHBhZ2UKKyAgICAgICAgc2Vzc2lvbi5yZW1vdmVBdHRyaWJ1dGUobWFwcGluZy5nZXRBdHRyaWJ1dGUoKSk7CisgICAgICAgIHJldHVybiAobWFwcGluZy5maW5kRm9yd2FyZCgiU2F2ZSBTdWNjZXNzZnVsIikpOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogQXBwZW5kIG5vZGVzIGZvciBhbnkgZGVmaW5lIHJlc291cmNlcyBmb3IgdGhlIHNwZWNpZmllZCBDb250ZXh0LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRhaW5lck5vZGUgQ29udGFpbmVyIG5vZGUgZm9yIHRoZSB0cmVlIGNvbnRyb2wKKyAgICAgKiBAcGFyYW0gY29udGFpbmVyTmFtZSBPYmplY3QgbmFtZSBvZiB0aGUgcGFyZW50IGNvbnRhaW5lcgorICAgICAqIEBwYXJhbSByZXNvdXJjZXMgVGhlIE1lc3NhZ2VSZXNvdXJjZXMgZm9yIG91ciBsb2NhbGl6ZWQgbWVzc2FnZXMKKyAgICAgKiAgbWVzc2FnZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRUb1RyZWVDb250cm9sTm9kZShPYmplY3ROYW1lIG9uYW1lLCBTdHJpbmcgY29udGFpbmVyTmFtZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFyZW50TmFtZSwgTWVzc2FnZVJlc291cmNlcyByZXNvdXJjZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2Vzc2lvbiBzZXNzaW9uLCBMb2NhbGUgbG9jYWxlKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBTdHJpbmcgZG9tYWluID0gb25hbWUuZ2V0RG9tYWluKCk7CisgICAgICAgIFRyZWVDb250cm9sIGNvbnRyb2wgPSAoVHJlZUNvbnRyb2wpIHNlc3Npb24uZ2V0QXR0cmlidXRlKCJ0cmVlQ29udHJvbFRlc3QiKTsKKyAgICAgICAgaWYgKGNvbnRyb2wgIT0gbnVsbCkgeworICAgICAgICAgICAgVHJlZUNvbnRyb2xOb2RlIHBhcmVudE5vZGUgPSBjb250cm9sLmZpbmROb2RlKHBhcmVudE5hbWUpOworICAgICAgICAgICAgaWYgKHBhcmVudE5vZGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFN0cmluZyBub2RlTGFiZWwgPSAiRGVmYXVsdENvbnRleHQiOworICAgICAgICAgICAgICAgIFN0cmluZyBlbmNvZGVkTmFtZSA9IFVSTEVuY29kZXIuZW5jb2RlKG9uYW1lLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIFRyZWVDb250cm9sTm9kZSBjaGlsZE5vZGUgPSAKKyAgICAgICAgICAgICAgICAgICAgbmV3IFRyZWVDb250cm9sTm9kZShvbmFtZS50b1N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEZWZhdWx0Q29udGV4dC5naWYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVMYWJlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRWRpdERlZmF1bHRDb250ZXh0LmRvP3NlbGVjdD0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udGVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgZG9tYWluKTsKKyAgICAgICAgICAgICAgICBwYXJlbnROb2RlLmFkZENoaWxkKGNoaWxkTm9kZSk7CisgICAgICAgICAgICAgICAgLy8gRklYTUUgLSBmb3JjZSBhIHJlZGlzcGxheQorICAgICAgICAgICAgICAgIFN0cmluZyB0eXBlID0gb25hbWUuZ2V0S2V5UHJvcGVydHkoInR5cGUiKTsKKyAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHR5cGUgPSAiIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBvbmFtZS5nZXRLZXlQcm9wZXJ0eSgicGF0aCIpOworICAgICAgICAgICAgICAgIGlmIChwYXRoID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcGF0aCA9ICIiOworICAgICAgICAgICAgICAgIH0gICAgICAgIAorICAgICAgICAgICAgICAgIFN0cmluZyBob3N0ID0gb25hbWUuZ2V0S2V5UHJvcGVydHkoImhvc3QiKTsKKyAgICAgICAgICAgICAgICBpZiAoaG9zdCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGhvc3QgPSAiIjsKKyAgICAgICAgICAgICAgICB9ICAgICAgICAKKyAgICAgICAgICAgICAgICBUcmVlQ29udHJvbE5vZGUgc3VidHJlZSA9IG5ldyBUcmVlQ29udHJvbE5vZGUKKyAgICAgICAgICAgICAgICAgICAgKCJDb250ZXh0IFJlc291cmNlIEFkbWluaXN0cmF0aW9uICIgKyBjb250YWluZXJOYW1lLAorICAgICAgICAgICAgICAgICAgICAiZm9sZGVyXzE2X3BhZC5naWYiLAorICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJyZXNvdXJjZXMudHJlZUJ1aWxkZXIuc3VidHJlZU5vZGUiKSwKKyAgICAgICAgICAgICAgICAgICAgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgImNvbnRlbnQiLAorICAgICAgICAgICAgICAgICAgICB0cnVlLCBkb21haW4pOyAgICAgICAgCisgICAgICAgICAgICAgICAgY2hpbGROb2RlLmFkZENoaWxkKHN1YnRyZWUpOworICAgICAgICAgICAgICAgIFRyZWVDb250cm9sTm9kZSBkYXRhc291cmNlcyA9IG5ldyBUcmVlQ29udHJvbE5vZGUKKyAgICAgICAgICAgICAgICAgICAgKCJDb250ZXh0IERhdGEgU291cmNlcyAiICsgY29udGFpbmVyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIkRhdGFzb3VyY2UuZ2lmIiwKKyAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLAorICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VzLnRyZWVCdWlsZGVyLmRhdGFzb3VyY2VzIiksCisgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZXMvbGlzdERhdGFTb3VyY2VzLmRvP3Jlc291cmNldHlwZT0iICsgCisgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHR5cGUpICsgIiZwYXRoPSIgKworICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShwYXRoKSArICImaG9zdD0iICsgCisgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKGhvc3QpICsgIiZmb3J3YXJkPSIgKworICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZSgiRGF0YVNvdXJjZXMgTGlzdCBTZXR1cCIpLAorICAgICAgICAgICAgICAgICAgICAiY29udGVudCIsCisgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBkb21haW4pOworICAgICAgICAgICAgICAgIFRyZWVDb250cm9sTm9kZSBtYWlsc2Vzc2lvbnMgPSBuZXcgVHJlZUNvbnRyb2xOb2RlCisgICAgICAgICAgICAgICAgICAgICgiQ29udGV4dCBNYWlsIFNlc3Npb25zICIgKyBjb250YWluZXJOYW1lLAorICAgICAgICAgICAgICAgICAgICAiTWFpbHNlc3Npb24uZ2lmIiwKKyAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAKKyAgICAgICAgICAgICAgICAgICAgInJlc291cmNlcy50cmVlQnVpbGRlci5tYWlsc2Vzc2lvbnMiKSwKKyAgICAgICAgICAgICAgICAgICAgInJlc291cmNlcy9saXN0TWFpbFNlc3Npb25zLmRvP3Jlc291cmNldHlwZT0iICsgCisgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHR5cGUpICsgIiZwYXRoPSIgKworICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShwYXRoKSArICImaG9zdD0iICsgCisgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKGhvc3QpICsgIiZmb3J3YXJkPSIgKworICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZSgiTWFpbFNlc3Npb25zIExpc3QgU2V0dXAiKSwKKyAgICAgICAgICAgICAgICAgICAgImNvbnRlbnQiLAorICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZG9tYWluKTsKKyAgICAgICAgICAgICAgICBUcmVlQ29udHJvbE5vZGUgcmVzb3VyY2VsaW5rcyA9IG5ldyBUcmVlQ29udHJvbE5vZGUKKyAgICAgICAgICAgICAgICAgICAgKCJSZXNvdXJjZSBMaW5rcyAiICsgY29udGFpbmVyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIlJlc291cmNlTGluay5naWYiLAorICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsCisgICAgICAgICAgICAgICAgICAgICJyZXNvdXJjZXMudHJlZUJ1aWxkZXIucmVzb3VyY2VsaW5rcyIpLAorICAgICAgICAgICAgICAgICAgICAicmVzb3VyY2VzL2xpc3RSZXNvdXJjZUxpbmtzLmRvP3Jlc291cmNldHlwZT0iICsgCisgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHR5cGUpICsgIiZwYXRoPSIgKworICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShwYXRoKSArICImaG9zdD0iICsgCisgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKGhvc3QpICsgIiZmb3J3YXJkPSIgKworICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZSgiUmVzb3VyY2VMaW5rcyBMaXN0IFNldHVwIiksCisgICAgICAgICAgICAgICAgICAgICJjb250ZW50IiwKKyAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGRvbWFpbik7CisgICAgICAgICAgICAgICAgVHJlZUNvbnRyb2xOb2RlIGVudnMgPSBuZXcgVHJlZUNvbnRyb2xOb2RlCisgICAgICAgICAgICAgICAgICAgICgiQ29udGV4dCBFbnZpcm9ubWVudCBFbnRyaWVzICIrIGNvbnRhaW5lck5hbWUsCisgICAgICAgICAgICAgICAgICAgICJFbnZpcm9ubWVudEVudHJpZXMuZ2lmIiwKKyAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAKKyAgICAgICAgICAgICAgICAgICAgInJlc291cmNlcy5lbnYuZW50cmllcyIpLAorICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZSh0eXBlKSArICImcGF0aD0iICsKKyAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUocGF0aCkgKyAiJmhvc3Q9IiArIAorICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShob3N0KSArICImZm9yd2FyZD0iICsKKyAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUoIkVudkVudHJpZXMgTGlzdCBTZXR1cCIpLAorICAgICAgICAgICAgICAgICAgICAiY29udGVudCIsCisgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBkb21haW4pOworICAgICAgICAgICAgICAgIHN1YnRyZWUuYWRkQ2hpbGQoZGF0YXNvdXJjZXMpOworICAgICAgICAgICAgICAgIHN1YnRyZWUuYWRkQ2hpbGQobWFpbHNlc3Npb25zKTsKKyAgICAgICAgICAgICAgICBzdWJ0cmVlLmFkZENoaWxkKHJlc291cmNlbGlua3MpOworICAgICAgICAgICAgICAgIHN1YnRyZWUuYWRkQ2hpbGQoZW52cyk7ICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAgICAgICAgICgiQ2Fubm90IGZpbmQgcGFyZW50IG5vZGUgJyIgKyBwYXJlbnROYW1lICsgIiciKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIH1lbHNlIHsKKyAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2coIkNhbm5vdCBmaW5kIFRyZWVDb250cm9sTm9kZSEiKTsKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIH0KKyAgICAKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9maWx0ZXJzL1NldENoYXJhY3RlckVuY29kaW5nRmlsdGVyLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vZmlsdGVycy9TZXRDaGFyYWN0ZXJFbmNvZGluZ0ZpbHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NTQ4NTcKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vZmlsdGVycy9TZXRDaGFyYWN0ZXJFbmNvZGluZ0ZpbHRlci5qYXZhCkBAIC0wLDAgKzEsMTcyIEBACisvKgorICogQ29weXJpZ2h0IDE5OTktMjAwMSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLmZpbHRlcnM7CisKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5GaWx0ZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5GaWx0ZXJDaGFpbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LkZpbHRlckNvbmZpZzsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlVuYXZhaWxhYmxlRXhjZXB0aW9uOworCisKKy8qKgorICogPHA+RXhhbXBsZSBmaWx0ZXIgdGhhdCBzZXRzIHRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcgdG8gYmUgdXNlZCBpbiBwYXJzaW5nIHRoZQorICogaW5jb21pbmcgcmVxdWVzdCwgZWl0aGVyIHVuY29uZGl0aW9uYWxseSBvciBvbmx5IGlmIHRoZSBjbGllbnQgZGlkIG5vdAorICogc3BlY2lmeSBhIGNoYXJhY3RlciBlbmNvZGluZy4gIENvbmZpZ3VyYXRpb24gb2YgdGhpcyBmaWx0ZXIgaXMgYmFzZWQgb24KKyAqIHRoZSBmb2xsb3dpbmcgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyczo8L3A+CisgKiA8dWw+CisgKiA8bGk+PHN0cm9uZz5lbmNvZGluZzwvc3Ryb25nPiAtIFRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcgdG8gYmUgY29uZmlndXJlZAorICogICAgIGZvciB0aGlzIHJlcXVlc3QsIGVpdGhlciBjb25kaXRpb25hbGx5IG9yIHVuY29uZGl0aW9uYWxseSBiYXNlZCBvbgorICogICAgIHRoZSA8Y29kZT5pZ25vcmU8L2NvZGU+IGluaXRpYWxpemF0aW9uIHBhcmFtZXRlci4gIFRoaXMgcGFyYW1ldGVyCisgKiAgICAgaXMgcmVxdWlyZWQsIHNvIHRoZXJlIGlzIG5vIGRlZmF1bHQuPC9saT4KKyAqIDxsaT48c3Ryb25nPmlnbm9yZTwvc3Ryb25nPiAtIElmIHNldCB0byAidHJ1ZSIsIGFueSBjaGFyYWN0ZXIgZW5jb2RpbmcKKyAqICAgICBzcGVjaWZpZWQgYnkgdGhlIGNsaWVudCBpcyBpZ25vcmVkLCBhbmQgdGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZQorICogICAgIDxjb2RlPnNlbGVjdEVuY29kaW5nKCk8L2NvZGU+IG1ldGhvZCBpcyBzZXQuICBJZiBzZXQgdG8gImZhbHNlLAorICogICAgIDxjb2RlPnNlbGVjdEVuY29kaW5nKCk8L2NvZGU+IGlzIGNhbGxlZCA8c3Ryb25nPm9ubHk8L3N0cm9uZz4gaWYgdGhlCisgKiAgICAgY2xpZW50IGhhcyBub3QgYWxyZWFkeSBzcGVjaWZpZWQgYW4gZW5jb2RpbmcuICBCeSBkZWZhdWx0LCB0aGlzCisgKiAgICAgcGFyYW1ldGVyIGlzIHNldCB0byAidHJ1ZSIuPC9saT4KKyAqIDwvdWw+CisgKgorICogPHA+QWx0aG91Z2ggdGhpcyBmaWx0ZXIgY2FuIGJlIHVzZWQgdW5jaGFuZ2VkLCBpdCBpcyBhbHNvIGVhc3kgdG8KKyAqIHN1YmNsYXNzIGl0IGFuZCBtYWtlIHRoZSA8Y29kZT5zZWxlY3RFbmNvZGluZygpPC9jb2RlPiBtZXRob2QgbW9yZQorICogaW50ZWxsaWdlbnQgYWJvdXQgd2hhdCBlbmNvZGluZyB0byBjaG9vc2UsIGJhc2VkIG9uIGNoYXJhY3RlcmlzdGljcyBvZgorICogdGhlIGluY29taW5nIHJlcXVlc3QgKHN1Y2ggYXMgdGhlIHZhbHVlcyBvZiB0aGUgPGNvZGU+QWNjZXB0LUxhbmd1YWdlPC9jb2RlPgorICogYW5kIDxjb2RlPlVzZXItQWdlbnQ8L2NvZGU+IGhlYWRlcnMsIG9yIGEgdmFsdWUgc3Rhc2hlZCBpbiB0aGUgY3VycmVudAorICogdXNlcidzIHNlc3Npb24uPC9wPgorICoKKyAqIEBhdXRob3IgQ3JhaWcgTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgU2V0Q2hhcmFjdGVyRW5jb2RpbmdGaWx0ZXIgaW1wbGVtZW50cyBGaWx0ZXIgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIGRlZmF1bHQgY2hhcmFjdGVyIGVuY29kaW5nIHRvIHNldCBmb3IgcmVxdWVzdHMgdGhhdCBwYXNzIHRocm91Z2gKKyAgICAgKiB0aGlzIGZpbHRlci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGVuY29kaW5nID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIGZpbHRlciBjb25maWd1cmF0aW9uIG9iamVjdCB3ZSBhcmUgYXNzb2NpYXRlZCB3aXRoLiAgSWYgdGhpcyB2YWx1ZQorICAgICAqIGlzIG51bGwsIHRoaXMgZmlsdGVyIGluc3RhbmNlIGlzIG5vdCBjdXJyZW50bHkgY29uZmlndXJlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRmlsdGVyQ29uZmlnIGZpbHRlckNvbmZpZyA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFNob3VsZCBhIGNoYXJhY3RlciBlbmNvZGluZyBzcGVjaWZpZWQgYnkgdGhlIGNsaWVudCBiZSBpZ25vcmVkPworICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGlnbm9yZSA9IHRydWU7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBUYWtlIHRoaXMgZmlsdGVyIG91dCBvZiBzZXJ2aWNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3koKSB7CisKKyAgICAgICAgdGhpcy5lbmNvZGluZyA9IG51bGw7CisgICAgICAgIHRoaXMuZmlsdGVyQ29uZmlnID0gbnVsbDsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2VsZWN0IGFuZCBzZXQgKGlmIHNwZWNpZmllZCkgdGhlIGNoYXJhY3RlciBlbmNvZGluZyB0byBiZSB1c2VkIHRvCisgICAgICogaW50ZXJwcmV0IHJlcXVlc3QgcGFyYW1ldGVycyBmb3IgdGhpcyByZXF1ZXN0LgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXN1bHQgVGhlIHNlcnZsZXQgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICogQHBhcmFtIGNoYWluIFRoZSBmaWx0ZXIgY2hhaW4gd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgZG9GaWx0ZXIoU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZpbHRlckNoYWluIGNoYWluKQorCXRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gQ29uZGl0aW9uYWxseSBzZWxlY3QgYW5kIHNldCB0aGUgY2hhcmFjdGVyIGVuY29kaW5nIHRvIGJlIHVzZWQKKyAgICAgICAgaWYgKGlnbm9yZSB8fCAocmVxdWVzdC5nZXRDaGFyYWN0ZXJFbmNvZGluZygpID09IG51bGwpKSB7CisgICAgICAgICAgICBTdHJpbmcgZW5jb2RpbmcgPSBzZWxlY3RFbmNvZGluZyhyZXF1ZXN0KTsKKyAgICAgICAgICAgIGlmIChlbmNvZGluZyAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlcXVlc3Quc2V0Q2hhcmFjdGVyRW5jb2RpbmcoZW5jb2RpbmcpOworICAgICAgICB9CisKKwkvLyBQYXNzIGNvbnRyb2wgb24gdG8gdGhlIG5leHQgZmlsdGVyCisgICAgICAgIGNoYWluLmRvRmlsdGVyKHJlcXVlc3QsIHJlc3BvbnNlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUGxhY2UgdGhpcyBmaWx0ZXIgaW50byBzZXJ2aWNlLgorICAgICAqCisgICAgICogQHBhcmFtIGZpbHRlckNvbmZpZyBUaGUgZmlsdGVyIGNvbmZpZ3VyYXRpb24gb2JqZWN0CisgICAgICovCisgICAgcHVibGljIHZvaWQgaW5pdChGaWx0ZXJDb25maWcgZmlsdGVyQ29uZmlnKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7CisKKwl0aGlzLmZpbHRlckNvbmZpZyA9IGZpbHRlckNvbmZpZzsKKyAgICAgICAgdGhpcy5lbmNvZGluZyA9IGZpbHRlckNvbmZpZy5nZXRJbml0UGFyYW1ldGVyKCJlbmNvZGluZyIpOworICAgICAgICBTdHJpbmcgdmFsdWUgPSBmaWx0ZXJDb25maWcuZ2V0SW5pdFBhcmFtZXRlcigiaWdub3JlIik7CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQorICAgICAgICAgICAgdGhpcy5pZ25vcmUgPSB0cnVlOworICAgICAgICBlbHNlIGlmICh2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikpCisgICAgICAgICAgICB0aGlzLmlnbm9yZSA9IHRydWU7CisgICAgICAgIGVsc2UgaWYgKHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInllcyIpKQorICAgICAgICAgICAgdGhpcy5pZ25vcmUgPSB0cnVlOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0aGlzLmlnbm9yZSA9IGZhbHNlOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvdGVjdGVkIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogU2VsZWN0IGFuIGFwcHJvcHJpYXRlIGNoYXJhY3RlciBlbmNvZGluZyB0byBiZSB1c2VkLCBiYXNlZCBvbiB0aGUKKyAgICAgKiBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIGN1cnJlbnQgcmVxdWVzdCBhbmQvb3IgZmlsdGVyIGluaXRpYWxpemF0aW9uCisgICAgICogcGFyYW1ldGVycy4gIElmIG5vIGNoYXJhY3RlciBlbmNvZGluZyBzaG91bGQgYmUgc2V0LCByZXR1cm4KKyAgICAgKiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB1bmNvbmRpdGlvbmFsbHkgcmV0dXJucyB0aGUgdmFsdWUgY29uZmlndXJlZAorICAgICAqIGJ5IHRoZSA8c3Ryb25nPmVuY29kaW5nPC9zdHJvbmc+IGluaXRpYWxpemF0aW9uIHBhcmFtZXRlciBmb3IgdGhpcworICAgICAqIGZpbHRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHNlbGVjdEVuY29kaW5nKFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMuZW5jb2RpbmcpOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9ob3N0L0FkZEFsaWFzQWN0aW9uLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vaG9zdC9BZGRBbGlhc0FjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllNmM4MGIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vaG9zdC9BZGRBbGlhc0FjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTI3IEBACisvKgorICogQ29weXJpZ2h0IDIwMDEtMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5ob3N0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25FcnJvcnM7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcndhcmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMudXRpbC5NZXNzYWdlUmVzb3VyY2VzOworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkFwcGxpY2F0aW9uU2VydmxldDsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5MYWJlbFZhbHVlQmVhbjsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5MaXN0czsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CisKKy8qKgorICogVGhlIDxjb2RlPkFjdGlvbjwvY29kZT4gdGhhdCBzZXRzIHVwIDxlbT5BZGQgQWxpYXM8L2VtPiB0cmFuc2FjdGlvbnMuCisgKgorICogQGF1dGhvciBNYW52ZWVuIEthdXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEFkZEFsaWFzQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgTUJlYW5TZXJ2ZXIgd2Ugd2lsbCBiZSBpbnRlcmFjdGluZyB3aXRoLgorICAgICAqLworICAgIHByaXZhdGUgTUJlYW5TZXJ2ZXIgbUJTZXJ2ZXIgPSBudWxsOworICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworICAgIAorICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIHNwZWNpZmllZCBIVFRQIHJlcXVlc3QsIGFuZCBjcmVhdGUgdGhlIGNvcnJlc3BvbmRpbmcgSFRUUAorICAgICAqIHJlc3BvbnNlIChvciBmb3J3YXJkIHRvIGFub3RoZXIgd2ViIGNvbXBvbmVudCB0aGF0IHdpbGwgY3JlYXRlIGl0KS4KKyAgICAgKiBSZXR1cm4gYW4gPGNvZGU+QWN0aW9uRm9yd2FyZDwvY29kZT4gaW5zdGFuY2UgZGVzY3JpYmluZyB3aGVyZSBhbmQgaG93CisgICAgICogY29udHJvbCBzaG91bGQgYmUgZm9yd2FyZGVkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcmVzcG9uc2UgaGFzCisgICAgICogYWxyZWFkeSBiZWVuIGNvbXBsZXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBBY3Rpb25NYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gYWN0aW9uRm9ybSBUaGUgb3B0aW9uYWwgQWN0aW9uRm9ybSBiZWFuIGZvciB0aGlzIHJlcXVlc3QgKGlmIGFueSkKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgSFRUUCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBIVFRQIHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBleGNlcHRpb24gb2NjdXJzCisgICAgICovCisgICAgcHVibGljIEFjdGlvbkZvcndhcmQgcGVyZm9ybShBY3Rpb25NYXBwaW5nIG1hcHBpbmcsCisgICAgQWN0aW9uRm9ybSBmb3JtLAorICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKyAgICAgICAgCisgICAgICAgIC8vIEFjcXVpcmUgdGhlIHJlc291cmNlcyB0aGF0IHdlIG5lZWQKKyAgICAgICAgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpOworICAgICAgICBMb2NhbGUgbG9jYWxlID0gZ2V0TG9jYWxlKHJlcXVlc3QpOworICAgICAgICBNZXNzYWdlUmVzb3VyY2VzIHJlc291cmNlcyA9IGdldFJlc291cmNlcyhyZXF1ZXN0KTsKKyAgICAgICAgCisgICAgICAgIC8vIEFjcXVpcmUgYSByZWZlcmVuY2UgdG8gdGhlIE1CZWFuU2VydmVyIGNvbnRhaW5pbmcgb3VyIE1CZWFucworICAgICAgICB0cnkgeworICAgICAgICAgICAgbUJTZXJ2ZXIgPSAoKEFwcGxpY2F0aW9uU2VydmxldCkgZ2V0U2VydmxldCgpKS5nZXRTZXJ2ZXIoKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uCisgICAgICAgICAgICAoIkNhbm5vdCBhY3F1aXJlIE1CZWFuU2VydmVyIHJlZmVyZW5jZSIsIHQpOworICAgICAgICB9CisgICAgICAgIAorCisgICAgICAgIC8vIHRoZSBob3N0IE5hbWUgaXMgbmVlZGVkIHRvIHJldHJpZXZlIHRoZSBleGlzdGluZyBhbGlhc2VzCisgICAgICAgIC8vIGFuZCBhZGQgbmV3IGFsaWFzZXMgdG8KKyAgICAgICAgU3RyaW5nIGhvc3ROYW1lID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoImhvc3ROYW1lIik7CisgICAgICAgIC8vIEZpbGwgaW4gdGhlIGZvcm0gdmFsdWVzIGZvciBkaXNwbGF5IGFuZCBlZGl0aW5nCisgICAgICAgIEFsaWFzRm9ybSBhbGlhc0ZtID0gbmV3IEFsaWFzRm9ybSgpOworICAgICAgICBzZXNzaW9uLnNldEF0dHJpYnV0ZSgiYWxpYXNGb3JtIiwgYWxpYXNGbSk7CisgICAgICAgIAorICAgICAgICAvLyByZXRyaWV2ZSBhbGwgYWxpYXNlcworICAgICAgICBTdHJpbmcgb3BlcmF0aW9uID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE9iamVjdE5hbWUgaG5hbWUgPSBuZXcgT2JqZWN0TmFtZShob3N0TmFtZSk7CisKKyAgICAgICAgICAgIG9wZXJhdGlvbiA9ICJmaW5kQWxpYXNlcyI7CisgICAgICAgICAgICBTdHJpbmcgYWxpYXNlc1tdID0gCisgICAgICAgICAgICAgICAgKFN0cmluZ1tdKSBtQlNlcnZlci5pbnZva2UoaG5hbWUsIG9wZXJhdGlvbiwgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGFsaWFzRm0uc2V0QWxpYXNWYWxzKG5ldyBBcnJheUxpc3QoQXJyYXlzLmFzTGlzdChhbGlhc2VzKSkpOworCisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nCisgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuaW52b2tlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24pLCB0KTsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKKyAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5pbnZva2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbikpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsgICAgICAgICAgICAKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgYWxpYXNGbS5zZXRBbGlhc05hbWUoIiIpOworICAgICAgICBhbGlhc0ZtLnNldEhvc3ROYW1lKGhvc3ROYW1lKTsKKworICAgICAgICAvLyBGb3J3YXJkIHRvIHRoZSBob3N0IGRpc3BsYXkgcGFnZQorICAgICAgICByZXR1cm4gKG1hcHBpbmcuZmluZEZvcndhcmQoIkFsaWFzIikpOworICAgICAgICAKKyAgICB9CisgICAgICAgIAorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL2hvc3QvQWRkSG9zdEFjdGlvbi5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL2hvc3QvQWRkSG9zdEFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1MGYyMTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vaG9zdC9BZGRIb3N0QWN0aW9uLmphdmEKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAxLTIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uaG9zdDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25FcnJvcnM7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcndhcmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMudXRpbC5NZXNzYWdlUmVzb3VyY2VzOworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkxhYmVsVmFsdWVCZWFuOworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkxpc3RzOworCisvKioKKyAqIFRoZSA8Y29kZT5BY3Rpb248L2NvZGU+IHRoYXQgc2V0cyB1cCA8ZW0+QWRkIEhvc3Q8L2VtPiB0cmFuc2FjdGlvbnMuCisgKgorICogQGF1dGhvciBNYW52ZWVuIEthdXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEFkZEhvc3RBY3Rpb24gZXh0ZW5kcyBBY3Rpb24geworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBzcGVjaWZpZWQgSFRUUCByZXF1ZXN0LCBhbmQgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIEhUVFAKKyAgICAgKiByZXNwb25zZSAob3IgZm9yd2FyZCB0byBhbm90aGVyIHdlYiBjb21wb25lbnQgdGhhdCB3aWxsIGNyZWF0ZSBpdCkuCisgICAgICogUmV0dXJuIGFuIDxjb2RlPkFjdGlvbkZvcndhcmQ8L2NvZGU+IGluc3RhbmNlIGRlc2NyaWJpbmcgd2hlcmUgYW5kIGhvdworICAgICAqIGNvbnRyb2wgc2hvdWxkIGJlIGZvcndhcmRlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHJlc3BvbnNlIGhhcworICAgICAqIGFscmVhZHkgYmVlbiBjb21wbGV0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgQWN0aW9uTWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIGFjdGlvbkZvcm0gVGhlIG9wdGlvbmFsIEFjdGlvbkZvcm0gYmVhbiBmb3IgdGhpcyByZXF1ZXN0IChpZiBhbnkpCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIEhUVFAgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgSFRUUCByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXhjZXB0aW9uIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBBY3Rpb25Gb3J3YXJkIHBlcmZvcm0oQWN0aW9uTWFwcGluZyBtYXBwaW5nLAorICAgIEFjdGlvbkZvcm0gZm9ybSwKKyAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gQWNxdWlyZSB0aGUgcmVzb3VyY2VzIHRoYXQgd2UgbmVlZAorICAgICAgICBIdHRwU2Vzc2lvbiBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uKCk7CisgICAgICAgIExvY2FsZSBsb2NhbGUgPSBnZXRMb2NhbGUocmVxdWVzdCk7CisgICAgICAgIE1lc3NhZ2VSZXNvdXJjZXMgcmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VzKHJlcXVlc3QpOworCisgICAgICAgIC8vIHRoZSBzZXJ2aWNlIE5hbWUgaXMgbmVlZGVkIHRvIHJldHJpZXZlIHRoZSBlbmdpbmUgbUJlYW4gdG8KKyAgICAgICAgLy8gd2hpY2ggdGhlIG5ldyBob3N0IG1CZWFuIHdpbGwgYmUgYWRkZWQuCisgICAgICAgIFN0cmluZyBzZXJ2aWNlTmFtZSA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJzZWxlY3QiKTsKKworICAgICAgICAvLyBGaWxsIGluIHRoZSBmb3JtIHZhbHVlcyBmb3IgZGlzcGxheSBhbmQgZWRpdGluZworICAgICAgICBIb3N0Rm9ybSBob3N0Rm0gPSBuZXcgSG9zdEZvcm0oKTsKKyAgICAgICAgc2Vzc2lvbi5zZXRBdHRyaWJ1dGUoImhvc3RGb3JtIiwgaG9zdEZtKTsKKyAgICAgICAgaG9zdEZtLnNldEFkbWluQWN0aW9uKCJDcmVhdGUiKTsKKyAgICAgICAgaG9zdEZtLnNldE9iamVjdE5hbWUoIiIpOworICAgICAgICBob3N0Rm0uc2V0SG9zdE5hbWUoIiIpOworICAgICAgICBob3N0Rm0uc2V0U2VydmljZU5hbWUoc2VydmljZU5hbWUpOworICAgICAgICBob3N0Rm0uc2V0QXBwQmFzZSgiIik7CisgICAgICAgIGhvc3RGbS5zZXRBdXRvRGVwbG95KCJ0cnVlIik7CisgICAgICAgIGhvc3RGbS5zZXREZXBsb3lYTUwoInRydWUiKTsKKyAgICAgICAgaG9zdEZtLnNldERlcGxveU9uU3RhcnR1cCgidHJ1ZSIpOworICAgICAgICBob3N0Rm0uc2V0VW5wYWNrV0FScygidHJ1ZSIpOyAgIAorICAgICAgICBob3N0Rm0uc2V0WG1sTmFtZXNwYWNlQXdhcmUoImZhbHNlIik7CisgICAgICAgIGhvc3RGbS5zZXRYbWxWYWxpZGF0aW9uKCJmYWxzZSIpOworICAgICAgICBob3N0Rm0uc2V0Qm9vbGVhblZhbHMoTGlzdHMuZ2V0Qm9vbGVhblZhbHVlcygpKTsKKworICAgICAgICAvLyBGb3J3YXJkIHRvIHRoZSBob3N0IGRpc3BsYXkgcGFnZQorICAgICAgICByZXR1cm4gKG1hcHBpbmcuZmluZEZvcndhcmQoIkhvc3QiKSk7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL2hvc3QvQWxpYXNGb3JtLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vaG9zdC9BbGlhc0Zvcm0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjdmZTVkCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL2hvc3QvQWxpYXNGb3JtLmphdmEKQEAgLTAsMCArMSwxNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLmhvc3Q7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25FcnJvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRXJyb3JzOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEZvcm0gYmVhbiBmb3IgdGhlIGFsaWFzIHBhZ2UuCisgKgorICogQGF1dGhvciBNYW52ZWVuIEthdXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIEFsaWFzRm9ybSBleHRlbmRzIEFjdGlvbkZvcm0geworICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisgICAgLyoqCisgICAgICogVGhlIHRleHQgZm9yIHRoZSBob3N0TmFtZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBob3N0TmFtZSA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdGV4dCBmb3IgdGhlIGFsaWFzTmFtZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBhbGlhc05hbWUgPSBudWxsOworCisgICAgLyoKKyAgICAgKiBSZXByZXNlbnQgYWxpYXNlcyBhcyBhIExpc3QuCisgICAgICovICAgIAorICAgIHByaXZhdGUgTGlzdCBhbGlhc1ZhbHMgPSBudWxsOworICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBob3N0IG5hbWUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRIb3N0TmFtZSgpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLmhvc3ROYW1lOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBob3N0IG5hbWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SG9zdE5hbWUoU3RyaW5nIGhvc3ROYW1lKSB7CisgICAgICAgIAorICAgICAgICB0aGlzLmhvc3ROYW1lID0gaG9zdE5hbWU7CisgICAgICAgIAorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgYWxpYXMgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEFsaWFzTmFtZSgpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLmFsaWFzTmFtZTsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgYWxpYXMgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBbGlhc05hbWUoU3RyaW5nIGFsaWFzTmFtZSkgeworICAgICAgICAKKyAgICAgICAgdGhpcy5hbGlhc05hbWUgPSBhbGlhc05hbWU7CisgICAgICAgIAorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgTGlzdCBvZiBhbGlhcyBWYWxzLgorICAgICAqLworICAgIHB1YmxpYyBMaXN0IGdldEFsaWFzVmFscygpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLmFsaWFzVmFsczsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgYWxpYXMgVmFscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBbGlhc1ZhbHMoTGlzdCBhbGlhc1ZhbHMpIHsKKyAgICAgICAgCisgICAgICAgIHRoaXMuYWxpYXNWYWxzID0gYWxpYXNWYWxzOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisgICAgCisgICAgLyoqCisgICAgICogUmVzZXQgYWxsIHByb3BlcnRpZXMgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgbWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlc2V0KEFjdGlvbk1hcHBpbmcgbWFwcGluZywgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgCisgICAgICAgIHRoaXMuYWxpYXNOYW1lID0gbnVsbDsKKyAgICAgICAgdGhpcy5ob3N0TmFtZSA9IG51bGw7CisKKyAgICB9CisgICAgCisgICAgIC8qKgorICAgICAqIFJlbmRlciB0aGlzIG9iamVjdCBhcyBhIFN0cmluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIkFsaWFzRm9ybVtob3N0TmFtZT0iKTsKKyAgICAgICAgc2IuYXBwZW5kKGhvc3ROYW1lKTsKKyAgICAgICAgc2IuYXBwZW5kKCJdIik7CisgICAgICAgIHJldHVybiAoc2IudG9TdHJpbmcoKSk7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWYWxpZGF0ZSB0aGUgcHJvcGVydGllcyB0aGF0IGhhdmUgYmVlbiBzZXQgZnJvbSB0aGlzIEhUVFAgcmVxdWVzdCwKKyAgICAgKiBhbmQgcmV0dXJuIGFuIDxjb2RlPkFjdGlvbkVycm9yczwvY29kZT4gb2JqZWN0IHRoYXQgZW5jYXBzdWxhdGVzIGFueQorICAgICAqIHZhbGlkYXRpb24gZXJyb3JzIHRoYXQgaGF2ZSBiZWVuIGZvdW5kLiAgSWYgbm8gZXJyb3JzIGFyZSBmb3VuZCwgcmV0dXJuCisgICAgICogPGNvZGU+bnVsbDwvY29kZT4gb3IgYW4gPGNvZGU+QWN0aW9uRXJyb3JzPC9jb2RlPiBvYmplY3Qgd2l0aCBubworICAgICAqIHJlY29yZGVkIGVycm9yIG1lc3NhZ2VzLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIG1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgQWN0aW9uRXJyb3JzIHZhbGlkYXRlKEFjdGlvbk1hcHBpbmcgbWFwcGluZywKKyAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICAKKyAgICAgICAgQWN0aW9uRXJyb3JzIGVycm9ycyA9IG5ldyBBY3Rpb25FcnJvcnMoKTsKKyAgICAgICAgCisgICAgICAgIFN0cmluZyBzdWJtaXQgPSByZXF1ZXN0LmdldFBhcmFtZXRlcigic3VibWl0Iik7CisgICAgICAgIAorICAgICAgICAvLyBmcm9udCBlbmQgdmFsaWRhdGlvbiB3aGVuIHNhdmUgaXMgY2xpY2tlZC4KKyAgICAgICAgLy9pZiAoc3VibWl0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gYWxpYXNOYW1lIGNhbm5vdCBiZSBudWxsCisgICAgICAgICAgICBpZiAoKGFsaWFzTmFtZT09IG51bGwpIHx8IChhbGlhc05hbWUubGVuZ3RoKCkgPCAxKSkgeworICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoImFsaWFzTmFtZSIsIG5ldyBBY3Rpb25FcnJvcigiZXJyb3IuYWxpYXNOYW1lLnJlcXVpcmVkIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIC8vfSAgICAgICAgCisgICAgICAgIHJldHVybiBlcnJvcnM7ICAgICAgIAorICAgIH0KKyAgICAKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9ob3N0L0FsaWFzZXNGb3JtLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vaG9zdC9BbGlhc2VzRm9ybS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjYjcyYjMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vaG9zdC9BbGlhc2VzRm9ybS5qYXZhCkBAIC0wLDAgKzEsODggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5ob3N0OworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9ybTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKKworCisvKioKKyAqIEZvcm0gYmVhbiBmb3IgZGVsZXRpbmcgYWxpYXNlcy4KKyAqCisgKiBAYXV0aG9yIE1hbnZlZW4gS2F1cgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgQWxpYXNlc0Zvcm0gZXh0ZW5kcyBBY3Rpb25Gb3JtIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBvYmplY3QgbmFtZXMgb2YgdGhlIGFsaWFzZXMgdG8gYmUgZGVsZXRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBhbGlhc2VzW10gPSBuZXcgU3RyaW5nWzBdOworCisgICAgcHVibGljIFN0cmluZ1tdIGdldEFsaWFzZXMoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5hbGlhc2VzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBbGlhc2VzKFN0cmluZyBhbGlhc2VzW10pIHsKKyAgICAgICAgdGhpcy5hbGlhc2VzID0gYWxpYXNlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgdGV4dCBmb3IgdGhlIGhvc3ROYW1lLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGhvc3ROYW1lID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgaG9zdCBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SG9zdE5hbWUoKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy5ob3N0TmFtZTsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgaG9zdCBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEhvc3ROYW1lKFN0cmluZyBob3N0TmFtZSkgeworICAgICAgICAKKyAgICAgICAgdGhpcy5ob3N0TmFtZSA9IGhvc3ROYW1lOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJlc2V0IGFsbCBwcm9wZXJ0aWVzIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIG1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZXNldChBY3Rpb25NYXBwaW5nIG1hcHBpbmcsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisKKyAgICAgICAgdGhpcy5hbGlhc2VzID0gbmV3IFN0cmluZ1swXTsKKyAgICAgICAgdGhpcy5ob3N0TmFtZSA9IG51bGw7ICAgICAgICAKKyAgICB9CisgICAgICAgIAorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL2hvc3QvRGVsZXRlQWxpYXNBY3Rpb24uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9ob3N0L0RlbGV0ZUFsaWFzQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUwY2Q5MgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9ob3N0L0RlbGV0ZUFsaWFzQWN0aW9uLmphdmEKQEAgLTAsMCArMSwxNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMS0yMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uaG9zdDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25FcnJvcnM7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcndhcmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CisKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXJGYWN0b3J5OworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuUXVlcnlFeHA7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5RdWVyeTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdEluc3RhbmNlOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LkpNRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLnV0aWwuTWVzc2FnZVJlc291cmNlczsKKworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkFwcGxpY2F0aW9uU2VydmxldDsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5Ub21jYXRUcmVlQnVpbGRlcjsKKworLyoqCisgKiBUaGUgPGNvZGU+QWN0aW9uPC9jb2RlPiB0aGF0IHNldHMgdXAgPGVtPkRlbGV0ZSBBbGlhc2VzPC9lbT4gdHJhbnNhY3Rpb25zLgorICoKKyAqIEBhdXRob3IgTWFudmVlbiBLYXVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBEZWxldGVBbGlhc0FjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisgICAgCisKKyAgICAvKioKKyAgICAgKiBUaGUgTUJlYW5TZXJ2ZXIgd2Ugd2lsbCBiZSBpbnRlcmFjdGluZyB3aXRoLgorICAgICAqLworICAgIHByaXZhdGUgTUJlYW5TZXJ2ZXIgbUJTZXJ2ZXIgPSBudWxsOworICAgIAorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisgICAgCisgICAgLyoqCisgICAgICogUHJvY2VzcyB0aGUgc3BlY2lmaWVkIEhUVFAgcmVxdWVzdCwgYW5kIGNyZWF0ZSB0aGUgY29ycmVzcG9uZGluZyBIVFRQCisgICAgICogcmVzcG9uc2UgKG9yIGZvcndhcmQgdG8gYW5vdGhlciB3ZWIgY29tcG9uZW50IHRoYXQgd2lsbCBjcmVhdGUgaXQpLgorICAgICAqIFJldHVybiBhbiA8Y29kZT5BY3Rpb25Gb3J3YXJkPC9jb2RlPiBpbnN0YW5jZSBkZXNjcmliaW5nIHdoZXJlIGFuZCBob3cKKyAgICAgKiBjb250cm9sIHNob3VsZCBiZSBmb3J3YXJkZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSByZXNwb25zZSBoYXMKKyAgICAgKiBhbHJlYWR5IGJlZW4gY29tcGxldGVkLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIEFjdGlvbk1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSBhY3Rpb25Gb3JtIFRoZSBvcHRpb25hbCBBY3Rpb25Gb3JtIGJlYW4gZm9yIHRoaXMgcmVxdWVzdCAoaWYgYW55KQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBIVFRQIHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIEhUVFAgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0IGV4Y2VwdGlvbiBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgQWN0aW9uRm9yd2FyZCBwZXJmb3JtKEFjdGlvbk1hcHBpbmcgbWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbkZvcm0gZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKyAgICAgICAgCisKKyAgICAgICAgLy8gQWNxdWlyZSB0aGUgcmVzb3VyY2VzIHRoYXQgd2UgbmVlZAorICAgICAgICBIdHRwU2Vzc2lvbiBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uKCk7CisgICAgICAgIExvY2FsZSBsb2NhbGUgPSBnZXRMb2NhbGUocmVxdWVzdCk7CisgICAgICAgIE1lc3NhZ2VSZXNvdXJjZXMgcmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VzKHJlcXVlc3QpOworICAgICAgICAKKyAgICAgICAgLy8gQWNxdWlyZSBhIHJlZmVyZW5jZSB0byB0aGUgTUJlYW5TZXJ2ZXIgY29udGFpbmluZyBvdXIgTUJlYW5zCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtQlNlcnZlciA9ICgoQXBwbGljYXRpb25TZXJ2bGV0KSBnZXRTZXJ2bGV0KCkpLmdldFNlcnZlcigpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24KKyAgICAgICAgICAgICgiQ2Fubm90IGFjcXVpcmUgTUJlYW5TZXJ2ZXIgcmVmZXJlbmNlIiwgdCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIFNldCB1cCBhIGZvcm0gYmVhbiBjb250YWluaW5nIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQKKyAgICAgICAgLy8gb2JqZWN0cyB0byBiZSBkZWxldGVkCisgICAgICAgIEFsaWFzZXNGb3JtIGFsaWFzZXNGbSA9IG5ldyBBbGlhc2VzRm9ybSgpOworICAgICAgICBBcnJheUxpc3QgYWxpYXNlc0xpc3QgPSBudWxsOworICAgICAgICAKKyAgICAgICAgU3RyaW5nIGhvc3ROYW1lID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoImhvc3ROYW1lIik7CisgICAgICAgIGFsaWFzZXNGbS5zZXRIb3N0TmFtZShob3N0TmFtZSk7CisgICAgICAgIAorICAgICAgICAvLyByZXRyaWV2ZSBhbGwgYWxpYXNlcworICAgICAgICBTdHJpbmcgb3BlcmF0aW9uID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE9iamVjdE5hbWUgaG5hbWUgPSBuZXcgT2JqZWN0TmFtZShob3N0TmFtZSk7CisKKyAgICAgICAgICAgIG9wZXJhdGlvbiA9ICJmaW5kQWxpYXNlcyI7CisgICAgICAgICAgICBTdHJpbmcgYWxpYXNlc1tdID0gCisgICAgICAgICAgICAgICAgKFN0cmluZ1tdKSBtQlNlcnZlci5pbnZva2UoaG5hbWUsIG9wZXJhdGlvbiwgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICBhbGlhc2VzRm0uc2V0QWxpYXNlcyhhbGlhc2VzKTsKKyAgICAgICAgICAgIGFsaWFzZXNMaXN0ID0gbmV3IEFycmF5TGlzdChBcnJheXMuYXNMaXN0KGFsaWFzZXMpKTsKKworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZworICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmludm9rZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uKSwgdCk7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsCisgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuaW52b2tlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24pKTsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7ICAgICAgICAgICAgCisgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgQ29sbGVjdGlvbnMuc29ydChhbGlhc2VzTGlzdCk7ICAgICAgICAKKyAgICAgICAgcmVxdWVzdC5zZXRBdHRyaWJ1dGUoImFsaWFzZXNGb3JtIiwgYWxpYXNlc0ZtKTsgICAgICAgIAorICAgICAgICByZXF1ZXN0LnNldEF0dHJpYnV0ZSgiYWxpYXNlc0xpc3QiLCBhbGlhc2VzTGlzdCk7CisgICAgICAgIAorICAgICAgICAvLyBGb3J3YXJkIHRvIHRoZSBsaXN0IGRpc3BsYXkgcGFnZQorICAgICAgICByZXR1cm4gKG1hcHBpbmcuZmluZEZvcndhcmQoIkFsaWFzZXMiKSk7CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9ob3N0L0RlbGV0ZUFsaWFzRm9ybS5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL2hvc3QvRGVsZXRlQWxpYXNGb3JtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjYxODlkNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9ob3N0L0RlbGV0ZUFsaWFzRm9ybS5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5ob3N0OworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9ybTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKKworLyoqCisgKiBGb3JtIGJlYW4gZm9yIHRoZSAiRGVsZXRlIEFsaWFzIiBwYWdlLgorICoKKyAqIEBhdXRob3IgTWFudmVlbiBLYXVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBEZWxldGVBbGlhc0Zvcm0gZXh0ZW5kcyBBY3Rpb25Gb3JtIHsKKyAgICAKKyAgLy8gTm8gZXh0ZW5zaW9ucyBuZWVkZWQKKyAgICAKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9ob3N0L0RlbGV0ZUFsaWFzZXNBY3Rpb24uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9ob3N0L0RlbGV0ZUFsaWFzZXNBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjI1OWY3Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL2hvc3QvRGVsZXRlQWxpYXNlc0FjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTQxIEBACisvKgorICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5ob3N0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3RJbnN0YW5jZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lm1vZGVsbWJlYW4uTW9kZWxNQmVhbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9ybTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9yd2FyZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy51dGlsLk1lc3NhZ2VSZXNvdXJjZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5BcHBsaWNhdGlvblNlcnZsZXQ7CisKKy8qKgorICogVGhlIDxjb2RlPkFjdGlvbjwvY29kZT4gdGhhdCBjb21wbGV0ZXMgPGVtPkRlbGV0ZSBBbGlhc2VzPC9lbT4KKyAqIHRyYW5zYWN0aW9ucy4KKyAqCisgKiBAYXV0aG9yIE1hbnZlZW4gS2F1cgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgRGVsZXRlQWxpYXNlc0FjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisKKworICAgIC8qKgorICAgICAqIFNpZ25hdHVyZSBmb3IgdGhlIDxjb2RlPnJlbW92ZUFsaWFzPC9jb2RlPiBvcGVyYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcmVtb3ZlQWxpYXNUeXBlc1tdID0KKyAgICB7ICJqYXZhLmxhbmcuU3RyaW5nIiwgICAgICAvLyBPYmplY3QgbmFtZQorICAgIH07CisKKworICAgIC8qKgorICAgICAqIFRoZSBNQmVhblNlcnZlciB3ZSB3aWxsIGJlIGludGVyYWN0aW5nIHdpdGguCisgICAgICovCisgICAgcHJpdmF0ZSBNQmVhblNlcnZlciBtQlNlcnZlciA9IG51bGw7CisgICAgCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBzcGVjaWZpZWQgSFRUUCByZXF1ZXN0LCBhbmQgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIEhUVFAKKyAgICAgKiByZXNwb25zZSAob3IgZm9yd2FyZCB0byBhbm90aGVyIHdlYiBjb21wb25lbnQgdGhhdCB3aWxsIGNyZWF0ZSBpdCkuCisgICAgICogUmV0dXJuIGFuIDxjb2RlPkFjdGlvbkZvcndhcmQ8L2NvZGU+IGluc3RhbmNlIGRlc2NyaWJpbmcgd2hlcmUgYW5kIGhvdworICAgICAqIGNvbnRyb2wgc2hvdWxkIGJlIGZvcndhcmRlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHJlc3BvbnNlIGhhcworICAgICAqIGFscmVhZHkgYmVlbiBjb21wbGV0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgQWN0aW9uTWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIGFjdGlvbkZvcm0gVGhlIG9wdGlvbmFsIEFjdGlvbkZvcm0gYmVhbiBmb3IgdGhpcyByZXF1ZXN0IChpZiBhbnkpCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIEhUVFAgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgSFRUUCByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXhjZXB0aW9uIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBBY3Rpb25Gb3J3YXJkIHBlcmZvcm0oQWN0aW9uTWFwcGluZyBtYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uRm9ybSBmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworICAgICAgICAKKyAgICAgICAgCisgICAgICAgIC8vIExvb2sgdXAgdGhlIGNvbXBvbmVudHMgd2Ugd2lsbCBiZSB1c2luZyBhcyBuZWVkZWQKKyAgICAgICAgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpOworICAgICAgICBMb2NhbGUgbG9jYWxlID0gZ2V0TG9jYWxlKHJlcXVlc3QpOworICAgICAgICBNZXNzYWdlUmVzb3VyY2VzIHJlc291cmNlcyA9IGdldFJlc291cmNlcyhyZXF1ZXN0KTsKKworICAgICAgICAvLyBBY3F1aXJlIGEgcmVmZXJlbmNlIHRvIHRoZSBNQmVhblNlcnZlciBjb250YWluaW5nIG91ciBNQmVhbnMKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1CU2VydmVyID0gKChBcHBsaWNhdGlvblNlcnZsZXQpIGdldFNlcnZsZXQoKSkuZ2V0U2VydmVyKCk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbgorICAgICAgICAgICAgKCJDYW5ub3QgYWNxdWlyZSBNQmVhblNlcnZlciByZWZlcmVuY2UiLCB0KTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgQWxpYXNlc0Zvcm0gYWxpYXNlc0ZtID0gKEFsaWFzZXNGb3JtKSBmb3JtOworICAgICAgICAvLyB0aGUgaG9zdCBOYW1lIGlzIG5lZWRlZCB0byBkZWxldGUgdGhlIGV4aXN0aW5nIGFsaWFzZXMgZnJvbQorICAgICAgICBTdHJpbmcgaG9zdE5hbWUgPSBhbGlhc2VzRm0uZ2V0SG9zdE5hbWUoKTsKKyAgICAgICAgCisgICAgICAgIC8vIERlbGV0ZSB0aGUgc3BlY2lmaWVkIEFsaWFzZXMKKyAgICAgICAgU3RyaW5nIGFsaWFzZXNbXSAgPSBhbGlhc2VzRm0uZ2V0QWxpYXNlcygpOworICAgICAgICBTdHJpbmcgdmFsdWVzW10gPSBuZXcgU3RyaW5nWzFdOworICAgICAgICBTdHJpbmcgb3BlcmF0aW9uID0gInJlbW92ZUFsaWFzIjsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgCisgICAgICAgICAgICBPYmplY3ROYW1lIGhuYW1lID0gbmV3IE9iamVjdE5hbWUoaG9zdE5hbWUpOworCisgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIHNwZWNpZmllZCBob3N0cworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbGlhc2VzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgdmFsdWVzWzBdID0gYWxpYXNlc1tpXTsgICAgICAgICAKKyAgICAgICAgICAgICAgICBtQlNlcnZlci5pbnZva2UoaG5hbWUsIG9wZXJhdGlvbiwgdmFsdWVzLCByZW1vdmVBbGlhc1R5cGVzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZworICAgICAgICAgICAgICAgIChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5pbnZva2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24pLCBlKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuaW52b2tlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uKSk7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworCisgICAgICAgIH0KKworICAgICAgICAvLyBSZXBvcnQgc3VjY2Vzc2Z1bCBjb21wbGV0aW9uIG9mIHRoaXMgdHJhbnNhY3Rpb24KKyAgICAgICAgcmV0dXJuIChtYXBwaW5nLmZpbmRGb3J3YXJkKCJTYXZlIFN1Y2Nlc3NmdWwiKSk7CisKKyAgICB9CisgICAgCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vaG9zdC9EZWxldGVIb3N0QWN0aW9uLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vaG9zdC9EZWxldGVIb3N0QWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RkMDRmOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9ob3N0L0RlbGV0ZUhvc3RBY3Rpb24uamF2YQpAQCAtMCwwICsxLDE2NCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAxLTIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5ob3N0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25FcnJvcnM7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcndhcmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CisKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXJGYWN0b3J5OworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuUXVlcnlFeHA7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5RdWVyeTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdEluc3RhbmNlOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LkpNRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLnV0aWwuTWVzc2FnZVJlc291cmNlczsKKworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkFwcGxpY2F0aW9uU2VydmxldDsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5MaXN0czsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5Ub21jYXRUcmVlQnVpbGRlcjsKKworLyoqCisgKiBUaGUgPGNvZGU+QWN0aW9uPC9jb2RlPiB0aGF0IHNldHMgdXAgPGVtPkRlbGV0ZSBIb3N0czwvZW0+IHRyYW5zYWN0aW9ucy4KKyAqCisgKiBAYXV0aG9yIE1hbnZlZW4gS2F1cgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgRGVsZXRlSG9zdEFjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisgICAgCisKKyAgICAvKioKKyAgICAgKiBUaGUgTUJlYW5TZXJ2ZXIgd2Ugd2lsbCBiZSBpbnRlcmFjdGluZyB3aXRoLgorICAgICAqLworICAgIHByaXZhdGUgTUJlYW5TZXJ2ZXIgbUJTZXJ2ZXIgPSBudWxsOworICAgIAorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisgICAgCisgICAgLyoqCisgICAgICogUHJvY2VzcyB0aGUgc3BlY2lmaWVkIEhUVFAgcmVxdWVzdCwgYW5kIGNyZWF0ZSB0aGUgY29ycmVzcG9uZGluZyBIVFRQCisgICAgICogcmVzcG9uc2UgKG9yIGZvcndhcmQgdG8gYW5vdGhlciB3ZWIgY29tcG9uZW50IHRoYXQgd2lsbCBjcmVhdGUgaXQpLgorICAgICAqIFJldHVybiBhbiA8Y29kZT5BY3Rpb25Gb3J3YXJkPC9jb2RlPiBpbnN0YW5jZSBkZXNjcmliaW5nIHdoZXJlIGFuZCBob3cKKyAgICAgKiBjb250cm9sIHNob3VsZCBiZSBmb3J3YXJkZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSByZXNwb25zZSBoYXMKKyAgICAgKiBhbHJlYWR5IGJlZW4gY29tcGxldGVkLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIEFjdGlvbk1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSBhY3Rpb25Gb3JtIFRoZSBvcHRpb25hbCBBY3Rpb25Gb3JtIGJlYW4gZm9yIHRoaXMgcmVxdWVzdCAoaWYgYW55KQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBIVFRQIHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIEhUVFAgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0IGV4Y2VwdGlvbiBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgQWN0aW9uRm9yd2FyZCBwZXJmb3JtKEFjdGlvbk1hcHBpbmcgbWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbkZvcm0gZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKyAgICAgICAgCisKKyAgICAgICAgLy8gQWNxdWlyZSB0aGUgcmVzb3VyY2VzIHRoYXQgd2UgbmVlZAorICAgICAgICBIdHRwU2Vzc2lvbiBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uKCk7CisgICAgICAgIExvY2FsZSBsb2NhbGUgPSBnZXRMb2NhbGUocmVxdWVzdCk7CisgICAgICAgIE1lc3NhZ2VSZXNvdXJjZXMgcmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VzKHJlcXVlc3QpOworICAgICAgICAKKyAgICAgICAgLy8gQWNxdWlyZSBhIHJlZmVyZW5jZSB0byB0aGUgTUJlYW5TZXJ2ZXIgY29udGFpbmluZyBvdXIgTUJlYW5zCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtQlNlcnZlciA9ICgoQXBwbGljYXRpb25TZXJ2bGV0KSBnZXRTZXJ2bGV0KCkpLmdldFNlcnZlcigpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24KKyAgICAgICAgICAgICgiQ2Fubm90IGFjcXVpcmUgTUJlYW5TZXJ2ZXIgcmVmZXJlbmNlIiwgdCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIFNldCB1cCBhIGZvcm0gYmVhbiBjb250YWluaW5nIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQKKyAgICAgICAgLy8gb2JqZWN0cyB0byBiZSBkZWxldGVkCisgICAgICAgIEhvc3RzRm9ybSBob3N0c0Zvcm0gPSBuZXcgSG9zdHNGb3JtKCk7CisgICAgICAgIFN0cmluZyBzZWxlY3QgPSByZXF1ZXN0LmdldFBhcmFtZXRlcigic2VsZWN0Iik7CisgICAgICAgIFN0cmluZyBkb21haW4gPSBudWxsOworICAgICAgICBpZiAoc2VsZWN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZyBob3N0c1tdID0gbmV3IFN0cmluZ1sxXTsKKyAgICAgICAgICAgIGhvc3RzWzBdID0gc2VsZWN0OworICAgICAgICAgICAgaG9zdHNGb3JtLnNldEhvc3RzKGhvc3RzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBkb21haW4gPSAobmV3IE9iamVjdE5hbWUoc2VsZWN0KSkuZ2V0RG9tYWluKCk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKCJFcnJvciBleHRyYWN0aW5nIHNlcnZpY2UgbmFtZSBmcm9tIHRoZSBob3N0IHRvIGJlIGRlbGV0ZWQiLCBlKTsKKyAgICAgICAgICAgIH0gICAgICAgIAorICAgICAgICB9CisgICAgICAgIFN0cmluZyBhZG1pbkhvc3QgPSBudWxsOworICAgICAgICAvLyBHZXQgdGhlIGhvc3QgbmFtZSB0aGUgYWRtaW4gYXBwIHJ1bnMgb24KKyAgICAgICAgLy8gdGhpcyBob3N0IGNhbm5vdCBiZSBkZWxldGVkIGZyb20gdGhlIGFkbWluIHRvb2wKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFkbWluSG9zdCA9IExpc3RzLmdldEFkbWluQXBwSG9zdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQlNlcnZlciwgImRvbWFpbiIgLHJlcXVlc3QpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPQorICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgImVycm9yLmhvc3ROYW1lLmJhZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRtaW5Ib3N0KTsKKyAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cobWVzc2FnZSk7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19CQURfUkVRVUVTVCwgbWVzc2FnZSk7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICB9CisgICAgICAgIHJlcXVlc3Quc2V0QXR0cmlidXRlKCJhZG1pbkFwcEhvc3QiLCBhZG1pbkhvc3QpOyAgICAgICAKKyAgICAgICAgcmVxdWVzdC5zZXRBdHRyaWJ1dGUoImhvc3RzRm9ybSIsIGhvc3RzRm9ybSk7CisgICAgICAgIAorICAgICAgICAvLyBBY2N1bXVsYXRlIGEgbGlzdCBvZiBhbGwgYXZhaWxhYmxlIGhvc3RzCisgICAgICAgIEFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3RyaW5nIHBhdHRlcm4gPSBkb21haW4gKyBUb21jYXRUcmVlQnVpbGRlci5IT1NUX1RZUEUgKworICAgICAgICAgICAgICAgIFRvbWNhdFRyZWVCdWlsZGVyLldJTERDQVJEOyAgICAgICAgIAorICAgICAgICAgICAgSXRlcmF0b3IgaXRlbXMgPQorICAgICAgICAgICAgICAgIG1CU2VydmVyLnF1ZXJ5TmFtZXMobmV3IE9iamVjdE5hbWUocGF0dGVybiksIG51bGwpLml0ZXJhdG9yKCk7CisgICAgICAgICAgICB3aGlsZSAoaXRlbXMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgbGlzdC5hZGQoaXRlbXMubmV4dCgpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZworICAgICAgICAgICAgICAgIChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5zZWxlY3QiKSk7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsCisgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLnNlbGVjdCIpKTsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIH0KKyAgICAgICAgQ29sbGVjdGlvbnMuc29ydChsaXN0KTsKKyAgICAgICAgcmVxdWVzdC5zZXRBdHRyaWJ1dGUoImhvc3RzTGlzdCIsIGxpc3QpOworICAgICAgICAKKyAgICAgICAgLy8gRm9yd2FyZCB0byB0aGUgbGlzdCBkaXNwbGF5IHBhZ2UKKyAgICAgICAgcmV0dXJuIChtYXBwaW5nLmZpbmRGb3J3YXJkKCJIb3N0cyIpKTsKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL2hvc3QvRGVsZXRlSG9zdHNBY3Rpb24uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9ob3N0L0RlbGV0ZUhvc3RzQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE3ZWY0NwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9ob3N0L0RlbGV0ZUhvc3RzQWN0aW9uLmphdmEKQEAgLTAsMCArMSwxNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLmhvc3Q7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdEluc3RhbmNlOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQubW9kZWxtYmVhbi5Nb2RlbE1CZWFuOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3J3YXJkOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLnV0aWwuTWVzc2FnZVJlc291cmNlczsKKworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkFwcGxpY2F0aW9uU2VydmxldDsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5Ub21jYXRUcmVlQnVpbGRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5UcmVlQ29udHJvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5UcmVlQ29udHJvbE5vZGU7CisKKworLyoqCisgKiBUaGUgPGNvZGU+QWN0aW9uPC9jb2RlPiB0aGF0IGNvbXBsZXRlcyA8ZW0+RGVsZXRlIEhvc3RzPC9lbT4KKyAqIHRyYW5zYWN0aW9ucy4KKyAqCisgKiBAYXV0aG9yIE1hbnZlZW4gS2F1cgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgRGVsZXRlSG9zdHNBY3Rpb24gZXh0ZW5kcyBBY3Rpb24geworCisKKyAgICAvKioKKyAgICAgKiBTaWduYXR1cmUgZm9yIHRoZSA8Y29kZT5yZW1vdmVIb3N0PC9jb2RlPiBvcGVyYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcmVtb3ZlSG9zdFR5cGVzW10gPQorICAgIHsgImphdmEubGFuZy5TdHJpbmciLCAgICAgIC8vIE9iamVjdCBuYW1lCisgICAgfTsKKworCisgICAgLyoqCisgICAgICogVGhlIE1CZWFuU2VydmVyIHdlIHdpbGwgYmUgaW50ZXJhY3Rpbmcgd2l0aC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1CZWFuU2VydmVyIG1CU2VydmVyID0gbnVsbDsKKyAgICAKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIHNwZWNpZmllZCBIVFRQIHJlcXVlc3QsIGFuZCBjcmVhdGUgdGhlIGNvcnJlc3BvbmRpbmcgSFRUUAorICAgICAqIHJlc3BvbnNlIChvciBmb3J3YXJkIHRvIGFub3RoZXIgd2ViIGNvbXBvbmVudCB0aGF0IHdpbGwgY3JlYXRlIGl0KS4KKyAgICAgKiBSZXR1cm4gYW4gPGNvZGU+QWN0aW9uRm9yd2FyZDwvY29kZT4gaW5zdGFuY2UgZGVzY3JpYmluZyB3aGVyZSBhbmQgaG93CisgICAgICogY29udHJvbCBzaG91bGQgYmUgZm9yd2FyZGVkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcmVzcG9uc2UgaGFzCisgICAgICogYWxyZWFkeSBiZWVuIGNvbXBsZXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBBY3Rpb25NYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gYWN0aW9uRm9ybSBUaGUgb3B0aW9uYWwgQWN0aW9uRm9ybSBiZWFuIGZvciB0aGlzIHJlcXVlc3QgKGlmIGFueSkKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgSFRUUCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBIVFRQIHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBleGNlcHRpb24gb2NjdXJzCisgICAgICovCisgICAgcHVibGljIEFjdGlvbkZvcndhcmQgcGVyZm9ybShBY3Rpb25NYXBwaW5nIG1hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb25Gb3JtIGZvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgLy8gTG9vayB1cCB0aGUgY29tcG9uZW50cyB3ZSB3aWxsIGJlIHVzaW5nIGFzIG5lZWRlZAorICAgICAgICBIdHRwU2Vzc2lvbiBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uKCk7CisgICAgICAgIExvY2FsZSBsb2NhbGUgPSBnZXRMb2NhbGUocmVxdWVzdCk7CisgICAgICAgIE1lc3NhZ2VSZXNvdXJjZXMgcmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VzKHJlcXVlc3QpOworCisgICAgICAgIC8vIEFjcXVpcmUgYSByZWZlcmVuY2UgdG8gdGhlIE1CZWFuU2VydmVyIGNvbnRhaW5pbmcgb3VyIE1CZWFucworICAgICAgICB0cnkgeworICAgICAgICAgICAgbUJTZXJ2ZXIgPSAoKEFwcGxpY2F0aW9uU2VydmxldCkgZ2V0U2VydmxldCgpKS5nZXRTZXJ2ZXIoKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uCisgICAgICAgICAgICAoIkNhbm5vdCBhY3F1aXJlIE1CZWFuU2VydmVyIHJlZmVyZW5jZSIsIHQpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBEZWxldGUgdGhlIHNwZWNpZmllZCBIb3N0cworICAgICAgICBTdHJpbmcgaG9zdHNbXSAgPSAoKEhvc3RzRm9ybSkgZm9ybSkuZ2V0SG9zdHMoKTsKKyAgICAgICAgU3RyaW5nIHZhbHVlc1tdID0gbmV3IFN0cmluZ1sxXTsKKyAgICAgICAgU3RyaW5nIG9wZXJhdGlvbiA9ICJyZW1vdmVIb3N0IjsKKworICAgICAgICB0cnkgeworCisgICAgICAgICAgICAvLyBMb29rIHVwIG91ciB0cmVlIGNvbnRyb2wgZGF0YSBzdHJ1Y3R1cmUKKyAgICAgICAgICAgIFRyZWVDb250cm9sIGNvbnRyb2wgPSAoVHJlZUNvbnRyb2wpCisgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRBdHRyaWJ1dGUoInRyZWVDb250cm9sVGVzdCIpOworCisgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIHNwZWNpZmllZCBob3N0cworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBob3N0cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIHZhbHVlc1swXSA9IGhvc3RzW2ldOworICAgICAgICAgICAgICAgIGlmIChjb250cm9sICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udHJvbC5zZWxlY3ROb2RlKG51bGwpOworICAgICAgICAgICAgICAgICAgICBUcmVlQ29udHJvbE5vZGUgbm9kZSA9IGNvbnRyb2wuZmluZE5vZGUoaG9zdHNbaV0pOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZG9tYWluID0gbm9kZS5nZXREb21haW4oKTsKKyAgICAgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSBmbmFtZSA9IFRvbWNhdFRyZWVCdWlsZGVyLmdldE1CZWFuRmFjdG9yeSgpOworICAgICAgICAgICAgICAgICAgICBtQlNlcnZlci5pbnZva2UoZm5hbWUsIG9wZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLCByZW1vdmVIb3N0VHlwZXMpOworICAgICAgICAgICAgICAgICAgICBpZiAobm9kZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBub2RlLnJlbW92ZSgpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZygiTWlzc2luZyBUcmVlQ29udHJvbE5vZGUgZm9yICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3N0c1tpXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nKCJNaXNzaW5nIFRyZWVDb250cm9sIGF0dHJpYnV0ZSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZworICAgICAgICAgICAgICAgIChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5pbnZva2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24pLCBlKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuaW52b2tlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uKSk7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworCisgICAgICAgIH0KKworICAgICAgICAvLyBSZXBvcnQgc3VjY2Vzc2Z1bCBjb21wbGV0aW9uIG9mIHRoaXMgdHJhbnNhY3Rpb24KKyAgICAgICAgcmV0dXJuIChtYXBwaW5nLmZpbmRGb3J3YXJkKCJTYXZlIFN1Y2Nlc3NmdWwiKSk7CisKKyAgICB9CisgICAgCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vaG9zdC9FZGl0SG9zdEFjdGlvbi5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL2hvc3QvRWRpdEhvc3RBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTM3ZGEzCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL2hvc3QvRWRpdEhvc3RBY3Rpb24uamF2YQpAQCAtMCwwICsxLDIwNiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAxLTIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uaG9zdDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25FcnJvcnM7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcndhcmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMudXRpbC5NZXNzYWdlUmVzb3VyY2VzOworCitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdEluc3RhbmNlOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LkpNRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uQXBwbGljYXRpb25TZXJ2bGV0OworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkxhYmVsVmFsdWVCZWFuOworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkxpc3RzOworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLlRvbWNhdFRyZWVCdWlsZGVyOworCisvKioKKyAqIFRoZSA8Y29kZT5BY3Rpb248L2NvZGU+IHRoYXQgc2V0cyB1cCA8ZW0+RWRpdCBIb3N0PC9lbT4gdHJhbnNhY3Rpb25zLgorICoKKyAqIEBhdXRob3IgTWFudmVlbiBLYXVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBFZGl0SG9zdEFjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgTUJlYW5TZXJ2ZXIgd2Ugd2lsbCBiZSBpbnRlcmFjdGluZyB3aXRoLgorICAgICAqLworICAgIHByaXZhdGUgTUJlYW5TZXJ2ZXIgbUJTZXJ2ZXIgPSBudWxsOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIHNwZWNpZmllZCBIVFRQIHJlcXVlc3QsIGFuZCBjcmVhdGUgdGhlIGNvcnJlc3BvbmRpbmcgSFRUUAorICAgICAqIHJlc3BvbnNlIChvciBmb3J3YXJkIHRvIGFub3RoZXIgd2ViIGNvbXBvbmVudCB0aGF0IHdpbGwgY3JlYXRlIGl0KS4KKyAgICAgKiBSZXR1cm4gYW4gPGNvZGU+QWN0aW9uRm9yd2FyZDwvY29kZT4gaW5zdGFuY2UgZGVzY3JpYmluZyB3aGVyZSBhbmQgaG93CisgICAgICogY29udHJvbCBzaG91bGQgYmUgZm9yd2FyZGVkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcmVzcG9uc2UgaGFzCisgICAgICogYWxyZWFkeSBiZWVuIGNvbXBsZXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBBY3Rpb25NYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gYWN0aW9uRm9ybSBUaGUgb3B0aW9uYWwgQWN0aW9uRm9ybSBiZWFuIGZvciB0aGlzIHJlcXVlc3QgKGlmIGFueSkKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgSFRUUCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBIVFRQIHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBleGNlcHRpb24gb2NjdXJzCisgICAgICovCisgICAgcHVibGljIEFjdGlvbkZvcndhcmQgcGVyZm9ybShBY3Rpb25NYXBwaW5nIG1hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb25Gb3JtIGZvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gQWNxdWlyZSB0aGUgcmVzb3VyY2VzIHRoYXQgd2UgbmVlZAorICAgICAgICBIdHRwU2Vzc2lvbiBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uKCk7CisgICAgICAgIExvY2FsZSBsb2NhbGUgPSBnZXRMb2NhbGUocmVxdWVzdCk7CisgICAgICAgIE1lc3NhZ2VSZXNvdXJjZXMgcmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VzKHJlcXVlc3QpOworCisgICAgICAgIC8vIEFjcXVpcmUgYSByZWZlcmVuY2UgdG8gdGhlIE1CZWFuU2VydmVyIGNvbnRhaW5pbmcgb3VyIE1CZWFucworICAgICAgICB0cnkgeworICAgICAgICAgICAgbUJTZXJ2ZXIgPSAoKEFwcGxpY2F0aW9uU2VydmxldCkgZ2V0U2VydmxldCgpKS5nZXRTZXJ2ZXIoKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uCisgICAgICAgICAgICAoIkNhbm5vdCBhY3F1aXJlIE1CZWFuU2VydmVyIHJlZmVyZW5jZSIsIHQpOworICAgICAgICB9CisKKyAgICAgICAgLy8gU2V0IHVwIHRoZSBvYmplY3QgbmFtZXMgb2YgdGhlIE1CZWFucyB3ZSBhcmUgbWFuaXB1bGF0aW5nCisgICAgICAgIE9iamVjdE5hbWUgaG5hbWUgPSBudWxsOworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaG5hbWUgPSBuZXcgT2JqZWN0TmFtZShyZXF1ZXN0LmdldFBhcmFtZXRlcigic2VsZWN0IikpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPQorICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgImVycm9yLmhvc3ROYW1lLmJhZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5nZXRQYXJhbWV0ZXIoInNlbGVjdCIpKTsKKyAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cobWVzc2FnZSk7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19CQURfUkVRVUVTVCwgbWVzc2FnZSk7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBTdHJpbmcgYWRtaW5Ib3N0ID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIGRvbWFpbiA9IGhuYW1lLmdldERvbWFpbigpOworICAgICAgICAvLyBHZXQgdGhlIGhvc3QgbmFtZSB0aGUgYWRtaW4gYXBwIHJ1bnMgb24KKyAgICAgICAgLy8gdGhpcyBob3N0IGNhbm5vdCBiZSBkZWxldGVkIGZyb20gdGhlIGFkbWluIHRvb2wKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFkbWluSG9zdCA9IExpc3RzLmdldEFkbWluQXBwSG9zdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQlNlcnZlciwgZG9tYWluICxyZXF1ZXN0KTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0KKyAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJlcnJvci5ob3N0TmFtZS5iYWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkbWluSG9zdCk7CisgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nKG1lc3NhZ2UpOworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfQkFEX1JFUVVFU1QsIG1lc3NhZ2UpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgfQorICAgICAgICByZXF1ZXN0LnNldEF0dHJpYnV0ZSgiYWRtaW5BcHBIb3N0IiwgYWRtaW5Ib3N0KTsKKworICAgICAgICAvLyBGaWxsIGluIHRoZSBmb3JtIHZhbHVlcyBmb3IgZGlzcGxheSBhbmQgZWRpdGluZworICAgICAgICBIb3N0Rm9ybSBob3N0Rm0gPSBuZXcgSG9zdEZvcm0oKTsKKyAgICAgICAgc2Vzc2lvbi5zZXRBdHRyaWJ1dGUoImhvc3RGb3JtIiwgaG9zdEZtKTsKKyAgICAgICAgaG9zdEZtLnNldEFkbWluQWN0aW9uKCJFZGl0Iik7CisgICAgICAgIGhvc3RGbS5zZXRPYmplY3ROYW1lKGhuYW1lLnRvU3RyaW5nKCkpOworICAgICAgICBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgc2IuYXBwZW5kKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInNlcnZlci5zZXJ2aWNlLnRyZWVCdWlsZGVyLmhvc3QiKSk7CisgICAgICAgIHNiLmFwcGVuZCgiICgiKTsKKyAgICAgICAgc2IuYXBwZW5kKGhuYW1lLmdldEtleVByb3BlcnR5KCJob3N0IikpOworICAgICAgICBzYi5hcHBlbmQoIikiKTsKKyAgICAgICAgaG9zdEZtLnNldE5vZGVMYWJlbChzYi50b1N0cmluZygpKTsKKyAgICAgICAgaG9zdEZtLnNldEJvb2xlYW5WYWxzKExpc3RzLmdldEJvb2xlYW5WYWx1ZXMoKSk7CisKKyAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZSA9IG51bGw7CisgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgIC8vIENvcHkgc2NhbGFyIHByb3BlcnRpZXMKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJuYW1lIjsKKyAgICAgICAgICAgIGhvc3RGbS5zZXRIb3N0TmFtZQorICAgICAgICAgICAgICAgICgoU3RyaW5nKSBtQlNlcnZlci5nZXRBdHRyaWJ1dGUoaG5hbWUsIGF0dHJpYnV0ZSkpOworCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAiYXBwQmFzZSI7CisgICAgICAgICAgICBob3N0Rm0uc2V0QXBwQmFzZQorICAgICAgICAgICAgICAgICgoU3RyaW5nKSBtQlNlcnZlci5nZXRBdHRyaWJ1dGUoaG5hbWUsIGF0dHJpYnV0ZSkpOworICAgICAgICAgICAgYXR0cmlidXRlID0gImF1dG9EZXBsb3kiOworICAgICAgICAgICAgaG9zdEZtLnNldEF1dG9EZXBsb3kKKyAgICAgICAgICAgICAgICAoKChCb29sZWFuKSBtQlNlcnZlci5nZXRBdHRyaWJ1dGUoaG5hbWUsIGF0dHJpYnV0ZSkpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgYXR0cmlidXRlID0gImRlcGxveVhNTCI7CisgICAgICAgICAgICBob3N0Rm0uc2V0RGVwbG95WE1MCisgICAgICAgICAgICAgICAgKCgoQm9vbGVhbikgbUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKGhuYW1lLCBhdHRyaWJ1dGUpKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJkZXBsb3lPblN0YXJ0dXAiOworICAgICAgICAgICAgaG9zdEZtLnNldERlcGxveU9uU3RhcnR1cAorICAgICAgICAgICAgICAgICgoKEJvb2xlYW4pIG1CU2VydmVyLmdldEF0dHJpYnV0ZShobmFtZSwgYXR0cmlidXRlKSkudG9TdHJpbmcoKSk7ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgYXR0cmlidXRlID0gInVucGFja1dBUnMiOworICAgICAgICAgICAgaG9zdEZtLnNldFVucGFja1dBUnMKKyAgICAgICAgICAgICAgICAoKChCb29sZWFuKSBtQlNlcnZlci5nZXRBdHRyaWJ1dGUoaG5hbWUsIGF0dHJpYnV0ZSkpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgYXR0cmlidXRlID0gInhtbE5hbWVzcGFjZUF3YXJlIjsKKyAgICAgICAgICAgIGhvc3RGbS5zZXRYbWxOYW1lc3BhY2VBd2FyZQorICAgICAgICAgICAgICAgICgoKEJvb2xlYW4pIG1CU2VydmVyLmdldEF0dHJpYnV0ZShobmFtZSwgYXR0cmlidXRlKSkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAieG1sVmFsaWRhdGlvbiI7CisgICAgICAgICAgICBob3N0Rm0uc2V0WG1sVmFsaWRhdGlvbgorICAgICAgICAgICAgICAgICgoKEJvb2xlYW4pIG1CU2VydmVyLmdldEF0dHJpYnV0ZShobmFtZSwgYXR0cmlidXRlKSkudG9TdHJpbmcoKSk7CisKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuYXR0cmlidXRlLmdldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSksIHQpOworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5hdHRyaWJ1dGUuZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlKSk7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgLy8gcmV0cmlldmUgYWxsIGFsaWFzZXMKKyAgICAgICAgU3RyaW5nIG9wZXJhdGlvbiA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvcGVyYXRpb24gPSAiZmluZEFsaWFzZXMiOworICAgICAgICAgICAgU3RyaW5nIGFsaWFzZXNbXSA9CisgICAgICAgICAgICAgICAgKFN0cmluZ1tdKSBtQlNlcnZlci5pbnZva2UoaG5hbWUsIG9wZXJhdGlvbiwgbnVsbCwgbnVsbCk7CisKKyAgICAgICAgICAgIGhvc3RGbS5zZXRBbGlhc1ZhbHMobmV3IEFycmF5TGlzdChBcnJheXMuYXNMaXN0KGFsaWFzZXMpKSk7CisKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgIChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5pbnZva2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbiksIHQpOworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmludm9rZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uKSk7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgLy8gRm9yd2FyZCB0byB0aGUgaG9zdCBkaXNwbGF5IHBhZ2UKKyAgICAgICAgcmV0dXJuIChtYXBwaW5nLmZpbmRGb3J3YXJkKCJIb3N0IikpOworCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL2hvc3QvSG9zdEZvcm0uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9ob3N0L0hvc3RGb3JtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ3ZTdkMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9ob3N0L0hvc3RGb3JtLmphdmEKQEAgLTAsMCArMSw0NjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLmhvc3Q7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25FcnJvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRXJyb3JzOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEZvcm0gYmVhbiBmb3IgdGhlIGhvc3QgcGFnZS4KKyAqCisgKiBAYXV0aG9yIE1hbnZlZW4gS2F1cgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgSG9zdEZvcm0gZXh0ZW5kcyBBY3Rpb25Gb3JtIHsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisgICAgLyoqCisgICAgICogVGhlIGFkbWluaXN0cmF0aXZlIGFjdGlvbiByZXByZXNlbnRlZCBieSB0aGlzIGZvcm0uCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgYWRtaW5BY3Rpb24gPSAiRWRpdCI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgb2JqZWN0IG5hbWUgb2YgdGhpcyBIb3N0IGJlYW4gcmVmZXJzIHRvLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIG9iamVjdE5hbWUgPSBudWxsOworCisgICAgLyoqCisgICAgICogVGhlIHRleHQgZm9yIHRoZSBub2RlIGxhYmVsLiBUaGlzIGlzIG9mIHRoZSBmb3JtICdIb3N0KG5hbWUpJworICAgICAqIGFuZCBpcyBwaWNrZWQgdXAgZnJvbSB0aGUgbm9kZSBvZiB0aGUgdHJlZSB0aGF0IGlzIGNsaWNrZWQgb24uCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbm9kZUxhYmVsID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciB0aGUgaG9zdE5hbWUuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgaG9zdE5hbWUgPSBudWxsOworCisgICAgLyoqCisgICAgICogVGhlIG9iamVjdCBuYW1lIG9mIHRoZSBzZXJ2aWNlIHRoaXMgaG9zdCBiZWxvbmdzIHRvLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHNlcnZpY2VOYW1lID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFRoZSBkaXJlY3RvcnkgZm9yIHRoZSBhcHBCYXNlLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGFwcEJhc2UgPSBudWxsOworCisgICAgLyoqCisgICAgICogQm9vbGVhbiBmb3IgYXV0b0RlcGxveS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBhdXRvRGVwbG95ID0gInRydWUiOworCisgICAgLyoqCisgICAgICogQm9vbGVhbiBmb3IgZGVwbG95WE1MLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGRlcGxveVhNTCA9ICJ0cnVlIjsKKworICAgIC8qKgorICAgICAqIEJvb2xlYW4gZm9yIGRlcGxveU9uU3RhcnR1cC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBkZXBsb3lPblN0YXJ0dXAgPSAidHJ1ZSI7CisgICAgCisgICAgLyoqCisgICAgICogQm9vbGVhbiBmb3IgdW5wYWNrIFdBUnMuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgdW5wYWNrV0FScyA9ICJmYWxzZSI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdGV4dCBmb3IgdGhlIHBvcnQuIC0tIFRCRAorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGZpbmRBbGlhc2VzID0gbnVsbDsKKworICAgIC8qCisgICAgICogUmVwcmVzZW50IGJvb2xlYW4gKHRydWUsIGZhbHNlKSB2YWx1ZXMgZm9yIHVucGFja1dBUnMgZXRjLgorICAgICAqLworICAgIHByaXZhdGUgTGlzdCBib29sZWFuVmFscyA9IG51bGw7CisKKyAgICAvKgorICAgICAqIFJlcHJlc2VudCBhbGlhc2VzIGFzIGEgTGlzdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIExpc3QgYWxpYXNWYWxzID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIEJvb2xlYW4gZm9yIHhtbE5hbWVzcGFjZUF3YXJlLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHhtbE5hbWVzcGFjZUF3YXJlID0gImZhbHNlIjsKKworICAgIC8qKgorICAgICAqIEJvb2xlYW4gZm9yIHhtbFZhbGlkYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgeG1sVmFsaWRhdGlvbiA9ICJmYWxzZSI7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgYWRtaW5pc3RyYXRpdmUgYWN0aW9uIHJlcHJlc2VudGVkIGJ5IHRoaXMgZm9ybS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEFkbWluQWN0aW9uKCkgeworCisgICAgICAgIHJldHVybiB0aGlzLmFkbWluQWN0aW9uOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGFkbWluaXN0cmF0aXZlIGFjdGlvbiByZXByZXNlbnRlZCBieSB0aGlzIGZvcm0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QWRtaW5BY3Rpb24oU3RyaW5nIGFkbWluQWN0aW9uKSB7CisKKyAgICAgICAgdGhpcy5hZG1pbkFjdGlvbiA9IGFkbWluQWN0aW9uOworCisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBvYmplY3QgbmFtZSBvZiB0aGUgSG9zdCB0aGlzIGJlYW4gcmVmZXJzIHRvLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0T2JqZWN0TmFtZSgpIHsKKworICAgICAgICByZXR1cm4gdGhpcy5vYmplY3ROYW1lOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG9iamVjdCBuYW1lIG9mIHRoZSBIb3N0IHRoaXMgYmVhbiByZWZlcnMgdG8uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0T2JqZWN0TmFtZShTdHJpbmcgb2JqZWN0TmFtZSkgeworCisgICAgICAgIHRoaXMub2JqZWN0TmFtZSA9IG9iamVjdE5hbWU7CisKKyAgICB9CisgICAgCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG9iamVjdCBuYW1lIG9mIHRoZSBzZXJ2aWNlIHRoaXMgaG9zdCBiZWxvbmdzIHRvLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZU5hbWUoKSB7CisKKyAgICAgICAgcmV0dXJuIHRoaXMuc2VydmljZU5hbWU7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgb2JqZWN0IG5hbWUgb2YgdGhlIFNlcnZpY2UgdGhpcyBob3N0IGJlbG9uZ3MgdG8uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2VydmljZU5hbWUoU3RyaW5nIHNlcnZpY2VOYW1lKSB7CisKKyAgICAgICAgdGhpcy5zZXJ2aWNlTmFtZSA9IHNlcnZpY2VOYW1lOworCisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBsYWJlbCBvZiB0aGUgbm9kZSB0aGF0IHdhcyBjbGlja2VkLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Tm9kZUxhYmVsKCkgeworCisgICAgICAgIHJldHVybiB0aGlzLm5vZGVMYWJlbDsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbm9kZSBsYWJlbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXROb2RlTGFiZWwoU3RyaW5nIG5vZGVMYWJlbCkgeworCisgICAgICAgIHRoaXMubm9kZUxhYmVsID0gbm9kZUxhYmVsOworCisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBob3N0IG5hbWUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRIb3N0TmFtZSgpIHsKKworICAgICAgICByZXR1cm4gdGhpcy5ob3N0TmFtZTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgaG9zdCBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEhvc3ROYW1lKFN0cmluZyBob3N0TmFtZSkgeworCisgICAgICAgIHRoaXMuaG9zdE5hbWUgPSBob3N0TmFtZTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgYXBwQmFzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEFwcEJhc2UoKSB7CisKKyAgICAgICAgcmV0dXJuIHRoaXMuYXBwQmFzZTsKKworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGF1dG9EZXBsb3kuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRBdXRvRGVwbG95KCkgeworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXMuYXV0b0RlcGxveTsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgYXV0b0RlcGxveS4KKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRBdXRvRGVwbG95KFN0cmluZyBhdXRvRGVwbG95KSB7CisgICAgICAgIAorICAgICAgICB0aGlzLmF1dG9EZXBsb3kgPSBhdXRvRGVwbG95OworICAgICAgICAKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGRlcGxveVhNTC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldERlcGxveVhNTCgpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLmRlcGxveVhNTDsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgZGVwbG95WE1MLgorICAgICAqLworICAgIAorICAgIHB1YmxpYyB2b2lkIHNldERlcGxveVhNTChTdHJpbmcgZGVwbG95WE1MKSB7CisgICAgICAgIAorICAgICAgICB0aGlzLmRlcGxveVhNTCA9IGRlcGxveVhNTDsKKyAgICAgICAgCisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBkZXBsb3lPblN0YXJ0dXAuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXREZXBsb3lPblN0YXJ0dXAoKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy5kZXBsb3lPblN0YXJ0dXA7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGRlcGxveU9uU3RhcnR1cC4KKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXREZXBsb3lPblN0YXJ0dXAoU3RyaW5nIGRlcGxveU9uU3RhcnR1cCkgeworICAgICAgICAKKyAgICAgICAgdGhpcy5kZXBsb3lPblN0YXJ0dXAgPSBkZXBsb3lPblN0YXJ0dXA7CisgICAgICAgIAorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYXBwQmFzZS4KKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIHNldEFwcEJhc2UoU3RyaW5nIGFwcEJhc2UpIHsKKworICAgICAgICB0aGlzLmFwcEJhc2UgPSBhcHBCYXNlOworCisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB1bnBhY2tXQVJzLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VW5wYWNrV0FScygpIHsKKworICAgICAgICByZXR1cm4gdGhpcy51bnBhY2tXQVJzOworCisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSB1bnBhY2tXQVJzLgorICAgICAqLworCisgICAgcHVibGljIHZvaWQgc2V0VW5wYWNrV0FScyhTdHJpbmcgdW5wYWNrV0FScykgeworCisgICAgICAgIHRoaXMudW5wYWNrV0FScyA9IHVucGFja1dBUnM7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGJvb2xlYW5WYWxzLgorICAgICAqLworICAgIHB1YmxpYyBMaXN0IGdldEJvb2xlYW5WYWxzKCkgeworCisgICAgICAgIHJldHVybiB0aGlzLmJvb2xlYW5WYWxzOworCisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBib29sZWFuVmFscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRCb29sZWFuVmFscyhMaXN0IGJvb2xlYW5WYWxzKSB7CisKKyAgICAgICAgdGhpcy5ib29sZWFuVmFscyA9IGJvb2xlYW5WYWxzOworCisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBMaXN0IG9mIGFsaWFzIFZhbHMuCisgICAgICovCisgICAgcHVibGljIExpc3QgZ2V0QWxpYXNWYWxzKCkgeworCisgICAgICAgIHJldHVybiB0aGlzLmFsaWFzVmFsczsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYWxpYXMgVmFscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBbGlhc1ZhbHMoTGlzdCBhbGlhc1ZhbHMpIHsKKworICAgICAgICB0aGlzLmFsaWFzVmFscyA9IGFsaWFzVmFsczsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgeG1sTmFtZXNwYWNlQXdhcmUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRYbWxOYW1lc3BhY2VBd2FyZSgpIHsKKworICAgICAgICByZXR1cm4gdGhpcy54bWxOYW1lc3BhY2VBd2FyZTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgeG1sTmFtZXNwYWNlQXdhcmUuCisgICAgICovCisKKyAgICBwdWJsaWMgdm9pZCBzZXRYbWxOYW1lc3BhY2VBd2FyZShTdHJpbmcgeG1sTmFtZXNwYWNlQXdhcmUpIHsKKworICAgICAgICB0aGlzLnhtbE5hbWVzcGFjZUF3YXJlID0geG1sTmFtZXNwYWNlQXdhcmU7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHhtbFZhbGlkYXRpb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRYbWxWYWxpZGF0aW9uKCkgeworCisgICAgICAgIHJldHVybiB0aGlzLnhtbFZhbGlkYXRpb247CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHhtbFZhbGlkYXRpb24uCisgICAgICovCisKKyAgICBwdWJsaWMgdm9pZCBzZXRYbWxWYWxpZGF0aW9uKFN0cmluZyB4bWxWYWxpZGF0aW9uKSB7CisKKyAgICAgICAgdGhpcy54bWxWYWxpZGF0aW9uID0geG1sVmFsaWRhdGlvbjsKKworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisgICAgLyoqCisgICAgICogUmVzZXQgYWxsIHByb3BlcnRpZXMgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgbWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlc2V0KEFjdGlvbk1hcHBpbmcgbWFwcGluZywgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKworICAgICAgICB0aGlzLm9iamVjdE5hbWUgPSBudWxsOyAgICAgICAgCisgICAgICAgIHRoaXMuc2VydmljZU5hbWUgPSBudWxsOworICAgICAgICB0aGlzLmhvc3ROYW1lID0gbnVsbDsKKyAgICAgICAgdGhpcy5hcHBCYXNlID0gbnVsbDsKKyAgICAgICAgdGhpcy5hdXRvRGVwbG95ID0gInRydWUiOworICAgICAgICB0aGlzLmRlcGxveVhNTCA9ICJ0cnVlIjsKKyAgICAgICAgdGhpcy5kZXBsb3lPblN0YXJ0dXAgPSAidHJ1ZSI7CisgICAgICAgIHRoaXMudW5wYWNrV0FScyA9ICJ0cnVlIjsKKworICAgIH0KKworICAgICAvKioKKyAgICAgKiBSZW5kZXIgdGhpcyBvYmplY3QgYXMgYSBTdHJpbmcuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCJIb3N0Rm9ybVthZG1pbkFjdGlvbj0iKTsKKyAgICAgICAgc2IuYXBwZW5kKGFkbWluQWN0aW9uKTsKKyAgICAgICAgc2IuYXBwZW5kKCIsYXBwQmFzZT0iKTsKKyAgICAgICAgc2IuYXBwZW5kKGFwcEJhc2UpOworICAgICAgICBzYi5hcHBlbmQoIixhdXRvRGVwbG95PSIpOworICAgICAgICBzYi5hcHBlbmQoYXV0b0RlcGxveSk7CisgICAgICAgIHNiLmFwcGVuZCgiLGRlcGxveVhNTD0iKTsKKyAgICAgICAgc2IuYXBwZW5kKGRlcGxveVhNTCk7CisgICAgICAgIHNiLmFwcGVuZCgiLGRlcGxveU9uU3RhcnR1cD0iKTsKKyAgICAgICAgc2IuYXBwZW5kKGRlcGxveU9uU3RhcnR1cCk7CisgICAgICAgIHNiLmFwcGVuZCgiLHVucGFja1dBUnM9Iik7CisgICAgICAgIHNiLmFwcGVuZCh1bnBhY2tXQVJzKTsKKyAgICAgICAgc2IuYXBwZW5kKCInLG9iamVjdE5hbWU9JyIpOworICAgICAgICBzYi5hcHBlbmQob2JqZWN0TmFtZSk7CisgICAgICAgIHNiLmFwcGVuZCgiJyxob3N0TmFtZT0iKTsKKyAgICAgICAgc2IuYXBwZW5kKGhvc3ROYW1lKTsKKyAgICAgICAgc2IuYXBwZW5kKCInLHNlcnZpY2VOYW1lPSIpOworICAgICAgICBzYi5hcHBlbmQoc2VydmljZU5hbWUpOworICAgICAgICBzYi5hcHBlbmQoIl0iKTsKKyAgICAgICAgcmV0dXJuIChzYi50b1N0cmluZygpKTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFZhbGlkYXRlIHRoZSBwcm9wZXJ0aWVzIHRoYXQgaGF2ZSBiZWVuIHNldCBmcm9tIHRoaXMgSFRUUCByZXF1ZXN0LAorICAgICAqIGFuZCByZXR1cm4gYW4gPGNvZGU+QWN0aW9uRXJyb3JzPC9jb2RlPiBvYmplY3QgdGhhdCBlbmNhcHN1bGF0ZXMgYW55CisgICAgICogdmFsaWRhdGlvbiBlcnJvcnMgdGhhdCBoYXZlIGJlZW4gZm91bmQuICBJZiBubyBlcnJvcnMgYXJlIGZvdW5kLCByZXR1cm4KKyAgICAgKiA8Y29kZT5udWxsPC9jb2RlPiBvciBhbiA8Y29kZT5BY3Rpb25FcnJvcnM8L2NvZGU+IG9iamVjdCB3aXRoIG5vCisgICAgICogcmVjb3JkZWQgZXJyb3IgbWVzc2FnZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgbWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqLworCisgICAgcHVibGljIEFjdGlvbkVycm9ycyB2YWxpZGF0ZShBY3Rpb25NYXBwaW5nIG1hcHBpbmcsCisgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKworICAgICAgICBBY3Rpb25FcnJvcnMgZXJyb3JzID0gbmV3IEFjdGlvbkVycm9ycygpOworCisgICAgICAgIFN0cmluZyBzdWJtaXQgPSByZXF1ZXN0LmdldFBhcmFtZXRlcigic3VibWl0Iik7CisKKyAgICAgICAgLy8gZnJvbnQgZW5kIHZhbGlkYXRpb24gd2hlbiBzYXZlIGlzIGNsaWNrZWQuCisgICAgICAgIC8vaWYgKHN1Ym1pdCAhPSBudWxsKSB7CisKKyAgICAgICAgICAgIC8vIGhvc3ROYW1lIGNhbm5vdCBiZSBudWxsCisgICAgICAgICAgICBpZiAoKGhvc3ROYW1lPT0gbnVsbCkgfHwgKGhvc3ROYW1lLmxlbmd0aCgpIDwgMSkpIHsKKyAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKCJob3N0TmFtZSIsIG5ldyBBY3Rpb25FcnJvcigiZXJyb3IuaG9zdE5hbWUucmVxdWlyZWQiKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGFwcEJhc2UgY2Fubm90IGJlIG51bGwKKyAgICAgICAgICAgIGlmICgoYXBwQmFzZSA9PSBudWxsKSB8fCAoYXBwQmFzZS5sZW5ndGgoKSA8IDEpKSB7CisgICAgICAgICAgICAgICAgZXJyb3JzLmFkZCgiYXBwQmFzZSIsIG5ldyBBY3Rpb25FcnJvcigiZXJyb3IuYXBwQmFzZS5yZXF1aXJlZCIpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAvL30KKyAgICAgICAgcmV0dXJuIGVycm9yczsKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL2hvc3QvSG9zdHNGb3JtLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vaG9zdC9Ib3N0c0Zvcm0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjFjNGZjCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL2hvc3QvSG9zdHNGb3JtLmphdmEKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLmhvc3Q7CisKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CisKKworLyoqCisgKiBGb3JtIGJlYW4gZm9yIGRlbGV0aW5nIGhvc3RzLgorICoKKyAqIEBhdXRob3IgTWFudmVlbiBLYXVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBIb3N0c0Zvcm0gZXh0ZW5kcyBBY3Rpb25Gb3JtIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBvYmplY3QgbmFtZXMgb2YgdGhlIGhvc3RzIHRvIGJlIGRlbGV0ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgaG9zdHNbXSA9IG5ldyBTdHJpbmdbMF07CisKKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0SG9zdHMoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5ob3N0cyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SG9zdHMoU3RyaW5nIGhvc3RzW10pIHsKKyAgICAgICAgdGhpcy5ob3N0cyA9IGhvc3RzOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJlc2V0IGFsbCBwcm9wZXJ0aWVzIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIG1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZXNldChBY3Rpb25NYXBwaW5nIG1hcHBpbmcsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisKKyAgICAgICAgdGhpcy5ob3N0cyA9IG5ldyBTdHJpbmdbMF07CisKKyAgICB9CisgICAgICAgIAorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vaG9zdC9TYXZlQWxpYXNBY3Rpb24uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9ob3N0L1NhdmVBbGlhc0FjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkM2RmM2MKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vaG9zdC9TYXZlQWxpYXNBY3Rpb24uamF2YQpAQCAtMCwwICsxLDE1NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAxLTIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uaG9zdDsKKworaW1wb3J0IGphdmEubmV0LlVSTEVuY29kZXI7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LkF0dHJpYnV0ZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXJGYWN0b3J5OworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuUXVlcnlFeHA7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5RdWVyeTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdEluc3RhbmNlOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LkpNRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25FcnJvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRXJyb3JzOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3J3YXJkOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLnV0aWwuTWVzc2FnZVJlc291cmNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5BcHBsaWNhdGlvblNlcnZsZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uVG9tY2F0VHJlZUJ1aWxkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uVHJlZUNvbnRyb2w7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uVHJlZUNvbnRyb2xOb2RlOworCisKKworLyoqCisgKiBUaGUgPGNvZGU+QWN0aW9uPC9jb2RlPiB0aGF0IGNvbXBsZXRlcyA8ZW0+QWRkIEFsaWFzPC9lbT4gYW5kCisgKiA8ZW0+RWRpdCBBbGlhczwvZW0+IHRyYW5zYWN0aW9ucy4KKyAqCisgKiBAYXV0aG9yIE1hbnZlZW4gS2F1cgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgU2F2ZUFsaWFzQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKyAgICAvKioKKyAgICAgKiBTaWduYXR1cmUgZm9yIHRoZSA8Y29kZT5jcmVhdGVTdGFuZGFyZEFsaWFzPC9jb2RlPiBvcGVyYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgY3JlYXRlU3RhbmRhcmRBbGlhc1R5cGVzW10gPQorICAgIHsgImphdmEubGFuZy5TdHJpbmciLCAgICAgLy8gaG9zdAorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBUaGUgTUJlYW5TZXJ2ZXIgd2Ugd2lsbCBiZSBpbnRlcmFjdGluZyB3aXRoLgorICAgICAqLworICAgIHByaXZhdGUgTUJlYW5TZXJ2ZXIgbUJTZXJ2ZXIgPSBudWxsOworICAgIAorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisgICAgCisgICAgCisgICAgLyoqCisgICAgICogUHJvY2VzcyB0aGUgc3BlY2lmaWVkIEhUVFAgcmVxdWVzdCwgYW5kIGNyZWF0ZSB0aGUgY29ycmVzcG9uZGluZyBIVFRQCisgICAgICogcmVzcG9uc2UgKG9yIGZvcndhcmQgdG8gYW5vdGhlciB3ZWIgY29tcG9uZW50IHRoYXQgd2lsbCBjcmVhdGUgaXQpLgorICAgICAqIFJldHVybiBhbiA8Y29kZT5BY3Rpb25Gb3J3YXJkPC9jb2RlPiBpbnN0YW5jZSBkZXNjcmliaW5nIHdoZXJlIGFuZCBob3cKKyAgICAgKiBjb250cm9sIHNob3VsZCBiZSBmb3J3YXJkZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSByZXNwb25zZSBoYXMKKyAgICAgKiBhbHJlYWR5IGJlZW4gY29tcGxldGVkLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIEFjdGlvbk1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSBhY3Rpb25Gb3JtIFRoZSBvcHRpb25hbCBBY3Rpb25Gb3JtIGJlYW4gZm9yIHRoaXMgcmVxdWVzdCAoaWYgYW55KQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBIVFRQIHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIEhUVFAgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0IGV4Y2VwdGlvbiBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgQWN0aW9uRm9yd2FyZCBwZXJmb3JtKEFjdGlvbk1hcHBpbmcgbWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbkZvcm0gZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKyAgICAgICAgCisgICAgICAgIC8vIEFjcXVpcmUgdGhlIHJlc291cmNlcyB0aGF0IHdlIG5lZWQKKyAgICAgICAgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpOworICAgICAgICBMb2NhbGUgbG9jYWxlID0gZ2V0TG9jYWxlKHJlcXVlc3QpOworICAgICAgICBNZXNzYWdlUmVzb3VyY2VzIHJlc291cmNlcyA9IGdldFJlc291cmNlcyhyZXF1ZXN0KTsKKyAgICAgICAgCisgICAgICAgIC8vIEFjcXVpcmUgYSByZWZlcmVuY2UgdG8gdGhlIE1CZWFuU2VydmVyIGNvbnRhaW5pbmcgb3VyIE1CZWFucworICAgICAgICB0cnkgeworICAgICAgICAgICAgbUJTZXJ2ZXIgPSAoKEFwcGxpY2F0aW9uU2VydmxldCkgZ2V0U2VydmxldCgpKS5nZXRTZXJ2ZXIoKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uCisgICAgICAgICAgICAoIkNhbm5vdCBhY3F1aXJlIE1CZWFuU2VydmVyIHJlZmVyZW5jZSIsIHQpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBJZGVudGlmeSB0aGUgcmVxdWVzdGVkIGFjdGlvbgorICAgICAgICBBbGlhc0Zvcm0gYWZvcm0gPSAoQWxpYXNGb3JtKSBmb3JtOworCisgICAgICAgIC8vIFBlcmZvcm0gYSAiQ3JlYXRlIEFsaWFzIiB0cmFuc2FjdGlvbiAoaWYgcmVxdWVzdGVkKQorICAgICAgICBTdHJpbmcgb3BlcmF0aW9uID0gImFkZEFsaWFzIjsKKyAgICAgICAgCisgICAgICAgIC8vYWxpYXMgdG8gYmUgYWRkZWQKKyAgICAgICAgT2JqZWN0IHZhbHVlc1tdID0gbmV3IFN0cmluZ1sxXTsKKyAgICAgICAgdmFsdWVzWzBdID0gYWZvcm0uZ2V0QWxpYXNOYW1lKCk7CisKKyAgICAgICAgU3RyaW5nIGhvc3ROYW1lID0gYWZvcm0uZ2V0SG9zdE5hbWUoKTsKKworICAgICAgICAvLyB2YWxpZGF0ZSBpZiB0aGlzIGFsaWFzIGFscmVhZHkgZXhpc3RzLgorICAgICAgICBMaXN0IGFsaWFzVmFscyA9IGFmb3JtLmdldEFsaWFzVmFscygpOworICAgICAgICBpZiAoYWxpYXNWYWxzLmNvbnRhaW5zKHZhbHVlc1swXSkpIHsKKyAgICAgICAgICAgQWN0aW9uRXJyb3JzIGVycm9ycyA9IG5ldyBBY3Rpb25FcnJvcnMoKTsKKyAgICAgICAgICAgIGVycm9ycy5hZGQoImFsaWFzTmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBY3Rpb25FcnJvcigiZXJyb3IuYWxpYXNOYW1lLmV4aXN0cyIpKTsKKyAgICAgICAgICAgIHNhdmVFcnJvcnMocmVxdWVzdCwgZXJyb3JzKTsKKyAgICAgICAgICAgIHJldHVybiAobmV3IEFjdGlvbkZvcndhcmQobWFwcGluZy5nZXRJbnB1dCgpKSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIE9iamVjdE5hbWUgaG5hbWUgPSBuZXcgT2JqZWN0TmFtZShob3N0TmFtZSk7CisgICAgICAgICAgICBtQlNlcnZlci5pbnZva2UoaG5hbWUsIG9wZXJhdGlvbiwgdmFsdWVzLCBjcmVhdGVTdGFuZGFyZEFsaWFzVHlwZXMpOworCisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nCisgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuaW52b2tlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24pLCB0KTsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKKyAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5pbnZva2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbikpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsgICAgICAgICAgICAKKyAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIC8vIEZvcndhcmQgdG8gdGhlIHN1Y2Nlc3MgcmVwb3J0aW5nIHBhZ2UKKyAgICAgICAgc2Vzc2lvbi5yZW1vdmVBdHRyaWJ1dGUobWFwcGluZy5nZXRBdHRyaWJ1dGUoKSk7CisgICAgICAgIHJldHVybiAobWFwcGluZy5maW5kRm9yd2FyZCgiU2F2ZSBTdWNjZXNzZnVsIikpOworICAgICAgICAKKyAgICB9CisgICAgCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vaG9zdC9TYXZlSG9zdEFjdGlvbi5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL2hvc3QvU2F2ZUhvc3RBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2RlOGFjCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL2hvc3QvU2F2ZUhvc3RBY3Rpb24uamF2YQpAQCAtMCwwICsxLDMxMCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAxLTIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uaG9zdDsKKworCitpbXBvcnQgamF2YS5uZXQuVVJMRW5jb2RlcjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuQXR0cmlidXRlOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlckZhY3Rvcnk7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5RdWVyeUV4cDsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LlF1ZXJ5OworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0SW5zdGFuY2U7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuSk1FeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkVycm9yOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25FcnJvcnM7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcndhcmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMudXRpbC5NZXNzYWdlUmVzb3VyY2VzOworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkFwcGxpY2F0aW9uU2VydmxldDsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5Ub21jYXRUcmVlQnVpbGRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5UcmVlQ29udHJvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5UcmVlQ29udHJvbE5vZGU7CisKKworCisvKioKKyAqIFRoZSA8Y29kZT5BY3Rpb248L2NvZGU+IHRoYXQgY29tcGxldGVzIDxlbT5BZGQgSG9zdDwvZW0+IGFuZAorICogPGVtPkVkaXQgSG9zdDwvZW0+IHRyYW5zYWN0aW9ucy4KKyAqCisgKiBAYXV0aG9yIE1hbnZlZW4gS2F1cgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgU2F2ZUhvc3RBY3Rpb24gZXh0ZW5kcyBBY3Rpb24geworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworICAgIC8qKgorICAgICAqIFNpZ25hdHVyZSBmb3IgdGhlIDxjb2RlPmNyZWF0ZVN0YW5kYXJkSG9zdDwvY29kZT4gb3BlcmF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGNyZWF0ZVN0YW5kYXJkSG9zdFR5cGVzW10gPQorICAgIHsgImphdmEubGFuZy5TdHJpbmciLCAgICAgLy8gcGFyZW50CisgICAgICAiamF2YS5sYW5nLlN0cmluZyIsICAgICAvLyBuYW1lCisgICAgICAiamF2YS5sYW5nLlN0cmluZyIsICAgICAvLyBhcHBCYXNlCisgICAgICAiYm9vbGVhbiIsICAgICAgICAgICAgICAvLyBhdXRvRGVwbG95CisgICAgICAiYm9vbGVhbiIsICAgICAgICAgICAgICAvLyBkZXBsb3lYTUwKKyAgICAgICJib29sZWFuIiwgICAgICAgICAgICAgIC8vIGRlcGxveU9uU3RhcnR1cAorICAgICAgImJvb2xlYW4iLCAgICAgICAgICAgICAgLy8gdW5wYWNrV0FScworICAgICAgImJvb2xlYW4iLCAgICAgICAgICAgICAgLy8geG1sTmFtZXNwYWNlQXdhcmUKKyAgICAgICJib29sZWFuIiwgICAgICAgICAgICAgIC8vIHhtbFZhbGlkYXRpb24KKyAgICB9OworCisgICAgLyoqCisgICAgICogVGhlIE1CZWFuU2VydmVyIHdlIHdpbGwgYmUgaW50ZXJhY3Rpbmcgd2l0aC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1CZWFuU2VydmVyIG1CU2VydmVyID0gbnVsbDsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIHNwZWNpZmllZCBIVFRQIHJlcXVlc3QsIGFuZCBjcmVhdGUgdGhlIGNvcnJlc3BvbmRpbmcgSFRUUAorICAgICAqIHJlc3BvbnNlIChvciBmb3J3YXJkIHRvIGFub3RoZXIgd2ViIGNvbXBvbmVudCB0aGF0IHdpbGwgY3JlYXRlIGl0KS4KKyAgICAgKiBSZXR1cm4gYW4gPGNvZGU+QWN0aW9uRm9yd2FyZDwvY29kZT4gaW5zdGFuY2UgZGVzY3JpYmluZyB3aGVyZSBhbmQgaG93CisgICAgICogY29udHJvbCBzaG91bGQgYmUgZm9yd2FyZGVkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcmVzcG9uc2UgaGFzCisgICAgICogYWxyZWFkeSBiZWVuIGNvbXBsZXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBBY3Rpb25NYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gYWN0aW9uRm9ybSBUaGUgb3B0aW9uYWwgQWN0aW9uRm9ybSBiZWFuIGZvciB0aGlzIHJlcXVlc3QgKGlmIGFueSkKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgSFRUUCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBIVFRQIHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBleGNlcHRpb24gb2NjdXJzCisgICAgICovCisgICAgcHVibGljIEFjdGlvbkZvcndhcmQgcGVyZm9ybShBY3Rpb25NYXBwaW5nIG1hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb25Gb3JtIGZvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gQWNxdWlyZSB0aGUgcmVzb3VyY2VzIHRoYXQgd2UgbmVlZAorICAgICAgICBIdHRwU2Vzc2lvbiBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uKCk7CisgICAgICAgIExvY2FsZSBsb2NhbGUgPSBnZXRMb2NhbGUocmVxdWVzdCk7CisgICAgICAgIE1lc3NhZ2VSZXNvdXJjZXMgcmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VzKHJlcXVlc3QpOworCisgICAgICAgIC8vIEFjcXVpcmUgYSByZWZlcmVuY2UgdG8gdGhlIE1CZWFuU2VydmVyIGNvbnRhaW5pbmcgb3VyIE1CZWFucworICAgICAgICB0cnkgeworICAgICAgICAgICAgbUJTZXJ2ZXIgPSAoKEFwcGxpY2F0aW9uU2VydmxldCkgZ2V0U2VydmxldCgpKS5nZXRTZXJ2ZXIoKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uCisgICAgICAgICAgICAoIkNhbm5vdCBhY3F1aXJlIE1CZWFuU2VydmVyIHJlZmVyZW5jZSIsIHQpOworICAgICAgICB9CisKKyAgICAgICAgLy8gSWRlbnRpZnkgdGhlIHJlcXVlc3RlZCBhY3Rpb24KKyAgICAgICAgSG9zdEZvcm0gaGZvcm0gPSAoSG9zdEZvcm0pIGZvcm07CisgICAgICAgIFN0cmluZyBhZG1pbkFjdGlvbiA9IGhmb3JtLmdldEFkbWluQWN0aW9uKCk7CisgICAgICAgIFN0cmluZyBoT2JqZWN0TmFtZSA9IGhmb3JtLmdldE9iamVjdE5hbWUoKTsKKyAgICAgICAgT2JqZWN0TmFtZSBob25hbWUgPSBudWxsOworCisgICAgICAgIC8vIFBlcmZvcm0gYSAiQ3JlYXRlIEhvc3QiIHRyYW5zYWN0aW9uIChpZiByZXF1ZXN0ZWQpCisgICAgICAgIGlmICgiQ3JlYXRlIi5lcXVhbHMoYWRtaW5BY3Rpb24pKSB7CisKKyAgICAgICAgICAgIFN0cmluZyBvcGVyYXRpb24gPSBudWxsOworICAgICAgICAgICAgT2JqZWN0IHZhbHVlc1tdID0gbnVsbDsKKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgc2VydmljZU5hbWUgPSBoZm9ybS5nZXRTZXJ2aWNlTmFtZSgpOworICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgc29uYW1lID0gbmV3IE9iamVjdE5hbWUoc2VydmljZU5hbWUpOworICAgICAgICAgICAgICAgIFN0cmluZyBkb21haW4gPSBzb25hbWUuZ2V0RG9tYWluKCk7CisgICAgICAgICAgICAgICAgLy8gRW5zdXJlIHRoYXQgdGhlIHJlcXVlc3RlZCBob3N0IG5hbWUgaXMgdW5pcXVlCisgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3ROYW1lKGRvbWFpbiArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb21jYXRUcmVlQnVpbGRlci5IT1NUX1RZUEUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLGhvc3Q9IiArIGhmb3JtLmdldEhvc3ROYW1lKCkpOworICAgICAgICAgICAgICAgIGlmIChtQlNlcnZlci5pc1JlZ2lzdGVyZWQob25hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIEFjdGlvbkVycm9ycyBlcnJvcnMgPSBuZXcgQWN0aW9uRXJyb3JzKCk7CisgICAgICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoImhvc3ROYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQWN0aW9uRXJyb3IoImVycm9yLmhvc3ROYW1lLmV4aXN0cyIpKTsKKyAgICAgICAgICAgICAgICAgICAgc2F2ZUVycm9ycyhyZXF1ZXN0LCBlcnJvcnMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG5ldyBBY3Rpb25Gb3J3YXJkKG1hcHBpbmcuZ2V0SW5wdXQoKSkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIExvb2sgdXAgb3VyIE1CZWFuRmFjdG9yeSBNQmVhbgorICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgZm5hbWUgPSBUb21jYXRUcmVlQnVpbGRlci5nZXRNQmVhbkZhY3RvcnkoKTsKKworICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBTdGFuZGFyZEhvc3Qgb2JqZWN0CisgICAgICAgICAgICAgICAgdmFsdWVzID0gbmV3IE9iamVjdFs5XTsKKyAgICAgICAgICAgICAgICB2YWx1ZXNbMF0gPSBkb21haW4gKyBUb21jYXRUcmVlQnVpbGRlci5FTkdJTkVfVFlQRTsKKyAgICAgICAgICAgICAgICB2YWx1ZXNbMV0gPSBoZm9ybS5nZXRIb3N0TmFtZSgpOworICAgICAgICAgICAgICAgIHZhbHVlc1syXSA9IGhmb3JtLmdldEFwcEJhc2UoKTsKKyAgICAgICAgICAgICAgICB2YWx1ZXNbM10gPSBuZXcgQm9vbGVhbihoZm9ybS5nZXRBdXRvRGVwbG95KCkpOworICAgICAgICAgICAgICAgIHZhbHVlc1s0XSA9IG5ldyBCb29sZWFuKGhmb3JtLmdldERlcGxveVhNTCgpKTsKKyAgICAgICAgICAgICAgICB2YWx1ZXNbNV0gPSBuZXcgQm9vbGVhbihoZm9ybS5nZXREZXBsb3lPblN0YXJ0dXAoKSk7CisgICAgICAgICAgICAgICAgdmFsdWVzWzZdID0gbmV3IEJvb2xlYW4oaGZvcm0uZ2V0VW5wYWNrV0FScygpKTsKKyAgICAgICAgICAgICAgICB2YWx1ZXNbN10gPSBuZXcgQm9vbGVhbihoZm9ybS5nZXRYbWxOYW1lc3BhY2VBd2FyZSgpKTsKKyAgICAgICAgICAgICAgICB2YWx1ZXNbOF0gPSBuZXcgQm9vbGVhbihoZm9ybS5nZXRYbWxWYWxpZGF0aW9uKCkpOworCisKKyAgICAgICAgICAgICAgICBvcGVyYXRpb24gPSAiY3JlYXRlU3RhbmRhcmRIb3N0IjsKKyAgICAgICAgICAgICAgICBoT2JqZWN0TmFtZSA9IChTdHJpbmcpCisgICAgICAgICAgICAgICAgICAgIG1CU2VydmVyLmludm9rZShmbmFtZSwgb3BlcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLCBjcmVhdGVTdGFuZGFyZEhvc3RUeXBlcyk7CisKKyAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIG5ldyBIb3N0IHRvIG91ciB0cmVlIGNvbnRyb2wgbm9kZQorICAgICAgICAgICAgICAgIFRyZWVDb250cm9sIGNvbnRyb2wgPSAoVHJlZUNvbnRyb2wpCisgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0QXR0cmlidXRlKCJ0cmVlQ29udHJvbFRlc3QiKTsKKyAgICAgICAgICAgICAgICBpZiAoY29udHJvbCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXJlbnROYW1lID0gc2VydmljZU5hbWU7CisgICAgICAgICAgICAgICAgICAgIFRyZWVDb250cm9sTm9kZSBwYXJlbnROb2RlID0gY29udHJvbC5maW5kTm9kZShwYXJlbnROYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudE5vZGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5vZGVMYWJlbCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAic2VydmVyLnNlcnZpY2UudHJlZUJ1aWxkZXIuaG9zdCIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICgiICsgaGZvcm0uZ2V0SG9zdE5hbWUoKSArICIpIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBlbmNvZGVkTmFtZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUoaE9iamVjdE5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgVHJlZUNvbnRyb2xOb2RlIGNoaWxkTm9kZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFRyZWVDb250cm9sTm9kZShoT2JqZWN0TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3N0LmdpZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlTGFiZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRWRpdEhvc3QuZG8/c2VsZWN0PSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udGVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCBkb21haW4pOworICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50Tm9kZS5hZGRDaGlsZChjaGlsZE5vZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgLSBmb3JjZSBhIHJlZGlzcGxheQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiQ2Fubm90IGZpbmQgcGFyZW50IG5vZGUgJyIgKyBwYXJlbnROYW1lICsgIiciKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAgICAgICAgICgiQ2Fubm90IGZpbmQgVHJlZUNvbnRyb2xOb2RlISIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nCisgICAgICAgICAgICAgICAgICAgIChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5pbnZva2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uKSwgZSk7CisgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmludm9rZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24pKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKG51bGwpOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIC8vIFBlcmZvcm0gYXR0cmlidXRlIHVwZGF0ZXMgYXMgcmVxdWVzdGVkCisgICAgICAgIFN0cmluZyBhdHRyaWJ1dGUgPSBudWxsOworICAgICAgICB0cnkgeworCisgICAgICAgICAgICBob25hbWUgPSBuZXcgT2JqZWN0TmFtZShoT2JqZWN0TmFtZSk7CisKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJhcHBCYXNlIjsKKyAgICAgICAgICAgIFN0cmluZyBhcHBCYXNlID0gIiI7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGFwcEJhc2UgPSBoZm9ybS5nZXRBcHBCYXNlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgIGFwcEJhc2UgPSAiIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1CU2VydmVyLnNldEF0dHJpYnV0ZShob25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZSgiYXBwQmFzZSIsIGFwcEJhc2UpKTsKKworICAgICAgICAgICAgYXR0cmlidXRlID0gImF1dG9EZXBsb3kiOworICAgICAgICAgICAgU3RyaW5nIGF1dG9EZXBsb3kgPSAidHJ1ZSI7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGF1dG9EZXBsb3kgPSBoZm9ybS5nZXRBdXRvRGVwbG95KCk7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgIGF1dG9EZXBsb3kgPSAidHJ1ZSI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQlNlcnZlci5zZXRBdHRyaWJ1dGUoaG9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoImF1dG9EZXBsb3kiLCBuZXcgQm9vbGVhbihhdXRvRGVwbG95KSkpOworCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAiZGVwbG95WE1MIjsKKyAgICAgICAgICAgIFN0cmluZyBkZXBsb3lYTUwgPSAidHJ1ZSI7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGRlcGxveVhNTCA9IGhmb3JtLmdldERlcGxveVhNTCgpOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICBkZXBsb3lYTUwgPSAidHJ1ZSI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQlNlcnZlci5zZXRBdHRyaWJ1dGUoaG9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoImRlcGxveVhNTCIsIG5ldyBCb29sZWFuKGRlcGxveVhNTCkpKTsKKworICAgICAgICAgICAgYXR0cmlidXRlID0gImRlcGxveU9uU3RhcnR1cCI7CisgICAgICAgICAgICBTdHJpbmcgZGVwbG95T25TdGFydHVwID0gInRydWUiOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBkZXBsb3lPblN0YXJ0dXAgPSBoZm9ybS5nZXREZXBsb3lPblN0YXJ0dXAoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgZGVwbG95T25TdGFydHVwID0gInRydWUiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUJTZXJ2ZXIuc2V0QXR0cmlidXRlKGhvbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKCJkZXBsb3lPblN0YXJ0dXAiLCBuZXcgQm9vbGVhbihkZXBsb3lPblN0YXJ0dXApKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAidW5wYWNrV0FScyI7CisgICAgICAgICAgICBTdHJpbmcgdW5wYWNrV0FScyA9ICJmYWxzZSI7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHVucGFja1dBUnMgPSBoZm9ybS5nZXRVbnBhY2tXQVJzKCk7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgIHVucGFja1dBUnMgPSAiZmFsc2UiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUJTZXJ2ZXIuc2V0QXR0cmlidXRlKGhvbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKCJ1bnBhY2tXQVJzIiwgbmV3IEJvb2xlYW4odW5wYWNrV0FScykpKTsKKworICAgICAgICAgICAgYXR0cmlidXRlID0gInhtbE5hbWVzcGFjZUF3YXJlIjsKKyAgICAgICAgICAgIFN0cmluZyB4bWxOYW1lc3BhY2VBd2FyZSA9ICJmYWxzZSI7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHhtbE5hbWVzcGFjZUF3YXJlID0gaGZvcm0uZ2V0WG1sTmFtZXNwYWNlQXdhcmUoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgeG1sTmFtZXNwYWNlQXdhcmUgPSAiZmFsc2UiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUJTZXJ2ZXIuc2V0QXR0cmlidXRlKGhvbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKCJ4bWxOYW1lc3BhY2VBd2FyZSIsIG5ldyBCb29sZWFuKHhtbE5hbWVzcGFjZUF3YXJlKSkpOworCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAieG1sVmFsaWRhdGlvbiI7CisgICAgICAgICAgICBTdHJpbmcgeG1sVmFsaWRhdGlvbiA9ICJmYWxzZSI7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHhtbFZhbGlkYXRpb24gPSBoZm9ybS5nZXRYbWxWYWxpZGF0aW9uKCk7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgIHhtbFZhbGlkYXRpb24gPSAiZmFsc2UiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUJTZXJ2ZXIuc2V0QXR0cmlidXRlKGhvbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKCJ4bWxWYWxpZGF0aW9uIiwgbmV3IEJvb2xlYW4oeG1sVmFsaWRhdGlvbikpKTsKKworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCisgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nCisgICAgICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmF0dHJpYnV0ZS5zZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUpLCBlKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuYXR0cmlidXRlLnNldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSkpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEZvcndhcmQgdG8gdGhlIHN1Y2Nlc3MgcmVwb3J0aW5nIHBhZ2UKKyAgICAgICAgc2Vzc2lvbi5yZW1vdmVBdHRyaWJ1dGUobWFwcGluZy5nZXRBdHRyaWJ1dGUoKSk7CisgICAgICAgIHJldHVybiAobWFwcGluZy5maW5kRm9yd2FyZCgiU2F2ZSBTdWNjZXNzZnVsIikpOworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVhbG0vQWRkUmVhbG1BY3Rpb24uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZWFsbS9BZGRSZWFsbUFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3YzYwMWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVhbG0vQWRkUmVhbG1BY3Rpb24uamF2YQpAQCAtMCwwICsxLDIyMCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAxLTIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVhbG07CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTEVuY29kZXI7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25FcnJvcnM7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcndhcmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMudXRpbC5NZXNzYWdlUmVzb3VyY2VzOworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkxhYmVsVmFsdWVCZWFuOworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkxpc3RzOworCisvKioKKyAqIFRoZSA8Y29kZT5BY3Rpb248L2NvZGU+IHRoYXQgc2V0cyB1cCA8ZW0+QWRkIFJlYWxtPC9lbT4gdHJhbnNhY3Rpb25zLgorICoKKyAqIEBhdXRob3IgTWFudmVlbiBLYXVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBBZGRSZWFsbUFjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisKKyAgICAvLyB0aGUgbGlzdCBmb3IgdHlwZXMgb2YgcmVhbG1zCisgICAgcHJpdmF0ZSBBcnJheUxpc3QgdHlwZXMgPSBudWxsOworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBzcGVjaWZpZWQgSFRUUCByZXF1ZXN0LCBhbmQgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIEhUVFAKKyAgICAgKiByZXNwb25zZSAob3IgZm9yd2FyZCB0byBhbm90aGVyIHdlYiBjb21wb25lbnQgdGhhdCB3aWxsIGNyZWF0ZSBpdCkuCisgICAgICogUmV0dXJuIGFuIDxjb2RlPkFjdGlvbkZvcndhcmQ8L2NvZGU+IGluc3RhbmNlIGRlc2NyaWJpbmcgd2hlcmUgYW5kIGhvdworICAgICAqIGNvbnRyb2wgc2hvdWxkIGJlIGZvcndhcmRlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHJlc3BvbnNlIGhhcworICAgICAqIGFscmVhZHkgYmVlbiBjb21wbGV0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgQWN0aW9uTWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIGFjdGlvbkZvcm0gVGhlIG9wdGlvbmFsIEFjdGlvbkZvcm0gYmVhbiBmb3IgdGhpcyByZXF1ZXN0IChpZiBhbnkpCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIEhUVFAgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgSFRUUCByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXhjZXB0aW9uIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBBY3Rpb25Gb3J3YXJkIHBlcmZvcm0oQWN0aW9uTWFwcGluZyBtYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uRm9ybSBmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIEFjcXVpcmUgdGhlIHJlc291cmNlcyB0aGF0IHdlIG5lZWQKKyAgICAgICAgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpOworICAgICAgICBMb2NhbGUgbG9jYWxlID0gZ2V0TG9jYWxlKHJlcXVlc3QpOworICAgICAgICBNZXNzYWdlUmVzb3VyY2VzIHJlc291cmNlcyA9IGdldFJlc291cmNlcyhyZXF1ZXN0KTsKKyAgICAgICAgLy8gRmlsbCBpbiB0aGUgZm9ybSB2YWx1ZXMgZm9yIGRpc3BsYXkgYW5kIGVkaXRpbmcKKworICAgICAgICBTdHJpbmcgcmVhbG1UeXBlc1tdID0gbmV3IFN0cmluZ1s1XTsKKyAgICAgICAgcmVhbG1UeXBlc1swXSA9ICJVc2VyRGF0YWJhc2VSZWFsbSI7CisgICAgICAgIHJlYWxtVHlwZXNbMV0gPSAiSk5ESVJlYWxtIjsKKyAgICAgICAgcmVhbG1UeXBlc1syXSA9ICJNZW1vcnlSZWFsbSI7CisgICAgICAgIHJlYWxtVHlwZXNbM10gPSAiSkRCQ1JlYWxtIjsKKyAgICAgICAgcmVhbG1UeXBlc1s0XSA9ICJEYXRhU291cmNlUmVhbG0iOworCisgICAgICAgIFN0cmluZyBwYXJlbnQgPSByZXF1ZXN0LmdldFBhcmFtZXRlcigicGFyZW50Iik7CisgICAgICAgIFN0cmluZyB0eXBlID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoInR5cGUiKTsKKyAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHR5cGUgPSAiVXNlckRhdGFiYXNlUmVhbG0iOyAgICAvLyBkZWZhdWx0IHR5cGUgaXMgVXNlckRhdGFiYXNlUmVhbG0KKyAgICAgICAgCisgICAgICAgIHR5cGVzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICAvLyB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgc2VsZWN0IGxpc3Qgc2hvdWxkIGJlIHRoZSB0eXBlIHNlbGVjdGVkCisgICAgICAgIHR5cGVzLmFkZChuZXcgTGFiZWxWYWx1ZUJlYW4odHlwZSwKKyAgICAgICAgICAgICAgICAiQWRkUmVhbG0uZG8/cGFyZW50PSIgKyBVUkxFbmNvZGVyLmVuY29kZShwYXJlbnQpCisgICAgICAgICAgICAgICAgKyAiJnR5cGU9IiArIHR5cGUpKTsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPCByZWFsbVR5cGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoIXR5cGUuZXF1YWxzSWdub3JlQ2FzZShyZWFsbVR5cGVzW2ldKSkgeworICAgICAgICAgICAgICAgIHR5cGVzLmFkZChuZXcgTGFiZWxWYWx1ZUJlYW4ocmVhbG1UeXBlc1tpXSwKKyAgICAgICAgICAgICAgICAiQWRkUmVhbG0uZG8/cGFyZW50PSIgKyBVUkxFbmNvZGVyLmVuY29kZShwYXJlbnQpCisgICAgICAgICAgICAgICAgKyAiJnR5cGU9IiArIHJlYWxtVHlwZXNbaV0pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICgiVXNlckRhdGFiYXNlUmVhbG0iLmVxdWFsc0lnbm9yZUNhc2UodHlwZSkpIHsKKyAgICAgICAgICAgIGNyZWF0ZVVzZXJEYXRhYmFzZVJlYWxtKHNlc3Npb24sIHBhcmVudCk7CisgICAgICAgIH0gZWxzZSBpZiAoIkpORElSZWFsbSIuZXF1YWxzSWdub3JlQ2FzZSh0eXBlKSkgeworICAgICAgICAgICAgY3JlYXRlSk5ESVJlYWxtKHNlc3Npb24sIHBhcmVudCk7CisgICAgICAgIH0gZWxzZSBpZiAoIk1lbW9yeVJlYWxtIi5lcXVhbHNJZ25vcmVDYXNlKHR5cGUpKSB7CisgICAgICAgICAgICBjcmVhdGVNZW1vcnlSZWFsbShzZXNzaW9uLCBwYXJlbnQpOworICAgICAgICB9IGVsc2UgaWYgKCJKREJDUmVhbG0iLmVxdWFsc0lnbm9yZUNhc2UodHlwZSkpeworICAgICAgICAgICAgY3JlYXRlSkRCQ1JlYWxtKHNlc3Npb24sIHBhcmVudCk7CisgICAgICAgIH0gZWxzZSBpZiAoIkRhdGFTb3VyY2VSZWFsbSIuZXF1YWxzSWdub3JlQ2FzZSh0eXBlKSkgeworICAgICAgICAgICAgY3JlYXRlRGF0YVNvdXJjZVJlYWxtKHNlc3Npb24sIHBhcmVudCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gRm9yd2FyZCB0byB0aGUgcmVhbG0gZGlzcGxheSBwYWdlCisgICAgICAgIHJldHVybiAobWFwcGluZy5maW5kRm9yd2FyZCh0eXBlKSk7CisKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY3JlYXRlVXNlckRhdGFiYXNlUmVhbG0oSHR0cFNlc3Npb24gc2Vzc2lvbiwgU3RyaW5nIHBhcmVudCkgeworCisgICAgICAgIFVzZXJEYXRhYmFzZVJlYWxtRm9ybSByZWFsbUZtID0gbmV3IFVzZXJEYXRhYmFzZVJlYWxtRm9ybSgpOworICAgICAgICBzZXNzaW9uLnNldEF0dHJpYnV0ZSgidXNlckRhdGFiYXNlUmVhbG1Gb3JtIiwgcmVhbG1GbSk7CisgICAgICAgIHJlYWxtRm0uc2V0QWRtaW5BY3Rpb24oIkNyZWF0ZSIpOworICAgICAgICByZWFsbUZtLnNldE9iamVjdE5hbWUoIiIpOworICAgICAgICByZWFsbUZtLnNldFBhcmVudE9iamVjdE5hbWUocGFyZW50KTsKKyAgICAgICAgU3RyaW5nIHJlYWxtVHlwZSA9ICJVc2VyRGF0YWJhc2VSZWFsbSI7CisgICAgICAgIHJlYWxtRm0uc2V0Tm9kZUxhYmVsKCJSZWFsbSAoIiArIHJlYWxtVHlwZSArICIpIik7CisgICAgICAgIHJlYWxtRm0uc2V0UmVhbG1UeXBlKHJlYWxtVHlwZSk7CisgICAgICAgIHJlYWxtRm0uc2V0UmVzb3VyY2UoIiIpOworICAgICAgICByZWFsbUZtLnNldFJlYWxtVHlwZVZhbHModHlwZXMpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjcmVhdGVKTkRJUmVhbG0oSHR0cFNlc3Npb24gc2Vzc2lvbiwgU3RyaW5nIHBhcmVudCkgeworCisgICAgICAgIEpORElSZWFsbUZvcm0gcmVhbG1GbSA9IG5ldyBKTkRJUmVhbG1Gb3JtKCk7CisgICAgICAgIHNlc3Npb24uc2V0QXR0cmlidXRlKCJqbmRpUmVhbG1Gb3JtIiwgcmVhbG1GbSk7CisgICAgICAgIHJlYWxtRm0uc2V0QWRtaW5BY3Rpb24oIkNyZWF0ZSIpOworICAgICAgICByZWFsbUZtLnNldE9iamVjdE5hbWUoIiIpOworICAgICAgICByZWFsbUZtLnNldFBhcmVudE9iamVjdE5hbWUocGFyZW50KTsKKyAgICAgICAgU3RyaW5nIHJlYWxtVHlwZSA9ICJKTkRJUmVhbG0iOworICAgICAgICByZWFsbUZtLnNldE5vZGVMYWJlbCgiUmVhbG0gKCIgKyByZWFsbVR5cGUgKyAiKSIpOworICAgICAgICByZWFsbUZtLnNldFJlYWxtVHlwZShyZWFsbVR5cGUpOworICAgICAgICByZWFsbUZtLnNldERpZ2VzdCgiIik7CisgICAgICAgIHJlYWxtRm0uc2V0Um9sZUJhc2UoIiIpOworICAgICAgICByZWFsbUZtLnNldFVzZXJTdWJ0cmVlKCJmYWxzZSIpOworICAgICAgICByZWFsbUZtLnNldFJvbGVTdWJ0cmVlKCJmYWxzZSIpOworICAgICAgICByZWFsbUZtLnNldFJvbGVQYXR0ZXJuKCIiKTsKKyAgICAgICAgcmVhbG1GbS5zZXRVc2VyUm9sZU5hbWUoIiIpOworICAgICAgICByZWFsbUZtLnNldFJvbGVOYW1lKCIiKTsKKyAgICAgICAgcmVhbG1GbS5zZXRSb2xlQmFzZSgiIik7CisgICAgICAgIHJlYWxtRm0uc2V0Q29udGV4dEZhY3RvcnkoIiIpOworICAgICAgICByZWFsbUZtLnNldFVzZXJQYXR0ZXJuKCIiKTsKKyAgICAgICAgcmVhbG1GbS5zZXRVc2VyU2VhcmNoKCIiKTsKKyAgICAgICAgcmVhbG1GbS5zZXRVc2VyUGFzc3dvcmQoIiIpOworICAgICAgICByZWFsbUZtLnNldENvbm5lY3Rpb25OYW1lKCIiKTsKKyAgICAgICAgcmVhbG1GbS5zZXRDb25uZWN0aW9uUGFzc3dvcmQoIiIpOworICAgICAgICByZWFsbUZtLnNldENvbm5lY3Rpb25VUkwoIiIpOworICAgICAgICByZWFsbUZtLnNldFNlYXJjaFZhbHMoTGlzdHMuZ2V0Qm9vbGVhblZhbHVlcygpKTsKKyAgICAgICAgcmVhbG1GbS5zZXRSZWFsbVR5cGVWYWxzKHR5cGVzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY3JlYXRlTWVtb3J5UmVhbG0oSHR0cFNlc3Npb24gc2Vzc2lvbiwgU3RyaW5nIHBhcmVudCkgeworCisgICAgICAgIE1lbW9yeVJlYWxtRm9ybSByZWFsbUZtID0gbmV3IE1lbW9yeVJlYWxtRm9ybSgpOworICAgICAgICBzZXNzaW9uLnNldEF0dHJpYnV0ZSgibWVtb3J5UmVhbG1Gb3JtIiwgcmVhbG1GbSk7CisgICAgICAgIHJlYWxtRm0uc2V0QWRtaW5BY3Rpb24oIkNyZWF0ZSIpOworICAgICAgICByZWFsbUZtLnNldE9iamVjdE5hbWUoIiIpOworICAgICAgICByZWFsbUZtLnNldFBhcmVudE9iamVjdE5hbWUocGFyZW50KTsKKyAgICAgICAgU3RyaW5nIHJlYWxtVHlwZSA9ICJNZW1vcnlSZWFsbSI7CisgICAgICAgIHJlYWxtRm0uc2V0Tm9kZUxhYmVsKCJSZWFsbSAoIiArIHJlYWxtVHlwZSArICIpIik7CisgICAgICAgIHJlYWxtRm0uc2V0UmVhbG1UeXBlKHJlYWxtVHlwZSk7CisgICAgICAgIHJlYWxtRm0uc2V0UGF0aE5hbWUoIiIpOworICAgICAgICByZWFsbUZtLnNldFJlYWxtVHlwZVZhbHModHlwZXMpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjcmVhdGVKREJDUmVhbG0oSHR0cFNlc3Npb24gc2Vzc2lvbiwgU3RyaW5nIHBhcmVudCkgeworCisgICAgICAgIEpEQkNSZWFsbUZvcm0gcmVhbG1GbSA9IG5ldyBKREJDUmVhbG1Gb3JtKCk7CisgICAgICAgIHNlc3Npb24uc2V0QXR0cmlidXRlKCJqZGJjUmVhbG1Gb3JtIiwgcmVhbG1GbSk7CisgICAgICAgIHJlYWxtRm0uc2V0QWRtaW5BY3Rpb24oIkNyZWF0ZSIpOworICAgICAgICByZWFsbUZtLnNldE9iamVjdE5hbWUoIiIpOworICAgICAgICByZWFsbUZtLnNldFBhcmVudE9iamVjdE5hbWUocGFyZW50KTsKKyAgICAgICAgU3RyaW5nIHJlYWxtVHlwZSA9ICJKREJDUmVhbG0iOworICAgICAgICByZWFsbUZtLnNldE5vZGVMYWJlbCgiUmVhbG0gKCIgKyByZWFsbVR5cGUgKyAiKSIpOworICAgICAgICByZWFsbUZtLnNldFJlYWxtVHlwZShyZWFsbVR5cGUpOworICAgICAgICByZWFsbUZtLnNldERpZ2VzdCgiIik7CisgICAgICAgIHJlYWxtRm0uc2V0RHJpdmVyKCIiKTsKKyAgICAgICAgcmVhbG1GbS5zZXRSb2xlTmFtZUNvbCgiIik7CisgICAgICAgIHJlYWxtRm0uc2V0UGFzc3dvcmRDb2woIiIpOworICAgICAgICByZWFsbUZtLnNldFVzZXJUYWJsZSgiIik7CisgICAgICAgIHJlYWxtRm0uc2V0Um9sZVRhYmxlKCIiKTsKKyAgICAgICAgcmVhbG1GbS5zZXRDb25uZWN0aW9uTmFtZSgiIik7CisgICAgICAgIHJlYWxtRm0uc2V0Q29ubmVjdGlvblBhc3N3b3JkKCIiKTsKKyAgICAgICAgcmVhbG1GbS5zZXRDb25uZWN0aW9uVVJMKCIiKTsKKyAgICAgICAgcmVhbG1GbS5zZXRSZWFsbVR5cGVWYWxzKHR5cGVzKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZURhdGFTb3VyY2VSZWFsbShIdHRwU2Vzc2lvbiBzZXNzaW9uLCBTdHJpbmcgcGFyZW50KSB7CisKKyAgICAgICAgRGF0YVNvdXJjZVJlYWxtRm9ybSByZWFsbUZtID0gbmV3IERhdGFTb3VyY2VSZWFsbUZvcm0oKTsKKyAgICAgICAgc2Vzc2lvbi5zZXRBdHRyaWJ1dGUoImRhdGFTb3VyY2VSZWFsbUZvcm0iLCByZWFsbUZtKTsKKyAgICAgICAgcmVhbG1GbS5zZXRBZG1pbkFjdGlvbigiQ3JlYXRlIik7CisgICAgICAgIHJlYWxtRm0uc2V0T2JqZWN0TmFtZSgiIik7CisgICAgICAgIHJlYWxtRm0uc2V0UGFyZW50T2JqZWN0TmFtZShwYXJlbnQpOworICAgICAgICBTdHJpbmcgcmVhbG1UeXBlID0gIkRhdGFTb3VyY2VSZWFsbSI7CisgICAgICAgIHJlYWxtRm0uc2V0Tm9kZUxhYmVsKCJSZWFsbSAoIiArIHJlYWxtVHlwZSArICIpIik7CisgICAgICAgIHJlYWxtRm0uc2V0UmVhbG1UeXBlKHJlYWxtVHlwZSk7CisgICAgICAgIHJlYWxtRm0uc2V0RGF0YVNvdXJjZU5hbWUoIiIpOworICAgICAgICByZWFsbUZtLnNldERpZ2VzdCgiIik7CisgICAgICAgIHJlYWxtRm0uc2V0TG9jYWxEYXRhU291cmNlKCJmYWxzZSIpOworICAgICAgICByZWFsbUZtLnNldFJvbGVOYW1lQ29sKCIiKTsKKyAgICAgICAgcmVhbG1GbS5zZXRVc2VyQ3JlZENvbCgiIik7CisgICAgICAgIHJlYWxtRm0uc2V0VXNlck5hbWVDb2woIiIpOworICAgICAgICByZWFsbUZtLnNldFVzZXJSb2xlVGFibGUoIiIpOworICAgICAgICByZWFsbUZtLnNldFVzZXJUYWJsZSgiIik7CisgICAgICAgIHJlYWxtRm0uc2V0UmVhbG1UeXBlVmFscyh0eXBlcyk7CisgICAgICAgIHJlYWxtRm0uc2V0Qm9vbGVhblZhbHMoTGlzdHMuZ2V0Qm9vbGVhblZhbHVlcygpKTsKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3JlYWxtL0RhdGFTb3VyY2VSZWFsbUZvcm0uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZWFsbS9EYXRhU291cmNlUmVhbG1Gb3JtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ2NzY4NQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZWFsbS9EYXRhU291cmNlUmVhbG1Gb3JtLmphdmEKQEAgLTAsMCArMSwzNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5yZWFsbTsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkVycm9yOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25FcnJvcnM7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CitpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5BcHBsaWNhdGlvblNlcnZsZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uTGFiZWxWYWx1ZUJlYW47CisKKy8qKgorICogRm9ybSBiZWFuIGZvciB0aGUgZGF0YXNvdXJjZSByZWFsbSBwYWdlLgorICoKKyAqIEBhdXRob3IgQW15IFJvaAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgRGF0YVNvdXJjZVJlYWxtRm9ybSBleHRlbmRzIFJlYWxtRm9ybSB7CisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisgICAgCisgICAgLyoqCisgICAgICogVGhlIHRleHQgZm9yIHRoZSBKTkRJIG5hbWVkIEpEQkMgRGF0YVNvdXJjZSBmb3IgeW91ciBkYXRhYmFzZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBkYXRhU291cmNlTmFtZSA9IG51bGw7CisgICAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgdGV4dCBmb3IgdGhlIGRpZ2VzdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBkaWdlc3QgPSBudWxsOworICAgIAorICAgIC8qKiAKKyAgICAgKiBUaGUgdGV4dCBmb3IgaWYgdGhlIERhdGFTb3VyY2UgaXMgbG9jYWwgdG8gdGhlIHdlYmFwcC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBsb2NhbERhdGFTb3VyY2UgPSAiZmFsc2UiOworICAgIAorICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciB0aGUgcm9sZU5hbWVDb2wuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcm9sZU5hbWVDb2wgPSBudWxsOworICAgIAorICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciB0aGUgdXNlckNyZWRDb2wuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgdXNlckNyZWRDb2wgPSBudWxsOworICAgIAorICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciB0aGUgdXNlck5hbWVDb2wuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgdXNlck5hbWVDb2wgPSBudWxsOworICAgICAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgdGV4dCBmb3IgdGhlIHVzZXJSb2xlVGFibGUuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgdXNlclJvbGVUYWJsZSA9IG51bGw7CisgICAgCisgICAgLyoqCisgICAgICogVGhlIHRleHQgZm9yIHRoZSB1c2VyIHRhYmxlLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHVzZXJUYWJsZSA9IG51bGw7CisgICAgICAgIAorICAgIC8qCisgICAgICogUmVwcmVzZW50IGJvb2xlYW4gKHRydWUsIGZhbHNlKSB2YWx1ZXMgZm9yIHVucGFja1dBUnMgZXRjLgorICAgICAqLworICAgIHByaXZhdGUgTGlzdCBib29sZWFuVmFscyA9IG51bGw7CisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisgICAgCisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBkYXRhU291cmNlTmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldERhdGFTb3VyY2VOYW1lKCkgeworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVNvdXJjZU5hbWU7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGRhdGFTb3VyY2VOYW1lLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERhdGFTb3VyY2VOYW1lKFN0cmluZyBkYXRhU291cmNlTmFtZSkgeworICAgICAgICAKKyAgICAgICAgdGhpcy5kYXRhU291cmNlTmFtZSA9IGRhdGFTb3VyY2VOYW1lOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBkaWdlc3QuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXREaWdlc3QoKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy5kaWdlc3Q7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGRpZ2VzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREaWdlc3QoU3RyaW5nIGRpZ2VzdCkgeworICAgICAgICAKKyAgICAgICAgdGhpcy5kaWdlc3QgPSBkaWdlc3Q7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGxvY2FsRGF0YVNvdXJjZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldExvY2FsRGF0YVNvdXJjZSgpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLmxvY2FsRGF0YVNvdXJjZTsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgbG9jYWxEYXRhU291cmNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExvY2FsRGF0YVNvdXJjZShTdHJpbmcgbG9jYWxEYXRhU291cmNlKSB7CisgICAgICAgIAorICAgICAgICB0aGlzLmxvY2FsRGF0YVNvdXJjZSA9IGxvY2FsRGF0YVNvdXJjZTsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcm9sZU5hbWVDb2wuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRSb2xlTmFtZUNvbCgpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLnJvbGVOYW1lQ29sOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSByb2xlTmFtZUNvbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSb2xlTmFtZUNvbChTdHJpbmcgcm9sZU5hbWVDb2wpIHsKKyAgICAgICAgCisgICAgICAgIHRoaXMucm9sZU5hbWVDb2wgPSByb2xlTmFtZUNvbDsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdXNlckNyZWRDb2wuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRVc2VyQ3JlZENvbCgpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLnVzZXJDcmVkQ29sOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSB1c2VyQ3JlZENvbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVc2VyQ3JlZENvbChTdHJpbmcgdXNlckNyZWRDb2wpIHsKKyAgICAgICAgCisgICAgICAgIHRoaXMudXNlckNyZWRDb2wgPSB1c2VyQ3JlZENvbDsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdXNlck5hbWVDb2wuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRVc2VyTmFtZUNvbCgpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLnVzZXJOYW1lQ29sOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSB1c2VyTmFtZUNvbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVc2VyTmFtZUNvbChTdHJpbmcgdXNlck5hbWVDb2wpIHsKKyAgICAgICAgCisgICAgICAgIHRoaXMudXNlck5hbWVDb2wgPSB1c2VyTmFtZUNvbDsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdXNlciByb2xlIHRhYmxlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXNlclJvbGVUYWJsZSgpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLnVzZXJSb2xlVGFibGU7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHVzZXIgcm9sZSB0YWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVc2VyUm9sZVRhYmxlKFN0cmluZyB1c2VyUm9sZVRhYmxlKSB7CisgICAgICAgIAorICAgICAgICB0aGlzLnVzZXJSb2xlVGFibGUgPSB1c2VyUm9sZVRhYmxlOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB1c2VyIHRhYmxlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXNlclRhYmxlKCkgeworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXMudXNlclRhYmxlOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSB1c2VyIFRhYmxlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVzZXJUYWJsZShTdHJpbmcgdXNlclRhYmxlKSB7CisgICAgICAgIAorICAgICAgICB0aGlzLnVzZXJUYWJsZSA9IHVzZXJUYWJsZTsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgYm9vbGVhblZhbHMuCisgICAgICovCisgICAgcHVibGljIExpc3QgZ2V0Qm9vbGVhblZhbHMoKSB7CisKKyAgICAgICAgcmV0dXJuIHRoaXMuYm9vbGVhblZhbHM7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGJvb2xlYW5WYWxzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEJvb2xlYW5WYWxzKExpc3QgYm9vbGVhblZhbHMpIHsKKworICAgICAgICB0aGlzLmJvb2xlYW5WYWxzID0gYm9vbGVhblZhbHM7CisKKyAgICB9CisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisgICAgCisgICAgLyoqCisgICAgICogUmVzZXQgYWxsIHByb3BlcnRpZXMgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgbWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlc2V0KEFjdGlvbk1hcHBpbmcgbWFwcGluZywgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgCisgICAgICAgIHN1cGVyLnJlc2V0KG1hcHBpbmcsIHJlcXVlc3QpOyAgIAorICAgICAgICB0aGlzLmRhdGFTb3VyY2VOYW1lID0gbnVsbDsKKyAgICAgICAgdGhpcy5kaWdlc3QgPSBudWxsOworICAgICAgICB0aGlzLmxvY2FsRGF0YVNvdXJjZSA9ICJmYWxzZSI7CisgICAgICAgIAorICAgICAgICB0aGlzLnJvbGVOYW1lQ29sID0gbnVsbDsKKyAgICAgICAgdGhpcy51c2VyQ3JlZENvbCA9IG51bGw7CisgICAgICAgIHRoaXMudXNlck5hbWVDb2wgPSBudWxsOworICAgICAgICB0aGlzLnVzZXJUYWJsZSA9IG51bGw7CisgICAgICAgIHRoaXMudXNlclJvbGVUYWJsZSA9IG51bGw7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZW5kZXIgdGhpcyBvYmplY3QgYXMgYSBTdHJpbmcuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCJEYXRhU291cmNlUmVhbG1Gb3JtW2FkbWluQWN0aW9uPSIpOworICAgICAgICBzYi5hcHBlbmQoZ2V0QWRtaW5BY3Rpb24oKSk7CisgICAgICAgIHNiLmFwcGVuZCgiLGRhdGFTb3VyY2VOYW1lPSIpOworICAgICAgICBzYi5hcHBlbmQoZGF0YVNvdXJjZU5hbWUpOworICAgICAgICBzYi5hcHBlbmQoIixkaWdlc3Q9Iik7CisgICAgICAgIHNiLmFwcGVuZChkaWdlc3QpOworICAgICAgICBzYi5hcHBlbmQoIicsbG9jYWxEYXRhU291cmNlPSciKTsKKyAgICAgICAgc2IuYXBwZW5kKGxvY2FsRGF0YVNvdXJjZSk7CisgICAgICAgIHNiLmFwcGVuZCgiJyxyb2xlTmFtZUNvbD0iKTsKKyAgICAgICAgc2IuYXBwZW5kKHJvbGVOYW1lQ29sKTsKKyAgICAgICAgc2IuYXBwZW5kKCInLHVzZXJDcmVkQ29sPSIpOworICAgICAgICBzYi5hcHBlbmQodXNlckNyZWRDb2wpOworICAgICAgICBzYi5hcHBlbmQoIicsdXNlck5hbWVDb2w9Iik7CisgICAgICAgIHNiLmFwcGVuZCh1c2VyTmFtZUNvbCk7CisgICAgICAgIHNiLmFwcGVuZCgiJyx1c2VyUm9sZVRhYmxlPSIpOworICAgICAgICBzYi5hcHBlbmQodXNlclJvbGVUYWJsZSk7CisgICAgICAgIHNiLmFwcGVuZCgiJyx1c2VyVGFibGU9JyIpOworICAgICAgICBzYi5hcHBlbmQodXNlclRhYmxlKTsKKyAgICAgICAgc2IuYXBwZW5kKCInLG9iamVjdE5hbWU9JyIpOworICAgICAgICBzYi5hcHBlbmQoZ2V0T2JqZWN0TmFtZSgpKTsKKyAgICAgICAgc2IuYXBwZW5kKCInLHJlYWxtVHlwZT0iKTsKKyAgICAgICAgc2IuYXBwZW5kKGdldFJlYWxtVHlwZSgpKTsKKyAgICAgICAgc2IuYXBwZW5kKCJdIik7CisgICAgICAgIHJldHVybiAoc2IudG9TdHJpbmcoKSk7CisKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogVmFsaWRhdGUgdGhlIHByb3BlcnRpZXMgdGhhdCBoYXZlIGJlZW4gc2V0IGZyb20gdGhpcyBIVFRQIHJlcXVlc3QsCisgICAgICogYW5kIHJldHVybiBhbiA8Y29kZT5BY3Rpb25FcnJvcnM8L2NvZGU+IG9iamVjdCB0aGF0IGVuY2Fwc3VsYXRlcyBhbnkKKyAgICAgKiB2YWxpZGF0aW9uIGVycm9ycyB0aGF0IGhhdmUgYmVlbiBmb3VuZC4gIElmIG5vIGVycm9ycyBhcmUgZm91bmQsIHJldHVybgorICAgICAqIDxjb2RlPm51bGw8L2NvZGU+IG9yIGFuIDxjb2RlPkFjdGlvbkVycm9yczwvY29kZT4gb2JqZWN0IHdpdGggbm8KKyAgICAgKiByZWNvcmRlZCBlcnJvciBtZXNzYWdlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBtYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICovCisgICAgCisgICAgcHVibGljIEFjdGlvbkVycm9ycyB2YWxpZGF0ZShBY3Rpb25NYXBwaW5nIG1hcHBpbmcsCisgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgCisgICAgICAgIEFjdGlvbkVycm9ycyBlcnJvcnMgPSBuZXcgQWN0aW9uRXJyb3JzKCk7CisgICAgICAgIAorICAgICAgICBTdHJpbmcgc3VibWl0ID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoInN1Ym1pdCIpOworICAgICAgICAvL1N0cmluZyB0eXBlID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoInJlYWxtVHlwZSIpOworICAgICAgICAKKyAgICAgICAgLy8gZnJvbnQgZW5kIHZhbGlkYXRpb24gd2hlbiBzYXZlIGlzIGNsaWNrZWQuICAgICAgICAKKyAgICAgICAgIC8vaWYgKHN1Ym1pdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgLy8gdGhlIGZvbGxvd2luZyBmaWVsZHMgYXJlIHJlcXVpcmVkLgorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoKGRhdGFTb3VyY2VOYW1lID09IG51bGwpIHx8IChkYXRhU291cmNlTmFtZS5sZW5ndGgoKSA8IDEpKSB7CisgICAgICAgICAgICAgICAgZXJyb3JzLmFkZCgiZGF0YVNvdXJjZU5hbWUiLAorICAgICAgICAgICAgICAgIG5ldyBBY3Rpb25FcnJvcigiZXJyb3IuZGF0YVNvdXJjZU5hbWUucmVxdWlyZWQiKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGlmICgocm9sZU5hbWVDb2wgPT0gbnVsbCkgfHwgKHJvbGVOYW1lQ29sLmxlbmd0aCgpIDwgMSkpIHsKKyAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKCJyb2xlTmFtZUNvbCIsCisgICAgICAgICAgICAgICAgbmV3IEFjdGlvbkVycm9yKCJlcnJvci5yb2xlTmFtZUNvbC5yZXF1aXJlZCIpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCh1c2VyQ3JlZENvbCA9PSBudWxsKSB8fCAodXNlckNyZWRDb2wubGVuZ3RoKCkgPCAxKSkgeworICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoInVzZXJDcmVkQ29sIiwKKyAgICAgICAgICAgICAgICBuZXcgQWN0aW9uRXJyb3IoImVycm9yLnVzZXJDcmVkQ29sLnJlcXVpcmVkIikpOworICAgICAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgICAgIGlmICgodXNlck5hbWVDb2wgPT0gbnVsbCkgfHwgKHVzZXJOYW1lQ29sLmxlbmd0aCgpIDwgMSkpIHsKKyAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKCJ1c2VyTmFtZUNvbCIsCisgICAgICAgICAgICAgICAgbmV3IEFjdGlvbkVycm9yKCJlcnJvci51c2VyTmFtZUNvbC5yZXF1aXJlZCIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKCh1c2VyUm9sZVRhYmxlID09IG51bGwpIHx8ICh1c2VyUm9sZVRhYmxlLmxlbmd0aCgpIDwgMSkpIHsKKyAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKCJ1c2VyUm9sZVRhYmxlIiwKKyAgICAgICAgICAgICAgICBuZXcgQWN0aW9uRXJyb3IoImVycm9yLnVzZXJSb2xlVGFibGUucmVxdWlyZWQiKSk7CisgICAgICAgICAgICB9CisgICAgICAgIAorICAgICAgICAgICAgaWYgKCh1c2VyVGFibGUgPT0gbnVsbCkgfHwgKHVzZXJUYWJsZS5sZW5ndGgoKSA8IDEpKSB7CisgICAgICAgICAgICAgICAgZXJyb3JzLmFkZCgidXNlclRhYmxlIiwKKyAgICAgICAgICAgICAgICBuZXcgQWN0aW9uRXJyb3IoImVycm9yLnVzZXJUYWJsZS5yZXF1aXJlZCIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAvL30KKyAgICAgICAgICAgICAgICAgCisgICAgICAgIHJldHVybiBlcnJvcnM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3JlYWxtL0RlbGV0ZVJlYWxtQWN0aW9uLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVhbG0vRGVsZXRlUmVhbG1BY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Zjk0YjdlCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3JlYWxtL0RlbGV0ZVJlYWxtQWN0aW9uLmphdmEKQEAgLTAsMCArMSwxNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMS0yMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVhbG07CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkVycm9yczsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9ybTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9yd2FyZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKKworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlckZhY3Rvcnk7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5RdWVyeUV4cDsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LlF1ZXJ5OworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0SW5zdGFuY2U7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuSk1FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMudXRpbC5NZXNzYWdlUmVzb3VyY2VzOworCitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uQXBwbGljYXRpb25TZXJ2bGV0OworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLlRvbWNhdFRyZWVCdWlsZGVyOworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnZhbHZlLlZhbHZlVXRpbDsKKworLyoqCisgKiBUaGUgPGNvZGU+QWN0aW9uPC9jb2RlPiB0aGF0IHNldHMgdXAgPGVtPkRlbGV0ZSBSZWFsbXM8L2VtPiB0cmFuc2FjdGlvbnMuCisgKgorICogQGF1dGhvciBNYW52ZWVuIEthdXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIERlbGV0ZVJlYWxtQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgTUJlYW5TZXJ2ZXIgd2Ugd2lsbCBiZSBpbnRlcmFjdGluZyB3aXRoLgorICAgICAqLworICAgIHByaXZhdGUgTUJlYW5TZXJ2ZXIgbUJTZXJ2ZXIgPSBudWxsOworICAgIAorICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworICAgIAorICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIHNwZWNpZmllZCBIVFRQIHJlcXVlc3QsIGFuZCBjcmVhdGUgdGhlIGNvcnJlc3BvbmRpbmcgSFRUUAorICAgICAqIHJlc3BvbnNlIChvciBmb3J3YXJkIHRvIGFub3RoZXIgd2ViIGNvbXBvbmVudCB0aGF0IHdpbGwgY3JlYXRlIGl0KS4KKyAgICAgKiBSZXR1cm4gYW4gPGNvZGU+QWN0aW9uRm9yd2FyZDwvY29kZT4gaW5zdGFuY2UgZGVzY3JpYmluZyB3aGVyZSBhbmQgaG93CisgICAgICogY29udHJvbCBzaG91bGQgYmUgZm9yd2FyZGVkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcmVzcG9uc2UgaGFzCisgICAgICogYWxyZWFkeSBiZWVuIGNvbXBsZXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBBY3Rpb25NYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gYWN0aW9uRm9ybSBUaGUgb3B0aW9uYWwgQWN0aW9uRm9ybSBiZWFuIGZvciB0aGlzIHJlcXVlc3QgKGlmIGFueSkKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgSFRUUCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBIVFRQIHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBleGNlcHRpb24gb2NjdXJzCisgICAgICovCisgICAgcHVibGljIEFjdGlvbkZvcndhcmQgcGVyZm9ybShBY3Rpb25NYXBwaW5nIG1hcHBpbmcsCisgICAgQWN0aW9uRm9ybSBmb3JtLAorICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAvLyBBY3F1aXJlIHRoZSByZXNvdXJjZXMgdGhhdCB3ZSBuZWVkCisgICAgICAgIEh0dHBTZXNzaW9uIHNlc3Npb24gPSByZXF1ZXN0LmdldFNlc3Npb24oKTsKKyAgICAgICAgTG9jYWxlIGxvY2FsZSA9IGdldExvY2FsZShyZXF1ZXN0KTsKKyAgICAgICAgTWVzc2FnZVJlc291cmNlcyByZXNvdXJjZXMgPSBnZXRSZXNvdXJjZXMocmVxdWVzdCk7CisgICAgICAgIAorICAgICAgICAvLyBBY3F1aXJlIGEgcmVmZXJlbmNlIHRvIHRoZSBNQmVhblNlcnZlciBjb250YWluaW5nIG91ciBNQmVhbnMKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1CU2VydmVyID0gKChBcHBsaWNhdGlvblNlcnZsZXQpIGdldFNlcnZsZXQoKSkuZ2V0U2VydmVyKCk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbgorICAgICAgICAgICAgKCJDYW5ub3QgYWNxdWlyZSBNQmVhblNlcnZlciByZWZlcmVuY2UiLCB0KTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgU3RyaW5nIHBhdHRlcm4gPSBudWxsOworICAgICAgICAvLyBTZXQgdXAgYSBmb3JtIGJlYW4gY29udGFpbmluZyB0aGUgY3VycmVudGx5IHNlbGVjdGVkCisgICAgICAgIC8vIG9iamVjdHMgdG8gYmUgZGVsZXRlZAorICAgICAgICBSZWFsbXNGb3JtIHJlYWxtc0Zvcm0gPSBuZXcgUmVhbG1zRm9ybSgpOworICAgICAgICBTdHJpbmcgc2VsZWN0ID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoInNlbGVjdCIpOworICAgICAgICBpZiAoc2VsZWN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZyByZWFsbXNbXSA9IG5ldyBTdHJpbmdbMV07CisgICAgICAgICAgICByZWFsbXNbMF0gPSBzZWxlY3Q7CisgICAgICAgICAgICByZWFsbXNGb3JtLnNldFJlYWxtcyhyZWFsbXMpOworICAgICAgICAgICAgcGF0dGVybiA9IHNlbGVjdDsKKyAgICAgICAgfQorICAgICAgICByZXF1ZXN0LnNldEF0dHJpYnV0ZSgicmVhbG1zRm9ybSIsIHJlYWxtc0Zvcm0pOworICAgICAgICAKKyAgICAgICAgLy8gQWNjdW11bGF0ZSBhIGxpc3Qgb2YgYWxsIGF2YWlsYWJsZSByZWFsbXMKKyAgICAgICAgQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIFN0cmluZyBwYXJlbnQgPSByZXF1ZXN0LmdldFBhcmFtZXRlcigicGFyZW50Iik7CisgICAgICAgIAorICAgICAgICBpZiAocGFyZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcGF0dGVybiA9IFZhbHZlVXRpbC5nZXRPYmplY3ROYW1lKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQsVG9tY2F0VHJlZUJ1aWxkZXIuUkVBTE1fVFlQRSk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3Iuc2VsZWN0IikpOworICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKKyAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5zZWxlY3QiKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZW1zID0KKyAgICAgICAgICAgIG1CU2VydmVyLnF1ZXJ5TmFtZXMobmV3IE9iamVjdE5hbWUocGF0dGVybiksIG51bGwpLml0ZXJhdG9yKCk7CisgICAgICAgICAgICB3aGlsZSAoaXRlbXMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgbGlzdC5hZGQoaXRlbXMubmV4dCgpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZworICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLnNlbGVjdCIpKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3Iuc2VsZWN0IikpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgQ29sbGVjdGlvbnMuc29ydChsaXN0KTsKKyAgICAgICAgcmVxdWVzdC5zZXRBdHRyaWJ1dGUoInJlYWxtc0xpc3QiLCBsaXN0KTsKKyAgICAgICAgCisgICAgICAgIC8vIEZvcndhcmQgdG8gdGhlIGxpc3QgZGlzcGxheSBwYWdlCisgICAgICAgIHJldHVybiAobWFwcGluZy5maW5kRm9yd2FyZCgiUmVhbG1zIikpOworICAgICAgICAKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZWFsbS9EZWxldGVSZWFsbXNBY3Rpb24uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZWFsbS9EZWxldGVSZWFsbXNBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGVmOWZiCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3JlYWxtL0RlbGV0ZVJlYWxtc0FjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTU4IEBACisvKgorICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5yZWFsbTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0SW5zdGFuY2U7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5tb2RlbG1iZWFuLk1vZGVsTUJlYW47CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcndhcmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMudXRpbC5NZXNzYWdlUmVzb3VyY2VzOworCitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uQXBwbGljYXRpb25TZXJ2bGV0OworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLlRvbWNhdFRyZWVCdWlsZGVyOworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLlRyZWVDb250cm9sOworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLlRyZWVDb250cm9sTm9kZTsKKworCisvKioKKyAqIFRoZSA8Y29kZT5BY3Rpb248L2NvZGU+IHRoYXQgY29tcGxldGVzIDxlbT5EZWxldGUgUmVhbG1zPC9lbT4KKyAqIHRyYW5zYWN0aW9ucy4KKyAqCisgKiBAYXV0aG9yIE1hbnZlZW4gS2F1cgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgRGVsZXRlUmVhbG1zQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKKworCisgICAgLyoqCisgICAgICogU2lnbmF0dXJlIGZvciB0aGUgPGNvZGU+cmVtb3ZlUmVhbG08L2NvZGU+IG9wZXJhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyByZW1vdmVSZWFsbVR5cGVzW10gPQorICAgIHsgImphdmEubGFuZy5TdHJpbmciLCAgICAgIC8vIE9iamVjdCBuYW1lCisgICAgfTsKKworCisgICAgLyoqCisgICAgICogVGhlIE1CZWFuU2VydmVyIHdlIHdpbGwgYmUgaW50ZXJhY3Rpbmcgd2l0aC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1CZWFuU2VydmVyIG1CU2VydmVyID0gbnVsbDsKKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBzcGVjaWZpZWQgSFRUUCByZXF1ZXN0LCBhbmQgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIEhUVFAKKyAgICAgKiByZXNwb25zZSAob3IgZm9yd2FyZCB0byBhbm90aGVyIHdlYiBjb21wb25lbnQgdGhhdCB3aWxsIGNyZWF0ZSBpdCkuCisgICAgICogUmV0dXJuIGFuIDxjb2RlPkFjdGlvbkZvcndhcmQ8L2NvZGU+IGluc3RhbmNlIGRlc2NyaWJpbmcgd2hlcmUgYW5kIGhvdworICAgICAqIGNvbnRyb2wgc2hvdWxkIGJlIGZvcndhcmRlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHJlc3BvbnNlIGhhcworICAgICAqIGFscmVhZHkgYmVlbiBjb21wbGV0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgQWN0aW9uTWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIGFjdGlvbkZvcm0gVGhlIG9wdGlvbmFsIEFjdGlvbkZvcm0gYmVhbiBmb3IgdGhpcyByZXF1ZXN0IChpZiBhbnkpCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIEhUVFAgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgSFRUUCByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXhjZXB0aW9uIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBBY3Rpb25Gb3J3YXJkIHBlcmZvcm0oQWN0aW9uTWFwcGluZyBtYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uRm9ybSBmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworICAgICAgICAKKyAgICAgICAgCisgICAgICAgIC8vIExvb2sgdXAgdGhlIGNvbXBvbmVudHMgd2Ugd2lsbCBiZSB1c2luZyBhcyBuZWVkZWQKKyAgICAgICAgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpOworICAgICAgICBMb2NhbGUgbG9jYWxlID0gZ2V0TG9jYWxlKHJlcXVlc3QpOworICAgICAgICBNZXNzYWdlUmVzb3VyY2VzIHJlc291cmNlcyA9IGdldFJlc291cmNlcyhyZXF1ZXN0KTsKKworICAgICAgICAvLyBBY3F1aXJlIGEgcmVmZXJlbmNlIHRvIHRoZSBNQmVhblNlcnZlciBjb250YWluaW5nIG91ciBNQmVhbnMKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1CU2VydmVyID0gKChBcHBsaWNhdGlvblNlcnZsZXQpIGdldFNlcnZsZXQoKSkuZ2V0U2VydmVyKCk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbgorICAgICAgICAgICAgKCJDYW5ub3QgYWNxdWlyZSBNQmVhblNlcnZlciByZWZlcmVuY2UiLCB0KTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gRGVsZXRlIHRoZSBzcGVjaWZpZWQgUmVhbG1zCisgICAgICAgIFN0cmluZyByZWFsbXNbXSAgPSAoKFJlYWxtc0Zvcm0pIGZvcm0pLmdldFJlYWxtcygpOworICAgICAgICBTdHJpbmcgdmFsdWVzW10gPSBuZXcgU3RyaW5nWzFdOworICAgICAgICBTdHJpbmcgb3BlcmF0aW9uID0gInJlbW92ZVJlYWxtIjsKKyAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgLy8gTG9vayB1cCBvdXIgdHJlZSBjb250cm9sIGRhdGEgc3RydWN0dXJlCisgICAgICAgICAgICBUcmVlQ29udHJvbCBjb250cm9sID0gKFRyZWVDb250cm9sKQorICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0QXR0cmlidXRlKCJ0cmVlQ29udHJvbFRlc3QiKTsKKworICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBzcGVjaWZpZWQgcmVhbG1zCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlYWxtcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIHZhbHVlc1swXSA9IHJlYWxtc1tpXTsKKyAgICAgICAgICAgICAgICBpZiAoY29udHJvbCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wuc2VsZWN0Tm9kZShudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgVHJlZUNvbnRyb2xOb2RlIG5vZGUgPSBjb250cm9sLmZpbmROb2RlKHJlYWxtc1tpXSk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBkb21haW4gPSBub2RlLmdldERvbWFpbigpOworICAgICAgICAgICAgICAgICAgICBPYmplY3ROYW1lIGZuYW1lID0gCisgICAgICAgICAgICAgICAgICAgICAgICBUb21jYXRUcmVlQnVpbGRlci5nZXRNQmVhbkZhY3RvcnkoKTsKKyAgICAgICAgICAgICAgICAgICAgbUJTZXJ2ZXIuaW52b2tlKGZuYW1lLCBvcGVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcywgcmVtb3ZlUmVhbG1UeXBlcyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChub2RlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUucmVtb3ZlKCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nKCJNaXNzaW5nIFRyZWVDb250cm9sTm9kZSBmb3IgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxtc1tpXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nKCJNaXNzaW5nIFRyZWVDb250cm9sIGF0dHJpYnV0ZSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCisgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nCisgICAgICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmludm9rZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbiksIGUpOworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5pbnZva2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24pKTsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlcG9ydCBzdWNjZXNzZnVsIGNvbXBsZXRpb24gb2YgdGhpcyB0cmFuc2FjdGlvbgorICAgICAgICByZXR1cm4gKG1hcHBpbmcuZmluZEZvcndhcmQoIlNhdmUgU3VjY2Vzc2Z1bCIpKTsKKworICAgIH0KKyAgICAKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZWFsbS9FZGl0UmVhbG1BY3Rpb24uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZWFsbS9FZGl0UmVhbG1BY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWU0OTg5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3JlYWxtL0VkaXRSZWFsbUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDg3IEBACisvKgorICogQ29weXJpZ2h0IDIwMDEtMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5yZWFsbTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRXJyb3JzOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3J3YXJkOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLnV0aWwuTWVzc2FnZVJlc291cmNlczsKKworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3RJbnN0YW5jZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5KTUV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkFwcGxpY2F0aW9uU2VydmxldDsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5MYWJlbFZhbHVlQmVhbjsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5MaXN0czsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5Ub21jYXRUcmVlQnVpbGRlcjsKKworLyoqCisgKiBBIGdlbmVyaWMgPGNvZGU+QWN0aW9uPC9jb2RlPiB0aGF0IHNldHMgdXAgPGVtPkVkaXQKKyAqIFJlYWxtIDwvZW0+IHRyYW5zYWN0aW9ucywgYmFzZWQgb24gdGhlIHR5cGUgb2YgUmVhbG0uCisgKgorICogQGF1dGhvciBNYW52ZWVuIEthdXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEVkaXRSZWFsbUFjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisKKworICAgIC8qKgorICAgICAqIFRoZSBNQmVhblNlcnZlciB3ZSB3aWxsIGJlIGludGVyYWN0aW5nIHdpdGguCisgICAgICovCisgICAgcHJpdmF0ZSBNQmVhblNlcnZlciBtQlNlcnZlciA9IG51bGw7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisgICAgLyoqCisgICAgICogUHJvY2VzcyB0aGUgc3BlY2lmaWVkIEhUVFAgcmVxdWVzdCwgYW5kIGNyZWF0ZSB0aGUgY29ycmVzcG9uZGluZyBIVFRQCisgICAgICogcmVzcG9uc2UgKG9yIGZvcndhcmQgdG8gYW5vdGhlciB3ZWIgY29tcG9uZW50IHRoYXQgd2lsbCBjcmVhdGUgaXQpLgorICAgICAqIFJldHVybiBhbiA8Y29kZT5BY3Rpb25Gb3J3YXJkPC9jb2RlPiBpbnN0YW5jZSBkZXNjcmliaW5nIHdoZXJlIGFuZCBob3cKKyAgICAgKiBjb250cm9sIHNob3VsZCBiZSBmb3J3YXJkZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSByZXNwb25zZSBoYXMKKyAgICAgKiBhbHJlYWR5IGJlZW4gY29tcGxldGVkLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIEFjdGlvbk1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSBhY3Rpb25Gb3JtIFRoZSBvcHRpb25hbCBBY3Rpb25Gb3JtIGJlYW4gZm9yIHRoaXMgcmVxdWVzdCAoaWYgYW55KQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBIVFRQIHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIEhUVFAgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0IGV4Y2VwdGlvbiBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgQWN0aW9uRm9yd2FyZCBwZXJmb3JtKEFjdGlvbk1hcHBpbmcgbWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbkZvcm0gZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICAvLyBBY3F1aXJlIHRoZSByZXNvdXJjZXMgdGhhdCB3ZSBuZWVkCisgICAgICAgIEh0dHBTZXNzaW9uIHNlc3Npb24gPSByZXF1ZXN0LmdldFNlc3Npb24oKTsKKyAgICAgICAgTG9jYWxlIGxvY2FsZSA9IGdldExvY2FsZShyZXF1ZXN0KTsKKyAgICAgICAgTWVzc2FnZVJlc291cmNlcyByZXNvdXJjZXMgPSBnZXRSZXNvdXJjZXMocmVxdWVzdCk7CisKKyAgICAgICAgLy8gQWNxdWlyZSBhIHJlZmVyZW5jZSB0byB0aGUgTUJlYW5TZXJ2ZXIgY29udGFpbmluZyBvdXIgTUJlYW5zCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtQlNlcnZlciA9ICgoQXBwbGljYXRpb25TZXJ2bGV0KSBnZXRTZXJ2bGV0KCkpLmdldFNlcnZlcigpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24KKyAgICAgICAgICAgICgiQ2Fubm90IGFjcXVpcmUgTUJlYW5TZXJ2ZXIgcmVmZXJlbmNlIiwgdCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBTZXQgdXAgdGhlIG9iamVjdCBuYW1lcyBvZiB0aGUgTUJlYW5zIHdlIGFyZSBtYW5pcHVsYXRpbmcKKyAgICAgICAgT2JqZWN0TmFtZSBybmFtZSA9IG51bGw7CisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBybmFtZSA9IG5ldyBPYmplY3ROYW1lKHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJzZWxlY3QiKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9CisgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAiZXJyb3IucmVhbG1OYW1lLmJhZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5nZXRQYXJhbWV0ZXIoInNlbGVjdCIpKTsKKyAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cobWVzc2FnZSk7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19CQURfUkVRVUVTVCwgbWVzc2FnZSk7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICB9CisKKyAgICAgICBTdHJpbmcgcmVhbG1UeXBlID0gbnVsbDsKKyAgICAgICBTdHJpbmcgYXR0cmlidXRlID0gbnVsbDsKKworICAgICAgIC8vIEZpbmQgd2hhdCB0eXBlIG9mIFJlYWxtIHRoaXMgaXMKKyAgICAgICB0cnkgeworICAgICAgICAgICAgYXR0cmlidXRlID0gImNsYXNzTmFtZSI7CisgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gKFN0cmluZykKKyAgICAgICAgICAgICAgICBtQlNlcnZlci5nZXRBdHRyaWJ1dGUocm5hbWUsIGF0dHJpYnV0ZSk7CisgICAgICAgICAgICBpbnQgcGVyaW9kID0gY2xhc3NOYW1lLmxhc3RJbmRleE9mKCIuIik7CisgICAgICAgICAgICBpZiAocGVyaW9kID49IDApCisgICAgICAgICAgICAgICAgcmVhbG1UeXBlID0gY2xhc3NOYW1lLnN1YnN0cmluZyhwZXJpb2QgKyAxKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nCisgICAgICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmF0dHJpYnV0ZS5nZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUpLCB0KTsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuYXR0cmlidXRlLmdldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSkpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEZvcndhcmQgdG8gdGhlIGFwcHJvcHJpYXRlIHJlYWxtIGRpc3BsYXkgcGFnZQorCisgICAgICAgIGlmICgiVXNlckRhdGFiYXNlUmVhbG0iLmVxdWFsc0lnbm9yZUNhc2UocmVhbG1UeXBlKSkgeworICAgICAgICAgICAgICAgc2V0VXBVc2VyRGF0YWJhc2VSZWFsbShybmFtZSwgcmVxdWVzdCwgcmVzcG9uc2UpOworICAgICAgICB9IGVsc2UgaWYgKCJNZW1vcnlSZWFsbSIuZXF1YWxzSWdub3JlQ2FzZShyZWFsbVR5cGUpKSB7CisgICAgICAgICAgICAgICBzZXRVcE1lbW9yeVJlYWxtKHJuYW1lLCByZXF1ZXN0LCByZXNwb25zZSk7CisgICAgICAgIH0gZWxzZSBpZiAoIkpEQkNSZWFsbSIuZXF1YWxzSWdub3JlQ2FzZShyZWFsbVR5cGUpKSB7CisgICAgICAgICAgICAgICBzZXRVcEpEQkNSZWFsbShybmFtZSwgcmVxdWVzdCwgcmVzcG9uc2UpOworICAgICAgICB9IGVsc2UgaWYgKCJKTkRJUmVhbG0iLmVxdWFsc0lnbm9yZUNhc2UocmVhbG1UeXBlKSkgeworICAgICAgICAgICAgICAgc2V0VXBKTkRJUmVhbG0ocm5hbWUsIHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICAgICAgfSBlbHNlIGlmICgiRGF0YVNvdXJjZVJlYWxtIi5lcXVhbHNJZ25vcmVDYXNlKHJlYWxtVHlwZSkpIHsKKyAgICAgICAgICAgICAgICBzZXRVcERhdGFTb3VyY2VSZWFsbShybmFtZSwgcmVxdWVzdCwgcmVzcG9uc2UpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIChtYXBwaW5nLmZpbmRGb3J3YXJkKHJlYWxtVHlwZSkpOworCisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldFVwVXNlckRhdGFiYXNlUmVhbG0oT2JqZWN0TmFtZSBybmFtZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLyBGaWxsIGluIHRoZSBmb3JtIHZhbHVlcyBmb3IgZGlzcGxheSBhbmQgZWRpdGluZworICAgICAgICBNZXNzYWdlUmVzb3VyY2VzIHJlc291cmNlcyA9IGdldFJlc291cmNlcyhyZXF1ZXN0KTsKKyAgICAgICAgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpOworICAgICAgICBMb2NhbGUgbG9jYWxlID0gZ2V0TG9jYWxlKHJlcXVlc3QpOworICAgICAgICBVc2VyRGF0YWJhc2VSZWFsbUZvcm0gcmVhbG1GbSA9IG5ldyBVc2VyRGF0YWJhc2VSZWFsbUZvcm0oKTsKKyAgICAgICAgc2Vzc2lvbi5zZXRBdHRyaWJ1dGUoInVzZXJEYXRhYmFzZVJlYWxtRm9ybSIsIHJlYWxtRm0pOworICAgICAgICByZWFsbUZtLnNldEFkbWluQWN0aW9uKCJFZGl0Iik7CisgICAgICAgIHJlYWxtRm0uc2V0T2JqZWN0TmFtZShybmFtZS50b1N0cmluZygpKTsKKyAgICAgICAgU3RyaW5nIHJlYWxtVHlwZSA9ICJVc2VyRGF0YWJhc2VSZWFsbSI7CisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIiIpOworICAgICAgICBTdHJpbmcgaG9zdCA9IHJuYW1lLmdldEtleVByb3BlcnR5KCJob3N0Iik7CisgICAgICAgIFN0cmluZyBjb250ZXh0ID0gcm5hbWUuZ2V0S2V5UHJvcGVydHkoInBhdGgiKTsKKyAgICAgICAgaWYgKGhvc3QhPW51bGwpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiSG9zdCAoIiArIGhvc3QgKyAiKSA+ICIpOworICAgICAgICB9CisgICAgICAgIGlmIChjb250ZXh0IT1udWxsKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIkNvbnRleHQgKCIgKyBjb250ZXh0ICsgIikgPiAiKTsKKyAgICAgICAgfQorICAgICAgICBzYi5hcHBlbmQocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAic2VydmVyLnNlcnZpY2UudHJlZUJ1aWxkZXIucmVhbG0iKSk7CisgICAgICAgIHJlYWxtRm0uc2V0Tm9kZUxhYmVsKHNiLnRvU3RyaW5nKCkpOworICAgICAgICByZWFsbUZtLnNldFJlYWxtVHlwZShyZWFsbVR5cGUpOworICAgICAgICByZWFsbUZtLnNldEFsbG93RGVsZXRpb24oYWxsb3dEZWxldGlvbihybmFtZSxyZXF1ZXN0KSk7CisKKyAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZSA9IG51bGw7CisgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgIC8vIENvcHkgc2NhbGFyIHByb3BlcnRpZXMKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJyZXNvdXJjZU5hbWUiOworICAgICAgICAgICAgcmVhbG1GbS5zZXRSZXNvdXJjZQorICAgICAgICAgICAgICAgICgoU3RyaW5nKSBtQlNlcnZlci5nZXRBdHRyaWJ1dGUocm5hbWUsIGF0dHJpYnV0ZSkpOworCisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nCisgICAgICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmF0dHJpYnV0ZS5nZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUpLCB0KTsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuYXR0cmlidXRlLmdldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldFVwTWVtb3J5UmVhbG0oT2JqZWN0TmFtZSBybmFtZSwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLyBGaWxsIGluIHRoZSBmb3JtIHZhbHVlcyBmb3IgZGlzcGxheSBhbmQgZWRpdGluZworICAgICAgICBNZXNzYWdlUmVzb3VyY2VzIHJlc291cmNlcyA9IGdldFJlc291cmNlcyhyZXF1ZXN0KTsKKyAgICAgICAgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpOworICAgICAgICBMb2NhbGUgbG9jYWxlID0gZ2V0TG9jYWxlKHJlcXVlc3QpOworICAgICAgICBNZW1vcnlSZWFsbUZvcm0gcmVhbG1GbSA9IG5ldyBNZW1vcnlSZWFsbUZvcm0oKTsKKyAgICAgICAgc2Vzc2lvbi5zZXRBdHRyaWJ1dGUoIm1lbW9yeVJlYWxtRm9ybSIsIHJlYWxtRm0pOworICAgICAgICByZWFsbUZtLnNldEFkbWluQWN0aW9uKCJFZGl0Iik7CisgICAgICAgIHJlYWxtRm0uc2V0T2JqZWN0TmFtZShybmFtZS50b1N0cmluZygpKTsKKyAgICAgICAgU3RyaW5nIHJlYWxtVHlwZSA9ICJNZW1vcnlSZWFsbSI7CisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgc2IuYXBwZW5kKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInNlcnZlci5zZXJ2aWNlLnRyZWVCdWlsZGVyLnJlYWxtIikpOworICAgICAgICBzYi5hcHBlbmQoIiAoIik7CisgICAgICAgIHNiLmFwcGVuZChyZWFsbVR5cGUpOworICAgICAgICBzYi5hcHBlbmQoIikiKTsKKyAgICAgICAgcmVhbG1GbS5zZXROb2RlTGFiZWwoc2IudG9TdHJpbmcoKSk7CisgICAgICAgIHJlYWxtRm0uc2V0UmVhbG1UeXBlKHJlYWxtVHlwZSk7CisgICAgICAgIHJlYWxtRm0uc2V0QWxsb3dEZWxldGlvbihhbGxvd0RlbGV0aW9uKHJuYW1lLHJlcXVlc3QpKTsKKworICAgICAgICBTdHJpbmcgYXR0cmlidXRlID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgLy8gQ29weSBzY2FsYXIgcHJvcGVydGllcworICAgICAgICAgICAgYXR0cmlidXRlID0gInBhdGhuYW1lIjsKKyAgICAgICAgICAgIHJlYWxtRm0uc2V0UGF0aE5hbWUKKyAgICAgICAgICAgICAgICAoKFN0cmluZykgbUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKHJuYW1lLCBhdHRyaWJ1dGUpKTsKKworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZworICAgICAgICAgICAgICAgIChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5hdHRyaWJ1dGUuZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlKSwgdCk7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsCisgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmF0dHJpYnV0ZS5nZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXRVcEpEQkNSZWFsbShPYmplY3ROYW1lIHJuYW1lLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIEZpbGwgaW4gdGhlIGZvcm0gdmFsdWVzIGZvciBkaXNwbGF5IGFuZCBlZGl0aW5nCisgICAgICAgIE1lc3NhZ2VSZXNvdXJjZXMgcmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VzKHJlcXVlc3QpOworICAgICAgICBIdHRwU2Vzc2lvbiBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uKCk7CisgICAgICAgIExvY2FsZSBsb2NhbGUgPSBnZXRMb2NhbGUocmVxdWVzdCk7CisgICAgICAgIEpEQkNSZWFsbUZvcm0gcmVhbG1GbSA9IG5ldyBKREJDUmVhbG1Gb3JtKCk7CisgICAgICAgIHNlc3Npb24uc2V0QXR0cmlidXRlKCJqZGJjUmVhbG1Gb3JtIiwgcmVhbG1GbSk7CisgICAgICAgIHJlYWxtRm0uc2V0QWRtaW5BY3Rpb24oIkVkaXQiKTsKKyAgICAgICAgcmVhbG1GbS5zZXRPYmplY3ROYW1lKHJuYW1lLnRvU3RyaW5nKCkpOworICAgICAgICBTdHJpbmcgcmVhbG1UeXBlID0gIkpEQkNSZWFsbSI7CisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgc2IuYXBwZW5kKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInNlcnZlci5zZXJ2aWNlLnRyZWVCdWlsZGVyLnJlYWxtIikpOworICAgICAgICBzYi5hcHBlbmQoIiAoIik7CisgICAgICAgIHNiLmFwcGVuZChyZWFsbVR5cGUpOworICAgICAgICBzYi5hcHBlbmQoIikiKTsKKyAgICAgICAgcmVhbG1GbS5zZXROb2RlTGFiZWwoc2IudG9TdHJpbmcoKSk7CisgICAgICAgIHJlYWxtRm0uc2V0UmVhbG1UeXBlKHJlYWxtVHlwZSk7CisgICAgICAgIHJlYWxtRm0uc2V0QWxsb3dEZWxldGlvbihhbGxvd0RlbGV0aW9uKHJuYW1lLHJlcXVlc3QpKTsKKworICAgICAgICBTdHJpbmcgYXR0cmlidXRlID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgLy8gQ29weSBzY2FsYXIgcHJvcGVydGllcworICAgICAgICAgICAgYXR0cmlidXRlID0gImRpZ2VzdCI7CisgICAgICAgICAgICByZWFsbUZtLnNldERpZ2VzdAorICAgICAgICAgICAgICAgICgoU3RyaW5nKSBtQlNlcnZlci5nZXRBdHRyaWJ1dGUocm5hbWUsIGF0dHJpYnV0ZSkpOworICAgICAgICAgICAgYXR0cmlidXRlID0gImRyaXZlck5hbWUiOworICAgICAgICAgICAgcmVhbG1GbS5zZXREcml2ZXIKKyAgICAgICAgICAgICAgICAoKFN0cmluZykgbUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKHJuYW1lLCBhdHRyaWJ1dGUpKTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJyb2xlTmFtZUNvbCI7CisgICAgICAgICAgICByZWFsbUZtLnNldFJvbGVOYW1lQ29sCisgICAgICAgICAgICAgICAgKChTdHJpbmcpIG1CU2VydmVyLmdldEF0dHJpYnV0ZShybmFtZSwgYXR0cmlidXRlKSk7CisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAidXNlck5hbWVDb2wiOworICAgICAgICAgICAgcmVhbG1GbS5zZXRVc2VyTmFtZUNvbAorICAgICAgICAgICAgICAgICgoU3RyaW5nKSBtQlNlcnZlci5nZXRBdHRyaWJ1dGUocm5hbWUsIGF0dHJpYnV0ZSkpOworICAgICAgICAgICAgYXR0cmlidXRlID0gInVzZXJDcmVkQ29sIjsKKyAgICAgICAgICAgIHJlYWxtRm0uc2V0UGFzc3dvcmRDb2wKKyAgICAgICAgICAgICAgICAoKFN0cmluZykgbUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKHJuYW1lLCBhdHRyaWJ1dGUpKTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJ1c2VyVGFibGUiOworICAgICAgICAgICAgcmVhbG1GbS5zZXRVc2VyVGFibGUKKyAgICAgICAgICAgICAgICAoKFN0cmluZykgbUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKHJuYW1lLCBhdHRyaWJ1dGUpKTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJ1c2VyUm9sZVRhYmxlIjsKKyAgICAgICAgICAgIHJlYWxtRm0uc2V0Um9sZVRhYmxlCisgICAgICAgICAgICAgICAgKChTdHJpbmcpIG1CU2VydmVyLmdldEF0dHJpYnV0ZShybmFtZSwgYXR0cmlidXRlKSk7CisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAiY29ubmVjdGlvbk5hbWUiOworICAgICAgICAgICAgcmVhbG1GbS5zZXRDb25uZWN0aW9uTmFtZQorICAgICAgICAgICAgICAgICgoU3RyaW5nKSBtQlNlcnZlci5nZXRBdHRyaWJ1dGUocm5hbWUsIGF0dHJpYnV0ZSkpOworICAgICAgICAgICAgYXR0cmlidXRlID0gImNvbm5lY3Rpb25QYXNzd29yZCI7CisgICAgICAgICAgICByZWFsbUZtLnNldENvbm5lY3Rpb25QYXNzd29yZAorICAgICAgICAgICAgICAgICgoU3RyaW5nKSBtQlNlcnZlci5nZXRBdHRyaWJ1dGUocm5hbWUsIGF0dHJpYnV0ZSkpOworICAgICAgICAgICAgYXR0cmlidXRlID0gImNvbm5lY3Rpb25VUkwiOworICAgICAgICAgICAgcmVhbG1GbS5zZXRDb25uZWN0aW9uVVJMCisgICAgICAgICAgICAgICAgKChTdHJpbmcpIG1CU2VydmVyLmdldEF0dHJpYnV0ZShybmFtZSwgYXR0cmlidXRlKSk7CisKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuYXR0cmlidXRlLmdldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSksIHQpOworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5hdHRyaWJ1dGUuZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0VXBKTkRJUmVhbG0oT2JqZWN0TmFtZSBybmFtZSwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLyBGaWxsIGluIHRoZSBmb3JtIHZhbHVlcyBmb3IgZGlzcGxheSBhbmQgZWRpdGluZworICAgICAgICBNZXNzYWdlUmVzb3VyY2VzIHJlc291cmNlcyA9IGdldFJlc291cmNlcyhyZXF1ZXN0KTsKKyAgICAgICAgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpOworICAgICAgICBMb2NhbGUgbG9jYWxlID0gZ2V0TG9jYWxlKHJlcXVlc3QpOworICAgICAgICBKTkRJUmVhbG1Gb3JtIHJlYWxtRm0gPSBuZXcgSk5ESVJlYWxtRm9ybSgpOworICAgICAgICBzZXNzaW9uLnNldEF0dHJpYnV0ZSgiam5kaVJlYWxtRm9ybSIsIHJlYWxtRm0pOworICAgICAgICByZWFsbUZtLnNldEFkbWluQWN0aW9uKCJFZGl0Iik7CisgICAgICAgIHJlYWxtRm0uc2V0T2JqZWN0TmFtZShybmFtZS50b1N0cmluZygpKTsKKyAgICAgICAgU3RyaW5nIHJlYWxtVHlwZSA9ICJKTkRJUmVhbG0iOworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIHNiLmFwcGVuZChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJzZXJ2ZXIuc2VydmljZS50cmVlQnVpbGRlci5yZWFsbSIpKTsKKyAgICAgICAgc2IuYXBwZW5kKCIgKCIpOworICAgICAgICBzYi5hcHBlbmQocmVhbG1UeXBlKTsKKyAgICAgICAgc2IuYXBwZW5kKCIpIik7CisgICAgICAgIHJlYWxtRm0uc2V0Tm9kZUxhYmVsKHNiLnRvU3RyaW5nKCkpOworICAgICAgICByZWFsbUZtLnNldFJlYWxtVHlwZShyZWFsbVR5cGUpOworICAgICAgICByZWFsbUZtLnNldFNlYXJjaFZhbHMoTGlzdHMuZ2V0Qm9vbGVhblZhbHVlcygpKTsKKyAgICAgICAgcmVhbG1GbS5zZXRBbGxvd0RlbGV0aW9uKGFsbG93RGVsZXRpb24ocm5hbWUscmVxdWVzdCkpOworCisgICAgICAgIFN0cmluZyBhdHRyaWJ1dGUgPSBudWxsOworICAgICAgICB0cnkgeworCisgICAgICAgICAgICAvLyBDb3B5IHNjYWxhciBwcm9wZXJ0aWVzCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAiZGlnZXN0IjsKKyAgICAgICAgICAgIHJlYWxtRm0uc2V0RGlnZXN0CisgICAgICAgICAgICAgICAgKChTdHJpbmcpIG1CU2VydmVyLmdldEF0dHJpYnV0ZShybmFtZSwgYXR0cmlidXRlKSk7CisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAidXNlclN1YnRyZWUiOworICAgICAgICAgICAgcmVhbG1GbS5zZXRVc2VyU3VidHJlZQorICAgICAgICAgICAgICAgICAgICAoKChCb29sZWFuKSBtQlNlcnZlci5nZXRBdHRyaWJ1dGUocm5hbWUsIGF0dHJpYnV0ZSkpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgYXR0cmlidXRlID0gInJvbGVTdWJ0cmVlIjsKKyAgICAgICAgICAgIHJlYWxtRm0uc2V0Um9sZVN1YnRyZWUKKyAgICAgICAgICAgICAgICAgICAgKCgoQm9vbGVhbikgbUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKHJuYW1lLCBhdHRyaWJ1dGUpKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJ1c2VyUm9sZU5hbWUiOworICAgICAgICAgICAgcmVhbG1GbS5zZXRVc2VyUm9sZU5hbWUKKyAgICAgICAgICAgICAgICAoKFN0cmluZykgbUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKHJuYW1lLCBhdHRyaWJ1dGUpKTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJyb2xlTmFtZSI7CisgICAgICAgICAgICByZWFsbUZtLnNldFJvbGVOYW1lCisgICAgICAgICAgICAgICAgKChTdHJpbmcpIG1CU2VydmVyLmdldEF0dHJpYnV0ZShybmFtZSwgYXR0cmlidXRlKSk7CisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAicm9sZUJhc2UiOworICAgICAgICAgICAgcmVhbG1GbS5zZXRSb2xlQmFzZQorICAgICAgICAgICAgICAgICgoU3RyaW5nKSBtQlNlcnZlci5nZXRBdHRyaWJ1dGUocm5hbWUsIGF0dHJpYnV0ZSkpOworICAgICAgICAgICAgYXR0cmlidXRlID0gInJvbGVTZWFyY2giOworICAgICAgICAgICAgcmVhbG1GbS5zZXRSb2xlUGF0dGVybgorICAgICAgICAgICAgICAgICgoU3RyaW5nKSBtQlNlcnZlci5nZXRBdHRyaWJ1dGUocm5hbWUsIGF0dHJpYnV0ZSkpOworICAgICAgICAgICAgYXR0cmlidXRlID0gImNvbnRleHRGYWN0b3J5IjsKKyAgICAgICAgICAgIHJlYWxtRm0uc2V0Q29udGV4dEZhY3RvcnkKKyAgICAgICAgICAgICAgICAoKFN0cmluZykgbUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKHJuYW1lLCBhdHRyaWJ1dGUpKTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJ1c2VyUGFzc3dvcmQiOworICAgICAgICAgICAgcmVhbG1GbS5zZXRVc2VyUGFzc3dvcmQKKyAgICAgICAgICAgICAgICAoKFN0cmluZykgbUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKHJuYW1lLCBhdHRyaWJ1dGUpKTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJ1c2VyUGF0dGVybiI7CisgICAgICAgICAgICByZWFsbUZtLnNldFVzZXJQYXR0ZXJuCisgICAgICAgICAgICAgICAgKChTdHJpbmcpIG1CU2VydmVyLmdldEF0dHJpYnV0ZShybmFtZSwgYXR0cmlidXRlKSk7CisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAidXNlclNlYXJjaCI7CisgICAgICAgICAgICByZWFsbUZtLnNldFVzZXJTZWFyY2gKKyAgICAgICAgICAgICAgICAoKFN0cmluZykgbUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKHJuYW1lLCBhdHRyaWJ1dGUpKTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJjb25uZWN0aW9uTmFtZSI7CisgICAgICAgICAgICByZWFsbUZtLnNldENvbm5lY3Rpb25OYW1lCisgICAgICAgICAgICAgICAgKChTdHJpbmcpIG1CU2VydmVyLmdldEF0dHJpYnV0ZShybmFtZSwgYXR0cmlidXRlKSk7CisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAiY29ubmVjdGlvblBhc3N3b3JkIjsKKyAgICAgICAgICAgIHJlYWxtRm0uc2V0Q29ubmVjdGlvblBhc3N3b3JkCisgICAgICAgICAgICAgICAgKChTdHJpbmcpIG1CU2VydmVyLmdldEF0dHJpYnV0ZShybmFtZSwgYXR0cmlidXRlKSk7CisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAiY29ubmVjdGlvblVSTCI7CisgICAgICAgICAgICByZWFsbUZtLnNldENvbm5lY3Rpb25VUkwKKyAgICAgICAgICAgICAgICAoKFN0cmluZykgbUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKHJuYW1lLCBhdHRyaWJ1dGUpKTsKKworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZworICAgICAgICAgICAgICAgIChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5hdHRyaWJ1dGUuZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlKSwgdCk7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsCisgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmF0dHJpYnV0ZS5nZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXRVcERhdGFTb3VyY2VSZWFsbShPYmplY3ROYW1lIHJuYW1lLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIEZpbGwgaW4gdGhlIGZvcm0gdmFsdWVzIGZvciBkaXNwbGF5IGFuZCBlZGl0aW5nCisgICAgICAgIE1lc3NhZ2VSZXNvdXJjZXMgcmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VzKHJlcXVlc3QpOworICAgICAgICBIdHRwU2Vzc2lvbiBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uKCk7CisgICAgICAgIExvY2FsZSBsb2NhbGUgPSBnZXRMb2NhbGUocmVxdWVzdCk7CisgICAgICAgIERhdGFTb3VyY2VSZWFsbUZvcm0gcmVhbG1GbSA9IG5ldyBEYXRhU291cmNlUmVhbG1Gb3JtKCk7CisgICAgICAgIHNlc3Npb24uc2V0QXR0cmlidXRlKCJkYXRhU291cmNlUmVhbG1Gb3JtIiwgcmVhbG1GbSk7CisgICAgICAgIHJlYWxtRm0uc2V0QWRtaW5BY3Rpb24oIkVkaXQiKTsKKyAgICAgICAgcmVhbG1GbS5zZXRPYmplY3ROYW1lKHJuYW1lLnRvU3RyaW5nKCkpOworICAgICAgICBTdHJpbmcgcmVhbG1UeXBlID0gIkRhdGFTb3VyY2VSZWFsbSI7CisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgc2IuYXBwZW5kKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInNlcnZlci5zZXJ2aWNlLnRyZWVCdWlsZGVyLnJlYWxtIikpOworICAgICAgICBzYi5hcHBlbmQoIiAoIik7CisgICAgICAgIHNiLmFwcGVuZChyZWFsbVR5cGUpOworICAgICAgICBzYi5hcHBlbmQoIikiKTsKKyAgICAgICAgcmVhbG1GbS5zZXROb2RlTGFiZWwoc2IudG9TdHJpbmcoKSk7CisgICAgICAgIHJlYWxtRm0uc2V0UmVhbG1UeXBlKHJlYWxtVHlwZSk7CisgICAgICAgIHJlYWxtRm0uc2V0QWxsb3dEZWxldGlvbihhbGxvd0RlbGV0aW9uKHJuYW1lLHJlcXVlc3QpKTsKKyAgICAgICAgcmVhbG1GbS5zZXRCb29sZWFuVmFscyhMaXN0cy5nZXRCb29sZWFuVmFsdWVzKCkpOworCisgICAgICAgIFN0cmluZyBhdHRyaWJ1dGUgPSBudWxsOworICAgICAgICB0cnkgeworCisgICAgICAgICAgICAvLyBDb3B5IHNjYWxhciBwcm9wZXJ0aWVzCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAiZGF0YVNvdXJjZU5hbWUiOworICAgICAgICAgICAgcmVhbG1GbS5zZXREYXRhU291cmNlTmFtZQorICAgICAgICAgICAgICAgICgoU3RyaW5nKSBtQlNlcnZlci5nZXRBdHRyaWJ1dGUocm5hbWUsIGF0dHJpYnV0ZSkpOworICAgICAgICAgICAgYXR0cmlidXRlID0gImRpZ2VzdCI7CisgICAgICAgICAgICByZWFsbUZtLnNldERpZ2VzdAorICAgICAgICAgICAgICAgICgoU3RyaW5nKSBtQlNlcnZlci5nZXRBdHRyaWJ1dGUocm5hbWUsIGF0dHJpYnV0ZSkpOworICAgICAgICAgICAgYXR0cmlidXRlID0gImxvY2FsRGF0YVNvdXJjZSI7CisgICAgICAgICAgICByZWFsbUZtLnNldExvY2FsRGF0YVNvdXJjZQorICAgICAgICAgICAgICAgICgoKEJvb2xlYW4pIG1CU2VydmVyLmdldEF0dHJpYnV0ZShybmFtZSwgYXR0cmlidXRlKSkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAicm9sZU5hbWVDb2wiOworICAgICAgICAgICAgcmVhbG1GbS5zZXRSb2xlTmFtZUNvbAorICAgICAgICAgICAgICAgICgoU3RyaW5nKSBtQlNlcnZlci5nZXRBdHRyaWJ1dGUocm5hbWUsIGF0dHJpYnV0ZSkpOworICAgICAgICAgICAgYXR0cmlidXRlID0gInVzZXJDcmVkQ29sIjsKKyAgICAgICAgICAgIHJlYWxtRm0uc2V0VXNlckNyZWRDb2wKKyAgICAgICAgICAgICAgICAoKFN0cmluZykgbUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKHJuYW1lLCBhdHRyaWJ1dGUpKTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJ1c2VyTmFtZUNvbCI7CisgICAgICAgICAgICByZWFsbUZtLnNldFVzZXJOYW1lQ29sCisgICAgICAgICAgICAgICAgKChTdHJpbmcpIG1CU2VydmVyLmdldEF0dHJpYnV0ZShybmFtZSwgYXR0cmlidXRlKSk7CisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAidXNlclJvbGVUYWJsZSI7CisgICAgICAgICAgICByZWFsbUZtLnNldFVzZXJSb2xlVGFibGUKKyAgICAgICAgICAgICAgICAoKFN0cmluZykgbUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKHJuYW1lLCBhdHRyaWJ1dGUpKTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJ1c2VyVGFibGUiOworICAgICAgICAgICAgcmVhbG1GbS5zZXRVc2VyVGFibGUKKyAgICAgICAgICAgICAgICAoKFN0cmluZykgbUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKHJuYW1lLCBhdHRyaWJ1dGUpKTsKKworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZworICAgICAgICAgICAgICAgIChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5hdHRyaWJ1dGUuZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlKSwgdCk7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsCisgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmF0dHJpYnV0ZS5nZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogQ2hlY2sgaWYgImRlbGV0ZSB0aGlzIHJlYWxtIiBvcGVyYXRpb24gc2hvdWxkIGJlIGVuYWJsZWQuCisgICAgICogdGhpcyBvcGVyYXRpb24gaXMgbm90IGFsbG93ZWQgaW4gY2FzZSB0aGUgcmVhbG0gaXMgdW5kZXIgc2VydmljZSwKKyAgICAgKiBob3N0IG9yIGNvbnRleHQgdGhhdCB0aGUgYWRtaW4gYXBwIHJ1bnMgb24uCisgICAgICogcmV0dXJuICJ0cnVlIiBpZiBkZWxldGlvbiBpcyBhbGxvd2VkLgorICAgICAqLworCisgICAgcHJpdmF0ZSBTdHJpbmcgYWxsb3dEZWxldGlvbihPYmplY3ROYW1lIHJuYW1lLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworCisgICAgIGJvb2xlYW4gcmV0VmFsID0gdHJ1ZTsKKyAgICAgdHJ5eworICAgICAgICAvLyBhZG1pbiBhcHAncyB2YWx1ZXMKKyAgICAgICAgU3RyaW5nIGFkbWluU2VydmljZSA9IExpc3RzLmdldEFkbWluQXBwU2VydmljZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CU2VydmVyLCBybmFtZS5nZXREb21haW4oKSxyZXF1ZXN0KTsKKyAgICAgICAgU3RyaW5nIGFkbWluSG9zdCA9IHJlcXVlc3QuZ2V0U2VydmVyTmFtZSgpOworICAgICAgICBTdHJpbmcgYWRtaW5Db250ZXh0ID0gcmVxdWVzdC5nZXRDb250ZXh0UGF0aCgpOworCisgICAgICAgIC8vU3RyaW5nIHRoaXNTZXJ2aWNlID0gcm5hbWUuZ2V0S2V5UHJvcGVydHkoInNlcnZpY2UiKTsKKyAgICAgICAgU3RyaW5nIGRvbWFpbiA9IHJuYW1lLmdldERvbWFpbigpOworICAgICAgICBTdHJpbmcgdGhpc0hvc3QgPSBybmFtZS5nZXRLZXlQcm9wZXJ0eSgiaG9zdCIpOworICAgICAgICBTdHJpbmcgdGhpc0NvbnRleHQgPSBybmFtZS5nZXRLZXlQcm9wZXJ0eSgicGF0aCIpOworCisgICAgICAgIC8vIHJlYWxtIGlzIHVuZGVyIGNvbnRleHQKKyAgICAgICAgaWYgKHRoaXNDb250ZXh0IT1udWxsKSB7CisgICAgICAgICAgICByZXRWYWwgPSAhKHRoaXNDb250ZXh0LmVxdWFsc0lnbm9yZUNhc2UoYWRtaW5Db250ZXh0KSk7CisgICAgICAgIH0gZWxzZSBpZiAodGhpc0hvc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gcmVhbG0gaXMgdW5kZXIgaG9zdAorICAgICAgICAgICAgcmV0VmFsID0gISh0aGlzSG9zdC5lcXVhbHNJZ25vcmVDYXNlKGFkbWluSG9zdCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gWFhYIEZJWE1FCisgICAgICAgICAgICAvLyByZWFsbSBpcyB1bmRlciBzZXJ2aWNlCisgICAgICAgICAgICByZXR1cm4gImZhbHNlIjsKKyAgICAgICAgICAgIC8vcmV0VmFsID0gISh0aGlzU2VydmljZS5lcXVhbHNJZ25vcmVDYXNlKGFkbWluU2VydmljZSkpOworICAgICAgICB9CisKKyAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZygiRXJyb3IgZ2V0dGluZyBhZG1pbiBzZXJ2aWNlLCBob3N0IG9yIGNvbnRleHQiLCBlKTsKKyAgICAgfQorICAgICAgICByZXR1cm4gbmV3IEJvb2xlYW4ocmV0VmFsKS50b1N0cmluZygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZWFsbS9KREJDUmVhbG1Gb3JtLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVhbG0vSkRCQ1JlYWxtRm9ybS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjZjgyMjIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVhbG0vSkRCQ1JlYWxtRm9ybS5qYXZhCkBAIC0wLDAgKzEsNDE1IEBACisvKgorICogQ29weXJpZ2h0IDIwMDEsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVhbG07CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25FcnJvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRXJyb3JzOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uQXBwbGljYXRpb25TZXJ2bGV0OworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkxhYmVsVmFsdWVCZWFuOworCisvKioKKyAqIEZvcm0gYmVhbiBmb3IgdGhlIGpkYmMgcmVhbG0gcGFnZS4KKyAqCisgKiBAYXV0aG9yIE1hbnZlZW4gS2F1cgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgSkRCQ1JlYWxtRm9ybSBleHRlbmRzIFJlYWxtRm9ybSB7CisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisgICAgCisgICAgLyoqCisgICAgICogVGhlIHRleHQgZm9yIHRoZSByZWFsbSBuYW1lLCB1c2VkIHRvIHJldHJpZXZlCisgICAgICogdGhlIGNvcnJlc3BvbmRpbmcgcmVhbG0gbUJlYW4uCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcmVhbG1OYW1lID0gbnVsbDsKKyAgICAgIAorICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciB0aGUgZGlnZXN0LgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGRpZ2VzdCA9IG51bGw7CisgICAgCisgICAgLyoqCisgICAgICogVGhlIHRleHQgZm9yIHRoZSByb2xlTmFtZUNvbC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyByb2xlTmFtZUNvbCA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdGV4dCBmb3IgdGhlIHVzZXJOYW1lQ29sLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHVzZXJOYW1lQ29sID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciB0aGUgcGFzc3dvcmRDb2wuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcGFzc3dvcmRDb2wgPSBudWxsOworICAgIAorICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciB0aGUgZHJpdmVyLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGRyaXZlciA9IG51bGw7CisgICAgICAgIAorICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciB0aGUgcm9sZSB0YWJsZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyByb2xlVGFibGUgPSBudWxsOworICAgIAorICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciB0aGUgdXNlciB0YWJsZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyB1c2VyVGFibGUgPSBudWxsOworICAgICAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgdGV4dCBmb3IgdGhlIGNvbm5lY3Rpb24gdXNlciBuYW1lLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGNvbm5lY3Rpb25OYW1lID0gbnVsbDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgdGV4dCBmb3IgdGhlIGNvbm5lY3Rpb24gUGFzc3dvcmQuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgY29ubmVjdGlvblBhc3N3b3JkID0gbnVsbDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgdGV4dCBmb3IgdGhlIGNvbm5lY3Rpb24gVVJMLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGNvbm5lY3Rpb25VUkwgPSBudWxsOworICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZGlnZXN0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGlnZXN0KCkgeworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXMuZGlnZXN0OworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBkaWdlc3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGlnZXN0KFN0cmluZyBkaWdlc3QpIHsKKyAgICAgICAgCisgICAgICAgIHRoaXMuZGlnZXN0ID0gZGlnZXN0OworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSByb2xlTmFtZUNvbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFJvbGVOYW1lQ29sKCkgeworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXMucm9sZU5hbWVDb2w7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHJvbGVOYW1lQ29sLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJvbGVOYW1lQ29sKFN0cmluZyByb2xlTmFtZUNvbCkgeworICAgICAgICAKKyAgICAgICAgdGhpcy5yb2xlTmFtZUNvbCA9IHJvbGVOYW1lQ29sOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB1c2VyTmFtZUNvbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFVzZXJOYW1lQ29sKCkgeworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXMudXNlck5hbWVDb2w7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHVzZXJOYW1lQ29sLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVzZXJOYW1lQ29sKFN0cmluZyB1c2VyTmFtZUNvbCkgeworICAgICAgICAKKyAgICAgICAgdGhpcy51c2VyTmFtZUNvbCA9IHVzZXJOYW1lQ29sOworICAgICAgICAKKyAgICB9CisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBkcml2ZXIuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXREcml2ZXIoKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy5kcml2ZXI7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGRyaXZlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREcml2ZXIoU3RyaW5nIGRyaXZlcikgeworICAgICAgICAKKyAgICAgICAgdGhpcy5kcml2ZXIgPSBkcml2ZXI7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHJvbGUgdGFibGUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRSb2xlVGFibGUoKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy5yb2xlVGFibGU7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHJvbGVUYWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSb2xlVGFibGUoU3RyaW5nIHJvbGVUYWJsZSkgeworICAgICAgICAKKyAgICAgICAgdGhpcy5yb2xlVGFibGUgPSByb2xlVGFibGU7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHVzZXIgdGFibGUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRVc2VyVGFibGUoKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy51c2VyVGFibGU7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHVzZXIgVGFibGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VXNlclRhYmxlKFN0cmluZyB1c2VyVGFibGUpIHsKKyAgICAgICAgCisgICAgICAgIHRoaXMudXNlclRhYmxlID0gdXNlclRhYmxlOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBwYXNzd29yZENvbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhc3N3b3JkQ29sKCkgeworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXMucGFzc3dvcmRDb2w7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHBhc3N3b3JkQ29sLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkQ29sKFN0cmluZyBwYXNzd29yZENvbCkgeworICAgICAgICAKKyAgICAgICAgdGhpcy5wYXNzd29yZENvbCA9IHBhc3N3b3JkQ29sOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjb25uZWN0aW9uIG5hbWUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDb25uZWN0aW9uTmFtZSgpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rpb25OYW1lOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjb25uZWN0aW9uTmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb25uZWN0aW9uTmFtZShTdHJpbmcgY29ubmVjdGlvbk5hbWUpIHsKKyAgICAgICAgCisgICAgICAgIHRoaXMuY29ubmVjdGlvbk5hbWUgPSBjb25uZWN0aW9uTmFtZTsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY29ubmVjdGlvbiBwYXNzd29yZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbm5lY3Rpb25QYXNzd29yZCgpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rpb25QYXNzd29yZDsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgY29ubmVjdGlvbiBwYXNzd29yZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb25uZWN0aW9uUGFzc3dvcmQoU3RyaW5nIGNvbm5lY3Rpb25QYXNzd29yZCkgeworICAgICAgICAKKyAgICAgICAgdGhpcy5jb25uZWN0aW9uUGFzc3dvcmQgPSBjb25uZWN0aW9uUGFzc3dvcmQ7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGNvbm5lY3Rpb24gVVJMLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29ubmVjdGlvblVSTCgpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rpb25VUkw7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNvbm5lY3Rpb25VUkwuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29ubmVjdGlvblVSTChTdHJpbmcgY29ubmVjdGlvblVSTCkgeworICAgICAgICAKKyAgICAgICAgdGhpcy5jb25uZWN0aW9uVVJMID0gY29ubmVjdGlvblVSTDsKKyAgICAgICAgCisgICAgfSAgICAKKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXNldCBhbGwgcHJvcGVydGllcyB0byB0aGVpciBkZWZhdWx0IHZhbHVlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBtYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVzZXQoQWN0aW9uTWFwcGluZyBtYXBwaW5nLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICAKKyAgICAgICAgc3VwZXIucmVzZXQobWFwcGluZywgcmVxdWVzdCk7ICAgCisgICAgICAgIHRoaXMuZGlnZXN0ID0gbnVsbDsKKyAgICAgICAgdGhpcy5kcml2ZXIgPSBudWxsOworICAgICAgICAKKyAgICAgICAgdGhpcy5yb2xlTmFtZUNvbCA9IG51bGw7CisgICAgICAgIHRoaXMudXNlck5hbWVDb2wgPSBudWxsOworICAgICAgICB0aGlzLnBhc3N3b3JkQ29sID0gbnVsbDsKKyAgICAgICAgdGhpcy51c2VyVGFibGUgPSBudWxsOworICAgICAgICB0aGlzLnJvbGVUYWJsZSA9IG51bGw7CisgICAgICAgIAorICAgICAgICB0aGlzLmNvbm5lY3Rpb25OYW1lID0gbnVsbDsKKyAgICAgICAgdGhpcy5jb25uZWN0aW9uUGFzc3dvcmQgPSBudWxsOworICAgICAgICB0aGlzLmNvbm5lY3Rpb25VUkwgPSBudWxsOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmVuZGVyIHRoaXMgb2JqZWN0IGFzIGEgU3RyaW5nLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiVXNlckRhdGFiYXNlUmVhbG1Gb3JtW2FkbWluQWN0aW9uPSIpOworICAgICAgICBzYi5hcHBlbmQoZ2V0QWRtaW5BY3Rpb24oKSk7CisgICAgICAgIHNiLmFwcGVuZCgiLGRpZ2VzdD0iKTsKKyAgICAgICAgc2IuYXBwZW5kKGRpZ2VzdCk7CisgICAgICAgIHNiLmFwcGVuZCgiJyxkcml2ZXI9JyIpOworICAgICAgICBzYi5hcHBlbmQoZHJpdmVyKTsKKyAgICAgICAgc2IuYXBwZW5kKCInLHJvbGVOYW1lQ29sPSIpOworICAgICAgICBzYi5hcHBlbmQocm9sZU5hbWVDb2wpOworICAgICAgICBzYi5hcHBlbmQoIicsdXNlck5hbWVDb2w9Iik7CisgICAgICAgIHNiLmFwcGVuZCh1c2VyTmFtZUNvbCk7CisgICAgICAgIHNiLmFwcGVuZCgiLHBhc3N3b3JkQ29sPSIpOworICAgICAgICBzYi5hcHBlbmQocGFzc3dvcmRDb2wpOworICAgICAgICBzYi5hcHBlbmQoIicsdXNlclRhYmxlPSciKTsKKyAgICAgICAgc2IuYXBwZW5kKHVzZXJUYWJsZSk7CisgICAgICAgIHNiLmFwcGVuZCgiJyxyb2xlVGFibGU9Iik7CisgICAgICAgIHNiLmFwcGVuZChyb2xlVGFibGUpOworICAgICAgICBzYi5hcHBlbmQoIixjb25uZWN0aW9uTmFtZT0iKTsKKyAgICAgICAgc2IuYXBwZW5kKGNvbm5lY3Rpb25OYW1lKTsgICAgICAgIAorICAgICAgICBzYi5hcHBlbmQoIicsY29ubmVjdGlvblBhc3N3b3JkPSIpOworICAgICAgICBzYi5hcHBlbmQoY29ubmVjdGlvblBhc3N3b3JkKTsKKyAgICAgICAgc2IuYXBwZW5kKCIsY29ubmVjdGlvblVSTD0iKTsKKyAgICAgICAgc2IuYXBwZW5kKGNvbm5lY3Rpb25VUkwpOworICAgICAgICBzYi5hcHBlbmQoIicsb2JqZWN0TmFtZT0nIik7CisgICAgICAgIHNiLmFwcGVuZChnZXRPYmplY3ROYW1lKCkpOworICAgICAgICBzYi5hcHBlbmQoIicscmVhbG1UeXBlPSIpOworICAgICAgICBzYi5hcHBlbmQoZ2V0UmVhbG1UeXBlKCkpOworICAgICAgICBzYi5hcHBlbmQoIl0iKTsKKyAgICAgICAgcmV0dXJuIChzYi50b1N0cmluZygpKTsKKworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBWYWxpZGF0ZSB0aGUgcHJvcGVydGllcyB0aGF0IGhhdmUgYmVlbiBzZXQgZnJvbSB0aGlzIEhUVFAgcmVxdWVzdCwKKyAgICAgKiBhbmQgcmV0dXJuIGFuIDxjb2RlPkFjdGlvbkVycm9yczwvY29kZT4gb2JqZWN0IHRoYXQgZW5jYXBzdWxhdGVzIGFueQorICAgICAqIHZhbGlkYXRpb24gZXJyb3JzIHRoYXQgaGF2ZSBiZWVuIGZvdW5kLiAgSWYgbm8gZXJyb3JzIGFyZSBmb3VuZCwgcmV0dXJuCisgICAgICogPGNvZGU+bnVsbDwvY29kZT4gb3IgYW4gPGNvZGU+QWN0aW9uRXJyb3JzPC9jb2RlPiBvYmplY3Qgd2l0aCBubworICAgICAqIHJlY29yZGVkIGVycm9yIG1lc3NhZ2VzLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIG1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgQWN0aW9uRXJyb3JzIHZhbGlkYXRlKEFjdGlvbk1hcHBpbmcgbWFwcGluZywKKyAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICAKKyAgICAgICAgQWN0aW9uRXJyb3JzIGVycm9ycyA9IG5ldyBBY3Rpb25FcnJvcnMoKTsKKyAgICAgICAgCisgICAgICAgIFN0cmluZyBzdWJtaXQgPSByZXF1ZXN0LmdldFBhcmFtZXRlcigic3VibWl0Iik7CisgICAgICAgIC8vU3RyaW5nIHR5cGUgPSByZXF1ZXN0LmdldFBhcmFtZXRlcigicmVhbG1UeXBlIik7CisgICAgICAgIAorICAgICAgICAvLyBmcm9udCBlbmQgdmFsaWRhdGlvbiB3aGVuIHNhdmUgaXMgY2xpY2tlZC4gICAgICAgIAorICAgICAgICAgLy9pZiAoc3VibWl0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAvLyB0aGUgZm9sbG93aW5nIGZpZWxkcyBhcmUgcmVxdWlyZWQuCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmICgoZHJpdmVyID09IG51bGwpIHx8IChkcml2ZXIubGVuZ3RoKCkgPCAxKSkgeworICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoImRyaXZlciIsCisgICAgICAgICAgICAgICAgbmV3IEFjdGlvbkVycm9yKCJlcnJvci5kcml2ZXIucmVxdWlyZWQiKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGlmICgocm9sZU5hbWVDb2wgPT0gbnVsbCkgfHwgKHJvbGVOYW1lQ29sLmxlbmd0aCgpIDwgMSkpIHsKKyAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKCJyb2xlTmFtZUNvbCIsCisgICAgICAgICAgICAgICAgbmV3IEFjdGlvbkVycm9yKCJlcnJvci5yb2xlTmFtZUNvbC5yZXF1aXJlZCIpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCh1c2VyTmFtZUNvbCA9PSBudWxsKSB8fCAodXNlck5hbWVDb2wubGVuZ3RoKCkgPCAxKSkgeworICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoInVzZXJOYW1lQ29sIiwKKyAgICAgICAgICAgICAgICBuZXcgQWN0aW9uRXJyb3IoImVycm9yLnVzZXJOYW1lQ29sLnJlcXVpcmVkIikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgaWYgKChwYXNzd29yZENvbCA9PSBudWxsKSB8fCAocGFzc3dvcmRDb2wubGVuZ3RoKCkgPCAxKSkgeworICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoInBhc3N3b3JkQ29sIiwKKyAgICAgICAgICAgICAgICBuZXcgQWN0aW9uRXJyb3IoImVycm9yLnBhc3N3b3JkQ29sLnJlcXVpcmVkIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoKHVzZXJUYWJsZSA9PSBudWxsKSB8fCAodXNlclRhYmxlLmxlbmd0aCgpIDwgMSkpIHsKKyAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKCJ1c2VyVGFibGUiLAorICAgICAgICAgICAgICAgIG5ldyBBY3Rpb25FcnJvcigiZXJyb3IudXNlclRhYmxlLnJlcXVpcmVkIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoKHJvbGVUYWJsZSA9PSBudWxsKSB8fCAocm9sZVRhYmxlLmxlbmd0aCgpIDwgMSkpIHsKKyAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKCJyb2xlVGFibGUiLAorICAgICAgICAgICAgICAgIG5ldyBBY3Rpb25FcnJvcigiZXJyb3Iucm9sZVRhYmxlLnJlcXVpcmVkIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoKGNvbm5lY3Rpb25OYW1lID09IG51bGwpIHx8IChjb25uZWN0aW9uTmFtZS5sZW5ndGgoKSA8IDEpKSB7CisgICAgICAgICAgICAgICAgZXJyb3JzLmFkZCgiY29ubmVjdGlvbk5hbWUiLAorICAgICAgICAgICAgICAgIG5ldyBBY3Rpb25FcnJvcigiZXJyb3IuY29ubmVjdGlvbk5hbWUucmVxdWlyZWQiKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmICgoY29ubmVjdGlvblBhc3N3b3JkID09IG51bGwpIHx8IChjb25uZWN0aW9uUGFzc3dvcmQubGVuZ3RoKCkgPCAxKSkgeworICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoImNvbm5lY3Rpb25QYXNzd29yZCIsCisgICAgICAgICAgICAgICAgbmV3IEFjdGlvbkVycm9yKCJlcnJvci5jb25uZWN0aW9uUGFzc3dvcmQucmVxdWlyZWQiKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgICBpZiAoKGNvbm5lY3Rpb25VUkwgPT0gbnVsbCkgfHwgKGNvbm5lY3Rpb25VUkwubGVuZ3RoKCkgPCAxKSkgeworICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoImNvbm5lY3Rpb25VUkwiLAorICAgICAgICAgICAgICAgIG5ldyBBY3Rpb25FcnJvcigiZXJyb3IuY29ubmVjdGlvblVSTC5yZXF1aXJlZCIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgLy99CisgICAgICAgICAgICAgICAgIAorICAgICAgICByZXR1cm4gZXJyb3JzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZWFsbS9KTkRJUmVhbG1Gb3JtLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVhbG0vSk5ESVJlYWxtRm9ybS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlYjVmNjUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVhbG0vSk5ESVJlYWxtRm9ybS5qYXZhCkBAIC0wLDAgKzEsNTk4IEBACisvKgorICogQ29weXJpZ2h0IDIwMDEsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVhbG07CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25FcnJvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRXJyb3JzOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uQXBwbGljYXRpb25TZXJ2bGV0OworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkxhYmVsVmFsdWVCZWFuOworCisvKioKKyAqIEZvcm0gYmVhbiBmb3IgdGhlIEpOREkgcmVhbG0gcGFnZS4KKyAqCisgKiBAYXV0aG9yIE1hbnZlZW4gS2F1cgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgSk5ESVJlYWxtRm9ybSBleHRlbmRzIFJlYWxtRm9ybSB7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciB0aGUgY29ubmVjdGlvbiB1c2VyIG5hbWUuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgY29ubmVjdGlvbk5hbWUgPSBudWxsOworCisgICAgLyoqCisgICAgICogVGhlIHRleHQgZm9yIHRoZSBjb25uZWN0aW9uIFBhc3N3b3JkLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGNvbm5lY3Rpb25QYXNzd29yZCA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdGV4dCBmb3IgdGhlIGNvbm5lY3Rpb24gVVJMLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGNvbm5lY3Rpb25VUkwgPSBudWxsOworCisgICAgLyoqCisgICAgICogVGhlIHRleHQgZm9yIHRoZSBjb250ZXh0IEZhY3RvcnkuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgY29udGV4dEZhY3RvcnkgPSBudWxsOworCisgICAgLyoqCisgICAgICogVGhlIHRleHQgZm9yIHRoZSBkaWdlc3QgYWxnb3JpdGhtLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGRpZ2VzdCA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdGV4dCBmb3IgdGhlIHJvbGUgQmFzZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyByb2xlQmFzZSA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdGV4dCBmb3IgdGhlIHJvbGUgbmFtZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyByb2xlTmFtZSA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdGV4dCBmb3IgdGhlIHJvbGUgUGF0dGVybi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyByb2xlUGF0dGVybiA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBTaG91bGQgd2Ugc2VhcmNoIHRoZSBlbnRpcmUgc3VidHJlZSBmb3IgbWF0Y2hpbmcgcm9sZXM/CisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcm9sZVN1YnRyZWUgPSAiZmFsc2UiOworCisgICAgLyoqCisgICAgICogVGhlIHRleHQgZm9yIHRoZSB1c2VyIEJhc2UuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgdXNlckJhc2UgPSBudWxsOworCisgICAgLyoqCisgICAgICogVGhlIHRleHQgZm9yIHRoZSB1c2VyIFBhc3N3b3JkLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHVzZXJQYXNzd29yZCA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdGV4dCBmb3IgdGhlIHVzZXIgUGF0dGVybi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyB1c2VyUGF0dGVybiA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdGV4dCBmb3IgdGhlIHVzZXIgcm9sZSBuYW1lLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHVzZXJSb2xlTmFtZSA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdGV4dCBmb3IgdGhlIHVzZXIgU2VhcmNoLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHVzZXJTZWFyY2ggPSBudWxsOworCisgICAgLyoqCisgICAgICogU2hvdWxkIHdlIHNlYXJjaCB0aGUgZW50aXJlIHN1YnRyZWUgZm9yIG1hdGNoaW5nIHVzZXJzPworICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHVzZXJTdWJ0cmVlID0gImZhbHNlIjsKKworICAgIC8qKgorICAgICAqIFNldCBvZiB2YWxpZCB2YWx1ZXMgZm9yIHNlYXJjaCBzdWJ0cmVlcyh0cnVlL2ZhbHNlKS4KKyAgICAgKi8KKyAgICBwcml2YXRlIExpc3Qgc2VhcmNoVmFscyA9IG51bGw7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZWFyY2ggVmFscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdCBnZXRTZWFyY2hWYWxzKCkgeworCisgICAgICAgIHJldHVybiB0aGlzLnNlYXJjaFZhbHM7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHNlYXJjaCBWYWxzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNlYXJjaFZhbHMoTGlzdCBzZWFyY2hWYWxzKSB7CisKKyAgICAgICAgdGhpcy5zZWFyY2hWYWxzID0gc2VhcmNoVmFsczsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcm9sZVN1YnRyZWUgYm9vbGVhbiBUZXh0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Um9sZVN1YnRyZWUoKSB7CisKKyAgICAgICAgcmV0dXJuIHRoaXMucm9sZVN1YnRyZWU7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHJvbGVTdWJ0cmVlIFRleHQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Um9sZVN1YnRyZWUoU3RyaW5nIHJvbGVTdWJ0cmVlKSB7CisKKyAgICAgICAgdGhpcy5yb2xlU3VidHJlZSA9IHJvbGVTdWJ0cmVlOworCisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB1c2VyU3VidHJlZSBib29sZWFuIFRleHQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRVc2VyU3VidHJlZSgpIHsKKworICAgICAgICByZXR1cm4gdGhpcy51c2VyU3VidHJlZTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdXNlclN1YnRyZWUgVGV4dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVc2VyU3VidHJlZShTdHJpbmcgdXNlclN1YnRyZWUpIHsKKworICAgICAgICB0aGlzLnVzZXJTdWJ0cmVlID0gdXNlclN1YnRyZWU7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGRpZ2VzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldERpZ2VzdCgpIHsKKworICAgICAgICByZXR1cm4gdGhpcy5kaWdlc3Q7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGRpZ2VzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREaWdlc3QoU3RyaW5nIGRpZ2VzdCkgeworCisgICAgICAgIHRoaXMuZGlnZXN0ID0gZGlnZXN0OworCisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSByb2xlQmFzZSAuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRSb2xlQmFzZSgpIHsKKworICAgICAgICByZXR1cm4gdGhpcy5yb2xlQmFzZSA7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHJvbGVCYXNlIC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSb2xlQmFzZShTdHJpbmcgcm9sZUJhc2UgKSB7CisKKyAgICAgICAgdGhpcy5yb2xlQmFzZSAgPSByb2xlQmFzZSA7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHJvbGUgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFJvbGVOYW1lKCkgeworCisgICAgICAgIHJldHVybiB0aGlzLnJvbGVOYW1lIDsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcm9sZSBuYW1lIEF0dHJpYnV0ZSAuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Um9sZU5hbWUoU3RyaW5nIHJvbGVOYW1lKSB7CisKKyAgICAgICAgdGhpcy5yb2xlTmFtZSAgPSByb2xlTmFtZSA7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHVzZXJCYXNlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXNlckJhc2UoKSB7CisKKyAgICAgICAgcmV0dXJuIHRoaXMudXNlckJhc2UgOworCisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSB1c2VyQmFzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVc2VyQmFzZShTdHJpbmcgdXNlckJhc2UgKSB7CisKKyAgICAgICAgdGhpcy51c2VyQmFzZSAgPSB1c2VyQmFzZSA7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHVzZXIgcm9sZSBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXNlclJvbGVOYW1lKCkgeworCisgICAgICAgIHJldHVybiB0aGlzLnVzZXJSb2xlTmFtZSA7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHVzZXIgcm9sZSBuYW1lIEF0dHJpYnV0ZSAuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VXNlclJvbGVOYW1lKFN0cmluZyB1c2VyUm9sZU5hbWUpIHsKKworICAgICAgICB0aGlzLnVzZXJSb2xlTmFtZSAgPSB1c2VyUm9sZU5hbWUgOworCisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSByb2xlIFBhdHRlcm4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFJvbGVQYXR0ZXJuKCkgeworCisgICAgICAgIHJldHVybiB0aGlzLnJvbGVQYXR0ZXJuIDsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcm9sZSBQYXR0ZXJuLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJvbGVQYXR0ZXJuKFN0cmluZyByb2xlUGF0dGVybiApIHsKKworICAgICAgICB0aGlzLnJvbGVQYXR0ZXJuICA9IHJvbGVQYXR0ZXJuIDsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdXNlciBQYXNzd29yZCAuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRVc2VyUGFzc3dvcmQoKSB7CisKKyAgICAgICAgcmV0dXJuIHRoaXMudXNlclBhc3N3b3JkIDsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdXNlciBQYXNzd29yZCAuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VXNlclBhc3N3b3JkKFN0cmluZyB1c2VyUGFzc3dvcmQgKSB7CisKKyAgICAgICAgdGhpcy51c2VyUGFzc3dvcmQgID0gdXNlclBhc3N3b3JkIDsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB1c2VyIFBhdHRlcm4gLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXNlclBhdHRlcm4oKSB7CisKKyAgICAgICAgcmV0dXJuIHRoaXMudXNlclBhdHRlcm4gIDsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdXNlciB1c2VyIFBhdHRlcm4gIC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVc2VyUGF0dGVybihTdHJpbmcgdXNlclBhdHRlcm4pIHsKKworICAgICAgICB0aGlzLnVzZXJQYXR0ZXJuICAgPSB1c2VyUGF0dGVybiAgOworCisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB1c2VyIFNlYXJjaC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFVzZXJTZWFyY2goKSB7CisKKyAgICAgICAgcmV0dXJuIHRoaXMudXNlclNlYXJjaDsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdXNlciB1c2VyIFNlYXJjaC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVc2VyU2VhcmNoKFN0cmluZyB1c2VyU2VhcmNoKSB7CisKKyAgICAgICAgdGhpcy51c2VyU2VhcmNoICA9IHVzZXJTZWFyY2g7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGNvbm5lY3Rpb24gbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbm5lY3Rpb25OYW1lKCkgeworCisgICAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rpb25OYW1lOworCisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjb25uZWN0aW9uTmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb25uZWN0aW9uTmFtZShTdHJpbmcgY29ubmVjdGlvbk5hbWUpIHsKKworICAgICAgICB0aGlzLmNvbm5lY3Rpb25OYW1lID0gY29ubmVjdGlvbk5hbWU7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY29ubmVjdGlvbiBwYXNzd29yZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbm5lY3Rpb25QYXNzd29yZCgpIHsKKworICAgICAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uUGFzc3dvcmQ7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNvbm5lY3Rpb24gcGFzc3dvcmQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29ubmVjdGlvblBhc3N3b3JkKFN0cmluZyBjb25uZWN0aW9uUGFzc3dvcmQpIHsKKworICAgICAgICB0aGlzLmNvbm5lY3Rpb25QYXNzd29yZCA9IGNvbm5lY3Rpb25QYXNzd29yZDsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjb25uZWN0aW9uIFVSTC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbm5lY3Rpb25VUkwoKSB7CisKKyAgICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvblVSTDsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY29ubmVjdGlvblVSTC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb25uZWN0aW9uVVJMKFN0cmluZyBjb25uZWN0aW9uVVJMKSB7CisKKyAgICAgICAgdGhpcy5jb25uZWN0aW9uVVJMID0gY29ubmVjdGlvblVSTDsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY29udGV4dCBGYWN0b3J5IC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRleHRGYWN0b3J5KCkgeworCisgICAgICAgIHJldHVybiB0aGlzLmNvbnRleHRGYWN0b3J5IDsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY29udGV4dCBGYWN0b3J5IC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb250ZXh0RmFjdG9yeShTdHJpbmcgY29udGV4dEZhY3RvcnkgKSB7CisKKyAgICAgICAgdGhpcy5jb250ZXh0RmFjdG9yeSAgPSBjb250ZXh0RmFjdG9yeSA7CisKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworICAgIC8qKgorICAgICAqIFJlc2V0IGFsbCBwcm9wZXJ0aWVzIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIG1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZXNldChBY3Rpb25NYXBwaW5nIG1hcHBpbmcsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisKKyAgICAgICAgc3VwZXIucmVzZXQobWFwcGluZywgcmVxdWVzdCk7CisgICAgICAgIHRoaXMucm9sZVN1YnRyZWU9ImZhbHNlIjsKKyAgICAgICAgdGhpcy51c2VyU3VidHJlZT0iZmFsc2UiOworCisgICAgICAgIHRoaXMuZGlnZXN0ID0gbnVsbDsKKyAgICAgICAgdGhpcy5yb2xlTmFtZSA9IG51bGw7CisgICAgICAgIHRoaXMudXNlclJvbGVOYW1lID0gbnVsbDsKKworICAgICAgICB0aGlzLmNvbm5lY3Rpb25OYW1lID0gbnVsbDsKKyAgICAgICAgdGhpcy5jb25uZWN0aW9uUGFzc3dvcmQgPSBudWxsOworICAgICAgICB0aGlzLmNvbm5lY3Rpb25VUkwgPSBudWxsOworCisgICAgICAgIHRoaXMucm9sZVBhdHRlcm4gPSBudWxsOworICAgICAgICB0aGlzLnJvbGVCYXNlID0gbnVsbDsKKyAgICAgICAgdGhpcy51c2VyQmFzZSA9IG51bGw7CisgICAgICAgIHRoaXMudXNlclBhc3N3b3JkID0gbnVsbDsKKyAgICAgICAgdGhpcy51c2VyUGF0dGVybiA9IG51bGw7CisgICAgICAgIHRoaXMudXNlclNlYXJjaCA9IG51bGw7CisgICAgICAgIHRoaXMuY29udGV4dEZhY3RvcnkgPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbmRlciB0aGlzIG9iamVjdCBhcyBhIFN0cmluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIlVzZXJEYXRhYmFzZVJlYWxtRm9ybVthZG1pbkFjdGlvbj0iKTsKKyAgICAgICAgc2IuYXBwZW5kKGdldEFkbWluQWN0aW9uKCkpOworICAgICAgICBzYi5hcHBlbmQoIix1c2VyU3VidHJlZT0iKTsKKyAgICAgICAgc2IuYXBwZW5kKHVzZXJTdWJ0cmVlKTsKKyAgICAgICAgc2IuYXBwZW5kKCIscm9sZVN1YnRyZWU9Iik7CisgICAgICAgIHNiLmFwcGVuZChyb2xlU3VidHJlZSk7CisgICAgICAgIHNiLmFwcGVuZCgiLGRpZ2VzdD0iKTsKKyAgICAgICAgc2IuYXBwZW5kKGRpZ2VzdCk7CisgICAgICAgIHNiLmFwcGVuZCgiJyx1c2VyUm9sZU5hbWU9JyIpOworICAgICAgICBzYi5hcHBlbmQodXNlclJvbGVOYW1lKTsKKyAgICAgICAgc2IuYXBwZW5kKCInLHJvbGVOYW1lPSciKTsKKyAgICAgICAgc2IuYXBwZW5kKHJvbGVOYW1lKTsKKyAgICAgICAgc2IuYXBwZW5kKCInLGNvbm5lY3Rpb25OYW1lPSIpOworICAgICAgICBzYi5hcHBlbmQoY29ubmVjdGlvbk5hbWUpOworICAgICAgICBzYi5hcHBlbmQoIixjb25uZWN0aW9uUGFzc3dvcmQ9Iik7CisgICAgICAgIHNiLmFwcGVuZChjb25uZWN0aW9uUGFzc3dvcmQpOworICAgICAgICBzYi5hcHBlbmQoIicsY29ubmVjdGlvblVSTD0nIik7CisgICAgICAgIHNiLmFwcGVuZChjb25uZWN0aW9uVVJMKTsKKyAgICAgICAgc2IuYXBwZW5kKCInLHJvbGVQYXR0ZXJuPSIpOworICAgICAgICBzYi5hcHBlbmQocm9sZVBhdHRlcm4pOworICAgICAgICBzYi5hcHBlbmQoIixyb2xlQmFzZT0iKTsKKyAgICAgICAgc2IuYXBwZW5kKHJvbGVCYXNlKTsKKyAgICAgICAgc2IuYXBwZW5kKCInLHVzZXJQYXNzd29yZD0nIik7CisgICAgICAgIHNiLmFwcGVuZCh1c2VyUGFzc3dvcmQpOworICAgICAgICBzYi5hcHBlbmQoIix1c2VyQmFzZT0iKTsKKyAgICAgICAgc2IuYXBwZW5kKHVzZXJCYXNlKTsKKyAgICAgICAgc2IuYXBwZW5kKCInLHVzZXJQYXR0ZXJuPSIpOworICAgICAgICBzYi5hcHBlbmQodXNlclBhdHRlcm4pOworICAgICAgICBzYi5hcHBlbmQoIicsdXNlclNlYXJjaD0iKTsKKyAgICAgICAgc2IuYXBwZW5kKHVzZXJTZWFyY2gpOworICAgICAgICBzYi5hcHBlbmQoIixjb250ZXh0RmFjdG9yeT0iKTsKKyAgICAgICAgc2IuYXBwZW5kKGNvbnRleHRGYWN0b3J5KTsKKyAgICAgICAgc2IuYXBwZW5kKCInLG9iamVjdE5hbWU9JyIpOworICAgICAgICBzYi5hcHBlbmQoZ2V0T2JqZWN0TmFtZSgpKTsKKyAgICAgICAgc2IuYXBwZW5kKCInLHJlYWxtVHlwZT0iKTsKKyAgICAgICAgc2IuYXBwZW5kKGdldFJlYWxtVHlwZSgpKTsKKyAgICAgICAgc2IuYXBwZW5kKCJdIik7CisgICAgICAgIHJldHVybiAoc2IudG9TdHJpbmcoKSk7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWYWxpZGF0ZSB0aGUgcHJvcGVydGllcyB0aGF0IGhhdmUgYmVlbiBzZXQgZnJvbSB0aGlzIEhUVFAgcmVxdWVzdCwKKyAgICAgKiBhbmQgcmV0dXJuIGFuIDxjb2RlPkFjdGlvbkVycm9yczwvY29kZT4gb2JqZWN0IHRoYXQgZW5jYXBzdWxhdGVzIGFueQorICAgICAqIHZhbGlkYXRpb24gZXJyb3JzIHRoYXQgaGF2ZSBiZWVuIGZvdW5kLiAgSWYgbm8gZXJyb3JzIGFyZSBmb3VuZCwgcmV0dXJuCisgICAgICogPGNvZGU+bnVsbDwvY29kZT4gb3IgYW4gPGNvZGU+QWN0aW9uRXJyb3JzPC9jb2RlPiBvYmplY3Qgd2l0aCBubworICAgICAqIHJlY29yZGVkIGVycm9yIG1lc3NhZ2VzLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIG1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKi8KKworICAgIHB1YmxpYyBBY3Rpb25FcnJvcnMgdmFsaWRhdGUoQWN0aW9uTWFwcGluZyBtYXBwaW5nLAorICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisKKyAgICAgICAgQWN0aW9uRXJyb3JzIGVycm9ycyA9IG5ldyBBY3Rpb25FcnJvcnMoKTsKKworICAgICAgICBTdHJpbmcgc3VibWl0ID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoInN1Ym1pdCIpOworCisgICAgICAgIC8vIGZyb250IGVuZCB2YWxpZGF0aW9uIHdoZW4gc2F2ZSBpcyBjbGlja2VkLgorICAgICAgICAvL2lmIChzdWJtaXQgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gdGhlIGZvbGxvd2luZyBmaWVsZHMgYXJlIHJlcXVpcmVkLgorCisgICAgICAgICAgICBpZiAoKGNvbm5lY3Rpb25VUkwgPT0gbnVsbCkgfHwgKGNvbm5lY3Rpb25VUkwubGVuZ3RoKCkgPCAxKSkgeworICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoImNvbm5lY3Rpb25VUkwiLAorICAgICAgICAgICAgICAgIG5ldyBBY3Rpb25FcnJvcigiZXJyb3IuY29ublVSTC5yZXF1aXJlZCIpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gRWl0aGVyIHVzZXJQYXR0ZXJuIG9yIHVzZXJTZWFyY2ggc2hvdWxkIGJlIHNwZWNpZmllZCBub3QgYm90aAorICAgICAgICAgICAgYm9vbGVhbiBpc1VzZXJQYXR0ZXJuU3BlY2lmaWVkID0gZmFsc2U7CisgICAgICAgICAgICBib29sZWFuIGlzVXNlclNlYXJjaFNwZWNpZmllZCA9IGZhbHNlOworICAgICAgICAgICAgaWYgKCh1c2VyUGF0dGVybiAhPSBudWxsKSAmJiAodXNlclBhdHRlcm4ubGVuZ3RoKCkgPiAwKSkgeworICAgICAgICAgICAgICAgIGlzVXNlclBhdHRlcm5TcGVjaWZpZWQgPSB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKHVzZXJTZWFyY2ggIT0gbnVsbCkgJiYgKHVzZXJTZWFyY2gubGVuZ3RoKCkgPiAwKSkgeworICAgICAgICAgICAgICAgIGlzVXNlclNlYXJjaFNwZWNpZmllZCA9IHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChpc1VzZXJQYXR0ZXJuU3BlY2lmaWVkICYmIGlzVXNlclNlYXJjaFNwZWNpZmllZCkgeworICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoInVzZXJQYXR0ZXJuIiAsCisgICAgICAgICAgICAgICAgbmV3IEFjdGlvbkVycm9yKCJlcnJvci51c2VyUGF0dGVybi51c2VyU2VhcmNoLmRlZmluZWQiKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qaWYgKChkaWdlc3QgPT0gbnVsbCkgfHwgKGRpZ2VzdC5sZW5ndGgoKSA8IDEpKSB7CisgICAgICAgICAgICAgICAgZXJyb3JzLmFkZCgiZGlnZXN0IiwKKyAgICAgICAgICAgICAgICBuZXcgQWN0aW9uRXJyb3IoImVycm9yLmRpZ2VzdC5yZXF1aXJlZCIpKTsKKyAgICAgICAgICAgIH0gKi8KKworICAgICAgICAgICAgLyppZiAoKHJvbGVOYW1lID09IG51bGwpIHx8IChyb2xlTmFtZS5sZW5ndGgoKSA8IDEpKSB7CisgICAgICAgICAgICAgICAgZXJyb3JzLmFkZCgicm9sZU5hbWUiLAorICAgICAgICAgICAgICAgIG5ldyBBY3Rpb25FcnJvcigiZXJyb3Iucm9sZU5hbWUucmVxdWlyZWQiKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgodXNlclJvbGVOYW1lID09IG51bGwpIHx8ICh1c2VyUm9sZU5hbWUubGVuZ3RoKCkgPCAxKSkgeworICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoInVzZXJSb2xlTmFtZSIsCisgICAgICAgICAgICAgICAgbmV3IEFjdGlvbkVycm9yKCJlcnJvci51c2VyUm9sZU5hbWUucmVxdWlyZWQiKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgocm9sZVBhdHRlcm4gPT0gbnVsbCkgfHwgKHJvbGVQYXR0ZXJuLmxlbmd0aCgpIDwgMSkpIHsKKyAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKCJyb2xlUGF0dGVybiIsCisgICAgICAgICAgICAgICAgbmV3IEFjdGlvbkVycm9yKCJlcnJvci5yb2xlUGF0dGVybi5yZXF1aXJlZCIpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChyb2xlQmFzZSA9PSBudWxsKSB8fCAocm9sZUJhc2UubGVuZ3RoKCkgPCAxKSkgeworICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoInJvbGVCYXNlIiwKKyAgICAgICAgICAgICAgICBuZXcgQWN0aW9uRXJyb3IoImVycm9yLnJvbGVCYXNlLnJlcXVpcmVkIikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKHVzZXJCYXNlID09IG51bGwpIHx8ICh1c2VyQmFzZS5sZW5ndGgoKSA8IDEpKSB7CisgICAgICAgICAgICAgICAgZXJyb3JzLmFkZCgidXNlckJhc2UiLAorICAgICAgICAgICAgICAgIG5ldyBBY3Rpb25FcnJvcigiZXJyb3IudXNlckJhc2UucmVxdWlyZWQiKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgodXNlclBhc3N3b3JkID09IG51bGwpIHx8ICh1c2VyUGFzc3dvcmQubGVuZ3RoKCkgPCAxKSkgeworICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoInVzZXJQYXNzd29yZCIsCisgICAgICAgICAgICAgICAgbmV3IEFjdGlvbkVycm9yKCJlcnJvci51c2VyUGFzc3dvcmQucmVxdWlyZWQiKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgodXNlclBhdHRlcm4gPT0gbnVsbCkgfHwgKHVzZXJQYXR0ZXJuLmxlbmd0aCgpIDwgMSkpIHsKKyAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKCJ1c2VyUGF0dGVybiIsCisgICAgICAgICAgICAgICAgbmV3IEFjdGlvbkVycm9yKCJlcnJvci51c2VyUGF0dGVybi5yZXF1aXJlZCIpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCh1c2VyU2VhcmNoID09IG51bGwpIHx8ICh1c2VyU2VhcmNoLmxlbmd0aCgpIDwgMSkpIHsKKyAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKCJ1c2VyU2VhcmNoIiwKKyAgICAgICAgICAgICAgICBuZXcgQWN0aW9uRXJyb3IoImVycm9yLnVzZXJTZWFyY2gucmVxdWlyZWQiKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgoY29ubmVjdGlvbk5hbWUgPT0gbnVsbCkgfHwgKGNvbm5lY3Rpb25OYW1lLmxlbmd0aCgpIDwgMSkpIHsKKyAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKCJjb25uZWN0aW9uTmFtZSIsCisgICAgICAgICAgICAgICAgbmV3IEFjdGlvbkVycm9yKCJlcnJvci5jb25uTmFtZS5yZXF1aXJlZCIpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChjb25uZWN0aW9uUGFzc3dvcmQgPT0gbnVsbCkgfHwgKGNvbm5lY3Rpb25QYXNzd29yZC5sZW5ndGgoKSA8IDEpKSB7CisgICAgICAgICAgICAgICAgZXJyb3JzLmFkZCgiY29ubmVjdGlvblBhc3N3b3JkIiwKKyAgICAgICAgICAgICAgICBuZXcgQWN0aW9uRXJyb3IoImVycm9yLmNvbm5QYXNzd29yZC5yZXF1aXJlZCIpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChjb250ZXh0RmFjdG9yeSA9PSBudWxsKSB8fCAoY29udGV4dEZhY3RvcnkubGVuZ3RoKCkgPCAxKSkgeworICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoImNvbnRleHRGYWN0b3J5IiwKKyAgICAgICAgICAgICAgICBuZXcgQWN0aW9uRXJyb3IoImVycm9yLmNvbnRleHRGYWN0b3J5LnJlcXVpcmVkIikpOworICAgICAgICAgICAgfSAqLworICAgICAgICAvL30KKworICAgICAgICByZXR1cm4gZXJyb3JzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZWFsbS9NZW1vcnlSZWFsbUZvcm0uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZWFsbS9NZW1vcnlSZWFsbUZvcm0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWI3MDEwCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3JlYWxtL01lbW9yeVJlYWxtRm9ybS5qYXZhCkBAIC0wLDAgKzEsMTI2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDEsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVhbG07CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25FcnJvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRXJyb3JzOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkFwcGxpY2F0aW9uU2VydmxldDsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5MYWJlbFZhbHVlQmVhbjsKKworLyoqCisgKiBGb3JtIGJlYW4gZm9yIHRoZSBtZW1vcnkgcmVhbG0gcGFnZS4KKyAqCisgKiBAYXV0aG9yIE1hbnZlZW4gS2F1cgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgTWVtb3J5UmVhbG1Gb3JtIGV4dGVuZHMgUmVhbG1Gb3JtIHsKKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKyAgICAgICAgCisgICAgLyoqCisgICAgICogVGhlIHRleHQgZm9yIHRoZSBwYXRoIE5hbWUuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcGF0aE5hbWUgPSBudWxsOworICAgICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworICAgICAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHBhdGggTmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhdGhOYW1lKCkgeworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXMucGF0aE5hbWU7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHBhdGggTmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXRoTmFtZShTdHJpbmcgcGF0aE5hbWUpIHsKKyAgICAgICAgCisgICAgICAgIHRoaXMucGF0aE5hbWUgPSBwYXRoTmFtZTsKKyAgICAgICAgCisgICAgfQorICAgICAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXNldCBhbGwgcHJvcGVydGllcyB0byB0aGVpciBkZWZhdWx0IHZhbHVlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBtYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVzZXQoQWN0aW9uTWFwcGluZyBtYXBwaW5nLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworICAgCisgICAgICAgIHN1cGVyLnJlc2V0KG1hcHBpbmcsIHJlcXVlc3QpOworICAgICAgICB0aGlzLnBhdGhOYW1lID0gbnVsbDsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgLyoqCisgICAgICogUmVuZGVyIHRoaXMgb2JqZWN0IGFzIGEgU3RyaW5nLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiVXNlckRhdGFiYXNlUmVhbG1Gb3JtW2FkbWluQWN0aW9uPSIpOworICAgICAgICBzYi5hcHBlbmQoZ2V0QWRtaW5BY3Rpb24oKSk7CisgICAgICAgIHNiLmFwcGVuZCgiLHBhdGhuYW1lPSIpOworICAgICAgICBzYi5hcHBlbmQocGF0aE5hbWUpOworICAgICAgICBzYi5hcHBlbmQoIicsb2JqZWN0TmFtZT0nIik7CisgICAgICAgIHNiLmFwcGVuZChnZXRPYmplY3ROYW1lKCkpOworICAgICAgICBzYi5hcHBlbmQoIicscmVhbG1UeXBlPSIpOworICAgICAgICBzYi5hcHBlbmQoZ2V0UmVhbG1UeXBlKCkpOworICAgICAgICBzYi5hcHBlbmQoIl0iKTsKKyAgICAgICAgcmV0dXJuIChzYi50b1N0cmluZygpKTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFZhbGlkYXRlIHRoZSBwcm9wZXJ0aWVzIHRoYXQgaGF2ZSBiZWVuIHNldCBmcm9tIHRoaXMgSFRUUCByZXF1ZXN0LAorICAgICAqIGFuZCByZXR1cm4gYW4gPGNvZGU+QWN0aW9uRXJyb3JzPC9jb2RlPiBvYmplY3QgdGhhdCBlbmNhcHN1bGF0ZXMgYW55CisgICAgICogdmFsaWRhdGlvbiBlcnJvcnMgdGhhdCBoYXZlIGJlZW4gZm91bmQuICBJZiBubyBlcnJvcnMgYXJlIGZvdW5kLCByZXR1cm4KKyAgICAgKiA8Y29kZT5udWxsPC9jb2RlPiBvciBhbiA8Y29kZT5BY3Rpb25FcnJvcnM8L2NvZGU+IG9iamVjdCB3aXRoIG5vCisgICAgICogcmVjb3JkZWQgZXJyb3IgbWVzc2FnZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgbWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqLworICAgIAorICAgIHB1YmxpYyBBY3Rpb25FcnJvcnMgdmFsaWRhdGUoQWN0aW9uTWFwcGluZyBtYXBwaW5nLAorICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgIAorICAgICAgICBBY3Rpb25FcnJvcnMgZXJyb3JzID0gbmV3IEFjdGlvbkVycm9ycygpOworCisgICAgICAgIFN0cmluZyBzdWJtaXQgPSByZXF1ZXN0LmdldFBhcmFtZXRlcigic3VibWl0Iik7CisgICAgICAgIAorICAgICAgICAvLyBmcm9udCBlbmQgdmFsaWRhdGlvbiB3aGVuIHNhdmUgaXMgY2xpY2tlZC4KKyAgICAgICAgLy9pZiAoc3VibWl0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmICgocGF0aE5hbWUgPT0gbnVsbCkgfHwgKHBhdGhOYW1lLmxlbmd0aCgpPDEpKSB7CisgICAgICAgICAgICAgICAgZXJyb3JzLmFkZCgicGF0aE5hbWUiLAorICAgICAgICAgICAgICAgIG5ldyBBY3Rpb25FcnJvcigiZXJyb3IucGF0aE5hbWUucmVxdWlyZWQiKSk7CisgICAgICAgICAgICB9CisgICAgICAgIC8vfSAgICAgICAgCisgICAgICAgIHJldHVybiBlcnJvcnM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3JlYWxtL1JlYWxtRm9ybS5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3JlYWxtL1JlYWxtRm9ybS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxNWZlNzUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVhbG0vUmVhbG1Gb3JtLmphdmEKQEAgLTAsMCArMSwyMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5yZWFsbTsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkVycm9yOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25FcnJvcnM7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CitpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5BcHBsaWNhdGlvblNlcnZsZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uTGFiZWxWYWx1ZUJlYW47CisKKy8qKgorICogRm9ybSBiZWFuIGZvciB0aGUgZ2VuZXJpYyByZWFsbSBwYWdlLgorICoKKyAqIEBhdXRob3IgTWFudmVlbiBLYXVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBSZWFsbUZvcm0gZXh0ZW5kcyBBY3Rpb25Gb3JtIHsKKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKyAgICAKKyAgIC8qKgorICAgICAqIFRoZSBhZG1pbmlzdHJhdGl2ZSBhY3Rpb24gcmVwcmVzZW50ZWQgYnkgdGhpcyBmb3JtLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGFkbWluQWN0aW9uID0gIkVkaXQiOworCisgICAgLyoqCisgICAgICogVGhlIG9iamVjdCBuYW1lIG9mIHRoZSByZWFsbSB0aGlzIGJlYW4gcmVmZXJzIHRvLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIG9iamVjdE5hbWUgPSBudWxsOworICAgIAorICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciB0aGUgcmVhbG0gdHlwZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyByZWFsbVR5cGUgPSBudWxsOworICAgICAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgdGV4dCBmb3IgdGhlIG5vZGUgbGFiZWwuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbm9kZUxhYmVsID0gbnVsbDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgb2JqZWN0IG5hbWUgb2YgdGhlIHBhcmVudCBvZiB0aGlzIHJlYWxtLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHBhcmVudE9iamVjdE5hbWUgPSBudWxsOworICAgICAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgb2YgdmFsaWQgdmFsdWVzIGZvciByZWFsbXMuCisgICAgICovCisgICAgcHJpdmF0ZSBMaXN0IHJlYWxtVHlwZVZhbHMgPSBudWxsOworCisgICAgLyoqCisgICAgICogVGhlIHRleHQgZm9yIHdoZXRoZXIgImRlbGV0ZSB0aGlzIHJlYWxtIiBvcGVyYXRpb24gaXMgYWxsb3dlZAorICAgICAqIG9uIHRoZSByZWFsbSBvciBub3QuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgYWxsb3dEZWxldGlvbiA9IG51bGw7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBhZG1pbmlzdHJhdGl2ZSBhY3Rpb24gcmVwcmVzZW50ZWQgYnkgdGhpcyBmb3JtLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWRtaW5BY3Rpb24oKSB7CisKKyAgICAgICAgcmV0dXJuIHRoaXMuYWRtaW5BY3Rpb247CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGFkbWluaXN0cmF0aXZlIGFjdGlvbiByZXByZXNlbnRlZCBieSB0aGlzIGZvcm0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QWRtaW5BY3Rpb24oU3RyaW5nIGFkbWluQWN0aW9uKSB7CisKKyAgICAgICAgdGhpcy5hZG1pbkFjdGlvbiA9IGFkbWluQWN0aW9uOworCisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBPYmplY3QgTmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE9iamVjdE5hbWUoKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy5vYmplY3ROYW1lOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBPYmplY3QgTmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPYmplY3ROYW1lKFN0cmluZyBvYmplY3ROYW1lKSB7CisgICAgICAgIAorICAgICAgICB0aGlzLm9iamVjdE5hbWUgPSBvYmplY3ROYW1lOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSByZWFsbSB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVhbG1UeXBlKCkgeworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXMucmVhbG1UeXBlOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSByZWFsbSB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlYWxtVHlwZShTdHJpbmcgcmVhbG1UeXBlKSB7CisgICAgICAgIAorICAgICAgICB0aGlzLnJlYWxtVHlwZSA9IHJlYWxtVHlwZTsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbGFiZWwgb2YgdGhlIG5vZGUgdGhhdCB3YXMgY2xpY2tlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5vZGVMYWJlbCgpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLm5vZGVMYWJlbDsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgbm9kZSBsYWJlbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXROb2RlTGFiZWwoU3RyaW5nIG5vZGVMYWJlbCkgeworICAgICAgICAKKyAgICAgICAgdGhpcy5ub2RlTGFiZWwgPSBub2RlTGFiZWw7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHBhcmVudCBvYmplY3QgbmFtZSBvZiB0aGUgcmVhbG0gdGhpcyBiZWFuIHJlZmVycyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhcmVudE9iamVjdE5hbWUoKSB7CisKKyAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50T2JqZWN0TmFtZTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBwYXJlbnQgb2JqZWN0IG5hbWUgb2YgdGhlIHJlYWxtIHRoaXMgYmVhbiByZWZlcnMgdG8uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGFyZW50T2JqZWN0TmFtZShTdHJpbmcgcGFyZW50T2JqZWN0TmFtZSkgeworCisgICAgICAgIHRoaXMucGFyZW50T2JqZWN0TmFtZSA9IHBhcmVudE9iamVjdE5hbWU7CisKKyAgICB9CisgICAgCisgICAgICAgIAorICAgLyoqCisgICAgICogUmV0dXJuIHRoZSByZWFsbVR5cGVWYWxzLgorICAgICAqLworICAgIHB1YmxpYyBMaXN0IGdldFJlYWxtVHlwZVZhbHMoKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy5yZWFsbVR5cGVWYWxzOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSByZWFsbVR5cGVWYWxzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlYWxtVHlwZVZhbHMoTGlzdCByZWFsbVR5cGVWYWxzKSB7CisgICAgICAgIAorICAgICAgICB0aGlzLnJlYWxtVHlwZVZhbHMgPSByZWFsbVR5cGVWYWxzOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBhbGxvdyBkZWxldGlvbiB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEFsbG93RGVsZXRpb24oKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy5hbGxvd0RlbGV0aW9uOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBhbGxvdyBEZWxldGlvbiB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBbGxvd0RlbGV0aW9uKFN0cmluZyBhbGxvd0RlbGV0aW9uKSB7CisgICAgICAgIAorICAgICAgICB0aGlzLmFsbG93RGVsZXRpb24gPSBhbGxvd0RlbGV0aW9uOworICAgICAgICAKKyAgICB9CisgICAKKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXNldCBhbGwgcHJvcGVydGllcyB0byB0aGVpciBkZWZhdWx0IHZhbHVlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBtYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVzZXQoQWN0aW9uTWFwcGluZyBtYXBwaW5nLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICAKKyAgICAgICAgb2JqZWN0TmFtZSA9IG51bGw7CisgICAgICAgIGFkbWluQWN0aW9uID0gIkVkaXQiOworICAgICAgICAKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZWFsbS9SZWFsbXNGb3JtLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVhbG0vUmVhbG1zRm9ybS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5N2U1OWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVhbG0vUmVhbG1zRm9ybS5qYXZhCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5yZWFsbTsKKworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9ybTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKKworCisvKioKKyAqIEZvcm0gYmVhbiBmb3IgZGVsZXRpbmcgcmVhbG1zLgorICoKKyAqIEBhdXRob3IgTWFudmVlbiBLYXVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBSZWFsbXNGb3JtIGV4dGVuZHMgQWN0aW9uRm9ybSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgb2JqZWN0IG5hbWVzIG9mIHRoZSByZWFsbXMgdG8gYmUgZGVsZXRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyByZWFsbXNbXSA9IG5ldyBTdHJpbmdbMF07CisKKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0UmVhbG1zKCkgeworICAgICAgICByZXR1cm4gKHRoaXMucmVhbG1zKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRSZWFsbXMoU3RyaW5nIHJlYWxtc1tdKSB7CisgICAgICAgIHRoaXMucmVhbG1zID0gcmVhbG1zOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJlc2V0IGFsbCBwcm9wZXJ0aWVzIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIG1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZXNldChBY3Rpb25NYXBwaW5nIG1hcHBpbmcsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisKKyAgICAgICAgdGhpcy5yZWFsbXMgPSBuZXcgU3RyaW5nWzBdOworCisgICAgfQorICAgICAgICAKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3JlYWxtL1NhdmVEYXRhU291cmNlUmVhbG1BY3Rpb24uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZWFsbS9TYXZlRGF0YVNvdXJjZVJlYWxtQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhlOTVhMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZWFsbS9TYXZlRGF0YVNvdXJjZVJlYWxtQWN0aW9uLmphdmEKQEAgLTAsMCArMSwyODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMS0yMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnJlYWxtOworCisKK2ltcG9ydCBqYXZhLm5ldC5VUkxFbmNvZGVyOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5BdHRyaWJ1dGU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyRmFjdG9yeTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LlF1ZXJ5RXhwOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuUXVlcnk7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3RJbnN0YW5jZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5KTUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRXJyb3I7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkVycm9yczsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9ybTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9yd2FyZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy51dGlsLk1lc3NhZ2VSZXNvdXJjZXM7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uQXBwbGljYXRpb25TZXJ2bGV0OworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLlRvbWNhdFRyZWVCdWlsZGVyOworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLlRyZWVDb250cm9sOworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLlRyZWVDb250cm9sTm9kZTsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi52YWx2ZS5WYWx2ZVV0aWw7CisKKy8qKgorICogVGhlIDxjb2RlPkFjdGlvbjwvY29kZT4gdGhhdCBjb21wbGV0ZXMgPGVtPkFkZCBSZWFsbTwvZW0+IGFuZAorICogPGVtPkVkaXQgUmVhbG08L2VtPiB0cmFuc2FjdGlvbnMgZm9yIERhdGFTb3VyY2UgcmVhbG0uCisgKgorICogQGF1dGhvciBBbXkgUm9oCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBTYXZlRGF0YVNvdXJjZVJlYWxtQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKyAgICAvKioKKyAgICAgKiBTaWduYXR1cmUgZm9yIHRoZSA8Y29kZT5jcmVhdGVEYXRhU291cmNlUmVhbG08L2NvZGU+IG9wZXJhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBjcmVhdGVEYXRhU291cmNlUmVhbG1UeXBlc1tdID0KKyAgICB7ICJqYXZhLmxhbmcuU3RyaW5nIiwgICAgIC8vIHBhcmVudAorICAgICAgImphdmEubGFuZy5TdHJpbmciLCAgICAgLy8gZGF0YVNvdXJjZU5hbWUKKyAgICAgICJqYXZhLmxhbmcuU3RyaW5nIiwgICAgIC8vIHJvbGVOYW1lQ29sCisgICAgICAiamF2YS5sYW5nLlN0cmluZyIsICAgICAvLyB1c2VyQ3JlZENvbAorICAgICAgImphdmEubGFuZy5TdHJpbmciLCAgICAgLy8gdXNlck5hbWVDb2wKKyAgICAgICJqYXZhLmxhbmcuU3RyaW5nIiwgICAgIC8vIHVzZXJSb2xlVGFibGUKKyAgICAgICJqYXZhLmxhbmcuU3RyaW5nIiwgICAgIC8vIHVzZXJUYWJsZQorICAgIH07CisKKworICAgIC8qKgorICAgICAqIFRoZSBNQmVhblNlcnZlciB3ZSB3aWxsIGJlIGludGVyYWN0aW5nIHdpdGguCisgICAgICovCisgICAgcHJpdmF0ZSBNQmVhblNlcnZlciBtQlNlcnZlciA9IG51bGw7CisgICAgCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBzcGVjaWZpZWQgSFRUUCByZXF1ZXN0LCBhbmQgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIEhUVFAKKyAgICAgKiByZXNwb25zZSAob3IgZm9yd2FyZCB0byBhbm90aGVyIHdlYiBjb21wb25lbnQgdGhhdCB3aWxsIGNyZWF0ZSBpdCkuCisgICAgICogUmV0dXJuIGFuIDxjb2RlPkFjdGlvbkZvcndhcmQ8L2NvZGU+IGluc3RhbmNlIGRlc2NyaWJpbmcgd2hlcmUgYW5kIGhvdworICAgICAqIGNvbnRyb2wgc2hvdWxkIGJlIGZvcndhcmRlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHJlc3BvbnNlIGhhcworICAgICAqIGFscmVhZHkgYmVlbiBjb21wbGV0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgQWN0aW9uTWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIGFjdGlvbkZvcm0gVGhlIG9wdGlvbmFsIEFjdGlvbkZvcm0gYmVhbiBmb3IgdGhpcyByZXF1ZXN0IChpZiBhbnkpCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIEhUVFAgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgSFRUUCByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXhjZXB0aW9uIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBBY3Rpb25Gb3J3YXJkIHBlcmZvcm0oQWN0aW9uTWFwcGluZyBtYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uRm9ybSBmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworICAgICAgICAKKyAgICAgICAgLy8gQWNxdWlyZSB0aGUgcmVzb3VyY2VzIHRoYXQgd2UgbmVlZAorICAgICAgICBIdHRwU2Vzc2lvbiBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uKCk7CisgICAgICAgIExvY2FsZSBsb2NhbGUgPSBnZXRMb2NhbGUocmVxdWVzdCk7CisgICAgICAgIE1lc3NhZ2VSZXNvdXJjZXMgcmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VzKHJlcXVlc3QpOworICAgICAgICAKKyAgICAgICAgLy8gQWNxdWlyZSBhIHJlZmVyZW5jZSB0byB0aGUgTUJlYW5TZXJ2ZXIgY29udGFpbmluZyBvdXIgTUJlYW5zCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtQlNlcnZlciA9ICgoQXBwbGljYXRpb25TZXJ2bGV0KSBnZXRTZXJ2bGV0KCkpLmdldFNlcnZlcigpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24KKyAgICAgICAgICAgICgiQ2Fubm90IGFjcXVpcmUgTUJlYW5TZXJ2ZXIgcmVmZXJlbmNlIiwgdCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIElkZW50aWZ5IHRoZSByZXF1ZXN0ZWQgYWN0aW9uCisgICAgICAgIERhdGFTb3VyY2VSZWFsbUZvcm0gcmZvcm0gPSAoRGF0YVNvdXJjZVJlYWxtRm9ybSkgZm9ybTsKKyAgICAgICAgU3RyaW5nIGFkbWluQWN0aW9uID0gcmZvcm0uZ2V0QWRtaW5BY3Rpb24oKTsKKyAgICAgICAgU3RyaW5nIHJPYmplY3ROYW1lID0gcmZvcm0uZ2V0T2JqZWN0TmFtZSgpOworCisgICAgICAgIC8vIFBlcmZvcm0gYSAiQ3JlYXRlIERhdGFTb3VyY2UgUmVhbG0iIHRyYW5zYWN0aW9uIChpZiByZXF1ZXN0ZWQpCisgICAgICAgIGlmICgiQ3JlYXRlIi5lcXVhbHMoYWRtaW5BY3Rpb24pKSB7CisKKyAgICAgICAgICAgIFN0cmluZyBvcGVyYXRpb24gPSBudWxsOworICAgICAgICAgICAgU3RyaW5nIHZhbHVlc1tdID0gbnVsbDsKKworICAgICAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgICAgIFN0cmluZyBwYXJlbnQgPSByZm9ybS5nZXRQYXJlbnRPYmplY3ROYW1lKCk7ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIFN0cmluZyBvYmplY3ROYW1lID0gVmFsdmVVdGlsLmdldE9iamVjdE5hbWUocGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9tY2F0VHJlZUJ1aWxkZXIuUkVBTE1fVFlQRSk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSBwbmFtZSA9IG5ldyBPYmplY3ROYW1lKHBhcmVudCk7CisgICAgICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihwbmFtZS5nZXREb21haW4oKSk7ICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBGb3Igc2VydmljZSwgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIEVuZ2luZSBtQmVhbiAgCisgICAgICAgICAgICAgICAgLy8gUGFyZW50IGluIHRoaXMgY2FzZSBuZWVkcyB0byBiZSB0aGUgY29udGFpbmVyIG1CZWFuIGZvciB0aGUgc2VydmljZSAKKyAgICAgICAgICAgICAgICB0cnkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGlmICgiU2VydmljZSIuZXF1YWxzSWdub3JlQ2FzZShwbmFtZS5nZXRLZXlQcm9wZXJ0eSgidHlwZSIpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCI6dHlwZT1FbmdpbmUiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudCA9IHNiLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9CisgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJlcnJvci5lbmdpbmVOYW1lLmJhZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19CQURfUkVRVUVTVCwgbWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gRW5zdXJlIHRoYXQgdGhlIHJlcXVlc3RlZCB1c2VyIGRhdGFiYXNlIG5hbWUgaXMgdW5pcXVlCisgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3ROYW1lKG9iamVjdE5hbWUpOworICAgICAgICAgICAgICAgIGlmIChtQlNlcnZlci5pc1JlZ2lzdGVyZWQob25hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIEFjdGlvbkVycm9ycyBlcnJvcnMgPSBuZXcgQWN0aW9uRXJyb3JzKCk7CisgICAgICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoInJlYWxtTmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFjdGlvbkVycm9yKCJlcnJvci5yZWFsbU5hbWUuZXhpc3RzIikpOworICAgICAgICAgICAgICAgICAgICBzYXZlRXJyb3JzKHJlcXVlc3QsIGVycm9ycyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAobmV3IEFjdGlvbkZvcndhcmQobWFwcGluZy5nZXRJbnB1dCgpKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgU3RyaW5nIGRvbWFpbiA9IG9uYW1lLmdldERvbWFpbigpOworICAgICAgICAgICAgICAgIC8vIExvb2sgdXAgb3VyIE1CZWFuRmFjdG9yeSBNQmVhbgorICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgZm5hbWUgPSAKKyAgICAgICAgICAgICAgICAgICAgVG9tY2F0VHJlZUJ1aWxkZXIuZ2V0TUJlYW5GYWN0b3J5KCk7CisKKyAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgRGF0YVNvdXJjZVJlYWxtIG9iamVjdAorICAgICAgICAgICAgICAgIHZhbHVlcyA9IG5ldyBTdHJpbmdbN107CisgICAgICAgICAgICAgICAgdmFsdWVzWzBdID0gcGFyZW50OworCQl2YWx1ZXNbMV0gPSByZm9ybS5nZXREYXRhU291cmNlTmFtZSgpOworCQl2YWx1ZXNbMl0gPSByZm9ybS5nZXRSb2xlTmFtZUNvbCgpOworCQl2YWx1ZXNbM10gPSByZm9ybS5nZXRVc2VyQ3JlZENvbCgpOworCQl2YWx1ZXNbNF0gPSByZm9ybS5nZXRVc2VyTmFtZUNvbCgpOworCQl2YWx1ZXNbNV0gPSByZm9ybS5nZXRVc2VyUm9sZVRhYmxlKCk7CisgICAgICAgICAgICAgICAgdmFsdWVzWzZdID0gcmZvcm0uZ2V0VXNlclRhYmxlKCk7CisgICAgICAgICAgICAgICAgb3BlcmF0aW9uID0gImNyZWF0ZURhdGFTb3VyY2VSZWFsbSI7CisgICAgICAgICAgICAgICAgck9iamVjdE5hbWUgPSAoU3RyaW5nKQorICAgICAgICAgICAgICAgICAgICBtQlNlcnZlci5pbnZva2UoZm5hbWUsIG9wZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcywgY3JlYXRlRGF0YVNvdXJjZVJlYWxtVHlwZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKHJPYmplY3ROYW1lPT1udWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3Quc2V0QXR0cmlidXRlKCJ3YXJuaW5nIiwgImVycm9yLmRhdGFzb3VyY2VyZWFsbSIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG1hcHBpbmcuZmluZEZvcndhcmQoIlNhdmUgVW5zdWNjZXNzZnVsIikpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgbmV3IFJlYWxtIHRvIG91ciB0cmVlIGNvbnRyb2wgbm9kZQorICAgICAgICAgICAgICAgIFRyZWVDb250cm9sIGNvbnRyb2wgPSAoVHJlZUNvbnRyb2wpCisgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0QXR0cmlidXRlKCJ0cmVlQ29udHJvbFRlc3QiKTsKKyAgICAgICAgICAgICAgICBpZiAoY29udHJvbCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIFRyZWVDb250cm9sTm9kZSBwYXJlbnROb2RlID0gY29udHJvbC5maW5kTm9kZShyZm9ybS5nZXRQYXJlbnRPYmplY3ROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50Tm9kZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbm9kZUxhYmVsID0gcmZvcm0uZ2V0Tm9kZUxhYmVsKCk7ICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZW5jb2RlZE5hbWUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHJPYmplY3ROYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRyZWVDb250cm9sTm9kZSBjaGlsZE5vZGUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUcmVlQ29udHJvbE5vZGUock9iamVjdE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVhbG0uZ2lmIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVMYWJlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFZGl0UmVhbG0uZG8/c2VsZWN0PSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udGVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCBkb21haW4pOworICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50Tm9kZS5hZGRDaGlsZChjaGlsZE5vZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgLSBmb3JjZSBhIHJlZGlzcGxheQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiQ2Fubm90IGZpbmQgcGFyZW50IG5vZGUgJyIgKyBwYXJlbnQgKyAiJyIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZworICAgICAgICAgICAgICAgICAgICAgICAgKCJDYW5ub3QgZmluZCBUcmVlQ29udHJvbE5vZGUhIik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCisgICAgICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZworICAgICAgICAgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuaW52b2tlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbiksIGUpOworICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5pbnZva2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICAvLyBQZXJmb3JtIGF0dHJpYnV0ZSB1cGRhdGVzIGFzIHJlcXVlc3RlZAorICAgICAgICBTdHJpbmcgYXR0cmlidXRlID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgT2JqZWN0TmFtZSByb25hbWUgPSBuZXcgT2JqZWN0TmFtZShyT2JqZWN0TmFtZSk7CisKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJkYXRhU291cmNlTmFtZSI7CisgICAgICAgICAgICBtQlNlcnZlci5zZXRBdHRyaWJ1dGUocm9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoYXR0cmlidXRlLCByZm9ybS5nZXREYXRhU291cmNlTmFtZSgpKSk7CisKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJkaWdlc3QiOworICAgICAgICAgICAgbUJTZXJ2ZXIuc2V0QXR0cmlidXRlKHJvbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKCJkaWdlc3QiLCAgcmZvcm0uZ2V0RGlnZXN0KCkpKTsKKworICAgICAgICAgICAgYXR0cmlidXRlID0gInJvbGVOYW1lQ29sIjsKKyAgICAgICAgICAgIG1CU2VydmVyLnNldEF0dHJpYnV0ZShyb25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZSgicm9sZU5hbWVDb2wiLCAgcmZvcm0uZ2V0Um9sZU5hbWVDb2woKSkpOworCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAidXNlckNyZWRDb2wiOworICAgICAgICAgICAgbUJTZXJ2ZXIuc2V0QXR0cmlidXRlKHJvbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKCJ1c2VyQ3JlZENvbCIsICByZm9ybS5nZXRVc2VyQ3JlZENvbCgpKSk7CisKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJ1c2VyTmFtZUNvbCI7CisgICAgICAgICAgICBtQlNlcnZlci5zZXRBdHRyaWJ1dGUocm9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoInVzZXJOYW1lQ29sIiwgIHJmb3JtLmdldFVzZXJOYW1lQ29sKCkpKTsKKworICAgICAgICAgICAgYXR0cmlidXRlID0gInVzZXJSb2xlVGFibGUiOworICAgICAgICAgICAgbUJTZXJ2ZXIuc2V0QXR0cmlidXRlKHJvbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKCJ1c2VyUm9sZVRhYmxlIiwgIHJmb3JtLmdldFVzZXJSb2xlVGFibGUoKSkpOworCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAidXNlclRhYmxlIjsKKyAgICAgICAgICAgIG1CU2VydmVyLnNldEF0dHJpYnV0ZShyb25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZSgidXNlclRhYmxlIiwgIHJmb3JtLmdldFVzZXJUYWJsZSgpKSk7CisgICAgICAgICAgICAKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKworICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZworICAgICAgICAgICAgICAgIChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5hdHRyaWJ1dGUuc2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlKSwgZSk7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsCisgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmF0dHJpYnV0ZS5zZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUpKTsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIEZvcndhcmQgdG8gdGhlIHN1Y2Nlc3MgcmVwb3J0aW5nIHBhZ2UKKyAgICAgICAgc2Vzc2lvbi5yZW1vdmVBdHRyaWJ1dGUobWFwcGluZy5nZXRBdHRyaWJ1dGUoKSk7CisgICAgICAgIHJldHVybiAobWFwcGluZy5maW5kRm9yd2FyZCgiU2F2ZSBTdWNjZXNzZnVsIikpOworICAgICAgICAKKyAgICB9CisgICAgCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVhbG0vU2F2ZUpEQkNSZWFsbUFjdGlvbi5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3JlYWxtL1NhdmVKREJDUmVhbG1BY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDc1MjJhCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3JlYWxtL1NhdmVKREJDUmVhbG1BY3Rpb24uamF2YQpAQCAtMCwwICsxLDI5MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAxLTIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVhbG07CisKKworaW1wb3J0IGphdmEubmV0LlVSTEVuY29kZXI7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LkF0dHJpYnV0ZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXJGYWN0b3J5OworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuUXVlcnlFeHA7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5RdWVyeTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdEluc3RhbmNlOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LkpNRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25FcnJvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRXJyb3JzOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3J3YXJkOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLnV0aWwuTWVzc2FnZVJlc291cmNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5BcHBsaWNhdGlvblNlcnZsZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uVG9tY2F0VHJlZUJ1aWxkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uVHJlZUNvbnRyb2w7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uVHJlZUNvbnRyb2xOb2RlOworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnZhbHZlLlZhbHZlVXRpbDsKKworLyoqCisgKiBUaGUgPGNvZGU+QWN0aW9uPC9jb2RlPiB0aGF0IGNvbXBsZXRlcyA8ZW0+QWRkIFJlYWxtPC9lbT4gYW5kCisgKiA8ZW0+RWRpdCBSZWFsbTwvZW0+IHRyYW5zYWN0aW9ucyBmb3IgSkRCQyByZWFsbS4KKyAqCisgKiBAYXV0aG9yIE1hbnZlZW4gS2F1cgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgU2F2ZUpEQkNSZWFsbUFjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisgICAgLyoqCisgICAgICogU2lnbmF0dXJlIGZvciB0aGUgPGNvZGU+Y3JlYXRlU3RhbmRhcmRSZWFsbTwvY29kZT4gb3BlcmF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGNyZWF0ZVN0YW5kYXJkUmVhbG1UeXBlc1tdID0KKyAgICB7ICJqYXZhLmxhbmcuU3RyaW5nIiwgICAgIC8vIHBhcmVudAorICAgICAgImphdmEubGFuZy5TdHJpbmciLCAgICAgLy8gZHJpdmVyTmFtZQorICAgICAgImphdmEubGFuZy5TdHJpbmciLCAgICAgLy8gY29ubmVjdGlvbk5hbWUKKyAgICAgICJqYXZhLmxhbmcuU3RyaW5nIiwgICAgIC8vIGNvbm5lY3Rpb25QYXNzd29yZAorICAgICAgImphdmEubGFuZy5TdHJpbmciLCAgICAgLy8gY29ubmVjdGlvblVSTAorICAgIH07CisKKworICAgIC8qKgorICAgICAqIFRoZSBNQmVhblNlcnZlciB3ZSB3aWxsIGJlIGludGVyYWN0aW5nIHdpdGguCisgICAgICovCisgICAgcHJpdmF0ZSBNQmVhblNlcnZlciBtQlNlcnZlciA9IG51bGw7CisgICAgCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBzcGVjaWZpZWQgSFRUUCByZXF1ZXN0LCBhbmQgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIEhUVFAKKyAgICAgKiByZXNwb25zZSAob3IgZm9yd2FyZCB0byBhbm90aGVyIHdlYiBjb21wb25lbnQgdGhhdCB3aWxsIGNyZWF0ZSBpdCkuCisgICAgICogUmV0dXJuIGFuIDxjb2RlPkFjdGlvbkZvcndhcmQ8L2NvZGU+IGluc3RhbmNlIGRlc2NyaWJpbmcgd2hlcmUgYW5kIGhvdworICAgICAqIGNvbnRyb2wgc2hvdWxkIGJlIGZvcndhcmRlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHJlc3BvbnNlIGhhcworICAgICAqIGFscmVhZHkgYmVlbiBjb21wbGV0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgQWN0aW9uTWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIGFjdGlvbkZvcm0gVGhlIG9wdGlvbmFsIEFjdGlvbkZvcm0gYmVhbiBmb3IgdGhpcyByZXF1ZXN0IChpZiBhbnkpCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIEhUVFAgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgSFRUUCByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXhjZXB0aW9uIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBBY3Rpb25Gb3J3YXJkIHBlcmZvcm0oQWN0aW9uTWFwcGluZyBtYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uRm9ybSBmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworICAgICAgICAKKyAgICAgICAgLy8gQWNxdWlyZSB0aGUgcmVzb3VyY2VzIHRoYXQgd2UgbmVlZAorICAgICAgICBIdHRwU2Vzc2lvbiBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uKCk7CisgICAgICAgIExvY2FsZSBsb2NhbGUgPSBnZXRMb2NhbGUocmVxdWVzdCk7CisgICAgICAgIE1lc3NhZ2VSZXNvdXJjZXMgcmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VzKHJlcXVlc3QpOworICAgICAgICAKKyAgICAgICAgLy8gQWNxdWlyZSBhIHJlZmVyZW5jZSB0byB0aGUgTUJlYW5TZXJ2ZXIgY29udGFpbmluZyBvdXIgTUJlYW5zCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtQlNlcnZlciA9ICgoQXBwbGljYXRpb25TZXJ2bGV0KSBnZXRTZXJ2bGV0KCkpLmdldFNlcnZlcigpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24KKyAgICAgICAgICAgICgiQ2Fubm90IGFjcXVpcmUgTUJlYW5TZXJ2ZXIgcmVmZXJlbmNlIiwgdCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIElkZW50aWZ5IHRoZSByZXF1ZXN0ZWQgYWN0aW9uCisgICAgICAgIEpEQkNSZWFsbUZvcm0gcmZvcm0gPSAoSkRCQ1JlYWxtRm9ybSkgZm9ybTsKKyAgICAgICAgU3RyaW5nIGFkbWluQWN0aW9uID0gcmZvcm0uZ2V0QWRtaW5BY3Rpb24oKTsKKyAgICAgICAgU3RyaW5nIHJPYmplY3ROYW1lID0gcmZvcm0uZ2V0T2JqZWN0TmFtZSgpOworCisgICAgICAgIC8vIFBlcmZvcm0gYSAiQ3JlYXRlIEpEQkMgUmVhbG0iIHRyYW5zYWN0aW9uIChpZiByZXF1ZXN0ZWQpCisgICAgICAgIGlmICgiQ3JlYXRlIi5lcXVhbHMoYWRtaW5BY3Rpb24pKSB7CisKKyAgICAgICAgICAgIFN0cmluZyBvcGVyYXRpb24gPSBudWxsOworICAgICAgICAgICAgU3RyaW5nIHZhbHVlc1tdID0gbnVsbDsKKworICAgICAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgICAgIFN0cmluZyBwYXJlbnQgPSByZm9ybS5nZXRQYXJlbnRPYmplY3ROYW1lKCk7ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIFN0cmluZyBvYmplY3ROYW1lID0gVmFsdmVVdGlsLmdldE9iamVjdE5hbWUocGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9tY2F0VHJlZUJ1aWxkZXIuUkVBTE1fVFlQRSk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSBwbmFtZSA9IG5ldyBPYmplY3ROYW1lKHBhcmVudCk7CisgICAgICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihwbmFtZS5nZXREb21haW4oKSk7ICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBGb3Igc2VydmljZSwgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIEVuZ2luZSBtQmVhbiAgCisgICAgICAgICAgICAgICAgLy8gUGFyZW50IGluIHRoaXMgY2FzZSBuZWVkcyB0byBiZSB0aGUgY29udGFpbmVyIG1CZWFuIGZvciB0aGUgc2VydmljZSAKKyAgICAgICAgICAgICAgICB0cnkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGlmICgiU2VydmljZSIuZXF1YWxzSWdub3JlQ2FzZShwbmFtZS5nZXRLZXlQcm9wZXJ0eSgidHlwZSIpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCI6dHlwZT1FbmdpbmUiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudCA9IHNiLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9CisgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJlcnJvci5lbmdpbmVOYW1lLmJhZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19CQURfUkVRVUVTVCwgbWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gRW5zdXJlIHRoYXQgdGhlIHJlcXVlc3RlZCB1c2VyIGRhdGFiYXNlIG5hbWUgaXMgdW5pcXVlCisgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3ROYW1lKG9iamVjdE5hbWUpOworICAgICAgICAgICAgICAgIGlmIChtQlNlcnZlci5pc1JlZ2lzdGVyZWQob25hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIEFjdGlvbkVycm9ycyBlcnJvcnMgPSBuZXcgQWN0aW9uRXJyb3JzKCk7CisgICAgICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoInJlYWxtTmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFjdGlvbkVycm9yKCJlcnJvci5yZWFsbU5hbWUuZXhpc3RzIikpOworICAgICAgICAgICAgICAgICAgICBzYXZlRXJyb3JzKHJlcXVlc3QsIGVycm9ycyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAobmV3IEFjdGlvbkZvcndhcmQobWFwcGluZy5nZXRJbnB1dCgpKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgU3RyaW5nIGRvbWFpbiA9IG9uYW1lLmdldERvbWFpbigpOworICAgICAgICAgICAgICAgIC8vIExvb2sgdXAgb3VyIE1CZWFuRmFjdG9yeSBNQmVhbgorICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgZm5hbWUgPSAKKyAgICAgICAgICAgICAgICAgICAgVG9tY2F0VHJlZUJ1aWxkZXIuZ2V0TUJlYW5GYWN0b3J5KCk7CisKKyAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgU3RhbmRhcmRSZWFsbSBvYmplY3QKKyAgICAgICAgICAgICAgICB2YWx1ZXMgPSBuZXcgU3RyaW5nWzVdOworICAgICAgICAgICAgICAgIHZhbHVlc1swXSA9IHBhcmVudDsKKwkJdmFsdWVzWzFdID0gcmZvcm0uZ2V0RHJpdmVyKCk7CisJCXZhbHVlc1syXSA9IHJmb3JtLmdldENvbm5lY3Rpb25OYW1lKCk7CisJCXZhbHVlc1szXSA9IHJmb3JtLmdldENvbm5lY3Rpb25QYXNzd29yZCgpOworCQl2YWx1ZXNbNF0gPSByZm9ybS5nZXRDb25uZWN0aW9uVVJMKCk7CisgICAgICAgICAgICAgICAgb3BlcmF0aW9uID0gImNyZWF0ZUpEQkNSZWFsbSI7CisgICAgICAgICAgICAgICAgck9iamVjdE5hbWUgPSAoU3RyaW5nKQorICAgICAgICAgICAgICAgICAgICBtQlNlcnZlci5pbnZva2UoZm5hbWUsIG9wZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcywgY3JlYXRlU3RhbmRhcmRSZWFsbVR5cGVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmIChyT2JqZWN0TmFtZT09bnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LnNldEF0dHJpYnV0ZSgid2FybmluZyIsICJlcnJvci5qZGJjcmVhbG0iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChtYXBwaW5nLmZpbmRGb3J3YXJkKCJTYXZlIFVuc3VjY2Vzc2Z1bCIpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIG5ldyBSZWFsbSB0byBvdXIgdHJlZSBjb250cm9sIG5vZGUKKyAgICAgICAgICAgICAgICBUcmVlQ29udHJvbCBjb250cm9sID0gKFRyZWVDb250cm9sKQorICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldEF0dHJpYnV0ZSgidHJlZUNvbnRyb2xUZXN0Iik7CisgICAgICAgICAgICAgICAgaWYgKGNvbnRyb2wgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBUcmVlQ29udHJvbE5vZGUgcGFyZW50Tm9kZSA9IGNvbnRyb2wuZmluZE5vZGUocmZvcm0uZ2V0UGFyZW50T2JqZWN0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudE5vZGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5vZGVMYWJlbCA9IHJmb3JtLmdldE5vZGVMYWJlbCgpOyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVuY29kZWROYW1lID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShyT2JqZWN0TmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBUcmVlQ29udHJvbE5vZGUgY2hpbGROb2RlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVHJlZUNvbnRyb2xOb2RlKHJPYmplY3ROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlYWxtLmdpZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlTGFiZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRWRpdFJlYWxtLmRvP3NlbGVjdD0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZWROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRlbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgZG9tYWluKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudE5vZGUuYWRkQ2hpbGQoY2hpbGROb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIC0gZm9yY2UgYSByZWRpc3BsYXkKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIkNhbm5vdCBmaW5kIHBhcmVudCBub2RlICciICsgcGFyZW50ICsgIiciKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAgICAgICAgICgiQ2Fubm90IGZpbmQgVHJlZUNvbnRyb2xOb2RlISIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKworICAgICAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmludm9rZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24pLCBlKTsKKyAgICAgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuaW52b2tlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbikpOworICAgICAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgLy8gUGVyZm9ybSBhdHRyaWJ1dGUgdXBkYXRlcyBhcyByZXF1ZXN0ZWQKKyAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZSA9IG51bGw7CisgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgIE9iamVjdE5hbWUgcm9uYW1lID0gbmV3IE9iamVjdE5hbWUock9iamVjdE5hbWUpOworCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAiZGlnZXN0IjsKKyAgICAgICAgICAgIG1CU2VydmVyLnNldEF0dHJpYnV0ZShyb25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZSgiZGlnZXN0IiwgIHJmb3JtLmdldERpZ2VzdCgpKSk7CisKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJkcml2ZXJOYW1lIjsKKyAgICAgICAgICAgIG1CU2VydmVyLnNldEF0dHJpYnV0ZShyb25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZSgiZHJpdmVyTmFtZSIsICByZm9ybS5nZXREcml2ZXIoKSkpOworCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAicm9sZU5hbWVDb2wiOworICAgICAgICAgICAgbUJTZXJ2ZXIuc2V0QXR0cmlidXRlKHJvbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKCJyb2xlTmFtZUNvbCIsICByZm9ybS5nZXRSb2xlTmFtZUNvbCgpKSk7CisKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJ1c2VyTmFtZUNvbCI7CisgICAgICAgICAgICBtQlNlcnZlci5zZXRBdHRyaWJ1dGUocm9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoInVzZXJOYW1lQ29sIiwgIHJmb3JtLmdldFVzZXJOYW1lQ29sKCkpKTsKKworICAgICAgICAgICAgYXR0cmlidXRlID0gInVzZXJDcmVkQ29sIjsKKyAgICAgICAgICAgIG1CU2VydmVyLnNldEF0dHJpYnV0ZShyb25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZSgidXNlckNyZWRDb2wiLCAgcmZvcm0uZ2V0UGFzc3dvcmRDb2woKSkpOworCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAidXNlclRhYmxlIjsKKyAgICAgICAgICAgIG1CU2VydmVyLnNldEF0dHJpYnV0ZShyb25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZSgidXNlclRhYmxlIiwgIHJmb3JtLmdldFVzZXJUYWJsZSgpKSk7CisKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJ1c2VyUm9sZVRhYmxlIjsKKyAgICAgICAgICAgIG1CU2VydmVyLnNldEF0dHJpYnV0ZShyb25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZSgidXNlclJvbGVUYWJsZSIsICByZm9ybS5nZXRSb2xlVGFibGUoKSkpOworCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAiY29ubmVjdGlvbk5hbWUiOworICAgICAgICAgICAgbUJTZXJ2ZXIuc2V0QXR0cmlidXRlKHJvbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKCJjb25uZWN0aW9uTmFtZSIsICByZm9ybS5nZXRDb25uZWN0aW9uTmFtZSgpKSk7CisKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJjb25uZWN0aW9uVVJMIjsKKyAgICAgICAgICAgIG1CU2VydmVyLnNldEF0dHJpYnV0ZShyb25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZSgiY29ubmVjdGlvblVSTCIsICByZm9ybS5nZXRDb25uZWN0aW9uVVJMKCkpKTsKKworICAgICAgICAgICAgYXR0cmlidXRlID0gImNvbm5lY3Rpb25QYXNzd29yZCI7CisgICAgICAgICAgICBtQlNlcnZlci5zZXRBdHRyaWJ1dGUocm9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoImNvbm5lY3Rpb25QYXNzd29yZCIsICByZm9ybS5nZXRDb25uZWN0aW9uUGFzc3dvcmQoKSkpOworCisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisKKyAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuYXR0cmlidXRlLnNldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSksIGUpOworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5hdHRyaWJ1dGUuc2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlKSk7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBGb3J3YXJkIHRvIHRoZSBzdWNjZXNzIHJlcG9ydGluZyBwYWdlCisgICAgICAgIHNlc3Npb24ucmVtb3ZlQXR0cmlidXRlKG1hcHBpbmcuZ2V0QXR0cmlidXRlKCkpOworICAgICAgICByZXR1cm4gKG1hcHBpbmcuZmluZEZvcndhcmQoIlNhdmUgU3VjY2Vzc2Z1bCIpKTsKKyAgICAgICAgCisgICAgfQorICAgIAorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3JlYWxtL1NhdmVKTkRJUmVhbG1BY3Rpb24uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZWFsbS9TYXZlSk5ESVJlYWxtQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTkxNDZkYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZWFsbS9TYXZlSk5ESVJlYWxtQWN0aW9uLmphdmEKQEAgLTAsMCArMSwzNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMS0yMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnJlYWxtOworCisKK2ltcG9ydCBqYXZhLm5ldC5VUkxFbmNvZGVyOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5BdHRyaWJ1dGU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyRmFjdG9yeTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LlF1ZXJ5RXhwOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuUXVlcnk7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3RJbnN0YW5jZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5KTUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRXJyb3I7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkVycm9yczsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9ybTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9yd2FyZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy51dGlsLk1lc3NhZ2VSZXNvdXJjZXM7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uQXBwbGljYXRpb25TZXJ2bGV0OworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLlRvbWNhdFRyZWVCdWlsZGVyOworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLlRyZWVDb250cm9sOworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLlRyZWVDb250cm9sTm9kZTsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi52YWx2ZS5WYWx2ZVV0aWw7CisKKy8qKgorICogVGhlIDxjb2RlPkFjdGlvbjwvY29kZT4gdGhhdCBjb21wbGV0ZXMgPGVtPkFkZCBSZWFsbTwvZW0+IGFuZAorICogPGVtPkVkaXQgUmVhbG08L2VtPiB0cmFuc2FjdGlvbnMgZm9yIEpOREkgcmVhbG0uCisgKgorICogQGF1dGhvciBNYW52ZWVuIEthdXIKKyAqIEBhdXRob3IgQW15IFJvaAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgU2F2ZUpORElSZWFsbUFjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisgICAgLyoqCisgICAgICogU2lnbmF0dXJlIGZvciB0aGUgPGNvZGU+Y3JlYXRlU3RhbmRhcmRSZWFsbTwvY29kZT4gb3BlcmF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGNyZWF0ZVN0YW5kYXJkUmVhbG1UeXBlc1tdID0KKyAgICB7ICJqYXZhLmxhbmcuU3RyaW5nIiwgICAgIC8vIHBhcmVudAorICAgIH07CisKKworICAgIC8qKgorICAgICAqIFRoZSBNQmVhblNlcnZlciB3ZSB3aWxsIGJlIGludGVyYWN0aW5nIHdpdGguCisgICAgICovCisgICAgcHJpdmF0ZSBNQmVhblNlcnZlciBtQlNlcnZlciA9IG51bGw7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBzcGVjaWZpZWQgSFRUUCByZXF1ZXN0LCBhbmQgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIEhUVFAKKyAgICAgKiByZXNwb25zZSAob3IgZm9yd2FyZCB0byBhbm90aGVyIHdlYiBjb21wb25lbnQgdGhhdCB3aWxsIGNyZWF0ZSBpdCkuCisgICAgICogUmV0dXJuIGFuIDxjb2RlPkFjdGlvbkZvcndhcmQ8L2NvZGU+IGluc3RhbmNlIGRlc2NyaWJpbmcgd2hlcmUgYW5kIGhvdworICAgICAqIGNvbnRyb2wgc2hvdWxkIGJlIGZvcndhcmRlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHJlc3BvbnNlIGhhcworICAgICAqIGFscmVhZHkgYmVlbiBjb21wbGV0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgQWN0aW9uTWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIGFjdGlvbkZvcm0gVGhlIG9wdGlvbmFsIEFjdGlvbkZvcm0gYmVhbiBmb3IgdGhpcyByZXF1ZXN0IChpZiBhbnkpCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIEhUVFAgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgSFRUUCByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXhjZXB0aW9uIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBBY3Rpb25Gb3J3YXJkIHBlcmZvcm0oQWN0aW9uTWFwcGluZyBtYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uRm9ybSBmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIEFjcXVpcmUgdGhlIHJlc291cmNlcyB0aGF0IHdlIG5lZWQKKyAgICAgICAgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpOworICAgICAgICBMb2NhbGUgbG9jYWxlID0gZ2V0TG9jYWxlKHJlcXVlc3QpOworICAgICAgICBNZXNzYWdlUmVzb3VyY2VzIHJlc291cmNlcyA9IGdldFJlc291cmNlcyhyZXF1ZXN0KTsKKworICAgICAgICAvLyBBY3F1aXJlIGEgcmVmZXJlbmNlIHRvIHRoZSBNQmVhblNlcnZlciBjb250YWluaW5nIG91ciBNQmVhbnMKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1CU2VydmVyID0gKChBcHBsaWNhdGlvblNlcnZsZXQpIGdldFNlcnZsZXQoKSkuZ2V0U2VydmVyKCk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbgorICAgICAgICAgICAgKCJDYW5ub3QgYWNxdWlyZSBNQmVhblNlcnZlciByZWZlcmVuY2UiLCB0KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIElkZW50aWZ5IHRoZSByZXF1ZXN0ZWQgYWN0aW9uCisgICAgICAgIEpORElSZWFsbUZvcm0gcmZvcm0gPSAoSk5ESVJlYWxtRm9ybSkgZm9ybTsKKyAgICAgICAgU3RyaW5nIGFkbWluQWN0aW9uID0gcmZvcm0uZ2V0QWRtaW5BY3Rpb24oKTsKKyAgICAgICAgU3RyaW5nIHJPYmplY3ROYW1lID0gcmZvcm0uZ2V0T2JqZWN0TmFtZSgpOworCisgICAgICAgIC8vIFBlcmZvcm0gYSAiQ3JlYXRlIEpOREkgUmVhbG0iIHRyYW5zYWN0aW9uIChpZiByZXF1ZXN0ZWQpCisgICAgICAgIGlmICgiQ3JlYXRlIi5lcXVhbHMoYWRtaW5BY3Rpb24pKSB7CisKKyAgICAgICAgICAgIFN0cmluZyBvcGVyYXRpb24gPSBudWxsOworICAgICAgICAgICAgU3RyaW5nIHZhbHVlc1tdID0gbnVsbDsKKworICAgICAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgICAgIFN0cmluZyBwYXJlbnQgPSByZm9ybS5nZXRQYXJlbnRPYmplY3ROYW1lKCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIG9iamVjdE5hbWUgPSBWYWx2ZVV0aWwuZ2V0T2JqZWN0TmFtZShwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb21jYXRUcmVlQnVpbGRlci5SRUFMTV9UWVBFKTsKKworICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgcG5hbWUgPSBuZXcgT2JqZWN0TmFtZShwYXJlbnQpOworICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIocG5hbWUuZ2V0RG9tYWluKCkpOworCisgICAgICAgICAgICAgICAgLy8gRm9yIHNlcnZpY2UsIGNyZWF0ZSB0aGUgY29ycmVzcG9uZGluZyBFbmdpbmUgbUJlYW4KKyAgICAgICAgICAgICAgICAvLyBQYXJlbnQgaW4gdGhpcyBjYXNlIG5lZWRzIHRvIGJlIHRoZSBjb250YWluZXIgbUJlYW4gZm9yIHRoZSBzZXJ2aWNlCisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCJTZXJ2aWNlIi5lcXVhbHNJZ25vcmVDYXNlKHBuYW1lLmdldEtleVByb3BlcnR5KCJ0eXBlIikpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIjp0eXBlPUVuZ2luZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gc2IudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKCJlcnJvci5lbmdpbmVOYW1lLmJhZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19CQURfUkVRVUVTVCwgbWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gRW5zdXJlIHRoYXQgdGhlIHJlcXVlc3RlZCB1c2VyIGRhdGFiYXNlIG5hbWUgaXMgdW5pcXVlCisgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3ROYW1lKG9iamVjdE5hbWUpOworICAgICAgICAgICAgICAgIGlmIChtQlNlcnZlci5pc1JlZ2lzdGVyZWQob25hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIEFjdGlvbkVycm9ycyBlcnJvcnMgPSBuZXcgQWN0aW9uRXJyb3JzKCk7CisgICAgICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoInJlYWxtTmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFjdGlvbkVycm9yKCJlcnJvci5yZWFsbU5hbWUuZXhpc3RzIikpOworICAgICAgICAgICAgICAgICAgICBzYXZlRXJyb3JzKHJlcXVlc3QsIGVycm9ycyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAobmV3IEFjdGlvbkZvcndhcmQobWFwcGluZy5nZXRJbnB1dCgpKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgU3RyaW5nIGRvbWFpbiA9IG9uYW1lLmdldERvbWFpbigpOworICAgICAgICAgICAgICAgIC8vIExvb2sgdXAgb3VyIE1CZWFuRmFjdG9yeSBNQmVhbgorICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgZm5hbWUgPSAKKyAgICAgICAgICAgICAgICAgICAgVG9tY2F0VHJlZUJ1aWxkZXIuZ2V0TUJlYW5GYWN0b3J5KCk7CisKKyAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgU3RhbmRhcmRSZWFsbSBvYmplY3QKKyAgICAgICAgICAgICAgICB2YWx1ZXMgPSBuZXcgU3RyaW5nWzFdOworICAgICAgICAgICAgICAgIHZhbHVlc1swXSA9IHBhcmVudDsKKyAgICAgICAgICAgICAgICBvcGVyYXRpb24gPSAiY3JlYXRlSk5ESVJlYWxtIjsKKyAgICAgICAgICAgICAgICByT2JqZWN0TmFtZSA9IChTdHJpbmcpCisgICAgICAgICAgICAgICAgICAgIG1CU2VydmVyLmludm9rZShmbmFtZSwgb3BlcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLCBjcmVhdGVTdGFuZGFyZFJlYWxtVHlwZXMpOworCisgICAgICAgICAgICAgICAgaWYgKHJPYmplY3ROYW1lPT1udWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3Quc2V0QXR0cmlidXRlKCJ3YXJuaW5nIiwgImVycm9yLmpuZGlyZWFsbSIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG1hcHBpbmcuZmluZEZvcndhcmQoIlNhdmUgVW5zdWNjZXNzZnVsIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIG5ldyBSZWFsbSB0byBvdXIgdHJlZSBjb250cm9sIG5vZGUKKyAgICAgICAgICAgICAgICBUcmVlQ29udHJvbCBjb250cm9sID0gKFRyZWVDb250cm9sKQorICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldEF0dHJpYnV0ZSgidHJlZUNvbnRyb2xUZXN0Iik7CisgICAgICAgICAgICAgICAgaWYgKGNvbnRyb2wgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBUcmVlQ29udHJvbE5vZGUgcGFyZW50Tm9kZSA9IGNvbnRyb2wuZmluZE5vZGUocmZvcm0uZ2V0UGFyZW50T2JqZWN0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudE5vZGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5vZGVMYWJlbCA9IHJmb3JtLmdldE5vZGVMYWJlbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVuY29kZWROYW1lID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShyT2JqZWN0TmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBUcmVlQ29udHJvbE5vZGUgY2hpbGROb2RlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVHJlZUNvbnRyb2xOb2RlKHJPYmplY3ROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlYWxtLmdpZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlTGFiZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRWRpdFJlYWxtLmRvP3NlbGVjdD0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZWROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRlbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgZG9tYWluKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudE5vZGUuYWRkQ2hpbGQoY2hpbGROb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIC0gZm9yY2UgYSByZWRpc3BsYXkKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIkNhbm5vdCBmaW5kIHBhcmVudCBub2RlICciICsgcGFyZW50ICsgIiciKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAgICAgICAgICgiQ2Fubm90IGZpbmQgVHJlZUNvbnRyb2xOb2RlISIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKworICAgICAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmludm9rZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24pLCBlKTsKKyAgICAgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuaW52b2tlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbikpOworICAgICAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgLy8gUGVyZm9ybSBhdHRyaWJ1dGUgdXBkYXRlcyBhcyByZXF1ZXN0ZWQKKyAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZSA9IG51bGw7CisgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgIE9iamVjdE5hbWUgcm9uYW1lID0gbmV3IE9iamVjdE5hbWUock9iamVjdE5hbWUpOworCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAiY29ubmVjdGlvbk5hbWUiOworICAgICAgICAgICAgU3RyaW5nIGNvbm5lY3Rpb25OYW1lID0gcmZvcm0uZ2V0Q29ubmVjdGlvbk5hbWUoKTsKKyAgICAgICAgICAgIGlmICgoY29ubmVjdGlvbk5hbWUgIT0gbnVsbCkgJiYgKGNvbm5lY3Rpb25OYW1lLmxlbmd0aCgpPjApKSB7CisgICAgICAgICAgICAgICAgbUJTZXJ2ZXIuc2V0QXR0cmlidXRlKHJvbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoImNvbm5lY3Rpb25OYW1lIiwgIGNvbm5lY3Rpb25OYW1lKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJjb25uZWN0aW9uUGFzc3dvcmQiOworICAgICAgICAgICAgU3RyaW5nIGNvbm5lY3Rpb25QYXNzd29yZCA9IHJmb3JtLmdldENvbm5lY3Rpb25QYXNzd29yZCgpOworICAgICAgICAgICAgaWYgKChjb25uZWN0aW9uUGFzc3dvcmQgIT0gbnVsbCkgJiYgKGNvbm5lY3Rpb25QYXNzd29yZC5sZW5ndGgoKT4wKSkgeworICAgICAgICAgICAgICAgIG1CU2VydmVyLnNldEF0dHJpYnV0ZShyb25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKCJjb25uZWN0aW9uUGFzc3dvcmQiLCAgY29ubmVjdGlvblBhc3N3b3JkKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJjb25uZWN0aW9uVVJMIjsKKyAgICAgICAgICAgIFN0cmluZyBjb25uZWN0aW9uVVJMID0gcmZvcm0uZ2V0Q29ubmVjdGlvblVSTCgpOworICAgICAgICAgICAgaWYgKChjb25uZWN0aW9uVVJMICE9IG51bGwpICYmIChjb25uZWN0aW9uVVJMLmxlbmd0aCgpPjApKSB7CisgICAgICAgICAgICAgICAgbUJTZXJ2ZXIuc2V0QXR0cmlidXRlKHJvbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoImNvbm5lY3Rpb25VUkwiLCAgY29ubmVjdGlvblVSTCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAiY29udGV4dEZhY3RvcnkiOworICAgICAgICAgICAgU3RyaW5nIGNvbnRleHRGYWN0b3J5ID0gcmZvcm0uZ2V0Q29udGV4dEZhY3RvcnkoKTsKKyAgICAgICAgICAgIGlmICgoY29udGV4dEZhY3RvcnkgIT0gbnVsbCkgJiYgKGNvbnRleHRGYWN0b3J5Lmxlbmd0aCgpPjApKSB7CisgICAgICAgICAgICAgICAgbUJTZXJ2ZXIuc2V0QXR0cmlidXRlKHJvbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoImNvbnRleHRGYWN0b3J5IiwgIGNvbnRleHRGYWN0b3J5KSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJkaWdlc3QiOworICAgICAgICAgICAgU3RyaW5nIGRpZ2VzdCA9IHJmb3JtLmdldERpZ2VzdCgpOworICAgICAgICAgICAgaWYgKChkaWdlc3QgIT0gbnVsbCkgJiYgKGRpZ2VzdC5sZW5ndGgoKT4wKSkgeworICAgICAgICAgICAgICAgIG1CU2VydmVyLnNldEF0dHJpYnV0ZShyb25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZSgiZGlnZXN0IiwgZGlnZXN0KSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJyb2xlQmFzZSI7CisgICAgICAgICAgICBTdHJpbmcgcm9sZUJhc2UgPSByZm9ybS5nZXRSb2xlQmFzZSgpOworICAgICAgICAgICAgaWYgKChyb2xlQmFzZSAhPSBudWxsKSAmJiAocm9sZUJhc2UubGVuZ3RoKCk+MCkpIHsKKyAgICAgICAgICAgICAgICBtQlNlcnZlci5zZXRBdHRyaWJ1dGUocm9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZSgicm9sZUJhc2UiLCAgcm9sZUJhc2UpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXR0cmlidXRlID0gInJvbGVOYW1lIjsKKyAgICAgICAgICAgIFN0cmluZyByb2xlTmFtZSA9IHJmb3JtLmdldFJvbGVOYW1lKCk7CisgICAgICAgICAgICBpZiAoKHJvbGVOYW1lICE9IG51bGwpICYmIChyb2xlTmFtZS5sZW5ndGgoKT4wKSkgeworICAgICAgICAgICAgICAgIG1CU2VydmVyLnNldEF0dHJpYnV0ZShyb25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKCJyb2xlTmFtZSIsICByb2xlTmFtZSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAicm9sZVNlYXJjaCI7CisgICAgICAgICAgICBTdHJpbmcgcm9sZVBhdHRlcm4gPSByZm9ybS5nZXRSb2xlUGF0dGVybigpOworICAgICAgICAgICAgaWYgKChyb2xlUGF0dGVybiAhPSBudWxsKSAmJiAocm9sZVBhdHRlcm4ubGVuZ3RoKCk+MCkpIHsKKyAgICAgICAgICAgICAgICBtQlNlcnZlci5zZXRBdHRyaWJ1dGUocm9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZSgicm9sZVNlYXJjaCIsICByb2xlUGF0dGVybikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAicm9sZVN1YnRyZWUiOworICAgICAgICAgICAgU3RyaW5nIHJvbGVTdWJ0cmVlID0gcmZvcm0uZ2V0Um9sZVN1YnRyZWUoKTsKKyAgICAgICAgICAgIGlmICgocm9sZVN1YnRyZWUgIT0gbnVsbCkgJiYgKHJvbGVTdWJ0cmVlLmxlbmd0aCgpPjApKSB7CisgICAgICAgICAgICAgICAgbUJTZXJ2ZXIuc2V0QXR0cmlidXRlKHJvbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZSgicm9sZVN1YnRyZWUiLCAgbmV3IEJvb2xlYW4ocm9sZVN1YnRyZWUpKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJ1c2VyQmFzZSI7CisgICAgICAgICAgICBTdHJpbmcgdXNlckJhc2UgPSByZm9ybS5nZXRVc2VyQmFzZSgpOworICAgICAgICAgICAgaWYgKCh1c2VyQmFzZSAhPSBudWxsKSAmJiAodXNlckJhc2UubGVuZ3RoKCk+MCkpIHsKKyAgICAgICAgICAgICAgICBtQlNlcnZlci5zZXRBdHRyaWJ1dGUocm9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZSgidXNlckJhc2UiLCAgdXNlckJhc2UpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXR0cmlidXRlID0gInVzZXJQYXNzd29yZCI7CisgICAgICAgICAgICBTdHJpbmcgdXNlclBhc3N3b3JkID0gcmZvcm0uZ2V0VXNlclBhc3N3b3JkKCk7CisgICAgICAgICAgICBpZiAoKHVzZXJQYXNzd29yZCAhPSBudWxsKSAmJiAodXNlclBhc3N3b3JkLmxlbmd0aCgpPjApKSB7CisgICAgICAgICAgICAgICAgbUJTZXJ2ZXIuc2V0QXR0cmlidXRlKHJvbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoInVzZXJQYXNzd29yZCIsICB1c2VyUGFzc3dvcmQpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXR0cmlidXRlID0gInVzZXJQYXR0ZXJuIjsKKyAgICAgICAgICAgIFN0cmluZyB1c2VyUGF0dGVybiA9IHJmb3JtLmdldFVzZXJQYXR0ZXJuKCk7CisgICAgICAgICAgICBpZiAoKHVzZXJQYXR0ZXJuICE9IG51bGwpICYmICh1c2VyUGF0dGVybi5sZW5ndGgoKT4wKSkgeworICAgICAgICAgICAgICAgIG1CU2VydmVyLnNldEF0dHJpYnV0ZShyb25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKCJ1c2VyUGF0dGVybiIsICB1c2VyUGF0dGVybikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAidXNlclJvbGVOYW1lIjsKKyAgICAgICAgICAgIFN0cmluZyB1c2VyUm9sZU5hbWUgPSByZm9ybS5nZXRVc2VyUm9sZU5hbWUoKTsKKyAgICAgICAgICAgIGlmICgodXNlclJvbGVOYW1lICE9IG51bGwpICYmICh1c2VyUm9sZU5hbWUubGVuZ3RoKCk+MCkpIHsKKyAgICAgICAgICAgICAgICBtQlNlcnZlci5zZXRBdHRyaWJ1dGUocm9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZSgidXNlclJvbGVOYW1lIiwgIHVzZXJSb2xlTmFtZSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAidXNlclNlYXJjaCI7CisgICAgICAgICAgICBTdHJpbmcgdXNlclNlYXJjaCA9IHJmb3JtLmdldFVzZXJTZWFyY2goKTsKKyAgICAgICAgICAgIGlmICgodXNlclNlYXJjaCAhPSBudWxsKSAmJiAodXNlclNlYXJjaC5sZW5ndGgoKT4wKSkgeworICAgICAgICAgICAgICAgIG1CU2VydmVyLnNldEF0dHJpYnV0ZShyb25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKCJ1c2VyU2VhcmNoIiwgIHVzZXJTZWFyY2gpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXR0cmlidXRlID0gInVzZXJTdWJ0cmVlIjsKKyAgICAgICAgICAgIFN0cmluZyB1c2VyU3VidHJlZSA9IHJmb3JtLmdldFVzZXJTdWJ0cmVlKCk7CisgICAgICAgICAgICBpZiAoKHVzZXJTdWJ0cmVlICE9IG51bGwpICYmICh1c2VyU3VidHJlZS5sZW5ndGgoKT4wKSkgeworICAgICAgICAgICAgICAgIG1CU2VydmVyLnNldEF0dHJpYnV0ZShyb25hbWUsCisgICAgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoInVzZXJTdWJ0cmVlIiwgIG5ldyBCb29sZWFuKHVzZXJTdWJ0cmVlKSkpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisKKyAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuYXR0cmlidXRlLnNldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSksIGUpOworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5hdHRyaWJ1dGUuc2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlKSk7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgLy8gRm9yd2FyZCB0byB0aGUgc3VjY2VzcyByZXBvcnRpbmcgcGFnZQorICAgICAgICBzZXNzaW9uLnJlbW92ZUF0dHJpYnV0ZShtYXBwaW5nLmdldEF0dHJpYnV0ZSgpKTsKKyAgICAgICAgcmV0dXJuIChtYXBwaW5nLmZpbmRGb3J3YXJkKCJTYXZlIFN1Y2Nlc3NmdWwiKSk7CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZWFsbS9TYXZlTWVtb3J5UmVhbG1BY3Rpb24uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZWFsbS9TYXZlTWVtb3J5UmVhbG1BY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTY4ZWRhCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3JlYWxtL1NhdmVNZW1vcnlSZWFsbUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjQzIEBACisvKgorICogQ29weXJpZ2h0IDIwMDEtMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5yZWFsbTsKKworCitpbXBvcnQgamF2YS5uZXQuVVJMRW5jb2RlcjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuQXR0cmlidXRlOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlckZhY3Rvcnk7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5RdWVyeUV4cDsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LlF1ZXJ5OworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0SW5zdGFuY2U7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuSk1FeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkVycm9yOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25FcnJvcnM7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcndhcmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMudXRpbC5NZXNzYWdlUmVzb3VyY2VzOworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkFwcGxpY2F0aW9uU2VydmxldDsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5Ub21jYXRUcmVlQnVpbGRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5UcmVlQ29udHJvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5UcmVlQ29udHJvbE5vZGU7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4udmFsdmUuVmFsdmVVdGlsOworCisvKioKKyAqIFRoZSA8Y29kZT5BY3Rpb248L2NvZGU+IHRoYXQgY29tcGxldGVzIDxlbT5BZGQgUmVhbG08L2VtPiBhbmQKKyAqIDxlbT5FZGl0IFJlYWxtPC9lbT4gdHJhbnNhY3Rpb25zIGZvciBNZW1vcnkgcmVhbG0uCisgKgorICogQGF1dGhvciBNYW52ZWVuIEthdXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIFNhdmVNZW1vcnlSZWFsbUFjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisgICAgLyoqCisgICAgICogU2lnbmF0dXJlIGZvciB0aGUgPGNvZGU+Y3JlYXRlU3RhbmRhcmRSZWFsbTwvY29kZT4gb3BlcmF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGNyZWF0ZVN0YW5kYXJkUmVhbG1UeXBlc1tdID0KKyAgICB7ICJqYXZhLmxhbmcuU3RyaW5nIiwgICAgIC8vIHBhcmVudAorICAgIH07CisKKworICAgIC8qKgorICAgICAqIFRoZSBNQmVhblNlcnZlciB3ZSB3aWxsIGJlIGludGVyYWN0aW5nIHdpdGguCisgICAgICovCisgICAgcHJpdmF0ZSBNQmVhblNlcnZlciBtQlNlcnZlciA9IG51bGw7CisgICAgCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBzcGVjaWZpZWQgSFRUUCByZXF1ZXN0LCBhbmQgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIEhUVFAKKyAgICAgKiByZXNwb25zZSAob3IgZm9yd2FyZCB0byBhbm90aGVyIHdlYiBjb21wb25lbnQgdGhhdCB3aWxsIGNyZWF0ZSBpdCkuCisgICAgICogUmV0dXJuIGFuIDxjb2RlPkFjdGlvbkZvcndhcmQ8L2NvZGU+IGluc3RhbmNlIGRlc2NyaWJpbmcgd2hlcmUgYW5kIGhvdworICAgICAqIGNvbnRyb2wgc2hvdWxkIGJlIGZvcndhcmRlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHJlc3BvbnNlIGhhcworICAgICAqIGFscmVhZHkgYmVlbiBjb21wbGV0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgQWN0aW9uTWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIGFjdGlvbkZvcm0gVGhlIG9wdGlvbmFsIEFjdGlvbkZvcm0gYmVhbiBmb3IgdGhpcyByZXF1ZXN0IChpZiBhbnkpCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIEhUVFAgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgSFRUUCByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXhjZXB0aW9uIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBBY3Rpb25Gb3J3YXJkIHBlcmZvcm0oQWN0aW9uTWFwcGluZyBtYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uRm9ybSBmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworICAgICAgICAKKyAgICAgICAgLy8gQWNxdWlyZSB0aGUgcmVzb3VyY2VzIHRoYXQgd2UgbmVlZAorICAgICAgICBIdHRwU2Vzc2lvbiBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uKCk7CisgICAgICAgIExvY2FsZSBsb2NhbGUgPSBnZXRMb2NhbGUocmVxdWVzdCk7CisgICAgICAgIE1lc3NhZ2VSZXNvdXJjZXMgcmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VzKHJlcXVlc3QpOworICAgICAgICAKKyAgICAgICAgLy8gQWNxdWlyZSBhIHJlZmVyZW5jZSB0byB0aGUgTUJlYW5TZXJ2ZXIgY29udGFpbmluZyBvdXIgTUJlYW5zCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtQlNlcnZlciA9ICgoQXBwbGljYXRpb25TZXJ2bGV0KSBnZXRTZXJ2bGV0KCkpLmdldFNlcnZlcigpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24KKyAgICAgICAgICAgICgiQ2Fubm90IGFjcXVpcmUgTUJlYW5TZXJ2ZXIgcmVmZXJlbmNlIiwgdCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIElkZW50aWZ5IHRoZSByZXF1ZXN0ZWQgYWN0aW9uCisgICAgICAgIE1lbW9yeVJlYWxtRm9ybSByZm9ybSA9IChNZW1vcnlSZWFsbUZvcm0pIGZvcm07CisgICAgICAgIFN0cmluZyBhZG1pbkFjdGlvbiA9IHJmb3JtLmdldEFkbWluQWN0aW9uKCk7CisgICAgICAgIFN0cmluZyByT2JqZWN0TmFtZSA9IHJmb3JtLmdldE9iamVjdE5hbWUoKTsKKworICAgICAgICAvLyBQZXJmb3JtIGEgIkNyZWF0ZSBNZW1vcnkgUmVhbG0iIHRyYW5zYWN0aW9uIChpZiByZXF1ZXN0ZWQpCisgICAgICAgIGlmICgiQ3JlYXRlIi5lcXVhbHMoYWRtaW5BY3Rpb24pKSB7CisKKyAgICAgICAgICAgIFN0cmluZyBvcGVyYXRpb24gPSBudWxsOworICAgICAgICAgICAgU3RyaW5nIHZhbHVlc1tdID0gbnVsbDsKKworICAgICAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgICAgIFN0cmluZyBwYXJlbnQgPSByZm9ybS5nZXRQYXJlbnRPYmplY3ROYW1lKCk7ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIFN0cmluZyBvYmplY3ROYW1lID0gVmFsdmVVdGlsLmdldE9iamVjdE5hbWUocGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9tY2F0VHJlZUJ1aWxkZXIuUkVBTE1fVFlQRSk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSBwbmFtZSA9IG5ldyBPYmplY3ROYW1lKHBhcmVudCk7CisgICAgICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihwbmFtZS5nZXREb21haW4oKSk7ICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBGb3Igc2VydmljZSwgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIEVuZ2luZSBtQmVhbiAgCisgICAgICAgICAgICAgICAgLy8gUGFyZW50IGluIHRoaXMgY2FzZSBuZWVkcyB0byBiZSB0aGUgY29udGFpbmVyIG1CZWFuIGZvciB0aGUgc2VydmljZSAKKyAgICAgICAgICAgICAgICB0cnkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGlmICgiU2VydmljZSIuZXF1YWxzSWdub3JlQ2FzZShwbmFtZS5nZXRLZXlQcm9wZXJ0eSgidHlwZSIpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCI6dHlwZT1FbmdpbmUiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudCA9IHNiLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9CisgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJlcnJvci5lbmdpbmVOYW1lLmJhZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19CQURfUkVRVUVTVCwgbWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gRW5zdXJlIHRoYXQgdGhlIHJlcXVlc3RlZCB1c2VyIGRhdGFiYXNlIG5hbWUgaXMgdW5pcXVlCisgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3ROYW1lKG9iamVjdE5hbWUpOworICAgICAgICAgICAgICAgIGlmIChtQlNlcnZlci5pc1JlZ2lzdGVyZWQob25hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIEFjdGlvbkVycm9ycyBlcnJvcnMgPSBuZXcgQWN0aW9uRXJyb3JzKCk7CisgICAgICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoInJlYWxtTmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFjdGlvbkVycm9yKCJlcnJvci5yZWFsbU5hbWUuZXhpc3RzIikpOworICAgICAgICAgICAgICAgICAgICBzYXZlRXJyb3JzKHJlcXVlc3QsIGVycm9ycyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAobmV3IEFjdGlvbkZvcndhcmQobWFwcGluZy5nZXRJbnB1dCgpKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgU3RyaW5nIGRvbWFpbiA9IG9uYW1lLmdldERvbWFpbigpOworICAgICAgICAgICAgICAgIC8vIExvb2sgdXAgb3VyIE1CZWFuRmFjdG9yeSBNQmVhbgorICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgZm5hbWUgPSBUb21jYXRUcmVlQnVpbGRlci5nZXRNQmVhbkZhY3RvcnkoKTsKKworICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBTdGFuZGFyZFJlYWxtIG9iamVjdAorICAgICAgICAgICAgICAgIHZhbHVlcyA9IG5ldyBTdHJpbmdbMV07CisgICAgICAgICAgICAgICAgdmFsdWVzWzBdID0gcGFyZW50OworICAgICAgICAgICAgICAgIG9wZXJhdGlvbiA9ICJjcmVhdGVNZW1vcnlSZWFsbSI7CisgICAgICAgICAgICAgICAgck9iamVjdE5hbWUgPSAoU3RyaW5nKQorICAgICAgICAgICAgICAgICAgICBtQlNlcnZlci5pbnZva2UoZm5hbWUsIG9wZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcywgY3JlYXRlU3RhbmRhcmRSZWFsbVR5cGVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgbmV3IFJlYWxtIHRvIG91ciB0cmVlIGNvbnRyb2wgbm9kZQorICAgICAgICAgICAgICAgIFRyZWVDb250cm9sIGNvbnRyb2wgPSAoVHJlZUNvbnRyb2wpCisgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0QXR0cmlidXRlKCJ0cmVlQ29udHJvbFRlc3QiKTsKKyAgICAgICAgICAgICAgICBpZiAoY29udHJvbCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIFRyZWVDb250cm9sTm9kZSBwYXJlbnROb2RlID0gY29udHJvbC5maW5kTm9kZShyZm9ybS5nZXRQYXJlbnRPYmplY3ROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50Tm9kZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbm9kZUxhYmVsID0gcmZvcm0uZ2V0Tm9kZUxhYmVsKCk7ICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZW5jb2RlZE5hbWUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHJPYmplY3ROYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRyZWVDb250cm9sTm9kZSBjaGlsZE5vZGUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUcmVlQ29udHJvbE5vZGUock9iamVjdE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVhbG0uZ2lmIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVMYWJlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFZGl0UmVhbG0uZG8/c2VsZWN0PSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udGVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCBkb21haW4pOworICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50Tm9kZS5hZGRDaGlsZChjaGlsZE5vZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgLSBmb3JjZSBhIHJlZGlzcGxheQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiQ2Fubm90IGZpbmQgcGFyZW50IG5vZGUgJyIgKyBwYXJlbnQgKyAiJyIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZworICAgICAgICAgICAgICAgICAgICAgICAgKCJDYW5ub3QgZmluZCBUcmVlQ29udHJvbE5vZGUhIik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCisgICAgICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZworICAgICAgICAgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuaW52b2tlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbiksIGUpOworICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5pbnZva2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICAvLyBQZXJmb3JtIGF0dHJpYnV0ZSB1cGRhdGVzIGFzIHJlcXVlc3RlZAorICAgICAgICBTdHJpbmcgYXR0cmlidXRlID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgT2JqZWN0TmFtZSByb25hbWUgPSBuZXcgT2JqZWN0TmFtZShyT2JqZWN0TmFtZSk7CisKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJwYXRobmFtZSI7CisgICAgICAgICAgICBtQlNlcnZlci5zZXRBdHRyaWJ1dGUocm9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoInBhdGhuYW1lIiwgIHJmb3JtLmdldFBhdGhOYW1lKCkpKTsKKworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCisgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nCisgICAgICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmF0dHJpYnV0ZS5zZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUpLCBlKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuYXR0cmlidXRlLnNldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSkpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gRm9yd2FyZCB0byB0aGUgc3VjY2VzcyByZXBvcnRpbmcgcGFnZQorICAgICAgICBzZXNzaW9uLnJlbW92ZUF0dHJpYnV0ZShtYXBwaW5nLmdldEF0dHJpYnV0ZSgpKTsKKyAgICAgICAgcmV0dXJuIChtYXBwaW5nLmZpbmRGb3J3YXJkKCJTYXZlIFN1Y2Nlc3NmdWwiKSk7CisgICAgICAgIAorICAgIH0KKyAgICAKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZWFsbS9TYXZlVXNlckRhdGFiYXNlUmVhbG1BY3Rpb24uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZWFsbS9TYXZlVXNlckRhdGFiYXNlUmVhbG1BY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGZmODUwCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3JlYWxtL1NhdmVVc2VyRGF0YWJhc2VSZWFsbUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjQ5IEBACisvKgorICogQ29weXJpZ2h0IDIwMDEtMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5yZWFsbTsKKworCitpbXBvcnQgamF2YS5uZXQuVVJMRW5jb2RlcjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuQXR0cmlidXRlOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlckZhY3Rvcnk7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5RdWVyeUV4cDsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LlF1ZXJ5OworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0SW5zdGFuY2U7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuSk1FeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkVycm9yOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25FcnJvcnM7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcndhcmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMudXRpbC5NZXNzYWdlUmVzb3VyY2VzOworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkFwcGxpY2F0aW9uU2VydmxldDsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5Ub21jYXRUcmVlQnVpbGRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5UcmVlQ29udHJvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5UcmVlQ29udHJvbE5vZGU7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4udmFsdmUuVmFsdmVVdGlsOworCisvKioKKyAqIFRoZSA8Y29kZT5BY3Rpb248L2NvZGU+IHRoYXQgY29tcGxldGVzIDxlbT5BZGQgUmVhbG08L2VtPiBhbmQKKyAqIDxlbT5FZGl0IFJlYWxtPC9lbT4gdHJhbnNhY3Rpb25zIGZvciBVc2VyRGF0YWJhc2UgcmVhbG0uCisgKgorICogQGF1dGhvciBNYW52ZWVuIEthdXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIFNhdmVVc2VyRGF0YWJhc2VSZWFsbUFjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisgICAgLyoqCisgICAgICogU2lnbmF0dXJlIGZvciB0aGUgPGNvZGU+Y3JlYXRlVXNlckRhdGFiYXNlUmVhbG08L2NvZGU+IG9wZXJhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBjcmVhdGVVc2VyRGF0YWJhc2VSZWFsbVR5cGVzW10gPQorICAgIHsgImphdmEubGFuZy5TdHJpbmciLCAgICAgLy8gcGFyZW50CisgICAgICAiamF2YS5sYW5nLlN0cmluZyIsICAgICAvLyBuYW1lCisgICAgfTsKKworCisgICAgLyoqCisgICAgICogVGhlIE1CZWFuU2VydmVyIHdlIHdpbGwgYmUgaW50ZXJhY3Rpbmcgd2l0aC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1CZWFuU2VydmVyIG1CU2VydmVyID0gbnVsbDsKKyAgICAKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIHNwZWNpZmllZCBIVFRQIHJlcXVlc3QsIGFuZCBjcmVhdGUgdGhlIGNvcnJlc3BvbmRpbmcgSFRUUAorICAgICAqIHJlc3BvbnNlIChvciBmb3J3YXJkIHRvIGFub3RoZXIgd2ViIGNvbXBvbmVudCB0aGF0IHdpbGwgY3JlYXRlIGl0KS4KKyAgICAgKiBSZXR1cm4gYW4gPGNvZGU+QWN0aW9uRm9yd2FyZDwvY29kZT4gaW5zdGFuY2UgZGVzY3JpYmluZyB3aGVyZSBhbmQgaG93CisgICAgICogY29udHJvbCBzaG91bGQgYmUgZm9yd2FyZGVkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcmVzcG9uc2UgaGFzCisgICAgICogYWxyZWFkeSBiZWVuIGNvbXBsZXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBBY3Rpb25NYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gYWN0aW9uRm9ybSBUaGUgb3B0aW9uYWwgQWN0aW9uRm9ybSBiZWFuIGZvciB0aGlzIHJlcXVlc3QgKGlmIGFueSkKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgSFRUUCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBIVFRQIHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBleGNlcHRpb24gb2NjdXJzCisgICAgICovCisgICAgcHVibGljIEFjdGlvbkZvcndhcmQgcGVyZm9ybShBY3Rpb25NYXBwaW5nIG1hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb25Gb3JtIGZvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisgICAgICAgIAorICAgICAgICAvLyBBY3F1aXJlIHRoZSByZXNvdXJjZXMgdGhhdCB3ZSBuZWVkCisgICAgICAgIEh0dHBTZXNzaW9uIHNlc3Npb24gPSByZXF1ZXN0LmdldFNlc3Npb24oKTsKKyAgICAgICAgTG9jYWxlIGxvY2FsZSA9IGdldExvY2FsZShyZXF1ZXN0KTsKKyAgICAgICAgTWVzc2FnZVJlc291cmNlcyByZXNvdXJjZXMgPSBnZXRSZXNvdXJjZXMocmVxdWVzdCk7CisgICAgICAgIAorICAgICAgICAvLyBBY3F1aXJlIGEgcmVmZXJlbmNlIHRvIHRoZSBNQmVhblNlcnZlciBjb250YWluaW5nIG91ciBNQmVhbnMKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1CU2VydmVyID0gKChBcHBsaWNhdGlvblNlcnZsZXQpIGdldFNlcnZsZXQoKSkuZ2V0U2VydmVyKCk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbgorICAgICAgICAgICAgKCJDYW5ub3QgYWNxdWlyZSBNQmVhblNlcnZlciByZWZlcmVuY2UiLCB0KTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gSWRlbnRpZnkgdGhlIHJlcXVlc3RlZCBhY3Rpb24KKyAgICAgICAgVXNlckRhdGFiYXNlUmVhbG1Gb3JtIHJmb3JtID0gKFVzZXJEYXRhYmFzZVJlYWxtRm9ybSkgZm9ybTsKKyAgICAgICAgU3RyaW5nIGFkbWluQWN0aW9uID0gcmZvcm0uZ2V0QWRtaW5BY3Rpb24oKTsKKyAgICAgICAgU3RyaW5nIHJPYmplY3ROYW1lID0gcmZvcm0uZ2V0T2JqZWN0TmFtZSgpOworCisgICAgICAgIC8vIFBlcmZvcm0gYSAiQ3JlYXRlIFVzZXJEYXRhYmFzZSBSZWFsbSIgdHJhbnNhY3Rpb24gKGlmIHJlcXVlc3RlZCkKKyAgICAgICAgaWYgKCJDcmVhdGUiLmVxdWFscyhhZG1pbkFjdGlvbikpIHsKKworICAgICAgICAgICAgU3RyaW5nIG9wZXJhdGlvbiA9IG51bGw7CisgICAgICAgICAgICBTdHJpbmcgdmFsdWVzW10gPSBudWxsOworCisgICAgICAgICAgICB0cnkgeworCisgICAgICAgICAgICAgICAgU3RyaW5nIHBhcmVudCA9IHJmb3JtLmdldFBhcmVudE9iamVjdE5hbWUoKTsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgU3RyaW5nIG9iamVjdE5hbWUgPSBWYWx2ZVV0aWwuZ2V0T2JqZWN0TmFtZShwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb21jYXRUcmVlQnVpbGRlci5SRUFMTV9UWVBFKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBPYmplY3ROYW1lIHBuYW1lID0gbmV3IE9iamVjdE5hbWUocGFyZW50KTsKKyAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKHBuYW1lLmdldERvbWFpbigpKTsgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIEZvciBzZXJ2aWNlLCBjcmVhdGUgdGhlIGNvcnJlc3BvbmRpbmcgRW5naW5lIG1CZWFuICAKKyAgICAgICAgICAgICAgICAvLyBQYXJlbnQgaW4gdGhpcyBjYXNlIG5lZWRzIHRvIGJlIHRoZSBjb250YWluZXIgbUJlYW4gZm9yIHRoZSBzZXJ2aWNlIAorICAgICAgICAgICAgICAgIHRyeSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgaWYgKCJTZXJ2aWNlIi5lcXVhbHNJZ25vcmVDYXNlKHBuYW1lLmdldEtleVByb3BlcnR5KCJ0eXBlIikpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIjp0eXBlPUVuZ2luZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gc2IudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgImVycm9yLmVuZ2luZU5hbWUuYmFkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcihIdHRwU2VydmxldFJlc3BvbnNlLlNDX0JBRF9SRVFVRVNULCBtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGUgcmVxdWVzdGVkIHVzZXIgZGF0YWJhc2UgbmFtZSBpcyB1bmlxdWUKKyAgICAgICAgICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdE5hbWUob2JqZWN0TmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKG1CU2VydmVyLmlzUmVnaXN0ZXJlZChvbmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgQWN0aW9uRXJyb3JzIGVycm9ycyA9IG5ldyBBY3Rpb25FcnJvcnMoKTsKKyAgICAgICAgICAgICAgICAgICAgZXJyb3JzLmFkZCgicmVhbG1OYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQWN0aW9uRXJyb3IoImVycm9yLnJlYWxtTmFtZS5leGlzdHMiKSk7CisgICAgICAgICAgICAgICAgICAgIHNhdmVFcnJvcnMocmVxdWVzdCwgZXJyb3JzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChuZXcgQWN0aW9uRm9yd2FyZChtYXBwaW5nLmdldElucHV0KCkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgU3RyaW5nIGRvbWFpbiA9IG9uYW1lLmdldERvbWFpbigpOworICAgICAgICAgICAgICAgIC8vIExvb2sgdXAgb3VyIE1CZWFuRmFjdG9yeSBNQmVhbgorICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgZm5hbWUgPSBUb21jYXRUcmVlQnVpbGRlci5nZXRNQmVhbkZhY3RvcnkoKTsKKworICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBTdGFuZGFyZFJlYWxtIG9iamVjdAorICAgICAgICAgICAgICAgIHZhbHVlcyA9IG5ldyBTdHJpbmdbMl07CisgICAgICAgICAgICAgICAgdmFsdWVzWzBdID0gcGFyZW50OworICAgICAgICAgICAgICAgIHZhbHVlc1sxXSA9IHJmb3JtLmdldFJlc291cmNlKCk7CisgICAgICAgICAgICAgICAgb3BlcmF0aW9uID0gImNyZWF0ZVVzZXJEYXRhYmFzZVJlYWxtIjsKKyAgICAgICAgICAgICAgICByT2JqZWN0TmFtZSA9IChTdHJpbmcpCisgICAgICAgICAgICAgICAgICAgIG1CU2VydmVyLmludm9rZShmbmFtZSwgb3BlcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLCBjcmVhdGVVc2VyRGF0YWJhc2VSZWFsbVR5cGVzKTsKKyAgICAgICAgICAgICAgICBpZiAock9iamVjdE5hbWU9PW51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5zZXRBdHRyaWJ1dGUoIndhcm5pbmciLCAiZXJyb3IudXNlcmRicmVhbG0iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChtYXBwaW5nLmZpbmRGb3J3YXJkKCJTYXZlIFVuc3VjY2Vzc2Z1bCIpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIG5ldyBSZWFsbSB0byBvdXIgdHJlZSBjb250cm9sIG5vZGUKKyAgICAgICAgICAgICAgICBUcmVlQ29udHJvbCBjb250cm9sID0gKFRyZWVDb250cm9sKQorICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldEF0dHJpYnV0ZSgidHJlZUNvbnRyb2xUZXN0Iik7CisgICAgICAgICAgICAgICAgaWYgKGNvbnRyb2wgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBUcmVlQ29udHJvbE5vZGUgcGFyZW50Tm9kZSA9IGNvbnRyb2wuZmluZE5vZGUocmZvcm0uZ2V0UGFyZW50T2JqZWN0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudE5vZGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5vZGVMYWJlbCA9IHJmb3JtLmdldE5vZGVMYWJlbCgpOyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVuY29kZWROYW1lID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShyT2JqZWN0TmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBUcmVlQ29udHJvbE5vZGUgY2hpbGROb2RlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVHJlZUNvbnRyb2xOb2RlKHJPYmplY3ROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlYWxtLmdpZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlTGFiZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRWRpdFJlYWxtLmRvP3NlbGVjdD0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZWROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRlbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgZG9tYWluKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudE5vZGUuYWRkQ2hpbGQoY2hpbGROb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIC0gZm9yY2UgYSByZWRpc3BsYXkKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIkNhbm5vdCBmaW5kIHBhcmVudCBub2RlICciICsgcGFyZW50ICsgIiciKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAgICAgICAgICgiQ2Fubm90IGZpbmQgVHJlZUNvbnRyb2xOb2RlISIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKworICAgICAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmludm9rZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24pLCBlKTsKKyAgICAgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuaW52b2tlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbikpOworICAgICAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgLy8gUGVyZm9ybSBhdHRyaWJ1dGUgdXBkYXRlcyBhcyByZXF1ZXN0ZWQKKyAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZSA9IG51bGw7CisgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgIE9iamVjdE5hbWUgcm9uYW1lID0gbmV3IE9iamVjdE5hbWUock9iamVjdE5hbWUpOworCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAicmVzb3VyY2VOYW1lIjsKKyAgICAgICAgICAgIG1CU2VydmVyLnNldEF0dHJpYnV0ZShyb25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZSgicmVzb3VyY2VOYW1lIiwgIHJmb3JtLmdldFJlc291cmNlKCkpKTsKKworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCisgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nCisgICAgICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmF0dHJpYnV0ZS5zZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUpLCBlKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuYXR0cmlidXRlLnNldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSkpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gRm9yd2FyZCB0byB0aGUgc3VjY2VzcyByZXBvcnRpbmcgcGFnZQorICAgICAgICBzZXNzaW9uLnJlbW92ZUF0dHJpYnV0ZShtYXBwaW5nLmdldEF0dHJpYnV0ZSgpKTsKKyAgICAgICAgcmV0dXJuIChtYXBwaW5nLmZpbmRGb3J3YXJkKCJTYXZlIFN1Y2Nlc3NmdWwiKSk7CisgICAgICAgIAorICAgIH0KKyAgICAKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZWFsbS9Vc2VyRGF0YWJhc2VSZWFsbUZvcm0uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZWFsbS9Vc2VyRGF0YWJhc2VSZWFsbUZvcm0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzEyMzk1Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3JlYWxtL1VzZXJEYXRhYmFzZVJlYWxtRm9ybS5qYXZhCkBAIC0wLDAgKzEsMTI3IEBACisvKgorICogQ29weXJpZ2h0IDIwMDEsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVhbG07CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25FcnJvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRXJyb3JzOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uQXBwbGljYXRpb25TZXJ2bGV0OworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkxhYmVsVmFsdWVCZWFuOworCisvKioKKyAqIEZvcm0gYmVhbiBmb3IgdGhlIFVzZXIgRGF0YWJhc2UgcmVhbG0gcGFnZS4KKyAqCisgKiBAYXV0aG9yIE1hbnZlZW4gS2F1cgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgVXNlckRhdGFiYXNlUmVhbG1Gb3JtIGV4dGVuZHMgUmVhbG1Gb3JtIHsKKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciB0aGUgcmVzb3VyY2UgbmFtZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyByZXNvdXJjZSA9IG51bGw7CisgICAgICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcmVzb3VyY2UgTmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlKCkgeworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXMucmVzb3VyY2U7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHJlc291cmNlIE5hbWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVzb3VyY2UoU3RyaW5nIHJlc291cmNlKSB7CisgICAgICAgIAorICAgICAgICB0aGlzLnJlc291cmNlID0gcmVzb3VyY2U7CisgICAgICAgIAorICAgIH0KKyAgICAgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisgICAgCisgICAgLyoqCisgICAgICogUmVzZXQgYWxsIHByb3BlcnRpZXMgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgbWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlc2V0KEFjdGlvbk1hcHBpbmcgbWFwcGluZywgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgCisgICAgICAgIHN1cGVyLnJlc2V0KG1hcHBpbmcsIHJlcXVlc3QpOworICAgICAgICB0aGlzLnJlc291cmNlID0gbnVsbDsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgLyoqCisgICAgICogUmVuZGVyIHRoaXMgb2JqZWN0IGFzIGEgU3RyaW5nLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiVXNlckRhdGFiYXNlUmVhbG1Gb3JtW2FkbWluQWN0aW9uPSIpOworICAgICAgICBzYi5hcHBlbmQoZ2V0QWRtaW5BY3Rpb24oKSk7CisgICAgICAgIHNiLmFwcGVuZCgiLHJlc291cmNlPSIpOworICAgICAgICBzYi5hcHBlbmQoZ2V0UmVzb3VyY2UoKSk7CisgICAgICAgIHNiLmFwcGVuZCgiJyxvYmplY3ROYW1lPSciKTsKKyAgICAgICAgc2IuYXBwZW5kKGdldE9iamVjdE5hbWUoKSk7CisgICAgICAgIHNiLmFwcGVuZCgiJyxyZWFsbVR5cGU9Iik7CisgICAgICAgIHNiLmFwcGVuZChnZXRSZWFsbVR5cGUoKSk7CisgICAgICAgIHNiLmFwcGVuZCgiXSIpOworICAgICAgICByZXR1cm4gKHNiLnRvU3RyaW5nKCkpOworCisgICAgfQorCisgICAgLyoqCisgICAgICogVmFsaWRhdGUgdGhlIHByb3BlcnRpZXMgdGhhdCBoYXZlIGJlZW4gc2V0IGZyb20gdGhpcyBIVFRQIHJlcXVlc3QsCisgICAgICogYW5kIHJldHVybiBhbiA8Y29kZT5BY3Rpb25FcnJvcnM8L2NvZGU+IG9iamVjdCB0aGF0IGVuY2Fwc3VsYXRlcyBhbnkKKyAgICAgKiB2YWxpZGF0aW9uIGVycm9ycyB0aGF0IGhhdmUgYmVlbiBmb3VuZC4gIElmIG5vIGVycm9ycyBhcmUgZm91bmQsIHJldHVybgorICAgICAqIDxjb2RlPm51bGw8L2NvZGU+IG9yIGFuIDxjb2RlPkFjdGlvbkVycm9yczwvY29kZT4gb2JqZWN0IHdpdGggbm8KKyAgICAgKiByZWNvcmRlZCBlcnJvciBtZXNzYWdlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBtYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICovCisgICAgCisgICAgcHVibGljIEFjdGlvbkVycm9ycyB2YWxpZGF0ZShBY3Rpb25NYXBwaW5nIG1hcHBpbmcsCisgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgCisgICAgICAgIEFjdGlvbkVycm9ycyBlcnJvcnMgPSBuZXcgQWN0aW9uRXJyb3JzKCk7CisgICAgICAgIAorICAgICAgICBTdHJpbmcgc3VibWl0ID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoInN1Ym1pdCIpOworICAgICAgICAKKyAgICAgICAgLy8gZnJvbnQgZW5kIHZhbGlkYXRpb24gd2hlbiBzYXZlIGlzIGNsaWNrZWQuCisgICAgICAgIC8vaWYgKHN1Ym1pdCAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoKHJlc291cmNlID09IG51bGwpIHx8IChyZXNvdXJjZS5sZW5ndGgoKSA8IDEpKSB7CisgICAgICAgICAgICAgICAgZXJyb3JzLmFkZCgicmVzb3VyY2UiLAorICAgICAgICAgICAgICAgIG5ldyBBY3Rpb25FcnJvcigiZXJyb3IucmVzb3VyY2UucmVxdWlyZWQiKSk7CisgICAgICAgICAgICB9CisgICAgICAgIC8vfQorICAgICAgICByZXR1cm4gZXJyb3JzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZXNvdXJjZXMvQmFzZUZvcm0uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZXNvdXJjZXMvQmFzZUZvcm0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjQ3YTJiCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3Jlc291cmNlcy9CYXNlRm9ybS5qYXZhCkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5yZXNvdXJjZXM7CisKKworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25FcnJvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRXJyb3JzOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworCisKKy8qKgorICogQmFzZSBjbGFzcyBmb3IgZm9ybSBiZWFucyBmb3IgdGhlIHJlc291cmNlIGFkbWluaXN0cmF0aW9uLgorICoKKyAqIEBhdXRob3IgTWFudmVlbiBLYXVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICogQHNpbmNlIDQuMQorICovCisKK3B1YmxpYyBjbGFzcyBCYXNlRm9ybSBleHRlbmRzIEFjdGlvbkZvcm0geworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKyAgICAvKioKKyAgICAgKiBUaGUgbm9kZSBsYWJlbCB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIHVzZXIgaW50ZXJmYWNlLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIG5vZGVMYWJlbCA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5vZGVMYWJlbCgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLm5vZGVMYWJlbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Tm9kZUxhYmVsKFN0cmluZyBub2RlTGFiZWwpIHsKKyAgICAgICAgdGhpcy5ub2RlTGFiZWwgPSBub2RlTGFiZWw7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgTUJlYW4gb2JqZWN0IG5hbWUgb2YgdGhpcyBvYmplY3QuICBBIG51bGwgb3IgemVyby1sZW5ndGgKKyAgICAgKiB2YWx1ZSBpbmRpY2F0ZXMgdGhhdCB0aGlzIGlzIGEgbmV3IG9iamVjdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBvYmplY3ROYW1lID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0T2JqZWN0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLm9iamVjdE5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE9iamVjdE5hbWUoU3RyaW5nIG9iamVjdE5hbWUpIHsKKyAgICAgICAgaWYgKChvYmplY3ROYW1lICE9IG51bGwpICYmIChvYmplY3ROYW1lLmxlbmd0aCgpIDwgMSkpIHsKKyAgICAgICAgICAgIHRoaXMub2JqZWN0TmFtZSA9IG51bGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aGlzLm9iamVjdE5hbWUgPSBvYmplY3ROYW1lOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworICAgIC8qKgorICAgICAqIFJlc2V0IGFsbCBwcm9wZXJ0aWVzIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIG1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZXNldChBY3Rpb25NYXBwaW5nIG1hcHBpbmcsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisKKyAgICAgICAgbm9kZUxhYmVsID0gbnVsbDsKKyAgICAgICAgb2JqZWN0TmFtZSA9IG51bGw7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3Jlc291cmNlcy9EYXRhU291cmNlRm9ybS5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3Jlc291cmNlcy9EYXRhU291cmNlRm9ybS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwYjA1YzcKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVzb3VyY2VzL0RhdGFTb3VyY2VGb3JtLmphdmEKQEAgLTAsMCArMSwzOTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRXJyb3I7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkVycm9yczsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9ybTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5MYWJlbFZhbHVlQmVhbjsKKworLyoqCisgKiBGb3JtIGJlYW4gZm9yIHRoZSBpbmRpdmlkdWFsIGRhdGEgc291cmNlIHBhZ2UuCisgKgorICogQGF1dGhvciBNYW52ZWVuIEthdXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKiBAc2luY2UgNC4xCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIERhdGFTb3VyY2VGb3JtIGV4dGVuZHMgQmFzZUZvcm0geworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFRoZSB1cmwgb2YgdGhlIGRhdGEgc291cmNlLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHVybCA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFVybCgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLnVybCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VXJsKFN0cmluZyB1cmwpIHsKKyAgICAgICAgdGhpcy51cmwgPSB1cmw7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIEpOREkgbmFtZSBvZiB0aGUgZGF0YSBzb3VyY2UuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgam5kaU5hbWUgPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXRKbmRpTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLmpuZGlOYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRKbmRpTmFtZShTdHJpbmcgam5kaU5hbWUpIHsKKyAgICAgICAgdGhpcy5qbmRpTmFtZSA9IGpuZGlOYW1lOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgSkRCQyBkcml2ZXIgY2xhc3Mgb2YgdGhlIGRhdGEgc291cmNlLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGRyaXZlckNsYXNzID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RHJpdmVyQ2xhc3MoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5kcml2ZXJDbGFzcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RHJpdmVyQ2xhc3MoU3RyaW5nIGRyaXZlckNsYXNzKSB7CisgICAgICAgIHRoaXMuZHJpdmVyQ2xhc3MgPSBkcml2ZXJDbGFzczsKKyAgICB9CisKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgdXNlcm5hbWUgb2YgdGhlIGRhdGFic2UgY29ycmVzcG9uZGluZyB0byB0aGUgZGF0YSBzb3VyY2UuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgdXNlcm5hbWUgPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXRVc2VybmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLnVzZXJuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVc2VybmFtZShTdHJpbmcgdXNlcm5hbWUpIHsKKyAgICAgICAgdGhpcy51c2VybmFtZSA9IHVzZXJuYW1lOworICAgIH0KKworICAgIAorICAgIC8qKgorICAgICAqIFRoZSBwYXNzd29yZCBvZiB0aGUgZGF0YWJhc2UgY29ycmVzcG9uZGluZyB0byB0aGUgZGF0YSBzb3VyY2UuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcGFzc3dvcmQgPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXRQYXNzd29yZCgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLnBhc3N3b3JkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZChTdHJpbmcgcGFzc3dvcmQpIHsKKyAgICAgICAgdGhpcy5wYXNzd29yZCA9IHBhc3N3b3JkOworICAgIH0KKworICAgIAorICAgIC8qKgorICAgICAqIFRoZSBtYXggbnVtYmVyIG9mIGFjdGl2ZSBzZXNzaW9ucyB0byB0aGUgZGF0YSBzb3VyY2UuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgYWN0aXZlID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWN0aXZlKCkgeworICAgICAgICByZXR1cm4gKHRoaXMuYWN0aXZlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBY3RpdmUoU3RyaW5nIGFjdGl2ZSkgeworICAgICAgICB0aGlzLmFjdGl2ZSA9IGFjdGl2ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgbWF4IG51bWJlciBvZiBpZGxlIGNvbm5lY3Rpb25zIHRvIHRoZSBkYXRhIHNvdXJjZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBpZGxlID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWRsZSgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLmlkbGUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldElkbGUoU3RyaW5nIGlkbGUpIHsKKyAgICAgICAgdGhpcy5pZGxlID0gaWRsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgbWF4aW11bSB3YWl0IGZvciBhIGNvbm5lY3Rpb24gdG8gdGhlIGRhdGEgc291cmNlLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHdhaXQgPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXRXYWl0KCkgeworICAgICAgICByZXR1cm4gKHRoaXMud2FpdCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0V2FpdChTdHJpbmcgd2FpdCkgeworICAgICAgICB0aGlzLndhaXQgPSB3YWl0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSByZXNvdXJjZSB0eXBlIG9mIHRoaXMgZGF0YSBzb3VyY2UuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcmVzb3VyY2V0eXBlID0gbnVsbDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHJlc291cmNlIHR5cGUgb2YgdGhlIGRhdGEgc291cmNlIHRoaXMgYmVhbiByZWZlcnMgdG8uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZXR5cGUoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnJlc291cmNldHlwZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHJlc291cmNlIHR5cGUgb2YgdGhlIGRhdGEgc291cmNlIHRoaXMgYmVhbiByZWZlcnMgdG8uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVzb3VyY2V0eXBlKFN0cmluZyByZXNvdXJjZXR5cGUpIHsKKyAgICAgICAgdGhpcy5yZXNvdXJjZXR5cGUgPSByZXNvdXJjZXR5cGU7CisgICAgfQorICAgICAgIAorICAgIC8qKgorICAgICAqIFRoZSBwYXRoIG9mIHRoaXMgZGF0YSBzb3VyY2UuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcGF0aCA9IG51bGw7CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBwYXRoIG9mIHRoZSBkYXRhIHNvdXJjZSB0aGlzIGJlYW4gcmVmZXJzIHRvLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucGF0aDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHBhdGggb2YgdGhlIGRhdGEgc291cmNlIHRoaXMgYmVhbiByZWZlcnMgdG8uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGF0aChTdHJpbmcgcGF0aCkgeworICAgICAgICB0aGlzLnBhdGggPSBwYXRoOworICAgIH0KKyAgICAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgaG9zdCBvZiB0aGlzIGRhdGEgc291cmNlLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGhvc3QgPSBudWxsOworICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgaG9zdCBvZiB0aGUgZGF0YSBzb3VyY2UgdGhpcyBiZWFuIHJlZmVycyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEhvc3QoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmhvc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBob3N0IG9mIHRoZSBkYXRhIHNvdXJjZSB0aGlzIGJlYW4gcmVmZXJzIHRvLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEhvc3QoU3RyaW5nIGhvc3QpIHsKKyAgICAgICAgdGhpcy5ob3N0ID0gaG9zdDsKKyAgICB9ICAgIAorICAgIAorICAgICAgIAorICAgIC8qKgorICAgICAqIFRoZSBkb21haW4gb2YgdGhpcyBkYXRhIHNvdXJjZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBkb21haW4gPSBudWxsOworICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZG9tYWluIG9mIHRoZSBkYXRhIHNvdXJjZSB0aGlzIGJlYW4gcmVmZXJzIHRvLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RG9tYWluKCkgeworICAgICAgICByZXR1cm4gdGhpcy5kb21haW47CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBkb21haW4gb2YgdGhlIGRhdGEgc291cmNlIHRoaXMgYmVhbiByZWZlcnMgdG8uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RG9tYWluKFN0cmluZyBkb21haW4pIHsKKyAgICAgICAgdGhpcy5kb21haW4gPSBkb21haW47CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFRoZSB2YWxpZGF0aW9uIHF1ZXJ5IHRvIHRoZSBkYXRhIHNvdXJjZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBxdWVyeSA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFF1ZXJ5KCkgeworICAgICAgICByZXR1cm4gKHRoaXMucXVlcnkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFF1ZXJ5KFN0cmluZyBxdWVyeSkgeworICAgICAgICB0aGlzLnF1ZXJ5ID0gcXVlcnk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFRoZSB0eXBlIG9mIHRoZSByZXNvdXJjZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyB0eXBlID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLnR5cGUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIHR5cGUpIHsKKyAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworICAgIC8qKgorICAgICAqIFJlc2V0IGFsbCBwcm9wZXJ0aWVzIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIG1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZXNldChBY3Rpb25NYXBwaW5nIG1hcHBpbmcsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisKKyAgICAgICAgc3VwZXIucmVzZXQobWFwcGluZywgcmVxdWVzdCk7CisgICAgICAgIHVybCA9IG51bGw7ICAgICAgICAKKyAgICAgICAgam5kaU5hbWUgPSBudWxsOworICAgICAgICBkcml2ZXJDbGFzcyA9IG51bGw7CisgICAgICAgIHVzZXJuYW1lID0gbnVsbDsKKyAgICAgICAgcGFzc3dvcmQgPSBudWxsOworICAgICAgICB0eXBlID0gbnVsbDsKKyAgICAKKyAgICAgICAgYWN0aXZlID0gbnVsbDsKKyAgICAgICAgaWRsZSA9IG51bGw7CisgICAgICAgIHdhaXQgPSBudWxsOworICAgICAgICBxdWVyeSA9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogVmFsaWRhdGUgdGhlIHByb3BlcnRpZXMgdGhhdCBoYXZlIGJlZW4gc2V0IGZyb20gdGhpcyBIVFRQIHJlcXVlc3QsCisgICAgICogYW5kIHJldHVybiBhbiA8Y29kZT5BY3Rpb25FcnJvcnM8L2NvZGU+IG9iamVjdCB0aGF0IGVuY2Fwc3VsYXRlcyBhbnkKKyAgICAgKiB2YWxpZGF0aW9uIGVycm9ycyB0aGF0IGhhdmUgYmVlbiBmb3VuZC4gIElmIG5vIGVycm9ycyBhcmUgZm91bmQsIHJldHVybgorICAgICAqIDxjb2RlPm51bGw8L2NvZGU+IG9yIGFuIDxjb2RlPkFjdGlvbkVycm9yczwvY29kZT4gb2JqZWN0IHdpdGggbm8KKyAgICAgKiByZWNvcmRlZCBlcnJvciBtZXNzYWdlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBtYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICovCisgICAgCisgICAgcHJpdmF0ZSBBY3Rpb25FcnJvcnMgZXJyb3JzID0gbnVsbDsKKyAgICAKKyAgICBwdWJsaWMgQWN0aW9uRXJyb3JzIHZhbGlkYXRlKEFjdGlvbk1hcHBpbmcgbWFwcGluZywKKyAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworCisgICAgICAgIGVycm9ycyA9IG5ldyBBY3Rpb25FcnJvcnMoKTsKKworICAgICAgICBTdHJpbmcgc3VibWl0ID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoInN1Ym1pdCIpOworCisgICAgICAgIC8vaWYgKHN1Ym1pdCAhPSBudWxsKSB7CisKKyAgICAgICAgICAgIC8vIHVybCBpcyBhIHJlcXVpcmVkIGZpZWxkCisgICAgICAgICAgICBpZiAoKHVybCA9PSBudWxsKSB8fCAodXJsLmxlbmd0aCgpIDwgMSkpIHsKKyAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKCJ1cmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFjdGlvbkVycm9yKCJyZXNvdXJjZXMuZXJyb3IudXJsLnJlcXVpcmVkIikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBqbmRpTmFtZSBpcyBhIHJlcXVpcmVkIGZpZWxkCisgICAgICAgICAgICBpZiAoKCBqbmRpTmFtZSA9PSBudWxsKSB8fCAoam5kaU5hbWUubGVuZ3RoKCkgPCAxKSkgeworICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoImpuZGlOYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBY3Rpb25FcnJvcigicmVzb3VyY2VzLmVycm9yLmpuZGlOYW1lLnJlcXVpcmVkIikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBkcml2ZXJDbGFzcyBpcyBhIHJlcXVpcmVkIGZpZWxkCisgICAgICAgICAgICBpZiAoKGRyaXZlckNsYXNzID09IG51bGwpIHx8IChkcml2ZXJDbGFzcy5sZW5ndGgoKSA8IDEpKSB7CisgICAgICAgICAgICAgICAgZXJyb3JzLmFkZCgiZHJpdmVyQ2xhc3MiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFjdGlvbkVycm9yKCJyZXNvdXJjZXMuZXJyb3IuZHJpdmVyQ2xhc3MucmVxdWlyZWQiKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIHVzZXJuYW1lIGlzIGEgcmVxdWlyZWQgZmllbGQKKyAgICAgICAgICAgIGlmICgodXNlcm5hbWUgPT0gbnVsbCkgfHwgKHVzZXJuYW1lLmxlbmd0aCgpIDwgMSkpIHsKKyAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKCJ1c2VybmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQWN0aW9uRXJyb3IoInVzZXJzLmVycm9yLnVzZXJuYW1lLnJlcXVpcmVkIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBjb21tZW50ZWQgb3V0IHBhc3N3b3JkIGNhbiBiZSBhbiBlbXB0eSBzdHJpbmcKKyAgICAgICAgICAgIC8vIHBhc3N3b3JkIGlzIGEgcmVxdWlyZWQgZmllbGQKKyAgICAgICAgICAgIC8vaWYgKChwYXNzd29yZCA9PSBudWxsKSB8fCAocGFzc3dvcmQubGVuZ3RoKCkgPCAxKSkgeworICAgICAgICAgICAgLy8gICAgZXJyb3JzLmFkZCgicGFzc3dvcmQiLAorICAgICAgICAgICAgLy8gICAgICAgICAgICAgICBuZXcgQWN0aW9uRXJyb3IoImVycm9yLnVzZXJQYXNzd29yZC5yZXF1aXJlZCIpKTsKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIEZJWCBNRSAtLSBuZWVkIHRvIGRvIGEgcmFuZ2UgY2hlY2sKKyAgICAgICAgICAgIG51bWJlckNoZWNrKCJhY3RpdmUiLCBhY3RpdmUgLCBmYWxzZSwgMCwgMTAwMDApOworICAgICAgICAgICAgbnVtYmVyQ2hlY2soImlkbGUiLCBpZGxlICwgZmFsc2UsIDAsIDEwMDAwKTsKKyAgICAgICAgICAgIG51bWJlckNoZWNrKCJ3YWl0Iiwgd2FpdCAsIGZhbHNlLCAwLCAxMDAwMCk7CisKKyAgICAgICAgICAgIC8vIFF1b3RlcyBub3QgYWxsb3dlZCBpbiB1c2VybmFtZQorICAgICAgICAgICAgaWYgKCh1c2VybmFtZSAhPSBudWxsKSAmJiAodXNlcm5hbWUuaW5kZXhPZignIicpID49IDApKSB7CisgICAgICAgICAgICAgICAgZXJyb3JzLmFkZCgidXNlcm5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFjdGlvbkVycm9yKCJ1c2Vycy5lcnJvci5xdW90ZXMiKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFF1b3RlcyBub3QgYWxsb3dlZCBpbiBwYXNzd29yZAorICAgICAgICAgICAgaWYgKChwYXNzd29yZCAhPSBudWxsKSAmJiAocGFzc3dvcmQuaW5kZXhPZignIicpID4gMCkpIHsKKyAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKCJwYXNzd29yZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQWN0aW9uRXJyb3IoInVzZXJzLmVycm9yLnF1b3RlcyIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIC8vfQorICAgICAgICByZXR1cm4gKGVycm9ycyk7CisgICAgfQorIAorICAgIC8qCisgICAgICogSGVscGVyIG1ldGhvZCB0byBjaGVjayB0aGF0IGl0IGlzIGEgcmVxdWlyZWQgbnVtYmVyIGFuZAorICAgICAqIGlzIGEgdmFsaWQgaW50ZWdlciB3aXRoaW4gdGhlIGdpdmVuIHJhbmdlLiAobWluLCBtYXgpLgorICAgICAqCisgICAgICogQHBhcmFtICBmaWVsZCAgVGhlIGZpZWxkIG5hbWUgaW4gdGhlIGZvcm0gZm9yIHdoaWNoIHRoaXMgZXJyb3Igb2NjdXJlZC4KKyAgICAgKiBAcGFyYW0gIG51bVRleHQgIFRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG51bWJlci4KKyAgICAgKiBAcGFyYW0gcmFuZ2VDaGVjayAgQm9vbGVhbiB2YWx1ZSBzZXQgdG8gdHJ1ZSBvZiByZWFuZ2UgY2hlY2sgc2hvdWxkIGJlIHBlcmZvcm1lZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgbWluICBUaGUgbG93ZXIgbGltaXQgb2YgdGhlIHJhbmdlCisgICAgICogQHBhcmFtICBtYXggIFRoZSB1cHBlciBsaW1pdCBvZiB0aGUgcmFuZ2UKKyAgICAgKgorICAgICAqLworICAgIAorICAgIHByaXZhdGUgdm9pZCBudW1iZXJDaGVjayhTdHJpbmcgZmllbGQsIFN0cmluZyBudW1UZXh0LCBib29sZWFuIHJhbmdlQ2hlY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtaW4sIGludCBtYXgpIHsKKyAgICAgICAgCisgICAgICAgIC8vIENoZWNrIGZvciAnaXMgcmVxdWlyZWQnCisgICAgICAgIGlmICgobnVtVGV4dCA9PSBudWxsKSB8fCAobnVtVGV4dC5sZW5ndGgoKSA8IDEpKSB7CisgICAgICAgICAgICBlcnJvcnMuYWRkKGZpZWxkLCBuZXcgQWN0aW9uRXJyb3IoInJlc291cmNlcy5lcnJvci4iK2ZpZWxkKyIucmVxdWlyZWQiKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIGNoZWNrIGZvciAnbXVzdCBiZSBhIG51bWJlcicgaW4gdGhlICd2YWxpZCByYW5nZScKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaW50IG51bSA9IEludGVnZXIucGFyc2VJbnQobnVtVGV4dCk7CisgICAgICAgICAgICAgICAgLy8gcGVyZm9ybSByYW5nZSBjaGVjayBvbmx5IGlmIHJlcXVpcmVkCisgICAgICAgICAgICAgICAgaWYgKHJhbmdlQ2hlY2spIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChudW0gPCBtaW4pIHx8IChudW0gPiBtYXggKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFjdGlvbkVycm9yKCJyZXNvdXJjZXMuZXJyb3IuIisgZmllbGQgKyIucmFuZ2UiKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKGZpZWxkLAorICAgICAgICAgICAgICAgIG5ldyBBY3Rpb25FcnJvcigicmVzb3VyY2VzLmludGVnZXIuZXJyb3IiKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVzb3VyY2VzL0RhdGFTb3VyY2VzRm9ybS5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3Jlc291cmNlcy9EYXRhU291cmNlc0Zvcm0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmZlOTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3Jlc291cmNlcy9EYXRhU291cmNlc0Zvcm0uamF2YQpAQCAtMCwwICsxLDE1MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnJlc291cmNlczsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkVycm9yOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25FcnJvcnM7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CisKKworLyoqCisgKiBGb3JtIGJlYW4gZm9yIHRoZSBkZWxldGUgZGF0YSBzb3VyY2VzIHBhZ2UuCisgKgorICogQGF1dGhvciBNYW52ZWVuIEthdXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKiBAc2luY2UgNC4xCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIERhdGFTb3VyY2VzRm9ybSBleHRlbmRzIEJhc2VGb3JtIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgb2JqZWN0IG5hbWVzIG9mIHRoZSBzcGVjaWZpZWQgZW52aXJvbm1lbnQgZW50cmllcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBkYXRhU291cmNlc1tdID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXREYXRhU291cmNlcygpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLmRhdGFTb3VyY2VzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREYXRhU291cmNlcyhTdHJpbmcgZGF0YVNvdXJjZXNbXSkgeworICAgICAgICB0aGlzLmRhdGFTb3VyY2VzID0gZGF0YVNvdXJjZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHJlc291cmNlIHR5cGUgb2YgdGhpcyBkYXRhIHNvdXJjZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyByZXNvdXJjZXR5cGUgPSBudWxsOworICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcmVzb3VyY2UgdHlwZSBvZiB0aGUgZGF0YSBzb3VyY2UgdGhpcyBiZWFuIHJlZmVycyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlc291cmNldHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucmVzb3VyY2V0eXBlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcmVzb3VyY2UgdHlwZSBvZiB0aGUgZGF0YSBzb3VyY2UgdGhpcyBiZWFuIHJlZmVycyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZXR5cGUoU3RyaW5nIHJlc291cmNldHlwZSkgeworICAgICAgICB0aGlzLnJlc291cmNldHlwZSA9IHJlc291cmNldHlwZTsKKyAgICB9CisgICAgICAgCisgICAgLyoqCisgICAgICogVGhlIHBhdGggb2YgdGhpcyBkYXRhIHNvdXJjZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBwYXRoID0gbnVsbDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHBhdGggb2YgdGhlIGRhdGEgc291cmNlIHRoaXMgYmVhbiByZWZlcnMgdG8uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRQYXRoKCkgeworICAgICAgICByZXR1cm4gdGhpcy5wYXRoOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcGF0aCBvZiB0aGUgZGF0YSBzb3VyY2UgdGhpcyBiZWFuIHJlZmVycyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXRoKFN0cmluZyBwYXRoKSB7CisgICAgICAgIHRoaXMucGF0aCA9IHBhdGg7CisgICAgfQorICAgICAgIAorICAgIC8qKgorICAgICAqIFRoZSBob3N0IG9mIHRoaXMgZGF0YSBzb3VyY2UuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgaG9zdCA9IG51bGw7CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBob3N0IG9mIHRoZSBkYXRhIHNvdXJjZSB0aGlzIGJlYW4gcmVmZXJzIHRvLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SG9zdCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuaG9zdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGhvc3Qgb2YgdGhlIGRhdGEgc291cmNlIHRoaXMgYmVhbiByZWZlcnMgdG8uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SG9zdChTdHJpbmcgaG9zdCkgeworICAgICAgICB0aGlzLmhvc3QgPSBob3N0OworICAgIH0gICAgCisgICAgCisgICAgICAgCisgICAgLyoqCisgICAgICogVGhlIGRvbWFpbiBvZiB0aGlzIGRhdGEgc291cmNlLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGRvbWFpbiA9IG51bGw7CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBkb21haW4gb2YgdGhlIGRhdGEgc291cmNlIHRoaXMgYmVhbiByZWZlcnMgdG8uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXREb21haW4oKSB7CisgICAgICAgIHJldHVybiB0aGlzLmRvbWFpbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGRvbWFpbiBvZiB0aGUgZGF0YSBzb3VyY2UgdGhpcyBiZWFuIHJlZmVycyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREb21haW4oU3RyaW5nIGRvbWFpbikgeworICAgICAgICB0aGlzLmRvbWFpbiA9IGRvbWFpbjsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmVzZXQgYWxsIHByb3BlcnRpZXMgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgbWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlc2V0KEFjdGlvbk1hcHBpbmcgbWFwcGluZywgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKworICAgICAgICBzdXBlci5yZXNldChtYXBwaW5nLCByZXF1ZXN0KTsKKyAgICAgICAgdGhpcy5kYXRhU291cmNlcyA9IG51bGw7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3Jlc291cmNlcy9EZWxldGVEYXRhU291cmNlc0FjdGlvbi5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3Jlc291cmNlcy9EZWxldGVEYXRhU291cmNlc0FjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwYTNhZWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVzb3VyY2VzL0RlbGV0ZURhdGFTb3VyY2VzQWN0aW9uLmphdmEKQEAgLTAsMCArMSwxNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnJlc291cmNlczsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRXJyb3JzOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3J3YXJkOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuQXR0cmlidXRlOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlckZhY3Rvcnk7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5RdWVyeUV4cDsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LlF1ZXJ5OworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0SW5zdGFuY2U7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuSk1FeGNlcHRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhbkF0dHJpYnV0ZUluZm87CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhbk9wZXJhdGlvbkluZm87CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhbkluZm87CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMudXRpbC5NZXNzYWdlUmVzb3VyY2VzOworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkFwcGxpY2F0aW9uU2VydmxldDsKKworCisvKioKKyAqIDxwPkltcGxlbWVudGF0aW9uIG9mIDxzdHJvbmc+QWN0aW9uPC9zdHJvbmc+IHRoYXQgZGVsZXRlcyB0aGUKKyAqIHNwZWNpZmllZCBzZXQgb2YgZGF0YVNvdXJjZSBlbnRyaWVzLjwvcD4KKyAqCisgKiBAYXV0aG9yIE1hbnZlZW4gS2F1cgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqIEBzaW5jZSA0LjEKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgRGVsZXRlRGF0YVNvdXJjZXNBY3Rpb24gZXh0ZW5kcyBBY3Rpb24geworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIE1CZWFuU2VydmVyIHdlIHdpbGwgYmUgaW50ZXJhY3Rpbmcgd2l0aC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1CZWFuU2VydmVyIG1zZXJ2ZXIgPSBudWxsOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUHJvY2VzcyB0aGUgc3BlY2lmaWVkIEhUVFAgcmVxdWVzdCwgYW5kIGNyZWF0ZSB0aGUgY29ycmVzcG9uZGluZyBIVFRQCisgICAgICogcmVzcG9uc2UgKG9yIGZvcndhcmQgdG8gYW5vdGhlciB3ZWIgY29tcG9uZW50IHRoYXQgd2lsbCBjcmVhdGUgaXQpLgorICAgICAqIFJldHVybiBhbiA8Y29kZT5BY3Rpb25Gb3J3YXJkPC9jb2RlPiBpbnN0YW5jZSBkZXNjcmliaW5nIHdoZXJlIGFuZCBob3cKKyAgICAgKiBjb250cm9sIHNob3VsZCBiZSBmb3J3YXJkZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSByZXNwb25zZSBoYXMKKyAgICAgKiBhbHJlYWR5IGJlZW4gY29tcGxldGVkLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIEFjdGlvbk1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSBhY3Rpb25Gb3JtIFRoZSBvcHRpb25hbCBBY3Rpb25Gb3JtIGJlYW4gZm9yIHRoaXMgcmVxdWVzdCAoaWYgYW55KQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBIVFRQIHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIEhUVFAgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0IGV4Y2VwdGlvbiBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgQWN0aW9uRm9yd2FyZCBwZXJmb3JtKEFjdGlvbk1hcHBpbmcgbWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbkZvcm0gZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICAvLyBMb29rIHVwIHRoZSBjb21wb25lbnRzIHdlIHdpbGwgYmUgdXNpbmcgYXMgbmVlZGVkCisgICAgICAgIGlmIChtc2VydmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIG1zZXJ2ZXIgPSAoKEFwcGxpY2F0aW9uU2VydmxldCkgZ2V0U2VydmxldCgpKS5nZXRTZXJ2ZXIoKTsKKyAgICAgICAgfQorICAgICAgICBNZXNzYWdlUmVzb3VyY2VzIHJlc291cmNlcyA9IGdldFJlc291cmNlcyhyZXF1ZXN0KTsKKyAgICAgICAgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpOworICAgICAgICBMb2NhbGUgbG9jYWxlID0gZ2V0TG9jYWxlKHJlcXVlc3QpOworCisgICAgICAgIC8vIEhhcyB0aGlzIHRyYW5zYWN0aW9uIGJlZW4gY2FuY2VsbGVkPworICAgICAgICBpZiAoaXNDYW5jZWxsZWQocmVxdWVzdCkpIHsKKyAgICAgICAgICAgIHJldHVybiAobWFwcGluZy5maW5kRm9yd2FyZCgiTGlzdCBEYXRhU291cmNlcyBTZXR1cCIpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENoZWNrIHRoZSB0cmFuc2FjdGlvbiB0b2tlbgorICAgICAgICBpZiAoIWlzVG9rZW5WYWxpZChyZXF1ZXN0KSkgeworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfQkFEX1JFUVVFU1QsCisgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLnRva2VuIikpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFBlcmZvcm0gYW55IGV4dHJhIHZhbGlkYXRpb24gdGhhdCBpcyByZXF1aXJlZAorICAgICAgICBEYXRhU291cmNlc0Zvcm0gZGF0YVNvdXJjZXNGb3JtID0gKERhdGFTb3VyY2VzRm9ybSkgZm9ybTsKKyAgICAgICAgU3RyaW5nIGRhdGFTb3VyY2VzW10gPSBkYXRhU291cmNlc0Zvcm0uZ2V0RGF0YVNvdXJjZXMoKTsKKyAgICAgICAgaWYgKGRhdGFTb3VyY2VzID09IG51bGwpIHsKKyAgICAgICAgICAgIGRhdGFTb3VyY2VzID0gbmV3IFN0cmluZ1swXTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFBlcmZvcm0gIkRlbGV0ZSBFbnZFbnRyeSIgdHJhbnNhY3Rpb25zIGFzIHJlcXVpcmVkCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIFN0cmluZyByZXNvdXJjZXR5cGUgPSBkYXRhU291cmNlc0Zvcm0uZ2V0UmVzb3VyY2V0eXBlKCk7CisgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IGRhdGFTb3VyY2VzRm9ybS5nZXRQYXRoKCk7CisgICAgICAgICAgICBTdHJpbmcgaG9zdCA9IGRhdGFTb3VyY2VzRm9ybS5nZXRIb3N0KCk7CisgICAgICAgICAgICAvL1N0cmluZyBkb21haW4gPSBkYXRhU291cmNlc0Zvcm0uZ2V0RG9tYWluKCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIE9iamVjdE5hbWUgZG5hbWUgPSBudWxsOworCisgICAgICAgICAgICBTdHJpbmcgc2lnbmF0dXJlW10gPSBuZXcgU3RyaW5nWzFdOworICAgICAgICAgICAgc2lnbmF0dXJlWzBdID0gImphdmEubGFuZy5TdHJpbmciOworICAgICAgICAgICAgT2JqZWN0IHBhcmFtc1tdID0gbmV3IFN0cmluZ1sxXTsKKyAgICAgICAgICAgICAKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGF0YVNvdXJjZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0gbmV3IE9iamVjdE5hbWUoZGF0YVNvdXJjZXNbaV0pOworICAgICAgICAgICAgICAgIFN0cmluZyBkb21haW4gPSBvbmFtZS5nZXREb21haW4oKTsKKyAgICAgICAgICAgICAgICBkbmFtZSA9IFJlc291cmNlVXRpbHMuZ2V0TmFtaW5nUmVzb3VyY2VPYmplY3ROYW1lKGRvbWFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXR5cGUsIHBhdGgsIGhvc3QpOworICAgICAgICAgICAgICAgIHBhcmFtc1swXSA9IG9uYW1lLmdldEtleVByb3BlcnR5KCJuYW1lIik7CisgICAgICAgICAgICAgICAgbXNlcnZlci5pbnZva2UoZG5hbWUsICJyZW1vdmVSZXNvdXJjZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLCBzaWduYXR1cmUpOworICAgICAgICAgICAgfQorICAgICAgICAgIAorICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworCisgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nCisgICAgICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmludm9rZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZW1vdmVSZXNvdXJjZSIpLCB0KTsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuaW52b2tlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlbW92ZVJlc291cmNlIikpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKworICAgICAgICB9CisKKyAgICAgICAgLy8gUHJvY2VlZCB0byB0aGUgbGlzdCBlbnZFbnRyeXMgc2NyZWVuCisgICAgICAgIHJldHVybiAobWFwcGluZy5maW5kRm9yd2FyZCgiRGF0YVNvdXJjZXMgTGlzdCBTZXR1cCIpKTsKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3Jlc291cmNlcy9EZWxldGVFbnZFbnRyaWVzQWN0aW9uLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVzb3VyY2VzL0RlbGV0ZUVudkVudHJpZXNBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTg4Y2FjCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3Jlc291cmNlcy9EZWxldGVFbnZFbnRyaWVzQWN0aW9uLmphdmEKQEAgLTAsMCArMSwxNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnJlc291cmNlczsKKworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25FcnJvcnM7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcndhcmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5BdHRyaWJ1dGU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyRmFjdG9yeTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LlF1ZXJ5RXhwOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuUXVlcnk7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3RJbnN0YW5jZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5KTUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuQXR0cmlidXRlSW5mbzsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuT3BlcmF0aW9uSW5mbzsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuSW5mbzsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy51dGlsLk1lc3NhZ2VSZXNvdXJjZXM7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uQXBwbGljYXRpb25TZXJ2bGV0OworCisKKy8qKgorICogPHA+SW1wbGVtZW50YXRpb24gb2YgPHN0cm9uZz5BY3Rpb248L3N0cm9uZz4gdGhhdCBkZWxldGVzIHRoZQorICogc3BlY2lmaWVkIHNldCBvZiBlbnYgZW50cmllcy48L3A+CisgKgorICogQGF1dGhvciBNYW52ZWVuIEthdXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKiBAc2luY2UgNC4xCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIERlbGV0ZUVudkVudHJpZXNBY3Rpb24gZXh0ZW5kcyBBY3Rpb24geworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIE1CZWFuU2VydmVyIHdlIHdpbGwgYmUgaW50ZXJhY3Rpbmcgd2l0aC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1CZWFuU2VydmVyIG1zZXJ2ZXIgPSBudWxsOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUHJvY2VzcyB0aGUgc3BlY2lmaWVkIEhUVFAgcmVxdWVzdCwgYW5kIGNyZWF0ZSB0aGUgY29ycmVzcG9uZGluZyBIVFRQCisgICAgICogcmVzcG9uc2UgKG9yIGZvcndhcmQgdG8gYW5vdGhlciB3ZWIgY29tcG9uZW50IHRoYXQgd2lsbCBjcmVhdGUgaXQpLgorICAgICAqIFJldHVybiBhbiA8Y29kZT5BY3Rpb25Gb3J3YXJkPC9jb2RlPiBpbnN0YW5jZSBkZXNjcmliaW5nIHdoZXJlIGFuZCBob3cKKyAgICAgKiBjb250cm9sIHNob3VsZCBiZSBmb3J3YXJkZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSByZXNwb25zZSBoYXMKKyAgICAgKiBhbHJlYWR5IGJlZW4gY29tcGxldGVkLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIEFjdGlvbk1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSBhY3Rpb25Gb3JtIFRoZSBvcHRpb25hbCBBY3Rpb25Gb3JtIGJlYW4gZm9yIHRoaXMgcmVxdWVzdCAoaWYgYW55KQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBIVFRQIHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIEhUVFAgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0IGV4Y2VwdGlvbiBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgQWN0aW9uRm9yd2FyZCBwZXJmb3JtKEFjdGlvbk1hcHBpbmcgbWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbkZvcm0gZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICAvLyBMb29rIHVwIHRoZSBjb21wb25lbnRzIHdlIHdpbGwgYmUgdXNpbmcgYXMgbmVlZGVkCisgICAgICAgIGlmIChtc2VydmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIG1zZXJ2ZXIgPSAoKEFwcGxpY2F0aW9uU2VydmxldCkgZ2V0U2VydmxldCgpKS5nZXRTZXJ2ZXIoKTsKKyAgICAgICAgfQorICAgICAgICBNZXNzYWdlUmVzb3VyY2VzIHJlc291cmNlcyA9IGdldFJlc291cmNlcyhyZXF1ZXN0KTsKKyAgICAgICAgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpOworICAgICAgICBMb2NhbGUgbG9jYWxlID0gZ2V0TG9jYWxlKHJlcXVlc3QpOworICAgICAgICAKKyAgICAgICAgLy8gSGFzIHRoaXMgdHJhbnNhY3Rpb24gYmVlbiBjYW5jZWxsZWQ/CisgICAgICAgIGlmIChpc0NhbmNlbGxlZChyZXF1ZXN0KSkgeworICAgICAgICAgICAgcmV0dXJuIChtYXBwaW5nLmZpbmRGb3J3YXJkKCJMaXN0IEVudkVudHJpZXMgU2V0dXAiKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBDaGVjayB0aGUgdHJhbnNhY3Rpb24gdG9rZW4KKyAgICAgICAgaWYgKCFpc1Rva2VuVmFsaWQocmVxdWVzdCkpIHsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0JBRF9SRVFVRVNULAorICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci50b2tlbiIpKTsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBQZXJmb3JtIGFueSBleHRyYSB2YWxpZGF0aW9uIHRoYXQgaXMgcmVxdWlyZWQKKyAgICAgICAgRW52RW50cmllc0Zvcm0gZW52RW50cmllc0Zvcm0gPSAoRW52RW50cmllc0Zvcm0pIGZvcm07CisgICAgICAgIFN0cmluZyBlbnZFbnRyaWVzW10gPSBlbnZFbnRyaWVzRm9ybS5nZXRFbnZFbnRyaWVzKCk7CisgICAgICAgIFN0cmluZyByZXNvdXJjZXR5cGUgPSBlbnZFbnRyaWVzRm9ybS5nZXRSZXNvdXJjZXR5cGUoKTsKKyAgICAgICAgU3RyaW5nIHBhdGggPSBlbnZFbnRyaWVzRm9ybS5nZXRQYXRoKCk7CisgICAgICAgIFN0cmluZyBob3N0ID0gZW52RW50cmllc0Zvcm0uZ2V0SG9zdCgpOworICAgICAgICAKKyAgICAgICAgaWYgKGVudkVudHJpZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgZW52RW50cmllcyA9IG5ldyBTdHJpbmdbMF07CisgICAgICAgIH0KKworICAgICAgICAvLyBQZXJmb3JtICJEZWxldGUgRW52RW50cnkiIHRyYW5zYWN0aW9ucyBhcyByZXF1aXJlZAorICAgICAgICB0cnkgeworICAgICAgICAgICAgT2JqZWN0TmFtZSBkbmFtZSA9IG51bGw7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIFN0cmluZyBzaWduYXR1cmVbXSA9IG5ldyBTdHJpbmdbMV07CisgICAgICAgICAgICBzaWduYXR1cmVbMF0gPSAiamF2YS5sYW5nLlN0cmluZyI7CisgICAgICAgICAgICBPYmplY3QgcGFyYW1zW10gPSBuZXcgU3RyaW5nWzFdOworCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVudkVudHJpZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0gbmV3IE9iamVjdE5hbWUoZW52RW50cmllc1tpXSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIGRvbWFpbiA9IG9uYW1lLmdldERvbWFpbigpOworICAgICAgICAgICAgICAgIGRuYW1lID0gUmVzb3VyY2VVdGlscy5nZXROYW1pbmdSZXNvdXJjZU9iamVjdE5hbWUoZG9tYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNldHlwZSwgcGF0aCwgaG9zdCk7CisgICAgICAgICAgICAgICAgcGFyYW1zWzBdID0gb25hbWUuZ2V0S2V5UHJvcGVydHkoIm5hbWUiKTsKKyAgICAgICAgICAgICAgICBtc2VydmVyLmludm9rZShkbmFtZSwgInJlbW92ZUVudmlyb25tZW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMsIHNpZ25hdHVyZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKworICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZworICAgICAgICAgICAgICAgIChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5pbnZva2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVtb3ZlRW52aXJvbm1lbnQiKSwgdCk7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsCisgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmludm9rZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZW1vdmVFbnZpcm9ubWVudCIpKTsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisKKyAgICAgICAgfQorCisgICAgICAgIC8vIFByb2NlZWQgdG8gdGhlIGxpc3QgZW52RW50cnlzIHNjcmVlbgorICAgICAgICByZXR1cm4gKG1hcHBpbmcuZmluZEZvcndhcmQoIkVudkVudHJpZXMgTGlzdCBTZXR1cCIpKTsKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3Jlc291cmNlcy9EZWxldGVNYWlsU2Vzc2lvbnNBY3Rpb24uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZXNvdXJjZXMvRGVsZXRlTWFpbFNlc3Npb25zQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjlmYzVlYwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZXNvdXJjZXMvRGVsZXRlTWFpbFNlc3Npb25zQWN0aW9uLmphdmEKQEAgLTAsMCArMSwxNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnJlc291cmNlczsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRXJyb3JzOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3J3YXJkOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuQXR0cmlidXRlOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlckZhY3Rvcnk7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5RdWVyeUV4cDsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LlF1ZXJ5OworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0SW5zdGFuY2U7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuSk1FeGNlcHRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhbkF0dHJpYnV0ZUluZm87CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhbk9wZXJhdGlvbkluZm87CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhbkluZm87CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMudXRpbC5NZXNzYWdlUmVzb3VyY2VzOworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkFwcGxpY2F0aW9uU2VydmxldDsKKworCisvKioKKyAqIDxwPkltcGxlbWVudGF0aW9uIG9mIDxzdHJvbmc+QWN0aW9uPC9zdHJvbmc+IHRoYXQgZGVsZXRlcyB0aGUKKyAqIHNwZWNpZmllZCBzZXQgb2YgbWFpbFNlc3Npb24gZW50cmllcy48L3A+CisgKgorICogQGF1dGhvciBBbXkgUm9oCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICogQHNpbmNlIDQuMQorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBEZWxldGVNYWlsU2Vzc2lvbnNBY3Rpb24gZXh0ZW5kcyBBY3Rpb24geworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIE1CZWFuU2VydmVyIHdlIHdpbGwgYmUgaW50ZXJhY3Rpbmcgd2l0aC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1CZWFuU2VydmVyIG1zZXJ2ZXIgPSBudWxsOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUHJvY2VzcyB0aGUgc3BlY2lmaWVkIEhUVFAgcmVxdWVzdCwgYW5kIGNyZWF0ZSB0aGUgY29ycmVzcG9uZGluZyBIVFRQCisgICAgICogcmVzcG9uc2UgKG9yIGZvcndhcmQgdG8gYW5vdGhlciB3ZWIgY29tcG9uZW50IHRoYXQgd2lsbCBjcmVhdGUgaXQpLgorICAgICAqIFJldHVybiBhbiA8Y29kZT5BY3Rpb25Gb3J3YXJkPC9jb2RlPiBpbnN0YW5jZSBkZXNjcmliaW5nIHdoZXJlIGFuZCBob3cKKyAgICAgKiBjb250cm9sIHNob3VsZCBiZSBmb3J3YXJkZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSByZXNwb25zZSBoYXMKKyAgICAgKiBhbHJlYWR5IGJlZW4gY29tcGxldGVkLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIEFjdGlvbk1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSBhY3Rpb25Gb3JtIFRoZSBvcHRpb25hbCBBY3Rpb25Gb3JtIGJlYW4gZm9yIHRoaXMgcmVxdWVzdCAoaWYgYW55KQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBIVFRQIHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIEhUVFAgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0IGV4Y2VwdGlvbiBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgQWN0aW9uRm9yd2FyZCBwZXJmb3JtKEFjdGlvbk1hcHBpbmcgbWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbkZvcm0gZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICAvLyBMb29rIHVwIHRoZSBjb21wb25lbnRzIHdlIHdpbGwgYmUgdXNpbmcgYXMgbmVlZGVkCisgICAgICAgIGlmIChtc2VydmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIG1zZXJ2ZXIgPSAoKEFwcGxpY2F0aW9uU2VydmxldCkgZ2V0U2VydmxldCgpKS5nZXRTZXJ2ZXIoKTsKKyAgICAgICAgfQorICAgICAgICBNZXNzYWdlUmVzb3VyY2VzIHJlc291cmNlcyA9IGdldFJlc291cmNlcyhyZXF1ZXN0KTsKKyAgICAgICAgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpOworICAgICAgICBMb2NhbGUgbG9jYWxlID0gZ2V0TG9jYWxlKHJlcXVlc3QpOworCisgICAgICAgIC8vIEhhcyB0aGlzIHRyYW5zYWN0aW9uIGJlZW4gY2FuY2VsbGVkPworICAgICAgICBpZiAoaXNDYW5jZWxsZWQocmVxdWVzdCkpIHsKKyAgICAgICAgICAgIHJldHVybiAobWFwcGluZy5maW5kRm9yd2FyZCgiTGlzdCBNYWlsU2Vzc2lvbnMgU2V0dXAiKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBDaGVjayB0aGUgdHJhbnNhY3Rpb24gdG9rZW4KKyAgICAgICAgaWYgKCFpc1Rva2VuVmFsaWQocmVxdWVzdCkpIHsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0JBRF9SRVFVRVNULAorICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci50b2tlbiIpKTsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBQZXJmb3JtIGFueSBleHRyYSB2YWxpZGF0aW9uIHRoYXQgaXMgcmVxdWlyZWQKKyAgICAgICAgTWFpbFNlc3Npb25zRm9ybSBtYWlsU2Vzc2lvbnNGb3JtID0gKE1haWxTZXNzaW9uc0Zvcm0pIGZvcm07CisgICAgICAgIFN0cmluZyBtYWlsU2Vzc2lvbnNbXSA9IG1haWxTZXNzaW9uc0Zvcm0uZ2V0TWFpbFNlc3Npb25zKCk7CisgICAgICAgIGlmIChtYWlsU2Vzc2lvbnMgPT0gbnVsbCkgeworICAgICAgICAgICAgbWFpbFNlc3Npb25zID0gbmV3IFN0cmluZ1swXTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFBlcmZvcm0gIkRlbGV0ZSBFbnZFbnRyeSIgdHJhbnNhY3Rpb25zIGFzIHJlcXVpcmVkCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIFN0cmluZyByZXNvdXJjZXR5cGUgPSBtYWlsU2Vzc2lvbnNGb3JtLmdldFJlc291cmNldHlwZSgpOworICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBtYWlsU2Vzc2lvbnNGb3JtLmdldFBhdGgoKTsKKyAgICAgICAgICAgIFN0cmluZyBob3N0ID0gbWFpbFNlc3Npb25zRm9ybS5nZXRIb3N0KCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIE9iamVjdE5hbWUgZG5hbWUgPSBudWxsOworCisgICAgICAgICAgICBTdHJpbmcgc2lnbmF0dXJlW10gPSBuZXcgU3RyaW5nWzFdOworICAgICAgICAgICAgc2lnbmF0dXJlWzBdID0gImphdmEubGFuZy5TdHJpbmciOworICAgICAgICAgICAgT2JqZWN0IHBhcmFtc1tdID0gbmV3IFN0cmluZ1sxXTsKKyAgICAgICAgICAgICAKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFpbFNlc3Npb25zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9IG5ldyBPYmplY3ROYW1lKG1haWxTZXNzaW9uc1tpXSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIGRvbWFpbiA9IG9uYW1lLmdldERvbWFpbigpOworICAgICAgICAgICAgICAgIGRuYW1lID0gUmVzb3VyY2VVdGlscy5nZXROYW1pbmdSZXNvdXJjZU9iamVjdE5hbWUoZG9tYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNldHlwZSwgcGF0aCwgaG9zdCk7CisgICAgICAgICAgICAgICAgcGFyYW1zWzBdID0gb25hbWUuZ2V0S2V5UHJvcGVydHkoIm5hbWUiKTsKKyAgICAgICAgICAgICAgICBtc2VydmVyLmludm9rZShkbmFtZSwgInJlbW92ZVJlc291cmNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMsIHNpZ25hdHVyZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgCisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisKKyAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuaW52b2tlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlbW92ZVJlc291cmNlIiksIHQpOworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5pbnZva2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVtb3ZlUmVzb3VyY2UiKSk7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworCisgICAgICAgIH0KKworICAgICAgICAvLyBQcm9jZWVkIHRvIHRoZSBsaXN0IGVudkVudHJ5cyBzY3JlZW4KKyAgICAgICAgcmV0dXJuIChtYXBwaW5nLmZpbmRGb3J3YXJkKCJNYWlsU2Vzc2lvbnMgTGlzdCBTZXR1cCIpKTsKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3Jlc291cmNlcy9EZWxldGVSZXNvdXJjZUxpbmtzQWN0aW9uLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVzb3VyY2VzL0RlbGV0ZVJlc291cmNlTGlua3NBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjhmYTcyCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3Jlc291cmNlcy9EZWxldGVSZXNvdXJjZUxpbmtzQWN0aW9uLmphdmEKQEAgLTAsMCArMSwxNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnJlc291cmNlczsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRXJyb3JzOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3J3YXJkOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuQXR0cmlidXRlOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlckZhY3Rvcnk7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5RdWVyeUV4cDsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LlF1ZXJ5OworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0SW5zdGFuY2U7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuSk1FeGNlcHRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhbkF0dHJpYnV0ZUluZm87CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhbk9wZXJhdGlvbkluZm87CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhbkluZm87CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMudXRpbC5NZXNzYWdlUmVzb3VyY2VzOworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkFwcGxpY2F0aW9uU2VydmxldDsKKworCisvKioKKyAqIDxwPkltcGxlbWVudGF0aW9uIG9mIDxzdHJvbmc+QWN0aW9uPC9zdHJvbmc+IHRoYXQgZGVsZXRlcyB0aGUKKyAqIHNwZWNpZmllZCBzZXQgb2YgcmVzb3VyY2UgbGlua3MgZW50cmllcy48L3A+CisgKgorICogQGF1dGhvciBBbXkgUm9oCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICogQHNpbmNlIDQuMQorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBEZWxldGVSZXNvdXJjZUxpbmtzQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBNQmVhblNlcnZlciB3ZSB3aWxsIGJlIGludGVyYWN0aW5nIHdpdGguCisgICAgICovCisgICAgcHJpdmF0ZSBNQmVhblNlcnZlciBtc2VydmVyID0gbnVsbDsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIHNwZWNpZmllZCBIVFRQIHJlcXVlc3QsIGFuZCBjcmVhdGUgdGhlIGNvcnJlc3BvbmRpbmcgSFRUUAorICAgICAqIHJlc3BvbnNlIChvciBmb3J3YXJkIHRvIGFub3RoZXIgd2ViIGNvbXBvbmVudCB0aGF0IHdpbGwgY3JlYXRlIGl0KS4KKyAgICAgKiBSZXR1cm4gYW4gPGNvZGU+QWN0aW9uRm9yd2FyZDwvY29kZT4gaW5zdGFuY2UgZGVzY3JpYmluZyB3aGVyZSBhbmQgaG93CisgICAgICogY29udHJvbCBzaG91bGQgYmUgZm9yd2FyZGVkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcmVzcG9uc2UgaGFzCisgICAgICogYWxyZWFkeSBiZWVuIGNvbXBsZXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBBY3Rpb25NYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gYWN0aW9uRm9ybSBUaGUgb3B0aW9uYWwgQWN0aW9uRm9ybSBiZWFuIGZvciB0aGlzIHJlcXVlc3QgKGlmIGFueSkKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgSFRUUCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBIVFRQIHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBleGNlcHRpb24gb2NjdXJzCisgICAgICovCisgICAgcHVibGljIEFjdGlvbkZvcndhcmQgcGVyZm9ybShBY3Rpb25NYXBwaW5nIG1hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb25Gb3JtIGZvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gTG9vayB1cCB0aGUgY29tcG9uZW50cyB3ZSB3aWxsIGJlIHVzaW5nIGFzIG5lZWRlZAorICAgICAgICBpZiAobXNlcnZlciA9PSBudWxsKSB7CisgICAgICAgICAgICBtc2VydmVyID0gKChBcHBsaWNhdGlvblNlcnZsZXQpIGdldFNlcnZsZXQoKSkuZ2V0U2VydmVyKCk7CisgICAgICAgIH0KKyAgICAgICAgTWVzc2FnZVJlc291cmNlcyByZXNvdXJjZXMgPSBnZXRSZXNvdXJjZXMocmVxdWVzdCk7CisgICAgICAgIEh0dHBTZXNzaW9uIHNlc3Npb24gPSByZXF1ZXN0LmdldFNlc3Npb24oKTsKKyAgICAgICAgTG9jYWxlIGxvY2FsZSA9IGdldExvY2FsZShyZXF1ZXN0KTsKKworICAgICAgICAvLyBIYXMgdGhpcyB0cmFuc2FjdGlvbiBiZWVuIGNhbmNlbGxlZD8KKyAgICAgICAgaWYgKGlzQ2FuY2VsbGVkKHJlcXVlc3QpKSB7CisgICAgICAgICAgICByZXR1cm4gKG1hcHBpbmcuZmluZEZvcndhcmQoIkxpc3QgUmVzb3VyY2UgTGlua3MgU2V0dXAiKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBDaGVjayB0aGUgdHJhbnNhY3Rpb24gdG9rZW4KKyAgICAgICAgaWYgKCFpc1Rva2VuVmFsaWQocmVxdWVzdCkpIHsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0JBRF9SRVFVRVNULAorICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci50b2tlbiIpKTsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBQZXJmb3JtIGFueSBleHRyYSB2YWxpZGF0aW9uIHRoYXQgaXMgcmVxdWlyZWQKKyAgICAgICAgUmVzb3VyY2VMaW5rc0Zvcm0gcmVzb3VyY2VMaW5rc0Zvcm0gPSAoUmVzb3VyY2VMaW5rc0Zvcm0pIGZvcm07CisgICAgICAgIFN0cmluZyByZXNvdXJjZUxpbmtzW10gPSByZXNvdXJjZUxpbmtzRm9ybS5nZXRSZXNvdXJjZUxpbmtzKCk7CisgICAgICAgIGlmIChyZXNvdXJjZUxpbmtzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJlc291cmNlTGlua3MgPSBuZXcgU3RyaW5nWzBdOworICAgICAgICB9CisKKyAgICAgICAgLy8gUGVyZm9ybSAiRGVsZXRlIFJlc291cmNlIExpbmsiIHRyYW5zYWN0aW9ucyBhcyByZXF1aXJlZAorICAgICAgICB0cnkgeworICAgICAgICAgICAgCisgICAgICAgICAgICBTdHJpbmcgcmVzb3VyY2V0eXBlID0gcmVzb3VyY2VMaW5rc0Zvcm0uZ2V0UmVzb3VyY2V0eXBlKCk7CisgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IHJlc291cmNlTGlua3NGb3JtLmdldFBhdGgoKTsKKyAgICAgICAgICAgIFN0cmluZyBob3N0ID0gcmVzb3VyY2VMaW5rc0Zvcm0uZ2V0SG9zdCgpOworICAgICAgICAgICAgCisgICAgICAgICAgICBPYmplY3ROYW1lIGRuYW1lID0gbnVsbDsKKworICAgICAgICAgICAgU3RyaW5nIHNpZ25hdHVyZVtdID0gbmV3IFN0cmluZ1sxXTsKKyAgICAgICAgICAgIHNpZ25hdHVyZVswXSA9ICJqYXZhLmxhbmcuU3RyaW5nIjsKKyAgICAgICAgICAgIE9iamVjdCBwYXJhbXNbXSA9IG5ldyBTdHJpbmdbMV07CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VMaW5rcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPSBuZXcgT2JqZWN0TmFtZShyZXNvdXJjZUxpbmtzW2ldKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZG9tYWluID0gb25hbWUuZ2V0RG9tYWluKCk7ICAKKyAgICAgICAgICAgICAgICBkbmFtZSA9IFJlc291cmNlVXRpbHMuZ2V0TmFtaW5nUmVzb3VyY2VPYmplY3ROYW1lKGRvbWFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXR5cGUsIHBhdGgsIGhvc3QpOworICAgICAgICAgICAgICAgIHBhcmFtc1swXSA9IG9uYW1lLmdldEtleVByb3BlcnR5KCJuYW1lIik7CisgICAgICAgICAgICAgICAgbXNlcnZlci5pbnZva2UoZG5hbWUsICJyZW1vdmVSZXNvdXJjZUxpbmsiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcywgc2lnbmF0dXJlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworCisgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nCisgICAgICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmludm9rZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZW1vdmVSZXNvdXJjZSIpLCB0KTsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuaW52b2tlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlbW92ZVJlc291cmNlIikpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKworICAgICAgICB9CisKKyAgICAgICAgLy8gUHJvY2VlZCB0byB0aGUgbGlzdCBlbnZFbnRyeXMgc2NyZWVuCisgICAgICAgIHJldHVybiAobWFwcGluZy5maW5kRm9yd2FyZCgiUmVzb3VyY2VMaW5rcyBMaXN0IFNldHVwIikpOworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVzb3VyY2VzL0RlbGV0ZVVzZXJEYXRhYmFzZXNBY3Rpb24uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZXNvdXJjZXMvRGVsZXRlVXNlckRhdGFiYXNlc0FjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhNDZkNTcKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVzb3VyY2VzL0RlbGV0ZVVzZXJEYXRhYmFzZXNBY3Rpb24uamF2YQpAQCAtMCwwICsxLDE1OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVzb3VyY2VzOworCisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkVycm9yczsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9ybTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9yd2FyZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LkF0dHJpYnV0ZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXJGYWN0b3J5OworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuUXVlcnlFeHA7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5RdWVyeTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdEluc3RhbmNlOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LkpNRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5BdHRyaWJ1dGVJbmZvOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5PcGVyYXRpb25JbmZvOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5JbmZvOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLnV0aWwuTWVzc2FnZVJlc291cmNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5BcHBsaWNhdGlvblNlcnZsZXQ7CisKKworLyoqCisgKiA8cD5JbXBsZW1lbnRhdGlvbiBvZiA8c3Ryb25nPkFjdGlvbjwvc3Ryb25nPiB0aGF0IGRlbGV0ZXMgdGhlCisgKiBzcGVjaWZpZWQgc2V0IG9mIHVzZXIgZGF0YWJhc2VzLjwvcD4KKyAqCisgKiBAYXV0aG9yIE1hbnZlZW4gS2F1cgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqIEBzaW5jZSA0LjEKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgRGVsZXRlVXNlckRhdGFiYXNlc0FjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgTUJlYW5TZXJ2ZXIgd2Ugd2lsbCBiZSBpbnRlcmFjdGluZyB3aXRoLgorICAgICAqLworICAgIHByaXZhdGUgTUJlYW5TZXJ2ZXIgbXNlcnZlciA9IG51bGw7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBzcGVjaWZpZWQgSFRUUCByZXF1ZXN0LCBhbmQgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIEhUVFAKKyAgICAgKiByZXNwb25zZSAob3IgZm9yd2FyZCB0byBhbm90aGVyIHdlYiBjb21wb25lbnQgdGhhdCB3aWxsIGNyZWF0ZSBpdCkuCisgICAgICogUmV0dXJuIGFuIDxjb2RlPkFjdGlvbkZvcndhcmQ8L2NvZGU+IGluc3RhbmNlIGRlc2NyaWJpbmcgd2hlcmUgYW5kIGhvdworICAgICAqIGNvbnRyb2wgc2hvdWxkIGJlIGZvcndhcmRlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHJlc3BvbnNlIGhhcworICAgICAqIGFscmVhZHkgYmVlbiBjb21wbGV0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgQWN0aW9uTWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIGFjdGlvbkZvcm0gVGhlIG9wdGlvbmFsIEFjdGlvbkZvcm0gYmVhbiBmb3IgdGhpcyByZXF1ZXN0IChpZiBhbnkpCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIEhUVFAgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgSFRUUCByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXhjZXB0aW9uIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBBY3Rpb25Gb3J3YXJkIHBlcmZvcm0oQWN0aW9uTWFwcGluZyBtYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uRm9ybSBmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIExvb2sgdXAgdGhlIGNvbXBvbmVudHMgd2Ugd2lsbCBiZSB1c2luZyBhcyBuZWVkZWQKKyAgICAgICAgaWYgKG1zZXJ2ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgbXNlcnZlciA9ICgoQXBwbGljYXRpb25TZXJ2bGV0KSBnZXRTZXJ2bGV0KCkpLmdldFNlcnZlcigpOworICAgICAgICB9CisgICAgICAgIE1lc3NhZ2VSZXNvdXJjZXMgcmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VzKHJlcXVlc3QpOworICAgICAgICBIdHRwU2Vzc2lvbiBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uKCk7CisgICAgICAgIExvY2FsZSBsb2NhbGUgPSBnZXRMb2NhbGUocmVxdWVzdCk7CisKKyAgICAgICAgLy8gSGFzIHRoaXMgdHJhbnNhY3Rpb24gYmVlbiBjYW5jZWxsZWQ/CisgICAgICAgIGlmIChpc0NhbmNlbGxlZChyZXF1ZXN0KSkgeworICAgICAgICAgICAgcmV0dXJuIChtYXBwaW5nLmZpbmRGb3J3YXJkKCJMaXN0IFVzZXJEYXRhYmFzZXMgU2V0dXAiKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBDaGVjayB0aGUgdHJhbnNhY3Rpb24gdG9rZW4KKyAgICAgICAgaWYgKCFpc1Rva2VuVmFsaWQocmVxdWVzdCkpIHsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0JBRF9SRVFVRVNULAorICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci50b2tlbiIpKTsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBQZXJmb3JtIGFueSBleHRyYSB2YWxpZGF0aW9uIHRoYXQgaXMgcmVxdWlyZWQKKyAgICAgICAgVXNlckRhdGFiYXNlc0Zvcm0gdXNlckRhdGFiYXNlc0Zvcm0gPSAoVXNlckRhdGFiYXNlc0Zvcm0pIGZvcm07CisgICAgICAgIFN0cmluZyB1c2VyRGF0YWJhc2VzW10gPSB1c2VyRGF0YWJhc2VzRm9ybS5nZXRVc2VyRGF0YWJhc2VzKCk7CisgICAgICAgIGlmICh1c2VyRGF0YWJhc2VzID09IG51bGwpIHsKKyAgICAgICAgICAgIHVzZXJEYXRhYmFzZXMgPSBuZXcgU3RyaW5nWzBdOworICAgICAgICB9CisKKyAgICAgICAgLy8gUGVyZm9ybSAiRGVsZXRlIFVzZXIgRGF0YWJhc2UiIHRyYW5zYWN0aW9ucyBhcyByZXF1aXJlZAorICAgICAgICB0cnkgeworCisgICAgICAgICAgICBTdHJpbmcgc2lnbmF0dXJlW10gPSBuZXcgU3RyaW5nWzFdOworICAgICAgICAgICAgc2lnbmF0dXJlWzBdID0gImphdmEubGFuZy5TdHJpbmciOworICAgICAgICAgICAgT2JqZWN0IHBhcmFtc1tdID0gbmV3IFN0cmluZ1sxXTsKKworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB1c2VyRGF0YWJhc2VzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9IG5ldyBPYmplY3ROYW1lKHVzZXJEYXRhYmFzZXNbaV0pOworICAgICAgICAgICAgICAgIC8vIENvbnN0cnVjdCB0aGUgTUJlYW4gTmFtZSBmb3IgdGhlIG5hbWluZyBzb3VyY2UKKyAgICAgICAgICAgICAgICBPYmplY3ROYW1lIGRuYW1lID0gbmV3IE9iamVjdE5hbWUob25hbWUuZ2V0RG9tYWluKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VVdGlscy5OQU1JTkdSRVNPVVJDRVNfVFlQRSArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VVdGlscy5HTE9CQUxfVFlQRSk7CisgICAgICAgICAgICAgICAgcGFyYW1zWzBdID0gb25hbWUuZ2V0S2V5UHJvcGVydHkoIm5hbWUiKTsKKyAgICAgICAgICAgICAgICBtc2VydmVyLmludm9rZShkbmFtZSwgInJlbW92ZVJlc291cmNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMsIHNpZ25hdHVyZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKworICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZworICAgICAgICAgICAgICAgIChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5pbnZva2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVtb3ZlUmVzb3VyY2UiKSwgdCk7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsCisgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmludm9rZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZW1vdmVSZXNvdXJjZSIpKTsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisKKyAgICAgICAgfQorCisgICAgICAgIC8vIFByb2NlZWQgdG8gdGhlIGxpc3QgZW52RW50cnlzIHNjcmVlbgorICAgICAgICByZXR1cm4gKG1hcHBpbmcuZmluZEZvcndhcmQoIlVzZXJEYXRhYmFzZXMgTGlzdCBTZXR1cCIpKTsKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3Jlc291cmNlcy9FbnZFbnRyaWVzRm9ybS5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3Jlc291cmNlcy9FbnZFbnRyaWVzRm9ybS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4NGM1MzkKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVzb3VyY2VzL0VudkVudHJpZXNGb3JtLmphdmEKQEAgLTAsMCArMSwxNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5yZXNvdXJjZXM7CisKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkVycm9yOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25FcnJvcnM7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CisKKworLyoqCisgKiBGb3JtIGJlYW4gZm9yIHRoZSBkZWxldGUgZW52IGVudHJpZXMgcGFnZS4KKyAqCisgKiBAYXV0aG9yIE1hbnZlZW4gS2F1cgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqIEBzaW5jZSA0LjEKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgRW52RW50cmllc0Zvcm0gZXh0ZW5kcyBCYXNlRm9ybSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogVGhlIG9iamVjdCBuYW1lcyBvZiB0aGUgc3BlY2lmaWVkIGVudmlyb25tZW50IGVudHJpZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZW52RW50cmllc1tdID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRFbnZFbnRyaWVzKCkgeworICAgICAgICByZXR1cm4gKHRoaXMuZW52RW50cmllcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RW52RW50cmllcyhTdHJpbmcgZW52RW50cmllc1tdKSB7CisgICAgICAgIHRoaXMuZW52RW50cmllcyA9IGVudkVudHJpZXM7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFRoZSByZXNvdXJjZSB0eXBlIG9mIHRoaXMgZW52aXJvbm1lbnQgZW50cnkuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcmVzb3VyY2V0eXBlID0gbnVsbDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHJlc291cmNlIHR5cGUgb2YgdGhlIGVudmlyb25tZW50IGVudHJ5IHRoaXMgYmVhbiByZWZlcnMgdG8uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZXR5cGUoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnJlc291cmNldHlwZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHJlc291cmNlIHR5cGUgb2YgdGhlIGVudmlyb25tZW50IGVudHJ5IHRoaXMgYmVhbiByZWZlcnMgdG8uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVzb3VyY2V0eXBlKFN0cmluZyByZXNvdXJjZXR5cGUpIHsKKyAgICAgICAgdGhpcy5yZXNvdXJjZXR5cGUgPSByZXNvdXJjZXR5cGU7CisgICAgfQorICAgICAgIAorICAgIC8qKgorICAgICAqIFRoZSBwYXRoIG9mIHRoaXMgZW52aXJvbm1lbnQgZW50cnkuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcGF0aCA9IG51bGw7CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBwYXRoIG9mIHRoZSBlbnZpcm9ubWVudCBlbnRyeSB0aGlzIGJlYW4gcmVmZXJzIHRvLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucGF0aDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHBhdGggb2YgdGhlIGVudmlyb25tZW50IGVudHJ5IHRoaXMgYmVhbiByZWZlcnMgdG8uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGF0aChTdHJpbmcgcGF0aCkgeworICAgICAgICB0aGlzLnBhdGggPSBwYXRoOworICAgIH0KKyAgICAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgaG9zdCBvZiB0aGlzIGVudmlyb25tZW50IGVudHJ5LgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGhvc3QgPSBudWxsOworICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgaG9zdCBvZiB0aGUgZW52aXJvbm1lbnQgZW50cnkgdGhpcyBiZWFuIHJlZmVycyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEhvc3QoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmhvc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBob3N0IG9mIHRoZSBlbnZpcm9ubWVudCBlbnRyeSB0aGlzIGJlYW4gcmVmZXJzIHRvLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEhvc3QoU3RyaW5nIGhvc3QpIHsKKyAgICAgICAgdGhpcy5ob3N0ID0gaG9zdDsKKyAgICB9ICAgIAorICAgIAorICAgICAgIAorICAgIC8qKgorICAgICAqIFRoZSBkb21haW4gb2YgdGhpcyBlbnZpcm9ubWVudCBlbnRyeS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBkb21haW4gPSBudWxsOworICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZG9tYWluIG9mIHRoZSBlbnZpcm9ubWVudCBlbnRyeSB0aGlzIGJlYW4gcmVmZXJzIHRvLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RG9tYWluKCkgeworICAgICAgICByZXR1cm4gdGhpcy5kb21haW47CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBkb21haW4gb2YgdGhlIGVudmlyb25tZW50IGVudHJ5IHRoaXMgYmVhbiByZWZlcnMgdG8uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RG9tYWluKFN0cmluZyBkb21haW4pIHsKKyAgICAgICAgdGhpcy5kb21haW4gPSBkb21haW47CisgICAgfQorICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZXNldCBhbGwgcHJvcGVydGllcyB0byB0aGVpciBkZWZhdWx0IHZhbHVlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBtYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVzZXQoQWN0aW9uTWFwcGluZyBtYXBwaW5nLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworCisgICAgICAgIHN1cGVyLnJlc2V0KG1hcHBpbmcsIHJlcXVlc3QpOworICAgICAgICB0aGlzLmVudkVudHJpZXMgPSBudWxsOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZXNvdXJjZXMvRW52RW50cnlGb3JtLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVzb3VyY2VzL0VudkVudHJ5Rm9ybS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MGRlZDMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVzb3VyY2VzL0VudkVudHJ5Rm9ybS5qYXZhCkBAIC0wLDAgKzEsMzU4IEBACisvKgorICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVzb3VyY2VzOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkVycm9yOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25FcnJvcnM7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uTGFiZWxWYWx1ZUJlYW47CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKKworLyoqCisgKiBGb3JtIGJlYW4gZm9yIHRoZSBpbmRpdmlkdWFsIGVudmlyb25tZW50IGVudHJ5IHBhZ2UuCisgKgorICogQGF1dGhvciBNYW52ZWVuIEthdXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKiBAc2luY2UgNC4xCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIEVudkVudHJ5Rm9ybSBleHRlbmRzIEJhc2VGb3JtIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYXNzb2NpYXRlZCBlbnRyeS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBuYW1lID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLm5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBvZiB0aGUgYXNzb2NpYXRlZCBlbnRyeS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBlbnRyeVR5cGUgPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXRFbnRyeVR5cGUoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5lbnRyeVR5cGUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEVudHJ5VHlwZShTdHJpbmcgZW50cnlUeXBlKSB7CisgICAgICAgIHRoaXMuZW50cnlUeXBlID0gZW50cnlUeXBlOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIHZhbHVlIG9mIHRoZSBhc3NvY2lhdGVkIGVudHJ5LgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHZhbHVlID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisgICAgICAgIHJldHVybiAodGhpcy52YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIGFzc29jaWF0ZWQgZW50cnkuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb24gPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLmRlc2NyaXB0aW9uKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKKyAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSB2YWx1ZSBvZiBvdmVycmlkZSBhcHBsIGxldmVsIGVudHJpZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIG92ZXJyaWRlID0gdHJ1ZTsKKworICAgIHB1YmxpYyBib29sZWFuIGdldE92ZXJyaWRlKCkgeworICAgICAgICByZXR1cm4gKHRoaXMub3ZlcnJpZGUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE92ZXJyaWRlKGJvb2xlYW4gb3ZlcnJpZGUpIHsKKyAgICAgICAgdGhpcy5vdmVycmlkZSA9IG92ZXJyaWRlOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgcmVzb3VyY2UgdHlwZSBvZiB0aGlzIGVudmlyb25tZW50IGVudHJ5LgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHJlc291cmNldHlwZSA9IG51bGw7CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSByZXNvdXJjZSB0eXBlIG9mIHRoZSBlbnZpcm9ubWVudCBlbnRyeSB0aGlzIGJlYW4gcmVmZXJzIHRvLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2V0eXBlKCkgeworICAgICAgICByZXR1cm4gdGhpcy5yZXNvdXJjZXR5cGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSByZXNvdXJjZSB0eXBlIG9mIHRoZSBlbnZpcm9ubWVudCBlbnRyeSB0aGlzIGJlYW4gcmVmZXJzIHRvLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlc291cmNldHlwZShTdHJpbmcgcmVzb3VyY2V0eXBlKSB7CisgICAgICAgIHRoaXMucmVzb3VyY2V0eXBlID0gcmVzb3VyY2V0eXBlOworICAgIH0KKyAgICAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgcGF0aCBvZiB0aGlzIGVudmlyb25tZW50IGVudHJ5LgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHBhdGggPSBudWxsOworICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcGF0aCBvZiB0aGUgZW52aXJvbm1lbnQgZW50cnkgdGhpcyBiZWFuIHJlZmVycyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhdGgoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnBhdGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBwYXRoIG9mIHRoZSBlbnZpcm9ubWVudCBlbnRyeSB0aGlzIGJlYW4gcmVmZXJzIHRvLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhdGgoU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgdGhpcy5wYXRoID0gcGF0aDsKKyAgICB9CisgICAgICAgCisgICAgLyoqCisgICAgICogVGhlIGhvc3Qgb2YgdGhpcyBlbnZpcm9ubWVudCBlbnRyeS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBob3N0ID0gbnVsbDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGhvc3Qgb2YgdGhlIGVudmlyb25tZW50IGVudHJ5IHRoaXMgYmVhbiByZWZlcnMgdG8uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRIb3N0KCkgeworICAgICAgICByZXR1cm4gdGhpcy5ob3N0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgaG9zdCBvZiB0aGUgZW52aXJvbm1lbnQgZW50cnkgdGhpcyBiZWFuIHJlZmVycyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRIb3N0KFN0cmluZyBob3N0KSB7CisgICAgICAgIHRoaXMuaG9zdCA9IGhvc3Q7CisgICAgfSAgICAKKyAgICAKKyAgICAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgZG9tYWluIG9mIHRoaXMgZW52aXJvbm1lbnQgZW50cnkuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZG9tYWluID0gbnVsbDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGRvbWFpbiBvZiB0aGUgZW52aXJvbm1lbnQgZW50cnkgdGhpcyBiZWFuIHJlZmVycyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldERvbWFpbigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZG9tYWluOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZG9tYWluIG9mIHRoZSBlbnZpcm9ubWVudCBlbnRyeSB0aGlzIGJlYW4gcmVmZXJzIHRvLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERvbWFpbihTdHJpbmcgZG9tYWluKSB7CisgICAgICAgIHRoaXMuZG9tYWluID0gZG9tYWluOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBQcmVjb21wdXRlZCBsaXN0IG9mIGVudHJ5IHR5cGUgbGFiZWxzIGFuZCB2YWx1ZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgTGlzdCB0eXBlVmFscyA9IG5ldyBBcnJheUxpc3QoKTsKKworICAgIHN0YXRpYyB7CisgICAgICAgIHR5cGVWYWxzLmFkZChuZXcgTGFiZWxWYWx1ZUJlYW4oImphdmEubGFuZy5Cb29sZWFuIiwgImphdmEubGFuZy5Cb29sZWFuIikpOworICAgICAgICB0eXBlVmFscy5hZGQobmV3IExhYmVsVmFsdWVCZWFuKCJqYXZhLmxhbmcuQnl0ZSIsICJqYXZhLmxhbmcuQnl0ZSIpKTsKKyAgICAgICAgdHlwZVZhbHMuYWRkKG5ldyBMYWJlbFZhbHVlQmVhbigiamF2YS5sYW5nLkNoYXJhY3RlciIsICJqYXZhLmxhbmcuQ2hhcmFjdGVyIikpOworICAgICAgICB0eXBlVmFscy5hZGQobmV3IExhYmVsVmFsdWVCZWFuKCJqYXZhLmxhbmcuRG91YmxlIiwgImphdmEubGFuZy5Eb3VibGUiKSk7CisgICAgICAgIHR5cGVWYWxzLmFkZChuZXcgTGFiZWxWYWx1ZUJlYW4oImphdmEubGFuZy5GbG9hdCIsICJqYXZhLmxhbmcuRmxvYXQiKSk7CisgICAgICAgIHR5cGVWYWxzLmFkZChuZXcgTGFiZWxWYWx1ZUJlYW4oImphdmEubGFuZy5JbnRlZ2VyIiwgImphdmEubGFuZy5JbnRlZ2VyIikpOyAgICAKKyAgICAgICAgdHlwZVZhbHMuYWRkKG5ldyBMYWJlbFZhbHVlQmVhbigiamF2YS5sYW5nLkxvbmciLCAiamF2YS5sYW5nLkxvbmciKSk7CisgICAgICAgIHR5cGVWYWxzLmFkZChuZXcgTGFiZWxWYWx1ZUJlYW4oImphdmEubGFuZy5TaG9ydCIsICJqYXZhLmxhbmcuU2hvcnQiKSk7ICAgICAgICAKKyAgICAgICAgdHlwZVZhbHMuYWRkKG5ldyBMYWJlbFZhbHVlQmVhbigiamF2YS5sYW5nLlN0cmluZyIsICJqYXZhLmxhbmcuU3RyaW5nIikpOyAgICAgICAgICAgCisgICAgICAgIAorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdHlwZVZhbHMuCisgICAgICovCisgICAgcHVibGljIExpc3QgZ2V0VHlwZVZhbHMoKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy50eXBlVmFsczsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgdHlwZVZhbHMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VHlwZVZhbHMoTGlzdCB0eXBlVmFscykgeworICAgICAgICAKKyAgICAgICAgdGhpcy50eXBlVmFscyA9IHR5cGVWYWxzOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKyAgICAvKioKKyAgICAgKiBSZXNldCBhbGwgcHJvcGVydGllcyB0byB0aGVpciBkZWZhdWx0IHZhbHVlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBtYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVzZXQoQWN0aW9uTWFwcGluZyBtYXBwaW5nLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworCisgICAgICAgIHN1cGVyLnJlc2V0KG1hcHBpbmcsIHJlcXVlc3QpOworICAgICAgICBuYW1lID0gbnVsbDsKKyAgICAgICAgZW50cnlUeXBlID0gbnVsbDsKKyAgICAgICAgdmFsdWUgPSBudWxsOworICAgICAgICBkZXNjcmlwdGlvbiA9IG51bGw7CisgICAgICAgIG92ZXJyaWRlID0gZmFsc2U7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWYWxpZGF0ZSB0aGUgcHJvcGVydGllcyB0aGF0IGhhdmUgYmVlbiBzZXQgZnJvbSB0aGlzIEhUVFAgcmVxdWVzdCwKKyAgICAgKiBhbmQgcmV0dXJuIGFuIDxjb2RlPkFjdGlvbkVycm9yczwvY29kZT4gb2JqZWN0IHRoYXQgZW5jYXBzdWxhdGVzIGFueQorICAgICAqIHZhbGlkYXRpb24gZXJyb3JzIHRoYXQgaGF2ZSBiZWVuIGZvdW5kLiAgSWYgbm8gZXJyb3JzIGFyZSBmb3VuZCwgcmV0dXJuCisgICAgICogPGNvZGU+bnVsbDwvY29kZT4gb3IgYW4gPGNvZGU+QWN0aW9uRXJyb3JzPC9jb2RlPiBvYmplY3Qgd2l0aCBubworICAgICAqIHJlY29yZGVkIGVycm9yIG1lc3NhZ2VzLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIG1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKi8KKyAgICAKKyAgICBwcml2YXRlIEFjdGlvbkVycm9ycyBlcnJvcnMgPSBudWxsOworICAgIAorICAgIHB1YmxpYyBBY3Rpb25FcnJvcnMgdmFsaWRhdGUoQWN0aW9uTWFwcGluZyBtYXBwaW5nLAorICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisKKyAgICAgICAgZXJyb3JzID0gbmV3IEFjdGlvbkVycm9ycygpOworCisgICAgICAgIFN0cmluZyBzdWJtaXQgPSByZXF1ZXN0LmdldFBhcmFtZXRlcigic3VibWl0Iik7CisgICAgICAgIC8vaWYgKHN1Ym1pdCAhPSBudWxsKSB7CisKKyAgICAgICAgICAgIC8vIG5hbWUgaXMgYSByZXF1aXJlZCBmaWVsZAorICAgICAgICAgICAgaWYgKChuYW1lID09IG51bGwpIHx8IChuYW1lLmxlbmd0aCgpIDwgMSkpIHsKKyAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKCJuYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBY3Rpb25FcnJvcigicmVzb3VyY2VzLmVycm9yLm5hbWUucmVxdWlyZWQiKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHZhbHVlIGlzIGEgcmVxdWlyZWQgZmllbGQKKyAgICAgICAgICAgIGlmICgodmFsdWUgPT0gbnVsbCkgfHwgKHZhbHVlLmxlbmd0aCgpIDwgMSkpIHsKKyAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKCJ2YWx1ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQWN0aW9uRXJyb3IoInJlc291cmNlcy5lcnJvci52YWx1ZS5yZXF1aXJlZCIpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gUXVvdGVzIG5vdCBhbGxvd2VkIGluIG5hbWUKKyAgICAgICAgICAgIGlmICgobmFtZSAhPSBudWxsKSAmJiAobmFtZS5pbmRleE9mKCciJykgPj0gMCkpIHsKKyAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKCJuYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBY3Rpb25FcnJvcigidXNlcnMuZXJyb3IucXVvdGVzIikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBRdW90ZXMgbm90IGFsbG93ZWQgaW4gdmFsdWUKKyAgICAgICAgICAgIGlmICgodmFsdWUgIT0gbnVsbCkgJiYgKHZhbHVlLmluZGV4T2YoJyInKSA+IDApKSB7CisgICAgICAgICAgICAgICAgZXJyb3JzLmFkZCgidmFsdWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFjdGlvbkVycm9yKCJ1c2Vycy5lcnJvci5xdW90ZXMiKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFF1b3RlcyBub3QgYWxsb3dlZCBpbiBkZXNjcmlwdGlvbgorICAgICAgICAgICAgaWYgKChkZXNjcmlwdGlvbiAhPSBudWxsKSAmJiAoZGVzY3JpcHRpb24uaW5kZXhPZignIicpID4gMCkpIHsKKyAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKCJkZXNjcmlwdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQWN0aW9uRXJyb3IoInVzZXJzLmVycm9yLnF1b3RlcyIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gaWYgY2VoY2tlZCwgb3ZlcnJpZGUgd2lsbCBiZSBzZW50IGFzIGEgcmVxdWVzdCBwYXJhbWV0ZXIKKyAgICAgICAgICAgIG92ZXJyaWRlID0gKHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJvdmVycmlkZSIpICE9IG51bGwpOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAodmFsaWRhdGVUeXBlKGVudHJ5VHlwZSwgdmFsdWUpKSB7CisgICAgICAgICAgICAgICAgICAgZXJyb3JzLmFkZCgidmFsdWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFjdGlvbkVycm9yKCJyZXNvdXJjZXMuZXJyb3IudmFsdWUubWlzbWF0Y2giKSk7CisgICAgICAgICAgICB9CisgICAgICAgIC8vfQorICAgICAgICByZXR1cm4gKGVycm9ycyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW50cnkgdHlwZSBtdXN0IG1hdGNoIHR5cGUgb2YgdmFsdWUuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRlVHlwZShTdHJpbmcgZW50cnlUeXBlLCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgQ2xhc3MgY2xzID0gbnVsbDsKKyAgICAgICAgYm9vbGVhbiBtaXNtYXRjaCA9IGZhbHNlOworICAgICAgICB0cnkgeworICAgICAgICAgICAgY2xzID0gQ2xhc3MuZm9yTmFtZShlbnRyeVR5cGUpOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoQ2hhcmFjdGVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oY2xzKSkgeworICAgICAgICAgICAgICAgIC8vIFNwZWNpYWwgaGFuZGxpbmcgaXMgbmVlZGVkIGJlY2F1c2UgdGhlIFVJIHJldHVybnMKKyAgICAgICAgICAgICAgICAvLyBhIHN0cmluZyBldmVuIGlmIGl0IGlzIGEgY2hhcmFjdGVyIChzaW5nbGUgbGVuZ3RoIHN0cmluZykuCisgICAgICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCgpICE9IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgbWlzbWF0Y2ggPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoQm9vbGVhbi5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGNscykpIHsKKyAgICAgICAgICAgICAgICAvLyBTcGVjaWFsIGhhbmRsaW5nIGlzIG5lZWRlZCBiZWNhdXNlIEJvb2xlYW4KKyAgICAgICAgICAgICAgICAvLyBzdHJpbmcgY29uc3RydWN0b3IgYWNjZXB0cyBhbnl0aGluZyBvdGhlciB0aGFuCisgICAgICAgICAgICAgICAgLy8gdHJ1ZSB0byBiZSBmYWxzZQorICAgICAgICAgICAgICAgIGlmICghKCJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKHZhbHVlKSB8fAorICAgICAgICAgICAgICAgICJmYWxzZSIuZXF1YWxzSWdub3JlQ2FzZSh2YWx1ZSkpKSB7CisgICAgICAgICAgICAgICAgICAgIG1pc21hdGNoID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKE51bWJlci5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGNscykpIHsKKyAgICAgICAgICAgICAgICAvLyBhbGwgbnVtYmVycyB0aHJvdyBOdW1iZXJGb3JtYXRFeGNlcHRpb24gaWYgdGhleSBhcmUKKyAgICAgICAgICAgICAgICAvLyBjb25zdHJ1Y3RlZCB3aXRoIGFuIGluY29ycmVjdCBudW1iZXIgc3RyaW5nCisgICAgICAgICAgICAgICAgLy8gV2UgdXNlIHRoZSBnZW5lcmFsIHN0cmluZyBjb25zdHJ1Y3RvciB0byBkbyB0aGlzIGpvYgorICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIENsYXNzW10gcGFyYW1ldGVyVHlwZXMgPSB7U3RyaW5nLmNsYXNzfTsKKyAgICAgICAgICAgICAgICAgICAgQ29uc3RydWN0b3IgY3QgPSBjbHMuZ2V0Q29uc3RydWN0b3IocGFyYW1ldGVyVHlwZXMpOworICAgICAgICAgICAgICAgICAgICBPYmplY3QgYXJnbGlzdDFbXSA9IHt2YWx1ZX07CisgICAgICAgICAgICAgICAgICAgIE9iamVjdCByZXRvYmogPSBjdC5uZXdJbnN0YW5jZShhcmdsaXN0MSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgbWlzbWF0Y2ggPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoU3RyaW5nLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oY2xzKSkgeworICAgICAgICAgICAgICAgIC8vIGFsbCBzdHJpbmdzIGFyZSBhbGxvd2VkCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIHZhbGlkYXRpb24gZm9yIG90aGVyIHR5cGVzIG5vdCBpbXBsZW1lbnRlZCB5ZXQKKyAgICAgICAgICAgICAgIGVycm9ycy5hZGQoImVudHJ5VHlwZSIsCisgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBY3Rpb25FcnJvcigicmVzb3VyY2VzLmVycm9yLmVudHJ5VHlwZS5ub3RpbXBsIikpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGNuZmUpIHsKKyAgICAgICAgICAgIC8vIGVudHJ5IHR5cGUgaGFzIGFuIGludmFsaWQgZW50cnkKKyAgICAgICAgICAgZXJyb3JzLmFkZCgiZW50cnlUeXBlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFjdGlvbkVycm9yKCJyZXNvdXJjZXMuZXJyb3IuZW50cnlUeXBlLmludmFsaWQiKSk7CisgICAgICAgICB9ICAgICAgICAKKyAgICAgICAgcmV0dXJuIG1pc21hdGNoOworICAgIH0KKyAgICAKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZXNvdXJjZXMvTGlzdERhdGFTb3VyY2VzQWN0aW9uLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVzb3VyY2VzL0xpc3REYXRhU291cmNlc0FjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2MGRlNzYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVzb3VyY2VzL0xpc3REYXRhU291cmNlc0FjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTM5IEBACisvKgorICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5yZXNvdXJjZXM7CisKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMRGVjb2RlcjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3J3YXJkOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLnV0aWwuTWVzc2FnZVJlc291cmNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5BcHBsaWNhdGlvblNlcnZsZXQ7CisKKworLyoqCisgKiA8cD5SZXRyaWV2ZSB0aGUgc2V0IG9mIE1CZWFuIG5hbWVzIGZvciBhbGwgY3VycmVudGx5IGRlZmluZWQgZGF0YSBzb3VyY2VzLAorICogYW5kIGV4cG9zZSB0aGVtIGluIGEgcmVxdWVzdCBhdHRyaWJ1dGUgbmFtZWQgImRhdGFTb3VyY2VzRm9ybSIuICBUaGlzIGFjdGlvbgorICogcmVxdWlyZXMgdGhlIGZvbGxvd2luZyByZXF1ZXN0IHBhcmFtZXRlcnMgdG8gYmUgc2V0OjwvcD4KKyAqIDx1bD4KKyAqIDxsaT48c3Ryb25nPmZvcndhcmQ8L3N0cm9uZz4gLSBHbG9iYWwgZm9yd2FyZCB0byB3aGljaCB3ZSBzaG91bGQKKyAqICAgICBnbyBhZnRlciBzdGFzaGluZyB0aGUgZGF0YVNvdXJjZXMgbGlzdC48L2xpPgorICogPC91bD4KKyAqCisgKiBAYXV0aG9yIE1hbnZlZW4gS2F1cgorICogQGF1dGhvciBBbXkgUm9oCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICogQHNpbmNlIDQuMQorICovCisKK3B1YmxpYyBjbGFzcyBMaXN0RGF0YVNvdXJjZXNBY3Rpb24gZXh0ZW5kcyBBY3Rpb24geworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKyAgICAvKioKKyAgICAgKiBUaGUgTUJlYW5TZXJ2ZXIgd2Ugd2lsbCBiZSBpbnRlcmFjdGluZyB3aXRoLgorICAgICAqLworICAgIHByaXZhdGUgTUJlYW5TZXJ2ZXIgbXNlcnZlciA9IG51bGw7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBzcGVjaWZpZWQgSFRUUCByZXF1ZXN0LCBhbmQgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIEhUVFAKKyAgICAgKiByZXNwb25zZSAob3IgZm9yd2FyZCB0byBhbm90aGVyIHdlYiBjb21wb25lbnQgdGhhdCB3aWxsIGNyZWF0ZSBpdCkuCisgICAgICogUmV0dXJuIGFuIDxjb2RlPkFjdGlvbkZvcndhcmQ8L2NvZGU+IGluc3RhbmNlIGRlc2NyaWJpbmcgd2hlcmUgYW5kIGhvdworICAgICAqIGNvbnRyb2wgc2hvdWxkIGJlIGZvcndhcmRlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHJlc3BvbnNlIGhhcworICAgICAqIGFscmVhZHkgYmVlbiBjb21wbGV0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgQWN0aW9uTWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIGFjdGlvbkZvcm0gVGhlIG9wdGlvbmFsIEFjdGlvbkZvcm0gYmVhbiBmb3IgdGhpcyByZXF1ZXN0IChpZiBhbnkpCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIEhUVFAgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgSFRUUCByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXhjZXB0aW9uIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBBY3Rpb25Gb3J3YXJkIHBlcmZvcm0oQWN0aW9uTWFwcGluZyBtYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uRm9ybSBmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisKKyAgICAgICAgLy8gTG9vayB1cCB0aGUgY29tcG9uZW50cyB3ZSB3aWxsIGJlIHVzaW5nIGFzIG5lZWRlZAorICAgICAgICBpZiAobXNlcnZlciA9PSBudWxsKSB7CisgICAgICAgICAgICBtc2VydmVyID0gKChBcHBsaWNhdGlvblNlcnZsZXQpIGdldFNlcnZsZXQoKSkuZ2V0U2VydmVyKCk7CisgICAgICAgIH0KKyAgICAgICAgTWVzc2FnZVJlc291cmNlcyByZXNvdXJjZXMgPSBnZXRSZXNvdXJjZXMocmVxdWVzdCk7CisgICAgICAgIEh0dHBTZXNzaW9uIHNlc3Npb24gPSByZXF1ZXN0LmdldFNlc3Npb24oKTsKKyAgICAgICAgTG9jYWxlIGxvY2FsZSA9IGdldExvY2FsZShyZXF1ZXN0KTsKKyAgICAgICAgCisgICAgICAgIFN0cmluZyByZXNvdXJjZXR5cGUgPSByZXF1ZXN0LmdldFBhcmFtZXRlcigicmVzb3VyY2V0eXBlIik7CisgICAgICAgIFN0cmluZyBwYXRoID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoInBhdGgiKTsKKyAgICAgICAgU3RyaW5nIGhvc3QgPSByZXF1ZXN0LmdldFBhcmFtZXRlcigiaG9zdCIpOworICAgICAgICBTdHJpbmcgZG9tYWluID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoImRvbWFpbiIpOworICAgICAgICAKKyAgICAgICAgaWYgKHJlc291cmNldHlwZSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXNvdXJjZXR5cGUgPSBVUkxEZWNvZGVyLmRlY29kZShyZXNvdXJjZXR5cGUpOworICAgICAgICB9CisgICAgICAgIGlmIChwYXRoICE9IG51bGwpIHsKKyAgICAgICAgICAgIHBhdGggPSBVUkxEZWNvZGVyLmRlY29kZShwYXRoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaG9zdCAhPSBudWxsKSB7CisgICAgICAgICAgICBob3N0ID0gVVJMRGVjb2Rlci5kZWNvZGUoaG9zdCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRvbWFpbiAhPSBudWxsKSB7CisgICAgICAgICAgICBkb21haW4gPSBVUkxEZWNvZGVyLmRlY29kZShkb21haW4pOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBDcmVhdGUgYSBmb3JtIGJlYW4gY29udGFpbmluZyB0aGUgcmVxdWVzdGVkIE1CZWFuIE5hbWVzCisgICAgICAgIERhdGFTb3VyY2VzRm9ybSBkYXRhU291cmNlc0Zvcm0gPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgICBkYXRhU291cmNlc0Zvcm0gPSAKKyAgICAgICAgICAgICAgICBSZXNvdXJjZVV0aWxzLmdldERhdGFTb3VyY2VzRm9ybShtc2VydmVyLCByZXNvdXJjZXR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCwgaG9zdCwgZG9tYWluKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cocmVzb3VyY2VzLmdldE1lc3NhZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2Vycy5lcnJvci5hdHRyaWJ1dGUuZ2V0IiwgInJlc291cmNlcyIpLCBlKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UKKyAgICAgICAgICAgICAgICAgKGxvY2FsZSwgInVzZXJzLmVycm9yLmF0dHJpYnV0ZS5nZXQiLCAicmVzb3VyY2VzIikpOworICAgICAgICB9CisKKyAgICAgICAgLy8gU3Rhc2ggdGhlIHJlc3VsdHMgaW4gcmVxdWVzdCBzY29wZQorICAgICAgICByZXF1ZXN0LnNldEF0dHJpYnV0ZSgiZGF0YVNvdXJjZXNGb3JtIiwgZGF0YVNvdXJjZXNGb3JtKTsKKyAgICAgICAgc2F2ZVRva2VuKHJlcXVlc3QpOworICAgICAgICBTdHJpbmcgZm9yd2FyZCA9CisgICAgICAgICAgICBVUkxEZWNvZGVyLmRlY29kZShyZXF1ZXN0LmdldFBhcmFtZXRlcigiZm9yd2FyZCIpKTsKKyAgICAgICAgCisgICAgICAgIHJldHVybiAobWFwcGluZy5maW5kRm9yd2FyZChmb3J3YXJkKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVzb3VyY2VzL0xpc3RFbnZFbnRyaWVzQWN0aW9uLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVzb3VyY2VzL0xpc3RFbnZFbnRyaWVzQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VmMjY5NQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZXNvdXJjZXMvTGlzdEVudkVudHJpZXNBY3Rpb24uamF2YQpAQCAtMCwwICsxLDEzOSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVzb3VyY2VzOworCisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTERlY29kZXI7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9ybTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9yd2FyZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy51dGlsLk1lc3NhZ2VSZXNvdXJjZXM7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uQXBwbGljYXRpb25TZXJ2bGV0OworCisKKy8qKgorICogPHA+UmV0cmlldmUgdGhlIHNldCBvZiBNQmVhbiBuYW1lcyBmb3IgYWxsIGN1cnJlbnRseSBkZWZpbmVkIGVudmlyb25tZW50IGVudHJpZXMsCisgKiBhbmQgZXhwb3NlIHRoZW0gaW4gYSByZXF1ZXN0IGF0dHJpYnV0ZSBuYW1lZCAiZW52ZW50cmllc0Zvcm0iLiAgVGhpcyBhY3Rpb24KKyAqIHJlcXVpcmVzIHRoZSBmb2xsb3dpbmcgcmVxdWVzdCBwYXJhbWV0ZXJzIHRvIGJlIHNldDo8L3A+CisgKiA8dWw+CisgKiA8bGk+PHN0cm9uZz5mb3J3YXJkPC9zdHJvbmc+IC0gR2xvYmFsIGZvcndhcmQgdG8gd2hpY2ggd2Ugc2hvdWxkCisgKiAgICAgZ28gYWZ0ZXIgc3Rhc2hpbmcgdGhlIGVudiBlbnRyaWVzIGxpc3QuPC9saT4KKyAqIDwvdWw+CisgKgorICogQGF1dGhvciBNYW52ZWVuIEthdXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKiBAc2luY2UgNC4xCisgKi8KKworcHVibGljIGNsYXNzIExpc3RFbnZFbnRyaWVzQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBNQmVhblNlcnZlciB3ZSB3aWxsIGJlIGludGVyYWN0aW5nIHdpdGguCisgICAgICovCisgICAgcHJpdmF0ZSBNQmVhblNlcnZlciBtc2VydmVyID0gbnVsbDsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIHNwZWNpZmllZCBIVFRQIHJlcXVlc3QsIGFuZCBjcmVhdGUgdGhlIGNvcnJlc3BvbmRpbmcgSFRUUAorICAgICAqIHJlc3BvbnNlIChvciBmb3J3YXJkIHRvIGFub3RoZXIgd2ViIGNvbXBvbmVudCB0aGF0IHdpbGwgY3JlYXRlIGl0KS4KKyAgICAgKiBSZXR1cm4gYW4gPGNvZGU+QWN0aW9uRm9yd2FyZDwvY29kZT4gaW5zdGFuY2UgZGVzY3JpYmluZyB3aGVyZSBhbmQgaG93CisgICAgICogY29udHJvbCBzaG91bGQgYmUgZm9yd2FyZGVkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcmVzcG9uc2UgaGFzCisgICAgICogYWxyZWFkeSBiZWVuIGNvbXBsZXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBBY3Rpb25NYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gYWN0aW9uRm9ybSBUaGUgb3B0aW9uYWwgQWN0aW9uRm9ybSBiZWFuIGZvciB0aGlzIHJlcXVlc3QgKGlmIGFueSkKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgSFRUUCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBIVFRQIHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBleGNlcHRpb24gb2NjdXJzCisgICAgICovCisgICAgcHVibGljIEFjdGlvbkZvcndhcmQgcGVyZm9ybShBY3Rpb25NYXBwaW5nIG1hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb25Gb3JtIGZvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKworICAgICAgICAvLyBMb29rIHVwIHRoZSBjb21wb25lbnRzIHdlIHdpbGwgYmUgdXNpbmcgYXMgbmVlZGVkCisgICAgICAgIGlmIChtc2VydmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIG1zZXJ2ZXIgPSAoKEFwcGxpY2F0aW9uU2VydmxldCkgZ2V0U2VydmxldCgpKS5nZXRTZXJ2ZXIoKTsKKyAgICAgICAgfQorICAgICAgICBNZXNzYWdlUmVzb3VyY2VzIHJlc291cmNlcyA9IGdldFJlc291cmNlcyhyZXF1ZXN0KTsKKyAgICAgICAgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpOworICAgICAgICBMb2NhbGUgbG9jYWxlID0gZ2V0TG9jYWxlKHJlcXVlc3QpOworICAgICAgICAKKyAgICAgICAgU3RyaW5nIHJlc291cmNldHlwZSA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJyZXNvdXJjZXR5cGUiKTsKKyAgICAgICAgU3RyaW5nIHBhdGggPSByZXF1ZXN0LmdldFBhcmFtZXRlcigicGF0aCIpOworICAgICAgICBTdHJpbmcgaG9zdCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJob3N0Iik7CisgICAgICAgIFN0cmluZyBkb21haW4gPSByZXF1ZXN0LmdldFBhcmFtZXRlcigiZG9tYWluIik7CisgICAgICAgIAorICAgICAgICBpZiAocmVzb3VyY2V0eXBlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJlc291cmNldHlwZSA9IFVSTERlY29kZXIuZGVjb2RlKHJlc291cmNldHlwZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBhdGggIT0gbnVsbCkgeworICAgICAgICAgICAgcGF0aCA9IFVSTERlY29kZXIuZGVjb2RlKHBhdGgpOworICAgICAgICB9CisgICAgICAgIGlmIChob3N0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGhvc3QgPSBVUkxEZWNvZGVyLmRlY29kZShob3N0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZG9tYWluICE9IG51bGwpIHsKKyAgICAgICAgICAgIGRvbWFpbiA9IFVSTERlY29kZXIuZGVjb2RlKGRvbWFpbik7CisgICAgICAgIH0KKyAgICAgICAgLy8gQ3JlYXRlIGEgZm9ybSBiZWFuIGNvbnRhaW5pbmcgdGhlIHJlcXVlc3RlZCBNQmVhbiBOYW1lcworICAgICAgICBFbnZFbnRyaWVzRm9ybSBlbnZFbnRyaWVzRm9ybSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgIGVudkVudHJpZXNGb3JtID0gCisgICAgICAgICAgICAgICAgICAgIFJlc291cmNlVXRpbHMuZ2V0RW52RW50cmllc0Zvcm0obXNlcnZlciwgcmVzb3VyY2V0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgsIGhvc3QsIGRvbWFpbik7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nKHJlc291cmNlcy5nZXRNZXNzYWdlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNlcnMuZXJyb3IuYXR0cmlidXRlLmdldCIsICJlbnZpcm9ubWVudHMiKSwgZSk7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsCisgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlCisgICAgICAgICAgICAgICAgIChsb2NhbGUsICJ1c2Vycy5lcnJvci5hdHRyaWJ1dGUuZ2V0IiwgImVudmlyb25tZW50cyIpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFN0YXNoIHRoZSByZXN1bHRzIGluIHJlcXVlc3Qgc2NvcGUKKyAgICAgICAgcmVxdWVzdC5zZXRBdHRyaWJ1dGUoImVudkVudHJpZXNGb3JtIiwgZW52RW50cmllc0Zvcm0pOworICAgICAgICBzYXZlVG9rZW4ocmVxdWVzdCk7CisgICAgICAgIFN0cmluZyBmb3J3YXJkID0KKyAgICAgICAgICAgIFVSTERlY29kZXIuZGVjb2RlKHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJmb3J3YXJkIikpOworICAgICAgICAKKyAgICAgICAgcmV0dXJuIChtYXBwaW5nLmZpbmRGb3J3YXJkKGZvcndhcmQpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZXNvdXJjZXMvTGlzdE1haWxTZXNzaW9uc0FjdGlvbi5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3Jlc291cmNlcy9MaXN0TWFpbFNlc3Npb25zQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc4NTFjZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZXNvdXJjZXMvTGlzdE1haWxTZXNzaW9uc0FjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTM4IEBACisvKgorICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5yZXNvdXJjZXM7CisKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMRGVjb2RlcjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3J3YXJkOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLnV0aWwuTWVzc2FnZVJlc291cmNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5BcHBsaWNhdGlvblNlcnZsZXQ7CisKKworLyoqCisgKiA8cD5SZXRyaWV2ZSB0aGUgc2V0IG9mIE1CZWFuIG5hbWVzIGZvciBhbGwgY3VycmVudGx5IGRlZmluZWQgbWFpbCBzZXNzaW9ucywKKyAqIGFuZCBleHBvc2UgdGhlbSBpbiBhIHJlcXVlc3QgYXR0cmlidXRlIG5hbWVkICJtYWlsU2Vzc2lvbnNGb3JtIi4gIFRoaXMgYWN0aW9uCisgKiByZXF1aXJlcyB0aGUgZm9sbG93aW5nIHJlcXVlc3QgcGFyYW1ldGVycyB0byBiZSBzZXQ6PC9wPgorICogPHVsPgorICogPGxpPjxzdHJvbmc+Zm9yd2FyZDwvc3Ryb25nPiAtIEdsb2JhbCBmb3J3YXJkIHRvIHdoaWNoIHdlIHNob3VsZAorICogICAgIGdvIGFmdGVyIHN0YXNoaW5nIHRoZSBtYWlsU2Vzc2lvbnMgbGlzdC48L2xpPgorICogPC91bD4KKyAqCisgKiBAYXV0aG9yIEFteSBSb2gKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKiBAc2luY2UgNC4xCisgKi8KKworcHVibGljIGNsYXNzIExpc3RNYWlsU2Vzc2lvbnNBY3Rpb24gZXh0ZW5kcyBBY3Rpb24geworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKyAgICAvKioKKyAgICAgKiBUaGUgTUJlYW5TZXJ2ZXIgd2Ugd2lsbCBiZSBpbnRlcmFjdGluZyB3aXRoLgorICAgICAqLworICAgIHByaXZhdGUgTUJlYW5TZXJ2ZXIgbXNlcnZlciA9IG51bGw7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBzcGVjaWZpZWQgSFRUUCByZXF1ZXN0LCBhbmQgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIEhUVFAKKyAgICAgKiByZXNwb25zZSAob3IgZm9yd2FyZCB0byBhbm90aGVyIHdlYiBjb21wb25lbnQgdGhhdCB3aWxsIGNyZWF0ZSBpdCkuCisgICAgICogUmV0dXJuIGFuIDxjb2RlPkFjdGlvbkZvcndhcmQ8L2NvZGU+IGluc3RhbmNlIGRlc2NyaWJpbmcgd2hlcmUgYW5kIGhvdworICAgICAqIGNvbnRyb2wgc2hvdWxkIGJlIGZvcndhcmRlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHJlc3BvbnNlIGhhcworICAgICAqIGFscmVhZHkgYmVlbiBjb21wbGV0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgQWN0aW9uTWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIGFjdGlvbkZvcm0gVGhlIG9wdGlvbmFsIEFjdGlvbkZvcm0gYmVhbiBmb3IgdGhpcyByZXF1ZXN0IChpZiBhbnkpCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIEhUVFAgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgSFRUUCByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXhjZXB0aW9uIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBBY3Rpb25Gb3J3YXJkIHBlcmZvcm0oQWN0aW9uTWFwcGluZyBtYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uRm9ybSBmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisKKyAgICAgICAgLy8gTG9vayB1cCB0aGUgY29tcG9uZW50cyB3ZSB3aWxsIGJlIHVzaW5nIGFzIG5lZWRlZAorICAgICAgICBpZiAobXNlcnZlciA9PSBudWxsKSB7CisgICAgICAgICAgICBtc2VydmVyID0gKChBcHBsaWNhdGlvblNlcnZsZXQpIGdldFNlcnZsZXQoKSkuZ2V0U2VydmVyKCk7CisgICAgICAgIH0KKyAgICAgICAgTWVzc2FnZVJlc291cmNlcyByZXNvdXJjZXMgPSBnZXRSZXNvdXJjZXMocmVxdWVzdCk7CisgICAgICAgIEh0dHBTZXNzaW9uIHNlc3Npb24gPSByZXF1ZXN0LmdldFNlc3Npb24oKTsKKyAgICAgICAgTG9jYWxlIGxvY2FsZSA9IGdldExvY2FsZShyZXF1ZXN0KTsKKyAgICAgICAgCisgICAgICAgIFN0cmluZyByZXNvdXJjZXR5cGUgPSByZXF1ZXN0LmdldFBhcmFtZXRlcigicmVzb3VyY2V0eXBlIik7CisgICAgICAgIFN0cmluZyBwYXRoID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoInBhdGgiKTsKKyAgICAgICAgU3RyaW5nIGhvc3QgPSByZXF1ZXN0LmdldFBhcmFtZXRlcigiaG9zdCIpOworICAgICAgICBTdHJpbmcgZG9tYWluID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoImRvbWFpbiIpOworICAgICAgICAKKyAgICAgICAgaWYgKHJlc291cmNldHlwZSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXNvdXJjZXR5cGUgPSBVUkxEZWNvZGVyLmRlY29kZShyZXNvdXJjZXR5cGUpOworICAgICAgICB9CisgICAgICAgIGlmIChwYXRoICE9IG51bGwpIHsKKyAgICAgICAgICAgIHBhdGggPSBVUkxEZWNvZGVyLmRlY29kZShwYXRoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaG9zdCAhPSBudWxsKSB7CisgICAgICAgICAgICBob3N0ID0gVVJMRGVjb2Rlci5kZWNvZGUoaG9zdCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRvbWFpbiAhPSBudWxsKSB7CisgICAgICAgICAgICBkb21haW4gPSBVUkxEZWNvZGVyLmRlY29kZShkb21haW4pOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBDcmVhdGUgYSBmb3JtIGJlYW4gY29udGFpbmluZyB0aGUgcmVxdWVzdGVkIE1CZWFuIE5hbWVzCisgICAgICAgIE1haWxTZXNzaW9uc0Zvcm0gbWFpbFNlc3Npb25zRm9ybSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgIG1haWxTZXNzaW9uc0Zvcm0gPSAKKyAgICAgICAgICAgICAgICBSZXNvdXJjZVV0aWxzLmdldE1haWxTZXNzaW9uc0Zvcm0obXNlcnZlciwgcmVzb3VyY2V0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgsIGhvc3QsIGRvbWFpbik7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nKHJlc291cmNlcy5nZXRNZXNzYWdlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNlcnMuZXJyb3IuYXR0cmlidXRlLmdldCIsICJyZXNvdXJjZXMiKSwgZSk7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsCisgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlCisgICAgICAgICAgICAgICAgIChsb2NhbGUsICJ1c2Vycy5lcnJvci5hdHRyaWJ1dGUuZ2V0IiwgInJlc291cmNlcyIpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFN0YXNoIHRoZSByZXN1bHRzIGluIHJlcXVlc3Qgc2NvcGUKKyAgICAgICAgcmVxdWVzdC5zZXRBdHRyaWJ1dGUoIm1haWxTZXNzaW9uc0Zvcm0iLCBtYWlsU2Vzc2lvbnNGb3JtKTsKKyAgICAgICAgc2F2ZVRva2VuKHJlcXVlc3QpOworICAgICAgICBTdHJpbmcgZm9yd2FyZCA9CisgICAgICAgICAgICBVUkxEZWNvZGVyLmRlY29kZShyZXF1ZXN0LmdldFBhcmFtZXRlcigiZm9yd2FyZCIpKTsKKyAgICAgICAgCisgICAgICAgIHJldHVybiAobWFwcGluZy5maW5kRm9yd2FyZChmb3J3YXJkKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVzb3VyY2VzL0xpc3RSZXNvdXJjZUxpbmtzQWN0aW9uLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVzb3VyY2VzL0xpc3RSZXNvdXJjZUxpbmtzQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc3MGE4MgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZXNvdXJjZXMvTGlzdFJlc291cmNlTGlua3NBY3Rpb24uamF2YQpAQCAtMCwwICsxLDEzOCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVzb3VyY2VzOworCisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTERlY29kZXI7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9ybTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9yd2FyZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy51dGlsLk1lc3NhZ2VSZXNvdXJjZXM7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uQXBwbGljYXRpb25TZXJ2bGV0OworCisKKy8qKgorICogPHA+UmV0cmlldmUgdGhlIHNldCBvZiBNQmVhbiBuYW1lcyBmb3IgYWxsIGN1cnJlbnRseSBkZWZpbmVkIHJlc291cmNlIGxpbmtzLAorICogYW5kIGV4cG9zZSB0aGVtIGluIGEgcmVxdWVzdCBhdHRyaWJ1dGUgbmFtZWQgInJlc291cmNlTGlua3NGb3JtIi4gIFRoaXMgYWN0aW9uCisgKiByZXF1aXJlcyB0aGUgZm9sbG93aW5nIHJlcXVlc3QgcGFyYW1ldGVycyB0byBiZSBzZXQ6PC9wPgorICogPHVsPgorICogPGxpPjxzdHJvbmc+Zm9yd2FyZDwvc3Ryb25nPiAtIEdsb2JhbCBmb3J3YXJkIHRvIHdoaWNoIHdlIHNob3VsZAorICogICAgIGdvIGFmdGVyIHN0YXNoaW5nIHRoZSByZXNvdXJjZUxpbmtzIGxpc3QuPC9saT4KKyAqIDwvdWw+CisgKgorICogQGF1dGhvciBBbXkgUm9oCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICogQHNpbmNlIDQuMQorICovCisKK3B1YmxpYyBjbGFzcyBMaXN0UmVzb3VyY2VMaW5rc0FjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworICAgIC8qKgorICAgICAqIFRoZSBNQmVhblNlcnZlciB3ZSB3aWxsIGJlIGludGVyYWN0aW5nIHdpdGguCisgICAgICovCisgICAgcHJpdmF0ZSBNQmVhblNlcnZlciBtc2VydmVyID0gbnVsbDsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIHNwZWNpZmllZCBIVFRQIHJlcXVlc3QsIGFuZCBjcmVhdGUgdGhlIGNvcnJlc3BvbmRpbmcgSFRUUAorICAgICAqIHJlc3BvbnNlIChvciBmb3J3YXJkIHRvIGFub3RoZXIgd2ViIGNvbXBvbmVudCB0aGF0IHdpbGwgY3JlYXRlIGl0KS4KKyAgICAgKiBSZXR1cm4gYW4gPGNvZGU+QWN0aW9uRm9yd2FyZDwvY29kZT4gaW5zdGFuY2UgZGVzY3JpYmluZyB3aGVyZSBhbmQgaG93CisgICAgICogY29udHJvbCBzaG91bGQgYmUgZm9yd2FyZGVkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcmVzcG9uc2UgaGFzCisgICAgICogYWxyZWFkeSBiZWVuIGNvbXBsZXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBBY3Rpb25NYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gYWN0aW9uRm9ybSBUaGUgb3B0aW9uYWwgQWN0aW9uRm9ybSBiZWFuIGZvciB0aGlzIHJlcXVlc3QgKGlmIGFueSkKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgSFRUUCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBIVFRQIHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBleGNlcHRpb24gb2NjdXJzCisgICAgICovCisgICAgcHVibGljIEFjdGlvbkZvcndhcmQgcGVyZm9ybShBY3Rpb25NYXBwaW5nIG1hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb25Gb3JtIGZvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKworICAgICAgICAvLyBMb29rIHVwIHRoZSBjb21wb25lbnRzIHdlIHdpbGwgYmUgdXNpbmcgYXMgbmVlZGVkCisgICAgICAgIGlmIChtc2VydmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIG1zZXJ2ZXIgPSAoKEFwcGxpY2F0aW9uU2VydmxldCkgZ2V0U2VydmxldCgpKS5nZXRTZXJ2ZXIoKTsKKyAgICAgICAgfQorICAgICAgICBNZXNzYWdlUmVzb3VyY2VzIHJlc291cmNlcyA9IGdldFJlc291cmNlcyhyZXF1ZXN0KTsKKyAgICAgICAgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpOworICAgICAgICBMb2NhbGUgbG9jYWxlID0gZ2V0TG9jYWxlKHJlcXVlc3QpOworICAgICAgICAKKyAgICAgICAgU3RyaW5nIHJlc291cmNldHlwZSA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJyZXNvdXJjZXR5cGUiKTsKKyAgICAgICAgU3RyaW5nIHBhdGggPSByZXF1ZXN0LmdldFBhcmFtZXRlcigicGF0aCIpOworICAgICAgICBTdHJpbmcgaG9zdCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJob3N0Iik7CisgICAgICAgIFN0cmluZyBkb21haW4gPSByZXF1ZXN0LmdldFBhcmFtZXRlcigiZG9tYWluIik7CisgICAgICAgICAgICAKKyAgICAgICAgaWYgKHJlc291cmNldHlwZSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXNvdXJjZXR5cGUgPSBVUkxEZWNvZGVyLmRlY29kZShyZXNvdXJjZXR5cGUpOworICAgICAgICB9CisgICAgICAgIGlmIChwYXRoICE9IG51bGwpIHsKKyAgICAgICAgICAgIHBhdGggPSBVUkxEZWNvZGVyLmRlY29kZShwYXRoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaG9zdCAhPSBudWxsKSB7CisgICAgICAgICAgICBob3N0ID0gVVJMRGVjb2Rlci5kZWNvZGUoaG9zdCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRvbWFpbiAhPSBudWxsKSB7CisgICAgICAgICAgICBkb21haW4gPSBVUkxEZWNvZGVyLmRlY29kZShkb21haW4pOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBDcmVhdGUgYSBmb3JtIGJlYW4gY29udGFpbmluZyB0aGUgcmVxdWVzdGVkIE1CZWFuIE5hbWVzCisgICAgICAgIFJlc291cmNlTGlua3NGb3JtIHJlc291cmNlTGlua3NGb3JtID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgcmVzb3VyY2VMaW5rc0Zvcm0gPSAKKyAgICAgICAgICAgICAgICBSZXNvdXJjZVV0aWxzLmdldFJlc291cmNlTGlua3NGb3JtKG1zZXJ2ZXIsIHJlc291cmNldHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLCBob3N0LCBkb21haW4pOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZyhyZXNvdXJjZXMuZ2V0TWVzc2FnZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9jYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzZXJzLmVycm9yLmF0dHJpYnV0ZS5nZXQiLCAicmVzb3VyY2VzIiksIGUpOworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZQorICAgICAgICAgICAgICAgICAobG9jYWxlLCAidXNlcnMuZXJyb3IuYXR0cmlidXRlLmdldCIsICJyZXNvdXJjZXMiKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBTdGFzaCB0aGUgcmVzdWx0cyBpbiByZXF1ZXN0IHNjb3BlCisgICAgICAgIHJlcXVlc3Quc2V0QXR0cmlidXRlKCJyZXNvdXJjZUxpbmtzRm9ybSIsIHJlc291cmNlTGlua3NGb3JtKTsKKyAgICAgICAgc2F2ZVRva2VuKHJlcXVlc3QpOworICAgICAgICBTdHJpbmcgZm9yd2FyZCA9CisgICAgICAgICAgICBVUkxEZWNvZGVyLmRlY29kZShyZXF1ZXN0LmdldFBhcmFtZXRlcigiZm9yd2FyZCIpKTsKKyAgICAgICAgCisgICAgICAgIHJldHVybiAobWFwcGluZy5maW5kRm9yd2FyZChmb3J3YXJkKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVzb3VyY2VzL0xpc3RVc2VyRGF0YWJhc2VzQWN0aW9uLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVzb3VyY2VzL0xpc3RVc2VyRGF0YWJhc2VzQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIxYWQ1ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZXNvdXJjZXMvTGlzdFVzZXJEYXRhYmFzZXNBY3Rpb24uamF2YQpAQCAtMCwwICsxLDEyNSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVzb3VyY2VzOworCisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTERlY29kZXI7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9ybTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9yd2FyZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy51dGlsLk1lc3NhZ2VSZXNvdXJjZXM7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uQXBwbGljYXRpb25TZXJ2bGV0OworCisKKy8qKgorICogPHA+UmV0cmlldmUgdGhlIHNldCBvZiBNQmVhbiBuYW1lcyBmb3IgYWxsIGN1cnJlbnRseSBkZWZpbmVkIGVudmlyb25tZW50IGVudHJpZXMsCisgKiBhbmQgZXhwb3NlIHRoZW0gaW4gYSByZXF1ZXN0IGF0dHJpYnV0ZSBuYW1lZCAiZW52ZW50cmllc0Zvcm0iLiAgVGhpcyBhY3Rpb24KKyAqIHJlcXVpcmVzIHRoZSBmb2xsb3dpbmcgcmVxdWVzdCBwYXJhbWV0ZXJzIHRvIGJlIHNldDo8L3A+CisgKiA8dWw+CisgKiA8bGk+PHN0cm9uZz5mb3J3YXJkPC9zdHJvbmc+IC0gR2xvYmFsIGZvcndhcmQgdG8gd2hpY2ggd2Ugc2hvdWxkCisgKiAgICAgZ28gYWZ0ZXIgc3Rhc2hpbmcgdGhlIGVudiBlbnRyaWVzIGxpc3QuPC9saT4KKyAqIDwvdWw+CisgKgorICogQGF1dGhvciBNYW52ZWVuIEthdXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKiBAc2luY2UgNC4xCisgKi8KKworcHVibGljIGNsYXNzIExpc3RVc2VyRGF0YWJhc2VzQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBNQmVhblNlcnZlciB3ZSB3aWxsIGJlIGludGVyYWN0aW5nIHdpdGguCisgICAgICovCisgICAgcHJpdmF0ZSBNQmVhblNlcnZlciBtc2VydmVyID0gbnVsbDsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIHNwZWNpZmllZCBIVFRQIHJlcXVlc3QsIGFuZCBjcmVhdGUgdGhlIGNvcnJlc3BvbmRpbmcgSFRUUAorICAgICAqIHJlc3BvbnNlIChvciBmb3J3YXJkIHRvIGFub3RoZXIgd2ViIGNvbXBvbmVudCB0aGF0IHdpbGwgY3JlYXRlIGl0KS4KKyAgICAgKiBSZXR1cm4gYW4gPGNvZGU+QWN0aW9uRm9yd2FyZDwvY29kZT4gaW5zdGFuY2UgZGVzY3JpYmluZyB3aGVyZSBhbmQgaG93CisgICAgICogY29udHJvbCBzaG91bGQgYmUgZm9yd2FyZGVkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcmVzcG9uc2UgaGFzCisgICAgICogYWxyZWFkeSBiZWVuIGNvbXBsZXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBBY3Rpb25NYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gYWN0aW9uRm9ybSBUaGUgb3B0aW9uYWwgQWN0aW9uRm9ybSBiZWFuIGZvciB0aGlzIHJlcXVlc3QgKGlmIGFueSkKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgSFRUUCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBIVFRQIHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBleGNlcHRpb24gb2NjdXJzCisgICAgICovCisgICAgcHVibGljIEFjdGlvbkZvcndhcmQgcGVyZm9ybShBY3Rpb25NYXBwaW5nIG1hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb25Gb3JtIGZvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKworICAgICAgICAvLyBMb29rIHVwIHRoZSBjb21wb25lbnRzIHdlIHdpbGwgYmUgdXNpbmcgYXMgbmVlZGVkCisgICAgICAgIGlmIChtc2VydmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIG1zZXJ2ZXIgPSAoKEFwcGxpY2F0aW9uU2VydmxldCkgZ2V0U2VydmxldCgpKS5nZXRTZXJ2ZXIoKTsKKyAgICAgICAgfQorICAgICAgICBNZXNzYWdlUmVzb3VyY2VzIHJlc291cmNlcyA9IGdldFJlc291cmNlcyhyZXF1ZXN0KTsKKyAgICAgICAgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpOworICAgICAgICBMb2NhbGUgbG9jYWxlID0gZ2V0TG9jYWxlKHJlcXVlc3QpOworCisgICAgICAgIFN0cmluZyBkb21haW4gPSByZXF1ZXN0LmdldFBhcmFtZXRlcigiZG9tYWluIik7CisgICAgICAgIGlmIChkb21haW4gIT0gbnVsbCkgeworICAgICAgICAgICAgZG9tYWluID0gVVJMRGVjb2Rlci5kZWNvZGUoZG9tYWluKTsKKyAgICAgICAgfQorICAgICAgICAvLyBDcmVhdGUgYSBmb3JtIGJlYW4gY29udGFpbmluZyB0aGUgcmVxdWVzdGVkIE1CZWFuIE5hbWVzCisgICAgICAgIFVzZXJEYXRhYmFzZXNGb3JtIHVzZXJEYXRhYmFzZXNGb3JtID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgdXNlckRhdGFiYXNlc0Zvcm0gPSAKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlVXRpbHMuZ2V0VXNlckRhdGFiYXNlc0Zvcm0obXNlcnZlciwgZG9tYWluKTsKKyAgICAgICAgICAgICAgdXNlckRhdGFiYXNlc0Zvcm0uc2V0RG9tYWluKGRvbWFpbik7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nKHJlc291cmNlcy5nZXRNZXNzYWdlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNlcnMuZXJyb3IuYXR0cmlidXRlLmdldCIsICJyZXNvdXJjZXMiKSwgZSk7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsCisgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlCisgICAgICAgICAgICAgICAgIChsb2NhbGUsICJ1c2Vycy5lcnJvci5hdHRyaWJ1dGUuZ2V0IiwgInJlc291cmNlcyIpKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gU3Rhc2ggdGhlIHJlc3VsdHMgaW4gcmVxdWVzdCBzY29wZQorICAgICAgICByZXF1ZXN0LnNldEF0dHJpYnV0ZSgidXNlckRhdGFiYXNlc0Zvcm0iLCB1c2VyRGF0YWJhc2VzRm9ybSk7CisgICAgICAgIHNhdmVUb2tlbihyZXF1ZXN0KTsKKyAgICAgICAgU3RyaW5nIGZvcndhcmQgPQorICAgICAgICAgICAgVVJMRGVjb2Rlci5kZWNvZGUocmVxdWVzdC5nZXRQYXJhbWV0ZXIoImZvcndhcmQiKSk7CisgICAgICAgIHJldHVybiAobWFwcGluZy5maW5kRm9yd2FyZChmb3J3YXJkKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVzb3VyY2VzL01haWxTZXNzaW9uRm9ybS5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3Jlc291cmNlcy9NYWlsU2Vzc2lvbkZvcm0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2VjZDQ4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3Jlc291cmNlcy9NYWlsU2Vzc2lvbkZvcm0uamF2YQpAQCAtMCwwICsxLDIwOSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnJlc291cmNlczsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25FcnJvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRXJyb3JzOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkxhYmVsVmFsdWVCZWFuOworCisvKioKKyAqIEZvcm0gYmVhbiBmb3IgdGhlIGluZGl2aWR1YWwgbWFpbCBzZXNzaW9uIHBhZ2UuCisgKgorICogQGF1dGhvciBBbXkgUm9oCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICogQHNpbmNlIDQuMQorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBNYWlsU2Vzc2lvbkZvcm0gZXh0ZW5kcyBCYXNlRm9ybSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworICAgIAorICAgIC8qKgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBtYWlsIHNlc3Npb24uCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZSA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5uYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFRoZSBtYWlsLnNtdHAuaG9zdCBvZiB0aGUgbWFpbCBzZXNzaW9uLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIG1haWxob3N0ID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWFpbGhvc3QoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5tYWlsaG9zdCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TWFpbGhvc3QoU3RyaW5nIG1haWxob3N0KSB7CisgICAgICAgIHRoaXMubWFpbGhvc3QgPSBtYWlsaG9zdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgcmVzb3VyY2UgdHlwZSBvZiB0aGlzIG1haWwgc2Vzc2lvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyByZXNvdXJjZXR5cGUgPSBudWxsOworICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcmVzb3VyY2UgdHlwZSBvZiB0aGUgbWFpbCBzZXNzaW9uIHRoaXMgYmVhbiByZWZlcnMgdG8uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZXR5cGUoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnJlc291cmNldHlwZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHJlc291cmNlIHR5cGUgb2YgdGhlIG1haWwgc2Vzc2lvbiB0aGlzIGJlYW4gcmVmZXJzIHRvLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlc291cmNldHlwZShTdHJpbmcgcmVzb3VyY2V0eXBlKSB7CisgICAgICAgIHRoaXMucmVzb3VyY2V0eXBlID0gcmVzb3VyY2V0eXBlOworICAgIH0KKyAgICAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgcGF0aCBvZiB0aGlzIG1haWwgc2Vzc2lvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBwYXRoID0gbnVsbDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHBhdGggb2YgdGhlIG1haWwgc2Vzc2lvbiB0aGlzIGJlYW4gcmVmZXJzIHRvLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucGF0aDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHBhdGggb2YgdGhlIG1haWwgc2Vzc2lvbiB0aGlzIGJlYW4gcmVmZXJzIHRvLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhdGgoU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgdGhpcy5wYXRoID0gcGF0aDsKKyAgICB9CisgICAgICAgCisgICAgLyoqCisgICAgICogVGhlIGhvc3Qgb2YgdGhpcyBtYWlsIHNlc3Npb24uCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgaG9zdCA9IG51bGw7CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBob3N0IG9mIHRoZSBtYWlsIHNlc3Npb24gdGhpcyBiZWFuIHJlZmVycyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEhvc3QoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmhvc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBob3N0IG9mIHRoZSBtYWlsIHNlc3Npb24gdGhpcyBiZWFuIHJlZmVycyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRIb3N0KFN0cmluZyBob3N0KSB7CisgICAgICAgIHRoaXMuaG9zdCA9IGhvc3Q7CisgICAgfSAgICAKKyAgICAKKyAgICAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgZG9tYWluIG9mIHRoaXMgbWFpbCBzZXNzaW9uLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGRvbWFpbiA9IG51bGw7CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBkb21haW4gb2YgdGhlIG1haWwgc2Vzc2lvbiB0aGlzIGJlYW4gcmVmZXJzIHRvLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RG9tYWluKCkgeworICAgICAgICByZXR1cm4gdGhpcy5kb21haW47CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBkb21haW4gb2YgdGhlIG1haWwgc2Vzc2lvbiB0aGlzIGJlYW4gcmVmZXJzIHRvLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERvbWFpbihTdHJpbmcgZG9tYWluKSB7CisgICAgICAgIHRoaXMuZG9tYWluID0gZG9tYWluOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBvZiB0aGUgcmVzb3VyY2UuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgdHlwZSA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiAodGhpcy50eXBlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKSB7CisgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKyAgICAvKioKKyAgICAgKiBSZXNldCBhbGwgcHJvcGVydGllcyB0byB0aGVpciBkZWZhdWx0IHZhbHVlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBtYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVzZXQoQWN0aW9uTWFwcGluZyBtYXBwaW5nLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworCisgICAgICAgIHN1cGVyLnJlc2V0KG1hcHBpbmcsIHJlcXVlc3QpOworICAgICAgICBtYWlsaG9zdCA9IG51bGw7ICAgCisgICAgICAgIHR5cGUgPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFZhbGlkYXRlIHRoZSBwcm9wZXJ0aWVzIHRoYXQgaGF2ZSBiZWVuIHNldCBmcm9tIHRoaXMgSFRUUCByZXF1ZXN0LAorICAgICAqIGFuZCByZXR1cm4gYW4gPGNvZGU+QWN0aW9uRXJyb3JzPC9jb2RlPiBvYmplY3QgdGhhdCBlbmNhcHN1bGF0ZXMgYW55CisgICAgICogdmFsaWRhdGlvbiBlcnJvcnMgdGhhdCBoYXZlIGJlZW4gZm91bmQuICBJZiBubyBlcnJvcnMgYXJlIGZvdW5kLCByZXR1cm4KKyAgICAgKiA8Y29kZT5udWxsPC9jb2RlPiBvciBhbiA8Y29kZT5BY3Rpb25FcnJvcnM8L2NvZGU+IG9iamVjdCB3aXRoIG5vCisgICAgICogcmVjb3JkZWQgZXJyb3IgbWVzc2FnZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgbWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqLworICAgIAorICAgIHByaXZhdGUgQWN0aW9uRXJyb3JzIGVycm9ycyA9IG51bGw7CisgICAgCisgICAgcHVibGljIEFjdGlvbkVycm9ycyB2YWxpZGF0ZShBY3Rpb25NYXBwaW5nIG1hcHBpbmcsCisgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKworICAgICAgICBlcnJvcnMgPSBuZXcgQWN0aW9uRXJyb3JzKCk7CisKKyAgICAgICAgU3RyaW5nIHN1Ym1pdCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJzdWJtaXQiKTsKKworICAgICAgICAvL2lmIChzdWJtaXQgIT0gbnVsbCkgeworCisgICAgICAgICAgICAvLyBtYWlsU210cEhvc3QgaXMgYSByZXF1aXJlZCBmaWVsZAorICAgICAgICAgICAgaWYgKChtYWlsaG9zdCA9PSBudWxsKSB8fCAobWFpbGhvc3QubGVuZ3RoKCkgPCAxKSkgeworICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoIm1haWxob3N0IiwKKyAgICAgICAgICAgICAgICAgICAgICBuZXcgQWN0aW9uRXJyb3IoInJlc291cmNlcy5lcnJvci5tYWlsaG9zdC5yZXF1aXJlZCIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIC8vfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIChlcnJvcnMpOworICAgIH0KKyAgICAKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZXNvdXJjZXMvTWFpbFNlc3Npb25zRm9ybS5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3Jlc291cmNlcy9NYWlsU2Vzc2lvbnNGb3JtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ5MjUyNAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZXNvdXJjZXMvTWFpbFNlc3Npb25zRm9ybS5qYXZhCkBAIC0wLDAgKzEsMTUwIEBACisvKgorICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVzb3VyY2VzOworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRXJyb3I7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkVycm9yczsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9ybTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKKworCisvKioKKyAqIEZvcm0gYmVhbiBmb3IgdGhlIGRlbGV0ZSBtYWlsIHNlc3Npb25zIHBhZ2UuCisgKgorICogQGF1dGhvciBBbXkgUm9oCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICogQHNpbmNlIDQuMQorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBNYWlsU2Vzc2lvbnNGb3JtIGV4dGVuZHMgQmFzZUZvcm0geworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBvYmplY3QgbmFtZXMgb2YgdGhlIHNwZWNpZmllZCBlbnZpcm9ubWVudCBlbnRyaWVzLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIG1haWxTZXNzaW9uc1tdID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRNYWlsU2Vzc2lvbnMoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5tYWlsU2Vzc2lvbnMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1haWxTZXNzaW9ucyhTdHJpbmcgbWFpbFNlc3Npb25zW10pIHsKKyAgICAgICAgdGhpcy5tYWlsU2Vzc2lvbnMgPSBtYWlsU2Vzc2lvbnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHJlc291cmNlIHR5cGUgb2YgdGhpcyBtYWlsIHNlc3Npb24uCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcmVzb3VyY2V0eXBlID0gbnVsbDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHJlc291cmNlIHR5cGUgb2YgdGhlIG1haWwgc2Vzc2lvbiB0aGlzIGJlYW4gcmVmZXJzIHRvLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2V0eXBlKCkgeworICAgICAgICByZXR1cm4gdGhpcy5yZXNvdXJjZXR5cGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSByZXNvdXJjZSB0eXBlIG9mIHRoZSBtYWlsIHNlc3Npb24gdGhpcyBiZWFuIHJlZmVycyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZXR5cGUoU3RyaW5nIHJlc291cmNldHlwZSkgeworICAgICAgICB0aGlzLnJlc291cmNldHlwZSA9IHJlc291cmNldHlwZTsKKyAgICB9CisgICAgICAgCisgICAgLyoqCisgICAgICogVGhlIHBhdGggb2YgdGhpcyBtYWlsIHNlc3Npb24uCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcGF0aCA9IG51bGw7CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBwYXRoIG9mIHRoZSBtYWlsIHNlc3Npb24gdGhpcyBiZWFuIHJlZmVycyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhdGgoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnBhdGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBwYXRoIG9mIHRoZSBtYWlsIHNlc3Npb24gdGhpcyBiZWFuIHJlZmVycyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXRoKFN0cmluZyBwYXRoKSB7CisgICAgICAgIHRoaXMucGF0aCA9IHBhdGg7CisgICAgfQorICAgICAgIAorICAgIC8qKgorICAgICAqIFRoZSBob3N0IG9mIHRoaXMgbWFpbCBzZXNzaW9uLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGhvc3QgPSBudWxsOworICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgaG9zdCBvZiB0aGUgbWFpbCBzZXNzaW9uIHRoaXMgYmVhbiByZWZlcnMgdG8uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRIb3N0KCkgeworICAgICAgICByZXR1cm4gdGhpcy5ob3N0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgaG9zdCBvZiB0aGUgbWFpbCBzZXNzaW9uIHRoaXMgYmVhbiByZWZlcnMgdG8uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SG9zdChTdHJpbmcgaG9zdCkgeworICAgICAgICB0aGlzLmhvc3QgPSBob3N0OworICAgIH0gICAgCisgICAgCisgICAgICAgCisgICAgLyoqCisgICAgICogVGhlIGRvbWFpbiBvZiB0aGlzIG1haWwgc2Vzc2lvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBkb21haW4gPSBudWxsOworICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZG9tYWluIG9mIHRoZSBtYWlsIHNlc3Npb24gdGhpcyBiZWFuIHJlZmVycyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldERvbWFpbigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZG9tYWluOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZG9tYWluIG9mIHRoZSBtYWlsIHNlc3Npb24gdGhpcyBiZWFuIHJlZmVycyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREb21haW4oU3RyaW5nIGRvbWFpbikgeworICAgICAgICB0aGlzLmRvbWFpbiA9IGRvbWFpbjsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmVzZXQgYWxsIHByb3BlcnRpZXMgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgbWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlc2V0KEFjdGlvbk1hcHBpbmcgbWFwcGluZywgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKworICAgICAgICBzdXBlci5yZXNldChtYXBwaW5nLCByZXF1ZXN0KTsKKyAgICAgICAgdGhpcy5tYWlsU2Vzc2lvbnMgPSBudWxsOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZXNvdXJjZXMvUmVzb3VyY2VMaW5rRm9ybS5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3Jlc291cmNlcy9SZXNvdXJjZUxpbmtGb3JtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDUyYjJjOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZXNvdXJjZXMvUmVzb3VyY2VMaW5rRm9ybS5qYXZhCkBAIC0wLDAgKzEsMjI0IEBACisvKgorICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVzb3VyY2VzOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkVycm9yOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25FcnJvcnM7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uTGFiZWxWYWx1ZUJlYW47CisKKy8qKgorICogRm9ybSBiZWFuIGZvciB0aGUgaW5kaXZpZHVhbCByZXNvdXJjZSBsaW5rIHBhZ2UuCisgKgorICogQGF1dGhvciBBbXkgUm9oCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICogQHNpbmNlIDQuMQorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBSZXNvdXJjZUxpbmtGb3JtIGV4dGVuZHMgQmFzZUZvcm0geworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZSBsaW5rLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIG5hbWUgPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gKHRoaXMubmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBnbG9iYWwgbmFtZSBvZiB0aGUgcmVzb3VyY2UgbGluay4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBnbG9iYWwgPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXRHbG9iYWwoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5nbG9iYWwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEdsb2JhbChTdHJpbmcgZ2xvYmFsKSB7CisgICAgICAgIHRoaXMuZ2xvYmFsID0gZ2xvYmFsOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgcmVzb3VyY2UgdHlwZSBvZiB0aGlzIHJlc291cmNlIGxpbmsuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcmVzb3VyY2V0eXBlID0gbnVsbDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHJlc291cmNlIHR5cGUgb2YgdGhlIHJlc291cmNlIGxpbmsgdGhpcyBiZWFuIHJlZmVycyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlc291cmNldHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucmVzb3VyY2V0eXBlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcmVzb3VyY2UgdHlwZSBvZiB0aGUgcmVzb3VyY2UgbGluayB0aGlzIGJlYW4gcmVmZXJzIHRvLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlc291cmNldHlwZShTdHJpbmcgcmVzb3VyY2V0eXBlKSB7CisgICAgICAgIHRoaXMucmVzb3VyY2V0eXBlID0gcmVzb3VyY2V0eXBlOworICAgIH0KKyAgICAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgcGF0aCBvZiB0aGlzIHJlc291cmNlIGxpbmsuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcGF0aCA9IG51bGw7CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBwYXRoIG9mIHRoZSByZXNvdXJjZSBsaW5rIHRoaXMgYmVhbiByZWZlcnMgdG8uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRQYXRoKCkgeworICAgICAgICByZXR1cm4gdGhpcy5wYXRoOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcGF0aCBvZiB0aGUgcmVzb3VyY2UgbGluayB0aGlzIGJlYW4gcmVmZXJzIHRvLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhdGgoU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgdGhpcy5wYXRoID0gcGF0aDsKKyAgICB9CisgICAgICAgCisgICAgLyoqCisgICAgICogVGhlIGhvc3Qgb2YgdGhpcyByZXNvdXJjZSBsaW5rLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGhvc3QgPSBudWxsOworICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgaG9zdCBvZiB0aGUgcmVzb3VyY2UgbGluayB0aGlzIGJlYW4gcmVmZXJzIHRvLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SG9zdCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuaG9zdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGhvc3Qgb2YgdGhlIHJlc291cmNlIGxpbmsgdGhpcyBiZWFuIHJlZmVycyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRIb3N0KFN0cmluZyBob3N0KSB7CisgICAgICAgIHRoaXMuaG9zdCA9IGhvc3Q7CisgICAgfSAgICAKKyAgICAKKyAgICAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgZG9tYWluIG9mIHRoaXMgcmVzb3VyY2UgbGluay4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBkb21haW4gPSBudWxsOworICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZG9tYWluIG9mIHRoZSByZXNvdXJjZSBsaW5rIHRoaXMgYmVhbiByZWZlcnMgdG8uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXREb21haW4oKSB7CisgICAgICAgIHJldHVybiB0aGlzLmRvbWFpbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGRvbWFpbiBvZiB0aGUgcmVzb3VyY2UgbGluayB0aGlzIGJlYW4gcmVmZXJzIHRvLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERvbWFpbihTdHJpbmcgZG9tYWluKSB7CisgICAgICAgIHRoaXMuZG9tYWluID0gZG9tYWluOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBvZiB0aGUgcmVzb3VyY2UgbGluayBsaW5rLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHR5cGUgPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gKHRoaXMudHlwZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSkgeworICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisgICAgLyoqCisgICAgICogUmVzZXQgYWxsIHByb3BlcnRpZXMgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgbWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlc2V0KEFjdGlvbk1hcHBpbmcgbWFwcGluZywgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKworICAgICAgICBzdXBlci5yZXNldChtYXBwaW5nLCByZXF1ZXN0KTsKKyAgICAgICAgbmFtZSA9IG51bGw7CisgICAgICAgIGdsb2JhbCA9IG51bGw7CisgICAgICAgIHR5cGUgPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFZhbGlkYXRlIHRoZSBwcm9wZXJ0aWVzIHRoYXQgaGF2ZSBiZWVuIHNldCBmcm9tIHRoaXMgSFRUUCByZXF1ZXN0LAorICAgICAqIGFuZCByZXR1cm4gYW4gPGNvZGU+QWN0aW9uRXJyb3JzPC9jb2RlPiBvYmplY3QgdGhhdCBlbmNhcHN1bGF0ZXMgYW55CisgICAgICogdmFsaWRhdGlvbiBlcnJvcnMgdGhhdCBoYXZlIGJlZW4gZm91bmQuICBJZiBubyBlcnJvcnMgYXJlIGZvdW5kLCByZXR1cm4KKyAgICAgKiA8Y29kZT5udWxsPC9jb2RlPiBvciBhbiA8Y29kZT5BY3Rpb25FcnJvcnM8L2NvZGU+IG9iamVjdCB3aXRoIG5vCisgICAgICogcmVjb3JkZWQgZXJyb3IgbWVzc2FnZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgbWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqLworICAgIAorICAgIHByaXZhdGUgQWN0aW9uRXJyb3JzIGVycm9ycyA9IG51bGw7CisgICAgCisgICAgcHVibGljIEFjdGlvbkVycm9ycyB2YWxpZGF0ZShBY3Rpb25NYXBwaW5nIG1hcHBpbmcsCisgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgZXJyb3JzID0gbmV3IEFjdGlvbkVycm9ycygpOworCisgICAgICAgIFN0cmluZyBzdWJtaXQgPSByZXF1ZXN0LmdldFBhcmFtZXRlcigic3VibWl0Iik7CisKKyAgICAgICAgLy9pZiAoc3VibWl0ICE9IG51bGwpIHsKKworICAgICAgICAgICAgLy8gbmFtZSBpcyBhIHJlcXVpcmVkIGZpZWxkCisgICAgICAgICAgICBpZiAoKG5hbWUgPT0gbnVsbCkgfHwgKG5hbWUubGVuZ3RoKCkgPCAxKSkgeworICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoIm5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFjdGlvbkVycm9yKCJyZXNvdXJjZXMuZXJyb3IubmFtZS5yZXF1aXJlZCIpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gZ2xvYmFsIGlzIGEgcmVxdWlyZWQgZmllbGQKKyAgICAgICAgICAgIGlmICgoIGdsb2JhbCA9PSBudWxsKSB8fCAoZ2xvYmFsLmxlbmd0aCgpIDwgMSkpIHsKKyAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKCJnbG9iYWwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFjdGlvbkVycm9yKCJyZXNvdXJjZXMuZXJyb3IuZ2xvYmFsLnJlcXVpcmVkIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICAvLyB0eXBlIGlzIGEgcmVxdWlyZWQgZmllbGQKKyAgICAgICAgICAgIGlmICgodHlwZSA9PSBudWxsKSB8fCAodHlwZS5sZW5ndGgoKSA8IDEpKSB7CisgICAgICAgICAgICAgICAgZXJyb3JzLmFkZCgidHlwZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQWN0aW9uRXJyb3IoInJlc291cmNlcy5lcnJvci50eXBlLnJlcXVpcmVkIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAvL30KKworICAgICAgICByZXR1cm4gKGVycm9ycyk7CisKKyAgICB9CisgCisgICAgCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVzb3VyY2VzL1Jlc291cmNlTGlua3NGb3JtLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVzb3VyY2VzL1Jlc291cmNlTGlua3NGb3JtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI4NDFiNQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZXNvdXJjZXMvUmVzb3VyY2VMaW5rc0Zvcm0uamF2YQpAQCAtMCwwICsxLDE1MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnJlc291cmNlczsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkVycm9yOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25FcnJvcnM7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CisKKworLyoqCisgKiBGb3JtIGJlYW4gZm9yIHRoZSBkZWxldGUgcmVzb3VyY2UgbGlua3MgcGFnZS4KKyAqCisgKiBAYXV0aG9yIEFteSBSb2gKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKiBAc2luY2UgNC4xCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIFJlc291cmNlTGlua3NGb3JtIGV4dGVuZHMgQmFzZUZvcm0geworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBvYmplY3QgbmFtZXMgb2YgdGhlIHNwZWNpZmllZCByZXNvdXJjZSBsaW5rcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyByZXNvdXJjZUxpbmtzW10gPSBudWxsOworCisgICAgcHVibGljIFN0cmluZ1tdIGdldFJlc291cmNlTGlua3MoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5yZXNvdXJjZUxpbmtzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZUxpbmtzKFN0cmluZyByZXNvdXJjZUxpbmtzW10pIHsKKyAgICAgICAgdGhpcy5yZXNvdXJjZUxpbmtzID0gcmVzb3VyY2VMaW5rczsKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogVGhlIHJlc291cmNlIHR5cGUgb2YgdGhpcyByZXNvdXJjZSBsaW5rLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHJlc291cmNldHlwZSA9IG51bGw7CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSByZXNvdXJjZSB0eXBlIG9mIHRoZSByZXNvdXJjZSBsaW5rIHRoaXMgYmVhbiByZWZlcnMgdG8uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZXR5cGUoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnJlc291cmNldHlwZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHJlc291cmNlIHR5cGUgb2YgdGhlIHJlc291cmNlIGxpbmsgdGhpcyBiZWFuIHJlZmVycyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZXR5cGUoU3RyaW5nIHJlc291cmNldHlwZSkgeworICAgICAgICB0aGlzLnJlc291cmNldHlwZSA9IHJlc291cmNldHlwZTsKKyAgICB9CisgICAgICAgCisgICAgLyoqCisgICAgICogVGhlIHBhdGggb2YgdGhpcyByZXNvdXJjZSBsaW5rLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHBhdGggPSBudWxsOworICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcGF0aCBvZiB0aGUgcmVzb3VyY2UgbGluayB0aGlzIGJlYW4gcmVmZXJzIHRvLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucGF0aDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHBhdGggb2YgdGhlIHJlc291cmNlIGxpbmsgdGhpcyBiZWFuIHJlZmVycyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXRoKFN0cmluZyBwYXRoKSB7CisgICAgICAgIHRoaXMucGF0aCA9IHBhdGg7CisgICAgfQorICAgICAgIAorICAgIC8qKgorICAgICAqIFRoZSBob3N0IG9mIHRoaXMgcmVzb3VyY2UgbGluay4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBob3N0ID0gbnVsbDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGhvc3Qgb2YgdGhlIHJlc291cmNlIGxpbmsgdGhpcyBiZWFuIHJlZmVycyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEhvc3QoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmhvc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBob3N0IG9mIHRoZSByZXNvdXJjZSBsaW5rIHRoaXMgYmVhbiByZWZlcnMgdG8uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SG9zdChTdHJpbmcgaG9zdCkgeworICAgICAgICB0aGlzLmhvc3QgPSBob3N0OworICAgIH0gICAgCisgICAgCisgICAgICAgCisgICAgLyoqCisgICAgICogVGhlIGRvbWFpbiBvZiB0aGlzIHJlc291cmNlIGxpbmsuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZG9tYWluID0gbnVsbDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGRvbWFpbiBvZiB0aGUgcmVzb3VyY2UgbGluayB0aGlzIGJlYW4gcmVmZXJzIHRvLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RG9tYWluKCkgeworICAgICAgICByZXR1cm4gdGhpcy5kb21haW47CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBkb21haW4gb2YgdGhlIHJlc291cmNlIGxpbmsgdGhpcyBiZWFuIHJlZmVycyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREb21haW4oU3RyaW5nIGRvbWFpbikgeworICAgICAgICB0aGlzLmRvbWFpbiA9IGRvbWFpbjsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmVzZXQgYWxsIHByb3BlcnRpZXMgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgbWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlc2V0KEFjdGlvbk1hcHBpbmcgbWFwcGluZywgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKworICAgICAgICBzdXBlci5yZXNldChtYXBwaW5nLCByZXF1ZXN0KTsKKyAgICAgICAgdGhpcy5yZXNvdXJjZUxpbmtzID0gbnVsbDsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVzb3VyY2VzL1Jlc291cmNlVXRpbHMuamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZXNvdXJjZXMvUmVzb3VyY2VVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2ZDc5NzMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVzb3VyY2VzL1Jlc291cmNlVXRpbHMuamF2YQpAQCAtMCwwICsxLDQxOCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVzb3VyY2VzOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CisKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LkF0dHJpYnV0ZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LkF0dHJpYnV0ZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0SW5zdGFuY2U7CisKKworLyoqCisgKiA8cD5TaGFyZWQgdXRpbGl0eSBtZXRob2RzIGZvciB0aGUgcmVzb3VyY2UgYWRtaW5pc3RyYXRpb24gbW9kdWxlLjwvcD4KKyAqCisgKiBAYXV0aG9yIE1hbnZlZW4gS2F1cgorICogQGF1dGhvciBBbXkgUm9oCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICogQHNpbmNlIDQuMQorICovCisKK3B1YmxpYyBjbGFzcyBSZXNvdXJjZVV0aWxzIHsKKworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEVOVklST05NRU5UX1RZUEUgPSAiOnR5cGU9RW52aXJvbm1lbnQiOworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFJFU09VUkNFX1RZUEUgPSAiOnR5cGU9UmVzb3VyY2UiOworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFJFU09VUkNFTElOS19UWVBFID0gIjp0eXBlPVJlc291cmNlTGluayI7CisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTkFNSU5HUkVTT1VSQ0VTX1RZUEUgPSAiOnR5cGU9TmFtaW5nUmVzb3VyY2VzIjsKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBHTE9CQUxfVFlQRSA9ICIscmVzb3VyY2V0eXBlPUdsb2JhbCI7CisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ09OVEVYVF9UWVBFID0gIixyZXNvdXJjZXR5cGU9Q29udGV4dCI7CisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU0VSVklDRV9ERUZBVUxUQ09OVEVYVF9UWVBFID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLHJlc291cmNldHlwZT1TZXJ2aWNlRGVmYXVsdENvbnRleHQiOworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEhPU1RfREVGQVVMVENPTlRFWFRfVFlQRSA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIixyZXNvdXJjZXR5cGU9SG9zdERlZmF1bHRDb250ZXh0IjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAKKyAgICAvLyByZXNvdXJjZSBjbGFzcyBuYW1lcworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFVTRVJEQl9DTEFTUyA9ICJvcmcuYXBhY2hlLmNhdGFsaW5hLlVzZXJEYXRhYmFzZSI7CisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgREFUQVNPVVJDRV9DTEFTUyA9ICJqYXZheC5zcWwuRGF0YVNvdXJjZSI7CisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTUFJTFNFU1NJT05fQ0xBU1MgPSAiamF2YXgubWFpbC5TZXNzaW9uIjsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdE5hbWUgZ2V0TmFtaW5nUmVzb3VyY2VPYmplY3ROYW1lKFN0cmluZyBkb21haW4sCisgICAgICAgICAgICBTdHJpbmcgcmVzb3VyY2V0eXBlLCBTdHJpbmcgcGF0aCwgU3RyaW5nIGhvc3QpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPSBudWxsOworICAgICAgICBpZiAoKHJlc291cmNldHlwZT09bnVsbCkgfHwgKGRvbWFpbj09bnVsbCkpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIC8vIENvbnN0cnVjdCB0aGUgTUJlYW4gTmFtZSBmb3IgdGhlIG5hbWluZyBzb3VyY2UKKyAgICAgICAgaWYgKHJlc291cmNldHlwZS5lcXVhbHMoIkdsb2JhbCIpKSB7CisgICAgICAgICAgICBvbmFtZSA9IG5ldyBPYmplY3ROYW1lKGRvbWFpbiArIE5BTUlOR1JFU09VUkNFU19UWVBFICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xPQkFMX1RZUEUpOworICAgICAgICB9IGVsc2UgaWYgKHJlc291cmNldHlwZS5lcXVhbHMoIkNvbnRleHQiKSkgeworICAgICAgICAgICAgb25hbWUgPSBuZXcgT2JqZWN0TmFtZShkb21haW4gKyBOQU1JTkdSRVNPVVJDRVNfVFlQRSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFRfVFlQRSArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLHBhdGg9IiArIHBhdGggKyAiLGhvc3Q9IiArIGhvc3QpOworICAgICAgICB9IGVsc2UgaWYgKHJlc291cmNldHlwZS5lcXVhbHMoIkRlZmF1bHRDb250ZXh0IikpIHsKKyAgICAgICAgICAgIGlmIChob3N0Lmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgIG9uYW1lID0gbmV3IE9iamVjdE5hbWUoZG9tYWluICsgTkFNSU5HUkVTT1VSQ0VTX1RZUEUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhPU1RfREVGQVVMVENPTlRFWFRfVFlQRSArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsaG9zdD0iICsgaG9zdCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG9uYW1lID0gbmV3IE9iamVjdE5hbWUoZG9tYWluICsgTkFNSU5HUkVTT1VSQ0VTX1RZUEUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFUlZJQ0VfREVGQVVMVENPTlRFWFRfVFlQRSk7ICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiBvbmFtZTsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhbmQgcmV0dXJuIGEgUmVzb3VyY2VzRm9ybSBpZGVudGlmeWluZyBhbGwgY3VycmVudGx5IGRlZmluZWQKKyAgICAgKiByZXNvdXJjZXMgaW4gdGhlIHNwZWNpZmllZCByZXNvdXJjZSBkYXRhYmFzZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtc2VydmVyIE1CZWFuU2VydmVyIHRvIGJlIGNvbnN1bHRlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBFbnZFbnRyaWVzRm9ybSBnZXRFbnZFbnRyaWVzRm9ybShNQmVhblNlcnZlciBtc2VydmVyLCAKKyAgICAgICAgU3RyaW5nIHJlc291cmNldHlwZSwgU3RyaW5nIHBhdGgsIFN0cmluZyBob3N0LCBTdHJpbmcgZG9tYWluKSAKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgT2JqZWN0TmFtZSBlbmFtZSA9IG51bGw7CisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG51bGw7ICAgICAgICAKKyAgICAgICAgaWYgKHJlc291cmNldHlwZSE9bnVsbCkgeworICAgICAgICAgICAgaWYgKHJlc291cmNldHlwZS5lcXVhbHMoIkdsb2JhbCIpKSB7CisgICAgICAgICAgICAgICAgZW5hbWUgPSBuZXcgT2JqZWN0TmFtZSggZG9tYWluICsgRU5WSVJPTk1FTlRfVFlQRSArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMT0JBTF9UWVBFICsgIiwqIik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHJlc291cmNldHlwZS5lcXVhbHMoIkNvbnRleHQiKSkgeworICAgICAgICAgICAgICAgIGVuYW1lID0gbmV3IE9iamVjdE5hbWUgKCBkb21haW4gKyBFTlZJUk9OTUVOVF9UWVBFICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVF9UWVBFICsgIixwYXRoPSIgKyBwYXRoICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIixob3N0PSIgKyBob3N0ICsgIiwqIik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHJlc291cmNldHlwZS5lcXVhbHMoIkRlZmF1bHRDb250ZXh0IikpIHsKKyAgICAgICAgICAgICAgICBpZiAoaG9zdC5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgZW5hbWUgPSBuZXcgT2JqZWN0TmFtZSggZG9tYWluICsgRU5WSVJPTk1FTlRfVFlQRSArIAorICAgICAgICAgICAgICAgICAgICAgICAgSE9TVF9ERUZBVUxUQ09OVEVYVF9UWVBFICsgIixob3N0PSIgKyBob3N0ICsgIiwqIik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZW5hbWUgPSBuZXcgT2JqZWN0TmFtZSggZG9tYWluICsgRU5WSVJPTk1FTlRfVFlQRSArIAorICAgICAgICAgICAgICAgICAgICAgICAgU0VSVklDRV9ERUZBVUxUQ09OVEVYVF9UWVBFICsgIiwqIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IChtc2VydmVyLnF1ZXJ5TUJlYW5zKGVuYW1lLCBudWxsKS5pdGVyYXRvcigpKTsKKyAgICAgICAgCisgICAgICAgIEFycmF5TGlzdCByZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOyAgICAgICAgCisgICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIE9iamVjdEluc3RhbmNlIGluc3RhbmNlID0gKE9iamVjdEluc3RhbmNlKSBpdGVyYXRvci5uZXh0KCk7IAorICAgICAgICAgICAgcmVzdWx0cy5hZGQoaW5zdGFuY2UuZ2V0T2JqZWN0TmFtZSgpLnRvU3RyaW5nKCkpOworICAgICAgICB9CisKKyAgICAgICAgQ29sbGVjdGlvbnMuc29ydChyZXN1bHRzKTsgICAgICAgIAorICAgICAgICAKKyAgICAgICAgRW52RW50cmllc0Zvcm0gZW52RW50cmllc0Zvcm0gPSBuZXcgRW52RW50cmllc0Zvcm0oKTsKKyAgICAgICAgZW52RW50cmllc0Zvcm0uc2V0RW52RW50cmllcygoU3RyaW5nW10pIAorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy50b0FycmF5KG5ldyBTdHJpbmdbcmVzdWx0cy5zaXplKCldKSk7CisgICAgICAgIAorICAgICAgICBpZiAocmVzb3VyY2V0eXBlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGVudkVudHJpZXNGb3JtLnNldFJlc291cmNldHlwZShyZXNvdXJjZXR5cGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZW52RW50cmllc0Zvcm0uc2V0UmVzb3VyY2V0eXBlKCIiKTsKKyAgICAgICAgfQorICAgICAgICAgaWYgKHBhdGggIT0gbnVsbCkgeworICAgICAgICAgICAgZW52RW50cmllc0Zvcm0uc2V0UGF0aChwYXRoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGVudkVudHJpZXNGb3JtLnNldFBhdGgoIiIpOworICAgICAgICB9ICAgICAgICAKKyAgICAgICAgaWYgKGhvc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgZW52RW50cmllc0Zvcm0uc2V0SG9zdChob3N0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGVudkVudHJpZXNGb3JtLnNldEhvc3QoIiIpOworICAgICAgICB9ICAgICAgICAgIAorICAgICAgICBpZiAoZG9tYWluICE9IG51bGwpIHsKKyAgICAgICAgICAgIGVudkVudHJpZXNGb3JtLnNldERvbWFpbihkb21haW4pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZW52RW50cmllc0Zvcm0uc2V0RG9tYWluKCIiKTsKKyAgICAgICAgfSAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIHJldHVybiAoZW52RW50cmllc0Zvcm0pOworCisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGFuZCByZXR1cm4gYSBEYXRhU291cmNlc0Zvcm0gaWRlbnRpZnlpbmcgYWxsIGN1cnJlbnRseSBkZWZpbmVkCisgICAgICogZGF0YXNvdXJjZXMgaW4gdGhlIHNwZWNpZmllZCByZXNvdXJjZSBkYXRhYmFzZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtc2VydmVyIE1CZWFuU2VydmVyIHRvIGJlIGNvbnN1bHRlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBEYXRhU291cmNlc0Zvcm0gZ2V0RGF0YVNvdXJjZXNGb3JtKE1CZWFuU2VydmVyIG1zZXJ2ZXIsIAorICAgICAgICBTdHJpbmcgcmVzb3VyY2V0eXBlLCBTdHJpbmcgcGF0aCwgU3RyaW5nIGhvc3QsIFN0cmluZyBkb21haW4pIAorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgT2JqZWN0TmFtZSBybmFtZSA9IG51bGw7CisgICAgICAgIGlmIChyZXNvdXJjZXR5cGUhPW51bGwpIHsKKyAgICAgICAgICAgIGlmIChyZXNvdXJjZXR5cGUuZXF1YWxzKCJHbG9iYWwiKSkgeworICAgICAgICAgICAgICAgIHJuYW1lID0gbmV3IE9iamVjdE5hbWUoIGRvbWFpbiArIFJFU09VUkNFX1RZUEUgKyBHTE9CQUxfVFlQRSArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsY2xhc3M9IiArIERBVEFTT1VSQ0VfQ0xBU1MgKyAiLCoiKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzb3VyY2V0eXBlLmVxdWFscygiQ29udGV4dCIpKSB7CisgICAgICAgICAgICAgICAgcm5hbWUgPSBuZXcgT2JqZWN0TmFtZSAoIGRvbWFpbiArIFJFU09VUkNFX1RZUEUgKyBDT05URVhUX1RZUEUgKyAKKyAgICAgICAgICAgICAgICAgICAgIixwYXRoPSIgKyBwYXRoICsgIixob3N0PSIgKyBob3N0ICsgIixjbGFzcz0iICsgCisgICAgICAgICAgICAgICAgICAgIERBVEFTT1VSQ0VfQ0xBU1MgKyAiLCoiKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzb3VyY2V0eXBlLmVxdWFscygiRGVmYXVsdENvbnRleHQiKSkgeworICAgICAgICAgICAgICAgIGlmIChob3N0Lmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICBybmFtZSA9IG5ldyBPYmplY3ROYW1lKCBkb21haW4gKyBSRVNPVVJDRV9UWVBFICsgCisgICAgICAgICAgICAgICAgICAgICAgICBIT1NUX0RFRkFVTFRDT05URVhUX1RZUEUgKyAiLGhvc3Q9IiArIGhvc3QgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICIsY2xhc3M9IiArIERBVEFTT1VSQ0VfQ0xBU1MgKyAiLCoiKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBybmFtZSA9IG5ldyBPYmplY3ROYW1lKCBkb21haW4gKyBSRVNPVVJDRV9UWVBFICsgCisgICAgICAgICAgICAgICAgICAgICAgICBTRVJWSUNFX0RFRkFVTFRDT05URVhUX1RZUEUgKyAgCisgICAgICAgICAgICAgICAgICAgICAgICAiLGNsYXNzPSIgKyBEQVRBU09VUkNFX0NMQVNTICsgIiwqIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gKG1zZXJ2ZXIucXVlcnlNQmVhbnMocm5hbWUsIG51bGwpLml0ZXJhdG9yKCkpOworICAgICAgICAKKyAgICAgICAgQXJyYXlMaXN0IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0KCk7ICAgICAgICAKKyAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworICAgICAgICAgICAgCisgICAgICAgICAgICBPYmplY3RJbnN0YW5jZSBpbnN0YW5jZSA9IChPYmplY3RJbnN0YW5jZSkgaXRlcmF0b3IubmV4dCgpOyAKKyAgICAgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPSBpbnN0YW5jZS5nZXRPYmplY3ROYW1lKCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIC8vIG9ubHkgYWRkIHJlc291cmNlIG1iZWFuIGlmIGRlZmluaXRpb24gZXhpc3RzCisgICAgICAgICAgICAgICAgbXNlcnZlci5nZXRBdHRyaWJ1dGUob25hbWUsICJkcml2ZXJDbGFzc05hbWUiKTsKKyAgICAgICAgICAgICAgICByZXN1bHRzLmFkZChvbmFtZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEF0dHJpYnV0ZU5vdEZvdW5kRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgbXNlcnZlci5zZXRBdHRyaWJ1dGUob25hbWUsIAorICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKCJkcml2ZXJDbGFzc05hbWUiLCAiIikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQ29sbGVjdGlvbnMuc29ydChyZXN1bHRzKTsgICAgICAgIAorICAgICAgICBEYXRhU291cmNlc0Zvcm0gZGF0YVNvdXJjZXNGb3JtID0gbmV3IERhdGFTb3VyY2VzRm9ybSgpOworICAgICAgICBkYXRhU291cmNlc0Zvcm0uc2V0RGF0YVNvdXJjZXMoKFN0cmluZ1tdKSAKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMudG9BcnJheShuZXcgU3RyaW5nW3Jlc3VsdHMuc2l6ZSgpXSkpOyAgICAgICAgCisgICAgICAgIAorICAgICAgICBpZiAocmVzb3VyY2V0eXBlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGRhdGFTb3VyY2VzRm9ybS5zZXRSZXNvdXJjZXR5cGUocmVzb3VyY2V0eXBlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRhdGFTb3VyY2VzRm9ybS5zZXRSZXNvdXJjZXR5cGUoIiIpOworICAgICAgICB9CisgICAgICAgICBpZiAocGF0aCAhPSBudWxsKSB7CisgICAgICAgICAgICBkYXRhU291cmNlc0Zvcm0uc2V0UGF0aChwYXRoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRhdGFTb3VyY2VzRm9ybS5zZXRQYXRoKCIiKTsKKyAgICAgICAgfSAgICAgICAgCisgICAgICAgIGlmIChob3N0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGRhdGFTb3VyY2VzRm9ybS5zZXRIb3N0KGhvc3QpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGF0YVNvdXJjZXNGb3JtLnNldEhvc3QoIiIpOworICAgICAgICB9ICAgICAgICAKKyAgICAgICAgaWYgKGRvbWFpbiAhPSBudWxsKSB7CisgICAgICAgICAgICBkYXRhU291cmNlc0Zvcm0uc2V0RG9tYWluKGRvbWFpbik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkYXRhU291cmNlc0Zvcm0uc2V0RG9tYWluKCIiKTsKKyAgICAgICAgfSAgICAgICAgICAKKyAgICAgICAgcmV0dXJuIChkYXRhU291cmNlc0Zvcm0pOworCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhbmQgcmV0dXJuIGEgTWFpbFNlc3Npb25zRm9ybSBpZGVudGlmeWluZyBhbGwgY3VycmVudGx5IGRlZmluZWQKKyAgICAgKiBtYWlsc2Vzc2lvbnMgaW4gdGhlIHNwZWNpZmllZCByZXNvdXJjZSBkYXRhYmFzZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtc2VydmVyIE1CZWFuU2VydmVyIHRvIGJlIGNvbnN1bHRlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBNYWlsU2Vzc2lvbnNGb3JtIGdldE1haWxTZXNzaW9uc0Zvcm0oTUJlYW5TZXJ2ZXIgbXNlcnZlciwgCisgICAgICAgIFN0cmluZyByZXNvdXJjZXR5cGUsIFN0cmluZyBwYXRoLCBTdHJpbmcgaG9zdCwgU3RyaW5nIGRvbWFpbikgCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBPYmplY3ROYW1lIHJuYW1lID0gbnVsbDsKKyAgICAgICAgaWYgKHJlc291cmNldHlwZSE9bnVsbCkgeworICAgICAgICAgICAgaWYgKHJlc291cmNldHlwZS5lcXVhbHMoIkdsb2JhbCIpKSB7CisgICAgICAgICAgICAgICAgcm5hbWUgPSBuZXcgT2JqZWN0TmFtZSggZG9tYWluICsgUkVTT1VSQ0VfVFlQRSArIEdMT0JBTF9UWVBFICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIixjbGFzcz0iICsgTUFJTFNFU1NJT05fQ0xBU1MgKyAiLCoiKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzb3VyY2V0eXBlLmVxdWFscygiQ29udGV4dCIpKSB7CisgICAgICAgICAgICAgICAgcm5hbWUgPSBuZXcgT2JqZWN0TmFtZSAoZG9tYWluICsgUkVTT1VSQ0VfVFlQRSArIENPTlRFWFRfVFlQRSArIAorICAgICAgICAgICAgICAgICAgICAiLHBhdGg9IiArIHBhdGggKyAiLGhvc3Q9IiArIGhvc3QgKyAiLGNsYXNzPSIgKyAKKyAgICAgICAgICAgICAgICAgICAgTUFJTFNFU1NJT05fQ0xBU1MgKyAiLCoiKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzb3VyY2V0eXBlLmVxdWFscygiRGVmYXVsdENvbnRleHQiKSkgeworICAgICAgICAgICAgICAgIGlmIChob3N0Lmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICBybmFtZSA9IG5ldyBPYmplY3ROYW1lKGRvbWFpbiArIFJFU09VUkNFX1RZUEUgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgIEhPU1RfREVGQVVMVENPTlRFWFRfVFlQRSArICIsaG9zdD0iICsgaG9zdCArIAorICAgICAgICAgICAgICAgICAgICAgICAgIixjbGFzcz0iICsgTUFJTFNFU1NJT05fQ0xBU1MgKyAiLCoiKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBybmFtZSA9IG5ldyBPYmplY3ROYW1lKGRvbWFpbiArIFJFU09VUkNFX1RZUEUgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgIFNFUlZJQ0VfREVGQVVMVENPTlRFWFRfVFlQRSArCisgICAgICAgICAgICAgICAgICAgICAgICAiLGNsYXNzPSIgKyBNQUlMU0VTU0lPTl9DTEFTUyArICIsKiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgIAorICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IChtc2VydmVyLnF1ZXJ5TUJlYW5zKHJuYW1lLCBudWxsKS5pdGVyYXRvcigpKTsKKyAgICAgICAgCisgICAgICAgIEFycmF5TGlzdCByZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOyAgICAgICAgCisgICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgT2JqZWN0SW5zdGFuY2UgaW5zdGFuY2UgPSAoT2JqZWN0SW5zdGFuY2UpIGl0ZXJhdG9yLm5leHQoKTsgCisgICAgICAgICAgICByZXN1bHRzLmFkZChpbnN0YW5jZS5nZXRPYmplY3ROYW1lKCkudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKworICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHJlc3VsdHMpOyAgICAgICAgCisgICAgICAgIE1haWxTZXNzaW9uc0Zvcm0gbWFpbFNlc3Npb25zRm9ybSA9IG5ldyBNYWlsU2Vzc2lvbnNGb3JtKCk7CisgICAgICAgIG1haWxTZXNzaW9uc0Zvcm0uc2V0TWFpbFNlc3Npb25zKChTdHJpbmdbXSkgCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzLnRvQXJyYXkobmV3IFN0cmluZ1tyZXN1bHRzLnNpemUoKV0pKTsgICAgICAgIAorICAgICAgICAKKyAgICAgICAgaWYgKHJlc291cmNldHlwZSAhPSBudWxsKSB7CisgICAgICAgICAgICBtYWlsU2Vzc2lvbnNGb3JtLnNldFJlc291cmNldHlwZShyZXNvdXJjZXR5cGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWFpbFNlc3Npb25zRm9ybS5zZXRSZXNvdXJjZXR5cGUoIiIpOworICAgICAgICB9CisgICAgICAgICBpZiAocGF0aCAhPSBudWxsKSB7CisgICAgICAgICAgICBtYWlsU2Vzc2lvbnNGb3JtLnNldFBhdGgocGF0aCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtYWlsU2Vzc2lvbnNGb3JtLnNldFBhdGgoIiIpOworICAgICAgICB9ICAgICAgICAKKyAgICAgICAgaWYgKGhvc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgbWFpbFNlc3Npb25zRm9ybS5zZXRIb3N0KGhvc3QpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWFpbFNlc3Npb25zRm9ybS5zZXRIb3N0KCIiKTsKKyAgICAgICAgfSAgICAgICAgCisgICAgICAgIGlmIChkb21haW4gIT0gbnVsbCkgeworICAgICAgICAgICAgbWFpbFNlc3Npb25zRm9ybS5zZXREb21haW4oZG9tYWluKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1haWxTZXNzaW9uc0Zvcm0uc2V0RG9tYWluKCIiKTsKKyAgICAgICAgfSAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIHJldHVybiAobWFpbFNlc3Npb25zRm9ybSk7CisKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGFuZCByZXR1cm4gYSBSZXNvdXJjZUxpbmtzRm9ybSBpZGVudGlmeWluZyBhbGwgY3VycmVudGx5IGRlZmluZWQKKyAgICAgKiByZXNvdXJjZWxpbmtzIGluIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UgZGF0YWJhc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbXNlcnZlciBNQmVhblNlcnZlciB0byBiZSBjb25zdWx0ZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgUmVzb3VyY2VMaW5rc0Zvcm0gZ2V0UmVzb3VyY2VMaW5rc0Zvcm0oTUJlYW5TZXJ2ZXIgbXNlcnZlciwgCisgICAgICAgIFN0cmluZyByZXNvdXJjZXR5cGUsIFN0cmluZyBwYXRoLCBTdHJpbmcgaG9zdCwgU3RyaW5nIGRvbWFpbikgCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIE9iamVjdE5hbWUgcm5hbWUgPSBudWxsOworICAgICAgICBpZiAocmVzb3VyY2V0eXBlIT1udWxsKSB7CisgICAgICAgICAgICBpZiAocmVzb3VyY2V0eXBlLmVxdWFscygiR2xvYmFsIikpIHsKKyAgICAgICAgICAgICAgICBybmFtZSA9IG5ldyBPYmplY3ROYW1lKCBkb21haW4gKyBSRVNPVVJDRUxJTktfVFlQRSArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMT0JBTF9UWVBFICsgIiwqIik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHJlc291cmNldHlwZS5lcXVhbHMoIkNvbnRleHQiKSkgeworICAgICAgICAgICAgICAgIHJuYW1lID0gbmV3IE9iamVjdE5hbWUgKCBkb21haW4gKyBSRVNPVVJDRUxJTktfVFlQRSArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFRfVFlQRSArICIscGF0aD0iICsgcGF0aCArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsaG9zdD0iICsgaG9zdCArICIsKiIpOworICAgICAgICAgICAgfSBlbHNlIGlmIChyZXNvdXJjZXR5cGUuZXF1YWxzKCJEZWZhdWx0Q29udGV4dCIpKSB7CisgICAgICAgICAgICAgICAgaWYgKGhvc3QubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJuYW1lID0gbmV3IE9iamVjdE5hbWUoIGRvbWFpbiArIFJFU09VUkNFTElOS19UWVBFICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhPU1RfREVGQVVMVENPTlRFWFRfVFlQRSArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLGhvc3Q9IiArIGhvc3QgKyAiLCoiKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBybmFtZSA9IG5ldyBPYmplY3ROYW1lKCBkb21haW4gKyBSRVNPVVJDRUxJTktfVFlQRSArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVJWSUNFX0RFRkFVTFRDT05URVhUX1RZUEUgKyAiLCoiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAKKyAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSAobXNlcnZlci5xdWVyeU1CZWFucyhybmFtZSwgbnVsbCkuaXRlcmF0b3IoKSk7CisgICAgICAgIAorICAgICAgICBBcnJheUxpc3QgcmVzdWx0cyA9IG5ldyBBcnJheUxpc3QoKTsgICAgICAgIAorICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBPYmplY3RJbnN0YW5jZSBpbnN0YW5jZSA9IChPYmplY3RJbnN0YW5jZSkgaXRlcmF0b3IubmV4dCgpOyAKKyAgICAgICAgICAgIHJlc3VsdHMuYWRkKGluc3RhbmNlLmdldE9iamVjdE5hbWUoKS50b1N0cmluZygpKTsKKyAgICAgICAgfQorCisgICAgICAgIENvbGxlY3Rpb25zLnNvcnQocmVzdWx0cyk7ICAgICAgICAKKyAgICAgICAgUmVzb3VyY2VMaW5rc0Zvcm0gcmVzb3VyY2VMaW5rc0Zvcm0gPSBuZXcgUmVzb3VyY2VMaW5rc0Zvcm0oKTsKKyAgICAgICAgcmVzb3VyY2VMaW5rc0Zvcm0uc2V0UmVzb3VyY2VMaW5rcygoU3RyaW5nW10pIAorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy50b0FycmF5KG5ldyBTdHJpbmdbcmVzdWx0cy5zaXplKCldKSk7ICAgICAgICAKKyAgICAgICAgCisgICAgICAgIGlmIChyZXNvdXJjZXR5cGUgIT0gbnVsbCkgeworICAgICAgICAgICAgcmVzb3VyY2VMaW5rc0Zvcm0uc2V0UmVzb3VyY2V0eXBlKHJlc291cmNldHlwZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXNvdXJjZUxpbmtzRm9ybS5zZXRSZXNvdXJjZXR5cGUoIiIpOworICAgICAgICB9CisgICAgICAgICBpZiAocGF0aCAhPSBudWxsKSB7CisgICAgICAgICAgICByZXNvdXJjZUxpbmtzRm9ybS5zZXRQYXRoKHBhdGgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzb3VyY2VMaW5rc0Zvcm0uc2V0UGF0aCgiIik7CisgICAgICAgIH0gICAgICAgIAorICAgICAgICBpZiAoaG9zdCAhPSBudWxsKSB7CisgICAgICAgICAgICByZXNvdXJjZUxpbmtzRm9ybS5zZXRIb3N0KGhvc3QpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzb3VyY2VMaW5rc0Zvcm0uc2V0SG9zdCgiIik7CisgICAgICAgIH0gICAgICAgIAorICAgICAgICBpZiAoZG9tYWluICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJlc291cmNlTGlua3NGb3JtLnNldERvbWFpbihkb21haW4pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzb3VyY2VMaW5rc0Zvcm0uc2V0RG9tYWluKCIiKTsKKyAgICAgICAgfSAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIHJldHVybiAocmVzb3VyY2VMaW5rc0Zvcm0pOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGFuZCByZXR1cm4gYSBVc2VyRGF0YWJhc2VGb3JtIGlkZW50aWZ5aW5nIGFsbCBjdXJyZW50bHkgZGVmaW5lZAorICAgICAqIHVzZXIgZGF0YWJhc2VzIGluIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UgZGF0YWJhc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbXNlcnZlciBNQmVhblNlcnZlciB0byBiZSBjb25zdWx0ZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgVXNlckRhdGFiYXNlc0Zvcm0gZ2V0VXNlckRhdGFiYXNlc0Zvcm0oTUJlYW5TZXJ2ZXIgbXNlcnZlcixTdHJpbmcgZG9tYWluKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIAorICAgICAgICBPYmplY3ROYW1lIHJuYW1lID0gbmV3IE9iamVjdE5hbWUoIGRvbWFpbiArIFJFU09VUkNFX1RZUEUgKyBHTE9CQUxfVFlQRSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIixjbGFzcz0iICsgVVNFUkRCX0NMQVNTICsgIiwqIik7CisgICAgICAgIAorICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IChtc2VydmVyLnF1ZXJ5TUJlYW5zKHJuYW1lLCBudWxsKS5pdGVyYXRvcigpKTsKKyAgICAgICAgCisgICAgICAgIEFycmF5TGlzdCByZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOyAgICAgICAgCisgICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIE9iamVjdEluc3RhbmNlIGluc3RhbmNlID0gKE9iamVjdEluc3RhbmNlKSBpdGVyYXRvci5uZXh0KCk7IAorICAgICAgICAgICAgcmVzdWx0cy5hZGQoaW5zdGFuY2UuZ2V0T2JqZWN0TmFtZSgpLnRvU3RyaW5nKCkpOworICAgICAgICB9CisKKyAgICAgICAgQ29sbGVjdGlvbnMuc29ydChyZXN1bHRzKTsKKworICAgICAgICBVc2VyRGF0YWJhc2VzRm9ybSB1c2VyRGF0YWJhc2VzRm9ybSA9IG5ldyBVc2VyRGF0YWJhc2VzRm9ybSgpOworICAgICAgICB1c2VyRGF0YWJhc2VzRm9ybS5zZXRVc2VyRGF0YWJhc2VzKChTdHJpbmdbXSkgCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzLnRvQXJyYXkobmV3IFN0cmluZ1tyZXN1bHRzLnNpemUoKV0pKTsgIAorICAgICAgICByZXR1cm4gKHVzZXJEYXRhYmFzZXNGb3JtKTsKKworICAgIH0KKyAgICAKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZXNvdXJjZXMvUmVzb3VyY2VzVHJlZUJ1aWxkZXIuamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZXNvdXJjZXMvUmVzb3VyY2VzVHJlZUJ1aWxkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTcxNzFjCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3Jlc291cmNlcy9SZXNvdXJjZXNUcmVlQnVpbGRlci5qYXZhCkBAIC0wLDAgKzEsMTMyIEBACisvKgorICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVzb3VyY2VzOworCitpbXBvcnQgamF2YS5uZXQuVVJMRW5jb2RlcjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLkdsb2JhbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMudXRpbC5NZXNzYWdlUmVzb3VyY2VzOworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkFwcGxpY2F0aW9uU2VydmxldDsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5UcmVlQnVpbGRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5UcmVlQ29udHJvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5UcmVlQ29udHJvbE5vZGU7CisKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiA8Y29kZT5UcmVlQnVpbGRlcjwvY29kZT4gdGhhdCBhZGRzIHRoZSBub2RlcyByZXF1aXJlZAorICogZm9yIGFkbWluaXN0ZXJpbmcgdGhlIHJlc291cmNlcyAoZGF0YSBzb3VyY2VzKS4KKyAqCisgKiBAYXV0aG9yIE1hbnZlZW4gS2F1cgorICogQGF1dGhvciBBbXkgUm9oCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICogQHNpbmNlIDQuMQorICovCisKK3B1YmxpYyBjbGFzcyBSZXNvdXJjZXNUcmVlQnVpbGRlciBpbXBsZW1lbnRzIFRyZWVCdWlsZGVyIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVHJlZUJ1aWxkZXIgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBBZGQgdGhlIHJlcXVpcmVkIG5vZGVzIHRvIHRoZSBzcGVjaWZpZWQgPGNvZGU+dHJlZUNvbnRyb2w8L2NvZGU+CisgICAgICogaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHJlZUNvbnRyb2wgVGhlIDxjb2RlPlRyZWVDb250cm9sPC9jb2RlPiB0byB3aGljaCB3ZSBzaG91bGQKKyAgICAgKiAgYWRkIG91ciBub2RlcworICAgICAqIEBwYXJhbSBzZXJ2bGV0IFRoZSBjb250cm9sbGVyIHNlcnZsZXQgZm9yIHRoZSBhZG1pbiBhcHBsaWNhdGlvbgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBidWlsZFRyZWUoVHJlZUNvbnRyb2wgdHJlZUNvbnRyb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFwcGxpY2F0aW9uU2VydmxldCBzZXJ2bGV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworCisgICAgICAgIE1lc3NhZ2VSZXNvdXJjZXMgcmVzb3VyY2VzID0gKE1lc3NhZ2VSZXNvdXJjZXMpCisgICAgICAgICAgICBzZXJ2bGV0LmdldFNlcnZsZXRDb250ZXh0KCkuZ2V0QXR0cmlidXRlKEdsb2JhbHMuTUVTU0FHRVNfS0VZKTsKKyAgICAgICAgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpOworICAgICAgICBMb2NhbGUgbG9jYWxlID0gKExvY2FsZSkgc2Vzc2lvbi5nZXRBdHRyaWJ1dGUoR2xvYmFscy5MT0NBTEVfS0VZKTsKKyAgICAgICAgYWRkU3VidHJlZSh0cmVlQ29udHJvbC5nZXRSb290KCksIHJlc291cmNlcywgbG9jYWxlKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3RlY3RlZCBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIEFkZCB0aGUgc3VidHJlZSBvZiBub2RlcyByZXF1aXJlZCBmb3IgdXNlciBhZG1pbmlzdHJhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSByb290IFRoZSByb290IG5vZGUgb2Ygb3VyIHRyZWUgY29udHJvbAorICAgICAqIEBwYXJhbSByZXNvdXJjZXMgVGhlIE1lc3NhZ2VSZXNvdXJjZXMgZm9yIG91ciBsb2NhbGl6ZWQgbWVzc2FnZXMKKyAgICAgKiAgbWVzc2FnZXMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBhZGRTdWJ0cmVlKFRyZWVDb250cm9sTm9kZSByb290LCBNZXNzYWdlUmVzb3VyY2VzIHJlc291cmNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsZSBsb2NhbGUpIHsKKworICAgICAgICBTdHJpbmcgZG9tYWluID0gcm9vdC5nZXREb21haW4oKTsKKyAgICAgICAgVHJlZUNvbnRyb2xOb2RlIHN1YnRyZWUgPSBuZXcgVHJlZUNvbnRyb2xOb2RlCisgICAgICAgICAgICAoIkdsb2JhbCBSZXNvdXJjZSBBZG1pbmlzdHJhdGlvbiIsCisgICAgICAgICAgICAgImZvbGRlcl8xNl9wYWQuZ2lmIiwKKyAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJyZXNvdXJjZXMudHJlZUJ1aWxkZXIuc3VidHJlZU5vZGUiKSwKKyAgICAgICAgICAgICBudWxsLAorICAgICAgICAgICAgICJjb250ZW50IiwKKyAgICAgICAgICAgICB0cnVlLCBkb21haW4pOyAgICAgICAgCisgICAgICAgIFRyZWVDb250cm9sTm9kZSBkYXRhc291cmNlcyA9IG5ldyBUcmVlQ29udHJvbE5vZGUKKyAgICAgICAgICAgICgiR2xvYmFsbHkgQWRtaW5pc3RlciBEYXRhIFNvdXJjZXMiLAorICAgICAgICAgICAgICJEYXRhc291cmNlLmdpZiIsCisgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAicmVzb3VyY2VzLnRyZWVCdWlsZGVyLmRhdGFzb3VyY2VzIiksCisgICAgICAgICAgICAgInJlc291cmNlcy9saXN0RGF0YVNvdXJjZXMuZG8/cmVzb3VyY2V0eXBlPUdsb2JhbCZkb21haW49IiArCisgICAgICAgICAgICAgZG9tYWluICsgIiZmb3J3YXJkPSIgKyBVUkxFbmNvZGVyLmVuY29kZSgiRGF0YVNvdXJjZXMgTGlzdCBTZXR1cCIpLAorICAgICAgICAgICAgICJjb250ZW50IiwKKyAgICAgICAgICAgICBmYWxzZSwgZG9tYWluKTsKKyAgICAgICAgVHJlZUNvbnRyb2xOb2RlIG1haWxzZXNzaW9ucyA9IG5ldyBUcmVlQ29udHJvbE5vZGUKKyAgICAgICAgICAgICgiR2xvYmFsbHkgQWRtaW5pc3RlciBNYWlsIFNlc3Npb25zICIsCisgICAgICAgICAgICAgIk1haWxzZXNzaW9uLmdpZiIsCisgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAicmVzb3VyY2VzLnRyZWVCdWlsZGVyLm1haWxzZXNzaW9ucyIpLAorICAgICAgICAgICAgICJyZXNvdXJjZXMvbGlzdE1haWxTZXNzaW9ucy5kbz9yZXNvdXJjZXR5cGU9R2xvYmFsJmRvbWFpbj0iICsKKyAgICAgICAgICAgICBkb21haW4gKyAiJmZvcndhcmQ9IiArIFVSTEVuY29kZXIuZW5jb2RlKCJNYWlsU2Vzc2lvbnMgTGlzdCBTZXR1cCIpLAorICAgICAgICAgICAgICJjb250ZW50IiwKKyAgICAgICAgICAgICBmYWxzZSwgZG9tYWluKTsKKyAgICAgICAgVHJlZUNvbnRyb2xOb2RlIHVzZXJkYnMgPSBuZXcgVHJlZUNvbnRyb2xOb2RlCisgICAgICAgICAgICAoIkdsb2JhbGx5IEFkbWluaXN0ZXIgVXNlckRhdGFiYXNlIEVudHJpZXMiLAorICAgICAgICAgICAgICJSZWFsbS5naWYiLAorICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInJlc291cmNlcy50cmVlQnVpbGRlci5kYXRhYmFzZXMiKSwKKyAgICAgICAgICAgICAicmVzb3VyY2VzL2xpc3RVc2VyRGF0YWJhc2VzLmRvP2RvbWFpbj0iICsgZG9tYWluICsgCisgICAgICAgICAgICAgIiZmb3J3YXJkPSIgKyBVUkxFbmNvZGVyLmVuY29kZSgiVXNlckRhdGFiYXNlcyBMaXN0IFNldHVwIiksCisgICAgICAgICAgICAgImNvbnRlbnQiLAorICAgICAgICAgICAgIGZhbHNlLCBkb21haW4pOworICAgICAgICBUcmVlQ29udHJvbE5vZGUgZW52cyA9IG5ldyBUcmVlQ29udHJvbE5vZGUKKyAgICAgICAgICAgICgiR2xvYmFsbHkgQWRtaW5pc3RlciBFbnZpcm9ubWVudCBFbnRyaWVzIiwKKyAgICAgICAgICAgICAiRW52aXJvbm1lbnRFbnRyaWVzLmdpZiIsCisgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAicmVzb3VyY2VzLmVudi5lbnRyaWVzIiksCisgICAgICAgICAgICAgInJlc291cmNlcy9saXN0RW52RW50cmllcy5kbz9yZXNvdXJjZXR5cGU9R2xvYmFsJmRvbWFpbj0iICsKKyAgICAgICAgICAgICBkb21haW4rIiZmb3J3YXJkPSIrVVJMRW5jb2Rlci5lbmNvZGUoIkVudkVudHJpZXMgTGlzdCBTZXR1cCIpLAorICAgICAgICAgICAgICJjb250ZW50IiwKKyAgICAgICAgICAgICBmYWxzZSwgZG9tYWluKTsKKyAgICAgICAgcm9vdC5hZGRDaGlsZChzdWJ0cmVlKTsKKyAgICAgICAgc3VidHJlZS5hZGRDaGlsZChkYXRhc291cmNlcyk7CisgICAgICAgIHN1YnRyZWUuYWRkQ2hpbGQobWFpbHNlc3Npb25zKTsKKyAgICAgICAgc3VidHJlZS5hZGRDaGlsZChlbnZzKTsKKyAgICAgICAgc3VidHJlZS5hZGRDaGlsZCh1c2VyZGJzKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZXNvdXJjZXMvU2F2ZURhdGFTb3VyY2VBY3Rpb24uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZXNvdXJjZXMvU2F2ZURhdGFTb3VyY2VBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNThkNTM5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3Jlc291cmNlcy9TYXZlRGF0YVNvdXJjZUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjU1IEBACisvKgorICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTEVuY29kZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRXJyb3I7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkVycm9yczsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9ybTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9yd2FyZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LkF0dHJpYnV0ZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXJGYWN0b3J5OworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuUXVlcnlFeHA7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5RdWVyeTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdEluc3RhbmNlOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LkpNRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5BdHRyaWJ1dGVJbmZvOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5PcGVyYXRpb25JbmZvOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5JbmZvOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLnV0aWwuTWVzc2FnZVJlc291cmNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5BcHBsaWNhdGlvblNlcnZsZXQ7CisKKworLyoqCisgKiA8cD5JbXBsZW1lbnRhdGlvbiBvZiA8c3Ryb25nPkFjdGlvbjwvc3Ryb25nPiB0aGF0IHNhdmVzIGEgbmV3IG9yCisgKiB1cGRhdGVkIGRhdGEgc291cmNlIGVudHJ5LjwvcD4KKyAqCisgKiBAYXV0aG9yIE1hbnZlZW4gS2F1cgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqIEBzaW5jZSA0LjEKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgU2F2ZURhdGFTb3VyY2VBY3Rpb24gZXh0ZW5kcyBBY3Rpb24geworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworICAgIC8qKgorICAgICAqIFRoZSBNQmVhblNlcnZlciB3ZSB3aWxsIGJlIGludGVyYWN0aW5nIHdpdGguCisgICAgICovCisgICAgcHJpdmF0ZSBNQmVhblNlcnZlciBtc2VydmVyID0gbnVsbDsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBzcGVjaWZpZWQgSFRUUCByZXF1ZXN0LCBhbmQgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIEhUVFAKKyAgICAgKiByZXNwb25zZSAob3IgZm9yd2FyZCB0byBhbm90aGVyIHdlYiBjb21wb25lbnQgdGhhdCB3aWxsIGNyZWF0ZSBpdCkuCisgICAgICogUmV0dXJuIGFuIDxjb2RlPkFjdGlvbkZvcndhcmQ8L2NvZGU+IGluc3RhbmNlIGRlc2NyaWJpbmcgd2hlcmUgYW5kIGhvdworICAgICAqIGNvbnRyb2wgc2hvdWxkIGJlIGZvcndhcmRlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHJlc3BvbnNlIGhhcworICAgICAqIGFscmVhZHkgYmVlbiBjb21wbGV0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgQWN0aW9uTWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIGFjdGlvbkZvcm0gVGhlIG9wdGlvbmFsIEFjdGlvbkZvcm0gYmVhbiBmb3IgdGhpcyByZXF1ZXN0IChpZiBhbnkpCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIEhUVFAgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgSFRUUCByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXhjZXB0aW9uIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBBY3Rpb25Gb3J3YXJkIHBlcmZvcm0oQWN0aW9uTWFwcGluZyBtYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uRm9ybSBmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIExvb2sgdXAgdGhlIGNvbXBvbmVudHMgd2Ugd2lsbCBiZSB1c2luZyBhcyBuZWVkZWQKKyAgICAgICAgaWYgKG1zZXJ2ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgbXNlcnZlciA9ICgoQXBwbGljYXRpb25TZXJ2bGV0KSBnZXRTZXJ2bGV0KCkpLmdldFNlcnZlcigpOworICAgICAgICB9CisgICAgICAgIE1lc3NhZ2VSZXNvdXJjZXMgcmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VzKHJlcXVlc3QpOworICAgICAgICBIdHRwU2Vzc2lvbiBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uKCk7CisgICAgICAgIExvY2FsZSBsb2NhbGUgPSBnZXRMb2NhbGUocmVxdWVzdCk7CisKKyAgICAgICAgLy8gSGFzIHRoaXMgdHJhbnNhY3Rpb24gYmVlbiBjYW5jZWxsZWQ/CisgICAgICAgIGlmIChpc0NhbmNlbGxlZChyZXF1ZXN0KSkgeworICAgICAgICAgICAgcmV0dXJuIChtYXBwaW5nLmZpbmRGb3J3YXJkKCJMaXN0IERhdGFTb3VyY2VzIFNldHVwIikpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2hlY2sgdGhlIHRyYW5zYWN0aW9uIHRva2VuCisgICAgICAgIGlmICghaXNUb2tlblZhbGlkKHJlcXVlc3QpKSB7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19CQURfUkVRVUVTVCwKKyAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IudG9rZW4iKSk7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUGVyZm9ybSBhbnkgZXh0cmEgdmFsaWRhdGlvbiB0aGF0IGlzIHJlcXVpcmVkCisgICAgICAgIERhdGFTb3VyY2VGb3JtIGRhdGFTb3VyY2VGb3JtID0gKERhdGFTb3VyY2VGb3JtKSBmb3JtOworICAgICAgICBTdHJpbmcgb2JqZWN0TmFtZSA9IGRhdGFTb3VyY2VGb3JtLmdldE9iamVjdE5hbWUoKTsKKworICAgICAgICAvLyBQZXJmb3JtIGFuICJBZGQgRGF0YVNvdXJjZSIgdHJhbnNhY3Rpb24KKyAgICAgICAgaWYgKG9iamVjdE5hbWUgPT0gbnVsbCkgeworCisgICAgICAgICAgICBTdHJpbmcgc2lnbmF0dXJlW10gPSBuZXcgU3RyaW5nWzJdOworICAgICAgICAgICAgc2lnbmF0dXJlWzBdID0gImphdmEubGFuZy5TdHJpbmciOworICAgICAgICAgICAgc2lnbmF0dXJlWzFdID0gImphdmEubGFuZy5TdHJpbmciOworCisgICAgICAgICAgICBPYmplY3QgcGFyYW1zW10gPSBuZXcgT2JqZWN0WzJdOworICAgICAgICAgICAgcGFyYW1zWzBdID0gZGF0YVNvdXJjZUZvcm0uZ2V0Sm5kaU5hbWUoKTsKKyAgICAgICAgICAgIHBhcmFtc1sxXSA9IFJlc291cmNlVXRpbHMuREFUQVNPVVJDRV9DTEFTUzsKKyAgICAgICAgICAgIFN0cmluZyBlbmNvZGVkSm5kaU5hbWUgPSBVUkxFbmNvZGVyLmVuY29kZShwYXJhbXNbMF0udG9TdHJpbmcoKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVURi04Iik7CisKKyAgICAgICAgICAgIFN0cmluZyByZXNvdXJjZXR5cGUgPSBkYXRhU291cmNlRm9ybS5nZXRSZXNvdXJjZXR5cGUoKTsKKyAgICAgICAgICAgIFN0cmluZyBwYXRoID0gZGF0YVNvdXJjZUZvcm0uZ2V0UGF0aCgpOworICAgICAgICAgICAgU3RyaW5nIGhvc3QgPSBkYXRhU291cmNlRm9ybS5nZXRIb3N0KCk7CisgICAgICAgICAgICBTdHJpbmcgZG9tYWluID0gZGF0YVNvdXJjZUZvcm0uZ2V0RG9tYWluKCk7CisKKyAgICAgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPSBudWxsOworICAgICAgICAgICAgT2JqZWN0TmFtZSBlbmNvZGVkT05hbWUgPSBudWxsOworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKHJlc291cmNldHlwZS5lcXVhbHMoIkdsb2JhbCIpKSB7CisgICAgICAgICAgICAgICAgICAgIG9uYW1lID0gbmV3IE9iamVjdE5hbWUoIGRvbWFpbiArIFJlc291cmNlVXRpbHMuUkVTT1VSQ0VfVFlQRSArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZVV0aWxzLkdMT0JBTF9UWVBFICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsY2xhc3M9IiArIHBhcmFtc1sxXSArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLG5hbWU9IiArIHBhcmFtc1swXSk7CisgICAgICAgICAgICAgICAgICAgIGVuY29kZWRPTmFtZSA9IG5ldyBPYmplY3ROYW1lKCBkb21haW4gKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VVdGlscy5SRVNPVVJDRV9UWVBFICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlVXRpbHMuR0xPQkFMX1RZUEUgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIixjbGFzcz0iICsgcGFyYW1zWzFdICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsbmFtZT0iICsgZW5jb2RlZEpuZGlOYW1lKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlc291cmNldHlwZS5lcXVhbHMoIkNvbnRleHQiKSkgeworICAgICAgICAgICAgICAgICAgICBvbmFtZSA9IG5ldyBPYmplY3ROYW1lKCBkb21haW4gKyBSZXNvdXJjZVV0aWxzLlJFU09VUkNFX1RZUEUgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VVdGlscy5DT05URVhUX1RZUEUgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIixwYXRoPSIgKyBwYXRoICsgIixob3N0PSIgKyBob3N0ICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsY2xhc3M9IiArIHBhcmFtc1sxXSArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLG5hbWU9IiArIHBhcmFtc1swXSk7CisgICAgICAgICAgICAgICAgICAgIGVuY29kZWRPTmFtZSA9IG5ldyBPYmplY3ROYW1lKCBkb21haW4gKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VVdGlscy5SRVNPVVJDRV9UWVBFICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlVXRpbHMuQ09OVEVYVF9UWVBFICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIscGF0aD0iICsgcGF0aCArICIsaG9zdD0iICsgaG9zdCArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLGNsYXNzPSIgKyBwYXJhbXNbMV0gKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIixuYW1lPSIgKyBlbmNvZGVkSm5kaU5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAobXNlcnZlci5pc1JlZ2lzdGVyZWQob25hbWUpIHx8IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZXJ2ZXIuaXNSZWdpc3RlcmVkKGVuY29kZWRPTmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgQWN0aW9uRXJyb3JzIGVycm9ycyA9IG5ldyBBY3Rpb25FcnJvcnMoKTsKKyAgICAgICAgICAgICAgICAgICAgZXJyb3JzLmFkZCgiam5kaU5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBY3Rpb25FcnJvcigicmVzb3VyY2VzLmludmFsaWQubmFtZSIpKTsKKyAgICAgICAgICAgICAgICAgICAgc2F2ZUVycm9ycyhyZXF1ZXN0LCBlcnJvcnMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG5ldyBBY3Rpb25Gb3J3YXJkKG1hcHBpbmcuZ2V0SW5wdXQoKSkpOworICAgICAgICAgICAgICAgIH0gICAgICAgIAorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIG9uYW1lID0gUmVzb3VyY2VVdGlscy5nZXROYW1pbmdSZXNvdXJjZU9iamVjdE5hbWUoZG9tYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNldHlwZSwgcGF0aCwgaG9zdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBDcmVhdGUgdGhlIG5ldyBvYmplY3QgYW5kIGFzc29jaWF0ZWQgTUJlYW4KKyAgICAgICAgICAgICAgICBvYmplY3ROYW1lID0gKFN0cmluZykgbXNlcnZlci5pbnZva2Uob25hbWUsICJhZGRSZXNvdXJjZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcywgc2lnbmF0dXJlKTsKKworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKworICAgICAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmludm9rZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWRkUmVzb3VyY2UiKSwgZSk7CisgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmludm9rZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWRkUmVzb3VyY2UiKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgLy8gUGVyZm9ybSBhbiAiVXBkYXRlIFVzZXIgZGF0YWJhc2UiIHRyYW5zYWN0aW9uCisgICAgICAgIFN0cmluZyBhdHRyaWJ1dGUgPSBudWxsOworICAgICAgICB0cnkgeworCisgICAgICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0gbmV3IE9iamVjdE5hbWUob2JqZWN0TmFtZSk7CisKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJ1cmwiOworICAgICAgICAgICAgbXNlcnZlci5zZXRBdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICAob25hbWUsCisgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoYXR0cmlidXRlLCBkYXRhU291cmNlRm9ybS5nZXRVcmwoKSkpOworICAgICAgICAgICAgYXR0cmlidXRlID0gImRyaXZlckNsYXNzTmFtZSI7CisgICAgICAgICAgICBtc2VydmVyLnNldEF0dHJpYnV0ZQorICAgICAgICAgICAgICAgIChvbmFtZSwKKyAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZShhdHRyaWJ1dGUsIGRhdGFTb3VyY2VGb3JtLmdldERyaXZlckNsYXNzKCkpKTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJ1c2VybmFtZSI7CisgICAgICAgICAgICBtc2VydmVyLnNldEF0dHJpYnV0ZQorICAgICAgICAgICAgICAgIChvbmFtZSwKKyAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZShhdHRyaWJ1dGUsIGRhdGFTb3VyY2VGb3JtLmdldFVzZXJuYW1lKCkpKTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJwYXNzd29yZCI7CisgICAgICAgICAgICBtc2VydmVyLnNldEF0dHJpYnV0ZQorICAgICAgICAgICAgICAgIChvbmFtZSwKKyAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZShhdHRyaWJ1dGUsIGRhdGFTb3VyY2VGb3JtLmdldFBhc3N3b3JkKCkpKTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJtYXhBY3RpdmUiOworICAgICAgICAgICAgbXNlcnZlci5zZXRBdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICAob25hbWUsCisgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoYXR0cmlidXRlLCBkYXRhU291cmNlRm9ybS5nZXRBY3RpdmUoKSkpOworICAgICAgICAgICAgYXR0cmlidXRlID0gIm1heElkbGUiOworICAgICAgICAgICAgbXNlcnZlci5zZXRBdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICAob25hbWUsCisgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoYXR0cmlidXRlLCBkYXRhU291cmNlRm9ybS5nZXRJZGxlKCkpKTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJtYXhXYWl0IjsKKyAgICAgICAgICAgIG1zZXJ2ZXIuc2V0QXR0cmlidXRlCisgICAgICAgICAgICAgICAgKG9uYW1lLAorICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKGF0dHJpYnV0ZSwgZGF0YVNvdXJjZUZvcm0uZ2V0V2FpdCgpKSk7CisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAidmFsaWRhdGlvblF1ZXJ5IjsKKyAgICAgICAgICAgIFN0cmluZyB2YWxpZGF0aW9uUXVlcnkgPSBkYXRhU291cmNlRm9ybS5nZXRRdWVyeSgpOworICAgICAgICAgICAgaWYgKCh2YWxpZGF0aW9uUXVlcnkgIT0gbnVsbCkgJiYgKHZhbGlkYXRpb25RdWVyeS5sZW5ndGgoKT4wKSkgeworICAgICAgICAgICAgICAgIG1zZXJ2ZXIuc2V0QXR0cmlidXRlKG9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKGF0dHJpYnV0ZSwgdmFsaWRhdGlvblF1ZXJ5KSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKworICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZworICAgICAgICAgICAgICAgIChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5zZXQuYXR0cmlidXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlKSwgZSk7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsCisgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLnNldC5hdHRyaWJ1dGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUpKTsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisKKyAgICAgICAgfQorCisgICAgICAgIC8vIFByb2NlZWQgdG8gdGhlIGxpc3QgZW50cmllcyBzY3JlZW4KKyAgICAgICAgcmV0dXJuIChtYXBwaW5nLmZpbmRGb3J3YXJkKCJEYXRhU291cmNlcyBMaXN0IFNldHVwIikpOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZXNvdXJjZXMvU2F2ZUVudkVudHJ5QWN0aW9uLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVzb3VyY2VzL1NhdmVFbnZFbnRyeUFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1MTUzZWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVzb3VyY2VzL1NhdmVFbnZFbnRyeUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjI3IEBACisvKgorICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTERlY29kZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRXJyb3I7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkVycm9yczsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9ybTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9yd2FyZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LkF0dHJpYnV0ZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXJGYWN0b3J5OworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuUXVlcnlFeHA7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5RdWVyeTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdEluc3RhbmNlOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LkpNRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5BdHRyaWJ1dGVJbmZvOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5PcGVyYXRpb25JbmZvOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5JbmZvOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLnV0aWwuTWVzc2FnZVJlc291cmNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5BcHBsaWNhdGlvblNlcnZsZXQ7CisKKworLyoqCisgKiA8cD5JbXBsZW1lbnRhdGlvbiBvZiA8c3Ryb25nPkFjdGlvbjwvc3Ryb25nPiB0aGF0IHNhdmVzIGEgbmV3IG9yCisgKiB1cGRhdGVkIEVudiBFbnRyeS48L3A+CisgKgorICogQGF1dGhvciBNYW52ZWVuIEthdXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKiBAc2luY2UgNC4xCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIFNhdmVFbnZFbnRyeUFjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisgICAgLyoqCisgICAgICogVGhlIE1CZWFuU2VydmVyIHdlIHdpbGwgYmUgaW50ZXJhY3Rpbmcgd2l0aC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1CZWFuU2VydmVyIG1zZXJ2ZXIgPSBudWxsOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUHJvY2VzcyB0aGUgc3BlY2lmaWVkIEhUVFAgcmVxdWVzdCwgYW5kIGNyZWF0ZSB0aGUgY29ycmVzcG9uZGluZyBIVFRQCisgICAgICogcmVzcG9uc2UgKG9yIGZvcndhcmQgdG8gYW5vdGhlciB3ZWIgY29tcG9uZW50IHRoYXQgd2lsbCBjcmVhdGUgaXQpLgorICAgICAqIFJldHVybiBhbiA8Y29kZT5BY3Rpb25Gb3J3YXJkPC9jb2RlPiBpbnN0YW5jZSBkZXNjcmliaW5nIHdoZXJlIGFuZCBob3cKKyAgICAgKiBjb250cm9sIHNob3VsZCBiZSBmb3J3YXJkZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSByZXNwb25zZSBoYXMKKyAgICAgKiBhbHJlYWR5IGJlZW4gY29tcGxldGVkLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIEFjdGlvbk1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSBhY3Rpb25Gb3JtIFRoZSBvcHRpb25hbCBBY3Rpb25Gb3JtIGJlYW4gZm9yIHRoaXMgcmVxdWVzdCAoaWYgYW55KQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBIVFRQIHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIEhUVFAgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0IGV4Y2VwdGlvbiBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgQWN0aW9uRm9yd2FyZCBwZXJmb3JtKEFjdGlvbk1hcHBpbmcgbWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbkZvcm0gZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICAvLyBMb29rIHVwIHRoZSBjb21wb25lbnRzIHdlIHdpbGwgYmUgdXNpbmcgYXMgbmVlZGVkCisgICAgICAgIGlmIChtc2VydmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIG1zZXJ2ZXIgPSAoKEFwcGxpY2F0aW9uU2VydmxldCkgZ2V0U2VydmxldCgpKS5nZXRTZXJ2ZXIoKTsKKyAgICAgICAgfQorICAgICAgICBNZXNzYWdlUmVzb3VyY2VzIHJlc291cmNlcyA9IGdldFJlc291cmNlcyhyZXF1ZXN0KTsKKyAgICAgICAgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpOworICAgICAgICBMb2NhbGUgbG9jYWxlID0gZ2V0TG9jYWxlKHJlcXVlc3QpOworCisgICAgICAgIC8vIEhhcyB0aGlzIHRyYW5zYWN0aW9uIGJlZW4gY2FuY2VsbGVkPworICAgICAgICBpZiAoaXNDYW5jZWxsZWQocmVxdWVzdCkpIHsKKyAgICAgICAgICAgIHJldHVybiAobWFwcGluZy5maW5kRm9yd2FyZCgiTGlzdCBFbnZFbnRyaWVzIFNldHVwIikpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2hlY2sgdGhlIHRyYW5zYWN0aW9uIHRva2VuCisgICAgICAgIGlmICghaXNUb2tlblZhbGlkKHJlcXVlc3QpKSB7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19CQURfUkVRVUVTVCwKKyAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IudG9rZW4iKSk7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUGVyZm9ybSBhbnkgZXh0cmEgdmFsaWRhdGlvbiB0aGF0IGlzIHJlcXVpcmVkCisgICAgICAgIEVudkVudHJ5Rm9ybSBlbnZFbnRyeUZvcm0gPSAoRW52RW50cnlGb3JtKSBmb3JtOworICAgICAgICBTdHJpbmcgb2JqZWN0TmFtZSA9IGVudkVudHJ5Rm9ybS5nZXRPYmplY3ROYW1lKCk7CisKKyAgICAgICAgLy8gUGVyZm9ybSBhbiAiQWRkIEVudHJ5IiB0cmFuc2FjdGlvbgorICAgICAgICBpZiAob2JqZWN0TmFtZSA9PSBudWxsKSB7CisKKyAgICAgICAgICAgIFN0cmluZyBzaWduYXR1cmVbXSA9IG5ldyBTdHJpbmdbM107CisgICAgICAgICAgICBzaWduYXR1cmVbMF0gPSAiamF2YS5sYW5nLlN0cmluZyI7CisgICAgICAgICAgICBzaWduYXR1cmVbMV0gPSAiamF2YS5sYW5nLlN0cmluZyI7CisgICAgICAgICAgICBzaWduYXR1cmVbMl0gPSAiamF2YS5sYW5nLlN0cmluZyI7CisKKyAgICAgICAgICAgIE9iamVjdCBwYXJhbXNbXSA9IG5ldyBPYmplY3RbM107CisgICAgICAgICAgICBwYXJhbXNbMF0gPSBlbnZFbnRyeUZvcm0uZ2V0TmFtZSgpOworICAgICAgICAgICAgcGFyYW1zWzFdID0gZW52RW50cnlGb3JtLmdldEVudHJ5VHlwZSgpOworICAgICAgICAgICAgcGFyYW1zWzJdID0gZW52RW50cnlGb3JtLmdldFZhbHVlKCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIFN0cmluZyByZXNvdXJjZXR5cGUgPSBlbnZFbnRyeUZvcm0uZ2V0UmVzb3VyY2V0eXBlKCk7CisgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IGVudkVudHJ5Rm9ybS5nZXRQYXRoKCk7CisgICAgICAgICAgICBTdHJpbmcgaG9zdCA9IGVudkVudHJ5Rm9ybS5nZXRIb3N0KCk7CisgICAgICAgICAgICBTdHJpbmcgZG9tYWluID0gZW52RW50cnlGb3JtLmdldERvbWFpbigpOworICAgICAgICAgICAgCisgICAgICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0gbnVsbDsKKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZXR5cGUuZXF1YWxzKCJHbG9iYWwiKSkgeworICAgICAgICAgICAgICAgICAgICBvbmFtZSA9IG5ldyBPYmplY3ROYW1lKCBkb21haW4gKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VVdGlscy5FTlZJUk9OTUVOVF9UWVBFICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlVXRpbHMuR0xPQkFMX1RZUEUgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIixuYW1lPSIgKyBwYXJhbXNbMF0pOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzb3VyY2V0eXBlLmVxdWFscygiQ29udGV4dCIpKSB7CisgICAgICAgICAgICAgICAgICAgIG9uYW1lID0gbmV3IE9iamVjdE5hbWUoIGRvbWFpbiArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZVV0aWxzLkVOVklST05NRU5UX1RZUEUgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VVdGlscy5DT05URVhUX1RZUEUgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIixwYXRoPSIgKyBwYXRoICsgIixob3N0PSIgKyBob3N0ICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsbmFtZT0iICsgcGFyYW1zWzBdKTsKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKG1zZXJ2ZXIuaXNSZWdpc3RlcmVkKG9uYW1lKSkgeworICAgICAgICAgICAgICAgICAgICBBY3Rpb25FcnJvcnMgZXJyb3JzID0gbmV3IEFjdGlvbkVycm9ycygpOworICAgICAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKCJuYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQWN0aW9uRXJyb3IoInJlc291cmNlcy5pbnZhbGlkLmVudiIpKTsKKyAgICAgICAgICAgICAgICAgICAgc2F2ZUVycm9ycyhyZXF1ZXN0LCBlcnJvcnMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG5ldyBBY3Rpb25Gb3J3YXJkKG1hcHBpbmcuZ2V0SW5wdXQoKSkpOworICAgICAgICAgICAgICAgIH0gIAorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIG9uYW1lID0gUmVzb3VyY2VVdGlscy5nZXROYW1pbmdSZXNvdXJjZU9iamVjdE5hbWUoZG9tYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNldHlwZSwgcGF0aCwgaG9zdCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBuZXcgb2JqZWN0IGFuZCBhc3NvY2lhdGVkIE1CZWFuCisgICAgICAgICAgICAgICAgb2JqZWN0TmFtZSA9IChTdHJpbmcpIG1zZXJ2ZXIuaW52b2tlKG9uYW1lLCAiYWRkRW52aXJvbm1lbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMsIHNpZ25hdHVyZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisKKyAgICAgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nCisgICAgICAgICAgICAgICAgICAgIChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5pbnZva2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkZEVudmlyb25tZW50IiksIGUpOworICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5pbnZva2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkZEVudmlyb25tZW50IikpOworICAgICAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIC8vIFBlcmZvcm0gYW4gIlVwZGF0ZSBFbnZpcm9ubWVudCBFbnRyeSIgdHJhbnNhY3Rpb24KKyAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIENvbnN0cnVjdCBhbiBvYmplY3QgbmFtZSBmb3IgdGhpcyBvYmplY3QKKyAgICAgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPSBuZXcgT2JqZWN0TmFtZShvYmplY3ROYW1lKTsKKworICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBzcGVjaWZpZWQgZW52IGVudHJ5CisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAib3ZlcnJpZGUiOworICAgICAgICAgICAgbXNlcnZlci5zZXRBdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICAob25hbWUsCisgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoYXR0cmlidXRlLCBuZXcgQm9vbGVhbihlbnZFbnRyeUZvcm0uZ2V0T3ZlcnJpZGUoKSkpKTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJkZXNjcmlwdGlvbiI7CisgICAgICAgICAgICBtc2VydmVyLnNldEF0dHJpYnV0ZQorICAgICAgICAgICAgICAgIChvbmFtZSwKKyAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZShhdHRyaWJ1dGUsIGVudkVudHJ5Rm9ybS5nZXREZXNjcmlwdGlvbigpKSk7CisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAidHlwZSI7CisgICAgICAgICAgICBtc2VydmVyLnNldEF0dHJpYnV0ZQorICAgICAgICAgICAgICAgIChvbmFtZSwKKyAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZShhdHRyaWJ1dGUsIGVudkVudHJ5Rm9ybS5nZXRFbnRyeVR5cGUoKSkpOworICAgICAgICAgICAgYXR0cmlidXRlID0gInZhbHVlIjsKKyAgICAgICAgICAgIG1zZXJ2ZXIuc2V0QXR0cmlidXRlCisgICAgICAgICAgICAgICAgKG9uYW1lLAorICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKGF0dHJpYnV0ZSwgZW52RW50cnlGb3JtLmdldFZhbHVlKCkpKTsKKworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCisgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nCisgICAgICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLnNldC5hdHRyaWJ1dGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUpLCBlKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3Iuc2V0LmF0dHJpYnV0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSkpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBQcm9jZWVkIHRvIHRoZSBsaXN0IGVudHJpZXMgc2NyZWVuCisgICAgICAgIHJldHVybiAobWFwcGluZy5maW5kRm9yd2FyZCgiRW52RW50cmllcyBMaXN0IFNldHVwIikpOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZXNvdXJjZXMvU2F2ZU1haWxTZXNzaW9uQWN0aW9uLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVzb3VyY2VzL1NhdmVNYWlsU2Vzc2lvbkFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxZDRmMjEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVzb3VyY2VzL1NhdmVNYWlsU2Vzc2lvbkFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjEwIEBACisvKgorICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTERlY29kZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRXJyb3I7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkVycm9yczsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9ybTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9yd2FyZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LkF0dHJpYnV0ZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXJGYWN0b3J5OworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuUXVlcnlFeHA7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5RdWVyeTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdEluc3RhbmNlOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LkpNRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5BdHRyaWJ1dGVJbmZvOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5PcGVyYXRpb25JbmZvOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5JbmZvOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLnV0aWwuTWVzc2FnZVJlc291cmNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5BcHBsaWNhdGlvblNlcnZsZXQ7CisKKworLyoqCisgKiA8cD5JbXBsZW1lbnRhdGlvbiBvZiA8c3Ryb25nPkFjdGlvbjwvc3Ryb25nPiB0aGF0IHNhdmVzIGEgbmV3IG9yCisgKiB1cGRhdGVkIG1haWwgc2Vzc2lvbiBlbnRyeS48L3A+CisgKgorICogQGF1dGhvciBBbXkgUm9oCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICogQHNpbmNlIDQuMQorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBTYXZlTWFpbFNlc3Npb25BY3Rpb24gZXh0ZW5kcyBBY3Rpb24geworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworICAgIC8qKgorICAgICAqIFRoZSBNQmVhblNlcnZlciB3ZSB3aWxsIGJlIGludGVyYWN0aW5nIHdpdGguCisgICAgICovCisgICAgcHJpdmF0ZSBNQmVhblNlcnZlciBtc2VydmVyID0gbnVsbDsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBzcGVjaWZpZWQgSFRUUCByZXF1ZXN0LCBhbmQgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIEhUVFAKKyAgICAgKiByZXNwb25zZSAob3IgZm9yd2FyZCB0byBhbm90aGVyIHdlYiBjb21wb25lbnQgdGhhdCB3aWxsIGNyZWF0ZSBpdCkuCisgICAgICogUmV0dXJuIGFuIDxjb2RlPkFjdGlvbkZvcndhcmQ8L2NvZGU+IGluc3RhbmNlIGRlc2NyaWJpbmcgd2hlcmUgYW5kIGhvdworICAgICAqIGNvbnRyb2wgc2hvdWxkIGJlIGZvcndhcmRlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHJlc3BvbnNlIGhhcworICAgICAqIGFscmVhZHkgYmVlbiBjb21wbGV0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgQWN0aW9uTWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIGFjdGlvbkZvcm0gVGhlIG9wdGlvbmFsIEFjdGlvbkZvcm0gYmVhbiBmb3IgdGhpcyByZXF1ZXN0IChpZiBhbnkpCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIEhUVFAgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgSFRUUCByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXhjZXB0aW9uIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBBY3Rpb25Gb3J3YXJkIHBlcmZvcm0oQWN0aW9uTWFwcGluZyBtYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uRm9ybSBmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIExvb2sgdXAgdGhlIGNvbXBvbmVudHMgd2Ugd2lsbCBiZSB1c2luZyBhcyBuZWVkZWQKKyAgICAgICAgaWYgKG1zZXJ2ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgbXNlcnZlciA9ICgoQXBwbGljYXRpb25TZXJ2bGV0KSBnZXRTZXJ2bGV0KCkpLmdldFNlcnZlcigpOworICAgICAgICB9CisgICAgICAgIE1lc3NhZ2VSZXNvdXJjZXMgcmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VzKHJlcXVlc3QpOworICAgICAgICBIdHRwU2Vzc2lvbiBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uKCk7CisgICAgICAgIExvY2FsZSBsb2NhbGUgPSBnZXRMb2NhbGUocmVxdWVzdCk7CisKKyAgICAgICAgLy8gSGFzIHRoaXMgdHJhbnNhY3Rpb24gYmVlbiBjYW5jZWxsZWQ/CisgICAgICAgIGlmIChpc0NhbmNlbGxlZChyZXF1ZXN0KSkgeworICAgICAgICAgICAgcmV0dXJuIChtYXBwaW5nLmZpbmRGb3J3YXJkKCJMaXN0IE1haWxTZXNzaW9ucyBTZXR1cCIpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENoZWNrIHRoZSB0cmFuc2FjdGlvbiB0b2tlbgorICAgICAgICBpZiAoIWlzVG9rZW5WYWxpZChyZXF1ZXN0KSkgeworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfQkFEX1JFUVVFU1QsCisgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLnRva2VuIikpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFBlcmZvcm0gYW55IGV4dHJhIHZhbGlkYXRpb24gdGhhdCBpcyByZXF1aXJlZAorICAgICAgICBNYWlsU2Vzc2lvbkZvcm0gbWFpbFNlc3Npb25Gb3JtID0gKE1haWxTZXNzaW9uRm9ybSkgZm9ybTsKKyAgICAgICAgU3RyaW5nIG9iamVjdE5hbWUgPSBtYWlsU2Vzc2lvbkZvcm0uZ2V0T2JqZWN0TmFtZSgpOworCisgICAgICAgIC8vIFBlcmZvcm0gYW4gIkFkZCBNYWlsU2Vzc2lvbiIgdHJhbnNhY3Rpb24KKyAgICAgICAgaWYgKG9iamVjdE5hbWUgPT0gbnVsbCkgeworCisgICAgICAgICAgICBTdHJpbmcgc2lnbmF0dXJlW10gPSBuZXcgU3RyaW5nWzJdOworICAgICAgICAgICAgc2lnbmF0dXJlWzBdID0gImphdmEubGFuZy5TdHJpbmciOworICAgICAgICAgICAgc2lnbmF0dXJlWzFdID0gImphdmEubGFuZy5TdHJpbmciOworCisgICAgICAgICAgICBPYmplY3QgcGFyYW1zW10gPSBuZXcgT2JqZWN0WzJdOworICAgICAgICAgICAgcGFyYW1zWzBdID0gbWFpbFNlc3Npb25Gb3JtLmdldE5hbWUoKTsKKyAgICAgICAgICAgIHBhcmFtc1sxXSA9IFJlc291cmNlVXRpbHMuTUFJTFNFU1NJT05fQ0xBU1M7ICAgICAKKyAgICAgICAgICAgIAorICAgICAgICAgICAgU3RyaW5nIHJlc291cmNldHlwZSA9IG1haWxTZXNzaW9uRm9ybS5nZXRSZXNvdXJjZXR5cGUoKTsKKyAgICAgICAgICAgIFN0cmluZyBwYXRoID0gbWFpbFNlc3Npb25Gb3JtLmdldFBhdGgoKTsKKyAgICAgICAgICAgIFN0cmluZyBob3N0ID0gbWFpbFNlc3Npb25Gb3JtLmdldEhvc3QoKTsKKyAgICAgICAgICAgIFN0cmluZyBkb21haW4gPSBtYWlsU2Vzc2lvbkZvcm0uZ2V0RG9tYWluKCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPSBudWxsOworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKHJlc291cmNldHlwZS5lcXVhbHMoIkdsb2JhbCIpKSB7CisgICAgICAgICAgICAgICAgICAgIG9uYW1lID0gbmV3IE9iamVjdE5hbWUoIGRvbWFpbiArIFJlc291cmNlVXRpbHMuUkVTT1VSQ0VfVFlQRSArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZVV0aWxzLkdMT0JBTF9UWVBFICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsY2xhc3M9IiArIHBhcmFtc1sxXSArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLG5hbWU9IiArIHBhcmFtc1swXSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXNvdXJjZXR5cGUuZXF1YWxzKCJDb250ZXh0IikpIHsKKyAgICAgICAgICAgICAgICAgICAgb25hbWUgPSBuZXcgT2JqZWN0TmFtZSggZG9tYWluICsgUmVzb3VyY2VVdGlscy5SRVNPVVJDRV9UWVBFICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlVXRpbHMuQ09OVEVYVF9UWVBFICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIscGF0aD0iICsgcGF0aCArICIsaG9zdD0iICsgaG9zdCArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLGNsYXNzPSIgKyBwYXJhbXNbMV0gKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIixuYW1lPSIgKyBwYXJhbXNbMF0pOworICAgICAgICAgICAgICAgIH0gICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAobXNlcnZlci5pc1JlZ2lzdGVyZWQob25hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIEFjdGlvbkVycm9ycyBlcnJvcnMgPSBuZXcgQWN0aW9uRXJyb3JzKCk7CisgICAgICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoIm5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBY3Rpb25FcnJvcigicmVzb3VyY2VzLmludmFsaWQubmFtZSIpKTsKKyAgICAgICAgICAgICAgICAgICAgc2F2ZUVycm9ycyhyZXF1ZXN0LCBlcnJvcnMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG5ldyBBY3Rpb25Gb3J3YXJkKG1hcHBpbmcuZ2V0SW5wdXQoKSkpOworICAgICAgICAgICAgICAgIH0gICAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBvbmFtZSA9IFJlc291cmNlVXRpbHMuZ2V0TmFtaW5nUmVzb3VyY2VPYmplY3ROYW1lKGRvbWFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXR5cGUsIHBhdGgsIGhvc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgbmV3IG9iamVjdCBhbmQgYXNzb2NpYXRlZCBNQmVhbgorICAgICAgICAgICAgICAgIG9iamVjdE5hbWUgPSAoU3RyaW5nKSBtc2VydmVyLmludm9rZShvbmFtZSwgImFkZFJlc291cmNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLCBzaWduYXR1cmUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKworICAgICAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmludm9rZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWRkUmVzb3VyY2UiKSwgZSk7CisgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmludm9rZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWRkUmVzb3VyY2UiKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBQZXJmb3JtIGFuICJVcGRhdGUgVXNlciBkYXRhYmFzZSIgdHJhbnNhY3Rpb24KKyAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPSBuZXcgT2JqZWN0TmFtZShvYmplY3ROYW1lKTsKKworICAgICAgICAgICAgYXR0cmlidXRlID0gIm1haWwuc210cC5ob3N0IjsKKyAgICAgICAgICAgIG1zZXJ2ZXIuc2V0QXR0cmlidXRlCisgICAgICAgICAgICAgICAgKG9uYW1lLAorICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKGF0dHJpYnV0ZSwgbWFpbFNlc3Npb25Gb3JtLmdldE1haWxob3N0KCkpKTsKKworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCisgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nCisgICAgICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLnNldC5hdHRyaWJ1dGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUpLCBlKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3Iuc2V0LmF0dHJpYnV0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSkpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBQcm9jZWVkIHRvIHRoZSBsaXN0IGVudHJpZXMgc2NyZWVuCisgICAgICAgIHJldHVybiAobWFwcGluZy5maW5kRm9yd2FyZCgiTWFpbFNlc3Npb25zIExpc3QgU2V0dXAiKSk7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3Jlc291cmNlcy9TYXZlUmVzb3VyY2VMaW5rQWN0aW9uLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVzb3VyY2VzL1NhdmVSZXNvdXJjZUxpbmtBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWFiYjY4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3Jlc291cmNlcy9TYXZlUmVzb3VyY2VMaW5rQWN0aW9uLmphdmEKQEAgLTAsMCArMSwyMTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnJlc291cmNlczsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMRGVjb2RlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25FcnJvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRXJyb3JzOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3J3YXJkOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuQXR0cmlidXRlOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlckZhY3Rvcnk7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5RdWVyeUV4cDsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LlF1ZXJ5OworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0SW5zdGFuY2U7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuSk1FeGNlcHRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhbkF0dHJpYnV0ZUluZm87CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhbk9wZXJhdGlvbkluZm87CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhbkluZm87CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMudXRpbC5NZXNzYWdlUmVzb3VyY2VzOworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkFwcGxpY2F0aW9uU2VydmxldDsKKworCisvKioKKyAqIDxwPkltcGxlbWVudGF0aW9uIG9mIDxzdHJvbmc+QWN0aW9uPC9zdHJvbmc+IHRoYXQgc2F2ZXMgYSBuZXcgb3IKKyAqIHVwZGF0ZWQgcmVzb3VyY2UgbGluayBlbnRyeS48L3A+CisgKgorICogQGF1dGhvciBBbXkgUm9oCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICogQHNpbmNlIDQuMQorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBTYXZlUmVzb3VyY2VMaW5rQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKyAgICAvKioKKyAgICAgKiBUaGUgTUJlYW5TZXJ2ZXIgd2Ugd2lsbCBiZSBpbnRlcmFjdGluZyB3aXRoLgorICAgICAqLworICAgIHByaXZhdGUgTUJlYW5TZXJ2ZXIgbXNlcnZlciA9IG51bGw7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUHJvY2VzcyB0aGUgc3BlY2lmaWVkIEhUVFAgcmVxdWVzdCwgYW5kIGNyZWF0ZSB0aGUgY29ycmVzcG9uZGluZyBIVFRQCisgICAgICogcmVzcG9uc2UgKG9yIGZvcndhcmQgdG8gYW5vdGhlciB3ZWIgY29tcG9uZW50IHRoYXQgd2lsbCBjcmVhdGUgaXQpLgorICAgICAqIFJldHVybiBhbiA8Y29kZT5BY3Rpb25Gb3J3YXJkPC9jb2RlPiBpbnN0YW5jZSBkZXNjcmliaW5nIHdoZXJlIGFuZCBob3cKKyAgICAgKiBjb250cm9sIHNob3VsZCBiZSBmb3J3YXJkZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSByZXNwb25zZSBoYXMKKyAgICAgKiBhbHJlYWR5IGJlZW4gY29tcGxldGVkLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIEFjdGlvbk1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSBhY3Rpb25Gb3JtIFRoZSBvcHRpb25hbCBBY3Rpb25Gb3JtIGJlYW4gZm9yIHRoaXMgcmVxdWVzdCAoaWYgYW55KQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBIVFRQIHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIEhUVFAgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0IGV4Y2VwdGlvbiBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgQWN0aW9uRm9yd2FyZCBwZXJmb3JtKEFjdGlvbk1hcHBpbmcgbWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbkZvcm0gZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICAvLyBMb29rIHVwIHRoZSBjb21wb25lbnRzIHdlIHdpbGwgYmUgdXNpbmcgYXMgbmVlZGVkCisgICAgICAgIGlmIChtc2VydmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIG1zZXJ2ZXIgPSAoKEFwcGxpY2F0aW9uU2VydmxldCkgZ2V0U2VydmxldCgpKS5nZXRTZXJ2ZXIoKTsKKyAgICAgICAgfQorICAgICAgICBNZXNzYWdlUmVzb3VyY2VzIHJlc291cmNlcyA9IGdldFJlc291cmNlcyhyZXF1ZXN0KTsKKyAgICAgICAgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpOworICAgICAgICBMb2NhbGUgbG9jYWxlID0gZ2V0TG9jYWxlKHJlcXVlc3QpOworCisgICAgICAgIC8vIEhhcyB0aGlzIHRyYW5zYWN0aW9uIGJlZW4gY2FuY2VsbGVkPworICAgICAgICBpZiAoaXNDYW5jZWxsZWQocmVxdWVzdCkpIHsKKyAgICAgICAgICAgIHJldHVybiAobWFwcGluZy5maW5kRm9yd2FyZCgiTGlzdCBSZXNvdXJjZUxpbmtzIFNldHVwIikpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2hlY2sgdGhlIHRyYW5zYWN0aW9uIHRva2VuCisgICAgICAgIGlmICghaXNUb2tlblZhbGlkKHJlcXVlc3QpKSB7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19CQURfUkVRVUVTVCwKKyAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IudG9rZW4iKSk7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUGVyZm9ybSBhbnkgZXh0cmEgdmFsaWRhdGlvbiB0aGF0IGlzIHJlcXVpcmVkCisgICAgICAgIFJlc291cmNlTGlua0Zvcm0gcmVzb3VyY2VMaW5rRm9ybSA9IChSZXNvdXJjZUxpbmtGb3JtKSBmb3JtOworICAgICAgICBTdHJpbmcgb2JqZWN0TmFtZSA9IHJlc291cmNlTGlua0Zvcm0uZ2V0T2JqZWN0TmFtZSgpOworICAgICAKKyAgICAgICAgLy8gUGVyZm9ybSBhbiAiQWRkIFJlc291cmNlTGluayIgdHJhbnNhY3Rpb24KKyAgICAgICAgaWYgKG9iamVjdE5hbWUgPT0gbnVsbCkgeworCisgICAgICAgICAgICBTdHJpbmcgc2lnbmF0dXJlW10gPSBuZXcgU3RyaW5nWzJdOworICAgICAgICAgICAgc2lnbmF0dXJlWzBdID0gImphdmEubGFuZy5TdHJpbmciOworICAgICAgICAgICAgc2lnbmF0dXJlWzFdID0gImphdmEubGFuZy5TdHJpbmciOworCisgICAgICAgICAgICBPYmplY3QgcGFyYW1zW10gPSBuZXcgT2JqZWN0WzJdOworICAgICAgICAgICAgcGFyYW1zWzBdID0gcmVzb3VyY2VMaW5rRm9ybS5nZXROYW1lKCk7CisgICAgICAgICAgICBwYXJhbXNbMV0gPSByZXNvdXJjZUxpbmtGb3JtLmdldFR5cGUoKTsgICAKKyAgICAgICAgICAgIAorICAgICAgICAgICAgU3RyaW5nIHJlc291cmNldHlwZSA9IHJlc291cmNlTGlua0Zvcm0uZ2V0UmVzb3VyY2V0eXBlKCk7CisgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IHJlc291cmNlTGlua0Zvcm0uZ2V0UGF0aCgpOworICAgICAgICAgICAgU3RyaW5nIGhvc3QgPSByZXNvdXJjZUxpbmtGb3JtLmdldEhvc3QoKTsKKyAgICAgICAgICAgIFN0cmluZyBkb21haW4gPSByZXNvdXJjZUxpbmtGb3JtLmdldERvbWFpbigpOworICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPSBudWxsOworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKHJlc291cmNldHlwZS5lcXVhbHMoIkdsb2JhbCIpKSB7CisgICAgICAgICAgICAgICAgICAgIG9uYW1lID0gbmV3IE9iamVjdE5hbWUoIGRvbWFpbiArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZVV0aWxzLlJFU09VUkNFTElOS19UWVBFICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlVXRpbHMuR0xPQkFMX1RZUEUgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIixuYW1lPSIgKyBwYXJhbXNbMF0pOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzb3VyY2V0eXBlLmVxdWFscygiQ29udGV4dCIpKSB7CisgICAgICAgICAgICAgICAgICAgIG9uYW1lID0gbmV3IE9iamVjdE5hbWUoIGRvbWFpbiArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZVV0aWxzLlJFU09VUkNFTElOS19UWVBFICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlVXRpbHMuQ09OVEVYVF9UWVBFICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIscGF0aD0iICsgcGF0aCArICIsaG9zdD0iICsgaG9zdCArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLG5hbWU9IiArIHBhcmFtc1swXSk7CisgICAgICAgICAgICAgICAgfSAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmIChtc2VydmVyLmlzUmVnaXN0ZXJlZChvbmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgQWN0aW9uRXJyb3JzIGVycm9ycyA9IG5ldyBBY3Rpb25FcnJvcnMoKTsKKyAgICAgICAgICAgICAgICAgICAgZXJyb3JzLmFkZCgibmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFjdGlvbkVycm9yKCJyZXNvdXJjZXMuaW52YWxpZC5uYW1lIikpOworICAgICAgICAgICAgICAgICAgICBzYXZlRXJyb3JzKHJlcXVlc3QsIGVycm9ycyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAobmV3IEFjdGlvbkZvcndhcmQobWFwcGluZy5nZXRJbnB1dCgpKSk7CisgICAgICAgICAgICAgICAgfSAgIAorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIG9uYW1lID0gUmVzb3VyY2VVdGlscy5nZXROYW1pbmdSZXNvdXJjZU9iamVjdE5hbWUoZG9tYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNldHlwZSwgcGF0aCwgaG9zdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBuZXcgb2JqZWN0IGFuZCBhc3NvY2lhdGVkIE1CZWFuCisgICAgICAgICAgICAgICAgb2JqZWN0TmFtZSA9IChTdHJpbmcpIG1zZXJ2ZXIuaW52b2tlKG9uYW1lLCAiYWRkUmVzb3VyY2VMaW5rIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLCBzaWduYXR1cmUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKworICAgICAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmludm9rZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWRkUmVzb3VyY2VMaW5rIiksIGUpOworICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5pbnZva2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkZFJlc291cmNlTGluayIpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIFBlcmZvcm0gYW4gIlVwZGF0ZSBVc2VyIGRhdGFiYXNlIiB0cmFuc2FjdGlvbgorICAgICAgICBTdHJpbmcgYXR0cmlidXRlID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9IG5ldyBPYmplY3ROYW1lKG9iamVjdE5hbWUpOworICAgICAgICAgICAgCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAiZ2xvYmFsIjsKKyAgICAgICAgICAgIG1zZXJ2ZXIuc2V0QXR0cmlidXRlCisgICAgICAgICAgICAgICAgKG9uYW1lLAorICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKGF0dHJpYnV0ZSwgcmVzb3VyY2VMaW5rRm9ybS5nZXRHbG9iYWwoKSkpOworICAgICAgICAgICAgYXR0cmlidXRlID0gInR5cGUiOworICAgICAgICAgICAgbXNlcnZlci5zZXRBdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICAob25hbWUsCisgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoYXR0cmlidXRlLCByZXNvdXJjZUxpbmtGb3JtLmdldFR5cGUoKSkpOworCisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisKKyAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3Iuc2V0LmF0dHJpYnV0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSksIGUpOworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5zZXQuYXR0cmlidXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlKSk7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIFByb2NlZWQgdG8gdGhlIGxpc3QgZW50cmllcyBzY3JlZW4KKyAgICAgICAgcmV0dXJuIChtYXBwaW5nLmZpbmRGb3J3YXJkKCJSZXNvdXJjZUxpbmtzIExpc3QgU2V0dXAiKSk7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3Jlc291cmNlcy9TYXZlVXNlckRhdGFiYXNlQWN0aW9uLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVzb3VyY2VzL1NhdmVVc2VyRGF0YWJhc2VBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTNhNWU1Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3Jlc291cmNlcy9TYXZlVXNlckRhdGFiYXNlQWN0aW9uLmphdmEKQEAgLTAsMCArMSwyMTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnJlc291cmNlczsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMRGVjb2RlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25FcnJvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRXJyb3JzOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3J3YXJkOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuQXR0cmlidXRlOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlckZhY3Rvcnk7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5RdWVyeUV4cDsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LlF1ZXJ5OworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0SW5zdGFuY2U7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuSk1FeGNlcHRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhbkF0dHJpYnV0ZUluZm87CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhbk9wZXJhdGlvbkluZm87CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhbkluZm87CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMudXRpbC5NZXNzYWdlUmVzb3VyY2VzOworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkFwcGxpY2F0aW9uU2VydmxldDsKKworCisvKioKKyAqIDxwPkltcGxlbWVudGF0aW9uIG9mIDxzdHJvbmc+QWN0aW9uPC9zdHJvbmc+IHRoYXQgc2F2ZXMgYSBuZXcgb3IKKyAqIHVwZGF0ZWQgVXNlciBkYXRhYmFzZSBlbnRyeS48L3A+CisgKgorICogQGF1dGhvciBNYW52ZWVuIEthdXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKiBAc2luY2UgNC4xCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIFNhdmVVc2VyRGF0YWJhc2VBY3Rpb24gZXh0ZW5kcyBBY3Rpb24geworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworICAgIC8qKgorICAgICAqIFRoZSBNQmVhblNlcnZlciB3ZSB3aWxsIGJlIGludGVyYWN0aW5nIHdpdGguCisgICAgICovCisgICAgcHJpdmF0ZSBNQmVhblNlcnZlciBtc2VydmVyID0gbnVsbDsKKworICAgIC8qCisgICAgICogT25seSBvbmUgaW1wbGVtZW50YXRpb24gb2YgZmFjdG9yeSBhbGxvd2VkIHRvIHN0YXJ0IHdpdGguCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgVVNFUkRCX0ZBQ1RPUlkgPSAib3JnLmFwYWNoZS5jYXRhbGluYS51c2Vycy5NZW1vcnlVc2VyRGF0YWJhc2VGYWN0b3J5IjsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBzcGVjaWZpZWQgSFRUUCByZXF1ZXN0LCBhbmQgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIEhUVFAKKyAgICAgKiByZXNwb25zZSAob3IgZm9yd2FyZCB0byBhbm90aGVyIHdlYiBjb21wb25lbnQgdGhhdCB3aWxsIGNyZWF0ZSBpdCkuCisgICAgICogUmV0dXJuIGFuIDxjb2RlPkFjdGlvbkZvcndhcmQ8L2NvZGU+IGluc3RhbmNlIGRlc2NyaWJpbmcgd2hlcmUgYW5kIGhvdworICAgICAqIGNvbnRyb2wgc2hvdWxkIGJlIGZvcndhcmRlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHJlc3BvbnNlIGhhcworICAgICAqIGFscmVhZHkgYmVlbiBjb21wbGV0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgQWN0aW9uTWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIGFjdGlvbkZvcm0gVGhlIG9wdGlvbmFsIEFjdGlvbkZvcm0gYmVhbiBmb3IgdGhpcyByZXF1ZXN0IChpZiBhbnkpCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIEhUVFAgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgSFRUUCByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXhjZXB0aW9uIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBBY3Rpb25Gb3J3YXJkIHBlcmZvcm0oQWN0aW9uTWFwcGluZyBtYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uRm9ybSBmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIExvb2sgdXAgdGhlIGNvbXBvbmVudHMgd2Ugd2lsbCBiZSB1c2luZyBhcyBuZWVkZWQKKyAgICAgICAgaWYgKG1zZXJ2ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgbXNlcnZlciA9ICgoQXBwbGljYXRpb25TZXJ2bGV0KSBnZXRTZXJ2bGV0KCkpLmdldFNlcnZlcigpOworICAgICAgICB9CisgICAgICAgIE1lc3NhZ2VSZXNvdXJjZXMgcmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VzKHJlcXVlc3QpOworICAgICAgICBIdHRwU2Vzc2lvbiBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uKCk7CisgICAgICAgIExvY2FsZSBsb2NhbGUgPSBnZXRMb2NhbGUocmVxdWVzdCk7CisKKyAgICAgICAgLy8gSGFzIHRoaXMgdHJhbnNhY3Rpb24gYmVlbiBjYW5jZWxsZWQ/CisgICAgICAgIGlmIChpc0NhbmNlbGxlZChyZXF1ZXN0KSkgeworICAgICAgICAgICAgcmV0dXJuIChtYXBwaW5nLmZpbmRGb3J3YXJkKCJMaXN0IFVzZXJEYXRhYmFzZXMgU2V0dXAiKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBDaGVjayB0aGUgdHJhbnNhY3Rpb24gdG9rZW4KKyAgICAgICAgaWYgKCFpc1Rva2VuVmFsaWQocmVxdWVzdCkpIHsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0JBRF9SRVFVRVNULAorICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci50b2tlbiIpKTsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBQZXJmb3JtIGFueSBleHRyYSB2YWxpZGF0aW9uIHRoYXQgaXMgcmVxdWlyZWQKKyAgICAgICAgVXNlckRhdGFiYXNlRm9ybSB1c2VyRGF0YWJhc2VGb3JtID0gKFVzZXJEYXRhYmFzZUZvcm0pIGZvcm07CisgICAgICAgIFN0cmluZyBvYmplY3ROYW1lID0gdXNlckRhdGFiYXNlRm9ybS5nZXRPYmplY3ROYW1lKCk7CisKKyAgICAgICAgLy8gUGVyZm9ybSBhbiAiQWRkIFVzZXJEYXRhYmFzZSIgdHJhbnNhY3Rpb24KKyAgICAgICAgaWYgKG9iamVjdE5hbWUgPT0gbnVsbCkgeworCisgICAgICAgICAgICBTdHJpbmcgc2lnbmF0dXJlW10gPSBuZXcgU3RyaW5nWzJdOworICAgICAgICAgICAgc2lnbmF0dXJlWzBdID0gImphdmEubGFuZy5TdHJpbmciOworICAgICAgICAgICAgc2lnbmF0dXJlWzFdID0gImphdmEubGFuZy5TdHJpbmciOworCisgICAgICAgICAgICBPYmplY3QgcGFyYW1zW10gPSBuZXcgT2JqZWN0WzJdOworICAgICAgICAgICAgcGFyYW1zWzBdID0gdXNlckRhdGFiYXNlRm9ybS5nZXROYW1lKCk7CisgICAgICAgICAgICBwYXJhbXNbMV0gPSBSZXNvdXJjZVV0aWxzLlVTRVJEQl9DTEFTUzsgICAgIAorICAgICAgICAgICAKKyAgICAgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPSBudWxsOworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFN0cmluZyBkb21haW4gPSB1c2VyRGF0YWJhc2VGb3JtLmdldERvbWFpbigpOworICAgICAgICAgICAgICAgIG9uYW1lID0gbmV3IE9iamVjdE5hbWUoIGRvbWFpbiArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlVXRpbHMuUkVTT1VSQ0VfVFlQRSArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlVXRpbHMuR0xPQkFMX1RZUEUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsY2xhc3M9IiArIFJlc291cmNlVXRpbHMuVVNFUkRCX0NMQVNTICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIixuYW1lPSIgKyBwYXJhbXNbMF0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmIChtc2VydmVyLmlzUmVnaXN0ZXJlZChvbmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgQWN0aW9uRXJyb3JzIGVycm9ycyA9IG5ldyBBY3Rpb25FcnJvcnMoKTsKKyAgICAgICAgICAgICAgICAgICAgZXJyb3JzLmFkZCgibmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFjdGlvbkVycm9yKCJyZXNvdXJjZXMuaW52YWxpZC5uYW1lIikpOworICAgICAgICAgICAgICAgICAgICBzYXZlRXJyb3JzKHJlcXVlc3QsIGVycm9ycyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAobmV3IEFjdGlvbkZvcndhcmQobWFwcGluZy5nZXRJbnB1dCgpKSk7CisgICAgICAgICAgICAgICAgfSAgIAorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIENvbnN0cnVjdCB0aGUgTUJlYW4gTmFtZSBmb3IgdGhlIG5hbWluZyBzb3VyY2UKKyAgICAgICAgICAgICAgICBvbmFtZSA9IG5ldyBPYmplY3ROYW1lKGRvbWFpbiArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlVXRpbHMuTkFNSU5HUkVTT1VSQ0VTX1RZUEUgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZVV0aWxzLkdMT0JBTF9UWVBFKTsKKyAKKyAgICAgICAgICAgICAgICAvLyBDcmVhdGUgdGhlIG5ldyBvYmplY3QgYW5kIGFzc29jaWF0ZWQgTUJlYW4KKyAgICAgICAgICAgICAgICBvYmplY3ROYW1lID0gKFN0cmluZykgbXNlcnZlci5pbnZva2Uob25hbWUsICJhZGRSZXNvdXJjZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcywgc2lnbmF0dXJlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisKKyAgICAgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nCisgICAgICAgICAgICAgICAgICAgIChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5pbnZva2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkZFJlc291cmNlIiksIGUpOworICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5pbnZva2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkZFJlc291cmNlIikpOworICAgICAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gUGVyZm9ybSBhbiAiVXBkYXRlIFVzZXIgZGF0YWJhc2UiIHRyYW5zYWN0aW9uCisgICAgICAgIFN0cmluZyBhdHRyaWJ1dGUgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgCisgICAgICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0gbmV3IE9iamVjdE5hbWUob2JqZWN0TmFtZSk7CisKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJwYXRobmFtZSI7CisgICAgICAgICAgICBtc2VydmVyLnNldEF0dHJpYnV0ZQorICAgICAgICAgICAgICAgIChvbmFtZSwKKyAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZShhdHRyaWJ1dGUsIHVzZXJEYXRhYmFzZUZvcm0uZ2V0UGF0aCgpKSk7CisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAiZmFjdG9yeSI7CisgICAgICAgICAgICBtc2VydmVyLnNldEF0dHJpYnV0ZQorICAgICAgICAgICAgICAgIChvbmFtZSwKKyAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZShhdHRyaWJ1dGUsIHVzZXJEYXRhYmFzZUZvcm0uZ2V0RmFjdG9yeSgpKSk7CisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAiZGVzY3JpcHRpb24iOworICAgICAgICAgICAgbXNlcnZlci5zZXRBdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICAob25hbWUsCisgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoYXR0cmlidXRlLCB1c2VyRGF0YWJhc2VGb3JtLmdldERlc2NyaXB0aW9uKCkpKTsKKworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCisgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nCisgICAgICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLnNldC5hdHRyaWJ1dGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUpLCBlKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3Iuc2V0LmF0dHJpYnV0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSkpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBQcm9jZWVkIHRvIHRoZSBsaXN0IGVudHJpZXMgc2NyZWVuCisgICAgICAgIHJldHVybiAobWFwcGluZy5maW5kRm9yd2FyZCgiVXNlckRhdGFiYXNlcyBMaXN0IFNldHVwIikpOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZXNvdXJjZXMvU2V0VXBEYXRhU291cmNlQWN0aW9uLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVzb3VyY2VzL1NldFVwRGF0YVNvdXJjZUFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4Yzg3ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVzb3VyY2VzL1NldFVwRGF0YVNvdXJjZUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTk3IEBACisvKgorICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVzb3VyY2VzOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkxEZWNvZGVyOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuQXR0cmlidXRlOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuQXR0cmlidXRlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyRmFjdG9yeTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LlF1ZXJ5RXhwOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuUXVlcnk7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3RJbnN0YW5jZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5KTUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuQXR0cmlidXRlSW5mbzsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuT3BlcmF0aW9uSW5mbzsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuSW5mbzsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRXJyb3JzOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3J3YXJkOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLnV0aWwuTWVzc2FnZVJlc291cmNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5BcHBsaWNhdGlvblNlcnZsZXQ7CisKKworLyoqCisgKiA8cD5JbXBsZW1lbnRhdGlvbiBvZiA8c3Ryb25nPkFjdGlvbjwvc3Ryb25nPiB0aGF0IHNldHMgdXAgYW5kIHN0YXNoZXMKKyAqIGEgPGNvZGU+RGF0YVNvdXJjZUZvcm08L2NvZGU+IGJlYW4gaW4gcmVxdWVzdCBzY29wZS4gIFRoZSBmb3JtIGJlYW4gd2lsbCBoYXZlCisgKiBhIG51bGwgPGNvZGU+b2JqZWN0TmFtZTwvY29kZT4gcHJvcGVydHkgaWYgdGhpcyBmb3JtIHJlcHJlc2VudHMgYSBEYXRhU291cmNlCisgKiBiZWluZyBhZGRlZCwgb3IgYSBub24tbnVsbCB2YWx1ZSBmb3IgYW4gZXhpc3RpbmcgRGF0YVNvdXJjZS48L3A+CisgKgorICogQGF1dGhvciBNYW52ZWVuIEthdXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKiBAc2luY2UgNC4xCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIFNldFVwRGF0YVNvdXJjZUFjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIE1CZWFuU2VydmVyIHdlIHdpbGwgYmUgaW50ZXJhY3Rpbmcgd2l0aC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1CZWFuU2VydmVyIG1zZXJ2ZXIgPSBudWxsOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUHJvY2VzcyB0aGUgc3BlY2lmaWVkIEhUVFAgcmVxdWVzdCwgYW5kIGNyZWF0ZSB0aGUgY29ycmVzcG9uZGluZyBIVFRQCisgICAgICogcmVzcG9uc2UgKG9yIGZvcndhcmQgdG8gYW5vdGhlciB3ZWIgY29tcG9uZW50IHRoYXQgd2lsbCBjcmVhdGUgaXQpLgorICAgICAqIFJldHVybiBhbiA8Y29kZT5BY3Rpb25Gb3J3YXJkPC9jb2RlPiBpbnN0YW5jZSBkZXNjcmliaW5nIHdoZXJlIGFuZCBob3cKKyAgICAgKiBjb250cm9sIHNob3VsZCBiZSBmb3J3YXJkZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSByZXNwb25zZSBoYXMKKyAgICAgKiBhbHJlYWR5IGJlZW4gY29tcGxldGVkLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIEFjdGlvbk1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSBhY3Rpb25Gb3JtIFRoZSBvcHRpb25hbCBBY3Rpb25Gb3JtIGJlYW4gZm9yIHRoaXMgcmVxdWVzdCAoaWYgYW55KQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBIVFRQIHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIEhUVFAgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0IGV4Y2VwdGlvbiBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgQWN0aW9uRm9yd2FyZCBwZXJmb3JtKEFjdGlvbk1hcHBpbmcgbWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbkZvcm0gZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICAvLyBMb29rIHVwIHRoZSBjb21wb25lbnRzIHdlIHdpbGwgYmUgdXNpbmcgYXMgbmVlZGVkCisgICAgICAgIGlmIChtc2VydmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIG1zZXJ2ZXIgPSAoKEFwcGxpY2F0aW9uU2VydmxldCkgZ2V0U2VydmxldCgpKS5nZXRTZXJ2ZXIoKTsKKyAgICAgICAgfQorICAgICAgICBNZXNzYWdlUmVzb3VyY2VzIHJlc291cmNlcyA9IGdldFJlc291cmNlcyhyZXF1ZXN0KTsKKyAgICAgICAgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpOworICAgICAgICBMb2NhbGUgbG9jYWxlID0gZ2V0TG9jYWxlKHJlcXVlc3QpOworCisgICAgICAgIC8vIFNldCB1cCB0aGUgZm9ybSBiZWFuIGJhc2VkIG9uIHRoZSBjcmVhdGluZyBvciBlZGl0aW5nIHN0YXRlCisgICAgICAgIFN0cmluZyBvYmplY3ROYW1lID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoIm9iamVjdE5hbWUiKTsKKyAgICAgICAgU3RyaW5nIHJlc291cmNldHlwZSA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJyZXNvdXJjZXR5cGUiKTsKKyAgICAgICAgU3RyaW5nIHBhdGggPSByZXF1ZXN0LmdldFBhcmFtZXRlcigicGF0aCIpOworICAgICAgICBTdHJpbmcgaG9zdCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJob3N0Iik7CisgICAgICAgIFN0cmluZyBkb21haW4gPSByZXF1ZXN0LmdldFBhcmFtZXRlcigiZG9tYWluIik7CisKKyAgICAgICAgRGF0YVNvdXJjZUZvcm0gZGF0YVNvdXJjZUZvcm0gPSBuZXcgRGF0YVNvdXJjZUZvcm0oKTsKKyAgICAgICAgZGF0YVNvdXJjZUZvcm0uc2V0UmVzb3VyY2V0eXBlKHJlc291cmNldHlwZSk7CisgICAgICAgIGRhdGFTb3VyY2VGb3JtLnNldFBhdGgocGF0aCk7CisgICAgICAgIGRhdGFTb3VyY2VGb3JtLnNldEhvc3QoaG9zdCk7CisgICAgICAgIGRhdGFTb3VyY2VGb3JtLnNldERvbWFpbihkb21haW4pOworICAgICAgICBkYXRhU291cmNlRm9ybS5zZXRUeXBlKFJlc291cmNlVXRpbHMuREFUQVNPVVJDRV9DTEFTUyk7CisKKyAgICAgICAgaWYgKG9iamVjdE5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgZGF0YVNvdXJjZUZvcm0uc2V0Tm9kZUxhYmVsCisgICAgICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInJlc291cmNlcy5hY3Rpb25zLmRhdGFzcmMuY3JlYXRlIikpOworICAgICAgICAgICAgZGF0YVNvdXJjZUZvcm0uc2V0T2JqZWN0TmFtZShudWxsKTsKKyAgICAgICAgICAgIGRhdGFTb3VyY2VGb3JtLnNldEFjdGl2ZSgiNCIpOworICAgICAgICAgICAgZGF0YVNvdXJjZUZvcm0uc2V0SWRsZSgiMiIpOworICAgICAgICAgICAgZGF0YVNvdXJjZUZvcm0uc2V0V2FpdCgiNTAwMCIpOworICAgICAgICAgICAgZGF0YVNvdXJjZUZvcm0uc2V0VHlwZShSZXNvdXJjZVV0aWxzLkRBVEFTT1VSQ0VfQ0xBU1MpOworCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkYXRhU291cmNlRm9ybS5zZXROb2RlTGFiZWwKKyAgICAgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAicmVzb3VyY2VzLmFjdGlvbnMuZGF0YXNyYy5lZGl0IikpOworICAgICAgICAgICAgZGF0YVNvdXJjZUZvcm0uc2V0T2JqZWN0TmFtZShvYmplY3ROYW1lKTsKKworICAgICAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZSA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPSBuZXcgT2JqZWN0TmFtZShvYmplY3ROYW1lKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgPSAibmFtZSI7CisgICAgICAgICAgICAgICAgICAgIGRhdGFTb3VyY2VGb3JtLnNldEpuZGlOYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAoKFN0cmluZykgbXNlcnZlci5nZXRBdHRyaWJ1dGUob25hbWUsIGF0dHJpYnV0ZSkpOworICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgPSAidXJsIjsKKyAgICAgICAgICAgICAgICAgICAgZGF0YVNvdXJjZUZvcm0uc2V0VXJsCisgICAgICAgICAgICAgICAgICAgICAgICAoKFN0cmluZykgbXNlcnZlci5nZXRBdHRyaWJ1dGUob25hbWUsIGF0dHJpYnV0ZSkpOworICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgPSAiZHJpdmVyQ2xhc3NOYW1lIjsKKyAgICAgICAgICAgICAgICAgICAgZGF0YVNvdXJjZUZvcm0uc2V0RHJpdmVyQ2xhc3MKKyAgICAgICAgICAgICAgICAgICAgICAgICgoU3RyaW5nKSBtc2VydmVyLmdldEF0dHJpYnV0ZShvbmFtZSwgYXR0cmlidXRlKSk7CisgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJ1c2VybmFtZSI7CisgICAgICAgICAgICAgICAgICAgIGRhdGFTb3VyY2VGb3JtLnNldFVzZXJuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAoKFN0cmluZykgbXNlcnZlci5nZXRBdHRyaWJ1dGUob25hbWUsIGF0dHJpYnV0ZSkpOworICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgPSAicGFzc3dvcmQiOworICAgICAgICAgICAgICAgICAgICBkYXRhU291cmNlRm9ybS5zZXRQYXNzd29yZAorICAgICAgICAgICAgICAgICAgICAgICAgKChTdHJpbmcpIG1zZXJ2ZXIuZ2V0QXR0cmlidXRlKG9uYW1lLCBhdHRyaWJ1dGUpKTsKKyAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlID0gInZhbGlkYXRpb25RdWVyeSI7CisgICAgICAgICAgICAgICAgICAgIGRhdGFTb3VyY2VGb3JtLnNldFF1ZXJ5CisgICAgICAgICAgICAgICAgICAgICAgICAoKFN0cmluZykgbXNlcnZlci5nZXRBdHRyaWJ1dGUob25hbWUsIGF0dHJpYnV0ZSkpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEF0dHJpYnV0ZU5vdEZvdW5kRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGRpc3BseSBlbXB0eSBpZiBhdHRyaWJ1dGUgaXMgbm90IHNldCB5ZXQKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlID0gIm1heEFjdGl2ZSI7CisgICAgICAgICAgICAgICAgICAgIGRhdGFTb3VyY2VGb3JtLnNldEFjdGl2ZQorICAgICAgICAgICAgICAgICAgICAgICAgKChTdHJpbmcpIG1zZXJ2ZXIuZ2V0QXR0cmlidXRlKG9uYW1lLCBhdHRyaWJ1dGUpKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChBdHRyaWJ1dGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGlmIG1heEFjdGl2ZSBub3QgZGVmaW5lZCwgZGlzcGxheSBkZWZhdWx0IHZhbHVlCisgICAgICAgICAgICAgICAgICAgIGRhdGFTb3VyY2VGb3JtLnNldEFjdGl2ZSgiNCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgPSAibWF4SWRsZSI7CisgICAgICAgICAgICAgICAgICAgIGRhdGFTb3VyY2VGb3JtLnNldElkbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICgoU3RyaW5nKSBtc2VydmVyLmdldEF0dHJpYnV0ZShvbmFtZSwgYXR0cmlidXRlKSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoQXR0cmlidXRlTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBpZiBtYXhJZGxlIG5vdCBkZWZpbmVkLCBkaXNwbGF5IGRlZmF1bHQgdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgZGF0YVNvdXJjZUZvcm0uc2V0SWRsZSgiMiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgPSAibWF4V2FpdCI7CisgICAgICAgICAgICAgICAgICAgIGRhdGFTb3VyY2VGb3JtLnNldFdhaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICgoU3RyaW5nKSBtc2VydmVyLmdldEF0dHJpYnV0ZShvbmFtZSwgYXR0cmlidXRlKSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoQXR0cmlidXRlTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBpZiBtYXhXYWl0IG5vdCBkZWZpbmVkLCBkaXNwbGF5IGRlZmF1bHQgdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgZGF0YVNvdXJjZUZvcm0uc2V0V2FpdCgiNTAwMCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZworICAgICAgICAgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgInVzZXJzLmVycm9yLmF0dHJpYnV0ZS5nZXQiLCBhdHRyaWJ1dGUpLCBlKTsKKyAgICAgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAobG9jYWxlLCAidXNlcnMuZXJyb3IuYXR0cmlidXRlLmdldCIsIGF0dHJpYnV0ZSkpOworICAgICAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBTdGFzaCB0aGUgZm9ybSBiZWFuIGFuZCBmb3J3YXJkIHRvIHRoZSBkaXNwbGF5IHBhZ2UKKyAgICAgICAgc2F2ZVRva2VuKHJlcXVlc3QpOworICAgICAgICByZXF1ZXN0LnNldEF0dHJpYnV0ZSgiZGF0YVNvdXJjZUZvcm0iLCBkYXRhU291cmNlRm9ybSk7CisgICAgICAgIHJldHVybiAobWFwcGluZy5maW5kRm9yd2FyZCgiRGF0YVNvdXJjZSIpKTsKKworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZXNvdXJjZXMvU2V0VXBFbnZFbnRyeUFjdGlvbi5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3Jlc291cmNlcy9TZXRVcEVudkVudHJ5QWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTcxMjhlNgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZXNvdXJjZXMvU2V0VXBFbnZFbnRyeUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTU4IEBACisvKgorICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVzb3VyY2VzOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkxEZWNvZGVyOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuQXR0cmlidXRlOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlckZhY3Rvcnk7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5RdWVyeUV4cDsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LlF1ZXJ5OworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0SW5zdGFuY2U7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuSk1FeGNlcHRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhbkF0dHJpYnV0ZUluZm87CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhbk9wZXJhdGlvbkluZm87CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhbkluZm87CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkVycm9yczsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9ybTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9yd2FyZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy51dGlsLk1lc3NhZ2VSZXNvdXJjZXM7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uQXBwbGljYXRpb25TZXJ2bGV0OworCisKKy8qKgorICogPHA+SW1wbGVtZW50YXRpb24gb2YgPHN0cm9uZz5BY3Rpb248L3N0cm9uZz4gdGhhdCBzZXRzIHVwIGFuZCBzdGFzaGVzCisgKiBhIDxjb2RlPkVudkVudHJ5Rm9ybTwvY29kZT4gYmVhbiBpbiByZXF1ZXN0IHNjb3BlLiAgVGhlIGZvcm0gYmVhbiB3aWxsIGhhdmUKKyAqIGEgbnVsbCA8Y29kZT5vYmplY3ROYW1lPC9jb2RlPiBwcm9wZXJ0eSBpZiB0aGlzIGZvcm0gcmVwcmVzZW50cyBhIEVudkVudHJ5CisgKiBiZWluZyBhZGRlZCwgb3IgYSBub24tbnVsbCB2YWx1ZSBmb3IgYW4gZXhpc3RpbmcgRW52RW50cnkuPC9wPgorICoKKyAqIEBhdXRob3IgTWFudmVlbiBLYXVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICogQHNpbmNlIDQuMQorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBTZXRVcEVudkVudHJ5QWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgTUJlYW5TZXJ2ZXIgd2Ugd2lsbCBiZSBpbnRlcmFjdGluZyB3aXRoLgorICAgICAqLworICAgIHByaXZhdGUgTUJlYW5TZXJ2ZXIgbXNlcnZlciA9IG51bGw7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBzcGVjaWZpZWQgSFRUUCByZXF1ZXN0LCBhbmQgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIEhUVFAKKyAgICAgKiByZXNwb25zZSAob3IgZm9yd2FyZCB0byBhbm90aGVyIHdlYiBjb21wb25lbnQgdGhhdCB3aWxsIGNyZWF0ZSBpdCkuCisgICAgICogUmV0dXJuIGFuIDxjb2RlPkFjdGlvbkZvcndhcmQ8L2NvZGU+IGluc3RhbmNlIGRlc2NyaWJpbmcgd2hlcmUgYW5kIGhvdworICAgICAqIGNvbnRyb2wgc2hvdWxkIGJlIGZvcndhcmRlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHJlc3BvbnNlIGhhcworICAgICAqIGFscmVhZHkgYmVlbiBjb21wbGV0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgQWN0aW9uTWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIGFjdGlvbkZvcm0gVGhlIG9wdGlvbmFsIEFjdGlvbkZvcm0gYmVhbiBmb3IgdGhpcyByZXF1ZXN0IChpZiBhbnkpCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIEhUVFAgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgSFRUUCByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXhjZXB0aW9uIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBBY3Rpb25Gb3J3YXJkIHBlcmZvcm0oQWN0aW9uTWFwcGluZyBtYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uRm9ybSBmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIExvb2sgdXAgdGhlIGNvbXBvbmVudHMgd2Ugd2lsbCBiZSB1c2luZyBhcyBuZWVkZWQKKyAgICAgICAgaWYgKG1zZXJ2ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgbXNlcnZlciA9ICgoQXBwbGljYXRpb25TZXJ2bGV0KSBnZXRTZXJ2bGV0KCkpLmdldFNlcnZlcigpOworICAgICAgICB9CisgICAgICAgIE1lc3NhZ2VSZXNvdXJjZXMgcmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VzKHJlcXVlc3QpOworICAgICAgICBIdHRwU2Vzc2lvbiBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uKCk7CisgICAgICAgIExvY2FsZSBsb2NhbGUgPSBnZXRMb2NhbGUocmVxdWVzdCk7CisKKyAgICAgICAgLy8gU2V0IHVwIHRoZSBmb3JtIGJlYW4gYmFzZWQgb24gdGhlIGNyZWF0aW5nIG9yIGVkaXRpbmcgc3RhdGUKKyAgICAgICAgU3RyaW5nIG9iamVjdE5hbWUgPSByZXF1ZXN0LmdldFBhcmFtZXRlcigib2JqZWN0TmFtZSIpOworICAgICAgICBTdHJpbmcgcmVzb3VyY2V0eXBlID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoInJlc291cmNldHlwZSIpOworICAgICAgICBTdHJpbmcgcGF0aCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJwYXRoIik7CisgICAgICAgIFN0cmluZyBob3N0ID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoImhvc3QiKTsKKyAgICAgICAgU3RyaW5nIGRvbWFpbiA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJkb21haW4iKTsKKyAgICAgICAgCisgICAgICAgIEVudkVudHJ5Rm9ybSBlbnZFbnRyeUZvcm0gPSBuZXcgRW52RW50cnlGb3JtKCk7ICAgICAgICAgICAKKyAgICAgICAgZW52RW50cnlGb3JtLnNldFJlc291cmNldHlwZShyZXNvdXJjZXR5cGUpOworICAgICAgICBlbnZFbnRyeUZvcm0uc2V0UGF0aChwYXRoKTsKKyAgICAgICAgZW52RW50cnlGb3JtLnNldEhvc3QoaG9zdCk7CisgICAgICAgIGVudkVudHJ5Rm9ybS5zZXREb21haW4oZG9tYWluKTsKKyAgICAgICAgaWYgKG9iamVjdE5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgZW52RW50cnlGb3JtLnNldE5vZGVMYWJlbAorICAgICAgICAgICAgICAgIChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJyZXNvdXJjZXMuYWN0aW9ucy5lbnYuY3JlYXRlIikpOworICAgICAgICAgICAgZW52RW50cnlGb3JtLnNldE9iamVjdE5hbWUobnVsbCk7IAorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZW52RW50cnlGb3JtLnNldE5vZGVMYWJlbAorICAgICAgICAgICAgICAgIChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJyZXNvdXJjZXMuYWN0aW9ucy5lbnYuZWRpdCIpKTsKKyAgICAgICAgICAgIGVudkVudHJ5Rm9ybS5zZXRPYmplY3ROYW1lKG9iamVjdE5hbWUpOworICAgICAgICAgICAgCisgICAgICAgICAgICBTdHJpbmcgYXR0cmlidXRlID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9IG5ldyBPYmplY3ROYW1lKG9iamVjdE5hbWUpOworICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJuYW1lIjsKKyAgICAgICAgICAgICAgICBlbnZFbnRyeUZvcm0uc2V0TmFtZQorICAgICAgICAgICAgICAgICAgICAoKFN0cmluZykgbXNlcnZlci5nZXRBdHRyaWJ1dGUob25hbWUsIGF0dHJpYnV0ZSkpOworICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJ0eXBlIjsKKyAgICAgICAgICAgICAgICBlbnZFbnRyeUZvcm0uc2V0RW50cnlUeXBlCisgICAgICAgICAgICAgICAgICAgICgoU3RyaW5nKSBtc2VydmVyLmdldEF0dHJpYnV0ZShvbmFtZSwgYXR0cmlidXRlKSk7CisgICAgICAgICAgICAgICAgYXR0cmlidXRlID0gInZhbHVlIjsKKyAgICAgICAgICAgICAgICBlbnZFbnRyeUZvcm0uc2V0VmFsdWUKKyAgICAgICAgICAgICAgICAgICAgKChTdHJpbmcpIG1zZXJ2ZXIuZ2V0QXR0cmlidXRlKG9uYW1lLCBhdHRyaWJ1dGUpKTsKKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgPSAib3ZlcnJpZGUiOworICAgICAgICAgICAgICAgIGVudkVudHJ5Rm9ybS5zZXRPdmVycmlkZSgKKyAgICAgICAgICAgICAgICAgICAgKChCb29sZWFuKSBtc2VydmVyLmdldEF0dHJpYnV0ZShvbmFtZSwgYXR0cmlidXRlKSkuYm9vbGVhblZhbHVlKCkpOworICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJkZXNjcmlwdGlvbiI7CisgICAgICAgICAgICAgICAgZW52RW50cnlGb3JtLnNldERlc2NyaXB0aW9uCisgICAgICAgICAgICAgICAgICAgICgoU3RyaW5nKSBtc2VydmVyLmdldEF0dHJpYnV0ZShvbmFtZSwgYXR0cmlidXRlKSk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ1c2Vycy5lcnJvci5hdHRyaWJ1dGUuZ2V0IiwgYXR0cmlidXRlKSwgZSk7CisgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlCisgICAgICAgICAgICAgICAgICAgICAgICAgKGxvY2FsZSwgInVzZXJzLmVycm9yLmF0dHJpYnV0ZS5nZXQiLCBhdHRyaWJ1dGUpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICAgICAgfSAKKyAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgIC8vIFN0YXNoIHRoZSBmb3JtIGJlYW4gYW5kIGZvcndhcmQgdG8gdGhlIGRpc3BsYXkgcGFnZQorICAgICAgICBzYXZlVG9rZW4ocmVxdWVzdCk7CisgICAgICAgIHJlcXVlc3Quc2V0QXR0cmlidXRlKCJlbnZFbnRyeUZvcm0iLCBlbnZFbnRyeUZvcm0pOworICAgICAgICByZXR1cm4gKG1hcHBpbmcuZmluZEZvcndhcmQoIkVudkVudHJ5IikpOworCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3Jlc291cmNlcy9TZXRVcE1haWxTZXNzaW9uQWN0aW9uLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVzb3VyY2VzL1NldFVwTWFpbFNlc3Npb25BY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDhjNDJhCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3Jlc291cmNlcy9TZXRVcE1haWxTZXNzaW9uQWN0aW9uLmphdmEKQEAgLTAsMCArMSwxNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTERlY29kZXI7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5BdHRyaWJ1dGU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyRmFjdG9yeTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LlF1ZXJ5RXhwOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuUXVlcnk7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3RJbnN0YW5jZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5KTUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuQXR0cmlidXRlSW5mbzsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuT3BlcmF0aW9uSW5mbzsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuSW5mbzsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRXJyb3JzOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3J3YXJkOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLnV0aWwuTWVzc2FnZVJlc291cmNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5BcHBsaWNhdGlvblNlcnZsZXQ7CisKKworLyoqCisgKiA8cD5JbXBsZW1lbnRhdGlvbiBvZiA8c3Ryb25nPkFjdGlvbjwvc3Ryb25nPiB0aGF0IHNldHMgdXAgYW5kIHN0YXNoZXMKKyAqIGEgPGNvZGU+TWFpbFNlc3Npb25Gb3JtPC9jb2RlPiBiZWFuIGluIHJlcXVlc3Qgc2NvcGUuICBUaGUgZm9ybSBiZWFuIHdpbGwgaGF2ZQorICogYSBudWxsIDxjb2RlPm9iamVjdE5hbWU8L2NvZGU+IHByb3BlcnR5IGlmIHRoaXMgZm9ybSByZXByZXNlbnRzIGEgTWFpbFNlc3Npb24KKyAqIGJlaW5nIGFkZGVkLCBvciBhIG5vbi1udWxsIHZhbHVlIGZvciBhbiBleGlzdGluZyBNYWlsU2Vzc2lvbi48L3A+CisgKgorICogQGF1dGhvciBBbXkgUm9oCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICogQHNpbmNlIDQuMQorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBTZXRVcE1haWxTZXNzaW9uQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgTUJlYW5TZXJ2ZXIgd2Ugd2lsbCBiZSBpbnRlcmFjdGluZyB3aXRoLgorICAgICAqLworICAgIHByaXZhdGUgTUJlYW5TZXJ2ZXIgbXNlcnZlciA9IG51bGw7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBzcGVjaWZpZWQgSFRUUCByZXF1ZXN0LCBhbmQgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIEhUVFAKKyAgICAgKiByZXNwb25zZSAob3IgZm9yd2FyZCB0byBhbm90aGVyIHdlYiBjb21wb25lbnQgdGhhdCB3aWxsIGNyZWF0ZSBpdCkuCisgICAgICogUmV0dXJuIGFuIDxjb2RlPkFjdGlvbkZvcndhcmQ8L2NvZGU+IGluc3RhbmNlIGRlc2NyaWJpbmcgd2hlcmUgYW5kIGhvdworICAgICAqIGNvbnRyb2wgc2hvdWxkIGJlIGZvcndhcmRlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHJlc3BvbnNlIGhhcworICAgICAqIGFscmVhZHkgYmVlbiBjb21wbGV0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgQWN0aW9uTWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIGFjdGlvbkZvcm0gVGhlIG9wdGlvbmFsIEFjdGlvbkZvcm0gYmVhbiBmb3IgdGhpcyByZXF1ZXN0IChpZiBhbnkpCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIEhUVFAgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgSFRUUCByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXhjZXB0aW9uIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBBY3Rpb25Gb3J3YXJkIHBlcmZvcm0oQWN0aW9uTWFwcGluZyBtYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uRm9ybSBmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIExvb2sgdXAgdGhlIGNvbXBvbmVudHMgd2Ugd2lsbCBiZSB1c2luZyBhcyBuZWVkZWQKKyAgICAgICAgaWYgKG1zZXJ2ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgbXNlcnZlciA9ICgoQXBwbGljYXRpb25TZXJ2bGV0KSBnZXRTZXJ2bGV0KCkpLmdldFNlcnZlcigpOworICAgICAgICB9CisgICAgICAgIE1lc3NhZ2VSZXNvdXJjZXMgcmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VzKHJlcXVlc3QpOworICAgICAgICBIdHRwU2Vzc2lvbiBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uKCk7CisgICAgICAgIExvY2FsZSBsb2NhbGUgPSBnZXRMb2NhbGUocmVxdWVzdCk7CisKKyAgICAgICAgLy8gU2V0IHVwIHRoZSBmb3JtIGJlYW4gYmFzZWQgb24gdGhlIGNyZWF0aW5nIG9yIGVkaXRpbmcgc3RhdGUKKyAgICAgICAgU3RyaW5nIG9iamVjdE5hbWUgPSByZXF1ZXN0LmdldFBhcmFtZXRlcigib2JqZWN0TmFtZSIpOworICAgICAgICBTdHJpbmcgcmVzb3VyY2V0eXBlID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoInJlc291cmNldHlwZSIpOworICAgICAgICBTdHJpbmcgcGF0aCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJwYXRoIik7CisgICAgICAgIFN0cmluZyBob3N0ID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoImhvc3QiKTsKKyAgICAgICAgU3RyaW5nIGRvbWFpbiA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJkb21haW4iKTsKKyAgICAgICAgCisgICAgICAgIE1haWxTZXNzaW9uRm9ybSBtYWlsU2Vzc2lvbkZvcm0gPSBuZXcgTWFpbFNlc3Npb25Gb3JtKCk7ICAgICAgIAorICAgICAgICBtYWlsU2Vzc2lvbkZvcm0uc2V0UmVzb3VyY2V0eXBlKHJlc291cmNldHlwZSk7CisgICAgICAgIG1haWxTZXNzaW9uRm9ybS5zZXRQYXRoKHBhdGgpOworICAgICAgICBtYWlsU2Vzc2lvbkZvcm0uc2V0SG9zdChob3N0KTsKKyAgICAgICAgbWFpbFNlc3Npb25Gb3JtLnNldERvbWFpbihkb21haW4pOworICAgICAgICBtYWlsU2Vzc2lvbkZvcm0uc2V0VHlwZShSZXNvdXJjZVV0aWxzLk1BSUxTRVNTSU9OX0NMQVNTKTsKKworICAgICAgICBpZiAob2JqZWN0TmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICBtYWlsU2Vzc2lvbkZvcm0uc2V0Tm9kZUxhYmVsCisgICAgICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInJlc291cmNlcy5hY3Rpb25zLm1haWxzZXNzaW9uLmNyZWF0ZSIpKTsKKyAgICAgICAgICAgIG1haWxTZXNzaW9uRm9ybS5zZXRPYmplY3ROYW1lKG51bGwpOworICAgICAgICAgICAgbWFpbFNlc3Npb25Gb3JtLnNldFR5cGUoUmVzb3VyY2VVdGlscy5NQUlMU0VTU0lPTl9DTEFTUyk7CisgICAgICAgICAgICAKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1haWxTZXNzaW9uRm9ybS5zZXROb2RlTGFiZWwKKyAgICAgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAicmVzb3VyY2VzLmFjdGlvbnMubWFpbHNlc3Npb24uZWRpdCIpKTsKKyAgICAgICAgICAgIG1haWxTZXNzaW9uRm9ybS5zZXRPYmplY3ROYW1lKG9iamVjdE5hbWUpOworICAgICAgICAgICAgCisgICAgICAgICAgICBTdHJpbmcgYXR0cmlidXRlID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9IG5ldyBPYmplY3ROYW1lKG9iamVjdE5hbWUpOworICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJuYW1lIjsKKyAgICAgICAgICAgICAgICBtYWlsU2Vzc2lvbkZvcm0uc2V0TmFtZQorICAgICAgICAgICAgICAgICAgICAoKFN0cmluZykgbXNlcnZlci5nZXRBdHRyaWJ1dGUob25hbWUsIGF0dHJpYnV0ZSkpOworICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJtYWlsLnNtdHAuaG9zdCI7CisgICAgICAgICAgICAgICAgbWFpbFNlc3Npb25Gb3JtLnNldE1haWxob3N0CisgICAgICAgICAgICAgICAgICAgICgoU3RyaW5nKSBtc2VydmVyLmdldEF0dHJpYnV0ZShvbmFtZSwgYXR0cmlidXRlKSk7CisgICAgICAgIAorICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nCisgICAgICAgICAgICAgICAgICAgIChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAidXNlcnMuZXJyb3IuYXR0cmlidXRlLmdldCIsIGF0dHJpYnV0ZSksIGUpOworICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZQorICAgICAgICAgICAgICAgICAgICAgICAgIChsb2NhbGUsICJ1c2Vycy5lcnJvci5hdHRyaWJ1dGUuZ2V0IiwgYXR0cmlidXRlKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAvLyBTdGFzaCB0aGUgZm9ybSBiZWFuIGFuZCBmb3J3YXJkIHRvIHRoZSBkaXNwbGF5IHBhZ2UKKyAgICAgICAgc2F2ZVRva2VuKHJlcXVlc3QpOworICAgICAgICByZXF1ZXN0LnNldEF0dHJpYnV0ZSgibWFpbFNlc3Npb25Gb3JtIiwgbWFpbFNlc3Npb25Gb3JtKTsKKyAgICAgICAgcmV0dXJuIChtYXBwaW5nLmZpbmRGb3J3YXJkKCJNYWlsU2Vzc2lvbiIpKTsKKworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZXNvdXJjZXMvU2V0VXBSZXNvdXJjZUxpbmtBY3Rpb24uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZXNvdXJjZXMvU2V0VXBSZXNvdXJjZUxpbmtBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjY3NWNiCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3Jlc291cmNlcy9TZXRVcFJlc291cmNlTGlua0FjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTU1IEBACisvKgorICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVzb3VyY2VzOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkxEZWNvZGVyOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuQXR0cmlidXRlOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlckZhY3Rvcnk7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5RdWVyeUV4cDsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LlF1ZXJ5OworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0SW5zdGFuY2U7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuSk1FeGNlcHRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhbkF0dHJpYnV0ZUluZm87CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhbk9wZXJhdGlvbkluZm87CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhbkluZm87CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkVycm9yczsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9ybTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9yd2FyZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy51dGlsLk1lc3NhZ2VSZXNvdXJjZXM7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uQXBwbGljYXRpb25TZXJ2bGV0OworCisKKy8qKgorICogPHA+SW1wbGVtZW50YXRpb24gb2YgPHN0cm9uZz5BY3Rpb248L3N0cm9uZz4gdGhhdCBzZXRzIHVwIGFuZCBzdGFzaGVzCisgKiBhIDxjb2RlPlJlc291cmNlTGlua0Zvcm08L2NvZGU+IGJlYW4gaW4gcmVxdWVzdCBzY29wZS4gIFRoZSBmb3JtIGJlYW4gd2lsbCBoYXZlCisgKiBhIG51bGwgPGNvZGU+b2JqZWN0TmFtZTwvY29kZT4gcHJvcGVydHkgaWYgdGhpcyBmb3JtIHJlcHJlc2VudHMgYSBSZXNvdXJjZUxpbmsKKyAqIGJlaW5nIGFkZGVkLCBvciBhIG5vbi1udWxsIHZhbHVlIGZvciBhbiBleGlzdGluZyBSZXNvdXJjZUxpbmsuPC9wPgorICoKKyAqIEBhdXRob3IgQW15IFJvaAorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqIEBzaW5jZSA0LjEKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgU2V0VXBSZXNvdXJjZUxpbmtBY3Rpb24gZXh0ZW5kcyBBY3Rpb24geworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBNQmVhblNlcnZlciB3ZSB3aWxsIGJlIGludGVyYWN0aW5nIHdpdGguCisgICAgICovCisgICAgcHJpdmF0ZSBNQmVhblNlcnZlciBtc2VydmVyID0gbnVsbDsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIHNwZWNpZmllZCBIVFRQIHJlcXVlc3QsIGFuZCBjcmVhdGUgdGhlIGNvcnJlc3BvbmRpbmcgSFRUUAorICAgICAqIHJlc3BvbnNlIChvciBmb3J3YXJkIHRvIGFub3RoZXIgd2ViIGNvbXBvbmVudCB0aGF0IHdpbGwgY3JlYXRlIGl0KS4KKyAgICAgKiBSZXR1cm4gYW4gPGNvZGU+QWN0aW9uRm9yd2FyZDwvY29kZT4gaW5zdGFuY2UgZGVzY3JpYmluZyB3aGVyZSBhbmQgaG93CisgICAgICogY29udHJvbCBzaG91bGQgYmUgZm9yd2FyZGVkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcmVzcG9uc2UgaGFzCisgICAgICogYWxyZWFkeSBiZWVuIGNvbXBsZXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBBY3Rpb25NYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gYWN0aW9uRm9ybSBUaGUgb3B0aW9uYWwgQWN0aW9uRm9ybSBiZWFuIGZvciB0aGlzIHJlcXVlc3QgKGlmIGFueSkKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgSFRUUCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBIVFRQIHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBleGNlcHRpb24gb2NjdXJzCisgICAgICovCisgICAgcHVibGljIEFjdGlvbkZvcndhcmQgcGVyZm9ybShBY3Rpb25NYXBwaW5nIG1hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb25Gb3JtIGZvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gTG9vayB1cCB0aGUgY29tcG9uZW50cyB3ZSB3aWxsIGJlIHVzaW5nIGFzIG5lZWRlZAorICAgICAgICBpZiAobXNlcnZlciA9PSBudWxsKSB7CisgICAgICAgICAgICBtc2VydmVyID0gKChBcHBsaWNhdGlvblNlcnZsZXQpIGdldFNlcnZsZXQoKSkuZ2V0U2VydmVyKCk7CisgICAgICAgIH0KKyAgICAgICAgTWVzc2FnZVJlc291cmNlcyByZXNvdXJjZXMgPSBnZXRSZXNvdXJjZXMocmVxdWVzdCk7CisgICAgICAgIEh0dHBTZXNzaW9uIHNlc3Npb24gPSByZXF1ZXN0LmdldFNlc3Npb24oKTsKKyAgICAgICAgTG9jYWxlIGxvY2FsZSA9IGdldExvY2FsZShyZXF1ZXN0KTsKKyAgICAgICAgCisgICAgICAgIC8vIFNldCB1cCB0aGUgZm9ybSBiZWFuIGJhc2VkIG9uIHRoZSBjcmVhdGluZyBvciBlZGl0aW5nIHN0YXRlCisgICAgICAgIFN0cmluZyBvYmplY3ROYW1lID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoIm9iamVjdE5hbWUiKTsKKyAgICAgICAgU3RyaW5nIHJlc291cmNldHlwZSA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJyZXNvdXJjZXR5cGUiKTsKKyAgICAgICAgU3RyaW5nIHBhdGggPSByZXF1ZXN0LmdldFBhcmFtZXRlcigicGF0aCIpOworICAgICAgICBTdHJpbmcgaG9zdCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJob3N0Iik7CisgICAgICAgIFN0cmluZyBkb21haW4gPSByZXF1ZXN0LmdldFBhcmFtZXRlcigiZG9tYWluIik7CisgICAgICAgIAorICAgICAgICBSZXNvdXJjZUxpbmtGb3JtIHJlc291cmNlTGlua0Zvcm0gPSBuZXcgUmVzb3VyY2VMaW5rRm9ybSgpOyAgICAgICAKKyAgICAgICAgcmVzb3VyY2VMaW5rRm9ybS5zZXRSZXNvdXJjZXR5cGUocmVzb3VyY2V0eXBlKTsKKyAgICAgICAgcmVzb3VyY2VMaW5rRm9ybS5zZXRQYXRoKHBhdGgpOworICAgICAgICByZXNvdXJjZUxpbmtGb3JtLnNldEhvc3QoaG9zdCk7CisgICAgICAgIHJlc291cmNlTGlua0Zvcm0uc2V0RG9tYWluKGRvbWFpbik7CisgICAgICAgICAgICAKKyAgICAgICAgaWYgKG9iamVjdE5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgcmVzb3VyY2VMaW5rRm9ybS5zZXROb2RlTGFiZWwKKyAgICAgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAicmVzb3VyY2VzLmFjdGlvbnMucmVzb3VyY2Vsay5jcmVhdGUiKSk7CisgICAgICAgICAgICByZXNvdXJjZUxpbmtGb3JtLnNldE9iamVjdE5hbWUobnVsbCk7CisgICAgICAgICAgICAKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlc291cmNlTGlua0Zvcm0uc2V0Tm9kZUxhYmVsCisgICAgICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInJlc291cmNlcy5hY3Rpb25zLnJlc291cmNlbGsuZWRpdCIpKTsKKyAgICAgICAgICAgIHJlc291cmNlTGlua0Zvcm0uc2V0T2JqZWN0TmFtZShvYmplY3ROYW1lKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZSA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPSBuZXcgT2JqZWN0TmFtZShvYmplY3ROYW1lKTsKKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgPSAibmFtZSI7CisgICAgICAgICAgICAgICAgcmVzb3VyY2VMaW5rRm9ybS5zZXROYW1lCisgICAgICAgICAgICAgICAgICAgICgoU3RyaW5nKSBtc2VydmVyLmdldEF0dHJpYnV0ZShvbmFtZSwgYXR0cmlidXRlKSk7CisgICAgICAgICAgICAgICAgYXR0cmlidXRlID0gImdsb2JhbCI7CisgICAgICAgICAgICAgICAgcmVzb3VyY2VMaW5rRm9ybS5zZXRHbG9iYWwKKyAgICAgICAgICAgICAgICAgICAgKChTdHJpbmcpIG1zZXJ2ZXIuZ2V0QXR0cmlidXRlKG9uYW1lLCBhdHRyaWJ1dGUpKTsKKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgPSAidHlwZSI7CisgICAgICAgICAgICAgICAgcmVzb3VyY2VMaW5rRm9ybS5zZXRUeXBlCisgICAgICAgICAgICAgICAgICAgICgoU3RyaW5nKSBtc2VydmVyLmdldEF0dHJpYnV0ZShvbmFtZSwgYXR0cmlidXRlKSk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ1c2Vycy5lcnJvci5hdHRyaWJ1dGUuZ2V0IiwgYXR0cmlidXRlKSwgZSk7CisgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlCisgICAgICAgICAgICAgICAgICAgICAgICAgKGxvY2FsZSwgInVzZXJzLmVycm9yLmF0dHJpYnV0ZS5nZXQiLCBhdHRyaWJ1dGUpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICAgICAgfSAKKyAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgIC8vIFN0YXNoIHRoZSBmb3JtIGJlYW4gYW5kIGZvcndhcmQgdG8gdGhlIGRpc3BsYXkgcGFnZQorICAgICAgICBzYXZlVG9rZW4ocmVxdWVzdCk7CisgICAgICAgIHJlcXVlc3Quc2V0QXR0cmlidXRlKCJyZXNvdXJjZUxpbmtGb3JtIiwgcmVzb3VyY2VMaW5rRm9ybSk7CisgICAgICAgIHJldHVybiAobWFwcGluZy5maW5kRm9yd2FyZCgiUmVzb3VyY2VMaW5rIikpOworCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3Jlc291cmNlcy9TZXRVcFVzZXJEYXRhYmFzZUFjdGlvbi5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3Jlc291cmNlcy9TZXRVcFVzZXJEYXRhYmFzZUFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiNjU0YTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVzb3VyY2VzL1NldFVwVXNlckRhdGFiYXNlQWN0aW9uLmphdmEKQEAgLTAsMCArMSwxNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTERlY29kZXI7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5BdHRyaWJ1dGU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyRmFjdG9yeTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LlF1ZXJ5RXhwOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuUXVlcnk7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3RJbnN0YW5jZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5KTUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuQXR0cmlidXRlSW5mbzsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuT3BlcmF0aW9uSW5mbzsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuSW5mbzsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRXJyb3JzOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3J3YXJkOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLnV0aWwuTWVzc2FnZVJlc291cmNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5BcHBsaWNhdGlvblNlcnZsZXQ7CisKKworLyoqCisgKiA8cD5JbXBsZW1lbnRhdGlvbiBvZiA8c3Ryb25nPkFjdGlvbjwvc3Ryb25nPiB0aGF0IHNldHMgdXAgYW5kIHN0YXNoZXMKKyAqIGEgPGNvZGU+VXNlckRhdGFiYXNlRm9ybTwvY29kZT4gYmVhbiBpbiByZXF1ZXN0IHNjb3BlLiAgVGhlIGZvcm0gYmVhbiB3aWxsIGhhdmUKKyAqIGEgbnVsbCA8Y29kZT5vYmplY3ROYW1lPC9jb2RlPiBwcm9wZXJ0eSBpZiB0aGlzIGZvcm0gcmVwcmVzZW50cyBhIFVzZXJEYXRhYmFzZQorICogYmVpbmcgYWRkZWQsIG9yIGEgbm9uLW51bGwgdmFsdWUgZm9yIGFuIGV4aXN0aW5nIFVzZXJEYXRhYmFzZS48L3A+CisgKgorICogQGF1dGhvciBNYW52ZWVuIEthdXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKiBAc2luY2UgNC4xCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIFNldFVwVXNlckRhdGFiYXNlQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgTUJlYW5TZXJ2ZXIgd2Ugd2lsbCBiZSBpbnRlcmFjdGluZyB3aXRoLgorICAgICAqLworICAgIHByaXZhdGUgTUJlYW5TZXJ2ZXIgbXNlcnZlciA9IG51bGw7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBzcGVjaWZpZWQgSFRUUCByZXF1ZXN0LCBhbmQgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIEhUVFAKKyAgICAgKiByZXNwb25zZSAob3IgZm9yd2FyZCB0byBhbm90aGVyIHdlYiBjb21wb25lbnQgdGhhdCB3aWxsIGNyZWF0ZSBpdCkuCisgICAgICogUmV0dXJuIGFuIDxjb2RlPkFjdGlvbkZvcndhcmQ8L2NvZGU+IGluc3RhbmNlIGRlc2NyaWJpbmcgd2hlcmUgYW5kIGhvdworICAgICAqIGNvbnRyb2wgc2hvdWxkIGJlIGZvcndhcmRlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHJlc3BvbnNlIGhhcworICAgICAqIGFscmVhZHkgYmVlbiBjb21wbGV0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgQWN0aW9uTWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIGFjdGlvbkZvcm0gVGhlIG9wdGlvbmFsIEFjdGlvbkZvcm0gYmVhbiBmb3IgdGhpcyByZXF1ZXN0IChpZiBhbnkpCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIEhUVFAgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgSFRUUCByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXhjZXB0aW9uIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBBY3Rpb25Gb3J3YXJkIHBlcmZvcm0oQWN0aW9uTWFwcGluZyBtYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uRm9ybSBmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIExvb2sgdXAgdGhlIGNvbXBvbmVudHMgd2Ugd2lsbCBiZSB1c2luZyBhcyBuZWVkZWQKKyAgICAgICAgaWYgKG1zZXJ2ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgbXNlcnZlciA9ICgoQXBwbGljYXRpb25TZXJ2bGV0KSBnZXRTZXJ2bGV0KCkpLmdldFNlcnZlcigpOworICAgICAgICB9CisgICAgICAgIE1lc3NhZ2VSZXNvdXJjZXMgcmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VzKHJlcXVlc3QpOworICAgICAgICBIdHRwU2Vzc2lvbiBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uKCk7CisgICAgICAgIExvY2FsZSBsb2NhbGUgPSBnZXRMb2NhbGUocmVxdWVzdCk7CisKKyAgICAgICAgLy8gU2V0IHVwIHRoZSBmb3JtIGJlYW4gYmFzZWQgb24gdGhlIGNyZWF0aW5nIG9yIGVkaXRpbmcgc3RhdGUKKyAgICAgICAgU3RyaW5nIG9iamVjdE5hbWUgPSByZXF1ZXN0LmdldFBhcmFtZXRlcigib2JqZWN0TmFtZSIpOworICAgICAgICBTdHJpbmcgZG9tYWluID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoImRvbWFpbiIpOworICAgICAgICAKKyAgICAgICAgVXNlckRhdGFiYXNlRm9ybSB1c2VyRGF0YWJhc2VGb3JtID0gbmV3IFVzZXJEYXRhYmFzZUZvcm0oKTsKKyAgICAgICAgdXNlckRhdGFiYXNlRm9ybS5zZXRGYWN0b3J5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNhdmVVc2VyRGF0YWJhc2VBY3Rpb24uVVNFUkRCX0ZBQ1RPUlkpOworICAgICAgICB1c2VyRGF0YWJhc2VGb3JtLnNldFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUmVzb3VyY2VVdGlscy5VU0VSREJfQ0xBU1MpOyAgCisgICAgICAgIHVzZXJEYXRhYmFzZUZvcm0uc2V0RG9tYWluKGRvbWFpbik7ICAgICAgICAgICAgICAgCisKKyAgICAgICAgaWYgKG9iamVjdE5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgdXNlckRhdGFiYXNlRm9ybS5zZXROb2RlTGFiZWwKKyAgICAgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAicmVzb3VyY2VzLmFjdGlvbnMudXNlcmRiLmNyZWF0ZSIpKTsKKyAgICAgICAgICAgIHVzZXJEYXRhYmFzZUZvcm0uc2V0T2JqZWN0TmFtZShudWxsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHVzZXJEYXRhYmFzZUZvcm0uc2V0Tm9kZUxhYmVsCisgICAgICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInJlc291cmNlcy5hY3Rpb25zLnVzZXJkYi5lZGl0IikpOworICAgICAgICAgICAgdXNlckRhdGFiYXNlRm9ybS5zZXRPYmplY3ROYW1lKG9iamVjdE5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBTdHJpbmcgYXR0cmlidXRlID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9IG5ldyBPYmplY3ROYW1lKG9iamVjdE5hbWUpOworICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJuYW1lIjsKKyAgICAgICAgICAgICAgICB1c2VyRGF0YWJhc2VGb3JtLnNldE5hbWUKKyAgICAgICAgICAgICAgICAgICAgKChTdHJpbmcpIG1zZXJ2ZXIuZ2V0QXR0cmlidXRlKG9uYW1lLCBhdHRyaWJ1dGUpKTsKKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgPSAicGF0aG5hbWUiOworICAgICAgICAgICAgICAgIHVzZXJEYXRhYmFzZUZvcm0uc2V0UGF0aAorICAgICAgICAgICAgICAgICAgICAoKFN0cmluZykgbXNlcnZlci5nZXRBdHRyaWJ1dGUob25hbWUsIGF0dHJpYnV0ZSkpOworICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJkZXNjcmlwdGlvbiI7CisgICAgICAgICAgICAgICAgdXNlckRhdGFiYXNlRm9ybS5zZXREZXNjcmlwdGlvbgorICAgICAgICAgICAgICAgICAgICAoKFN0cmluZykgbXNlcnZlci5nZXRBdHRyaWJ1dGUob25hbWUsIGF0dHJpYnV0ZSkpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nCisgICAgICAgICAgICAgICAgICAgIChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAidXNlcnMuZXJyb3IuYXR0cmlidXRlLmdldCIsIGF0dHJpYnV0ZSksIGUpOworICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZQorICAgICAgICAgICAgICAgICAgICAgICAgIChsb2NhbGUsICJ1c2Vycy5lcnJvci5hdHRyaWJ1dGUuZ2V0IiwgYXR0cmlidXRlKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAvLyBTdGFzaCB0aGUgZm9ybSBiZWFuIGFuZCBmb3J3YXJkIHRvIHRoZSBkaXNwbGF5IHBhZ2UKKyAgICAgICAgc2F2ZVRva2VuKHJlcXVlc3QpOworICAgICAgICByZXF1ZXN0LnNldEF0dHJpYnV0ZSgidXNlckRhdGFiYXNlRm9ybSIsIHVzZXJEYXRhYmFzZUZvcm0pOworICAgICAgICByZXR1cm4gKG1hcHBpbmcuZmluZEZvcndhcmQoIlVzZXJEYXRhYmFzZSIpKTsKKworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZXNvdXJjZXMvVXNlckRhdGFiYXNlRm9ybS5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3Jlc291cmNlcy9Vc2VyRGF0YWJhc2VGb3JtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk1MDZlYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9yZXNvdXJjZXMvVXNlckRhdGFiYXNlRm9ybS5qYXZhCkBAIC0wLDAgKzEsMjA0IEBACisvKgorICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVzb3VyY2VzOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkVycm9yOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25FcnJvcnM7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uTGFiZWxWYWx1ZUJlYW47CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKKworLyoqCisgKiBGb3JtIGJlYW4gZm9yIHRoZSBpbmRpdmlkdWFsIHVzZXIgZGF0YWJhc2UgcGFnZS4KKyAqCisgKiBAYXV0aG9yIE1hbnZlZW4gS2F1cgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqIEBzaW5jZSA0LjEKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgVXNlckRhdGFiYXNlRm9ybSBleHRlbmRzIEJhc2VGb3JtIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisgICAgLyoqCisgICAgICogVGhlIGRvbWFpbiBvZiB0aGlzIGRhdGEgc291cmNlLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGRvbWFpbiA9IG51bGw7CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBkb21haW4gb2YgdGhlIGRhdGEgc291cmNlIHRoaXMgYmVhbiByZWZlcnMgdG8uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXREb21haW4oKSB7CisgICAgICAgIHJldHVybiB0aGlzLmRvbWFpbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGRvbWFpbiBvZiB0aGUgZGF0YSBzb3VyY2UgdGhpcyBiZWFuIHJlZmVycyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREb21haW4oU3RyaW5nIGRvbWFpbikgeworICAgICAgICB0aGlzLmRvbWFpbiA9IGRvbWFpbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYXNzb2NpYXRlZCBlbnRyeS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBuYW1lID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLm5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgcGF0aCBvZiB0aGUgYXNzb2NpYXRlZCB1c2VyIGRhdGFiYXNlIGVudHJ5LgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHBhdGggPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXRQYXRoKCkgeworICAgICAgICByZXR1cm4gKHRoaXMucGF0aCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UGF0aChTdHJpbmcgcGF0aCkgeworICAgICAgICB0aGlzLnBhdGggPSBwYXRoOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSB0eXBlIG9mIHRoZSByZXNvdXJjZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyB0eXBlID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLnR5cGUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIHR5cGUpIHsKKyAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZmFjdG9yeSB0aGF0IGltcGxlbWVudHMgdGhlIHVzZXIgZGF0YWJhc2UgZW50cnkuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZmFjdG9yeSA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEZhY3RvcnkoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5mYWN0b3J5KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRGYWN0b3J5KFN0cmluZyBmYWN0b3J5KSB7CisgICAgICAgIHRoaXMuZmFjdG9yeSA9IGZhY3Rvcnk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBhc3NvY2lhdGVkIGVudHJ5LgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisgICAgICAgIHJldHVybiAodGhpcy5kZXNjcmlwdGlvbik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7CisgICAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKKyAgICB9CisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKyAgICAvKioKKyAgICAgKiBSZXNldCBhbGwgcHJvcGVydGllcyB0byB0aGVpciBkZWZhdWx0IHZhbHVlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBtYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVzZXQoQWN0aW9uTWFwcGluZyBtYXBwaW5nLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworCisgICAgICAgIHN1cGVyLnJlc2V0KG1hcHBpbmcsIHJlcXVlc3QpOworICAgICAgICBuYW1lID0gbnVsbDsKKyAgICAgICAgdHlwZSA9IG51bGw7CisgICAgICAgIHBhdGggPSBudWxsOworICAgICAgICBmYWN0b3J5ID0gbnVsbDsKKyAgICAgICAgZGVzY3JpcHRpb24gPSBudWxsOworCisgICAgfQorCisgICAgLyoqCisgICAgICogVmFsaWRhdGUgdGhlIHByb3BlcnRpZXMgdGhhdCBoYXZlIGJlZW4gc2V0IGZyb20gdGhpcyBIVFRQIHJlcXVlc3QsCisgICAgICogYW5kIHJldHVybiBhbiA8Y29kZT5BY3Rpb25FcnJvcnM8L2NvZGU+IG9iamVjdCB0aGF0IGVuY2Fwc3VsYXRlcyBhbnkKKyAgICAgKiB2YWxpZGF0aW9uIGVycm9ycyB0aGF0IGhhdmUgYmVlbiBmb3VuZC4gIElmIG5vIGVycm9ycyBhcmUgZm91bmQsIHJldHVybgorICAgICAqIDxjb2RlPm51bGw8L2NvZGU+IG9yIGFuIDxjb2RlPkFjdGlvbkVycm9yczwvY29kZT4gb2JqZWN0IHdpdGggbm8KKyAgICAgKiByZWNvcmRlZCBlcnJvciBtZXNzYWdlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBtYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICovCisgICAgCisgICAgcHJpdmF0ZSBBY3Rpb25FcnJvcnMgZXJyb3JzID0gbnVsbDsKKyAgICAKKyAgICBwdWJsaWMgQWN0aW9uRXJyb3JzIHZhbGlkYXRlKEFjdGlvbk1hcHBpbmcgbWFwcGluZywKKyAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworCisgICAgICAgIGVycm9ycyA9IG5ldyBBY3Rpb25FcnJvcnMoKTsKKworICAgICAgICBTdHJpbmcgc3VibWl0ID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoInN1Ym1pdCIpOworICAgICAgICAvL2lmIChzdWJtaXQgIT0gbnVsbCkgeworCisgICAgICAgICAgICAvLyBuYW1lIGlzIGEgcmVxdWlyZWQgZmllbGQKKyAgICAgICAgICAgIGlmICgobmFtZSA9PSBudWxsKSB8fCAobmFtZS5sZW5ndGgoKSA8IDEpKSB7CisgICAgICAgICAgICAgICAgZXJyb3JzLmFkZCgibmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQWN0aW9uRXJyb3IoInJlc291cmNlcy5lcnJvci5uYW1lLnJlcXVpcmVkIikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBwYXRoIGlzIGEgcmVxdWlyZWQgZmllbGQKKyAgICAgICAgICAgIGlmICgocGF0aCA9PSBudWxsKSB8fCAocGF0aC5sZW5ndGgoKSA8IDEpKSB7CisgICAgICAgICAgICAgICAgZXJyb3JzLmFkZCgicGF0aCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQWN0aW9uRXJyb3IoInJlc291cmNlcy5lcnJvci5wYXRoLnJlcXVpcmVkIikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBRdW90ZXMgbm90IGFsbG93ZWQgaW4gbmFtZQorICAgICAgICAgICAgaWYgKChuYW1lICE9IG51bGwpICYmIChuYW1lLmluZGV4T2YoJyInKSA+PSAwKSkgeworICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoIm5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFjdGlvbkVycm9yKCJ1c2Vycy5lcnJvci5xdW90ZXMiKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFF1b3RlcyBub3QgYWxsb3dlZCBpbiBwYXRoCisgICAgICAgICAgICBpZiAoKHBhdGggIT0gbnVsbCkgJiYgKHBhdGguaW5kZXhPZignIicpID4gMCkpIHsKKyAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKCJwYXRoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBY3Rpb25FcnJvcigidXNlcnMuZXJyb3IucXVvdGVzIikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBRdW90ZXMgbm90IGFsbG93ZWQgaW4gZGVzY3JpcHRpb24KKyAgICAgICAgICAgIGlmICgoZGVzY3JpcHRpb24gIT0gbnVsbCkgJiYgKGRlc2NyaXB0aW9uLmluZGV4T2YoJyInKSA+IDApKSB7CisgICAgICAgICAgICAgICAgZXJyb3JzLmFkZCgiZGVzY3JpcHRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFjdGlvbkVycm9yKCJ1c2Vycy5lcnJvci5xdW90ZXMiKSk7CisgICAgICAgICAgICB9CisgICAgICAgIC8vfQorICAgICAgICByZXR1cm4gKGVycm9ycyk7CisgICAgfQorICAgIAorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3Jlc291cmNlcy9Vc2VyRGF0YWJhc2VzRm9ybS5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3Jlc291cmNlcy9Vc2VyRGF0YWJhc2VzRm9ybS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmMWY1M2MKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vcmVzb3VyY2VzL1VzZXJEYXRhYmFzZXNGb3JtLmphdmEKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnJlc291cmNlczsKKworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRXJyb3I7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkVycm9yczsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9ybTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKKworCisvKioKKyAqIEZvcm0gYmVhbiBmb3IgdGhlIGRlbGV0ZSBlbnYgZW50cmllcyBwYWdlLgorICoKKyAqIEBhdXRob3IgTWFudmVlbiBLYXVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICogQHNpbmNlIDQuMQorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBVc2VyRGF0YWJhc2VzRm9ybSBleHRlbmRzIEJhc2VGb3JtIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgb2JqZWN0IG5hbWVzIG9mIHRoZSBzcGVjaWZpZWQgdXNlciBkYXRhYmFzZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgdXNlckRhdGFiYXNlc1tdID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRVc2VyRGF0YWJhc2VzKCkgeworICAgICAgICByZXR1cm4gKHRoaXMudXNlckRhdGFiYXNlcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VXNlckRhdGFiYXNlcyhTdHJpbmcgdXNlckRhdGFiYXNlc1tdKSB7CisgICAgICAgIHRoaXMudXNlckRhdGFiYXNlcyA9IHVzZXJEYXRhYmFzZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGRvbWFpbiBvZiB0aGlzIHVzZXJkYXRhYmFzZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBkb21haW4gPSBudWxsOworICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZG9tYWluIG9mIHRoZSB1c2VyZGF0YWJhc2UgdGhpcyBiZWFuIHJlZmVycyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldERvbWFpbigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZG9tYWluOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZG9tYWluIG9mIHRoZSB1c2VyZGF0YWJhc2UgdGhpcyBiZWFuIHJlZmVycyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREb21haW4oU3RyaW5nIGRvbWFpbikgeworICAgICAgICB0aGlzLmRvbWFpbiA9IGRvbWFpbjsKKyAgICB9CisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJlc2V0IGFsbCBwcm9wZXJ0aWVzIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIG1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZXNldChBY3Rpb25NYXBwaW5nIG1hcHBpbmcsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisKKyAgICAgICAgc3VwZXIucmVzZXQobWFwcGluZywgcmVxdWVzdCk7CisgICAgICAgIHRoaXMudXNlckRhdGFiYXNlcyA9IG51bGw7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3NlcnZlci9FZGl0U2VydmVyQWN0aW9uLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vc2VydmVyL0VkaXRTZXJ2ZXJBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWM5ZmY1Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3NlcnZlci9FZGl0U2VydmVyQWN0aW9uLmphdmEKQEAgLTAsMCArMSwxNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnNlcnZlcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRXJyb3JzOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3J3YXJkOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlckZhY3Rvcnk7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5RdWVyeUV4cDsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LlF1ZXJ5OworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0SW5zdGFuY2U7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuSk1FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lm1vZGVsbWJlYW4uTW9kZWxNQmVhbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lm1vZGVsbWJlYW4uTW9kZWxNQmVhbkluZm87CisKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy51dGlsLk1lc3NhZ2VSZXNvdXJjZXM7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uTGFiZWxWYWx1ZUJlYW47CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uTGlzdHM7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uVG9tY2F0VHJlZUJ1aWxkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uQXBwbGljYXRpb25TZXJ2bGV0OworCisvKioKKyAqIFRlc3QgPGNvZGU+QWN0aW9uPC9jb2RlPiB0aGF0IGhhbmRsZXMgZXZlbnRzIGZyb20gdGhlIHRyZWUgY29udHJvbCB0ZXN0CisgKiBwYWdlLgorICoKKyAqIEBhdXRob3IgSmF6bWluIEpvbnNvbgorICogQGF1dGhvciBNYW52ZWVuIEthdXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEVkaXRTZXJ2ZXJBY3Rpb24gZXh0ZW5kcyBBY3Rpb24geworICAgIAorCisgICAgLyoqCisgICAgICogVGhlIE1CZWFuU2VydmVyIHdlIHdpbGwgYmUgaW50ZXJhY3Rpbmcgd2l0aC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1CZWFuU2VydmVyIG1CU2VydmVyID0gbnVsbDsKKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKyAgICAKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBzcGVjaWZpZWQgSFRUUCByZXF1ZXN0LCBhbmQgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIEhUVFAKKyAgICAgKiByZXNwb25zZSAob3IgZm9yd2FyZCB0byBhbm90aGVyIHdlYiBjb21wb25lbnQgdGhhdCB3aWxsIGNyZWF0ZSBpdCkuCisgICAgICogUmV0dXJuIGFuIDxjb2RlPkFjdGlvbkZvcndhcmQ8L2NvZGU+IGluc3RhbmNlIGRlc2NyaWJpbmcgd2hlcmUgYW5kIGhvdworICAgICAqIGNvbnRyb2wgc2hvdWxkIGJlIGZvcndhcmRlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHJlc3BvbnNlIGhhcworICAgICAqIGFscmVhZHkgYmVlbiBjb21wbGV0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgQWN0aW9uTWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIGFjdGlvbkZvcm0gVGhlIG9wdGlvbmFsIEFjdGlvbkZvcm0gYmVhbiBmb3IgdGhpcyByZXF1ZXN0IChpZiBhbnkpCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIEhUVFAgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgSFRUUCByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXhjZXB0aW9uIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBBY3Rpb25Gb3J3YXJkIHBlcmZvcm0oQWN0aW9uTWFwcGluZyBtYXBwaW5nLAorICAgIEFjdGlvbkZvcm0gZm9ybSwKKyAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisgICAgICAgIAorICAgICAgICAgLy8gQWNxdWlyZSB0aGUgcmVzb3VyY2VzIHRoYXQgd2UgbmVlZAorICAgICAgICBIdHRwU2Vzc2lvbiBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uKCk7CisgICAgICAgIExvY2FsZSBsb2NhbGUgPSBnZXRMb2NhbGUocmVxdWVzdCk7CisgICAgICAgIE1lc3NhZ2VSZXNvdXJjZXMgcmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VzKHJlcXVlc3QpOworICAgICAgICAvLyBBY3F1aXJlIGEgcmVmZXJlbmNlIHRvIHRoZSBNQmVhblNlcnZlciBjb250YWluaW5nIG91ciBNQmVhbnMKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1CU2VydmVyID0gKChBcHBsaWNhdGlvblNlcnZsZXQpIGdldFNlcnZsZXQoKSkuZ2V0U2VydmVyKCk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbgorICAgICAgICAgICAgKCJDYW5ub3QgYWNxdWlyZSBNQmVhblNlcnZlciByZWZlcmVuY2UiLCB0KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGxhYmVsIG9mIHRoZSBub2RlIHRoYXQgd2FzIGNsaWNrZWQgb24uCisgICAgICAgIFN0cmluZyBub2RlTGFiZWwgPSByZXF1ZXN0LmdldFBhcmFtZXRlcigibm9kZUxhYmVsIik7ICAKKyAgICAgICAgU3RyaW5nIHNlbGVjdCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJzZWxlY3QiKTsgICAgICAgIAorICAgICAgICAKKyAgICAgICAgU2VydmVyRm9ybSBzZXJ2ZXJGbSA9IG5ldyBTZXJ2ZXJGb3JtKCk7CisgICAgICAgIHNlc3Npb24uc2V0QXR0cmlidXRlKCJzZXJ2ZXJGb3JtIiwgc2VydmVyRm0pOworICAgICAgICBzZXJ2ZXJGbS5zZXROb2RlTGFiZWwobm9kZUxhYmVsKTsgICAgICAgIAorICAgICAgICBzZXJ2ZXJGbS5zZXRPYmplY3ROYW1lKHNlbGVjdCk7CisgICAgICAgIAorICAgICAgICBPYmplY3ROYW1lIHNuYW1lID0gbnVsbDsgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzbmFtZSA9IG5ldyBPYmplY3ROYW1lKHNlbGVjdCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9CisgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAiZXJyb3Iuc2VydmljZU5hbWUuYmFkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmdldFBhcmFtZXRlcigic2VsZWN0IikpOworICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZyhtZXNzYWdlKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcihIdHRwU2VydmxldFJlc3BvbnNlLlNDX0JBRF9SRVFVRVNULCBtZXNzYWdlKTsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIH0KKyAgICAgIAorICAgICAgICBTdHJpbmcgYXR0cmlidXRlID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIENvcHkgc2NhbGFyIHByb3BlcnRpZXMKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJwb3J0IjsKKyAgICAgICAgICAgIHNlcnZlckZtLnNldFBvcnROdW1iZXJUZXh0CisgICAgICAgICAgICAgICAgKCgoSW50ZWdlcikgbUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKHNuYW1lLCBhdHRyaWJ1dGUpKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJzaHV0ZG93biI7CisgICAgICAgICAgICBzZXJ2ZXJGbS5zZXRTaHV0ZG93blRleHQKKyAgICAgICAgICAgICAgICAoKFN0cmluZykgbUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKHNuYW1lLCBhdHRyaWJ1dGUpKTsKKworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuYXR0cmlidXRlLmdldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSksIHQpOworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5hdHRyaWJ1dGUuZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlKSk7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgLy9mb3J3YXJkIHRvIHRoZSBzZXJ2ZXIganNwLgorICAgICAgICByZXR1cm4gKG1hcHBpbmcuZmluZEZvcndhcmQoIlNlcnZlciIpKTsgICAgICAgIAorICAgIH0KKyAgICAgICAgCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vc2VydmVyL1NhdmVTZXJ2ZXJBY3Rpb24uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9zZXJ2ZXIvU2F2ZVNlcnZlckFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxZmVlOTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vc2VydmVyL1NhdmVTZXJ2ZXJBY3Rpb24uamF2YQpAQCAtMCwwICsxLDE1MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAxLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uc2VydmVyOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRXJyb3JzOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3J3YXJkOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuQXR0cmlidXRlOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlckZhY3Rvcnk7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5RdWVyeUV4cDsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LlF1ZXJ5OworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0SW5zdGFuY2U7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkFwcGxpY2F0aW9uU2VydmxldDsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5Ub21jYXRUcmVlQnVpbGRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy51dGlsLk1lc3NhZ2VSZXNvdXJjZXM7CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgPHN0cm9uZz5BY3Rpb248L3N0cm9uZz4gdGhhdCBzYXZlcyBzZXJ2ZXIgcHJvcGVydGllcy4KKyAqCisgKiBAYXV0aG9yIEphem1pbiBKb25zb24KKyAqIEBhdXRob3IgTWFudmVlbiBLYXVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBTYXZlU2VydmVyQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgTUJlYW5TZXJ2ZXIgd2Ugd2lsbCBiZSBpbnRlcmFjdGluZyB3aXRoLgorICAgICAqLworICAgIHByaXZhdGUgTUJlYW5TZXJ2ZXIgbUJTZXJ2ZXIgPSBudWxsOworICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIHNwZWNpZmllZCBIVFRQIHJlcXVlc3QsIGFuZCBjcmVhdGUgdGhlIGNvcnJlc3BvbmRpbmcgSFRUUAorICAgICAqIHJlc3BvbnNlIChvciBmb3J3YXJkIHRvIGFub3RoZXIgd2ViIGNvbXBvbmVudCB0aGF0IHdpbGwgY3JlYXRlIGl0KS4KKyAgICAgKiBSZXR1cm4gYW4gPGNvZGU+QWN0aW9uRm9yd2FyZDwvY29kZT4gaW5zdGFuY2UgZGVzY3JpYmluZyB3aGVyZSBhbmQgaG93CisgICAgICogY29udHJvbCBzaG91bGQgYmUgZm9yd2FyZGVkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcmVzcG9uc2UgaGFzCisgICAgICogYWxyZWFkeSBiZWVuIGNvbXBsZXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBBY3Rpb25NYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gYWN0aW9uRm9ybSBUaGUgb3B0aW9uYWwgQWN0aW9uRm9ybSBiZWFuIGZvciB0aGlzIHJlcXVlc3QgKGlmIGFueSkKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgSFRUUCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBIVFRQIHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBleGNlcHRpb24gb2NjdXJzCisgICAgICovCisgICAgcHVibGljIEFjdGlvbkZvcndhcmQgcGVyZm9ybShBY3Rpb25NYXBwaW5nIG1hcHBpbmcsCisgICAgQWN0aW9uRm9ybSBmb3JtLAorICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKyAgICAgICAgCisgICAgICAgLy8gQWNxdWlyZSB0aGUgcmVzb3VyY2VzIHRoYXQgd2UgbmVlZAorICAgICAgICBIdHRwU2Vzc2lvbiBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uKCk7CisgICAgICAgIExvY2FsZSBsb2NhbGUgPSBnZXRMb2NhbGUocmVxdWVzdCk7CisgICAgICAgIE1lc3NhZ2VSZXNvdXJjZXMgcmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VzKHJlcXVlc3QpOworICAgICAgICAKKyAgICAgICAgLy8gQWNxdWlyZSBhIHJlZmVyZW5jZSB0byB0aGUgTUJlYW5TZXJ2ZXIgY29udGFpbmluZyBvdXIgTUJlYW5zCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtQlNlcnZlciA9ICgoQXBwbGljYXRpb25TZXJ2bGV0KSBnZXRTZXJ2bGV0KCkpLmdldFNlcnZlcigpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24KKyAgICAgICAgICAgICgiQ2Fubm90IGFjcXVpcmUgTUJlYW5TZXJ2ZXIgcmVmZXJlbmNlIiwgdCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIEFjdGlvbkVycm9ycyBlcnJvcnMgPSBuZXcgQWN0aW9uRXJyb3JzKCk7CisgICAgICAgIAorICAgICAgICAvLyBSZXBvcnQgYW55IGVycm9ycyB3ZSBoYXZlIGRpc2NvdmVyZWQgYmFjayB0byB0aGUgb3JpZ2luYWwgZm9ybQorICAgICAgICBpZiAoIWVycm9ycy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHNhdmVFcnJvcnMocmVxdWVzdCwgZXJyb3JzKTsKKyAgICAgICAgICAgIHJldHVybiAobmV3IEFjdGlvbkZvcndhcmQobWFwcGluZy5nZXRJbnB1dCgpKSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIFNlcnZlckZvcm0gc2Zvcm0gPSAoU2VydmVyRm9ybSkgZm9ybTsKKyAgICAgICAgU3RyaW5nIHNPYmplY3ROYW1lID0gc2Zvcm0uZ2V0T2JqZWN0TmFtZSgpOworICAgICAgICAvLyBBY3F1aXJlIGEgcmVmZXJlbmNlIHRvIHRoZSBTZXJ2ZXIgTUJlYW4KKyAgICAgICAgT2JqZWN0TmFtZSBzb25hbWUgPSBudWxsOworICAgICAgICB0cnkgeyAgICAgICAgICAgIAorICAgICAgICAgICAgc29uYW1lID0gbmV3IE9iamVjdE5hbWUoc09iamVjdE5hbWUpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24KKyAgICAgICAgICAgICgiQ2Fubm90IGFjcXVpcmUgU2VydmVyIE1CZWFuIHJlZmVyZW5jZSAiLCB0KTsKKyAgICAgICAgfQorICAgICAgICAKKworICAgICAgICAvLyBQZXJmb3JtIGF0dHJpYnV0ZSB1cGRhdGVzIGFzIHJlcXVlc3RlZAorICAgICAgICBTdHJpbmcgYXR0cmlidXRlID0gbnVsbDsKKyAgICAgICAgdHJ5eyAgICAgICAgICAKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJwb3J0IjsKKyAgICAgICAgICAgIGludCBwb3J0ID0gMDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcG9ydCA9IEludGVnZXIucGFyc2VJbnQoc2Zvcm0uZ2V0UG9ydE51bWJlclRleHQoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgIHBvcnQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUJTZXJ2ZXIuc2V0QXR0cmlidXRlKHNvbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKCJwb3J0IiwgbmV3IEludGVnZXIocG9ydCkpKTsgICAKKyAgICAgICAgICAgIC8vIHNldCBwb3J0IHdhcm5pbmcgYXMgcG9ydCA8IDEwMjQgcmVxdWlyZXMKKyAgICAgICAgICAgIC8vIHNwZWNpYWwgc29mdHdhcmUgY2FwYWJpbGl0aWVzCisgICAgICAgICAgICBpZiAocG9ydCA8IDEwMjQpIHsgICAgCisgICAgICAgICAgICAgICAgcmVxdWVzdC5zZXRBdHRyaWJ1dGUoIndhcm5pbmciLCAic2VydmVyLnBvcnQud2FybmluZyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAic2h1dGRvd24iOworICAgICAgICAgICAgbUJTZXJ2ZXIuc2V0QXR0cmlidXRlKHNvbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKCJzaHV0ZG93biIsIHNmb3JtLmdldFNodXRkb3duVGV4dCgpKSk7CisgICAgICAgICAgICAKKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSl7CisgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nCisgICAgICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmF0dHJpYnV0ZS5zZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUpLCBlKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuYXR0cmlidXRlLnNldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSkpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBGb3J3YXJkIHRvIHRoZSBzdWNjZXNzIHJlcG9ydGluZyBwYWdlCisgICAgICAgIHNlc3Npb24ucmVtb3ZlQXR0cmlidXRlKG1hcHBpbmcuZ2V0QXR0cmlidXRlKCkpOworICAgICAgICByZXR1cm4gKG1hcHBpbmcuZmluZEZvcndhcmQoIlNhdmUgU3VjY2Vzc2Z1bCIpKTsgICAgICAgIAorICAgIH0gIAorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3NlcnZlci9TZXJ2ZXJGb3JtLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vc2VydmVyL1NlcnZlckZvcm0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmMyNTUzCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3NlcnZlci9TZXJ2ZXJGb3JtLmphdmEKQEAgLTAsMCArMSwxOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5zZXJ2ZXI7CisKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkVycm9yOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25FcnJvcnM7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uQXBwbGljYXRpb25TZXJ2bGV0OworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLlRvbWNhdFRyZWVCdWlsZGVyOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogRm9ybSBiZWFuIGZvciB0aGUgc2VydmVyIGZvcm0gcGFnZS4gIAorICogQGF1dGhvciBQYXRyaWNrIEx1YnkKKyAqIEBhdXRob3IgTWFudmVlbiBLYXVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBTZXJ2ZXJGb3JtIGV4dGVuZHMgQWN0aW9uRm9ybSB7CisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisgICAgCisgICAgLyoqCisgICAgICogVGhlIHRleHQgZm9yIHRoZSBub2RlIGxhYmVsLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIG5vZGVMYWJlbCA9IG51bGw7CisgICAgCisgICAgLyoqCisgICAgICogVGhlIHRleHQgZm9yIHRoZSBwb3J0IG51bWJlci4KKyAgICAgKi8gICAgCisgICAgcHJpdmF0ZSBTdHJpbmcgcG9ydE51bWJlclRleHQgPSAiODA4MCI7CisgICAgCisgICAgLyoqCisgICAgICogVGhlIHRleHQgZm9yIHRoZSBzaHV0ZG93biB0ZXh0LgorICAgICAqLyAgICAKKyAgICBwcml2YXRlIFN0cmluZyBzaHV0ZG93blRleHQgPSBudWxsOworICAgIAorICAgIC8qKgorICAgICAqIFRoZSBvYmplY3QgbmFtZSBvZiB0aGUgQ29ubmVjdG9yIHRoaXMgYmVhbiByZWZlcnMgdG8uCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgb2JqZWN0TmFtZSA9IG51bGw7CisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBsYWJlbCBvZiB0aGUgbm9kZSB0aGF0IHdhcyBjbGlja2VkLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Tm9kZUxhYmVsKCkgeworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXMubm9kZUxhYmVsOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBub2RlIGxhYmVsLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE5vZGVMYWJlbChTdHJpbmcgbm9kZUxhYmVsKSB7CisgICAgICAgIAorICAgICAgICB0aGlzLm5vZGVMYWJlbCA9IG5vZGVMYWJlbDsKKyAgICAgICAgCisgICAgfSAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHBvcnROdW1iZXJUZXh0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UG9ydE51bWJlclRleHQoKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy5wb3J0TnVtYmVyVGV4dDsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgcG9ydE51bWJlclRleHQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UG9ydE51bWJlclRleHQoU3RyaW5nIHBvcnROdW1iZXJUZXh0KSB7CisgICAgICAgIAorICAgICAgICB0aGlzLnBvcnROdW1iZXJUZXh0ID0gcG9ydE51bWJlclRleHQ7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIFNodXRkb3duIFRleHQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTaHV0ZG93blRleHQoKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy5zaHV0ZG93blRleHQ7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIFNodXQgZG93biAgVGV4dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTaHV0ZG93blRleHQoU3RyaW5nIHNodXRkb3duVGV4dCkgeworICAgICAgICAKKyAgICAgICAgdGhpcy5zaHV0ZG93blRleHQgPSBzaHV0ZG93blRleHQ7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG9iamVjdCBuYW1lIG9mIHRoZSBDb25uZWN0b3IgdGhpcyBiZWFuIHJlZmVycyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE9iamVjdE5hbWUoKSB7CisKKyAgICAgICAgcmV0dXJuIHRoaXMub2JqZWN0TmFtZTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBvYmplY3QgbmFtZSBvZiB0aGUgQ29ubmVjdG9yIHRoaXMgYmVhbiByZWZlcnMgdG8uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0T2JqZWN0TmFtZShTdHJpbmcgb2JqZWN0TmFtZSkgeworCisgICAgICAgIHRoaXMub2JqZWN0TmFtZSA9IG9iamVjdE5hbWU7CisKKyAgICB9CisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisgICAgCisgICAgLyoqCisgICAgICogUmVzZXQgYWxsIHByb3BlcnRpZXMgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgbWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlc2V0KEFjdGlvbk1hcHBpbmcgbWFwcGluZywgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgCisgICAgICAgIHRoaXMucG9ydE51bWJlclRleHQgPSBudWxsOworICAgICAgICB0aGlzLnNodXRkb3duVGV4dCA9IG51bGw7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBWYWxpZGF0ZSB0aGUgcHJvcGVydGllcyB0aGF0IGhhdmUgYmVlbiBzZXQgZnJvbSB0aGlzIEhUVFAgcmVxdWVzdCwKKyAgICAgKiBhbmQgcmV0dXJuIGFuIDxjb2RlPkFjdGlvbkVycm9yczwvY29kZT4gb2JqZWN0IHRoYXQgZW5jYXBzdWxhdGVzIGFueQorICAgICAqIHZhbGlkYXRpb24gZXJyb3JzIHRoYXQgaGF2ZSBiZWVuIGZvdW5kLiAgSWYgbm8gZXJyb3JzIGFyZSBmb3VuZCwgcmV0dXJuCisgICAgICogPGNvZGU+bnVsbDwvY29kZT4gb3IgYW4gPGNvZGU+QWN0aW9uRXJyb3JzPC9jb2RlPiBvYmplY3Qgd2l0aCBubworICAgICAqIHJlY29yZGVkIGVycm9yIG1lc3NhZ2VzLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIG1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgQWN0aW9uRXJyb3JzIHZhbGlkYXRlKEFjdGlvbk1hcHBpbmcgbWFwcGluZywKKyAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICAKKyAgICAgICAgQWN0aW9uRXJyb3JzIGVycm9ycyA9IG5ldyBBY3Rpb25FcnJvcnMoKTsKKyAgICAgICAgCisgICAgICAgIFN0cmluZyBzdWJtaXQgPSByZXF1ZXN0LmdldFBhcmFtZXRlcigic3VibWl0Iik7CisgICAgICAgIC8vaWYgKHN1Ym1pdCAhPSBudWxsKSB7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIGNoZWNrIGZvciBwb3J0TnVtYmVyIC0tIG11c3Qgbm90IGJlIGJsYW5rLCBtdXN0IGJlIGluCisgICAgICAgICAgICAvLyB0aGUgcmFuZ2UgMSB0byA2NTUzNS4KKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKChwb3J0TnVtYmVyVGV4dCA9PSBudWxsKSB8fCAocG9ydE51bWJlclRleHQubGVuZ3RoKCkgPCAxKSkgeworICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoInBvcnROdW1iZXJUZXh0IiwKKyAgICAgICAgICAgICAgICBuZXcgQWN0aW9uRXJyb3IoImVycm9yLnBvcnROdW1iZXIucmVxdWlyZWQiKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGludCBwb3J0ID0gSW50ZWdlci5wYXJzZUludChwb3J0TnVtYmVyVGV4dCk7CisgICAgICAgICAgICAgICAgICAgIGlmICgocG9ydCA8PSAwKSB8fCAocG9ydCA+NjU1MzUgKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoInBvcnROdW1iZXJUZXh0IiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFjdGlvbkVycm9yKCJlcnJvci5wb3J0TnVtYmVyLnJhbmdlIikpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoInBvcnROdW1iZXJUZXh0IiwgCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQWN0aW9uRXJyb3IoImVycm9yLnBvcnROdW1iZXIuZm9ybWF0IikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgICAgICAvLyBzaHV0ZG93biB0ZXh0IGNhbiBiZSBhbnkgbm9uLWVtcHR5IHN0cmluZyBvZiBhdGxlYXN0IDYgY2hhcmFjdGVycy4KKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKChzaHV0ZG93blRleHQgPT0gbnVsbCkgfHwgKHNodXRkb3duVGV4dC5sZW5ndGgoKSA8IDcpKQorICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoInNodXRkb3duVGV4dCIsCisgICAgICAgICAgICAgICAgbmV3IEFjdGlvbkVycm9yKCJlcnJvci5zaHV0ZG93blRleHQubGVuZ3RoIikpOworICAgICAgICAgICAgCisgICAgICAgIC8vfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIGVycm9yczsKKyAgICAgICAgCisgICAgfQorICAgIAorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3NlcnZpY2UvQWRkU2VydmljZUFjdGlvbi5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3NlcnZpY2UvQWRkU2VydmljZUFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyZDQ1NGEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vc2VydmljZS9BZGRTZXJ2aWNlQWN0aW9uLmphdmEKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAxLTIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uc2VydmljZTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25FcnJvcnM7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcndhcmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMudXRpbC5NZXNzYWdlUmVzb3VyY2VzOworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkxhYmVsVmFsdWVCZWFuOworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkxpc3RzOworCisvKioKKyAqIFRoZSA8Y29kZT5BY3Rpb248L2NvZGU+IHRoYXQgc2V0cyB1cCA8ZW0+QWRkIFNlcnZpY2U8L2VtPiB0cmFuc2FjdGlvbnMuCisgKgorICogQGF1dGhvciBNYW52ZWVuIEthdXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEFkZFNlcnZpY2VBY3Rpb24gZXh0ZW5kcyBBY3Rpb24geworICAgICAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKyAgICAKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBzcGVjaWZpZWQgSFRUUCByZXF1ZXN0LCBhbmQgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIEhUVFAKKyAgICAgKiByZXNwb25zZSAob3IgZm9yd2FyZCB0byBhbm90aGVyIHdlYiBjb21wb25lbnQgdGhhdCB3aWxsIGNyZWF0ZSBpdCkuCisgICAgICogUmV0dXJuIGFuIDxjb2RlPkFjdGlvbkZvcndhcmQ8L2NvZGU+IGluc3RhbmNlIGRlc2NyaWJpbmcgd2hlcmUgYW5kIGhvdworICAgICAqIGNvbnRyb2wgc2hvdWxkIGJlIGZvcndhcmRlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHJlc3BvbnNlIGhhcworICAgICAqIGFscmVhZHkgYmVlbiBjb21wbGV0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgQWN0aW9uTWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIGFjdGlvbkZvcm0gVGhlIG9wdGlvbmFsIEFjdGlvbkZvcm0gYmVhbiBmb3IgdGhpcyByZXF1ZXN0IChpZiBhbnkpCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIEhUVFAgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgSFRUUCByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXhjZXB0aW9uIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBBY3Rpb25Gb3J3YXJkIHBlcmZvcm0oQWN0aW9uTWFwcGluZyBtYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uRm9ybSBmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIEFjcXVpcmUgdGhlIHJlc291cmNlcyB0aGF0IHdlIG5lZWQKKyAgICAgICAgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpOworICAgICAgICBMb2NhbGUgbG9jYWxlID0gZ2V0TG9jYWxlKHJlcXVlc3QpOworICAgICAgICBNZXNzYWdlUmVzb3VyY2VzIHJlc291cmNlcyA9IGdldFJlc291cmNlcyhyZXF1ZXN0KTsKKyAgICAgICAgCisgICAgICAgIFN0cmluZyBzZXJ2ZXJOYW1lID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoInNlbGVjdCIpOworICAgICAgICAKKyAgICAgICAgLy8gRmlsbCBpbiB0aGUgZm9ybSB2YWx1ZXMgZm9yIGRpc3BsYXkgYW5kIGVkaXRpbmcKKyAgICAgICAgU2VydmljZUZvcm0gc2VydmljZUZtID0gbmV3IFNlcnZpY2VGb3JtKCk7CisgICAgICAgIHNlc3Npb24uc2V0QXR0cmlidXRlKCJzZXJ2aWNlRm9ybSIsIHNlcnZpY2VGbSk7CisgICAgICAgIHNlcnZpY2VGbS5zZXRBZG1pbkFjdGlvbigiQ3JlYXRlIik7CisgICAgICAgIHNlcnZpY2VGbS5zZXRPYmplY3ROYW1lKCIiKTsKKyAgICAgICAgc2VydmljZUZtLnNldEVuZ2luZU9iamVjdE5hbWUoIiIpOworICAgICAgICBzZXJ2aWNlRm0uc2V0U2VydmljZU5hbWUoIiIpOworICAgICAgICBzZXJ2aWNlRm0uc2V0RW5naW5lTmFtZSgiIik7CisgICAgICAgIHNlcnZpY2VGbS5zZXREZWZhdWx0SG9zdCgibG9jYWxob3N0Iik7ICAgICAgICAKKyAgICAgICAgc2VydmljZUZtLnNldEFkbWluU2VydmljZU5hbWUoIiIpOworICAgICAgICBzZXJ2aWNlRm0uc2V0U2VydmVyT2JqZWN0TmFtZShzZXJ2ZXJOYW1lKTsKKyAgICAgICAgQXJyYXlMaXN0IGhvc3RzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBob3N0cy5hZGQobmV3IExhYmVsVmFsdWVCZWFuCisgICAgICAgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAibGlzdC5ub25lIiksICIiKSk7CisgICAgICAgIHNlcnZpY2VGbS5zZXRIb3N0TmFtZVZhbHMoaG9zdHMpOworICAgICAgICAKKyAgICAgICAgLy8gRm9yd2FyZCB0byB0aGUgc2VydmljZSBkaXNwbGF5IHBhZ2UKKyAgICAgICAgcmV0dXJuIChtYXBwaW5nLmZpbmRGb3J3YXJkKCJTZXJ2aWNlIikpOworICAgICAgICAKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3NlcnZpY2UvRGVsZXRlU2VydmljZUFjdGlvbi5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3NlcnZpY2UvRGVsZXRlU2VydmljZUFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjZWZlMDQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vc2VydmljZS9EZWxldGVTZXJ2aWNlQWN0aW9uLmphdmEKQEAgLTAsMCArMSwxNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMS0yMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uc2VydmljZTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRXJyb3JzOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3J3YXJkOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworCitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyRmFjdG9yeTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LlF1ZXJ5RXhwOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuUXVlcnk7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3RJbnN0YW5jZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5KTUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy51dGlsLk1lc3NhZ2VSZXNvdXJjZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5BcHBsaWNhdGlvblNlcnZsZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uVG9tY2F0VHJlZUJ1aWxkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uTGlzdHM7CisKKy8qKgorICogVGhlIDxjb2RlPkFjdGlvbjwvY29kZT4gdGhhdCBzZXRzIHVwIDxlbT5EZWxldGUgU2VydmljZXM8L2VtPiB0cmFuc2FjdGlvbnMuCisgKgorICogQGF1dGhvciBNYW52ZWVuIEthdXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIERlbGV0ZVNlcnZpY2VBY3Rpb24gZXh0ZW5kcyBBY3Rpb24geworICAgIAorCisgICAgLyoqCisgICAgICogVGhlIE1CZWFuU2VydmVyIHdlIHdpbGwgYmUgaW50ZXJhY3Rpbmcgd2l0aC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1CZWFuU2VydmVyIG1CU2VydmVyID0gbnVsbDsKKyAgICAKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworICAgIAorICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIHNwZWNpZmllZCBIVFRQIHJlcXVlc3QsIGFuZCBjcmVhdGUgdGhlIGNvcnJlc3BvbmRpbmcgSFRUUAorICAgICAqIHJlc3BvbnNlIChvciBmb3J3YXJkIHRvIGFub3RoZXIgd2ViIGNvbXBvbmVudCB0aGF0IHdpbGwgY3JlYXRlIGl0KS4KKyAgICAgKiBSZXR1cm4gYW4gPGNvZGU+QWN0aW9uRm9yd2FyZDwvY29kZT4gaW5zdGFuY2UgZGVzY3JpYmluZyB3aGVyZSBhbmQgaG93CisgICAgICogY29udHJvbCBzaG91bGQgYmUgZm9yd2FyZGVkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcmVzcG9uc2UgaGFzCisgICAgICogYWxyZWFkeSBiZWVuIGNvbXBsZXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBBY3Rpb25NYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gYWN0aW9uRm9ybSBUaGUgb3B0aW9uYWwgQWN0aW9uRm9ybSBiZWFuIGZvciB0aGlzIHJlcXVlc3QgKGlmIGFueSkKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgSFRUUCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBIVFRQIHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBleGNlcHRpb24gb2NjdXJzCisgICAgICovCisgICAgcHVibGljIEFjdGlvbkZvcndhcmQgcGVyZm9ybShBY3Rpb25NYXBwaW5nIG1hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb25Gb3JtIGZvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisgICAgICAgIAorCisgICAgICAgIC8vIEFjcXVpcmUgdGhlIHJlc291cmNlcyB0aGF0IHdlIG5lZWQKKyAgICAgICAgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpOworICAgICAgICBMb2NhbGUgbG9jYWxlID0gZ2V0TG9jYWxlKHJlcXVlc3QpOworICAgICAgICBNZXNzYWdlUmVzb3VyY2VzIHJlc291cmNlcyA9IGdldFJlc291cmNlcyhyZXF1ZXN0KTsKKyAgICAgICAgCisgICAgICAgIC8vIEFjcXVpcmUgYSByZWZlcmVuY2UgdG8gdGhlIE1CZWFuU2VydmVyIGNvbnRhaW5pbmcgb3VyIE1CZWFucworICAgICAgICB0cnkgeworICAgICAgICAgICAgbUJTZXJ2ZXIgPSAoKEFwcGxpY2F0aW9uU2VydmxldCkgZ2V0U2VydmxldCgpKS5nZXRTZXJ2ZXIoKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uCisgICAgICAgICAgICAoIkNhbm5vdCBhY3F1aXJlIE1CZWFuU2VydmVyIHJlZmVyZW5jZSIsIHQpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBTdHJpbmcgc2VsZWN0ID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoInNlbGVjdCIpOworICAgICAgICBTdHJpbmcgYWRtaW5TZXJ2aWNlID0gbnVsbDsKKyAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9IG51bGw7CisgICAgICAgIFN0cmluZyBkb21haW4gPSBudWxsOworICAgICAgICAvLyBHZXQgdGhlIHNlcnZpY2UgbmFtZSB0aGUgYWRtaW4gYXBwIHJ1bnMgb24KKyAgICAgICAgLy8gdGhpcyBzZXJ2aWNlIGNhbm5vdCBiZSBkZWxldGVkIGZyb20gdGhlIGFkbWluIHRvb2wKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9uYW1lID0gbmV3IE9iamVjdE5hbWUoc2VsZWN0KTsKKyAgICAgICAgICAgIGRvbWFpbiA9IG9uYW1lLmdldERvbWFpbigpOworICAgICAgICAgICAgYWRtaW5TZXJ2aWNlID0gTGlzdHMuZ2V0QWRtaW5BcHBTZXJ2aWNlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CU2VydmVyLCBkb21haW4gLHJlcXVlc3QpOworICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0KKyAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJlcnJvci5zZXJ2aWNlTmFtZS5iYWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRtaW5TZXJ2aWNlKTsKKyAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cobWVzc2FnZSk7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19CQURfUkVRVUVTVCwgbWVzc2FnZSk7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICB9CisgICAgICAgIHJlcXVlc3Quc2V0QXR0cmlidXRlKCJhZG1pbkFwcFNlcnZpY2UiLCBhZG1pblNlcnZpY2UpOworIAorICAgICAgICAvLyBTZXQgdXAgYSBmb3JtIGJlYW4gY29udGFpbmluZyB0aGUgY3VycmVudGx5IHNlbGVjdGVkCisgICAgICAgIC8vIG9iamVjdHMgdG8gYmUgZGVsZXRlZAorICAgICAgICBTZXJ2aWNlc0Zvcm0gc2VydmljZXNGb3JtID0gbmV3IFNlcnZpY2VzRm9ybSgpOworICAgICAgICBpZiAoc2VsZWN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZyBzZXJ2aWNlc1tdID0gbmV3IFN0cmluZ1sxXTsKKyAgICAgICAgICAgIHNlcnZpY2VzWzBdID0gc2VsZWN0OworICAgICAgICAgICAgc2VydmljZXNGb3JtLnNldFNlcnZpY2VzKHNlcnZpY2VzKTsKKyAgICAgICAgfQorICAgICAgICByZXF1ZXN0LnNldEF0dHJpYnV0ZSgic2VydmljZXNGb3JtIiwgc2VydmljZXNGb3JtKTsKKworICAgICAgICAvLyBBY2N1bXVsYXRlIGEgbGlzdCBvZiBhbGwgYXZhaWxhYmxlIHNlcnZpY2VzCisgICAgICAgIEFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3RyaW5nIHBhdHRlcm4gPSAiKiIgKyBUb21jYXRUcmVlQnVpbGRlci5TRVJWSUNFX1RZUEUgKworICAgICAgICAgICAgICAgIFRvbWNhdFRyZWVCdWlsZGVyLldJTERDQVJEOworICAgICAgICAgICAgSXRlcmF0b3IgaXRlbXMgPQorICAgICAgICAgICAgICAgIG1CU2VydmVyLnF1ZXJ5TmFtZXMobmV3IE9iamVjdE5hbWUocGF0dGVybiksIG51bGwpLml0ZXJhdG9yKCk7CisgICAgICAgICAgICB3aGlsZSAoaXRlbXMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgbGlzdC5hZGQoaXRlbXMubmV4dCgpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZworICAgICAgICAgICAgICAgIChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5zZWxlY3QiKSk7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsCisgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLnNlbGVjdCIpKTsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIH0KKyAgICAgICAgQ29sbGVjdGlvbnMuc29ydChsaXN0KTsKKyAgICAgICAgcmVxdWVzdC5zZXRBdHRyaWJ1dGUoInNlcnZpY2VzTGlzdCIsIGxpc3QpOyAgICAKKyAgICAgICAgCisgICAgICAgIC8vIEZvcndhcmQgdG8gdGhlIGxpc3QgZGlzcGxheSBwYWdlCisgICAgICAgIHJldHVybiAobWFwcGluZy5maW5kRm9yd2FyZCgiU2VydmljZXMiKSk7CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9zZXJ2aWNlL0RlbGV0ZVNlcnZpY2VzQWN0aW9uLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vc2VydmljZS9EZWxldGVTZXJ2aWNlc0FjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MmQ3MTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vc2VydmljZS9EZWxldGVTZXJ2aWNlc0FjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTYwIEBACisvKgorICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5zZXJ2aWNlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3RJbnN0YW5jZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lm1vZGVsbWJlYW4uTW9kZWxNQmVhbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9ybTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9yd2FyZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy51dGlsLk1lc3NhZ2VSZXNvdXJjZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5BcHBsaWNhdGlvblNlcnZsZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uVG9tY2F0VHJlZUJ1aWxkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uVHJlZUNvbnRyb2w7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uVHJlZUNvbnRyb2xOb2RlOworCisKKy8qKgorICogVGhlIDxjb2RlPkFjdGlvbjwvY29kZT4gdGhhdCBjb21wbGV0ZXMgPGVtPkRlbGV0ZSBTZXJ2aWNlczwvZW0+CisgKiB0cmFuc2FjdGlvbnMuCisgKgorICogQGF1dGhvciBNYW52ZWVuIEthdXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIERlbGV0ZVNlcnZpY2VzQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKKworCisgICAgLyoqCisgICAgICogU2lnbmF0dXJlIGZvciB0aGUgPGNvZGU+cmVtb3ZlU2VydmljZTwvY29kZT4gb3BlcmF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHJlbW92ZVNlcnZpY2VUeXBlc1tdID0KKyAgICB7ICJqYXZhLmxhbmcuU3RyaW5nIiwgICAgICAvLyBPYmplY3QgbmFtZQorICAgIH07CisKKworICAgIC8qKgorICAgICAqIFRoZSBNQmVhblNlcnZlciB3ZSB3aWxsIGJlIGludGVyYWN0aW5nIHdpdGguCisgICAgICovCisgICAgcHJpdmF0ZSBNQmVhblNlcnZlciBtQlNlcnZlciA9IG51bGw7CisgICAgCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBzcGVjaWZpZWQgSFRUUCByZXF1ZXN0LCBhbmQgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIEhUVFAKKyAgICAgKiByZXNwb25zZSAob3IgZm9yd2FyZCB0byBhbm90aGVyIHdlYiBjb21wb25lbnQgdGhhdCB3aWxsIGNyZWF0ZSBpdCkuCisgICAgICogUmV0dXJuIGFuIDxjb2RlPkFjdGlvbkZvcndhcmQ8L2NvZGU+IGluc3RhbmNlIGRlc2NyaWJpbmcgd2hlcmUgYW5kIGhvdworICAgICAqIGNvbnRyb2wgc2hvdWxkIGJlIGZvcndhcmRlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHJlc3BvbnNlIGhhcworICAgICAqIGFscmVhZHkgYmVlbiBjb21wbGV0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgQWN0aW9uTWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIGFjdGlvbkZvcm0gVGhlIG9wdGlvbmFsIEFjdGlvbkZvcm0gYmVhbiBmb3IgdGhpcyByZXF1ZXN0IChpZiBhbnkpCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIEhUVFAgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgSFRUUCByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXhjZXB0aW9uIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBBY3Rpb25Gb3J3YXJkIHBlcmZvcm0oQWN0aW9uTWFwcGluZyBtYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uRm9ybSBmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworICAgICAgICAKKyAgICAgICAgCisgICAgICAgIC8vIExvb2sgdXAgdGhlIGNvbXBvbmVudHMgd2Ugd2lsbCBiZSB1c2luZyBhcyBuZWVkZWQKKyAgICAgICAgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpOworICAgICAgICBMb2NhbGUgbG9jYWxlID0gZ2V0TG9jYWxlKHJlcXVlc3QpOworICAgICAgICBNZXNzYWdlUmVzb3VyY2VzIHJlc291cmNlcyA9IGdldFJlc291cmNlcyhyZXF1ZXN0KTsKKworICAgICAgICAvLyBBY3F1aXJlIGEgcmVmZXJlbmNlIHRvIHRoZSBNQmVhblNlcnZlciBjb250YWluaW5nIG91ciBNQmVhbnMKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1CU2VydmVyID0gKChBcHBsaWNhdGlvblNlcnZsZXQpIGdldFNlcnZsZXQoKSkuZ2V0U2VydmVyKCk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbgorICAgICAgICAgICAgKCJDYW5ub3QgYWNxdWlyZSBNQmVhblNlcnZlciByZWZlcmVuY2UiLCB0KTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gRGVsZXRlIHRoZSBzcGVjaWZpZWQgU2VydmljZXMKKyAgICAgICAgU3RyaW5nIHNlcnZpY2VzW10gID0gKChTZXJ2aWNlc0Zvcm0pIGZvcm0pLmdldFNlcnZpY2VzKCk7CisgICAgICAgIFN0cmluZyB2YWx1ZXNbXSA9IG5ldyBTdHJpbmdbMV07CisgICAgICAgIFN0cmluZyBvcGVyYXRpb24gPSAicmVtb3ZlU2VydmljZSI7CisgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgIC8vIExvb2sgdXAgb3VyIHRyZWUgY29udHJvbCBkYXRhIHN0cnVjdHVyZQorICAgICAgICAgICAgVHJlZUNvbnRyb2wgY29udHJvbCA9IChUcmVlQ29udHJvbCkKKyAgICAgICAgICAgICAgICBzZXNzaW9uLmdldEF0dHJpYnV0ZSgidHJlZUNvbnRyb2xUZXN0Iik7CisKKyAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgc3BlY2lmaWVkIHNlcnZpY2VzCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlcnZpY2VzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgdmFsdWVzWzBdID0gc2VydmljZXNbaV07CisgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9IG5ldyBPYmplY3ROYW1lKHNlcnZpY2VzW2ldKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZG9tYWluID0gb25hbWUuZ2V0RG9tYWluKCk7CisgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSBmbmFtZSA9IAorICAgICAgICAgICAgICAgICAgICAgICAgVG9tY2F0VHJlZUJ1aWxkZXIuZ2V0TUJlYW5GYWN0b3J5KCk7CisgICAgICAgICAgICAgICAgbUJTZXJ2ZXIuaW52b2tlKGZuYW1lLCBvcGVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcywgcmVtb3ZlU2VydmljZVR5cGVzKTsKKyAgICAgICAgICAgICAgICBpZiAoY29udHJvbCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wuc2VsZWN0Tm9kZShudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgVHJlZUNvbnRyb2xOb2RlIG5vZGUgPSBjb250cm9sLmZpbmROb2RlKHNlcnZpY2VzW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5yZW1vdmUoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2coIk1pc3NpbmcgVHJlZUNvbnRyb2xOb2RlIGZvciAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZXNbaV0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZygiTWlzc2luZyBUcmVlQ29udHJvbCBhdHRyaWJ1dGUiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKworICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZworICAgICAgICAgICAgICAgIChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5pbnZva2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24pLCBlKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuaW52b2tlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uKSk7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworCisgICAgICAgIH0KKworICAgICAgICAvLyBSZXBvcnQgc3VjY2Vzc2Z1bCBjb21wbGV0aW9uIG9mIHRoaXMgdHJhbnNhY3Rpb24KKyAgICAgICAgcmV0dXJuIChtYXBwaW5nLmZpbmRGb3J3YXJkKCJTYXZlIFN1Y2Nlc3NmdWwiKSk7CisKKyAgICB9CisgICAgCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vc2VydmljZS9FZGl0U2VydmljZUFjdGlvbi5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3NlcnZpY2UvRWRpdFNlcnZpY2VBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmRkNWZjCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3NlcnZpY2UvRWRpdFNlcnZpY2VBY3Rpb24uamF2YQpAQCAtMCwwICsxLDE5OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAxLTIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uc2VydmljZTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRXJyb3JzOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3J3YXJkOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLnV0aWwuTWVzc2FnZVJlc291cmNlczsKKworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3RJbnN0YW5jZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5KTUV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkFwcGxpY2F0aW9uU2VydmxldDsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5MYWJlbFZhbHVlQmVhbjsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5MaXN0czsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5Ub21jYXRUcmVlQnVpbGRlcjsKKworLyoqCisgKiBUaGUgPGNvZGU+QWN0aW9uPC9jb2RlPiB0aGF0IHNldHMgdXAgPGVtPkVkaXQgU2VydmljZTwvZW0+IHRyYW5zYWN0aW9ucy4KKyAqCisgKiBAYXV0aG9yIE1hbnZlZW4gS2F1cgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgRWRpdFNlcnZpY2VBY3Rpb24gZXh0ZW5kcyBBY3Rpb24geworICAgIAorCisgICAgLyoqCisgICAgICogVGhlIE1CZWFuU2VydmVyIHdlIHdpbGwgYmUgaW50ZXJhY3Rpbmcgd2l0aC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1CZWFuU2VydmVyIG1CU2VydmVyID0gbnVsbDsKKyAgICAKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworICAgIAorICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIHNwZWNpZmllZCBIVFRQIHJlcXVlc3QsIGFuZCBjcmVhdGUgdGhlIGNvcnJlc3BvbmRpbmcgSFRUUAorICAgICAqIHJlc3BvbnNlIChvciBmb3J3YXJkIHRvIGFub3RoZXIgd2ViIGNvbXBvbmVudCB0aGF0IHdpbGwgY3JlYXRlIGl0KS4KKyAgICAgKiBSZXR1cm4gYW4gPGNvZGU+QWN0aW9uRm9yd2FyZDwvY29kZT4gaW5zdGFuY2UgZGVzY3JpYmluZyB3aGVyZSBhbmQgaG93CisgICAgICogY29udHJvbCBzaG91bGQgYmUgZm9yd2FyZGVkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcmVzcG9uc2UgaGFzCisgICAgICogYWxyZWFkeSBiZWVuIGNvbXBsZXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBBY3Rpb25NYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gYWN0aW9uRm9ybSBUaGUgb3B0aW9uYWwgQWN0aW9uRm9ybSBiZWFuIGZvciB0aGlzIHJlcXVlc3QgKGlmIGFueSkKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgSFRUUCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBIVFRQIHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBleGNlcHRpb24gb2NjdXJzCisgICAgICovCisgICAgcHVibGljIEFjdGlvbkZvcndhcmQgcGVyZm9ybShBY3Rpb25NYXBwaW5nIG1hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb25Gb3JtIGZvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisgICAgICAgIAorICAgICAgICAvLyBBY3F1aXJlIHRoZSByZXNvdXJjZXMgdGhhdCB3ZSBuZWVkCisgICAgICAgIEh0dHBTZXNzaW9uIHNlc3Npb24gPSByZXF1ZXN0LmdldFNlc3Npb24oKTsKKyAgICAgICAgTG9jYWxlIGxvY2FsZSA9IGdldExvY2FsZShyZXF1ZXN0KTsKKyAgICAgICAgTWVzc2FnZVJlc291cmNlcyByZXNvdXJjZXMgPSBnZXRSZXNvdXJjZXMocmVxdWVzdCk7CisgICAgICAgIAorICAgICAgICAvLyBBY3F1aXJlIGEgcmVmZXJlbmNlIHRvIHRoZSBNQmVhblNlcnZlciBjb250YWluaW5nIG91ciBNQmVhbnMKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1CU2VydmVyID0gKChBcHBsaWNhdGlvblNlcnZsZXQpIGdldFNlcnZsZXQoKSkuZ2V0U2VydmVyKCk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbgorICAgICAgICAgICAgKCJDYW5ub3QgYWNxdWlyZSBNQmVhblNlcnZlciByZWZlcmVuY2UiLCB0KTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gU2V0IHVwIHRoZSBvYmplY3QgbmFtZXMgb2YgdGhlIE1CZWFucyB3ZSBhcmUgbWFuaXB1bGF0aW5nCisgICAgICAgIE9iamVjdE5hbWUgc25hbWUgPSBudWxsOworICAgICAgICBPYmplY3ROYW1lIGVuYW1lID0gbnVsbDsKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNuYW1lID0gbmV3IE9iamVjdE5hbWUocmVxdWVzdC5nZXRQYXJhbWV0ZXIoInNlbGVjdCIpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0KKyAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJlcnJvci5zZXJ2aWNlTmFtZS5iYWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJzZWxlY3QiKSk7CisgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nKG1lc3NhZ2UpOworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfQkFEX1JFUVVFU1QsIG1lc3NhZ2UpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKHNuYW1lLmdldERvbWFpbigpKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiOnR5cGU9RW5naW5lIik7CisgICAgICAgICAgICBlbmFtZSA9IG5ldyBPYmplY3ROYW1lKHNiLnRvU3RyaW5nKCkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPQorICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgImVycm9yLmVuZ2luZU5hbWUuYmFkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi50b1N0cmluZygpKTsKKyAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cobWVzc2FnZSk7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19CQURfUkVRVUVTVCwgbWVzc2FnZSk7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIGFkbWluU2VydmljZSA9IG51bGw7CisgICAgICAgIC8vIEdldCB0aGUgc2VydmljZSBuYW1lIHRoZSBhZG1pbiBhcHAgcnVucyBvbgorICAgICAgICAvLyB0aGlzIHNlcnZpY2UgY2Fubm90IGJlIGRlbGV0ZWQgZnJvbSB0aGUgYWRtaW4gdG9vbAorICAgICAgICB0cnkgeworICAgICAgICAgICAgYWRtaW5TZXJ2aWNlID0gTGlzdHMuZ2V0QWRtaW5BcHBTZXJ2aWNlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CU2VydmVyLCBzbmFtZS5nZXREb21haW4oKSxyZXF1ZXN0KTsKKyAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9CisgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAiZXJyb3Iuc2VydmljZU5hbWUuYmFkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkbWluU2VydmljZSk7CisgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nKG1lc3NhZ2UpOworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfQkFEX1JFUVVFU1QsIG1lc3NhZ2UpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIAorICAgICAgICAvLyBGaWxsIGluIHRoZSBmb3JtIHZhbHVlcyBmb3IgZGlzcGxheSBhbmQgZWRpdGluZworICAgICAgICBTZXJ2aWNlRm9ybSBzZXJ2aWNlRm0gPSBuZXcgU2VydmljZUZvcm0oKTsKKyAgICAgICAgc2Vzc2lvbi5zZXRBdHRyaWJ1dGUoInNlcnZpY2VGb3JtIiwgc2VydmljZUZtKTsKKyAgICAgICAgc2VydmljZUZtLnNldEFkbWluQWN0aW9uKCJFZGl0Iik7CisgICAgICAgIHNlcnZpY2VGbS5zZXRPYmplY3ROYW1lKHNuYW1lLnRvU3RyaW5nKCkpOworICAgICAgICBzZXJ2aWNlRm0uc2V0RW5naW5lT2JqZWN0TmFtZShlbmFtZS50b1N0cmluZygpKTsKKyAgICAgICAgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIHNiLmFwcGVuZChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJzZXJ2ZXIuc2VydmljZS50cmVlQnVpbGRlci5zdWJ0cmVlTm9kZSIpKTsKKyAgICAgICAgc2IuYXBwZW5kKCIgKCIpOworICAgICAgICBzYi5hcHBlbmQoc25hbWUuZ2V0S2V5UHJvcGVydHkoInNlcnZpY2VOYW1lIikpOworICAgICAgICBzYi5hcHBlbmQoIikiKTsKKyAgICAgICAgc2VydmljZUZtLnNldE5vZGVMYWJlbChzYi50b1N0cmluZygpKTsKKyAgICAgICAgc2VydmljZUZtLnNldEFkbWluU2VydmljZU5hbWUoYWRtaW5TZXJ2aWNlKTsKKyAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZSA9IG51bGw7CisgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgIC8vIENvcHkgc2NhbGFyIHByb3BlcnRpZXMKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJuYW1lIjsKKyAgICAgICAgICAgIHNlcnZpY2VGbS5zZXRTZXJ2aWNlTmFtZQorICAgICAgICAgICAgICAgICgoU3RyaW5nKSBtQlNlcnZlci5nZXRBdHRyaWJ1dGUoc25hbWUsIGF0dHJpYnV0ZSkpOworICAgICAgICAgICAgYXR0cmlidXRlID0gIm5hbWUiOworICAgICAgICAgICAgc2VydmljZUZtLnNldEVuZ2luZU5hbWUKKyAgICAgICAgICAgICAgICAoKFN0cmluZykgbUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKGVuYW1lLCBhdHRyaWJ1dGUpKTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJkZWZhdWx0SG9zdCI7CisgICAgICAgICAgICBzZXJ2aWNlRm0uc2V0RGVmYXVsdEhvc3QKKyAgICAgICAgICAgICAgICAoKFN0cmluZykgbUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKGVuYW1lLCBhdHRyaWJ1dGUpKTsKKworICAgICAgICAgICAgLy8gQnVpbGQgdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIGhvc3RzCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAiaG9zdHMiOworICAgICAgICAgICAgQXJyYXlMaXN0IGhvc3RzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICAgICAgaG9zdHMuYWRkKG5ldyBMYWJlbFZhbHVlQmVhbgorICAgICAgICAgICAgICAgICAgICAgIChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJsaXN0Lm5vbmUiKSwgIiIpKTsKKyAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZW1zID0gTGlzdHMuZ2V0SG9zdHMobUJTZXJ2ZXIsIHNuYW1lKS5pdGVyYXRvcigpOworICAgICAgICAgICAgd2hpbGUgKGl0ZW1zLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgaG5hbWUgPSBuZXcgT2JqZWN0TmFtZSgoU3RyaW5nKSBpdGVtcy5uZXh0KCkpOworICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gaG5hbWUuZ2V0S2V5UHJvcGVydHkoImhvc3QiKTsKKyAgICAgICAgICAgICAgICBpZiAobmFtZSE9bnVsbCkgeworICAgICAgICAgICAgICAgICAgICBob3N0cy5hZGQobmV3IExhYmVsVmFsdWVCZWFuKG5hbWUsIG5hbWUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXJ2aWNlRm0uc2V0SG9zdE5hbWVWYWxzKGhvc3RzKTsKKworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZworICAgICAgICAgICAgICAgIChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5hdHRyaWJ1dGUuZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlKSwgdCk7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsCisgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmF0dHJpYnV0ZS5nZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUpKTsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIEZvcndhcmQgdG8gdGhlIHNlcnZpY2UgZGlzcGxheSBwYWdlCisgICAgICAgIHJldHVybiAobWFwcGluZy5maW5kRm9yd2FyZCgiU2VydmljZSIpKTsKKyAgICAgICAgCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9zZXJ2aWNlL1NhdmVTZXJ2aWNlQWN0aW9uLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vc2VydmljZS9TYXZlU2VydmljZUFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwN2YzYjAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vc2VydmljZS9TYXZlU2VydmljZUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzU4IEBACisvKgorICogQ29weXJpZ2h0IDIwMDEtMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5zZXJ2aWNlOworCisKK2ltcG9ydCBqYXZhLm5ldC5VUkxFbmNvZGVyOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LkF0dHJpYnV0ZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXJGYWN0b3J5OworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuUXVlcnlFeHA7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5RdWVyeTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdEluc3RhbmNlOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LkpNRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25FcnJvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRXJyb3JzOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3J3YXJkOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLnV0aWwuTWVzc2FnZVJlc291cmNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5BcHBsaWNhdGlvblNlcnZsZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uTGlzdHM7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uVG9tY2F0VHJlZUJ1aWxkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uVHJlZUNvbnRyb2w7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uVHJlZUNvbnRyb2xOb2RlOworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnZhbHZlLlZhbHZlVXRpbDsKKworCisKKy8qKgorICogVGhlIDxjb2RlPkFjdGlvbjwvY29kZT4gdGhhdCBjb21wbGV0ZXMgPGVtPkFkZCBTZXJ2aWNlPC9lbT4gYW5kCisgKiA8ZW0+RWRpdCBTZXJ2aWNlPC9lbT4gdHJhbnNhY3Rpb25zLgorICoKKyAqIEBhdXRob3IgTWFudmVlbiBLYXVyCisgKiBAYXV0aG9yIEFteSBSb2gKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIFNhdmVTZXJ2aWNlQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFNpZ25hdHVyZSBmb3IgdGhlIDxjb2RlPmNyZWF0ZVN0YW5kYXJkRW5naW5lPC9jb2RlPiBvcGVyYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgY3JlYXRlU3RhbmRhcmRFbmdpbmVUeXBlc1tdID0KKyAgICB7ICJqYXZhLmxhbmcuU3RyaW5nIiwgICAgIC8vIHBhcmVudAorICAgICAgImphdmEubGFuZy5TdHJpbmciLCAgICAgLy8gbmFtZQorICAgICAgImphdmEubGFuZy5TdHJpbmciLCAgICAgLy8gZGVmYXVsdEhvc3QKKyAgICB9OworCisKKyAgICAvKioKKyAgICAgKiBTaWduYXR1cmUgZm9yIHRoZSA8Y29kZT5jcmVhdGVTdGFuZGFyZFNlcnZpY2U8L2NvZGU+IG9wZXJhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBjcmVhdGVTdGFuZGFyZFNlcnZpY2VUeXBlc1tdID0KKyAgICB7ICJqYXZhLmxhbmcuU3RyaW5nIiwgICAgIC8vIHBhcmVudAorICAgICAgImphdmEubGFuZy5TdHJpbmciLCAgICAgLy8gbmFtZQorICAgICAgImphdmEubGFuZy5TdHJpbmciICAgICAgLy8gZG9tYWluCisgICAgfTsKKworCisgICAgLyoqCisgICAgICogU2lnbmF0dXJlIGZvciB0aGUgPGNvZGU+Y3JlYXRlU3RhbmRhcmRFbmdpbmVTZXJ2aWNlPC9jb2RlPiBvcGVyYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgY3JlYXRlU3RhbmRhcmRFbmdpbmVTZXJ2aWNlVHlwZXNbXSA9CisgICAgeyAiamF2YS5sYW5nLlN0cmluZyIsICAgICAvLyBwYXJlbnQKKyAgICAgICJqYXZhLmxhbmcuU3RyaW5nIiwgICAgIC8vIGVuZ2luZU5hbWUKKyAgICAgICJqYXZhLmxhbmcuU3RyaW5nIiwgICAgIC8vIGRlZmF1bHRIb3N0CisgICAgICAiamF2YS5sYW5nLlN0cmluZyIgICAgICAvLyBzZXJ2aWNlTmFtZQorICAgIH07CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogU2lnbmF0dXJlIGZvciB0aGUgPGNvZGU+Y3JlYXRlVXNlckRhdGFiYXNlUmVhbG08L2NvZGU+IG9wZXJhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBjcmVhdGVVc2VyRGF0YWJhc2VSZWFsbVR5cGVzW10gPQorICAgIHsgImphdmEubGFuZy5TdHJpbmciLCAgICAgLy8gcGFyZW50CisgICAgICAiamF2YS5sYW5nLlN0cmluZyIsICAgICAvLyBuYW1lCisgICAgfTsKKworCisgICAgLyoqCisgICAgICogVGhlIE1CZWFuU2VydmVyIHdlIHdpbGwgYmUgaW50ZXJhY3Rpbmcgd2l0aC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1CZWFuU2VydmVyIG1CU2VydmVyID0gbnVsbDsKKyAgICAKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIHNwZWNpZmllZCBIVFRQIHJlcXVlc3QsIGFuZCBjcmVhdGUgdGhlIGNvcnJlc3BvbmRpbmcgSFRUUAorICAgICAqIHJlc3BvbnNlIChvciBmb3J3YXJkIHRvIGFub3RoZXIgd2ViIGNvbXBvbmVudCB0aGF0IHdpbGwgY3JlYXRlIGl0KS4KKyAgICAgKiBSZXR1cm4gYW4gPGNvZGU+QWN0aW9uRm9yd2FyZDwvY29kZT4gaW5zdGFuY2UgZGVzY3JpYmluZyB3aGVyZSBhbmQgaG93CisgICAgICogY29udHJvbCBzaG91bGQgYmUgZm9yd2FyZGVkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcmVzcG9uc2UgaGFzCisgICAgICogYWxyZWFkeSBiZWVuIGNvbXBsZXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBBY3Rpb25NYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gYWN0aW9uRm9ybSBUaGUgb3B0aW9uYWwgQWN0aW9uRm9ybSBiZWFuIGZvciB0aGlzIHJlcXVlc3QgKGlmIGFueSkKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgSFRUUCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBIVFRQIHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBleGNlcHRpb24gb2NjdXJzCisgICAgICovCisgICAgcHVibGljIEFjdGlvbkZvcndhcmQgcGVyZm9ybShBY3Rpb25NYXBwaW5nIG1hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb25Gb3JtIGZvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisgICAgICAgIAorICAgICAgICAvLyBBY3F1aXJlIHRoZSByZXNvdXJjZXMgdGhhdCB3ZSBuZWVkCisgICAgICAgIEh0dHBTZXNzaW9uIHNlc3Npb24gPSByZXF1ZXN0LmdldFNlc3Npb24oKTsKKyAgICAgICAgTG9jYWxlIGxvY2FsZSA9IGdldExvY2FsZShyZXF1ZXN0KTsKKyAgICAgICAgTWVzc2FnZVJlc291cmNlcyByZXNvdXJjZXMgPSBnZXRSZXNvdXJjZXMocmVxdWVzdCk7CisgICAgICAgIAorICAgICAgICAvLyBBY3F1aXJlIGEgcmVmZXJlbmNlIHRvIHRoZSBNQmVhblNlcnZlciBjb250YWluaW5nIG91ciBNQmVhbnMKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1CU2VydmVyID0gKChBcHBsaWNhdGlvblNlcnZsZXQpIGdldFNlcnZsZXQoKSkuZ2V0U2VydmVyKCk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbgorICAgICAgICAgICAgKCJDYW5ub3QgYWNxdWlyZSBNQmVhblNlcnZlciByZWZlcmVuY2UiLCB0KTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gSWRlbnRpZnkgdGhlIHJlcXVlc3RlZCBhY3Rpb24KKyAgICAgICAgU2VydmljZUZvcm0gc2Zvcm0gPSAoU2VydmljZUZvcm0pIGZvcm07CisgICAgICAgIFN0cmluZyBhZG1pbkFjdGlvbiA9IHNmb3JtLmdldEFkbWluQWN0aW9uKCk7CisgICAgICAgIFN0cmluZyBzT2JqZWN0TmFtZSA9IHNmb3JtLmdldE9iamVjdE5hbWUoKTsKKyAgICAgICAgU3RyaW5nIGVPYmplY3ROYW1lID0gc2Zvcm0uZ2V0RW5naW5lT2JqZWN0TmFtZSgpOworICAgICAgICBTdHJpbmcgc2VydmVyT2JqZWN0TmFtZSA9IHNmb3JtLmdldFNlcnZlck9iamVjdE5hbWUoKTsKKyAgICAgICAgT2JqZWN0TmFtZSBlb25hbWUgPSBudWxsOworICAgICAgICBPYmplY3ROYW1lIHNvbmFtZSA9IG51bGw7CisgICAgICAgIC8vIFBlcmZvcm0gYSAiQ3JlYXRlIFNlcnZpY2UiIHRyYW5zYWN0aW9uIChpZiByZXF1ZXN0ZWQpCisgICAgICAgIGlmICgiQ3JlYXRlIi5lcXVhbHMoYWRtaW5BY3Rpb24pKSB7CisKKyAgICAgICAgICAgIFN0cmluZyBvcGVyYXRpb24gPSBudWxsOworICAgICAgICAgICAgU3RyaW5nIHZhbHVlc1tdID0gbnVsbDsKKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAvLyBlbmdpbmUgbmFtZSBpcyBkb21haW4KKyAgICAgICAgICAgICAgICBTdHJpbmcgZW5naW5lTmFtZSA9IHNmb3JtLmdldEVuZ2luZU5hbWUoKTsKKyAgICAgICAgICAgICAgICAvL1N0cmluZyBkb21haW4gPSAobmV3IE9iamVjdE5hbWUoc2VydmVyT2JqZWN0TmFtZSkpLmdldERvbWFpbigpOworICAgICAgICAgICAgICAgIC8vIEVuc3VyZSB0aGF0IHRoZSByZXF1ZXN0ZWQgc2VydmljZSBuYW1lIGlzIHVuaXF1ZQorICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPQorICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0TmFtZSgiKiIgKyBUb21jYXRUcmVlQnVpbGRlci5TRVJWSUNFX1RZUEUgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIixzZXJ2aWNlTmFtZT0iK3Nmb3JtLmdldFNlcnZpY2VOYW1lKCkpOworICAgICAgICAgICAgICAgIEl0ZXJhdG9yIG5hbWVzID0gbUJTZXJ2ZXIucXVlcnlOYW1lcyhvbmFtZSwgbnVsbCkuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAobmFtZXMuaGFzTmV4dCgpKSB7ICAgICAgIAorICAgICAgICAgICAgICAgICAgICBpZiAobUJTZXJ2ZXIuaXNSZWdpc3RlcmVkKChPYmplY3ROYW1lKW5hbWVzLm5leHQoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbkVycm9ycyBlcnJvcnMgPSBuZXcgQWN0aW9uRXJyb3JzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKCJzZXJ2aWNlTmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFjdGlvbkVycm9yKCJlcnJvci5zZXJ2aWNlTmFtZS5leGlzdHMiKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzYXZlRXJyb3JzKHJlcXVlc3QsIGVycm9ycyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG5ldyBBY3Rpb25Gb3J3YXJkKG1hcHBpbmcuZ2V0SW5wdXQoKSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIG9uYW1lID0gbmV3IE9iamVjdE5hbWUoZW5naW5lTmFtZSArIFRvbWNhdFRyZWVCdWlsZGVyLkVOR0lORV9UWVBFKTsKKyAgICAgICAgICAgICAgICBpZiAobUJTZXJ2ZXIuaXNSZWdpc3RlcmVkKG9uYW1lKSkgeworICAgICAgICAgICAgICAgICAgICBBY3Rpb25FcnJvcnMgZXJyb3JzID0gbmV3IEFjdGlvbkVycm9ycygpOworICAgICAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKCJzZXJ2aWNlTmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFjdGlvbkVycm9yKCJlcnJvci5lbmdpbmVOYW1lLmV4aXN0cyIpKTsKKyAgICAgICAgICAgICAgICAgICAgc2F2ZUVycm9ycyhyZXF1ZXN0LCBlcnJvcnMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG5ldyBBY3Rpb25Gb3J3YXJkKG1hcHBpbmcuZ2V0SW5wdXQoKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBMb29rIHVwIG91ciBNQmVhbkZhY3RvcnkgTUJlYW4KKyAgICAgICAgICAgICAgICBPYmplY3ROYW1lIGZuYW1lID0gVG9tY2F0VHJlZUJ1aWxkZXIuZ2V0TUJlYW5GYWN0b3J5KCk7CisKKyAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgU3RhbmRhcmRTZXJ2aWNlIGFuZCBTdGFuZGFyZEVuZ2luZSBvYmplY3QKKyAgICAgICAgICAgICAgICB2YWx1ZXMgPSBuZXcgU3RyaW5nWzRdOworICAgICAgICAgICAgICAgIHZhbHVlc1swXSA9IFRvbWNhdFRyZWVCdWlsZGVyLlNFUlZFUl9UWVBFOworICAgICAgICAgICAgICAgIHZhbHVlc1sxXSA9IGVuZ2luZU5hbWU7CisgICAgICAgICAgICAgICAgdmFsdWVzWzJdID0gc2Zvcm0uZ2V0RGVmYXVsdEhvc3QoKTsKKyAgICAgICAgICAgICAgICB2YWx1ZXNbM10gPSBzZm9ybS5nZXRTZXJ2aWNlTmFtZSgpOworICAgICAgICAgICAgICAgIG9wZXJhdGlvbiA9ICJjcmVhdGVTdGFuZGFyZEVuZ2luZVNlcnZpY2UiOworICAgICAgICAgICAgICAgIFZlY3RvciBvbmFtZXMgPSAoVmVjdG9yKQorICAgICAgICAgICAgICAgICAgICBtQlNlcnZlci5pbnZva2UoZm5hbWUsIG9wZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcywgY3JlYXRlU3RhbmRhcmRFbmdpbmVTZXJ2aWNlVHlwZXMpOworICAgICAgICAgICAgICAgIGVvbmFtZSA9IChPYmplY3ROYW1lKW9uYW1lcy5nZXQoMCk7CisgICAgICAgICAgICAgICAgc29uYW1lID0gKE9iamVjdE5hbWUpb25hbWVzLmdldCgxKTsKKyAgICAgICAgICAgICAgICBzT2JqZWN0TmFtZSA9IHNvbmFtZS50b1N0cmluZygpOworICAgICAgICAgICAgICAgIGVPYmplY3ROYW1lID0gZW9uYW1lLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgU3RyaW5nIHJlYWxtT05hbWUgPSBWYWx2ZVV0aWwuZ2V0T2JqZWN0TmFtZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVPYmplY3ROYW1lLCBUb21jYXRUcmVlQnVpbGRlci5SRUFMTV9UWVBFKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgcm9uYW1lID0gbmV3IE9iamVjdE5hbWUocmVhbG1PTmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKG1CU2VydmVyLmlzUmVnaXN0ZXJlZChyb25hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIG1CU2VydmVyLnVucmVnaXN0ZXJNQmVhbihyb25hbWUpOyAKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IFVzZXJEYXRhYmFzZVJlYWxtIG9iamVjdAorICAgICAgICAgICAgICAgIHZhbHVlcyA9IG5ldyBTdHJpbmdbMl07CisgICAgICAgICAgICAgICAgdmFsdWVzWzBdID0gZU9iamVjdE5hbWU7CisgICAgICAgICAgICAgICAgdmFsdWVzWzFdID0gIlVzZXJEYXRhYmFzZSI7CisgICAgICAgICAgICAgICAgb3BlcmF0aW9uID0gImNyZWF0ZVVzZXJEYXRhYmFzZVJlYWxtIjsKKyAgICAgICAgICAgICAgICAvL3JlYWxtT05hbWUgPSAoU3RyaW5nKQorICAgICAgICAgICAgICAgIC8vICAgIG1CU2VydmVyLmludm9rZShmbmFtZSwgb3BlcmF0aW9uLAorICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICB2YWx1ZXMsIGNyZWF0ZVVzZXJEYXRhYmFzZVJlYWxtVHlwZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy9FbnVtZXJhdGlvbiBlbnVtID0gb25hbWVzLmVsZW1lbnRzKCk7CisgICAgICAgICAgICAgICAgLy93aGlsZSAoZW51bS5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgIC8vICAgIGdldFNlcnZsZXQoKS5sb2coInNhdmUgc2VydmljZSAiK2VudW0ubmV4dEVsZW1lbnQoKSk7CisgICAgICAgICAgICAgICAgLy99CisgICAgICAgICAgICAgICAgc09iamVjdE5hbWUgPSBzb25hbWUudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBlT2JqZWN0TmFtZSA9IGVvbmFtZS50b1N0cmluZygpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBTdGFuZGFyZFNlcnZpY2Ugb2JqZWN0CisgICAgICAgICAgICAgICAgLy92YWx1ZXMgPSBuZXcgU3RyaW5nWzNdOworICAgICAgICAgICAgICAgIC8vdmFsdWVzWzBdID0gVG9tY2F0VHJlZUJ1aWxkZXIuU0VSVkVSX1RZUEU7CisgICAgICAgICAgICAgICAgLy92YWx1ZXNbMV0gPSBzZm9ybS5nZXRTZXJ2aWNlTmFtZSgpOworICAgICAgICAgICAgICAgIC8vdmFsdWVzWzJdID0gZW5naW5lTmFtZTsKKyAgICAgICAgICAgICAgICAvL29wZXJhdGlvbiA9ICJjcmVhdGVTdGFuZGFyZFNlcnZpY2UiOworICAgICAgICAgICAgICAgIC8vc09iamVjdE5hbWUgPSAoU3RyaW5nKQorICAgICAgICAgICAgICAgIC8vICAgIG1CU2VydmVyLmludm9rZShmbmFtZSwgb3BlcmF0aW9uLAorICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICB2YWx1ZXMsIGNyZWF0ZVN0YW5kYXJkU2VydmljZVR5cGVzKTsKKworICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBTdGFuZGFyZEVuZ2luZSBvYmplY3QKKyAgICAgICAgICAgICAgICAvL3ZhbHVlcyA9IG5ldyBTdHJpbmdbM107CisgICAgICAgICAgICAgICAgLy92YWx1ZXNbMF0gPSBzT2JqZWN0TmFtZTsKKyAgICAgICAgICAgICAgICAvL3ZhbHVlc1sxXSA9IHNmb3JtLmdldEVuZ2luZU5hbWUoKTsKKyAgICAgICAgICAgICAgICAvL3ZhbHVlc1syXSA9IHNmb3JtLmdldERlZmF1bHRIb3N0KCk7CisgICAgICAgICAgICAgICAgLy9pZiAoIiIuZXF1YWxzKHZhbHVlc1syXSkpIHsKKyAgICAgICAgICAgICAgICAvLyAgICB2YWx1ZXNbMl0gPSBudWxsOworICAgICAgICAgICAgICAgIC8vfQorICAgICAgICAgICAgICAgIC8vb3BlcmF0aW9uID0gImNyZWF0ZVN0YW5kYXJkRW5naW5lIjsKKyAgICAgICAgICAgICAgICAvL2VPYmplY3ROYW1lID0gKFN0cmluZykKKyAgICAgICAgICAgICAgICAvLyAgICBtQlNlcnZlci5pbnZva2UoZm5hbWUsIG9wZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgdmFsdWVzLCBjcmVhdGVTdGFuZGFyZEVuZ2luZVR5cGVzKTsKKworICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgbmV3IFNlcnZpY2UgdG8gb3VyIHRyZWUgY29udHJvbCBub2RlCisgICAgICAgICAgICAgICAgVHJlZUNvbnRyb2wgY29udHJvbCA9IChUcmVlQ29udHJvbCkKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRBdHRyaWJ1dGUoInRyZWVDb250cm9sVGVzdCIpOworICAgICAgICAgICAgICAgIGlmIChjb250cm9sICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhcmVudE5hbWUgPSBUb21jYXRUcmVlQnVpbGRlci5ERUZBVUxUX0RPTUFJTiArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb21jYXRUcmVlQnVpbGRlci5TRVJWRVJfVFlQRTsKKyAgICAgICAgICAgICAgICAgICAgVHJlZUNvbnRyb2xOb2RlIHBhcmVudE5vZGUgPSBjb250cm9sLmZpbmROb2RlKHBhcmVudE5hbWUpOworICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50Tm9kZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbm9kZUxhYmVsID0gcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2VydmVyLnNlcnZpY2UudHJlZUJ1aWxkZXIuc3VidHJlZU5vZGUiKSArIiAoIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29uYW1lLmdldEtleVByb3BlcnR5KCJzZXJ2aWNlTmFtZSIpICsgIikiOworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVuY29kZWROYW1lID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShzT2JqZWN0TmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBUcmVlQ29udHJvbE5vZGUgY2hpbGROb2RlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVHJlZUNvbnRyb2xOb2RlKHNPYmplY3ROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNlcnZpY2UuZ2lmIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVMYWJlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFZGl0U2VydmljZS5kbz9zZWxlY3Q9IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250ZW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsIGVuZ2luZU5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50Tm9kZS5hZGRDaGlsZChjaGlsZE5vZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRyZWUgdG8gZGlzcGxheSB0aGUgbmV3bHkgYWRkZWQgcmVhbG0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vSXRlcmF0b3IgcmVhbG1OYW1lcyA9CisgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBMaXN0cy5nZXRSZWFsbXMobUJTZXJ2ZXIsIHNPYmplY3ROYW1lKS5pdGVyYXRvcigpOworICAgICAgICAgICAgICAgICAgICAgICAgLy93aGlsZSAocmVhbG1OYW1lcy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIFN0cmluZyByZWFsbU5hbWUgPSAoU3RyaW5nKSByZWFsbU5hbWVzLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIE9iamVjdE5hbWUgb2JqZWN0TmFtZSA9IG5ldyBPYmplY3ROYW1lKHJlYWxtTmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBub2RlTGFiZWwgPSAiUmVhbG0gZm9yIHNlcnZpY2UgKCIgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgc2Zvcm0uZ2V0U2VydmljZU5hbWUoKSArICIpIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIFRyZWVDb250cm9sTm9kZSByZWFsbU5vZGUgPQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgIG5ldyBUcmVlQ29udHJvbE5vZGUocmVhbG1OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlYWxtLmdpZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlTGFiZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRWRpdFJlYWxtLmRvP3NlbGVjdD0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHJlYWxtTmFtZSkgKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiZub2RlTGFiZWw9IiArCisgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShub2RlTGFiZWwpLAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRlbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGVuZ2luZU5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgY2hpbGROb2RlLmFkZENoaWxkKHJlYWxtTm9kZSk7ICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAvL30gICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIC0gZm9yY2UgYSByZWRpc3BsYXkKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIkNhbm5vdCBmaW5kIHBhcmVudCBub2RlICciICsgcGFyZW50TmFtZSArICInIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nCisgICAgICAgICAgICAgICAgICAgICAgICAoIkNhbm5vdCBmaW5kIFRyZWVDb250cm9sTm9kZSEiKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisKKyAgICAgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nCisgICAgICAgICAgICAgICAgICAgIChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5pbnZva2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uKSwgZSk7CisgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmludm9rZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24pKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKG51bGwpOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIC8vIFBlcmZvcm0gYXR0cmlidXRlIHVwZGF0ZXMgYXMgcmVxdWVzdGVkCisgICAgICAgIFN0cmluZyBhdHRyaWJ1dGUgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAKKyAgICAgICAgICAgIGVvbmFtZSA9IG5ldyBPYmplY3ROYW1lKGVPYmplY3ROYW1lKTsKKyAgICAgICAgICAgIHNvbmFtZSA9IG5ldyBPYmplY3ROYW1lKHNPYmplY3ROYW1lKTsKKworICAgICAgICAgICAgYXR0cmlidXRlID0gImRlZmF1bHRIb3N0IjsKKyAgICAgICAgICAgIFN0cmluZyBkZWZhdWx0SG9zdCA9IHNmb3JtLmdldERlZmF1bHRIb3N0KCk7CisgICAgICAgICAgICBpZiAoIiIuZXF1YWxzKGRlZmF1bHRIb3N0KSkgeworICAgICAgICAgICAgICAgIGRlZmF1bHRIb3N0ID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1CU2VydmVyLnNldEF0dHJpYnV0ZShlb25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZSgiZGVmYXVsdEhvc3QiLCBkZWZhdWx0SG9zdCkpOworCisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisKKyAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuYXR0cmlidXRlLnNldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSksIGUpOworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5hdHRyaWJ1dGUuc2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlKSk7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBGb3J3YXJkIHRvIHRoZSBzdWNjZXNzIHJlcG9ydGluZyBwYWdlCisgICAgICAgIHNlc3Npb24ucmVtb3ZlQXR0cmlidXRlKG1hcHBpbmcuZ2V0QXR0cmlidXRlKCkpOworICAgICAgICByZXR1cm4gKG1hcHBpbmcuZmluZEZvcndhcmQoIlNhdmUgU3VjY2Vzc2Z1bCIpKTsKKyAgICAgICAgCisgICAgfQorICAgIAorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3NlcnZpY2UvU2VydmljZUZvcm0uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9zZXJ2aWNlL1NlcnZpY2VGb3JtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE0NjMxOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi9zZXJ2aWNlL1NlcnZpY2VGb3JtLmphdmEKQEAgLTAsMCArMSwzNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnNlcnZpY2U7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25FcnJvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRXJyb3JzOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEZvcm0gYmVhbiBmb3IgdGhlIHNlcnZpY2UgcGFnZS4KKyAqCisgKiBAYXV0aG9yIE1hbnZlZW4gS2F1cgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgU2VydmljZUZvcm0gZXh0ZW5kcyBBY3Rpb25Gb3JtIHsKKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKyAgICAKKworICAgIC8qKgorICAgICAqIFRoZSBhZG1pbmlzdHJhdGl2ZSBhY3Rpb24gcmVwcmVzZW50ZWQgYnkgdGhpcyBmb3JtLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGFkbWluQWN0aW9uID0gIkVkaXQiOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgb2JqZWN0IG5hbWUgb2YgdGhlIEVuZ2luZSB0aGlzIGJlYW4gcmVmZXJzIHRvLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGVuZ2luZU9iamVjdE5hbWUgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgb2JqZWN0IG5hbWUgb2YgdGhlIFNlcnZpY2UgdGhpcyBiZWFuIHJlZmVycyB0by4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBvYmplY3ROYW1lID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIHRleHQgZm9yIHRoZSBzZXJ2aWNlTmFtZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBzZXJ2aWNlTmFtZSA9IG51bGw7ICAgIAorCisgICAgLyoqCisgICAgICogVGhlIHRleHQgZm9yIHRoZSBzZXJ2ZXJPYmplY3ROYW1lLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHNlcnZlck9iamVjdE5hbWUgPSBudWxsOyAKKyAgICAKKyAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciB0aGUgbm9kZSBsYWJlbC4KKyAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIG5vZGVMYWJlbCA9IG51bGw7IAorICAgIAorICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciB0aGUgZW5naW5lIE5hbWUuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZW5naW5lTmFtZSA9IG51bGw7CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2YgdGhlIHNlcnZpY2UgdGhlIGFkbWluIGFwcCBydW5zIG9uLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGFkbWluU2VydmljZU5hbWUgPSBudWxsOyAgICAKKworICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciB0aGUgZGVmYXVsdEhvc3QgTmFtZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBkZWZhdWx0SG9zdCA9IG51bGw7CisgICAgCisgICAgcHJpdmF0ZSBMaXN0IGhvc3ROYW1lVmFscyA9IG51bGw7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworICAgIAorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBhZG1pbmlzdHJhdGl2ZSBhY3Rpb24gcmVwcmVzZW50ZWQgYnkgdGhpcyBmb3JtLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWRtaW5BY3Rpb24oKSB7CisKKyAgICAgICAgcmV0dXJuIHRoaXMuYWRtaW5BY3Rpb247CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYWRtaW5pc3RyYXRpdmUgYWN0aW9uIHJlcHJlc2VudGVkIGJ5IHRoaXMgZm9ybS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBZG1pbkFjdGlvbihTdHJpbmcgYWRtaW5BY3Rpb24pIHsKKworICAgICAgICB0aGlzLmFkbWluQWN0aW9uID0gYWRtaW5BY3Rpb247CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgb2JqZWN0IG5hbWUgb2YgdGhlIEVuZ2luZSB0aGlzIGJlYW4gcmVmZXJzIHRvLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW5naW5lT2JqZWN0TmFtZSgpIHsKKworICAgICAgICByZXR1cm4gdGhpcy5lbmdpbmVPYmplY3ROYW1lOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG9iamVjdCBuYW1lIG9mIHRoZSBFbmdpbmUgdGhpcyBiZWFuIHJlZmVycyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFbmdpbmVPYmplY3ROYW1lKFN0cmluZyBlbmdpbmVPYmplY3ROYW1lKSB7CisKKyAgICAgICAgdGhpcy5lbmdpbmVPYmplY3ROYW1lID0gZW5naW5lT2JqZWN0TmFtZTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBvYmplY3QgbmFtZSBvZiB0aGUgU2VydmljZSB0aGlzIGJlYW4gcmVmZXJzIHRvLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0T2JqZWN0TmFtZSgpIHsKKworICAgICAgICByZXR1cm4gdGhpcy5vYmplY3ROYW1lOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG9iamVjdCBuYW1lIG9mIHRoZSBTZXJ2aWNlIHRoaXMgYmVhbiByZWZlcnMgdG8uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0T2JqZWN0TmFtZShTdHJpbmcgb2JqZWN0TmFtZSkgeworCisgICAgICAgIHRoaXMub2JqZWN0TmFtZSA9IG9iamVjdE5hbWU7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbGFiZWwgb2YgdGhlIG5vZGUgdGhhdCB3YXMgY2xpY2tlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5vZGVMYWJlbCgpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLm5vZGVMYWJlbDsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgbm9kZSBsYWJlbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXROb2RlTGFiZWwoU3RyaW5nIG5vZGVMYWJlbCkgeworICAgICAgICAKKyAgICAgICAgdGhpcy5ub2RlTGFiZWwgPSBub2RlTGFiZWw7CisgICAgICAgIAorICAgIH0KKyAgICAgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBob3N0IG5hbWUgdmFsdWVzLgorICAgICAqLworICAgIHB1YmxpYyBMaXN0IGdldEhvc3ROYW1lVmFscygpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLmhvc3ROYW1lVmFsczsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgaG9zdE5hbWUgdmFsdWVzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEhvc3ROYW1lVmFscyhMaXN0IGhvc3ROYW1lVmFscykgeworICAgICAgICAKKyAgICAgICAgdGhpcy5ob3N0TmFtZVZhbHMgPSBob3N0TmFtZVZhbHM7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGVuZ2luZU5hbWUuCisgICAgICovCisgICAgCisgICAgcHVibGljIHZvaWQgc2V0RW5naW5lTmFtZShTdHJpbmcgZW5naW5lTmFtZSkgeworICAgICAgICAKKyAgICAgICAgdGhpcy5lbmdpbmVOYW1lID0gZW5naW5lTmFtZTsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZW5naW5lTmFtZS4KKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgU3RyaW5nIGdldEVuZ2luZU5hbWUoKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy5lbmdpbmVOYW1lOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBTZXJ2ZXIgT2JqZWN0TmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFNlcnZlck9iamVjdE5hbWUoKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy5zZXJ2ZXJPYmplY3ROYW1lOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBTZXJ2ZXIgTmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJPYmplY3ROYW1lKFN0cmluZyBzZXJ2ZXJPYmplY3ROYW1lKSB7CisgICAgICAgIAorICAgICAgICB0aGlzLnNlcnZlck9iamVjdE5hbWUgPSBzZXJ2ZXJPYmplY3ROYW1lOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBTZXJ2aWNlIE5hbWUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlTmFtZSgpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLnNlcnZpY2VOYW1lOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBTZXJ2aWNlIE5hbWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2VydmljZU5hbWUoU3RyaW5nIHNlcnZpY2VOYW1lKSB7CisgICAgICAgIAorICAgICAgICB0aGlzLnNlcnZpY2VOYW1lID0gc2VydmljZU5hbWU7CisgICAgICAgIAorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgc2VydmljZSB0aGUgYWRtaW4gYXBwIHJ1bnMgb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRBZG1pblNlcnZpY2VOYW1lKCkgeworCisgICAgICAgIHJldHVybiB0aGlzLmFkbWluU2VydmljZU5hbWU7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG5hbWUgb2YgdGhlIHNlcnZpY2UgdGhlIGFkbWluIGFwcCBydW5zIG9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEFkbWluU2VydmljZU5hbWUoU3RyaW5nIGFkbWluU2VydmljZU5hbWUpIHsKKworICAgICAgICB0aGlzLmFkbWluU2VydmljZU5hbWUgPSBhZG1pblNlcnZpY2VOYW1lOworCisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBkZWZhdWx0IEhvc3QuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0SG9zdCgpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLmRlZmF1bHRIb3N0OworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBkZWZhdWx0IEhvc3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdEhvc3QoU3RyaW5nIGRlZmF1bHRIb3N0KSB7CisKKyAgICAgICAgdGhpcy5kZWZhdWx0SG9zdCA9IGRlZmF1bHRIb3N0OworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXNldCBhbGwgcHJvcGVydGllcyB0byB0aGVpciBkZWZhdWx0IHZhbHVlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBtYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVzZXQoQWN0aW9uTWFwcGluZyBtYXBwaW5nLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICAKKyAgICAgICAgdGhpcy5lbmdpbmVPYmplY3ROYW1lID0gbnVsbDsKKyAgICAgICAgdGhpcy5vYmplY3ROYW1lID0gbnVsbDsKKyAgICAgICAgdGhpcy5zZXJ2aWNlTmFtZSA9IG51bGw7CisgICAgICAgIHRoaXMuZW5naW5lTmFtZSA9IG51bGw7CisgICAgICAgIHRoaXMuYWRtaW5TZXJ2aWNlTmFtZSA9IG51bGw7CisgICAgICAgIHRoaXMuZGVmYXVsdEhvc3QgPSBudWxsOworICAgIH0KKyAgICAKKworICAgIC8qKgorICAgICAqIFJlbmRlciB0aGlzIG9iamVjdCBhcyBhIFN0cmluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIlNlcnZpY2VGb3JtW2FkbWluQWN0aW9uPSIpOworICAgICAgICBzYi5hcHBlbmQoYWRtaW5BY3Rpb24pOworICAgICAgICBzYi5hcHBlbmQoIixkZWZhdWx0SG9zdD0iKTsKKyAgICAgICAgc2IuYXBwZW5kKGRlZmF1bHRIb3N0KTsKKyAgICAgICAgc2IuYXBwZW5kKCIsZW5naW5lTmFtZT0iKTsKKyAgICAgICAgc2IuYXBwZW5kKGVuZ2luZU5hbWUpOworICAgICAgICBzYi5hcHBlbmQoIixlbmdpbmVPYmplY3ROYW1lPSciKTsKKyAgICAgICAgc2IuYXBwZW5kKGVuZ2luZU9iamVjdE5hbWUpOworICAgICAgICBzYi5hcHBlbmQoIicsb2JqZWN0TmFtZT0nIik7CisgICAgICAgIHNiLmFwcGVuZChvYmplY3ROYW1lKTsKKyAgICAgICAgc2IuYXBwZW5kKCInLHNlcnZpY2VOYW1lPSIpOworICAgICAgICBzYi5hcHBlbmQoc2VydmljZU5hbWUpOworICAgICAgICBzYi5hcHBlbmQoIicsc2VydmVyT2JqZWN0TmFtZT0iKTsKKyAgICAgICAgc2IuYXBwZW5kKHNlcnZlck9iamVjdE5hbWUpOworICAgICAgICBzYi5hcHBlbmQoIicsYWRtaW5TZXJ2aWNlTmFtZT0iKTsKKyAgICAgICAgc2IuYXBwZW5kKGFkbWluU2VydmljZU5hbWUpOworICAgICAgICBzYi5hcHBlbmQoIl0iKTsKKyAgICAgICAgcmV0dXJuIChzYi50b1N0cmluZygpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogVmFsaWRhdGUgdGhlIHByb3BlcnRpZXMgdGhhdCBoYXZlIGJlZW4gc2V0IGZyb20gdGhpcyBIVFRQIHJlcXVlc3QsCisgICAgICogYW5kIHJldHVybiBhbiA8Y29kZT5BY3Rpb25FcnJvcnM8L2NvZGU+IG9iamVjdCB0aGF0IGVuY2Fwc3VsYXRlcyBhbnkKKyAgICAgKiB2YWxpZGF0aW9uIGVycm9ycyB0aGF0IGhhdmUgYmVlbiBmb3VuZC4gIElmIG5vIGVycm9ycyBhcmUgZm91bmQsIHJldHVybgorICAgICAqIDxjb2RlPm51bGw8L2NvZGU+IG9yIGFuIDxjb2RlPkFjdGlvbkVycm9yczwvY29kZT4gb2JqZWN0IHdpdGggbm8KKyAgICAgKiByZWNvcmRlZCBlcnJvciBtZXNzYWdlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBtYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICovCisgICAgcHVibGljIEFjdGlvbkVycm9ycyB2YWxpZGF0ZShBY3Rpb25NYXBwaW5nIG1hcHBpbmcsCisgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgCisgICAgICAgIEFjdGlvbkVycm9ycyBlcnJvcnMgPSBuZXcgQWN0aW9uRXJyb3JzKCk7CisgICAgICAgIFN0cmluZyBzdWJtaXQgPSByZXF1ZXN0LmdldFBhcmFtZXRlcigic3VibWl0Iik7CisgICAgICAgIAorICAgICAgICAvL2lmIChzdWJtaXQgIT0gbnVsbCkgeworCisgICAgICAgICAgICBpZiAoKHNlcnZpY2VOYW1lID09IG51bGwpIHx8IChzZXJ2aWNlTmFtZS5sZW5ndGgoKSA8IDEpKSB7CisgICAgICAgICAgICAgICAgZXJyb3JzLmFkZCgic2VydmljZU5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFjdGlvbkVycm9yKCJlcnJvci5zZXJ2aWNlTmFtZS5yZXF1aXJlZCIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKChlbmdpbmVOYW1lID09IG51bGwpIHx8IChlbmdpbmVOYW1lLmxlbmd0aCgpIDwgMSkpIHsKKyAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKCJlbmdpbmVOYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBY3Rpb25FcnJvcigiZXJyb3IuZW5naW5lTmFtZS5yZXF1aXJlZCIpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAvL30KKyAgICAgICAgCisgICAgICAgIHJldHVybiBlcnJvcnM7CisgICAgfQorICAgIAorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3NlcnZpY2UvU2VydmljZXNGb3JtLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vc2VydmljZS9TZXJ2aWNlc0Zvcm0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWZkODhjCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3NlcnZpY2UvU2VydmljZXNGb3JtLmphdmEKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnNlcnZpY2U7CisKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CisKKworLyoqCisgKiBGb3JtIGJlYW4gZm9yIGRlbGV0aW5nIHNlcnZpY2VzLgorICoKKyAqIEBhdXRob3IgTWFudmVlbiBLYXVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBTZXJ2aWNlc0Zvcm0gZXh0ZW5kcyBBY3Rpb25Gb3JtIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBvYmplY3QgbmFtZXMgb2YgdGhlIHNlcnZpY2VzIHRvIGJlIGRlbGV0ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgc2VydmljZXNbXSA9IG5ldyBTdHJpbmdbMF07CisKKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0U2VydmljZXMoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5zZXJ2aWNlcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U2VydmljZXMoU3RyaW5nIHNlcnZpY2VzW10pIHsKKyAgICAgICAgdGhpcy5zZXJ2aWNlcyA9IHNlcnZpY2VzOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJlc2V0IGFsbCBwcm9wZXJ0aWVzIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIG1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZXNldChBY3Rpb25NYXBwaW5nIG1hcHBpbmcsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisKKyAgICAgICAgdGhpcy5zZXJ2aWNlcyA9IG5ldyBTdHJpbmdbMF07CisKKyAgICB9CisgICAgICAgIAorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vdXNlcnMvQmFzZUZvcm0uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi91c2Vycy9CYXNlRm9ybS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4YzUxYzMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vdXNlcnMvQmFzZUZvcm0uamF2YQpAQCAtMCwwICsxLDEyNCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnVzZXJzOworCisKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRXJyb3I7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkVycm9yczsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9ybTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKKworCisvKioKKyAqIEJhc2UgY2xhc3MgZm9yIGZvcm0gYmVhbnMgZm9yIHRoZSB1c2VyIGFkbWluaXN0cmF0aW9uCisgKiBvcHRpb25zLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqIEBzaW5jZSA0LjEKKyAqLworCitwdWJsaWMgY2xhc3MgQmFzZUZvcm0gZXh0ZW5kcyBBY3Rpb25Gb3JtIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgTUJlYW4gTmFtZSBvZiBVc2VyRGF0YWJhc2UgY29udGFpbmluZyB0aGlzIG9iamVjdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBkYXRhYmFzZU5hbWUgPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXREYXRhYmFzZU5hbWUoKSB7CisgICAgICAgIGlmICgodGhpcy5kYXRhYmFzZU5hbWUgPT0gbnVsbCkgJiYgKHRoaXMub2JqZWN0TmFtZSAhPSBudWxsKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0gbmV3IE9iamVjdE5hbWUodGhpcy5vYmplY3ROYW1lKTsKKyAgICAgICAgICAgICAgICB0aGlzLmRhdGFiYXNlTmFtZSA9IG9uYW1lLmdldERvbWFpbigpICsgIjoiICsKKyAgICAgICAgICAgICAgICAgICJ0eXBlPVVzZXJEYXRhYmFzZSxkYXRhYmFzZT0iICsKKyAgICAgICAgICAgICAgICAgIG9uYW1lLmdldEtleVByb3BlcnR5KCJkYXRhYmFzZSIpOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICB0aGlzLmRhdGFiYXNlTmFtZSA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICh0aGlzLmRhdGFiYXNlTmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RGF0YWJhc2VOYW1lKFN0cmluZyBkYXRhYmFzZU5hbWUpIHsKKyAgICAgICAgaWYgKChkYXRhYmFzZU5hbWUgIT0gbnVsbCkgJiYgKGRhdGFiYXNlTmFtZS5sZW5ndGgoKSA8IDEpKSB7CisgICAgICAgICAgICB0aGlzLmRhdGFiYXNlTmFtZSA9IG51bGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aGlzLmRhdGFiYXNlTmFtZSA9IGRhdGFiYXNlTmFtZTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIG5vZGUgbGFiZWwgdG8gYmUgZGlzcGxheWVkIGluIHRoZSB1c2VyIGludGVyZmFjZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBub2RlTGFiZWwgPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXROb2RlTGFiZWwoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5ub2RlTGFiZWwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE5vZGVMYWJlbChTdHJpbmcgbm9kZUxhYmVsKSB7CisgICAgICAgIHRoaXMubm9kZUxhYmVsID0gbm9kZUxhYmVsOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIE1CZWFuIG9iamVjdCBuYW1lIG9mIHRoaXMgb2JqZWN0LiAgQSBudWxsIG9yIHplcm8tbGVuZ3RoCisgICAgICogdmFsdWUgaW5kaWNhdGVzIHRoYXQgdGhpcyBpcyBhIG5ldyBvYmplY3QuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgb2JqZWN0TmFtZSA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE9iamVjdE5hbWUoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5vYmplY3ROYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRPYmplY3ROYW1lKFN0cmluZyBvYmplY3ROYW1lKSB7CisgICAgICAgIGlmICgob2JqZWN0TmFtZSAhPSBudWxsKSAmJiAob2JqZWN0TmFtZS5sZW5ndGgoKSA8IDEpKSB7CisgICAgICAgICAgICB0aGlzLm9iamVjdE5hbWUgPSBudWxsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhpcy5vYmplY3ROYW1lID0gb2JqZWN0TmFtZTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKyAgICAvKioKKyAgICAgKiBSZXNldCBhbGwgcHJvcGVydGllcyB0byB0aGVpciBkZWZhdWx0IHZhbHVlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBtYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVzZXQoQWN0aW9uTWFwcGluZyBtYXBwaW5nLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworCisgICAgICAgIGRhdGFiYXNlTmFtZSA9IG51bGw7CisgICAgICAgIG5vZGVMYWJlbCA9IG51bGw7CisgICAgICAgIG9iamVjdE5hbWUgPSBudWxsOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi91c2Vycy9EZWxldGVHcm91cHNBY3Rpb24uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi91c2Vycy9EZWxldGVHcm91cHNBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjQzOGU0Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3VzZXJzL0RlbGV0ZUdyb3Vwc0FjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTc3IEBACisvKgorICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi51c2VyczsKKworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25FcnJvcnM7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcndhcmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5BdHRyaWJ1dGU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyRmFjdG9yeTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LlF1ZXJ5RXhwOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuUXVlcnk7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3RJbnN0YW5jZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5KTUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuQXR0cmlidXRlSW5mbzsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuT3BlcmF0aW9uSW5mbzsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuSW5mbzsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy51dGlsLk1lc3NhZ2VSZXNvdXJjZXM7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uQXBwbGljYXRpb25TZXJ2bGV0OworCisKKy8qKgorICogPHA+SW1wbGVtZW50YXRpb24gb2YgPHN0cm9uZz5BY3Rpb248L3N0cm9uZz4gdGhhdCBkZWxldGVzIHRoZQorICogc3BlY2lmaWVkIHNldCBvZiBncm91cHMuPC9wPgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqIEBzaW5jZSA0LjEKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgRGVsZXRlR3JvdXBzQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBNQmVhblNlcnZlciB3ZSB3aWxsIGJlIGludGVyYWN0aW5nIHdpdGguCisgICAgICovCisgICAgcHJpdmF0ZSBNQmVhblNlcnZlciBtc2VydmVyID0gbnVsbDsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIHNwZWNpZmllZCBIVFRQIHJlcXVlc3QsIGFuZCBjcmVhdGUgdGhlIGNvcnJlc3BvbmRpbmcgSFRUUAorICAgICAqIHJlc3BvbnNlIChvciBmb3J3YXJkIHRvIGFub3RoZXIgd2ViIGNvbXBvbmVudCB0aGF0IHdpbGwgY3JlYXRlIGl0KS4KKyAgICAgKiBSZXR1cm4gYW4gPGNvZGU+QWN0aW9uRm9yd2FyZDwvY29kZT4gaW5zdGFuY2UgZGVzY3JpYmluZyB3aGVyZSBhbmQgaG93CisgICAgICogY29udHJvbCBzaG91bGQgYmUgZm9yd2FyZGVkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcmVzcG9uc2UgaGFzCisgICAgICogYWxyZWFkeSBiZWVuIGNvbXBsZXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBBY3Rpb25NYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gYWN0aW9uRm9ybSBUaGUgb3B0aW9uYWwgQWN0aW9uRm9ybSBiZWFuIGZvciB0aGlzIHJlcXVlc3QgKGlmIGFueSkKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgSFRUUCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBIVFRQIHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBleGNlcHRpb24gb2NjdXJzCisgICAgICovCisgICAgcHVibGljIEFjdGlvbkZvcndhcmQgcGVyZm9ybShBY3Rpb25NYXBwaW5nIG1hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb25Gb3JtIGZvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gTG9vayB1cCB0aGUgY29tcG9uZW50cyB3ZSB3aWxsIGJlIHVzaW5nIGFzIG5lZWRlZAorICAgICAgICBpZiAobXNlcnZlciA9PSBudWxsKSB7CisgICAgICAgICAgICBtc2VydmVyID0gKChBcHBsaWNhdGlvblNlcnZsZXQpIGdldFNlcnZsZXQoKSkuZ2V0U2VydmVyKCk7CisgICAgICAgIH0KKyAgICAgICAgTWVzc2FnZVJlc291cmNlcyByZXNvdXJjZXMgPSBnZXRSZXNvdXJjZXMocmVxdWVzdCk7CisgICAgICAgIEh0dHBTZXNzaW9uIHNlc3Npb24gPSByZXF1ZXN0LmdldFNlc3Npb24oKTsKKyAgICAgICAgTG9jYWxlIGxvY2FsZSA9IGdldExvY2FsZShyZXF1ZXN0KTsKKworICAgICAgICAvLyBIYXMgdGhpcyB0cmFuc2FjdGlvbiBiZWVuIGNhbmNlbGxlZD8KKyAgICAgICAgaWYgKGlzQ2FuY2VsbGVkKHJlcXVlc3QpKSB7CisgICAgICAgICAgICByZXR1cm4gKG1hcHBpbmcuZmluZEZvcndhcmQoIkxpc3QgR3JvdXBzIFNldHVwIikpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2hlY2sgdGhlIHRyYW5zYWN0aW9uIHRva2VuCisgICAgICAgIGlmICghaXNUb2tlblZhbGlkKHJlcXVlc3QpKSB7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19CQURfUkVRVUVTVCwKKyAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IudG9rZW4iKSk7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUGVyZm9ybSBhbnkgZXh0cmEgdmFsaWRhdGlvbiB0aGF0IGlzIHJlcXVpcmVkCisgICAgICAgIEdyb3Vwc0Zvcm0gZ3JvdXBzRm9ybSA9IChHcm91cHNGb3JtKSBmb3JtOworICAgICAgICBTdHJpbmcgZGF0YWJhc2VOYW1lID0gZ3JvdXBzRm9ybS5nZXREYXRhYmFzZU5hbWUoKTsKKyAgICAgICAgU3RyaW5nIGdyb3Vwc1tdID0gZ3JvdXBzRm9ybS5nZXRHcm91cHMoKTsKKyAgICAgICAgaWYgKGdyb3VwcyA9PSBudWxsKSB7CisgICAgICAgICAgICBncm91cHMgPSBuZXcgU3RyaW5nWzBdOworICAgICAgICB9CisKKyAgICAgICAgLy8gUGVyZm9ybSAiRGVsZXRlIEdyb3VwIiB0cmFuc2FjdGlvbnMgYXMgcmVxdWlyZWQKKyAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgT2JqZWN0TmFtZSBkbmFtZSA9IG5ldyBPYmplY3ROYW1lKGRhdGFiYXNlTmFtZSk7CisgICAgICAgICAgICBTdHJpbmcgc2lnbmF0dXJlW10gPSBuZXcgU3RyaW5nWzFdOworICAgICAgICAgICAgc2lnbmF0dXJlWzBdID0gImphdmEubGFuZy5TdHJpbmciOworICAgICAgICAgICAgT2JqZWN0IHBhcmFtc1tdID0gbmV3IFN0cmluZ1sxXTsKKworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBncm91cHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0gbmV3IE9iamVjdE5hbWUoZ3JvdXBzW2ldKTsKKyAgICAgICAgICAgICAgICBwYXJhbXNbMF0gPSBvbmFtZS5nZXRLZXlQcm9wZXJ0eSgiZ3JvdXBuYW1lIik7CisgICAgICAgICAgICAgICAgbXNlcnZlci5pbnZva2UoZG5hbWUsICJyZW1vdmVHcm91cCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLCBzaWduYXR1cmUpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisKKyAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuaW52b2tlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlbW92ZUdyb3VwIiksIHQpOworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5pbnZva2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVtb3ZlR3JvdXAiKSk7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworCisgICAgICAgIH0KKworICAgICAgICAvLyBTYXZlIHRoZSB1cGRhdGVkIGRhdGFiYXNlIGluZm9ybWF0aW9uCisgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgIE9iamVjdE5hbWUgZG5hbWUgPSBuZXcgT2JqZWN0TmFtZShkYXRhYmFzZU5hbWUpOworICAgICAgICAgICAgbXNlcnZlci5pbnZva2UoZG5hbWUsICJzYXZlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbMF0sIG5ldyBTdHJpbmdbMF0pOworCisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisKKyAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuaW52b2tlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNhdmUiKSwgdCk7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsCisgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmludm9rZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzYXZlIikpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKworICAgICAgICB9CisKKyAgICAgICAgLy8gUHJvY2VlZCB0byB0aGUgbGlzdCBncm91cHMgc2NyZWVuCisgICAgICAgIHJldHVybiAobWFwcGluZy5maW5kRm9yd2FyZCgiR3JvdXBzIExpc3QgU2V0dXAiKSk7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3VzZXJzL0RlbGV0ZVJvbGVzQWN0aW9uLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vdXNlcnMvRGVsZXRlUm9sZXNBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmUyOTcxCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3VzZXJzL0RlbGV0ZVJvbGVzQWN0aW9uLmphdmEKQEAgLTAsMCArMSwxNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnVzZXJzOworCisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkVycm9yczsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9ybTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9yd2FyZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LkF0dHJpYnV0ZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXJGYWN0b3J5OworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuUXVlcnlFeHA7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5RdWVyeTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdEluc3RhbmNlOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LkpNRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5BdHRyaWJ1dGVJbmZvOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5PcGVyYXRpb25JbmZvOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5JbmZvOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLnV0aWwuTWVzc2FnZVJlc291cmNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5BcHBsaWNhdGlvblNlcnZsZXQ7CisKKworLyoqCisgKiA8cD5JbXBsZW1lbnRhdGlvbiBvZiA8c3Ryb25nPkFjdGlvbjwvc3Ryb25nPiB0aGF0IGRlbGV0ZXMgdGhlCisgKiBzcGVjaWZpZWQgc2V0IG9mIHJvbGVzLjwvcD4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKiBAc2luY2UgNC4xCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIERlbGV0ZVJvbGVzQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBNQmVhblNlcnZlciB3ZSB3aWxsIGJlIGludGVyYWN0aW5nIHdpdGguCisgICAgICovCisgICAgcHJpdmF0ZSBNQmVhblNlcnZlciBtc2VydmVyID0gbnVsbDsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIHNwZWNpZmllZCBIVFRQIHJlcXVlc3QsIGFuZCBjcmVhdGUgdGhlIGNvcnJlc3BvbmRpbmcgSFRUUAorICAgICAqIHJlc3BvbnNlIChvciBmb3J3YXJkIHRvIGFub3RoZXIgd2ViIGNvbXBvbmVudCB0aGF0IHdpbGwgY3JlYXRlIGl0KS4KKyAgICAgKiBSZXR1cm4gYW4gPGNvZGU+QWN0aW9uRm9yd2FyZDwvY29kZT4gaW5zdGFuY2UgZGVzY3JpYmluZyB3aGVyZSBhbmQgaG93CisgICAgICogY29udHJvbCBzaG91bGQgYmUgZm9yd2FyZGVkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcmVzcG9uc2UgaGFzCisgICAgICogYWxyZWFkeSBiZWVuIGNvbXBsZXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBBY3Rpb25NYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gYWN0aW9uRm9ybSBUaGUgb3B0aW9uYWwgQWN0aW9uRm9ybSBiZWFuIGZvciB0aGlzIHJlcXVlc3QgKGlmIGFueSkKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgSFRUUCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBIVFRQIHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBleGNlcHRpb24gb2NjdXJzCisgICAgICovCisgICAgcHVibGljIEFjdGlvbkZvcndhcmQgcGVyZm9ybShBY3Rpb25NYXBwaW5nIG1hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb25Gb3JtIGZvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gTG9vayB1cCB0aGUgY29tcG9uZW50cyB3ZSB3aWxsIGJlIHVzaW5nIGFzIG5lZWRlZAorICAgICAgICBpZiAobXNlcnZlciA9PSBudWxsKSB7CisgICAgICAgICAgICBtc2VydmVyID0gKChBcHBsaWNhdGlvblNlcnZsZXQpIGdldFNlcnZsZXQoKSkuZ2V0U2VydmVyKCk7CisgICAgICAgIH0KKyAgICAgICAgTWVzc2FnZVJlc291cmNlcyByZXNvdXJjZXMgPSBnZXRSZXNvdXJjZXMocmVxdWVzdCk7CisgICAgICAgIEh0dHBTZXNzaW9uIHNlc3Npb24gPSByZXF1ZXN0LmdldFNlc3Npb24oKTsKKyAgICAgICAgTG9jYWxlIGxvY2FsZSA9IGdldExvY2FsZShyZXF1ZXN0KTsKKworICAgICAgICAvLyBIYXMgdGhpcyB0cmFuc2FjdGlvbiBiZWVuIGNhbmNlbGxlZD8KKyAgICAgICAgaWYgKGlzQ2FuY2VsbGVkKHJlcXVlc3QpKSB7CisgICAgICAgICAgICByZXR1cm4gKG1hcHBpbmcuZmluZEZvcndhcmQoIkxpc3QgUm9sZXMgU2V0dXAiKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBDaGVjayB0aGUgdHJhbnNhY3Rpb24gdG9rZW4KKyAgICAgICAgaWYgKCFpc1Rva2VuVmFsaWQocmVxdWVzdCkpIHsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0JBRF9SRVFVRVNULAorICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci50b2tlbiIpKTsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBQZXJmb3JtIGFueSBleHRyYSB2YWxpZGF0aW9uIHRoYXQgaXMgcmVxdWlyZWQKKyAgICAgICAgUm9sZXNGb3JtIHJvbGVzRm9ybSA9IChSb2xlc0Zvcm0pIGZvcm07CisgICAgICAgIFN0cmluZyBkYXRhYmFzZU5hbWUgPSByb2xlc0Zvcm0uZ2V0RGF0YWJhc2VOYW1lKCk7CisgICAgICAgIFN0cmluZyByb2xlc1tdID0gcm9sZXNGb3JtLmdldFJvbGVzKCk7CisgICAgICAgIGlmIChyb2xlcyA9PSBudWxsKSB7CisgICAgICAgICAgICByb2xlcyA9IG5ldyBTdHJpbmdbMF07CisgICAgICAgIH0KKworICAgICAgICAvLyBQZXJmb3JtICJEZWxldGUgUm9sZSIgdHJhbnNhY3Rpb25zIGFzIHJlcXVpcmVkCisgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgIE9iamVjdE5hbWUgZG5hbWUgPSBuZXcgT2JqZWN0TmFtZShkYXRhYmFzZU5hbWUpOworICAgICAgICAgICAgU3RyaW5nIHNpZ25hdHVyZVtdID0gbmV3IFN0cmluZ1sxXTsKKyAgICAgICAgICAgIHNpZ25hdHVyZVswXSA9ICJqYXZhLmxhbmcuU3RyaW5nIjsKKyAgICAgICAgICAgIE9iamVjdCBwYXJhbXNbXSA9IG5ldyBTdHJpbmdbMV07CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcm9sZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0gbmV3IE9iamVjdE5hbWUocm9sZXNbaV0pOworICAgICAgICAgICAgICAgIHBhcmFtc1swXSA9IG9uYW1lLmdldEtleVByb3BlcnR5KCJyb2xlbmFtZSIpOworICAgICAgICAgICAgICAgIG1zZXJ2ZXIuaW52b2tlKGRuYW1lLCAicmVtb3ZlUm9sZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLCBzaWduYXR1cmUpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisKKyAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuaW52b2tlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlbW92ZVJvbGUiKSwgdCk7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsCisgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmludm9rZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZW1vdmVSb2xlIikpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKworICAgICAgICB9CisKKyAgICAgICAgLy8gU2F2ZSB0aGUgdXBkYXRlZCBkYXRhYmFzZSBpbmZvcm1hdGlvbgorICAgICAgICB0cnkgeworCisgICAgICAgICAgICBPYmplY3ROYW1lIGRuYW1lID0gbmV3IE9iamVjdE5hbWUoZGF0YWJhc2VOYW1lKTsKKyAgICAgICAgICAgIG1zZXJ2ZXIuaW52b2tlKGRuYW1lLCAic2F2ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0WzBdLCBuZXcgU3RyaW5nWzBdKTsKKworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworCisgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nCisgICAgICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmludm9rZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzYXZlIiksIHQpOworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5pbnZva2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2F2ZSIpKTsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisKKyAgICAgICAgfQorCisgICAgICAgIC8vIFByb2NlZWQgdG8gdGhlIGxpc3Qgcm9sZXMgc2NyZWVuCisgICAgICAgIHJldHVybiAobWFwcGluZy5maW5kRm9yd2FyZCgiUm9sZXMgTGlzdCBTZXR1cCIpKTsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vdXNlcnMvRGVsZXRlVXNlcnNBY3Rpb24uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi91c2Vycy9EZWxldGVVc2Vyc0FjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkOGQ5NDMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vdXNlcnMvRGVsZXRlVXNlcnNBY3Rpb24uamF2YQpAQCAtMCwwICsxLDE3NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4udXNlcnM7CisKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRXJyb3JzOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3J3YXJkOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuQXR0cmlidXRlOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlckZhY3Rvcnk7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5RdWVyeUV4cDsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LlF1ZXJ5OworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0SW5zdGFuY2U7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuSk1FeGNlcHRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhbkF0dHJpYnV0ZUluZm87CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhbk9wZXJhdGlvbkluZm87CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhbkluZm87CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMudXRpbC5NZXNzYWdlUmVzb3VyY2VzOworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkFwcGxpY2F0aW9uU2VydmxldDsKKworCisvKioKKyAqIDxwPkltcGxlbWVudGF0aW9uIG9mIDxzdHJvbmc+QWN0aW9uPC9zdHJvbmc+IHRoYXQgZGVsZXRlcyB0aGUKKyAqIHNwZWNpZmllZCBzZXQgb2YgdXNlcnMuPC9wPgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqIEBzaW5jZSA0LjEKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgRGVsZXRlVXNlcnNBY3Rpb24gZXh0ZW5kcyBBY3Rpb24geworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIE1CZWFuU2VydmVyIHdlIHdpbGwgYmUgaW50ZXJhY3Rpbmcgd2l0aC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1CZWFuU2VydmVyIG1zZXJ2ZXIgPSBudWxsOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUHJvY2VzcyB0aGUgc3BlY2lmaWVkIEhUVFAgcmVxdWVzdCwgYW5kIGNyZWF0ZSB0aGUgY29ycmVzcG9uZGluZyBIVFRQCisgICAgICogcmVzcG9uc2UgKG9yIGZvcndhcmQgdG8gYW5vdGhlciB3ZWIgY29tcG9uZW50IHRoYXQgd2lsbCBjcmVhdGUgaXQpLgorICAgICAqIFJldHVybiBhbiA8Y29kZT5BY3Rpb25Gb3J3YXJkPC9jb2RlPiBpbnN0YW5jZSBkZXNjcmliaW5nIHdoZXJlIGFuZCBob3cKKyAgICAgKiBjb250cm9sIHNob3VsZCBiZSBmb3J3YXJkZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSByZXNwb25zZSBoYXMKKyAgICAgKiBhbHJlYWR5IGJlZW4gY29tcGxldGVkLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIEFjdGlvbk1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSBhY3Rpb25Gb3JtIFRoZSBvcHRpb25hbCBBY3Rpb25Gb3JtIGJlYW4gZm9yIHRoaXMgcmVxdWVzdCAoaWYgYW55KQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBIVFRQIHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIEhUVFAgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0IGV4Y2VwdGlvbiBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgQWN0aW9uRm9yd2FyZCBwZXJmb3JtKEFjdGlvbk1hcHBpbmcgbWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbkZvcm0gZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICAvLyBMb29rIHVwIHRoZSBjb21wb25lbnRzIHdlIHdpbGwgYmUgdXNpbmcgYXMgbmVlZGVkCisgICAgICAgIGlmIChtc2VydmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIG1zZXJ2ZXIgPSAoKEFwcGxpY2F0aW9uU2VydmxldCkgZ2V0U2VydmxldCgpKS5nZXRTZXJ2ZXIoKTsKKyAgICAgICAgfQorICAgICAgICBNZXNzYWdlUmVzb3VyY2VzIHJlc291cmNlcyA9IGdldFJlc291cmNlcyhyZXF1ZXN0KTsKKyAgICAgICAgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpOworICAgICAgICBMb2NhbGUgbG9jYWxlID0gZ2V0TG9jYWxlKHJlcXVlc3QpOworCisgICAgICAgIC8vIEhhcyB0aGlzIHRyYW5zYWN0aW9uIGJlZW4gY2FuY2VsbGVkPworICAgICAgICBpZiAoaXNDYW5jZWxsZWQocmVxdWVzdCkpIHsKKyAgICAgICAgICAgIHJldHVybiAobWFwcGluZy5maW5kRm9yd2FyZCgiTGlzdCBVc2VycyBTZXR1cCIpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENoZWNrIHRoZSB0cmFuc2FjdGlvbiB0b2tlbgorICAgICAgICBpZiAoIWlzVG9rZW5WYWxpZChyZXF1ZXN0KSkgeworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfQkFEX1JFUVVFU1QsCisgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLnRva2VuIikpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFBlcmZvcm0gYW55IGV4dHJhIHZhbGlkYXRpb24gdGhhdCBpcyByZXF1aXJlZAorICAgICAgICBVc2Vyc0Zvcm0gdXNlcnNGb3JtID0gKFVzZXJzRm9ybSkgZm9ybTsKKyAgICAgICAgU3RyaW5nIGRhdGFiYXNlTmFtZSA9IHVzZXJzRm9ybS5nZXREYXRhYmFzZU5hbWUoKTsKKyAgICAgICAgU3RyaW5nIHVzZXJzW10gPSB1c2Vyc0Zvcm0uZ2V0VXNlcnMoKTsKKyAgICAgICAgaWYgKHVzZXJzID09IG51bGwpIHsKKyAgICAgICAgICAgIHVzZXJzID0gbmV3IFN0cmluZ1swXTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFBlcmZvcm0gIkRlbGV0ZSBVc2VyIiB0cmFuc2FjdGlvbnMgYXMgcmVxdWlyZWQKKyAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgT2JqZWN0TmFtZSBkbmFtZSA9IG5ldyBPYmplY3ROYW1lKGRhdGFiYXNlTmFtZSk7CisgICAgICAgICAgICBTdHJpbmcgc2lnbmF0dXJlW10gPSBuZXcgU3RyaW5nWzFdOworICAgICAgICAgICAgc2lnbmF0dXJlWzBdID0gImphdmEubGFuZy5TdHJpbmciOworICAgICAgICAgICAgT2JqZWN0IHBhcmFtc1tdID0gbmV3IFN0cmluZ1sxXTsKKworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB1c2Vycy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPSBuZXcgT2JqZWN0TmFtZSh1c2Vyc1tpXSk7CisgICAgICAgICAgICAgICAgcGFyYW1zWzBdID0gb25hbWUuZ2V0S2V5UHJvcGVydHkoInVzZXJuYW1lIik7CisgICAgICAgICAgICAgICAgbXNlcnZlci5pbnZva2UoZG5hbWUsICJyZW1vdmVVc2VyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMsIHNpZ25hdHVyZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKworICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZworICAgICAgICAgICAgICAgIChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5pbnZva2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVtb3ZlVXNlciIpLCB0KTsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuaW52b2tlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlbW92ZVVzZXIiKSk7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworCisgICAgICAgIH0KKworICAgICAgICAvLyBTYXZlIHRoZSB1cGRhdGVkIGRhdGFiYXNlIGluZm9ybWF0aW9uCisgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgIE9iamVjdE5hbWUgZG5hbWUgPSBuZXcgT2JqZWN0TmFtZShkYXRhYmFzZU5hbWUpOworICAgICAgICAgICAgbXNlcnZlci5pbnZva2UoZG5hbWUsICJzYXZlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbMF0sIG5ldyBTdHJpbmdbMF0pOworCisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisKKyAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuaW52b2tlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNhdmUiKSwgdCk7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsCisgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmludm9rZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzYXZlIikpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKworICAgICAgICB9CisKKyAgICAgICAgLy8gUHJvY2VlZCB0byB0aGUgbGlzdCB1c2VycyBzY3JlZW4KKyAgICAgICAgcmV0dXJuIChtYXBwaW5nLmZpbmRGb3J3YXJkKCJVc2VycyBMaXN0IFNldHVwIikpOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi91c2Vycy9Hcm91cEZvcm0uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi91c2Vycy9Hcm91cEZvcm0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODg0OWMxCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3VzZXJzL0dyb3VwRm9ybS5qYXZhCkBAIC0wLDAgKzEsMTc0IEBACisvKgorICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4udXNlcnM7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkxEZWNvZGVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRXJyb3I7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkVycm9yczsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9ybTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5BcHBsaWNhdGlvblNlcnZsZXQ7CisKKworLyoqCisgKiBGb3JtIGJlYW4gZm9yIHRoZSBpbmRpdmlkdWFsIGdyb3VwIHBhZ2UuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICogQHNpbmNlIDQuMQorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBHcm91cEZvcm0gZXh0ZW5kcyBCYXNlRm9ybSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisgICAvKioKKyAgICAgKiBUaGUgTUJlYW5TZXJ2ZXIgd2Ugd2lsbCBiZSBpbnRlcmFjdGluZyB3aXRoLgorICAgICAqLworICAgIHByaXZhdGUgTUJlYW5TZXJ2ZXIgbXNlcnZlciA9IG51bGw7CisgICAgCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoaXMgZ3JvdXAuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb24gPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLmRlc2NyaXB0aW9uKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKKyAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIGdyb3VwbmFtZSBvZiB0aGlzIGdyb3VwLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGdyb3VwbmFtZSA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEdyb3VwbmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLmdyb3VwbmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0R3JvdXBuYW1lKFN0cmluZyBncm91cG5hbWUpIHsKKyAgICAgICAgdGhpcy5ncm91cG5hbWUgPSBncm91cG5hbWU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgTUJlYW4gTmFtZXMgb2YgdGhlIHJvbGVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGdyb3VwLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHJvbGVzW10gPSBuZXcgU3RyaW5nWzBdOworCisgICAgcHVibGljIFN0cmluZ1tdIGdldFJvbGVzKCkgeworICAgICAgICByZXR1cm4gKHRoaXMucm9sZXMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFJvbGVzKFN0cmluZyByb2xlc1tdKSB7CisgICAgICAgIGlmIChyb2xlcyA9PSBudWxsKSB7CisgICAgICAgICAgICByb2xlcyA9IG5ldyBTdHJpbmdbMF07CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5yb2xlcyA9IHJvbGVzOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJlc2V0IGFsbCBwcm9wZXJ0aWVzIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIG1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZXNldChBY3Rpb25NYXBwaW5nIG1hcHBpbmcsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisKKyAgICAgICAgc3VwZXIucmVzZXQobWFwcGluZywgcmVxdWVzdCk7CisgICAgICAgIGRlc2NyaXB0aW9uID0gbnVsbDsKKyAgICAgICAgZ3JvdXBuYW1lID0gbnVsbDsKKyAgICAgICAgcm9sZXMgPSBuZXcgU3RyaW5nWzBdOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBWYWxpZGF0ZSB0aGUgcHJvcGVydGllcyB0aGF0IGhhdmUgYmVlbiBzZXQgZnJvbSB0aGlzIEhUVFAgcmVxdWVzdCwKKyAgICAgKiBhbmQgcmV0dXJuIGFuIDxjb2RlPkFjdGlvbkVycm9yczwvY29kZT4gb2JqZWN0IHRoYXQgZW5jYXBzdWxhdGVzIGFueQorICAgICAqIHZhbGlkYXRpb24gZXJyb3JzIHRoYXQgaGF2ZSBiZWVuIGZvdW5kLiAgSWYgbm8gZXJyb3JzIGFyZSBmb3VuZCwgcmV0dXJuCisgICAgICogPGNvZGU+bnVsbDwvY29kZT4gb3IgYW4gPGNvZGU+QWN0aW9uRXJyb3JzPC9jb2RlPiBvYmplY3Qgd2l0aCBubworICAgICAqIHJlY29yZGVkIGVycm9yIG1lc3NhZ2VzLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIG1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgQWN0aW9uRXJyb3JzIHZhbGlkYXRlKEFjdGlvbk1hcHBpbmcgbWFwcGluZywKKyAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIExvb2sgdXAgdGhlIGNvbXBvbmVudHMgd2Ugd2lsbCBiZSB1c2luZyBhcyBuZWVkZWQKKyAgICAgICAgICAgIGlmIChtc2VydmVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtc2VydmVyID0gKChBcHBsaWNhdGlvblNlcnZsZXQpIGdldFNlcnZsZXQoKSkuZ2V0U2VydmVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIC8vIFNldCB1cCBiZWFucyBjb250YWluaW5nIGFsbCBwb3NzaWJsZSBncm91cHMgYW5kIHJvbGVzCisgICAgICAgICAgICBTdHJpbmcgZGF0YWJhc2VOYW1lID0KKyAgICAgICAgICAgICAgICBVUkxEZWNvZGVyLmRlY29kZShyZXF1ZXN0LmdldFBhcmFtZXRlcigiZGF0YWJhc2VOYW1lIikpOworICAgICAgICAgICAgcmVxdWVzdC5zZXRBdHRyaWJ1dGUoInJvbGVzRm9ybSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VyVXRpbHMuZ2V0Um9sZXNGb3JtKG1zZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFiYXNlTmFtZSkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gZG8gbm90aGluZyBzaW5jZSB0aGUgZm9ybSByZXR1cm5zIHZhbGlkYXRpb24gZXJyb3IKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgQWN0aW9uRXJyb3JzIGVycm9ycyA9IG5ldyBBY3Rpb25FcnJvcnMoKTsKKworICAgICAgICBTdHJpbmcgc3VibWl0ID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoInN1Ym1pdCIpOworICAgICAgICAvL2lmIChzdWJtaXQgIT0gbnVsbCkgeworCisgICAgICAgICAgICAvLyBncm91cG5hbWUgaXMgYSByZXF1aXJlZCBmaWVsZAorICAgICAgICAgICAgaWYgKChncm91cG5hbWUgPT0gbnVsbCkgfHwgKGdyb3VwbmFtZS5sZW5ndGgoKSA8IDEpKSB7CisgICAgICAgICAgICAgICAgZXJyb3JzLmFkZCgiZ3JvdXBuYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBY3Rpb25FcnJvcigidXNlcnMuZXJyb3IuZ3JvdXBuYW1lLnJlcXVpcmVkIikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBRdW90ZXMgbm90IGFsbG93ZWQgaW4gZ3JvdXBuYW1lCisgICAgICAgICAgICBpZiAoKGdyb3VwbmFtZSAhPSBudWxsKSAmJiAoZ3JvdXBuYW1lLmluZGV4T2YoJyInKSA+PSAwKSkgeworICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoImdyb3VwbmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQWN0aW9uRXJyb3IoInVzZXJzLmVycm9yLnF1b3RlcyIpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gUXVvdGVzIG5vdCBhbGxvd2VkIGluIGRlc2NyaXB0aW9uCisgICAgICAgICAgICBpZiAoKGRlc2NyaXB0aW9uICE9IG51bGwpICYmIChkZXNjcmlwdGlvbi5pbmRleE9mKCciJykgPiAwKSkgeworICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoImRlc2NyaXB0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBY3Rpb25FcnJvcigidXNlcnMuZXJyb3IucXVvdGVzIikpOworICAgICAgICAgICAgfQorCisgICAgICAgIC8vfQorCisgICAgICAgIHJldHVybiAoZXJyb3JzKTsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vdXNlcnMvR3JvdXBzRm9ybS5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3VzZXJzL0dyb3Vwc0Zvcm0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjgwNmE1Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3VzZXJzL0dyb3Vwc0Zvcm0uamF2YQpAQCAtMCwwICsxLDc1IEBACisvKgorICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4udXNlcnM7CisKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkVycm9yOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25FcnJvcnM7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CisKKworLyoqCisgKiBGb3JtIGJlYW4gZm9yIHRoZSBkZWxldGUgZ3JvdXBzIHBhZ2UuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICogQHNpbmNlIDQuMQorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBHcm91cHNGb3JtIGV4dGVuZHMgQmFzZUZvcm0geworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBvYmplY3QgbmFtZXMgb2YgdGhlIHNwZWNpZmllZCBncm91cHMuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZ3JvdXBzW10gPSBudWxsOworCisgICAgcHVibGljIFN0cmluZ1tdIGdldEdyb3VwcygpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLmdyb3Vwcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0R3JvdXBzKFN0cmluZyBncm91cHNbXSkgeworICAgICAgICB0aGlzLmdyb3VwcyA9IGdyb3VwczsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZXNldCBhbGwgcHJvcGVydGllcyB0byB0aGVpciBkZWZhdWx0IHZhbHVlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBtYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVzZXQoQWN0aW9uTWFwcGluZyBtYXBwaW5nLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworCisgICAgICAgIHN1cGVyLnJlc2V0KG1hcHBpbmcsIHJlcXVlc3QpOworICAgICAgICB0aGlzLmdyb3VwcyA9IG51bGw7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3VzZXJzL0xpc3RHcm91cHNBY3Rpb24uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi91c2Vycy9MaXN0R3JvdXBzQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU5OWZjOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi91c2Vycy9MaXN0R3JvdXBzQWN0aW9uLmphdmEKQEAgLTAsMCArMSwxMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnVzZXJzOworCisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTERlY29kZXI7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9ybTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9yd2FyZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy51dGlsLk1lc3NhZ2VSZXNvdXJjZXM7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uQXBwbGljYXRpb25TZXJ2bGV0OworCisKKy8qKgorICogPHA+UmV0cmlldmUgdGhlIHNldCBvZiBNQmVhbiBuYW1lcyBmb3IgYWxsIGN1cnJlbnRseSBkZWZpbmVkIGdyb3VwcywKKyAqIGFuZCBleHBvc2UgdGhlbSBpbiBhIHJlcXVlc3QgYXR0cmlidXRlIG5hbWVkICJncm91cHNGb3JtIi4gIFRoaXMgYWN0aW9uCisgKiByZXF1aXJlcyB0aGUgZm9sbG93aW5nIHJlcXVlc3QgcGFyYW1ldGVycyB0byBiZSBzZXQ6PC9wPgorICogPHVsPgorICogPGxpPjxzdHJvbmc+ZGF0YWJhc2VOYW1lPC9zdHJvbmc+IC0gT2JqZWN0IG5hbWUgb2YgdGhlIFVzZXJEYXRhYmFzZQorICogICAgIE1CZWFuIGZyb20gd2hpY2ggd2Ugc2hvdWxkIHJldHJpZXZlIHRoZSBncm91cHMgbGlzdC48L2xpPgorICogPGxpPjxzdHJvbmc+Zm9yd2FyZDwvc3Ryb25nPiAtIEdsb2JhbCBmb3J3YXJkIHRvIHdoaWNoIHdlIHNob3VsZAorICogICAgIGdvIGFmdGVyIHN0YXNoaW5nIHRoZSBncm91cHMgbGlzdC48L2xpPgorICogPC91bD4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKiBAc2luY2UgNC4xCisgKi8KKworcHVibGljIGNsYXNzIExpc3RHcm91cHNBY3Rpb24gZXh0ZW5kcyBBY3Rpb24geworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIE1CZWFuU2VydmVyIHdlIHdpbGwgYmUgaW50ZXJhY3Rpbmcgd2l0aC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1CZWFuU2VydmVyIG1zZXJ2ZXIgPSBudWxsOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUHJvY2VzcyB0aGUgc3BlY2lmaWVkIEhUVFAgcmVxdWVzdCwgYW5kIGNyZWF0ZSB0aGUgY29ycmVzcG9uZGluZyBIVFRQCisgICAgICogcmVzcG9uc2UgKG9yIGZvcndhcmQgdG8gYW5vdGhlciB3ZWIgY29tcG9uZW50IHRoYXQgd2lsbCBjcmVhdGUgaXQpLgorICAgICAqIFJldHVybiBhbiA8Y29kZT5BY3Rpb25Gb3J3YXJkPC9jb2RlPiBpbnN0YW5jZSBkZXNjcmliaW5nIHdoZXJlIGFuZCBob3cKKyAgICAgKiBjb250cm9sIHNob3VsZCBiZSBmb3J3YXJkZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSByZXNwb25zZSBoYXMKKyAgICAgKiBhbHJlYWR5IGJlZW4gY29tcGxldGVkLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIEFjdGlvbk1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSBhY3Rpb25Gb3JtIFRoZSBvcHRpb25hbCBBY3Rpb25Gb3JtIGJlYW4gZm9yIHRoaXMgcmVxdWVzdCAoaWYgYW55KQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBIVFRQIHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIEhUVFAgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0IGV4Y2VwdGlvbiBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgQWN0aW9uRm9yd2FyZCBwZXJmb3JtKEFjdGlvbk1hcHBpbmcgbWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbkZvcm0gZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworCisgICAgICAgIC8vIExvb2sgdXAgdGhlIGNvbXBvbmVudHMgd2Ugd2lsbCBiZSB1c2luZyBhcyBuZWVkZWQKKyAgICAgICAgaWYgKG1zZXJ2ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgbXNlcnZlciA9ICgoQXBwbGljYXRpb25TZXJ2bGV0KSBnZXRTZXJ2bGV0KCkpLmdldFNlcnZlcigpOworICAgICAgICB9CisgICAgICAgIE1lc3NhZ2VSZXNvdXJjZXMgcmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VzKHJlcXVlc3QpOworICAgICAgICBIdHRwU2Vzc2lvbiBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uKCk7CisgICAgICAgIExvY2FsZSBsb2NhbGUgPSBnZXRMb2NhbGUocmVxdWVzdCk7CisKKyAgICAgICAgLy8gQ3JlYXRlIGEgZm9ybSBiZWFuIGNvbnRhaW5pbmcgdGhlIHJlcXVlc3RlZCBNQmVhbiBOYW1lcworICAgICAgICBTdHJpbmcgZGF0YWJhc2VOYW1lID0KKyAgICAgICAgICAgIFVSTERlY29kZXIuZGVjb2RlKHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJkYXRhYmFzZU5hbWUiKSk7CisgICAgICAgIEdyb3Vwc0Zvcm0gZ3JvdXBzRm9ybSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBncm91cHNGb3JtID0gVXNlclV0aWxzLmdldEdyb3Vwc0Zvcm0obXNlcnZlciwgZGF0YWJhc2VOYW1lKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cocmVzb3VyY2VzLmdldE1lc3NhZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2Vycy5lcnJvci5hdHRyaWJ1dGUuZ2V0IiwgImdyb3VwcyIpLCBlKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UKKyAgICAgICAgICAgICAgICAgKGxvY2FsZSwgInVzZXJzLmVycm9yLmF0dHJpYnV0ZS5nZXQiLCAiZ3JvdXBzIikpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICAvLyBTdGFzaCB0aGUgcmVzdWx0cyBpbiByZXF1ZXN0IHNjb3BlCisgICAgICAgIHJlcXVlc3Quc2V0QXR0cmlidXRlKCJncm91cHNGb3JtIiwgZ3JvdXBzRm9ybSk7CisgICAgICAgIHNhdmVUb2tlbihyZXF1ZXN0KTsKKyAgICAgICAgU3RyaW5nIGZvcndhcmQgPQorICAgICAgICAgICAgVVJMRGVjb2Rlci5kZWNvZGUocmVxdWVzdC5nZXRQYXJhbWV0ZXIoImZvcndhcmQiKSk7CisgICAgICAgIHJldHVybiAobWFwcGluZy5maW5kRm9yd2FyZChmb3J3YXJkKSk7CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi91c2Vycy9MaXN0Um9sZXNBY3Rpb24uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi91c2Vycy9MaXN0Um9sZXNBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzZhNWYzCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3VzZXJzL0xpc3RSb2xlc0FjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTI2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi51c2VyczsKKworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkxEZWNvZGVyOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcndhcmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMudXRpbC5NZXNzYWdlUmVzb3VyY2VzOworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkFwcGxpY2F0aW9uU2VydmxldDsKKworCisvKioKKyAqIDxwPlJldHJpZXZlIHRoZSBzZXQgb2YgTUJlYW4gbmFtZXMgZm9yIGFsbCBjdXJyZW50bHkgZGVmaW5lZCByb2xlcywKKyAqIGFuZCBleHBvc2UgdGhlbSBpbiBhIHJlcXVlc3QgYXR0cmlidXRlIG5hbWVkICJyb2xlc0Zvcm0iLiAgVGhpcyBhY3Rpb24KKyAqIHJlcXVpcmVzIHRoZSBmb2xsb3dpbmcgcmVxdWVzdCBwYXJhbWV0ZXJzIHRvIGJlIHNldDo8L3A+CisgKiA8dWw+CisgKiA8bGk+PHN0cm9uZz5kYXRhYmFzZU5hbWU8L3N0cm9uZz4gLSBPYmplY3QgbmFtZSBvZiB0aGUgVXNlckRhdGFiYXNlCisgKiAgICAgTUJlYW4gZnJvbSB3aGljaCB3ZSBzaG91bGQgcmV0cmlldmUgdGhlIHJvbGVzIGxpc3QuPC9saT4KKyAqIDxsaT48c3Ryb25nPmZvcndhcmQ8L3N0cm9uZz4gLSBHbG9iYWwgZm9yd2FyZCB0byB3aGljaCB3ZSBzaG91bGQKKyAqICAgICBnbyBhZnRlciBzdGFzaGluZyB0aGUgcm9sZXMgbGlzdC48L2xpPgorICogPC91bD4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKiBAc2luY2UgNC4xCisgKi8KKworcHVibGljIGNsYXNzIExpc3RSb2xlc0FjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgTUJlYW5TZXJ2ZXIgd2Ugd2lsbCBiZSBpbnRlcmFjdGluZyB3aXRoLgorICAgICAqLworICAgIHByaXZhdGUgTUJlYW5TZXJ2ZXIgbXNlcnZlciA9IG51bGw7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBzcGVjaWZpZWQgSFRUUCByZXF1ZXN0LCBhbmQgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIEhUVFAKKyAgICAgKiByZXNwb25zZSAob3IgZm9yd2FyZCB0byBhbm90aGVyIHdlYiBjb21wb25lbnQgdGhhdCB3aWxsIGNyZWF0ZSBpdCkuCisgICAgICogUmV0dXJuIGFuIDxjb2RlPkFjdGlvbkZvcndhcmQ8L2NvZGU+IGluc3RhbmNlIGRlc2NyaWJpbmcgd2hlcmUgYW5kIGhvdworICAgICAqIGNvbnRyb2wgc2hvdWxkIGJlIGZvcndhcmRlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHJlc3BvbnNlIGhhcworICAgICAqIGFscmVhZHkgYmVlbiBjb21wbGV0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgQWN0aW9uTWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIGFjdGlvbkZvcm0gVGhlIG9wdGlvbmFsIEFjdGlvbkZvcm0gYmVhbiBmb3IgdGhpcyByZXF1ZXN0IChpZiBhbnkpCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIEhUVFAgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgSFRUUCByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXhjZXB0aW9uIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBBY3Rpb25Gb3J3YXJkIHBlcmZvcm0oQWN0aW9uTWFwcGluZyBtYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uRm9ybSBmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisKKyAgICAgICAgLy8gTG9vayB1cCB0aGUgY29tcG9uZW50cyB3ZSB3aWxsIGJlIHVzaW5nIGFzIG5lZWRlZAorICAgICAgICBpZiAobXNlcnZlciA9PSBudWxsKSB7CisgICAgICAgICAgICBtc2VydmVyID0gKChBcHBsaWNhdGlvblNlcnZsZXQpIGdldFNlcnZsZXQoKSkuZ2V0U2VydmVyKCk7CisgICAgICAgIH0KKyAgICAgICAgTWVzc2FnZVJlc291cmNlcyByZXNvdXJjZXMgPSBnZXRSZXNvdXJjZXMocmVxdWVzdCk7CisgICAgICAgIEh0dHBTZXNzaW9uIHNlc3Npb24gPSByZXF1ZXN0LmdldFNlc3Npb24oKTsKKyAgICAgICAgTG9jYWxlIGxvY2FsZSA9IGdldExvY2FsZShyZXF1ZXN0KTsKKworCisgICAgICAgIC8vIENyZWF0ZSBhIGZvcm0gYmVhbiBjb250YWluaW5nIHRoZSByZXF1ZXN0ZWQgTUJlYW4gTmFtZXMKKyAgICAgICAgU3RyaW5nIGRhdGFiYXNlTmFtZSA9CisgICAgICAgICAgICBVUkxEZWNvZGVyLmRlY29kZShyZXF1ZXN0LmdldFBhcmFtZXRlcigiZGF0YWJhc2VOYW1lIikpOworICAgICAgICBSb2xlc0Zvcm0gcm9sZXNGb3JtID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJvbGVzRm9ybSA9IFVzZXJVdGlscy5nZXRSb2xlc0Zvcm0obXNlcnZlciwgZGF0YWJhc2VOYW1lKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cocmVzb3VyY2VzLmdldE1lc3NhZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2Vycy5lcnJvci5hdHRyaWJ1dGUuZ2V0IiwgInJvbGVzIiksIGUpOworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZQorICAgICAgICAgICAgICAgICAobG9jYWxlLCAidXNlcnMuZXJyb3IuYXR0cmlidXRlLmdldCIsICJyb2xlcyIpKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgLy8gU3Rhc2ggdGhlIHJlc3VsdHMgaW4gcmVxdWVzdCBzY29wZQorICAgICAgICByZXF1ZXN0LnNldEF0dHJpYnV0ZSgicm9sZXNGb3JtIiwgcm9sZXNGb3JtKTsKKyAgICAgICAgc2F2ZVRva2VuKHJlcXVlc3QpOworICAgICAgICBTdHJpbmcgZm9yd2FyZCA9CisgICAgICAgICAgICBVUkxEZWNvZGVyLmRlY29kZShyZXF1ZXN0LmdldFBhcmFtZXRlcigiZm9yd2FyZCIpKTsKKyAgICAgICAgcmV0dXJuIChtYXBwaW5nLmZpbmRGb3J3YXJkKGZvcndhcmQpKTsKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3VzZXJzL0xpc3RVc2Vyc0FjdGlvbi5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3VzZXJzL0xpc3RVc2Vyc0FjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4NDg0MDEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vdXNlcnMvTGlzdFVzZXJzQWN0aW9uLmphdmEKQEAgLTAsMCArMSwxMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnVzZXJzOworCisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTERlY29kZXI7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9ybTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9yd2FyZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy51dGlsLk1lc3NhZ2VSZXNvdXJjZXM7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uQXBwbGljYXRpb25TZXJ2bGV0OworCisKKy8qKgorICogPHA+UmV0cmlldmUgdGhlIHNldCBvZiBNQmVhbiBuYW1lcyBmb3IgYWxsIGN1cnJlbnRseSBkZWZpbmVkIHVzZXJzLAorICogYW5kIGV4cG9zZSB0aGVtIGluIGEgcmVxdWVzdCBhdHRyaWJ1dGUgbmFtZWQgInVzZXJzRm9ybSIuICBUaGlzIGFjdGlvbgorICogcmVxdWlyZXMgdGhlIGZvbGxvd2luZyByZXF1ZXN0IHBhcmFtZXRlcnMgdG8gYmUgc2V0OjwvcD4KKyAqIDx1bD4KKyAqIDxsaT48c3Ryb25nPmRhdGFiYXNlTmFtZTwvc3Ryb25nPiAtIE9iamVjdCBuYW1lIG9mIHRoZSBVc2VyRGF0YWJhc2UKKyAqICAgICBNQmVhbiBmcm9tIHdoaWNoIHdlIHNob3VsZCByZXRyaWV2ZSB0aGUgdXNlcnMgbGlzdC48L2xpPgorICogPGxpPjxzdHJvbmc+Zm9yd2FyZDwvc3Ryb25nPiAtIEdsb2JhbCBmb3J3YXJkIHRvIHdoaWNoIHdlIHNob3VsZAorICogICAgIGdvIGFmdGVyIHN0YXNoaW5nIHRoZSB1c2VycyBsaXN0LjwvbGk+CisgKiA8L3VsPgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqIEBzaW5jZSA0LjEKKyAqLworCitwdWJsaWMgY2xhc3MgTGlzdFVzZXJzQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBNQmVhblNlcnZlciB3ZSB3aWxsIGJlIGludGVyYWN0aW5nIHdpdGguCisgICAgICovCisgICAgcHJpdmF0ZSBNQmVhblNlcnZlciBtc2VydmVyID0gbnVsbDsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIHNwZWNpZmllZCBIVFRQIHJlcXVlc3QsIGFuZCBjcmVhdGUgdGhlIGNvcnJlc3BvbmRpbmcgSFRUUAorICAgICAqIHJlc3BvbnNlIChvciBmb3J3YXJkIHRvIGFub3RoZXIgd2ViIGNvbXBvbmVudCB0aGF0IHdpbGwgY3JlYXRlIGl0KS4KKyAgICAgKiBSZXR1cm4gYW4gPGNvZGU+QWN0aW9uRm9yd2FyZDwvY29kZT4gaW5zdGFuY2UgZGVzY3JpYmluZyB3aGVyZSBhbmQgaG93CisgICAgICogY29udHJvbCBzaG91bGQgYmUgZm9yd2FyZGVkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcmVzcG9uc2UgaGFzCisgICAgICogYWxyZWFkeSBiZWVuIGNvbXBsZXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBBY3Rpb25NYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gYWN0aW9uRm9ybSBUaGUgb3B0aW9uYWwgQWN0aW9uRm9ybSBiZWFuIGZvciB0aGlzIHJlcXVlc3QgKGlmIGFueSkKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgSFRUUCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBIVFRQIHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBleGNlcHRpb24gb2NjdXJzCisgICAgICovCisgICAgcHVibGljIEFjdGlvbkZvcndhcmQgcGVyZm9ybShBY3Rpb25NYXBwaW5nIG1hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb25Gb3JtIGZvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKworICAgICAgICAvLyBMb29rIHVwIHRoZSBjb21wb25lbnRzIHdlIHdpbGwgYmUgdXNpbmcgYXMgbmVlZGVkCisgICAgICAgIGlmIChtc2VydmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIG1zZXJ2ZXIgPSAoKEFwcGxpY2F0aW9uU2VydmxldCkgZ2V0U2VydmxldCgpKS5nZXRTZXJ2ZXIoKTsKKyAgICAgICAgfQorICAgICAgICBNZXNzYWdlUmVzb3VyY2VzIHJlc291cmNlcyA9IGdldFJlc291cmNlcyhyZXF1ZXN0KTsKKyAgICAgICAgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpOworICAgICAgICBMb2NhbGUgbG9jYWxlID0gZ2V0TG9jYWxlKHJlcXVlc3QpOworCisKKyAgICAgICAgLy8gQ3JlYXRlIGEgZm9ybSBiZWFuIGNvbnRhaW5pbmcgdGhlIHJlcXVlc3RlZCBNQmVhbiBOYW1lcworICAgICAgICBTdHJpbmcgZGF0YWJhc2VOYW1lID0KKyAgICAgICAgICAgIFVSTERlY29kZXIuZGVjb2RlKHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJkYXRhYmFzZU5hbWUiKSk7CisgICAgICAgIFVzZXJzRm9ybSB1c2Vyc0Zvcm0gPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdXNlcnNGb3JtID0gVXNlclV0aWxzLmdldFVzZXJzRm9ybShtc2VydmVyLCBkYXRhYmFzZU5hbWUpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZyhyZXNvdXJjZXMuZ2V0TWVzc2FnZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9jYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzZXJzLmVycm9yLmF0dHJpYnV0ZS5nZXQiLCAidXNlcnMiKSwgZSk7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsCisgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlCisgICAgICAgICAgICAgICAgIChsb2NhbGUsICJ1c2Vycy5lcnJvci5hdHRyaWJ1dGUuZ2V0IiwgInVzZXJzIikpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICAvLyBTdGFzaCB0aGUgcmVzdWx0cyBpbiByZXF1ZXN0IHNjb3BlCisgICAgICAgIHJlcXVlc3Quc2V0QXR0cmlidXRlKCJ1c2Vyc0Zvcm0iLCB1c2Vyc0Zvcm0pOworICAgICAgICBzYXZlVG9rZW4ocmVxdWVzdCk7CisgICAgICAgIFN0cmluZyBmb3J3YXJkID0KKyAgICAgICAgICAgIFVSTERlY29kZXIuZGVjb2RlKHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJmb3J3YXJkIikpOworICAgICAgICByZXR1cm4gKG1hcHBpbmcuZmluZEZvcndhcmQoZm9yd2FyZCkpOworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vdXNlcnMvUm9sZUZvcm0uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi91c2Vycy9Sb2xlRm9ybS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwZDc0NDkKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vdXNlcnMvUm9sZUZvcm0uamF2YQpAQCAtMCwwICsxLDEzMyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnVzZXJzOworCisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25FcnJvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRXJyb3JzOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworCisKKy8qKgorICogRm9ybSBiZWFuIGZvciB0aGUgaW5kaXZpZHVhbCByb2xlIHBhZ2UuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICogQHNpbmNlIDQuMQorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBSb2xlRm9ybSBleHRlbmRzIEJhc2VGb3JtIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhpcyByb2xlLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisgICAgICAgIHJldHVybiAodGhpcy5kZXNjcmlwdGlvbik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7CisgICAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSByb2xlbmFtZSBvZiB0aGlzIHJvbGUuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcm9sZW5hbWUgPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXRSb2xlbmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLnJvbGVuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRSb2xlbmFtZShTdHJpbmcgcm9sZW5hbWUpIHsKKyAgICAgICAgdGhpcy5yb2xlbmFtZSA9IHJvbGVuYW1lOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJlc2V0IGFsbCBwcm9wZXJ0aWVzIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIG1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZXNldChBY3Rpb25NYXBwaW5nIG1hcHBpbmcsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisKKyAgICAgICAgc3VwZXIucmVzZXQobWFwcGluZywgcmVxdWVzdCk7CisgICAgICAgIGRlc2NyaXB0aW9uID0gbnVsbDsKKyAgICAgICAgcm9sZW5hbWUgPSBudWxsOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBWYWxpZGF0ZSB0aGUgcHJvcGVydGllcyB0aGF0IGhhdmUgYmVlbiBzZXQgZnJvbSB0aGlzIEhUVFAgcmVxdWVzdCwKKyAgICAgKiBhbmQgcmV0dXJuIGFuIDxjb2RlPkFjdGlvbkVycm9yczwvY29kZT4gb2JqZWN0IHRoYXQgZW5jYXBzdWxhdGVzIGFueQorICAgICAqIHZhbGlkYXRpb24gZXJyb3JzIHRoYXQgaGF2ZSBiZWVuIGZvdW5kLiAgSWYgbm8gZXJyb3JzIGFyZSBmb3VuZCwgcmV0dXJuCisgICAgICogPGNvZGU+bnVsbDwvY29kZT4gb3IgYW4gPGNvZGU+QWN0aW9uRXJyb3JzPC9jb2RlPiBvYmplY3Qgd2l0aCBubworICAgICAqIHJlY29yZGVkIGVycm9yIG1lc3NhZ2VzLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIG1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgQWN0aW9uRXJyb3JzIHZhbGlkYXRlKEFjdGlvbk1hcHBpbmcgbWFwcGluZywKKyAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworCisgICAgICAgIEFjdGlvbkVycm9ycyBlcnJvcnMgPSBuZXcgQWN0aW9uRXJyb3JzKCk7CisKKyAgICAgICAgU3RyaW5nIHN1Ym1pdCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJzdWJtaXQiKTsKKyAgICAgICAgLy9pZiAoc3VibWl0ICE9IG51bGwpIHsKKworICAgICAgICAgICAgLy8gcm9sZW5hbWUgaXMgYSByZXF1aXJlZCBmaWVsZAorICAgICAgICAgICAgaWYgKChyb2xlbmFtZSA9PSBudWxsKSB8fCAocm9sZW5hbWUubGVuZ3RoKCkgPCAxKSkgeworICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoInJvbGVuYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBY3Rpb25FcnJvcigidXNlcnMuZXJyb3Iucm9sZW5hbWUucmVxdWlyZWQiKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFF1b3RlcyBub3QgYWxsb3dlZCBpbiByb2xlbmFtZQorICAgICAgICAgICAgaWYgKChyb2xlbmFtZSAhPSBudWxsKSAmJiAocm9sZW5hbWUuaW5kZXhPZignIicpID49IDApKSB7CisgICAgICAgICAgICAgICAgZXJyb3JzLmFkZCgicm9sZW5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFjdGlvbkVycm9yKCJ1c2Vycy5lcnJvci5xdW90ZXMiKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFF1b3RlcyBub3QgYWxsb3dlZCBpbiBkZXNjcmlwdGlvbgorICAgICAgICAgICAgaWYgKChkZXNjcmlwdGlvbiAhPSBudWxsKSAmJiAoZGVzY3JpcHRpb24uaW5kZXhPZignIicpID4gMCkpIHsKKyAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKCJkZXNjcmlwdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQWN0aW9uRXJyb3IoInVzZXJzLmVycm9yLnF1b3RlcyIpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAvL30KKworICAgICAgICByZXR1cm4gKGVycm9ycyk7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3VzZXJzL1JvbGVzRm9ybS5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3VzZXJzL1JvbGVzRm9ybS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyMTllM2YKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vdXNlcnMvUm9sZXNGb3JtLmphdmEKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnVzZXJzOworCisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25FcnJvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRXJyb3JzOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworCisKKy8qKgorICogRm9ybSBiZWFuIGZvciB0aGUgZGVsZXRlIHJvbGVzIHBhZ2UuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICogQHNpbmNlIDQuMQorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBSb2xlc0Zvcm0gZXh0ZW5kcyBCYXNlRm9ybSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKworCisgICAgLyoqCisgICAgICogVGhlIG9iamVjdCBuYW1lcyBvZiB0aGUgc3BlY2lmaWVkIHJvbGVzLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHJvbGVzW10gPSBudWxsOworCisgICAgcHVibGljIFN0cmluZ1tdIGdldFJvbGVzKCkgeworICAgICAgICByZXR1cm4gKHRoaXMucm9sZXMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFJvbGVzKFN0cmluZyByb2xlc1tdKSB7CisgICAgICAgIHRoaXMucm9sZXMgPSByb2xlczsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZXNldCBhbGwgcHJvcGVydGllcyB0byB0aGVpciBkZWZhdWx0IHZhbHVlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBtYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVzZXQoQWN0aW9uTWFwcGluZyBtYXBwaW5nLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworCisgICAgICAgIHN1cGVyLnJlc2V0KG1hcHBpbmcsIHJlcXVlc3QpOworICAgICAgICB0aGlzLnJvbGVzID0gbnVsbDsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vdXNlcnMvU2F2ZUdyb3VwQWN0aW9uLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vdXNlcnMvU2F2ZUdyb3VwQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRmOTU2MgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi91c2Vycy9TYXZlR3JvdXBBY3Rpb24uamF2YQpAQCAtMCwwICsxLDI1MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4udXNlcnM7CisKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMRGVjb2RlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25FcnJvcnM7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcndhcmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5BdHRyaWJ1dGU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyRmFjdG9yeTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LlF1ZXJ5RXhwOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuUXVlcnk7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3RJbnN0YW5jZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5KTUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuQXR0cmlidXRlSW5mbzsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuT3BlcmF0aW9uSW5mbzsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuSW5mbzsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy51dGlsLk1lc3NhZ2VSZXNvdXJjZXM7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uQXBwbGljYXRpb25TZXJ2bGV0OworCisKKy8qKgorICogPHA+SW1wbGVtZW50YXRpb24gb2YgPHN0cm9uZz5BY3Rpb248L3N0cm9uZz4gdGhhdCBzYXZlcyBhIG5ldyBvcgorICogdXBkYXRlZCBHcm91cCBiYWNrIHRvIHRoZSB1bmRlcmx5aW5nIGRhdGFiYXNlLjwvcD4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKiBAc2luY2UgNC4xCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIFNhdmVHcm91cEFjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgTUJlYW5TZXJ2ZXIgd2Ugd2lsbCBiZSBpbnRlcmFjdGluZyB3aXRoLgorICAgICAqLworICAgIHByaXZhdGUgTUJlYW5TZXJ2ZXIgbXNlcnZlciA9IG51bGw7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBzcGVjaWZpZWQgSFRUUCByZXF1ZXN0LCBhbmQgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIEhUVFAKKyAgICAgKiByZXNwb25zZSAob3IgZm9yd2FyZCB0byBhbm90aGVyIHdlYiBjb21wb25lbnQgdGhhdCB3aWxsIGNyZWF0ZSBpdCkuCisgICAgICogUmV0dXJuIGFuIDxjb2RlPkFjdGlvbkZvcndhcmQ8L2NvZGU+IGluc3RhbmNlIGRlc2NyaWJpbmcgd2hlcmUgYW5kIGhvdworICAgICAqIGNvbnRyb2wgc2hvdWxkIGJlIGZvcndhcmRlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHJlc3BvbnNlIGhhcworICAgICAqIGFscmVhZHkgYmVlbiBjb21wbGV0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgQWN0aW9uTWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIGFjdGlvbkZvcm0gVGhlIG9wdGlvbmFsIEFjdGlvbkZvcm0gYmVhbiBmb3IgdGhpcyByZXF1ZXN0IChpZiBhbnkpCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIEhUVFAgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgSFRUUCByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXhjZXB0aW9uIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBBY3Rpb25Gb3J3YXJkIHBlcmZvcm0oQWN0aW9uTWFwcGluZyBtYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uRm9ybSBmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIExvb2sgdXAgdGhlIGNvbXBvbmVudHMgd2Ugd2lsbCBiZSB1c2luZyBhcyBuZWVkZWQKKyAgICAgICAgaWYgKG1zZXJ2ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgbXNlcnZlciA9ICgoQXBwbGljYXRpb25TZXJ2bGV0KSBnZXRTZXJ2bGV0KCkpLmdldFNlcnZlcigpOworICAgICAgICB9CisgICAgICAgIE1lc3NhZ2VSZXNvdXJjZXMgcmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VzKHJlcXVlc3QpOworICAgICAgICBIdHRwU2Vzc2lvbiBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uKCk7CisgICAgICAgIExvY2FsZSBsb2NhbGUgPSBnZXRMb2NhbGUocmVxdWVzdCk7CisKKyAgICAgICAgLy8gSGFzIHRoaXMgdHJhbnNhY3Rpb24gYmVlbiBjYW5jZWxsZWQ/CisgICAgICAgIGlmIChpc0NhbmNlbGxlZChyZXF1ZXN0KSkgeworICAgICAgICAgICAgcmV0dXJuIChtYXBwaW5nLmZpbmRGb3J3YXJkKCJMaXN0IFJvbGVzIFNldHVwIikpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2hlY2sgdGhlIHRyYW5zYWN0aW9uIHRva2VuCisgICAgICAgIGlmICghaXNUb2tlblZhbGlkKHJlcXVlc3QpKSB7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19CQURfUkVRVUVTVCwKKyAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IudG9rZW4iKSk7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUGVyZm9ybSBhbnkgZXh0cmEgdmFsaWRhdGlvbiB0aGF0IGlzIHJlcXVpcmVkCisgICAgICAgIEdyb3VwRm9ybSBncm91cEZvcm0gPSAoR3JvdXBGb3JtKSBmb3JtOworICAgICAgICBTdHJpbmcgZGF0YWJhc2VOYW1lID0KKyAgICAgICAgICAgIFVSTERlY29kZXIuZGVjb2RlKGdyb3VwRm9ybS5nZXREYXRhYmFzZU5hbWUoKSk7CisgICAgICAgIFN0cmluZyBvYmplY3ROYW1lID0gZ3JvdXBGb3JtLmdldE9iamVjdE5hbWUoKTsKKworICAgICAgICAvLyBQZXJmb3JtIGFuICJBZGQgR3JvdXAiIHRyYW5zYWN0aW9uCisgICAgICAgIGlmIChvYmplY3ROYW1lID09IG51bGwpIHsKKworICAgICAgICAgICAgU3RyaW5nIHNpZ25hdHVyZVtdID0gbmV3IFN0cmluZ1syXTsKKyAgICAgICAgICAgIHNpZ25hdHVyZVswXSA9ICJqYXZhLmxhbmcuU3RyaW5nIjsKKyAgICAgICAgICAgIHNpZ25hdHVyZVsxXSA9ICJqYXZhLmxhbmcuU3RyaW5nIjsKKworICAgICAgICAgICAgT2JqZWN0IHBhcmFtc1tdID0gbmV3IE9iamVjdFsyXTsKKyAgICAgICAgICAgIHBhcmFtc1swXSA9IGdyb3VwRm9ybS5nZXRHcm91cG5hbWUoKTsKKyAgICAgICAgICAgIHBhcmFtc1sxXSA9IGdyb3VwRm9ybS5nZXREZXNjcmlwdGlvbigpOworCisgICAgICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0gbnVsbDsKKworICAgICAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgICAgIC8vIENvbnN0cnVjdCB0aGUgTUJlYW4gTmFtZSBmb3Igb3VyIFVzZXJEYXRhYmFzZQorICAgICAgICAgICAgICAgIG9uYW1lID0gbmV3IE9iamVjdE5hbWUoZGF0YWJhc2VOYW1lKTsKKworICAgICAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgbmV3IG9iamVjdCBhbmQgYXNzb2NpYXRlZCBNQmVhbgorICAgICAgICAgICAgICAgIG9iamVjdE5hbWUgPSAoU3RyaW5nKSBtc2VydmVyLmludm9rZShvbmFtZSwgImNyZWF0ZUdyb3VwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLCBzaWduYXR1cmUpOworCisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCisgICAgICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZworICAgICAgICAgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuaW52b2tlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjcmVhdGVHcm91cCIpLCBlKTsKKyAgICAgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuaW52b2tlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjcmVhdGVHcm91cCIpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICAvLyBQZXJmb3JtIGFuICJVcGRhdGUgR3JvdXAiIHRyYW5zYWN0aW9uCisgICAgICAgIGVsc2UgeworCisgICAgICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0gbnVsbDsKKyAgICAgICAgICAgIFN0cmluZyBhdHRyaWJ1dGUgPSBudWxsOworCisgICAgICAgICAgICB0cnkgeworCisgICAgICAgICAgICAgICAgLy8gQ29uc3RydWN0IGFuIG9iamVjdCBuYW1lIGZvciB0aGlzIG9iamVjdAorICAgICAgICAgICAgICAgIG9uYW1lID0gbmV3IE9iamVjdE5hbWUob2JqZWN0TmFtZSk7CisKKyAgICAgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIHNwZWNpZmllZCByb2xlCisgICAgICAgICAgICAgICAgYXR0cmlidXRlID0gImRlc2NyaXB0aW9uIjsKKyAgICAgICAgICAgICAgICBtc2VydmVyLnNldEF0dHJpYnV0ZQorICAgICAgICAgICAgICAgICAgICAob25hbWUsCisgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKGF0dHJpYnV0ZSwgZ3JvdXBGb3JtLmdldERlc2NyaXB0aW9uKCkpKTsKKworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKworICAgICAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLnNldC5hdHRyaWJ1dGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlKSwgZSk7CisgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLnNldC5hdHRyaWJ1dGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworCisgICAgICAgIC8vIFJlc2V0IHRoZSByb2xlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBncm91cAorICAgICAgICB0cnkgeworCisgICAgICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0gbmV3IE9iamVjdE5hbWUob2JqZWN0TmFtZSk7CisgICAgICAgICAgICBtc2VydmVyLmludm9rZShvbmFtZSwgInJlbW92ZVJvbGVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbMF0sIG5ldyBTdHJpbmdbMF0pOworICAgICAgICAgICAgU3RyaW5nIHJvbGVzW10gPSBncm91cEZvcm0uZ2V0Um9sZXMoKTsKKyAgICAgICAgICAgIGlmIChyb2xlcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcm9sZXMgPSBuZXcgU3RyaW5nWzBdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nIGFkZHNpZ1tdID0gbmV3IFN0cmluZ1sxXTsKKyAgICAgICAgICAgIGFkZHNpZ1swXSA9ICJqYXZhLmxhbmcuU3RyaW5nIjsKKyAgICAgICAgICAgIE9iamVjdCBhZGRwYXJbXSA9IG5ldyBPYmplY3RbMV07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJvbGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgYWRkcGFyWzBdID0KKyAgICAgICAgICAgICAgICAgICAgKG5ldyBPYmplY3ROYW1lKHJvbGVzW2ldKSkuZ2V0S2V5UHJvcGVydHkoInJvbGVuYW1lIik7CisgICAgICAgICAgICAgICAgbXNlcnZlci5pbnZva2Uob25hbWUsICJhZGRSb2xlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRwYXIsIGFkZHNpZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKworICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZworICAgICAgICAgICAgICAgIChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5pbnZva2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWRkUm9sZSIpLCBlKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuaW52b2tlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkZFJvbGUiKSk7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworCisgICAgICAgIH0KKworICAgICAgICAvLyBTYXZlIHRoZSB1cGRhdGVkIGRhdGFiYXNlIGluZm9ybWF0aW9uCisgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgIE9iamVjdE5hbWUgZG5hbWUgPSBuZXcgT2JqZWN0TmFtZShkYXRhYmFzZU5hbWUpOworICAgICAgICAgICAgbXNlcnZlci5pbnZva2UoZG5hbWUsICJzYXZlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbMF0sIG5ldyBTdHJpbmdbMF0pOworCisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisKKyAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuaW52b2tlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNhdmUiKSwgZSk7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsCisgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmludm9rZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzYXZlIikpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKworICAgICAgICB9CisKKyAgICAgICAgLy8gUHJvY2VlZCB0byB0aGUgbGlzdCByb2xlcyBzY3JlZW4KKyAgICAgICAgcmV0dXJuIChtYXBwaW5nLmZpbmRGb3J3YXJkKCJHcm91cHMgTGlzdCBTZXR1cCIpKTsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vdXNlcnMvU2F2ZVJvbGVBY3Rpb24uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi91c2Vycy9TYXZlUm9sZUFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlNDhiNTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vdXNlcnMvU2F2ZVJvbGVBY3Rpb24uamF2YQpAQCAtMCwwICsxLDIxNiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4udXNlcnM7CisKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMRGVjb2RlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25FcnJvcnM7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcndhcmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5BdHRyaWJ1dGU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyRmFjdG9yeTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LlF1ZXJ5RXhwOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuUXVlcnk7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3RJbnN0YW5jZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5KTUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuQXR0cmlidXRlSW5mbzsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuT3BlcmF0aW9uSW5mbzsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuSW5mbzsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy51dGlsLk1lc3NhZ2VSZXNvdXJjZXM7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uQXBwbGljYXRpb25TZXJ2bGV0OworCisKKy8qKgorICogPHA+SW1wbGVtZW50YXRpb24gb2YgPHN0cm9uZz5BY3Rpb248L3N0cm9uZz4gdGhhdCBzYXZlcyBhIG5ldyBvcgorICogdXBkYXRlZCBSb2xlIGJhY2sgdG8gdGhlIHVuZGVybHlpbmcgZGF0YWJhc2UuPC9wPgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqIEBzaW5jZSA0LjEKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgU2F2ZVJvbGVBY3Rpb24gZXh0ZW5kcyBBY3Rpb24geworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIE1CZWFuU2VydmVyIHdlIHdpbGwgYmUgaW50ZXJhY3Rpbmcgd2l0aC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1CZWFuU2VydmVyIG1zZXJ2ZXIgPSBudWxsOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUHJvY2VzcyB0aGUgc3BlY2lmaWVkIEhUVFAgcmVxdWVzdCwgYW5kIGNyZWF0ZSB0aGUgY29ycmVzcG9uZGluZyBIVFRQCisgICAgICogcmVzcG9uc2UgKG9yIGZvcndhcmQgdG8gYW5vdGhlciB3ZWIgY29tcG9uZW50IHRoYXQgd2lsbCBjcmVhdGUgaXQpLgorICAgICAqIFJldHVybiBhbiA8Y29kZT5BY3Rpb25Gb3J3YXJkPC9jb2RlPiBpbnN0YW5jZSBkZXNjcmliaW5nIHdoZXJlIGFuZCBob3cKKyAgICAgKiBjb250cm9sIHNob3VsZCBiZSBmb3J3YXJkZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSByZXNwb25zZSBoYXMKKyAgICAgKiBhbHJlYWR5IGJlZW4gY29tcGxldGVkLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIEFjdGlvbk1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSBhY3Rpb25Gb3JtIFRoZSBvcHRpb25hbCBBY3Rpb25Gb3JtIGJlYW4gZm9yIHRoaXMgcmVxdWVzdCAoaWYgYW55KQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBIVFRQIHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIEhUVFAgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0IGV4Y2VwdGlvbiBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgQWN0aW9uRm9yd2FyZCBwZXJmb3JtKEFjdGlvbk1hcHBpbmcgbWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbkZvcm0gZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICAvLyBMb29rIHVwIHRoZSBjb21wb25lbnRzIHdlIHdpbGwgYmUgdXNpbmcgYXMgbmVlZGVkCisgICAgICAgIGlmIChtc2VydmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIG1zZXJ2ZXIgPSAoKEFwcGxpY2F0aW9uU2VydmxldCkgZ2V0U2VydmxldCgpKS5nZXRTZXJ2ZXIoKTsKKyAgICAgICAgfQorICAgICAgICBNZXNzYWdlUmVzb3VyY2VzIHJlc291cmNlcyA9IGdldFJlc291cmNlcyhyZXF1ZXN0KTsKKyAgICAgICAgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpOworICAgICAgICBMb2NhbGUgbG9jYWxlID0gZ2V0TG9jYWxlKHJlcXVlc3QpOworCisgICAgICAgIC8vIEhhcyB0aGlzIHRyYW5zYWN0aW9uIGJlZW4gY2FuY2VsbGVkPworICAgICAgICBpZiAoaXNDYW5jZWxsZWQocmVxdWVzdCkpIHsKKyAgICAgICAgICAgIHJldHVybiAobWFwcGluZy5maW5kRm9yd2FyZCgiTGlzdCBSb2xlcyBTZXR1cCIpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENoZWNrIHRoZSB0cmFuc2FjdGlvbiB0b2tlbgorICAgICAgICBpZiAoIWlzVG9rZW5WYWxpZChyZXF1ZXN0KSkgeworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfQkFEX1JFUVVFU1QsCisgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLnRva2VuIikpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFBlcmZvcm0gYW55IGV4dHJhIHZhbGlkYXRpb24gdGhhdCBpcyByZXF1aXJlZAorICAgICAgICBSb2xlRm9ybSByb2xlRm9ybSA9IChSb2xlRm9ybSkgZm9ybTsKKyAgICAgICAgU3RyaW5nIGRhdGFiYXNlTmFtZSA9CisgICAgICAgICAgICBVUkxEZWNvZGVyLmRlY29kZShyb2xlRm9ybS5nZXREYXRhYmFzZU5hbWUoKSk7CisgICAgICAgIFN0cmluZyBvYmplY3ROYW1lID0gcm9sZUZvcm0uZ2V0T2JqZWN0TmFtZSgpOworCisgICAgICAgIC8vIFBlcmZvcm0gYW4gIkFkZCBSb2xlIiB0cmFuc2FjdGlvbgorICAgICAgICBpZiAob2JqZWN0TmFtZSA9PSBudWxsKSB7CisKKyAgICAgICAgICAgIFN0cmluZyBzaWduYXR1cmVbXSA9IG5ldyBTdHJpbmdbMl07CisgICAgICAgICAgICBzaWduYXR1cmVbMF0gPSAiamF2YS5sYW5nLlN0cmluZyI7CisgICAgICAgICAgICBzaWduYXR1cmVbMV0gPSAiamF2YS5sYW5nLlN0cmluZyI7CisKKyAgICAgICAgICAgIE9iamVjdCBwYXJhbXNbXSA9IG5ldyBPYmplY3RbMl07CisgICAgICAgICAgICBwYXJhbXNbMF0gPSByb2xlRm9ybS5nZXRSb2xlbmFtZSgpOworICAgICAgICAgICAgcGFyYW1zWzFdID0gcm9sZUZvcm0uZ2V0RGVzY3JpcHRpb24oKTsKKworICAgICAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9IG51bGw7CisKKyAgICAgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgICAgICAvLyBDb25zdHJ1Y3QgdGhlIE1CZWFuIE5hbWUgZm9yIG91ciBVc2VyRGF0YWJhc2UKKyAgICAgICAgICAgICAgICBvbmFtZSA9IG5ldyBPYmplY3ROYW1lKGRhdGFiYXNlTmFtZSk7CisKKyAgICAgICAgICAgICAgICAvLyBDcmVhdGUgdGhlIG5ldyBvYmplY3QgYW5kIGFzc29jaWF0ZWQgTUJlYW4KKyAgICAgICAgICAgICAgICBtc2VydmVyLmludm9rZShvbmFtZSwgImNyZWF0ZVJvbGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcywgc2lnbmF0dXJlKTsKKworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKworICAgICAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmludm9rZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3JlYXRlUm9sZSIpLCBlKTsKKyAgICAgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuaW52b2tlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjcmVhdGVSb2xlIikpOworICAgICAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIC8vIFBlcmZvcm0gYW4gIlVwZGF0ZSBSb2xlIiB0cmFuc2FjdGlvbgorICAgICAgICBlbHNlIHsKKworICAgICAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9IG51bGw7CisgICAgICAgICAgICBTdHJpbmcgYXR0cmlidXRlID0gbnVsbDsKKworICAgICAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgICAgIC8vIENvbnN0cnVjdCBhbiBvYmplY3QgbmFtZSBmb3IgdGhpcyBvYmplY3QKKyAgICAgICAgICAgICAgICBvbmFtZSA9IG5ldyBPYmplY3ROYW1lKG9iamVjdE5hbWUpOworCisgICAgICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBzcGVjaWZpZWQgcm9sZQorICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJkZXNjcmlwdGlvbiI7CisgICAgICAgICAgICAgICAgbXNlcnZlci5zZXRBdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICAgICAgKG9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZShhdHRyaWJ1dGUsIHJvbGVGb3JtLmdldERlc2NyaXB0aW9uKCkpKTsKKworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKworICAgICAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLnNldC5hdHRyaWJ1dGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlKSwgZSk7CisgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLnNldC5hdHRyaWJ1dGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICAvLyBTYXZlIHRoZSB1cGRhdGVkIGRhdGFiYXNlIGluZm9ybWF0aW9uCisgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgIE9iamVjdE5hbWUgZG5hbWUgPSBuZXcgT2JqZWN0TmFtZShkYXRhYmFzZU5hbWUpOworICAgICAgICAgICAgbXNlcnZlci5pbnZva2UoZG5hbWUsICJzYXZlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbMF0sIG5ldyBTdHJpbmdbMF0pOworCisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisKKyAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuaW52b2tlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNhdmUiKSwgZSk7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsCisgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmludm9rZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzYXZlIikpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKworICAgICAgICB9CisKKyAgICAgICAgLy8gUHJvY2VlZCB0byB0aGUgbGlzdCByb2xlcyBzY3JlZW4KKyAgICAgICAgcmV0dXJuIChtYXBwaW5nLmZpbmRGb3J3YXJkKCJSb2xlcyBMaXN0IFNldHVwIikpOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi91c2Vycy9TYXZlVXNlckFjdGlvbi5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3VzZXJzL1NhdmVVc2VyQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA1ZTc5OAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi91c2Vycy9TYXZlVXNlckFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjg4IEBACisvKgorICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi51c2VyczsKKworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkxEZWNvZGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkVycm9yczsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9ybTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9yd2FyZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LkF0dHJpYnV0ZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXJGYWN0b3J5OworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuUXVlcnlFeHA7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5RdWVyeTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdEluc3RhbmNlOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LkpNRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5BdHRyaWJ1dGVJbmZvOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5PcGVyYXRpb25JbmZvOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5JbmZvOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLnV0aWwuTWVzc2FnZVJlc291cmNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5BcHBsaWNhdGlvblNlcnZsZXQ7CisKKworLyoqCisgKiA8cD5JbXBsZW1lbnRhdGlvbiBvZiA8c3Ryb25nPkFjdGlvbjwvc3Ryb25nPiB0aGF0IHNhdmVzIGEgbmV3IG9yCisgKiB1cGRhdGVkIFVzZXIgYmFjayB0byB0aGUgdW5kZXJseWluZyBkYXRhYmFzZS48L3A+CisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICogQHNpbmNlIDQuMQorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBTYXZlVXNlckFjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgTUJlYW5TZXJ2ZXIgd2Ugd2lsbCBiZSBpbnRlcmFjdGluZyB3aXRoLgorICAgICAqLworICAgIHByaXZhdGUgTUJlYW5TZXJ2ZXIgbXNlcnZlciA9IG51bGw7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBzcGVjaWZpZWQgSFRUUCByZXF1ZXN0LCBhbmQgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIEhUVFAKKyAgICAgKiByZXNwb25zZSAob3IgZm9yd2FyZCB0byBhbm90aGVyIHdlYiBjb21wb25lbnQgdGhhdCB3aWxsIGNyZWF0ZSBpdCkuCisgICAgICogUmV0dXJuIGFuIDxjb2RlPkFjdGlvbkZvcndhcmQ8L2NvZGU+IGluc3RhbmNlIGRlc2NyaWJpbmcgd2hlcmUgYW5kIGhvdworICAgICAqIGNvbnRyb2wgc2hvdWxkIGJlIGZvcndhcmRlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHJlc3BvbnNlIGhhcworICAgICAqIGFscmVhZHkgYmVlbiBjb21wbGV0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgQWN0aW9uTWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIGFjdGlvbkZvcm0gVGhlIG9wdGlvbmFsIEFjdGlvbkZvcm0gYmVhbiBmb3IgdGhpcyByZXF1ZXN0IChpZiBhbnkpCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIEhUVFAgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgSFRUUCByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXhjZXB0aW9uIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBBY3Rpb25Gb3J3YXJkIHBlcmZvcm0oQWN0aW9uTWFwcGluZyBtYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uRm9ybSBmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIExvb2sgdXAgdGhlIGNvbXBvbmVudHMgd2Ugd2lsbCBiZSB1c2luZyBhcyBuZWVkZWQKKyAgICAgICAgaWYgKG1zZXJ2ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgbXNlcnZlciA9ICgoQXBwbGljYXRpb25TZXJ2bGV0KSBnZXRTZXJ2bGV0KCkpLmdldFNlcnZlcigpOworICAgICAgICB9CisgICAgICAgIE1lc3NhZ2VSZXNvdXJjZXMgcmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VzKHJlcXVlc3QpOworICAgICAgICBIdHRwU2Vzc2lvbiBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uKCk7CisgICAgICAgIExvY2FsZSBsb2NhbGUgPSBnZXRMb2NhbGUocmVxdWVzdCk7CisKKyAgICAgICAgLy8gSGFzIHRoaXMgdHJhbnNhY3Rpb24gYmVlbiBjYW5jZWxsZWQ/CisgICAgICAgIGlmIChpc0NhbmNlbGxlZChyZXF1ZXN0KSkgeworICAgICAgICAgICAgcmV0dXJuIChtYXBwaW5nLmZpbmRGb3J3YXJkKCJMaXN0IFVzZXJzIFNldHVwIikpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2hlY2sgdGhlIHRyYW5zYWN0aW9uIHRva2VuCisgICAgICAgIGlmICghaXNUb2tlblZhbGlkKHJlcXVlc3QpKSB7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19CQURfUkVRVUVTVCwKKyAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IudG9rZW4iKSk7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUGVyZm9ybSBhbnkgZXh0cmEgdmFsaWRhdGlvbiB0aGF0IGlzIHJlcXVpcmVkCisgICAgICAgIFVzZXJGb3JtIHVzZXJGb3JtID0gKFVzZXJGb3JtKSBmb3JtOworICAgICAgICBTdHJpbmcgZGF0YWJhc2VOYW1lID0KKyAgICAgICAgICAgIFVSTERlY29kZXIuZGVjb2RlKHVzZXJGb3JtLmdldERhdGFiYXNlTmFtZSgpKTsKKyAgICAgICAgU3RyaW5nIG9iamVjdE5hbWUgPSB1c2VyRm9ybS5nZXRPYmplY3ROYW1lKCk7CisKKyAgICAgICAgLy8gUGVyZm9ybSBhbiAiQWRkIFVzZXIiIHRyYW5zYWN0aW9uCisgICAgICAgIGlmIChvYmplY3ROYW1lID09IG51bGwpIHsKKworICAgICAgICAgICAgU3RyaW5nIHNpZ25hdHVyZVtdID0gbmV3IFN0cmluZ1szXTsKKyAgICAgICAgICAgIHNpZ25hdHVyZVswXSA9ICJqYXZhLmxhbmcuU3RyaW5nIjsKKyAgICAgICAgICAgIHNpZ25hdHVyZVsxXSA9ICJqYXZhLmxhbmcuU3RyaW5nIjsKKyAgICAgICAgICAgIHNpZ25hdHVyZVsyXSA9ICJqYXZhLmxhbmcuU3RyaW5nIjsKKworICAgICAgICAgICAgT2JqZWN0IHBhcmFtc1tdID0gbmV3IE9iamVjdFszXTsKKyAgICAgICAgICAgIHBhcmFtc1swXSA9IHVzZXJGb3JtLmdldFVzZXJuYW1lKCk7CisgICAgICAgICAgICBwYXJhbXNbMV0gPSB1c2VyRm9ybS5nZXRQYXNzd29yZCgpOworICAgICAgICAgICAgcGFyYW1zWzJdID0gdXNlckZvcm0uZ2V0RnVsbE5hbWUoKTsKKworICAgICAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9IG51bGw7CisKKyAgICAgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgICAgICAvLyBDb25zdHJ1Y3QgdGhlIE1CZWFuIE5hbWUgZm9yIG91ciBVc2VyRGF0YWJhc2UKKyAgICAgICAgICAgICAgICBvbmFtZSA9IG5ldyBPYmplY3ROYW1lKGRhdGFiYXNlTmFtZSk7CisKKyAgICAgICAgICAgICAgICAvLyBDcmVhdGUgdGhlIG5ldyBvYmplY3QgYW5kIGFzc29jaWF0ZWQgTUJlYW4KKyAgICAgICAgICAgICAgICBvYmplY3ROYW1lID0gKFN0cmluZykgbXNlcnZlci5pbnZva2Uob25hbWUsICJjcmVhdGVVc2VyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLCBzaWduYXR1cmUpOworCisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCisgICAgICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZworICAgICAgICAgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuaW52b2tlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjcmVhdGVVc2VyIiksIGUpOworICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5pbnZva2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNyZWF0ZVVzZXIiKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgLy8gUGVyZm9ybSBhbiAiVXBkYXRlIFVzZXIiIHRyYW5zYWN0aW9uCisgICAgICAgIGVsc2UgeworCisgICAgICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0gbnVsbDsKKyAgICAgICAgICAgIFN0cmluZyBhdHRyaWJ1dGUgPSBudWxsOworCisgICAgICAgICAgICB0cnkgeworCisgICAgICAgICAgICAgICAgLy8gQ29uc3RydWN0IGFuIG9iamVjdCBuYW1lIGZvciB0aGlzIG9iamVjdAorICAgICAgICAgICAgICAgIG9uYW1lID0gbmV3IE9iamVjdE5hbWUob2JqZWN0TmFtZSk7CisKKyAgICAgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIHNwZWNpZmllZCB1c2VyCisgICAgICAgICAgICAgICAgYXR0cmlidXRlID0gImZ1bGxOYW1lIjsKKyAgICAgICAgICAgICAgICBtc2VydmVyLnNldEF0dHJpYnV0ZQorICAgICAgICAgICAgICAgICAgICAob25hbWUsCisgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKGF0dHJpYnV0ZSwgdXNlckZvcm0uZ2V0RnVsbE5hbWUoKSkpOworICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJwYXNzd29yZCI7CisgICAgICAgICAgICAgICAgbXNlcnZlci5zZXRBdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICAgICAgKG9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZShhdHRyaWJ1dGUsIHVzZXJGb3JtLmdldFBhc3N3b3JkKCkpKTsKKworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKworICAgICAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLnNldC5hdHRyaWJ1dGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlKSwgZSk7CisgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLnNldC5hdHRyaWJ1dGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICAvLyBSZXNldCB0aGUgZ3JvdXBzIHRoaXMgdXNlciBpcyBhIG1lbWJlciBvZgorICAgICAgICB0cnkgeworCisgICAgICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0gbmV3IE9iamVjdE5hbWUob2JqZWN0TmFtZSk7CisgICAgICAgICAgICBtc2VydmVyLmludm9rZShvbmFtZSwgInJlbW92ZUdyb3VwcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0WzBdLCBuZXcgU3RyaW5nWzBdKTsKKyAgICAgICAgICAgIFN0cmluZyBncm91cHNbXSA9IHVzZXJGb3JtLmdldEdyb3VwcygpOworICAgICAgICAgICAgaWYgKGdyb3VwcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgZ3JvdXBzID0gbmV3IFN0cmluZ1swXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0cmluZyBhZGRzaWdbXSA9IG5ldyBTdHJpbmdbMV07CisgICAgICAgICAgICBhZGRzaWdbMF0gPSAiamF2YS5sYW5nLlN0cmluZyI7CisgICAgICAgICAgICBPYmplY3QgYWRkcGFyW10gPSBuZXcgT2JqZWN0WzFdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBncm91cHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBhZGRwYXJbMF0gPQorICAgICAgICAgICAgICAgICAgICAobmV3IE9iamVjdE5hbWUoZ3JvdXBzW2ldKSkuZ2V0S2V5UHJvcGVydHkoImdyb3VwbmFtZSIpOworICAgICAgICAgICAgICAgIG1zZXJ2ZXIuaW52b2tlKG9uYW1lLCAiYWRkR3JvdXAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHBhciwgYWRkc2lnKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCisgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nCisgICAgICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmludm9rZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZGRHcm91cCIpLCBlKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuaW52b2tlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkZEdyb3VwIikpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKworICAgICAgICB9CisKKyAgICAgICAgLy8gUmVzZXQgdGhlIHJvbGVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHVzZXIKKyAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9IG5ldyBPYmplY3ROYW1lKG9iamVjdE5hbWUpOworICAgICAgICAgICAgbXNlcnZlci5pbnZva2Uob25hbWUsICJyZW1vdmVSb2xlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0WzBdLCBuZXcgU3RyaW5nWzBdKTsKKyAgICAgICAgICAgIFN0cmluZyByb2xlc1tdID0gdXNlckZvcm0uZ2V0Um9sZXMoKTsKKyAgICAgICAgICAgIGlmIChyb2xlcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcm9sZXMgPSBuZXcgU3RyaW5nWzBdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nIGFkZHNpZ1tdID0gbmV3IFN0cmluZ1sxXTsKKyAgICAgICAgICAgIGFkZHNpZ1swXSA9ICJqYXZhLmxhbmcuU3RyaW5nIjsKKyAgICAgICAgICAgIE9iamVjdCBhZGRwYXJbXSA9IG5ldyBPYmplY3RbMV07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJvbGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgYWRkcGFyWzBdID0KKyAgICAgICAgICAgICAgICAgICAgKG5ldyBPYmplY3ROYW1lKHJvbGVzW2ldKSkuZ2V0S2V5UHJvcGVydHkoInJvbGVuYW1lIik7CisgICAgICAgICAgICAgICAgbXNlcnZlci5pbnZva2Uob25hbWUsICJhZGRSb2xlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRwYXIsIGFkZHNpZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKworICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZworICAgICAgICAgICAgICAgIChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5pbnZva2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWRkUm9sZSIpLCBlKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuaW52b2tlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkZFJvbGUiKSk7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworCisgICAgICAgIH0KKworICAgICAgICAvLyBTYXZlIHRoZSB1cGRhdGVkIGRhdGFiYXNlIGluZm9ybWF0aW9uCisgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgIE9iamVjdE5hbWUgZG5hbWUgPSBuZXcgT2JqZWN0TmFtZShkYXRhYmFzZU5hbWUpOworICAgICAgICAgICAgbXNlcnZlci5pbnZva2UoZG5hbWUsICJzYXZlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbMF0sIG5ldyBTdHJpbmdbMF0pOworCisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisKKyAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuaW52b2tlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNhdmUiKSwgZSk7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsCisgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmludm9rZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzYXZlIikpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKworICAgICAgICB9CisKKyAgICAgICAgLy8gUHJvY2VlZCB0byB0aGUgbGlzdCByb2xlcyBzY3JlZW4KKyAgICAgICAgcmV0dXJuIChtYXBwaW5nLmZpbmRGb3J3YXJkKCJVc2VycyBMaXN0IFNldHVwIikpOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi91c2Vycy9TZXRVcEdyb3VwQWN0aW9uLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vdXNlcnMvU2V0VXBHcm91cEFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlMmNiOTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vdXNlcnMvU2V0VXBHcm91cEFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTY2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi51c2VyczsKKworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkxEZWNvZGVyOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuQXR0cmlidXRlOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlckZhY3Rvcnk7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5RdWVyeUV4cDsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LlF1ZXJ5OworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0SW5zdGFuY2U7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuSk1FeGNlcHRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhbkF0dHJpYnV0ZUluZm87CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhbk9wZXJhdGlvbkluZm87CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhbkluZm87CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkVycm9yczsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9ybTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9yd2FyZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy51dGlsLk1lc3NhZ2VSZXNvdXJjZXM7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uQXBwbGljYXRpb25TZXJ2bGV0OworCisKKy8qKgorICogPHA+SW1wbGVtZW50YXRpb24gb2YgPHN0cm9uZz5BY3Rpb248L3N0cm9uZz4gdGhhdCBzZXRzIHVwIGFuZCBzdGFzaGVzCisgKiBhIDxjb2RlPkdyb3VwRm9ybTwvY29kZT4gYmVhbiBpbiByZXF1ZXN0IHNjb3BlLiAgVGhlIGZvcm0gYmVhbiB3aWxsIGhhdmUKKyAqIGEgbnVsbCA8Y29kZT5vYmplY3ROYW1lPC9jb2RlPiBwcm9wZXJ0eSBpZiB0aGlzIGZvcm0gcmVwcmVzZW50cyBhIGdyb3VwCisgKiBiZWluZyBhZGRlZCwgb3IgYSBub24tbnVsbCB2YWx1ZSBmb3IgYW4gZXhpc3RpbmcgZ3JvdXAuPC9wPgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqIEBzaW5jZSA0LjEKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgU2V0VXBHcm91cEFjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgTUJlYW5TZXJ2ZXIgd2Ugd2lsbCBiZSBpbnRlcmFjdGluZyB3aXRoLgorICAgICAqLworICAgIHByaXZhdGUgTUJlYW5TZXJ2ZXIgbXNlcnZlciA9IG51bGw7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBzcGVjaWZpZWQgSFRUUCByZXF1ZXN0LCBhbmQgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIEhUVFAKKyAgICAgKiByZXNwb25zZSAob3IgZm9yd2FyZCB0byBhbm90aGVyIHdlYiBjb21wb25lbnQgdGhhdCB3aWxsIGNyZWF0ZSBpdCkuCisgICAgICogUmV0dXJuIGFuIDxjb2RlPkFjdGlvbkZvcndhcmQ8L2NvZGU+IGluc3RhbmNlIGRlc2NyaWJpbmcgd2hlcmUgYW5kIGhvdworICAgICAqIGNvbnRyb2wgc2hvdWxkIGJlIGZvcndhcmRlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHJlc3BvbnNlIGhhcworICAgICAqIGFscmVhZHkgYmVlbiBjb21wbGV0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgQWN0aW9uTWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIGFjdGlvbkZvcm0gVGhlIG9wdGlvbmFsIEFjdGlvbkZvcm0gYmVhbiBmb3IgdGhpcyByZXF1ZXN0IChpZiBhbnkpCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIEhUVFAgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgSFRUUCByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXhjZXB0aW9uIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBBY3Rpb25Gb3J3YXJkIHBlcmZvcm0oQWN0aW9uTWFwcGluZyBtYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uRm9ybSBmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIExvb2sgdXAgdGhlIGNvbXBvbmVudHMgd2Ugd2lsbCBiZSB1c2luZyBhcyBuZWVkZWQKKyAgICAgICAgaWYgKG1zZXJ2ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgbXNlcnZlciA9ICgoQXBwbGljYXRpb25TZXJ2bGV0KSBnZXRTZXJ2bGV0KCkpLmdldFNlcnZlcigpOworICAgICAgICB9CisgICAgICAgIE1lc3NhZ2VSZXNvdXJjZXMgcmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VzKHJlcXVlc3QpOworICAgICAgICBIdHRwU2Vzc2lvbiBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uKCk7CisgICAgICAgIExvY2FsZSBsb2NhbGUgPSBnZXRMb2NhbGUocmVxdWVzdCk7CisKKyAgICAgICAgLy8gU2V0IHVwIGEgYmVhbiBjb250YWluaW5nIGFsbCBwb3NzaWJsZSByb2xlcworICAgICAgICBTdHJpbmcgZGF0YWJhc2VOYW1lID0KKyAgICAgICAgICAgIFVSTERlY29kZXIuZGVjb2RlKHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJkYXRhYmFzZU5hbWUiKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXF1ZXN0LnNldEF0dHJpYnV0ZSgicm9sZXNGb3JtIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJVdGlscy5nZXRSb2xlc0Zvcm0obXNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWJhc2VOYW1lKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nCisgICAgICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzZXJzLmVycm9yLmF0dHJpYnV0ZS5nZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicm9sZXMiKSwgZSk7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsCisgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlCisgICAgICAgICAgICAgICAgIChsb2NhbGUsICJ1c2Vycy5lcnJvci5hdHRyaWJ1dGUuZ2V0IiwgInJvbGVzIikpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFNldCB1cCB0aGUgZm9ybSBiZWFuIGJhc2VkIG9uIHRoZSBjcmVhdGluZyBvciBlZGl0aW5nIHN0YXRlCisgICAgICAgIFN0cmluZyBvYmplY3ROYW1lID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoIm9iamVjdE5hbWUiKTsKKyAgICAgICAgR3JvdXBGb3JtIGdyb3VwRm9ybSA9IG5ldyBHcm91cEZvcm0oKTsKKyAgICAgICAgaWYgKG9iamVjdE5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgZ3JvdXBGb3JtLnNldE5vZGVMYWJlbAorICAgICAgICAgICAgICAgIChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5ncm91cC5uZXdHcm91cCIpKTsKKyAgICAgICAgICAgIGdyb3VwRm9ybS5zZXRPYmplY3ROYW1lKG51bGwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZ3JvdXBGb3JtLnNldE5vZGVMYWJlbAorICAgICAgICAgICAgICAgIChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5ncm91cC5vbGRHcm91cCIpKTsKKyAgICAgICAgICAgIGdyb3VwRm9ybS5zZXRPYmplY3ROYW1lKG9iamVjdE5hbWUpOworICAgICAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZSA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPSBuZXcgT2JqZWN0TmFtZShvYmplY3ROYW1lKTsKKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgPSAiZ3JvdXBuYW1lIjsKKyAgICAgICAgICAgICAgICBncm91cEZvcm0uc2V0R3JvdXBuYW1lCisgICAgICAgICAgICAgICAgICAgICgoU3RyaW5nKSBtc2VydmVyLmdldEF0dHJpYnV0ZShvbmFtZSwgYXR0cmlidXRlKSk7CisgICAgICAgICAgICAgICAgYXR0cmlidXRlID0gImRlc2NyaXB0aW9uIjsKKyAgICAgICAgICAgICAgICBncm91cEZvcm0uc2V0RGVzY3JpcHRpb24KKyAgICAgICAgICAgICAgICAgICAgKChTdHJpbmcpIG1zZXJ2ZXIuZ2V0QXR0cmlidXRlKG9uYW1lLCBhdHRyaWJ1dGUpKTsKKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgPSAicm9sZXMiOworICAgICAgICAgICAgICAgIGdyb3VwRm9ybS5zZXRSb2xlcworICAgICAgICAgICAgICAgICAgICAoKFN0cmluZ1tdKSBtc2VydmVyLmdldEF0dHJpYnV0ZShvbmFtZSwgYXR0cmlidXRlKSk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ1c2Vycy5lcnJvci5hdHRyaWJ1dGUuZ2V0IiwgYXR0cmlidXRlKSwgZSk7CisgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlCisgICAgICAgICAgICAgICAgICAgICAgICAgKGxvY2FsZSwgInVzZXJzLmVycm9yLmF0dHJpYnV0ZS5nZXQiLCBhdHRyaWJ1dGUpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGdyb3VwRm9ybS5zZXREYXRhYmFzZU5hbWUoZGF0YWJhc2VOYW1lKTsKKworICAgICAgICAvLyBTdGFzaCB0aGUgZm9ybSBiZWFuIGFuZCBmb3J3YXJkIHRvIHRoZSBkaXNwbGF5IHBhZ2UKKyAgICAgICAgc2F2ZVRva2VuKHJlcXVlc3QpOworICAgICAgICByZXF1ZXN0LnNldEF0dHJpYnV0ZSgiZ3JvdXBGb3JtIiwgZ3JvdXBGb3JtKTsKKyAgICAgICAgcmV0dXJuIChtYXBwaW5nLmZpbmRGb3J3YXJkKCJHcm91cCIpKTsKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3VzZXJzL1NldFVwUm9sZUFjdGlvbi5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3VzZXJzL1NldFVwUm9sZUFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzZWEzMTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vdXNlcnMvU2V0VXBSb2xlQWN0aW9uLmphdmEKQEAgLTAsMCArMSwxNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnVzZXJzOworCisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTERlY29kZXI7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5BdHRyaWJ1dGU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyRmFjdG9yeTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LlF1ZXJ5RXhwOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuUXVlcnk7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3RJbnN0YW5jZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5KTUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuQXR0cmlidXRlSW5mbzsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuT3BlcmF0aW9uSW5mbzsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuSW5mbzsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRXJyb3JzOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3J3YXJkOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLnV0aWwuTWVzc2FnZVJlc291cmNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5BcHBsaWNhdGlvblNlcnZsZXQ7CisKKworLyoqCisgKiA8cD5JbXBsZW1lbnRhdGlvbiBvZiA8c3Ryb25nPkFjdGlvbjwvc3Ryb25nPiB0aGF0IHNldHMgdXAgYW5kIHN0YXNoZXMKKyAqIGEgPGNvZGU+Um9sZUZvcm08L2NvZGU+IGJlYW4gaW4gcmVxdWVzdCBzY29wZS4gIFRoZSBmb3JtIGJlYW4gd2lsbCBoYXZlCisgKiBhIG51bGwgPGNvZGU+b2JqZWN0TmFtZTwvY29kZT4gcHJvcGVydHkgaWYgdGhpcyBmb3JtIHJlcHJlc2VudHMgYSByb2xlCisgKiBiZWluZyBhZGRlZCwgb3IgYSBub24tbnVsbCB2YWx1ZSBmb3IgYW4gZXhpc3Rpbmcgcm9sZS48L3A+CisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICogQHNpbmNlIDQuMQorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBTZXRVcFJvbGVBY3Rpb24gZXh0ZW5kcyBBY3Rpb24geworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIE1CZWFuU2VydmVyIHdlIHdpbGwgYmUgaW50ZXJhY3Rpbmcgd2l0aC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1CZWFuU2VydmVyIG1zZXJ2ZXIgPSBudWxsOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUHJvY2VzcyB0aGUgc3BlY2lmaWVkIEhUVFAgcmVxdWVzdCwgYW5kIGNyZWF0ZSB0aGUgY29ycmVzcG9uZGluZyBIVFRQCisgICAgICogcmVzcG9uc2UgKG9yIGZvcndhcmQgdG8gYW5vdGhlciB3ZWIgY29tcG9uZW50IHRoYXQgd2lsbCBjcmVhdGUgaXQpLgorICAgICAqIFJldHVybiBhbiA8Y29kZT5BY3Rpb25Gb3J3YXJkPC9jb2RlPiBpbnN0YW5jZSBkZXNjcmliaW5nIHdoZXJlIGFuZCBob3cKKyAgICAgKiBjb250cm9sIHNob3VsZCBiZSBmb3J3YXJkZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSByZXNwb25zZSBoYXMKKyAgICAgKiBhbHJlYWR5IGJlZW4gY29tcGxldGVkLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIEFjdGlvbk1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSBhY3Rpb25Gb3JtIFRoZSBvcHRpb25hbCBBY3Rpb25Gb3JtIGJlYW4gZm9yIHRoaXMgcmVxdWVzdCAoaWYgYW55KQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBIVFRQIHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIEhUVFAgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0IGV4Y2VwdGlvbiBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgQWN0aW9uRm9yd2FyZCBwZXJmb3JtKEFjdGlvbk1hcHBpbmcgbWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbkZvcm0gZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICAvLyBMb29rIHVwIHRoZSBjb21wb25lbnRzIHdlIHdpbGwgYmUgdXNpbmcgYXMgbmVlZGVkCisgICAgICAgIGlmIChtc2VydmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIG1zZXJ2ZXIgPSAoKEFwcGxpY2F0aW9uU2VydmxldCkgZ2V0U2VydmxldCgpKS5nZXRTZXJ2ZXIoKTsKKyAgICAgICAgfQorICAgICAgICBNZXNzYWdlUmVzb3VyY2VzIHJlc291cmNlcyA9IGdldFJlc291cmNlcyhyZXF1ZXN0KTsKKyAgICAgICAgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpOworICAgICAgICBMb2NhbGUgbG9jYWxlID0gZ2V0TG9jYWxlKHJlcXVlc3QpOworICAgICAgICBTdHJpbmcgZGF0YWJhc2VOYW1lID0KKyAgICAgICAgICAgIFVSTERlY29kZXIuZGVjb2RlKHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJkYXRhYmFzZU5hbWUiKSk7CisKKyAgICAgICAgLy8gU2V0IHVwIHRoZSBmb3JtIGJlYW4gYmFzZWQgb24gdGhlIGNyZWF0aW5nIG9yIGVkaXRpbmcgc3RhdGUKKyAgICAgICAgU3RyaW5nIG9iamVjdE5hbWUgPSByZXF1ZXN0LmdldFBhcmFtZXRlcigib2JqZWN0TmFtZSIpOworICAgICAgICBSb2xlRm9ybSByb2xlRm9ybSA9IG5ldyBSb2xlRm9ybSgpOworICAgICAgICBpZiAob2JqZWN0TmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICByb2xlRm9ybS5zZXROb2RlTGFiZWwKKyAgICAgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMucm9sZS5uZXdSb2xlIikpOworICAgICAgICAgICAgcm9sZUZvcm0uc2V0T2JqZWN0TmFtZShudWxsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJvbGVGb3JtLnNldE5vZGVMYWJlbAorICAgICAgICAgICAgICAgIChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5yb2xlLm9sZFJvbGUiKSk7CisgICAgICAgICAgICByb2xlRm9ybS5zZXRPYmplY3ROYW1lKG9iamVjdE5hbWUpOworICAgICAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZSA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPSBuZXcgT2JqZWN0TmFtZShvYmplY3ROYW1lKTsKKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgPSAicm9sZW5hbWUiOworICAgICAgICAgICAgICAgIHJvbGVGb3JtLnNldFJvbGVuYW1lCisgICAgICAgICAgICAgICAgICAgICgoU3RyaW5nKSBtc2VydmVyLmdldEF0dHJpYnV0ZShvbmFtZSwgYXR0cmlidXRlKSk7CisgICAgICAgICAgICAgICAgYXR0cmlidXRlID0gImRlc2NyaXB0aW9uIjsKKyAgICAgICAgICAgICAgICByb2xlRm9ybS5zZXREZXNjcmlwdGlvbgorICAgICAgICAgICAgICAgICAgICAoKFN0cmluZykgbXNlcnZlci5nZXRBdHRyaWJ1dGUob25hbWUsIGF0dHJpYnV0ZSkpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nCisgICAgICAgICAgICAgICAgICAgIChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAidXNlcnMuZXJyb3IuYXR0cmlidXRlLmdldCIsIGF0dHJpYnV0ZSksIGUpOworICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZQorICAgICAgICAgICAgICAgICAgICAgICAgIChsb2NhbGUsICJ1c2Vycy5lcnJvci5hdHRyaWJ1dGUuZ2V0IiwgYXR0cmlidXRlKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByb2xlRm9ybS5zZXREYXRhYmFzZU5hbWUoZGF0YWJhc2VOYW1lKTsKKworICAgICAgICAvLyBTdGFzaCB0aGUgZm9ybSBiZWFuIGFuZCBmb3J3YXJkIHRvIHRoZSBkaXNwbGF5IHBhZ2UKKyAgICAgICAgc2F2ZVRva2VuKHJlcXVlc3QpOworICAgICAgICByZXF1ZXN0LnNldEF0dHJpYnV0ZSgicm9sZUZvcm0iLCByb2xlRm9ybSk7CisgICAgICAgIHJldHVybiAobWFwcGluZy5maW5kRm9yd2FyZCgiUm9sZSIpKTsKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3VzZXJzL1NldFVwVXNlckFjdGlvbi5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3VzZXJzL1NldFVwVXNlckFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMjU2ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vdXNlcnMvU2V0VXBVc2VyQWN0aW9uLmphdmEKQEAgLTAsMCArMSwxODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnVzZXJzOworCisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTERlY29kZXI7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5BdHRyaWJ1dGU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyRmFjdG9yeTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LlF1ZXJ5RXhwOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuUXVlcnk7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3RJbnN0YW5jZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5KTUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuQXR0cmlidXRlSW5mbzsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuT3BlcmF0aW9uSW5mbzsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuSW5mbzsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRXJyb3JzOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3J3YXJkOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLnV0aWwuTWVzc2FnZVJlc291cmNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5BcHBsaWNhdGlvblNlcnZsZXQ7CisKKworLyoqCisgKiA8cD5JbXBsZW1lbnRhdGlvbiBvZiA8c3Ryb25nPkFjdGlvbjwvc3Ryb25nPiB0aGF0IHNldHMgdXAgYW5kIHN0YXNoZXMKKyAqIGEgPGNvZGU+VXNlckZvcm08L2NvZGU+IGJlYW4gaW4gcmVxdWVzdCBzY29wZS4gIFRoZSBmb3JtIGJlYW4gd2lsbCBoYXZlCisgKiBhIG51bGwgPGNvZGU+b2JqZWN0TmFtZTwvY29kZT4gcHJvcGVydHkgaWYgdGhpcyBmb3JtIHJlcHJlc2VudHMgYSB1c2VyCisgKiBiZWluZyBhZGRlZCwgb3IgYSBub24tbnVsbCB2YWx1ZSBmb3IgYW4gZXhpc3RpbmcgdXNlci48L3A+CisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICogQHNpbmNlIDQuMQorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBTZXRVcFVzZXJBY3Rpb24gZXh0ZW5kcyBBY3Rpb24geworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIE1CZWFuU2VydmVyIHdlIHdpbGwgYmUgaW50ZXJhY3Rpbmcgd2l0aC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1CZWFuU2VydmVyIG1zZXJ2ZXIgPSBudWxsOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUHJvY2VzcyB0aGUgc3BlY2lmaWVkIEhUVFAgcmVxdWVzdCwgYW5kIGNyZWF0ZSB0aGUgY29ycmVzcG9uZGluZyBIVFRQCisgICAgICogcmVzcG9uc2UgKG9yIGZvcndhcmQgdG8gYW5vdGhlciB3ZWIgY29tcG9uZW50IHRoYXQgd2lsbCBjcmVhdGUgaXQpLgorICAgICAqIFJldHVybiBhbiA8Y29kZT5BY3Rpb25Gb3J3YXJkPC9jb2RlPiBpbnN0YW5jZSBkZXNjcmliaW5nIHdoZXJlIGFuZCBob3cKKyAgICAgKiBjb250cm9sIHNob3VsZCBiZSBmb3J3YXJkZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSByZXNwb25zZSBoYXMKKyAgICAgKiBhbHJlYWR5IGJlZW4gY29tcGxldGVkLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIEFjdGlvbk1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSBhY3Rpb25Gb3JtIFRoZSBvcHRpb25hbCBBY3Rpb25Gb3JtIGJlYW4gZm9yIHRoaXMgcmVxdWVzdCAoaWYgYW55KQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBIVFRQIHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIEhUVFAgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0IGV4Y2VwdGlvbiBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgQWN0aW9uRm9yd2FyZCBwZXJmb3JtKEFjdGlvbk1hcHBpbmcgbWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbkZvcm0gZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICAvLyBMb29rIHVwIHRoZSBjb21wb25lbnRzIHdlIHdpbGwgYmUgdXNpbmcgYXMgbmVlZGVkCisgICAgICAgIGlmIChtc2VydmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIG1zZXJ2ZXIgPSAoKEFwcGxpY2F0aW9uU2VydmxldCkgZ2V0U2VydmxldCgpKS5nZXRTZXJ2ZXIoKTsKKyAgICAgICAgfQorICAgICAgICBNZXNzYWdlUmVzb3VyY2VzIHJlc291cmNlcyA9IGdldFJlc291cmNlcyhyZXF1ZXN0KTsKKyAgICAgICAgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpOworICAgICAgICBMb2NhbGUgbG9jYWxlID0gZ2V0TG9jYWxlKHJlcXVlc3QpOworCisgICAgICAgIC8vIFNldCB1cCBiZWFucyBjb250YWluaW5nIGFsbCBwb3NzaWJsZSBncm91cHMgYW5kIHJvbGVzCisgICAgICAgIFN0cmluZyBkYXRhYmFzZU5hbWUgPQorICAgICAgICAgICAgVVJMRGVjb2Rlci5kZWNvZGUocmVxdWVzdC5nZXRQYXJhbWV0ZXIoImRhdGFiYXNlTmFtZSIpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlcXVlc3Quc2V0QXR0cmlidXRlKCJncm91cHNGb3JtIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJVdGlscy5nZXRHcm91cHNGb3JtKG1zZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhYmFzZU5hbWUpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNlcnMuZXJyb3IuYXR0cmlidXRlLmdldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncm91cHMiKSwgZSk7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsCisgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlCisgICAgICAgICAgICAgICAgIChsb2NhbGUsICJ1c2Vycy5lcnJvci5hdHRyaWJ1dGUuZ2V0IiwgImdyb3VwcyIpKTsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlcXVlc3Quc2V0QXR0cmlidXRlKCJyb2xlc0Zvcm0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlclV0aWxzLmdldFJvbGVzRm9ybShtc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhYmFzZU5hbWUpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNlcnMuZXJyb3IuYXR0cmlidXRlLmdldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyb2xlcyIpLCBlKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UKKyAgICAgICAgICAgICAgICAgKGxvY2FsZSwgInVzZXJzLmVycm9yLmF0dHJpYnV0ZS5nZXQiLCAicm9sZXMiKSk7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgLy8gU2V0IHVwIHRoZSBmb3JtIGJlYW4gYmFzZWQgb24gdGhlIGNyZWF0aW5nIG9yIGVkaXRpbmcgc3RhdGUKKyAgICAgICAgU3RyaW5nIG9iamVjdE5hbWUgPSByZXF1ZXN0LmdldFBhcmFtZXRlcigib2JqZWN0TmFtZSIpOworICAgICAgICBVc2VyRm9ybSB1c2VyRm9ybSA9IG5ldyBVc2VyRm9ybSgpOworICAgICAgICBpZiAob2JqZWN0TmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICB1c2VyRm9ybS5zZXROb2RlTGFiZWwKKyAgICAgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMudXNlci5uZXdVc2VyIikpOworICAgICAgICAgICAgdXNlckZvcm0uc2V0T2JqZWN0TmFtZShudWxsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHVzZXJGb3JtLnNldE5vZGVMYWJlbAorICAgICAgICAgICAgICAgIChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy51c2VyLm9sZFVzZXIiKSk7CisgICAgICAgICAgICB1c2VyRm9ybS5zZXRPYmplY3ROYW1lKG9iamVjdE5hbWUpOworICAgICAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZSA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgb25hbWUgPSBuZXcgT2JqZWN0TmFtZShvYmplY3ROYW1lKTsKKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgPSAidXNlcm5hbWUiOworICAgICAgICAgICAgICAgIHVzZXJGb3JtLnNldFVzZXJuYW1lCisgICAgICAgICAgICAgICAgICAgICgoU3RyaW5nKSBtc2VydmVyLmdldEF0dHJpYnV0ZShvbmFtZSwgYXR0cmlidXRlKSk7CisgICAgICAgICAgICAgICAgYXR0cmlidXRlID0gInBhc3N3b3JkIjsKKyAgICAgICAgICAgICAgICB1c2VyRm9ybS5zZXRQYXNzd29yZAorICAgICAgICAgICAgICAgICAgICAoKFN0cmluZykgbXNlcnZlci5nZXRBdHRyaWJ1dGUob25hbWUsIGF0dHJpYnV0ZSkpOworICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJmdWxsTmFtZSI7CisgICAgICAgICAgICAgICAgdXNlckZvcm0uc2V0RnVsbE5hbWUKKyAgICAgICAgICAgICAgICAgICAgKChTdHJpbmcpIG1zZXJ2ZXIuZ2V0QXR0cmlidXRlKG9uYW1lLCBhdHRyaWJ1dGUpKTsKKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgPSAiZ3JvdXBzIjsKKyAgICAgICAgICAgICAgICB1c2VyRm9ybS5zZXRHcm91cHMKKyAgICAgICAgICAgICAgICAgICAgKChTdHJpbmdbXSkgbXNlcnZlci5nZXRBdHRyaWJ1dGUob25hbWUsIGF0dHJpYnV0ZSkpOworICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJyb2xlcyI7CisgICAgICAgICAgICAgICAgdXNlckZvcm0uc2V0Um9sZXMKKyAgICAgICAgICAgICAgICAgICAgKChTdHJpbmdbXSkgbXNlcnZlci5nZXRBdHRyaWJ1dGUob25hbWUsIGF0dHJpYnV0ZSkpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nCisgICAgICAgICAgICAgICAgICAgIChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAidXNlcnMuZXJyb3IuYXR0cmlidXRlLmdldCIsIGF0dHJpYnV0ZSksIGUpOworICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZQorICAgICAgICAgICAgICAgICAgICAgICAgIChsb2NhbGUsICJ1c2Vycy5lcnJvci5hdHRyaWJ1dGUuZ2V0IiwgYXR0cmlidXRlKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB1c2VyRm9ybS5zZXREYXRhYmFzZU5hbWUoZGF0YWJhc2VOYW1lKTsKKworICAgICAgICAvLyBTdGFzaCB0aGUgZm9ybSBiZWFuIGFuZCBmb3J3YXJkIHRvIHRoZSBkaXNwbGF5IHBhZ2UKKyAgICAgICAgc2F2ZVRva2VuKHJlcXVlc3QpOworICAgICAgICByZXF1ZXN0LnNldEF0dHJpYnV0ZSgidXNlckZvcm0iLCB1c2VyRm9ybSk7CisgICAgICAgIHJldHVybiAobWFwcGluZy5maW5kRm9yd2FyZCgiVXNlciIpKTsKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3VzZXJzL1VzZXJGb3JtLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vdXNlcnMvVXNlckZvcm0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzU1YTRkCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3VzZXJzL1VzZXJGb3JtLmphdmEKQEAgLTAsMCArMSwyMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi51c2VyczsKKworCitpbXBvcnQgamF2YS5uZXQuVVJMRGVjb2RlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkVycm9yOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25FcnJvcnM7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uQXBwbGljYXRpb25TZXJ2bGV0OworCisKKy8qKgorICogRm9ybSBiZWFuIGZvciB0aGUgaW5kaXZpZHVhbCB1c2VyIHBhZ2UuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICogQHNpbmNlIDQuMQorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBVc2VyRm9ybSBleHRlbmRzIEJhc2VGb3JtIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKyAgIC8qKgorICAgICAqIFRoZSBNQmVhblNlcnZlciB3ZSB3aWxsIGJlIGludGVyYWN0aW5nIHdpdGguCisgICAgICovCisgICAgcHJpdmF0ZSBNQmVhblNlcnZlciBtc2VydmVyID0gbnVsbDsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisgICAgLyoqCisgICAgICogVGhlIGZ1bGwgbmFtZSBvZiB0aGUgYXNzb2NpYXRlZCB1c2VyLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGZ1bGxOYW1lID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RnVsbE5hbWUoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5mdWxsTmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RnVsbE5hbWUoU3RyaW5nIGZ1bGxOYW1lKSB7CisgICAgICAgIHRoaXMuZnVsbE5hbWUgPSBmdWxsTmFtZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSBNQmVhbiBOYW1lcyBvZiB0aGUgZ3JvdXBzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHVzZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZ3JvdXBzW10gPSBuZXcgU3RyaW5nWzBdOworCisgICAgcHVibGljIFN0cmluZ1tdIGdldEdyb3VwcygpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLmdyb3Vwcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0R3JvdXBzKFN0cmluZyBncm91cHNbXSkgeworICAgICAgICBpZiAoZ3JvdXBzID09IG51bGwpIHsKKyAgICAgICAgICAgIGdyb3VwcyA9IG5ldyBTdHJpbmdbMF07CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5ncm91cHMgPSBncm91cHM7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgcGFzc3dvcmQgb2YgdGhlIGFzc29jaWF0ZWQgdXNlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBwYXNzd29yZCA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhc3N3b3JkKCkgeworICAgICAgICByZXR1cm4gKHRoaXMucGFzc3dvcmQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkKFN0cmluZyBwYXNzd29yZCkgeworICAgICAgICB0aGlzLnBhc3N3b3JkID0gcGFzc3dvcmQ7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgTUJlYW4gTmFtZXMgb2YgdGhlIHJvbGVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHVzZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcm9sZXNbXSA9IG5ldyBTdHJpbmdbMF07CisKKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0Um9sZXMoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5yb2xlcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Um9sZXMoU3RyaW5nIHJvbGVzW10pIHsKKyAgICAgICAgaWYgKHJvbGVzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJvbGVzID0gbmV3IFN0cmluZ1swXTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLnJvbGVzID0gcm9sZXM7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUaGUgdXNlcm5hbWUgb2YgdGhlIGFzc29jaWF0ZWQgdXNlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyB1c2VybmFtZSA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFVzZXJuYW1lKCkgeworICAgICAgICByZXR1cm4gKHRoaXMudXNlcm5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVzZXJuYW1lKFN0cmluZyB1c2VybmFtZSkgeworICAgICAgICB0aGlzLnVzZXJuYW1lID0gdXNlcm5hbWU7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworICAgIC8qKgorICAgICAqIFJlc2V0IGFsbCBwcm9wZXJ0aWVzIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIG1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZXNldChBY3Rpb25NYXBwaW5nIG1hcHBpbmcsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisKKyAgICAgICAgc3VwZXIucmVzZXQobWFwcGluZywgcmVxdWVzdCk7CisgICAgICAgIGZ1bGxOYW1lID0gbnVsbDsKKyAgICAgICAgZ3JvdXBzID0gbmV3IFN0cmluZ1swXTsKKyAgICAgICAgcGFzc3dvcmQgPSBudWxsOworICAgICAgICByb2xlcyA9IG5ldyBTdHJpbmdbMF07CisgICAgICAgIHVzZXJuYW1lID0gbnVsbDsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogVmFsaWRhdGUgdGhlIHByb3BlcnRpZXMgdGhhdCBoYXZlIGJlZW4gc2V0IGZyb20gdGhpcyBIVFRQIHJlcXVlc3QsCisgICAgICogYW5kIHJldHVybiBhbiA8Y29kZT5BY3Rpb25FcnJvcnM8L2NvZGU+IG9iamVjdCB0aGF0IGVuY2Fwc3VsYXRlcyBhbnkKKyAgICAgKiB2YWxpZGF0aW9uIGVycm9ycyB0aGF0IGhhdmUgYmVlbiBmb3VuZC4gIElmIG5vIGVycm9ycyBhcmUgZm91bmQsIHJldHVybgorICAgICAqIDxjb2RlPm51bGw8L2NvZGU+IG9yIGFuIDxjb2RlPkFjdGlvbkVycm9yczwvY29kZT4gb2JqZWN0IHdpdGggbm8KKyAgICAgKiByZWNvcmRlZCBlcnJvciBtZXNzYWdlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBtYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICovCisgICAgcHVibGljIEFjdGlvbkVycm9ycyB2YWxpZGF0ZShBY3Rpb25NYXBwaW5nIG1hcHBpbmcsCisgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBMb29rIHVwIHRoZSBjb21wb25lbnRzIHdlIHdpbGwgYmUgdXNpbmcgYXMgbmVlZGVkCisgICAgICAgICAgICBpZiAobXNlcnZlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbXNlcnZlciA9ICgoQXBwbGljYXRpb25TZXJ2bGV0KSBnZXRTZXJ2bGV0KCkpLmdldFNlcnZlcigpOworICAgICAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICAvLyBTZXQgdXAgYmVhbnMgY29udGFpbmluZyBhbGwgcG9zc2libGUgZ3JvdXBzIGFuZCByb2xlcworICAgICAgICAgICAgU3RyaW5nIGRhdGFiYXNlTmFtZSA9CisgICAgICAgICAgICAgICAgVVJMRGVjb2Rlci5kZWNvZGUocmVxdWVzdC5nZXRQYXJhbWV0ZXIoImRhdGFiYXNlTmFtZSIpKTsKKyAgICAgICAgICAgIHJlcXVlc3Quc2V0QXR0cmlidXRlKCJncm91cHNGb3JtIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJVdGlscy5nZXRHcm91cHNGb3JtKG1zZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhYmFzZU5hbWUpKTsKKyAgICAgICAgICAgIHJlcXVlc3Quc2V0QXR0cmlidXRlKCJyb2xlc0Zvcm0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlclV0aWxzLmdldFJvbGVzRm9ybShtc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhYmFzZU5hbWUpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcgc2luY2UgdGhlIGZvcm0gcmV0dXJucyB2YWxpZGF0aW9uIGVycm9yCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIEFjdGlvbkVycm9ycyBlcnJvcnMgPSBuZXcgQWN0aW9uRXJyb3JzKCk7CisKKyAgICAgICAgU3RyaW5nIHN1Ym1pdCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJzdWJtaXQiKTsKKyAgICAgICAgLy9pZiAoc3VibWl0ICE9IG51bGwpIHsKKworICAgICAgICAgICAgLy8gdXNlcm5hbWUgaXMgYSByZXF1aXJlZCBmaWVsZAorICAgICAgICAgICAgaWYgKCh1c2VybmFtZSA9PSBudWxsKSB8fCAodXNlcm5hbWUubGVuZ3RoKCkgPCAxKSkgeworICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoInVzZXJuYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBY3Rpb25FcnJvcigidXNlcnMuZXJyb3IudXNlcm5hbWUucmVxdWlyZWQiKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHVhc3N3b3JkIGlzIGEgcmVxdWlyZWQgZmllbGQKKyAgICAgICAgICAgIGlmICgocGFzc3dvcmQgPT0gbnVsbCkgfHwgKHVzZXJuYW1lLmxlbmd0aCgpIDwgMSkpIHsKKyAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKCJwYXNzd29yZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQWN0aW9uRXJyb3IoInVzZXJzLmVycm9yLnBhc3N3b3JkLnJlcXVpcmVkIikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBRdW90ZXMgbm90IGFsbG93ZWQgaW4gdXNlcm5hbWUKKyAgICAgICAgICAgIGlmICgodXNlcm5hbWUgIT0gbnVsbCkgJiYgKHVzZXJuYW1lLmluZGV4T2YoJyInKSA+PSAwKSkgeworICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoInVzZXJuYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBY3Rpb25FcnJvcigidXNlcnMuZXJyb3IucXVvdGVzIikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBRdW90ZXMgbm90IGFsbG93ZWQgaW4gcGFzc3dvcmQKKyAgICAgICAgICAgIGlmICgocGFzc3dvcmQgIT0gbnVsbCkgJiYgKHBhc3N3b3JkLmluZGV4T2YoJyInKSA+IDApKSB7CisgICAgICAgICAgICAgICAgZXJyb3JzLmFkZCgiZGVzY3JpcHRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFjdGlvbkVycm9yKCJ1c2Vycy5lcnJvci5xdW90ZXMiKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFF1b3RlcyBub3QgYWxsb3dlZCBpbiBmdWxsTmFtZQorICAgICAgICAgICAgaWYgKChmdWxsTmFtZSAhPSBudWxsKSAmJiAoZnVsbE5hbWUuaW5kZXhPZignIicpID4gMCkpIHsKKyAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKCJmdWxsTmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQWN0aW9uRXJyb3IoInVzZXJzLmVycm9yLnF1b3RlcyIpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAvL30KKworICAgICAgICByZXR1cm4gKGVycm9ycyk7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3VzZXJzL1VzZXJVdGlscy5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3VzZXJzL1VzZXJVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwMzgwZWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vdXNlcnMvVXNlclV0aWxzLmphdmEKQEAgLTAsMCArMSwxMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnVzZXJzOworCisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworCisKKy8qKgorICogPHA+U2hhcmVkIHV0aWxpdHkgbWV0aG9kcyBmb3IgdGhlIHVzZXIgZGF0YWJhc2UgYWRtaW5pc3RyYXRpb24gbW9kdWxlLjwvcD4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKiBAc2luY2UgNC4xCisgKi8KKworcHVibGljIGNsYXNzIFVzZXJVdGlscyB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYW5kIHJldHVybiBhIEdyb3Vwc0Zvcm0gaWRlbnRpZnlpbmcgYWxsIGN1cnJlbnRseSBkZWZpbmVkCisgICAgICogZ3JvdXBzIGluIHRoZSBzcGVjaWZpZWQgdXNlciBkYXRhYmFzZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtc2VydmVyIE1CZWFuU2VydmVyIHRvIGJlIGNvbnN1bHRlZAorICAgICAqIEBwYXJhbSBkYXRhYmFzZU5hbWUgTUJlYW4gTmFtZSBvZiB0aGUgdXNlciBkYXRhYmFzZSB0byBiZSBjb25zdWx0ZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgR3JvdXBzRm9ybSBnZXRHcm91cHNGb3JtKE1CZWFuU2VydmVyIG1zZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRhdGFiYXNlTmFtZSkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgT2JqZWN0TmFtZSBkbmFtZSA9IG5ldyBPYmplY3ROYW1lKGRhdGFiYXNlTmFtZSk7CisgICAgICAgIFN0cmluZyByZXN1bHRzW10gPQorICAgICAgICAgICAgKFN0cmluZ1tdKSBtc2VydmVyLmdldEF0dHJpYnV0ZShkbmFtZSwgImdyb3VwcyIpOworICAgICAgICBpZiAocmVzdWx0cyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXN1bHRzID0gbmV3IFN0cmluZ1swXTsKKyAgICAgICAgfQorICAgICAgICBBcnJheXMuc29ydChyZXN1bHRzKTsKKworICAgICAgICBHcm91cHNGb3JtIGdyb3Vwc0Zvcm0gPSBuZXcgR3JvdXBzRm9ybSgpOworICAgICAgICBncm91cHNGb3JtLnNldERhdGFiYXNlTmFtZShkYXRhYmFzZU5hbWUpOworICAgICAgICBncm91cHNGb3JtLnNldEdyb3VwcyhyZXN1bHRzKTsKKyAgICAgICAgcmV0dXJuIChncm91cHNGb3JtKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGFuZCByZXR1cm4gYSBSb2xlc0Zvcm0gaWRlbnRpZnlpbmcgYWxsIGN1cnJlbnRseSBkZWZpbmVkCisgICAgICogcm9sZXMgaW4gdGhlIHNwZWNpZmllZCB1c2VyIGRhdGFiYXNlLgorICAgICAqCisgICAgICogQHBhcmFtIG1zZXJ2ZXIgTUJlYW5TZXJ2ZXIgdG8gYmUgY29uc3VsdGVkCisgICAgICogQHBhcmFtIGRhdGFiYXNlTmFtZSBNQmVhbiBOYW1lIG9mIHRoZSB1c2VyIGRhdGFiYXNlIHRvIGJlIGNvbnN1bHRlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBSb2xlc0Zvcm0gZ2V0Um9sZXNGb3JtKE1CZWFuU2VydmVyIG1zZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRhdGFiYXNlTmFtZSkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgT2JqZWN0TmFtZSBkbmFtZSA9IG5ldyBPYmplY3ROYW1lKGRhdGFiYXNlTmFtZSk7CisgICAgICAgIFN0cmluZyByZXN1bHRzW10gPQorICAgICAgICAgICAgKFN0cmluZ1tdKSBtc2VydmVyLmdldEF0dHJpYnV0ZShkbmFtZSwgInJvbGVzIik7CisgICAgICAgIGlmIChyZXN1bHRzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJlc3VsdHMgPSBuZXcgU3RyaW5nWzBdOworICAgICAgICB9CisgICAgICAgIEFycmF5cy5zb3J0KHJlc3VsdHMpOworCisgICAgICAgIFJvbGVzRm9ybSByb2xlc0Zvcm0gPSBuZXcgUm9sZXNGb3JtKCk7CisgICAgICAgIHJvbGVzRm9ybS5zZXREYXRhYmFzZU5hbWUoZGF0YWJhc2VOYW1lKTsKKyAgICAgICAgcm9sZXNGb3JtLnNldFJvbGVzKHJlc3VsdHMpOworICAgICAgICByZXR1cm4gKHJvbGVzRm9ybSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhbmQgcmV0dXJuIGEgVXNlcnNGb3JtIGlkZW50aWZ5aW5nIGFsbCBjdXJyZW50bHkgZGVmaW5lZAorICAgICAqIHVzZXJzIGluIHRoZSBzcGVjaWZpZWQgdXNlciBkYXRhYmFzZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtc2VydmVyIE1CZWFuU2VydmVyIHRvIGJlIGNvbnN1bHRlZAorICAgICAqIEBwYXJhbSBkYXRhYmFzZU5hbWUgTUJlYW4gTmFtZSBvZiB0aGUgdXNlciBkYXRhYmFzZSB0byBiZSBjb25zdWx0ZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgVXNlcnNGb3JtIGdldFVzZXJzRm9ybShNQmVhblNlcnZlciBtc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBkYXRhYmFzZU5hbWUpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIE9iamVjdE5hbWUgZG5hbWUgPSBuZXcgT2JqZWN0TmFtZShkYXRhYmFzZU5hbWUpOworICAgICAgICBTdHJpbmcgcmVzdWx0c1tdID0KKyAgICAgICAgICAgIChTdHJpbmdbXSkgbXNlcnZlci5nZXRBdHRyaWJ1dGUoZG5hbWUsICJ1c2VycyIpOworICAgICAgICBpZiAocmVzdWx0cyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXN1bHRzID0gbmV3IFN0cmluZ1swXTsKKyAgICAgICAgfQorICAgICAgICBBcnJheXMuc29ydChyZXN1bHRzKTsKKworICAgICAgICBVc2Vyc0Zvcm0gdXNlcnNGb3JtID0gbmV3IFVzZXJzRm9ybSgpOworICAgICAgICB1c2Vyc0Zvcm0uc2V0RGF0YWJhc2VOYW1lKGRhdGFiYXNlTmFtZSk7CisgICAgICAgIHVzZXJzRm9ybS5zZXRVc2VycyhyZXN1bHRzKTsKKyAgICAgICAgcmV0dXJuICh1c2Vyc0Zvcm0pOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi91c2Vycy9Vc2Vyc0Zvcm0uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi91c2Vycy9Vc2Vyc0Zvcm0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmExYjNjCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3VzZXJzL1VzZXJzRm9ybS5qYXZhCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi51c2VyczsKKworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRXJyb3I7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkVycm9yczsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9ybTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKKworCisvKioKKyAqIEZvcm0gYmVhbiBmb3IgdGhlIGRlbGV0ZSB1c2VycyBwYWdlLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqIEBzaW5jZSA0LjEKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgVXNlcnNGb3JtIGV4dGVuZHMgQmFzZUZvcm0geworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBvYmplY3QgbmFtZXMgb2YgdGhlIHNwZWNpZmllZCB1c2Vycy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyB1c2Vyc1tdID0gbnVsbDsKKworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRVc2VycygpIHsKKyAgICAgICAgcmV0dXJuICh0aGlzLnVzZXJzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVc2VycyhTdHJpbmcgdXNlcnNbXSkgeworICAgICAgICB0aGlzLnVzZXJzID0gdXNlcnM7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmVzZXQgYWxsIHByb3BlcnRpZXMgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgbWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlc2V0KEFjdGlvbk1hcHBpbmcgbWFwcGluZywgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKworICAgICAgICBzdXBlci5yZXNldChtYXBwaW5nLCByZXF1ZXN0KTsKKyAgICAgICAgdGhpcy51c2VycyA9IG51bGw7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3VzZXJzL1VzZXJzVHJlZUJ1aWxkZXIuamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi91c2Vycy9Vc2Vyc1RyZWVCdWlsZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y3NjZmNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi91c2Vycy9Vc2Vyc1RyZWVCdWlsZGVyLmphdmEKQEAgLTAsMCArMSwxMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi51c2VyczsKKworCitpbXBvcnQgamF2YS5uZXQuVVJMRW5jb2RlcjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLkdsb2JhbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMudXRpbC5NZXNzYWdlUmVzb3VyY2VzOworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkFwcGxpY2F0aW9uU2VydmxldDsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5UcmVlQnVpbGRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5UcmVlQ29udHJvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5UcmVlQ29udHJvbE5vZGU7CisKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiA8Y29kZT5UcmVlQnVpbGRlcjwvY29kZT4gdGhhdCBhZGRzIHRoZSBub2RlcyByZXF1aXJlZAorICogZm9yIGFkbWluaXN0ZXJpbmcgdGhlIHVzZXIgZGF0YWJhc2UuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICogQHNpbmNlIDQuMQorICovCisKK3B1YmxpYyBjbGFzcyBVc2Vyc1RyZWVCdWlsZGVyIGltcGxlbWVudHMgVHJlZUJ1aWxkZXIgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBUcmVlQnVpbGRlciBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIEFkZCB0aGUgcmVxdWlyZWQgbm9kZXMgdG8gdGhlIHNwZWNpZmllZCA8Y29kZT50cmVlQ29udHJvbDwvY29kZT4KKyAgICAgKiBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0cmVlQ29udHJvbCBUaGUgPGNvZGU+VHJlZUNvbnRyb2w8L2NvZGU+IHRvIHdoaWNoIHdlIHNob3VsZAorICAgICAqICBhZGQgb3VyIG5vZGVzCisgICAgICogQHBhcmFtIHNlcnZsZXQgVGhlIGNvbnRyb2xsZXIgc2VydmxldCBmb3IgdGhlIGFkbWluIGFwcGxpY2F0aW9uCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGJ1aWxkVHJlZShUcmVlQ29udHJvbCB0cmVlQ29udHJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQXBwbGljYXRpb25TZXJ2bGV0IHNlcnZsZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisKKyAgICAgICAgTWVzc2FnZVJlc291cmNlcyByZXNvdXJjZXMgPSAoTWVzc2FnZVJlc291cmNlcykKKyAgICAgICAgICAgIHNlcnZsZXQuZ2V0U2VydmxldENvbnRleHQoKS5nZXRBdHRyaWJ1dGUoR2xvYmFscy5NRVNTQUdFU19LRVkpOworICAgICAgICBIdHRwU2Vzc2lvbiBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uKCk7CisgICAgICAgIExvY2FsZSBsb2NhbGUgPSAoTG9jYWxlKSBzZXNzaW9uLmdldEF0dHJpYnV0ZShHbG9iYWxzLkxPQ0FMRV9LRVkpOworICAgICAgICBhZGRTdWJ0cmVlKHRyZWVDb250cm9sLmdldFJvb3QoKSwgcmVzb3VyY2VzLCBsb2NhbGUpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvdGVjdGVkIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogQWRkIHRoZSBzdWJ0cmVlIG9mIG5vZGVzIHJlcXVpcmVkIGZvciB1c2VyIGFkbWluaXN0cmF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHJvb3QgVGhlIHJvb3Qgbm9kZSBvZiBvdXIgdHJlZSBjb250cm9sCisgICAgICogQHBhcmFtIHJlc291cmNlcyBUaGUgTWVzc2FnZVJlc291cmNlcyBmb3Igb3VyIGxvY2FsaXplZCBtZXNzYWdlcworICAgICAqICBtZXNzYWdlcworICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGFkZFN1YnRyZWUoVHJlZUNvbnRyb2xOb2RlIHJvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlUmVzb3VyY2VzIHJlc291cmNlcywgTG9jYWxlIGxvY2FsZSkgeworCisgICAgICAgIFN0cmluZyBkYXRhYmFzZU5hbWUgPSBVUkxFbmNvZGVyLmVuY29kZQorICAgICAgICAgICgiVXNlcnM6dHlwZT1Vc2VyRGF0YWJhc2UsZGF0YWJhc2U9VXNlckRhdGFiYXNlIik7CisKKyAgICAgICAgVHJlZUNvbnRyb2xOb2RlIHN1YnRyZWUgPSBuZXcgVHJlZUNvbnRyb2xOb2RlCisgICAgICAgICAgICAoIkdsb2JhbCBVc2VyIGFuZCBHcm91cCBBZG1pbmlzdHJhdGlvbiIsCisgICAgICAgICAgICAgImZvbGRlcl8xNl9wYWQuZ2lmIiwKKyAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy50cmVlQnVpbGRlci5zdWJ0cmVlTm9kZSIpLAorICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgImNvbnRlbnQiLAorICAgICAgICAgICAgIHRydWUsICJVc2VycyIpOworICAgICAgICBUcmVlQ29udHJvbE5vZGUgZ3JvdXBzID0gbmV3IFRyZWVDb250cm9sTm9kZQorICAgICAgICAgICAgKCJHbG9iYWwgQWRtaW5pc3RlciBHcm91cHMiLAorICAgICAgICAgICAgICJHcm91cHMuZ2lmIiwKKyAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy50cmVlQnVpbGRlci5ncm91cHNOb2RlIiksCisgICAgICAgICAgICAgInVzZXJzL2xpc3RHcm91cHMuZG8/ZGF0YWJhc2VOYW1lPSIgKworICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKGRhdGFiYXNlTmFtZSkgKworICAgICAgICAgICAgICImZm9yd2FyZD0iICsKKyAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZSgiR3JvdXBzIExpc3QgU2V0dXAiKSwKKyAgICAgICAgICAgICAiY29udGVudCIsCisgICAgICAgICAgICAgZmFsc2UsICJVc2VycyIpOworICAgICAgICBUcmVlQ29udHJvbE5vZGUgcm9sZXMgPSBuZXcgVHJlZUNvbnRyb2xOb2RlCisgICAgICAgICAgICAoIkdsb2JhbCBBZG1pbmlzdGVyIFJvbGVzIiwKKyAgICAgICAgICAgICAiUm9sZXMuZ2lmIiwKKyAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy50cmVlQnVpbGRlci5yb2xlc05vZGUiKSwKKyAgICAgICAgICAgICAidXNlcnMvbGlzdFJvbGVzLmRvP2RhdGFiYXNlTmFtZT0iICsKKyAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShkYXRhYmFzZU5hbWUpICsKKyAgICAgICAgICAgICAiJmZvcndhcmQ9IiArCisgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUoIlJvbGVzIExpc3QgU2V0dXAiKSwKKyAgICAgICAgICAgICAiY29udGVudCIsCisgICAgICAgICAgICAgZmFsc2UsICJVc2VycyIpOworICAgICAgICBUcmVlQ29udHJvbE5vZGUgdXNlcnMgPSBuZXcgVHJlZUNvbnRyb2xOb2RlCisgICAgICAgICAgICAoIkdsb2JhbCBBZG1pbmlzdGVyIFVzZXJzIiwKKyAgICAgICAgICAgICAiVXNlcnMuZ2lmIiwKKyAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy50cmVlQnVpbGRlci51c2Vyc05vZGUiKSwKKyAgICAgICAgICAgICAidXNlcnMvbGlzdFVzZXJzLmRvP2RhdGFiYXNlTmFtZT0iICsKKyAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShkYXRhYmFzZU5hbWUpICsKKyAgICAgICAgICAgICAiJmZvcndhcmQ9IiArCisgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUoIlVzZXJzIExpc3QgU2V0dXAiKSwKKyAgICAgICAgICAgICAiY29udGVudCIsCisgICAgICAgICAgICAgZmFsc2UsICJVc2VycyIpOworCisgICAgICAgIHJvb3QuYWRkQ2hpbGQoc3VidHJlZSk7CisgICAgICAgIHN1YnRyZWUuYWRkQ2hpbGQodXNlcnMpOworICAgICAgICBzdWJ0cmVlLmFkZENoaWxkKGdyb3Vwcyk7CisgICAgICAgIHN1YnRyZWUuYWRkQ2hpbGQocm9sZXMpOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi92YWx2ZS9BY2Nlc3NMb2dWYWx2ZUZvcm0uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi92YWx2ZS9BY2Nlc3NMb2dWYWx2ZUZvcm0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDgxNmQ2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3ZhbHZlL0FjY2Vzc0xvZ1ZhbHZlRm9ybS5qYXZhCkBAIC0wLDAgKzEsMzQxIEBACisvKgorICogQ29weXJpZ2h0IDIwMDEsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4udmFsdmU7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25FcnJvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRXJyb3JzOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEZvcm0gYmVhbiBmb3IgdGhlIGFjY2Vzc2xvZyB2YWx2ZSBwYWdlLgorICoKKyAqIEBhdXRob3IgTWFudmVlbiBLYXVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBBY2Nlc3NMb2dWYWx2ZUZvcm0gZXh0ZW5kcyBWYWx2ZUZvcm0geworICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciB0aGUgZGVidWcgbGV2ZWwuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZGVidWdMdmwgPSAiMCI7CisgIAorICAgIC8qKgorICAgICAqIFNldCBvZiB2YWxpZCB2YWx1ZXMgZm9yIGRlYnVnIGxldmVsLgorICAgICAqLworICAgIHByaXZhdGUgTGlzdCBkZWJ1Z0x2bFZhbHMgPSBudWxsOworICAgIAorICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciB0aGUgZGlyZWN0b3J5LgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGRpcmVjdG9yeSA9IG51bGw7CisgICAgCisgICAgLyoqCisgICAgICogVGhlIHRleHQgZm9yIHRoZSBwYXR0ZXJuLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHBhdHRlcm4gPSBudWxsOworICAgICAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgdGV4dCBmb3IgdGhlIHByZWZpeC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBwcmVmaXggPSBudWxsOworICAgIAorICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciB0aGUgc3VmZml4LgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHN1ZmZpeCA9IG51bGw7CisgICAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgdGV4dCBmb3IgdGhlIGNvbm5lY3Rpb24gVVJMLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHJlc29sdmVIb3N0cyA9ICJmYWxzZSI7CisgICAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgdGV4dCBmb3IgdGhlIHJvdGF0YWJsZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyByb3RhdGFibGUgPSAidHJ1ZSI7ICAgIAorICAgICAgIAorICAgIC8qKgorICAgICAqIFNldCBvZiBib29sZWFuIHZhbHVlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIExpc3QgYm9vbGVhblZhbHMgPSBudWxsOworIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBkZWJ1Z1ZhbHMuCisgICAgICovCisgICAgcHVibGljIExpc3QgZ2V0RGVidWdMdmxWYWxzKCkgeworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXMuZGVidWdMdmxWYWxzOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBkZWJ1Z1ZhbHMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVidWdMdmxWYWxzKExpc3QgZGVidWdMdmxWYWxzKSB7CisgICAgICAgIAorICAgICAgICB0aGlzLmRlYnVnTHZsVmFscyA9IGRlYnVnTHZsVmFsczsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgYm9vbGVhblZhbHMuCisgICAgICovCisgICAgcHVibGljIExpc3QgZ2V0Qm9vbGVhblZhbHMoKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy5ib29sZWFuVmFsczsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgYm9vbGVhblZhbHMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Qm9vbGVhblZhbHMoTGlzdCBib29sZWFuVmFscykgeworICAgICAgICAKKyAgICAgICAgdGhpcy5ib29sZWFuVmFscyA9IGJvb2xlYW5WYWxzOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBEZWJ1ZyBMZXZlbCBUZXh0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVidWdMdmwoKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy5kZWJ1Z0x2bDsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgRGVidWcgTGV2ZWwgVGV4dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREZWJ1Z0x2bChTdHJpbmcgZGVidWdMdmwpIHsKKyAgICAgICAgCisgICAgICAgIHRoaXMuZGVidWdMdmwgPSBkZWJ1Z0x2bDsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZGlyZWN0b3J5LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGlyZWN0b3J5KCkgeworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXMuZGlyZWN0b3J5OworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBkaXJlY3RvcnkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGlyZWN0b3J5KFN0cmluZyBkaXJlY3RvcnkpIHsKKyAgICAgICAgCisgICAgICAgIHRoaXMuZGlyZWN0b3J5ID0gZGlyZWN0b3J5OworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBwYXR0ZXJuLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0dGVybigpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLnBhdHRlcm47CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHBhdHRlcm4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGF0dGVybihTdHJpbmcgcGF0dGVybikgeworICAgICAgICAKKyAgICAgICAgdGhpcy5wYXR0ZXJuID0gcGF0dGVybjsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcHJlZml4LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KCkgeworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXMucHJlZml4OworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBwcmVmaXguCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJlZml4KFN0cmluZyBwcmVmaXgpIHsKKyAgICAgICAgCisgICAgICAgIHRoaXMucHJlZml4ID0gcHJlZml4OworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzdWZmaXguCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTdWZmaXgoKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy5zdWZmaXg7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHN1ZmZpeC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTdWZmaXgoU3RyaW5nIHN1ZmZpeCkgeworICAgICAgICAKKyAgICAgICAgdGhpcy5zdWZmaXggPSBzdWZmaXg7CisgICAgICAgIAorICAgIH0KKyAgICAgICAgICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcmVzb2x2ZSBob3N0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlc29sdmVIb3N0cygpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLnJlc29sdmVIb3N0czsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgcmVzb2x2ZUhvc3RzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlc29sdmVIb3N0cyhTdHJpbmcgcmVzb2x2ZUhvc3RzKSB7CisgICAgICAgIAorICAgICAgICB0aGlzLnJlc29sdmVIb3N0cyA9IHJlc29sdmVIb3N0czsKKyAgICAgICAgCisgICAgfSAgCisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSByb3RhdGFibGUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRSb3RhdGFibGUoKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy5yb3RhdGFibGU7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHJvdGF0YWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSb3RhdGFibGUoU3RyaW5nIHJvdGF0YWJsZSkgeworICAgICAgICAKKyAgICAgICAgdGhpcy5yb3RhdGFibGUgPSByb3RhdGFibGU7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXNldCBhbGwgcHJvcGVydGllcyB0byB0aGVpciBkZWZhdWx0IHZhbHVlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBtYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVzZXQoQWN0aW9uTWFwcGluZyBtYXBwaW5nLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworICAgIAorICAgICAgICBzdXBlci5yZXNldChtYXBwaW5nLCByZXF1ZXN0KTsKKyAgICAgICAgdGhpcy5kZWJ1Z0x2bCA9ICIwIjsKKyAgICAgICAgCisgICAgICAgIHRoaXMuZGlyZWN0b3J5ID0gbnVsbDsKKyAgICAgICAgdGhpcy5wcmVmaXggPSBudWxsOworICAgICAgICB0aGlzLnN1ZmZpeCA9IG51bGw7CisgICAgICAgIHRoaXMucGF0dGVybiA9IG51bGw7ICAgICAgICAKKyAgICAgICAgdGhpcy5yZXNvbHZlSG9zdHMgPSAiZmFsc2UiOworICAgICAgICB0aGlzLnJvdGF0YWJsZSA9ICJ0cnVlIjsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJlbmRlciB0aGlzIG9iamVjdCBhcyBhIFN0cmluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIkFjY2Vzc0xvZ1ZhbHZlRm9ybVthZG1pbkFjdGlvbj0iKTsKKyAgICAgICAgc2IuYXBwZW5kKGdldEFkbWluQWN0aW9uKCkpOworICAgICAgICBzYi5hcHBlbmQoIicsdmFsdmVUeXBlPSIpOworICAgICAgICBzYi5hcHBlbmQoZ2V0VmFsdmVUeXBlKCkpOworICAgICAgICBzYi5hcHBlbmQoIixkZWJ1Z0x2bD0iKTsKKyAgICAgICAgc2IuYXBwZW5kKGRlYnVnTHZsKTsKKyAgICAgICAgc2IuYXBwZW5kKCIsZGlyZWN0b3J5PSIpOworICAgICAgICBzYi5hcHBlbmQoZGlyZWN0b3J5KTsKKyAgICAgICAgc2IuYXBwZW5kKCInLHByZWZpeD0nIik7CisgICAgICAgIHNiLmFwcGVuZChwcmVmaXgpOworICAgICAgICBzYi5hcHBlbmQoIicscGF0dGVybj0iKTsKKyAgICAgICAgc2IuYXBwZW5kKHBhdHRlcm4pOworICAgICAgICBzYi5hcHBlbmQoIixyZXNvbHZlSG9zdHM9Iik7CisgICAgICAgIHNiLmFwcGVuZChyZXNvbHZlSG9zdHMpOworICAgICAgICBzYi5hcHBlbmQoIixyb3RhdGFibGU9Iik7CisgICAgICAgIHNiLmFwcGVuZChyb3RhdGFibGUpOworICAgICAgICBzYi5hcHBlbmQoIicsb2JqZWN0TmFtZT0nIik7CisgICAgICAgIHNiLmFwcGVuZChnZXRPYmplY3ROYW1lKCkpOworICAgICAgICBzYi5hcHBlbmQoIl0iKTsKKyAgICAgICAgcmV0dXJuIChzYi50b1N0cmluZygpKTsKKworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBWYWxpZGF0ZSB0aGUgcHJvcGVydGllcyB0aGF0IGhhdmUgYmVlbiBzZXQgZnJvbSB0aGlzIEhUVFAgcmVxdWVzdCwKKyAgICAgKiBhbmQgcmV0dXJuIGFuIDxjb2RlPkFjdGlvbkVycm9yczwvY29kZT4gb2JqZWN0IHRoYXQgZW5jYXBzdWxhdGVzIGFueQorICAgICAqIHZhbGlkYXRpb24gZXJyb3JzIHRoYXQgaGF2ZSBiZWVuIGZvdW5kLiAgSWYgbm8gZXJyb3JzIGFyZSBmb3VuZCwgcmV0dXJuCisgICAgICogPGNvZGU+bnVsbDwvY29kZT4gb3IgYW4gPGNvZGU+QWN0aW9uRXJyb3JzPC9jb2RlPiBvYmplY3Qgd2l0aCBubworICAgICAqIHJlY29yZGVkIGVycm9yIG1lc3NhZ2VzLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIG1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgQWN0aW9uRXJyb3JzIHZhbGlkYXRlKEFjdGlvbk1hcHBpbmcgbWFwcGluZywKKyAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICAKKyAgICAgICAgQWN0aW9uRXJyb3JzIGVycm9ycyA9IG5ldyBBY3Rpb25FcnJvcnMoKTsKKyAgICAgICAgCisgICAgICAgIFN0cmluZyBzdWJtaXQgPSByZXF1ZXN0LmdldFBhcmFtZXRlcigic3VibWl0Iik7CisgICAgICAgIAorICAgICAgICAvLyBmcm9udCBlbmQgdmFsaWRhdGlvbiB3aGVuIHNhdmUgaXMgY2xpY2tlZC4gICAgICAgIAorICAgICAgICAgLy9pZiAoc3VibWl0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgIC8vIGlmIG5vdCBzcGVjaWZpZWQsIGRlZmF1bHQgaXMgYWNjZXNzX2xvZy4KKyAgICAgICAgICAgICAvLyB0byBzcGVjaWZ5IG5vIHByZWZpeCwgc3BlY2lmeSBhIDAgbGVuZ3RoIHN0cmluZy4uLgorICAgICAgICAgICAgaWYgKChwcmVmaXggPT0gbnVsbCkgfHwgKHByZWZpeC5sZW5ndGgoKSA9PSAwKSl7CisgICAgICAgICAgICAgICAgcHJlZml4ID0gImFjY2Vzc19sb2cuIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gZGVmYXVsdCBpcyBhIDAgbGVuZ3RoIHN0cmluZworICAgICAgICAgICAgaWYgKChzdWZmaXggPT0gbnVsbCkgfHwgKHN1ZmZpeC5sZW5ndGgoKSA8IDEpKSB7CisgICAgICAgICAgICAgICAgc3VmZml4ID0gIiI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIElmIG5vIGRpcmVjdG9yeSBhdHRyaWJ1dGUgaXMgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdAorICAgICAgICAgICAgLy8gdmFsdWUgaXMgImxvZ3MiLgorICAgICAgICAgICAgaWYgKChkaXJlY3RvcnkgPT0gbnVsbCkgfHwgKGRpcmVjdG9yeS5sZW5ndGgoKSA8IDEpKSB7CisgICAgICAgICAgICAgICAgZGlyZWN0b3J5ID0gImxvZ3MiOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKHBhdHRlcm4gPT0gbnVsbCkgfHwgKHBhdHRlcm4ubGVuZ3RoKCkgPCAxKSkgeworICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoInBhdHRlcm4iLAorICAgICAgICAgICAgICAgIG5ldyBBY3Rpb25FcnJvcigiZXJyb3IucGF0dGVybi5yZXF1aXJlZCIpKTsKKyAgICAgICAgICAgIH0gICAgICAgICAKKyAgICAgICAgLy99CisgICAgICAgICAgICAgICAgIAorICAgICAgICByZXR1cm4gZXJyb3JzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi92YWx2ZS9BZGRWYWx2ZUFjdGlvbi5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3ZhbHZlL0FkZFZhbHZlQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGExYmViZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi92YWx2ZS9BZGRWYWx2ZUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTk2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDEtMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi52YWx2ZTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMRW5jb2RlcjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkVycm9yczsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9ybTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9yd2FyZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy51dGlsLk1lc3NhZ2VSZXNvdXJjZXM7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uTGFiZWxWYWx1ZUJlYW47CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uTGlzdHM7CisKKy8qKgorICogVGhlIDxjb2RlPkFjdGlvbjwvY29kZT4gdGhhdCBzZXRzIHVwIDxlbT5BZGQgVmFsdmU8L2VtPiB0cmFuc2FjdGlvbnMuCisgKgorICogQGF1dGhvciBNYW52ZWVuIEthdXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEFkZFZhbHZlQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKKyAgICAgICAgCisgICAgLy8gdGhlIGxpc3QgZm9yIHR5cGVzIG9mIHZhbHZlcworICAgIHByaXZhdGUgQXJyYXlMaXN0IHR5cGVzID0gbnVsbDsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworICAgIAorICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIHNwZWNpZmllZCBIVFRQIHJlcXVlc3QsIGFuZCBjcmVhdGUgdGhlIGNvcnJlc3BvbmRpbmcgSFRUUAorICAgICAqIHJlc3BvbnNlIChvciBmb3J3YXJkIHRvIGFub3RoZXIgd2ViIGNvbXBvbmVudCB0aGF0IHdpbGwgY3JlYXRlIGl0KS4KKyAgICAgKiBSZXR1cm4gYW4gPGNvZGU+QWN0aW9uRm9yd2FyZDwvY29kZT4gaW5zdGFuY2UgZGVzY3JpYmluZyB3aGVyZSBhbmQgaG93CisgICAgICogY29udHJvbCBzaG91bGQgYmUgZm9yd2FyZGVkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcmVzcG9uc2UgaGFzCisgICAgICogYWxyZWFkeSBiZWVuIGNvbXBsZXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBBY3Rpb25NYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gYWN0aW9uRm9ybSBUaGUgb3B0aW9uYWwgQWN0aW9uRm9ybSBiZWFuIGZvciB0aGlzIHJlcXVlc3QgKGlmIGFueSkKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgSFRUUCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBIVFRQIHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBleGNlcHRpb24gb2NjdXJzCisgICAgICovCisgICAgcHVibGljIEFjdGlvbkZvcndhcmQgcGVyZm9ybShBY3Rpb25NYXBwaW5nIG1hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb25Gb3JtIGZvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gQWNxdWlyZSB0aGUgcmVzb3VyY2VzIHRoYXQgd2UgbmVlZAorICAgICAgICBIdHRwU2Vzc2lvbiBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uKCk7CisgICAgICAgIExvY2FsZSBsb2NhbGUgPSBnZXRMb2NhbGUocmVxdWVzdCk7CisgICAgICAgIE1lc3NhZ2VSZXNvdXJjZXMgcmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VzKHJlcXVlc3QpOworICAgICAgICAKKyAgICAgICAgLy8gRmlsbCBpbiB0aGUgZm9ybSB2YWx1ZXMgZm9yIGRpc3BsYXkgYW5kIGVkaXRpbmcKKyAgICAgICAgCisgICAgICAgIFN0cmluZyB2YWx2ZVR5cGVzW10gPSBuZXcgU3RyaW5nWzVdOworICAgICAgICB2YWx2ZVR5cGVzWzBdID0gIkFjY2Vzc0xvZ1ZhbHZlIjsKKyAgICAgICAgdmFsdmVUeXBlc1sxXSA9ICJSZW1vdGVBZGRyVmFsdmUiOworICAgICAgICB2YWx2ZVR5cGVzWzJdID0gIlJlbW90ZUhvc3RWYWx2ZSI7CisgICAgICAgIHZhbHZlVHlwZXNbM10gPSAiUmVxdWVzdER1bXBlclZhbHZlIjsgICAgICAgCisgICAgICAgIHZhbHZlVHlwZXNbNF0gPSAiU2luZ2xlU2lnbk9uIjsKKyAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBTdHJpbmcgcGFyZW50ID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoInBhcmVudCIpOworICAgICAgICBTdHJpbmcgdHlwZSA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJ0eXBlIik7ICAgICAgICAKKyAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkgCisgICAgICAgICAgICB0eXBlID0gIkFjY2Vzc0xvZ1ZhbHZlIjsgICAgLy8gZGVmYXVsdCB0eXBlIGlzIEFjY2Vzc0xvZworICAgICAgICAKKyAgICAgICAgdHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7ICAgIAorICAgICAgICAvLyB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgc2VsZWN0IGxpc3Qgc2hvdWxkIGJlIHRoZSB0eXBlIHNlbGVjdGVkCisgICAgICAgIHR5cGVzLmFkZChuZXcgTGFiZWxWYWx1ZUJlYW4odHlwZSwKKyAgICAgICAgICAgICAgICAiQWRkVmFsdmUuZG8/cGFyZW50PSIgKyBVUkxFbmNvZGVyLmVuY29kZShwYXJlbnQpIAorICAgICAgICAgICAgICAgICsgIiZ0eXBlPSIgKyB0eXBlKSk7ICAgICAgICAKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPCB2YWx2ZVR5cGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoIXR5cGUuZXF1YWxzSWdub3JlQ2FzZSh2YWx2ZVR5cGVzW2ldKSkgeworICAgICAgICAgICAgICAgIHR5cGVzLmFkZChuZXcgTGFiZWxWYWx1ZUJlYW4odmFsdmVUeXBlc1tpXSwKKyAgICAgICAgICAgICAgICAiQWRkVmFsdmUuZG8/cGFyZW50PSIgKyBVUkxFbmNvZGVyLmVuY29kZShwYXJlbnQpIAorICAgICAgICAgICAgICAgICsgIiZ0eXBlPSIgKyB2YWx2ZVR5cGVzW2ldKSk7ICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgIAorICAgICAgICBpZiAoIkFjY2Vzc0xvZ1ZhbHZlIi5lcXVhbHNJZ25vcmVDYXNlKHR5cGUpKSB7CisgICAgICAgICAgICBjcmVhdGVBY2Nlc3NMb2dnZXIoc2Vzc2lvbiwgcGFyZW50KTsKKyAgICAgICAgfSBlbHNlIGlmICgiUmVtb3RlQWRkclZhbHZlIi5lcXVhbHNJZ25vcmVDYXNlKHR5cGUpKSB7CisgICAgICAgICAgICBjcmVhdGVSZW1vdGVBZGRyVmFsdmUoc2Vzc2lvbiwgcGFyZW50KTsKKyAgICAgICAgfSBlbHNlIGlmICgiUmVtb3RlSG9zdFZhbHZlIi5lcXVhbHNJZ25vcmVDYXNlKHR5cGUpKSB7CisgICAgICAgICAgICBjcmVhdGVSZW1vdGVIb3N0VmFsdmUoc2Vzc2lvbiwgcGFyZW50KTsKKyAgICAgICAgfSBlbHNlIGlmICgiUmVxdWVzdER1bXBlclZhbHZlIi5lcXVhbHNJZ25vcmVDYXNlKHR5cGUpKSB7CisgICAgICAgICAgICBjcmVhdGVSZXF1ZXN0RHVtcGVyVmFsdmUoc2Vzc2lvbiwgcGFyZW50KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vU2luZ2xlU2lnbk9uCisgICAgICAgICAgICBjcmVhdGVTaW5nbGVTaWduT25WYWx2ZShzZXNzaW9uLCBwYXJlbnQpOworICAgICAgICB9CisgICAgICAgIC8vIEZvcndhcmQgdG8gdGhlIHZhbHZlIGRpc3BsYXkgcGFnZQorICAgICAgICByZXR1cm4gKG1hcHBpbmcuZmluZEZvcndhcmQodHlwZSkpOworICAgICAgICAKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY3JlYXRlQWNjZXNzTG9nZ2VyKEh0dHBTZXNzaW9uIHNlc3Npb24sIFN0cmluZyBwYXJlbnQpIHsKKworICAgICAgICBBY2Nlc3NMb2dWYWx2ZUZvcm0gdmFsdmVGbSA9IG5ldyBBY2Nlc3NMb2dWYWx2ZUZvcm0oKTsKKyAgICAgICAgc2Vzc2lvbi5zZXRBdHRyaWJ1dGUoImFjY2Vzc0xvZ1ZhbHZlRm9ybSIsIHZhbHZlRm0pOworICAgICAgICB2YWx2ZUZtLnNldEFkbWluQWN0aW9uKCJDcmVhdGUiKTsKKyAgICAgICAgdmFsdmVGbS5zZXRPYmplY3ROYW1lKCIiKTsKKyAgICAgICAgdmFsdmVGbS5zZXRQYXJlbnRPYmplY3ROYW1lKHBhcmVudCk7CisgICAgICAgIFN0cmluZyB2YWx2ZVR5cGUgPSAiQWNjZXNzTG9nVmFsdmUiOworICAgICAgICB2YWx2ZUZtLnNldE5vZGVMYWJlbCgiVmFsdmUgKCIgKyB2YWx2ZVR5cGUgKyAiKSIpOworICAgICAgICB2YWx2ZUZtLnNldFZhbHZlVHlwZSh2YWx2ZVR5cGUpOworICAgICAgICB2YWx2ZUZtLnNldFBhdHRlcm4oIiIpOworICAgICAgICB2YWx2ZUZtLnNldERpcmVjdG9yeSgibG9ncyIpOworICAgICAgICB2YWx2ZUZtLnNldFByZWZpeCgiYWNjZXNzX2xvZy4iKTsKKyAgICAgICAgdmFsdmVGbS5zZXRTdWZmaXgoIiIpOworICAgICAgICB2YWx2ZUZtLnNldFJlc29sdmVIb3N0cygiZmFsc2UiKTsKKyAgICAgICAgdmFsdmVGbS5zZXRSb3RhdGFibGUoInRydWUiKTsKKyAgICAgICAgdmFsdmVGbS5zZXRCb29sZWFuVmFscyhMaXN0cy5nZXRCb29sZWFuVmFsdWVzKCkpOworICAgICAgICB2YWx2ZUZtLnNldFZhbHZlVHlwZVZhbHModHlwZXMpOyAgICAgICAgCisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVJlbW90ZUFkZHJWYWx2ZShIdHRwU2Vzc2lvbiBzZXNzaW9uLCBTdHJpbmcgcGFyZW50KSB7CisKKyAgICAgICAgUmVtb3RlQWRkclZhbHZlRm9ybSB2YWx2ZUZtID0gbmV3IFJlbW90ZUFkZHJWYWx2ZUZvcm0oKTsKKyAgICAgICAgc2Vzc2lvbi5zZXRBdHRyaWJ1dGUoInJlbW90ZUFkZHJWYWx2ZUZvcm0iLCB2YWx2ZUZtKTsKKyAgICAgICAgdmFsdmVGbS5zZXRBZG1pbkFjdGlvbigiQ3JlYXRlIik7CisgICAgICAgIHZhbHZlRm0uc2V0T2JqZWN0TmFtZSgiIik7CisgICAgICAgIHZhbHZlRm0uc2V0UGFyZW50T2JqZWN0TmFtZShwYXJlbnQpOworICAgICAgICBTdHJpbmcgdmFsdmVUeXBlID0gIlJlbW90ZUFkZHJWYWx2ZSI7CisgICAgICAgIHZhbHZlRm0uc2V0Tm9kZUxhYmVsKCJWYWx2ZSAoIiArIHZhbHZlVHlwZSArICIpIik7CisgICAgICAgIHZhbHZlRm0uc2V0VmFsdmVUeXBlKHZhbHZlVHlwZSk7CisgICAgICAgIHZhbHZlRm0uc2V0QWxsb3coIiIpOworICAgICAgICB2YWx2ZUZtLnNldERlbnkoIiIpOworICAgICAgICB2YWx2ZUZtLnNldFZhbHZlVHlwZVZhbHModHlwZXMpOyAgICAgICAgCisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVJlbW90ZUhvc3RWYWx2ZShIdHRwU2Vzc2lvbiBzZXNzaW9uLCBTdHJpbmcgcGFyZW50KSB7CisKKyAgICAgICAgUmVtb3RlSG9zdFZhbHZlRm9ybSB2YWx2ZUZtID0gbmV3IFJlbW90ZUhvc3RWYWx2ZUZvcm0oKTsKKyAgICAgICAgc2Vzc2lvbi5zZXRBdHRyaWJ1dGUoInJlbW90ZUhvc3RWYWx2ZUZvcm0iLCB2YWx2ZUZtKTsKKyAgICAgICAgdmFsdmVGbS5zZXRBZG1pbkFjdGlvbigiQ3JlYXRlIik7CisgICAgICAgIHZhbHZlRm0uc2V0T2JqZWN0TmFtZSgiIik7CisgICAgICAgIHZhbHZlRm0uc2V0UGFyZW50T2JqZWN0TmFtZShwYXJlbnQpOworICAgICAgICBTdHJpbmcgdmFsdmVUeXBlID0gIlJlbW90ZUhvc3RWYWx2ZSI7CisgICAgICAgIHZhbHZlRm0uc2V0Tm9kZUxhYmVsKCJWYWx2ZSAoIiArIHZhbHZlVHlwZSArICIpIik7CisgICAgICAgIHZhbHZlRm0uc2V0VmFsdmVUeXBlKHZhbHZlVHlwZSk7CisgICAgICAgIHZhbHZlRm0uc2V0QWxsb3coIiIpOworICAgICAgICB2YWx2ZUZtLnNldERlbnkoIiIpOworICAgICAgICB2YWx2ZUZtLnNldFZhbHZlVHlwZVZhbHModHlwZXMpOyAgICAgICAgCisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVJlcXVlc3REdW1wZXJWYWx2ZShIdHRwU2Vzc2lvbiBzZXNzaW9uLCBTdHJpbmcgcGFyZW50KSB7CisKKyAgICAgICAgUmVxdWVzdER1bXBlclZhbHZlRm9ybSB2YWx2ZUZtID0gbmV3IFJlcXVlc3REdW1wZXJWYWx2ZUZvcm0oKTsKKyAgICAgICAgc2Vzc2lvbi5zZXRBdHRyaWJ1dGUoInJlcXVlc3REdW1wZXJWYWx2ZUZvcm0iLCB2YWx2ZUZtKTsKKyAgICAgICAgdmFsdmVGbS5zZXRBZG1pbkFjdGlvbigiQ3JlYXRlIik7CisgICAgICAgIHZhbHZlRm0uc2V0T2JqZWN0TmFtZSgiIik7CisgICAgICAgIHZhbHZlRm0uc2V0UGFyZW50T2JqZWN0TmFtZShwYXJlbnQpOworICAgICAgICBTdHJpbmcgdmFsdmVUeXBlID0gIlJlcXVlc3REdW1wZXJWYWx2ZSI7CisgICAgICAgIHZhbHZlRm0uc2V0Tm9kZUxhYmVsKCJWYWx2ZSAoIiArIHZhbHZlVHlwZSArICIpIik7CisgICAgICAgIHZhbHZlRm0uc2V0VmFsdmVUeXBlKHZhbHZlVHlwZSk7CisgICAgICAgIHZhbHZlRm0uc2V0VmFsdmVUeXBlVmFscyh0eXBlcyk7ICAgICAgICAKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY3JlYXRlU2luZ2xlU2lnbk9uVmFsdmUoSHR0cFNlc3Npb24gc2Vzc2lvbiwgU3RyaW5nIHBhcmVudCkgeworCisgICAgICAgIFNpbmdsZVNpZ25PblZhbHZlRm9ybSB2YWx2ZUZtID0gbmV3IFNpbmdsZVNpZ25PblZhbHZlRm9ybSgpOworICAgICAgICBzZXNzaW9uLnNldEF0dHJpYnV0ZSgic2luZ2xlU2lnbk9uVmFsdmVGb3JtIiwgdmFsdmVGbSk7CisgICAgICAgIHZhbHZlRm0uc2V0QWRtaW5BY3Rpb24oIkNyZWF0ZSIpOworICAgICAgICB2YWx2ZUZtLnNldE9iamVjdE5hbWUoIiIpOworICAgICAgICB2YWx2ZUZtLnNldFBhcmVudE9iamVjdE5hbWUocGFyZW50KTsKKyAgICAgICAgU3RyaW5nIHZhbHZlVHlwZSA9ICJTaW5nbGVTaWduT24iOworICAgICAgICB2YWx2ZUZtLnNldE5vZGVMYWJlbCgiVmFsdmUgKCIgKyB2YWx2ZVR5cGUgKyAiKSIpOworICAgICAgICB2YWx2ZUZtLnNldFZhbHZlVHlwZSh2YWx2ZVR5cGUpOworICAgICAgICB2YWx2ZUZtLnNldFZhbHZlVHlwZVZhbHModHlwZXMpOyAgICAgICAgCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vdmFsdmUvRGVsZXRlVmFsdmVBY3Rpb24uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi92YWx2ZS9EZWxldGVWYWx2ZUFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjYzk3NDgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vdmFsdmUvRGVsZXRlVmFsdmVBY3Rpb24uamF2YQpAQCAtMCwwICsxLDE0NCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAxLTIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi52YWx2ZTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRXJyb3JzOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3J3YXJkOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworCitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyRmFjdG9yeTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LlF1ZXJ5RXhwOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuUXVlcnk7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3RJbnN0YW5jZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5KTUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy51dGlsLk1lc3NhZ2VSZXNvdXJjZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5BcHBsaWNhdGlvblNlcnZsZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uVG9tY2F0VHJlZUJ1aWxkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uTGlzdHM7CisKKy8qKgorICogVGhlIDxjb2RlPkFjdGlvbjwvY29kZT4gdGhhdCBzZXRzIHVwIDxlbT5EZWxldGUgVmFsdmVzPC9lbT4gdHJhbnNhY3Rpb25zLgorICoKKyAqIEBhdXRob3IgTWFudmVlbiBLYXVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBEZWxldGVWYWx2ZUFjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogVGhlIE1CZWFuU2VydmVyIHdlIHdpbGwgYmUgaW50ZXJhY3Rpbmcgd2l0aC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1CZWFuU2VydmVyIG1CU2VydmVyID0gbnVsbDsKKyAgICAKKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKyAgICAKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBzcGVjaWZpZWQgSFRUUCByZXF1ZXN0LCBhbmQgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIEhUVFAKKyAgICAgKiByZXNwb25zZSAob3IgZm9yd2FyZCB0byBhbm90aGVyIHdlYiBjb21wb25lbnQgdGhhdCB3aWxsIGNyZWF0ZSBpdCkuCisgICAgICogUmV0dXJuIGFuIDxjb2RlPkFjdGlvbkZvcndhcmQ8L2NvZGU+IGluc3RhbmNlIGRlc2NyaWJpbmcgd2hlcmUgYW5kIGhvdworICAgICAqIGNvbnRyb2wgc2hvdWxkIGJlIGZvcndhcmRlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHJlc3BvbnNlIGhhcworICAgICAqIGFscmVhZHkgYmVlbiBjb21wbGV0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgQWN0aW9uTWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIGFjdGlvbkZvcm0gVGhlIG9wdGlvbmFsIEFjdGlvbkZvcm0gYmVhbiBmb3IgdGhpcyByZXF1ZXN0IChpZiBhbnkpCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIEhUVFAgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgSFRUUCByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXhjZXB0aW9uIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBBY3Rpb25Gb3J3YXJkIHBlcmZvcm0oQWN0aW9uTWFwcGluZyBtYXBwaW5nLAorICAgIEFjdGlvbkZvcm0gZm9ybSwKKyAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgLy8gQWNxdWlyZSB0aGUgcmVzb3VyY2VzIHRoYXQgd2UgbmVlZAorICAgICAgICBIdHRwU2Vzc2lvbiBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uKCk7CisgICAgICAgIExvY2FsZSBsb2NhbGUgPSBnZXRMb2NhbGUocmVxdWVzdCk7CisgICAgICAgIE1lc3NhZ2VSZXNvdXJjZXMgcmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VzKHJlcXVlc3QpOworICAgICAgICAKKyAgICAgICAgLy8gQWNxdWlyZSBhIHJlZmVyZW5jZSB0byB0aGUgTUJlYW5TZXJ2ZXIgY29udGFpbmluZyBvdXIgTUJlYW5zCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtQlNlcnZlciA9ICgoQXBwbGljYXRpb25TZXJ2bGV0KSBnZXRTZXJ2bGV0KCkpLmdldFNlcnZlcigpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24KKyAgICAgICAgICAgICgiQ2Fubm90IGFjcXVpcmUgTUJlYW5TZXJ2ZXIgcmVmZXJlbmNlIiwgdCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIFN0cmluZyBwYXR0ZXJuID0gbnVsbDsKKyAgICAgICAgLy8gU2V0IHVwIGEgZm9ybSBiZWFuIGNvbnRhaW5pbmcgdGhlIGN1cnJlbnRseSBzZWxlY3RlZAorICAgICAgICAvLyBvYmplY3RzIHRvIGJlIGRlbGV0ZWQKKyAgICAgICAgVmFsdmVzRm9ybSB2YWx2ZXNGb3JtID0gbmV3IFZhbHZlc0Zvcm0oKTsKKyAgICAgICAgU3RyaW5nIHNlbGVjdCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJzZWxlY3QiKTsKKyAgICAgICAgaWYgKHNlbGVjdCAhPSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgdmFsdmVzW10gPSBuZXcgU3RyaW5nWzFdOworICAgICAgICAgICAgdmFsdmVzWzBdID0gc2VsZWN0OworICAgICAgICAgICAgdmFsdmVzRm9ybS5zZXRWYWx2ZXModmFsdmVzKTsKKyAgICAgICAgICAgIHBhdHRlcm4gPSBzZWxlY3Q7CisgICAgICAgIH0KKyAgICAgICAgcmVxdWVzdC5zZXRBdHRyaWJ1dGUoInZhbHZlc0Zvcm0iLCB2YWx2ZXNGb3JtKTsKKyAgICAgICAgCisgICAgICAgIC8vIEFjY3VtdWxhdGUgYSBsaXN0IG9mIGFsbCBhdmFpbGFibGUgdmFsdmVzCisgICAgICAgIEFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBTdHJpbmcgcGFyZW50ID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoInBhcmVudCIpOworICAgICAgICB2YWx2ZXNGb3JtLnNldFBhcmVudE9iamVjdE5hbWUocGFyZW50KTsKKyAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBJdGVyYXRvciBpdGVtcyA9IChMaXN0cy5nZXRWYWx2ZXMobUJTZXJ2ZXIsIHBhcmVudCkpLml0ZXJhdG9yKCk7CisgICAgICAgICAgICB3aGlsZSAoaXRlbXMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgbGlzdC5hZGQoaXRlbXMubmV4dCgpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZworICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLnNlbGVjdCIpKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3Iuc2VsZWN0IikpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgQ29sbGVjdGlvbnMuc29ydChsaXN0KTsKKyAgICAgICAgcmVxdWVzdC5zZXRBdHRyaWJ1dGUoInZhbHZlc0xpc3QiLCBsaXN0KTsKKyAgICAgICAgCisgICAgICAgIC8vIEZvcndhcmQgdG8gdGhlIGxpc3QgZGlzcGxheSBwYWdlCisgICAgICAgIHJldHVybiAobWFwcGluZy5maW5kRm9yd2FyZCgiVmFsdmVzIikpOworICAgICAgICAKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi92YWx2ZS9EZWxldGVWYWx2ZXNBY3Rpb24uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi92YWx2ZS9EZWxldGVWYWx2ZXNBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDRjYjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3ZhbHZlL0RlbGV0ZVZhbHZlc0FjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTU4IEBACisvKgorICogQ29weXJpZ2h0IDIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi52YWx2ZTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0SW5zdGFuY2U7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5tb2RlbG1iZWFuLk1vZGVsTUJlYW47CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcndhcmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMudXRpbC5NZXNzYWdlUmVzb3VyY2VzOworCitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uQXBwbGljYXRpb25TZXJ2bGV0OworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLlRvbWNhdFRyZWVCdWlsZGVyOworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLlRyZWVDb250cm9sOworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLlRyZWVDb250cm9sTm9kZTsKKworCisvKioKKyAqIFRoZSA8Y29kZT5BY3Rpb248L2NvZGU+IHRoYXQgY29tcGxldGVzIDxlbT5EZWxldGUgVmFsdmVzPC9lbT4KKyAqIHRyYW5zYWN0aW9ucy4KKyAqCisgKiBAYXV0aG9yIE1hbnZlZW4gS2F1cgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgRGVsZXRlVmFsdmVzQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKKworCisgICAgLyoqCisgICAgICogU2lnbmF0dXJlIGZvciB0aGUgPGNvZGU+cmVtb3ZlVmFsdmU8L2NvZGU+IG9wZXJhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyByZW1vdmVWYWx2ZVR5cGVzW10gPQorICAgIHsgImphdmEubGFuZy5TdHJpbmciLCAgICAgIC8vIE9iamVjdCBuYW1lCisgICAgfTsKKworCisgICAgLyoqCisgICAgICogVGhlIE1CZWFuU2VydmVyIHdlIHdpbGwgYmUgaW50ZXJhY3Rpbmcgd2l0aC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1CZWFuU2VydmVyIG1CU2VydmVyID0gbnVsbDsKKyAgICAKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIHNwZWNpZmllZCBIVFRQIHJlcXVlc3QsIGFuZCBjcmVhdGUgdGhlIGNvcnJlc3BvbmRpbmcgSFRUUAorICAgICAqIHJlc3BvbnNlIChvciBmb3J3YXJkIHRvIGFub3RoZXIgd2ViIGNvbXBvbmVudCB0aGF0IHdpbGwgY3JlYXRlIGl0KS4KKyAgICAgKiBSZXR1cm4gYW4gPGNvZGU+QWN0aW9uRm9yd2FyZDwvY29kZT4gaW5zdGFuY2UgZGVzY3JpYmluZyB3aGVyZSBhbmQgaG93CisgICAgICogY29udHJvbCBzaG91bGQgYmUgZm9yd2FyZGVkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcmVzcG9uc2UgaGFzCisgICAgICogYWxyZWFkeSBiZWVuIGNvbXBsZXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBBY3Rpb25NYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gYWN0aW9uRm9ybSBUaGUgb3B0aW9uYWwgQWN0aW9uRm9ybSBiZWFuIGZvciB0aGlzIHJlcXVlc3QgKGlmIGFueSkKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgSFRUUCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBIVFRQIHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBleGNlcHRpb24gb2NjdXJzCisgICAgICovCisgICAgcHVibGljIEFjdGlvbkZvcndhcmQgcGVyZm9ybShBY3Rpb25NYXBwaW5nIG1hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb25Gb3JtIGZvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgLy8gTG9vayB1cCB0aGUgY29tcG9uZW50cyB3ZSB3aWxsIGJlIHVzaW5nIGFzIG5lZWRlZAorICAgICAgICBIdHRwU2Vzc2lvbiBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uKCk7CisgICAgICAgIExvY2FsZSBsb2NhbGUgPSBnZXRMb2NhbGUocmVxdWVzdCk7CisgICAgICAgIE1lc3NhZ2VSZXNvdXJjZXMgcmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VzKHJlcXVlc3QpOworCisgICAgICAgIC8vIEFjcXVpcmUgYSByZWZlcmVuY2UgdG8gdGhlIE1CZWFuU2VydmVyIGNvbnRhaW5pbmcgb3VyIE1CZWFucworICAgICAgICB0cnkgeworICAgICAgICAgICAgbUJTZXJ2ZXIgPSAoKEFwcGxpY2F0aW9uU2VydmxldCkgZ2V0U2VydmxldCgpKS5nZXRTZXJ2ZXIoKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uCisgICAgICAgICAgICAoIkNhbm5vdCBhY3F1aXJlIE1CZWFuU2VydmVyIHJlZmVyZW5jZSIsIHQpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBEZWxldGUgdGhlIHNwZWNpZmllZCBWYWx2ZXMKKyAgICAgICAgU3RyaW5nIHZhbHZlc1tdICA9ICgoVmFsdmVzRm9ybSkgZm9ybSkuZ2V0VmFsdmVzKCk7CisgICAgICAgIFN0cmluZyB2YWx1ZXNbXSA9IG5ldyBTdHJpbmdbMV07CisgICAgICAgIFN0cmluZyBvcGVyYXRpb24gPSAicmVtb3ZlVmFsdmUiOworICAgICAgICB0cnkgeworCisgICAgICAgICAgICAvLyBMb29rIHVwIG91ciB0cmVlIGNvbnRyb2wgZGF0YSBzdHJ1Y3R1cmUKKyAgICAgICAgICAgIFRyZWVDb250cm9sIGNvbnRyb2wgPSAoVHJlZUNvbnRyb2wpCisgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRBdHRyaWJ1dGUoInRyZWVDb250cm9sVGVzdCIpOworCisgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIHNwZWNpZmllZCB2YWx2ZXMKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsdmVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgdmFsdWVzWzBdID0gdmFsdmVzW2ldOworICAgICAgICAgICAgICAgIFN0cmluZyBkb21haW4gPSAobmV3IE9iamVjdE5hbWUodmFsdmVzW2ldKSkuZ2V0RG9tYWluKCk7CisgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSBmbmFtZSA9IFRvbWNhdFRyZWVCdWlsZGVyLmdldE1CZWFuRmFjdG9yeSgpOworICAgICAgICAgICAgICAgIG1CU2VydmVyLmludm9rZShmbmFtZSwgb3BlcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMsIHJlbW92ZVZhbHZlVHlwZXMpOworICAgICAgICAgICAgICAgIGlmIChjb250cm9sICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udHJvbC5zZWxlY3ROb2RlKG51bGwpOworICAgICAgICAgICAgICAgICAgICBUcmVlQ29udHJvbE5vZGUgbm9kZSA9IGNvbnRyb2wuZmluZE5vZGUodmFsdmVzW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5yZW1vdmUoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2coIk1pc3NpbmcgVHJlZUNvbnRyb2xOb2RlIGZvciAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdmVzW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2coIk1pc3NpbmcgVHJlZUNvbnRyb2wgYXR0cmlidXRlIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisKKyAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuaW52b2tlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uKSwgZSk7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsCisgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmludm9rZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbikpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKworICAgICAgICB9CisKKyAgICAgICAgLy8gUmVwb3J0IHN1Y2Nlc3NmdWwgY29tcGxldGlvbiBvZiB0aGlzIHRyYW5zYWN0aW9uCisgICAgICAgIHJldHVybiAobWFwcGluZy5maW5kRm9yd2FyZCgiU2F2ZSBTdWNjZXNzZnVsIikpOworCisgICAgfQorICAgIAorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3ZhbHZlL0VkaXRWYWx2ZUFjdGlvbi5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3ZhbHZlL0VkaXRWYWx2ZUFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlMjY2ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vdmFsdmUvRWRpdFZhbHZlQWN0aW9uLmphdmEKQEAgLTAsMCArMSwzNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMS0yMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnZhbHZlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25FcnJvcnM7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcndhcmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMudXRpbC5NZXNzYWdlUmVzb3VyY2VzOworCitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdEluc3RhbmNlOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LkpNRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uQXBwbGljYXRpb25TZXJ2bGV0OworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkxhYmVsVmFsdWVCZWFuOworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkxpc3RzOworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLlRvbWNhdFRyZWVCdWlsZGVyOworCisvKioKKyAqIEEgZ2VuZXJpYyA8Y29kZT5BY3Rpb248L2NvZGU+IHRoYXQgc2V0cyB1cCA8ZW0+RWRpdCAKKyAqIFZhbHZlIDwvZW0+IHRyYW5zYWN0aW9ucywgYmFzZWQgb24gdGhlIHR5cGUgb2YgVmFsdmUuCisgKgorICogQGF1dGhvciBNYW52ZWVuIEthdXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIEVkaXRWYWx2ZUFjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisgICAgCisKKyAgICAvKioKKyAgICAgKiBUaGUgTUJlYW5TZXJ2ZXIgd2Ugd2lsbCBiZSBpbnRlcmFjdGluZyB3aXRoLgorICAgICAqLworICAgIHByaXZhdGUgTUJlYW5TZXJ2ZXIgbUJTZXJ2ZXIgPSBudWxsOworICAgIAorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisgICAgCisgICAgLyoqCisgICAgICogUHJvY2VzcyB0aGUgc3BlY2lmaWVkIEhUVFAgcmVxdWVzdCwgYW5kIGNyZWF0ZSB0aGUgY29ycmVzcG9uZGluZyBIVFRQCisgICAgICogcmVzcG9uc2UgKG9yIGZvcndhcmQgdG8gYW5vdGhlciB3ZWIgY29tcG9uZW50IHRoYXQgd2lsbCBjcmVhdGUgaXQpLgorICAgICAqIFJldHVybiBhbiA8Y29kZT5BY3Rpb25Gb3J3YXJkPC9jb2RlPiBpbnN0YW5jZSBkZXNjcmliaW5nIHdoZXJlIGFuZCBob3cKKyAgICAgKiBjb250cm9sIHNob3VsZCBiZSBmb3J3YXJkZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSByZXNwb25zZSBoYXMKKyAgICAgKiBhbHJlYWR5IGJlZW4gY29tcGxldGVkLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIEFjdGlvbk1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSBhY3Rpb25Gb3JtIFRoZSBvcHRpb25hbCBBY3Rpb25Gb3JtIGJlYW4gZm9yIHRoaXMgcmVxdWVzdCAoaWYgYW55KQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBIVFRQIHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIEhUVFAgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0IGV4Y2VwdGlvbiBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgQWN0aW9uRm9yd2FyZCBwZXJmb3JtKEFjdGlvbk1hcHBpbmcgbWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbkZvcm0gZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKyAgICAgICAgCisgICAgICAgIC8vIEFjcXVpcmUgdGhlIHJlc291cmNlcyB0aGF0IHdlIG5lZWQKKyAgICAgICAgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpOworICAgICAgICBMb2NhbGUgbG9jYWxlID0gZ2V0TG9jYWxlKHJlcXVlc3QpOworICAgICAgICBNZXNzYWdlUmVzb3VyY2VzIHJlc291cmNlcyA9IGdldFJlc291cmNlcyhyZXF1ZXN0KTsKKyAgICAgICAgCisgICAgICAgIC8vIEFjcXVpcmUgYSByZWZlcmVuY2UgdG8gdGhlIE1CZWFuU2VydmVyIGNvbnRhaW5pbmcgb3VyIE1CZWFucworICAgICAgICB0cnkgeworICAgICAgICAgICAgbUJTZXJ2ZXIgPSAoKEFwcGxpY2F0aW9uU2VydmxldCkgZ2V0U2VydmxldCgpKS5nZXRTZXJ2ZXIoKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uCisgICAgICAgICAgICAoIkNhbm5vdCBhY3F1aXJlIE1CZWFuU2VydmVyIHJlZmVyZW5jZSIsIHQpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBTZXQgdXAgdGhlIG9iamVjdCBuYW1lcyBvZiB0aGUgTUJlYW5zIHdlIGFyZSBtYW5pcHVsYXRpbmcKKyAgICAgICAgT2JqZWN0TmFtZSB2bmFtZSA9IG51bGw7CisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB2bmFtZSA9IG5ldyBPYmplY3ROYW1lKHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJzZWxlY3QiKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9CisgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAiZXJyb3IudmFsdmVOYW1lLmJhZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5nZXRQYXJhbWV0ZXIoInNlbGVjdCIpKTsKKyAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cobWVzc2FnZSk7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19CQURfUkVRVUVTVCwgbWVzc2FnZSk7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgIFN0cmluZyBwYXJlbnQgPSByZXF1ZXN0LmdldFBhcmFtZXRlcigicGFyZW50Iik7CisgICAgICAgU3RyaW5nIHZhbHZlVHlwZSA9IG51bGw7CisgICAgICAgU3RyaW5nIGF0dHJpYnV0ZSA9IG51bGw7CisgICAgICAgCisgICAgICAgLy8gRmluZCB3aGF0IHR5cGUgb2YgVmFsdmUgdGhpcyBpcworICAgICAgIHRyeSB7ICAgIAorICAgICAgICAgICAgYXR0cmlidXRlID0gImNsYXNzTmFtZSI7CisgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gKFN0cmluZykgCisgICAgICAgICAgICAgICAgbUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKHZuYW1lLCBhdHRyaWJ1dGUpOworICAgICAgICAgICAgaW50IHBlcmlvZCA9IGNsYXNzTmFtZS5sYXN0SW5kZXhPZigiLiIpOworICAgICAgICAgICAgaWYgKHBlcmlvZCA+PSAwKQorICAgICAgICAgICAgICAgIHZhbHZlVHlwZSA9IGNsYXNzTmFtZS5zdWJzdHJpbmcocGVyaW9kICsgMSk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZworICAgICAgICAgICAgICAgIChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5hdHRyaWJ1dGUuZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlKSwgdCk7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsCisgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmF0dHJpYnV0ZS5nZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUpKTsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7IAorICAgICAgICB9CisKKyAgICAgICAgLy8gRm9yd2FyZCB0byB0aGUgYXBwcm9wcmlhdGUgdmFsdmUgZGlzcGxheSBwYWdlICAgICAgICAKKyAgICAgICAgaWYgKCJBY2Nlc3NMb2dWYWx2ZSIuZXF1YWxzSWdub3JlQ2FzZSh2YWx2ZVR5cGUpKSB7CisgICAgICAgICAgICAgICBzZXRVcEFjY2Vzc0xvZ1ZhbHZlKHZuYW1lLCByZXF1ZXN0LCByZXNwb25zZSk7CisgICAgICAgIH0gZWxzZSBpZiAoIlJlbW90ZUFkZHJWYWx2ZSIuZXF1YWxzSWdub3JlQ2FzZSh2YWx2ZVR5cGUpKSB7CisgICAgICAgICAgICAgICBzZXRVcFJlbW90ZUFkZHJWYWx2ZSh2bmFtZSwgcmVxdWVzdCwgcmVzcG9uc2UpOworICAgICAgICB9IGVsc2UgaWYgKCJSZW1vdGVIb3N0VmFsdmUiLmVxdWFsc0lnbm9yZUNhc2UodmFsdmVUeXBlKSkgeworICAgICAgICAgICAgICAgIHNldFVwUmVtb3RlSG9zdFZhbHZlKHZuYW1lLCByZXF1ZXN0LCByZXNwb25zZSk7CisgICAgICAgIH0gZWxzZSBpZiAoIlJlcXVlc3REdW1wZXJWYWx2ZSIuZXF1YWxzSWdub3JlQ2FzZSh2YWx2ZVR5cGUpKSB7CisgICAgICAgICAgICAgICBzZXRVcFJlcXVlc3REdW1wZXJWYWx2ZSh2bmFtZSwgcmVxdWVzdCwgcmVzcG9uc2UpOworICAgICAgICB9IGVsc2UgaWYgKCJTaW5nbGVTaWduT24iLmVxdWFsc0lnbm9yZUNhc2UodmFsdmVUeXBlKSkgeworICAgICAgICAgICAgICAgc2V0VXBTaW5nbGVTaWduT25WYWx2ZSh2bmFtZSwgcmVxdWVzdCwgcmVzcG9uc2UpOworICAgICAgICB9CisgICAgICAgCisgICAgICAgIAorICAgICAgICByZXR1cm4gKG1hcHBpbmcuZmluZEZvcndhcmQodmFsdmVUeXBlKSk7CisgICAgICAgICAgICAgICAgCisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldFVwQWNjZXNzTG9nVmFsdmUoT2JqZWN0TmFtZSB2bmFtZSwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgCisgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gRmlsbCBpbiB0aGUgZm9ybSB2YWx1ZXMgZm9yIGRpc3BsYXkgYW5kIGVkaXRpbmcKKyAgICAgICAgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpOworICAgICAgICBMb2NhbGUgbG9jYWxlID0gZ2V0TG9jYWxlKHJlcXVlc3QpOworICAgICAgICBNZXNzYWdlUmVzb3VyY2VzIHJlc291cmNlcyA9IGdldFJlc291cmNlcyhyZXF1ZXN0KTsKKyAgICAgICAgU3RyaW5nIHBhcmVudCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJwYXJlbnQiKTsKKyAgICAgICAgQWNjZXNzTG9nVmFsdmVGb3JtIHZhbHZlRm0gPSBuZXcgQWNjZXNzTG9nVmFsdmVGb3JtKCk7CisgICAgICAgIHNlc3Npb24uc2V0QXR0cmlidXRlKCJhY2Nlc3NMb2dWYWx2ZUZvcm0iLCB2YWx2ZUZtKTsKKyAgICAgICAgdmFsdmVGbS5zZXRBZG1pbkFjdGlvbigiRWRpdCIpOworICAgICAgICB2YWx2ZUZtLnNldE9iamVjdE5hbWUodm5hbWUudG9TdHJpbmcoKSk7IAorICAgICAgICB2YWx2ZUZtLnNldFBhcmVudE9iamVjdE5hbWUocGFyZW50KTsKKyAgICAgICAgU3RyaW5nIHZhbHZlVHlwZSA9ICJBY2Nlc3NMb2dWYWx2ZSI7CisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIiIpOworICAgICAgICBTdHJpbmcgaG9zdCA9IHZuYW1lLmdldEtleVByb3BlcnR5KCJob3N0Iik7CisgICAgICAgIFN0cmluZyBjb250ZXh0ID0gdm5hbWUuZ2V0S2V5UHJvcGVydHkoInBhdGgiKTsgICAgICAgIAorICAgICAgICBpZiAoaG9zdCE9bnVsbCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCJIb3N0ICgiICsgaG9zdCArICIpID4gIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvbnRleHQhPW51bGwpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiQ29udGV4dCAoIiArIGNvbnRleHQgKyAiKSA+ICIpOworICAgICAgICB9CisgICAgICAgIHNiLmFwcGVuZCgiVmFsdmUiKTsKKyAgICAgICAgdmFsdmVGbS5zZXROb2RlTGFiZWwoc2IudG9TdHJpbmcoKSk7CisgICAgICAgIHZhbHZlRm0uc2V0VmFsdmVUeXBlKHZhbHZlVHlwZSk7CisgICAgICAgIHZhbHZlRm0uc2V0Qm9vbGVhblZhbHMoTGlzdHMuZ2V0Qm9vbGVhblZhbHVlcygpKTsKKyAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIENvcHkgc2NhbGFyIHByb3BlcnRpZXMKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJkaXJlY3RvcnkiOworICAgICAgICAgICAgdmFsdmVGbS5zZXREaXJlY3RvcnkKKyAgICAgICAgICAgICAgICAoKFN0cmluZykgbUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKHZuYW1lLCBhdHRyaWJ1dGUpKTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJwYXR0ZXJuIjsKKyAgICAgICAgICAgIHZhbHZlRm0uc2V0UGF0dGVybgorICAgICAgICAgICAgICAgICgoU3RyaW5nKSBtQlNlcnZlci5nZXRBdHRyaWJ1dGUodm5hbWUsIGF0dHJpYnV0ZSkpOworICAgICAgICAgICAgYXR0cmlidXRlID0gInByZWZpeCI7CisgICAgICAgICAgICB2YWx2ZUZtLnNldFByZWZpeAorICAgICAgICAgICAgICAgICgoU3RyaW5nKSBtQlNlcnZlci5nZXRBdHRyaWJ1dGUodm5hbWUsIGF0dHJpYnV0ZSkpOworICAgICAgICAgICAgYXR0cmlidXRlID0gInN1ZmZpeCI7CisgICAgICAgICAgICB2YWx2ZUZtLnNldFN1ZmZpeAorICAgICAgICAgICAgICAgICgoU3RyaW5nKSBtQlNlcnZlci5nZXRBdHRyaWJ1dGUodm5hbWUsIGF0dHJpYnV0ZSkpOworICAgICAgICAgICAgYXR0cmlidXRlID0gInJlc29sdmVIb3N0cyI7CisgICAgICAgICAgICB2YWx2ZUZtLnNldFJlc29sdmVIb3N0cworICAgICAgICAgICAgICAgICgoKEJvb2xlYW4pIG1CU2VydmVyLmdldEF0dHJpYnV0ZSh2bmFtZSwgYXR0cmlidXRlKSkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAicm90YXRhYmxlIjsKKyAgICAgICAgICAgIHZhbHZlRm0uc2V0Um90YXRhYmxlCisgICAgICAgICAgICAgICAgKCgoQm9vbGVhbikgbUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKHZuYW1lLCBhdHRyaWJ1dGUpKS50b1N0cmluZygpKTsKKworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZworICAgICAgICAgICAgICAgIChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5hdHRyaWJ1dGUuZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlKSwgdCk7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsCisgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmF0dHJpYnV0ZS5nZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUpKTsKKyAgICAgICAgfSAgICAgCisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldFVwUmVxdWVzdER1bXBlclZhbHZlKE9iamVjdE5hbWUgdm5hbWUsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIAorICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIEZpbGwgaW4gdGhlIGZvcm0gdmFsdWVzIGZvciBkaXNwbGF5IGFuZCBlZGl0aW5nCisgICAgICAgIEh0dHBTZXNzaW9uIHNlc3Npb24gPSByZXF1ZXN0LmdldFNlc3Npb24oKTsKKyAgICAgICAgTG9jYWxlIGxvY2FsZSA9IGdldExvY2FsZShyZXF1ZXN0KTsKKyAgICAgICAgTWVzc2FnZVJlc291cmNlcyByZXNvdXJjZXMgPSBnZXRSZXNvdXJjZXMocmVxdWVzdCk7CisgICAgICAgIFN0cmluZyBwYXJlbnQgPSByZXF1ZXN0LmdldFBhcmFtZXRlcigicGFyZW50Iik7CisgICAgICAgIFJlcXVlc3REdW1wZXJWYWx2ZUZvcm0gdmFsdmVGbSA9IG5ldyBSZXF1ZXN0RHVtcGVyVmFsdmVGb3JtKCk7CisgICAgICAgIHNlc3Npb24uc2V0QXR0cmlidXRlKCJyZXF1ZXN0RHVtcGVyVmFsdmVGb3JtIiwgdmFsdmVGbSk7CisgICAgICAgIHZhbHZlRm0uc2V0QWRtaW5BY3Rpb24oIkVkaXQiKTsKKyAgICAgICAgdmFsdmVGbS5zZXRPYmplY3ROYW1lKHZuYW1lLnRvU3RyaW5nKCkpOyAKKyAgICAgICAgdmFsdmVGbS5zZXRQYXJlbnRPYmplY3ROYW1lKHBhcmVudCk7CisgICAgICAgIFN0cmluZyB2YWx2ZVR5cGUgPSAiUmVxdWVzdER1bXBlclZhbHZlIjsKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiVmFsdmUgKCIpOworICAgICAgICBzYi5hcHBlbmQodmFsdmVUeXBlKTsKKyAgICAgICAgc2IuYXBwZW5kKCIpIik7CisgICAgICAgIHZhbHZlRm0uc2V0Tm9kZUxhYmVsKHNiLnRvU3RyaW5nKCkpOworICAgICAgICB2YWx2ZUZtLnNldFZhbHZlVHlwZSh2YWx2ZVR5cGUpOworICAgICAgICBTdHJpbmcgYXR0cmlidXRlID0gbnVsbDsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0VXBTaW5nbGVTaWduT25WYWx2ZShPYmplY3ROYW1lIHZuYW1lLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSAKKyAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLyBGaWxsIGluIHRoZSBmb3JtIHZhbHVlcyBmb3IgZGlzcGxheSBhbmQgZWRpdGluZworICAgICAgICBIdHRwU2Vzc2lvbiBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uKCk7CisgICAgICAgIExvY2FsZSBsb2NhbGUgPSBnZXRMb2NhbGUocmVxdWVzdCk7CisgICAgICAgIE1lc3NhZ2VSZXNvdXJjZXMgcmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VzKHJlcXVlc3QpOworICAgICAgICBTdHJpbmcgcGFyZW50ID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoInBhcmVudCIpOworICAgICAgICBTaW5nbGVTaWduT25WYWx2ZUZvcm0gdmFsdmVGbSA9IG5ldyBTaW5nbGVTaWduT25WYWx2ZUZvcm0oKTsKKyAgICAgICAgc2Vzc2lvbi5zZXRBdHRyaWJ1dGUoInNpbmdsZVNpZ25PblZhbHZlRm9ybSIsIHZhbHZlRm0pOworICAgICAgICB2YWx2ZUZtLnNldEFkbWluQWN0aW9uKCJFZGl0Iik7CisgICAgICAgIHZhbHZlRm0uc2V0T2JqZWN0TmFtZSh2bmFtZS50b1N0cmluZygpKTsgCisgICAgICAgIHZhbHZlRm0uc2V0UGFyZW50T2JqZWN0TmFtZShwYXJlbnQpOworICAgICAgICBTdHJpbmcgdmFsdmVUeXBlID0gIlNpbmdsZVNpZ25PbiI7CisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIlZhbHZlICgiKTsKKyAgICAgICAgc2IuYXBwZW5kKHZhbHZlVHlwZSk7CisgICAgICAgIHNiLmFwcGVuZCgiKSIpOworICAgICAgICB2YWx2ZUZtLnNldE5vZGVMYWJlbChzYi50b1N0cmluZygpKTsKKyAgICAgICAgdmFsdmVGbS5zZXRWYWx2ZVR5cGUodmFsdmVUeXBlKTsKKyAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZSA9IG51bGw7CisgICAgfQorCisKKyAgICBwcml2YXRlIHZvaWQgc2V0VXBSZW1vdGVBZGRyVmFsdmUoT2JqZWN0TmFtZSB2bmFtZSwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgCisgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gRmlsbCBpbiB0aGUgZm9ybSB2YWx1ZXMgZm9yIGRpc3BsYXkgYW5kIGVkaXRpbmcKKyAgICAgICAgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpOworICAgICAgICBMb2NhbGUgbG9jYWxlID0gZ2V0TG9jYWxlKHJlcXVlc3QpOworICAgICAgICBNZXNzYWdlUmVzb3VyY2VzIHJlc291cmNlcyA9IGdldFJlc291cmNlcyhyZXF1ZXN0KTsKKyAgICAgICAgU3RyaW5nIHBhcmVudCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJwYXJlbnQiKTsKKyAgICAgICAgUmVtb3RlQWRkclZhbHZlRm9ybSB2YWx2ZUZtID0gbmV3IFJlbW90ZUFkZHJWYWx2ZUZvcm0oKTsKKyAgICAgICAgc2Vzc2lvbi5zZXRBdHRyaWJ1dGUoInJlbW90ZUFkZHJWYWx2ZUZvcm0iLCB2YWx2ZUZtKTsKKyAgICAgICAgdmFsdmVGbS5zZXRBZG1pbkFjdGlvbigiRWRpdCIpOworICAgICAgICB2YWx2ZUZtLnNldE9iamVjdE5hbWUodm5hbWUudG9TdHJpbmcoKSk7IAorICAgICAgICB2YWx2ZUZtLnNldFBhcmVudE9iamVjdE5hbWUocGFyZW50KTsKKyAgICAgICAgU3RyaW5nIHZhbHZlVHlwZSA9ICJSZW1vdGVBZGRyVmFsdmUiOworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCJWYWx2ZSAoIik7CisgICAgICAgIHNiLmFwcGVuZCh2YWx2ZVR5cGUpOworICAgICAgICBzYi5hcHBlbmQoIikiKTsKKyAgICAgICAgdmFsdmVGbS5zZXROb2RlTGFiZWwoc2IudG9TdHJpbmcoKSk7CisgICAgICAgIHZhbHZlRm0uc2V0VmFsdmVUeXBlKHZhbHZlVHlwZSk7CisgICAgICAgIFN0cmluZyBhdHRyaWJ1dGUgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBDb3B5IHNjYWxhciBwcm9wZXJ0aWVzCisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAiYWxsb3ciOworICAgICAgICAgICAgdmFsdmVGbS5zZXRBbGxvdworICAgICAgICAgICAgICAgICgoU3RyaW5nKSBtQlNlcnZlci5nZXRBdHRyaWJ1dGUodm5hbWUsIGF0dHJpYnV0ZSkpOworICAgICAgICAgICAgYXR0cmlidXRlID0gImRlbnkiOworICAgICAgICAgICAgdmFsdmVGbS5zZXREZW55CisgICAgICAgICAgICAgICAgKChTdHJpbmcpIG1CU2VydmVyLmdldEF0dHJpYnV0ZSh2bmFtZSwgYXR0cmlidXRlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuYXR0cmlidXRlLmdldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSksIHQpOworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5hdHRyaWJ1dGUuZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlKSk7CisgICAgICAgIH0gICAgIAorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXRVcFJlbW90ZUhvc3RWYWx2ZShPYmplY3ROYW1lIHZuYW1lLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSAKKyAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLyBGaWxsIGluIHRoZSBmb3JtIHZhbHVlcyBmb3IgZGlzcGxheSBhbmQgZWRpdGluZworICAgICAgICBIdHRwU2Vzc2lvbiBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uKCk7CisgICAgICAgIExvY2FsZSBsb2NhbGUgPSBnZXRMb2NhbGUocmVxdWVzdCk7CisgICAgICAgIE1lc3NhZ2VSZXNvdXJjZXMgcmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VzKHJlcXVlc3QpOworICAgICAgICBTdHJpbmcgcGFyZW50ID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoInBhcmVudCIpOworICAgICAgICBSZW1vdGVIb3N0VmFsdmVGb3JtIHZhbHZlRm0gPSBuZXcgUmVtb3RlSG9zdFZhbHZlRm9ybSgpOworICAgICAgICBzZXNzaW9uLnNldEF0dHJpYnV0ZSgicmVtb3RlSG9zdFZhbHZlRm9ybSIsIHZhbHZlRm0pOworICAgICAgICB2YWx2ZUZtLnNldEFkbWluQWN0aW9uKCJFZGl0Iik7CisgICAgICAgIHZhbHZlRm0uc2V0T2JqZWN0TmFtZSh2bmFtZS50b1N0cmluZygpKTsgCisgICAgICAgIHZhbHZlRm0uc2V0UGFyZW50T2JqZWN0TmFtZShwYXJlbnQpOworICAgICAgICBTdHJpbmcgdmFsdmVUeXBlID0gIlJlbW90ZUhvc3RWYWx2ZSI7CisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIlZhbHZlICgiKTsKKyAgICAgICAgc2IuYXBwZW5kKHZhbHZlVHlwZSk7CisgICAgICAgIHNiLmFwcGVuZCgiKSIpOworICAgICAgICB2YWx2ZUZtLnNldE5vZGVMYWJlbChzYi50b1N0cmluZygpKTsKKyAgICAgICAgdmFsdmVGbS5zZXRWYWx2ZVR5cGUodmFsdmVUeXBlKTsKKyAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIENvcHkgc2NhbGFyIHByb3BlcnRpZXMKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJhbGxvdyI7CisgICAgICAgICAgICB2YWx2ZUZtLnNldEFsbG93CisgICAgICAgICAgICAgICAgKChTdHJpbmcpIG1CU2VydmVyLmdldEF0dHJpYnV0ZSh2bmFtZSwgYXR0cmlidXRlKSk7CisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAiZGVueSI7CisgICAgICAgICAgICB2YWx2ZUZtLnNldERlbnkKKyAgICAgICAgICAgICAgICAoKFN0cmluZykgbUJTZXJ2ZXIuZ2V0QXR0cmlidXRlKHZuYW1lLCBhdHRyaWJ1dGUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZworICAgICAgICAgICAgICAgIChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5hdHRyaWJ1dGUuZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlKSwgdCk7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsCisgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmF0dHJpYnV0ZS5nZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUpKTsKKyAgICAgICAgfSAgICAgCisgICAgfQorICAgIAorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3ZhbHZlL1JlbW90ZUFkZHJWYWx2ZUZvcm0uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi92YWx2ZS9SZW1vdGVBZGRyVmFsdmVGb3JtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNmOTFjOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi92YWx2ZS9SZW1vdGVBZGRyVmFsdmVGb3JtLmphdmEKQEAgLTAsMCArMSwyMjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi52YWx2ZTsKKworaW1wb3J0IGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25FcnJvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRXJyb3JzOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworCitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uQXBwbGljYXRpb25TZXJ2bGV0OworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkxhYmVsVmFsdWVCZWFuOworCisvKioKKyAqIEZvcm0gYmVhbiBmb3IgdGhlIHJlbW90ZSBhZGRyIHZhbHZlIHBhZ2UuCisgKgorICogQGF1dGhvciBNYW52ZWVuIEthdXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIFJlbW90ZUFkZHJWYWx2ZUZvcm0gZXh0ZW5kcyBWYWx2ZUZvcm0geworICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciB0aGUgYWxsb3cgSVAgYWRkcmVzc2VzLgorICAgICAqIEEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm5zCisgICAgICogdGhhdCB0aGUgcmVtb3RlIGNsaWVudCdzIElQIGFkZHJlc3MgaXMgY29tcGFyZWQgdG8uIAorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGFsbG93ID0gIiI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdGV4dCBmb3IgdGhlIGRlbnkgSVAgYWRkcmVzc2VzLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGRlbnkgPSAiIjsKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgc2V0IG9mIDxjb2RlPmFsbG93PC9jb2RlPiByZWd1bGFyIGV4cHJlc3Npb25zIHdlIHdpbGwgZXZhbHVhdGUuCisgICAgICovCisgICAgcHJpdmF0ZSBQYXR0ZXJuIGFsbG93c1tdID0gbmV3IFBhdHRlcm5bMF07CisKKyAgICAvKioKKyAgICAgKiBUaGUgc2V0IG9mIDxjb2RlPmRlbnk8L2NvZGU+IHJlZ3VsYXIgZXhwcmVzc2lvbnMgd2Ugd2lsbCBldmFsdWF0ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFBhdHRlcm4gZGVuaWVzW10gPSBuZXcgUGF0dGVyblswXTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGFsbG93IGhvc3RzIElQIGFkZGRyZXNzZXMuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRBbGxvdygpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLmFsbG93OworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBhbGxvdyBob3N0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBbGxvdyhTdHJpbmcgYWxsb3cpIHsKKyAgICAgICAgCisgICAgICAgIHRoaXMuYWxsb3cgPSBhbGxvdzsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZGVueSBob3N0cyBJUCBhZGRkcmVzc2VzLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVueSgpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLmRlbnk7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGRlbnkgaG9zdHMgSVAgYWRkcmVzc2VzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERlbnkoU3RyaW5nIGRlbnkpIHsKKyAgICAgICAgCisgICAgICAgIHRoaXMuZGVueSA9IGRlbnk7CisgICAgICAgIAorICAgIH0gICAgCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXNldCBhbGwgcHJvcGVydGllcyB0byB0aGVpciBkZWZhdWx0IHZhbHVlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBtYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVzZXQoQWN0aW9uTWFwcGluZyBtYXBwaW5nLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICAgICAgICAgIAorICAgICAgICBzdXBlci5yZXNldChtYXBwaW5nLCByZXF1ZXN0KTsKKyAgICAgICAgdGhpcy5hbGxvdyA9IG51bGw7CisgICAgICAgIHRoaXMuZGVueSA9IG51bGw7CisgICAgICAgIHRoaXMuYWxsb3dzID0gbnVsbDsKKyAgICAgICAgdGhpcy5kZW5pZXMgPSBudWxsOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmVuZGVyIHRoaXMgb2JqZWN0IGFzIGEgU3RyaW5nLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiUmVtb3RlQWRkclZhbHZlRm9ybVthZG1pbkFjdGlvbj0iKTsKKyAgICAgICAgc2IuYXBwZW5kKGdldEFkbWluQWN0aW9uKCkpOworICAgICAgICBzYi5hcHBlbmQoIicsdmFsdmVUeXBlPSIpOworICAgICAgICBzYi5hcHBlbmQoZ2V0VmFsdmVUeXBlKCkpOworICAgICAgICBzYi5hcHBlbmQoIixhbGxvdz0iKTsKKyAgICAgICAgc2IuYXBwZW5kKGdldEFsbG93KCkpOworICAgICAgICBzYi5hcHBlbmQoIixkZW55PSIpOworICAgICAgICBzYi5hcHBlbmQoZ2V0RGVueSgpKTsgICAgICAgIAorICAgICAgICBzYi5hcHBlbmQoIicsb2JqZWN0TmFtZT0nIik7CisgICAgICAgIHNiLmFwcGVuZChnZXRPYmplY3ROYW1lKCkpOworICAgICAgICBzYi5hcHBlbmQoIl0iKTsKKyAgICAgICAgcmV0dXJuIChzYi50b1N0cmluZygpKTsKKworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBWYWxpZGF0ZSB0aGUgcHJvcGVydGllcyB0aGF0IGhhdmUgYmVlbiBzZXQgZnJvbSB0aGlzIEhUVFAgcmVxdWVzdCwKKyAgICAgKiBhbmQgcmV0dXJuIGFuIDxjb2RlPkFjdGlvbkVycm9yczwvY29kZT4gb2JqZWN0IHRoYXQgZW5jYXBzdWxhdGVzIGFueQorICAgICAqIHZhbGlkYXRpb24gZXJyb3JzIHRoYXQgaGF2ZSBiZWVuIGZvdW5kLiAgSWYgbm8gZXJyb3JzIGFyZSBmb3VuZCwgcmV0dXJuCisgICAgICogPGNvZGU+bnVsbDwvY29kZT4gb3IgYW4gPGNvZGU+QWN0aW9uRXJyb3JzPC9jb2RlPiBvYmplY3Qgd2l0aCBubworICAgICAqIHJlY29yZGVkIGVycm9yIG1lc3NhZ2VzLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIG1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgQWN0aW9uRXJyb3JzIHZhbGlkYXRlKEFjdGlvbk1hcHBpbmcgbWFwcGluZywKKyAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICAKKyAgICAgICAgQWN0aW9uRXJyb3JzIGVycm9ycyA9IG5ldyBBY3Rpb25FcnJvcnMoKTsKKyAgICAgICAgCisgICAgICAgIFN0cmluZyBzdWJtaXQgPSByZXF1ZXN0LmdldFBhcmFtZXRlcigic3VibWl0Iik7CisgICAgICAgIAorICAgICAgICAvLyBmcm9udCBlbmQgdmFsaWRhdGlvbiB3aGVuIHNhdmUgaXMgY2xpY2tlZC4gICAgICAgIAorICAgICAgICAvL2lmIChzdWJtaXQgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gdmFsaWRhdGUgYWxsb3cvZGVueSBwYXR0ZXJucworICAgICAgICAgICAgaWYgKChhbGxvdyA9PSBudWxsKSB8fCAoYWxsb3cubGVuZ3RoKCkgPCAxKSkgeworICAgICAgICAgICAgICAgIGlmICgoZGVueSA9PSBudWxsKSB8fCAoZGVueS5sZW5ndGgoKSA8IDEpKSB7CisgICAgICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoImFsbG93IiwKKyAgICAgICAgICAgICAgICAgICAgbmV3IEFjdGlvbkVycm9yKCJlcnJvci5hbGxvdy5kZW55LnJlcXVpcmVkIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgCisgICAgICAgIC8vfQorICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFsbG93cyA9IFZhbHZlVXRpbC5wcmVjYWxjdWxhdGUoYWxsb3cpOyAgICAgICAgICAgIAorICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZXJyb3JzLmFkZCgiYWxsb3ciLCBuZXcgQWN0aW9uRXJyb3IoImVycm9yLnN5bnRheCIpKTsKKyAgICAgICAgICAgIHJldHVybiBlcnJvcnM7CisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICB0cnkgeyAgIAorICAgICAgICAgICAgZGVuaWVzID0gVmFsdmVVdGlsLnByZWNhbGN1bGF0ZShkZW55KTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGVycm9ycy5hZGQoImFsbG93IiwgbmV3IEFjdGlvbkVycm9yKCJlcnJvci5zeW50YXgiKSk7CisgICAgICAgICAgICByZXR1cm4gZXJyb3JzOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBTdHJpbmcgaXAgPSByZXF1ZXN0LmdldFJlbW90ZUFkZHIoKTsKKyAgICAgICAgCisgICAgICAgIGlmIChpcCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZXJyb3JzOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlbmllcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKGRlbmllc1tpXS5tYXRjaGVyKGlwKS5tYXRjaGVzKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoYWxsb3dzLmxlbmd0aCA8IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgZXJyb3JzLmFkZCgiZGVueSIsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQWN0aW9uRXJyb3IoImVycm9yLmRlbnlJUCIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBhbGxvd3MubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFhbGxvd3Nbal0ubWF0Y2hlcihpcCkubWF0Y2hlcygpKSB7IAorICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLmFkZCgiZGVueSIsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQWN0aW9uRXJyb3IoImVycm9yLmRlbnlJUCIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gICAgCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGJvb2xlYW4gYWxsb3dNYXRjaCA9IHRydWU7CisgICAgICAgIGlmIChhbGxvd3MubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgYWxsb3dNYXRjaCA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWxsb3dzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoYWxsb3dzW2ldLm1hdGNoZXIoaXApLm1hdGNoZXMoKSkgeworICAgICAgICAgICAgICAgIGFsbG93TWF0Y2ggPSB0cnVlOyAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAgICAgICAKKyAgICAgICAgaWYgKCFhbGxvd01hdGNoKSB7CisgICAgICAgICAgICBlcnJvcnMuYWRkKCJhbGxvdyIsIG5ldyBBY3Rpb25FcnJvcigiZXJyb3IuYWxsb3dJUCIpKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIGVycm9yczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vdmFsdmUvUmVtb3RlSG9zdFZhbHZlRm9ybS5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3ZhbHZlL1JlbW90ZUhvc3RWYWx2ZUZvcm0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTUxNDM2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3ZhbHZlL1JlbW90ZUhvc3RWYWx2ZUZvcm0uamF2YQpAQCAtMCwwICsxLDI0MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAxLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnZhbHZlOworCitpbXBvcnQgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkVycm9yOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25FcnJvcnM7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CisKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5BcHBsaWNhdGlvblNlcnZsZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uTGFiZWxWYWx1ZUJlYW47CisKKy8qKgorICogRm9ybSBiZWFuIGZvciB0aGUgcmVtb3RlIGhvc3QgdmFsdmUgcGFnZS4KKyAqCisgKiBAYXV0aG9yIE1hbnZlZW4gS2F1cgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgUmVtb3RlSG9zdFZhbHZlRm9ybSBleHRlbmRzIFZhbHZlRm9ybSB7CisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSB0ZXh0IGZvciB0aGUgYWxsb3cgaG9zdHMgSVAgYWRkcmVzc2VzLgorICAgICAqIEEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm5zCisgICAgICogdGhhdCB0aGUgcmVtb3RlIGNsaWVudCdzIElQIGFkZHJlc3MgaXMgY29tcGFyZWQgdG8uIAorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGFsbG93ID0gIiI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdGV4dCBmb3IgdGhlIGRlbnkgaG9zdHMgSVAgYWRkcmVzc2VzLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGRlbnkgPSAiIjsKKworICAgIC8qKgorICAgICAqIFRoZSBzZXQgb2YgPGNvZGU+YWxsb3c8L2NvZGU+IHJlZ3VsYXIgZXhwcmVzc2lvbnMgd2Ugd2lsbCBldmFsdWF0ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFBhdHRlcm4gYWxsb3dzW10gPSBuZXcgUGF0dGVyblswXTsKKworICAgIC8qKgorICAgICAqIFRoZSBzZXQgb2YgPGNvZGU+ZGVueTwvY29kZT4gcmVndWxhciBleHByZXNzaW9ucyB3ZSB3aWxsIGV2YWx1YXRlLgorICAgICAqLworICAgIHByaXZhdGUgUGF0dGVybiBkZW5pZXNbXSA9IG5ldyBQYXR0ZXJuWzBdOworICAgIAorICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBhbGxvdyBob3N0cyBJUCBhZGRkcmVzc2VzLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWxsb3coKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy5hbGxvdzsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgYWxsb3cgaG9zdHMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QWxsb3coU3RyaW5nIGFsbG93KSB7CisgICAgICAgIAorICAgICAgICB0aGlzLmFsbG93ID0gYWxsb3c7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGRlbnkgaG9zdHMgSVAgYWRkZHJlc3Nlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldERlbnkoKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy5kZW55OworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBkZW55IGhvc3RzIElQIGFkZHJlc3Nlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREZW55KFN0cmluZyBkZW55KSB7CisgICAgICAgIAorICAgICAgICB0aGlzLmRlbnkgPSBkZW55OworICAgICAgICAKKyAgICB9ICAgIAorICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworICAgIAorICAgIC8qKgorICAgICAqIFJlc2V0IGFsbCBwcm9wZXJ0aWVzIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIG1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZXNldChBY3Rpb25NYXBwaW5nIG1hcHBpbmcsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisKKyAgICAgICAgc3VwZXIucmVzZXQobWFwcGluZywgcmVxdWVzdCk7CisgICAgICAgIHRoaXMuYWxsb3cgPSBudWxsOworICAgICAgICB0aGlzLmRlbnkgPSBudWxsOworICAgICAgICB0aGlzLmFsbG93cyA9IG51bGw7CisgICAgICAgIHRoaXMuZGVuaWVzID0gbnVsbDsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJlbmRlciB0aGlzIG9iamVjdCBhcyBhIFN0cmluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIlJlbW90ZUhvc3RWYWx2ZUZvcm1bYWRtaW5BY3Rpb249Iik7CisgICAgICAgIHNiLmFwcGVuZChnZXRBZG1pbkFjdGlvbigpKTsKKyAgICAgICAgc2IuYXBwZW5kKCInLHZhbHZlVHlwZT0iKTsKKyAgICAgICAgc2IuYXBwZW5kKGdldFZhbHZlVHlwZSgpKTsKKyAgICAgICAgc2IuYXBwZW5kKCIsYWxsb3c9Iik7CisgICAgICAgIHNiLmFwcGVuZChhbGxvdyk7CisgICAgICAgIHNiLmFwcGVuZCgiLGRlbnk9Iik7CisgICAgICAgIHNiLmFwcGVuZChkZW55KTsgICAgICAgIAorICAgICAgICBzYi5hcHBlbmQoIicsb2JqZWN0TmFtZT0nIik7CisgICAgICAgIHNiLmFwcGVuZChnZXRPYmplY3ROYW1lKCkpOworICAgICAgICBzYi5hcHBlbmQoIl0iKTsKKyAgICAgICAgcmV0dXJuIChzYi50b1N0cmluZygpKTsKKworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBWYWxpZGF0ZSB0aGUgcHJvcGVydGllcyB0aGF0IGhhdmUgYmVlbiBzZXQgZnJvbSB0aGlzIEhUVFAgcmVxdWVzdCwKKyAgICAgKiBhbmQgcmV0dXJuIGFuIDxjb2RlPkFjdGlvbkVycm9yczwvY29kZT4gb2JqZWN0IHRoYXQgZW5jYXBzdWxhdGVzIGFueQorICAgICAqIHZhbGlkYXRpb24gZXJyb3JzIHRoYXQgaGF2ZSBiZWVuIGZvdW5kLiAgSWYgbm8gZXJyb3JzIGFyZSBmb3VuZCwgcmV0dXJuCisgICAgICogPGNvZGU+bnVsbDwvY29kZT4gb3IgYW4gPGNvZGU+QWN0aW9uRXJyb3JzPC9jb2RlPiBvYmplY3Qgd2l0aCBubworICAgICAqIHJlY29yZGVkIGVycm9yIG1lc3NhZ2VzLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIG1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgQWN0aW9uRXJyb3JzIHZhbGlkYXRlKEFjdGlvbk1hcHBpbmcgbWFwcGluZywKKyAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICAKKyAgICAgICAgQWN0aW9uRXJyb3JzIGVycm9ycyA9IG5ldyBBY3Rpb25FcnJvcnMoKTsKKyAgICAgICAgCisgICAgICAgIFN0cmluZyBzdWJtaXQgPSByZXF1ZXN0LmdldFBhcmFtZXRlcigic3VibWl0Iik7CisgICAgICAgIAorICAgICAgICAvLyBmcm9udCBlbmQgdmFsaWRhdGlvbiB3aGVuIHNhdmUgaXMgY2xpY2tlZC4gICAgICAgIAorICAgICAgICAvL2lmIChzdWJtaXQgIT0gbnVsbCkgeworICAgICAgICAgICAgIC8vIFRCRAorICAgICAgICAgICAgLy8gdmFsaWRhdGUgYWxsb3cvZGVueSBJUHMKKyAgICAgICAgICAgIGlmICgoYWxsb3cgPT0gbnVsbCkgfHwgKGFsbG93Lmxlbmd0aCgpIDwgMSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoKGRlbnkgPT0gbnVsbCkgfHwgKGRlbnkubGVuZ3RoKCkgPCAxKSkgeworICAgICAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKCJhbGxvdyIsCisgICAgICAgICAgICAgICAgICAgIG5ldyBBY3Rpb25FcnJvcigiZXJyb3IuYWxsb3cuZGVueS5yZXF1aXJlZCIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9ICAgICAgICAgICAgICAKKyAgICAgICAgLy99CisgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgYWxsb3dzID0gVmFsdmVVdGlsLnByZWNhbGN1bGF0ZShhbGxvdyk7ICAgICAgICAgICAgCisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlcnJvcnMuYWRkKCJhbGxvdyIsIG5ldyBBY3Rpb25FcnJvcigiZXJyb3Iuc3ludGF4IikpOworICAgICAgICAgICAgcmV0dXJuIGVycm9yczsKKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgIHRyeSB7ICAgCisgICAgICAgICAgICBkZW5pZXMgPSBWYWx2ZVV0aWwucHJlY2FsY3VsYXRlKGRlbnkpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZXJyb3JzLmFkZCgiYWxsb3ciLCBuZXcgQWN0aW9uRXJyb3IoImVycm9yLnN5bnRheCIpKTsKKyAgICAgICAgICAgIHJldHVybiBlcnJvcnM7CisgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgCisgICAgICAgIFN0cmluZyBob3N0ID0gcmVxdWVzdC5nZXRSZW1vdGVIb3N0KCk7CisgICAgICAgIC8vIGNoZWNrIGZvciBJUCBhZGRyZXNzIGFsc28gaW4gY2FzZSBETlMgaXMgbm90IGNvbmZpZ3VyZWQgCisgICAgICAgIC8vIHRvIGdpdmUgYSBob3N0IG5hbWUgZm9yIHRoZSBjbGllbnQgbWFjaGluZQorICAgICAgICBTdHJpbmcgaXAgPSByZXF1ZXN0LmdldFJlbW90ZUFkZHIoKTsKKyAgICAKKyAgICAgICAgaWYgKGhvc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGVycm9yczsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZW5pZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChkZW5pZXNbaV0ubWF0Y2hlcihob3N0KS5tYXRjaGVzKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoYWxsb3dzLmxlbmd0aCA8IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgZXJyb3JzLmFkZCgiZGVueSIsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQWN0aW9uRXJyb3IoImVycm9yLmRlbnlIb3N0IikpOworICAgICAgICAgICAgICAgIH0gICAgCisgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBhbGxvd3MubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFhbGxvd3Nbal0ubWF0Y2hlcihob3N0KS5tYXRjaGVzKCkpIHsgCisgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKCJkZW55IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBY3Rpb25FcnJvcigiZXJyb3IuZGVueUhvc3QiKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKGRlbmllc1tpXS5tYXRjaGVyKGlwKS5tYXRjaGVzKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoYWxsb3dzLmxlbmd0aCA8IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgZXJyb3JzLmFkZCgiZGVueSIsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQWN0aW9uRXJyb3IoImVycm9yLmRlbnlIb3N0IikpOworICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGFsbG93cy5sZW5ndGg7IGorKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWFsbG93c1tqXS5tYXRjaGVyKGlwKS5tYXRjaGVzKCkpIHsgCisgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKCJkZW55IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBY3Rpb25FcnJvcigiZXJyb3IuZGVueUhvc3QiKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGJvb2xlYW4gYWxsb3dNYXRjaCA9IHRydWU7CisgICAgICAgIAorICAgICAgICBpZiAoKGFsbG93cyAhPSBudWxsKSAmJiAoYWxsb3dzLmxlbmd0aCA+IDApKSB7CisgICAgICAgICAgICBhbGxvd01hdGNoID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWxsb3dzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoYWxsb3dzW2ldLm1hdGNoZXIoaG9zdCkubWF0Y2hlcygpKSB7CisgICAgICAgICAgICAgICAgYWxsb3dNYXRjaCA9IHRydWU7ICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoIWFsbG93TWF0Y2gpIHsKKyAgICAgICAgICAgIGVycm9ycy5hZGQoImFsbG93IiwgbmV3IEFjdGlvbkVycm9yKCJlcnJvci5hbGxvd0hvc3QiKSk7CisgICAgICAgIH0gICAgICAgIAorICAgICAgICAKKyAgICAgICAgcmV0dXJuIGVycm9yczsKKyAgICB9CisgICAgCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vdmFsdmUvUmVxdWVzdER1bXBlclZhbHZlRm9ybS5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3ZhbHZlL1JlcXVlc3REdW1wZXJWYWx2ZUZvcm0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzhiMmFjCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3ZhbHZlL1JlcXVlc3REdW1wZXJWYWx2ZUZvcm0uamF2YQpAQCAtMCwwICsxLDk2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDEsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4udmFsdmU7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25FcnJvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRXJyb3JzOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEZvcm0gYmVhbiBmb3IgdGhlIFJlcXVlc3QgRHVtcGVyIHZhbHZlIHBhZ2UuCisgKgorICogQGF1dGhvciBNYW52ZWVuIEthdXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIFJlcXVlc3REdW1wZXJWYWx2ZUZvcm0gZXh0ZW5kcyBWYWx2ZUZvcm0geworICAgICAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydGllcworICAgIAorICAgICAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXNldCBhbGwgcHJvcGVydGllcyB0byB0aGVpciBkZWZhdWx0IHZhbHVlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBtYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVzZXQoQWN0aW9uTWFwcGluZyBtYXBwaW5nLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworICAgIAorICAgICAgICBzdXBlci5yZXNldChtYXBwaW5nLCByZXF1ZXN0KTsKKyAgICB9CisgICAgCisgICAgCisgICAgLyoqCisgICAgICogUmVuZGVyIHRoaXMgb2JqZWN0IGFzIGEgU3RyaW5nLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiUmVxdWVzdER1bXBlclZhbHZlRm9ybVthZG1pbkFjdGlvbj0iKTsKKyAgICAgICAgc2IuYXBwZW5kKGdldEFkbWluQWN0aW9uKCkpOworICAgICAgICBzYi5hcHBlbmQoIicsdmFsdmVUeXBlPSIpOworICAgICAgICBzYi5hcHBlbmQoZ2V0VmFsdmVUeXBlKCkpOworICAgICAgICBzYi5hcHBlbmQoIicsb2JqZWN0TmFtZT0nIik7CisgICAgICAgIHNiLmFwcGVuZChnZXRPYmplY3ROYW1lKCkpOworICAgICAgICBzYi5hcHBlbmQoIl0iKTsKKyAgICAgICAgcmV0dXJuIChzYi50b1N0cmluZygpKTsKKworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBWYWxpZGF0ZSB0aGUgcHJvcGVydGllcyB0aGF0IGhhdmUgYmVlbiBzZXQgZnJvbSB0aGlzIEhUVFAgcmVxdWVzdCwKKyAgICAgKiBhbmQgcmV0dXJuIGFuIDxjb2RlPkFjdGlvbkVycm9yczwvY29kZT4gb2JqZWN0IHRoYXQgZW5jYXBzdWxhdGVzIGFueQorICAgICAqIHZhbGlkYXRpb24gZXJyb3JzIHRoYXQgaGF2ZSBiZWVuIGZvdW5kLiAgSWYgbm8gZXJyb3JzIGFyZSBmb3VuZCwgcmV0dXJuCisgICAgICogPGNvZGU+bnVsbDwvY29kZT4gb3IgYW4gPGNvZGU+QWN0aW9uRXJyb3JzPC9jb2RlPiBvYmplY3Qgd2l0aCBubworICAgICAqIHJlY29yZGVkIGVycm9yIG1lc3NhZ2VzLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIG1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgQWN0aW9uRXJyb3JzIHZhbGlkYXRlKEFjdGlvbk1hcHBpbmcgbWFwcGluZywKKyAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICAKKyAgICAgICAgQWN0aW9uRXJyb3JzIGVycm9ycyA9IG5ldyBBY3Rpb25FcnJvcnMoKTsKKyAgICAgICAgCisgICAgICAgIFN0cmluZyBzdWJtaXQgPSByZXF1ZXN0LmdldFBhcmFtZXRlcigic3VibWl0Iik7CisgICAgICAgIAorICAgICAgICAvLyBmcm9udCBlbmQgdmFsaWRhdGlvbiB3aGVuIHNhdmUgaXMgY2xpY2tlZC4gICAgICAgIAorICAgICAgICAgaWYgKHN1Ym1pdCAhPSBudWxsKSB7CisgICAgICAgICAvLyBubyB2YWxpZGF0aW9uIG5lZWRlZAorICAgICAgICB9CisgICAgICAgICAgICAgICAgIAorICAgICAgICByZXR1cm4gZXJyb3JzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi92YWx2ZS9TYXZlQWNjZXNzTG9nVmFsdmVBY3Rpb24uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi92YWx2ZS9TYXZlQWNjZXNzTG9nVmFsdmVBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjVjMmRhCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3ZhbHZlL1NhdmVBY2Nlc3NMb2dWYWx2ZUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTUzIEBACisvKgorICogQ29weXJpZ2h0IDIwMDEtMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi52YWx2ZTsKKworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LkF0dHJpYnV0ZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXJGYWN0b3J5OworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuUXVlcnlFeHA7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5RdWVyeTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5KTUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRXJyb3I7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkVycm9yczsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9ybTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9yd2FyZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy51dGlsLk1lc3NhZ2VSZXNvdXJjZXM7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uQXBwbGljYXRpb25TZXJ2bGV0OworCisvKioKKyAqIFRoZSA8Y29kZT5BY3Rpb248L2NvZGU+IHRoYXQgY29tcGxldGVzIDxlbT5BZGQgVmFsdmU8L2VtPiBhbmQKKyAqIDxlbT5FZGl0IFZhbHZlPC9lbT4gdHJhbnNhY3Rpb25zIGZvciBBY2Nlc3NMb2cgdmFsdmUuCisgKgorICogQGF1dGhvciBNYW52ZWVuIEthdXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIFNhdmVBY2Nlc3NMb2dWYWx2ZUFjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisgICAgLyoqCisgICAgICogVGhlIE1CZWFuU2VydmVyIHdlIHdpbGwgYmUgaW50ZXJhY3Rpbmcgd2l0aC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1CZWFuU2VydmVyIG1CU2VydmVyID0gbnVsbDsKKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBzcGVjaWZpZWQgSFRUUCByZXF1ZXN0LCBhbmQgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIEhUVFAKKyAgICAgKiByZXNwb25zZSAob3IgZm9yd2FyZCB0byBhbm90aGVyIHdlYiBjb21wb25lbnQgdGhhdCB3aWxsIGNyZWF0ZSBpdCkuCisgICAgICogUmV0dXJuIGFuIDxjb2RlPkFjdGlvbkZvcndhcmQ8L2NvZGU+IGluc3RhbmNlIGRlc2NyaWJpbmcgd2hlcmUgYW5kIGhvdworICAgICAqIGNvbnRyb2wgc2hvdWxkIGJlIGZvcndhcmRlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHJlc3BvbnNlIGhhcworICAgICAqIGFscmVhZHkgYmVlbiBjb21wbGV0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgQWN0aW9uTWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIGFjdGlvbkZvcm0gVGhlIG9wdGlvbmFsIEFjdGlvbkZvcm0gYmVhbiBmb3IgdGhpcyByZXF1ZXN0IChpZiBhbnkpCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIEhUVFAgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgSFRUUCByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXhjZXB0aW9uIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBBY3Rpb25Gb3J3YXJkIHBlcmZvcm0oQWN0aW9uTWFwcGluZyBtYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uRm9ybSBmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworICAgICAgICAKKyAgICAgICAgLy8gQWNxdWlyZSB0aGUgcmVzb3VyY2VzIHRoYXQgd2UgbmVlZAorICAgICAgICBIdHRwU2Vzc2lvbiBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uKCk7CisgICAgICAgIExvY2FsZSBsb2NhbGUgPSBnZXRMb2NhbGUocmVxdWVzdCk7CisgICAgICAgIE1lc3NhZ2VSZXNvdXJjZXMgcmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VzKHJlcXVlc3QpOworICAgICAgICAKKyAgICAgICAgLy8gQWNxdWlyZSBhIHJlZmVyZW5jZSB0byB0aGUgTUJlYW5TZXJ2ZXIgY29udGFpbmluZyBvdXIgTUJlYW5zCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtQlNlcnZlciA9ICgoQXBwbGljYXRpb25TZXJ2bGV0KSBnZXRTZXJ2bGV0KCkpLmdldFNlcnZlcigpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24KKyAgICAgICAgICAgICgiQ2Fubm90IGFjcXVpcmUgTUJlYW5TZXJ2ZXIgcmVmZXJlbmNlIiwgdCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIElkZW50aWZ5IHRoZSByZXF1ZXN0ZWQgYWN0aW9uCisgICAgICAgIEFjY2Vzc0xvZ1ZhbHZlRm9ybSB2Zm9ybSA9IChBY2Nlc3NMb2dWYWx2ZUZvcm0pIGZvcm07CisgICAgICAgIFN0cmluZyBhZG1pbkFjdGlvbiA9IHZmb3JtLmdldEFkbWluQWN0aW9uKCk7CisgICAgICAgIFN0cmluZyB2T2JqZWN0TmFtZSA9IHZmb3JtLmdldE9iamVjdE5hbWUoKTsKKyAgICAgICAgU3RyaW5nIHBhcmVudCA9IHZmb3JtLmdldFBhcmVudE9iamVjdE5hbWUoKTsKKyAgICAgICAgU3RyaW5nIHZhbHZlVHlwZSA9IHZmb3JtLmdldFZhbHZlVHlwZSgpOworICAgICAgICAKKyAgICAgICAgLy8gUGVyZm9ybSBhICJDcmVhdGUgVmFsdmUiIHRyYW5zYWN0aW9uIChpZiByZXF1ZXN0ZWQpCisgICAgICAgIGlmICgiQ3JlYXRlIi5lcXVhbHMoYWRtaW5BY3Rpb24pKSB7CisgICAgICAgIAorICAgICAgICAgICAgdk9iamVjdE5hbWUgPSBWYWx2ZVV0aWwuY3JlYXRlVmFsdmUocGFyZW50LCB2YWx2ZVR5cGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZSwgcmVxdWVzdCwgbWFwcGluZywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBcHBsaWNhdGlvblNlcnZsZXQpIGdldFNlcnZsZXQoKSk7CisgICAgICAgICAgIAorICAgICAgICB9CisKKyAgICAgICAgLy8gUGVyZm9ybSBhdHRyaWJ1dGUgdXBkYXRlcyBhcyByZXF1ZXN0ZWQKKyAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgIAorICAgICAgICAgICAgT2JqZWN0TmFtZSB2b25hbWUgPSBuZXcgT2JqZWN0TmFtZSh2T2JqZWN0TmFtZSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJkaXJlY3RvcnkiOworICAgICAgICAgICAgbUJTZXJ2ZXIuc2V0QXR0cmlidXRlKHZvbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKCJkaXJlY3RvcnkiLCB2Zm9ybS5nZXREaXJlY3RvcnkoKSkpOworICAgICAgICAgICAgYXR0cmlidXRlID0gInBhdHRlcm4iOworICAgICAgICAgICAgbUJTZXJ2ZXIuc2V0QXR0cmlidXRlKHZvbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoInBhdHRlcm4iLCB2Zm9ybS5nZXRQYXR0ZXJuKCkpKTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJwcmVmaXgiOworICAgICAgICAgICAgbUJTZXJ2ZXIuc2V0QXR0cmlidXRlKHZvbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoInByZWZpeCIsIHZmb3JtLmdldFByZWZpeCgpKSk7CisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAic3VmZml4IjsKKyAgICAgICAgICAgIG1CU2VydmVyLnNldEF0dHJpYnV0ZSh2b25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKCJzdWZmaXgiLCB2Zm9ybS5nZXRTdWZmaXgoKSkpOworICAgICAgICAgICAgYXR0cmlidXRlID0gInJlc29sdmVIb3N0cyI7CisgICAgICAgICAgICBtQlNlcnZlci5zZXRBdHRyaWJ1dGUodm9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZSgicmVzb2x2ZUhvc3RzIiwgbmV3IEJvb2xlYW4odmZvcm0uZ2V0UmVzb2x2ZUhvc3RzKCkpKSk7CisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAicm90YXRhYmxlIjsKKyAgICAgICAgICAgIG1CU2VydmVyLnNldEF0dHJpYnV0ZSh2b25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKCJyb3RhdGFibGUiLCBuZXcgQm9vbGVhbih2Zm9ybS5nZXRSb3RhdGFibGUoKSkpKTsKKworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCisgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nCisgICAgICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmF0dHJpYnV0ZS5zZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUpLCBlKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuYXR0cmlidXRlLnNldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSkpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgfQorICAgIAorICAgICAgICAvLyBGb3J3YXJkIHRvIHRoZSBzdWNjZXNzIHJlcG9ydGluZyBwYWdlCisgICAgICAgIHNlc3Npb24ucmVtb3ZlQXR0cmlidXRlKG1hcHBpbmcuZ2V0QXR0cmlidXRlKCkpOworICAgICAgICByZXR1cm4gKG1hcHBpbmcuZmluZEZvcndhcmQoIlNhdmUgU3VjY2Vzc2Z1bCIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vdmFsdmUvU2F2ZVJlbW90ZUFkZHJWYWx2ZUFjdGlvbi5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3ZhbHZlL1NhdmVSZW1vdGVBZGRyVmFsdmVBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTMzNjAyCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3ZhbHZlL1NhdmVSZW1vdGVBZGRyVmFsdmVBY3Rpb24uamF2YQpAQCAtMCwwICsxLDE0MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAxLTIwMDIsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4udmFsdmU7CisKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5BdHRyaWJ1dGU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyRmFjdG9yeTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LlF1ZXJ5RXhwOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuUXVlcnk7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuSk1FeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkVycm9yOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25FcnJvcnM7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcndhcmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMudXRpbC5NZXNzYWdlUmVzb3VyY2VzOworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkFwcGxpY2F0aW9uU2VydmxldDsKKworLyoqCisgKiBUaGUgPGNvZGU+QWN0aW9uPC9jb2RlPiB0aGF0IGNvbXBsZXRlcyA8ZW0+QWRkIFZhbHZlPC9lbT4gYW5kCisgKiA8ZW0+RWRpdCBWYWx2ZTwvZW0+IHRyYW5zYWN0aW9ucyBmb3IgUmVtb3RlIEFkZHIgdmFsdmUuCisgKgorICogQGF1dGhvciBNYW52ZWVuIEthdXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIFNhdmVSZW1vdGVBZGRyVmFsdmVBY3Rpb24gZXh0ZW5kcyBBY3Rpb24geworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworICAgIC8qKgorICAgICAqIFRoZSBNQmVhblNlcnZlciB3ZSB3aWxsIGJlIGludGVyYWN0aW5nIHdpdGguCisgICAgICovCisgICAgcHJpdmF0ZSBNQmVhblNlcnZlciBtQlNlcnZlciA9IG51bGw7CisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisgICAgCisgICAgCisgICAgLyoqCisgICAgICogUHJvY2VzcyB0aGUgc3BlY2lmaWVkIEhUVFAgcmVxdWVzdCwgYW5kIGNyZWF0ZSB0aGUgY29ycmVzcG9uZGluZyBIVFRQCisgICAgICogcmVzcG9uc2UgKG9yIGZvcndhcmQgdG8gYW5vdGhlciB3ZWIgY29tcG9uZW50IHRoYXQgd2lsbCBjcmVhdGUgaXQpLgorICAgICAqIFJldHVybiBhbiA8Y29kZT5BY3Rpb25Gb3J3YXJkPC9jb2RlPiBpbnN0YW5jZSBkZXNjcmliaW5nIHdoZXJlIGFuZCBob3cKKyAgICAgKiBjb250cm9sIHNob3VsZCBiZSBmb3J3YXJkZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSByZXNwb25zZSBoYXMKKyAgICAgKiBhbHJlYWR5IGJlZW4gY29tcGxldGVkLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIEFjdGlvbk1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSBhY3Rpb25Gb3JtIFRoZSBvcHRpb25hbCBBY3Rpb25Gb3JtIGJlYW4gZm9yIHRoaXMgcmVxdWVzdCAoaWYgYW55KQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBIVFRQIHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIEhUVFAgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0IGV4Y2VwdGlvbiBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgQWN0aW9uRm9yd2FyZCBwZXJmb3JtKEFjdGlvbk1hcHBpbmcgbWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbkZvcm0gZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKyAgICAgICAgCisgICAgICAgIC8vIEFjcXVpcmUgdGhlIHJlc291cmNlcyB0aGF0IHdlIG5lZWQKKyAgICAgICAgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpOworICAgICAgICBMb2NhbGUgbG9jYWxlID0gZ2V0TG9jYWxlKHJlcXVlc3QpOworICAgICAgICBNZXNzYWdlUmVzb3VyY2VzIHJlc291cmNlcyA9IGdldFJlc291cmNlcyhyZXF1ZXN0KTsKKyAgICAgICAgCisgICAgICAgIC8vIEFjcXVpcmUgYSByZWZlcmVuY2UgdG8gdGhlIE1CZWFuU2VydmVyIGNvbnRhaW5pbmcgb3VyIE1CZWFucworICAgICAgICB0cnkgeworICAgICAgICAgICAgbUJTZXJ2ZXIgPSAoKEFwcGxpY2F0aW9uU2VydmxldCkgZ2V0U2VydmxldCgpKS5nZXRTZXJ2ZXIoKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uCisgICAgICAgICAgICAoIkNhbm5vdCBhY3F1aXJlIE1CZWFuU2VydmVyIHJlZmVyZW5jZSIsIHQpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBJZGVudGlmeSB0aGUgcmVxdWVzdGVkIGFjdGlvbgorICAgICAgICBSZW1vdGVBZGRyVmFsdmVGb3JtIHZmb3JtID0gKFJlbW90ZUFkZHJWYWx2ZUZvcm0pIGZvcm07CisgICAgICAgIFN0cmluZyBhZG1pbkFjdGlvbiA9IHZmb3JtLmdldEFkbWluQWN0aW9uKCk7CisgICAgICAgIFN0cmluZyB2T2JqZWN0TmFtZSA9IHZmb3JtLmdldE9iamVjdE5hbWUoKTsKKyAgICAgICAgU3RyaW5nIHBhcmVudCA9IHZmb3JtLmdldFBhcmVudE9iamVjdE5hbWUoKTsKKyAgICAgICAgU3RyaW5nIHZhbHZlVHlwZSA9IHZmb3JtLmdldFZhbHZlVHlwZSgpOworICAgICAgICAgICAgICAgCisgICAgICAgIC8vIFBlcmZvcm0gYSAiQ3JlYXRlIFZhbHZlIiB0cmFuc2FjdGlvbiAoaWYgcmVxdWVzdGVkKQorICAgICAgICBpZiAoIkNyZWF0ZSIuZXF1YWxzKGFkbWluQWN0aW9uKSkgeworCisgICAgICAgICAgICB2T2JqZWN0TmFtZSA9IFZhbHZlVXRpbC5jcmVhdGVWYWx2ZShwYXJlbnQsIHZhbHZlVHlwZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLCByZXF1ZXN0LCBtYXBwaW5nLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFwcGxpY2F0aW9uU2VydmxldCkgZ2V0U2VydmxldCgpKTsKKyAgICAgICAgICAgCisgICAgICAgIH0KKworICAgICAgICAvLyBQZXJmb3JtIGF0dHJpYnV0ZSB1cGRhdGVzIGFzIHJlcXVlc3RlZAorICAgICAgICBTdHJpbmcgYXR0cmlidXRlID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgCisgICAgICAgICAgICBPYmplY3ROYW1lIHZvbmFtZSA9IG5ldyBPYmplY3ROYW1lKHZPYmplY3ROYW1lKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgYXR0cmlidXRlID0gImFsbG93IjsKKyAgICAgICAgICAgIG1CU2VydmVyLnNldEF0dHJpYnV0ZSh2b25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZSgiYWxsb3ciLCB2Zm9ybS5nZXRBbGxvdygpKSk7CisgICAgICAgICAgICBhdHRyaWJ1dGUgPSAiZGVueSI7CisgICAgICAgICAgICBtQlNlcnZlci5zZXRBdHRyaWJ1dGUodm9uYW1lLAorICAgICAgICAgICAgICAgICAgICBuZXcgQXR0cmlidXRlKCJkZW55IiwgdmZvcm0uZ2V0RGVueSgpKSk7CisKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKworICAgICAgICAgICAgZ2V0U2VydmxldCgpLmxvZworICAgICAgICAgICAgICAgIChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5hdHRyaWJ1dGUuc2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlKSwgZSk7CisgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IsCisgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmF0dHJpYnV0ZS5zZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUpKTsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIH0KKyAgICAKKyAgICAgICAgLy8gRm9yd2FyZCB0byB0aGUgc3VjY2VzcyByZXBvcnRpbmcgcGFnZQorICAgICAgICBzZXNzaW9uLnJlbW92ZUF0dHJpYnV0ZShtYXBwaW5nLmdldEF0dHJpYnV0ZSgpKTsKKyAgICAgICAgcmV0dXJuIChtYXBwaW5nLmZpbmRGb3J3YXJkKCJTYXZlIFN1Y2Nlc3NmdWwiKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3ZhbHZlL1NhdmVSZW1vdGVIb3N0VmFsdmVBY3Rpb24uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi92YWx2ZS9TYXZlUmVtb3RlSG9zdFZhbHZlQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFkZDkxMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi92YWx2ZS9TYXZlUmVtb3RlSG9zdFZhbHZlQWN0aW9uLmphdmEKQEAgLTAsMCArMSwxNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMS0yMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnZhbHZlOworCitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuQXR0cmlidXRlOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlckZhY3Rvcnk7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5RdWVyeUV4cDsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LlF1ZXJ5OworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0SW5zdGFuY2U7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25FcnJvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRXJyb3JzOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3J3YXJkOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLnV0aWwuTWVzc2FnZVJlc291cmNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5BcHBsaWNhdGlvblNlcnZsZXQ7CisKKy8qKgorICogVGhlIDxjb2RlPkFjdGlvbjwvY29kZT4gdGhhdCBjb21wbGV0ZXMgPGVtPkFkZCBWYWx2ZTwvZW0+IGFuZAorICogPGVtPkVkaXQgVmFsdmU8L2VtPiB0cmFuc2FjdGlvbnMgZm9yIFJlbW90ZSBIb3N0IHZhbHZlLgorICoKKyAqIEBhdXRob3IgTWFudmVlbiBLYXVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBTYXZlUmVtb3RlSG9zdFZhbHZlQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKyAgICAvKioKKyAgICAgKiBUaGUgTUJlYW5TZXJ2ZXIgd2Ugd2lsbCBiZSBpbnRlcmFjdGluZyB3aXRoLgorICAgICAqLworICAgIHByaXZhdGUgTUJlYW5TZXJ2ZXIgbUJTZXJ2ZXIgPSBudWxsOworICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIHNwZWNpZmllZCBIVFRQIHJlcXVlc3QsIGFuZCBjcmVhdGUgdGhlIGNvcnJlc3BvbmRpbmcgSFRUUAorICAgICAqIHJlc3BvbnNlIChvciBmb3J3YXJkIHRvIGFub3RoZXIgd2ViIGNvbXBvbmVudCB0aGF0IHdpbGwgY3JlYXRlIGl0KS4KKyAgICAgKiBSZXR1cm4gYW4gPGNvZGU+QWN0aW9uRm9yd2FyZDwvY29kZT4gaW5zdGFuY2UgZGVzY3JpYmluZyB3aGVyZSBhbmQgaG93CisgICAgICogY29udHJvbCBzaG91bGQgYmUgZm9yd2FyZGVkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcmVzcG9uc2UgaGFzCisgICAgICogYWxyZWFkeSBiZWVuIGNvbXBsZXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBBY3Rpb25NYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gYWN0aW9uRm9ybSBUaGUgb3B0aW9uYWwgQWN0aW9uRm9ybSBiZWFuIGZvciB0aGlzIHJlcXVlc3QgKGlmIGFueSkKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgSFRUUCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBIVFRQIHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBleGNlcHRpb24gb2NjdXJzCisgICAgICovCisgICAgcHVibGljIEFjdGlvbkZvcndhcmQgcGVyZm9ybShBY3Rpb25NYXBwaW5nIG1hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb25Gb3JtIGZvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisgICAgICAgIAorICAgICAgICAvLyBBY3F1aXJlIHRoZSByZXNvdXJjZXMgdGhhdCB3ZSBuZWVkCisgICAgICAgIEh0dHBTZXNzaW9uIHNlc3Npb24gPSByZXF1ZXN0LmdldFNlc3Npb24oKTsKKyAgICAgICAgTG9jYWxlIGxvY2FsZSA9IGdldExvY2FsZShyZXF1ZXN0KTsKKyAgICAgICAgTWVzc2FnZVJlc291cmNlcyByZXNvdXJjZXMgPSBnZXRSZXNvdXJjZXMocmVxdWVzdCk7CisgICAgICAgIAorICAgICAgICAvLyBBY3F1aXJlIGEgcmVmZXJlbmNlIHRvIHRoZSBNQmVhblNlcnZlciBjb250YWluaW5nIG91ciBNQmVhbnMKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1CU2VydmVyID0gKChBcHBsaWNhdGlvblNlcnZsZXQpIGdldFNlcnZsZXQoKSkuZ2V0U2VydmVyKCk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbgorICAgICAgICAgICAgKCJDYW5ub3QgYWNxdWlyZSBNQmVhblNlcnZlciByZWZlcmVuY2UiLCB0KTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gSWRlbnRpZnkgdGhlIHJlcXVlc3RlZCBhY3Rpb24KKyAgICAgICAgUmVtb3RlSG9zdFZhbHZlRm9ybSB2Zm9ybSA9IChSZW1vdGVIb3N0VmFsdmVGb3JtKSBmb3JtOworICAgICAgICBTdHJpbmcgYWRtaW5BY3Rpb24gPSB2Zm9ybS5nZXRBZG1pbkFjdGlvbigpOworICAgICAgICBTdHJpbmcgdk9iamVjdE5hbWUgPSB2Zm9ybS5nZXRPYmplY3ROYW1lKCk7CisgICAgICAgIFN0cmluZyBwYXJlbnQgPSB2Zm9ybS5nZXRQYXJlbnRPYmplY3ROYW1lKCk7CisgICAgICAgIFN0cmluZyB2YWx2ZVR5cGUgPSB2Zm9ybS5nZXRWYWx2ZVR5cGUoKTsKKyAgICAgICAgICAgICAgIAorICAgICAgICAvLyBQZXJmb3JtIGEgIkNyZWF0ZSBWYWx2ZSIgdHJhbnNhY3Rpb24gKGlmIHJlcXVlc3RlZCkKKyAgICAgICAgaWYgKCJDcmVhdGUiLmVxdWFscyhhZG1pbkFjdGlvbikpIHsKKworICAgICAgICAgICAgdk9iamVjdE5hbWUgPSBWYWx2ZVV0aWwuY3JlYXRlVmFsdmUocGFyZW50LCB2YWx2ZVR5cGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZSwgcmVxdWVzdCwgbWFwcGluZywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBcHBsaWNhdGlvblNlcnZsZXQpIGdldFNlcnZsZXQoKSk7CisgICAgICAgICAgIAorICAgICAgICB9CisKKyAgICAgICAgLy8gUGVyZm9ybSBhdHRyaWJ1dGUgdXBkYXRlcyBhcyByZXF1ZXN0ZWQKKyAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgIAorICAgICAgICAgICAgT2JqZWN0TmFtZSB2b25hbWUgPSBuZXcgT2JqZWN0TmFtZSh2T2JqZWN0TmFtZSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICJhbGxvdyI7CisgICAgICAgICAgICBtQlNlcnZlci5zZXRBdHRyaWJ1dGUodm9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdHRyaWJ1dGUoImFsbG93IiwgdmZvcm0uZ2V0QWxsb3coKSkpOworICAgICAgICAgICAgYXR0cmlidXRlID0gImRlbnkiOworICAgICAgICAgICAgbUJTZXJ2ZXIuc2V0QXR0cmlidXRlKHZvbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZSgiZGVueSIsIHZmb3JtLmdldERlbnkoKSkpOworCisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisKKyAgICAgICAgICAgIGdldFNlcnZsZXQoKS5sb2cKKyAgICAgICAgICAgICAgICAocmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuYXR0cmlidXRlLnNldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSksIGUpOworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAgICByZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5hdHRyaWJ1dGUuc2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlKSk7CisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICB9CisgICAgCisgICAgICAgIC8vIEZvcndhcmQgdG8gdGhlIHN1Y2Nlc3MgcmVwb3J0aW5nIHBhZ2UKKyAgICAgICAgc2Vzc2lvbi5yZW1vdmVBdHRyaWJ1dGUobWFwcGluZy5nZXRBdHRyaWJ1dGUoKSk7CisgICAgICAgIHJldHVybiAobWFwcGluZy5maW5kRm9yd2FyZCgiU2F2ZSBTdWNjZXNzZnVsIikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi92YWx2ZS9TYXZlUmVxdWVzdER1bXBlclZhbHZlQWN0aW9uLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vdmFsdmUvU2F2ZVJlcXVlc3REdW1wZXJWYWx2ZUFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlZjRjMmEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vdmFsdmUvU2F2ZVJlcXVlc3REdW1wZXJWYWx2ZUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTE5IEBACisvKgorICogQ29weXJpZ2h0IDIwMDEtMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi52YWx2ZTsKKworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LkF0dHJpYnV0ZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXJGYWN0b3J5OworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuUXVlcnlFeHA7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5RdWVyeTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5KTUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRXJyb3I7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkVycm9yczsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9ybTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9yd2FyZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uTWFwcGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy51dGlsLk1lc3NhZ2VSZXNvdXJjZXM7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uQXBwbGljYXRpb25TZXJ2bGV0OworCisvKioKKyAqIFRoZSA8Y29kZT5BY3Rpb248L2NvZGU+IHRoYXQgY29tcGxldGVzIDxlbT5BZGQgVmFsdmU8L2VtPiBhbmQKKyAqIDxlbT5FZGl0IFZhbHZlPC9lbT4gdHJhbnNhY3Rpb25zIGZvciBSZXF1ZXN0IER1bXBlciB2YWx2ZS4KKyAqCisgKiBAYXV0aG9yIE1hbnZlZW4gS2F1cgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgU2F2ZVJlcXVlc3REdW1wZXJWYWx2ZUFjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisgICAgLyoqCisgICAgICogVGhlIE1CZWFuU2VydmVyIHdlIHdpbGwgYmUgaW50ZXJhY3Rpbmcgd2l0aC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1CZWFuU2VydmVyIG1CU2VydmVyID0gbnVsbDsKKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBzcGVjaWZpZWQgSFRUUCByZXF1ZXN0LCBhbmQgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIEhUVFAKKyAgICAgKiByZXNwb25zZSAob3IgZm9yd2FyZCB0byBhbm90aGVyIHdlYiBjb21wb25lbnQgdGhhdCB3aWxsIGNyZWF0ZSBpdCkuCisgICAgICogUmV0dXJuIGFuIDxjb2RlPkFjdGlvbkZvcndhcmQ8L2NvZGU+IGluc3RhbmNlIGRlc2NyaWJpbmcgd2hlcmUgYW5kIGhvdworICAgICAqIGNvbnRyb2wgc2hvdWxkIGJlIGZvcndhcmRlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHJlc3BvbnNlIGhhcworICAgICAqIGFscmVhZHkgYmVlbiBjb21wbGV0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgQWN0aW9uTWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIGFjdGlvbkZvcm0gVGhlIG9wdGlvbmFsIEFjdGlvbkZvcm0gYmVhbiBmb3IgdGhpcyByZXF1ZXN0IChpZiBhbnkpCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIEhUVFAgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgSFRUUCByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXhjZXB0aW9uIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBBY3Rpb25Gb3J3YXJkIHBlcmZvcm0oQWN0aW9uTWFwcGluZyBtYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uRm9ybSBmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworICAgICAgICAKKyAgICAgICAgLy8gQWNxdWlyZSB0aGUgcmVzb3VyY2VzIHRoYXQgd2UgbmVlZAorICAgICAgICBIdHRwU2Vzc2lvbiBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uKCk7CisgICAgICAgIExvY2FsZSBsb2NhbGUgPSBnZXRMb2NhbGUocmVxdWVzdCk7CisgICAgICAgIE1lc3NhZ2VSZXNvdXJjZXMgcmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VzKHJlcXVlc3QpOworICAgICAgICAKKyAgICAgICAgLy8gQWNxdWlyZSBhIHJlZmVyZW5jZSB0byB0aGUgTUJlYW5TZXJ2ZXIgY29udGFpbmluZyBvdXIgTUJlYW5zCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtQlNlcnZlciA9ICgoQXBwbGljYXRpb25TZXJ2bGV0KSBnZXRTZXJ2bGV0KCkpLmdldFNlcnZlcigpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24KKyAgICAgICAgICAgICgiQ2Fubm90IGFjcXVpcmUgTUJlYW5TZXJ2ZXIgcmVmZXJlbmNlIiwgdCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIElkZW50aWZ5IHRoZSByZXF1ZXN0ZWQgYWN0aW9uCisgICAgICAgIFJlcXVlc3REdW1wZXJWYWx2ZUZvcm0gdmZvcm0gPSAoUmVxdWVzdER1bXBlclZhbHZlRm9ybSkgZm9ybTsKKyAgICAgICAgU3RyaW5nIGFkbWluQWN0aW9uID0gdmZvcm0uZ2V0QWRtaW5BY3Rpb24oKTsKKyAgICAgICAgU3RyaW5nIHZPYmplY3ROYW1lID0gdmZvcm0uZ2V0T2JqZWN0TmFtZSgpOworICAgICAgICBTdHJpbmcgcGFyZW50ID0gdmZvcm0uZ2V0UGFyZW50T2JqZWN0TmFtZSgpOworICAgICAgICBTdHJpbmcgdmFsdmVUeXBlID0gdmZvcm0uZ2V0VmFsdmVUeXBlKCk7CisgICAgICAgICAgICAKKyAgICAgICAgLy8gUGVyZm9ybSBhICJDcmVhdGUgVmFsdmUiIHRyYW5zYWN0aW9uIChpZiByZXF1ZXN0ZWQpCisgICAgICAgIGlmICgiQ3JlYXRlIi5lcXVhbHMoYWRtaW5BY3Rpb24pKSB7CisgICAgICAgIAorICAgICAgICAgICAgdk9iamVjdE5hbWUgPSBWYWx2ZVV0aWwuY3JlYXRlVmFsdmUocGFyZW50LCB2YWx2ZVR5cGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZSwgcmVxdWVzdCwgbWFwcGluZywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBcHBsaWNhdGlvblNlcnZsZXQpIGdldFNlcnZsZXQoKSk7CisgICAgICAgICAgIAorICAgICAgICB9CisKKyAgICAgICAgLy8gUGVyZm9ybSBhdHRyaWJ1dGUgdXBkYXRlcyBhcyByZXF1ZXN0ZWQKKyAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZSA9IG51bGw7CisgICAgICAgICAgICAgICAgCisgICAgICAgIC8vIEZvcndhcmQgdG8gdGhlIHN1Y2Nlc3MgcmVwb3J0aW5nIHBhZ2UKKyAgICAgICAgc2Vzc2lvbi5yZW1vdmVBdHRyaWJ1dGUobWFwcGluZy5nZXRBdHRyaWJ1dGUoKSk7CisgICAgICAgIHJldHVybiAobWFwcGluZy5maW5kRm9yd2FyZCgiU2F2ZSBTdWNjZXNzZnVsIikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi92YWx2ZS9TYXZlU2luZ2xlU2lnbk9uVmFsdmVBY3Rpb24uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi92YWx2ZS9TYXZlU2luZ2xlU2lnbk9uVmFsdmVBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGRjZjBlCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3ZhbHZlL1NhdmVTaW5nbGVTaWduT25WYWx2ZUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTQ2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDEtMjAwMiwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi52YWx2ZTsKKworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LkF0dHJpYnV0ZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXJGYWN0b3J5OworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuUXVlcnlFeHA7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5RdWVyeTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdEluc3RhbmNlOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LkpNRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25FcnJvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRXJyb3JzOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3J3YXJkOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLnV0aWwuTWVzc2FnZVJlc291cmNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5BcHBsaWNhdGlvblNlcnZsZXQ7CisKKy8qKgorICogVGhlIDxjb2RlPkFjdGlvbjwvY29kZT4gdGhhdCBjb21wbGV0ZXMgPGVtPkFkZCBWYWx2ZTwvZW0+IGFuZAorICogPGVtPkVkaXQgVmFsdmU8L2VtPiB0cmFuc2FjdGlvbnMgZm9yIFNpbmdsZSBTaWduIE9uIHZhbHZlLgorICoKKyAqIEBhdXRob3IgTWFudmVlbiBLYXVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBTYXZlU2luZ2xlU2lnbk9uVmFsdmVBY3Rpb24gZXh0ZW5kcyBBY3Rpb24geworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworICAgIC8qKgorICAgICAqIFRoZSBNQmVhblNlcnZlciB3ZSB3aWxsIGJlIGludGVyYWN0aW5nIHdpdGguCisgICAgICovCisgICAgcHJpdmF0ZSBNQmVhblNlcnZlciBtQlNlcnZlciA9IG51bGw7CisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisgICAgCisgICAgCisgICAgLyoqCisgICAgICogUHJvY2VzcyB0aGUgc3BlY2lmaWVkIEhUVFAgcmVxdWVzdCwgYW5kIGNyZWF0ZSB0aGUgY29ycmVzcG9uZGluZyBIVFRQCisgICAgICogcmVzcG9uc2UgKG9yIGZvcndhcmQgdG8gYW5vdGhlciB3ZWIgY29tcG9uZW50IHRoYXQgd2lsbCBjcmVhdGUgaXQpLgorICAgICAqIFJldHVybiBhbiA8Y29kZT5BY3Rpb25Gb3J3YXJkPC9jb2RlPiBpbnN0YW5jZSBkZXNjcmliaW5nIHdoZXJlIGFuZCBob3cKKyAgICAgKiBjb250cm9sIHNob3VsZCBiZSBmb3J3YXJkZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSByZXNwb25zZSBoYXMKKyAgICAgKiBhbHJlYWR5IGJlZW4gY29tcGxldGVkLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIEFjdGlvbk1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSBhY3Rpb25Gb3JtIFRoZSBvcHRpb25hbCBBY3Rpb25Gb3JtIGJlYW4gZm9yIHRoaXMgcmVxdWVzdCAoaWYgYW55KQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBIVFRQIHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIEhUVFAgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0IGV4Y2VwdGlvbiBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgQWN0aW9uRm9yd2FyZCBwZXJmb3JtKEFjdGlvbk1hcHBpbmcgbWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbkZvcm0gZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKyAgICAgICAgCisgICAgICAgIC8vIEFjcXVpcmUgdGhlIHJlc291cmNlcyB0aGF0IHdlIG5lZWQKKyAgICAgICAgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpOworICAgICAgICBMb2NhbGUgbG9jYWxlID0gZ2V0TG9jYWxlKHJlcXVlc3QpOworICAgICAgICBNZXNzYWdlUmVzb3VyY2VzIHJlc291cmNlcyA9IGdldFJlc291cmNlcyhyZXF1ZXN0KTsKKyAgICAgICAgCisgICAgICAgIC8vIEFjcXVpcmUgYSByZWZlcmVuY2UgdG8gdGhlIE1CZWFuU2VydmVyIGNvbnRhaW5pbmcgb3VyIE1CZWFucworICAgICAgICB0cnkgeworICAgICAgICAgICAgbUJTZXJ2ZXIgPSAoKEFwcGxpY2F0aW9uU2VydmxldCkgZ2V0U2VydmxldCgpKS5nZXRTZXJ2ZXIoKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uCisgICAgICAgICAgICAoIkNhbm5vdCBhY3F1aXJlIE1CZWFuU2VydmVyIHJlZmVyZW5jZSIsIHQpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBJZGVudGlmeSB0aGUgcmVxdWVzdGVkIGFjdGlvbgorICAgICAgICBTaW5nbGVTaWduT25WYWx2ZUZvcm0gdmZvcm0gPSAoU2luZ2xlU2lnbk9uVmFsdmVGb3JtKSBmb3JtOworICAgICAgICBTdHJpbmcgYWRtaW5BY3Rpb24gPSB2Zm9ybS5nZXRBZG1pbkFjdGlvbigpOworICAgICAgICBTdHJpbmcgdk9iamVjdE5hbWUgPSB2Zm9ybS5nZXRPYmplY3ROYW1lKCk7CisgICAgICAgIFN0cmluZyBwYXJlbnQgPSB2Zm9ybS5nZXRQYXJlbnRPYmplY3ROYW1lKCk7CisgICAgICAgIFN0cmluZyB2YWx2ZVR5cGUgPSB2Zm9ybS5nZXRWYWx2ZVR5cGUoKTsKKyAgICAgICAgICAgICAgIAorICAgICAgICAvLyBQZXJmb3JtIGEgIkNyZWF0ZSBWYWx2ZSIgdHJhbnNhY3Rpb24gKGlmIHJlcXVlc3RlZCkKKyAgICAgICAgaWYgKCJDcmVhdGUiLmVxdWFscyhhZG1pbkFjdGlvbikpIHsKKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAvLyBFbnN1cmUgdGhhdCBvbmx5IG9uZSBzaW5nbGUgc2lnbiBvbiB2YWx2ZSBleGlzdHMKKyAgICAgICAgICAgICAgICBPYmplY3ROYW1lIHBuYW1lID0gbmV3IE9iamVjdE5hbWUocGFyZW50KTsgCisgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSBvbmFtZSA9IAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdE5hbWUocG5hbWUuZ2V0RG9tYWluKCkgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI6dHlwZT1WYWx2ZSxuYW1lPVNpbmdsZVNpZ25PbiIpOyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmIChtQlNlcnZlci5pc1JlZ2lzdGVyZWQob25hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIEFjdGlvbkVycm9ycyBlcnJvcnMgPSBuZXcgQWN0aW9uRXJyb3JzKCk7CisgICAgICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoInNpbmdsZVNpZ25PblZhbHZlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQWN0aW9uRXJyb3IoImVycm9yLnNpbmdsZVNpZ25Pbi5leGlzdHMiKSk7CisgICAgICAgICAgICAgICAgICAgIHNhdmVFcnJvcnMocmVxdWVzdCwgZXJyb3JzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChuZXcgQWN0aW9uRm9yd2FyZChtYXBwaW5nLmdldElucHV0KCkpKTsKKyAgICAgICAgICAgICAgICB9IAorICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBnZXRTZXJ2bGV0KCkubG9nCisgICAgICAgICAgICAgICAgICAgIChyZXNvdXJjZXMuZ2V0TWVzc2FnZShsb2NhbGUsICJ1c2Vycy5lcnJvci5pbnZva2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRtaW5BY3Rpb24pLCBlKTsKKyAgICAgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuaW52b2tlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkbWluQWN0aW9uKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICB2T2JqZWN0TmFtZSA9IFZhbHZlVXRpbC5jcmVhdGVWYWx2ZShwYXJlbnQsIHZhbHZlVHlwZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLCByZXF1ZXN0LCBtYXBwaW5nLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFwcGxpY2F0aW9uU2VydmxldCkgZ2V0U2VydmxldCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgfQorCisgICAgICAgIC8vIFBlcmZvcm0gYXR0cmlidXRlIHVwZGF0ZXMgYXMgcmVxdWVzdGVkCisgICAgICAgIFN0cmluZyBhdHRyaWJ1dGUgPSBudWxsOworICAgIAorICAgICAgICAvLyBGb3J3YXJkIHRvIHRoZSBzdWNjZXNzIHJlcG9ydGluZyBwYWdlCisgICAgICAgIHNlc3Npb24ucmVtb3ZlQXR0cmlidXRlKG1hcHBpbmcuZ2V0QXR0cmlidXRlKCkpOworICAgICAgICByZXR1cm4gKG1hcHBpbmcuZmluZEZvcndhcmQoIlNhdmUgU3VjY2Vzc2Z1bCIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vdmFsdmUvU2luZ2xlU2lnbk9uVmFsdmVGb3JtLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vdmFsdmUvU2luZ2xlU2lnbk9uVmFsdmVGb3JtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY2MDU2NgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi92YWx2ZS9TaW5nbGVTaWduT25WYWx2ZUZvcm0uamF2YQpAQCAtMCwwICsxLDk4IEBACisvKgorICogQ29weXJpZ2h0IDIwMDEsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4udmFsdmU7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25FcnJvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRXJyb3JzOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uQXBwbGljYXRpb25TZXJ2bGV0OworaW1wb3J0IG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkxhYmVsVmFsdWVCZWFuOworCisvKioKKyAqIEZvcm0gYmVhbiBmb3IgdGhlIHNpbmdsZSBzaWduIG9uIHZhbHZlIHBhZ2UuCisgKgorICogQGF1dGhvciBNYW52ZWVuIEthdXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIFNpbmdsZVNpZ25PblZhbHZlRm9ybSBleHRlbmRzIFZhbHZlRm9ybSB7CisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnRpZXMKKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXNldCBhbGwgcHJvcGVydGllcyB0byB0aGVpciBkZWZhdWx0IHZhbHVlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBtYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVzZXQoQWN0aW9uTWFwcGluZyBtYXBwaW5nLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworICAgIAorICAgICAgICBzdXBlci5yZXNldChtYXBwaW5nLCByZXF1ZXN0KTsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJlbmRlciB0aGlzIG9iamVjdCBhcyBhIFN0cmluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIlNpbmdsZVNpZ25PblZhbHZlRm9ybVthZG1pbkFjdGlvbj0iKTsKKyAgICAgICAgc2IuYXBwZW5kKGdldEFkbWluQWN0aW9uKCkpOworICAgICAgICBzYi5hcHBlbmQoIicsdmFsdmVUeXBlPSIpOworICAgICAgICBzYi5hcHBlbmQoZ2V0VmFsdmVUeXBlKCkpOworICAgICAgICBzYi5hcHBlbmQoIicsb2JqZWN0TmFtZT0nIik7CisgICAgICAgIHNiLmFwcGVuZChnZXRPYmplY3ROYW1lKCkpOworICAgICAgICBzYi5hcHBlbmQoIl0iKTsKKyAgICAgICAgcmV0dXJuIChzYi50b1N0cmluZygpKTsKKworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBWYWxpZGF0ZSB0aGUgcHJvcGVydGllcyB0aGF0IGhhdmUgYmVlbiBzZXQgZnJvbSB0aGlzIEhUVFAgcmVxdWVzdCwKKyAgICAgKiBhbmQgcmV0dXJuIGFuIDxjb2RlPkFjdGlvbkVycm9yczwvY29kZT4gb2JqZWN0IHRoYXQgZW5jYXBzdWxhdGVzIGFueQorICAgICAqIHZhbGlkYXRpb24gZXJyb3JzIHRoYXQgaGF2ZSBiZWVuIGZvdW5kLiAgSWYgbm8gZXJyb3JzIGFyZSBmb3VuZCwgcmV0dXJuCisgICAgICogPGNvZGU+bnVsbDwvY29kZT4gb3IgYW4gPGNvZGU+QWN0aW9uRXJyb3JzPC9jb2RlPiBvYmplY3Qgd2l0aCBubworICAgICAqIHJlY29yZGVkIGVycm9yIG1lc3NhZ2VzLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBpbmcgVGhlIG1hcHBpbmcgdXNlZCB0byBzZWxlY3QgdGhpcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgQWN0aW9uRXJyb3JzIHZhbGlkYXRlKEFjdGlvbk1hcHBpbmcgbWFwcGluZywKKyAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICAKKyAgICAgICAgQWN0aW9uRXJyb3JzIGVycm9ycyA9IG5ldyBBY3Rpb25FcnJvcnMoKTsKKyAgICAgICAgCisgICAgICAgIFN0cmluZyBzdWJtaXQgPSByZXF1ZXN0LmdldFBhcmFtZXRlcigic3VibWl0Iik7CisgICAgICAgIAorICAgICAgICAvLyBmcm9udCBlbmQgdmFsaWRhdGlvbiB3aGVuIHNhdmUgaXMgY2xpY2tlZC4gICAgICAgIAorICAgICAgICAgaWYgKHN1Ym1pdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgLy8gbm8gdmFsaWRhdGlvbiBuZWVkZWQKKyAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgCisgICAgICAgIHJldHVybiBlcnJvcnM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3ZhbHZlL1ZhbHZlRm9ybS5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3ZhbHZlL1ZhbHZlRm9ybS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4MTU5MzcKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vdmFsdmUvVmFsdmVGb3JtLmphdmEKQEAgLTAsMCArMSwyMDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi52YWx2ZTsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkVycm9yOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25FcnJvcnM7CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbkZvcm07CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuYWN0aW9uLkFjdGlvbk1hcHBpbmc7CitpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5BcHBsaWNhdGlvblNlcnZsZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uTGFiZWxWYWx1ZUJlYW47CisKKy8qKgorICogRm9ybSBiZWFuIGZvciB0aGUgZ2VuZXJpYyB2YWx2ZSBwYWdlLgorICoKKyAqIEBhdXRob3IgTWFudmVlbiBLYXVyCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBWYWx2ZUZvcm0gZXh0ZW5kcyBBY3Rpb25Gb3JtIHsKKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKyAgICAKKyAgIC8qKgorICAgICAqIFRoZSBhZG1pbmlzdHJhdGl2ZSBhY3Rpb24gcmVwcmVzZW50ZWQgYnkgdGhpcyBmb3JtLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGFkbWluQWN0aW9uID0gIkVkaXQiOworCisgICAgLyoqCisgICAgICogVGhlIG9iamVjdCBuYW1lIG9mIHRoZSB2YWx2ZSB0aGlzIGJlYW4gcmVmZXJzIHRvLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIG9iamVjdE5hbWUgPSBudWxsOworCisgICAgLyoqCisgICAgICogVGhlIHRleHQgZm9yIHRoZSB2YWx2ZSBuYW1lLCB1c2VkIHRvIHJldHJpZXZlCisgICAgICogdGhlIGNvcnJlc3BvbmRpbmcgdmFsdmUgbUJlYW4uCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgdmFsdmVOYW1lID0gbnVsbDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgdGV4dCBmb3IgdGhlIHZhbHZlIHR5cGUuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgdmFsdmVUeXBlID0gbnVsbDsKKyAgICAgICAgCisgICAgLyoqCisgICAgICogVGhlIHRleHQgZm9yIHRoZSBub2RlIGxhYmVsLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIG5vZGVMYWJlbCA9IG51bGw7CisgICAgCisgICAgLyoqCisgICAgICogVGhlIG9iamVjdCBuYW1lIG9mIHRoZSBwYXJlbnQgb2YgdGhpcyB2YWx2ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBwYXJlbnRPYmplY3ROYW1lID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFNldCBvZiB2YWxpZCB2YWx1ZXMgZm9yIHZhbHZlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIExpc3QgdmFsdmVUeXBlVmFscyA9IG51bGw7CisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKyAgICAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGFkbWluaXN0cmF0aXZlIGFjdGlvbiByZXByZXNlbnRlZCBieSB0aGlzIGZvcm0uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRBZG1pbkFjdGlvbigpIHsKKworICAgICAgICByZXR1cm4gdGhpcy5hZG1pbkFjdGlvbjsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYWRtaW5pc3RyYXRpdmUgYWN0aW9uIHJlcHJlc2VudGVkIGJ5IHRoaXMgZm9ybS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBZG1pbkFjdGlvbihTdHJpbmcgYWRtaW5BY3Rpb24pIHsKKworICAgICAgICB0aGlzLmFkbWluQWN0aW9uID0gYWRtaW5BY3Rpb247CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIE9iamVjdCBOYW1lLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0T2JqZWN0TmFtZSgpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLm9iamVjdE5hbWU7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIE9iamVjdCBOYW1lLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE9iamVjdE5hbWUoU3RyaW5nIG9iamVjdE5hbWUpIHsKKyAgICAgICAgCisgICAgICAgIHRoaXMub2JqZWN0TmFtZSA9IG9iamVjdE5hbWU7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHZhbHZlIHR5cGUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRWYWx2ZVR5cGUoKSB7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy52YWx2ZVR5cGU7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHZhbHZlIHR5cGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VmFsdmVUeXBlKFN0cmluZyB2YWx2ZVR5cGUpIHsKKyAgICAgICAgCisgICAgICAgIHRoaXMudmFsdmVUeXBlID0gdmFsdmVUeXBlOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBsYWJlbCBvZiB0aGUgbm9kZSB0aGF0IHdhcyBjbGlja2VkLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Tm9kZUxhYmVsKCkgeworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXMubm9kZUxhYmVsOworICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBub2RlIGxhYmVsLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE5vZGVMYWJlbChTdHJpbmcgbm9kZUxhYmVsKSB7CisgICAgICAgIAorICAgICAgICB0aGlzLm5vZGVMYWJlbCA9IG5vZGVMYWJlbDsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcGFyZW50IG9iamVjdCBuYW1lIG9mIHRoZSB2YWx2ZSB0aGlzIGJlYW4gcmVmZXJzIHRvLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFyZW50T2JqZWN0TmFtZSgpIHsKKworICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnRPYmplY3ROYW1lOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHBhcmVudCBvYmplY3QgbmFtZSBvZiB0aGUgdmFsdmUgdGhpcyBiZWFuIHJlZmVycyB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXJlbnRPYmplY3ROYW1lKFN0cmluZyBwYXJlbnRPYmplY3ROYW1lKSB7CisKKyAgICAgICAgdGhpcy5wYXJlbnRPYmplY3ROYW1lID0gcGFyZW50T2JqZWN0TmFtZTsKKworICAgIH0KKyAgICAKKyAgICAgICAgCisgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHZhbHZlVHlwZVZhbHMuCisgICAgICovCisgICAgcHVibGljIExpc3QgZ2V0VmFsdmVUeXBlVmFscygpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLnZhbHZlVHlwZVZhbHM7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHZhbHZlVHlwZVZhbHMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VmFsdmVUeXBlVmFscyhMaXN0IHZhbHZlVHlwZVZhbHMpIHsKKyAgICAgICAgCisgICAgICAgIHRoaXMudmFsdmVUeXBlVmFscyA9IHZhbHZlVHlwZVZhbHM7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXNldCBhbGwgcHJvcGVydGllcyB0byB0aGVpciBkZWZhdWx0IHZhbHVlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXBwaW5nIFRoZSBtYXBwaW5nIHVzZWQgdG8gc2VsZWN0IHRoaXMgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVzZXQoQWN0aW9uTWFwcGluZyBtYXBwaW5nLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICAKKyAgICAgICAgb2JqZWN0TmFtZSA9IG51bGw7CisgICAgICAgIAorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3ZhbHZlL1ZhbHZlVXRpbC5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3ZhbHZlL1ZhbHZlVXRpbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlN2I0ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYWRtaW4vdmFsdmUvVmFsdmVVdGlsLmphdmEKQEAgLTAsMCArMSwyNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMS0yMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnZhbHZlOworCitpbXBvcnQgamF2YS5uZXQuVVJMRW5jb2RlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm5TeW50YXhFeGNlcHRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5BdHRyaWJ1dGU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyRmFjdG9yeTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LlF1ZXJ5RXhwOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuUXVlcnk7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3RJbnN0YW5jZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5KTUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdHJ1dHMuR2xvYmFsczsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25FcnJvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRXJyb3JzOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3J3YXJkOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLnV0aWwuTWVzc2FnZVJlc291cmNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5BcHBsaWNhdGlvblNlcnZsZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uVG9tY2F0VHJlZUJ1aWxkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uVHJlZUNvbnRyb2w7CitpbXBvcnQgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uVHJlZUNvbnRyb2xOb2RlOworCisvKioKKyAqIEEgdXRpbGl0eSBjbGFzcyB0aGF0IGNvbnRhaW5zIG1ldGhvZHMgY29tbW9uIGFjcm9zcyB2YWx2ZXMuCisgKgorICogQGF1dGhvciBNYW52ZWVuIEthdXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIFZhbHZlVXRpbCB7CisgICAgCisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisgICAgCisgICAgLyoqCisgICAgICogU2lnbmF0dXJlIGZvciB0aGUgPGNvZGU+Y3JlYXRlU3RhbmRhcmRWYWx2ZTwvY29kZT4gb3BlcmF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBjcmVhdGVTdGFuZGFyZFZhbHZlVHlwZXNbXSA9CisgICAgeyAiamF2YS5sYW5nLlN0cmluZyIsICAgICAvLyBwYXJlbnQKKyAgICB9OworICAgIAorICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworICAgIAorICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNyZWF0ZVZhbHZlKFN0cmluZyBwYXJlbnQsIFN0cmluZyB2YWx2ZVR5cGUsCisgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgQWN0aW9uTWFwcGluZyBtYXBwaW5nLCBBcHBsaWNhdGlvblNlcnZsZXQgc2VydmxldCkKKyAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworICAgICAgICAKKyAgICAgICAgTWVzc2FnZVJlc291cmNlcyByZXNvdXJjZXMgPSAoTWVzc2FnZVJlc291cmNlcykKKyAgICAgICAgICAgIHNlcnZsZXQuZ2V0U2VydmxldENvbnRleHQoKS5nZXRBdHRyaWJ1dGUoR2xvYmFscy5NRVNTQUdFU19LRVkpOworICAgICAgICBIdHRwU2Vzc2lvbiBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uKCk7CisgICAgICAgIAorICAgICAgICBNQmVhblNlcnZlciBtQlNlcnZlciA9IG51bGw7CisgICAgICAgIExvY2FsZSBsb2NhbGUgPSAoTG9jYWxlKSBzZXNzaW9uLmdldEF0dHJpYnV0ZShHbG9iYWxzLkxPQ0FMRV9LRVkpOworICAgICAgICAvLyBBY3F1aXJlIGEgcmVmZXJlbmNlIHRvIHRoZSBNQmVhblNlcnZlciBjb250YWluaW5nIG91ciBNQmVhbnMKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1CU2VydmVyID0gc2VydmxldC5nZXRTZXJ2ZXIoKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uCisgICAgICAgICAgICAoIkNhbm5vdCBhY3F1aXJlIE1CZWFuU2VydmVyIHJlZmVyZW5jZSIsIHQpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBTdHJpbmcgb3BlcmF0aW9uID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIHZhbHVlc1tdID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIHZPYmplY3ROYW1lID0gbnVsbDsKKyAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIFN0cmluZyBvYmplY3ROYW1lID0gVmFsdmVVdGlsLmdldE9iamVjdE5hbWUocGFyZW50LAorICAgICAgICAgICAgVG9tY2F0VHJlZUJ1aWxkZXIuVkFMVkVfVFlQRSk7CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIFN0cmluZyBwYXJlbnROb2RlTmFtZSA9IHBhcmVudDsKKyAgICAgICAgICAgIE9iamVjdE5hbWUgcG5hbWUgPSBuZXcgT2JqZWN0TmFtZShwYXJlbnQpOworICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihwbmFtZS5nZXREb21haW4oKSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIEZvciBzZXJ2aWNlLCBjcmVhdGUgdGhlIGNvcnJlc3BvbmRpbmcgRW5naW5lIG1CZWFuCisgICAgICAgICAgICAvLyBQYXJlbnQgaW4gdGhpcyBjYXNlIG5lZWRzIHRvIGJlIHRoZSBjb250YWluZXIgbUJlYW4gZm9yIHRoZSBzZXJ2aWNlCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmICgiU2VydmljZSIuZXF1YWxzSWdub3JlQ2FzZShwbmFtZS5nZXRLZXlQcm9wZXJ0eSgidHlwZSIpKSkgeworICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIjp0eXBlPUVuZ2luZSIpOworICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBzYi50b1N0cmluZygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSByZXNvdXJjZXMuZ2V0TWVzc2FnZSgiZXJyb3IuZW5naW5lTmFtZS5iYWQiLAorICAgICAgICAgICAgICAgIHNiLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHNlcnZsZXQubG9nKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcihIdHRwU2VydmxldFJlc3BvbnNlLlNDX0JBRF9SRVFVRVNULCBtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKG51bGwpOworICAgICAgICAgICAgfSAgICAKKyAgICAgICAgICAgIC8vIEVuc3VyZSB0aGF0IHRoZSByZXF1ZXN0ZWQgdmFsdmUgbmFtZSBpcyB1bmlxdWUKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gVEJEIC0tIGRvIHdlIG5lZWQgdGhpcyBjaGVjaz8KKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICBPYmplY3ROYW1lIG9uYW1lID0KKyAgICAgICAgICAgIG5ldyBPYmplY3ROYW1lKG9iamVjdE5hbWUpOworICAgICAgICAgICAgaWYgKG1CU2VydmVyLmlzUmVnaXN0ZXJlZChvbmFtZSkpIHsKKyAgICAgICAgICAgICAgICBBY3Rpb25FcnJvcnMgZXJyb3JzID0gbmV3IEFjdGlvbkVycm9ycygpOworICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoInZhbHZlTmFtZSIsCisgICAgICAgICAgICAgICAgICAgIG5ldyBBY3Rpb25FcnJvcigiZXJyb3IudmFsdmVOYW1lLmV4aXN0cyIpKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9CisgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgImVycm9yLnZhbHZlTmFtZS5leGlzdHMiLCBzYi50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19CQURfUkVRVUVTVCwgbWVzc2FnZSk7ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHJldHVybiAobmV3IEFjdGlvbkZvcndhcmQobWFwcGluZy5nZXRJbnB1dCgpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqLworICAgICAgICAgICAgCisgICAgICAgICAgICBTdHJpbmcgZG9tYWluID0gcG5hbWUuZ2V0RG9tYWluKCk7CisgICAgICAgICAgICAvLyBMb29rIHVwIG91ciBNQmVhbkZhY3RvcnkgTUJlYW4KKyAgICAgICAgICAgIE9iamVjdE5hbWUgZm5hbWUgPSBUb21jYXRUcmVlQnVpbGRlci5nZXRNQmVhbkZhY3RvcnkoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IFN0YW5kYXJkVmFsdmUgb2JqZWN0CisgICAgICAgICAgICB2YWx1ZXMgPSBuZXcgU3RyaW5nWzFdOyAgICAgICAgICAgIAorICAgICAgICAgICAgdmFsdWVzWzBdID0gcGFyZW50OyAgICAgICAgICAgCisgICAgICAgICAgICAKKyAgICAgICAgICAgIG9wZXJhdGlvbiA9ICJjcmVhdGUiICsgdmFsdmVUeXBlOworICAgICAgICAgICAgaWYgKCJBY2Nlc3NMb2dWYWx2ZSIuZXF1YWxzSWdub3JlQ2FzZSh2YWx2ZVR5cGUpKQorICAgICAgICAgICAgICAgIG9wZXJhdGlvbiA9ICJjcmVhdGVBY2Nlc3NMb2dnZXJWYWx2ZSI7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB2T2JqZWN0TmFtZSA9IChTdHJpbmcpCisgICAgICAgICAgICAgICAgICAgICAgICBtQlNlcnZlci5pbnZva2UoZm5hbWUsIG9wZXJhdGlvbiwgdmFsdWVzLCBjcmVhdGVTdGFuZGFyZFZhbHZlVHlwZXMpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBBZGQgdGhlIG5ldyBWYWx2ZSB0byBvdXIgdHJlZSBjb250cm9sIG5vZGUKKyAgICAgICAgICAgIFRyZWVDb250cm9sIGNvbnRyb2wgPSAoVHJlZUNvbnRyb2wpCisgICAgICAgICAgICBzZXNzaW9uLmdldEF0dHJpYnV0ZSgidHJlZUNvbnRyb2xUZXN0Iik7CisgICAgICAgICAgICBpZiAoY29udHJvbCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgVHJlZUNvbnRyb2xOb2RlIHBhcmVudE5vZGUgPSBjb250cm9sLmZpbmROb2RlKHBhcmVudE5vZGVOYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAocGFyZW50Tm9kZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBub2RlTGFiZWwgPQorICAgICAgICAgICAgICAgICAgICAiVmFsdmUgZm9yICIgKyBwYXJlbnROb2RlLmdldExhYmVsKCk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBlbmNvZGVkTmFtZSA9CisgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHZPYmplY3ROYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgVHJlZUNvbnRyb2xOb2RlIGNoaWxkTm9kZSA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBUcmVlQ29udHJvbE5vZGUodk9iamVjdE5hbWUsCisgICAgICAgICAgICAgICAgICAgICJWYWx2ZS5naWYiLAorICAgICAgICAgICAgICAgICAgICBub2RlTGFiZWwsCisgICAgICAgICAgICAgICAgICAgICJFZGl0VmFsdmUuZG8/c2VsZWN0PSIgKyBlbmNvZGVkTmFtZSArCisgICAgICAgICAgICAgICAgICAgICImbm9kZUxhYmVsPSIgKyBVUkxFbmNvZGVyLmVuY29kZShub2RlTGFiZWwpICsKKyAgICAgICAgICAgICAgICAgICAgIiZwYXJlbnQ9IiArIFVSTEVuY29kZXIuZW5jb2RlKHBhcmVudE5vZGVOYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgImNvbnRlbnQiLAorICAgICAgICAgICAgICAgICAgICB0cnVlLCBkb21haW4pOworICAgICAgICAgICAgICAgICAgICBwYXJlbnROb2RlLmFkZENoaWxkKGNoaWxkTm9kZSk7CisgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIC0gZm9yY2UgYSByZWRpc3BsYXkKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzZXJ2bGV0LmxvZworICAgICAgICAgICAgICAgICAgICAoIkNhbm5vdCBmaW5kIHBhcmVudCBub2RlICciICsgcGFyZW50Tm9kZU5hbWUgKyAiJyIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2VydmxldC5sb2cKKyAgICAgICAgICAgICAgICAoIkNhbm5vdCBmaW5kIFRyZWVDb250cm9sTm9kZSEiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgCisgICAgICAgICAgICBzZXJ2bGV0LmxvZworICAgICAgICAgICAgKHJlc291cmNlcy5nZXRNZXNzYWdlKGxvY2FsZSwgInVzZXJzLmVycm9yLmludm9rZSIsCisgICAgICAgICAgICBvcGVyYXRpb24pLCBlKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcgorICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgcmVzb3VyY2VzLmdldE1lc3NhZ2UobG9jYWxlLCAidXNlcnMuZXJyb3IuaW52b2tlIiwKKyAgICAgICAgICAgIG9wZXJhdGlvbikpOworICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgICAgIAorICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBGb3J3YXJkIHRvIHRoZSBzdWNjZXNzIHJlcG9ydGluZyBwYWdlCisgICAgICAgIHNlc3Npb24ucmVtb3ZlQXR0cmlidXRlKG1hcHBpbmcuZ2V0QXR0cmlidXRlKCkpOworICAgICAgICByZXR1cm4gdk9iamVjdE5hbWU7CisgICAgfQorCisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIGFuIGFycmF5IG9mIHJlZ3VsYXIgZXhwcmVzc2lvbiBvYmplY3RzIGluaXRpYWxpemVkIGZyb20gdGhlCisgICAgICogc3BlY2lmaWVkIGFyZ3VtZW50LCB3aGljaCBtdXN0IGJlIDxjb2RlPm51bGw8L2NvZGU+IG9yIGEgY29tbWEtZGVsaW1pdGVkCisgICAgICogbGlzdCBvZiByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdCBUaGUgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIG9uZSBvZiB0aGUgcGF0dGVybnMgaGFzCisgICAgICogIGludmFsaWQgc3ludGF4CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBQYXR0ZXJuW10gcHJlY2FsY3VsYXRlKFN0cmluZyBsaXN0KSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworCisgICAgICAgIGlmIChsaXN0ID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKG5ldyBQYXR0ZXJuWzBdKTsKKyAgICAgICAgbGlzdCA9IGxpc3QudHJpbSgpOworICAgICAgICBpZiAobGlzdC5sZW5ndGgoKSA8IDEpCisgICAgICAgICAgICByZXR1cm4gKG5ldyBQYXR0ZXJuWzBdKTsKKyAgICAgICAgbGlzdCArPSAiLCI7CisKKyAgICAgICAgQXJyYXlMaXN0IHJlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgd2hpbGUgKGxpc3QubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICBpbnQgY29tbWEgPSBsaXN0LmluZGV4T2YoJywnKTsKKyAgICAgICAgICAgIGlmIChjb21tYSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBTdHJpbmcgcGF0dGVybiA9IGxpc3Quc3Vic3RyaW5nKDAsIGNvbW1hKS50cmltKCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJlTGlzdC5hZGQoUGF0dGVybi5jb21waWxlKHBhdHRlcm4pKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFBhdHRlcm5TeW50YXhFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgKCJTeW50YXggZXJyb3IgaW4gcmVxdWVzdCBmaWx0ZXIgcGF0dGVybiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGlzdCA9IGxpc3Quc3Vic3RyaW5nKGNvbW1hICsgMSk7CisgICAgICAgIH0KKworICAgICAgICBQYXR0ZXJuIHJlQXJyYXlbXSA9IG5ldyBQYXR0ZXJuW3JlTGlzdC5zaXplKCldOworICAgICAgICByZXR1cm4gKChQYXR0ZXJuW10pIHJlTGlzdC50b0FycmF5KHJlQXJyYXkpKTsKKworICAgIH0gICAgCisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRPYmplY3ROYW1lKFN0cmluZyBwYXJlbnQsIFN0cmluZyBNQmVhblR5cGUpCisgICAgdGhyb3dzIEV4Y2VwdGlvbnsKKyAgICAgICAgCisgICAgICAgIC8vIEZvcm0gdGhlIHBhdHRlcm4gdGhhdCBnZXRzIHRoZSBsb2dnZXIgZm9yIHRoaXMgcGFydGljdWxhcgorICAgICAgICAvLyBzZXJ2aWNlLCBob3N0IG9yIGNvbnRleHQuCisgICAgICAgIE9iamVjdE5hbWUgcG9uYW1lID0gbmV3IE9iamVjdE5hbWUocGFyZW50KTsKKyAgICAgICAgU3RyaW5nIGRvbWFpbiA9IHBvbmFtZS5nZXREb21haW4oKTsKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihkb21haW4rTUJlYW5UeXBlKTsKKyAgICAgICAgU3RyaW5nIHR5cGUgPSBwb25hbWUuZ2V0S2V5UHJvcGVydHkoInR5cGUiKTsKKyAgICAgICAgU3RyaW5nIGoyZWVUeXBlID0gcG9uYW1lLmdldEtleVByb3BlcnR5KCJqMmVlVHlwZSIpOworICAgICAgICBTdHJpbmcgcGF0aCA9ICIiOworICAgICAgICBTdHJpbmcgaG9zdCA9ICIiOworICAgICAgICBTdHJpbmcgbmFtZSA9IHBvbmFtZS5nZXRLZXlQcm9wZXJ0eSgibmFtZSIpOworICAgICAgICBpZiAoKG5hbWUgIT0gbnVsbCkgJiYgKG5hbWUubGVuZ3RoKCkgPiAwKSkgeworICAgICAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDIpOworICAgICAgICAgICAgaW50IGkgPSBuYW1lLmluZGV4T2YoIi8iKTsKKyAgICAgICAgICAgIGhvc3QgPSBuYW1lLnN1YnN0cmluZygwLGkpOworICAgICAgICAgICAgcGF0aCA9IG5hbWUuc3Vic3RyaW5nKGkpOyAKKyAgICAgICAgfQorICAgICAgICBpZiAoIldlYk1vZHVsZSIuZXF1YWxzSWdub3JlQ2FzZShqMmVlVHlwZSkpIHsgLy8gY29udGFpbmVyIGlzIGNvbnRleHQgICAgICAgICAgICAKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiLHBhdGg9IitwYXRoKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiLGhvc3Q9Iitob3N0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIkhvc3QiLmVxdWFsc0lnbm9yZUNhc2UodHlwZSkpIHsgICAgLy8gY29udGFpbmVyIGlzIGhvc3QKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiLGhvc3Q9Iik7CisgICAgICAgICAgICBzYi5hcHBlbmQocG9uYW1lLmdldEtleVByb3BlcnR5KCJob3N0IikpOworICAgICAgICB9CisgICAgICAgIGlmICgiU2VydmljZSIuZXF1YWxzSWdub3JlQ2FzZSh0eXBlKSkgeyAgLy8gY29udGFpbmVyIGlzIHNlcnZpY2UKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsgIAorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2FkbWluL3ZhbHZlL1ZhbHZlc0Zvcm0uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi92YWx2ZS9WYWx2ZXNGb3JtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBhMjM3YgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9hZG1pbi92YWx2ZS9WYWx2ZXNGb3JtLmphdmEKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAyLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnZhbHZlOworCisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25Gb3JtOworaW1wb3J0IG9yZy5hcGFjaGUuc3RydXRzLmFjdGlvbi5BY3Rpb25NYXBwaW5nOworCisKKy8qKgorICogRm9ybSBiZWFuIGZvciBkZWxldGluZyB2YWx2ZXMuCisgKgorICogQGF1dGhvciBNYW52ZWVuIEthdXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIFZhbHZlc0Zvcm0gZXh0ZW5kcyBBY3Rpb25Gb3JtIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm9wZXJ0aWVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBvYmplY3QgbmFtZXMgb2YgdGhlIHZhbHZlcyB0byBiZSBkZWxldGVkLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHZhbHZlc1tdID0gbmV3IFN0cmluZ1swXTsKKworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWx2ZXMoKSB7CisgICAgICAgIHJldHVybiAodGhpcy52YWx2ZXMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFZhbHZlcyhTdHJpbmcgdmFsdmVzW10pIHsKKyAgICAgICAgdGhpcy52YWx2ZXMgPSB2YWx2ZXM7CisgICAgfQorCisgICAgIC8qIAorICAgICAgKiBUaGUgcGFyZW50IG9iamVjdCBuYW1lIG9mIHRoZSB2YWx2ZSB0byBiZSBkZWxldGVkLiAKKyAgICAgICovCisgICAKKyAgICBwcml2YXRlIFN0cmluZyBwYXJlbnRPYmplY3ROYW1lID0gbnVsbDsKKyAgICAKKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhcmVudE9iamVjdE5hbWUoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5wYXJlbnRPYmplY3ROYW1lKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgc2V0UGFyZW50T2JqZWN0TmFtZShTdHJpbmcgcGFyZW50T2JqZWN0TmFtZSkgeworICAgICAgICB0aGlzLnBhcmVudE9iamVjdE5hbWUgPSBwYXJlbnRPYmplY3ROYW1lOworICAgIH0KKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmVzZXQgYWxsIHByb3BlcnRpZXMgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGluZyBUaGUgbWFwcGluZyB1c2VkIHRvIHNlbGVjdCB0aGlzIGluc3RhbmNlCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlc2V0KEFjdGlvbk1hcHBpbmcgbWFwcGluZywgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKworICAgICAgICB0aGlzLnZhbHZlcyA9IG5ldyBTdHJpbmdbMF07CisgICAgICAgIHRoaXMucGFyZW50T2JqZWN0TmFtZSA9IG51bGw7CisgICAgfQorICAgICAgICAKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jb250cm9scy50bGQgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL2NvbnRyb2xzLnRsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjdkZmFmCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9jb250cm9scy50bGQKQEAgLTAsMCArMSw0MTkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IURPQ1RZUEUgdGFnbGliCisgIFBVQkxJQyAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEpTUCBUYWcgTGlicmFyeSAxLjIvL0VOIgorICAgICAgICAgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL3dlYi1qc3B0YWdsaWJyYXJ5XzFfMi5kdGQiPgorCis8dGFnbGliPgorCisgIDx0bGliLXZlcnNpb24+MS4wPC90bGliLXZlcnNpb24+CisgIDxqc3AtdmVyc2lvbj4xLjI8L2pzcC12ZXJzaW9uPgorICA8c2hvcnQtbmFtZT5jb250cm9sczwvc2hvcnQtbmFtZT4KKyAgPGRlc2NyaXB0aW9uPgorICAgIEpTUCB0YWcgbGlicmFyeSBjb250YWluaW5nIGN1c3RvbSBHVUkgY29udHJvbHMgdXNlZCBpbiB0aGUKKyAgICBUb21jYXQgQWRtaW5pc3RyYXRpdmUgQXBwbGljYXRpb24uCisgIDwvZGVzY3JpcHRpb24+CisKKyAgPCEtLSA9PT09PT09PT09IEluc3RhbnQgVGFibGUgVGFnID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKyAgPHRhZz4KKworICAgIDxuYW1lPnRhYmxlPC9uYW1lPgorICAgIDx0YWctY2xhc3M+b3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uVGFibGVUYWc8L3RhZy1jbGFzcz4KKyAgICA8Ym9keS1jb250ZW50PkpTUDwvYm9keS1jb250ZW50PgorICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgIFJlbmRlciBhICJ0YWJsZSIgb2JqZWN0LCB3aGljaCBpcyByZW5kZXJlZCBhcyBhbiBIVE1MCisgICAgICAidGFibGUiIGVsZW1lbnQuIAorICAgICAgCisgICAgICBOT1RFOiAgVGhlIG9ubHkgdmFsaWQgbmVzdGVkIGNvbnRlbnQgZm9yIHRoaXMgdGFnIGlzCisgICAgICAicm93IiB0YWdzIGZyb20gdGhpcyBsaWJyYXJ5LiAgQW55dGhpbmcgZWxzZSB3aWxsIGNhdXNlCisgICAgICB0aGUgcmVuZGVyZWQgSFRNTCB0byBiZSBpbnZhbGlkLgorCisgICAgICBOT1RFOiAgVG8gYmUgdXNhYmxlLCB0aGlzIHRhZyBtdXN0IGJlIG5lc3RlZCBpbnNpZGUgYW4KKyAgICAgIEhUTUwgJmx0O2Zvcm0mZ3Q7IGVsZW1lbnQuCisgICAgPC9kZXNjcmlwdGlvbj4KKworICAgIDxhdHRyaWJ1dGU+CisgICAgICA8bmFtZT5jb2x1bW5zPC9uYW1lPgorICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KKyAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KKyAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgKEludGVnZXIpIG51bWJlciBvZiBjb2x1bW5zIHRoYXQgdGhlIHRhYmxlIGNvbnRhaW5zLiAgSWYKKyAgICAgICAgbm90IHNwZWNpZmllZCwgb25seSB0d28gY29sdW1ucyB3aWxsIGJlIHZpc2libGUuCisgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgIDwvYXR0cmlidXRlPgorCisgICAgPGF0dHJpYnV0ZT4KKyAgICAgIDxuYW1lPnRhYmxlU3R5bGU8L25hbWU+CisgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgorICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgorICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICBUaGUgQ1NTIHN0eWxlIGNsYXNzIHRvIGJlIGFwcGxpZWQgdG8gdGhlIGVudGlyZSByZW5kZXJlZCBvdXRwdXQKKyAgICAgICAgb2YgdGhlIGluc3RhbnQgdGFibGUuICBJZiBub3Qgc3BlY2lmaWVkLCBubyBvdmVyYWxsCisgICAgICAgIHN0eWxlIGNsYXNzIGlzIGFwcGxpZWQuCisgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgIDwvYXR0cmlidXRlPgorIAorICAgIDxhdHRyaWJ1dGU+CisgICAgICA8bmFtZT5saW5lU3R5bGU8L25hbWU+CisgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgorICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgorICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICBUaGUgQ1NTIHN0eWxlIGZvciB0aGUgbGluZXMgYmV0d2VlbiByb3dzLgorICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICA8L2F0dHJpYnV0ZT4KKworICA8L3RhZz4KKworICAgIDx0YWc+CisKKyAgICA8bmFtZT5yb3c8L25hbWU+CisgICAgPHRhZy1jbGFzcz5vcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5Sb3dUYWc8L3RhZy1jbGFzcz4KKyAgICA8Ym9keS1jb250ZW50PkpTUDwvYm9keS1jb250ZW50PgorICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgIERlZmluZSBhIHNpbmdsZSAiaW5zdGFudCB0YWJsZSByb3ciIG9wdGlvbiBmb3IgdGhlIHN1cnJvdW5kaW5nICJ0YWJsZSIKKyAgICAgIHRhZy4gIEl0IGlzIG5vdCB2YWxpZCB0byB1c2UgdGhpcyB0YWcgKmV4Y2VwdCogd2hlbiBuZXN0ZWQgaW5zaWRlIGFuCisgICAgICAidGFibGUiIHRhZy4KKworICAgICAgTk9URTogVGhpcyB0YWcgY2FuIG5lc3Qgb25seSAibGFiZWwiIGFuZCAiZGF0YSIgdGFncy4KKyAgICA8L2Rlc2NyaXB0aW9uPgorCisgICAgPGF0dHJpYnV0ZT4KKyAgICAgIDxuYW1lPmhlYWRlcjwvbmFtZT4KKyAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+CisgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+CisgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgIChCb29sZWFuKSB2YXJpYWJsZSBzZXQgdG8gInRydWUiIG9yICJ5ZXMiIGlmIHRoaXMgcm93IGlzCisgICAgICAgIHRoZSBoZWFkZXIgcm93LgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgIDwvYXR0cmlidXRlPgorICAgIAorICAgICA8YXR0cmlidXRlPgorICAgICAgPG5hbWU+bGFiZWxTdHlsZTwvbmFtZT4KKyAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+CisgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+CisgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgIFRoZSBzdHlsZSBmb3IgdGhlIGxhYmVsIHRhYmxlIGRhdGEgZWxlbWVudC4KKyAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgPC9hdHRyaWJ1dGU+CisgICAgCisgICAgIDxhdHRyaWJ1dGU+CisgICAgICA8bmFtZT5kYXRhU3R5bGU8L25hbWU+CisgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgorICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgorICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICBUaGUgc3R5bGUgZm9yIHRoZSB2YWx1ZSBvZiB0aGUgdGFibGUgZGF0YSBlbGVtZW50LgorICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICA8L2F0dHJpYnV0ZT4gICAgCisgICAgCisgICAgIDxhdHRyaWJ1dGU+CisgICAgICA8bmFtZT5zdHlsZUlkPC9uYW1lPgorICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KKyAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KKyAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgVGhlIHN0eWxlSWQgZm9yIHRoZSBsYWJlbCB0YWJsZSBkYXRhIGVsZW1lbnQuCisgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgIDwvYXR0cmlidXRlPgorICAgICAgICAKKyAgPC90YWc+CisKKyA8dGFnPgorCisgICAgPG5hbWU+bGFiZWw8L25hbWU+CisgICAgPHRhZy1jbGFzcz5vcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5MYWJlbFRhZzwvdGFnLWNsYXNzPgorICAgIDxib2R5LWNvbnRlbnQ+SlNQPC9ib2R5LWNvbnRlbnQ+CisgICAgPGRlc2NyaXB0aW9uPgorICAgICAgUmVuZGVyIGEgImxhYmVsIiBvYmplY3QsIHdoaWNoIGlzIHJlbmRlcmVkIGFzIGEgbGFiZWwgaW4gdGhlIHJvdyBvZgorICAgICAgYW4gSFRNTCAidGFibGUiIGVsZW1lbnQuIAorCisgICAgICBOT1RFOiAgVG8gYmUgdXNhYmxlLCB0aGlzIHRhZyBtdXN0IGJlIG5lc3RlZCBpbnNpZGUgYSAicm93IiB0YWcuCisgICAgPC9kZXNjcmlwdGlvbj4KKyAgPC90YWc+CisKKyA8dGFnPgorCisgICAgPG5hbWU+ZGF0YTwvbmFtZT4KKyAgICA8dGFnLWNsYXNzPm9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkRhdGFUYWc8L3RhZy1jbGFzcz4KKyAgICA8Ym9keS1jb250ZW50PkpTUDwvYm9keS1jb250ZW50PgorICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgIFJlbmRlciBhICJkYXRhIiBvYmplY3QsIHdoaWNoIGlzIHJlbmRlcmVkIGFzIGEgbGFiZWwgaW4gdGhlIHJvdyBvZgorICAgICAgYW4gSFRNTCAidGFibGUiIGVsZW1lbnQuIAorCisgICAgICBOT1RFOiAgVG8gYmUgdXNhYmxlLCB0aGlzIHRhZyBtdXN0IGJlIG5lc3RlZCBpbnNpZGUgYSAicm93IiB0YWcuCisgICAgPC9kZXNjcmlwdGlvbj4KKyAgPC90YWc+CisKKyAgPCEtLSA9PT09PT09PT09IEluc3RhbnQgQWN0aW9ucyBUYWcgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworICAgPHRhZz4KKworICAgIDxuYW1lPmFjdGlvbnM8L25hbWU+CisgICAgPHRhZy1jbGFzcz5vcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5BY3Rpb25zVGFnPC90YWctY2xhc3M+CisgICAgPGJvZHktY29udGVudD5KU1A8L2JvZHktY29udGVudD4KKyAgICA8ZGVzY3JpcHRpb24+CisgICAgICBSZW5kZXIgYW4gImluc3RhbnQgYWN0aW9ucyIgb2JqZWN0LCB3aGljaCBpcyByZW5kZXJlZCBhcyBhbiBIVE1MCisgICAgICAic2VsZWN0IiBlbGVtZW50LCB3aGVyZSB0aGUgc2VsZWN0aW9uIG9mIGEgcGFydGljdWxhciBlbGVtZW50IGZyb20KKyAgICAgIHRoZSBsaXN0IGltbWVkaWF0ZWx5IGNhdXNlcyBhIEphdmFTY3JpcHQgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQKKyAgICAgICh3aXRoIHRoZSBhdmFpbGFibGUgZWxlbWVudHMgc3BlY2lmaWVkIGJ5ICJhY3Rpb24iIHRhZyBpbnN0YW5jZXMKKyAgICAgIG5lc3RlZCB3aXRoaW4gdGhlIGJvZHkgb2YgdGhlICJhY3Rpb25zIiB0YWcpLgorCisgICAgICBOT1RFOiAgVGhlIG9ubHkgdmFsaWQgbmVzdGVkIGNvbnRlbnQgZm9yIHRoaXMgdGFnIGlzCisgICAgICAiYWN0aW9uIiB0YWdzIGZyb20gdGhpcyBsaWJyYXJ5LiAgQW55dGhpbmcgZWxzZSB3aWxsIGNhdXNlCisgICAgICB0aGUgcmVuZGVyZWQgSFRNTCB0byBiZSBpbnZhbGlkLgorCisgICAgICBOT1RFOiAgVG8gYmUgdXNhYmxlLCB0aGlzIHRhZyBtdXN0IGJlIG5lc3RlZCBpbnNpZGUgYW4KKyAgICAgIEhUTUwgJmx0O2Zvcm0mZ3Q7IGVsZW1lbnQuCisgICAgPC9kZXNjcmlwdGlvbj4KKworICAgIDxhdHRyaWJ1dGU+CisgICAgICA8bmFtZT5zaXplPC9uYW1lPgorICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KKyAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KKyAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgKEludGVnZXIpIG51bWJlciBvZiByb3dzIHRoYXQgd2lsbCBiZSB2aXNpYmxlIHRvIHRoZSB1c2VyLiAgSWYKKyAgICAgICAgbm90IHNwZWNpZmllZCwgb25seSBvbmUgcm93IHdpbGwgYmUgdmlzaWJsZS4KKyAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgPC9hdHRyaWJ1dGU+CisKKyAgICA8YXR0cmlidXRlPgorICAgICAgPG5hbWU+c3R5bGU8L25hbWU+CisgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgorICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgorICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICBUaGUgQ1NTIHN0eWxlIGNsYXNzIHRvIGJlIGFwcGxpZWQgdG8gdGhlIGVudGlyZSByZW5kZXJlZCBvdXRwdXQKKyAgICAgICAgb2YgdGhlIGluc3RhbnQgYWN0aW9ucyBjb250cm9sLiAgSWYgbm90IHNwZWNpZmllZCwgbm8gb3ZlcmFsbAorICAgICAgICBzdHlsZSBjbGFzcyBpcyBhcHBsaWVkLgorICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICA8L2F0dHJpYnV0ZT4KKworICAgIDxhdHRyaWJ1dGU+CisgICAgICA8bmFtZT5sYWJlbDwvbmFtZT4KKyAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+CisgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+CisgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgIEhUTUwgTGFiZWwgdGFnIGdlbmVyYXRpb24uCisgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgIDwvYXR0cmlidXRlPgorICAgIAorICA8L3RhZz4KKworICA8dGFnPgorCisgICAgPG5hbWU+YWN0aW9uPC9uYW1lPgorICAgIDx0YWctY2xhc3M+b3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uQWN0aW9uVGFnPC90YWctY2xhc3M+CisgICAgPGJvZHktY29udGVudD5KU1A8L2JvZHktY29udGVudD4KKyAgICA8ZGVzY3JpcHRpb24+CisgICAgICBEZWZpbmUgYSBzaW5nbGUgImluc3RhbnQgYWN0aW9uIiBvcHRpb24gZm9yIHRoZSBzdXJyb3VuZGluZyAiYWN0aW9ucyIKKyAgICAgIHRhZy4gIEl0IGlzIG5vdCB2YWxpZCB0byB1c2UgdGhpcyB0YWcgKmV4Y2VwdCogd2hlbiBuZXN0ZWQgaW5zaWRlIGFuCisgICAgICAiYWN0aW9ucyIgdGFnLgorCisgICAgICBOT1RFOiAgVGhlIGJvZHkgY29udGVudCBvZiB0aGlzIHRhZyAod2hpY2ggc2hvdWxkIGJlIHN1aXRhYmx5CisgICAgICBsb2NhbGl6ZWQsIGlmIHJlcXVpcmVkIGJ5IHlvdXIgYXBwbGljYXRpb24pIGlzIHVzZWQgYXMgdGhlCisgICAgICB1c2VyLXZpc2libGUgbGFiZWwgZm9yIHRoaXMgYWN0aW9uLgorICAgIDwvZGVzY3JpcHRpb24+CisKKyAgICA8YXR0cmlidXRlPgorICAgICAgPG5hbWU+c2VsZWN0ZWQ8L25hbWU+CisgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgorICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgorICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAoQm9vbGVhbikgdmFyaWFibGUgc2V0IHRvICJ0cnVlIiBvciAieWVzIiBpZiB0aGlzIGFjdGlvbiBzaG91bGQKKyAgICAgICAgYWxyZWFkeSBiZSBzZWxlY3RlZCB3aGVuIHRoZSAiaW5zdGFudCBhY3Rpb25zIiBlbGVtZW50IGlzCisgICAgICAgIGluaXRpYWxseSBkaXNwbGF5ZWQuCisgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgIDwvYXR0cmlidXRlPgorCisgICAgPGF0dHJpYnV0ZT4KKyAgICAgIDxuYW1lPmRpc2FibGVkPC9uYW1lPgorICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KKyAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KKyAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgKEJvb2xlYW4pIHZhcmlhYmxlIHNldCB0byAidHJ1ZSIgb3IgInllcyIgaWYgdGhlIHNlbGVjdGlvbgorICAgICAgICBmb3IgdGhpcyBhY3Rpb24gc2hvdWxkIGJlIGRpc2FibGVkLiAgICAgICAgCisgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgIDwvYXR0cmlidXRlPgorCisgICAgPGF0dHJpYnV0ZT4KKyAgICAgIDxuYW1lPnVybDwvbmFtZT4KKyAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+CisgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+CisgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgIFRoZSBVUkwgdG8gd2hpY2ggdGhlIGN1cnJlbnQgZnJhbWUgb3Igd2luZG93IHdpbGwgYmUgdHJhbnNmZXJyZWQKKyAgICAgICAgaWYgdGhlICJvbmNoYW5nZSIgZXZlbnQgaGFuZGxlciBvZiB0aGlzICJpbnN0YW50IGFjdGlvbnMiIGVsZW1lbnQKKyAgICAgICAgaXMgdHJpZ2dlcmVkLCBhbmQgdGhpcyBpcyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGFjdGlvbi4gIElmIG5vCisgICAgICAgIFVSTCBpcyBzcGVjaWZpZWQsIG5vIGFjdGlvbiB3aWxsIGJlIHRha2VuICh1c2VmdWwgZm9yICIoTm9uZSkiCisgICAgICAgIG9wdGlvbnMgYW5kIGRpdmlkZXJzKS4KKworICAgICAgICBJZiB0aGlzIFVSTCBzdGFydHMgd2l0aCBhIHNsYXNoLCBpdCB3aWxsIGJlIGFzc3VtZWQgdG8gYmUKKyAgICAgICAgY29udGV4dC1yZWxhdGl2ZSwgYW5kIHdpbGwgYmUgcHJlZml4ZWQgd2l0aCB0aGUgY29udGV4dCBwYXRoCisgICAgICAgIG9mIHRoaXMgcmVxdWVzdC4gIE90aGVyd2lzZSwgaXQgd2lsbCBiZSB1c2VkIHVubW9kaWZpZWQuCisKKyAgICAgICAgTk9URTogIFRoaXMgVVJMIHdpbGwgYmUgcGFzc2VkIHRocm91Z2ggVVJMIHJld3JpdGluZyBzbyB0aGF0IGl0CisgICAgICAgIHdpbGwgbWFpbnRhaW4gc2Vzc2lvbiBpZGVudGl0eSBldmVuIGluIGVudmlyb25tZW50cyB3ZXJlIGNvb2tpZXMKKyAgICAgICAgYXJlIG5vdCBiZWluZyB1c2VkLgorICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICA8L2F0dHJpYnV0ZT4KKworICA8L3RhZz4KKworCisgIDwhLS0gPT09PT09PT09PSBUcmVlIENvbnRyb2wgVGFnID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKyAgPHRhZz4KKworICAgIDxuYW1lPnRyZWU8L25hbWU+CisgICAgPHRhZy1jbGFzcz5vcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5UcmVlQ29udHJvbFRhZzwvdGFnLWNsYXNzPgorICAgIDxib2R5LWNvbnRlbnQ+ZW1wdHk8L2JvZHktY29udGVudD4KKyAgICA8ZGVzY3JpcHRpb24+CisgICAgICBSZW5kZXIgYSAidHJlZSIgY29udHJvbCwgYmFzZWQgb24gdGhlIGN1cnJlbnQgc3RhdGUgb2YgYSBkYXRhIG9iamVjdAorICAgICAgb2YgdHlwZSBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5UcmVlQ29udHJvbCwgd2hpY2ggaXMgaWRlbnRpZmllZAorICAgICAgYnkgdGhlIG5hbWUgc3BlY2lmaWVkIGluIHRoZSAidHJlZSIgYXR0cmlidXRlLCBpbiB0aGUgSlNQIHNjb3BlCisgICAgICBzcGVjaWZpZWQgYnkgdGhlICJzY29wZSIgYXR0cmlidXRlLgorICAgIDwvZGVzY3JpcHRpb24+CisKKyAgICA8YXR0cmlidXRlPgorICAgICAgPG5hbWU+YWN0aW9uPC9uYW1lPgorICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KKyAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KKyAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgSHlwZXJsaW5rIHRvIHdoaWNoIGV4cGFuZC9jb250cmFjdCBhY3Rpb25zIHNob3VsZCBiZSBzZW50LAorICAgICAgICB3aXRoIGEgc3RyaW5nICIke25vZGV9IiBtYXJraW5nIHdoZXJlIHRoZSBub2RlIG5hbWUgb2YgdGhlCisgICAgICAgIGFmZmVjdGVkIG5vZGUgc2hvdWxkIGJlIGluY2x1ZGVkICh3aGljaCB3aWxsIHVzdWFsbHkgYmUgYXMKKyAgICAgICAgdGhlIHZhbHVlIG9mIGEgcmVxdWVzdCBwYXJhbWV0ZXIpLgorICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICA8L2F0dHJpYnV0ZT4KKworICAgIDxhdHRyaWJ1dGU+CisgICAgICA8bmFtZT5pbWFnZXM8L25hbWU+CisgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgorICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgorICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICBOYW1lIG9mIGEgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGltYWdlcyBmb3Igb3VyIGljb25zLAorICAgICAgICByZWxhdGl2ZSB0byB0aGUgcGFnZSBpbmNsdWRpbmcgdGhpcyB0YWcuICBJZiBub3Qgc3BlY2lmaWVkLAorICAgICAgICBkZWZhdWx0cyB0byAiaW1hZ2VzIi4KKyAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgPC9hdHRyaWJ1dGU+CisKKyAgICA8YXR0cmlidXRlPgorICAgICAgPG5hbWU+c2NvcGU8L25hbWU+CisgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgorICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgorICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICBUaGUgSlNQIHNjb3BlIHdpdGhpbiB3aGljaCB0aGUgInRyZWUiIGF0dHJpYnV0ZSBpcyB0byBiZSBmb3VuZAorICAgICAgICAocGFnZSwgcmVxdWVzdCwgc2Vzc2lvbiwgb3IgYXBwbGljYXRpb24pLiAgSWYgbm90IHNwZWNpZmllZCwgdGhlCisgICAgICAgICJ0cmVlIiBhdHRyaWJ1dGUgd2lsbCBiZSBzZWFyY2hlZCBmb3IgaW4gYW55IHNjb3BlLgorICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICA8L2F0dHJpYnV0ZT4KKworICAgIDxhdHRyaWJ1dGU+CisgICAgICA8bmFtZT5zdHlsZTwvbmFtZT4KKyAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+CisgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+CisgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgIFRoZSBDU1Mgc3R5bGUgY2xhc3MgdG8gYmUgYXBwbGllZCB0byB0aGUgZW50aXJlIHJlbmRlcmVkIG91dHB1dAorICAgICAgICBvZiB0aGUgdHJlZSBjb250cm9sLiAgSWYgbm90IHNwZWNpZmllZCwgbm8gb3ZlcmFsbCBzdHlsZSBjbGFzcworICAgICAgICBpcyBhcHBsaWVkLgorICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICA8L2F0dHJpYnV0ZT4KKworICAgIDxhdHRyaWJ1dGU+CisgICAgICA8bmFtZT5zdHlsZVNlbGVjdGVkPC9uYW1lPgorICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KKyAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KKyAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgVGhlIENTUyBzdHlsZSBjbGFzcyB0byBiZSBhcHBsaWVkIHRvIHRoZSB0ZXh0IG9mIGFueSBub2RlIHRoYXQKKyAgICAgICAgaXMgY3VycmVudGx5IHNlbGVjdGVkLiAgSWYgbm90IHNwZWNpZmllZCwgbm8gc3R5bGUgY2xhc3Mgd2lsbCBiZQorICAgICAgICBhcHBsaWVkIHRvIHRoZSB0ZXh0IG9mIHRoZSBzZWxlY3RlZCBub2RlLgorICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICA8L2F0dHJpYnV0ZT4KKworICAgIDxhdHRyaWJ1dGU+CisgICAgICA8bmFtZT5zdHlsZVVuc2VsZWN0ZWQ8L25hbWU+CisgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgorICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgorICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICBUaGUgQ1NTIHN0eWxlIGNsYXNzIHRvIGJlIGFwcGxpZWQgdG8gdGhlIHRleHQgb2YgYW55IG5vZGUgdGhhdAorICAgICAgICBpcyAqbm90KiBjdXJyZW50bHkgc2VsZWN0ZWQuICBJZiBub3Qgc3BlY2lmaWVkLCBubyBzdHlsZSBjbGFzcyB3aWxsCisgICAgICAgICBiZSBhcHBsaWVkIHRvIHRoZSB0ZXh0IG9mIG5vbi1zZWxlY3RlZCBub2Rlcy4KKyAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgPC9hdHRyaWJ1dGU+CisKKyAgICA8YXR0cmlidXRlPgorICAgICAgPG5hbWU+dHJlZTwvbmFtZT4KKyAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+CisgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+CisgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgIE5hbWUgb2YgdGhlIGF0dHJpYnV0ZSAoaW4gdGhlIHNjb3BlIHNwZWNpZmllZCBieSB0aGUgInNjb3BlIgorICAgICAgICBhdHRyaWJ1dGUsIGlmIGFueSkgdW5kZXIgd2hpY2ggYW4gb2JqZWN0IG9mIHR5cGUKKyAgICAgICAgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uVHJlZUNvbnRyb2wgaXMgc3RvcmVkLiAgVGhpcyBvYmplY3QKKyAgICAgICAgcmVwcmVzZW50cyB0aGUgZW50aXJlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHRyZWUsIGluY2x1ZGluZworICAgICAgICBhIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBoaWVyYXJjaGljYWwgcmVwcmVzZW50YXRpb24gb2YgdGhlCisgICAgICAgIG5vZGVzLCBwbHVzIHRoZSBjdXJyZW50IGV4cGFuZGVkLyBvciBjb250cmFjdGVkIHN0YXRlIG9mCisgICAgICAgIG5vbi1sZWFmIG5vZGVzLgorICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICA8L2F0dHJpYnV0ZT4KKworICA8L3RhZz4KKworICA8IS0tID09PT09PT09PT0gSk1YIEF0dHJpYnV0ZSBEaXNwbGF5IFRhZyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCisgIDx0YWc+CisKKyAgICA8bmFtZT5hdHRyaWJ1dGU8L25hbWU+CisgICAgPHRhZy1jbGFzcz5vcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5BdHRyaWJ1dGVUYWc8L3RhZy1jbGFzcz4KKyAgICA8Ym9keS1jb250ZW50PmVtcHR5PC9ib2R5LWNvbnRlbnQ+CisgICAgPGRlc2NyaXB0aW9uPgorICAgICAgTG9vayB1cCBhbiBhdHRyaWJ1dGUgb24gYSBKTVggTUJlYW4sIHNwZWNpZmllZCBieSBhbiBvYmplY3QgbmFtZQorICAgICAgc3BlY2lmaWVkIGJ5IHRoZSAibmFtZSIgKGFuZCBvcHRpb25hbCAicHJvcGVydHkiIGFuZCAic2NvcGUiKQorICAgICAgYXR0cmlidXRlcywgYW5kIHJlbmRlciBpdCB0byB0aGUgY3VycmVudCBKU1Agd3JpdGVyLiAgVGhlIG9iamVjdCBuYW1lCisgICAgICBpZGVudGlmaWVkIGJ5IHRoZXNlIGF0dHJpYnV0ZXMgY2FuIGJlIGVpdGhlciBhIGphdmEubGFuZy5TdHJpbmcgdmVyc2lvbgorICAgICAgb2YgdGhlIG5hbWUsIG9yIGEgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lIGluc3RhbmNlLgorICAgIDwvZGVzY3JpcHRpb24+CisKKyAgICA8YXR0cmlidXRlPgorICAgICAgPG5hbWU+YXR0cmlidXRlPC9uYW1lPgorICAgICAgPHJlcXVpcmVkPnRydWU8L3JlcXVpcmVkPgorICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgorICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICBOYW1lIG9mIHRoZSBhdHRyaWJ1dGUgb2YgdGhlIEpNWCBNQmVhbiB3aG9zZSB2YWx1ZSBpcyB0byBiZQorICAgICAgICByZXRyaWV2ZWQgYW5kIHdyaXR0ZW4gdG8gdGhlIGN1cnJlbnQgSlNQIHdyaXRlci4KKyAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgPC9hdHRyaWJ1dGU+CisKKyAgICA8YXR0cmlidXRlPgorICAgICAgPG5hbWU+bmFtZTwvbmFtZT4KKyAgICAgIDxyZXF1aXJlZD50cnVlPC9yZXF1aXJlZD4KKyAgICAgIDxydGV4cHJ2YWx1ZT50cnVlPC9ydGV4cHJ2YWx1ZT4KKyAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgTmFtZSBvZiBhIGJlYW4sIG9wdGlvbmFsbHkgaW4gc29tZSBzY29wZSBpZGVudGlmaWVkIGJ5IHRoZSAic2NvcGUiCisgICAgICAgIGF0dHJpYnV0ZS4gIElmIHRoZSAicHJvcGVydHkiIGF0dHJpYnV0ZSBpcyBub3Qgc3BlY2lmaWVkLCB0aGlzIGJlYW4KKyAgICAgICAgbXVzdCBieSBhIFN0cmluZyBvciBhbiBPYmplY3ROYW1lLiAgT3RoZXJ3aXNlLCB0aGlzIGJlYW4gbXVzdCBoYXZlCisgICAgICAgIGEgcHJvcGVydHkgZ2V0dGVyIGZvciB0aGUgcHJvcGVydHkgbmFtZWQgYnkgInByb3BlcnR5Iiwgd2hpY2ggd2lsbAorICAgICAgICByZXR1cm4gdGhlIFN0cmluZyBvciBPYmplY3ROYW1lLgorICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICA8L2F0dHJpYnV0ZT4KKworICAgIDxhdHRyaWJ1dGU+CisgICAgICA8bmFtZT5wcm9wZXJ0eTwvbmFtZT4KKyAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+CisgICAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+CisgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgIE5hbWUgb2YgYSBiZWFuIHByb3BlcnR5LCBvbiB0aGUgYmVhbiBpZGVudGlmaWVkIGJ5IHRoZSAibmFtZSIKKyAgICAgICAgKGFuZCBvcHRpb25hbCAic2NvcGUiKSBhdHRyaWJ1dGVzLCB0aGF0IGlzIGVpdGhlciBhIFN0cmluZyBvciBhbgorICAgICAgICBPYmplY3ROYW1lIG9mIHRoZSBKTVggTUJlYW4gd2hvc2UgYXR0cmlidXRlIGlzIHRvIGJlIHJldHJpZXZlZC4KKyAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgPC9hdHRyaWJ1dGU+CisKKyAgICA8YXR0cmlidXRlPgorICAgICAgPG5hbWU+c2NvcGU8L25hbWU+CisgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgorICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgorICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICBOYW1lIG9mIHRoZSBzY29wZSAoInBhZ2UiLCAicmVxdWVzdCIsICJzZXNzaW9uIiwgb3IgImFwcGxpY2F0aW9uIikKKyAgICAgICAgaW4gd2hpY2ggdGhlIGJlYW4gaWRlbnRpZmllZCBieSB0aGUgIm5hbWUiIGF0dHJpYnV0ZSBpcyB0byBiZSBmb3VuZC4KKyAgICAgICAgSWYgbm90IHNwZWNpZmllZCwgYWxsIHNjb3BlcyB3aWxsIGJlIHNlYXJjaGVkIGluIGFzY2VuZGluZyBvcmRlci4KKyAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgPC9hdHRyaWJ1dGU+CisKKyAgPC90YWc+CisKKzwvdGFnbGliPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vV0VCLUlORi9zdHJ1dHMtY29uZmlnLnhtbCBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvc3RydXRzLWNvbmZpZy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmIxZmZhMgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvc3RydXRzLWNvbmZpZy54bWwKQEAgLTAsMCArMSwxMDEzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/PgorCis8IURPQ1RZUEUgc3RydXRzLWNvbmZpZyBQVUJMSUMKKyAgICAgICAgICAiLS8vQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24vL0RURCBTdHJ1dHMgQ29uZmlndXJhdGlvbiAxLjEvL0VOIgorICAgICAgICAgICJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3N0cnV0cy9kdGRzL3N0cnV0cy1jb25maWdfMV8xLmR0ZCI+IAorCisKKzxzdHJ1dHMtY29uZmlnPgorCisKKyAgPCEtLSA9PT09PT09PT09IERhdGEgU291cmNlIENvbmZpZ3VyYXRpb24gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworCisgIDwhLS0gPT09PT09PT09PSBGb3JtIEJlYW4gRGVmaW5pdGlvbnMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKyAgPGZvcm0tYmVhbnM+CisKKyAgICA8IS0tIFNldCBMb2NhbGUgZm9ybSBiZWFuIC0tPgorICAgIDxmb3JtLWJlYW4gICAgICBuYW1lPSJzZXRMb2NhbGVGb3JtIgorICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5TZXRMb2NhbGVGb3JtIi8+CisKKyAgICA8IS0tID09PT09PT09PT09PT0gU2VydmVyIE1vZHVsZSA9PT09PT09PT09PT09IC0tPgorCisgICAgPGZvcm0tYmVhbiAgICAgIG5hbWU9InNlcnZlckZvcm0iCisgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnNlcnZlci5TZXJ2ZXJGb3JtIi8+CisgICAgICAgICAgICAgICAgICAgIAorICAgIDwhLS0gPT09PT09PT09PT09PSBTZXJ2aWNlIE1vZHVsZSA9PT09PT09PT09PT09IC0tPgorCisgICAgPGZvcm0tYmVhbiAgICAgIG5hbWU9InNlcnZpY2VGb3JtIgorICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5zZXJ2aWNlLlNlcnZpY2VGb3JtIi8+CisgICAgICAgICAgICAgICAgICAgIAorICAgIDxmb3JtLWJlYW4gICAgICBuYW1lPSJzZXJ2aWNlc0Zvcm0iCisgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnNlcnZpY2UuU2VydmljZXNGb3JtIi8+CisKKyAgICA8IS0tID09PT09PT09PT09PT0gSG9zdCBNb2R1bGUgPT09PT09PT09PT09PSAtLT4KKworICAgIDxmb3JtLWJlYW4gICAgICBuYW1lPSJob3N0Rm9ybSIKKyAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uaG9zdC5Ib3N0Rm9ybSIvPgorICAgICAgICAgICAgICAgICAgICAKKyAgICA8Zm9ybS1iZWFuICAgICAgbmFtZT0iaG9zdHNGb3JtIgorICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5ob3N0Lkhvc3RzRm9ybSIvPgorCisgICAgPGZvcm0tYmVhbiAgICAgIG5hbWU9ImFsaWFzRm9ybSIKKyAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uaG9zdC5BbGlhc0Zvcm0iLz4KKyAgICAgICAgICAgICAgICAgICAgCisgICAgPGZvcm0tYmVhbiAgICAgIG5hbWU9ImFsaWFzZXNGb3JtIgorICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5ob3N0LkFsaWFzZXNGb3JtIi8+CisKKyAgICA8IS0tID09PT09PT09PT09PT0gUmVhbG0gTW9kdWxlID09PT09PT09PT09PT0gLS0+CisKKyAgICA8Zm9ybS1iZWFuICAgICAgbmFtZT0iZGF0YVNvdXJjZVJlYWxtRm9ybSIKKyAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVhbG0uRGF0YVNvdXJjZVJlYWxtRm9ybSIvPgorCisgICAgPGZvcm0tYmVhbiAgICAgIG5hbWU9ImpkYmNSZWFsbUZvcm0iCisgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnJlYWxtLkpEQkNSZWFsbUZvcm0iLz4KKworICAgIDxmb3JtLWJlYW4gICAgICBuYW1lPSJqbmRpUmVhbG1Gb3JtIgorICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5yZWFsbS5KTkRJUmVhbG1Gb3JtIi8+CisKKyAgICA8Zm9ybS1iZWFuICAgICAgbmFtZT0ibWVtb3J5UmVhbG1Gb3JtIgorICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5yZWFsbS5NZW1vcnlSZWFsbUZvcm0iLz4KKworICAgIDxmb3JtLWJlYW4gICAgICBuYW1lPSJ1c2VyRGF0YWJhc2VSZWFsbUZvcm0iCisgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnJlYWxtLlVzZXJEYXRhYmFzZVJlYWxtRm9ybSIvPgorCisgICAgPGZvcm0tYmVhbiAgICAgIG5hbWU9InJlYWxtc0Zvcm0iCisgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnJlYWxtLlJlYWxtc0Zvcm0iLz4KKworICAgIDwhLS0gPT09PT09PT09PT09PSBDb250ZXh0IE1vZHVsZSA9PT09PT09PT09PT09IC0tPgorCisgICAgPGZvcm0tYmVhbiAgICAgIG5hbWU9ImNvbnRleHRGb3JtIgorICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5jb250ZXh0LkNvbnRleHRGb3JtIi8+CisgICAgICAgICAgICAgICAgICAgIAorICAgIDxmb3JtLWJlYW4gICAgICBuYW1lPSJjb250ZXh0c0Zvcm0iCisgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLmNvbnRleHQuQ29udGV4dHNGb3JtIi8+CisgICAgICAgICAgICAgICAgICAgIAorICAgIDwhLS0gPT09PT09PT09PT09PSBEZWZhdWx0Q29udGV4dCBNb2R1bGUgPT09PT09PT09PT09PSAtLT4KKworICAgIDxmb3JtLWJlYW4gICAgICBuYW1lPSJkZWZhdWx0Q29udGV4dEZvcm0iCisgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLmRlZmF1bHRjb250ZXh0LkRlZmF1bHRDb250ZXh0Rm9ybSIvPgorICAgICAgICAgICAgICAgICAgICAKKyAgICA8Zm9ybS1iZWFuICAgICAgbmFtZT0iZGVmYXVsdENvbnRleHRzRm9ybSIKKyAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uZGVmYXVsdGNvbnRleHQuRGVmYXVsdENvbnRleHRzRm9ybSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIDwhLS0gPT09PT09PT09PT09PSBDb25uZWN0b3IgTW9kdWxlID09PT09PT09PT09PT0gLS0+CisKKyAgICA8Zm9ybS1iZWFuICAgICAgbmFtZT0iY29ubmVjdG9yRm9ybSIKKyAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uY29ubmVjdG9yLkNvbm5lY3RvckZvcm0iLz4KKyAgICAgICAgICAgICAgICAgICAgCisgICAgPGZvcm0tYmVhbiAgICAgIG5hbWU9ImNvbm5lY3RvcnNGb3JtIgorICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5jb25uZWN0b3IuQ29ubmVjdG9yc0Zvcm0iLz4KKworICAgIDwhLS0gPT09PT09PT09PT09PSBWYWx2ZSBNb2R1bGUgPT09PT09PT09PT09PSAtLT4KKworICAgIDxmb3JtLWJlYW4gICAgICBuYW1lPSJhY2Nlc3NMb2dWYWx2ZUZvcm0iCisgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnZhbHZlLkFjY2Vzc0xvZ1ZhbHZlRm9ybSIvPgorCisgICAgPGZvcm0tYmVhbiAgICAgIG5hbWU9InJlbW90ZUFkZHJWYWx2ZUZvcm0iCisgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnZhbHZlLlJlbW90ZUFkZHJWYWx2ZUZvcm0iLz4KKworICAgIDxmb3JtLWJlYW4gICAgICBuYW1lPSJyZW1vdGVIb3N0VmFsdmVGb3JtIgorICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi52YWx2ZS5SZW1vdGVIb3N0VmFsdmVGb3JtIi8+CisKKyAgICA8Zm9ybS1iZWFuICAgICAgbmFtZT0icmVxdWVzdER1bXBlclZhbHZlRm9ybSIKKyAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4udmFsdmUuUmVxdWVzdER1bXBlclZhbHZlRm9ybSIvPgorCisgICAgPGZvcm0tYmVhbiAgICAgIG5hbWU9InNpbmdsZVNpZ25PblZhbHZlRm9ybSIKKyAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4udmFsdmUuU2luZ2xlU2lnbk9uVmFsdmVGb3JtIi8+CisKKyAgICA8Zm9ybS1iZWFuICAgICAgbmFtZT0idmFsdmVzRm9ybSIKKyAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4udmFsdmUuVmFsdmVzRm9ybSIvPgorCisgICAgPCEtLSA9PT09PT09PT09IFJlc291cmNlcyBNb2R1bGUgPT09PT09PT09PSAtLT4KKworICAgIDxmb3JtLWJlYW4gICAgICBuYW1lPSJlbnZFbnRyeUZvcm0iCisgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnJlc291cmNlcy5FbnZFbnRyeUZvcm0iLz4KKworICAgIDxmb3JtLWJlYW4gICAgICBuYW1lPSJlbnZFbnRyaWVzRm9ybSIKKyAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVzb3VyY2VzLkVudkVudHJpZXNGb3JtIi8+CisKKyAgICA8Zm9ybS1iZWFuICAgICAgbmFtZT0idXNlckRhdGFiYXNlRm9ybSIKKyAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVzb3VyY2VzLlVzZXJEYXRhYmFzZUZvcm0iLz4KKworICAgIDxmb3JtLWJlYW4gICAgICBuYW1lPSJ1c2VyRGF0YWJhc2VzRm9ybSIKKyAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVzb3VyY2VzLlVzZXJEYXRhYmFzZXNGb3JtIi8+CisKKyAgICA8Zm9ybS1iZWFuICAgICAgbmFtZT0iZGF0YVNvdXJjZUZvcm0iCisgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnJlc291cmNlcy5EYXRhU291cmNlRm9ybSIvPgorCisgICAgPGZvcm0tYmVhbiAgICAgIG5hbWU9ImRhdGFTb3VyY2VzRm9ybSIKKyAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVzb3VyY2VzLkRhdGFTb3VyY2VzRm9ybSIvPgorCisgICAgPGZvcm0tYmVhbiAgICAgIG5hbWU9Im1haWxTZXNzaW9uRm9ybSIKKyAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVzb3VyY2VzLk1haWxTZXNzaW9uRm9ybSIvPgorCisgICAgPGZvcm0tYmVhbiAgICAgIG5hbWU9Im1haWxTZXNzaW9uc0Zvcm0iCisgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnJlc291cmNlcy5NYWlsU2Vzc2lvbnNGb3JtIi8+CisKKyAgICA8Zm9ybS1iZWFuICAgICAgbmFtZT0icmVzb3VyY2VMaW5rRm9ybSIKKyAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVzb3VyY2VzLlJlc291cmNlTGlua0Zvcm0iLz4KKworICAgIDxmb3JtLWJlYW4gICAgICBuYW1lPSJyZXNvdXJjZUxpbmtzRm9ybSIKKyAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVzb3VyY2VzLlJlc291cmNlTGlua3NGb3JtIi8+CisKKyAgICA8IS0tID09PT09PT09PT0gVXNlciBEYXRhYmFzZSBNb2R1bGUgPT09PT09PT09PSAtLT4KKworICAgIDxmb3JtLWJlYW4gICAgICBuYW1lPSJkYXRhYmFzZUZvcm0iCisgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnVzZXJzLkJhc2VGb3JtIi8+CisKKyAgICA8Zm9ybS1iZWFuICAgICAgbmFtZT0iZ3JvdXBGb3JtIgorICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi51c2Vycy5Hcm91cEZvcm0iLz4KKworICAgIDxmb3JtLWJlYW4gICAgICBuYW1lPSJncm91cHNGb3JtIgorICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi51c2Vycy5Hcm91cHNGb3JtIi8+CisKKyAgICA8Zm9ybS1iZWFuICAgICAgbmFtZT0icm9sZUZvcm0iCisgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnVzZXJzLlJvbGVGb3JtIi8+CisKKyAgICA8Zm9ybS1iZWFuICAgICAgbmFtZT0icm9sZXNGb3JtIgorICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi51c2Vycy5Sb2xlc0Zvcm0iLz4KKworICAgIDxmb3JtLWJlYW4gICAgICBuYW1lPSJ1c2VyRm9ybSIKKyAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4udXNlcnMuVXNlckZvcm0iLz4KKworICAgIDxmb3JtLWJlYW4gICAgICBuYW1lPSJ1c2Vyc0Zvcm0iCisgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnVzZXJzLlVzZXJzRm9ybSIvPgorCisgICAgPCEtLSA9PT09PT09PT09ID09PT09PT09PT09PT09PT09PT09ID09PT09PT09PT0gLS0+CisKKworICA8L2Zvcm0tYmVhbnM+CisKKworICA8IS0tID09PT09PT09PT0gR2xvYmFsIEZvcndhcmQgRGVmaW5pdGlvbnMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCisgIDxnbG9iYWwtZm9yd2FyZHM+CisKKyAgICA8Zm9yd2FyZCAgICAgICAgbmFtZT0iRHVtcCBSZWdpc3RyeSBSZXN1bHRzIgorICAgICAgICAgICAgICAgICAgICBwYXRoPSIvZHVtcFJlZ2lzdHJ5LmpzcCIKKyAgICAgICAgICAgICAgICByZWRpcmVjdD0iZmFsc2UiLz4KKworICAgIDxmb3J3YXJkICAgICAgICBuYW1lPSJEdW1wIFNlcnZlciBSZXN1bHRzIgorICAgICAgICAgICAgICAgICAgICBwYXRoPSIvZHVtcFNlcnZlci5qc3AiCisgICAgICAgICAgICAgICAgcmVkaXJlY3Q9ImZhbHNlIi8+CisKKyAgICA8Zm9yd2FyZCAgICAgICAgbmFtZT0iTWFpbiBNZW51IgorICAgICAgICAgICAgICAgICAgICBwYXRoPSIvaW5kZXguanNwIgorICAgICAgICAgICAgICAgIHJlZGlyZWN0PSJmYWxzZSIvPgorCisgICAgPGZvcndhcmQgICAgICAgIG5hbWU9IlRyZWUgQ29udHJvbCBUZXN0IgorICAgICAgICAgICAgICAgICAgICBwYXRoPSIvdHJlZS1jb250cm9sLXRlc3QuanNwIgorICAgICAgICAgICAgICAgIHJlZGlyZWN0PSJmYWxzZSIvPgorICAgICAgICAgICAgICAgICAgCisgICAgPGZvcndhcmQgICAgICAgIG5hbWU9IlNhdmUgU3VjY2Vzc2Z1bCIKKyAgICAgICAgICAgICAgICAgICAgcGF0aD0iL3NhdmVkLmpzcCIKKyAgICAgICAgICAgICAgICByZWRpcmVjdD0iZmFsc2UiLz4KKworICAgIDxmb3J3YXJkICAgICAgICBuYW1lPSJTYXZlIFVuc3VjY2Vzc2Z1bCIKKyAgICAgICAgICAgICAgICAgICAgcGF0aD0iL3NhdmVmYWlsLmpzcCIKKyAgICAgICAgICAgICAgICByZWRpcmVjdD0iZmFsc2UiLz4KKyAgICAgICAgICAgICAgICAKKyAgICA8Zm9yd2FyZCAgICAgICAgbmFtZT0iQmxhbmsiCisgICAgICAgICAgICAgICAgICAgIHBhdGg9Ii9ibGFuay5qc3AiCisgICAgICAgICAgICAgICAgcmVkaXJlY3Q9ImZhbHNlIi8+CisKKyAgICA8Zm9yd2FyZCAgICAgICAgbmFtZT0iVXNlciIKKyAgICAgICAgICAgICAgICAgICAgcGF0aD0iL3VzZXIuanNwIgorICAgICAgICAgICAgICAgIHJlZGlyZWN0PSJmYWxzZSIvPgorCisgICAgPCEtLSA9PT09PT09PT09PT0gU2VydmVyIE1vZHVsZSA9PT09PT09PT09PT09PSAtLT4KKworICAgIDxmb3J3YXJkICAgICAgICBuYW1lPSJTZXJ2ZXIiCisgICAgICAgICAgICAgICAgICAgIHBhdGg9Ii9zZXJ2ZXIvc2VydmVyLmpzcCIKKyAgICAgICAgICAgICAgICByZWRpcmVjdD0iZmFsc2UiLz4KKyAgICAKKyAgICA8IS0tID09PT09PT09PT09PSBTZXJ2aWNlIE1vZHVsZSA9PT09PT09PT09PT09PSAtLT4KKworICAgIDxmb3J3YXJkICAgICAgICBuYW1lPSJTZXJ2aWNlIgorICAgICAgICAgICAgICAgICAgICBwYXRoPSIvc2VydmljZS9zZXJ2aWNlLmpzcCIKKyAgICAgICAgICAgICAgICByZWRpcmVjdD0iZmFsc2UiLz4KKworICAgIDxmb3J3YXJkICAgICAgICBuYW1lPSJTZXJ2aWNlcyIKKyAgICAgICAgICAgICAgICAgICAgcGF0aD0iL3NlcnZpY2Uvc2VydmljZXMuanNwIgorICAgICAgICAgICAgICAgIHJlZGlyZWN0PSJmYWxzZSIvPgorCisgICAgPCEtLSA9PT09PT09PT09PT0gSG9zdCBNb2R1bGUgPT09PT09PT09PT09PT0gLS0+CisKKyAgICA8Zm9yd2FyZCAgICAgICAgbmFtZT0iSG9zdCIKKyAgICAgICAgICAgICAgICAgICAgcGF0aD0iL2hvc3QvaG9zdC5qc3AiCisgICAgICAgICAgICAgICAgcmVkaXJlY3Q9ImZhbHNlIi8+CisKKyAgICA8Zm9yd2FyZCAgICAgICAgbmFtZT0iSG9zdHMiCisgICAgICAgICAgICAgICAgICAgIHBhdGg9Ii9ob3N0L2hvc3RzLmpzcCIKKyAgICAgICAgICAgICAgICByZWRpcmVjdD0iZmFsc2UiLz4KKworICAgIDxmb3J3YXJkICAgICAgICBuYW1lPSJBbGlhcyIKKyAgICAgICAgICAgICAgICAgICAgcGF0aD0iL2hvc3QvYWxpYXMuanNwIgorICAgICAgICAgICAgICAgIHJlZGlyZWN0PSJmYWxzZSIvPgorCisgICAgPGZvcndhcmQgICAgICAgIG5hbWU9IkFsaWFzZXMiCisgICAgICAgICAgICAgICAgICAgIHBhdGg9Ii9ob3N0L2FsaWFzZXMuanNwIgorICAgICAgICAgICAgICAgIHJlZGlyZWN0PSJmYWxzZSIvPgorCisKKyAgICA8IS0tID09PT09PT09PT09PSBDb250ZXh0IE1vZHVsZSA9PT09PT09PT09PT09PSAtLT4KKworICAgIDxmb3J3YXJkICAgICAgICBuYW1lPSJDb250ZXh0IgorICAgICAgICAgICAgICAgICAgICBwYXRoPSIvY29udGV4dC9jb250ZXh0LmpzcCIKKyAgICAgICAgICAgICAgICByZWRpcmVjdD0iZmFsc2UiLz4KKworICAgIDxmb3J3YXJkICAgICAgICBuYW1lPSJDb250ZXh0cyIKKyAgICAgICAgICAgICAgICAgICAgcGF0aD0iL2NvbnRleHQvY29udGV4dHMuanNwIgorICAgICAgICAgICAgICAgIHJlZGlyZWN0PSJmYWxzZSIvPgorCisgICAgPCEtLSA9PT09PT09PT09PT0gRGVmYXVsdENvbnRleHQgTW9kdWxlID09PT09PT09PT09PT09IC0tPgorCisgICAgPGZvcndhcmQgICAgICAgIG5hbWU9IkRlZmF1bHRDb250ZXh0IgorICAgICAgICAgICAgICAgICAgICBwYXRoPSIvZGVmYXVsdGNvbnRleHQvZGVmYXVsdGNvbnRleHQuanNwIgorICAgICAgICAgICAgICAgIHJlZGlyZWN0PSJmYWxzZSIvPgorCisgICAgPGZvcndhcmQgICAgICAgIG5hbWU9IkRlZmF1bHRDb250ZXh0cyIKKyAgICAgICAgICAgICAgICAgICAgcGF0aD0iL2RlZmF1bHRjb250ZXh0L2RlZmF1bHRjb250ZXh0cy5qc3AiCisgICAgICAgICAgICAgICAgcmVkaXJlY3Q9ImZhbHNlIi8+CisKKyAgICA8IS0tID09PT09PT09PT09PSBDb25uZWN0b3IgTW9kdWxlID09PT09PT09PT09PT09IC0tPgorCisgICAgPGZvcndhcmQgICAgICAgIG5hbWU9IkNvbm5lY3RvciIKKyAgICAgICAgICAgICAgICAgICAgcGF0aD0iL2Nvbm5lY3Rvci9jb25uZWN0b3IuanNwIgorICAgICAgICAgICAgICAgIHJlZGlyZWN0PSJmYWxzZSIvPgorCisgICAgPGZvcndhcmQgICAgICAgIG5hbWU9IkNvbm5lY3RvcnMiCisgICAgICAgICAgICAgICAgICAgIHBhdGg9Ii9jb25uZWN0b3IvY29ubmVjdG9ycy5qc3AiCisgICAgICAgICAgICAgICAgcmVkaXJlY3Q9ImZhbHNlIi8+CisKKyAgICA8IS0tID09PT09PT09PT09PSBSZWFsbSBNb2R1bGUgPT09PT09PT09PT09PT0gLS0+CisKKyAgICA8Zm9yd2FyZCAgICAgICAgbmFtZT0iRGF0YVNvdXJjZVJlYWxtIgorICAgICAgICAgICAgICAgICAgICBwYXRoPSIvcmVhbG0vZGF0YVNvdXJjZVJlYWxtLmpzcCIKKyAgICAgICAgICAgICAgICByZWRpcmVjdD0iZmFsc2UiLz4KKworICAgIDxmb3J3YXJkICAgICAgICBuYW1lPSJKREJDUmVhbG0iCisgICAgICAgICAgICAgICAgICAgIHBhdGg9Ii9yZWFsbS9qZGJjUmVhbG0uanNwIgorICAgICAgICAgICAgICAgIHJlZGlyZWN0PSJmYWxzZSIvPgorICAgICAgICAgICAgICAgIAorICAgIDxmb3J3YXJkICAgICAgICBuYW1lPSJKTkRJUmVhbG0iCisgICAgICAgICAgICAgICAgICAgIHBhdGg9Ii9yZWFsbS9qbmRpUmVhbG0uanNwIgorICAgICAgICAgICAgICAgIHJlZGlyZWN0PSJmYWxzZSIvPgorICAgICAgICAgICAgICAgIAorICAgIDxmb3J3YXJkICAgICAgICBuYW1lPSJNZW1vcnlSZWFsbSIKKyAgICAgICAgICAgICAgICAgICAgcGF0aD0iL3JlYWxtL21lbW9yeVJlYWxtLmpzcCIKKyAgICAgICAgICAgICAgICByZWRpcmVjdD0iZmFsc2UiLz4KKworICAgIDxmb3J3YXJkICAgICAgICBuYW1lPSJVc2VyRGF0YWJhc2VSZWFsbSIKKyAgICAgICAgICAgICAgICAgICAgcGF0aD0iL3JlYWxtL3VzZXJEYXRhYmFzZVJlYWxtLmpzcCIKKyAgICAgICAgICAgICAgICByZWRpcmVjdD0iZmFsc2UiLz4KKworICAgIDxmb3J3YXJkICAgICAgICBuYW1lPSJSZWFsbXMiCisgICAgICAgICAgICAgICAgICAgIHBhdGg9Ii9yZWFsbS9yZWFsbXMuanNwIgorICAgICAgICAgICAgICAgIHJlZGlyZWN0PSJmYWxzZSIvPgorCisgICAgPCEtLSA9PT09PT09PT09PT0gQ29udGV4dCBNb2R1bGUgPT09PT09PT09PT09PT0gLS0+CisKKyAgICA8Zm9yd2FyZCAgICAgICAgbmFtZT0iQ29udGV4dCIKKyAgICAgICAgICAgICAgICAgICAgcGF0aD0iL2NvbnRleHQvY29udGV4dC5qc3AiCisgICAgICAgICAgICAgICAgcmVkaXJlY3Q9ImZhbHNlIi8+CisKKyAgICA8Zm9yd2FyZCAgICAgICAgbmFtZT0iQ29udGV4dHMiCisgICAgICAgICAgICAgICAgICAgIHBhdGg9Ii9jb250ZXh0L2NvbnRleHRzLmpzcCIKKyAgICAgICAgICAgICAgICByZWRpcmVjdD0iZmFsc2UiLz4KKworICAgIDwhLS0gPT09PT09PT09PT09IFZhbHZlIE1vZHVsZSA9PT09PT09PT09PT09PSAtLT4KKworICAgIDxmb3J3YXJkICAgICAgICBuYW1lPSJBY2Nlc3NMb2dWYWx2ZSIKKyAgICAgICAgICAgICAgICAgICAgcGF0aD0iL3ZhbHZlL2FjY2Vzc0xvZ1ZhbHZlLmpzcCIKKyAgICAgICAgICAgICAgICByZWRpcmVjdD0iZmFsc2UiLz4KKyAgICAgICAgICAgICAgICAKKyAgICA8Zm9yd2FyZCAgICAgICAgbmFtZT0iUmVtb3RlQWRkclZhbHZlIgorICAgICAgICAgICAgICAgICAgICBwYXRoPSIvdmFsdmUvcmVtb3RlQWRkclZhbHZlLmpzcCIKKyAgICAgICAgICAgICAgICByZWRpcmVjdD0iZmFsc2UiLz4KKyAgICAgICAgICAgICAgICAKKyAgICA8Zm9yd2FyZCAgICAgICAgbmFtZT0iUmVtb3RlSG9zdFZhbHZlIgorICAgICAgICAgICAgICAgICAgICBwYXRoPSIvdmFsdmUvcmVtb3RlSG9zdFZhbHZlLmpzcCIKKyAgICAgICAgICAgICAgICByZWRpcmVjdD0iZmFsc2UiLz4KKworICAgIDxmb3J3YXJkICAgICAgICBuYW1lPSJSZXF1ZXN0RHVtcGVyVmFsdmUiCisgICAgICAgICAgICAgICAgICAgIHBhdGg9Ii92YWx2ZS9yZXF1ZXN0RHVtcGVyVmFsdmUuanNwIgorICAgICAgICAgICAgICAgIHJlZGlyZWN0PSJmYWxzZSIvPgorCisgICAgPGZvcndhcmQgICAgICAgIG5hbWU9IlNpbmdsZVNpZ25PbiIKKyAgICAgICAgICAgICAgICAgICAgcGF0aD0iL3ZhbHZlL3NpbmdsZVNpZ25PblZhbHZlLmpzcCIKKyAgICAgICAgICAgICAgICByZWRpcmVjdD0iZmFsc2UiLz4KKworICAgIDxmb3J3YXJkICAgICAgICBuYW1lPSJWYWx2ZXMiCisgICAgICAgICAgICAgICAgICAgIHBhdGg9Ii92YWx2ZS92YWx2ZXMuanNwIgorICAgICAgICAgICAgICAgIHJlZGlyZWN0PSJmYWxzZSIvPgorCisgICAgPCEtLSA9PT09PT09PT09IFJlc291cmNlcyBNb2R1bGUgPT09PT09PT09PSAtLT4KKworICAgIDxmb3J3YXJkICAgICAgICBuYW1lPSJFbnZFbnRyeSIKKyAgICAgICAgICAgICAgICAgICAgcGF0aD0iL3Jlc291cmNlcy9lbnZFbnRyeS5qc3AiCisgICAgICAgICAgICAgICAgcmVkaXJlY3Q9ImZhbHNlIi8+CisKKyAgICA8Zm9yd2FyZCAgICAgICAgbmFtZT0iRW52RW50cmllcyBEZWxldGUgTGlzdCIKKyAgICAgICAgICAgICAgICAgICAgcGF0aD0iL3Jlc291cmNlcy9kZWxldGVFbnZFbnRyaWVzLmpzcCIKKyAgICAgICAgICAgICAgICByZWRpcmVjdD0iZmFsc2UiLz4KKworICAgIDxmb3J3YXJkICAgICAgICBuYW1lPSJFbnZFbnRyaWVzIExpc3QiCisgICAgICAgICAgICAgICAgICAgIHBhdGg9Ii9yZXNvdXJjZXMvbGlzdEVudkVudHJpZXMuanNwIgorICAgICAgICAgICAgICAgIHJlZGlyZWN0PSJmYWxzZSIvPgorCisgICAgPGZvcndhcmQgICAgICAgIG5hbWU9IkVudkVudHJpZXMgTGlzdCBTZXR1cCIKKyAgICAgICAgICAgICAgICAgICAgcGF0aD0iL3Jlc291cmNlcy9saXN0RW52RW50cmllcy5kbz9mb3J3YXJkPUVudkVudHJpZXMrTGlzdCIKKyAgICAgICAgICAgICAgICByZWRpcmVjdD0iZmFsc2UiLz4KKworICAgIDxmb3J3YXJkICAgICAgICBuYW1lPSJVc2VyRGF0YWJhc2UiCisgICAgICAgICAgICAgICAgICAgIHBhdGg9Ii9yZXNvdXJjZXMvdXNlckRhdGFiYXNlLmpzcCIKKyAgICAgICAgICAgICAgICByZWRpcmVjdD0iZmFsc2UiLz4KKworICAgIDxmb3J3YXJkICAgICAgICBuYW1lPSJVc2VyRGF0YWJhc2VzIERlbGV0ZSBMaXN0IgorICAgICAgICAgICAgICAgICAgICBwYXRoPSIvcmVzb3VyY2VzL2RlbGV0ZVVzZXJEYXRhYmFzZXMuanNwIgorICAgICAgICAgICAgICAgIHJlZGlyZWN0PSJmYWxzZSIvPgorCisgICAgPGZvcndhcmQgICAgICAgIG5hbWU9IlVzZXJEYXRhYmFzZXMgTGlzdCIKKyAgICAgICAgICAgICAgICAgICAgcGF0aD0iL3Jlc291cmNlcy9saXN0VXNlckRhdGFiYXNlcy5qc3AiCisgICAgICAgICAgICAgICAgcmVkaXJlY3Q9ImZhbHNlIi8+CisKKyAgICA8Zm9yd2FyZCAgICAgICAgbmFtZT0iVXNlckRhdGFiYXNlcyBMaXN0IFNldHVwIgorICAgICAgICAgICAgICAgICAgICBwYXRoPSIvcmVzb3VyY2VzL2xpc3RVc2VyRGF0YWJhc2VzLmRvP2ZvcndhcmQ9VXNlckRhdGFiYXNlcytMaXN0IgorICAgICAgICAgICAgICAgIHJlZGlyZWN0PSJmYWxzZSIvPgorICAgICAgICAgICAgICAgIAorICAgIDxmb3J3YXJkICAgICAgICBuYW1lPSJEYXRhU291cmNlIgorICAgICAgICAgICAgICAgICAgICBwYXRoPSIvcmVzb3VyY2VzL2RhdGFTb3VyY2UuanNwIgorICAgICAgICAgICAgICAgIHJlZGlyZWN0PSJmYWxzZSIvPgorCisgICAgPGZvcndhcmQgICAgICAgIG5hbWU9IkRhdGFTb3VyY2VzIERlbGV0ZSBMaXN0IgorICAgICAgICAgICAgICAgICAgICBwYXRoPSIvcmVzb3VyY2VzL2RlbGV0ZURhdGFTb3VyY2VzLmpzcCIKKyAgICAgICAgICAgICAgICByZWRpcmVjdD0iZmFsc2UiLz4KKworICAgIDxmb3J3YXJkICAgICAgICBuYW1lPSJEYXRhU291cmNlcyBMaXN0IgorICAgICAgICAgICAgICAgICAgICBwYXRoPSIvcmVzb3VyY2VzL2xpc3REYXRhU291cmNlcy5qc3AiCisgICAgICAgICAgICAgICAgcmVkaXJlY3Q9ImZhbHNlIi8+CisKKyAgICA8Zm9yd2FyZCAgICAgICAgbmFtZT0iRGF0YVNvdXJjZXMgTGlzdCBTZXR1cCIKKyAgICAgICAgICAgICAgICAgICAgcGF0aD0iL3Jlc291cmNlcy9saXN0RGF0YVNvdXJjZXMuZG8/Zm9yd2FyZD1EYXRhU291cmNlcytMaXN0IgorICAgICAgICAgICAgICAgIHJlZGlyZWN0PSJmYWxzZSIvPgorCisgICAgPGZvcndhcmQgICAgICAgIG5hbWU9Ik1haWxTZXNzaW9uIgorICAgICAgICAgICAgICAgICAgICBwYXRoPSIvcmVzb3VyY2VzL21haWxTZXNzaW9uLmpzcCIKKyAgICAgICAgICAgICAgICByZWRpcmVjdD0iZmFsc2UiLz4KKworICAgIDxmb3J3YXJkICAgICAgICBuYW1lPSJNYWlsU2Vzc2lvbnMgRGVsZXRlIExpc3QiCisgICAgICAgICAgICAgICAgICAgIHBhdGg9Ii9yZXNvdXJjZXMvZGVsZXRlTWFpbFNlc3Npb25zLmpzcCIKKyAgICAgICAgICAgICAgICByZWRpcmVjdD0iZmFsc2UiLz4KKworICAgIDxmb3J3YXJkICAgICAgICBuYW1lPSJNYWlsU2Vzc2lvbnMgTGlzdCIKKyAgICAgICAgICAgICAgICAgICAgcGF0aD0iL3Jlc291cmNlcy9saXN0TWFpbFNlc3Npb25zLmpzcCIKKyAgICAgICAgICAgICAgICByZWRpcmVjdD0iZmFsc2UiLz4KKworICAgIDxmb3J3YXJkICAgICAgICBuYW1lPSJNYWlsU2Vzc2lvbnMgTGlzdCBTZXR1cCIKKyAgICAgICAgICAgICAgICAgICAgcGF0aD0iL3Jlc291cmNlcy9saXN0TWFpbFNlc3Npb25zLmRvP2ZvcndhcmQ9TWFpbFNlc3Npb25zK0xpc3QiCisgICAgICAgICAgICAgICAgcmVkaXJlY3Q9ImZhbHNlIi8+CisKKyAgICA8Zm9yd2FyZCAgICAgICAgbmFtZT0iUmVzb3VyY2VMaW5rIgorICAgICAgICAgICAgICAgICAgICBwYXRoPSIvcmVzb3VyY2VzL3Jlc291cmNlTGluay5qc3AiCisgICAgICAgICAgICAgICAgcmVkaXJlY3Q9ImZhbHNlIi8+CisKKyAgICA8Zm9yd2FyZCAgICAgICAgbmFtZT0iUmVzb3VyY2VMaW5rcyBEZWxldGUgTGlzdCIKKyAgICAgICAgICAgICAgICAgICAgcGF0aD0iL3Jlc291cmNlcy9kZWxldGVSZXNvdXJjZUxpbmtzLmpzcCIKKyAgICAgICAgICAgICAgICByZWRpcmVjdD0iZmFsc2UiLz4KKworICAgIDxmb3J3YXJkICAgICAgICBuYW1lPSJSZXNvdXJjZUxpbmtzIExpc3QiCisgICAgICAgICAgICAgICAgICAgIHBhdGg9Ii9yZXNvdXJjZXMvbGlzdFJlc291cmNlTGlua3MuanNwIgorICAgICAgICAgICAgICAgIHJlZGlyZWN0PSJmYWxzZSIvPgorCisgICAgPGZvcndhcmQgICAgICAgIG5hbWU9IlJlc291cmNlTGlua3MgTGlzdCBTZXR1cCIKKyAgICAgICAgICAgICAgICAgICAgcGF0aD0iL3Jlc291cmNlcy9saXN0UmVzb3VyY2VMaW5rcy5kbz9mb3J3YXJkPVJlc291cmNlTGlua3MrTGlzdCIKKyAgICAgICAgICAgICAgICByZWRpcmVjdD0iZmFsc2UiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIDwhLS0gPT09PT09PT09PSBVc2VyIERhdGFiYXNlIE1vZHVsZSA9PT09PT09PT09IC0tPgorCisgICAgPGZvcndhcmQgICAgICAgIG5hbWU9Ikdyb3VwIgorICAgICAgICAgICAgICAgICAgICBwYXRoPSIvdXNlcnMvZ3JvdXAuanNwIgorICAgICAgICAgICAgICAgIHJlZGlyZWN0PSJmYWxzZSIvPgorCisgICAgPGZvcndhcmQgICAgICAgIG5hbWU9Ikdyb3VwcyBEZWxldGUgTGlzdCIKKyAgICAgICAgICAgICAgICAgICAgcGF0aD0iL3VzZXJzL2RlbGV0ZUdyb3Vwcy5qc3AiCisgICAgICAgICAgICAgICAgcmVkaXJlY3Q9ImZhbHNlIi8+CisKKyAgICA8Zm9yd2FyZCAgICAgICAgbmFtZT0iR3JvdXBzIExpc3QiCisgICAgICAgICAgICAgICAgICAgIHBhdGg9Ii91c2Vycy9saXN0R3JvdXBzLmpzcCIKKyAgICAgICAgICAgICAgICByZWRpcmVjdD0iZmFsc2UiLz4KKworICAgIDxmb3J3YXJkICAgICAgICBuYW1lPSJHcm91cHMgTGlzdCBTZXR1cCIKKyAgICAgICAgICAgICAgICAgICAgcGF0aD0iL3VzZXJzL2xpc3RHcm91cHMuZG8/Zm9yd2FyZD1Hcm91cHMrTGlzdCIKKyAgICAgICAgICAgICAgICByZWRpcmVjdD0iZmFsc2UiLz4KKworICAgIDxmb3J3YXJkICAgICAgICBuYW1lPSJSb2xlIgorICAgICAgICAgICAgICAgICAgICBwYXRoPSIvdXNlcnMvcm9sZS5qc3AiCisgICAgICAgICAgICAgICAgcmVkaXJlY3Q9ImZhbHNlIi8+CisKKyAgICA8Zm9yd2FyZCAgICAgICAgbmFtZT0iUm9sZXMgRGVsZXRlIExpc3QiCisgICAgICAgICAgICAgICAgICAgIHBhdGg9Ii91c2Vycy9kZWxldGVSb2xlcy5qc3AiCisgICAgICAgICAgICAgICAgcmVkaXJlY3Q9ImZhbHNlIi8+CisKKyAgICA8Zm9yd2FyZCAgICAgICAgbmFtZT0iUm9sZXMgTGlzdCIKKyAgICAgICAgICAgICAgICAgICAgcGF0aD0iL3VzZXJzL2xpc3RSb2xlcy5qc3AiCisgICAgICAgICAgICAgICAgcmVkaXJlY3Q9ImZhbHNlIi8+CisKKyAgICA8Zm9yd2FyZCAgICAgICAgbmFtZT0iUm9sZXMgTGlzdCBTZXR1cCIKKyAgICAgICAgICAgICAgICAgICAgcGF0aD0iL3VzZXJzL2xpc3RSb2xlcy5kbz9mb3J3YXJkPVJvbGVzK0xpc3QiCisgICAgICAgICAgICAgICAgcmVkaXJlY3Q9ImZhbHNlIi8+CisKKyAgICA8Zm9yd2FyZCAgICAgICAgbmFtZT0iVXNlciIKKyAgICAgICAgICAgICAgICAgICAgcGF0aD0iL3VzZXJzL3VzZXIuanNwIgorICAgICAgICAgICAgICAgIHJlZGlyZWN0PSJmYWxzZSIvPgorCisgICAgPGZvcndhcmQgICAgICAgIG5hbWU9IlVzZXJzIERlbGV0ZSBMaXN0IgorICAgICAgICAgICAgICAgICAgICBwYXRoPSIvdXNlcnMvZGVsZXRlVXNlcnMuanNwIgorICAgICAgICAgICAgICAgIHJlZGlyZWN0PSJmYWxzZSIvPgorCisgICAgPGZvcndhcmQgICAgICAgIG5hbWU9IlVzZXJzIExpc3QiCisgICAgICAgICAgICAgICAgICAgIHBhdGg9Ii91c2Vycy9saXN0VXNlcnMuanNwIgorICAgICAgICAgICAgICAgIHJlZGlyZWN0PSJmYWxzZSIvPgorCisgICAgPGZvcndhcmQgICAgICAgIG5hbWU9IlVzZXJzIExpc3QgU2V0dXAiCisgICAgICAgICAgICAgICAgICAgIHBhdGg9Ii91c2Vycy9saXN0VXNlcnMuZG8/Zm9yd2FyZD1Vc2VycytMaXN0IgorICAgICAgICAgICAgICAgIHJlZGlyZWN0PSJmYWxzZSIvPgorCisgICAgPCEtLSA9PT09PT09PT09ID09PT09PT09PT09PT09PT09PT09ID09PT09PT09PT0gLS0+CisKKworICA8L2dsb2JhbC1mb3J3YXJkcz4KKworCisgIDwhLS0gPT09PT09PT09PSBBY3Rpb24gTWFwcGluZyBEZWZpbml0aW9ucyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKyAgPGFjdGlvbi1tYXBwaW5ncz4KKworICAgIDwhLS0gRHVtcCByZWdpc3RyeSBpbmZvcm1hdGlvbiAoZGVidWdnaW5nKSAtLT4KKyAgICA8YWN0aW9uICAgIHBhdGg9Ii9kdW1wUmVnaXN0cnkiCisgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5EdW1wUmVnaXN0cnlBY3Rpb24iLz4KKworICAgIDwhLS0gRHVtcCBNQmVhbiBzZXJ2ZXIgaW5mb3JtYXRpb24gKGRlYnVnZ2luZykgLS0+CisgICAgPGFjdGlvbiAgICBwYXRoPSIvZHVtcFNlcnZlciIKKyAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkR1bXBTZXJ2ZXJBY3Rpb24iLz4KKworICAgIDwhLS0gU2V0IHVwIFRyZWUgZGF0YXN0cnVjdHVyZSAtLT4KKyAgICA8YWN0aW9uICAgIHBhdGg9Ii9zZXRVcFRyZWUiCisgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5TZXRVcFRyZWVBY3Rpb24iPgorICAgICAgPGZvcndhcmQgICAgICAgIG5hbWU9IlNldFVwVHJlZSIKKyAgICAgICAgICAgICAgICAgICAgICBwYXRoPSIvdHJlZS1jb250cm9sLXRlc3QuanNwIgorICAgICAgICAgICAgICAgICAgcmVkaXJlY3Q9InRydWUiLz4KKyAgICA8L2FjdGlvbj4KKworICAgIDwhLS0gTG9nIG91dCBvZiB0aGUgYXBwbGljYXRpb24gLS0+CisgICAgPGFjdGlvbiAgICBwYXRoPSIvbG9nT3V0IgorICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uTG9nT3V0QWN0aW9uIj4KKyAgICAgIDxmb3J3YXJkICAgICAgICBuYW1lPSJNYWluIE1lbnUiCisgICAgICAgICAgICAgICAgICAgICAgcGF0aD0iL2luZGV4LmpzcCIKKyAgICAgICAgICAgICAgICAgIHJlZGlyZWN0PSJ0cnVlIi8+CisgICAgPC9hY3Rpb24+CisKKyAgICA8IS0tIFNhdmUgY3VycmVudCBzZXR0aW5ncyB0byBzZXJ2ZXIueG1sIC0tPgorICAgIDxhY3Rpb24gICAgcGF0aD0iL2NvbW1pdENoYW5nZXMiCisgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5Db21taXRDaGFuZ2VzQWN0aW9uIj4KKyAgICAgIDxmb3J3YXJkICAgICAgICBuYW1lPSJCYW5uZXIiCisgICAgICAgICAgICAgICAgICAgICAgcGF0aD0iL2Jhbm5lci5qc3AiCisgICAgICAgICAgICAgICAgICByZWRpcmVjdD0idHJ1ZSIvPgorICAgIDwvYWN0aW9uPgorCisgICAgPCEtLSBQcm9jZXNzIGEgc2V0LWxvY2FsZSBhY3Rpb24gLS0+CisgICAgPGFjdGlvbiAgICBwYXRoPSIvc2V0TG9jYWxlIgorICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uU2V0TG9jYWxlQWN0aW9uIgorICAgICAgICAgICAgICAgbmFtZT0ic2V0TG9jYWxlRm9ybSIKKyAgICAgICAgICAgICAgc2NvcGU9InNlc3Npb24iPgorICAgIDwvYWN0aW9uPgorCisgICAgPCEtLSBUcmVlIGNvbnRyb2wgdGVzdCBhY3Rpb24gLS0+CisgICAgPGFjdGlvbiAgICBwYXRoPSIvdHJlZUNvbnRyb2xUZXN0IgorICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uVHJlZUNvbnRyb2xUZXN0QWN0aW9uIi8+CisKKyAgIDwhLS0gPT09PT09PT09PT09PSBTZXJ2ZXIgTW9kdWxlID09PT09PT09PT09PT09IC0tPgorCisgICAgPCEtLSBTZXQgdXAgRWRpdCBTZXJ2ZXIgdHJhbnNhY3Rpb24gLS0+CisgICAgPGFjdGlvbiAgICBwYXRoPSIvRWRpdFNlcnZlciIKKyAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnNlcnZlci5FZGl0U2VydmVyQWN0aW9uIj4KKyAgICA8L2FjdGlvbj4KKworICAgIDwhLS0gUGVyZm9ybSBTYXZlIFNlcnZlciB0cmFuc2FjdGlvbiAtLT4KKyAgICA8YWN0aW9uICAgIHBhdGg9Ii9TYXZlU2VydmVyIgorICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uc2VydmVyLlNhdmVTZXJ2ZXJBY3Rpb24iCisgICAgICAgICAgICAgICBuYW1lPSJzZXJ2ZXJGb3JtIgorICAgICAgICAgICAgICBpbnB1dD0iL3NlcnZlci9zZXJ2ZXIuanNwIgorICAgICAgICAgICAgICAgc2NvcGU9InNlc3Npb24iLz4KKworICAgIDwhLS0gPT09PT09PT09PT09PSBTZXJ2aWNlIE1vZHVsZSA9PT09PT09PT09PT09PSAtLT4KKworICAgIDwhLS0gU2V0IHVwIEFkZCBTZXJ2aWNlIHRyYW5zYWN0aW9uIC0tPgorICAgIDxhY3Rpb24gICAgcGF0aD0iL0FkZFNlcnZpY2UiCisgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5zZXJ2aWNlLkFkZFNlcnZpY2VBY3Rpb24iPgorICAgIDwvYWN0aW9uPgorCisgICAgPCEtLSBTZXQgdXAgRGVsZXRlIFNlcnZpY2VzIHRyYW5zYWN0aW9uIC0tPgorICAgIDxhY3Rpb24gICAgcGF0aD0iL0RlbGV0ZVNlcnZpY2UiCisgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5zZXJ2aWNlLkRlbGV0ZVNlcnZpY2VBY3Rpb24iCisgICAgICAgICAgICAgICBuYW1lPSJzZXJ2aWNlc0Zvcm0iCisgICAgICAgICAgICAgICBzY29wZT0icmVxdWVzdCIvPgorCisgICAgPCEtLSBQZXJmb3JtIERlbGV0ZSBTZXJ2aWNlcyB0cmFuc2FjdGlvbiAtLT4KKyAgICA8YWN0aW9uICAgIHBhdGg9Ii9EZWxldGVTZXJ2aWNlcyIKKyAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnNlcnZpY2UuRGVsZXRlU2VydmljZXNBY3Rpb24iCisgICAgICAgICAgICAgICBuYW1lPSJzZXJ2aWNlc0Zvcm0iCisgICAgICAgICAgICAgICBzY29wZT0icmVxdWVzdCIvPgorCisgICAgPCEtLSBTZXQgdXAgRWRpdCBTZXJ2aWNlIHRyYW5zYWN0aW9uIC0tPgorICAgIDxhY3Rpb24gICAgcGF0aD0iL0VkaXRTZXJ2aWNlIgorICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uc2VydmljZS5FZGl0U2VydmljZUFjdGlvbiI+CisgICAgPC9hY3Rpb24+CisKKyAgICA8IS0tIFBlcmZvcm0gU2F2ZSBTZXJ2aWNlIHRyYW5zYWN0aW9uIC0tPgorICAgIDxhY3Rpb24gICAgcGF0aD0iL1NhdmVTZXJ2aWNlIgorICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uc2VydmljZS5TYXZlU2VydmljZUFjdGlvbiIKKyAgICAgICAgICAgICAgIG5hbWU9InNlcnZpY2VGb3JtIgorICAgICAgICAgICAgICBpbnB1dD0iL3NlcnZpY2Uvc2VydmljZS5qc3AiCisgICAgICAgICAgICAgICBzY29wZT0ic2Vzc2lvbiIvPgorCisgICAgPCEtLSA9PT09PT09PT09PT09IEhvc3QgTW9kdWxlID09PT09PT09PT09PT09IC0tPgorCisgICAgPCEtLSBTZXQgdXAgQWRkIEhvc3QgdHJhbnNhY3Rpb24gLS0+CisgICAgPGFjdGlvbiAgICBwYXRoPSIvQWRkSG9zdCIKKyAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLmhvc3QuQWRkSG9zdEFjdGlvbiI+CisgICAgPC9hY3Rpb24+CisKKyAgICA8IS0tIFNldCB1cCBEZWxldGUgSG9zdHMgdHJhbnNhY3Rpb24gLS0+CisgICAgPGFjdGlvbiAgICBwYXRoPSIvRGVsZXRlSG9zdCIKKyAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLmhvc3QuRGVsZXRlSG9zdEFjdGlvbiIKKyAgICAgICAgICAgICAgIG5hbWU9Imhvc3RzRm9ybSIKKyAgICAgICAgICAgICAgIHNjb3BlPSJyZXF1ZXN0Ii8+CisKKyAgICA8IS0tIFBlcmZvcm0gRGVsZXRlIEhvc3RzIHRyYW5zYWN0aW9uIC0tPgorICAgIDxhY3Rpb24gICAgcGF0aD0iL0RlbGV0ZUhvc3RzIgorICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uaG9zdC5EZWxldGVIb3N0c0FjdGlvbiIKKyAgICAgICAgICAgICAgIG5hbWU9Imhvc3RzRm9ybSIKKyAgICAgICAgICAgICAgIHNjb3BlPSJyZXF1ZXN0Ii8+CisKKyAgICA8IS0tIFNldCB1cCBFZGl0IEhvc3QgdHJhbnNhY3Rpb24gLS0+CisgICAgPGFjdGlvbiAgICBwYXRoPSIvRWRpdEhvc3QiCisgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5ob3N0LkVkaXRIb3N0QWN0aW9uIj4KKyAgICA8L2FjdGlvbj4KKworICAgIDwhLS0gUGVyZm9ybSBTYXZlIEhvc3QgdHJhbnNhY3Rpb24gLS0+CisgICAgPGFjdGlvbiAgICBwYXRoPSIvU2F2ZUhvc3QiCisgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5ob3N0LlNhdmVIb3N0QWN0aW9uIgorICAgICAgICAgICAgICAgbmFtZT0iaG9zdEZvcm0iCisgICAgICAgICAgICAgIGlucHV0PSIvaG9zdC9ob3N0LmpzcCIKKyAgICAgICAgICAgICAgIHNjb3BlPSJzZXNzaW9uIi8+CisgICAgICAgICAgICAgICAKKyAgICA8IS0tIFNldCB1cCBBZGQgQWxpYXMgdHJhbnNhY3Rpb24gLS0+CisgICAgPGFjdGlvbiAgICBwYXRoPSIvQWRkQWxpYXMiCisgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5ob3N0LkFkZEFsaWFzQWN0aW9uIj4KKyAgICA8L2FjdGlvbj4KKworICAgIDwhLS0gUGVyZm9ybSBEZWxldGUgQWxpYXNlcyB0cmFuc2FjdGlvbiAtLT4KKyAgICA8YWN0aW9uICAgIHBhdGg9Ii9EZWxldGVBbGlhcyIKKyAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLmhvc3QuRGVsZXRlQWxpYXNBY3Rpb24iCisgICAgICAgICAgICAgICBuYW1lPSJhbGlhc2VzRm9ybSIKKyAgICAgICAgICAgICAgIHNjb3BlPSJyZXF1ZXN0Ii8+CisgICAgICAgICAgICAgICAKKyAgICA8IS0tIFBlcmZvcm0gRGVsZXRlIEFsaWFzZXMgdHJhbnNhY3Rpb24gLS0+CisgICAgPGFjdGlvbiAgICBwYXRoPSIvRGVsZXRlQWxpYXNlcyIKKyAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLmhvc3QuRGVsZXRlQWxpYXNlc0FjdGlvbiIKKyAgICAgICAgICAgICAgIG5hbWU9ImFsaWFzZXNGb3JtIgorICAgICAgICAgICAgICAgc2NvcGU9InJlcXVlc3QiLz4KKyAgICAgICAgICAgICAgIAorICAgIDwhLS0gUGVyZm9ybSBTYXZlIEhvc3QgdHJhbnNhY3Rpb24gLS0+CisgICAgPGFjdGlvbiAgICBwYXRoPSIvU2F2ZUFsaWFzIgorICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uaG9zdC5TYXZlQWxpYXNBY3Rpb24iCisgICAgICAgICAgICAgICBuYW1lPSJhbGlhc0Zvcm0iCisgICAgICAgICAgICAgIGlucHV0PSIvaG9zdC9hbGlhcy5qc3AiCisgICAgICAgICAgICAgICBzY29wZT0ic2Vzc2lvbiIvPgorCisgICAgPCEtLSA9PT09PT09PT09PT09IFJlYWxtIE1vZHVsZSA9PT09PT09PT09PT09PSAtLT4KKworICAgIDwhLS0gU2V0IHVwIEFkZCBSZWFsbSB0cmFuc2FjdGlvbiAtLT4KKyAgICA8YWN0aW9uICAgIHBhdGg9Ii9BZGRSZWFsbSIKKyAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnJlYWxtLkFkZFJlYWxtQWN0aW9uIj4KKyAgICA8L2FjdGlvbj4KKworICAgIDwhLS0gU2V0IHVwIEFkZCBSZWFsbSB0cmFuc2FjdGlvbiAtLT4KKyAgICA8YWN0aW9uICAgIHBhdGg9Ii9yZWFsbS9BZGRSZWFsbSIKKyAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnJlYWxtLkFkZFJlYWxtQWN0aW9uIj4KKyAgICA8L2FjdGlvbj4KKworICAgIDwhLS0gU2V0IHVwIERlbGV0ZSBSZWFsbXMgdHJhbnNhY3Rpb24gLS0+CisgICAgPGFjdGlvbiAgICBwYXRoPSIvRGVsZXRlUmVhbG0iCisgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5yZWFsbS5EZWxldGVSZWFsbUFjdGlvbiIKKyAgICAgICAgICAgICAgIG5hbWU9InJlYWxtc0Zvcm0iCisgICAgICAgICAgICAgICBzY29wZT0icmVxdWVzdCIvPgorCisgICAgPCEtLSBQZXJmb3JtIERlbGV0ZSBSZWFsbXMgdHJhbnNhY3Rpb24gLS0+CisgICAgPGFjdGlvbiAgICBwYXRoPSIvRGVsZXRlUmVhbG1zIgorICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVhbG0uRGVsZXRlUmVhbG1zQWN0aW9uIgorICAgICAgICAgICAgICAgbmFtZT0icmVhbG1zRm9ybSIKKyAgICAgICAgICAgICAgIHNjb3BlPSJyZXF1ZXN0Ii8+CisKKyAgICA8IS0tIFNldCB1cCBFZGl0IFJlYWxtIHRyYW5zYWN0aW9uIChnZW5lcmljKSAtLT4KKyAgICA8YWN0aW9uICAgIHBhdGg9Ii9FZGl0UmVhbG0iCisgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5yZWFsbS5FZGl0UmVhbG1BY3Rpb24iPgorICAgIDwvYWN0aW9uPgorCisgICAgPCEtLSBQZXJmb3JtIFNhdmUgVXNlckRhdGFiYXNlIFJlYWxtIHRyYW5zYWN0aW9uIC0tPgorICAgIDxhY3Rpb24gICAgcGF0aD0iL1NhdmVVc2VyRGF0YWJhc2VSZWFsbSIKKyAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnJlYWxtLlNhdmVVc2VyRGF0YWJhc2VSZWFsbUFjdGlvbiIKKyAgICAgICAgICAgICAgIG5hbWU9InVzZXJEYXRhYmFzZVJlYWxtRm9ybSIKKyAgICAgICAgICAgICAgaW5wdXQ9Ii9yZWFsbS91c2VyRGF0YWJhc2VSZWFsbS5qc3AiCisgICAgICAgICAgICAgICBzY29wZT0ic2Vzc2lvbiIvPgorCisgICA8IS0tIFBlcmZvcm0gU2F2ZSBEYXRhU291cmNlIFJlYWxtIHRyYW5zYWN0aW9uIC0tPgorICAgIDxhY3Rpb24gICAgcGF0aD0iL1NhdmVEYXRhU291cmNlUmVhbG0iCisgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5yZWFsbS5TYXZlRGF0YVNvdXJjZVJlYWxtQWN0aW9uIgorICAgICAgICAgICAgICAgbmFtZT0iZGF0YVNvdXJjZVJlYWxtRm9ybSIKKyAgICAgICAgICAgICAgaW5wdXQ9Ii9yZWFsbS9kYXRhU291cmNlUmVhbG0uanNwIgorICAgICAgICAgICAgICAgc2NvcGU9InNlc3Npb24iLz4KKworICAgPCEtLSBQZXJmb3JtIFNhdmUgSkRCQyBSZWFsbSB0cmFuc2FjdGlvbiAtLT4KKyAgICA8YWN0aW9uICAgIHBhdGg9Ii9TYXZlSkRCQ1JlYWxtIgorICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVhbG0uU2F2ZUpEQkNSZWFsbUFjdGlvbiIKKyAgICAgICAgICAgICAgIG5hbWU9ImpkYmNSZWFsbUZvcm0iCisgICAgICAgICAgICAgIGlucHV0PSIvcmVhbG0vamRiY1JlYWxtLmpzcCIKKyAgICAgICAgICAgICAgIHNjb3BlPSJzZXNzaW9uIi8+CisKKyAgICA8IS0tIFBlcmZvcm0gU2F2ZSBKTkRJIFJlYWxtIHRyYW5zYWN0aW9uIC0tPgorICAgIDxhY3Rpb24gICAgcGF0aD0iL1NhdmVKTkRJUmVhbG0iCisgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5yZWFsbS5TYXZlSk5ESVJlYWxtQWN0aW9uIgorICAgICAgICAgICAgICAgbmFtZT0iam5kaVJlYWxtRm9ybSIKKyAgICAgICAgICAgICAgaW5wdXQ9Ii9yZWFsbS9qbmRpUmVhbG0uanNwIgorICAgICAgICAgICAgICAgc2NvcGU9InNlc3Npb24iLz4KKworICAgIDwhLS0gUGVyZm9ybSBTYXZlIE1lbW9yeSB0cmFuc2FjdGlvbiAtLT4KKyAgICA8YWN0aW9uICAgIHBhdGg9Ii9TYXZlTWVtb3J5UmVhbG0iCisgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5yZWFsbS5TYXZlTWVtb3J5UmVhbG1BY3Rpb24iCisgICAgICAgICAgICAgICBuYW1lPSJtZW1vcnlSZWFsbUZvcm0iCisgICAgICAgICAgICAgIGlucHV0PSIvcmVhbG0vbWVtb3J5UmVhbG0uanNwIgorICAgICAgICAgICAgICAgc2NvcGU9InNlc3Npb24iLz4KKyAgICAgICAgICAgICAgIAorICAgPCEtLSA9PT09PT09PT09PT09IENvbnRleHQgTW9kdWxlID09PT09PT09PT09PT09IC0tPgorCisgICAgPCEtLSBTZXQgdXAgQWRkIENvbnRleHQgdHJhbnNhY3Rpb24gLS0+CisgICAgPGFjdGlvbiAgICBwYXRoPSIvQWRkQ29udGV4dCIKKyAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLmNvbnRleHQuQWRkQ29udGV4dEFjdGlvbiI+CisgICAgPC9hY3Rpb24+CisKKyAgICA8IS0tIFNldCB1cCBEZWxldGUgQ29udGV4dHMgdHJhbnNhY3Rpb24gLS0+CisgICAgPGFjdGlvbiAgICBwYXRoPSIvRGVsZXRlQ29udGV4dCIKKyAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLmNvbnRleHQuRGVsZXRlQ29udGV4dEFjdGlvbiIKKyAgICAgICAgICAgICAgIG5hbWU9ImNvbnRleHRzRm9ybSIKKyAgICAgICAgICAgICAgIHNjb3BlPSJyZXF1ZXN0Ii8+CisKKyAgICA8IS0tIFBlcmZvcm0gRGVsZXRlIENvbnRleHRzIHRyYW5zYWN0aW9uIC0tPgorICAgIDxhY3Rpb24gICAgcGF0aD0iL0RlbGV0ZUNvbnRleHRzIgorICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uY29udGV4dC5EZWxldGVDb250ZXh0c0FjdGlvbiIKKyAgICAgICAgICAgICAgIG5hbWU9ImNvbnRleHRzRm9ybSIKKyAgICAgICAgICAgICAgIHNjb3BlPSJyZXF1ZXN0Ii8+CisKKyAgICA8IS0tIFNldCB1cCBFZGl0IENvbnRleHQgdHJhbnNhY3Rpb24gLS0+CisgICAgPGFjdGlvbiAgICBwYXRoPSIvRWRpdENvbnRleHQiCisgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5jb250ZXh0LkVkaXRDb250ZXh0QWN0aW9uIj4KKyAgICA8L2FjdGlvbj4KKworICAgIDwhLS0gUGVyZm9ybSBTYXZlIENvbnRleHQgdHJhbnNhY3Rpb24gLS0+CisgICAgPGFjdGlvbiAgICBwYXRoPSIvU2F2ZUNvbnRleHQiCisgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5jb250ZXh0LlNhdmVDb250ZXh0QWN0aW9uIgorICAgICAgICAgICAgICAgbmFtZT0iY29udGV4dEZvcm0iCisgICAgICAgICAgICAgIGlucHV0PSIvY29udGV4dC9jb250ZXh0LmpzcCIKKyAgICAgICAgICAgICAgIHNjb3BlPSJzZXNzaW9uIi8+CisgICAgICAgICAgICAgICAKKyAgIDwhLS0gPT09PT09PT09PT09PSBEZWZhdWx0Q29udGV4dCBNb2R1bGUgPT09PT09PT09PT09PT0gLS0+CisKKyAgICA8IS0tIFNldCB1cCBBZGQgRGVmYXVsdENvbnRleHQgdHJhbnNhY3Rpb24gLS0+CisgICAgPGFjdGlvbiAgICBwYXRoPSIvQWRkRGVmYXVsdENvbnRleHQiCisgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5kZWZhdWx0Y29udGV4dC5BZGREZWZhdWx0Q29udGV4dEFjdGlvbiI+CisgICAgPC9hY3Rpb24+CisKKyAgICA8IS0tIFNldCB1cCBEZWxldGUgRGVmYXVsdENvbnRleHRzIHRyYW5zYWN0aW9uIC0tPgorICAgIDxhY3Rpb24gICAgcGF0aD0iL0RlbGV0ZURlZmF1bHRDb250ZXh0IgorICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uZGVmYXVsdGNvbnRleHQuRGVsZXRlRGVmYXVsdENvbnRleHRBY3Rpb24iCisgICAgICAgICAgICAgICBuYW1lPSJkZWZhdWx0Q29udGV4dHNGb3JtIgorICAgICAgICAgICAgICAgc2NvcGU9InJlcXVlc3QiLz4KKworICAgIDwhLS0gUGVyZm9ybSBEZWxldGUgRGVmYXVsdENvbnRleHRzIHRyYW5zYWN0aW9uIC0tPgorICAgIDxhY3Rpb24gICAgcGF0aD0iL0RlbGV0ZURlZmF1bHRDb250ZXh0cyIKKyAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLmRlZmF1bHRjb250ZXh0LkRlbGV0ZURlZmF1bHRDb250ZXh0c0FjdGlvbiIKKyAgICAgICAgICAgICAgIG5hbWU9ImRlZmF1bHRDb250ZXh0c0Zvcm0iCisgICAgICAgICAgICAgICBzY29wZT0icmVxdWVzdCIvPgorCisgICAgPCEtLSBTZXQgdXAgRWRpdCBEZWZhdWx0Q29udGV4dCB0cmFuc2FjdGlvbiAtLT4KKyAgICA8YWN0aW9uICAgIHBhdGg9Ii9FZGl0RGVmYXVsdENvbnRleHQiCisgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5kZWZhdWx0Y29udGV4dC5FZGl0RGVmYXVsdENvbnRleHRBY3Rpb24iPgorICAgIDwvYWN0aW9uPgorCisgICAgPCEtLSBQZXJmb3JtIFNhdmUgRGVmYXVsdENvbnRleHQgdHJhbnNhY3Rpb24gLS0+CisgICAgPGFjdGlvbiAgICBwYXRoPSIvU2F2ZURlZmF1bHRDb250ZXh0IgorICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uZGVmYXVsdGNvbnRleHQuU2F2ZURlZmF1bHRDb250ZXh0QWN0aW9uIgorICAgICAgICAgICAgICAgbmFtZT0iZGVmYXVsdENvbnRleHRGb3JtIgorICAgICAgICAgICAgICAgaW5wdXQ9Ii9kZWZhdWx0Y29udGV4dC9kZWZhdWx0Y29udGV4dC5qc3AiCisgICAgICAgICAgICAgICBzY29wZT0ic2Vzc2lvbiIvPgorCisgICA8IS0tID09PT09PT09PT09PT0gQ29ubmVjdG9yIE1vZHVsZSA9PT09PT09PT09PT09PSAtLT4KKworICAgIDwhLS0gU2V0IHVwIEFkZCBDb25uZWN0b3IgdHJhbnNhY3Rpb24gLS0+CisgICAgPGFjdGlvbiAgICBwYXRoPSIvQWRkQ29ubmVjdG9yIgorICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uY29ubmVjdG9yLkFkZENvbm5lY3RvckFjdGlvbiI+CisgICAgPC9hY3Rpb24+CisKKyAgICA8IS0tIFNldCB1cCBBZGQgQ29ubmVjdG9yIHRyYW5zYWN0aW9uIC0tPgorICAgIDxhY3Rpb24gICAgcGF0aD0iL2Nvbm5lY3Rvci9BZGRDb25uZWN0b3IiCisgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5jb25uZWN0b3IuQWRkQ29ubmVjdG9yQWN0aW9uIj4KKyAgICA8L2FjdGlvbj4KKworICAgIDwhLS0gU2V0IHVwIERlbGV0ZSBDb25uZWN0b3JzIHRyYW5zYWN0aW9uIC0tPgorICAgIDxhY3Rpb24gICAgcGF0aD0iL0RlbGV0ZUNvbm5lY3RvciIKKyAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLmNvbm5lY3Rvci5EZWxldGVDb25uZWN0b3JBY3Rpb24iCisgICAgICAgICAgICAgICBuYW1lPSJjb25uZWN0b3JzRm9ybSIKKyAgICAgICAgICAgICAgIHNjb3BlPSJyZXF1ZXN0Ii8+CisKKyAgICA8IS0tIFBlcmZvcm0gRGVsZXRlIENvbm5lY3RvcnMgdHJhbnNhY3Rpb24gLS0+CisgICAgPGFjdGlvbiAgICBwYXRoPSIvRGVsZXRlQ29ubmVjdG9ycyIKKyAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLmNvbm5lY3Rvci5EZWxldGVDb25uZWN0b3JzQWN0aW9uIgorICAgICAgICAgICAgICAgbmFtZT0iY29ubmVjdG9yc0Zvcm0iCisgICAgICAgICAgICAgICBzY29wZT0icmVxdWVzdCIvPgorCisgICAgPCEtLSBTZXQgdXAgRWRpdCBDb25uZWN0b3IgdHJhbnNhY3Rpb24gLS0+CisgICAgPGFjdGlvbiAgICBwYXRoPSIvRWRpdENvbm5lY3RvciIKKyAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLmNvbm5lY3Rvci5FZGl0Q29ubmVjdG9yQWN0aW9uIj4KKyAgICA8L2FjdGlvbj4KKworICAgIDwhLS0gUGVyZm9ybSBTYXZlIENvbm5lY3RvciB0cmFuc2FjdGlvbiAtLT4KKyAgICA8YWN0aW9uICAgIHBhdGg9Ii9TYXZlQ29ubmVjdG9yIgorICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4uY29ubmVjdG9yLlNhdmVDb25uZWN0b3JBY3Rpb24iCisgICAgICAgICAgICAgICBuYW1lPSJjb25uZWN0b3JGb3JtIgorICAgICAgICAgICAgICBpbnB1dD0iL2Nvbm5lY3Rvci9jb25uZWN0b3IuanNwIgorICAgICAgICAgICAgICAgc2NvcGU9InNlc3Npb24iLz4KKyAgICAgICAgICAgICAgIAorICAgPCEtLSA9PT09PT09PT09PT09IFZhbHZlIE1vZHVsZSA9PT09PT09PT09PT09PSAtLT4KKworICAgIDwhLS0gU2V0IHVwIEFkZCBWYWx2ZSB0cmFuc2FjdGlvbiAtLT4KKyAgICA8YWN0aW9uICAgIHBhdGg9Ii9BZGRWYWx2ZSIKKyAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnZhbHZlLkFkZFZhbHZlQWN0aW9uIj4KKyAgICA8L2FjdGlvbj4KKworICAgIDwhLS0gU2V0IHVwIEFkZCBWYWx2ZSB0cmFuc2FjdGlvbiAtLT4KKyAgICA8YWN0aW9uICAgIHBhdGg9Ii92YWx2ZS9BZGRWYWx2ZSIKKyAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnZhbHZlLkFkZFZhbHZlQWN0aW9uIj4KKyAgICA8L2FjdGlvbj4KKworICAgIDwhLS0gU2V0IHVwIERlbGV0ZSBWYWx2ZXMgdHJhbnNhY3Rpb24gLS0+CisgICAgPGFjdGlvbiAgICBwYXRoPSIvRGVsZXRlVmFsdmUiCisgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi52YWx2ZS5EZWxldGVWYWx2ZUFjdGlvbiIKKyAgICAgICAgICAgICAgIG5hbWU9InZhbHZlc0Zvcm0iCisgICAgICAgICAgICAgICBzY29wZT0icmVxdWVzdCIvPgorCisgICAgPCEtLSBQZXJmb3JtIERlbGV0ZSBWYWx2ZXMgdHJhbnNhY3Rpb24gLS0+CisgICAgPGFjdGlvbiAgICBwYXRoPSIvRGVsZXRlVmFsdmVzIgorICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4udmFsdmUuRGVsZXRlVmFsdmVzQWN0aW9uIgorICAgICAgICAgICAgICAgbmFtZT0idmFsdmVzRm9ybSIKKyAgICAgICAgICAgICAgIHNjb3BlPSJyZXF1ZXN0Ii8+CisKKyAgICA8IS0tIFNldCB1cCBFZGl0IFZhbHZlIHRyYW5zYWN0aW9uIChnZW5lcmljKSAtLT4KKyAgICA8YWN0aW9uICAgIHBhdGg9Ii9FZGl0VmFsdmUiCisgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi52YWx2ZS5FZGl0VmFsdmVBY3Rpb24iPgorICAgIDwvYWN0aW9uPgorICAgIAorICAgIDwhLS0gUGVyZm9ybSBTYXZlIEFjY2Vzc0xvZyBWYWx2ZSB0cmFuc2FjdGlvbiAtLT4KKyAgICA8YWN0aW9uICAgIHBhdGg9Ii9TYXZlQWNjZXNzTG9nVmFsdmUiCisgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi52YWx2ZS5TYXZlQWNjZXNzTG9nVmFsdmVBY3Rpb24iCisgICAgICAgICAgICAgICBuYW1lPSJhY2Nlc3NMb2dWYWx2ZUZvcm0iCisgICAgICAgICAgICAgIGlucHV0PSIvdmFsdmUvYWNjZXNzTG9nVmFsdmUuanNwIgorICAgICAgICAgICAgICAgc2NvcGU9InNlc3Npb24iLz4KKworICAgPCEtLSBQZXJmb3JtIFNhdmUgUmVtb3RlIEFkZHIgVmFsdmUgdHJhbnNhY3Rpb24gLS0+CisgICAgPGFjdGlvbiAgICBwYXRoPSIvU2F2ZVJlbW90ZUFkZHJWYWx2ZSIKKyAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnZhbHZlLlNhdmVSZW1vdGVBZGRyVmFsdmVBY3Rpb24iCisgICAgICAgICAgICAgICBuYW1lPSJyZW1vdGVBZGRyVmFsdmVGb3JtIgorICAgICAgICAgICAgICBpbnB1dD0iL3ZhbHZlL3JlbW90ZUFkZHJWYWx2ZS5qc3AiCisgICAgICAgICAgICAgICBzY29wZT0ic2Vzc2lvbiIvPgorCisgICAgPCEtLSBQZXJmb3JtIFNhdmUgUmVtb3RlIEhvc3QgVmFsdmUgdHJhbnNhY3Rpb24gLS0+CisgICAgPGFjdGlvbiAgICBwYXRoPSIvU2F2ZVJlbW90ZUhvc3RWYWx2ZSIKKyAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnZhbHZlLlNhdmVSZW1vdGVIb3N0VmFsdmVBY3Rpb24iCisgICAgICAgICAgICAgICBuYW1lPSJyZW1vdGVIb3N0VmFsdmVGb3JtIgorICAgICAgICAgICAgICBpbnB1dD0iL3ZhbHZlL3JlbW90ZUhvc3RWYWx2ZS5qc3AiCisgICAgICAgICAgICAgICBzY29wZT0ic2Vzc2lvbiIvPgorCisgICAgPCEtLSBQZXJmb3JtIFNhdmUgUmVxdWVzdCBEdW1wZXIgVmFsdmUgdHJhbnNhY3Rpb24gLS0+CisgICAgPGFjdGlvbiAgICBwYXRoPSIvU2F2ZVJlcXVlc3REdW1wZXJWYWx2ZSIKKyAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnZhbHZlLlNhdmVSZXF1ZXN0RHVtcGVyVmFsdmVBY3Rpb24iCisgICAgICAgICAgICAgICBuYW1lPSJyZXF1ZXN0RHVtcGVyVmFsdmVGb3JtIgorICAgICAgICAgICAgICBpbnB1dD0iL3ZhbHZlL3JlcXVlc3REdW1wZXJWYWx2ZS5qc3AiCisgICAgICAgICAgICAgICBzY29wZT0ic2Vzc2lvbiIvPgorCisgICA8IS0tIFBlcmZvcm0gU2F2ZSBTaW5nbGUgU2lnbiBPbiBWYWx2ZSB0cmFuc2FjdGlvbiAtLT4KKyAgICA8YWN0aW9uICAgIHBhdGg9Ii9TYXZlU2luZ2xlU2lnbk9uIgorICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4udmFsdmUuU2F2ZVNpbmdsZVNpZ25PblZhbHZlQWN0aW9uIgorICAgICAgICAgICAgICAgbmFtZT0ic2luZ2xlU2lnbk9uVmFsdmVGb3JtIgorICAgICAgICAgICAgICBpbnB1dD0iL3ZhbHZlL3NpbmdsZVNpZ25PblZhbHZlLmpzcCIKKyAgICAgICAgICAgICAgIHNjb3BlPSJzZXNzaW9uIi8+CisgICAgICAgICAgICAgICAKKyAgIDwhLS0gPT09PT09PT09PSBSZXNvdXJjZXMgTW9kdWxlID09PT09PT09PT0gLS0+CisKKyAgIDxhY3Rpb24gICAgcGF0aD0iL3Jlc291cmNlcy9kZWxldGVFbnZFbnRyaWVzIgorICAgICAgICAgICAgICAgbmFtZT0iZW52RW50cmllc0Zvcm0iCisgICAgICAgICAgICAgIHNjb3BlPSJyZXF1ZXN0IgorICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVzb3VyY2VzLkRlbGV0ZUVudkVudHJpZXNBY3Rpb24iLz4KKworICAgPGFjdGlvbiAgICBwYXRoPSIvcmVzb3VyY2VzL2RlbGV0ZVVzZXJEYXRhYmFzZXMiCisgICAgICAgICAgICAgICBuYW1lPSJ1c2VyRGF0YWJhc2VzRm9ybSIKKyAgICAgICAgICAgICAgc2NvcGU9InJlcXVlc3QiCisgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5yZXNvdXJjZXMuRGVsZXRlVXNlckRhdGFiYXNlc0FjdGlvbiIvPgorICAgICAgCisgICAgPGFjdGlvbiAgICBwYXRoPSIvcmVzb3VyY2VzL2RlbGV0ZURhdGFTb3VyY2VzIgorICAgICAgICAgICAgICAgbmFtZT0iZGF0YVNvdXJjZXNGb3JtIgorICAgICAgICAgICAgICBzY29wZT0icmVxdWVzdCIKKyAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnJlc291cmNlcy5EZWxldGVEYXRhU291cmNlc0FjdGlvbiIvPgorCisgICAgPGFjdGlvbiAgICBwYXRoPSIvcmVzb3VyY2VzL2RlbGV0ZU1haWxTZXNzaW9ucyIKKyAgICAgICAgICAgICAgIG5hbWU9Im1haWxTZXNzaW9uc0Zvcm0iCisgICAgICAgICAgICAgIHNjb3BlPSJyZXF1ZXN0IgorICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVzb3VyY2VzLkRlbGV0ZU1haWxTZXNzaW9uc0FjdGlvbiIvPgorCisgICAgPGFjdGlvbiAgICBwYXRoPSIvcmVzb3VyY2VzL2RlbGV0ZVJlc291cmNlTGlua3MiCisgICAgICAgICAgICAgICBuYW1lPSJyZXNvdXJjZUxpbmtzRm9ybSIKKyAgICAgICAgICAgICAgc2NvcGU9InJlcXVlc3QiCisgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5yZXNvdXJjZXMuRGVsZXRlUmVzb3VyY2VMaW5rc0FjdGlvbiIvPgorICAgICAgICAgICAgICAgCisgICAgPGFjdGlvbiAgICBwYXRoPSIvcmVzb3VyY2VzL2xpc3RFbnZFbnRyaWVzIgorICAgICAgICAgICAgICAgbmFtZT0iZW52RW50cmllc0Zvcm0iCisgICAgICAgICAgICAgIHNjb3BlPSJyZXF1ZXN0IgorICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVzb3VyY2VzLkxpc3RFbnZFbnRyaWVzQWN0aW9uIi8+CisgICAgICAgICAgICAgICAKKyAgICA8YWN0aW9uICAgIHBhdGg9Ii9yZXNvdXJjZXMvbGlzdFVzZXJEYXRhYmFzZXMiCisgICAgICAgICAgICAgICBuYW1lPSJ1c2VyRGF0YWJhc2VzRm9ybSIKKyAgICAgICAgICAgICAgc2NvcGU9InJlcXVlc3QiCisgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5yZXNvdXJjZXMuTGlzdFVzZXJEYXRhYmFzZXNBY3Rpb24iLz4KKworICAgIDxhY3Rpb24gICAgcGF0aD0iL3Jlc291cmNlcy9saXN0RGF0YVNvdXJjZXMiCisgICAgICAgICAgICAgICBuYW1lPSJkYXRhU291cmNlc0Zvcm0iCisgICAgICAgICAgICAgIHNjb3BlPSJyZXF1ZXN0IgorICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVzb3VyY2VzLkxpc3REYXRhU291cmNlc0FjdGlvbiIvPgorCisgICAgPGFjdGlvbiAgICBwYXRoPSIvcmVzb3VyY2VzL2xpc3RNYWlsU2Vzc2lvbnMiCisgICAgICAgICAgICAgICBuYW1lPSJtYWlsU2Vzc2lvbnNGb3JtIgorICAgICAgICAgICAgICBzY29wZT0icmVxdWVzdCIKKyAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnJlc291cmNlcy5MaXN0TWFpbFNlc3Npb25zQWN0aW9uIi8+CisKKyAgICA8YWN0aW9uICAgIHBhdGg9Ii9yZXNvdXJjZXMvbGlzdFJlc291cmNlTGlua3MiCisgICAgICAgICAgICAgICBuYW1lPSJyZXNvdXJjZUxpbmtzRm9ybSIKKyAgICAgICAgICAgICAgc2NvcGU9InJlcXVlc3QiCisgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5yZXNvdXJjZXMuTGlzdFJlc291cmNlTGlua3NBY3Rpb24iLz4KKworICAgPGFjdGlvbiAgICBwYXRoPSIvcmVzb3VyY2VzL3NhdmVFbnZFbnRyeSIKKyAgICAgICAgICAgICAgaW5wdXQ9Ii9yZXNvdXJjZXMvZW52RW50cnkuanNwIgorICAgICAgICAgICAgICAgbmFtZT0iZW52RW50cnlGb3JtIgorICAgICAgICAgICAgICBzY29wZT0icmVxdWVzdCIKKyAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnJlc291cmNlcy5TYXZlRW52RW50cnlBY3Rpb24iLz4KKyAgICAgICAgICAgICAgIAorICAgPGFjdGlvbiAgICBwYXRoPSIvcmVzb3VyY2VzL3NhdmVVc2VyRGF0YWJhc2UiCisgICAgICAgICAgICAgIGlucHV0PSIvcmVzb3VyY2VzL3VzZXJEYXRhYmFzZS5qc3AiCisgICAgICAgICAgICAgICBuYW1lPSJ1c2VyRGF0YWJhc2VGb3JtIgorICAgICAgICAgICAgICBzY29wZT0icmVxdWVzdCIKKyAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnJlc291cmNlcy5TYXZlVXNlckRhdGFiYXNlQWN0aW9uIi8+CisKKyAgICA8YWN0aW9uICAgIHBhdGg9Ii9yZXNvdXJjZXMvc2F2ZURhdGFTb3VyY2UiCisgICAgICAgICAgICAgIGlucHV0PSIvcmVzb3VyY2VzL2RhdGFTb3VyY2UuanNwIgorICAgICAgICAgICAgICAgbmFtZT0iZGF0YVNvdXJjZUZvcm0iCisgICAgICAgICAgICAgIHNjb3BlPSJyZXF1ZXN0IgorICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVzb3VyY2VzLlNhdmVEYXRhU291cmNlQWN0aW9uIi8+CisKKyAgICA8YWN0aW9uICAgIHBhdGg9Ii9yZXNvdXJjZXMvc2F2ZU1haWxTZXNzaW9uIgorICAgICAgICAgICAgICBpbnB1dD0iL3Jlc291cmNlcy9tYWlsU2Vzc2lvbi5qc3AiCisgICAgICAgICAgICAgICBuYW1lPSJtYWlsU2Vzc2lvbkZvcm0iCisgICAgICAgICAgICAgIHNjb3BlPSJyZXF1ZXN0IgorICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVzb3VyY2VzLlNhdmVNYWlsU2Vzc2lvbkFjdGlvbiIvPgorCisgICAgPGFjdGlvbiAgICBwYXRoPSIvcmVzb3VyY2VzL3NhdmVSZXNvdXJjZUxpbmsiCisgICAgICAgICAgICAgIGlucHV0PSIvcmVzb3VyY2VzL3Jlc291cmNlTGluay5qc3AiCisgICAgICAgICAgICAgICBuYW1lPSJyZXNvdXJjZUxpbmtGb3JtIgorICAgICAgICAgICAgICBzY29wZT0icmVxdWVzdCIKKyAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnJlc291cmNlcy5TYXZlUmVzb3VyY2VMaW5rQWN0aW9uIi8+CisKKyAgIDxhY3Rpb24gICAgcGF0aD0iL3Jlc291cmNlcy9zZXRVcEVudkVudHJ5IgorICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVzb3VyY2VzLlNldFVwRW52RW50cnlBY3Rpb24iLz4KKworICAgPGFjdGlvbiAgICBwYXRoPSIvcmVzb3VyY2VzL3NldFVwVXNlckRhdGFiYXNlIgorICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVzb3VyY2VzLlNldFVwVXNlckRhdGFiYXNlQWN0aW9uIi8+CisKKyAgICA8YWN0aW9uICAgIHBhdGg9Ii9yZXNvdXJjZXMvc2V0VXBEYXRhU291cmNlIgorICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVzb3VyY2VzLlNldFVwRGF0YVNvdXJjZUFjdGlvbiIvPgorCisgICAgPGFjdGlvbiAgICBwYXRoPSIvcmVzb3VyY2VzL3NldFVwTWFpbFNlc3Npb24iCisgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5yZXNvdXJjZXMuU2V0VXBNYWlsU2Vzc2lvbkFjdGlvbiIvPgorCisgICAgPGFjdGlvbiAgICBwYXRoPSIvcmVzb3VyY2VzL3NldFVwUmVzb3VyY2VMaW5rIgorICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVzb3VyY2VzLlNldFVwUmVzb3VyY2VMaW5rQWN0aW9uIi8+CisgICAgICAgICAgIAorICAgIDwhLS0gPT09PT09PT09PSBVc2VyIERhdGFiYXNlIE1vZHVsZSA9PT09PT09PT09IC0tPgorCisgICAgPGFjdGlvbiAgICBwYXRoPSIvdXNlcnMvZGVsZXRlR3JvdXBzIgorICAgICAgICAgICAgICAgbmFtZT0iZ3JvdXBzRm9ybSIKKyAgICAgICAgICAgICAgc2NvcGU9InJlcXVlc3QiCisgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi51c2Vycy5EZWxldGVHcm91cHNBY3Rpb24iLz4KKworICAgIDxhY3Rpb24gICAgcGF0aD0iL3VzZXJzL2RlbGV0ZVJvbGVzIgorICAgICAgICAgICAgICAgbmFtZT0icm9sZXNGb3JtIgorICAgICAgICAgICAgICBzY29wZT0icmVxdWVzdCIKKyAgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi51c2Vycy5EZWxldGVSb2xlc0FjdGlvbiIvPgorCisgICAgPGFjdGlvbiAgICBwYXRoPSIvdXNlcnMvZGVsZXRlVXNlcnMiCisgICAgICAgICAgICAgICBuYW1lPSJ1c2Vyc0Zvcm0iCisgICAgICAgICAgICAgIHNjb3BlPSJyZXF1ZXN0IgorICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4udXNlcnMuRGVsZXRlVXNlcnNBY3Rpb24iLz4KKworICAgIDxhY3Rpb24gICAgcGF0aD0iL3VzZXJzL2xpc3RHcm91cHMiCisgICAgICAgICAgICAgICBuYW1lPSJncm91cHNGb3JtIgorICAgICAgICAgICAgICBzY29wZT0icmVxdWVzdCIKKyAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnVzZXJzLkxpc3RHcm91cHNBY3Rpb24iLz4KKworICAgIDxhY3Rpb24gICAgcGF0aD0iL3VzZXJzL2xpc3RSb2xlcyIKKyAgICAgICAgICAgICAgIG5hbWU9InJvbGVzRm9ybSIKKyAgICAgICAgICAgICAgc2NvcGU9InJlcXVlc3QiCisgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi51c2Vycy5MaXN0Um9sZXNBY3Rpb24iLz4KKworICAgIDxhY3Rpb24gICAgcGF0aD0iL3VzZXJzL2xpc3RVc2VycyIKKyAgICAgICAgICAgICAgIG5hbWU9InVzZXJzRm9ybSIKKyAgICAgICAgICAgICAgc2NvcGU9InJlcXVlc3QiCisgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi51c2Vycy5MaXN0VXNlcnNBY3Rpb24iLz4KKworICAgIDxhY3Rpb24gICAgcGF0aD0iL3VzZXJzL3NhdmVHcm91cCIKKyAgICAgICAgICAgICAgaW5wdXQ9Ii91c2Vycy9ncm91cC5qc3AiCisgICAgICAgICAgICAgICBuYW1lPSJncm91cEZvcm0iCisgICAgICAgICAgICAgIHNjb3BlPSJyZXF1ZXN0IgorICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4udXNlcnMuU2F2ZUdyb3VwQWN0aW9uIi8+CisKKyAgICA8YWN0aW9uICAgIHBhdGg9Ii91c2Vycy9zYXZlUm9sZSIKKyAgICAgICAgICAgICAgaW5wdXQ9Ii91c2Vycy9yb2xlLmpzcCIKKyAgICAgICAgICAgICAgIG5hbWU9InJvbGVGb3JtIgorICAgICAgICAgICAgICBzY29wZT0icmVxdWVzdCIKKyAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnVzZXJzLlNhdmVSb2xlQWN0aW9uIi8+CisKKyAgICA8YWN0aW9uICAgIHBhdGg9Ii91c2Vycy9zYXZlVXNlciIKKyAgICAgICAgICAgICAgaW5wdXQ9Ii91c2Vycy91c2VyLmpzcCIKKyAgICAgICAgICAgICAgIG5hbWU9InVzZXJGb3JtIgorICAgICAgICAgICAgICBzY29wZT0icmVxdWVzdCIKKyAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLnVzZXJzLlNhdmVVc2VyQWN0aW9uIi8+CisKKyAgICA8YWN0aW9uICAgIHBhdGg9Ii91c2Vycy9zZXRVcEdyb3VwIgorICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4udXNlcnMuU2V0VXBHcm91cEFjdGlvbiIvPgorCisgICAgPGFjdGlvbiAgICBwYXRoPSIvdXNlcnMvc2V0VXBSb2xlIgorICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4udXNlcnMuU2V0VXBSb2xlQWN0aW9uIi8+CisKKyAgICA8YWN0aW9uICAgIHBhdGg9Ii91c2Vycy9zZXRVcFVzZXIiCisgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi51c2Vycy5TZXRVcFVzZXJBY3Rpb24iLz4KKworICAgIDwhLS0gPT09PT09PT09PSA9PT09PT09PT09PT09PT09PT09PSA9PT09PT09PT09IC0tPgorCisKKyAgPC9hY3Rpb24tbWFwcGluZ3M+ICAKKworICA8Y29udHJvbGxlciBsb2NhbGU9InRydWUiIG5vY2FjaGU9InRydWUiIC8+CisgCisgIDxtZXNzYWdlLXJlc291cmNlcyBwYXJhbWV0ZXI9Im9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkFwcGxpY2F0aW9uUmVzb3VyY2VzIiAvPgorCis8L3N0cnV0cy1jb25maWc+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL3dlYi54bWwgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNiOWJhZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL1dFQi1JTkYvd2ViLnhtbApAQCAtMCwwICsxLDE2MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgorCis8IURPQ1RZUEUgd2ViLWFwcAorICAgIFBVQkxJQyAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIFdlYiBBcHBsaWNhdGlvbiAyLjMvL0VOIgorICAgICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC93ZWItYXBwXzJfMy5kdGQiPgorCis8d2ViLWFwcD4KKworICA8ZGlzcGxheS1uYW1lPlRvbWNhdCBBZG1pbmlzdHJhdGlvbiBBcHBsaWNhdGlvbjwvZGlzcGxheS1uYW1lPgorICA8ZGVzY3JpcHRpb24+CisgICAgVG9tY2F0IEhUTUwgYmFzZWQgYWRtaW5pc3RyYXRpb24gd2ViIGFwcGxpY2F0aW9uLgorICA8L2Rlc2NyaXB0aW9uPgorCisgIDwhLS0gRXhhbXBsZSBmaWx0ZXIgdG8gc2V0IGNoYXJhY3RlciBlbmNvZGluZyBvbiBlYWNoIHJlcXVlc3QuCisgICAgICAgVW5jb21tZW50IHRoaXMgZmlsdGVyIGRlZmluaXRpb24gYW5kIHRoZSBtYXBwaW5nIHRvIHVzZQorICAgICAgIHRoZSBmaWx0ZXIgdG8gZGVjb2RlIHBvc3QgYW5kIGdldCBwYXJhbWV0ZXJzIC0tPgorCisgIDwhLS0KKyAgPGZpbHRlcj4KKyAgICA8ZmlsdGVyLW5hbWU+U2V0IENoYXJhY3RlciBFbmNvZGluZzwvZmlsdGVyLW5hbWU+CisgICAgPGZpbHRlci1jbGFzcz5vcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5maWx0ZXJzLlNldENoYXJhY3RlckVuY29kaW5nRmlsdGVyPC9maWx0ZXItY2xhc3M+CisgICAgPGluaXQtcGFyYW0+CisgICAgICA8cGFyYW0tbmFtZT5lbmNvZGluZzwvcGFyYW0tbmFtZT4KKyAgICAgIDxwYXJhbS12YWx1ZT5VVEY4PC9wYXJhbS12YWx1ZT4KKyAgICA8L2luaXQtcGFyYW0+CisgIDwvZmlsdGVyPgorICAtLT4KKworICA8IS0tIEV4YW1wbGUgZmlsdGVyIG1hcHBpbmcgdG8gYXBwbHkgdGhlICJTZXQgQ2hhcmFjdGVyIEVuY29kaW5nIiBmaWx0ZXIKKyAgICAgICB0byAqYWxsKiByZXF1ZXN0cyBwcm9jZXNzZWQgYnkgdGhpcyB3ZWIgYXBwbGljYXRpb24gLS0+CisKKyAgPCEtLQorICA8ZmlsdGVyLW1hcHBpbmc+CisgICAgPGZpbHRlci1uYW1lPlNldCBDaGFyYWN0ZXIgRW5jb2Rpbmc8L2ZpbHRlci1uYW1lPgorICAgIDx1cmwtcGF0dGVybj4vKjwvdXJsLXBhdHRlcm4+CisgIDwvZmlsdGVyLW1hcHBpbmc+CisgIC0tPgorCisgIDwhLS0gQWN0aW9uIFNlcnZsZXQgQ29uZmlndXJhdGlvbiAtLT4KKyAgPHNlcnZsZXQ+CisgICAgPHNlcnZsZXQtbmFtZT5hY3Rpb248L3NlcnZsZXQtbmFtZT4KKyAgICA8c2VydmxldC1jbGFzcz4KKyAgICAgIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkFwcGxpY2F0aW9uU2VydmxldAorICAgIDwvc2VydmxldC1jbGFzcz4KKzwhLS0gRGVwcmVjYXRlZAorICAgIDxpbml0LXBhcmFtPgorICAgICAgPHBhcmFtLW5hbWU+YXBwbGljYXRpb248L3BhcmFtLW5hbWU+CisgICAgICA8cGFyYW0tdmFsdWU+CisgICAgICAgIG9yZy5hcGFjaGUud2ViYXBwLmFkbWluLkFwcGxpY2F0aW9uUmVzb3VyY2VzCisgICAgICA8L3BhcmFtLXZhbHVlPgorICAgIDwvaW5pdC1wYXJhbT4KKy0tPgorICAgIDxpbml0LXBhcmFtPgorICAgICAgPHBhcmFtLW5hbWU+Y29uZmlnPC9wYXJhbS1uYW1lPgorICAgICAgPHBhcmFtLXZhbHVlPi9XRUItSU5GL3N0cnV0cy1jb25maWcueG1sPC9wYXJhbS12YWx1ZT4KKyAgICA8L2luaXQtcGFyYW0+Cis8IS0tIERlcHJlY2F0ZWQgICAKKyAgICA8aW5pdC1wYXJhbT4KKyAgICAgIDxwYXJhbS1uYW1lPmRlYnVnPC9wYXJhbS1uYW1lPgorICAgICAgPHBhcmFtLXZhbHVlPjA8L3BhcmFtLXZhbHVlPgorICAgIDwvaW5pdC1wYXJhbT4KKy0tPgorICAgIDxpbml0LXBhcmFtPgorICAgICAgPHBhcmFtLW5hbWU+ZGV0YWlsPC9wYXJhbS1uYW1lPgorICAgICAgPHBhcmFtLXZhbHVlPjA8L3BhcmFtLXZhbHVlPgorICAgIDwvaW5pdC1wYXJhbT4KKzwhLS0gRGVwcmVjYXRlZAorICAgIDxpbml0LXBhcmFtPgorICAgICAgPHBhcmFtLW5hbWU+bG9jYWxlPC9wYXJhbS1uYW1lPgorICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgorICAgIDwvaW5pdC1wYXJhbT4KKy0tPgorPCEtLSBEZXByZWNhdGVkCisgICAgPGluaXQtcGFyYW0+CisgICAgICA8cGFyYW0tbmFtZT5ub2NhY2hlPC9wYXJhbS1uYW1lPgorICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgorICAgIDwvaW5pdC1wYXJhbT4KKy0tPgorICAgIDxpbml0LXBhcmFtPgorICAgICAgPHBhcmFtLW5hbWU+dmFsaWRhdGU8L3BhcmFtLW5hbWU+CisgICAgICA8cGFyYW0tdmFsdWU+ZmFsc2U8L3BhcmFtLXZhbHVlPgorICAgIDwvaW5pdC1wYXJhbT4KKyAgICA8IS0tIExhYmVsIHRvIGJlIGRpc3BsYXllZCBmb3Igcm9vdG5vZGUuIElmIGFic2VudCwgcm9vdG5vZGUgaXMgbm90IHJlbmRlcmVkIC0tPgorICAgIDwhLS0KKyAgICA8aW5pdC1wYXJhbT4KKyAgICAgIDxwYXJhbS1uYW1lPnJvb3Rub2RlbmFtZTwvcGFyYW0tbmFtZT4KKyAgICAgIDxwYXJhbS12YWx1ZT5Ub21jYXQgUm9vdDwvcGFyYW0tdmFsdWU+CisgICAgPC9pbml0LXBhcmFtPgorICAgIC0tPgorICAgIDxpbml0LXBhcmFtPgorICAgICAgPHBhcmFtLW5hbWU+dHJlZWJ1aWxkZXJzPC9wYXJhbS1uYW1lPgorICAgICAgPHBhcmFtLXZhbHVlPgorICAgICAgICBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi5Ub21jYXRUcmVlQnVpbGRlciwKKyAgICAgICAgb3JnLmFwYWNoZS53ZWJhcHAuYWRtaW4ucmVzb3VyY2VzLlJlc291cmNlc1RyZWVCdWlsZGVyLAorICAgICAgICBvcmcuYXBhY2hlLndlYmFwcC5hZG1pbi51c2Vycy5Vc2Vyc1RyZWVCdWlsZGVyCisgICAgPC9wYXJhbS12YWx1ZT4KKyAgICA8L2luaXQtcGFyYW0+CisgICAgPGluaXQtcGFyYW0+CisgICAgICA8cGFyYW0tbmFtZT5kb21haW48L3BhcmFtLW5hbWU+CisgICAgICA8cGFyYW0tdmFsdWU+Q2F0YWxpbmE8L3BhcmFtLXZhbHVlPgorICAgIDwvaW5pdC1wYXJhbT4KKyAgPC9zZXJ2bGV0PgorCisgIDwhLS0gQWN0aW9uIFNlcnZsZXQgTWFwcGluZyAtLT4KKyAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICA8c2VydmxldC1uYW1lPmFjdGlvbjwvc2VydmxldC1uYW1lPgorICAgIDx1cmwtcGF0dGVybj4qLmRvPC91cmwtcGF0dGVybj4KKyAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgPCEtLSBTdHJ1dHMgVGFnIExpYnJhcnkgRGVzY3JpcHRvcnMgLS0+CisgIDx0YWdsaWI+CisgICAgPHRhZ2xpYi11cmk+L1dFQi1JTkYvc3RydXRzLWJlYW4udGxkPC90YWdsaWItdXJpPgorICAgIDx0YWdsaWItbG9jYXRpb24+L1dFQi1JTkYvc3RydXRzLWJlYW4udGxkPC90YWdsaWItbG9jYXRpb24+CisgIDwvdGFnbGliPgorCisgIDx0YWdsaWI+CisgICAgPHRhZ2xpYi11cmk+L1dFQi1JTkYvc3RydXRzLWh0bWwudGxkPC90YWdsaWItdXJpPgorICAgIDx0YWdsaWItbG9jYXRpb24+L1dFQi1JTkYvc3RydXRzLWh0bWwudGxkPC90YWdsaWItbG9jYXRpb24+CisgIDwvdGFnbGliPgorCisgIDx0YWdsaWI+CisgICAgPHRhZ2xpYi11cmk+L1dFQi1JTkYvc3RydXRzLWxvZ2ljLnRsZDwvdGFnbGliLXVyaT4KKyAgICA8dGFnbGliLWxvY2F0aW9uPi9XRUItSU5GL3N0cnV0cy1sb2dpYy50bGQ8L3RhZ2xpYi1sb2NhdGlvbj4KKyAgPC90YWdsaWI+CisKKyAgPCEtLSBTZWN1cml0eSBpcyBhY3RpdmUgb24gZW50aXJlIGRpcmVjdG9yeSAtLT4KKyAgPHNlY3VyaXR5LWNvbnN0cmFpbnQ+CisgICAgPGRpc3BsYXktbmFtZT5Ub21jYXQgU2VydmVyIENvbmZpZ3VyYXRpb24gU2VjdXJpdHkgQ29uc3RyYWludDwvZGlzcGxheS1uYW1lPgorICAgIDx3ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KKyAgICAgIDx3ZWItcmVzb3VyY2UtbmFtZT5Qcm90ZWN0ZWQgQXJlYTwvd2ViLXJlc291cmNlLW5hbWU+CisgICAgICA8IS0tIERlZmluZSB0aGUgY29udGV4dC1yZWxhdGl2ZSBVUkwocykgdG8gYmUgcHJvdGVjdGVkIC0tPgorICAgICAgPHVybC1wYXR0ZXJuPiouanNwPC91cmwtcGF0dGVybj4KKyAgICAgIDx1cmwtcGF0dGVybj4qLmRvPC91cmwtcGF0dGVybj4KKyAgICAgIDx1cmwtcGF0dGVybj4qLmh0bWw8L3VybC1wYXR0ZXJuPgorICAgIDwvd2ViLXJlc291cmNlLWNvbGxlY3Rpb24+CisgICAgPGF1dGgtY29uc3RyYWludD4KKyAgICAgIDwhLS0gQW55b25lIHdpdGggb25lIG9mIHRoZSBsaXN0ZWQgcm9sZXMgbWF5IGFjY2VzcyB0aGlzIGFyZWEgLS0+CisgICAgICA8cm9sZS1uYW1lPmFkbWluPC9yb2xlLW5hbWU+CisgICAgPC9hdXRoLWNvbnN0cmFpbnQ+CisgIDwvc2VjdXJpdHktY29uc3RyYWludD4KKworICA8IS0tIExvZ2luIGNvbmZpZ3VyYXRpb24gdXNlcyBmb3JtLWJhc2VkIGF1dGhlbnRpY2F0aW9uIC0tPgorICA8bG9naW4tY29uZmlnPgorICAgIDxhdXRoLW1ldGhvZD5GT1JNPC9hdXRoLW1ldGhvZD4KKyAgICA8cmVhbG0tbmFtZT5Ub21jYXQgU2VydmVyIENvbmZpZ3VyYXRpb24gRm9ybS1CYXNlZCBBdXRoZW50aWNhdGlvbiBBcmVhPC9yZWFsbS1uYW1lPgorICAgIDxmb3JtLWxvZ2luLWNvbmZpZz4KKyAgICAgIDxmb3JtLWxvZ2luLXBhZ2U+L2xvZ2luLmpzcDwvZm9ybS1sb2dpbi1wYWdlPgorICAgICAgPGZvcm0tZXJyb3ItcGFnZT4vZXJyb3IuanNwPC9mb3JtLWVycm9yLXBhZ2U+CisgICAgPC9mb3JtLWxvZ2luLWNvbmZpZz4KKyAgPC9sb2dpbi1jb25maWc+CisKKyAgPCEtLSBTZWN1cml0eSByb2xlcyByZWZlcmVuY2VkIGJ5IHRoaXMgd2ViIGFwcGxpY2F0aW9uIC0tPgorICA8c2VjdXJpdHktcm9sZT4KKyAgICA8ZGVzY3JpcHRpb24+CisgICAgICBUaGUgcm9sZSB0aGF0IGlzIHJlcXVpcmVkIHRvIGxvZyBpbiB0byB0aGUgQWRtaW5pc3RyYXRpb24gQXBwbGljYXRpb24KKyAgICA8L2Rlc2NyaXB0aW9uPgorICAgIDxyb2xlLW5hbWU+YWRtaW48L3JvbGUtbmFtZT4KKyAgPC9zZWN1cml0eS1yb2xlPgorCis8L3dlYi1hcHA+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9hZG1pbi5jc3MgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9hZG1pbi5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFiNzQ2NwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2FkbWluLmNzcwpAQCAtMCwwICsxLDk1IEBACisubWFzdGhlYWQtdGl0bGUtdGV4dCB7CisgIGNvbG9yOiAjRkZGRkZGOworICBtYXJnaW46IDNweCA1cHggNXB4IDNweDsKKyAgZm9udC1zaXplOiBsYXJnZTsKKyAgZm9udC1mYW1pbHk6ICBBcmlhbCwgVmVyZGFuYSxIZWx2ZXRpY2EsIFNhbnMtU2VyaWY7Cit9CisKKy5wYWdlLXRpdGxlLXRleHQgeworICBjb2xvcjogI0ZGRkZGRjsKKyAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgIG1hcmdpbjogM3B4IDVweCA1cHggM3B4OworICBmb250LXNpemU6IG5vcm1hbDsKKyAgZm9udC1mYW1pbHk6IEFyaWFsLCBWZXJkYW5hLCBIZWx2ZXRpY2EsIFNhbnMtU2VyaWY7Cit9CisKKy50YWJsZS10aXRsZS10ZXh0IHsKKyAgY29sb3I6ICMwMDAwMDA7CisgIGZvbnQtd2VpZ2h0OiBib2xkOworICBtYXJnaW46IDNweCA1cHggNXB4IDRweDsKKyAgZm9udC1mYW1pbHk6IEFyaWFsLCBWZXJkYW5hLCBIZWx2ZXRpY2EsIFNhbnMtU2VyaWY7Cit9CisKKy50YWJsZS1oZWFkZXItdGV4dCB7CisgIGNvbG9yOiAjRkZGRkZGOworICBmb250LXdlaWdodDogbm9ybWFsOworICBtYXJnaW46IDNweCA1cHggMXB4IDE1cHg7CisgIGZvbnQtZmFtaWx5OiAgQXJpYWwsIFZlcmRhbmEsSGVsdmV0aWNhLCBTYW5zLVNlcmlmOworfQorCisudGFibGUtbGFiZWwtdGV4dCB7CisgIGNvbG9yOiAjMDAwMDAwOworICBtYXJnaW46IDNweCA1cHggM3B4IDE1cHg7CisgIGZvbnQtZmFtaWx5OiBBcmlhbCwgVmVyZGFuYSwgSGVsdmV0aWNhLCBTYW5zLVNlcmlmOworfQorCisudGFibGUtbm9ybWFsLXRleHQgeworICBjb2xvcjogIzAwMDAwMDsKKyAgbWFyZ2luOiAzcHggNXB4IDNweCAxNXB4OworICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsKK30KKworLmJhY2stdGFibGUgeworICBiYWNrZ3JvdW5kLWNvbG9yOiAjOTk5OUNDOworICBtYXJnaW46IDBweCA1cHggM3B4IDVweDsKKyAgZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIFNhbnMtU2VyaWY7Cit9CisKKy5mcm9udC10YWJsZSB7CisgIGJhY2tncm91bmQtY29sb3I6ICNGRkZGRkY7CisgIGZvbnQtZmFtaWx5OiBBcmlhbCwgVmVyZGFuYSwgSGVsdmV0aWNhLCBTYW5zLVNlcmlmOworfQorCisucGFnZS10aXRsZS1yb3cgeworICBiYWNrZ3JvdW5kLWNvbG9yOiAjNzE3MUE1OworICB0ZXh0LWFsaWduOiByaWdodDsKKyAgZm9udC1mYW1pbHk6IEFyaWFsLCBWZXJkYW5hLCBIZWx2ZXRpY2EsIFNhbnMtU2VyaWY7Cit9CisKKy5oZWFkZXItcm93IHsKKyAgYmFja2dyb3VuZC1jb2xvcjogIzk5OTlDQzsKKyAgdGV4dC1hbGlnbjogY2VudGVyOworICBmb250LWZhbWlseTogQXJpYWwsIFZlcmRhbmEsIEhlbHZldGljYSwgU2Fucy1TZXJpZjsKK30KKworLnNvcnQtcm93IHsKKyAgYmFja2dyb3VuZC1jb2xvcjogI0NFQ0VGRjsKKyAgdGV4dC1hbGlnbjogY2VudGVyOworICBmb250LWZhbWlseTogQXJpYWwsIFZlcmRhbmEsIEhlbHZldGljYSwgU2Fucy1TZXJpZjsKK30KKworLmxpbmUtcm93IHsKKyAgYmFja2dyb3VuZC1jb2xvcjogI0NDQ0NDQzsKKyAgZm9udC1mYW1pbHk6IEFyaWFsLCBWZXJkYW5hLCBIZWx2ZXRpY2EsIFNhbnMtU2VyaWY7Cit9CisKKy5idXR0b24geworICBiYWNrZ3JvdW5kLWNvbG9yOiAjQ0NDQ0ZGOworICBmb250LWZhbWlseTogQXJpYWwsIFZlcmRhbmEsIEhlbHZldGljYSwgU2Fucy1TZXJpZjsKK30KKworYS5idXR0b24tbGluay10ZXh0OnZpc2l0ZWQsIGEuYnV0dG9uLWxpbmstdGV4dDpsaW5rLCBhLmJ1dHRvbi1saW5rLXRleHQ6YWN0aXZlIHsKKyAgY29sb3I6ICMwMDAwMDA7CisgIGJhY2tncm91bmQtY29sb3I6ICNDQ0NDRkY7CisgIGZvbnQtd2VpZ2h0OiBib2xkOworICBmb250LWZhbWlseTogQXJpYWwsIFZlcmRhbmEsIEdlbmV2YSwgSGVsdmV0aWNhLCBTYW5zLVNlcmlmOworICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Cit9CisKK2EuYnV0dG9uLWxpbmstdGV4dDpob3ZlciB7CisgIGNvbG9yOiAjMDAwMDAwOworICBiYWNrZ3JvdW5kLWNvbG9yOiAjQ0NDQ0ZGOworICBmb250LXdlaWdodDogYm9sZDsKKyAgZm9udC1mYW1pbHk6IEFyaWFsLCBWZXJkYW5hLCBHZW5ldmEsIEhlbHZldGljYSwgU2Fucy1TZXJpZjsKKyAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Cit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9hZG1pbi54bWwgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9hZG1pbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA3MTFlZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2FkbWluLnhtbApAQCAtMCwwICsxLDIwIEBACis8IS0tCisKKyAgICBDb250ZXh0IGNvbmZpZ3VyYXRpb24gZmlsZSBmb3IgdGhlIFRvbWNhdCBBZG1pbmlzdHJhdGlvbiBXZWIgQXBwCisKKyAgICAkSWQkCisKKy0tPgorCisKKzxDb250ZXh0IGRvY0Jhc2U9IiR7Y2F0YWxpbmEuaG9tZX0vc2VydmVyL3dlYmFwcHMvYWRtaW4iIHByaXZpbGVnZWQ9InRydWUiCisgICAgICAgICBhbnRpUmVzb3VyY2VMb2NraW5nPSJmYWxzZSIgYW50aUpBUkxvY2tpbmc9ImZhbHNlIj4KKworICA8IS0tIFVuY29tbWVudCB0aGlzIFZhbHZlIHRvIGxpbWl0IGFjY2VzcyB0byB0aGUgQWRtaW4gYXBwIHRvIGxvY2FsaG9zdAorICAgZm9yIG9idmlvdXMgc2VjdXJpdHkgcmVhc29ucy4gQWxsb3cgbWF5IGJlIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YKKyAgIGhvc3RzIChvciBldmVuIHJlZ3VsYXIgZXhwcmVzc2lvbnMpLgorICA8VmFsdmUgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcy5SZW1vdGVBZGRyVmFsdmUiCisgICAgYWxsb3c9IjEyNy4wLjAuMSIvPgorICAtLT4KKworPC9Db250ZXh0PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vYmFubmVyLmpzcCBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2Jhbm5lci5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFiZDNiMAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2Jhbm5lci5qc3AKQEAgLTAsMCArMSw3OCBAQAorPCEtLSBTdGFuZGFyZCBTdHJ1dHMgRW50cmllcyAtLT4KKworPCVAIHBhZ2UgbGFuZ3VhZ2U9ImphdmEiIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9zdHJ1dHMtYmVhbi50bGQiIHByZWZpeD0iYmVhbiIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9zdHJ1dHMtaHRtbC50bGQiIHByZWZpeD0iaHRtbCIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9zdHJ1dHMtbG9naWMudGxkIiBwcmVmaXg9ImxvZ2ljIiAlPgorCis8aHRtbDpodG1sIGxvY2FsZT0idHJ1ZSI+CisKKzwhLS0gU3RhbmRhcmQgQ29udGVudCAtLT4KKworPCVAIGluY2x1ZGUgZmlsZT0iaGVhZGVyLmpzcCIgJT4KKworPCEtLSBCb2R5IC0tPgorCis8Ym9keSBsZWZ0bWFyZ2luPSIwIiB0b3BtYXJnaW49IjAiIG1hcmdpbndpZHRoPSIwIiBtYXJnaW5oZWlnaHQ9IjAiIGJnY29sb3I9IjcxNzFBNSIgYmFja2dyb3VuZD0iaW1hZ2VzL0JsdWVUaWxlLmdpZiI+CisKKzx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgorICAgIDx0cj4KKyAgICAgIDx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJtaWRkbGUiPgorICAgICAgICA8ZGl2IGNsYXNzPSJtYXN0aGVhZC10aXRsZS10ZXh0IiBhbGlnbj0ibGVmdCI+PGltZyBzcmM9ImltYWdlcy9Ub21jYXRCYW5uZXIuanBnIiBhbHQ9IlRvbWNhdCBXZWIgU2VydmVyIEFkbWluaXN0cmF0aW9uIFRvb2wiIGhlaWdodD0iMTIwIj48L2Rpdj4KKyAgICAgIDwvdGQ+CisgICAgICA8Zm9ybSBtZXRob2Q9J3Bvc3QnIGFjdGlvbj0nL2FkbWluL2NvbW1pdENoYW5nZXMuZG8nIHRhcmdldD0nX3NlbGYnPgorICAgICAgPHRkIGFsaWduPSJyaWdodCIgdmFsaWduPSJtaWRkbGUiPgorICAgICAgICA8aHRtbDpzdWJtaXQ+CisgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9ImJ1dHRvbi5jb21taXQiLz4KKyAgICAgICAgPC9odG1sOnN1Ym1pdD4KKyAgICAgIDwvdGQ+CisgICAgICA8L2Zvcm0+CisgICAgICA8dGQgd2lkdGg9IjElIj4KKyAgICAgICAgPGRpdiBjbGFzcz0idGFibGUtbm9ybWFsLXRleHQiIGFsaWduPSJsZWZ0Ij4mbmJzcCA8L2Rpdj4KKyAgICAgIDwvdGQ+CisgICAgPGZvcm0gbWV0aG9kPSdwb3N0JyBhY3Rpb249Jy9hZG1pbi9sb2dPdXQuZG8nIHRhcmdldD0nX3RvcCc+CisgICAgICA8dGQgYWxpZ249InJpZ2h0IiB2YWxpZ249Im1pZGRsZSI+CisgICAgICAgIDxodG1sOnN1Ym1pdD4KKyAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0iYnV0dG9uLmxvZ291dCIvPgorICAgICAgICA8L2h0bWw6c3VibWl0PgorICAgICAgPC90ZD4KKyAgICAgIDx0ZCB3aWR0aD0iMSUiPgorICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJsZS1ub3JtYWwtdGV4dCIgYWxpZ249ImxlZnQiPiZuYnNwIDwvZGl2PgorICAgICAgPC90ZD4KKyAgICA8L2Zvcm0+CisgIDwvdHI+Cis8L3RhYmxlPgorCis8IS0tIFNlbGVjdCBsYW5ndWFnZSAtLT4KKzwhLS0KKworPGgyPjxiZWFuOm1lc3NhZ2Uga2V5PSJsb2dpbi5jaGFuZ2VMYW5ndWFnZSIvPjwvaDI+CisKKzxodG1sOmZvcm0gYWN0aW9uPSIvc2V0TG9jYWxlIiBtZXRob2Q9IlBPU1QiIHRhcmdldD0iX3NlbGYiPgorICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iNSI+CisgICAgPHRyPgorICAgICAgPHRkIGFsaWduPSJyaWdodCI+CisgICAgICAgIDxodG1sOnNlbGVjdCBwcm9wZXJ0eT0ibG9jYWxlIj4KKyAgICAgICAgICA8aHRtbDpvcHRpb25zIG5hbWU9ImFwcGxpY2F0aW9uTG9jYWxlcyIKKyAgICAgICAgICAgICAgICAgICAgcHJvcGVydHk9ImxvY2FsZVZhbHVlcyIKKyAgICAgICAgICAgICAgICAgICBsYWJlbE5hbWU9ImFwcGxpY2F0aW9uTG9jYWxlcyIKKyAgICAgICAgICAgICAgIGxhYmVsUHJvcGVydHk9ImxvY2FsZUxhYmVscyIvPgorICAgICAgICA8L2h0bWw6c2VsZWN0PgorICAgICAgPC90ZD4KKyAgICAgIDx0ZCBhbGlnbj0ibGVmdCI+CisgICAgICAgIDxodG1sOnN1Ym1pdD4KKyAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0iYnV0dG9uLmNoYW5nZSIvPgorICAgICAgICA8L2h0bWw6c3VibWl0PgorICAgICAgPC90ZD4KKyAgICA8L3RyPgorICA8L3RhYmxlPgorPC9odG1sOmZvcm0+CistLT4KKworPC9ib2R5PgorCis8IS0tIFN0YW5kYXJkIEZvb3RlciAtLT4KKworPCVAIGluY2x1ZGUgZmlsZT0iZm9vdGVyLmpzcCIgJT4KKworPC9odG1sOmh0bWw+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9ibGFuay5qc3AgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9ibGFuay5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJhNGNkNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2JsYW5rLmpzcApAQCAtMCwwICsxLDI0IEBACis8IS0tIFN0YW5kYXJkIFN0cnV0cyBFbnRyaWVzIC0tPgorCis8JUAgcGFnZSBsYW5ndWFnZT0iamF2YSIgY29udGVudFR5cGU9InRleHQvaHRtbDtjaGFyc2V0PXV0Zi04IiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL3N0cnV0cy1iZWFuLnRsZCIgcHJlZml4PSJiZWFuIiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL3N0cnV0cy1odG1sLnRsZCIgcHJlZml4PSJodG1sIiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL3N0cnV0cy1sb2dpYy50bGQiIHByZWZpeD0ibG9naWMiICU+CisKKzxodG1sOmh0bWwgbG9jYWxlPSJ0cnVlIj4KKworPCEtLSBTdGFuZGFyZCBDb250ZW50IC0tPgorCis8JUAgaW5jbHVkZSBmaWxlPSJoZWFkZXIuanNwIiAlPgorCis8IS0tIEJvZHkgLS0+CisKKzxib2R5IGJnY29sb3I9IndoaXRlIiBiYWNrZ3JvdW5kPSJpbWFnZXMvUGFwZXJUZXh0dXJlLmdpZiI+CisKKzwvYm9keT4KKworPCEtLSBTdGFuZGFyZCBGb290ZXIgLS0+CisKKzwlQCBpbmNsdWRlIGZpbGU9ImZvb3Rlci5qc3AiICU+CisKKzwvaHRtbDpodG1sPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vYnVpbGQueG1sIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vYnVpbGQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2NzI1ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9idWlsZC54bWwKQEAgLTAsMCArMSwyNDQgQEAKKzxwcm9qZWN0IG5hbWU9ImFkbWluIiBkZWZhdWx0PSJidWlsZC1tYWluIiBiYXNlZGlyPSIuIj4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09IEluaXRpYWxpemUgUHJvcGVydHkgVmFsdWVzID09PT09PT09PT09PT09PT09PT0gLS0+CisKKyAgPCEtLSBTZWUgImJ1aWxkLnByb3BlcnRpZXMuc2FtcGxlIiBpbiB0aGUgdG9wIGxldmVsIGRpcmVjdG9yeSBmb3IgYWxsICAgICAtLT4KKyAgPCEtLSBwcm9wZXJ0eSB2YWx1ZXMgeW91IG11c3QgY3VzdG9taXplIGZvciBzdWNjZXNzZnVsIGJ1aWxkaW5nISEhICAgICAgICAtLT4KKyAgPHByb3BlcnR5IGZpbGU9ImJ1aWxkLnByb3BlcnRpZXMiLz4KKyAgPHByb3BlcnR5IGZpbGU9Ii4uL2J1aWxkLnByb3BlcnRpZXMiLz4KKyAgPHByb3BlcnR5IGZpbGU9Ii4uLy4uL2J1aWxkLnByb3BlcnRpZXMiLz4KKyAgPHByb3BlcnR5IGZpbGU9IiR7dXNlci5ob21lfS9idWlsZC5wcm9wZXJ0aWVzIi8+CisKKyAgPCEtLSBCdWlsZCBEZWZhdWx0cyAtLT4KKyAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmNvbXBpbGVyIiAgdmFsdWU9Im1vZGVybiIvPgorICA8cHJvcGVydHkgbmFtZT0id2ViYXBwcy5idWlsZCIgICB2YWx1ZT0iJHtiYXNlZGlyfS8uLi9idWlsZCIvPgorICA8cHJvcGVydHkgbmFtZT0id2ViYXBwcy5kaXN0IiAgICB2YWx1ZT0iJHtiYXNlZGlyfS8uLi9kaXN0Ii8+CisgIDxwcm9wZXJ0eSBuYW1lPSJ3ZWJhcHAubmFtZSIgICAgIHZhbHVlPSJhZG1pbiIvPgorCisgIDwhLS0gRGVwZW5kZW50IEpBUnMgYW5kIGZpbGVzIC0tPgorICA8cHJvcGVydHkgbmFtZT0ic2VydmxldC1hcGkuamFyIiB2YWx1ZT0iJHthcGkuaG9tZX0vanNyMTU0L2Rpc3QvbGliL3NlcnZsZXQtYXBpLmphciIvPgorICA8cHJvcGVydHkgbmFtZT0ianNwLWFwaS5qYXIiICAgICB2YWx1ZT0iJHthcGkuaG9tZX0vanNyMTUyL2Rpc3QvbGliL2pzcC1hcGkuamFyIi8+CisKKyAgPCEtLSBDb25zdHJ1Y3QgQWRtaW4gY2xhc3NwYXRoIC0tPgorICA8cGF0aCBpZD0iYWRtaW4uY2xhc3NwYXRoIj4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y29tbW9ucy1tb2RlbGVyLmphcn0iLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7am14Lmphcn0iLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7c2VydmxldC1hcGkuamFyfSIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtqc3AtYXBpLmphcn0iLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7c3RydXRzLmphcn0iLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y29tbW9ucy1iZWFudXRpbHMuamFyfSIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjb21tb25zLWNvbGxlY3Rpb25zLmphcn0iLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y29tbW9ucy1kaWdlc3Rlci5qYXJ9Ii8+CisgIDwvcGF0aD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PSBCVUlMRDogU2V0IGNvbXBpbGUgZmxhZ3MgPT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iZmxhZ3MiPgorCisgICAgPCEtLSBKREsgZmxhZ3MgLS0+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0iamRrLjEuMi5wcmVzZW50IiBjbGFzc25hbWU9ImphdmEudXRpbC5IYXNoTWFwIiAvPgorICAgIDxhdmFpbGFibGUgcHJvcGVydHk9Impkay4xLjMucHJlc2VudCIKKyAgICAgY2xhc3NuYW1lPSJqYXZhLmxhbmcucmVmbGVjdC5Qcm94eSIgLz4KKyAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJqZGsuMS40LnByZXNlbnQiIGNsYXNzbmFtZT0iamF2YS5uaW8uQnVmZmVyIiAvPgorCisgICAgPCEtLSBBbnQgZmxhZ3MgLS0+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0ic3R5bGUuYXZhaWxhYmxlIgorICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLlRyYVhMaWFpc29uIiAvPgorCisgICAgPCEtLSBDbGFzcyBhdmFpbGFiaWxpdHkgZmxhZ3MgLS0+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iamF4cC5wcmVzZW50Ij4KKyAgICAgIDxhbmQ+CisgICAgICAgIDxhdmFpbGFibGUgY2xhc3NuYW1lPSJqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXIiCisgICAgICAgICBjbGFzc3BhdGg9IiR7eGVyY2VzLmphcn0iIC8+CisgICAgICAgIDxhdmFpbGFibGUgY2xhc3NuYW1lPSJvcmcueG1sLnNheC5Db250ZW50SGFuZGxlciIKKyAgICAgICAgIGNsYXNzcGF0aD0iJHt4ZXJjZXMuamFyfSIgLz4KKyAgICAgIDwvYW5kPgorICAgIDwvY29uZGl0aW9uPgorICAgIDxhdmFpbGFibGUgcHJvcGVydHk9ImpteC5wcmVzZW50IgorICAgICBjbGFzc25hbWU9ImphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXIiCisgICAgIGNsYXNzcGF0aD0iJHtqbXguamFyfSIgLz4KKyAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJtb2RlbGVyLnByZXNlbnQiCisgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5jb21tb25zLm1vZGVsZXIuUmVnaXN0cnkiCisgICAgIGNsYXNzcGF0aD0iJHtjb21tb25zLW1vZGVsZXIuamFyfToke2pteC5qYXJ9Ii8+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0ic2VydmxldC5wcmVzZW50IgorICAgICBjbGFzc25hbWU9ImphdmF4LnNlcnZsZXQuU2VydmxldCIKKyAgICAgY2xhc3NwYXRoPSIke3NlcnZsZXQtYXBpLmphcn0iIC8+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0ianNwLnByZXNlbnQiCisgICAgIGNsYXNzbmFtZT0iamF2YXguc2VydmxldC5qc3AuSnNwUGFnZSIKKyAgICAgY2xhc3NwYXRoPSIke2pzcC1hcGkuamFyfSIgLz4KKyAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJzdHJ1dHMucHJlc2VudCIKKyAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnN0cnV0cy5hY3Rpb24uQWN0aW9uRm9ybSIKKyAgICAgY2xhc3NwYXRoPSIke3N0cnV0cy5qYXJ9IiAvPgorICAgIDxhdmFpbGFibGUgcHJvcGVydHk9ImJlYW51dGlscy5wcmVzZW50IgorICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUuY29tbW9ucy5iZWFudXRpbHMuUHJvcGVydHlVdGlscyIKKyAgICAgY2xhc3NwYXRoPSIke2NvbW1vbnMtYmVhbnV0aWxzLmphcn0iIC8+CisKKworICAgIDwhLS0gSkFSIGZpbGVzIGF2YWlsYWJpbGl0eSBmbGFncyAtLT4KKyAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJqbXguamFyLnByZXNlbnQiICAgZmlsZT0iJHtqbXguamFyfSIgLz4KKyAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJtb2RlbGVyLmphci5wcmVzZW50IiBmaWxlPSIke2NvbW1vbnMtbW9kZWxlci5qYXJ9IiAvPgorICAgIDxhdmFpbGFibGUgcHJvcGVydHk9InNlcnZsZXQtYXBpLmphci5wcmVzZW50IiBmaWxlPSIke3NlcnZsZXQtYXBpLmphcn0iIC8+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0ianNwLWFwaS5qYXIucHJlc2VudCIgZmlsZT0iJHtqc3AtYXBpLmphcn0iIC8+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0ic3RydXRzLmphci5wcmVzZW50IiAgZmlsZT0iJHtzdHJ1dHMuamFyfSIgLz4KKyAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJiZWFudXRpbHMuamFyLnByZXNlbnQiIGZpbGU9IiR7Y29tbW9ucy1iZWFudXRpbHMuamFyfSIgLz4KKworICAgIDwhLS0gQ29uZGl0aW9uYWwgY29tcGlsYXRpb24gZmxhZ3MgKGRldGVybWluZWQgZnJvbSB0aGUgZmxhZ3MgYWJvdmUpIC0tPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9ImNvbXBpbGUuYWRtaW4iPgorICAgICAgPG9yPgorICAgICAgICA8ZXF1YWxzIGFyZzE9IiR7ZnVsbC5kaXN0fSIgYXJnMj0ib24iIC8+CisgICAgICAgIDxhbmQ+CisgICAgICAgICAgPGVxdWFscyBhcmcxPSIke3N0cnV0cy5wcmVzZW50fSIgYXJnMj0idHJ1ZSIgLz4KKyAgICAgICAgICA8ZXF1YWxzIGFyZzE9IiR7am14LnByZXNlbnR9IiBhcmcyPSJ0cnVlIiAvPgorICAgICAgICAgIDxlcXVhbHMgYXJnMT0iJHttb2RlbGVyLnByZXNlbnR9IiBhcmcyPSJ0cnVlIiAvPgorICAgICAgICAgIDxhdmFpbGFibGUgZmlsZT0iJHtzdHJ1dHMubGlifS9zdHJ1dHMtYmVhbi50bGQiIC8+CisgICAgICAgICAgPGF2YWlsYWJsZSBmaWxlPSIke3N0cnV0cy5saWJ9L3N0cnV0cy1odG1sLnRsZCIgLz4KKyAgICAgICAgICA8YXZhaWxhYmxlIGZpbGU9IiR7c3RydXRzLmxpYn0vc3RydXRzLWxvZ2ljLnRsZCIgLz4KKyAgICAgICAgPC9hbmQ+CisgICAgICA8L29yPgorICAgIDwvY29uZGl0aW9uPgorCisgICAgPCEtLSBDb25kaXRpb25hbCBjb3B5IGZsYWdzIChkZXRlcm1pbmVkIGZyb20gdGhlIGZsYWdzIGFib3ZlKSAtLT4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJjb3B5LnN0cnV0cy5qYXIiPgorICAgICAgPG9yPgorICAgICAgICA8ZXF1YWxzIGFyZzE9IiR7ZnVsbC5kaXN0fSIgYXJnMj0ib24iIC8+CisgICAgICAgIDxlcXVhbHMgYXJnMT0iJHtzdHJ1dHMuamFyLnByZXNlbnR9IiBhcmcyPSJ0cnVlIiAvPgorICAgICAgPC9vcj4KKyAgICA8L2NvbmRpdGlvbj4KKworICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PSBCVUlMRDogU2V0IGNvbXBpbGUgZmxhZ3MgPT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iZmxhZ3MuZGlzcGxheSIgZGVwZW5kcz0iZmxhZ3MiIHVubGVzcz0iZmxhZ3MuaGlkZSI+CisKKyAgICA8ZWNobyBtZXNzYWdlPSItLS0gQnVpbGQgZW52aXJvbm1lbnQgZm9yIFRvbWNhdCBTZXJ2ZXIgQ29uZmlndXJhdGlvbiBBcHBsaWNhdGlvbiAtLS0iIC8+CisKKyAgICA8ZWNobyBtZXNzYWdlPSJJZiAke3Byb3BlcnR5X25hbWV9IGlzIGRpc3BsYXllZCwgdGhlbiB0aGUgcHJvcGVydHkgaXMgbm90IHNldCkiIC8+CisKKyAgICA8ZWNobyBtZXNzYWdlPSItLS0gQnVpbGQgb3B0aW9ucyAtLS0iIC8+CisgICAgPGVjaG8gbWVzc2FnZT0iZnVsbC5kaXN0PSR7ZnVsbC5kaXN0fSIgLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJidWlsZC5zeXNjbGFzc3BhdGg9JHtidWlsZC5zeXNjbGFzc3BhdGh9IiAvPgorICAgIDxlY2hvIG1lc3NhZ2U9ImNvbXBpbGUuZGVidWc9JHtjb21waWxlLmRlYnVnfSIgLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJjb21waWxlLmRlcHJlY2F0aW9uPSR7Y29tcGlsZS5kZXByZWNhdGlvbn0iIC8+CisgICAgPGVjaG8gbWVzc2FnZT0iY29tcGlsZS5vcHRpbWl6ZT0ke2NvbXBpbGUub3B0aW1pemV9IiAvPgorCisgICAgPGVjaG8gbWVzc2FnZT0iLS0tIEFudCBGbGFncyAtLS0iIC8+CisgICAgPGVjaG8gbWVzc2FnZT0iJmx0O3N0eWxlJmd0OyB0YXNrIGF2YWlsYWJsZSAocmVxdWlyZWQpPSR7c3R5bGUuYXZhaWxhYmxlfSIgLz4KKworICAgIDxlY2hvIG1lc3NhZ2U9Ii0tLSBKREsgLS0tIiAvPgorICAgIDxlY2hvIG1lc3NhZ2U9Impkay4xLjIucHJlc2VudD0ke2pkay4xLjIucHJlc2VudH0iIC8+CisgICAgPGVjaG8gbWVzc2FnZT0iamRrLjEuMy5wcmVzZW50PSR7amRrLjEuMy5wcmVzZW50fSIgLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJqZGsuMS40LnByZXNlbnQ9JHtqZGsuMS40LnByZXNlbnR9IiAvPgorCisgICAgPGVjaG8gbWVzc2FnZT0iLS0tIFJlcXVpcmVkIExpYnJhcmllcyAtLS0iIC8+CisgICAgPGVjaG8gbWVzc2FnZT0iamF4cC5wcmVzZW50PSR7amF4cC5wcmVzZW50fSIgLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJqbXgucHJlc2VudD0ke2pteC5wcmVzZW50fSIgLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJtb2RlbGVyLnByZXNlbnQ9JHttb2RlbGVyLnByZXNlbnR9IiAvPgorICAgIDxlY2hvIG1lc3NhZ2U9InNlcnZsZXQucHJlc2VudD0ke3NlcnZsZXQucHJlc2VudH0iIC8+CisgICAgPGVjaG8gbWVzc2FnZT0ianNwLnByZXNlbnQ9JHtqc3AucHJlc2VudH0iIC8+CisKKyAgICA8ZWNobyBtZXNzYWdlPSItLS0gUmVxdWlyZWQgSkFScyAtLS0iIC8+CisgICAgPGVjaG8gbWVzc2FnZT0iam14Lmphci5wcmVzZW50PSR7am14Lmphci5wcmVzZW50fSIgLz4KKyAgICA8ZWNobyBtZXNzYWdlPSJtb2RlbGVyLmphci5wcmVzZW50PSR7bW9kZWxlci5qYXIucHJlc2VudH0iIC8+CisgICAgPGVjaG8gbWVzc2FnZT0ic2VydmxldC1hcGkuamFyLnByZXNlbnQ9JHtzZXJ2bGV0LWFwaS5qYXIucHJlc2VudH0iIC8+CisgICAgPGVjaG8gbWVzc2FnZT0ianNwLWFwaS5qYXIucHJlc2VudD0ke2pzcC1hcGkuamFyLnByZXNlbnR9IiAvPgorICAgIDxlY2hvIG1lc3NhZ2U9InN0cnV0cy5qYXIucHJlc2VudD0ke3N0cnV0cy5qYXIucHJlc2VudH0iIC8+CisgICAgPGVjaG8gbWVzc2FnZT0iYmVhbnV0aWxzLmphci5wcmVzZW50PSR7YmVhbnV0aWxzLmphci5wcmVzZW50fSIgLz4KKworICAgIDxlY2hvIG1lc3NhZ2U9Ii0tLSBPcHRpb25hbCBKQVJzIC0tLSIgLz4KKworICAgIDxlY2hvIG1lc3NhZ2U9Ii0tLSBDb25kaXRpb25hbCBjb21waWxhdGlvbiBmbGFncyAtLS0iIC8+CisgICAgPGVjaG8gbWVzc2FnZT0iY29tcGlsZS5hZG1pbj0ke2NvbXBpbGUuYWRtaW59IiAvPgorCisgICAgPGVjaG8gbWVzc2FnZT0iLS0tIERpc3RyaWJ1dGlvbiBmbGFncyAtLS0iIC8+CisgICAgPGVjaG8gbWVzc2FnZT0iY29weS5zdHJ1dHMuamFyPSR7Y29weS5zdHJ1dHMuamFyfSIgLz4KKworICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09IEJVSUxEOiBDb3B5IEpBUnMgPT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iY29weS1zdHJ1dHMuamFyIiBpZj0ic3RydXRzLnByZXNlbnQiPgorICAgIDxjb3B5IHRvZGlyPSIke3dlYmFwcHMuYnVpbGR9LyR7d2ViYXBwLm5hbWV9L1dFQi1JTkYvbGliIiBmaWxlPSIke3N0cnV0cy5qYXJ9Ii8+CisgICAgPGNvcHkgdG9kaXI9IiR7d2ViYXBwcy5idWlsZH0vJHt3ZWJhcHAubmFtZX0vV0VCLUlORiIgZmlsZT0iJHtzdHJ1dHMubGlifS9zdHJ1dHMtYmVhbi50bGQiLz4KKyAgICA8Y29weSB0b2Rpcj0iJHt3ZWJhcHBzLmJ1aWxkfS8ke3dlYmFwcC5uYW1lfS9XRUItSU5GIiBmaWxlPSIke3N0cnV0cy5saWJ9L3N0cnV0cy1odG1sLnRsZCIvPgorICAgIDxjb3B5IHRvZGlyPSIke3dlYmFwcHMuYnVpbGR9LyR7d2ViYXBwLm5hbWV9L1dFQi1JTkYiIGZpbGU9IiR7c3RydXRzLmxpYn0vc3RydXRzLWxvZ2ljLnRsZCIvPgorICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PSBCVUlMRDogQ3JlYXRlIERpcmVjdG9yaWVzID09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iYnVpbGQtcHJlcGFyZSI+CisgICAgPG1rZGlyIGRpcj0iJHt3ZWJhcHBzLmJ1aWxkfSIvPgorICAgIDxta2RpciBkaXI9IiR7d2ViYXBwcy5idWlsZH0vJHt3ZWJhcHAubmFtZX0iLz4KKyAgICA8bWtkaXIgZGlyPSIke3dlYmFwcHMuYnVpbGR9LyR7d2ViYXBwLm5hbWV9L1dFQi1JTkYiLz4KKyAgICA8bWtkaXIgZGlyPSIke3dlYmFwcHMuYnVpbGR9LyR7d2ViYXBwLm5hbWV9L1dFQi1JTkYvY2xhc3NlcyIvPgorICAgIDxta2RpciBkaXI9IiR7d2ViYXBwcy5idWlsZH0vJHt3ZWJhcHAubmFtZX0vV0VCLUlORi9saWIiLz4KKyAgPC90YXJnZXQ+CisKKworICA8IS0tID09PT09PT09PT09PT09PT0gQlVJTEQ6IENvcHkgU3RhdGljIEZpbGVzID09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImJ1aWxkLXN0YXRpYyIgZGVwZW5kcz0iZmxhZ3MsZmxhZ3MuZGlzcGxheSxidWlsZC1wcmVwYXJlLGNvcHktc3RydXRzLmphciI+CisgICAgPGNvcHkgdG9kaXI9IiR7d2ViYXBwcy5idWlsZH0vJHt3ZWJhcHAubmFtZX0vV0VCLUlORi9saWIiIGZpbGU9IiR7Y29tbW9ucy1iZWFudXRpbHMuamFyfSIvPgorICAgIDxjb3B5IHRvZmlsZT0iJHt3ZWJhcHBzLmJ1aWxkfS8ke3dlYmFwcC5uYW1lfS9XRUItSU5GL2xpYi9jb21tb25zLWNvbGxlY3Rpb25zLmphciIgCisgICAgCWZpbGU9IiR7Y29tbW9ucy1jb2xsZWN0aW9ucy5qYXJ9Ii8+CisgICAgPGNvcHkgdG9kaXI9IiR7d2ViYXBwcy5idWlsZH0vJHt3ZWJhcHAubmFtZX0vV0VCLUlORi9saWIiIGZpbGU9IiR7Y29tbW9ucy1kaWdlc3Rlci5qYXJ9Ii8+CisgICAgPGNvcHkgdG9kaXI9IiR7d2ViYXBwcy5idWlsZH0vJHt3ZWJhcHAubmFtZX0iPgorICAgICAgPGZpbGVzZXQgZGlyPSIuIj4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iYnVpbGQuKiIvPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi8qLmphdmEiLz4KKyAgICAgIDwvZmlsZXNldD4KKyAgICA8L2NvcHk+CisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PSBCVUlMRDogQ29tcGlsZSBTZXJ2ZXIgQ29tcG9uZW50cyA9PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJidWlsZC1tYWluIiBkZXBlbmRzPSJidWlsZC1zdGF0aWMiIGlmPSJjb21waWxlLmFkbWluIj4KKyAgCisgICAgPGphdmFjICAgc3JjZGlyPSJXRUItSU5GL2NsYXNzZXMiCisgICAgICAgICAgICAgZGVzdGRpcj0iJHt3ZWJhcHBzLmJ1aWxkfS8ke3dlYmFwcC5uYW1lfS9XRUItSU5GL2NsYXNzZXMiCisgICAgICAgICAgICAgZGVidWc9IiR7Y29tcGlsZS5kZWJ1Z30iIGRlcHJlY2F0aW9uPSIke2NvbXBpbGUuZGVwcmVjYXRpb259IgorICAgICAgICAgICAgIG9wdGltaXplPSIke2NvbXBpbGUub3B0aW1pemV9IgorICAgICAgICAgICAgIGV4Y2x1ZGVzPSIqKi9DVlMvKioiPgorICAgICAgPGNsYXNzcGF0aCByZWZpZD0iYWRtaW4uY2xhc3NwYXRoIiAvPgorICAgIDwvamF2YWM+CisKKyAgPC90YXJnZXQ+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09IEJVSUxEOiBSZWJ1aWxkIEV2ZXJ5dGhpbmcgPT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImFsbCIgZGVwZW5kcz0iYnVpbGQtY2xlYW4sYnVpbGQtbWFpbiIKKyAgIGRlc2NyaXB0aW9uPSJDbGVhbiBhbmQgYnVpbGQgYWRtaW4gd2ViYXBwIi8+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09IEJVSUxEOiBDbGVhbiBEaXJlY3RvcnkgPT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImJ1aWxkLWNsZWFuIj4KKyAgICA8ZGVsZXRlIGRpcj0iJHt3ZWJhcHBzLmJ1aWxkfSIvPgorICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT0gRElTVDogQ3JlYXRlIERpcmVjdG9yaWVzID09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iZGlzdC1wcmVwYXJlIj4KKyAgICA8bWtkaXIgZGlyPSIke3dlYmFwcHMuZGlzdH0iLz4KKyAgPC90YXJnZXQ+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09IERJU1Q6IENyZWF0ZSBEaXN0cmlidXRpb24gRmlsZXMgPT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImRpc3QiIGRlcGVuZHM9ImJ1aWxkLW1haW4sZGlzdC1wcmVwYXJlIgorICAgZGVzY3JpcHRpb249IkNyZWF0ZSBhZG1pbiB3ZWJhcHAgYmluYXJ5IGRpc3RyaWJ1dGlvbiI+CisgICAgICA8amFyICAgamFyZmlsZT0iJHt3ZWJhcHBzLmRpc3R9LyR7d2ViYXBwLm5hbWV9LndhciIKKyAgICAgICAgICAgICBiYXNlZGlyPSIke3dlYmFwcHMuYnVpbGR9LyR7d2ViYXBwLm5hbWV9IiBpbmNsdWRlcz0iKioiLz4KKyAgPC90YXJnZXQ+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09IERJU1Q6IENsZWFuIERpcmVjdG9yeSA9PT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImRpc3QtY2xlYW4iPgorICAgIDxkZWx0cmVlIGRpcj0iJHtkaXN0LmRpcn0iLz4KKyAgPC90YXJnZXQ+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PT0gQ29udmVuaWVudCBTeW5vbnltcyA9PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImNsZWFuIiBkZXBlbmRzPSJidWlsZC1jbGVhbixkaXN0LWNsZWFuIgorICAgZGVzY3JpcHRpb249IkNsZWFuIGJ1aWxkIGFuZCBkaXN0IGRpcmVjdG9yaWVzIi8+CisKKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vYnV0dG9ucy5qc3AgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9idXR0b25zLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTBmNWU4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vYnV0dG9ucy5qc3AKQEAgLTAsMCArMSwxNiBAQAorICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CisgICAgPHRyPgorICAgICAgPHRkPiZuYnNwOzwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQgY29sc3Bhbj0iMiIgYWxpZ249InJpZ2h0IiBub3dyYXA+CisgICAgICAgIDxodG1sOnN1Ym1pdCBzdHlsZUNsYXNzPSJidXR0b24iPgorICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0iYnV0dG9uLnNhdmUiLz4gCisgICAgICAgIDwvaHRtbDpzdWJtaXQ+ICAgICAgICAgIAorICAgICAgICAmbmJzcDsKKyAgICAgICAgPGh0bWw6cmVzZXQgc3R5bGVDbGFzcz0iYnV0dG9uIj4KKyAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJidXR0b24uY2FuY2VsIi8+IAorICAgICAgICA8L2h0bWw6cmVzZXQ+IAorICAgICAgPC90ZD4KKyAgICA8L3RyPgorPC90YWJsZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9jb25uZWN0b3IvY29ubmVjdG9yLmpzcCBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2Nvbm5lY3Rvci9jb25uZWN0b3IuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkNTk0ODMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9jb25uZWN0b3IvY29ubmVjdG9yLmpzcApAQCAtMCwwICsxLDQzOSBAQAorPCEtLSBTdGFuZGFyZCBTdHJ1dHMgRW50cmllcyAtLT4KKworPCVAIHBhZ2UgbGFuZ3VhZ2U9ImphdmEiIGltcG9ydD0iamF2YS5uZXQuVVJMRW5jb2RlciIgY29udGVudFR5cGU9InRleHQvaHRtbDtjaGFyc2V0PXV0Zi04IiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL3N0cnV0cy1iZWFuLnRsZCIgcHJlZml4PSJiZWFuIiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL3N0cnV0cy1odG1sLnRsZCIgcHJlZml4PSJodG1sIiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL3N0cnV0cy1sb2dpYy50bGQiIHByZWZpeD0ibG9naWMiICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvY29udHJvbHMudGxkIiBwcmVmaXg9ImNvbnRyb2xzIiAlPgorCis8aHRtbDpodG1sIGxvY2FsZT0idHJ1ZSI+CisKKzwlQCBpbmNsdWRlIGZpbGU9Ii4uL3VzZXJzL2hlYWRlci5qc3AiICU+CisKKzwhLS0gQm9keSAtLT4KKzxib2R5IGJnY29sb3I9IndoaXRlIiBiYWNrZ3JvdW5kPSIuLi9pbWFnZXMvUGFwZXJUZXh0dXJlLmdpZiI+CisKKzwhLS1Gb3JtIC0tPgorCis8aHRtbDplcnJvcnMvPgorCis8aHRtbDpmb3JtIG1ldGhvZD0iUE9TVCIgYWN0aW9uPSIvU2F2ZUNvbm5lY3RvciI+CisKKyAgPGJlYW46ZGVmaW5lIGlkPSJ0aGlzT2JqZWN0TmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIG5hbWU9ImNvbm5lY3RvckZvcm0iIHByb3BlcnR5PSJvYmplY3ROYW1lIi8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0iY29ubmVjdG9yTmFtZSIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9ImFkbWluQWN0aW9uIi8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0ib2JqZWN0TmFtZSIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9ImNvbm5lY3RvclR5cGUiLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJzZXJ2aWNlTmFtZSIvPgorCisgIDx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgorICAgIDx0ciBiZ2NvbG9yPSI3MTcxQTUiPgorICAgICAgPHRkIHdpZHRoPSI4MSUiPgorICAgICAgIDxkaXYgY2xhc3M9InBhZ2UtdGl0bGUtdGV4dCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxsb2dpYzplcXVhbCBuYW1lPSJjb25uZWN0b3JGb3JtIiBwcm9wZXJ0eT0iYWRtaW5BY3Rpb24iIHZhbHVlPSJDcmVhdGUiPgorICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9ImFjdGlvbnMuY29ubmVjdG9ycy5jcmVhdGUiLz4KKyAgICAgICAgICA8L2xvZ2ljOmVxdWFsPgorICAgICAgICAgIDxsb2dpYzplcXVhbCBuYW1lPSJjb25uZWN0b3JGb3JtIiBwcm9wZXJ0eT0iYWRtaW5BY3Rpb24iIHZhbHVlPSJFZGl0Ij4KKyAgICAgICAgICAgPGJlYW46d3JpdGUgbmFtZT0iY29ubmVjdG9yRm9ybSIgcHJvcGVydHk9Im5vZGVMYWJlbCIvPgorICAgICAgICAgIDwvbG9naWM6ZXF1YWw+CisgICAgICAgPC9kaXY+CisgICAgICA8L3RkPgorICAgICAgPHRkIGFsaWduPSJyaWdodCIgbm93cmFwPgorICAgICAgICA8ZGl2IGNsYXNzPSJwYWdlLXRpdGxlLXRleHQiPgorICAgICAgPGNvbnRyb2xzOmFjdGlvbnMgbGFiZWw9IkNvbm5lY3RvciBBY3Rpb25zIj4KKyAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24gc2VsZWN0ZWQ9InRydWUiPiAtLS0tPGJlYW46bWVzc2FnZSBrZXk9ImFjdGlvbnMuYXZhaWxhYmxlLmFjdGlvbnMiLz4tLS0tIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbj4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgPGxvZ2ljOm5vdEVxdWFsIG5hbWU9ImNvbm5lY3RvckZvcm0iIHByb3BlcnR5PSJhZG1pbkFjdGlvbiIgdmFsdWU9IkNyZWF0ZSI+CisgICAgICAgICAgICA8bG9naWM6bm90RXF1YWwgbmFtZT0iY29ubmVjdG9yRm9ybSIgcHJvcGVydHk9InBvcnRUZXh0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSc8JT0gSW50ZWdlci50b1N0cmluZyhyZXF1ZXN0LmdldFNlcnZlclBvcnQoKSkgJT4nPgorICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbiB1cmw9JzwlPSAiL0RlbGV0ZUNvbm5lY3Rvci5kbz9zZWxlY3Q9IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUodGhpc09iamVjdE5hbWUpICU+Jz4KKyAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJhY3Rpb25zLmNvbm5lY3RvcnMuZGVsZXRlIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgICAgIDwvbG9naWM6bm90RXF1YWw+CisgICAgICAgICAgICA8L2xvZ2ljOm5vdEVxdWFsPgorICAgICAgIDwvY29udHJvbHM6YWN0aW9ucz4KKyAgICAgICAgIDwvZGl2PgorICAgICAgPC90ZD4KKyAgICA8L3RyPgorICA8L3RhYmxlPgorICAgIDwlQCBpbmNsdWRlIGZpbGU9Ii4uL2J1dHRvbnMuanNwIiAlPgorICA8YnI+CisKKyAgPHRhYmxlIGNsYXNzPSJiYWNrLXRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMSIgd2lkdGg9IjEwMCUiPgorICAgIDx0cj4KKyAgICAgIDx0ZD4KKyAgICAgICA8Y29udHJvbHM6dGFibGUgdGFibGVTdHlsZT0iZnJvbnQtdGFibGUiIGxpbmVTdHlsZT0ibGluZS1yb3ciPgorICAgICAgICAgICAgPGNvbnRyb2xzOnJvdyBoZWFkZXI9InRydWUiCisgICAgICAgICAgICAgICAgbGFiZWxTdHlsZT0idGFibGUtaGVhZGVyLXRleHQiIGRhdGFTdHlsZT0idGFibGUtaGVhZGVyLXRleHQiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPkdlbmVyYWw8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+Jm5ic3A7PC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9ImNvbm5lY3RvclR5cGUiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJjb25uZWN0b3IudHlwZSIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgICAgIDxsb2dpYzplcXVhbCBuYW1lPSJjb25uZWN0b3JGb3JtIiBwcm9wZXJ0eT0iYWRtaW5BY3Rpb24iIHZhbHVlPSJDcmVhdGUiPgorICAgICAgICAgICAgICAgICAgICA8aHRtbDpzZWxlY3QgcHJvcGVydHk9ImNvbm5lY3RvclR5cGUiIG9uY2hhbmdlPSJJQV9qdW1wTWVudSgnc2VsZicsdGhpcykiIHN0eWxlSWQ9ImNvbm5lY3RvclR5cGUiPgorICAgICAgICAgICAgICAgICAgICAgPGJlYW46ZGVmaW5lIGlkPSJjb25uZWN0b3JUeXBlVmFscyIgbmFtZT0iY29ubmVjdG9yRm9ybSIgcHJvcGVydHk9ImNvbm5lY3RvclR5cGVWYWxzIi8+CisgICAgICAgICAgICAgICAgICAgICA8aHRtbDpvcHRpb25zIGNvbGxlY3Rpb249ImNvbm5lY3RvclR5cGVWYWxzIiBwcm9wZXJ0eT0idmFsdWUiIGxhYmVsUHJvcGVydHk9ImxhYmVsIi8+CisgICAgICAgICAgICAgICAgICAgIDwvaHRtbDpzZWxlY3Q+CisgICAgICAgICAgICAgICAgPC9sb2dpYzplcXVhbD4KKyAgICAgICAgICAgICAgICA8bG9naWM6ZXF1YWwgbmFtZT0iY29ubmVjdG9yRm9ybSIgcHJvcGVydHk9ImFkbWluQWN0aW9uIiB2YWx1ZT0iRWRpdCI+CisgICAgICAgICAgICAgICAgICA8YmVhbjp3cml0ZSBuYW1lPSJjb25uZWN0b3JGb3JtIiBwcm9wZXJ0eT0iY29ubmVjdG9yVHlwZSIgc2NvcGU9InNlc3Npb24iLz4KKyAgICAgICAgICAgICAgICA8L2xvZ2ljOmVxdWFsPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgIDwlLS0gZG8gbm90IHNob3cgc2NoZW1lIHdoaWxlIGNyZWF0aW5nIGEgbmV3IGNvbm5lY3RvciAtLSU+CisgICAgPGxvZ2ljOm5vdEVxdWFsIG5hbWU9ImNvbm5lY3RvckZvcm0iIHByb3BlcnR5PSJhZG1pbkFjdGlvbiIgdmFsdWU9IkNyZWF0ZSI+CisgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9ImNvbm5lY3Rvci5zY2hlbWUiLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICA8YmVhbjp3cml0ZSBuYW1lPSJjb25uZWN0b3JGb3JtIiBwcm9wZXJ0eT0ic2NoZW1lIiBzY29wZT0ic2Vzc2lvbiIvPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKyAgICAgPC9sb2dpYzpub3RFcXVhbD4KKworICAgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9ImVuYWJsZUROUyI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9ImNvbm5lY3Rvci5lbmFibGUuZG5zIi8+OjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgICA8aHRtbDpzZWxlY3QgcHJvcGVydHk9ImVuYWJsZUxvb2t1cHMiIHN0eWxlSWQ9ImVuYWJsZUROUyI+CisgICAgICAgICAgICAgICAgICAgICA8YmVhbjpkZWZpbmUgaWQ9ImJvb2xlYW5WYWxzIiBuYW1lPSJjb25uZWN0b3JGb3JtIiBwcm9wZXJ0eT0iYm9vbGVhblZhbHMiLz4KKyAgICAgICAgICAgICAgICAgICAgIDxodG1sOm9wdGlvbnMgY29sbGVjdGlvbj0iYm9vbGVhblZhbHMiIHByb3BlcnR5PSJ2YWx1ZSIKKyAgICAgICAgICAgICAgICAgICBsYWJlbFByb3BlcnR5PSJsYWJlbCIvPgorICAgICAgICAgICAgICAgIDwvaHRtbDpzZWxlY3Q+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0idXJpZW5jb2RpbmciPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJjb25uZWN0b3IudXJpZW5jb2RpbmciLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICAgPGh0bWw6dGV4dCBwcm9wZXJ0eT0iVVJJRW5jb2RpbmdUZXh0IiBzaXplPSIzMCIgc3R5bGVJZD0idXJpZW5jb2RpbmciLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJ1c2Vib2R5ZW5jb2RpbmciPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJjb25uZWN0b3IudXNlQm9keUVuY29kaW5nRm9yVVJJIi8+OjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgICA8aHRtbDpzZWxlY3QgcHJvcGVydHk9InVzZUJvZHlFbmNvZGluZ0ZvclVSSVRleHQiIHN0eWxlSWQ9InVzZWJvZHllbmNvZGluZyI+CisgICAgICAgICAgICAgICAgICAgICA8YmVhbjpkZWZpbmUgaWQ9ImJvb2xlYW5WYWxzIiBuYW1lPSJjb25uZWN0b3JGb3JtIiBwcm9wZXJ0eT0iYm9vbGVhblZhbHMiLz4KKyAgICAgICAgICAgICAgICAgICAgIDxodG1sOm9wdGlvbnMgY29sbGVjdGlvbj0iYm9vbGVhblZhbHMiIHByb3BlcnR5PSJ2YWx1ZSIKKyAgICAgICAgICAgICAgICAgICBsYWJlbFByb3BlcnR5PSJsYWJlbCIvPgorICAgICAgICAgICAgICAgIDwvaHRtbDpzZWxlY3Q+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0iYWxsb3dUcmFjZSI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9ImNvbm5lY3Rvci5hbGxvd1RyYWNlIi8+OjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgICA8aHRtbDpzZWxlY3QgcHJvcGVydHk9ImFsbG93VHJhY2VUZXh0IiBzdHlsZUlkPSJhbGxvd1RyYWNlIj4KKyAgICAgICAgICAgICAgICAgICAgIDxiZWFuOmRlZmluZSBpZD0iYm9vbGVhblZhbHMiIG5hbWU9ImNvbm5lY3RvckZvcm0iIHByb3BlcnR5PSJib29sZWFuVmFscyIvPgorICAgICAgICAgICAgICAgICAgICAgPGh0bWw6b3B0aW9ucyBjb2xsZWN0aW9uPSJib29sZWFuVmFscyIgcHJvcGVydHk9InZhbHVlIgorICAgICAgICAgICAgICAgICAgIGxhYmVsUHJvcGVydHk9ImxhYmVsIi8+CisgICAgICAgICAgICAgICAgPC9odG1sOnNlbGVjdD4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgICAgPCUtLSBJbnB1dCBvbmx5IGFsbG93ZWQgb24gY3JlYXRlIHRyYW5zYWN0aW9uIC0tJT4KKyAgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJhZGRyZXNzIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0iY29ubmVjdG9yLmFkZHJlc3MuaXAiLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgIDxsb2dpYzplcXVhbCBuYW1lPSJjb25uZWN0b3JGb3JtIiBwcm9wZXJ0eT0iYWRtaW5BY3Rpb24iIHZhbHVlPSJDcmVhdGUiPgorICAgICAgICAgICAgICAgPGh0bWw6dGV4dCBwcm9wZXJ0eT0iYWRkcmVzcyIgc2l6ZT0iMjAiIHN0eWxlSWQ9ImFkZHJlc3MiLz4KKyAgICAgICAgICAgICA8L2xvZ2ljOmVxdWFsPgorICAgICAgICAgICAgIDxsb2dpYzplcXVhbCBuYW1lPSJjb25uZWN0b3JGb3JtIiBwcm9wZXJ0eT0iYWRtaW5BY3Rpb24iIHZhbHVlPSJFZGl0Ij4KKyAgICAgICAgICAgICAgICZuYnNwOzxiZWFuOndyaXRlIG5hbWU9ImNvbm5lY3RvckZvcm0iIHByb3BlcnR5PSJhZGRyZXNzIi8+CisgICAgICAgICAgICAgICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9ImFkZHJlc3MiLz4KKyAgICAgICAgICAgICA8L2xvZ2ljOmVxdWFsPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9InNlY3VyZSI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9ImNvbm5lY3Rvci5zZWN1cmUiLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICAgIDxodG1sOnNlbGVjdCBwcm9wZXJ0eT0ic2VjdXJlIiBzdHlsZUlkPSJzZWN1cmUiPgorICAgICAgICAgICAgICAgICAgICAgPGJlYW46ZGVmaW5lIGlkPSJib29sZWFuVmFscyIgbmFtZT0iY29ubmVjdG9yRm9ybSIgcHJvcGVydHk9ImJvb2xlYW5WYWxzIi8+CisgICAgICAgICAgICAgICAgICAgICA8aHRtbDpvcHRpb25zIGNvbGxlY3Rpb249ImJvb2xlYW5WYWxzIiBwcm9wZXJ0eT0idmFsdWUiCisgICAgICAgICAgICAgICAgICAgbGFiZWxQcm9wZXJ0eT0ibGFiZWwiLz4KKyAgICAgICAgICAgICAgICA8L2h0bWw6c2VsZWN0PgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgICA8JS0tY29udHJvbHM6cm93IGhlYWRlcj0idHJ1ZSIgbGFiZWxTdHlsZT0idGFibGUtaGVhZGVyLXRleHQiIGRhdGFTdHlsZT0idGFibGUtaGVhZGVyLXRleHQiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPlByb2Nlc3NvcnM8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+Jm5ic3A7PC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9Im1pblByb2Nlc3NvciI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9ImNvbm5lY3Rvci5taW4iLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICAgPGh0bWw6dGV4dCBwcm9wZXJ0eT0ibWluUHJvY2Vzc29yc1RleHQiIHNpemU9IjUiIHN0eWxlSWQ9Im1pblByb2Nlc3NvciIvPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9ImNvbm5lY3Rvck1heCI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9ImNvbm5lY3Rvci5tYXgiLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICAgPGh0bWw6dGV4dCBwcm9wZXJ0eT0ibWF4UHJvY2Vzc29yc1RleHQiIHNpemU9IjUiIHN0eWxlSWQ9ImNvbm5lY3Rvck1heCIvPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdy0tJT4KKworPCUtLSBUaGUgZm9sbG93aW5nIHByb3BlcnRpZXMgYXJlIHN1cHBvcnRlZCBvbmx5IGZvciBDb3lvdGUgSFRUUC9TIDEuMSBDb25uZWN0b3JzIC0tJT4KKworICAgICA8bG9naWM6bm90RXF1YWwgbmFtZT0iY29ubmVjdG9yRm9ybSIgcHJvcGVydHk9ImNvbm5lY3RvclR5cGUiIHNjb3BlPSJzZXNzaW9uIgorICAgICAgICAgICAgICAgICAgdmFsdWU9IkFKUCI+CisgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJhY2NlcHRDb3VudCI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9ImNvbm5lY3Rvci5hY2NlcHQuY291bnQiLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICA8aHRtbDp0ZXh0IHByb3BlcnR5PSJhY2NlcHRDb3VudFRleHQiIHNpemU9IjUiIG1heGxlbmd0aD0iNSIgc3R5bGVJZD0iYWNjZXB0Q291bnQiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJjb21wcmVzc2lvbiI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9ImNvbm5lY3Rvci5jb21wcmVzc2lvbiIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgICA8aHRtbDp0ZXh0IHByb3BlcnR5PSJjb21wcmVzc2lvbiIgc2l6ZT0iMTAiIHN0eWxlSWQ9ImNvbXByZXNzaW9uIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJsaW5nZXIiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJjb25uZWN0b3IuY29ubmVjdGlvbi5saW5nZXIiLz48YnI+CisgICAgICAgICAgICAgICAgKDxiZWFuOm1lc3NhZ2Uga2V5PSJjb25uZWN0b3IubWlsbGlzZWNvbmRzIi8+KSA6PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICAgPGh0bWw6dGV4dCBwcm9wZXJ0eT0iY29ubkxpbmdlclRleHQiIHNpemU9IjEwIiBzdHlsZUlkPSJsaW5nZXIiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9InRpbWVvdXQiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJjb25uZWN0b3IuY29ubmVjdGlvbi50aW1lb3V0Ii8+PGJyPgorICAgICAgICAgICAgICAgICg8YmVhbjptZXNzYWdlIGtleT0iY29ubmVjdG9yLm1pbGxpc2Vjb25kcyIvPikgOjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgIDxodG1sOnRleHQgcHJvcGVydHk9ImNvbm5UaW1lT3V0VGV4dCIgc2l6ZT0iMTAiIHN0eWxlSWQ9InRpbWVvdXQiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9InVwbG9hZCI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9ImNvbm5lY3Rvci5jb25uZWN0aW9uLnVwbG9hZFRpbWVvdXQiLz48YnI+CisgICAgICAgICAgICAgICAgKDxiZWFuOm1lc3NhZ2Uga2V5PSJjb25uZWN0b3IubWlsbGlzZWNvbmRzIi8+KSA6PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICAgPGh0bWw6dGV4dCBwcm9wZXJ0eT0iY29ublVwbG9hZFRpbWVPdXRUZXh0IiBzaXplPSIxMCIgc3R5bGVJZD0idXBsb2FkIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0iYnVmZmVyc2l6ZSI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9ImNvbm5lY3Rvci5kZWZhdWx0LmJ1ZmZlciIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgICA8aHRtbDp0ZXh0IHByb3BlcnR5PSJidWZmZXJTaXplVGV4dCIgc2l6ZT0iNSIgc3R5bGVJZD0iYnVmZmVyc2l6ZSIvPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9ImRpc2FibGVVcGxvYWQiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJjb25uZWN0b3IuY29ubmVjdGlvbi5kaXNhYmxlVXBsb2FkVGltZW91dCIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgICAgPGh0bWw6c2VsZWN0IHByb3BlcnR5PSJkaXNhYmxlVXBsb2FkVGltZW91dCIgc3R5bGVJZD0iZGlzYWJsZVVwbG9hZCI+CisgICAgICAgICAgICAgICAgICAgICA8YmVhbjpkZWZpbmUgaWQ9ImJvb2xlYW5WYWxzIiBuYW1lPSJjb25uZWN0b3JGb3JtIiBwcm9wZXJ0eT0iYm9vbGVhblZhbHMiLz4KKyAgICAgICAgICAgICAgICAgICAgIDxodG1sOm9wdGlvbnMgY29sbGVjdGlvbj0iYm9vbGVhblZhbHMiIHByb3BlcnR5PSJ2YWx1ZSIKKyAgICAgICAgICAgICAgICAgICBsYWJlbFByb3BlcnR5PSJsYWJlbCIvPgorICAgICAgICAgICAgICAgIDwvaHRtbDpzZWxlY3Q+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0ibWF4a2VlcGFsaXZlIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0iY29ubmVjdG9yLm1heGtlZXBhbGl2ZSIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgIDxodG1sOnRleHQgcHJvcGVydHk9Im1heEtlZXBBbGl2ZVRleHQiIHNpemU9IjUiIG1heGxlbmd0aD0iNSIgc3R5bGVJZD0ibWF4a2VlcGFsaXZlIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0ibWF4c3BhcmUiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJjb25uZWN0b3IubWF4c3BhcmUiLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICA8aHRtbDp0ZXh0IHByb3BlcnR5PSJtYXhTcGFyZSIgc2l6ZT0iNSIgbWF4bGVuZ3RoPSI1IiBzdHlsZUlkPSJtYXhzcGFyZSIvPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKwkKKyAgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJtYXh0aHJlYWRzIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0iY29ubmVjdG9yLm1heHRocmVhZHMiLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICA8aHRtbDp0ZXh0IHByb3BlcnR5PSJtYXhUaHJlYWRzIiBzaXplPSI1IiBtYXhsZW5ndGg9IjUiIHN0eWxlSWQ9Im1heHRocmVhZHMiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJtaW5zcGFyZSI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9ImNvbm5lY3Rvci5taW5zcGFyZSIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgIDxodG1sOnRleHQgcHJvcGVydHk9Im1pblNwYXJlIiBzaXplPSI1IiBtYXhsZW5ndGg9IjUiIHN0eWxlSWQ9Im1pbnNwYXJlIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0idGhyZWFkcHJpb3JpdHkiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJjb25uZWN0b3IudGhyZWFkcHJpb3JpdHkiLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICA8aHRtbDp0ZXh0IHByb3BlcnR5PSJ0aHJlYWRQcmlvcml0eSIgc2l6ZT0iNSIgbWF4bGVuZ3RoPSI1IiBzdHlsZUlkPSJ0aHJlYWRwcmlvcml0eSIvPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9InRjcE5vRGVsYXkiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJjb25uZWN0b3IudGNwTm9EZWxheSIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgICAgPGh0bWw6c2VsZWN0IHByb3BlcnR5PSJ0Y3BOb0RlbGF5IiBzdHlsZUlkPSJ0Y3BOb0RlbGF5Ij4KKyAgICAgICAgICAgICAgICAgICAgIDxiZWFuOmRlZmluZSBpZD0iYm9vbGVhblZhbHMiIG5hbWU9ImNvbm5lY3RvckZvcm0iIHByb3BlcnR5PSJib29sZWFuVmFscyIvPgorICAgICAgICAgICAgICAgICAgICAgPGh0bWw6b3B0aW9ucyBjb2xsZWN0aW9uPSJib29sZWFuVmFscyIgcHJvcGVydHk9InZhbHVlIgorICAgICAgICAgICAgICAgICAgIGxhYmVsUHJvcGVydHk9ImxhYmVsIi8+CisgICAgICAgICAgICAgICAgPC9odG1sOnNlbGVjdD4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJ4cG93ZXJlZGJ5Ij4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0iY29ubmVjdG9yLnhwb3dlcmVkYnkiLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICAgIDxodG1sOnNlbGVjdCBwcm9wZXJ0eT0ieHBvd2VyZWRCeSIgc3R5bGVJZD0ieHBvd2VyZWRieSI+CisgICAgICAgICAgICAgICAgICAgICA8YmVhbjpkZWZpbmUgaWQ9ImJvb2xlYW5WYWxzIiBuYW1lPSJjb25uZWN0b3JGb3JtIiBwcm9wZXJ0eT0iYm9vbGVhblZhbHMiLz4KKyAgICAgICAgICAgICAgICAgICAgIDxodG1sOm9wdGlvbnMgY29sbGVjdGlvbj0iYm9vbGVhblZhbHMiIHByb3BlcnR5PSJ2YWx1ZSIKKyAgICAgICAgICAgICAgICAgICBsYWJlbFByb3BlcnR5PSJsYWJlbCIvPgorICAgICAgICAgICAgICAgIDwvaHRtbDpzZWxlY3Q+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorICAgICA8L2xvZ2ljOm5vdEVxdWFsPgorCisgICAgICAgIDxjb250cm9sczpyb3cgaGVhZGVyPSJ0cnVlIiBsYWJlbFN0eWxlPSJ0YWJsZS1oZWFkZXItdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1oZWFkZXItdGV4dCI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+UG9ydHM8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+Jm5ic3A7PC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgICA8JS0tIElucHV0IG9ubHkgYWxsb3dlZCBvbiBjcmVhdGUgdHJhbnNhY3Rpb24gLS0lPgorICAgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9InBvcnRudW1iZXIiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJzZXJ2ZXIucG9ydG51bWJlciIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgPGxvZ2ljOmVxdWFsIG5hbWU9ImNvbm5lY3RvckZvcm0iIHByb3BlcnR5PSJhZG1pbkFjdGlvbiIgdmFsdWU9IkNyZWF0ZSI+CisgICAgICAgICAgICAgICA8aHRtbDp0ZXh0IHByb3BlcnR5PSJwb3J0VGV4dCIgc2l6ZT0iNSIgc3R5bGVJZD0icG9ydG51bWVyIi8+CisgICAgICAgICAgICAgPC9sb2dpYzplcXVhbD4KKyAgICAgICAgICAgICA8bG9naWM6ZXF1YWwgbmFtZT0iY29ubmVjdG9yRm9ybSIgcHJvcGVydHk9ImFkbWluQWN0aW9uIiB2YWx1ZT0iRWRpdCI+CisgICAgICAgICAgICAgICA8YmVhbjp3cml0ZSBuYW1lPSJjb25uZWN0b3JGb3JtIiBwcm9wZXJ0eT0icG9ydFRleHQiLz4KKyAgICAgICAgICAgICAgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0icG9ydFRleHQiLz4KKyAgICAgICAgICAgICA8L2xvZ2ljOmVxdWFsPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9InJlZGlyZWN0cG9ydCI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9ImNvbm5lY3Rvci5yZWRpcmVjdC5wb3J0bnVtYmVyIi8+OjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgIDxodG1sOnRleHQgcHJvcGVydHk9InJlZGlyZWN0UG9ydFRleHQiIHNpemU9IjUiIHN0eWxlSWQ9InJlZGlyZWN0cG9ydCIvPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgICA8Y29udHJvbHM6cm93IGhlYWRlcj0idHJ1ZSIgbGFiZWxTdHlsZT0idGFibGUtaGVhZGVyLXRleHQiIGRhdGFTdHlsZT0idGFibGUtaGVhZGVyLXRleHQiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPlByb3h5PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPiZuYnNwOzwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJwcm94eU5hbWUiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJjb25uZWN0b3IucHJveHkubmFtZSIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgICA8aHRtbDp0ZXh0IHByb3BlcnR5PSJwcm94eU5hbWUiIHNpemU9IjMwIiBzdHlsZUlkPSJwcm94eU5hbWUiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJwb3J0TnVtYmVyIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0iY29ubmVjdG9yLnByb3h5LnBvcnRudW1iZXIiLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICAgIDxodG1sOnRleHQgcHJvcGVydHk9InByb3h5UG9ydFRleHQiIHNpemU9IjUiIHN0eWxlSWQ9InBvcnROdW1iZXIiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKzwlLS0gVGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIGFyZSBzdXBwb3J0ZWQgb25seSBvbiBIVFRQUyBDb25uZWN0b3IgLS0lPgorICAgICA8bG9naWM6ZXF1YWwgbmFtZT0iY29ubmVjdG9yRm9ybSIgcHJvcGVydHk9InNjaGVtZSIgc2NvcGU9InNlc3Npb24iCisgICAgICAgICAgICAgICAgICB2YWx1ZT0iaHR0cHMiPgorICAgICAgICA8YnI+CisgICAgICAgIDxjb250cm9sczpyb3cgaGVhZGVyPSJ0cnVlIiBsYWJlbFN0eWxlPSJ0YWJsZS1oZWFkZXItdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1oZWFkZXItdGV4dCI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+RmFjdG9yeSBQcm9wZXJ0aWVzOjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4mbmJzcDs8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0iYWxnb3JpdGhtIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0iY29ubmVjdG9yLmFsZ29yaXRobSIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgICA8aHRtbDp0ZXh0IHByb3BlcnR5PSJhbGdvcml0aG0iIHNpemU9IjEwIiBzdHlsZUlkPSJhbGdvcml0aG0iLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJjaXBoZXJzIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0iY29ubmVjdG9yLmNpcGhlcnMiLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICAgPGh0bWw6dGV4dCBwcm9wZXJ0eT0iY2lwaGVycyIgc2l6ZT0iMTAiIHN0eWxlSWQ9ImNpcGhlcnMiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJjbGllbnRhdXRoIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0iY29ubmVjdG9yLmNsaWVudC5hdXRoIi8+OjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgICA8aHRtbDpzZWxlY3QgcHJvcGVydHk9ImNsaWVudEF1dGhlbnRpY2F0aW9uIiBzdHlsZUlkPSJjbGllbnRhdXRoIj4KKyAgICAgICAgICAgICAgICAgICAgIDxiZWFuOmRlZmluZSBpZD0iY2xpZW50QXV0aFZhbHMiIG5hbWU9ImNvbm5lY3RvckZvcm0iIHByb3BlcnR5PSJjbGllbnRBdXRoVmFscyIvPgorICAgICAgICAgICAgICAgICAgICAgPGh0bWw6b3B0aW9ucyBjb2xsZWN0aW9uPSJjbGllbnRBdXRoVmFscyIgcHJvcGVydHk9InZhbHVlIgorICAgICAgICAgICAgICAgICAgIGxhYmVsUHJvcGVydHk9ImxhYmVsIi8+CisgICAgICAgICAgICAgICAgPC9odG1sOnNlbGVjdD4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgICAgPCUtLSBJbnB1dCBhbGxvd2VkIG9ubHkgb24gY3JlYXRlIC0tJT4KKyAgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJrZXlzdG9yZSI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9ImNvbm5lY3Rvci5rZXlzdG9yZS5maWxlbmFtZSIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICA8bG9naWM6ZXF1YWwgbmFtZT0iY29ubmVjdG9yRm9ybSIgcHJvcGVydHk9ImFkbWluQWN0aW9uIiB2YWx1ZT0iQ3JlYXRlIj4KKyAgICAgICAgICAgICAgICA8aHRtbDp0ZXh0IHByb3BlcnR5PSJrZXlTdG9yZUZpbGVOYW1lIiBzaXplPSIzMCIgc3R5bGVJZD0ia2V5c3RvcmUiLz4KKyAgICAgICAgICAgICA8L2xvZ2ljOmVxdWFsPgorICAgICAgICAgICAgIDxsb2dpYzplcXVhbCBuYW1lPSJjb25uZWN0b3JGb3JtIiBwcm9wZXJ0eT0iYWRtaW5BY3Rpb24iIHZhbHVlPSJFZGl0Ij4KKyAgICAgICAgICAgICAgIDxiZWFuOndyaXRlIG5hbWU9ImNvbm5lY3RvckZvcm0iIHByb3BlcnR5PSJrZXlTdG9yZUZpbGVOYW1lIi8+CisgICAgICAgICAgICAgPC9sb2dpYzplcXVhbD4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgICAgPCUtLSBpbnB1dCBwYXNzd29yZCBhbGxvd2VkIG9ubHkgd2hpbGUgY3JlYXRpbmcgY29ubmVjdG9yIC0tJT4KKyAgICAgICAgPGxvZ2ljOmVxdWFsIG5hbWU9ImNvbm5lY3RvckZvcm0iIHByb3BlcnR5PSJhZG1pbkFjdGlvbiIgdmFsdWU9IkNyZWF0ZSI+CisgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0icGFzc3dvcmQiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJjb25uZWN0b3Iua2V5c3RvcmUucGFzc3dvcmQiLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICAgIDxodG1sOnBhc3N3b3JkIHByb3BlcnR5PSJrZXlTdG9yZVBhc3N3b3JkIiBzaXplPSIzMCIgc3R5bGVJZD0icGFzc3dvcmQiLz4KKyAgICAgICAgICAgICAgICA8JS0tCisgICAgICAgICAgICAgICAgPGxvZ2ljOmVxdWFsIG5hbWU9ImNvbm5lY3RvckZvcm0iIHByb3BlcnR5PSJhZG1pbkFjdGlvbiIgdmFsdWU9IkVkaXQiPgorICAgICAgICAgICAgICAgICAgIDxiZWFuOndyaXRlIG5hbWU9ImNvbm5lY3RvckZvcm0iIHByb3BlcnR5PSJrZXlTdG9yZVBhc3N3b3JkIi8+CisgICAgICAgICAgICAgICAgPC9sb2dpYzplcXVhbD4KKyAgICAgICAgICAgICAgICAtLSU+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorICAgICAgICA8L2xvZ2ljOmVxdWFsPgorCisgICAgICAgIDwlLS0gSW5wdXQgYWxsb3dlZCBvbmx5IG9uIGNyZWF0ZSAtLSU+CisgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0ia2V5dHlwZSI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9ImNvbm5lY3Rvci5rZXlzdG9yZS50eXBlIi8+OjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgIDxsb2dpYzplcXVhbCBuYW1lPSJjb25uZWN0b3JGb3JtIiBwcm9wZXJ0eT0iYWRtaW5BY3Rpb24iIHZhbHVlPSJDcmVhdGUiPgorICAgICAgICAgICAgICAgIDxodG1sOnRleHQgcHJvcGVydHk9ImtleVN0b3JlVHlwZSIgc2l6ZT0iMzAiIHN0eWxlSWQ9ImtleXR5cGUiLz4KKyAgICAgICAgICAgICA8L2xvZ2ljOmVxdWFsPgorICAgICAgICAgICAgIDxsb2dpYzplcXVhbCBuYW1lPSJjb25uZWN0b3JGb3JtIiBwcm9wZXJ0eT0iYWRtaW5BY3Rpb24iIHZhbHVlPSJFZGl0Ij4KKyAgICAgICAgICAgICAgIDxiZWFuOndyaXRlIG5hbWU9ImNvbm5lY3RvckZvcm0iIHByb3BlcnR5PSJrZXlTdG9yZVR5cGUiLz4KKyAgICAgICAgICAgICA8L2xvZ2ljOmVxdWFsPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9InNzbFByb3RvY29sIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0iY29ubmVjdG9yLnNzbFByb3RvY29sIi8+OjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgIDxodG1sOnRleHQgcHJvcGVydHk9InNzbFByb3RvY29sIiBzaXplPSIxMCIgc3R5bGVJZD0ic3NsUHJvdG9jb2wiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICA8L2xvZ2ljOmVxdWFsPgorICAgPC9jb250cm9sczp0YWJsZT4KKworICAgICAgPC90ZD4KKyAgICA8L3RyPgorICA8L3RhYmxlPgorICAgIDwlQCBpbmNsdWRlIGZpbGU9Ii4uL2J1dHRvbnMuanNwIiAlPgorICA8YnI+CisgIDwvaHRtbDpmb3JtPgorPHA+Jm5ic3A7PC9wPgorPC9ib2R5PgorPC9odG1sOmh0bWw+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9jb25uZWN0b3IvY29ubmVjdG9ycy5qc3AgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9jb25uZWN0b3IvY29ubmVjdG9ycy5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNmZjkxYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2Nvbm5lY3Rvci9jb25uZWN0b3JzLmpzcApAQCAtMCwwICsxLDk5IEBACis8IS0tIFN0YW5kYXJkIFN0cnV0cyBFbnRyaWVzIC0tPgorPCVAIHBhZ2UgbGFuZ3VhZ2U9ImphdmEiIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9zdHJ1dHMtYmVhbi50bGQiIHByZWZpeD0iYmVhbiIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9zdHJ1dHMtaHRtbC50bGQiIHByZWZpeD0iaHRtbCIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9zdHJ1dHMtbG9naWMudGxkIiBwcmVmaXg9ImxvZ2ljIiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL2NvbnRyb2xzLnRsZCIgcHJlZml4PSJjb250cm9scyIgJT4KKworPGh0bWw6aHRtbCBsb2NhbGU9InRydWUiPgorCis8JUAgaW5jbHVkZSBmaWxlPSIuLi91c2Vycy9oZWFkZXIuanNwIiAlPgorCis8IS0tIEJvZHkgLS0+Cis8Ym9keSBiZ2NvbG9yPSJ3aGl0ZSIgYmFja2dyb3VuZD0iLi4vaW1hZ2VzL1BhcGVyVGV4dHVyZS5naWYiPgorCis8IS0tRm9ybSAtLT4KKworPGh0bWw6ZXJyb3JzLz4KKworPGh0bWw6Zm9ybSBtZXRob2Q9InBvc3QiIGFjdGlvbj0iL0RlbGV0ZUNvbm5lY3RvcnMiPgorCisgIDx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgorICAgIDx0ciBiZ2NvbG9yPSI3MTcxQTUiPgorICAgICAgPHRkIHdpZHRoPSI4MSUiPgorICAgICAgICA8ZGl2IGNsYXNzPSJwYWdlLXRpdGxlLXRleHQiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0iYWN0aW9ucy5jb25uZWN0b3JzLmRlbGV0ZSIvPgorICAgICAgICA8L2Rpdj4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQgYWxpZ249InJpZ2h0IiBub3dyYXA+CisgICAgICAgIDxkaXYgY2xhc3M9InBhZ2UtdGl0bGUtdGV4dCI+CisgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9ucyBsYWJlbD0iQ29ubmVjdG9yIEFjdGlvbnMiPgorICAgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9uIHNlbGVjdGVkPSJ0cnVlIj4KKyAgICAgICAgICAgICAgICAtLS0tPGJlYW46bWVzc2FnZSBrZXk9ImFjdGlvbnMuYXZhaWxhYmxlLmFjdGlvbnMiLz4tLS0tCisgICAgICAgICAgICAgIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICA8L2NvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgICAgIDwvY29udHJvbHM6YWN0aW9ucz4KKyAgICAgICAgPC9kaXY+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgIDwvdGFibGU+CisKKzwlQCBpbmNsdWRlIGZpbGU9Ii4uL2J1dHRvbnMuanNwIiAlPgorICA8YnI+CisKKyAgPCUtLSBDb25uZWN0b3JzIExpc3QgLS0lPgorCisgIDx0YWJsZSBjbGFzcz0iYmFjay10YWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjEiCisgICAgICAgICB3aWR0aD0iMTAwJSI+CisgICAgPHRyPjx0ZD4KKworICAgICAgPHRhYmxlIGNsYXNzPSJmcm9udC10YWJsZSIgYm9yZGVyPSIxIgorICAgICAgIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgorCisgICAgICAgIDx0ciBjbGFzcz0iaGVhZGVyLXJvdyI+CisgICAgICAgICAgPHRkPjxkaXYgYWxpZ249ImxlZnQiIGNsYXNzPSJ0YWJsZS1oZWFkZXItdGV4dCI+CisgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0iYWN0aW9ucy5kZWxldGUiLz4KKyAgICAgICAgICA8L2Rpdj48L3RkPgorICAgICAgICAgIDx0ZD48ZGl2IGFsaWduPSJsZWZ0IiBjbGFzcz0idGFibGUtaGVhZGVyLXRleHQiPgorICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9Imhvc3QubmFtZSIvPgorICAgICAgICAgIDwvZGl2PjwvdGQ+CisgICAgICAgIDwvdHI+CisKKyAgICAgICAgPGxvZ2ljOml0ZXJhdGUgbmFtZT0iY29ubmVjdG9yc0xpc3QiIGlkPSJjb25uZWN0b3IiPgorICAgICAgICAgIDx0ciBjbGFzcz0ibGluZS1yb3ciPgorICAgICAgICAgICAgPHRkPjxkaXYgYWxpZ249ImxlZnQiIGNsYXNzPSJ0YWJsZS1ub3JtYWwtdGV4dCI+Jm5ic3A7CisgICAgICAgICAgICA8JS0tIHRoZSBjb25uZWN0b3IgdGhlIGFkbWluIGFwcCBpcyBydW5uaW5nIG9uIGNhbm5vdCBiZSBkZWxldGVkCisgICAgICAgICAgICAgICAgIHRocm91Z2ggdGhlIHRvb2wgLS0lPgorICAgICAgICAgICAgICA8bG9naWM6bWF0Y2ggIG5hbWU9ImNvbm5lY3RvciIgdmFsdWU9JzwlPSBJbnRlZ2VyLnRvU3RyaW5nKHJlcXVlc3QuZ2V0U2VydmVyUG9ydCgpKSAlPic+CisgICAgICAgICAgICAgICAgPGZvbnQgY29sb3I9J3JlZCc+KjwvZm9udD4KKyAgICAgICAgICAgICAgPC9sb2dpYzptYXRjaD4KKyAgICAgICAgICAgIDxsb2dpYzpub3RNYXRjaCBuYW1lPSJjb25uZWN0b3IiIHZhbHVlPSc8JT0gSW50ZWdlci50b1N0cmluZyhyZXF1ZXN0LmdldFNlcnZlclBvcnQoKSkgJT4nPgorICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJjb25uZWN0b3JzIj48L2xhYmVsPgorICAgICAgICAgICAgICA8aHRtbDptdWx0aWJveCBwcm9wZXJ0eT0iY29ubmVjdG9ycyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9IjwlPSBjb25uZWN0b3IudG9TdHJpbmcoKSAlPiIgc3R5bGVJZD0iY29ubmVjdG9ycyIvPgorICAgICAgICAgICAgPC9sb2dpYzpub3RNYXRjaD4KKyAgICAgICAgICAgIDwvZGl2PjwvdGQ+CisgICAgICAgICAgICA8dGQ+PGRpdiBhbGlnbj0ibGVmdCIgY2xhc3M9InRhYmxlLW5vcm1hbC10ZXh0Ij4mbmJzcDsKKyAgICAgICAgICAgICAgPGh0bWw6bGluayBwYWdlPSc8JT0gIi9FZGl0Q29ubmVjdG9yLmRvP3NlbGVjdD0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLm5ldC5VUkxFbmNvZGVyLmVuY29kZShjb25uZWN0b3IudG9TdHJpbmcoKSkgJT4nPgorICAgICAgICAgICAgICAgIENvbm5lY3RvciAoPGNvbnRyb2xzOmF0dHJpYnV0ZSBuYW1lPSJjb25uZWN0b3IiIGF0dHJpYnV0ZT0icG9ydCIvPikKKyAgICAgICAgICAgICAgPC9odG1sOmxpbms+CisgICAgICAgICAgICA8L2Rpdj48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvbG9naWM6aXRlcmF0ZT4KKworICAgICAgPC90YWJsZT4KKworICAgIDwvdGQ+PC90cj4KKyAgPC90YWJsZT4KKworPCVAIGluY2x1ZGUgZmlsZT0iLi4vYnV0dG9ucy5qc3AiICU+CisKKyAgPGJyPgorPC9odG1sOmZvcm0+CisKKzxwPiZuYnNwOzwvcD4KKzwvYm9keT4KKzwvaHRtbDpodG1sPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vY29udGV4dC9jb250ZXh0LmpzcCBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2NvbnRleHQvY29udGV4dC5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJkZGEzYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2NvbnRleHQvY29udGV4dC5qc3AKQEAgLTAsMCArMSwzMjggQEAKKzwhLS0gU3RhbmRhcmQgU3RydXRzIEVudHJpZXMgLS0+Cis8JUAgcGFnZSBsYW5ndWFnZT0iamF2YSIgaW1wb3J0PSJqYXZhLm5ldC5VUkxFbmNvZGVyIiBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgiICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvc3RydXRzLWJlYW4udGxkIiBwcmVmaXg9ImJlYW4iICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvc3RydXRzLWh0bWwudGxkIiBwcmVmaXg9Imh0bWwiICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvc3RydXRzLWxvZ2ljLnRsZCIgcHJlZml4PSJsb2dpYyIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9jb250cm9scy50bGQiIHByZWZpeD0iY29udHJvbHMiICU+CisKKzxodG1sOmh0bWwgbG9jYWxlPSJ0cnVlIj4KKworPCVAIGluY2x1ZGUgZmlsZT0iLi4vdXNlcnMvaGVhZGVyLmpzcCIgJT4KKworPCEtLSBCb2R5IC0tPgorPGJvZHkgYmdjb2xvcj0id2hpdGUiIGJhY2tncm91bmQ9Ii4uL2ltYWdlcy9QYXBlclRleHR1cmUuZ2lmIj4KKworPCEtLUZvcm0gLS0+CisKKzxodG1sOmVycm9ycy8+CisKKzxodG1sOmZvcm0gbWV0aG9kPSJQT1NUIiBhY3Rpb249Ii9TYXZlQ29udGV4dCI+CisgIDxiZWFuOmRlZmluZSBpZD0idGhpc09iamVjdE5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICBuYW1lPSJjb250ZXh0Rm9ybSIgcHJvcGVydHk9Im9iamVjdE5hbWUiLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJhZG1pbkFjdGlvbiIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9Im9iamVjdE5hbWUiLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJwYXJlbnRPYmplY3ROYW1lIi8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0ibG9hZGVyT2JqZWN0TmFtZSIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9Im1hbmFnZXJPYmplY3ROYW1lIi8+CisKKyAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CisgICAgPHRyIGJnY29sb3I9IjcxNzFBNSI+CisgICAgICA8dGQgd2lkdGg9IjgxJSI+CisgICAgICAgPGRpdiBjbGFzcz0icGFnZS10aXRsZS10ZXh0IiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGxvZ2ljOmVxdWFsIG5hbWU9ImNvbnRleHRGb3JtIiBwcm9wZXJ0eT0iYWRtaW5BY3Rpb24iIHZhbHVlPSJDcmVhdGUiPgorICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9ImFjdGlvbnMuY29udGV4dHMuY3JlYXRlIi8+CisgICAgICAgICAgPC9sb2dpYzplcXVhbD4KKyAgICAgICAgICA8bG9naWM6ZXF1YWwgbmFtZT0iY29udGV4dEZvcm0iIHByb3BlcnR5PSJhZG1pbkFjdGlvbiIgdmFsdWU9IkVkaXQiPgorICAgICAgICAgICAgPGJlYW46d3JpdGUgbmFtZT0iY29udGV4dEZvcm0iIHByb3BlcnR5PSJub2RlTGFiZWwiLz4KKyAgICAgICAgICA8L2xvZ2ljOmVxdWFsPgorICAgICAgIDwvZGl2PgorICAgICAgPC90ZD4KKyAgICAgIDx0ZCBhbGlnbj0icmlnaHQiIG5vd3JhcD4KKyAgICAgICAgPGRpdiBjbGFzcz0icGFnZS10aXRsZS10ZXh0Ij4KKyAgICAgIDxjb250cm9sczphY3Rpb25zIGxhYmVsPSJDb250ZXh0IEFjdGlvbnMiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbiBzZWxlY3RlZD0idHJ1ZSI+IC0tLS08YmVhbjptZXNzYWdlIGtleT0iYWN0aW9ucy5hdmFpbGFibGUuYWN0aW9ucyIvPi0tLS0gPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9uIGRpc2FibGVkPSJ0cnVlIj4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgPGxvZ2ljOm5vdEVxdWFsIG5hbWU9ImNvbnRleHRGb3JtIiBwcm9wZXJ0eT0iYWRtaW5BY3Rpb24iIHZhbHVlPSJDcmVhdGUiPgorICAgICAgICAgICAgPCUtLSBjYW5ub3QgZGVsZXRlIG9yIGFkZCB0aGUgcmVhbG0gb2YgdGhlIGNvbnRleHQgb2YgdGhlIGFkbWluIGFwcCAtLSU+CisgICAgICAgICAgICA8bG9naWM6bm90RXF1YWwgbmFtZT0iY29udGV4dEZvcm0iIHByb3BlcnR5PSJwYXRoIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSc8JT0gcmVxdWVzdC5nZXRDb250ZXh0UGF0aCgpICU+Jz4KKyAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24gdXJsPSc8JT0gIi9BZGRSZWFsbS5kbz9wYXJlbnQ9IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUodGhpc09iamVjdE5hbWUpICU+Jz4KKyAgICAgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0iYWN0aW9ucy5yZWFsbXMuY3JlYXRlIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24gdXJsPSc8JT0gIi9EZWxldGVSZWFsbS5kbz9wYXJlbnQ9IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUodGhpc09iamVjdE5hbWUpICU+Jz4KKyAgICAgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0iYWN0aW9ucy5yZWFsbXMuZGVsZXRlcyIvPgorICAgICAgICAgICAgPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgICA8L2xvZ2ljOm5vdEVxdWFsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbiBkaXNhYmxlZD0idHJ1ZSI+ICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICA8L2NvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24gdXJsPSc8JT0gIi9BZGRWYWx2ZS5kbz9wYXJlbnQ9IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUodGhpc09iamVjdE5hbWUpICU+Jz4KKyAgICAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJhY3Rpb25zLnZhbHZlcy5jcmVhdGUiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbiB1cmw9JzwlPSAiL0RlbGV0ZVZhbHZlLmRvP3BhcmVudD0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZSh0aGlzT2JqZWN0TmFtZSkgJT4nPgorICAgICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9ImFjdGlvbnMudmFsdmVzLmRlbGV0ZXMiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgPCUtLSBjYW5ub3QgZGVsZXRlIHRoZSBjb250ZXh0IG9mIHRoZSBhZG1pbiBhcHAgIGZyb20gdGhlIHRvb2wgLS0lPgorICAgICAgICAgICAgPGxvZ2ljOm5vdEVxdWFsIG5hbWU9ImNvbnRleHRGb3JtIiBwcm9wZXJ0eT0icGF0aCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0nPCU9IHJlcXVlc3QuZ2V0Q29udGV4dFBhdGgoKSAlPic+CisgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9uIGRpc2FibGVkPSJ0cnVlIj4gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbiB1cmw9JzwlPSAiL0RlbGV0ZUNvbnRleHQuZG8/c2VsZWN0PSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHRoaXNPYmplY3ROYW1lKSAlPic+CisgICAgICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9ImFjdGlvbnMuY29udGV4dHMuZGVsZXRlIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgICAgIDwvbG9naWM6bm90RXF1YWw+CisgICAgICAgICAgICA8L2xvZ2ljOm5vdEVxdWFsPgorICAgICAgICA8L2NvbnRyb2xzOmFjdGlvbnM+CisgICAgICAgICA8L2Rpdj4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgPC90YWJsZT4KKyAgICA8JUAgaW5jbHVkZSBmaWxlPSIuLi9idXR0b25zLmpzcCIgJT4KKyAgPGJyPgorCisgPCUtLSBDb250ZXh0IFByb3BlcnRpZXMgdGFibGUgLS0lPgorCisgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CisgICAgPHRyPiA8dGQ+ICA8ZGl2IGNsYXNzPSJ0YWJsZS10aXRsZS10ZXh0Ij4KKyAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJjb250ZXh0LnByb3BlcnRpZXMiLz4KKyAgICA8L2Rpdj4gPC90ZD4gPC90cj4KKyAgPC90YWJsZT4KKworICA8dGFibGUgY2xhc3M9ImJhY2stdGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIxIiB3aWR0aD0iMTAwJSI+CisgICAgPHRyPgorICAgICAgPHRkPgorICAgICAgIDxjb250cm9sczp0YWJsZSB0YWJsZVN0eWxlPSJmcm9udC10YWJsZSIgbGluZVN0eWxlPSJsaW5lLXJvdyI+CisgICAgICAgICAgICA8Y29udHJvbHM6cm93IGhlYWRlcj0idHJ1ZSIKKyAgICAgICAgICAgICAgICBsYWJlbFN0eWxlPSJ0YWJsZS1oZWFkZXItdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1oZWFkZXItdGV4dCI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9InNlcnZpY2UucHJvcGVydHkiLz48L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+PGJlYW46bWVzc2FnZSBrZXk9InNlcnZpY2UudmFsdWUiLz48L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0iY29va2llcyI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9ImNvbnRleHQuY29va2llcyIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgICAgPGh0bWw6c2VsZWN0IHByb3BlcnR5PSJjb29raWVzIiBzdHlsZUlkPSJjb29raWVzIj4KKyAgICAgICAgICAgICAgICAgICAgIDxiZWFuOmRlZmluZSBpZD0iYm9vbGVhblZhbHMiIG5hbWU9ImNvbnRleHRGb3JtIiBwcm9wZXJ0eT0iYm9vbGVhblZhbHMiLz4KKyAgICAgICAgICAgICAgICAgICAgIDxodG1sOm9wdGlvbnMgY29sbGVjdGlvbj0iYm9vbGVhblZhbHMiIHByb3BlcnR5PSJ2YWx1ZSIKKyAgICAgICAgICAgICAgICAgICBsYWJlbFByb3BlcnR5PSJsYWJlbCIvPgorICAgICAgICAgICAgICAgIDwvaHRtbDpzZWxlY3Q+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0iY3Jvc3NDb250ZXh0Ij4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0iY29udGV4dC5jcm9zcy5jb250ZXh0Ii8+OjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgICA8aHRtbDpzZWxlY3QgcHJvcGVydHk9ImNyb3NzQ29udGV4dCIgc3R5bGVJZD0iY3Jvc3NDb250ZXh0Ij4KKyAgICAgICAgICAgICAgICAgICAgIDxiZWFuOmRlZmluZSBpZD0iYm9vbGVhblZhbHMiIG5hbWU9ImNvbnRleHRGb3JtIiBwcm9wZXJ0eT0iYm9vbGVhblZhbHMiLz4KKyAgICAgICAgICAgICAgICAgICAgIDxodG1sOm9wdGlvbnMgY29sbGVjdGlvbj0iYm9vbGVhblZhbHMiIHByb3BlcnR5PSJ2YWx1ZSIKKyAgICAgICAgICAgICAgICAgICBsYWJlbFByb3BlcnR5PSJsYWJlbCIvPgorICAgICAgICAgICAgICAgIDwvaHRtbDpzZWxlY3Q+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCis8JS0tIGlucHV0IG9ubHkgYWxsb3dlZCBvbiBjcmVhdGUgdHJhbnNhY3Rpb24gLS0lPgorICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0iZG9jYmFzZSI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9ImNvbnRleHQuZG9jQmFzZSIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgIDxsb2dpYzplcXVhbCBuYW1lPSJjb250ZXh0Rm9ybSIgcHJvcGVydHk9ImFkbWluQWN0aW9uIiB2YWx1ZT0iQ3JlYXRlIj4KKyAgICAgICAgICAgICAgIDxodG1sOnRleHQgcHJvcGVydHk9ImRvY0Jhc2UiIHNpemU9IjMwIiBzdHlsZUlkPSJkb2NiYXNlIi8+CisgICAgICAgICAgICAgIDwvbG9naWM6ZXF1YWw+CisgICAgICAgICAgICAgIDxsb2dpYzplcXVhbCBuYW1lPSJjb250ZXh0Rm9ybSIgcHJvcGVydHk9ImFkbWluQWN0aW9uIiB2YWx1ZT0iRWRpdCI+CisgICAgICAgICAgICAgICA8YmVhbjp3cml0ZSBuYW1lPSJjb250ZXh0Rm9ybSIgcHJvcGVydHk9ImRvY0Jhc2UiLz4KKyAgICAgICAgICAgICAgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0iZG9jQmFzZSIvPgorICAgICAgICAgICAgICA8L2xvZ2ljOmVxdWFsPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJvdmVycmlkZSI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9ImNvbnRleHQub3ZlcnJpZGUiLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICAgIDxodG1sOnNlbGVjdCBwcm9wZXJ0eT0ib3ZlcnJpZGUiIHN0eWxlSWQ9Im92ZXJyaWRlIj4KKyAgICAgICAgICAgICAgICAgICAgIDxiZWFuOmRlZmluZSBpZD0iYm9vbGVhblZhbHMiIG5hbWU9ImNvbnRleHRGb3JtIiBwcm9wZXJ0eT0iYm9vbGVhblZhbHMiLz4KKyAgICAgICAgICAgICAgICAgICAgIDxodG1sOm9wdGlvbnMgY29sbGVjdGlvbj0iYm9vbGVhblZhbHMiIHByb3BlcnR5PSJ2YWx1ZSIKKyAgICAgICAgICAgICAgICAgICBsYWJlbFByb3BlcnR5PSJsYWJlbCIvPgorICAgICAgICAgICAgICAgIDwvaHRtbDpzZWxlY3Q+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCis8JS0tIGlucHV0IG9ubHkgYWxsb3dlZCBvbiBjcmVhdGUgdHJhbnNhY3Rpb24gLS0lPgorICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0icGF0aCI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9ImNvbnRleHQucGF0aCIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgPGxvZ2ljOmVxdWFsIG5hbWU9ImNvbnRleHRGb3JtIiBwcm9wZXJ0eT0iYWRtaW5BY3Rpb24iIHZhbHVlPSJDcmVhdGUiPgorICAgICAgICAgICAgICAgPGh0bWw6dGV4dCBwcm9wZXJ0eT0icGF0aCIgc2l6ZT0iMzAiIHN0eWxlSWQ9InBhdGgiLz4KKyAgICAgICAgICAgICA8L2xvZ2ljOmVxdWFsPgorICAgICAgICAgICAgIDxsb2dpYzplcXVhbCBuYW1lPSJjb250ZXh0Rm9ybSIgcHJvcGVydHk9ImFkbWluQWN0aW9uIiB2YWx1ZT0iRWRpdCI+CisgICAgICAgICAgICAgICA8YmVhbjp3cml0ZSBuYW1lPSJjb250ZXh0Rm9ybSIgcHJvcGVydHk9InBhdGgiLz4KKyAgICAgICAgICAgICAgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0icGF0aCIvPgorICAgICAgICAgICAgIDwvbG9naWM6ZXF1YWw+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9InJlbG9hZGFibGUiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJjb250ZXh0LnJlbG9hZGFibGUiLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICAgIDxodG1sOnNlbGVjdCBwcm9wZXJ0eT0icmVsb2FkYWJsZSIgc3R5bGVJZD0icmVsb2FkYWJsZSI+CisgICAgICAgICAgICAgICAgICAgICA8YmVhbjpkZWZpbmUgaWQ9ImJvb2xlYW5WYWxzIiBuYW1lPSJjb250ZXh0Rm9ybSIgcHJvcGVydHk9ImJvb2xlYW5WYWxzIi8+CisgICAgICAgICAgICAgICAgICAgICA8aHRtbDpvcHRpb25zIGNvbGxlY3Rpb249ImJvb2xlYW5WYWxzIiBwcm9wZXJ0eT0idmFsdWUiCisgICAgICAgICAgICAgICAgICAgbGFiZWxQcm9wZXJ0eT0ibGFiZWwiLz4KKyAgICAgICAgICAgICAgICA8L2h0bWw6c2VsZWN0PgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJzd2FsbG93T3V0cHV0Ij4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0iY29udGV4dC5zd2FsbG93T3V0cHV0Ii8+OjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgICA8aHRtbDpzZWxlY3QgcHJvcGVydHk9InN3YWxsb3dPdXRwdXQiIHN0eWxlSWQ9InN3YWxsb3dPdXRwdXQiPgorICAgICAgICAgICAgICAgICAgICAgPGJlYW46ZGVmaW5lIGlkPSJib29sZWFuVmFscyIgbmFtZT0iY29udGV4dEZvcm0iIHByb3BlcnR5PSJib29sZWFuVmFscyIvPgorICAgICAgICAgICAgICAgICAgICAgPGh0bWw6b3B0aW9ucyBjb2xsZWN0aW9uPSJib29sZWFuVmFscyIgcHJvcGVydHk9InZhbHVlIgorICAgICAgICAgICAgICAgICAgIGxhYmVsUHJvcGVydHk9ImxhYmVsIi8+CisgICAgICAgICAgICAgICAgPC9odG1sOnNlbGVjdD4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0idXNlcm5hbWluZyI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9ImNvbnRleHQudXNlbmFtaW5nIi8+OjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgICA8aHRtbDpzZWxlY3QgcHJvcGVydHk9InVzZU5hbWluZyIgc3R5bGVJZD0idXNlcm5hbWluZyI+CisgICAgICAgICAgICAgICAgICAgICA8YmVhbjpkZWZpbmUgaWQ9ImJvb2xlYW5WYWxzIiBuYW1lPSJjb250ZXh0Rm9ybSIgcHJvcGVydHk9ImJvb2xlYW5WYWxzIi8+CisgICAgICAgICAgICAgICAgICAgICA8aHRtbDpvcHRpb25zIGNvbGxlY3Rpb249ImJvb2xlYW5WYWxzIiBwcm9wZXJ0eT0idmFsdWUiCisgICAgICAgICAgICAgICAgICAgbGFiZWxQcm9wZXJ0eT0ibGFiZWwiLz4KKyAgICAgICAgICAgICAgICA8L2h0bWw6c2VsZWN0PgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJhbnRpSmFyTG9ja2luZyI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9ImNvbnRleHQuYW50aUphckxvY2tpbmciLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICAgIDxodG1sOnNlbGVjdCBwcm9wZXJ0eT0iYW50aUphckxvY2tpbmciIHN0eWxlSWQ9ImFudGlKYXJMb2NraW5nIj4KKyAgICAgICAgICAgICAgICAgICAgIDxiZWFuOmRlZmluZSBpZD0iYm9vbGVhblZhbHMiIG5hbWU9ImNvbnRleHRGb3JtIiBwcm9wZXJ0eT0iYm9vbGVhblZhbHMiLz4KKyAgICAgICAgICAgICAgICAgICAgIDxodG1sOm9wdGlvbnMgY29sbGVjdGlvbj0iYm9vbGVhblZhbHMiIHByb3BlcnR5PSJ2YWx1ZSIKKyAgICAgICAgICAgICAgICAgICBsYWJlbFByb3BlcnR5PSJsYWJlbCIvPgorICAgICAgICAgICAgICAgIDwvaHRtbDpzZWxlY3Q+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9ImFudGlSZXNvdXJjZUxvY2tpbmciPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJjb250ZXh0LmFudGlSZXNvdXJjZUxvY2tpbmciLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICAgIDxodG1sOnNlbGVjdCBwcm9wZXJ0eT0iYW50aVJlc291cmNlTG9ja2luZyIgc3R5bGVJZD0iYW50aVJlc291cmNlTG9ja2luZyI+CisgICAgICAgICAgICAgICAgICAgICA8YmVhbjpkZWZpbmUgaWQ9ImJvb2xlYW5WYWxzIiBuYW1lPSJjb250ZXh0Rm9ybSIgcHJvcGVydHk9ImJvb2xlYW5WYWxzIi8+CisgICAgICAgICAgICAgICAgICAgICA8aHRtbDpvcHRpb25zIGNvbGxlY3Rpb249ImJvb2xlYW5WYWxzIiBwcm9wZXJ0eT0idmFsdWUiCisgICAgICAgICAgICAgICAgICAgbGFiZWxQcm9wZXJ0eT0ibGFiZWwiLz4KKyAgICAgICAgICAgICAgICA8L2h0bWw6c2VsZWN0PgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworPCUtLSBpbnB1dCBvbmx5IGFsbG93ZWQgb24gY3JlYXRlIHRyYW5zYWN0aW9uID4KKyAgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9IndvcmtkaXIiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJjb250ZXh0LndvcmtkaXIiLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgIDxsb2dpYzplcXVhbCBuYW1lPSJjb250ZXh0Rm9ybSIgcHJvcGVydHk9ImFkbWluQWN0aW9uIiB2YWx1ZT0iQ3JlYXRlIj4KKyAgICAgICAgICAgICAgIDxodG1sOnRleHQgcHJvcGVydHk9IndvcmtEaXIiIHNpemU9IjMwIiBzdHlsZUlkPSJ3b3JrZGlyIi8+CisgICAgICAgICAgICAgPC9sb2dpYzplcXVhbD4KKyAgICAgICAgICAgICA8bG9naWM6ZXF1YWwgbmFtZT0iY29udGV4dEZvcm0iIHByb3BlcnR5PSJhZG1pbkFjdGlvbiIgdmFsdWU9IkVkaXQiPgorICAgICAgICAgICAgICAgPGJlYW46d3JpdGUgbmFtZT0iY29udGV4dEZvcm0iIHByb3BlcnR5PSJ3b3JrRGlyIi8+CisgICAgICAgICAgICAgICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9IndvcmtEaXIiLz4KKyAgICAgICAgICAgICA8L2xvZ2ljOmVxdWFsPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdy0tJT4KKyAgIDwvY29udHJvbHM6dGFibGU+CisgICAgPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CisKKzxicj4KKworPCUtLSBMb2FkZXIgUHJvcGVydGllcyB0YWJsZSAtLSU+CisKKyA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KKyAgICA8dHI+IDx0ZD4gIDxkaXYgY2xhc3M9InRhYmxlLXRpdGxlLXRleHQiPgorICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9ImNvbnRleHQubG9hZGVyLnByb3BlcnRpZXMiLz4KKyAgICA8L2Rpdj4gPC90ZD4gPC90cj4KKyAgPC90YWJsZT4KKworICA8dGFibGUgY2xhc3M9ImJhY2stdGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIxIiB3aWR0aD0iMTAwJSI+CisgICAgPHRyPgorICAgICAgPHRkPgorICAgICAgIDxjb250cm9sczp0YWJsZSB0YWJsZVN0eWxlPSJmcm9udC10YWJsZSIgbGluZVN0eWxlPSJsaW5lLXJvdyI+CisgICAgICAgICAgICA8Y29udHJvbHM6cm93IGhlYWRlcj0idHJ1ZSIKKyAgICAgICAgICAgICAgICBsYWJlbFN0eWxlPSJ0YWJsZS1oZWFkZXItdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1oZWFkZXItdGV4dCI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9InNlcnZpY2UucHJvcGVydHkiLz48L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+PGJlYW46bWVzc2FnZSBrZXk9InNlcnZpY2UudmFsdWUiLz48L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgIDwlLS1jb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0iY2hlY2tJbnRlcnZhbCI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9ImNvbnRleHQuY2hlY2tJbnRlcnZhbCIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgICAgPGh0bWw6dGV4dCBwcm9wZXJ0eT0ibGRyQ2hlY2tJbnRlcnZhbCIgc2l6ZT0iNSIgc3R5bGVJZD0iY2hlY2tJbnRlcnZhbCIvPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdy0tJT4KKworICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJyZWxvYWRhYmxlIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0iY29udGV4dC5yZWxvYWRhYmxlIi8+OjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgICA8aHRtbDpzZWxlY3QgcHJvcGVydHk9ImxkclJlbG9hZGFibGUiIHN0eWxlSWQ9InJlbG9hZGFibGUiPgorICAgICAgICAgICAgICAgICAgICAgPGJlYW46ZGVmaW5lIGlkPSJib29sZWFuVmFscyIgbmFtZT0iY29udGV4dEZvcm0iIHByb3BlcnR5PSJib29sZWFuVmFscyIvPgorICAgICAgICAgICAgICAgICAgICAgPGh0bWw6b3B0aW9ucyBjb2xsZWN0aW9uPSJib29sZWFuVmFscyIgcHJvcGVydHk9InZhbHVlIgorICAgICAgICAgICAgICAgICAgIGxhYmVsUHJvcGVydHk9ImxhYmVsIi8+CisgICAgICAgICAgICAgICAgPC9odG1sOnNlbGVjdD4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisgICA8L2NvbnRyb2xzOnRhYmxlPgorICAgIDwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorCis8QlI+Cis8JS0tIFNlc3Npb24gTWFuYWdlciBQcm9wZXJ0aWVzIHRhYmxlIC0tJT4KKyA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KKyAgICA8dHI+IDx0ZD4gIDxkaXYgY2xhc3M9InRhYmxlLXRpdGxlLXRleHQiPgorICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9ImNvbnRleHQuc2Vzc2lvbm1nci5wcm9wZXJ0aWVzIi8+CisgICAgPC9kaXY+IDwvdGQ+IDwvdHI+CisgIDwvdGFibGU+CisKKyAgPHRhYmxlIGNsYXNzPSJiYWNrLXRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMSIgd2lkdGg9IjEwMCUiPgorICAgIDx0cj4KKyAgICAgIDx0ZD4KKyAgICAgICA8Y29udHJvbHM6dGFibGUgdGFibGVTdHlsZT0iZnJvbnQtdGFibGUiIGxpbmVTdHlsZT0ibGluZS1yb3ciPgorICAgICAgICAgICAgPGNvbnRyb2xzOnJvdyBoZWFkZXI9InRydWUiCisgICAgICAgICAgICAgICAgbGFiZWxTdHlsZT0idGFibGUtaGVhZGVyLXRleHQiIGRhdGFTdHlsZT0idGFibGUtaGVhZGVyLXRleHQiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJzZXJ2aWNlLnByb3BlcnR5Ii8+PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPjxiZWFuOm1lc3NhZ2Uga2V5PSJzZXJ2aWNlLnZhbHVlIi8+PC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgICA8JS0tY29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9ImNoZWNrSW50ZXJ2YWwiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJjb250ZXh0LmNoZWNrSW50ZXJ2YWwiLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICAgIDxodG1sOnRleHQgcHJvcGVydHk9Im1nckNoZWNrSW50ZXJ2YWwiIHNpemU9IjUiIHN0eWxlSWQ9ImNoZWNrSW50ZXJ2YWwiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3ctLSU+CisKKyAgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9InNlc3Npb25JZCI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9ImNvbnRleHQuc2Vzc2lvbklkIi8+OjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgIDxodG1sOnRleHRhcmVhIHByb3BlcnR5PSJtZ3JTZXNzaW9uSURJbml0IiBjb2xzPSIzMCIgcm93cz0iMiIgc3R5bGVJZD0ic2Vzc2lvbklkIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJtYXhTZXNzaW9ucyI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9ImNvbnRleHQubWF4LnNlc3Npb25zIi8+OjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgIDxodG1sOnRleHQgcHJvcGVydHk9Im1nck1heFNlc3Npb25zIiBzaXplPSI1IiBzdHlsZUlkPSJtYXhTZXNzaW9ucyIvPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKyAgIDwvY29udHJvbHM6dGFibGU+CisgICAgPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CisKKyAgICA8JUAgaW5jbHVkZSBmaWxlPSIuLi9idXR0b25zLmpzcCIgJT4KKworICA8YnI+CisgIDwvaHRtbDpmb3JtPgorPHA+Jm5ic3A7PC9wPgorPC9ib2R5PgorPC9odG1sOmh0bWw+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9jb250ZXh0L2NvbnRleHRzLmpzcCBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2NvbnRleHQvY29udGV4dHMuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyOTcxNjYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9jb250ZXh0L2NvbnRleHRzLmpzcApAQCAtMCwwICsxLDk3IEBACis8IS0tIFN0YW5kYXJkIFN0cnV0cyBFbnRyaWVzIC0tPgorPCVAIHBhZ2UgbGFuZ3VhZ2U9ImphdmEiIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9zdHJ1dHMtYmVhbi50bGQiIHByZWZpeD0iYmVhbiIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9zdHJ1dHMtaHRtbC50bGQiIHByZWZpeD0iaHRtbCIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9zdHJ1dHMtbG9naWMudGxkIiBwcmVmaXg9ImxvZ2ljIiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL2NvbnRyb2xzLnRsZCIgcHJlZml4PSJjb250cm9scyIgJT4KKworPGh0bWw6aHRtbCBsb2NhbGU9InRydWUiPgorCis8JUAgaW5jbHVkZSBmaWxlPSIuLi91c2Vycy9oZWFkZXIuanNwIiAlPgorCis8IS0tIEJvZHkgLS0+Cis8Ym9keSBiZ2NvbG9yPSJ3aGl0ZSIgYmFja2dyb3VuZD0iLi4vaW1hZ2VzL1BhcGVyVGV4dHVyZS5naWYiPgorCis8IS0tRm9ybSAtLT4KKworPGh0bWw6ZXJyb3JzLz4KKworPGh0bWw6Zm9ybSBtZXRob2Q9InBvc3QiIGFjdGlvbj0iL0RlbGV0ZUNvbnRleHRzIj4KKworICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KKyAgICA8dHIgYmdjb2xvcj0iNzE3MUE1Ij4KKyAgICAgIDx0ZCB3aWR0aD0iODElIj4KKyAgICAgICAgPGRpdiBjbGFzcz0icGFnZS10aXRsZS10ZXh0IiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9ImFjdGlvbnMuY29udGV4dHMuZGVsZXRlIi8+CisgICAgICAgIDwvZGl2PgorICAgICAgPC90ZD4KKyAgICAgIDx0ZCBhbGlnbj0icmlnaHQiIG5vd3JhcD4KKyAgICAgICAgPGRpdiBjbGFzcz0icGFnZS10aXRsZS10ZXh0Ij4KKyAgICAgICAgICAgIDxjb250cm9sczphY3Rpb25zIGxhYmVsPSJDb250ZXh0IEFjdGlvbnMiPgorICAgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9uIHNlbGVjdGVkPSJ0cnVlIj4KKyAgICAgICAgICAgICAgICAtLS0tPGJlYW46bWVzc2FnZSBrZXk9ImFjdGlvbnMuYXZhaWxhYmxlLmFjdGlvbnMiLz4tLS0tCisgICAgICAgICAgICAgIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICA8L2NvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgICAgIDwvY29udHJvbHM6YWN0aW9ucz4KKyAgICAgICAgPC9kaXY+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgIDwvdGFibGU+CisKKzwlQCBpbmNsdWRlIGZpbGU9Ii4uL2J1dHRvbnMuanNwIiAlPgorICA8YnI+CisKKyAgPCUtLSBDb250ZXh0cyBMaXN0IC0tJT4KKyAgPHRhYmxlIGNsYXNzPSJiYWNrLXRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMSIKKyAgICAgICAgIHdpZHRoPSIxMDAlIj4KKyAgICA8dHI+PHRkPgorCisgICAgICA8dGFibGUgY2xhc3M9ImZyb250LXRhYmxlIiBib3JkZXI9IjEiCisgICAgICAgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CisKKyAgICAgICAgPHRyIGNsYXNzPSJoZWFkZXItcm93Ij4KKyAgICAgICAgICA8dGQ+PGRpdiBhbGlnbj0ibGVmdCIgY2xhc3M9InRhYmxlLWhlYWRlci10ZXh0Ij4KKyAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJhY3Rpb25zLmRlbGV0ZSIvPgorICAgICAgICAgIDwvZGl2PjwvdGQ+CisgICAgICAgICAgPHRkPjxkaXYgYWxpZ249ImxlZnQiIGNsYXNzPSJ0YWJsZS1oZWFkZXItdGV4dCI+CisgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0iaG9zdC5uYW1lIi8+CisgICAgICAgICAgPC9kaXY+PC90ZD4KKyAgICAgICAgPC90cj4KKyAgICAKKyAgICAgICAgPGxvZ2ljOml0ZXJhdGUgbmFtZT0iY29udGV4dHNMaXN0IiBpZD0iY29udGV4dCI+CisgICAgICAgICAgPHRyIGNsYXNzPSJsaW5lLXJvdyI+CisgICAgICAgICAgICA8dGQ+PGRpdiBhbGlnbj0ibGVmdCIgY2xhc3M9InRhYmxlLW5vcm1hbC10ZXh0Ij4mbmJzcDsKKyAgICAgICAgICAgICAgPCUtLSBhZG1pbiBjb250ZXh0IGNhbm5vdCBiZSBkZWxldGVkIGZyb20gdGhlIHRvb2wgLS0lPgorICAgICAgICAgICAgICA8bG9naWM6bWF0Y2ggbmFtZT0iY29udGV4dCIgdmFsdWU9JzwlPSByZXF1ZXN0LmdldENvbnRleHRQYXRoKCkrIiwiICU+Jz4KKyAgICAgICAgICAgICAgICA8Zm9udCBjb2xvcj0ncmVkJz4qPC9mb250PgorICAgICAgICAgICAgICA8L2xvZ2ljOm1hdGNoPgorICAgICAgICAgICAgICA8bG9naWM6bm90TWF0Y2ggbmFtZT0iY29udGV4dCIgdmFsdWU9JzwlPSByZXF1ZXN0LmdldENvbnRleHRQYXRoKCkrIiwiICU+Jz4KKyAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iY29udGV4dHMiPjwvbGFiZWw+CisgICAgICAgICAgICAgIDxodG1sOm11bHRpYm94IHByb3BlcnR5PSJjb250ZXh0cyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9IjwlPSBjb250ZXh0LnRvU3RyaW5nKCkgJT4iIHN0eWxlSWQ9ImNvbnRleHRzIi8+CisgICAgICAgICAgICAgIDwvbG9naWM6bm90TWF0Y2g+CisgICAgICAgICAgICA8L2Rpdj48L3RkPgorICAgICAgICAgICAgPHRkPjxkaXYgYWxpZ249ImxlZnQiIGNsYXNzPSJ0YWJsZS1ub3JtYWwtdGV4dCI+Jm5ic3A7CisgICAgICAgICAgICAgIDxodG1sOmxpbmsgcGFnZT0nPCU9ICIvRWRpdENvbnRleHQuZG8/c2VsZWN0PSIgKworICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubmV0LlVSTEVuY29kZXIuZW5jb2RlKGNvbnRleHQudG9TdHJpbmcoKSkgJT4nPgorICAgICAgICAgICAgICAgIDxjb250cm9sczphdHRyaWJ1dGUgbmFtZT0iY29udGV4dCIgYXR0cmlidXRlPSJwYXRoIi8+CisgICAgICAgICAgICAgIDwvaHRtbDpsaW5rPgorICAgICAgICAgICAgPC9kaXY+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L2xvZ2ljOml0ZXJhdGU+CisKKyAgICAgIDwvdGFibGU+CisKKyAgICA8L3RkPjwvdHI+CisgIDwvdGFibGU+CisKKzwlQCBpbmNsdWRlIGZpbGU9Ii4uL2J1dHRvbnMuanNwIiAlPgorCisgIDxicj4KKzwvaHRtbDpmb3JtPgorCis8cD4mbmJzcDs8L3A+Cis8L2JvZHk+Cis8L2h0bWw6aHRtbD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2RlZmF1bHRjb250ZXh0L2RlZmF1bHRjb250ZXh0LmpzcCBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2RlZmF1bHRjb250ZXh0L2RlZmF1bHRjb250ZXh0LmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGM2NWYzCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vZGVmYXVsdGNvbnRleHQvZGVmYXVsdGNvbnRleHQuanNwCkBAIC0wLDAgKzEsMjIxIEBACis8IS0tIFN0YW5kYXJkIFN0cnV0cyBFbnRyaWVzIC0tPgorPCVAIHBhZ2UgbGFuZ3VhZ2U9ImphdmEiIGltcG9ydD0iamF2YS5uZXQuVVJMRW5jb2RlciIgY29udGVudFR5cGU9InRleHQvaHRtbDtjaGFyc2V0PXV0Zi04IiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL3N0cnV0cy1iZWFuLnRsZCIgcHJlZml4PSJiZWFuIiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL3N0cnV0cy1odG1sLnRsZCIgcHJlZml4PSJodG1sIiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL3N0cnV0cy1sb2dpYy50bGQiIHByZWZpeD0ibG9naWMiICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvY29udHJvbHMudGxkIiBwcmVmaXg9ImNvbnRyb2xzIiAlPgorCis8aHRtbDpodG1sIGxvY2FsZT0idHJ1ZSI+CisKKzwlQCBpbmNsdWRlIGZpbGU9Ii4uL3VzZXJzL2hlYWRlci5qc3AiICU+CisKKzwhLS0gQm9keSAtLT4KKzxib2R5IGJnY29sb3I9IndoaXRlIiBiYWNrZ3JvdW5kPSIuLi9pbWFnZXMvUGFwZXJUZXh0dXJlLmdpZiI+CisKKzwhLS1Gb3JtIC0tPgorCis8aHRtbDplcnJvcnMvPgorCis8aHRtbDpmb3JtIG1ldGhvZD0iUE9TVCIgYWN0aW9uPSIvU2F2ZURlZmF1bHRDb250ZXh0Ij4KKyAgPGJlYW46ZGVmaW5lIGlkPSJ0aGlzT2JqZWN0TmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIG5hbWU9ImRlZmF1bHRDb250ZXh0Rm9ybSIgcHJvcGVydHk9Im9iamVjdE5hbWUiLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJhZG1pbkFjdGlvbiIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9Im9iamVjdE5hbWUiLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJwYXJlbnRPYmplY3ROYW1lIi8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0ibG9hZGVyT2JqZWN0TmFtZSIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9Im1hbmFnZXJPYmplY3ROYW1lIi8+CisKKyAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CisgICAgPHRyIGJnY29sb3I9IjcxNzFBNSI+CisgICAgICA8dGQgd2lkdGg9IjgxJSI+CisgICAgICAgPGRpdiBjbGFzcz0icGFnZS10aXRsZS10ZXh0IiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGxvZ2ljOmVxdWFsIG5hbWU9ImRlZmF1bHRDb250ZXh0Rm9ybSIgcHJvcGVydHk9ImFkbWluQWN0aW9uIiB2YWx1ZT0iQ3JlYXRlIj4KKyAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJhY3Rpb25zLmRlZmF1bHRjb250ZXh0cy5jcmVhdGUiLz4KKyAgICAgICAgICA8L2xvZ2ljOmVxdWFsPgorICAgICAgICAgIDxsb2dpYzplcXVhbCBuYW1lPSJkZWZhdWx0Q29udGV4dEZvcm0iIHByb3BlcnR5PSJhZG1pbkFjdGlvbiIgdmFsdWU9IkVkaXQiPgorICAgICAgICAgICAgPGJlYW46d3JpdGUgbmFtZT0iZGVmYXVsdENvbnRleHRGb3JtIiBwcm9wZXJ0eT0ibm9kZUxhYmVsIi8+CisgICAgICAgICAgPC9sb2dpYzplcXVhbD4KKyAgICAgICA8L2Rpdj4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQgYWxpZ249InJpZ2h0IiBub3dyYXA+CisgICAgICAgIDxkaXYgY2xhc3M9InBhZ2UtdGl0bGUtdGV4dCI+CisgICAgICA8Y29udHJvbHM6YWN0aW9ucyBsYWJlbD0iRGVmYXVsdCBDb250ZXh0IEFjdGlvbnMiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbiBzZWxlY3RlZD0idHJ1ZSI+IC0tLS08YmVhbjptZXNzYWdlIGtleT0iYWN0aW9ucy5hdmFpbGFibGUuYWN0aW9ucyIvPi0tLS0gPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9uIGRpc2FibGVkPSJ0cnVlIj4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgPC9jb250cm9sczphY3Rpb25zPgorICAgICAgICAgPC9kaXY+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgIDwvdGFibGU+CisgICAgPCVAIGluY2x1ZGUgZmlsZT0iLi4vYnV0dG9ucy5qc3AiICU+CisgIDxicj4KKworIDwlLS0gQ29udGV4dCBQcm9wZXJ0aWVzIHRhYmxlIC0tJT4KKworIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgorICAgIDx0cj4gPHRkPiAgPGRpdiBjbGFzcz0idGFibGUtdGl0bGUtdGV4dCI+CisgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0iZGVmYXVsdGNvbnRleHQucHJvcGVydGllcyIvPgorICAgIDwvZGl2PiA8L3RkPiA8L3RyPgorICA8L3RhYmxlPgorCisgIDx0YWJsZSBjbGFzcz0iYmFjay10YWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjEiIHdpZHRoPSIxMDAlIj4KKyAgICA8dHI+CisgICAgICA8dGQ+CisgICAgICAgPGNvbnRyb2xzOnRhYmxlIHRhYmxlU3R5bGU9ImZyb250LXRhYmxlIiBsaW5lU3R5bGU9ImxpbmUtcm93Ij4KKyAgICAgICAgICAgIDxjb250cm9sczpyb3cgaGVhZGVyPSJ0cnVlIgorICAgICAgICAgICAgICAgIGxhYmVsU3R5bGU9InRhYmxlLWhlYWRlci10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLWhlYWRlci10ZXh0Ij4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0ic2VydmljZS5wcm9wZXJ0eSIvPjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT48YmVhbjptZXNzYWdlIGtleT0ic2VydmljZS52YWx1ZSIvPjwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJjb29raWVzIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0iY29udGV4dC5jb29raWVzIi8+OjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgICA8aHRtbDpzZWxlY3QgcHJvcGVydHk9ImNvb2tpZXMiIHN0eWxlSWQ9ImNvb2tpZXMiPgorICAgICAgICAgICAgICAgICAgICAgPGJlYW46ZGVmaW5lIGlkPSJib29sZWFuVmFscyIgbmFtZT0iZGVmYXVsdENvbnRleHRGb3JtIiBwcm9wZXJ0eT0iYm9vbGVhblZhbHMiLz4KKyAgICAgICAgICAgICAgICAgICAgIDxodG1sOm9wdGlvbnMgY29sbGVjdGlvbj0iYm9vbGVhblZhbHMiIHByb3BlcnR5PSJ2YWx1ZSIKKyAgICAgICAgICAgICAgICAgICBsYWJlbFByb3BlcnR5PSJsYWJlbCIvPgorICAgICAgICAgICAgICAgIDwvaHRtbDpzZWxlY3Q+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0iY3Jvc3Njb250ZXh0Ij4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0iY29udGV4dC5jcm9zcy5jb250ZXh0Ii8+OjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgICA8aHRtbDpzZWxlY3QgcHJvcGVydHk9ImNyb3NzQ29udGV4dCIgc3R5bGVJZD0iY3Jvc3Njb250ZXh0Ij4KKyAgICAgICAgICAgICAgICAgICAgIDxiZWFuOmRlZmluZSBpZD0iYm9vbGVhblZhbHMiIG5hbWU9ImRlZmF1bHRDb250ZXh0Rm9ybSIgcHJvcGVydHk9ImJvb2xlYW5WYWxzIi8+CisgICAgICAgICAgICAgICAgICAgICA8aHRtbDpvcHRpb25zIGNvbGxlY3Rpb249ImJvb2xlYW5WYWxzIiBwcm9wZXJ0eT0idmFsdWUiCisgICAgICAgICAgICAgICAgICAgbGFiZWxQcm9wZXJ0eT0ibGFiZWwiLz4KKyAgICAgICAgICAgICAgICA8L2h0bWw6c2VsZWN0PgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJyZWxvYWRhYmxlIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0iY29udGV4dC5yZWxvYWRhYmxlIi8+OjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgICA8aHRtbDpzZWxlY3QgcHJvcGVydHk9InJlbG9hZGFibGUiIHN0eWxlSWQ9InJlbG9hZGFibGUiPgorICAgICAgICAgICAgICAgICAgICAgPGJlYW46ZGVmaW5lIGlkPSJib29sZWFuVmFscyIgbmFtZT0iZGVmYXVsdENvbnRleHRGb3JtIiBwcm9wZXJ0eT0iYm9vbGVhblZhbHMiLz4KKyAgICAgICAgICAgICAgICAgICAgIDxodG1sOm9wdGlvbnMgY29sbGVjdGlvbj0iYm9vbGVhblZhbHMiIHByb3BlcnR5PSJ2YWx1ZSIKKyAgICAgICAgICAgICAgICAgICBsYWJlbFByb3BlcnR5PSJsYWJlbCIvPgorICAgICAgICAgICAgICAgIDwvaHRtbDpzZWxlY3Q+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9InN3YWxsb3dvdXRwdXQiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJjb250ZXh0LnN3YWxsb3dPdXRwdXQiLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICAgIDxodG1sOnNlbGVjdCBwcm9wZXJ0eT0ic3dhbGxvd091dHB1dCIgc3R5bGVJZD0ic3dhbGxvd291dHB1dCI+CisgICAgICAgICAgICAgICAgICAgICA8YmVhbjpkZWZpbmUgaWQ9ImJvb2xlYW5WYWxzIiBuYW1lPSJkZWZhdWx0Q29udGV4dEZvcm0iIHByb3BlcnR5PSJib29sZWFuVmFscyIvPgorICAgICAgICAgICAgICAgICAgICAgPGh0bWw6b3B0aW9ucyBjb2xsZWN0aW9uPSJib29sZWFuVmFscyIgcHJvcGVydHk9InZhbHVlIgorICAgICAgICAgICAgICAgICAgIGxhYmVsUHJvcGVydHk9ImxhYmVsIi8+CisgICAgICAgICAgICAgICAgPC9odG1sOnNlbGVjdD4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0idXNlbmFtaW5nIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0iY29udGV4dC51c2VuYW1pbmciLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICAgIDxodG1sOnNlbGVjdCBwcm9wZXJ0eT0idXNlTmFtaW5nIiBzdHlsZUlkPSJ1c2VuYW1pbmciPgorICAgICAgICAgICAgICAgICAgICAgPGJlYW46ZGVmaW5lIGlkPSJib29sZWFuVmFscyIgbmFtZT0iZGVmYXVsdENvbnRleHRGb3JtIiBwcm9wZXJ0eT0iYm9vbGVhblZhbHMiLz4KKyAgICAgICAgICAgICAgICAgICAgIDxodG1sOm9wdGlvbnMgY29sbGVjdGlvbj0iYm9vbGVhblZhbHMiIHByb3BlcnR5PSJ2YWx1ZSIKKyAgICAgICAgICAgICAgICAgICBsYWJlbFByb3BlcnR5PSJsYWJlbCIvPgorICAgICAgICAgICAgICAgIDwvaHRtbDpzZWxlY3Q+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorICAgPC9jb250cm9sczp0YWJsZT4KKyAgICA8L3RkPgorICA8L3RyPgorPC90YWJsZT4KKworPGJyPgorCis8JS0tIExvYWRlciBQcm9wZXJ0aWVzIHRhYmxlIC0tJT4KKworIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgorICAgIDx0cj4gPHRkPiAgPGRpdiBjbGFzcz0idGFibGUtdGl0bGUtdGV4dCI+CisgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0iY29udGV4dC5sb2FkZXIucHJvcGVydGllcyIvPgorICAgIDwvZGl2PiA8L3RkPiA8L3RyPgorICA8L3RhYmxlPgorCisgIDx0YWJsZSBjbGFzcz0iYmFjay10YWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjEiIHdpZHRoPSIxMDAlIj4KKyAgICA8dHI+CisgICAgICA8dGQ+CisgICAgICAgPGNvbnRyb2xzOnRhYmxlIHRhYmxlU3R5bGU9ImZyb250LXRhYmxlIiBsaW5lU3R5bGU9ImxpbmUtcm93Ij4KKyAgICAgICAgICAgIDxjb250cm9sczpyb3cgaGVhZGVyPSJ0cnVlIgorICAgICAgICAgICAgICAgIGxhYmVsU3R5bGU9InRhYmxlLWhlYWRlci10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLWhlYWRlci10ZXh0Ij4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0ic2VydmljZS5wcm9wZXJ0eSIvPjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT48YmVhbjptZXNzYWdlIGtleT0ic2VydmljZS52YWx1ZSIvPjwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJjaGVja0ludGVydmFsIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0iY29udGV4dC5jaGVja0ludGVydmFsIi8+OjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgICA8aHRtbDp0ZXh0IHByb3BlcnR5PSJsZHJDaGVja0ludGVydmFsIiBzaXplPSI1IiBzdHlsZUlkPSJjaGVja0ludGVydmFsIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9InJlbG9hZGFibGUiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJjb250ZXh0LnJlbG9hZGFibGUiLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICAgIDxodG1sOnNlbGVjdCBwcm9wZXJ0eT0ibGRyUmVsb2FkYWJsZSIgc3R5bGVJZD0icmVsb2FkYWJsZSI+CisgICAgICAgICAgICAgICAgICAgICA8YmVhbjpkZWZpbmUgaWQ9ImJvb2xlYW5WYWxzIiBuYW1lPSJkZWZhdWx0Q29udGV4dEZvcm0iIHByb3BlcnR5PSJib29sZWFuVmFscyIvPgorICAgICAgICAgICAgICAgICAgICAgPGh0bWw6b3B0aW9ucyBjb2xsZWN0aW9uPSJib29sZWFuVmFscyIgcHJvcGVydHk9InZhbHVlIgorICAgICAgICAgICAgICAgICAgIGxhYmVsUHJvcGVydHk9ImxhYmVsIi8+CisgICAgICAgICAgICAgICAgPC9odG1sOnNlbGVjdD4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisgICA8L2NvbnRyb2xzOnRhYmxlPgorICAgIDwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorCis8QlI+Cis8JS0tIFNlc3Npb24gTWFuYWdlciBQcm9wZXJ0aWVzIHRhYmxlIC0tJT4KKyA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KKyAgICA8dHI+IDx0ZD4gIDxkaXYgY2xhc3M9InRhYmxlLXRpdGxlLXRleHQiPgorICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9ImNvbnRleHQuc2Vzc2lvbm1nci5wcm9wZXJ0aWVzIi8+CisgICAgPC9kaXY+IDwvdGQ+IDwvdHI+CisgIDwvdGFibGU+CisKKyAgPHRhYmxlIGNsYXNzPSJiYWNrLXRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMSIgd2lkdGg9IjEwMCUiPgorICAgIDx0cj4KKyAgICAgIDx0ZD4KKyAgICAgICA8Y29udHJvbHM6dGFibGUgdGFibGVTdHlsZT0iZnJvbnQtdGFibGUiIGxpbmVTdHlsZT0ibGluZS1yb3ciPgorICAgICAgICAgICAgPGNvbnRyb2xzOnJvdyBoZWFkZXI9InRydWUiCisgICAgICAgICAgICAgICAgbGFiZWxTdHlsZT0idGFibGUtaGVhZGVyLXRleHQiIGRhdGFTdHlsZT0idGFibGUtaGVhZGVyLXRleHQiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJzZXJ2aWNlLnByb3BlcnR5Ii8+PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPjxiZWFuOm1lc3NhZ2Uga2V5PSJzZXJ2aWNlLnZhbHVlIi8+PC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9ImNoZWNraW50ZXJ2YWwiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJjb250ZXh0LmNoZWNrSW50ZXJ2YWwiLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICAgIDxodG1sOnRleHQgcHJvcGVydHk9Im1nckNoZWNrSW50ZXJ2YWwiIHNpemU9IjUiIHN0eWxlSWQ9ImNoZWNraW50ZXJ2YWwiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9InNlc3Npb25JZCI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9ImNvbnRleHQuc2Vzc2lvbklkIi8+OjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgIDxodG1sOnRleHRhcmVhIHByb3BlcnR5PSJtZ3JTZXNzaW9uSURJbml0IiBjb2xzPSIzMCIgcm93cz0iMiIgc3R5bGVJZD0ic2Vzc2lvbklkIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJtYXhzZXNzaW9ucyI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9ImNvbnRleHQubWF4LnNlc3Npb25zIi8+OjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgIDxodG1sOnRleHQgcHJvcGVydHk9Im1nck1heFNlc3Npb25zIiBzaXplPSI1IiBzdHlsZUlkPSJtYXhzZXNzaW9ucyIvPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKyAgIDwvY29udHJvbHM6dGFibGU+CisgICAgPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CisKKyAgICA8JUAgaW5jbHVkZSBmaWxlPSIuLi9idXR0b25zLmpzcCIgJT4KKworICA8YnI+CisgIDwvaHRtbDpmb3JtPgorPHA+Jm5ic3A7PC9wPgorPC9ib2R5PgorPC9odG1sOmh0bWw+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9kdW1wUmVnaXN0cnkuanNwIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vZHVtcFJlZ2lzdHJ5LmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmVmMzJhCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vZHVtcFJlZ2lzdHJ5LmpzcApAQCAtMCwwICsxLDQ4IEBACis8IS0tIFN0YW5kYXJkIFN0cnV0cyBFbnRyaWVzIC0tPgorCis8JUAgcGFnZSBsYW5ndWFnZT0iamF2YSIgY29udGVudFR5cGU9InRleHQvaHRtbDtjaGFyc2V0PXV0Zi04IiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL3N0cnV0cy1iZWFuLnRsZCIgcHJlZml4PSJiZWFuIiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL3N0cnV0cy1odG1sLnRsZCIgcHJlZml4PSJodG1sIiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL3N0cnV0cy1sb2dpYy50bGQiIHByZWZpeD0ibG9naWMiICU+CisKKzxodG1sOmh0bWwgbG9jYWxlPSJ0cnVlIj4KKworPCEtLSBTdGFuZGFyZCBDb250ZW50IC0tPgorCis8JUAgaW5jbHVkZSBmaWxlPSJoZWFkZXIuanNwIiAlPgorCis8IS0tIEJvZHkgLS0+CisKKzxib2R5IGJnY29sb3I9IndoaXRlIj4KKworPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjUiPgorCisgIDx0cj4KKyAgICA8dGggYWxpZ249ImNlbnRlciIgY29sc3Bhbj0iMyI+CisgICAgICBSZWdpc3RlcmVkIE1hbmFnZWQgQmVhbnMKKyAgICA8L3RoPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGggYWxpZ249ImNlbnRlciI+TmFtZTwvdGg+CisgICAgPHRoIGFsaWduPSJjZW50ZXIiPkdyb3VwPC90aD4KKyAgICA8dGggYWxpZ249ImNlbnRlciI+RGVzY3JpcHRpb248L3RoPgorICA8L3RyPgorCisgIDxsb2dpYzppdGVyYXRlIGlkPSJiZWFuIiBuYW1lPSJiZWFucyI+CisgICAgPHRyPgorICAgICAgPHRkPjxiZWFuOndyaXRlIG5hbWU9ImJlYW4iIHByb3BlcnR5PSJuYW1lIi8+PC90ZD4KKyAgICAgIDx0ZD48YmVhbjp3cml0ZSBuYW1lPSJiZWFuIiBwcm9wZXJ0eT0iZ3JvdXAiLz48L3RkPgorICAgICAgPHRkPjxiZWFuOndyaXRlIG5hbWU9ImJlYW4iIHByb3BlcnR5PSJkZXNjcmlwdGlvbiIvPjwvdGQ+CisgICAgPC90cj4KKyAgPC9sb2dpYzppdGVyYXRlPgorCis8L3RhYmxlPgorCis8L2JvZHk+CisKKzwhLS0gU3RhbmRhcmQgRm9vdGVyIC0tPgorCis8JUAgaW5jbHVkZSBmaWxlPSJmb290ZXIuanNwIiAlPgorCis8L2h0bWw6aHRtbD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2R1bXBTZXJ2ZXIuanNwIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vZHVtcFNlcnZlci5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJlZmYyNAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2R1bXBTZXJ2ZXIuanNwCkBAIC0wLDAgKzEsNDQgQEAKKzwhLS0gU3RhbmRhcmQgU3RydXRzIEVudHJpZXMgLS0+CisKKzwlQCBwYWdlIGxhbmd1YWdlPSJqYXZhIiBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgiICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvc3RydXRzLWJlYW4udGxkIiBwcmVmaXg9ImJlYW4iICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvc3RydXRzLWh0bWwudGxkIiBwcmVmaXg9Imh0bWwiICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvc3RydXRzLWxvZ2ljLnRsZCIgcHJlZml4PSJsb2dpYyIgJT4KKworPGh0bWw6aHRtbCBsb2NhbGU9InRydWUiPgorCis8IS0tIFN0YW5kYXJkIENvbnRlbnQgLS0+CisKKzwlQCBpbmNsdWRlIGZpbGU9ImhlYWRlci5qc3AiICU+CisKKzwhLS0gQm9keSAtLT4KKworPGJvZHkgYmdjb2xvcj0id2hpdGUiPgorCis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iNSI+CisKKyAgPHRyPgorICAgIDx0aCBhbGlnbj0iY2VudGVyIiBjb2xzcGFuPSIxIj4KKyAgICAgIFJlZ2lzdGVyZWQgTUJlYW4gTmFtZXMKKyAgICA8L3RoPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGggYWxpZ249ImNlbnRlciI+TmFtZTwvdGg+CisgIDwvdHI+CisKKyAgPGxvZ2ljOml0ZXJhdGUgaWQ9Im5hbWUiIG5hbWU9Im5hbWVzIj4KKyAgICA8dHI+CisgICAgICA8dGQ+PGJlYW46d3JpdGUgbmFtZT0ibmFtZSIvPjwvdGQ+CisgICAgPC90cj4KKyAgPC9sb2dpYzppdGVyYXRlPgorCis8L3RhYmxlPgorCis8L2JvZHk+CisKKzwhLS0gU3RhbmRhcmQgRm9vdGVyIC0tPgorCis8JUAgaW5jbHVkZSBmaWxlPSJmb290ZXIuanNwIiAlPgorCis8L2h0bWw6aHRtbD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2Vycm9yLmpzcCBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2Vycm9yLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTYzNDdlCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vZXJyb3IuanNwCkBAIC0wLDAgKzEsMzcgQEAKKzwhLS0gU3RhbmRhcmQgU3RydXRzIEVudHJpZXMgLS0+CisKKzwlQCBwYWdlIGxhbmd1YWdlPSJqYXZhIiBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgiICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvc3RydXRzLWJlYW4udGxkIiBwcmVmaXg9ImJlYW4iICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvc3RydXRzLWh0bWwudGxkIiBwcmVmaXg9Imh0bWwiICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvc3RydXRzLWxvZ2ljLnRsZCIgcHJlZml4PSJsb2dpYyIgJT4KKworPGh0bWw6aHRtbCBsb2NhbGU9InRydWUiPgorCis8IS0tIFN0YW5kYXJkIENvbnRlbnQgLS0+CisKKzwlQCBpbmNsdWRlIGZpbGU9ImhlYWRlci5qc3AiICU+CisKKzwhLS0gQm9keSAtLT4KKworPGJvZHkgYmdjb2xvcj0id2hpdGUiIGJhY2tncm91bmQ9ImltYWdlcy9QYXBlclRleHR1cmUuZ2lmIj4KKworPGNlbnRlcj4KKworPGgyPgorICA8YmVhbjptZXNzYWdlIGtleT0iZXJyb3IubG9naW4iLz4KKyAgPGJyPgorICA8YmVhbjptZXNzYWdlIGtleT0iZXJyb3IudHJ5YWdhaW4iLz4KKyAgPGh0bWw6bGluayBwYWdlPSIvIj4KKyAgICA8YmVhbjptZXNzYWdlIGtleT0iZXJyb3IuaGVyZSIvPgorICA8L2h0bWw6bGluaz4KKzwvaDI+CisKKzwvY2VudGVyPgorCis8L2JvZHk+CisKKzwhLS0gU3RhbmRhcmQgRm9vdGVyIC0tPgorCis8JUAgaW5jbHVkZSBmaWxlPSJmb290ZXIuanNwIiAlPgorCis8L2h0bWw6aHRtbD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2Zvb3Rlci5qc3AgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9mb290ZXIuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9mb290ZXIuanNwCmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9mcmFtZXNldC5qc3AgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9mcmFtZXNldC5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDkyOTM2MAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2ZyYW1lc2V0LmpzcApAQCAtMCwwICsxLDI3IEBACis8IS0tIFN0YW5kYXJkIFN0cnV0cyBFbnRyaWVzIC0tPgorCis8JUAgcGFnZSBsYW5ndWFnZT0iamF2YSIgY29udGVudFR5cGU9InRleHQvaHRtbDtjaGFyc2V0PXV0Zi04IiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL3N0cnV0cy1iZWFuLnRsZCIgcHJlZml4PSJiZWFuIiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL3N0cnV0cy1odG1sLnRsZCIgcHJlZml4PSJodG1sIiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL3N0cnV0cy1sb2dpYy50bGQiIHByZWZpeD0ibG9naWMiICU+CisKKzxodG1sOmh0bWwgbG9jYWxlPSJ0cnVlIj4KKworPCEtLSBTdGFuZGFyZCBDb250ZW50IC0tPgorCis8JUAgaW5jbHVkZSBmaWxlPSJoZWFkZXIuanNwIiAlPgorCis8IS0tIEJvZHkgLS0+Cis8ZnJhbWVzZXQgcm93cz0iMTE3LDY4NSoiIGNvbHM9IioiIGZyYW1lYm9yZGVyPSJOTyIgYm9yZGVyPSIzIiBmcmFtZXNwYWNpbmc9IjMiPgorICA8ZnJhbWUgbmFtZT0iYmFubmVyIiBzcmM9JzwlPSByZXNwb25zZS5lbmNvZGVVUkwoImJhbm5lci5qc3AiKSAlPicgc2Nyb2xsaW5nPSJubyIgdGl0bGU9ImNvbW1pdCBhbmQgbG9nb3V0IGJhbm5lciI+CisgIDxmcmFtZXNldCBjb2xzPSIzMDAsKiIgZnJhbWVib3JkZXI9IllFUyIgYm9yZGVyPSIyIj4KKyAgICA8ZnJhbWUgbmFtZT0idHJlZSIgc3JjPSc8JT0gcmVzcG9uc2UuZW5jb2RlVVJMKCJzZXRVcFRyZWUuZG8iKSAlPicgc2Nyb2xsaW5nPSJhdXRvIiB0aXRsZT0iYXBwbGljYXRpb24gbmF2aWdhdGlvbiB0cmVlIj4KKyAgICA8ZnJhbWUgbmFtZT0iY29udGVudCIgc3JjPSc8JT0gcmVzcG9uc2UuZW5jb2RlVVJMKCJibGFuay5qc3AiKSAlPicgc2Nyb2xsaW5nPSJhdXRvIiB0aXRsZT0iY29udGVudCBlZGl0aW5nIj4KKyAgPC9mcmFtZXNldD4KKzwvZnJhbWVzZXQ+CisKKzwhLS0gU3RhbmRhcmQgRm9vdGVyIC0tPgorCis8JUAgaW5jbHVkZSBmaWxlPSJmb290ZXIuanNwIiAlPgorCis8L2h0bWw6aHRtbD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2hlYWRlci5qc3AgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9oZWFkZXIuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkNTEzNTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9oZWFkZXIuanNwCkBAIC0wLDAgKzEsMTEgQEAKKzwhLS0KKyAgQ29weXJpZ2h0IChjKSAxOTk5LTIwMDEgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cworICByZXNlcnZlZC4KKy0tPgorCis8aGVhZD4KKyAgPHRpdGxlPjxiZWFuOm1lc3NhZ2Uga2V5PSJhcHBsaWNhdGlvbi50aXRsZSIvPjwvdGl0bGU+CisgIDxodG1sOmJhc2UvPgorICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJ0cmVlLWNvbnRyb2wtdGVzdC5jc3MiPgorICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJhZG1pbi5jc3MiPgorPC9oZWFkPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaG9zdC9hbGlhcy5qc3AgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9ob3N0L2FsaWFzLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzY1MTA3Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaG9zdC9hbGlhcy5qc3AKQEAgLTAsMCArMSwxMDQgQEAKKzwhLS0gU3RhbmRhcmQgU3RydXRzIEVudHJpZXMgLS0+Cis8JUAgcGFnZSBsYW5ndWFnZT0iamF2YSIgaW1wb3J0PSJqYXZhLm5ldC5VUkxFbmNvZGVyIiBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgiICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvc3RydXRzLWJlYW4udGxkIiBwcmVmaXg9ImJlYW4iICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvc3RydXRzLWh0bWwudGxkIiBwcmVmaXg9Imh0bWwiICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvc3RydXRzLWxvZ2ljLnRsZCIgcHJlZml4PSJsb2dpYyIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9jb250cm9scy50bGQiIHByZWZpeD0iY29udHJvbHMiICU+CisKKzxodG1sOmh0bWwgbG9jYWxlPSJ0cnVlIj4KKworPCVAIGluY2x1ZGUgZmlsZT0iLi4vdXNlcnMvaGVhZGVyLmpzcCIgJT4KKworPCEtLSBCb2R5IC0tPgorPGJvZHkgYmdjb2xvcj0id2hpdGUiIGJhY2tncm91bmQ9Ii4uL2ltYWdlcy9QYXBlclRleHR1cmUuZ2lmIj4KKworPCEtLUZvcm0gLS0+CisKKzxodG1sOmVycm9ycy8+CisKKzxodG1sOmZvcm0gbWV0aG9kPSJQT1NUIiBhY3Rpb249Ii9TYXZlQWxpYXMiPgorCisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0iaG9zdE5hbWUiLz4KKworICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KKyAgICA8dHIgY2xhc3M9InBhZ2UtdGl0bGUtcm93Ij4KKyAgICAgIDx0ZCBhbGlnbj0ibGVmdCIgbm93cmFwPgorICAgICAgICA8ZGl2IGNsYXNzPSJwYWdlLXRpdGxlLXRleHQiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJhY3Rpb25zLmFsaWFzLmNyZWF0ZSIvPgorICAgICAgICA8L2Rpdj4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgPC90YWJsZT4KKworPGJyPgorCisgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CisgICAgPHRyPiA8dGQ+IDxkaXYgY2xhc3M9InRhYmxlLXRpdGxlLXRleHQiPgorICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0ibmV3LmFsaWFzIi8+CisgICAgPC9kaXY+IDwvdGQ+IDwvdHI+CisgIDwvdGFibGU+CisKKyAgPHRhYmxlIGNsYXNzPSJiYWNrLXRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMSIgd2lkdGg9IjEwMCUiPgorICAgIDx0cj4KKyAgICAgIDx0ZD4KKyAgICAgICAgPGNvbnRyb2xzOnRhYmxlIHRhYmxlU3R5bGU9ImZyb250LXRhYmxlIiBsaW5lU3R5bGU9ImxpbmUtcm93Ij4KKyAgICAgICAgICAgIDxjb250cm9sczpyb3cgaGVhZGVyPSJ0cnVlIgorICAgICAgICAgICAgICAgIGxhYmVsU3R5bGU9InRhYmxlLWhlYWRlci10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLWhlYWRlci10ZXh0Ij4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0ic2VydmljZS5wcm9wZXJ0eSIvPgorICAgICAgICAgICAgPC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJzZXJ2aWNlLnZhbHVlIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0iYWxpYXNOYW1lIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0iaG9zdC5hbGlhcy5uYW1lIi8+OgorICAgICAgICAgICAgPC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICA8aHRtbDp0ZXh0IHByb3BlcnR5PSJhbGlhc05hbWUiIHNpemU9IjI0IiBtYXhsZW5ndGg9IjEyOCIgc3R5bGVJZD0iYWxpYXNOYW1lIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorICAgICAgPC9jb250cm9sczp0YWJsZT4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgPC90YWJsZT4KKworICA8JUAgaW5jbHVkZSBmaWxlPSIuLi9idXR0b25zLmpzcCIgJT4KKworPGJyPgorCis8JS0tIEFsaWFzZXMgTGlzdCAtLSU+CisgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CisgICAgPHRyPiA8dGQ+CisgICAgICAgIDxkaXYgY2xhc3M9InRhYmxlLXRpdGxlLXRleHQiPgorICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9Imhvc3QuYWxpYXNlcyIvPgorICAgICAgICA8L2Rpdj4KKyAgICA8L3RkPiA8L3RyPgorICA8L3RhYmxlPgorCisgIDx0YWJsZSBjbGFzcz0iYmFjay10YWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjEiIHdpZHRoPSIxMDAlIj4KKyAgICA8dHI+IDx0ZD4KKyAgICAgICAgPHRhYmxlIGNsYXNzPSJmcm9udC10YWJsZSIgYm9yZGVyPSIxIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KKyAgICAgICAgICA8dHIgY2xhc3M9ImhlYWRlci1yb3ciPgorICAgICAgICAgICAgPHRkIHdpZHRoPSIyNyUiPgorICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJsZS1oZWFkZXItdGV4dCIgYWxpZ249ImxlZnQiPjxiZWFuOm1lc3NhZ2Uga2V5PSJob3N0LmFsaWFzLm5hbWUiLz4gPC9kaXY+CisgICAgICAgICAgICA8L3RkPiA8L3RyPgorCisgICAgICAgICAgICA8bG9naWM6aXRlcmF0ZSBpZD0iYWxpYXNWYWwiIG5hbWU9ImFsaWFzRm9ybSIgcHJvcGVydHk9ImFsaWFzVmFscyI+CisgICAgICAgICAgICA8dHI+IDx0ZCB3aWR0aD0iMjclIiB2YWxpZ249InRvcCIgY29sc3Bhbj0yPgorICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRhYmxlLW5vcm1hbC10ZXh0Ij4gPCU9IGFsaWFzVmFsICU+IDwvZGl2PgorICAgICAgICAgICAgPC90ZD4gPC90cj4KKyAgICAgICAgICAgIDwvbG9naWM6aXRlcmF0ZT4KKyAgICAgICAgIDwvdGFibGU+CisKKyAgICA8L3RkPiA8L3RyPgorICA8L3RhYmxlPgorCisgIDwlQCBpbmNsdWRlIGZpbGU9Ii4uL2J1dHRvbnMuanNwIiAlPgorCis8L2h0bWw6Zm9ybT4KKzwvYm9keT4KKworPC9odG1sOmh0bWw+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9ob3N0L2FsaWFzZXMuanNwIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaG9zdC9hbGlhc2VzLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzE5YTc5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaG9zdC9hbGlhc2VzLmpzcApAQCAtMCwwICsxLDgzIEBACis8IS0tIFN0YW5kYXJkIFN0cnV0cyBFbnRyaWVzIC0tPgorPCVAIHBhZ2UgbGFuZ3VhZ2U9ImphdmEiIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9zdHJ1dHMtYmVhbi50bGQiIHByZWZpeD0iYmVhbiIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9zdHJ1dHMtaHRtbC50bGQiIHByZWZpeD0iaHRtbCIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9zdHJ1dHMtbG9naWMudGxkIiBwcmVmaXg9ImxvZ2ljIiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL2NvbnRyb2xzLnRsZCIgcHJlZml4PSJjb250cm9scyIgJT4KKworPGh0bWw6aHRtbCBsb2NhbGU9InRydWUiPgorCis8JUAgaW5jbHVkZSBmaWxlPSIuLi91c2Vycy9oZWFkZXIuanNwIiAlPgorCis8IS0tIEJvZHkgLS0+Cis8Ym9keSBiZ2NvbG9yPSJ3aGl0ZSIgYmFja2dyb3VuZD0iLi4vaW1hZ2VzL1BhcGVyVGV4dHVyZS5naWYiPgorCis8IS0tRm9ybSAtLT4KKworPGh0bWw6ZXJyb3JzLz4KKworPGh0bWw6Zm9ybSBtZXRob2Q9IlBPU1QiIGFjdGlvbj0iL0RlbGV0ZUFsaWFzZXMiPgorCisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0iaG9zdE5hbWUiLz4KKyAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CisgICAgPHRyIGJnY29sb3I9IjcxNzFBNSI+CisgICAgICA8dGQgd2lkdGg9IjgxJSI+CisgICAgICAgIDxkaXYgY2xhc3M9InBhZ2UtdGl0bGUtdGV4dCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJhY3Rpb25zLmFsaWFzLmRlbGV0ZSIvPgorICAgICAgICA8L2Rpdj4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQgYWxpZ249InJpZ2h0IiBub3dyYXA+CisgICAgICAgIDxkaXYgY2xhc3M9InBhZ2UtdGl0bGUtdGV4dCI+CisgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9ucyBsYWJlbD0iQWxpYXMgQWN0aW9ucyI+CisgICAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24gc2VsZWN0ZWQ9InRydWUiPiAtLS0tPGJlYW46bWVzc2FnZSBrZXk9ImFjdGlvbnMuYXZhaWxhYmxlLmFjdGlvbnMiLz4tLS0tIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9uPiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmFjdGlvbnM+CisgICAgICAgIDwvZGl2PgorICAgICAgPC90ZD4KKyAgICA8L3RyPgorICA8L3RhYmxlPgorCis8JUAgaW5jbHVkZSBmaWxlPSIuLi9idXR0b25zLmpzcCIgJT4KKyAgPGJyPgorCisgIDwlLS0gQWxpYXNlcyBMaXN0IC0tJT4KKworICA8dGFibGUgY2xhc3M9ImJhY2stdGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIxIiB3aWR0aD0iMTAwJSI+CisgICAgPHRyPgorICAgICAgPHRkPgorICAgICAgICA8dGFibGUgY2xhc3M9ImZyb250LXRhYmxlIiBib3JkZXI9IjEiCisgICAgICAgICBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KKyAgICAgICAgICA8dHIgY2xhc3M9ImhlYWRlci1yb3ciPgorICAgICAgICAgICAgPHRkPjxkaXYgYWxpZ249ImxlZnQiIGNsYXNzPSJ0YWJsZS1oZWFkZXItdGV4dCI+CisgICAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJhY3Rpb25zLmRlbGV0ZSIvPgorICAgICAgICAgICAgPC9kaXY+PC90ZD4KKyAgICAgICAgICAgIDx0ZD48ZGl2IGFsaWduPSJsZWZ0IiBjbGFzcz0idGFibGUtaGVhZGVyLXRleHQiPgorICAgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0iaG9zdC5hbGlhcy5uYW1lIi8+CisgICAgICAgICAgICA8L2Rpdj48L3RkPgorICAgICAgICAgIDwvdHI+CisKKyAgICAgICAgPGxvZ2ljOml0ZXJhdGUgbmFtZT0iYWxpYXNlc0xpc3QiIGlkPSJhbGlhcyI+CisgICAgICAgICAgPHRyIGNsYXNzPSJsaW5lLXJvdyI+CisgICAgICAgICAgICA8dGQ+PGRpdiBhbGlnbj0ibGVmdCIgY2xhc3M9InRhYmxlLW5vcm1hbC10ZXh0Ij4mbmJzcDsKKyAgICAgICAgICAgIDxsYWJlbCBmb3I9ImFsaWFzZXMiPjwvbGFiZWw+CisgICAgICAgICAgICAgIDxodG1sOm11bHRpYm94IHByb3BlcnR5PSJhbGlhc2VzIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0iPCU9IGFsaWFzLnRvU3RyaW5nKCkgJT4iIHN0eWxlSWQ9ImFsaWFzZXMiLz4KKyAgICAgICAgICAgIDwvZGl2PjwvdGQ+CisgICAgICAgICAgICA8dGQ+PGRpdiBhbGlnbj0ibGVmdCIgY2xhc3M9InRhYmxlLW5vcm1hbC10ZXh0Ij4mbmJzcDsKKyAgICAgICAgICAgICAgICA8JT0gYWxpYXMudG9TdHJpbmcoKSAlPgorICAgICAgICAgICAgPC9kaXY+PC90ZD4KKyAgICAgICAgICA8L3RyPgorICAgICAgICA8L2xvZ2ljOml0ZXJhdGU+CisgICAgICAgIDwvdGFibGU+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgIDwvdGFibGU+CisKKzwlQCBpbmNsdWRlIGZpbGU9Ii4uL2J1dHRvbnMuanNwIiAlPgorCisgIDxicj4KKzwvaHRtbDpmb3JtPgorCis8cD4mbmJzcDs8L3A+Cis8L2JvZHk+Cis8L2h0bWw6aHRtbD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2hvc3QvaG9zdC5qc3AgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9ob3N0L2hvc3QuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyZTIyNzMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9ob3N0L2hvc3QuanNwCkBAIC0wLDAgKzEsMjc3IEBACis8IS0tIFN0YW5kYXJkIFN0cnV0cyBFbnRyaWVzIC0tPgorPCVAIHBhZ2UgbGFuZ3VhZ2U9ImphdmEiIGltcG9ydD0iamF2YS5uZXQuVVJMRW5jb2RlciIgY29udGVudFR5cGU9InRleHQvaHRtbDtjaGFyc2V0PXV0Zi04IiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL3N0cnV0cy1iZWFuLnRsZCIgcHJlZml4PSJiZWFuIiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL3N0cnV0cy1odG1sLnRsZCIgcHJlZml4PSJodG1sIiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL3N0cnV0cy1sb2dpYy50bGQiIHByZWZpeD0ibG9naWMiICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvY29udHJvbHMudGxkIiBwcmVmaXg9ImNvbnRyb2xzIiAlPgorCis8aHRtbDpodG1sIGxvY2FsZT0idHJ1ZSI+CisKKzwlQCBpbmNsdWRlIGZpbGU9Ii4uL3VzZXJzL2hlYWRlci5qc3AiICU+CisKKzwhLS0gQm9keSAtLT4KKzxib2R5IGJnY29sb3I9IndoaXRlIiBiYWNrZ3JvdW5kPSIuLi9pbWFnZXMvUGFwZXJUZXh0dXJlLmdpZiI+CisKKzwhLS1Gb3JtIC0tPgorCis8aHRtbDplcnJvcnMvPgorCis8aHRtbDpmb3JtIG1ldGhvZD0iUE9TVCIgYWN0aW9uPSIvU2F2ZUhvc3QiPgorCisgIDxiZWFuOmRlZmluZSBpZD0iaG9zdE5hbWUiIG5hbWU9Imhvc3RGb3JtIiBwcm9wZXJ0eT0iaG9zdE5hbWUiLz4KKyAgPGJlYW46ZGVmaW5lIGlkPSJ0aGlzT2JqZWN0TmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIG5hbWU9Imhvc3RGb3JtIiBwcm9wZXJ0eT0ib2JqZWN0TmFtZSIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9ImFkbWluQWN0aW9uIi8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0ib2JqZWN0TmFtZSIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9InNlcnZpY2VOYW1lIi8+CisKKyAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CisgICAgPHRyIGNsYXNzPSJwYWdlLXRpdGxlLXJvdyI+CisgICAgICA8dGQgYWxpZ249ImxlZnQiIG5vd3JhcD4KKyAgICAgICAgPGRpdiBjbGFzcz0icGFnZS10aXRsZS10ZXh0IiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGxvZ2ljOmVxdWFsIG5hbWU9Imhvc3RGb3JtIiBwcm9wZXJ0eT0iYWRtaW5BY3Rpb24iIHZhbHVlPSJDcmVhdGUiPgorICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9ImFjdGlvbnMuaG9zdHMuY3JlYXRlIi8+CisgICAgICAgICAgPC9sb2dpYzplcXVhbD4KKyAgICAgICAgICA8bG9naWM6ZXF1YWwgbmFtZT0iaG9zdEZvcm0iIHByb3BlcnR5PSJhZG1pbkFjdGlvbiIgdmFsdWU9IkVkaXQiPgorICAgICAgICAgICAgPGJlYW46d3JpdGUgbmFtZT0iaG9zdEZvcm0iIHByb3BlcnR5PSJub2RlTGFiZWwiLz4KKyAgICAgICAgICA8L2xvZ2ljOmVxdWFsPgorICAgICAgICA8L2Rpdj4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQgYWxpZ249InJpZ2h0IiBub3dyYXA+CisgICAgICAgIDxkaXYgY2xhc3M9InBhZ2UtdGl0bGUtdGV4dCI+CisgICAgICAgIDxjb250cm9sczphY3Rpb25zIGxhYmVsPSJIb3N0IEFjdGlvbnMiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbiBzZWxlY3RlZD0idHJ1ZSI+IC0tLS0tPGJlYW46bWVzc2FnZSBrZXk9ImFjdGlvbnMuYXZhaWxhYmxlLmFjdGlvbnMiLz4tLS0tLSA8L2NvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24gZGlzYWJsZWQ9InRydWUiPiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgPGxvZ2ljOm5vdEVxdWFsIG5hbWU9Imhvc3RGb3JtIiBwcm9wZXJ0eT0iYWRtaW5BY3Rpb24iIHZhbHVlPSJDcmVhdGUiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbiB1cmw9JzwlPSAiL0FkZEFsaWFzLmRvP2hvc3ROYW1lPSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHRoaXNPYmplY3ROYW1lKSAlPic+CisgICAgICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9ImFjdGlvbnMuYWxpYXMuY3JlYXRlIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24gdXJsPSc8JT0gIi9EZWxldGVBbGlhcy5kbz9ob3N0TmFtZT0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZSh0aGlzT2JqZWN0TmFtZSkgJT4nPgorICAgICAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJhY3Rpb25zLmFsaWFzLmRlbGV0ZSIvPgorICAgICAgICAgICAgPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9uIGRpc2FibGVkPSJ0cnVlIj4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSA8L2NvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24gdXJsPSc8JT0gIi9BZGRDb250ZXh0LmRvP3BhcmVudD0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZSh0aGlzT2JqZWN0TmFtZSkgJT4nPgorICAgICAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJhY3Rpb25zLmNvbnRleHRzLmNyZWF0ZSIvPgorICAgICAgICAgICAgPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9uIHVybD0nPCU9ICIvRGVsZXRlQ29udGV4dC5kbz9wYXJlbnQ9IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUodGhpc09iamVjdE5hbWUpICU+Jz4KKyAgICAgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0iYWN0aW9ucy5jb250ZXh0cy5kZWxldGVzIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24gZGlzYWJsZWQ9InRydWUiPiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgPCEtLUZJWE1FIGFkZC9yZW1vdmUgZGVmYXVsdGNvbnRleHQtLT4KKzwlLS0KKyAgICAgICAgICAgIDwhLS1jb250cm9sczphY3Rpb24gdXJsPSc8JT0gIi9BZGREZWZhdWx0Q29udGV4dC5kbz9wYXJlbnQ9IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUodGhpc09iamVjdE5hbWUpICU+Jz4KKyAgICAgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0iYWN0aW9ucy5kZWZhdWx0Y29udGV4dHMuY3JlYXRlIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmFjdGlvbi0tPgorICAgICAgICAgICAgPCEtLWNvbnRyb2xzOmFjdGlvbiB1cmw9JzwlPSAiL0RlbGV0ZURlZmF1bHRDb250ZXh0LmRvP3BhcmVudD0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZSh0aGlzT2JqZWN0TmFtZSkgJT4nPgorICAgICAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJhY3Rpb25zLmRlZmF1bHRjb250ZXh0cy5kZWxldGVzIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmFjdGlvbi0tPiAgICAgICAgICAgICAgICAgICAgICAgIAorLS0lPgorICAgICAgICAgICAgPGxvZ2ljOm5vdEVxdWFsIG5hbWU9Imhvc3ROYW1lIiB2YWx1ZT0nPCU9IChTdHJpbmcpcmVxdWVzdC5nZXRBdHRyaWJ1dGUoImFkbWluQXBwSG9zdCIpICU+Jz4KKyAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24gZGlzYWJsZWQ9InRydWUiPgorICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbiB1cmw9JzwlPSAiL0FkZFJlYWxtLmRvP3BhcmVudD0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZSh0aGlzT2JqZWN0TmFtZSkgJT4nPgorICAgICAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJhY3Rpb25zLnJlYWxtcy5jcmVhdGUiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbiB1cmw9JzwlPSAiL0RlbGV0ZVJlYWxtLmRvP3BhcmVudD0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZSh0aGlzT2JqZWN0TmFtZSkgJT4nPgorICAgICAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJhY3Rpb25zLnJlYWxtcy5kZWxldGVzIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgICAgIDwvbG9naWM6bm90RXF1YWw+CisgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9uIGRpc2FibGVkPSJ0cnVlIj4KKyAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICA8L2NvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24gdXJsPSc8JT0gIi9BZGRWYWx2ZS5kbz9wYXJlbnQ9IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUodGhpc09iamVjdE5hbWUpICU+Jz4KKyAgICAgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0iYWN0aW9ucy52YWx2ZXMuY3JlYXRlIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24gdXJsPSc8JT0gIi9EZWxldGVWYWx2ZS5kbz9wYXJlbnQ9IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUodGhpc09iamVjdE5hbWUpICU+Jz4KKyAgICAgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0iYWN0aW9ucy52YWx2ZXMuZGVsZXRlcyIvPgorICAgICAgICAgICAgPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgICA8bG9naWM6bm90RXF1YWwgbmFtZT0iaG9zdE5hbWUiIHZhbHVlPSc8JT0gcmVxdWVzdC5nZXRTZXJ2ZXJOYW1lKCkgJT4nPgorICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbiBkaXNhYmxlZD0idHJ1ZSI+CisgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9uIHVybD0nPCU9ICIvRGVsZXRlSG9zdC5kbz9zZWxlY3Q9IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUodGhpc09iamVjdE5hbWUpICU+Jz4KKyAgICAgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0iYWN0aW9ucy5ob3N0cy5kZWxldGUiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICA8L2xvZ2ljOm5vdEVxdWFsPgorICAgICAgICAgICA8L2xvZ2ljOm5vdEVxdWFsPgorICAgICAgICAgPC9jb250cm9sczphY3Rpb25zPgorICAgICAgIDwvZGl2PgorICAgICAgPC90ZD4KKyAgICA8L3RyPgorICA8L3RhYmxlPgorCisgIDwlQCBpbmNsdWRlIGZpbGU9Ii4uL2J1dHRvbnMuanNwIiAlPgorICA8YnI+CisKKyA8JS0tIEhvc3QgUHJvcGVydGllcyAtLSU+CisgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CisgICAgPHRyPiA8dGQ+IDxkaXYgY2xhc3M9InRhYmxlLXRpdGxlLXRleHQiPgorICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0iaG9zdC5wcm9wZXJ0aWVzIi8+CisgICAgPC9kaXY+IDwvdGQ+IDwvdHI+CisgIDwvdGFibGU+CisKKyAgPHRhYmxlIGNsYXNzPSJiYWNrLXRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMSIgd2lkdGg9IjEwMCUiPgorICAgIDx0cj4KKyAgICAgIDx0ZD4KKyAgICAgICAgPGNvbnRyb2xzOnRhYmxlIHRhYmxlU3R5bGU9ImZyb250LXRhYmxlIiBsaW5lU3R5bGU9ImxpbmUtcm93Ij4KKyAgICAgICAgICAgIDxjb250cm9sczpyb3cgaGVhZGVyPSJ0cnVlIgorICAgICAgICAgICAgICAgIGxhYmVsU3R5bGU9InRhYmxlLWhlYWRlci10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLWhlYWRlci10ZXh0Ij4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0ic2VydmljZS5wcm9wZXJ0eSIvPgorICAgICAgICAgICAgPC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJzZXJ2aWNlLnZhbHVlIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0ibmFtZSI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9Imhvc3QubmFtZSIvPjoKKyAgICAgICAgICAgIDwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgIDwlLS0gaW5wdXQgb25seSBhbGxvd2VkIG9uIGNyZWF0ZSB0cmFuc2FjdGlvbiAtLSU+CisgICAgICAgICAgICAgPGxvZ2ljOmVxdWFsIG5hbWU9Imhvc3RGb3JtIiBwcm9wZXJ0eT0iYWRtaW5BY3Rpb24iIHZhbHVlPSJDcmVhdGUiPgorICAgICAgICAgICAgICA8aHRtbDp0ZXh0IHByb3BlcnR5PSJob3N0TmFtZSIgc2l6ZT0iNTAiIG1heGxlbmd0aD0iNTAiIHN0eWxlSWQ9Im5hbWUiLz4KKyAgICAgICAgICAgICA8L2xvZ2ljOmVxdWFsPgorICAgICAgICAgICAgIDxsb2dpYzplcXVhbCBuYW1lPSJob3N0Rm9ybSIgcHJvcGVydHk9ImFkbWluQWN0aW9uIiB2YWx1ZT0iRWRpdCI+CisgICAgICAgICAgICAgIDxiZWFuOndyaXRlIG5hbWU9Imhvc3RGb3JtIiBwcm9wZXJ0eT0iaG9zdE5hbWUiLz4KKyAgICAgICAgICAgICAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJob3N0TmFtZSIvPgorICAgICAgICAgICAgIDwvbG9naWM6ZXF1YWw+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisKKyAgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJiYXNlIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0iaG9zdC5iYXNlIi8+OjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICA8bG9naWM6ZXF1YWwgbmFtZT0iaG9zdEZvcm0iIHByb3BlcnR5PSJhZG1pbkFjdGlvbiIgdmFsdWU9IkNyZWF0ZSI+CisgICAgICAgICAgICAgIDxodG1sOnRleHQgcHJvcGVydHk9ImFwcEJhc2UiIHNpemU9IjI0IiBzdHlsZUlkPSJiYXNlIi8+CisgICAgICAgICAgICAgPC9sb2dpYzplcXVhbD4KKyAgICAgICAgICAgICA8bG9naWM6ZXF1YWwgbmFtZT0iaG9zdEZvcm0iIHByb3BlcnR5PSJhZG1pbkFjdGlvbiIgdmFsdWU9IkVkaXQiPgorICAgICAgICAgICAgICA8YmVhbjp3cml0ZSBuYW1lPSJob3N0Rm9ybSIgcHJvcGVydHk9ImFwcEJhc2UiLz4KKyAgICAgICAgICAgICAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJhcHBCYXNlIi8+CisgICAgICAgICAgICAgPC9sb2dpYzplcXVhbD4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisgICAgICAgIAorICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0iYXV0b2RlcGxveSI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9Imhvc3QuYXV0b0RlcGxveSIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgICA8aHRtbDpzZWxlY3QgcHJvcGVydHk9ImF1dG9EZXBsb3kiIHN0eWxlSWQ9ImF1dG9kZXBsb3kiPgorICAgICAgICAgICAgICAgICAgICAgPGJlYW46ZGVmaW5lIGlkPSJib29sZWFuVmFscyIgbmFtZT0iaG9zdEZvcm0iIHByb3BlcnR5PSJib29sZWFuVmFscyIvPgorICAgICAgICAgICAgICAgICAgICAgPGh0bWw6b3B0aW9ucyBjb2xsZWN0aW9uPSJib29sZWFuVmFscyIgcHJvcGVydHk9InZhbHVlIgorICAgICAgICAgICAgICAgICAgIGxhYmVsUHJvcGVydHk9ImxhYmVsIi8+CisgICAgICAgICAgICAgICAgPC9odG1sOnNlbGVjdD4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisgICAgICAgIAorICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0iZGVwbG95T25TdGFydHVwIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0iaG9zdC5kZXBsb3lPblN0YXJ0dXAiLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICAgPGh0bWw6c2VsZWN0IHByb3BlcnR5PSJkZXBsb3lPblN0YXJ0dXAiIHN0eWxlSWQ9ImRlcGxveU9uU3RhcnR1cCI+CisgICAgICAgICAgICAgICAgICAgICA8YmVhbjpkZWZpbmUgaWQ9ImJvb2xlYW5WYWxzIiBuYW1lPSJob3N0Rm9ybSIgcHJvcGVydHk9ImJvb2xlYW5WYWxzIi8+CisgICAgICAgICAgICAgICAgICAgICA8aHRtbDpvcHRpb25zIGNvbGxlY3Rpb249ImJvb2xlYW5WYWxzIiBwcm9wZXJ0eT0idmFsdWUiCisgICAgICAgICAgICAgICAgICAgbGFiZWxQcm9wZXJ0eT0ibGFiZWwiLz4KKyAgICAgICAgICAgICAgICA8L2h0bWw6c2VsZWN0PgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0iZGVwbG95eG1sIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0iaG9zdC5kZXBsb3lYTUwiLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICAgPGh0bWw6c2VsZWN0IHByb3BlcnR5PSJkZXBsb3lYTUwiIHN0eWxlSWQ9ImRlcGxveXhtbCI+CisgICAgICAgICAgICAgICAgICAgICA8YmVhbjpkZWZpbmUgaWQ9ImJvb2xlYW5WYWxzIiBuYW1lPSJob3N0Rm9ybSIgcHJvcGVydHk9ImJvb2xlYW5WYWxzIi8+CisgICAgICAgICAgICAgICAgICAgICA8aHRtbDpvcHRpb25zIGNvbGxlY3Rpb249ImJvb2xlYW5WYWxzIiBwcm9wZXJ0eT0idmFsdWUiCisgICAgICAgICAgICAgICAgICAgbGFiZWxQcm9wZXJ0eT0ibGFiZWwiLz4KKyAgICAgICAgICAgICAgICA8L2h0bWw6c2VsZWN0PgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKyAgICAgICAgCisgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJ3YXJzIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0iaG9zdC53YXJzIi8+OjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgIDxodG1sOnNlbGVjdCBwcm9wZXJ0eT0idW5wYWNrV0FScyIgc3R5bGVJZD0id2FycyI+CisgICAgICAgICAgICAgICAgICAgICA8YmVhbjpkZWZpbmUgaWQ9ImJvb2xlYW5WYWxzIiBuYW1lPSJob3N0Rm9ybSIgcHJvcGVydHk9ImJvb2xlYW5WYWxzIi8+CisgICAgICAgICAgICAgICAgICAgICA8aHRtbDpvcHRpb25zIGNvbGxlY3Rpb249ImJvb2xlYW5WYWxzIiBwcm9wZXJ0eT0idmFsdWUiCisgICAgICAgICAgICAgICAgICAgbGFiZWxQcm9wZXJ0eT0ibGFiZWwiLz4KKyAgICAgICAgICAgICAgICA8L2h0bWw6c2VsZWN0PgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0ieG1sbmFtZXNwYWNlIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0iaG9zdC54bWxOYW1lc3BhY2VBd2FyZSIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgICA8aHRtbDpzZWxlY3QgcHJvcGVydHk9InhtbE5hbWVzcGFjZUF3YXJlIiBzdHlsZUlkPSJ4bWxuYW1lc3BhY2UiPgorICAgICAgICAgICAgICAgICAgICAgPGJlYW46ZGVmaW5lIGlkPSJib29sZWFuVmFscyIgbmFtZT0iaG9zdEZvcm0iIHByb3BlcnR5PSJib29sZWFuVmFscyIvPgorICAgICAgICAgICAgICAgICAgICAgPGh0bWw6b3B0aW9ucyBjb2xsZWN0aW9uPSJib29sZWFuVmFscyIgcHJvcGVydHk9InZhbHVlIgorICAgICAgICAgICAgICAgICAgIGxhYmVsUHJvcGVydHk9ImxhYmVsIi8+CisgICAgICAgICAgICAgICAgPC9odG1sOnNlbGVjdD4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9InhtbHZhbGlkYXRpb24iPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJob3N0LnhtbFZhbGlkYXRpb24iLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICAgPGh0bWw6c2VsZWN0IHByb3BlcnR5PSJ4bWxWYWxpZGF0aW9uIiBzdHlsZUlkPSJ4bWx2YWxpZGF0aW9uIj4KKyAgICAgICAgICAgICAgICAgICAgIDxiZWFuOmRlZmluZSBpZD0iYm9vbGVhblZhbHMiIG5hbWU9Imhvc3RGb3JtIiBwcm9wZXJ0eT0iYm9vbGVhblZhbHMiLz4KKyAgICAgICAgICAgICAgICAgICAgIDxodG1sOm9wdGlvbnMgY29sbGVjdGlvbj0iYm9vbGVhblZhbHMiIHByb3BlcnR5PSJ2YWx1ZSIKKyAgICAgICAgICAgICAgICAgICBsYWJlbFByb3BlcnR5PSJsYWJlbCIvPgorICAgICAgICAgICAgICAgIDwvaHRtbDpzZWxlY3Q+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorICAgICAgPC9jb250cm9sczp0YWJsZT4KKworICAgICAgPC90ZD4KKyAgICA8L3RyPgorICA8L3RhYmxlPgorCis8YnI+Cis8YnI+CisKKzwlLS0gQWxpYXNlcyBMaXN0IC0tJT4KKyA8bG9naWM6bm90RXF1YWwgbmFtZT0iaG9zdEZvcm0iIHByb3BlcnR5PSJhZG1pbkFjdGlvbiIgdmFsdWU9IkNyZWF0ZSI+CisgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CisgICAgPHRyPiA8dGQ+CisgICAgICAgIDxkaXYgY2xhc3M9InRhYmxlLXRpdGxlLXRleHQiPgorICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9Imhvc3QuYWxpYXNlcyIvPgorICAgICAgICA8L2Rpdj4KKyAgICA8L3RkPiA8L3RyPgorICA8L3RhYmxlPgorCisgIDx0YWJsZSBjbGFzcz0iYmFjay10YWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjEiIHdpZHRoPSIxMDAlIj4KKyAgICA8dHI+IDx0ZD4KKyAgICAgICAgPHRhYmxlIGNsYXNzPSJmcm9udC10YWJsZSIgYm9yZGVyPSIxIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KKyAgICAgICAgICA8dHIgY2xhc3M9ImhlYWRlci1yb3ciPgorICAgICAgICAgICAgPHRkIHdpZHRoPSIyNyUiPgorICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJsZS1oZWFkZXItdGV4dCIgYWxpZ249ImxlZnQiPjxiZWFuOm1lc3NhZ2Uga2V5PSJob3N0LmFsaWFzLm5hbWUiLz4gPC9kaXY+CisgICAgICAgICAgICA8L3RkPiA8L3RyPgorCisgICAgICAgICAgICA8bG9naWM6aXRlcmF0ZSBpZD0iYWxpYXNWYWwiIG5hbWU9Imhvc3RGb3JtIiBwcm9wZXJ0eT0iYWxpYXNWYWxzIj4KKyAgICAgICAgICAgIDx0cj4gPHRkIHdpZHRoPSIyNyUiIHZhbGlnbj0idG9wIiBjb2xzcGFuPTI+CisgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFibGUtbm9ybWFsLXRleHQiPiA8JT0gYWxpYXNWYWwgJT4gPC9kaXY+CisgICAgICAgICAgICA8L3RkPiA8L3RyPgorICAgICAgICAgICAgPC9sb2dpYzppdGVyYXRlPgorICAgICAgICAgPC90YWJsZT4KKworICAgIDwvdGQ+IDwvdHI+CisgIDwvdGFibGU+CisgPC9sb2dpYzpub3RFcXVhbD4KKworICA8JUAgaW5jbHVkZSBmaWxlPSIuLi9idXR0b25zLmpzcCIgJT4KKworPC9odG1sOmZvcm0+Cis8L2JvZHk+CisKKzwvaHRtbDpodG1sPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaG9zdC9ob3N0cy5qc3AgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9ob3N0L2hvc3RzLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTQ1NTIxCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaG9zdC9ob3N0cy5qc3AKQEAgLTAsMCArMSw5MyBAQAorPCEtLSBTdGFuZGFyZCBTdHJ1dHMgRW50cmllcyAtLT4KKzwlQCBwYWdlIGxhbmd1YWdlPSJqYXZhIiBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgiICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvc3RydXRzLWJlYW4udGxkIiBwcmVmaXg9ImJlYW4iICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvc3RydXRzLWh0bWwudGxkIiBwcmVmaXg9Imh0bWwiICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvc3RydXRzLWxvZ2ljLnRsZCIgcHJlZml4PSJsb2dpYyIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9jb250cm9scy50bGQiIHByZWZpeD0iY29udHJvbHMiICU+CisKKzxodG1sOmh0bWwgbG9jYWxlPSJ0cnVlIj4KKworPCVAIGluY2x1ZGUgZmlsZT0iLi4vdXNlcnMvaGVhZGVyLmpzcCIgJT4KKworPCEtLSBCb2R5IC0tPgorPGJvZHkgYmdjb2xvcj0id2hpdGUiIGJhY2tncm91bmQ9Ii4uL2ltYWdlcy9QYXBlclRleHR1cmUuZ2lmIj4KKworPCEtLUZvcm0gLS0+CisKKzxodG1sOmVycm9ycy8+CisKKzxodG1sOmZvcm0gbWV0aG9kPSJQT1NUIiBhY3Rpb249Ii9EZWxldGVIb3N0cyI+CisgIDx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgorICAgIDx0ciBiZ2NvbG9yPSI3MTcxQTUiPgorICAgICAgPHRkIHdpZHRoPSI4MSUiPgorICAgICAgICA8ZGl2IGNsYXNzPSJwYWdlLXRpdGxlLXRleHQiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0iYWN0aW9ucy5ob3N0cy5kZWxldGUiLz4KKyAgICAgICAgPC9kaXY+CisgICAgICA8L3RkPgorICAgICAgPHRkIGFsaWduPSJyaWdodCIgbm93cmFwPgorICAgICAgICA8ZGl2IGNsYXNzPSJwYWdlLXRpdGxlLXRleHQiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbnMgbGFiZWw9Ikhvc3QgQWN0aW9ucyI+CisgICAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24gc2VsZWN0ZWQ9InRydWUiPiAtLS0tPGJlYW46bWVzc2FnZSBrZXk9ImFjdGlvbnMuYXZhaWxhYmxlLmFjdGlvbnMiLz4tLS0tIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9uPiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmFjdGlvbnM+CisgICAgICAgIDwvZGl2PgorICAgICAgPC90ZD4KKyAgICA8L3RyPgorICA8L3RhYmxlPgorCis8JUAgaW5jbHVkZSBmaWxlPSIuLi9idXR0b25zLmpzcCIgJT4KKyAgPGJyPgorCisgIDwlLS0gSG9zdHMgTGlzdCAtLSU+CisKKyAgPHRhYmxlIGNsYXNzPSJiYWNrLXRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMSIgd2lkdGg9IjEwMCUiPgorICAgIDx0cj4KKyAgICAgIDx0ZD4KKyAgICAgICAgPHRhYmxlIGNsYXNzPSJmcm9udC10YWJsZSIgYm9yZGVyPSIxIgorICAgICAgICAgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CisgICAgICAgICAgPHRyIGNsYXNzPSJoZWFkZXItcm93Ij4KKyAgICAgICAgICAgIDx0ZD48ZGl2IGFsaWduPSJsZWZ0IiBjbGFzcz0idGFibGUtaGVhZGVyLXRleHQiPgorICAgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0iYWN0aW9ucy5kZWxldGUiLz4KKyAgICAgICAgICAgIDwvZGl2PjwvdGQ+CisgICAgICAgICAgICA8dGQ+PGRpdiBhbGlnbj0ibGVmdCIgY2xhc3M9InRhYmxlLWhlYWRlci10ZXh0Ij4KKyAgICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9Imhvc3QubmFtZSIvPgorICAgICAgICAgICAgPC9kaXY+PC90ZD4KKyAgICAgICAgICA8L3RyPgorCisgICAgICAgIDxsb2dpYzppdGVyYXRlIG5hbWU9Imhvc3RzTGlzdCIgaWQ9Imhvc3QiPgorICAgICAgICAgIDx0ciBjbGFzcz0ibGluZS1yb3ciPgorICAgICAgICAgICAgPHRkPjxkaXYgYWxpZ249ImxlZnQiIGNsYXNzPSJ0YWJsZS1ub3JtYWwtdGV4dCI+Jm5ic3A7CisgICAgICAgICAgICAKKyAgICAgICAgICAgICA8bG9naWM6bWF0Y2ggbmFtZT0iaG9zdCIKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSc8JT0gKFN0cmluZylyZXF1ZXN0LmdldEF0dHJpYnV0ZSgiYWRtaW5BcHBIb3N0IikgJT4nPgorICAgICAgICAgICAgIDxmb250IGNvbG9yPSdyZWQnPio8L2ZvbnQ+CisgICAgICAgICAgICAgPC9sb2dpYzptYXRjaD4KKyAgICAgICAgICAgICA8bG9naWM6bm90TWF0Y2ggbmFtZT0iaG9zdCIKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSc8JT0gKFN0cmluZylyZXF1ZXN0LmdldEF0dHJpYnV0ZSgiYWRtaW5BcHBIb3N0IikgJT4nPgorICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJob3N0cyI+PC9sYWJlbD4gICAgICAgICAgCisgICAgICAgICAgICAgIDxodG1sOm11bHRpYm94IHByb3BlcnR5PSJob3N0cyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9IjwlPSBob3N0LnRvU3RyaW5nKCkgJT4iIHN0eWxlSWQ9Imhvc3RzIi8+CisgICAgICAgICAgICAgIDwvbG9naWM6bm90TWF0Y2g+CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgPC9kaXY+PC90ZD4KKyAgICAgICAgICAgIDx0ZD48ZGl2IGFsaWduPSJsZWZ0IiBjbGFzcz0idGFibGUtbm9ybWFsLXRleHQiPiZuYnNwOworICAgICAgICAgICAgICA8aHRtbDpsaW5rIHBhZ2U9JzwlPSAiL0VkaXRIb3N0LmRvP3NlbGVjdD0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLm5ldC5VUkxFbmNvZGVyLmVuY29kZShob3N0LnRvU3RyaW5nKCkpICU+Jz4KKyAgICAgICAgICAgICAgICA8Y29udHJvbHM6YXR0cmlidXRlIG5hbWU9Imhvc3QiIGF0dHJpYnV0ZT0ibmFtZSIvPgorICAgICAgICAgICAgICA8L2h0bWw6bGluaz4KKyAgICAgICAgICAgIDwvZGl2PjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC9sb2dpYzppdGVyYXRlPgorICAgICAgICA8L3RhYmxlPgorICAgICAgPC90ZD4KKyAgICA8L3RyPgorICA8L3RhYmxlPgorCis8JUAgaW5jbHVkZSBmaWxlPSIuLi9idXR0b25zLmpzcCIgJT4KKworICA8YnI+Cis8L2h0bWw6Zm9ybT4KKworPHA+Jm5ic3A7PC9wPgorPC9ib2R5PgorPC9odG1sOmh0bWw+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9pbWFnZXMvQmx1ZVRpbGUuZ2lmIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaW1hZ2VzL0JsdWVUaWxlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWNkZmMxCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaW1hZ2VzL0JsdWVUaWxlLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9pbWFnZXMvQ29ubmVjdG9yLmdpZiBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2ltYWdlcy9Db25uZWN0b3IuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwYjMxY2MKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9pbWFnZXMvQ29ubmVjdG9yLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9pbWFnZXMvQ29udGV4dC5naWYgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9pbWFnZXMvQ29udGV4dC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ0YWM3OAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2ltYWdlcy9Db250ZXh0LmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9pbWFnZXMvRGF0YXNvdXJjZS5naWYgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9pbWFnZXMvRGF0YXNvdXJjZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBkNjc1MQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2ltYWdlcy9EYXRhc291cmNlLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9pbWFnZXMvRGVmYXVsdENvbnRleHQuZ2lmIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaW1hZ2VzL0RlZmF1bHRDb250ZXh0LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWU2MGZmCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaW1hZ2VzL0RlZmF1bHRDb250ZXh0LmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9pbWFnZXMvRW52aXJvbm1lbnRFbnRyaWVzLmdpZiBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2ltYWdlcy9FbnZpcm9ubWVudEVudHJpZXMuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxYzRiMGQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9pbWFnZXMvRW52aXJvbm1lbnRFbnRyaWVzLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9pbWFnZXMvR3JvdXBzLmdpZiBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2ltYWdlcy9Hcm91cHMuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2YTQ4OWUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9pbWFnZXMvR3JvdXBzLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9pbWFnZXMvSG9zdC5naWYgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9pbWFnZXMvSG9zdC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JhY2QxNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2ltYWdlcy9Ib3N0LmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9pbWFnZXMvTG9nZ2VyLmdpZiBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2ltYWdlcy9Mb2dnZXIuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlMTVmZTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9pbWFnZXMvTG9nZ2VyLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9pbWFnZXMvTG9naW4uanBnIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaW1hZ2VzL0xvZ2luLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGJkYWJkCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaW1hZ2VzL0xvZ2luLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9pbWFnZXMvTG9naW5CYWNrZ3JvdW5kVGlsZS5naWYgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9pbWFnZXMvTG9naW5CYWNrZ3JvdW5kVGlsZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJmOTFmMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2ltYWdlcy9Mb2dpbkJhY2tncm91bmRUaWxlLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9pbWFnZXMvTWFpbHNlc3Npb24uZ2lmIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaW1hZ2VzL01haWxzZXNzaW9uLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzhhMWJmCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaW1hZ2VzL01haWxzZXNzaW9uLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9pbWFnZXMvUGFwZXJUZXh0dXJlLmdpZiBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2ltYWdlcy9QYXBlclRleHR1cmUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkMjQ4MzMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9pbWFnZXMvUGFwZXJUZXh0dXJlLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9pbWFnZXMvUmVhbG0uZ2lmIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaW1hZ2VzL1JlYWxtLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTY4NGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaW1hZ2VzL1JlYWxtLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9pbWFnZXMvUmVzb3VyY2VMaW5rLmdpZiBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2ltYWdlcy9SZXNvdXJjZUxpbmsuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxNDYzZjgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9pbWFnZXMvUmVzb3VyY2VMaW5rLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9pbWFnZXMvUm9sZXMuZ2lmIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaW1hZ2VzL1JvbGVzLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTkwOTY5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaW1hZ2VzL1JvbGVzLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9pbWFnZXMvU2VydmVyLmdpZiBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2ltYWdlcy9TZXJ2ZXIuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiZTJmMmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9pbWFnZXMvU2VydmVyLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9pbWFnZXMvU2VydmljZS5naWYgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9pbWFnZXMvU2VydmljZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU3Y2QzYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2ltYWdlcy9TZXJ2aWNlLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9pbWFnZXMvVGh1bWJzLmRiIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaW1hZ2VzL1RodW1icy5kYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzhkMjdiCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaW1hZ2VzL1RodW1icy5kYgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9pbWFnZXMvVG9tY2F0QmFubmVyLmpwZyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2ltYWdlcy9Ub21jYXRCYW5uZXIuanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzMWNlMWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9pbWFnZXMvVG9tY2F0QmFubmVyLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9pbWFnZXMvVXNlcnMuZ2lmIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaW1hZ2VzL1VzZXJzLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGRhZmNmCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaW1hZ2VzL1VzZXJzLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9pbWFnZXMvVmFsdmUuZ2lmIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaW1hZ2VzL1ZhbHZlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjJhNjhjCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaW1hZ2VzL1ZhbHZlLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9pbWFnZXMvZm9sZGVyXzE2X3BhZC5naWYgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9pbWFnZXMvZm9sZGVyXzE2X3BhZC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc3MDJhMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2ltYWdlcy9mb2xkZXJfMTZfcGFkLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9pbWFnZXMvaGFuZGxlZG93bmxhc3QuZ2lmIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaW1hZ2VzL2hhbmRsZWRvd25sYXN0LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmFkYjY4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaW1hZ2VzL2hhbmRsZWRvd25sYXN0LmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9pbWFnZXMvaGFuZGxlZG93bm1pZGRsZS5naWYgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9pbWFnZXMvaGFuZGxlZG93bm1pZGRsZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIzY2ZlZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2ltYWdlcy9oYW5kbGVkb3dubWlkZGxlLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9pbWFnZXMvaGFuZGxlcmlnaHRsYXN0LmdpZiBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2ltYWdlcy9oYW5kbGVyaWdodGxhc3QuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5ZDBhOTIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9pbWFnZXMvaGFuZGxlcmlnaHRsYXN0LmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9pbWFnZXMvaGFuZGxlcmlnaHRtaWRkbGUuZ2lmIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaW1hZ2VzL2hhbmRsZXJpZ2h0bWlkZGxlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmVmZjJiCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaW1hZ2VzL2hhbmRsZXJpZ2h0bWlkZGxlLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9pbWFnZXMvbGluZWxhc3Rub2RlLmdpZiBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2ltYWdlcy9saW5lbGFzdG5vZGUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwZmYyZjAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9pbWFnZXMvbGluZWxhc3Rub2RlLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9pbWFnZXMvbGluZW1pZGRsZW5vZGUuZ2lmIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaW1hZ2VzL2xpbmVtaWRkbGVub2RlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDlmMjliCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vaW1hZ2VzL2xpbmVtaWRkbGVub2RlLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9pbWFnZXMvbGluZXZlcnRpY2FsLmdpZiBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2ltYWdlcy9saW5ldmVydGljYWwuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZWMxNWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9pbWFnZXMvbGluZXZlcnRpY2FsLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9pbmRleC5qc3AgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9pbmRleC5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI4YWJjMgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2luZGV4LmpzcApAQCAtMCwwICsxIEBACis8JSByZXNwb25zZS5zZW5kUmVkaXJlY3QoImZyYW1lc2V0LmpzcCIpOyAlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2xvZ2luLmpzcCBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL2xvZ2luLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTViODczCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vbG9naW4uanNwCkBAIC0wLDAgKzEsMTA2IEBACis8IS0tIFN0YW5kYXJkIFN0cnV0cyBFbnRyaWVzIC0tPgorCis8JUAgcGFnZSBsYW5ndWFnZT0iamF2YSIgY29udGVudFR5cGU9InRleHQvaHRtbDtjaGFyc2V0PXV0Zi04IiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL3N0cnV0cy1iZWFuLnRsZCIgcHJlZml4PSJiZWFuIiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL3N0cnV0cy1odG1sLnRsZCIgcHJlZml4PSJodG1sIiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL3N0cnV0cy1sb2dpYy50bGQiIHByZWZpeD0ibG9naWMiICU+CisKKzwlIC8vIEZvcmNlIHRoZSBpbml0aWFsaXphdGlvbiBvZiAiYWN0aW9uIiBzZXJ2bGV0CisgICBnZXRTZXJ2bGV0Q29udGV4dCgpLmdldE5hbWVkRGlzcGF0Y2hlcigiYWN0aW9uIikuaW5jbHVkZShyZXF1ZXN0LHJlc3BvbnNlKTsKKyU+IAorCis8aHRtbDpodG1sIGxvY2FsZT0idHJ1ZSI+CisKKzwhLS0gTWFrZSBzdXJlIHdpbmRvdyBpcyBub3QgaW4gYSBmcmFtZSAtLT4KKworPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KKworICA8IS0tCisgICAgaWYgKHdpbmRvdy5zZWxmICE9IHdpbmRvdy50b3ApIHsKKyAgICAgIHdpbmRvdy5vcGVuKCIuIiwgIl90b3AiKTsKKyAgICB9CisgIC8vIC0tPgorCis8L3NjcmlwdD4KKworPCEtLSBTdGFuZGFyZCBDb250ZW50IC0tPgorCis8JUAgaW5jbHVkZSBmaWxlPSJoZWFkZXIuanNwIiAlPgorCis8IS0tIEJvZHkgLS0+CisKKzxib2R5IGJhY2tncm91bmQ9ImltYWdlcy9Mb2dpbkJhY2tncm91bmRUaWxlLmdpZiI+CisKKzxjZW50ZXI+CisKKzwhLS0gTG9naW4gLS0+CisKKzxmb3JtIG1ldGhvZD0iUE9TVCIgYWN0aW9uPSc8JT0gcmVzcG9uc2UuZW5jb2RlVVJMKCJqX3NlY3VyaXR5X2NoZWNrIikgJT4nCisgbmFtZT0ibG9naW5Gb3JtIj4KKyAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjUiIGJhY2tncm91bmQ9ImltYWdlcy9Mb2dpbkJhY2tncm91bmRUaWxlLmdpZiI+CisKKyAgICA8dHI+CisgICAgPCEtLSBiYW5uZXIgLS0+CisgICAgIDx0ZCBoZWlnaHQ9IjE4MyI+CisgICAgICAgIDxkaXYgYWxpZ249ImNlbnRlciI+PGltZyBzcmM9ImltYWdlcy9Mb2dpbi5qcGciIGFsdD0iVG9tY2F0IFdlYiBTZXJ2ZXIgQWRtaW5pc3RyYXRpb24gVG9vbCIgd2lkdGg9IjQ5MCIgaGVpZ2h0PSIyMjgiPjwvZGl2PgorICAgICAgPC90ZD4KKyAgICA8L3RyPgorCisgICAgPCEtLSB1c2VybmFtZSBwYXNzd29yZCBwcm9tcHRzIGZpZWxkcyBsYXlvdXQgLS0+CisgICAgPHRyPgorICAgIDx0ZCBiYWNrZ3JvdW5kPSJpbWFnZXMvTG9naW5CYWNrZ3JvdW5kVGlsZS5naWYiPgorICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjIiIGNlbGxwYWRkaW5nPSI1Ij4KKyAgICAgPHRyPgorICAgICAgPHRoIGFsaWduPSJyaWdodCI+CisgICAgICAgIDxmb250IGNvbG9yPSIjRkZGRkZGIj48bGFiZWwgZm9yPSJ1c2VybmFtZSI+PGJlYW46bWVzc2FnZSBrZXk9InByb21wdC51c2VybmFtZSIvPjwvbGFiZWw+PC9mb250PgorICAgICAgPC90aD4KKyAgICAgIDx0ZCBhbGlnbj0ibGVmdCI+CisgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJqX3VzZXJuYW1lIiBzaXplPSIxNiIgaWQ9InVzZXJuYW1lIi8+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPHA+CisgICAgPHRyPgorICAgICAgPHRoIGFsaWduPSJyaWdodCI+CisgICAgICAgIDxmb250IGNvbG9yPSIjRkZGRkZGIj48bGFiZWwgZm9yPSJwYXNzd29yZCI+PGJlYW46bWVzc2FnZSBrZXk9InByb21wdC5wYXNzd29yZCIvPjwvbGFiZWw+PC9mb250PgorICAgICAgPC90aD4KKyAgICAgIDx0ZCBhbGlnbj0ibGVmdCI+CisgICAgICAgIDxpbnB1dCB0eXBlPSJwYXNzd29yZCIgbmFtZT0ial9wYXNzd29yZCIgc2l6ZT0iMTYiIGlkPSJwYXNzd29yZCIvPgorICAgICAgPC90ZD4KKyAgICA8L3RyPgorCisgICAgPHRyPgorICAgICAgPHRkIHdpZHRoPSI1MCUiIHZhbGlnbj0idG9wIj4gPGRpdiBhbGlnbj0icmlnaHQiPjwvZGl2PiA8L3RkPgorICAgICAgPHRkIHdpZHRoPSI1NSUiIHZhbGlnbj0idG9wIj4mbmJzcDs8L3RkPgorICAgICA8L3RyPgorCisgICAgPCEtLSBsb2dpbiByZXNldCBidXR0b25zIGxheW91dCAtLT4KKyAgICA8dHI+CisgICAgICAgPHRkIHdpZHRoPSI1MCUiIHZhbGlnbj0idG9wIj4KKyAgICAgICAgICAgIDxkaXYgYWxpZ249InJpZ2h0Ij4KKyAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSc8YmVhbjptZXNzYWdlIGtleT0iYnV0dG9uLmxvZ2luIi8+Jz4mbmJzcDsmbmJzcDsKKyAgICAgICAgICAgIDwvZGl2PgorICAgICAgIDwvdGQ+CisgICAgICAgPHRkIHdpZHRoPSI1NSUiIHZhbGlnbj0idG9wIj4KKyAgICAgICAgICAmbmJzcDsmbmJzcDs8aW5wdXQgdHlwZT0icmVzZXQiIHZhbHVlPSc8YmVhbjptZXNzYWdlIGtleT0iYnV0dG9uLnJlc2V0Ii8+Jz4KKyAgICAgICA8L3RkPgorICAgICA8L3RyPgorICA8L3RhYmxlPgorICA8cD4gJm5ic3A7CisgIDwvdGQ+CisgIDwvdHI+CisgPC90YWJsZT4KKzwvZm9ybT4KKworPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KKyAgPCEtLQorICAgIGRvY3VtZW50LmZvcm1zWyJsb2dpbkZvcm0iXS5lbGVtZW50c1sial91c2VybmFtZSJdLmZvY3VzKCkKKyAgLy8gLS0+Cis8L3NjcmlwdD4KKworPC9ib2R5PgorCis8IS0tIFN0YW5kYXJkIEZvb3RlciAtLT4KKworPCVAIGluY2x1ZGUgZmlsZT0iZm9vdGVyLmpzcCIgJT4KKworPC9odG1sOmh0bWw+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9yZWFsbS9kYXRhU291cmNlUmVhbG0uanNwIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vcmVhbG0vZGF0YVNvdXJjZVJlYWxtLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzA2YWVmCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vcmVhbG0vZGF0YVNvdXJjZVJlYWxtLmpzcApAQCAtMCwwICsxLDE1NSBAQAorPCEtLSBTdGFuZGFyZCBTdHJ1dHMgRW50cmllcyAtLT4KKzwlQCBwYWdlIGxhbmd1YWdlPSJqYXZhIiBpbXBvcnQ9ImphdmEubmV0LlVSTEVuY29kZXIiIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9zdHJ1dHMtYmVhbi50bGQiIHByZWZpeD0iYmVhbiIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9zdHJ1dHMtaHRtbC50bGQiIHByZWZpeD0iaHRtbCIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9jb250cm9scy50bGQiIHByZWZpeD0iY29udHJvbHMiICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvc3RydXRzLWxvZ2ljLnRsZCIgcHJlZml4PSJsb2dpYyIgJT4KKworPGh0bWw6aHRtbCBsb2NhbGU9InRydWUiPgorCis8JUAgaW5jbHVkZSBmaWxlPSIuLi91c2Vycy9oZWFkZXIuanNwIiAlPgorCis8IS0tIEJvZHkgLS0+Cis8Ym9keSBiZ2NvbG9yPSJ3aGl0ZSIgYmFja2dyb3VuZD0iLi4vaW1hZ2VzL1BhcGVyVGV4dHVyZS5naWYiPgorCis8IS0tRm9ybSAtLT4KKworPGh0bWw6ZXJyb3JzLz4KKworPGh0bWw6Zm9ybSBtZXRob2Q9IlBPU1QiIGFjdGlvbj0iL1NhdmVEYXRhU291cmNlUmVhbG0iPgorCisgIDxiZWFuOmRlZmluZSBpZD0idGhpc09iamVjdE5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICBuYW1lPSJkYXRhU291cmNlUmVhbG1Gb3JtIiBwcm9wZXJ0eT0ib2JqZWN0TmFtZSIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9ImFkbWluQWN0aW9uIi8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0icGFyZW50T2JqZWN0TmFtZSIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9Im9iamVjdE5hbWUiLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJhbGxvd0RlbGV0aW9uIi8+CisKKyAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CisgICAgPHRyIGJnY29sb3I9IjcxNzFBNSI+CisgICAgICA8dGQgd2lkdGg9IjgxJSI+CisgICAgICAgPGRpdiBjbGFzcz0icGFnZS10aXRsZS10ZXh0IiBhbGlnbj0ibGVmdCI+CisgICAgICAgICA8bG9naWM6ZXF1YWwgbmFtZT0iZGF0YVNvdXJjZVJlYWxtRm9ybSIgcHJvcGVydHk9ImFkbWluQWN0aW9uIiB2YWx1ZT0iQ3JlYXRlIj4KKyAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJhY3Rpb25zLnJlYWxtcy5jcmVhdGUiLz4KKyAgICAgICAgICA8L2xvZ2ljOmVxdWFsPgorICAgICAgICAgIDxsb2dpYzplcXVhbCBuYW1lPSJkYXRhU291cmNlUmVhbG1Gb3JtIiBwcm9wZXJ0eT0iYWRtaW5BY3Rpb24iIHZhbHVlPSJFZGl0Ij4KKyAgICAgICAgICAgIDxiZWFuOndyaXRlIG5hbWU9ImRhdGFTb3VyY2VSZWFsbUZvcm0iIHByb3BlcnR5PSJub2RlTGFiZWwiLz4KKyAgICAgICAgICA8L2xvZ2ljOmVxdWFsPgorICAgICAgIDwvZGl2PgorICAgICAgPC90ZD4KKyAgICAgIDx0ZCBhbGlnbj0icmlnaHQiIG5vd3JhcD4KKyAgICAgICAgPGRpdiBjbGFzcz0icGFnZS10aXRsZS10ZXh0Ij4KKyAgICAgIDxjb250cm9sczphY3Rpb25zIGxhYmVsPSJSZWFsbSBBY3Rpb25zIj4KKyAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24gc2VsZWN0ZWQ9InRydWUiPiAtLS0tPGJlYW46bWVzc2FnZSBrZXk9ImFjdGlvbnMuYXZhaWxhYmxlLmFjdGlvbnMiLz4tLS0tIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbj4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgPGxvZ2ljOm5vdEVxdWFsIG5hbWU9ImRhdGFTb3VyY2VSZWFsbUZvcm0iIHByb3BlcnR5PSJhZG1pbkFjdGlvbiIgdmFsdWU9IkNyZWF0ZSI+CisgICAgICAgICAgICA8bG9naWM6bm90RXF1YWwgbmFtZT0iZGF0YVNvdXJjZVJlYWxtRm9ybSIgcHJvcGVydHk9ImFsbG93RGVsZXRpb24iIHZhbHVlPSJmYWxzZSI+CisgICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbiB1cmw9JzwlPSAiL0RlbGV0ZVJlYWxtLmRvP3NlbGVjdD0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZSh0aGlzT2JqZWN0TmFtZSkgJT4nPgorICAgICAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJhY3Rpb25zLnJlYWxtcy5kZWxldGUiLz4KKyAgICAgICAgICAgICAgPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgICAgICA8L2xvZ2ljOm5vdEVxdWFsPgorICAgICAgICAgICAgIDwvbG9naWM6bm90RXF1YWw+CisgICAgICAgPC9jb250cm9sczphY3Rpb25zPgorICAgICAgICAgPC9kaXY+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgIDwvdGFibGU+CisgICAgPCVAIGluY2x1ZGUgZmlsZT0iLi4vYnV0dG9ucy5qc3AiICU+CisgIDxicj4KKworICA8dGFibGUgY2xhc3M9ImJhY2stdGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CisgICAgPHRyPgorICAgICAgPHRkPgorICAgICAgIDxjb250cm9sczp0YWJsZSB0YWJsZVN0eWxlPSJmcm9udC10YWJsZSIgbGluZVN0eWxlPSJsaW5lLXJvdyI+CisgICAgICAgICAgICA8Y29udHJvbHM6cm93IGhlYWRlcj0idHJ1ZSIKKyAgICAgICAgICAgICAgICBsYWJlbFN0eWxlPSJ0YWJsZS1oZWFkZXItdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1oZWFkZXItdGV4dCI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9InNlcnZpY2UucHJvcGVydHkiLz48L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+PGJlYW46bWVzc2FnZSBrZXk9InNlcnZpY2UudmFsdWUiLz48L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9InR5cGUiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJjb25uZWN0b3IudHlwZSIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgICAgIDxsb2dpYzplcXVhbCBuYW1lPSJkYXRhU291cmNlUmVhbG1Gb3JtIiBwcm9wZXJ0eT0iYWRtaW5BY3Rpb24iIHZhbHVlPSJDcmVhdGUiPgorICAgICAgICAgICAgICAgICAgICA8aHRtbDpzZWxlY3QgcHJvcGVydHk9InJlYWxtVHlwZSIgb25jaGFuZ2U9IklBX2p1bXBNZW51KCdzZWxmJyx0aGlzKSIgc3R5bGVJZD0idHlwZSI+CisgICAgICAgICAgICAgICAgICAgICA8YmVhbjpkZWZpbmUgaWQ9InJlYWxtVHlwZVZhbHMiIG5hbWU9ImRhdGFTb3VyY2VSZWFsbUZvcm0iIHByb3BlcnR5PSJyZWFsbVR5cGVWYWxzIi8+CisgICAgICAgICAgICAgICAgICAgICA8aHRtbDpvcHRpb25zIGNvbGxlY3Rpb249InJlYWxtVHlwZVZhbHMiIHByb3BlcnR5PSJ2YWx1ZSIgbGFiZWxQcm9wZXJ0eT0ibGFiZWwiLz4KKyAgICAgICAgICAgICAgICAgICAgPC9odG1sOnNlbGVjdD4KKyAgICAgICAgICAgICAgICA8L2xvZ2ljOmVxdWFsPgorICAgICAgICAgICAgICAgIDxsb2dpYzplcXVhbCBuYW1lPSJkYXRhU291cmNlUmVhbG1Gb3JtIiBwcm9wZXJ0eT0iYWRtaW5BY3Rpb24iIHZhbHVlPSJFZGl0Ij4KKyAgICAgICAgICAgICAgICAgIDxiZWFuOndyaXRlIG5hbWU9ImRhdGFTb3VyY2VSZWFsbUZvcm0iIHByb3BlcnR5PSJyZWFsbVR5cGUiIHNjb3BlPSJzZXNzaW9uIi8+CisgICAgICAgICAgICAgICAgPC9sb2dpYzplcXVhbD4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJkcml2ZXIiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJyZWFsbS5kYXRhU291cmNlTmFtZSIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgIDxodG1sOnRleHQgcHJvcGVydHk9ImRhdGFTb3VyY2VOYW1lIiBzaXplPSIzMCIgc3R5bGVJZD0iZGF0YVNvdXJjZU5hbWUiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJkaWdlc3QiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJyZWFsbS5kaWdlc3QiLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICAgIDxodG1sOnRleHQgcHJvcGVydHk9ImRpZ2VzdCIgc2l6ZT0iMzAiIHN0eWxlSWQ9ImRpZ2VzdCIvPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKyAgICAgICAgCisgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJsb2NhbERhdGFTb3VyY2UiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJyZWFsbS5sb2NhbERhdGFTb3VyY2UiLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICAgPGh0bWw6c2VsZWN0IHByb3BlcnR5PSJsb2NhbERhdGFTb3VyY2UiIHN0eWxlSWQ9ImxvY2FsRGF0YVNvdXJjZSI+CisgICAgICAgICAgICAgICAgICAgICA8YmVhbjpkZWZpbmUgaWQ9ImJvb2xlYW5WYWxzIiBuYW1lPSJkYXRhU291cmNlUmVhbG1Gb3JtIiBwcm9wZXJ0eT0iYm9vbGVhblZhbHMiLz4KKyAgICAgICAgICAgICAgICAgICAgIDxodG1sOm9wdGlvbnMgY29sbGVjdGlvbj0iYm9vbGVhblZhbHMiIHByb3BlcnR5PSJ2YWx1ZSIKKyAgICAgICAgICAgICAgICAgICBsYWJlbFByb3BlcnR5PSJsYWJlbCIvPgorICAgICAgICAgICAgICAgIDwvaHRtbDpzZWxlY3Q+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0icm9sZU5hbWVDb2wiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJyZWFsbS5yb2xlTmFtZUNvbCIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgICAgPGh0bWw6dGV4dCBwcm9wZXJ0eT0icm9sZU5hbWVDb2wiIHNpemU9IjMwIiBzdHlsZUlkPSJyb2xlTmFtZUNvbCIvPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9InVzZXJDcmVkQ29sIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0icmVhbG0udXNlckNyZWRDb2wiLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICAgIDxodG1sOnRleHQgcHJvcGVydHk9InVzZXJDcmVkQ29sIiBzaXplPSIzMCIgc3R5bGVJZD0idXNlckNyZWRDb2wiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJ1c2VyTmFtZUNvbCI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9InJlYWxtLnVzZXJOYW1lQ29sIi8+OjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgICA8aHRtbDp0ZXh0IHByb3BlcnR5PSJ1c2VyTmFtZUNvbCIgc2l6ZT0iMzAiIHN0eWxlSWQ9InVzZXJOYW1lQ29sIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0idXNlclJvbGVUYWJsZSI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9InJlYWxtLnVzZXJSb2xlVGFibGUiLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICAgIDxodG1sOnRleHQgcHJvcGVydHk9InVzZXJSb2xlVGFibGUiIHNpemU9IjMwIiBzdHlsZUlkPSJ1c2VyUm9sZVRhYmxlIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0idXNlclRhYmxlIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0icmVhbG0udXNlclRhYmxlIi8+OjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgICA8aHRtbDp0ZXh0IHByb3BlcnR5PSJ1c2VyVGFibGUiIHNpemU9IjMwIiBzdHlsZUlkPSJ1c2VyVGFibGUiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgIDwvY29udHJvbHM6dGFibGU+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgIDwvdGFibGU+CisgICAgPCVAIGluY2x1ZGUgZmlsZT0iLi4vYnV0dG9ucy5qc3AiICU+CisgIDxicj4KKyAgPC9odG1sOmZvcm0+Cis8cD4mbmJzcDs8L3A+Cis8L2JvZHk+Cis8L2h0bWw6aHRtbD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3JlYWxtL2pkYmNSZWFsbS5qc3AgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9yZWFsbS9qZGJjUmVhbG0uanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxNWMxMDgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9yZWFsbS9qZGJjUmVhbG0uanNwCkBAIC0wLDAgKzEsMTY1IEBACis8IS0tIFN0YW5kYXJkIFN0cnV0cyBFbnRyaWVzIC0tPgorPCVAIHBhZ2UgbGFuZ3VhZ2U9ImphdmEiIGltcG9ydD0iamF2YS5uZXQuVVJMRW5jb2RlciIgY29udGVudFR5cGU9InRleHQvaHRtbDtjaGFyc2V0PXV0Zi04IiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL3N0cnV0cy1iZWFuLnRsZCIgcHJlZml4PSJiZWFuIiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL3N0cnV0cy1odG1sLnRsZCIgcHJlZml4PSJodG1sIiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL2NvbnRyb2xzLnRsZCIgcHJlZml4PSJjb250cm9scyIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9zdHJ1dHMtbG9naWMudGxkIiBwcmVmaXg9ImxvZ2ljIiAlPgorCis8aHRtbDpodG1sIGxvY2FsZT0idHJ1ZSI+CisKKzwlQCBpbmNsdWRlIGZpbGU9Ii4uL3VzZXJzL2hlYWRlci5qc3AiICU+CisKKzwhLS0gQm9keSAtLT4KKzxib2R5IGJnY29sb3I9IndoaXRlIiBiYWNrZ3JvdW5kPSIuLi9pbWFnZXMvUGFwZXJUZXh0dXJlLmdpZiI+CisKKzwhLS1Gb3JtIC0tPgorCis8aHRtbDplcnJvcnMvPgorCis8aHRtbDpmb3JtIG1ldGhvZD0iUE9TVCIgYWN0aW9uPSIvU2F2ZUpEQkNSZWFsbSI+CisKKyAgPGJlYW46ZGVmaW5lIGlkPSJ0aGlzT2JqZWN0TmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIG5hbWU9ImpkYmNSZWFsbUZvcm0iIHByb3BlcnR5PSJvYmplY3ROYW1lIi8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0iYWRtaW5BY3Rpb24iLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJwYXJlbnRPYmplY3ROYW1lIi8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0ib2JqZWN0TmFtZSIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9ImFsbG93RGVsZXRpb24iLz4KKworICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KKyAgICA8dHIgYmdjb2xvcj0iNzE3MUE1Ij4KKyAgICAgIDx0ZCB3aWR0aD0iODElIj4KKyAgICAgICA8ZGl2IGNsYXNzPSJwYWdlLXRpdGxlLXRleHQiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgIDxsb2dpYzplcXVhbCBuYW1lPSJqZGJjUmVhbG1Gb3JtIiBwcm9wZXJ0eT0iYWRtaW5BY3Rpb24iIHZhbHVlPSJDcmVhdGUiPgorICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9ImFjdGlvbnMucmVhbG1zLmNyZWF0ZSIvPgorICAgICAgICAgIDwvbG9naWM6ZXF1YWw+CisgICAgICAgICAgPGxvZ2ljOmVxdWFsIG5hbWU9ImpkYmNSZWFsbUZvcm0iIHByb3BlcnR5PSJhZG1pbkFjdGlvbiIgdmFsdWU9IkVkaXQiPgorICAgICAgICAgICAgPGJlYW46d3JpdGUgbmFtZT0iamRiY1JlYWxtRm9ybSIgcHJvcGVydHk9Im5vZGVMYWJlbCIvPgorICAgICAgICAgIDwvbG9naWM6ZXF1YWw+CisgICAgICAgPC9kaXY+CisgICAgICA8L3RkPgorICAgICAgPHRkIGFsaWduPSJyaWdodCIgbm93cmFwPgorICAgICAgICA8ZGl2IGNsYXNzPSJwYWdlLXRpdGxlLXRleHQiPgorICAgICAgPGNvbnRyb2xzOmFjdGlvbnMgbGFiZWw9IlJlYWxtIEFjdGlvbnMiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbiBzZWxlY3RlZD0idHJ1ZSI+IC0tLS08YmVhbjptZXNzYWdlIGtleT0iYWN0aW9ucy5hdmFpbGFibGUuYWN0aW9ucyIvPi0tLS0gPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9uPiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgICA8bG9naWM6bm90RXF1YWwgbmFtZT0iamRiY1JlYWxtRm9ybSIgcHJvcGVydHk9ImFkbWluQWN0aW9uIiB2YWx1ZT0iQ3JlYXRlIj4KKyAgICAgICAgICAgIDxsb2dpYzpub3RFcXVhbCBuYW1lPSJqZGJjUmVhbG1Gb3JtIiBwcm9wZXJ0eT0iYWxsb3dEZWxldGlvbiIgdmFsdWU9ImZhbHNlIj4KKyAgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9uIHVybD0nPCU9ICIvRGVsZXRlUmVhbG0uZG8/c2VsZWN0PSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHRoaXNPYmplY3ROYW1lKSAlPic+CisgICAgICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9ImFjdGlvbnMucmVhbG1zLmRlbGV0ZSIvPgorICAgICAgICAgICAgICA8L2NvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgICAgICAgIDwvbG9naWM6bm90RXF1YWw+CisgICAgICAgICAgICAgPC9sb2dpYzpub3RFcXVhbD4KKyAgICAgICA8L2NvbnRyb2xzOmFjdGlvbnM+CisgICAgICAgICA8L2Rpdj4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgPC90YWJsZT4KKyAgICA8JUAgaW5jbHVkZSBmaWxlPSIuLi9idXR0b25zLmpzcCIgJT4KKyAgPGJyPgorCisgIDx0YWJsZSBjbGFzcz0iYmFjay10YWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KKyAgICA8dHI+CisgICAgICA8dGQ+CisgICAgICAgPGNvbnRyb2xzOnRhYmxlIHRhYmxlU3R5bGU9ImZyb250LXRhYmxlIiBsaW5lU3R5bGU9ImxpbmUtcm93Ij4KKyAgICAgICAgICAgIDxjb250cm9sczpyb3cgaGVhZGVyPSJ0cnVlIgorICAgICAgICAgICAgICAgIGxhYmVsU3R5bGU9InRhYmxlLWhlYWRlci10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLWhlYWRlci10ZXh0Ij4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0ic2VydmljZS5wcm9wZXJ0eSIvPjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT48YmVhbjptZXNzYWdlIGtleT0ic2VydmljZS52YWx1ZSIvPjwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0idHlwZSI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9ImNvbm5lY3Rvci50eXBlIi8+OjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgICAgPGxvZ2ljOmVxdWFsIG5hbWU9ImpkYmNSZWFsbUZvcm0iIHByb3BlcnR5PSJhZG1pbkFjdGlvbiIgdmFsdWU9IkNyZWF0ZSI+CisgICAgICAgICAgICAgICAgICAgIDxodG1sOnNlbGVjdCBwcm9wZXJ0eT0icmVhbG1UeXBlIiBvbmNoYW5nZT0iSUFfanVtcE1lbnUoJ3NlbGYnLHRoaXMpIiBzdHlsZUlkPSJ0eXBlIj4KKyAgICAgICAgICAgICAgICAgICAgIDxiZWFuOmRlZmluZSBpZD0icmVhbG1UeXBlVmFscyIgbmFtZT0iamRiY1JlYWxtRm9ybSIgcHJvcGVydHk9InJlYWxtVHlwZVZhbHMiLz4KKyAgICAgICAgICAgICAgICAgICAgIDxodG1sOm9wdGlvbnMgY29sbGVjdGlvbj0icmVhbG1UeXBlVmFscyIgcHJvcGVydHk9InZhbHVlIiBsYWJlbFByb3BlcnR5PSJsYWJlbCIvPgorICAgICAgICAgICAgICAgICAgICA8L2h0bWw6c2VsZWN0PgorICAgICAgICAgICAgICAgIDwvbG9naWM6ZXF1YWw+CisgICAgICAgICAgICAgICAgPGxvZ2ljOmVxdWFsIG5hbWU9ImpkYmNSZWFsbUZvcm0iIHByb3BlcnR5PSJhZG1pbkFjdGlvbiIgdmFsdWU9IkVkaXQiPgorICAgICAgICAgICAgICAgICAgPGJlYW46d3JpdGUgbmFtZT0iamRiY1JlYWxtRm9ybSIgcHJvcGVydHk9InJlYWxtVHlwZSIgc2NvcGU9InNlc3Npb24iLz4KKyAgICAgICAgICAgICAgICA8L2xvZ2ljOmVxdWFsPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9ImRyaXZlciI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9InJlYWxtLmRyaXZlciIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgIDxodG1sOnRleHQgcHJvcGVydHk9ImRyaXZlciIgc2l6ZT0iMzAiIHN0eWxlSWQ9ImRyaXZlciIvPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9InBhc3N3ZCI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9InJlYWxtLnBhc3N3ZCIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgICAgPGh0bWw6dGV4dCBwcm9wZXJ0eT0iY29ubmVjdGlvblBhc3N3b3JkIiBzaXplPSIzMCIgc3R5bGVJZD0icGFzc3dkIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0idXJsIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0icmVhbG0udXJsIi8+OjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgICA8aHRtbDp0ZXh0IHByb3BlcnR5PSJjb25uZWN0aW9uVVJMIiBzaXplPSIzMCIgc3R5bGVJZD0idXJsIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0idXNlcm5hbWUiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJyZWFsbS51c2VyTmFtZSIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgICAgPGh0bWw6dGV4dCBwcm9wZXJ0eT0iY29ubmVjdGlvbk5hbWUiIHNpemU9IjMwIiBzdHlsZUlkPSJ1c2VybmFtZSIvPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9ImRpZ2VzdCI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9InJlYWxtLmRpZ2VzdCIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgICAgPGh0bWw6dGV4dCBwcm9wZXJ0eT0iZGlnZXN0IiBzaXplPSIzMCIgc3R5bGVJZD0iZGlnZXN0Ii8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0icGFzc3dvcmRDb2wiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJyZWFsbS5wYXNzd29yZENvbCIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgICAgPGh0bWw6dGV4dCBwcm9wZXJ0eT0icGFzc3dvcmRDb2wiIHNpemU9IjMwIiBzdHlsZUlkPSJwYXNzd29yZENvbCIvPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9InJvbGVOYW1lQ29sIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0icmVhbG0ucm9sZU5hbWVDb2wiLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICAgIDxodG1sOnRleHQgcHJvcGVydHk9InJvbGVOYW1lQ29sIiBzaXplPSIzMCIgc3R5bGVJZD0icm9sZU5hbWVDb2wiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJ1c2VyTmFtZUNvbCI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9InJlYWxtLnVzZXJOYW1lQ29sIi8+OjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgICA8aHRtbDp0ZXh0IHByb3BlcnR5PSJ1c2VyTmFtZUNvbCIgc2l6ZT0iMzAiIHN0eWxlSWQ9InVzZXJOYW1lQ29sIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0idXNlclJvbGVUYWJsZSI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9InJlYWxtLnVzZXJSb2xlVGFibGUiLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICAgIDxodG1sOnRleHQgcHJvcGVydHk9InJvbGVUYWJsZSIgc2l6ZT0iMzAiIHN0eWxlSWQ9InVzZXJSb2xlVGFibGUiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJ1c2VyVGFibGUiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJyZWFsbS51c2VyVGFibGUiLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICAgIDxodG1sOnRleHQgcHJvcGVydHk9InVzZXJUYWJsZSIgc2l6ZT0iMzAiIHN0eWxlSWQ9InVzZXJUYWJsZSIvPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgPC9jb250cm9sczp0YWJsZT4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgPC90YWJsZT4KKyAgICA8JUAgaW5jbHVkZSBmaWxlPSIuLi9idXR0b25zLmpzcCIgJT4KKyAgPGJyPgorICA8L2h0bWw6Zm9ybT4KKzxwPiZuYnNwOzwvcD4KKzwvYm9keT4KKzwvaHRtbDpodG1sPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vcmVhbG0vam5kaVJlYWxtLmpzcCBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3JlYWxtL2puZGlSZWFsbS5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVhZDA4NQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3JlYWxtL2puZGlSZWFsbS5qc3AKQEAgLTAsMCArMSwyMDggQEAKKzwhLS0gU3RhbmRhcmQgU3RydXRzIEVudHJpZXMgLS0+Cis8JUAgcGFnZSBsYW5ndWFnZT0iamF2YSIgaW1wb3J0PSJqYXZhLm5ldC5VUkxFbmNvZGVyIiBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgiICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvc3RydXRzLWJlYW4udGxkIiBwcmVmaXg9ImJlYW4iICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvc3RydXRzLWh0bWwudGxkIiBwcmVmaXg9Imh0bWwiICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvY29udHJvbHMudGxkIiBwcmVmaXg9ImNvbnRyb2xzIiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL3N0cnV0cy1sb2dpYy50bGQiIHByZWZpeD0ibG9naWMiICU+CisKKzxodG1sOmh0bWwgbG9jYWxlPSJ0cnVlIj4KKworPCVAIGluY2x1ZGUgZmlsZT0iLi4vdXNlcnMvaGVhZGVyLmpzcCIgJT4KKworPCEtLSBCb2R5IC0tPgorPGJvZHkgYmdjb2xvcj0id2hpdGUiIGJhY2tncm91bmQ9Ii4uL2ltYWdlcy9QYXBlclRleHR1cmUuZ2lmIj4KKworPCEtLUZvcm0gLS0+CisKKzxodG1sOmVycm9ycy8+CisKKzxodG1sOmZvcm0gbWV0aG9kPSJQT1NUIiBhY3Rpb249Ii9TYXZlSk5ESVJlYWxtIj4KKyAgPGJlYW46ZGVmaW5lIGlkPSJ0aGlzT2JqZWN0TmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIG5hbWU9ImpuZGlSZWFsbUZvcm0iIHByb3BlcnR5PSJvYmplY3ROYW1lIi8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0iYWRtaW5BY3Rpb24iLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJvYmplY3ROYW1lIi8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0icGFyZW50T2JqZWN0TmFtZSIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9ImFsbG93RGVsZXRpb24iLz4KKworICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KKyAgICA8dHIgYmdjb2xvcj0iNzE3MUE1Ij4KKyAgICAgIDx0ZCB3aWR0aD0iODElIj4KKyAgICAgICA8ZGl2IGNsYXNzPSJwYWdlLXRpdGxlLXRleHQiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgIDxsb2dpYzplcXVhbCBuYW1lPSJqbmRpUmVhbG1Gb3JtIiBwcm9wZXJ0eT0iYWRtaW5BY3Rpb24iIHZhbHVlPSJDcmVhdGUiPgorICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9ImFjdGlvbnMucmVhbG1zLmNyZWF0ZSIvPgorICAgICAgICAgIDwvbG9naWM6ZXF1YWw+CisgICAgICAgICAgPGxvZ2ljOmVxdWFsIG5hbWU9ImpuZGlSZWFsbUZvcm0iIHByb3BlcnR5PSJhZG1pbkFjdGlvbiIgdmFsdWU9IkVkaXQiPgorICAgICAgICAgICAgPGJlYW46d3JpdGUgbmFtZT0iam5kaVJlYWxtRm9ybSIgcHJvcGVydHk9Im5vZGVMYWJlbCIvPgorICAgICAgICAgIDwvbG9naWM6ZXF1YWw+CisgICAgICAgPC9kaXY+CisgICAgICA8L3RkPgorICAgICAgPHRkIGFsaWduPSJyaWdodCIgbm93cmFwPgorICAgICAgICA8ZGl2IGNsYXNzPSJwYWdlLXRpdGxlLXRleHQiPgorICAgICAgPGNvbnRyb2xzOmFjdGlvbnMgbGFiZWw9IlJlYWxtIEFjdGlvbnMiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbiBzZWxlY3RlZD0idHJ1ZSI+IC0tLS08YmVhbjptZXNzYWdlIGtleT0iYWN0aW9ucy5hdmFpbGFibGUuYWN0aW9ucyIvPi0tLS0gPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9uPiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgICA8bG9naWM6bm90RXF1YWwgbmFtZT0iam5kaVJlYWxtRm9ybSIgcHJvcGVydHk9ImFkbWluQWN0aW9uIiB2YWx1ZT0iQ3JlYXRlIj4KKyAgICAgICAgICAgICAgICA8bG9naWM6bm90RXF1YWwgbmFtZT0iam5kaVJlYWxtRm9ybSIgcHJvcGVydHk9ImFsbG93RGVsZXRpb24iIHZhbHVlPSJmYWxzZSI+CisgICAgICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbiB1cmw9JzwlPSAiL0RlbGV0ZVJlYWxtLmRvP3NlbGVjdD0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZSh0aGlzT2JqZWN0TmFtZSkgJT4nPgorICAgICAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJhY3Rpb25zLnJlYWxtcy5kZWxldGUiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICA8L2xvZ2ljOm5vdEVxdWFsPgorICAgICAgICA8L2xvZ2ljOm5vdEVxdWFsPgorICAgICAgIDwvY29udHJvbHM6YWN0aW9ucz4KKyAgICAgICAgIDwvZGl2PgorICAgICAgPC90ZD4KKyAgICA8L3RyPgorICA8L3RhYmxlPgorICAgIDwlQCBpbmNsdWRlIGZpbGU9Ii4uL2J1dHRvbnMuanNwIiAlPgorICA8YnI+CisKKyAgPHRhYmxlIGNsYXNzPSJiYWNrLXRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgorICAgIDx0cj4KKyAgICAgIDx0ZD4KKyAgICAgICA8Y29udHJvbHM6dGFibGUgdGFibGVTdHlsZT0iZnJvbnQtdGFibGUiIGxpbmVTdHlsZT0ibGluZS1yb3ciPgorICAgICAgICAgICAgPGNvbnRyb2xzOnJvdyBoZWFkZXI9InRydWUiCisgICAgICAgICAgICAgICAgbGFiZWxTdHlsZT0idGFibGUtaGVhZGVyLXRleHQiIGRhdGFTdHlsZT0idGFibGUtaGVhZGVyLXRleHQiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJzZXJ2aWNlLnByb3BlcnR5Ii8+PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPjxiZWFuOm1lc3NhZ2Uga2V5PSJzZXJ2aWNlLnZhbHVlIi8+PC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJ0eXBlIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0iY29ubmVjdG9yLnR5cGUiLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICAgICA8bG9naWM6ZXF1YWwgbmFtZT0iam5kaVJlYWxtRm9ybSIgcHJvcGVydHk9ImFkbWluQWN0aW9uIiB2YWx1ZT0iQ3JlYXRlIj4KKyAgICAgICAgICAgICAgICAgICAgPGh0bWw6c2VsZWN0IHByb3BlcnR5PSJyZWFsbVR5cGUiIG9uY2hhbmdlPSJJQV9qdW1wTWVudSgnc2VsZicsdGhpcykiIHN0eWxlSWQ9InR5cGUiPgorICAgICAgICAgICAgICAgICAgICAgPGJlYW46ZGVmaW5lIGlkPSJyZWFsbVR5cGVWYWxzIiBuYW1lPSJqbmRpUmVhbG1Gb3JtIiBwcm9wZXJ0eT0icmVhbG1UeXBlVmFscyIvPgorICAgICAgICAgICAgICAgICAgICAgPGh0bWw6b3B0aW9ucyBjb2xsZWN0aW9uPSJyZWFsbVR5cGVWYWxzIiBwcm9wZXJ0eT0idmFsdWUiIGxhYmVsUHJvcGVydHk9ImxhYmVsIi8+CisgICAgICAgICAgICAgICAgICAgIDwvaHRtbDpzZWxlY3Q+CisgICAgICAgICAgICAgICAgPC9sb2dpYzplcXVhbD4KKyAgICAgICAgICAgICAgICA8bG9naWM6ZXF1YWwgbmFtZT0iam5kaVJlYWxtRm9ybSIgcHJvcGVydHk9ImFkbWluQWN0aW9uIiB2YWx1ZT0iRWRpdCI+CisgICAgICAgICAgICAgICAgICA8YmVhbjp3cml0ZSBuYW1lPSJqbmRpUmVhbG1Gb3JtIiBwcm9wZXJ0eT0icmVhbG1UeXBlIiBzY29wZT0ic2Vzc2lvbiIvPgorICAgICAgICAgICAgICAgIDwvbG9naWM6ZXF1YWw+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0iY29ubk5hbWUiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJyZWFsbS5jb25uTmFtZSIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgIDxodG1sOnRleHQgcHJvcGVydHk9ImNvbm5lY3Rpb25OYW1lIiBzaXplPSIzMCIgc3R5bGVJZD0iY29ubk5hbWUiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJjb25uUGFzc3dvcmQiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJyZWFsbS5jb25uUGFzc3dvcmQiLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICAgIDxodG1sOnRleHQgcHJvcGVydHk9ImNvbm5lY3Rpb25QYXNzd29yZCIgc2l6ZT0iMzAiIHN0eWxlSWQ9ImNvbm5QYXNzd29yZCIvPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9ImNvbm5VUkwiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJyZWFsbS5jb25uVVJMIi8+OjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgICA8aHRtbDp0ZXh0IHByb3BlcnR5PSJjb25uZWN0aW9uVVJMIiBzaXplPSIzMCIgc3R5bGVJZD0iY29ublVSTCIvPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9ImNvbm5GYWN0b3J5Ij4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0icmVhbG0uY29ubkZhY3RvcnkiLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICAgIDxodG1sOnRleHQgcHJvcGVydHk9ImNvbnRleHRGYWN0b3J5IiBzaXplPSIzMCIgc3R5bGVJZD0iY29ubkZhY3RvcnkiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9ImRpZ2VzdCI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9InJlYWxtLmRpZ2VzdCIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgICAgPGh0bWw6dGV4dCBwcm9wZXJ0eT0iZGlnZXN0IiBzaXplPSIzMCIgc3R5bGVJZD0iZGlnZXN0Ii8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0icm9sZUJhc2UiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJyZWFsbS5yb2xlQmFzZSIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgICAgPGh0bWw6dGV4dCBwcm9wZXJ0eT0icm9sZUJhc2UiIHNpemU9IjMwIiBzdHlsZUlkPSJyb2xlQmFzZSIvPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9InJvbGVOYW1lIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0icmVhbG0ucm9sZU5hbWUiLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICAgIDxodG1sOnRleHQgcHJvcGVydHk9InJvbGVOYW1lIiBzaXplPSIzMCIgc3R5bGVJZD0icm9sZU5hbWUiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJwYXR0ZXJuIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0icmVhbG0ucGF0dGVybiIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgICAgPGh0bWw6dGV4dCBwcm9wZXJ0eT0icm9sZVBhdHRlcm4iIHNpemU9IjMwIiBzdHlsZUlkPSJwYXR0ZXJuIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0icm9sZXN1YnRyZWUiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJyZWFsbS5yb2xlLnN1YnRyZWUiLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgIDxodG1sOnNlbGVjdCBwcm9wZXJ0eT0icm9sZVN1YnRyZWUiIHN0eWxlSWQ9InJvbGVzdWJ0cmVlIj4KKyAgICAgICAgICAgICAgICAgICAgIDxiZWFuOmRlZmluZSBpZD0ic2VhcmNoVmFscyIgbmFtZT0iam5kaVJlYWxtRm9ybSIgcHJvcGVydHk9InNlYXJjaFZhbHMiLz4KKyAgICAgICAgICAgICAgICAgICAgIDxodG1sOm9wdGlvbnMgY29sbGVjdGlvbj0ic2VhcmNoVmFscyIgcHJvcGVydHk9InZhbHVlIgorICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxQcm9wZXJ0eT0ibGFiZWwiLz4KKyAgICAgICAgICAgICAgICA8L2h0bWw6c2VsZWN0PgorICAgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0idXNlckJhc2UiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJyZWFsbS51c2VyQmFzZSIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgICAgPGh0bWw6dGV4dCBwcm9wZXJ0eT0idXNlckJhc2UiIHNpemU9IjMwIiBzdHlsZUlkPSJ1c2VyQmFzZSIvPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9InJvbGVOYW1lIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0icmVhbG0udXNlci5yb2xlTmFtZSIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgICAgPGh0bWw6dGV4dCBwcm9wZXJ0eT0idXNlclJvbGVOYW1lIiBzaXplPSIzMCIgc3R5bGVJZD0icm9sZU5hbWUiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJ1c2Vyc3VidHJlZSI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9InJlYWxtLnVzZXIuc3VidHJlZSIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgPGh0bWw6c2VsZWN0IHByb3BlcnR5PSJ1c2VyU3VidHJlZSIgc3R5bGVJZD0idXNlcnN1YnRyZWUiPgorICAgICAgICAgICAgICAgICAgICAgPGJlYW46ZGVmaW5lIGlkPSJzZWFyY2hWYWxzIiBuYW1lPSJqbmRpUmVhbG1Gb3JtIiBwcm9wZXJ0eT0ic2VhcmNoVmFscyIvPgorICAgICAgICAgICAgICAgICAgICAgPGh0bWw6b3B0aW9ucyBjb2xsZWN0aW9uPSJzZWFyY2hWYWxzIiBwcm9wZXJ0eT0idmFsdWUiCisgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbFByb3BlcnR5PSJsYWJlbCIvPgorICAgICAgICAgICAgICAgIDwvaHRtbDpzZWxlY3Q+CisgICAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJ1c2VyUGFzc3dvcmQiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJyZWFsbS51c2VyUGFzc3dvcmQiLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICAgIDxodG1sOnRleHQgcHJvcGVydHk9InVzZXJQYXNzd29yZCIgc2l6ZT0iMzAiIHN0eWxlSWQ9InVzZXJQYXNzd29yZCIvPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9InVzZXJQYXR0ZXJuIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0icmVhbG0udXNlclBhdHRlcm4iLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICAgIDxodG1sOnRleHQgcHJvcGVydHk9InVzZXJQYXR0ZXJuIiBzaXplPSIzMCIgc3R5bGVJZD0idXNlclBhdHRlcm4iLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9InVzZXJTZWFyY2giPgorICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9InJlYWxtLnVzZXJTZWFyY2giLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgICA8aHRtbDp0ZXh0IHByb3BlcnR5PSJ1c2VyU2VhcmNoIiBzaXplPSIzMCIgc3R5bGVJZD0idXNlclNlYXJjaCIvPgorICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgIDwvY29udHJvbHM6dGFibGU+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgIDwvdGFibGU+CisKKyAgICA8JUAgaW5jbHVkZSBmaWxlPSIuLi9idXR0b25zLmpzcCIgJT4KKyAgPGJyPgorICA8L2h0bWw6Zm9ybT4KKzxwPiZuYnNwOzwvcD4KKzwvYm9keT4KKzwvaHRtbDpodG1sPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vcmVhbG0vbWVtb3J5UmVhbG0uanNwIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vcmVhbG0vbWVtb3J5UmVhbG0uanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllOTJlYjQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9yZWFsbS9tZW1vcnlSZWFsbS5qc3AKQEAgLTAsMCArMSwxMDMgQEAKKzwhLS0gU3RhbmRhcmQgU3RydXRzIEVudHJpZXMgLS0+Cis8JUAgcGFnZSBsYW5ndWFnZT0iamF2YSIgaW1wb3J0PSJqYXZhLm5ldC5VUkxFbmNvZGVyIiBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgiICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvc3RydXRzLWJlYW4udGxkIiBwcmVmaXg9ImJlYW4iICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvc3RydXRzLWh0bWwudGxkIiBwcmVmaXg9Imh0bWwiICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvc3RydXRzLWxvZ2ljLnRsZCIgcHJlZml4PSJsb2dpYyIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9jb250cm9scy50bGQiIHByZWZpeD0iY29udHJvbHMiICU+CisKKzxodG1sOmh0bWwgbG9jYWxlPSJ0cnVlIj4KKworPCVAIGluY2x1ZGUgZmlsZT0iLi4vdXNlcnMvaGVhZGVyLmpzcCIgJT4KKworPCEtLSBCb2R5IC0tPgorPGJvZHkgYmdjb2xvcj0id2hpdGUiIGJhY2tncm91bmQ9Ii4uL2ltYWdlcy9QYXBlclRleHR1cmUuZ2lmIj4KKworPCEtLUZvcm0gLS0+CisKKzxodG1sOmVycm9ycy8+CisKKzxodG1sOmZvcm0gbWV0aG9kPSJHRVQiIGFjdGlvbj0iL1NhdmVNZW1vcnlSZWFsbSI+CisKKyAgPGJlYW46ZGVmaW5lIGlkPSJ0aGlzT2JqZWN0TmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIG5hbWU9Im1lbW9yeVJlYWxtRm9ybSIgcHJvcGVydHk9Im9iamVjdE5hbWUiLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJwYXJlbnRPYmplY3ROYW1lIi8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0iYWRtaW5BY3Rpb24iLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJvYmplY3ROYW1lIi8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0iYWxsb3dEZWxldGlvbiIvPgorCisgIDx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgorICAgIDx0ciBiZ2NvbG9yPSI3MTcxQTUiPgorICAgICAgPHRkIHdpZHRoPSI4MSUiPgorICAgICAgICA8ZGl2IGNsYXNzPSJwYWdlLXRpdGxlLXRleHQiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgIDxsb2dpYzplcXVhbCBuYW1lPSJtZW1vcnlSZWFsbUZvcm0iIHByb3BlcnR5PSJhZG1pbkFjdGlvbiIgdmFsdWU9IkNyZWF0ZSI+CisgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0iYWN0aW9ucy5yZWFsbXMuY3JlYXRlIi8+CisgICAgICAgICAgPC9sb2dpYzplcXVhbD4KKyAgICAgICAgICA8bG9naWM6ZXF1YWwgbmFtZT0ibWVtb3J5UmVhbG1Gb3JtIiBwcm9wZXJ0eT0iYWRtaW5BY3Rpb24iIHZhbHVlPSJFZGl0Ij4KKyAgICAgICAgICAgIDxiZWFuOndyaXRlIG5hbWU9Im1lbW9yeVJlYWxtRm9ybSIgcHJvcGVydHk9Im5vZGVMYWJlbCIvPgorICAgICAgICAgIDwvbG9naWM6ZXF1YWw+CisgICAgICAgIDwvZGl2PgorICAgICAgPC90ZD4KKyAgICAgIDx0ZCBhbGlnbj0icmlnaHQiIG5vd3JhcD4KKyAgICAgICAgPGRpdiBjbGFzcz0icGFnZS10aXRsZS10ZXh0Ij4KKyAgICAgIDxjb250cm9sczphY3Rpb25zIGxhYmVsPSJMYWJlbCBBY3Rpb25zIj4KKyAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24gc2VsZWN0ZWQ9InRydWUiPiAtLS0tPGJlYW46bWVzc2FnZSBrZXk9ImFjdGlvbnMuYXZhaWxhYmxlLmFjdGlvbnMiLz4tLS0tIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbj4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgPGxvZ2ljOm5vdEVxdWFsIG5hbWU9Im1lbW9yeVJlYWxtRm9ybSIgcHJvcGVydHk9ImFkbWluQWN0aW9uIiB2YWx1ZT0iQ3JlYXRlIj4KKyAgICAgICAgICAgICAgICA8bG9naWM6bm90RXF1YWwgbmFtZT0ibWVtb3J5UmVhbG1Gb3JtIiBwcm9wZXJ0eT0iYWxsb3dEZWxldGlvbiIgdmFsdWU9ImZhbHNlIj4KKyAgICAgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9uIHVybD0nPCU9ICIvRGVsZXRlUmVhbG0uZG8/c2VsZWN0PSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHRoaXNPYmplY3ROYW1lKSAlPic+CisgICAgICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9ImFjdGlvbnMucmVhbG1zLmRlbGV0ZSIvPgorICAgICAgICAgICAgICAgIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgPC9sb2dpYzpub3RFcXVhbD4KKyAgICAgICAgICAgIDwvbG9naWM6bm90RXF1YWw+CisgICAgICAgPC9jb250cm9sczphY3Rpb25zPgorICAgICAgICAgPC9kaXY+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgIDwvdGFibGU+CisgICAgPCVAIGluY2x1ZGUgZmlsZT0iLi4vYnV0dG9ucy5qc3AiICU+CisgIDxicj4KKworICA8dGFibGUgY2xhc3M9ImJhY2stdGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CisgICAgPHRyPgorICAgICAgPHRkPgorICAgICAgIDxjb250cm9sczp0YWJsZSB0YWJsZVN0eWxlPSJmcm9udC10YWJsZSIgbGluZVN0eWxlPSJsaW5lLXJvdyI+CisgICAgICAgIDxjb250cm9sczpyb3cgaGVhZGVyPSJ0cnVlIgorICAgICAgICAgICAgICAgIGxhYmVsU3R5bGU9InRhYmxlLWhlYWRlci10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLWhlYWRlci10ZXh0Ij4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0ic2VydmljZS5wcm9wZXJ0eSIvPjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT48YmVhbjptZXNzYWdlIGtleT0ic2VydmljZS52YWx1ZSIvPjwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0idHlwZSI+CisgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0iY29ubmVjdG9yLnR5cGUiLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICAgICA8bG9naWM6ZXF1YWwgbmFtZT0ibWVtb3J5UmVhbG1Gb3JtIiBwcm9wZXJ0eT0iYWRtaW5BY3Rpb24iIHZhbHVlPSJDcmVhdGUiPgorICAgICAgICAgICAgICAgICAgICA8aHRtbDpzZWxlY3QgcHJvcGVydHk9InJlYWxtVHlwZSIgb25jaGFuZ2U9IklBX2p1bXBNZW51KCdzZWxmJyx0aGlzKSIgc3R5bGVJZD0idHlwZSI+CisgICAgICAgICAgICAgICAgICAgICA8YmVhbjpkZWZpbmUgaWQ9InJlYWxtVHlwZVZhbHMiIG5hbWU9Im1lbW9yeVJlYWxtRm9ybSIgcHJvcGVydHk9InJlYWxtVHlwZVZhbHMiLz4KKyAgICAgICAgICAgICAgICAgICAgIDxodG1sOm9wdGlvbnMgY29sbGVjdGlvbj0icmVhbG1UeXBlVmFscyIgcHJvcGVydHk9InZhbHVlIiBsYWJlbFByb3BlcnR5PSJsYWJlbCIvPgorICAgICAgICAgICAgICAgICAgICA8L2h0bWw6c2VsZWN0PgorICAgICAgICAgICAgICAgIDwvbG9naWM6ZXF1YWw+CisgICAgICAgICAgICAgICAgPGxvZ2ljOmVxdWFsIG5hbWU9Im1lbW9yeVJlYWxtRm9ybSIgcHJvcGVydHk9ImFkbWluQWN0aW9uIiB2YWx1ZT0iRWRpdCI+CisgICAgICAgICAgICAgICAgICA8YmVhbjp3cml0ZSBuYW1lPSJtZW1vcnlSZWFsbUZvcm0iIHByb3BlcnR5PSJyZWFsbVR5cGUiIHNjb3BlPSJzZXNzaW9uIi8+CisgICAgICAgICAgICAgICAgPC9sb2dpYzplcXVhbD4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJwYXRoTmFtZSI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9InJlYWxtLnBhdGhOYW1lIi8+OjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgICA8aHRtbDp0ZXh0IHByb3BlcnR5PSJwYXRoTmFtZSIgc2l6ZT0iMjUiIHN0eWxlSWQ9InBhdGhOYW1lIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICA8L2NvbnRyb2xzOnRhYmxlPgorICAgICAgPC90ZD4KKyAgICA8L3RyPgorICA8L3RhYmxlPgorCisgICAgPCVAIGluY2x1ZGUgZmlsZT0iLi4vYnV0dG9ucy5qc3AiICU+CisgIDxicj4KKyAgPC9odG1sOmZvcm0+Cis8cD4mbmJzcDs8L3A+Cis8L2JvZHk+Cis8L2h0bWw6aHRtbD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3JlYWxtL3JlYWxtcy5qc3AgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9yZWFsbS9yZWFsbXMuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjZTM1YzIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9yZWFsbS9yZWFsbXMuanNwCkBAIC0wLDAgKzEsOTIgQEAKKzwhLS0gU3RhbmRhcmQgU3RydXRzIEVudHJpZXMgLS0+Cis8JUAgcGFnZSBsYW5ndWFnZT0iamF2YSIgY29udGVudFR5cGU9InRleHQvaHRtbDtjaGFyc2V0PXV0Zi04IiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL3N0cnV0cy1iZWFuLnRsZCIgcHJlZml4PSJiZWFuIiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL3N0cnV0cy1odG1sLnRsZCIgcHJlZml4PSJodG1sIiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL3N0cnV0cy1sb2dpYy50bGQiIHByZWZpeD0ibG9naWMiICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvY29udHJvbHMudGxkIiBwcmVmaXg9ImNvbnRyb2xzIiAlPgorCis8aHRtbDpodG1sIGxvY2FsZT0idHJ1ZSI+CisKKzwlQCBpbmNsdWRlIGZpbGU9Ii4uL3VzZXJzL2hlYWRlci5qc3AiICU+CisKKzwhLS0gQm9keSAtLT4KKzxib2R5IGJnY29sb3I9IndoaXRlIiBiYWNrZ3JvdW5kPSIuLi9pbWFnZXMvUGFwZXJUZXh0dXJlLmdpZiI+CisKKzwhLS1Gb3JtIC0tPgorCis8aHRtbDplcnJvcnMvPgorCis8aHRtbDpmb3JtIG1ldGhvZD0icG9zdCIgYWN0aW9uPSIvRGVsZXRlUmVhbG1zIj4KKworICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KKyAgICA8dHIgYmdjb2xvcj0iNzE3MUE1Ij4KKyAgICAgIDx0ZCB3aWR0aD0iODElIj4KKyAgICAgICAgPGRpdiBjbGFzcz0icGFnZS10aXRsZS10ZXh0IiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9ImFjdGlvbnMucmVhbG1zLmRlbGV0ZSIvPgorICAgICAgICA8L2Rpdj4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQgYWxpZ249InJpZ2h0IiBub3dyYXA+CisgICAgICAgIDxkaXYgY2xhc3M9InBhZ2UtdGl0bGUtdGV4dCI+CisgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9ucyBsYWJlbD0iUmVhbG0gQWN0aW9ucyI+CisgICAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24gc2VsZWN0ZWQ9InRydWUiPgorICAgICAgICAgICAgICAgIC0tLS08YmVhbjptZXNzYWdlIGtleT0iYWN0aW9ucy5hdmFpbGFibGUuYWN0aW9ucyIvPi0tLS0KKyAgICAgICAgICAgICAgPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24gZGlzYWJsZWQ9InRydWUiPgorICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICA8L2NvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgICAgIDwvY29udHJvbHM6YWN0aW9ucz4KKyAgICAgICAgPC9kaXY+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgIDwvdGFibGU+CisKKzwlQCBpbmNsdWRlIGZpbGU9Ii4uL2J1dHRvbnMuanNwIiAlPgorICA8YnI+CisKKyAgPCUtLSBSZWFsbXMgTGlzdCAtLSU+CisKKyAgPHRhYmxlIGNsYXNzPSJiYWNrLXRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMSIKKyAgICAgICAgIHdpZHRoPSIxMDAlIj4KKyAgICA8dHI+PHRkPgorCisgICAgICA8dGFibGUgY2xhc3M9ImZyb250LXRhYmxlIiBib3JkZXI9IjEiCisgICAgICAgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CisKKyAgICAgICAgPHRyIGNsYXNzPSJoZWFkZXItcm93Ij4KKyAgICAgICAgICA8dGQ+PGRpdiBhbGlnbj0ibGVmdCIgY2xhc3M9InRhYmxlLWhlYWRlci10ZXh0Ij4KKyAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJhY3Rpb25zLmRlbGV0ZSIvPgorICAgICAgICAgIDwvZGl2PjwvdGQ+CisgICAgICAgICAgPHRkPjxkaXYgYWxpZ249ImxlZnQiIGNsYXNzPSJ0YWJsZS1oZWFkZXItdGV4dCI+CisgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0iaG9zdC5uYW1lIi8+CisgICAgICAgICAgPC9kaXY+PC90ZD4KKyAgICAgICAgPC90cj4KKworICAgICAgICA8bG9naWM6aXRlcmF0ZSBuYW1lPSJyZWFsbXNMaXN0IiBpZD0icmVhbG0iPgorICAgICAgICAgIDx0ciBjbGFzcz0ibGluZS1yb3ciPgorICAgICAgICAgICAgPHRkPjxkaXYgYWxpZ249ImxlZnQiIGNsYXNzPSJ0YWJsZS1ub3JtYWwtdGV4dCI+Jm5ic3A7CisgICAgICAgICAgICA8bGFiZWwgZm9yPSJyZWFsbXMiPjwvbGFiZWw+CisgICAgICAgICAgICAgIDxodG1sOm11bHRpYm94IHByb3BlcnR5PSJyZWFsbXMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSI8JT0gcmVhbG0udG9TdHJpbmcoKSAlPiIgc3R5bGVJZD0icmVhbG1zIi8+CisgICAgICAgICAgICA8L2Rpdj48L3RkPgorICAgICAgICAgICAgPHRkPjxkaXYgYWxpZ249ImxlZnQiIGNsYXNzPSJ0YWJsZS1ub3JtYWwtdGV4dCI+Jm5ic3A7CisgICAgICAgICAgICAgIDxodG1sOmxpbmsgcGFnZT0nPCU9ICIvRWRpdFJlYWxtLmRvP3NlbGVjdD0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLm5ldC5VUkxFbmNvZGVyLmVuY29kZShyZWFsbS50b1N0cmluZygpKSAlPic+CisgICAgICAgICAgICAgICAgPGNvbnRyb2xzOmF0dHJpYnV0ZSBuYW1lPSJyZWFsbSIgYXR0cmlidXRlPSJjbGFzc05hbWUiLz4KKyAgICAgICAgICAgICAgPC9odG1sOmxpbms+CisgICAgICAgICAgICA8L2Rpdj48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvbG9naWM6aXRlcmF0ZT4KKworICAgICAgPC90YWJsZT4KKworICAgIDwvdGQ+PC90cj4KKyAgPC90YWJsZT4KKworPCVAIGluY2x1ZGUgZmlsZT0iLi4vYnV0dG9ucy5qc3AiICU+CisKKyAgPGJyPgorPC9odG1sOmZvcm0+CisKKzxwPiZuYnNwOzwvcD4KKzwvYm9keT4KKzwvaHRtbDpodG1sPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vcmVhbG0vdXNlckRhdGFiYXNlUmVhbG0uanNwIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vcmVhbG0vdXNlckRhdGFiYXNlUmVhbG0uanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5ODZjNjIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9yZWFsbS91c2VyRGF0YWJhc2VSZWFsbS5qc3AKQEAgLTAsMCArMSwxMDkgQEAKKzwhLS0gU3RhbmRhcmQgU3RydXRzIEVudHJpZXMgLS0+Cis8JUAgcGFnZSBsYW5ndWFnZT0iamF2YSIgaW1wb3J0PSJqYXZhLm5ldC5VUkxFbmNvZGVyIiBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgiICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvc3RydXRzLWJlYW4udGxkIiBwcmVmaXg9ImJlYW4iICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvc3RydXRzLWh0bWwudGxkIiBwcmVmaXg9Imh0bWwiICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvc3RydXRzLWxvZ2ljLnRsZCIgcHJlZml4PSJsb2dpYyIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9jb250cm9scy50bGQiIHByZWZpeD0iY29udHJvbHMiICU+CisKKzxodG1sOmh0bWwgbG9jYWxlPSJ0cnVlIj4KKworPCVAIGluY2x1ZGUgZmlsZT0iLi4vdXNlcnMvaGVhZGVyLmpzcCIgJT4KKworPCEtLSBCb2R5IC0tPgorPGJvZHkgYmdjb2xvcj0id2hpdGUiIGJhY2tncm91bmQ9Ii4uL2ltYWdlcy9QYXBlclRleHR1cmUuZ2lmIj4KKworPCEtLUZvcm0gLS0+CisKKzxodG1sOmVycm9ycy8+CisKKzxodG1sOmZvcm0gbWV0aG9kPSJQT1NUIiBhY3Rpb249Ii9TYXZlVXNlckRhdGFiYXNlUmVhbG0iPgorCisgIDxiZWFuOmRlZmluZSBpZD0idGhpc09iamVjdE5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICBuYW1lPSJ1c2VyRGF0YWJhc2VSZWFsbUZvcm0iIHByb3BlcnR5PSJvYmplY3ROYW1lIi8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0icGFyZW50T2JqZWN0TmFtZSIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9ImFkbWluQWN0aW9uIi8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0ib2JqZWN0TmFtZSIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9ImFsbG93RGVsZXRpb24iLz4KKworICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KKyAgICA8dHIgYmdjb2xvcj0iNzE3MUE1Ij4KKyAgICAgIDx0ZCB3aWR0aD0iODElIj4KKyAgICAgICAgPGRpdiBjbGFzcz0icGFnZS10aXRsZS10ZXh0IiBhbGlnbj0ibGVmdCI+CisgICAgICAgICA8bG9naWM6ZXF1YWwgbmFtZT0idXNlckRhdGFiYXNlUmVhbG1Gb3JtIiBwcm9wZXJ0eT0iYWRtaW5BY3Rpb24iIHZhbHVlPSJDcmVhdGUiPgorICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9ImFjdGlvbnMucmVhbG1zLmNyZWF0ZSIvPgorICAgICAgICAgIDwvbG9naWM6ZXF1YWw+CisgICAgICAgICAgPGxvZ2ljOmVxdWFsIG5hbWU9InVzZXJEYXRhYmFzZVJlYWxtRm9ybSIgcHJvcGVydHk9ImFkbWluQWN0aW9uIiB2YWx1ZT0iRWRpdCI+CisgICAgICAgICAgICA8YmVhbjp3cml0ZSBuYW1lPSJ1c2VyRGF0YWJhc2VSZWFsbUZvcm0iIHByb3BlcnR5PSJub2RlTGFiZWwiLz4KKyAgICAgICAgICA8L2xvZ2ljOmVxdWFsPgorICAgICAgICA8L2Rpdj4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQgYWxpZ249InJpZ2h0IiBub3dyYXA+CisgICAgICAgIDxkaXYgY2xhc3M9InBhZ2UtdGl0bGUtdGV4dCI+CisgICAgICA8Y29udHJvbHM6YWN0aW9ucyBsYWJlbD0iUmVhbG0gQWN0aW9ucyI+CisgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9uIHNlbGVjdGVkPSJ0cnVlIj4gLS0tLTxiZWFuOm1lc3NhZ2Uga2V5PSJhY3Rpb25zLmF2YWlsYWJsZS5hY3Rpb25zIi8+LS0tLSA8L2NvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24+IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSA8L2NvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgICAgIDxsb2dpYzpub3RFcXVhbCBuYW1lPSJ1c2VyRGF0YWJhc2VSZWFsbUZvcm0iIHByb3BlcnR5PSJhZG1pbkFjdGlvbiIgdmFsdWU9IkNyZWF0ZSI+CisgICAgICAgICAgICAgICAgPGxvZ2ljOm5vdEVxdWFsIG5hbWU9InVzZXJEYXRhYmFzZVJlYWxtRm9ybSIgcHJvcGVydHk9ImFsbG93RGVsZXRpb24iIHZhbHVlPSJmYWxzZSI+CisgICAgICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbiB1cmw9JzwlPSAiL0RlbGV0ZVJlYWxtLmRvP3NlbGVjdD0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZSh0aGlzT2JqZWN0TmFtZSkgJT4nPgorICAgICAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJhY3Rpb25zLnJlYWxtcy5kZWxldGUiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICA8L2xvZ2ljOm5vdEVxdWFsPgorICAgICAgICAgICA8L2xvZ2ljOm5vdEVxdWFsPgorICAgICAgIDwvY29udHJvbHM6YWN0aW9ucz4KKyAgICAgICAgIDwvZGl2PgorICAgICAgPC90ZD4KKyAgICA8L3RyPgorICA8L3RhYmxlPgorICAgIDwlQCBpbmNsdWRlIGZpbGU9Ii4uL2J1dHRvbnMuanNwIiAlPgorICA8YnI+CisKKyAgPHRhYmxlIGNsYXNzPSJiYWNrLXRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgorICAgIDx0cj4KKyAgICAgIDx0ZD4KKyAgICAgICA8Y29udHJvbHM6dGFibGUgdGFibGVTdHlsZT0iZnJvbnQtdGFibGUiIGxpbmVTdHlsZT0ibGluZS1yb3ciPgorICAgICAgICAgICAgPGNvbnRyb2xzOnJvdyBoZWFkZXI9InRydWUiCisgICAgICAgICAgICAgICAgbGFiZWxTdHlsZT0idGFibGUtaGVhZGVyLXRleHQiIGRhdGFTdHlsZT0idGFibGUtaGVhZGVyLXRleHQiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJzZXJ2aWNlLnByb3BlcnR5Ii8+PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPjxiZWFuOm1lc3NhZ2Uga2V5PSJzZXJ2aWNlLnZhbHVlIi8+PC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJ0eXBlIj4KKyAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJjb25uZWN0b3IudHlwZSIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgICAgIDxsb2dpYzplcXVhbCBuYW1lPSJ1c2VyRGF0YWJhc2VSZWFsbUZvcm0iIHByb3BlcnR5PSJhZG1pbkFjdGlvbiIgdmFsdWU9IkNyZWF0ZSI+CisgICAgICAgICAgICAgICAgICAgIDxodG1sOnNlbGVjdCBwcm9wZXJ0eT0icmVhbG1UeXBlIiBvbmNoYW5nZT0iSUFfanVtcE1lbnUoJ3NlbGYnLHRoaXMpIiBzdHlsZUlkPSJ0eXBlIj4KKyAgICAgICAgICAgICAgICAgICAgIDxiZWFuOmRlZmluZSBpZD0icmVhbG1UeXBlVmFscyIgbmFtZT0idXNlckRhdGFiYXNlUmVhbG1Gb3JtIiBwcm9wZXJ0eT0icmVhbG1UeXBlVmFscyIvPgorICAgICAgICAgICAgICAgICAgICAgPGh0bWw6b3B0aW9ucyBjb2xsZWN0aW9uPSJyZWFsbVR5cGVWYWxzIiBwcm9wZXJ0eT0idmFsdWUiIGxhYmVsUHJvcGVydHk9ImxhYmVsIi8+CisgICAgICAgICAgICAgICAgICAgIDwvaHRtbDpzZWxlY3Q+CisgICAgICAgICAgICAgICAgPC9sb2dpYzplcXVhbD4KKyAgICAgICAgICAgICAgICA8bG9naWM6ZXF1YWwgbmFtZT0idXNlckRhdGFiYXNlUmVhbG1Gb3JtIiBwcm9wZXJ0eT0iYWRtaW5BY3Rpb24iIHZhbHVlPSJFZGl0Ij4KKyAgICAgICAgICAgICAgICAgIDxiZWFuOndyaXRlIG5hbWU9InVzZXJEYXRhYmFzZVJlYWxtRm9ybSIgcHJvcGVydHk9InJlYWxtVHlwZSIgc2NvcGU9InNlc3Npb24iLz4KKyAgICAgICAgICAgICAgICA8L2xvZ2ljOmVxdWFsPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9InJlc291cmNlIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0icmVhbG0ucmVzb3VyY2UiLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICAgIDxsb2dpYzplcXVhbCBuYW1lPSJ1c2VyRGF0YWJhc2VSZWFsbUZvcm0iIHByb3BlcnR5PSJhZG1pbkFjdGlvbiIgdmFsdWU9IkNyZWF0ZSI+CisgICAgICAgICAgICAgICAgICAgIDxodG1sOnRleHQgcHJvcGVydHk9InJlc291cmNlIiBzaXplPSIyNSIgbWF4bGVuZ3RoPSIyNSIgc3R5bGVJZD0icmVzb3VyY2UiLz4KKyAgICAgICAgICAgICAgICA8L2xvZ2ljOmVxdWFsPgorICAgICAgICAgICAgICAgIDxsb2dpYzplcXVhbCBuYW1lPSJ1c2VyRGF0YWJhc2VSZWFsbUZvcm0iIHByb3BlcnR5PSJhZG1pbkFjdGlvbiIgdmFsdWU9IkVkaXQiPgorICAgICAgICAgICAgICAgICAgICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9InJlc291cmNlIi8+CisgICAgICAgICAgICAgICAgICAgIDxiZWFuOndyaXRlIG5hbWU9InVzZXJEYXRhYmFzZVJlYWxtRm9ybSIgcHJvcGVydHk9InJlc291cmNlIiBzY29wZT0ic2Vzc2lvbiIvPgorICAgICAgICAgICAgICAgIDwvbG9naWM6ZXF1YWw+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICA8L2NvbnRyb2xzOnRhYmxlPgorICAgICAgPC90ZD4KKyAgICA8L3RyPgorICA8L3RhYmxlPgorCisgICAgPCVAIGluY2x1ZGUgZmlsZT0iLi4vYnV0dG9ucy5qc3AiICU+CisgIDxicj4KKyAgPC9odG1sOmZvcm0+Cis8cD4mbmJzcDs8L3A+Cis8L2JvZHk+Cis8L2h0bWw6aHRtbD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3Jlc291cmNlcy9kYXRhU291cmNlLmpzcCBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3Jlc291cmNlcy9kYXRhU291cmNlLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzUyMDc5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vcmVzb3VyY2VzL2RhdGFTb3VyY2UuanNwCkBAIC0wLDAgKzEsMjEyIEBACis8IS0tIFN0YW5kYXJkIFN0cnV0cyBFbnRyaWVzIC0tPgorCis8JUAgcGFnZSBsYW5ndWFnZT0iamF2YSIgaW1wb3J0PSJqYXZhLm5ldC5VUkxFbmNvZGVyIiBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgiICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvc3RydXRzLWJlYW4udGxkIiBwcmVmaXg9ImJlYW4iICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvc3RydXRzLWh0bWwudGxkIiBwcmVmaXg9Imh0bWwiICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvc3RydXRzLWxvZ2ljLnRsZCIgcHJlZml4PSJsb2dpYyIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9jb250cm9scy50bGQiIHByZWZpeD0iY29udHJvbHMiICU+CisKKzxodG1sOmh0bWwgbG9jYWxlPSJ0cnVlIj4KKworPCVAIGluY2x1ZGUgZmlsZT0iLi4vdXNlcnMvaGVhZGVyLmpzcCIgJT4KKworPCEtLSBCb2R5IC0tPgorPGJvZHkgYmdjb2xvcj0id2hpdGUiIGJhY2tncm91bmQ9Ii4uL2ltYWdlcy9QYXBlclRleHR1cmUuZ2lmIj4KKworPCEtLUZvcm0gLS0+CisKKzxodG1sOmVycm9ycy8+CisKKzxodG1sOmZvcm0gbWV0aG9kPSJQT1NUIiBhY3Rpb249Ii9yZXNvdXJjZXMvc2F2ZURhdGFTb3VyY2UiPgorCisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0ib2JqZWN0TmFtZSIvPgorCisgIDxiZWFuOmRlZmluZSBpZD0icmVzb3VyY2V0eXBlSW5mbyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIG5hbWU9ImRhdGFTb3VyY2VGb3JtIiBwcm9wZXJ0eT0icmVzb3VyY2V0eXBlIi8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0icmVzb3VyY2V0eXBlIi8+CisKKyAgPGJlYW46ZGVmaW5lIGlkPSJwYXRoSW5mbyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIG5hbWU9ImRhdGFTb3VyY2VGb3JtIiBwcm9wZXJ0eT0icGF0aCIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9InBhdGgiLz4KKworICA8YmVhbjpkZWZpbmUgaWQ9Imhvc3RJbmZvIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgbmFtZT0iZGF0YVNvdXJjZUZvcm0iIHByb3BlcnR5PSJob3N0Ii8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0iaG9zdCIvPgorCisgIDxiZWFuOmRlZmluZSBpZD0iZG9tYWluSW5mbyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIG5hbWU9ImRhdGFTb3VyY2VGb3JtIiBwcm9wZXJ0eT0iZG9tYWluIi8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0iZG9tYWluIi8+CisKKyAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CisgICAgPHRyIGNsYXNzPSJwYWdlLXRpdGxlLXJvdyI+CisgICAgICA8dGQgYWxpZ249ImxlZnQiIG5vd3JhcD4KKyAgICAgICAgPGRpdiBjbGFzcz0icGFnZS10aXRsZS10ZXh0Ij4KKyAgICAgICAgICA8YmVhbjp3cml0ZSBuYW1lPSJkYXRhU291cmNlRm9ybSIgcHJvcGVydHk9Im5vZGVMYWJlbCIvPgorICAgICAgICA8L2Rpdj4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQgYWxpZ249InJpZ2h0IiBub3dyYXA+CisgICAgICAgIDxkaXYgY2xhc3M9InBhZ2UtdGl0bGUtdGV4dCI+CisgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbnMgbGFiZWw9IkRhdGEgU291cmNlIEFjdGlvbnMiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbiBzZWxlY3RlZD0idHJ1ZSI+CisgICAgICAgICAgICAgIC0tLS08YmVhbjptZXNzYWdlIGtleT0iYWN0aW9ucy5hdmFpbGFibGUuYWN0aW9ucyIvPi0tLS0KKyAgICAgICAgICAgIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICA8L2NvbnRyb2xzOmFjdGlvbj4KKworICAgICAgICA8Y29udHJvbHM6YWN0aW9uIHVybD0nPCU9ICIvcmVzb3VyY2VzL3NldFVwRGF0YVNvdXJjZS5kbz9yZXNvdXJjZXR5cGU9IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUocmVzb3VyY2V0eXBlSW5mbykgKyAiJnBhdGg9IisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShwYXRoSW5mbykgKyAiJmhvc3Q9IisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShob3N0SW5mbykgKyAiJmRvbWFpbj0iKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKGRvbWFpbkluZm8pICU+Jz4KKyAgICAgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0icmVzb3VyY2VzLmFjdGlvbnMuZGF0YXNyYy5jcmVhdGUiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbiB1cmw9JzwlPSAiL3Jlc291cmNlcy9saXN0RGF0YVNvdXJjZXMuZG8/cmVzb3VyY2V0eXBlPSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHJlc291cmNldHlwZUluZm8pICsgIiZwYXRoPSIrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUocGF0aEluZm8pICsgIiZob3N0PSIrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUoaG9zdEluZm8pICsgIiZkb21haW49IisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShkb21haW5JbmZvKSArICImZm9yd2FyZD0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZSgiRGF0YVNvdXJjZXMgRGVsZXRlIExpc3QiKSAlPic+CisgICAgICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InJlc291cmNlcy5hY3Rpb25zLmRhdGFzcmMuZGVsZXRlIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgIDwvY29udHJvbHM6YWN0aW9ucz4KKyAgICAgICAgPC9kaXY+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgIDwvdGFibGU+CisKKyAgPCVAIGluY2x1ZGUgZmlsZT0iLi4vYnV0dG9ucy5qc3AiICU+Cis8YnI+CisKKyAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CisgICAgPHRyPjx0ZD48ZGl2IGNsYXNzPSJ0YWJsZS10aXRsZS10ZXh0Ij4KKyAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InJlc291cmNlcy50cmVlQnVpbGRlci5kYXRhc291cmNlcyIvPgorICAgIDwvZGl2PjwvdGQ+PC90cj4KKyAgPC90YWJsZT4KKworICA8dGFibGUgY2xhc3M9ImJhY2stdGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIxIiB3aWR0aD0iMTAwJSI+CisgICAgPHRyPgorICAgICAgPHRkPgorCisgICAgICAgIDxjb250cm9sczp0YWJsZSB0YWJsZVN0eWxlPSJmcm9udC10YWJsZSIgbGluZVN0eWxlPSJsaW5lLXJvdyI+CisgICAgICAgICAgPGNvbnRyb2xzOnJvdyBoZWFkZXI9InRydWUiCisgICAgICAgICAgICAgICAgbGFiZWxTdHlsZT0idGFibGUtaGVhZGVyLXRleHQiIGRhdGFTdHlsZT0idGFibGUtaGVhZGVyLXRleHQiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJzZXJ2aWNlLnByb3BlcnR5Ii8+PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPjxiZWFuOm1lc3NhZ2Uga2V5PSJzZXJ2aWNlLnZhbHVlIi8+PC9jb250cm9sczpkYXRhPgorICAgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IgorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9ImpuZGkiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0icmVzb3VyY2VzLmRhdGFzcmMuam5kaSIvPjoKKyAgICAgICAgICAgIDwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgPGxvZ2ljOnByZXNlbnQgbmFtZT0iZGF0YVNvdXJjZUZvcm0iIHByb3BlcnR5PSJvYmplY3ROYW1lIj4KKyAgICAgICAgICAgICAgICA8YmVhbjp3cml0ZSBuYW1lPSJkYXRhU291cmNlRm9ybSIgcHJvcGVydHk9ImpuZGlOYW1lIi8+CisgICAgICAgICAgICAgICAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJqbmRpTmFtZSIvPgorICAgICAgICAgICAgICA8L2xvZ2ljOnByZXNlbnQ+CisgICAgICAgICAgICAgIDxsb2dpYzpub3RQcmVzZW50IG5hbWU9ImRhdGFTb3VyY2VGb3JtIiBwcm9wZXJ0eT0ib2JqZWN0TmFtZSI+CisgICAgICAgICAgICAgICAgPGh0bWw6dGV4dCBwcm9wZXJ0eT0iam5kaU5hbWUiIHNpemU9IjM1IiBtYXhsZW5ndGg9IjU2IiBzdHlsZUlkPSJqbmRpIi8+CisgICAgICAgICAgICAgIDwvbG9naWM6bm90UHJlc2VudD4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJ1cmwiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0icmVzb3VyY2VzLmRhdGFzcmMudXJsIi8+OgorICAgICAgICAgICAgPC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICAgIDxodG1sOnRleHRhcmVhIHByb3BlcnR5PSJ1cmwiIGNvbHM9IjM1IiByb3dzPSIyIiBzdHlsZUlkPSJ1cmwiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJqZGJjY2xhc3MiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0icmVzb3VyY2VzLmRhdGFzcmMuamRiY2NsYXNzIi8+OgorICAgICAgICAgICAgPC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICA8aHRtbDp0ZXh0IHByb3BlcnR5PSJkcml2ZXJDbGFzcyIgc2l6ZT0iNDUiIG1heGxlbmd0aD0iMjU2IiBzdHlsZUlkPSJqZGJjY2xhc3MiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJ1c2VybmFtZSI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJ1c2Vycy5wcm9tcHQudXNlcm5hbWUiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgPGh0bWw6dGV4dCBwcm9wZXJ0eT0idXNlcm5hbWUiIHNpemU9IjE1IiBtYXhsZW5ndGg9IjI1IiBzdHlsZUlkPSJ1c2VybmFtZSIvPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IgorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9InBhc3N3b3JkIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InVzZXJzLnByb21wdC5wYXNzd29yZCIvPgorICAgICAgICAgICAgPC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICA8aHRtbDpwYXNzd29yZCBwcm9wZXJ0eT0icGFzc3dvcmQiIHNpemU9IjE1IiBtYXhsZW5ndGg9IjI1IiBzdHlsZUlkPSJwYXNzd29yZCIvPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IgorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9ImFjdGl2ZSI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJyZXNvdXJjZXMuZGF0YXNyYy5hY3RpdmUiLz46CisgICAgICAgICAgICA8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgIDxodG1sOnRleHQgcHJvcGVydHk9ImFjdGl2ZSIgc2l6ZT0iNSIgbWF4bGVuZ3RoPSI1IiBzdHlsZUlkPSJhY3RpdmUiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJpZGxlIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InJlc291cmNlcy5kYXRhc3JjLmlkbGUiLz46CisgICAgICAgICAgICA8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgIDxodG1sOnRleHQgcHJvcGVydHk9ImlkbGUiIHNpemU9IjUiIG1heGxlbmd0aD0iNSIgc3R5bGVJZD0iaWRsZSIvPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IgorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9IndhaXQiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0icmVzb3VyY2VzLmRhdGFzcmMud2FpdCIvPjoKKyAgICAgICAgICAgIDwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgPGh0bWw6dGV4dCBwcm9wZXJ0eT0id2FpdCIgc2l6ZT0iNSIgbWF4bGVuZ3RoPSI1IiBzdHlsZUlkPSJ3YWl0Ii8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiCisgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0idmFsaWRhdGlvbiI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJyZXNvdXJjZXMuZGF0YXNyYy52YWxpZGF0aW9uIi8+OgorICAgICAgICAgICAgPC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICA8aHRtbDp0ZXh0YXJlYSBwcm9wZXJ0eT0icXVlcnkiIGNvbHM9IjM1IiByb3dzPSIzIiBzdHlsZUlkPSJ2YWxpZGF0aW9uIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgICAgPC9jb250cm9sczp0YWJsZT4KKworICAgICAgPC90ZD4KKworICAgIDwvdHI+CisKKyAgPC90YWJsZT4KKworICA8JUAgaW5jbHVkZSBmaWxlPSIuLi9idXR0b25zLmpzcCIgJT4KKworPC9odG1sOmZvcm0+CisKKzwhLS0gU3RhbmRhcmQgRm9vdGVyIC0tPgorCis8JUAgaW5jbHVkZSBmaWxlPSIuLi91c2Vycy9mb290ZXIuanNwIiAlPgorCis8L2JvZHk+CisKKzwvaHRtbDpodG1sPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vcmVzb3VyY2VzL2RhdGFTb3VyY2VzLmpzcGYgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9yZXNvdXJjZXMvZGF0YVNvdXJjZXMuanNwZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGZmNzc2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vcmVzb3VyY2VzL2RhdGFTb3VyY2VzLmpzcGYKQEAgLTAsMCArMSw1MCBAQAorPCUtLSBEYXRhU291cmNlcyBMaXN0IC0tJT4KKworPHRhYmxlIGNsYXNzPSJiYWNrLXRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMSIKKyAgICAgICB3aWR0aD0iMTAwJSI+PHRyPjx0ZD4gCisKKyAgPHRhYmxlIGNsYXNzPSJmcm9udC10YWJsZSIgYm9yZGVyPSIxIgorICAgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CisgICAgPHRyIGNsYXNzPSJoZWFkZXItcm93Ij4KKyAgICAgIDxsb2dpYzpwcmVzZW50IG5hbWU9ImNoZWNrYm94ZXMiPgorICAgICAgICA8dGQgd2lkdGg9IjUlIj48ZGl2IGFsaWduPSJsZWZ0IiBjbGFzcz0idGFibGUtaGVhZGVyLXRleHQiPgorICAgICAgICAgICZuYnNwOworICAgICAgICA8L3RkPgorICAgICAgPC9sb2dpYzpwcmVzZW50PgorICAgICAgPHRoIHNjb3BlPSJjb2wiIHdpZHRoPSIyMCUiPjxkaXYgYWxpZ249ImxlZnQiIGNsYXNzPSJ0YWJsZS1oZWFkZXItdGV4dCI+CisgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJyZXNvdXJjZXMuZGF0YXNyYy5qbmRpIi8+CisgICAgICA8L2Rpdj48L3RoPgorICAgICAgPHRoIHNjb3BlPSJjb2wiPjxkaXYgYWxpZ249ImxlZnQiIGNsYXNzPSJ0YWJsZS1oZWFkZXItdGV4dCI+CisgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJyZXNvdXJjZXMuZGF0YXNyYy5qZGJjY2xhc3MiLz4KKyAgICAgIDwvZGl2PjwvdGg+CisgICAgPC90cj4KKworICAgIDxsb2dpYzppdGVyYXRlIG5hbWU9ImRhdGFTb3VyY2VzRm9ybSIgcHJvcGVydHk9ImRhdGFTb3VyY2VzIgorICAgICAgICAgICAgICAgICAgICAgaWQ9ImRhdGFTb3VyY2UiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorICAgICAgPHRyIGNsYXNzPSJsaW5lLXJvdyI+CisgICAgICAgIDxsb2dpYzpwcmVzZW50IG5hbWU9ImNoZWNrYm94ZXMiPgorICAgICAgICAgIDx0ZCBzY29wZT0icm93Ij48ZGl2IGFsaWduPSJjZW50ZXIiIGNsYXNzPSJ0YWJsZS1ub3JtYWwtdGV4dCI+CisgICAgICAgICAgICA8bGFiZWwgZm9yPSJkYXRhU291cmNlcyI+PC9sYWJlbD4KKyAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iZGF0YVNvdXJjZXMiCisgICAgICAgICAgICAgICAgICB2YWx1ZT0iPCU9IGRhdGFTb3VyY2UgJT4iIHN0eWxlSWQ9ImRhdGFTb3VyY2VzIj4KKyAgICAgICAgICA8L3RkPgorICAgICAgICA8L2xvZ2ljOnByZXNlbnQ+CisgICAgICAgIDx0ZCBzY29wZT0icm93Ij48ZGl2IGFsaWduPSJsZWZ0IiBjbGFzcz0idGFibGUtbm9ybWFsLXRleHQiPgorICAgICAgICAgIDxodG1sOmxpbmsgcGFnZT0nPCU9ICIvcmVzb3VyY2VzL3NldFVwRGF0YVNvdXJjZS5kbz9vYmplY3ROYW1lPSIgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShkYXRhU291cmNlKSArICImcmVzb3VyY2V0eXBlPSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHJlc291cmNldHlwZUluZm8pICsgIiZwYXRoPSIrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUocGF0aEluZm8pICsgIiZob3N0PSIrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUoaG9zdEluZm8pICsgIiZkb21haW49IisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShkb21haW5JbmZvKSAgJT4nPgorICAgICAgICAgICAgPGNvbnRyb2xzOmF0dHJpYnV0ZSBuYW1lPSJkYXRhU291cmNlIiBhdHRyaWJ1dGU9Im5hbWUiLz4KKyAgICAgICAgICA8L2h0bWw6bGluaz4KKyAgICAgICAgPC9kaXY+PC90ZD4KKyAgICAgICAgPHRkIHNjb3BlPSJyb3ciPjxkaXYgYWxpZ249ImxlZnQiIGNsYXNzPSJ0YWJsZS1ub3JtYWwtdGV4dCI+Jm5ic3A7CisgICAgICAgICAgPGNvbnRyb2xzOmF0dHJpYnV0ZSBuYW1lPSJkYXRhU291cmNlIiBhdHRyaWJ1dGU9ImRyaXZlckNsYXNzTmFtZSIvPgorICAgICAgICA8L2Rpdj48L3RkPgorICAgICAgPC90cj4KKyAgICA8L2xvZ2ljOml0ZXJhdGU+CisKKyAgPC90YWJsZT4KKworPC90ZD48L3RyPjwvdGFibGU+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9yZXNvdXJjZXMvZGVsZXRlRGF0YVNvdXJjZXMuanNwIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vcmVzb3VyY2VzL2RlbGV0ZURhdGFTb3VyY2VzLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjRkMDY2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vcmVzb3VyY2VzL2RlbGV0ZURhdGFTb3VyY2VzLmpzcApAQCAtMCwwICsxLDg2IEBACis8IS0tIFN0YW5kYXJkIFN0cnV0cyBFbnRyaWVzIC0tPgorPCVAIHBhZ2UgbGFuZ3VhZ2U9ImphdmEiIGltcG9ydD0iamF2YS5uZXQuVVJMRW5jb2RlciIgY29udGVudFR5cGU9InRleHQvaHRtbDtjaGFyc2V0PXV0Zi04IiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL3N0cnV0cy1iZWFuLnRsZCIgcHJlZml4PSJiZWFuIiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL3N0cnV0cy1odG1sLnRsZCIgcHJlZml4PSJodG1sIiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL3N0cnV0cy1sb2dpYy50bGQiIHByZWZpeD0ibG9naWMiICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvY29udHJvbHMudGxkIiBwcmVmaXg9ImNvbnRyb2xzIiAlPgorCis8aHRtbDpodG1sIGxvY2FsZT0idHJ1ZSI+CisKKzwlQCBpbmNsdWRlIGZpbGU9Ii4uL3VzZXJzL2hlYWRlci5qc3AiICU+CisKKzwhLS0gQm9keSAtLT4KKzxib2R5IGJnY29sb3I9IndoaXRlIiBiYWNrZ3JvdW5kPSIuLi9pbWFnZXMvUGFwZXJUZXh0dXJlLmdpZiI+CisKKzwhLS1Gb3JtIC0tPgorCis8aHRtbDplcnJvcnMvPgorCis8aHRtbDpmb3JtIGFjdGlvbj0iL3Jlc291cmNlcy9saXN0RGF0YVNvdXJjZXMiPgorCisgIDxiZWFuOmRlZmluZSBpZD0icmVzb3VyY2V0eXBlSW5mbyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIG5hbWU9ImRhdGFTb3VyY2VzRm9ybSIgcHJvcGVydHk9InJlc291cmNldHlwZSIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9InJlc291cmNldHlwZSIvPgorCisgIDxiZWFuOmRlZmluZSBpZD0icGF0aEluZm8iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICBuYW1lPSJkYXRhU291cmNlc0Zvcm0iIHByb3BlcnR5PSJwYXRoIi8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0icGF0aCIvPgorCisgIDxiZWFuOmRlZmluZSBpZD0iaG9zdEluZm8iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICBuYW1lPSJkYXRhU291cmNlc0Zvcm0iIHByb3BlcnR5PSJob3N0Ii8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0iaG9zdCIvPgorCisgIDxiZWFuOmRlZmluZSBpZD0iZG9tYWluSW5mbyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIG5hbWU9ImRhdGFTb3VyY2VzRm9ybSIgcHJvcGVydHk9ImRvbWFpbiIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9ImRvbWFpbiIvPgorCisgIDx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgorICAgIDx0ciBiZ2NvbG9yPSI3MTcxQTUiPgorICAgICAgPHRkIHdpZHRoPSI4MSUiPgorICAgICAgICA8ZGl2IGNsYXNzPSJwYWdlLXRpdGxlLXRleHQiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0icmVzb3VyY2VzLmFjdGlvbnMuZGF0YXNyYy5kZWxldGUiLz4KKyAgICAgICAgPC9kaXY+CisgICAgICA8L3RkPgorICAgICAgPHRkIHdpZHRoPSIxOSUiPgorICAgICAgICA8ZGl2IGFsaWduPSJyaWdodCI+CisgICAgICAgICAgPCVAIGluY2x1ZGUgZmlsZT0ibGlzdERhdGFTb3VyY2VzLmpzcGYiICU+CisgICAgICAgIDwvZGl2PgorICAgICAgPC90ZD4KKyAgICA8L3RyPgorICA8L3RhYmxlPgorCis8L2h0bWw6Zm9ybT4KKworPGJyPgorCis8YmVhbjpkZWZpbmUgaWQ9ImNoZWNrYm94ZXMiIHNjb3BlPSJwYWdlIiB2YWx1ZT0idHJ1ZSIvPgorCis8aHRtbDpmb3JtIGFjdGlvbj0iL3Jlc291cmNlcy9kZWxldGVEYXRhU291cmNlcyI+CisKKyAgPGJlYW46ZGVmaW5lIGlkPSJyZXNvdXJjZXR5cGVJbmZvIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgbmFtZT0iZGF0YVNvdXJjZXNGb3JtIiBwcm9wZXJ0eT0icmVzb3VyY2V0eXBlIi8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0icmVzb3VyY2V0eXBlIi8+CisKKyAgPGJlYW46ZGVmaW5lIGlkPSJwYXRoSW5mbyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIG5hbWU9ImRhdGFTb3VyY2VzRm9ybSIgcHJvcGVydHk9InBhdGgiLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJwYXRoIi8+CisKKyAgPGJlYW46ZGVmaW5lIGlkPSJob3N0SW5mbyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIG5hbWU9ImRhdGFTb3VyY2VzRm9ybSIgcHJvcGVydHk9Imhvc3QiLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJob3N0Ii8+CisKKyAgPGJlYW46ZGVmaW5lIGlkPSJkb21haW5JbmZvIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgbmFtZT0iZGF0YVNvdXJjZXNGb3JtIiBwcm9wZXJ0eT0iZG9tYWluIi8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0iZG9tYWluIi8+CisKKyAgPCVAIGluY2x1ZGUgZmlsZT0iLi4vYnV0dG9ucy5qc3AiICU+CisgIDxicj4KKyAgPCVAIGluY2x1ZGUgZmlsZT0iZGF0YVNvdXJjZXMuanNwZiIgJT4KKyAgPCVAIGluY2x1ZGUgZmlsZT0iLi4vYnV0dG9ucy5qc3AiICU+Cis8L2h0bWw6Zm9ybT4KKzxicj4KKworPCVAIGluY2x1ZGUgZmlsZT0iLi4vdXNlcnMvZm9vdGVyLmpzcCIgJT4KKworPC9ib2R5PgorPC9odG1sOmh0bWw+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9yZXNvdXJjZXMvZGVsZXRlRW52RW50cmllcy5qc3AgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9yZXNvdXJjZXMvZGVsZXRlRW52RW50cmllcy5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIxYmY5YQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3Jlc291cmNlcy9kZWxldGVFbnZFbnRyaWVzLmpzcApAQCAtMCwwICsxLDg2IEBACis8IS0tIFN0YW5kYXJkIFN0cnV0cyBFbnRyaWVzIC0tPgorPCVAIHBhZ2UgbGFuZ3VhZ2U9ImphdmEiIGltcG9ydD0iamF2YS5uZXQuVVJMRW5jb2RlciIgY29udGVudFR5cGU9InRleHQvaHRtbDtjaGFyc2V0PXV0Zi04IiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL3N0cnV0cy1iZWFuLnRsZCIgcHJlZml4PSJiZWFuIiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL3N0cnV0cy1odG1sLnRsZCIgcHJlZml4PSJodG1sIiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL3N0cnV0cy1sb2dpYy50bGQiIHByZWZpeD0ibG9naWMiICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvY29udHJvbHMudGxkIiBwcmVmaXg9ImNvbnRyb2xzIiAlPgorCis8aHRtbDpodG1sIGxvY2FsZT0idHJ1ZSI+CisKKzwlQCBpbmNsdWRlIGZpbGU9Ii4uL3VzZXJzL2hlYWRlci5qc3AiICU+CisKKzwhLS0gQm9keSAtLT4KKzxib2R5IGJnY29sb3I9IndoaXRlIiBiYWNrZ3JvdW5kPSIuLi9pbWFnZXMvUGFwZXJUZXh0dXJlLmdpZiI+CisKKzwhLS1Gb3JtIC0tPgorCis8aHRtbDplcnJvcnMvPgorCis8aHRtbDpmb3JtIGFjdGlvbj0iL3Jlc291cmNlcy9saXN0RW52RW50cmllcyI+CisKKyAgPGJlYW46ZGVmaW5lIGlkPSJyZXNvdXJjZXR5cGVJbmZvIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgbmFtZT0iZW52RW50cmllc0Zvcm0iIHByb3BlcnR5PSJyZXNvdXJjZXR5cGUiLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJyZXNvdXJjZXR5cGUiLz4KKworICA8YmVhbjpkZWZpbmUgaWQ9InBhdGhJbmZvIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgbmFtZT0iZW52RW50cmllc0Zvcm0iIHByb3BlcnR5PSJwYXRoIi8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0icGF0aCIvPgorCisgIDxiZWFuOmRlZmluZSBpZD0iaG9zdEluZm8iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICBuYW1lPSJlbnZFbnRyaWVzRm9ybSIgcHJvcGVydHk9Imhvc3QiLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJob3N0Ii8+CisKKyAgPGJlYW46ZGVmaW5lIGlkPSJkb21haW5JbmZvIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgbmFtZT0iZW52RW50cmllc0Zvcm0iIHByb3BlcnR5PSJkb21haW4iLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJkb21haW4iLz4KKworICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KKyAgICA8dHIgYmdjb2xvcj0iNzE3MUE1Ij4KKyAgICAgIDx0ZCB3aWR0aD0iODElIj4KKyAgICAgICAgPGRpdiBjbGFzcz0icGFnZS10aXRsZS10ZXh0IiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InJlc291cmNlcy5hY3Rpb25zLmVudi5kZWxldGUiLz4KKyAgICAgICAgPC9kaXY+CisgICAgICA8L3RkPgorICAgICAgPHRkIHdpZHRoPSIxOSUiPgorICAgICAgICA8ZGl2IGFsaWduPSJyaWdodCI+CisgICAgICAgICAgPCVAIGluY2x1ZGUgZmlsZT0ibGlzdEVudkVudHJpZXMuanNwZiIgJT4KKyAgICAgICAgPC9kaXY+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgIDwvdGFibGU+CisKKzwvaHRtbDpmb3JtPgorCis8YnI+CisKKzxiZWFuOmRlZmluZSBpZD0iY2hlY2tib3hlcyIgc2NvcGU9InBhZ2UiIHZhbHVlPSJ0cnVlIi8+CisKKzxodG1sOmZvcm0gYWN0aW9uPSIvcmVzb3VyY2VzL2RlbGV0ZUVudkVudHJpZXMiPgorCisgIDxiZWFuOmRlZmluZSBpZD0icmVzb3VyY2V0eXBlSW5mbyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIG5hbWU9ImVudkVudHJpZXNGb3JtIiBwcm9wZXJ0eT0icmVzb3VyY2V0eXBlIi8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0icmVzb3VyY2V0eXBlIi8+CisKKyAgPGJlYW46ZGVmaW5lIGlkPSJwYXRoSW5mbyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIG5hbWU9ImVudkVudHJpZXNGb3JtIiBwcm9wZXJ0eT0icGF0aCIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9InBhdGgiLz4KKworICA8YmVhbjpkZWZpbmUgaWQ9Imhvc3RJbmZvIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgbmFtZT0iZW52RW50cmllc0Zvcm0iIHByb3BlcnR5PSJob3N0Ii8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0iaG9zdCIvPgorCisgIDxiZWFuOmRlZmluZSBpZD0iZG9tYWluSW5mbyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIG5hbWU9ImVudkVudHJpZXNGb3JtIiBwcm9wZXJ0eT0iZG9tYWluIi8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0iZG9tYWluIi8+CisKKyAgPCVAIGluY2x1ZGUgZmlsZT0iLi4vYnV0dG9ucy5qc3AiICU+CisgIDxicj4KKyAgPCVAIGluY2x1ZGUgZmlsZT0iZW52RW50cmllcy5qc3BmIiAlPgorICA8JUAgaW5jbHVkZSBmaWxlPSIuLi9idXR0b25zLmpzcCIgJT4KKzwvaHRtbDpmb3JtPgorPGJyPgorCis8JUAgaW5jbHVkZSBmaWxlPSIuLi91c2Vycy9mb290ZXIuanNwIiAlPgorCis8L2JvZHk+Cis8L2h0bWw6aHRtbD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3Jlc291cmNlcy9kZWxldGVNYWlsU2Vzc2lvbnMuanNwIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vcmVzb3VyY2VzL2RlbGV0ZU1haWxTZXNzaW9ucy5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE0YTQwNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3Jlc291cmNlcy9kZWxldGVNYWlsU2Vzc2lvbnMuanNwCkBAIC0wLDAgKzEsODYgQEAKKzwhLS0gU3RhbmRhcmQgU3RydXRzIEVudHJpZXMgLS0+Cis8JUAgcGFnZSBsYW5ndWFnZT0iamF2YSIgaW1wb3J0PSJqYXZhLm5ldC5VUkxFbmNvZGVyIiBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgiICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvc3RydXRzLWJlYW4udGxkIiBwcmVmaXg9ImJlYW4iICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvc3RydXRzLWh0bWwudGxkIiBwcmVmaXg9Imh0bWwiICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvc3RydXRzLWxvZ2ljLnRsZCIgcHJlZml4PSJsb2dpYyIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9jb250cm9scy50bGQiIHByZWZpeD0iY29udHJvbHMiICU+CisKKzxodG1sOmh0bWwgbG9jYWxlPSJ0cnVlIj4KKworPCVAIGluY2x1ZGUgZmlsZT0iLi4vdXNlcnMvaGVhZGVyLmpzcCIgJT4KKworPCEtLSBCb2R5IC0tPgorPGJvZHkgYmdjb2xvcj0id2hpdGUiIGJhY2tncm91bmQ9Ii4uL2ltYWdlcy9QYXBlclRleHR1cmUuZ2lmIj4KKworPCEtLUZvcm0gLS0+CisKKzxodG1sOmVycm9ycy8+CisKKzxodG1sOmZvcm0gYWN0aW9uPSIvcmVzb3VyY2VzL2xpc3RNYWlsU2Vzc2lvbnMiPgorCisgIDxiZWFuOmRlZmluZSBpZD0icmVzb3VyY2V0eXBlSW5mbyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIG5hbWU9Im1haWxTZXNzaW9uc0Zvcm0iIHByb3BlcnR5PSJyZXNvdXJjZXR5cGUiLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJyZXNvdXJjZXR5cGUiLz4KKworICA8YmVhbjpkZWZpbmUgaWQ9InBhdGhJbmZvIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgbmFtZT0ibWFpbFNlc3Npb25zRm9ybSIgcHJvcGVydHk9InBhdGgiLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJwYXRoIi8+CisKKyAgPGJlYW46ZGVmaW5lIGlkPSJob3N0SW5mbyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIG5hbWU9Im1haWxTZXNzaW9uc0Zvcm0iIHByb3BlcnR5PSJob3N0Ii8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0iaG9zdCIvPgorCisgIDxiZWFuOmRlZmluZSBpZD0iZG9tYWluSW5mbyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIG5hbWU9Im1haWxTZXNzaW9uc0Zvcm0iIHByb3BlcnR5PSJkb21haW4iLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJkb21haW4iLz4KKworICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KKyAgICA8dHIgYmdjb2xvcj0iNzE3MUE1Ij4KKyAgICAgIDx0ZCB3aWR0aD0iODElIj4KKyAgICAgICAgPGRpdiBjbGFzcz0icGFnZS10aXRsZS10ZXh0IiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InJlc291cmNlcy5hY3Rpb25zLm1haWxzZXNzaW9uLmRlbGV0ZSIvPgorICAgICAgICA8L2Rpdj4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQgd2lkdGg9IjE5JSI+CisgICAgICAgIDxkaXYgYWxpZ249InJpZ2h0Ij4KKyAgICAgICAgICA8JUAgaW5jbHVkZSBmaWxlPSJsaXN0TWFpbFNlc3Npb25zLmpzcGYiICU+CisgICAgICAgIDwvZGl2PgorICAgICAgPC90ZD4KKyAgICA8L3RyPgorICA8L3RhYmxlPgorCis8L2h0bWw6Zm9ybT4KKworPGJyPgorCis8YmVhbjpkZWZpbmUgaWQ9ImNoZWNrYm94ZXMiIHNjb3BlPSJwYWdlIiB2YWx1ZT0idHJ1ZSIvPgorCis8aHRtbDpmb3JtIGFjdGlvbj0iL3Jlc291cmNlcy9kZWxldGVNYWlsU2Vzc2lvbnMiPgorCisgIDxiZWFuOmRlZmluZSBpZD0icmVzb3VyY2V0eXBlSW5mbyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIG5hbWU9Im1haWxTZXNzaW9uc0Zvcm0iIHByb3BlcnR5PSJyZXNvdXJjZXR5cGUiLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJyZXNvdXJjZXR5cGUiLz4KKworICA8YmVhbjpkZWZpbmUgaWQ9InBhdGhJbmZvIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgbmFtZT0ibWFpbFNlc3Npb25zRm9ybSIgcHJvcGVydHk9InBhdGgiLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJwYXRoIi8+CisKKyAgPGJlYW46ZGVmaW5lIGlkPSJob3N0SW5mbyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIG5hbWU9Im1haWxTZXNzaW9uc0Zvcm0iIHByb3BlcnR5PSJob3N0Ii8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0iaG9zdCIvPgorCisgIDxiZWFuOmRlZmluZSBpZD0iZG9tYWluSW5mbyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIG5hbWU9Im1haWxTZXNzaW9uc0Zvcm0iIHByb3BlcnR5PSJkb21haW4iLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJkb21haW4iLz4KKworICA8JUAgaW5jbHVkZSBmaWxlPSIuLi9idXR0b25zLmpzcCIgJT4KKyAgPGJyPgorICA8JUAgaW5jbHVkZSBmaWxlPSJtYWlsU2Vzc2lvbnMuanNwZiIgJT4KKyAgPCVAIGluY2x1ZGUgZmlsZT0iLi4vYnV0dG9ucy5qc3AiICU+Cis8L2h0bWw6Zm9ybT4KKzxicj4KKworPCVAIGluY2x1ZGUgZmlsZT0iLi4vdXNlcnMvZm9vdGVyLmpzcCIgJT4KKworPC9ib2R5PgorPC9odG1sOmh0bWw+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9yZXNvdXJjZXMvZGVsZXRlUmVzb3VyY2VMaW5rcy5qc3AgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9yZXNvdXJjZXMvZGVsZXRlUmVzb3VyY2VMaW5rcy5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2QzZTA3MAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3Jlc291cmNlcy9kZWxldGVSZXNvdXJjZUxpbmtzLmpzcApAQCAtMCwwICsxLDg0IEBACis8IS0tIFN0YW5kYXJkIFN0cnV0cyBFbnRyaWVzIC0tPgorPCVAIHBhZ2UgbGFuZ3VhZ2U9ImphdmEiIGltcG9ydD0iamF2YS5uZXQuVVJMRW5jb2RlciIgY29udGVudFR5cGU9InRleHQvaHRtbDtjaGFyc2V0PXV0Zi04IiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL3N0cnV0cy1iZWFuLnRsZCIgcHJlZml4PSJiZWFuIiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL3N0cnV0cy1odG1sLnRsZCIgcHJlZml4PSJodG1sIiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL3N0cnV0cy1sb2dpYy50bGQiIHByZWZpeD0ibG9naWMiICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvY29udHJvbHMudGxkIiBwcmVmaXg9ImNvbnRyb2xzIiAlPgorCis8aHRtbDpodG1sIGxvY2FsZT0idHJ1ZSI+CisKKzwlQCBpbmNsdWRlIGZpbGU9Ii4uL3VzZXJzL2hlYWRlci5qc3AiICU+CisKKzwhLS0gQm9keSAtLT4KKzxib2R5IGJnY29sb3I9IndoaXRlIiBiYWNrZ3JvdW5kPSIuLi9pbWFnZXMvUGFwZXJUZXh0dXJlLmdpZiI+CisKKzwhLS1Gb3JtIC0tPgorCis8aHRtbDplcnJvcnMvPgorCis8aHRtbDpmb3JtIGFjdGlvbj0iL3Jlc291cmNlcy9saXN0UmVzb3VyY2VMaW5rcyI+CisKKyAgPGJlYW46ZGVmaW5lIGlkPSJyZXNvdXJjZXR5cGVJbmZvIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgbmFtZT0icmVzb3VyY2VMaW5rc0Zvcm0iIHByb3BlcnR5PSJyZXNvdXJjZXR5cGUiLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJyZXNvdXJjZXR5cGUiLz4KKworICA8YmVhbjpkZWZpbmUgaWQ9InBhdGhJbmZvIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgbmFtZT0icmVzb3VyY2VMaW5rc0Zvcm0iIHByb3BlcnR5PSJwYXRoIi8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0icGF0aCIvPgorCisgIDxiZWFuOmRlZmluZSBpZD0iaG9zdEluZm8iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICBuYW1lPSJyZXNvdXJjZUxpbmtzRm9ybSIgcHJvcGVydHk9Imhvc3QiLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJob3N0Ii8+CisKKyAgPGJlYW46ZGVmaW5lIGlkPSJkb21haW5JbmZvIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgbmFtZT0icmVzb3VyY2VMaW5rc0Zvcm0iIHByb3BlcnR5PSJkb21haW4iLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJkb21haW4iLz4KKworICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KKyAgICA8dHIgYmdjb2xvcj0iNzE3MUE1Ij4KKyAgICAgIDx0ZCB3aWR0aD0iODElIj4KKyAgICAgICAgPGRpdiBjbGFzcz0icGFnZS10aXRsZS10ZXh0IiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InJlc291cmNlcy5hY3Rpb25zLnJlc291cmNlbGsuZGVsZXRlIi8+CisgICAgICAgIDwvZGl2PgorICAgICAgPC90ZD4KKyAgICAgIDx0ZCB3aWR0aD0iMTklIj4KKyAgICAgICAgPGRpdiBhbGlnbj0icmlnaHQiPgorICAgICAgICAgIDwlQCBpbmNsdWRlIGZpbGU9Imxpc3RSZXNvdXJjZUxpbmtzLmpzcGYiICU+CisgICAgICAgIDwvZGl2PgorICAgICAgPC90ZD4KKyAgICA8L3RyPgorICA8L3RhYmxlPgorCis8L2h0bWw6Zm9ybT4KKworPGJyPgorPGJlYW46ZGVmaW5lIGlkPSJjaGVja2JveGVzIiBzY29wZT0icGFnZSIgdmFsdWU9InRydWUiLz4KKzxodG1sOmZvcm0gYWN0aW9uPSIvcmVzb3VyY2VzL2RlbGV0ZVJlc291cmNlTGlua3MiPgorCisgIDxiZWFuOmRlZmluZSBpZD0icmVzb3VyY2V0eXBlSW5mbyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIG5hbWU9InJlc291cmNlTGlua3NGb3JtIiBwcm9wZXJ0eT0icmVzb3VyY2V0eXBlIi8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0icmVzb3VyY2V0eXBlIi8+CisKKyAgPGJlYW46ZGVmaW5lIGlkPSJwYXRoSW5mbyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIG5hbWU9InJlc291cmNlTGlua3NGb3JtIiBwcm9wZXJ0eT0icGF0aCIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9InBhdGgiLz4KKworICA8YmVhbjpkZWZpbmUgaWQ9Imhvc3RJbmZvIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgbmFtZT0icmVzb3VyY2VMaW5rc0Zvcm0iIHByb3BlcnR5PSJob3N0Ii8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0iaG9zdCIvPgorCisgIDxiZWFuOmRlZmluZSBpZD0iZG9tYWluSW5mbyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIG5hbWU9InJlc291cmNlTGlua3NGb3JtIiBwcm9wZXJ0eT0iZG9tYWluIi8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0iZG9tYWluIi8+CisKKyAgPCVAIGluY2x1ZGUgZmlsZT0iLi4vYnV0dG9ucy5qc3AiICU+CisgIDxicj4KKyAgPCVAIGluY2x1ZGUgZmlsZT0icmVzb3VyY2VMaW5rcy5qc3BmIiAlPgorICA8JUAgaW5jbHVkZSBmaWxlPSIuLi9idXR0b25zLmpzcCIgJT4KKzwvaHRtbDpmb3JtPgorPGJyPgorCis8JUAgaW5jbHVkZSBmaWxlPSIuLi91c2Vycy9mb290ZXIuanNwIiAlPgorCis8L2JvZHk+Cis8L2h0bWw6aHRtbD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3Jlc291cmNlcy9kZWxldGVVc2VyRGF0YWJhc2VzLmpzcCBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3Jlc291cmNlcy9kZWxldGVVc2VyRGF0YWJhc2VzLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzAxOTcxCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vcmVzb3VyY2VzL2RlbGV0ZVVzZXJEYXRhYmFzZXMuanNwCkBAIC0wLDAgKzEsNjIgQEAKKzwhLS0gU3RhbmRhcmQgU3RydXRzIEVudHJpZXMgLS0+Cis8JUAgcGFnZSBsYW5ndWFnZT0iamF2YSIgaW1wb3J0PSJqYXZhLm5ldC5VUkxFbmNvZGVyIiBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgiICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvc3RydXRzLWJlYW4udGxkIiBwcmVmaXg9ImJlYW4iICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvc3RydXRzLWh0bWwudGxkIiBwcmVmaXg9Imh0bWwiICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvc3RydXRzLWxvZ2ljLnRsZCIgcHJlZml4PSJsb2dpYyIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9jb250cm9scy50bGQiIHByZWZpeD0iY29udHJvbHMiICU+CisKKzxodG1sOmh0bWwgbG9jYWxlPSJ0cnVlIj4KKworPCVAIGluY2x1ZGUgZmlsZT0iLi4vdXNlcnMvaGVhZGVyLmpzcCIgJT4KKworPCEtLSBCb2R5IC0tPgorPGJvZHkgYmdjb2xvcj0id2hpdGUiIGJhY2tncm91bmQ9Ii4uL2ltYWdlcy9QYXBlclRleHR1cmUuZ2lmIj4KKworPCEtLUZvcm0gLS0+CisKKzxodG1sOmVycm9ycy8+CisKKzxodG1sOmZvcm0gYWN0aW9uPSIvcmVzb3VyY2VzL2xpc3RVc2VyRGF0YWJhc2VzIj4KKworICA8YmVhbjpkZWZpbmUgaWQ9ImRvbWFpbkluZm8iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICBuYW1lPSJ1c2VyRGF0YWJhc2VzRm9ybSIgcHJvcGVydHk9ImRvbWFpbiIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9ImRvbWFpbiIvPgorCisgIDx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgorICAgIDx0ciBiZ2NvbG9yPSI3MTcxQTUiPgorICAgICAgPHRkIHdpZHRoPSI4MSUiPgorICAgICAgICA8ZGl2IGNsYXNzPSJwYWdlLXRpdGxlLXRleHQiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0icmVzb3VyY2VzLmFjdGlvbnMudXNlcmRiLmRlbGV0ZSIvPgorICAgICAgICA8L2Rpdj4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQgd2lkdGg9IjE5JSI+CisgICAgICAgIDxkaXYgYWxpZ249InJpZ2h0Ij4KKyAgICAgICAgICA8JUAgaW5jbHVkZSBmaWxlPSJsaXN0VXNlckRhdGFiYXNlcy5qc3BmIiAlPgorICAgICAgICA8L2Rpdj4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgPC90YWJsZT4KKworPC9odG1sOmZvcm0+CisKKzxicj4KKworPGJlYW46ZGVmaW5lIGlkPSJjaGVja2JveGVzIiBzY29wZT0icGFnZSIgdmFsdWU9InRydWUiLz4KKworPGh0bWw6Zm9ybSBhY3Rpb249Ii9yZXNvdXJjZXMvZGVsZXRlVXNlckRhdGFiYXNlcyI+CisKKyAgPGJlYW46ZGVmaW5lIGlkPSJkb21haW5JbmZvIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgbmFtZT0idXNlckRhdGFiYXNlc0Zvcm0iIHByb3BlcnR5PSJkb21haW4iLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJkb21haW4iLz4KKworICA8JUAgaW5jbHVkZSBmaWxlPSIuLi9idXR0b25zLmpzcCIgJT4KKyAgPGJyPgorICA8JUAgaW5jbHVkZSBmaWxlPSJ1c2VyRGF0YWJhc2VzLmpzcGYiICU+CisgIDwlQCBpbmNsdWRlIGZpbGU9Ii4uL2J1dHRvbnMuanNwIiAlPgorPC9odG1sOmZvcm0+Cis8YnI+CisKKzwlQCBpbmNsdWRlIGZpbGU9Ii4uL3VzZXJzL2Zvb3Rlci5qc3AiICU+CisKKzwvYm9keT4KKzwvaHRtbDpodG1sPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vcmVzb3VyY2VzL2VudkVudHJpZXMuanNwZiBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3Jlc291cmNlcy9lbnZFbnRyaWVzLmpzcGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY2MDZlMAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3Jlc291cmNlcy9lbnZFbnRyaWVzLmpzcGYKQEAgLTAsMCArMSw1NiBAQAorPCUtLSBFbnYgRW50cmllcyBMaXN0IC0tJT4KKworPHRhYmxlIGNsYXNzPSJiYWNrLXRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMSIKKyAgICAgICB3aWR0aD0iMTAwJSI+PHRyPjx0ZD4gCisKKyAgPHRhYmxlIGNsYXNzPSJmcm9udC10YWJsZSIgYm9yZGVyPSIxIgorICAgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CisgICAgPHRyIGNsYXNzPSJoZWFkZXItcm93Ij4KKyAgICAgIDxsb2dpYzpwcmVzZW50IG5hbWU9ImNoZWNrYm94ZXMiPgorICAgICAgICA8dGQgd2lkdGg9IjUlIj48ZGl2IGFsaWduPSJsZWZ0IiBjbGFzcz0idGFibGUtaGVhZGVyLXRleHQiPgorICAgICAgICAgICZuYnNwOworICAgICAgICA8L3RkPgorICAgICAgPC9sb2dpYzpwcmVzZW50PgorICAgICAgPHRoIHNjb3BlPSJjb2wiIHdpZHRoPSIyMCUiPjxkaXYgYWxpZ249ImxlZnQiIGNsYXNzPSJ0YWJsZS1oZWFkZXItdGV4dCI+CisgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJyZXNvdXJjZXMuZW52LmVudHJ5Ii8+CisgICAgICA8L2Rpdj48L3RoPgorICAgICAgPHRoIHNjb3BlPSJjb2wiPjxkaXYgYWxpZ249ImxlZnQiIGNsYXNzPSJ0YWJsZS1oZWFkZXItdGV4dCI+CisgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJzZXJ2aWNlLnZhbHVlIi8+CisgICAgICA8L2Rpdj48L3RoPgorICAgICAgPHRoIHNjb3A9ImNvbCI+PGRpdiBhbGlnbj0ibGVmdCIgY2xhc3M9InRhYmxlLWhlYWRlci10ZXh0Ij4KKyAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InVzZXJzLmxpc3QuZGVzY3JpcHRpb24iLz4KKyAgICAgIDwvZGl2PjwvdGg+CisgICAgPC90cj4KKworICAgIDxsb2dpYzppdGVyYXRlIG5hbWU9ImVudkVudHJpZXNGb3JtIiBwcm9wZXJ0eT0iZW52RW50cmllcyIKKyAgICAgICAgICAgICAgICAgICAgIGlkPSJlbnZFbnRyeSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CisgICAgICA8dHIgY2xhc3M9ImxpbmUtcm93Ij4KKyAgICAgICAgPGxvZ2ljOnByZXNlbnQgbmFtZT0iY2hlY2tib3hlcyI+CisgICAgICAgICAgPHRkIHNjb3BlPSJyb3ciPjxkaXYgYWxpZ249ImNlbnRlciIgY2xhc3M9InRhYmxlLW5vcm1hbC10ZXh0Ij4KKyAgICAgICAgICAgIDxsYWJlbCBmb3I9ImVudkVudHJpZXMiPjwvbGFiZWw+CisgICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9ImVudkVudHJpZXMiCisgICAgICAgICAgICAgICAgICB2YWx1ZT0iPCU9IGVudkVudHJ5ICU+IiBzdHlsZUlkPSJlbnZFbnRyaWVzIj4KKyAgICAgICAgICA8L3RkPgorICAgICAgICA8L2xvZ2ljOnByZXNlbnQ+CisgICAgICAgIDx0ZD48ZGl2IGFsaWduPSJsZWZ0IiBjbGFzcz0idGFibGUtbm9ybWFsLXRleHQiPgorICAgICAgICAgIDxodG1sOmxpbmsgcGFnZT0nPCU9ICIvcmVzb3VyY2VzL3NldFVwRW52RW50cnkuZG8/b2JqZWN0TmFtZT0iICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUoZW52RW50cnkpICsgIiZyZXNvdXJjZXR5cGU9IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUocmVzb3VyY2V0eXBlSW5mbykgKyAiJnBhdGg9IisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShwYXRoSW5mbykgKyAiJmhvc3Q9IisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShob3N0SW5mbykgKyAiJmRvbWFpbj0iKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKGRvbWFpbkluZm8pICU+Jz4KKyAgICAgICAgICAgIDxjb250cm9sczphdHRyaWJ1dGUgbmFtZT0iZW52RW50cnkiIGF0dHJpYnV0ZT0ibmFtZSIvPgorICAgICAgICAgIDwvaHRtbDpsaW5rPgorICAgICAgICA8L2Rpdj48L3RkPgorICAgICAgICA8dGQ+PGRpdiBhbGlnbj0ibGVmdCIgY2xhc3M9InRhYmxlLW5vcm1hbC10ZXh0Ij4mbmJzcDsKKyAgICAgICAgICA8Y29udHJvbHM6YXR0cmlidXRlIG5hbWU9ImVudkVudHJ5IiBhdHRyaWJ1dGU9InZhbHVlIi8+CisgICAgICAgIDwvZGl2PjwvdGQ+CisgICAgICAgIDx0ZD48ZGl2IGFsaWduPSJsZWZ0IiBjbGFzcz0idGFibGUtbm9ybWFsLXRleHQiPiZuYnNwOworICAgICAgICAgIDxjb250cm9sczphdHRyaWJ1dGUgbmFtZT0iZW52RW50cnkiIGF0dHJpYnV0ZT0iZGVzY3JpcHRpb24iLz4KKyAgICAgICAgPC9kaXY+PC90ZD4KKyAgICAgIDwvdHI+CisgICAgPC9sb2dpYzppdGVyYXRlPgorCisgIDwvdGFibGU+CisKKzwvdGQ+PC90cj48L3RhYmxlPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vcmVzb3VyY2VzL2VudkVudHJ5LmpzcCBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3Jlc291cmNlcy9lbnZFbnRyeS5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk4ZTAxYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3Jlc291cmNlcy9lbnZFbnRyeS5qc3AKQEAgLTAsMCArMSwxNzYgQEAKKzwhLS0gU3RhbmRhcmQgU3RydXRzIEVudHJpZXMgLS0+CisKKzwlQCBwYWdlIGxhbmd1YWdlPSJqYXZhIiBpbXBvcnQ9ImphdmEubmV0LlVSTEVuY29kZXIiIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9zdHJ1dHMtYmVhbi50bGQiIHByZWZpeD0iYmVhbiIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9zdHJ1dHMtaHRtbC50bGQiIHByZWZpeD0iaHRtbCIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9zdHJ1dHMtbG9naWMudGxkIiBwcmVmaXg9ImxvZ2ljIiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL2NvbnRyb2xzLnRsZCIgcHJlZml4PSJjb250cm9scyIgJT4KKworPGh0bWw6aHRtbCBsb2NhbGU9InRydWUiPgorCis8JUAgaW5jbHVkZSBmaWxlPSIuLi91c2Vycy9oZWFkZXIuanNwIiAlPgorCis8IS0tIEJvZHkgLS0+Cis8Ym9keSBiZ2NvbG9yPSJ3aGl0ZSIgYmFja2dyb3VuZD0iLi4vaW1hZ2VzL1BhcGVyVGV4dHVyZS5naWYiPgorCis8IS0tRm9ybSAtLT4KKworPGh0bWw6ZXJyb3JzLz4KKworPGh0bWw6Zm9ybSBtZXRob2Q9IlBPU1QiIGFjdGlvbj0iL3Jlc291cmNlcy9zYXZlRW52RW50cnkiPgorCisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0ib2JqZWN0TmFtZSIvPgorCisgIDxiZWFuOmRlZmluZSBpZD0icmVzb3VyY2V0eXBlSW5mbyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIG5hbWU9ImVudkVudHJ5Rm9ybSIgcHJvcGVydHk9InJlc291cmNldHlwZSIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9InJlc291cmNldHlwZSIvPgorCisgIDxiZWFuOmRlZmluZSBpZD0icGF0aEluZm8iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICBuYW1lPSJlbnZFbnRyeUZvcm0iIHByb3BlcnR5PSJwYXRoIi8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0icGF0aCIvPgorCisgIDxiZWFuOmRlZmluZSBpZD0iaG9zdEluZm8iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICBuYW1lPSJlbnZFbnRyeUZvcm0iIHByb3BlcnR5PSJob3N0Ii8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0iaG9zdCIvPgorCisgIDxiZWFuOmRlZmluZSBpZD0iZG9tYWluSW5mbyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIG5hbWU9ImVudkVudHJ5Rm9ybSIgcHJvcGVydHk9ImRvbWFpbiIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9ImRvbWFpbiIvPgorCisgIDx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgorICAgIDx0ciBjbGFzcz0icGFnZS10aXRsZS1yb3ciPgorICAgICAgPHRkIGFsaWduPSJsZWZ0IiBub3dyYXA+CisgICAgICAgIDxkaXYgY2xhc3M9InBhZ2UtdGl0bGUtdGV4dCI+CisgICAgICAgICAgPGJlYW46d3JpdGUgbmFtZT0iZW52RW50cnlGb3JtIiBwcm9wZXJ0eT0ibm9kZUxhYmVsIi8+CisgICAgICAgIDwvZGl2PgorICAgICAgPC90ZD4KKyAgICAgIDx0ZCBhbGlnbj0icmlnaHQiIG5vd3JhcD4KKyAgICAgICAgPGRpdiBjbGFzcz0icGFnZS10aXRsZS10ZXh0Ij4KKyAgICAgICAgICA8Y29udHJvbHM6YWN0aW9ucyBsYWJlbD0iRW52aXJvbm1lbnQgRW50cnkgQWN0aW9ucyI+CisgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9uIHNlbGVjdGVkPSJ0cnVlIj4KKyAgICAgICAgICAgICAgLS0tLTxiZWFuOm1lc3NhZ2Uga2V5PSJhY3Rpb25zLmF2YWlsYWJsZS5hY3Rpb25zIi8+LS0tLQorICAgICAgICAgICAgPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgIDwvY29udHJvbHM6YWN0aW9uPgorCisgICAgICAgIDxjb250cm9sczphY3Rpb24gdXJsPSc8JT0gIi9yZXNvdXJjZXMvc2V0VXBFbnZFbnRyeS5kbz9yZXNvdXJjZXR5cGU9IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUocmVzb3VyY2V0eXBlSW5mbykgKyAiJnBhdGg9IisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShwYXRoSW5mbykgKyAiJmhvc3Q9IisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShob3N0SW5mbykgKyAiJmRvbWFpbj0iKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKGRvbWFpbkluZm8pICU+Jz4KKyAgICAgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0icmVzb3VyY2VzLmFjdGlvbnMuZW52LmNyZWF0ZSIvPgorICAgICAgICAgICAgPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9uIHVybD0nPCU9ICIvcmVzb3VyY2VzL2xpc3RFbnZFbnRyaWVzLmRvP3Jlc291cmNldHlwZT0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShyZXNvdXJjZXR5cGVJbmZvKSArICImcGF0aD0iKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHBhdGhJbmZvKSArICImaG9zdD0iKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKGhvc3RJbmZvKSArICImZG9tYWluPSIrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUoZG9tYWluSW5mbykgKyAiJmZvcndhcmQ9IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUoIkVudkVudHJpZXMgRGVsZXRlIExpc3QiKSAlPic+CisgICAgICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InJlc291cmNlcy5hY3Rpb25zLmVudi5kZWxldGUiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgPC9jb250cm9sczphY3Rpb25zPgorICAgICAgICA8L2Rpdj4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgPC90YWJsZT4KKworICA8JUAgaW5jbHVkZSBmaWxlPSIuLi9idXR0b25zLmpzcCIgJT4KKzxicj4KKworICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KKyAgICA8dHI+PHRkPjxkaXYgY2xhc3M9InRhYmxlLXRpdGxlLXRleHQiPgorICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InJlc291cmNlcy5lbnYucHJvcHMiLz4KKyAgICA8L2Rpdj48L3RkPjwvdHI+CisgIDwvdGFibGU+CisKKyAgPHRhYmxlIGNsYXNzPSJiYWNrLXRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMSIgd2lkdGg9IjEwMCUiPgorICAgIDx0cj4KKyAgICAgIDx0ZD4KKworICAgICAgICA8Y29udHJvbHM6dGFibGUgdGFibGVTdHlsZT0iZnJvbnQtdGFibGUiIGxpbmVTdHlsZT0ibGluZS1yb3ciPgorICAgICAgICAgIDxjb250cm9sczpyb3cgaGVhZGVyPSJ0cnVlIgorICAgICAgICAgICAgICAgIGxhYmVsU3R5bGU9InRhYmxlLWhlYWRlci10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLWhlYWRlci10ZXh0Ij4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0ic2VydmljZS5wcm9wZXJ0eSIvPjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT48YmVhbjptZXNzYWdlIGtleT0ic2VydmljZS52YWx1ZSIvPjwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJuYW1lIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InNlcnZpY2UubmFtZSIvPjoKKyAgICAgICAgICAgIDwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgPGxvZ2ljOnByZXNlbnQgbmFtZT0iZW52RW50cnlGb3JtIiBwcm9wZXJ0eT0ib2JqZWN0TmFtZSI+CisgICAgICAgICAgICAgICAgPGJlYW46d3JpdGUgbmFtZT0iZW52RW50cnlGb3JtIiBwcm9wZXJ0eT0ibmFtZSIvPgorICAgICAgICAgICAgICAgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0ibmFtZSIvPgorICAgICAgICAgICAgICA8L2xvZ2ljOnByZXNlbnQ+CisgICAgICAgICAgICAgIDxsb2dpYzpub3RQcmVzZW50IG5hbWU9ImVudkVudHJ5Rm9ybSIgcHJvcGVydHk9Im9iamVjdE5hbWUiPgorICAgICAgICAgICAgICAgIDxodG1sOnRleHQgcHJvcGVydHk9Im5hbWUiIHNpemU9IjI0IiBtYXhsZW5ndGg9IjMyIiBzdHlsZUlkPSJuYW1lIi8+CisgICAgICAgICAgICAgIDwvbG9naWM6bm90UHJlc2VudD4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJ0eXBlIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9ImNvbm5lY3Rvci50eXBlIi8+OgorICAgICAgICAgICAgPC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICA8aHRtbDpzZWxlY3QgcHJvcGVydHk9ImVudHJ5VHlwZSIgc3R5bGVJZD0idHlwZSI+CisgICAgICAgICAgICAgICAgICAgICA8YmVhbjpkZWZpbmUgaWQ9InR5cGVWYWxzIiBuYW1lPSJlbnZFbnRyeUZvcm0iIHByb3BlcnR5PSJ0eXBlVmFscyIvPgorICAgICAgICAgICAgICAgICAgICAgPGh0bWw6b3B0aW9ucyBjb2xsZWN0aW9uPSJ0eXBlVmFscyIgcHJvcGVydHk9InZhbHVlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbFByb3BlcnR5PSJsYWJlbCIvPgorICAgICAgICAgICAgICAgIDwvaHRtbDpzZWxlY3Q+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiCisgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0idmFsdWUiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0ic2VydmljZS52YWx1ZSIvPjoKKyAgICAgICAgICAgIDwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgPGh0bWw6dGV4dCBwcm9wZXJ0eT0idmFsdWUiIHNpemU9IjI0IiBtYXhsZW5ndGg9IjY0IiBzdHlsZUlkPSJ2YWx1ZSIvPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IgorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9Im92ZXJyaWRlIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InJlc291cmNlcy5lbnYub3ZlcnJpZGUiLz46CisgICAgICAgICAgICA8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgIDxodG1sOmNoZWNrYm94IHByb3BlcnR5PSJvdmVycmlkZSIgdmFsdWU9Im92ZXJyaWRlIiBzdHlsZUlkPSJvdmVycmlkZSIvPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IgorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9ImRlc2NyaXB0aW9uIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InVzZXJzLnByb21wdC5kZXNjcmlwdGlvbiIvPgorICAgICAgICAgICAgPC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICA8aHRtbDp0ZXh0IHByb3BlcnR5PSJkZXNjcmlwdGlvbiIgc2l6ZT0iMzAiIG1heGxlbmd0aD0iNjQiIHN0eWxlSWQ9ImRlc2NyaXB0aW9uIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgICAgPC9jb250cm9sczp0YWJsZT4KKworICAgICAgPC90ZD4KKworICAgIDwvdHI+CisKKyAgPC90YWJsZT4KKworICA8JUAgaW5jbHVkZSBmaWxlPSIuLi9idXR0b25zLmpzcCIgJT4KKworPC9odG1sOmZvcm0+CisKKzwhLS0gU3RhbmRhcmQgRm9vdGVyIC0tPgorCis8JUAgaW5jbHVkZSBmaWxlPSIuLi91c2Vycy9mb290ZXIuanNwIiAlPgorCis8L2JvZHk+CisKKzwvaHRtbDpodG1sPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vcmVzb3VyY2VzL2xpc3REYXRhU291cmNlcy5qc3AgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9yZXNvdXJjZXMvbGlzdERhdGFTb3VyY2VzLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTNiZjUyCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vcmVzb3VyY2VzL2xpc3REYXRhU291cmNlcy5qc3AKQEAgLTAsMCArMSw2MCBAQAorPCEtLSBTdGFuZGFyZCBTdHJ1dHMgRW50cmllcyAtLT4KKzwlQCBwYWdlIGxhbmd1YWdlPSJqYXZhIiBpbXBvcnQ9ImphdmEubmV0LlVSTEVuY29kZXIiIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9zdHJ1dHMtYmVhbi50bGQiIHByZWZpeD0iYmVhbiIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9zdHJ1dHMtaHRtbC50bGQiIHByZWZpeD0iaHRtbCIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9zdHJ1dHMtbG9naWMudGxkIiBwcmVmaXg9ImxvZ2ljIiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL2NvbnRyb2xzLnRsZCIgcHJlZml4PSJjb250cm9scyIgJT4KKworPGh0bWw6aHRtbCBsb2NhbGU9InRydWUiPgorCis8JUAgaW5jbHVkZSBmaWxlPSIuLi91c2Vycy9oZWFkZXIuanNwIiAlPgorCis8IS0tIEJvZHkgLS0+Cis8Ym9keSBiZ2NvbG9yPSJ3aGl0ZSIgYmFja2dyb3VuZD0iLi4vaW1hZ2VzL1BhcGVyVGV4dHVyZS5naWYiPgorCis8IS0tRm9ybSAtLT4KKworPGh0bWw6ZXJyb3JzLz4KKworPGh0bWw6Zm9ybSBhY3Rpb249Ii9yZXNvdXJjZXMvbGlzdERhdGFTb3VyY2VzIj4KKworICA8YmVhbjpkZWZpbmUgaWQ9InJlc291cmNldHlwZUluZm8iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICBuYW1lPSJkYXRhU291cmNlc0Zvcm0iIHByb3BlcnR5PSJyZXNvdXJjZXR5cGUiLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJyZXNvdXJjZXR5cGUiLz4KKworICA8YmVhbjpkZWZpbmUgaWQ9InBhdGhJbmZvIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgbmFtZT0iZGF0YVNvdXJjZXNGb3JtIiBwcm9wZXJ0eT0icGF0aCIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9InBhdGgiLz4KKworICA8YmVhbjpkZWZpbmUgaWQ9Imhvc3RJbmZvIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgbmFtZT0iZGF0YVNvdXJjZXNGb3JtIiBwcm9wZXJ0eT0iaG9zdCIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9Imhvc3QiLz4KKworICA8YmVhbjpkZWZpbmUgaWQ9ImRvbWFpbkluZm8iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICBuYW1lPSJkYXRhU291cmNlc0Zvcm0iIHByb3BlcnR5PSJkb21haW4iLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJkb21haW4iLz4KKworICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KKyAgICA8dHIgYmdjb2xvcj0iNzE3MUE1Ij4KKyAgICAgIDx0ZCB3aWR0aD0iODElIj4KKyAgICAgICAgPGRpdiBjbGFzcz0icGFnZS10aXRsZS10ZXh0IiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InJlc291cmNlcy5hY3Rpb25zLmRhdGFzcmMiLz4KKyAgICAgICAgPC9kaXY+CisgICAgICA8L3RkPgorICAgICAgPHRkIHdpZHRoPSIxOSUiPgorICAgICAgICA8ZGl2IGFsaWduPSJyaWdodCI+CisgICAgICAgICAgPCVAIGluY2x1ZGUgZmlsZT0ibGlzdERhdGFTb3VyY2VzLmpzcGYiICU+CisgICAgICAgIDwvZGl2PgorICAgICAgPC90ZD4KKyAgICA8L3RyPgorICA8L3RhYmxlPgorCis8YnI+CisKKzwlQCBpbmNsdWRlIGZpbGU9ImRhdGFTb3VyY2VzLmpzcGYiICU+CisKKzxicj4KKzwvaHRtbDpmb3JtPgorCis8L2JvZHk+Cis8L2h0bWw6aHRtbD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3Jlc291cmNlcy9saXN0RGF0YVNvdXJjZXMuanNwZiBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3Jlc291cmNlcy9saXN0RGF0YVNvdXJjZXMuanNwZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzU4NGU3Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vcmVzb3VyY2VzL2xpc3REYXRhU291cmNlcy5qc3BmCkBAIC0wLDAgKzEsMzIgQEAKKzx0ZCBhbGlnbj0icmlnaHQiIG5vd3JhcD4KKzxkaXYgY2xhc3M9InBhZ2UtdGl0bGUtdGV4dCI+Cis8Y29udHJvbHM6YWN0aW9ucyBsYWJlbD0iRGF0YSBTb3VyY2UgQWN0aW9ucyI+CisKKyAgPGNvbnRyb2xzOmFjdGlvbiBzZWxlY3RlZD0idHJ1ZSI+CisgICAgLS0tLTxiZWFuOm1lc3NhZ2Uga2V5PSJhY3Rpb25zLmF2YWlsYWJsZS5hY3Rpb25zIi8+LS0tLQorICA8L2NvbnRyb2xzOmFjdGlvbj4KKworICA8Y29udHJvbHM6YWN0aW9uIGRpc2FibGVkPSJ0cnVlIj4KKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgPC9jb250cm9sczphY3Rpb24+CisKKyAgPGNvbnRyb2xzOmFjdGlvbiB1cmw9JzwlPSAiL3Jlc291cmNlcy9zZXRVcERhdGFTb3VyY2UuZG8/cmVzb3VyY2V0eXBlPSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHJlc291cmNldHlwZUluZm8pICsgIiZwYXRoPSIrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUocGF0aEluZm8pICsgIiZob3N0PSIrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUoaG9zdEluZm8pICsgIiZkb21haW49IisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShkb21haW5JbmZvKSU+Jz4KKyAgICA8YmVhbjptZXNzYWdlIGtleT0icmVzb3VyY2VzLmFjdGlvbnMuZGF0YXNyYy5jcmVhdGUiLz4KKyAgPC9jb250cm9sczphY3Rpb24+CisKKyAgPGNvbnRyb2xzOmFjdGlvbiB1cmw9JzwlPSAiL3Jlc291cmNlcy9saXN0RGF0YVNvdXJjZXMuZG8/cmVzb3VyY2V0eXBlPSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHJlc291cmNldHlwZUluZm8pICsgIiZwYXRoPSIrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUocGF0aEluZm8pICsgIiZob3N0PSIrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUoaG9zdEluZm8pICsgIiZkb21haW49IisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShkb21haW5JbmZvKSArICImZm9yd2FyZD0iICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUoIkRhdGFTb3VyY2VzIERlbGV0ZSBMaXN0IikgJT4nPgorICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJyZXNvdXJjZXMuYWN0aW9ucy5kYXRhc3JjLmRlbGV0ZSIvPgorICA8L2NvbnRyb2xzOmFjdGlvbj4KKworPC9jb250cm9sczphY3Rpb25zPgorPC9kaXY+Cis8L3RkPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vcmVzb3VyY2VzL2xpc3RFbnZFbnRyaWVzLmpzcCBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3Jlc291cmNlcy9saXN0RW52RW50cmllcy5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM5YzU0OQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3Jlc291cmNlcy9saXN0RW52RW50cmllcy5qc3AKQEAgLTAsMCArMSw2MCBAQAorPCEtLSBTdGFuZGFyZCBTdHJ1dHMgRW50cmllcyAtLT4KKzwlQCBwYWdlIGxhbmd1YWdlPSJqYXZhIiBpbXBvcnQ9ImphdmEubmV0LlVSTEVuY29kZXIiIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9zdHJ1dHMtYmVhbi50bGQiIHByZWZpeD0iYmVhbiIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9zdHJ1dHMtaHRtbC50bGQiIHByZWZpeD0iaHRtbCIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9zdHJ1dHMtbG9naWMudGxkIiBwcmVmaXg9ImxvZ2ljIiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL2NvbnRyb2xzLnRsZCIgcHJlZml4PSJjb250cm9scyIgJT4KKworPGh0bWw6aHRtbCBsb2NhbGU9InRydWUiPgorCis8JUAgaW5jbHVkZSBmaWxlPSIuLi91c2Vycy9oZWFkZXIuanNwIiAlPgorCis8IS0tIEJvZHkgLS0+Cis8Ym9keSBiZ2NvbG9yPSJ3aGl0ZSIgYmFja2dyb3VuZD0iLi4vaW1hZ2VzL1BhcGVyVGV4dHVyZS5naWYiPgorCis8IS0tRm9ybSAtLT4KKworPGh0bWw6ZXJyb3JzLz4KKworPGh0bWw6Zm9ybSBhY3Rpb249Ii9yZXNvdXJjZXMvbGlzdEVudkVudHJpZXMiPgorCisgIDxiZWFuOmRlZmluZSBpZD0icmVzb3VyY2V0eXBlSW5mbyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIG5hbWU9ImVudkVudHJpZXNGb3JtIiBwcm9wZXJ0eT0icmVzb3VyY2V0eXBlIi8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0icmVzb3VyY2V0eXBlIi8+CisKKyAgPGJlYW46ZGVmaW5lIGlkPSJwYXRoSW5mbyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIG5hbWU9ImVudkVudHJpZXNGb3JtIiBwcm9wZXJ0eT0icGF0aCIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9InBhdGgiLz4KKworICA8YmVhbjpkZWZpbmUgaWQ9Imhvc3RJbmZvIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgbmFtZT0iZW52RW50cmllc0Zvcm0iIHByb3BlcnR5PSJob3N0Ii8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0iaG9zdCIvPgorCisgIDxiZWFuOmRlZmluZSBpZD0iZG9tYWluSW5mbyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIG5hbWU9ImVudkVudHJpZXNGb3JtIiBwcm9wZXJ0eT0iZG9tYWluIi8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0iZG9tYWluIi8+CisKKyAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CisgICAgPHRyIGJnY29sb3I9IjcxNzFBNSI+CisgICAgICA8dGQgd2lkdGg9IjgxJSI+CisgICAgICAgIDxkaXYgY2xhc3M9InBhZ2UtdGl0bGUtdGV4dCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJyZXNvdXJjZXMuZW52LmVudHJpZXMiLz4KKyAgICAgICAgPC9kaXY+CisgICAgICA8L3RkPgorICAgICAgPHRkIHdpZHRoPSIxOSUiPgorICAgICAgICA8ZGl2IGFsaWduPSJyaWdodCI+CisgICAgICAgICAgPCVAIGluY2x1ZGUgZmlsZT0ibGlzdEVudkVudHJpZXMuanNwZiIgJT4KKyAgICAgICAgPC9kaXY+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgIDwvdGFibGU+CisKKzxicj4KKworPCVAIGluY2x1ZGUgZmlsZT0iZW52RW50cmllcy5qc3BmIiAlPgorCis8YnI+Cis8L2h0bWw6Zm9ybT4KKworPC9ib2R5PgorPC9odG1sOmh0bWw+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9yZXNvdXJjZXMvbGlzdEVudkVudHJpZXMuanNwZiBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3Jlc291cmNlcy9saXN0RW52RW50cmllcy5qc3BmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1NTEyY2EKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9yZXNvdXJjZXMvbGlzdEVudkVudHJpZXMuanNwZgpAQCAtMCwwICsxLDMyIEBACis8dGQgYWxpZ249InJpZ2h0IiBub3dyYXA+Cis8ZGl2IGNsYXNzPSJwYWdlLXRpdGxlLXRleHQiPgorPGNvbnRyb2xzOmFjdGlvbnMgbGFiZWw9IkVudmlyb25tZW50IEVudHJ5IEFjdGlvbnMiPgorCisgIDxjb250cm9sczphY3Rpb24gc2VsZWN0ZWQ9InRydWUiPgorICAgIC0tLS08YmVhbjptZXNzYWdlIGtleT0iYWN0aW9ucy5hdmFpbGFibGUuYWN0aW9ucyIvPi0tLS0KKyAgPC9jb250cm9sczphY3Rpb24+CisKKyAgPGNvbnRyb2xzOmFjdGlvbiBkaXNhYmxlZD0idHJ1ZSI+CisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIDwvY29udHJvbHM6YWN0aW9uPgorCisgIDxjb250cm9sczphY3Rpb24gdXJsPSc8JT0gIi9yZXNvdXJjZXMvc2V0VXBFbnZFbnRyeS5kbz9yZXNvdXJjZXR5cGU9IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUocmVzb3VyY2V0eXBlSW5mbykgKyAiJnBhdGg9IisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShwYXRoSW5mbykgKyAiJmhvc3Q9IisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShob3N0SW5mbykgKyAiJmRvbWFpbj0iKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKGRvbWFpbkluZm8pICU+Jz4KKyAgICA8YmVhbjptZXNzYWdlIGtleT0icmVzb3VyY2VzLmFjdGlvbnMuZW52LmNyZWF0ZSIvPgorICA8L2NvbnRyb2xzOmFjdGlvbj4KKworICA8Y29udHJvbHM6YWN0aW9uIHVybD0nPCU9ICIvcmVzb3VyY2VzL2xpc3RFbnZFbnRyaWVzLmRvP3Jlc291cmNldHlwZT0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShyZXNvdXJjZXR5cGVJbmZvKSArICImcGF0aD0iKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHBhdGhJbmZvKSArICImaG9zdD0iKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKGhvc3RJbmZvKSArICImZG9tYWluPSIrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUoZG9tYWluSW5mbykgKyAiJmZvcndhcmQ9IisgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUoIkVudkVudHJpZXMgRGVsZXRlIExpc3QiKSAlPic+CisgICAgPGJlYW46bWVzc2FnZSBrZXk9InJlc291cmNlcy5hY3Rpb25zLmVudi5kZWxldGUiLz4KKyAgPC9jb250cm9sczphY3Rpb24+CisKKzwvY29udHJvbHM6YWN0aW9ucz4KKzwvZGl2PgorPC90ZD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3Jlc291cmNlcy9saXN0TWFpbFNlc3Npb25zLmpzcCBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3Jlc291cmNlcy9saXN0TWFpbFNlc3Npb25zLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWQyODA3Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vcmVzb3VyY2VzL2xpc3RNYWlsU2Vzc2lvbnMuanNwCkBAIC0wLDAgKzEsNjAgQEAKKzwhLS0gU3RhbmRhcmQgU3RydXRzIEVudHJpZXMgLS0+Cis8JUAgcGFnZSBsYW5ndWFnZT0iamF2YSIgaW1wb3J0PSJqYXZhLm5ldC5VUkxFbmNvZGVyIiBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgiICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvc3RydXRzLWJlYW4udGxkIiBwcmVmaXg9ImJlYW4iICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvc3RydXRzLWh0bWwudGxkIiBwcmVmaXg9Imh0bWwiICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvc3RydXRzLWxvZ2ljLnRsZCIgcHJlZml4PSJsb2dpYyIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9jb250cm9scy50bGQiIHByZWZpeD0iY29udHJvbHMiICU+CisKKzxodG1sOmh0bWwgbG9jYWxlPSJ0cnVlIj4KKworPCVAIGluY2x1ZGUgZmlsZT0iLi4vdXNlcnMvaGVhZGVyLmpzcCIgJT4KKworPCEtLSBCb2R5IC0tPgorPGJvZHkgYmdjb2xvcj0id2hpdGUiIGJhY2tncm91bmQ9Ii4uL2ltYWdlcy9QYXBlclRleHR1cmUuZ2lmIj4KKworPCEtLUZvcm0gLS0+CisKKzxodG1sOmVycm9ycy8+CisKKzxodG1sOmZvcm0gYWN0aW9uPSIvcmVzb3VyY2VzL2xpc3RNYWlsU2Vzc2lvbnMiPgorCisgIDxiZWFuOmRlZmluZSBpZD0icmVzb3VyY2V0eXBlSW5mbyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIG5hbWU9Im1haWxTZXNzaW9uc0Zvcm0iIHByb3BlcnR5PSJyZXNvdXJjZXR5cGUiLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJyZXNvdXJjZXR5cGUiLz4KKworICA8YmVhbjpkZWZpbmUgaWQ9InBhdGhJbmZvIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgbmFtZT0ibWFpbFNlc3Npb25zRm9ybSIgcHJvcGVydHk9InBhdGgiLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJwYXRoIi8+CisKKyAgPGJlYW46ZGVmaW5lIGlkPSJob3N0SW5mbyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIG5hbWU9Im1haWxTZXNzaW9uc0Zvcm0iIHByb3BlcnR5PSJob3N0Ii8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0iaG9zdCIvPgorCisgIDxiZWFuOmRlZmluZSBpZD0iZG9tYWluSW5mbyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIG5hbWU9Im1haWxTZXNzaW9uc0Zvcm0iIHByb3BlcnR5PSJkb21haW4iLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJkb21haW4iLz4KKworICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KKyAgICA8dHIgYmdjb2xvcj0iNzE3MUE1Ij4KKyAgICAgIDx0ZCB3aWR0aD0iODElIj4KKyAgICAgICAgPGRpdiBjbGFzcz0icGFnZS10aXRsZS10ZXh0IiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InJlc291cmNlcy5hY3Rpb25zLm1haWxzZXNzaW9uIi8+CisgICAgICAgIDwvZGl2PgorICAgICAgPC90ZD4KKyAgICAgIDx0ZCB3aWR0aD0iMTklIj4KKyAgICAgICAgPGRpdiBhbGlnbj0icmlnaHQiPgorICAgICAgICAgIDwlQCBpbmNsdWRlIGZpbGU9Imxpc3RNYWlsU2Vzc2lvbnMuanNwZiIgJT4KKyAgICAgICAgPC9kaXY+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgIDwvdGFibGU+CisKKzxicj4KKworPCVAIGluY2x1ZGUgZmlsZT0ibWFpbFNlc3Npb25zLmpzcGYiICU+CisKKzxicj4KKzwvaHRtbDpmb3JtPgorCis8L2JvZHk+Cis8L2h0bWw6aHRtbD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3Jlc291cmNlcy9saXN0TWFpbFNlc3Npb25zLmpzcGYgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9yZXNvdXJjZXMvbGlzdE1haWxTZXNzaW9ucy5qc3BmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyMjdkODMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9yZXNvdXJjZXMvbGlzdE1haWxTZXNzaW9ucy5qc3BmCkBAIC0wLDAgKzEsMzIgQEAKKzx0ZCBhbGlnbj0icmlnaHQiIG5vd3JhcD4KKzxkaXYgY2xhc3M9InBhZ2UtdGl0bGUtdGV4dCI+Cis8Y29udHJvbHM6YWN0aW9ucyBsYWJlbD0iTWFpbCBTZXNzaW9uIEFjdGlvbnMiPgorCisgIDxjb250cm9sczphY3Rpb24gc2VsZWN0ZWQ9InRydWUiPgorICAgIC0tLS08YmVhbjptZXNzYWdlIGtleT0iYWN0aW9ucy5hdmFpbGFibGUuYWN0aW9ucyIvPi0tLS0KKyAgPC9jb250cm9sczphY3Rpb24+CisKKyAgPGNvbnRyb2xzOmFjdGlvbiBkaXNhYmxlZD0idHJ1ZSI+CisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIDwvY29udHJvbHM6YWN0aW9uPgorCisgIDxjb250cm9sczphY3Rpb24gdXJsPSc8JT0gIi9yZXNvdXJjZXMvc2V0VXBNYWlsU2Vzc2lvbi5kbz9yZXNvdXJjZXR5cGU9IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUocmVzb3VyY2V0eXBlSW5mbykgKyAiJnBhdGg9IisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShwYXRoSW5mbykgKyAiJmhvc3Q9IisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShob3N0SW5mbykgKyAiJmRvbWFpbj0iKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKGRvbWFpbkluZm8pICU+Jz4KKyAgICA8YmVhbjptZXNzYWdlIGtleT0icmVzb3VyY2VzLmFjdGlvbnMubWFpbHNlc3Npb24uY3JlYXRlIi8+CisgIDwvY29udHJvbHM6YWN0aW9uPgorCisgIDxjb250cm9sczphY3Rpb24gdXJsPSc8JT0gIi9yZXNvdXJjZXMvbGlzdE1haWxTZXNzaW9ucy5kbz9yZXNvdXJjZXR5cGU9IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUocmVzb3VyY2V0eXBlSW5mbykgKyAiJnBhdGg9IisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShwYXRoSW5mbykgKyAiJmhvc3Q9IisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShob3N0SW5mbykgKyAiJmRvbWFpbj0iKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKGRvbWFpbkluZm8pICsgIiZmb3J3YXJkPSIgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZSgiTWFpbFNlc3Npb25zIERlbGV0ZSBMaXN0IikgJT4nPgorICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJyZXNvdXJjZXMuYWN0aW9ucy5tYWlsc2Vzc2lvbi5kZWxldGUiLz4KKyAgPC9jb250cm9sczphY3Rpb24+CisKKzwvY29udHJvbHM6YWN0aW9ucz4KKzwvZGl2PgorPC90ZD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3Jlc291cmNlcy9saXN0UmVzb3VyY2VMaW5rcy5qc3AgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9yZXNvdXJjZXMvbGlzdFJlc291cmNlTGlua3MuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ZmIzZjcKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9yZXNvdXJjZXMvbGlzdFJlc291cmNlTGlua3MuanNwCkBAIC0wLDAgKzEsNjAgQEAKKzwhLS0gU3RhbmRhcmQgU3RydXRzIEVudHJpZXMgLS0+Cis8JUAgcGFnZSBsYW5ndWFnZT0iamF2YSIgaW1wb3J0PSJqYXZhLm5ldC5VUkxFbmNvZGVyIiBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgiICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvc3RydXRzLWJlYW4udGxkIiBwcmVmaXg9ImJlYW4iICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvc3RydXRzLWh0bWwudGxkIiBwcmVmaXg9Imh0bWwiICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvc3RydXRzLWxvZ2ljLnRsZCIgcHJlZml4PSJsb2dpYyIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9jb250cm9scy50bGQiIHByZWZpeD0iY29udHJvbHMiICU+CisKKzxodG1sOmh0bWwgbG9jYWxlPSJ0cnVlIj4KKworPCVAIGluY2x1ZGUgZmlsZT0iLi4vdXNlcnMvaGVhZGVyLmpzcCIgJT4KKworPCEtLSBCb2R5IC0tPgorPGJvZHkgYmdjb2xvcj0id2hpdGUiIGJhY2tncm91bmQ9Ii4uL2ltYWdlcy9QYXBlclRleHR1cmUuZ2lmIj4KKworPCEtLUZvcm0gLS0+CisKKzxodG1sOmVycm9ycy8+CisKKzxodG1sOmZvcm0gYWN0aW9uPSIvcmVzb3VyY2VzL2xpc3RSZXNvdXJjZUxpbmtzIj4KKworICA8YmVhbjpkZWZpbmUgaWQ9InJlc291cmNldHlwZUluZm8iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICBuYW1lPSJyZXNvdXJjZUxpbmtzRm9ybSIgcHJvcGVydHk9InJlc291cmNldHlwZSIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9InJlc291cmNldHlwZSIvPgorCisgIDxiZWFuOmRlZmluZSBpZD0icGF0aEluZm8iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICBuYW1lPSJyZXNvdXJjZUxpbmtzRm9ybSIgcHJvcGVydHk9InBhdGgiLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJwYXRoIi8+CisKKyAgPGJlYW46ZGVmaW5lIGlkPSJob3N0SW5mbyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIG5hbWU9InJlc291cmNlTGlua3NGb3JtIiBwcm9wZXJ0eT0iaG9zdCIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9Imhvc3QiLz4KKworICA8YmVhbjpkZWZpbmUgaWQ9ImRvbWFpbkluZm8iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICBuYW1lPSJyZXNvdXJjZUxpbmtzRm9ybSIgcHJvcGVydHk9ImRvbWFpbiIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9ImRvbWFpbiIvPgorCisgIDx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgorICAgIDx0ciBiZ2NvbG9yPSI3MTcxQTUiPgorICAgICAgPHRkIHdpZHRoPSI4MSUiPgorICAgICAgICA8ZGl2IGNsYXNzPSJwYWdlLXRpdGxlLXRleHQiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0icmVzb3VyY2VzLmFjdGlvbnMucmVzb3VyY2VsayIvPgorICAgICAgICA8L2Rpdj4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQgd2lkdGg9IjE5JSI+CisgICAgICAgIDxkaXYgYWxpZ249InJpZ2h0Ij4KKyAgICAgICAgICA8JUAgaW5jbHVkZSBmaWxlPSJsaXN0UmVzb3VyY2VMaW5rcy5qc3BmIiAlPgorICAgICAgICA8L2Rpdj4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgPC90YWJsZT4KKworPGJyPgorCis8JUAgaW5jbHVkZSBmaWxlPSJyZXNvdXJjZUxpbmtzLmpzcGYiICU+CisKKzxicj4KKzwvaHRtbDpmb3JtPgorCis8L2JvZHk+Cis8L2h0bWw6aHRtbD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3Jlc291cmNlcy9saXN0UmVzb3VyY2VMaW5rcy5qc3BmIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vcmVzb3VyY2VzL2xpc3RSZXNvdXJjZUxpbmtzLmpzcGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRjY2VmMgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3Jlc291cmNlcy9saXN0UmVzb3VyY2VMaW5rcy5qc3BmCkBAIC0wLDAgKzEsMzIgQEAKKzx0ZCBhbGlnbj0icmlnaHQiIG5vd3JhcD4KKzxkaXYgY2xhc3M9InBhZ2UtdGl0bGUtdGV4dCI+Cis8Y29udHJvbHM6YWN0aW9ucyBsYWJlbD0iUmVzb3VyY2UgTGluayBBY3Rpb25zIj4KKworICA8Y29udHJvbHM6YWN0aW9uIHNlbGVjdGVkPSJ0cnVlIj4KKyAgICAtLS0tPGJlYW46bWVzc2FnZSBrZXk9ImFjdGlvbnMuYXZhaWxhYmxlLmFjdGlvbnMiLz4tLS0tCisgIDwvY29udHJvbHM6YWN0aW9uPgorCisgIDxjb250cm9sczphY3Rpb24gZGlzYWJsZWQ9InRydWUiPgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICA8L2NvbnRyb2xzOmFjdGlvbj4KKworICA8Y29udHJvbHM6YWN0aW9uIHVybD0nPCU9ICIvcmVzb3VyY2VzL3NldFVwUmVzb3VyY2VMaW5rLmRvP3Jlc291cmNldHlwZT0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShyZXNvdXJjZXR5cGVJbmZvKSArICImcGF0aD0iKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHBhdGhJbmZvKSArICImaG9zdD0iKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKGhvc3RJbmZvKSArICImZG9tYWluPSIrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUoZG9tYWluSW5mbykgJT4nPgorICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJyZXNvdXJjZXMuYWN0aW9ucy5yZXNvdXJjZWxrLmNyZWF0ZSIvPgorICA8L2NvbnRyb2xzOmFjdGlvbj4KKworICA8Y29udHJvbHM6YWN0aW9uIHVybD0nPCU9ICIvcmVzb3VyY2VzL2xpc3RSZXNvdXJjZUxpbmtzLmRvP3Jlc291cmNldHlwZT0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShyZXNvdXJjZXR5cGVJbmZvKSArICImcGF0aD0iKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHBhdGhJbmZvKSArICImaG9zdD0iKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKGhvc3RJbmZvKSArICImZG9tYWluPSIrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUoZG9tYWluSW5mbykgKyImZm9yd2FyZD0iICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUoIlJlc291cmNlTGlua3MgRGVsZXRlIExpc3QiKSAlPic+CisgICAgPGJlYW46bWVzc2FnZSBrZXk9InJlc291cmNlcy5hY3Rpb25zLnJlc291cmNlbGsuZGVsZXRlIi8+CisgIDwvY29udHJvbHM6YWN0aW9uPgorCis8L2NvbnRyb2xzOmFjdGlvbnM+Cis8L2Rpdj4KKzwvdGQ+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9yZXNvdXJjZXMvbGlzdFVzZXJEYXRhYmFzZXMuanNwIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vcmVzb3VyY2VzL2xpc3RVc2VyRGF0YWJhc2VzLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDYyOTdhCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vcmVzb3VyY2VzL2xpc3RVc2VyRGF0YWJhc2VzLmpzcApAQCAtMCwwICsxLDQ5IEBACis8IS0tIFN0YW5kYXJkIFN0cnV0cyBFbnRyaWVzIC0tPgorPCVAIHBhZ2UgbGFuZ3VhZ2U9ImphdmEiIGltcG9ydD0iamF2YS5uZXQuVVJMRW5jb2RlciIgY29udGVudFR5cGU9InRleHQvaHRtbDtjaGFyc2V0PXV0Zi04IiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL3N0cnV0cy1iZWFuLnRsZCIgcHJlZml4PSJiZWFuIiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL3N0cnV0cy1odG1sLnRsZCIgcHJlZml4PSJodG1sIiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL3N0cnV0cy1sb2dpYy50bGQiIHByZWZpeD0ibG9naWMiICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvY29udHJvbHMudGxkIiBwcmVmaXg9ImNvbnRyb2xzIiAlPgorCis8aHRtbDpodG1sIGxvY2FsZT0idHJ1ZSI+CisKKzwlQCBpbmNsdWRlIGZpbGU9Ii4uL3VzZXJzL2hlYWRlci5qc3AiICU+CisKKzwhLS0gQm9keSAtLT4KKzxib2R5IGJnY29sb3I9IndoaXRlIiBiYWNrZ3JvdW5kPSIuLi9pbWFnZXMvUGFwZXJUZXh0dXJlLmdpZiI+CisKKzwhLS1Gb3JtIC0tPgorCis8aHRtbDplcnJvcnMvPgorCis8aHRtbDpmb3JtIGFjdGlvbj0iL3Jlc291cmNlcy9saXN0VXNlckRhdGFiYXNlcyI+CisKKyAgPGJlYW46ZGVmaW5lIGlkPSJkb21haW5JbmZvIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgbmFtZT0idXNlckRhdGFiYXNlc0Zvcm0iIHByb3BlcnR5PSJkb21haW4iLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJkb21haW4iLz4KKworICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KKyAgICA8dHIgYmdjb2xvcj0iNzE3MUE1Ij4KKyAgICAgIDx0ZCB3aWR0aD0iODElIj4KKyAgICAgICAgPGRpdiBjbGFzcz0icGFnZS10aXRsZS10ZXh0IiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InJlc291cmNlcy50cmVlQnVpbGRlci5kYXRhYmFzZXMiLz4KKyAgICAgICAgPC9kaXY+CisgICAgICA8L3RkPgorICAgICAgPHRkIHdpZHRoPSIxOSUiPgorICAgICAgICA8ZGl2IGFsaWduPSJyaWdodCI+CisgICAgICAgICAgPCVAIGluY2x1ZGUgZmlsZT0ibGlzdFVzZXJEYXRhYmFzZXMuanNwZiIgJT4KKyAgICAgICAgPC9kaXY+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgIDwvdGFibGU+CisKKzxicj4KKworPCVAIGluY2x1ZGUgZmlsZT0idXNlckRhdGFiYXNlcy5qc3BmIiAlPgorCis8L2h0bWw6Zm9ybT4KKworPGJyPgorCis8L2JvZHk+Cis8L2h0bWw6aHRtbD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3Jlc291cmNlcy9saXN0VXNlckRhdGFiYXNlcy5qc3BmIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vcmVzb3VyY2VzL2xpc3RVc2VyRGF0YWJhc2VzLmpzcGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVhN2IxZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3Jlc291cmNlcy9saXN0VXNlckRhdGFiYXNlcy5qc3BmCkBAIC0wLDAgKzEsMjYgQEAKKzx0ZCBhbGlnbj0icmlnaHQiIG5vd3JhcD4KKzxkaXYgY2xhc3M9InBhZ2UtdGl0bGUtdGV4dCI+Cis8Y29udHJvbHM6YWN0aW9ucyBsYWJlbD0iVXNlciBEYXRhYmFzZSBBY3Rpb25zIj4KKworICA8Y29udHJvbHM6YWN0aW9uIHNlbGVjdGVkPSJ0cnVlIj4KKyAgICAtLS0tPGJlYW46bWVzc2FnZSBrZXk9ImFjdGlvbnMuYXZhaWxhYmxlLmFjdGlvbnMiLz4tLS0tCisgIDwvY29udHJvbHM6YWN0aW9uPgorCisgIDxjb250cm9sczphY3Rpb24gZGlzYWJsZWQ9InRydWUiPgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICA8L2NvbnRyb2xzOmFjdGlvbj4KKworICA8Y29udHJvbHM6YWN0aW9uIHVybD0nPCU9ICIvcmVzb3VyY2VzL3NldFVwVXNlckRhdGFiYXNlLmRvP2RvbWFpbj0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKGRvbWFpbkluZm8pICU+Jz4KKyAgICA8YmVhbjptZXNzYWdlIGtleT0icmVzb3VyY2VzLmFjdGlvbnMudXNlcmRiLmNyZWF0ZSIvPgorICA8L2NvbnRyb2xzOmFjdGlvbj4KKworICA8Y29udHJvbHM6YWN0aW9uIHVybD0nPCU9ICIvcmVzb3VyY2VzL2xpc3RVc2VyRGF0YWJhc2VzLmRvP2RvbWFpbj0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKGRvbWFpbkluZm8pICsgIiZmb3J3YXJkPSIgKworICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUoIlVzZXJEYXRhYmFzZXMgRGVsZXRlIExpc3QiKSAlPic+CisgICAgPGJlYW46bWVzc2FnZSBrZXk9InJlc291cmNlcy5hY3Rpb25zLnVzZXJkYi5kZWxldGUiLz4KKyAgPC9jb250cm9sczphY3Rpb24+CisKKzwvY29udHJvbHM6YWN0aW9ucz4KKzwvZGl2PgorPC90ZD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3Jlc291cmNlcy9tYWlsU2Vzc2lvbi5qc3AgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9yZXNvdXJjZXMvbWFpbFNlc3Npb24uanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0NDAyYmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9yZXNvdXJjZXMvbWFpbFNlc3Npb24uanNwCkBAIC0wLDAgKzEsMTQyIEBACis8IS0tIFN0YW5kYXJkIFN0cnV0cyBFbnRyaWVzIC0tPgorCis8JUAgcGFnZSBsYW5ndWFnZT0iamF2YSIgaW1wb3J0PSJqYXZhLm5ldC5VUkxFbmNvZGVyIiBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgiICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvc3RydXRzLWJlYW4udGxkIiBwcmVmaXg9ImJlYW4iICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvc3RydXRzLWh0bWwudGxkIiBwcmVmaXg9Imh0bWwiICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvc3RydXRzLWxvZ2ljLnRsZCIgcHJlZml4PSJsb2dpYyIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9jb250cm9scy50bGQiIHByZWZpeD0iY29udHJvbHMiICU+CisKKzxodG1sOmh0bWwgbG9jYWxlPSJ0cnVlIj4KKworPCVAIGluY2x1ZGUgZmlsZT0iLi4vdXNlcnMvaGVhZGVyLmpzcCIgJT4KKworPCEtLSBCb2R5IC0tPgorPGJvZHkgYmdjb2xvcj0id2hpdGUiIGJhY2tncm91bmQ9Ii4uL2ltYWdlcy9QYXBlclRleHR1cmUuZ2lmIj4KKworPCEtLUZvcm0gLS0+CisKKzxodG1sOmVycm9ycy8+CisKKzxodG1sOmZvcm0gbWV0aG9kPSJQT1NUIiBhY3Rpb249Ii9yZXNvdXJjZXMvc2F2ZU1haWxTZXNzaW9uIj4KKworICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9Im9iamVjdE5hbWUiLz4KKworICA8YmVhbjpkZWZpbmUgaWQ9InJlc291cmNldHlwZUluZm8iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICBuYW1lPSJtYWlsU2Vzc2lvbkZvcm0iIHByb3BlcnR5PSJyZXNvdXJjZXR5cGUiLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJyZXNvdXJjZXR5cGUiLz4KKworICA8YmVhbjpkZWZpbmUgaWQ9InBhdGhJbmZvIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgbmFtZT0ibWFpbFNlc3Npb25Gb3JtIiBwcm9wZXJ0eT0icGF0aCIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9InBhdGgiLz4KKworICA8YmVhbjpkZWZpbmUgaWQ9Imhvc3RJbmZvIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgbmFtZT0ibWFpbFNlc3Npb25Gb3JtIiBwcm9wZXJ0eT0iaG9zdCIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9Imhvc3QiLz4KKworICA8YmVhbjpkZWZpbmUgaWQ9ImRvbWFpbkluZm8iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICBuYW1lPSJtYWlsU2Vzc2lvbkZvcm0iIHByb3BlcnR5PSJkb21haW4iLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJkb21haW4iLz4KKworICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KKyAgICA8dHIgY2xhc3M9InBhZ2UtdGl0bGUtcm93Ij4KKyAgICAgIDx0ZCBhbGlnbj0ibGVmdCIgbm93cmFwPgorICAgICAgICA8ZGl2IGNsYXNzPSJwYWdlLXRpdGxlLXRleHQiPgorICAgICAgICAgIDxiZWFuOndyaXRlIG5hbWU9Im1haWxTZXNzaW9uRm9ybSIgcHJvcGVydHk9Im5vZGVMYWJlbCIvPgorICAgICAgICA8L2Rpdj4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQgYWxpZ249InJpZ2h0IiBub3dyYXA+CisgICAgICAgIDxkaXYgY2xhc3M9InBhZ2UtdGl0bGUtdGV4dCI+CisgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbnMgbGFiZWw9Ik1haWwgU2Vzc2lvbiBBY3Rpb25zIj4KKyAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24gc2VsZWN0ZWQ9InRydWUiPgorICAgICAgICAgICAgICAtLS0tPGJlYW46bWVzc2FnZSBrZXk9ImFjdGlvbnMuYXZhaWxhYmxlLmFjdGlvbnMiLz4tLS0tCisgICAgICAgICAgICA8L2NvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24+CisgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgPC9jb250cm9sczphY3Rpb24+CisKKyAgICAgICAgPGNvbnRyb2xzOmFjdGlvbiB1cmw9JzwlPSAiL3Jlc291cmNlcy9zZXRVcE1haWxTZXNzaW9uLmRvP3Jlc291cmNldHlwZT0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShyZXNvdXJjZXR5cGVJbmZvKSArICImcGF0aD0iKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHBhdGhJbmZvKSArICImaG9zdD0iKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKGhvc3RJbmZvKSArICImZG9tYWluPSIrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUoZG9tYWluSW5mbykgJT4nPgorICAgICAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJyZXNvdXJjZXMuYWN0aW9ucy5tYWlsc2Vzc2lvbi5jcmVhdGUiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbiB1cmw9JzwlPSAiL3Jlc291cmNlcy9saXN0TWFpbFNlc3Npb25zLmRvP3Jlc291cmNldHlwZT0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShyZXNvdXJjZXR5cGVJbmZvKSArICImcGF0aD0iKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHBhdGhJbmZvKSArICImaG9zdD0iKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKGhvc3RJbmZvKSArICImZG9tYWluPSIrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUoZG9tYWluSW5mbykgKyAiJmZvcndhcmQ9IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUoIk1haWxTZXNzaW9ucyBEZWxldGUgTGlzdCIpICU+Jz4KKyAgICAgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0icmVzb3VyY2VzLmFjdGlvbnMubWFpbHNlc3Npb24uZGVsZXRlIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgIDwvY29udHJvbHM6YWN0aW9ucz4KKyAgICAgICAgPC9kaXY+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgIDwvdGFibGU+CisKKyAgPCVAIGluY2x1ZGUgZmlsZT0iLi4vYnV0dG9ucy5qc3AiICU+Cis8YnI+CisKKyAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CisgICAgPHRyPjx0ZD48ZGl2IGNsYXNzPSJ0YWJsZS10aXRsZS10ZXh0Ij4KKyAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InJlc291cmNlcy50cmVlQnVpbGRlci5tYWlsc2Vzc2lvbnMiLz4KKyAgICA8L2Rpdj48L3RkPjwvdHI+CisgIDwvdGFibGU+CisKKyAgPHRhYmxlIGNsYXNzPSJiYWNrLXRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMSIgd2lkdGg9IjEwMCUiPgorICAgIDx0cj4KKyAgICAgIDx0ZD4KKworICAgICAgICA8Y29udHJvbHM6dGFibGUgdGFibGVTdHlsZT0iZnJvbnQtdGFibGUiIGxpbmVTdHlsZT0ibGluZS1yb3ciPgorICAgICAgICAgIDxjb250cm9sczpyb3cgaGVhZGVyPSJ0cnVlIgorICAgICAgICAgICAgICAgIGxhYmVsU3R5bGU9InRhYmxlLWhlYWRlci10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLWhlYWRlci10ZXh0Ij4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0ic2VydmljZS5wcm9wZXJ0eSIvPjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT48YmVhbjptZXNzYWdlIGtleT0ic2VydmljZS52YWx1ZSIvPjwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJuYW1lIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InJlc291cmNlcy5tYWlsc2Vzc2lvbi5uYW1lIi8+OgorICAgICAgICAgICAgPC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICA8bG9naWM6cHJlc2VudCBuYW1lPSJtYWlsU2Vzc2lvbkZvcm0iIHByb3BlcnR5PSJvYmplY3ROYW1lIj4KKyAgICAgICAgICAgICAgICA8YmVhbjp3cml0ZSBuYW1lPSJtYWlsU2Vzc2lvbkZvcm0iIHByb3BlcnR5PSJuYW1lIi8+CisgICAgICAgICAgICAgICAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJuYW1lIi8+CisgICAgICAgICAgICAgIDwvbG9naWM6cHJlc2VudD4KKyAgICAgICAgICAgICAgPGxvZ2ljOm5vdFByZXNlbnQgbmFtZT0ibWFpbFNlc3Npb25Gb3JtIiBwcm9wZXJ0eT0ib2JqZWN0TmFtZSI+CisgICAgICAgICAgICAgICAgPGh0bWw6dGV4dCBwcm9wZXJ0eT0ibmFtZSIgc2l6ZT0iMzUiIG1heGxlbmd0aD0iNTYiIHN0eWxlSWQ9Im5hbWUiLz4KKyAgICAgICAgICAgICAgPC9sb2dpYzpub3RQcmVzZW50PgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IgorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9Im1haWxob3N0Ij4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InJlc291cmNlcy5tYWlsc2Vzc2lvbi5tYWlsaG9zdCIvPjoKKyAgICAgICAgICAgIDwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgICA8aHRtbDp0ZXh0YXJlYSBwcm9wZXJ0eT0ibWFpbGhvc3QiIGNvbHM9IjM1IiByb3dzPSIyIiBzdHlsZUlkPSJtYWlsaG9zdCIvPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgIDwvY29udHJvbHM6dGFibGU+CisKKyAgICAgIDwvdGQ+CisKKyAgICA8L3RyPgorCisgIDwvdGFibGU+CisKKyAgPCVAIGluY2x1ZGUgZmlsZT0iLi4vYnV0dG9ucy5qc3AiICU+CisKKzwvaHRtbDpmb3JtPgorCis8IS0tIFN0YW5kYXJkIEZvb3RlciAtLT4KKworPCVAIGluY2x1ZGUgZmlsZT0iLi4vdXNlcnMvZm9vdGVyLmpzcCIgJT4KKworPC9ib2R5PgorCis8L2h0bWw6aHRtbD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3Jlc291cmNlcy9tYWlsU2Vzc2lvbnMuanNwZiBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3Jlc291cmNlcy9tYWlsU2Vzc2lvbnMuanNwZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWRiYzEwCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vcmVzb3VyY2VzL21haWxTZXNzaW9ucy5qc3BmCkBAIC0wLDAgKzEsNTAgQEAKKzwlLS0gTWFpbFNlc3Npb25zIExpc3QgLS0lPgorCis8dGFibGUgY2xhc3M9ImJhY2stdGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIxIgorICAgICAgIHdpZHRoPSIxMDAlIj48dHI+PHRkPiAKKworICA8dGFibGUgY2xhc3M9ImZyb250LXRhYmxlIiBib3JkZXI9IjEiCisgICBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KKyAgICA8dHIgY2xhc3M9ImhlYWRlci1yb3ciPgorICAgICAgPGxvZ2ljOnByZXNlbnQgbmFtZT0iY2hlY2tib3hlcyI+CisgICAgICAgIDx0ZCB3aWR0aD0iNSUiPjxkaXYgYWxpZ249ImxlZnQiIGNsYXNzPSJ0YWJsZS1oZWFkZXItdGV4dCI+CisgICAgICAgICAgJm5ic3A7CisgICAgICAgIDwvdGQ+CisgICAgICA8L2xvZ2ljOnByZXNlbnQ+CisgICAgICA8dGggc2NvcGU9ImNvbCIgd2lkdGg9IjIwJSI+PGRpdiBhbGlnbj0ibGVmdCIgY2xhc3M9InRhYmxlLWhlYWRlci10ZXh0Ij4KKyAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InJlc291cmNlcy5tYWlsc2Vzc2lvbi5uYW1lIi8+CisgICAgICA8L2Rpdj48L3RoPgorICAgICAgPHRoIHNjb3BlPSJjb2wiPjxkaXYgYWxpZ249ImxlZnQiIGNsYXNzPSJ0YWJsZS1oZWFkZXItdGV4dCI+CisgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJyZXNvdXJjZXMubWFpbHNlc3Npb24ubWFpbGhvc3QiLz4KKyAgICAgIDwvZGl2PjwvdGg+CisgICAgPC90cj4KKworICAgIDxsb2dpYzppdGVyYXRlIG5hbWU9Im1haWxTZXNzaW9uc0Zvcm0iIHByb3BlcnR5PSJtYWlsU2Vzc2lvbnMiCisgICAgICAgICAgICAgICAgICAgICBpZD0ibWFpbFNlc3Npb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorICAgICAgPHRyIGNsYXNzPSJsaW5lLXJvdyI+CisgICAgICAgIDxsb2dpYzpwcmVzZW50IG5hbWU9ImNoZWNrYm94ZXMiPgorICAgICAgICAgIDx0ZCBzY29wZT0icm93Ij48ZGl2IGFsaWduPSJjZW50ZXIiIGNsYXNzPSJ0YWJsZS1ub3JtYWwtdGV4dCI+CisgICAgICAgICAgICA8bGFiZWwgZm9yPSJtYWlsU2Vzc2lvbnMiPjwvbGFiZWw+CisgICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9Im1haWxTZXNzaW9ucyIKKyAgICAgICAgICAgICAgICAgIHZhbHVlPSI8JT0gbWFpbFNlc3Npb24gJT4iIHN0eWxlSWQ9Im1haWxTZXNzaW9ucyI+CisgICAgICAgICAgPC90ZD4KKyAgICAgICAgPC9sb2dpYzpwcmVzZW50PgorICAgICAgICA8dGQgc2NvcGU9InJvdyI+PGRpdiBhbGlnbj0ibGVmdCIgY2xhc3M9InRhYmxlLW5vcm1hbC10ZXh0Ij4KKyAgICAgICAgICA8aHRtbDpsaW5rIHBhZ2U9JzwlPSAiL3Jlc291cmNlcy9zZXRVcE1haWxTZXNzaW9uLmRvP29iamVjdE5hbWU9IiArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKG1haWxTZXNzaW9uKSArICImcmVzb3VyY2V0eXBlPSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHJlc291cmNldHlwZUluZm8pICsgIiZwYXRoPSIrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUocGF0aEluZm8pICsgIiZob3N0PSIrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUoaG9zdEluZm8pICsgIiZkb21haW49IisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShkb21haW5JbmZvKSAlPic+CisgICAgICAgICAgICA8Y29udHJvbHM6YXR0cmlidXRlIG5hbWU9Im1haWxTZXNzaW9uIiBhdHRyaWJ1dGU9Im5hbWUiLz4KKyAgICAgICAgICA8L2h0bWw6bGluaz4KKyAgICAgICAgPC9kaXY+PC90ZD4KKyAgICAgICAgPHRkIHNjb3BlPSJyb3ciPjxkaXYgYWxpZ249ImxlZnQiIGNsYXNzPSJ0YWJsZS1ub3JtYWwtdGV4dCI+Jm5ic3A7CisgICAgICAgICAgPGNvbnRyb2xzOmF0dHJpYnV0ZSBuYW1lPSJtYWlsU2Vzc2lvbiIgYXR0cmlidXRlPSJtYWlsLnNtdHAuaG9zdCIvPgorICAgICAgICA8L2Rpdj48L3RkPgorICAgICAgPC90cj4KKyAgICA8L2xvZ2ljOml0ZXJhdGU+CisKKyAgPC90YWJsZT4KKworPC90ZD48L3RyPjwvdGFibGU+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9yZXNvdXJjZXMvcmVzb3VyY2VMaW5rLmpzcCBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3Jlc291cmNlcy9yZXNvdXJjZUxpbmsuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5OTBkYzQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9yZXNvdXJjZXMvcmVzb3VyY2VMaW5rLmpzcApAQCAtMCwwICsxLDE1MyBAQAorPCEtLSBTdGFuZGFyZCBTdHJ1dHMgRW50cmllcyAtLT4KKworPCVAIHBhZ2UgbGFuZ3VhZ2U9ImphdmEiIGltcG9ydD0iamF2YS5uZXQuVVJMRW5jb2RlciIgY29udGVudFR5cGU9InRleHQvaHRtbDtjaGFyc2V0PXV0Zi04IiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL3N0cnV0cy1iZWFuLnRsZCIgcHJlZml4PSJiZWFuIiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL3N0cnV0cy1odG1sLnRsZCIgcHJlZml4PSJodG1sIiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL3N0cnV0cy1sb2dpYy50bGQiIHByZWZpeD0ibG9naWMiICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvY29udHJvbHMudGxkIiBwcmVmaXg9ImNvbnRyb2xzIiAlPgorCis8aHRtbDpodG1sIGxvY2FsZT0idHJ1ZSI+CisKKzwlQCBpbmNsdWRlIGZpbGU9Ii4uL3VzZXJzL2hlYWRlci5qc3AiICU+CisKKzwhLS0gQm9keSAtLT4KKzxib2R5IGJnY29sb3I9IndoaXRlIiBiYWNrZ3JvdW5kPSIuLi9pbWFnZXMvUGFwZXJUZXh0dXJlLmdpZiI+CisKKzwhLS1Gb3JtIC0tPgorCis8aHRtbDplcnJvcnMvPgorCis8aHRtbDpmb3JtIG1ldGhvZD0iUE9TVCIgYWN0aW9uPSIvcmVzb3VyY2VzL3NhdmVSZXNvdXJjZUxpbmsiPgorCisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0ib2JqZWN0TmFtZSIvPgorCisgIDxiZWFuOmRlZmluZSBpZD0icmVzb3VyY2V0eXBlSW5mbyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIG5hbWU9InJlc291cmNlTGlua0Zvcm0iIHByb3BlcnR5PSJyZXNvdXJjZXR5cGUiLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJyZXNvdXJjZXR5cGUiLz4KKworICA8YmVhbjpkZWZpbmUgaWQ9InBhdGhJbmZvIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgbmFtZT0icmVzb3VyY2VMaW5rRm9ybSIgcHJvcGVydHk9InBhdGgiLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJwYXRoIi8+CisKKyAgPGJlYW46ZGVmaW5lIGlkPSJob3N0SW5mbyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIG5hbWU9InJlc291cmNlTGlua0Zvcm0iIHByb3BlcnR5PSJob3N0Ii8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0iaG9zdCIvPgorCisgIDxiZWFuOmRlZmluZSBpZD0iZG9tYWluSW5mbyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIG5hbWU9InJlc291cmNlTGlua0Zvcm0iIHByb3BlcnR5PSJkb21haW4iLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJkb21haW4iLz4KKworCisgIDx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgorICAgIDx0ciBjbGFzcz0icGFnZS10aXRsZS1yb3ciPgorICAgICAgPHRkIGFsaWduPSJsZWZ0IiBub3dyYXA+CisgICAgICAgIDxkaXYgY2xhc3M9InBhZ2UtdGl0bGUtdGV4dCI+CisgICAgICAgICAgPGJlYW46d3JpdGUgbmFtZT0icmVzb3VyY2VMaW5rRm9ybSIgcHJvcGVydHk9Im5vZGVMYWJlbCIvPgorICAgICAgICA8L2Rpdj4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQgYWxpZ249InJpZ2h0IiBub3dyYXA+CisgICAgICAgIDxkaXYgY2xhc3M9InBhZ2UtdGl0bGUtdGV4dCI+CisgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbnMgbGFiZWw9IlJlc291cmNlIExpbmsgQWN0aW9ucyI+CisgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9uIHNlbGVjdGVkPSJ0cnVlIj4KKyAgICAgICAgICAgICAgLS0tLTxiZWFuOm1lc3NhZ2Uga2V5PSJhY3Rpb25zLmF2YWlsYWJsZS5hY3Rpb25zIi8+LS0tLQorICAgICAgICAgICAgPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgIDwvY29udHJvbHM6YWN0aW9uPgorCisgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9uIHVybD0nPCU9ICIvcmVzb3VyY2VzL3NldFVwUmVzb3VyY2VMaW5rLmRvP3Jlc291cmNldHlwZT0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShyZXNvdXJjZXR5cGVJbmZvKSArICImcGF0aD0iKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHBhdGhJbmZvKSArICImaG9zdD0iKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKGhvc3RJbmZvKSArICImZG9tYWluPSIrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUoZG9tYWluSW5mbykgJT4nPgorICAgICAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJyZXNvdXJjZXMuYWN0aW9ucy5yZXNvdXJjZWxrLmNyZWF0ZSIvPgorICAgICAgICAgICAgPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9uIHVybD0nPCU9ICIvcmVzb3VyY2VzL2xpc3RSZXNvdXJjZUxpbmtzLmRvP3Jlc291cmNldHlwZT0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShyZXNvdXJjZXR5cGVJbmZvKSArICImcGF0aD0iKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHBhdGhJbmZvKSArICImaG9zdD0iKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKGhvc3RJbmZvKSArICImZG9tYWluPSIrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUoZG9tYWluSW5mbykgKyAiJmZvcndhcmQ9IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUoIlJlc291cmNlTGlua3MgRGVsZXRlIExpc3QiKSAlPic+CisgICAgICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InJlc291cmNlcy5hY3Rpb25zLnJlc291cmNlbGsuZGVsZXRlIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgIDwvY29udHJvbHM6YWN0aW9ucz4KKyAgICAgICAgPC9kaXY+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgIDwvdGFibGU+CisKKyAgPCVAIGluY2x1ZGUgZmlsZT0iLi4vYnV0dG9ucy5qc3AiICU+Cis8YnI+CisKKyAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CisgICAgPHRyPjx0ZD48ZGl2IGNsYXNzPSJ0YWJsZS10aXRsZS10ZXh0Ij4KKyAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InJlc291cmNlcy50cmVlQnVpbGRlci5yZXNvdXJjZWxpbmtzIi8+CisgICAgPC9kaXY+PC90ZD48L3RyPgorICA8L3RhYmxlPgorCisgIDx0YWJsZSBjbGFzcz0iYmFjay10YWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjEiIHdpZHRoPSIxMDAlIj4KKyAgICA8dHI+CisgICAgICA8dGQ+CisKKyAgICAgICAgPGNvbnRyb2xzOnRhYmxlIHRhYmxlU3R5bGU9ImZyb250LXRhYmxlIiBsaW5lU3R5bGU9ImxpbmUtcm93Ij4KKyAgICAgICAgICA8Y29udHJvbHM6cm93IGhlYWRlcj0idHJ1ZSIKKyAgICAgICAgICAgICAgICBsYWJlbFN0eWxlPSJ0YWJsZS1oZWFkZXItdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1oZWFkZXItdGV4dCI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9InNlcnZpY2UucHJvcGVydHkiLz48L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+PGJlYW46bWVzc2FnZSBrZXk9InNlcnZpY2UudmFsdWUiLz48L2NvbnRyb2xzOmRhdGE+CisgICAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiCisgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0ibmFtZSI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJyZXNvdXJjZXMucmVzb3VyY2Vsay5uYW1lIi8+OgorICAgICAgICAgICAgPC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICA8bG9naWM6cHJlc2VudCBuYW1lPSJyZXNvdXJjZUxpbmtGb3JtIiBwcm9wZXJ0eT0ib2JqZWN0TmFtZSI+CisgICAgICAgICAgICAgICAgPGJlYW46d3JpdGUgbmFtZT0icmVzb3VyY2VMaW5rRm9ybSIgcHJvcGVydHk9Im5hbWUiLz4KKyAgICAgICAgICAgICAgICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9Im5hbWUiLz4KKyAgICAgICAgICAgICAgPC9sb2dpYzpwcmVzZW50PgorICAgICAgICAgICAgICA8bG9naWM6bm90UHJlc2VudCBuYW1lPSJyZXNvdXJjZUxpbmtGb3JtIiBwcm9wZXJ0eT0ib2JqZWN0TmFtZSI+CisgICAgICAgICAgICAgICAgPGh0bWw6dGV4dCBwcm9wZXJ0eT0ibmFtZSIgc2l6ZT0iMzUiIG1heGxlbmd0aD0iNTYiIHN0eWxlSWQ9Im5hbWUiLz4KKyAgICAgICAgICAgICAgPC9sb2dpYzpub3RQcmVzZW50PgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IgorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9Imdsb2JhbCI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJyZXNvdXJjZXMucmVzb3VyY2Vsay5nbG9iYWwiLz46CisgICAgICAgICAgICA8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgICAgPGh0bWw6dGV4dCBwcm9wZXJ0eT0iZ2xvYmFsIiBzaXplPSIzNSIgbWF4bGVuZ3RoPSI1NiIgc3R5bGVJZD0iZ2xvYmFsIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiCisgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0idHlwZSI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJyZXNvdXJjZXMucmVzb3VyY2Vsay50eXBlIi8+OgorICAgICAgICAgICAgPC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICA8aHRtbDp0ZXh0IHByb3BlcnR5PSJ0eXBlIiBzaXplPSI0NSIgbWF4bGVuZ3RoPSIyNTYiIHN0eWxlSWQ9InR5cGUiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgIDwvY29udHJvbHM6dGFibGU+CisKKyAgICAgIDwvdGQ+CisKKyAgICA8L3RyPgorCisgIDwvdGFibGU+CisKKyAgPCVAIGluY2x1ZGUgZmlsZT0iLi4vYnV0dG9ucy5qc3AiICU+CisKKzwvaHRtbDpmb3JtPgorCis8IS0tIFN0YW5kYXJkIEZvb3RlciAtLT4KKworPCVAIGluY2x1ZGUgZmlsZT0iLi4vdXNlcnMvZm9vdGVyLmpzcCIgJT4KKworPC9ib2R5PgorCis8L2h0bWw6aHRtbD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3Jlc291cmNlcy9yZXNvdXJjZUxpbmtzLmpzcGYgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9yZXNvdXJjZXMvcmVzb3VyY2VMaW5rcy5qc3BmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkMzI4MTIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9yZXNvdXJjZXMvcmVzb3VyY2VMaW5rcy5qc3BmCkBAIC0wLDAgKzEsNDggQEAKKzwlLS0gUmVzb3VyY2VMaW5rcyBMaXN0IC0tJT4KKworPHRhYmxlIGNsYXNzPSJiYWNrLXRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMSIKKyAgICAgICB3aWR0aD0iMTAwJSI+PHRyPjx0ZD4gCisKKyAgPHRhYmxlIGNsYXNzPSJmcm9udC10YWJsZSIgYm9yZGVyPSIxIgorICAgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CisgICAgPHRyIGNsYXNzPSJoZWFkZXItcm93Ij4KKyAgICAgIDxsb2dpYzpwcmVzZW50IG5hbWU9ImNoZWNrYm94ZXMiPgorICAgICAgICA8dGQgd2lkdGg9IjUlIj48ZGl2IGFsaWduPSJsZWZ0IiBjbGFzcz0idGFibGUtaGVhZGVyLXRleHQiPgorICAgICAgICAgICZuYnNwOworICAgICAgICA8L3RkPgorICAgICAgPC9sb2dpYzpwcmVzZW50PgorICAgICAgPHRoIHNjb3BlPSJjb2wiIHdpZHRoPSIyMCUiPjxkaXYgYWxpZ249ImxlZnQiIGNsYXNzPSJ0YWJsZS1oZWFkZXItdGV4dCI+CisgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJyZXNvdXJjZXMucmVzb3VyY2Vsay5uYW1lIi8+CisgICAgICA8L2Rpdj48L3RoPgorICAgICAgPHRoIHNjb3BlPSJjb2wiPjxkaXYgYWxpZ249ImxlZnQiIGNsYXNzPSJ0YWJsZS1oZWFkZXItdGV4dCI+CisgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJyZXNvdXJjZXMucmVzb3VyY2Vsay5nbG9iYWwiLz4KKyAgICAgIDwvZGl2PjwvdGg+CisgICAgPC90cj4KKyAgICA8bG9naWM6aXRlcmF0ZSBuYW1lPSJyZXNvdXJjZUxpbmtzRm9ybSIgcHJvcGVydHk9InJlc291cmNlTGlua3MiCisgICAgICAgICAgICAgICAgICAgICBpZD0icmVzb3VyY2VMaW5rIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKyAgICAgIDx0ciBjbGFzcz0ibGluZS1yb3ciPgorICAgICAgICA8bG9naWM6cHJlc2VudCBuYW1lPSJjaGVja2JveGVzIj4KKyAgICAgICAgICA8dGQgc2NvcGU9InJvdyI+PGRpdiBhbGlnbj0iY2VudGVyIiBjbGFzcz0idGFibGUtbm9ybWFsLXRleHQiPgorICAgICAgICAgICAgPGxhYmVsIGZvcj0icmVzb3VyY2VMaW5rcyI+PC9sYWJlbD4KKyAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0icmVzb3VyY2VMaW5rcyIKKyAgICAgICAgICAgICAgICAgIHZhbHVlPSI8JT0gcmVzb3VyY2VMaW5rICU+IiBzdHlsZUlkPSJyZXNvdXJjZUxpbmtzIj4KKyAgICAgICAgICA8L3RkPgorICAgICAgICA8L2xvZ2ljOnByZXNlbnQ+CisgICAgICAgIDx0ZCBzY29wZT0icm93Ij48ZGl2IGFsaWduPSJsZWZ0IiBjbGFzcz0idGFibGUtbm9ybWFsLXRleHQiPgorICAgICAgICAgIDxodG1sOmxpbmsgcGFnZT0nPCU9ICIvcmVzb3VyY2VzL3NldFVwUmVzb3VyY2VMaW5rLmRvP29iamVjdE5hbWU9IiArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHJlc291cmNlTGluaykgKyAiJnJlc291cmNldHlwZT0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShyZXNvdXJjZXR5cGVJbmZvKSArICImcGF0aD0iKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHBhdGhJbmZvKSArICImaG9zdD0iKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKGhvc3RJbmZvKSArICImZG9tYWluPSIrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUoZG9tYWluSW5mbykgJT4nPgorICAgICAgICAgICAgPGNvbnRyb2xzOmF0dHJpYnV0ZSBuYW1lPSJyZXNvdXJjZUxpbmsiIGF0dHJpYnV0ZT0ibmFtZSIvPgorICAgICAgICAgIDwvaHRtbDpsaW5rPgorICAgICAgICA8L2Rpdj48L3RkPgorICAgICAgICA8dGQgc2NvcGU9InJvdyI+PGRpdiBhbGlnbj0ibGVmdCIgY2xhc3M9InRhYmxlLW5vcm1hbC10ZXh0Ij4mbmJzcDsKKyAgICAgICAgICA8Y29udHJvbHM6YXR0cmlidXRlIG5hbWU9InJlc291cmNlTGluayIgYXR0cmlidXRlPSJnbG9iYWwiLz4KKyAgICAgICAgPC9kaXY+PC90ZD4KKyAgICAgIDwvdHI+CisgICAgPC9sb2dpYzppdGVyYXRlPgorICA8L3RhYmxlPgorCis8L3RkPjwvdHI+PC90YWJsZT4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3Jlc291cmNlcy91c2VyRGF0YWJhc2UuanNwIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vcmVzb3VyY2VzL3VzZXJEYXRhYmFzZS5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE0ZWZjNgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3Jlc291cmNlcy91c2VyRGF0YWJhc2UuanNwCkBAIC0wLDAgKzEsMTQ1IEBACis8IS0tIFN0YW5kYXJkIFN0cnV0cyBFbnRyaWVzIC0tPgorCis8JUAgcGFnZSBsYW5ndWFnZT0iamF2YSIgaW1wb3J0PSJqYXZhLm5ldC5VUkxFbmNvZGVyIiBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgiICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvc3RydXRzLWJlYW4udGxkIiBwcmVmaXg9ImJlYW4iICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvc3RydXRzLWh0bWwudGxkIiBwcmVmaXg9Imh0bWwiICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvc3RydXRzLWxvZ2ljLnRsZCIgcHJlZml4PSJsb2dpYyIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9jb250cm9scy50bGQiIHByZWZpeD0iY29udHJvbHMiICU+CisKKzxodG1sOmh0bWwgbG9jYWxlPSJ0cnVlIj4KKworPCVAIGluY2x1ZGUgZmlsZT0iLi4vdXNlcnMvaGVhZGVyLmpzcCIgJT4KKworPCEtLSBCb2R5IC0tPgorPGJvZHkgYmdjb2xvcj0id2hpdGUiIGJhY2tncm91bmQ9Ii4uL2ltYWdlcy9QYXBlclRleHR1cmUuZ2lmIj4KKworPCEtLUZvcm0gLS0+CisKKzxodG1sOmVycm9ycy8+CisKKzxodG1sOmZvcm0gbWV0aG9kPSJQT1NUIiBhY3Rpb249Ii9yZXNvdXJjZXMvc2F2ZVVzZXJEYXRhYmFzZSI+CisKKyAgPGJlYW46ZGVmaW5lIGlkPSJkb21haW5JbmZvIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgbmFtZT0idXNlckRhdGFiYXNlRm9ybSIgcHJvcGVydHk9ImRvbWFpbiIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9ImRvbWFpbiIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9Im9iamVjdE5hbWUiLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJ0eXBlIi8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0iZmFjdG9yeSIvPgorCisgIDx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgorICAgIDx0ciBjbGFzcz0icGFnZS10aXRsZS1yb3ciPgorICAgICAgPHRkIGFsaWduPSJsZWZ0IiBub3dyYXA+CisgICAgICAgIDxkaXYgY2xhc3M9InBhZ2UtdGl0bGUtdGV4dCI+CisgICAgICAgICAgPGJlYW46d3JpdGUgbmFtZT0idXNlckRhdGFiYXNlRm9ybSIgcHJvcGVydHk9Im5vZGVMYWJlbCIvPgorICAgICAgICA8L2Rpdj4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQgYWxpZ249InJpZ2h0IiBub3dyYXA+CisgICAgICAgIDxkaXYgY2xhc3M9InBhZ2UtdGl0bGUtdGV4dCI+CisgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbnMgbGFiZWw9IlVzZXIgRGF0YWJhc2UgQWN0aW9ucyI+CisgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9uIHNlbGVjdGVkPSJ0cnVlIj4KKyAgICAgICAgICAgICAgLS0tLTxiZWFuOm1lc3NhZ2Uga2V5PSJhY3Rpb25zLmF2YWlsYWJsZS5hY3Rpb25zIi8+LS0tLQorICAgICAgICAgICAgPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgCisgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9uIHVybD0nPCU9ICIvcmVzb3VyY2VzL3NldFVwVXNlckRhdGFiYXNlLmRvP2RvbWFpbj0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKGRvbWFpbkluZm8pICU+Jz4KKyAgICAgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0icmVzb3VyY2VzLmFjdGlvbnMudXNlcmRiLmNyZWF0ZSIvPgorICAgICAgICAgICAgPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9uIHVybD0nPCU9ICIvcmVzb3VyY2VzL2xpc3RVc2VyRGF0YWJhc2VzLmRvP2RvbWFpbj0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKGRvbWFpbkluZm8pICsgIiZmb3J3YXJkPSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUoIlVzZXJEYXRhYmFzZXMgRGVsZXRlIExpc3QiKSAlPic+CisgICAgICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InJlc291cmNlcy5hY3Rpb25zLnVzZXJkYi5kZWxldGUiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgPC9jb250cm9sczphY3Rpb25zPgorICAgICAgICA8L2Rpdj4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgPC90YWJsZT4KKworICA8JUAgaW5jbHVkZSBmaWxlPSIuLi9idXR0b25zLmpzcCIgJT4KKzxicj4KKworICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KKyAgICA8dHI+PHRkPjxkaXYgY2xhc3M9InRhYmxlLXRpdGxlLXRleHQiPgorICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0icmVzb3VyY2VzLnRyZWVCdWlsZGVyLmRhdGFiYXNlcyIvPgorICAgIDwvZGl2PjwvdGQ+PC90cj4KKyAgPC90YWJsZT4KKworICA8dGFibGUgY2xhc3M9ImJhY2stdGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIxIiB3aWR0aD0iMTAwJSI+CisgICAgPHRyPgorICAgICAgPHRkPgorCisgICAgICAgIDxjb250cm9sczp0YWJsZSB0YWJsZVN0eWxlPSJmcm9udC10YWJsZSIgbGluZVN0eWxlPSJsaW5lLXJvdyI+CisgICAgICAgICAgPGNvbnRyb2xzOnJvdyBoZWFkZXI9InRydWUiCisgICAgICAgICAgICAgICAgbGFiZWxTdHlsZT0idGFibGUtaGVhZGVyLXRleHQiIGRhdGFTdHlsZT0idGFibGUtaGVhZGVyLXRleHQiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJzZXJ2aWNlLnByb3BlcnR5Ii8+PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPjxiZWFuOm1lc3NhZ2Uga2V5PSJzZXJ2aWNlLnZhbHVlIi8+PC9jb250cm9sczpkYXRhPgorICAgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IgorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9Im5hbWUiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0ic2VydmljZS5uYW1lIi8+OgorICAgICAgICAgICAgPC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICA8bG9naWM6cHJlc2VudCBuYW1lPSJ1c2VyRGF0YWJhc2VGb3JtIiBwcm9wZXJ0eT0ib2JqZWN0TmFtZSI+CisgICAgICAgICAgICAgICAgPGJlYW46d3JpdGUgbmFtZT0idXNlckRhdGFiYXNlRm9ybSIgcHJvcGVydHk9Im5hbWUiLz4KKyAgICAgICAgICAgICAgICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9Im5hbWUiLz4KKyAgICAgICAgICAgICAgPC9sb2dpYzpwcmVzZW50PgorICAgICAgICAgICAgICA8bG9naWM6bm90UHJlc2VudCBuYW1lPSJ1c2VyRGF0YWJhc2VGb3JtIiBwcm9wZXJ0eT0ib2JqZWN0TmFtZSI+CisgICAgICAgICAgICAgICAgPGh0bWw6dGV4dCBwcm9wZXJ0eT0ibmFtZSIgc2l6ZT0iMjQiIG1heGxlbmd0aD0iMzIiIHN0eWxlSWQ9Im5hbWUiLz4KKyAgICAgICAgICAgICAgPC9sb2dpYzpub3RQcmVzZW50PgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IgorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9ImxvY2F0aW9uIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InJlc291cmNlcy51c2VyZGIubG9jYXRpb24iLz46CisgICAgICAgICAgICA8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgIDxodG1sOnRleHQgcHJvcGVydHk9InBhdGgiIHNpemU9IjMyIiBtYXhsZW5ndGg9IjY0IiBzdHlsZUlkPSJsb2NhdGlvbiIvPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IgorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9ImZhY3RvcnkiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0icmVzb3VyY2VzLnVzZXJkYi5mYWN0b3J5Ii8+OgorICAgICAgICAgICAgPC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICA8YmVhbjp3cml0ZSBuYW1lPSJ1c2VyRGF0YWJhc2VGb3JtIiBwcm9wZXJ0eT0iZmFjdG9yeSIvPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IgorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9ImRlc2NyaXB0aW9uIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InVzZXJzLnByb21wdC5kZXNjcmlwdGlvbiIvPgorICAgICAgICAgICAgPC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICA8aHRtbDp0ZXh0YXJlYSBwcm9wZXJ0eT0iZGVzY3JpcHRpb24iIGNvbHM9IjMyIiByb3dzPSIzIiBzdHlsZUlkPSJkZXNjcmlwdGlvbiIvPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgIDwvY29udHJvbHM6dGFibGU+CisKKyAgICAgIDwvdGQ+CisKKyAgICA8L3RyPgorCisgIDwvdGFibGU+CisKKyAgPCVAIGluY2x1ZGUgZmlsZT0iLi4vYnV0dG9ucy5qc3AiICU+CisKKzwvaHRtbDpmb3JtPgorCis8IS0tIFN0YW5kYXJkIEZvb3RlciAtLT4KKworPCVAIGluY2x1ZGUgZmlsZT0iLi4vdXNlcnMvZm9vdGVyLmpzcCIgJT4KKworPC9ib2R5PgorCis8L2h0bWw6aHRtbD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3Jlc291cmNlcy91c2VyRGF0YWJhc2VzLmpzcGYgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9yZXNvdXJjZXMvdXNlckRhdGFiYXNlcy5qc3BmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2NjM4ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9yZXNvdXJjZXMvdXNlckRhdGFiYXNlcy5qc3BmCkBAIC0wLDAgKzEsNjUgQEAKKzwlLS0gRW52IEVudHJpZXMgTGlzdCAtLSU+CisKKzx0YWJsZSBjbGFzcz0iYmFjay10YWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjEiCisgICAgICAgd2lkdGg9IjEwMCUiPjx0cj48dGQ+IAorCisgIDx0YWJsZSBjbGFzcz0iZnJvbnQtdGFibGUiIGJvcmRlcj0iMSIKKyAgIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgorICAgIDx0ciBjbGFzcz0iaGVhZGVyLXJvdyI+CisgICAgICA8bG9naWM6cHJlc2VudCBuYW1lPSJjaGVja2JveGVzIj4KKyAgICAgICAgPHRkIHdpZHRoPSI1JSI+PGRpdiBhbGlnbj0ibGVmdCIgY2xhc3M9InRhYmxlLWhlYWRlci10ZXh0Ij4KKyAgICAgICAgICAmbmJzcDsKKyAgICAgICAgPC90ZD4KKyAgICAgIDwvbG9naWM6cHJlc2VudD4KKyAgICAgIDx0aCBzY29wZT0iY29sIiB3aWR0aD0iMjAlIj48ZGl2IGFsaWduPSJsZWZ0IiBjbGFzcz0idGFibGUtaGVhZGVyLXRleHQiPgorICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0ic2VydmljZS5uYW1lIi8+CisgICAgICA8L2Rpdj48L3RoPgorICAgICAgPCUtLQorICAgICAgPHRoIHNjb3BlPSJjb2wiPjxkaXYgYWxpZ249ImxlZnQiIGNsYXNzPSJ0YWJsZS1oZWFkZXItdGV4dCI+CisgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJyZXNvdXJjZXMudXNlcmRiLmxvY2F0aW9uIi8+CisgICAgICA8L2Rpdj48L3RoPgorICAgICAgLS0lPgorICAgICAgPHRoIHNjb3BlPSJjb2wiPjxkaXYgYWxpZ249ImxlZnQiIGNsYXNzPSJ0YWJsZS1oZWFkZXItdGV4dCI+CisgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJ1c2Vycy5saXN0LmRlc2NyaXB0aW9uIi8+CisgICAgICA8L2Rpdj48L3RoPgorICAgIDwvdHI+CisgICAgPGxvZ2ljOml0ZXJhdGUgbmFtZT0idXNlckRhdGFiYXNlc0Zvcm0iIHByb3BlcnR5PSJ1c2VyRGF0YWJhc2VzIgorICAgICAgICAgICAgICAgICAgICAgaWQ9InVzZXJEYXRhYmFzZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CisgICAgICA8dHIgY2xhc3M9ImxpbmUtcm93Ij4KKyAgICAgICAgPGxvZ2ljOnByZXNlbnQgbmFtZT0iY2hlY2tib3hlcyI+CisgICAgICAgICAgPHRkIHNjb3BlPSJyb3ciPjxkaXYgYWxpZ249ImNlbnRlciIgY2xhc3M9InRhYmxlLW5vcm1hbC10ZXh0Ij4KKyAgICAgICAgICAgICA8bG9naWM6bWF0Y2ggbmFtZT0idXNlckRhdGFiYXNlIgorICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im5hbWU9VXNlckRhdGFiYXNlIj4KKyAgICAgICAgICAgICA8Zm9udCBjb2xvcj0ncmVkJz4qPC9mb250PgorICAgICAgICAgICAgIDwvbG9naWM6bWF0Y2g+CisgICAgICAgICAgICAgPGxvZ2ljOm5vdE1hdGNoIG5hbWU9InVzZXJEYXRhYmFzZSIKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJuYW1lPVVzZXJEYXRhYmFzZSI+CisgICAgICAgICAgICAgIDxsYWJlbCBmb3I9InVzZXJEYXRhYmFzZXMiPjwvbGFiZWw+ICAgICAgIAorICAgICAgICAgICAgICA8aHRtbDptdWx0aWJveCBwcm9wZXJ0eT0idXNlckRhdGFiYXNlcyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9InVzZXJEYXRhYmFzZSIgc3R5bGVJZD0idXNlckRhdGFiYXNlcyIvPgorICAgICAgICAgICAgICA8L2xvZ2ljOm5vdE1hdGNoPiAgICAgICAgCisgICAgICAgIAorICAgICAgICAgICAgPCEtLWlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJ1c2VyRGF0YWJhc2VzIgorICAgICAgICAgICAgICAgICAgdmFsdWU9IjwlPSB1c2VyRGF0YWJhc2UgJT4iIHN0eWxlSWQ9InVzZXJEYXRhYmFzZXMiLS0+CisgICAgICAgICAgPC90ZD4KKyAgICAgICAgPC9sb2dpYzpwcmVzZW50PgorICAgICAgICA8dGQgc2NvcGU9InJvdyI+PGRpdiBhbGlnbj0ibGVmdCIgY2xhc3M9InRhYmxlLW5vcm1hbC10ZXh0Ij4KKyAgICAgICAgICA8aHRtbDpsaW5rIHBhZ2U9JzwlPSAiL3Jlc291cmNlcy9zZXRVcFVzZXJEYXRhYmFzZS5kbz9vYmplY3ROYW1lPSIgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZSh1c2VyRGF0YWJhc2UpICsgIiZkb21haW49IiArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKGRvbWFpbkluZm8pICU+Jz4KKyAgICAgICAgICAgIDxjb250cm9sczphdHRyaWJ1dGUgbmFtZT0idXNlckRhdGFiYXNlIiBhdHRyaWJ1dGU9Im5hbWUiLz4KKyAgICAgICAgICA8L2h0bWw6bGluaz4KKyAgICAgICAgPC9kaXY+PC90ZD4KKyAgICAgICAgPCUtLSBGSVggTUUgLS0gY29tbWVudHJlZCBvdXQgZm9yIG5vdyBhcyB0aGUgcGFnZSB3YXMgbG9va2luZyB0b28gY3Jvd2RlZC4KKyAgICAgICAgPHRkIHNjb3BlPSJyb3ciPjxkaXYgYWxpZ249ImxlZnQiIGNsYXNzPSJ0YWJsZS1ub3JtYWwtdGV4dCI+CisgICAgICAgICAgPGNvbnRyb2xzOmF0dHJpYnV0ZSBuYW1lPSJ1c2VyRGF0YWJhc2UiIGF0dHJpYnV0ZT0icGF0aG5hbWUiLz4KKyAgICAgICAgPC9kaXY+PC90ZD4KKyAgICAgICAgLS0lPgorICAgICAgICA8dGQgc2NvcGU9InJvdyI+PGRpdiBhbGlnbj0ibGVmdCIgY2xhc3M9InRhYmxlLW5vcm1hbC10ZXh0Ij4KKyAgICAgICAgICA8Y29udHJvbHM6YXR0cmlidXRlIG5hbWU9InVzZXJEYXRhYmFzZSIgYXR0cmlidXRlPSJkZXNjcmlwdGlvbiIvPgorICAgICAgICA8L2Rpdj48L3RkPgorICAgICAgPC90cj4KKyAgICA8L2xvZ2ljOml0ZXJhdGU+CisgIDwvdGFibGU+CisKKzwvdGQ+PC90cj48L3RhYmxlPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vc2F2ZWQuanNwIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vc2F2ZWQuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwZWE0ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9zYXZlZC5qc3AKQEAgLTAsMCArMSwzNiBAQAorPCEtLSBTdGFuZGFyZCBTdHJ1dHMgRW50cmllcyAtLT4KKworPCVAIHBhZ2UgbGFuZ3VhZ2U9ImphdmEiIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9zdHJ1dHMtYmVhbi50bGQiIHByZWZpeD0iYmVhbiIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9zdHJ1dHMtaHRtbC50bGQiIHByZWZpeD0iaHRtbCIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9zdHJ1dHMtbG9naWMudGxkIiBwcmVmaXg9ImxvZ2ljIiAlPgorCis8aHRtbDpodG1sIGxvY2FsZT0idHJ1ZSI+CisKKyAgPGJvZHkgYmdjb2xvcj0id2hpdGUiIGJhY2tncm91bmQ9ImltYWdlcy9QYXBlclRleHR1cmUuZ2lmIj4KKworICAgIDwlLS0gQ2F1c2Ugb3VyIHRyZWUgY29udHJvbCB0byByZWZyZXNoIGl0c2VsZiAtLSU+CisgICAgPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+CisgICAgICA8IS0tCisgICAgICAgIHBhcmVudC50cmVlLmxvY2F0aW9uPSd0cmVlQ29udHJvbFRlc3QuZG8nOworICAgICAgLS0+CisgICAgPC9zY3JpcHQ+CisKKyAgICA8JUAgaW5jbHVkZSBmaWxlPSJoZWFkZXIuanNwIiAlPgorCisgICAgPCUtLSBkaXNwbGF5IHdhcm5pbmdzIGlmIGFueSAtLSU+CisgICAgPGxvZ2ljOnByZXNlbnQgbmFtZT0id2FybmluZyI+CisgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0id2FybmluZy5oZWFkZXIiLz4KKyAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSc8JT0gKFN0cmluZykgcmVxdWVzdC5nZXRBdHRyaWJ1dGUoIndhcm5pbmciKSAlPicvPgorICAgICAgICAgICAgPGJyPgorICAgIDwvbG9naWM6cHJlc2VudD4KKworICAgIDxjZW50ZXI+PGgyPgorICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InNhdmUuc3VjY2VzcyIvPgorICAgIDwvaDI+PC9jZW50ZXI+CisKKyAgICA8JUAgaW5jbHVkZSBmaWxlPSJmb290ZXIuanNwIiAlPgorCisgIDwvYm9keT4KKworPC9odG1sOmh0bWw+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9zYXZlZmFpbC5qc3AgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi9zYXZlZmFpbC5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNiYzc0YgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3NhdmVmYWlsLmpzcApAQCAtMCwwICsxLDM4IEBACis8IS0tIFN0YW5kYXJkIFN0cnV0cyBFbnRyaWVzIC0tPgorCis8JUAgcGFnZSBsYW5ndWFnZT0iamF2YSIgY29udGVudFR5cGU9InRleHQvaHRtbDtjaGFyc2V0PXV0Zi04IiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL3N0cnV0cy1iZWFuLnRsZCIgcHJlZml4PSJiZWFuIiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL3N0cnV0cy1odG1sLnRsZCIgcHJlZml4PSJodG1sIiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL3N0cnV0cy1sb2dpYy50bGQiIHByZWZpeD0ibG9naWMiICU+CisKKzxodG1sOmh0bWwgbG9jYWxlPSJ0cnVlIj4KKworICA8Ym9keSBiZ2NvbG9yPSJ3aGl0ZSIgYmFja2dyb3VuZD0iaW1hZ2VzL1BhcGVyVGV4dHVyZS5naWYiPgorCisgICAgPCUtLSBDYXVzZSBvdXIgdHJlZSBjb250cm9sIHRvIHJlZnJlc2ggaXRzZWxmIC0tJT4KKyAgICA8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KKyAgICAgIDwhLS0KKyAgICAgICAgcGFyZW50LnRyZWUubG9jYXRpb249J3RyZWVDb250cm9sVGVzdC5kbyc7CisgICAgICAtLT4KKyAgICA8L3NjcmlwdD4KKworICAgIDwlQCBpbmNsdWRlIGZpbGU9ImhlYWRlci5qc3AiICU+CisgICAgPGNlbnRlcj48aDI+CisgICAgPCUtLSBkaXNwbGF5IHdhcm5pbmdzIGlmIGFueSAtLSU+CisgICAgPGxvZ2ljOnByZXNlbnQgbmFtZT0id2FybmluZyI+CisgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0id2FybmluZy5oZWFkZXIiLz4KKyAgICA8L2gyPjwvY2VudGVyPgorICAgIDxoMz48Y2VudGVyPgorICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9JzwlPSAoU3RyaW5nKSByZXF1ZXN0LmdldEF0dHJpYnV0ZSgid2FybmluZyIpICU+Jy8+CisgICAgICAgICAgICA8YnI+CisgICAgPC9sb2dpYzpwcmVzZW50PgorICAgIDwvaDM+PC9jZW50ZXI+CisgICAgPGNlbnRlcj48aDI+CisgICAgICA8YmVhbjptZXNzYWdlIGtleT0ic2F2ZS5mYWlsIi8+CisgICAgPC9oMj48L2NlbnRlcj4KKworICAgIDwlQCBpbmNsdWRlIGZpbGU9ImZvb3Rlci5qc3AiICU+CisKKyAgPC9ib2R5PgorCis8L2h0bWw6aHRtbD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3NlcnZlci9zZXJ2ZXIuanNwIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vc2VydmVyL3NlcnZlci5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ5NTMxZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3NlcnZlci9zZXJ2ZXIuanNwCkBAIC0wLDAgKzEsMTA3IEBACis8IS0tIFN0YW5kYXJkIFN0cnV0cyBFbnRyaWVzIC0tPgorCis8JUAgcGFnZSBsYW5ndWFnZT0iamF2YSIgaW1wb3J0PSJqYXZhLm5ldC5VUkxFbmNvZGVyIiBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgiICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvc3RydXRzLWJlYW4udGxkIiBwcmVmaXg9ImJlYW4iICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvc3RydXRzLWh0bWwudGxkIiBwcmVmaXg9Imh0bWwiICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvc3RydXRzLWxvZ2ljLnRsZCIgcHJlZml4PSJsb2dpYyIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9jb250cm9scy50bGQiIHByZWZpeD0iY29udHJvbHMiICU+CisKKzxodG1sOmh0bWwgbG9jYWxlPSJ0cnVlIj4KKworPCVAIGluY2x1ZGUgZmlsZT0iLi4vdXNlcnMvaGVhZGVyLmpzcCIgJT4KKworPCEtLSBCb2R5IC0tPgorPGJvZHkgYmdjb2xvcj0id2hpdGUiIGJhY2tncm91bmQ9Ii4uL2ltYWdlcy9QYXBlclRleHR1cmUuZ2lmIj4KKworPCEtLUZvcm0gLS0+CisKKzxodG1sOmVycm9ycy8+CisKKzxodG1sOmZvcm0gbWV0aG9kPSJQT1NUIiBhY3Rpb249Ii9TYXZlU2VydmVyIiBmb2N1cz0icG9ydE51bWJlclRleHQiPgorICA8YmVhbjpkZWZpbmUgaWQ9InRoaXNPYmplY3ROYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgbmFtZT0ic2VydmVyRm9ybSIgcHJvcGVydHk9Im9iamVjdE5hbWUiLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJvYmplY3ROYW1lIi8+CisKKyAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CisgICAgPHRyIGNsYXNzPSJwYWdlLXRpdGxlLXJvdyI+CisgICAgICA8dGQgYWxpZ249ImxlZnQiIG5vd3JhcD4KKyAgICAgICAgPGRpdiBjbGFzcz0icGFnZS10aXRsZS10ZXh0Ij4KKyAgICAgICAgICAgPGJlYW46d3JpdGUgbmFtZT0ic2VydmVyRm9ybSIgcHJvcGVydHk9Im5vZGVMYWJlbCIvPgorICAgICAgICA8L2Rpdj4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQgYWxpZ249InJpZ2h0IiBub3dyYXA+CisgICAgICAgIDxkaXYgY2xhc3M9InBhZ2UtdGl0bGUtdGV4dCI+CisgICAgICAgIDxjb250cm9sczphY3Rpb25zIGxhYmVsPSJTZXJ2ZXIgQWN0aW9ucyI+CisgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbiBzZWxlY3RlZD0idHJ1ZSI+CisgICAgICAgICAgICAtLS0tPGJlYW46bWVzc2FnZSBrZXk9ImFjdGlvbnMuYXZhaWxhYmxlLmFjdGlvbnMiLz4tLS0tCisgICAgICAgICAgPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgIDxjb250cm9sczphY3Rpb24gdXJsPSc8JT0gIi9BZGRTZXJ2aWNlLmRvP3NlbGVjdD0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUodGhpc09iamVjdE5hbWUpICU+Jz4KKyAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJhY3Rpb25zLnNlcnZpY2VzLmNyZWF0ZSIvPgorICAgICAgICAgIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgIDxjb250cm9sczphY3Rpb24gdXJsPSc8JT0gIi9EZWxldGVTZXJ2aWNlLmRvP3NlbGVjdD0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUodGhpc09iamVjdE5hbWUpICU+Jz4KKyAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJhY3Rpb25zLnNlcnZpY2VzLmRlbGV0ZXMiLz4KKyAgICAgICAgICA8L2NvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgPC9jb250cm9sczphY3Rpb25zPgorICAgICAgICA8L2Rpdj4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgPC90YWJsZT4KKworICA8JUAgaW5jbHVkZSBmaWxlPSIuLi9idXR0b25zLmpzcCIgJT4KKyA8YnI+CisKKyAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CisgICAgPHRyPjx0ZD48ZGl2IGNsYXNzPSJ0YWJsZS10aXRsZS10ZXh0Ij4KKyAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJzZXJ2ZXIucHJvcGVydGllcyIvPgorICAgIDwvZGl2PjwvdGQ+PC90cj4KKyAgPC90YWJsZT4KKworICA8dGFibGUgY2xhc3M9ImJhY2stdGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIxIiB3aWR0aD0iMTAwJSI+CisgICAgPHRyPgorICAgICAgPHRkPgorICAgICAgICAgPGNvbnRyb2xzOnRhYmxlIHRhYmxlU3R5bGU9ImZyb250LXRhYmxlIiBsaW5lU3R5bGU9ImxpbmUtcm93Ij4KKyAgICAgICAgICA8Y29udHJvbHM6cm93IGhlYWRlcj0idHJ1ZSIKKyAgICAgICAgICAgICAgbGFiZWxTdHlsZT0idGFibGUtaGVhZGVyLXRleHQiIGRhdGFTdHlsZT0idGFibGUtaGVhZGVyLXRleHQiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0ic2VydmljZS5wcm9wZXJ0eSIvPgorICAgICAgICAgICAgPC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0ic2VydmljZS52YWx1ZSIvPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0icG9ydE51bWJlciI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9InNlcnZlci5wb3J0bnVtYmVyIi8+OjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgPGh0bWw6dGV4dCBwcm9wZXJ0eT0icG9ydE51bWJlclRleHQiIHNpemU9IjI0IiBtYXhsZW5ndGg9IjI0IiBzdHlsZUlkPSJwb3J0TnVtYmVyIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJzaHV0ZG93biI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9InNlcnZlci5zaHV0ZG93biIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgICA8aHRtbDp0ZXh0IHByb3BlcnR5PSJzaHV0ZG93blRleHQiIHNpemU9IjI0IiBtYXhsZW5ndGg9IjI0IiBzdHlsZUlkPSJzaHV0ZG93biIvPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKyAgICAgIDwvY29udHJvbHM6dGFibGU+CisKKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgPC90YWJsZT4KKworICA8JUAgaW5jbHVkZSBmaWxlPSIuLi9idXR0b25zLmpzcCIgJT4KKworPC9odG1sOmZvcm0+CisKKzwhLS0gU3RhbmRhcmQgRm9vdGVyIC0tPgorCis8JUAgaW5jbHVkZSBmaWxlPSIuLi9mb290ZXIuanNwIiAlPgorCis8L2JvZHk+CisKKzwvaHRtbDpodG1sPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vc2VydmljZS9zZXJ2aWNlLmpzcCBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3NlcnZpY2Uvc2VydmljZS5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFjZjA1MQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3NlcnZpY2Uvc2VydmljZS5qc3AKQEAgLTAsMCArMSwyNDQgQEAKKzwhLS0gU3RhbmRhcmQgU3RydXRzIEVudHJpZXMgLS0+CisKKzwlQCBwYWdlIGxhbmd1YWdlPSJqYXZhIiBpbXBvcnQ9ImphdmEubmV0LlVSTEVuY29kZXIiIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9zdHJ1dHMtYmVhbi50bGQiIHByZWZpeD0iYmVhbiIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9zdHJ1dHMtaHRtbC50bGQiIHByZWZpeD0iaHRtbCIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9zdHJ1dHMtbG9naWMudGxkIiBwcmVmaXg9ImxvZ2ljIiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL2NvbnRyb2xzLnRsZCIgcHJlZml4PSJjb250cm9scyIgJT4KKworPGh0bWw6aHRtbCBsb2NhbGU9InRydWUiPgorCis8JUAgaW5jbHVkZSBmaWxlPSIuLi91c2Vycy9oZWFkZXIuanNwIiAlPgorCis8IS0tIEJvZHkgLS0+Cis8Ym9keSBiZ2NvbG9yPSJ3aGl0ZSIgYmFja2dyb3VuZD0iLi4vaW1hZ2VzL1BhcGVyVGV4dHVyZS5naWYiPgorCis8IS0tRm9ybSAtLT4KKworPGh0bWw6ZXJyb3JzLz4KKworPGh0bWw6Zm9ybSBtZXRob2Q9IlBPU1QiIGFjdGlvbj0iL1NhdmVTZXJ2aWNlIj4KKworICA8YmVhbjpkZWZpbmUgaWQ9InNlcnZpY2VOYW1lIiBuYW1lPSJzZXJ2aWNlRm9ybSIgcHJvcGVydHk9InNlcnZpY2VOYW1lIi8+CisgIDxiZWFuOmRlZmluZSBpZD0idGhpc09iamVjdE5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICBuYW1lPSJzZXJ2aWNlRm9ybSIgcHJvcGVydHk9Im9iamVjdE5hbWUiLz4KKyAgPGJlYW46ZGVmaW5lIGlkPSJ0aGlzU2VydmljZU5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICBuYW1lPSJzZXJ2aWNlRm9ybSIgcHJvcGVydHk9InNlcnZpY2VOYW1lIi8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0iYWRtaW5TZXJ2aWNlTmFtZSIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9Im9iamVjdE5hbWUiLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJlbmdpbmVPYmplY3ROYW1lIi8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0iYWRtaW5BY3Rpb24iLz4KKyAgPGJlYW46ZGVmaW5lIGlkPSJhZG1pblNlcnZpY2VOYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgbmFtZT0ic2VydmljZUZvcm0iIHByb3BlcnR5PSJhZG1pblNlcnZpY2VOYW1lIi8+CisKKyAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CisgICAgPHRyIGNsYXNzPSJwYWdlLXRpdGxlLXJvdyI+CisgICAgICA8dGQgd2lkdGg9IjgxJSI+CisgICAgICAgIDxkaXYgY2xhc3M9InBhZ2UtdGl0bGUtdGV4dCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxsb2dpYzplcXVhbCBuYW1lPSJzZXJ2aWNlRm9ybSIgcHJvcGVydHk9ImFkbWluQWN0aW9uIiB2YWx1ZT0iQ3JlYXRlIj4KKyAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJhY3Rpb25zLnNlcnZpY2VzLmNyZWF0ZSIvPgorICAgICAgICAgIDwvbG9naWM6ZXF1YWw+CisgICAgICAgICAgPGxvZ2ljOmVxdWFsIG5hbWU9InNlcnZpY2VGb3JtIiBwcm9wZXJ0eT0iYWRtaW5BY3Rpb24iIHZhbHVlPSJFZGl0Ij4KKyAgICAgICAgICAgIDxiZWFuOndyaXRlIG5hbWU9InNlcnZpY2VGb3JtIiBwcm9wZXJ0eT0ibm9kZUxhYmVsIi8+CisgICAgICAgICAgPC9sb2dpYzplcXVhbD4KKyAgICAgICAgPC9kaXY+CisgICAgICA8L3RkPgorICAgICAgPHRkIGFsaWduPSJyaWdodCIgbm93cmFwPgorICAgICAgICA8ZGl2IGNsYXNzPSJwYWdlLXRpdGxlLXRleHQiPgorICAgICAgICAgIDxjb250cm9sczphY3Rpb25zIGxhYmVsPSJTZXJ2aWNlIEFjdGlvbnMiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbiBzZWxlY3RlZD0idHJ1ZSI+CisgICAgICAgICAgICAgIC0tLS0tPGJlYW46bWVzc2FnZSBrZXk9ImFjdGlvbnMuYXZhaWxhYmxlLmFjdGlvbnMiLz4tLS0tLQorICAgICAgICAgICAgPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9uIGRpc2FibGVkPSJ0cnVlIj4KKyAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgICA8bG9naWM6bm90RXF1YWwgbmFtZT0ic2VydmljZUZvcm0iIHByb3BlcnR5PSJhZG1pbkFjdGlvbiIgdmFsdWU9IkNyZWF0ZSI+CisgICAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24gdXJsPSc8JT0gIi9BZGRDb25uZWN0b3IuZG8/c2VsZWN0PSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHRoaXNPYmplY3ROYW1lKSAlPic+CisgICAgICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9ImFjdGlvbnMuY29ubmVjdG9ycy5jcmVhdGUiLz4KKyAgICAgICAgICAgICAgPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24gdXJsPSc8JT0gIi9EZWxldGVDb25uZWN0b3IuZG8/c2VsZWN0PSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHRoaXNPYmplY3ROYW1lKSU+Jz4KKyAgICAgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0iYWN0aW9ucy5jb25uZWN0b3JzLmRlbGV0ZXMiLz4KKyAgICAgICAgICAgICAgPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24+CisgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICA8L2NvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgICAgICAgPCEtLSBGSVhNRSBhZGQvcmVtb3ZlIGRlZmF1bHRjb250ZXh0LS0+Cis8JS0tCisgICAgICAgICAgICAgIDwhLS1jb250cm9sczphY3Rpb24gdXJsPSc8JT0gIi9BZGREZWZhdWx0Q29udGV4dC5kbz9zZXJ2aWNlTmFtZT0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZSh0aGlzT2JqZWN0TmFtZSkgJT4nPgorICAgICAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJhY3Rpb25zLmRlZmF1bHRjb250ZXh0cy5jcmVhdGUiLz4KKyAgICAgICAgICAgICAgPC9jb250cm9sczphY3Rpb24tLT4KKyAgICAgICAgICAgICAgPCEtLWNvbnRyb2xzOmFjdGlvbiB1cmw9JzwlPSAiL0RlbGV0ZURlZmF1bHRDb250ZXh0LmRvP3NlcnZpY2VOYW1lPSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHRoaXNPYmplY3ROYW1lKSAlPic+CisgICAgICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9ImFjdGlvbnMuZGVmYXVsdGNvbnRleHRzLmRlbGV0ZXMiLz4KKyAgICAgICAgICAgICAgPC9jb250cm9sczphY3Rpb24tLT4KKy0tJT4KKyAgICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbiBkaXNhYmxlZD0idHJ1ZSI+CisgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICA8L2NvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbiB1cmw9JzwlPSAiL0FkZEhvc3QuZG8/c2VsZWN0PSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHRoaXNPYmplY3ROYW1lKSAlPic+CisgICAgICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9ImFjdGlvbnMuaG9zdHMuY3JlYXRlIi8+CisgICAgICAgICAgICAgIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9uIHVybD0nPCU9ICIvRGVsZXRlSG9zdC5kbz9zZWxlY3Q9IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUodGhpc09iamVjdE5hbWUpICU+Jz4KKyAgICAgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0iYWN0aW9ucy5ob3N0cy5kZWxldGVzIi8+CisgICAgICAgICAgICAgIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9uIGRpc2FibGVkPSJ0cnVlIj4KKyAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgICAgPCUtLSBjYW5ub3QgZGVsZXRlIG9yIGFkZCBhIFJlYWxtIGZvciB0aGUgc2VydmljZSB0aGUgYWRtaW4gYXBwIHJ1bnMgb24gLS0lPgorICAgICAgICAgICAgICA8bG9naWM6bm90RXF1YWwgbmFtZT0ic2VydmljZU5hbWUiIHZhbHVlPSc8JT0gYWRtaW5TZXJ2aWNlTmFtZSAlPic+CisgICAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24gZGlzYWJsZWQ9InRydWUiPgorICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAgPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgICAgIDwlLS0KKyAgICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbiB1cmw9JzwlPSAiL0FkZFJlYWxtLmRvP3BhcmVudD0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZSh0aGlzT2JqZWN0TmFtZSkgJT4nPgorICAgICAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJhY3Rpb25zLnJlYWxtcy5jcmVhdGUiLz4KKyAgICAgICAgICAgICA8L2NvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9uIHVybD0nPCU9ICIvRGVsZXRlUmVhbG0uZG8/cGFyZW50PSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHRoaXNPYmplY3ROYW1lKSAlPic+CisgICAgICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9ImFjdGlvbnMucmVhbG1zLmRlbGV0ZXMiLz4KKyAgICAgICAgICAgICAgPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgICAgIC0tJT4KKyAgICAgICAgICAgICAgPC9sb2dpYzpub3RFcXVhbD4KKyAgICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbiBkaXNhYmxlZD0idHJ1ZSI+CisgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICA8L2NvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbiB1cmw9JzwlPSAiL0FkZFZhbHZlLmRvP3BhcmVudD0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZSh0aGlzT2JqZWN0TmFtZSkgJT4nPgorICAgICAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJhY3Rpb25zLnZhbHZlcy5jcmVhdGUiLz4KKyAgICAgICAgICAgICAgPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24gdXJsPSc8JT0gIi9EZWxldGVWYWx2ZS5kbz9wYXJlbnQ9IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUodGhpc09iamVjdE5hbWUpICU+Jz4KKyAgICAgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0iYWN0aW9ucy52YWx2ZXMuZGVsZXRlcyIvPgorICAgICAgICAgICAgICAgPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgICAgICA8JS0tIGNhbm5vdCBkZWxldGUgdGhlIHNlcnZpY2UgdGhlIGFkbWluIGFwcCBydW5zIG9uIC0tJT4KKyAgICAgICAgICAgICAgIDxsb2dpYzpub3RFcXVhbCBuYW1lPSJzZXJ2aWNlTmFtZSIgdmFsdWU9JzwlPSBhZG1pblNlcnZpY2VOYW1lICU+Jz4KKyAgICAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24gZGlzYWJsZWQ9InRydWUiPgorICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAgICA8L2NvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbiB1cmw9JzwlPSAiL0RlbGV0ZVNlcnZpY2UuZG8/c2VsZWN0PSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHRoaXNPYmplY3ROYW1lKSAlPic+CisgICAgICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9ImFjdGlvbnMuc2VydmljZXMuZGVsZXRlIi8+CisgICAgICAgICAgICAgIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgICA8L2xvZ2ljOm5vdEVxdWFsPgorICAgICAgICAgICAgPC9sb2dpYzpub3RFcXVhbD4KKyAgICAgICAgICA8L2NvbnRyb2xzOmFjdGlvbnM+CisgICAgICAgIDwvZGl2PgorICAgICAgPC90ZD4KKyAgICA8L3RyPgorICA8L3RhYmxlPgorCisgIDwlQCBpbmNsdWRlIGZpbGU9Ii4uL2J1dHRvbnMuanNwIiAlPgorCisgIDwlLS0gU2VydmljZSBQcm9wZXJ0aWVzIC0tJT4KKworICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KKyAgICA8dHI+PHRkPjxkaXYgY2xhc3M9InRhYmxlLXRpdGxlLXRleHQiPgorICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InNlcnZpY2UucHJvcGVydGllcyIvPgorICAgIDwvZGl2PjwvdGQ+PC90cj4KKyAgPC90YWJsZT4KKworICA8dGFibGUgY2xhc3M9ImJhY2stdGFibGUiIGJvcmRlcj0iMCIKKyAgICAgICAgIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMSIgd2lkdGg9IjEwMCUiPgorICAgIDx0cj4KKyAgICAgIDx0ZD4KKyAgICAgICAgPGNvbnRyb2xzOnRhYmxlIHRhYmxlU3R5bGU9ImZyb250LXRhYmxlIiBsaW5lU3R5bGU9ImxpbmUtcm93Ij4KKyAgICAgICAgICA8Y29udHJvbHM6cm93IGhlYWRlcj0idHJ1ZSIKKyAgICAgICAgICAgICAgbGFiZWxTdHlsZT0idGFibGUtaGVhZGVyLXRleHQiIGRhdGFTdHlsZT0idGFibGUtaGVhZGVyLXRleHQiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0ic2VydmljZS5wcm9wZXJ0eSIvPgorICAgICAgICAgICAgPC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0ic2VydmljZS52YWx1ZSIvPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICAgIDwvY29udHJvbHM6cm93PgorICAgICAgICAgIDxjb250cm9sczpyb3cgaGVhZGVyPSJmYWxzZSIKKyAgICAgICAgICAgICAgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0ic2VydmljZU5hbWUiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0ic2VydmljZS5uYW1lIi8+OgorICAgICAgICAgICAgPC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICA8bG9naWM6ZXF1YWwgbmFtZT0ic2VydmljZUZvcm0iIHByb3BlcnR5PSJhZG1pbkFjdGlvbiIgdmFsdWU9IkNyZWF0ZSI+CisgICAgICAgICAgICAgICAgPGh0bWw6dGV4dCBwcm9wZXJ0eT0ic2VydmljZU5hbWUiIHNpemU9IjUwIiBtYXhsZW5ndGg9IjUwIiBzdHlsZUlkPSJzZXJ2aWNlTmFtZSIvPgorICAgICAgICAgICAgICA8L2xvZ2ljOmVxdWFsPgorICAgICAgICAgICAgICA8bG9naWM6ZXF1YWwgbmFtZT0ic2VydmljZUZvcm0iIHByb3BlcnR5PSJhZG1pbkFjdGlvbiIgdmFsdWU9IkVkaXQiPgorICAgICAgICAgICAgICAgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0ic2VydmljZU5hbWUiLz4KKyAgICAgICAgICAgICAgICA8YmVhbjp3cml0ZSBuYW1lPSJzZXJ2aWNlRm9ybSIgcHJvcGVydHk9InNlcnZpY2VOYW1lIi8+CisgICAgICAgICAgICAgIDwvbG9naWM6ZXF1YWw+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgICAgPC9jb250cm9sczpyb3c+CisgICAgICAgIDwvY29udHJvbHM6dGFibGU+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgIDwvdGFibGU+CisKKyAgPGJyPgorCisgIDwlLS0gRW5naW5lIFByb3BlcnRpZXMgLS0lPgorCisgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgorICAgIDx0cj48dGQ+PGRpdiBjbGFzcz0idGFibGUtdGl0bGUtdGV4dCI+CisgICAgICA8YmVhbjptZXNzYWdlIGtleT0ic2VydmljZS5lbmdpbmUucHJvcHMiLz4KKyAgICA8L2Rpdj48L3RkPjwvdHI+CisgIDwvdGFibGU+CisKKyAgPHRhYmxlIGNsYXNzPSJiYWNrLXRhYmxlIiBib3JkZXI9IjAiCisgICAgICAgICBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjEiIHdpZHRoPSIxMDAlIj4KKyAgICA8dHI+CisgICAgICA8dGQ+CisgICAgICAgIDxjb250cm9sczp0YWJsZSB0YWJsZVN0eWxlPSJmcm9udC10YWJsZSIgbGluZVN0eWxlPSJsaW5lLXJvdyI+CisgICAgICAgICAgPGNvbnRyb2xzOnJvdyBoZWFkZXI9InRydWUiCisgICAgICAgICAgICAgIGxhYmVsU3R5bGU9InRhYmxlLWhlYWRlci10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLWhlYWRlci10ZXh0Ij4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InNlcnZpY2UucHJvcGVydHkiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InNlcnZpY2UudmFsdWUiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKyAgICAgICAgICA8Y29udHJvbHM6cm93IGhlYWRlcj0iZmFsc2UiCisgICAgICAgICAgICAgIGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9ImVuZ2luZU5hbWUiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0ic2VydmljZS5uYW1lIi8+OgorICAgICAgICAgICAgPC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICA8bG9naWM6ZXF1YWwgbmFtZT0ic2VydmljZUZvcm0iIHByb3BlcnR5PSJhZG1pbkFjdGlvbiIgdmFsdWU9IkNyZWF0ZSI+CisgICAgICAgICAgICAgICAgPGh0bWw6dGV4dCBwcm9wZXJ0eT0iZW5naW5lTmFtZSIgc2l6ZT0iNTAiIG1heGxlbmd0aD0iNTAiIHN0eWxlSWQ9ImVuZ2luZU5hbWUiLz4KKyAgICAgICAgICAgICAgPC9sb2dpYzplcXVhbD4KKyAgICAgICAgICAgICAgPGxvZ2ljOmVxdWFsIG5hbWU9InNlcnZpY2VGb3JtIiBwcm9wZXJ0eT0iYWRtaW5BY3Rpb24iIHZhbHVlPSJFZGl0Ij4KKyAgICAgICAgICAgICAgICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9ImVuZ2luZU5hbWUiLz4KKyAgICAgICAgICAgICAgICA8YmVhbjp3cml0ZSBuYW1lPSJzZXJ2aWNlRm9ybSIgcHJvcGVydHk9ImVuZ2luZU5hbWUiLz4KKyAgICAgICAgICAgICAgPC9sb2dpYzplcXVhbD4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKyAgICAgICAgICA8Y29udHJvbHM6cm93IGhlYWRlcj0iZmFsc2UiCisgICAgICAgICAgICAgIGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9Imhvc3ROYW1lVmFscyI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJzZXJ2aWNlLmRlZmF1bHRob3N0bmFtZSIvPjoKKyAgICAgICAgICAgIDwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgPGJlYW46ZGVmaW5lIGlkPSJob3N0TmFtZVZhbHMiIG5hbWU9InNlcnZpY2VGb3JtIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHk9Imhvc3ROYW1lVmFscyIvPgorICAgICAgICAgICAgICA8aHRtbDpzZWxlY3QgcHJvcGVydHk9ImRlZmF1bHRIb3N0IiBzdHlsZUlkPSJob3N0TmFtZVZhbHMiPgorICAgICAgICAgICAgICAgIDxodG1sOm9wdGlvbnMgY29sbGVjdGlvbj0iaG9zdE5hbWVWYWxzIiBwcm9wZXJ0eT0idmFsdWUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbFByb3BlcnR5PSJsYWJlbCIvPgorICAgICAgICAgICAgICA8L2h0bWw6c2VsZWN0PgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICAgIDwvY29udHJvbHM6cm93PgorICAgICAgICA8L2NvbnRyb2xzOnRhYmxlPgorICAgICAgPC90ZD4KKyAgICA8L3RyPgorICA8L3RhYmxlPgorCisgIDxicj4KKworICA8JUAgaW5jbHVkZSBmaWxlPSIuLi9idXR0b25zLmpzcCIgJT4KKworPC9odG1sOmZvcm0+Cis8L2JvZHk+Cis8L2h0bWw6aHRtbD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3NlcnZpY2Uvc2VydmljZXMuanNwIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vc2VydmljZS9zZXJ2aWNlcy5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTcxY2IxNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3NlcnZpY2Uvc2VydmljZXMuanNwCkBAIC0wLDAgKzEsMTA1IEBACis8IS0tIFN0YW5kYXJkIFN0cnV0cyBFbnRyaWVzIC0tPgorPCVAIHBhZ2UgbGFuZ3VhZ2U9ImphdmEiIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9zdHJ1dHMtYmVhbi50bGQiIHByZWZpeD0iYmVhbiIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9zdHJ1dHMtaHRtbC50bGQiIHByZWZpeD0iaHRtbCIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9zdHJ1dHMtbG9naWMudGxkIiBwcmVmaXg9ImxvZ2ljIiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL2NvbnRyb2xzLnRsZCIgcHJlZml4PSJjb250cm9scyIgJT4KKworPGh0bWw6aHRtbCBsb2NhbGU9InRydWUiPgorCis8JUAgaW5jbHVkZSBmaWxlPSIuLi91c2Vycy9oZWFkZXIuanNwIiAlPgorCis8IS0tIEJvZHkgLS0+Cis8Ym9keSBiZ2NvbG9yPSJ3aGl0ZSIgYmFja2dyb3VuZD0iLi4vaW1hZ2VzL1BhcGVyVGV4dHVyZS5naWYiPgorCis8IS0tRm9ybSAtLT4KKworPGh0bWw6ZXJyb3JzLz4KKworPGh0bWw6Zm9ybSBtZXRob2Q9InBvc3QiIGFjdGlvbj0iL0RlbGV0ZVNlcnZpY2VzIj4KKworICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KKyAgICA8dHIgYmdjb2xvcj0iNzE3MUE1Ij4KKyAgICAgIDx0ZCB3aWR0aD0iODElIj4KKyAgICAgICAgPGRpdiBjbGFzcz0icGFnZS10aXRsZS10ZXh0IiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9ImFjdGlvbnMuc2VydmljZXMuZGVsZXRlIi8+CisgICAgICAgIDwvZGl2PgorICAgICAgPC90ZD4KKyAgICAgIDx0ZCBhbGlnbj0icmlnaHQiIG5vd3JhcD4KKyAgICAgICAgPGRpdiBjbGFzcz0icGFnZS10aXRsZS10ZXh0Ij4gICAgICAgIAorICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbnMgbGFiZWw9IlNlcnZpY2UgQWN0aW9ucyI+CisgICAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24gc2VsZWN0ZWQ9InRydWUiPgorICAgICAgICAgICAgICAgIC0tLS08YmVhbjptZXNzYWdlIGtleT0iYWN0aW9ucy5hdmFpbGFibGUuYWN0aW9ucyIvPi0tLS0KKyAgICAgICAgICAgICAgPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24+CisgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgPC9jb250cm9sczphY3Rpb25zPgorICAgICAgICA8L2Rpdj4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgPC90YWJsZT4KKworPCVAIGluY2x1ZGUgZmlsZT0iLi4vYnV0dG9ucy5qc3AiICU+CisgIDxicj4KKworICA8JS0tIFNlcnZpY2VzIExpc3QgLS0lPgorCisgIDx0YWJsZSBjbGFzcz0iYmFjay10YWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjEiCisgICAgICAgICB3aWR0aD0iMTAwJSI+CisgICAgPHRyPjx0ZD4KKworICAgICAgPHRhYmxlIGNsYXNzPSJmcm9udC10YWJsZSIgYm9yZGVyPSIxIgorICAgICAgIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgorCisgICAgICAgIDx0ciBjbGFzcz0iaGVhZGVyLXJvdyI+CisgICAgICAgICAgPHRkPjxkaXYgYWxpZ249ImxlZnQiIGNsYXNzPSJ0YWJsZS1oZWFkZXItdGV4dCI+CisgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0iYWN0aW9ucy5kZWxldGUiLz4KKyAgICAgICAgICA8L2Rpdj48L3RkPgorICAgICAgICAgIDx0ZD48ZGl2IGFsaWduPSJsZWZ0IiBjbGFzcz0idGFibGUtaGVhZGVyLXRleHQiPgorICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9Imhvc3QubmFtZSIvPgorICAgICAgICAgIDwvZGl2PjwvdGQ+CisgICAgICAgIDwvdHI+CisKKyAgICAgICAgPGxvZ2ljOml0ZXJhdGUgbmFtZT0ic2VydmljZXNMaXN0IiBpZD0ic2VydmljZSI+CisgICAgICAgICAgPHRyIGNsYXNzPSJsaW5lLXJvdyI+CisgICAgICAgICAgICA8dGQ+PGRpdiBhbGlnbj0ibGVmdCIgY2xhc3M9InRhYmxlLW5vcm1hbC10ZXh0Ij4mbmJzcDsKKyAgICAgICAgICAgICA8bG9naWM6bWF0Y2ggbmFtZT0ic2VydmljZSIKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSc8JT0gKFN0cmluZylyZXF1ZXN0LmdldEF0dHJpYnV0ZSgiYWRtaW5BcHBTZXJ2aWNlIikgJT4nPgorICAgICAgICAgICAgIDxmb250IGNvbG9yPSdyZWQnPio8L2ZvbnQ+CisgICAgICAgICAgICAgPC9sb2dpYzptYXRjaD4KKyAgICAgICAgICAgICA8bG9naWM6bm90TWF0Y2ggbmFtZT0ic2VydmljZSIKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSc8JT0gKFN0cmluZylyZXF1ZXN0LmdldEF0dHJpYnV0ZSgiYWRtaW5BcHBTZXJ2aWNlIikgJT4nPgorICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJzZXJ2aWNlcyI+PC9sYWJlbD4gICAgICAgICAgCisgICAgICAgICAgICAgIDxodG1sOm11bHRpYm94IHByb3BlcnR5PSJzZXJ2aWNlcyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9IjwlPSBzZXJ2aWNlLnRvU3RyaW5nKCkgJT4iIHN0eWxlSWQ9InNlcnZpY2VzIiBzdHlsZUlkPSJzZXJ2aWNlcyIvPgorICAgICAgICAgICAgICA8L2xvZ2ljOm5vdE1hdGNoPgorICAgICAgICAgICAgPC9kaXY+PC90ZD4KKyAgICAgICAgICAgIDx0ZD48ZGl2IGFsaWduPSJsZWZ0IiBjbGFzcz0idGFibGUtbm9ybWFsLXRleHQiPiZuYnNwOworICAgICAgICAgICAgICA8aHRtbDpsaW5rIHBhZ2U9JzwlPSAiL0VkaXRTZXJ2aWNlLmRvP3NlbGVjdD0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLm5ldC5VUkxFbmNvZGVyLmVuY29kZShzZXJ2aWNlLnRvU3RyaW5nKCkpICU+Jz4KKyAgICAgICAgICAgICAgICA8Y29udHJvbHM6YXR0cmlidXRlIG5hbWU9InNlcnZpY2UiIGF0dHJpYnV0ZT0ibmFtZSIvPgorICAgICAgICAgICAgICA8L2h0bWw6bGluaz4KKyAgICAgICAgICAgIDwvZGl2PjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC9sb2dpYzppdGVyYXRlPgorCisgICAgICA8L3RhYmxlPgorCisgICAgPC90ZD48L3RyPgorICA8L3RhYmxlPgorCis8YnI+Cis8Zm9udCBjb2xvcj0ncmVkJz4gKiA8L2ZvbnQ+CitDYW5ub3QgZGVsZXRlIHRoZSBzZXJ2aWNlIHRoZSBhZG1pbiBhcHBsaWNhdGlvbiBpcyBydW5uaW5nIG9uLgorCis8YnI+CisKKzwlQCBpbmNsdWRlIGZpbGU9Ii4uL2J1dHRvbnMuanNwIiAlPgorCisgIDxicj4KKzwvaHRtbDpmb3JtPgorCis8cD4mbmJzcDs8L3A+Cis8L2JvZHk+Cis8L2h0bWw6aHRtbD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3RyZWUtY29udHJvbC10ZXN0LmNzcyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3RyZWUtY29udHJvbC10ZXN0LmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTU0NjZhCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vdHJlZS1jb250cm9sLXRlc3QuY3NzCkBAIC0wLDAgKzEsMTkgQEAKKy50cmVlLWNvbnRyb2wgeworICBmb250LWZhbWlseTogYXJpYWwsIHZlcmRhbmEsIGdlbmV2YSwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOworICBmb250LXNpemU6IDgwJTsKKyAgbGluZS1oZWlnaHQ6IDEuMDsKK30KKworLnRyZWUtY29udHJvbC1zZWxlY3RlZCB7CisgIGNvbG9yOiBibGFjazsKKyAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKK30KKworLnRyZWUtY29udHJvbC11bnNlbGVjdGVkIHsKKyAgY29sb3I6IGJsYWNrOworICBmb250LXN0eWxlOiBub3JtYWw7CisgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CisgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKK30KKwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vdHJlZS1jb250cm9sLXRlc3QuanNwIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vdHJlZS1jb250cm9sLXRlc3QuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmYzVlMjEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi90cmVlLWNvbnRyb2wtdGVzdC5qc3AKQEAgLTAsMCArMSwzNSBAQAorPCEtLSBTdGFuZGFyZCBTdHJ1dHMgRW50cmllcyAtLT4KKworPCVAIHBhZ2UgbGFuZ3VhZ2U9ImphdmEiIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9zdHJ1dHMtYmVhbi50bGQiIHByZWZpeD0iYmVhbiIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9zdHJ1dHMtaHRtbC50bGQiIHByZWZpeD0iaHRtbCIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9zdHJ1dHMtbG9naWMudGxkIiBwcmVmaXg9ImxvZ2ljIiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL2NvbnRyb2xzLnRsZCIgcHJlZml4PSJjb250cm9scyIgJT4KKworPGh0bWw6aHRtbCBsb2NhbGU9InRydWUiPgorCis8IS0tIFN0YW5kYXJkIENvbnRlbnQgLS0+CisKKzwlQCBpbmNsdWRlIGZpbGU9ImhlYWRlci5qc3AiICU+CisKKzwhLS0gQm9keSAtLT4KKworPGJvZHkgYmdjb2xvcj0id2hpdGUiPgorCis8IS0tIFRyZWUgQ29tcG9uZW50IC0tPgorCis8dGQgd2lkdGg9IjIwMCI+CisgIDxjb250cm9sczp0cmVlIHRyZWU9InRyZWVDb250cm9sVGVzdCIKKyAgICAgICAgICAgICAgIGFjdGlvbj0idHJlZUNvbnRyb2xUZXN0LmRvP3RyZWU9JHtuYW1lfSIKKyAgICAgICAgICAgICAgICBzdHlsZT0idHJlZS1jb250cm9sIgorICAgICAgICBzdHlsZVNlbGVjdGVkPSJ0cmVlLWNvbnRyb2wtc2VsZWN0ZWQiCisgICAgICBzdHlsZVVuc2VsZWN0ZWQ9InRyZWUtY29udHJvbC11bnNlbGVjdGVkIgorICAvPgorCis8L2JvZHk+CisKKzwhLS0gU3RhbmRhcmQgRm9vdGVyIC0tPgorCis8JUAgaW5jbHVkZSBmaWxlPSJmb290ZXIuanNwIiAlPgorCis8L2h0bWw6aHRtbD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3VzZXJzL2RlbGV0ZUdyb3Vwcy5qc3AgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi91c2Vycy9kZWxldGVHcm91cHMuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmMzZjNGMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi91c2Vycy9kZWxldGVHcm91cHMuanNwCkBAIC0wLDAgKzEsNTIgQEAKKzwhLS0gU3RhbmRhcmQgU3RydXRzIEVudHJpZXMgLS0+Cis8JUAgcGFnZSBsYW5ndWFnZT0iamF2YSIgaW1wb3J0PSJqYXZhLm5ldC5VUkxFbmNvZGVyIiBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgiICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvc3RydXRzLWJlYW4udGxkIiBwcmVmaXg9ImJlYW4iICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvc3RydXRzLWh0bWwudGxkIiBwcmVmaXg9Imh0bWwiICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvc3RydXRzLWxvZ2ljLnRsZCIgcHJlZml4PSJsb2dpYyIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9jb250cm9scy50bGQiIHByZWZpeD0iY29udHJvbHMiICU+CisKKzxodG1sOmh0bWwgbG9jYWxlPSJ0cnVlIj4KKworPCVAIGluY2x1ZGUgZmlsZT0iaGVhZGVyLmpzcCIgJT4KKworPCEtLSBCb2R5IC0tPgorPGJvZHkgYmdjb2xvcj0id2hpdGUiIGJhY2tncm91bmQ9Ii4uL2ltYWdlcy9QYXBlclRleHR1cmUuZ2lmIj4KKworPCEtLUZvcm0gLS0+CisKKzxodG1sOmVycm9ycy8+CisKKzxodG1sOmZvcm0gYWN0aW9uPSIvdXNlcnMvbGlzdEdyb3VwcyI+CisKKyAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CisgICAgPHRyIGJnY29sb3I9IjcxNzFBNSI+CisgICAgICA8dGQgd2lkdGg9IjgxJSI+CisgICAgICAgIDxkaXYgY2xhc3M9InBhZ2UtdGl0bGUtdGV4dCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJ1c2Vycy5kZWxldGVHcm91cHMudGl0bGUiLz4KKyAgICAgICAgPC9kaXY+CisgICAgICA8L3RkPgorICAgICAgPHRkIHdpZHRoPSIxOSUiPgorICAgICAgICA8ZGl2IGFsaWduPSJyaWdodCI+CisgICAgICAgICAgPCVAIGluY2x1ZGUgZmlsZT0ibGlzdEdyb3Vwcy5qc3BmIiAlPgorICAgICAgICA8L2Rpdj4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgPC90YWJsZT4KKworPC9odG1sOmZvcm0+CisKKzxicj4KKzxiZWFuOmRlZmluZSBpZD0iY2hlY2tib3hlcyIgc2NvcGU9InBhZ2UiIHZhbHVlPSJ0cnVlIi8+Cis8aHRtbDpmb3JtIGFjdGlvbj0iL3VzZXJzL2RlbGV0ZUdyb3VwcyI+CisgIDwlQCBpbmNsdWRlIGZpbGU9Ii4uL2J1dHRvbnMuanNwIiAlPgorICA8YnI+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0iZGF0YWJhc2VOYW1lIi8+CisgIDwlQCBpbmNsdWRlIGZpbGU9Imdyb3Vwcy5qc3BmIiAlPgorICA8JUAgaW5jbHVkZSBmaWxlPSIuLi9idXR0b25zLmpzcCIgJT4KKzwvaHRtbDpmb3JtPgorPGJyPgorCis8JUAgaW5jbHVkZSBmaWxlPSJmb290ZXIuanNwIiAlPgorCis8L2JvZHk+Cis8L2h0bWw6aHRtbD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3VzZXJzL2RlbGV0ZVJvbGVzLmpzcCBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3VzZXJzL2RlbGV0ZVJvbGVzLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGRlMDY4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vdXNlcnMvZGVsZXRlUm9sZXMuanNwCkBAIC0wLDAgKzEsNTIgQEAKKzwhLS0gU3RhbmRhcmQgU3RydXRzIEVudHJpZXMgLS0+Cis8JUAgcGFnZSBsYW5ndWFnZT0iamF2YSIgaW1wb3J0PSJqYXZhLm5ldC5VUkxFbmNvZGVyIiBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgiICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvc3RydXRzLWJlYW4udGxkIiBwcmVmaXg9ImJlYW4iICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvc3RydXRzLWh0bWwudGxkIiBwcmVmaXg9Imh0bWwiICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvc3RydXRzLWxvZ2ljLnRsZCIgcHJlZml4PSJsb2dpYyIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9jb250cm9scy50bGQiIHByZWZpeD0iY29udHJvbHMiICU+CisKKzxodG1sOmh0bWwgbG9jYWxlPSJ0cnVlIj4KKworPCVAIGluY2x1ZGUgZmlsZT0iaGVhZGVyLmpzcCIgJT4KKworPCEtLSBCb2R5IC0tPgorPGJvZHkgYmdjb2xvcj0id2hpdGUiIGJhY2tncm91bmQ9Ii4uL2ltYWdlcy9QYXBlclRleHR1cmUuZ2lmIj4KKworPCEtLUZvcm0gLS0+CisKKzxodG1sOmVycm9ycy8+CisKKzxodG1sOmZvcm0gYWN0aW9uPSIvdXNlcnMvbGlzdFJvbGVzIj4KKworICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KKyAgICA8dHIgYmdjb2xvcj0iNzE3MUE1Ij4KKyAgICAgIDx0ZCB3aWR0aD0iODElIj4KKyAgICAgICAgPGRpdiBjbGFzcz0icGFnZS10aXRsZS10ZXh0IiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InVzZXJzLmRlbGV0ZVJvbGVzLnRpdGxlIi8+CisgICAgICAgIDwvZGl2PgorICAgICAgPC90ZD4KKyAgICAgIDx0ZCB3aWR0aD0iMTklIj4KKyAgICAgICAgPGRpdiBhbGlnbj0icmlnaHQiPgorICAgICAgICAgIDwlQCBpbmNsdWRlIGZpbGU9Imxpc3RSb2xlcy5qc3BmIiAlPgorICAgICAgICA8L2Rpdj4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgPC90YWJsZT4KKworPC9odG1sOmZvcm0+CisKKzxicj4KKzxiZWFuOmRlZmluZSBpZD0iY2hlY2tib3hlcyIgc2NvcGU9InBhZ2UiIHZhbHVlPSJ0cnVlIi8+Cis8aHRtbDpmb3JtIGFjdGlvbj0iL3VzZXJzL2RlbGV0ZVJvbGVzIj4KKyAgPCVAIGluY2x1ZGUgZmlsZT0iLi4vYnV0dG9ucy5qc3AiICU+CisgIDxicj4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJkYXRhYmFzZU5hbWUiLz4KKyAgPCVAIGluY2x1ZGUgZmlsZT0icm9sZXMuanNwZiIgJT4KKyAgPCVAIGluY2x1ZGUgZmlsZT0iLi4vYnV0dG9ucy5qc3AiICU+Cis8L2h0bWw6Zm9ybT4KKzxicj4KKworPCVAIGluY2x1ZGUgZmlsZT0iZm9vdGVyLmpzcCIgJT4KKworPC9ib2R5PgorPC9odG1sOmh0bWw+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi91c2Vycy9kZWxldGVVc2Vycy5qc3AgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi91c2Vycy9kZWxldGVVc2Vycy5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVmMjExMAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3VzZXJzL2RlbGV0ZVVzZXJzLmpzcApAQCAtMCwwICsxLDUyIEBACis8IS0tIFN0YW5kYXJkIFN0cnV0cyBFbnRyaWVzIC0tPgorPCVAIHBhZ2UgbGFuZ3VhZ2U9ImphdmEiIGltcG9ydD0iamF2YS5uZXQuVVJMRW5jb2RlciIgY29udGVudFR5cGU9InRleHQvaHRtbDtjaGFyc2V0PXV0Zi04IiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL3N0cnV0cy1iZWFuLnRsZCIgcHJlZml4PSJiZWFuIiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL3N0cnV0cy1odG1sLnRsZCIgcHJlZml4PSJodG1sIiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL3N0cnV0cy1sb2dpYy50bGQiIHByZWZpeD0ibG9naWMiICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvY29udHJvbHMudGxkIiBwcmVmaXg9ImNvbnRyb2xzIiAlPgorCis8aHRtbDpodG1sIGxvY2FsZT0idHJ1ZSI+CisKKzwlQCBpbmNsdWRlIGZpbGU9ImhlYWRlci5qc3AiICU+CisKKzwhLS0gQm9keSAtLT4KKzxib2R5IGJnY29sb3I9IndoaXRlIiBiYWNrZ3JvdW5kPSIuLi9pbWFnZXMvUGFwZXJUZXh0dXJlLmdpZiI+CisKKzwhLS1Gb3JtIC0tPgorCis8aHRtbDplcnJvcnMvPgorCis8aHRtbDpmb3JtIGFjdGlvbj0iL3VzZXJzL2xpc3RVc2VycyI+CisKKyAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CisgICAgPHRyIGJnY29sb3I9IjcxNzFBNSI+CisgICAgICA8dGQgd2lkdGg9IjgxJSI+CisgICAgICAgIDxkaXYgY2xhc3M9InBhZ2UtdGl0bGUtdGV4dCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJ1c2Vycy5kZWxldGVVc2Vycy50aXRsZSIvPgorICAgICAgICA8L2Rpdj4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQgd2lkdGg9IjE5JSI+CisgICAgICAgIDxkaXYgYWxpZ249InJpZ2h0Ij4KKyAgICAgICAgICA8JUAgaW5jbHVkZSBmaWxlPSJsaXN0VXNlcnMuanNwZiIgJT4KKyAgICAgICAgPC9kaXY+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgIDwvdGFibGU+CisKKzwvaHRtbDpmb3JtPgorCis8YnI+Cis8YmVhbjpkZWZpbmUgaWQ9ImNoZWNrYm94ZXMiIHNjb3BlPSJwYWdlIiB2YWx1ZT0idHJ1ZSIvPgorPGh0bWw6Zm9ybSBhY3Rpb249Ii91c2Vycy9kZWxldGVVc2VycyI+CisgIDwlQCBpbmNsdWRlIGZpbGU9Ii4uL2J1dHRvbnMuanNwIiAlPgorICA8YnI+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0iZGF0YWJhc2VOYW1lIi8+CisgIDwlQCBpbmNsdWRlIGZpbGU9InVzZXJzLmpzcGYiICU+CisgIDwlQCBpbmNsdWRlIGZpbGU9Ii4uL2J1dHRvbnMuanNwIiAlPgorPC9odG1sOmZvcm0+Cis8YnI+CisKKzwlQCBpbmNsdWRlIGZpbGU9ImZvb3Rlci5qc3AiICU+CisKKzwvYm9keT4KKzwvaHRtbDpodG1sPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vdXNlcnMvZm9vdGVyLmpzcCBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3VzZXJzL2Zvb3Rlci5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3VzZXJzL2Zvb3Rlci5qc3AKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3VzZXJzL2dyb3VwLmpzcCBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3VzZXJzL2dyb3VwLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2EzZjg0Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vdXNlcnMvZ3JvdXAuanNwCkBAIC0wLDAgKzEsMTI0IEBACis8IS0tIFN0YW5kYXJkIFN0cnV0cyBFbnRyaWVzIC0tPgorCis8JUAgcGFnZSBsYW5ndWFnZT0iamF2YSIgaW1wb3J0PSJqYXZhLm5ldC5VUkxFbmNvZGVyIiBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgiICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvc3RydXRzLWJlYW4udGxkIiBwcmVmaXg9ImJlYW4iICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvc3RydXRzLWh0bWwudGxkIiBwcmVmaXg9Imh0bWwiICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvc3RydXRzLWxvZ2ljLnRsZCIgcHJlZml4PSJsb2dpYyIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9jb250cm9scy50bGQiIHByZWZpeD0iY29udHJvbHMiICU+CisKKzxodG1sOmh0bWwgbG9jYWxlPSJ0cnVlIj4KKworPCVAIGluY2x1ZGUgZmlsZT0iaGVhZGVyLmpzcCIgJT4KKworPCEtLSBCb2R5IC0tPgorPGJvZHkgYmdjb2xvcj0id2hpdGUiIGJhY2tncm91bmQ9Ii4uL2ltYWdlcy9QYXBlclRleHR1cmUuZ2lmIj4KKworPCEtLUZvcm0gLS0+CisKKzxodG1sOmVycm9ycy8+CisKKzxodG1sOmZvcm0gbWV0aG9kPSJQT1NUIiBhY3Rpb249Ii91c2Vycy9zYXZlR3JvdXAiPiA8IS0tZm9jdXM9Imdyb3VwbmFtZSItLT4KKworICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9ImRhdGFiYXNlTmFtZSIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9Im9iamVjdE5hbWUiLz4KKworICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KKyAgICA8dHIgY2xhc3M9InBhZ2UtdGl0bGUtcm93Ij4KKyAgICAgIDx0ZCBhbGlnbj0ibGVmdCIgbm93cmFwPgorICAgICAgICA8ZGl2IGNsYXNzPSJwYWdlLXRpdGxlLXRleHQiPgorICAgICAgICAgIDxiZWFuOndyaXRlIG5hbWU9Imdyb3VwRm9ybSIgcHJvcGVydHk9Im5vZGVMYWJlbCIvPgorICAgICAgICA8L2Rpdj4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQgYWxpZ249InJpZ2h0IiBub3dyYXA+CisgICAgICAgIDxkaXYgY2xhc3M9InBhZ2UtdGl0bGUtdGV4dCI+CisgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbnMgbGFiZWw9Ikdyb3VwIEFjdGlvbnMiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbiBzZWxlY3RlZD0idHJ1ZSI+CisgICAgICAgICAgICAgIC0tLS08YmVhbjptZXNzYWdlIGtleT0iYWN0aW9ucy5hdmFpbGFibGUuYWN0aW9ucyIvPi0tLS0KKyAgICAgICAgICAgIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICA8L2NvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgICAgIDwhLS0gd2lsbCBhZGQgdGhlIHVybHMgbGF0ZXIgb25jZSB0aG9zZSBzY3JlZW5zIGdldCBpbXBsZW1lbnRlZCAtLT4KKzwlLS0KKyAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24gdXJsPSIiPgorICAgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0idXNlcnMuYWN0aW9ucy5ncm91cC5jcmVhdGUiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbiB1cmw9IiI+CisgICAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJ1c2Vycy5hY3Rpb25zLmdyb3VwLmRlbGV0ZSIvPgorICAgICAgICAgICAgPC9jb250cm9sczphY3Rpb24+CistLSU+CisgICAgICAgICAgPC9jb250cm9sczphY3Rpb25zPgorICAgICAgICA8L2Rpdj4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgPC90YWJsZT4KKworICA8JUAgaW5jbHVkZSBmaWxlPSIuLi9idXR0b25zLmpzcCIgJT4KKzxicj4KKworICA8dGFibGUgY2xhc3M9ImJhY2stdGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIxIgorICAgICAgICAgd2lkdGg9IjEwMCUiPgorICAgIDx0cj4KKyAgICAgIDx0ZD4KKworICAgICAgICA8Y29udHJvbHM6dGFibGUgdGFibGVTdHlsZT0iZnJvbnQtdGFibGUiIGxpbmVTdHlsZT0ibGluZS1yb3ciPgorCisgICAgICAgICAgPGNvbnRyb2xzOnJvdyBoZWFkZXI9InRydWUiCisgICAgICAgICAgICAgICAgbGFiZWxTdHlsZT0idGFibGUtaGVhZGVyLXRleHQiIGRhdGFTdHlsZT0idGFibGUtaGVhZGVyLXRleHQiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0idXNlcnMuZ3JvdXAucHJvcGVydGllcyIvPgorICAgICAgICAgICAgPC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICAmbmJzcDsKKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJncm91cG5hbWUiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0idXNlcnMucHJvbXB0Lmdyb3VwbmFtZSIvPgorICAgICAgICAgICAgPC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICA8bG9naWM6cHJlc2VudCBuYW1lPSJncm91cEZvcm0iIHByb3BlcnR5PSJvYmplY3ROYW1lIj4KKyAgICAgICAgICAgICAgICA8YmVhbjp3cml0ZSBuYW1lPSJncm91cEZvcm0iIHByb3BlcnR5PSJncm91cG5hbWUiLz4KKyAgICAgICAgICAgICAgICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9Imdyb3VwbmFtZSIvPgorICAgICAgICAgICAgICA8L2xvZ2ljOnByZXNlbnQ+CisgICAgICAgICAgICAgIDxsb2dpYzpub3RQcmVzZW50IG5hbWU9Imdyb3VwRm9ybSIgcHJvcGVydHk9Im9iamVjdE5hbWUiPgorICAgICAgICAgICAgICAgIDxodG1sOnRleHQgcHJvcGVydHk9Imdyb3VwbmFtZSIgc2l6ZT0iMjQiIG1heGxlbmd0aD0iMzIiIHN0eWxlSWQ9Imdyb3VwbmFtZSIvPgorICAgICAgICAgICAgICA8L2xvZ2ljOm5vdFByZXNlbnQ+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiCisgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0iZGVzY3JpcHRpb24iPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0idXNlcnMucHJvbXB0LmRlc2NyaXB0aW9uIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgIDxodG1sOnRleHQgcHJvcGVydHk9ImRlc2NyaXB0aW9uIiBzaXplPSIyNCIgbWF4bGVuZ3RoPSIxMjgiIHN0eWxlSWQ9ImRlc2NyaXB0aW9uIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgICAgPC9jb250cm9sczp0YWJsZT4KKworICAgICAgPC90ZD4KKworICAgIDwvdHI+CisKKyAgPC90YWJsZT4KKworICA8YmVhbjpkZWZpbmUgaWQ9ImNoZWNrYm94ZXMiIHNjb3BlPSJwYWdlIiB2YWx1ZT0idHJ1ZSIvPgorICA8YnI+CisgIDwlQCBpbmNsdWRlIGZpbGU9InJvbGVzLmpzcGYiICU+CisKKyAgPCVAIGluY2x1ZGUgZmlsZT0iLi4vYnV0dG9ucy5qc3AiICU+CisKKzwvaHRtbDpmb3JtPgorCis8IS0tIFN0YW5kYXJkIEZvb3RlciAtLT4KKworPCVAIGluY2x1ZGUgZmlsZT0iZm9vdGVyLmpzcCIgJT4KKworPC9ib2R5PgorCis8L2h0bWw6aHRtbD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3VzZXJzL2dyb3Vwcy5qc3BmIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vdXNlcnMvZ3JvdXBzLmpzcGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc0ODBhZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3VzZXJzL2dyb3Vwcy5qc3BmCkBAIC0wLDAgKzEsNTQgQEAKKzwlLS0gR3JvdXBzIExpc3QgLS0lPgorCis8dGFibGUgY2xhc3M9ImJhY2stdGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIxIgorICAgICAgIHdpZHRoPSIxMDAlIj48dHI+PHRkPiAKKworICA8dGFibGUgY2xhc3M9ImZyb250LXRhYmxlIiBib3JkZXI9IjEiCisgICBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KKyAgICA8dHIgY2xhc3M9ImhlYWRlci1yb3ciPgorICAgICAgPGxvZ2ljOnByZXNlbnQgbmFtZT0iY2hlY2tib3hlcyI+CisgICAgICAgIDx0aCBzY29wZT0iY29sIiB3aWR0aD0iNSUiPjxkaXYgYWxpZ249ImxlZnQiIGNsYXNzPSJ0YWJsZS1oZWFkZXItdGV4dCI+CisgICAgICAgICAgJm5ic3A7CisgICAgICAgIDwvdGg+CisgICAgICA8L2xvZ2ljOnByZXNlbnQ+CisgICAgICA8dGggc2NvcGU9ImNvbCIgd2lkdGg9IjIwJSI+PGRpdiBhbGlnbj0ibGVmdCIgY2xhc3M9InRhYmxlLWhlYWRlci10ZXh0Ij4KKyAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InVzZXJzLmxpc3QuZ3JvdXBuYW1lIi8+CisgICAgICA8L2Rpdj48L3RoPgorICAgICAgPHRoIHNjb3BlPSJjb2wiPjxkaXYgYWxpZ249ImxlZnQiIGNsYXNzPSJ0YWJsZS1oZWFkZXItdGV4dCI+CisgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJ1c2Vycy5saXN0LmRlc2NyaXB0aW9uIi8+CisgICAgICA8L2Rpdj48L3RoPgorICAgIDwvdHI+CisgICAgPGxvZ2ljOnByZXNlbnQgbmFtZT0iZ3JvdXBzRm9ybSI+CisgICAgPGxvZ2ljOml0ZXJhdGUgbmFtZT0iZ3JvdXBzRm9ybSIgcHJvcGVydHk9Imdyb3VwcyIKKyAgICAgICAgICAgICAgICAgICAgIGlkPSJncm91cCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CisgICAgICA8dHIgY2xhc3M9ImxpbmUtcm93Ij4KKyAgICAgICAgPGxvZ2ljOnByZXNlbnQgbmFtZT0iY2hlY2tib3hlcyI+CisgICAgICAgICAgPHRkIHNjb3BlPSJyb3ciPjxkaXYgYWxpZ249ImNlbnRlciIgY2xhc3M9InRhYmxlLW5vcm1hbC10ZXh0Ij4KKyAgICAgICAgICAgIDxsb2dpYzpwcmVzZW50IG5hbWU9InVzZXJGb3JtIj4KKyAgICAgICAgICAgICA8bGFiZWwgZm9yPSJncm91cHMiPjwvbGFiZWw+CisgICAgICAgICAgICAgIDxodG1sOm11bHRpYm94IHByb3BlcnR5PSJncm91cHMiIHZhbHVlPSI8JT0gZ3JvdXAgJT4iIHN0eWxlSWQ9Imdyb3VwcyIvPgorICAgICAgICAgICAgPC9sb2dpYzpwcmVzZW50PgorICAgICAgICAgICAgPGxvZ2ljOm5vdFByZXNlbnQgbmFtZT0idXNlckZvcm0iPgorICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJncm91cHMiPjwvbGFiZWw+CisgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iZ3JvdXBzIgorICAgICAgICAgICAgICAgICAgICB2YWx1ZT0iPCU9IGdyb3VwICU+IiBzdHlsZUlkPSJncm91cHMiPgorICAgICAgICAgICAgPC9sb2dpYzpub3RQcmVzZW50PgorICAgICAgICAgIDwvdGQ+CisgICAgICAgIDwvbG9naWM6cHJlc2VudD4KKyAgICAgICAgPHRkIHNjb3BlPSJyb3ciPjxkaXYgYWxpZ249ImxlZnQiIGNsYXNzPSJ0YWJsZS1ub3JtYWwtdGV4dCI+Jm5ic3A7CisgICAgICAgICAgPGh0bWw6bGluayBwYWdlPSc8JT0gIi91c2Vycy9zZXRVcEdyb3VwLmRvP29iamVjdE5hbWU9IiArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKGdyb3VwKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiZkYXRhYmFzZU5hbWU9IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUocmVxdWVzdC5nZXRQYXJhbWV0ZXIoImRhdGFiYXNlTmFtZSIpKSAlPic+CisgICAgICAgICAgICA8Y29udHJvbHM6YXR0cmlidXRlIG5hbWU9Imdyb3VwIiBhdHRyaWJ1dGU9Imdyb3VwbmFtZSIvPgorICAgICAgICAgIDwvaHRtbDpsaW5rPgorICAgICAgICA8L2Rpdj48L3RkPgorICAgICAgICA8dGQgc2NvcGU9InJvdyI+PGRpdiBhbGlnbj0ibGVmdCIgY2xhc3M9InRhYmxlLW5vcm1hbC10ZXh0Ij4mbmJzcDsKKyAgICAgICAgICA8Y29udHJvbHM6YXR0cmlidXRlIG5hbWU9Imdyb3VwIiBhdHRyaWJ1dGU9ImRlc2NyaXB0aW9uIi8+CisgICAgICAgIDwvZGl2PjwvdGQ+CisgICAgICA8L3RyPgorICAgIDwvbG9naWM6aXRlcmF0ZT4KKyAgICA8L2xvZ2ljOnByZXNlbnQ+CisgIDwvdGFibGU+CisKKzwvdGQ+PC90cj48L3RhYmxlPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vdXNlcnMvaGVhZGVyLmpzcCBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3VzZXJzL2hlYWRlci5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M1OThkMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3VzZXJzL2hlYWRlci5qc3AKQEAgLTAsMCArMSwxMSBAQAorPCEtLQorICBDb3B5cmlnaHQgKGMpIDE5OTktMjAwMiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCisgIHJlc2VydmVkLgorLS0+CisKKzxoZWFkPgorICA8dGl0bGU+PGJlYW46bWVzc2FnZSBrZXk9ImFwcGxpY2F0aW9uLnRpdGxlIi8+PC90aXRsZT4KKyAgPGh0bWw6YmFzZS8+CisgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3RyZWUtY29udHJvbC10ZXN0LmNzcyI+CisgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL2FkbWluLmNzcyI+Cis8L2hlYWQ+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi91c2Vycy9saXN0R3JvdXBzLmpzcCBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3VzZXJzL2xpc3RHcm91cHMuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiODVjM2IKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi91c2Vycy9saXN0R3JvdXBzLmpzcApAQCAtMCwwICsxLDQzIEBACis8IS0tIFN0YW5kYXJkIFN0cnV0cyBFbnRyaWVzIC0tPgorPCVAIHBhZ2UgbGFuZ3VhZ2U9ImphdmEiIGltcG9ydD0iamF2YS5uZXQuVVJMRW5jb2RlciIgY29udGVudFR5cGU9InRleHQvaHRtbDtjaGFyc2V0PXV0Zi04IiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL3N0cnV0cy1iZWFuLnRsZCIgcHJlZml4PSJiZWFuIiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL3N0cnV0cy1odG1sLnRsZCIgcHJlZml4PSJodG1sIiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL3N0cnV0cy1sb2dpYy50bGQiIHByZWZpeD0ibG9naWMiICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvY29udHJvbHMudGxkIiBwcmVmaXg9ImNvbnRyb2xzIiAlPgorCis8aHRtbDpodG1sIGxvY2FsZT0idHJ1ZSI+CisKKzwlQCBpbmNsdWRlIGZpbGU9ImhlYWRlci5qc3AiICU+CisKKzwhLS0gQm9keSAtLT4KKzxib2R5IGJnY29sb3I9IndoaXRlIiBiYWNrZ3JvdW5kPSIuLi9pbWFnZXMvUGFwZXJUZXh0dXJlLmdpZiI+CisKKzwhLS1Gb3JtIC0tPgorCis8aHRtbDplcnJvcnMvPgorCis8aHRtbDpmb3JtIGFjdGlvbj0iL3VzZXJzL2xpc3RHcm91cHMiPgorCisgIDx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgorICAgIDx0ciBiZ2NvbG9yPSI3MTcxQTUiPgorICAgICAgPHRkIHdpZHRoPSI4MSUiPgorICAgICAgICA8ZGl2IGNsYXNzPSJwYWdlLXRpdGxlLXRleHQiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0idXNlcnMubGlzdEdyb3Vwcy50aXRsZSIvPgorICAgICAgICA8L2Rpdj4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQgd2lkdGg9IjE5JSI+CisgICAgICAgIDxkaXYgYWxpZ249InJpZ2h0Ij4KKyAgICAgICAgICA8JUAgaW5jbHVkZSBmaWxlPSJsaXN0R3JvdXBzLmpzcGYiICU+CisgICAgICAgIDwvZGl2PgorICAgICAgPC90ZD4KKyAgICA8L3RyPgorICA8L3RhYmxlPgorCis8L2h0bWw6Zm9ybT4KKworPGJyPgorPCVAIGluY2x1ZGUgZmlsZT0iZ3JvdXBzLmpzcGYiICU+Cis8YnI+CisKKzwvYm9keT4KKzwvaHRtbDpodG1sPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vdXNlcnMvbGlzdEdyb3Vwcy5qc3BmIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vdXNlcnMvbGlzdEdyb3Vwcy5qc3BmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhOTA2YTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi91c2Vycy9saXN0R3JvdXBzLmpzcGYKQEAgLTAsMCArMSwzMiBAQAorPHRkIGFsaWduPSJyaWdodCIgbm93cmFwPgorPGRpdiBjbGFzcz0icGFnZS10aXRsZS10ZXh0Ij4KKzxjb250cm9sczphY3Rpb25zIGxhYmVsPSJHcm91cCBBY3Rpb25zIj4KKworICA8Y29udHJvbHM6YWN0aW9uIHNlbGVjdGVkPSJ0cnVlIj4KKyAgICAtLS0tPGJlYW46bWVzc2FnZSBrZXk9ImFjdGlvbnMuYXZhaWxhYmxlLmFjdGlvbnMiLz4tLS0tCisgIDwvY29udHJvbHM6YWN0aW9uPgorCisgIDxjb250cm9sczphY3Rpb24+CisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIDwvY29udHJvbHM6YWN0aW9uPgorCisgIDxjb250cm9sczphY3Rpb24gdXJsPSc8JT0gIi91c2Vycy9zZXRVcEdyb3VwLmRvP2RhdGFiYXNlTmFtZT0iICsKKyAgICAgICBVUkxFbmNvZGVyLmVuY29kZShyZXF1ZXN0LmdldFBhcmFtZXRlcigiZGF0YWJhc2VOYW1lIikpICU+Jz4KKyAgICA8YmVhbjptZXNzYWdlIGtleT0idXNlcnMuYWN0aW9ucy5ncm91cC5jcmVhdGUiLz4KKyAgPC9jb250cm9sczphY3Rpb24+CisKKyAgPGNvbnRyb2xzOmFjdGlvbiB1cmw9JzwlPSAiL3VzZXJzL2xpc3RHcm91cHMuZG8/ZGF0YWJhc2VOYW1lPSIgKworICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJkYXRhYmFzZU5hbWUiKSkgKworICAgICAgICImZm9yd2FyZD0iICsgVVJMRW5jb2Rlci5lbmNvZGUoIkdyb3VwcyBEZWxldGUgTGlzdCIpICU+Jz4KKyAgICA8YmVhbjptZXNzYWdlIGtleT0idXNlcnMuYWN0aW9ucy5ncm91cC5kZWxldGUiLz4KKyAgPC9jb250cm9sczphY3Rpb24+CisKKyAgPGNvbnRyb2xzOmFjdGlvbiB1cmw9JzwlPSAiL3VzZXJzL2xpc3RHcm91cHMuZG8/ZGF0YWJhc2VOYW1lPSIgKworICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJkYXRhYmFzZU5hbWUiKSkgKworICAgICAgICImZm9yd2FyZD0iICsgVVJMRW5jb2Rlci5lbmNvZGUoIkdyb3VwcyBMaXN0IikgJT4nPgorICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJ1c2Vycy5hY3Rpb25zLmdyb3VwLmxpc3QiLz4KKyAgPC9jb250cm9sczphY3Rpb24+CisKKzwvY29udHJvbHM6YWN0aW9ucz4KKzwvZGl2PgorPC90ZD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3VzZXJzL2xpc3RSb2xlcy5qc3AgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi91c2Vycy9saXN0Um9sZXMuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3ZTRlNTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi91c2Vycy9saXN0Um9sZXMuanNwCkBAIC0wLDAgKzEsNDMgQEAKKzwhLS0gU3RhbmRhcmQgU3RydXRzIEVudHJpZXMgLS0+Cis8JUAgcGFnZSBsYW5ndWFnZT0iamF2YSIgaW1wb3J0PSJqYXZhLm5ldC5VUkxFbmNvZGVyIiBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgiICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvc3RydXRzLWJlYW4udGxkIiBwcmVmaXg9ImJlYW4iICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvc3RydXRzLWh0bWwudGxkIiBwcmVmaXg9Imh0bWwiICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvc3RydXRzLWxvZ2ljLnRsZCIgcHJlZml4PSJsb2dpYyIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9jb250cm9scy50bGQiIHByZWZpeD0iY29udHJvbHMiICU+CisKKzxodG1sOmh0bWwgbG9jYWxlPSJ0cnVlIj4KKworPCVAIGluY2x1ZGUgZmlsZT0iaGVhZGVyLmpzcCIgJT4KKworPCEtLSBCb2R5IC0tPgorPGJvZHkgYmdjb2xvcj0id2hpdGUiIGJhY2tncm91bmQ9Ii4uL2ltYWdlcy9QYXBlclRleHR1cmUuZ2lmIj4KKworPCEtLUZvcm0gLS0+CisKKzxodG1sOmVycm9ycy8+CisKKzxodG1sOmZvcm0gYWN0aW9uPSIvdXNlcnMvbGlzdFJvbGVzIj4KKworICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KKyAgICA8dHIgYmdjb2xvcj0iNzE3MUE1Ij4KKyAgICAgIDx0ZCB3aWR0aD0iODElIj4KKyAgICAgICAgPGRpdiBjbGFzcz0icGFnZS10aXRsZS10ZXh0IiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InVzZXJzLmxpc3RSb2xlcy50aXRsZSIvPgorICAgICAgICA8L2Rpdj4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQgd2lkdGg9IjE5JSI+CisgICAgICAgIDxkaXYgYWxpZ249InJpZ2h0Ij4KKyAgICAgICAgICA8JUAgaW5jbHVkZSBmaWxlPSJsaXN0Um9sZXMuanNwZiIgJT4KKyAgICAgICAgPC9kaXY+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgIDwvdGFibGU+CisKKzwvaHRtbDpmb3JtPgorCis8YnI+Cis8JUAgaW5jbHVkZSBmaWxlPSJyb2xlcy5qc3BmIiAlPgorPGJyPgorCis8L2JvZHk+Cis8L2h0bWw6aHRtbD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3VzZXJzL2xpc3RSb2xlcy5qc3BmIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vdXNlcnMvbGlzdFJvbGVzLmpzcGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTYzNzE2ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3VzZXJzL2xpc3RSb2xlcy5qc3BmCkBAIC0wLDAgKzEsMzIgQEAKKzx0ZCBhbGlnbj0icmlnaHQiIG5vd3JhcD4KKzxkaXYgY2xhc3M9InBhZ2UtdGl0bGUtdGV4dCI+Cis8Y29udHJvbHM6YWN0aW9ucyBsYWJlbD0iUm9sZSBBY3Rpb25zIj4KKworICA8Y29udHJvbHM6YWN0aW9uIHNlbGVjdGVkPSJ0cnVlIj4KKyAgICAtLS0tPGJlYW46bWVzc2FnZSBrZXk9ImFjdGlvbnMuYXZhaWxhYmxlLmFjdGlvbnMiLz4tLS0tCisgIDwvY29udHJvbHM6YWN0aW9uPgorCisgIDxjb250cm9sczphY3Rpb24+CisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIDwvY29udHJvbHM6YWN0aW9uPgorCisgIDxjb250cm9sczphY3Rpb24gdXJsPSc8JT0gIi91c2Vycy9zZXRVcFJvbGUuZG8/ZGF0YWJhc2VOYW1lPSIgKworICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJkYXRhYmFzZU5hbWUiKSkgJT4nPgorICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJ1c2Vycy5hY3Rpb25zLnJvbGUuY3JlYXRlIi8+CisgIDwvY29udHJvbHM6YWN0aW9uPgorCisgIDxjb250cm9sczphY3Rpb24gdXJsPSc8JT0gIi91c2Vycy9saXN0Um9sZXMuZG8/ZGF0YWJhc2VOYW1lPSIgKworICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJkYXRhYmFzZU5hbWUiKSkgKworICAgICAgICImZm9yd2FyZD0iICsgVVJMRW5jb2Rlci5lbmNvZGUoIlJvbGVzIERlbGV0ZSBMaXN0IikgJT4nPgorICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJ1c2Vycy5hY3Rpb25zLnJvbGUuZGVsZXRlIi8+CisgIDwvY29udHJvbHM6YWN0aW9uPgorCisgIDxjb250cm9sczphY3Rpb24gdXJsPSc8JT0gIi91c2Vycy9saXN0Um9sZXMuZG8/ZGF0YWJhc2VOYW1lPSIgKworICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJkYXRhYmFzZU5hbWUiKSkgKworICAgICAgICImZm9yd2FyZD0iICsgVVJMRW5jb2Rlci5lbmNvZGUoIlJvbGVzIExpc3QiKSAlPic+CisgICAgPGJlYW46bWVzc2FnZSBrZXk9InVzZXJzLmFjdGlvbnMucm9sZS5saXN0Ii8+CisgIDwvY29udHJvbHM6YWN0aW9uPgorCis8L2NvbnRyb2xzOmFjdGlvbnM+Cis8L2Rpdj4KKzwvdGQ+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi91c2Vycy9saXN0VXNlcnMuanNwIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vdXNlcnMvbGlzdFVzZXJzLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzNlZTgxCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vdXNlcnMvbGlzdFVzZXJzLmpzcApAQCAtMCwwICsxLDQzIEBACis8IS0tIFN0YW5kYXJkIFN0cnV0cyBFbnRyaWVzIC0tPgorPCVAIHBhZ2UgbGFuZ3VhZ2U9ImphdmEiIGltcG9ydD0iamF2YS5uZXQuVVJMRW5jb2RlciIgY29udGVudFR5cGU9InRleHQvaHRtbDtjaGFyc2V0PXV0Zi04IiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL3N0cnV0cy1iZWFuLnRsZCIgcHJlZml4PSJiZWFuIiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL3N0cnV0cy1odG1sLnRsZCIgcHJlZml4PSJodG1sIiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL3N0cnV0cy1sb2dpYy50bGQiIHByZWZpeD0ibG9naWMiICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvY29udHJvbHMudGxkIiBwcmVmaXg9ImNvbnRyb2xzIiAlPgorCis8aHRtbDpodG1sIGxvY2FsZT0idHJ1ZSI+CisKKzwlQCBpbmNsdWRlIGZpbGU9ImhlYWRlci5qc3AiICU+CisKKzwhLS0gQm9keSAtLT4KKzxib2R5IGJnY29sb3I9IndoaXRlIiBiYWNrZ3JvdW5kPSIuLi9pbWFnZXMvUGFwZXJUZXh0dXJlLmdpZiI+CisKKzwhLS1Gb3JtIC0tPgorCis8aHRtbDplcnJvcnMvPgorCis8aHRtbDpmb3JtIGFjdGlvbj0iL3VzZXJzL2xpc3RVc2VycyI+CisKKyAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CisgICAgPHRyIGJnY29sb3I9IjcxNzFBNSI+CisgICAgICA8dGQgd2lkdGg9IjgxJSI+CisgICAgICAgIDxkaXYgY2xhc3M9InBhZ2UtdGl0bGUtdGV4dCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJ1c2Vycy5saXN0VXNlcnMudGl0bGUiLz4KKyAgICAgICAgPC9kaXY+CisgICAgICA8L3RkPgorICAgICAgPHRkIHdpZHRoPSIxOSUiPgorICAgICAgICA8ZGl2IGFsaWduPSJyaWdodCI+CisgICAgICAgICAgPCVAIGluY2x1ZGUgZmlsZT0ibGlzdFVzZXJzLmpzcGYiICU+CisgICAgICAgIDwvZGl2PgorICAgICAgPC90ZD4KKyAgICA8L3RyPgorICA8L3RhYmxlPgorCis8L2h0bWw6Zm9ybT4KKworPGJyPgorPCVAIGluY2x1ZGUgZmlsZT0idXNlcnMuanNwZiIgJT4KKzxicj4KKworPC9ib2R5PgorPC9odG1sOmh0bWw+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi91c2Vycy9saXN0VXNlcnMuanNwZiBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3VzZXJzL2xpc3RVc2Vycy5qc3BmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4ZmE0YmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi91c2Vycy9saXN0VXNlcnMuanNwZgpAQCAtMCwwICsxLDMyIEBACis8dGQgYWxpZ249InJpZ2h0IiBub3dyYXA+Cis8ZGl2IGNsYXNzPSJwYWdlLXRpdGxlLXRleHQiPgorPGNvbnRyb2xzOmFjdGlvbnMgbGFiZWw9IlVzZXIgQWN0aW9ucyI+CisKKyAgPGNvbnRyb2xzOmFjdGlvbiBzZWxlY3RlZD0idHJ1ZSI+CisgICAgLS0tLTxiZWFuOm1lc3NhZ2Uga2V5PSJhY3Rpb25zLmF2YWlsYWJsZS5hY3Rpb25zIi8+LS0tLQorICA8L2NvbnRyb2xzOmFjdGlvbj4KKworICA8Y29udHJvbHM6YWN0aW9uPgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICA8L2NvbnRyb2xzOmFjdGlvbj4KKworICA8Y29udHJvbHM6YWN0aW9uIHVybD0nPCU9ICIvdXNlcnMvc2V0VXBVc2VyLmRvP2RhdGFiYXNlTmFtZT0iICsKKyAgICAgICBVUkxFbmNvZGVyLmVuY29kZShyZXF1ZXN0LmdldFBhcmFtZXRlcigiZGF0YWJhc2VOYW1lIikpICU+Jz4KKyAgICA8YmVhbjptZXNzYWdlIGtleT0idXNlcnMuYWN0aW9ucy51c2VyLmNyZWF0ZSIvPgorICA8L2NvbnRyb2xzOmFjdGlvbj4KKworICA8Y29udHJvbHM6YWN0aW9uIHVybD0nPCU9ICIvdXNlcnMvbGlzdFVzZXJzLmRvP2RhdGFiYXNlTmFtZT0iICsKKyAgICAgICBVUkxFbmNvZGVyLmVuY29kZShyZXF1ZXN0LmdldFBhcmFtZXRlcigiZGF0YWJhc2VOYW1lIikpICsKKyAgICAgICAiJmZvcndhcmQ9IiArIFVSTEVuY29kZXIuZW5jb2RlKCJVc2VycyBEZWxldGUgTGlzdCIpICU+Jz4KKyAgICA8YmVhbjptZXNzYWdlIGtleT0idXNlcnMuYWN0aW9ucy51c2VyLmRlbGV0ZSIvPgorICA8L2NvbnRyb2xzOmFjdGlvbj4KKworICA8Y29udHJvbHM6YWN0aW9uIHVybD0nPCU9ICIvdXNlcnMvbGlzdFVzZXJzLmRvP2RhdGFiYXNlTmFtZT0iICsKKyAgICAgICBVUkxFbmNvZGVyLmVuY29kZShyZXF1ZXN0LmdldFBhcmFtZXRlcigiZGF0YWJhc2VOYW1lIikpICsKKyAgICAgICAiJmZvcndhcmQ9IiArIFVSTEVuY29kZXIuZW5jb2RlKCJVc2VycyBMaXN0IikgJT4nPgorICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJ1c2Vycy5hY3Rpb25zLnVzZXIubGlzdCIvPgorICA8L2NvbnRyb2xzOmFjdGlvbj4KKworPC9jb250cm9sczphY3Rpb25zPgorPC9kaXY+Cis8L3RkPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vdXNlcnMvcm9sZS5qc3AgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi91c2Vycy9yb2xlLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjc3OWFmCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vdXNlcnMvcm9sZS5qc3AKQEAgLTAsMCArMSwxMjAgQEAKKzwhLS0gU3RhbmRhcmQgU3RydXRzIEVudHJpZXMgLS0+CisKKzwlQCBwYWdlIGxhbmd1YWdlPSJqYXZhIiBpbXBvcnQ9ImphdmEubmV0LlVSTEVuY29kZXIiIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9zdHJ1dHMtYmVhbi50bGQiIHByZWZpeD0iYmVhbiIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9zdHJ1dHMtaHRtbC50bGQiIHByZWZpeD0iaHRtbCIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9zdHJ1dHMtbG9naWMudGxkIiBwcmVmaXg9ImxvZ2ljIiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL2NvbnRyb2xzLnRsZCIgcHJlZml4PSJjb250cm9scyIgJT4KKworPGh0bWw6aHRtbCBsb2NhbGU9InRydWUiPgorCis8JUAgaW5jbHVkZSBmaWxlPSJoZWFkZXIuanNwIiAlPgorCis8IS0tIEJvZHkgLS0+Cis8Ym9keSBiZ2NvbG9yPSJ3aGl0ZSIgYmFja2dyb3VuZD0iLi4vaW1hZ2VzL1BhcGVyVGV4dHVyZS5naWYiPgorCis8IS0tRm9ybSAtLT4KKworPGh0bWw6ZXJyb3JzLz4KKworPGh0bWw6Zm9ybSBtZXRob2Q9IlBPU1QiIGFjdGlvbj0iL3VzZXJzL3NhdmVSb2xlIj4gPCEtLWZvY3VzPSJyb2xlbmFtZSItLT4KKworICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9ImRhdGFiYXNlTmFtZSIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9Im9iamVjdE5hbWUiLz4KKworICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KKyAgICA8dHIgY2xhc3M9InBhZ2UtdGl0bGUtcm93Ij4KKyAgICAgIDx0ZCBhbGlnbj0ibGVmdCIgbm93cmFwPgorICAgICAgICA8ZGl2IGNsYXNzPSJwYWdlLXRpdGxlLXRleHQiPgorICAgICAgICAgIDxiZWFuOndyaXRlIG5hbWU9InJvbGVGb3JtIiBwcm9wZXJ0eT0ibm9kZUxhYmVsIi8+CisgICAgICAgIDwvZGl2PgorICAgICAgPC90ZD4KKyAgICAgIDx0ZCBhbGlnbj0icmlnaHQiIG5vd3JhcD4KKyAgICAgICAgPGRpdiBjbGFzcz0icGFnZS10aXRsZS10ZXh0Ij4KKyAgICAgICAgICA8Y29udHJvbHM6YWN0aW9ucyBsYWJlbD0iUm9sZSBBY3Rpb25zIj4KKyAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24gc2VsZWN0ZWQ9InRydWUiPgorICAgICAgICAgICAgICAtLS0tPGJlYW46bWVzc2FnZSBrZXk9ImFjdGlvbnMuYXZhaWxhYmxlLmFjdGlvbnMiLz4tLS0tCisgICAgICAgICAgICA8L2NvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24+CisgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgICA8IS0tIHdpbGwgYWRkIHRoZSB1cmxzIGxhdGVyIG9uY2UgdGhvc2Ugc2NyZWVucyBnZXQgaW1wbGVtZW50ZWQgLS0+Cis8JS0tCisgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9uIHVybD0iIj4KKyAgICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InVzZXJzLmFjdGlvbnMucm9sZS5jcmVhdGUiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbiB1cmw9IiI+CisgICAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJ1c2Vycy5hY3Rpb25zLnJvbGUuZGVsZXRlIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmFjdGlvbj4KKy0tJT4KKyAgICAgICAgICA8L2NvbnRyb2xzOmFjdGlvbnM+CisgICAgICAgIDwvZGl2PgorICAgICAgPC90ZD4KKyAgICA8L3RyPgorICA8L3RhYmxlPgorCisgIDwlQCBpbmNsdWRlIGZpbGU9Ii4uL2J1dHRvbnMuanNwIiAlPgorPGJyPgorCisgIDx0YWJsZSBjbGFzcz0iYmFjay10YWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjEiCisgICAgICAgICB3aWR0aD0iMTAwJSI+CisgICAgPHRyPgorICAgICAgPHRkPgorCisgICAgICAgIDxjb250cm9sczp0YWJsZSB0YWJsZVN0eWxlPSJmcm9udC10YWJsZSIgbGluZVN0eWxlPSJsaW5lLXJvdyI+CisKKyAgICAgICAgICA8Y29udHJvbHM6cm93IGhlYWRlcj0idHJ1ZSIKKyAgICAgICAgICAgICAgICBsYWJlbFN0eWxlPSJ0YWJsZS1oZWFkZXItdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1oZWFkZXItdGV4dCI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJ1c2Vycy5yb2xlLnByb3BlcnRpZXMiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgJm5ic3A7CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiCisgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0icm9sZW5hbWUiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0idXNlcnMucHJvbXB0LnJvbGVuYW1lIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgIDxsb2dpYzpwcmVzZW50IG5hbWU9InJvbGVGb3JtIiBwcm9wZXJ0eT0ib2JqZWN0TmFtZSI+CisgICAgICAgICAgICAgICAgPGJlYW46d3JpdGUgbmFtZT0icm9sZUZvcm0iIHByb3BlcnR5PSJyb2xlbmFtZSIvPgorICAgICAgICAgICAgICAgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0icm9sZW5hbWUiLz4KKyAgICAgICAgICAgICAgPC9sb2dpYzpwcmVzZW50PgorICAgICAgICAgICAgICA8bG9naWM6bm90UHJlc2VudCBuYW1lPSJyb2xlRm9ybSIgcHJvcGVydHk9Im9iamVjdE5hbWUiPgorICAgICAgICAgICAgICAgIDxodG1sOnRleHQgcHJvcGVydHk9InJvbGVuYW1lIiBzaXplPSIyNCIgbWF4bGVuZ3RoPSIzMiIgc3R5bGVJZD0icm9sZW5hbWUiLz4KKyAgICAgICAgICAgICAgPC9sb2dpYzpub3RQcmVzZW50PgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IgorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9ImRlc2NyaXB0aW9uIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InVzZXJzLnByb21wdC5kZXNjcmlwdGlvbiIvPjoKKyAgICAgICAgICAgIDwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgPGh0bWw6dGV4dCBwcm9wZXJ0eT0iZGVzY3JpcHRpb24iIHNpemU9IjI0IiBtYXhsZW5ndGg9IjEyOCIgc3R5bGVJZD0iZGVzY3JpcHRpb24iLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgICA8L2NvbnRyb2xzOnRhYmxlPgorCisgICAgICA8L3RkPgorCisgICAgPC90cj4KKworICA8L3RhYmxlPgorCisgIDwlQCBpbmNsdWRlIGZpbGU9Ii4uL2J1dHRvbnMuanNwIiAlPgorCis8L2h0bWw6Zm9ybT4KKworPCEtLSBTdGFuZGFyZCBGb290ZXIgLS0+CisKKzwlQCBpbmNsdWRlIGZpbGU9ImZvb3Rlci5qc3AiICU+CisKKzwvYm9keT4KKworPC9odG1sOmh0bWw+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi91c2Vycy9yb2xlcy5qc3BmIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vdXNlcnMvcm9sZXMuanNwZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2E0ZGJkCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vdXNlcnMvcm9sZXMuanNwZgpAQCAtMCwwICsxLDYwIEBACis8JS0tIFJvbGVzIExpc3QgLS0lPgorCis8dGFibGUgY2xhc3M9ImJhY2stdGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIxIgorICAgICAgIHdpZHRoPSIxMDAlIj48dHI+PHRkPiAKKworICA8dGFibGUgY2xhc3M9ImZyb250LXRhYmxlIiBib3JkZXI9IjEiCisgICBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KKyAgICA8dHIgY2xhc3M9ImhlYWRlci1yb3ciPgorICAgICAgPGxvZ2ljOnByZXNlbnQgbmFtZT0iY2hlY2tib3hlcyI+CisgICAgICAgIDx0ZCB3aWR0aD0iNSUiPjxkaXYgYWxpZ249ImxlZnQiIGNsYXNzPSJ0YWJsZS1oZWFkZXItdGV4dCI+CisgICAgICAgICAgJm5ic3A7CisgICAgICAgIDwvdGQ+CisgICAgICA8L2xvZ2ljOnByZXNlbnQ+CisgICAgICA8dGggc2NvcGU9ImNvbCIgd2lkdGg9IjIwJSI+PGRpdiBhbGlnbj0ibGVmdCIgY2xhc3M9InRhYmxlLWhlYWRlci10ZXh0Ij4KKyAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InVzZXJzLmxpc3Qucm9sZW5hbWUiLz4KKyAgICAgIDwvZGl2PjwvdGg+CisgICAgICA8dGggc2NvcGU9ImNvbCI+PGRpdiBhbGlnbj0ibGVmdCIgY2xhc3M9InRhYmxlLWhlYWRlci10ZXh0Ij4KKyAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InVzZXJzLmxpc3QuZGVzY3JpcHRpb24iLz4KKyAgICAgIDwvZGl2PjwvdGg+CisgICAgPC90cj4KKyAgICA8bG9naWM6cHJlc2VudCBuYW1lPSJyb2xlc0Zvcm0iPgorICAgIDxsb2dpYzppdGVyYXRlIG5hbWU9InJvbGVzRm9ybSIgcHJvcGVydHk9InJvbGVzIgorICAgICAgICAgICAgICAgICAgICAgaWQ9InJvbGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorICAgICAgPHRyIGNsYXNzPSJsaW5lLXJvdyI+CisgICAgICAgIDxsb2dpYzpwcmVzZW50IG5hbWU9ImNoZWNrYm94ZXMiPgorICAgICAgICAgIDx0ZCBzY29wZT0icm93Ij48ZGl2IGFsaWduPSJjZW50ZXIiIGNsYXNzPSJ0YWJsZS1ub3JtYWwtdGV4dCI+CisgICAgICAgICAgICA8bG9naWM6cHJlc2VudCBuYW1lPSJncm91cEZvcm0iPgorICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJyb2xlcyI+PC9sYWJlbD4KKyAgICAgICAgICAgICAgPGh0bWw6bXVsdGlib3ggcHJvcGVydHk9InJvbGVzIiB2YWx1ZT0iPCU9IHJvbGUgJT4iIHN0eWxlSWQ9InJvbGVzIi8+CisgICAgICAgICAgICA8L2xvZ2ljOnByZXNlbnQ+CisgICAgICAgICAgICA8bG9naWM6cHJlc2VudCBuYW1lPSJ1c2VyRm9ybSI+CisgICAgICAgICAgICAgIDxsYWJlbCBmb3I9InJvbGVzIj48L2xhYmVsPgorICAgICAgICAgICAgICA8aHRtbDptdWx0aWJveCBwcm9wZXJ0eT0icm9sZXMiIHZhbHVlPSI8JT0gcm9sZSAlPiIgc3R5bGVJZD0icm9sZXMiLz4KKyAgICAgICAgICAgIDwvbG9naWM6cHJlc2VudD4KKyAgICAgICAgICAgIDxsb2dpYzpub3RQcmVzZW50IG5hbWU9Imdyb3VwRm9ybSI+CisgICAgICAgICAgICAgIDxsb2dpYzpub3RQcmVzZW50IG5hbWU9InVzZXJGb3JtIj4KKyAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJyb2xlcyI+PC9sYWJlbD4KKyAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9InJvbGVzIgorICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSI8JT0gcm9sZSAlPiIgc3R5bGVJZD0icm9sZXMiPgorICAgICAgICAgICAgICA8L2xvZ2ljOm5vdFByZXNlbnQ+CisgICAgICAgICAgICA8L2xvZ2ljOm5vdFByZXNlbnQ+CisgICAgICAgICAgPC90ZD4KKyAgICAgICAgPC9sb2dpYzpwcmVzZW50PgorICAgICAgICA8dGQgc2NvcGU9InJvdyI+PGRpdiBhbGlnbj0ibGVmdCIgY2xhc3M9InRhYmxlLW5vcm1hbC10ZXh0Ij4mbmJzcDsKKyAgICAgICAgICA8aHRtbDpsaW5rIHBhZ2U9JzwlPSAiL3VzZXJzL3NldFVwUm9sZS5kbz9vYmplY3ROYW1lPSIgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZShyb2xlKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiZkYXRhYmFzZU5hbWU9IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUocmVxdWVzdC5nZXRQYXJhbWV0ZXIoImRhdGFiYXNlTmFtZSIpKSAlPic+CisgICAgICAgICAgICA8Y29udHJvbHM6YXR0cmlidXRlIG5hbWU9InJvbGUiIGF0dHJpYnV0ZT0icm9sZW5hbWUiLz4KKyAgICAgICAgICA8L2h0bWw6bGluaz4KKyAgICAgICAgPC9kaXY+PC90ZD4KKyAgICAgICAgPHRkIHNjb3BlPSJyb3ciPjxkaXYgYWxpZ249ImxlZnQiIGNsYXNzPSJ0YWJsZS1ub3JtYWwtdGV4dCI+Jm5ic3A7CisgICAgICAgICAgPGNvbnRyb2xzOmF0dHJpYnV0ZSBuYW1lPSJyb2xlIiBhdHRyaWJ1dGU9ImRlc2NyaXB0aW9uIi8+CisgICAgICAgIDwvZGl2PjwvdGQ+CisgICAgICA8L3RyPgorICAgIDwvbG9naWM6aXRlcmF0ZT4KKyAgICA8L2xvZ2ljOnByZXNlbnQ+CisgIDwvdGFibGU+CisKKzwvdGQ+PC90cj48L3RhYmxlPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vdXNlcnMvdXNlci5qc3AgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi91c2Vycy91c2VyLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWFjMDc3Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vdXNlcnMvdXNlci5qc3AKQEAgLTAsMCArMSwxMzcgQEAKKzwhLS0gU3RhbmRhcmQgU3RydXRzIEVudHJpZXMgLS0+CisKKzwlQCBwYWdlIGxhbmd1YWdlPSJqYXZhIiBpbXBvcnQ9ImphdmEubmV0LlVSTEVuY29kZXIiIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9zdHJ1dHMtYmVhbi50bGQiIHByZWZpeD0iYmVhbiIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9zdHJ1dHMtaHRtbC50bGQiIHByZWZpeD0iaHRtbCIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9zdHJ1dHMtbG9naWMudGxkIiBwcmVmaXg9ImxvZ2ljIiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL2NvbnRyb2xzLnRsZCIgcHJlZml4PSJjb250cm9scyIgJT4KKworPGh0bWw6aHRtbCBsb2NhbGU9InRydWUiPgorCis8JUAgaW5jbHVkZSBmaWxlPSJoZWFkZXIuanNwIiAlPgorCis8IS0tIEJvZHkgLS0+Cis8Ym9keSBiZ2NvbG9yPSJ3aGl0ZSIgYmFja2dyb3VuZD0iLi4vaW1hZ2VzL1BhcGVyVGV4dHVyZS5naWYiPgorCis8IS0tRm9ybSAtLT4KKworPGh0bWw6ZXJyb3JzLz4KKworPGh0bWw6Zm9ybSBtZXRob2Q9IlBPU1QiIGFjdGlvbj0iL3VzZXJzL3NhdmVVc2VyIj4gPCEtLWZvY3VzPSJ1c2VybmFtZSItLT4KKworICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9ImRhdGFiYXNlTmFtZSIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9Im9iamVjdE5hbWUiLz4KKworICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KKyAgICA8dHIgY2xhc3M9InBhZ2UtdGl0bGUtcm93Ij4KKyAgICAgIDx0ZCBhbGlnbj0ibGVmdCIgbm93cmFwPgorICAgICAgICA8ZGl2IGNsYXNzPSJwYWdlLXRpdGxlLXRleHQiPgorICAgICAgICAgIDxiZWFuOndyaXRlIG5hbWU9InVzZXJGb3JtIiBwcm9wZXJ0eT0ibm9kZUxhYmVsIi8+CisgICAgICAgIDwvZGl2PgorICAgICAgPC90ZD4KKyAgICAgIDx0ZCBhbGlnbj0icmlnaHQiIG5vd3JhcD4KKyAgICAgICAgPGRpdiBjbGFzcz0icGFnZS10aXRsZS10ZXh0Ij4KKyAgICAgICAgICA8Y29udHJvbHM6YWN0aW9ucyBsYWJlbD0iVXNlciBBY3Rpb25zIj4KKyAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24gc2VsZWN0ZWQ9InRydWUiPgorICAgICAgICAgICAgICAtLS0tPGJlYW46bWVzc2FnZSBrZXk9ImFjdGlvbnMuYXZhaWxhYmxlLmFjdGlvbnMiLz4tLS0tCisgICAgICAgICAgICA8L2NvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24+CisgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9uIHVybD0nPCU9ICIvdXNlcnMvc2V0VXBVc2VyLmRvP2RhdGFiYXNlTmFtZT0iICsKKyAgICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJkYXRhYmFzZU5hbWUiKSkgJT4nPgorICAgICAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJ1c2Vycy5hY3Rpb25zLnVzZXIuY3JlYXRlIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmFjdGlvbj4KKworICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbiB1cmw9JzwlPSAiL3VzZXJzL2xpc3RVc2Vycy5kbz9kYXRhYmFzZU5hbWU9IiArCisgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUocmVxdWVzdC5nZXRQYXJhbWV0ZXIoImRhdGFiYXNlTmFtZSIpKSArCisgICAgICAgICAgICAgICAgIiZmb3J3YXJkPSIgKyBVUkxFbmNvZGVyLmVuY29kZSgiVXNlcnMgRGVsZXRlIExpc3QiKSAlPic+CisgICAgICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InVzZXJzLmFjdGlvbnMudXNlci5kZWxldGUiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgPC9jb250cm9sczphY3Rpb25zPgorICAgICAgICA8L2Rpdj4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgPC90YWJsZT4KKworICA8JUAgaW5jbHVkZSBmaWxlPSIuLi9idXR0b25zLmpzcCIgJT4KKzxicj4KKworICA8dGFibGUgY2xhc3M9ImJhY2stdGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIxIgorICAgICAgICAgd2lkdGg9IjEwMCUiPgorICAgIDx0cj4KKyAgICAgIDx0ZD4KKworICAgICAgICA8Y29udHJvbHM6dGFibGUgdGFibGVTdHlsZT0iZnJvbnQtdGFibGUiIGxpbmVTdHlsZT0ibGluZS1yb3ciPgorCisgICAgICAgICAgPGNvbnRyb2xzOnJvdyBoZWFkZXI9InRydWUiCisgICAgICAgICAgICAgICAgbGFiZWxTdHlsZT0idGFibGUtaGVhZGVyLXRleHQiIGRhdGFTdHlsZT0idGFibGUtaGVhZGVyLXRleHQiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0idXNlcnMudXNlci5wcm9wZXJ0aWVzIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgICZuYnNwOworICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IgorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9InVzZXJuYW1lIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InVzZXJzLnByb21wdC51c2VybmFtZSIvPgorICAgICAgICAgICAgPC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICA8bG9naWM6cHJlc2VudCBuYW1lPSJ1c2VyRm9ybSIgcHJvcGVydHk9Im9iamVjdE5hbWUiPgorICAgICAgICAgICAgICAgIDxiZWFuOndyaXRlIG5hbWU9InVzZXJGb3JtIiBwcm9wZXJ0eT0idXNlcm5hbWUiLz4KKyAgICAgICAgICAgICAgICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9InVzZXJuYW1lIi8+CisgICAgICAgICAgICAgIDwvbG9naWM6cHJlc2VudD4KKyAgICAgICAgICAgICAgPGxvZ2ljOm5vdFByZXNlbnQgbmFtZT0idXNlckZvcm0iIHByb3BlcnR5PSJvYmplY3ROYW1lIj4KKyAgICAgICAgICAgICAgICA8aHRtbDp0ZXh0IHByb3BlcnR5PSJ1c2VybmFtZSIgc2l6ZT0iMjQiIHN0eWxlSWQ9InVzZXJuYW1lIi8+CisgICAgICAgICAgICAgIDwvbG9naWM6bm90UHJlc2VudD4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJwYXNzd29yZCI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJ1c2Vycy5wcm9tcHQucGFzc3dvcmQiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgPGh0bWw6cGFzc3dvcmQgcHJvcGVydHk9InBhc3N3b3JkIiBzaXplPSIyNCIgc3R5bGVJZD0icGFzc3dvcmQiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJmdWxsbmFtZSI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJ1c2Vycy5wcm9tcHQuZnVsbE5hbWUiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgPGh0bWw6dGV4dCBwcm9wZXJ0eT0iZnVsbE5hbWUiIHNpemU9IjI0IiBtYXhsZW5ndGg9IjY0IiBzdHlsZUlkPSJmdWxsbmFtZSIvPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgIDwvY29udHJvbHM6dGFibGU+CisKKyAgICAgIDwvdGQ+CisKKyAgICA8L3RyPgorCisgIDwvdGFibGU+CisKKyAgPGJlYW46ZGVmaW5lIGlkPSJjaGVja2JveGVzIiBzY29wZT0icGFnZSIgdmFsdWU9InRydWUiLz4KKyAgPGJyPgorICA8JUAgaW5jbHVkZSBmaWxlPSJncm91cHMuanNwZiIgJT4KKyAgPGJyPgorICA8JUAgaW5jbHVkZSBmaWxlPSJyb2xlcy5qc3BmIiAlPgorCisgIDwlQCBpbmNsdWRlIGZpbGU9Ii4uL2J1dHRvbnMuanNwIiAlPgorCis8L2h0bWw6Zm9ybT4KKworPCEtLSBTdGFuZGFyZCBGb290ZXIgLS0+CisKKzwlQCBpbmNsdWRlIGZpbGU9ImZvb3Rlci5qc3AiICU+CisKKzwvYm9keT4KKworPC9odG1sOmh0bWw+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi91c2Vycy91c2Vycy5qc3BmIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vdXNlcnMvdXNlcnMuanNwZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTY4NDEyCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vdXNlcnMvdXNlcnMuanNwZgpAQCAtMCwwICsxLDQ2IEBACis8JS0tIFVzZXJzIExpc3QgLS0lPgorCis8dGFibGUgY2xhc3M9ImJhY2stdGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIxIgorICAgICAgIHdpZHRoPSIxMDAlIj48dHI+PHRkPiAKKworICA8dGFibGUgY2xhc3M9ImZyb250LXRhYmxlIiBib3JkZXI9IjEiCisgICBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KKyAgICA8dHIgY2xhc3M9ImhlYWRlci1yb3ciPgorICAgICAgPGxvZ2ljOnByZXNlbnQgbmFtZT0iY2hlY2tib3hlcyI+CisgICAgICAgIDx0ZCB3aWR0aD0iNSUiPjxkaXYgYWxpZ249ImxlZnQiIGNsYXNzPSJ0YWJsZS1oZWFkZXItdGV4dCI+CisgICAgICAgICAgJm5ic3A7CisgICAgICAgIDwvdGQ+CisgICAgICA8L2xvZ2ljOnByZXNlbnQ+CisgICAgICA8dGggc2NvcGU9ImNvbCIgd2lkdGg9IjIwJSI+PGRpdiBhbGlnbj0ibGVmdCIgY2xhc3M9InRhYmxlLWhlYWRlci10ZXh0Ij4KKyAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InVzZXJzLmxpc3QudXNlcm5hbWUiLz4KKyAgICAgIDwvZGl2PjwvdGg+CisgICAgICA8dGggc2NvcGU9ImNvbCI+PGRpdiBhbGlnbj0ibGVmdCIgY2xhc3M9InRhYmxlLWhlYWRlci10ZXh0Ij4KKyAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InVzZXJzLmxpc3QuZnVsbE5hbWUiLz4KKyAgICAgIDwvZGl2PjwvdGg+CisgICAgPC90cj4KKyAgICA8bG9naWM6aXRlcmF0ZSBuYW1lPSJ1c2Vyc0Zvcm0iIHByb3BlcnR5PSJ1c2VycyIKKyAgICAgICAgICAgICAgICAgICAgIGlkPSJ1c2VyIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKyAgICAgIDx0ciBjbGFzcz0ibGluZS1yb3ciPgorICAgICAgICA8bG9naWM6cHJlc2VudCBuYW1lPSJjaGVja2JveGVzIj4KKyAgICAgICAgICA8dGQgc2NvcGU9InJvdyI+PGRpdiBhbGlnbj0iY2VudGVyIiBjbGFzcz0idGFibGUtbm9ybWFsLXRleHQiPgorICAgICAgICAgICAgPGxhYmVsIGZvcj0idXNlcnMiPjwvbGFiZWw+CisgICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9InVzZXJzIgorICAgICAgICAgICAgICAgICAgdmFsdWU9IjwlPSB1c2VyICU+IiBzdHlsZUlkPSJ1c2VycyI+CisgICAgICAgICAgPC90ZD4KKyAgICAgICAgPC9sb2dpYzpwcmVzZW50PgorICAgICAgICA8dGQgc2NvcGU9InJvdyI+PGRpdiBhbGlnbj0ibGVmdCIgY2xhc3M9InRhYmxlLW5vcm1hbC10ZXh0Ij4mbmJzcDsKKyAgICAgICAgICA8aHRtbDpsaW5rIHBhZ2U9JzwlPSAiL3VzZXJzL3NldFVwVXNlci5kbz9vYmplY3ROYW1lPSIgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxFbmNvZGVyLmVuY29kZSh1c2VyKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiZkYXRhYmFzZU5hbWU9IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRW5jb2Rlci5lbmNvZGUocmVxdWVzdC5nZXRQYXJhbWV0ZXIoImRhdGFiYXNlTmFtZSIpKSAlPic+CisgICAgICAgICAgICA8Y29udHJvbHM6YXR0cmlidXRlIG5hbWU9InVzZXIiIGF0dHJpYnV0ZT0idXNlcm5hbWUiLz4KKyAgICAgICAgICA8L2h0bWw6bGluaz4KKyAgICAgICAgPC9kaXY+PC90ZD4KKyAgICAgICAgPHRkIHNjb3BlPSJyb3ciPjxkaXYgYWxpZ249ImxlZnQiIGNsYXNzPSJ0YWJsZS1ub3JtYWwtdGV4dCI+Jm5ic3A7CisgICAgICAgICAgPGNvbnRyb2xzOmF0dHJpYnV0ZSBuYW1lPSJ1c2VyIiBhdHRyaWJ1dGU9ImZ1bGxOYW1lIi8+CisgICAgICAgIDwvZGl2PjwvdGQ+CisgICAgICA8L3RyPgorICAgIDwvbG9naWM6aXRlcmF0ZT4KKyAgPC90YWJsZT4KKworPC90ZD48L3RyPjwvdGFibGU+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi92YWx2ZS9hY2Nlc3NMb2dWYWx2ZS5qc3AgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi92YWx2ZS9hY2Nlc3NMb2dWYWx2ZS5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODczYWYzNgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3ZhbHZlL2FjY2Vzc0xvZ1ZhbHZlLmpzcApAQCAtMCwwICsxLDE1MyBAQAorPCEtLSBTdGFuZGFyZCBTdHJ1dHMgRW50cmllcyAtLT4KKzwlQCBwYWdlIGxhbmd1YWdlPSJqYXZhIiBpbXBvcnQ9ImphdmEubmV0LlVSTEVuY29kZXIiIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9zdHJ1dHMtYmVhbi50bGQiIHByZWZpeD0iYmVhbiIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9zdHJ1dHMtaHRtbC50bGQiIHByZWZpeD0iaHRtbCIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9jb250cm9scy50bGQiIHByZWZpeD0iY29udHJvbHMiICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvc3RydXRzLWxvZ2ljLnRsZCIgcHJlZml4PSJsb2dpYyIgJT4KKworPGh0bWw6aHRtbCBsb2NhbGU9InRydWUiPgorCis8JUAgaW5jbHVkZSBmaWxlPSIuLi91c2Vycy9oZWFkZXIuanNwIiAlPgorCis8IS0tIEJvZHkgLS0+Cis8Ym9keSBiZ2NvbG9yPSJ3aGl0ZSIgYmFja2dyb3VuZD0iLi4vaW1hZ2VzL1BhcGVyVGV4dHVyZS5naWYiPgorCis8IS0tRm9ybSAtLT4KKworPGh0bWw6ZXJyb3JzLz4KKworPGh0bWw6Zm9ybSBtZXRob2Q9IlBPU1QiIGFjdGlvbj0iL1NhdmVBY2Nlc3NMb2dWYWx2ZSI+CisKKyAgPGJlYW46ZGVmaW5lIGlkPSJ0aGlzT2JqZWN0TmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIG5hbWU9ImFjY2Vzc0xvZ1ZhbHZlRm9ybSIgcHJvcGVydHk9Im9iamVjdE5hbWUiLz4KKyAgPGJlYW46ZGVmaW5lIGlkPSJ0aGlzUGFyZW50TmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIG5hbWU9ImFjY2Vzc0xvZ1ZhbHZlRm9ybSIgcHJvcGVydHk9InBhcmVudE9iamVjdE5hbWUiLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJhZG1pbkFjdGlvbiIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9InBhcmVudE9iamVjdE5hbWUiLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJvYmplY3ROYW1lIi8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0idmFsdmVUeXBlIi8+CisKKyAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CisgICAgPHRyIGJnY29sb3I9IjcxNzFBNSI+CisgICAgICA8dGQgd2lkdGg9IjgxJSI+CisgICAgICAgPGRpdiBjbGFzcz0icGFnZS10aXRsZS10ZXh0IiBhbGlnbj0ibGVmdCI+CisgICAgICAgICA8bG9naWM6ZXF1YWwgbmFtZT0iYWNjZXNzTG9nVmFsdmVGb3JtIiBwcm9wZXJ0eT0iYWRtaW5BY3Rpb24iIHZhbHVlPSJDcmVhdGUiPgorICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9ImFjdGlvbnMudmFsdmVzLmNyZWF0ZSIvPgorICAgICAgICAgIDwvbG9naWM6ZXF1YWw+CisgICAgICAgICAgPGxvZ2ljOmVxdWFsIG5hbWU9ImFjY2Vzc0xvZ1ZhbHZlRm9ybSIgcHJvcGVydHk9ImFkbWluQWN0aW9uIiB2YWx1ZT0iRWRpdCI+CisgICAgICAgICAgICA8YmVhbjp3cml0ZSBuYW1lPSJhY2Nlc3NMb2dWYWx2ZUZvcm0iIHByb3BlcnR5PSJub2RlTGFiZWwiLz4KKyAgICAgICAgICA8L2xvZ2ljOmVxdWFsPgorICAgICAgIDwvZGl2PgorICAgICAgPC90ZD4KKyAgICAgIDx0ZCBhbGlnbj0icmlnaHQiIG5vd3JhcD4KKyAgICAgICAgPGRpdiBjbGFzcz0icGFnZS10aXRsZS10ZXh0Ij4KKyAgICAgIDxjb250cm9sczphY3Rpb25zIGxhYmVsPSJWYWx2ZSBBY3Rpb25zIj4KKyAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24gc2VsZWN0ZWQ9InRydWUiPiAtLS0tPGJlYW46bWVzc2FnZSBrZXk9ImFjdGlvbnMuYXZhaWxhYmxlLmFjdGlvbnMiLz4tLS0tIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbj4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgPGxvZ2ljOm5vdEVxdWFsIG5hbWU9ImFjY2Vzc0xvZ1ZhbHZlRm9ybSIgcHJvcGVydHk9ImFkbWluQWN0aW9uIiB2YWx1ZT0iQ3JlYXRlIj4KKyAgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9uIHVybD0nPCU9ICIvRGVsZXRlVmFsdmUuZG8/IiAgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlbGVjdD0iICsgVVJMRW5jb2Rlci5lbmNvZGUodGhpc09iamVjdE5hbWUpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICImcGFyZW50PSIrIFVSTEVuY29kZXIuZW5jb2RlKHRoaXNQYXJlbnROYW1lKSAlPic+CisgICAgICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9ImFjdGlvbnMudmFsdmVzLmRlbGV0ZSIvPgorICAgICAgICAgICAgICA8L2NvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgICAgICA8L2xvZ2ljOm5vdEVxdWFsPgorICAgICAgIDwvY29udHJvbHM6YWN0aW9ucz4KKyAgICAgICAgIDwvZGl2PgorICAgICAgPC90ZD4KKyAgICA8L3RyPgorICA8L3RhYmxlPgorICAgIDwlQCBpbmNsdWRlIGZpbGU9Ii4uL2J1dHRvbnMuanNwIiAlPgorICA8YnI+CisKKyA8JS0tIEFjY2VzcyBMb2cgUHJvcGVydGllcyAtLSU+CisgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CisgICAgPHRyPiA8dGQ+IDxkaXYgY2xhc3M9InRhYmxlLXRpdGxlLXRleHQiPgorICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0idmFsdmUuYWNjZXNzLnByb3BlcnRpZXMiLz4KKyAgICA8L2Rpdj4gPC90ZD4gPC90cj4KKyAgPC90YWJsZT4KKworICA8dGFibGUgY2xhc3M9ImJhY2stdGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CisgICAgPHRyPgorICAgICAgPHRkPgorICAgICAgIDxjb250cm9sczp0YWJsZSB0YWJsZVN0eWxlPSJmcm9udC10YWJsZSIgbGluZVN0eWxlPSJsaW5lLXJvdyI+CisgICAgICAgICAgICA8Y29udHJvbHM6cm93IGhlYWRlcj0idHJ1ZSIKKyAgICAgICAgICAgICAgICBsYWJlbFN0eWxlPSJ0YWJsZS1oZWFkZXItdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1oZWFkZXItdGV4dCI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9InNlcnZpY2UucHJvcGVydHkiLz48L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+PGJlYW46bWVzc2FnZSBrZXk9InNlcnZpY2UudmFsdWUiLz48L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9InR5cGUiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJjb25uZWN0b3IudHlwZSIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgICAgIDxsb2dpYzplcXVhbCBuYW1lPSJhY2Nlc3NMb2dWYWx2ZUZvcm0iIHByb3BlcnR5PSJhZG1pbkFjdGlvbiIgdmFsdWU9IkNyZWF0ZSI+CisgICAgICAgICAgICAgICAgICAgIDxodG1sOnNlbGVjdCBwcm9wZXJ0eT0idmFsdmVUeXBlIiBvbmNoYW5nZT0iSUFfanVtcE1lbnUoJ3NlbGYnLHRoaXMpIiBzdHlsZUlkPSJ0eXBlIj4KKyAgICAgICAgICAgICAgICAgICAgIDxiZWFuOmRlZmluZSBpZD0idmFsdmVUeXBlVmFscyIgbmFtZT0iYWNjZXNzTG9nVmFsdmVGb3JtIiBwcm9wZXJ0eT0idmFsdmVUeXBlVmFscyIvPgorICAgICAgICAgICAgICAgICAgICAgPGh0bWw6b3B0aW9ucyBjb2xsZWN0aW9uPSJ2YWx2ZVR5cGVWYWxzIiBwcm9wZXJ0eT0idmFsdWUiIGxhYmVsUHJvcGVydHk9ImxhYmVsIi8+CisgICAgICAgICAgICAgICAgICAgIDwvaHRtbDpzZWxlY3Q+CisgICAgICAgICAgICAgICAgPC9sb2dpYzplcXVhbD4KKyAgICAgICAgICAgICAgICA8bG9naWM6ZXF1YWwgbmFtZT0iYWNjZXNzTG9nVmFsdmVGb3JtIiBwcm9wZXJ0eT0iYWRtaW5BY3Rpb24iIHZhbHVlPSJFZGl0Ij4KKyAgICAgICAgICAgICAgICAgIDxiZWFuOndyaXRlIG5hbWU9ImFjY2Vzc0xvZ1ZhbHZlRm9ybSIgcHJvcGVydHk9InZhbHZlVHlwZSIgc2NvcGU9InNlc3Npb24iLz4KKyAgICAgICAgICAgICAgICA8L2xvZ2ljOmVxdWFsPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9ImRpcmVjdG9yeSI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9ImxvZ2dlci5kaXJlY3RvcnkiLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICA8aHRtbDp0ZXh0IHByb3BlcnR5PSJkaXJlY3RvcnkiIHNpemU9IjMwIiBzdHlsZUlkPSJkaXJlY3RvcnkiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJwYXR0ZXJuIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0idmFsdmUucGF0dGVybiIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgICAgPGh0bWw6dGV4dGFyZWEgcHJvcGVydHk9InBhdHRlcm4iIGNvbHM9IjMwIiByb3dzPSIyIiBzdHlsZUlkPSJwYXR0ZXJuIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0icHJlZml4Ij4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0ibG9nZ2VyLnByZWZpeCIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgICAgPGh0bWw6dGV4dCBwcm9wZXJ0eT0icHJlZml4IiBzaXplPSIzMCIgc3R5bGVJZD0icHJlZml4Ii8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0icmVzb2x2ZUhvc3RzIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0idmFsdmUucmVzb2x2ZUhvc3RzIi8+OjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgICA8aHRtbDpzZWxlY3QgcHJvcGVydHk9InJlc29sdmVIb3N0cyIgc3R5bGVJZD0icmVzb2x2ZUhvc3RzIj4KKyAgICAgICAgICAgICAgICAgICAgIDxiZWFuOmRlZmluZSBpZD0iYm9vbGVhblZhbHMiIG5hbWU9ImFjY2Vzc0xvZ1ZhbHZlRm9ybSIgcHJvcGVydHk9ImJvb2xlYW5WYWxzIi8+CisgICAgICAgICAgICAgICAgICAgICA8aHRtbDpvcHRpb25zIGNvbGxlY3Rpb249ImJvb2xlYW5WYWxzIiBwcm9wZXJ0eT0idmFsdWUiCisgICAgICAgICAgICAgICAgICAgbGFiZWxQcm9wZXJ0eT0ibGFiZWwiLz4KKyAgICAgICAgICAgICAgICA8L2h0bWw6c2VsZWN0PgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9InJvdGF0YWJsZSI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9InZhbHZlLnJvdGF0YWJsZSIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgICAgPGh0bWw6c2VsZWN0IHByb3BlcnR5PSJyb3RhdGFibGUiIHN0eWxlSWQ9InJvdGF0YWJsZSI+CisgICAgICAgICAgICAgICAgICAgICA8YmVhbjpkZWZpbmUgaWQ9ImJvb2xlYW5WYWxzIiBuYW1lPSJhY2Nlc3NMb2dWYWx2ZUZvcm0iIHByb3BlcnR5PSJib29sZWFuVmFscyIvPgorICAgICAgICAgICAgICAgICAgICAgPGh0bWw6b3B0aW9ucyBjb2xsZWN0aW9uPSJib29sZWFuVmFscyIgcHJvcGVydHk9InZhbHVlIgorICAgICAgICAgICAgICAgICAgIGxhYmVsUHJvcGVydHk9ImxhYmVsIi8+CisgICAgICAgICAgICAgICAgPC9odG1sOnNlbGVjdD4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisgICAgICAgIAorICAgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9InN1ZmZpeCI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9ImxvZ2dlci5zdWZmaXgiLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICAgIDxodG1sOnRleHQgcHJvcGVydHk9InN1ZmZpeCIgc2l6ZT0iMzAiIHN0eWxlSWQ9InN1ZmZpeCIvPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgPC9jb250cm9sczp0YWJsZT4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgPC90YWJsZT4KKyAgICA8JUAgaW5jbHVkZSBmaWxlPSIuLi9idXR0b25zLmpzcCIgJT4KKyAgPGJyPgorICA8L2h0bWw6Zm9ybT4KKzxwPiZuYnNwOzwvcD4KKzwvYm9keT4KKzwvaHRtbDpodG1sPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vdmFsdmUvcmVtb3RlQWRkclZhbHZlLmpzcCBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3ZhbHZlL3JlbW90ZUFkZHJWYWx2ZS5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAyZjY2MAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3ZhbHZlL3JlbW90ZUFkZHJWYWx2ZS5qc3AKQEAgLTAsMCArMSwxMTcgQEAKKzwhLS0gU3RhbmRhcmQgU3RydXRzIEVudHJpZXMgLS0+Cis8JUAgcGFnZSBsYW5ndWFnZT0iamF2YSIgaW1wb3J0PSJqYXZhLm5ldC5VUkxFbmNvZGVyIiBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgiICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvc3RydXRzLWJlYW4udGxkIiBwcmVmaXg9ImJlYW4iICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvc3RydXRzLWh0bWwudGxkIiBwcmVmaXg9Imh0bWwiICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvY29udHJvbHMudGxkIiBwcmVmaXg9ImNvbnRyb2xzIiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL3N0cnV0cy1sb2dpYy50bGQiIHByZWZpeD0ibG9naWMiICU+CisKKzxodG1sOmh0bWwgbG9jYWxlPSJ0cnVlIj4KKworPCVAIGluY2x1ZGUgZmlsZT0iLi4vdXNlcnMvaGVhZGVyLmpzcCIgJT4KKworPCEtLSBCb2R5IC0tPgorPGJvZHkgYmdjb2xvcj0id2hpdGUiIGJhY2tncm91bmQ9Ii4uL2ltYWdlcy9QYXBlclRleHR1cmUuZ2lmIj4KKworPCEtLUZvcm0gLS0+CisKKzxodG1sOmVycm9ycy8+CisKKzxodG1sOmZvcm0gbWV0aG9kPSJQT1NUIiBhY3Rpb249Ii9TYXZlUmVtb3RlQWRkclZhbHZlIj4KKworICA8YmVhbjpkZWZpbmUgaWQ9InRoaXNPYmplY3ROYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgbmFtZT0icmVtb3RlQWRkclZhbHZlRm9ybSIgcHJvcGVydHk9Im9iamVjdE5hbWUiLz4KKyAgPGJlYW46ZGVmaW5lIGlkPSJ0aGlzUGFyZW50TmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIG5hbWU9InJlbW90ZUFkZHJWYWx2ZUZvcm0iIHByb3BlcnR5PSJwYXJlbnRPYmplY3ROYW1lIi8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0iYWRtaW5BY3Rpb24iLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJwYXJlbnRPYmplY3ROYW1lIi8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0ib2JqZWN0TmFtZSIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9InZhbHZlVHlwZSIvPgorCisgIDx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgorICAgIDx0ciBiZ2NvbG9yPSI3MTcxQTUiPgorICAgICAgPHRkIHdpZHRoPSI4MSUiPgorICAgICAgIDxkaXYgY2xhc3M9InBhZ2UtdGl0bGUtdGV4dCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgPGxvZ2ljOmVxdWFsIG5hbWU9InJlbW90ZUFkZHJWYWx2ZUZvcm0iIHByb3BlcnR5PSJhZG1pbkFjdGlvbiIgdmFsdWU9IkNyZWF0ZSI+CisgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0iYWN0aW9ucy52YWx2ZXMuY3JlYXRlIi8+CisgICAgICAgICAgPC9sb2dpYzplcXVhbD4KKyAgICAgICAgICA8bG9naWM6ZXF1YWwgbmFtZT0icmVtb3RlQWRkclZhbHZlRm9ybSIgcHJvcGVydHk9ImFkbWluQWN0aW9uIiB2YWx1ZT0iRWRpdCI+CisgICAgICAgICAgICA8YmVhbjp3cml0ZSBuYW1lPSJyZW1vdGVBZGRyVmFsdmVGb3JtIiBwcm9wZXJ0eT0ibm9kZUxhYmVsIi8+CisgICAgICAgICAgPC9sb2dpYzplcXVhbD4KKyAgICAgICA8L2Rpdj4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQgYWxpZ249InJpZ2h0IiBub3dyYXA+CisgICAgICAgIDxkaXYgY2xhc3M9InBhZ2UtdGl0bGUtdGV4dCI+CisgICAgICA8Y29udHJvbHM6YWN0aW9ucyBsYWJlbD0iVmFsdmUgQWN0aW9ucyI+CisgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9uIHNlbGVjdGVkPSJ0cnVlIj4gLS0tLTxiZWFuOm1lc3NhZ2Uga2V5PSJhY3Rpb25zLmF2YWlsYWJsZS5hY3Rpb25zIi8+LS0tLSA8L2NvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24+IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSA8L2NvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgICAgIDxsb2dpYzpub3RFcXVhbCBuYW1lPSJyZW1vdGVBZGRyVmFsdmVGb3JtIiBwcm9wZXJ0eT0iYWRtaW5BY3Rpb24iIHZhbHVlPSJDcmVhdGUiPgorICAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24gdXJsPSc8JT0gIi9EZWxldGVWYWx2ZS5kbz8iICArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2VsZWN0PSIgKyBVUkxFbmNvZGVyLmVuY29kZSh0aGlzT2JqZWN0TmFtZSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiZwYXJlbnQ9IisgVVJMRW5jb2Rlci5lbmNvZGUodGhpc1BhcmVudE5hbWUpICU+Jz4KKyAgICAgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0iYWN0aW9ucy52YWx2ZXMuZGVsZXRlIi8+CisgICAgICAgICAgICAgIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgIDwvbG9naWM6bm90RXF1YWw+CisgICAgICAgPC9jb250cm9sczphY3Rpb25zPgorICAgICAgICAgPC9kaXY+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgIDwvdGFibGU+CisgICAgPCVAIGluY2x1ZGUgZmlsZT0iLi4vYnV0dG9ucy5qc3AiICU+CisgIDxicj4KKworIDwlLS0gUmVtb3RlIEFkZHIgVmFsdmUgUHJvcGVydGllcyAtLSU+CisgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CisgICAgPHRyPiA8dGQ+IDxkaXYgY2xhc3M9InRhYmxlLXRpdGxlLXRleHQiPgorICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0idmFsdmUucmVtb3RlYWRkcmVzcy5wcm9wZXJ0aWVzIi8+CisgICAgPC9kaXY+IDwvdGQ+IDwvdHI+CisgIDwvdGFibGU+CisKKyAgPHRhYmxlIGNsYXNzPSJiYWNrLXRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgorICAgIDx0cj4KKyAgICAgIDx0ZD4KKyAgICAgICA8Y29udHJvbHM6dGFibGUgdGFibGVTdHlsZT0iZnJvbnQtdGFibGUiIGxpbmVTdHlsZT0ibGluZS1yb3ciPgorICAgICAgICAgICAgPGNvbnRyb2xzOnJvdyBoZWFkZXI9InRydWUiCisgICAgICAgICAgICAgICAgbGFiZWxTdHlsZT0idGFibGUtaGVhZGVyLXRleHQiIGRhdGFTdHlsZT0idGFibGUtaGVhZGVyLXRleHQiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJzZXJ2aWNlLnByb3BlcnR5Ii8+PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPjxiZWFuOm1lc3NhZ2Uga2V5PSJzZXJ2aWNlLnZhbHVlIi8+PC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJ0eXBlIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0iY29ubmVjdG9yLnR5cGUiLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICAgICA8bG9naWM6ZXF1YWwgbmFtZT0icmVtb3RlQWRkclZhbHZlRm9ybSIgcHJvcGVydHk9ImFkbWluQWN0aW9uIiB2YWx1ZT0iQ3JlYXRlIj4KKyAgICAgICAgICAgICAgICAgICAgPGh0bWw6c2VsZWN0IHByb3BlcnR5PSJ2YWx2ZVR5cGUiIG9uY2hhbmdlPSJJQV9qdW1wTWVudSgnc2VsZicsdGhpcykiIHN0eWxlSWQ9InR5cGUiPgorICAgICAgICAgICAgICAgICAgICAgPGJlYW46ZGVmaW5lIGlkPSJ2YWx2ZVR5cGVWYWxzIiBuYW1lPSJyZW1vdGVBZGRyVmFsdmVGb3JtIiBwcm9wZXJ0eT0idmFsdmVUeXBlVmFscyIvPgorICAgICAgICAgICAgICAgICAgICAgPGh0bWw6b3B0aW9ucyBjb2xsZWN0aW9uPSJ2YWx2ZVR5cGVWYWxzIiBwcm9wZXJ0eT0idmFsdWUiIGxhYmVsUHJvcGVydHk9ImxhYmVsIi8+CisgICAgICAgICAgICAgICAgICAgIDwvaHRtbDpzZWxlY3Q+CisgICAgICAgICAgICAgICAgPC9sb2dpYzplcXVhbD4KKyAgICAgICAgICAgICAgICA8bG9naWM6ZXF1YWwgbmFtZT0icmVtb3RlQWRkclZhbHZlRm9ybSIgcHJvcGVydHk9ImFkbWluQWN0aW9uIiB2YWx1ZT0iRWRpdCI+CisgICAgICAgICAgICAgICAgICA8YmVhbjp3cml0ZSBuYW1lPSJyZW1vdGVBZGRyVmFsdmVGb3JtIiBwcm9wZXJ0eT0idmFsdmVUeXBlIiBzY29wZT0ic2Vzc2lvbiIvPgorICAgICAgICAgICAgICAgIDwvbG9naWM6ZXF1YWw+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0iYWxsb3dJUHMiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJ2YWx2ZS5hbGxvd0lQcyIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgICAgPGh0bWw6dGV4dGFyZWEgcHJvcGVydHk9ImFsbG93IiBjb2xzPSIzMCIgcm93cz0iMyIgc3R5bGVJZD0iYWxsb3dJUHMiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJkZW55SVBzIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0idmFsdmUuZGVueUlQcyIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgICAgPGh0bWw6dGV4dGFyZWEgcHJvcGVydHk9ImRlbnkiIGNvbHM9IjMwIiByb3dzPSIzIiBzdHlsZUlkPSJkZW55SVBzIi8+CisgICAgICAgICAgICA8L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICA8L2NvbnRyb2xzOnRhYmxlPgorICAgICAgPC90ZD4KKyAgICA8L3RyPgorICA8L3RhYmxlPgorICAgIDwlQCBpbmNsdWRlIGZpbGU9Ii4uL2J1dHRvbnMuanNwIiAlPgorICA8YnI+CisgIDwvaHRtbDpmb3JtPgorPHA+Jm5ic3A7PC9wPgorPC9ib2R5PgorPC9odG1sOmh0bWw+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9hZG1pbi92YWx2ZS9yZW1vdGVIb3N0VmFsdmUuanNwIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vdmFsdmUvcmVtb3RlSG9zdFZhbHZlLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzdhMTY1Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vdmFsdmUvcmVtb3RlSG9zdFZhbHZlLmpzcApAQCAtMCwwICsxLDExNyBAQAorPCEtLSBTdGFuZGFyZCBTdHJ1dHMgRW50cmllcyAtLT4KKzwlQCBwYWdlIGxhbmd1YWdlPSJqYXZhIiBpbXBvcnQ9ImphdmEubmV0LlVSTEVuY29kZXIiIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9zdHJ1dHMtYmVhbi50bGQiIHByZWZpeD0iYmVhbiIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9zdHJ1dHMtaHRtbC50bGQiIHByZWZpeD0iaHRtbCIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9jb250cm9scy50bGQiIHByZWZpeD0iY29udHJvbHMiICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvc3RydXRzLWxvZ2ljLnRsZCIgcHJlZml4PSJsb2dpYyIgJT4KKworPGh0bWw6aHRtbCBsb2NhbGU9InRydWUiPgorCis8JUAgaW5jbHVkZSBmaWxlPSIuLi91c2Vycy9oZWFkZXIuanNwIiAlPgorCis8IS0tIEJvZHkgLS0+Cis8Ym9keSBiZ2NvbG9yPSJ3aGl0ZSIgYmFja2dyb3VuZD0iLi4vaW1hZ2VzL1BhcGVyVGV4dHVyZS5naWYiPgorCis8IS0tRm9ybSAtLT4KKworPGh0bWw6ZXJyb3JzLz4KKworPGh0bWw6Zm9ybSBtZXRob2Q9IlBPU1QiIGFjdGlvbj0iL1NhdmVSZW1vdGVIb3N0VmFsdmUiPgorCisgIDxiZWFuOmRlZmluZSBpZD0idGhpc09iamVjdE5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICBuYW1lPSJyZW1vdGVIb3N0VmFsdmVGb3JtIiBwcm9wZXJ0eT0ib2JqZWN0TmFtZSIvPgorICA8YmVhbjpkZWZpbmUgaWQ9InRoaXNQYXJlbnROYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgbmFtZT0icmVtb3RlSG9zdFZhbHZlRm9ybSIgcHJvcGVydHk9InBhcmVudE9iamVjdE5hbWUiLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJhZG1pbkFjdGlvbiIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9InBhcmVudE9iamVjdE5hbWUiLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJvYmplY3ROYW1lIi8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0idmFsdmVUeXBlIi8+CisKKyAgPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CisgICAgPHRyIGJnY29sb3I9IjcxNzFBNSI+CisgICAgICA8dGQgd2lkdGg9IjgxJSI+CisgICAgICAgPGRpdiBjbGFzcz0icGFnZS10aXRsZS10ZXh0IiBhbGlnbj0ibGVmdCI+CisgICAgICAgICA8bG9naWM6ZXF1YWwgbmFtZT0icmVtb3RlSG9zdFZhbHZlRm9ybSIgcHJvcGVydHk9ImFkbWluQWN0aW9uIiB2YWx1ZT0iQ3JlYXRlIj4KKyAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJhY3Rpb25zLnZhbHZlcy5jcmVhdGUiLz4KKyAgICAgICAgICA8L2xvZ2ljOmVxdWFsPgorICAgICAgICAgIDxsb2dpYzplcXVhbCBuYW1lPSJyZW1vdGVIb3N0VmFsdmVGb3JtIiBwcm9wZXJ0eT0iYWRtaW5BY3Rpb24iIHZhbHVlPSJFZGl0Ij4KKyAgICAgICAgICAgIDxiZWFuOndyaXRlIG5hbWU9InJlbW90ZUhvc3RWYWx2ZUZvcm0iIHByb3BlcnR5PSJub2RlTGFiZWwiLz4KKyAgICAgICAgICA8L2xvZ2ljOmVxdWFsPgorICAgICAgIDwvZGl2PgorICAgICAgPC90ZD4KKyAgICAgIDx0ZCBhbGlnbj0icmlnaHQiIG5vd3JhcD4KKyAgICAgICAgPGRpdiBjbGFzcz0icGFnZS10aXRsZS10ZXh0Ij4KKyAgICAgIDxjb250cm9sczphY3Rpb25zIGxhYmVsPSJWYWx2ZSBBY3Rpb25zIj4KKyAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24gc2VsZWN0ZWQ9InRydWUiPiAtLS0tPGJlYW46bWVzc2FnZSBrZXk9ImFjdGlvbnMuYXZhaWxhYmxlLmFjdGlvbnMiLz4tLS0tIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbj4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgPGxvZ2ljOm5vdEVxdWFsIG5hbWU9InJlbW90ZUhvc3RWYWx2ZUZvcm0iIHByb3BlcnR5PSJhZG1pbkFjdGlvbiIgdmFsdWU9IkNyZWF0ZSI+CisgICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbiB1cmw9JzwlPSAiL0RlbGV0ZVZhbHZlLmRvPyIgICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZWxlY3Q9IiArIFVSTEVuY29kZXIuZW5jb2RlKHRoaXNPYmplY3ROYW1lKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJnBhcmVudD0iKyBVUkxFbmNvZGVyLmVuY29kZSh0aGlzUGFyZW50TmFtZSkgJT4nPgorICAgICAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJhY3Rpb25zLnZhbHZlcy5kZWxldGUiLz4KKyAgICAgICAgICAgICAgPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgICAgIDwvbG9naWM6bm90RXF1YWw+CisgICAgICAgPC9jb250cm9sczphY3Rpb25zPgorICAgICAgICAgPC9kaXY+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgIDwvdGFibGU+CisgICAgPCVAIGluY2x1ZGUgZmlsZT0iLi4vYnV0dG9ucy5qc3AiICU+CisgIDxicj4KKworIDwlLS0gUmVtb3RlSG9zdCBWYWx2ZSBQcm9wZXJ0aWVzIC0tJT4KKyA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KKyAgICA8dHI+IDx0ZD4gPGRpdiBjbGFzcz0idGFibGUtdGl0bGUtdGV4dCI+CisgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJ2YWx2ZS5yZW1vdGVob3N0LnByb3BlcnRpZXMiLz4KKyAgICA8L2Rpdj4gPC90ZD4gPC90cj4KKyAgPC90YWJsZT4KKworICA8dGFibGUgY2xhc3M9ImJhY2stdGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CisgICAgPHRyPgorICAgICAgPHRkPgorICAgICAgIDxjb250cm9sczp0YWJsZSB0YWJsZVN0eWxlPSJmcm9udC10YWJsZSIgbGluZVN0eWxlPSJsaW5lLXJvdyI+CisgICAgICAgICAgICA8Y29udHJvbHM6cm93IGhlYWRlcj0idHJ1ZSIKKyAgICAgICAgICAgICAgICBsYWJlbFN0eWxlPSJ0YWJsZS1oZWFkZXItdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1oZWFkZXItdGV4dCI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9InNlcnZpY2UucHJvcGVydHkiLz48L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+PGJlYW46bWVzc2FnZSBrZXk9InNlcnZpY2UudmFsdWUiLz48L2NvbnRyb2xzOmRhdGE+CisgICAgICAgIDwvY29udHJvbHM6cm93PgorCisgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9InR5cGUiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJjb25uZWN0b3IudHlwZSIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgICAgIDxsb2dpYzplcXVhbCBuYW1lPSJyZW1vdGVIb3N0VmFsdmVGb3JtIiBwcm9wZXJ0eT0iYWRtaW5BY3Rpb24iIHZhbHVlPSJDcmVhdGUiPgorICAgICAgICAgICAgICAgICAgICA8aHRtbDpzZWxlY3QgcHJvcGVydHk9InZhbHZlVHlwZSIgb25jaGFuZ2U9IklBX2p1bXBNZW51KCdzZWxmJyx0aGlzKSIgc3R5bGVJZD0idHlwZSI+CisgICAgICAgICAgICAgICAgICAgICA8YmVhbjpkZWZpbmUgaWQ9InZhbHZlVHlwZVZhbHMiIG5hbWU9InJlbW90ZUhvc3RWYWx2ZUZvcm0iIHByb3BlcnR5PSJ2YWx2ZVR5cGVWYWxzIi8+CisgICAgICAgICAgICAgICAgICAgICA8aHRtbDpvcHRpb25zIGNvbGxlY3Rpb249InZhbHZlVHlwZVZhbHMiIHByb3BlcnR5PSJ2YWx1ZSIgbGFiZWxQcm9wZXJ0eT0ibGFiZWwiLz4KKyAgICAgICAgICAgICAgICAgICAgPC9odG1sOnNlbGVjdD4KKyAgICAgICAgICAgICAgICA8L2xvZ2ljOmVxdWFsPgorICAgICAgICAgICAgICAgIDxsb2dpYzplcXVhbCBuYW1lPSJyZW1vdGVIb3N0VmFsdmVGb3JtIiBwcm9wZXJ0eT0iYWRtaW5BY3Rpb24iIHZhbHVlPSJFZGl0Ij4KKyAgICAgICAgICAgICAgICAgIDxiZWFuOndyaXRlIG5hbWU9InJlbW90ZUhvc3RWYWx2ZUZvcm0iIHByb3BlcnR5PSJ2YWx2ZVR5cGUiIHNjb3BlPSJzZXNzaW9uIi8+CisgICAgICAgICAgICAgICAgPC9sb2dpYzplcXVhbD4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJhbGxvd0hvc3RzIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0idmFsdmUuYWxsb3dIb3N0cyIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgICAgPGh0bWw6dGV4dGFyZWEgcHJvcGVydHk9ImFsbG93IiBjb2xzPSIzMCIgcm93cz0iMyIgc3R5bGVJZD0iYWxsb3dIb3N0cyIvPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgICA8Y29udHJvbHM6cm93IGxhYmVsU3R5bGU9InRhYmxlLWxhYmVsLXRleHQiIGRhdGFTdHlsZT0idGFibGUtbm9ybWFsLXRleHQiIHN0eWxlSWQ9ImRlbnlIb3N0cyI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9InZhbHZlLmRlbnlIb3N0cyIvPjo8L2NvbnRyb2xzOmxhYmVsPgorICAgICAgICAgICAgPGNvbnRyb2xzOmRhdGE+CisgICAgICAgICAgICAgICAgPGh0bWw6dGV4dGFyZWEgcHJvcGVydHk9ImRlbnkiIGNvbHM9IjMwIiByb3dzPSIzIiBzdHlsZUlkPSJkZW55SG9zdHMiLz4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgIDwvY29udHJvbHM6dGFibGU+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgIDwvdGFibGU+CisgICAgPCVAIGluY2x1ZGUgZmlsZT0iLi4vYnV0dG9ucy5qc3AiICU+CisgIDxicj4KKyAgPC9odG1sOmZvcm0+Cis8cD4mbmJzcDs8L3A+Cis8L2JvZHk+Cis8L2h0bWw6aHRtbD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3ZhbHZlL3JlcXVlc3REdW1wZXJWYWx2ZS5qc3AgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi92YWx2ZS9yZXF1ZXN0RHVtcGVyVmFsdmUuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3Mjk0YjQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi92YWx2ZS9yZXF1ZXN0RHVtcGVyVmFsdmUuanNwCkBAIC0wLDAgKzEsMTA0IEBACis8IS0tIFN0YW5kYXJkIFN0cnV0cyBFbnRyaWVzIC0tPgorPCVAIHBhZ2UgbGFuZ3VhZ2U9ImphdmEiIGltcG9ydD0iamF2YS5uZXQuVVJMRW5jb2RlciIgY29udGVudFR5cGU9InRleHQvaHRtbDtjaGFyc2V0PXV0Zi04IiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL3N0cnV0cy1iZWFuLnRsZCIgcHJlZml4PSJiZWFuIiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL3N0cnV0cy1odG1sLnRsZCIgcHJlZml4PSJodG1sIiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL2NvbnRyb2xzLnRsZCIgcHJlZml4PSJjb250cm9scyIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9zdHJ1dHMtbG9naWMudGxkIiBwcmVmaXg9ImxvZ2ljIiAlPgorCis8aHRtbDpodG1sIGxvY2FsZT0idHJ1ZSI+CisKKzwlQCBpbmNsdWRlIGZpbGU9Ii4uL3VzZXJzL2hlYWRlci5qc3AiICU+CisKKzwhLS0gQm9keSAtLT4KKzxib2R5IGJnY29sb3I9IndoaXRlIiBiYWNrZ3JvdW5kPSIuLi9pbWFnZXMvUGFwZXJUZXh0dXJlLmdpZiI+CisKKzwhLS1Gb3JtIC0tPgorCis8aHRtbDplcnJvcnMvPgorCis8aHRtbDpmb3JtIG1ldGhvZD0iUE9TVCIgYWN0aW9uPSIvU2F2ZVJlcXVlc3REdW1wZXJWYWx2ZSI+CisKKyAgPGJlYW46ZGVmaW5lIGlkPSJ0aGlzT2JqZWN0TmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgIG5hbWU9InJlcXVlc3REdW1wZXJWYWx2ZUZvcm0iIHByb3BlcnR5PSJvYmplY3ROYW1lIi8+CisgIDxiZWFuOmRlZmluZSBpZD0idGhpc1BhcmVudE5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICBuYW1lPSJyZXF1ZXN0RHVtcGVyVmFsdmVGb3JtIiBwcm9wZXJ0eT0icGFyZW50T2JqZWN0TmFtZSIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9ImFkbWluQWN0aW9uIi8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0icGFyZW50T2JqZWN0TmFtZSIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9Im9iamVjdE5hbWUiLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJ2YWx2ZVR5cGUiLz4KKworICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KKyAgICA8dHIgYmdjb2xvcj0iNzE3MUE1Ij4KKyAgICAgIDx0ZCB3aWR0aD0iODElIj4KKyAgICAgICA8ZGl2IGNsYXNzPSJwYWdlLXRpdGxlLXRleHQiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgIDxsb2dpYzplcXVhbCBuYW1lPSJyZXF1ZXN0RHVtcGVyVmFsdmVGb3JtIiBwcm9wZXJ0eT0iYWRtaW5BY3Rpb24iIHZhbHVlPSJDcmVhdGUiPgorICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9ImFjdGlvbnMudmFsdmVzLmNyZWF0ZSIvPgorICAgICAgICAgIDwvbG9naWM6ZXF1YWw+CisgICAgICAgICAgPGxvZ2ljOmVxdWFsIG5hbWU9InJlcXVlc3REdW1wZXJWYWx2ZUZvcm0iIHByb3BlcnR5PSJhZG1pbkFjdGlvbiIgdmFsdWU9IkVkaXQiPgorICAgICAgICAgICAgPGJlYW46d3JpdGUgbmFtZT0icmVxdWVzdER1bXBlclZhbHZlRm9ybSIgcHJvcGVydHk9Im5vZGVMYWJlbCIvPgorICAgICAgICAgIDwvbG9naWM6ZXF1YWw+CisgICAgICAgPC9kaXY+CisgICAgICA8L3RkPgorICAgICAgPHRkIGFsaWduPSJyaWdodCIgbm93cmFwPgorICAgICAgICA8ZGl2IGNsYXNzPSJwYWdlLXRpdGxlLXRleHQiPgorICAgICAgPGNvbnRyb2xzOmFjdGlvbnMgbGFiZWw9IlZhbHZlIEFjdGlvbnMiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbiBzZWxlY3RlZD0idHJ1ZSI+IC0tLS08YmVhbjptZXNzYWdlIGtleT0iYWN0aW9ucy5hdmFpbGFibGUuYWN0aW9ucyIvPi0tLS0gPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9uPiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgICA8bG9naWM6bm90RXF1YWwgbmFtZT0icmVxdWVzdER1bXBlclZhbHZlRm9ybSIgcHJvcGVydHk9ImFkbWluQWN0aW9uIiB2YWx1ZT0iQ3JlYXRlIj4KKyAgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9uIHVybD0nPCU9ICIvRGVsZXRlVmFsdmUuZG8/IiAgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlbGVjdD0iICsgVVJMRW5jb2Rlci5lbmNvZGUodGhpc09iamVjdE5hbWUpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICImcGFyZW50PSIrIFVSTEVuY29kZXIuZW5jb2RlKHRoaXNQYXJlbnROYW1lKSAlPic+CisgICAgICAgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9ImFjdGlvbnMudmFsdmVzLmRlbGV0ZSIvPgorICAgICAgICAgICAgICA8L2NvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgICAgICAgPC9sb2dpYzpub3RFcXVhbD4KKyAgICAgICA8L2NvbnRyb2xzOmFjdGlvbnM+CisgICAgICAgICA8L2Rpdj4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgPC90YWJsZT4KKworICAgIDwlQCBpbmNsdWRlIGZpbGU9Ii4uL2J1dHRvbnMuanNwIiAlPgorICA8YnI+CisKKyA8JS0tIFJlcXVlc3QgRHVtcGVyIFZhbHZlIFByb3BlcnRpZXMgLS0lPgorIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgorICAgIDx0cj4gPHRkPiA8ZGl2IGNsYXNzPSJ0YWJsZS10aXRsZS10ZXh0Ij4KKyAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InZhbHZlLnJlcXVlc3QucHJvcGVydGllcyIvPgorICAgIDwvZGl2PiA8L3RkPiA8L3RyPgorICA8L3RhYmxlPgorCisgIDx0YWJsZSBjbGFzcz0iYmFjay10YWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KKyAgICA8dHI+CisgICAgICA8dGQ+CisgICAgICAgPGNvbnRyb2xzOnRhYmxlIHRhYmxlU3R5bGU9ImZyb250LXRhYmxlIiBsaW5lU3R5bGU9ImxpbmUtcm93Ij4KKyAgICAgICAgICAgIDxjb250cm9sczpyb3cgaGVhZGVyPSJ0cnVlIgorICAgICAgICAgICAgICAgIGxhYmVsU3R5bGU9InRhYmxlLWhlYWRlci10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLWhlYWRlci10ZXh0Ij4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0ic2VydmljZS5wcm9wZXJ0eSIvPjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT48YmVhbjptZXNzYWdlIGtleT0ic2VydmljZS52YWx1ZSIvPjwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgIDxjb250cm9sczpyb3cgbGFiZWxTdHlsZT0idGFibGUtbGFiZWwtdGV4dCIgZGF0YVN0eWxlPSJ0YWJsZS1ub3JtYWwtdGV4dCIgc3R5bGVJZD0idHlwZSI+CisgICAgICAgICAgICA8Y29udHJvbHM6bGFiZWw+PGJlYW46bWVzc2FnZSBrZXk9ImNvbm5lY3Rvci50eXBlIi8+OjwvY29udHJvbHM6bGFiZWw+CisgICAgICAgICAgICA8Y29udHJvbHM6ZGF0YT4KKyAgICAgICAgICAgICAgICAgPGxvZ2ljOmVxdWFsIG5hbWU9InJlcXVlc3REdW1wZXJWYWx2ZUZvcm0iIHByb3BlcnR5PSJhZG1pbkFjdGlvbiIgdmFsdWU9IkNyZWF0ZSI+CisgICAgICAgICAgICAgICAgICAgIDxodG1sOnNlbGVjdCBwcm9wZXJ0eT0idmFsdmVUeXBlIiBvbmNoYW5nZT0iSUFfanVtcE1lbnUoJ3NlbGYnLHRoaXMpIiBzdHlsZUlkPSJ0eXBlIj4KKyAgICAgICAgICAgICAgICAgICAgIDxiZWFuOmRlZmluZSBpZD0idmFsdmVUeXBlVmFscyIgbmFtZT0icmVxdWVzdER1bXBlclZhbHZlRm9ybSIgcHJvcGVydHk9InZhbHZlVHlwZVZhbHMiLz4KKyAgICAgICAgICAgICAgICAgICAgIDxodG1sOm9wdGlvbnMgY29sbGVjdGlvbj0idmFsdmVUeXBlVmFscyIgcHJvcGVydHk9InZhbHVlIiBsYWJlbFByb3BlcnR5PSJsYWJlbCIvPgorICAgICAgICAgICAgICAgICAgICA8L2h0bWw6c2VsZWN0PgorICAgICAgICAgICAgICAgIDwvbG9naWM6ZXF1YWw+CisgICAgICAgICAgICAgICAgPGxvZ2ljOmVxdWFsIG5hbWU9InJlcXVlc3REdW1wZXJWYWx2ZUZvcm0iIHByb3BlcnR5PSJhZG1pbkFjdGlvbiIgdmFsdWU9IkVkaXQiPgorICAgICAgICAgICAgICAgICAgPGJlYW46d3JpdGUgbmFtZT0icmVxdWVzdER1bXBlclZhbHZlRm9ybSIgcHJvcGVydHk9InZhbHZlVHlwZSIgc2NvcGU9InNlc3Npb24iLz4KKyAgICAgICAgICAgICAgICA8L2xvZ2ljOmVxdWFsPgorICAgICAgICAgICAgPC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgPC9jb250cm9sczp0YWJsZT4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgPC90YWJsZT4KKyAgICA8JUAgaW5jbHVkZSBmaWxlPSIuLi9idXR0b25zLmpzcCIgJT4KKyAgPGJyPgorICA8L2h0bWw6Zm9ybT4KKzxwPiZuYnNwOzwvcD4KKzwvYm9keT4KKzwvaHRtbDpodG1sPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vdmFsdmUvc2luZ2xlU2lnbk9uVmFsdmUuanNwIGIvY29udGFpbmVyL3dlYmFwcHMvYWRtaW4vdmFsdmUvc2luZ2xlU2lnbk9uVmFsdmUuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjODIyNjMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi92YWx2ZS9zaW5nbGVTaWduT25WYWx2ZS5qc3AKQEAgLTAsMCArMSwxMDMgQEAKKzwhLS0gU3RhbmRhcmQgU3RydXRzIEVudHJpZXMgLS0+Cis8JUAgcGFnZSBsYW5ndWFnZT0iamF2YSIgaW1wb3J0PSJqYXZhLm5ldC5VUkxFbmNvZGVyIiBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgiICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvc3RydXRzLWJlYW4udGxkIiBwcmVmaXg9ImJlYW4iICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvc3RydXRzLWh0bWwudGxkIiBwcmVmaXg9Imh0bWwiICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvY29udHJvbHMudGxkIiBwcmVmaXg9ImNvbnRyb2xzIiAlPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL3N0cnV0cy1sb2dpYy50bGQiIHByZWZpeD0ibG9naWMiICU+CisKKzxodG1sOmh0bWwgbG9jYWxlPSJ0cnVlIj4KKworPCVAIGluY2x1ZGUgZmlsZT0iLi4vdXNlcnMvaGVhZGVyLmpzcCIgJT4KKworPCEtLSBCb2R5IC0tPgorPGJvZHkgYmdjb2xvcj0id2hpdGUiIGJhY2tncm91bmQ9Ii4uL2ltYWdlcy9QYXBlclRleHR1cmUuZ2lmIj4KKworPCEtLUZvcm0gLS0+CisKKzxodG1sOmVycm9ycy8+CisKKzxodG1sOmZvcm0gbWV0aG9kPSJQT1NUIiBhY3Rpb249Ii9TYXZlU2luZ2xlU2lnbk9uIj4KKworICA8YmVhbjpkZWZpbmUgaWQ9InRoaXNPYmplY3ROYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgbmFtZT0ic2luZ2xlU2lnbk9uVmFsdmVGb3JtIiBwcm9wZXJ0eT0ib2JqZWN0TmFtZSIvPgorICA8YmVhbjpkZWZpbmUgaWQ9InRoaXNQYXJlbnROYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgbmFtZT0ic2luZ2xlU2lnbk9uVmFsdmVGb3JtIiBwcm9wZXJ0eT0icGFyZW50T2JqZWN0TmFtZSIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9ImFkbWluQWN0aW9uIi8+CisgIDxodG1sOmhpZGRlbiBwcm9wZXJ0eT0icGFyZW50T2JqZWN0TmFtZSIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9Im9iamVjdE5hbWUiLz4KKyAgPGh0bWw6aGlkZGVuIHByb3BlcnR5PSJ2YWx2ZVR5cGUiLz4KKworICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KKyAgICA8dHIgYmdjb2xvcj0iNzE3MUE1Ij4KKyAgICAgIDx0ZCB3aWR0aD0iODElIj4KKyAgICAgICA8ZGl2IGNsYXNzPSJwYWdlLXRpdGxlLXRleHQiIGFsaWduPSJsZWZ0Ij4KKyAgICAgICAgIDxsb2dpYzplcXVhbCBuYW1lPSJzaW5nbGVTaWduT25WYWx2ZUZvcm0iIHByb3BlcnR5PSJhZG1pbkFjdGlvbiIgdmFsdWU9IkNyZWF0ZSI+CisgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0iYWN0aW9ucy52YWx2ZXMuY3JlYXRlIi8+CisgICAgICAgICAgPC9sb2dpYzplcXVhbD4KKyAgICAgICAgICA8bG9naWM6ZXF1YWwgbmFtZT0ic2luZ2xlU2lnbk9uVmFsdmVGb3JtIiBwcm9wZXJ0eT0iYWRtaW5BY3Rpb24iIHZhbHVlPSJFZGl0Ij4KKyAgICAgICAgICAgIDxiZWFuOndyaXRlIG5hbWU9InNpbmdsZVNpZ25PblZhbHZlRm9ybSIgcHJvcGVydHk9Im5vZGVMYWJlbCIvPgorICAgICAgICAgIDwvbG9naWM6ZXF1YWw+CisgICAgICAgPC9kaXY+CisgICAgICA8L3RkPgorICAgICAgPHRkIGFsaWduPSJyaWdodCIgbm93cmFwPgorICAgICAgICA8ZGl2IGNsYXNzPSJwYWdlLXRpdGxlLXRleHQiPgorICAgICAgPGNvbnRyb2xzOmFjdGlvbnMgbGFiZWw9IlZhbHZlIEFjdGlvbnMiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmFjdGlvbiBzZWxlY3RlZD0idHJ1ZSI+IC0tLS08YmVhbjptZXNzYWdlIGtleT0iYWN0aW9ucy5hdmFpbGFibGUuYWN0aW9ucyIvPi0tLS0gPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9uPiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgICA8bG9naWM6bm90RXF1YWwgbmFtZT0ic2luZ2xlU2lnbk9uVmFsdmVGb3JtIiBwcm9wZXJ0eT0iYWRtaW5BY3Rpb24iIHZhbHVlPSJDcmVhdGUiPgorICAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24gdXJsPSc8JT0gIi9EZWxldGVWYWx2ZS5kbz8iICArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2VsZWN0PSIgKyBVUkxFbmNvZGVyLmVuY29kZSh0aGlzT2JqZWN0TmFtZSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiZwYXJlbnQ9IisgVVJMRW5jb2Rlci5lbmNvZGUodGhpc1BhcmVudE5hbWUpICU+Jz4KKyAgICAgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0iYWN0aW9ucy52YWx2ZXMuZGVsZXRlIi8+CisgICAgICAgICAgICAgIDwvY29udHJvbHM6YWN0aW9uPgorICAgICAgICAgICAgICA8L2xvZ2ljOm5vdEVxdWFsPgorICAgICAgIDwvY29udHJvbHM6YWN0aW9ucz4KKyAgICAgICAgIDwvZGl2PgorICAgICAgPC90ZD4KKyAgICA8L3RyPgorICA8L3RhYmxlPgorICAgIDwlQCBpbmNsdWRlIGZpbGU9Ii4uL2J1dHRvbnMuanNwIiAlPgorICA8YnI+CisKKyA8JS0tIFNpbmdsZSBTaWduIE9uIFZhbHZlIFByb3BlcnRpZXMgLS0lPgorIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgorICAgIDx0cj4gPHRkPiA8ZGl2IGNsYXNzPSJ0YWJsZS10aXRsZS10ZXh0Ij4KKyAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9InZhbHZlLnNpbmdsZS5wcm9wZXJ0aWVzIi8+CisgICAgPC9kaXY+IDwvdGQ+IDwvdHI+CisgIDwvdGFibGU+CisKKyAgPHRhYmxlIGNsYXNzPSJiYWNrLXRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgorICAgIDx0cj4KKyAgICAgIDx0ZD4KKyAgICAgICA8Y29udHJvbHM6dGFibGUgdGFibGVTdHlsZT0iZnJvbnQtdGFibGUiIGxpbmVTdHlsZT0ibGluZS1yb3ciPgorICAgICAgICAgICAgPGNvbnRyb2xzOnJvdyBoZWFkZXI9InRydWUiCisgICAgICAgICAgICAgICAgbGFiZWxTdHlsZT0idGFibGUtaGVhZGVyLXRleHQiIGRhdGFTdHlsZT0idGFibGUtaGVhZGVyLXRleHQiPgorICAgICAgICAgICAgPGNvbnRyb2xzOmxhYmVsPjxiZWFuOm1lc3NhZ2Uga2V5PSJzZXJ2aWNlLnByb3BlcnR5Ii8+PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPjxiZWFuOm1lc3NhZ2Uga2V5PSJzZXJ2aWNlLnZhbHVlIi8+PC9jb250cm9sczpkYXRhPgorICAgICAgICA8L2NvbnRyb2xzOnJvdz4KKworICAgICAgPGNvbnRyb2xzOnJvdyBsYWJlbFN0eWxlPSJ0YWJsZS1sYWJlbC10ZXh0IiBkYXRhU3R5bGU9InRhYmxlLW5vcm1hbC10ZXh0IiBzdHlsZUlkPSJ0eXBlIj4KKyAgICAgICAgICAgIDxjb250cm9sczpsYWJlbD48YmVhbjptZXNzYWdlIGtleT0iY29ubmVjdG9yLnR5cGUiLz46PC9jb250cm9sczpsYWJlbD4KKyAgICAgICAgICAgIDxjb250cm9sczpkYXRhPgorICAgICAgICAgICAgICAgICA8bG9naWM6ZXF1YWwgbmFtZT0ic2luZ2xlU2lnbk9uVmFsdmVGb3JtIiBwcm9wZXJ0eT0iYWRtaW5BY3Rpb24iIHZhbHVlPSJDcmVhdGUiPgorICAgICAgICAgICAgICAgICAgICA8aHRtbDpzZWxlY3QgcHJvcGVydHk9InZhbHZlVHlwZSIgb25jaGFuZ2U9IklBX2p1bXBNZW51KCdzZWxmJyx0aGlzKSIgc3R5bGVJZD0idHlwZSI+CisgICAgICAgICAgICAgICAgICAgICA8YmVhbjpkZWZpbmUgaWQ9InZhbHZlVHlwZVZhbHMiIG5hbWU9InNpbmdsZVNpZ25PblZhbHZlRm9ybSIgcHJvcGVydHk9InZhbHZlVHlwZVZhbHMiLz4KKyAgICAgICAgICAgICAgICAgICAgIDxodG1sOm9wdGlvbnMgY29sbGVjdGlvbj0idmFsdmVUeXBlVmFscyIgcHJvcGVydHk9InZhbHVlIiBsYWJlbFByb3BlcnR5PSJsYWJlbCIvPgorICAgICAgICAgICAgICAgICAgICA8L2h0bWw6c2VsZWN0PgorICAgICAgICAgICAgICAgIDwvbG9naWM6ZXF1YWw+CisgICAgICAgICAgICAgICAgPGxvZ2ljOmVxdWFsIG5hbWU9InNpbmdsZVNpZ25PblZhbHZlRm9ybSIgcHJvcGVydHk9ImFkbWluQWN0aW9uIiB2YWx1ZT0iRWRpdCI+CisgICAgICAgICAgICAgICAgICA8YmVhbjp3cml0ZSBuYW1lPSJzaW5nbGVTaWduT25WYWx2ZUZvcm0iIHByb3BlcnR5PSJ2YWx2ZVR5cGUiIHNjb3BlPSJzZXNzaW9uIi8+CisgICAgICAgICAgICAgICAgPC9sb2dpYzplcXVhbD4KKyAgICAgICAgICAgIDwvY29udHJvbHM6ZGF0YT4KKyAgICAgICAgPC9jb250cm9sczpyb3c+CisKKyAgICAgIDwvY29udHJvbHM6dGFibGU+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgIDwvdGFibGU+CisgICAgPCVAIGluY2x1ZGUgZmlsZT0iLi4vYnV0dG9ucy5qc3AiICU+CisgIDxicj4KKyAgPC9odG1sOmZvcm0+Cis8cD4mbmJzcDs8L3A+Cis8L2JvZHk+Cis8L2h0bWw6aHRtbD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2FkbWluL3ZhbHZlL3ZhbHZlcy5qc3AgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi92YWx2ZS92YWx2ZXMuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1ZWZmMzUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9hZG1pbi92YWx2ZS92YWx2ZXMuanNwCkBAIC0wLDAgKzEsOTcgQEAKKzwhLS0gU3RhbmRhcmQgU3RydXRzIEVudHJpZXMgLS0+Cis8JUAgcGFnZSBsYW5ndWFnZT0iamF2YSIgaW1wb3J0PSJqYXZhLm5ldC5VUkxFbmNvZGVyIiBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgiICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvc3RydXRzLWJlYW4udGxkIiBwcmVmaXg9ImJlYW4iICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvc3RydXRzLWh0bWwudGxkIiBwcmVmaXg9Imh0bWwiICU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvc3RydXRzLWxvZ2ljLnRsZCIgcHJlZml4PSJsb2dpYyIgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9jb250cm9scy50bGQiIHByZWZpeD0iY29udHJvbHMiICU+CisKKzxodG1sOmh0bWwgbG9jYWxlPSJ0cnVlIj4KKworPCVAIGluY2x1ZGUgZmlsZT0iLi4vdXNlcnMvaGVhZGVyLmpzcCIgJT4KKworPCEtLSBCb2R5IC0tPgorPGJvZHkgYmdjb2xvcj0id2hpdGUiIGJhY2tncm91bmQ9Ii4uL2ltYWdlcy9QYXBlclRleHR1cmUuZ2lmIj4KKworPCEtLUZvcm0gLS0+CisKKzxodG1sOmVycm9ycy8+CisKKzxodG1sOmZvcm0gbWV0aG9kPSJwb3N0IiBhY3Rpb249Ii9EZWxldGVWYWx2ZXMiPgorCisgIDxiZWFuOmRlZmluZSBpZD0idGhpc1BhcmVudE5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICBuYW1lPSJ2YWx2ZXNGb3JtIiBwcm9wZXJ0eT0icGFyZW50T2JqZWN0TmFtZSIvPgorICA8aHRtbDpoaWRkZW4gcHJvcGVydHk9InBhcmVudE9iamVjdE5hbWUiLz4KKworICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KKyAgICA8dHIgYmdjb2xvcj0iNzE3MUE1Ij4KKyAgICAgIDx0ZCB3aWR0aD0iODElIj4KKyAgICAgICAgPGRpdiBjbGFzcz0icGFnZS10aXRsZS10ZXh0IiBhbGlnbj0ibGVmdCI+CisgICAgICAgICAgPGJlYW46bWVzc2FnZSBrZXk9ImFjdGlvbnMudmFsdmVzLmRlbGV0ZSIvPgorICAgICAgICA8L2Rpdj4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQgYWxpZ249InJpZ2h0IiBub3dyYXA+CisgICAgICAgIDxkaXYgY2xhc3M9InBhZ2UtdGl0bGUtdGV4dCI+CisgICAgICAgICAgICA8Y29udHJvbHM6YWN0aW9ucyBsYWJlbD0iVmFsdmUgQWN0aW9ucyI+CisgICAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24gc2VsZWN0ZWQ9InRydWUiPgorICAgICAgICAgICAgICAgIC0tLS08YmVhbjptZXNzYWdlIGtleT0iYWN0aW9ucy5hdmFpbGFibGUuYWN0aW9ucyIvPi0tLS0KKyAgICAgICAgICAgICAgPC9jb250cm9sczphY3Rpb24+CisgICAgICAgICAgICAgIDxjb250cm9sczphY3Rpb24gZGlzYWJsZWQ9InRydWUiPgorICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICA8L2NvbnRyb2xzOmFjdGlvbj4KKyAgICAgICAgICAgIDwvY29udHJvbHM6YWN0aW9ucz4KKyAgICAgICAgPC9kaXY+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgIDwvdGFibGU+CisKKzwlQCBpbmNsdWRlIGZpbGU9Ii4uL2J1dHRvbnMuanNwIiAlPgorICA8YnI+CisKKyAgPCUtLSBWYWx2ZXMgTGlzdCAtLSU+CisKKyAgPHRhYmxlIGNsYXNzPSJiYWNrLXRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMSIKKyAgICAgICAgIHdpZHRoPSIxMDAlIj4KKyAgICA8dHI+PHRkPgorCisgICAgICA8dGFibGUgY2xhc3M9ImZyb250LXRhYmxlIiBib3JkZXI9IjEiCisgICAgICAgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CisKKyAgICAgICAgPHRyIGNsYXNzPSJoZWFkZXItcm93Ij4KKyAgICAgICAgICA8dGQ+PGRpdiBhbGlnbj0ibGVmdCIgY2xhc3M9InRhYmxlLWhlYWRlci10ZXh0Ij4KKyAgICAgICAgICAgIDxiZWFuOm1lc3NhZ2Uga2V5PSJhY3Rpb25zLmRlbGV0ZSIvPgorICAgICAgICAgIDwvZGl2PjwvdGQ+CisgICAgICAgICAgPHRkPjxkaXYgYWxpZ249ImxlZnQiIGNsYXNzPSJ0YWJsZS1oZWFkZXItdGV4dCI+CisgICAgICAgICAgICA8YmVhbjptZXNzYWdlIGtleT0iaG9zdC5uYW1lIi8+CisgICAgICAgICAgPC9kaXY+PC90ZD4KKyAgICAgICAgPC90cj4KKworICAgICAgICA8bG9naWM6aXRlcmF0ZSBuYW1lPSJ2YWx2ZXNMaXN0IiBpZD0idmFsdmUiPgorICAgICAgICAgIDx0ciBjbGFzcz0ibGluZS1yb3ciPgorICAgICAgICAgICAgPHRkPjxkaXYgYWxpZ249ImxlZnQiIGNsYXNzPSJ0YWJsZS1ub3JtYWwtdGV4dCI+Jm5ic3A7CisgICAgICAgICAgICA8bGFiZWwgZm9yPSJ2YWx2ZXMiPjwvbGFiZWw+CisgICAgICAgICAgICAgIDxodG1sOm11bHRpYm94IHByb3BlcnR5PSJ2YWx2ZXMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSI8JT0gdmFsdmUudG9TdHJpbmcoKSAlPiIgc3R5bGVJZD0idmFsdmVzIi8+CisgICAgICAgICAgICA8L2Rpdj48L3RkPgorICAgICAgICAgICAgPHRkPjxkaXYgYWxpZ249ImxlZnQiIGNsYXNzPSJ0YWJsZS1ub3JtYWwtdGV4dCI+Jm5ic3A7CisgICAgICAgICAgICAgIDxodG1sOmxpbmsgcGFnZT0nPCU9ICIvRWRpdFZhbHZlLmRvP3NlbGVjdD0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLm5ldC5VUkxFbmNvZGVyLmVuY29kZSh2YWx2ZS50b1N0cmluZygpKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgIiZwYXJlbnQ9IisgVVJMRW5jb2Rlci5lbmNvZGUodGhpc1BhcmVudE5hbWUpICU+Jz4KKyAgICAgICAgICAgICAgICA8Y29udHJvbHM6YXR0cmlidXRlIG5hbWU9InZhbHZlIiBhdHRyaWJ1dGU9ImNsYXNzTmFtZSIvPgorICAgICAgICAgICAgICA8L2h0bWw6bGluaz4KKyAgICAgICAgICAgIDwvZGl2PjwvdGQ+CisgICAgICAgICAgPC90cj4KKyAgICAgICAgPC9sb2dpYzppdGVyYXRlPgorCisgICAgICA8L3RhYmxlPgorCisgICAgPC90ZD48L3RyPgorICA8L3RhYmxlPgorCis8JUAgaW5jbHVkZSBmaWxlPSIuLi9idXR0b25zLmpzcCIgJT4KKworICA8YnI+Cis8L2h0bWw6Zm9ybT4KKworPHA+Jm5ic3A7PC9wPgorPC9ib2R5PgorPC9odG1sOmh0bWw+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9iYWxhbmNlci9NRVRBLUlORi9jb250ZXh0LnhtbCBiL2NvbnRhaW5lci93ZWJhcHBzL2JhbGFuY2VyL01FVEEtSU5GL2NvbnRleHQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzY2Y3NTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9iYWxhbmNlci9NRVRBLUlORi9jb250ZXh0LnhtbApAQCAtMCwwICsxLDEyIEBACis8IS0tCisKKyAgICBDb250ZXh0IGNvbmZpZ3VyYXRpb24gZmlsZSBmb3IgdGhlIFRvbWNhdCBCYWxhbmNlciBXZWIgQXBwCisgICAgVGhpcyBpcyBvbmx5IG5lZWRlZCB0byBrZWVwIHRoZSBkaXN0cmlidXRpb24gc21hbGwgYW5kIGF2b2lkIGR1cGxpY2F0aW5nCisgICAgY29tbW9ucyBsaWJyYXJpZXMKKworICAgICRJZCQKKworLS0+CisKKworPENvbnRleHQgcHJpdmlsZWdlZD0idHJ1ZSIgYW50aVJlc291cmNlTG9ja2luZz0iZmFsc2UiIGFudGlKQVJMb2NraW5nPSJmYWxzZSIgLz4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2JhbGFuY2VyL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9iYWxhbmNlci9CYWxhbmNlckZpbHRlci5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYmFsYW5jZXIvV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2JhbGFuY2VyL0JhbGFuY2VyRmlsdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM3MmExYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2JhbGFuY2VyL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9iYWxhbmNlci9CYWxhbmNlckZpbHRlci5qYXZhCkBAIC0wLDAgKzEsMTQ2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDAsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmJhbGFuY2VyOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworCitpbXBvcnQgamF2YS5uZXQuVVJMOworCitpbXBvcnQgamF2YXguc2VydmxldC5GaWx0ZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5GaWx0ZXJDaGFpbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LkZpbHRlckNvbmZpZzsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldFJlc3BvbnNlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CisKKworLyoqCisgKiBUaGUgYmFsYW5jZXIgZmlsdGVyIHJlZGlyZWN0cyBpbmNvbWluZyByZXF1ZXN0cworICogYmFzZWQgb24gd2hhdCBydWxlcyB0aGV5IG1hdGNoLiAgVGhlIHJ1bGVzCisgKiBhcmUgY29uZmlndXJhYmxlIHZpYSBhbiBYTUwgZG9jdW1lbnQgd2hvc2UgVVJMCisgKiBpcyBzcGVjaWZpZWQgYXMgYW4gaW5pdC1wYXJhbSB0byB0aGlzIGZpbHRlci4KKyAqCisgKiBAYXV0aG9yIFlvYXYgU2hhcGlyYQorICovCitwdWJsaWMgY2xhc3MgQmFsYW5jZXJGaWx0ZXIgaW1wbGVtZW50cyBGaWx0ZXIgeworICAgIC8qKgorICAgICAqIFRoZSBydWxlcyB0aGlzIGZpbHRlciBjb25zdWx0cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFJ1bGVDaGFpbiBydWxlQ2hhaW47CisKKyAgICAvKioKKyAgICAgKiBUaGUgc2VydmxldCBjb250ZXh0LgorICAgICAqLworICAgIHByaXZhdGUgU2VydmxldENvbnRleHQgY29udGV4dDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHJ1bGUgY2hhaW4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBydWxlIGNoYWluCisgICAgICovCisgICAgcHJvdGVjdGVkIFJ1bGVDaGFpbiBnZXRSdWxlQ2hhaW4oKSB7CisgICAgICAgIHJldHVybiBydWxlQ2hhaW47CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSB0aGlzIGZpbHRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWx0ZXJDb25maWcgVGhlIGZpbHRlciBjb25maWcKKyAgICAgKiBAdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24gSWYgYW4gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgaW5pdChGaWx0ZXJDb25maWcgZmlsdGVyQ29uZmlnKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7CisgICAgICAgIGNvbnRleHQgPSBmaWx0ZXJDb25maWcuZ2V0U2VydmxldENvbnRleHQoKTsKKworICAgICAgICBTdHJpbmcgY29uZmlnVXJsUGFyYW0gPSBmaWx0ZXJDb25maWcuZ2V0SW5pdFBhcmFtZXRlcigiY29uZmlnVXJsIik7CisKKyAgICAgICAgaWYgKGNvbmZpZ1VybFBhcmFtID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uKCJjb25maWdVcmwgaXMgcmVxdWlyZWQuIik7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW5wdXQgPSBjb250ZXh0LmdldFJlc291cmNlQXNTdHJlYW0oY29uZmlnVXJsUGFyYW0pOworICAgICAgICAgICAgUnVsZXNQYXJzZXIgcGFyc2VyID0gbmV3IFJ1bGVzUGFyc2VyKGlucHV0KTsKKyAgICAgICAgICAgIHJ1bGVDaGFpbiA9IHBhcnNlci5nZXRSZXN1bHQoKTsKKyAgICAgICAgICAgIGNvbnRleHQubG9nKAorICAgICAgICAgICAgICAgIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIjogaW5pdCgpOiBydWxlQ2hhaW46ICIgKyBydWxlQ2hhaW4pOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaWx0ZXIgdGhlIGluY29taW5nIHJlcXVlc3QuCisgICAgICogQ29uc3VsdHMgdGhlIHJ1bGUgY2hhaW4gdG8gc2VlIGlmCisgICAgICogYW55IHJ1bGVzIG1hdGNoIHRoaXMgcmVxdWVzdCwgYW5kIGlmCisgICAgICogc28gcmVkaXJlY3RzLiAgT3RoZXJ3aXNlIHNpbXBseQorICAgICAqIGxldCByZXF1ZXN0IHRocm91Z2guCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgcmVxdWVzdAorICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgcmVzcG9uc2UKKyAgICAgKiBAcGFyYW0gY2hhaW4gVGhlIGZpbHRlciBjaGFpbgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gSWYgYW4gZXJyb3Igb2NjdXJzCisgICAgICogQHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIElmIGFuIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRvRmlsdGVyKAorICAgICAgICBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UsIEZpbHRlckNoYWluIGNoYWluKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworICAgICAgICBpZiAocmVzcG9uc2UuaXNDb21taXR0ZWQoKSkgeworICAgICAgICAgICAgY29udGV4dC5sb2coCisgICAgICAgICAgICAgICAgZ2V0Q2xhc3MoKS5nZXROYW1lKCkKKyAgICAgICAgICAgICAgICArICI6IGRvRmlsdGVyKCk6IG5vdCBpbnNwZWN0aW5nIGNvbW1pdHRlZCByZXNwb25zZS4iKTsKKyAgICAgICAgICAgIGNoYWluLmRvRmlsdGVyKHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICAgICAgfSBlbHNlIGlmICghKHJlcXVlc3QgaW5zdGFuY2VvZiBIdHRwU2VydmxldFJlcXVlc3QpKSB7CisgICAgICAgICAgICBjb250ZXh0LmxvZygKKyAgICAgICAgICAgICAgICBnZXRDbGFzcygpLmdldE5hbWUoKQorICAgICAgICAgICAgICAgICsgIjogZG9GaWx0ZXIoKTogbm90IGluc3BlY3Rpbmcgbm9uLUh0dHAgcmVxdWVzdC4iKTsKKyAgICAgICAgICAgIGNoYWluLmRvRmlsdGVyKHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCBocmVxID0gKEh0dHBTZXJ2bGV0UmVxdWVzdCkgcmVxdWVzdDsKKyAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgaHJlcyA9IChIdHRwU2VydmxldFJlc3BvbnNlKSByZXNwb25zZTsKKworICAgICAgICAgICAgVVJMIHJlZGlyZWN0VXJsID0gZ2V0UnVsZUNoYWluKCkuZXZhbHVhdGUoaHJlcSk7CisKKyAgICAgICAgICAgIGlmIChyZWRpcmVjdFVybCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGVuY29kZWQgPQorICAgICAgICAgICAgICAgICAgICBocmVzLmVuY29kZVJlZGlyZWN0VVJMKHJlZGlyZWN0VXJsLnRvU3RyaW5nKCkpOworCisgICAgICAgICAgICAgICAgY29udGV4dC5sb2coCisgICAgICAgICAgICAgICAgICAgIGdldENsYXNzKCkuZ2V0TmFtZSgpCisgICAgICAgICAgICAgICAgICAgICsgIjogZG9GaWx0ZXIoKTogcmVkaXJlY3RpbmcgcmVxdWVzdCBmb3IgIgorICAgICAgICAgICAgICAgICAgICArIGhyZXEuZ2V0UmVxdWVzdFVSTCgpLnRvU3RyaW5nKCkgKyAiIHRvICIgKyBlbmNvZGVkKTsKKworICAgICAgICAgICAgICAgIGhyZXMuc2VuZFJlZGlyZWN0KGVuY29kZWQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjaGFpbi5kb0ZpbHRlcihyZXF1ZXN0LCByZXNwb25zZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZXN0cm95IHRoaXMgZmlsdGVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3koKSB7CisgICAgICAgIGNvbnRleHQgPSBudWxsOworICAgICAgICBydWxlQ2hhaW4gPSBudWxsOworICAgIH0KK30KKworCisvLyBFbmQgb2YgZmlsZTogQmFsYW5jZUZpbHRlci5qYXZhCmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9iYWxhbmNlci9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYmFsYW5jZXIvUnVsZS5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYmFsYW5jZXIvV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2JhbGFuY2VyL1J1bGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjIyNDk1Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYmFsYW5jZXIvV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2JhbGFuY2VyL1J1bGUuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IDIwMDAsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmJhbGFuY2VyOworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKKworCisvKioKKyAqIFRoZSBSdWxlIGludGVyZmFjZSBpcyBpbXBsZW1lbnRlZCBieQorICogbG9hZCBiYWxhbmNpbmcgcnVsZXMuCisgKgorICogQGF1dGhvciBZb2F2IFNoYXBpcmEKKyAqLworcHVibGljIGludGVyZmFjZSBSdWxlIHsKKyAgICAvKioKKyAgICAgKiBEZXRlcm1pbmUgaWYgdGhlIGdpdmVuIHJlcXVlc3QKKyAgICAgKiBtYXRjaGVzIHRoZSBydWxlLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHJlcXVlc3QKKyAgICAgKiBAcmV0dXJuIGJvb2xlYW4gVHJ1ZSBpZiBtYXRjaGVzLCB3aWxsIGJlIHJlZGlyZWN0ZWQuCisgICAgICovCisgICAgYm9vbGVhbiBtYXRjaGVzKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHJlZGlyZWN0IFVSTCBmb3IKKyAgICAgKiByZXF1ZXN0cyB0aGF0IG1hdGNoIHRoaXMgcnVsZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIHJlZGlyZWN0IFVSTAorICAgICAqLworICAgIFN0cmluZyBnZXRSZWRpcmVjdFVybCgpOworfQorCisKKy8vIEVuZCBvZiBmaWxlOiBSdWxlLmphdmEKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2JhbGFuY2VyL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9iYWxhbmNlci9SdWxlQ2hhaW4uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2JhbGFuY2VyL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9iYWxhbmNlci9SdWxlQ2hhaW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2E3MzhjCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYmFsYW5jZXIvV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2JhbGFuY2VyL1J1bGVDaGFpbi5qYXZhCkBAIC0wLDAgKzEsMTQ1IEBACisvKgorICogQ29weXJpZ2h0IDIwMDAsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmJhbGFuY2VyOworCitpbXBvcnQgamF2YS5uZXQuVVJMOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworCisKKy8qKgorICogQSBSdWxlQ2hhaW4gaXMgYSBsaXN0IG9mIHJ1bGVzCisgKiBjb25zaWRlcmVkIGluIG9yZGVyLiAgVGhlIGZpcnN0CisgKiBydWxlIHRvIHN1Y2NlZWQgc3RvcHMgdGhlIGV2YWx1YXRpb24KKyAqIG9mIHJ1bGVzLgorICoKKyAqIEBhdXRob3IgWW9hdiBTaGFwaXJhCisgKi8KK3B1YmxpYyBjbGFzcyBSdWxlQ2hhaW4geworICAgIC8qKgorICAgICAqIFRoZSBsaXN0IG9mIHJ1bGVzIHRvIGV2YWx1YXRlLgorICAgICAqLworICAgIHByaXZhdGUgTGlzdCBydWxlczsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLgorICAgICAqLworICAgIHB1YmxpYyBSdWxlQ2hhaW4oKSB7CisgICAgICAgIHJ1bGVzID0gbmV3IEFycmF5TGlzdCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgcnVsZXMKKyAgICAgKiB0byBldmFsdWF0ZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gTGlzdAorICAgICAqLworICAgIHByb3RlY3RlZCBMaXN0IGdldFJ1bGVzKCkgeworICAgICAgICByZXR1cm4gcnVsZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhbiBpdGVyYXRvciBvdmVyCisgICAgICogdGhlIGxpc3Qgb2YgcnVsZXMgdG8gZXZhbHVhdGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEl0ZXJhdG9yCisgICAgICovCisgICAgcHJvdGVjdGVkIEl0ZXJhdG9yIGdldFJ1bGVJdGVyYXRvcigpIHsKKyAgICAgICAgcmV0dXJuIGdldFJ1bGVzKCkuaXRlcmF0b3IoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgcnVsZSB0byBldmFsdWF0ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0aGVSdWxlIFRoZSBydWxlIHRvIGFkZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFJ1bGUoUnVsZSB0aGVSdWxlKSB7CisgICAgICAgIGlmICh0aGVSdWxlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBydWxlIGNhbm5vdCBiZSBudWxsLiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZ2V0UnVsZXMoKS5hZGQodGhlUnVsZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFdmFsdWF0ZXMgdGhlIGdpdmVuIHJlcXVlc3QgdG8gc2VlIGlmCisgICAgICogYW55IG9mIHRoZSBydWxlcyBtYXRjaGVzLiAgUmV0dXJucyB0aGUKKyAgICAgKiByZWRpcmVjdCBVUkwgZm9yIHRoZSBmaXJzdCBtYXRjaGluZworICAgICAqIHJ1bGUuICBSZXR1cm5zIG51bGwgaWYgbm8gcnVsZXMgbWF0Y2gKKyAgICAgKiB0aGUgcmVxdWVzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSByZXF1ZXN0CisgICAgICogQHJldHVybiBVUkwgVGhlIGZpcnN0IG1hdGNoaW5nIHJ1bGUgVVJMCisgICAgICogQHNlZSBSdWxlI21hdGNoZXMoSHR0cFNlcnZsZXRSZXF1ZXN0KQorICAgICAqLworICAgIHB1YmxpYyBVUkwgZXZhbHVhdGUoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRlciA9IGdldFJ1bGVJdGVyYXRvcigpOworCisgICAgICAgIFJ1bGUgY3VycmVudFJ1bGUgPSBudWxsOworICAgICAgICBib29sZWFuIGN1cnJlbnRNYXRjaGVzID0gZmFsc2U7CisKKyAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBjdXJyZW50UnVsZSA9IChSdWxlKSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIGN1cnJlbnRNYXRjaGVzID0gY3VycmVudFJ1bGUubWF0Y2hlcyhyZXF1ZXN0KTsKKworICAgICAgICAgICAgaWYgKGN1cnJlbnRNYXRjaGVzKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVUkwoY3VycmVudFJ1bGUuZ2V0UmVkaXJlY3RVcmwoKSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gU3RyaW5nCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKworICAgICAgICBidWZmZXIuYXBwZW5kKCJbIik7CisgICAgICAgIGJ1ZmZlci5hcHBlbmQoZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgICBidWZmZXIuYXBwZW5kKCI6ICIpOworCisgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBnZXRSdWxlSXRlcmF0b3IoKTsKKyAgICAgICAgUnVsZSBjdXJyZW50UnVsZSA9IG51bGw7CisKKyAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBjdXJyZW50UnVsZSA9IChSdWxlKSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoY3VycmVudFJ1bGUpOworCisgICAgICAgICAgICBpZiAoaXRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCIsICIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiXSIpOworCisgICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKKyAgICB9Cit9CisKKworLy8gRW5kIG9mIGZpbGU6IFJ1bGVDaGFpbi5qYXZhCmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9iYWxhbmNlci9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYmFsYW5jZXIvUnVsZXNQYXJzZXIuamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2JhbGFuY2VyL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9iYWxhbmNlci9SdWxlc1BhcnNlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNTA0OTAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9iYWxhbmNlci9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYmFsYW5jZXIvUnVsZXNQYXJzZXIuamF2YQpAQCAtMCwwICsxLDg4IEBACisvKgorICogQ29weXJpZ2h0IDIwMDAsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmJhbGFuY2VyOworCitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5kaWdlc3Rlci5EaWdlc3RlcjsKKworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CisKKworLyoqCisgKiBUaGUgcnVsZXMgcGFyc2VyIHVzZXMgRGlnZXN0ZXIKKyAqIHRvIHBhcnNlIHRoZSBydWxlcyBkZWZpbml0aW9uCisgKiBmaWxlIGFuZCByZXR1cm4gYSBSdWxlQ2hhaW4gb2JqZWN0LgorICoKKyAqIEBhdXRob3IgWW9hdiBTaGFwaXJhCisgKi8KK3B1YmxpYyBjbGFzcyBSdWxlc1BhcnNlciB7CisgICAgLyoqCisgICAgICogVGhlIHJlc3VsdGluZyBydWxlIGNoYWluLgorICAgICAqLworICAgIHByaXZhdGUgUnVsZUNoYWluIHJlc3VsdDsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIGlucHV0IFRvIHJlYWQgdGhlIGNvbmZpZ3VyYXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgUnVsZXNQYXJzZXIoSW5wdXRTdHJlYW0gaW5wdXQpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIERpZ2VzdGVyIGRpZ2VzdGVyID0gY3JlYXRlRGlnZXN0ZXIoKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IChSdWxlQ2hhaW4pIGRpZ2VzdGVyLnBhcnNlKGlucHV0KTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgcGFyc2VkIHJ1bGUgY2hhaW4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSByZXN1bHRpbmcgUnVsZUNoYWluCisgICAgICovCisgICAgcHVibGljIFJ1bGVDaGFpbiBnZXRSZXN1bHQoKSB7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyB0aGUgZGlnZXN0ZXIgaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIERpZ2VzdGVyCisgICAgICovCisgICAgcHJvdGVjdGVkIERpZ2VzdGVyIGNyZWF0ZURpZ2VzdGVyKCkgeworICAgICAgICBEaWdlc3RlciBkaWdlc3RlciA9IG5ldyBEaWdlc3RlcigpOworICAgICAgICBkaWdlc3Rlci5zZXRVc2VDb250ZXh0Q2xhc3NMb2FkZXIodHJ1ZSk7CisKKyAgICAgICAgU3RyaW5nIHJ1bGVzID0gInJ1bGVzIjsKKyAgICAgICAgU3RyaW5nIHJ1bGUgPSAiL3J1bGUiOworCisgICAgICAgIC8vIENvbnN0cnVjdCBydWxlIGNoYWluCisgICAgICAgIGRpZ2VzdGVyLmFkZE9iamVjdENyZWF0ZShydWxlcywgUnVsZUNoYWluLmNsYXNzKTsKKworICAgICAgICAvLyBDb25zdHJ1Y3QgcnVsZQorICAgICAgICBkaWdlc3Rlci5hZGRPYmplY3RDcmVhdGUocnVsZXMgKyBydWxlLCBudWxsLCAiY2xhc3NOYW1lIik7CisKKyAgICAgICAgLy8gU2V0IHJ1bGUgcHJvcGVydGllcworICAgICAgICBkaWdlc3Rlci5hZGRTZXRQcm9wZXJ0aWVzKHJ1bGVzICsgcnVsZSk7CisKKyAgICAgICAgLy8gQWRkIHJ1bGUgdG8gY2hhaW4KKyAgICAgICAgZGlnZXN0ZXIuYWRkU2V0TmV4dChydWxlcyArIHJ1bGUsICJhZGRSdWxlIiwgIm9yZy5hcGFjaGUud2ViYXBwLmJhbGFuY2VyLlJ1bGUiKTsKKworICAgICAgICByZXR1cm4gZGlnZXN0ZXI7CisgICAgfQorfQorCisKKy8vIEVuZCBvZiBjbGFzczogUnVsZXNQYXJzZXIuamF2YQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYmFsYW5jZXIvV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2JhbGFuY2VyL292ZXJ2aWV3Lmh0bWwgYi9jb250YWluZXIvd2ViYXBwcy9iYWxhbmNlci9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYmFsYW5jZXIvb3ZlcnZpZXcuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjk4NTJmCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYmFsYW5jZXIvV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2JhbGFuY2VyL292ZXJ2aWV3Lmh0bWwKQEAgLTAsMCArMSw1MCBAQAorPGh0bWw+Cis8aGVhZD4KKzx0aXRsZT5CYWxhbmNlciBXZWJhcHAgT3ZlcnZpZXc8L3RpdGxlPgorPC9oZWFkPgorPGJvZHk+CitUaGUgYmFsYW5jZXIgd2ViYXBwIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIGEgcnVsZXMtYmFzZWQKK2xvYWQgYmFsYW5jZXIuICBBIG51bWJlciBvZiBydWxlcyBhcmUgcHJvdmlkZWQgYW5kIHRoZQorYXBwbGljYXRpb24gaXMgd3JpdHRlbiBmb3IgZWFzeSBleHRlbnNpYmlsaXR5LiAgCisKKzxwPgorQSBzZXJ2bGV0IGZpbHRlciBpcyBhbHNvIHByb3ZpZGVkIGFsb25nIHdpdGggYSBzYW1wbGUgd2ViLnhtbCB0aGF0CittYXBzIHRoYXQgZmlsdGVyIHRvIGFsbCByZXF1ZXN0cy4gIFRoaXMgaXMgb25seSBvbmUgd2F5Cit0byB1c2UgdGhlIGxvYWQgYmFsYW5jZXIuICBUaGUgdXNlciBtYXkgY29uZmlndXJlIG11bHRpcGxlCitmaWx0ZXJzIGVhY2ggd2l0aCBhIGRpZmZlcmVudCBydWxlIGNoYWluIG1hcHBlZCB0byAKKyhwb3NzaWJseSBtdWx0aXBsZSkgZGlmZmVyZW50IHVybC1wYXR0ZXJucyBvciBzZXJ2bGV0cy4gIEl0CitpcyBhbHNvIHBvc3NpYmxlIHRvIHVzZSBydWxlIGNoYWlucyB3aXRoaW4gYSBzZXJ2bGV0LgorPC9wPgorCis8cD4KK1BsZWFzZSBub3RlIHRoYXQgYWx0aG91Z2ggdGhpcyBhcHBsaWNhdGlvbiBpcyBiZWluZyBkaXN0cmlidXRlZAord2l0aCBUb21jYXQsIGl0IGlzIGNvbXBsaWFudCB3aXRoIHRoZSBTZXJ2bGV0IFNwZWNpZmljYXRpb24gdjIuMworYW5kIGlzIHRoZXJlZm9yZSBwb3J0YWJsZSBhY3Jvc3Mgc2VydmxldCBjb250YWluZXJzIHRoYXQgc3VwcG9ydAordGhpcyBzcGVjaWZpY2F0aW9uLgorPC9wPgorCis8cD4KK1RoZSBiYWxhbmNlciB3ZWJhcHBzIHVzZXMgdGhlIAorPGEgaHJlZj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9jb21tb25zL2RpZ2VzdGVyIj5EaWdlc3RlcjwvYT4gCit0b29sIGZyb20gSmFrYXJ0YSBDb21tb25zLiAgRGlnZXN0ZXIgYW5kIGl0cyBkZXBlbmRlbmNpZXMgYXJlCitpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbi4KKzwvcD4KKworPHA+CitUaGUgYmFsYW5jZXIgd2ViYXBwIHVzZXMgCis8YSBocmVmPSJodHRwOi8vamFsb3B5LnNmLm5ldCI+SmFsb3B5PC9hPiAKK2ZvciBzb3VyY2UtY29kZSBmb3JtYXR0aW5nIGFuZCAKKzxhIGhyZWY9Imh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldCI+Q2hlY2tTdHlsZTwvYT4gCitmb3Igc291cmNlLWNvZGUgY2hlY2tpbmcuCis8YnIvPgorVGhlIDxhIGhyZWY9Ii4uL2NoZWNrU3R5bGUvY2hlY2tTdHlsZVJlcG9ydC5odG1sIj4KK0NoZWNrU3R5bGUgUmVwb3J0PC9hPiBpcyBhdmFpbGFibGUuCis8L3A+CisKKzxwPgorQW55IHN1Z2dlc3Rpb25zLCBjb21tZW50cywgZXRjLCBhcmUgd2VsY29tZTogcGxlYXNlCitwb3N0IHRoZW0gdG8gdGhlIHRvbWNhdC11c2VyIG1haWxpbmcgbGlzdC4gIEVuam95IDspCis8L3A+CisKKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9iYWxhbmNlci9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYmFsYW5jZXIvcGFja2FnZS5odG1sIGIvY29udGFpbmVyL3dlYmFwcHMvYmFsYW5jZXIvV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2JhbGFuY2VyL3BhY2thZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDY2OGUzCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYmFsYW5jZXIvV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2JhbGFuY2VyL3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDI2IEBACis8aHRtbD4KKzxoZWFkPgorPHRpdGxlPm9yZy5hcGFjaGUud2ViYXBwLmJhbGFuY2VyIFBhY2thZ2UgT3ZlcnZpZXc8L3RpdGxlPgorPC9oZWFkPgorPGJvZHk+CitUaGlzIHBhY2thZ2UgY29udGFpbnMgYWxsIGNsYXNzZXMgdXNlZCBieSB0aGUgYmFsYW5jZXIKK3dlYmFwcCBvdGhlciB0aGFuIGFjdHVhbCBydWxlIGltcGxlbWVudGF0aW9ucy4KKzxwPgorVGhlIHtAbGluayBvcmcuYXBhY2hlLndlYmFwcC5iYWxhbmNlci5CYWxhbmNlckZpbHRlciBGaWx0ZXJ9IGlzIGhvdyB0aGUgd2ViYXBwCitpcyB0eXBpY2FsbHkgdXNlZDogc2VlIHRoZSB3ZWIueG1sIGZpbGUgaW4gdGhpcyBkaXN0cmlidXRpb24KK2ZvciBhbiBleGFtcGxlLgorPC9wPgorCis8cD4KK0Ege0BsaW5rIG9yZy5hcGFjaGUud2ViYXBwLmJhbGFuY2VyLlJ1bGVDaGFpbn0gaXMgc2ltcGx5IGEgbGlzdCBvZiBydWxlcyB0byBiZQorZXZhbHVhdGVkIGluIG9yZGVyLgorPC9wPgorCis8cD4KK1RoZSB7QGxpbmsgb3JnLmFwYWNoZS53ZWJhcHAuYmFsYW5jZXIuUnVsZXNQYXJzZXJ9IHVzZXMgCis8YSBocmVmPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2NvbW1vbnMvZGlnZXN0ZXIiPkRpZ2VzdGVyPC9hPiAKK3RvIHBhcnNlIHRoZSBydWxlcyBjb25maWd1cmF0aW9uIGZpbGUuCis8L3A+CisKKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9iYWxhbmNlci9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYmFsYW5jZXIvcnVsZXMvQWNjZXB0RXZlcnl0aGluZ1J1bGUuamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2JhbGFuY2VyL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9iYWxhbmNlci9ydWxlcy9BY2NlcHRFdmVyeXRoaW5nUnVsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4ZjczMDcKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9iYWxhbmNlci9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYmFsYW5jZXIvcnVsZXMvQWNjZXB0RXZlcnl0aGluZ1J1bGUuamF2YQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IDIwMDAsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmJhbGFuY2VyLnJ1bGVzOworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKKworCisvKioKKyAqIFRoaXMgcnVsZSBtYXRjaGVzIGV2ZXJ5IHJlcXVlc3QKKyAqIHBhc3NlZCB0byBpdCwgbWFraW5nIGl0IHN1aXRhYmxlCisgKiBmb3IgdXNlIGFzIGEgY2F0Y2gtYWxsIG9yIGxhc3QKKyAqIHJ1bGUgaW4gYSBjaGFpbi4KKyAqCisgKiBAYXV0aG9yIFlvYXYgU2hhcGlyYQorICovCitwdWJsaWMgY2xhc3MgQWNjZXB0RXZlcnl0aGluZ1J1bGUgZXh0ZW5kcyBCYXNlUnVsZSB7CisgICAgLyoqCisgICAgICogQHNlZSBvcmcuYXBhY2hlLndlYmFwcC5iYWxhbmNlci5SdWxlI21hdGNoZXMoSHR0cFNlcnZsZXRSZXF1ZXN0KQorICAgICAqCisgICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBhbHdheXMgbWF0Y2hlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KK30KKworCisvLyBFbmQgb2YgZmlsZTogQWNjZXB0RXZlcnl0aGluZ1J1bGUuamF2YQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYmFsYW5jZXIvV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2JhbGFuY2VyL3J1bGVzL0Jhc2VSdWxlLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9iYWxhbmNlci9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYmFsYW5jZXIvcnVsZXMvQmFzZVJ1bGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YThhN2U5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYmFsYW5jZXIvV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2JhbGFuY2VyL3J1bGVzL0Jhc2VSdWxlLmphdmEKQEAgLTAsMCArMSwxMTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMCwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYmFsYW5jZXIucnVsZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLndlYmFwcC5iYWxhbmNlci5SdWxlOworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKKworCisvKioKKyAqIFRoZSBCYXNlUnVsZSBpcyBhbiBlbXB0eSBydWxlCisgKiBpbXBsZW1lbnRhdGlvbiB3aGljaCBjYW4gYmUKKyAqIHN1YmNsYXNzZWQgZm9yIGV4dGVuc2lvbi4KKyAqCisgKiBAYXV0aG9yIFlvYXYgU2hhcGlyYQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZVJ1bGUgaW1wbGVtZW50cyBSdWxlIHsKKyAgICAvKioKKyAgICAgKiBUaGUgcnVsZSBuYW1lLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgVVJMIHdoZXJlIG1hdGNoaW5nCisgICAgICogcmVxdWVzdGVkIHdpbGwgYmUgcmVkaXJlY3RlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyByZWRpcmVjdFVybDsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHJ1bGUgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0aGVOYW1lIFRoZSBydWxlIG5hbWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgdGhlTmFtZSkgeworICAgICAgICBpZiAodGhlTmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgbmFtZSBjYW5ub3QgYmUgbnVsbC4iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG5hbWUgPSB0aGVOYW1lOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgcnVsZSBuYW1lLgorICAgICAqCisgICAgICogQHJldHVybiBTdHJpbmcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgUnVsZSNnZXRSZWRpcmVjdFVybAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVkaXJlY3RVcmwoKSB7CisgICAgICAgIHJldHVybiByZWRpcmVjdFVybDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSByZWRpcmVjdCBVUkwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGhlUmVkaXJlY3RVcmwgV2hlcmUgbWF0Y2hpbmcgcmVxdWVzdHMgd2lsbCBiZSByZWRpcmVjdGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVkaXJlY3RVcmwoU3RyaW5nIHRoZVJlZGlyZWN0VXJsKSB7CisgICAgICAgIGlmICh0aGVSZWRpcmVjdFVybCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyZWRpcmVjdFVybCBtYXkgbm90IGJlIG51bGwuIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZWRpcmVjdFVybCA9IHRoZVJlZGlyZWN0VXJsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSBSdWxlI21hdGNoZXMoSHR0cFNlcnZsZXRSZXF1ZXN0KQorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIG1hdGNoZXMoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gU3RyaW5nCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKworICAgICAgICBidWZmZXIuYXBwZW5kKCJbIik7CisgICAgICAgIGJ1ZmZlci5hcHBlbmQoZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgICBidWZmZXIuYXBwZW5kKCI6ICIpOworCisgICAgICAgIGJ1ZmZlci5hcHBlbmQoIlJlZGlyZWN0IFVSTDogIik7CisgICAgICAgIGJ1ZmZlci5hcHBlbmQoZ2V0UmVkaXJlY3RVcmwoKSk7CisKKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiXSIpOworCisgICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKKyAgICB9Cit9CisKKworLy8gRW5kIG9mIGZpbGU6IEJhc2VSdWxlLmphdmEKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2JhbGFuY2VyL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9iYWxhbmNlci9ydWxlcy9DaGFyYWN0ZXJFbmNvZGluZ1J1bGUuamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2JhbGFuY2VyL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9iYWxhbmNlci9ydWxlcy9DaGFyYWN0ZXJFbmNvZGluZ1J1bGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWRiMzI2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYmFsYW5jZXIvV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2JhbGFuY2VyL3J1bGVzL0NoYXJhY3RlckVuY29kaW5nUnVsZS5qYXZhCkBAIC0wLDAgKzEsNzUgQEAKK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYmFsYW5jZXIucnVsZXM7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworCisKKy8qKgorICogVGhpcyBydWxlIHJlZGlyZWN0cyByZXF1ZXN0cyBpZiB0aGV5CisgKiBhcmUgZm9yIGEgc3BlY2lmaWMgY2hhcmFjdGVyIGVuY29kaW5nLgorICoKKyAqIEBhdXRob3IgWW9hdiBTaGFwaXJhCisgKi8KK3B1YmxpYyBjbGFzcyBDaGFyYWN0ZXJFbmNvZGluZ1J1bGUgZXh0ZW5kcyBCYXNlUnVsZSB7CisgICAgLyoqCisgICAgICogVGhlIGNoYXJhY3RlciBlbmNvZGluZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBlbmNvZGluZzsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGNoYXJhY3RlciBlbmNvZGluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0aGVFbmNvZGluZyBUaGUgZW5jb2RpbmcgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFbmNvZGluZyhTdHJpbmcgdGhlRW5jb2RpbmcpIHsKKyAgICAgICAgaWYgKHRoZUVuY29kaW5nID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBlbmNvZGluZyBjYW5ub3QgYmUgbnVsbC4iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGVuY29kaW5nID0gdGhlRW5jb2Rpbmc7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBkZXNpcmVkIGVuY29kaW5nLgorICAgICAqCisgICAgICogQHJldHVybiBTdHJpbmcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEVuY29kaW5nKCkgeworICAgICAgICByZXR1cm4gZW5jb2Rpbmc7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSBvcmcuYXBhY2hlLndlYmFwcC5iYWxhbmNlci5SdWxlI21hdGNoZXMoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICBTdHJpbmcgYWN0dWFsRW5jb2RpbmcgPSByZXF1ZXN0LmdldENoYXJhY3RlckVuY29kaW5nKCk7CisKKyAgICAgICAgcmV0dXJuIChnZXRFbmNvZGluZygpLmNvbXBhcmVUbyhhY3R1YWxFbmNvZGluZykgPT0gMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gU3RyaW5nCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKworICAgICAgICBidWZmZXIuYXBwZW5kKCJbIik7CisgICAgICAgIGJ1ZmZlci5hcHBlbmQoZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgICBidWZmZXIuYXBwZW5kKCI6ICIpOworCisgICAgICAgIGJ1ZmZlci5hcHBlbmQoIlRhcmdldCBlbmNvZGluZzogIik7CisgICAgICAgIGJ1ZmZlci5hcHBlbmQoZ2V0RW5jb2RpbmcoKSk7CisgICAgICAgIGJ1ZmZlci5hcHBlbmQoIiAvICIpOworCisgICAgICAgIGJ1ZmZlci5hcHBlbmQoIlJlZGlyZWN0IFVSTDogIik7CisgICAgICAgIGJ1ZmZlci5hcHBlbmQoZ2V0UmVkaXJlY3RVcmwoKSk7CisKKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiXSIpOworCisgICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKKyAgICB9Cit9CisKKworLy8gRW5kIG9mIGZpbGU6IENoYXJhY3RlckVuY29kaW5nUnVsZS5qYXZhCmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9iYWxhbmNlci9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYmFsYW5jZXIvcnVsZXMvUmVtb3RlQWRkcmVzc1J1bGUuamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2JhbGFuY2VyL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9iYWxhbmNlci9ydWxlcy9SZW1vdGVBZGRyZXNzUnVsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzOTA1NzgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9iYWxhbmNlci9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYmFsYW5jZXIvcnVsZXMvUmVtb3RlQWRkcmVzc1J1bGUuamF2YQpAQCAtMCwwICsxLDkzIEBACisvKgorICogQ29weXJpZ2h0IDIwMDAsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmJhbGFuY2VyLnJ1bGVzOworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKKworCisvKioKKyAqIFRoZSByZW1vdGUgYWNjZXNzIHJ1bGUKKyAqIHJlZGlyZWN0cyBpZiB0aGUgcmVxdWVzdCBjYW1lCisgKiBmcm9tIHNwZWNpZmllZCByZW1vdGUgYWRkcmVzcy4KKyAqCisgKiBAYXV0aG9yIFlvYXYgU2hhcGlyYQorICovCitwdWJsaWMgY2xhc3MgUmVtb3RlQWRkcmVzc1J1bGUgZXh0ZW5kcyBCYXNlUnVsZSB7CisgICAgLyoqCisgICAgICogVGhlIHRhcmdldCByZW1vdGUgYWRkcmVzcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyByZW1vdGVBZGRyZXNzOworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdGFyZ2V0IHJlbW90ZSBhZGRyZXNzLgorICAgICAqCisgICAgICogQHBhcmFtIHRoZUFkZHJlc3MgVGhlIGFkZHJlc3MKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZW1vdGVBZGRyZXNzKFN0cmluZyB0aGVBZGRyZXNzKSB7CisgICAgICAgIGlmICh0aGVBZGRyZXNzID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBhZGRyZXNzIGNhbm5vdCBiZSBudWxsLiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVtb3RlQWRkcmVzcyA9IHRoZUFkZHJlc3M7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB0YXJnZXQgcmVtb3RlIGFkZHJlc3MuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFN0cmluZworICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UmVtb3RlQWRkcmVzcygpIHsKKyAgICAgICAgcmV0dXJuIHJlbW90ZUFkZHJlc3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSBvcmcuYXBhY2hlLndlYmFwcC5iYWxhbmNlci5SdWxlI21hdGNoZXMoSHR0cFNlcnZsZXRSZXF1ZXN0KQorICAgICAqCisgICAgICogTG9va3MgZm9yIHRoZSByZXF1ZXN0J3MgcmVtb3RlIGFkZHJlc3MuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICBTdHJpbmcgcmVxdWVzdEFkZHIgPSByZXF1ZXN0LmdldFJlbW90ZUFkZHIoKTsKKworICAgICAgICByZXR1cm4gKHJlcXVlc3RBZGRyLmNvbXBhcmVUbyhnZXRSZW1vdGVBZGRyZXNzKCkpID09IDApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFN0cmluZworICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisKKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiWyIpOworICAgICAgICBidWZmZXIuYXBwZW5kKGdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiOiAiKTsKKworICAgICAgICBidWZmZXIuYXBwZW5kKCJUYXJnZXQgcmVtb3RlIGFkZHJlc3M6ICIpOworICAgICAgICBidWZmZXIuYXBwZW5kKGdldFJlbW90ZUFkZHJlc3MoKSk7CisgICAgICAgIGJ1ZmZlci5hcHBlbmQoIiAvICIpOworCisgICAgICAgIGJ1ZmZlci5hcHBlbmQoIlJlZGlyZWN0IFVSTDogIik7CisgICAgICAgIGJ1ZmZlci5hcHBlbmQoZ2V0UmVkaXJlY3RVcmwoKSk7CisKKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiXSIpOworCisgICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKKyAgICB9Cit9CisKKworLy8gRW5kIG9mIGZpbGU6IFJlbW90ZUFkZHJlc3NSdWxlLmphdmEKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2JhbGFuY2VyL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9iYWxhbmNlci9ydWxlcy9SZXF1ZXN0QXR0cmlidXRlUnVsZS5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYmFsYW5jZXIvV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2JhbGFuY2VyL3J1bGVzL1JlcXVlc3RBdHRyaWJ1dGVSdWxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE2YTZhOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2JhbGFuY2VyL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9iYWxhbmNlci9ydWxlcy9SZXF1ZXN0QXR0cmlidXRlUnVsZS5qYXZhCkBAIC0wLDAgKzEsMTI4IEBACisvKgorICogQ29weXJpZ2h0IDIwMDAsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmJhbGFuY2VyLnJ1bGVzOworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKKworCisvKioKKyAqIFRoaXMgcnVsZSBhY2NlcHRzIG9yIHJlamVjdHMgcmVxdWVzdHMKKyAqIGJhc2VkIG9uIHRoZSBwcmVzZW5jZSBvZiBhIGF0dHJpYnV0ZQorICogaW4gdGhlIHJlcXVlc3QuCisgKgorICogQGF1dGhvciBZb2F2IFNoYXBpcmEKKyAqLworcHVibGljIGNsYXNzIFJlcXVlc3RBdHRyaWJ1dGVSdWxlIGV4dGVuZHMgQmFzZVJ1bGUgeworICAgIC8qKgorICAgICAqIFRoZSB0YXJnZXQgYXR0cmlidXRlIG5hbWUgKGF0dHJpYnV0ZQorICAgICAqIG11c3QgYmUgcHJlc2VudCBmb3IgbWF0Y2ggdG8gc3VjY2VlZCkuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgYXR0cmlidXRlTmFtZTsKKworICAgIC8qKgorICAgICAqIFRoZSB0YXJnZXQgYXR0cmlidXRlIHZhbHVlLiAgVGhpcworICAgICAqIGlzIG9wdGlvbmFsOiBudWxsIG1lYW5zIGFueSBhdHRyaWJ1dGUKKyAgICAgKiB2YWx1ZSBpcyBPSyBmb3IgYSBtYXRjaC4gIEEgbm9uLW51bGwKKyAgICAgKiB2YWx1ZSB3aWxsIGJlIG1hdGNoZXMgZXhhY3RseS4KKyAgICAgKi8KKyAgICBwcml2YXRlIE9iamVjdCBhdHRyaWJ1dGVWYWx1ZTsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHRhcmdldCBhdHRyaWJ1dGUgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0aGVBdHRyaWJ1dGVOYW1lIFRoZSBhdHRyaWJ1dGUgbmFtZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZU5hbWUoU3RyaW5nIHRoZUF0dHJpYnV0ZU5hbWUpIHsKKyAgICAgICAgaWYgKHRoZUF0dHJpYnV0ZU5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiYXR0cmlidXRlTmFtZSBjYW5ub3QgYmUgbnVsbC4iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF0dHJpYnV0ZU5hbWUgPSB0aGVBdHRyaWJ1dGVOYW1lOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdGFyZ2V0IGF0dHJpYnV0ZSBuYW1lLgorICAgICAqCisgICAgICogQHJldHVybiBTdHJpbmcgVGhlIHRhcmdldCBhdHRyaWJ1dGUgbmFtZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWUoKSB7CisgICAgICAgIHJldHVybiBhdHRyaWJ1dGVOYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGF0dHJpYnV0ZSB2YWx1ZSwgd2hpY2ggbWF5IGJlIG51bGwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGhlQXR0cmlidXRlVmFsdWUgVGhlIGF0dHJpYnV0ZSB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZVZhbHVlKE9iamVjdCB0aGVBdHRyaWJ1dGVWYWx1ZSkgeworICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHRoZUF0dHJpYnV0ZVZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHRhcmdldCBhdHRyaWJ1dGUgdmFsdWUsCisgICAgICogd2hpY2ggbWF5IGJlIG51bGwuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9iamVjdCBUaGUgdGFyZ2V0IGF0dHJpYnV0ZSB2YWx1ZQorICAgICAqLworICAgIHByb3RlY3RlZCBPYmplY3QgZ2V0QXR0cmlidXRlVmFsdWUoKSB7CisgICAgICAgIHJldHVybiBhdHRyaWJ1dGVWYWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUud2ViYXBwLmJhbGFuY2VyLlJ1bGUjbWF0Y2hlcyhIdHRwU2VydmxldFJlcXVlc3QpCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICBPYmplY3QgYWN0dWFsQXR0cmlidXRlVmFsdWUgPSByZXF1ZXN0LmdldEF0dHJpYnV0ZShnZXRBdHRyaWJ1dGVOYW1lKCkpOworCisgICAgICAgIGlmIChhY3R1YWxBdHRyaWJ1dGVWYWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gKGdldEF0dHJpYnV0ZVZhbHVlKCkgPT0gbnVsbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gKGFjdHVhbEF0dHJpYnV0ZVZhbHVlLmVxdWFscyhnZXRBdHRyaWJ1dGVWYWx1ZSgpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgorICAgICAqCisgICAgICogQHJldHVybiBTdHJpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCisgICAgICAgIGJ1ZmZlci5hcHBlbmQoIlsiKTsKKyAgICAgICAgYnVmZmVyLmFwcGVuZChnZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICAgIGJ1ZmZlci5hcHBlbmQoIjogIik7CisKKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiVGFyZ2V0IGF0dHJpYnV0ZSBuYW1lOiAiKTsKKyAgICAgICAgYnVmZmVyLmFwcGVuZChnZXRBdHRyaWJ1dGVOYW1lKCkpOworICAgICAgICBidWZmZXIuYXBwZW5kKCIgLyAiKTsKKworICAgICAgICBidWZmZXIuYXBwZW5kKCJUYXJnZXQgYXR0cmlidXRlIHZhbHVlOiAiKTsKKyAgICAgICAgYnVmZmVyLmFwcGVuZChnZXRBdHRyaWJ1dGVWYWx1ZSgpKTsKKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiIC8gIik7CisKKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiUmVkaXJlY3QgVVJMOiAiKTsKKyAgICAgICAgYnVmZmVyLmFwcGVuZChnZXRSZWRpcmVjdFVybCgpKTsKKworICAgICAgICBidWZmZXIuYXBwZW5kKCJdIik7CisKKyAgICAgICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOworICAgIH0KK30KKworCisvLyBFbmQgb2YgZmlsZTogUmVxdWVzdEF0dHJpYnV0ZVJ1bGUuamF2YQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYmFsYW5jZXIvV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2JhbGFuY2VyL3J1bGVzL1JlcXVlc3RIZWFkZXJSdWxlLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9iYWxhbmNlci9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYmFsYW5jZXIvcnVsZXMvUmVxdWVzdEhlYWRlclJ1bGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjBhNjk4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYmFsYW5jZXIvV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2JhbGFuY2VyL3J1bGVzL1JlcXVlc3RIZWFkZXJSdWxlLmphdmEKQEAgLTAsMCArMSwxMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMCwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS53ZWJhcHAuYmFsYW5jZXIucnVsZXM7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworCisKKy8qKgorICogVGhpcyBydWxlIGNoZWNrcyBmb3IgdGhlIHByZXNlbmNlCisgKiBvZiBhIHNwZWNpZmljIHJlcXVlc3QgaGVhZGVyLCBvcHRpb25hbGx5CisgKiB3aXRoIGEgc3BlY2lmaWMgdmFsdWUuICBUaGUgdmFsdWUgbWF5CisgKiBiZSBudWxsLgorICoKKyAqIEBhdXRob3IgWW9hdiBTaGFwaXJhCisgKi8KK3B1YmxpYyBjbGFzcyBSZXF1ZXN0SGVhZGVyUnVsZSBleHRlbmRzIEJhc2VSdWxlIHsKKyAgICAvKioKKyAgICAgKiBUaGUgaGVhZGVyIG5hbWUsIGNhbm5vdCBiZSBudWxsLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGhlYWRlck5hbWU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgaGVhZGVyIHZhbHVlLiAgVGhpcyBtYXkgYmUKKyAgICAgKiBudWxsIHRvIGluZGljYXRlIGFueSB2YWx1ZSBpcyBPSy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBoZWFkZXJWYWx1ZTsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGhlYWRlciBuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIHRoZU5hbWUgVGhlIG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRIZWFkZXJOYW1lKFN0cmluZyB0aGVOYW1lKSB7CisgICAgICAgIGlmICh0aGVOYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIlRoZSBoZWFkZXIgbmFtZSBjYW5ub3QgYmUgbnVsbC4iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGhlYWRlck5hbWUgPSB0aGVOYW1lOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgaGVhZGVyIG5hbWUgdG8gbWF0Y2guCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBoZWFkZXIgbmFtZQorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0SGVhZGVyTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIGhlYWRlck5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgaGVhZGVyIHZhbHVlLgorICAgICAqCisgICAgICogQHBhcmFtIHRoZVZhbHVlIFRoZSBoZWFkZXIgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRIZWFkZXJWYWx1ZShTdHJpbmcgdGhlVmFsdWUpIHsKKyAgICAgICAgaGVhZGVyVmFsdWUgPSB0aGVWYWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBkZXNpcmVkIGhlYWRlciB2YWx1ZSwKKyAgICAgKiB3aGljaCBtYXkgYmUgbnVsbC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gU3RyaW5nCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRIZWFkZXJWYWx1ZSgpIHsKKyAgICAgICAgcmV0dXJuIGhlYWRlclZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgb3JnLmFwYWNoZS53ZWJhcHAuYmFsYW5jZXIuUnVsZSNtYXRjaGVzKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIG1hdGNoZXMoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgU3RyaW5nIGFjdHVhbEhlYWRlclZhbHVlID0gcmVxdWVzdC5nZXRIZWFkZXIoZ2V0SGVhZGVyTmFtZSgpKTsKKworICAgICAgICBpZiAoYWN0dWFsSGVhZGVyVmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIChnZXRIZWFkZXJWYWx1ZSgpID09IG51bGwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIChhY3R1YWxIZWFkZXJWYWx1ZS5jb21wYXJlVG8oZ2V0SGVhZGVyVmFsdWUoKSkgPT0gMCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgorICAgICAqCisgICAgICogQHJldHVybiBTdHJpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCisgICAgICAgIGJ1ZmZlci5hcHBlbmQoIlsiKTsKKyAgICAgICAgYnVmZmVyLmFwcGVuZChnZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICAgIGJ1ZmZlci5hcHBlbmQoIjogIik7CisKKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiSGVhZGVyIG5hbWU6ICIpOworICAgICAgICBidWZmZXIuYXBwZW5kKGdldEhlYWRlck5hbWUoKSk7CisgICAgICAgIGJ1ZmZlci5hcHBlbmQoIiAvICIpOworCisgICAgICAgIGJ1ZmZlci5hcHBlbmQoIkhlYWRlciB2YWx1ZTogIik7CisgICAgICAgIGJ1ZmZlci5hcHBlbmQoZ2V0SGVhZGVyVmFsdWUoKSk7CisgICAgICAgIGJ1ZmZlci5hcHBlbmQoIiAvICIpOworCisgICAgICAgIGJ1ZmZlci5hcHBlbmQoIlJlZGlyZWN0IFVSTDogIik7CisgICAgICAgIGJ1ZmZlci5hcHBlbmQoZ2V0UmVkaXJlY3RVcmwoKSk7CisKKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiXSIpOworCisgICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKKyAgICB9Cit9CisKKworLy8gRW5kIG9mIGZpbGU6IFJlcXVlc3RIZWFkZXJSdWxlLmphdmEKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2JhbGFuY2VyL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9iYWxhbmNlci9ydWxlcy9SZXF1ZXN0UGFyYW1ldGVyUnVsZS5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYmFsYW5jZXIvV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2JhbGFuY2VyL3J1bGVzL1JlcXVlc3RQYXJhbWV0ZXJSdWxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE0ZTMzYwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2JhbGFuY2VyL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9iYWxhbmNlci9ydWxlcy9SZXF1ZXN0UGFyYW1ldGVyUnVsZS5qYXZhCkBAIC0wLDAgKzEsMTI3IEBACisvKgorICogQ29weXJpZ2h0IDIwMDAsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmJhbGFuY2VyLnJ1bGVzOworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKKworCisvKioKKyAqIFRoaXMgcnVsZSBhY2NlcHRzIG9yIHJlamVjdHMgcmVxdWVzdHMKKyAqIGJhc2VkIG9uIHRoZSBwcmVzZW5jZSBvZiBhIHBhcmFtZXRlcgorICogaW4gdGhlIHJlcXVlc3QuCisgKgorICogQGF1dGhvciBZb2F2IFNoYXBpcmEKKyAqLworcHVibGljIGNsYXNzIFJlcXVlc3RQYXJhbWV0ZXJSdWxlIGV4dGVuZHMgQmFzZVJ1bGUgeworICAgIC8qKgorICAgICAqIFRoZSB0YXJnZXQgcGFyYW1ldGVyIG5hbWUgKHBhcmFtZXRlcgorICAgICAqIG11c3QgYmUgcHJlc2VudCBmb3IgbWF0Y2ggdG8gc3VjY2VlZCkuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcGFyYW1OYW1lOworCisgICAgLyoqCisgICAgICogVGhlIHRhcmdldCBwYXJhbWV0ZXIgdmFsdWUuICBUaGlzCisgICAgICogaXMgb3B0aW9uYWw6IG51bGwgbWVhbnMgYW55IHBhcmFtZXRlcgorICAgICAqIHZhbHVlIGlzIE9LIGZvciBhIG1hdGNoLiAgQSBub24tbnVsbAorICAgICAqIHZhbHVlIHdpbGwgYmUgbWF0Y2hlcyBleGFjdGx5LgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHBhcmFtVmFsdWU7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB0YXJnZXQgcGFyYW1ldGVyIG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGhlUGFyYW1OYW1lIFRoZSBwYXJhbWV0ZXIgbmFtZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtTmFtZShTdHJpbmcgdGhlUGFyYW1OYW1lKSB7CisgICAgICAgIGlmICh0aGVQYXJhbU5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicGFyYW1OYW1lIGNhbm5vdCBiZSBudWxsLiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcGFyYW1OYW1lID0gdGhlUGFyYW1OYW1lOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdGFyZ2V0IHBhcmFtZXRlciBuYW1lLgorICAgICAqCisgICAgICogQHJldHVybiBTdHJpbmcgVGhlIHRhcmdldCBwYXJhbWV0ZXIgbmFtZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFBhcmFtTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIHBhcmFtTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBwYXJhbWV0ZXIgdmFsdWUsIHdoaWNoIG1heSBiZSBudWxsLgorICAgICAqCisgICAgICogQHBhcmFtIHRoZVBhcmFtVmFsdWUgVGhlIHBhcmFtZXRlciB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtVmFsdWUoU3RyaW5nIHRoZVBhcmFtVmFsdWUpIHsKKyAgICAgICAgcGFyYW1WYWx1ZSA9IHRoZVBhcmFtVmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdGFyZ2V0IHBhcmFtZXRlciB2YWx1ZSwKKyAgICAgKiB3aGljaCBtYXkgYmUgbnVsbC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gU3RyaW5nIFRoZSB0YXJnZXQgcGFyYW1ldGVyIHZhbHVlCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQYXJhbVZhbHVlKCkgeworICAgICAgICByZXR1cm4gcGFyYW1WYWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUud2ViYXBwLmJhbGFuY2VyLlJ1bGUjbWF0Y2hlcyhIdHRwU2VydmxldFJlcXVlc3QpCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICBTdHJpbmcgYWN0dWFsUGFyYW1WYWx1ZSA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKGdldFBhcmFtTmFtZSgpKTsKKworICAgICAgICBpZiAoYWN0dWFsUGFyYW1WYWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gKGdldFBhcmFtVmFsdWUoKSA9PSBudWxsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAoYWN0dWFsUGFyYW1WYWx1ZS5jb21wYXJlVG8oZ2V0UGFyYW1WYWx1ZSgpKSA9PSAwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFN0cmluZworICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisKKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiWyIpOworICAgICAgICBidWZmZXIuYXBwZW5kKGdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiOiAiKTsKKworICAgICAgICBidWZmZXIuYXBwZW5kKCJUYXJnZXQgcGFyYW0gbmFtZTogIik7CisgICAgICAgIGJ1ZmZlci5hcHBlbmQoZ2V0UGFyYW1OYW1lKCkpOworICAgICAgICBidWZmZXIuYXBwZW5kKCIgLyAiKTsKKworICAgICAgICBidWZmZXIuYXBwZW5kKCJUYXJnZXQgcGFyYW0gdmFsdWU6ICIpOworICAgICAgICBidWZmZXIuYXBwZW5kKGdldFBhcmFtVmFsdWUoKSk7CisgICAgICAgIGJ1ZmZlci5hcHBlbmQoIiAvICIpOworCisgICAgICAgIGJ1ZmZlci5hcHBlbmQoIlJlZGlyZWN0IFVSTDogIik7CisgICAgICAgIGJ1ZmZlci5hcHBlbmQoZ2V0UmVkaXJlY3RVcmwoKSk7CisKKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiXSIpOworCisgICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKKyAgICB9Cit9CisKKworLy8gRW5kIG9mIGZpbGU6IFJlcXVlc3RQYXJhbWV0ZXJSdWxlLmphdmEKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2JhbGFuY2VyL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9iYWxhbmNlci9ydWxlcy9TZXNzaW9uQXR0cmlidXRlUnVsZS5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYmFsYW5jZXIvV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2JhbGFuY2VyL3J1bGVzL1Nlc3Npb25BdHRyaWJ1dGVSdWxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjIxYzQxZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2JhbGFuY2VyL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9iYWxhbmNlci9ydWxlcy9TZXNzaW9uQXR0cmlidXRlUnVsZS5qYXZhCkBAIC0wLDAgKzEsMTMwIEBACisvKgorICogQ29weXJpZ2h0IDIwMDAsMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUud2ViYXBwLmJhbGFuY2VyLnJ1bGVzOworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247CisKKworLyoqCisgKiBUaGlzIHJ1bGUgYWNjZXB0cyBvciByZWplY3RzIHJlcXVlc3RzCisgKiBiYXNlZCBvbiB0aGUgcHJlc2VuY2Ugb2YgYSBhdHRyaWJ1dGUKKyAqIGluIHRoZSByZXF1ZXN0LgorICoKKyAqIEBhdXRob3IgWW9hdiBTaGFwaXJhCisgKi8KK3B1YmxpYyBjbGFzcyBTZXNzaW9uQXR0cmlidXRlUnVsZSBleHRlbmRzIEJhc2VSdWxlIHsKKyAgICAvKioKKyAgICAgKiBUaGUgdGFyZ2V0IGF0dHJpYnV0ZSBuYW1lIChhdHRyaWJ1dGUKKyAgICAgKiBtdXN0IGJlIHByZXNlbnQgZm9yIG1hdGNoIHRvIHN1Y2NlZWQpLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGF0dHJpYnV0ZU5hbWU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdGFyZ2V0IGF0dHJpYnV0ZSB2YWx1ZS4gIFRoaXMKKyAgICAgKiBpcyBvcHRpb25hbDogbnVsbCBtZWFucyBhbnkgYXR0cmlidXRlCisgICAgICogdmFsdWUgaXMgT0sgZm9yIGEgbWF0Y2guICBBIG5vbi1udWxsCisgICAgICogdmFsdWUgd2lsbCBiZSBtYXRjaGVzIGV4YWN0bHkuCisgICAgICovCisgICAgcHJpdmF0ZSBPYmplY3QgYXR0cmlidXRlVmFsdWU7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB0YXJnZXQgYXR0cmlidXRlIG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGhlQXR0cmlidXRlTmFtZSBUaGUgYXR0cmlidXRlIG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGVOYW1lKFN0cmluZyB0aGVBdHRyaWJ1dGVOYW1lKSB7CisgICAgICAgIGlmICh0aGVBdHRyaWJ1dGVOYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgImF0dHJpYnV0ZU5hbWUgY2Fubm90IGJlIG51bGwuIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdHRyaWJ1dGVOYW1lID0gdGhlQXR0cmlidXRlTmFtZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHRhcmdldCBhdHRyaWJ1dGUgbmFtZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gU3RyaW5nIFRoZSB0YXJnZXQgYXR0cmlidXRlIG5hbWUuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRBdHRyaWJ1dGVOYW1lKCkgeworICAgICAgICByZXR1cm4gYXR0cmlidXRlTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBhdHRyaWJ1dGUgdmFsdWUsIHdoaWNoIG1heSBiZSBudWxsLgorICAgICAqCisgICAgICogQHBhcmFtIHRoZUF0dHJpYnV0ZVZhbHVlIFRoZSBhdHRyaWJ1dGUgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGVWYWx1ZShPYmplY3QgdGhlQXR0cmlidXRlVmFsdWUpIHsKKyAgICAgICAgYXR0cmlidXRlVmFsdWUgPSB0aGVBdHRyaWJ1dGVWYWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB0YXJnZXQgYXR0cmlidXRlIHZhbHVlLAorICAgICAqIHdoaWNoIG1heSBiZSBudWxsLgorICAgICAqCisgICAgICogQHJldHVybiBPYmplY3QgVGhlIHRhcmdldCBhdHRyaWJ1dGUgdmFsdWUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgT2JqZWN0IGdldEF0dHJpYnV0ZVZhbHVlKCkgeworICAgICAgICByZXR1cm4gYXR0cmlidXRlVmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSBvcmcuYXBhY2hlLndlYmFwcC5iYWxhbmNlci5SdWxlI21hdGNoZXMoSHR0cFNlcnZsZXRSZXF1ZXN0KQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIG1hdGNoZXMoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpOworICAgICAgICBPYmplY3QgYWN0dWFsQXR0cmlidXRlVmFsdWUgPSBzZXNzaW9uLmdldEF0dHJpYnV0ZShnZXRBdHRyaWJ1dGVOYW1lKCkpOworCisgICAgICAgIGlmIChhY3R1YWxBdHRyaWJ1dGVWYWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gKGdldEF0dHJpYnV0ZVZhbHVlKCkgPT0gbnVsbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gKGFjdHVhbEF0dHJpYnV0ZVZhbHVlLmVxdWFscyhnZXRBdHRyaWJ1dGVWYWx1ZSgpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgorICAgICAqCisgICAgICogQHJldHVybiBTdHJpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCisgICAgICAgIGJ1ZmZlci5hcHBlbmQoIlsiKTsKKyAgICAgICAgYnVmZmVyLmFwcGVuZChnZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICAgIGJ1ZmZlci5hcHBlbmQoIjogIik7CisKKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiVGFyZ2V0IGF0dHJpYnV0ZSBuYW1lOiAiKTsKKyAgICAgICAgYnVmZmVyLmFwcGVuZChnZXRBdHRyaWJ1dGVOYW1lKCkpOworICAgICAgICBidWZmZXIuYXBwZW5kKCIgLyAiKTsKKworICAgICAgICBidWZmZXIuYXBwZW5kKCJUYXJnZXQgYXR0cmlidXRlIHZhbHVlOiAiKTsKKyAgICAgICAgYnVmZmVyLmFwcGVuZChnZXRBdHRyaWJ1dGVWYWx1ZSgpKTsKKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiIC8gIik7CisKKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiUmVkaXJlY3QgVVJMOiAiKTsKKyAgICAgICAgYnVmZmVyLmFwcGVuZChnZXRSZWRpcmVjdFVybCgpKTsKKworICAgICAgICBidWZmZXIuYXBwZW5kKCJdIik7CisKKyAgICAgICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOworICAgIH0KK30KKworCisvLyBFbmQgb2YgZmlsZTogU2Vzc2lvbkF0dHJpYnV0ZVJ1bGUuamF2YQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYmFsYW5jZXIvV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2JhbGFuY2VyL3J1bGVzL1VSTFN0cmluZ01hdGNoUnVsZS5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYmFsYW5jZXIvV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2JhbGFuY2VyL3J1bGVzL1VSTFN0cmluZ01hdGNoUnVsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5YTFjNmMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9iYWxhbmNlci9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYmFsYW5jZXIvcnVsZXMvVVJMU3RyaW5nTWF0Y2hSdWxlLmphdmEKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAwLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5iYWxhbmNlci5ydWxlczsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CisKKworLyoqCisgKiBUaGlzIHJ1bGUgbG9va3MgZm9yIGEgc3BlY2lmaWMgc3RyaW5nCisgKiBpbiB0aGUgVVJMIGZvciBhIHBvc2l0aXZlIG1hdGNoLgorICoKKyAqIEBhdXRob3IgWW9hdiBTaGFwaXJhCisgKi8KK3B1YmxpYyBjbGFzcyBVUkxTdHJpbmdNYXRjaFJ1bGUgZXh0ZW5kcyBCYXNlUnVsZSB7CisgICAgLyoqCisgICAgICogVGhlIHRhcmdldCBzdHJpbmcgdGhhdCBtdXN0IGJlIHByZXNlbnQKKyAgICAgKiBpbiB0aGUgVVJMLCBtYXkgbm90IGJlIG51bGwuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgdGFyZ2V0U3RyaW5nOworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdGFyZ2V0IHN0cmluZyB0aGF0IG11c3QKKyAgICAgKiBiZSBwcmVzZW50IGluIHRoZSBVUkwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGhlVGFyZ2V0U3RyaW5nIFRoZSB0YXJnZXQgc3RyaW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0U3RyaW5nKFN0cmluZyB0aGVUYXJnZXRTdHJpbmcpIHsKKyAgICAgICAgaWYgKHRoZVRhcmdldFN0cmluZyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJUaGUgdGFyZ2V0IHN0cmluZyBjYW5ub3QgYmUgbnVsbC4iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRhcmdldFN0cmluZyA9IHRoZVRhcmdldFN0cmluZzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHRhcmdldCBzdHJpbmcgdGhhdCBtdXN0CisgICAgICogYmUgcHJlc2VudCBpbiB0aGUgVVJMLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgdGFyZ2V0IHN0cmluZworICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VGFyZ2V0U3RyaW5nKCkgeworICAgICAgICByZXR1cm4gdGFyZ2V0U3RyaW5nOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgb3JnLmFwYWNoZS53ZWJhcHAuYmFsYW5jZXIuUnVsZSNtYXRjaGVzKEh0dHBTZXJ2bGV0UmVxdWVzdCkKKyAgICAgKgorICAgICAqIExvb2tzIGZvciB0aGUgdGFyZ2V0IHN0cmluZyBpbiB0aGUgcmVxdWVzdCBVUkwuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICBTdHJpbmcgcmVxdWVzdFVybCA9IHJlcXVlc3QuZ2V0UmVxdWVzdFVSTCgpLnRvU3RyaW5nKCk7CisgICAgICAgIGludCBpbmRleCA9IHJlcXVlc3RVcmwuaW5kZXhPZihnZXRUYXJnZXRTdHJpbmcoKSk7CisKKyAgICAgICAgcmV0dXJuIChpbmRleCA+IC0xKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgorICAgICAqCisgICAgICogQHJldHVybiBTdHJpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCisgICAgICAgIGJ1ZmZlci5hcHBlbmQoIlsiKTsKKyAgICAgICAgYnVmZmVyLmFwcGVuZChnZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICAgIGJ1ZmZlci5hcHBlbmQoIjogIik7CisKKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiVGFyZ2V0IHN0cmluZzogIik7CisgICAgICAgIGJ1ZmZlci5hcHBlbmQoZ2V0VGFyZ2V0U3RyaW5nKCkpOworICAgICAgICBidWZmZXIuYXBwZW5kKCIgLyAiKTsKKworICAgICAgICBidWZmZXIuYXBwZW5kKCJSZWRpcmVjdCBVUkw6ICIpOworICAgICAgICBidWZmZXIuYXBwZW5kKGdldFJlZGlyZWN0VXJsKCkpOworCisgICAgICAgIGJ1ZmZlci5hcHBlbmQoIl0iKTsKKworICAgICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CisgICAgfQorfQorCisKKy8vIEVuZCBvZiBmaWxlOiBVUkxTdHJpbmdNYXRjaFJ1bGUuamF2YQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYmFsYW5jZXIvV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2JhbGFuY2VyL3J1bGVzL1VzZXJSb2xlUnVsZS5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvYmFsYW5jZXIvV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvd2ViYXBwL2JhbGFuY2VyL3J1bGVzL1VzZXJSb2xlUnVsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkMTVhNzYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9iYWxhbmNlci9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYmFsYW5jZXIvcnVsZXMvVXNlclJvbGVSdWxlLmphdmEKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAwLDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLndlYmFwcC5iYWxhbmNlci5ydWxlczsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CisKKworLyoqCisgKiBUaGlzIHJ1bGUgcmVkaXJlY3RzIHRoZSByZXF1ZXN0IGJhc2VkCisgKiBvbiB0aGUgdXNlcidzIHJvbGUuCisgKgorICogQGF1dGhvciBZb2F2IFNoYXBpcmEKKyAqLworcHVibGljIGNsYXNzIFVzZXJSb2xlUnVsZSBleHRlbmRzIEJhc2VSdWxlIHsKKyAgICAvKioKKyAgICAgKiBUaGUgZGVzaXJlZCByb2xlIGZvciB0aGUgdXNlci4KKyAgICAgKiBJZiB0aGUgdXNlciBpcyBpbiB0aGlzIHJvbGUsIHRoZQorICAgICAqIG1hdGNoIHdpbGwgc3VjY2VlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyByb2xlOworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgZGVzaXJlZCByb2xlLgorICAgICAqCisgICAgICogQHBhcmFtIHRoZVJvbGUgVGhlIGRlc2lyZSByb2xlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Um9sZShTdHJpbmcgdGhlUm9sZSkgeworICAgICAgICBpZiAodGhlUm9sZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgcm9sZSBjYW5ub3QgYmUgbnVsbC4iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJvbGUgPSB0aGVSb2xlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdGFyZ2V0IHJvbGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBkZXNpcmVkIHJvbGUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFJvbGUoKSB7CisgICAgICAgIHJldHVybiByb2xlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgb3JnLmFwYWNoZS53ZWJhcHAuYmFsYW5jZXIuUnVsZSNtYXRjaGVzKEh0dHBTZXJ2bGV0UmVxdWVzdCkKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgIHJldHVybiByZXF1ZXN0LmlzVXNlckluUm9sZShnZXRSb2xlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFN0cmluZworICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisKKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiWyIpOworICAgICAgICBidWZmZXIuYXBwZW5kKGdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiOiAiKTsKKworICAgICAgICBidWZmZXIuYXBwZW5kKCJUYXJnZXQgcm9sZTogIik7CisgICAgICAgIGJ1ZmZlci5hcHBlbmQoZ2V0Um9sZSgpKTsKKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiIC8gIik7CisKKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiUmVkaXJlY3QgVVJMOiAiKTsKKyAgICAgICAgYnVmZmVyLmFwcGVuZChnZXRSZWRpcmVjdFVybCgpKTsKKworICAgICAgICBidWZmZXIuYXBwZW5kKCJdIik7CisKKyAgICAgICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOworICAgIH0KK30KKworCisvLyBFbmQgb2YgZmlsZTogVXNlclJvbGVSdWxlLmphdmEKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2JhbGFuY2VyL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL3dlYmFwcC9iYWxhbmNlci9ydWxlcy9wYWNrYWdlLmh0bWwgYi9jb250YWluZXIvd2ViYXBwcy9iYWxhbmNlci9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYmFsYW5jZXIvcnVsZXMvcGFja2FnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5N2M3ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9iYWxhbmNlci9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS93ZWJhcHAvYmFsYW5jZXIvcnVsZXMvcGFja2FnZS5odG1sCkBAIC0wLDAgKzEsMTEgQEAKKzxodG1sPgorPGhlYWQ+Cis8dGl0bGU+b3JnLmFwYWNoZS53ZWJhcHAuYmFsYW5jZXIucnVsZXMgUGFja2FnZSBPdmVydmlldzwvdGl0bGU+Cis8L2hlYWQ+Cis8Ym9keT4KK1RoaXMgcGFja2FnZSBjb250YWlucyBhbGwgdGhlIHtAbGluayBvcmcuYXBhY2hlLndlYmFwcC5iYWxhbmNlci5SdWxlfSAKK2ltcGxlbWVudGF0aW9ucyB0aGF0IGFyZSBkaXN0cmlidXRlZCB3aXRoIHRoZSBiYWxhbmNlciB3ZWJhcHAuICBBbGwgCit0aGVzZSBydWxlcyBleHRlbmQge0BsaW5rIG9yZy5hcGFjaGUud2ViYXBwLmJhbGFuY2VyLnJ1bGVzLkJhc2VSdWxlfSAKK2J1dCB1c2VycyBhcmUgZnJlZSB0byBpbXBsZW1lbnQgdGhlIFJ1bGUgaW50ZXJmYWNlIGFzIG5lZWRlZC4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2JhbGFuY2VyL1dFQi1JTkYvY29uZmlnL3J1bGVzLnhtbCBiL2NvbnRhaW5lci93ZWJhcHBzL2JhbGFuY2VyL1dFQi1JTkYvY29uZmlnL3J1bGVzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDk3NjVlCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYmFsYW5jZXIvV0VCLUlORi9jb25maWcvcnVsZXMueG1sCkBAIC0wLDAgKzEsMTggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cnVsZXM+CisgIDwhLS0gSWYgdGhlIFVSTCBjb250YWlucyBOZXdzIChjYXNlLXNlbnNpdGl2ZSksIGdvIHRvIENOTi5jb20gLS0+CisgIDxydWxlIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS53ZWJhcHAuYmFsYW5jZXIucnVsZXMuVVJMU3RyaW5nTWF0Y2hSdWxlIgorICAgIHRhcmdldFN0cmluZz0iTmV3cyIKKyAgICByZWRpcmVjdFVybD0iaHR0cDovL3d3dy5jbm4uY29tIiAvPgorCisgIDwhLS0gSWYgdGhlIHJlcXVlc3QgY29udGFpbnMgYSBwYXJhbWV0ZXIgbmFtZWQgcGFyYW1OYW1lIHdob3NlIHZhbHVlCisgICAgICAgaXMgcGFyYW1WYWx1ZSwgZ28gdG8gWWFob28uY29tLiAtLT4KKyAgPHJ1bGUgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLndlYmFwcC5iYWxhbmNlci5ydWxlcy5SZXF1ZXN0UGFyYW1ldGVyUnVsZSIKKyAgICBwYXJhbU5hbWU9InBhcmFtTmFtZSIKKyAgICBwYXJhbVZhbHVlPSJwYXJhbVZhbHVlIgorICAgIHJlZGlyZWN0VXJsPSJodHRwOi8vd3d3LnlhaG9vLmNvbSIgLz4KKworICA8IS0tIFJlZGlyZWN0IGFsbCByZXF1ZXN0cyB0byBqYWthcnRhLmFwYWNoZS5vcmcuIC0tPgorICA8cnVsZSBjbGFzc05hbWU9Im9yZy5hcGFjaGUud2ViYXBwLmJhbGFuY2VyLnJ1bGVzLkFjY2VwdEV2ZXJ5dGhpbmdSdWxlIgorICAgIHJlZGlyZWN0VXJsPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnIiAvPgorPC9ydWxlcz4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2JhbGFuY2VyL1dFQi1JTkYvd2ViLnhtbCBiL2NvbnRhaW5lci93ZWJhcHBzL2JhbGFuY2VyL1dFQi1JTkYvd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjA3NWE4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvYmFsYW5jZXIvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsMjEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KKzwhRE9DVFlQRSB3ZWItYXBwCisgICAgIFBVQkxJQyAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIFdlYiBBcHBsaWNhdGlvbiAyLjMvL0VOIgorICAgICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC93ZWItYXBwXzJfMy5kdGQiPgorPHdlYi1hcHA+CisgIDwhLS0gQmFsYW5jZXJGaWx0ZXIgZGVmaW5pdGlvbiAtLT4KKyAgPGZpbHRlcj4KKyAgICA8ZmlsdGVyLW5hbWU+QmFsYW5jZXJGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgIDxmaWx0ZXItY2xhc3M+b3JnLmFwYWNoZS53ZWJhcHAuYmFsYW5jZXIuQmFsYW5jZXJGaWx0ZXI8L2ZpbHRlci1jbGFzcz4KKyAgICA8aW5pdC1wYXJhbT4KKyAgICAgIDxwYXJhbS1uYW1lPmNvbmZpZ1VybDwvcGFyYW0tbmFtZT4KKyAgICAgIDxwYXJhbS12YWx1ZT4vV0VCLUlORi9jb25maWcvcnVsZXMueG1sPC9wYXJhbS12YWx1ZT4KKyAgICA8L2luaXQtcGFyYW0+CisgIDwvZmlsdGVyPgorCisgIDwhLS0gQmFsYW5jZXJGaWx0ZXIgbWFwcGluZyAtLT4KKyAgPGZpbHRlci1tYXBwaW5nPgorICAgIDxmaWx0ZXItbmFtZT5CYWxhbmNlckZpbHRlcjwvZmlsdGVyLW5hbWU+CisgICAgPHVybC1wYXR0ZXJuPi8qPC91cmwtcGF0dGVybj4KKyAgPC9maWx0ZXItbWFwcGluZz4KKzwvd2ViLWFwcD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9iYWxhbmNlci9idWlsZC54bWwgYi9jb250YWluZXIvd2ViYXBwcy9iYWxhbmNlci9idWlsZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZjNDVjOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2JhbGFuY2VyL2J1aWxkLnhtbApAQCAtMCwwICsxLDExNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+CisKKzwhLS0gCitUaGlzIGlzIHRoZSBidWlsZCBzY3JpcHQgZm9yIHRoZSBiYWxhbmNlciB3ZWJhcHAuCitAYXV0aG9yIFlvYXYgU2hhcGlyYQorLS0+CisKKzxwcm9qZWN0IG5hbWU9ImJhbGFuY2VyIiBkZWZhdWx0PSJidWlsZC1tYWluIiBiYXNlZGlyPSIuIj4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09IEluaXRpYWxpemUgUHJvcGVydHkgVmFsdWVzID09PT09PT09PT09PT09PT09PT0gLS0+CisKKyAgPCEtLSBTZWUgImJ1aWxkLnByb3BlcnRpZXMuc2FtcGxlIiBpbiB0aGUgdG9wIGxldmVsIGRpcmVjdG9yeSBmb3IgYWxsICAgICAtLT4KKyAgPCEtLSBwcm9wZXJ0eSB2YWx1ZXMgeW91IG11c3QgY3VzdG9taXplIGZvciBzdWNjZXNzZnVsIGJ1aWxkaW5nISEhICAgICAgICAtLT4KKyAgPHByb3BlcnR5IGZpbGU9ImJ1aWxkLnByb3BlcnRpZXMiLz4KKyAgPHByb3BlcnR5IGZpbGU9Ii4uL2J1aWxkLnByb3BlcnRpZXMiLz4KKyAgPHByb3BlcnR5IGZpbGU9Ii4uLy4uL2J1aWxkLnByb3BlcnRpZXMiLz4KKyAgPHByb3BlcnR5IGZpbGU9IiR7dXNlci5ob21lfS9idWlsZC5wcm9wZXJ0aWVzIi8+CisKKyAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmNvbXBpbGVyIiAgdmFsdWU9Im1vZGVybiIvPgorICA8cHJvcGVydHkgbmFtZT0id2ViYXBwcy5idWlsZCIgICB2YWx1ZT0iLi4vYnVpbGQiLz4KKyAgPHByb3BlcnR5IG5hbWU9IndlYmFwcHMuZGlzdCIgICAgdmFsdWU9Ii4uL2Rpc3QiLz4KKyAgPHByb3BlcnR5IG5hbWU9IndlYmFwcC5uYW1lIiAgICAgdmFsdWU9ImJhbGFuY2VyIi8+CisKKyAgPCEtLSBEZXBlbmRlbnQgSkFScyBhbmQgZmlsZXMgLS0+CisgIDxwcm9wZXJ0eSBuYW1lPSJzZXJ2bGV0LWFwaS5qYXIiIHZhbHVlPSIke2FwaS5ob21lfS9qc3IxNTQvZGlzdC9saWIvc2VydmxldC1hcGkuamFyIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJqc3AtYXBpLmphciIgICAgIHZhbHVlPSIke2FwaS5ob21lfS9qc3IxNTIvZGlzdC9saWIvanNwLWFwaS5qYXIiLz4KKworICA8IS0tIENvbXBpbGF0aW9uIGNsYXNzcGF0aCAtLT4KKyAgPHBhdGggaWQ9ImJhbGFuY2VyLmNsYXNzcGF0aCI+CisgICAgPCEtLSBSZXF1aXJlZCBieSBEaWdlc3RlciAtLT4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y2F0YWxpbmEuZGVwbG95fS9jbGFzc2VzIi8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3NlcnZsZXQtYXBpLmphcn0iLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y29tbW9ucy1sb2dnaW5nLWFwaS5qYXJ9IiAvPgorICA8L3BhdGg+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT0gQlVJTEQ6IENyZWF0ZSBEaXJlY3RvcmllcyA9PT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImJ1aWxkLXByZXBhcmUiPgorICAgIDxta2RpciBkaXI9IiR7d2ViYXBwcy5idWlsZH0iLz4KKyAgICA8bWtkaXIgZGlyPSIke3dlYmFwcHMuYnVpbGR9LyR7d2ViYXBwLm5hbWV9Ii8+CisgICAgPG1rZGlyIGRpcj0iJHt3ZWJhcHBzLmJ1aWxkfS8ke3dlYmFwcC5uYW1lfS9pbWFnZXMiLz4KKyAgICA8bWtkaXIgZGlyPSIke3dlYmFwcHMuYnVpbGR9LyR7d2ViYXBwLm5hbWV9L1dFQi1JTkYiLz4KKyAgICA8bWtkaXIgZGlyPSIke3dlYmFwcHMuYnVpbGR9LyR7d2ViYXBwLm5hbWV9L1dFQi1JTkYvY2xhc3NlcyIvPgorICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PSBCVUlMRDogQ29weSBTdGF0aWMgRmlsZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iYnVpbGQtc3RhdGljIiBkZXBlbmRzPSJidWlsZC1wcmVwYXJlIj4KKyAgICA8Y29weSB0b2Rpcj0iJHt3ZWJhcHBzLmJ1aWxkfS8ke3dlYmFwcC5uYW1lfSI+CisgICAgICA8ZmlsZXNldCBkaXI9Ii4iPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSJidWlsZC4qIi8+CisgICAgICA8L2ZpbGVzZXQ+CisgICAgPC9jb3B5PgorICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT0gQlVJTEQ6IENvbXBpbGUgU2VydmVyIENvbXBvbmVudHMgPT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iYnVpbGQtbWFpbiIgZGVwZW5kcz0iYnVpbGQtc3RhdGljIj4KKworICAgIDxqYXZhYyAgIHNyY2Rpcj0iV0VCLUlORi9jbGFzc2VzIiAKKyAgICAgICAgICAgICBkZXN0ZGlyPSIke3dlYmFwcHMuYnVpbGR9LyR7d2ViYXBwLm5hbWV9L1dFQi1JTkYvY2xhc3NlcyIKKyAgICAgICAgICAgICBkZWJ1Zz0iJHtjb21waWxlLmRlYnVnfSIgZGVwcmVjYXRpb249IiR7Y29tcGlsZS5kZXByZWNhdGlvbn0iCisgICAgICAgICAgICAgb3B0aW1pemU9IiR7Y29tcGlsZS5vcHRpbWl6ZX0iCisgICAgICAgICAgICAgZXhjbHVkZXM9IioqL0NWUy8qKiI+CisgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJiYWxhbmNlci5jbGFzc3BhdGgiIC8+CisgICAgPC9qYXZhYz4KKworICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT0gQlVJTEQ6IFJlYnVpbGQgRXZlcnl0aGluZyA9PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iYWxsIiBkZXBlbmRzPSJidWlsZC1jbGVhbixidWlsZC1tYWluIgorICAgZGVzY3JpcHRpb249IkNsZWFuIGFuZCBidWlsZCBiYWxhbmNlciB3ZWJhcHAiLz4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT0gQlVJTEQ6IENsZWFuIERpcmVjdG9yeSA9PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iYnVpbGQtY2xlYW4iPgorICAgIDxkZWxldGUgZGlyPSIke3dlYmFwcHMuYnVpbGR9LyR7d2ViYXBwLm5hbWV9Ii8+CisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PSBESVNUOiBDcmVhdGUgRGlyZWN0b3JpZXMgPT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJkaXN0LXByZXBhcmUiPgorICAgIDxta2RpciBkaXI9IiR7d2ViYXBwcy5kaXN0fSIvPgorICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT0gRElTVDogQ3JlYXRlIERpc3RyaWJ1dGlvbiBGaWxlcyA9PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iZGlzdCIgZGVwZW5kcz0iYnVpbGQtbWFpbixkaXN0LXByZXBhcmUiCisgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIGJhbGFuY2VyIHdlYmFwcCBiaW5hcnkgZGlzdHJpYnV0aW9uIj4KKyAgICAgIDxqYXIgICBqYXJmaWxlPSIke3dlYmFwcHMuZGlzdH0vJHt3ZWJhcHAubmFtZX0ud2FyIgorICAgICAgICAgICAgIGJhc2VkaXI9IiR7d2ViYXBwcy5idWlsZH0vJHt3ZWJhcHAubmFtZX0iIGluY2x1ZGVzPSIqKiIvPgorICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT0gRElTVDogQ2xlYW4gRGlyZWN0b3J5ID09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iZGlzdC1jbGVhbiI+CisgICAgPGRlbHRyZWUgZGlyPSIke2Rpc3QuZGlyfS8ke3dlYmFwcC5uYW1lfSIvPgorICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PSBDb252ZW5pZW50IFN5bm9ueW1zID09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iY2xlYW4iIGRlcGVuZHM9ImJ1aWxkLWNsZWFuLGRpc3QtY2xlYW4iCisgICBkZXNjcmlwdGlvbj0iQ2xlYW4gYnVpbGQgYW5kIGRpc3QgZGlyZWN0b3JpZXMiLz4KKworCisKKworPC9wcm9qZWN0PgorPCEtLSBFbmQgYnVpbGQueG1sIC0tPgorCisKKworCisKKwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvYnVpbGQueG1sIGIvY29udGFpbmVyL3dlYmFwcHMvYnVpbGQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliNTM0M2UKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9idWlsZC54bWwKQEAgLTAsMCArMSwxMjggQEAKKzxwcm9qZWN0IG5hbWU9IldlYmFwcHMiIGRlZmF1bHQ9ImRpc3QiIGJhc2VkaXI9Ii4iPgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT0gSW5pdGlhbGl6ZSBQcm9wZXJ0eSBWYWx1ZXMgPT09PT09PT09PT09PT09PT09PSAtLT4KKworICA8IS0tIFNlZSAiYnVpbGQucHJvcGVydGllcy5zYW1wbGUiIGluIHRoZSB0b3AgbGV2ZWwgZGlyZWN0b3J5IGZvciBhbGwgICAgIC0tPgorICA8IS0tIHByb3BlcnR5IHZhbHVlcyB5b3UgbXVzdCBjdXN0b21pemUgZm9yIHN1Y2Nlc3NmdWwgYnVpbGRpbmchISEgICAgICAgIC0tPgorICA8IS0tcHJvcGVydHkgZmlsZT0iYnVpbGQucHJvcGVydGllcyIvPgorICA8cHJvcGVydHkgZmlsZT0iLi4vYnVpbGQucHJvcGVydGllcyIvPgorICA8cHJvcGVydHkgZmlsZT0iJHt1c2VyLmhvbWV9L2J1aWxkLnByb3BlcnRpZXMiLy0tPgorCisgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5jb21waWxlciIgIHZhbHVlPSJtb2Rlcm4iLz4KKyAgPHByb3BlcnR5IG5hbWU9IndlYmFwcHMuYnVpbGQiICAgdmFsdWU9IiR7YmFzZWRpcn0vYnVpbGQiLz4KKyAgPHByb3BlcnR5IG5hbWU9IndlYmFwcHMuZGVwbG95IiAgdmFsdWU9IiR7YmFzZWRpcn0vLi4vYnVpbGQiLz4KKyAgPHByb3BlcnR5IG5hbWU9IndlYmFwcHMuZGlzdCIgICAgdmFsdWU9IiR7YmFzZWRpcn0vZGlzdCIvPgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09IEJVSUxEOiBDcmVhdGUgRGlyZWN0b3JpZXMgPT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJidWlsZC1wcmVwYXJlIj4KKworICAgIDxhdmFpbGFibGUgY2xhc3NuYW1lPSJqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UiIHByb3BlcnR5PSJqdW5pdC5wcmVzZW50IiAvPgorCisgICAgPG1rZGlyIGRpcj0iJHt3ZWJhcHBzLmJ1aWxkfSIvPgorICAgIDxta2RpciBkaXI9IiR7d2ViYXBwcy5kaXN0fSIvPgorCisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09IEJVSUxEOiBDb21waWxlIFN1YnByb2plY3RzID09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPCEtLSBBZGQgYSBuZXcgdGFyZ2V0IGZvciBlYWNoIHdlYmFwcCBzdWJwcm9qZWN0IC0tPgorCisgIDx0YXJnZXQgbmFtZT0iUk9PVCI+CisgICAgPGFudCBkaXI9IiR7YmFzZWRpcn0vUk9PVCIgdGFyZ2V0PSJkaXN0Ii8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iYWRtaW4iPgorICAgIDxhbnQgZGlyPSIke2Jhc2VkaXJ9L2FkbWluIiB0YXJnZXQ9ImRpc3QiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJtYW5hZ2VyIj4KKyAgICA8YW50IGRpcj0iJHtiYXNlZGlyfS9tYW5hZ2VyIiB0YXJnZXQ9ImRpc3QiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJkb2NzIj4KKyAgICA8YW50IGRpcj0iJHtiYXNlZGlyfS9kb2NzIiB0YXJnZXQ9ImRpc3QiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJiYWxhbmNlciI+CisgICAgPGFudCBkaXI9IiR7YmFzZWRpcn0vYmFsYW5jZXIiIHRhcmdldD0iZGlzdCIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9IndlYmRhdiI+CisgICAgPGFudCBkaXI9IiR7YmFzZWRpcn0vd2ViZGF2IiB0YXJnZXQ9ImRpc3QiLz4KKyAgPC90YXJnZXQ+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09IEJVSUxEOiBDb21waWxlIFNlcnZlciBDb21wb25lbnRzID09PT09PT09PT09PT09PT09IC0tPgorICA8IS0tIFVwZGF0ZSB0aGUgZGVwZW5kcyBsaXN0IGZvciBlYWNoIHN1YnByb2plY3QgLS0+CisgIDx0YXJnZXQgbmFtZT0iYnVpbGQiIGRlcGVuZHM9ImJ1aWxkLXByZXBhcmUsUk9PVCxhZG1pbixtYW5hZ2VyLGRvY3MsYmFsYW5jZXIsd2ViZGF2IiAvPgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PSBCVUlMRDogQ2xlYW4gRGlyZWN0b3J5ID09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJidWlsZC1jbGVhbiI+CisgICAgPGRlbGV0ZSBkaXI9IiR7d2ViYXBwcy5idWlsZH0iLz4KKyAgPC90YXJnZXQ+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09IEJVSUxEOiBSZWJ1aWxkIEV2ZXJ5dGhpbmcgPT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImFsbCIgZGVwZW5kcz0iYnVpbGQtY2xlYW4sZGlzdCIvPgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PSBERVBMT1k6IERlcGxveSBXZWJhcHBzIFByb2plY3RzID09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJkZXBsb3kiIGRlcGVuZHM9ImRpc3QiCisgICBkZXNjcmlwdGlvbj0iQnVpbGQgYW5kIGRlcGxveSBXZWJhcHBzIGNvbXBvbmVudCI+CisKKyAgICA8IS0tIEdlbmVyYWwgUHVycG9zZSBBcHBsaWNhdGlvbnMgLS0+CisgICAgPG1rZGlyIGRpcj0iJHt3ZWJhcHBzLmRlcGxveX0vd2ViYXBwcyIvPgorICAgIDxjb3B5IHRvZGlyPSIke3dlYmFwcHMuZGVwbG95fS93ZWJhcHBzIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHt3ZWJhcHBzLmJ1aWxkfSIgZXhjbHVkZXM9ImFkbWluLyoqLG1hbmFnZXIvKioiLz4KKyAgICA8L2NvcHk+CisKKyAgICA8IS0tIEFkbWluaXN0cmF0aXZlIEFwcGxpY2F0aW9ucyAtLT4KKyAgICA8bWtkaXIgICAgIGRpcj0iJHt3ZWJhcHBzLmRlcGxveX0vc2VydmVyL3dlYmFwcHMiLz4KKworICAgIDxjb3B5ICAgIHRvZGlyPSIke3dlYmFwcHMuZGVwbG95fS93ZWJhcHBzIgorICAgICAgICAgICAgICBmaWxlPSIke3dlYmFwcHMuYnVpbGR9L2FkbWluL2FkbWluLnhtbCIvPgorICAgIDxta2RpciAgICAgZGlyPSIke3dlYmFwcHMuZGVwbG95fS9zZXJ2ZXIvd2ViYXBwcy9hZG1pbiIvPgorICAgIDxjb3B5ICAgIHRvZGlyPSIke3dlYmFwcHMuZGVwbG95fS9zZXJ2ZXIvd2ViYXBwcy9hZG1pbiI+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7d2ViYXBwcy5idWlsZH0vYWRtaW4iIGV4Y2x1ZGVzPSJhZG1pbi54bWwiLz4KKyAgICA8L2NvcHk+CisKKyAgICA8Y29weSAgICB0b2Rpcj0iJHt3ZWJhcHBzLmRlcGxveX0vd2ViYXBwcyIKKyAgICAgICAgICAgICAgZmlsZT0iJHt3ZWJhcHBzLmJ1aWxkfS9tYW5hZ2VyL21hbmFnZXIueG1sIi8+CisgICAgPG1rZGlyICAgICBkaXI9IiR7d2ViYXBwcy5kZXBsb3l9L3NlcnZlci93ZWJhcHBzL21hbmFnZXIiLz4KKyAgICA8Y29weSAgICB0b2Rpcj0iJHt3ZWJhcHBzLmRlcGxveX0vc2VydmVyL3dlYmFwcHMvbWFuYWdlciI+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7d2ViYXBwcy5idWlsZH0vbWFuYWdlciIgZXhjbHVkZXM9Im1hbmFnZXIueG1sIi8+CisgICAgPC9jb3B5PgorCisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PSBESVNUOiBDcmVhdGUgRGlzdHJpYnV0aW9uIEZpbGVzID09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJkaXN0IiBkZXBlbmRzPSJidWlsZCIvPgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PSBESVNUOiBDbGVhbiBEaXJlY3RvcnkgPT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJkaXN0LWNsZWFuIj4KKyAgICA8ZGVsZXRlIGRpcj0iJHt3ZWJhcHBzLmRpc3R9Ii8+CisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09IENvbnZlbmllbnQgU3lub255bXMgPT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJjbGVhbiIgZGVwZW5kcz0iYnVpbGQtY2xlYW4sZGlzdC1jbGVhbiIKKyAgIGRlc2NyaXB0aW9uPSJDbGVhbiBidWlsZCBhbmQgZGlzdCBkaXJlY3RvcmllcyIvPgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT0gVEVTVDogQ29tcGlsZSBVbml0IFRlc3RzID09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJidWlsZC10ZXN0cyIgZGVwZW5kcz0iZGlzdCIgaWY9Imp1bml0LnByZXNlbnQiPgorICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09IFRFU1Q6IEV4ZWN1dGUgVW5pdCBUZXN0cyA9PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0idGVzdCIgaWY9Imp1bml0LnByZXNlbnQiCisgICBkZXNjcmlwdGlvbj0iUnVuIGFsbCB1bml0IHRlc3QgY2FzZXMiPgorICA8L3RhcmdldD4KKworCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9kb2NzL01FVEEtSU5GL2NvbnRleHQueG1sIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9NRVRBLUlORi9jb250ZXh0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGNiYzQ2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9NRVRBLUlORi9jb250ZXh0LnhtbApAQCAtMCwwICsxLDEyIEBACis8IS0tCisKKyAgICBDb250ZXh0IGNvbmZpZ3VyYXRpb24gZmlsZSBmb3IgdGhlIFRvbWNhdCBCYWxhbmNlciBXZWIgQXBwCisgICAgVGhpcyBpcyBvbmx5IG5lZWRlZCB0byBrZWVwIHRoZSBkaXN0cmlidXRpb24gc21hbGwgYW5kIGF2b2lkIGR1cGxpY2F0aW5nCisgICAgY29tbW9ucyBsaWJyYXJpZXMKKworICAgICRJZCQKKworLS0+CisKKworPENvbnRleHQgYW50aVJlc291cmNlTG9ja2luZz0iZmFsc2UiIC8+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9kb2NzL1dFQi1JTkYvd2ViLnhtbCBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvV0VCLUlORi93ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2MzQ1MGQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL1dFQi1JTkYvd2ViLnhtbApAQCAtMCwwICsxLDEyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+CisKKzwhRE9DVFlQRSB3ZWItYXBwCisgICAgUFVCTElDICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgV2ViIEFwcGxpY2F0aW9uIDIuMy8vRU4iCisgICAgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL3dlYi1hcHBfMl8zLmR0ZCI+CisKKzx3ZWItYXBwPgorICA8ZGlzcGxheS1uYW1lPlRvbWNhdCBEb2N1bWVudGF0aW9uPC9kaXNwbGF5LW5hbWU+CisgIDxkZXNjcmlwdGlvbj4KKyAgICAgVG9tY2F0IERvY3VtZW50YXRpb24uCisgIDwvZGVzY3JpcHRpb24+Cis8L3dlYi1hcHA+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9kb2NzL2FwcGRldi9idWlsZC54bWwudHh0IGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9hcHBkZXYvYnVpbGQueG1sLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjM1YmE1Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9hcHBkZXYvYnVpbGQueG1sLnR4dApAQCAtMCwwICsxLDUwMyBAQAorPCEtLQorICAgICBHZW5lcmFsIHB1cnBvc2UgYnVpbGQgc2NyaXB0IGZvciB3ZWIgYXBwbGljYXRpb25zIGFuZCB3ZWIgc2VydmljZXMsCisgICAgIGluY2x1ZGluZyBlbmhhbmNlZCBzdXBwb3J0IGZvciBkZXBsb3lpbmcgZGlyZWN0bHkgdG8gYSBUb21jYXQgNQorICAgICBiYXNlZCBzZXJ2ZXIuCisKKyAgICAgVGhpcyBidWlsZCBzY3JpcHQgYXNzdW1lcyB0aGF0IHRoZSBzb3VyY2UgY29kZSBvZiB5b3VyIHdlYiBhcHBsaWNhdGlvbgorICAgICBpcyBvcmdhbml6ZWQgaW50byB0aGUgZm9sbG93aW5nIHN1YmRpcmVjdG9yaWVzIHVuZGVybmVhdGggdGhlIHNvdXJjZQorICAgICBjb2RlIGRpcmVjdG9yeSBmcm9tIHdoaWNoIHlvdSBleGVjdXRlIHRoZSBidWlsZCBzY3JpcHQ6CisKKyAgICAgICAgZG9jcyAgICAgICAgICAgICAgICAgU3RhdGljIGRvY3VtZW50YXRpb24gZmlsZXMgdG8gYmUgY29waWVkIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSAiZG9jcyIgc3ViZGlyZWN0b3J5IG9mIHlvdXIgZGlzdHJpYnV0aW9uLgorCisgICAgICAgIHNyYyAgICAgICAgICAgICAgICAgIEphdmEgc291cmNlIGNvZGUgKGFuZCBhc3NvY2lhdGVkIHJlc291cmNlIGZpbGVzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSBjb21waWxlZCB0byB0aGUgIldFQi1JTkYvY2xhc3NlcyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViZGlyZWN0b3J5IG9mIHlvdXIgd2ViIGFwcGxpY2FpdG9uLgorCisgICAgICAgIHdlYiAgICAgICAgICAgICAgICAgIFN0YXRpYyBIVE1MLCBKU1AsIGFuZCBvdGhlciBjb250ZW50IChzdWNoIGFzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlIGZpbGVzKSwgaW5jbHVkaW5nIHRoZSBXRUItSU5GIHN1YmRpcmVjdG9yeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgaXRzIGNvbmZpZ3VyYXRpb24gZmlsZSBjb250ZW50cy4KKworICAgICAkSWQkCistLT4KKworCis8IS0tIEEgInByb2plY3QiIGRlc2NyaWJlcyBhIHNldCBvZiB0YXJnZXRzIHRoYXQgbWF5IGJlIHJlcXVlc3RlZAorICAgICB3aGVuIEFudCBpcyBleGVjdXRlZC4gIFRoZSAiZGVmYXVsdCIgYXR0cmlidXRlIGRlZmluZXMgdGhlCisgICAgIHRhcmdldCB3aGljaCBpcyBleGVjdXRlZCBpZiBubyBzcGVjaWZpYyB0YXJnZXQgaXMgcmVxdWVzdGVkLAorICAgICBhbmQgdGhlICJiYXNlZGlyIiBhdHRyaWJ1dGUgZGVmaW5lcyB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeQorICAgICBmcm9tIHdoaWNoIEFudCBleGVjdXRlcyB0aGUgcmVxdWVzdGVkIHRhc2suICBUaGlzIGlzIG5vcm1hbGx5CisgICAgIHNldCB0byB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4KKy0tPgorCis8cHJvamVjdCBuYW1lPSJNeSBQcm9qZWN0IiBkZWZhdWx0PSJjb21waWxlIiBiYXNlZGlyPSIuIj4KKworCisKKzwhLS0gPT09PT09PT09PT09PT09PT09PT09IFByb3BlcnR5IERlZmluaXRpb25zID09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworCis8IS0tCisKKyAgRWFjaCBvZiB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXMgYXJlIHVzZWQgaW4gdGhlIGJ1aWxkIHNjcmlwdC4KKyAgVmFsdWVzIGZvciB0aGVzZSBwcm9wZXJ0aWVzIGFyZSBzZXQgYnkgdGhlIGZpcnN0IHBsYWNlIHRoZXkgYXJlCisgIGRlZmluZWQsIGZyb20gdGhlIGZvbGxvd2luZyBsaXN0OgorCisgICogRGVmaW5pdGlvbnMgb24gdGhlICJhbnQiIGNvbW1hbmQgbGluZSAoYW50IC1EZm9vPWJhciBjb21waWxlKS4KKworICAqIERlZmluaXRpb25zIGZyb20gYSAiYnVpbGQucHJvcGVydGllcyIgZmlsZSBpbiB0aGUgdG9wIGxldmVsCisgICAgc291cmNlIGRpcmVjdG9yeSBvZiB0aGlzIGFwcGxpY2F0aW9uLgorCisgICogRGVmaW5pdGlvbnMgZnJvbSBhICJidWlsZC5wcm9wZXJ0aWVzIiBmaWxlIGluIHRoZSBkZXZlbG9wZXIncworICAgIGhvbWUgZGlyZWN0b3J5LgorCisgICogRGVmYXVsdCBkZWZpbml0aW9ucyBpbiB0aGlzIGJ1aWxkLnhtbCBmaWxlLgorCisgIFlvdSB3aWxsIG5vdGUgYmVsb3cgdGhhdCBwcm9wZXJ0eSB2YWx1ZXMgY2FuIGJlIGNvbXBvc2VkIGJhc2VkIG9uIHRoZQorICBjb250ZW50cyBvZiBwcmV2aW91c2x5IGRlZmluZWQgcHJvcGVydGllcy4gIFRoaXMgaXMgYSBwb3dlcmZ1bCB0ZWNobmlxdWUKKyAgdGhhdCBoZWxwcyB5b3UgbWluaW1pemUgdGhlIG51bWJlciBvZiBjaGFuZ2VzIHJlcXVpcmVkIHdoZW4geW91ciBkZXZlbG9wbWVudAorICBlbnZpcm9ubWVudCBpcyBtb2RpZmllZC4gIE5vdGUgdGhhdCBwcm9wZXJ0eSBjb21wb3NpdGlvbiBpcyBhbGxvd2VkIHdpdGhpbgorICAiYnVpbGQucHJvcGVydGllcyIgZmlsZXMgYXMgd2VsbCBhcyBpbiB0aGUgImJ1aWxkLnhtbCIgc2NyaXB0LgorCistLT4KKworICA8cHJvcGVydHkgZmlsZT0iYnVpbGQucHJvcGVydGllcyIvPgorICA8cHJvcGVydHkgZmlsZT0iJHt1c2VyLmhvbWV9L2J1aWxkLnByb3BlcnRpZXMiLz4KKworCis8IS0tID09PT09PT09PT09PT09PT09PT09IEZpbGUgYW5kIERpcmVjdG9yeSBOYW1lcyA9PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKworPCEtLQorCisgIFRoZXNlIHByb3BlcnRpZXMgZ2VuZXJhbGx5IGRlZmluZSBmaWxlIGFuZCBkaXJlY3RvcnkgbmFtZXMgKG9yIHBhdGhzKSB0aGF0CisgIGFmZmVjdCB3aGVyZSB0aGUgYnVpbGQgcHJvY2VzcyBzdG9yZXMgaXRzIG91dHB1dHMuCisKKyAgYXBwLm5hbWUgICAgICAgICAgICAgQmFzZSBuYW1lIG9mIHRoaXMgYXBwbGljYXRpb24sIHVzZWQgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0IGZpbGVuYW1lcyBhbmQgZGlyZWN0b3JpZXMuCisgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHRzIHRvICJteWFwcCIuCisKKyAgYXBwLnBhdGggICAgICAgICAgICAgQ29udGV4dCBwYXRoIHRvIHdoaWNoIHRoaXMgYXBwbGljYXRpb24gc2hvdWxkIGJlCisgICAgICAgICAgICAgICAgICAgICAgIGRlcGxveWVkIChkZWZhdWx0cyB0byAiLyIgcGx1cyB0aGUgdmFsdWUgb2YgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICJhcHAubmFtZSIgcHJvcGVydHkpLgorCisgIGFwcC52ZXJzaW9uICAgICAgICAgIFZlcnNpb24gbnVtYmVyIG9mIHRoaXMgaXRlcmF0aW9uIG9mIHRoZSBhcHBsaWNhdGlvbi4KKworICBidWlsZC5ob21lICAgICAgICAgICBUaGUgZGlyZWN0b3J5IGludG8gd2hpY2ggdGhlICJwcmVwYXJlIiBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgImNvbXBpbGUiIHRhcmdldHMgd2lsbCBnZW5lcmF0ZSB0aGVpciBvdXRwdXQuCisgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHRzIHRvICJidWlsZCIuCisKKyAgY2F0YWxpbmEuaG9tZSAgICAgICAgVGhlIGRpcmVjdG9yeSBpbiB3aGljaCB5b3UgaGF2ZSBpbnN0YWxsZWQKKyAgICAgICAgICAgICAgICAgICAgICAgYSBiaW5hcnkgZGlzdHJpYnV0aW9uIG9mIFRvbWNhdCA1LiAgVGhpcyB3aWxsCisgICAgICAgICAgICAgICAgICAgICAgIGJlIHVzZWQgYnkgdGhlICJkZXBsb3kiIHRhcmdldC4KKworICBkaXN0LmhvbWUgICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgYmFzZSBkaXJlY3RvcnkgaW4gd2hpY2gKKyAgICAgICAgICAgICAgICAgICAgICAgZGlzdHJpYnV0aW9uIGZpbGVzIGFyZSBjcmVhdGVkLgorICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0cyB0byAiZGlzdCIuCisKKyAgbWFuYWdlci5wYXNzd29yZCAgICAgVGhlIGxvZ2luIHBhc3N3b3JkIG9mIGEgdXNlciB0aGF0IGlzIGFzc2lnbmVkIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAibWFuYWdlciIgcm9sZSAoc28gdGhhdCBoZSBvciBzaGUgY2FuIGV4ZWN1dGUKKyAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZHMgdmlhIHRoZSAiL21hbmFnZXIiIHdlYiBhcHBsaWNhdGlvbikKKworICBtYW5hZ2VyLnVybCAgICAgICAgICBUaGUgVVJMIG9mIHRoZSAiL21hbmFnZXIiIHdlYiBhcHBsaWNhdGlvbiBvbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgVG9tY2F0IGluc3RhbGxhdGlvbiB0byB3aGljaCB3ZSB3aWxsIGRlcGxveSB3ZWIKKyAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb25zIGFuZCB3ZWIgc2VydmljZXMuCisKKyAgbWFuYWdlci51c2VybmFtZSAgICAgVGhlIGxvZ2luIHVzZXJuYW1lIG9mIGEgdXNlciB0aGF0IGlzIGFzc2lnbmVkIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAibWFuYWdlciIgcm9sZSAoc28gdGhhdCBoZSBvciBzaGUgY2FuIGV4ZWN1dGUKKyAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZHMgdmlhIHRoZSAiL21hbmFnZXIiIHdlYiBhcHBsaWNhdGlvbikKKworLS0+CisKKyAgPHByb3BlcnR5IG5hbWU9ImFwcC5uYW1lIiAgICAgIHZhbHVlPSJteWFwcCIvPgorICA8cHJvcGVydHkgbmFtZT0iYXBwLnBhdGgiICAgICAgdmFsdWU9Ii8ke2FwcC5uYW1lfSIvPgorICA8cHJvcGVydHkgbmFtZT0iYXBwLnZlcnNpb24iICAgdmFsdWU9IjAuMS1kZXYiLz4KKyAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmhvbWUiICAgIHZhbHVlPSIke2Jhc2VkaXJ9L2J1aWxkIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJjYXRhbGluYS5ob21lIiB2YWx1ZT0iLi4vLi4vLi4vLi4iLz4gPCEtLSBVUERBVEUgVEhJUyEgLS0+CisgIDxwcm9wZXJ0eSBuYW1lPSJkaXN0LmhvbWUiICAgICB2YWx1ZT0iJHtiYXNlZGlyfS9kaXN0Ii8+CisgIDxwcm9wZXJ0eSBuYW1lPSJkb2NzLmhvbWUiICAgICB2YWx1ZT0iJHtiYXNlZGlyfS9kb2NzIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJtYW5hZ2VyLnVybCIgICB2YWx1ZT0iaHR0cDovL2xvY2FsaG9zdDo4MDgwL21hbmFnZXIiLz4KKyAgPHByb3BlcnR5IG5hbWU9InNyYy5ob21lIiAgICAgIHZhbHVlPSIke2Jhc2VkaXJ9L3NyYyIvPgorICA8cHJvcGVydHkgbmFtZT0id2ViLmhvbWUiICAgICAgdmFsdWU9IiR7YmFzZWRpcn0vd2ViIi8+CisKKworPCEtLSA9PT09PT09PT09PT09PT09PT0gQ3VzdG9tIEFudCBUYXNrIERlZmluaXRpb25zID09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCisKKzwhLS0KKworICBUaGVzZSBwcm9wZXJ0aWVzIGRlZmluZSBjdXN0b20gdGFza3MgZm9yIHRoZSBBbnQgYnVpbGQgdG9vbCB0aGF0IGludGVyYWN0CisgIHdpdGggdGhlICIvbWFuYWdlciIgd2ViIGFwcGxpY2F0aW9uIGluc3RhbGxlZCB3aXRoIFRvbWNhdCA1LiAgQmVmb3JlIHRoZXkKKyAgY2FuIGJlIHN1Y2Nlc3NmdWxseSB1dGlsaXplZCwgeW91IG11c3QgcGVyZm9ybSB0aGUgZm9sbG93aW5nIHN0ZXBzOgorCisgIC0gQ29weSB0aGUgZmlsZSAic2VydmVyL2xpYi9jYXRhbGluYS1hbnQuamFyIiBmcm9tIHlvdXIgVG9tY2F0IDUKKyAgICBpbnN0YWxsYXRpb24gaW50byB0aGUgImxpYiIgZGlyZWN0b3J5IG9mIHlvdXIgQW50IGluc3RhbGxhdGlvbi4KKworICAtIENyZWF0ZSBhICJidWlsZC5wcm9wZXJ0aWVzIiBmaWxlIGluIHlvdXIgYXBwbGljYXRpb24ncyB0b3AtbGV2ZWwKKyAgICBzb3VyY2UgZGlyZWN0b3J5IChvciB5b3VyIHVzZXIgbG9naW4gaG9tZSBkaXJlY3RvcnkpIHRoYXQgZGVmaW5lcworICAgIGFwcHJvcHJpYXRlIHZhbHVlcyBmb3IgdGhlICJtYW5hZ2VyLnBhc3N3b3JkIiwgIm1hbmFnZXIudXJsIiwgYW5kCisgICAgIm1hbmFnZXIudXNlcm5hbWUiIHByb3BlcnRpZXMgZGVzY3JpYmVkIGFib3ZlLgorCisgIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBNYW5hZ2VyIHdlYiBhcHBsaWNhdGlvbiwgYW5kIHRoZSBmdW5jdGlvbmFsaXR5CisgIG9mIHRoZXNlIHRhc2tzLCBzZWUgPGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC90b21jYXQtZG9jcy9tYW5hZ2VyLWhvd3RvLmh0bWw+LgorCistLT4KKworICA8dGFza2RlZiBuYW1lPSJkZXBsb3kiICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmFudC5EZXBsb3lUYXNrIi8+CisgIDx0YXNrZGVmIG5hbWU9Imxpc3QiICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuYW50Lkxpc3RUYXNrIi8+CisgIDx0YXNrZGVmIG5hbWU9InJlbG9hZCIgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuYW50LlJlbG9hZFRhc2siLz4KKyAgPHRhc2tkZWYgbmFtZT0idW5kZXBsb3kiIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5hbnQuVW5kZXBsb3lUYXNrIi8+CisKKworPCEtLSAgPT09PT09PT09PT09PT09PT09PT0gQ29tcGlsYXRpb24gQ29udHJvbCBPcHRpb25zID09PT09PT09PT09PT09PT09PT09IC0tPgorCis8IS0tCisKKyAgVGhlc2UgcHJvcGVydGllcyBjb250cm9sIG9wdGlvbiBzZXR0aW5ncyBvbiB0aGUgSmF2YWMgY29tcGlsZXIgd2hlbiBpdAorICBpcyBpbnZva2VkIHVzaW5nIHRoZSA8amF2YWM+IHRhc2suCisKKyAgY29tcGlsZS5kZWJ1ZyAgICAgICAgU2hvdWxkIGNvbXBpbGF0aW9uIGluY2x1ZGUgdGhlIGRlYnVnIG9wdGlvbj8KKworICBjb21waWxlLmRlcHJlY2F0aW9uICBTaG91bGQgY29tcGlsYXRpb24gaW5jbHVkZSB0aGUgZGVwcmVjYXRpb24gb3B0aW9uPworCisgIGNvbXBpbGUub3B0aW1pemUgICAgIFNob3VsZCBjb21waWxhdGlvbiBpbmNsdWRlIHRoZSBvcHRpbWl6ZSBvcHRpb24/CisKKy0tPgorCisgIDxwcm9wZXJ0eSBuYW1lPSJjb21waWxlLmRlYnVnIiAgICAgICB2YWx1ZT0idHJ1ZSIvPgorICA8cHJvcGVydHkgbmFtZT0iY29tcGlsZS5kZXByZWNhdGlvbiIgdmFsdWU9ImZhbHNlIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJjb21waWxlLm9wdGltaXplIiAgICB2YWx1ZT0idHJ1ZSIvPgorCisKKworPCEtLSA9PT09PT09PT09PT09PT09PT09PSBFeHRlcm5hbCBEZXBlbmRlbmNpZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCisKKzwhLS0KKworICBVc2UgcHJvcGVydHkgdmFsdWVzIHRvIGRlZmluZSB0aGUgbG9jYXRpb25zIG9mIGV4dGVybmFsIEpBUiBmaWxlcyBvbiB3aGljaAorICB5b3VyIGFwcGxpY2F0aW9uIHdpbGwgZGVwZW5kLiAgSW4gZ2VuZXJhbCwgdGhlc2UgdmFsdWVzIHdpbGwgYmUgdXNlZCBmb3IKKyAgdHdvIHB1cnBvc2VzOgorICAqIEluY2x1c2lvbiBvbiB0aGUgY2xhc3NwYXRoIHRoYXQgaXMgcGFzc2VkIHRvIHRoZSBKYXZhYyBjb21waWxlcgorICAqIEJlaW5nIGNvcGllZCBpbnRvIHRoZSAiL1dFQi1JTkYvbGliIiBkaXJlY3RvcnkgZHVyaW5nIGV4ZWN1dGlvbgorICAgIG9mIHRoZSAiZGVwbG95IiB0YXJnZXQuCisKKyAgQmVjYXVzZSB3ZSB3aWxsIGF1dG9tYXRpY2FsbHkgaW5jbHVkZSBhbGwgb2YgdGhlIEphdmEgY2xhc3NlcyB0aGF0IFRvbWNhdCA1CisgIGV4cG9zZXMgdG8gd2ViIGFwcGxpY2F0aW9ucywgd2Ugd2lsbCBub3QgbmVlZCB0byBleHBsaWNpdGx5IGxpc3QgYW55IG9mIHRob3NlCisgIGRlcGVuZGVuY2llcy4gIFlvdSBvbmx5IG5lZWQgdG8gd29ycnkgYWJvdXQgZXh0ZXJuYWwgZGVwZW5kZW5jaWVzIGZvciBKQVIKKyAgZmlsZXMgdGhhdCB5b3UgYXJlIGdvaW5nIHRvIGluY2x1ZGUgaW5zaWRlIHlvdXIgIi9XRUItSU5GL2xpYiIgZGlyZWN0b3J5LgorCistLT4KKworPCEtLSBEdW1teSBleHRlcm5hbCBkZXBlbmRlbmN5IC0tPgorPCEtLQorICA8cHJvcGVydHkgbmFtZT0iZm9vLmphciIKKyAgICAgICAgICAgdmFsdWU9Ii9wYXRoL3RvL2Zvby5qYXIiLz4KKy0tPgorCisKKzwhLS0gPT09PT09PT09PT09PT09PT09PT0gQ29tcGlsYXRpb24gQ2xhc3NwYXRoID09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworPCEtLQorCisgIFJhdGhlciB0aGFuIHJlbHlpbmcgb24gdGhlIENMQVNTUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZSwgQW50IGluY2x1ZGVzCisgIGZlYXR1cmVzIHRoYXQgbWFrZXMgaXQgZWFzeSB0byBkeW5hbWljYWxseSBjb25zdHJ1Y3QgdGhlIGNsYXNzcGF0aCB5b3UKKyAgbmVlZCBmb3IgZWFjaCBjb21waWxhdGlvbi4gIFRoZSBleGFtcGxlIGJlbG93IGNvbnN0cnVjdHMgdGhlIGNvbXBpbGUKKyAgY2xhc3NwYXRoIHRvIGluY2x1ZGUgdGhlIHNlcnZsZXQuamFyIGZpbGUsIGFzIHdlbGwgYXMgdGhlIG90aGVyIGNvbXBvbmVudHMKKyAgdGhhdCBUb21jYXQgbWFrZXMgYXZhaWxhYmxlIHRvIHdlYiBhcHBsaWNhdGlvbnMgYXV0b21hdGljYWxseSwgcGx1cyBhbnl0aGluZworICB0aGF0IHlvdSBleHBsaWNpdGx5IGFkZGVkLgorCistLT4KKworICA8cGF0aCBpZD0iY29tcGlsZS5jbGFzc3BhdGgiPgorCisgICAgPCEtLSBJbmNsdWRlIGFsbCBKQVIgZmlsZXMgdGhhdCB3aWxsIGJlIGluY2x1ZGVkIGluIC9XRUItSU5GL2xpYiAtLT4KKyAgICA8IS0tICoqKiBDVVNUT01JWkUgSEVSRSBBUyBSRVFVSVJFRCBCWSBZT1VSIEFQUExJQ0FUSU9OICoqKiAtLT4KKzwhLS0KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Zm9vLmphcn0iLz4KKy0tPgorCisgICAgPCEtLSBJbmNsdWRlIGFsbCBlbGVtZW50cyB0aGF0IFRvbWNhdCBleHBvc2VzIHRvIGFwcGxpY2F0aW9ucyAtLT4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y2F0YWxpbmEuaG9tZX0vY29tbW9uL2NsYXNzZXMiLz4KKyAgICA8ZmlsZXNldCBkaXI9IiR7Y2F0YWxpbmEuaG9tZX0vY29tbW9uL2VuZG9yc2VkIj4KKyAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIi8+CisgICAgPC9maWxlc2V0PgorICAgIDxmaWxlc2V0IGRpcj0iJHtjYXRhbGluYS5ob21lfS9jb21tb24vbGliIj4KKyAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIi8+CisgICAgPC9maWxlc2V0PgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjYXRhbGluYS5ob21lfS9zaGFyZWQvY2xhc3NlcyIvPgorICAgIDxmaWxlc2V0IGRpcj0iJHtjYXRhbGluYS5ob21lfS9zaGFyZWQvbGliIj4KKyAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIi8+CisgICAgPC9maWxlc2V0PgorCisgIDwvcGF0aD4KKworCisKKzwhLS0gPT09PT09PT09PT09PT09PT09PT0gQWxsIFRhcmdldCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworPCEtLQorCisgIFRoZSAiYWxsIiB0YXJnZXQgaXMgYSBzaG9ydGN1dCBmb3IgcnVubmluZyB0aGUgImNsZWFuIiB0YXJnZXQgZm9sbG93ZWQKKyAgYnkgdGhlICJjb21waWxlIiB0YXJnZXQsIHRvIGZvcmNlIGEgY29tcGxldGUgcmVjb21waWxlLgorCistLT4KKworICA8dGFyZ2V0IG5hbWU9ImFsbCIgZGVwZW5kcz0iY2xlYW4sY29tcGlsZSIKKyAgIGRlc2NyaXB0aW9uPSJDbGVhbiBidWlsZCBhbmQgZGlzdCBkaXJlY3RvcmllcywgdGhlbiBjb21waWxlIi8+CisKKworCis8IS0tID09PT09PT09PT09PT09PT09PT09IENsZWFuIFRhcmdldCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKzwhLS0KKworICBUaGUgImNsZWFuIiB0YXJnZXQgZGVsZXRlcyBhbnkgcHJldmlvdXMgImJ1aWxkIiBhbmQgImRpc3QiIGRpcmVjdG9yeSwKKyAgc28gdGhhdCB5b3UgY2FuIGJlIGVuc3VyZWQgdGhlIGFwcGxpY2F0aW9uIGNhbiBiZSBidWlsdCBmcm9tIHNjcmF0Y2guCisKKy0tPgorCisgIDx0YXJnZXQgbmFtZT0iY2xlYW4iCisgICBkZXNjcmlwdGlvbj0iRGVsZXRlIG9sZCBidWlsZCBhbmQgZGlzdCBkaXJlY3RvcmllcyI+CisgICAgPGRlbGV0ZSBkaXI9IiR7YnVpbGQuaG9tZX0iLz4KKyAgICA8ZGVsZXRlIGRpcj0iJHtkaXN0LmhvbWV9Ii8+CisgIDwvdGFyZ2V0PgorCisKKworPCEtLSA9PT09PT09PT09PT09PT09PT09PSBDb21waWxlIFRhcmdldCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCis8IS0tCisKKyAgVGhlICJjb21waWxlIiB0YXJnZXQgdHJhbnNmb3JtcyBzb3VyY2UgZmlsZXMgKGZyb20geW91ciAic3JjIiBkaXJlY3RvcnkpCisgIGludG8gb2JqZWN0IGZpbGVzIGluIHRoZSBhcHByb3ByaWF0ZSBsb2NhdGlvbiBpbiB0aGUgYnVpbGQgZGlyZWN0b3J5LgorICBUaGlzIGV4YW1wbGUgYXNzdW1lcyB0aGF0IHlvdSB3aWxsIGJlIGluY2x1ZGluZyB5b3VyIGNsYXNzZXMgaW4gYW4KKyAgdW5wYWNrZWQgZGlyZWN0b3J5IGhpZXJhcmNoeSB1bmRlciAiL1dFQi1JTkYvY2xhc3NlcyIuCisKKy0tPgorCisgIDx0YXJnZXQgbmFtZT0iY29tcGlsZSIgZGVwZW5kcz0icHJlcGFyZSIKKyAgIGRlc2NyaXB0aW9uPSJDb21waWxlIEphdmEgc291cmNlcyI+CisKKyAgICA8IS0tIENvbXBpbGUgSmF2YSBjbGFzc2VzIGFzIG5lY2Vzc2FyeSAtLT4KKyAgICA8bWtkaXIgICAgZGlyPSIke2J1aWxkLmhvbWV9L1dFQi1JTkYvY2xhc3NlcyIvPgorICAgIDxqYXZhYyBzcmNkaXI9IiR7c3JjLmhvbWV9IgorICAgICAgICAgIGRlc3RkaXI9IiR7YnVpbGQuaG9tZX0vV0VCLUlORi9jbGFzc2VzIgorICAgICAgICAgICAgZGVidWc9IiR7Y29tcGlsZS5kZWJ1Z30iCisgICAgICBkZXByZWNhdGlvbj0iJHtjb21waWxlLmRlcHJlY2F0aW9ufSIKKyAgICAgICAgIG9wdGltaXplPSIke2NvbXBpbGUub3B0aW1pemV9Ij4KKyAgICAgICAgPGNsYXNzcGF0aCByZWZpZD0iY29tcGlsZS5jbGFzc3BhdGgiLz4KKyAgICA8L2phdmFjPgorCisgICAgPCEtLSBDb3B5IGFwcGxpY2F0aW9uIHJlc291cmNlcyAtLT4KKyAgICA8Y29weSAgdG9kaXI9IiR7YnVpbGQuaG9tZX0vV0VCLUlORi9jbGFzc2VzIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHtzcmMuaG9tZX0iIGV4Y2x1ZGVzPSIqKi8qLmphdmEiLz4KKyAgICA8L2NvcHk+CisKKyAgPC90YXJnZXQ+CisKKworCis8IS0tID09PT09PT09PT09PT09PT09PT09IERpc3QgVGFyZ2V0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKworPCEtLQorCisgIFRoZSAiZGlzdCIgdGFyZ2V0IGNyZWF0ZXMgYSBiaW5hcnkgZGlzdHJpYnV0aW9uIG9mIHlvdXIgYXBwbGljYXRpb24KKyAgaW4gYSBkaXJlY3Rvcnkgc3RydWN0dXJlIHJlYWR5IHRvIGJlIGFyY2hpdmVkIGluIGEgdGFyLmd6IG9yIHppcCBmaWxlLgorICBOb3RlIHRoYXQgdGhpcyB0YXJnZXQgZGVwZW5kcyBvbiB0d28gb3RoZXJzOgorCisgICogImNvbXBpbGUiIHNvIHRoYXQgdGhlIGVudGlyZSB3ZWIgYXBwbGljYXRpb24gKGluY2x1ZGluZyBleHRlcm5hbAorICAgIGRlcGVuZGVuY2llcykgd2lsbCBoYXZlIGJlZW4gYXNzZW1ibGVkCisKKyAgKiAiamF2YWRvYyIgc28gdGhhdCB0aGUgYXBwbGljYXRpb24gSmF2YWRvY3Mgd2lsbCBoYXZlIGJlZW4gY3JlYXRlZAorCistLT4KKworICA8dGFyZ2V0IG5hbWU9ImRpc3QiIGRlcGVuZHM9ImNvbXBpbGUsamF2YWRvYyIKKyAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgYmluYXJ5IGRpc3RyaWJ1dGlvbiI+CisKKyAgICA8IS0tIENvcHkgZG9jdW1lbnRhdGlvbiBzdWJkaXJlY3RvcmllcyAtLT4KKyAgICA8bWtkaXIgICBkaXI9IiR7ZGlzdC5ob21lfS9kb2NzIi8+CisgICAgPGNvcHkgICAgdG9kaXI9IiR7ZGlzdC5ob21lfS9kb2NzIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHtkb2NzLmhvbWV9Ii8+CisgICAgPC9jb3B5PgorCisgICAgPCEtLSBDcmVhdGUgYXBwbGljYXRpb24gSkFSIGZpbGUgLS0+CisgICAgPGphciBqYXJmaWxlPSIke2Rpc3QuaG9tZX0vJHthcHAubmFtZX0tJHthcHAudmVyc2lvbn0ud2FyIgorICAgICAgICAgYmFzZWRpcj0iJHtidWlsZC5ob21lfSIvPgorCisgICAgPCEtLSBDb3B5IGFkZGl0aW9uYWwgZmlsZXMgdG8gJHtkaXN0LmhvbWV9IGFzIG5lY2Vzc2FyeSAtLT4KKworICA8L3RhcmdldD4KKworCisKKzwhLS0gPT09PT09PT09PT09PT09PT09PT0gSW5zdGFsbCBUYXJnZXQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworPCEtLQorCisgIFRoZSAiaW5zdGFsbCIgdGFyZ2V0IHRlbGxzIHRoZSBzcGVjaWZpZWQgVG9tY2F0IDUgaW5zdGFsbGF0aW9uIHRvIGR5bmFtaWNhbGx5CisgIGluc3RhbGwgdGhpcyB3ZWIgYXBwbGljYXRpb24gYW5kIG1ha2UgaXQgYXZhaWxhYmxlIGZvciBleGVjdXRpb24uICBJdCBkb2VzCisgICpub3QqIGNhdXNlIHRoZSBleGlzdGVuY2Ugb2YgdGhpcyB3ZWIgYXBwbGljYXRpb24gdG8gYmUgcmVtZW1iZXJlZCBhY3Jvc3MKKyAgVG9tY2F0IHJlc3RhcnRzOyBpZiB5b3UgcmVzdGFydCB0aGUgc2VydmVyLCB5b3Ugd2lsbCBuZWVkIHRvIHJlLWluc3RhbGwgYWxsCisgIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorCisgIElmIHlvdSBoYXZlIGFscmVhZHkgaW5zdGFsbGVkIHRoaXMgYXBwbGljYXRpb24sIGFuZCBzaW1wbHkgd2FudCBUb21jYXQgdG8KKyAgcmVjb2duaXplIHRoYXQgeW91IGhhdmUgdXBkYXRlZCBKYXZhIGNsYXNzZXMgKG9yIHRoZSB3ZWIueG1sIGZpbGUpLCB1c2UgdGhlCisgICJyZWxvYWQiIHRhcmdldCBpbnN0ZWFkLgorCisgIE5PVEU6ICBUaGlzIHRhcmdldCB3aWxsIG9ubHkgc3VjY2VlZCBpZiBpdCBpcyBydW4gZnJvbSB0aGUgc2FtZSBzZXJ2ZXIgdGhhdAorICBUb21jYXQgaXMgcnVubmluZyBvbi4KKworICBOT1RFOiAgVGhpcyBpcyB0aGUgbG9naWNhbCBvcHBvc2l0ZSBvZiB0aGUgInJlbW92ZSIgdGFyZ2V0LgorCistLT4KKworICA8dGFyZ2V0IG5hbWU9Imluc3RhbGwiIGRlcGVuZHM9ImNvbXBpbGUiCisgICBkZXNjcmlwdGlvbj0iSW5zdGFsbCBhcHBsaWNhdGlvbiB0byBzZXJ2bGV0IGNvbnRhaW5lciI+CisKKyAgICA8ZGVwbG95IHVybD0iJHttYW5hZ2VyLnVybH0iCisgICAgICAgdXNlcm5hbWU9IiR7bWFuYWdlci51c2VybmFtZX0iCisgICAgICAgcGFzc3dvcmQ9IiR7bWFuYWdlci5wYXNzd29yZH0iCisgICAgICAgICAgIHBhdGg9IiR7YXBwLnBhdGh9IgorICAgICAgIGxvY2FsV2FyPSJmaWxlOi8vJHtidWlsZC5ob21lfSIvPgorCisgIDwvdGFyZ2V0PgorCisKKzwhLS0gPT09PT09PT09PT09PT09PT09PT0gSmF2YWRvYyBUYXJnZXQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworPCEtLQorCisgIFRoZSAiamF2YWRvYyIgdGFyZ2V0IGNyZWF0ZXMgSmF2YWRvYyBBUEkgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIEphdmEKKyAgY2xhc3NlcyBpbmNsdWRlZCBpbiB5b3VyIGFwcGxpY2F0aW9uLiAgTm9ybWFsbHksIHRoaXMgaXMgb25seSByZXF1aXJlZAorICB3aGVuIHByZXBhcmluZyBhIGRpc3RyaWJ1dGlvbiByZWxlYXNlLCBidXQgaXMgYXZhaWxhYmxlIGFzIGEgc2VwYXJhdGUKKyAgdGFyZ2V0IGluIGNhc2UgdGhlIGRldmVsb3BlciB3YW50cyB0byBjcmVhdGUgSmF2YWRvY3MgaW5kZXBlbmRlbnRseS4KKworLS0+CisKKyAgPHRhcmdldCBuYW1lPSJqYXZhZG9jIiBkZXBlbmRzPSJjb21waWxlIgorICAgZGVzY3JpcHRpb249IkNyZWF0ZSBKYXZhZG9jIEFQSSBkb2N1bWVudGF0aW9uIj4KKworICAgIDxta2RpciAgICAgICAgICBkaXI9IiR7ZGlzdC5ob21lfS9kb2NzL2FwaSIvPgorICAgIDxqYXZhZG9jIHNvdXJjZXBhdGg9IiR7c3JjLmhvbWV9IgorICAgICAgICAgICAgICAgIGRlc3RkaXI9IiR7ZGlzdC5ob21lfS9kb2NzL2FwaSIKKyAgICAgICAgICAgcGFja2FnZW5hbWVzPSIqIj4KKyAgICAgIDxjbGFzc3BhdGggcmVmaWQ9ImNvbXBpbGUuY2xhc3NwYXRoIi8+CisgICAgPC9qYXZhZG9jPgorCisgIDwvdGFyZ2V0PgorCisKKworPCEtLSA9PT09PT09PT09PT09PT09PT09PT09IExpc3QgVGFyZ2V0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCis8IS0tCisKKyAgVGhlICJsaXN0IiB0YXJnZXQgYXNrcyB0aGUgc3BlY2lmaWVkIFRvbWNhdCA1IGluc3RhbGxhdGlvbiB0byBsaXN0IHRoZQorICBjdXJyZW50bHkgcnVubmluZyB3ZWIgYXBwbGljYXRpb25zLCBlaXRoZXIgbG9hZGVkIGF0IHN0YXJ0dXAgdGltZSBvcgorICBpbnN0YWxsZWQgZHluYW1pY2FsbHkuICBJdCBpcyB1c2VmdWwgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IHRoZQorICBhcHBsaWNhdGlvbiB5b3UgYXJlIGN1cnJlbnRseSBkZXZlbG9waW5nIGhhcyBiZWVuIGluc3RhbGxlZC4KKworLS0+CisKKyAgPHRhcmdldCBuYW1lPSJsaXN0IgorICAgZGVzY3JpcHRpb249Ikxpc3QgaW5zdGFsbGVkIGFwcGxpY2F0aW9ucyBvbiBzZXJ2bGV0IGNvbnRhaW5lciI+CisKKyAgICA8bGlzdCAgICB1cmw9IiR7bWFuYWdlci51cmx9IgorICAgICAgICB1c2VybmFtZT0iJHttYW5hZ2VyLnVzZXJuYW1lfSIKKyAgICAgICAgcGFzc3dvcmQ9IiR7bWFuYWdlci5wYXNzd29yZH0iLz4KKworICA8L3RhcmdldD4KKworCis8IS0tID09PT09PT09PT09PT09PT09PT09IFByZXBhcmUgVGFyZ2V0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKzwhLS0KKworICBUaGUgInByZXBhcmUiIHRhcmdldCBpcyB1c2VkIHRvIGNyZWF0ZSB0aGUgImJ1aWxkIiBkZXN0aW5hdGlvbiBkaXJlY3RvcnksCisgIGFuZCBjb3B5IHRoZSBzdGF0aWMgY29udGVudHMgb2YgeW91ciB3ZWIgYXBwbGljYXRpb24gdG8gaXQuICBJZiB5b3UgbmVlZAorICB0byBjb3B5IHN0YXRpYyBmaWxlcyBmcm9tIGV4dGVybmFsIGRlcGVuZGVuY2llcywgeW91IGNhbiBjdXN0b21pemUgdGhlCisgIGNvbnRlbnRzIG9mIHRoaXMgdGFzay4KKworICBOb3JtYWxseSwgdGhpcyB0YXNrIGlzIGV4ZWN1dGVkIGluZGlyZWN0bHkgd2hlbiBuZWVkZWQuCisKKy0tPgorCisgIDx0YXJnZXQgbmFtZT0icHJlcGFyZSI+CisKKyAgICA8IS0tIENyZWF0ZSBidWlsZCBkaXJlY3RvcmllcyBhcyBuZWVkZWQgLS0+CisgICAgPG1rZGlyICBkaXI9IiR7YnVpbGQuaG9tZX0iLz4KKyAgICA8bWtkaXIgIGRpcj0iJHtidWlsZC5ob21lfS9XRUItSU5GIi8+CisgICAgPG1rZGlyICBkaXI9IiR7YnVpbGQuaG9tZX0vV0VCLUlORi9jbGFzc2VzIi8+CisKKworICAgIDwhLS0gQ29weSBzdGF0aWMgY29udGVudCBvZiB0aGlzIHdlYiBhcHBsaWNhdGlvbiAtLT4KKyAgICA8Y29weSB0b2Rpcj0iJHtidWlsZC5ob21lfSI+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7d2ViLmhvbWV9Ii8+CisgICAgPC9jb3B5PgorCisgICAgPCEtLSBDb3B5IGV4dGVybmFsIGRlcGVuZGVuY2llcyBhcyByZXF1aXJlZCAtLT4KKyAgICA8IS0tICoqKiBDVVNUT01JWkUgSEVSRSBBUyBSRVFVSVJFRCBCWSBZT1VSIEFQUExJQ0FUSU9OICoqKiAtLT4KKyAgICA8bWtkaXIgIGRpcj0iJHtidWlsZC5ob21lfS9XRUItSU5GL2xpYiIvPgorPCEtLQorICAgIDxjb3B5IHRvZGlyPSIke2J1aWxkLmhvbWV9L1dFQi1JTkYvbGliIiBmaWxlPSIke2Zvby5qYXJ9Ii8+CistLT4KKworICAgIDwhLS0gQ29weSBzdGF0aWMgZmlsZXMgZnJvbSBleHRlcm5hbCBkZXBlbmRlbmNpZXMgYXMgbmVlZGVkIC0tPgorICAgIDwhLS0gKioqIENVU1RPTUlaRSBIRVJFIEFTIFJFUVVJUkVEIEJZIFlPVVIgQVBQTElDQVRJT04gKioqIC0tPgorCisgIDwvdGFyZ2V0PgorCisKKzwhLS0gPT09PT09PT09PT09PT09PT09PT0gUmVsb2FkIFRhcmdldCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworPCEtLQorCisgIFRoZSAicmVsb2FkIiBzaWduYWxzIHRoZSBzcGVjaWZpZWQgYXBwbGljYXRpb24gVG9tY2F0IDUgdG8gc2h1dCBpdHNlbGYgZG93bgorICBhbmQgcmVsb2FkLiBUaGlzIGNhbiBiZSB1c2VmdWwgd2hlbiB0aGUgd2ViIGFwcGxpY2F0aW9uIGNvbnRleHQgaXMgbm90CisgIHJlbG9hZGFibGUgYW5kIHlvdSBoYXZlIHVwZGF0ZWQgY2xhc3NlcyBvciBwcm9wZXJ0eSBmaWxlcyBpbiB0aGUKKyAgL1dFQi1JTkYvY2xhc3NlcyBkaXJlY3Rvcnkgb3Igd2hlbiB5b3UgaGF2ZSBhZGRlZCBvciB1cGRhdGVkIGphciBmaWxlcyBpbiB0aGUKKyAgL1dFQi1JTkYvbGliIGRpcmVjdG9yeS4KKworICBOT1RFOiBUaGUgL1dFQi1JTkYvd2ViLnhtbCB3ZWIgYXBwbGljYXRpb24gY29uZmlndXJhdGlvbiBmaWxlIGlzIG5vdCByZXJlYWQKKyAgb24gYSByZWxvYWQuIElmIHlvdSBoYXZlIG1hZGUgY2hhbmdlcyB0byB5b3VyIHdlYi54bWwgZmlsZSB5b3UgbXVzdCBzdG9wCisgIHRoZW4gc3RhcnQgdGhlIHdlYiBhcHBsaWNhdGlvbi4gCisKKy0tPgorCisgIDx0YXJnZXQgbmFtZT0icmVsb2FkIiBkZXBlbmRzPSJjb21waWxlIgorICAgZGVzY3JpcHRpb249IlJlbG9hZCBhcHBsaWNhdGlvbiBvbiBzZXJ2bGV0IGNvbnRhaW5lciI+CisKKyAgICA8cmVsb2FkIHVybD0iJHttYW5hZ2VyLnVybH0iCisgICAgICAgdXNlcm5hbWU9IiR7bWFuYWdlci51c2VybmFtZX0iCisgICAgICAgcGFzc3dvcmQ9IiR7bWFuYWdlci5wYXNzd29yZH0iCisgICAgICAgICAgIHBhdGg9IiR7YXBwLnBhdGh9Ii8+CisKKyAgPC90YXJnZXQ+CisKKworPCEtLSA9PT09PT09PT09PT09PT09PT09PSBSZW1vdmUgVGFyZ2V0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCis8IS0tCisKKyAgVGhlICJyZW1vdmUiIHRhcmdldCB0ZWxscyB0aGUgc3BlY2lmaWVkIFRvbWNhdCA1IGluc3RhbGxhdGlvbiB0byBkeW5hbWljYWxseQorICByZW1vdmUgdGhpcyB3ZWIgYXBwbGljYXRpb24gZnJvbSBzZXJ2aWNlLgorCisgIE5PVEU6ICBUaGlzIGlzIHRoZSBsb2dpY2FsIG9wcG9zaXRlIG9mIHRoZSAiaW5zdGFsbCIgdGFyZ2V0LgorCistLT4KKworICA8dGFyZ2V0IG5hbWU9InJlbW92ZSIKKyAgIGRlc2NyaXB0aW9uPSJSZW1vdmUgYXBwbGljYXRpb24gb24gc2VydmxldCBjb250YWluZXIiPgorCisgICAgPHVuZGVwbG95IHVybD0iJHttYW5hZ2VyLnVybH0iCisgICAgICAgICB1c2VybmFtZT0iJHttYW5hZ2VyLnVzZXJuYW1lfSIKKyAgICAgICAgIHBhc3N3b3JkPSIke21hbmFnZXIucGFzc3dvcmR9IgorICAgICAgICAgICAgIHBhdGg9IiR7YXBwLnBhdGh9Ii8+CisKKyAgPC90YXJnZXQ+CisKKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9hcHBkZXYvZGVwbG95bWVudC54bWwgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2FwcGRldi9kZXBsb3ltZW50LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODAyNDEzCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9hcHBkZXYvZGVwbG95bWVudC54bWwKQEAgLTAsMCArMSwyNTQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCFET0NUWVBFIGRvY3VtZW50IFsKKyAgPCFFTlRJVFkgcHJvamVjdCBTWVNURU0gInByb2plY3QueG1sIj4KK10+Cis8ZG9jdW1lbnQgdXJsPSJkZXBsb3ltZW50Lmh0bWwiPgorCisgICZwcm9qZWN0OworCisgIDxwcm9wZXJ0aWVzPgorICAgIDxhdXRob3IgZW1haWw9ImNyYWlnbWNjQGFwYWNoZS5vcmciPkNyYWlnIFIuIE1jQ2xhbmFoYW48L2F1dGhvcj4KKyAgICA8dGl0bGU+RGVwbG95bWVudDwvdGl0bGU+CisgIDwvcHJvcGVydGllcz4KKworPGJvZHk+CisKKworPHNlY3Rpb24gbmFtZT0iQmFja2dyb3VuZCI+CisKKzxwPkJlZm9yZSBkZXNjcmliaW5nIGhvdyB0byBvcmdhbml6ZSB5b3VyIHNvdXJjZSBjb2RlIGRpcmVjdG9yaWVzLAoraXQgaXMgdXNlZnVsIHRvIGV4YW1pbmUgdGhlIHJ1bnRpbWUgb3JnYW5pemF0aW9uIG9mIGEgd2ViIGFwcGxpY2F0aW9uLgorUHJpb3IgdG8gdGhlIFNlcnZsZXQgQVBJIFNwZWNpZmljYXRpb24sIHZlcnNpb24gMi4yLCB0aGVyZSB3YXMgbGl0dGxlCitjb25zaXN0ZW5jeSBiZXR3ZWVuIHNlcnZlciBwbGF0Zm9ybXMuICBIb3dldmVyLCBzZXJ2ZXJzIHRoYXQgY29uZm9ybQordG8gdGhlIDIuMiAob3IgbGF0ZXIpIHNwZWNpZmljYXRpb24gYXJlIHJlcXVpcmVkIHRvIGFjY2VwdCBhCis8ZW0+V2ViIEFwcGxpY2F0aW9uIEFyY2hpdmU8L2VtPiBpbiBhIHN0YW5kYXJkIGZvcm1hdCwgd2hpY2ggaXMgZGlzY3Vzc2VkCitmdXJ0aGVyIGJlbG93LjwvcD4KKworPHA+QSB3ZWIgYXBwbGljYXRpb24gaXMgZGVmaW5lZCBhcyBhIGhpZXJhcmNoeSBvZiBkaXJlY3RvcmllcyBhbmQgZmlsZXMKK2luIGEgc3RhbmRhcmQgbGF5b3V0LiAgU3VjaCBhIGhpZXJhcmNoeSBjYW4gYmUgYWNjZXNzZWQgaW4gaXRzICJ1bnBhY2tlZCIKK2Zvcm0sIHdoZXJlIGVhY2ggZGlyZWN0b3J5IGFuZCBmaWxlIGV4aXN0cyBpbiB0aGUgZmlsZXN5c3RlbSBzZXBhcmF0ZWx5LAorb3IgaW4gYSAicGFja2VkIiBmb3JtIGtub3duIGFzIGEgV2ViIEFSY2hpdmUsIG9yIFdBUiBmaWxlLiAgVGhlIGZvcm1lciBmb3JtYXQKK2lzIG1vcmUgdXNlZnVsIGR1cmluZyBkZXZlbG9wbWVudCwgd2hpbGUgdGhlIGxhdHRlciBpcyB1c2VkIHdoZW4geW91CitkaXN0cmlidXRlIHlvdXIgYXBwbGljYXRpb24gdG8gYmUgaW5zdGFsbGVkLjwvcD4KKworPHA+VGhlIHRvcC1sZXZlbCBkaXJlY3Rvcnkgb2YgeW91ciB3ZWIgYXBwbGljYXRpb24gaGllcmFyY2h5IGlzIGFsc28gdGhlCis8ZW0+ZG9jdW1lbnQgcm9vdDwvZW0+IG9mIHlvdXIgYXBwbGljYXRpb24uICBIZXJlLCB5b3Ugd2lsbCBwbGFjZSB0aGUgSFRNTAorZmlsZXMgYW5kIEpTUCBwYWdlcyB0aGF0IGNvbXByaXNlIHlvdXIgYXBwbGljYXRpb24ncyB1c2VyIGludGVyZmFjZS4gIFdoZW4gdGhlCitzeXN0ZW0gYWRtaW5pc3RyYXRvciBkZXBsb3lzIHlvdXIgYXBwbGljYXRpb24gaW50byBhIHBhcnRpY3VsYXIgc2VydmVyLCBoZQorb3Igc2hlIGFzc2lnbnMgYSA8ZW0+Y29udGV4dCBwYXRoPC9lbT4gdG8geW91ciBhcHBsaWNhdGlvbiAoYSBsYXRlciBzZWN0aW9uCitvZiB0aGlzIG1hbnVhbCBkZXNjcmliZXMgZGVwbG95bWVudCBvbiBUb21jYXQpLiAgVGh1cywgaWYgdGhlCitzeXN0ZW0gYWRtaW5pc3RyYXRvciBhc3NpZ25zIHlvdXIgYXBwbGljYXRpb24gdG8gdGhlIGNvbnRleHQgcGF0aAorPGNvZGU+L2NhdGFsb2c8L2NvZGU+LCB0aGVuIGEgcmVxdWVzdCBVUkkgcmVmZXJyaW5nIHRvCis8Y29kZT4vY2F0YWxvZy9pbmRleC5odG1sPC9jb2RlPiB3aWxsIHJldHJpZXZlIHRoZSA8Y29kZT5pbmRleC5odG1sPC9jb2RlPgorZmlsZSBmcm9tIHlvdXIgZG9jdW1lbnQgcm9vdC48L3A+CisKKzwvc2VjdGlvbj4KKworCis8c2VjdGlvbiBuYW1lPSJTdGFuZGFyZCBEaXJlY3RvcnkgTGF5b3V0Ij4KKworPHA+VG8gZmFjaWxpdGF0ZSBjcmVhdGlvbiBvZiBhIFdlYiBBcHBsaWNhdGlvbiBBcmNoaXZlIGZpbGUgaW4gdGhlIHJlcXVpcmVkCitmb3JtYXQsIGl0IGlzIGNvbnZlbmllbnQgdG8gYXJyYW5nZSB0aGUgImV4ZWN1dGFibGUiIGZpbGVzIG9mIHlvdXIgd2ViCithcHBsaWNhdGlvbiAodGhhdCBpcywgdGhlIGZpbGVzIHRoYXQgVG9tY2F0IGFjdHVhbGx5IHVzZXMgd2hlbiBleGVjdXRpbmcKK3lvdXIgYXBwKSBpbiB0aGUgc2FtZSBvcmdhbml6YXRpb24gYXMgcmVxdWlyZWQgYnkgdGhlIFdBUiBmb3JtYXQgaXRzZWxmLgorVG8gZG8gdGhpcywgeW91IHdpbGwgZW5kIHVwIHdpdGggdGhlIGZvbGxvd2luZyBjb250ZW50cyBpbiB5b3VyCithcHBsaWNhdGlvbidzICJkb2N1bWVudCByb290IiBkaXJlY3Rvcnk6PC9wPgorPHVsPgorPGxpPjxzdHJvbmc+Ki5odG1sLCAqLmpzcCwgZXRjLjwvc3Ryb25nPiAtIFRoZSBIVE1MIGFuZCBKU1AgcGFnZXMsIGFsb25nCisgICAgd2l0aCBvdGhlciBmaWxlcyB0aGF0IG11c3QgYmUgdmlzaWJsZSB0byB0aGUgY2xpZW50IGJyb3dzZXIgKHN1Y2ggYXMKKyAgICBKYXZhU2NyaXB0LCBzdHlsZXNoZWV0IGZpbGVzLCBhbmQgaW1hZ2VzKSBmb3IgeW91ciBhcHBsaWNhdGlvbi4KKyAgICBJbiBsYXJnZXIgYXBwbGljYXRpb25zIHlvdSBtYXkgY2hvb3NlIHRvIGRpdmlkZSB0aGVzZSBmaWxlcyBpbnRvCisgICAgYSBzdWJkaXJlY3RvcnkgaGllcmFyY2h5LCBidXQgZm9yIHNtYWxsZXIgYXBwcywgaXQgaXMgZ2VuZXJhbGx5CisgICAgbXVjaCBzaW1wbGVyIHRvIG1haW50YWluIG9ubHkgYSBzaW5nbGUgZGlyZWN0b3J5IGZvciB0aGVzZSBmaWxlcy4KKyAgICA8YnIvPjxici8+PC9saT4KKzxsaT48c3Ryb25nPi9XRUItSU5GL3dlYi54bWw8L3N0cm9uZz4gLSBUaGUgPGVtPldlYiBBcHBsaWNhdGlvbiBEZXBsb3ltZW50CisgICAgRGVzY3JpcHRvcjwvZW0+IGZvciB5b3VyIGFwcGxpY2F0aW9uLiAgVGhpcyBpcyBhbiBYTUwgZmlsZSBkZXNjcmliaW5nCisgICAgdGhlIHNlcnZsZXRzIGFuZCBvdGhlciBjb21wb25lbnRzIHRoYXQgbWFrZSB1cCB5b3VyIGFwcGxpY2F0aW9uLAorICAgIGFsb25nIHdpdGggYW55IGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMgYW5kIGNvbnRhaW5lci1tYW5hZ2VkCisgICAgc2VjdXJpdHkgY29uc3RyYWludHMgdGhhdCB5b3Ugd2FudCB0aGUgc2VydmVyIHRvIGVuZm9yY2UgZm9yIHlvdS4KKyAgICBUaGlzIGZpbGUgaXMgZGlzY3Vzc2VkIGluIG1vcmUgZGV0YWlsIGluIHRoZSBmb2xsb3dpbmcgc3Vic2VjdGlvbi4KKyAgICA8YnIvPjxici8+PC9saT4KKzxsaT48c3Ryb25nPi9XRUItSU5GL2NsYXNzZXMvPC9zdHJvbmc+IC0gVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgYW55IEphdmEKKyAgICBjbGFzcyBmaWxlcyAoYW5kIGFzc29jaWF0ZWQgcmVzb3VyY2VzKSByZXF1aXJlZCBmb3IgeW91ciBhcHBsaWNhdGlvbiwKKyAgICBpbmNsdWRpbmcgYm90aCBzZXJ2bGV0IGFuZCBub24tc2VydmxldCBjbGFzc2VzLCB0aGF0IGFyZSBub3QgY29tYmluZWQKKyAgICBpbnRvIEpBUiBmaWxlcy4gIElmIHlvdXIgY2xhc3NlcyBhcmUgb3JnYW5pemVkIGludG8gSmF2YSBwYWNrYWdlcywKKyAgICB5b3UgbXVzdCByZWZsZWN0IHRoaXMgaW4gdGhlIGRpcmVjdG9yeSBoaWVyYXJjaHkgdW5kZXIKKyAgICA8Y29kZT4vV0VCLUlORi9jbGFzc2VzLzwvY29kZT4uICBGb3IgZXhhbXBsZSwgYSBKYXZhIGNsYXNzIG5hbWVkCisgICAgPGNvZGU+Y29tLm15Y29tcGFueS5teXBhY2thZ2UuTXlTZXJ2bGV0PC9jb2RlPgorICAgIHdvdWxkIG5lZWQgdG8gYmUgc3RvcmVkIGluIGEgZmlsZSBuYW1lZAorICAgIDxjb2RlPi9XRUItSU5GL2NsYXNzZXMvY29tL215Y29tcGFueS9teXBhY2thZ2UvTXlTZXJ2bGV0LmNsYXNzPC9jb2RlPi4KKyAgICA8YnIvPjxici8+PC9saT4KKzxsaT48c3Ryb25nPi9XRUItSU5GL2xpYi88L3N0cm9uZz4gLSBUaGlzIGRpcmVjdG9yeSBjb250YWlucyBKQVIgZmlsZXMgdGhhdAorICAgIGNvbnRhaW4gSmF2YSBjbGFzcyBmaWxlcyAoYW5kIGFzc29jaWF0ZWQgcmVzb3VyY2VzKSByZXF1aXJlZCBmb3IgeW91cgorICAgIGFwcGxpY2F0aW9uLCBzdWNoIGFzIHRoaXJkIHBhcnR5IGNsYXNzIGxpYnJhcmllcyBvciBKREJDIGRyaXZlcnMuPC9saT4KKzwvdWw+CisKKzxwPldoZW4geW91IGluc3RhbGwgYW4gYXBwbGljYXRpb24gaW50byBUb21jYXQgKG9yIGFueSBvdGhlcgorMi4yLzIuMy1jb21wYXRpYmxlIHNlcnZlciksIHRoZSBjbGFzc2VzIGluIHRoZSA8Y29kZT5XRUItSU5GL2NsYXNzZXMvPC9jb2RlPgorZGlyZWN0b3J5LCBhcyB3ZWxsIGFzIGFsbCBjbGFzc2VzIGluIEpBUiBmaWxlcyBmb3VuZCBpbiB0aGUKKzxjb2RlPldFQi1JTkYvbGliLzwvY29kZT4gZGlyZWN0b3J5LCBhcmUgbWFkZSB2aXNpYmxlIHRvIG90aGVyIGNsYXNzZXMKK3dpdGhpbiB5b3VyIHBhcnRpY3VsYXIgd2ViIGFwcGxpY2F0aW9uLiAgVGh1cywgaWYKK3lvdSBpbmNsdWRlIGFsbCBvZiB0aGUgcmVxdWlyZWQgbGlicmFyeSBjbGFzc2VzIGluIG9uZSBvZiB0aGVzZSBwbGFjZXMgKGJlCitzdXJlIHRvIGNoZWNrIGxpY2Vuc2VzIGZvciByZWRpc3RyaWJ1dGlvbiByaWdodHMgZm9yIGFueSB0aGlyZCBwYXJ0eSBsaWJyYXJpZXMKK3lvdSB1dGlsaXplKSwgeW91IHdpbGwgc2ltcGxpZnkgdGhlIGluc3RhbGxhdGlvbiBvZiB5b3VyIHdlYiBhcHBsaWNhdGlvbiAtLQorbm8gYWRqdXN0bWVudCB0byB0aGUgc3lzdGVtIGNsYXNzIHBhdGggKG9yIGluc3RhbGxhdGlvbiBvZiBnbG9iYWwgbGlicmFyeQorZmlsZXMgaW4geW91ciBzZXJ2ZXIpIHdpbGwgYmUgbmVjZXNzYXJ5LjwvcD4KKworPHA+TXVjaCBvZiB0aGlzIGluZm9ybWF0aW9uIHdhcyBleHRyYWN0ZWQgZnJvbSBDaGFwdGVyIDkgb2YgdGhlIFNlcnZsZXQKK0FQSSBTcGVjaWZpY2F0aW9uLCB2ZXJzaW9uIDIuMywgd2hpY2ggeW91IHNob3VsZCBjb25zdWx0IGZvciBtb3JlIGRldGFpbHMuPC9wPgorCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iU2hhcmVkIExpYnJhcnkgRmlsZXMiPgorCis8cD5MaWtlIG1vc3Qgc2VydmxldCBjb250YWluZXJzLCBUb21jYXQgNSBhbHNvIHN1cHBvcnRzIG1lY2hhbmlzbXMgdG8gaW5zdGFsbAorbGlicmFyeSBKQVIgZmlsZXMgKG9yIHVucGFja2VkIGNsYXNzZXMpIG9uY2UsIGFuZCBtYWtlIHRoZW0gdmlzaWJsZSB0byBhbGwKK2luc3RhbGxlZCB3ZWIgYXBwbGljYXRpb25zICh3aXRob3V0IGhhdmluZyB0byBiZSBpbmNsdWRlZCBpbnNpZGUgdGhlIHdlYgorYXBwbGljYXRpb24gaXRzZWxmLiAgVGhlIGRldGFpbHMgb2YgaG93IFRvbWNhdCBsb2NhdGVzIGFuZCBzaGFyZXMgc3VjaAorY2xhc3NlcyBhcmUgZGVzY3JpYmVkIGluIHRoZQorPGEgaHJlZj0iLi4vY2xhc3MtbG9hZGVyLWhvd3RvLmh0bWwiPkNsYXNzIExvYWRlciBIT1ctVE88L2E+IGRvY3VtZW50YXRpb24uCitGb3IgdGhlIHB1cnBvc2VzIG9mIG91ciBkaXNjdXNzaW9uLCB0aGVyZSBhcmUgdHdvIGxvY2F0aW9ucyB0aGF0IGFyZSBjb21tb25seQordXNlZCB3aXRoaW4gYSBUb21jYXQgNSBpbnN0YWxsYXRpb24gZm9yIHNoYXJlZCBjb2RlOjwvcD4KKzx1bD4KKzxsaT48c3Ryb25nPiRDQVRBTElOQV9IT01FL2NvbW1vbi9saWI8L3N0cm9uZz4gLSBKQVIgZmlsZXMgcGxhY2VkIGhlcmUgYXJlCisgICAgdmlzaWJsZSBib3RoIHRvIHdlYiBhcHBsaWNhdGlvbnMgYW5kIGludGVybmFsIFRvbWNhdCBjb2RlLiAgVGhpcyBpcyBhCisgICAgZ29vZCBwbGFjZSB0byBwdXQgSkRCQyBkcml2ZXJzIHRoYXQgYXJlIHJlcXVpcmVkIGZvciBib3RoIHlvdXIgYXBwbGljYXRpb24KKyAgICBhbmQgaW50ZXJuYWwgVG9tY2F0IHVzZSAoc3VjaCBhcyBmb3IgYSBKREJDUmVhbG0pLgorICAgIDxici8+PGJyLz48L2xpPgorPGxpPjxzdHJvbmc+JENBVEFMSU5BX0hPTUUvc2hhcmVkL2xpYjwvc3Ryb25nPiAtIEpBUiBmaWxlcyBwbGFjZWQgaGVyZSBhcmUKKyAgICB2aXNpYmxlIHRvIGFsbCB3ZWIgYXBwbGljYXRpb25zLCBidXQgbm90IHRvIGludGVybmFsIFRvbWNhdCBjb2RlLiAgVGhpcworICAgIGlzIHRoZSByaWdodCBwbGFjZSBmb3Igc2hhcmVkIGxpYnJhcmllcyB0aGF0IGFyZSBzcGVjaWZpYyB0byB5b3VyCisgICAgYXBwbGljYXRpb24uPGJyLz48YnIvPjwvbGk+Cis8L3VsPgorCis8cD5PdXQgb2YgdGhlIGJveCwgYSBzdGFuZGFyZCBUb21jYXQgNSBpbnN0YWxsYXRpb24gaW5jbHVkZXMgYSB2YXJpZXR5CitvZiBwcmUtaW5zdGFsbGVkIHNoYXJlZCBsaWJyYXJ5IGZpbGVzLCBpbmNsdWRpbmc6PC9wPgorPHVsPgorPGxpPlRoZSA8ZW0+U2VydmxldCAyLjQ8L2VtPiBhbmQgPGVtPkpTUCAyLjA8L2VtPiBBUElzIHRoYXQgYXJlIGZ1bmRhbWVudGFsCisgICAgdG8gd3JpdGluZyBzZXJ2bGV0cyBhbmQgSmF2YVNlcnZlciBQYWdlcy48YnIvPjxici8+PC9saT4KKzxsaT5BbiA8ZW0+WE1MIFBhcnNlcjwvZW0+IGNvbXBsaWFudCB3aXRoIHRoZSBKQVhQICh2ZXJzaW9uIDEuMikgQVBJcywgc28KKyAgICB5b3VyIGFwcGxpY2F0aW9uIGNhbiBwZXJmb3JtIERPTS1iYXNlZCBvciBTQVgtYmFzZWQgcHJvY2Vzc2luZyBvZgorICAgIFhNTCBkb2N1bWVudHMuPGJyLz48YnIvPjwvbGk+Cis8L3VsPgorCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iV2ViIEFwcGxpY2F0aW9uIERlcGxveW1lbnQgRGVzY3JpcHRvciI+CisKKyAgICA8YmxvY2txdW90ZT48ZW0+CisgICAgPHA+VGhlIGRlc2NyaXB0aW9uIGJlbG93IHVzZXMgdGhlIHZhcmlhYmxlIG5hbWUgJENBVEFMSU5BX0hPTUUKKyAgICB0byByZWZlciB0byB0aGUgZGlyZWN0b3J5IGludG8gd2hpY2ggeW91IGhhdmUgaW5zdGFsbGVkIFRvbWNhdCA1LAorICAgIGFuZCBpcyB0aGUgYmFzZSBkaXJlY3RvcnkgYWdhaW5zdCB3aGljaCBtb3N0IHJlbGF0aXZlIHBhdGhzIGFyZQorICAgIHJlc29sdmVkLiAgSG93ZXZlciwgaWYgeW91IGhhdmUgY29uZmlndXJlZCBUb21jYXQgNSBmb3IgbXVsdGlwbGUKKyAgICBpbnN0YW5jZXMgYnkgc2V0dGluZyBhIENBVEFMSU5BX0JBU0UgZGlyZWN0b3J5LCB5b3Ugc2hvdWxkIHVzZQorICAgICRDQVRBTElOQV9CQVNFIGluc3RlYWQgb2YgJENBVEFMSU5BX0hPTUUgZm9yIGVhY2ggb2YgdGhlc2UKKyAgICByZWZlcmVuY2VzLjwvcD4KKyAgICA8L2VtPjwvYmxvY2txdW90ZT4KKworPHA+QXMgbWVudGlvbmVkIGFib3ZlLCB0aGUgPGNvZGU+L1dFQi1JTkYvd2ViLnhtbDwvY29kZT4gZmlsZSBjb250YWlucyB0aGUKK1dlYiBBcHBsaWNhdGlvbiBEZXBsb3ltZW50IERlc2NyaXB0b3IgZm9yIHlvdXIgYXBwbGljYXRpb24uICBBcyB0aGUgZmlsZW5hbWUKK2V4dGVuc2lvbiBpbXBsaWVzLCB0aGlzIGZpbGUgaXMgYW4gWE1MIGRvY3VtZW50LCBhbmQgZGVmaW5lcyBldmVyeXRoaW5nIGFib3V0Cit5b3VyIGFwcGxpY2F0aW9uIHRoYXQgYSBzZXJ2ZXIgbmVlZHMgdG8ga25vdyAoZXhjZXB0IHRoZSA8ZW0+Y29udGV4dCBwYXRoPC9lbT4sCit3aGljaCBpcyBhc3NpZ25lZCBieSB0aGUgc3lzdGVtIGFkbWluaXN0cmF0b3Igd2hlbiB0aGUgYXBwbGljYXRpb24gaXMKK2RlcGxveWVkKS48L3A+CisKKzxwPlRoZSBjb21wbGV0ZSBzeW50YXggYW5kIHNlbWFudGljcyBmb3IgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBpcyBkZWZpbmVkCitpbiBDaGFwdGVyIDEzIG9mIHRoZSBTZXJ2bGV0IEFQSSBTcGVjaWZpY2F0aW9uLCB2ZXJzaW9uIDIuMy4gIE92ZXIgdGltZSwgaXQKK2lzIGV4cGVjdGVkIHRoYXQgZGV2ZWxvcG1lbnQgdG9vbHMgd2lsbCBiZSBwcm92aWRlZCB0aGF0IGNyZWF0ZSBhbmQgZWRpdCB0aGUKK2RlcGxveW1lbnQgZGVzY3JpcHRvciBmb3IgeW91LiAgSW4gdGhlIG1lYW50aW1lLCB0byBwcm92aWRlIGEgc3RhcnRpbmcgcG9pbnQsCithIDxhIGhyZWY9IndlYi54bWwudHh0IiB0YXJnZXQ9Il9uZXciPmJhc2ljIHdlYi54bWwgZmlsZTwvYT4KK2lzIHByb3ZpZGVkLiAgVGhpcyBmaWxlIGluY2x1ZGVzIGNvbW1lbnRzIHRoYXQgZGVzY3JpYmUgdGhlIHB1cnBvc2Ugb2YgZWFjaAoraW5jbHVkZWQgZWxlbWVudC48L3A+CisKKzxwPjxzdHJvbmc+Tk9URTwvc3Ryb25nPiAtIFRoZSBTZXJ2bGV0IFNwZWNpZmljYXRpb24gaW5jbHVkZXMgYSBEb2N1bWVudAorVHlwZSBEZXNjcmlwdG9yIChEVEQpIGZvciB0aGUgd2ViIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQgZGVzY3JpcHRvciwgYW5kCitUb21jYXQgNSBlbmZvcmNlcyB0aGUgcnVsZXMgZGVmaW5lZCBoZXJlIHdoZW4gcHJvY2Vzc2luZyB5b3VyIGFwcGxpY2F0aW9uJ3MKKzxjb2RlPi9XRUItSU5GL3dlYi54bWw8L2NvZGU+IGZpbGUuICBJbiBwYXJ0aWN1bGFyLCB5b3UgPHN0cm9uZz5tdXN0PC9zdHJvbmc+CitlbnRlciB5b3VyIGRlc2NyaXB0b3IgZWxlbWVudHMgKHN1Y2ggYXMgPGNvZGU+Jmx0O2ZpbHRlciZndDs8L2NvZGU+LAorPGNvZGU+Jmx0O3NlcnZsZXQmZ3Q7PC9jb2RlPiwgYW5kIDxjb2RlPiZsdDtzZXJ2bGV0LW1hcHBpbmcmZ3Q7PC9jb2RlPiBpbgordGhlIG9yZGVyIGRlZmluZWQgYnkgdGhlIERURCAoc2VlIFNlY3Rpb24gMTMuMykuPC9wPgorCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iVG9tY2F0IENvbnRleHQgRGVzY3JpcHRvciI+CisKKyAgICA8YmxvY2txdW90ZT48ZW0+CisgICAgPHA+VGhlIGRlc2NyaXB0aW9uIGJlbG93IHVzZXMgdGhlIHZhcmlhYmxlIG5hbWUgJENBVEFMSU5BX0hPTUUKKyAgICB0byByZWZlciB0byB0aGUgZGlyZWN0b3J5IGludG8gd2hpY2ggeW91IGhhdmUgaW5zdGFsbGVkIFRvbWNhdCA1LAorICAgIGFuZCBpcyB0aGUgYmFzZSBkaXJlY3RvcnkgYWdhaW5zdCB3aGljaCBtb3N0IHJlbGF0aXZlIHBhdGhzIGFyZQorICAgIHJlc29sdmVkLiAgSG93ZXZlciwgaWYgeW91IGhhdmUgY29uZmlndXJlZCBUb21jYXQgNSBmb3IgbXVsdGlwbGUKKyAgICBpbnN0YW5jZXMgYnkgc2V0dGluZyBhIENBVEFMSU5BX0JBU0UgZGlyZWN0b3J5LCB5b3Ugc2hvdWxkIHVzZQorICAgICRDQVRBTElOQV9CQVNFIGluc3RlYWQgb2YgJENBVEFMSU5BX0hPTUUgZm9yIGVhY2ggb2YgdGhlc2UKKyAgICByZWZlcmVuY2VzLjwvcD4KKyAgICA8L2VtPjwvYmxvY2txdW90ZT4KKworPHA+QSAvTUVUQS1JTkYvY29udGV4dC54bWwgZmlsZSBjYW4gYmUgdXNlZCB0byBkZWZpbmUgVG9tY2F0IHNwZWNpZmljCitjb25maWd1cmF0aW9uIG9wdGlvbnMsIHN1Y2ggYXMgbG9nZ2VycywgZGF0YSBzb3VyY2VzLCBzZXNzaW9uIG1hbmFnZXIKK2NvbmZpZ3VyYXRpb24gYW5kIG1vcmUuIFRoaXMgWE1MIGZpbGUgbXVzdCBjb250YWluIG9uZSBDb250ZXh0IGVsZW1lbnQsIHdoaWNoCit3aWxsIGJlIGNvbnNpZGVyZWQgYXMgaWYgaXQgd2FzIHRoZSBjaGlsZCBvZiB0aGUgSG9zdCBlbGVtZW50IGNvcnJlc3BvbmRpbmcKK3RvIHRoZSBIb3N0IHRvIHdoaWNoIHRoZSAgVGhlIFRvbWNhdCBjb25maWd1cmF0aW9uIGRvY3VtZW50YXRpb24gY29udGFpbnMKK2luZm9ybWF0aW9uIG9uIHRoZSBDb250ZXh0IGVsZW1lbnQuPC9wPgorCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iRGVwbG95bWVudCBXaXRoIFRvbWNhdCA1Ij4KKworPHA+SW4gb3JkZXIgdG8gYmUgZXhlY3V0ZWQsIGEgd2ViIGFwcGxpY2F0aW9uIG11c3QgYmUgZGVwbG95ZWQgb24KK2Egc2VydmxldCBjb250YWluZXIuICBUaGlzIGlzIHRydWUgZXZlbiBkdXJpbmcgZGV2ZWxvcG1lbnQuCitXZSB3aWxsIGRlc2NyaWJlIHVzaW5nIFRvbWNhdCA1IHRvIHByb3ZpZGUgdGhlIGV4ZWN1dGlvbiBlbnZpcm9ubWVudC4KK0Egd2ViIGFwcGxpY2F0aW9uIGNhbiBiZSBkZXBsb3llZCBpbiBUb21jYXQgYnkgb25lIG9mIHRoZSBmb2xsb3dpbmcKK2FwcHJvYWNoZXM6PC9wPgorPHVsPgorPGxpPjxlbT5Db3B5IHVucGFja2VkIGRpcmVjdG9yeSBoaWVyYXJjaHkgaW50byBhIHN1YmRpcmVjdG9yeSBpbiBkaXJlY3RvcnkKKyAgICA8Y29kZT4kQ0FUQUxJTkFfSE9NRS93ZWJhcHBzLzwvY29kZT48L2VtPi4gIFRvbWNhdCB3aWxsIGFzc2lnbiBhCisgICAgY29udGV4dCBwYXRoIHRvIHlvdXIgYXBwbGljYXRpb24gYmFzZWQgb24gdGhlIHN1YmRpcmVjdG9yeSBuYW1lIHlvdQorICAgIGNob29zZS4gIFdlIHdpbGwgdXNlIHRoaXMgdGVjaG5pcXVlIGluIHRoZSA8Y29kZT5idWlsZC54bWw8L2NvZGU+CisgICAgZmlsZSB0aGF0IHdlIGNvbnN0cnVjdCwgYmVjYXVzZSBpdCBpcyB0aGUgcXVpY2tlc3QgYW5kIGVhc2llc3QgYXBwcm9hY2gKKyAgICBkdXJpbmcgZGV2ZWxvcG1lbnQuICBCZSBzdXJlIHRvIHJlc3RhcnQgVG9tY2F0IGFmdGVyIGluc3RhbGxpbmcgb3IKKyAgICB1cGRhdGluZyB5b3VyIGFwcGxpY2F0aW9uLgorICAgIDxici8+PGJyLz48L2xpPgorPGxpPjxlbT5Db3B5IHRoZSB3ZWIgYXBwbGljYXRpb24gYXJjaGl2ZSBmaWxlIGludG8gZGlyZWN0b3J5CisgICAgPGNvZGU+JENBVEFMSU5BX0hPTUUvd2ViYXBwcy88L2NvZGU+PC9lbT4uICBXaGVuIFRvbWNhdCBpcyBzdGFydGVkLCBpdCB3aWxsCisgICAgYXV0b21hdGljYWxseSBleHBhbmQgdGhlIHdlYiBhcHBsaWNhdGlvbiBhcmNoaXZlIGZpbGUgaW50byBpdHMgdW5wYWNrZWQKKyAgICBmb3JtLCBhbmQgZXhlY3V0ZSB0aGUgYXBwbGljYXRpb24gdGhhdCB3YXkuICBUaGlzIGFwcHJvYWNoIHdvdWxkIHR5cGljYWxseQorICAgIGJlIHVzZWQgdG8gaW5zdGFsbCBhbiBhZGRpdGlvbmFsIGFwcGxpY2F0aW9uLCBwcm92aWRlZCBieSBhIHRoaXJkIHBhcnR5CisgICAgdmVuZG9yIG9yIGJ5IHlvdXIgaW50ZXJuYWwgZGV2ZWxvcG1lbnQgc3RhZmYsIGludG8gYW4gZXhpc3RpbmcKKyAgICBUb21jYXQgaW5zdGFsbGF0aW9uLiAgPHN0cm9uZz5OT1RFPC9zdHJvbmc+IC0gSWYgeW91IHVzZSB0aGlzIGFwcHJvYWNoLAorICAgIGFuZCB3aXNoIHRvIHVwZGF0ZSB5b3VyIGFwcGxpY2F0aW9uIGxhdGVyLCB5b3UgbXVzdCBib3RoIHJlcGxhY2UgdGhlCisgICAgd2ViIGFwcGxpY2F0aW9uIGFyY2hpdmUgZmlsZSA8c3Ryb25nPkFORDwvc3Ryb25nPiBkZWxldGUgdGhlIGV4cGFuZGVkCisgICAgZGlyZWN0b3J5IHRoYXQgVG9tY2F0IGNyZWF0ZWQsIGFuZCB0aGVuIHJlc3RhcnQgVG9tY2F0LCBpbiBvcmRlciB0byByZWZsZWN0CisgICAgeW91ciBjaGFuZ2VzLgorICAgIDxici8+PGJyLz48L2xpPgorPGxpPjxlbT5Vc2UgdGhlIFRvbWNhdCA1ICJNYW5hZ2VyIiB3ZWIgYXBwbGljYXRpb24gdG8gZGVwbG95IGFuZCB1bmRlcGxveQorICAgIHdlYiBhcHBsaWNhdGlvbnM8L2VtPi4gIFRvbWNhdCA1IGluY2x1ZGVzIGEgd2ViIGFwcGxpY2F0aW9uLCBkZXBsb3llZAorICAgIGJ5IGRlZmF1bHQgb24gY29udGV4dCBwYXRoIDxjb2RlPi9tYW5hZ2VyPC9jb2RlPiwgdGhhdCBhbGxvd3MgeW91IHRvCisgICAgZGVwbG95IGFuZCB1bmRlcGxveSBhcHBsaWNhdGlvbnMgb24gYSBydW5uaW5nIFRvbWNhdCBzZXJ2ZXIgd2l0aG91dAorICAgIHJlc3RhcnRpbmcgaXQuICBTZWUgdGhlIGFkbWluaXN0cmF0b3IgZG9jdW1lbnRhdGlvbiAoVE9ETzogaHlwZXJsaW5rKQorICAgIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHVzaW5nIHRoZSBNYW5hZ2VyIHdlYiBhcHBsaWNhdGlvbi48YnIvPjxici8+PC9saT4KKzxsaT48ZW0+VXNlICJNYW5hZ2VyIiBBbnQgVGFza3MgSW4gWW91ciBCdWlsZCBTY3JpcHQ8L2VtPi4gIFRvbWNhdCA1CisgICAgaW5jbHVkZXMgYSBzZXQgb2YgY3VzdG9tIHRhc2sgZGVmaW5pdGlvbnMgZm9yIHRoZSA8Y29kZT5BbnQ8L2NvZGU+CisgICAgYnVpbGQgdG9vbCB0aGF0IGFsbG93IHlvdSB0byBhdXRvbWF0ZSB0aGUgZXhlY3V0aW9uIG9mIGNvbW1hbmRzIHRvIHRoZQorICAgICJNYW5hZ2VyIiB3ZWIgYXBwbGljYXRpb24uICBUaGVzZSB0YXNrcyBhcmUgdXNlZCBpbiB0aGUgVG9tY2F0IGRlcGxveWVyLgorICAgIDxici8+PGJyLz48L2xpPgorPGxpPjxlbT5Vc2UgdGhlIFRvbWNhdCBEZXBsb3llcjwvZW0+LiAgVG9tY2F0IDUgaW5jbHVkZXMgYSBwYWNrYWdlZCB0b29sCisgICAgYnVuZGxpbmcgdGhlIEFudCB0YXNrcywgYW5kIGNhbiBiZSB1c2VkIHRvIGF1dG9tYXRpY2FsbHkgcHJlY29tcGlsZSBKU1BzCisgICAgd2hpY2ggYXJlIHBhcnQgb2YgdGhlIHdlYiBhcHBsaWNhdGlvbiBiZWZvcmUgZGVwbG95bWVudCB0byB0aGUgc2VydmVyLgorICAgIDxici8+PGJyLz48L2xpPgorPC91bD4KKworPHA+RGVwbG95aW5nIHlvdXIgYXBwIG9uIG90aGVyIHNlcnZsZXQgY29udGFpbmVycyB3aWxsIGJlIHNwZWNpZmljIHRvIGVhY2gKK2NvbnRhaW5lciwgYnV0IGFsbCBjb250YWluZXJzIGNvbXBhdGlibGUgd2l0aCB0aGUgU2VydmxldCBBUEkgU3BlY2lmaWNhdGlvbgorKHZlcnNpb24gMi4yIG9yIGxhdGVyKSBhcmUgcmVxdWlyZWQgdG8gYWNjZXB0IGEgd2ViIGFwcGxpY2F0aW9uIGFyY2hpdmUgZmlsZS4KK05vdGUgdGhhdCBvdGhlciBjb250YWluZXJzIGFyZSA8c3Ryb25nPk5PVDwvc3Ryb25nPiByZXF1aXJlZCB0byBhY2NlcHQgYW4KK3VucGFja2VkIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgKGFzIFRvbWNhdCBkb2VzKSwgb3IgdG8gcHJvdmlkZSBtZWNoYW5pc21zIGZvcgorc2hhcmVkIGxpYnJhcnkgZmlsZXMsIGJ1dCB0aGVzZSBmZWF0dXJlcyBhcmUgY29tbW9ubHkgYXZhaWxhYmxlLjwvcD4KKworPC9zZWN0aW9uPgorCisKKzwvYm9keT4KKzwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9kb2NzL2FwcGRldi9pbmRleC54bWwgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2FwcGRldi9pbmRleC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU5YzVlZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvYXBwZGV2L2luZGV4LnhtbApAQCAtMCwwICsxLDYzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhRE9DVFlQRSBkb2N1bWVudCBbCisgIDwhRU5USVRZIHByb2plY3QgU1lTVEVNICJwcm9qZWN0LnhtbCI+CitdPgorPGRvY3VtZW50IHVybD0iaW5kZXguaHRtbCI+CisKKyAgJnByb2plY3Q7CisKKyAgPHByb3BlcnRpZXM+CisgICAgPGF1dGhvciBlbWFpbD0iY3JhaWdtY2NAYXBhY2hlLm9yZyI+Q3JhaWcgUi4gTWNDbGFuYWhhbjwvYXV0aG9yPgorICAgIDx0aXRsZT5UYWJsZSBvZiBDb250ZW50czwvdGl0bGU+CisgIDwvcHJvcGVydGllcz4KKworPGJvZHk+CisKKworPHNlY3Rpb24gbmFtZT0iUHJlZmFjZSI+CisKKzxwPlRoaXMgbWFudWFsIGluY2x1ZGVzIGNvbnRyaWJ1dGlvbnMgZnJvbSBtYW55IG1lbWJlcnMgb2YgdGhlIFRvbWNhdCBQcm9qZWN0CitkZXZlbG9wZXIgY29tbXVuaXR5LiAgVGhlIGZvbGxvd2luZyBhdXRob3JzIGhhdmUgcHJvdmlkZWQgc2lnbmlmaWNhbnQgY29udGVudDoKKzwvcD4KKzx1bD4KKzxsaT5DcmFpZyBSLiBNY0NsYW5haGFuCisgICAgKDxhIGhyZWY9Im1haWx0bzpjcmFpZ21jY0BhcGFjaGUub3JnIj5jcmFpZ21jY0BhcGFjaGUub3JnPC9hPik8L2xpPgorPC91bD4KKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IlRhYmxlIG9mIENvbnRlbnRzIj4KKworPHA+VGhlIGluZm9ybWF0aW9uIHByZXNlbnRlZCBpcyBkaXZpZGVkIGludG8gdGhlIGZvbGxvd2luZyBzZWN0aW9uczo8L3A+Cis8dWw+Cis8bGk+PGEgaHJlZj0iaW50cm9kdWN0aW9uLmh0bWwiPjxzdHJvbmc+SW50cm9kdWN0aW9uPC9zdHJvbmc+PC9hPiAtCisgICAgQnJpZWZseSBkZXNjcmliZXMgdGhlIGluZm9ybWF0aW9uIGNvdmVyZWQgaGVyZSwgd2l0aAorICAgIGxpbmtzIGFuZCByZWZlcmVuY2VzIHRvIG90aGVyIHNvdXJjZXMgb2YgaW5mb3JtYXRpb24uPC9saT4KKzxsaT48YSBocmVmPSJpbnN0YWxsYXRpb24uaHRtbCI+PHN0cm9uZz5JbnN0YWxsYXRpb248L3N0cm9uZz48L2E+IC0KKyAgICBDb3ZlcnMgYWNxdWlyaW5nIGFuZCBpbnN0YWxsaW5nIHRoZSByZXF1aXJlZCBzb2Z0d2FyZQorICAgIGNvbXBvbmVudHMgdG8gdXNlIFRvbWNhdCBmb3Igd2ViIGFwcGxpY2F0aW9uIGRldmVsb3BtZW50LjwvbGk+Cis8bGk+PGEgaHJlZj0iZGVwbG95bWVudC5odG1sIj48c3Ryb25nPkRlcGxveW1lbnQgT3JnYW5pemF0aW9uPC9zdHJvbmc+PC9hPiAtCisgICAgRGlzY3Vzc2VzIHRoZSBzdGFuZGFyZCBkaXJlY3RvcnkgbGF5b3V0IGZvciBhIHdlYiBhcHBsaWNhdGlvbgorICAgIChkZWZpbmVkIGluIHRoZSBTZXJ2bGV0IEFQSSBTcGVjaWZpY2F0aW9uKSwgdGhlIFdlYiBBcHBsaWNhdGlvbgorICAgIERlcGxveW1lbnQgRGVzY3JpcHRvciwgYW5kIG9wdGlvbnMgZm9yIGludGVncmF0aW9uIHdpdGggVG9tY2F0CisgICAgaW4geW91ciBkZXZlbG9wbWVudCBlbnZpcm9ubWVudC48L2xpPgorPGxpPjxhIGhyZWY9InNvdXJjZS5odG1sIj48c3Ryb25nPlNvdXJjZSBPcmdhbml6YXRpb248L3N0cm9uZz48L2E+IC0KKyAgICBEZXNjcmliZXMgYSB1c2VmdWwgYXBwcm9hY2ggdG8gb3JnYW5pemluZyB0aGUgc291cmNlIGNvZGUKKyAgICBkaXJlY3RvcmllcyBmb3IgeW91ciBwcm9qZWN0LCBhbmQgaW50cm9kdWNlcyB0aGUKKyAgICA8Y29kZT5idWlsZC54bWw8L2NvZGU+IHVzZWQgYnkgQW50IHRvIG1hbmFnZSBjb21waWxhdGlvbi48L2xpPgorPGxpPjxhIGhyZWY9InByb2Nlc3Nlcy5odG1sIj48c3Ryb25nPkRldmVsb3BtZW50IFByb2Nlc3Nlczwvc3Ryb25nPjwvYT4gLQorICAgIFByb3ZpZGVzIGJyaWVmIGRlc2NyaXB0aW9ucyBvZiB0eXBpY2FsIGRldmVsb3BtZW50IHByb2Nlc3NlcworICAgIHV0aWxpemluZyB0aGUgcmVjb21tZW5kZWQgZGVwbG95bWVudCBhbmQgc291cmNlIG9yZ2FuaXphdGlvbnMuPC9saT4KKzxsaT48YSBocmVmPSJzYW1wbGUvIiB0YXJnZXQ9Il9uZXciPjxzdHJvbmc+RXhhbXBsZSBBcHBsaWNhdGlvbjwvc3Ryb25nPjwvYT4gLQorICAgIFRoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIGEgdmVyeSBzaW1wbGUsIGJ1dCBmdW5jdGlvbmFsbHkgY29tcGxldGUsCisgICAgIkhlbGxvLCBXb3JsZCIgYXBwbGljYXRpb24gYnVpbHQgYWNjb3JkaW5nIHRvIHRoZSBwcmluY2lwbGVzCisgICAgZGVzY3JpYmVkIGluIHRoaXMgbWFudWFsLiAgWW91IGNhbiB1c2UgdGhpcyBhcHBsaWNhdGlvbiB0bworICAgIHByYWN0aWNlIHVzaW5nIHRoZSBkZXNjcmliZWQgdGVjaG5pcXVlcy48L2xpPgorPC91bD4KKworPC9zZWN0aW9uPgorCisKKzwvYm9keT4KKzwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9kb2NzL2FwcGRldi9pbnN0YWxsYXRpb24ueG1sIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9hcHBkZXYvaW5zdGFsbGF0aW9uLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGEzMGNkCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9hcHBkZXYvaW5zdGFsbGF0aW9uLnhtbApAQCAtMCwwICsxLDkxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhRE9DVFlQRSBkb2N1bWVudCBbCisgIDwhRU5USVRZIHByb2plY3QgU1lTVEVNICJwcm9qZWN0LnhtbCI+CitdPgorPGRvY3VtZW50IHVybD0iaW5zdGFsbGF0aW9uLmh0bWwiPgorCisgICZwcm9qZWN0OworCisgIDxwcm9wZXJ0aWVzPgorICAgIDxhdXRob3IgZW1haWw9ImNyYWlnbWNjQGFwYWNoZS5vcmciPkNyYWlnIFIuIE1jQ2xhbmFoYW48L2F1dGhvcj4KKyAgICA8YXV0aG9yIGVtYWlsPSJ5b2F2c0BhcGFjaGUub3JnIj5Zb2F2IFNoYXBpcmE8L2F1dGhvcj4KKyAgICA8dGl0bGU+SW5zdGFsbGF0aW9uPC90aXRsZT4KKyAgPC9wcm9wZXJ0aWVzPgorCis8Ym9keT4KKworCis8c2VjdGlvbiBuYW1lPSJJbnN0YWxsYXRpb24iPgorCis8cD5JbiBvcmRlciB0byB1c2UgVG9tY2F0IDUgZm9yIGRldmVsb3Bpbmcgd2ViIGFwcGxpY2F0aW9ucywgeW91IG11c3QgZmlyc3QKK2luc3RhbGwgaXQgKGFuZCB0aGUgc29mdHdhcmUgaXQgZGVwZW5kcyBvbikuICBUaGUgcmVxdWlyZWQgc3RlcHMgYXJlIG91dGxpbmVkCitpbiB0aGUgZm9sbG93aW5nIHN1YnNlY3Rpb25zLjwvcD4KKworPHN1YnNlY3Rpb24gbmFtZT0iSkRLIj4KKworPHA+VG9tY2F0IHdpbGwgb3BlcmF0ZSB1bmRlciBhbnkgPHN0cm9uZz5KYXZhIERldmVsb3BtZW50IEtpdDwvc3Ryb25nPiAoSkRLKQorZW52aXJvbm1lbnQgdGhhdCBwcm92aWRlcyBhIEpESyAxLjIgKGFsc28ga25vd24gYXMgSmF2YTIgU3RhbmRhcmQgRWRpdGlvbiwgb3IKK0oyU0UpIG9yIGxhdGVyIHBsYXRmb3JtLiAgWW91IHdpbGwgbmVlZCBhIEphdmEgRGV2ZWxvcG1lbnQgS2l0LCBhcyBvcHBvc2VkIHRvIGEKK0phdmEgUnVudGltZSBFbnZpcm9ubWVudCwgc28gdGhhdCB5b3VyIHNlcnZsZXRzLCBvdGhlciBjbGFzc2VzLCBhbmQgSlNQIHBhZ2VzCitjYW4gYmUgY29tcGlsZWQuICBUb21jYXQgNSBoYXMgYmVlbiBleHRlbnNpdmVseSB0ZXN0ZWQgd2l0aCBKREsgMS4zLjEsIHdoaWNoCitpcyByZWNvbW1lbmRlZC48L3A+CisKKzxwPkNvbXBhdGlibGUgSkRLcyBmb3IgbWFueSBwbGF0Zm9ybXMgKG9yIGxpbmtzIHRvIHdoZXJlIHRoZXkgY2FuIGJlIGZvdW5kKQorYXJlIGF2YWlsYWJsZSBhdAorPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLyI+aHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzwvYT4uPC9wPgorCis8L3N1YnNlY3Rpb24+CisKKzxzdWJzZWN0aW9uIG5hbWU9IlRvbWNhdCI+CisKKzxwPkJpbmFyeSBkb3dubG9hZHMgb2YgdGhlIDxzdHJvbmc+VG9tY2F0PC9zdHJvbmc+IHNlcnZlciBhcmUgYXZhaWxhYmxlIGZyb20KKzxhIGhyZWY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvYmluaW5kZXguY2dpIj5odHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2JpbmluZGV4LmNnaTwvYT4uCitUaGlzIG1hbnVhbCBhc3N1bWVzIHlvdSBhcmUgdXNpbmcgdGhlIG1vc3QgcmVjZW50IHJlbGVhc2UKK29mIFRvbWNhdCA1LiAgRGV0YWlsZWQgaW5zdHJ1Y3Rpb25zIGZvciBkb3dubG9hZGluZyBhbmQgaW5zdGFsbGluZworVG9tY2F0IDUgYXJlIGF2YWlsYWJsZSA8YSBocmVmPSIuLi9zZXR1cC5odG1sIj5oZXJlPC9hPi48L3A+CisKKzxwPkluIHRoZSByZW1haW5kZXIgb2YgdGhpcyBtYW51YWwsIGV4YW1wbGUgc2hlbGwgc2NyaXB0cyBhc3N1bWUgdGhhdCB5b3UgaGF2ZQorc2V0IGFuIGVudmlyb25tZW50IHZhcmlhYmxlIDxjb2RlPkNBVEFMSU5BX0hPTUU8L2NvZGU+IHRoYXQgY29udGFpbnMgdGhlCitwYXRobmFtZSB0byB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIFRvbWNhdCA1IGhhcyBiZWVuIGluc3RhbGxlZC48L3A+CisKKzwvc3Vic2VjdGlvbj4KKworCis8c3Vic2VjdGlvbiBuYW1lPSJBbnQiPgorCis8cD5CaW5hcnkgZG93bmxvYWRzIG9mIHRoZSA8c3Ryb25nPkFudDwvc3Ryb25nPiBidWlsZCB0b29sIGFyZSBhdmFpbGFibGUgZnJvbQorPGEgaHJlZj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9kb3dubG9hZHMvYmluaW5kZXguaHRtbCI+aHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9kb3dubG9hZHMvYmluaW5kZXguaHRtbDwvYT4uCitUaGlzIG1hbnVhbCBhc3N1bWVzIHlvdSBhcmUgdXNpbmcgQW50IDEuNCBvciBsYXRlci4gIFRoZSBpbnN0cnVjdGlvbnMgc2hvdWxkCithbHNvIGJlIGNvbXBhdGlibGUgd2l0aCBsYXRlciB2ZXJzaW9ucywgYnV0IHRoaXMgaGFzIG5vdCBiZWVuIHRlc3RlZC48L3A+CisKKzxwPkRvd25sb2FkIGFuZCBpbnN0YWxsIEFudCBmcm9tIHRoZSBkaXN0cmlidXRpb24gZGlyZWN0b3J5IG1lbnRpb25lZCBhYm92ZS4KK1RoZW4sIGFkZCB0aGUgPGNvZGU+YmluPC9jb2RlPiBkaXJlY3Rvcnkgb2YgdGhlIEFudCBkaXN0cmlidXRpb24gdG8geW91cgorPGNvZGU+UEFUSDwvY29kZT4gZW52aXJvbm1lbnQgdmFyaWFibGUsIGZvbGxvd2luZyB0aGUgc3RhbmRhcmQgcHJhY3RpY2VzIGZvcgoreW91ciBvcGVyYXRpbmcgc3lzdGVtIHBsYXRmb3JtLiAgT25jZSB5b3UgaGF2ZSBkb25lIHRoaXMsIHlvdSB3aWxsIGJlIGFibGUgdG8KK2V4ZWN1dGUgdGhlIDxjb2RlPmFudDwvY29kZT4gc2hlbGwgY29tbWFuZCBkaXJlY3RseS48L3A+CisKKzwvc3Vic2VjdGlvbj4KKworCis8c3Vic2VjdGlvbiBuYW1lPSJDVlMiPgorCis8cD5CZXNpZGVzIHRoZSByZXF1aXJlZCB0b29scyBkZXNjcmliZWQgYWJvdmUsIHlvdSBhcmUgc3Ryb25nbHkgZW5jb3VyYWdlZAordG8gZG93bmxvYWQgYW5kIGluc3RhbGwgYSA8ZW0+c291cmNlIGNvZGUgY29udHJvbDwvZW0+IHN5c3RlbSwgc3VjaCBhcyB0aGUKKzxzdHJvbmc+Q29uY3VycmVudCBWZXJzaW9uIFN5c3RlbTwvc3Ryb25nPiAoQ1ZTKSwgdG8gbWFpbnRhaW4gaGlzdG9yaWNhbAordmVyc2lvbnMgb2YgdGhlIHNvdXJjZSBmaWxlcyB0aGF0IG1ha2UgdXAgeW91ciB3ZWIgYXBwbGljYXRpb24uICBCZXNpZGVzCit0aGUgc2VydmVyLCB5b3Ugd2lsbCBhbHNvIG5lZWQgYXBwcm9wcmlhdGUgY2xpZW50Cit0b29scyB0byBjaGVjayBvdXQgc291cmNlIGNvZGUgZmlsZXMsIGFuZCBjaGVjayBpbiBtb2RpZmllZCB2ZXJzaW9ucy48L3A+CisKKzxwPkRldGFpbGVkIGluc3RydWN0aW9ucyBmb3IgaW5zdGFsbGluZyBhbmQgdXNpbmcgc291cmNlIGNvZGUgY29udHJvbAorYXBwbGljYXRpb25zIGlzIGJleW9uZCB0aGUgc2NvcGUgb2YgdGhpcyBtYW51YWwuICBIb3dldmVyLCBDVlMgc2VydmVyIGFuZAorY2xpZW50IHRvb2xzIGZvciBtYW55IHBsYXRmb3JtcyAoYWxvbmcgd2l0aCBkb2N1bWVudGF0aW9uKSBjYW4gYmUgZG93bmxvYWRlZAorZnJvbSA8YSBocmVmPSJodHRwOi8vd3d3LmN2c2hvbWUub3JnIj5odHRwOi8vd3d3LmN2c2hvbWUub3JnPC9hPi48L3A+CisKKzwvc3Vic2VjdGlvbj4KKworCis8L3NlY3Rpb24+CisKKworPC9ib2R5PgorPC9kb2N1bWVudD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvYXBwZGV2L2ludHJvZHVjdGlvbi54bWwgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2FwcGRldi9pbnRyb2R1Y3Rpb24ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1NGQ1OTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2FwcGRldi9pbnRyb2R1Y3Rpb24ueG1sCkBAIC0wLDAgKzEsODQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCFET0NUWVBFIGRvY3VtZW50IFsKKyAgPCFFTlRJVFkgcHJvamVjdCBTWVNURU0gInByb2plY3QueG1sIj4KK10+Cis8ZG9jdW1lbnQgdXJsPSJpbnRyb2R1Y3Rpb24uaHRtbCI+CisKKyAgJnByb2plY3Q7CisKKyAgPHByb3BlcnRpZXM+CisgICAgPGF1dGhvciBlbWFpbD0iY3JhaWdtY2NAYXBhY2hlLm9yZyI+Q3JhaWcgUi4gTWNDbGFuYWhhbjwvYXV0aG9yPgorICAgIDx0aXRsZT5JbnRyb2R1Y3Rpb248L3RpdGxlPgorICA8L3Byb3BlcnRpZXM+CisKKzxib2R5PgorCisKKzxzZWN0aW9uIG5hbWU9Ik92ZXJ2aWV3Ij4KKworPHA+Q29uZ3JhdHVsYXRpb25zISAgWW91J3ZlIGRlY2lkZWQgdG8gKG9yIGJlZW4gdG9sZCB0bykgbGVhcm4gaG93IHRvCitidWlsZCB3ZWIgYXBwbGljYXRpb25zIHVzaW5nIHNlcnZsZXRzIGFuZCBKU1AgcGFnZXMsIGFuZCBwaWNrZWQgdGhlCitUb21jYXQgc2VydmVyIHRvIHVzZSBmb3IgeW91ciBsZWFybmluZyBhbmQgZGV2ZWxvcG1lbnQuICBCdXQgbm93IHdoYXQKK2RvIHlvdSBkbz88L3A+CisKKzxwPlRoaXMgbWFudWFsIGlzIGEgcHJpbWVyIGNvdmVyaW5nIHRoZSBiYXNpYyBzdGVwcyBvZiB1c2luZyBUb21jYXQgdG8KK3NldCB1cCBhIGRldmVsb3BtZW50IGVudmlyb25tZW50LCBvcmdhbml6ZSB5b3VyIHNvdXJjZSBjb2RlLCBhbmQgdGhlbgorYnVpbGQgYW5kIHRlc3QgeW91ciBhcHBsaWNhdGlvbi4gIEl0IGRvZXMgbm90IGRpc2N1c3MgYXJjaGl0ZWN0dXJlcyBvcgorcmVjb21tZW5kZWQgY29kaW5nIHByYWN0aWNlcyBmb3Igd2ViIGFwcGxpY2F0aW9uIGRldmVsb3BtZW50LAorb3IgcHJvdmlkZSBpbiBkZXB0aCBpbnN0cnVjdGlvbnMgb24gb3BlcmF0aW5nIHRoZSBkZXZlbG9wbWVudAordG9vbHMgdGhhdCBhcmUgZGlzY3Vzc2VkLiAgUmVmZXJlbmNlcyB0byBzb3VyY2VzIG9mIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK2FyZSBpbmNsdWRlZCBpbiB0aGUgZm9sbG93aW5nIHN1YnNlY3Rpb25zLjwvcD4KKworPHA+VGhlIGRpc2N1c3Npb24gaW4gdGhpcyBtYW51YWwgaXMgYWltZWQgYXQgZGV2ZWxvcGVycyB3aG8gd2lsbCBiZSB1c2luZworYSB0ZXh0IGVkaXRvciBhbG9uZyB3aXRoIGNvbW1hbmQgbGluZSB0b29scyB0byBkZXZlbG9wIGFuZCBkZWJ1ZyB0aGVpcgorYXBwbGljYXRpb25zLiAgQXMgc3VjaCwgdGhlIHJlY29tbWVuZGF0aW9ucyBhcmUgZmFpcmx5IGdlbmVyaWMgLS0gYnV0IHlvdQorc2hvdWxkIGVhc2lseSBiZSBhYmxlIHRvIGFwcGx5IHRoZW0gaW4gZWl0aGVyIGEgV2luZG93cy1iYXNlZCBvciBVbml4LWJhc2VkCitkZXZlbG9wbWVudCBlbnZpcm9ubWVudC4gIElmIHlvdSBhcmUgdXRpbGl6aW5nIGFuIEludGVyYWN0aXZlIERldmVsb3BtZW50CitFbnZpcm9ubWVudCAoSURFKSB0b29sLCB5b3Ugd2lsbCBuZWVkIHRvIGFkYXB0IHRoZSBhZHZpY2UgZ2l2ZW4gaGVyZSB0bwordGhlIGRldGFpbHMgb2YgeW91ciBwYXJ0aWN1bGFyIGVudmlyb25tZW50LjwvcD4KKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IkxpbmtzIj4KKworPHA+VGhlIGZvbGxvd2luZyBsaW5rcyBwcm92aWRlIGFjY2VzcyB0byBzZWxlY3RlZCBzb3VyY2VzIG9mIG9ubGluZQoraW5mb3JtYXRpb24sIGRvY3VtZW50YXRpb24sIGFuZCBzb2Z0d2FyZSB0aGF0IGlzIHVzZWZ1bCBpbiBkZXZlbG9waW5nCit3ZWIgYXBwbGljYXRpb25zIHdpdGggVG9tY2F0LjwvcD4KKzx1bD4KKzxsaT48YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL2pzcC9kb3dubG9hZC5odG1sIj5odHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL2pzcC9kb3dubG9hZC5odG1sPC9hPiAtCisgICAgPGk+SmF2YVNlcnZlciBQYWdlcyAoSlNQKSBTcGVjZmljYXRpb24sIFZlcnNpb24gMS4yPC9pPi4gIERlc2NyaWJlcworICAgIHRoZSBwcm9ncmFtbWluZyBlbnZpcm9ubWVudCBwcm92aWRlZCBieSBzdGFuZGFyZCBpbXBsZW1lbnRhdGlvbnMKKyAgICBvZiB0aGUgSmF2YVNlcnZlciBQYWdlcyAoSlNQKSB0ZWNobm9sb2d5LiAgSW4gY29uanVuY3Rpb24gd2l0aAorICAgIHRoZSBTZXJ2bGV0IEFQSSBTcGVjaWZpY2F0aW9uIChzZWUgYmVsb3cpLCB0aGlzIGRvY3VtZW50IGRlc2NyaWJlcworICAgIHdoYXQgYSBwb3J0YWJsZSBBUEkgcGFnZSBpcyBhbGxvd2VkIHRvIGNvbnRhaW4uICBTcGVjaWZpYworICAgIGluZm9ybWF0aW9uIG9uIHNjcmlwdGluZyAoQ2hhcHRlciA2KSwgdGFnIGV4dGVuc2lvbnMgKENoYXB0ZXIgNyksCisgICAgYW5kIHBhY2thZ2luZyBKU1AgcGFnZXMgKEFwcGVuZGl4IEEpIGlzIHVzZWZ1bC4gIFRoZSBKYXZhZG9jCisgICAgQVBJIERvY3VtZW50YXRpb24gaXMgaW5jbHVkZWQgaW4gdGhlIHNwZWNpZmljYXRpb24sIGFuZCB3aXRoIHRoZQorICAgIFRvbWNhdCBkb3dubG9hZC48YnIvPjxici8+PC9saT4KKzxsaT48YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL3NlcnZsZXQvZG93bmxvYWQuaHRtbCI+aHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9zZXJ2bGV0L2Rvd25sb2FkLmh0bWw8L2E+IC0KKyAgICA8aT5TZXJ2bGV0IEFQSSBTcGVjaWZpY2F0aW9uLCBWZXJzaW9uIDIuMzwvaT4uICBEZXNjcmliZXMgdGhlCisgICAgcHJvZ3JhbW1pbmcgZW52aXJvbm1lbnQgdGhhdCBtdXN0IGJlIHByb3ZpZGVkIGJ5IGFsbCBzZXJ2bGV0CisgICAgY29udGFpbmVycyBjb25mb3JtaW5nIHRvIHRoaXMgc3BlY2lmaWNhdGlvbi4gIEluIHBhcnRpY3VsYXIsIHlvdQorICAgIHdpbGwgbmVlZCB0aGlzIGRvY3VtZW50IHRvIHVuZGVyc3RhbmQgdGhlIHdlYiBhcHBsaWNhdGlvbgorICAgIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgYW5kIGRlcGxveW1lbnQgZmlsZSAoQ2hhcHRlciA5KSwgbWV0aG9kcyBvZgorICAgIG1hcHBpbmcgcmVxdWVzdCBVUklzIHRvIHNlcnZsZXRzIChDaGFwdGVyIDExKSwgY29udGFpbmVyIG1hbmFnZWQKKyAgICBzZWN1cml0eSAoQ2hhcHRlciAxMiksIGFuZCB0aGUgc3ludGF4IG9mIHRoZSA8Y29kZT53ZWIueG1sPC9jb2RlPgorICAgIFdlYiBBcHBsaWNhdGlvbiBEZXBsb3ltZW50IERlc2NyaXB0b3IgKENoYXB0ZXIgMTMpLiAgVGhlIEphdmFkb2MKKyAgICBBUEkgRG9jdW1lbnRhdGlvbiBpcyBpbmNsdWRlZCBpbiB0aGUgc3BlY2lmaWNhdGlvbiwgYW5kIHdpdGggdGhlCisgICAgVG9tY2F0IGRvd25sb2FkLjxici8+PGJyLz48L2xpPgorPGxpPjxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJlZS9ibHVlcHJpbnRzLyI+aHR0cDovL2phdmEuc3VuLmNvbS9qMmVlL2JsdWVwcmludHMvPC9hPiAtCisgICAgPGk+U3VuIEJsdWVQcmludHMgKHRtKSBEZXNpZ24gR3VpZGVsaW5lcyBmb3IgSjJFRTwvaT4uICBDb21wcmVoZW5zaXZlCisgICAgYWR2aWNlIGFuZCBleGFtcGxlcyBvbiBhcHBsaWNhdGlvbiBkZXNpZ24gZm9yIHRoZSBKYXZhMiBFbnRlcnByaXNlCisgICAgRWRpdGlvbiAoSjJFRSkgcGxhdGZvcm0sIHdoaWNoIGluY2x1ZGVzIHNlcnZsZXRzIGFuZCBKU1AgcGFnZXMuICBUaGUKKyAgICBjaGFwdGVycyBvbiBzZXJ2bGV0IGFuZCBKU1AgZGVzaWduIGFyZSB1c2VmdWwgZXZlbiB3aGVuIHlvdXIgYXBwbGljYXRpb24KKyAgICBkb2VzIG5vdCByZXF1aXJlIG90aGVyIEoyRUUgcGxhdGZvcm0gY29tcG9uZW50cy4KKyAgICA8YnIvPjxici8+PC9saT4KKzxsaT48Yj5UT0RPPC9iPiAtLSBBZGQgbW9yZSBlbnRyaWVzIGhlcmUhPC9saT4KKzwvdWw+CisKKzwvc2VjdGlvbj4KKworCis8L2JvZHk+Cis8L2RvY3VtZW50PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9hcHBkZXYvcHJvY2Vzc2VzLnhtbCBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvYXBwZGV2L3Byb2Nlc3Nlcy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTExNDk0ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvYXBwZGV2L3Byb2Nlc3Nlcy54bWwKQEAgLTAsMCArMSwyOTkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCFET0NUWVBFIGRvY3VtZW50IFsKKyAgPCFFTlRJVFkgcHJvamVjdCBTWVNURU0gInByb2plY3QueG1sIj4KK10+Cis8ZG9jdW1lbnQgdXJsPSJwcm9jZXNzZXMuaHRtbCI+CisKKyAgJnByb2plY3Q7CisKKyAgPHByb3BlcnRpZXM+CisgICAgPGF1dGhvciBlbWFpbD0iY3JhaWdtY2NAYXBhY2hlLm9yZyI+Q3JhaWcgUi4gTWNDbGFuYWhhbjwvYXV0aG9yPgorICAgIDx0aXRsZT5EZXZlbG9wbWVudCBQcm9jZXNzZXM8L3RpdGxlPgorICA8L3Byb3BlcnRpZXM+CisKKzxib2R5PgorCisKKzxzZWN0aW9uIG5hbWU9IkRldmVsb3BtZW50IFByb2Nlc3NlcyI+CisKKzxwPkFsdGhvdWdoIGFwcGxpY2F0aW9uIGRldmVsb3BtZW50IGNhbiB0YWtlIG1hbnkgZm9ybXMsIHRoaXMgbWFudWFsIHByb3Bvc2VzCithIGZhaXJseSBnZW5lcmljIHByb2Nlc3MgZm9yIGNyZWF0aW5nIHdlYiBhcHBsaWNhdGlvbnMgdXNpbmcgVG9tY2F0LiAgVGhlCitmb2xsb3dpbmcgc2VjdGlvbnMgaGlnaGxpZ2h0IHRoZSBjb21tYW5kcyBhbmQgdGFza3MgdGhhdCB5b3UsIGFzIHRoZSBkZXZlbG9wZXIKK29mIHRoZSBjb2RlLCB3aWxsIHBlcmZvcm0uICBUaGUgc2FtZSBiYXNpYyBhcHByb2FjaCB3b3JrcyB3aGVuIHlvdSBoYXZlCittdWx0aXBsZSBwcm9ncmFtbWVycyBpbnZvbHZlZCwgYXMgbG9uZyBhcyB5b3UgaGF2ZSBhbiBhcHByb3ByaWF0ZSBzb3VyY2UgY29kZQorY29udHJvbCBzeXN0ZW0gYW5kIGludGVybmFsIHRlYW0gcnVsZXMgYWJvdXQgd2hvIGlzIHdvcmtpbmcgb24gd2hhdCBwYXJ0cworb2YgdGhlIGFwcGxpY2F0aW9uIGF0IGFueSBnaXZlbiB0aW1lLjwvcD4KKworPHA+VGhlIHRhc2sgZGVzY3JpcHRpb25zIGJlbG93IGFzc3VtZSB0aGF0IHlvdSB3aWxsIGJlIHVzaW5nIENWUyBmb3Igc291cmNlCitjb2RlIGNvbnRyb2wsIGFuZCB0aGF0IHlvdSBoYXZlIGFscmVhZHkgY29uZmlndXJlZCBhY2Nlc3MgdG8gdGhlIGFwcHJvcHJpYXRlCitDVlMgcmVwb3NpdG9yeS4gIEluc3RydWN0aW9ucyBmb3IgZG9pbmcgdGhpcyBhcmUgYmV5b25kIHRoZSBzY29wZSBvZiB0aGlzCittYW51YWwuICBJZiB5b3UgYXJlIHVzaW5nIGEgZGlmZmVyZW50IHNvdXJjZSBjb2RlIGNvbnRyb2wgZW52aXJvbm1lbnQsIHlvdQord2lsbCBuZWVkIHRvIGZpZ3VyZSBvdXQgdGhlIGNvcnJlc3BvbmRpbmcgY29tbWFuZHMgZm9yIHlvdXIgc3lzdGVtLjwvcD4KKworCis8c3Vic2VjdGlvbiBuYW1lPSJPbmUtVGltZSBTZXR1cCBvZiBBbnQgYW5kIFRvbWNhdCBmb3IgRGV2ZWxvcG1lbnQiPgorCis8cD5JbiBvcmRlciB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGUgc3BlY2lhbCBBbnQgdGFza3MgdGhhdCBpbnRlcmFjdCB3aXRoIHRoZQorPGVtPk1hbmFnZXI8L2VtPiB3ZWIgYXBwbGljYXRpb24sIHlvdSBuZWVkIHRvIHBlcmZvcm0gdGhlIGZvbGxvd2luZyB0YXNrcworb25jZSAobm8gbWF0dGVyIGhvdyBtYW55IHdlYiBhcHBsaWNhdGlvbnMgeW91IHBsYW4gdG8gZGV2ZWxvcCkuPC9wPgorPHVsPgorPGxpPjxlbT5Db25maWd1cmUgdGhlIEFudCBjdXN0b20gdGFza3M8L2VtPi4gIFRoZSBpbXBsZW1lbnRhdGlvbiBjb2RlIGZvciB0aGUKKyAgICBBbnQgY3VzdG9tIHRhc2tzIGlzIGluIGEgSkFSIGZpbGUgbmFtZWQKKyAgICA8Y29kZT4kQ0FUQUxJTkFfSE9NRS9zZXJ2ZXIvbGliL2NhdGFsaW5hLWFudC5qYXI8L2NvZGU+LCB3aGljaCBtdXN0IGJlCisgICAgY29waWVkIGluIHRvIHRoZSA8Y29kZT5saWI8L2NvZGU+IGRpcmVjdG9yeSBvZiB5b3VyIEFudCBpbnN0YWxsYXRpb24uCisgICAgPGJyLz48YnIvPjwvbGk+Cis8bGk+PGVtPkRlZmluZSBvbmUgb3IgbW9yZSBUb21jYXQgdXNlcnM8L2VtPi4gIFRoZSA8ZW0+TWFuYWdlcjwvZW0+IHdlYgorICAgIGFwcGxpY2F0aW9uIHJ1bnMgdW5kZXIgYSBzZWN1cml0eSBjb25zdHJhaW50IHRoYXQgcmVxdWlyZXMgYSB1c2VyIHRvIGJlCisgICAgbG9nZ2VkIGluLCBhbmQgaGF2ZSB0aGUgc2VjdXJpdHkgcm9sZSA8Y29kZT5tYW5hZ2VyPC9jb2RlPiBhc3NpZ25lZCB0bworICAgIGhpbSBvciBoZXIuICBIb3cgc3VjaCB1c2VycyBhcmUgZGVmaW5lZCBkZXBlbmRzIG9uIHdoaWNoIFJlYWxtIHlvdSBoYXZlCisgICAgY29uZmlndXJlZCBpbiBUb21jYXQncyA8Y29kZT5jb25mL3NlcnZlci54bWw8L2NvZGU+IGZpbGUgLS0gc2VlIHRoZQorICAgIDxhIGhyZWY9Ii4uL3JlYWxtLWhvd3RvLmh0bWwiPlJlYWxtIENvbmZpZ3VyYXRpb24gSE9XLVRPPC9hPiBmb3IgbW9yZQorICAgIGluZm9ybWF0aW9uLiAgWW91IG1heSBkZWZpbmUgYW55IG51bWJlciBvZiB1c2VycyAod2l0aCBhbnkgdXNlcm5hbWUKKyAgICBhbmQgcGFzc3dvcmQgdGhhdCB5b3UgbGlrZSkgd2l0aCB0aGUgPGNvZGU+bWFuYWdlcjwvY29kZT4gcm9sZS4KKyAgICA8YnIvPjxici8+PC9saT4KKzwvdWw+CisKKzwvc3Vic2VjdGlvbj4KKworCis8c3Vic2VjdGlvbiBuYW1lPSJDcmVhdGUgUHJvamVjdCBTb3VyY2UgQ29kZSBEaXJlY3RvcnkiPgorCis8cD5UaGUgZmlyc3Qgc3RlcCBpcyB0byBjcmVhdGUgYSBuZXcgcHJvamVjdCBzb3VyY2UgZGlyZWN0b3J5LCBhbmQgY3VzdG9taXplCit0aGUgPGNvZGU+YnVpbGQueG1sPC9jb2RlPiBhbmQgPGNvZGU+YnVpbGQucHJvcGVydGllczwvY29kZT4gZmlsZXMgeW91IHdpbGwKK2JlIHVzaW5nLiAgVGhlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgaXMgZGVzY3JpYmVkIGluIDxhIGhyZWY9InNvdXJjZS5odG1sIj50aGUKK3ByZXZpb3VzIHNlY3Rpb248L2E+LCBvciB5b3UgY2FuIHVzZSB0aGUKKzxhIGhyZWY9InNhbXBsZS8iPnNhbXBsZSBhcHBsaWNhdGlvbjwvYT4gYXMgYSBzdGFydGluZyBwb2ludC48L3A+CisKKzxwPkNyZWF0ZSB5b3VyIHByb2plY3Qgc291cmNlIGRpcmVjdG9yeSwgYW5kIGRlZmluZSBpdCB3aXRoaW4geW91ciBDVlMKK3JlcG9zaXRvcnkuICBUaGlzIG1pZ2h0IGJlIGRvbmUgYnkgYSBzZXJpZXMgb2YgY29tbWFuZHMgbGlrZSB0aGlzLCB3aGVyZQorPGNvZGU+e3Byb2plY3R9PC9jb2RlPiBpcyB0aGUgbmFtZSB1bmRlciB3aGljaCB5b3VyIHByb2plY3Qgc2hvdWxkIGJlCitzdG9yZWQgaW4gdGhlIENWUyByZXBvc2l0b3J5LCBhbmQge3VzZXJuYW1lfSBpcyB5b3VyIGxvZ2luIHVzZXJuYW1lOjwvcD4KKzxzb3VyY2U+CitjZCB7bXkgaG9tZSBkaXJlY3Rvcnl9Citta2RpciBteWFwcAkmbHQ7LS0gQXNzdW1lZCAicHJvamVjdCBzb3VyY2UgZGlyZWN0b3J5IgorY2QgbXlhcHAKK21rZGlyIGRvY3MKK21rZGlyIHNyYworbWtkaXIgd2ViCitta2RpciB3ZWIvV0VCLUlORgorY3ZzIGltcG9ydCAtbSAiSW5pdGlhbCBQcm9qZWN0IENyZWF0aW9uIiB7cHJvamVjdH0gXAorCXt1c2VybmFtZX0gc3RhcnQKKzwvc291cmNlPgorCis8cD5Ob3csIHRvIHZlcmlmeSB0aGF0IGl0IHdhcyBjcmVhdGVkIGNvcnJlY3RseSBpbiBDVlMsIHdlIHdpbGwgcGVyZm9ybSBhCitjaGVja291dCBvZiB0aGUgbmV3IHByb2plY3Q6PC9wPgorPHNvdXJjZT4KK2NkIC4uCittdiBteWFwcCBteWFwcC5idQorY3ZzIGNoZWNrb3V0IHtwcm9qZWN0fQorPC9zb3VyY2U+CisKKzxwPk5leHQsIHlvdSB3aWxsIG5lZWQgdG8gY3JlYXRlIGFuZCBjaGVjayBpbiBhbiBpbml0aWFsIHZlcnNpb24gb2YgdGhlCis8Y29kZT5idWlsZC54bWw8L2NvZGU+IHNjcmlwdCB0byBiZSB1c2VkIGZvciBkZXZlbG9wbWVudC4gIEZvciBnZXR0aW5nCitzdGFydGVkIHF1aWNrbHkgYW5kIGVhc2lseSwgYmFzZSB5b3VyIDxjb2RlPmJ1aWxkLnhtbDwvY29kZT4gb24gdGhlCis8YSBocmVmPSJidWlsZC54bWwudHh0Ij5iYXNpYyBidWlsZC54bWwgZmlsZTwvYT4sIGluY2x1ZGVkIHdpdGggdGhpcyBtYW51YWwsCitvciBjb2RlIGl0IGZyb20gc2NyYXRjaC48L3A+Cis8c291cmNlPgorY2Qge215IGhvbWUgZGlyZWN0b3J5fQorY2QgbXlhcHAKK2VtYWNzIGJ1aWxkLnhtbAkJJmx0Oy0tIGlmIHlvdSB3YW50IGEgcmVhbCBlZGl0b3IgOi0pCitjdnMgYWRkIGJ1aWxkLnhtbAorY3ZzIGNvbW1pdAorPC9zb3VyY2U+CisKKzxwPlVudGlsIHlvdSBwZXJmb3JtIHRoZSBDVlMgY29tbWl0LCB5b3VyIGNoYW5nZXMgYXJlIGxvY2FsIHRvIHlvdXIgb3duCitkZXZlbG9wbWVudCBkaXJlY3RvcnkuICBDb21taXR0aW5nIG1ha2VzIHRob3NlIGNoYW5nZXMgdmlzaWJsZSB0byBvdGhlcgorZGV2ZWxvcGVycyBvbiB5b3VyIHRlYW0gdGhhdCBhcmUgc2hhcmluZyB0aGUgc2FtZSBDVlMgcmVwb3NpdG9yeS48L3A+CisKKzxwPlRoZSBuZXh0IHN0ZXAgaXMgdG8gY3VzdG9taXplIHRoZSBBbnQgPGVtPnByb3BlcnRpZXM8L2VtPiB0aGF0IGFyZQorbmFtZWQgaW4gdGhlIDxjb2RlPmJ1aWxkLnhtbDwvY29kZT4gc2NyaXB0LiAgVGhpcyBpcyBkb25lIGJ5IGNyZWF0aW5nIGEKK2ZpbGUgbmFtZWQgPGNvZGU+YnVpbGQucHJvcGVydGllczwvY29kZT4gaW4geW91ciBwcm9qZWN0J3MgdG9wLWxldmVsCitkaXJlY3RvcnkuICBUaGUgc3VwcG9ydGVkIHByb3BlcnRpZXMgYXJlIGxpc3RlZCBpbiB0aGUgY29tbWVudHMgaW5zaWRlCit0aGUgc2FtcGxlIDxjb2RlPmJ1aWxkLnhtbDwvY29kZT4gc2NyaXB0LiAgQXQgYSBtaW5pbXVtLCB5b3Ugd2lsbCBnZW5lcmFsbHkKK25lZWQgdG8gZGVmaW5lIHRoZSA8Y29kZT5jYXRhbGluYS5ob21lPC9jb2RlPiBwcm9wZXJ0eSBkZWZpbmluZyB3aGVyZQorVG9tY2F0IDUgaXMgaW5zdGFsbGVkLCBhbmQgdGhlIG1hbmFnZXIgYXBwbGljYXRpb24gdXNlcm5hbWUgYW5kIHBhc3N3b3JkLgorWW91IG1pZ2h0IGVuZCB1cCB3aXRoIHNvbWV0aGluZyBsaWtlIHRoaXM6PC9wPgorPHNvdXJjZT4KKyMgQ29udGV4dCBwYXRoIHRvIGluc3RhbGwgdGhpcyBhcHBsaWNhdGlvbiBvbgorYXBwLnBhdGg9L2hlbGxvCisKKyMgVG9tY2F0IDUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeQorY2F0YWxpbmEuaG9tZT0vdXNyL2xvY2FsL2pha2FydGEtdG9tY2F0LTUuMAorCisjIE1hbmFnZXIgd2ViYXBwIHVzZXJuYW1lIGFuZCBwYXNzd29yZAorbWFuYWdlci51c2VybmFtZT1teXVzZXJuYW1lCittYW5hZ2VyLnBhc3N3b3JkPW15cGFzc3dvcmQKKzwvc291cmNlPgorCis8cD5JbiBnZW5lcmFsLCB5b3Ugd2lsbCA8c3Ryb25nPm5vdDwvc3Ryb25nPiB3YW50IHRvIGNoZWNrIHRoZQorPGNvZGU+YnVpbGQucHJvcGVydGllczwvY29kZT4gZmlsZSBpbiB0byB0aGUgQ1ZTIHJlcG9zaXRvcnksIGJlY2F1c2UgaXQKK2lzIHVuaXF1ZSB0byBlYWNoIGRldmVsb3BlcidzIGVudmlyb25tZW50LjwvcD4KKworPHA+Tm93LCBjcmVhdGUgdGhlIGluaXRpYWwgdmVyc2lvbiBvZiB0aGUgd2ViIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQKK2Rlc2NyaXB0b3IuICBZb3UgY2FuIGJhc2UgPGNvZGU+d2ViLnhtbDwvY29kZT4gb24gdGhlCis8YSBocmVmPSJ3ZWIueG1sLnR4dCI+YmFzaWMgd2ViLnhtbCBmaWxlPC9hPiwgb3IgY29kZSBpdCBmcm9tIHNjcmF0Y2guPC9wPgorPHNvdXJjZT4KK2NkIHtteSBob21lIGRpcmVjdG9yeX0KK2NkIG15YXBwL3dlYi9XRUItSU5GCitlbWFjcyB3ZWIueG1sCitjdnMgYWRkIHdlYi54bWwKK2N2cyBjb21taXQKKzwvc291cmNlPgorCitOb3RlIHRoYXQgdGhpcyBpcyBvbmx5IGFuIGV4YW1wbGUgd2ViLnhtbCBmaWxlLiAgVGhlIGZ1bGwgZGVmaW5pdGlvbgorb2YgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBmaWxlIGlzIGluIHRoZQorPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9zZXJ2bGV0Ij5TZXJ2bGV0IFNwZWNpZmljYXRpb24uPC9hPgorCis8L3N1YnNlY3Rpb24+CisKKworPHN1YnNlY3Rpb24gbmFtZT0iRWRpdCBTb3VyY2UgQ29kZSBhbmQgUGFnZXMiPgorCis8cD5UaGUgZWRpdC9idWlsZC90ZXN0IHRhc2tzIHdpbGwgZ2VuZXJhbGx5IGJlIHlvdXIgbW9zdCBjb21tb24gYWN0aXZpdGllcworZHVyaW5nIGRldmVsb3BtZW50IGFuZCBtYWludGVuYW5jZS4gIFRoZSBmb2xsb3dpbmcgZ2VuZXJhbCBwcmluY2lwbGVzIGFwcGx5LgorQXMgZGVzY3JpYmVkIGluIDxhIGhyZWY9InNvdXJjZS5odG1sIj5Tb3VyY2UgT3JnYW5pemF0aW9uPC9hPiwgbmV3bHkgY3JlYXRlZAorc291cmNlIGZpbGVzIHNob3VsZCBiZSBsb2NhdGVkIGluIHRoZSBhcHByb3ByaWF0ZSBzdWJkaXJlY3RvcnksIHVuZGVyIHlvdXIKK3Byb2plY3Qgc291cmNlIGRpcmVjdG9yeS48L3A+CisKKzxwPldoZW5ldmVyIHlvdSB3aXNoIHRvIHJlZnJlc2ggeW91ciBkZXZlbG9wbWVudCBkaXJlY3RvcnkgdG8gcmVmbGVjdCB0aGUKK3dvcmsgcGVyZm9ybWVkIGJ5IG90aGVyIGRldmVsb3BlcnMsIHlvdSB3aWxsIGFzayBDVlMgdG8gZG8gaXQgZm9yIHlvdTo8L3A+Cis8c291cmNlPgorY2Qge215IGhvbWUgZGlyZWN0b3J5fQorY2QgbXlhcHAKK2N2cyB1cGRhdGUgLWRQCis8L3NvdXJjZT4KKworPHA+VG8gY3JlYXRlIGEgbmV3IGZpbGUsIGdvIHRvIHRoZSBhcHByb3ByaWF0ZSBkaXJlY3RvcnksIGNyZWF0ZSB0aGUgZmlsZSwKK2FuZCByZWdpc3RlciBpdCB3aXRoIENWUy4gIFdoZW4geW91IGFyZSBzYXRpc2ZpZWQgd2l0aCBpdCdzIGNvbnRlbnRzIChhZnRlcgorYnVpbGRpbmcgYW5kIHRlc3RpbmcgaXMgc3VjY2Vzc2Z1bCksIGNvbW1pdCB0aGUgbmV3IGZpbGUgdG8gdGhlIHJlcG9zaXRvcnkuCitGb3IgZXhhbXBsZSwgdG8gY3JlYXRlIGEgbmV3IEpTUCBwYWdlOjwvcD4KKzxzb3VyY2U+CitjZCB7bXkgaG9tZSBkaXJlY3Rvcnl9CitjZCBteWFwcC93ZWIJCSZsdDstLSBVbHRpbWF0ZSBkZXN0aW5hdGlvbiBpcyBkb2N1bWVudCByb290CitlbWFjcyBteXBhZ2UuanNwCitjdnMgYWRkIG15cGFnZS5qc3AKKy4uLiBidWlsZCBhbmQgdGVzdCB0aGUgYXBwbGljYXRpb24gLi4uCitjdnMgY29tbWl0Cis8L3NvdXJjZT4KKworPHA+SmF2YSBzb3VyY2UgY29kZSB0aGF0IGlzIGRlZmluZWQgaW4gcGFja2FnZXMgbXVzdCBiZSBvcmdhbml6ZWQgaW4gYQorZGlyZWN0b3J5IGhpZXJhcmNoeSAodW5kZXIgdGhlIDxzdHJvbmc+c3JjLzwvc3Ryb25nPiBzdWJkaXJlY3RvcnkpIHRoYXQKK21hdGNoZXMgdGhlIHBhY2thZ2UgbmFtZXMuICBGb3IgZXhhbXBsZSwgYSBKYXZhIGNsYXNzIG5hbWVkCis8Y29kZT5jb20ubXljb21wYW55Lm15cGFja2FnZS5NeUNsYXNzLmphdmE8L2NvZGU+IHNob3VsZCBiZSBzdG9yZWQgaW4gZmlsZQorPGNvZGU+c3JjL2NvbS9teWNvbXBhbnkvbXlwYWNrYWdlL015Q2xhc3MuamF2YTwvY29kZT4uCitXaGVuZXZlciB5b3UgY3JlYXRlIGEgbmV3IHN1YmRpcmVjdG9yeSwgZG9uJ3QgZm9yZ2V0IHRvCityZWdpc3RlciBpdCB3aXRoIENWUy48L3A+CisKKzxwPlRvIGVkaXQgYW4gZXhpc3Rpbmcgc291cmNlIGZpbGUsIHlvdSB3aWxsIGdlbmVyYWxseSBqdXN0IHN0YXJ0IGVkaXRpbmcKK2FuZCB0ZXN0aW5nLCB0aGVuIGNvbW1pdCB0aGUgY2hhbmdlZCBmaWxlIHdoZW4gZXZlcnl0aGluZyB3b3Jrcy4gIEFsdGhvdWdoCitDVlMgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gcmVxdWlyZWQgeW91IHRvICJjaGVjayBvdXQiIG9yICJsb2NrIiBhIGZpbGUgeW91CithcmUgZ29pbmcgdG8gYmUgbW9kaWZ5aW5nLCB0aGlzIGlzIGdlbmVyYWxseSBub3QgdXNlZC48L3A+CisKKzwvc3Vic2VjdGlvbj4KKworCis8c3Vic2VjdGlvbiBuYW1lPSJCdWlsZCB0aGUgV2ViIEFwcGxpY2F0aW9uIj4KKworPHA+V2hlbiB5b3UgYXJlIHJlYWR5IHRvIGNvbXBpbGUgdGhlIGFwcGxpY2F0aW9uLCBpc3N1ZSB0aGUgZm9sbG93aW5nCitjb21tYW5kcyAoZ2VuZXJhbGx5LCB5b3Ugd2lsbCB3YW50IGEgc2hlbGwgd2luZG93IG9wZW4gdGhhdCBpcyBzZXQgdG8KK3RoZSBwcm9qZWN0IHNvdXJjZSBkaXJlY3RvcnksIHNvIHRoYXQgb25seSB0aGUgbGFzdCBjb21tYW5kIGlzIG5lZWRlZCk6PC9wPgorPHNvdXJjZT4KK2NkIHtteSBob21lIGRpcmVjdG9yeX0KK2NkIG15YXBwCQkmbHQ7LS0gTm9ybWFsbHkgbGVhdmUgYSB3aW5kb3cgb3BlbiBoZXJlCithbnQKKzwvc291cmNlPgorCis8cD5UaGUgQW50IHRvb2wgd2lsbCBiZSBleGVjdXRlIHRoZSBkZWZhdWx0ICJjb21waWxlIiB0YXJnZXQgaW4geW91cgorPGNvZGU+YnVpbGQueG1sPC9jb2RlPiBmaWxlLCB3aGljaCB3aWxsIGNvbXBpbGUgYW55IG5ldyBvciB1cGRhdGVkIEphdmEKK2NvZGUuICBJZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHlvdSBjb21waWxlIGFmdGVyIGEgImJ1aWxkIGNsZWFuIiwKK2l0IHdpbGwgY2F1c2UgZXZlcnl0aGluZyB0byBiZSByZWNvbXBpbGVkLjwvcD4KKworPHA+VG8gZm9yY2UgdGhlIHJlY29tcGlsYXRpb24gb2YgeW91ciBlbnRpcmUgYXBwbGljYXRpb24sIGRvIHRoaXMgaW5zdGVhZDo8L3A+Cis8c291cmNlPgorY2Qge215IGhvbWUgZGlyZWN0b3J5fQorY2QgbXlhcHAKK2FudCBhbGwKKzwvc291cmNlPgorCis8cD5UaGlzIGlzIGEgdmVyeSBnb29kIGhhYml0IGltbWVkaWF0ZWx5IGJlZm9yZSBjaGVja2luZyBpbiBjaGFuZ2VzLCB0bworbWFrZSBzdXJlIHRoYXQgeW91IGhhdmUgbm90IGludHJvZHVjZWQgYW55IHN1YnRsZSBwcm9ibGVtcyB0aGF0IEphdmFjJ3MKK2NvbmRpdGlvbmFsIGNoZWNraW5nIGRpZCBub3QgY2F0Y2guPC9wPgorCis8L3N1YnNlY3Rpb24+CisKKworPHN1YnNlY3Rpb24gbmFtZT0iVGVzdCBZb3VyIFdlYiBBcHBsaWNhdGlvbiI+CisKKzxwPlRvIHRlc3QgeW91ciBhcHBsaWNhdGlvbiwgeW91IHdpbGwgd2FudCB0byBpbnN0YWxsIGl0IHVuZGVyIFRvbWNhdC4gIFRoZQorcXVpY2tlc3Qgd2F5IHRvIGRvIHRoYXQgaXMgdG8gdXNlIHRoZSBjdXN0b20gQW50IHRhc2tzIHRoYXQgYXJlIGluY2x1ZGVkIGluCit0aGUgc2FtcGxlIDxjb2RlPmJ1aWxkLnhtbDwvY29kZT4gc2NyaXB0LiAgVXNpbmcgdGhlc2UgY29tbWFuZHMgbWlnaHQgZm9sbG93CithIHBhdHRlcm4gbGlrZSB0aGlzOjwvcD4KKzx1bD4KKzxsaT48ZW0+U3RhcnQgVG9tY2F0IDUgaWYgbmVlZGVkPC9lbT4uICBJZiBUb21jYXQgNSBpcyBub3QgYWxyZWFkeSBydW5uaW5nLAorICAgIHlvdSB3aWxsIG5lZWQgdG8gc3RhcnQgaXQgaW4gdGhlIHVzdWFsIHdheS4KKyAgICA8YnIvPjxici8+PC9saT4KKzxsaT48ZW0+Q29tcGlsZSB5b3VyIGFwcGxpY2F0aW9uPC9lbT4uICBVc2UgdGhlIDxjb2RlPmFudCBjb21waWxlPC9jb2RlPgorICAgIGNvbW1hbmQgKG9yIGp1c3QgPGNvZGU+YW50PC9jb2RlPiwgc2luY2UgdGhpcyBpcyB0aGUgZGVmYXVsdCkuICBNYWtlCisgICAgc3VyZSB0aGF0IHRoZXJlIGFyZSBubyBjb21waWxhdGlvbiBlcnJvcnMuCisgICAgPGJyLz48YnIvPjwvbGk+Cis8bGk+PGVtPkluc3RhbGwgdGhlIGFwcGxpY2F0aW9uPC9lbT4uICBVc2UgdGhlIDxjb2RlPmFudCBpbnN0YWxsPC9jb2RlPgorICAgIGNvbW1hbmQuICBUaGlzIHRlbGxzIFRvbWNhdCB0byBpbW1lZGlhdGVseSBzdGFydCBydW5uaW5nIHlvdXIgYXBwIG9uCisgICAgdGhlIGNvbnRleHQgcGF0aCBkZWZpbmVkIGluIHRoZSA8Y29kZT5hcHAucGF0aDwvY29kZT4gYnVpbGQgcHJvcGVydHkuCisgICAgVG9tY2F0IGRvZXMgPHN0cm9uZz5OT1Q8L3N0cm9uZz4gaGF2ZSB0byBiZSByZXN0YXJ0ZWQgZm9yIHRoaXMgdG8KKyAgICB0YWtlIGVmZmVjdC48YnIvPjxici8+PC9saT4KKzxsaT48ZW0+VGVzdCB0aGUgYXBwbGljYXRpb248L2VtPi4gIFVzaW5nIHlvdXIgYnJvd3NlciBvciBvdGhlciB0ZXN0aW5nCisgICAgdG9vbHMsIHRlc3QgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgeW91ciBhcHBsaWNhdGlvbi4KKyAgICA8YnIvPjxici8+PC9saT4KKzxsaT48ZW0+TW9kaWZ5IGFuZCByZWJ1aWxkIGFzIG5lZWRlZDwvZW0+LiAgQXMgeW91IGRpc2NvdmVyIHRoYXQgY2hhbmdlcworICAgIGFyZSByZXF1aXJlZCwgbWFrZSB0aG9zZSBjaGFuZ2VzIGluIHRoZSBvcmlnaW5hbCA8c3Ryb25nPnNvdXJjZTwvc3Ryb25nPgorICAgIGZpbGVzLCBub3QgaW4gdGhlIG91dHB1dCBidWlsZCBkaXJlY3RvcnksIGFuZCByZS1pc3N1ZSB0aGUKKyAgICA8Y29kZT5hbnQgY29tcGlsZTwvY29kZT4gY29tbWFuZC4gIFRoaXMgZW5zdXJlcyB0aGF0IHlvdXIgY2hhbmdlcyB3aWxsCisgICAgYmUgYXZhaWxhYmxlIHRvIGJlIHNhdmVkICh2aWEgPGNvZGU+Y3ZzIGNvbW1pdDwvY29kZT4pIGxhdGVyIG9uIC0tCisgICAgdGhlIG91dHB1dCBidWlsZCBkaXJlY3RvcnkgaXMgZGVsZXRlZCBhbmQgcmVjcmVhdGVkIGFzIG5lY2Vzc2FyeS4KKyAgICA8YnIvPjxici8+PC9saT4KKzxsaT48ZW0+UmVsb2FkIHRoZSBhcHBsaWNhdGlvbjwvZW0+LiAgVG9tY2F0IHdpbGwgcmVjb2duaXplIGNoYW5nZXMgaW4KKyAgICBKU1AgcGFnZXMgYXV0b21hdGljYWxseSwgYnV0IGl0IHdpbGwgY29udGludWUgdG8gdXNlIHRoZSBvbGQgdmVyc2lvbnMKKyAgICBvZiBhbnkgc2VydmxldCBvciBKYXZhQmVhbiBjbGFzc2VzIHVudGlsIHRoZSBhcHBsaWNhdGlvbiBpcyByZWxvYWRlZC4KKyAgICBZb3UgY2FuIHRyaWdnZXIgdGhpcyBieSBleGVjdXRpbmcgdGhlIDxjb2RlPmFudCByZWxvYWQ8L2NvZGU+IGNvbW1hbmQuCisgICAgPGJyLz48YnIvPjwvbGk+Cis8bGk+PGVtPlJlbW92ZSB0aGUgYXBwbGljYXRpb24gd2hlbiB5b3UgcmUgZG9uZTwvZW0+LiAgV2hlbiB5b3UgYXJlIHRocm91Z2gKKyAgICB3b3JraW5nIG9uIHRoaXMgYXBwbGljYXRpb24sIHlvdSBjYW4gcmVtb3ZlIGl0IGZyb20gbGl2ZSBleGVjdXRpb24gYnkKKyAgICBydW5uaW5nIHRoZSA8Y29kZT5hbnQgcmVtb3ZlPC9jb2RlPiBjb21tYW5kLjwvbGk+Cis8L3VsPgorCis8cD5EbyBub3QgZm9yZ2V0IHRvIGNvbW1pdCB5b3VyIGNoYW5nZXMgdG8gdGhlIHNvdXJjZSBjb2RlIHJlcG9zaXRvcnkgd2hlbgoreW91IGhhdmUgY29tcGxldGVkIHlvdXIgdGVzdGluZyE8L3A+CisKKzwvc3Vic2VjdGlvbj4KKworCis8c3Vic2VjdGlvbiBuYW1lPSJDcmVhdGluZyBhIFJlbGVhc2UiPgorCis8cD5XaGVuIHlvdSBhcmUgdGhyb3VnaCBhZGRpbmcgbmV3IGZ1bmN0aW9uYWxpdHksIGFuZCB5b3UndmUgdGVzdGVkIGV2ZXJ5dGhpbmcKKyh5b3UgRE8gdGVzdCwgZG9uJ3QgeW91IDotKSwgaXQgaXMgdGltZSB0byBjcmVhdGUgdGhlIGRpc3RyaWJ1dGFibGUgdmVyc2lvbgorb2YgeW91ciB3ZWIgYXBwbGljYXRpb24gdGhhdCBjYW4gYmUgZGVwbG95ZWQgb24gdGhlIHByb2R1Y3Rpb24gc2VydmVyLiAgVGhlCitmb2xsb3dpbmcgZ2VuZXJhbCBzdGVwcyBhcmUgcmVxdWlyZWQ6PC9wPgorPHVsPgorPGxpPklzc3VlIHRoZSBjb21tYW5kIDxjb2RlPmFudCBhbGw8L2NvZGU+IGZyb20gdGhlIHByb2plY3Qgc291cmNlCisgICAgZGlyZWN0b3J5LCB0byByZWJ1aWxkIGV2ZXJ5dGhpbmcgZnJvbSBzY3JhdGNoIG9uZSBsYXN0IHRpbWUuCisgICAgPGJyLz48YnIvPjwvbGk+Cis8bGk+VXNlIHRoZSA8Y29kZT5jdnMgdGFnPC9jb2RlPiBjb21tYW5kIHRvIGNyZWF0ZSBhbiBpZGVudGlmaWVyIGZvcgorICAgIGFsbCBvZiB0aGUgc291cmNlIGZpbGVzIHV0aWxpemVkIHRvIGNyZWF0ZSB0aGlzIHJlbGVhc2UuICBUaGlzIGFsbG93cworICAgIHlvdSB0byByZWxpYWJseSByZWNvbnN0cnVjdCBhIHJlbGVhc2UgKGZyb20gc291cmNlcykgYXQgYSBsYXRlcgorICAgIHRpbWUuPC9saT4KKzxsaT5Jc3N1ZSB0aGUgY29tbWFuZCA8Y29kZT5hbnQgZGlzdDwvY29kZT4gdG8gY3JlYXRlIGEgZGlzdHJpYnV0YWJsZQorICAgIHdlYiBhcHBsaWNhdGlvbiBhcmNoaXZlIChXQVIpIGZpbGUsIGFzIHdlbGwgYXMgYSBKQVIgZmlsZSBjb250YWluaW5nCisgICAgdGhlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUuCisgICAgPGJyLz48YnIvPjwvbGk+Cis8bGk+UGFja2FnZSB0aGUgY29udGVudHMgb2YgdGhlIDxjb2RlPmRpc3Q8L2NvZGU+IGRpcmVjdG9yeSB1c2luZyB0aGUKKyAgICA8c3Ryb25nPnRhcjwvc3Ryb25nPiBvciA8c3Ryb25nPnppcDwvc3Ryb25nPiB1dGlsaXR5LCBhY2NvcmRpbmcgdG8KKyAgICB0aGUgc3RhbmRhcmQgcmVsZWFzZSBwcm9jZWR1cmVzIHVzZWQgYnkgeW91ciBvcmdhbml6YXRpb24uPC9saT4KKzwvdWw+CisKKzwvc3Vic2VjdGlvbj4KKworCis8L3NlY3Rpb24+CisKKzwvYm9keT4KKzwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9kb2NzL2FwcGRldi9wcm9qZWN0LnhtbCBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvYXBwZGV2L3Byb2plY3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjZThiMjQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2FwcGRldi9wcm9qZWN0LnhtbApAQCAtMCwwICsxLDI5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Cis8cHJvamVjdCBuYW1lPSJBcHBsaWNhdGlvbiBEZXZlbG9wZXIncyBHdWlkZSIKKyAgICAgICAgaHJlZj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy90b21jYXQvIj4KKworICAgIDx0aXRsZT5BcHBsaWNhdGlvbiBEZXZlbG9wZXIncyBHdWlkZTwvdGl0bGU+CisKKyAgICA8bG9nbyBocmVmPSIvaW1hZ2VzL3RvbWNhdC5naWYiPgorICAgICAgVGhlIFRvbWNhdCBTZXJ2bGV0L0pTUCBDb250YWluZXIKKyAgICA8L2xvZ28+CisKKyAgICAKKyAgICA8Ym9keT4KKworICAgIDxtZW51IG5hbWU9IkxpbmtzIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iRG9jcyBIb21lIiAgICAgICAgICAgICBocmVmPSIuLi9pbmRleC5odG1sIi8+CisgICAgPC9tZW51PgorCisgICAgPG1lbnUgbmFtZT0iQ29udGVudHMiPgorICAgICAgICA8aXRlbSBuYW1lPSJDb250ZW50cyIgICAgICAgICAgICAgIGhyZWY9ImluZGV4Lmh0bWwiLz4KKyAgICAgICAgPGl0ZW0gbmFtZT0iSW50cm9kdWN0aW9uIiAgICAgICAgICBocmVmPSJpbnRyb2R1Y3Rpb24uaHRtbCIvPgorICAgICAgICA8aXRlbSBuYW1lPSJJbnN0YWxsYXRpb24iICAgICAgICAgIGhyZWY9Imluc3RhbGxhdGlvbi5odG1sIi8+CisgICAgICAgIDxpdGVtIG5hbWU9IkRlcGxveW1lbnQiICAgICAgICAgICAgaHJlZj0iZGVwbG95bWVudC5odG1sIi8+CisgICAgICAgIDxpdGVtIG5hbWU9IlNvdXJjZSBDb2RlIiAgICAgICAgICAgaHJlZj0ic291cmNlLmh0bWwiLz4KKyAgICAgICAgPGl0ZW0gbmFtZT0iUHJvY2Vzc2VzIiAgICAgICAgICAgICBocmVmPSJwcm9jZXNzZXMuaHRtbCIvPgorICAgICAgICA8aXRlbSBuYW1lPSJFeGFtcGxlIEFwcCIgICAgICAgICAgIGhyZWY9InNhbXBsZS8iLz4KKyAgICA8L21lbnU+CisKKyAgICA8L2JvZHk+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9kb2NzL2FwcGRldi9zYW1wbGUvZG9jcy9SRUFETUUudHh0IGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9hcHBkZXYvc2FtcGxlL2RvY3MvUkVBRE1FLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDFjOTg5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9hcHBkZXYvc2FtcGxlL2RvY3MvUkVBRE1FLnR4dApAQCAtMCwwICsxLDIgQEAKK1RoaXMgaXMgYSBkdW1teSBSRUFETUUgZmlsZSBmb3IgdGhlIHNhbXBsZQord2ViIGFwcGxpY2F0aW9uLgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9hcHBkZXYvc2FtcGxlL3NyYy9teXBhY2thZ2UvSGVsbG8uamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvYXBwZGV2L3NhbXBsZS9zcmMvbXlwYWNrYWdlL0hlbGxvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMwMWZhOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvYXBwZGV2L3NhbXBsZS9zcmMvbXlwYWNrYWdlL0hlbGxvLmphdmEKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG15cGFja2FnZTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworCisKKy8qKgorICogU2ltcGxlIHNlcnZsZXQgdG8gdmFsaWRhdGUgdGhhdCB0aGUgSGVsbG8sIFdvcmxkIGV4YW1wbGUgY2FuCisgKiBleGVjdXRlIHNlcnZsZXRzLiAgSW4gdGhlIHdlYiBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IsCisgKiB0aGlzIHNlcnZsZXQgbXVzdCBiZSBtYXBwZWQgdG8gY29ycmVzcG9uZCB0byB0aGUgbGluayBpbiB0aGUKKyAqICJpbmRleC5odG1sIiBmaWxlLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbiA8Q3JhaWcuTWNDbGFuYWhhbkBlbmcuc3VuLmNvbT4KKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgSGVsbG8gZXh0ZW5kcyBIdHRwU2VydmxldCB7CisKKworICAgIC8qKgorICAgICAqIFJlc3BvbmQgdG8gYSBHRVQgcmVxdWVzdCBmb3IgdGhlIGNvbnRlbnQgcHJvZHVjZWQgYnkKKyAgICAgKiB0aGlzIHNlcnZsZXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBzZXJ2bGV0IHJlc3BvbnNlIHdlIGFyZSBwcm9kdWNpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKwlyZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9odG1sIik7CisJUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisKKwl3cml0ZXIucHJpbnRsbigiPGh0bWw+Iik7CisJd3JpdGVyLnByaW50bG4oIjxoZWFkPiIpOworCXdyaXRlci5wcmludGxuKCI8dGl0bGU+U2FtcGxlIEFwcGxpY2F0aW9uIFNlcnZsZXQgUGFnZTwvdGl0bGU+Iik7CisJd3JpdGVyLnByaW50bG4oIjwvaGVhZD4iKTsKKwl3cml0ZXIucHJpbnRsbigiPGJvZHkgYmdjb2xvcj13aGl0ZT4iKTsKKworCXdyaXRlci5wcmludGxuKCI8dGFibGUgYm9yZGVyPVwiMFwiPiIpOworCXdyaXRlci5wcmludGxuKCI8dHI+Iik7CisJd3JpdGVyLnByaW50bG4oIjx0ZD4iKTsKKwl3cml0ZXIucHJpbnRsbigiPGltZyBzcmM9XCJpbWFnZXMvdG9tY2F0LmdpZlwiPiIpOworCXdyaXRlci5wcmludGxuKCI8L3RkPiIpOworCXdyaXRlci5wcmludGxuKCI8dGQ+Iik7CisJd3JpdGVyLnByaW50bG4oIjxoMT5TYW1wbGUgQXBwbGljYXRpb24gU2VydmxldDwvaDE+Iik7CisJd3JpdGVyLnByaW50bG4oIlRoaXMgaXMgdGhlIG91dHB1dCBvZiBhIHNlcnZsZXQgdGhhdCBpcyBwYXJ0IG9mIik7CisJd3JpdGVyLnByaW50bG4oInRoZSBIZWxsbywgV29ybGQgYXBwbGljYXRpb24uICBJdCBkaXNwbGF5cyB0aGUiKTsKKwl3cml0ZXIucHJpbnRsbigicmVxdWVzdCBoZWFkZXJzIGZyb20gdGhlIHJlcXVlc3Qgd2UgYXJlIGN1cnJlbnRseSIpOworCXdyaXRlci5wcmludGxuKCJwcm9jZXNzaW5nLiIpOworCXdyaXRlci5wcmludGxuKCI8L3RkPiIpOworCXdyaXRlci5wcmludGxuKCI8L3RyPiIpOworCXdyaXRlci5wcmludGxuKCI8L3RhYmxlPiIpOworCisJd3JpdGVyLnByaW50bG4oIjx0YWJsZSBib3JkZXI9XCIwXCIgd2lkdGg9XCIxMDAlXCI+Iik7CisJRW51bWVyYXRpb24gbmFtZXMgPSByZXF1ZXN0LmdldEhlYWRlck5hbWVzKCk7CisJd2hpbGUgKG5hbWVzLmhhc01vcmVFbGVtZW50cygpKSB7CisJICAgIFN0cmluZyBuYW1lID0gKFN0cmluZykgbmFtZXMubmV4dEVsZW1lbnQoKTsKKwkgICAgd3JpdGVyLnByaW50bG4oIjx0cj4iKTsKKwkgICAgd3JpdGVyLnByaW50bG4oIiAgPHRoIGFsaWduPVwicmlnaHRcIj4iICsgbmFtZSArICI6PC90aD4iKTsKKwkgICAgd3JpdGVyLnByaW50bG4oIiAgPHRkPiIgKyByZXF1ZXN0LmdldEhlYWRlcihuYW1lKSArICI8L3RkPiIpOworCSAgICB3cml0ZXIucHJpbnRsbigiPC90cj4iKTsKKwl9CisJd3JpdGVyLnByaW50bG4oIjwvdGFibGU+Iik7CisKKwl3cml0ZXIucHJpbnRsbigiPC9ib2R5PiIpOworCXdyaXRlci5wcmludGxuKCI8L2h0bWw+Iik7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9hcHBkZXYvc2FtcGxlL3dlYi9XRUItSU5GL3dlYi54bWwgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2FwcGRldi9zYW1wbGUvd2ViL1dFQi1JTkYvd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzdhYTgyCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9hcHBkZXYvc2FtcGxlL3dlYi9XRUItSU5GL3dlYi54bWwKQEAgLTAsMCArMSwyMyBAQAorPCFET0NUWVBFIHdlYi1hcHAgCisgICAgUFVCTElDICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgV2ViIEFwcGxpY2F0aW9uIDIuMy8vRU4iIAorICAgICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC93ZWItYXBwXzJfMy5kdGQiPgorCis8d2ViLWFwcD4KKworICAgIDxkaXNwbGF5LW5hbWU+SGVsbG8sIFdvcmxkIEFwcGxpY2F0aW9uPC9kaXNwbGF5LW5hbWU+CisgICAgPGRlc2NyaXB0aW9uPgorCVRoaXMgaXMgYSBzaW1wbGUgd2ViIGFwcGxpY2F0aW9uIHdpdGggYSBzb3VyY2UgY29kZSBvcmdhbml6YXRpb24KKwliYXNlZCBvbiB0aGUgcmVjb21tZW5kYXRpb25zIG9mIHRoZSBBcHBsaWNhdGlvbiBEZXZlbG9wZXIncyBHdWlkZS4KKyAgICA8L2Rlc2NyaXB0aW9uPgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+SGVsbG9TZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm15cGFja2FnZS5IZWxsbzwvc2VydmxldC1jbGFzcz4KKyAgICA8L3NlcnZsZXQ+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkhlbGxvU2VydmxldDwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L2hlbGxvPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9hcHBkZXYvc2FtcGxlL3dlYi9oZWxsby5qc3AgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2FwcGRldi9zYW1wbGUvd2ViL2hlbGxvLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjU5NTdjCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9hcHBkZXYvc2FtcGxlL3dlYi9oZWxsby5qc3AKQEAgLTAsMCArMSw0NCBAQAorPGh0bWw+Cis8aGVhZD4KKzx0aXRsZT5TYW1wbGUgQXBwbGljYXRpb24gSlNQIFBhZ2U8L3RpdGxlPgorPC9oZWFkPgorPGJvZHkgYmdjb2xvcj13aGl0ZT4KKworPHRhYmxlIGJvcmRlcj0iMCI+Cis8dHI+Cis8dGQgYWxpZ249Y2VudGVyPgorPGltZyBzcmM9ImltYWdlcy90b21jYXQuZ2lmIj4KKzwvdGQ+Cis8dGQ+Cis8aDE+U2FtcGxlIEFwcGxpY2F0aW9uIEpTUCBQYWdlPC9oMT4KK1RoaXMgaXMgdGhlIG91dHB1dCBvZiBhIEpTUCBwYWdlIHRoYXQgaXMgcGFydCBvZiB0aGUgSGVsbG8sIFdvcmxkCithcHBsaWNhdGlvbi4gIEl0IGRpc3BsYXlzIHNldmVyYWwgdXNlZnVsIHZhbHVlcyBmcm9tIHRoZSByZXF1ZXN0Cit3ZSBhcmUgY3VycmVudGx5IHByb2Nlc3NpbmcuCis8L3RkPgorPC90cj4KKzwvdGFibGU+CisKKzx0YWJsZSBib3JkZXI9IjAiIGJvcmRlcj0iMTAwJSI+Cis8dHI+CisgIDx0aCBhbGlnbj0icmlnaHQiPkNvbnRleHQgUGF0aDo8L3RoPgorICA8dGQgYWxpZ249ImxlZnQiPjwlPSByZXF1ZXN0LmdldENvbnRleHRQYXRoKCkgJT48L3RkPgorPC90cj4KKzx0cj4KKyAgPHRoIGFsaWduPSJyaWdodCI+UGF0aCBJbmZvcm1hdGlvbjo8L3RoPgorICA8dGQgYWxpZ249ImxlZnQiPjwlPSByZXF1ZXN0LmdldFBhdGhJbmZvKCkgJT48L3RkPgorPC90cj4KKzx0cj4KKyAgPHRoIGFsaWduPSJyaWdodCI+UXVlcnkgU3RyaW5nOjwvdGg+CisgIDx0ZCBhbGlnbj0ibGVmdCI+PCU9IHJlcXVlc3QuZ2V0UXVlcnlTdHJpbmcoKSAlPjwvdGQ+Cis8L3RyPgorPHRyPgorICA8dGggYWxpZ249InJpZ2h0Ij5SZXF1ZXN0IE1ldGhvZDo8L3RoPgorICA8dGQgYWxpZ249ImxlZnQiPjwlPSByZXF1ZXN0LmdldE1ldGhvZCgpICU+PC90ZD4KKzwvdHI+Cis8dHI+CisgIDx0aCBhbGlnbj0icmlnaHQiPlNlcnZsZXQgUGF0aDo8L3RoPgorICA8dGQgYWxpZ249ImxlZnQiPjwlPSByZXF1ZXN0LmdldFNlcnZsZXRQYXRoKCkgJT48L3RkPgorPC90cj4KKzwvdGFibGU+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9kb2NzL2FwcGRldi9zYW1wbGUvd2ViL2ltYWdlcy90b21jYXQuZ2lmIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9hcHBkZXYvc2FtcGxlL3dlYi9pbWFnZXMvdG9tY2F0LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmY3ZDgwCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9hcHBkZXYvc2FtcGxlL3dlYi9pbWFnZXMvdG9tY2F0LmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9kb2NzL2FwcGRldi9zYW1wbGUvd2ViL2luZGV4Lmh0bWwgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2FwcGRldi9zYW1wbGUvd2ViL2luZGV4Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjViN2E3MAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvYXBwZGV2L3NhbXBsZS93ZWIvaW5kZXguaHRtbApAQCAtMCwwICsxLDI4IEBACis8aHRtbD4KKzxoZWFkPgorPHRpdGxlPlNhbXBsZSAiSGVsbG8sIFdvcmxkIiBBcHBsaWNhdGlvbjwvdGl0bGU+Cis8L2hlYWQ+Cis8Ym9keSBiZ2NvbG9yPXdoaXRlPgorCis8dGFibGUgYm9yZGVyPSIwIj4KKzx0cj4KKzx0ZD4KKzxpbWcgc3JjPSJpbWFnZXMvdG9tY2F0LmdpZiI+Cis8L3RkPgorPHRkPgorPGgxPlNhbXBsZSAiSGVsbG8sIFdvcmxkIiBBcHBsaWNhdGlvbjwvaDE+Cis8cD5UaGlzIGlzIHRoZSBob21lIHBhZ2UgZm9yIGEgc2FtcGxlIGFwcGxpY2F0aW9uIHVzZWQgdG8gaWxsdXN0cmF0ZSB0aGUKK3NvdXJjZSBkaXJlY3Rvcnkgb3JnYW5pemF0aW9uIG9mIGEgd2ViIGFwcGxpY2F0aW9uIHV0aWxpemluZyB0aGUgcHJpbmNpcGxlcworb3V0bGluZWQgaW4gdGhlIEFwcGxpY2F0aW9uIERldmVsb3BlcidzIEd1aWRlLgorPC90ZD4KKzwvdHI+Cis8L3RhYmxlPgorCis8cD5UbyBwcm92ZSB0aGF0IHRoZXkgd29yaywgeW91IGNhbiBleGVjdXRlIGVpdGhlciBvZiB0aGUgZm9sbG93aW5nIGxpbmtzOgorPHVsPgorPGxpPlRvIGEgPGEgaHJlZj0iaGVsbG8uanNwIj5KU1AgcGFnZTwvYT4uCis8bGk+VG8gYSA8YSBocmVmPSJoZWxsbyI+c2VydmxldDwvYT4uCis8L3VsPgorCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9kb2NzL2FwcGRldi9zb3VyY2UueG1sIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9hcHBkZXYvc291cmNlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGU1NzMwCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9hcHBkZXYvc291cmNlLnhtbApAQCAtMCwwICsxLDMwNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IURPQ1RZUEUgZG9jdW1lbnQgWworICA8IUVOVElUWSBwcm9qZWN0IFNZU1RFTSAicHJvamVjdC54bWwiPgorXT4KKzxkb2N1bWVudCB1cmw9InNvdXJjZS5odG1sIj4KKworICAmcHJvamVjdDsKKworICA8cHJvcGVydGllcz4KKyAgICA8YXV0aG9yIGVtYWlsPSJjcmFpZ21jY0BhcGFjaGUub3JnIj5DcmFpZyBSLiBNY0NsYW5haGFuPC9hdXRob3I+CisgICAgPHRpdGxlPlNvdXJjZSBPcmdhbml6YXRpb248L3RpdGxlPgorICA8L3Byb3BlcnRpZXM+CisKKzxib2R5PgorCisKKzxzZWN0aW9uIG5hbWU9IkRpcmVjdG9yeSBTdHJ1Y3R1cmUiPgorCisgICAgPGJsb2NrcXVvdGU+PGVtPgorICAgIDxwPlRoZSBkZXNjcmlwdGlvbiBiZWxvdyB1c2VzIHRoZSB2YXJpYWJsZSBuYW1lICRDQVRBTElOQV9IT01FCisgICAgdG8gcmVmZXIgdG8gdGhlIGRpcmVjdG9yeSBpbnRvIHdoaWNoIHlvdSBoYXZlIGluc3RhbGxlZCBUb21jYXQgNSwKKyAgICBhbmQgaXMgdGhlIGJhc2UgZGlyZWN0b3J5IGFnYWluc3Qgd2hpY2ggbW9zdCByZWxhdGl2ZSBwYXRocyBhcmUKKyAgICByZXNvbHZlZC4gIEhvd2V2ZXIsIGlmIHlvdSBoYXZlIGNvbmZpZ3VyZWQgVG9tY2F0IDUgZm9yIG11bHRpcGxlCisgICAgaW5zdGFuY2VzIGJ5IHNldHRpbmcgYSBDQVRBTElOQV9CQVNFIGRpcmVjdG9yeSwgeW91IHNob3VsZCB1c2UKKyAgICAkQ0FUQUxJTkFfQkFTRSBpbnN0ZWFkIG9mICRDQVRBTElOQV9IT01FIGZvciBlYWNoIG9mIHRoZXNlCisgICAgcmVmZXJlbmNlcy48L3A+CisgICAgPC9lbT48L2Jsb2NrcXVvdGU+CisKKzxwPkEga2V5IHJlY29tbWVuZGF0aW9uIG9mIHRoaXMgbWFudWFsIGlzIHRvIHNlcGFyYXRlIHRoZSBkaXJlY3RvcnkKK2hpZXJhcmNoeSBjb250YWluaW5nIHlvdXIgc291cmNlIGNvZGUgKGRlc2NyaWJlZCBpbiB0aGlzIHNlY3Rpb24pIGZyb20KK3RoZSBkaXJlY3RvcnkgaGllcmFyY2h5IGNvbnRhaW5pbmcgeW91ciBkZXBsb3lhYmxlIGFwcGxpY2F0aW9uCisoZGVzY3JpYmVkIGluIHRoZSBwcmVjZWRpbmcgc2VjdGlvbikuICBNYWludGFpbmluZyB0aGlzIHNlcGFyYXRpb24gaGFzCit0aGUgZm9sbG93aW5nIGFkdmFudGFnZXM6PC9wPgorPHVsPgorPGxpPlRoZSBjb250ZW50cyBvZiB0aGUgc291cmNlIGRpcmVjdG9yaWVzIGNhbiBiZSBtb3JlIGVhc2lseSBhZG1pbmlzdGVyZWQsCisgICAgbW92ZWQsIGFuZCBiYWNrZWQgdXAgaWYgdGhlICJleGVjdXRhYmxlIiB2ZXJzaW9uIG9mIHRoZSBhcHBsaWNhdGlvbgorICAgIGlzIG5vdCBpbnRlcm1peGVkLgorICAgIDxici8+PGJyLz48L2xpPgorPGxpPlNvdXJjZSBjb2RlIGNvbnRyb2wgaXMgZWFzaWVyIHRvIG1hbmFnZSBvbiBkaXJlY3RvcmllcyB0aGF0IGNvbnRhaW4KKyAgICBvbmx5IHNvdXJjZSBmaWxlcy4KKyAgICA8YnIvPjxici8+PC9saT4KKzxsaT5UaGUgZmlsZXMgdGhhdCBtYWtlIHVwIGFuIGluc3RhbGxhYmxlIGRpc3RyaWJ1dGlvbiBvZiB5b3VyCisgICAgYXBwbGljYXRpb24gYXJlIG11Y2ggZWFzaWVyIHRvIHNlbGVjdCB3aGVuIHRoZSBkZXBsb3ltZW50CisgICAgaGllcmFyY2h5IGlzIHNlcGFyYXRlLjwvbGk+Cis8L3VsPgorCis8cD5BcyB3ZSB3aWxsIHNlZSwgdGhlIDxjb2RlPmFudDwvY29kZT4gZGV2ZWxvcG1lbnQgdG9vbCBtYWtlcyB0aGUgY3JlYXRpb24KK2FuZCBwcm9jZXNzaW5nIG9mIHN1Y2ggZGlyZWN0b3J5IGhpZXJhcmNoaWVzIG5lYXJseSBwYWlubGVzcy48L3A+CisKKzxwPlRoZSBhY3R1YWwgZGlyZWN0b3J5IGFuZCBmaWxlIGhpZXJhcmNoeSB1c2VkIHRvIGNvbnRhaW4gdGhlIHNvdXJjZSBjb2RlCitvZiBhbiBhcHBsaWNhdGlvbiBjYW4gYmUgcHJldHR5IG11Y2ggYW55dGhpbmcgeW91IGxpa2UuICBIb3dldmVyLCB0aGUKK2ZvbGxvd2luZyBvcmdhbml6YXRpb24gaGFzIHByb3ZlbiB0byBiZSBxdWl0ZSBnZW5lcmFsbHkgYXBwbGljYWJsZSwgYW5kIGlzCitleHBlY3RlZCBieSB0aGUgZXhhbXBsZSA8Y29kZT5idWlsZC54bWw8L2NvZGU+IGNvbmZpZ3VyYXRpb24gZmlsZSB0aGF0CitpcyBkaXNjdXNzZWQgYmVsb3cuICBBbGwgb2YgdGhlc2UgY29tcG9uZW50cyBleGlzdCB1bmRlciBhIHRvcCBsZXZlbAorPGVtPnByb2plY3Qgc291cmNlIGRpcmVjdG9yeTwvZW0+IGZvciB5b3VyIGFwcGxpY2F0aW9uOjwvcD4KKzx1bD4KKzxsaT48c3Ryb25nPmRvY3MvPC9zdHJvbmc+IC0gRG9jdW1lbnRhdGlvbiBmb3IgeW91ciBhcHBsaWNhdGlvbiwgaW4gd2hhdGV2ZXIKKyAgICBmb3JtYXQgeW91ciBkZXZlbG9wbWVudCB0ZWFtIGlzIHVzaW5nLjxici8+PGJyLz48L2xpPgorPGxpPjxzdHJvbmc+c3JjLzwvc3Ryb25nPiAtIEphdmEgc291cmNlIGZpbGVzIHRoYXQgZ2VuZXJhdGUgdGhlIHNlcnZsZXRzLAorICAgIGJlYW5zLCBhbmQgb3RoZXIgSmF2YSBjbGFzc2VzIHRoYXQgYXJlIHVuaXF1ZSB0byB5b3VyIGFwcGxpY2F0aW9uLgorICAgIElmIHlvdXIgc291cmNlIGNvZGUgaXMgb3JnYW5pemVkIGluIHBhY2thZ2VzICg8c3Ryb25nPmhpZ2hseTwvc3Ryb25nPgorICAgIHJlY29tbWVuZGVkKSwgdGhlIHBhY2thZ2UgaGllcmFyY2h5IHNob3VsZCBiZSByZWZsZWN0ZWQgYXMgYSBkaXJlY3RvcnkKKyAgICBzdHJ1Y3R1cmUgdW5kZXJuZWF0aCB0aGlzIGRpcmVjdG9yeS48YnIvPjxici8+PC9saT4KKzxsaT48c3Ryb25nPndlYi88L3N0cm9uZz4gLSBUaGUgc3RhdGljIGNvbnRlbnQgb2YgeW91ciB3ZWIgc2l0ZSAoSFRNTCBwYWdlcywKKyAgICBKU1AgcGFnZXMsIEphdmFTY3JpcHQgZmlsZXMsIENTUyBzdHlsZXNoZWV0IGZpbGVzLCBhbmQgaW1hZ2VzKSB0aGF0IHdpbGwKKyAgICBiZSBhY2Nlc3NpYmxlIHRvIGFwcGxpY2F0aW9uIGNsaWVudHMuICBUaGlzIGRpcmVjdG9yeSB3aWxsIGJlIHRoZQorICAgIDxlbT5kb2N1bWVudCByb290PC9lbT4gb2YgeW91ciB3ZWIgYXBwbGljYXRpb24sIGFuZCBhbnkgc3ViZGlyZWN0b3J5CisgICAgc3RydWN0dXJlIGZvdW5kIGhlcmUgd2lsbCBiZSByZWZsZWN0ZWQgaW4gdGhlIHJlcXVlc3QgVVJJcyByZXF1aXJlZCB0bworICAgIGFjY2VzcyB0aG9zZSBmaWxlcy48YnIvPjxici8+PC9saT4KKzxsaT48c3Ryb25nPndlYi9XRUItSU5GLzwvc3Ryb25nPiAtIFRoZSBzcGVjaWFsIGNvbmZpZ3VyYXRpb24gZmlsZXMgcmVxdWlyZWQKKyAgICBmb3IgeW91ciBhcHBsaWNhdGlvbiwgaW5jbHVkaW5nIHRoZSB3ZWIgYXBwbGljYXRpb24gZGVwbG95bWVudCBkZXNjcmlwdG9yCisgICAgKDxjb2RlPndlYi54bWw8L2NvZGU+LCBkZWZpbmVkIGluIHRoZSAKKyAgICA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL3NlcnZsZXQiPlNlcnZsZXQgU3BlY2lmaWNhdGlvbjwvYT4pLCAKKyAgICB0YWcgbGlicmFyeSBkZXNjcmlwdG9ycyBmb3IgY3VzdG9tIHRhZyBsaWJyYXJpZXMKKyAgICB5b3UgaGF2ZSBjcmVhdGVkLCBhbmQgb3RoZXIgcmVzb3VyY2UgZmlsZXMgeW91IHdpc2ggdG8gaW5jbHVkZSB3aXRoaW4KKyAgICB5b3VyIHdlYiBhcHBsaWNhdGlvbi4gIEV2ZW4gdGhvdWdoIHRoaXMgZGlyZWN0b3J5IGFwcGVhcnMgdG8gYmUgYQorICAgIHN1YmRpcmVjdG9yeSBvZiB5b3VyIDxlbT5kb2N1bWVudCByb290PC9lbT4sIHRoZSBTZXJ2bGV0IFNwZWNpZmljYXRpb24KKyAgICBwcm9oaWJpdHMgc2VydmluZyB0aGUgY29udGVudHMgb2YgdGhpcyBkaXJlY3RvcnkgKG9yIGFueSBmaWxlIGl0IGNvbnRhaW5zKQorICAgIGRpcmVjdGx5IHRvIGEgY2xpZW50IHJlcXVlc3QuICBUaGVyZWZvcmUsIHRoaXMgaXMgYSBnb29kIHBsYWNlIHRvIHN0b3JlCisgICAgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiB0aGF0IGlzIHNlbnNpdGl2ZSAoc3VjaCBhcyBkYXRhYmFzZSBjb25uZWN0aW9uCisgICAgdXNlcm5hbWVzIGFuZCBwYXNzd29yZHMpLCBidXQgaXMgcmVxdWlyZWQgZm9yIHlvdXIgYXBwbGljYXRpb24gdG8KKyAgICBvcGVyYXRlIHN1Y2Nlc3NmdWxseS48L2xpPgorPC91bD4KKworPHA+RHVyaW5nIHRoZSBkZXZlbG9wbWVudCBwcm9jZXNzLCB0d28gYWRkaXRpb25hbCBkaXJlY3RvcmllcyB3aWxsIGJlCitjcmVhdGVkIG9uIGEgdGVtcG9yYXJ5IGJhc2lzOjwvcD4KKzx1bD4KKzxsaT48c3Ryb25nPmJ1aWxkLzwvc3Ryb25nPiAtIFdoZW4geW91IGV4ZWN1dGUgYSBkZWZhdWx0IGJ1aWxkCisgICAgKDxjb2RlPmFudDwvY29kZT4pLCB0aGlzIGRpcmVjdG9yeSB3aWxsIGNvbnRhaW4gYW4gZXhhY3QgaW1hZ2UKKyAgICBvZiB0aGUgZmlsZXMgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbiBhcmNoaXZlIGZvciB0aGlzIGFwcGxpY2F0aW9uLgorICAgIFRvbWNhdCA1IGFsbG93cyB5b3UgdG8gZGVwbG95IGFuIGFwcGxpY2F0aW9uIGluIGFuIHVucGFja2VkCisgICAgZGlyZWN0b3J5IGxpa2UgdGhpcywgZWl0aGVyIGJ5IGNvcHlpbmcgaXQgdG8gdGhlCisgICAgPGNvZGU+JENBVEFMSU5BX0hPTUUvd2ViYXBwczwvY29kZT4gZGlyZWN0b3J5LCBvciBieSA8ZW0+aW5zdGFsbGluZzwvZW0+CisgICAgaXQgdmlhIHRoZSAiTWFuYWdlciIgd2ViIGFwcGxpY2F0aW9uLiAgVGhlIGxhdHRlciBhcHByb2FjaCBpcyB2ZXJ5CisgICAgdXNlZnVsIGR1cmluZyBkZXZlbG9wbWVudCwgYW5kIHdpbGwgYmUgaWxsdXN0cmF0ZWQgYmVsb3cuCisgICAgPGJyLz48YnIvPjwvbGk+Cis8bGk+PHN0cm9uZz5kaXN0Lzwvc3Ryb25nPiAtIFdoZW4geW91IGV4ZWN1dGUgdGhlIDxjb2RlPmFudCBkaXN0PC9jb2RlPgorICAgIHRhcmdldCwgdGhpcyBkaXJlY3Rvcnkgd2lsbCBiZSBjcmVhdGVkLiAgSXQgd2lsbCBjcmVhdGUgYW4gZXhhY3QgaW1hZ2UKKyAgICBvZiB0aGUgYmluYXJ5IGRpc3RyaWJ1dGlvbiBmb3IgeW91ciB3ZWIgYXBwbGljYXRpb24sIGluY2x1ZGluZyBhbiBsaWNlbnNlCisgICAgaW5mb3JtYXRpb24sIGRvY3VtZW50YXRpb24sIGFuZCBSRUFETUUgZmlsZXMgdGhhdCB5b3UgaGF2ZSBwcmVwYXJlZC48L2xpPgorPC91bD4KKworPHA+Tm90ZSB0aGF0IHRoZXNlIHR3byBkaXJlY3RvcmllcyBzaG91bGQgPHN0cm9uZz5OT1Q8L3N0cm9uZz4gYmUgYXJjaGl2ZWQgaW4KK3lvdXIgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW0sIGJlY2F1c2UgdGhleSBhcmUgZGVsZXRlZCBhbmQgcmVjcmVhdGVkIChmcm9tCitzY3JhdGNoKSBhcyBuZWVkZWQgZHVyaW5nIGRldmVsb3BtZW50LiAgRm9yIHRoYXQgcmVhc29uLCB5b3Ugc2hvdWxkIG5vdCBlZGl0Cithbnkgc291cmNlIGZpbGVzIGluIHRoZXNlIGRpcmVjdG9yaWVzIGlmIHlvdSB3YW50IHRvIG1haW50YWluIGEgcGVybWFuZW50CityZWNvcmQgb2YgdGhlIGNoYW5nZXMsIGJlY2F1c2UgdGhlIGNoYW5nZXMgd2lsbCBiZSBsb3N0IHRoZSBuZXh0IHRpbWUgdGhhdCBhCitidWlsZCBpcyBwZXJmb3JtZWQuPC9wPgorCisgIDxzdWJzZWN0aW9uIG5hbWU9IkV4dGVybmFsIERlcGVuZGVuY2llcyI+CisKKyAgPHA+V2hhdCBkbyB5b3UgZG8gaWYgeW91ciBhcHBsaWNhdGlvbiByZXF1aXJlcyBKQVIgZmlsZXMgKG9yIG90aGVyCisgIHJlc291cmNlcykgZnJvbSBleHRlcm5hbCBwcm9qZWN0cyBvciBwYWNrYWdlcz8gIEEgY29tbW9uIGV4YW1wbGUgaXMgdGhhdAorICB5b3UgbmVlZCB0byBpbmNsdWRlIGEgSkRCQyBkcml2ZXIgaW4geW91ciB3ZWIgYXBwbGljYXRpb24sIGluIG9yZGVyIHRvCisgIG9wZXJhdGUuPC9wPgorCisgIDxwPkRpZmZlcmVudCBkZXZlbG9wZXJzIHRha2UgZGlmZmVyZW50IGFwcHJvYWNoZXMgdG8gdGhpcyBwcm9ibGVtLgorICBTb21lIHdpbGwgZW5jb3VyYWdlIGNoZWNraW5nIGEgY29weSBvZiB0aGUgSkFSIGZpbGVzIHlvdSBkZXBlbmQgb24gaW50bworICB0aGUgc291cmNlIGNvZGUgY29udHJvbCBhcmNoaXZlcyBmb3IgZXZlcnkgYXBwbGljYXRpb24gdGhhdCByZXF1aXJlcyB0aG9zZQorICBKQVIgZmlsZXMuICBIb3dldmVyLCB0aGlzIGNhbiBjYXVzZSBzaWduaWZpY2FudCBtYW5hZ2VtZW50IGlzc3VlcyB3aGVuIHlvdQorICB1c2UgdGhlIHNhbWUgSkFSIGluIG1hbnkgYXBwbGljYXRpb25zIC0gcGFydGljdWxhciB3aGVuIGZhY2VkIHdpdGggYSBuZWVkCisgIHRvIHVwZ3JhZGUgdG8gYSBkaWZmZXJlbnQgdmVyc2lvbiBvZiB0aGF0IEpBUiBmaWxlLjwvcD4KKworICA8cD5UaGVyZWZvcmUsIHRoaXMgbWFudWFsIHJlY29tbWVuZHMgdGhhdCB5b3UgPHN0cm9uZz5OT1Q8L3N0cm9uZz4gc3RvcmUKKyAgYSBjb3B5IG9mIHRoZSBwYWNrYWdlcyB5b3UgZGVwZW5kIG9uIGluc2lkZSB0aGUgc291cmNlIGNvbnRyb2wgYXJjaGl2ZXMKKyAgb2YgeW91ciBhcHBsaWNhdGlvbnMuICBJbnN0ZWFkLCB0aGUgZXh0ZXJuYWwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZQorICBpbnRlZ3JhdGVkIGFzIHBhcnQgb2YgdGhlIHByb2Nlc3Mgb2YgPHN0cm9uZz5idWlsZGluZzwvc3Ryb25nPiB5b3VyCisgIGFwcGxpY2F0aW9uLiAgSW4gdGhhdCB3YXksIHlvdSBjYW4gYWx3YXlzIHBpY2sgdXAgdGhlIGFwcHJvcHJpYXRlIHZlcnNpb24KKyAgb2YgdGhlIEpBUiBmaWxlcyBmcm9tIHdoZXJldmVyIHlvdXIgZGV2ZWxvcG1lbnQgc3lzdGVtIGFkbWluaXN0cmF0b3IgaGFzCisgIGluc3RhbGxlZCB0aGVtLCB3aXRob3V0IGhhdmluZyB0byB3b3JyeSBhYm91dCB1cGRhdGluZyB5b3VyIGFwcGxpY2F0aW9uCisgIGV2ZXJ5IHRpbWUgdGhlIHZlcnNpb24gb2YgdGhlIGRlcGVuZGVudCBKQVIgZmlsZSBpcyBjaGFuZ2VkLjwvcD4KKworICA8cD5JbiB0aGUgZXhhbXBsZSBBbnQgPGNvZGU+YnVpbGQueG1sPC9jb2RlPiBmaWxlLCB3ZSB3aWxsIGRlbW9uc3RyYXRlCisgIGhvdyB0byBkZWZpbmUgPGVtPmJ1aWxkIHByb3BlcnRpZXM8L2VtPiB0aGF0IGxldCB5b3UgY29uZmlndXJlIHRoZSBsb2NhdGlvbnMKKyAgb2YgdGhlIGZpbGVzIHRvIGJlIGNvcGllZCwgd2l0aG91dCBoYXZpbmcgdG8gbW9kaWZ5IDxjb2RlPmJ1aWxkLnhtbDwvY29kZT4KKyAgd2hlbiB0aGVzZSBmaWxlcyBjaGFuZ2UuICBUaGUgYnVpbGQgcHJvcGVydGllcyB1c2VkIGJ5IGEgcGFydGljdWxhcgorICBkZXZlbG9wZXIgY2FuIGJlIGN1c3RvbWl6ZWQgb24gYSBwZXItYXBwbGljYXRpb24gYmFzaXMsIG9yIGRlZmF1bHRlZCB0bworICAic3RhbmRhcmQiIGJ1aWxkIHByb3BlcnRpZXMgc3RvcmVkIGluIHRoZSBkZXZlbG9wZXIncyBob21lIGRpcmVjdG9yeS48L3A+CisKKyAgPHA+SW4gbWFueSBjYXNlcywgeW91ciBkZXZlbG9wbWVudCBzeXN0ZW0gYWRtaW5pc3RyYXRvciB3aWxsIGhhdmUgYWxyZWFkeQorICBpbnN0YWxsZWQgdGhlIHJlcXVpcmVkIEpBUiBmaWxlcyBpbnRvIFRvbWNhdCA1J3MgPGNvZGU+Y29tbW9uL2xpYjwvY29kZT4KKyAgb3IgPGNvZGU+c2hhcmVkL2xpYjwvY29kZT4gZGlyZWN0b3JpZXMuICBJZiB0aGlzIGhhcyBiZWVuIGRvbmUsIHlvdSBuZWVkCisgIHRvIHRha2Ugbm8gYWN0aW9ucyBhdCBhbGwgLSB0aGUgZXhhbXBsZSA8Y29kZT5idWlsZC54bWw8L2NvZGU+IGZpbGUKKyAgYXV0b21hdGljYWxseSBjb25zdHJ1Y3RzIGEgY29tcGlsZSBjbGFzc3BhdGggdGhhdCBpbmNsdWRlcyB0aGVzZSBmaWxlcy48L3A+CisKKyAgPC9zdWJzZWN0aW9uPgorCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iU291cmNlIENvZGUgQ29udHJvbCI+CisKKzxwPkFzIG1lbnRpb25lZCBlYXJsaWVyLCBpdCBpcyBoaWdobHkgcmVjb21tZW5kZWQgdGhhdCB5b3UgcGxhY2UgYWxsIG9mIHRoZQorc291cmNlIGZpbGVzIHRoYXQgY29tcHJpc2UgeW91ciBhcHBsaWNhdGlvbiB1bmRlciB0aGUgbWFuYWdlbWVudCBvZiBhCitzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbSBsaWtlIHRoZSBDb25jdXJyZW50IFZlcnNpb24gU3lzdGVtIChDVlMpLiAgSWYgeW91CitlbGVjdCB0byBkbyB0aGlzLCBldmVyeSBkaXJlY3RvcnkgYW5kIGZpbGUgaW4gdGhlIHNvdXJjZSBoaWVyYXJjaHkgc2hvdWxkIGJlCityZWdpc3RlcmVkIGFuZCBzYXZlZCAtLSBidXQgbm9uZSBvZiB0aGUgZ2VuZXJhdGVkIGZpbGVzLiAgSWYgeW91IHJlZ2lzdGVyCitiaW5hcnkgZm9ybWF0IGZpbGVzIChzdWNoIGFzIGltYWdlcyBvciBKQVIgbGlicmFyaWVzKSwgYmUgc3VyZSB0byBpbmRpY2F0ZQordGhpcyB0byB5b3VyIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtLjwvcD4KKworPHA+V2UgcmVjb21tZW5kZWQgKGluIHRoZSBwcmV2aW91cyBzZWN0aW9uKSB0aGF0IHlvdSBzaG91bGQgbm90IHN0b3JlIHRoZQorY29udGVudHMgb2YgdGhlIDxjb2RlPmJ1aWxkLzwvY29kZT4gYW5kIDxjb2RlPmRpc3QvPC9jb2RlPiBkaXJlY3RvcmllcworY3JlYXRlZCBieSB5b3VyIGRldmVsb3BtZW50IHByb2Nlc3MgaW4gdGhlIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtLiAgQW4KK2Vhc3kgd2F5IHRvIHRlbGwgQ1ZTIHRvIGlnbm9yZSB0aGVzZSBkaXJlY3RvcmllcyBpcyB0byBjcmVhdGUgYSBmaWxlIG5hbWVkCis8Y29kZT4uY3ZzaWdub3JlPC9jb2RlPiAobm90ZSB0aGUgbGVhZGluZyBwZXJpb2QpIGluIHlvdXIgdG9wLWxldmVsIHNvdXJjZQorZGlyZWN0b3J5LCB3aXRoIHRoZSBmb2xsb3dpbmcgY29udGVudHM6PC9wPgorPHNvdXJjZT4KK2J1aWxkCitkaXN0CitidWlsZC5wcm9wZXJ0aWVzCis8L3NvdXJjZT4KKworPHA+VGhlIHJlYXNvbiBmb3IgbWVudGlvbmluZyA8Y29kZT5idWlsZC5wcm9wZXJ0aWVzPC9jb2RlPiBoZXJlIHdpbGwgYmUKK2V4cGxhaW5lZCBpbiB0aGUgPGEgaHJlZj0icHJvY2Vzc2VzLmh0bWwiPlByb2Nlc3NlczwvYT4gc2VjdGlvbi48L3A+CisKKzxwPkRldGFpbGVkIGluc3RydWN0aW9ucyBmb3IgeW91ciBzb3VyY2UgY29kZSBjb250cm9sIGVudmlyb25tZW50IGFyZSBiZXlvbmQKK3RoZSBzY29wZSBvZiB0aGlzIG1hbnVhbC4gIEhvd2V2ZXIsIHRoZSBmb2xsb3dpbmcgc3RlcHMgYXJlIGZvbGxvd2VkIHdoZW4KK3VzaW5nIGEgY29tbWFuZC1saW5lIENWUyBjbGllbnQ6PC9wPgorPHVsPgorPGxpPlRvIHJlZnJlc2ggdGhlIHN0YXRlIG9mIHlvdXIgc291cmNlIGNvZGUgdG8gdGhhdCBzdG9yZWQgaW4gdGhlCisgICAgdGhlIHNvdXJjZSByZXBvc2l0b3J5LCBnbyB0byB5b3VyIHByb2plY3Qgc291cmNlIGRpcmVjdG9yeSwgYW5kCisgICAgZXhlY3V0ZSA8Y29kZT5jdnMgdXBkYXRlIC1kUDwvY29kZT4uCisgICAgPGJyLz48YnIvPjwvbGk+Cis8bGk+V2hlbiB5b3UgY3JlYXRlIGEgbmV3IHN1YmRpcmVjdG9yeSBpbiB0aGUgc291cmNlIGNvZGUgaGllcmFyY2h5LCByZWdpc3RlcgorICAgIGl0IGluIENWUyB3aXRoIGEgY29tbWFuZCBsaWtlIDxjb2RlPmN2cyBhZGQge3N1YmRpcm5hbWV9PC9jb2RlPi4KKyAgICA8YnIvPjxici8+PC9saT4KKzxsaT5XaGVuIHlvdSBmaXJzdCBjcmVhdGUgYSBuZXcgc291cmNlIGNvZGUgZmlsZSwgbmF2aWdhdGUgdG8gdGhlIGRpcmVjdG9yeQorICAgIHRoYXQgY29udGFpbnMgaXQsIGFuZCByZWdpc3RlciB0aGUgbmV3IGZpbGUgd2l0aCBhIGNvbW1hbmQgbGlrZQorICAgIDxjb2RlPmN2cyBhZGQge2ZpbGVuYW1lfTwvY29kZT4uCisgICAgPGJyLz48YnIvPjwvbGk+Cis8bGk+SWYgeW91IG5vIGxvbmdlciBuZWVkIGEgcGFydGljdWxhciBzb3VyY2UgY29kZSBmaWxlLCBuYXZpZ2F0ZSB0byB0aGUKKyAgICBjb250YWluaW5nIGRpcmVjdG9yeSBhbmQgcmVtb3ZlIHRoZSBmaWxlLiAgVGhlbiwgZGVyZWdpc3RlciBpdCBpbiBDVlMKKyAgICB3aXRoIGEgY29tbWFuZCBsaWtlIDxjb2RlPmN2cyByZW1vdmUge2ZpbGVuYW1lfTwvY29kZT4uCisgICAgPGJyLz48YnIvPjwvbGk+Cis8bGk+V2hpbGUgeW91IGFyZSBjcmVhdGluZywgbW9kaWZ5aW5nLCBhbmQgZGVsZXRpbmcgc291cmNlIGZpbGVzLCBjaGFuZ2VzCisgICAgYXJlIG5vdCB5ZXQgcmVmbGVjdGVkIGluIHRoZSBzZXJ2ZXIgcmVwb3NpdG9yeS4gIFRvIHNhdmUgeW91ciBjaGFuZ2VzIGluCisgICAgdGhlaXIgY3VycmVudCBzdGF0ZSwgZ28gdG8gdGhlIHByb2plY3Qgc291cmNlIGRpcmVjdG9yeQorICAgIGFuZCBleGVjdXRlIDxjb2RlPmN2cyBjb21taXQ8L2NvZGU+LiAgWW91IHdpbGwgYmUgYXNrZWQgdG8gd3JpdGUgYSBicmllZgorICAgIGRlc2NyaXB0aW9uIG9mIHRoZSBjaGFuZ2VzIHlvdSBoYXZlIGp1c3QgY29tcGxldGVkLCB3aGljaCB3aWxsIGJlIHN0b3JlZAorICAgIHdpdGggdGhlIG5ldyB2ZXJzaW9uIG9mIGFueSB1cGRhdGVkIHNvdXJjZSBmaWxlLjwvbGk+Cis8L3VsPgorCis8cD5DVlMsIGxpa2Ugb3RoZXIgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLCBoYXMgbWFueSBhZGRpdGlvbmFsIGZlYXR1cmVzCisoc3VjaCBhcyB0aGUgYWJpbGl0eSB0byB0YWcgdGhlIGZpbGVzIHRoYXQgbWFkZSB1cCBhIHBhcnRpY3VsYXIgcmVsZWFzZSwgYW5kCitzdXBwb3J0IGZvciBtdWx0aXBsZSBkZXZlbG9wbWVudCBicmFuY2hlcyB0aGF0IGNhbiBsYXRlciBiZSBtZXJnZWQpLiAgU2VlIHRoZQorbGlua3MgYW5kIHJlZmVyZW5jZXMgaW4gdGhlIDxhIGhyZWY9ImludHJvZHVjdGlvbi5odG1sIj5JbnRyb2R1Y3Rpb248L2E+IGZvcgorbW9yZSBpbmZvcm1hdGlvbi48L3A+CisKKzwvc2VjdGlvbj4KKworCis8c2VjdGlvbiBuYW1lPSJCVUlMRC5YTUwgQ29uZmlndXJhdGlvbiBGaWxlIj4KKworPHA+V2Ugd2lsbCBiZSB1c2luZyB0aGUgPHN0cm9uZz5hbnQ8L3N0cm9uZz4gdG9vbCB0byBtYW5hZ2UgdGhlIGNvbXBpbGF0aW9uIG9mCitvdXIgSmF2YSBzb3VyY2UgY29kZSBmaWxlcywgYW5kIGNyZWF0aW9uIG9mIHRoZSBkZXBsb3ltZW50IGhpZXJhcmNoeS4gIEFudAorb3BlcmF0ZXMgdW5kZXIgdGhlIGNvbnRyb2wgb2YgYSBidWlsZCBmaWxlLCBub3JtYWxseSBjYWxsZWQKKzxjb2RlPmJ1aWxkLnhtbDwvY29kZT4sIHRoYXQgZGVmaW5lcyB0aGUgcHJvY2Vzc2luZyBzdGVwcyByZXF1aXJlZC4gIFRoaXMKK2ZpbGUgaXMgc3RvcmVkIGluIHRoZSB0b3AtbGV2ZWwgZGlyZWN0b3J5IG9mIHlvdXIgc291cmNlIGNvZGUgaGllcmFyY2h5LCBhbmQKK3Nob3VsZCBiZSBjaGVja2VkIGluIHRvIHlvdXIgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW0uPC9wPgorCis8cD5MaWtlIGEgTWFrZWZpbGUsIHRoZSA8Y29kZT5idWlsZC54bWw8L2NvZGU+IGZpbGUgcHJvdmlkZXMgc2V2ZXJhbAorInRhcmdldHMiIHRoYXQgc3VwcG9ydCBvcHRpb25hbCBkZXZlbG9wbWVudCBhY3Rpdml0aWVzIChzdWNoIGFzIGNyZWF0aW5nCit0aGUgYXNzb2NpYXRlZCBKYXZhZG9jIGRvY3VtZW50YXRpb24sIGVyYXNpbmcgdGhlIGRlcGxveW1lbnQgaG9tZSBkaXJlY3RvcnkKK3NvIHlvdSBjYW4gYnVpbGQgeW91ciBwcm9qZWN0IGZyb20gc2NyYXRjaCwgb3IgY3JlYXRpbmcgdGhlIHdlYiBhcHBsaWNhdGlvbgorYXJjaGl2ZSBmaWxlIHNvIHlvdSBjYW4gZGlzdHJpYnV0ZSB5b3VyIGFwcGxpY2F0aW9uLiAgQSB3ZWxsLWNvbnN0cnVjdGVkCis8Y29kZT5idWlsZC54bWw8L2NvZGU+IGZpbGUgd2lsbCBjb250YWluIGludGVybmFsIGRvY3VtZW50YXRpb24gZGVzY3JpYmluZwordGhlIHRhcmdldHMgdGhhdCBhcmUgZGVzaWduZWQgZm9yIHVzZSBieSB0aGUgZGV2ZWxvcGVyLCB2ZXJzdXMgdGhvc2UgdGFyZ2V0cwordXNlZCBpbnRlcm5hbGx5LiAgVG8gYXNrIEFudCB0byBkaXNwbGF5IHRoZSBwcm9qZWN0IGRvY3VtZW50YXRpb24sIGNoYW5nZSB0bwordGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSA8Y29kZT5idWlsZC54bWw8L2NvZGU+IGZsaWUgYW5kIHR5cGU6PC9wPgorPHNvdXJjZT4KK2FudCAtcHJvamVjdGhlbHAKKzwvc291cmNlPgorCis8cD5UbyBnaXZlIHlvdSBhIGhlYWQgc3RhcnQsIGEgPGEgaHJlZj0iYnVpbGQueG1sLnR4dCI+YmFzaWMgYnVpbGQueG1sIGZpbGU8L2E+CitpcyBwcm92aWRlZCB0aGF0IHlvdSBjYW4gY3VzdG9taXplIGFuZCBpbnN0YWxsIGluIHRoZSBwcm9qZWN0IHNvdXJjZSBkaXJlY3RvcnkKK2ZvciB5b3VyIGFwcGxpY2F0aW9uLiAgVGhpcyBmaWxlIGluY2x1ZGVzIGNvbW1lbnRzIHRoYXQgZGVzY3JpYmUgdGhlIHZhcmlvdXMKK3RhcmdldHMgdGhhdCBjYW4gYmUgZXhlY3V0ZWQuICBCcmllZmx5LCB0aGUgZm9sbG93aW5nIHRhcmdldHMgYXJlIGdlbmVyYWxseQorcHJvdmlkZWQ6PC9wPgorPHVsPgorPGxpPjxzdHJvbmc+Y2xlYW48L3N0cm9uZz4gLSBUaGlzIHRhcmdldCBkZWxldGVzIGFueSBleGlzdGluZworICAgIDxjb2RlPmJ1aWxkPC9jb2RlPiBhbmQgPGNvZGU+ZGlzdDwvY29kZT4gZGlyZWN0b3JpZXMsIHNvIHRoYXQgdGhleQorICAgIGNhbiBiZSByZWNvbnN0cnVjdGVkIGZyb20gc2NyYXRjaC4gIFRoaXMgYWxsb3dzIHlvdSB0byBndWFyYW50ZWUgdGhhdAorICAgIHlvdSBoYXZlIG5vdCBtYWRlIHNvdXJjZSBjb2RlIG1vZGlmaWNhdGlvbnMgdGhhdCB3aWxsIHJlc3VsdCBpbgorICAgIHByb2JsZW1zIGF0IHJ1bnRpbWUgZHVlIHRvIG5vdCByZWNvbXBpbGluZyBhbGwgYWZmZWN0ZWQgY2xhc3Nlcy4KKyAgICA8YnIvPjxici8+PC9saT4KKzxsaT48c3Ryb25nPmNvbXBpbGU8L3N0cm9uZz4gLSBUaGlzIHRhcmdldCBpcyB1c2VkIHRvIGNvbXBpbGUgYW55IHNvdXJjZSBjb2RlCisgICAgdGhhdCBoYXMgYmVlbiBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0IHRpbWUgY29tcGlsYXRpb24gdG9vayBwbGFjZS4gIFRoZQorICAgIHJlc3VsdGluZyBjbGFzcyBmaWxlcyBhcmUgY3JlYXRlZCBpbiB0aGUgPGNvZGU+V0VCLUlORi9jbGFzc2VzPC9jb2RlPgorICAgIHN1YmRpcmVjdG9yeSBvZiB5b3VyIDxjb2RlPmJ1aWxkPC9jb2RlPiBkaXJlY3RvcnksIGV4YWN0bHkgd2hlcmUgdGhlCisgICAgc3RydWN0dXJlIG9mIGEgd2ViIGFwcGxpY2F0aW9uIHJlcXVpcmVzIHRoZW0gdG8gYmUuICBCZWNhdXNlCisgICAgdGhpcyBjb21tYW5kIGlzIGV4ZWN1dGVkIHNvIG9mdGVuIGR1cmluZyBkZXZlbG9wbWVudCwgaXQgaXMgbm9ybWFsbHkKKyAgICBtYWRlIHRoZSAiZGVmYXVsdCIgdGFyZ2V0IHNvIHRoYXQgYSBzaW1wbGUgPGNvZGU+YW50PC9jb2RlPiBjb21tYW5kIHdpbGwKKyAgICBleGVjdXRlIGl0LgorICAgIDxici8+PGJyLz48L2xpPgorPGxpPjxzdHJvbmc+YWxsPC9zdHJvbmc+IC0gVGhpcyB0YXJnZXQgaXMgYSBzaG9ydCBjdXQgZm9yIHJ1bm5pbmcgdGhlCisgICAgPGNvZGU+Y2xlYW48L2NvZGU+IHRhcmdldCwgZm9sbG93ZWQgYnkgdGhlIDxjb2RlPmNvbXBpbGU8L2NvZGU+IHRhcmdldC4KKyAgICBUaHVzLCBpdCBndWFyYW50ZWVzIHRoYXQgeW91IHdpbGwgcmVjb21waWxlIHRoZSBlbnRpcmUgYXBwbGljYXRpb24sIHRvCisgICAgZW5zdXJlIHRoYXQgeW91IGhhdmUgbm90IHVua25vd2luZ2x5IGludHJvZHVjZWQgYW55IGluY29tcGF0aWJsZSBjaGFuZ2VzLgorICAgIDxici8+PGJyLz48L2xpPgorPGxpPjxzdHJvbmc+amF2YWRvYzwvc3Ryb25nPiAtIFRoaXMgdGFyZ2V0IGNyZWF0ZXMgSmF2YWRvYyBBUEkgZG9jdW1lbnRhdGlvbgorICAgIGZvciB0aGUgSmF2YSBjbGFzc2VzIGluIHRoaXMgd2ViIGFwcGxpY2F0aW9uLiAgVGhlIGV4YW1wbGUKKyAgICA8Y29kZT5idWlsZC54bWw8L2NvZGU+IGZpbGUgYXNzdW1lcyB5b3Ugd2FudCB0byBpbmNsdWRlIHRoZSBBUEkKKyAgICBkb2N1bWVudGF0aW9uIHdpdGggeW91ciBhcHAgZGlzdHJpYnV0aW9uLCBzbyBpdCBnZW5lcmF0ZXMgdGhlIGRvY3MKKyAgICBpbiBhIHN1YmRpcmVjdG9yeSBvZiB0aGUgPGNvZGU+ZGlzdDwvY29kZT4gZGlyZWN0b3J5LiAgQmVjYXVzZSB5b3Ugbm9ybWFsbHkKKyAgICBkbyBub3QgbmVlZCB0byBnZW5lcmF0ZSB0aGUgSmF2YWRvY3Mgb24gZXZlcnkgY29tcGlsYXRpb24sIHRoaXMgdGFyZ2V0IGlzCisgICAgdXN1YWxseSBhIGRlcGVuZGVuY3kgb2YgdGhlIDxjb2RlPmRpc3Q8L2NvZGU+IHRhcmdldCwgYnV0IG5vdCBvZiB0aGUKKyAgICA8Y29kZT5jb21waWxlPC9jb2RlPiB0YXJnZXQuCisgICAgPGJyLz48YnIvPjwvbGk+Cis8bGk+PHN0cm9uZz5kaXN0PC9zdHJvbmc+IC0gVGhpcyB0YXJnZXQgY3JlYXRlcyBhIGRpc3RyaWJ1dGlvbiBkaXJlY3RvcnkgZm9yCisgICAgeW91ciBhcHBsaWNhdGlvbiwgaW5jbHVkaW5nIGFueSByZXF1aXJlZCBkb2N1bWVudGF0aW9uLCB0aGUgSmF2YWRvY3MgZm9yCisgICAgeW91ciBKYXZhIGNsYXNzZXMsIGFuZCBhIHdlYiBhcHBsaWNhdGlvbiBhcmNoaXZlIChXQVIpIGZpbGUgdGhhdCB3aWxsIGJlCisgICAgZGVsaXZlcmVkIHRvIHN5c3RlbSBhZG1pbmlzdHJhdG9ycyB3aG8gd2lzaCB0byBpbnN0YWxsIHlvdXIgYXBwbGljYXRpb24uCisgICAgQmVjYXVzZSB0aGlzIHRhcmdldCBhbHNvIGRlcGVuZHMgb24gdGhlIDxjb2RlPmRlcGxveTwvY29kZT4gdGFyZ2V0LCB0aGUKKyAgICB3ZWIgYXBwbGljYXRpb24gYXJjaGl2ZSB3aWxsIGhhdmUgYWxzbyBwaWNrZWQgdXAgYW55IGV4dGVybmFsIGRlcGVuZGVuY2llcworICAgIHRoYXQgd2VyZSBpbmNsdWRlZCBhdCBkZXBsb3ltZW50IHRpbWUuPC9saT4KKzwvdWw+CisKKzxwPkZvciBpbnRlcmFjdGl2ZSBkZXZlbG9wbWVudCBhbmQgdGVzdGluZyBvZiB5b3VyIHdlYiBhcHBsaWNhdGlvbiB1c2luZworVG9tY2F0IDUsIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCB0YXJnZXRzIGFyZSBkZWZpbmVkOjwvcD4KKzx1bD4KKzxsaT48c3Ryb25nPmluc3RhbGw8L3N0cm9uZz4gLSBUZWxsIHRoZSBjdXJyZW50bHkgcnVubmluZyBUb21jYXQgNSB0byBtYWtlCisgICAgdGhlIGFwcGxpY2F0aW9uIHlvdSBhcmUgZGV2ZWxvcGluZyBpbW1lZGlhdGVseSBhdmFpbGFibGUgZm9yIGV4ZWN1dGlvbgorICAgIGFuZCB0ZXN0aW5nLiAgVGhpcyBhY3Rpb24gZG9lcyBub3QgcmVxdWlyZSBUb21jYXQgNSB0byBiZSByZXN0YXJ0ZWQsIGJ1dAorICAgIGl0IGlzIGFsc28gbm90IHJlbWVtYmVyZWQgYWZ0ZXIgVG9tY2F0IGlzIHJlc3RhcnRlZCB0aGUgbmV4dCB0aW1lLgorICAgIDxici8+PGJyLz48L2xpPgorPGxpPjxzdHJvbmc+cmVsb2FkPC9zdHJvbmc+IC0gT25jZSB0aGUgYXBwbGljYXRpb24gaXMgaW5zdGFsbGVkLCB5b3UgY2FuCisgICAgY29udGludWUgdG8gbWFrZSBjaGFuZ2VzIGFuZCByZWNvbXBpbGUgdXNpbmcgdGhlIDxjb2RlPmNvbXBpbGU8L2NvZGU+CisgICAgdGFyZ2V0LiAgVG9tY2F0IDUgd2lsbCBhdXRvbWF0aWNhbGx5IHJlY29nbml6ZSBjaGFuZ2VzIG1hZGUgdG8gSlNQIHBhZ2VzLAorICAgIGJ1dCBub3QgdG8gc2VydmxldCBvciBKYXZhQmVhbiBjbGFzc2VzIC0gdGhpcyBjb21tYW5kIHdpbGwgdGVsbCBUb21jYXQKKyAgICB0byByZXN0YXJ0IHRoZSBjdXJyZW50bHkgaW5zdGFsbGVkIGFwcGxpY2F0aW9uIHNvIHRoYXQgc3VjaCBjaGFuZ2VzIGFyZQorICAgIHJlY29nbml6ZWQuCisgICAgPGJyLz48YnIvPjwvbGk+Cis8bGk+PHN0cm9uZz5yZW1vdmU8L3N0cm9uZz4gLSBXaGVuIHlvdSBoYXZlIGNvbXBsZXRlZCB5b3VyIGRldmVsb3BtZW50IGFuZAorICAgIHRlc3RpbmcgYWN0aXZpdGllcywgeW91IGNhbiBvcHRpb25hbGx5IHRlbGwgVG9tY2F0IDUgdG8gcmVtb3ZlIHRoaXMKKyAgICBhcHBsaWNhdGlvbiBmcm9tIHNlcnZpY2UuCisgICAgPC9saT4KKzwvdWw+CisKKzxwPlVzaW5nIHRoZSBkZXZlbG9wbWVudCBhbmQgdGVzdGluZyB0YXJnZXRzIHJlcXVpcmVzIHNvbWUgYWRkaXRpb25hbAorb25lLXRpbWUgc2V0dXAgdGhhdCBpcyBkZXNjcmliZWQgb24gdGhlIG5leHQgcGFnZS48L3A+CisKKzwvc2VjdGlvbj4KKworCis8L2JvZHk+Cis8L2RvY3VtZW50PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9hcHBkZXYvd2ViLnhtbC50eHQgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2FwcGRldi93ZWIueG1sLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzViZmJhCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9hcHBkZXYvd2ViLnhtbC50eHQKQEAgLTAsMCArMSwxNTAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KKworPCFET0NUWVBFIHdlYi1hcHAgCisgICAgUFVCTElDICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgV2ViIEFwcGxpY2F0aW9uIDIuMy8vRU4iIAorICAgICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC93ZWItYXBwXzJfMy5kdGQiPgorCis8d2ViLWFwcD4KKworCisgICAgPCEtLSBHZW5lcmFsIGRlc2NyaXB0aW9uIG9mIHlvdXIgd2ViIGFwcGxpY2F0aW9uIC0tPgorCisgICAgPGRpc3BsYXktbmFtZT5NeSBXZWIgQXBwbGljYXRpb248L2Rpc3BsYXktbmFtZT4KKyAgICA8ZGVzY3JpcHRpb24+CisgICAgICBUaGlzIGlzIHZlcnNpb24gWC5YIG9mIGFuIGFwcGxpY2F0aW9uIHRvIHBlcmZvcm0KKyAgICAgIGEgd2lsZCBhbmQgd29uZGVyZnVsIHRhc2ssIGJhc2VkIG9uIHNlcnZsZXRzIGFuZAorICAgICAgSlNQIHBhZ2VzLiAgSXQgd2FzIHdyaXR0ZW4gYnkgRGF2ZSBEZXZlbG9wZXIKKyAgICAgIChkYXZlQG15Y29tcGFueS5jb20pLCB3aG8gc2hvdWxkIGJlIGNvbnRhY3RlZCBmb3IKKyAgICAgIG1vcmUgaW5mb3JtYXRpb24uCisgICAgPC9kZXNjcmlwdGlvbj4KKworCisgICAgPCEtLSBDb250ZXh0IGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMgdGhhdCBkZWZpbmUgc2hhcmVkCisgICAgICAgICBTdHJpbmcgY29uc3RhbnRzIHVzZWQgd2l0aGluIHlvdXIgYXBwbGljYXRpb24sIHdoaWNoCisgICAgICAgICBjYW4gYmUgY3VzdG9taXplZCBieSB0aGUgc3lzdGVtIGFkbWluaXN0cmF0b3Igd2hvIGlzCisgICAgICAgICBpbnN0YWxsaW5nIHlvdXIgYXBwbGljYXRpb24uICBUaGUgdmFsdWVzIGFjdHVhbGx5CisgICAgICAgICBhc3NpZ25lZCB0byB0aGVzZSBwYXJhbWV0ZXJzIGNhbiBiZSByZXRyaWV2ZWQgaW4gYQorICAgICAgICAgc2VydmxldCBvciBKU1AgcGFnZSBieSBjYWxsaW5nOgorCisgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0KKyAgICAgICAgICAgICAgIGdldFNlcnZsZXRDb250ZXh0KCkuZ2V0SW5pdFBhcmFtZXRlcigibmFtZSIpOworCisgICAgICAgICB3aGVyZSAibmFtZSIgbWF0Y2hlcyB0aGUgPHBhcmFtLW5hbWU+IGVsZW1lbnQgb2YKKyAgICAgICAgIG9uZSBvZiB0aGVzZSBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzLgorCisgICAgICAgICBZb3UgY2FuIGRlZmluZSBhbnkgbnVtYmVyIG9mIGNvbnRleHQgaW5pdGlhbGl6YXRpb24KKyAgICAgICAgIHBhcmFtZXRlcnMsIGluY2x1ZGluZyB6ZXJvLgorICAgIC0tPgorCisgICAgPGNvbnRleHQtcGFyYW0+CisgICAgICA8cGFyYW0tbmFtZT53ZWJtYXN0ZXI8L3BhcmFtLW5hbWU+CisgICAgICA8cGFyYW0tdmFsdWU+bXlhZGRyZXNzQG15Y29tcGFueS5jb208L3BhcmFtLXZhbHVlPgorICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICBUaGUgRU1BSUwgYWRkcmVzcyBvZiB0aGUgYWRtaW5pc3RyYXRvciB0byB3aG9tIHF1ZXN0aW9ucworICAgICAgICBhbmQgY29tbWVudHMgYWJvdXQgdGhpcyBhcHBsaWNhdGlvbiBzaG91bGQgYmUgYWRkcmVzc2VkLgorICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICA8L2NvbnRleHQtcGFyYW0+CisKKworICAgIDwhLS0gU2VydmxldCBkZWZpbml0aW9ucyBmb3IgdGhlIHNlcnZsZXRzIHRoYXQgbWFrZSB1cAorICAgICAgICAgeW91ciB3ZWIgYXBwbGljYXRpb24sIGluY2x1ZGluZyBpbml0aWFsaXphdGlvbgorICAgICAgICAgcGFyYW1ldGVycy4gIFdpdGggVG9tY2F0LCB5b3UgY2FuIGFsc28gc2VuZCByZXF1ZXN0cworICAgICAgICAgdG8gc2VydmxldHMgbm90IGxpc3RlZCBoZXJlIHdpdGggYSByZXF1ZXN0IGxpa2UgdGhpczoKKworICAgICAgICAgICBodHRwOi8vbG9jYWxob3N0OjgwODAve2NvbnRleHQtcGF0aH0vc2VydmxldC97Y2xhc3NuYW1lfQorCisgICAgICAgICBidXQgdGhpcyB1c2FnZSBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSBwb3J0YWJsZS4gIEl0IGFsc28KKyAgICAgICAgIG1ha2VzIHJlbGF0aXZlIHJlZmVyZW5jZXMgdG8gaW1hZ2VzIGFuZCBvdGhlciByZXNvdXJjZXMKKyAgICAgICAgIHJlcXVpcmVkIGJ5IHlvdXIgc2VydmxldCBtb3JlIGNvbXBsaWNhdGVkLCBzbyBkZWZpbmluZworICAgICAgICAgYWxsIG9mIHlvdXIgc2VydmxldHMgKGFuZCBkZWZpbmluZyBhIG1hcHBpbmcgdG8gdGhlbSB3aXRoCisgICAgICAgICBhIHNlcnZsZXQtbWFwcGluZyBlbGVtZW50KSBpcyByZWNvbW1lbmRlZC4KKworICAgICAgICAgU2VydmxldCBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzIGNhbiBiZSByZXRyaWV2ZWQgaW4gYQorICAgICAgICAgc2VydmxldCBvciBKU1AgcGFnZSBieSBjYWxsaW5nOgorCisgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0KKyAgICAgICAgICAgICAgIGdldFNlcnZsZXRDb25maWcoKS5nZXRJbml0UGFyYW1ldGVyKCJuYW1lIik7CisKKyAgICAgICAgIHdoZXJlICJuYW1lIiBtYXRjaGVzIHRoZSA8cGFyYW0tbmFtZT4gZWxlbWVudCBvZgorICAgICAgICAgb25lIG9mIHRoZXNlIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMuCisKKyAgICAgICAgIFlvdSBjYW4gZGVmaW5lIGFueSBudW1iZXIgb2Ygc2VydmxldHMsIGluY2x1ZGluZyB6ZXJvLgorICAgIC0tPgorCisgICAgPHNlcnZsZXQ+CisgICAgICA8c2VydmxldC1uYW1lPmNvbnRyb2xsZXI8L3NlcnZsZXQtbmFtZT4KKyAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgVGhpcyBzZXJ2bGV0IHBsYXlzIHRoZSAiY29udHJvbGxlciIgcm9sZSBpbiB0aGUgTVZDIGFyY2hpdGVjdHVyZQorICAgICAgICB1c2VkIGluIHRoaXMgYXBwbGljYXRpb24uICBJdCBpcyBnZW5lcmFsbHkgbWFwcGVkIHRvIHRoZSAiLmRvIgorICAgICAgICBmaWxlbmFtZSBleHRlbnNpb24gd2l0aCBhIHNlcnZsZXQtbWFwcGluZyBlbGVtZW50LCBhbmQgYWxsIGZvcm0KKyAgICAgICAgc3VibWl0cyBpbiB0aGUgYXBwIHdpbGwgYmUgc3VibWl0dGVkIHRvIGEgcmVxdWVzdCBVUkkgbGlrZQorICAgICAgICAic2F2ZUN1c3RvbWVyLmRvIiwgd2hpY2ggd2lsbCB0aGVyZWZvcmUgYmUgbWFwcGVkIHRvIHRoaXMgc2VydmxldC4KKworICAgICAgICBUaGUgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyIG5hbWVzcyBmb3IgdGhpcyBzZXJ2bGV0IGFyZSB0aGUKKyAgICAgICAgInNlcnZsZXQgcGF0aCIgdGhhdCB3aWxsIGJlIHJlY2VpdmVkIGJ5IHRoaXMgc2VydmxldCAoYWZ0ZXIgdGhlCisgICAgICAgIGZpbGVuYW1lIGV4dGVuc2lvbiBpcyByZW1vdmVkKS4gIFRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIGlzIHRoZQorICAgICAgICBuYW1lIG9mIHRoZSBhY3Rpb24gY2xhc3MgdGhhdCB3aWxsIGJlIHVzZWQgdG8gcHJvY2VzcyB0aGlzIHJlcXVlc3QuCisgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPHNlcnZsZXQtY2xhc3M+Y29tLm15Y29tcGFueS5teXBhY2thZ2UuQ29udHJvbGxlclNlcnZsZXQ8L3NlcnZsZXQtY2xhc3M+CisgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgPHBhcmFtLW5hbWU+bGlzdE9yZGVyczwvcGFyYW0tbmFtZT4KKyAgICAgICAgPHBhcmFtLXZhbHVlPmNvbS5teWNvbXBhbnkubXlhY3Rpb25zLkxpc3RPcmRlcnNBY3Rpb248L3BhcmFtLXZhbHVlPgorICAgICAgPC9pbml0LXBhcmFtPgorICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgIDxwYXJhbS1uYW1lPnNhdmVDdXN0b21lcjwvcGFyYW0tbmFtZT4KKyAgICAgICAgPHBhcmFtLXZhbHVlPmNvbS5teWNvbXBhbnkubXlhY3Rpb25zLlNhdmVDdXN0b21lckFjdGlvbjwvcGFyYW0tdmFsdWU+CisgICAgICA8L2luaXQtcGFyYW0+CisgICAgICA8IS0tIExvYWQgdGhpcyBzZXJ2bGV0IGF0IHNlcnZlciBzdGFydHVwIHRpbWUgLS0+CisgICAgICA8bG9hZC1vbi1zdGFydHVwPjU8L2xvYWQtb24tc3RhcnR1cD4KKyAgICA8L3NlcnZsZXQ+CisKKyAgICA8c2VydmxldD4KKyAgICAgIDxzZXJ2bGV0LW5hbWU+Z3JhcGg8L3NlcnZsZXQtbmFtZT4KKyAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgVGhpcyBzZXJ2bGV0IHByb2R1Y2VzIEdJRiBpbWFnZXMgdGhhdCBhcmUgZHluYW1pY2FsbHkgZ2VuZXJhdGVkCisgICAgICAgIGdyYXBocywgYmFzZWQgb24gdGhlIGlucHV0IHBhcmFtZXRlcnMgaW5jbHVkZWQgb24gdGhlIHJlcXVlc3QuCisgICAgICAgIEl0IGlzIGdlbmVyYWxseSBtYXBwZWQgdG8gYSBzcGVjaWZpYyByZXF1ZXN0IFVSSSBsaWtlICIvZ3JhcGgiLgorICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICA8L3NlcnZsZXQ+CisKKworICAgIDwhLS0gRGVmaW5lIG1hcHBpbmdzIHRoYXQgYXJlIHVzZWQgYnkgdGhlIHNlcnZsZXQgY29udGFpbmVyIHRvCisgICAgICAgICB0cmFuc2xhdGUgYSBwYXJ0aWN1bGFyIHJlcXVlc3QgVVJJIChjb250ZXh0LXJlbGF0aXZlKSB0byBhCisgICAgICAgICBwYXJ0aWN1bGFyIHNlcnZsZXQuICBUaGUgZXhhbXBsZXMgYmVsb3cgY29ycmVzcG9uZCB0byB0aGUKKyAgICAgICAgIHNlcnZsZXQgZGVzY3JpcHRpb25zIGFib3ZlLiAgVGh1cywgYSByZXF1ZXN0IFVSSSBsaWtlOgorCisgICAgICAgICAgIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC97Y29udGV4dHBhdGh9L2dyYXBoCisKKyAgICAgICAgIHdpbGwgYmUgbWFwcGVkIHRvIHRoZSAiZ3JhcGgiIHNlcnZsZXQsIHdoaWxlIGEgcmVxdWVzdCBsaWtlOgorCisgICAgICAgICAgIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC97Y29udGV4dHBhdGh9L3NhdmVDdXN0b21lci5kbworCisgICAgICAgICB3aWxsIGJlIG1hcHBlZCB0byB0aGUgImNvbnRyb2xsZXIiIHNlcnZsZXQuCisKKyAgICAgICAgIFlvdSBtYXkgZGVmaW5lIGFueSBudW1iZXIgb2Ygc2VydmxldCBtYXBwaW5ncywgaW5jbHVkaW5nIHplcm8uCisgICAgICAgICBJdCBpcyBhbHNvIGxlZ2FsIHRvIGRlZmluZSBtb3JlIHRoYW4gb25lIG1hcHBpbmcgZm9yIHRoZSBzYW1lCisgICAgICAgICBzZXJ2bGV0LCBpZiB5b3Ugd2lzaCB0by4KKyAgICAtLT4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICA8c2VydmxldC1uYW1lPmNvbnRyb2xsZXI8L3NlcnZsZXQtbmFtZT4KKyAgICAgIDx1cmwtcGF0dGVybj4qLmRvPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICA8c2VydmxldC1uYW1lPmdyYXBoPC9zZXJ2bGV0LW5hbWU+CisgICAgICA8dXJsLXBhdHRlcm4+L2dyYXBoPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworCisgICAgPCEtLSBEZWZpbmUgdGhlIGRlZmF1bHQgc2Vzc2lvbiB0aW1lb3V0IGZvciB5b3VyIGFwcGxpY2F0aW9uLAorICAgICAgICAgaW4gbWludXRlcy4gIEZyb20gYSBzZXJ2bGV0IG9yIEpTUCBwYWdlLCB5b3UgY2FuIG1vZGlmeQorICAgICAgICAgdGhlIHRpbWVvdXQgZm9yIGEgcGFydGljdWxhciBzZXNzaW9uIGR5bmFtaWNhbGx5IGJ5IHVzaW5nCisgICAgICAgICBIdHRwU2Vzc2lvbi5nZXRNYXhJbmFjdGl2ZUludGVydmFsKCkuIC0tPgorCisgICAgPHNlc3Npb24tY29uZmlnPgorICAgICAgPHNlc3Npb24tdGltZW91dD4zMDwvc2Vzc2lvbi10aW1lb3V0PiAgICA8IS0tIDMwIG1pbnV0ZXMgLS0+CisgICAgPC9zZXNzaW9uLWNvbmZpZz4KKworCis8L3dlYi1hcHA+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9kb2NzL2FyY2hpdGVjdHVyZS9pbmRleC54bWwgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2FyY2hpdGVjdHVyZS9pbmRleC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTMyMGFjMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvYXJjaGl0ZWN0dXJlL2luZGV4LnhtbApAQCAtMCwwICsxLDUzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhRE9DVFlQRSBkb2N1bWVudCBbCisgIDwhRU5USVRZIHByb2plY3QgU1lTVEVNICJwcm9qZWN0LnhtbCI+CitdPgorPGRvY3VtZW50IHVybD0iaW5kZXguaHRtbCI+CisKKyAgJnByb2plY3Q7CisKKyAgPHByb3BlcnRpZXM+CisgICAgPGF1dGhvciBlbWFpbD0ieW9hdnNAYXBhY2hlLm9yZyI+WW9hdiBTaGFwaXJhPC9hdXRob3I+CisgICAgPHRpdGxlPlRhYmxlIG9mIENvbnRlbnRzPC90aXRsZT4KKyAgPC9wcm9wZXJ0aWVzPgorCis8Ym9keT4KKworCis8c2VjdGlvbiBuYW1lPSJQcmVmYWNlIj4KKworPHA+VGhpcyBzZWN0aW9uIG9mIHRoZSBUb21jYXQgZG9jdW1lbnRhdGlvbiBhdHRlbXB0cyB0byBleHBsYWluCit0aGUgYXJjaGl0ZWN0dXJlIGFuZCBkZXNpZ24gb2YgdGhlIFRvbWNhdCBzZXJ2ZXIuICBJdCBpbmNsdWRlcyBzaWduaWZpY2FudAorY29udHJpYnV0aW9ucyBmcm9tIHNldmVyYWwgdG9tY2F0IGRldmVsb3BlcnM6Cis8L3A+Cis8dWw+Cis8bGk+WW9hdiBTaGFwaXJhCisgICAgKDxhIGhyZWY9Im1haWx0bzp5b2F2c0BhcGFjaGUub3JnIj55b2F2c0BhcGFjaGUub3JnPC9hPik8L2xpPgorPGxpPkplYW5mcmFuY29pcyBBcmNhbmQKKyAgICAoPGEgaHJlZj0ibWFpbHRvOmpmYXJjYW5kQGFwYWNoZS5vcmciPmpmYXJjYW5kQGFwYWNoZS5vcmc8L2E+KTwvbGk+Cis8bGk+RmlsaXAgSGFuaWsKKyAgICAoPGEgaHJlZj0ibWFpbHRvOmZoYW5pa0BhcGFjaGUub3JnIj5maGFuaWtAYXBhY2hlLm9yZzwvYT4pPC9saT4KKzwvdWw+CisKKzwvc2VjdGlvbj4KKworCis8c2VjdGlvbiBuYW1lPSJUYWJsZSBvZiBDb250ZW50cyI+CisKKzxwPlRoZSBpbmZvcm1hdGlvbiBwcmVzZW50ZWQgaXMgZGl2aWRlZCBpbnRvIHRoZSBmb2xsb3dpbmcgc2VjdGlvbnM6PC9wPgorPHVsPgorPGxpPjxhIGhyZWY9Im92ZXJ2aWV3Lmh0bWwiPjxzdHJvbmc+T3ZlcnZpZXc8L3N0cm9uZz48L2E+IC0KKyAgICBBbiBvdmVydmlldyBvZiB0aGUgVG9tY2F0IHNlcnZlciBhcmNoaXRlY3R1cmUgd2l0aCBrZXkgdGVybXMKKyAgICBhbmQgY29uY2VwdHMuPC9saT4KKzxsaT48YSBocmVmPSJzdGFydHVwLmh0bWwiPjxzdHJvbmc+U2VydmVyIFN0YXJ0dXA8L3N0cm9uZz48L2E+IC0KKyAgICBBIGRldGFpbGVkIGRlc2NyaXB0aW9uLCB3aXRoIHNlcXVlbmNlIGRpYWdyYW1zLCBvZiBob3cgdGhlIFRvbWNhdAorICAgIHNlcnZlciBzdGFydHMgdXAuPC9saT4KKzxsaT48YSBocmVmPSJyZXF1ZXN0UHJvY2Vzcy5odG1sIj48c3Ryb25nPlJlcXVlc3QgUHJvY2VzcyBGbG93PC9zdHJvbmc+PC9hPiAtCisgICAgQSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiBob3cgVG9tY2F0IGhhbmRsZXMgYSByZXF1ZXN0LjwvbGk+Cis8L3VsPgorCis8L3NlY3Rpb24+CisKKworPC9ib2R5PgorPC9kb2N1bWVudD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvYXJjaGl0ZWN0dXJlL292ZXJ2aWV3LnhtbCBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvYXJjaGl0ZWN0dXJlL292ZXJ2aWV3LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWIxNGJjCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9hcmNoaXRlY3R1cmUvb3ZlcnZpZXcueG1sCkBAIC0wLDAgKzEsMTIzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhRE9DVFlQRSBkb2N1bWVudCBbCisgIDwhRU5USVRZIHByb2plY3QgU1lTVEVNICJwcm9qZWN0LnhtbCI+CitdPgorPGRvY3VtZW50IHVybD0ib3ZlcnZpZXcuaHRtbCI+CisKKyAgJnByb2plY3Q7CisKKyAgPHByb3BlcnRpZXM+CisgICAgPGF1dGhvciBlbWFpbD0ieW9hdnNAYXBhY2hlLm9yZyI+WW9hdiBTaGFwaXJhPC9hdXRob3I+CisgICAgPHRpdGxlPkFyY2hpdGVjdHVyZSBPdmVydmlldzwvdGl0bGU+CisgIDwvcHJvcGVydGllcz4KKworPGJvZHk+CisKKworPHNlY3Rpb24gbmFtZT0iT3ZlcnZpZXciPgorPHA+CitUaGlzIHBhZ2UgcHJvdmlkZXMgYW4gb3ZlcnZpZXcgb2YgdGhlIFRvbWNhdCBzZXJ2ZXIgYXJjaGl0ZWN0dXJlLgorPC9wPgorPC9zZWN0aW9uPgorCis8c2VjdGlvbiBuYW1lPSJUZXJtcyI+CisKKzxzdWJzZWN0aW9uIG5hbWU9IlNlcnZlciI+Cis8cD4KK0luIHRoZSBUb21jYXQgd29ybGQsIGEKKzxhIGhyZWY9Ii4uL2NvbmZpZy9zZXJ2ZXIuaHRtbCI+U2VydmVyPC9hPiByZXByZXNlbnRzIHRoZSB3aG9sZSBjb250YWluZXIuCitUb21jYXQgcHJvdmlkZXMgYSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoZSAKKzxhIGhyZWY9Ii4uL2NhdGFsaW5hL2RvY3MvYXBpL29yZy9hcGFjaGUvY2F0YWxpbmEvU2VydmVyLmh0bWwiPlNlcnZlciBpbnRlcmZhY2UuPC9hPiwKK2FuZCB0aGlzIGlzIHJhcmVseSBjdXN0b21pemVkIGJ5IHVzZXJzLgorPC9wPgorPC9zdWJzZWN0aW9uPgorCis8c3Vic2VjdGlvbiBuYW1lPSJTZXJ2aWNlIj4KKzxwPgorQSA8YSBocmVmPSIuLi9jb25maWcvc2VydmljZS5odG1sIj5TZXJ2aWNlPC9hPiBpcyBhbiBpbnRlcm1lZGlhdGUgY29tcG9uZW50Cit3aGljaCBsaXZlcyBpbnNpZGUgYSBTZXJ2ZXIgYW5kIHRpZXMgb25lIG9yIG1vcmUgQ29ubmVjdG9ycyB0byBleGFjdGx5IG9uZQorRW5naW5lLiAgVGhlIFNlcnZpY2UgZWxlbWVudCBpcyByYXJlbHkgY3VzdG9taXplZCBieSB1c2VycywgYXMgdGhlIGRlZmF1bHQKK2ltcGxlbWVudGF0aW9uIGlzIHNpbXBsZSBhbmQgc3VmZmljaWVudDoKKzxhIGhyZWY9Ii4uL2NhdGFsaW5hL2RvY3MvYXBpL29yZy9hcGFjaGUvY2F0YWxpbmEvU2VydmljZS5odG1sIj5TZXJ2aWNlIGludGVyZmFjZTwvYT4uCis8L3A+Cis8L3N1YnNlY3Rpb24+CisKKzxzdWJzZWN0aW9uIG5hbWU9IkVuZ2luZSI+Cis8cD4KK0FuCis8YSBocmVmPSIuLi9jb25maWcvZW5naW5lLmh0bWwiPkVuZ2luZTwvYT4gcmVwcmVzZW50cyByZXF1ZXN0IHByb2Nlc3NpbmcKK3BpcGVsaW5lIGZvciBhIHNwZWNpZmljIFNlcnZpY2UuICBBcyBhIFNlcnZpY2UgbWF5IGhhdmUgbXVsdGlwbGUgQ29ubmVjdG9ycywKK3RoZSBFbmdpbmUgcmVjZWl2ZWQgYW5kIHByb2Nlc3NlcyBhbGwgcmVxdWVzdHMgZnJvbSB0aGVzZSBjb25uZWN0b3JzLCBoYW5kaW5nCit0aGUgcmVzcG9uc2UgYmFjayB0byB0aGUgYXBwcm9wcmlhdGUgY29ubmVjdG9yIGZvciB0cmFuc21pc3Npb24gdG8gdGhlIGNsaWVudC4KK1RoZSA8YSBocmVmPSIuLi9jYXRhbGluYS9kb2NzL2FwaS9vcmcvYXBhY2hlL2NhdGFsaW5hL0VuZ2luZS5odG1sIj5FbmdpbmUgaW50ZXJmYWNlPC9hPgorbWF5IGJlIGltcGxlbWVudGVkIHRvIHN1cHBseSBjdXN0b20gRW5naW5lcywgdGhvdWdoIHRoaXMgaXMgdW5jb21tb24uCis8L3A+Cis8cD4KK05vdGUgdGhhdCB0aGUgRW5naW5lIG1heSBiZSB1c2VkIGZvciBUb21jYXQgc2VydmVyIGNsdXN0ZXJpbmcgdmlhIHRoZQoranZtUm91dGUgcGFyYW1ldGVyLiAgUmVhZCB0aGUgQ2x1c3RlcmluZyBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLgorPC9wPgorPC9zdWJzZWN0aW9uPgorCis8c3Vic2VjdGlvbiBuYW1lPSJIb3N0Ij4KKzxwPgorQSA8YSBocmVmPSIuLi9jb25maWcvaG9zdC5odG1sIj5Ib3N0PC9hPiBpcyBhbiBhc3NvY2lhdGlvbiBvZiBhIG5ldHdvcmsgbmFtZSwKK2UuZy4gd3d3LnlvdXJjb21wYW55LmNvbSwgdG8gdGhlIFRvbWNhdCBzZXJ2ZXIuICBBbiBFbmdpbmUgbWF5IGNvbnRhaW4KK211bHRpcGxlIGhvc3RzLCBhbmQgdGhlIEhvc3QgZWxlbWVudCBhbHNvIHN1cHBvcnRzIG5ldHdvcmsgYWxpYXNlcyBzdWNoIGFzCit5b3VyY29tcGFueS5jb20gYW5kIGFiYy55b3VyY29tcGFueS5jb20uICBVc2VycyByYXJlbHkgY3JlYXRlIGN1c3RvbQorPGEgaHJlZj0iLi4vY2F0YWxpbmEvZG9jcy9hcGkvb3JnL2FwYWNoZS9jYXRhbGluYS9Ib3N0Lmh0bWwiPkhvc3RzPC9hPgorYmVjYXVzZSB0aGUgCis8YSBocmVmPSIuLi9jYXRhbGluYS9kb2NzL2FwaS9vcmcvYXBhY2hlL2NhdGFsaW5hL2NvcmUvU3RhbmRhcmRIb3N0Lmh0bWwiPlN0YW5kYXJkSG9zdAoraW1wbGVtZW50YXRpb248L2E+IHByb3ZpZGVzIHNpZ25pZmljYW50IGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eS4KKzwvcD4KKzwvc3Vic2VjdGlvbj4KKworPHN1YnNlY3Rpb24gbmFtZT0iQ29ubmVjdG9yIj4KKzxwPgorQSBDb25uZWN0b3IgaGFuZGxlcyBjb21tdW5pY2F0aW9ucyB3aXRoIHRoZSBjbGllbnQuICBUaGVyZSBhcmUgbXVsdGlwbGUKK2Nvbm5lY3RvcnMgYXZhaWxhYmxlIHdpdGggVG9tY2F0LCBhbGwgb2Ygd2hpY2ggaW1wbGVtZW50IHRoZSAKKzxhIGhyZWY9Ii4uL2NhdGFsaW5hL2RvY3MvYXBpL29yZy9hcGFjaGUvY2F0YWxpbmEvQ29ubmVjdG9yLmh0bWwiPkNvbm5lY3RvcgoraW50ZXJmYWNlLjwvYT4gIFRoZXNlIGluY2x1ZGUgdGhlCis8YSBocmVmPSIuLi9jb25maWcvY295b3RlLmh0bWwiPkNveW90ZSBjb25uZWN0b3I8L2E+IHdoaWNoIGlzIHVzZWQgZm9yCittb3N0IEhUVFAgdHJhZmZpYywgZXNwZWNpYWxseSB3aGVuIHJ1bm5pbmcgVG9tY2F0IGFzIGEgc3RhbmRhbG9uZSBzZXJ2ZXIsIAorYW5kIHRoZSA8YSBocmVmPSIuLi9jb25maWcvamsyLmh0bWwiPkpLMiBjb25uZWN0b3I8L2E+IHdoaWNoIGltcGxlbWVudHMKK3RoZSBBSlAgcHJvY290b2wgdXNlZCB3aGVuIGNvbm5lY3RpbmcgVG9tY2F0IHRvIGFuIEFwYWNoZSBIVFRQRCBzZXJ2ZXIuCitDcmVhdGluZyBhIGN1c3RvbWl6ZWQgY29ubmVjdG9yIGlzIGEgc2lnbmlmaWNhbnQgZWZmb3J0LgorPC9wPgorPC9zdWJzZWN0aW9uPgorCis8c3Vic2VjdGlvbiBuYW1lPSJDb250ZXh0Ij4KKzxwPgorQQorPGEgaHJlZj0iLi4vY29uZmlnL2NvbnRleHQuaHRtbCI+Q29udGV4dDwvYT4KK3JlcHJlc2VudHMgYSB3ZWIgYXBwbGljYXRpb24uICBBIEhvc3QgbWF5IGNvbnRhaW4gbXVsdGlwbGUKK2NvbnRleHRzLCBlYWNoIHdpdGggYSB1bmlxdWUgcGF0aC4gIFRoZQorPGEgaHJlZj0iLi4vY2F0YWxpbmEvZG9jcy9hcGkvb3JnL2FwYWNoZS9jYXRhbGluYS9Db250ZXh0Lmh0bWwiPkNvbnRleHQKK2ludGVyZmFjZTwvYT4gbWF5IGJlIGltcGxlbWVudGVkIHRvIGNyZWF0ZSBjdXN0b20gQ29udGV4dHMsIGJ1dAordGhpcyBpcyByYXJlbHkgdGhlIGNhc2UgYmVjYXVzZSB0aGUKKzxhIGhyZWY9Ii4uL2NhdGFsaW5hL2RvY3MvYXBpL29yZy9hcGFjaGUvY2F0YWxpbmEvY29yZS9TdGFuZGFyZENvbnRleHQuaHRtbCI+CitTdGFuZGFyZENvbnRleHQ8L2E+IHByb3ZpZGVzIHNpZ25pZmljYW50IGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eS4KKzwvcD4KKzwvc3Vic2VjdGlvbj4KKzwvc2VjdGlvbj4KKworPHNlY3Rpb24gbmFtZT0iQ29tbWVudHMiPgorPHA+CitUb21jYXQgaXMgZGVzaWduZWQgdG8gYmUgYSBmYXN0IGFuZCBlZmZpY2llbnQgaW1wbGVtZW50YXRpb24gb2YgdGhlCitTZXJ2bGV0IFNwZWNpZmljYXRpb24uICBUb21jYXQgY2FtZSBhYm91dCBhcyB0aGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uCitvZiB0aGlzIHNwZWNpZmljYXRpb24sIGFuZCBoYXMgcmVtYWluZWQgcmlnb3JvdXMgaW4gYWRoZXJpbmcgdG8gdGhlCitzcGVjaWZpY2F0aW9uLiAgQXQgdGhlIHNhbWUgdGltZSwgc2lnbmlmaWNhbnQgYXR0ZW50aW9uIGhhcyBiZWVuIHBhaWQKK3RvIFRvbWNhdCdzIHBlcmZvcm1hbmNlIGFuZCBpdCBpcyBub3cgb24gcGFyIHdpdGggb3RoZXIgc2VydmxldCBjb250YWluZXJzLAoraW5jbHVkaW5nIGNvbW1lcmNpYWwgb25lcy4KKzwvcD4KKzxwPgorSW4gcmVjZW50IHJlbGVhc2VzIG9mIFRvbWNhdCwgbW9zdGx5IHN0YXJ0aW5nIHdpdGggVG9tY2F0IDUsCit3ZSBoYXZlIGJlZ3VuIGVmZm90cyB0byBtYWtlIG1vcmUgYXNwZWN0cyBvZiBUb21jYXQgbWFuYWdhYmxlIHZpYQorSk1YLiAgSW4gYWRkaXRpb24sIHRoZSBNYW5hZ2VyIGFuZCBBZG1pbiB3ZWJhcHBzIGhhdmUgYmVlbiBncmVhdGx5CitlbmhhbmNlZCBhbmQgaW1wcm92ZWQuICBNYW5hZ2FiaWxpdHkgaXMgYSBwcmltYXJ5IGFyZWEgb2YgY29uY2VybgorZm9yIHVzIGFzIHRoZSBwcm9kdWN0IG1hdHVyZXMgYW5kIHRoZSBzcGVjaWZpY2F0aW9uIGJlY29tZXMgbW9yZQorc3RhYmxlLgorPC9wPgorPC9zZWN0aW9uPgorCis8L2JvZHk+Cis8L2RvY3VtZW50PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9hcmNoaXRlY3R1cmUvcHJvamVjdC54bWwgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2FyY2hpdGVjdHVyZS9wcm9qZWN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2QyNWIzCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9hcmNoaXRlY3R1cmUvcHJvamVjdC54bWwKQEAgLTAsMCArMSwyNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgorPHByb2plY3QgbmFtZT0iVG9tY2F0IEFyY2hpdGVjdHVyZSIKKyAgICAgICAgaHJlZj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy90b21jYXQvIj4KKworICAgIDx0aXRsZT5Ub21jYXQgQXJjaGl0ZWN0dXJlPC90aXRsZT4KKworICAgIDxsb2dvIGhyZWY9Ii9pbWFnZXMvdG9tY2F0LmdpZiI+CisgICAgICBUaGUgVG9tY2F0IFNlcnZsZXQvSlNQIENvbnRhaW5lcgorICAgIDwvbG9nbz4KKworICAgIAorICAgIDxib2R5PgorCisgICAgPG1lbnUgbmFtZT0iTGlua3MiPgorICAgICAgICA8aXRlbSBuYW1lPSJEb2NzIEhvbWUiICAgICAgICAgICAgIGhyZWY9Ii4uL2luZGV4Lmh0bWwiIC8+CisgICAgPC9tZW51PgorCisgICAgPG1lbnUgbmFtZT0iQ29udGVudHMiPgorICAgICAgICA8aXRlbSBuYW1lPSJDb250ZW50cyIgICAgICAgICAgICAgIGhyZWY9ImluZGV4Lmh0bWwiIC8+CisgICAgICAgIDxpdGVtIG5hbWU9Ik92ZXJ2aWV3IiAgICAgICAgICAgICAgaHJlZj0ib3ZlcnZpZXcuaHRtbCIgLz4KKyAgICAgICAgPGl0ZW0gbmFtZT0iU2VydmVyIFN0YXJ0dXAiICAgICAgICBocmVmPSJzdGFydHVwLmh0bWwiIC8+CisgICAgICAgIDxpdGVtIG5hbWU9IlJlcXVlc3QgUHJvY2VzcyIgICAgICAgaHJlZj0icmVxdWVzdFByb2Nlc3MuaHRtbCIgLz4KKyAgICA8L21lbnU+CisKKyAgICA8L2JvZHk+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9kb2NzL2FyY2hpdGVjdHVyZS9yZXF1ZXN0UHJvY2Vzcy54bWwgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2FyY2hpdGVjdHVyZS9yZXF1ZXN0UHJvY2Vzcy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmEzNTliZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvYXJjaGl0ZWN0dXJlL3JlcXVlc3RQcm9jZXNzLnhtbApAQCAtMCwwICsxLDUzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhRE9DVFlQRSBkb2N1bWVudCBbCisgIDwhRU5USVRZIHByb2plY3QgU1lTVEVNICJwcm9qZWN0LnhtbCI+CitdPgorPGRvY3VtZW50IHVybD0icmVxdWVzdFByb2Nlc3MuaHRtbCI+CisKKyAgJnByb2plY3Q7CisKKyAgPHByb3BlcnRpZXM+CisgICAgPGF1dGhvciBlbWFpbD0ieW9hdnNAYXBhY2hlLm9yZyI+WW9hdiBTaGFwaXJhPC9hdXRob3I+CisgICAgPHRpdGxlPlJlcXVlc3QgUHJvY2VzcyBGbG93PC90aXRsZT4KKyAgPC9wcm9wZXJ0aWVzPgorCis8Ym9keT4KKworCis8c2VjdGlvbiBuYW1lPSJSZXF1ZXN0IFByb2Nlc3MgRmxvdyI+CisKKzxwPgorVGhpcyBwYWdlIGRlc2NyaWJlcyB0aGUgcHJvY2VzcyB1c2VkIGJ5IFRvbWNhdCB0byBoYW5kbGUKK2FuIGluY29taW5nIHJlcXVlc3QuICBUaGlzIHByb2Nlc3MgaXMgbGFyZ2VseSBkZWZpbmVkIGJ5Cit0aGUgU2VydmxldCBTcGVjaWZpY2F0aW9uLCB3aGljaCBvdXRsaW5lcyB0aGUgb3JkZXIKK29mIGV2ZW50cyB0aGF0IG11c3QgdGFrZSBwbGFjZS4KKzwvcD4KKworPHN1YnNlY3Rpb24gbmFtZT0iZGVzY3JpcHRpb24iPgorPHA+CitUT0RPCis8L3A+Cis8L3N1YnNlY3Rpb24+CisKKzxzdWJzZWN0aW9uIG5hbWU9ImRpYWdyYW0iPgorPHA+CitBIFVNTCBzZXF1ZW5jZSBkaWFncmFtIG9mIHRoZSByZXF1ZXN0IHByb2Nlc3MgaXMgYXZhaWxhYmxlCis8YSBocmVmPSJyZXF1ZXN0UHJvY2Vzcy9yZXF1ZXN0UHJvY2Vzcy5wZGYiPmhlcmUuPC9hPgorPC9wPgorPC9zdWJzZWN0aW9uPgorCis8c3Vic2VjdGlvbiBuYW1lPSJjb21tZW50cyI+Cis8cD4KK1RoZSBTZXJ2bGV0IFNwZWNpZmljYXRpb24gcHJvdmlkZXMgbWFueSBvcHBvcnR1bml0aWVzIGZvcgorbGlzdGVuaW5nIGluICh1c2luZyBMaXN0ZW5lcnMpIG9yIG1vZGl5aW5nICh1c2luZyBGaWx0ZXJzKQordGhlIHJlcXVlc3QgaGFuZGxpbmcgcHJvY2VzcyBldmVuIGJlZm9yZSB0aGUgcmVxdWVzdCBhcnJpdmVzCithdCB0aGUgc2VydmxldCB0aGF0IHdpbGwgaGFuZGxlIGl0LgorPC9wPgorCis8L3N1YnNlY3Rpb24+CisKKzwvc2VjdGlvbj4KKworCis8L2JvZHk+Cis8L2RvY3VtZW50PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9hcmNoaXRlY3R1cmUvcmVxdWVzdFByb2Nlc3MvcmVxdWVzdFByb2Nlc3MucGRmIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9hcmNoaXRlY3R1cmUvcmVxdWVzdFByb2Nlc3MvcmVxdWVzdFByb2Nlc3MucGRmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhMTcxZGUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2FyY2hpdGVjdHVyZS9yZXF1ZXN0UHJvY2Vzcy9yZXF1ZXN0UHJvY2Vzcy5wZGYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9hcmNoaXRlY3R1cmUvcmVxdWVzdFByb2Nlc3Mvcm9zZU1vZGVsLm1kbCBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvYXJjaGl0ZWN0dXJlL3JlcXVlc3RQcm9jZXNzL3Jvc2VNb2RlbC5tZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU5YzJlZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvYXJjaGl0ZWN0dXJlL3JlcXVlc3RQcm9jZXNzL3Jvc2VNb2RlbC5tZGwKQEAgLTAsMCArMSwxMjkyMSBAQAorCisob2JqZWN0IFBldGFsCisgICAgdmVyc2lvbiAgICAJNDUKKyAgICBfd3JpdHRlbiAgIAkiUm9zZSA3LjYuMDEwOS4yMzE0IgorICAgIGNoYXJTZXQgICAgCTApCisKKyhvYmplY3QgRGVzaWduICJMb2dpY2FsIFZpZXciCisgICAgaXNfdW5pdCAgICAJVFJVRQorICAgIGlzX2xvYWRlZCAgCVRSVUUKKyAgICBxdWlkICAgICAgIAkiM0RGREY2Q0UwMzM3IgorICAgIGRlZmF1bHRzICAgCShvYmplY3QgZGVmYXVsdHMKKwlyaWdodE1hcmdpbiAJMC4yNTAwMDAKKwlsZWZ0TWFyZ2luIAkwLjI1MDAwMAorCXRvcE1hcmdpbiAgCTAuMjUwMDAwCisJYm90dG9tTWFyZ2luIAkwLjUwMDAwMAorCXBhZ2VPdmVybGFwIAkwLjI1MDAwMAorCWNsaXBJY29uTGFiZWxzIAlUUlVFCisJYXV0b1Jlc2l6ZSAJVFJVRQorCXNuYXBUb0dyaWQgCVRSVUUKKwlncmlkWCAgICAgIAkxNgorCWdyaWRZICAgICAgCTE2CisJZGVmYXVsdEZvbnQgCShvYmplY3QgRm9udAorCSAgICBzaXplICAgICAgIAkxMAorCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJICAgIGJvbGQgICAgICAgCUZBTFNFCisJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJICAgIHVuZGVybGluZSAgCUZBTFNFCisJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJICAgIGNvbG9yICAgICAgCTAKKwkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwlzaG93TWVzc2FnZU51bSAJMQorCXNob3dDbGFzc09mT2JqZWN0IAlUUlVFCisJbm90YXRpb24gICAJIlVuaWZpZWQiKQorICAgIHJvb3RfdXNlY2FzZV9wYWNrYWdlIAkob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJVc2UgQ2FzZSBWaWV3IgorCXF1aWQgICAgICAgCSIzREZERjZDRTAzNjkiCisJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKKwlnbG9iYWwgICAgIAlUUlVFCisJbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QpCisJbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0CisJICAgIChvYmplY3QgVXNlQ2FzZURpYWdyYW0gIk1haW4iCisJCXF1aWQgICAgICAgCSIzREZERjZEMjAxRkUiCisJCXRpdGxlICAgICAgCSJNYWluIgorCQl6b29tICAgICAgIAkxMDAKKwkJbWF4X2hlaWdodCAJMjgzNTAKKwkJbWF4X3dpZHRoICAJMjE2MDAKKwkJb3JpZ2luX3ggICAJMAorCQlvcmlnaW5feSAgIAkwCisJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0KSkpKQorICAgIHJvb3RfY2F0ZWdvcnkgCShvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgIkxvZ2ljYWwgVmlldyIKKwlxdWlkICAgICAgIAkiM0RGREY2Q0UwMzM4IgorCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCisJZ2xvYmFsICAgICAJVFJVRQorCXN1YnN5c3RlbSAgCSJDb21wb25lbnQgVmlldyIKKwlxdWlkdSAgICAgIAkiM0RGREY2Q0UwMzZBIgorCWxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0CisJICAgIChvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgIm9yZy5hcGFjaGUuY2F0YWxpbmEiCisJCXF1aWQgICAgICAgCSIzRTQyREU4RDAwODIiCisJCXZpc2libGVfY2F0ZWdvcmllcyAJKGxpc3QgdmlzaWJpbGl0eV9yZWxhdGlvbnNoaXBfbGlzdAorCQkgICAgKG9iamVjdCBWaXNpYmlsaXR5X1JlbGF0aW9uc2hpcAorCQkJcXVpZCAgICAgICAJIjNFNDJERUY2MDFFQiIKKwkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Om9yZy5hcGFjaGUudG9tY2F0LnV0aWwiCisJCQlxdWlkdSAgICAgIAkiM0U0MkRFREYwMUYyIikKKwkJICAgIChvYmplY3QgVmlzaWJpbGl0eV9SZWxhdGlvbnNoaXAKKwkJCXF1aWQgICAgICAgCSIzRTQyREY3MDAwNjAiCisJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpvcmcuYXBhY2hlLmNveW90ZSIKKwkJCXF1aWR1ICAgICAgCSIzRTQyREU5RjAxMzIiKQorCQkgICAgKG9iamVjdCBWaXNpYmlsaXR5X1JlbGF0aW9uc2hpcAorCQkJcXVpZCAgICAgICAJIjNFNDNEMTY1MDM5QyIKKwkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Om9yZy5hcGFjaGUubmFtaW5nIgorCQkJcXVpZHUgICAgICAJIjNFNDNEMTU4MDMzOSIpKQorCQlleHBvcnRDb250cm9sIAkiUHVibGljIgorCQlsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdAorCQkgICAgKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiYW50IgorCQkJcXVpZCAgICAgICAJIjNFNDJERkJCMDM3RiIKKwkJCXZpc2libGVfY2F0ZWdvcmllcyAJKGxpc3QgdmlzaWJpbGl0eV9yZWxhdGlvbnNoaXBfbGlzdAorCQkJICAgIChvYmplY3QgVmlzaWJpbGl0eV9SZWxhdGlvbnNoaXAKKwkJCQlxdWlkICAgICAgIAkiM0U0M0NGRjcwMjBGIgorCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Om9yZy5hcGFjaGUuY2F0YWxpbmE6OnV0aWwiCisJCQkJcXVpZHUgICAgICAJIjNFNDJFMDI2MDE4NCIpKQorCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKKwkJCWxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0KQorCQkJbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0KSkKKwkJICAgIChvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgImF1dGhlbnRpY2F0b3IiCisJCQlxdWlkICAgICAgIAkiM0U0MkRGQzcwMkI0IgorCQkJdmlzaWJsZV9jYXRlZ29yaWVzIAkobGlzdCB2aXNpYmlsaXR5X3JlbGF0aW9uc2hpcF9saXN0CisJCQkgICAgKG9iamVjdCBWaXNpYmlsaXR5X1JlbGF0aW9uc2hpcAorCQkJCXF1aWQgICAgICAgCSIzRTQzRDAzQzAzOTUiCisJCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6b3JnLmFwYWNoZS5jYXRhbGluYTo6ZGVwbG95IgorCQkJCXF1aWR1ICAgICAgCSIzRTQyREZEQzAzNDAiKQorCQkJICAgIChvYmplY3QgVmlzaWJpbGl0eV9SZWxhdGlvbnNoaXAKKwkJCQlxdWlkICAgICAgIAkiM0U0M0QwM0YwMUMyIgorCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Om9yZy5hcGFjaGUuY2F0YWxpbmE6OnV0aWwiCisJCQkJcXVpZHUgICAgICAJIjNFNDJFMDI2MDE4NCIpCisJCQkgICAgKG9iamVjdCBWaXNpYmlsaXR5X1JlbGF0aW9uc2hpcAorCQkJCXF1aWQgICAgICAgCSIzRTQzRDA0MzAyNEEiCisJCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6b3JnLmFwYWNoZS5jYXRhbGluYTo6dmFsdmVzIgorCQkJCXF1aWR1ICAgICAgCSIzRTQyRTAyRDAzNUIiKSkKKwkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCisJCQlsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdCkKKwkJCWxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdCkpCisJCSAgICAob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJjb25uZWN0b3IiCisJCQlxdWlkICAgICAgIAkiM0U0MkRGQ0YwMzZBIgorCQkJdmlzaWJsZV9jYXRlZ29yaWVzIAkobGlzdCB2aXNpYmlsaXR5X3JlbGF0aW9uc2hpcF9saXN0CisJCQkgICAgKG9iamVjdCBWaXNpYmlsaXR5X1JlbGF0aW9uc2hpcAorCQkJCXF1aWQgICAgICAgCSIzRTQzRDA3RTAxN0QiCisJCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6b3JnLmFwYWNoZS5jYXRhbGluYTo6c2Vzc2lvbiIKKwkJCQlxdWlkdSAgICAgIAkiM0U0MkUwMEMwMjZEIikpCisJCQlleHBvcnRDb250cm9sIAkiUHVibGljIgorCQkJbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QpCisJCQlsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QpKQorCQkgICAgKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiY29yZSIKKwkJCXF1aWQgICAgICAgCSIzRTQyREZENjAzQkEiCisJCQl2aXNpYmxlX2NhdGVnb3JpZXMgCShsaXN0IHZpc2liaWxpdHlfcmVsYXRpb25zaGlwX2xpc3QKKwkJCSAgICAob2JqZWN0IFZpc2liaWxpdHlfUmVsYXRpb25zaGlwCisJCQkJcXVpZCAgICAgICAJIjNFNDNEMTlFMDFBOSIKKwkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpvcmcuYXBhY2hlLmNhdGFsaW5hOjpkZXBsb3kiCisJCQkJcXVpZHUgICAgICAJIjNFNDJERkRDMDM0MCIpCisJCQkgICAgKG9iamVjdCBWaXNpYmlsaXR5X1JlbGF0aW9uc2hpcAorCQkJCXF1aWQgICAgICAgCSIzRTQzRDFBMTAxODUiCisJCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6b3JnLmFwYWNoZS5jYXRhbGluYTo6dXRpbCIKKwkJCQlxdWlkdSAgICAgIAkiM0U0MkUwMjYwMTg0IikKKwkJCSAgICAob2JqZWN0IFZpc2liaWxpdHlfUmVsYXRpb25zaGlwCisJCQkJcXVpZCAgICAgICAJIjNFNDNEMUNFMDA3QyIKKwkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpvcmcuYXBhY2hlLmNhdGFsaW5hOjpjb25uZWN0b3IiCisJCQkJcXVpZHUgICAgICAJIjNFNDJERkNGMDM2QSIpCisJCQkgICAgKG9iamVjdCBWaXNpYmlsaXR5X1JlbGF0aW9uc2hpcAorCQkJCXF1aWQgICAgICAgCSIzRTQzRDFEODAwRDAiCisJCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6b3JnLmFwYWNoZS5jYXRhbGluYTo6c2VjdXJpdHkiCisJCQkJcXVpZHUgICAgICAJIjNFNDJFMDAxMDBENyIpCisJCQkgICAgKG9iamVjdCBWaXNpYmlsaXR5X1JlbGF0aW9uc2hpcAorCQkJCXF1aWQgICAgICAgCSIzRTQzRDI1QzAzMUYiCisJCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6b3JnLmFwYWNoZS5jYXRhbGluYTo6bWJlYW4iCisJCQkJcXVpZHUgICAgICAJIjNFNDJERkYxMDE4OCIpCisJCQkgICAgKG9iamVjdCBWaXNpYmlsaXR5X1JlbGF0aW9uc2hpcAorCQkJCXF1aWQgICAgICAgCSIzRTQzRDI2MDAyOEUiCisJCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6b3JnLmFwYWNoZS5jYXRhbGluYTo6c3RhcnR1cCIKKwkJCQlxdWlkdSAgICAgIAkiM0U0MkUwMUUwMEVDIikKKwkJCSAgICAob2JqZWN0IFZpc2liaWxpdHlfUmVsYXRpb25zaGlwCisJCQkJcXVpZCAgICAgICAJIjNFNDNEMjZBMDE1QyIKKwkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpvcmcuYXBhY2hlLmNhdGFsaW5hOjpzZXNzaW9uIgorCQkJCXF1aWR1ICAgICAgCSIzRTQyRTAwQzAyNkQiKQorCQkJICAgIChvYmplY3QgVmlzaWJpbGl0eV9SZWxhdGlvbnNoaXAKKwkJCQlxdWlkICAgICAgIAkiM0U0M0QyODMwMjcxIgorCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Om9yZy5hcGFjaGUuY2F0YWxpbmE6OnZhbHZlcyIKKwkJCQlxdWlkdSAgICAgIAkiM0U0MkUwMkQwMzVCIikKKwkJCSAgICAob2JqZWN0IFZpc2liaWxpdHlfUmVsYXRpb25zaGlwCisJCQkJcXVpZCAgICAgICAJIjNFNDNEMkM4MDI0OCIKKwkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpvcmcuYXBhY2hlLmNhdGFsaW5hOjpuZXQiCisJCQkJcXVpZHUgICAgICAJIjNFNDJERkY3MDIyNyIpCisJCQkgICAgKG9iamVjdCBWaXNpYmlsaXR5X1JlbGF0aW9uc2hpcAorCQkJCXF1aWQgICAgICAgCSIzRTQzRDJENjAwMkIiCisJCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6b3JnLmFwYWNoZS5jYXRhbGluYTo6bG9hZGVyIgorCQkJCXF1aWR1ICAgICAgCSIzRTQzRDJEMDAyRDYiKQorCQkJICAgIChvYmplY3QgVmlzaWJpbGl0eV9SZWxhdGlvbnNoaXAKKwkJCQlxdWlkICAgICAgIAkiM0U0M0QzRDMwMEY3IgorCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Om9yZy5hcGFjaGUubmFtaW5nIgorCQkJCXF1aWR1ICAgICAgCSIzRTQzRDE1ODAzMzkiKSkKKwkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCisJCQlsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdCkKKwkJCWxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdCkpCisJCSAgICAob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJkZXBsb3kiCisJCQlxdWlkICAgICAgIAkiM0U0MkRGREMwMzQwIgorCQkJdmlzaWJsZV9jYXRlZ29yaWVzIAkobGlzdCB2aXNpYmlsaXR5X3JlbGF0aW9uc2hpcF9saXN0CisJCQkgICAgKG9iamVjdCBWaXNpYmlsaXR5X1JlbGF0aW9uc2hpcAorCQkJCXF1aWQgICAgICAgCSIzRTQzRDMyMDAxQjgiCisJCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6b3JnLmFwYWNoZS5jYXRhbGluYTo6dXRpbCIKKwkJCQlxdWlkdSAgICAgIAkiM0U0MkUwMjYwMTg0IikpCisJCQlleHBvcnRDb250cm9sIAkiUHVibGljIgorCQkJbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QpCisJCQlsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QpKQorCQkgICAgKG9iamVjdCBDbGFzc19DYXRlZ29yeSAibGF1bmNoZXIiCisJCQlxdWlkICAgICAgIAkiM0U0MkRGRTIwMzNGIgorCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKKwkJCWxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0KQorCQkJbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0KSkKKwkJICAgIChvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgImxvZ2dlciIKKwkJCXF1aWQgICAgICAgCSIzRTQyREZFQzAyODUiCisJCQlleHBvcnRDb250cm9sIAkiUHVibGljIgorCQkJbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QpCisJCQlsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QpKQorCQkgICAgKG9iamVjdCBDbGFzc19DYXRlZ29yeSAibWJlYW4iCisJCQlxdWlkICAgICAgIAkiM0U0MkRGRjEwMTg4IgorCQkJdmlzaWJsZV9jYXRlZ29yaWVzIAkobGlzdCB2aXNpYmlsaXR5X3JlbGF0aW9uc2hpcF9saXN0CisJCQkgICAgKG9iamVjdCBWaXNpYmlsaXR5X1JlbGF0aW9uc2hpcAorCQkJCXF1aWQgICAgICAgCSIzRTQzRDQ5MTAxQTUiCisJCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6b3JnLmFwYWNoZS5jYXRhbGluYTo6ZGVwbG95IgorCQkJCXF1aWR1ICAgICAgCSIzRTQyREZEQzAzNDAiKQorCQkJICAgIChvYmplY3QgVmlzaWJpbGl0eV9SZWxhdGlvbnNoaXAKKwkJCQlxdWlkICAgICAgIAkiM0U0M0Q0QzYwMjdEIgorCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Om9yZy5hcGFjaGUuY2F0YWxpbmE6OmNvcmUiCisJCQkJcXVpZHUgICAgICAJIjNFNDJERkQ2MDNCQSIpCisJCQkgICAgKG9iamVjdCBWaXNpYmlsaXR5X1JlbGF0aW9uc2hpcAorCQkJCXF1aWQgICAgICAgCSIzRTQzRDRGQjAwOEYiCisJCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6b3JnLmFwYWNoZS5jYXRhbGluYTo6c2Vzc2lvbiIKKwkJCQlxdWlkdSAgICAgIAkiM0U0MkUwMEMwMjZEIikKKwkJCSAgICAob2JqZWN0IFZpc2liaWxpdHlfUmVsYXRpb25zaGlwCisJCQkJcXVpZCAgICAgICAJIjNFNDNENTAwMDBCRSIKKwkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpvcmcuYXBhY2hlLmNhdGFsaW5hOjp2YWx2ZXMiCisJCQkJcXVpZHUgICAgICAJIjNFNDJFMDJEMDM1QiIpCisJCQkgICAgKG9iamVjdCBWaXNpYmlsaXR5X1JlbGF0aW9uc2hpcAorCQkJCXF1aWQgICAgICAgCSIzRTQzRDUwODAyNzgiCisJCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6b3JnLmFwYWNoZS5jYXRhbGluYTo6cmVhbG0iCisJCQkJcXVpZHUgICAgICAJIjNFNDJERkZBMDBBRSIpCisJCQkgICAgKG9iamVjdCBWaXNpYmlsaXR5X1JlbGF0aW9uc2hpcAorCQkJCXF1aWQgICAgICAgCSIzRTQzRDU1QTAyNTgiCisJCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6b3JnLmFwYWNoZS5jYXRhbGluYTo6bG9nZ2VyIgorCQkJCXF1aWR1ICAgICAgCSIzRTQyREZFQzAyODUiKQorCQkJICAgIChvYmplY3QgVmlzaWJpbGl0eV9SZWxhdGlvbnNoaXAKKwkJCQlxdWlkICAgICAgIAkiM0U0M0Q1NjAwMEQwIgorCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Om9yZy5hcGFjaGUuY2F0YWxpbmE6OmF1dGhlbnRpY2F0b3IiCisJCQkJcXVpZHUgICAgICAJIjNFNDJERkM3MDJCNCIpKQorCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKKwkJCWxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0KQorCQkJbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0KSkKKwkJICAgIChvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgIm5ldCIKKwkJCXF1aWQgICAgICAgCSIzRTQyREZGNzAyMjciCisJCQl2aXNpYmxlX2NhdGVnb3JpZXMgCShsaXN0IHZpc2liaWxpdHlfcmVsYXRpb25zaGlwX2xpc3QKKwkJCSAgICAob2JqZWN0IFZpc2liaWxpdHlfUmVsYXRpb25zaGlwCisJCQkJcXVpZCAgICAgICAJIjNFNDNENjM5MDM3MSIKKwkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpvcmcuYXBhY2hlLmNhdGFsaW5hOjp1dGlsIgorCQkJCXF1aWR1ICAgICAgCSIzRTQyRTAyNjAxODQiKSkKKwkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCisJCQlsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdCkKKwkJCWxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdCkpCisJCSAgICAob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJyZWFsbSIKKwkJCXF1aWQgICAgICAgCSIzRTQyREZGQTAwQUUiCisJCQl2aXNpYmxlX2NhdGVnb3JpZXMgCShsaXN0IHZpc2liaWxpdHlfcmVsYXRpb25zaGlwX2xpc3QKKwkJCSAgICAob2JqZWN0IFZpc2liaWxpdHlfUmVsYXRpb25zaGlwCisJCQkJcXVpZCAgICAgICAJIjNFNDNENjlGMDEzMyIKKwkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpvcmcuYXBhY2hlLmNhdGFsaW5hOjpjb3JlIgorCQkJCXF1aWR1ICAgICAgCSIzRTQyREZENjAzQkEiKQorCQkJICAgIChvYmplY3QgVmlzaWJpbGl0eV9SZWxhdGlvbnNoaXAKKwkJCQlxdWlkICAgICAgIAkiM0U0M0Q2QTEwMzUzIgorCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Om9yZy5hcGFjaGUuY2F0YWxpbmE6OnV0aWwiCisJCQkJcXVpZHUgICAgICAJIjNFNDJFMDI2MDE4NCIpCisJCQkgICAgKG9iamVjdCBWaXNpYmlsaXR5X1JlbGF0aW9uc2hpcAorCQkJCXF1aWQgICAgICAgCSIzRTQzRDcwRTAwRTIiCisJCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6b3JnLmFwYWNoZS5uYW1pbmciCisJCQkJcXVpZHUgICAgICAJIjNFNDNEMTU4MDMzOSIpCisJCQkgICAgKG9iamVjdCBWaXNpYmlsaXR5X1JlbGF0aW9uc2hpcAorCQkJCXF1aWQgICAgICAgCSIzRTQzRDcyMzAyRDciCisJCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6b3JnLmFwYWNoZS5jYXRhbGluYTo6ZGVwbG95IgorCQkJCXF1aWR1ICAgICAgCSIzRTQyREZEQzAzNDAiKSkKKwkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCisJCQlsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdCkKKwkJCWxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdCkpCisJCSAgICAob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJzZWN1cml0eSIKKwkJCXF1aWQgICAgICAgCSIzRTQyRTAwMTAwRDciCisJCQl2aXNpYmxlX2NhdGVnb3JpZXMgCShsaXN0IHZpc2liaWxpdHlfcmVsYXRpb25zaGlwX2xpc3QKKwkJCSAgICAob2JqZWN0IFZpc2liaWxpdHlfUmVsYXRpb25zaGlwCisJCQkJcXVpZCAgICAgICAJIjNFNDNENzREMDA3RiIKKwkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpvcmcuYXBhY2hlLmNhdGFsaW5hOjpzdGFydHVwIgorCQkJCXF1aWR1ICAgICAgCSIzRTQyRTAxRTAwRUMiKQorCQkJICAgIChvYmplY3QgVmlzaWJpbGl0eV9SZWxhdGlvbnNoaXAKKwkJCQlxdWlkICAgICAgIAkiM0U0M0Q3NkIwMzcxIgorCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Om9yZy5hcGFjaGUuY2F0YWxpbmE6OnV0aWwiCisJCQkJcXVpZHUgICAgICAJIjNFNDJFMDI2MDE4NCIpKQorCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKKwkJCWxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0KQorCQkJbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0KSkKKwkJICAgIChvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgInNlcnZsZXRzIgorCQkJcXVpZCAgICAgICAJIjNFNDJFMDA1MDJEQiIKKwkJCXZpc2libGVfY2F0ZWdvcmllcyAJKGxpc3QgdmlzaWJpbGl0eV9yZWxhdGlvbnNoaXBfbGlzdAorCQkJICAgIChvYmplY3QgVmlzaWJpbGl0eV9SZWxhdGlvbnNoaXAKKwkJCQlxdWlkICAgICAgIAkiM0U0M0Q4MjcwMkU1IgorCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Om9yZy5hcGFjaGUudG9tY2F0LnV0aWwiCisJCQkJcXVpZHUgICAgICAJIjNFNDJERURGMDFGMiIpCisJCQkgICAgKG9iamVjdCBWaXNpYmlsaXR5X1JlbGF0aW9uc2hpcAorCQkJCXF1aWQgICAgICAgCSIzRTQzRDgyQTAyQ0MiCisJCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6b3JnLmFwYWNoZS5jYXRhbGluYTo6dXRpbCIKKwkJCQlxdWlkdSAgICAgIAkiM0U0MkUwMjYwMTg0IikKKwkJCSAgICAob2JqZWN0IFZpc2liaWxpdHlfUmVsYXRpb25zaGlwCisJCQkJcXVpZCAgICAgICAJIjNFNDNEODJEMDI0NCIKKwkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpvcmcuYXBhY2hlLm5hbWluZyIKKwkJCQlxdWlkdSAgICAgIAkiM0U0M0QxNTgwMzM5IikpCisJCQlleHBvcnRDb250cm9sIAkiUHVibGljIgorCQkJbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QpCisJCQlsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QpKQorCQkgICAgKG9iamVjdCBDbGFzc19DYXRlZ29yeSAic2Vzc2lvbiIKKwkJCXF1aWQgICAgICAgCSIzRTQyRTAwQzAyNkQiCisJCQl2aXNpYmxlX2NhdGVnb3JpZXMgCShsaXN0IHZpc2liaWxpdHlfcmVsYXRpb25zaGlwX2xpc3QKKwkJCSAgICAob2JqZWN0IFZpc2liaWxpdHlfUmVsYXRpb25zaGlwCisJCQkJcXVpZCAgICAgICAJIjNFNDNEODc3MDM0NCIKKwkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpvcmcuYXBhY2hlLmNhdGFsaW5hOjp1dGlsIgorCQkJCXF1aWR1ICAgICAgCSIzRTQyRTAyNjAxODQiKSkKKwkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCisJCQlsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdCkKKwkJCWxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdCkpCisJCSAgICAob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJzc2kiCisJCQlxdWlkICAgICAgIAkiM0U0MkUwMTAwMkMzIgorCQkJdmlzaWJsZV9jYXRlZ29yaWVzIAkobGlzdCB2aXNpYmlsaXR5X3JlbGF0aW9uc2hpcF9saXN0CisJCQkgICAgKG9iamVjdCBWaXNpYmlsaXR5X1JlbGF0aW9uc2hpcAorCQkJCXF1aWQgICAgICAgCSIzRTQzRDhGOTAyQjUiCisJCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6b3JnLmFwYWNoZS5jYXRhbGluYTo6dXRpbCIKKwkJCQlxdWlkdSAgICAgIAkiM0U0MkUwMjYwMTg0IikpCisJCQlleHBvcnRDb250cm9sIAkiUHVibGljIgorCQkJbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QpCisJCQlsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QpKQorCQkgICAgKG9iamVjdCBDbGFzc19DYXRlZ29yeSAic3RhcnR1cCIKKwkJCXF1aWQgICAgICAgCSIzRTQyRTAxRTAwRUMiCisJCQl2aXNpYmxlX2NhdGVnb3JpZXMgCShsaXN0IHZpc2liaWxpdHlfcmVsYXRpb25zaGlwX2xpc3QKKwkJCSAgICAob2JqZWN0IFZpc2liaWxpdHlfUmVsYXRpb25zaGlwCisJCQkJcXVpZCAgICAgICAJIjNFNDNEOTE1MDI1MSIKKwkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpvcmcuYXBhY2hlLmNhdGFsaW5hOjpsb2dnZXIiCisJCQkJcXVpZHUgICAgICAJIjNFNDJERkVDMDI4NSIpCisJCQkgICAgKG9iamVjdCBWaXNpYmlsaXR5X1JlbGF0aW9uc2hpcAorCQkJCXF1aWQgICAgICAgCSIzRTQzRDkxOTAxOEYiCisJCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6b3JnLmFwYWNoZS5jYXRhbGluYTo6c2VjdXJpdHkiCisJCQkJcXVpZHUgICAgICAJIjNFNDJFMDAxMDBENyIpCisJCQkgICAgKG9iamVjdCBWaXNpYmlsaXR5X1JlbGF0aW9uc2hpcAorCQkJCXF1aWQgICAgICAgCSIzRTQzRDk0NjAwMEQiCisJCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6b3JnLmFwYWNoZS5jYXRhbGluYTo6Y29yZSIKKwkJCQlxdWlkdSAgICAgIAkiM0U0MkRGRDYwM0JBIikKKwkJCSAgICAob2JqZWN0IFZpc2liaWxpdHlfUmVsYXRpb25zaGlwCisJCQkJcXVpZCAgICAgICAJIjNFNDNEOTVFMDEyQSIKKwkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpvcmcuYXBhY2hlLmNhdGFsaW5hOjpsb2FkZXIiCisJCQkJcXVpZHUgICAgICAJIjNFNDNEMkQwMDJENiIpCisJCQkgICAgKG9iamVjdCBWaXNpYmlsaXR5X1JlbGF0aW9uc2hpcAorCQkJCXF1aWQgICAgICAgCSIzRTQzRDk5NjAzMTUiCisJCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6b3JnLmFwYWNoZS5jYXRhbGluYTo6dXRpbCIKKwkJCQlxdWlkdSAgICAgIAkiM0U0MkUwMjYwMTg0IikKKwkJCSAgICAob2JqZWN0IFZpc2liaWxpdHlfUmVsYXRpb25zaGlwCisJCQkJcXVpZCAgICAgICAJIjNFNDNEOTk5MDJCRiIKKwkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpvcmcuYXBhY2hlLmNhdGFsaW5hOjp2YWx2ZXMiCisJCQkJcXVpZHUgICAgICAJIjNFNDJFMDJEMDM1QiIpCisJCQkgICAgKG9iamVjdCBWaXNpYmlsaXR5X1JlbGF0aW9uc2hpcAorCQkJCXF1aWQgICAgICAgCSIzRTQzRDk5QzAxNDciCisJCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6b3JnLmFwYWNoZS5jYXRhbGluYTo6ZGVwbG95IgorCQkJCXF1aWR1ICAgICAgCSIzRTQyREZEQzAzNDAiKQorCQkJICAgIChvYmplY3QgVmlzaWJpbGl0eV9SZWxhdGlvbnNoaXAKKwkJCQlxdWlkICAgICAgIAkiM0U0M0Q5REEwMTE0IgorCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Om9yZy5hcGFjaGUuY2F0YWxpbmE6Om5ldCIKKwkJCQlxdWlkdSAgICAgIAkiM0U0MkRGRjcwMjI3IikKKwkJCSAgICAob2JqZWN0IFZpc2liaWxpdHlfUmVsYXRpb25zaGlwCisJCQkJcXVpZCAgICAgICAJIjNFNDNEOUY0MDJGMiIKKwkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpvcmcuYXBhY2hlLmNhdGFsaW5hOjpyZWFsbSIKKwkJCQlxdWlkdSAgICAgIAkiM0U0MkRGRkEwMEFFIikpCisJCQlleHBvcnRDb250cm9sIAkiUHVibGljIgorCQkJbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QpCisJCQlsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QpKQorCQkgICAgKG9iamVjdCBDbGFzc19DYXRlZ29yeSAidXNlciIKKwkJCXF1aWQgICAgICAgCSIzRTQyRTAyMjAxNzQiCisJCQl2aXNpYmxlX2NhdGVnb3JpZXMgCShsaXN0IHZpc2liaWxpdHlfcmVsYXRpb25zaGlwX2xpc3QKKwkJCSAgICAob2JqZWN0IFZpc2liaWxpdHlfUmVsYXRpb25zaGlwCisJCQkJcXVpZCAgICAgICAJIjNFNDNEQjI0MDIyNyIKKwkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpvcmcuYXBhY2hlLmNhdGFsaW5hOjp1dGlsIgorCQkJCXF1aWR1ICAgICAgCSIzRTQyRTAyNjAxODQiKQorCQkJICAgIChvYmplY3QgVmlzaWJpbGl0eV9SZWxhdGlvbnNoaXAKKwkJCQlxdWlkICAgICAgIAkiM0U0M0RCMzEwMDlGIgorCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Om9yZy5hcGFjaGUubmFtaW5nIgorCQkJCXF1aWR1ICAgICAgCSIzRTQzRDE1ODAzMzkiKSkKKwkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCisJCQlsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdCkKKwkJCWxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdCkpCisJCSAgICAob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJ1dGlsIgorCQkJcXVpZCAgICAgICAJIjNFNDJFMDI2MDE4NCIKKwkJCXZpc2libGVfY2F0ZWdvcmllcyAJKGxpc3QgdmlzaWJpbGl0eV9yZWxhdGlvbnNoaXBfbGlzdAorCQkJICAgIChvYmplY3QgVmlzaWJpbGl0eV9SZWxhdGlvbnNoaXAKKwkJCQlxdWlkICAgICAgIAkiM0U0M0RCODUwMTdDIgorCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Om9yZy5hcGFjaGUuY2F0YWxpbmE6OmNvcmUiCisJCQkJcXVpZHUgICAgICAJIjNFNDJERkQ2MDNCQSIpCisJCQkgICAgKG9iamVjdCBWaXNpYmlsaXR5X1JlbGF0aW9uc2hpcAorCQkJCXF1aWQgICAgICAgCSIzRTQzREI4ODAxNkMiCisJCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6b3JnLmFwYWNoZS5uYW1pbmciCisJCQkJcXVpZHUgICAgICAJIjNFNDNEMTU4MDMzOSIpKQorCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKKwkJCWxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0KQorCQkJbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0KSkKKwkJICAgIChvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgInZhbHZlcyIKKwkJCXF1aWQgICAgICAgCSIzRTQyRTAyRDAzNUIiCisJCQl2aXNpYmxlX2NhdGVnb3JpZXMgCShsaXN0IHZpc2liaWxpdHlfcmVsYXRpb25zaGlwX2xpc3QKKwkJCSAgICAob2JqZWN0IFZpc2liaWxpdHlfUmVsYXRpb25zaGlwCisJCQkJcXVpZCAgICAgICAJIjNFNDNEQzJCMDI1NyIKKwkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpvcmcuYXBhY2hlLmNhdGFsaW5hOjp1dGlsIgorCQkJCXF1aWR1ICAgICAgCSIzRTQyRTAyNjAxODQiKQorCQkJICAgIChvYmplY3QgVmlzaWJpbGl0eV9SZWxhdGlvbnNoaXAKKwkJCQlxdWlkICAgICAgIAkiM0U0M0REM0UwMjcxIgorCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Om9yZy5hcGFjaGUuY2F0YWxpbmE6OmRlcGxveSIKKwkJCQlxdWlkdSAgICAgIAkiM0U0MkRGREMwMzQwIikKKwkJCSAgICAob2JqZWN0IFZpc2liaWxpdHlfUmVsYXRpb25zaGlwCisJCQkJcXVpZCAgICAgICAJIjNFNDNERDQxMDJDRiIKKwkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpvcmcuYXBhY2hlLmNhdGFsaW5hOjpjb25uZWN0b3IiCisJCQkJcXVpZHUgICAgICAJIjNFNDJERkNGMDM2QSIpCisJCQkgICAgKG9iamVjdCBWaXNpYmlsaXR5X1JlbGF0aW9uc2hpcAorCQkJCXF1aWQgICAgICAgCSIzRTQzRERERTAwQjgiCisJCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6b3JnLmFwYWNoZS5jYXRhbGluYTo6Y29yZSIKKwkJCQlxdWlkdSAgICAgIAkiM0U0MkRGRDYwM0JBIikpCisJCQlleHBvcnRDb250cm9sIAkiUHVibGljIgorCQkJbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QpCisJCQlsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QpKQorCQkgICAgKG9iamVjdCBDbGFzc19DYXRlZ29yeSAibG9hZGVyIgorCQkJcXVpZCAgICAgICAJIjNFNDNEMkQwMDJENiIKKwkJCXZpc2libGVfY2F0ZWdvcmllcyAJKGxpc3QgdmlzaWJpbGl0eV9yZWxhdGlvbnNoaXBfbGlzdAorCQkJICAgIChvYmplY3QgVmlzaWJpbGl0eV9SZWxhdGlvbnNoaXAKKwkJCQlxdWlkICAgICAgIAkiM0U0M0QzQ0YwMEYyIgorCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Om9yZy5hcGFjaGUubmFtaW5nIgorCQkJCXF1aWR1ICAgICAgCSIzRTQzRDE1ODAzMzkiKSkKKwkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCisJCQlsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdCkKKwkJCWxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdCkpKQorCQlsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKKwkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICJNYWluIgorCQkJcXVpZCAgICAgICAJIjNFNDJERkI2MDEwQiIKKwkJCXRpdGxlICAgICAgCSJNYWluIgorCQkJem9vbSAgICAgICAJMTAwCisJCQltYXhfaGVpZ2h0IAkyODM1MAorCQkJbWF4X3dpZHRoICAJMjE2MDAKKwkJCW9yaWdpbl94ICAgCTAKKwkJCW9yaWdpbl95ICAgCTAKKwkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0CisJCQkgICAgKG9iamVjdCBDYXRlZ29yeVZpZXcgIkxvZ2ljYWwgVmlldzo6b3JnLmFwYWNoZS5jYXRhbGluYTo6YW50IiBAMQorCQkJCWxvY2F0aW9uICAgCSgyMjA4LCAxNTA0KQorCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCSAgICBzaXplICAgICAgIAkxMAorCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAorCQkJCSAgICBQYXJlbnRfVmlldyAJQDEKKwkJCQkgICAgbG9jYXRpb24gICAJKDIwNjQsIDE0MjApCisJCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkJICAgIG5saW5lcyAgICAgCTIKKwkJCQkgICAgbWF4X3dpZHRoICAJMjg4CisJCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCQkgICAgbGFiZWwgICAgICAJImFudCIpCisJCQkJaWNvbl9zdHlsZSAJIkljb24iCisJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkJcXVpZHUgICAgICAJIjNFNDJERkJCMDM3RiIKKwkJCQl3aWR0aCAgICAgIAkzMDAKKwkJCQloZWlnaHQgICAgIAkxODApCisJCQkgICAgKG9iamVjdCBDYXRlZ29yeVZpZXcgIkxvZ2ljYWwgVmlldzo6b3JnLmFwYWNoZS5jYXRhbGluYTo6YXV0aGVudGljYXRvciIgQDIKKwkJCQlsb2NhdGlvbiAgIAkoMTkyLCAyMDAwKQorCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCSAgICBzaXplICAgICAgIAkxMAorCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAorCQkJCSAgICBQYXJlbnRfVmlldyAJQDIKKwkJCQkgICAgbG9jYXRpb24gICAJKDQ4LCAxOTE2KQorCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJCSAgICBubGluZXMgICAgIAkyCisJCQkJICAgIG1heF93aWR0aCAgCTI4OAorCQkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkJICAgIGxhYmVsICAgICAgCSJhdXRoZW50aWNhdG9yIikKKwkJCQlpY29uX3N0eWxlIAkiSWNvbiIKKwkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCQlxdWlkdSAgICAgIAkiM0U0MkRGQzcwMkI0IgorCQkJCXdpZHRoICAgICAgCTMwMAorCQkJCWhlaWdodCAgICAgCTE4MCkKKwkJCSAgICAob2JqZWN0IENhdGVnb3J5VmlldyAiTG9naWNhbCBWaWV3OjpvcmcuYXBhY2hlLmNhdGFsaW5hOjpjb25uZWN0b3IiIEAzCisJCQkJbG9jYXRpb24gICAJKDQ2NCwgMTMyOCkKKwkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJCSAgICBjb2xvciAgICAgIAkwCisJCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKKwkJCQkgICAgUGFyZW50X1ZpZXcgCUAzCisJCQkJICAgIGxvY2F0aW9uICAgCSgzMjAsIDEyNDQpCisJCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkJICAgIG5saW5lcyAgICAgCTIKKwkJCQkgICAgbWF4X3dpZHRoICAJMjg4CisJCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCQkgICAgbGFiZWwgICAgICAJImNvbm5lY3RvciIpCisJCQkJaWNvbl9zdHlsZSAJIkljb24iCisJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkJcXVpZHUgICAgICAJIjNFNDJERkNGMDM2QSIKKwkJCQl3aWR0aCAgICAgIAkzMDAKKwkJCQloZWlnaHQgICAgIAkxODApCisJCQkgICAgKG9iamVjdCBDYXRlZ29yeVZpZXcgIkxvZ2ljYWwgVmlldzo6b3JnLmFwYWNoZS5jYXRhbGluYTo6Y29yZSIgQDQKKwkJCQlsb2NhdGlvbiAgIAkoMjIyNCwgODAwKQorCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCSAgICBzaXplICAgICAgIAkxMAorCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAorCQkJCSAgICBQYXJlbnRfVmlldyAJQDQKKwkJCQkgICAgbG9jYXRpb24gICAJKDIwODAsIDcxNikKKwkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCQkgICAgbmxpbmVzICAgICAJMgorCQkJCSAgICBtYXhfd2lkdGggIAkyODgKKwkJCQkgICAganVzdGlmeSAgICAJMAorCQkJCSAgICBsYWJlbCAgICAgIAkiY29yZSIpCisJCQkJaWNvbl9zdHlsZSAJIkljb24iCisJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkJcXVpZHUgICAgICAJIjNFNDJERkQ2MDNCQSIKKwkJCQl3aWR0aCAgICAgIAkzMDAKKwkJCQloZWlnaHQgICAgIAkxODApCisJCQkgICAgKG9iamVjdCBDYXRlZ29yeVZpZXcgIkxvZ2ljYWwgVmlldzo6b3JnLmFwYWNoZS5jYXRhbGluYTo6ZGVwbG95IiBANQorCQkJCWxvY2F0aW9uICAgCSgyNDAsIDE2MCkKKwkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJCSAgICBjb2xvciAgICAgIAkwCisJCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKKwkJCQkgICAgUGFyZW50X1ZpZXcgCUA1CisJCQkJICAgIGxvY2F0aW9uICAgCSg5NiwgNzYpCisJCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkJICAgIG5saW5lcyAgICAgCTIKKwkJCQkgICAgbWF4X3dpZHRoICAJMjg4CisJCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCQkgICAgbGFiZWwgICAgICAJImRlcGxveSIpCisJCQkJaWNvbl9zdHlsZSAJIkljb24iCisJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkJcXVpZHUgICAgICAJIjNFNDJERkRDMDM0MCIKKwkJCQl3aWR0aCAgICAgIAkzMDAKKwkJCQloZWlnaHQgICAgIAkxODApCisJCQkgICAgKG9iamVjdCBDYXRlZ29yeVZpZXcgIkxvZ2ljYWwgVmlldzo6b3JnLmFwYWNoZS5jYXRhbGluYTo6bGF1bmNoZXIiIEA2CisJCQkJbG9jYXRpb24gICAJKDE3NzYsIDI0ODApCisJCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCQkgICAgY29sb3IgICAgICAJMAorCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCisJCQkJICAgIFBhcmVudF9WaWV3IAlANgorCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYzMiwgMjM5NikKKwkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCQkgICAgbmxpbmVzICAgICAJMgorCQkJCSAgICBtYXhfd2lkdGggIAkyODgKKwkJCQkgICAganVzdGlmeSAgICAJMAorCQkJCSAgICBsYWJlbCAgICAgIAkibGF1bmNoZXIiKQorCQkJCWljb25fc3R5bGUgCSJJY29uIgorCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJCXF1aWR1ICAgICAgCSIzRTQyREZFMjAzM0YiCisJCQkJd2lkdGggICAgICAJMzAwCisJCQkJaGVpZ2h0ICAgICAJMTgwKQorCQkJICAgIChvYmplY3QgQ2F0ZWdvcnlWaWV3ICJMb2dpY2FsIFZpZXc6Om9yZy5hcGFjaGUuY2F0YWxpbmE6OmxvZ2dlciIgQDcKKwkJCQlsb2NhdGlvbiAgIAkoNzUyLCAxMjgpCisJCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCQkgICAgY29sb3IgICAgICAJMAorCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCisJCQkJICAgIFBhcmVudF9WaWV3IAlANworCQkJCSAgICBsb2NhdGlvbiAgIAkoNjA4LCA0NCkKKwkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCQkgICAgbmxpbmVzICAgICAJMgorCQkJCSAgICBtYXhfd2lkdGggIAkyODgKKwkJCQkgICAganVzdGlmeSAgICAJMAorCQkJCSAgICBsYWJlbCAgICAgIAkibG9nZ2VyIikKKwkJCQlpY29uX3N0eWxlIAkiSWNvbiIKKwkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCQlxdWlkdSAgICAgIAkiM0U0MkRGRUMwMjg1IgorCQkJCXdpZHRoICAgICAgCTMwMAorCQkJCWhlaWdodCAgICAgCTE4MCkKKwkJCSAgICAob2JqZWN0IENhdGVnb3J5VmlldyAiTG9naWNhbCBWaWV3OjpvcmcuYXBhY2hlLmNhdGFsaW5hOjptYmVhbiIgQDgKKwkJCQlsb2NhdGlvbiAgIAkoMjIwOCwgMTIxNikKKwkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJCSAgICBjb2xvciAgICAgIAkwCisJCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKKwkJCQkgICAgUGFyZW50X1ZpZXcgCUA4CisJCQkJICAgIGxvY2F0aW9uICAgCSgyMDY0LCAxMTMyKQorCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJCSAgICBubGluZXMgICAgIAkyCisJCQkJICAgIG1heF93aWR0aCAgCTI4OAorCQkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkJICAgIGxhYmVsICAgICAgCSJtYmVhbiIpCisJCQkJaWNvbl9zdHlsZSAJIkljb24iCisJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkJcXVpZHUgICAgICAJIjNFNDJERkYxMDE4OCIKKwkJCQl3aWR0aCAgICAgIAkzMDAKKwkJCQloZWlnaHQgICAgIAkxODApCisJCQkgICAgKG9iamVjdCBDYXRlZ29yeVZpZXcgIkxvZ2ljYWwgVmlldzo6b3JnLmFwYWNoZS5jYXRhbGluYTo6bmV0IiBAOQorCQkJCWxvY2F0aW9uICAgCSgxMDU2LCAyNDk2KQorCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCSAgICBzaXplICAgICAgIAkxMAorCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAorCQkJCSAgICBQYXJlbnRfVmlldyAJQDkKKwkJCQkgICAgbG9jYXRpb24gICAJKDkxMiwgMjQxMikKKwkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCQkgICAgbmxpbmVzICAgICAJMgorCQkJCSAgICBtYXhfd2lkdGggIAkyODgKKwkJCQkgICAganVzdGlmeSAgICAJMAorCQkJCSAgICBsYWJlbCAgICAgIAkibmV0IikKKwkJCQlpY29uX3N0eWxlIAkiSWNvbiIKKwkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCQlxdWlkdSAgICAgIAkiM0U0MkRGRjcwMjI3IgorCQkJCXdpZHRoICAgICAgCTMwMAorCQkJCWhlaWdodCAgICAgCTE4MCkKKwkJCSAgICAob2JqZWN0IENhdGVnb3J5VmlldyAiTG9naWNhbCBWaWV3OjpvcmcuYXBhY2hlLmNhdGFsaW5hOjpyZWFsbSIgQDEwCisJCQkJbG9jYXRpb24gICAJKDEyNDgsIDExMikKKwkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJCSAgICBjb2xvciAgICAgIAkwCisJCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKKwkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMAorCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEwNCwgMjgpCisJCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkJICAgIG5saW5lcyAgICAgCTIKKwkJCQkgICAgbWF4X3dpZHRoICAJMjg4CisJCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCQkgICAgbGFiZWwgICAgICAJInJlYWxtIikKKwkJCQlpY29uX3N0eWxlIAkiSWNvbiIKKwkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCQlxdWlkdSAgICAgIAkiM0U0MkRGRkEwMEFFIgorCQkJCXdpZHRoICAgICAgCTMwMAorCQkJCWhlaWdodCAgICAgCTE4MCkKKwkJCSAgICAob2JqZWN0IENhdGVnb3J5VmlldyAiTG9naWNhbCBWaWV3OjpvcmcuYXBhY2hlLmNhdGFsaW5hOjpzZWN1cml0eSIgQDExCisJCQkJbG9jYXRpb24gICAJKDMwNCwgMjQ5NikKKwkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJCSAgICBjb2xvciAgICAgIAkwCisJCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKKwkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMQorCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYwLCAyNDEyKQorCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJCSAgICBubGluZXMgICAgIAkyCisJCQkJICAgIG1heF93aWR0aCAgCTI4OAorCQkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkJICAgIGxhYmVsICAgICAgCSJzZWN1cml0eSIpCisJCQkJaWNvbl9zdHlsZSAJIkljb24iCisJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkJcXVpZHUgICAgICAJIjNFNDJFMDAxMDBENyIKKwkJCQl3aWR0aCAgICAgIAkzMDAKKwkJCQloZWlnaHQgICAgIAkxODApCisJCQkgICAgKG9iamVjdCBDYXRlZ29yeVZpZXcgIkxvZ2ljYWwgVmlldzo6b3JnLmFwYWNoZS5jYXRhbGluYTo6c2VydmxldHMiIEAxMgorCQkJCWxvY2F0aW9uICAgCSgyMDk2LCAxODg4KQorCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCSAgICBzaXplICAgICAgIAkxMAorCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAorCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyCisJCQkJICAgIGxvY2F0aW9uICAgCSgxOTUyLCAxODA0KQorCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJCSAgICBubGluZXMgICAgIAkyCisJCQkJICAgIG1heF93aWR0aCAgCTI4OAorCQkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkJICAgIGxhYmVsICAgICAgCSJzZXJ2bGV0cyIpCisJCQkJaWNvbl9zdHlsZSAJIkljb24iCisJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkJcXVpZHUgICAgICAJIjNFNDJFMDA1MDJEQiIKKwkJCQl3aWR0aCAgICAgIAkzMDAKKwkJCQloZWlnaHQgICAgIAkxODApCisJCQkgICAgKG9iamVjdCBDYXRlZ29yeVZpZXcgIkxvZ2ljYWwgVmlldzo6b3JnLmFwYWNoZS5jYXRhbGluYTo6c2Vzc2lvbiIgQDEzCisJCQkJbG9jYXRpb24gICAJKDQzMiwgMTY5NikKKwkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJCSAgICBjb2xvciAgICAgIAkwCisJCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKKwkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMworCQkJCSAgICBsb2NhdGlvbiAgIAkoMjg4LCAxNjEyKQorCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJCSAgICBubGluZXMgICAgIAkyCisJCQkJICAgIG1heF93aWR0aCAgCTI4OAorCQkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkJICAgIGxhYmVsICAgICAgCSJzZXNzaW9uIikKKwkJCQlpY29uX3N0eWxlIAkiSWNvbiIKKwkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCQlxdWlkdSAgICAgIAkiM0U0MkUwMEMwMjZEIgorCQkJCXdpZHRoICAgICAgCTMwMAorCQkJCWhlaWdodCAgICAgCTE4MCkKKwkJCSAgICAob2JqZWN0IENhdGVnb3J5VmlldyAiTG9naWNhbCBWaWV3OjpvcmcuYXBhY2hlLmNhdGFsaW5hOjpzc2kiIEAxNAorCQkJCWxvY2F0aW9uICAgCSg2NzIsIDI0ODApCisJCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCQkgICAgY29sb3IgICAgICAJMAorCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCisJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQKKwkJCQkgICAgbG9jYXRpb24gICAJKDUyOCwgMjM5MykKKwkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCQkgICAgbmxpbmVzICAgICAJMgorCQkJCSAgICBtYXhfd2lkdGggIAkyODgKKwkJCQkgICAganVzdGlmeSAgICAJMAorCQkJCSAgICBsYWJlbCAgICAgIAkic3NpIikKKwkJCQlpY29uX3N0eWxlIAkiSWNvbiIKKwkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCQlxdWlkdSAgICAgIAkiM0U0MkUwMTAwMkMzIgorCQkJCXdpZHRoICAgICAgCTMwMQorCQkJCWhlaWdodCAgICAgCTE4NykKKwkJCSAgICAob2JqZWN0IENhdGVnb3J5VmlldyAiTG9naWNhbCBWaWV3OjpvcmcuYXBhY2hlLmNhdGFsaW5hOjpzdGFydHVwIiBAMTUKKwkJCQlsb2NhdGlvbiAgIAkoMTA4OCwgODMyKQorCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCSAgICBzaXplICAgICAgIAkxMAorCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAorCQkJCSAgICBQYXJlbnRfVmlldyAJQDE1CisJCQkJICAgIGxvY2F0aW9uICAgCSg5NDQsIDc0OCkKKwkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCQkgICAgbmxpbmVzICAgICAJMgorCQkJCSAgICBtYXhfd2lkdGggIAkyODgKKwkJCQkgICAganVzdGlmeSAgICAJMAorCQkJCSAgICBsYWJlbCAgICAgIAkic3RhcnR1cCIpCisJCQkJaWNvbl9zdHlsZSAJIkljb24iCisJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkJcXVpZHUgICAgICAJIjNFNDJFMDFFMDBFQyIKKwkJCQl3aWR0aCAgICAgIAkzMDAKKwkJCQloZWlnaHQgICAgIAkxODApCisJCQkgICAgKG9iamVjdCBDYXRlZ29yeVZpZXcgIkxvZ2ljYWwgVmlldzo6b3JnLmFwYWNoZS5jYXRhbGluYTo6dXNlciIgQDE2CisJCQkJbG9jYXRpb24gICAJKDE0MjQsIDI0OTYpCisJCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCQkgICAgY29sb3IgICAgICAJMAorCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCisJCQkJICAgIFBhcmVudF9WaWV3IAlAMTYKKwkJCQkgICAgbG9jYXRpb24gICAJKDEyODAsIDI0MTIpCisJCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkJICAgIG5saW5lcyAgICAgCTIKKwkJCQkgICAgbWF4X3dpZHRoICAJMjg4CisJCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCQkgICAgbGFiZWwgICAgICAJInVzZXIiKQorCQkJCWljb25fc3R5bGUgCSJJY29uIgorCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJCXF1aWR1ICAgICAgCSIzRTQyRTAyMjAxNzQiCisJCQkJd2lkdGggICAgICAJMzAwCisJCQkJaGVpZ2h0ICAgICAJMTgwKQorCQkJICAgIChvYmplY3QgQ2F0ZWdvcnlWaWV3ICJMb2dpY2FsIFZpZXc6Om9yZy5hcGFjaGUuY2F0YWxpbmE6OnV0aWwiIEAxNworCQkJCWxvY2F0aW9uICAgCSgxMzEyLCAxODcyKQorCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCSAgICBzaXplICAgICAgIAkxMAorCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAorCQkJCSAgICBQYXJlbnRfVmlldyAJQDE3CisJCQkJICAgIGxvY2F0aW9uICAgCSgxMTY4LCAxNzg4KQorCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJCSAgICBubGluZXMgICAgIAkyCisJCQkJICAgIG1heF93aWR0aCAgCTI4OAorCQkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkJICAgIGxhYmVsICAgICAgCSJ1dGlsIikKKwkJCQlpY29uX3N0eWxlIAkiSWNvbiIKKwkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCQlxdWlkdSAgICAgIAkiM0U0MkUwMjYwMTg0IgorCQkJCXdpZHRoICAgICAgCTMwMAorCQkJCWhlaWdodCAgICAgCTE4MCkKKwkJCSAgICAob2JqZWN0IENhdGVnb3J5VmlldyAiTG9naWNhbCBWaWV3OjpvcmcuYXBhY2hlLmNhdGFsaW5hOjp2YWx2ZXMiIEAxOAorCQkJCWxvY2F0aW9uICAgCSgzMDQsIDcwNCkKKwkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJCSAgICBjb2xvciAgICAgIAkwCisJCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKKwkJCQkgICAgUGFyZW50X1ZpZXcgCUAxOAorCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYwLCA2MjApCisJCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkJICAgIG5saW5lcyAgICAgCTIKKwkJCQkgICAgbWF4X3dpZHRoICAJMjg4CisJCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCQkgICAgbGFiZWwgICAgICAJInZhbHZlcyIpCisJCQkJaWNvbl9zdHlsZSAJIkljb24iCisJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkJcXVpZHUgICAgICAJIjNFNDJFMDJEMDM1QiIKKwkJCQl3aWR0aCAgICAgIAkzMDAKKwkJCQloZWlnaHQgICAgIAkxODApCisJCQkgICAgKG9iamVjdCBJbXBvcnRWaWV3ICIiIEAxOQorCQkJCXN0ZXJlb3R5cGUgCVRSVUUKKwkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkJcXVpZHUgICAgICAJIjNFNDNDRkY3MDIwRiIKKwkJCQljbGllbnQgICAgIAlAMQorCQkJCXN1cHBsaWVyICAgCUAxNworCQkJCWxpbmVfc3R5bGUgCTApCisJCQkgICAgKG9iamVjdCBJbXBvcnRWaWV3ICIiIEAyMAorCQkJCXN0ZXJlb3R5cGUgCVRSVUUKKwkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkJcXVpZHUgICAgICAJIjNFNDNEMDdFMDE3RCIKKwkJCQljbGllbnQgICAgIAlAMworCQkJCXN1cHBsaWVyICAgCUAxMworCQkJCWxpbmVfc3R5bGUgCTApCisJCQkgICAgKG9iamVjdCBDYXRlZ29yeVZpZXcgIkxvZ2ljYWwgVmlldzo6b3JnLmFwYWNoZS5jYXRhbGluYTo6bG9hZGVyIiBAMjEKKwkJCQlsb2NhdGlvbiAgIAkoMjI0MCwgNDE2KQorCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCSAgICBzaXplICAgICAgIAkxMAorCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAorCQkJCSAgICBQYXJlbnRfVmlldyAJQDIxCisJCQkJICAgIGxvY2F0aW9uICAgCSgyMDk2LCAzMzIpCisJCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkJICAgIG5saW5lcyAgICAgCTIKKwkJCQkgICAgbWF4X3dpZHRoICAJMjg4CisJCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCQkgICAgbGFiZWwgICAgICAJImxvYWRlciIpCisJCQkJaWNvbl9zdHlsZSAJIkljb24iCisJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkJcXVpZHUgICAgICAJIjNFNDNEMkQwMDJENiIKKwkJCQl3aWR0aCAgICAgIAkzMDAKKwkJCQloZWlnaHQgICAgIAkxODApCisJCQkgICAgKG9iamVjdCBJbXBvcnRWaWV3ICIiIEAyMgorCQkJCXN0ZXJlb3R5cGUgCVRSVUUKKwkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkJcXVpZHUgICAgICAJIjNFNDNEMzIwMDFCOCIKKwkJCQljbGllbnQgICAgIAlANQorCQkJCXN1cHBsaWVyICAgCUAxNworCQkJCWxpbmVfc3R5bGUgCTApCisJCQkgICAgKG9iamVjdCBDYXRlZ29yeVZpZXcgIkxvZ2ljYWwgVmlldzo6b3JnLmFwYWNoZS5uYW1pbmciIEAyMworCQkJCWxvY2F0aW9uICAgCSgxODcyLCA5NikKKwkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJCSAgICBjb2xvciAgICAgIAkwCisJCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKKwkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMworCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY5OSwgMTIpCisJCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkJICAgIG5saW5lcyAgICAgCTIKKwkJCQkgICAgbWF4X3dpZHRoICAJMzQ2CisJCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCQkgICAgbGFiZWwgICAgICAJIm9yZy5hcGFjaGUubmFtaW5nIikKKwkJCQlpY29uX3N0eWxlIAkiSWNvbiIKKwkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCQlxdWlkdSAgICAgIAkiM0U0M0QxNTgwMzM5IgorCQkJCXdpZHRoICAgICAgCTM1OAorCQkJCWhlaWdodCAgICAgCTE4MCkKKwkJCSAgICAob2JqZWN0IEltcG9ydFZpZXcgIiIgQDI0CisJCQkJc3RlcmVvdHlwZSAJVFJVRQorCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCQlxdWlkdSAgICAgIAkiM0U0M0QzQ0YwMEYyIgorCQkJCWNsaWVudCAgICAgCUAyMQorCQkJCXN1cHBsaWVyICAgCUAyMworCQkJCWxpbmVfc3R5bGUgCTApCisJCQkgICAgKG9iamVjdCBJbXBvcnRWaWV3ICIiIEAyNQorCQkJCXN0ZXJlb3R5cGUgCVRSVUUKKwkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkJcXVpZHUgICAgICAJIjNFNDNENjM5MDM3MSIKKwkJCQljbGllbnQgICAgIAlAOQorCQkJCXN1cHBsaWVyICAgCUAxNworCQkJCWxpbmVfc3R5bGUgCTApCisJCQkgICAgKG9iamVjdCBJbXBvcnRWaWV3ICIiIEAyNgorCQkJCXN0ZXJlb3R5cGUgCVRSVUUKKwkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkJcXVpZHUgICAgICAJIjNFNDNENjlGMDEzMyIKKwkJCQljbGllbnQgICAgIAlAMTAKKwkJCQlzdXBwbGllciAgIAlANAorCQkJCWxpbmVfc3R5bGUgCTApCisJCQkgICAgKG9iamVjdCBJbXBvcnRWaWV3ICIiIEAyNworCQkJCXN0ZXJlb3R5cGUgCVRSVUUKKwkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkJcXVpZHUgICAgICAJIjNFNDNENkExMDM1MyIKKwkJCQljbGllbnQgICAgIAlAMTAKKwkJCQlzdXBwbGllciAgIAlAMTcKKwkJCQlsaW5lX3N0eWxlIAkwKQorCQkJICAgIChvYmplY3QgSW1wb3J0VmlldyAiIiBAMjgKKwkJCQlzdGVyZW90eXBlIAlUUlVFCisJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJCXF1aWR1ICAgICAgCSIzRTQzRDcwRTAwRTIiCisJCQkJY2xpZW50ICAgICAJQDEwCisJCQkJc3VwcGxpZXIgICAJQDIzCisJCQkJbGluZV9zdHlsZSAJMCkKKwkJCSAgICAob2JqZWN0IEltcG9ydFZpZXcgIiIgQDI5CisJCQkJc3RlcmVvdHlwZSAJVFJVRQorCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCQlxdWlkdSAgICAgIAkiM0U0M0Q3MjMwMkQ3IgorCQkJCWNsaWVudCAgICAgCUAxMAorCQkJCXN1cHBsaWVyICAgCUA1CisJCQkJbGluZV9zdHlsZSAJMCkKKwkJCSAgICAob2JqZWN0IEltcG9ydFZpZXcgIiIgQDMwCisJCQkJc3RlcmVvdHlwZSAJVFJVRQorCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCQlxdWlkdSAgICAgIAkiM0U0M0Q2OUYwMTMzIgorCQkJCWNsaWVudCAgICAgCUAxMAorCQkJCXN1cHBsaWVyICAgCUA0CisJCQkJbGluZV9zdHlsZSAJMCkKKwkJCSAgICAob2JqZWN0IEltcG9ydFZpZXcgIiIgQDMxCisJCQkJc3RlcmVvdHlwZSAJVFJVRQorCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCQlxdWlkdSAgICAgIAkiM0U0M0Q3NEQwMDdGIgorCQkJCWNsaWVudCAgICAgCUAxMQorCQkJCXN1cHBsaWVyICAgCUAxNQorCQkJCWxpbmVfc3R5bGUgCTApCisJCQkgICAgKG9iamVjdCBJbXBvcnRWaWV3ICIiIEAzMgorCQkJCXN0ZXJlb3R5cGUgCVRSVUUKKwkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkJcXVpZHUgICAgICAJIjNFNDNENzZCMDM3MSIKKwkJCQljbGllbnQgICAgIAlAMTEKKwkJCQlzdXBwbGllciAgIAlAMTcKKwkJCQlsaW5lX3N0eWxlIAkwKQorCQkJICAgIChvYmplY3QgQ2F0ZWdvcnlWaWV3ICJMb2dpY2FsIFZpZXc6Om9yZy5hcGFjaGUudG9tY2F0LnV0aWwiIEAzMworCQkJCWxvY2F0aW9uICAgCSgyMDk2LCAyMjI0KQorCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCSAgICBzaXplICAgICAgIAkxMAorCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAorCQkJCSAgICBQYXJlbnRfVmlldyAJQDMzCisJCQkJICAgIGxvY2F0aW9uICAgCSgxOTIzLCAyMTQwKQorCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJCSAgICBubGluZXMgICAgIAkyCisJCQkJICAgIG1heF93aWR0aCAgCTM0NgorCQkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkJICAgIGxhYmVsICAgICAgCSJvcmcuYXBhY2hlLnRvbWNhdC51dGlsIikKKwkJCQlpY29uX3N0eWxlIAkiSWNvbiIKKwkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCQlxdWlkdSAgICAgIAkiM0U0MkRFREYwMUYyIgorCQkJCXdpZHRoICAgICAgCTM1OAorCQkJCWhlaWdodCAgICAgCTE4MCkKKwkJCSAgICAob2JqZWN0IEltcG9ydFZpZXcgIiIgQDM0CisJCQkJc3RlcmVvdHlwZSAJVFJVRQorCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCQlxdWlkdSAgICAgIAkiM0U0M0Q4NzcwMzQ0IgorCQkJCWNsaWVudCAgICAgCUAxMworCQkJCXN1cHBsaWVyICAgCUAxNworCQkJCWxpbmVfc3R5bGUgCTApCisJCQkgICAgKG9iamVjdCBJbXBvcnRWaWV3ICIiIEAzNQorCQkJCXN0ZXJlb3R5cGUgCVRSVUUKKwkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkJcXVpZHUgICAgICAJIjNFNDNEOEY5MDJCNSIKKwkJCQljbGllbnQgICAgIAlAMTQKKwkJCQlzdXBwbGllciAgIAlAMTcKKwkJCQlsaW5lX3N0eWxlIAkwKQorCQkJICAgIChvYmplY3QgSW1wb3J0VmlldyAiIiBAMzYKKwkJCQlzdGVyZW90eXBlIAlUUlVFCisJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJCXF1aWR1ICAgICAgCSIzRTQzREIyNDAyMjciCisJCQkJY2xpZW50ICAgICAJQDE2CisJCQkJc3VwcGxpZXIgICAJQDE3CisJCQkJbGluZV9zdHlsZSAJMCkKKwkJCSAgICAob2JqZWN0IEltcG9ydFZpZXcgIiIgQDM3CisJCQkJc3RlcmVvdHlwZSAJVFJVRQorCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCQlxdWlkdSAgICAgIAkiM0U0M0RCMzEwMDlGIgorCQkJCWNsaWVudCAgICAgCUAxNgorCQkJCXN1cHBsaWVyICAgCUAyMworCQkJCWxpbmVfc3R5bGUgCTApCisJCQkgICAgKG9iamVjdCBJbXBvcnRWaWV3ICIiIEAzOAorCQkJCXN0ZXJlb3R5cGUgCVRSVUUKKwkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkJcXVpZHUgICAgICAJIjNFNDNEQjg1MDE3QyIKKwkJCQljbGllbnQgICAgIAlAMTcKKwkJCQlzdXBwbGllciAgIAlANAorCQkJCWxpbmVfc3R5bGUgCTApCisJCQkgICAgKG9iamVjdCBJbXBvcnRWaWV3ICIiIEAzOQorCQkJCXN0ZXJlb3R5cGUgCVRSVUUKKwkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkJcXVpZHUgICAgICAJIjNFNDNEQjg4MDE2QyIKKwkJCQljbGllbnQgICAgIAlAMTcKKwkJCQlzdXBwbGllciAgIAlAMjMKKwkJCQlsaW5lX3N0eWxlIAkwKQorCQkJICAgIChvYmplY3QgSW1wb3J0VmlldyAiIiBANDAKKwkJCQlzdGVyZW90eXBlIAlUUlVFCisJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJCXF1aWR1ICAgICAgCSIzRTQzRDgyNzAyRTUiCisJCQkJY2xpZW50ICAgICAJQDEyCisJCQkJc3VwcGxpZXIgICAJQDMzCisJCQkJbGluZV9zdHlsZSAJMCkKKwkJCSAgICAob2JqZWN0IEltcG9ydFZpZXcgIiIgQDQxCisJCQkJc3RlcmVvdHlwZSAJVFJVRQorCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCQlxdWlkdSAgICAgIAkiM0U0M0Q4MkEwMkNDIgorCQkJCWNsaWVudCAgICAgCUAxMgorCQkJCXN1cHBsaWVyICAgCUAxNworCQkJCWxpbmVfc3R5bGUgCTApCisJCQkgICAgKG9iamVjdCBJbXBvcnRWaWV3ICIiIEA0MgorCQkJCXN0ZXJlb3R5cGUgCVRSVUUKKwkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkJcXVpZHUgICAgICAJIjNFNDNEODJEMDI0NCIKKwkJCQljbGllbnQgICAgIAlAMTIKKwkJCQlzdXBwbGllciAgIAlAMjMKKwkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKKwkJCQkgICAgKDIwNjAsIDE3NDMpCisJCQkJICAgICgxNzQ2LCA0NDcpCisJCQkJICAgICgxODM4LCAxODYpKQorCQkJCWxpbmVfc3R5bGUgCTApCisJCQkgICAgKG9iamVjdCBJbXBvcnRWaWV3ICIiIEA0MworCQkJCXN0ZXJlb3R5cGUgCVRSVUUKKwkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkJcXVpZHUgICAgICAJIjNFNDNEOTE5MDE4RiIKKwkJCQljbGllbnQgICAgIAlAMTUKKwkJCQlzdXBwbGllciAgIAlAMTEKKwkJCQlsaW5lX3N0eWxlIAkwKQorCQkJICAgIChvYmplY3QgSW1wb3J0VmlldyAiIiBANDQKKwkJCQlzdGVyZW90eXBlIAlUUlVFCisJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJCXF1aWR1ICAgICAgCSIzRTQzRDk0NjAwMEQiCisJCQkJY2xpZW50ICAgICAJQDE1CisJCQkJc3VwcGxpZXIgICAJQDQKKwkJCQlsaW5lX3N0eWxlIAkwKQorCQkJICAgIChvYmplY3QgSW1wb3J0VmlldyAiIiBANDUKKwkJCQlzdGVyZW90eXBlIAlUUlVFCisJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJCXF1aWR1ICAgICAgCSIzRTQzRDk1RTAxMkEiCisJCQkJY2xpZW50ICAgICAJQDE1CisJCQkJc3VwcGxpZXIgICAJQDIxCisJCQkJbGluZV9zdHlsZSAJMCkKKwkJCSAgICAob2JqZWN0IEltcG9ydFZpZXcgIiIgQDQ2CisJCQkJc3RlcmVvdHlwZSAJVFJVRQorCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCQlxdWlkdSAgICAgIAkiM0U0M0Q5NUUwMTJBIgorCQkJCWNsaWVudCAgICAgCUAxNQorCQkJCXN1cHBsaWVyICAgCUAyMQorCQkJCWxpbmVfc3R5bGUgCTApCisJCQkgICAgKG9iamVjdCBJbXBvcnRWaWV3ICIiIEA0NworCQkJCXN0ZXJlb3R5cGUgCVRSVUUKKwkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkJcXVpZHUgICAgICAJIjNFNDNEOTk2MDMxNSIKKwkJCQljbGllbnQgICAgIAlAMTUKKwkJCQlzdXBwbGllciAgIAlAMTcKKwkJCQlsaW5lX3N0eWxlIAkwKQorCQkJICAgIChvYmplY3QgSW1wb3J0VmlldyAiIiBANDgKKwkJCQlzdGVyZW90eXBlIAlUUlVFCisJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJCXF1aWR1ICAgICAgCSIzRTQzRDk5OTAyQkYiCisJCQkJY2xpZW50ICAgICAJQDE1CisJCQkJc3VwcGxpZXIgICAJQDE4CisJCQkJbGluZV9zdHlsZSAJMCkKKwkJCSAgICAob2JqZWN0IEltcG9ydFZpZXcgIiIgQDQ5CisJCQkJc3RlcmVvdHlwZSAJVFJVRQorCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCQlxdWlkdSAgICAgIAkiM0U0M0Q5OUMwMTQ3IgorCQkJCWNsaWVudCAgICAgCUAxNQorCQkJCXN1cHBsaWVyICAgCUA1CisJCQkJbGluZV9zdHlsZSAJMCkKKwkJCSAgICAob2JqZWN0IEltcG9ydFZpZXcgIiIgQDUwCisJCQkJc3RlcmVvdHlwZSAJVFJVRQorCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCQlxdWlkdSAgICAgIAkiM0U0M0Q5NDYwMDBEIgorCQkJCWNsaWVudCAgICAgCUAxNQorCQkJCXN1cHBsaWVyICAgCUA0CisJCQkJbGluZV9zdHlsZSAJMCkKKwkJCSAgICAob2JqZWN0IEltcG9ydFZpZXcgIiIgQDUxCisJCQkJc3RlcmVvdHlwZSAJVFJVRQorCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCQlxdWlkdSAgICAgIAkiM0U0M0Q5MTUwMjUxIgorCQkJCWNsaWVudCAgICAgCUAxNQorCQkJCXN1cHBsaWVyICAgCUA3CisJCQkJbGluZV9zdHlsZSAJMCkKKwkJCSAgICAob2JqZWN0IEltcG9ydFZpZXcgIiIgQDUyCisJCQkJc3RlcmVvdHlwZSAJVFJVRQorCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCQlxdWlkdSAgICAgIAkiM0U0M0Q5REEwMTE0IgorCQkJCWNsaWVudCAgICAgCUAxNQorCQkJCXN1cHBsaWVyICAgCUA5CisJCQkJbGluZV9zdHlsZSAJMCkKKwkJCSAgICAob2JqZWN0IEltcG9ydFZpZXcgIiIgQDUzCisJCQkJc3RlcmVvdHlwZSAJVFJVRQorCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCQlxdWlkdSAgICAgIAkiM0U0M0Q5RjQwMkYyIgorCQkJCWNsaWVudCAgICAgCUAxNQorCQkJCXN1cHBsaWVyICAgCUAxMAorCQkJCWxpbmVfc3R5bGUgCTApCisJCQkgICAgKG9iamVjdCBJbXBvcnRWaWV3ICIiIEA1NAorCQkJCXN0ZXJlb3R5cGUgCVRSVUUKKwkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkJcXVpZHUgICAgICAJIjNFNDNEOTk2MDMxNSIKKwkJCQljbGllbnQgICAgIAlAMTUKKwkJCQlzdXBwbGllciAgIAlAMTcKKwkJCQlsaW5lX3N0eWxlIAkwKQorCQkJICAgIChvYmplY3QgSW1wb3J0VmlldyAiIiBANTUKKwkJCQlzdGVyZW90eXBlIAlUUlVFCisJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJCXF1aWR1ICAgICAgCSIzRTQzRDk0NjAwMEQiCisJCQkJY2xpZW50ICAgICAJQDE1CisJCQkJc3VwcGxpZXIgICAJQDQKKwkJCQlsaW5lX3N0eWxlIAkwKQorCQkJICAgIChvYmplY3QgSW1wb3J0VmlldyAiIiBANTYKKwkJCQlzdGVyZW90eXBlIAlUUlVFCisJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJCXF1aWR1ICAgICAgCSIzRTQzRDk5QzAxNDciCisJCQkJY2xpZW50ICAgICAJQDE1CisJCQkJc3VwcGxpZXIgICAJQDUKKwkJCQlsaW5lX3N0eWxlIAkwKQorCQkJICAgIChvYmplY3QgSW1wb3J0VmlldyAiIiBANTcKKwkJCQlzdGVyZW90eXBlIAlUUlVFCisJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJCXF1aWR1ICAgICAgCSIzRTQzRDQ5MTAxQTUiCisJCQkJY2xpZW50ICAgICAJQDgKKwkJCQlzdXBwbGllciAgIAlANQorCQkJCWxpbmVfc3R5bGUgCTApCisJCQkgICAgKG9iamVjdCBJbXBvcnRWaWV3ICIiIEA1OAorCQkJCXN0ZXJlb3R5cGUgCVRSVUUKKwkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkJcXVpZHUgICAgICAJIjNFNDNENEM2MDI3RCIKKwkJCQljbGllbnQgICAgIAlAOAorCQkJCXN1cHBsaWVyICAgCUA0CisJCQkJbGluZV9zdHlsZSAJMCkKKwkJCSAgICAob2JqZWN0IEltcG9ydFZpZXcgIiIgQDU5CisJCQkJc3RlcmVvdHlwZSAJVFJVRQorCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCQlxdWlkdSAgICAgIAkiM0U0M0Q0RkIwMDhGIgorCQkJCWNsaWVudCAgICAgCUA4CisJCQkJc3VwcGxpZXIgICAJQDEzCisJCQkJbGluZV9zdHlsZSAJMCkKKwkJCSAgICAob2JqZWN0IEltcG9ydFZpZXcgIiIgQDYwCisJCQkJc3RlcmVvdHlwZSAJVFJVRQorCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCQlxdWlkdSAgICAgIAkiM0U0M0Q1MDAwMEJFIgorCQkJCWNsaWVudCAgICAgCUA4CisJCQkJc3VwcGxpZXIgICAJQDE4CisJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCisJCQkJICAgICgyMDU3LCAxMjE2KQorCQkJCSAgICAoMTI3OCwgMTIxNikKKwkJCQkgICAgKDQ1NCwgNzgzKSkKKwkJCQlsaW5lX3N0eWxlIAkwKQorCQkJICAgIChvYmplY3QgSW1wb3J0VmlldyAiIiBANjEKKwkJCQlzdGVyZW90eXBlIAlUUlVFCisJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJCXF1aWR1ICAgICAgCSIzRTQzRDUwODAyNzgiCisJCQkJY2xpZW50ICAgICAJQDgKKwkJCQlzdXBwbGllciAgIAlAMTAKKwkJCQlsaW5lX3N0eWxlIAkwKQorCQkJICAgIChvYmplY3QgSW1wb3J0VmlldyAiIiBANjIKKwkJCQlzdGVyZW90eXBlIAlUUlVFCisJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJCXF1aWR1ICAgICAgCSIzRTQzRDU1QTAyNTgiCisJCQkJY2xpZW50ICAgICAJQDgKKwkJCQlzdXBwbGllciAgIAlANworCQkJCWxpbmVfc3R5bGUgCTApCisJCQkgICAgKG9iamVjdCBJbXBvcnRWaWV3ICIiIEA2MworCQkJCXN0ZXJlb3R5cGUgCVRSVUUKKwkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkJcXVpZHUgICAgICAJIjNFNDNENTYwMDBEMCIKKwkJCQljbGllbnQgICAgIAlAOAorCQkJCXN1cHBsaWVyICAgCUAyCisJCQkJbGluZV9zdHlsZSAJMCkKKwkJCSAgICAob2JqZWN0IEltcG9ydFZpZXcgIiIgQDY0CisJCQkJc3RlcmVvdHlwZSAJVFJVRQorCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCQlxdWlkdSAgICAgIAkiM0U0M0QxOUUwMUE5IgorCQkJCWNsaWVudCAgICAgCUA0CisJCQkJc3VwcGxpZXIgICAJQDUKKwkJCQlsaW5lX3N0eWxlIAkwKQorCQkJICAgIChvYmplY3QgSW1wb3J0VmlldyAiIiBANjUKKwkJCQlzdGVyZW90eXBlIAlUUlVFCisJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJCXF1aWR1ICAgICAgCSIzRTQzRDFBMTAxODUiCisJCQkJY2xpZW50ICAgICAJQDQKKwkJCQlzdXBwbGllciAgIAlAMTcKKwkJCQlsaW5lX3N0eWxlIAkwKQorCQkJICAgIChvYmplY3QgSW1wb3J0VmlldyAiIiBANjYKKwkJCQlzdGVyZW90eXBlIAlUUlVFCisJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJCXF1aWR1ICAgICAgCSIzRTQzRDFDRTAwN0MiCisJCQkJY2xpZW50ICAgICAJQDQKKwkJCQlzdXBwbGllciAgIAlAMworCQkJCWxpbmVfc3R5bGUgCTApCisJCQkgICAgKG9iamVjdCBJbXBvcnRWaWV3ICIiIEA2NworCQkJCXN0ZXJlb3R5cGUgCVRSVUUKKwkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkJcXVpZHUgICAgICAJIjNFNDNEMUQ4MDBEMCIKKwkJCQljbGllbnQgICAgIAlANAorCQkJCXN1cHBsaWVyICAgCUAxMQorCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cworCQkJCSAgICAoMjA4MSwgODkwKQorCQkJCSAgICAoOTU5LCAxNjE2KQorCQkJCSAgICAoNDA5LCAyMzUxKSkKKwkJCQlsaW5lX3N0eWxlIAkwKQorCQkJICAgIChvYmplY3QgSW1wb3J0VmlldyAiIiBANjgKKwkJCQlzdGVyZW90eXBlIAlUUlVFCisJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJCXF1aWR1ICAgICAgCSIzRTQzRDI1QzAzMUYiCisJCQkJY2xpZW50ICAgICAJQDQKKwkJCQlzdXBwbGllciAgIAlAOAorCQkJCWxpbmVfc3R5bGUgCTApCisJCQkgICAgKG9iamVjdCBJbXBvcnRWaWV3ICIiIEA2OQorCQkJCXN0ZXJlb3R5cGUgCVRSVUUKKwkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkJcXVpZHUgICAgICAJIjNFNDNEMjYwMDI4RSIKKwkJCQljbGllbnQgICAgIAlANAorCQkJCXN1cHBsaWVyICAgCUAxNQorCQkJCWxpbmVfc3R5bGUgCTApCisJCQkgICAgKG9iamVjdCBJbXBvcnRWaWV3ICIiIEA3MAorCQkJCXN0ZXJlb3R5cGUgCVRSVUUKKwkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkJcXVpZHUgICAgICAJIjNFNDNEMjZBMDE1QyIKKwkJCQljbGllbnQgICAgIAlANAorCQkJCXN1cHBsaWVyICAgCUAxMworCQkJCWxpbmVfc3R5bGUgCTApCisJCQkgICAgKG9iamVjdCBJbXBvcnRWaWV3ICIiIEA3MQorCQkJCXN0ZXJlb3R5cGUgCVRSVUUKKwkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkJcXVpZHUgICAgICAJIjNFNDNEMjgzMDI3MSIKKwkJCQljbGllbnQgICAgIAlANAorCQkJCXN1cHBsaWVyICAgCUAxOAorCQkJCWxpbmVfc3R5bGUgCTApCisJCQkgICAgKG9iamVjdCBJbXBvcnRWaWV3ICIiIEA3MgorCQkJCXN0ZXJlb3R5cGUgCVRSVUUKKwkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkJcXVpZHUgICAgICAJIjNFNDNEMkM4MDI0OCIKKwkJCQljbGllbnQgICAgIAlANAorCQkJCXN1cHBsaWVyICAgCUA5CisJCQkJbGluZV9zdHlsZSAJMCkKKwkJCSAgICAob2JqZWN0IEltcG9ydFZpZXcgIiIgQDczCisJCQkJc3RlcmVvdHlwZSAJVFJVRQorCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCQlxdWlkdSAgICAgIAkiM0U0M0QyRDYwMDJCIgorCQkJCWNsaWVudCAgICAgCUA0CisJCQkJc3VwcGxpZXIgICAJQDIxCisJCQkJbGluZV9zdHlsZSAJMCkKKwkJCSAgICAob2JqZWN0IEltcG9ydFZpZXcgIiIgQDc0CisJCQkJc3RlcmVvdHlwZSAJVFJVRQorCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCQlxdWlkdSAgICAgIAkiM0U0M0QzRDMwMEY3IgorCQkJCWNsaWVudCAgICAgCUA0CisJCQkJc3VwcGxpZXIgICAJQDIzCisJCQkJbGluZV9zdHlsZSAJMCkKKwkJCSAgICAob2JqZWN0IEltcG9ydFZpZXcgIiIgQDc1CisJCQkJc3RlcmVvdHlwZSAJVFJVRQorCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCQlxdWlkdSAgICAgIAkiM0U0M0QwM0MwMzk1IgorCQkJCWNsaWVudCAgICAgCUAyCisJCQkJc3VwcGxpZXIgICAJQDUKKwkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKKwkJCQkgICAgKDE3MSwgMTg1NSkKKwkJCQkgICAgKDE2LCA3NjYpCisJCQkJICAgICgyMDUsIDI1MCkpCisJCQkJbGluZV9zdHlsZSAJMCkKKwkJCSAgICAob2JqZWN0IEltcG9ydFZpZXcgIiIgQDc2CisJCQkJc3RlcmVvdHlwZSAJVFJVRQorCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCQlxdWlkdSAgICAgIAkiM0U0M0QwM0YwMUMyIgorCQkJCWNsaWVudCAgICAgCUAyCisJCQkJc3VwcGxpZXIgICAJQDE3CisJCQkJbGluZV9zdHlsZSAJMCkKKwkJCSAgICAob2JqZWN0IEltcG9ydFZpZXcgIiIgQDc3CisJCQkJc3RlcmVvdHlwZSAJVFJVRQorCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCQlxdWlkdSAgICAgIAkiM0U0M0QwNDMwMjRBIgorCQkJCWNsaWVudCAgICAgCUAyCisJCQkJc3VwcGxpZXIgICAJQDE4CisJCQkJbGluZV9zdHlsZSAJMCkKKwkJCSAgICAob2JqZWN0IEltcG9ydFZpZXcgIiIgQDc4CisJCQkJc3RlcmVvdHlwZSAJVFJVRQorCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCQlxdWlkdSAgICAgIAkiM0U0M0RDMkIwMjU3IgorCQkJCWNsaWVudCAgICAgCUAxOAorCQkJCXN1cHBsaWVyICAgCUAxNworCQkJCWxpbmVfc3R5bGUgCTApCisJCQkgICAgKG9iamVjdCBJbXBvcnRWaWV3ICIiIEA3OQorCQkJCXN0ZXJlb3R5cGUgCVRSVUUKKwkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkJcXVpZHUgICAgICAJIjNFNDNERDNFMDI3MSIKKwkJCQljbGllbnQgICAgIAlAMTgKKwkJCQlzdXBwbGllciAgIAlANQorCQkJCWxpbmVfc3R5bGUgCTApCisJCQkgICAgKG9iamVjdCBJbXBvcnRWaWV3ICIiIEA4MAorCQkJCXN0ZXJlb3R5cGUgCVRSVUUKKwkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkJcXVpZHUgICAgICAJIjNFNDNERDQxMDJDRiIKKwkJCQljbGllbnQgICAgIAlAMTgKKwkJCQlzdXBwbGllciAgIAlAMworCQkJCWxpbmVfc3R5bGUgCTApCisJCQkgICAgKG9iamVjdCBJbXBvcnRWaWV3ICIiIEA4MQorCQkJCXN0ZXJlb3R5cGUgCVRSVUUKKwkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkJcXVpZHUgICAgICAJIjNFNDNERERFMDBCOCIKKwkJCQljbGllbnQgICAgIAlAMTgKKwkJCQlzdXBwbGllciAgIAlANAorCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cworCQkJCSAgICAoNDU0LCA2NTQpCisJCQkJICAgICgxMjkzLCAzODEpCisJCQkJICAgICgyMDczLCA3MzEpKQorCQkJCWxpbmVfc3R5bGUgCTApKSkpKQorCSAgICAob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJvcmcuYXBhY2hlLmNveW90ZSIKKwkJcXVpZCAgICAgICAJIjNFNDJERTlGMDEzMiIKKwkJdmlzaWJsZV9jYXRlZ29yaWVzIAkobGlzdCB2aXNpYmlsaXR5X3JlbGF0aW9uc2hpcF9saXN0CisJCSAgICAob2JqZWN0IFZpc2liaWxpdHlfUmVsYXRpb25zaGlwCisJCQlxdWlkICAgICAgIAkiM0U0MkRFRkMwMEIzIgorCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6b3JnLmFwYWNoZS50b21jYXQudXRpbCIKKwkJCXF1aWR1ICAgICAgCSIzRTQyREVERjAxRjIiKSkKKwkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKKwkJbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QpCisJCWxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdCkpCisJICAgIChvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgIm9yZy5hcGFjaGUudG9tY2F0LnV0aWwiCisJCXF1aWQgICAgICAgCSIzRTQyREVERjAxRjIiCisJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCisJCWxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0KQorCQlsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QpKQorCSAgICAob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJvcmcuYXBhY2hlLmphc3BlciIKKwkJcXVpZCAgICAgICAJIjNFNDJERUZGMDI3MCIKKwkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKKwkJbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QpCisJCWxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdCkpCisJICAgIChvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgIm9yZy5hcGFjaGUubmFtaW5nIgorCQlxdWlkICAgICAgIAkiM0U0M0QxNTgwMzM5IgorCQlleHBvcnRDb250cm9sIAkiUHVibGljIgorCQlsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdCkKKwkJbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0KSkKKwkgICAgKG9iamVjdCBNZWNoYW5pc20gQDgyCisJCWxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0CisJCSAgICAob2JqZWN0IE9iamVjdCAiQm9vdHN0cmFwIgorCQkJcXVpZCAgICAgICAJIjNERkRGOEZEMDM0NSIKKwkJCWNvbGxhYm9yYXRvcnMgCShsaXN0IGxpbmtfbGlzdAorCQkJICAgIChvYmplY3QgTGluaworCQkJCXF1aWQgICAgICAgCSIzREZERjkyMTAwMDgiCisJCQkJc3VwcGxpZXIgICAJIkJvb3RzdHJhcCIKKwkJCQlxdWlkdSAgICAgIAkiM0RGREY4RkQwMzQ1IgorCQkJCW1lc3NhZ2VzICAgCShsaXN0IE1lc3NhZ2VzCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAiaW5pdENsYXNzTG9hZGVycygpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGREY5MjEwMDA5IgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjEiCisJCQkJCW9yZGluYWwgICAgCTAKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpKSkKKwkJCSAgICAob2JqZWN0IExpbmsKKwkJCQlxdWlkICAgICAgIAkiM0RGREY5MUEwMTBDIgorCQkJCXN1cHBsaWVyICAgCSJDYXRhbGluYSIKKwkJCQlxdWlkdSAgICAgIAkiM0RGREY5MEEwMzMwIgorCQkJCW1lc3NhZ2VzICAgCShsaXN0IE1lc3NhZ2VzCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAibmV3SW5zdGFuY2UoKSIKKwkJCQkJcXVpZCAgICAgICAJIjNERkRGOTFBMDEwRCIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiRnJvbUNsaWVudFRvU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSIyIgorCQkJCQlvcmRpbmFsICAgIAkxCisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKQorCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgInNldFBhcmVudENsYXNzTG9hZGVyKCkiCisJCQkJCXF1aWQgICAgICAgCSIzREZERjk3OTAwQzIiCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiMyIKKwkJCQkJb3JkaW5hbCAgICAJMgorCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkKKwkJCQkgICAgKG9iamVjdCBNZXNzYWdlICJsb2FkKCkiCisJCQkJCXF1aWQgICAgICAgCSIzREZERkEzNDAyRjIiCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiNCIKKwkJCQkJb3JkaW5hbCAgICAJMworCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkpKSkKKwkJCXBlcnNpc3RlbmNlIAkiVHJhbnNpZW50IgorCQkJY3JlYXRpb25PYmogCUZBTFNFCisJCQltdWx0aSAgICAgIAlGQUxTRSkKKwkJICAgIChvYmplY3QgT2JqZWN0ICJEaWdlc3RlciIKKwkJCXF1aWQgICAgICAgCSIzREZERkFGMjAxQTEiCisJCQljb2xsYWJvcmF0b3JzIAkobGlzdCBsaW5rX2xpc3QKKwkJCSAgICAob2JqZWN0IExpbmsKKwkJCQlxdWlkICAgICAgIAkiM0RGREZCODQwMEE2IgorCQkJCXN1cHBsaWVyICAgCSJTZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lciIKKwkJCQlxdWlkdSAgICAgIAkiM0RGREZCNEIwMjE3IgorCQkJCW1lc3NhZ2VzICAgCShsaXN0IE1lc3NhZ2VzCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAibmV3SW5zdGFuY2UoKSIKKwkJCQkJcXVpZCAgICAgICAJIjNERkRGQjg0MDBBNyIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiRnJvbUNsaWVudFRvU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSI5LjEiCisJCQkJCW9yZGluYWwgICAgCTkKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpKSkKKwkJCSAgICAob2JqZWN0IExpbmsKKwkJCQlxdWlkICAgICAgIAkiM0RGREZCOTIwMTQ3IgorCQkJCXN1cHBsaWVyICAgCSJHbG9iYWxSZXNvdXJjZXNMaWZlY3ljbGVMaXN0ZW5lciIKKwkJCQlxdWlkdSAgICAgIAkiM0RGREZCN0EwMkFCIgorCQkJCW1lc3NhZ2VzICAgCShsaXN0IE1lc3NhZ2VzCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAibmV3SW5zdGFuY2UoKSIKKwkJCQkJcXVpZCAgICAgICAJIjNERkRGQjkyMDE0OCIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiRnJvbUNsaWVudFRvU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSI5LjIiCisJCQkJCW9yZGluYWwgICAgCTEwCisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKSkpKQorCQkJcGVyc2lzdGVuY2UgCSJUcmFuc2llbnQiCisJCQljcmVhdGlvbk9iaiAJRkFMU0UKKwkJCW11bHRpICAgICAgCUZBTFNFKQorCQkgICAgKG9iamVjdCBPYmplY3QgIlNlcnZlckxpZmVjeWNsZUxpc3RlbmVyIgorCQkJcXVpZCAgICAgICAJIjNERkRGQjRCMDIxNyIKKwkJCXBlcnNpc3RlbmNlIAkiVHJhbnNpZW50IgorCQkJY3JlYXRpb25PYmogCUZBTFNFCisJCQltdWx0aSAgICAgIAlGQUxTRSkKKwkJICAgIChvYmplY3QgT2JqZWN0ICJHbG9iYWxSZXNvdXJjZXNMaWZlY3ljbGVMaXN0ZW5lciIKKwkJCXF1aWQgICAgICAgCSIzREZERkI3QTAyQUIiCisJCQlwZXJzaXN0ZW5jZSAJIlRyYW5zaWVudCIKKwkJCWNyZWF0aW9uT2JqIAlGQUxTRQorCQkJbXVsdGkgICAgICAJRkFMU0UpCisJCSAgICAob2JqZWN0IE9iamVjdCAiU2VjdXJpdHlDb25maWciCisJCQlxdWlkICAgICAgIAkiM0RGREZCRDgwMkJBIgorCQkJcGVyc2lzdGVuY2UgCSJUcmFuc2llbnQiCisJCQljcmVhdGlvbk9iaiAJRkFMU0UKKwkJCW11bHRpICAgICAgCUZBTFNFKQorCQkgICAgKG9iamVjdCBPYmplY3QgIkNhdGFsaW5hIgorCQkJcXVpZCAgICAgICAJIjNERkRGOTBBMDMzMCIKKwkJCWNvbGxhYm9yYXRvcnMgCShsaXN0IGxpbmtfbGlzdAorCQkJICAgIChvYmplY3QgTGluaworCQkJCXF1aWQgICAgICAgCSIzREZERkE4MDAxRDkiCisJCQkJc3VwcGxpZXIgICAJIkNhdGFsaW5hIgorCQkJCXF1aWR1ICAgICAgCSIzREZERjkwQTAzMzAiCisJCQkJbWVzc2FnZXMgICAJKGxpc3QgTWVzc2FnZXMKKwkJCQkgICAgKG9iamVjdCBNZXNzYWdlICJpbml0RGlycygpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGREZBODAwMURBIgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjUiCisJCQkJCW9yZGluYWwgICAgCTQKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAiaW5pdE5hbWluZygpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGREZBOEIwMzQ3IgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjYiCisJCQkJCW9yZGluYWwgICAgCTUKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAiaW5pdGlhbGl6ZSgpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGREZBQUQwMUFDIgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjciCisJCQkJCW9yZGluYWwgICAgCTYKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpKSkKKwkJCSAgICAob2JqZWN0IExpbmsKKwkJCQlxdWlkICAgICAgIAkiM0RGREZBRjgwMEMzIgorCQkJCXN1cHBsaWVyICAgCSJEaWdlc3RlciIKKwkJCQlxdWlkdSAgICAgIAkiM0RGREZBRjIwMUExIgorCQkJCW1lc3NhZ2VzICAgCShsaXN0IE1lc3NhZ2VzCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAiY3JlYXRlRGlnZXN0ZXIoKSIKKwkJCQkJcXVpZCAgICAgICAJIjNERkRGQUY4MDBDNCIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiRnJvbUNsaWVudFRvU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSI4IgorCQkJCQlvcmRpbmFsICAgIAk3CisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKQorCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgInBhcnNlKCkiCisJCQkJCXF1aWQgICAgICAgCSIzREZERkIwMTAwQjIiCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiOSIKKwkJCQkJb3JkaW5hbCAgICAJOAorCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkpKQorCQkJICAgIChvYmplY3QgTGluaworCQkJCXF1aWQgICAgICAgCSIzREZERkJFQTAwQzEiCisJCQkJc3VwcGxpZXIgICAJIlNlY3VyaXR5Q29uZmlnIgorCQkJCXF1aWR1ICAgICAgCSIzREZERkJEODAyQkEiCisJCQkJbWVzc2FnZXMgICAJKGxpc3QgTWVzc2FnZXMKKwkJCQkgICAgKG9iamVjdCBNZXNzYWdlICJuZXdJbnN0YW5jZSgpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGREZCRUEwMEMyIgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjEwIgorCQkJCQlvcmRpbmFsICAgIAkxMQorCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkKKwkJCQkgICAgKG9iamVjdCBNZXNzYWdlICJzZXRQYWNrYWdlRGVmaW5pdGlvbigpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGREZCRjQwMUYyIgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjExIgorCQkJCQlvcmRpbmFsICAgIAkxMgorCQkJCQlPcGVyYXRpb24gIAkic2V0UGFja2FnZURlZmluaXRpb24iCisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKQorCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgInNldFBhY2thZ2VBY2Nlc3MoKSIKKwkJCQkJcXVpZCAgICAgICAJIjNERkRGQzEyMDNDMiIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiRnJvbUNsaWVudFRvU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSIxMiIKKwkJCQkJb3JkaW5hbCAgICAJMTMKKwkJCQkJT3BlcmF0aW9uICAJInNldFBhY2thZ2VBY2Nlc3MiCisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKSkpKQorCQkJcGVyc2lzdGVuY2UgCSJUcmFuc2llbnQiCisJCQljcmVhdGlvbk9iaiAJRkFMU0UKKwkJCW11bHRpICAgICAgCUZBTFNFKSkpCisJICAgIChvYmplY3QgTWVjaGFuaXNtIEA4MworCQlsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdAorCQkgICAgKG9iamVjdCBPYmplY3QgIkNhdGFsaW5hIgorCQkJcXVpZCAgICAgICAJIjNERkRGQzhGMDE1RiIKKwkJCWNvbGxhYm9yYXRvcnMgCShsaXN0IGxpbmtfbGlzdAorCQkJICAgIChvYmplY3QgTGluaworCQkJCXF1aWQgICAgICAgCSIzREZERkQxRjAwNzUiCisJCQkJc3VwcGxpZXIgICAJIlN0YW5kYXJkU2VydmVyIgorCQkJCXF1aWR1ICAgICAgCSIzREZERkNDQjAwNkIiCisJCQkJbWVzc2FnZXMgICAJKGxpc3QgTWVzc2FnZXMKKwkJCQkgICAgKG9iamVjdCBNZXNzYWdlICJpbml0aWFsaXplKCkiCisJCQkJCXF1aWQgICAgICAgCSIzREZERkQxRjAwNzYiCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiMSIKKwkJCQkJb3JkaW5hbCAgICAJMAorCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkpKSkKKwkJCXBlcnNpc3RlbmNlIAkiVHJhbnNpZW50IgorCQkJY3JlYXRpb25PYmogCUZBTFNFCisJCQltdWx0aSAgICAgIAlGQUxTRSkKKwkJICAgIChvYmplY3QgT2JqZWN0ICJTdGFuZGFyZFNlcnZlciIKKwkJCXF1aWQgICAgICAgCSIzREZERkNDQjAwNkIiCisJCQljb2xsYWJvcmF0b3JzIAkobGlzdCBsaW5rX2xpc3QKKwkJCSAgICAob2JqZWN0IExpbmsKKwkJCQlxdWlkICAgICAgIAkiM0RGREZEM0QwMUMzIgorCQkJCXN1cHBsaWVyICAgCSJTdGFuZGFyZFNlcnZpY2UiCisJCQkJcXVpZHUgICAgICAJIjNERkRGRDM3MDAyMCIKKwkJCQltZXNzYWdlcyAgIAkobGlzdCBNZXNzYWdlcworCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgImluaXRpYWxpemUoKSIKKwkJCQkJcXVpZCAgICAgICAJIjNERkRGRDNEMDFDNCIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiRnJvbUNsaWVudFRvU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSIyIgorCQkJCQlvcmRpbmFsICAgIAkxCisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKSkpKQorCQkJcGVyc2lzdGVuY2UgCSJUcmFuc2llbnQiCisJCQljcmVhdGlvbk9iaiAJRkFMU0UKKwkJCW11bHRpICAgICAgCUZBTFNFKQorCQkgICAgKG9iamVjdCBPYmplY3QgIlN0YW5kYXJkU2VydmljZSIKKwkJCXF1aWQgICAgICAgCSIzREZERkQzNzAwMjAiCisJCQljb2xsYWJvcmF0b3JzIAkobGlzdCBsaW5rX2xpc3QKKwkJCSAgICAob2JqZWN0IExpbmsKKwkJCQlxdWlkICAgICAgIAkiM0RGREZFOTkwMzA0IgorCQkJCXN1cHBsaWVyICAgCSJDb3lvdGVDb25uZWN0b3IiCisJCQkJcXVpZHUgICAgICAJIjNERkRGRTgxMDMxMyIKKwkJCQltZXNzYWdlcyAgIAkobGlzdCBNZXNzYWdlcworCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgImluaXRpYWxpemUoKSIKKwkJCQkJcXVpZCAgICAgICAJIjNERkRGRTk5MDMwNSIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiRnJvbUNsaWVudFRvU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSIyLjEiCisJCQkJCW9yZGluYWwgICAgCTIKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpKSkpCisJCQlwZXJzaXN0ZW5jZSAJIlRyYW5zaWVudCIKKwkJCWNyZWF0aW9uT2JqIAlGQUxTRQorCQkJbXVsdGkgICAgICAJRkFMU0UpCisJCSAgICAob2JqZWN0IE9iamVjdCAiQ295b3RlQ29ubmVjdG9yIgorCQkJcXVpZCAgICAgICAJIjNERkRGRTgxMDMxMyIKKwkJCWNvbGxhYm9yYXRvcnMgCShsaXN0IGxpbmtfbGlzdAorCQkJICAgIChvYmplY3QgTGluaworCQkJCXF1aWQgICAgICAgCSIzREZFMDEzRDAyMTYiCisJCQkJc3VwcGxpZXIgICAJIkNveW90ZUFkYXB0ZXIiCisJCQkJcXVpZHUgICAgICAJIjNERkRGRkEwMDIyNiIKKwkJCQltZXNzYWdlcyAgIAkobGlzdCBNZXNzYWdlcworCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgIm5ldygpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTAxM0QwMjE3IgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjIuMS4xIgorCQkJCQlvcmRpbmFsICAgIAkzCisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKSkpCisJCQkgICAgKG9iamVjdCBMaW5rCisJCQkJcXVpZCAgICAgICAJIjNERkUwMTgzMDMyRiIKKwkJCQlzdXBwbGllciAgIAkiSHR0cDExUHJvdG9jb2wiCisJCQkJcXVpZHUgICAgICAJIjNERkUwMTY2MDFBNiIKKwkJCQltZXNzYWdlcyAgIAkobGlzdCBNZXNzYWdlcworCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgIm5ldygpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTAxODMwMzMwIgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjIuMS4yIgorCQkJCQlvcmRpbmFsICAgIAk0CisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKQorCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgImluaXQoKSIKKwkJCQkJcXVpZCAgICAgICAJIjNERkUwMTg4MDMyQyIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiRnJvbUNsaWVudFRvU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSIyLjEuMyIKKwkJCQkJb3JkaW5hbCAgICAJNQorCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkpKQorCQkJICAgIChvYmplY3QgTGluaworCQkJCXF1aWQgICAgICAgCSIzREZFMDFCQzAzOEIiCisJCQkJc3VwcGxpZXIgICAJIkprQ295b3RlQWRhcHRlciIKKwkJCQlxdWlkdSAgICAgIAkiM0RGRTAxQUQwMUE4IgorCQkJCW1lc3NhZ2VzICAgCShsaXN0IE1lc3NhZ2VzCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAibmV3KCkiCisJCQkJCXF1aWQgICAgICAgCSIzREZFMDFCQzAzOEMiCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiMi4xLjQiCisJCQkJCW9yZGluYWwgICAgCTYKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAiaW5pdCgpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTAxQzMwMTY0IgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjIuMS41IgorCQkJCQlvcmRpbmFsICAgIAk3CisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKSkpKQorCQkJcGVyc2lzdGVuY2UgCSJUcmFuc2llbnQiCisJCQljcmVhdGlvbk9iaiAJRkFMU0UKKwkJCW11bHRpICAgICAgCUZBTFNFKQorCQkgICAgKG9iamVjdCBPYmplY3QgIkNveW90ZUFkYXB0ZXIiCisJCQlxdWlkICAgICAgIAkiM0RGREZGQTAwMjI2IgorCQkJcGVyc2lzdGVuY2UgCSJUcmFuc2llbnQiCisJCQljcmVhdGlvbk9iaiAJRkFMU0UKKwkJCW11bHRpICAgICAgCUZBTFNFKQorCQkgICAgKG9iamVjdCBPYmplY3QgIkh0dHAxMVByb3RvY29sIgorCQkJcXVpZCAgICAgICAJIjNERkUwMTY2MDFBNiIKKwkJCXBlcnNpc3RlbmNlIAkiVHJhbnNpZW50IgorCQkJY3JlYXRpb25PYmogCUZBTFNFCisJCQltdWx0aSAgICAgIAlGQUxTRSkKKwkJICAgIChvYmplY3QgT2JqZWN0ICJKa0NveW90ZUFkYXB0ZXIiCisJCQlxdWlkICAgICAgIAkiM0RGRTAxQUQwMUE4IgorCQkJcGVyc2lzdGVuY2UgCSJUcmFuc2llbnQiCisJCQljcmVhdGlvbk9iaiAJRkFMU0UKKwkJCW11bHRpICAgICAgCUZBTFNFKSkpCisJICAgIChvYmplY3QgTWVjaGFuaXNtIEA4NAorCQlsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdAorCQkgICAgKG9iamVjdCBPYmplY3QgIkJvb3RzdHJhcCIKKwkJCXF1aWQgICAgICAgCSIzREZFMDI3NzAwRjUiCisJCQljb2xsYWJvcmF0b3JzIAkobGlzdCBsaW5rX2xpc3QKKwkJCSAgICAob2JqZWN0IExpbmsKKwkJCQlxdWlkICAgICAgIAkiM0RGRTAyODMwMzczIgorCQkJCXN1cHBsaWVyICAgCSJDYXRhbGluYSIKKwkJCQlxdWlkdSAgICAgIAkiM0RGRTAyN0QwMDY3IgorCQkJCW1lc3NhZ2VzICAgCShsaXN0IE1lc3NhZ2VzCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAic3RhcnQoKSIKKwkJCQkJcXVpZCAgICAgICAJIjNERkUwMjgzMDM3NCIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiRnJvbUNsaWVudFRvU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSIxIgorCQkJCQlvcmRpbmFsICAgIAkwCisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKSkpKQorCQkJcGVyc2lzdGVuY2UgCSJUcmFuc2llbnQiCisJCQljcmVhdGlvbk9iaiAJRkFMU0UKKwkJCW11bHRpICAgICAgCUZBTFNFKQorCQkgICAgKG9iamVjdCBPYmplY3QgIkNhdGFsaW5hIgorCQkJcXVpZCAgICAgICAJIjNERkUwMjdEMDA2NyIKKwkJCWNvbGxhYm9yYXRvcnMgCShsaXN0IGxpbmtfbGlzdAorCQkJICAgIChvYmplY3QgTGluaworCQkJCXF1aWQgICAgICAgCSIzREZFMDJCQTAxODciCisJCQkJc3VwcGxpZXIgICAJIlN0YW5kYXJkU2VydmVyIgorCQkJCXF1aWR1ICAgICAgCSIzREZFMDJCMzAwMTUiCisJCQkJbWVzc2FnZXMgICAJKGxpc3QgTWVzc2FnZXMKKwkJCQkgICAgKG9iamVjdCBNZXNzYWdlICJzdGFydCgpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTAyQkEwMTg4IgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjEuMSIKKwkJCQkJb3JkaW5hbCAgICAJMQorCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkpKSkKKwkJCXBlcnNpc3RlbmNlIAkiVHJhbnNpZW50IgorCQkJY3JlYXRpb25PYmogCUZBTFNFCisJCQltdWx0aSAgICAgIAlGQUxTRSkKKwkJICAgIChvYmplY3QgT2JqZWN0ICJTdGFuZGFyZFNlcnZlciIKKwkJCXF1aWQgICAgICAgCSIzREZFMDJCMzAwMTUiCisJCQljb2xsYWJvcmF0b3JzIAkobGlzdCBsaW5rX2xpc3QKKwkJCSAgICAob2JqZWN0IExpbmsKKwkJCQlxdWlkICAgICAgIAkiM0RGRTAyRDMwMDZCIgorCQkJCXN1cHBsaWVyICAgCSJTdGFuZGFyZFNlcnZlciIKKwkJCQlxdWlkdSAgICAgIAkiM0RGRTAyQjMwMDE1IgorCQkJCW1lc3NhZ2VzICAgCShsaXN0IE1lc3NhZ2VzCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAiZmlyZUxpZmVjeWNsZUV2ZW50KEJFRk9SRV9TVEFSVF9FVkVOVCkiCisJCQkJCXF1aWQgICAgICAgCSIzREZFMDJEMzAwNkMiCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiMS4xLjEiCisJCQkJCW9yZGluYWwgICAgCTIKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAiZmlyZUxpZmVjeWNsZUV2ZW50KFNUQVJUX0VWRU5UKSIKKwkJCQkJcXVpZCAgICAgICAJIjNERkUwMkRGMDJERiIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiRnJvbUNsaWVudFRvU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSIxLjEuMiIKKwkJCQkJb3JkaW5hbCAgICAJMworCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkpKQorCQkJICAgIChvYmplY3QgTGluaworCQkJCXF1aWQgICAgICAgCSIzREZFMDMwQzAyQjIiCisJCQkJc3VwcGxpZXIgICAJIlN0YW5kYXJkU2VydmljZSIKKwkJCQlxdWlkdSAgICAgIAkiM0RGRTAzMDQwMEUzIgorCQkJCW1lc3NhZ2VzICAgCShsaXN0IE1lc3NhZ2VzCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAic3RhcnQoKSIKKwkJCQkJcXVpZCAgICAgICAJIjNERkUwMzBDMDJCMyIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiRnJvbUNsaWVudFRvU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSIxLjEuMyIKKwkJCQkJb3JkaW5hbCAgICAJNAorCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkpKSkKKwkJCXBlcnNpc3RlbmNlIAkiVHJhbnNpZW50IgorCQkJY3JlYXRpb25PYmogCUZBTFNFCisJCQltdWx0aSAgICAgIAlGQUxTRSkKKwkJICAgIChvYmplY3QgT2JqZWN0ICJTdGFuZGFyZFNlcnZpY2UiCisJCQlxdWlkICAgICAgIAkiM0RGRTAzMDQwMEUzIgorCQkJY29sbGFib3JhdG9ycyAJKGxpc3QgbGlua19saXN0CisJCQkgICAgKG9iamVjdCBMaW5rCisJCQkJcXVpZCAgICAgICAJIjNERkUwMzFEMDAyMSIKKwkJCQlzdXBwbGllciAgIAkiU3RhbmRhcmRTZXJ2aWNlIgorCQkJCXF1aWR1ICAgICAgCSIzREZFMDMwNDAwRTMiCisJCQkJbWVzc2FnZXMgICAJKGxpc3QgTWVzc2FnZXMKKwkJCQkgICAgKG9iamVjdCBNZXNzYWdlICJmaXJlTGlmZWN5Y2xlRXZlbnQoQkVGT1JFX1NUQVJUX0VWRU5UKSIKKwkJCQkJcXVpZCAgICAgICAJIjNERkUwMzFEMDAyMiIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiRnJvbUNsaWVudFRvU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSIxLjEuMy4xIgorCQkJCQlvcmRpbmFsICAgIAk1CisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKQorCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgImZpcmVMaWZlY3ljbGVFdmVudChTVEFSVF9FVkVOVCkiCisJCQkJCXF1aWQgICAgICAgCSIzREZFMDMzMDAxOUIiCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiMS4xLjMuMiIKKwkJCQkJb3JkaW5hbCAgICAJNgorCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkpKQorCQkJICAgIChvYmplY3QgTGluaworCQkJCXF1aWQgICAgICAgCSIzREZFMDM3MDAxODkiCisJCQkJc3VwcGxpZXIgICAJIlN0YW5kYXJkRW5naW5lIgorCQkJCXF1aWR1ICAgICAgCSIzREZFMDM0NzAwQzIiCisJCQkJbWVzc2FnZXMgICAJKGxpc3QgTWVzc2FnZXMKKwkJCQkgICAgKG9iamVjdCBNZXNzYWdlICJzdGFydCgpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTAzNzAwMThBIgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjEuMS4zLjMiCisJCQkJCW9yZGluYWwgICAgCTcKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpKSkpCisJCQlwZXJzaXN0ZW5jZSAJIlRyYW5zaWVudCIKKwkJCWNyZWF0aW9uT2JqIAlGQUxTRQorCQkJbXVsdGkgICAgICAJRkFMU0UpCisJCSAgICAob2JqZWN0IE9iamVjdCAiU3RhbmRhcmRFbmdpbmUiCisJCQlxdWlkICAgICAgIAkiM0RGRTAzNDcwMEMyIgorCQkJY29sbGFib3JhdG9ycyAJKGxpc3QgbGlua19saXN0CisJCQkgICAgKG9iamVjdCBMaW5rCisJCQkJcXVpZCAgICAgICAJIjNERkUwMzc1MDA1MCIKKwkJCQlzdXBwbGllciAgIAkiU3RhbmRhcmRFbmdpbmUiCisJCQkJcXVpZHUgICAgICAJIjNERkUwMzQ3MDBDMiIKKwkJCQltZXNzYWdlcyAgIAkobGlzdCBNZXNzYWdlcworCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgImZpcmVMaWZlY3ljbGVFdmVudChCRUZPUkVfU1RBUlRfRVZFTlQpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTAzNzUwMDUxIgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjIiCisJCQkJCW9yZGluYWwgICAgCTgKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAiYWRkRGVmYXVsdE1hcHBlcigpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTAzODkwMDFDIgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjMiCisJCQkJCW9yZGluYWwgICAgCTkKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAibG9nZ2VyLnN0YXJ0KCkiCisJCQkJCXF1aWQgICAgICAgCSIzREZFMDM5ODAyODEiCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiNCIKKwkJCQkJb3JkaW5hbCAgICAJMTAKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAicmVhbG0uc3RhcnQoKSIKKwkJCQkJcXVpZCAgICAgICAJIjNERkUwM0E4MDEwNyIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiRnJvbUNsaWVudFRvU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSI1IgorCQkJCQlvcmRpbmFsICAgIAkxMQorCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkKKwkJCQkgICAgKG9iamVjdCBNZXNzYWdlICJmaW5kTWFwcGVycygpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTAzQkQwMDBEIgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjYiCisJCQkJCW9yZGluYWwgICAgCTEyCisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKQorCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgImZpbmRDaGlsZHJlbigpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTAzRTAwMEE0IgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjciCisJCQkJCW9yZGluYWwgICAgCTEzCisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKSkpCisJCQkgICAgKG9iamVjdCBMaW5rCisJCQkJcXVpZCAgICAgICAJIjNERkUwM0ZCMDI3OSIKKwkJCQlzdXBwbGllciAgIAkiU3RhbmRhcmRIb3N0IgorCQkJCXF1aWR1ICAgICAgCSIzREZFMDNGMjAzNUQiCisJCQkJbWVzc2FnZXMgICAJKGxpc3QgTWVzc2FnZXMKKwkJCQkgICAgKG9iamVjdCBNZXNzYWdlICJzdGFydCgpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTAzRkIwMjdBIgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjgiCisJCQkJCW9yZGluYWwgICAgCTE0CisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKSkpKQorCQkJcGVyc2lzdGVuY2UgCSJUcmFuc2llbnQiCisJCQljcmVhdGlvbk9iaiAJRkFMU0UKKwkJCW11bHRpICAgICAgCUZBTFNFKQorCQkgICAgKG9iamVjdCBPYmplY3QgIlN0YW5kYXJkSG9zdCIKKwkJCXF1aWQgICAgICAgCSIzREZFMDNGMjAzNUQiCisJCQljb2xsYWJvcmF0b3JzIAkobGlzdCBsaW5rX2xpc3QKKwkJCSAgICAob2JqZWN0IExpbmsKKwkJCQlxdWlkICAgICAgIAkiM0RGRTA0M0IwMkFEIgorCQkJCXN1cHBsaWVyICAgCSJTdGFuZGFyZEhvc3QiCisJCQkJcXVpZHUgICAgICAJIjNERkUwM0YyMDM1RCIKKwkJCQltZXNzYWdlcyAgIAkobGlzdCBNZXNzYWdlcworCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgImZpcmVMaWZlY3ljbGVFdmVudChCRUZPUkVfU1RBUlRfRVZFTlQpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTA0M0IwMkFFIgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjguMSIKKwkJCQkJb3JkaW5hbCAgICAJMTUKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAiYWRkRGVmYXVsdE1hcHBlcigpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTA0NUMwMjFGIgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjguMiIKKwkJCQkJb3JkaW5hbCAgICAJMTYKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAibG9nZ2VyLnN0YXJ0KCkiCisJCQkJCXF1aWQgICAgICAgCSIzREZFMDQ5QjAwMEMiCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiOC4zIgorCQkJCQlvcmRpbmFsICAgIAkxNworCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkKKwkJCQkgICAgKG9iamVjdCBNZXNzYWdlICJmaW5kTWFwcGVyKCkiCisJCQkJCXF1aWQgICAgICAgCSIzREZFMDRBMzAzQkIiCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiOC40IgorCQkJCQlvcmRpbmFsICAgIAkxOAorCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkKKwkJCQkgICAgKG9iamVjdCBNZXNzYWdlICJmaW5kQ2hpbGRyZW4oKSIKKwkJCQkJcXVpZCAgICAgICAJIjNERkUwNEE5MDM0MiIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiRnJvbUNsaWVudFRvU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSI4LjUiCisJCQkJCW9yZGluYWwgICAgCTE5CisJCQkJCU9wZXJhdGlvbiAgCSJmaW5kQ2hpbGRyZW4iCisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKSkpCisJCQkgICAgKG9iamVjdCBMaW5rCisJCQkJcXVpZCAgICAgICAJIjNERkUwNDhFMDBCOCIKKwkJCQlzdXBwbGllciAgIAkiU3RhbmRhcmRQaXBlbGluZSIKKwkJCQlxdWlkdSAgICAgIAkiM0RGRTA0N0QwMDZEIgorCQkJCW1lc3NhZ2VzICAgCShsaXN0IE1lc3NhZ2VzCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAic3RhcnQoKSIKKwkJCQkJcXVpZCAgICAgICAJIjNERkUwNDhFMDBCOSIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiRnJvbUNsaWVudFRvU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSI4LjYiCisJCQkJCW9yZGluYWwgICAgCTIwCisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKSkpKQorCQkJcGVyc2lzdGVuY2UgCSJUcmFuc2llbnQiCisJCQljcmVhdGlvbk9iaiAJRkFMU0UKKwkJCW11bHRpICAgICAgCUZBTFNFKQorCQkgICAgKG9iamVjdCBPYmplY3QgIlN0YW5kYXJkUGlwZWxpbmUiCisJCQlxdWlkICAgICAgIAkiM0RGRTA0N0QwMDZEIgorCQkJY29sbGFib3JhdG9ycyAJKGxpc3QgbGlua19saXN0CisJCQkgICAgKG9iamVjdCBMaW5rCisJCQkJcXVpZCAgICAgICAJIjNERkUwNTc4MDEzNyIKKwkJCQlzdXBwbGllciAgIAkiU3RhbmRhcmRQaXBlbGluZSIKKwkJCQlxdWlkdSAgICAgIAkiM0RGRTA0N0QwMDZEIgorCQkJCW1lc3NhZ2VzICAgCShsaXN0IE1lc3NhZ2VzCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAiZmlyZUxpZmVjeWNsZUV2ZW50KEJFRk9SRV9TVEFSVF9FVkVOVCkiCisJCQkJCXF1aWQgICAgICAgCSIzREZFMDU3ODAxMzgiCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiOC42LjEiCisJCQkJCW9yZGluYWwgICAgCTIxCisJCQkJCU9wZXJhdGlvbiAgCSJmaXJlTGlmZWN5Y2xlRXZlbnQoQUZURVJfU1RBUlRfRVZFTlQpIgorCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkKKwkJCQkgICAgKG9iamVjdCBNZXNzYWdlICJmaXJlTGlmZWN5Y2xlRXZlbnQoU1RBUlRfRVZFTlQpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTA1QTgwMzk4IgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjguNi4yIgorCQkJCQlvcmRpbmFsICAgIAkyMgorCQkJCQlPcGVyYXRpb24gIAkiZmlyZUxpZmVjeWNsZUV2ZW50KEJFRk9SRV9TVEFSVF9FVkVOVCkiCisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKQorCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgImZpcmVMaWZlY3ljbGVFdmVudChBRlRFUl9FVkVOVCkiCisJCQkJCXF1aWQgICAgICAgCSIzREZFMDVCQTAxOTYiCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiOC42LjMiCisJCQkJCW9yZGluYWwgICAgCTIzCisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKSkpKQorCQkJcGVyc2lzdGVuY2UgCSJUcmFuc2llbnQiCisJCQljcmVhdGlvbk9iaiAJRkFMU0UKKwkJCW11bHRpICAgICAgCUZBTFNFKSkpCisJICAgIChvYmplY3QgTWVjaGFuaXNtIEA4NQorCQlsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdAorCQkgICAgKG9iamVjdCBPYmplY3QgIlN0YW5kYXJkSG9zdCIKKwkJCXF1aWQgICAgICAgCSIzREZFMDUzODAxN0IiCisJCQljb2xsYWJvcmF0b3JzIAkobGlzdCBsaW5rX2xpc3QKKwkJCSAgICAob2JqZWN0IExpbmsKKwkJCQlxdWlkICAgICAgIAkiM0RGRTA2NkMwMzQwIgorCQkJCXN1cHBsaWVyICAgCSJTdGFuZGFyZEhvc3QiCisJCQkJcXVpZHUgICAgICAJIjNERkUwNTM4MDE3QiIKKwkJCQltZXNzYWdlcyAgIAkobGlzdCBNZXNzYWdlcworCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgImZpcmVMaWZlY3ljbGVFdmVudChTVEFSVF9FVkVOVCkiCisJCQkJCXF1aWQgICAgICAgCSIzREZFMDY2QzAzNDEiCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiMSIKKwkJCQkJb3JkaW5hbCAgICAJMAorCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkpKQorCQkJICAgIChvYmplY3QgTGluaworCQkJCXF1aWQgICAgICAgCSIzREZFMDZEMjAyOTMiCisJCQkJc3VwcGxpZXIgICAJIkhvc3RDb25maWciCisJCQkJcXVpZHUgICAgICAJIjNERkUwNkE2MDEzMSIKKwkJCQltZXNzYWdlcyAgIAkobGlzdCBNZXNzYWdlcworCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgImludGVyZXN0ZWRbaV0ubGlmZWN5Y2xlRXZlbnQoKSIKKwkJCQkJcXVpZCAgICAgICAJIjNERkUwNkQyMDI5NCIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiRnJvbUNsaWVudFRvU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSIyIgorCQkJCQlvcmRpbmFsICAgIAkxCisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKQorCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgImluc3RhbGwoKSIKKwkJCQkJcXVpZCAgICAgICAJIjNERkUwNzhCMDNCQiIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiVG9DbGllbnRGcm9tU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSIyLjYiCisJCQkJCW9yZGluYWwgICAgCTcKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAiaW5zdGFsbCgpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTEzMkQwMzA5IgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJUb0NsaWVudEZyb21TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjUiCisJCQkJCW9yZGluYWwgICAgCTEzCisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKSkpCisJCQkgICAgKG9iamVjdCBMaW5rCisJCQkJcXVpZCAgICAgICAJIjNERkUwN0IxMDBCRCIKKwkJCQlzdXBwbGllciAgIAkiU3RhbmRhcmRIb3N0RGVwbG95ZXIiCisJCQkJcXVpZHUgICAgICAJIjNERkUwNzlBMDA1NSIKKwkJCQltZXNzYWdlcyAgIAkobGlzdCBNZXNzYWdlcworCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgImluc3RhbGwoKSIKKwkJCQkJcXVpZCAgICAgICAJIjNERkUwN0IxMDBCRSIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiRnJvbUNsaWVudFRvU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSIzIgorCQkJCQlvcmRpbmFsICAgIAk4CisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKQorCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgImluc3RhbGwoKSAvLyBzYW1lIGFzIGFib3ZlIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTEzM0EwMzZDIgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjYiCisJCQkJCW9yZGluYWwgICAgCTE3CisJCQkJCU9wZXJhdGlvbiAgCSJpbnN0YWxsKCkiCisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKSkpKQorCQkJcGVyc2lzdGVuY2UgCSJUcmFuc2llbnQiCisJCQljcmVhdGlvbk9iaiAJRkFMU0UKKwkJCW11bHRpICAgICAgCUZBTFNFKQorCQkgICAgKG9iamVjdCBPYmplY3QgIkhvc3RDb25maWciCisJCQlxdWlkICAgICAgIAkiM0RGRTA2QTYwMTMxIgorCQkJY29sbGFib3JhdG9ycyAJKGxpc3QgbGlua19saXN0CisJCQkgICAgKG9iamVjdCBMaW5rCisJCQkJcXVpZCAgICAgICAJIjNERkUwNkU5MDI4QyIKKwkJCQlzdXBwbGllciAgIAkiSG9zdENvbmZpZyIKKwkJCQlxdWlkdSAgICAgIAkiM0RGRTA2QTYwMTMxIgorCQkJCW1lc3NhZ2VzICAgCShsaXN0IE1lc3NhZ2VzCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAic2V0RGVwbG95WE1MKCkiCisJCQkJCXF1aWQgICAgICAgCSIzREZFMDZFOTAyOEQiCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiMi4xIgorCQkJCQlvcmRpbmFsICAgIAkyCisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKQorCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgInNldExpdmVEZXBsb3koKSIKKwkJCQkJcXVpZCAgICAgICAJIjNERkUwNkYzMDBGRiIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiRnJvbUNsaWVudFRvU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSIyLjIiCisJCQkJCW9yZGluYWwgICAgCTMKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAic2V0VW5wYWNrc1dhcigpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTA2RkIwMEQ5IgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjIuMyIKKwkJCQkJb3JkaW5hbCAgICAJNAorCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkKKwkJCQkgICAgKG9iamVjdCBNZXNzYWdlICJzZXRYTUxWYWxpZGF0aW9uKCkiCisJCQkJCXF1aWQgICAgICAgCSIzREZFMDcwQzAwMTUiCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiMi40IgorCQkJCQlvcmRpbmFsICAgIAk1CisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKQorCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgImRlcGxveURlc2NyaXB0b3JzKCkiCisJCQkJCXF1aWQgICAgICAgCSIzREZFMDczQjAwMzEiCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiMi41IgorCQkJCQlvcmRpbmFsICAgIAk2CisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKQorCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgImRlcGxveUFwcHMoKSIKKwkJCQkJcXVpZCAgICAgICAJIjNERkUxMzFGMDMyNyIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiRnJvbUNsaWVudFRvU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSI0IgorCQkJCQlvcmRpbmFsICAgIAkxMgorCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkpKSkKKwkJCXBlcnNpc3RlbmNlIAkiVHJhbnNpZW50IgorCQkJY3JlYXRpb25PYmogCUZBTFNFCisJCQltdWx0aSAgICAgIAlGQUxTRSkKKwkJICAgIChvYmplY3QgT2JqZWN0ICJTdGFuZGFyZEhvc3REZXBsb3llciIKKwkJCXF1aWQgICAgICAgCSIzREZFMDc5QTAwNTUiCisJCQljb2xsYWJvcmF0b3JzIAkobGlzdCBsaW5rX2xpc3QKKwkJCSAgICAob2JqZWN0IExpbmsKKwkJCQlxdWlkICAgICAgIAkiM0RGRTA3RDIwMEVDIgorCQkJCXN1cHBsaWVyICAgCSJEaWdlc3RlciIKKwkJCQlxdWlkdSAgICAgIAkiM0RGRTA3QzkwMzRDIgorCQkJCW1lc3NhZ2VzICAgCShsaXN0IE1lc3NhZ2VzCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAiY3JlYXRlKCkiCisJCQkJCXF1aWQgICAgICAgCSIzREZFMDdEMjAwRUQiCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiMy4xIgorCQkJCQlvcmRpbmFsICAgIAk5CisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKQorCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgInBhcnNlKCkiCisJCQkJCXF1aWQgICAgICAgCSIzREZFMDdENjAzRDciCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiMy42IgorCQkJCQlvcmRpbmFsICAgIAkxNgorCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkKKwkJCQkgICAgKG9iamVjdCBNZXNzYWdlICJhZGQoQ29udGV4dFJ1bGVTZXQpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTA4RkEwMDNEIgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjMuMyIKKwkJCQkJb3JkaW5hbCAgICAJMTEKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpKSkKKwkJCSAgICAob2JqZWN0IExpbmsKKwkJCQlxdWlkICAgICAgIAkiM0RGRTA4N0QwMUUyIgorCQkJCXN1cHBsaWVyICAgCSJTdGFuZGFyZEhvc3REZXBsb3llciIKKwkJCQlxdWlkdSAgICAgIAkiM0RGRTA3OUEwMDU1IikKKwkJCSAgICAob2JqZWN0IExpbmsKKwkJCQlxdWlkICAgICAgIAkiM0RGRTA4REEwMjlBIgorCQkJCXN1cHBsaWVyICAgCSJDb250ZXh0UnVsZVNldCIKKwkJCQlxdWlkdSAgICAgIAkiM0RGRTA4MzQwMTZGIgorCQkJCW1lc3NhZ2VzICAgCShsaXN0IE1lc3NhZ2VzCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAibmV3KCkiCisJCQkJCXF1aWQgICAgICAgCSIzREZFMDhEQTAyOUIiCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiMy4yIgorCQkJCQlvcmRpbmFsICAgIAkxMAorCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkKKwkJCQkgICAgKG9iamVjdCBNZXNzYWdlICJhZGQoTmFtaW5nUnVsZVNldCgpKSIKKwkJCQkJcXVpZCAgICAgICAJIjNERkUwOTA3MDE1RiIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiRnJvbUNsaWVudFRvU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSIzLjUiCisJCQkJCW9yZGluYWwgICAgCTE1CisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKSkpCisJCQkgICAgKG9iamVjdCBMaW5rCisJCQkJcXVpZCAgICAgICAJIjNERkUwOEUwMDA5MCIKKwkJCQlzdXBwbGllciAgIAkiTmFtaW5nUnVsZVNldCIKKwkJCQlxdWlkdSAgICAgIAkiM0RGRTA4RDAwMTczIgorCQkJCW1lc3NhZ2VzICAgCShsaXN0IE1lc3NhZ2VzCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAibmV3KCkiCisJCQkJCXF1aWQgICAgICAgCSIzREZFMDhFMDAwOTEiCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiMy40IgorCQkJCQlvcmRpbmFsICAgIAkxNAorCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkpKSkKKwkJCXBlcnNpc3RlbmNlIAkiVHJhbnNpZW50IgorCQkJY3JlYXRpb25PYmogCUZBTFNFCisJCQltdWx0aSAgICAgIAlGQUxTRSkKKwkJICAgIChvYmplY3QgT2JqZWN0ICJEaWdlc3RlciIKKwkJCXF1aWQgICAgICAgCSIzREZFMDdDOTAzNEMiCisJCQlwZXJzaXN0ZW5jZSAJIlRyYW5zaWVudCIKKwkJCWNyZWF0aW9uT2JqIAlGQUxTRQorCQkJbXVsdGkgICAgICAJRkFMU0UpCisJCSAgICAob2JqZWN0IE9iamVjdCAiQ29udGV4dFJ1bGVTZXQiCisJCQlxdWlkICAgICAgIAkiM0RGRTA4MzQwMTZGIgorCQkJcGVyc2lzdGVuY2UgCSJUcmFuc2llbnQiCisJCQljcmVhdGlvbk9iaiAJRkFMU0UKKwkJCW11bHRpICAgICAgCUZBTFNFKQorCQkgICAgKG9iamVjdCBPYmplY3QgIk5hbWluZ1J1bGVTZXQiCisJCQlxdWlkICAgICAgIAkiM0RGRTA4RDAwMTczIgorCQkJcGVyc2lzdGVuY2UgCSJUcmFuc2llbnQiCisJCQljcmVhdGlvbk9iaiAJRkFMU0UKKwkJCW11bHRpICAgICAgCUZBTFNFKSkpCisJICAgIChvYmplY3QgTWVjaGFuaXNtIEA4NgorCQlsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdAorCQkgICAgKG9iamVjdCBPYmplY3QgIkRpZ2VzdGVyIgorCQkJcXVpZCAgICAgICAJIjNERkUwOTVBMDM3MSIKKwkJCWNvbGxhYm9yYXRvcnMgCShsaXN0IGxpbmtfbGlzdAorCQkJICAgIChvYmplY3QgTGluaworCQkJCXF1aWQgICAgICAgCSIzREZFMEU3ODAxREEiCisJCQkJc3VwcGxpZXIgICAJIkRpZ2VzdGVyIgorCQkJCXF1aWR1ICAgICAgCSIzREZFMDk1QTAzNzEiCisJCQkJbWVzc2FnZXMgICAJKGxpc3QgTWVzc2FnZXMKKwkJCQkgICAgKG9iamVjdCBNZXNzYWdlICJwYXJzZSIKKwkJCQkJcXVpZCAgICAgICAJIjNERkUwRTc4MDFEQiIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiRnJvbUNsaWVudFRvU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSIxIgorCQkJCQlvcmRpbmFsICAgIAkwCisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKQorCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgInN0YXJ0RWxlbWVudCgpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTBGMkYwM0QyIgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjIiCisJCQkJCW9yZGluYWwgICAgCTEKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpKSkKKwkJCSAgICAob2JqZWN0IExpbmsKKwkJCQlxdWlkICAgICAgIAkiM0RGRTBGNDAwMjEzIgorCQkJCXN1cHBsaWVyICAgCSJSdWxlIgorCQkJCXF1aWR1ICAgICAgCSIzREZFMEU3NDAwRDAiCisJCQkJbWVzc2FnZXMgICAJKGxpc3QgTWVzc2FnZXMKKwkJCQkgICAgKG9iamVjdCBNZXNzYWdlICJiZWdpbigpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTBGNDAwMjE0IgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjMiCisJCQkJCW9yZGluYWwgICAgCTIKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpKSkpCisJCQlwZXJzaXN0ZW5jZSAJIlRyYW5zaWVudCIKKwkJCWNyZWF0aW9uT2JqIAlGQUxTRQorCQkJbXVsdGkgICAgICAJRkFMU0UpCisJCSAgICAob2JqZWN0IE9iamVjdCAiUnVsZSIKKwkJCXF1aWQgICAgICAgCSIzREZFMEU3NDAwRDAiCisJCQljb2xsYWJvcmF0b3JzIAkobGlzdCBsaW5rX2xpc3QKKwkJCSAgICAob2JqZWN0IExpbmsKKwkJCQlxdWlkICAgICAgIAkiM0RGRTBGRDMwMjY1IgorCQkJCXN1cHBsaWVyICAgCSJTdGFuZGFyZENvbnRleHQiCisJCQkJcXVpZHUgICAgICAJIjNERkUwRkM1MDJBMSIKKwkJCQltZXNzYWdlcyAgIAkobGlzdCBNZXNzYWdlcworCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgIm5ld0luc3RhbmNlKCkiCisJCQkJCXF1aWQgICAgICAgCSIzREZFMEZEMzAyNjYiCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiMy4xIgorCQkJCQlvcmRpbmFsICAgIAkzCisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKSkpCisJCQkgICAgKG9iamVjdCBMaW5rCisJCQkJcXVpZCAgICAgICAJIjNERkUxMDIwMDJFOCIKKwkJCQlzdXBwbGllciAgIAkiU2V0UHJvcGVydGllc1J1bGUiCisJCQkJcXVpZHUgICAgICAJIjNERkUxMDAzMDNBNCIKKwkJCQltZXNzYWdlcyAgIAkobGlzdCBNZXNzYWdlcworCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgImJlZ2luKCkiCisJCQkJCXF1aWQgICAgICAgCSIzREZFMTAyMDAyRTkiCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiMy4yIgorCQkJCQlvcmRpbmFsICAgIAk2CisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKSkpCisJCQkgICAgKG9iamVjdCBMaW5rCisJCQkJcXVpZCAgICAgICAJIjNERkUxMjdGMDAyNCIKKwkJCQlzdXBwbGllciAgIAkiUnVsZSIKKwkJCQlxdWlkdSAgICAgIAkiM0RGRTBFNzQwMEQwIikKKwkJCSAgICAob2JqZWN0IExpbmsKKwkJCQlxdWlkICAgICAgIAkiM0RGRTEyODUwMUM3IgorCQkJCXN1cHBsaWVyICAgCSJTZXROZXh0UnVsZSIKKwkJCQlxdWlkdSAgICAgIAkiM0RGRTEyNjkwMjY3IgorCQkJCW1lc3NhZ2VzICAgCShsaXN0IE1lc3NhZ2VzCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAiZW5kKCkiCisJCQkJCXF1aWQgICAgICAgCSIzREZFMTI4NTAxQzgiCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiMy4zIgorCQkJCQlvcmRpbmFsICAgIAk4CisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKSkpKQorCQkJcGVyc2lzdGVuY2UgCSJUcmFuc2llbnQiCisJCQljcmVhdGlvbk9iaiAJRkFMU0UKKwkJCW11bHRpICAgICAgCUZBTFNFKQorCQkgICAgKG9iamVjdCBPYmplY3QgIlN0YW5kYXJkQ29udGV4dCIKKwkJCXF1aWQgICAgICAgCSIzREZFMEZDNTAyQTEiCisJCQljb2xsYWJvcmF0b3JzIAkobGlzdCBsaW5rX2xpc3QKKwkJCSAgICAob2JqZWN0IExpbmsKKwkJCQlxdWlkICAgICAgIAkiM0RGRTExNEEwMTkyIgorCQkJCXN1cHBsaWVyICAgCSJTdGFuZGFyZFBpcGVsaW5lIgorCQkJCXF1aWR1ICAgICAgCSIzREZFMTEyRjAwM0YiCisJCQkJbWVzc2FnZXMgICAJKGxpc3QgTWVzc2FnZXMKKwkJCQkgICAgKG9iamVjdCBNZXNzYWdlICJzZXRCYXNpYyhTdGFuZGFyZENvbnRleHRWYWx2ZSkiCisJCQkJCXF1aWQgICAgICAgCSIzREZFMTE0QTAxOTMiCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiMy4xLjIiCisJCQkJCW9yZGluYWwgICAgCTUKKwkJCQkJT3BlcmF0aW9uICAJInNldEJhc2ljIgorCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkpKQorCQkJICAgIChvYmplY3QgTGluaworCQkJCXF1aWQgICAgICAgCSIzREZFMTE1RTAwMUUiCisJCQkJc3VwcGxpZXIgICAJIlN0YW5kYXJkQ29udGV4dFZhbHZlIgorCQkJCXF1aWR1ICAgICAgCSIzREZFMTEwRDAzNzUiCisJCQkJbWVzc2FnZXMgICAJKGxpc3QgTWVzc2FnZXMKKwkJCQkgICAgKG9iamVjdCBNZXNzYWdlICJuZXcoKSIKKwkJCQkJcXVpZCAgICAgICAJIjNERkUxMTVFMDAxRiIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiRnJvbUNsaWVudFRvU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSIzLjEuMSIKKwkJCQkJb3JkaW5hbCAgICAJNAorCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkpKSkKKwkJCXBlcnNpc3RlbmNlIAkiVHJhbnNpZW50IgorCQkJY3JlYXRpb25PYmogCUZBTFNFCisJCQltdWx0aSAgICAgIAlGQUxTRSkKKwkJICAgIChvYmplY3QgT2JqZWN0ICJTZXRQcm9wZXJ0aWVzUnVsZSIKKwkJCXF1aWQgICAgICAgCSIzREZFMTAwMzAzQTQiCisJCQljb2xsYWJvcmF0b3JzIAkobGlzdCBsaW5rX2xpc3QKKwkJCSAgICAob2JqZWN0IExpbmsKKwkJCQlxdWlkICAgICAgIAkiM0RGRTExRDUwMzkwIgorCQkJCXN1cHBsaWVyICAgCSJTdGFuZGFyZENvbnRleHQiCisJCQkJcXVpZHUgICAgICAJIjNERkUwRkM1MDJBMSIKKwkJCQltZXNzYWdlcyAgIAkobGlzdCBNZXNzYWdlcworCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgIi8vVXNpbmcgQmVhblV0aWwsIHNldCB0aGUgb2JqZWN0IHByb3BlcnRpZXMgKGZyb20gZXg6IGFkbWluLnhtbCkiCisJCQkJCXF1aWQgICAgICAgCSIzREZFMTFENTAzOTEiCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiMy4yLjEiCisJCQkJCW9yZGluYWwgICAgCTcKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpKSkpCisJCQlwZXJzaXN0ZW5jZSAJIlRyYW5zaWVudCIKKwkJCWNyZWF0aW9uT2JqIAlGQUxTRQorCQkJbXVsdGkgICAgICAJRkFMU0UpCisJCSAgICAob2JqZWN0IE9iamVjdCAiU3RhbmRhcmRDb250ZXh0VmFsdmUiCisJCQlxdWlkICAgICAgIAkiM0RGRTExMEQwMzc1IgorCQkJcGVyc2lzdGVuY2UgCSJUcmFuc2llbnQiCisJCQljcmVhdGlvbk9iaiAJRkFMU0UKKwkJCW11bHRpICAgICAgCUZBTFNFKQorCQkgICAgKG9iamVjdCBPYmplY3QgIlN0YW5kYXJkUGlwZWxpbmUiCisJCQlxdWlkICAgICAgIAkiM0RGRTExMkYwMDNGIgorCQkJcGVyc2lzdGVuY2UgCSJUcmFuc2llbnQiCisJCQljcmVhdGlvbk9iaiAJRkFMU0UKKwkJCW11bHRpICAgICAgCUZBTFNFKQorCQkgICAgKG9iamVjdCBPYmplY3QgIlNldE5leHRSdWxlIgorCQkJcXVpZCAgICAgICAJIjNERkUxMjY5MDI2NyIKKwkJCXBlcnNpc3RlbmNlIAkiVHJhbnNpZW50IgorCQkJY3JlYXRpb25PYmogCUZBTFNFCisJCQltdWx0aSAgICAgIAlGQUxTRSkpKQorCSAgICAob2JqZWN0IE1lY2hhbmlzbSBAODcKKwkJbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKKwkJICAgIChvYmplY3QgT2JqZWN0ICJTdGFuZGFyZENvbnRleHQiCisJCQlxdWlkICAgICAgIAkiM0RGRTE5NkQwMEQ5IgorCQkJY29sbGFib3JhdG9ycyAJKGxpc3QgbGlua19saXN0CisJCQkgICAgKG9iamVjdCBMaW5rCisJCQkJcXVpZCAgICAgICAJIjNERkUyMDA2MDNCRCIKKwkJCQlzdXBwbGllciAgIAkiV2ViYXBwTG9hZGVyIgorCQkJCXF1aWR1ICAgICAgCSIzREZFMUZGQTAzNDciCisJCQkJbWVzc2FnZXMgICAJKGxpc3QgTWVzc2FnZXMKKwkJCQkgICAgKG9iamVjdCBNZXNzYWdlICJuZXciCisJCQkJCXF1aWQgICAgICAgCSIzREZFMjAwNjAzQkUiCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiMy4xLjEuMSIKKwkJCQkJb3JkaW5hbCAgICAJNQorCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkpKQorCQkJICAgIChvYmplY3QgTGluaworCQkJCXF1aWQgICAgICAgCSIzREZFMjAwQzAyOTkiCisJCQkJc3VwcGxpZXIgICAJIlN0YW5kYXJkQ29udGV4dCIKKwkJCQlxdWlkdSAgICAgIAkiM0RGRTE5NkQwMEQ5IgorCQkJCW1lc3NhZ2VzICAgCShsaXN0IE1lc3NhZ2VzCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAic2V0TG9hZGVyIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTIwMEMwMjlBIgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjMuMS4xLjIiCisJCQkJCW9yZGluYWwgICAgCTYKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAic2V0TWFuYWdlciIKKwkJCQkJcXVpZCAgICAgICAJIjNERkUyMDMyMDAxQyIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiRnJvbUNsaWVudFRvU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSIzLjEuMS40IgorCQkJCQlvcmRpbmFsICAgIAk4CisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKQorCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgImZpcmVMaWZlY3ljbGVFdmVudChTVEFSVF9FVkVOVCkiCisJCQkJCXF1aWQgICAgICAgCSIzREZFMjA1QjAxQTIiCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiMy4xLjEuNSIKKwkJCQkJb3JkaW5hbCAgICAJOQorCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkpKQorCQkJICAgIChvYmplY3QgTGluaworCQkJCXF1aWQgICAgICAgCSIzREZFMjAyQzAyNEYiCisJCQkJc3VwcGxpZXIgICAJIlN0YW5kYXJkTWFuYWdlciIKKwkJCQlxdWlkdSAgICAgIAkiM0RGRTIwMUYwMTA1IgorCQkJCW1lc3NhZ2VzICAgCShsaXN0IE1lc3NhZ2VzCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAibmV3IgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTIwMkMwMjUwIgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjMuMS4xLjMiCisJCQkJCW9yZGluYWwgICAgCTcKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAic3RhcnQoKSIKKwkJCQkJcXVpZCAgICAgICAJIjNERkUyMEI2MDBFNSIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiRnJvbUNsaWVudFRvU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSIzLjEuMS43IgorCQkJCQlvcmRpbmFsICAgIAkxMgorCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkpKQorCQkJICAgIChvYmplY3QgTGluaworCQkJCXF1aWQgICAgICAgCSIzREZFMjA5NjAwMDIiCisJCQkJc3VwcGxpZXIgICAJIkNvbnRleHRDb25maWciCisJCQkJcXVpZHUgICAgICAJIjNERkUyMDg3MDI4QyIKKwkJCQltZXNzYWdlcyAgIAkobGlzdCBNZXNzYWdlcworCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgIiAvLyBOb3RpZnkgaW50ZXJlc3RlZCBMaWZlY3ljbGVMaXN0ZW5lcnMiCisJCQkJCXF1aWQgICAgICAgCSIzREZFMjA5NjAwMDMiCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiMy4xLjEuNiIKKwkJCQkJb3JkaW5hbCAgICAJMTAKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpKSkpCisJCQlwZXJzaXN0ZW5jZSAJIlRyYW5zaWVudCIKKwkJCWNyZWF0aW9uT2JqIAlGQUxTRQorCQkJbXVsdGkgICAgICAJRkFMU0UpCisJCSAgICAob2JqZWN0IE9iamVjdCAiU3RhbmRhcmRIb3N0RGVwbG95ZXIiCisJCQlxdWlkICAgICAgIAkiM0RGRTFEOEEwMkRDIgorCQkJY29sbGFib3JhdG9ycyAJKGxpc3QgbGlua19saXN0CisJCQkgICAgKG9iamVjdCBMaW5rCisJCQkJcXVpZCAgICAgICAJIjNERkUxRkFGMDAxNCIKKwkJCQlzdXBwbGllciAgIAkiU3RhbmRhcmRIb3N0IgorCQkJCXF1aWR1ICAgICAgCSIzREZFMURGMjAxNDEiCisJCQkJbWVzc2FnZXMgICAJKGxpc3QgTWVzc2FnZXMKKwkJCQkgICAgKG9iamVjdCBNZXNzYWdlICJhZGRDaGlsZCIKKwkJCQkJcXVpZCAgICAgICAJIjNERkUxRkI2MDI3NyIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiRnJvbUNsaWVudFRvU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSIzLjEiCisJCQkJCW9yZGluYWwgICAgCTMKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpKSkpCisJCQlwZXJzaXN0ZW5jZSAJIlRyYW5zaWVudCIKKwkJCWNyZWF0aW9uT2JqIAlGQUxTRQorCQkJbXVsdGkgICAgICAJRkFMU0UpCisJCSAgICAob2JqZWN0IE9iamVjdCAiU3RhbmRhcmRIb3N0IgorCQkJcXVpZCAgICAgICAJIjNERkUxREYyMDE0MSIKKwkJCWNvbGxhYm9yYXRvcnMgCShsaXN0IGxpbmtfbGlzdAorCQkJICAgIChvYmplY3QgTGluaworCQkJCXF1aWQgICAgICAgCSIzREZFMUZDNDAyMjciCisJCQkJc3VwcGxpZXIgICAJIlN0YW5kYXJkQ29udGV4dCIKKwkJCQlxdWlkdSAgICAgIAkiM0RGRTE5NkQwMEQ5IgorCQkJCW1lc3NhZ2VzICAgCShsaXN0IE1lc3NhZ2VzCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAic3RhcnQoKSIKKwkJCQkJcXVpZCAgICAgICAJIjNERkUxRkM0MDIyOCIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiRnJvbUNsaWVudFRvU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSIzLjEuMSIKKwkJCQkJb3JkaW5hbCAgICAJNAorCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkpKSkKKwkJCXBlcnNpc3RlbmNlIAkiVHJhbnNpZW50IgorCQkJY3JlYXRpb25PYmogCUZBTFNFCisJCQltdWx0aSAgICAgIAlGQUxTRSkKKwkJICAgIChvYmplY3QgT2JqZWN0ICJXZWJhcHBMb2FkZXIiCisJCQlxdWlkICAgICAgIAkiM0RGRTFGRkEwMzQ3IgorCQkJcGVyc2lzdGVuY2UgCSJUcmFuc2llbnQiCisJCQljcmVhdGlvbk9iaiAJRkFMU0UKKwkJCW11bHRpICAgICAgCUZBTFNFKQorCQkgICAgKG9iamVjdCBPYmplY3QgIlN0YW5kYXJkTWFuYWdlciIKKwkJCXF1aWQgICAgICAgCSIzREZFMjAxRjAxMDUiCisJCQlwZXJzaXN0ZW5jZSAJIlRyYW5zaWVudCIKKwkJCWNyZWF0aW9uT2JqIAlGQUxTRQorCQkJbXVsdGkgICAgICAJRkFMU0UpCisJCSAgICAob2JqZWN0IE9iamVjdCAiQ29udGV4dENvbmZpZyIKKwkJCXF1aWQgICAgICAgCSIzREZFMjA4NzAyOEMiCisJCQljb2xsYWJvcmF0b3JzIAkobGlzdCBsaW5rX2xpc3QKKwkJCSAgICAob2JqZWN0IExpbmsKKwkJCQlxdWlkICAgICAgIAkiM0RGRTIwQ0YwMThCIgorCQkJCXN1cHBsaWVyICAgCSJDb250ZXh0Q29uZmlnIgorCQkJCXF1aWR1ICAgICAgCSIzREZFMjA4NzAyOEMiCisJCQkJbWVzc2FnZXMgICAJKGxpc3QgTWVzc2FnZXMKKwkJCQkgICAgKG9iamVjdCBNZXNzYWdlICJzdGFydCgpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTIwQ0YwMThDIgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjMuMS4xLjYuMSIKKwkJCQkJb3JkaW5hbCAgICAJMTEKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAiZGVmYXVsdENvbmZpZygpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTIwRTMwM0UyIgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjMuMS4xLjYuMiIKKwkJCQkJb3JkaW5hbCAgICAJMTMKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAiYXBwbGljYXRpb25Db25maWcoKSIKKwkJCQkJcXVpZCAgICAgICAJIjNERkUyMTFEMDFBMSIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiRnJvbUNsaWVudFRvU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSIzLjEuMS42LjMiCisJCQkJCW9yZGluYWwgICAgCTE0CisJCQkJCU9wZXJhdGlvbiAgCSJhcHBsaWNhdGlvbkNvbmZpZyIKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpKSkKKwkJCSAgICAob2JqZWN0IExpbmsKKwkJCQlxdWlkICAgICAgIAkiM0RGRTIxQjYwMjg3IgorCQkJCXN1cHBsaWVyICAgCSJEaWdlc3RlciIKKwkJCQlxdWlkdSAgICAgIAkiM0RGRTEzOTYwMzY0IgorCQkJCW1lc3NhZ2VzICAgCShsaXN0IE1lc3NhZ2VzCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAiY3JlYXRlKCkiCisJCQkJCXF1aWQgICAgICAgCSIzREZFMjFCNjAyODgiCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiMy4xLjEuNi4zLjEiCisJCQkJCW9yZGluYWwgICAgCTE1CisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKQorCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgImNyZWF0ZVdhcnBwZXIoKSAvLyBJbnZva2VkIGJ5IGEgV2ViV3JhcHBlclJ1bGUgKG5vdCBEaXJlY3RseSBieSB0aGUgRGlnZXN0ZXIpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTIyOEIwM0JBIgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJUb0NsaWVudEZyb21TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjMuMS4xLjYuMy4xLjIiCisJCQkJCW9yZGluYWwgICAgCTE3CisJCQkJCU9wZXJhdGlvbiAgCSJjcmVhdGVXYXJwcGVyKCkgLy8gSW52b2tlZCBieSBhIFJ1bGUgKG5vdCBEaXJlY3RseSBieSB0aGUgRGlnZXN0ZXIpIgorCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkpKQorCQkJICAgIChvYmplY3QgTGluaworCQkJCXF1aWQgICAgICAgCSIzREZFMjI1NjAwNjEiCisJCQkJc3VwcGxpZXIgICAJIlN0YW5kYXJkV3JhcHBlciIKKwkJCQlxdWlkdSAgICAgIAkiM0RGRTIyMEMwMTIyIgorCQkJCW1lc3NhZ2VzICAgCShsaXN0IE1lc3NhZ2VzCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAibmV3IgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTIyOUEwMDA0IgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjMuMS4xLjYuMy4xLjIuMSIKKwkJCQkJb3JkaW5hbCAgICAJMTgKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAiYWRkSW5zdGFuY2VMaXN0ZW5lcigpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTIyQTcwMEMxIgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjMuMS4xLjYuMy4yIgorCQkJCQlvcmRpbmFsICAgIAkxOQorCQkJCQlPcGVyYXRpb24gIAkiYWRkSW5zdGFuY2VMaXN0ZW5lciIKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAiYWRkTGlmZWN5Y2xlTGlzdGVuZXIoKSIKKwkJCQkJcXVpZCAgICAgICAJIjNERkUyMkM3MDFDQyIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiRnJvbUNsaWVudFRvU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSIzLjEuMS42LjMuMyIKKwkJCQkJb3JkaW5hbCAgICAJMjAKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAiYWRkQ29udGFpbmVyTGlzdGVuZXIoKSIKKwkJCQkJcXVpZCAgICAgICAJIjNERkUyMkU4MDM2NCIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiRnJvbUNsaWVudFRvU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSIzLjEuMS42LjMuNCIKKwkJCQkJb3JkaW5hbCAgICAJMjEKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpKSkpCisJCQlwZXJzaXN0ZW5jZSAJIlRyYW5zaWVudCIKKwkJCWNyZWF0aW9uT2JqIAlUUlVFCisJCQltdWx0aSAgICAgIAlGQUxTRSkKKwkJICAgIChvYmplY3QgT2JqZWN0ICJEaWdlc3RlciIKKwkJCXF1aWQgICAgICAgCSIzREZFMTM5NjAzNjQiCisJCQljb2xsYWJvcmF0b3JzIAkobGlzdCBsaW5rX2xpc3QKKwkJCSAgICAob2JqZWN0IExpbmsKKwkJCQlxdWlkICAgICAgIAkiM0RGRTE5QUUwMDY0IgorCQkJCXN1cHBsaWVyICAgCSJEaWdlc3RlciIKKwkJCQlxdWlkdSAgICAgIAkiM0RGRTEzOTYwMzY0IgorCQkJCW1lc3NhZ2VzICAgCShsaXN0IE1lc3NhZ2VzCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAicGFyc2UiCisJCQkJCXF1aWQgICAgICAgCSIzREZFMTlBRTAwNjUiCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiMSIKKwkJCQkJb3JkaW5hbCAgICAJMAorCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkKKwkJCQkgICAgKG9iamVjdCBNZXNzYWdlICJzdGFydEVsZW1lbnQoKSIKKwkJCQkJcXVpZCAgICAgICAJIjNERkUxOUIxMDJFOSIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiRnJvbUNsaWVudFRvU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSIyIgorCQkJCQlvcmRpbmFsICAgIAkxCisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKQorCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgIi8vIFByb2Nlc3Mgd2ViLnhtbCAqIHRsZC54bWwiCisJCQkJCXF1aWQgICAgICAgCSIzREZFMjFCRTAyMUIiCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiMy4xLjEuNi4zLjEuMSIKKwkJCQkJb3JkaW5hbCAgICAJMTYKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpKSkKKwkJCSAgICAob2JqZWN0IExpbmsKKwkJCQlxdWlkICAgICAgIAkiM0RGRTFERkIwMDIxIgorCQkJCXN1cHBsaWVyICAgCSJTdGFuZGFyZEhvc3REZXBsb3llciIKKwkJCQlxdWlkdSAgICAgIAkiM0RGRTFEOEEwMkRDIgorCQkJCW1lc3NhZ2VzICAgCShsaXN0IE1lc3NhZ2VzCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAiYWRkQ2hpbGQiCisJCQkJCXF1aWQgICAgICAgCSIzREZFMURGQjAwMjIiCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiMyIKKwkJCQkJb3JkaW5hbCAgICAJMgorCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkpKQorCQkJICAgIChvYmplY3QgTGluaworCQkJCXF1aWQgICAgICAgCSIzREZFMjIxOTAyMjUiCisJCQkJc3VwcGxpZXIgICAJIlN0YW5kYXJkV3JhcHBlciIKKwkJCQlxdWlkdSAgICAgIAkiM0RGRTIyMEMwMTIyIikpCisJCQlwZXJzaXN0ZW5jZSAJIlRyYW5zaWVudCIKKwkJCWNyZWF0aW9uT2JqIAlGQUxTRQorCQkJbXVsdGkgICAgICAJRkFMU0UpCisJCSAgICAob2JqZWN0IE9iamVjdCAiU3RhbmRhcmRXcmFwcGVyIgorCQkJcXVpZCAgICAgICAJIjNERkUyMjBDMDEyMiIKKwkJCXBlcnNpc3RlbmNlIAkiVHJhbnNpZW50IgorCQkJY3JlYXRpb25PYmogCUZBTFNFCisJCQltdWx0aSAgICAgIAlGQUxTRSkpKQorCSAgICAob2JqZWN0IE1lY2hhbmlzbSBAODgKKwkJbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKKwkJICAgIChvYmplY3QgT2JqZWN0ICJUaHJlYWRQb29sIgorCQkJcXVpZCAgICAgICAJIjNERkU0MDJCMDJDNSIKKwkJCWNvbGxhYm9yYXRvcnMgCShsaXN0IGxpbmtfbGlzdAorCQkJICAgIChvYmplY3QgTGluaworCQkJCXF1aWQgICAgICAgCSIzREZFNDBFNzAxQUQiCisJCQkJc3VwcGxpZXIgICAJIlRjcFdvcmtlclRocmVhZCIKKwkJCQlxdWlkdSAgICAgIAkiM0RGRTQwMzIwMEY4IgorCQkJCW1lc3NhZ2VzICAgCShsaXN0IE1lc3NhZ2VzCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAicnVuSXQoKSIKKwkJCQkJcXVpZCAgICAgICAJIjNERkU0MEU3MDFBRSIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiRnJvbUNsaWVudFRvU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSIxIgorCQkJCQlvcmRpbmFsICAgIAkwCisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKSkpKQorCQkJcGVyc2lzdGVuY2UgCSJUcmFuc2llbnQiCisJCQljcmVhdGlvbk9iaiAJRkFMU0UKKwkJCW11bHRpICAgICAgCUZBTFNFKQorCQkgICAgKG9iamVjdCBPYmplY3QgIlRjcFdvcmtlclRocmVhZCIKKwkJCXF1aWQgICAgICAgCSIzREZFNDAzMjAwRjgiCisJCQljb2xsYWJvcmF0b3JzIAkobGlzdCBsaW5rX2xpc3QKKwkJCSAgICAob2JqZWN0IExpbmsKKwkJCQlxdWlkICAgICAgIAkiM0RGRTQwRkMwMTBEIgorCQkJCXN1cHBsaWVyICAgCSJIdHRwMTFQcm90b2NvbCIKKwkJCQlxdWlkdSAgICAgIAkiM0RGRTQwNzUwMTc3IgorCQkJCW1lc3NhZ2VzICAgCShsaXN0IE1lc3NhZ2VzCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAicHJvY2Vzc0Nvbm5lY3Rpb24iCisJCQkJCXF1aWQgICAgICAgCSIzREZFNDBGQzAxMEUiCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiMS4xIgorCQkJCQlvcmRpbmFsICAgIAkxCisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKSkpKQorCQkJcGVyc2lzdGVuY2UgCSJUcmFuc2llbnQiCisJCQljcmVhdGlvbk9iaiAJRkFMU0UKKwkJCW11bHRpICAgICAgCUZBTFNFKQorCQkgICAgKG9iamVjdCBPYmplY3QgIkh0dHAxMVByb3RvY29sIgorCQkJcXVpZCAgICAgICAJIjNERkU0MDc1MDE3NyIKKwkJCWNvbGxhYm9yYXRvcnMgCShsaXN0IGxpbmtfbGlzdAorCQkJICAgIChvYmplY3QgTGluaworCQkJCXF1aWQgICAgICAgCSIzREZFNDExMTAyOUUiCisJCQkJc3VwcGxpZXIgICAJIkh0dHAxMVByb3RvY29sIgorCQkJCXF1aWR1ICAgICAgCSIzREZFNDA3NTAxNzciCisJCQkJbWVzc2FnZXMgICAJKGxpc3QgTWVzc2FnZXMKKwkJCQkgICAgKG9iamVjdCBNZXNzYWdlICJwcm9jZXNzKCkiCisJCQkJCXF1aWQgICAgICAgCSIzREZFNDExMTAyOUYiCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiMS4xLjEiCisJCQkJCW9yZGluYWwgICAgCTIKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAicGFyc2VIZWFkZXJzKCkiCisJCQkJCXF1aWQgICAgICAgCSIzREZFNDE1QzAxNTEiCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiMiIKKwkJCQkJb3JkaW5hbCAgICAJMworCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkKKwkJCQkgICAgKG9iamVjdCBNZXNzYWdlICJwcmVwYXJlUmVxdWVzdCgpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTQxQTYwMTYxIgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjMiCisJCQkJCW9yZGluYWwgICAgCTQKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpKSkKKwkJCSAgICAob2JqZWN0IExpbmsKKwkJCQlxdWlkICAgICAgIAkiM0RGRTQxRDYwMTA2IgorCQkJCXN1cHBsaWVyICAgCSJDb3lvdGVBZGFwdGVyIgorCQkJCXF1aWR1ICAgICAgCSIzREZFNDEwNjAwREYiCisJCQkJbWVzc2FnZXMgICAJKGxpc3QgTWVzc2FnZXMKKwkJCQkgICAgKG9iamVjdCBNZXNzYWdlICJzZXJ2aWNlKCkiCisJCQkJCXF1aWQgICAgICAgCSIzREZFNDFENjAxMDciCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiNCIKKwkJCQkJb3JkaW5hbCAgICAJNQorCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkpKSkKKwkJCXBlcnNpc3RlbmNlIAkiVHJhbnNpZW50IgorCQkJY3JlYXRpb25PYmogCUZBTFNFCisJCQltdWx0aSAgICAgIAlGQUxTRSkKKwkJICAgIChvYmplY3QgT2JqZWN0ICJDb3lvdGVBZGFwdGVyIgorCQkJcXVpZCAgICAgICAJIjNERkU0MTA2MDBERiIKKwkJCWNvbGxhYm9yYXRvcnMgCShsaXN0IGxpbmtfbGlzdAorCQkJICAgIChvYmplY3QgTGluaworCQkJCXF1aWQgICAgICAgCSIzREZFNDIyQzAxRjAiCisJCQkJc3VwcGxpZXIgICAJIkNveW90ZUFkYXB0ZXIiCisJCQkJcXVpZHUgICAgICAJIjNERkU0MTA2MDBERiIKKwkJCQltZXNzYWdlcyAgIAkobGlzdCBNZXNzYWdlcworCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgInBvc3RQYXJzZVJlcXVlc3QoKSIKKwkJCQkJcXVpZCAgICAgICAJIjNERkU0MjJDMDFGMSIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiRnJvbUNsaWVudFRvU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSI1IgorCQkJCQlvcmRpbmFsICAgIAk2CisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKSkpCisJCQkgICAgKG9iamVjdCBMaW5rCisJCQkJcXVpZCAgICAgICAJIjNERkU0MjgwMDIzNyIKKwkJCQlzdXBwbGllciAgIAkiU3RhbmRhcmRFbmdpbmUiCisJCQkJcXVpZHUgICAgICAJIjNERkU0MjRCMDM0OSIKKwkJCQltZXNzYWdlcyAgIAkobGlzdCBNZXNzYWdlcworCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgImludm9rZSgpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTQyODAwMjM4IgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjYiCisJCQkJCW9yZGluYWwgICAgCTcKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpKSkpCisJCQlwZXJzaXN0ZW5jZSAJIlRyYW5zaWVudCIKKwkJCWNyZWF0aW9uT2JqIAlGQUxTRQorCQkJbXVsdGkgICAgICAJRkFMU0UpCisJCSAgICAob2JqZWN0IE9iamVjdCAiU3RhbmRhcmRFbmdpbmUiCisJCQlxdWlkICAgICAgIAkiM0RGRTQyNEIwMzQ5IgorCQkJY29sbGFib3JhdG9ycyAJKGxpc3QgbGlua19saXN0CisJCQkgICAgKG9iamVjdCBMaW5rCisJCQkJcXVpZCAgICAgICAJIjNERkU0MjlBMDAyQyIKKwkJCQlzdXBwbGllciAgIAkiU3RhbmRhcmRQaXBlbGluZSIKKwkJCQlxdWlkdSAgICAgIAkiM0RGRTQyOTAwMDQ1IgorCQkJCW1lc3NhZ2VzICAgCShsaXN0IE1lc3NhZ2VzCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAiaW52b2tlKCkiCisJCQkJCXF1aWQgICAgICAgCSIzREZFNDI5QTAwMkQiCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiNi4xIgorCQkJCQlvcmRpbmFsICAgIAk4CisJCQkJCU9wZXJhdGlvbiAgCSJpbnZva2UiCisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKSkpKQorCQkJcGVyc2lzdGVuY2UgCSJUcmFuc2llbnQiCisJCQljcmVhdGlvbk9iaiAJRkFMU0UKKwkJCW11bHRpICAgICAgCUZBTFNFKQorCQkgICAgKG9iamVjdCBPYmplY3QgIlN0YW5kYXJkUGlwZWxpbmUiCisJCQlxdWlkICAgICAgIAkiM0RGRTQyOTAwMDQ1IgorCQkJY29sbGFib3JhdG9ycyAJKGxpc3QgbGlua19saXN0CisJCQkgICAgKG9iamVjdCBMaW5rCisJCQkJcXVpZCAgICAgICAJIjNERkU0MkNFMDIyRiIKKwkJCQlzdXBwbGllciAgIAkiU3RhbmRhcmRWYWx2ZUNvbnRleHQiCisJCQkJcXVpZHUgICAgICAJIjNERkU0MkMwMDJCMSIKKwkJCQltZXNzYWdlcyAgIAkobGlzdCBNZXNzYWdlcworCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgImludm9rZSgpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTQyQ0UwMjMwIgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjYuMS4xIgorCQkJCQlvcmRpbmFsICAgIAk5CisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKSkpKQorCQkJcGVyc2lzdGVuY2UgCSJUcmFuc2llbnQiCisJCQljcmVhdGlvbk9iaiAJRkFMU0UKKwkJCW11bHRpICAgICAgCUZBTFNFKQorCQkgICAgKG9iamVjdCBPYmplY3QgIlN0YW5kYXJkVmFsdmVDb250ZXh0IgorCQkJcXVpZCAgICAgICAJIjNERkU0MkMwMDJCMSIKKwkJCXBlcnNpc3RlbmNlIAkiVHJhbnNpZW50IgorCQkJY3JlYXRpb25PYmogCUZBTFNFCisJCQltdWx0aSAgICAgIAlGQUxTRSkpKQorCSAgICAob2JqZWN0IE1lY2hhbmlzbSBAODkKKwkJbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKKwkJICAgIChvYmplY3QgT2JqZWN0ICJTdGFuZGFyZENvbnRleHRWYWx2ZSIKKwkJCXF1aWQgICAgICAgCSIzREZFNDMwNzAwMUUiCisJCQljb2xsYWJvcmF0b3JzIAkobGlzdCBsaW5rX2xpc3QKKwkJCSAgICAob2JqZWN0IExpbmsKKwkJCQlxdWlkICAgICAgIAkiM0RGRTQzNEMwMTlBIgorCQkJCXN1cHBsaWVyICAgCSJTdGFuZGFyZEVuZ2luZVZhbHZlIgorCQkJCXF1aWR1ICAgICAgCSIzREZFNDMyODAxRjMiCisJCQkJbWVzc2FnZXMgICAJKGxpc3QgTWVzc2FnZXMKKwkJCQkgICAgKG9iamVjdCBNZXNzYWdlICJpbnZva2UoKSIKKwkJCQkJcXVpZCAgICAgICAJIjNERkU0MzRDMDE5QiIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiRnJvbUNsaWVudFRvU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSIxIgorCQkJCQlvcmRpbmFsICAgIAkwCisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKSkpCisJCQkgICAgKG9iamVjdCBMaW5rCisJCQkJcXVpZCAgICAgICAJIjNERkU0M0MyMDNBMyIKKwkJCQlzdXBwbGllciAgIAkiRXJyb3JSZXBvcnRWYWx2ZSIKKwkJCQlxdWlkdSAgICAgIAkiM0RGRTQzOEMwMjhEIgorCQkJCW1lc3NhZ2VzICAgCShsaXN0IE1lc3NhZ2VzCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAiaW52b2tlKCkiCisJCQkJCXF1aWQgICAgICAgCSIzREZFNDNDMjAzQTQiCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiMyIKKwkJCQkJb3JkaW5hbCAgICAJNAorCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkKKwkJCQkgICAgKG9iamVjdCBNZXNzYWdlICJpbnZva2VOZXh0KCkiCisJCQkJCXF1aWQgICAgICAgCSIzREZFNDYzMzAyOTMiCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIlRvQ2xpZW50RnJvbVN1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiMy4yIgorCQkJCQlvcmRpbmFsICAgIAk2CisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKSkpCisJCQkgICAgKG9iamVjdCBMaW5rCisJCQkJcXVpZCAgICAgICAJIjNERkU0NkU3MDAyNSIKKwkJCQlzdXBwbGllciAgIAkiRXJyb3JEaXNwYXRjaGVyVmFsdmUiCisJCQkJcXVpZHUgICAgICAJIjNERkU0NTFGMDFFQyIKKwkJCQltZXNzYWdlcyAgIAkobGlzdCBNZXNzYWdlcworCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgImludm9rZSgpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTQ2RTcwMDI2IgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjQiCisJCQkJCW9yZGluYWwgICAgCTcKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAiaW52b2tlTmV4dCIKKwkJCQkJcXVpZCAgICAgICAJIjNERkU0NzVEMDNBMCIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiVG9DbGllbnRGcm9tU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSI0LjEiCisJCQkJCW9yZGluYWwgICAgCTgKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpKSkKKwkJCSAgICAob2JqZWN0IExpbmsKKwkJCQlxdWlkICAgICAgIAkiM0RGRTQ3NjUwM0M5IgorCQkJCXN1cHBsaWVyICAgCSJTdGFuZGFyZEhvc3RWYWx2ZSIKKwkJCQlxdWlkdSAgICAgIAkiM0RGRTQ3MzEwMTMwIgorCQkJCW1lc3NhZ2VzICAgCShsaXN0IE1lc3NhZ2VzCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAiaW52b2tlKCkiCisJCQkJCXF1aWQgICAgICAgCSIzREZFNDc2NTAzQ0EiCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiNSIKKwkJCQkJb3JkaW5hbCAgICAJOQorCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkpKSkKKwkJCXBlcnNpc3RlbmNlIAkiVHJhbnNpZW50IgorCQkJY3JlYXRpb25PYmogCUZBTFNFCisJCQltdWx0aSAgICAgIAlGQUxTRSkKKwkJICAgIChvYmplY3QgT2JqZWN0ICJTdGFuZGFyZEVuZ2luZVZhbHZlIgorCQkJcXVpZCAgICAgICAJIjNERkU0MzI4MDFGMyIKKwkJCWNvbGxhYm9yYXRvcnMgCShsaXN0IGxpbmtfbGlzdAorCQkJICAgIChvYmplY3QgTGluaworCQkJCXF1aWQgICAgICAgCSIzREZFNDM2QzAwOUMiCisJCQkJc3VwcGxpZXIgICAJIlN0YW5kYXJkSG9zdCIKKwkJCQlxdWlkdSAgICAgIAkiM0RGRTQzNjUwM0JEIgorCQkJCW1lc3NhZ2VzICAgCShsaXN0IE1lc3NhZ2VzCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAibWFwKCkiCisJCQkJCXF1aWQgICAgICAgCSIzREZFNDM2QzAwOUQiCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiMS4xIgorCQkJCQlvcmRpbmFsICAgIAkxCisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKQorCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgImludm9rZSgpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTQzODMwMDYzIgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjEuMiIKKwkJCQkJb3JkaW5hbCAgICAJMgorCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkpKQorCQkJICAgIChvYmplY3QgTGluaworCQkJCXF1aWQgICAgICAgCSIzREZFNDM3RjAxNDMiCisJCQkJc3VwcGxpZXIgICAJIlN0YW5kYXJkRW5naW5lVmFsdmUiCisJCQkJcXVpZHUgICAgICAJIjNERkU0MzI4MDFGMyIpKQorCQkJcGVyc2lzdGVuY2UgCSJUcmFuc2llbnQiCisJCQljcmVhdGlvbk9iaiAJRkFMU0UKKwkJCW11bHRpICAgICAgCUZBTFNFKQorCQkgICAgKG9iamVjdCBPYmplY3QgIlN0YW5kYXJkSG9zdCIKKwkJCXF1aWQgICAgICAgCSIzREZFNDM2NTAzQkQiCisJCQljb2xsYWJvcmF0b3JzIAkobGlzdCBsaW5rX2xpc3QKKwkJCSAgICAob2JqZWN0IExpbmsKKwkJCQlxdWlkICAgICAgIAkiM0RGRTQzQjkwM0JFIgorCQkJCXN1cHBsaWVyICAgCSJTdGFuZGFyZENvbnRleHRWYWx2ZSIKKwkJCQlxdWlkdSAgICAgIAkiM0RGRTQzMDcwMDFFIgorCQkJCW1lc3NhZ2VzICAgCShsaXN0IE1lc3NhZ2VzCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAiaW52b2tlKCkiCisJCQkJCXF1aWQgICAgICAgCSIzREZFNDNCOTAzQkYiCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiMiIKKwkJCQkJb3JkaW5hbCAgICAJMworCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkpKSkKKwkJCXBlcnNpc3RlbmNlIAkiVHJhbnNpZW50IgorCQkJY3JlYXRpb25PYmogCUZBTFNFCisJCQltdWx0aSAgICAgIAlGQUxTRSkKKwkJICAgIChvYmplY3QgT2JqZWN0ICJFcnJvclJlcG9ydFZhbHZlIgorCQkJcXVpZCAgICAgICAJIjNERkU0MzhDMDI4RCIKKwkJCWNvbGxhYm9yYXRvcnMgCShsaXN0IGxpbmtfbGlzdAorCQkJICAgIChvYmplY3QgTGluaworCQkJCXF1aWQgICAgICAgCSIzREZFNDQyNTAxQjAiCisJCQkJc3VwcGxpZXIgICAJIkVycm9yUmVwb3J0VmFsdmUiCisJCQkJcXVpZHUgICAgICAJIjNERkU0MzhDMDI4RCIKKwkJCQltZXNzYWdlcyAgIAkobGlzdCBNZXNzYWdlcworCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgInJlcG9ydCgpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTQ0MjUwMUIxIgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjMuMSIKKwkJCQkJb3JkaW5hbCAgICAJNQorCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkpKQorCQkJICAgIChvYmplY3QgTGluaworCQkJCXF1aWQgICAgICAgCSIzREZFNDUyQTAwRjciCisJCQkJc3VwcGxpZXIgICAJIkVycm9yRGlzcGF0Y2hlclZhbHZlIgorCQkJCXF1aWR1ICAgICAgCSIzREZFNDUxRjAxRUMiKSkKKwkJCXBlcnNpc3RlbmNlIAkiVHJhbnNpZW50IgorCQkJY3JlYXRpb25PYmogCUZBTFNFCisJCQltdWx0aSAgICAgIAlGQUxTRSkKKwkJICAgIChvYmplY3QgT2JqZWN0ICJFcnJvckRpc3BhdGNoZXJWYWx2ZSIKKwkJCXF1aWQgICAgICAgCSIzREZFNDUxRjAxRUMiCisJCQljb2xsYWJvcmF0b3JzIAkobGlzdCBsaW5rX2xpc3QKKwkJCSAgICAob2JqZWN0IExpbmsKKwkJCQlxdWlkICAgICAgIAkiM0RGRTQ3NTAwMTQ4IgorCQkJCXN1cHBsaWVyICAgCSJTdGFuZGFyZEhvc3RWYWx2ZSIKKwkJCQlxdWlkdSAgICAgIAkiM0RGRTQ3MzEwMTMwIikKKwkJCSAgICAob2JqZWN0IExpbmsKKwkJCQlxdWlkICAgICAgIAkiM0RGRTQ3NTgwMzM1IgorCQkJCXN1cHBsaWVyICAgCSJFcnJvckRpc3BhdGNoZXJWYWx2ZSIKKwkJCQlxdWlkdSAgICAgIAkiM0RGRTQ1MUYwMUVDIikpCisJCQlwZXJzaXN0ZW5jZSAJIlRyYW5zaWVudCIKKwkJCWNyZWF0aW9uT2JqIAlGQUxTRQorCQkJbXVsdGkgICAgICAJRkFMU0UpCisJCSAgICAob2JqZWN0IE9iamVjdCAiU3RhbmRhcmRIb3N0VmFsdmUiCisJCQlxdWlkICAgICAgIAkiM0RGRTQ3MzEwMTMwIgorCQkJY29sbGFib3JhdG9ycyAJKGxpc3QgbGlua19saXN0CisJCQkgICAgKG9iamVjdCBMaW5rCisJCQkJcXVpZCAgICAgICAJIjNERkU0N0NEMDE2NiIKKwkJCQlzdXBwbGllciAgIAkiU3RhbmRhcmRIb3N0VmFsdmUiCisJCQkJcXVpZHUgICAgICAJIjNERkU0NzMxMDEzMCIKKwkJCQltZXNzYWdlcyAgIAkobGlzdCBNZXNzYWdlcworCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgIm1hcCgpIC8vQ29udGV4dCIKKwkJCQkJcXVpZCAgICAgICAJIjNERkU0N0NEMDE2NyIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiRnJvbUNsaWVudFRvU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSI1LjEiCisJCQkJCW9yZGluYWwgICAgCTEwCisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKSkpCisJCQkgICAgKG9iamVjdCBMaW5rCisJCQkJcXVpZCAgICAgICAJIjNERkU0N0Q1MDBCMyIKKwkJCQlzdXBwbGllciAgIAkiU3RhbmRhcmRDb250ZXh0IgorCQkJCXF1aWR1ICAgICAgCSIzREZFNDdDMTAwRjEiCisJCQkJbWVzc2FnZXMgICAJKGxpc3QgTWVzc2FnZXMKKwkJCQkgICAgKG9iamVjdCBNZXNzYWdlICJpbnZva2UoKSIKKwkJCQkJcXVpZCAgICAgICAJIjNERkU0N0Q1MDBCNCIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiRnJvbUNsaWVudFRvU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSI1LjIiCisJCQkJCW9yZGluYWwgICAgCTExCisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKSkpKQorCQkJcGVyc2lzdGVuY2UgCSJUcmFuc2llbnQiCisJCQljcmVhdGlvbk9iaiAJRkFMU0UKKwkJCW11bHRpICAgICAgCUZBTFNFKQorCQkgICAgKG9iamVjdCBPYmplY3QgIlN0YW5kYXJkQ29udGV4dCIKKwkJCXF1aWQgICAgICAgCSIzREZFNDdDMTAwRjEiCisJCQlwZXJzaXN0ZW5jZSAJIlRyYW5zaWVudCIKKwkJCWNyZWF0aW9uT2JqIAlGQUxTRQorCQkJbXVsdGkgICAgICAJRkFMU0UpKSkKKwkgICAgKG9iamVjdCBNZWNoYW5pc20gQDkwCisJCWxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0CisJCSAgICAob2JqZWN0IE9iamVjdCAiU3RhbmRhcmRDb250ZXh0IgorCQkJcXVpZCAgICAgICAJIjNERkU0OEIwMDFEMSIKKwkJCWNvbGxhYm9yYXRvcnMgCShsaXN0IGxpbmtfbGlzdAorCQkJICAgIChvYmplY3QgTGluaworCQkJCXF1aWQgICAgICAgCSIzREZFNDhCRTAyNjciCisJCQkJc3VwcGxpZXIgICAJIlN0YW5kYXJkUGlwZWxpbmUiCisJCQkJcXVpZHUgICAgICAJIjNERkU0OEI4MDA4OCIKKwkJCQltZXNzYWdlcyAgIAkobGlzdCBNZXNzYWdlcworCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgImludm9rZSgpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTQ4QkUwMjY4IgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjEiCisJCQkJCW9yZGluYWwgICAgCTAKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpKSkpCisJCQlwZXJzaXN0ZW5jZSAJIlRyYW5zaWVudCIKKwkJCWNyZWF0aW9uT2JqIAlGQUxTRQorCQkJbXVsdGkgICAgICAJRkFMU0UpCisJCSAgICAob2JqZWN0IE9iamVjdCAiU3RhbmRhcmRQaXBlbGluZSIKKwkJCXF1aWQgICAgICAgCSIzREZFNDhCODAwODgiCisJCQljb2xsYWJvcmF0b3JzIAkobGlzdCBsaW5rX2xpc3QKKwkJCSAgICAob2JqZWN0IExpbmsKKwkJCQlxdWlkICAgICAgIAkiM0RGRTQ4RUEwMDM5IgorCQkJCXN1cHBsaWVyICAgCSJTdGFuZGFyZFZhbHZlQ29udGV4dCIKKwkJCQlxdWlkdSAgICAgIAkiM0RGRTQ4RDAwMERDIgorCQkJCW1lc3NhZ2VzICAgCShsaXN0IE1lc3NhZ2VzCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAiaW52b2tlKCkiCisJCQkJCXF1aWQgICAgICAgCSIzREZFNDhFQTAwM0EiCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiMS4xIgorCQkJCQlvcmRpbmFsICAgIAkxCisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKQorCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgImludm9rZSgpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTQ5NzYwMTVEIgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjEuMiIKKwkJCQkJb3JkaW5hbCAgICAJNgorCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkpKSkKKwkJCXBlcnNpc3RlbmNlIAkiVHJhbnNpZW50IgorCQkJY3JlYXRpb25PYmogCUZBTFNFCisJCQltdWx0aSAgICAgIAlGQUxTRSkKKwkJICAgIChvYmplY3QgT2JqZWN0ICJTdGFuZGFyZFZhbHZlQ29udGV4dCIKKwkJCXF1aWQgICAgICAgCSIzREZFNDhEMDAwREMiCisJCQljb2xsYWJvcmF0b3JzIAkobGlzdCBsaW5rX2xpc3QKKwkJCSAgICAob2JqZWN0IExpbmsKKwkJCQlxdWlkICAgICAgIAkiM0RGRTQ5MTEwMkQ1IgorCQkJCXN1cHBsaWVyICAgCSJTdGFuZGFyZENvbnRleHRWYWx2ZSIKKwkJCQlxdWlkdSAgICAgIAkiM0RGRTQ5MDMwM0E3IgorCQkJCW1lc3NhZ2VzICAgCShsaXN0IE1lc3NhZ2VzCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAiaW52b2tlKCkiCisJCQkJCXF1aWQgICAgICAgCSIzREZFNDkxMTAyRDYiCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiMS4xLjEiCisJCQkJCW9yZGluYWwgICAgCTIKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpKSkKKwkJCSAgICAob2JqZWN0IExpbmsKKwkJCQlxdWlkICAgICAgIAkiM0RGRTQ5OTMwMjNCIgorCQkJCXN1cHBsaWVyICAgCSJTdGFuZGFyZFdyYXBwZXJWYWx2ZSIKKwkJCQlxdWlkdSAgICAgIAkiM0RGRTQ5ODkwMDU2IgorCQkJCW1lc3NhZ2VzICAgCShsaXN0IE1lc3NhZ2VzCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAiaW52b2tlKCkiCisJCQkJCXF1aWQgICAgICAgCSIzREZFNDk5MzAyM0MiCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiMS4yLjEiCisJCQkJCW9yZGluYWwgICAgCTcKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpKSkpCisJCQlwZXJzaXN0ZW5jZSAJIlRyYW5zaWVudCIKKwkJCWNyZWF0aW9uT2JqIAlGQUxTRQorCQkJbXVsdGkgICAgICAJRkFMU0UpCisJCSAgICAob2JqZWN0IE9iamVjdCAiU3RhbmRhcmRDb250ZXh0VmFsdmUiCisJCQlxdWlkICAgICAgIAkiM0RGRTQ5MDMwM0E3IgorCQkJY29sbGFib3JhdG9ycyAJKGxpc3QgbGlua19saXN0CisJCQkgICAgKG9iamVjdCBMaW5rCisJCQkJcXVpZCAgICAgICAJIjNERkU0OTJGMDMzQyIKKwkJCQlzdXBwbGllciAgIAkiU3RhbmRhcmRDb250ZXh0VmFsdmUiCisJCQkJcXVpZHUgICAgICAJIjNERkU0OTAzMDNBNyIKKwkJCQltZXNzYWdlcyAgIAkobGlzdCBNZXNzYWdlcworCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgIm1hcCAvL3JldHVybiBXcmFwcGVyIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTQ5MkYwMzNEIgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjEuMS4xLjEiCisJCQkJCW9yZGluYWwgICAgCTMKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpKSkKKwkJCSAgICAob2JqZWN0IExpbmsKKwkJCQlxdWlkICAgICAgIAkiM0RGRTQ5NEEwMTUwIgorCQkJCXN1cHBsaWVyICAgCSJTdGFuZGFyZFdyYXBwZXIiCisJCQkJcXVpZHUgICAgICAJIjNERkU0OTM3MDM1MSIKKwkJCQltZXNzYWdlcyAgIAkobGlzdCBNZXNzYWdlcworCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgImludm9rZSgpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTQ5NEEwMTUxIgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjEuMS4xLjIiCisJCQkJCW9yZGluYWwgICAgCTQKKwkJCQkJT3BlcmF0aW9uICAJImludm9rZSIKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpKSkpCisJCQlwZXJzaXN0ZW5jZSAJIlRyYW5zaWVudCIKKwkJCWNyZWF0aW9uT2JqIAlGQUxTRQorCQkJbXVsdGkgICAgICAJRkFMU0UpCisJCSAgICAob2JqZWN0IE9iamVjdCAiU3RhbmRhcmRXcmFwcGVyIgorCQkJcXVpZCAgICAgICAJIjNERkU0OTM3MDM1MSIKKwkJCWNvbGxhYm9yYXRvcnMgCShsaXN0IGxpbmtfbGlzdAorCQkJICAgIChvYmplY3QgTGluaworCQkJCXF1aWQgICAgICAgCSIzREZFNDk1RjAyODciCisJCQkJc3VwcGxpZXIgICAJIlN0YW5kYXJkUGlwZWxpbmUiCisJCQkJcXVpZHUgICAgICAJIjNERkU0OEI4MDA4OCIKKwkJCQltZXNzYWdlcyAgIAkobGlzdCBNZXNzYWdlcworCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgImludm9rZSgpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTQ5NUYwMjg4IgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjEuMS4xLjIuMSIKKwkJCQkJb3JkaW5hbCAgICAJNQorCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkpKSkKKwkJCXBlcnNpc3RlbmNlIAkiVHJhbnNpZW50IgorCQkJY3JlYXRpb25PYmogCUZBTFNFCisJCQltdWx0aSAgICAgIAlGQUxTRSkKKwkJICAgIChvYmplY3QgT2JqZWN0ICJTdGFuZGFyZFdyYXBwZXJWYWx2ZSIKKwkJCXF1aWQgICAgICAgCSIzREZFNDk4OTAwNTYiCisJCQljb2xsYWJvcmF0b3JzIAkobGlzdCBsaW5rX2xpc3QKKwkJCSAgICAob2JqZWN0IExpbmsKKwkJCQlxdWlkICAgICAgIAkiM0RGRTQ5REIwMThBIgorCQkJCXN1cHBsaWVyICAgCSJTdGFuZGFyZFdyYXBwZXJWYWx2ZSIKKwkJCQlxdWlkdSAgICAgIAkiM0RGRTQ5ODkwMDU2IikKKwkJCSAgICAob2JqZWN0IExpbmsKKwkJCQlxdWlkICAgICAgIAkiM0RGRTQ5RUMwMDRFIgorCQkJCXN1cHBsaWVyICAgCSJTdGFuZGFyZFdyYXBwZXIiCisJCQkJcXVpZHUgICAgICAJIjNERkU0OTM3MDM1MSIKKwkJCQltZXNzYWdlcyAgIAkobGlzdCBNZXNzYWdlcworCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgImFsbG9jYXRlKCkiCisJCQkJCXF1aWQgICAgICAgCSIzREZFNDlFQzAwNEYiCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiMS4yLjEuMSIKKwkJCQkJb3JkaW5hbCAgICAJOAorCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkKKwkJCQkgICAgKG9iamVjdCBNZXNzYWdlICJyZXR1cm4gc2VydmxldCIKKwkJCQkJcXVpZCAgICAgICAJIjNERkU0QTIwMDA2NyIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiUmV0dXJuIgorCQkJCQlkaXIgICAgICAgIAkiVG9DbGllbnRGcm9tU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSIxLjIuMS4xLjEiCisJCQkJCW9yZGluYWwgICAgCTkKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpKSkKKwkJCSAgICAob2JqZWN0IExpbmsKKwkJCQlxdWlkICAgICAgIAkiM0RGRTRBMjkwMjdEIgorCQkJCXN1cHBsaWVyICAgCSJBcHBsaWNhdGlvbkZpbHRlckNoYWluIgorCQkJCXF1aWR1ICAgICAgCSIzREZFNEExNTAwQjIiCisJCQkJbWVzc2FnZXMgICAJKGxpc3QgTWVzc2FnZXMKKwkJCQkgICAgKG9iamVjdCBNZXNzYWdlICJjcmVhdGVGaWx0ZXJDaGFpbigpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTRBMjkwMjdFIgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjEuMi4xLjEuMS4xIgorCQkJCQlvcmRpbmFsICAgIAkxMAorCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkKKwkJCQkgICAgKG9iamVjdCBNZXNzYWdlICJkb0ZpbHRlcigpIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTRBNDkwMjgzIgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJTaW1wbGUiCisJCQkJCWRpciAgICAgICAgCSJGcm9tQ2xpZW50VG9TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjEuMi4xLjIiCisJCQkJCW9yZGluYWwgICAgCTExCisJCQkJCU9wZXJhdGlvbiAgCSJkb0ZpbHRlciIKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpCisJCQkJICAgIChvYmplY3QgTWVzc2FnZSAicmV0dXJuIgorCQkJCQlxdWlkICAgICAgIAkiM0RGRTRDQjQwMjVCIgorCQkJCQlmcmVxdWVuY3kgIAkiQXBlcmlvZGljIgorCQkJCQlzeW5jaHJvbml6YXRpb24gCSJSZXR1cm4iCisJCQkJCWRpciAgICAgICAgCSJUb0NsaWVudEZyb21TdXBwbGllciIKKwkJCQkJc2VxdWVuY2UgICAJIjEuMi4xLjIuMyIKKwkJCQkJb3JkaW5hbCAgICAJMTQKKwkJCQkJcXVpZHUgICAgICAJIjAwMDAwMDAwMDAwMCIKKwkJCQkJY3JlYXRpb24gICAJRkFMU0UpKSkpCisJCQlwZXJzaXN0ZW5jZSAJIlRyYW5zaWVudCIKKwkJCWNyZWF0aW9uT2JqIAlGQUxTRQorCQkJbXVsdGkgICAgICAJRkFMU0UpCisJCSAgICAob2JqZWN0IE9iamVjdCAiQXBwbGljYXRpb25GaWx0ZXJDaGFpbiIKKwkJCXF1aWQgICAgICAgCSIzREZFNEExNTAwQjIiCisJCQljb2xsYWJvcmF0b3JzIAkobGlzdCBsaW5rX2xpc3QKKwkJCSAgICAob2JqZWN0IExpbmsKKwkJCQlxdWlkICAgICAgIAkiM0RGRTRDMjcwMUMyIgorCQkJCXN1cHBsaWVyICAgCSJBcHBsaWNhdGlvbkZpbHRlckNoYWluIgorCQkJCXF1aWR1ICAgICAgCSIzREZFNEExNTAwQjIiCisJCQkJbWVzc2FnZXMgICAJKGxpc3QgTWVzc2FnZXMKKwkJCQkgICAgKG9iamVjdCBNZXNzYWdlICJpbnRlcm5hbERvRmlsdGVyKCkiCisJCQkJCXF1aWQgICAgICAgCSIzREZFNEMyNzAxQzMiCisJCQkJCWZyZXF1ZW5jeSAgCSJBcGVyaW9kaWMiCisJCQkJCXN5bmNocm9uaXphdGlvbiAJIlNpbXBsZSIKKwkJCQkJZGlyICAgICAgICAJIkZyb21DbGllbnRUb1N1cHBsaWVyIgorCQkJCQlzZXF1ZW5jZSAgIAkiMS4yLjEuMi4xIgorCQkJCQlvcmRpbmFsICAgIAkxMgorCQkJCQlxdWlkdSAgICAgIAkiMDAwMDAwMDAwMDAwIgorCQkJCQljcmVhdGlvbiAgIAlGQUxTRSkpKQorCQkJICAgIChvYmplY3QgTGluaworCQkJCXF1aWQgICAgICAgCSIzREZFNENBNTAyQkUiCisJCQkJc3VwcGxpZXIgICAJIiRVTk5BTUVEJDAiCisJCQkJcXVpZHUgICAgICAJIjNERkU0QkFFMDA1NiIKKwkJCQltZXNzYWdlcyAgIAkobGlzdCBNZXNzYWdlcworCQkJCSAgICAob2JqZWN0IE1lc3NhZ2UgInNlcnZpY2UoKSIKKwkJCQkJcXVpZCAgICAgICAJIjNERkU0Q0E1MDJCRiIKKwkJCQkJZnJlcXVlbmN5ICAJIkFwZXJpb2RpYyIKKwkJCQkJc3luY2hyb25pemF0aW9uIAkiU2ltcGxlIgorCQkJCQlkaXIgICAgICAgIAkiRnJvbUNsaWVudFRvU3VwcGxpZXIiCisJCQkJCXNlcXVlbmNlICAgCSIxLjIuMS4yLjIiCisJCQkJCW9yZGluYWwgICAgCTEzCisJCQkJCXF1aWR1ICAgICAgCSIwMDAwMDAwMDAwMDAiCisJCQkJCWNyZWF0aW9uICAgCUZBTFNFKSkpKQorCQkJcGVyc2lzdGVuY2UgCSJUcmFuc2llbnQiCisJCQljcmVhdGlvbk9iaiAJRkFMU0UKKwkJCW11bHRpICAgICAgCUZBTFNFKQorCQkgICAgKG9iamVjdCBPYmplY3QgIiRVTk5BTUVEJDAiCisJCQlxdWlkICAgICAgIAkiM0RGRTRCQUUwMDU2IgorCQkJc3RlcmVvdHlwZSAJIlNlcnZsZXQiCisJCQlwZXJzaXN0ZW5jZSAJIlRyYW5zaWVudCIKKwkJCWNyZWF0aW9uT2JqIAlUUlVFCisJCQltdWx0aSAgICAgIAlGQUxTRSkpKSkKKwlsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKKwkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIk1haW4iCisJCXF1aWQgICAgICAgCSIzREZERjZEMjAyMUIiCisJCXRpdGxlICAgICAgCSJNYWluIgorCQl6b29tICAgICAgIAkxMDAKKwkJbWF4X2hlaWdodCAJMjgzNTAKKwkJbWF4X3dpZHRoICAJMjE2MDAKKwkJb3JpZ2luX3ggICAJMAorCQlvcmlnaW5feSAgIAkwCisJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0KSkKKwkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gImhpZ2ggbGV2ZWwgcGFja2FnaW5nIgorCQlxdWlkICAgICAgIAkiM0U0MkRFNzUwMDRCIgorCQl0aXRsZSAgICAgIAkiaGlnaCBsZXZlbCBwYWNrYWdpbmciCisJCXpvb20gICAgICAgCTEwMAorCQltYXhfaGVpZ2h0IAkyODM1MAorCQltYXhfd2lkdGggIAkyMTYwMAorCQlvcmlnaW5feCAgIAkwCisJCW9yaWdpbl95ICAgCTAKKwkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKKwkJICAgIChvYmplY3QgQ2F0ZWdvcnlWaWV3ICJMb2dpY2FsIFZpZXc6Om9yZy5hcGFjaGUuY2F0YWxpbmEiIEA5MQorCQkJbG9jYXRpb24gICAJKDEwMjQsIDc1MikKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAorCQkJICAgIFBhcmVudF9WaWV3IAlAOTEKKwkJCSAgICBsb2NhdGlvbiAgIAkoNzgwLCA2NjgpCisJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCSAgICBubGluZXMgICAgIAkyCisJCQkgICAgbWF4X3dpZHRoICAJNDg4CisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJvcmcuYXBhY2hlLmNhdGFsaW5hIikKKwkJCWljb25fc3R5bGUgCSJJY29uIgorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCXF1aWR1ICAgICAgCSIzRTQyREU4RDAwODIiCisJCQl3aWR0aCAgICAgIAk1MDAKKwkJCWhlaWdodCAgICAgCTE4MSkKKwkJICAgIChvYmplY3QgQ2F0ZWdvcnlWaWV3ICJMb2dpY2FsIFZpZXc6Om9yZy5hcGFjaGUuY295b3RlIiBAOTIKKwkJCWxvY2F0aW9uICAgCSg1MTIsIDExODQpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKKwkJCSAgICBQYXJlbnRfVmlldyAJQDkyCisJCQkgICAgbG9jYXRpb24gICAJKDIzNywgMTA5MCkKKwkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJICAgIG5saW5lcyAgICAgCTIKKwkJCSAgICBtYXhfd2lkdGggIAk1NTAKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJIm9yZy5hcGFjaGUuY295b3RlIikKKwkJCWljb25fc3R5bGUgCSJJY29uIgorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCXF1aWR1ICAgICAgCSIzRTQyREU5RjAxMzIiCisJCQl3aWR0aCAgICAgIAk1NjMKKwkJCWhlaWdodCAgICAgCTIwMCkKKwkJICAgIChvYmplY3QgQ2F0ZWdvcnlWaWV3ICJMb2dpY2FsIFZpZXc6Om9yZy5hcGFjaGUudG9tY2F0LnV0aWwiIEA5MworCQkJbG9jYXRpb24gICAJKDE5MjAsIDExMDQpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKKwkJCSAgICBQYXJlbnRfVmlldyAJQDkzCisJCQkgICAgbG9jYXRpb24gICAJKDE2NzAsIDEwMjApCisJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCSAgICBubGluZXMgICAgIAkyCisJCQkgICAgbWF4X3dpZHRoICAJNTAwCisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJvcmcuYXBhY2hlLnRvbWNhdC51dGlsIikKKwkJCWljb25fc3R5bGUgCSJJY29uIgorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCXF1aWR1ICAgICAgCSIzRTQyREVERjAxRjIiCisJCQl3aWR0aCAgICAgIAk1MTIKKwkJCWhlaWdodCAgICAgCTE4MSkKKwkJICAgIChvYmplY3QgSW1wb3J0VmlldyAiIiBAOTQKKwkJCXN0ZXJlb3R5cGUgCVRSVUUKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCXF1aWR1ICAgICAgCSIzRTQyREVGNjAxRUIiCisJCQljbGllbnQgICAgIAlAOTEKKwkJCXN1cHBsaWVyICAgCUA5MworCQkJbGluZV9zdHlsZSAJMCkKKwkJICAgIChvYmplY3QgSW1wb3J0VmlldyAiIiBAOTUKKwkJCXN0ZXJlb3R5cGUgCVRSVUUKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCXF1aWR1ICAgICAgCSIzRTQyREVGQzAwQjMiCisJCQljbGllbnQgICAgIAlAOTIKKwkJCXN1cHBsaWVyICAgCUA5MworCQkJbGluZV9zdHlsZSAJMCkKKwkJICAgIChvYmplY3QgQ2F0ZWdvcnlWaWV3ICJMb2dpY2FsIFZpZXc6Om9yZy5hcGFjaGUuamFzcGVyIiBAOTYKKwkJCWxvY2F0aW9uICAgCSgxNzI4LCA2MjQpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKKwkJCSAgICBQYXJlbnRfVmlldyAJQDk2CisJCQkgICAgbG9jYXRpb24gICAJKDE0MzcsIDU0MCkKKwkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJICAgIG5saW5lcyAgICAgCTIKKwkJCSAgICBtYXhfd2lkdGggIAk1ODIKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJIm9yZy5hcGFjaGUuamFzcGVyIikKKwkJCWljb25fc3R5bGUgCSJJY29uIgorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCXF1aWR1ICAgICAgCSIzRTQyREVGRjAyNzAiCisJCQl3aWR0aCAgICAgIAk1OTQKKwkJCWhlaWdodCAgICAgCTE4MSkKKwkJICAgIChvYmplY3QgSW1wb3J0VmlldyAiIiBAOTcKKwkJCXN0ZXJlb3R5cGUgCVRSVUUKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCXF1aWR1ICAgICAgCSIzRTQyREY3MDAwNjAiCisJCQljbGllbnQgICAgIAlAOTEKKwkJCXN1cHBsaWVyICAgCUA5MgorCQkJbGluZV9zdHlsZSAJMCkKKwkJICAgIChvYmplY3QgTm90ZVZpZXcgQDk4CisJCQlsb2NhdGlvbiAgIAkoMTIwMCwgMjA4KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCisJCQkgICAgUGFyZW50X1ZpZXcgCUA5OAorCQkJICAgIGxvY2F0aW9uICAgCSg4NDcsIDE0MykKKwkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJICAgIG5saW5lcyAgICAgCTIKKwkJCSAgICBtYXhfd2lkdGggIAk2NzEKKwkJCSAgICBsYWJlbCAgICAgIAkiSGlnaCBMZXZlbCBwYWNrYWdlIGRlcGVuZGVuY2llcyIpCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJd2lkdGggICAgICAJNzMxCisJCQloZWlnaHQgICAgIAkxNDMpCisJCSAgICAob2JqZWN0IENhdGVnb3J5VmlldyAiTG9naWNhbCBWaWV3OjpvcmcuYXBhY2hlLm5hbWluZyIgQDk5CisJCQlsb2NhdGlvbiAgIAkoMzUyLCAzMDQpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKKwkJCSAgICBQYXJlbnRfVmlldyAJQDk5CisJCQkgICAgbG9jYXRpb24gICAJKDgzLCAyMjApCisJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCSAgICBubGluZXMgICAgIAkyCisJCQkgICAgbWF4X3dpZHRoICAJNTM4CisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJvcmcuYXBhY2hlLm5hbWluZyIpCisJCQlpY29uX3N0eWxlIAkiSWNvbiIKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQlxdWlkdSAgICAgIAkiM0U0M0QxNTgwMzM5IgorCQkJd2lkdGggICAgICAJNTUwCisJCQloZWlnaHQgICAgIAkxODEpCisJCSAgICAob2JqZWN0IEltcG9ydFZpZXcgIiIgQDEwMAorCQkJc3RlcmVvdHlwZSAJVFJVRQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJcXVpZHUgICAgICAJIjNFNDNEMTY1MDM5QyIKKwkJCWNsaWVudCAgICAgCUA5MQorCQkJc3VwcGxpZXIgICAJQDk5CisJCQlsaW5lX3N0eWxlIAkwKSkpCisJICAgIChvYmplY3QgSW50ZXJhY3Rpb25EaWFncmFtICIxLiBjYXRhbGluYV9sb2FkIgorCQltZWNoYW5pc21fcmVmIAlAODIKKwkJcXVpZCAgICAgICAJIjNERkRGOEVFMDI2NyIKKwkJdGl0bGUgICAgICAJIjEuIGNhdGFsaW5hX2xvYWQiCisJCXpvb20gICAgICAgCTEwMAorCQltYXhfaGVpZ2h0IAkyODM1MAorCQltYXhfd2lkdGggIAkyMTYwMAorCQlvcmlnaW5feCAgIAkwCisJCW9yaWdpbl95ICAgCTUxOQorCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAorCQkgICAgKG9iamVjdCBJbnRlck9ialZpZXcgIkJvb3RzdHJhcCIgQDEwMQorCQkJbG9jYXRpb24gICAJKDIyNCwgMjI0KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCVRSVUUKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKKwkJCSAgICBQYXJlbnRfVmlldyAJQDEwMQorCQkJICAgIGxvY2F0aW9uICAgCSgyMjQsIDIyNCkKKwkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkyCisJCQkgICAgbWF4X3dpZHRoICAJMjgyCisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJCb290c3RyYXAiKQorCQkJaWNvbl9zdHlsZSAJIkljb24iCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJcXVpZHUgICAgICAJIjNERkRGOEZEMDM0NSIKKwkJCXdpZHRoICAgICAgCTMwMAorCQkJaGVpZ2h0ICAgICAJMTk3MgorCQkJaWNvbl9oZWlnaHQgCTAKKwkJCWljb25fd2lkdGggCTAKKwkJCWljb25feV9vZmZzZXQgCTAKKwkJCWFubm90YXRpb24gCTEKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBAMTAyCisJCQkgICAgbG9jYXRpb24gICAJKDIyNCwgMzY4KQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUAxMDEKKwkJCSAgICBoZWlnaHQgICAgIAkxNzM4CisJCQkgICAgeV9jb29yZCAgICAJMTY3OAorCQkJICAgIE5lc3RlZCAgICAgCUZBTFNFKQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEAxMDMKKwkJCSAgICBsb2NhdGlvbiAgIAkoMjI0LCAzNjgpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDEwMQorCQkJICAgIGhlaWdodCAgICAgCTYwCisJCQkgICAgeV9jb29yZCAgICAJMAorCQkJICAgIE5lc3RlZCAgICAgCVRSVUUpKQorCQkgICAgKG9iamVjdCBJbnRlck9ialZpZXcgIkRpZ2VzdGVyIiBAMTA0CisJCQlsb2NhdGlvbiAgIAkoODk2LCAyMjQpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJVFJVRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAorCQkJICAgIFBhcmVudF9WaWV3IAlAMTA0CisJCQkgICAgbG9jYXRpb24gICAJKDg5NiwgMjI0KQorCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTIKKwkJCSAgICBtYXhfd2lkdGggIAkyODIKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJIkRpZ2VzdGVyIikKKwkJCWljb25fc3R5bGUgCSJJY29uIgorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCXF1aWR1ICAgICAgCSIzREZERkFGMjAxQTEiCisJCQl3aWR0aCAgICAgIAkzMDAKKwkJCWhlaWdodCAgICAgCTE5NzIKKwkJCWljb25faGVpZ2h0IAkwCisJCQlpY29uX3dpZHRoIAkwCisJCQlpY29uX3lfb2Zmc2V0IAkwCisJCQlhbm5vdGF0aW9uIAkxCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDEwNQorCQkJICAgIGxvY2F0aW9uICAgCSg4OTYsIDEyMzIpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDEwNAorCQkJICAgIGhlaWdodCAgICAgCTYwCisJCQkgICAgeV9jb29yZCAgICAJMAorCQkJICAgIE5lc3RlZCAgICAgCUZBTFNFKQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEAxMDYKKwkJCSAgICBsb2NhdGlvbiAgIAkoODk2LCAxMzEyKQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUAxMDQKKwkJCSAgICBoZWlnaHQgICAgIAkyNjQKKwkJCSAgICB5X2Nvb3JkICAgIAkyMDQKKwkJCSAgICBOZXN0ZWQgICAgIAlGQUxTRSkpCisJCSAgICAob2JqZWN0IEludGVyT2JqVmlldyAiU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXIiIEAxMDcKKwkJCWxvY2F0aW9uICAgCSgxMjMyLCAyMjQpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJVFJVRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAorCQkJICAgIFBhcmVudF9WaWV3IAlAMTA3CisJCQkgICAgbG9jYXRpb24gICAJKDEyMzIsIDIyNCkKKwkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkyCisJCQkgICAgbWF4X3dpZHRoICAJMjgyCisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJTZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lciIpCisJCQlpY29uX3N0eWxlIAkiSWNvbiIKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQlxdWlkdSAgICAgIAkiM0RGREZCNEIwMjE3IgorCQkJd2lkdGggICAgICAJMzAwCisJCQloZWlnaHQgICAgIAkxOTcyCisJCQlpY29uX2hlaWdodCAJMAorCQkJaWNvbl93aWR0aCAJMAorCQkJaWNvbl95X29mZnNldCAJMAorCQkJYW5ub3RhdGlvbiAJMQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEAxMDgKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTIzMiwgMTMyOCkKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlAMTA3CisJCQkgICAgaGVpZ2h0ICAgICAJNjAKKwkJCSAgICB5X2Nvb3JkICAgIAkwCisJCQkgICAgTmVzdGVkICAgICAJRkFMU0UpKQorCQkgICAgKG9iamVjdCBJbnRlck9ialZpZXcgIkdsb2JhbFJlc291cmNlc0xpZmVjeWNsZUxpc3RlbmVyIiBAMTA5CisJCQlsb2NhdGlvbiAgIAkoMTU2OCwgMjI0KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCVRSVUUKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKKwkJCSAgICBQYXJlbnRfVmlldyAJQDEwOQorCQkJICAgIGxvY2F0aW9uICAgCSgxNTY4LCAyMjQpCisJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMgorCQkJICAgIG1heF93aWR0aCAgCTMyMgorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiR2xvYmFsUmVzb3VyY2VzTGlmZWN5Y2xlTGlzdGVuZXIiKQorCQkJaWNvbl9zdHlsZSAJIkljb24iCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJcXVpZHUgICAgICAJIjNERkRGQjdBMDJBQiIKKwkJCXdpZHRoICAgICAgCTM0MAorCQkJaGVpZ2h0ICAgICAJMTk3MgorCQkJaWNvbl9oZWlnaHQgCTAKKwkJCWljb25fd2lkdGggCTAKKwkJCWljb25feV9vZmZzZXQgCTAKKwkJCWFubm90YXRpb24gCTEKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBAMTEwCisJCQkgICAgbG9jYXRpb24gICAJKDE1NjgsIDE0NTYpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDEwOQorCQkJICAgIGhlaWdodCAgICAgCTYwCisJCQkgICAgeV9jb29yZCAgICAJMAorCQkJICAgIE5lc3RlZCAgICAgCUZBTFNFKSkKKwkJICAgIChvYmplY3QgSW50ZXJPYmpWaWV3ICJTZWN1cml0eUNvbmZpZyIgQDExMQorCQkJbG9jYXRpb24gICAJKDE5MjAsIDIyNCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlUUlVFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCisJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTEKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTkyMCwgMjI0KQorCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTIKKwkJCSAgICBtYXhfd2lkdGggIAkyODIKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJIlNlY3VyaXR5Q29uZmlnIikKKwkJCWljb25fc3R5bGUgCSJJY29uIgorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCXF1aWR1ICAgICAgCSIzREZERkJEODAyQkEiCisJCQl3aWR0aCAgICAgIAkzMDAKKwkJCWhlaWdodCAgICAgCTE5NzIKKwkJCWljb25faGVpZ2h0IAkwCisJCQlpY29uX3dpZHRoIAkwCisJCQlpY29uX3lfb2Zmc2V0IAkwCisJCQlhbm5vdGF0aW9uIAkxCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDExMgorCQkJICAgIGxvY2F0aW9uICAgCSgxOTIwLCAxNjAwKQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUAxMTEKKwkJCSAgICBoZWlnaHQgICAgIAk2MAorCQkJICAgIHlfY29vcmQgICAgCTAKKwkJCSAgICBOZXN0ZWQgICAgIAlGQUxTRSkKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBAMTEzCisJCQkgICAgbG9jYXRpb24gICAJKDE5MjAsIDE2ODApCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDExMQorCQkJICAgIGhlaWdodCAgICAgCTE0NgorCQkJICAgIHlfY29vcmQgICAgCTg2CisJCQkgICAgTmVzdGVkICAgICAJRkFMU0UpCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDExNAorCQkJICAgIGxvY2F0aW9uICAgCSgxOTIwLCAxNzYwKQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUAxMTEKKwkJCSAgICBoZWlnaHQgICAgIAk2MAorCQkJICAgIHlfY29vcmQgICAgCTAKKwkJCSAgICBOZXN0ZWQgICAgIAlUUlVFKSkKKwkJICAgIChvYmplY3QgU2VsZk1lc3NWaWV3ICIiIEAxMTUKKwkJCWxvY2F0aW9uICAgCSgxNiwgMzY4KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNgorCQkJICAgIFBhcmVudF9WaWV3IAlAMTE1CisJCQkgICAgbG9jYXRpb24gICAJKDMxNSwgMzI0KQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkRGOTIxMDAwOSIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTM0MAorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiaW5pdENsYXNzTG9hZGVycygpIgorCQkJICAgIHBjdERpc3QgICAgCTAuNTAwMDAwCisJCQkgICAgaGVpZ2h0ICAgICAJNDUKKwkJCSAgICBvcmllbnRhdGlvbiAJMCkKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUAxMDEKKwkJCXN1cHBsaWVyICAgCUAxMDEKKwkJCUZvY3VzX1NyYyAgCUAxMDIKKwkJCUZvY3VzX0VudHJ5IAlAMTAzCisJCQlvcmlnaW4gICAgIAkoMjQwLCAzNjgpCisJCQl0ZXJtaW51cyAgIAkoMzkwLCAzNjgpCisJCQlvcmRpbmFsICAgIAkwKQorCQkgICAgKG9iamVjdCBOb3RlVmlldyBAMTE3CisJCQlsb2NhdGlvbiAgIAkoMTE1MiwgMTA3MikKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAorCQkJICAgIFBhcmVudF9WaWV3IAlAMTE3CisJCQkgICAgbG9jYXRpb24gICAJKDEwMTQsIDEwMTIpCisJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCSAgICBubGluZXMgICAgIAkyCisJCQkgICAgbWF4X3dpZHRoICAJMjQwCisJCQkgICAgbGFiZWwgICAgICAJInBhcnNlIHNlcnZlci54bWwiKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCXdpZHRoICAgICAgCTMwMAorCQkJaGVpZ2h0ICAgICAJMTMyKQorCQkgICAgKG9iamVjdCBOb3RlVmlldyBAMTE4CisJCQlsb2NhdGlvbiAgIAkoMTM3NiwgODApCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKKwkJCSAgICBQYXJlbnRfVmlldyAJQDExOAorCQkJICAgIGxvY2F0aW9uICAgCSgxMjM4LCAyMCkKKwkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJICAgIG5saW5lcyAgICAgCTIKKwkJCSAgICBtYXhfd2lkdGggIAkyNDAKKwkJCSAgICBsYWJlbCAgICAgIAkiTUJlYW5zIikKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQl3aWR0aCAgICAgIAkzMDAKKwkJCWhlaWdodCAgICAgCTEzMikKKwkJICAgIChvYmplY3QgQXR0YWNoVmlldyAiIiBAMTE5CisJCQlzdGVyZW90eXBlIAlUUlVFCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlAMTE4CisJCQlzdXBwbGllciAgIAlAMTA3CisJCQlsaW5lX3N0eWxlIAkwKQorCQkgICAgKG9iamVjdCBBdHRhY2hWaWV3ICIiIEAxMjAKKwkJCXN0ZXJlb3R5cGUgCVRSVUUKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUAxMDkKKwkJCXN1cHBsaWVyICAgCUAxMTgKKwkJCWxpbmVfc3R5bGUgCTApCisJCSAgICAob2JqZWN0IE5vdGVWaWV3IEAxMjEKKwkJCWxvY2F0aW9uICAgCSgyMTYwLCAyMTc2KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCisJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjEKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTk0NywgMjExMykKKwkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJICAgIG5saW5lcyAgICAgCTIKKwkJCSAgICBtYXhfd2lkdGggIAkzOTAKKwkJCSAgICBsYWJlbCAgICAgIAkiIzFDYXRhbGluYS5sb2FkKCkiKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCXdpZHRoICAgICAgCTQ1MAorCQkJaGVpZ2h0ICAgICAJMTM4KQorCQkgICAgKG9iamVjdCBJbnRlck9ialZpZXcgIkNhdGFsaW5hIiBAMTIyCisJCQlsb2NhdGlvbiAgIAkoNTYwLCAyMjQpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJVFJVRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAorCQkJICAgIFBhcmVudF9WaWV3IAlAMTIyCisJCQkgICAgbG9jYXRpb24gICAJKDU2MCwgMjI0KQorCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTIKKwkJCSAgICBtYXhfd2lkdGggIAkyODIKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJIkNhdGFsaW5hIikKKwkJCWljb25fc3R5bGUgCSJJY29uIgorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCXF1aWR1ICAgICAgCSIzREZERjkwQTAzMzAiCisJCQl3aWR0aCAgICAgIAkzMDAKKwkJCWhlaWdodCAgICAgCTE5NzIKKwkJCWljb25faGVpZ2h0IAkwCisJCQlpY29uX3dpZHRoIAkwCisJCQlpY29uX3lfb2Zmc2V0IAkwCisJCQlhbm5vdGF0aW9uIAkxCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDEyMworCQkJICAgIGxvY2F0aW9uICAgCSg1NjAsIDQ2NCkKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlAMTIyCisJCQkgICAgaGVpZ2h0ICAgICAJNjAKKwkJCSAgICB5X2Nvb3JkICAgIAkwCisJCQkgICAgTmVzdGVkICAgICAJRkFMU0UpCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDEyNAorCQkJICAgIGxvY2F0aW9uICAgCSg1NjAsIDYwOCkKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlAMTIyCisJCQkgICAgaGVpZ2h0ICAgICAJNjAKKwkJCSAgICB5X2Nvb3JkICAgIAkwCisJCQkgICAgTmVzdGVkICAgICAJRkFMU0UpCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDEyNQorCQkJICAgIGxvY2F0aW9uICAgCSg1NjAsIDcyMCkKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlAMTIyCisJCQkgICAgaGVpZ2h0ICAgICAJMTMyNgorCQkJICAgIHlfY29vcmQgICAgCTEyNjYKKwkJCSAgICBOZXN0ZWQgICAgIAlGQUxTRSkKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBAMTI2CisJCQkgICAgbG9jYXRpb24gICAJKDU2MCwgODk2KQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUAxMjIKKwkJCSAgICBoZWlnaHQgICAgIAkxOTQKKwkJCSAgICB5X2Nvb3JkICAgIAkxMzQKKwkJCSAgICBOZXN0ZWQgICAgIAlUUlVFKQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEAxMjcKKwkJCSAgICBsb2NhdGlvbiAgIAkoNTYwLCA4OTYpCisJCQkgICAgSW50ZXJPYmpWaWV3IAlAMTIyCisJCQkgICAgaGVpZ2h0ICAgICAJNjAKKwkJCSAgICB5X2Nvb3JkICAgIAkwCisJCQkgICAgTmVzdGVkICAgICAJVFJVRSkKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBAMTI4CisJCQkgICAgbG9jYXRpb24gICAJKDU2MCwgMTAyNCkKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlAMTIyCisJCQkgICAgaGVpZ2h0ICAgICAJNjAKKwkJCSAgICB5X2Nvb3JkICAgIAkwCisJCQkgICAgTmVzdGVkICAgICAJVFJVRSkKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBAMTI5CisJCQkgICAgbG9jYXRpb24gICAJKDU2MCwgMTAyNCkKKwkJCSAgICBJbnRlck9ialZpZXcgCUAxMjIKKwkJCSAgICBoZWlnaHQgICAgIAk2MAorCQkJICAgIHlfY29vcmQgICAgCTAKKwkJCSAgICBOZXN0ZWQgICAgIAlUUlVFKQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEAxMzAKKwkJCSAgICBsb2NhdGlvbiAgIAkoNTYwLCAxMTUyKQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUAxMjIKKwkJCSAgICBoZWlnaHQgICAgIAk2MAorCQkJICAgIHlfY29vcmQgICAgCTAKKwkJCSAgICBOZXN0ZWQgICAgIAlUUlVFKQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEAxMzEKKwkJCSAgICBsb2NhdGlvbiAgIAkoNTYwLCAxMTUyKQorCQkJICAgIEludGVyT2JqVmlldyAJQDEyMgorCQkJICAgIGhlaWdodCAgICAgCTYwCisJCQkgICAgeV9jb29yZCAgICAJMAorCQkJICAgIE5lc3RlZCAgICAgCVRSVUUpKQorCQkgICAgKG9iamVjdCBTZWxmTWVzc1ZpZXcgIiIgQDEzMgorCQkJbG9jYXRpb24gICAJKDE2LCA4OTYpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMzCisJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzIKKwkJCSAgICBsb2NhdGlvbiAgIAkoNjUxLCA4NTIpCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGREZBODAwMURBIgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJMTYwCisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJpbml0RGlycygpIgorCQkJICAgIHBjdERpc3QgICAgCTAuNTAwMDAwCisJCQkgICAgaGVpZ2h0ICAgICAJNDUKKwkJCSAgICBvcmllbnRhdGlvbiAJMCkKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUAxMjIKKwkJCXN1cHBsaWVyICAgCUAxMjIKKwkJCUZvY3VzX1NyYyAgCUAxMjcKKwkJCUZvY3VzX0VudHJ5IAlAMTI2CisJCQlvcmlnaW4gICAgIAkoNTc2LCA4OTYpCisJCQl0ZXJtaW51cyAgIAkoNzI2LCA4OTYpCisJCQlvcmRpbmFsICAgIAk0KQorCQkgICAgKG9iamVjdCBTZWxmTWVzc1ZpZXcgIiIgQDEzNAorCQkJbG9jYXRpb24gICAJKDE2LCAxMDI0KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNQorCQkJICAgIFBhcmVudF9WaWV3IAlAMTM0CisJCQkgICAgbG9jYXRpb24gICAJKDcwMSwgOTgxKQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkRGQThCMDM0NyIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTIyOAorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiaW5pdE5hbWluZygpIgorCQkJICAgIHBjdERpc3QgICAgCTAuODQwMDAwCisJCQkgICAgaGVpZ2h0ICAgICAJNDQKKwkJCSAgICBvcmllbnRhdGlvbiAJMCkKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUAxMjIKKwkJCXN1cHBsaWVyICAgCUAxMjIKKwkJCUZvY3VzX1NyYyAgCUAxMjkKKwkJCUZvY3VzX0VudHJ5IAlAMTI4CisJCQlvcmlnaW4gICAgIAkoNTc2LCAxMDI0KQorCQkJdGVybWludXMgICAJKDcyNiwgMTAyNCkKKwkJCW9yZGluYWwgICAgCTUpCisJCSAgICAob2JqZWN0IFNlbGZNZXNzVmlldyAiIiBAMTM2CisJCQlsb2NhdGlvbiAgIAkoMTYsIDExNTIpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM3CisJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzYKKwkJCSAgICBsb2NhdGlvbiAgIAkoNjg2LCAxMTA5KQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkRGQUFEMDFBQyIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTE4MAorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiaW5pdGlhbGl6ZSgpIgorCQkJICAgIHBjdERpc3QgICAgCTAuNzMzMzMzCisJCQkgICAgaGVpZ2h0ICAgICAJNDQKKwkJCSAgICBvcmllbnRhdGlvbiAJMCkKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUAxMjIKKwkJCXN1cHBsaWVyICAgCUAxMjIKKwkJCUZvY3VzX1NyYyAgCUAxMzEKKwkJCUZvY3VzX0VudHJ5IAlAMTMwCisJCQlvcmlnaW4gICAgIAkoNTc2LCAxMTUyKQorCQkJdGVybWludXMgICAJKDcyNiwgMTE1MikKKwkJCW9yZGluYWwgICAgCTYpCisJCSAgICAob2JqZWN0IEludGVyTWVzc1ZpZXcgIiIgQDEzOAorCQkJbG9jYXRpb24gICAJKDE2LCA0NjQpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM5CisJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzgKKwkJCSAgICBsb2NhdGlvbiAgIAkoMzg5LCA0MzcpCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGREY5MUEwMTBEIgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJMjY1CisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJuZXdJbnN0YW5jZSgpIgorCQkJICAgIHBjdERpc3QgICAgCTAuNDk1MDgyCisJCQkgICAgaGVpZ2h0ICAgICAJMjgKKwkJCSAgICBvcmllbnRhdGlvbiAJMCkKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUAxMDEKKwkJCXN1cHBsaWVyICAgCUAxMjIKKwkJCUZvY3VzX1NyYyAgCUAxMDIKKwkJCUZvY3VzX0VudHJ5IAlAMTIzCisJCQlvcmlnaW4gICAgIAkoMjM5LCA0NjQpCisJCQl0ZXJtaW51cyAgIAkoNTQ0LCA0NjQpCisJCQlvcmRpbmFsICAgIAkxKQorCQkgICAgKG9iamVjdCBJbnRlck1lc3NWaWV3ICIiIEAxNDAKKwkJCWxvY2F0aW9uICAgCSgxNiwgNjA4KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MQorCQkJICAgIFBhcmVudF9WaWV3IAlAMTQwCisJCQkgICAgbG9jYXRpb24gICAJKDQ1NiwgNTY1KQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkRGOTc5MDBDMiIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTQ0NQorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkic2V0UGFyZW50Q2xhc3NMb2FkZXIoKSIKKwkJCSAgICBwY3REaXN0ICAgIAkwLjcxMTQ3NQorCQkJICAgIGhlaWdodCAgICAgCTQ0CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlAMTAxCisJCQlzdXBwbGllciAgIAlAMTIyCisJCQlGb2N1c19TcmMgIAlAMTAyCisJCQlGb2N1c19FbnRyeSAJQDEyNAorCQkJb3JpZ2luICAgICAJKDIzOSwgNjA4KQorCQkJdGVybWludXMgICAJKDU0NCwgNjA4KQorCQkJb3JkaW5hbCAgICAJMikKKwkJICAgIChvYmplY3QgSW50ZXJNZXNzVmlldyAiIiBAMTQyCisJCQlsb2NhdGlvbiAgIAkoMTYsIDcyMCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDMKKwkJCSAgICBQYXJlbnRfVmlldyAJQDE0MgorCQkJICAgIGxvY2F0aW9uICAgCSgzOTEsIDY3NikKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZERkEzNDAyRjIiCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAkxMDgKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJImxvYWQoKSIKKwkJCSAgICBwY3REaXN0ICAgIAkwLjUwMDAwMAorCQkJICAgIGhlaWdodCAgICAgCTQ1CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlAMTAxCisJCQlzdXBwbGllciAgIAlAMTIyCisJCQlGb2N1c19TcmMgIAlAMTAyCisJCQlGb2N1c19FbnRyeSAJQDEyNQorCQkJb3JpZ2luICAgICAJKDIzOSwgNzIwKQorCQkJdGVybWludXMgICAJKDU0NCwgNzIwKQorCQkJb3JkaW5hbCAgICAJMykKKwkJICAgIChvYmplY3QgSW50ZXJNZXNzVmlldyAiIiBAMTQ0CisJCQlsb2NhdGlvbiAgIAkoMTYsIDEyMzIpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ1CisJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDQKKwkJCSAgICBsb2NhdGlvbiAgIAkoNzI3LCAxMTg4KQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkRGQUY4MDBDNCIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTMwMgorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiY3JlYXRlRGlnZXN0ZXIoKSIKKwkJCSAgICBwY3REaXN0ICAgIAkwLjUwMDAwMAorCQkJICAgIGhlaWdodCAgICAgCTQ1CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlAMTIyCisJCQlzdXBwbGllciAgIAlAMTA0CisJCQlGb2N1c19TcmMgIAlAMTI1CisJCQlGb2N1c19FbnRyeSAJQDEwNQorCQkJb3JpZ2luICAgICAJKDU3NSwgMTIzMikKKwkJCXRlcm1pbnVzICAgCSg4ODAsIDEyMzIpCisJCQlvcmRpbmFsICAgIAk3KQorCQkgICAgKG9iamVjdCBJbnRlck1lc3NWaWV3ICIiIEAxNDYKKwkJCWxvY2F0aW9uICAgCSgxNiwgMTMxMikKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDcKKwkJCSAgICBQYXJlbnRfVmlldyAJQDE0NgorCQkJICAgIGxvY2F0aW9uICAgCSg3MjcsIDEyNjgpCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGREZCMDEwMEIyIgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJMTM2CisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJwYXJzZSgpIgorCQkJICAgIHBjdERpc3QgICAgCTAuNTAwMDAwCisJCQkgICAgaGVpZ2h0ICAgICAJNDUKKwkJCSAgICBvcmllbnRhdGlvbiAJMCkKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUAxMjIKKwkJCXN1cHBsaWVyICAgCUAxMDQKKwkJCUZvY3VzX1NyYyAgCUAxMjUKKwkJCUZvY3VzX0VudHJ5IAlAMTA2CisJCQlvcmlnaW4gICAgIAkoNTc1LCAxMzEyKQorCQkJdGVybWludXMgICAJKDg4MCwgMTMxMikKKwkJCW9yZGluYWwgICAgCTgpCisJCSAgICAob2JqZWN0IEF0dGFjaFZpZXcgIiIgQDE0OAorCQkJc3RlcmVvdHlwZSAJVFJVRQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDE0NworCQkJc3VwcGxpZXIgICAJQDExNworCQkJbGluZV9zdHlsZSAJMCkKKwkJICAgIChvYmplY3QgSW50ZXJNZXNzVmlldyAiIiBAMTQ5CisJCQlsb2NhdGlvbiAgIAkoMTYsIDEzMjgpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTUwCisJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDkKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTA2MywgMTI4NCkKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZERkI4NDAwQTciCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAkyNjUKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJIm5ld0luc3RhbmNlKCkiCisJCQkgICAgcGN0RGlzdCAgICAJMC41MDAwMDAKKwkJCSAgICBoZWlnaHQgICAgIAk0NQorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDEwNAorCQkJc3VwcGxpZXIgICAJQDEwNworCQkJRm9jdXNfU3JjICAJQDEwNgorCQkJRm9jdXNfRW50cnkgCUAxMDgKKwkJCW9yaWdpbiAgICAgCSg5MTEsIDEzMjgpCisJCQl0ZXJtaW51cyAgIAkoMTIxNiwgMTMyOCkKKwkJCW9yZGluYWwgICAgCTkpCisJCSAgICAob2JqZWN0IEludGVyTWVzc1ZpZXcgIiIgQDE1MQorCQkJbG9jYXRpb24gICAJKDE2LCAxNDU2KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE1MgorCQkJICAgIFBhcmVudF9WaWV3IAlAMTUxCisJCQkgICAgbG9jYXRpb24gICAJKDEyMzEsIDE0MTIpCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGREZCOTIwMTQ4IgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJMjY1CisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJuZXdJbnN0YW5jZSgpIgorCQkJICAgIHBjdERpc3QgICAgCTAuNTAwMDAwCisJCQkgICAgaGVpZ2h0ICAgICAJNDUKKwkJCSAgICBvcmllbnRhdGlvbiAJMCkKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUAxMDQKKwkJCXN1cHBsaWVyICAgCUAxMDkKKwkJCUZvY3VzX1NyYyAgCUAxMDYKKwkJCUZvY3VzX0VudHJ5IAlAMTEwCisJCQlvcmlnaW4gICAgIAkoOTExLCAxNDU2KQorCQkJdGVybWludXMgICAJKDE1NTIsIDE0NTYpCisJCQlvcmRpbmFsICAgIAkxMCkKKwkJICAgIChvYmplY3QgSW50ZXJNZXNzVmlldyAiIiBAMTUzCisJCQlsb2NhdGlvbiAgIAkoMTYsIDE2MDApCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTU0CisJCQkgICAgUGFyZW50X1ZpZXcgCUAxNTMKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTIzOSwgMTU1NikKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZERkJFQTAwQzIiCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAkyNjUKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJIm5ld0luc3RhbmNlKCkiCisJCQkgICAgcGN0RGlzdCAgICAJMC41MDAwMDAKKwkJCSAgICBoZWlnaHQgICAgIAk0NQorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDEyMgorCQkJc3VwcGxpZXIgICAJQDExMQorCQkJRm9jdXNfU3JjICAJQDEyNQorCQkJRm9jdXNfRW50cnkgCUAxMTIKKwkJCW9yaWdpbiAgICAgCSg1NzUsIDE2MDApCisJCQl0ZXJtaW51cyAgIAkoMTkwNCwgMTYwMCkKKwkJCW9yZGluYWwgICAgCTExKQorCQkgICAgKG9iamVjdCBJbnRlck1lc3NWaWV3ICIiIEAxNTUKKwkJCWxvY2F0aW9uICAgCSgxNiwgMTY4MCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNTYKKwkJCSAgICBQYXJlbnRfVmlldyAJQDE1NQorCQkJICAgIGxvY2F0aW9uICAgCSgxMjM5LCAxNjM2KQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkRGQkY0MDFGMiIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTQyNQorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkic2V0UGFja2FnZURlZmluaXRpb24oKSIKKwkJCSAgICBwY3REaXN0ICAgIAkwLjUwMDAwMAorCQkJICAgIGhlaWdodCAgICAgCTQ1CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlAMTIyCisJCQlzdXBwbGllciAgIAlAMTExCisJCQlGb2N1c19TcmMgIAlAMTI1CisJCQlGb2N1c19FbnRyeSAJQDExMworCQkJb3JpZ2luICAgICAJKDU3NSwgMTY4MCkKKwkJCXRlcm1pbnVzICAgCSgxOTA0LCAxNjgwKQorCQkJb3JkaW5hbCAgICAJMTIpCisJCSAgICAob2JqZWN0IEludGVyTWVzc1ZpZXcgIiIgQDE1NworCQkJbG9jYXRpb24gICAJKDE2LCAxNzYwKQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE1OAorCQkJICAgIFBhcmVudF9WaWV3IAlAMTU3CisJCQkgICAgbG9jYXRpb24gICAJKDEyMzksIDE3MTYpCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGREZDMTIwM0MyIgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJMzg2CisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJzZXRQYWNrYWdlQWNjZXNzKCkiCisJCQkgICAgcGN0RGlzdCAgICAJMC41MDAwMDAKKwkJCSAgICBoZWlnaHQgICAgIAk0NQorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDEyMgorCQkJc3VwcGxpZXIgICAJQDExMQorCQkJRm9jdXNfU3JjICAJQDEyNQorCQkJRm9jdXNfRW50cnkgCUAxMTQKKwkJCW9yaWdpbiAgICAgCSg1NzUsIDE3NjApCisJCQl0ZXJtaW51cyAgIAkoMTkwNCwgMTc2MCkKKwkJCW9yZGluYWwgICAgCTEzKSkpCisJICAgIChvYmplY3QgSW50ZXJhY3Rpb25EaWFncmFtICIyLiBjYXRhbGluYV9pbml0bGlhemUiCisJCW1lY2hhbmlzbV9yZWYgCUA4MworCQlxdWlkICAgICAgIAkiM0RGREZDNDQwMDJBIgorCQl0aXRsZSAgICAgIAkiMi4gY2F0YWxpbmFfaW5pdGxpYXplIgorCQl6b29tICAgICAgIAkxMDAKKwkJbWF4X2hlaWdodCAJMjgzNTAKKwkJbWF4X3dpZHRoICAJMjE2MDAKKwkJb3JpZ2luX3ggICAJMAorCQlvcmlnaW5feSAgIAk4NworCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAorCQkgICAgKG9iamVjdCBJbnRlck9ialZpZXcgIkNhdGFsaW5hIiBAMTU5CisJCQlsb2NhdGlvbiAgIAkoMTc2LCAyMjQpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJVFJVRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAorCQkJICAgIFBhcmVudF9WaWV3IAlAMTU5CisJCQkgICAgbG9jYXRpb24gICAJKDE3NiwgMjI0KQorCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTIKKwkJCSAgICBtYXhfd2lkdGggIAkyODIKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJIkNhdGFsaW5hIikKKwkJCWljb25fc3R5bGUgCSJJY29uIgorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCXF1aWR1ICAgICAgCSIzREZERkM4RjAxNUYiCisJCQl3aWR0aCAgICAgIAkzMDAKKwkJCWhlaWdodCAgICAgCTExODAKKwkJCWljb25faGVpZ2h0IAkwCisJCQlpY29uX3dpZHRoIAkwCisJCQlpY29uX3lfb2Zmc2V0IAkwCisJCQlhbm5vdGF0aW9uIAkxCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDE2MAorCQkJICAgIGxvY2F0aW9uICAgCSgxNzYsIDQwMCkKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlAMTU5CisJCQkgICAgaGVpZ2h0ICAgICAJOTE0CisJCQkgICAgeV9jb29yZCAgICAJODU0CisJCQkgICAgTmVzdGVkICAgICAJRkFMU0UpKQorCQkgICAgKG9iamVjdCBJbnRlck9ialZpZXcgIlN0YW5kYXJkU2VydmVyIiBAMTYxCisJCQlsb2NhdGlvbiAgIAkoNDk2LCAyMjQpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJVFJVRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAorCQkJICAgIFBhcmVudF9WaWV3IAlAMTYxCisJCQkgICAgbG9jYXRpb24gICAJKDQ5NiwgMjI0KQorCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTIKKwkJCSAgICBtYXhfd2lkdGggIAkyODIKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJIlN0YW5kYXJkU2VydmVyIikKKwkJCWljb25fc3R5bGUgCSJJY29uIgorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCXF1aWR1ICAgICAgCSIzREZERkNDQjAwNkIiCisJCQl3aWR0aCAgICAgIAkzMDAKKwkJCWhlaWdodCAgICAgCTExODAKKwkJCWljb25faGVpZ2h0IAkwCisJCQlpY29uX3dpZHRoIAkwCisJCQlpY29uX3lfb2Zmc2V0IAkwCisJCQlhbm5vdGF0aW9uIAkxCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDE2MgorCQkJICAgIGxvY2F0aW9uICAgCSg0OTYsIDQwMCkKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlAMTYxCisJCQkgICAgaGVpZ2h0ICAgICAJODU0CisJCQkgICAgeV9jb29yZCAgICAJNzk0CisJCQkgICAgTmVzdGVkICAgICAJRkFMU0UpCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDE2MworCQkJICAgIGxvY2F0aW9uICAgCSg0OTYsIDQ4MCkKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlAMTYxCisJCQkgICAgaGVpZ2h0ICAgICAJNzY4CisJCQkgICAgeV9jb29yZCAgICAJNzA4CisJCQkgICAgTmVzdGVkICAgICAJVFJVRSkpCisJCSAgICAob2JqZWN0IEludGVyT2JqVmlldyAiU3RhbmRhcmRTZXJ2aWNlIiBAMTY0CisJCQlsb2NhdGlvbiAgIAkoODMyLCAyMjQpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJVFJVRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAorCQkJICAgIFBhcmVudF9WaWV3IAlAMTY0CisJCQkgICAgbG9jYXRpb24gICAJKDgzMiwgMjI0KQorCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTIKKwkJCSAgICBtYXhfd2lkdGggIAkyODIKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJIlN0YW5kYXJkU2VydmljZSIpCisJCQlpY29uX3N0eWxlIAkiSWNvbiIKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQlxdWlkdSAgICAgIAkiM0RGREZEMzcwMDIwIgorCQkJd2lkdGggICAgICAJMzAwCisJCQloZWlnaHQgICAgIAkxMTgwCisJCQlpY29uX2hlaWdodCAJMAorCQkJaWNvbl93aWR0aCAJMAorCQkJaWNvbl95X29mZnNldCAJMAorCQkJYW5ub3RhdGlvbiAJMQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEAxNjUKKwkJCSAgICBsb2NhdGlvbiAgIAkoODMyLCA0ODApCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDE2NAorCQkJICAgIGhlaWdodCAgICAgCTcwOAorCQkJICAgIHlfY29vcmQgICAgCTY0OAorCQkJICAgIE5lc3RlZCAgICAgCUZBTFNFKSkKKwkJICAgIChvYmplY3QgSW50ZXJPYmpWaWV3ICJDb3lvdGVDb25uZWN0b3IiIEAxNjYKKwkJCWxvY2F0aW9uICAgCSgxMTY4LCAyMjQpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJVFJVRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAorCQkJICAgIFBhcmVudF9WaWV3IAlAMTY2CisJCQkgICAgbG9jYXRpb24gICAJKDExNjgsIDIyNCkKKwkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkyCisJCQkgICAgbWF4X3dpZHRoICAJMjgyCisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJDb3lvdGVDb25uZWN0b3IiKQorCQkJaWNvbl9zdHlsZSAJIkljb24iCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJcXVpZHUgICAgICAJIjNERkRGRTgxMDMxMyIKKwkJCXdpZHRoICAgICAgCTMwMAorCQkJaGVpZ2h0ICAgICAJMTE4MAorCQkJaWNvbl9oZWlnaHQgCTAKKwkJCWljb25fd2lkdGggCTAKKwkJCWljb25feV9vZmZzZXQgCTAKKwkJCWFubm90YXRpb24gCTEKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBAMTY3CisJCQkgICAgbG9jYXRpb24gICAJKDExNjgsIDUyOCkKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlAMTY2CisJCQkgICAgaGVpZ2h0ICAgICAJNjAwCisJCQkgICAgeV9jb29yZCAgICAJNTQwCisJCQkgICAgTmVzdGVkICAgICAJRkFMU0UpKQorCQkgICAgKG9iamVjdCBJbnRlck9ialZpZXcgIkNveW90ZUFkYXB0ZXIiIEAxNjgKKwkJCWxvY2F0aW9uICAgCSgxNTA0LCAyMjQpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJVFJVRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAorCQkJICAgIFBhcmVudF9WaWV3IAlAMTY4CisJCQkgICAgbG9jYXRpb24gICAJKDE1MDQsIDIyNCkKKwkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkyCisJCQkgICAgbWF4X3dpZHRoICAJMjgyCisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJDb3lvdGVBZGFwdGVyIikKKwkJCWljb25fc3R5bGUgCSJJY29uIgorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCXF1aWR1ICAgICAgCSIzREZERkZBMDAyMjYiCisJCQl3aWR0aCAgICAgIAkzMDAKKwkJCWhlaWdodCAgICAgCTExODAKKwkJCWljb25faGVpZ2h0IAkwCisJCQlpY29uX3dpZHRoIAkwCisJCQlpY29uX3lfb2Zmc2V0IAkwCisJCQlhbm5vdGF0aW9uIAkxCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDE2OQorCQkJICAgIGxvY2F0aW9uICAgCSgxNTA0LCA1NzYpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDE2OAorCQkJICAgIGhlaWdodCAgICAgCTYwCisJCQkgICAgeV9jb29yZCAgICAJMAorCQkJICAgIE5lc3RlZCAgICAgCUZBTFNFKSkKKwkJICAgIChvYmplY3QgSW50ZXJPYmpWaWV3ICJIdHRwMTFQcm90b2NvbCIgQDE3MAorCQkJbG9jYXRpb24gICAJKDE4MDgsIDIyNCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlUUlVFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCisJCQkgICAgUGFyZW50X1ZpZXcgCUAxNzAKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTgwOCwgMjI0KQorCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTIKKwkJCSAgICBtYXhfd2lkdGggIAkyODIKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJIkh0dHAxMVByb3RvY29sIikKKwkJCWljb25fc3R5bGUgCSJJY29uIgorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCXF1aWR1ICAgICAgCSIzREZFMDE2NjAxQTYiCisJCQl3aWR0aCAgICAgIAkzMDAKKwkJCWhlaWdodCAgICAgCTExODAKKwkJCWljb25faGVpZ2h0IAkwCisJCQlpY29uX3dpZHRoIAkwCisJCQlpY29uX3lfb2Zmc2V0IAkwCisJCQlhbm5vdGF0aW9uIAkxCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDE3MQorCQkJICAgIGxvY2F0aW9uICAgCSgxODA4LCA3MDQpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDE3MAorCQkJICAgIGhlaWdodCAgICAgCTYwCisJCQkgICAgeV9jb29yZCAgICAJMAorCQkJICAgIE5lc3RlZCAgICAgCUZBTFNFKQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEAxNzIKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTgwOCwgODMyKQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUAxNzAKKwkJCSAgICBoZWlnaHQgICAgIAk2MAorCQkJICAgIHlfY29vcmQgICAgCTAKKwkJCSAgICBOZXN0ZWQgICAgIAlGQUxTRSkpCisJCSAgICAob2JqZWN0IEludGVyT2JqVmlldyAiSmtDb3lvdGVBZGFwdGVyIiBAMTczCisJCQlsb2NhdGlvbiAgIAkoMjE0NCwgMjI0KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCVRSVUUKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKKwkJCSAgICBQYXJlbnRfVmlldyAJQDE3MworCQkJICAgIGxvY2F0aW9uICAgCSgyMTQ0LCAyMjQpCisJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMgorCQkJICAgIG1heF93aWR0aCAgCTI4MgorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiSmtDb3lvdGVBZGFwdGVyIikKKwkJCWljb25fc3R5bGUgCSJJY29uIgorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCXF1aWR1ICAgICAgCSIzREZFMDFBRDAxQTgiCisJCQl3aWR0aCAgICAgIAkzMDAKKwkJCWhlaWdodCAgICAgCTExODAKKwkJCWljb25faGVpZ2h0IAkwCisJCQlpY29uX3dpZHRoIAkwCisJCQlpY29uX3lfb2Zmc2V0IAkwCisJCQlhbm5vdGF0aW9uIAkxCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDE3NAorCQkJICAgIGxvY2F0aW9uICAgCSgyMTQ0LCA5MjgpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDE3MworCQkJICAgIGhlaWdodCAgICAgCTYwCisJCQkgICAgeV9jb29yZCAgICAJMAorCQkJICAgIE5lc3RlZCAgICAgCUZBTFNFKQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEAxNzUKKwkJCSAgICBsb2NhdGlvbiAgIAkoMjE0NCwgMTAwOCkKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlAMTczCisJCQkgICAgaGVpZ2h0ICAgICAJNjAKKwkJCSAgICB5X2Nvb3JkICAgIAkwCisJCQkgICAgTmVzdGVkICAgICAJRkFMU0UpKQorCQkgICAgKG9iamVjdCBJbnRlck1lc3NWaWV3ICIiIEAxNzYKKwkJCWxvY2F0aW9uICAgCSgxNiwgNDAwKQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE3NworCQkJICAgIFBhcmVudF9WaWV3IAlAMTc2CisJCQkgICAgbG9jYXRpb24gICAJKDMzNSwgMzU2KQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkRGRDFGMDA3NiIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTE4MAorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiaW5pdGlhbGl6ZSgpIgorCQkJICAgIHBjdERpc3QgICAgCTAuNTAwMDAwCisJCQkgICAgaGVpZ2h0ICAgICAJNDUKKwkJCSAgICBvcmllbnRhdGlvbiAJMCkKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUAxNTkKKwkJCXN1cHBsaWVyICAgCUAxNjEKKwkJCUZvY3VzX1NyYyAgCUAxNjAKKwkJCUZvY3VzX0VudHJ5IAlAMTYyCisJCQlvcmlnaW4gICAgIAkoMTkxLCA0MDApCisJCQl0ZXJtaW51cyAgIAkoNDgwLCA0MDApCisJCQlvcmRpbmFsICAgIAkwKQorCQkgICAgKG9iamVjdCBJbnRlck1lc3NWaWV3ICIiIEAxNzgKKwkJCWxvY2F0aW9uICAgCSgxNiwgNDgwKQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE3OQorCQkJICAgIFBhcmVudF9WaWV3IAlAMTc4CisJCQkgICAgbG9jYXRpb24gICAJKDY2MywgNDM2KQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkRGRDNEMDFDNCIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTE4MAorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiaW5pdGlhbGl6ZSgpIgorCQkJICAgIHBjdERpc3QgICAgCTAuNTAwMDAwCisJCQkgICAgaGVpZ2h0ICAgICAJNDUKKwkJCSAgICBvcmllbnRhdGlvbiAJMCkKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUAxNjEKKwkJCXN1cHBsaWVyICAgCUAxNjQKKwkJCUZvY3VzX1NyYyAgCUAxNjMKKwkJCUZvY3VzX0VudHJ5IAlAMTY1CisJCQlvcmlnaW4gICAgIAkoNTExLCA0ODApCisJCQl0ZXJtaW51cyAgIAkoODE2LCA0ODApCisJCQlvcmRpbmFsICAgIAkxKQorCQkgICAgKG9iamVjdCBJbnRlck1lc3NWaWV3ICIiIEAxODAKKwkJCWxvY2F0aW9uICAgCSgxNiwgNTI4KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE4MQorCQkJICAgIFBhcmVudF9WaWV3IAlAMTgwCisJCQkgICAgbG9jYXRpb24gICAJKDk5OSwgNDg0KQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkRGRTk5MDMwNSIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTE4MAorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiaW5pdGlhbGl6ZSgpIgorCQkJICAgIHBjdERpc3QgICAgCTAuNTAwMDAwCisJCQkgICAgaGVpZ2h0ICAgICAJNDUKKwkJCSAgICBvcmllbnRhdGlvbiAJMCkKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUAxNjQKKwkJCXN1cHBsaWVyICAgCUAxNjYKKwkJCUZvY3VzX1NyYyAgCUAxNjUKKwkJCUZvY3VzX0VudHJ5IAlAMTY3CisJCQlvcmlnaW4gICAgIAkoODQ3LCA1MjgpCisJCQl0ZXJtaW51cyAgIAkoMTE1MiwgNTI4KQorCQkJb3JkaW5hbCAgICAJMikKKwkJICAgIChvYmplY3QgSW50ZXJNZXNzVmlldyAiIiBAMTgyCisJCQlsb2NhdGlvbiAgIAkoMTYsIDU3NikKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxODMKKwkJCSAgICBQYXJlbnRfVmlldyAJQDE4MgorCQkJICAgIGxvY2F0aW9uICAgCSgxMzM1LCA1MzIpCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTAxM0QwMjE3IgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJMTA2CisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJuZXcoKSIKKwkJCSAgICBwY3REaXN0ICAgIAkwLjUwMDAwMAorCQkJICAgIGhlaWdodCAgICAgCTQ1CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlAMTY2CisJCQlzdXBwbGllciAgIAlAMTY4CisJCQlGb2N1c19TcmMgIAlAMTY3CisJCQlGb2N1c19FbnRyeSAJQDE2OQorCQkJb3JpZ2luICAgICAJKDExODMsIDU3NikKKwkJCXRlcm1pbnVzICAgCSgxNDg4LCA1NzYpCisJCQlvcmRpbmFsICAgIAkzKQorCQkgICAgKG9iamVjdCBJbnRlck1lc3NWaWV3ICIiIEAxODQKKwkJCWxvY2F0aW9uICAgCSgxNTA0LCA3MDQpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTg1CisJCQkgICAgUGFyZW50X1ZpZXcgCUAxODQKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTQ4NywgNjYwKQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkUwMTgzMDMzMCIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTEwNgorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkibmV3KCkiCisJCQkgICAgcGN0RGlzdCAgICAJMC41MDAwMDAKKwkJCSAgICBoZWlnaHQgICAgIAk0NQorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDE2NgorCQkJc3VwcGxpZXIgICAJQDE3MAorCQkJRm9jdXNfU3JjICAJQDE2NworCQkJRm9jdXNfRW50cnkgCUAxNzEKKwkJCW9yaWdpbiAgICAgCSgxMTgzLCA3MDQpCisJCQl0ZXJtaW51cyAgIAkoMTc5MiwgNzA0KQorCQkJb3JkaW5hbCAgICAJNCkKKwkJICAgIChvYmplY3QgSW50ZXJNZXNzVmlldyAiIiBAMTg2CisJCQlsb2NhdGlvbiAgIAkoMTUwNCwgODMyKQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE4NworCQkJICAgIFBhcmVudF9WaWV3IAlAMTg2CisJCQkgICAgbG9jYXRpb24gICAJKDE0ODcsIDc4OCkKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZFMDE4ODAzMkMiCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAk4MAorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiaW5pdCgpIgorCQkJICAgIHBjdERpc3QgICAgCTAuNTAwMDAwCisJCQkgICAgaGVpZ2h0ICAgICAJNDUKKwkJCSAgICBvcmllbnRhdGlvbiAJMCkKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUAxNjYKKwkJCXN1cHBsaWVyICAgCUAxNzAKKwkJCUZvY3VzX1NyYyAgCUAxNjcKKwkJCUZvY3VzX0VudHJ5IAlAMTcyCisJCQlvcmlnaW4gICAgIAkoMTE4MywgODMyKQorCQkJdGVybWludXMgICAJKDE3OTIsIDgzMikKKwkJCW9yZGluYWwgICAgCTUpCisJCSAgICAob2JqZWN0IEludGVyTWVzc1ZpZXcgIiIgQDE4OAorCQkJbG9jYXRpb24gICAJKDE2LCA5MjgpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTg5CisJCQkgICAgUGFyZW50X1ZpZXcgCUAxODgKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTY1NSwgODg0KQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkUwMUJDMDM4QyIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTEwNgorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkibmV3KCkiCisJCQkgICAgcGN0RGlzdCAgICAJMC41MDAwMDAKKwkJCSAgICBoZWlnaHQgICAgIAk0NQorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDE2NgorCQkJc3VwcGxpZXIgICAJQDE3MworCQkJRm9jdXNfU3JjICAJQDE2NworCQkJRm9jdXNfRW50cnkgCUAxNzQKKwkJCW9yaWdpbiAgICAgCSgxMTgzLCA5MjgpCisJCQl0ZXJtaW51cyAgIAkoMjEyOCwgOTI4KQorCQkJb3JkaW5hbCAgICAJNikKKwkJICAgIChvYmplY3QgSW50ZXJNZXNzVmlldyAiIiBAMTkwCisJCQlsb2NhdGlvbiAgIAkoMTYsIDEwMDgpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTkxCisJCQkgICAgUGFyZW50X1ZpZXcgCUAxOTAKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTY1NSwgOTY0KQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkUwMUMzMDE2NCIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTgwCisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJpbml0KCkiCisJCQkgICAgcGN0RGlzdCAgICAJMC41MDAwMDAKKwkJCSAgICBoZWlnaHQgICAgIAk0NQorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDE2NgorCQkJc3VwcGxpZXIgICAJQDE3MworCQkJRm9jdXNfU3JjICAJQDE2NworCQkJRm9jdXNfRW50cnkgCUAxNzUKKwkJCW9yaWdpbiAgICAgCSgxMTgzLCAxMDA4KQorCQkJdGVybWludXMgICAJKDIxMjgsIDEwMDgpCisJCQlvcmRpbmFsICAgIAk3KQorCQkgICAgKG9iamVjdCBOb3RlVmlldyBAMTkyCisJCQlsb2NhdGlvbiAgIAkoMjE0NCwgMjAxNikKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAorCQkJICAgIFBhcmVudF9WaWV3IAlAMTkyCisJCQkgICAgbG9jYXRpb24gICAJKDE5NDcsIDE5NTcpCisJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCSAgICBubGluZXMgICAgIAkyCisJCQkgICAgbWF4X3dpZHRoICAJMzU5CisJCQkgICAgbGFiZWwgICAgICAJIiMyIENhdGFsaW5hLmluaXRpYWxpemUoKSIpCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJd2lkdGggICAgICAJNDE5CisJCQloZWlnaHQgICAgIAkxMzEpKSkKKwkgICAgKG9iamVjdCBJbnRlcmFjdGlvbkRpYWdyYW0gIjMuIGNhdGFsaW5hX3N0YXJ0IgorCQltZWNoYW5pc21fcmVmIAlAODQKKwkJcXVpZCAgICAgICAJIjNERkUwMjZEMDJEMSIKKwkJdGl0bGUgICAgICAJIjMuIGNhdGFsaW5hX3N0YXJ0IgorCQl6b29tICAgICAgIAkxMDAKKwkJbWF4X2hlaWdodCAJMjgzNTAKKwkJbWF4X3dpZHRoICAJMjE2MDAKKwkJb3JpZ2luX3ggICAJMAorCQlvcmlnaW5feSAgIAkyNDgxCisJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0CisJCSAgICAob2JqZWN0IEludGVyT2JqVmlldyAiQm9vdHN0cmFwIiBAMTkzCisJCQlsb2NhdGlvbiAgIAkoMTkyLCAyMjQpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJVFJVRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAorCQkJICAgIFBhcmVudF9WaWV3IAlAMTkzCisJCQkgICAgbG9jYXRpb24gICAJKDE5MiwgMjI0KQorCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTIKKwkJCSAgICBtYXhfd2lkdGggIAkyODIKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJIkJvb3RzdHJhcCIpCisJCQlpY29uX3N0eWxlIAkiSWNvbiIKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQlxdWlkdSAgICAgIAkiM0RGRTAyNzcwMEY1IgorCQkJd2lkdGggICAgICAJMzAwCisJCQloZWlnaHQgICAgIAkyOTEyCisJCQlpY29uX2hlaWdodCAJMAorCQkJaWNvbl93aWR0aCAJMAorCQkJaWNvbl95X29mZnNldCAJMAorCQkJYW5ub3RhdGlvbiAJMQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEAxOTQKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTkyLCAzODQpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDE5MworCQkJICAgIGhlaWdodCAgICAgCTI2NjIKKwkJCSAgICB5X2Nvb3JkICAgIAkyNjAyCisJCQkgICAgTmVzdGVkICAgICAJRkFMU0UpKQorCQkgICAgKG9iamVjdCBJbnRlck9ialZpZXcgIkNhdGFsaW5hIiBAMTk1CisJCQlsb2NhdGlvbiAgIAkoNDgwLCAyMjQpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJVFJVRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAorCQkJICAgIFBhcmVudF9WaWV3IAlAMTk1CisJCQkgICAgbG9jYXRpb24gICAJKDQ4MCwgMjI0KQorCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTIKKwkJCSAgICBtYXhfd2lkdGggIAkyODIKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJIkNhdGFsaW5hIikKKwkJCWljb25fc3R5bGUgCSJJY29uIgorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCXF1aWR1ICAgICAgCSIzREZFMDI3RDAwNjciCisJCQl3aWR0aCAgICAgIAkzMDAKKwkJCWhlaWdodCAgICAgCTI5MTIKKwkJCWljb25faGVpZ2h0IAkwCisJCQlpY29uX3dpZHRoIAkwCisJCQlpY29uX3lfb2Zmc2V0IAkwCisJCQlhbm5vdGF0aW9uIAkxCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDE5NgorCQkJICAgIGxvY2F0aW9uICAgCSg0ODAsIDM4NCkKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlAMTk1CisJCQkgICAgaGVpZ2h0ICAgICAJMjYwMgorCQkJICAgIHlfY29vcmQgICAgCTI1NDIKKwkJCSAgICBOZXN0ZWQgICAgIAlGQUxTRSkpCisJCSAgICAob2JqZWN0IEludGVyT2JqVmlldyAiU3RhbmRhcmRTZXJ2ZXIiIEAxOTcKKwkJCWxvY2F0aW9uICAgCSg3ODQsIDIyNCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlUUlVFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCisJCQkgICAgUGFyZW50X1ZpZXcgCUAxOTcKKwkJCSAgICBsb2NhdGlvbiAgIAkoNzg0LCAyMjQpCisJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMgorCQkJICAgIG1heF93aWR0aCAgCTI4MgorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiU3RhbmRhcmRTZXJ2ZXIiKQorCQkJaWNvbl9zdHlsZSAJIkljb24iCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJcXVpZHUgICAgICAJIjNERkUwMkIzMDAxNSIKKwkJCXdpZHRoICAgICAgCTMwMAorCQkJaGVpZ2h0ICAgICAJMjkxMgorCQkJaWNvbl9oZWlnaHQgCTAKKwkJCWljb25fd2lkdGggCTAKKwkJCWljb25feV9vZmZzZXQgCTAKKwkJCWFubm90YXRpb24gCTEKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBAMTk4CisJCQkgICAgbG9jYXRpb24gICAJKDc4NCwgNDE2KQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUAxOTcKKwkJCSAgICBoZWlnaHQgICAgIAkyNTEwCisJCQkgICAgeV9jb29yZCAgICAJMjQ1MAorCQkJICAgIE5lc3RlZCAgICAgCUZBTFNFKQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEAxOTkKKwkJCSAgICBsb2NhdGlvbiAgIAkoNzg0LCA0ODApCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDE5NworCQkJICAgIGhlaWdodCAgICAgCTYwCisJCQkgICAgeV9jb29yZCAgICAJMAorCQkJICAgIE5lc3RlZCAgICAgCVRSVUUpCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDIwMAorCQkJICAgIGxvY2F0aW9uICAgCSg3ODQsIDU5MikKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlAMTk3CisJCQkgICAgaGVpZ2h0ICAgICAJNjAKKwkJCSAgICB5X2Nvb3JkICAgIAkwCisJCQkgICAgTmVzdGVkICAgICAJVFJVRSkpCisJCSAgICAob2JqZWN0IEludGVyT2JqVmlldyAiU3RhbmRhcmRTZXJ2aWNlIiBAMjAxCisJCQlsb2NhdGlvbiAgIAkoMTA4OCwgMjI0KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCVRSVUUKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKKwkJCSAgICBQYXJlbnRfVmlldyAJQDIwMQorCQkJICAgIGxvY2F0aW9uICAgCSgxMDg4LCAyMjQpCisJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMgorCQkJICAgIG1heF93aWR0aCAgCTI4MgorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiU3RhbmRhcmRTZXJ2aWNlIikKKwkJCWljb25fc3R5bGUgCSJJY29uIgorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCXF1aWR1ICAgICAgCSIzREZFMDMwNDAwRTMiCisJCQl3aWR0aCAgICAgIAkzMDAKKwkJCWhlaWdodCAgICAgCTI5MTIKKwkJCWljb25faGVpZ2h0IAkwCisJCQlpY29uX3dpZHRoIAkwCisJCQlpY29uX3lfb2Zmc2V0IAkwCisJCQlhbm5vdGF0aW9uIAkxCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDIwMgorCQkJICAgIGxvY2F0aW9uICAgCSgxMDg4LCA3MDQpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDIwMQorCQkJICAgIGhlaWdodCAgICAgCTIxNjIKKwkJCSAgICB5X2Nvb3JkICAgIAkyMTAyCisJCQkgICAgTmVzdGVkICAgICAJRkFMU0UpCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDIwMworCQkJICAgIGxvY2F0aW9uICAgCSgxMDg4LCA3NTIpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDIwMQorCQkJICAgIGhlaWdodCAgICAgCTYwCisJCQkgICAgeV9jb29yZCAgICAJMAorCQkJICAgIE5lc3RlZCAgICAgCVRSVUUpCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDIwNAorCQkJICAgIGxvY2F0aW9uICAgCSgxMDg4LCA4NjQpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDIwMQorCQkJICAgIGhlaWdodCAgICAgCTYwCisJCQkgICAgeV9jb29yZCAgICAJMAorCQkJICAgIE5lc3RlZCAgICAgCVRSVUUpKQorCQkgICAgKG9iamVjdCBJbnRlck9ialZpZXcgIlN0YW5kYXJkRW5naW5lIiBAMjA1CisJCQlsb2NhdGlvbiAgIAkoMTQyNCwgMjI0KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCVRSVUUKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKKwkJCSAgICBQYXJlbnRfVmlldyAJQDIwNQorCQkJICAgIGxvY2F0aW9uICAgCSgxNDI0LCAyMjQpCisJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMgorCQkJICAgIG1heF93aWR0aCAgCTMzMgorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiU3RhbmRhcmRFbmdpbmUiKQorCQkJaWNvbl9zdHlsZSAJIkljb24iCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJcXVpZHUgICAgICAJIjNERkUwMzQ3MDBDMiIKKwkJCXdpZHRoICAgICAgCTM1MAorCQkJaGVpZ2h0ICAgICAJMjkxMgorCQkJaWNvbl9oZWlnaHQgCTAKKwkJCWljb25fd2lkdGggCTAKKwkJCWljb25feV9vZmZzZXQgCTAKKwkJCWFubm90YXRpb24gCTEKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBAMjA2CisJCQkgICAgbG9jYXRpb24gICAJKDE0MjQsIDk3NikKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlAMjA1CisJCQkgICAgaGVpZ2h0ICAgICAJMTgzMAorCQkJICAgIHlfY29vcmQgICAgCTE3NzAKKwkJCSAgICBOZXN0ZWQgICAgIAlGQUxTRSkKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBAMjA3CisJCQkgICAgbG9jYXRpb24gICAJKDE0MjQsIDEwNTYpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDIwNQorCQkJICAgIGhlaWdodCAgICAgCTE3NDQKKwkJCSAgICB5X2Nvb3JkICAgIAkxNjg0CisJCQkgICAgTmVzdGVkICAgICAJVFJVRSkKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBAMjA4CisJCQkgICAgbG9jYXRpb24gICAJKDE0MjQsIDEwNTYpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDIwNQorCQkJICAgIGhlaWdodCAgICAgCTYwCisJCQkgICAgeV9jb29yZCAgICAJMAorCQkJICAgIE5lc3RlZCAgICAgCVRSVUUpCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDIwOQorCQkJICAgIGxvY2F0aW9uICAgCSgxNDI0LCAxMTY4KQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUAyMDUKKwkJCSAgICBoZWlnaHQgICAgIAk2MAorCQkJICAgIHlfY29vcmQgICAgCTAKKwkJCSAgICBOZXN0ZWQgICAgIAlUUlVFKQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEAyMTAKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTQyNCwgMTI5NikKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlAMjA1CisJCQkgICAgaGVpZ2h0ICAgICAJNjAKKwkJCSAgICB5X2Nvb3JkICAgIAkwCisJCQkgICAgTmVzdGVkICAgICAJVFJVRSkKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBAMjExCisJCQkgICAgbG9jYXRpb24gICAJKDE0MjQsIDE0MDgpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDIwNQorCQkJICAgIGhlaWdodCAgICAgCTYwCisJCQkgICAgeV9jb29yZCAgICAJMAorCQkJICAgIE5lc3RlZCAgICAgCVRSVUUpCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDIxMgorCQkJICAgIGxvY2F0aW9uICAgCSgxNDI0LCAxNTM2KQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUAyMDUKKwkJCSAgICBoZWlnaHQgICAgIAk2MAorCQkJICAgIHlfY29vcmQgICAgCTAKKwkJCSAgICBOZXN0ZWQgICAgIAlUUlVFKQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEAyMTMKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTQyNCwgMTY0OCkKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlAMjA1CisJCQkgICAgaGVpZ2h0ICAgICAJNjAKKwkJCSAgICB5X2Nvb3JkICAgIAkwCisJCQkgICAgTmVzdGVkICAgICAJVFJVRSkpCisJCSAgICAob2JqZWN0IEludGVyT2JqVmlldyAiU3RhbmRhcmRIb3N0IiBAMjE0CisJCQlsb2NhdGlvbiAgIAkoMTc2MCwgMjI0KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCVRSVUUKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKKwkJCSAgICBQYXJlbnRfVmlldyAJQDIxNAorCQkJICAgIGxvY2F0aW9uICAgCSgxNzYwLCAyMjQpCisJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMgorCQkJICAgIG1heF93aWR0aCAgCTI4MgorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiU3RhbmRhcmRIb3N0IikKKwkJCWljb25fc3R5bGUgCSJJY29uIgorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCXF1aWR1ICAgICAgCSIzREZFMDNGMjAzNUQiCisJCQl3aWR0aCAgICAgIAkzMDAKKwkJCWhlaWdodCAgICAgCTI5MTIKKwkJCWljb25faGVpZ2h0IAkwCisJCQlpY29uX3dpZHRoIAkwCisJCQlpY29uX3lfb2Zmc2V0IAkwCisJCQlhbm5vdGF0aW9uIAkxCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDIxNQorCQkJICAgIGxvY2F0aW9uICAgCSgxNzYwLCAxNzYwKQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUAyMTQKKwkJCSAgICBoZWlnaHQgICAgIAk5ODAKKwkJCSAgICB5X2Nvb3JkICAgIAk5MjAKKwkJCSAgICBOZXN0ZWQgICAgIAlGQUxTRSkKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBAMjE2CisJCQkgICAgbG9jYXRpb24gICAJKDE3NjAsIDE4MDgpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDIxNAorCQkJICAgIGhlaWdodCAgICAgCTYwCisJCQkgICAgeV9jb29yZCAgICAJMAorCQkJICAgIE5lc3RlZCAgICAgCVRSVUUpCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDIxNworCQkJICAgIGxvY2F0aW9uICAgCSgxNzYwLCAxOTIwKQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUAyMTQKKwkJCSAgICBoZWlnaHQgICAgIAk2MAorCQkJICAgIHlfY29vcmQgICAgCTAKKwkJCSAgICBOZXN0ZWQgICAgIAlUUlVFKQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEAyMTgKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTc2MCwgMjAzMikKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlAMjE0CisJCQkgICAgaGVpZ2h0ICAgICAJNjAKKwkJCSAgICB5X2Nvb3JkICAgIAkwCisJCQkgICAgTmVzdGVkICAgICAJVFJVRSkKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBAMjE5CisJCQkgICAgbG9jYXRpb24gICAJKDE3NjAsIDIxNDQpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDIxNAorCQkJICAgIGhlaWdodCAgICAgCTYwCisJCQkgICAgeV9jb29yZCAgICAJMAorCQkJICAgIE5lc3RlZCAgICAgCVRSVUUpCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDIyMAorCQkJICAgIGxvY2F0aW9uICAgCSgxNzYwLCAyMjU2KQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUAyMTQKKwkJCSAgICBoZWlnaHQgICAgIAk2MAorCQkJICAgIHlfY29vcmQgICAgCTAKKwkJCSAgICBOZXN0ZWQgICAgIAlUUlVFKSkKKwkJICAgIChvYmplY3QgSW50ZXJPYmpWaWV3ICJTdGFuZGFyZFBpcGVsaW5lIiBAMjIxCisJCQlsb2NhdGlvbiAgIAkoMjA4MCwgMjI0KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCVRSVUUKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKKwkJCSAgICBQYXJlbnRfVmlldyAJQDIyMQorCQkJICAgIGxvY2F0aW9uICAgCSgyMDgwLCAyMjQpCisJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMgorCQkJICAgIG1heF93aWR0aCAgCTMyNgorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiU3RhbmRhcmRQaXBlbGluZSIpCisJCQlpY29uX3N0eWxlIAkiSWNvbiIKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQlxdWlkdSAgICAgIAkiM0RGRTA0N0QwMDZEIgorCQkJd2lkdGggICAgICAJMzQ0CisJCQloZWlnaHQgICAgIAkyOTEyCisJCQlpY29uX2hlaWdodCAJMAorCQkJaWNvbl93aWR0aCAJMAorCQkJaWNvbl95X29mZnNldCAJMAorCQkJYW5ub3RhdGlvbiAJMQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEAyMjIKKwkJCSAgICBsb2NhdGlvbiAgIAkoMjA4MCwgMjM2OCkKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlAMjIxCisJCQkgICAgaGVpZ2h0ICAgICAJMzEyCisJCQkgICAgeV9jb29yZCAgICAJMjUyCisJCQkgICAgTmVzdGVkICAgICAJRkFMU0UpCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDIyMworCQkJICAgIGxvY2F0aW9uICAgCSgyMDgwLCAyNDE2KQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUAyMjEKKwkJCSAgICBoZWlnaHQgICAgIAk2MAorCQkJICAgIHlfY29vcmQgICAgCTAKKwkJCSAgICBOZXN0ZWQgICAgIAlUUlVFKQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEAyMjQKKwkJCSAgICBsb2NhdGlvbiAgIAkoMjA4MCwgMjQ4MCkKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlAMjIxCisJCQkgICAgaGVpZ2h0ICAgICAJNjAKKwkJCSAgICB5X2Nvb3JkICAgIAkwCisJCQkgICAgTmVzdGVkICAgICAJVFJVRSkKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBAMjI1CisJCQkgICAgbG9jYXRpb24gICAJKDIwODAsIDI1NjApCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDIyMQorCQkJICAgIGhlaWdodCAgICAgCTYwCisJCQkgICAgeV9jb29yZCAgICAJMAorCQkJICAgIE5lc3RlZCAgICAgCVRSVUUpKQorCQkgICAgKG9iamVjdCBJbnRlck1lc3NWaWV3ICIiIEAyMjYKKwkJCWxvY2F0aW9uICAgCSgxNiwgMzg0KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIyNworCQkJICAgIFBhcmVudF9WaWV3IAlAMjI2CisJCQkgICAgbG9jYXRpb24gICAJKDMzNSwgMzQwKQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkUwMjgzMDM3NCIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTExMAorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkic3RhcnQoKSIKKwkJCSAgICBwY3REaXN0ICAgIAkwLjUwMDAwMAorCQkJICAgIGhlaWdodCAgICAgCTQ1CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlAMTkzCisJCQlzdXBwbGllciAgIAlAMTk1CisJCQlGb2N1c19TcmMgIAlAMTk0CisJCQlGb2N1c19FbnRyeSAJQDE5NgorCQkJb3JpZ2luICAgICAJKDIwNywgMzg0KQorCQkJdGVybWludXMgICAJKDQ2NCwgMzg0KQorCQkJb3JkaW5hbCAgICAJMCkKKwkJICAgIChvYmplY3QgSW50ZXJNZXNzVmlldyAiIiBAMjI4CisJCQlsb2NhdGlvbiAgIAkoMTYsIDQxNikKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMjkKKwkJCSAgICBQYXJlbnRfVmlldyAJQDIyOAorCQkJICAgIGxvY2F0aW9uICAgCSg2MzEsIDM3MikKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZFMDJCQTAxODgiCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAkxMTAKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJInN0YXJ0KCkiCisJCQkgICAgcGN0RGlzdCAgICAJMC41MDAwMDAKKwkJCSAgICBoZWlnaHQgICAgIAk0NQorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDE5NQorCQkJc3VwcGxpZXIgICAJQDE5NworCQkJRm9jdXNfU3JjICAJQDE5NgorCQkJRm9jdXNfRW50cnkgCUAxOTgKKwkJCW9yaWdpbiAgICAgCSg0OTUsIDQxNikKKwkJCXRlcm1pbnVzICAgCSg3NjgsIDQxNikKKwkJCW9yZGluYWwgICAgCTEpCisJCSAgICAob2JqZWN0IFNlbGZNZXNzVmlldyAiIiBAMjMwCisJCQlsb2NhdGlvbiAgIAkoMTYsIDQ4MCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMzEKKwkJCSAgICBQYXJlbnRfVmlldyAJQDIzMAorCQkJICAgIGxvY2F0aW9uICAgCSgxMjQ0LCA0MzcpCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTAyRDMwMDZDIgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJODU0CisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJmaXJlTGlmZWN5Y2xlRXZlbnQoQkVGT1JFX1NUQVJUX0VWRU5UKSIKKwkJCSAgICBwY3REaXN0ICAgIAkyLjk2MDAwMAorCQkJICAgIGhlaWdodCAgICAgCTQ0CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlAMTk3CisJCQlzdXBwbGllciAgIAlAMTk3CisJCQlGb2N1c19TcmMgIAlAMTk4CisJCQlGb2N1c19FbnRyeSAJQDE5OQorCQkJb3JpZ2luICAgICAJKDgwMCwgNDgwKQorCQkJdGVybWludXMgICAJKDk1MCwgNDgwKQorCQkJb3JkaW5hbCAgICAJMikKKwkJICAgIChvYmplY3QgU2VsZk1lc3NWaWV3ICIiIEAyMzIKKwkJCWxvY2F0aW9uICAgCSgxNiwgNTkyKQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIzMworCQkJICAgIFBhcmVudF9WaWV3IAlAMjMyCisJCQkgICAgbG9jYXRpb24gICAJKDExNDYsIDU0OSkKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZFMDJERjAyREYiCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAk2NTgKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJImZpcmVMaWZlY3ljbGVFdmVudChTVEFSVF9FVkVOVCkiCisJCQkgICAgcGN0RGlzdCAgICAJMi4zMTMzMzMKKwkJCSAgICBoZWlnaHQgICAgIAk0NAorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDE5NworCQkJc3VwcGxpZXIgICAJQDE5NworCQkJRm9jdXNfU3JjICAJQDE5OAorCQkJRm9jdXNfRW50cnkgCUAyMDAKKwkJCW9yaWdpbiAgICAgCSg4MDAsIDU5MikKKwkJCXRlcm1pbnVzICAgCSg5NTAsIDU5MikKKwkJCW9yZGluYWwgICAgCTMpCisJCSAgICAob2JqZWN0IEludGVyTWVzc1ZpZXcgIiIgQDIzNAorCQkJbG9jYXRpb24gICAJKDE2LCA3MDQpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjM1CisJCQkgICAgUGFyZW50X1ZpZXcgCUAyMzQKKwkJCSAgICBsb2NhdGlvbiAgIAkoOTM1LCA2NjApCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTAzMEMwMkIzIgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJMTEwCisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJzdGFydCgpIgorCQkJICAgIHBjdERpc3QgICAgCTAuNTAwMDAwCisJCQkgICAgaGVpZ2h0ICAgICAJNDUKKwkJCSAgICBvcmllbnRhdGlvbiAJMCkKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUAxOTcKKwkJCXN1cHBsaWVyICAgCUAyMDEKKwkJCUZvY3VzX1NyYyAgCUAxOTgKKwkJCUZvY3VzX0VudHJ5IAlAMjAyCisJCQlvcmlnaW4gICAgIAkoNzk5LCA3MDQpCisJCQl0ZXJtaW51cyAgIAkoMTA3MiwgNzA0KQorCQkJb3JkaW5hbCAgICAJNCkKKwkJICAgIChvYmplY3QgU2VsZk1lc3NWaWV3ICIiIEAyMzYKKwkJCWxvY2F0aW9uICAgCSgxNiwgNzUyKQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIzNworCQkJICAgIFBhcmVudF9WaWV3IAlAMjM2CisJCQkgICAgbG9jYXRpb24gICAJKDE1MzEsIDcwOCkKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZFMDMxRDAwMjIiCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAk4NTQKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJImZpcmVMaWZlY3ljbGVFdmVudChCRUZPUkVfU1RBUlRfRVZFTlQpIgorCQkJICAgIHBjdERpc3QgICAgCTIuODUzMzMzCisJCQkgICAgaGVpZ2h0ICAgICAJNDUKKwkJCSAgICBvcmllbnRhdGlvbiAJMCkKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUAyMDEKKwkJCXN1cHBsaWVyICAgCUAyMDEKKwkJCUZvY3VzX1NyYyAgCUAyMDIKKwkJCUZvY3VzX0VudHJ5IAlAMjAzCisJCQlvcmlnaW4gICAgIAkoMTEwNCwgNzUyKQorCQkJdGVybWludXMgICAJKDEyNTQsIDc1MikKKwkJCW9yZGluYWwgICAgCTUpCisJCSAgICAob2JqZWN0IFNlbGZNZXNzVmlldyAiIiBAMjM4CisJCQlsb2NhdGlvbiAgIAkoMTYsIDg2NCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMzkKKwkJCSAgICBQYXJlbnRfVmlldyAJQDIzOAorCQkJICAgIGxvY2F0aW9uICAgCSgxNDQ5LCA4MjEpCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTAzMzAwMTlCIgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJNjU4CisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJmaXJlTGlmZWN5Y2xlRXZlbnQoU1RBUlRfRVZFTlQpIgorCQkJICAgIHBjdERpc3QgICAgCTIuMzA2NjY3CisJCQkgICAgaGVpZ2h0ICAgICAJNDQKKwkJCSAgICBvcmllbnRhdGlvbiAJMCkKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUAyMDEKKwkJCXN1cHBsaWVyICAgCUAyMDEKKwkJCUZvY3VzX1NyYyAgCUAyMDIKKwkJCUZvY3VzX0VudHJ5IAlAMjA0CisJCQlvcmlnaW4gICAgIAkoMTEwNCwgODY0KQorCQkJdGVybWludXMgICAJKDEyNTQsIDg2NCkKKwkJCW9yZGluYWwgICAgCTYpCisJCSAgICAob2JqZWN0IEludGVyTWVzc1ZpZXcgIiIgQDI0MAorCQkJbG9jYXRpb24gICAJKDE2LCA5NzYpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjQxCisJCQkgICAgUGFyZW50X1ZpZXcgCUAyNDAKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTI1NSwgOTMyKQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkUwMzcwMDE4QSIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTExMAorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkic3RhcnQoKSIKKwkJCSAgICBwY3REaXN0ICAgIAkwLjUwMDAwMAorCQkJICAgIGhlaWdodCAgICAgCTQ1CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlAMjAxCisJCQlzdXBwbGllciAgIAlAMjA1CisJCQlGb2N1c19TcmMgIAlAMjAyCisJCQlGb2N1c19FbnRyeSAJQDIwNgorCQkJb3JpZ2luICAgICAJKDExMDMsIDk3NikKKwkJCXRlcm1pbnVzICAgCSgxNDA4LCA5NzYpCisJCQlvcmRpbmFsICAgIAk3KQorCQkgICAgKG9iamVjdCBTZWxmTWVzc1ZpZXcgIiIgQDI0MgorCQkJbG9jYXRpb24gICAJKDE2LCAxMDU2KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI0MworCQkJICAgIFBhcmVudF9WaWV3IAlAMjQyCisJCQkgICAgbG9jYXRpb24gICAJKDE4NjUsIDEwMTQpCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTAzNzUwMDUxIgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJODU0CisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJmaXJlTGlmZWN5Y2xlRXZlbnQoQkVGT1JFX1NUQVJUX0VWRU5UKSIKKwkJCSAgICBwY3REaXN0ICAgIAkyLjg0MDAwMAorCQkJICAgIGhlaWdodCAgICAgCTQzCisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlAMjA1CisJCQlzdXBwbGllciAgIAlAMjA1CisJCQlGb2N1c19TcmMgIAlAMjA3CisJCQlGb2N1c19FbnRyeSAJQDIwOAorCQkJb3JpZ2luICAgICAJKDE0NDAsIDEwNTYpCisJCQl0ZXJtaW51cyAgIAkoMTU5MCwgMTA1NikKKwkJCW9yZGluYWwgICAgCTgpCisJCSAgICAob2JqZWN0IFNlbGZNZXNzVmlldyAiIiBAMjQ0CisJCQlsb2NhdGlvbiAgIAkoMTYsIDExNjgpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjQ1CisJCQkgICAgUGFyZW50X1ZpZXcgCUAyNDQKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTYzOSwgMTE0MSkKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZFMDM4OTAwMUMiCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAkzNzMKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJImFkZERlZmF1bHRNYXBwZXIoKSIKKwkJCSAgICBwY3REaXN0ICAgIAkxLjMyNjY2NworCQkJICAgIGhlaWdodCAgICAgCTI4CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlAMjA1CisJCQlzdXBwbGllciAgIAlAMjA1CisJCQlGb2N1c19TcmMgIAlAMjA3CisJCQlGb2N1c19FbnRyeSAJQDIwOQorCQkJb3JpZ2luICAgICAJKDE0NDAsIDExNjgpCisJCQl0ZXJtaW51cyAgIAkoMTU5MCwgMTE2OCkKKwkJCW9yZGluYWwgICAgCTkpCisJCSAgICAob2JqZWN0IFNlbGZNZXNzVmlldyAiIiBAMjQ2CisJCQlsb2NhdGlvbiAgIAkoMTYsIDEyOTYpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjQ3CisJCQkgICAgUGFyZW50X1ZpZXcgCUAyNDYKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTU5MiwgMTI2OCkKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZFMDM5ODAyODEiCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAkyMzgKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJImxvZ2dlci5zdGFydCgpIgorCQkJICAgIHBjdERpc3QgICAgCTEuMDIwMDAwCisJCQkgICAgaGVpZ2h0ICAgICAJMjkKKwkJCSAgICBvcmllbnRhdGlvbiAJMCkKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUAyMDUKKwkJCXN1cHBsaWVyICAgCUAyMDUKKwkJCUZvY3VzX1NyYyAgCUAyMDcKKwkJCUZvY3VzX0VudHJ5IAlAMjEwCisJCQlvcmlnaW4gICAgIAkoMTQ0MCwgMTI5NikKKwkJCXRlcm1pbnVzICAgCSgxNTkwLCAxMjk2KQorCQkJb3JkaW5hbCAgICAJMTApCisJCSAgICAob2JqZWN0IFNlbGZNZXNzVmlldyAiIiBAMjQ4CisJCQlsb2NhdGlvbiAgIAkoMTYsIDE0MDgpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjQ5CisJCQkgICAgUGFyZW50X1ZpZXcgCUAyNDgKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTU5MywgMTM4MCkKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZFMDNBODAxMDciCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAkyMjYKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJInJlYWxtLnN0YXJ0KCkiCisJCQkgICAgcGN0RGlzdCAgICAJMS4wMjY2NjcKKwkJCSAgICBoZWlnaHQgICAgIAkyOQorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDIwNQorCQkJc3VwcGxpZXIgICAJQDIwNQorCQkJRm9jdXNfU3JjICAJQDIwNworCQkJRm9jdXNfRW50cnkgCUAyMTEKKwkJCW9yaWdpbiAgICAgCSgxNDQwLCAxNDA4KQorCQkJdGVybWludXMgICAJKDE1OTAsIDE0MDgpCisJCQlvcmRpbmFsICAgIAkxMSkKKwkJICAgIChvYmplY3QgU2VsZk1lc3NWaWV3ICIiIEAyNTAKKwkJCWxvY2F0aW9uICAgCSgxNiwgMTUzNikKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNTEKKwkJCSAgICBQYXJlbnRfVmlldyAJQDI1MAorCQkJICAgIGxvY2F0aW9uICAgCSgxNjA4LCAxNTA4KQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkUwM0JEMDAwRCIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTI1OQorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiZmluZE1hcHBlcnMoKSIKKwkJCSAgICBwY3REaXN0ICAgIAkxLjEyMDAwMAorCQkJICAgIGhlaWdodCAgICAgCTI5CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlAMjA1CisJCQlzdXBwbGllciAgIAlAMjA1CisJCQlGb2N1c19TcmMgIAlAMjA3CisJCQlGb2N1c19FbnRyeSAJQDIxMgorCQkJb3JpZ2luICAgICAJKDE0NDAsIDE1MzYpCisJCQl0ZXJtaW51cyAgIAkoMTU5MCwgMTUzNikKKwkJCW9yZGluYWwgICAgCTEyKQorCQkgICAgKG9iamVjdCBTZWxmTWVzc1ZpZXcgIiIgQDI1MgorCQkJbG9jYXRpb24gICAJKDE2LCAxNjQ4KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI1MworCQkJICAgIFBhcmVudF9WaWV3IAlAMjUyCisJCQkgICAgbG9jYXRpb24gICAJKDE1MTUsIDE2MDQpCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTAzRTAwMEE0IgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJMjUxCisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJmaW5kQ2hpbGRyZW4oKSIKKwkJCSAgICBwY3REaXN0ICAgIAkwLjUwMDAwMAorCQkJICAgIGhlaWdodCAgICAgCTQ1CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlAMjA1CisJCQlzdXBwbGllciAgIAlAMjA1CisJCQlGb2N1c19TcmMgIAlAMjA3CisJCQlGb2N1c19FbnRyeSAJQDIxMworCQkJb3JpZ2luICAgICAJKDE0NDAsIDE2NDgpCisJCQl0ZXJtaW51cyAgIAkoMTU5MCwgMTY0OCkKKwkJCW9yZGluYWwgICAgCTEzKQorCQkgICAgKG9iamVjdCBJbnRlck1lc3NWaWV3ICIiIEAyNTQKKwkJCWxvY2F0aW9uICAgCSgxNjY0LCAxNzYwKQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI1NQorCQkJICAgIFBhcmVudF9WaWV3IAlAMjU0CisJCQkgICAgbG9jYXRpb24gICAJKDE1OTEsIDE3MTYpCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTAzRkIwMjdBIgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJMTEwCisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJzdGFydCgpIgorCQkJICAgIHBjdERpc3QgICAgCTAuNTAwMDAwCisJCQkgICAgaGVpZ2h0ICAgICAJNDUKKwkJCSAgICBvcmllbnRhdGlvbiAJMCkKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUAyMDUKKwkJCXN1cHBsaWVyICAgCUAyMTQKKwkJCUZvY3VzX1NyYyAgCUAyMDcKKwkJCUZvY3VzX0VudHJ5IAlAMjE1CisJCQlvcmlnaW4gICAgIAkoMTQzOSwgMTc2MCkKKwkJCXRlcm1pbnVzICAgCSgxNzQ0LCAxNzYwKQorCQkJb3JkaW5hbCAgICAJMTQpCisJCSAgICAob2JqZWN0IFNlbGZNZXNzVmlldyAiIiBAMjU2CisJCQlsb2NhdGlvbiAgIAkoMTYsIDE4MDgpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjU3CisJCQkgICAgUGFyZW50X1ZpZXcgCUAyNTYKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTYwNiwgMTc4NCkKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZFMDQzQjAyQUUiCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAk4NTQKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJImZpcmVMaWZlY3ljbGVFdmVudChCRUZPUkVfU1RBUlRfRVZFTlQpIgorCQkJICAgIHBjdERpc3QgICAgCS0xLjEzMzMzMworCQkJICAgIGhlaWdodCAgICAgCTI0CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlAMjE0CisJCQlzdXBwbGllciAgIAlAMjE0CisJCQlGb2N1c19TcmMgIAlAMjE1CisJCQlGb2N1c19FbnRyeSAJQDIxNgorCQkJb3JpZ2luICAgICAJKDE3NzYsIDE4MDgpCisJCQl0ZXJtaW51cyAgIAkoMTkyNiwgMTgwOCkKKwkJCW9yZGluYWwgICAgCTE1KQorCQkgICAgKG9iamVjdCBTZWxmTWVzc1ZpZXcgIiIgQDI1OAorCQkJbG9jYXRpb24gICAJKDE2LCAxOTIwKQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI1OQorCQkJICAgIFBhcmVudF9WaWV3IAlAMjU4CisJCQkgICAgbG9jYXRpb24gICAJKDE5NjMsIDE4NzcpCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTA0NUMwMjFGIgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJMzczCisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJhZGREZWZhdWx0TWFwcGVyKCkiCisJCQkgICAgcGN0RGlzdCAgICAJMS4yNTMzMzMKKwkJCSAgICBoZWlnaHQgICAgIAk0NAorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDIxNAorCQkJc3VwcGxpZXIgICAJQDIxNAorCQkJRm9jdXNfU3JjICAJQDIxNQorCQkJRm9jdXNfRW50cnkgCUAyMTcKKwkJCW9yaWdpbiAgICAgCSgxNzc2LCAxOTIwKQorCQkJdGVybWludXMgICAJKDE5MjYsIDE5MjApCisJCQlvcmRpbmFsICAgIAkxNikKKwkJICAgIChvYmplY3QgSW50ZXJNZXNzVmlldyAiIiBAMjYwCisJCQlsb2NhdGlvbiAgIAkoMjAwMCwgMjM2OCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNjEKKwkJCSAgICBQYXJlbnRfVmlldyAJQDI2MAorCQkJICAgIGxvY2F0aW9uICAgCSgxOTE5LCAyMzI0KQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkUwNDhFMDBCOSIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTExMAorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkic3RhcnQoKSIKKwkJCSAgICBwY3REaXN0ICAgIAkwLjUwMDAwMAorCQkJICAgIGhlaWdodCAgICAgCTQ1CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlAMjE0CisJCQlzdXBwbGllciAgIAlAMjIxCisJCQlGb2N1c19TcmMgIAlAMjE1CisJCQlGb2N1c19FbnRyeSAJQDIyMgorCQkJb3JpZ2luICAgICAJKDE3NzUsIDIzNjgpCisJCQl0ZXJtaW51cyAgIAkoMjA2NCwgMjM2OCkKKwkJCW9yZGluYWwgICAgCTIwKQorCQkgICAgKG9iamVjdCBTZWxmTWVzc1ZpZXcgIiIgQDI2MgorCQkJbG9jYXRpb24gICAJKDE2LCAyMDMyKQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI2MworCQkJICAgIFBhcmVudF9WaWV3IAlAMjYyCisJCQkgICAgbG9jYXRpb24gICAJKDE5MTYsIDIwMDQpCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTA0OUIwMDBDIgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJMjM4CisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJsb2dnZXIuc3RhcnQoKSIKKwkJCSAgICBwY3REaXN0ICAgIAkwLjkzMzMzMworCQkJICAgIGhlaWdodCAgICAgCTI5CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlAMjE0CisJCQlzdXBwbGllciAgIAlAMjE0CisJCQlGb2N1c19TcmMgIAlAMjE1CisJCQlGb2N1c19FbnRyeSAJQDIxOAorCQkJb3JpZ2luICAgICAJKDE3NzYsIDIwMzIpCisJCQl0ZXJtaW51cyAgIAkoMTkyNiwgMjAzMikKKwkJCW9yZGluYWwgICAgCTE3KQorCQkgICAgKG9iamVjdCBTZWxmTWVzc1ZpZXcgIiIgQDI2NAorCQkJbG9jYXRpb24gICAJKDE2LCAyMTQ0KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI2NQorCQkJICAgIFBhcmVudF9WaWV3IAlAMjY0CisJCQkgICAgbG9jYXRpb24gICAJKDE5MTYsIDIxMTcpCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTA0QTMwM0JCIgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJMjM4CisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJmaW5kTWFwcGVyKCkiCisJCQkgICAgcGN0RGlzdCAgICAJMC45MzMzMzMKKwkJCSAgICBoZWlnaHQgICAgIAkyOAorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDIxNAorCQkJc3VwcGxpZXIgICAJQDIxNAorCQkJRm9jdXNfU3JjICAJQDIxNQorCQkJRm9jdXNfRW50cnkgCUAyMTkKKwkJCW9yaWdpbiAgICAgCSgxNzc2LCAyMTQ0KQorCQkJdGVybWludXMgICAJKDE5MjYsIDIxNDQpCisJCQlvcmRpbmFsICAgIAkxOCkKKwkJICAgIChvYmplY3QgU2VsZk1lc3NWaWV3ICIiIEAyNjYKKwkJCWxvY2F0aW9uICAgCSgxNiwgMjI1NikKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNjcKKwkJCSAgICBQYXJlbnRfVmlldyAJQDI2NgorCQkJICAgIGxvY2F0aW9uICAgCSgxOTE2LCAyMjI4KQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkUwNEE5MDM0MiIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTI1MQorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiZmluZENoaWxkcmVuKCkiCisJCQkgICAgcGN0RGlzdCAgICAJMC45MzMzMzMKKwkJCSAgICBoZWlnaHQgICAgIAkyOQorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDIxNAorCQkJc3VwcGxpZXIgICAJQDIxNAorCQkJRm9jdXNfU3JjICAJQDIxNQorCQkJRm9jdXNfRW50cnkgCUAyMjAKKwkJCW9yaWdpbiAgICAgCSgxNzc2LCAyMjU2KQorCQkJdGVybWludXMgICAJKDE5MjYsIDIyNTYpCisJCQlvcmRpbmFsICAgIAkxOSkKKwkJICAgIChvYmplY3QgTm90ZVZpZXcgQDI2OAorCQkJbG9jYXRpb24gICAJKDIxMjgsIDE0ODgpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKKwkJCSAgICBQYXJlbnRfVmlldyAJQDI2OAorCQkJICAgIGxvY2F0aW9uICAgCSgxOTE1LCAxNDIyKQorCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkgICAgbmxpbmVzICAgICAJMgorCQkJICAgIG1heF93aWR0aCAgCTM5MAorCQkJICAgIGxhYmVsICAgICAgCSIjMSBDYXRhbGluYS5zdGFydCgpIikKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQl3aWR0aCAgICAgIAk0NTAKKwkJCWhlaWdodCAgICAgCTE0NCkKKwkJICAgIChvYmplY3QgU2VsZk1lc3NWaWV3ICIiIEAyNjkKKwkJCWxvY2F0aW9uICAgCSgxNiwgMjQxNikKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNzAKKwkJCSAgICBQYXJlbnRfVmlldyAJQDI2OQorCQkJICAgIGxvY2F0aW9uICAgCSgxNjQ0LCAyNDk4KQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkUwNTc4MDEzOCIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTg1NAorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiZmlyZUxpZmVjeWNsZUV2ZW50KEJFRk9SRV9TVEFSVF9FVkVOVCkiCisJCQkgICAgcGN0RGlzdCAgICAJLTMuMDIwMDAwCisJCQkgICAgaGVpZ2h0ICAgICAJNDUKKwkJCSAgICBvcmllbnRhdGlvbiAJMCkKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUAyMjEKKwkJCXN1cHBsaWVyICAgCUAyMjEKKwkJCUZvY3VzX1NyYyAgCUAyMjIKKwkJCUZvY3VzX0VudHJ5IAlAMjIzCisJCQlvcmlnaW4gICAgIAkoMjA5NiwgMjQxNikKKwkJCXRlcm1pbnVzICAgCSgyMjQ2LCAyNDE2KQorCQkJb3JkaW5hbCAgICAJMjEpCisJCSAgICAob2JqZWN0IFNlbGZNZXNzVmlldyAiIiBAMjcxCisJCQlsb2NhdGlvbiAgIAkoMTYsIDI0ODApCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjcyCisJCQkgICAgUGFyZW50X1ZpZXcgCUAyNzEKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTcwNSwgMjU4MikKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZFMDVBODAzOTgiCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAk2NTgKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJImZpcmVMaWZlY3ljbGVFdmVudChTVEFSVF9FVkVOVCkiCisJCQkgICAgcGN0RGlzdCAgICAJLTIuNjEzMzMzCisJCQkgICAgaGVpZ2h0ICAgICAJNDUKKwkJCSAgICBvcmllbnRhdGlvbiAJMCkKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUAyMjEKKwkJCXN1cHBsaWVyICAgCUAyMjEKKwkJCUZvY3VzX1NyYyAgCUAyMjIKKwkJCUZvY3VzX0VudHJ5IAlAMjI0CisJCQlvcmlnaW4gICAgIAkoMjA5NiwgMjQ4MCkKKwkJCXRlcm1pbnVzICAgCSgyMjQ2LCAyNDgwKQorCQkJb3JkaW5hbCAgICAJMjIpCisJCSAgICAob2JqZWN0IFNlbGZNZXNzVmlldyAiIiBAMjczCisJCQlsb2NhdGlvbiAgIAkoMTYsIDI1NjApCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjc0CisJCQkgICAgUGFyZW50X1ZpZXcgCUAyNzMKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTczNywgMjQyMykKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZFMDVCQTAxOTYiCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAk2NTgKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJImZpcmVMaWZlY3ljbGVFdmVudChBRlRFUl9FVkVOVCkiCisJCQkgICAgcGN0RGlzdCAgICAJLTIuMzkzMzMzCisJCQkgICAgaGVpZ2h0ICAgICAJMTM4CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlAMjIxCisJCQlzdXBwbGllciAgIAlAMjIxCisJCQlGb2N1c19TcmMgIAlAMjIyCisJCQlGb2N1c19FbnRyeSAJQDIyNQorCQkJb3JpZ2luICAgICAJKDIwOTYsIDI1NjApCisJCQl0ZXJtaW51cyAgIAkoMjI0NiwgMjU2MCkKKwkJCW9yZGluYWwgICAgCTIzKQorCQkgICAgKG9iamVjdCBOb3RlVmlldyBAMjc1CisJCQlsb2NhdGlvbiAgIAkoOTYwLCAxNjgwKQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCisJCQkgICAgUGFyZW50X1ZpZXcgCUAyNzUKKwkJCSAgICBsb2NhdGlvbiAgIAkoNjM1LCAxNTcxKQorCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkgICAgbmxpbmVzICAgICAJNAorCQkJICAgIG1heF93aWR0aCAgCTYxNQorCQkJICAgIGxhYmVsICAgICAgCSJBbGwgU3RhbmRhcmRYIHdpbGwgZmlyZSB0aGVzZSBldmVudHMuIikKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQl3aWR0aCAgICAgIAk2NzUKKwkJCWhlaWdodCAgICAgCTIzMSkKKwkJICAgIChvYmplY3QgQXR0YWNoVmlldyAiIiBAMjc2CisJCQlzdGVyZW90eXBlIAlUUlVFCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlAMjc1CisJCQlzdXBwbGllciAgIAlAMjcyCisJCQlsaW5lX3N0eWxlIAkwKQorCQkgICAgKG9iamVjdCBBdHRhY2hWaWV3ICIiIEAyNzcKKwkJCXN0ZXJlb3R5cGUgCVRSVUUKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUAyNzUKKwkJCXN1cHBsaWVyICAgCUAyNzAKKwkJCWxpbmVfc3R5bGUgCTApCisJCSAgICAob2JqZWN0IEF0dGFjaFZpZXcgIiIgQDI3OAorCQkJc3RlcmVvdHlwZSAJVFJVRQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDI3NQorCQkJc3VwcGxpZXIgICAJQDI3NAorCQkJbGluZV9zdHlsZSAJMCkpKQorCSAgICAob2JqZWN0IEludGVyYWN0aW9uRGlhZ3JhbSAiNC4gY2F0YWxpbmFfc3RhcnRfMiIKKwkJbWVjaGFuaXNtX3JlZiAJQDg1CisJCXF1aWQgICAgICAgCSIzREZFMDUwOTAwQkYiCisJCXRpdGxlICAgICAgCSI0LiBjYXRhbGluYV9zdGFydF8yIgorCQl6b29tICAgICAgIAkxMDAKKwkJbWF4X2hlaWdodCAJMjgzNTAKKwkJbWF4X3dpZHRoICAJMjE2MDAKKwkJb3JpZ2luX3ggICAJMAorCQlvcmlnaW5feSAgIAkxMDg3CisJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0CisJCSAgICAob2JqZWN0IEludGVyT2JqVmlldyAiU3RhbmRhcmRIb3N0IiBAMjc5CisJCQlsb2NhdGlvbiAgIAkoMjA4LCAyMjQpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJVFJVRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAorCQkJICAgIFBhcmVudF9WaWV3IAlAMjc5CisJCQkgICAgbG9jYXRpb24gICAJKDIwOCwgMjI0KQorCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTIKKwkJCSAgICBtYXhfd2lkdGggIAkyODIKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJIlN0YW5kYXJkSG9zdCIpCisJCQlpY29uX3N0eWxlIAkiSWNvbiIKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQlxdWlkdSAgICAgIAkiM0RGRTA1MzgwMTdCIgorCQkJd2lkdGggICAgICAJMzAwCisJCQloZWlnaHQgICAgIAkyMTE0CisJCQlpY29uX2hlaWdodCAJMAorCQkJaWNvbl93aWR0aCAJMAorCQkJaWNvbl95X29mZnNldCAJMAorCQkJYW5ub3RhdGlvbiAJMQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEAyODAKKwkJCSAgICBsb2NhdGlvbiAgIAkoMjA4LCAzODQpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDI3OQorCQkJICAgIGhlaWdodCAgICAgCTE4NjQKKwkJCSAgICB5X2Nvb3JkICAgIAkxODA0CisJCQkgICAgTmVzdGVkICAgICAJRkFMU0UpCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDI4MQorCQkJICAgIGxvY2F0aW9uICAgCSgyMDgsIDM4NCkKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlAMjc5CisJCQkgICAgaGVpZ2h0ICAgICAJNjAKKwkJCSAgICB5X2Nvb3JkICAgIAkwCisJCQkgICAgTmVzdGVkICAgICAJVFJVRSkKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBAMjgyCisJCQkgICAgbG9jYXRpb24gICAJKDIwOCwgMTA4OCkKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlAMjc5CisJCQkgICAgaGVpZ2h0ICAgICAJNjAKKwkJCSAgICB5X2Nvb3JkICAgIAkwCisJCQkgICAgTmVzdGVkICAgICAJVFJVRSkKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBAMjgzCisJCQkgICAgbG9jYXRpb24gICAJKDIwOCwgMTYxNikKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlAMjc5CisJCQkgICAgaGVpZ2h0ICAgICAJNjAKKwkJCSAgICB5X2Nvb3JkICAgIAkwCisJCQkgICAgTmVzdGVkICAgICAJVFJVRSkpCisJCSAgICAob2JqZWN0IEludGVyT2JqVmlldyAiSG9zdENvbmZpZyIgQDI4NAorCQkJbG9jYXRpb24gICAJKDU0NCwgMjI0KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCVRSVUUKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKKwkJCSAgICBQYXJlbnRfVmlldyAJQDI4NAorCQkJICAgIGxvY2F0aW9uICAgCSg1NDQsIDIyNCkKKwkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkyCisJCQkgICAgbWF4X3dpZHRoICAJMjgyCisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJIb3N0Q29uZmlnIikKKwkJCWljb25fc3R5bGUgCSJJY29uIgorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCXF1aWR1ICAgICAgCSIzREZFMDZBNjAxMzEiCisJCQl3aWR0aCAgICAgIAkzMDAKKwkJCWhlaWdodCAgICAgCTIxMTQKKwkJCWljb25faGVpZ2h0IAkwCisJCQlpY29uX3dpZHRoIAkwCisJCQlpY29uX3lfb2Zmc2V0IAkwCisJCQlhbm5vdGF0aW9uIAkxCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDI4NQorCQkJICAgIGxvY2F0aW9uICAgCSg1NDQsIDUxMikKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlAMjg0CisJCQkgICAgaGVpZ2h0ICAgICAJNjk2CisJCQkgICAgeV9jb29yZCAgICAJNjM2CisJCQkgICAgTmVzdGVkICAgICAJRkFMU0UpCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDI4NgorCQkJICAgIGxvY2F0aW9uICAgCSg1NDQsIDU3NikKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlAMjg0CisJCQkgICAgaGVpZ2h0ICAgICAJNjAKKwkJCSAgICB5X2Nvb3JkICAgIAkwCisJCQkgICAgTmVzdGVkICAgICAJVFJVRSkKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBAMjg3CisJCQkgICAgbG9jYXRpb24gICAJKDU0NCwgNjg4KQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUAyODQKKwkJCSAgICBoZWlnaHQgICAgIAk2MAorCQkJICAgIHlfY29vcmQgICAgCTAKKwkJCSAgICBOZXN0ZWQgICAgIAlUUlVFKQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEAyODgKKwkJCSAgICBsb2NhdGlvbiAgIAkoNTQ0LCA3ODQpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDI4NAorCQkJICAgIGhlaWdodCAgICAgCTYwCisJCQkgICAgeV9jb29yZCAgICAJMAorCQkJICAgIE5lc3RlZCAgICAgCVRSVUUpCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDI4OQorCQkJICAgIGxvY2F0aW9uICAgCSg1NDQsIDg5NikKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlAMjg0CisJCQkgICAgaGVpZ2h0ICAgICAJNjAKKwkJCSAgICB5X2Nvb3JkICAgIAkwCisJCQkgICAgTmVzdGVkICAgICAJVFJVRSkKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBAMjkwCisJCQkgICAgbG9jYXRpb24gICAJKDU0NCwgMTAwOCkKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlAMjg0CisJCQkgICAgaGVpZ2h0ICAgICAJNjAKKwkJCSAgICB5X2Nvb3JkICAgIAkwCisJCQkgICAgTmVzdGVkICAgICAJVFJVRSkKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBAMjkxCisJCQkgICAgbG9jYXRpb24gICAJKDU0NCwgMTUzNikKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlAMjg0CisJCQkgICAgaGVpZ2h0ICAgICAJMjAwCisJCQkgICAgeV9jb29yZCAgICAJMTQwCisJCQkgICAgTmVzdGVkICAgICAJRkFMU0UpCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDI5MgorCQkJICAgIGxvY2F0aW9uICAgCSg1NDQsIDE1MzYpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDI4NAorCQkJICAgIGhlaWdodCAgICAgCTYwCisJCQkgICAgeV9jb29yZCAgICAJMAorCQkJICAgIE5lc3RlZCAgICAgCVRSVUUpKQorCQkgICAgKG9iamVjdCBJbnRlck9ialZpZXcgIlN0YW5kYXJkSG9zdERlcGxveWVyIiBAMjkzCisJCQlsb2NhdGlvbiAgIAkoOTQ0LCAyMjQpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJVFJVRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAorCQkJICAgIFBhcmVudF9WaWV3IAlAMjkzCisJCQkgICAgbG9jYXRpb24gICAJKDk0NCwgMjI0KQorCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTIKKwkJCSAgICBtYXhfd2lkdGggIAk0MjYKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJIlN0YW5kYXJkSG9zdERlcGxveWVyIikKKwkJCWljb25fc3R5bGUgCSJJY29uIgorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCXF1aWR1ICAgICAgCSIzREZFMDc5QTAwNTUiCisJCQl3aWR0aCAgICAgIAk0NDQKKwkJCWhlaWdodCAgICAgCTIxMTQKKwkJCWljb25faGVpZ2h0IAkwCisJCQlpY29uX3dpZHRoIAkwCisJCQlpY29uX3lfb2Zmc2V0IAkwCisJCQlhbm5vdGF0aW9uIAkxCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDI5NAorCQkJICAgIGxvY2F0aW9uICAgCSg5NDQsIDEyODApCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDI5MworCQkJICAgIGhlaWdodCAgICAgCTgyNAorCQkJICAgIHlfY29vcmQgICAgCTc2NAorCQkJICAgIE5lc3RlZCAgICAgCUZBTFNFKQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEAyOTUKKwkJCSAgICBsb2NhdGlvbiAgIAkoOTQ0LCAyMTI4KQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUAyOTMKKwkJCSAgICBoZWlnaHQgICAgIAk2MAorCQkJICAgIHlfY29vcmQgICAgCTAKKwkJCSAgICBOZXN0ZWQgICAgIAlGQUxTRSkpCisJCSAgICAob2JqZWN0IEludGVyT2JqVmlldyAiRGlnZXN0ZXIiIEAyOTYKKwkJCWxvY2F0aW9uICAgCSgxMzI4LCAyMjQpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJVFJVRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAorCQkJICAgIFBhcmVudF9WaWV3IAlAMjk2CisJCQkgICAgbG9jYXRpb24gICAJKDEzMjgsIDIyNCkKKwkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkyCisJCQkgICAgbWF4X3dpZHRoICAJMjgyCisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJEaWdlc3RlciIpCisJCQlpY29uX3N0eWxlIAkiSWNvbiIKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQlxdWlkdSAgICAgIAkiM0RGRTA3QzkwMzRDIgorCQkJd2lkdGggICAgICAJMzAwCisJCQloZWlnaHQgICAgIAkyMTE0CisJCQlpY29uX2hlaWdodCAJMAorCQkJaWNvbl93aWR0aCAJMAorCQkJaWNvbl95X29mZnNldCAJMAorCQkJYW5ub3RhdGlvbiAJMQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEAyOTcKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTMyOCwgMTI4MCkKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlAMjk2CisJCQkgICAgaGVpZ2h0ICAgICAJNjAKKwkJCSAgICB5X2Nvb3JkICAgIAkwCisJCQkgICAgTmVzdGVkICAgICAJRkFMU0UpCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDI5OAorCQkJICAgIGxvY2F0aW9uICAgCSgxMzI4LCAxNDg4KQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUAyOTYKKwkJCSAgICBoZWlnaHQgICAgIAk2MAorCQkJICAgIHlfY29vcmQgICAgCTAKKwkJCSAgICBOZXN0ZWQgICAgIAlGQUxTRSkKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBAMjk5CisJCQkgICAgbG9jYXRpb24gICAJKDEzMjgsIDE5ODQpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDI5NgorCQkJICAgIGhlaWdodCAgICAgCTYwCisJCQkgICAgeV9jb29yZCAgICAJMAorCQkJICAgIE5lc3RlZCAgICAgCUZBTFNFKSkKKwkJICAgIChvYmplY3QgSW50ZXJPYmpWaWV3ICJDb250ZXh0UnVsZVNldCIgQDMwMAorCQkJbG9jYXRpb24gICAJKDE2NDgsIDIyNCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlUUlVFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCisJCQkgICAgUGFyZW50X1ZpZXcgCUAzMDAKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTY0OCwgMjI0KQorCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTIKKwkJCSAgICBtYXhfd2lkdGggIAkyODIKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJIkNvbnRleHRSdWxlU2V0IikKKwkJCWljb25fc3R5bGUgCSJJY29uIgorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCXF1aWR1ICAgICAgCSIzREZFMDgzNDAxNkYiCisJCQl3aWR0aCAgICAgIAkzMDAKKwkJCWhlaWdodCAgICAgCTIxMTQKKwkJCWljb25faGVpZ2h0IAkwCisJCQlpY29uX3dpZHRoIAkwCisJCQlpY29uX3lfb2Zmc2V0IAkwCisJCQlhbm5vdGF0aW9uIAkxCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDMwMQorCQkJICAgIGxvY2F0aW9uICAgCSgxNjQ4LCAxNDA4KQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUAzMDAKKwkJCSAgICBoZWlnaHQgICAgIAk2MAorCQkJICAgIHlfY29vcmQgICAgCTAKKwkJCSAgICBOZXN0ZWQgICAgIAlGQUxTRSkKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBAMzAyCisJCQkgICAgbG9jYXRpb24gICAJKDE2NDgsIDE4ODgpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDMwMAorCQkJICAgIGhlaWdodCAgICAgCTYwCisJCQkgICAgeV9jb29yZCAgICAJMAorCQkJICAgIE5lc3RlZCAgICAgCUZBTFNFKSkKKwkJICAgIChvYmplY3QgSW50ZXJPYmpWaWV3ICJOYW1pbmdSdWxlU2V0IiBAMzAzCisJCQlsb2NhdGlvbiAgIAkoMTk2OCwgMjI0KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCVRSVUUKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKKwkJCSAgICBQYXJlbnRfVmlldyAJQDMwMworCQkJICAgIGxvY2F0aW9uICAgCSgxOTY4LCAyMjQpCisJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMgorCQkJICAgIG1heF93aWR0aCAgCTI4MgorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiTmFtaW5nUnVsZVNldCIpCisJCQlpY29uX3N0eWxlIAkiSWNvbiIKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQlxdWlkdSAgICAgIAkiM0RGRTA4RDAwMTczIgorCQkJd2lkdGggICAgICAJMzAwCisJCQloZWlnaHQgICAgIAkyMTE0CisJCQlpY29uX2hlaWdodCAJMAorCQkJaWNvbl93aWR0aCAJMAorCQkJaWNvbl95X29mZnNldCAJMAorCQkJYW5ub3RhdGlvbiAJMQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEAzMDQKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTk2OCwgMTc5MikKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlAMzAzCisJCQkgICAgaGVpZ2h0ICAgICAJNjAKKwkJCSAgICB5X2Nvb3JkICAgIAkwCisJCQkgICAgTmVzdGVkICAgICAJRkFMU0UpKQorCQkgICAgKG9iamVjdCBTZWxmTWVzc1ZpZXcgIiIgQDMwNQorCQkJbG9jYXRpb24gICAJKDAsIDM4NCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMDYKKwkJCSAgICBQYXJlbnRfVmlldyAJQDMwNQorCQkJICAgIGxvY2F0aW9uICAgCSg1NTUsIDM0MikKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZFMDY2QzAzNDEiCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAk2NTEKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJImZpcmVMaWZlY3ljbGVFdmVudChTVEFSVF9FVkVOVCkiCisJCQkgICAgcGN0RGlzdCAgICAJMi4yMDY2NjcKKwkJCSAgICBoZWlnaHQgICAgIAk0MworCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDI3OQorCQkJc3VwcGxpZXIgICAJQDI3OQorCQkJRm9jdXNfU3JjICAJQDI4MAorCQkJRm9jdXNfRW50cnkgCUAyODEKKwkJCW9yaWdpbiAgICAgCSgyMjQsIDM4NCkKKwkJCXRlcm1pbnVzICAgCSgzNzQsIDM4NCkKKwkJCW9yZGluYWwgICAgCTApCisJCSAgICAob2JqZWN0IEludGVyTWVzc1ZpZXcgIiIgQDMwNworCQkJbG9jYXRpb24gICAJKDM4NCwgNTEyKQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMwOAorCQkJICAgIFBhcmVudF9WaWV3IAlAMzA3CisJCQkgICAgbG9jYXRpb24gICAJKDQ4NiwgNDY4KQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkUwNkQyMDI5NCIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTUwNworCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiaW50ZXJlc3RlZFtpXS5saWZlY3ljbGVFdmVudCgpIgorCQkJICAgIHBjdERpc3QgICAgCTAuODY1NTc0CisJCQkgICAgaGVpZ2h0ICAgICAJNDUKKwkJCSAgICBvcmllbnRhdGlvbiAJMCkKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUAyNzkKKwkJCXN1cHBsaWVyICAgCUAyODQKKwkJCUZvY3VzX1NyYyAgCUAyODAKKwkJCUZvY3VzX0VudHJ5IAlAMjg1CisJCQlvcmlnaW4gICAgIAkoMjIzLCA1MTIpCisJCQl0ZXJtaW51cyAgIAkoNTI4LCA1MTIpCisJCQlvcmRpbmFsICAgIAkxKQorCQkgICAgKG9iamVjdCBTZWxmTWVzc1ZpZXcgIiIgQDMwOQorCQkJbG9jYXRpb24gICAJKDE2LCA1NzYpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzEwCisJCQkgICAgUGFyZW50X1ZpZXcgCUAzMDkKKwkJCSAgICBsb2NhdGlvbiAgIAkoNzEzLCA1MzcpCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTA2RTkwMjhEIgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJMjk3CisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJzZXREZXBsb3lYTUwoKSIKKwkJCSAgICBwY3REaXN0ICAgIAkxLjAyNjY2NworCQkJICAgIGhlaWdodCAgICAgCTQwCisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlAMjg0CisJCQlzdXBwbGllciAgIAlAMjg0CisJCQlGb2N1c19TcmMgIAlAMjg1CisJCQlGb2N1c19FbnRyeSAJQDI4NgorCQkJb3JpZ2luICAgICAJKDU2MCwgNTc2KQorCQkJdGVybWludXMgICAJKDcxMCwgNTc2KQorCQkJb3JkaW5hbCAgICAJMikKKwkJICAgIChvYmplY3QgU2VsZk1lc3NWaWV3ICIiIEAzMTEKKwkJCWxvY2F0aW9uICAgCSgxNiwgNjg4KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMxMgorCQkJICAgIFBhcmVudF9WaWV3IAlAMzExCisJCQkgICAgbG9jYXRpb24gICAJKDcxNCwgNjQ1KQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkUwNkYzMDBGRiIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTI4OAorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkic2V0TGl2ZURlcGxveSgpIgorCQkJICAgIHBjdERpc3QgICAgCTEuMDMzMzMzCisJCQkgICAgaGVpZ2h0ICAgICAJNDQKKwkJCSAgICBvcmllbnRhdGlvbiAJMCkKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUAyODQKKwkJCXN1cHBsaWVyICAgCUAyODQKKwkJCUZvY3VzX1NyYyAgCUAyODUKKwkJCUZvY3VzX0VudHJ5IAlAMjg3CisJCQlvcmlnaW4gICAgIAkoNTYwLCA2ODgpCisJCQl0ZXJtaW51cyAgIAkoNzEwLCA2ODgpCisJCQlvcmRpbmFsICAgIAkzKQorCQkgICAgKG9iamVjdCBTZWxmTWVzc1ZpZXcgIiIgQDMxMworCQkJbG9jYXRpb24gICAJKDE2LCA3ODQpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzE0CisJCQkgICAgUGFyZW50X1ZpZXcgCUAzMTMKKwkJCSAgICBsb2NhdGlvbiAgIAkoNzMyLCA3NTYpCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTA2RkIwMEQ5IgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJMzI2CisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJzZXRVbnBhY2tzV2FyKCkiCisJCQkgICAgcGN0RGlzdCAgICAJMS4xNTMzMzMKKwkJCSAgICBoZWlnaHQgICAgIAkyOQorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDI4NAorCQkJc3VwcGxpZXIgICAJQDI4NAorCQkJRm9jdXNfU3JjICAJQDI4NQorCQkJRm9jdXNfRW50cnkgCUAyODgKKwkJCW9yaWdpbiAgICAgCSg1NjAsIDc4NCkKKwkJCXRlcm1pbnVzICAgCSg3MTAsIDc4NCkKKwkJCW9yZGluYWwgICAgCTQpCisJCSAgICAob2JqZWN0IFNlbGZNZXNzVmlldyAiIiBAMzE1CisJCQlsb2NhdGlvbiAgIAkoMTYsIDg5NikKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMTYKKwkJCSAgICBQYXJlbnRfVmlldyAJQDMxNQorCQkJICAgIGxvY2F0aW9uICAgCSg3NDcsIDg2OCkKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZFMDcwQzAwMTUiCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAkzNTAKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJInNldFhNTFZhbGlkYXRpb24oKSIKKwkJCSAgICBwY3REaXN0ICAgIAkxLjI0NjY2NworCQkJICAgIGhlaWdodCAgICAgCTI5CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlAMjg0CisJCQlzdXBwbGllciAgIAlAMjg0CisJCQlGb2N1c19TcmMgIAlAMjg1CisJCQlGb2N1c19FbnRyeSAJQDI4OQorCQkJb3JpZ2luICAgICAJKDU2MCwgODk2KQorCQkJdGVybWludXMgICAJKDcxMCwgODk2KQorCQkJb3JkaW5hbCAgICAJNSkKKwkJICAgIChvYmplY3QgU2VsZk1lc3NWaWV3ICIiIEAzMTcKKwkJCWxvY2F0aW9uICAgCSgxNiwgMTAwOCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMTgKKwkJCSAgICBQYXJlbnRfVmlldyAJQDMxNworCQkJICAgIGxvY2F0aW9uICAgCSg3NjIsIDk4MCkKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZFMDczQjAwMzEiCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAkzNTkKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJImRlcGxveURlc2NyaXB0b3JzKCkiCisJCQkgICAgcGN0RGlzdCAgICAJMS4zNDY2NjcKKwkJCSAgICBoZWlnaHQgICAgIAkyOQorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDI4NAorCQkJc3VwcGxpZXIgICAJQDI4NAorCQkJRm9jdXNfU3JjICAJQDI4NQorCQkJRm9jdXNfRW50cnkgCUAyOTAKKwkJCW9yaWdpbiAgICAgCSg1NjAsIDEwMDgpCisJCQl0ZXJtaW51cyAgIAkoNzEwLCAxMDA4KQorCQkJb3JkaW5hbCAgICAJNikKKwkJICAgIChvYmplY3QgSW50ZXJNZXNzVmlldyAiIiBAMzE5CisJCQlsb2NhdGlvbiAgIAkoMTYsIDEwODgpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzIwCisJCQkgICAgUGFyZW50X1ZpZXcgCUAzMTkKKwkJCSAgICBsb2NhdGlvbiAgIAkoMzc2LCAxMDQ0KQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkUwNzhCMDNCQiIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTEzNgorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiaW5zdGFsbCgpIgorCQkJICAgIHBjdERpc3QgICAgCTAuNTAwMDAwCisJCQkgICAgaGVpZ2h0ICAgICAJNDUKKwkJCSAgICBvcmllbnRhdGlvbiAJMSkKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUAyODQKKwkJCXN1cHBsaWVyICAgCUAyNzkKKwkJCUZvY3VzX1NyYyAgCUAyODUKKwkJCUZvY3VzX0VudHJ5IAlAMjgyCisJCQlvcmlnaW4gICAgIAkoNTI4LCAxMDg4KQorCQkJdGVybWludXMgICAJKDIyNCwgMTA4OCkKKwkJCW9yZGluYWwgICAgCTcpCisJCSAgICAob2JqZWN0IEludGVyTWVzc1ZpZXcgIiIgQDMyMQorCQkJbG9jYXRpb24gICAJKDU3NiwgMTI4MCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMjIKKwkJCSAgICBQYXJlbnRfVmlldyAJQDMyMQorCQkJICAgIGxvY2F0aW9uICAgCSg1NzUsIDEyMzYpCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTA3QjEwMEJFIgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJMTM2CisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJpbnN0YWxsKCkiCisJCQkgICAgcGN0RGlzdCAgICAJMC41MDAwMDAKKwkJCSAgICBoZWlnaHQgICAgIAk0NQorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDI3OQorCQkJc3VwcGxpZXIgICAJQDI5MworCQkJRm9jdXNfU3JjICAJQDI4MAorCQkJRm9jdXNfRW50cnkgCUAyOTQKKwkJCW9yaWdpbiAgICAgCSgyMjMsIDEyODApCisJCQl0ZXJtaW51cyAgIAkoOTI4LCAxMjgwKQorCQkJb3JkaW5hbCAgICAJOCkKKwkJICAgIChvYmplY3QgSW50ZXJNZXNzVmlldyAiIiBAMzIzCisJCQlsb2NhdGlvbiAgIAkoMTE1MiwgMTI4MCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMjQKKwkJCSAgICBQYXJlbnRfVmlldyAJQDMyMworCQkJICAgIGxvY2F0aW9uICAgCSgxMTM1LCAxMjM2KQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkUwN0QyMDBFRCIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTE0NAorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiY3JlYXRlKCkiCisJCQkgICAgcGN0RGlzdCAgICAJMC41MDAwMDAKKwkJCSAgICBoZWlnaHQgICAgIAk0NQorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDI5MworCQkJc3VwcGxpZXIgICAJQDI5NgorCQkJRm9jdXNfU3JjICAJQDI5NAorCQkJRm9jdXNfRW50cnkgCUAyOTcKKwkJCW9yaWdpbiAgICAgCSg5NTksIDEyODApCisJCQl0ZXJtaW51cyAgIAkoMTMxMiwgMTI4MCkKKwkJCW9yZGluYWwgICAgCTkpCisJCSAgICAob2JqZWN0IEludGVyTWVzc1ZpZXcgIiIgQDMyNQorCQkJbG9jYXRpb24gICAJKDExMzYsIDE5ODQpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzI2CisJCQkgICAgUGFyZW50X1ZpZXcgCUAzMjUKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTEzNSwgMTk0MCkKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZFMDdENjAzRDciCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAkxMzYKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJInBhcnNlKCkiCisJCQkgICAgcGN0RGlzdCAgICAJMC41MDAwMDAKKwkJCSAgICBoZWlnaHQgICAgIAk0NQorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDI5MworCQkJc3VwcGxpZXIgICAJQDI5NgorCQkJRm9jdXNfU3JjICAJQDI5NAorCQkJRm9jdXNfRW50cnkgCUAyOTkKKwkJCW9yaWdpbiAgICAgCSg5NTksIDE5ODQpCisJCQl0ZXJtaW51cyAgIAkoMTMxMiwgMTk4NCkKKwkJCW9yZGluYWwgICAgCTE2KQorCQkgICAgKG9iamVjdCBJbnRlck1lc3NWaWV3ICIiIEAzMjcKKwkJCWxvY2F0aW9uICAgCSgxMjk2LCAxNDA4KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMyOAorCQkJICAgIFBhcmVudF9WaWV3IAlAMzI3CisJCQkgICAgbG9jYXRpb24gICAJKDEyOTUsIDEzNjQpCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTA4REEwMjlCIgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJMTA2CisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJuZXcoKSIKKwkJCSAgICBwY3REaXN0ICAgIAkwLjUwMDAwMAorCQkJICAgIGhlaWdodCAgICAgCTQ1CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlAMjkzCisJCQlzdXBwbGllciAgIAlAMzAwCisJCQlGb2N1c19TcmMgIAlAMjk0CisJCQlGb2N1c19FbnRyeSAJQDMwMQorCQkJb3JpZ2luICAgICAJKDk1OSwgMTQwOCkKKwkJCXRlcm1pbnVzICAgCSgxNjMyLCAxNDA4KQorCQkJb3JkaW5hbCAgICAJMTApCisJCSAgICAob2JqZWN0IEludGVyTWVzc1ZpZXcgIiIgQDMyOQorCQkJbG9jYXRpb24gICAJKDE0NTYsIDE3OTIpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzMwCisJCQkgICAgUGFyZW50X1ZpZXcgCUAzMjkKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTQ1NSwgMTc0OCkKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZFMDhFMDAwOTEiCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAkxMDYKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJIm5ldygpIgorCQkJICAgIHBjdERpc3QgICAgCTAuNTAwMDAwCisJCQkgICAgaGVpZ2h0ICAgICAJNDUKKwkJCSAgICBvcmllbnRhdGlvbiAJMCkKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUAyOTMKKwkJCXN1cHBsaWVyICAgCUAzMDMKKwkJCUZvY3VzX1NyYyAgCUAyOTQKKwkJCUZvY3VzX0VudHJ5IAlAMzA0CisJCQlvcmlnaW4gICAgIAkoOTU5LCAxNzkyKQorCQkJdGVybWludXMgICAJKDE5NTIsIDE3OTIpCisJCQlvcmRpbmFsICAgIAkxNCkKKwkJICAgIChvYmplY3QgSW50ZXJNZXNzVmlldyAiIiBAMzMxCisJCQlsb2NhdGlvbiAgIAkoMTYsIDE0ODgpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzMyCisJCQkgICAgUGFyZW50X1ZpZXcgCUAzMzEKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTE4MiwgMTQ0NSkKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZFMDhGQTAwM0QiCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAkzODcKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJImFkZChDb250ZXh0UnVsZVNldCkiCisJCQkgICAgcGN0RGlzdCAgICAJMC42MzE3MjgKKwkJCSAgICBoZWlnaHQgICAgIAk0NAorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDI5MworCQkJc3VwcGxpZXIgICAJQDI5NgorCQkJRm9jdXNfU3JjICAJQDI5NAorCQkJRm9jdXNfRW50cnkgCUAyOTgKKwkJCW9yaWdpbiAgICAgCSg5NTksIDE0ODgpCisJCQl0ZXJtaW51cyAgIAkoMTMxMiwgMTQ4OCkKKwkJCW9yZGluYWwgICAgCTExKQorCQkgICAgKG9iamVjdCBJbnRlck1lc3NWaWV3ICIiIEAzMzMKKwkJCWxvY2F0aW9uICAgCSgxMjk2LCAxODg4KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMzNAorCQkJICAgIFBhcmVudF9WaWV3IAlAMzMzCisJCQkgICAgbG9jYXRpb24gICAJKDEyOTUsIDE4NDQpCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTA5MDcwMTVGIgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJNDE2CisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJhZGQoTmFtaW5nUnVsZVNldCgpKSIKKwkJCSAgICBwY3REaXN0ICAgIAkwLjUwMDAwMAorCQkJICAgIGhlaWdodCAgICAgCTQ1CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlAMjkzCisJCQlzdXBwbGllciAgIAlAMzAwCisJCQlGb2N1c19TcmMgIAlAMjk0CisJCQlGb2N1c19FbnRyeSAJQDMwMgorCQkJb3JpZ2luICAgICAJKDk1OSwgMTg4OCkKKwkJCXRlcm1pbnVzICAgCSgxNjMyLCAxODg4KQorCQkJb3JkaW5hbCAgICAJMTUpCisJCSAgICAob2JqZWN0IE5vdGVWaWV3IEAzMzUKKwkJCWxvY2F0aW9uICAgCSgyMDk2LCAyMzg0KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCisJCQkgICAgUGFyZW50X1ZpZXcgCUAzMzUKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTg5MywgMjMxNSkKKwkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJICAgIG5saW5lcyAgICAgCTIKKwkJCSAgICBtYXhfd2lkdGggIAkzNzEKKwkJCSAgICBsYWJlbCAgICAgIAkiIzIgQ2F0YWxpbmEuc3RhcnQoKSIpCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJd2lkdGggICAgICAJNDMxCisJCQloZWlnaHQgICAgIAkxNTApCisJCSAgICAob2JqZWN0IFNlbGZNZXNzVmlldyAiIiBAMzM2CisJCQlsb2NhdGlvbiAgIAkoMTYsIDE1MzYpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzM3CisJCQkgICAgUGFyZW50X1ZpZXcgCUAzMzYKKwkJCSAgICBsb2NhdGlvbiAgIAkoNjk3LCAxNDkzKQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkUxMzFGMDMyNyIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTI0NAorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiZGVwbG95QXBwcygpIgorCQkJICAgIHBjdERpc3QgICAgCTAuOTEzMzMzCisJCQkgICAgaGVpZ2h0ICAgICAJNDMKKwkJCSAgICBvcmllbnRhdGlvbiAJMCkKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUAyODQKKwkJCXN1cHBsaWVyICAgCUAyODQKKwkJCUZvY3VzX1NyYyAgCUAyOTEKKwkJCUZvY3VzX0VudHJ5IAlAMjkyCisJCQlvcmlnaW4gICAgIAkoNTYwLCAxNTM2KQorCQkJdGVybWludXMgICAJKDcxMCwgMTUzNikKKwkJCW9yZGluYWwgICAgCTEyKQorCQkgICAgKG9iamVjdCBJbnRlck1lc3NWaWV3ICIiIEAzMzgKKwkJCWxvY2F0aW9uICAgCSgxNiwgMTYxNikKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMzkKKwkJCSAgICBQYXJlbnRfVmlldyAJQDMzOAorCQkJICAgIGxvY2F0aW9uICAgCSgzNzYsIDE1NzIpCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTEzMkQwMzA5IgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJMTM2CisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJpbnN0YWxsKCkiCisJCQkgICAgcGN0RGlzdCAgICAJMC41MDAwMDAKKwkJCSAgICBoZWlnaHQgICAgIAk0NQorCQkJICAgIG9yaWVudGF0aW9uIAkxKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDI4NAorCQkJc3VwcGxpZXIgICAJQDI3OQorCQkJRm9jdXNfU3JjICAJQDI5MQorCQkJRm9jdXNfRW50cnkgCUAyODMKKwkJCW9yaWdpbiAgICAgCSg1MjgsIDE2MTYpCisJCQl0ZXJtaW51cyAgIAkoMjI0LCAxNjE2KQorCQkJb3JkaW5hbCAgICAJMTMpCisJCSAgICAob2JqZWN0IEludGVyTWVzc1ZpZXcgIiIgQDM0MAorCQkJbG9jYXRpb24gICAJKDU3NiwgMjEyOCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNDEKKwkJCSAgICBQYXJlbnRfVmlldyAJQDM0MAorCQkJICAgIGxvY2F0aW9uICAgCSg1NzUsIDIwODQpCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTEzM0EwMzZDIgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJNDYzCisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJpbnN0YWxsKCkgLy8gc2FtZSBhcyBhYm92ZSIKKwkJCSAgICBwY3REaXN0ICAgIAkwLjUwMDAwMAorCQkJICAgIGhlaWdodCAgICAgCTQ1CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlAMjc5CisJCQlzdXBwbGllciAgIAlAMjkzCisJCQlGb2N1c19TcmMgIAlAMjgwCisJCQlGb2N1c19FbnRyeSAJQDI5NQorCQkJb3JpZ2luICAgICAJKDIyMywgMjEyOCkKKwkJCXRlcm1pbnVzICAgCSg5MjgsIDIxMjgpCisJCQlvcmRpbmFsICAgIAkxNykpKQorCSAgICAob2JqZWN0IEludGVyYWN0aW9uRGlhZ3JhbSAiNS4gY2F0YWxpbmFfc3RhcnRfMyIKKwkJbWVjaGFuaXNtX3JlZiAJQDg2CisJCXF1aWQgICAgICAgCSIzREZFMDk0QTAzNDYiCisJCXRpdGxlICAgICAgCSI1LiBjYXRhbGluYV9zdGFydF8zIgorCQl6b29tICAgICAgIAkxMDAKKwkJbWF4X2hlaWdodCAJMjgzNTAKKwkJbWF4X3dpZHRoICAJMjE2MDAKKwkJb3JpZ2luX3ggICAJMAorCQlvcmlnaW5feSAgIAkwCisJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0CisJCSAgICAob2JqZWN0IEludGVyT2JqVmlldyAiRGlnZXN0ZXIiIEAzNDIKKwkJCWxvY2F0aW9uICAgCSgxNzYsIDIyNCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlUUlVFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCisJCQkgICAgUGFyZW50X1ZpZXcgCUAzNDIKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTc2LCAyMjQpCisJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMgorCQkJICAgIG1heF93aWR0aCAgCTI4MgorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiRGlnZXN0ZXIiKQorCQkJaWNvbl9zdHlsZSAJIkljb24iCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJcXVpZHUgICAgICAJIjNERkUwOTVBMDM3MSIKKwkJCXdpZHRoICAgICAgCTMwMAorCQkJaGVpZ2h0ICAgICAJMTIxNAorCQkJaWNvbl9oZWlnaHQgCTAKKwkJCWljb25fd2lkdGggCTAKKwkJCWljb25feV9vZmZzZXQgCTAKKwkJCWFubm90YXRpb24gCTEKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBAMzQzCisJCQkgICAgbG9jYXRpb24gICAJKDE3NiwgMzUyKQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUAzNDIKKwkJCSAgICBoZWlnaHQgICAgIAk5OTYKKwkJCSAgICB5X2Nvb3JkICAgIAk5MzYKKwkJCSAgICBOZXN0ZWQgICAgIAlGQUxTRSkKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBAMzQ0CisJCQkgICAgbG9jYXRpb24gICAJKDE3NiwgMzUyKQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUAzNDIKKwkJCSAgICBoZWlnaHQgICAgIAk2MAorCQkJICAgIHlfY29vcmQgICAgCTAKKwkJCSAgICBOZXN0ZWQgICAgIAlUUlVFKQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEAzNDUKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTc2LCA0NDgpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDM0MgorCQkJICAgIGhlaWdodCAgICAgCTYwCisJCQkgICAgeV9jb29yZCAgICAJMAorCQkJICAgIE5lc3RlZCAgICAgCVRSVUUpKQorCQkgICAgKG9iamVjdCBJbnRlck9ialZpZXcgIlJ1bGUiIEAzNDYKKwkJCWxvY2F0aW9uICAgCSg0ODAsIDIyNCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlUUlVFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCisJCQkgICAgUGFyZW50X1ZpZXcgCUAzNDYKKwkJCSAgICBsb2NhdGlvbiAgIAkoNDgwLCAyMjQpCisJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMgorCQkJICAgIG1heF93aWR0aCAgCTI4MgorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiUnVsZSIpCisJCQlpY29uX3N0eWxlIAkiSWNvbiIKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQlxdWlkdSAgICAgIAkiM0RGRTBFNzQwMEQwIgorCQkJd2lkdGggICAgICAJMzAwCisJCQloZWlnaHQgICAgIAkxMjE0CisJCQlpY29uX2hlaWdodCAJMAorCQkJaWNvbl93aWR0aCAJMAorCQkJaWNvbl95X29mZnNldCAJMAorCQkJYW5ub3RhdGlvbiAJMQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEAzNDcKKwkJCSAgICBsb2NhdGlvbiAgIAkoNDgwLCA1NjApCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDM0NgorCQkJICAgIGhlaWdodCAgICAgCTcyOAorCQkJICAgIHlfY29vcmQgICAgCTY2OAorCQkJICAgIE5lc3RlZCAgICAgCUZBTFNFKSkKKwkJICAgIChvYmplY3QgSW50ZXJPYmpWaWV3ICJTdGFuZGFyZENvbnRleHQiIEAzNDgKKwkJCWxvY2F0aW9uICAgCSg4MTYsIDIyNCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlUUlVFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCisJCQkgICAgUGFyZW50X1ZpZXcgCUAzNDgKKwkJCSAgICBsb2NhdGlvbiAgIAkoODE2LCAyMjQpCisJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMgorCQkJICAgIG1heF93aWR0aCAgCTMzMgorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiU3RhbmRhcmRDb250ZXh0IikKKwkJCWljb25fc3R5bGUgCSJJY29uIgorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCXF1aWR1ICAgICAgCSIzREZFMEZDNTAyQTEiCisJCQl3aWR0aCAgICAgIAkzNTAKKwkJCWhlaWdodCAgICAgCTEyMTQKKwkJCWljb25faGVpZ2h0IAkwCisJCQlpY29uX3dpZHRoIAkwCisJCQlpY29uX3lfb2Zmc2V0IAkwCisJCQlhbm5vdGF0aW9uIAkxCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDM0OQorCQkJICAgIGxvY2F0aW9uICAgCSg4MTYsIDU5MikKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlAMzQ4CisJCQkgICAgaGVpZ2h0ICAgICAJMjY0CisJCQkgICAgeV9jb29yZCAgICAJMjA0CisJCQkgICAgTmVzdGVkICAgICAJRkFMU0UpCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDM1MAorCQkJICAgIGxvY2F0aW9uICAgCSg4MTYsIDEwMDgpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDM0OAorCQkJICAgIGhlaWdodCAgICAgCTYwCisJCQkgICAgeV9jb29yZCAgICAJMAorCQkJICAgIE5lc3RlZCAgICAgCUZBTFNFKSkKKwkJICAgIChvYmplY3QgSW50ZXJPYmpWaWV3ICJTdGFuZGFyZFBpcGVsaW5lIiBAMzUxCisJCQlsb2NhdGlvbiAgIAkoMTE4NCwgMjI0KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCVRSVUUKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKKwkJCSAgICBQYXJlbnRfVmlldyAJQDM1MQorCQkJICAgIGxvY2F0aW9uICAgCSgxMTg0LCAyMjQpCisJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMgorCQkJICAgIG1heF93aWR0aCAgCTM2MworCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiU3RhbmRhcmRQaXBlbGluZSIpCisJCQlpY29uX3N0eWxlIAkiSWNvbiIKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQlxdWlkdSAgICAgIAkiM0RGRTExMkYwMDNGIgorCQkJd2lkdGggICAgICAJMzgxCisJCQloZWlnaHQgICAgIAkxMjE0CisJCQlpY29uX2hlaWdodCAJMAorCQkJaWNvbl93aWR0aCAJMAorCQkJaWNvbl95X29mZnNldCAJMAorCQkJYW5ub3RhdGlvbiAJMQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEAzNTIKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTE4NCwgNzM2KQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUAzNTEKKwkJCSAgICBoZWlnaHQgICAgIAk2MAorCQkJICAgIHlfY29vcmQgICAgCTAKKwkJCSAgICBOZXN0ZWQgICAgIAlGQUxTRSkpCisJCSAgICAob2JqZWN0IEludGVyT2JqVmlldyAiU3RhbmRhcmRDb250ZXh0VmFsdmUiIEAzNTMKKwkJCWxvY2F0aW9uICAgCSgxNTUyLCAyMjQpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJVFJVRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAorCQkJICAgIFBhcmVudF9WaWV3IAlAMzUzCisJCQkgICAgbG9jYXRpb24gICAJKDE1NTIsIDIyNCkKKwkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkyCisJCQkgICAgbWF4X3dpZHRoICAJMzAwCisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJTdGFuZGFyZENvbnRleHRWYWx2ZSIpCisJCQlpY29uX3N0eWxlIAkiSWNvbiIKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQlxdWlkdSAgICAgIAkiM0RGRTExMEQwMzc1IgorCQkJd2lkdGggICAgICAJMzE4CisJCQloZWlnaHQgICAgIAkxMjE0CisJCQlpY29uX2hlaWdodCAJMAorCQkJaWNvbl93aWR0aCAJMAorCQkJaWNvbl95X29mZnNldCAJMAorCQkJYW5ub3RhdGlvbiAJMQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEAzNTQKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTU1MiwgNjI0KQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUAzNTMKKwkJCSAgICBoZWlnaHQgICAgIAk2MAorCQkJICAgIHlfY29vcmQgICAgCTAKKwkJCSAgICBOZXN0ZWQgICAgIAlGQUxTRSkpCisJCSAgICAob2JqZWN0IEludGVyT2JqVmlldyAiU2V0UHJvcGVydGllc1J1bGUiIEAzNTUKKwkJCWxvY2F0aW9uICAgCSgxOTIwLCAyMjQpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJVFJVRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAorCQkJICAgIFBhcmVudF9WaWV3IAlAMzU1CisJCQkgICAgbG9jYXRpb24gICAJKDE5MjAsIDIyNCkKKwkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkyCisJCQkgICAgbWF4X3dpZHRoICAJMzYzCisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJTZXRQcm9wZXJ0aWVzUnVsZSIpCisJCQlpY29uX3N0eWxlIAkiSWNvbiIKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQlxdWlkdSAgICAgIAkiM0RGRTEwMDMwM0E0IgorCQkJd2lkdGggICAgICAJMzgxCisJCQloZWlnaHQgICAgIAkxMjE0CisJCQlpY29uX2hlaWdodCAJMAorCQkJaWNvbl93aWR0aCAJMAorCQkJaWNvbl95X29mZnNldCAJMAorCQkJYW5ub3RhdGlvbiAJMQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEAzNTYKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTkyMCwgOTI4KQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUAzNTUKKwkJCSAgICBoZWlnaHQgICAgIAkyMDAKKwkJCSAgICB5X2Nvb3JkICAgIAkxNDAKKwkJCSAgICBOZXN0ZWQgICAgIAlGQUxTRSkpCisJCSAgICAob2JqZWN0IEludGVyT2JqVmlldyAiU2V0TmV4dFJ1bGUiIEAzNTcKKwkJCWxvY2F0aW9uICAgCSgyMjcyLCAyMjQpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJVFJVRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAorCQkJICAgIFBhcmVudF9WaWV3IAlAMzU3CisJCQkgICAgbG9jYXRpb24gICAJKDIyNzIsIDIyNCkKKwkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkyCisJCQkgICAgbWF4X3dpZHRoICAJMjgyCisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJTZXROZXh0UnVsZSIpCisJCQlpY29uX3N0eWxlIAkiSWNvbiIKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQlxdWlkdSAgICAgIAkiM0RGRTEyNjkwMjY3IgorCQkJd2lkdGggICAgICAJMzAwCisJCQloZWlnaHQgICAgIAkxMjE0CisJCQlpY29uX2hlaWdodCAJMAorCQkJaWNvbl93aWR0aCAJMAorCQkJaWNvbl95X29mZnNldCAJMAorCQkJYW5ub3RhdGlvbiAJMQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEAzNTgKKwkJCSAgICBsb2NhdGlvbiAgIAkoMjI3MiwgMTE2OCkKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlAMzU3CisJCQkgICAgaGVpZ2h0ICAgICAJNjAKKwkJCSAgICB5X2Nvb3JkICAgIAkwCisJCQkgICAgTmVzdGVkICAgICAJRkFMU0UpKQorCQkgICAgKG9iamVjdCBTZWxmTWVzc1ZpZXcgIiIgQDM1OQorCQkJbG9jYXRpb24gICAJKDAsIDM1MikKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNjAKKwkJCSAgICBQYXJlbnRfVmlldyAJQDM1OQorCQkJICAgIGxvY2F0aW9uICAgCSgyNjcsIDMwOCkKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZFMEU3ODAxREIiCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAkxMDgKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJInBhcnNlIgorCQkJICAgIHBjdERpc3QgICAgCTAuNTAwMDAwCisJCQkgICAgaGVpZ2h0ICAgICAJNDUKKwkJCSAgICBvcmllbnRhdGlvbiAJMCkKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUAzNDIKKwkJCXN1cHBsaWVyICAgCUAzNDIKKwkJCUZvY3VzX1NyYyAgCUAzNDMKKwkJCUZvY3VzX0VudHJ5IAlAMzQ0CisJCQlvcmlnaW4gICAgIAkoMTkyLCAzNTIpCisJCQl0ZXJtaW51cyAgIAkoMzQyLCAzNTIpCisJCQlvcmRpbmFsICAgIAkwKQorCQkgICAgKG9iamVjdCBTZWxmTWVzc1ZpZXcgIiIgQDM2MQorCQkJbG9jYXRpb24gICAJKDE2LCA0NDgpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzYyCisJCQkgICAgUGFyZW50X1ZpZXcgCUAzNjEKKwkJCSAgICBsb2NhdGlvbiAgIAkoMzQ1LCA0MjApCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTBGMkYwM0QyIgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJMjY3CisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJzdGFydEVsZW1lbnQoKSIKKwkJCSAgICBwY3REaXN0ICAgIAkxLjAyMDAwMAorCQkJICAgIGhlaWdodCAgICAgCTI4CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlAMzQyCisJCQlzdXBwbGllciAgIAlAMzQyCisJCQlGb2N1c19TcmMgIAlAMzQzCisJCQlGb2N1c19FbnRyeSAJQDM0NQorCQkJb3JpZ2luICAgICAJKDE5MiwgNDQ4KQorCQkJdGVybWludXMgICAJKDM0MiwgNDQ4KQorCQkJb3JkaW5hbCAgICAJMSkKKwkJICAgIChvYmplY3QgSW50ZXJNZXNzVmlldyAiIiBAMzYzCisJCQlsb2NhdGlvbiAgIAkoMzM2LCA1NjApCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzY0CisJCQkgICAgUGFyZW50X1ZpZXcgCUAzNjMKKwkJCSAgICBsb2NhdGlvbiAgIAkoMzI3LCA1MTYpCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTBGNDAwMjE0IgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJMTMyCisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJiZWdpbigpIgorCQkJICAgIHBjdERpc3QgICAgCTAuNTAwMDAwCisJCQkgICAgaGVpZ2h0ICAgICAJNDUKKwkJCSAgICBvcmllbnRhdGlvbiAJMCkKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUAzNDIKKwkJCXN1cHBsaWVyICAgCUAzNDYKKwkJCUZvY3VzX1NyYyAgCUAzNDMKKwkJCUZvY3VzX0VudHJ5IAlAMzQ3CisJCQlvcmlnaW4gICAgIAkoMTkxLCA1NjApCisJCQl0ZXJtaW51cyAgIAkoNDY0LCA1NjApCisJCQlvcmRpbmFsICAgIAkyKQorCQkgICAgKG9iamVjdCBJbnRlck1lc3NWaWV3ICIiIEAzNjUKKwkJCWxvY2F0aW9uICAgCSgxNiwgNTkyKQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM2NgorCQkJICAgIFBhcmVudF9WaWV3IAlAMzY1CisJCQkgICAgbG9jYXRpb24gICAJKDY0NywgNTQ4KQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkUwRkQzMDI2NiIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTI2NQorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkibmV3SW5zdGFuY2UoKSIKKwkJCSAgICBwY3REaXN0ICAgIAkwLjUwMDAwMAorCQkJICAgIGhlaWdodCAgICAgCTQ1CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlAMzQ2CisJCQlzdXBwbGllciAgIAlAMzQ4CisJCQlGb2N1c19TcmMgIAlAMzQ3CisJCQlGb2N1c19FbnRyeSAJQDM0OQorCQkJb3JpZ2luICAgICAJKDQ5NSwgNTkyKQorCQkJdGVybWludXMgICAJKDgwMCwgNTkyKQorCQkJb3JkaW5hbCAgICAJMykKKwkJICAgIChvYmplY3QgSW50ZXJNZXNzVmlldyAiIiBAMzY3CisJCQlsb2NhdGlvbiAgIAkoODY0LCA5MjgpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzY4CisJCQkgICAgUGFyZW50X1ZpZXcgCUAzNjcKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTE5OSwgODg0KQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkUxMDIwMDJFOSIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTEzMgorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiYmVnaW4oKSIKKwkJCSAgICBwY3REaXN0ICAgIAkwLjUwMDAwMAorCQkJICAgIGhlaWdodCAgICAgCTQ1CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlAMzQ2CisJCQlzdXBwbGllciAgIAlAMzU1CisJCQlGb2N1c19TcmMgIAlAMzQ3CisJCQlGb2N1c19FbnRyeSAJQDM1NgorCQkJb3JpZ2luICAgICAJKDQ5NSwgOTI4KQorCQkJdGVybWludXMgICAJKDE5MDQsIDkyOCkKKwkJCW9yZGluYWwgICAgCTYpCisJCSAgICAob2JqZWN0IEludGVyTWVzc1ZpZXcgIiIgQDM2OQorCQkJbG9jYXRpb24gICAJKDEwMDgsIDczNikKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNzAKKwkJCSAgICBQYXJlbnRfVmlldyAJQDM2OQorCQkJICAgIGxvY2F0aW9uICAgCSgxMTM5LCA2OTMpCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTExNEEwMTkzIgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJNjEwCisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJzZXRCYXNpYyhTdGFuZGFyZENvbnRleHRWYWx2ZSkiCisJCQkgICAgcGN0RGlzdCAgICAJMC45MTUwMTQKKwkJCSAgICBoZWlnaHQgICAgIAk0NAorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDM0OAorCQkJc3VwcGxpZXIgICAJQDM1MQorCQkJRm9jdXNfU3JjICAJQDM0OQorCQkJRm9jdXNfRW50cnkgCUAzNTIKKwkJCW9yaWdpbiAgICAgCSg4MzEsIDczNikKKwkJCXRlcm1pbnVzICAgCSgxMTY4LCA3MzYpCisJCQlvcmRpbmFsICAgIAk1KQorCQkgICAgKG9iamVjdCBJbnRlck1lc3NWaWV3ICIiIEAzNzEKKwkJCWxvY2F0aW9uICAgCSgxNiwgNjI0KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM3MgorCQkJICAgIFBhcmVudF9WaWV3IAlAMzcxCisJCQkgICAgbG9jYXRpb24gICAJKDExODMsIDU4MCkKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZFMTE1RTAwMUYiCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAkxMDYKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJIm5ldygpIgorCQkJICAgIHBjdERpc3QgICAgCTAuNTAwMDAwCisJCQkgICAgaGVpZ2h0ICAgICAJNDUKKwkJCSAgICBvcmllbnRhdGlvbiAJMCkKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUAzNDgKKwkJCXN1cHBsaWVyICAgCUAzNTMKKwkJCUZvY3VzX1NyYyAgCUAzNDkKKwkJCUZvY3VzX0VudHJ5IAlAMzU0CisJCQlvcmlnaW4gICAgIAkoODMxLCA2MjQpCisJCQl0ZXJtaW51cyAgIAkoMTUzNiwgNjI0KQorCQkJb3JkaW5hbCAgICAJNCkKKwkJICAgIChvYmplY3QgSW50ZXJNZXNzVmlldyAiIiBAMzczCisJCQlsb2NhdGlvbiAgIAkoMTQ0MCwgMTAwOCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNzQKKwkJCSAgICBQYXJlbnRfVmlldyAJQDM3MworCQkJICAgIGxvY2F0aW9uICAgCSgxMzY4LCA5NjQpCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTExRDUwMzkxIgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJMTE5MAorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiLy9Vc2luZyBCZWFuVXRpbCwgc2V0IHRoZSBvYmplY3QgcHJvcGVydGllcyAoZnJvbSBleDogYWRtaW4ueG1sKSIKKwkJCSAgICBwY3REaXN0ICAgIAkwLjUwMDAwMAorCQkJICAgIGhlaWdodCAgICAgCTQ1CisJCQkgICAgb3JpZW50YXRpb24gCTEpCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlAMzU1CisJCQlzdXBwbGllciAgIAlAMzQ4CisJCQlGb2N1c19TcmMgIAlAMzU2CisJCQlGb2N1c19FbnRyeSAJQDM1MAorCQkJb3JpZ2luICAgICAJKDE5MDQsIDEwMDgpCisJCQl0ZXJtaW51cyAgIAkoODMyLCAxMDA4KQorCQkJb3JkaW5hbCAgICAJNykKKwkJICAgIChvYmplY3QgSW50ZXJNZXNzVmlldyAiIiBAMzc1CisJCQlsb2NhdGlvbiAgIAkoMTM5MiwgMTE2OCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNzYKKwkJCSAgICBQYXJlbnRfVmlldyAJQDM3NQorCQkJICAgIGxvY2F0aW9uICAgCSgxMzc1LCAxMTI0KQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkUxMjg1MDFDOCIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTk5CisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJlbmQoKSIKKwkJCSAgICBwY3REaXN0ICAgIAkwLjUwMDAwMAorCQkJICAgIGhlaWdodCAgICAgCTQ1CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlAMzQ2CisJCQlzdXBwbGllciAgIAlAMzU3CisJCQlGb2N1c19TcmMgIAlAMzQ3CisJCQlGb2N1c19FbnRyeSAJQDM1OAorCQkJb3JpZ2luICAgICAJKDQ5NSwgMTE2OCkKKwkJCXRlcm1pbnVzICAgCSgyMjU2LCAxMTY4KQorCQkJb3JkaW5hbCAgICAJOCkKKwkJICAgIChvYmplY3QgTm90ZVZpZXcgQDM3NworCQkJbG9jYXRpb24gICAJKDEyMTYsIDgwKQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCisJCQkgICAgUGFyZW50X1ZpZXcgCUAzNzcKKwkJCSAgICBsb2NhdGlvbiAgIAkoOTAwLCAxNSkKKwkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJICAgIG5saW5lcyAgICAgCTIKKwkJCSAgICBtYXhfd2lkdGggIAk1OTYKKwkJCSAgICBsYWJlbCAgICAgIAkiSG9zdENvbmZpZy5kZXBsb3lEZXNjcmlwdG9yKCkiKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCXdpZHRoICAgICAgCTY1NgorCQkJaGVpZ2h0ICAgICAJMTQzKQorCQkgICAgKG9iamVjdCBOb3RlVmlldyBAMzc4CisJCQlsb2NhdGlvbiAgIAkoMjEyOCwgMTg4OCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAorCQkJICAgIFBhcmVudF9WaWV3IAlAMzc4CisJCQkgICAgbG9jYXRpb24gICAJKDE5NDcsIDE4MjIpCisJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCSAgICBubGluZXMgICAgIAkyCisJCQkgICAgbWF4X3dpZHRoICAJMzI3CisJCQkgICAgbGFiZWwgICAgICAJIiMzIENhdGFsaW5hLnN0YXJ0KCkiKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCXdpZHRoICAgICAgCTM4NworCQkJaGVpZ2h0ICAgICAJMTQ0KSkpCisJICAgIChvYmplY3QgSW50ZXJhY3Rpb25EaWFncmFtICI2LiBjYXRhbGluYV9zdGFydF80IgorCQltZWNoYW5pc21fcmVmIAlAODcKKwkJcXVpZCAgICAgICAJIjNERkUxMzg5MDAwOCIKKwkJdGl0bGUgICAgICAJIjYuIGNhdGFsaW5hX3N0YXJ0XzQiCisJCXpvb20gICAgICAgCTEwMAorCQltYXhfaGVpZ2h0IAkyODM1MAorCQltYXhfd2lkdGggIAkyMTYwMAorCQlvcmlnaW5feCAgIAkwCisJCW9yaWdpbl95ICAgCTE4MTgKKwkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKKwkJICAgIChvYmplY3QgSW50ZXJPYmpWaWV3ICJEaWdlc3RlciIgQDM3OQorCQkJbG9jYXRpb24gICAJKDE3NiwgMjI0KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCVRSVUUKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKKwkJCSAgICBQYXJlbnRfVmlldyAJQDM3OQorCQkJICAgIGxvY2F0aW9uICAgCSgxNzYsIDIyNCkKKwkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkyCisJCQkgICAgbWF4X3dpZHRoICAJMjgyCisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJEaWdlc3RlciIpCisJCQlpY29uX3N0eWxlIAkiSWNvbiIKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQlxdWlkdSAgICAgIAkiM0RGRTEzOTYwMzY0IgorCQkJd2lkdGggICAgICAJMzAwCisJCQloZWlnaHQgICAgIAkyNDQ2CisJCQlpY29uX2hlaWdodCAJMAorCQkJaWNvbl93aWR0aCAJMAorCQkJaWNvbl95X29mZnNldCAJMAorCQkJYW5ub3RhdGlvbiAJMQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEAzODAKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTc2LCAzMzYpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDM3OQorCQkJICAgIGhlaWdodCAgICAgCTEyMjgKKwkJCSAgICB5X2Nvb3JkICAgIAkxMTY4CisJCQkgICAgTmVzdGVkICAgICAJRkFMU0UpCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDM4MQorCQkJICAgIGxvY2F0aW9uICAgCSgxNzYsIDMzNikKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlAMzc5CisJCQkgICAgaGVpZ2h0ICAgICAJNjAKKwkJCSAgICB5X2Nvb3JkICAgIAkwCisJCQkgICAgTmVzdGVkICAgICAJVFJVRSkKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBAMzgyCisJCQkgICAgbG9jYXRpb24gICAJKDE3NiwgNDgwKQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUAzNzkKKwkJCSAgICBoZWlnaHQgICAgIAk2MAorCQkJICAgIHlfY29vcmQgICAgCTAKKwkJCSAgICBOZXN0ZWQgICAgIAlUUlVFKQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEAzODMKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTc2LCAxNjE2KQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUAzNzkKKwkJCSAgICBoZWlnaHQgICAgIAk1ODAKKwkJCSAgICB5X2Nvb3JkICAgIAk1MjAKKwkJCSAgICBOZXN0ZWQgICAgIAlGQUxTRSkKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBAMzg0CisJCQkgICAgbG9jYXRpb24gICAJKDE3NiwgMTcyOCkKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlAMzc5CisJCQkgICAgaGVpZ2h0ICAgICAJNjAKKwkJCSAgICB5X2Nvb3JkICAgIAkwCisJCQkgICAgTmVzdGVkICAgICAJVFJVRSkpCisJCSAgICAob2JqZWN0IEludGVyT2JqVmlldyAiU3RhbmRhcmRIb3N0RGVwbG95ZXIiIEAzODUKKwkJCWxvY2F0aW9uICAgCSg0ODAsIDIyNCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlUUlVFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCisJCQkgICAgUGFyZW50X1ZpZXcgCUAzODUKKwkJCSAgICBsb2NhdGlvbiAgIAkoNDgwLCAyMjQpCisJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMgorCQkJICAgIG1heF93aWR0aCAgCTMwMQorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiU3RhbmRhcmRIb3N0RGVwbG95ZXIiKQorCQkJaWNvbl9zdHlsZSAJIkljb24iCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJcXVpZHUgICAgICAJIjNERkUxRDhBMDJEQyIKKwkJCXdpZHRoICAgICAgCTMxOQorCQkJaGVpZ2h0ICAgICAJMjQ0NgorCQkJaWNvbl9oZWlnaHQgCTAKKwkJCWljb25fd2lkdGggCTAKKwkJCWljb25feV9vZmZzZXQgCTAKKwkJCWFubm90YXRpb24gCTEKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBAMzg2CisJCQkgICAgbG9jYXRpb24gICAJKDQ4MCwgNTc2KQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUAzODUKKwkJCSAgICBoZWlnaHQgICAgIAk5MjgKKwkJCSAgICB5X2Nvb3JkICAgIAk4NjgKKwkJCSAgICBOZXN0ZWQgICAgIAlGQUxTRSkpCisJCSAgICAob2JqZWN0IEludGVyT2JqVmlldyAiU3RhbmRhcmRIb3N0IiBAMzg3CisJCQlsb2NhdGlvbiAgIAkoODAwLCAyMjQpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJVFJVRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAorCQkJICAgIFBhcmVudF9WaWV3IAlAMzg3CisJCQkgICAgbG9jYXRpb24gICAJKDgwMCwgMjI0KQorCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTIKKwkJCSAgICBtYXhfd2lkdGggIAkyODIKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJIlN0YW5kYXJkSG9zdCIpCisJCQlpY29uX3N0eWxlIAkiSWNvbiIKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQlxdWlkdSAgICAgIAkiM0RGRTFERjIwMTQxIgorCQkJd2lkdGggICAgICAJMzAwCisJCQloZWlnaHQgICAgIAkyNDQ2CisJCQlpY29uX2hlaWdodCAJMAorCQkJaWNvbl93aWR0aCAJMAorCQkJaWNvbl95X29mZnNldCAJMAorCQkJYW5ub3RhdGlvbiAJMQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEAzODgKKwkJCSAgICBsb2NhdGlvbiAgIAkoODAwLCA1OTIpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDM4NworCQkJICAgIGhlaWdodCAgICAgCTg1MgorCQkJICAgIHlfY29vcmQgICAgCTc5MgorCQkJICAgIE5lc3RlZCAgICAgCUZBTFNFKSkKKwkJICAgIChvYmplY3QgSW50ZXJPYmpWaWV3ICJTdGFuZGFyZENvbnRleHQiIEAzODkKKwkJCWxvY2F0aW9uICAgCSgxMTIwLCAyMjQpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJVFJVRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAorCQkJICAgIFBhcmVudF9WaWV3IAlAMzg5CisJCQkgICAgbG9jYXRpb24gICAJKDExMjAsIDIyNCkKKwkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkyCisJCQkgICAgbWF4X3dpZHRoICAJMjk1CisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJTdGFuZGFyZENvbnRleHQiKQorCQkJaWNvbl9zdHlsZSAJIkljb24iCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJcXVpZHUgICAgICAJIjNERkUxOTZEMDBEOSIKKwkJCXdpZHRoICAgICAgCTMxMworCQkJaGVpZ2h0ICAgICAJMjQ0NgorCQkJaWNvbl9oZWlnaHQgCTAKKwkJCWljb25fd2lkdGggCTAKKwkJCWljb25feV9vZmZzZXQgCTAKKwkJCWFubm90YXRpb24gCTEKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBAMzkwCisJCQkgICAgbG9jYXRpb24gICAJKDExMjAsIDYyNCkKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlAMzg5CisJCQkgICAgaGVpZ2h0ICAgICAJNzYwCisJCQkgICAgeV9jb29yZCAgICAJNzAwCisJCQkgICAgTmVzdGVkICAgICAJRkFMU0UpCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDM5MQorCQkJICAgIGxvY2F0aW9uICAgCSgxMTIwLCA4MDApCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDM4OQorCQkJICAgIGhlaWdodCAgICAgCTYwCisJCQkgICAgeV9jb29yZCAgICAJMAorCQkJICAgIE5lc3RlZCAgICAgCVRSVUUpCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDM5MgorCQkJICAgIGxvY2F0aW9uICAgCSgxMTIwLCA5NzYpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDM4OQorCQkJICAgIGhlaWdodCAgICAgCTYwCisJCQkgICAgeV9jb29yZCAgICAJMAorCQkJICAgIE5lc3RlZCAgICAgCVRSVUUpCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDM5MworCQkJICAgIGxvY2F0aW9uICAgCSgxMTIwLCAxMDcyKQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUAzODkKKwkJCSAgICBoZWlnaHQgICAgIAk2MAorCQkJICAgIHlfY29vcmQgICAgCTAKKwkJCSAgICBOZXN0ZWQgICAgIAlUUlVFKSkKKwkJICAgIChvYmplY3QgSW50ZXJPYmpWaWV3ICJXZWJhcHBMb2FkZXIiIEAzOTQKKwkJCWxvY2F0aW9uICAgCSgxNDQwLCAyMjQpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJVFJVRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAorCQkJICAgIFBhcmVudF9WaWV3IAlAMzk0CisJCQkgICAgbG9jYXRpb24gICAJKDE0NDAsIDIyNCkKKwkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkyCisJCQkgICAgbWF4X3dpZHRoICAJMjk1CisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJXZWJhcHBMb2FkZXIiKQorCQkJaWNvbl9zdHlsZSAJIkljb24iCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJcXVpZHUgICAgICAJIjNERkUxRkZBMDM0NyIKKwkJCXdpZHRoICAgICAgCTMxMworCQkJaGVpZ2h0ICAgICAJMjQ0NgorCQkJaWNvbl9oZWlnaHQgCTAKKwkJCWljb25fd2lkdGggCTAKKwkJCWljb25feV9vZmZzZXQgCTAKKwkJCWFubm90YXRpb24gCTEKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBAMzk1CisJCQkgICAgbG9jYXRpb24gICAJKDE0NDAsIDY0MCkKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlAMzk0CisJCQkgICAgaGVpZ2h0ICAgICAJNjAKKwkJCSAgICB5X2Nvb3JkICAgIAkwCisJCQkgICAgTmVzdGVkICAgICAJRkFMU0UpKQorCQkgICAgKG9iamVjdCBJbnRlck9ialZpZXcgIlN0YW5kYXJkTWFuYWdlciIgQDM5NgorCQkJbG9jYXRpb24gICAJKDE3NjAsIDIyNCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlUUlVFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCisJCQkgICAgUGFyZW50X1ZpZXcgCUAzOTYKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTc2MCwgMjI0KQorCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTIKKwkJCSAgICBtYXhfd2lkdGggIAkzMDEKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJIlN0YW5kYXJkTWFuYWdlciIpCisJCQlpY29uX3N0eWxlIAkiSWNvbiIKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQlxdWlkdSAgICAgIAkiM0RGRTIwMUYwMTA1IgorCQkJd2lkdGggICAgICAJMzE5CisJCQloZWlnaHQgICAgIAkyNDQ2CisJCQlpY29uX2hlaWdodCAJMAorCQkJaWNvbl93aWR0aCAJMAorCQkJaWNvbl95X29mZnNldCAJMAorCQkJYW5ub3RhdGlvbiAJMQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEAzOTcKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTc2MCwgODMyKQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUAzOTYKKwkJCSAgICBoZWlnaHQgICAgIAk2MAorCQkJICAgIHlfY29vcmQgICAgCTAKKwkJCSAgICBOZXN0ZWQgICAgIAlGQUxTRSkKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBAMzk4CisJCQkgICAgbG9jYXRpb24gICAJKDE3NjAsIDEyNjQpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDM5NgorCQkJICAgIGhlaWdodCAgICAgCTYwCisJCQkgICAgeV9jb29yZCAgICAJMAorCQkJICAgIE5lc3RlZCAgICAgCUZBTFNFKSkKKwkJICAgIChvYmplY3QgSW50ZXJPYmpWaWV3ICJDb250ZXh0Q29uZmlnIiBAMzk5CisJCQlsb2NhdGlvbiAgIAkoMTk1MiwgMzUyKQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCVRSVUUKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKKwkJCSAgICBQYXJlbnRfVmlldyAJQDM5OQorCQkJICAgIGxvY2F0aW9uICAgCSgxOTUyLCAzNTIpCisJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMgorCQkJICAgIG1heF93aWR0aCAgCTI4MgorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiQ29udGV4dENvbmZpZyIpCisJCQlpY29uX3N0eWxlIAkiSWNvbiIKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQlxdWlkdSAgICAgIAkiM0RGRTIwODcwMjhDIgorCQkJd2lkdGggICAgICAJMzAwCisJCQloZWlnaHQgICAgIAkyMzE4CisJCQlpY29uX2hlaWdodCAJMAorCQkJaWNvbl93aWR0aCAJMAorCQkJaWNvbl95X29mZnNldCAJMAorCQkJYW5ub3RhdGlvbiAJMQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEA0MDAKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTk1MiwgNDEyKQorCQkJICAgIEludGVyT2JqVmlldyAJQDM5OQorCQkJICAgIGhlaWdodCAgICAgCTYwCisJCQkgICAgeV9jb29yZCAgICAJMAorCQkJICAgIE5lc3RlZCAgICAgCUZBTFNFKQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEA0MDEKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTk1MiwgMTEzNikKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlAMzk5CisJCQkgICAgaGVpZ2h0ICAgICAJMTQ0NAorCQkJICAgIHlfY29vcmQgICAgCTEzODQKKwkJCSAgICBOZXN0ZWQgICAgIAlGQUxTRSkKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBANDAyCisJCQkgICAgbG9jYXRpb24gICAJKDE5NTIsIDEyNjQpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDM5OQorCQkJICAgIGhlaWdodCAgICAgCTYwCisJCQkgICAgeV9jb29yZCAgICAJMAorCQkJICAgIE5lc3RlZCAgICAgCVRSVUUpCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDQwMworCQkJICAgIGxvY2F0aW9uICAgCSgxOTUyLCAxNDU2KQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUAzOTkKKwkJCSAgICBoZWlnaHQgICAgIAkxMDcwCisJCQkgICAgeV9jb29yZCAgICAJMTAxMAorCQkJICAgIE5lc3RlZCAgICAgCVRSVUUpCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDQwNAorCQkJICAgIGxvY2F0aW9uICAgCSgxOTUyLCAxNTY4KQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUAzOTkKKwkJCSAgICBoZWlnaHQgICAgIAk5NTIKKwkJCSAgICB5X2Nvb3JkICAgIAk4OTIKKwkJCSAgICBOZXN0ZWQgICAgIAlUUlVFKQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEA0MDUKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTk1MiwgMTk4NCkKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlAMzk5CisJCQkgICAgaGVpZ2h0ICAgICAJMTUyCisJCQkgICAgeV9jb29yZCAgICAJOTIKKwkJCSAgICBOZXN0ZWQgICAgIAlUUlVFKSkKKwkJICAgIChvYmplY3QgU2VsZk1lc3NWaWV3ICIiIEA0MDYKKwkJCWxvY2F0aW9uICAgCSgxNiwgMzM2KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQwNworCQkJICAgIFBhcmVudF9WaWV3IAlANDA2CisJCQkgICAgbG9jYXRpb24gICAJKDI2NywgMjkyKQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkUxOUFFMDA2NSIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTEwOAorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkicGFyc2UiCisJCQkgICAgcGN0RGlzdCAgICAJMC41MDAwMDAKKwkJCSAgICBoZWlnaHQgICAgIAk0NQorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDM3OQorCQkJc3VwcGxpZXIgICAJQDM3OQorCQkJRm9jdXNfU3JjICAJQDM4MAorCQkJRm9jdXNfRW50cnkgCUAzODEKKwkJCW9yaWdpbiAgICAgCSgxOTIsIDMzNikKKwkJCXRlcm1pbnVzICAgCSgzNDIsIDMzNikKKwkJCW9yZGluYWwgICAgCTApCisJCSAgICAob2JqZWN0IFNlbGZNZXNzVmlldyAiIiBANDA4CisJCQlsb2NhdGlvbiAgIAkoMTYsIDQ4MCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0MDkKKwkJCSAgICBQYXJlbnRfVmlldyAJQDQwOAorCQkJICAgIGxvY2F0aW9uICAgCSgzMjgsIDQzNykKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZFMTlCMTAyRTkiCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAkyNjcKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJInN0YXJ0RWxlbWVudCgpIgorCQkJICAgIHBjdERpc3QgICAgCTAuOTA2NjY3CisJCQkgICAgaGVpZ2h0ICAgICAJNDQKKwkJCSAgICBvcmllbnRhdGlvbiAJMCkKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUAzNzkKKwkJCXN1cHBsaWVyICAgCUAzNzkKKwkJCUZvY3VzX1NyYyAgCUAzODAKKwkJCUZvY3VzX0VudHJ5IAlAMzgyCisJCQlvcmlnaW4gICAgIAkoMTkyLCA0ODApCisJCQl0ZXJtaW51cyAgIAkoMzQyLCA0ODApCisJCQlvcmRpbmFsICAgIAkxKQorCQkgICAgKG9iamVjdCBJbnRlck1lc3NWaWV3ICIiIEA0MTAKKwkJCWxvY2F0aW9uICAgCSgxNiwgNTc2KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQxMQorCQkJICAgIFBhcmVudF9WaWV3IAlANDEwCisJCQkgICAgbG9jYXRpb24gICAJKDMyNywgNTUyKQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkUxREZCMDAyMiIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTE2NQorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiYWRkQ2hpbGQiCisJCQkgICAgcGN0RGlzdCAgICAJMC40OTg2NDUKKwkJCSAgICBoZWlnaHQgICAgIAkyNQorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDM3OQorCQkJc3VwcGxpZXIgICAJQDM4NQorCQkJRm9jdXNfU3JjICAJQDM4MAorCQkJRm9jdXNfRW50cnkgCUAzODYKKwkJCW9yaWdpbiAgICAgCSgxOTEsIDU3NikKKwkJCXRlcm1pbnVzICAgCSg0NjQsIDU3NikKKwkJCW9yZGluYWwgICAgCTIpCisJCSAgICAob2JqZWN0IEludGVyTWVzc1ZpZXcgIiIgQDQxMgorCQkJbG9jYXRpb24gICAJKDE2LCA1OTIpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDEzCisJCQkgICAgUGFyZW50X1ZpZXcgCUA0MTIKKwkJCSAgICBsb2NhdGlvbiAgIAkoNjM5LCA1NDgpCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTFGQjYwMjc3IgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJMTY1CisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJhZGRDaGlsZCIKKwkJCSAgICBwY3REaXN0ICAgIAkwLjUwMDAwMAorCQkJICAgIGhlaWdodCAgICAgCTQ1CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlAMzg1CisJCQlzdXBwbGllciAgIAlAMzg3CisJCQlGb2N1c19TcmMgIAlAMzg2CisJCQlGb2N1c19FbnRyeSAJQDM4OAorCQkJb3JpZ2luICAgICAJKDQ5NSwgNTkyKQorCQkJdGVybWludXMgICAJKDc4NCwgNTkyKQorCQkJb3JkaW5hbCAgICAJMykKKwkJICAgIChvYmplY3QgSW50ZXJNZXNzVmlldyAiIiBANDE0CisJCQlsb2NhdGlvbiAgIAkoMTYsIDYyNCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0MTUKKwkJCSAgICBQYXJlbnRfVmlldyAJQDQxNAorCQkJICAgIGxvY2F0aW9uICAgCSg5NTksIDU4MCkKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZFMUZDNDAyMjgiCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAkxMTAKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJInN0YXJ0KCkiCisJCQkgICAgcGN0RGlzdCAgICAJMC41MDAwMDAKKwkJCSAgICBoZWlnaHQgICAgIAk0NQorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDM4NworCQkJc3VwcGxpZXIgICAJQDM4OQorCQkJRm9jdXNfU3JjICAJQDM4OAorCQkJRm9jdXNfRW50cnkgCUAzOTAKKwkJCW9yaWdpbiAgICAgCSg4MTUsIDYyNCkKKwkJCXRlcm1pbnVzICAgCSgxMTA0LCA2MjQpCisJCQlvcmRpbmFsICAgIAk0KQorCQkgICAgKG9iamVjdCBJbnRlck1lc3NWaWV3ICIiIEA0MTYKKwkJCWxvY2F0aW9uICAgCSgxNiwgNjQwKQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQxNworCQkJICAgIFBhcmVudF9WaWV3IAlANDE2CisJCQkgICAgbG9jYXRpb24gICAJKDEyNzksIDU5NikKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZFMjAwNjAzQkUiCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAk4MgorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkibmV3IgorCQkJICAgIHBjdERpc3QgICAgCTAuNTAwMDAwCisJCQkgICAgaGVpZ2h0ICAgICAJNDUKKwkJCSAgICBvcmllbnRhdGlvbiAJMCkKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUAzODkKKwkJCXN1cHBsaWVyICAgCUAzOTQKKwkJCUZvY3VzX1NyYyAgCUAzOTAKKwkJCUZvY3VzX0VudHJ5IAlAMzk1CisJCQlvcmlnaW4gICAgIAkoMTEzNSwgNjQwKQorCQkJdGVybWludXMgICAJKDE0MjQsIDY0MCkKKwkJCW9yZGluYWwgICAgCTUpCisJCSAgICAob2JqZWN0IFNlbGZNZXNzVmlldyAiIiBANDE4CisJCQlsb2NhdGlvbiAgIAkoMTYsIDgwMCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0MTkKKwkJCSAgICBQYXJlbnRfVmlldyAJQDQxOAorCQkJICAgIGxvY2F0aW9uICAgCSgxMjI0LCA3NTYpCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTIwMEMwMjlBIgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJMTg2CisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJzZXRMb2FkZXIiCisJCQkgICAgcGN0RGlzdCAgICAJMC41OTMzMzMKKwkJCSAgICBoZWlnaHQgICAgIAk0NQorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDM4OQorCQkJc3VwcGxpZXIgICAJQDM4OQorCQkJRm9jdXNfU3JjICAJQDM5MAorCQkJRm9jdXNfRW50cnkgCUAzOTEKKwkJCW9yaWdpbiAgICAgCSgxMTM2LCA4MDApCisJCQl0ZXJtaW51cyAgIAkoMTI4NiwgODAwKQorCQkJb3JkaW5hbCAgICAJNikKKwkJICAgIChvYmplY3QgSW50ZXJNZXNzVmlldyAiIiBANDIwCisJCQlsb2NhdGlvbiAgIAkoMTYsIDgzMikKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0MjEKKwkJCSAgICBQYXJlbnRfVmlldyAJQDQyMAorCQkJICAgIGxvY2F0aW9uICAgCSgxNDM5LCA3ODgpCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTIwMkMwMjUwIgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJODIKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJIm5ldyIKKwkJCSAgICBwY3REaXN0ICAgIAkwLjUwMDAwMAorCQkJICAgIGhlaWdodCAgICAgCTQ1CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlAMzg5CisJCQlzdXBwbGllciAgIAlAMzk2CisJCQlGb2N1c19TcmMgIAlAMzkwCisJCQlGb2N1c19FbnRyeSAJQDM5NworCQkJb3JpZ2luICAgICAJKDExMzUsIDgzMikKKwkJCXRlcm1pbnVzICAgCSgxNzQ0LCA4MzIpCisJCQlvcmRpbmFsICAgIAk3KQorCQkgICAgKG9iamVjdCBTZWxmTWVzc1ZpZXcgIiIgQDQyMgorCQkJbG9jYXRpb24gICAJKDE2LCA5NzYpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDIzCisJCQkgICAgUGFyZW50X1ZpZXcgCUA0MjIKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTI2MCwgOTMzKQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkUyMDMyMDAxQyIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTIyMQorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkic2V0TWFuYWdlciIKKwkJCSAgICBwY3REaXN0ICAgIAkwLjgzMzMzMworCQkJICAgIGhlaWdodCAgICAgCTQ0CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlAMzg5CisJCQlzdXBwbGllciAgIAlAMzg5CisJCQlGb2N1c19TcmMgIAlAMzkwCisJCQlGb2N1c19FbnRyeSAJQDM5MgorCQkJb3JpZ2luICAgICAJKDExMzYsIDk3NikKKwkJCXRlcm1pbnVzICAgCSgxMjg2LCA5NzYpCisJCQlvcmRpbmFsICAgIAk4KQorCQkgICAgKG9iamVjdCBTZWxmTWVzc1ZpZXcgIiIgQDQyNAorCQkJbG9jYXRpb24gICAJKDE2LCAxMDcyKQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQyNQorCQkJICAgIFBhcmVudF9WaWV3IAlANDI0CisJCQkgICAgbG9jYXRpb24gICAJKDE0ODEsIDEwNDMpCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTIwNUIwMUEyIgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJNjU4CisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJmaXJlTGlmZWN5Y2xlRXZlbnQoU1RBUlRfRVZFTlQpIgorCQkJICAgIHBjdERpc3QgICAgCTIuMzA2NjY3CisJCQkgICAgaGVpZ2h0ICAgICAJMzAKKwkJCSAgICBvcmllbnRhdGlvbiAJMCkKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUAzODkKKwkJCXN1cHBsaWVyICAgCUAzODkKKwkJCUZvY3VzX1NyYyAgCUAzOTAKKwkJCUZvY3VzX0VudHJ5IAlAMzkzCisJCQlvcmlnaW4gICAgIAkoMTEzNiwgMTA3MikKKwkJCXRlcm1pbnVzICAgCSgxMjg2LCAxMDcyKQorCQkJb3JkaW5hbCAgICAJOSkKKwkJICAgIChvYmplY3QgSW50ZXJNZXNzVmlldyAiIiBANDI2CisJCQlsb2NhdGlvbiAgIAkoMTYsIDExMzYpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDI3CisJCQkgICAgUGFyZW50X1ZpZXcgCUA0MjYKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTUzNSwgMTA5MikKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZFMjA5NjAwMDMiCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAk3NDUKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJIiAvLyBOb3RpZnkgaW50ZXJlc3RlZCBMaWZlY3ljbGVMaXN0ZW5lcnMiCisJCQkgICAgcGN0RGlzdCAgICAJMC41MDAwMDAKKwkJCSAgICBoZWlnaHQgICAgIAk0NQorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDM4OQorCQkJc3VwcGxpZXIgICAJQDM5OQorCQkJRm9jdXNfU3JjICAJQDM5MAorCQkJRm9jdXNfRW50cnkgCUA0MDEKKwkJCW9yaWdpbiAgICAgCSgxMTM1LCAxMTM2KQorCQkJdGVybWludXMgICAJKDE5MzYsIDExMzYpCisJCQlvcmRpbmFsICAgIAkxMCkKKwkJICAgIChvYmplY3QgU2VsZk1lc3NWaWV3ICIiIEA0MjgKKwkJCWxvY2F0aW9uICAgCSgxNiwgMTI2NCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0MjkKKwkJCSAgICBQYXJlbnRfVmlldyAJQDQyOAorCQkJICAgIGxvY2F0aW9uICAgCSgyMDQzLCAxMjIwKQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkUyMENGMDE4QyIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTExMAorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkic3RhcnQoKSIKKwkJCSAgICBwY3REaXN0ICAgIAkwLjUwMDAwMAorCQkJICAgIGhlaWdodCAgICAgCTQ1CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlAMzk5CisJCQlzdXBwbGllciAgIAlAMzk5CisJCQlGb2N1c19TcmMgIAlANDAxCisJCQlGb2N1c19FbnRyeSAJQDQwMgorCQkJb3JpZ2luICAgICAJKDE5NjgsIDEyNjQpCisJCQl0ZXJtaW51cyAgIAkoMjExOCwgMTI2NCkKKwkJCW9yZGluYWwgICAgCTExKQorCQkgICAgKG9iamVjdCBTZWxmTWVzc1ZpZXcgIiIgQDQzMAorCQkJbG9jYXRpb24gICAJKDE2LCAxNDU2KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQzMQorCQkJICAgIFBhcmVudF9WaWV3IAlANDMwCisJCQkgICAgbG9jYXRpb24gICAJKDIwMjcsIDE0MTMpCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTIwRTMwM0UyIgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJMjc1CisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJkZWZhdWx0Q29uZmlnKCkiCisJCQkgICAgcGN0RGlzdCAgICAJMC4zOTMzMzMKKwkJCSAgICBoZWlnaHQgICAgIAk0NAorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDM5OQorCQkJc3VwcGxpZXIgICAJQDM5OQorCQkJRm9jdXNfU3JjICAJQDQwMQorCQkJRm9jdXNfRW50cnkgCUA0MDMKKwkJCW9yaWdpbiAgICAgCSgxOTY4LCAxNDU2KQorCQkJdGVybWludXMgICAJKDIxMTgsIDE0NTYpCisJCQlvcmRpbmFsICAgIAkxMykKKwkJICAgIChvYmplY3QgU2VsZk1lc3NWaWV3ICIiIEA0MzIKKwkJCWxvY2F0aW9uICAgCSgxNiwgMTU2OCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0MzMKKwkJCSAgICBQYXJlbnRfVmlldyAJQDQzMgorCQkJICAgIGxvY2F0aW9uICAgCSgyMDQzLCAxNTI0KQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkUyMTFEMDFBMSIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTM0OQorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiYXBwbGljYXRpb25Db25maWcoKSIKKwkJCSAgICBwY3REaXN0ICAgIAkwLjUwMDAwMAorCQkJICAgIGhlaWdodCAgICAgCTQ1CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlAMzk5CisJCQlzdXBwbGllciAgIAlAMzk5CisJCQlGb2N1c19TcmMgIAlANDAxCisJCQlGb2N1c19FbnRyeSAJQDQwNAorCQkJb3JpZ2luICAgICAJKDE5NjgsIDE1NjgpCisJCQl0ZXJtaW51cyAgIAkoMjExOCwgMTU2OCkKKwkJCW9yZGluYWwgICAgCTE0KQorCQkgICAgKG9iamVjdCBJbnRlck1lc3NWaWV3ICIiIEA0MzQKKwkJCWxvY2F0aW9uICAgCSgxNjY0LCAxMjY0KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQzNQorCQkJICAgIFBhcmVudF9WaWV3IAlANDM0CisJCQkgICAgbG9jYXRpb24gICAJKDE0MzksIDEyMjApCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTIwQjYwMEU1IgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJMTEwCisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJzdGFydCgpIgorCQkJICAgIHBjdERpc3QgICAgCTAuNTAwMDAwCisJCQkgICAgaGVpZ2h0ICAgICAJNDUKKwkJCSAgICBvcmllbnRhdGlvbiAJMCkKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUAzODkKKwkJCXN1cHBsaWVyICAgCUAzOTYKKwkJCUZvY3VzX1NyYyAgCUAzOTAKKwkJCUZvY3VzX0VudHJ5IAlAMzk4CisJCQlvcmlnaW4gICAgIAkoMTEzNSwgMTI2NCkKKwkJCXRlcm1pbnVzICAgCSgxNzQ0LCAxMjY0KQorCQkJb3JkaW5hbCAgICAJMTIpCisJCSAgICAob2JqZWN0IEludGVyTWVzc1ZpZXcgIiIgQDQzNgorCQkJbG9jYXRpb24gICAJKDE2LCAxNjE2KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQzNworCQkJICAgIFBhcmVudF9WaWV3IAlANDM2CisJCQkgICAgbG9jYXRpb24gICAJKDEwNjQsIDE1NzIpCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTIxQjYwMjg4IgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJMTQ1CisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJjcmVhdGUoKSIKKwkJCSAgICBwY3REaXN0ICAgIAkwLjUwMDAwMAorCQkJICAgIGhlaWdodCAgICAgCTQ1CisJCQkgICAgb3JpZW50YXRpb24gCTEpCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlAMzk5CisJCQlzdXBwbGllciAgIAlAMzc5CisJCQlGb2N1c19TcmMgIAlANDA0CisJCQlGb2N1c19FbnRyeSAJQDM4MworCQkJb3JpZ2luICAgICAJKDE5MzYsIDE2MTYpCisJCQl0ZXJtaW51cyAgIAkoMTkyLCAxNjE2KQorCQkJb3JkaW5hbCAgICAJMTUpCisJCSAgICAob2JqZWN0IFNlbGZNZXNzVmlldyAiIiBANDM4CisJCQlsb2NhdGlvbiAgIAkoMTYsIDE3MjgpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDM5CisJCQkgICAgUGFyZW50X1ZpZXcgCUA0MzgKKwkJCSAgICBsb2NhdGlvbiAgIAkoNDU3LCAxNzAxKQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkUyMUJFMDIxQiIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTUzMAorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiLy8gUHJvY2VzcyB3ZWIueG1sICogdGxkLnhtbCIKKwkJCSAgICBwY3REaXN0ICAgIAkxLjc3MzMzMworCQkJICAgIGhlaWdodCAgICAgCTI4CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlAMzc5CisJCQlzdXBwbGllciAgIAlAMzc5CisJCQlGb2N1c19TcmMgIAlAMzgzCisJCQlGb2N1c19FbnRyeSAJQDM4NAorCQkJb3JpZ2luICAgICAJKDE5MiwgMTcyOCkKKwkJCXRlcm1pbnVzICAgCSgzNDIsIDE3MjgpCisJCQlvcmRpbmFsICAgIAkxNikKKwkJICAgIChvYmplY3QgSW50ZXJPYmpWaWV3ICJTdGFuZGFyZFdyYXBwZXIiIEA0NDAKKwkJCWxvY2F0aW9uICAgCSgyMjA4LCAyMjQpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJVFJVRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAorCQkJICAgIFBhcmVudF9WaWV3IAlANDQwCisJCQkgICAgbG9jYXRpb24gICAJKDIyMDgsIDIyNCkKKwkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkyCisJCQkgICAgbWF4X3dpZHRoICAJMjgyCisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJTdGFuZGFyZFdyYXBwZXIiKQorCQkJaWNvbl9zdHlsZSAJIkljb24iCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJcXVpZHUgICAgICAJIjNERkUyMjBDMDEyMiIKKwkJCXdpZHRoICAgICAgCTMwMAorCQkJaGVpZ2h0ICAgICAJMjQ0NgorCQkJaWNvbl9oZWlnaHQgCTAKKwkJCWljb25fd2lkdGggCTAKKwkJCWljb25feV9vZmZzZXQgCTAKKwkJCWFubm90YXRpb24gCTEKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBANDQxCisJCQkgICAgbG9jYXRpb24gICAJKDIyMDgsIDIwMTYpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDQ0MAorCQkJICAgIGhlaWdodCAgICAgCTYwCisJCQkgICAgeV9jb29yZCAgICAJMAorCQkJICAgIE5lc3RlZCAgICAgCUZBTFNFKQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEA0NDIKKwkJCSAgICBsb2NhdGlvbiAgIAkoMjIwOCwgMjE3NikKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlANDQwCisJCQkgICAgaGVpZ2h0ICAgICAJNjAKKwkJCSAgICB5X2Nvb3JkICAgIAkwCisJCQkgICAgTmVzdGVkICAgICAJRkFMU0UpCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDQ0MworCQkJICAgIGxvY2F0aW9uICAgCSgyMjA4LCAyMjg4KQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUA0NDAKKwkJCSAgICBoZWlnaHQgICAgIAk2MAorCQkJICAgIHlfY29vcmQgICAgCTAKKwkJCSAgICBOZXN0ZWQgICAgIAlGQUxTRSkKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBANDQ0CisJCQkgICAgbG9jYXRpb24gICAJKDIyMDgsIDI0MDApCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDQ0MAorCQkJICAgIGhlaWdodCAgICAgCTYwCisJCQkgICAgeV9jb29yZCAgICAJMAorCQkJICAgIE5lc3RlZCAgICAgCUZBTFNFKSkKKwkJICAgIChvYmplY3QgSW50ZXJNZXNzVmlldyAiIiBANDQ1CisJCQlsb2NhdGlvbiAgIAkoMTYsIDE5ODQpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDQ2CisJCQkgICAgUGFyZW50X1ZpZXcgCUA0NDUKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTA2MywgMTk0MCkKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZFMjI4QjAzQkEiCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAkxNDc4CisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJjcmVhdGVXYXJwcGVyKCkgLy8gSW52b2tlZCBieSBhIFdlYldyYXBwZXJSdWxlIChub3QgRGlyZWN0bHkgYnkgdGhlIERpZ2VzdGVyKSIKKwkJCSAgICBwY3REaXN0ICAgIAkwLjUwMDAwMAorCQkJICAgIGhlaWdodCAgICAgCTQ1CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlAMzc5CisJCQlzdXBwbGllciAgIAlAMzk5CisJCQlGb2N1c19TcmMgIAlAMzgzCisJCQlGb2N1c19FbnRyeSAJQDQwNQorCQkJb3JpZ2luICAgICAJKDE5MSwgMTk4NCkKKwkJCXRlcm1pbnVzICAgCSgxOTM2LCAxOTg0KQorCQkJb3JkaW5hbCAgICAJMTcpCisJCSAgICAob2JqZWN0IEludGVyTWVzc1ZpZXcgIiIgQDQ0NworCQkJbG9jYXRpb24gICAJKDE2LCAyMDE2KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ0OAorCQkJICAgIFBhcmVudF9WaWV3IAlANDQ3CisJCQkgICAgbG9jYXRpb24gICAJKDIwNzksIDE5NzIpCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTIyOUEwMDA0IgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJODIKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJIm5ldyIKKwkJCSAgICBwY3REaXN0ICAgIAkwLjUwMDAwMAorCQkJICAgIGhlaWdodCAgICAgCTQ1CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlAMzk5CisJCQlzdXBwbGllciAgIAlANDQwCisJCQlGb2N1c19TcmMgIAlANDA1CisJCQlGb2N1c19FbnRyeSAJQDQ0MQorCQkJb3JpZ2luICAgICAJKDE5NjcsIDIwMTYpCisJCQl0ZXJtaW51cyAgIAkoMjE5MiwgMjAxNikKKwkJCW9yZGluYWwgICAgCTE4KQorCQkgICAgKG9iamVjdCBJbnRlck1lc3NWaWV3ICIiIEA0NDkKKwkJCWxvY2F0aW9uICAgCSgxNiwgMjE3NikKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NTAKKwkJCSAgICBQYXJlbnRfVmlldyAJQDQ0OQorCQkJICAgIGxvY2F0aW9uICAgCSgyMTE2LCAyMTM0KQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkUyMkE3MDBDMSIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTQwNQorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiYWRkSW5zdGFuY2VMaXN0ZW5lcigpIgorCQkJICAgIHBjdERpc3QgICAgCTAuNjYyMjk1CisJCQkgICAgaGVpZ2h0ICAgICAJNDMKKwkJCSAgICBvcmllbnRhdGlvbiAJMCkKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUAzOTkKKwkJCXN1cHBsaWVyICAgCUA0NDAKKwkJCUZvY3VzX1NyYyAgCUA0MDQKKwkJCUZvY3VzX0VudHJ5IAlANDQyCisJCQlvcmlnaW4gICAgIAkoMTk2NywgMjE3NikKKwkJCXRlcm1pbnVzICAgCSgyMTkyLCAyMTc2KQorCQkJb3JkaW5hbCAgICAJMTkpCisJCSAgICAob2JqZWN0IEludGVyTWVzc1ZpZXcgIiIgQDQ1MQorCQkJbG9jYXRpb24gICAJKDI0OTYsIDIyODgpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDUyCisJCQkgICAgUGFyZW50X1ZpZXcgCUA0NTEKKwkJCSAgICBsb2NhdGlvbiAgIAkoMjExNiwgMjI0NSkKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZFMjJDNzAxQ0MiCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAk0MTAKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJImFkZExpZmVjeWNsZUxpc3RlbmVyKCkiCisJCQkgICAgcGN0RGlzdCAgICAJMC42NjIyOTUKKwkJCSAgICBoZWlnaHQgICAgIAk0NAorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDM5OQorCQkJc3VwcGxpZXIgICAJQDQ0MAorCQkJRm9jdXNfU3JjICAJQDQwNAorCQkJRm9jdXNfRW50cnkgCUA0NDMKKwkJCW9yaWdpbiAgICAgCSgxOTY3LCAyMjg4KQorCQkJdGVybWludXMgICAJKDIxOTIsIDIyODgpCisJCQlvcmRpbmFsICAgIAkyMCkKKwkJICAgIChvYmplY3QgSW50ZXJNZXNzVmlldyAiIiBANDUzCisJCQlsb2NhdGlvbiAgIAkoMTYsIDI0MDApCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDU0CisJCQkgICAgUGFyZW50X1ZpZXcgCUA0NTMKKwkJCSAgICBsb2NhdGlvbiAgIAkoMjEyNCwgMjM1NykKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZFMjJFODAzNjQiCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAk0MjgKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJImFkZENvbnRhaW5lckxpc3RlbmVyKCkiCisJCQkgICAgcGN0RGlzdCAgICAJMC43MDE2MzkKKwkJCSAgICBoZWlnaHQgICAgIAk0NAorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDM5OQorCQkJc3VwcGxpZXIgICAJQDQ0MAorCQkJRm9jdXNfU3JjICAJQDQwNAorCQkJRm9jdXNfRW50cnkgCUA0NDQKKwkJCW9yaWdpbiAgICAgCSgxOTY3LCAyNDAwKQorCQkJdGVybWludXMgICAJKDIxOTIsIDI0MDApCisJCQlvcmRpbmFsICAgIAkyMSkKKwkJICAgIChvYmplY3QgTm90ZVZpZXcgQDQ1NQorCQkJbG9jYXRpb24gICAJKDEyMTYsIDgwKQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCisJCQkgICAgUGFyZW50X1ZpZXcgCUA0NTUKKwkJCSAgICBsb2NhdGlvbiAgIAkoODI1LCAxNCkKKwkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJICAgIG5saW5lcyAgICAgCTIKKwkJCSAgICBtYXhfd2lkdGggIAk3NDYKKwkJCSAgICBsYWJlbCAgICAgIAkiRGVwbG95IEFwcC4iKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCXdpZHRoICAgICAgCTgwNgorCQkJaGVpZ2h0ICAgICAJMTQ0KQorCQkgICAgKG9iamVjdCBOb3RlVmlldyBANDU2CisJCQlsb2NhdGlvbiAgIAkoMjE0NCwgMjcwNCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAorCQkJICAgIFBhcmVudF9WaWV3IAlANDU2CisJCQkgICAgbG9jYXRpb24gICAJKDE5NTMsIDI2NDEpCisJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCSAgICBubGluZXMgICAgIAkyCisJCQkgICAgbWF4X3dpZHRoICAJMzQ3CisJCQkgICAgbGFiZWwgICAgICAJIiM0IENhdGFsaW5hLnN0YXJ0KCkiKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCXdpZHRoICAgICAgCTQwNworCQkJaGVpZ2h0ICAgICAJMTM4KSkpCisJICAgIChvYmplY3QgSW50ZXJhY3Rpb25EaWFncmFtICIxLiBjYXRhbGluYV9yZXF1ZXN0IgorCQltZWNoYW5pc21fcmVmIAlAODgKKwkJcXVpZCAgICAgICAJIjNERkUzQjUwMDFDMyIKKwkJdGl0bGUgICAgICAJIjEuIGNhdGFsaW5hX3JlcXVlc3QiCisJCXpvb20gICAgICAgCTEwMAorCQltYXhfaGVpZ2h0IAkyODM1MAorCQltYXhfd2lkdGggIAkyMTYwMAorCQlvcmlnaW5feCAgIAkwCisJCW9yaWdpbl95ICAgCTAKKwkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKKwkJICAgIChvYmplY3QgSW50ZXJPYmpWaWV3ICJUaHJlYWRQb29sIiBANDU3CisJCQlsb2NhdGlvbiAgIAkoMTc2LCAyMjQpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJVFJVRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAorCQkJICAgIFBhcmVudF9WaWV3IAlANDU3CisJCQkgICAgbG9jYXRpb24gICAJKDE3NiwgMjI0KQorCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTIKKwkJCSAgICBtYXhfd2lkdGggIAkyODIKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJIlRocmVhZFBvb2wiKQorCQkJaWNvbl9zdHlsZSAJIkljb24iCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJcXVpZHUgICAgICAJIjNERkU0MDJCMDJDNSIKKwkJCXdpZHRoICAgICAgCTMwMAorCQkJaGVpZ2h0ICAgICAJMTI3NgorCQkJaWNvbl9oZWlnaHQgCTAKKwkJCWljb25fd2lkdGggCTAKKwkJCWljb25feV9vZmZzZXQgCTAKKwkJCWFubm90YXRpb24gCTEKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBANDU4CisJCQkgICAgbG9jYXRpb24gICAJKDE3NiwgMzg0KQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUA0NTcKKwkJCSAgICBoZWlnaHQgICAgIAkzMDQKKwkJCSAgICB5X2Nvb3JkICAgIAkyNDQKKwkJCSAgICBOZXN0ZWQgICAgIAlGQUxTRSkpCisJCSAgICAob2JqZWN0IEludGVyT2JqVmlldyAiVGNwV29ya2VyVGhyZWFkIiBANDU5CisJCQlsb2NhdGlvbiAgIAkoNTEyLCAyMjQpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJVFJVRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAorCQkJICAgIFBhcmVudF9WaWV3IAlANDU5CisJCQkgICAgbG9jYXRpb24gICAJKDUxMiwgMjI0KQorCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTIKKwkJCSAgICBtYXhfd2lkdGggIAkzMzIKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJIlRjcFdvcmtlclRocmVhZCIpCisJCQlpY29uX3N0eWxlIAkiSWNvbiIKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQlxdWlkdSAgICAgIAkiM0RGRTQwMzIwMEY4IgorCQkJd2lkdGggICAgICAJMzUwCisJCQloZWlnaHQgICAgIAkxMjc2CisJCQlpY29uX2hlaWdodCAJMAorCQkJaWNvbl93aWR0aCAJMAorCQkJaWNvbl95X29mZnNldCAJMAorCQkJYW5ub3RhdGlvbiAJMQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEA0NjAKKwkJCSAgICBsb2NhdGlvbiAgIAkoNTEyLCAzODQpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDQ1OQorCQkJICAgIGhlaWdodCAgICAgCTI0NAorCQkJICAgIHlfY29vcmQgICAgCTE4NAorCQkJICAgIE5lc3RlZCAgICAgCUZBTFNFKSkKKwkJICAgIChvYmplY3QgSW50ZXJPYmpWaWV3ICJIdHRwMTFQcm90b2NvbCIgQDQ2MQorCQkJbG9jYXRpb24gICAJKDg0OCwgMjI0KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCVRSVUUKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKKwkJCSAgICBQYXJlbnRfVmlldyAJQDQ2MQorCQkJICAgIGxvY2F0aW9uICAgCSg4NDgsIDIyNCkKKwkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkyCisJCQkgICAgbWF4X3dpZHRoICAJMjgyCisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJIdHRwMTFQcm90b2NvbCIpCisJCQlpY29uX3N0eWxlIAkiSWNvbiIKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQlxdWlkdSAgICAgIAkiM0RGRTQwNzUwMTc3IgorCQkJd2lkdGggICAgICAJMzAwCisJCQloZWlnaHQgICAgIAkxMjc2CisJCQlpY29uX2hlaWdodCAJMAorCQkJaWNvbl93aWR0aCAJMAorCQkJaWNvbl95X29mZnNldCAJMAorCQkJYW5ub3RhdGlvbiAJMQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEA0NjIKKwkJCSAgICBsb2NhdGlvbiAgIAkoODQ4LCA0MDApCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDQ2MQorCQkJICAgIGhlaWdodCAgICAgCTE2OAorCQkJICAgIHlfY29vcmQgICAgCTEwOAorCQkJICAgIE5lc3RlZCAgICAgCUZBTFNFKQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEA0NjMKKwkJCSAgICBsb2NhdGlvbiAgIAkoODQ4LCA0NDgpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDQ2MQorCQkJICAgIGhlaWdodCAgICAgCTYwCisJCQkgICAgeV9jb29yZCAgICAJMAorCQkJICAgIE5lc3RlZCAgICAgCVRSVUUpCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDQ2NAorCQkJICAgIGxvY2F0aW9uICAgCSg4NDgsIDU5MikKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlANDYxCisJCQkgICAgaGVpZ2h0ICAgICAJMTIwCisJCQkgICAgeV9jb29yZCAgICAJNjAKKwkJCSAgICBOZXN0ZWQgICAgIAlGQUxTRSkKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBANDY1CisJCQkgICAgbG9jYXRpb24gICAJKDg0OCwgNTkyKQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUA0NjEKKwkJCSAgICBoZWlnaHQgICAgIAk2MAorCQkJICAgIHlfY29vcmQgICAgCTAKKwkJCSAgICBOZXN0ZWQgICAgIAlUUlVFKQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEA0NjYKKwkJCSAgICBsb2NhdGlvbiAgIAkoODQ4LCA3MzYpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDQ2MQorCQkJICAgIGhlaWdodCAgICAgCTY3NAorCQkJICAgIHlfY29vcmQgICAgCTYxNAorCQkJICAgIE5lc3RlZCAgICAgCUZBTFNFKQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEA0NjcKKwkJCSAgICBsb2NhdGlvbiAgIAkoODQ4LCA3MzYpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDQ2MQorCQkJICAgIGhlaWdodCAgICAgCTYwCisJCQkgICAgeV9jb29yZCAgICAJMAorCQkJICAgIE5lc3RlZCAgICAgCVRSVUUpKQorCQkgICAgKG9iamVjdCBJbnRlck9ialZpZXcgIkNveW90ZUFkYXB0ZXIiIEA0NjgKKwkJCWxvY2F0aW9uICAgCSgxMTY4LCAyMjQpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJVFJVRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAorCQkJICAgIFBhcmVudF9WaWV3IAlANDY4CisJCQkgICAgbG9jYXRpb24gICAJKDExNjgsIDIyNCkKKwkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkyCisJCQkgICAgbWF4X3dpZHRoICAJMjgyCisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJDb3lvdGVBZGFwdGVyIikKKwkJCWljb25fc3R5bGUgCSJJY29uIgorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCXF1aWR1ICAgICAgCSIzREZFNDEwNjAwREYiCisJCQl3aWR0aCAgICAgIAkzMDAKKwkJCWhlaWdodCAgICAgCTEyNzYKKwkJCWljb25faGVpZ2h0IAkwCisJCQlpY29uX3dpZHRoIAkwCisJCQlpY29uX3lfb2Zmc2V0IAkwCisJCQlhbm5vdGF0aW9uIAkxCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDQ2OQorCQkJICAgIGxvY2F0aW9uICAgCSgxMTY4LCA4NDgpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDQ2OAorCQkJICAgIGhlaWdodCAgICAgCTUwMgorCQkJICAgIHlfY29vcmQgICAgCTQ0MgorCQkJICAgIE5lc3RlZCAgICAgCUZBTFNFKQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEA0NzAKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTE2OCwgOTQ0KQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUA0NjgKKwkJCSAgICBoZWlnaHQgICAgIAkzNTIKKwkJCSAgICB5X2Nvb3JkICAgIAkyOTIKKwkJCSAgICBOZXN0ZWQgICAgIAlUUlVFKQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEA0NzEKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTE2OCwgOTQ0KQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUA0NjgKKwkJCSAgICBoZWlnaHQgICAgIAk2MAorCQkJICAgIHlfY29vcmQgICAgCTAKKwkJCSAgICBOZXN0ZWQgICAgIAlUUlVFKSkKKwkJICAgIChvYmplY3QgSW50ZXJPYmpWaWV3ICJTdGFuZGFyZEVuZ2luZSIgQDQ3MgorCQkJbG9jYXRpb24gICAJKDE1MjAsIDIyNCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlUUlVFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCisJCQkgICAgUGFyZW50X1ZpZXcgCUA0NzIKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTUyMCwgMjI0KQorCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTIKKwkJCSAgICBtYXhfd2lkdGggIAkzNjMKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJIlN0YW5kYXJkRW5naW5lIikKKwkJCWljb25fc3R5bGUgCSJJY29uIgorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCXF1aWR1ICAgICAgCSIzREZFNDI0QjAzNDkiCisJCQl3aWR0aCAgICAgIAkzODEKKwkJCWhlaWdodCAgICAgCTEyNzYKKwkJCWljb25faGVpZ2h0IAkwCisJCQlpY29uX3dpZHRoIAkwCisJCQlpY29uX3lfb2Zmc2V0IAkwCisJCQlhbm5vdGF0aW9uIAkxCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDQ3MworCQkJICAgIGxvY2F0aW9uICAgCSgxNTIwLCAxMDA4KQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUA0NzIKKwkJCSAgICBoZWlnaHQgICAgIAkyMjgKKwkJCSAgICB5X2Nvb3JkICAgIAkxNjgKKwkJCSAgICBOZXN0ZWQgICAgIAlGQUxTRSkpCisJCSAgICAob2JqZWN0IEludGVyT2JqVmlldyAiU3RhbmRhcmRQaXBlbGluZSIgQDQ3NAorCQkJbG9jYXRpb24gICAJKDE4NzIsIDIyNCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlUUlVFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCisJCQkgICAgUGFyZW50X1ZpZXcgCUA0NzQKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTg3MiwgMjI0KQorCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTIKKwkJCSAgICBtYXhfd2lkdGggIAkyODIKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJIlN0YW5kYXJkUGlwZWxpbmUiKQorCQkJaWNvbl9zdHlsZSAJIkljb24iCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJcXVpZHUgICAgICAJIjNERkU0MjkwMDA0NSIKKwkJCXdpZHRoICAgICAgCTMwMAorCQkJaGVpZ2h0ICAgICAJMTI3NgorCQkJaWNvbl9oZWlnaHQgCTAKKwkJCWljb25fd2lkdGggCTAKKwkJCWljb25feV9vZmZzZXQgCTAKKwkJCWFubm90YXRpb24gCTEKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBANDc1CisJCQkgICAgbG9jYXRpb24gICAJKDE4NzIsIDEwNDApCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDQ3NAorCQkJICAgIGhlaWdodCAgICAgCTEzNgorCQkJICAgIHlfY29vcmQgICAgCTc2CisJCQkgICAgTmVzdGVkICAgICAJRkFMU0UpKQorCQkgICAgKG9iamVjdCBJbnRlck9ialZpZXcgIlN0YW5kYXJkVmFsdmVDb250ZXh0IiBANDc2CisJCQlsb2NhdGlvbiAgIAkoMjE5MiwgMjI0KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCVRSVUUKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKKwkJCSAgICBQYXJlbnRfVmlldyAJQDQ3NgorCQkJICAgIGxvY2F0aW9uICAgCSgyMTkyLCAyMjQpCisJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMgorCQkJICAgIG1heF93aWR0aCAgCTI4MgorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiU3RhbmRhcmRWYWx2ZUNvbnRleHQiKQorCQkJaWNvbl9zdHlsZSAJIkljb24iCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJcXVpZHUgICAgICAJIjNERkU0MkMwMDJCMSIKKwkJCXdpZHRoICAgICAgCTMwMAorCQkJaGVpZ2h0ICAgICAJMTI3NgorCQkJaWNvbl9oZWlnaHQgCTAKKwkJCWljb25fd2lkdGggCTAKKwkJCWljb25feV9vZmZzZXQgCTAKKwkJCWFubm90YXRpb24gCTEKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBANDc3CisJCQkgICAgbG9jYXRpb24gICAJKDIxOTIsIDEwNTYpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDQ3NgorCQkJICAgIGhlaWdodCAgICAgCTYwCisJCQkgICAgeV9jb29yZCAgICAJMAorCQkJICAgIE5lc3RlZCAgICAgCUZBTFNFKSkKKwkJICAgIChvYmplY3QgSW50ZXJNZXNzVmlldyAiIiBANDc4CisJCQlsb2NhdGlvbiAgIAkoMTYsIDM4NCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NzkKKwkJCSAgICBQYXJlbnRfVmlldyAJQDQ3OAorCQkJICAgIGxvY2F0aW9uICAgCSgzNDMsIDM0MCkKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZFNDBFNzAxQUUiCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAkxMTIKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJInJ1bkl0KCkiCisJCQkgICAgcGN0RGlzdCAgICAJMC41MDAwMDAKKwkJCSAgICBoZWlnaHQgICAgIAk0NQorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDQ1NworCQkJc3VwcGxpZXIgICAJQDQ1OQorCQkJRm9jdXNfU3JjICAJQDQ1OAorCQkJRm9jdXNfRW50cnkgCUA0NjAKKwkJCW9yaWdpbiAgICAgCSgxOTEsIDM4NCkKKwkJCXRlcm1pbnVzICAgCSg0OTYsIDM4NCkKKwkJCW9yZGluYWwgICAgCTApCisJCSAgICAob2JqZWN0IEludGVyTWVzc1ZpZXcgIiIgQDQ4MAorCQkJbG9jYXRpb24gICAJKDE2LCA0MDApCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDgxCisJCQkgICAgUGFyZW50X1ZpZXcgCUA0ODAKKwkJCSAgICBsb2NhdGlvbiAgIAkoNjc5LCAzNTYpCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTQwRkMwMTBFIgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJMzU5CisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJwcm9jZXNzQ29ubmVjdGlvbiIKKwkJCSAgICBwY3REaXN0ICAgIAkwLjUwMDAwMAorCQkJICAgIGhlaWdodCAgICAgCTQ1CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlANDU5CisJCQlzdXBwbGllciAgIAlANDYxCisJCQlGb2N1c19TcmMgIAlANDYwCisJCQlGb2N1c19FbnRyeSAJQDQ2MgorCQkJb3JpZ2luICAgICAJKDUyNywgNDAwKQorCQkJdGVybWludXMgICAJKDgzMiwgNDAwKQorCQkJb3JkaW5hbCAgICAJMSkKKwkJICAgIChvYmplY3QgU2VsZk1lc3NWaWV3ICIiIEA0ODIKKwkJCWxvY2F0aW9uICAgCSgxNiwgNDQ4KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ4MworCQkJICAgIFBhcmVudF9WaWV3IAlANDgyCisJCQkgICAgbG9jYXRpb24gICAJKDk2OSwgNDA1KQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkU0MTExMDI5RiIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTE3NQorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkicHJvY2VzcygpIgorCQkJICAgIHBjdERpc3QgICAgCTAuNzA2NjY3CisJCQkgICAgaGVpZ2h0ICAgICAJNDQKKwkJCSAgICBvcmllbnRhdGlvbiAJMCkKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUA0NjEKKwkJCXN1cHBsaWVyICAgCUA0NjEKKwkJCUZvY3VzX1NyYyAgCUA0NjIKKwkJCUZvY3VzX0VudHJ5IAlANDYzCisJCQlvcmlnaW4gICAgIAkoODY0LCA0NDgpCisJCQl0ZXJtaW51cyAgIAkoMTAxNCwgNDQ4KQorCQkJb3JkaW5hbCAgICAJMikKKwkJICAgIChvYmplY3QgU2VsZk1lc3NWaWV3ICIiIEA0ODQKKwkJCWxvY2F0aW9uICAgCSgxNiwgNTkyKQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ4NQorCQkJICAgIFBhcmVudF9WaWV3IAlANDg0CisJCQkgICAgbG9jYXRpb24gICAJKDEwNDgsIDU0OSkKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZFNDE1QzAxNTEiCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAkyOTEKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJInBhcnNlSGVhZGVycygpIgorCQkJICAgIHBjdERpc3QgICAgCTEuMjI2NjY3CisJCQkgICAgaGVpZ2h0ICAgICAJNDQKKwkJCSAgICBvcmllbnRhdGlvbiAJMCkKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUA0NjEKKwkJCXN1cHBsaWVyICAgCUA0NjEKKwkJCUZvY3VzX1NyYyAgCUA0NjQKKwkJCUZvY3VzX0VudHJ5IAlANDY1CisJCQlvcmlnaW4gICAgIAkoODY0LCA1OTIpCisJCQl0ZXJtaW51cyAgIAkoMTAxNCwgNTkyKQorCQkJb3JkaW5hbCAgICAJMykKKwkJICAgIChvYmplY3QgU2VsZk1lc3NWaWV3ICIiIEA0ODYKKwkJCWxvY2F0aW9uICAgCSgxNiwgNzM2KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ4NworCQkJICAgIFBhcmVudF9WaWV3IAlANDg2CisJCQkgICAgbG9jYXRpb24gICAJKDEwNTIsIDY5MikKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZFNDFBNjAxNjEiCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAkzMjgKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJInByZXBhcmVSZXF1ZXN0KCkiCisJCQkgICAgcGN0RGlzdCAgICAJMS4yNTMzMzMKKwkJCSAgICBoZWlnaHQgICAgIAk0NAorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDQ2MQorCQkJc3VwcGxpZXIgICAJQDQ2MQorCQkJRm9jdXNfU3JjICAJQDQ2NgorCQkJRm9jdXNfRW50cnkgCUA0NjcKKwkJCW9yaWdpbiAgICAgCSg4NjQsIDczNikKKwkJCXRlcm1pbnVzICAgCSgxMDE0LCA3MzYpCisJCQlvcmRpbmFsICAgIAk0KQorCQkgICAgKG9iamVjdCBJbnRlck1lc3NWaWV3ICIiIEA0ODgKKwkJCWxvY2F0aW9uICAgCSg5OTIsIDg0OCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0ODkKKwkJCSAgICBQYXJlbnRfVmlldyAJQDQ4OAorCQkJICAgIGxvY2F0aW9uICAgCSgxMDA3LCA4MDQpCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTQxRDYwMTA3IgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJMTYyCisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJzZXJ2aWNlKCkiCisJCQkgICAgcGN0RGlzdCAgICAJMC41MDAwMDAKKwkJCSAgICBoZWlnaHQgICAgIAk0NQorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDQ2MQorCQkJc3VwcGxpZXIgICAJQDQ2OAorCQkJRm9jdXNfU3JjICAJQDQ2NgorCQkJRm9jdXNfRW50cnkgCUA0NjkKKwkJCW9yaWdpbiAgICAgCSg4NjMsIDg0OCkKKwkJCXRlcm1pbnVzICAgCSgxMTUyLCA4NDgpCisJCQlvcmRpbmFsICAgIAk1KQorCQkgICAgKG9iamVjdCBTZWxmTWVzc1ZpZXcgIiIgQDQ5MAorCQkJbG9jYXRpb24gICAJKDE2LCA5NDQpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDkxCisJCQkgICAgUGFyZW50X1ZpZXcgCUA0OTAKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTM3MiwgOTE2KQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkU0MjJDMDFGMSIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTM3MworCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkicG9zdFBhcnNlUmVxdWVzdCgpIgorCQkJICAgIHBjdERpc3QgICAgCTEuMjUzMzMzCisJCQkgICAgaGVpZ2h0ICAgICAJMjgKKwkJCSAgICBvcmllbnRhdGlvbiAJMCkKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUA0NjgKKwkJCXN1cHBsaWVyICAgCUA0NjgKKwkJCUZvY3VzX1NyYyAgCUA0NzAKKwkJCUZvY3VzX0VudHJ5IAlANDcxCisJCQlvcmlnaW4gICAgIAkoMTE4NCwgOTQ0KQorCQkJdGVybWludXMgICAJKDEzMzQsIDk0NCkKKwkJCW9yZGluYWwgICAgCTYpCisJCSAgICAob2JqZWN0IEludGVyTWVzc1ZpZXcgIiIgQDQ5MgorCQkJbG9jYXRpb24gICAJKDEzNDQsIDEwMDgpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDkzCisJCQkgICAgUGFyZW50X1ZpZXcgCUA0OTIKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTM0MywgOTY0KQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkU0MjgwMDIzOCIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTE0OQorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiaW52b2tlKCkiCisJCQkgICAgcGN0RGlzdCAgICAJMC41MDAwMDAKKwkJCSAgICBoZWlnaHQgICAgIAk0NQorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDQ2OAorCQkJc3VwcGxpZXIgICAJQDQ3MgorCQkJRm9jdXNfU3JjICAJQDQ3MAorCQkJRm9jdXNfRW50cnkgCUA0NzMKKwkJCW9yaWdpbiAgICAgCSgxMTgzLCAxMDA4KQorCQkJdGVybWludXMgICAJKDE1MDQsIDEwMDgpCisJCQlvcmRpbmFsICAgIAk3KQorCQkgICAgKG9iamVjdCBJbnRlck1lc3NWaWV3ICIiIEA0OTQKKwkJCWxvY2F0aW9uICAgCSgxNiwgMTA0MCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0OTUKKwkJCSAgICBQYXJlbnRfVmlldyAJQDQ5NAorCQkJICAgIGxvY2F0aW9uICAgCSgxNjk1LCA5OTYpCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTQyOUEwMDJEIgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJMTQ5CisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJpbnZva2UoKSIKKwkJCSAgICBwY3REaXN0ICAgIAkwLjUwMDAwMAorCQkJICAgIGhlaWdodCAgICAgCTQ1CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlANDcyCisJCQlzdXBwbGllciAgIAlANDc0CisJCQlGb2N1c19TcmMgIAlANDczCisJCQlGb2N1c19FbnRyeSAJQDQ3NQorCQkJb3JpZ2luICAgICAJKDE1MzUsIDEwNDApCisJCQl0ZXJtaW51cyAgIAkoMTg1NiwgMTA0MCkKKwkJCW9yZGluYWwgICAgCTgpCisJCSAgICAob2JqZWN0IEludGVyTWVzc1ZpZXcgIiIgQDQ5NgorCQkJbG9jYXRpb24gICAJKDE2LCAxMDU2KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ5NworCQkJICAgIFBhcmVudF9WaWV3IAlANDk2CisJCQkgICAgbG9jYXRpb24gICAJKDIwMzEsIDEwMTIpCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTQyQ0UwMjMwIgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJMTQ5CisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJpbnZva2UoKSIKKwkJCSAgICBwY3REaXN0ICAgIAkwLjUwMDAwMAorCQkJICAgIGhlaWdodCAgICAgCTQ1CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlANDc0CisJCQlzdXBwbGllciAgIAlANDc2CisJCQlGb2N1c19TcmMgIAlANDc1CisJCQlGb2N1c19FbnRyeSAJQDQ3NworCQkJb3JpZ2luICAgICAJKDE4ODcsIDEwNTYpCisJCQl0ZXJtaW51cyAgIAkoMjE3NiwgMTA1NikKKwkJCW9yZGluYWwgICAgCTkpCisJCSAgICAob2JqZWN0IE5vdGVWaWV3IEA0OTgKKwkJCWxvY2F0aW9uICAgCSgyMDAwLCAyMDE2KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCisJCQkgICAgUGFyZW50X1ZpZXcgCUA0OTgKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTg2MiwgMTk1NikKKwkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJICAgIG5saW5lcyAgICAgCTIKKwkJCSAgICBtYXhfd2lkdGggIAkyNDAKKwkJCSAgICBsYWJlbCAgICAgIAkiU2VlIG5leHQgZGlhZ3JhbSIpCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJd2lkdGggICAgICAJMzAwCisJCQloZWlnaHQgICAgIAkxMzIpCisJCSAgICAob2JqZWN0IEF0dGFjaFZpZXcgIiIgQDQ5OQorCQkJc3RlcmVvdHlwZSAJVFJVRQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDQ5OAorCQkJc3VwcGxpZXIgICAJQDQ3NgorCQkJbGluZV9zdHlsZSAJMCkpKQorCSAgICAob2JqZWN0IEludGVyYWN0aW9uRGlhZ3JhbSAiMi4gY2F0YWxpbmFfcmVxdWVzdF8yIgorCQltZWNoYW5pc21fcmVmIAlAODkKKwkJcXVpZCAgICAgICAJIjNERkU0MkY3MDI0QyIKKwkJdGl0bGUgICAgICAJIjIuIGNhdGFsaW5hX3JlcXVlc3RfMiIKKwkJem9vbSAgICAgICAJMTAwCisJCW1heF9oZWlnaHQgCTI4MzUwCisJCW1heF93aWR0aCAgCTIxNjAwCisJCW9yaWdpbl94ICAgCTAKKwkJb3JpZ2luX3kgICAJMAorCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAorCQkgICAgKG9iamVjdCBJbnRlck9ialZpZXcgIlN0YW5kYXJkQ29udGV4dFZhbHZlIiBANTAwCisJCQlsb2NhdGlvbiAgIAkoMjI0LCAyMjQpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJVFJVRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAorCQkJICAgIFBhcmVudF9WaWV3IAlANTAwCisJCQkgICAgbG9jYXRpb24gICAJKDIyNCwgMjI0KQorCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTIKKwkJCSAgICBtYXhfd2lkdGggIAk0MDEKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJIlN0YW5kYXJkQ29udGV4dFZhbHZlIikKKwkJCWljb25fc3R5bGUgCSJJY29uIgorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCXF1aWR1ICAgICAgCSIzREZFNDMwNzAwMUUiCisJCQl3aWR0aCAgICAgIAk0MTkKKwkJCWhlaWdodCAgICAgCTE2NzgKKwkJCWljb25faGVpZ2h0IAkwCisJCQlpY29uX3dpZHRoIAkwCisJCQlpY29uX3lfb2Zmc2V0IAkwCisJCQlhbm5vdGF0aW9uIAkxCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDUwMQorCQkJICAgIGxvY2F0aW9uICAgCSgyMjQsIDM4NCkKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlANTAwCisJCQkgICAgaGVpZ2h0ICAgICAJMzg2CisJCQkgICAgeV9jb29yZCAgICAJMzI2CisJCQkgICAgTmVzdGVkICAgICAJRkFMU0UpCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDUwMgorCQkJICAgIGxvY2F0aW9uICAgCSgyMjQsIDcwNCkKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlANTAwCisJCQkgICAgaGVpZ2h0ICAgICAJNjAKKwkJCSAgICB5X2Nvb3JkICAgIAkwCisJCQkgICAgTmVzdGVkICAgICAJVFJVRSkKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBANTAzCisJCQkgICAgbG9jYXRpb24gICAJKDIyNCwgODk2KQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUA1MDAKKwkJCSAgICBoZWlnaHQgICAgIAk5MTYKKwkJCSAgICB5X2Nvb3JkICAgIAk4NTYKKwkJCSAgICBOZXN0ZWQgICAgIAlGQUxTRSkKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBANTA0CisJCQkgICAgbG9jYXRpb24gICAJKDIyNCwgMTAyNCkKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlANTAwCisJCQkgICAgaGVpZ2h0ICAgICAJNjAKKwkJCSAgICB5X2Nvb3JkICAgIAkwCisJCQkgICAgTmVzdGVkICAgICAJVFJVRSkKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBANTA1CisJCQkgICAgbG9jYXRpb24gICAJKDIyNCwgMTI4MCkKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlANTAwCisJCQkgICAgaGVpZ2h0ICAgICAJNjAKKwkJCSAgICB5X2Nvb3JkICAgIAkwCisJCQkgICAgTmVzdGVkICAgICAJVFJVRSkpCisJCSAgICAob2JqZWN0IEludGVyT2JqVmlldyAiU3RhbmRhcmRFbmdpbmVWYWx2ZSIgQDUwNgorCQkJbG9jYXRpb24gICAJKDU5MiwgMjI0KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCVRSVUUKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKKwkJCSAgICBQYXJlbnRfVmlldyAJQDUwNgorCQkJICAgIGxvY2F0aW9uICAgCSg1OTIsIDIyNCkKKwkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkyCisJCQkgICAgbWF4X3dpZHRoICAJMjgyCisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJTdGFuZGFyZEVuZ2luZVZhbHZlIikKKwkJCWljb25fc3R5bGUgCSJJY29uIgorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCXF1aWR1ICAgICAgCSIzREZFNDMyODAxRjMiCisJCQl3aWR0aCAgICAgIAkzMDAKKwkJCWhlaWdodCAgICAgCTE2NzgKKwkJCWljb25faGVpZ2h0IAkwCisJCQlpY29uX3dpZHRoIAkwCisJCQlpY29uX3lfb2Zmc2V0IAkwCisJCQlhbm5vdGF0aW9uIAkxCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDUwNworCQkJICAgIGxvY2F0aW9uICAgCSg1OTIsIDM4NCkKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlANTA2CisJCQkgICAgaGVpZ2h0ICAgICAJMjY0CisJCQkgICAgeV9jb29yZCAgICAJMjA0CisJCQkgICAgTmVzdGVkICAgICAJRkFMU0UpKQorCQkgICAgKG9iamVjdCBJbnRlck9ialZpZXcgIlN0YW5kYXJkSG9zdCIgQDUwOAorCQkJbG9jYXRpb24gICAJKDkxMiwgMjI0KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCVRSVUUKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKKwkJCSAgICBQYXJlbnRfVmlldyAJQDUwOAorCQkJICAgIGxvY2F0aW9uICAgCSg5MTIsIDIyNCkKKwkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkyCisJCQkgICAgbWF4X3dpZHRoICAJMjgyCisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJTdGFuZGFyZEhvc3QiKQorCQkJaWNvbl9zdHlsZSAJIkljb24iCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJcXVpZHUgICAgICAJIjNERkU0MzY1MDNCRCIKKwkJCXdpZHRoICAgICAgCTMwMAorCQkJaGVpZ2h0ICAgICAJMTY3OAorCQkJaWNvbl9oZWlnaHQgCTAKKwkJCWljb25fd2lkdGggCTAKKwkJCWljb25feV9vZmZzZXQgCTAKKwkJCWFubm90YXRpb24gCTEKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBANTA5CisJCQkgICAgbG9jYXRpb24gICAJKDkxMiwgNDE2KQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUA1MDgKKwkJCSAgICBoZWlnaHQgICAgIAk0MzEKKwkJCSAgICB5X2Nvb3JkICAgIAkzNzEKKwkJCSAgICBOZXN0ZWQgICAgIAlGQUxTRSkKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBANTEwCisJCQkgICAgbG9jYXRpb24gICAJKDkxMiwgNTI4KQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUA1MDgKKwkJCSAgICBoZWlnaHQgICAgIAk2MAorCQkJICAgIHlfY29vcmQgICAgCTAKKwkJCSAgICBOZXN0ZWQgICAgIAlUUlVFKQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEA1MTEKKwkJCSAgICBsb2NhdGlvbiAgIAkoOTEyLCA3MDQpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDUwOAorCQkJICAgIGhlaWdodCAgICAgCTEyMAorCQkJICAgIHlfY29vcmQgICAgCTYwCisJCQkgICAgTmVzdGVkICAgICAJVFJVRSkpCisJCSAgICAob2JqZWN0IEludGVyT2JqVmlldyAiRXJyb3JSZXBvcnRWYWx2ZSIgQDUxMgorCQkJbG9jYXRpb24gICAJKDEyNjQsIDIyNCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlUUlVFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCisJCQkgICAgUGFyZW50X1ZpZXcgCUA1MTIKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTI2NCwgMjI0KQorCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTIKKwkJCSAgICBtYXhfd2lkdGggIAkyOTQKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJIkVycm9yUmVwb3J0VmFsdmUiKQorCQkJaWNvbl9zdHlsZSAJIkljb24iCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJcXVpZHUgICAgICAJIjNERkU0MzhDMDI4RCIKKwkJCXdpZHRoICAgICAgCTMxMgorCQkJaGVpZ2h0ICAgICAJMTY3OAorCQkJaWNvbl9oZWlnaHQgCTAKKwkJCWljb25fd2lkdGggCTAKKwkJCWljb25feV9vZmZzZXQgCTAKKwkJCWFubm90YXRpb24gCTEKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBANTEzCisJCQkgICAgbG9jYXRpb24gICAJKDEyNjQsIDg5NikKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlANTEyCisJCQkgICAgaGVpZ2h0ICAgICAJMjQ4CisJCQkgICAgeV9jb29yZCAgICAJMTg4CisJCQkgICAgTmVzdGVkICAgICAJRkFMU0UpCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDUxNAorCQkJICAgIGxvY2F0aW9uICAgCSgxMjY0LCA5NDQpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDUxMgorCQkJICAgIGhlaWdodCAgICAgCTYwCisJCQkgICAgeV9jb29yZCAgICAJMAorCQkJICAgIE5lc3RlZCAgICAgCVRSVUUpKQorCQkgICAgKG9iamVjdCBJbnRlck9ialZpZXcgIkVycm9yRGlzcGF0Y2hlclZhbHZlIiBANTE1CisJCQlsb2NhdGlvbiAgIAkoMTU4NCwgMjI0KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCVRSVUUKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKKwkJCSAgICBQYXJlbnRfVmlldyAJQDUxNQorCQkJICAgIGxvY2F0aW9uICAgCSgxNTg0LCAyMjQpCisJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMgorCQkJICAgIG1heF93aWR0aCAgCTI5NQorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiRXJyb3JEaXNwYXRjaGVyVmFsdmUiKQorCQkJaWNvbl9zdHlsZSAJIkljb24iCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJcXVpZHUgICAgICAJIjNERkU0NTFGMDFFQyIKKwkJCXdpZHRoICAgICAgCTMxMworCQkJaGVpZ2h0ICAgICAJMTY3OAorCQkJaWNvbl9oZWlnaHQgCTAKKwkJCWljb25fd2lkdGggCTAKKwkJCWljb25feV9vZmZzZXQgCTAKKwkJCWFubm90YXRpb24gCTEKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBANTE2CisJCQkgICAgbG9jYXRpb24gICAJKDE1ODQsIDExNjgpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDUxNQorCQkJICAgIGhlaWdodCAgICAgCTIzMgorCQkJICAgIHlfY29vcmQgICAgCTE3MgorCQkJICAgIE5lc3RlZCAgICAgCUZBTFNFKSkKKwkJICAgIChvYmplY3QgSW50ZXJPYmpWaWV3ICJTdGFuZGFyZEhvc3RWYWx2ZSIgQDUxNworCQkJbG9jYXRpb24gICAJKDE5MDQsIDIyNCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlUUlVFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCisJCQkgICAgUGFyZW50X1ZpZXcgCUA1MTcKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTkwNCwgMjI0KQorCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTIKKwkJCSAgICBtYXhfd2lkdGggIAkyOTUKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJIlN0YW5kYXJkSG9zdFZhbHZlIikKKwkJCWljb25fc3R5bGUgCSJJY29uIgorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCXF1aWR1ICAgICAgCSIzREZFNDczMTAxMzAiCisJCQl3aWR0aCAgICAgIAkzMTMKKwkJCWhlaWdodCAgICAgCTE2NzgKKwkJCWljb25faGVpZ2h0IAkwCisJCQlpY29uX3dpZHRoIAkwCisJCQlpY29uX3lfb2Zmc2V0IAkwCisJCQlhbm5vdGF0aW9uIAkxCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDUxOAorCQkJICAgIGxvY2F0aW9uICAgCSgxOTA0LCAxNDcyKQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUA1MTcKKwkJCSAgICBoZWlnaHQgICAgIAkyODAKKwkJCSAgICB5X2Nvb3JkICAgIAkyMjAKKwkJCSAgICBOZXN0ZWQgICAgIAlGQUxTRSkKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBANTE5CisJCQkgICAgbG9jYXRpb24gICAJKDE5MDQsIDE1MzYpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDUxNworCQkJICAgIGhlaWdodCAgICAgCTYwCisJCQkgICAgeV9jb29yZCAgICAJMAorCQkJICAgIE5lc3RlZCAgICAgCVRSVUUpKQorCQkgICAgKG9iamVjdCBJbnRlck9ialZpZXcgIlN0YW5kYXJkQ29udGV4dCIgQDUyMAorCQkJbG9jYXRpb24gICAJKDIyMjQsIDIyNCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlUUlVFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCisJCQkgICAgUGFyZW50X1ZpZXcgCUA1MjAKKwkJCSAgICBsb2NhdGlvbiAgIAkoMjIyNCwgMjI0KQorCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTIKKwkJCSAgICBtYXhfd2lkdGggIAkyODIKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJIlN0YW5kYXJkQ29udGV4dCIpCisJCQlpY29uX3N0eWxlIAkiSWNvbiIKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQlxdWlkdSAgICAgIAkiM0RGRTQ3QzEwMEYxIgorCQkJd2lkdGggICAgICAJMzAwCisJCQloZWlnaHQgICAgIAkxNjc4CisJCQlpY29uX2hlaWdodCAJMAorCQkJaWNvbl93aWR0aCAJMAorCQkJaWNvbl95X29mZnNldCAJMAorCQkJYW5ub3RhdGlvbiAJMQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEA1MjEKKwkJCSAgICBsb2NhdGlvbiAgIAkoMjIyNCwgMTYzMikKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlANTIwCisJCQkgICAgaGVpZ2h0ICAgICAJNjAKKwkJCSAgICB5X2Nvb3JkICAgIAkwCisJCQkgICAgTmVzdGVkICAgICAJRkFMU0UpKQorCQkgICAgKG9iamVjdCBJbnRlck1lc3NWaWV3ICIiIEA1MjIKKwkJCWxvY2F0aW9uICAgCSgxNiwgMzg0KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUyMworCQkJICAgIFBhcmVudF9WaWV3IAlANTIyCisJCQkgICAgbG9jYXRpb24gICAJKDQwNywgMzQwKQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkU0MzRDMDE5QiIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTE0NgorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiaW52b2tlKCkiCisJCQkgICAgcGN0RGlzdCAgICAJMC41MDAwMDAKKwkJCSAgICBoZWlnaHQgICAgIAk0NQorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDUwMAorCQkJc3VwcGxpZXIgICAJQDUwNgorCQkJRm9jdXNfU3JjICAJQDUwMQorCQkJRm9jdXNfRW50cnkgCUA1MDcKKwkJCW9yaWdpbiAgICAgCSgyMzksIDM4NCkKKwkJCXRlcm1pbnVzICAgCSg1NzYsIDM4NCkKKwkJCW9yZGluYWwgICAgCTApCisJCSAgICAob2JqZWN0IEludGVyTWVzc1ZpZXcgIiIgQDUyNAorCQkJbG9jYXRpb24gICAJKDE2LCA0MTYpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTI1CisJCQkgICAgUGFyZW50X1ZpZXcgCUA1MjQKKwkJCSAgICBsb2NhdGlvbiAgIAkoNzUxLCAzNzIpCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTQzNkMwMDlEIgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJMTA3CisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJtYXAoKSIKKwkJCSAgICBwY3REaXN0ICAgIAkwLjUwMDAwMAorCQkJICAgIGhlaWdodCAgICAgCTQ1CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlANTA2CisJCQlzdXBwbGllciAgIAlANTA4CisJCQlGb2N1c19TcmMgIAlANTA3CisJCQlGb2N1c19FbnRyeSAJQDUwOQorCQkJb3JpZ2luICAgICAJKDYwNywgNDE2KQorCQkJdGVybWludXMgICAJKDg5NiwgNDE2KQorCQkJb3JkaW5hbCAgICAJMSkKKwkJICAgIChvYmplY3QgSW50ZXJNZXNzVmlldyAiIiBANTI2CisJCQlsb2NhdGlvbiAgIAkoODAwLCA1MjgpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTI3CisJCQkgICAgUGFyZW50X1ZpZXcgCUA1MjYKKwkJCSAgICBsb2NhdGlvbiAgIAkoNzUxLCA0ODQpCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTQzODMwMDYzIgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJMTQ2CisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJpbnZva2UoKSIKKwkJCSAgICBwY3REaXN0ICAgIAkwLjUwMDAwMAorCQkJICAgIGhlaWdodCAgICAgCTQ1CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlANTA2CisJCQlzdXBwbGllciAgIAlANTA4CisJCQlGb2N1c19TcmMgIAlANTA3CisJCQlGb2N1c19FbnRyeSAJQDUxMAorCQkJb3JpZ2luICAgICAJKDYwNywgNTI4KQorCQkJdGVybWludXMgICAJKDg5NiwgNTI4KQorCQkJb3JkaW5hbCAgICAJMikKKwkJICAgIChvYmplY3QgSW50ZXJNZXNzVmlldyAiIiBANTI4CisJCQlsb2NhdGlvbiAgIAkoNjA4LCA3MDQpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTI5CisJCQkgICAgUGFyZW50X1ZpZXcgCUA1MjgKKwkJCSAgICBsb2NhdGlvbiAgIAkoNTY4LCA2NjApCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTQzQjkwM0JGIgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJMTQ2CisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJpbnZva2UoKSIKKwkJCSAgICBwY3REaXN0ICAgIAkwLjUwMDAwMAorCQkJICAgIGhlaWdodCAgICAgCTQ1CisJCQkgICAgb3JpZW50YXRpb24gCTEpCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlANTA4CisJCQlzdXBwbGllciAgIAlANTAwCisJCQlGb2N1c19TcmMgIAlANTExCisJCQlGb2N1c19FbnRyeSAJQDUwMgorCQkJb3JpZ2luICAgICAJKDg5NiwgNzA0KQorCQkJdGVybWludXMgICAJKDI0MCwgNzA0KQorCQkJb3JkaW5hbCAgICAJMykKKwkJICAgIChvYmplY3QgSW50ZXJNZXNzVmlldyAiIiBANTMwCisJCQlsb2NhdGlvbiAgIAkoNzUyLCA4OTYpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTMxCisJCQkgICAgUGFyZW50X1ZpZXcgCUA1MzAKKwkJCSAgICBsb2NhdGlvbiAgIAkoNzQzLCA4NTIpCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTQzQzIwM0E0IgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJMTQ2CisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJpbnZva2UoKSIKKwkJCSAgICBwY3REaXN0ICAgIAkwLjUwMDAwMAorCQkJICAgIGhlaWdodCAgICAgCTQ1CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlANTAwCisJCQlzdXBwbGllciAgIAlANTEyCisJCQlGb2N1c19TcmMgIAlANTAzCisJCQlGb2N1c19FbnRyeSAJQDUxMworCQkJb3JpZ2luICAgICAJKDIzOSwgODk2KQorCQkJdGVybWludXMgICAJKDEyNDgsIDg5NikKKwkJCW9yZGluYWwgICAgCTQpCisJCSAgICAob2JqZWN0IFNlbGZNZXNzVmlldyAiIiBANTMyCisJCQlsb2NhdGlvbiAgIAkoMTYsIDk0NCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MzMKKwkJCSAgICBQYXJlbnRfVmlldyAJQDUzMgorCQkJICAgIGxvY2F0aW9uICAgCSgxMzU1LCA5MDApCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTQ0MjUwMUIxIgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJMTM1CisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJyZXBvcnQoKSIKKwkJCSAgICBwY3REaXN0ICAgIAkwLjUwMDAwMAorCQkJICAgIGhlaWdodCAgICAgCTQ1CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlANTEyCisJCQlzdXBwbGllciAgIAlANTEyCisJCQlGb2N1c19TcmMgIAlANTEzCisJCQlGb2N1c19FbnRyeSAJQDUxNAorCQkJb3JpZ2luICAgICAJKDEyODAsIDk0NCkKKwkJCXRlcm1pbnVzICAgCSgxNDMwLCA5NDQpCisJCQlvcmRpbmFsICAgIAk1KQorCQkgICAgKG9iamVjdCBJbnRlck1lc3NWaWV3ICIiIEA1MzQKKwkJCWxvY2F0aW9uICAgCSgxNiwgMTAyNCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MzUKKwkJCSAgICBQYXJlbnRfVmlldyAJQDUzNAorCQkJICAgIGxvY2F0aW9uICAgCSg3NDQsIDk4MCkKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZFNDYzMzAyOTMiCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAkyMzAKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJImludm9rZU5leHQoKSIKKwkJCSAgICBwY3REaXN0ICAgIAkwLjUwMDAwMAorCQkJICAgIGhlaWdodCAgICAgCTQ1CisJCQkgICAgb3JpZW50YXRpb24gCTEpCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlANTEyCisJCQlzdXBwbGllciAgIAlANTAwCisJCQlGb2N1c19TcmMgIAlANTEzCisJCQlGb2N1c19FbnRyeSAJQDUwNAorCQkJb3JpZ2luICAgICAJKDEyNDgsIDEwMjQpCisJCQl0ZXJtaW51cyAgIAkoMjQwLCAxMDI0KQorCQkJb3JkaW5hbCAgICAJNikKKwkJICAgIChvYmplY3QgSW50ZXJNZXNzVmlldyAiIiBANTM2CisJCQlsb2NhdGlvbiAgIAkoOTQ0LCAxMTY4KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUzNworCQkJICAgIFBhcmVudF9WaWV3IAlANTM2CisJCQkgICAgbG9jYXRpb24gICAJKDkwMywgMTEyNCkKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZFNDZFNzAwMjYiCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAkxNDYKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJImludm9rZSgpIgorCQkJICAgIHBjdERpc3QgICAgCTAuNTAwMDAwCisJCQkgICAgaGVpZ2h0ICAgICAJNDUKKwkJCSAgICBvcmllbnRhdGlvbiAJMCkKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUA1MDAKKwkJCXN1cHBsaWVyICAgCUA1MTUKKwkJCUZvY3VzX1NyYyAgCUA1MDMKKwkJCUZvY3VzX0VudHJ5IAlANTE2CisJCQlvcmlnaW4gICAgIAkoMjM5LCAxMTY4KQorCQkJdGVybWludXMgICAJKDE1NjgsIDExNjgpCisJCQlvcmRpbmFsICAgIAk3KQorCQkgICAgKG9iamVjdCBJbnRlck1lc3NWaWV3ICIiIEA1MzgKKwkJCWxvY2F0aW9uICAgCSgxNiwgMTI4MCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MzkKKwkJCSAgICBQYXJlbnRfVmlldyAJQDUzOAorCQkJICAgIGxvY2F0aW9uICAgCSg5MDQsIDEyMzYpCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTQ3NUQwM0EwIgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJMjA2CisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJpbnZva2VOZXh0IgorCQkJICAgIHBjdERpc3QgICAgCTAuNTAwMDAwCisJCQkgICAgaGVpZ2h0ICAgICAJNDUKKwkJCSAgICBvcmllbnRhdGlvbiAJMSkKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUA1MTUKKwkJCXN1cHBsaWVyICAgCUA1MDAKKwkJCUZvY3VzX1NyYyAgCUA1MTYKKwkJCUZvY3VzX0VudHJ5IAlANTA1CisJCQlvcmlnaW4gICAgIAkoMTU2OCwgMTI4MCkKKwkJCXRlcm1pbnVzICAgCSgyNDAsIDEyODApCisJCQlvcmRpbmFsICAgIAk4KQorCQkgICAgKG9iamVjdCBJbnRlck1lc3NWaWV3ICIiIEA1NDAKKwkJCWxvY2F0aW9uICAgCSgxMTg0LCAxNDcyKQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU0MQorCQkJICAgIFBhcmVudF9WaWV3IAlANTQwCisJCQkgICAgbG9jYXRpb24gICAJKDEwNjMsIDE0MjgpCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTQ3NjUwM0NBIgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJMTQ2CisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJpbnZva2UoKSIKKwkJCSAgICBwY3REaXN0ICAgIAkwLjUwMDAwMAorCQkJICAgIGhlaWdodCAgICAgCTQ1CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlANTAwCisJCQlzdXBwbGllciAgIAlANTE3CisJCQlGb2N1c19TcmMgIAlANTAzCisJCQlGb2N1c19FbnRyeSAJQDUxOAorCQkJb3JpZ2luICAgICAJKDIzOSwgMTQ3MikKKwkJCXRlcm1pbnVzICAgCSgxODg4LCAxNDcyKQorCQkJb3JkaW5hbCAgICAJOSkKKwkJICAgIChvYmplY3QgU2VsZk1lc3NWaWV3ICIiIEA1NDIKKwkJCWxvY2F0aW9uICAgCSgxNiwgMTUzNikKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NDMKKwkJCSAgICBQYXJlbnRfVmlldyAJQDU0MgorCQkJICAgIGxvY2F0aW9uICAgCSgxOTk1LCAxNDkyKQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkU0N0NEMDE2NyIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTI5NQorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkibWFwKCkgLy9Db250ZXh0IgorCQkJICAgIHBjdERpc3QgICAgCTAuNTAwMDAwCisJCQkgICAgaGVpZ2h0ICAgICAJNDUKKwkJCSAgICBvcmllbnRhdGlvbiAJMCkKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUA1MTcKKwkJCXN1cHBsaWVyICAgCUA1MTcKKwkJCUZvY3VzX1NyYyAgCUA1MTgKKwkJCUZvY3VzX0VudHJ5IAlANTE5CisJCQlvcmlnaW4gICAgIAkoMTkyMCwgMTUzNikKKwkJCXRlcm1pbnVzICAgCSgyMDcwLCAxNTM2KQorCQkJb3JkaW5hbCAgICAJMTApCisJCSAgICAob2JqZWN0IEludGVyTWVzc1ZpZXcgIiIgQDU0NAorCQkJbG9jYXRpb24gICAJKDE2LCAxNjMyKQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU0NQorCQkJICAgIFBhcmVudF9WaWV3IAlANTQ0CisJCQkgICAgbG9jYXRpb24gICAJKDIwNjMsIDE1ODgpCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTQ3RDUwMEI0IgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJMTQ2CisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJpbnZva2UoKSIKKwkJCSAgICBwY3REaXN0ICAgIAkwLjUwMDAwMAorCQkJICAgIGhlaWdodCAgICAgCTQ1CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlANTE3CisJCQlzdXBwbGllciAgIAlANTIwCisJCQlGb2N1c19TcmMgIAlANTE4CisJCQlGb2N1c19FbnRyeSAJQDUyMQorCQkJb3JpZ2luICAgICAJKDE5MTksIDE2MzIpCisJCQl0ZXJtaW51cyAgIAkoMjIwOCwgMTYzMikKKwkJCW9yZGluYWwgICAgCTExKSkpCisJICAgIChvYmplY3QgSW50ZXJhY3Rpb25EaWFncmFtICIzLiBjYXRhbGluYV9yZXF1ZXN0XzMiCisJCW1lY2hhbmlzbV9yZWYgCUA5MAorCQlxdWlkICAgICAgIAkiM0RGRTQ4QTIwMkFEIgorCQl0aXRsZSAgICAgIAkiMy4gY2F0YWxpbmFfcmVxdWVzdF8zIgorCQl6b29tICAgICAgIAkxMDAKKwkJbWF4X2hlaWdodCAJMjgzNTAKKwkJbWF4X3dpZHRoICAJMjE2MDAKKwkJb3JpZ2luX3ggICAJNjEyCisJCW9yaWdpbl95ICAgCTkzOAorCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAorCQkgICAgKG9iamVjdCBJbnRlck9ialZpZXcgIlN0YW5kYXJkQ29udGV4dCIgQDU0NgorCQkJbG9jYXRpb24gICAJKDE2MCwgMjI0KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCVRSVUUKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKKwkJCSAgICBQYXJlbnRfVmlldyAJQDU0NgorCQkJICAgIGxvY2F0aW9uICAgCSgxNjAsIDIyNCkKKwkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkyCisJCQkgICAgbWF4X3dpZHRoICAJMjgyCisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJTdGFuZGFyZENvbnRleHQiKQorCQkJaWNvbl9zdHlsZSAJIkljb24iCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJcXVpZHUgICAgICAJIjNERkU0OEIwMDFEMSIKKwkJCXdpZHRoICAgICAgCTMwMAorCQkJaGVpZ2h0ICAgICAJMjIyNgorCQkJaWNvbl9oZWlnaHQgCTAKKwkJCWljb25fd2lkdGggCTAKKwkJCWljb25feV9vZmZzZXQgCTAKKwkJCWFubm90YXRpb24gCTEKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBANTQ3CisJCQkgICAgbG9jYXRpb24gICAJKDE2MCwgNDAwKQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUA1NDYKKwkJCSAgICBoZWlnaHQgICAgIAkxOTYwCisJCQkgICAgeV9jb29yZCAgICAJMTkwMAorCQkJICAgIE5lc3RlZCAgICAgCUZBTFNFKSkKKwkJICAgIChvYmplY3QgSW50ZXJPYmpWaWV3ICJTdGFuZGFyZFBpcGVsaW5lIiBANTQ4CisJCQlsb2NhdGlvbiAgIAkoNDgwLCAyMjQpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJVFJVRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAorCQkJICAgIFBhcmVudF9WaWV3IAlANTQ4CisJCQkgICAgbG9jYXRpb24gICAJKDQ4MCwgMjI0KQorCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTIKKwkJCSAgICBtYXhfd2lkdGggIAkyODIKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJIlN0YW5kYXJkUGlwZWxpbmUiKQorCQkJaWNvbl9zdHlsZSAJIkljb24iCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJcXVpZHUgICAgICAJIjNERkU0OEI4MDA4OCIKKwkJCXdpZHRoICAgICAgCTMwMAorCQkJaGVpZ2h0ICAgICAJMjIyNgorCQkJaWNvbl9oZWlnaHQgCTAKKwkJCWljb25fd2lkdGggCTAKKwkJCWljb25feV9vZmZzZXQgCTAKKwkJCWFubm90YXRpb24gCTEKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBANTQ5CisJCQkgICAgbG9jYXRpb24gICAJKDQ4MCwgNDAwKQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUA1NDgKKwkJCSAgICBoZWlnaHQgICAgIAkxOTAwCisJCQkgICAgeV9jb29yZCAgICAJMTg0MAorCQkJICAgIE5lc3RlZCAgICAgCUZBTFNFKQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEA1NTAKKwkJCSAgICBsb2NhdGlvbiAgIAkoNDgwLCAxMDg4KQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUA1NDgKKwkJCSAgICBoZWlnaHQgICAgIAk2MAorCQkJICAgIHlfY29vcmQgICAgCTAKKwkJCSAgICBOZXN0ZWQgICAgIAlUUlVFKSkKKwkJICAgIChvYmplY3QgSW50ZXJPYmpWaWV3ICJTdGFuZGFyZFZhbHZlQ29udGV4dCIgQDU1MQorCQkJbG9jYXRpb24gICAJKDgwMCwgMjI0KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCVRSVUUKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKKwkJCSAgICBQYXJlbnRfVmlldyAJQDU1MQorCQkJICAgIGxvY2F0aW9uICAgCSg4MDAsIDIyNCkKKwkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkyCisJCQkgICAgbWF4X3dpZHRoICAJMjgyCisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJTdGFuZGFyZFZhbHZlQ29udGV4dCIpCisJCQlpY29uX3N0eWxlIAkiSWNvbiIKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQlxdWlkdSAgICAgIAkiM0RGRTQ4RDAwMERDIgorCQkJd2lkdGggICAgICAJMzAwCisJCQloZWlnaHQgICAgIAkyMjI2CisJCQlpY29uX2hlaWdodCAJMAorCQkJaWNvbl93aWR0aCAJMAorCQkJaWNvbl95X29mZnNldCAJMAorCQkJYW5ub3RhdGlvbiAJMQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEA1NTIKKwkJCSAgICBsb2NhdGlvbiAgIAkoODAwLCA3MzYpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDU1MQorCQkJICAgIGhlaWdodCAgICAgCTE1MTAKKwkJCSAgICB5X2Nvb3JkICAgIAkxNDUwCisJCQkgICAgTmVzdGVkICAgICAJRkFMU0UpCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDU1MworCQkJICAgIGxvY2F0aW9uICAgCSg4MDAsIDExNjgpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDU1MQorCQkJICAgIGhlaWdodCAgICAgCTEwNzIKKwkJCSAgICB5X2Nvb3JkICAgIAkxMDEyCisJCQkgICAgTmVzdGVkICAgICAJVFJVRSkpCisJCSAgICAob2JqZWN0IEludGVyT2JqVmlldyAiU3RhbmRhcmRDb250ZXh0VmFsdmUiIEA1NTQKKwkJCWxvY2F0aW9uICAgCSgxMTA0LCAyMjQpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJVFJVRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAorCQkJICAgIFBhcmVudF9WaWV3IAlANTU0CisJCQkgICAgbG9jYXRpb24gICAJKDExMDQsIDIyNCkKKwkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkyCisJCQkgICAgbWF4X3dpZHRoICAJMjgyCisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJTdGFuZGFyZENvbnRleHRWYWx2ZSIpCisJCQlpY29uX3N0eWxlIAkiSWNvbiIKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQlxdWlkdSAgICAgIAkiM0RGRTQ5MDMwM0E3IgorCQkJd2lkdGggICAgICAJMzAwCisJCQloZWlnaHQgICAgIAkyMjI2CisJCQlpY29uX2hlaWdodCAJMAorCQkJaWNvbl93aWR0aCAJMAorCQkJaWNvbl95X29mZnNldCAJMAorCQkJYW5ub3RhdGlvbiAJMQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEA1NTUKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTEwNCwgODAwKQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUA1NTQKKwkJCSAgICBoZWlnaHQgICAgIAk0NjgKKwkJCSAgICB5X2Nvb3JkICAgIAk0MDgKKwkJCSAgICBOZXN0ZWQgICAgIAlGQUxTRSkKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBANTU2CisJCQkgICAgbG9jYXRpb24gICAJKDExMDQsIDg0OCkKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlANTU0CisJCQkgICAgaGVpZ2h0ICAgICAJNjAKKwkJCSAgICB5X2Nvb3JkICAgIAkwCisJCQkgICAgTmVzdGVkICAgICAJVFJVRSkpCisJCSAgICAob2JqZWN0IEludGVyT2JqVmlldyAiU3RhbmRhcmRXcmFwcGVyIiBANTU3CisJCQlsb2NhdGlvbiAgIAkoMTQyNCwgMjI0KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCVRSVUUKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKKwkJCSAgICBQYXJlbnRfVmlldyAJQDU1NworCQkJICAgIGxvY2F0aW9uICAgCSgxNDI0LCAyMjQpCisJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMgorCQkJICAgIG1heF93aWR0aCAgCTI4OAorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiU3RhbmRhcmRXcmFwcGVyIikKKwkJCWljb25fc3R5bGUgCSJJY29uIgorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCXF1aWR1ICAgICAgCSIzREZFNDkzNzAzNTEiCisJCQl3aWR0aCAgICAgIAkzMDYKKwkJCWhlaWdodCAgICAgCTIyMjYKKwkJCWljb25faGVpZ2h0IAkwCisJCQlpY29uX3dpZHRoIAkwCisJCQlpY29uX3lfb2Zmc2V0IAkwCisJCQlhbm5vdGF0aW9uIAkxCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDU1OAorCQkJICAgIGxvY2F0aW9uICAgCSgxNDI0LCA5NDQpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDU1NworCQkJICAgIGhlaWdodCAgICAgCTI2NAorCQkJICAgIHlfY29vcmQgICAgCTIwNAorCQkJICAgIE5lc3RlZCAgICAgCUZBTFNFKQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEA1NTkKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTQyNCwgMTUyMCkKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlANTU3CisJCQkgICAgaGVpZ2h0ICAgICAJMzQwCisJCQkgICAgeV9jb29yZCAgICAJMjgwCisJCQkgICAgTmVzdGVkICAgICAJRkFMU0UpKQorCQkgICAgKG9iamVjdCBJbnRlck9ialZpZXcgIlN0YW5kYXJkV3JhcHBlclZhbHZlIiBANTYwCisJCQlsb2NhdGlvbiAgIAkoMTc0NCwgMjI0KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCVRSVUUKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKKwkJCSAgICBQYXJlbnRfVmlldyAJQDU2MAorCQkJICAgIGxvY2F0aW9uICAgCSgxNzQ0LCAyMjQpCisJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMgorCQkJICAgIG1heF93aWR0aCAgCTI4MgorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiU3RhbmRhcmRXcmFwcGVyVmFsdmUiKQorCQkJaWNvbl9zdHlsZSAJIkljb24iCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJcXVpZHUgICAgICAJIjNERkU0OTg5MDA1NiIKKwkJCXdpZHRoICAgICAgCTMwMAorCQkJaGVpZ2h0ICAgICAJMjIyNgorCQkJaWNvbl9oZWlnaHQgCTAKKwkJCWljb25fd2lkdGggCTAKKwkJCWljb25feV9vZmZzZXQgCTAKKwkJCWFubm90YXRpb24gCTEKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBANTYxCisJCQkgICAgbG9jYXRpb24gICAJKDE3NDQsIDE0NDApCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDU2MAorCQkJICAgIGhlaWdodCAgICAgCTc0MAorCQkJICAgIHlfY29vcmQgICAgCTY4MAorCQkJICAgIE5lc3RlZCAgICAgCUZBTFNFKQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEA1NjIKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTc0NCwgMTYxNikKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlANTYwCisJCQkgICAgaGVpZ2h0ICAgICAJMTg0CisJCQkgICAgeV9jb29yZCAgICAJMTI0CisJCQkgICAgTmVzdGVkICAgICAJRkFMU0UpCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDU2MworCQkJICAgIGxvY2F0aW9uICAgCSgxNzQ0LCAyMDAwKQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUA1NjAKKwkJCSAgICBoZWlnaHQgICAgIAk2MAorCQkJICAgIHlfY29vcmQgICAgCTAKKwkJCSAgICBOZXN0ZWQgICAgIAlUUlVFKSkKKwkJICAgIChvYmplY3QgSW50ZXJPYmpWaWV3ICJBcHBsaWNhdGlvbkZpbHRlckNoYWluIiBANTY0CisJCQlsb2NhdGlvbiAgIAkoMjA2NCwgMjI0KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCVRSVUUKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKKwkJCSAgICBQYXJlbnRfVmlldyAJQDU2NAorCQkJICAgIGxvY2F0aW9uICAgCSgyMDY0LCAyMjQpCisJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMgorCQkJICAgIG1heF93aWR0aCAgCTI4MgorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiQXBwbGljYXRpb25GaWx0ZXJDaGFpbiIpCisJCQlpY29uX3N0eWxlIAkiSWNvbiIKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQlxdWlkdSAgICAgIAkiM0RGRTRBMTUwMEIyIgorCQkJd2lkdGggICAgICAJMzAwCisJCQloZWlnaHQgICAgIAkyMjI2CisJCQlpY29uX2hlaWdodCAJMAorCQkJaWNvbl93aWR0aCAJMAorCQkJaWNvbl95X29mZnNldCAJMAorCQkJYW5ub3RhdGlvbiAJMQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEA1NjUKKwkJCSAgICBsb2NhdGlvbiAgIAkoMjA2NCwgMTY4MCkKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlANTY0CisJCQkgICAgaGVpZ2h0ICAgICAJNjAKKwkJCSAgICB5X2Nvb3JkICAgIAkwCisJCQkgICAgTmVzdGVkICAgICAJRkFMU0UpCisJCQlGb2N1c19PZl9Db250cm9sIAkob2JqZWN0IEZvY3VzX09mX0NvbnRyb2wgIiIgQDU2NgorCQkJICAgIGxvY2F0aW9uICAgCSgyMDY0LCAxODA4KQorCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCSAgICBJbnRlck9ialZpZXcgCUA1NjQKKwkJCSAgICBoZWlnaHQgICAgIAkzMTIKKwkJCSAgICB5X2Nvb3JkICAgIAkyNTIKKwkJCSAgICBOZXN0ZWQgICAgIAlGQUxTRSkKKwkJCUZvY3VzX09mX0NvbnRyb2wgCShvYmplY3QgRm9jdXNfT2ZfQ29udHJvbCAiIiBANTY3CisJCQkgICAgbG9jYXRpb24gICAJKDIwNjQsIDE4NzIpCisJCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJICAgIEludGVyT2JqVmlldyAJQDU2NAorCQkJICAgIGhlaWdodCAgICAgCTYwCisJCQkgICAgeV9jb29yZCAgICAJMAorCQkJICAgIE5lc3RlZCAgICAgCVRSVUUpKQorCQkgICAgKG9iamVjdCBJbnRlck1lc3NWaWV3ICIiIEA1NjgKKwkJCWxvY2F0aW9uICAgCSgzMzYsIDQwMCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NjkKKwkJCSAgICBQYXJlbnRfVmlldyAJQDU2OAorCQkJICAgIGxvY2F0aW9uICAgCSgzMTksIDM1NikKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZFNDhCRTAyNjgiCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAkxNDcKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJImludm9rZSgpIgorCQkJICAgIHBjdERpc3QgICAgCTAuNTAwMDAwCisJCQkgICAgaGVpZ2h0ICAgICAJNDUKKwkJCSAgICBvcmllbnRhdGlvbiAJMCkKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUA1NDYKKwkJCXN1cHBsaWVyICAgCUA1NDgKKwkJCUZvY3VzX1NyYyAgCUA1NDcKKwkJCUZvY3VzX0VudHJ5IAlANTQ5CisJCQlvcmlnaW4gICAgIAkoMTc1LCA0MDApCisJCQl0ZXJtaW51cyAgIAkoNDY0LCA0MDApCisJCQlvcmRpbmFsICAgIAkwKQorCQkgICAgKG9iamVjdCBJbnRlck1lc3NWaWV3ICIiIEA1NzAKKwkJCWxvY2F0aW9uICAgCSgxNiwgNzM2KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU3MQorCQkJICAgIFBhcmVudF9WaWV3IAlANTcwCisJCQkgICAgbG9jYXRpb24gICAJKDYzOSwgNjkyKQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkU0OEVBMDAzQSIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTE0NworCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiaW52b2tlKCkiCisJCQkgICAgcGN0RGlzdCAgICAJMC41MDAwMDAKKwkJCSAgICBoZWlnaHQgICAgIAk0NQorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDU0OAorCQkJc3VwcGxpZXIgICAJQDU1MQorCQkJRm9jdXNfU3JjICAJQDU0OQorCQkJRm9jdXNfRW50cnkgCUA1NTIKKwkJCW9yaWdpbiAgICAgCSg0OTUsIDczNikKKwkJCXRlcm1pbnVzICAgCSg3ODQsIDczNikKKwkJCW9yZGluYWwgICAgCTEpCisJCSAgICAob2JqZWN0IEludGVyTWVzc1ZpZXcgIiIgQDU3MgorCQkJbG9jYXRpb24gICAJKDE2LCA4MDApCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTczCisJCQkgICAgUGFyZW50X1ZpZXcgCUA1NzIKKwkJCSAgICBsb2NhdGlvbiAgIAkoOTUxLCA3NTYpCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTQ5MTEwMkQ2IgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJMTQ3CisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJpbnZva2UoKSIKKwkJCSAgICBwY3REaXN0ICAgIAkwLjUwMDAwMAorCQkJICAgIGhlaWdodCAgICAgCTQ1CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlANTUxCisJCQlzdXBwbGllciAgIAlANTU0CisJCQlGb2N1c19TcmMgIAlANTUyCisJCQlGb2N1c19FbnRyeSAJQDU1NQorCQkJb3JpZ2luICAgICAJKDgxNSwgODAwKQorCQkJdGVybWludXMgICAJKDEwODgsIDgwMCkKKwkJCW9yZGluYWwgICAgCTIpCisJCSAgICAob2JqZWN0IFNlbGZNZXNzVmlldyAiIiBANTc0CisJCQlsb2NhdGlvbiAgIAkoMTYsIDg0OCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NzUKKwkJCSAgICBQYXJlbnRfVmlldyAJQDU3NAorCQkJICAgIGxvY2F0aW9uICAgCSgxMzIyLCA4MjEpCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTQ5MkYwMzNEIgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJNDM3CisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJtYXAgLy9yZXR1cm4gV3JhcHBlciIKKwkJCSAgICBwY3REaXN0ICAgIAkxLjM0NjY2NworCQkJICAgIGhlaWdodCAgICAgCTI4CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlANTU0CisJCQlzdXBwbGllciAgIAlANTU0CisJCQlGb2N1c19TcmMgIAlANTU1CisJCQlGb2N1c19FbnRyeSAJQDU1NgorCQkJb3JpZ2luICAgICAJKDExMjAsIDg0OCkKKwkJCXRlcm1pbnVzICAgCSgxMjcwLCA4NDgpCisJCQlvcmRpbmFsICAgIAkzKQorCQkgICAgKG9iamVjdCBJbnRlck1lc3NWaWV3ICIiIEA1NzYKKwkJCWxvY2F0aW9uICAgCSgxMjY0LCA5NDQpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTc3CisJCQkgICAgUGFyZW50X1ZpZXcgCUA1NzYKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTI2MiwgOTAxKQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkU0OTRBMDE1MSIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTE0NworCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiaW52b2tlKCkiCisJCQkgICAgcGN0RGlzdCAgICAJMC40OTgyNzAKKwkJCSAgICBoZWlnaHQgICAgIAk0NAorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDU1NAorCQkJc3VwcGxpZXIgICAJQDU1NworCQkJRm9jdXNfU3JjICAJQDU1NQorCQkJRm9jdXNfRW50cnkgCUA1NTgKKwkJCW9yaWdpbiAgICAgCSgxMTE5LCA5NDQpCisJCQl0ZXJtaW51cyAgIAkoMTQwOCwgOTQ0KQorCQkJb3JkaW5hbCAgICAJNCkKKwkJICAgIChvYmplY3QgSW50ZXJNZXNzVmlldyAiIiBANTc4CisJCQlsb2NhdGlvbiAgIAkoOTYwLCAxMDg4KQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU3OQorCQkJICAgIFBhcmVudF9WaWV3IAlANTc4CisJCQkgICAgbG9jYXRpb24gICAJKDk1MiwgMTA0NCkKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZFNDk1RjAyODgiCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAkxNDcKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJImludm9rZSgpIgorCQkJICAgIHBjdERpc3QgICAgCTAuNTAwMDAwCisJCQkgICAgaGVpZ2h0ICAgICAJNDUKKwkJCSAgICBvcmllbnRhdGlvbiAJMSkKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUA1NTcKKwkJCXN1cHBsaWVyICAgCUA1NDgKKwkJCUZvY3VzX1NyYyAgCUA1NTgKKwkJCUZvY3VzX0VudHJ5IAlANTUwCisJCQlvcmlnaW4gICAgIAkoMTQwOCwgMTA4OCkKKwkJCXRlcm1pbnVzICAgCSg0OTYsIDEwODgpCisJCQlvcmRpbmFsICAgIAk1KQorCQkgICAgKG9iamVjdCBJbnRlck1lc3NWaWV3ICIiIEA1ODAKKwkJCWxvY2F0aW9uICAgCSgxNiwgMTE2OCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1ODEKKwkJCSAgICBQYXJlbnRfVmlldyAJQDU4MAorCQkJICAgIGxvY2F0aW9uICAgCSg2MzksIDExMjQpCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTQ5NzYwMTVEIgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJMTQ3CisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJpbnZva2UoKSIKKwkJCSAgICBwY3REaXN0ICAgIAkwLjUwMDAwMAorCQkJICAgIGhlaWdodCAgICAgCTQ1CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlANTQ4CisJCQlzdXBwbGllciAgIAlANTUxCisJCQlGb2N1c19TcmMgIAlANTQ5CisJCQlGb2N1c19FbnRyeSAJQDU1MworCQkJb3JpZ2luICAgICAJKDQ5NSwgMTE2OCkKKwkJCXRlcm1pbnVzICAgCSg3ODQsIDExNjgpCisJCQlvcmRpbmFsICAgIAk2KQorCQkgICAgKG9iamVjdCBJbnRlck1lc3NWaWV3ICIiIEA1ODIKKwkJCWxvY2F0aW9uICAgCSgxMjk2LCAxNDQwKQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU4MworCQkJICAgIFBhcmVudF9WaWV3IAlANTgyCisJCQkgICAgbG9jYXRpb24gICAJKDEyNzEsIDEzOTYpCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTQ5OTMwMjNDIgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJMTQ3CisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJpbnZva2UoKSIKKwkJCSAgICBwY3REaXN0ICAgIAkwLjUwMDAwMAorCQkJICAgIGhlaWdodCAgICAgCTQ1CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlANTUxCisJCQlzdXBwbGllciAgIAlANTYwCisJCQlGb2N1c19TcmMgIAlANTUzCisJCQlGb2N1c19FbnRyeSAJQDU2MQorCQkJb3JpZ2luICAgICAJKDgxNSwgMTQ0MCkKKwkJCXRlcm1pbnVzICAgCSgxNzI4LCAxNDQwKQorCQkJb3JkaW5hbCAgICAJNykKKwkJICAgIChvYmplY3QgSW50ZXJNZXNzVmlldyAiIiBANTg0CisJCQlsb2NhdGlvbiAgIAkoMTYxNiwgMTUyMCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1ODUKKwkJCSAgICBQYXJlbnRfVmlldyAJQDU4NAorCQkJICAgIGxvY2F0aW9uICAgCSgxNTg0LCAxNDc2KQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkU0OUVDMDA0RiIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTE3NQorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiYWxsb2NhdGUoKSIKKwkJCSAgICBwY3REaXN0ICAgIAkwLjUwMDAwMAorCQkJICAgIGhlaWdodCAgICAgCTQ1CisJCQkgICAgb3JpZW50YXRpb24gCTEpCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlANTYwCisJCQlzdXBwbGllciAgIAlANTU3CisJCQlGb2N1c19TcmMgIAlANTYxCisJCQlGb2N1c19FbnRyeSAJQDU1OQorCQkJb3JpZ2luICAgICAJKDE3MjgsIDE1MjApCisJCQl0ZXJtaW51cyAgIAkoMTQ0MCwgMTUyMCkKKwkJCW9yZGluYWwgICAgCTgpCisJCSAgICAob2JqZWN0IEludGVyTWVzc1ZpZXcgIiIgQDU4NgorCQkJbG9jYXRpb24gICAJKDE2MTYsIDE2MTYpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKKwkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQorCQkJICAgIGNvbG9yICAgICAgCTAKKwkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTg3CisJCQkgICAgUGFyZW50X1ZpZXcgCUA1ODYKKwkJCSAgICBsb2NhdGlvbiAgIAkoMTU4MywgMTU3MikKKwkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCQlzaXplICAgICAgIAkxMAorCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKKwkJCQlib2xkICAgICAgIAlGQUxTRQorCQkJCWl0YWxpY3MgICAgCUZBTFNFCisJCQkJdW5kZXJsaW5lICAJRkFMU0UKKwkJCQlzdHJpa2UgICAgIAlGQUxTRQorCQkJCWNvbG9yICAgICAgCTAKKwkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQorCQkJICAgIHF1aWR1ICAgICAgCSIzREZFNEEyMDAwNjciCisJCQkgICAgYW5jaG9yX2xvYyAJMQorCQkJICAgIG5saW5lcyAgICAgCTEKKwkJCSAgICBtYXhfd2lkdGggIAkyNDIKKwkJCSAgICBqdXN0aWZ5ICAgIAkwCisJCQkgICAgbGFiZWwgICAgICAJInJldHVybiBzZXJ2bGV0IgorCQkJICAgIHBjdERpc3QgICAgCTAuNTAwMDAwCisJCQkgICAgaGVpZ2h0ICAgICAJNDUKKwkJCSAgICBvcmllbnRhdGlvbiAJMCkKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUA1NTcKKwkJCXN1cHBsaWVyICAgCUA1NjAKKwkJCUZvY3VzX1NyYyAgCUA1NTkKKwkJCUZvY3VzX0VudHJ5IAlANTYyCisJCQlvcmlnaW4gICAgIAkoMTQzOSwgMTYxNikKKwkJCXRlcm1pbnVzICAgCSgxNzI4LCAxNjE2KQorCQkJb3JkaW5hbCAgICAJOSkKKwkJICAgIChvYmplY3QgSW50ZXJNZXNzVmlldyAiIiBANTg4CisJCQlsb2NhdGlvbiAgIAkoMTkzNiwgMTY4MCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1ODkKKwkJCSAgICBQYXJlbnRfVmlldyAJQDU4OAorCQkJICAgIGxvY2F0aW9uICAgCSgxOTM3LCAxNjM2KQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkU0QTI5MDI3RSIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTM0MworCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiY3JlYXRlRmlsdGVyQ2hhaW4oKSIKKwkJCSAgICBwY3REaXN0ICAgIAkwLjYxOTM3NworCQkJICAgIGhlaWdodCAgICAgCTQ1CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlANTYwCisJCQlzdXBwbGllciAgIAlANTY0CisJCQlGb2N1c19TcmMgIAlANTYyCisJCQlGb2N1c19FbnRyeSAJQDU2NQorCQkJb3JpZ2luICAgICAJKDE3NTksIDE2ODApCisJCQl0ZXJtaW51cyAgIAkoMjA0OCwgMTY4MCkKKwkJCW9yZGluYWwgICAgCTEwKQorCQkgICAgKG9iamVjdCBJbnRlck1lc3NWaWV3ICIiIEA1OTAKKwkJCWxvY2F0aW9uICAgCSgxNiwgMTgwOCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1OTEKKwkJCSAgICBQYXJlbnRfVmlldyAJQDU5MAorCQkJICAgIGxvY2F0aW9uICAgCSgxOTAyLCAxNzY0KQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkU0QTQ5MDI4MyIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTE3MAorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkiZG9GaWx0ZXIoKSIKKwkJCSAgICBwY3REaXN0ICAgIAkwLjQ5ODI3MAorCQkJICAgIGhlaWdodCAgICAgCTQ1CisJCQkgICAgb3JpZW50YXRpb24gCTApCisJCQlsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQljbGllbnQgICAgIAlANTYwCisJCQlzdXBwbGllciAgIAlANTY0CisJCQlGb2N1c19TcmMgIAlANTYxCisJCQlGb2N1c19FbnRyeSAJQDU2NgorCQkJb3JpZ2luICAgICAJKDE3NTksIDE4MDgpCisJCQl0ZXJtaW51cyAgIAkoMjA0OCwgMTgwOCkKKwkJCW9yZGluYWwgICAgCTExKQorCQkgICAgKG9iamVjdCBJbnRlck9ialZpZXcgIiRVTk5BTUVEJDAiIEA1OTIKKwkJCWxvY2F0aW9uICAgCSgyMjQwLCAzNjgpCisJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKKwkJCSAgICBzaXplICAgICAgIAkxMAorCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKKwkJCSAgICBib2xkICAgICAgIAlGQUxTRQorCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCisJCQkgICAgdW5kZXJsaW5lICAJVFJVRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAorCQkJICAgIFBhcmVudF9WaWV3IAlANTkyCisJCQkgICAgbG9jYXRpb24gICAJKDIyNDAsIDM2OCkKKwkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkyCisJCQkgICAgbWF4X3dpZHRoICAJMjgyCisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSIiKQorCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKKwkJCSAgICBQYXJlbnRfVmlldyAJQDU5MgorCQkJICAgIGxvY2F0aW9uICAgCSgyMjQwLCAzNjgpCisJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKKwkJCSAgICBhbmNob3IgICAgIAkxMAorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJMjIyCisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSI8PFNlcnZsZXQ+PiIpCisJCQlpY29uX3N0eWxlIAkiSWNvbiIKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWZpbGxfY29sb3IgCTEzNDM0ODc5CisJCQlxdWlkdSAgICAgIAkiM0RGRTRCQUUwMDU2IgorCQkJd2lkdGggICAgICAJMzAwCisJCQloZWlnaHQgICAgIAkyMDgyCisJCQlpY29uX2hlaWdodCAJMAorCQkJaWNvbl93aWR0aCAJMAorCQkJaWNvbl95X29mZnNldCAJMAorCQkJYW5ub3RhdGlvbiAJMQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEA1OTMKKwkJCSAgICBsb2NhdGlvbiAgIAkoMjI0MCwgNDI4KQorCQkJICAgIEludGVyT2JqVmlldyAJQDU5MgorCQkJICAgIGhlaWdodCAgICAgCTYwCisJCQkgICAgeV9jb29yZCAgICAJMAorCQkJICAgIE5lc3RlZCAgICAgCUZBTFNFKQorCQkJRm9jdXNfT2ZfQ29udHJvbCAJKG9iamVjdCBGb2N1c19PZl9Db250cm9sICIiIEA1OTQKKwkJCSAgICBsb2NhdGlvbiAgIAkoMjI0MCwgMTk4NCkKKwkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5CisJCQkgICAgSW50ZXJPYmpWaWV3IAlANTkyCisJCQkgICAgaGVpZ2h0ICAgICAJNjAKKwkJCSAgICB5X2Nvb3JkICAgIAkwCisJCQkgICAgTmVzdGVkICAgICAJRkFMU0UpKQorCQkgICAgKG9iamVjdCBTZWxmTWVzc1ZpZXcgIiIgQDU5NQorCQkJbG9jYXRpb24gICAJKDE2LCAxODcyKQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU5NgorCQkJICAgIFBhcmVudF9WaWV3IAlANTk1CisJCQkgICAgbG9jYXRpb24gICAJKDIxNTUsIDE4MjgpCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTRDMjcwMUMzIgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJMzA4CisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJpbnRlcm5hbERvRmlsdGVyKCkiCisJCQkgICAgcGN0RGlzdCAgICAJMC41MDAwMDAKKwkJCSAgICBoZWlnaHQgICAgIAk0NQorCQkJICAgIG9yaWVudGF0aW9uIAkwKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDU2NAorCQkJc3VwcGxpZXIgICAJQDU2NAorCQkJRm9jdXNfU3JjICAJQDU2NgorCQkJRm9jdXNfRW50cnkgCUA1NjcKKwkJCW9yaWdpbiAgICAgCSgyMDgwLCAxODcyKQorCQkJdGVybWludXMgICAJKDIyMzAsIDE4NzIpCisJCQlvcmRpbmFsICAgIAkxMikKKwkJICAgIChvYmplY3QgSW50ZXJNZXNzVmlldyAiIiBANTk3CisJCQlsb2NhdGlvbiAgIAkoMjE0NCwgMTk4NCkKKwkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJICAgIHNpemUgICAgICAgCTEwCisJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgorCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCisJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKKwkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQorCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCisJCQkgICAgY29sb3IgICAgICAJMAorCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1OTgKKwkJCSAgICBQYXJlbnRfVmlldyAJQDU5NworCQkJICAgIGxvY2F0aW9uICAgCSgyMTUxLCAxOTQwKQorCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAorCQkJCXNpemUgICAgICAgCTEwCisJCQkJZmFjZSAgICAgICAJIkFyaWFsIgorCQkJCWJvbGQgICAgICAgCUZBTFNFCisJCQkJaXRhbGljcyAgICAJRkFMU0UKKwkJCQl1bmRlcmxpbmUgIAlGQUxTRQorCQkJCXN0cmlrZSAgICAgCUZBTFNFCisJCQkJY29sb3IgICAgICAJMAorCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCisJCQkgICAgcXVpZHUgICAgICAJIjNERkU0Q0E1MDJCRiIKKwkJCSAgICBhbmNob3JfbG9jIAkxCisJCQkgICAgbmxpbmVzICAgICAJMQorCQkJICAgIG1heF93aWR0aCAgCTE2MgorCQkJICAgIGp1c3RpZnkgICAgCTAKKwkJCSAgICBsYWJlbCAgICAgIAkic2VydmljZSgpIgorCQkJICAgIHBjdERpc3QgICAgCTAuNTAwMDAwCisJCQkgICAgaGVpZ2h0ICAgICAJNDUKKwkJCSAgICBvcmllbnRhdGlvbiAJMCkKKwkJCWxpbmVfY29sb3IgCTMzNDI0ODkKKwkJCWNsaWVudCAgICAgCUA1NjQKKwkJCXN1cHBsaWVyICAgCUA1OTIKKwkJCUZvY3VzX1NyYyAgCUA1NjYKKwkJCUZvY3VzX0VudHJ5IAlANTk0CisJCQlvcmlnaW4gICAgIAkoMjA3OSwgMTk4NCkKKwkJCXRlcm1pbnVzICAgCSgyMjI0LCAxOTg0KQorCQkJb3JkaW5hbCAgICAJMTMpCisJCSAgICAob2JqZWN0IEludGVyTWVzc1ZpZXcgIiIgQDU5OQorCQkJbG9jYXRpb24gICAJKDE2LCAyMDAwKQorCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkgICAgc2l6ZSAgICAgICAJMTAKKwkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCisJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKKwkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQorCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCisJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKKwkJCSAgICBjb2xvciAgICAgIAkwCisJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDYwMAorCQkJICAgIFBhcmVudF9WaWV3IAlANTk5CisJCQkgICAgbG9jYXRpb24gICAJKDE5MDQsIDE5NTYpCisJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250CisJCQkJc2l6ZSAgICAgICAJMTAKKwkJCQlmYWNlICAgICAgIAkiQXJpYWwiCisJCQkJYm9sZCAgICAgICAJRkFMU0UKKwkJCQlpdGFsaWNzICAgIAlGQUxTRQorCQkJCXVuZGVybGluZSAgCUZBTFNFCisJCQkJc3RyaWtlICAgICAJRkFMU0UKKwkJCQljb2xvciAgICAgIAkwCisJCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKKwkJCSAgICBxdWlkdSAgICAgIAkiM0RGRTRDQjQwMjVCIgorCQkJICAgIGFuY2hvcl9sb2MgCTEKKwkJCSAgICBubGluZXMgICAgIAkxCisJCQkgICAgbWF4X3dpZHRoICAJMTEzCisJCQkgICAganVzdGlmeSAgICAJMAorCQkJICAgIGxhYmVsICAgICAgCSJyZXR1cm4iCisJCQkgICAgcGN0RGlzdCAgICAJMC41MDAwMDAKKwkJCSAgICBoZWlnaHQgICAgIAk0NQorCQkJICAgIG9yaWVudGF0aW9uIAkxKQorCQkJbGluZV9jb2xvciAJMzM0MjQ4OQorCQkJY2xpZW50ICAgICAJQDU2NAorCQkJc3VwcGxpZXIgICAJQDU2MAorCQkJRm9jdXNfU3JjICAJQDU2NgorCQkJRm9jdXNfRW50cnkgCUA1NjMKKwkJCW9yaWdpbiAgICAgCSgyMDQ4LCAyMDAwKQorCQkJdGVybWludXMgICAJKDE3NjAsIDIwMDApCisJCQlvcmRpbmFsICAgIAkxNCkpKSkpCisgICAgcm9vdF9zdWJzeXN0ZW0gCShvYmplY3QgU3ViU3lzdGVtICJDb21wb25lbnQgVmlldyIKKwlxdWlkICAgICAgIAkiM0RGREY2Q0UwMzZBIgorCXBoeXNpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdCkKKwlwaHlzaWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0CisJICAgIChvYmplY3QgTW9kdWxlX0RpYWdyYW0gIk1haW4iCisJCXF1aWQgICAgICAgCSIzREZERjZEMjAxRkQiCisJCXRpdGxlICAgICAgCSJNYWluIgorCQl6b29tICAgICAgIAkxMDAKKwkJbWF4X2hlaWdodCAJMjgzNTAKKwkJbWF4X3dpZHRoICAJMjE2MDAKKwkJb3JpZ2luX3ggICAJMAorCQlvcmlnaW5feSAgIAkwCisJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0KSkpKQorICAgIHByb2Nlc3Nfc3RydWN0dXJlIAkob2JqZWN0IFByb2Nlc3NlcworCXF1aWQgICAgICAgCSIzREZERjZDRTAzNzMiCisJUHJvY3NORGV2cyAJKGxpc3QKKwkgICAgKG9iamVjdCBQcm9jZXNzX0RpYWdyYW0gIkRlcGxveW1lbnQgVmlldyIKKwkJcXVpZCAgICAgICAJIjNERkRGNkNFMDM4NyIKKwkJdGl0bGUgICAgICAJIkRlcGxveW1lbnQgVmlldyIKKwkJem9vbSAgICAgICAJMTAwCisJCW1heF9oZWlnaHQgCTI4MzUwCisJCW1heF93aWR0aCAgCTIxNjAwCisJCW9yaWdpbl94ICAgCTAKKwkJb3JpZ2luX3kgICAJMAorCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdCkpKSkKKyAgICBwcm9wZXJ0aWVzIAkob2JqZWN0IFByb3BlcnRpZXMKKwlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0CisJICAgIChvYmplY3QgQXR0cmlidXRlCisJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIgorCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikKKwkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiCisJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJInByb2plY3QiCisJCQl2YWx1ZSAgICAgIAkiIikKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIlRhYmxlQ291bnRlciIKKwkJCXZhbHVlICAgICAgCTApCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJWaWV3Q291bnRlciIKKwkJCXZhbHVlICAgICAgCTApCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJEb21haW5Db3VudGVyIgorCQkJdmFsdWUgICAgICAJMCkKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIlNQUGFja2FnZUNvdW50ZXIiCisJCQl2YWx1ZSAgICAgIAkwKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiVHJpZ2dlckNvdW50ZXIiCisJCQl2YWx1ZSAgICAgIAkwKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiSW5kZXhDb3VudGVyIgorCQkJdmFsdWUgICAgICAJMCkKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIkNvbnN0cmFpbnRDb3VudGVyIgorCQkJdmFsdWUgICAgICAJMCkKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIlN0b3JlUHJvY2VkdXJlQ291bnRlciIKKwkJCXZhbHVlICAgICAgCTApCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5Q291bnRlciIKKwkJCXZhbHVlICAgICAgCTApCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJGb3JlaWduS2V5Q291bnRlciIKKwkJCXZhbHVlICAgICAgCTApCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJKb2luQ291bnRlciIKKwkJCXZhbHVlICAgICAgCTApCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJUYWJsZVNwYWNlQ291bnRlciIKKwkJCXZhbHVlICAgICAgCTApCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJjT05UQUlORVJDb3VudGVyIgorCQkJdmFsdWUgICAgICAJMCkKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIlRhYmxlUHJlZml4IgorCQkJdmFsdWUgICAgICAJIiIpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJWaWV3UHJlZml4IgorCQkJdmFsdWUgICAgICAJIiIpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJEb21haW5QcmVmaXgiCisJCQl2YWx1ZSAgICAgIAkiIikKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIlRyaWdnZXJQcmVmaXgiCisJCQl2YWx1ZSAgICAgIAkiIikKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIkluZGV4UHJlZml4IgorCQkJdmFsdWUgICAgICAJIiIpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJDb25zdHJhaW50UHJlZml4IgorCQkJdmFsdWUgICAgICAJIiIpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJTdG9yZVByb2NlZHVyZVByZWZpeCIKKwkJCXZhbHVlICAgICAgCSIiKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiUHJpbWFyeUtleVByZWZpeCIKKwkJCXZhbHVlICAgICAgCSIiKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiRm9yZWlnbktleVByZWZpeCIKKwkJCXZhbHVlICAgICAgCSIiKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiVGFibGVTcGFjZVByZWZpeCIKKwkJCXZhbHVlICAgICAgCSIiKSkpCisJICAgIChvYmplY3QgQXR0cmlidXRlCisJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyIKKwkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiZG1JdGVtIgorCQkJdmFsdWUgICAgICAJRkFMU0UpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJETU5hbWUiCisJCQl2YWx1ZSAgICAgIAkiIikKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIklzRGF0YWJhc2UiCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIlRhcmdldERhdGFiYXNlIgorCQkJdmFsdWUgICAgICAJIiIpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJMb2NhdGlvbiIKKwkJCXZhbHVlICAgICAgCSIiKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiSXNUYWJsZVNwYWNlIgorCQkJdmFsdWUgICAgICAJRkFMU0UpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJUYWJsZVNwYWNlVHlwZSIKKwkJCXZhbHVlICAgICAgCSIiKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiSXNEZWF1bHQiCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIkJ1ZmZlclBvb2wiCisJCQl2YWx1ZSAgICAgIAkiIikKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIkV4dGVudFNpemUiCisJCQl2YWx1ZSAgICAgIAkxKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiUHJlZmV0Y2hTaXplIgorCQkJdmFsdWUgICAgICAJMSkKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIlBhZ2VTaXplIgorCQkJdmFsdWUgICAgICAJNCkKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIk1hbmFnZWRCeSIKKwkJCXZhbHVlICAgICAgCSIiKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiQ29udGFpbmVyTGlzdCIKKwkJCXZhbHVlICAgICAgCSIiKSkpCisJICAgIChvYmplY3QgQXR0cmlidXRlCisJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCW5hbWUgICAgICAgCSJkZWZhdWx0X19DYXRlZ29yeSIKKwkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiZG1JdGVtIgorCQkJdmFsdWUgICAgICAJRkFMU0UpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJETU5hbWUiCisJCQl2YWx1ZSAgICAgIAkiIikKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJImRtU2NoZW1hIgorCQkJdmFsdWUgICAgICAJIiIpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJkbURvbWFpblBhY2thZ2UiCisJCQl2YWx1ZSAgICAgIAkiIikKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIklzU2NoZW1hIgorCQkJdmFsdWUgICAgICAJRkFMU0UpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJJc0RvbWFpblBhY2thZ2UiCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIklzUm9vdFNjaGVtYSIKKwkJCXZhbHVlICAgICAgCUZBTFNFKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiSXNSb290RG9tYWluUGFja2FnZSIKKwkJCXZhbHVlICAgICAgCUZBTFNFKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiSXNTY2hlbWFQYWNrYWdlIgorCQkJdmFsdWUgICAgICAJRkFMU0UpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJEYXRhYmFzZUlEIgorCQkJdmFsdWUgICAgICAJIiIpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJEQk1TIgorCQkJdmFsdWUgICAgICAJIiIpKSkKKwkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIgorCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0CisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJkbUl0ZW0iCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIkRNTmFtZSIKKwkJCXZhbHVlICAgICAgCSIiKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiSXNUYWJsZSIKKwkJCXZhbHVlICAgICAgCUZBTFNFKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiSXNWaWV3IgorCQkJdmFsdWUgICAgICAJRkFMU0UpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJJc0RvbWFpbiIKKwkJCXZhbHVlICAgICAgCUZBTFNFKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiSXNTUFBhY2thZ2UiCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIlN5bm9ueW1ucyIKKwkJCXZhbHVlICAgICAgCSIiKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiVGFibGVTcGFjZUlEIgorCQkJdmFsdWUgICAgICAJIiIpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJTb3VyY2VJZCIKKwkJCXZhbHVlICAgICAgCSIiKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiU291cmNlVHlwZSIKKwkJCXZhbHVlICAgICAgCSIiKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiQ29ycmVsYXRpb25OYW1lIgorCQkJdmFsdWUgICAgICAJIiIpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJTZWxlY3RDbGF1c2UiCisJCQl2YWx1ZSAgICAgIAkiIikKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIklzVXBkYXRlYWJsZSIKKwkJCXZhbHVlICAgICAgCVRSVUUpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJDaGVja09wdGlvbiIKKwkJCXZhbHVlICAgICAgCSJOb25lIikKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIklzU25hcFNob3QiCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIklzRGlzdGluY3QiCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIlBlcnNpc3RUb1NlcnZlciIKKwkJCXZhbHVlICAgICAgCSIiKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiSXNQYWNrYWdlIgorCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKKwkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKKwkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiZG1JdGVtIgorCQkJdmFsdWUgICAgICAJRkFMU0UpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJETU5hbWUiCisJCQl2YWx1ZSAgICAgIAkiIikKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIk9yZGluYWwiCisJCQl2YWx1ZSAgICAgIAkwKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiSXNJZGVudGl0eSIKKwkJCXZhbHVlICAgICAgCUZBTFNFKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiSXNVbmlxdWUiCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIk51bGxzQWxsb3dlZCIKKwkJCXZhbHVlICAgICAgCUZBTFNFKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiTGVuZ3RoIgorCQkJdmFsdWUgICAgICAJMCkKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIlNjYWxlIgorCQkJdmFsdWUgICAgICAJMCkKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIkNvbHVtblR5cGUiCisJCQl2YWx1ZSAgICAgIAkiTmF0aXZlIikKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIkZvckJpdERhdGEiCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIkRlZmF1bHRWYWx1ZVR5cGUiCisJCQl2YWx1ZSAgICAgIAkiIikKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIkRlZmF1bHRWYWx1ZSIKKwkJCXZhbHVlICAgICAgCSIiKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiU291cmNlSWQiCisJCQl2YWx1ZSAgICAgIAkiIikKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIlNvdXJjZVR5cGUiCisJCQl2YWx1ZSAgICAgIAkiIikKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIk9JRCIKKwkJCXZhbHVlICAgICAgCUZBTFNFKSkpCisJICAgIChvYmplY3QgQXR0cmlidXRlCisJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCW5hbWUgICAgICAgCSJkZWZhdWx0X19Bc3NvY2lhdGlvbiIKKwkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiZG1JdGVtIgorCQkJdmFsdWUgICAgICAJRkFMU0UpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJETU5hbWUiCisJCQl2YWx1ZSAgICAgIAkiIikKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIklzUmVsYXRpb25zaGlwIgorCQkJdmFsdWUgICAgICAJRkFMU0UpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJTb3VyY2VJZCIKKwkJCXZhbHVlICAgICAgCSIiKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiU291cmNlVHlwZSIKKwkJCXZhbHVlICAgICAgCSIiKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiUklNZXRob2QiCisJCQl2YWx1ZSAgICAgIAkiIikKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIlBhcmVudFVwZGF0ZVJ1bGUiCisJCQl2YWx1ZSAgICAgIAkiIikKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIlBhcmVudFVwZGF0ZVJ1bGVOYW1lIgorCQkJdmFsdWUgICAgICAJIiIpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJQYXJlbnREZWxldGVSdWxlIgorCQkJdmFsdWUgICAgICAJIiIpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJQYXJlbnREZWxldGVSdWxlTmFtZSIKKwkJCXZhbHVlICAgICAgCSIiKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiQ2hpbGRJbnNlcnRSZXN0cmljdCIKKwkJCXZhbHVlICAgICAgCUZBTFNFKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiQ2hpbGRJbnNlcnRSZXN0cmljdE5hbWUiCisJCQl2YWx1ZSAgICAgIAkiIikKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIkNoaWxkTXVsdGlwbGljaXR5IgorCQkJdmFsdWUgICAgICAJRkFMU0UpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJDaGlsZE11bHRpcGxpY2l0eU5hbWUiCisJCQl2YWx1ZSAgICAgIAkiIikpKQorCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSIKKwkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiZG1JdGVtIgorCQkJdmFsdWUgICAgICAJRkFMU0UpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJETU5hbWUiCisJCQl2YWx1ZSAgICAgIAkiIikKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIkNvbnN0cmFpbnROYW1lIgorCQkJdmFsdWUgICAgICAJIiIpKSkKKwkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiIKKwkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiZG1JdGVtIgorCQkJdmFsdWUgICAgICAJRkFMU0UpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJETU5hbWUiCisJCQl2YWx1ZSAgICAgIAkiIikKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIklzQ29uc3RyYWludCIKKwkJCXZhbHVlICAgICAgCUZBTFNFKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiQ29uc3RyYWludFR5cGUiCisJCQl2YWx1ZSAgICAgIAkiIikKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIklzSW5kZXgiCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIklzVHJpZ2dlciIKKwkJCXZhbHVlICAgICAgCUZBTFNFKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiSXNTdG9yZWRQcm9jZWR1cmUiCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIklzQ2x1c3RlciIKKwkJCXZhbHVlICAgICAgCUZBTFNFKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiVGFibGVTcGFjZSIKKwkJCXZhbHVlICAgICAgCSIiKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiRmlsbEZhY3RvciIKKwkJCXZhbHVlICAgICAgCTApCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJLZXlMaXN0IgorCQkJdmFsdWUgICAgICAJIiIpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJDaGVja1ByZWRpY2F0ZSIKKwkJCXZhbHVlICAgICAgCSIiKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiSXNVbmlxdWUiCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIkRlZmVyYWxNb2RlIgorCQkJdmFsdWUgICAgICAJIiIpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJJbml0aWFsQ2hlY2tUaW1lIgorCQkJdmFsdWUgICAgICAJIiIpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJUcmlnZ2VyVHlwZSIKKwkJCXZhbHVlICAgICAgCSIiKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiSXNJbnNlcnRFdmVudCIKKwkJCXZhbHVlICAgICAgCUZBTFNFKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiSXNVcGRhdGVFdmVudCIKKwkJCXZhbHVlICAgICAgCUZBTFNFKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiSXNEZWxldGVFdmVudCIKKwkJCXZhbHVlICAgICAgCUZBTFNFKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiUmVmT2xkVGFibGUiCisJCQl2YWx1ZSAgICAgIAkiIikKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIlJlZk5ld1RhYmxlIgorCQkJdmFsdWUgICAgICAJIiIpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJSZWZPbGRSb3ciCisJCQl2YWx1ZSAgICAgIAkiIikKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIlJlZk5ld1JvdyIKKwkJCXZhbHVlICAgICAgCSIiKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiSXNSb3ciCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIldoZW5DbGF1c2UiCisJCQl2YWx1ZSAgICAgIAkiIikKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIkxhbmd1YWdlIgorCQkJdmFsdWUgICAgICAJIlNRTCIpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJQcm9jVHlwZSIKKwkJCXZhbHVlICAgICAgCSJQcm9jZWR1cmUiKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiSXNEZXRlcm1pbmlzdGljIgorCQkJdmFsdWUgICAgICAJRkFMU0UpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJQYXJhbWV0ZXJTdHlsZSIKKwkJCXZhbHVlICAgICAgCSIiKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiUmV0dXJuZWROdWxsIgorCQkJdmFsdWUgICAgICAJRkFMU0UpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJFeHRlcm5hbE5hbWUiCisJCQl2YWx1ZSAgICAgIAkiIikKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIkxlbmd0aCIKKwkJCXZhbHVlICAgICAgCSIiKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiU2NhbGUiCisJCQl2YWx1ZSAgICAgIAkiIikKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIkZvckJpdERhdGEiCisJCQl2YWx1ZSAgICAgIAlGQUxTRSkKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIkRlZmF1bHRWYWx1ZSIKKwkJCXZhbHVlICAgICAgCSIiKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiRGVmYXVsdFZhbHVlVHlwZSIKKwkJCXZhbHVlICAgICAgCSIiKSkpCisJICAgIChvYmplY3QgQXR0cmlidXRlCisJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCW5hbWUgICAgICAgCSJkZWZhdWx0X19QYXJhbWV0ZXIiCisJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJImRtSXRlbSIKKwkJCXZhbHVlICAgICAgCUZBTFNFKQorCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCisJCQluYW1lICAgICAgIAkiRE1OYW1lIgorCQkJdmFsdWUgICAgICAJIiIpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJJc0luUGFyYW1ldGVyIgorCQkJdmFsdWUgICAgICAJVFJVRSkKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIklzT3V0UGFyYW1ldGVyIgorCQkJdmFsdWUgICAgICAJRkFMU0UpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJPcmRpbmFsIgorCQkJdmFsdWUgICAgICAJIiIpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJMZW5ndGgiCisJCQl2YWx1ZSAgICAgIAkiIikKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIlNjYWxlIgorCQkJdmFsdWUgICAgICAJIiIpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJGb3JCaXREYXRhIgorCQkJdmFsdWUgICAgICAJRkFMU0UpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJEZWZhdWx0VmFsdWVUeXBlIgorCQkJdmFsdWUgICAgICAJIiIpCisJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJCW5hbWUgICAgICAgCSJEZWZhdWx0VmFsdWUiCisJCQl2YWx1ZSAgICAgIAkiIikKKwkJICAgIChvYmplY3QgQXR0cmlidXRlCisJCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgorCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbklEIgorCQkJdmFsdWUgICAgICAJIiIpKSkKKwkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKKwkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCisJCXZhbHVlICAgICAgCUZBTFNFKQorCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIENvbW11bmljYXRvciIKKwkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCisJCXZhbHVlICAgICAgCUZBTFNFKQorCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQl0b29sICAgICAgIAkiRGVwbG95IgorCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKKwkJdmFsdWUgICAgICAJRkFMU0UpCisJICAgIChvYmplY3QgQXR0cmlidXRlCisJCXRvb2wgICAgICAgCSJSb3NlIE1vZGVsIEludGVncmF0b3IiCisJCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgorCQl2YWx1ZSAgICAgIAlGQUxTRSkKKwkgICAgKG9iamVjdCBBdHRyaWJ1dGUKKwkJdG9vbCAgICAgICAJIlJvc2UgV2ViIFB1Ymxpc2hlciIKKwkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCisJCXZhbHVlICAgICAgCUZBTFNFKQorCSAgICAob2JqZWN0IEF0dHJpYnV0ZQorCQl0b29sICAgICAgIAkiV2ViIE1vZGVsZXIiCisJCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgorCQl2YWx1ZSAgICAgIAlGQUxTRSkpCisJcXVpZCAgICAgICAJIjNERkRGNkNFMDM3NCIpKQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9hcmNoaXRlY3R1cmUvc3RhcnR1cC54bWwgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2FyY2hpdGVjdHVyZS9zdGFydHVwLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWE3NzQxCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9hcmNoaXRlY3R1cmUvc3RhcnR1cC54bWwKQEAgLTAsMCArMSw1NyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IURPQ1RZUEUgZG9jdW1lbnQgWworICA8IUVOVElUWSBwcm9qZWN0IFNZU1RFTSAicHJvamVjdC54bWwiPgorXT4KKzxkb2N1bWVudCB1cmw9InN0YXJ0dXAuaHRtbCI+CisKKyAgJnByb2plY3Q7CisKKyAgPHByb3BlcnRpZXM+CisgICAgPGF1dGhvciBlbWFpbD0ieW9hdnNAYXBhY2hlLm9yZyI+WW9hdiBTaGFwaXJhPC9hdXRob3I+CisgICAgPHRpdGxlPlN0YXJ0dXA8L3RpdGxlPgorICA8L3Byb3BlcnRpZXM+CisKKzxib2R5PgorCisKKzxzZWN0aW9uIG5hbWU9IlNlcnZlciBTdGFydHVwIj4KKworPHA+CitUaGlzIHBhZ2UgZGVzY3JpYmVzIGhvdyB0aGUgVG9tY2F0IHNlcnZlciBzdGFydHMgdXAuICBUaGVyZSBhcmUgc2V2ZXJhbAorZGlmZmVyZW50IHdheXMgdG8gc3RhcnQgdG9tY2F0LCBpbmNsdWRpbmc6Cis8dWw+CisgIDxsaT5Gcm9tIHRoZSBjb21tYW5kIGxpbmUuPC9saT4KKyAgPGxpPkZyb20gYSBKYXZhIHByb2dyYW0gYXMgYW4gZW1iZWRkZWQgc2VydmVyLjwvbGk+CisgIDxsaT5BdXRvbWF0aWNhbGx5IGFzIGEgV2luZG93cyBzZXJ2aWNlLjwvbGk+Cis8L3VsPgorPC9wPgorCis8c3Vic2VjdGlvbiBuYW1lPSJkZXNjcmlwdGlvbiI+Cis8cD4KK0EgdGV4dCBkZXNjcmlwdGlvbiBvZiB0aGUgc3RhcnR1cCBwcm9jZWR1cmUgaXMgYXZhaWxhYmxlCis8YSBocmVmPSJzdGFydHVwL3NlcnZlclN0YXJ0dXAudHh0Ij5oZXJlLjwvYT4KKzwvcD4KKzwvc3Vic2VjdGlvbj4KKworPHN1YnNlY3Rpb24gbmFtZT0iZGlhZ3JhbSI+Cis8cD4KK0EgVU1MIHNlcXVlbmNlIGRpYWdyYW0gb2YgdGhlIHN0YXJ0dXAgcHJvY2VkdXJlIGlzIGF2YWlsYWJsZQorPGEgaHJlZj0ic3RhcnR1cC9zZXJ2ZXJTdGFydHVwLnBkZiI+aGVyZS48L2E+Cis8L3A+Cis8L3N1YnNlY3Rpb24+CisKKzxzdWJzZWN0aW9uIG5hbWU9ImNvbW1lbnRzIj4KKzxwPgorVGhlIHN0YXJ0dXAgcHJvY2VzcyBjYW4gYmUgY3VzdG9taXplZCBpbiBtYW55IHdheXMsIGJvdGgKK2J5IG1vZGlmeWluZyBUb21jYXQgY29kZSBhbmQgYnkgaW1wbGVtZW50aW5nIHlvdXIgb3duCitMaWZlY3ljbGVMaXN0ZW5lcnMgd2hpY2ggYXJlIHRoZW4gcmVnaXN0ZXJlZCBpbiB0aGUgc2VydmVyLnhtbAorY29uZmlndXJhdGlvbiBmaWxlLgorPC9wPgorCis8L3N1YnNlY3Rpb24+CisKKzwvc2VjdGlvbj4KKworCis8L2JvZHk+Cis8L2RvY3VtZW50PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9hcmNoaXRlY3R1cmUvc3RhcnR1cC9zZXJ2ZXJTdGFydHVwLnBkZiBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvYXJjaGl0ZWN0dXJlL3N0YXJ0dXAvc2VydmVyU3RhcnR1cC5wZGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRhYTU5OAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvYXJjaGl0ZWN0dXJlL3N0YXJ0dXAvc2VydmVyU3RhcnR1cC5wZGYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9hcmNoaXRlY3R1cmUvc3RhcnR1cC9zZXJ2ZXJTdGFydHVwLnR4dCBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvYXJjaGl0ZWN0dXJlL3N0YXJ0dXAvc2VydmVyU3RhcnR1cC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjEyMGIwYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvYXJjaGl0ZWN0dXJlL3N0YXJ0dXAvc2VydmVyU3RhcnR1cC50eHQKQEAgLTAsMCArMSwxMzYgQEAKK1RvbWNhdCA1IFN0YXJ0dXAgU2VxdWVuY2UKKworU2VxdWVuY2UgMS4gU3RhcnQgZnJvbSBDb21tYW5kIExpbmUKK0NsYXNzOiBvcmcuYXBhY2hlLmNhdGFsaW5hLnN0YXJ0dXAuQm9vdHN0cmFwCitXaGF0IGl0IGRvZXM6CisJYSkgU2V0IHVwIGNsYXNzbG9hZGVycyAKKwkJY29tbW9uTG9hZGVyIChjb21tb24pLT4gU3lzdGVtIExvYWRlcgorCQlzaGFyZWRMb2FkZXIgKHNoYXJlZCktPiBjb21tb25Mb2FkZXIgLT4gU3lzdGVtIExvYWRlcgorCQljYXRhbGluYUxvYWRlcihzZXJ2ZXIpIC0+IGNvbW1vbkxvYWRlciAtPiBTeXN0ZW0gTG9hZGVyCisJYikgTG9hZCBzdGFydHVwIGNsYXNzIChyZWZsZWN0aW9uKQorCQlvcmcuYXBhY2hlLmNhdGFsaW5hLnN0YXJ0dXAuQ2F0YWxpbmEKKwkJc2V0UGFyZW50Q2xhc3Nsb2FkZXIgLT4gc2hhcmVkTG9hZGVyCisJCVRocmVhZC5jb250ZXh0Q2xhc3Nsb2FkZXIgLT4gY2F0YWxpbmFMb2FkZXIKKwljKSBCb290c3RyYXAuZGFlbW9uLmluaXQoKSBjb21wbGV0ZQorCQorU2VxdWVuY2UgMi4gUHJvY2VzcyBjb21tYW5kIGxpbmUgYXJndW1lbnQgKHN0YXJ0LCBzdGFydGQsIHN0b3AsIHN0b3BkKQorQ2xhc3M6IG9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cC5Cb290c3RyYXAgKGFzc3VtZSBjb21tYW5kLT5zdGFydCkKK1doYXQgaXQgZG9lczogCisJYSkgQ2F0YWxpbmEuc2V0QXdhaXQodHJ1ZSk7CisJYikgQ2F0YWxpbmEubG9hZCgpCisJCWIxKSBpbml0RGlycygpIC0+IHNldCBwcm9wZXJ0aWVzIGxpa2UgCisJCSAgICAgICAgICAgICAgICAgIGNhdGFsaW5hLmhvbWUKKwkJICAgICAgICAgICAgICAgICAgY2F0YWxpbmEuYmFzZSA9PSBjYXRhbGluYS5ob21lIChtb3N0IGNhc2VzKQorCQliMikgaW5pdE5hbWluZworCQkJc2V0UHJvcGVydHkoamF2YXgubmFtaW5nLkNvbnRleHQuSU5JVElBTF9DT05URVhUX0ZBQ1RPUlksCisJCQkJICAgIG9yZy5hcGFjaGUubmFtaW5nLmphdmEuamF2YVVSTENvbnRleHRGYWN0b3J5IC0+ZGVmYXVsdCkKKwkJYjMpIGNyZWF0ZVN0YXJ0RGlnZXN0ZXIoKSAKKwkJCUNvbmZpZ3VyZXMgYSBkaWdlc3RlciBmb3IgdGhlIG1haW4gc2VydmVyLnhtbCBlbGVtZW50cyBsaWtlCisJCQlvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRTZXJ2ZXIgKGNhbiBjaGFuZ2Ugb2YgY291cnNlIDopCisJCQlvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5OYW1pbmdSZXNvdXJjZXMKKwkJCQlTdG9yZXMgbmFtaW5nIHJlc291cmNlcyBpbiB0aGUgSjJFRSBKTkRJIHRyZWUKKwkJCW9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlTGlzdGVuZXIKKwkJCQlpbXBsZW1lbnRzIGV2ZW50cyBmb3Igc3RhcnQvc3RvcCBvZiBtYWpvciBjb21wb25lbnRzCisJCQlvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRTZXJ2aWNlCisJCQkJVGhlIHNpbmdsZSBlbnRyeSBmb3IgYSBzZXQgb2YgY29ubmVjdG9ycywKKwkJCQlzbyB0aGF0IGEgY29udGFpbmVyIGNhbiBsaXN0ZW4gdG8gbXVsdGlwbGUgY29ubmVjdG9ycworCQkJCWllLCBzaW5nbGUgZW50cnkKKwkJCW9yZy5hcGFjaGUuY295b3RlLnRvbWNhdDUuQ295b3RlQ29ubmVjdG9yCisJCQkJQ29ubmVjdG9ycyB0byBsaXN0ZW4gZm9yIGluY29taW5nIHJlcXVlc3RzIG9ubHkKKwkJCUl0IGFsc28gYWRkcyB0aGUgZm9sbG93aW5nIHJ1bGVzZXRzIHRvIHRoZSBkaWdlc3RlcgorCQkJCU5hbWluZ1J1bGVTZXQKKwkJCQlFbmdpbmVSdWxlU2V0CisJCQkJSG9zdFJ1bGVTZXQKKwkJCQlDb250ZXh0UnVsZVNldAorCQliNCkgTG9hZCB0aGUgc2VydmVyLnhtbCBhbmQgcGFyc2UgaXQgdXNpbmcgdGhlIGRpZ2VzdGVyCisJCSAgICBQYXJzaW5nIHRoZSBzZXJ2ZXIueG1sIHVzaW5nIHRoZSBkaWdlc3RlciBpcyBhbiBhdXRvbWF0aWMKKwkJICAgIFhNTC1vYmplY3QgbWFwcGluZyB0b29sLCB0aGF0IHdpbGwgY3JlYXRlIHRoZSBvYmplY3RzIGRlZmluZWQgaW4gc2VydmVyLnhtbAorCQkgICAgU3RhcnR1cCBvZiB0aGUgYWN0dWFsIGNvbnRhaW5lciBoYXMgbm90IHN0YXJ0ZWQgeWV0LgorCQliNSkgQXNzaWducyBTeXN0ZW0ub3V0IGFuZCBTeXN0ZW0uZXJyIHRvIHRoZSBTeXN0ZW1Mb2dIYW5kbGVyIGNsYXNzCisJCWI2KSBDYWxscyBpbnRpYWxpemUgb24gYWxsIGNvbXBvbmVudHMsIHRoaXMgbWFrZXMgZWFjaCBvYmplY3QgcmVnaXN0ZXIgaXRzZWxmIHdpdGggdGhlIAorCQkgICAgSk1YIGFnZW50LgorCQkgICAgRHVyaW5nIHRoZSBwcm9jZXNzIGNhbGwgdGhlIENvbm5lY3RvcnMgYWxzbyBpbml0aWFsaXplIHRoZSBhZGFwdGVycy4KKwkJICAgIFRoZSBhZGFwdGVycyBhcmUgdGhlIGNvbXBvbmVudHMgdGhhdCBkbyB0aGUgcmVxdWVzdCBwcmUtcHJvY2Vzc2luZy4KKwkJICAgIFR5cGljYWwgYWRhcHRlcnMgYXJlIEhUVFAxLjEgKGRlZmF1bHQgaWYgbm8gcHJvdG9jb2wgaXMgc3BlY2lmaWVkLAorCQkgICAgb3JnLmFwYWNoZS5jb3lvdGUuaHR0cDExLkh0dHAxMVByb3RvY29sKQorCQkgICAgQUpQMS4zIGZvciBtb2RfamsgZXRjLgorCisJYykgQ2F0YWxpbmEuc3RhcnQoKQorCQljMSkgU3RhcnRzIHRoZSBOYW1pbmdDb250ZXh0IGFuZCBiaW5kcyBhbGwgSk5ESSByZWZlcmVuY2VzIGludG8gaXQKKwkJYzIpIFN0YXJ0cyB0aGUgc2VydmljZXMgdW5kZXIgPFNlcnZlcj4gd2hpY2ggYXJlOgorCQkJU3RhbmRhcmRTZXJ2aWNlIC0+IHN0YXJ0cyBFbmdpbmUgKENvbnRhaW5lckJhc2UgLT5Mb2dnZXIsTG9hZGVyLFJlYWxtLENsdXN0ZXIgZXRjKQorCQljMykgU3RhbmRhcmRIb3N0IChzdGFydGVkIGJ5IHRoZSBzZXJ2aWNlKQorCQkJCUNvbmZpZ3VyZXMgYSBFcnJvclJlcG9ydFZhbHZlbSB0byBkbyBwcm9wZXIgSFRNTCBvdXRwdXQgZm9yIGRpZmZlcmVudCBIVFRQIAorCQkJCWVycm9ycyBjb2RlcworCQkJCVN0YXJ0cyB0aGUgVmFsdmVzIGluIHRoZSBwaXBlbGluZSAoYXQgbGVhc3QgdGhlIEVycm9yUmVwb3J0VmFsdmUpCisJCQkJQ29uZmlndXJlcyB0aGUgU3RhbmRhcmRIb3N0VmFsdmUsIAorCQkJCQl0aGlzIHZhbHZlcyB0aWVzIHRoZSBXZWJhcHAgQ2xhc3MgbG9hZGVyIHRvIHRoZSB0aHJlYWQgY29udGV4dAorCQkJCQlpdCBhbHNvIGZpbmRzIHRoZSBzZXNzaW9uIGZvciB0aGUgcmVxdWVzdAorCQkJCQlhbmQgaW52b2tlcyB0aGUgY29udGV4dCBwaXBlbGluZQorCQkJCVN0YXJ0cyB0aGUgSG9zdENvbmZpZyBjb21wb25lbnQKKwkJCQkJVGhpcyBjb21wb25lbnQgZGVwbG95cyBhbGwgdGhlIHdlYmFwcHMKKwkJCQkJCSh3ZWJhcHBzICYgY29uZi9DYXRhbGluYS9sb2NhbGhvc3QvKi54bWwpCisJCQkJCVdlYmFwcHMgYXJlIGluc3RhbGxlZCB1c2luZyB0aGUgZGVwbG95ZXIgKFN0YW5kYXJkSG9zdERlcGxveWVyKQorCQkJCQlUaGUgZGVwbG95ZXIgd2lsbCBjcmVhdGUgYSBEaWdlc3RlciBmb3IgeW91ciBjb250ZXh0LCB0aGlzIGRpZ2VzdGVyCisJCQkJCXdpbGwgdGhlbiBpbnZva2UgQ29udGV4dENvbmZpZy5zdGFydCgpCisJCQkJCQlUaGUgQ29udGV4dENvbmZpZy5zdGFydCgpIHdpbGwgcHJvY2VzcyB0aGUgZGVmYXVsdCB3ZWIueG1sIChjb25mL3dlYi54bWwpCisJCQkJCQlhbmQgdGhlbiBwcm9jZXNzIHRoZSBhcHBsaWNhdGlvbnMgd2ViLnhtbCAoV0VCLUlORi93ZWIueG1sKQorCQkJCQkJCisJCWM0KSBEdXJpbmcgdGhlIGxpZmV0aW1lIG9mIHRoZSBjb250YWluZXIgKFN0YW5kYXJkRW5naW5lKSB0aGVyZSBpcyBhIGJhY2tncm91bmQgdGhyZWFkIHRoYXQgCisJCSAgICBrZWVwcyBjaGVja2luZyBpZiB0aGUgY29udGV4dCBoYXMgY2hhbmdlZC4gSWYgYSBjb250ZXh0IGNoYW5nZXMgKHRpbWVzdGFtcCBvZiB3YXIgZmlsZSwgCisJCSAgICBjb250ZXh0IHhtbCBmaWxlLCB3ZWIueG1sKSB0aGVuIGEgcmVsb2FkIGlzIGlzc3VlZCAoc3RvcC9yZW1vdmUvZGVwbG95L3N0YXJ0KQorCQkgICAgCisJZCkgVG9tY2F0IHJlY2VpdmVzIGEgcmVxdWVzdCBvbiBhbiBIVFRQIHBvcnQKKwkgICAgZDEpIFRoZSByZXF1ZXN0IGlzIHJlY2VpdmVkIGJ5IGEgc2VwYXJhdGUgdGhyZWFkIHdoaWNoIGlzIHdhaXRpbmcgaW4gdGhlIFBvb2xUY3BFbmRQb2ludCAKKwkgICAgICAgICBjbGFzcy4gSXQgaXMgd2FpdGluZyBmb3IgYSByZXF1ZXN0IGluIGEgcmVndWxhciBTZXJ2ZXJTb2NrZXQuYWNjZXB0KCkgbWV0aG9kLgorCSAgICAgICAgIFdoZW4gYSByZXF1ZXN0IGlzIHJlY2VpdmVkLCB0aGlzIHRocmVhZCB3YWtlcyB1cC4KKwkgICAgZDIpIFRoZSBQb29sVGNwRW5kUG9pbnQgYXNzaWducyB0aGUgYSBUY3BDb25uZWN0aW9uIHRvIGhhbmRsZSB0aGUgcmVxdWVzdC4gCisJICAgICAgICBJdCBhbHNvIHN1cHBsaWVzIGEgSk1YIG9iamVjdCBuYW1lIHRvIHRoZSBjYXRhbGluYSBjb250YWluZXIgKG5vdCB1c2VkIEkgYmVsaWV2ZSkKKwkgICAgZDMpIFRoZSBwcm9jZXNzb3IgdG8gaGFuZGxlIHRoZSByZXF1ZXN0IGluIHRoaXMgY2FzZSBpcyBDb3lvdGUgSHR0cDExUHJvY2Vzc29yLCAKKwkgICAgICAgIGFuZCB0aGUgcHJvY2VzcyBtZXRob2QgaXMgaW52b2tlZC4KKwkgICAgICAgIFRoaXMgc2FtZSBwcm9jZXNzb3IgaXMgYWxzbyBjb250aW51aW5nIHRvIGNoZWNrIHRoZSBpbnB1dCBzdHJlYW0gb2YgdGhlIHNvY2tldAorCSAgICAgICAgdW50aWwgdGhlIGtlZXAgYWxpdmUgcG9pbnQgaXMgcmVhY2hlZCBvciB0aGUgY29ubmVjdGlvbiBpcyBkaXNjb25uZWN0ZWQuCisJICAgIGQ0KSBUaGUgSFRUUCByZXF1ZXN0IGlzIHBhcnNlZCB1c2luZyBhbiBpbnRlcm5hbCBidWZmZXIgY2xhc3MgKENveW90ZSBIdHRwMTEgSW50ZXJuYWwgQnVmZmVyKQorCSAgICAgICAgVGhlIGJ1ZmZlciBjbGFzcyBwYXJzZXMgdGhlIHJlcXVlc3QgbGluZSwgdGhlIGhlYWRlcnMsIGV0YyBhbmQgc3RvcmUgdGhlIHJlc3VsdCBpbiBhIAorCSAgICAgICAgQ295b3RlIHJlcXVlc3QgKG5vdCBhbiBIVFRQIHJlcXVlc3QpIFRoaXMgcmVxdWVzdCBjb250YWlucyBhbGwgdGhlIEhUVFAgaW5mbywgc3VjaAorCSAgICAgICAgYXMgc2VydmVybmFtZSwgcG9ydCwgc2NoZW1lLCBldGMuCisJICAgIGQ1KSBUaGUgcHJvY2Vzc29yIGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIGFuIEFkYXB0ZXIsIGluIHRoaXMgY2FzZSBpdCBpcyB0aGUgCisJICAgICAgICBDb3lvdGUgVG9tY2F0IDUgQWRhcHRlci4gT25jZSB0aGUgcmVxdWVzdCBoYXMgYmVlbiBwYXJzZWQsIHRoZSBIdHRwMTEgcHJvY2Vzc29yCisJICAgICAgICBpbnZva2VzIHNlcnZpY2UoKSBvbiB0aGUgYWRhcHRlci4gSW4gdGhlIHNlcnZpY2UgbWV0aG9kLCB0aGUgUmVxdWVzdCBjb250YWlucyBhIAorCSAgICAgICAgQ295b3RlUmVxdWVzdCBhbmQgQ295b3RlUmVzcG9ucyAobnVsbCBmb3IgdGhlIGZpcnN0IHRpbWUpCisJICAgICAgICBUaGUgQ295b3RlUmVxdWVzdChSZXNwb25zZSkgaW1wbGVtZW50cyBIdHRwUmVxdWVzdChSZXNwb25zZSkgYW5kIEh0dHBTZXJ2bGV0UmVxdWVzdChSZXNwb25zZSkKKwkgICAgICAgIFRoZSBhZGFwdGVyIHBhcnNlcyBhbmQgYXNzb2NpYXRlcyBldmVyeXRoaW5nIHdpdGggdGhlIHJlcXVlc3QsIGNvb2tpZXMsIHRoZSBjb250ZXh0IHRocm91Z2ggYSAKKwkgICAgICAgIE1hcHBlciwgZXRjCisJICAgIGQ2KSBXaGVuIHRoZSBwYXJzaW5nIGlzIGZpbmlzaGVkLCB0aGUgQ295b3RlQWRhcHRlciBpbnZva2VzIGl0cyBjb250YWluZXIgKFN0YW5kYXJkRW5naW5lKQorCSAgICAgICAgYW5kIGludm9rZXMgdGhlIGludm9rZShyZXF1ZXN0LHJlc3BvbnNlKSBtZXRob2QuCisJICAgICAgICBUaGlzIGluaXRpYXRlcyB0aGUgSFRUUCByZXF1ZXN0IGludG8gdGhlIENhdGFsaW5hIGNvbnRhaW5lciBzdGFydGluZyBhdCB0aGUgZW5naW5lIGxldmVsCisJICAgIGQ3KSBUaGUgU3RhbmRhcmRFbmdpbmUuaW52b2tlKCkgc2ltcGx5IGludm9rZXMgdGhlIGNvbnRhaW5lciBwaXBlbGluZS5pbnZva2UoKQorCSAgICBkOCkgQnkgZGVmYXVsdCB0aGUgZW5naW5lIG9ubHkgaGFzIG9uZSB2YWx2ZSB0aGUgU3RhbmRhcmRFbmdpbmVWYWx2ZSwgdGhpcyB2YWx2ZSBzaW1wbHkKKwkgICAgICAgIGludm9rZXMgdGhlIGludm9rZSgpIG1ldGhvZCBvbiB0aGUgSG9zdCBwaXBlbGluZSAoU3RhbmRhcmRIb3N0LmdldFBpcGVMaW5lKCkpCisJICAgIGQ5KSB0aGUgU3RhbmRhcmRIb3N0IGhhcyB0d28gdmFsdmVzIGJ5IGRlZmF1bHQsIHRoZSBTdGFuZGFyZEhvc3RWYWx2ZSBhbmQgdGhlIEVycm9yUmVwb3J0VmFsdmUKKwkgICAgZDEwKSBUaGUgc3RhbmRhcmQgaG9zdCB2YWx2ZSBhc3NvY2lhdGVzIHRoZSBjb3JyZWN0IGNsYXNzIGxvYWRlciB3aXRoIHRoZSBjdXJyZW50IHRocmVhZAorCSAgICAgICAgIEl0IGFsc28gcmV0cml2ZXMgdGhlIE1hbmFnZXIgYW5kIHRoZSBzZXNzaW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVxdWVzdCAoaWYgdGhlcmUgaXMgb25lKQorCSAgICAgICAgIElmIHRoZXJlIGlzIGEgc2Vzc2lvbiBhY2Nlc3MoKSBpcyBjYWxsZWQgdG8ga2VlcCB0aGUgc2Vzc2lvbiBhbGl2ZQorCSAgICBkMTEpIEFmdGVyIHRoYXQgdGhlIFN0YW5kYXJkSG9zdFZhbHZlIGludm9rZXMgdGhlIHBpcGVsaW5lIG9uIHRoZSBjb250ZXh0IGFzc29jaWF0ZWQKKwkgICAgICAgICB3aXRoIHRoZSByZXF1ZXN0LgorCSAgICBkMTIpIFRoZSBmaXJzdCB2YWx2ZSB0aGF0IGdldHMgaW52b2tlZCBieSB0aGUgQ29udGV4dCBwaXBlbGluZSBpcyB0aGUgRm9ybUF1dGhlbnRpY2F0b3IKKwkgICAgICAgICB2YWx2ZS4gVGhlbiB0aGUgU3RhbmRhcmRDb250ZXh0VmFsdmUgZ2V0cyBpbnZva2UuCisJICAgICAgICAgVGhlIFN0YW5kYXJkQ29udGV4dFZhbHZlIGludm9rZXMgYW55IGNvbnRleHQgbGlzdGVuZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29udGV4dC4KKwkgICAgICAgICBOZXh0IGl0IGludm9rZXMgdGhlIHBpcGVsaW5lIG9uIHRoZSBXcmFwcGVyIGNvbXBvbmVudCAoU3RhbmRhcmRXcmFwcGVyVmFsdmUpCisJICAgIGQxMykgRHVyaW5nIHRoZSBpbnZva2F0aW9uIG9mIHRoZSBTdGFuZGFyZFdyYXBwZXJWYWx2ZSwgdGhlIEpTUCB3cmFwcGVyIChKYXNwZXIpIGdldHMgaW52b2tlZAorCSAgICAgICAgIFRoaXMgcmVzdWx0cyBpbiB0aGUgYWN0dWFsIGNvbXBpbGF0aW9uIG9mIHRoZSBKU1AuCisJICAgICAgICAgQW5kIHRoZW4gaW52b2tlcyB0aGUgYWN0dWFsIHNlcnZsZXQuCisJZSkgSW52b2thdGlvbiBvZiB0aGUgc2VydmxldCBjbGFzcworCSAgICAgICAgIAorCSAgICAgICAgIAorCSAgICAgICAgIAorCSAgICAKKwkgICAgICAgIAorCSAgICAgICAgCisJICAgICAgICAKKwkgICAgCisJCQkKKwkJCQorCQkKKwkJCisJCQkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9kb2NzL2JhbGFuY2VyLWhvd3RvLnhtbCBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvYmFsYW5jZXItaG93dG8ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjg4ZDMzYTkKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2JhbGFuY2VyLWhvd3RvLnhtbApAQCAtMCwwICsxLDE0OCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IURPQ1RZUEUgZG9jdW1lbnQgWworICA8IUVOVElUWSBwcm9qZWN0IFNZU1RFTSAicHJvamVjdC54bWwiPgorXT4KKzxkb2N1bWVudCB1cmw9ImJhbGFuY2VyLWhvd3RvLmh0bWwiPgorCisgICAgJnByb2plY3Q7IAorCisgICAgPHByb3BlcnRpZXM+CisgICAgICAgIDxhdXRob3IgZW1haWw9InlvYXZzQGFwYWNoZS5vcmciPllvYXYgU2hhcGlyYTwvYXV0aG9yPgorICAgICAgICA8YXV0aG9yPlJlbXkgTWF1Y2hlcmF0PC9hdXRob3I+CisgICAgICAgIDxhdXRob3I+QW5keSBPbGl2ZXI8L2F1dGhvcj4KKyAgICAgICAgPHRpdGxlPkxvYWQgQmFsYW5jZXIgSE9XLVRPPC90aXRsZT4KKyAgICA8L3Byb3BlcnRpZXM+CisKKzxib2R5PgorCis8c2VjdGlvbiBuYW1lPSJUYWJsZSBvZiBDb250ZW50cyI+Cis8cD4KKzxhIGhyZWY9IiNVc2luZyB0aGUgSksgMS4yLnggbmF0aXZlIGNvbm5lY3RvciI+CitVc2luZyB0aGUgSksgbmF0aXZlIGNvbm5lY3RvcjwvYT48YnIgLz4KKzxhIGhyZWY9IiNVc2luZyBBcGFjaGUgSFRUUCBTZXJ2ZXIgMi54IHdpdGggbW9kX3Byb3h5Ij4KK1VzaW5nIEFwYWNoZSBIVFRQIFNlcnZlciAyLnggYW5kIG1vZF9wcm94eTwvYT48YnIgLz4KKzxhIGhyZWY9IiNVc2luZyB0aGUgYmFsYW5jZXIgd2ViYXBwIj5Vc2luZyB0aGUgYmFsYW5jZXIgd2ViYXBwPC9hPjxiciAvPgorPC9wPgorPC9zZWN0aW9uPgorCis8c2VjdGlvbiBuYW1lPSJVc2luZyB0aGUgSksgMS4yLnggbmF0aXZlIGNvbm5lY3RvciI+CisKK1BsZWFzZSByZWZlciB0byB0aGUgSksgMS4yLnggZG9jdW1lbnRhdGlvbi4KKworPC9zZWN0aW9uPgorCis8c2VjdGlvbiBuYW1lPSJVc2luZyBBcGFjaGUgSFRUUCBTZXJ2ZXIgMi54IHdpdGggbW9kX3Byb3h5Ij4KKworUGxlYXNlIHJlZmVyIHRvIHRoZSBtb2RfcHJveHkgZG9jdW1lbnRhdGlvbiBmb3IgQXBhY2hlIEhUVFAgU2VydmVyIDIuMi4gVGhpcyBzdXBwb3J0cyBlaXRoZXIKK0hUVFAgb3IgQUpQIGxvYWQgYmFsYW5jaW5nLiBUaGlzIG5ldyB2ZXJzaW9uIG9mIG1vZF9wcm94eSBpcyBhbHNvIHVzZWFibGUgd2l0aAorQXBhY2hlIEhUVFAgU2VydmVyIDIuMCwgYnV0IG1vZF9wcm94eSB3aWxsIGhhdmUgdG8gYmUgY29tcGlsZWQgc2VwYXJhdGVseSB1c2luZyB0aGUgY29kZQorZnJvbSBBcGFjaGUgSFRUUCBTZXJ2ZXIgMi4yLgorCis8L3NlY3Rpb24+CisKKzxzZWN0aW9uIG5hbWU9IlVzaW5nIHRoZSBiYWxhbmNlciB3ZWJhcHAiPgorCis8c3Vic2VjdGlvbiBuYW1lPSJPdmVydmlldyI+CisKKzxwPgorVG9tY2F0IDUuMC4xNSBhbmQgbGF0ZXIgc2hpcHMgd2l0aCBhIHdlYmFwcCBuYW1lZCBiYWxhbmNlci4gIFRoaXMgaXMKK2Egc2ltcGxlIGltcGxlbWVudGlvbiBvZiBhIHJ1bGVzLWJhc2VkIGxvYWQgYmFsYW5jZXIuICBJdCB3YXMgbm90IGRlc2lnbmVkCithcyBhIHJlcGxhY2VtZW50IGZvciBvdGhlciBsb2FkLWJhbGFuY2luZyBtZWNoYW5pc21zIHVzZWQgZm9yIGhpZ2ggdHJhZmZpYworZW52aXJvbm1lbnRzLiAgUmF0aGVyLCBpdCBpcyBhIHNpbXBsZSwgcHVyZSBKYXZhLCBlYXNpbHkgZXh0ZW5zaWJsZSwgYW5kIGZhc3QKK3dheSB0byBkaXJlY3QgdHJhZmZpYyBhbW9uZyBtdWx0aXBsZSBzZXJ2ZXJzLgorPC9wPgorPHA+CitBbHRob3VnaCBiYWxhbmNlciBzaGlwcyB3aXRoIFRvbWNhdCwgaXQgaXMgbm90IFRvbWNhdC1zcGVjaWZpYyBhbmQgcnVucworb24gb3RoZXIgY29udGFpbmVycyB3aXRob3V0IGFueSBtb2RpZmljYXRpb24uICBUaGUgYmFsYW5jZXIgd2ViYXBwIAorcmVxdWlyZXMgYSBTZXJ2bGV0IFNwZWNpZmljYXRpb24gMi4zIG9yIGxhdGVyIGNvbnRhaW5lciBpZiB5b3Ugd2lzaCAKK3RvIHVzZSBhIGZpbHRlciB0byByZWRpcmVjdCB0cmFmZmljLiAgSWYgeW91IHdpc2ggdG8gcmVkaXJlY3QgdHJhZmZpYwordXNpbmcgYSBzZXJ2bGV0LCB5b3UgbWF5IHVzZSBhbnkgc2VydmxldCBjb250YWluZXIuCis8L3A+Cis8L3N1YnNlY3Rpb24+CisKKzxzdWJzZWN0aW9uIG5hbWU9IlNhbXBsZSBDb25maWd1cmF0aW9uIj4KKzxwPgorVGhlIGRlZmF1bHQgYmFsYW5jZXIgaW5zdGFsbGF0aW9uIHVzZXMgYSBzaW5nbGUgZmlsdGVyLCBCYWxhbmNlckZpbHRlciwKK21hcHBlZCB0byBhbGwgcmVxdWVzdHMgKHVybC1wYXR0ZXJuIC8qKS4gIFRoZSBmaWx0ZXIgcmVhZHMgaXRzIHJ1bGVzCitmcm9tIHRoZSBsb2NhdGlvbiBzcGVjaWZpZWQgaW4gdGhlIGJhbGFuY2VyIGRlcGxveW1lbnQgZGVzY3JpcHRvcgorKHdlYi54bWwgZmlsZSkuICBUaGUgZGVmYXVsdCBydWxlcyBhcmU6Cis8dWw+CisgIDxsaT5SZWRpcmVjdCByZXF1ZXN0cyB3aXRoIE5ld3MgaW4gdGhlIFVSTCB0byB3d3cuY25uLmNvbTwvbGk+CisgIDxsaT5SZWRpcmVjdCByZXF1ZXN0cyB3aXRoIGEgcGFyYW1ldGVyIG5hbWVkIHBhcmFtTmFtZSB3aG9zZQordmFsdWUgaXMgcGFyYW1WYWx1ZSB0byB3d3cueWFob28uY29tLjwvbGk+CisgIDxsaT5SZWRpcmVjdCBhbGwgb3RoZXIgcmVxdWVzdHMgdG8gamFrYXJ0YS5hcGFjaGUub3JnLjwvbGk+Cis8L3VsPgorCitUaGVyZWZvcmUsIHdoZW4geW91IGluc3RhbGwgdG9tY2F0LCBzdGFydCBpdCwgYW5kIHBvaW50IHlvdXIKK2Jyb3dzZXIgdG8gaHR0cDovL2xvY2FsaG9zdDo4MDgwL2JhbGFuY2VyLCB5b3Ugd2lsbCBiZSByZWRpcmVjdGVkCit0byBodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnLiAgSWYgeW91IHBvaW50IHlvdXIgYnJvd3NlciB0bworaHR0cDovL2xvY2FsaG9zdDo4MDgwL2JhbGFuY2VyL05ld3MgeW91IHdpbGwgYmUgcmVkaXJlY3RlZCB0bworaHR0cDovL3d3dy5jbm4uY29tLiAgVGhlIHJlcXVlc3QgZm9yIAoraHR0cDovL2xvY2FsaG9zdDo4MDgwL2JhbGFuY2VyL0JsYWhCbGFoP3BhcmFtTmFtZT1wYXJhbVZhbHVlIHdpbGwKK2JlIHJlZGlyZWN0ZWQgdG8gaHR0cDovL3d3dy55YWhvby5jb20uCis8L3A+Cis8L3N1YnNlY3Rpb24+CisKKzxzdWJzZWN0aW9uIG5hbWU9IkJhbGFuY2VyIFJ1bGVzIj4KKzxwPgorQSA8aT5SdWxlPC9pPiBpbiB0aGUgYmFsYW5jZXIgc3lzdGVtIGlzIGEgY29tYmluYXRpb24gb2YKK2EgcmVxdWVzdCBtYXRjaGluZyBjcml0ZXJpb24gYW5kIGEgcmVkaXJlY3Rpb24gVVJMIGZvcgorbWF0Y2hpbmcgcmVxdWVzdHMuICBSdWxlcyBpbXBsZW1lbnQgdGhlCitvcmcuYXBhY2hlLndlYmFwcC5iYWxhbmNlci5SdWxlIGludGVyZmFjZS4KKzwvcD4KKworPHA+CitUaGUgYmFsYW5jZXIgZGlzdHJpYnV0aW9uIGNvbnRhaW5zIGEgbnVtYmVyIG9mIHVzZWZ1bAorcnVsZXMuICBUaGUgZnJhbWV3b3JrIGlzIGFsc28gZGVzaWduZWQgZm9yIGVhc3kgZXh0ZW5zaWJpbGl0eQorc28gdGhhdCB5b3UgY2FuIHdyaXRlIHlvdXIgb3duIHJ1bGVzIHF1aWNrbHkuICBSdWxlcworc2hvdWxkIGJlIEphdmFCZWFucyAocHVibGljIG5vLWFyZ3MgY29uc3RydWN0b3IsIHB1YmxpYworc2V0dGVyIG1ldGhvZCBzZXRYWFggZm9yIHByb3BlcnR5IHh4eCksIGFzIHRoZXkgYXJlCitpbnN0YW50aWF0ZWQgYnkgSmFrYXJ0YSBDb21tb25zIERpZ2VzdGVyLiAgRmVlbCBmcmVlCit0byBpbnF1aXJlIG9uIHRoZSB0b21jYXQtdXNlciBtYWlsaW5nIGxpc3QgcmVnYXJkaW5nCit0aGUgYXZhaWxhYmlsaXR5IG9mIHJ1bGVzIG9yIHRoZSBpbmNsdXNpb24gb2YgeW91ciBydWxlcworaW4gdGhlIGRpc3RyaWJ1dGlvbi4KKzwvcD4KKworPHA+CitSdWxlcyBhcmUgYXNzZW1ibGVkIGludG8gUnVsZUNoYWlucy4gIEVhY2ggQmFsYW5jZXJGaWx0ZXIKKyhvciBTZXJ2bGV0L0pTUCkgcmVmZXJzIHRvIG9uZSBSdWxlQ2hhaW4gd2hlbiBtYWtpbmcgaXRzCityZWRpcmVjdGlvbiBkZWNpc2lvbnMuICBOb3RlIHRoYXQgeW91IGFyZSBub3QgcmVzdHJpY3RlZAordG8gaGF2aW5nIG9uZSBmaWx0ZXIgbWFwcGVkIHRvIC8qIGFzIGRvbmUgaW4gdGhlIHNhbXBsZQorY29uZmlndXJhdGlvbi4gIFlvdSBjYW4gY29uZmlndXJlIGFzIG1hbnkgZmlsdGVycyBhcworZGVzaXJlZCwgdXNpbmcgdGhlIGZ1bGwgZmlsdGVyIG1hcHBpbmcgcG9zc2liaWxpdGllcyBkZWZpbmVkCitpbiB0aGUgU2VydmxldCBTcGVjaWZpY2F0aW9uLiAgRWFjaCBmaWx0ZXIgd2lsbCBoYXZlCitpdHMgb3duIFJ1bGVDaGFpbi4KKzwvcD4KKzwvc3Vic2VjdGlvbj4KKworPHN1YnNlY3Rpb24gbmFtZT0iSG93IGl0IFdvcmtzIj4KKzxwPgorPG9sPgorICA8bGk+WW91IHdyaXRlIGEgcnVsZXMgY29uZmlndXJhdGlvbiBmaWxlIGNvbnRhaW5pbmcgdmFyaW91cworcnVsZXMgYW5kIHJlZGlyZWN0aW9uIGxvY2F0aW9ucy48L2xpPgorICA8bGk+WW91IGRlZmluZSB0aGUgYmFsYW5jZXIgZmlsdGVyIGluIHlvdXIgd2ViLnhtbCwgbWFwcGluZworaXQgYXMgZGVzaXJlZCAoLyogaXMgYSBjb21tb24gdXNlLWNhc2UpIGFuZCBjb25maWd1cmluZyBpdAord2l0aCB5b3VyIHJ1bGVzIGNvbmZpZ3VyYXRpb24gZmlsZS48L2xpPgorICA8bGk+VGhlIHNlcnZlciBpcyBzdGFydGVkLCBpbml0aWFsaXppbmcgdGhlIGZpbHRlci48L2xpPgorICA8bGk+QSByZXF1ZXN0IGNvbWVzIGludG8gdGhlIHNlcnZlci4gIFRoZSBmaWx0ZXIgY29uc3VsdHMKK2l0cyBydWxlIGNoYWluIHRvIGRldGVybWluZSB3aGVyZSB0byByZWRpcmVjdCB0aGUgcmVxdWVzdC4gIFJ1bGVzCithcmUgY29uc3VsdGVkIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IGFyZSBkZWZpbmVkIGluIHRoZSBydWxlcworY29uZmlndXJhdGlvbiBmaWxlLiAgVGhlIGZpcnN0IG1hdGNoaW5nIHJ1bGUgd2lsbCBzdG9wIHRoZQorZXZhbHVhdGlvbiBhbmQgY2F1c2UgdGhlIHJlcXVlc3QgdG8gYmUgcmVkaXJlY3RlZC48L2xpPgorPC9vbD4KKzwvcD4KKworPC9zdWJzZWN0aW9uPgorCis8c3Vic2VjdGlvbiBuYW1lPSJDb21tZW50cyI+Cis8cD4KK1BsZWFzZSBkaXJlY3QgcXVlc3Rpb25zLCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGV0Yy4gdG8gdGhlCit0b21jYXQtdXNlciBtYWlsaW5nIGxpc3QuICBUaGFuayB5b3UuCis8L3A+Cis8L3N1YnNlY3Rpb24+CisKKzwvc2VjdGlvbj4KKworPC9ib2R5PgorCis8L2RvY3VtZW50PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9idWlsZC54bWwgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2J1aWxkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2Q3MzVmCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9idWlsZC54bWwKQEAgLTAsMCArMSwyMzYgQEAKKzxwcm9qZWN0IG5hbWU9InRvbWNhdC1kb2NzIiBkZWZhdWx0PSJidWlsZC1tYWluIiBiYXNlZGlyPSIuIj4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09IEluaXRpYWxpemUgUHJvcGVydHkgVmFsdWVzID09PT09PT09PT09PT09PT09PT0gLS0+CisKKyAgPCEtLSBTZWUgImJ1aWxkLnByb3BlcnRpZXMuc2FtcGxlIiBpbiB0aGUgdG9wIGxldmVsIGRpcmVjdG9yeSBmb3IgYWxsICAgICAtLT4KKyAgPCEtLSBwcm9wZXJ0eSB2YWx1ZXMgeW91IG11c3QgY3VzdG9taXplIGZvciBzdWNjZXNzZnVsIGJ1aWxkaW5nISEhICAgICAgICAtLT4KKyAgPHByb3BlcnR5IGZpbGU9ImJ1aWxkLnByb3BlcnRpZXMiLz4KKyAgPHByb3BlcnR5IGZpbGU9Ii4uL2J1aWxkLnByb3BlcnRpZXMiLz4KKyAgPHByb3BlcnR5IGZpbGU9Ii4uLy4uL2J1aWxkLnByb3BlcnRpZXMiLz4KKyAgPHByb3BlcnR5IGZpbGU9IiR7dXNlci5ob21lfS9idWlsZC5wcm9wZXJ0aWVzIi8+CisKKyAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmNvbXBpbGVyIiAgdmFsdWU9Im1vZGVybiIvPgorICA8cHJvcGVydHkgbmFtZT0id2ViYXBwcy5idWlsZCIgICB2YWx1ZT0iLi4vYnVpbGQiLz4KKyAgPHByb3BlcnR5IG5hbWU9IndlYmFwcHMuZGlzdCIgICAgdmFsdWU9Ii4uL2Rpc3QiLz4KKyAgPHByb3BlcnR5IG5hbWU9IndlYmFwcC5uYW1lIiAgICAgdmFsdWU9InRvbWNhdC1kb2NzIi8+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT0gQlVJTEQ6IENyZWF0ZSBEaXJlY3RvcmllcyA9PT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImJ1aWxkLXByZXBhcmUiPgorICAgIDxta2RpciBkaXI9IiR7d2ViYXBwcy5idWlsZH0iLz4KKyAgICA8bWtkaXIgZGlyPSIke3dlYmFwcHMuYnVpbGR9LyR7d2ViYXBwLm5hbWV9Ii8+CisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09IEJVSUxEOiBDb3B5IFN0YXRpYyBGaWxlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJidWlsZC1zdGF0aWMiIGRlcGVuZHM9ImJ1aWxkLXByZXBhcmUiPgorCisgICAgPCEtLSBUb3AgTGV2ZWwgU3RhdGljIEZpbGVzIC0tPgorICAgIDxjb3B5ICAgIHRvZGlyPSIke3dlYmFwcHMuYnVpbGR9LyR7d2ViYXBwLm5hbWV9Ij4KKyAgICAgIDxmaWxlc2V0IGRpcj0iLi4vLi4iPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJCVUlMRElORy50eHQiLz4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iUkVBRE1FLnR4dCIvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJSVU5OSU5HLnR4dCIvPgorICAgICAgPC9maWxlc2V0PgorICAgIDwvY29weT4KKyAgICA8Y29weSAgICB0b2Rpcj0iJHt3ZWJhcHBzLmJ1aWxkfS8ke3dlYmFwcC5uYW1lfSI+CisgICAgICA8ZmlsZXNldCBkaXI9Ii4iIGluY2x1ZGVzPSIqKi8qLmh0bWwiLz4KKyAgICA8L2NvcHk+CisKKyAgICA8IS0tIFdFQi1JTkYgU3RhdGljIEZpbGVzIC0tPgorICAgIDxjb3B5ICAgIHRvZGlyPSIke3dlYmFwcHMuYnVpbGR9LyR7d2ViYXBwLm5hbWV9L1dFQi1JTkYiPgorICAgICAgPGZpbGVzZXQgZGlyPSJXRUItSU5GIi8+CisgICAgPC9jb3B5PgorCisgICAgPCEtLSBBcHBsaWNhdGlvbiBEZXZlbG9wZXIncyBHdWlkZSBFeGFtcGxlcyAtLT4KKyAgICA8Y29weSAgICB0b2Rpcj0iJHt3ZWJhcHBzLmJ1aWxkfS8ke3dlYmFwcC5uYW1lfS9hcHBkZXYiPgorICAgICAgPGZpbGVzZXQgZGlyPSJhcHBkZXYiIGluY2x1ZGVzPSIqLnR4dCIvPgorICAgIDwvY29weT4KKyAgICA8Y29weSAgICB0b2Rpcj0iJHt3ZWJhcHBzLmJ1aWxkfS8ke3dlYmFwcC5uYW1lfS9hcHBkZXYvc2FtcGxlIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iYXBwZGV2L3NhbXBsZSIvPgorICAgIDwvY29weT4KKyAgICA8Y29weSAgIHRvZmlsZT0iJHt3ZWJhcHBzLmJ1aWxkfS8ke3dlYmFwcC5uYW1lfS9hcHBkZXYvc2FtcGxlL2J1aWxkLnhtbCIKKyAgICAgICAgICAgICAgZmlsZT0iYXBwZGV2L2J1aWxkLnhtbC50eHQiLz4KKworICAgIDwhLS0gQ2F0YWxpbmEgRnVuY3Rpb25hbCBTcGVjaWZpY2F0aW9ucyAtLT4KKyAgICA8bWtkaXIgICAgIGRpcj0iJHt3ZWJhcHBzLmJ1aWxkfS8ke3dlYmFwcC5uYW1lfS9jYXRhbGluYS9mdW5jc3BlY3MiLz4KKworICAgIDwhLS0gQXJjaGl0ZWN0dXJlIC0tPgorICAgIDxjb3B5ICAgIHRvZGlyPSIke3dlYmFwcHMuYnVpbGR9LyR7d2ViYXBwLm5hbWV9L2FyY2hpdGVjdHVyZSI+CisgICAgICA8ZmlsZXNldCBkaXI9ImFyY2hpdGVjdHVyZSIgZXhjbHVkZXM9IioueG1sIi8+CisgICAgPC9jb3B5PgorCisgICAgPCEtLSBJbWFnZXMgU3ViZGlyZWN0b3J5IC0tPgorICAgIDxta2RpciAgICAgZGlyPSIke3dlYmFwcHMuYnVpbGR9LyR7d2ViYXBwLm5hbWV9L2ltYWdlcyIvPgorICAgIDxjb3B5ICAgIHRvZGlyPSIke3dlYmFwcHMuYnVpbGR9LyR7d2ViYXBwLm5hbWV9L2ltYWdlcyI+CisgICAgICA8ZmlsZXNldCBkaXI9ImltYWdlcyIvPgorICAgIDwvY29weT4KKworICAgIDxta2RpciAgICAgZGlyPSIke3dlYmFwcHMuYnVpbGR9LyR7d2ViYXBwLm5hbWV9L3ByaW50ZXIiLz4KKyAgICA8IS0tIFRvcCBMZXZlbCBTdGF0aWMgRmlsZXMgLS0+CisgICAgPGNvcHkgICAgdG9kaXI9IiR7d2ViYXBwcy5idWlsZH0vJHt3ZWJhcHAubmFtZX0vcHJpbnRlciI+CisgICAgICA8ZmlsZXNldCBkaXI9Ii4uLy4uIj4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iQlVJTERJTkcudHh0Ii8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9IlJFQURNRS50eHQiLz4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iUlVOTklORy50eHQiLz4KKyAgICAgIDwvZmlsZXNldD4KKyAgICA8L2NvcHk+CisgICAgPHN0eWxlIGJhc2VkaXI9Ii4iCisgICAgICAgICAgIGRlc3RkaXI9IiR7d2ViYXBwcy5idWlsZH0vJHt3ZWJhcHAubmFtZX0vcHJpbnRlciIKKyAgICAgICAgIGV4dGVuc2lvbj0iLmh0bWwiCisgICAgICAgICAgICAgc3R5bGU9InRvbWNhdC1kb2NzLnhzbCIKKyAgICAgICAgICBleGNsdWRlcz0iYnVpbGQueG1sIHByb2plY3QueG1sIgorICAgICAgICAgIGluY2x1ZGVzPSIqLnhtbCI+CisgICAgICA8cGFyYW0gbmFtZT0icmVsYXRpdmUtcGF0aCIgZXhwcmVzc2lvbj0iLi8uLiIvPgorICAgICAgPHBhcmFtIG5hbWU9InByb2plY3QtbWVudSIgZXhwcmVzc2lvbj0ibm9tZW51Ii8+CisgICAgPC9zdHlsZT4KKworICAgIDwhLS0gV0VCLUlORiBTdWJkaXJlY3RvcnkgLS0+CisgICAgPG1rZGlyICAgICBkaXI9IiR7d2ViYXBwcy5idWlsZH0vJHt3ZWJhcHAubmFtZX0vV0VCLUlORiIvPgorICAgIDxjb3B5ICAgIHRvZGlyPSIke3dlYmFwcHMuYnVpbGR9LyR7d2ViYXBwLm5hbWV9L1dFQi1JTkYiPgorICAgICAgPGZpbGVzZXQgZGlyPSJXRUItSU5GIi8+CisgICAgPC9jb3B5PgorCisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PSBCVUlMRDogWE1MLUhUTUwgR2VuZXJhdGlvbiA9PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJidWlsZC1tYWluIiBkZXBlbmRzPSJidWlsZC1zdGF0aWMiPgorCisgICAgPCEtLSBUb3AgTGV2ZWwgRGlyZWN0b3J5IC0tPgorICAgIDxzdHlsZSBiYXNlZGlyPSIuIgorICAgICAgICAgICBkZXN0ZGlyPSIke3dlYmFwcHMuYnVpbGR9LyR7d2ViYXBwLm5hbWV9IgorICAgICAgICAgZXh0ZW5zaW9uPSIuaHRtbCIKKyAgICAgICAgICAgICBzdHlsZT0idG9tY2F0LWRvY3MueHNsIgorICAgICAgICAgIGV4Y2x1ZGVzPSJidWlsZC54bWwgcHJvamVjdC54bWwiCisgICAgICAgICAgaW5jbHVkZXM9IioueG1sIj4KKyAgICAgIDxwYXJhbSBuYW1lPSJyZWxhdGl2ZS1wYXRoIiBleHByZXNzaW9uPSIuIi8+CisgICAgPC9zdHlsZT4KKworICAgIDwhLS0gQXBwbGljYXRpb24gRGV2ZWxvcGVyJ3MgR3VpZGUgLS0+CisgICAgPHN0eWxlIGJhc2VkaXI9ImFwcGRldiIKKyAgICAgICAgICAgZGVzdGRpcj0iJHt3ZWJhcHBzLmJ1aWxkfS8ke3dlYmFwcC5uYW1lfS9hcHBkZXYiCisgICAgICAgICBleHRlbnNpb249Ii5odG1sIgorICAgICAgICAgICAgIHN0eWxlPSJ0b21jYXQtZG9jcy54c2wiCisgICAgICAgICAgZXhjbHVkZXM9InByb2plY3QueG1sIgorICAgICAgICAgIGluY2x1ZGVzPSIqLnhtbCI+CisgICAgICA8cGFyYW0gbmFtZT0icmVsYXRpdmUtcGF0aCIgZXhwcmVzc2lvbj0iLi4iLz4KKyAgICA8L3N0eWxlPgorICAgIDxta2RpciAgICAgZGlyPSIke3dlYmFwcHMuYnVpbGR9LyR7d2ViYXBwLm5hbWV9L2FwcGRldi9wcmludGVyIi8+CisgICAgPCEtLSBBcHBsaWNhdGlvbiBEZXZlbG9wZXIncyBHdWlkZSBFeGFtcGxlcyAtLT4KKyAgICA8Y29weSAgICB0b2Rpcj0iJHt3ZWJhcHBzLmJ1aWxkfS8ke3dlYmFwcC5uYW1lfS9hcHBkZXYvcHJpbnRlciI+CisgICAgICA8ZmlsZXNldCBkaXI9ImFwcGRldiIgaW5jbHVkZXM9IioudHh0Ii8+CisgICAgPC9jb3B5PgorICAgIDxzdHlsZSBiYXNlZGlyPSJhcHBkZXYiCisgICAgICAgICAgIGRlc3RkaXI9IiR7d2ViYXBwcy5idWlsZH0vJHt3ZWJhcHAubmFtZX0vYXBwZGV2L3ByaW50ZXIiCisgICAgICAgICBleHRlbnNpb249Ii5odG1sIgorICAgICAgICAgICAgIHN0eWxlPSJ0b21jYXQtZG9jcy54c2wiCisgICAgICAgICAgZXhjbHVkZXM9InByb2plY3QueG1sIgorICAgICAgICAgIGluY2x1ZGVzPSIqLnhtbCI+CisgICAgICA8cGFyYW0gbmFtZT0icmVsYXRpdmUtcGF0aCIgZXhwcmVzc2lvbj0iLi4vLi4iLz4KKyAgICAgIDxwYXJhbSBuYW1lPSJwcm9qZWN0LW1lbnUiIGV4cHJlc3Npb249Im5vbWVudSIvPgorICAgIDwvc3R5bGU+CisKKyAgICA8IS0tIENhdGFsaW5hIEZ1bmN0aW9uYWwgU3BlY2lmaWNhdGlvbnMgLS0+CisgICAgPG1rZGlyICAgICBkaXI9IiR7d2ViYXBwcy5idWlsZH0vJHt3ZWJhcHAubmFtZX0vY2F0YWxpbmEiLz4KKyAgICA8bWtkaXIgICAgIGRpcj0iJHt3ZWJhcHBzLmJ1aWxkfS8ke3dlYmFwcC5uYW1lfS9jYXRhbGluYS9mdW5jc3BlY3MiLz4KKyAgICA8c3R5bGUgYmFzZWRpcj0iZnVuY3NwZWNzIgorICAgICAgICAgICBkZXN0ZGlyPSIke3dlYmFwcHMuYnVpbGR9LyR7d2ViYXBwLm5hbWV9L2NhdGFsaW5hL2Z1bmNzcGVjcyIKKyAgICAgICAgIGV4dGVuc2lvbj0iLmh0bWwiCisgICAgICAgICAgICAgc3R5bGU9InRvbWNhdC1kb2NzLnhzbCIKKyAgICAgICAgICBleGNsdWRlcz0icHJvamVjdC54bWwiCisgICAgICAgICAgaW5jbHVkZXM9IioueG1sIj4KKyAgICAgIDxwYXJhbSBuYW1lPSJyZWxhdGl2ZS1wYXRoIiBleHByZXNzaW9uPSIuLi8uLiIvPgorICAgIDwvc3R5bGU+CisgICAgPG1rZGlyICAgICBkaXI9IiR7d2ViYXBwcy5idWlsZH0vJHt3ZWJhcHAubmFtZX0vY2F0YWxpbmEvZnVuY3NwZWNzL3ByaW50ZXIiLz4KKyAgICA8c3R5bGUgYmFzZWRpcj0iZnVuY3NwZWNzIgorICAgICAgICAgICBkZXN0ZGlyPSIke3dlYmFwcHMuYnVpbGR9LyR7d2ViYXBwLm5hbWV9L2NhdGFsaW5hL2Z1bmNzcGVjcy9wcmludGVyIgorICAgICAgICAgZXh0ZW5zaW9uPSIuaHRtbCIKKyAgICAgICAgICAgICBzdHlsZT0idG9tY2F0LWRvY3MueHNsIgorICAgICAgICAgIGV4Y2x1ZGVzPSJwcm9qZWN0LnhtbCIKKyAgICAgICAgICBpbmNsdWRlcz0iKi54bWwiPgorICAgICAgPHBhcmFtIG5hbWU9InJlbGF0aXZlLXBhdGgiIGV4cHJlc3Npb249Ii4uLy4uLy4uIi8+CisgICAgICA8cGFyYW0gbmFtZT0icHJvamVjdC1tZW51IiBleHByZXNzaW9uPSJub21lbnUiLz4KKyAgICA8L3N0eWxlPgorCisgICAgPCEtLSBTZXJ2ZXIgQ29uZmlndXJhdGlvbiBSZWZlcmVuY2UgLS0+CisgICAgPHN0eWxlIGJhc2VkaXI9ImNvbmZpZyIKKyAgICAgICAgICAgZGVzdGRpcj0iJHt3ZWJhcHBzLmJ1aWxkfS8ke3dlYmFwcC5uYW1lfS9jb25maWciCisgICAgICAgICBleHRlbnNpb249Ii5odG1sIgorICAgICAgICAgICAgIHN0eWxlPSJ0b21jYXQtZG9jcy54c2wiCisgICAgICAgICAgZXhjbHVkZXM9InByb2plY3QueG1sIgorICAgICAgICAgIGluY2x1ZGVzPSIqLnhtbCI+CisgICAgICA8cGFyYW0gbmFtZT0icmVsYXRpdmUtcGF0aCIgZXhwcmVzc2lvbj0iLi4iLz4KKyAgICA8L3N0eWxlPgorICAgIDxta2RpciAgICAgZGlyPSIke3dlYmFwcHMuYnVpbGR9LyR7d2ViYXBwLm5hbWV9L2NvbmZpZy9wcmludGVyIi8+CisgICAgPHN0eWxlIGJhc2VkaXI9ImNvbmZpZyIKKyAgICAgICAgICAgZGVzdGRpcj0iJHt3ZWJhcHBzLmJ1aWxkfS8ke3dlYmFwcC5uYW1lfS9jb25maWcvcHJpbnRlciIKKyAgICAgICAgIGV4dGVuc2lvbj0iLmh0bWwiCisgICAgICAgICAgICAgc3R5bGU9InRvbWNhdC1kb2NzLnhzbCIKKyAgICAgICAgICBleGNsdWRlcz0icHJvamVjdC54bWwiCisgICAgICAgICAgaW5jbHVkZXM9IioueG1sIj4KKyAgICAgIDxwYXJhbSBuYW1lPSJyZWxhdGl2ZS1wYXRoIiBleHByZXNzaW9uPSIuLi8uLiIvPgorICAgICAgPHBhcmFtIG5hbWU9InByb2plY3QtbWVudSIgZXhwcmVzc2lvbj0ibm9tZW51Ii8+CisgICAgPC9zdHlsZT4KKworICAgIDwhLS0gU2VydmVyIEFyY2hpdGVjdHVyZSAtLT4KKyAgICA8c3R5bGUgYmFzZWRpcj0iYXJjaGl0ZWN0dXJlIgorICAgICAgICAgICBkZXN0ZGlyPSIke3dlYmFwcHMuYnVpbGR9LyR7d2ViYXBwLm5hbWV9L2FyY2hpdGVjdHVyZSIKKyAgICAgICAgIGV4dGVuc2lvbj0iLmh0bWwiCisgICAgICAgICAgICAgc3R5bGU9InRvbWNhdC1kb2NzLnhzbCIKKyAgICAgICAgICBleGNsdWRlcz0icHJvamVjdC54bWwiCisgICAgICAgICAgaW5jbHVkZXM9IioueG1sIj4KKyAgICAgIDxwYXJhbSBuYW1lPSJyZWxhdGl2ZS1wYXRoIiBleHByZXNzaW9uPSIuLiIvPgorICAgIDwvc3R5bGU+CisgICAgPG1rZGlyICAgICBkaXI9IiR7d2ViYXBwcy5idWlsZH0vJHt3ZWJhcHAubmFtZX0vYXJjaGl0ZWN0dXJlL3ByaW50ZXIiLz4KKyAgICA8c3R5bGUgYmFzZWRpcj0iYXJjaGl0ZWN0dXJlIgorICAgICAgICAgICBkZXN0ZGlyPSIke3dlYmFwcHMuYnVpbGR9LyR7d2ViYXBwLm5hbWV9L2FyY2hpdGVjdHVyZS9wcmludGVyIgorICAgICAgICAgZXh0ZW5zaW9uPSIuaHRtbCIKKyAgICAgICAgICAgICBzdHlsZT0idG9tY2F0LWRvY3MueHNsIgorICAgICAgICAgIGV4Y2x1ZGVzPSJwcm9qZWN0LnhtbCIKKyAgICAgICAgICBpbmNsdWRlcz0iKi54bWwiPgorICAgICAgPHBhcmFtIG5hbWU9InJlbGF0aXZlLXBhdGgiIGV4cHJlc3Npb249Ii4uLy4uIi8+CisgICAgICA8cGFyYW0gbmFtZT0icHJvamVjdC1tZW51IiBleHByZXNzaW9uPSJub21lbnUiLz4KKyAgICA8L3N0eWxlPgorCisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PSBCVUlMRDogUmVidWlsZCBFdmVyeXRoaW5nID09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJhbGwiIGRlcGVuZHM9ImJ1aWxkLWNsZWFuLGJ1aWxkLW1haW4iCisgICBkZXNjcmlwdGlvbj0iQ2xlYW4gYW5kIGJ1aWxkIGRvY3VtZW50YXRpb24gd2ViYXBwIi8+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09IEJVSUxEOiBDbGVhbiBEaXJlY3RvcnkgPT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImJ1aWxkLWNsZWFuIj4KKyAgICA8ZGVsZXRlIGRpcj0iJHt3ZWJhcHBzLmJ1aWxkfS8ke3dlYmFwcC5uYW1lfSIvPgorICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT0gRElTVDogQ3JlYXRlIERpcmVjdG9yaWVzID09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iZGlzdC1wcmVwYXJlIj4KKyAgICA8bWtkaXIgZGlyPSIke3dlYmFwcHMuZGlzdH0iLz4KKyAgPC90YXJnZXQ+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09IERJU1Q6IENyZWF0ZSBEaXN0cmlidXRpb24gRmlsZXMgPT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImRpc3QiIGRlcGVuZHM9ImJ1aWxkLW1haW4sZGlzdC1wcmVwYXJlIgorICAgZGVzY3JpcHRpb249IkNyZWF0ZSBkb2N1bWVudGF0aW9uIHdlYmFwcCBiaW5hcnkgZGlzdHJpYnV0aW9uIj4KKyAgICAgIDxqYXIgICBqYXJmaWxlPSIke3dlYmFwcHMuZGlzdH0vJHt3ZWJhcHAubmFtZX0ud2FyIgorICAgICAgICAgICAgIGJhc2VkaXI9IiR7d2ViYXBwcy5idWlsZH0vJHt3ZWJhcHAubmFtZX0iIGluY2x1ZGVzPSIqKiIvPgorICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT0gRElTVDogQ2xlYW4gRGlyZWN0b3J5ID09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iZGlzdC1jbGVhbiI+CisgICAgPGRlbGV0ZSBkaXI9IiR7d2ViYXBwcy5kaXN0fS8ke3dlYmFwcC5uYW1lfSIvPgorICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PSBDb252ZW5pZW50IFN5bm9ueW1zID09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iY2xlYW4iIGRlcGVuZHM9ImJ1aWxkLWNsZWFuLGRpc3QtY2xlYW4iCisgICBkZXNjcmlwdGlvbj0iQ2xlYW4gYnVpbGQgYW5kIGRpc3QgZGlyZWN0b3JpZXMiLz4KKworCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9kb2NzL2J1aWxkaW5nLnhtbCBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvYnVpbGRpbmcueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxZjc2NGMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2J1aWxkaW5nLnhtbApAQCAtMCwwICsxLDIxNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IURPQ1RZUEUgZG9jdW1lbnQgWworICA8IUVOVElUWSBwcm9qZWN0IFNZU1RFTSAicHJvamVjdC54bWwiPgorXT4KKzxkb2N1bWVudD4KKworICAgICZwcm9qZWN0OworCisgICAgPHByb3BlcnRpZXM+CisgICAgICA8YXV0aG9yPlJlbXkgTWF1Y2hlcmF0PC9hdXRob3I+CisgICAgICA8dGl0bGU+QnVpbGRpbmcgVG9tY2F0PC90aXRsZT4KKyAgICA8L3Byb3BlcnRpZXM+CisKKzxib2R5PgorCis8c2VjdGlvbiBuYW1lPSJJbnRyb2R1Y3Rpb24iPgorCis8cD4KK0J1aWxkaW5nIFRvbWNhdCBmcm9tIENWUyBpcyB2ZXJ5IGVhc3ksIGFuZCBpcyB0aGUgZmlyc3Qgc3RlcCB0byBjb250cmlidXRpbmcgdG8KK1RvbWNhdC4gVGhlIGZvbGxvd2luZyBpcyBhIHN0ZXAgYnkgc3RlcCBUT0RPIGxpc3QuCis8L3A+CisKKzwvc2VjdGlvbj4KKworPHNlY3Rpb24gbmFtZT0iRG93bmxvYWQgYW5kIGluc3RhbGwgYSBKYXZhIERldmVsb3BtZW50IEtpdCAxLjQueCBvciBsYXRlciI+CisKKzxwPgorRWFybGllciByZWxlYXNlcyB3b3VsZCBhbHNvIHdvcmssIGJ1dCBhcmUgaGFyZGVyIHRvIHdvcmsgd2l0aCBkdWUgdG8gdGhlIG5lZWQgdG8KK2Rvd25sb2FkIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzLiBUb21jYXQgYWxzbyBydW5zIG11Y2ggZmFzdGVyIG9uIAordGhlIGxhdGVzdCAxLjQgSkRLLgorPC9wPgorCis8cD4KK1RoZSBTdW4gSkRLIGNhbiBiZSBkb3dubG9hZGVkIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8iPmhlcmU8L2E+LgorPC9wPgorCis8cD4KKzxiPklNUE9SVEFOVDwvYj46IFNldCBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBKQVZBX0hPTUUgdG8gdGhlIHBhdGhuYW1lIG9mIHRoZSAKK2RpcmVjdG9yeSBpbnRvIHdoaWNoIHlvdSBpbnN0YWxsZWQgdGhlIEpESyByZWxlYXNlLgorPC9wPgorCis8L3NlY3Rpb24+CisKKzxzZWN0aW9uIG5hbWU9Ikluc3RhbGwgQXBhY2hlIEFudCAxLjYueCI+CisKKzxwPgorRG93bmxvYWQgYSBiaW5hcnkgZGlzdHJpYnV0aW9uIG9mIEFudCAxLjYueCBmcm9tIAorPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL2JpbmRvd25sb2FkLmNnaSI+aGVyZTwvYT4uCis8L3A+CisKKzxwPgorVW5wYWNrIHRoZSBiaW5hcnkgZGlzdHJpYnV0aW9uIGludG8gYSBjb252ZW5pZW50IGxvY2F0aW9uIHNvIHRoYXQgdGhlCitBbnQgcmVsZWFzZSByZXNpZGVzIGluIGl0cyBvd24gZGlyZWN0b3J5IChjb252ZW50aW9uYWxseSBuYW1lZAorImpha2FydGEtYW50LTEuNi4yIikuICBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoZSByZW1haW5kZXIgb2YgdGhpcyBkb2N1bWVudCwKK3RoZSBzeW1ib2xpYyBuYW1lICIke2FudC5ob21lfSIgaXMgdXNlZCB0byByZWZlciB0byB0aGUgZnVsbCBwYXRobmFtZSBvZgorIHRoZSByZWxlYXNlIGRpcmVjdG9yeS4KKzwvcD4KKworPHA+CitDcmVhdGUgYW4gQU5UX0hPTUUgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gcG9pbnQgdGhlIGRpcmVjdG9yeSAke2FudC5ob21lfSwgCithbmQgbW9kaWZ5IHRoZSBQQVRIIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIGluY2x1ZGUgZGlyZWN0b3J5CisiJHthbnQuaG9tZX0vYmluIiBpbiBpdHMgbGlzdC4gIFRoaXMgbWFrZXMgdGhlICJhbnQiIGNvbW1hbmQgbGluZSBzY3JpcHQKK2F2YWlsYWJsZSwgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIGFjdHVhbGx5IHBlcmZvcm0gdGhlIGJ1aWxkLgorPC9wPgorCis8L3NlY3Rpb24+CisKKzxzZWN0aW9uIG5hbWU9IkJ1aWxkaW5nIFRvbWNhdCI+CisKKzxwPgorRG93bmxvYWQgdGhlIG1haW4gYnVpbGQueG1sIHNjcmlwdCBmcm9tIDxhIGhyZWY9ImJ1aWxkLnhtbCI+aGVyZTwvYT4uCis8L3A+CisKKzxwPgorQ3JlYXRlIGEgbmV3IGRpcmVjdG9yeSwgYW5kIGNvcHkgdGhlIG5ld2x5IGRvd25sb2FkIGJ1aWxkLnhtbCB0byBpdC4gVGhpcworICBkaXJlY3Rvcnkgd2lsbCBiZSByZWZlcnJlZCB0byBhcyB0aGUgJHt0b21jYXQuc291cmNlfSBkaXJlY3RvcnkgaW4gdGhlIHJlc3QKKyAgb2YgdGhpcyBkb2N1bWVudC4KKzwvcD4KKworPHA+CitHbyB0byB0aGF0IGRpcmVjdG9yeSwgYW5kIGRvOgorPGNvZGU+PGJyLz4KKyAgICBjZCAke3RvbWNhdC5zb3VyY2V9PGJyLz4KKyAgICBhbnQ8YnIvPgorPC9jb2RlPgorPC9wPgorCis8cD4KK05PVEU6IFVzZXJzIGFjY2Vzc2luZyB0aGUgSW50ZXJuZXQgdGhyb3VnaCBhIHByb3h5IG11c3QgdXNlIGEgcHJvcGVydGllcworICBmaWxlIHRvIGluZGljYXRlIHRvIEFudCB0aGUgcHJveHkgY29uZmlndXJhdGlvbi4gUmVhZCBiZWxvdy4KKzwvcD4KKworPHA+CitXQVJOSU5HOiBSdW5uaW5nIHRoaXMgY29tbWFuZCB3aWxsIGNoZWNrb3V0IHRoZSBUb21jYXQgNSBzb3VyY2VzIGZyb20gQ1ZTLCBhcworICB3ZWxsIGFzIGRvd25sb2FkIGJpbmFyaWVzIHRvIHRoZSA8Y29kZT4vdXNyL3NoYXJlL2phdmE8L2NvZGU+IGRpcmVjdG9yeS4gCisgIE1ha2Ugc3VyZSB0aGlzIGlzIGFwcHJvcHJpYXRlIHRvIGRvIHNvIG9uIHlvdXIgY29tcHV0ZXIuIE9uIFdpbmRvd3MsIAorICB0aGlzIHVzdWFsbHkgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPkM6XHVzclxzaGFyZVxqYXZhPC9jb2RlPiBkaXJlY3RvcnksIAorICB1bmxlc3MgQ3lnd2luIGlzIHVzZWQuIFJlYWQgYmVsb3cgdG8gY3VzdG9taXplIHRoZSBkaXJlY3RvcnkgdXNlZCAKKyAgdG8gZG93bmxvYWQgdGhlIGJpbmFyaWVzLgorPC9wPgorCis8cD4KK1RoZSBidWlsZCBjYW4gYmUgY29udHJvbGxlZCBieSBjcmVhdGluZyBhICR7dG9tY2F0LnNvdXJjZX0vYnVpbGQucHJvcGVydGllcworICBmaWxlLCBhbmQgYWRkaW5nIHRoZSBmb2xsb3dpbmcgY29udGVudCB0byBpdDoKKzxjb2RlPjxici8+CisgICAgIyAtLS0tLSBQcm94eSBzZXR1cCAtLS0tLTxici8+CisgICAgIyBVbmNvbW1lbnQgaWYgdXNpbmcgYSBwcm94eSBzZXJ2ZXIuPGJyLz4KKyAgICAjcHJveHkuaG9zdD1wcm94eS5kb21haW48YnIvPgorICAgICNwcm94eS5wb3J0PTgwODA8YnIvPgorICAgICNwcm94eS51c2U9b248YnIvPgorPGJyLz4KKyAgICAjIC0tLS0tIERlZmF1bHQgQmFzZSBQYXRoIGZvciBEZXBlbmRlbnQgUGFja2FnZXMgLS0tLS08YnIvPgorICAgICMgUmVwbGFjZSB0aGlzIHBhdGggd2l0aCB0aGUgZGlyZWN0b3J5IHBhdGggd2hlcmU8YnIvPgorICAgICMgZGVwZW5kZW5jaWVzIGJpbmFyaWVzIHNob3VsZCBiZSBkb3dubG9hZGVkLjxici8+CisgICAgYmFzZS5wYXRoPS91c3Ivc2hhcmUvamF2YTxici8+Cis8L2NvZGU+Cis8L3A+CisKKzwvc2VjdGlvbj4KKworPHNlY3Rpb24gbmFtZT0iVXBkYXRpbmcgYW5kIHJlYnVpbGRpbmcgVG9tY2F0IHNvdXJjZXMiPgorCis8cD4KK0l0IGlzIHJlY29tbWVuZGVkIHRvIHJlZ3VsYXJseSB1cGRhdGUgdGhlIGRvd25sb2FkZWQgVG9tY2F0IDUgc291cmNlcy4gCitUbyBkbyB0aGlzLCBleGVjdXRlIHRoZSBmb2xsb3dpbmcgY29tbWFuZHM6CisKKzxjb2RlPjxici8+CisgICAgY2QgJHt0b21jYXQuc291cmNlfTxici8+CisgICAgYW50IGNoZWNrb3V0PGJyLz4KKzwvY29kZT4KKzwvcD4KKworPHA+CitGb3IgYSBxdWljayByZWJ1aWxkIG9mIG9ubHkgbW9kaWZpZWQgY29kZSB5b3UgY2FuIHVzZToKKzxjb2RlPjxici8+CisgICAgY2QgJHt0b21jYXQuc291cmNlfTxici8+CisgICAgYW50IGJ1aWxkPGJyLz4KKzwvY29kZT4KKworPC9wPgorCis8L3NlY3Rpb24+CisKKzxzZWN0aW9uIG5hbWU9IkJ1aWxkaW5nIHdpdGggRWNsaXBzZSI+CisKKzxwPgorPGI+SW1wb3J0YW50OjwvYj4KK1RoaXMgaXMgbm90IGEgc3VwcG9ydGVkIG1lYW5zIG9mIGJ1aWxkaW5nIFRvbWNhdDsgdGhpcyBpbmZvcm1hdGlvbiBpcworcHJvdmlkZWQgd2l0aG91dCB3YXJyYW50eSA6LSkuCitUaGUgb25seSBzdXBwb3J0ZWQgbWVhbnMgb2YgYnVpbGRpbmcgVG9tY2F0IGlzIHdpdGggdGhlICJhbnQgYnVpbGQiCitkZXNjcmliZWQgYWJvdmUuCitIb3dldmVyLCBzb21lIGRldmVsb3BlcnMgbGlrZSB0byB3b3JrIG9uIEphdmEgY29kZSB3aXRoIGEgSmF2YSBJREUsCithbmQgdGhlIGZvbGxvd2luZyBzdGVwcyBoYXZlIGJlZW4gdXNlZCBieSBzb21lIGRldmVsb3BlcnMuCis8L3A+CisKKzxwPgorTm90ZSB0aGF0IHlvdSA8Yj5tdXN0PC9iPiBjb21wbGV0ZSBhbGwgdGhlIGFib3ZlIHN0ZXBzIHRvIGZldGNoCit0aGUgcmVwb3NpdG9yaWVzIGFuZCBidWlsZCBzb21lIEpBUiBmaWxlcyB0aGUgZmlyc3QgdGltZS4KK0FmdGVyIHlvdSBoYXZlIGNvbXBsZXRlZCB0aGUgYWJvdmUgc3RlcHMsIHlvdSBjYW4gc2V0IHVwIGEKK3NlcmllcyBvZiBFY2xpcHNlIDMgcHJvamVjdHMuCis8Yj5Ob3RlPC9iPiB0aGF0IHRoaXMgd2lsbCBub3QgbGV0IHlvdSBidWlsZCBldmVyeXRoaW5nIHVuZGVyIEVjbGlwc2U7Cit0aGUgYnVpbGQgcHJvY2VzcyByZXF1aXJlcyB1c2Ugb2YgQW50IGZvciB0aGUgbWFueSBzdGFnZXMgdGhhdCBhcmVuJ3QKK3NpbXBsZSBKYXZhIGNvbXBpbGF0aW9ucy4KK0hvd2V2ZXIsIGl0IHdpbGwgYWxsb3cgeW91IHRvIHZpZXcgYW5kIGVkaXQgdGhlIEphdmEgY29kZSwKK2dldCB3YXJuaW5ncywgcmVmb3JtYXQgY29kZSwgcGVyZm9ybSByZWZhY3RvcmluZ3MsIHJ1biBUb21jYXQKK3VuZGVyIHRoZSBJREUsIGFuZCBzbyBvbi4KKzwvcD4KKworPHA+CitVc2UgRmlsZS0mZ3Q7TmV3IFByb2plY3QgdG8gY3JlYXRlIGEgbmV3IEphdmEgcHJvamVjdCAKK2ZvciBlYWNoIG9mIHRoZSBiaW5hcmllcyByZXBvc2l0b3J5IChlLmcuLCAvdXNyL3NoYXJlL2phdmEpLCAKK3RvbWNhdC1jb25uZWN0b3JzLCB0b21jYXQtY2F0YWxpbmEsIGphc3Blciwgc2VydmxldGFwaS4KK1VubGVzcyB5b3UgdGhvdWdodCBhaGVhZCB0byBtYWtlIHRoZSAke3RvbWNhdC5zb3VyY2V9IGRpcmVjdG9yeSBiZSB1bmRlcgoreW91ciBXb3Jrc3BhY2UgZm9sZGVyLCB0ZWxsIEVjbGlwc2UgdGhlIGV4dGVybmFsIGxvY2F0aW9uLgorVGhlIG9idmlvdXMgZGVwZW5kZW5jaWVzIHdpbGwgYmUgbmVlZGVkOyB0aGUgInJlcG9zaXRvcnkiIHByb2plY3QKK25lZWRzIHRvIGV4cG9ydCBhbGwgaXRzIGphcnMsIGFuZCBiZSByZWZlcnJlZCB0byBieSB0aGUgb3RoZXIgcHJvamVjdHMuCitFY2xpcHNlIHdpbGwgZmluZCBhbGwgc291cmNlIHRyZWVzIGFuZCBqYXJzLCBhbmQKK2hvcGVmdWxseSBjb21waWxlIHdpdGhvdXQgcHJvYmxlbXMKK1lvdSB3aWxsIG5lZWQgdG8gYWRkICR7YW50LWhvbWV9L2xpYi9hbnQuamFyIGFzIGFuICJFeHRlcm5hbCBKYXIiCit1bmRlciBQcm9qZWN0IFByb3BlcnRpZXMgZm9yIHNvbWUgb2YgdGhlc2UgcHJvamVjdHMgKG5vdGFibHkgdGhvc2UgdGhhdCBmYWlsCit0byBjb21waWxlIGZvciB3YW50IG9mIEJ1aWxkRXhjZXB0aW9uKS4KKzwvcD4KKworPHA+CitUbyBydW4gVG9tY2F0IHdpdGhvdXQgYSBzcGVjaWFsIElERSBwbHVnLWluLCB5b3UgY2FuIHNpbXBseSB1c2UgUnVuLSZndDtSdW4uLi4KK2VudGVyICJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0YXJ0dXAuQ2F0YWxpbmEiIGFzIHRoZSBtYWluIGNsYXNzLAorInN0YXJ0IiBhcyBwcm9ncmFtIGFyZ3VtZW50cywgYW5kCisiLURjYXRhbGluYS5ob21lPS4uLiIgKHdpdGggdGhlIG5hbWUgb2YgeW91ciBidWlsZCBkaXJlY3RvcnkpIAorYXMgVk0gYXJndW1lbnRzLgorPC9wPgorCis8cD4KK05vdGUgYWxzbyB0aGF0IGR1ZSB0byB0aGUgd2F5IHRoZSBUb21jYXQgc291cmNlIGlzIGFzc2VtYmxlZAorZnJvbSBzZXZlcmFsIENWUyBwcm9qZWN0cywgeW91IG1heSBub3QgYmUgYWJsZSB0byB1c2UgdGhlIEVjbGlwc2UKK0NWUyBjbGllbnQgdG8gdXBkYXRlIChub3IgdG8gY29tbWl0LCBpZiB5b3UgYXJlIGEgY29tbWl0dGVyKS4KK1VzZSB0aGUgZXh0ZXJuYWwgQ1ZTIGNsaWVudCBvZiB5b3VyIGNob2ljZSwgdGhlbiB1c2UgdGhlCitFY2xpcHNlIFBhY2thZ2VFeHBsb3JlciBvciBOYXZpZ2F0b3IgIlJlZnJlc2giIGNvbnRleHQgbWVudSBpdGVtCit0byB0ZWxsIEVjbGlwc2UgdGhhdCB5b3UndmUgdXBkYXRlZCB0aGUgZmlsZXMuCis8L3A+CisKKzwvc2VjdGlvbj4KKworPHNlY3Rpb24gbmFtZT0iQnVpbGRpbmcgd2l0aCBvdGhlciBJREVzIj4KKzxwPgorVGhlIHNhbWUgY2F2ZWF0cyBhcHBseSBhcyBmb3IgRWNsaXBzZSwgYWJvdmUuCis8L3A+CisKKzxwPgorVGhlIHNhbWUgZ2VuZXJhbCBpZGVhIHNob3VsZCB3b3JrIGluIG1vc3QgSURFczsgaXQgaGFzIGJlZW4gcmVwb3J0ZWQKK3RvIHdvcmsgaW4gSWRlYSwgZm9yIGV4YW1wbGUuCis8L3A+CisKKzwvc2VjdGlvbj4KKworPC9ib2R5PgorPC9kb2N1bWVudD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvY2F0YWxpbmEvZG9jcy9hcGkvaW5kZXguaHRtbCBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvY2F0YWxpbmEvZG9jcy9hcGkvaW5kZXguaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmU4ZjlhCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9jYXRhbGluYS9kb2NzL2FwaS9pbmRleC5odG1sCkBAIC0wLDAgKzEsMTcgQEAKKzwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy9lbiIgImh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAvc3RyaWN0LmR0ZCI+Cis8aHRtbD4KKyAgICA8aGVhZD4KKyAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKyAgICA8dGl0bGU+QWRtaW5pc3RyYXRpb248L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keT4KKworVG9tY2F0J3MgaW50ZXJuYWwgamF2YWRvYyBpcyBubyBsb25nZXIgaW5zdGFsbGVkIGJ5IGRlZmF1bHQuIERvd25sb2FkIGFuZCBpbnN0YWxsIAordGhlICJmdWxsZG9jcyIgcGFja2FnZSB0byBnZXQgaXQuCisKK1lvdSBjYW4gYWxzbyBhY2Nlc3MgdGhlIGphdmFkb2Mgb25saW5lIGluIHRoZSBUb21jYXQgCis8YSBocmVmPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3RvbWNhdC90b21jYXQtNS41LWRvYy8iPmRvY3VtZW50YXRpb24gYnVuZGxlPC9hPi4KKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9jZ2ktaG93dG8ueG1sIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9jZ2ktaG93dG8ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiZjNjNTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2NnaS1ob3d0by54bWwKQEAgLTAsMCArMSw3NiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IURPQ1RZUEUgZG9jdW1lbnQgWworICA8IUVOVElUWSBwcm9qZWN0IFNZU1RFTSAicHJvamVjdC54bWwiPgorXT4KKzxkb2N1bWVudCB1cmw9ImNnaS1ob3d0by5odG1sIj4KKworICAgICZwcm9qZWN0OworCisgICAgPHByb3BlcnRpZXM+CisgICAgICAgIDxhdXRob3IgZW1haWw9ImdsZW5uQGFwYWNoZS5vcmciPkdsZW5uIEwuIE5pZWxzZW48L2F1dGhvcj4KKyAgICAgICAgPHRpdGxlPkNHSSBIb3cgVG88L3RpdGxlPgorICAgIDwvcHJvcGVydGllcz4KKworPGJvZHk+CisKKzxzZWN0aW9uIG5hbWU9IkludHJvZHVjdGlvbiI+CisKKzxwPlRoZSBDR0kgKENvbW1vbiBHYXRld2F5IEludGVyZmFjZSkgZGVmaW5lcyBhIHdheSBmb3IgYSB3ZWIgc2VydmVyIHRvCitpbnRlcmFjdCB3aXRoIGV4dGVybmFsIGNvbnRlbnQtZ2VuZXJhdGluZyBwcm9ncmFtcywgd2hpY2ggYXJlIG9mdGVuCityZWZlcnJlZCB0byBhcyBDR0kgcHJvZ3JhbXMgb3IgQ0dJIHNjcmlwdHMuCis8L3A+CisKKzxwPldpdGhpbiBUb21jYXQsIENHSSBzdXBwb3J0IGNhbiBiZSBhZGRlZCB3aGVuIHlvdSBhcmUgdXNpbmcgVG9tY2F0IGFzIHlvdXIKK0hUVFAgc2VydmVyIGFuZCByZXF1aXJlIENHSSBzdXBwb3J0LiAgVHlwaWNhbGx5IHRoaXMgaXMgZG9uZQorZHVyaW5nIGRldmVsb3BtZW50IHdoZW4geW91IGRvbid0IHdhbnQgdG8gcnVuIGEgd2ViIHNlcnZlciBsaWtlIAorQXBhY2hlIGh0dHBkLgorVG9tY2F0J3MgQ0dJIHN1cHBvcnQgaXMgbGFyZ2VseSBjb21wYXRpYmxlIHdpdGggQXBhY2hlIGh0dHBkJ3MsIAorYnV0IHRoZXJlIGFyZSBzb21lIGxpbWl0YXRpb25zIChlLmcuLCBvbmx5IG9uZSBjZ2ktYmluIGRpcmVjdG9yeSkuCis8L3A+CisKKzxwPkNHSSBzdXBwb3J0IGlzIGltcGxlbWVudGVkIHVzaW5nIHRoZSBzZXJ2bGV0IGNsYXNzCis8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLnNlcnZsZXRzLkNHSVNlcnZsZXQ8L2NvZGU+LiAgVHJhZGl0aW9uYWxseSwKK3RoaXMgc2VydmxldCBpcyBtYXBwZWQgdG8gdGhlIFVSTCBwYXR0ZXJuICIvY2dpLWJpbi8qIi48L3A+CisKKzxwPkJ5IGRlZmF1bHQgQ0dJIHN1cHBvcnQgaXMgZGlzYWJsZWQgaW4gVG9tY2F0LjwvcD4KKzwvc2VjdGlvbj4KKworPHNlY3Rpb24gbmFtZT0iSW5zdGFsbGF0aW9uIj4KKworPHA+PHN0cm9uZz5DQVVUSU9OPC9zdHJvbmc+IC0gQ0dJIHNjcmlwdHMgYXJlIHVzZWQgdG8gZXhlY3V0ZSBwcm9ncmFtcworZXh0ZXJuYWwgdG8gdGhlIFRvbWNhdCBKVk0uIElmIHlvdSBhcmUgdXNpbmcgdGhlIEphdmEgU2VjdXJpdHlNYW5hZ2VyIHRoaXMKK3dpbGwgYnlwYXNzIHlvdXIgc2VjdXJpdHkgcG9saWN5IGNvbmZpZ3VyYXRpb24gaW4gPGNvZGU+Y2F0YWxpbmEucG9saWN5LjwvY29kZT48L3A+CisKKzxwPlJlbmFtZSA8Y29kZT4kQ0FUQUxJTkFfQkFTRS9zZXJ2ZXIvbGliL3NlcnZsZXRzLWNnaS5yZW5hbWV0b2phcjwvY29kZT4KK3RvIDxjb2RlPiRDQVRBTElOQV9CQVNFL3NlcnZlci9saWIvc2VydmxldHMtY2dpLmphcjwvY29kZT4uPC9wPgorCis8cD5SZW1vdmUgdGhlIFhNTCBjb21tZW50cyBmcm9tIGFyb3VuZCB0aGUgQ0dJIHNlcnZsZXQgYW5kIHNlcnZsZXQtbWFwcGluZworY29uZmlndXJhdGlvbiBpbiA8Y29kZT4kQ0FUQUxJTkFfQkFTRS9jb25mL3dlYi54bWw8L2NvZGU+LjwvcD4KKzwvc2VjdGlvbj4KKworPHNlY3Rpb24gbmFtZT0iQ29uZmlndXJhdGlvbiI+CisKKzxwPlRoZXJlIGFyZSBzZXZlcmFsIHNlcnZsZXQgaW5pdCBwYXJhbWV0ZXJzIHdoaWNoIGNhbiBiZSB1c2VkIHRvCitjb25maWd1cmUgdGhlIGJlaGF2aW91ciBvZiB0aGUgQ0dJIHNlcnZsZXQuCis8dWw+Cis8bGk+PHN0cm9uZz5jZ2lQYXRoUHJlZml4PC9zdHJvbmc+IC0gVGhlIENHSSBzZWFyY2ggcGF0aCB3aWxsIHN0YXJ0IGF0Cit0aGUgd2ViIGFwcGxpY2F0aW9uIHJvb3QgZGlyZWN0b3J5ICsgRmlsZS5zZXBhcmF0b3IgKyB0aGlzIHByZWZpeC4KK1RoZSBkZWZhdWx0IGNnaVBhdGhQcmVmaXggaXMgPGNvZGU+L1dFQi1JTkYvY2dpPC9jb2RlPjwvbGk+Cis8bGk+PHN0cm9uZz5kZWJ1Zzwvc3Ryb25nPiAtIERlYnVnZ2luZyBkZXRhaWwgbGV2ZWwgZm9yIG1lc3NhZ2VzIGxvZ2dlZAorYnkgdGhpcyBzZXJ2bGV0LiBEZWZhdWx0IDAuPC9saT4KKzxsaT48c3Ryb25nPmV4ZWN1dGFibGU8L3N0cm9uZz4gLSBUaGUgb2YgdGhlIGV4ZWN1dGFibGUgdG8gYmUgdXNlZCB0bworcnVuIHRoZSBzY3JpcHQuIERlZmF1bHQgaXMgPGNvZGU+cGVybDwvY29kZT4uPC9saT4KKzxsaT48c3Ryb25nPnBhcmFtZXRlckVuY29kaW5nPC9zdHJvbmc+IC0gTmFtZSBvZiB0aGUgcGFyYW1ldGVyIGVuY29kaW5nCit0byBiZSB1c2VkIHdpdGggdGhlIEdDSSBzZXJ2bGV0LiBEZWZhdWx0IGlzCis8Y29kZT5TeXN0ZW0uZ2V0UHJvcGVydHkoImZpbGUuZW5jb2RpbmciLCJVVEYtOCIpPC9jb2RlPi48L2xpPgorPGxpPjxzdHJvbmc+cGFzc1NoZWxsRW52aXJvbm1lbnQ8L3N0cm9uZz4gLSBTaG91bGQgdGhlIHNoZWxsIGVudmlyb25tZW50Cit2YXJpYWJsZXMgKGlmIGFueSkgYmUgcGFzc2VkIHRvIHRoZSBDR0kgc2NyaXB0PyBEZWZhdWx0IGlzCis8Y29kZT5mYWxzZTwvY29kZT4uPC9saT4KKzwvdWw+Cis8L3A+CisKKzwvc2VjdGlvbj4KKworPC9ib2R5PgorCis8L2RvY3VtZW50PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9jaGFuZ2Vsb2cueG1sIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9jaGFuZ2Vsb2cueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4Y2I2ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2NoYW5nZWxvZy54bWwKQEAgLTAsMCArMSw0OTAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCFET0NUWVBFIGRvY3VtZW50IFsKKyAgPCFFTlRJVFkgcHJvamVjdCBTWVNURU0gInByb2plY3QueG1sIj4KK10+Cis8ZG9jdW1lbnQgdXJsPSJjaGFuZ2Vsb2cuaHRtbCI+CisKKyAgJnByb2plY3Q7CisKKyAgPHByb3BlcnRpZXM+CisgICAgPGF1dGhvciBlbWFpbD0icmVtbUBhcGFjaGUub3JnIj5SZW15IE1hdWNoZXJhdDwvYXV0aG9yPgorICAgIDxhdXRob3IgZW1haWw9InlvYXZzQGFwYWNoZS5vcmciPllvYXYgU2hhcGlyYTwvYXV0aG9yPgorICAgIDx0aXRsZT5DaGFuZ2Vsb2c8L3RpdGxlPgorICA8L3Byb3BlcnRpZXM+CisKKzxib2R5PgorCis8c2VjdGlvbiBuYW1lPSJQcmVmYWNlIj4KKyAgPHA+CisgIFRoaXMgaXMgdGhlIENoYW5nZWxvZyBmb3IgVG9tY2F0IDUuNS54LCB3aGljaCB3YXMgYnJhbmNoZWQgYmFzZWQgb24gVG9tY2F0IDUuMC4yNy4KKyAgRm9yIGNoYW5nZXMgaW4gVG9tY2F0IHZlcnNpb24gNS4wLngsIHdoaWNoIHByZWNlZGVkIHZlcnNpb24gNS41LjAsIHBsZWFzZSBzZWUKKyAgPGEgaHJlZj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy90b21jYXQvdG9tY2F0LTUuMC1kb2MvY2hhbmdlbG9nLmh0bWwiPlRoZQorICBUb21jYXQgNS4wLnggQ2hhbmdlbG9nPC9hPi4gIEFzIG1haW50ZW5hbmNlIHJlbGVhc2VzIGFyZSBjdXQgb24gdGhlIDUuMC54IGJyYW5jaCwKKyAgbW9zdCBmaXhlcyB3aWxsIGJlIHBvcnRlZCBpbnRvIGEgNS41LnggcmVsZWFzZSBhbmQgbm90ZWQgYm90aCBoZXJlIGFuZCBpbiB0aGUKKyAgYWJvdmUgQ2hhbmdlbG9nLiAgSG93ZXZlciwgYnVncyBmaXhlZCBpbiBUb21jYXQgNS4wLjI4IGFuZCBlYXJsaWVyIGFyZSBub3RlZAorICBvbmx5IGluIHRoZSBhYm92ZSBjaGFuZ2Vsb2cuCisgIDwvcD4KKzwvc2VjdGlvbj4KKworPHNlY3Rpb24gbmFtZT0iVG9tY2F0IDUuNS4zICh5b2F2cykiPgorCisgIDxzdWJzZWN0aW9uIG5hbWU9IkdlbmVyYWwiPgorICAgIDxjaGFuZ2Vsb2c+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjMwNTY4PC9idWc+OiBJbmNvbXBsZXRlIHNldHVwLmh0bWwgZG9jdW1lbnRhdGlvbiBmb3IgbGF1bmNoaW5nIGpzdmMuICh5b2F2cykKKyAgICAgIDwvZml4PgorICAgICAgPHVwZGF0ZT4KKyAgICAgICAgUmVwYWNrYWdlIG5hbWluZyBmZWF0dXJlcy4gKHJlbW0pCisgICAgICA8L3VwZGF0ZT4KKyAgICAgIDxmaXg+CisgICAgICAgIEZpeCBkZXBsb3llciBwYWNrYWdpbmcuIChyZW1tKQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICBGaXggZW1iZWQgcGFja2FnaW5nLiAocmVtbSkKKyAgICAgIDwvZml4PgorICAgIDwvY2hhbmdlbG9nPgorICA8L3N1YnNlY3Rpb24+CisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iQ2F0YWxpbmEiPgorICAgIDxjaGFuZ2Vsb2c+CisgICAgICA8Zml4PgorICAgICAgICBGaXggbWVtb3J5IGxlYWsgd2hlbiBTZWN1cml0eSBNYW5hZ2VyIGlzIHR1cm5lZCBvbi4gKGpmYXJjYW5kKQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICBXaGVuIGNoZWNraW5nIHN0YXR1cyBjb2RlcyBmb3IgZXJyb3IgaGFuZGxpbmcsIG9ubHkgY2hlY2sgaWYKKyAgICAgICAgUmVzcG9uc2UuaXNFcnJvcigpIGlzIHRydWUuIFRoaXMgd2F5LCB1c2VycyBtYXkgdXNlIHNldFN0YXR1cygpIHRvIHNldCB0aGVpciBvd24KKyAgICAgICAgZXJyb3Igc3RhdHVzIHdpdGhvdXQgaGF2aW5nIHRoZSBlcnJvciBwYWdlIGludm9rZWQuIChpbiB3aGljaCBjYXNlLCB0aGUgdXNlciBzaG91bGQndmUKKyAgICAgICAgdXNlIHNlbmRFcnJvcigpKSAoZnVua21hbikKKyAgICAgIDwvZml4PgorICAgICAgPHVwZGF0ZT4KKyAgICAgICAgUmVtb3ZlIERpZ2VzdGVyIGNvZGUgZm9yIFhlcmNlcyB3b3JrYXJvdW5kLiAoamZhcmNhbmQpCisgICAgICA8L3VwZGF0ZT4KKyAgICAgIDxmaXg+CisgICAgICAgIEdpdmUgcHJvcGVyIHBlcm1pc3Npb24gdG8gdGhlIGJhbGFuY2VyIGFwcCB3aGVuIHJ1bm5pbmcgdW5kZXIgdGhlIHNlY3VyaXR5IG1hbmFnZXIuIChqZmFyY2FuZCkKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zMDg2OTwvYnVnPjogTWFrZSBzdXJlIEpBQVMgcmVhbG0gbmFtZSBpcyBsZWdhbC4gKHlvYXZzKQorICAgICAgPC9maXg+CisgICAgICA8dXBkYXRlPgorICAgICAgICAgIG1kNUhlbHBlciwgbWQ1RW5jb2RlciwgYW5kIG5vcm1hbGl6ZSBhcmUgdXNlZCBieSBXZWJkYXZTZXJ2bGV0LAorICAgICAgICAgIG5vdCBEZWZhdWx0U2VydmVsdCBzbyBtb3ZlIHRoZW0gaW50byBXZWJkYXZTZXJ2bGV0LgorICAgICAgPC91cGRhdGU+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjMxMjc3PC9idWc+OiBDbGFyaWZpZWQgYXV0b21hdGljIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQgc2VjdGlvbiBvZiBIb3N0IGNvbmZpZ3VyYXRpb24gcGFnZS4gKHlvYXZzKQorICAgICAgPC9maXg+CisgICAgIDxmaXg+CisgICAgICAgPGJ1Zz4yODYzMTwvYnVnPjogSkFBU1JlYWxtIGVuaGFuY2VtZW50cyB0byBzdXBwb3J0IGN1c3RvbSB1c2VyIGFuZCByb2xlIGNsYXNzZXMgIHVzZSBDb21tb25zLUxvZ2dpbmcuICh5b2F2cykKKyAgICAgPC9maXg+CisgICAgIDxmaXg+CisgICAgICAgPGJ1Zz4zMTM2NDwvYnVnPjogTWlzc2luZyByZXNvdXJjZSBpbiBvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuTG9jYWxTdHJpbmcucHJvcGVydGllcy4gKHlvYXZzKQorICAgICA8L2ZpeD4KKyAgICAgPGZpeD4KKyAgICAgICA8YnVnPjMxMzYyPC9idWc+OiBNaXNzaW5nIC1YZGVidWcgaW4gY2F0YWxpbmEuYmF0IHdoZW4gbGF1bmNoaW5nIHdpdGggSlBEQSBhbmQgU2VjdXJpdHkuICh5b2F2cykKKyAgICAgPC9maXg+CisgICAgIDxmaXg+CisgICAgICAgPGJ1Zz4zMTM1NjwvYnVnPjogRHVwbGljYXRlcyBub3QgY291bnRlZCBpbiBzZXNzaW9uIGdlbmVyYXRpb24uICh5b2F2cykKKyAgICAgPC9maXg+CisgICAgIDxmaXg+CisgICAgICAgPGJ1Zz4zMDk0OTwvYnVnPjogTWFrZSBzdXJlIEFwcGxpY2F0aW9uRGlzcGF0Y2hlciB1bndyYXBzIHJlcXVlc3QvcmVzcG9uc2UgZXZlbiBpZiBpbmNsdWRlIGVycm9yIG9jY3Vycy4gKHlvYXZzKQorICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIEZpeGVkIFN0YW5kYXJkQ29udGV4dC5nZXRTdGFydFRpbWUoKSB0byByZXR1cm4gYWN0dWFsIHN0YXJ0IHRpbWUvZGF0ZSBpbnN0ZWFkIG9mIHRpbWUgKHN0YXJ0dXBUaW1lKSBpdCB0b29rIHRvIHN0YXJ0IGNvbnRleHQuIChsdWVoZSkKKyAgICAgIDwvZml4PgorICAgICAgPHVwZGF0ZT4KKyAgICAgICAgZ2V0UmVxdWVzdC9nZXRSZXNwb25zZSBzaG91bGQgcmV0dXJuIHRoZSBtb3N0IHJlbGV2YW50IGludGVyZmFjZSwgdG8gYXZvaWQgY2FzdHMuIChyZW1tKQorICAgICAgPC91cGRhdGU+CisgICAgICA8dXBkYXRlPgorICAgICAgICBBZGQgY2hlY2sgZm9yIGRpcmVjdG9yeSBiZWZvcmUgY29uc2lkZXJpbmcgc29tZXRoaW5nIGlzIGEgY29tcHJlc3NlZCBXQVIuIChyZW1tKQorICAgICAgPC91cGRhdGU+CisgICAgICA8ZG9jcz4KKyAgICAgICAgVXBkYXRlIHRoZSBjb25uZWN0b3IgZG9jdW1lbnRhdGlvbi4gKHJlbW0pCisgICAgICA8L2RvY3M+CisgICAgICA8Zml4PgorICAgICAgICBXaGVuIHBhcnNpbmcgYSBjb250ZXh0IGZpbGUsIGlnbm9yZSB0aGUgInBhdGgiIGF0dHJpYnV0ZTogCisgICAgICAgIHRoZSBvbmx5IHBsYWNlIHdoZXJlIGl0IGlzIGFjY2VwdGFibGUgaXMgaW4gc2VydmVyLnhtbC4gKHJlbW0pCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIERpZ2VzdGVyIGhhbmRsaW5nIGZpeGVzOiBhbHdheXMgY2FsbCByZXNldCBpbiBhIGZpbmFsbHkgYmxvY2sgYWZ0ZXIgdXNpbmcgYSBkaWdlc3Rlci4gKHJlbW0pCisgICAgICA8L2ZpeD4KKyAgICAgIDx1cGRhdGU+CisgICAgICAgIFJlbW92ZSBtYW55IGZpZWxkcyBmcm9tIENvbm5lY3RvciwgYW5kIHRpZSB0aGUgY3JlYXRpb24gb2YgdGhlIENvbm5lY3RvciB0byB0aGUgCisgICAgICAgIGNyZWF0aW9uIG9mIHRoZSBwcm90b2NvbCBoYW5kbGVyLiAocmVtbSkKKyAgICAgIDwvdXBkYXRlPgorICAgICAgPHVwZGF0ZT4KKyAgICAgICAgUmVtb3ZlIHBhY2thZ2UgdHJpZ2dlcnMgZnJvbSB0aGUgY2xhc3Nsb2FkZXIsIHdoaWNoIHNlZW0gdXNlbGVzcyB3aGVuIHVzaW5nIEphdmEgNS4gKHJlbW0pCisgICAgICA8L3VwZGF0ZT4KKyAgICAgIDxmaXg+CisgICAgICAgIFJlYWxtcyB3aWxsIG5vdyB1c2Ugc2V0IGF0dHJpYnV0ZSB0byBzZXQgdGhlbXNlbHZlcyBpbiB0aGVpciBjb250YWluZXIgd2hlbiB1c2luZyBKTVguIChyZW1tKQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICBGaXggSk1YIHJlbGF0ZWQgb3BlcmF0aW9ucyB3aXRoIHRoZSBDb25uZWN0b3IuIChyZW1tKQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICBGaXggc2F2ZS10by1YTUwgZm9yIG5hbWluZyByZXNvdXJjZXMuIChyZW1tKQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICBSZW1vdmUgYXV0aGVudGljYXRvciAiZGVidWciIGF0dHJpYnV0ZXMgZnJvbSB0aGUgZGVzY3JpcHRvcnMuIChyZW1tKQorICAgICAgPC9maXg+CisgICAgICA8dXBkYXRlPgorICAgICAgICBSZWZhY3RvciBvcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5Db250ZXh0WFhYIHRvIHVzZSBuZXcgc3VwZXIgY2xhc3MgUmVzb3VyY2VCYXNlLiAocGVybykKKyAgICAgIDwvdXBkYXRlPgorICAgICAgPGZpeD4KKyAgICAgICAgRW5hYmxlIENvbm5lY3Rvci5maW5kTGlmZWN5Y2xlTGlzdGVuZXIgdGhhdCB3ZSBjYW4gbGlzdGVuIHN0YXJ0L3N0b3AgQ29ubmVjdG9yIGV2ZW50cyBhbmQgc2F2ZSB0aGUgbGlzdGVuZXIgdG8geG1sLiAocGVybykKKyAgICAgIDwvZml4PgorICAgICAgPHVwZGF0ZT4KKyAgICAgICAgUmVtb3ZlIFdhdGNoZG9nIHJlZmVyZW5jZXMsIGFzIGl0IGlzIG5vIGxvbmdlciB1c2VkLiAoeW9hdnMpCisgICAgICA8L3VwZGF0ZT4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+MzE1MTE8L2J1Zz46IERvbid0IGNhbGwgc2V0ZW52LmJhdCBpZiBub3QgZm91bmQsIGluICp1c2luZy1sYXVuY2hlciBzY3JpcHRzLiAoeW9hdnMpCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+MzE1NDk8L2J1Zz46IEFkZCBuYW1lIHRvIFdlYmFwcENsYXNzTG9hZGVyJ3Mgc3RvcHBlZCBtZXNzYWdlLiAoeW9hdnMpCisgICAgICA8L2ZpeD4KKyAgICA8L2NoYW5nZWxvZz4KKyAgPC9zdWJzZWN0aW9uPgorCisgIDxzdWJzZWN0aW9uIG5hbWU9IkNveW90ZSI+CisgICAgPGNoYW5nZWxvZz4KKyAgICAgIDx1cGRhdGU+CisgICAgICAgIEFsbG93IGN1c3RvbWl6ZWQgc2VydmVyIGhlYWRlciBmb3IgU3RhbmRhbG9uZS4gKGZ1bmttYW4pCisgICAgICA8L3VwZGF0ZT4KKyAgICAgIDxmaXg+CisgICAgICAgIERpZ2VzdGVyLnJlc2V0IG5vdyByZW1vdmVzIHRoZSBlcnJvciBoYW5kbGVyLCB0aGUgcm9vdCBhbmQgY2FsbHMgY2xlYXIsIHRvIHByZXZlbnQKKyAgICAgICAgYW55IG1lbW9yeSBsZWFrLiAocmVtbSkKKyAgICAgIDwvZml4PgorICAgICAgPHVwZGF0ZT4KKyAgICAgICAgUmVtb3ZlIHVzZWxlc3Mgc3R1ZmYgaW4gZGlnZXN0ZXIuIChyZW1tKQorICAgICAgPC91cGRhdGU+CisgICAgICA8dXBkYXRlPgorICAgICAgICBJbiBIVFRQLCBhZGQgYSB1dGlsaXR5IG1ldGhvZCB0byBjb252ZXJ0IHN0cmluZ3MgdG8gYnl0ZSBhcnJheXMsIGFuZCBvdXRwdXQgdGhlIHNlcnZlciBoZWFkZXIKKyAgICAgICAgZGlyZWN0bHkgYXMgYnl0ZXMuIChyZW1tKQorICAgICAgPC91cGRhdGU+CisgICAgICA8YWRkPgorICAgICAgICBBZGQgYSBtYXN0ZXIgc2xhdmUgdGhyZWFkIHBvb2wgYmFzZWQgb24gdGhlIGNvZGUgZnJvbSBUb21jYXQgNC4wLiBJdCBpcyBsZXNzIGV4b3RpYyB0aGFuIHRoZQorICAgICAgICBkZWZhdWx0IG9uZSwgYW5kIG1pZ2h0IGZhcmUgYmV0dGVyIG9uIHNvbWUgcGlja3kgc3lzdGVtcywgc3VjaCBhcyBSZWRoYXQgOS4gVGhlIHR3byB0aHJlYWRwb29scworICAgICAgICB3aWxsIGxpa2VseSBiZSByZW1vdmVkIG9uY2Ugd2UgdXNlIHRoZSBKYXZhIDUgQVBJLCBhbHRob3VnaCBtb3JlIGludmVzdGlnYXRpb24gaXMgbmVlZGVkLiAocmVtbSkKKyAgICAgIDwvYWRkPgorICAgICAgPGZpeD4KKyAgICAgICAgRml4IGlzc3VlIHdpdGggZ2V0UHJvcGVydHkgaW4gSW50cm9zcGVjdGlvblV0aWxzLiAocmVtbSkKKyAgICAgIDwvZml4PgorICAgICAgPHVwZGF0ZT4KKyAgICAgICAgUmVtb3ZlIGF0dHJpYnV0ZSB0cmFuc2xhdGlvbiBmb3IgU1NMIGluIHRoZSBIVFRQIHByb3RvY29sIGhhbmRsZXI6IGl0IHdpbGwgbm93IGJlIGRvbmUgaW4gdGhlCisgICAgICAgIENhdGFsaW5hIENvbm5lY3RvciBjbGFzcy4gKHJlbW0pCisgICAgICA8L3VwZGF0ZT4KKyAgICAgIDxmaXg+CisgICAgICAgIEZpeCBoYW5kbGluZyBvZiB0aGUgInRpbWVvdXQiIGF0dHJpYnV0ZSBvZiB0aGUgSFRUUCBwcm90b2NvbCBoYW5kbGVyLiAocmVtbSkKKyAgICAgIDwvZml4PgorICAgIDwvY2hhbmdlbG9nPgorICA8L3N1YnNlY3Rpb24+CisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iSmFzcGVyIj4KKyAgICA8Y2hhbmdlbG9nPgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4zMTE3MTwvYnVnPjogV3JhcCB0byBhdm9pZCBDbGFzc0Nhc3RFeGNlcHRpb24gaW4gUGFnZUNvbnRleHRJbXBsLiAoeW9hdnMpCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+MzEyNTc8L2J1Zz46IEFkZGVkIHNwZWNpZmljYXRpb24gb2YgZW5kb3JzZWQgZGlycyBpZiBmb3JraW5nLiAgTm90ZSB0aGF0IHRoaXMgaXMgZmFpcmx5IHVzZWxlc3MgZm9yIG5vdyBpbiA1LjUgc2luY2UgaXQgdXNlcyBKRFQgYW5kIG5vdCBqYXZhYyBieSBkZWZhdWx0LiAoeW9hdnMpCisgICAgICA8L2ZpeD4KKyAgICAgIDxkb2NzPgorICAgICAgICBEb2N1bWVudCBuZXcgSmFzcGVyIGRlZmF1bHRzLCBhbmQgdXBkYXRlIHRoZSBwcm9kdWN0aW9uIGNvbmZpZ3VyYXRpb24uIChyZW1tKQorICAgICAgPC9kb2NzPgorICAgICAgPGZpeD4KKyAgICAgICAgQ29waWVkIFhNTCBlbmNvZGluZyBkZXRlY3Rpb24gbG9naWMgaW50byBKQVNQRVIsIHNvIHdlJ3JlIG5vIGxvbmdlciBkZXBlbmRlbnQgb24gWGVyY2VzLiAobHVlaGUpCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIEZpeCBjb3NtZXRpYyBpc3N1ZSB3aGVyZSBleHRyYSBDUkxGIHdvdWxkIGJlIGluc2VydGVkIGR1cmluZyBlYWNoIHByZWNvbXBpbGF0aW9uIGluIHdlYi54bWwuIChyZW1tKQorICAgICAgPC9maXg+CisgICAgICA8dXBkYXRlPgorICAgICAgICBBbGxvdyBjb25maWd1cmluZyB0aGUgaW50ZXJ2YWwgZm9sbG93aW5nIGEgY29tcGlsYXRpb24gZHVyaW5nIHdoaWNoIGEgSlNQIHdpbGwgbm90IGJlIGNoZWNrZWQKKyAgICAgICAgZm9yIG1vZGlmaWNhdGlvbnMuIChyZW1tKQorICAgICAgPC91cGRhdGU+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjMxNDY1PC9idWc+OiBFbnN1cmUgdGhhdCB0aGUgY29tcGlsZXIgcmVhZHMgdGhlIC5qYXZhIGZpbGUgdXNpbmcgdGhlIHNhbWUgZW5jb2RpbmcgYXMgdGhhdCB3aXRoIHdoaWNoIGl0IHdhcyB3cml0dGVuLiAobWFya3QpCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIDxidWc+MzE1MTA8L2J1Zz46IE51bGwgb3V0IHJlc3BvbnNlIGluIEpzcFdyaXRlckltcGwjcmVjeWNsZSB0byBhaWQgaW4gSkJvc3MgbWVtb3J5IGxlYWsuICh5b2F2cykKKyAgICAgIDwvZml4PgorICAgIDwvY2hhbmdlbG9nPgorICA8L3N1YnNlY3Rpb24+CisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iQ2x1c3RlciI+CisgICAgPGNoYW5nZWxvZz4KKyAgICAgIDx1cGRhdGU+CisgICAgICAgIEFkZGVkIGZsYWcgdG8gdGhlIGNsdXN0ZXIgKG5vdGlmeUxpc3RlbmVyc09uUmVwbGljYXRpb24pIHRvIGVuYWJsZS9kaXNhYmxlIHRoZSAKKyAgICAgICAgbm90aWZpY2F0aW9ucyBvZiBhdHRyaWJ1dGUvY29udGV4dCBsaXN0ZW5lcnMgdXBvbiByZXBsaWNhdGlvbiBvZiBhIHNlc3Npb24gZGVsdGEKKyAgICAgICAgV29ya3Mgb25seSB3aXRoIHRoZSBEZWx0YU1hbmFnZXIgKGZoYW5paykKKyAgICAgIDwvdXBkYXRlPgorICAgICAgPHVwZGF0ZT4KKyAgICAgICAgQWRkZWQgZmxhZyB0byB0aGUgY2x1c3RlciAoQ2x1c3Rlci9TZW5kZXIvYWNrVGltZW91dCkgdG8gc2V0IHRoZSB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcworICAgICAgICBmb3IgYSBzeW5jaHJvbm91cyByZXF1ZXN0IHRvIGdvIHRocm91Z2gsIGRlZmF1bHRzIHRvIDE1MDAwbXMgKGZoYW5paykKKyAgICAgIDwvdXBkYXRlPgorICAgIDwvY2hhbmdlbG9nPiAgCisgIDwvc3Vic2VjdGlvbj4KKworICA8c3Vic2VjdGlvbiBuYW1lPSJXZWJhcHBzIj4KKyAgICA8Y2hhbmdlbG9nPgorICAgICAgPGZpeD4KKyAgICAgICAgPGJ1Zz4yOTQ4NTwvYnVnPjogSSBicm9rZSB0aGUgSFRNTCBtYW5hZ2VyIHdoZW4gYWRkaW5nIEphdmFTY3JpcHQgY29uZmlybWF0aW9uLCBmaXhlZCBub3cgOykgKHlvYXZzKQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjMxMDU4PC9idWc+OiBFbnN1cmUgU3RhdHVzVHJhbnNmb3JtZXIgZXNjYXBlcyBxdWVyeSBzdHJpbmcgZm9yIFhNTC4gKHlvYXZzKQorICAgICAgPC9maXg+CisgICAgICA8dXBkYXRlPgorICAgICAgICBBZGRlZCBjb250ZXh0cycgc3RhcnQgdGltZSAoYXZhaWxhYmxlIGZyb20gJ3N0YXJ0VGltZScgTUJlYW4gYXR0cmlidXRlIG9mIFN0YW5kYXJkQ29udGV4dCkgdG8gc3RhdHVzIHBhZ2UgKGx1ZWhlKQorICAgICAgPC91cGRhdGU+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjMxMjY0PC9idWc+OiB0aGUgZGVwbG95IHRhc2sgc2hvdWxkIG5vdyBiZWhhdmUgY29ycmVjdGx5LiAocmVtbSkKKyAgICAgIDwvZml4PgorICAgICAgPHVwZGF0ZT4KKyAgICAgICAgUmVmYWN0b3IgdGhlIG1hbmFnZXIgc2VydmxldCB0byBtYWtlIGNhbGxzIHRvIHRoZSBkZXBsb3llciBtb3JlIHJvYnVzdC4gKHJlbW0pCisgICAgICA8L3VwZGF0ZT4KKyAgICAgIDxmaXg+CisgICAgICAgIFVzZSB0aGUgbW9yZSByb2J1c3QgU3RyaW5nLnZhbHVlT2YgaW4gdGhlIGZvcm0gZWRpdCBhY3Rpb24gb2YgdGhlIGNvbm5lY3Rvci4gKHJlbW0pCisgICAgICA8L2ZpeD4KKyAgICA8L2NoYW5nZWxvZz4KKyAgPC9zdWJzZWN0aW9uPgorPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IlRvbWNhdCA1LjUuMiAoeW9hdnMpIj4KKyAgPHN1YnNlY3Rpb24gbmFtZT0iR2VuZXJhbCI+CisgICAgPGNoYW5nZWxvZz4KKyAgICAgIDxmaXg+CisgICAgICAgIFRoZSBpbnN0YWxsZXIgd2lsbCBub3cgdXNlIHRoZSBzeXN0ZW0ncyBKUkUuIChyZW1tKQorICAgICAgPC9maXg+CisgICAgPC9jaGFuZ2Vsb2c+CisgIDwvc3Vic2VjdGlvbj4KKworICA8c3Vic2VjdGlvbiBuYW1lPSJDYXRhbGluYSI+CisgICAgPGNoYW5nZWxvZz4KKyAgICAgIDxmaXg+CisgICAgICAgIEZpeCBVUkwgZ2VuZXJhdGlvbiBmb3IgY2xhc3Nsb2FkZXJzIG9uIFdpbmRvd3MsIGNhdXNpbmcgY29tbW9uL2NsYXNzZXMgYW5kIHNoYXJlZC9jbGFzc2VzCisgICAgICAgIHRvIGJlIHVudXNhYmxlIChyZW1tKQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjMxMTEwPC9idWc+OiBGaXggcmVzb3VyY2UgcGFja2FnaW5nIGJ1ZyBmb3Igc2VydmxldHMgKHJlbW0pCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIEZpeCA1LjUgcmVncmVzc2lvbiB3aGVyZSBnb2luZyB0aHJvdWdoIHRoZSBhdXRoZW50aWNhdG9yIHdvdWxkIGNyZWF0ZSBhIHNlc3Npb24gZWFjaCB0aW1lLiAocmVtbSkKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgRml4IGNsYXNzbmFtZSBvZiB0aGUgY29ubmVjdG9yIGluIEVtYmVkZGVkLCBhbmQgcmVtb3ZlIHRoZSBzb2NrZXQgZmFjdG9yeS4gKHJlbW0pCisgICAgICA8L2ZpeD4KKyAgICA8L2NoYW5nZWxvZz4KKyAgPC9zdWJzZWN0aW9uPgorCisgIDxzdWJzZWN0aW9uIG5hbWU9IkNveW90ZSI+CisgICAgPGNoYW5nZWxvZz4KKyAgICAgIDxmaXg+CisgICAgICAgIFJlZG8gc2VydmVyIGhlYWRlciBoYW5kbGluZyBhZ2Fpbi4gKHJlbW0pCisgICAgICA8L2ZpeD4KKyAgICAgIDx1cGRhdGU+CisgICAgICAgIENsZWFudXAgYSBsaXR0bGUgYWNjZXNzIHRvIHRoZSBoZWFkZXJzIHVzaW5nIGEgbG9jYWwgdmFyaWFibGUgYW5kIAorICAgICAgICB1c2Ugc2V0VmFsdWUgZm9yIFNlcnZlciBhbmQgRGF0ZSBoZWFkZXJzLiAocmVtbSkKKyAgICAgIDwvdXBkYXRlPgorICAgIDwvY2hhbmdlbG9nPgorICA8L3N1YnNlY3Rpb24+CisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iSmFzcGVyIj4KKyAgICA8Y2hhbmdlbG9nPgorICAgICAgPGZpeD4KKyAgICAgICAgUmVtb3ZlIG1heFRhZ05lc3RpbmcgYW5kIGN1clRhZ05lc3Rpbmcgc2luY2UgdGhleSBhcmUgdW51c2VkLiAoZnVua21hbikKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgRml4IHRhZyBmaWxlcyBoYW5kbGluZyB3aXRoIEpEVCwgd2hpY2ggd2VyZSB1c3VzYWJsZSwgYW5kIHJlZmFjdG9yIHRoZSBsaWZlY3ljbGUgaGFuZGxpbmcgb2YKKyAgICAgICAgdGhlIHBhZ2UgbG9hZGVyLiAocmVtbSkKKyAgICAgIDwvZml4PgorICAgIDwvY2hhbmdlbG9nPgorICA8L3N1YnNlY3Rpb24+CisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iQ2x1c3RlciI+CisgICAgPGNoYW5nZWxvZz4KKyAgICA8L2NoYW5nZWxvZz4KKyAgPC9zdWJzZWN0aW9uPgorCisgIDxzdWJzZWN0aW9uIG5hbWU9IldlYmFwcHMiPgorICAgIDxjaGFuZ2Vsb2c+CisgICAgPC9jaGFuZ2Vsb2c+CisgIDwvc3Vic2VjdGlvbj4KKzwvc2VjdGlvbj4KKworPHNlY3Rpb24gbmFtZT0iVG9tY2F0IDUuNS4xICh5b2F2cykiPgorICA8c3Vic2VjdGlvbiBuYW1lPSJHZW5lcmFsIj4KKyAgICA8Y2hhbmdlbG9nPgorICAgICAgPHVwZGF0ZT4KKyAgICAgICAgVG9tY2F0IDUuNSBjYW4gYmUgYnVpbHQgb24gSkRLIDUuMC4gKHlvYXZzKQorICAgICAgPC91cGRhdGU+CisgICAgICA8Zml4PgorICAgICAgICBXaW5kb3dzIGluc3RhbGxlciBwb2xpc2guIChtbGFkZW4sIHJlbW0pCisgICAgICA8L2ZpeD4KKyAgICAgIDx1cGRhdGU+CisgICAgICAgIFJlbW92ZSBkZXBlbmRlbmN5IG9uIEpha2FydGEgcmVnZXhwLiAocmVtbSkKKyAgICAgIDwvdXBkYXRlPgorICAgIDwvY2hhbmdlbG9nPgorICA8L3N1YnNlY3Rpb24+CisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iQ2F0YWxpbmEiPgorICAgIDxjaGFuZ2Vsb2c+CisgICAgICA8Zml4PgorICAgICAgICBBbGxvdyBvdmVycmlkaW5nIHRoZSBsb2NhdGlvbiBvZiB0aGUgZGVmYXVsdCBjb250ZXh0IGZpbGUsIHNpbWlsYXIgdG8gdGhlIGRlZmF1bHQKKyAgICAgICAgd2ViLnhtbC4gKHJlbW0pCisgICAgICA8L2ZpeD4KKyAgICAgIDx1cGRhdGU+CisgICAgICAgIEJhY2twb3J0IGlmLWVsc2UgbG9naWMgZm9yIFNTSSBzZXJ2bGV0IGZyb20gNC4xIChmdW5rbWFuKQorICAgICAgPC91cGRhdGU+CisgICAgICA8Zml4PgorICAgICAgICBSZW1vdmUgRGVmYXVsdENvbnRleHQgZWxlbWVudHMgZnJvbSB0aGUgZGlnZXN0ZXIgcnVsZXMuIChyZW1tKQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICBGaXggUmVzb3VyY2VMaW5rIGhhbmRsaW5nLiAocmVtbSkKKyAgICAgIDwvZml4PgorICAgICAgPGZpeD4KKyAgICAgICAgTW9kaWZ5IHRoZSBhdXRvIGRlcGxveWVyIHRvIGdldCBhbG9uZyB3aXRoIGNvbnRleHRzIHdoaWNoIGFyZSBzdGF0aWNhbGx5IGRlZmluZWQgaW4gc2VydmVyLnhtbC4gKHJlbW0pCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIEV4dGVybmFsaXplIGNvbnN0YW50IHN0cmluZ3MgZGVmaW5pbmcgdGhlIGxvY2F0aW9uIG9mIGRlcGxveW1lbnQgcmVsYXRlZCByZXNvdXJjZXMuIChyZW1tKQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjMxMDUyPC9idWc+OiBCZWFuRmFjdG9yeSBzd2FsbG93cyByb290IGNhdXNlIG9mIGV4Y2VwdGlvbi4gKHlvYXZzKQorICAgICAgPC9maXg+CisgICAgICA8Zml4PgorICAgICAgICBBbGxvdyB1c2luZyBkZXBsb3kgQW50IHRhc2sgd2l0aCBqdXN0IGNvbmZpZyBhdHRyaWJ1dGUsIHN1Ym1pdHRlZCBieSBNaWNoYWVsIFNjaHVlcmlnLiAocmVtbSkKKyAgICAgIDwvZml4PgorICAgICAgPGFkZD4KKyAgICAgICAgQWRkZWQgbG9uZ2VzdCB0aW1lIGFuIGV4cGlyZWQgc2Vzc2lvbiBoYWQgYmVlbiBhbGl2ZSB0byBzZXQgb2YgbW9uaXRvcmFibGUgc2Vzc2lvbiBtYW5hZ2VyIGF0dHJpYnV0ZXMuIChsdWVoZSkKKyAgICAgIDwvYWRkPgorICAgICAgPGFkZD4KKyAgICAgICAgQWRkZWQgYXZlcmFnZSB0aW1lIGFuIGV4cGlyZWQgc2Vzc2lvbiBoYWQgYmVlbiBhbGl2ZSB0byBzZXQgb2YgbW9uaXRvcmFibGUgc2Vzc2lvbiBtYW5hZ2VyIGF0dHJpYnV0ZXMuIChsdWVoZSkKKyAgICAgIDwvYWRkPgorICAgICAgPGZpeD4KKyAgICAgICAgQ2xlYXIgYSByZWZlcmVuY2UgaW4gdGhlIGRpZ2VzdGVyIHdoZXJlIGEgY29udGV4dCB3b3VsZCBiZSByZWZlcmVuY2VkIGZvciBtb3JlIHRpbWUgdGhhbiBpdAorICAgICAgICBuZWVkZWQsIHVudGlsIHRoZSBuZXh0IGNvbnRleHQgZGVwbG95bWVudCBvcGVyYXRpb24uIChyZW1tKQorICAgICAgPC9maXg+CisgICAgPC9jaGFuZ2Vsb2c+CisgIDwvc3Vic2VjdGlvbj4KKworICA8c3Vic2VjdGlvbiBuYW1lPSJDb3lvdGUiPgorICAgIDxjaGFuZ2Vsb2c+CisgICAgICA8Zml4PgorICAgICAgICA8YnVnPjMxMDE4PC9idWc+OiBSYWNlIGNvbmRpdGlvbiBpbiBTeXN0ZW1Mb2dIYW5kbGVyLiAoeW9hdnMpCisgICAgICA8L2ZpeD4KKyAgICA8L2NoYW5nZWxvZz4KKyAgPC9zdWJzZWN0aW9uPgorCisgIDxzdWJzZWN0aW9uIG5hbWU9Ikphc3BlciI+CisgICAgPGNoYW5nZWxvZz4KKyAgICAgIDxmaXg+CisgICAgICAgIFVzZSB0aGUgImNvbXBpbGVyIiBwYXJhbWV0ZXIgdG8gYWxsb3cgc3BlY2lmeWluZyB0aGF0IEFudCBzaG91bGQgYmUgdXNlZC4gKHJlbW0pCisgICAgICA8L2ZpeD4KKyAgICAgIDxmaXg+CisgICAgICAgIElnbm9yZSBKRFQgY29tcGlsZXIgd2FybmluZ3MuIChyZW1tKQorICAgICAgPC9maXg+CisgICAgICA8YWRkPgorICAgICAgICBBZGRlZCBjb21waWxlclRhcmdldFZNIG9wdGlvbiBzdXBwb3J0LCAiMS40IiBkZWZhdWx0LiAoeW9hdnMpCisgICAgICA8L2FkZD4KKyAgICA8L2NoYW5nZWxvZz4KKyAgPC9zdWJzZWN0aW9uPgorCisgIDxzdWJzZWN0aW9uIG5hbWU9IkNsdXN0ZXIiPgorICAgIDxjaGFuZ2Vsb2c+CisgICAgICA8Zml4PgorICAgICAgICBGaXggYWRkaW5nIHRoZSBjbHVzdGVyaW5nIHZhbHZlLCBzbyB0aGF0IHNlc3Npb24gcmVwbGljYXRpb24gYWN0dWFsbHkgb2NjdXJzLiAoZmhhbmlrKQorICAgICAgPC9maXg+CisgICAgPC9jaGFuZ2Vsb2c+CisgIDwvc3Vic2VjdGlvbj4KKworICA8c3Vic2VjdGlvbiBuYW1lPSJXZWJhcHBzIj4KKyAgICA8Y2hhbmdlbG9nPgorICAgICAgPHVwZGF0ZT4KKyAgICAgICAgTWFqb3IgZG9jdW1lbnRhdGlvbiB1cGRhdGUgd2l0aCBjdXJyZW50IFRvbWNhdCA1LjUgY2hhbmdlcy4gKHJlbW0pCisgICAgICA8L3VwZGF0ZT4KKyAgICAgIDx1cGRhdGU+CisgICAgICAgIEFkZGVkIEphdmFTY3JpcHQgY29uZmlybWF0aW9uIGRpYWxvZyB0byAiZGFuZ2Vyb3VzIiBNYW5hZ2VyIHNlcnZsZXIgbGlua3MuICh5b2F2cykKKyAgICAgIDwvdXBkYXRlPgorICAgIDwvY2hhbmdlbG9nPgorICA8L3N1YnNlY3Rpb24+Cis8L3NlY3Rpb24+CisKKzxzZWN0aW9uIG5hbWU9IlRvbWNhdCA1LjUuMCAoeW9hdnMpIj4KKyAgPHN1YnNlY3Rpb24gbmFtZT0iR2VuZXJhbCI+CisgICAgPGNoYW5nZWxvZz4KKyAgICAgIDx1cGRhdGU+CisgICAgICAgIE1hbnkgdXBkYXRlZCBhbmQgZml4ZWQgSmF2YURvY3MuICh5b2F2cykKKyAgICAgIDwvdXBkYXRlPgorICAgICAgPHVwZGF0ZT4KKyAgICAgICAgRGVzaWduZWQgYW5kIHRlc3RlZCBUb21jYXQgb24gSjJTRSA1LjAgKGFrYSBKREsgMS41KS4gKGV2ZXJ5b25lKQorICAgICAgPC91cGRhdGU+CisgICAgICA8dXBkYXRlPgorICAgICAgICBCdW5kbGVkIEVjbGlwc2UgSkRUIChuZXcgZGVwZW5kZW5jeSkgdG8gYWxsb3cgVG9tY2F0IHRvIHJ1biBvbiBhIEpSRSBvbmx5LCBpLmUuIG5vIEpESyByZXF1aXJlZC4gKHJlbW0pCisgICAgICA8L3VwZGF0ZT4KKyAgICAgIDx1cGRhdGU+CisgICAgICAgIFJlcGFja2FnZSBjb21tb25zLWRiY3AgYW5kIGl0cyBkZXBlbmRlbmNpZXMgYXMgYSBzaWdsZSBzbWFsbGVyIFdBUiwgd2l0aCByZW5hbWVkIHBhY2thZ2VzLiAocmVtbSkKKyAgICAgIDwvdXBkYXRlPgorICAgICAgPHVwZGF0ZT4KKyAgICAgICAgUmVtb3ZlZCBkZXBlbmRlbmNpZXMgb24gY29tbW9ucy1kaWdlc3RlciwgY29tbW9ucy1iZWFudXRpbHMsIGFuZCBjb21tb25zLWNvbGxlY3Rpb25zLgorICAgICAgICBUaGUgcmVsZXZhbnQgZGlnZXN0ZXIgZnVuY3Rpb25hbGl0eSBpcyBub3cgbWVyZ2VkIGluIHRvbWNhdC11dGlsLiAocmVtbSkKKyAgICAgIDwvdXBkYXRlPgorICAgIDwvY2hhbmdlbG9nPgorICA8L3N1YnNlY3Rpb24+CisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iQ2F0YWxpbmEiPgorICAgIDxjaGFuZ2Vsb2c+CisgICAgICA8dXBkYXRlPgorICAgICAgICBSZW1vdmVkIHVzYWdlIG9mIG9yZy5hcGFjaGUuY2F0YWxpbmEuTG9nZ2VyLCBpbmNyZWFzZWQgdXNhZ2Ugb2YgY29tbW9ucy1sb2dnaW5nIGV2ZXJ5d2hlcmUuIChyZW1tKQorICAgICAgPC91cGRhdGU+CisgICAgICA8dXBkYXRlPgorICAgICAgICBSZWZhY3RvcmVkIGNsYXNzbG9hZGVyIGNvZGUgdG8gYmV0dGVyIGhhbmRsZSBKQVIgYW5kIGdlbmVyYWwgcmVzb3VyY2UgbG9ja2luZy4gKHJlbW0pCisgICAgICA8L3VwZGF0ZT4KKyAgICAgIDx1cGRhdGU+CisgICAgICAgIFdyaXR0ZW4gSk1YLXJlbGF0ZWQgY29kZSB0byBwbGF5IG5pY2VseSB3aXRoIEoyU0UgNS4wIGJ1aWx0LWluIEpNWCBhYmlsaXRpZXMuIChyZW1tLCBjb3N0aW4pCisgICAgICA8L3VwZGF0ZT4KKyAgICAgIDx1cGRhdGU+CisgICAgICAgIEV4dGVuc2l2ZWx5IHByb2ZpbGVkIGFuZCBvcHRpbWl6ZWQgdGhlIHNlcnZlciBzdGFydHVwIHBlcmZvcm1hbmNlIGFzIHdlbGwgYXMgdGhlIHJlcXVlc3QgbWFwcGluZyBhbmQgcHJvY2Vzc2luZyBwaXBlbGluZS4gKHJlbW0pCisgICAgICA8L3VwZGF0ZT4KKyAgICAgIDx1cGRhdGU+CisgICAgICAgIFRoZSBjb250YWluZXIgd2lsbCBub3cgYWx3YXlzIHByb2Nlc3MgYSAvTUVUQS1JTkYvY29udGV4dC54bWwgcmVzb3VyY2UsIHVubGVzcyB0aGUgd2ViYXBwIGhhcyBhIHNwZWNpZmllZCBleHRlcm5hbCBjb250ZXh0IGZpbGUuIChyZW1tKQorICAgICAgPC91cGRhdGU+CisgICAgICA8dXBkYXRlPgorICAgICAgICBOZXcgZGVmYXVsdCBjb25maWd1cmF0aW9uIG1lY2hhbmlzbSBmb3Igd2ViIGFwcGxpY2F0aW9ucywgcmVwbGFjaW5nIERlZmF1bHRDb250ZXh0LiBUaGlzIHVzZXMgYQorICAgICAgICBzaGFyZWQgY29udGV4dCBmaWxlIGxvY2F0ZWQgaW4gY29uZi9jb250ZXh0LnhtbC4gKHJlbW0pCisgICAgICA8L3VwZGF0ZT4KKyAgICAgIDx1cGRhdGU+CisgICAgICAgIFJldmFtcGVkIGRlcGxveWVyLCBhbGxveWluZyBmdWxsIGhvdGRlcGxveSAobm90ZTogb24gV2luZG93cywgdGhpcyByZXF1aXJlcyB0aGUgYW50aSBmaWxlIGxvY2tpbmcKKyAgICAgICAgZmVhdHVyZXMpLiAocmVtbSkKKyAgICAgIDwvdXBkYXRlPgorICAgICAgPHVwZGF0ZT4KKyAgICAgICAgUmVtb3ZlIHZlcmJvc2l0eSBmcm9tIHRoZSBKTkRJIHJlc291cmNlcyBjb25maWd1cmF0aW9uLCBieSBhbGxvd2luZyBhcmJpdHJhcnkgYXR0cmlidXRlcyBvbiB0aGUgUmVzb3VyY2UgZWxlbWVudC4gKHJlbW0pCisgICAgICA8L3VwZGF0ZT4KKyAgICAgIDx1cGRhdGU+CisgICAgICAgIFNpbXBsZXIgVmFsdmUgaW50ZXJmYWNlLCB0byBhbGxvdyBzbWFsbGVyIHN0YWNrIHRyYWNlcyBhbmQgcmVkdWNpbmcgdGhlIGFtb3VudCBvZiBtZXRob2QgY2FsbHMuIChyZW1tKQorICAgICAgPC91cGRhdGU+CisgICAgPC9jaGFuZ2Vsb2c+CisgIDwvc3Vic2VjdGlvbj4KKworICA8c3Vic2VjdGlvbiBuYW1lPSJDb3lvdGUiPgorICA8L3N1YnNlY3Rpb24+CisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iSmFzcGVyIj4KKyAgICA8Y2hhbmdlbG9nPgorICAgICAgPHVwZGF0ZT4KKyAgICAgICAgRWNsaXBzZSBKRFQgaXMgbm93IHRoZSBkZWZhdWx0IEphdmEgY29tcGlsZXIgaW4gSmFzcGVyLiBTb3VyY2UgZGVwZW5kZW5jaWVzIGFyZSBub3cgbG9hZGVkIGZyb20KKyAgICAgICAgdGhlIGNvbnRhaW5lciBjbGFzc2xvYWRlciwgYW5kIGNvbXBpbGF0aW9uIHRpbWVzIGFyZSBtdWNoIGZhc3Rlci4gKHJlbW0pCisgICAgICA8L3VwZGF0ZT4KKyAgICAgIDx1cGRhdGU+CisgICAgICAgIEphc3BlciBkZXZlbG9wbWVudCBtb2RlIHNob3VsZCBub3cgaGF2ZSBhY2NlcHRhYmxlIHBlcmZvcm1hbmNlIGZvciBoZWF2aWx5IGFjY2Vzc2VkIHBhZ2VzLgorICAgICAgICBQcmVjb21waWxpbmcgSlNQcyBpcyBzdGlsbCBzaWduaWZpY2FudGx5IG1vcmUgZWZmaWNpZW50LCBob3dldmVyLiAocmVtbSkKKyAgICAgIDwvdXBkYXRlPgorICAgIDwvY2hhbmdlbG9nPgorICA8L3N1YnNlY3Rpb24+CisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iQ2x1c3RlciI+CisgIDwvc3Vic2VjdGlvbj4KKworICA8c3Vic2VjdGlvbiBuYW1lPSJXZWJhcHBzIj4KKyAgICA8Y2hhbmdlbG9nPgorICAgIDwvY2hhbmdlbG9nPgorICA8L3N1YnNlY3Rpb24+Cis8L3NlY3Rpb24+CisKKzwvYm9keT4KKzwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9kb2NzL2NsYXNzLWxvYWRlci1ob3d0by54bWwgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2NsYXNzLWxvYWRlci1ob3d0by54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJiZTE4OAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvY2xhc3MtbG9hZGVyLWhvd3RvLnhtbApAQCAtMCwwICsxLDI4MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IURPQ1RZUEUgZG9jdW1lbnQgWworICA8IUVOVElUWSBwcm9qZWN0IFNZU1RFTSAicHJvamVjdC54bWwiPgorXT4KKzxkb2N1bWVudCB1cmw9ImNsYXNzLWxvYWRlci1ob3d0by5odG1sIj4KKworICAgICZwcm9qZWN0OworCisgICAgPHByb3BlcnRpZXM+CisgICAgICAgIDxhdXRob3IgZW1haWw9ImNyYWlnbWNjQGFwYWNoZS5vcmciPkNyYWlnIFIuIE1jQ2xhbmFoYW48L2F1dGhvcj4KKyAgICAgICAgPGF1dGhvciBlbWFpbD0ieW9hdnNAYXBhY2hlLm9yZyI+WW9hdiBTaGFwaXJhPC9hdXRob3I+CisgICAgICAgIDx0aXRsZT5DbGFzcyBMb2FkZXIgSE9XLVRPPC90aXRsZT4KKyAgICA8L3Byb3BlcnRpZXM+CisKKzxib2R5PgorCisKKzxzZWN0aW9uIG5hbWU9IlF1aWNrIFN0YXJ0Ij4KKworPHA+VGhlIGZvbGxvd2luZyBydWxlcyBjb3ZlciBhYm91dCA5NSUgb2YgdGhlIGRlY2lzaW9ucyB0aGF0IGFwcGxpY2F0aW9uCitkZXZlbG9wZXJzIGFuZCBkZXBsb3llcnMgbXVzdCBtYWtlIGFib3V0IHdoZXJlIHRvIHBsYWNlIGNsYXNzIGFuZCByZXNvdXJjZQorZmlsZXMgdG8gbWFrZSB0aGVtIGF2YWlsYWJsZSB0byB3ZWIgYXBwbGljYXRpb25zOjwvcD4KKzx1bD4KKzxsaT5Gb3IgY2xhc3NlcyBhbmQgcmVzb3VyY2VzIHNwZWNpZmljIHRvIGEgcGFydGljdWxhciB3ZWIgYXBwbGljYXRpb24sCisgICAgcGxhY2UgdW5wYWNrZWQgY2xhc3NlcyBhbmQgcmVzb3VyY2VzIHVuZGVyIDxjb2RlPi9XRUItSU5GL2NsYXNzZXM8L2NvZGU+CisgICAgb2YgeW91ciB3ZWIgYXBwbGljYXRpb24gYXJjaGl2ZSwgb3IgcGxhY2UgSkFSIGZpbGVzIGNvbnRhaW5pbmcgdGhvc2UKKyAgICBjbGFzc2VzIGFuZCByZXNvdXJjZXMgdW5kZXIgPGNvZGU+L1dFQi1JTkYvbGliPC9jb2RlPiBvZiB5b3VyIHdlYgorICAgIGFwcGxpY2F0aW9uIGFyY2hpdmUuPC9saT4KKzxsaT5Gb3IgY2xhc3NlcyBhbmQgcmVzb3VyY2VzIHRoYXQgbXVzdCBiZSBzaGFyZWQgYWNyb3NzIGFsbCB3ZWIgYXBwbGljYXRpb25zLAorICAgIHBsYWNlIHVucGFja2VkIGNsYXNzZXMgYW5kIHJlc291cmNlcyB1bmRlcgorICAgIDxjb2RlPiRDQVRBTElOQV9CQVNFL3NoYXJlZC9jbGFzc2VzPC9jb2RlPiwgb3IgcGxhY2UgSkFSIGZpbGVzCisgICAgY29udGFpbmluZyB0aG9zZSBjbGFzc2VzIGFuZCByZXNvdXJjZXMgdW5kZXIKKyAgICA8Y29kZT4kQ0FUQUxJTkFfQkFTRS9zaGFyZWQvbGliPC9jb2RlPi48L2xpPgorPC91bD4KKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9Ik92ZXJ2aWV3Ij4KKworPHA+TGlrZSBtYW55IHNlcnZlciBhcHBsaWNhdGlvbnMsIFRvbWNhdCA1IGluc3RhbGxzIGEgdmFyaWV0eSBvZiBjbGFzcyBsb2FkZXJzCisodGhhdCBpcywgY2xhc3NlcyB0aGF0IGltcGxlbWVudCA8Y29kZT5qYXZhLmxhbmcuQ2xhc3NMb2FkZXI8L2NvZGU+KSB0byBhbGxvdworZGlmZmVyZW50IHBvcnRpb25zIG9mIHRoZSBjb250YWluZXIsIGFuZCB0aGUgd2ViIGFwcGxpY2F0aW9ucyBydW5uaW5nIG9uIHRoZQorY29udGFpbmVyLCB0byBoYXZlIGFjY2VzcyB0byBkaWZmZXJlbnQgcmVwb3NpdG9yaWVzIG9mIGF2YWlsYWJsZSBjbGFzc2VzIGFuZAorcmVzb3VyY2VzLiAgVGhpcyBtZWNoYW5pc20gaXMgdXNlZCB0byBwcm92aWRlIHRoZSBmdW5jdGlvbmFsaXR5IGRlZmluZWQgaW4gdGhlCitTZXJ2bGV0IFNwZWNpZmljYXRpb24sIHZlcnNpb24gMi40IC0tIGluIHBhcnRpY3VsYXIsIFNlY3Rpb25zIDkuNCBhbmQgOS42LjwvcD4KKworPHA+SW4gYSBKMlNFIDIgKHRoYXQgaXMsIEoyU0UgMS4yIG9yIGxhdGVyKSBlbnZpcm9ubWVudCwgY2xhc3MgbG9hZGVycyBhcmUKK2FycmFuZ2VkIGluIGEgcGFyZW50LWNoaWxkIHRyZWUuICBOb3JtYWxseSwgd2hlbiBhIGNsYXNzIGxvYWRlciBpcyBhc2tlZCB0bworbG9hZCBhIHBhcnRpY3VsYXIgY2xhc3Mgb3IgcmVzb3VyY2UsIGl0IGRlbGVnYXRlcyB0aGUgcmVxdWVzdCB0byBhIHBhcmVudAorY2xhc3MgbG9hZGVyIGZpcnN0LCBhbmQgdGhlbiBsb29rcyBpbiBpdHMgb3duIHJlcG9zaXRvcmllcyBvbmx5IGlmIHRoZSBwYXJlbnQKK2NsYXNzIGxvYWRlcihzKSBjYW5ub3QgZmluZCB0aGUgcmVxdWVzdGVkIGNsYXNzIG9yIHJlc291cmNlLiAgVGhlIG1vZGVsIGZvcgord2ViIGFwcGxpY2F0aW9uIGNsYXNzIGxvYWRlcnMgZGlmZmVycyBzbGlnaHRseSBmcm9tIHRoaXMsIGFzIGRpc2N1c3NlZCBiZWxvdywKK2J1dCB0aGUgbWFpbiBwcmluY2lwbGVzIGFyZSB0aGUgc2FtZS48L3A+CisKKzxwPldoZW4gVG9tY2F0IDUgaXMgc3RhcnRlZCwgaXQgY3JlYXRlcyBhIHNldCBvZiBjbGFzcyBsb2FkZXJzIHRoYXQgYXJlCitvcmdhbml6ZWQgaW50byB0aGUgZm9sbG93aW5nIHBhcmVudC1jaGlsZCByZWxhdGlvbnNoaXBzLCB3aGVyZSB0aGUgcGFyZW50CitjbGFzcyBsb2FkZXIgaXMgYWJvdmUgdGhlIGNoaWxkIGNsYXNzIGxvYWRlcjo8L3A+CisKKzxzb3VyY2U+CisgICAgICBCb290c3RyYXAKKyAgICAgICAgICB8CisgICAgICAgU3lzdGVtCisgICAgICAgICAgfAorICAgICAgIENvbW1vbgorICAgICAgLyAgICAgIFwKKyBDYXRhbGluYSAgIFNoYXJlZAorICAgICAgICAgICAgIC8gICBcCisgICAgICAgIFdlYmFwcDEgIFdlYmFwcDIgLi4uIAorPC9zb3VyY2U+CisKKzxwPlRoZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgZWFjaCBvZiB0aGVzZSBjbGFzcyBsb2FkZXJzLCBpbmNsdWRpbmcgdGhlIHNvdXJjZQorb2YgY2xhc3NlcyBhbmQgcmVzb3VyY2VzIHRoYXQgdGhleSBtYWtlIHZpc2libGUsIGFyZSBkaXNjdXNzZWQgaW4gZGV0YWlsIGluCit0aGUgZm9sbG93aW5nIHNlY3Rpb24uPC9wPgorCis8L3NlY3Rpb24+CisKKzxzZWN0aW9uIG5hbWU9IkNsYXNzIExvYWRlciBEZWZpbml0aW9ucyI+CisKKzxwPkFzIGluZGljYXRlZCBpbiB0aGUgZGlhZ3JhbSBhYm92ZSwgVG9tY2F0IDUgY3JlYXRlcyB0aGUgZm9sbG93aW5nIGNsYXNzCitsb2FkZXJzIGFzIGl0IGlzIGluaXRpYWxpemVkOjwvcD4KKzx1bD4KKzxsaT48c3Ryb25nPkJvb3RzdHJhcDwvc3Ryb25nPiAtIFRoaXMgY2xhc3MgbG9hZGVyIGNvbnRhaW5zIHRoZSBiYXNpYyBydW50aW1lCisgICAgY2xhc3NlcyBwcm92aWRlZCBieSB0aGUgSmF2YSBWaXJ0dWFsIE1hY2hpbmUsIHBsdXMgYW55IGNsYXNzZXMgZnJvbSBKQVIKKyAgICBmaWxlcyBwcmVzZW50IGluIHRoZSBTeXN0ZW0gRXh0ZW5zaW9ucyBkaXJlY3RvcnkKKyAgICAoPGNvZGU+JEpBVkFfSE9NRS9qcmUvbGliL2V4dDwvY29kZT4pLiAgPGVtPk5PVEU8L2VtPiAtIFNvbWUgSlZNcyBtYXkKKyAgICBpbXBsZW1lbnQgdGhpcyBhcyBtb3JlIHRoYW4gb25lIGNsYXNzIGxvYWRlciwgb3IgaXQgbWF5IG5vdCBiZSB2aXNpYmxlCisgICAgKGFzIGEgY2xhc3MgbG9hZGVyKSBhdCBhbGwuPC9saT4KKzxsaT48c3Ryb25nPlN5c3RlbTwvc3Ryb25nPiAtIFRoaXMgY2xhc3MgbG9hZGVyIGlzIG5vcm1hbGx5IGluaXRpYWxpemVkIGZyb20KKyAgICB0aGUgY29udGVudHMgb2YgdGhlIDxjb2RlPkNMQVNTUEFUSDwvY29kZT4gZW52aXJvbm1lbnQgdmFyaWFibGUuICBBbGwgc3VjaAorICAgIGNsYXNzZXMgYXJlIHZpc2libGUgdG8gYm90aCBUb21jYXQgaW50ZXJuYWwgY2xhc3NlcywgYW5kIHRvIHdlYgorICAgIGFwcGxpY2F0aW9ucy4gIEhvd2V2ZXIsIHRoZSBzdGFuZGFyZCBUb21jYXQgNSBzdGFydHVwIHNjcmlwdHMKKyAgICAoPGNvZGU+JENBVEFMSU5BX0hPTUUvYmluL2NhdGFsaW5hLnNoPC9jb2RlPiBvcgorICAgIDxjb2RlPiVDQVRBTElOQV9IT01FJVxiaW5cY2F0YWxpbmEuYmF0PC9jb2RlPikgdG90YWxseSBpZ25vcmUgdGhlIGNvbnRlbnRzCisgICAgb2YgdGhlIDxjb2RlPkNMQVNTUEFUSDwvY29kZT4gZW52aXJvbm1lbnQgdmFyaWFibGUgaXRzZWxmLCBhbmQgaW5zdGVhZAorICAgIGJ1aWxkIHRoZSBTeXN0ZW0gY2xhc3MgbG9hZGVyIGZyb20gdGhlIGZvbGxvd2luZyByZXBvc2l0b3JpZXM6CisgICAgPHVsPgorICAgIDxsaT48ZW0+JENBVEFMSU5BX0hPTUUvYmluL2Jvb3RzdHJhcC5qYXI8L2VtPiAtIENvbnRhaW5zIHRoZSBtYWluKCkgbWV0aG9kCisgICAgICAgIHRoYXQgaXMgdXNlZCB0byBpbml0aWFsaXplIHRoZSBUb21jYXQgNSBzZXJ2ZXIsIGFuZCB0aGUgY2xhc3MgbG9hZGVyCisgICAgICAgIGltcGxlbWVudGF0aW9uIGNsYXNzZXMgaXQgZGVwZW5kcyBvbi48L2xpPgorICAgIDxsaT48ZW0+JEpBVkFfSE9NRS9saWIvdG9vbHMuamFyPC9lbT4gLSBDb250YWlucyB0aGUgImphdmFjIiBjb21waWxlciB1c2VkCisgICAgICAgIHRvIGNvbnZlcnQgSlNQIHBhZ2VzIGludG8gc2VydmxldCBjbGFzc2VzLjwvbGk+CisgICAgPGxpPjxlbT4kQ0FUQUxJTkFfSE9NRS9iaW4vY29tbW9ucy1sb2dnaW5nLWFwaS5qYXI8L2VtPiAtIEpha2FydGEgY29tbW9ucyAKKyAgICAgICAgbG9nZ2luZyBBUEkuPC9saT4KKyAgICA8bGk+PGVtPiRDQVRBTElOQV9IT01FL2Jpbi9jb21tb25zLWRhZW1vbi5qYXI8L2VtPiAtIEpha2FydGEgY29tbW9ucyAKKyAgICAgICAgZGFlbW9uIEFQSS48L2xpPgorICAgIDxsaT48ZW0+am14LmphcjwvZW0+IC0gVGhlIEpNWCAxLjIgaW1wbGVtZW50YXRpb24uPC9saT4KKyAgICA8L3VsPjwvbGk+Cis8bGk+PHN0cm9uZz5Db21tb248L3N0cm9uZz4gLSBUaGlzIGNsYXNzIGxvYWRlciBjb250YWlucyBhZGRpdGlvbmFsIGNsYXNzZXMKKyAgICB0aGF0IGFyZSBtYWRlIHZpc2libGUgdG8gYm90aCBUb21jYXQgaW50ZXJuYWwgY2xhc3NlcyBhbmQgdG8gYWxsIHdlYgorICAgIGFwcGxpY2F0aW9ucy4gIE5vcm1hbGx5LCBhcHBsaWNhdGlvbiBjbGFzc2VzIHNob3VsZCA8c3Ryb25nPk5PVDwvc3Ryb25nPgorICAgIGJlIHBsYWNlZCBoZXJlLiAgQWxsIHVucGFja2VkIGNsYXNzZXMgYW5kIHJlc291cmNlcyBpbgorICAgIDxjb2RlPiRDQVRBTElOQV9IT01FL2NvbW1vbi9jbGFzc2VzPC9jb2RlPiwgYXMgd2VsbCBhcyBjbGFzc2VzIGFuZAorICAgIHJlc291cmNlcyBpbiBKQVIgZmlsZXMgdW5kZXIgdGhlCisgICAgPGNvZGU+JENBVEFMSU5BX0hPTUUvY29tbW9ucy9lbmRvcnNlZDwvY29kZT4sCisgICAgPGNvZGU+JENBVEFMSU5BX0hPTUUvY29tbW9ucy9pMThuPC9jb2RlPiBhbmQKKyAgICA8Y29kZT4kQ0FUQUxJTkFfSE9NRS9jb21tb24vbGliPC9jb2RlPiBkaXJlY3RvcmllcywKKyAgICBhcmUgbWFkZSB2aXNpYmxlIHRocm91Z2ggdGhpcworICAgIGNsYXNzIGxvYWRlci4gIEJ5IGRlZmF1bHQsIHRoYXQgaW5jbHVkZXMgdGhlIGZvbGxvd2luZzoKKyAgICA8dWw+CisgICAgPGxpPjxlbT5jb21tb25zLWVsLmphcjwvZW0+IC0gSmFrYXJ0YSBjb21tb25zIGVsLCBpbXBsZW1lbnRpbmcgdGhlIAorICAgICAgICBleHByZXNzaW9uIGxhbmd1YWdlIHVzZWQgYnkgSmFzcGVyLjwvbGk+CisgICAgPGxpPjxlbT5qYXNwZXItY29tcGlsZXIuamFyPC9lbT4gLSBUaGUgSlNQIDIuMCBjb21waWxlci48L2xpPgorICAgIDxsaT48ZW0+amFzcGVyLWNvbXBpbGVyLWpkdC5qYXI8L2VtPiAtIFRoZSBFY2xpcHNlIEpEVCBKYXZhIGNvbXBpbGVyLjwvbGk+CisgICAgPGxpPjxlbT5qYXNwZXItcnVudGltZS5qYXI8L2VtPiAtIFRoZSBKU1AgMi4wIHJ1bnRpbWUuPC9saT4KKyAgICA8bGk+PGVtPmpzcC1hcGkuamFyPC9lbT4gLSBUaGUgSlNQIDIuMCBBUEkuPC9saT4KKyAgICA8bGk+PGVtPm5hbWluZy1jb21tb24uamFyPC9lbT4gLSBUaGUgSk5ESSBpbXBsZW1lbnRhdGlvbiB1c2VkIGJ5IFRvbWNhdCA1CisgICAgICAgIHRvIHJlcHJlc2VudCBpbi1tZW1vcnkgbmFtaW5nIGNvbnRleHRzLjwvbGk+CisgICAgPGxpPjxlbT5uYW1pbmctZmFjdG9yeS5qYXI8L2VtPiAtIFRoZSBKTkRJIGltcGxlbWVudGF0aW9uIHVzZWQgYnkgVG9tY2F0IDUKKyAgICAgICAgdG8gcmVzb2x2ZSByZWZlcmVuY2VzIHRvIGVudGVycHJpc2UgcmVzb3VyY2VzIChFSkIsIGNvbm5lY3Rpb24gCisgICAgICAgIHBvb2xzKS48L2xpPgorICAgIDxsaT48ZW0+bmFtaW5nLWZhY3RvcnktZGJjcC5qYXI8L2VtPiAtIEpha2FydGEgY29tbW9ucyBEQkNQLCBwcm92aWRpbmcgYQorICAgICAgICBKREJDIGNvbm5lY3Rpb24gcG9vbCB0byB3ZWIgYXBwbGljYXRpb25zLiBUaGUgY2xhc3NlcyBoYXZlIGJlZW4gbW92ZWQKKyAgICAgICAgb3V0IG9mIHRoZWlyIGRlZmF1bHQgb3JnLmFwYWNoZS5jb21tb25zIHBhY2thZ2UuPC9saT4KKyAgICA8bGk+PGVtPm5hbWluZy1qYXZhLmphcjwvZW0+IC0gSGFuZGxlciBmb3IgdGhlIGphdmE6IG5hbWVzcGFjZS48L2xpPgorICAgIDxsaT48ZW0+bmFtaW5nLXJlc291cmNlcy5qYXI8L2VtPiAtIFRoZSBzcGVjaWFsaXplZCBKTkRJIG5hbWluZyBjb250ZXh0CisgICAgICAgIGltcGxlbWVudGF0aW9uIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBzdGF0aWMgcmVzb3VyY2VzIG9mIGEgd2ViCisgICAgICAgIGFwcGxpY2F0aW9uLiBUaGlzIGlzIG5vdCByZWxhdGVkIHRvIHRoZSBzdXBwb3J0IG9mIHRoZSBKMkVFIEVOQywgYW5kCisgICAgICAgIGNhbm5vdCBiZSByZW1vdmVkLjwvbGk+CisgICAgPGxpPjxlbT5zZXJ2bGV0LWFwaS5qYXI8L2VtPiAtIFRoZSBTZXJ2bGV0IDIuNCBBUEkuPC9saT4KKyAgICA8bGk+PGVtPnRvbWNhdC1pMThuLSoqLmphcjwvZW0+IC0gT3B0aW9uYWwgSkFScyBjb250YWluaW5nIHJlc291cmNlIGJ1bmRsZXMKKyAgICAgICAgZm9yIG90aGVyIGxhbmd1YWdlcy4gQXMgZGVmYXVsdCBidW5kbGVzIGFyZSBhbHNvIGluY2x1ZGVkIGluIGVhY2ggCisgICAgICAgIGluZGl2aWR1YWwgSkFSLCB0aGV5IGNhbiBiZSBzYWZlbHkgcmVtb3ZlZCBpZiBubyBpbnRlcm5hdGlvbmFsaXphdGlvbgorICAgICAgICBvZiBtZXNzYWdlcyBpcyBuZWVkZWQuPC9saT4KKyAgICA8L3VsPjwvbGk+Cis8bGk+PHN0cm9uZz5DYXRhbGluYTwvc3Ryb25nPiAtIFRoaXMgY2xhc3MgbG9hZGVyIGlzIGluaXRpYWxpemVkIHRvIGluY2x1ZGUKKyAgICBhbGwgY2xhc3NlcyBhbmQgcmVzb3VyY2VzIHJlcXVpcmVkIHRvIGltcGxlbWVudCBUb21jYXQgNSBpdHNlbGYuICBUaGVzZQorICAgIGNsYXNzZXMgYW5kIHJlc291cmNlcyBhcmUgPHN0cm9uZz5UT1RBTExZPC9zdHJvbmc+IGludmlzaWJsZSB0byB3ZWIKKyAgICBhcHBsaWNhdGlvbnMuICBBbGwgdW5wYWNrZWQgY2xhc3NlcyBhbmQgcmVzb3VyY2VzIGluCisgICAgPGNvZGU+JENBVEFMSU5BX0hPTUUvc2VydmVyL2NsYXNzZXM8L2NvZGU+LCBhcyB3ZWxsIGFzIGNsYXNzZXMgYW5kCisgICAgcmVzb3VyY2VzIGluIEpBUiBmaWxlcyB1bmRlcgorICAgIDxjb2RlPiRDQVRBTElOQV9IT01FL3NlcnZlci9saWI8L2NvZGU+LCBhcmUgbWFkZSB2aXNpYmxlIHRocm91Z2gKKyAgICB0aGlzIGNsYXNzIGxvYWRlci4gIEJ5IGRlZmF1bHQsIHRoYXQgaW5jbHVkZXMgdGhlIGZvbGxvd2luZzoKKyAgICA8dWw+CisgICAgPGxpPjxlbT5jYXRhbGluYS5qYXI8L2VtPiAtIEltcGxlbWVudGF0aW9uIG9mIHRoZSBDYXRhbGluYSBzZXJ2bGV0CisgICAgICAgIGNvbnRhaW5lciBwb3J0aW9uIG9mIFRvbWNhdCA1LjwvbGk+CisgICAgPGxpPjxlbT5jYXRhbGluYS1hbnQuamFyPC9lbT4gLSBTb21lIEFudCB0YXNrcyB3aGljaCBjYW4gYmUgdXNlZCB0bworICAgICAgICBtYW5hZ2UgVG9tY2F0IHVzaW5nIHRoZSBtYW5hZ2VyIHdlYiBhcHBsaWNhdGlvbi48L2xpPgorICAgIDxsaT48ZW0+Y2F0YWxpbmEtb3B0aW9uYWwuamFyPC9lbT4gLSBTb21lIG9wdGlvbmFsIGNvbXBvbmVudHMgb2YKKyAgICAgICAgQ2F0YWxpbmEuPC9saT4KKyAgICA8bGk+PGVtPmNvbW1vbnMtbW9kZWxlci5qYXI8L2VtPiAtIEEgbW9kZWwgTUJlYW5zIGltcGxlbWVudGF0aW9uIHVzZWQKKyAgICAgICAgYnkgVG9tY2F0IHRvIGV4cG9zZSBpdHMgaW50ZXJuYWwgb2JqZWN0cyB0aHJvdWdoIEpNWC48L2xpPgorICAgIDxsaT48ZW0+c2VydmxldHMteHh4eHguamFyPC9lbT4gLSBUaGUgY2xhc3NlcyBhc3NvY2lhdGVkIHdpdGggZWFjaAorICAgICAgICBpbnRlcm5hbCBzZXJ2bGV0IHRoYXQgcHJvdmlkZXMgcGFydCBvZiBUb21jYXQncyBmdW5jdGlvbmFsaXR5LgorICAgICAgICBUaGVzZSBhcmUgc2VwYXJhdGVkIHNvIHRoYXQgdGhleSBjYW4gYmUgY29tcGxldGVseSByZW1vdmVkIGlmIHRoZQorICAgICAgICBjb3JyZXNwb25kaW5nIHNlcnZpY2UgaXMgbm90IHJlcXVpcmVkLCBvciB0aGV5IGNhbiBiZSBzdWJqZWN0IHRvCisgICAgICAgIHNwZWNpYWxpemVkIHNlY3VyaXR5IG1hbmFnZXIgcGVybWlzc2lvbnMuPC9saT4KKyAgICA8bGk+PGVtPnRvbWNhdC1jb3lvdGUuamFyPC9lbT4gLSBDb3lvdGUgQVBJLjwvbGk+CisgICAgPGxpPjxlbT50b21jYXQtaHR0cC5qYXI8L2VtPiAtIFN0YW5kYWxvbmUgSmF2YSBIVFRQLzEuMSAKKyAgICAgICAgY29ubmVjdG9yLjwvbGk+CisgICAgPGxpPjxlbT50b21jYXQtYWpwLmphcjwvZW0+IC0gQ2xhc3NlcyBmb3IgdGhlIEphdmEgcG9ydGlvbiBvZiB0aGUKKyAgICAgICAgPGNvZGU+QUpQPC9jb2RlPiB3ZWIgc2VydmVyIGNvbm5lY3Rvciwgd2hpY2ggYWxsb3dzIFRvbWNhdCB0bworICAgICAgICBydW4gYmVoaW5kIHdlYiBzZXJ2ZXJzIHN1Y2ggYXMgQXBhY2hlIGFuZCBpUGxhbmV0IGlBUyBhbmQgaVdTLjwvbGk+CisgICAgPGxpPjxlbT50b21jYXQtdXRpbC5qYXI8L2VtPiAtIFV0aWxpdHkgY2xhc3NlcyByZXF1aXJlZCBieSBzb21lCisgICAgICAgIFRvbWNhdCBjb25uZWN0b3JzLjwvbGk+CisgICAgPC91bD48L2xpPgorPGxpPjxzdHJvbmc+U2hhcmVkPC9zdHJvbmc+IC0gVGhpcyBjbGFzcyBsb2FkZXIgaXMgdGhlIHBsYWNlIHRvIHB1dCBjbGFzc2VzCisgICAgYW5kIHJlc291cmNlcyB0aGF0IHlvdSB3aXNoIHRvIHNoYXJlIGFjcm9zcyA8c3Ryb25nPkFMTDwvc3Ryb25nPgorICAgIHdlYiBhcHBsaWNhdGlvbnMgKHVubGVzcyBUb21jYXQgaW50ZXJuYWwgY2xhc3NlcyBhbHNvIG5lZWQgYWNjZXNzLAorICAgIGluIHdoaWNoIGNhc2UgeW91IHNob3VsZCBwdXQgdGhlbSBpbiB0aGUgPHN0cm9uZz5Db21tb248L3N0cm9uZz4KKyAgICBjbGFzcyBsb2FkZXIgaW5zdGVhZCkuICBBbGwgdW5wYWNrZWQgY2xhc3NlcyBhbmQgcmVzb3VyY2VzIGluCisgICAgPGNvZGU+JENBVEFMSU5BX0JBU0Uvc2hhcmVkL2NsYXNzZXM8L2NvZGU+LCBhcyB3ZWxsIGFzIGNsYXNzZXMgYW5kCisgICAgcmVzb3VyY2VzIGluIEpBUiBmaWxlcyB1bmRlciA8Y29kZT4kQ0FUQUxJTkFfQkFTRS9zaGFyZWQvbGliPC9jb2RlPiwgYXJlCisgICAgbWFkZSB2aXNpYmxlIHRocm91Z2ggdGhpcyBjbGFzcyBsb2FkZXIuIElmIG11bHRpcGxlIFRvbWNhdCBpbnN0YW5jZXMgYXJlCisgICAgcnVuIGZyb20gdGhlIHNhbWUgYmluYXJ5IHVzaW5nIHRoZSAkQ0FUQUxJTkFfQkFTRSBlbnZpcm9ubWVudCB2YXJpYWJsZSwKKyAgICB0aGVuIHRoaXMgY2xhc3Nsb2FkZXIgcmVwb3NpdG9yaWVzIGFyZSByZWxhdGl2ZSB0byAkQ0FUQUxJTkFfQkFTRSByYXRoZXIKKyAgICB0aGFuICRDQVRBTElOQV9IT01FLjwvbGk+Cis8bGk+PHN0cm9uZz5XZWJhcHBYPC9zdHJvbmc+IC0gQSBjbGFzcyBsb2FkZXIgaXMgY3JlYXRlZCBmb3IgZWFjaCB3ZWIKKyAgICBhcHBsaWNhdGlvbiB0aGF0IGlzIGRlcGxveWVkIGluIGEgc2luZ2xlIFRvbWNhdCA1IGluc3RhbmNlLiAgQWxsIHVucGFja2VkCisgICAgY2xhc3NlcyBhbmQgcmVzb3VyY2VzIGluIHRoZSA8Y29kZT4vV0VCLUlORi9jbGFzc2VzPC9jb2RlPiBkaXJlY3Rvcnkgb2YKKyAgICB5b3VyIHdlYiBhcHBsaWNhdGlvbiBhcmNoaXZlLCBwbHVzIGNsYXNzZXMgYW5kIHJlc291cmNlcyBpbiBKQVIgZmlsZXMKKyAgICB1bmRlciB0aGUgPGNvZGU+L1dFQi1JTkYvbGliPC9jb2RlPiBkaXJlY3Rvcnkgb2YgeW91ciB3ZWIgYXBwbGljYXRpb24KKyAgICBhcmNoaXZlLCBhcmUgbWFkZSB2aXNpYmxlIHRvIHRoZSBjb250YWluaW5nIHdlYiBhcHBsaWNhdGlvbiwgYnV0IHRvCisgICAgbm8gb3RoZXJzLjwvbGk+Cis8L3VsPgorCis8cD5BcyBtZW50aW9uZWQgYWJvdmUsIHRoZSB3ZWIgYXBwbGljYXRpb24gY2xhc3MgbG9hZGVyIGRpdmVyZ2VzIGZyb20gdGhlCitkZWZhdWx0IEphdmEgMiBkZWxlZ2F0aW9uIG1vZGVsIChpbiBhY2NvcmRhbmNlIHdpdGggdGhlIHJlY29tbWVuZGF0aW9ucyBpbiB0aGUKK1NlcnZsZXQgU3BlY2lmaWNhdGlvbiwgdmVyc2lvbiAyLjMsIHNlY3Rpb24gOS43LjIgV2ViIEFwcGxpY2F0aW9uIENsYXNzbG9hZGVyKS4gIAorV2hlbiBhIHJlcXVlc3QgdG8gbG9hZCBhCitjbGFzcyBmcm9tIHRoZSB3ZWIgYXBwbGljYXRpb24ncyA8ZW0+V2ViYXBwWDwvZW0+IGNsYXNzIGxvYWRlciBpcyBwcm9jZXNzZWQsCit0aGlzIGNsYXNzIGxvYWRlciB3aWxsIGxvb2sgaW4gdGhlIGxvY2FsIHJlcG9zaXRvcmllcyA8c3Ryb25nPmZpcnN0PC9zdHJvbmc+LAoraW5zdGVhZCBvZiBkZWxlZ2F0aW5nIGJlZm9yZSBsb29raW5nLiAgVGhlcmUgYXJlIGV4Y2VwdGlvbnMuIENsYXNzZXMgd2hpY2ggYXJlCitwYXJ0IG9mIHRoZSBKUkUgYmFzZSBjbGFzc2VzIGNhbm5vdCBiZSBvdmVycmlkZW4uIEZvciBzb21lIGNsYXNzZXMgKHN1Y2ggYXMKK3RoZSBYTUwgcGFyc2VyIGNvbXBvbmVudHMgaW4gSjJTRSAxLjQrKSwgdGhlIEoyU0UgMS40IGVuZG9yc2VkIGZlYXR1cmUgY2FuIGJlIAordXNlZCAgCisoc2VlIHRoZSBjb21tb24gY2xhc3Nsb2FkZXIgZGVmaW5pdGlvbiBhYm92ZSkuIEluIGFkZGl0aW9uLCBmb3IgdGhlIGZvbGxvd2luZworY2xhc3MgcGF0dGVybnMsIHRoZSBjbGFzc2xvYWRlciB3aWxsIGFsd2F5cyBkZWxlZ2F0ZSBmaXJzdCAKKyhhbmQgbG9hZCB0aGUgY2xhc3MgaXRzZWxmIGlmIG5vIHBhcmVudCBjbGFzc2xvYWRlciBsb2FkcyBpdCk6Cis8dWw+Cis8bGk+PGVtPmphdmF4Lio8L2VtPjwvbGk+Cis8bGk+PGVtPm9yZy54bWwuc2F4Lio8L2VtPjwvbGk+Cis8bGk+PGVtPm9yZy53M2MuZG9tLio8L2VtPjwvbGk+Cis8bGk+PGVtPm9yZy5hcGFjaGUueGVyY2VzLio8L2VtPjwvbGk+Cis8bGk+PGVtPm9yZy5hcGFjaGUueGFsYW4uKjwvZW0+PC9saT4KKzwvdWw+CitMYXN0LCBhbnkgSkFSIGNvbnRhaW5pbmcgc2VydmxldCBBUEkgY2xhc3NlcyB3aWxsIGJlIGlnbm9yZWQgYnkgdGhlIAorY2xhc3Nsb2FkZXIuCitBbGwgb3RoZXIgY2xhc3MgbG9hZGVycyBpbiBUb21jYXQgNSBmb2xsb3cgdGhlIHVzdWFsIGRlbGVnYXRpb24gcGF0dGVybi48L3A+CisKKzxwPlRoZXJlZm9yZSwgZnJvbSB0aGUgcGVyc3BlY3RpdmUgb2YgYSB3ZWIgYXBwbGljYXRpb24sIGNsYXNzIG9yIHJlc291cmNlCitsb2FkaW5nIGxvb2tzIGluIHRoZSBmb2xsb3dpbmcgcmVwb3NpdG9yaWVzLCBpbiB0aGlzIG9yZGVyOjwvcD4KKzx1bD4KKzxsaT5Cb290c3RyYXAgY2xhc3NlcyBvZiB5b3VyIEpWTTwvbGk+Cis8bGk+U3lzdGVtIGNsYXNzIGxvYWRlciBjbGFzc3NlcyAoZGVzY3JpYmVkIGFib3ZlKTwvbGk+Cis8bGk+PGVtPi9XRUItSU5GL2NsYXNzZXM8L2VtPiBvZiB5b3VyIHdlYiBhcHBsaWNhdGlvbjwvbGk+Cis8bGk+PGVtPi9XRUItSU5GL2xpYi8qLmphcjwvZW0+IG9mIHlvdXIgd2ViIGFwcGxpY2F0aW9uPC9saT4KKzxsaT48ZW0+JENBVEFMSU5BX0hPTUUvY29tbW9uL2NsYXNzZXM8L2VtPjwvbGk+Cis8bGk+PGVtPiRDQVRBTElOQV9IT01FL2NvbW1vbi9lbmRvcnNlZC8qLmphcjwvZW0+PC9saT4KKzxsaT48ZW0+JENBVEFMSU5BX0hPTUUvY29tbW9uL2kxOG4vKi5qYXI8L2VtPjwvbGk+Cis8bGk+PGVtPiRDQVRBTElOQV9IT01FL2NvbW1vbi9saWIvKi5qYXI8L2VtPjwvbGk+Cis8bGk+PGVtPiRDQVRBTElOQV9CQVNFL3NoYXJlZC9jbGFzc2VzPC9lbT48L2xpPgorPGxpPjxlbT4kQ0FUQUxJTkFfQkFTRS9zaGFyZWQvbGliLyouamFyPC9lbT48L2xpPgorPC91bD4KKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IlhNTCBQYXJzZXJzIGFuZCBKMlNFIDEuNCI+CisKKzxwPkFtb25nIG1hbnkgb3RoZXIgY2hhbmdlcywgdGhlIEoyU0UgMS40IHJlbGVhc2UgcGFja2FnZXMgdGhlIEpBWFAgQVBJcywgYW5kCithIHZlcnNpb24gb2YgWGVyY2VzLCBpbnNpZGUgdGhlIEpSRS4gIFRoaXMgaGFzIGltcGFjdHMgb24gYXBwbGljYXRpb25zIHRoYXQKK3dpc2ggdG8gdXNlIHRoZWlyIG93biBYTUwgcGFyc2VyLjwvcD4KKworPHA+SW4gcHJldmlvdXMgdmVyc2lvbnMgb2YgVG9tY2F0IDUsIHlvdSBjb3VsZCBzaW1wbHkgcmVwbGFjZSB0aGUgWE1MIHBhcnNlcgoraW4gdGhlIDxjb2RlPiRDQVRBTElOQV9IT01FL2NvbW1vbi9saWI8L2NvZGU+IGRpcmVjdG9yeSB0byBjaGFuZ2UgdGhlIHBhcnNlcgordXNlZCBieSBhbGwgd2ViIGFwcGxpY2F0aW9ucy4gIEhvd2V2ZXIsIHRoaXMgdGVjaG5pcXVlIHdpbGwgbm90IGJlIGVmZmVjdGl2ZQord2hlbiB5b3UgYXJlIHJ1bm5pbmcgb24gSjJTRSAxLjQsIGJlY2F1c2UgdGhlIHVzdWFsIGNsYXNzIGxvYWRlciBkZWxlZ2F0aW9uCitwcm9jZXNzIHdpbGwgYWx3YXlzIGNob29zZSB0aGUgaW1wbGVtZW50YXRpb24gaW5zaWRlIHRoZSBKREsgaW4gcHJlZmVyZW5jZQordG8gdGhpcyBvbmUuPC9wPgorCis8cD5KREsgMS40IHN1cHBvcnRzIGEgbWVjaGFuaXNtIGNhbGxlZCB0aGUgIkVuZG9yc2VkIFN0YW5kYXJkcyBPdmVycmlkZQorTWVjaGFuaXNtIiB0byBhbGxvdyByZXBsYWNlbWVudCBvZiBBUElzIGNyZWF0ZWQgb3V0c2lkZSBvZiB0aGUgSkNQIChpLmUuCitET00gYW5kIFNBWCBmcm9tIFczQykuICBJdCBjYW4gYWxzbyBiZSB1c2VkIHRvIHVwZGF0ZSB0aGUgWE1MIHBhcnNlcgoraW1wbGVtZW50YXRpb24uICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlOgorPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNC9kb2NzL2d1aWRlL3N0YW5kYXJkcy9pbmRleC5odG1sIj4KK2h0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjQvZG9jcy9ndWlkZS9zdGFuZGFyZHMvaW5kZXguaHRtbDwvYT4uPC9wPgorCis8cD5Ub21jYXQgdXRpbGl6ZXMgdGhpcyBtZWNoYW5pc20gYnkgaW5jbHVkaW5nIHRoZSBzeXN0ZW0gcHJvcGVydHkgc2V0dGluZworPGNvZGU+LURqYXZhLmVuZG9yc2VkLmRpcnM9JENBVEFMSU5BX0hPTUUvY29tbW9uL2VuZG9yc2VkPC9jb2RlPiBpbiB0aGUKK2NvbW1hbmQgbGluZSB0aGF0IHN0YXJ0cyB0aGUgY29udGFpbmVyLiAgVGhlcmVmb3JlLCB5b3UgY2FuIHJlcGxhY2UgdGhlCitwYXJzZXIgdGhhdCBpcyBpbnN0YWxsZWQgaW4gdGhpcyBkaXJlY3RvcnksIGFuZCBpdCB3aWxsIGdldCB1c2VkIGV2ZW4gb24gYQorSkRLIDEuNCBzeXN0ZW0uPC9wPgorCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iUnVubmluZyB1bmRlciBhIHNlY3VyaXR5IG1hbmFnZXIiPgorCis8cD5XaGVuIHJ1bm5pbmcgdW5kZXIgYSBzZWN1cml0eSBtYW5hZ2VyIHRoZSBsb2NhdGlvbnMgZnJvbSB3aGljaCBjbGFzc2VzCithcmUgcGVybWl0dGVkIHRvIGJlIGxvYWRlZCB3aWxsIGFsc28gZGVwZW5kIG9uIHRoZSBjb250ZW50cyBvZiB5b3VyIHBvbGljeQorZmlsZS4gU2VlIDxhIGhyZWY9InNlY3VyaXR5LW1hbmFnZXItaG93dG8uaHRtbCI+U2VjdXJpdHkgTWFuYWdlciBIT1ctVE88L2E+Citmb3IgZnVydGhlciBpbmZvcm1hdGlvbi48L3A+CisKKzwvc2VjdGlvbj4KKworCis8L2JvZHk+CisKKzwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9kb2NzL2NsdXN0ZXItaG93dG8ueG1sIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9jbHVzdGVyLWhvd3RvLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Mjc2YzVkCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9jbHVzdGVyLWhvd3RvLnhtbApAQCAtMCwwICsxLDI4MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IURPQ1RZUEUgZG9jdW1lbnQgWworICA8IUVOVElUWSBwcm9qZWN0IFNZU1RFTSAicHJvamVjdC54bWwiPgorXT4KKzxkb2N1bWVudCB1cmw9ImNsdXN0ZXItaG93dG8uaHRtbCI+CisKKyAgICAmcHJvamVjdDsKKworICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICA8YXV0aG9yIGVtYWlsPSJmaGFuaWtAYXBhY2hlLm9yZyI+RmlsaXAgSGFuaWs8L2F1dGhvcj4KKyAgICAgICAgPHRpdGxlPkNsdXN0ZXJpbmcvU2Vzc2lvbiBSZXBsaWNhdGlvbiBIT1ctVE88L3RpdGxlPgorICAgIDwvcHJvcGVydGllcz4KKworPGJvZHk+CisKKworPHNlY3Rpb24gbmFtZT0iUXVpY2sgU3RhcnQiPgorCis8cD5UbyBydW4gc2Vzc2lvbiByZXBsaWNhdGlvbiBpbiB5b3VyIFRvbWNhdCA1IGNvbnRhaW5lciwgdGhlIGZvbGxvd2luZyBzdGVwcworc2hvdWxkIGJlIGNvbXBsZXRlZDo8L3A+Cis8dWw+Cis8bGk+QWxsIHlvdXIgc2Vzc2lvbiBhdHRyaWJ1dGVzIG11c3QgaW1wbGVtZW50IDxjb2RlPmphdmEuaW8uU2VyaWFsaXphYmxlPC9jb2RlPjwvbGk+Cis8bGk+VW5jb21tZW50IHRoZSA8Y29kZT5DbHVzdGVyPC9jb2RlPiBlbGVtZW50IGluIHNlcnZlci54bWw8L2xpPgorPGxpPlVuY29tbWVudCB0aGUgPGNvZGU+VmFsdmUoUmVwbGljYXRpb25WYWx2ZSk8L2NvZGU+IGVsZW1lbnQgaW4gc2VydmVyLnhtbDwvbGk+Cis8bGk+SWYgeW91ciBUb21jYXQgaW5zdGFuY2VzIGFyZSBydW5uaW5nIG9uIHRoZSBzYW1lIG1hY2hpbmUsIG1ha2Ugc3VyZSB0aGUgPGNvZGU+dGNwTGlzdGVuUG9ydDwvY29kZT4KKyAgICBhdHRyaWJ1dGUgaXMgdW5pcXVlIGZvciBlYWNoIGluc3RhbmNlLjwvbGk+Cis8bGk+TWFrZSBzdXJlIHlvdXIgPGNvZGU+d2ViLnhtbDwvY29kZT4gaGFzIHRoZSA8Y29kZT4mbHQ7ZGlzdHJpYnV0YWJsZS8mZ3Q7PC9jb2RlPiBlbGVtZW50PC9saT4KKzwvdWw+Cis8cD5Mb2FkIGJhbGFuY2luZyBjYW4gYmUgYWNoaWV2ZWQgdGhyb3VnaCBtYW55IHRlY2huaXF1ZXMsIGFzIHNlZW4gaW4gdGhlCis8YSBocmVmPSJiYWxhbmNlci1ob3d0by5odG1sIj5Mb2FkIEJhbGFuY2luZzwvYT4gY2hhcHRlci48L3A+Cis8cD5Ob3RlOiBSZW1lbWJlciB0aGF0IHlvdXIgc2Vzc2lvbiBzdGF0ZSBpcyB0cmFja2VkIGJ5IGEgY29va2llLCBzbyB5b3VyIFVSTCBtdXN0IGxvb2sgdGhlIHNhbWUgZnJvbSB0aGUgb3V0CisgICBzaWRlIG90aGVyd2lzZSwgYSBuZXcgc2Vzc2lvbiB3aWxsIGJlIGNyZWF0ZWQuPC9wPgorPHA+Tm90ZTogQ2x1c3RlcmluZyBzdXBwb3J0IGN1cnJlbnRseSByZXF1aXJlcyB0aGUgSkRLIHZlcnNpb24gMS40IG9yIGxhdGVyLjwvcD4KKzwvc2VjdGlvbj4KKworCis8c2VjdGlvbiBuYW1lPSJPdmVydmlldyI+CisKKzxwPlRvIGVuYWJsZSBzZXNzaW9uIHJlcGxpY2F0aW9uIGluIFRvbWNhdCwgdGhyZWUgZGlmZmVyZW50IHBhdGhzIGNhbiBiZSBmb2xsb3dlZCB0byBhY2hpZXZlIHRoZSBleGFjdCBzYW1lIHRoaW5nOjwvcD4KKzxvbD4KKyAgPGxpPlVzaW5nIHNlc3Npb24gcGVyc2lzdGVuY2UsIGFuZCBzYXZpbmcgdGhlIHNlc3Npb24gdG8gYSBzaGFyZWQgZmlsZSBzeXN0ZW0gKFBlcnNpc3RlbmNlTWFuYWdlcik8L2xpPgorICA8bGk+VXNpbmcgc2Vzc2lvbiBwZXJzaXN0ZW5jZSwgYW5kIHNhdmluZyB0aGUgc2Vzc2lvbiB0byBhIHNoYXJlZCBkYXRhYmFzZSAoSkRCQ01hbmFnZXIpPC9saT4KKyAgPGxpPlVzaW5nIGluLW1lbW9yeS1yZXBsaWNhdGlvbiwgdXNpbmcgdGhlIFNpbXBsZVRjcENsdXN0ZXIgdGhhdCBzaGlwcyB3aXRoIFRvbWNhdCA1IChzZXJ2ZXIvbGliL2NhdGFsaW5hLWNsdXN0ZXIuamFyKTwvbGk+Cis8L29sPgorCis8cD5JbiB0aGlzIHJlbGVhc2Ugb2Ygc2Vzc2lvbiByZXBsaWNhdGlvbiwgVG9tY2F0IHBlcmZvcm1zIGFuIGFsbC10by1hbGwgcmVwbGljYXRpb24gb2Ygc2Vzc2lvbiBzdGF0ZS4KKworICAgVGhpcyBpcyBhbiBhbGdvcml0aG0gdGhhdCBpcyBvbmx5IGVmZmljaWVudCB3aGVuIHRoZSBjbHVzdGVycyBhcmUgc21hbGwuIEZvciBsYXJnZSBjbHVzdGVycywgdGhlIG5leHQKKyAgIHJlbGVhc2Ugd2lsbCBzdXBwb3J0IGEgcHJpbWFyeS1zZWNvbmRhcnkgc2Vzc2lvbiByZXBsaWNhdGlvbiB3aGVyZSB0aGUgc2Vzc2lvbiB3aWxsIG9ubHkgYmUgc3RvcmVkIGF0IG9uZQorICAgb3IgbWF5YmUgdHdvIGJhY2t1cCBzZXJ2ZXJzLgorICAgSW4gb3JkZXIgdG8ga2VlcCB0aGUgbmV0d29yayB0cmFmZmljIGRvd24gaW4gYW4gYWxsLXRvLWFsbCBlbnZpcm9ubWVudCwgeW91IGNhbiBzcGxpdCB5b3VyIGNsdXN0ZXIKKyAgIGludG8gc21hbGxlciBncm91cHMuIFRoaXMgY2FuIGJlIGVhc2lseSBhY2hpZXZlZCBieSB1c2luZyBkaWZmZXJlbnQgbXVsdGljYXN0IGFkZHJlc3NlcyBmb3IgdGhlIGRpZmZlcmVudCBncm91cHMuCisgICBBIHZlcnkgc2ltcGxlIHNldHVwIHdvdWxkIGxvb2sgbGlrZSB0aGlzOgorICAgPC9wPgorCis8c291cmNlPgorICAgICAgICBETlMgUm91bmQgUm9iaW4KKyAgICAgICAgICAgICAgIHwKKyAgICAgICAgIExvYWQgQmFsYW5jZXIKKyAgICAgICAgICAvICAgICAgICAgICBcCisgICAgICBDbHVzdGVyMSAgICAgIENsdXN0ZXIyCisgICAgICAvICAgICBcICAgICAgICAvICAgICBcCisgIFRvbWNhdDEgVG9tY2F0MiAgVG9tY2F0MyBUb21jYXQ0Cis8L3NvdXJjZT4KKworPHA+V2hhdCBpcyBpbXBvcnRhbnQgdG8gbWVudGlvbiBoZXJlLCBpcyB0aGF0IHNlc3Npb24gcmVwbGljYXRpb24gaXMgb25seSB0aGUgYmVnaW5uaW5nIG9mIGNsdXN0ZXJpbmcuCisgICBBbm90aGVyIHBvcHVsYXIgY29uY2VwdCB1c2VkIHRvIGltcGxlbWVudCBjbHVzdGVycyBpcyBmYXJtaW5nLCBpZSwgeW91IGRlcGxveSB5b3VyIGFwcHMgb25seSB0byBvbmUKKyAgIHNlcnZlciwgYW5kIHRoZSBjbHVzdGVyIHdpbGwgZGlzdHJpYnV0ZSB0aGUgZGVwbG95bWVudHMgYWNyb3NzIHRoZSBlbnRpcmUgY2x1c3Rlci4KKyAgIFRoaXMgaXMgYWxsIGNhcGFiaWxpdGllcyB0aGF0IGNhbiBnbyBpbnRvIHRoZSBuZXh0IHJlbGVhc2UuPC9wPgorPHA+SW4gdGhlIG5leHQgc2VjdGlvbiB3aWxsIGdvIGRlZXBlciBpbnRvIGhvdyBzZXNzaW9uIHJlcGxpY2F0aW9uIHdvcmtzIGFuZCBob3cgdG8gY29uZmlndXJlIGl0LjwvcD4KKworPC9zZWN0aW9uPgorCis8c2VjdGlvbiBuYW1lPSJIb3cgaXQgV29ya3MiPgorPHA+VG8gbWFrZSBpdCBlYXN5IHRvIHVuZGVyc3RhbmQgaG93IGNsdXN0ZXJpbmcgd29ya3MsIEknbSBnb25uYSB0YWtlIHlvdSB0aHJvdWdoIGEgc2VyaWVzIG9mIHNjZW5hcmlvcy4KKyAgIEluIHRoZSBzY2VuYXJpbyBJIG9ubHkgcGxhbiB0byB1c2UgdHdvIHRvbWNhdCBpbnN0YW5jZXMgPGNvZGU+VG9tY2F0QTwvY29kZT4gYW5kIDxjb2RlPlRvbWNhdEI8L2NvZGU+LgorICAgV2Ugd2lsbCBjb3ZlciB0aGUgZm9sbG93aW5nIHNlcXVlbmNlIG9mIGV2ZW50czo8L3A+CisKKzxvbD4KKzxsaT48Y29kZT5Ub21jYXRBPC9jb2RlPiBzdGFydHMgdXA8L2xpPgorPGxpPjxjb2RlPlRvbWNhdEI8L2NvZGU+IHN0YXJ0cyB1cDwvbGk+Cis8bGk+PGNvZGU+VG9tY2F0QTwvY29kZT4gcmVjZWl2ZXMgYSByZXF1ZXN0LCBhIHNlc3Npb24gPGNvZGU+UzE8L2NvZGU+IGlzIGNyZWF0ZWQuPC9saT4KKzxsaT48Y29kZT5Ub21jYXRBPC9jb2RlPiBjcmFzaGVzPC9saT4KKzxsaT48Y29kZT5Ub21jYXRCPC9jb2RlPiByZWNlaXZlcyBhIHJlcXVlc3QgZm9yIHNlc3Npb24gPGNvZGU+UzE8L2NvZGU+PC9saT4KKzxsaT48Y29kZT5Ub21jYXRBPC9jb2RlPiBzdGFydHMgdXA8L2xpPgorPGxpPjxjb2RlPlRvbWNhdEE8L2NvZGU+IHJlY2VpdmVzIGEgcmVxdWVzdCwgaW52YWxpZGF0ZSBpcyBjYWxsZWQgb24gdGhlIHNlc3Npb24gKDxjb2RlPlMxPC9jb2RlPik8L2xpPgorPGxpPjxjb2RlPlRvbWNhdEI8L2NvZGU+IHJlY2VpdmVzIGEgcmVxdWVzdCwgZm9yIGEgbmV3IHNlc3Npb24gKDxjb2RlPlMyPC9jb2RlPik8L2xpPgorPGxpPjxjb2RlPlRvbWNhdEE8L2NvZGU+IFRoZSBzZXNzaW9uIDxjb2RlPlMyPC9jb2RlPiBleHBpcmVzIGR1ZSB0byBpbmFjdGl2aXR5LjwvbGk+Cis8L29sPgorCis8cD5Paywgbm93IHRoYXQgd2UgaGF2ZSBhIGdvb2Qgc2VxdWVuY2UsIEkgd2lsbCB0YWtlIHlvdSB0aHJvdWdoIGV4YWN0bHkgd2hhdCBoYXBwZW5zIGluIHRoZSBzZXNzaW9uIHJlcGxpY3Rpb24gY29kZTwvcD4KKworPG9sPgorPGxpPjxiPjxjb2RlPlRvbWNhdEE8L2NvZGU+IHN0YXJ0cyB1cDwvYj4KKyAgICA8cD4KKyAgICAgICAgVG9tY2F0IHN0YXJ0cyB1cCB1c2luZyB0aGUgc3RhbmRhcmQgc3RhcnQgdXAgc2VxdWVuY2UuIFdoZW4gdGhlIEhvc3Qgb2JqZWN0IGlzIGNyZWF0ZWQsIGEgY2x1c3RlciBvYmplY3QgaXMgYXNzb2NpYXRlZCB3aXRoIGl0LgorICAgICAgICBXaGVuIHRoZSBjb250ZXh0cyBhcmUgcGFyc2VkLCBpZiB0aGUgZGlzdHJpYnV0YWJsZSBlbGVtZW50IGlzIGluIHBsYWNlIGluIHdlYi54bWwKKyAgICAgICAgVG9tY2F0IGFza3MgdGhlIENsdXN0ZXIgY2xhc3MgKGluIHRoaXMgY2FzZSA8Y29kZT5TaW1wbGVUY3BDbHVzdGVyPC9jb2RlPikgdG8gY3JlYXRlIGEgbWFuYWdlcgorICAgICAgICBmb3IgdGhlIHJlcGxpY2F0ZWQgY29udGV4dC4gU28gd2l0aCBjbHVzdGVyaW5nIGVuYWJsZWQsIGRpc3RyaWJ1dGFibGUgc2V0IGluIHdlYi54bWwKKyAgICAgICAgVG9tY2F0IHdpbGwgY3JlYXRlIGEgPGNvZGU+U2ltcGxlVGNwUmVwbGljYXRpb25NYW5hZ2VyPC9jb2RlPiBmb3IgdGhhdCBjb250ZXh0IGluc3RlYWQgb2YgYSA8Y29kZT5TdGFuZGFyZE1hbmFnZXI8L2NvZGU+LgorICAgICAgICBUaGUgY2x1c3RlciBjbGFzcyB3aWxsIHN0YXJ0IHVwIGEgbWVtYmVyc2hpcCBzZXJ2aWNlIChtdWx0aWNhc3QpIGFuZCBhIHJlcGxpY2F0aW9uIHNlcnZpY2UgKHRjcCB1bmljYXN0KS4KKyAgICAgICAgTW9yZSBvbiB0aGUgYXJjaGl0ZWN0dXJlIGZ1cnRoZXIgZG93biBpbiB0aGlzIGRvY3VtZW50LgorICAgIDwvcD48cD48L3A+Cis8L2xpPgorPGxpPjxiPjxjb2RlPlRvbWNhdEI8L2NvZGU+IHN0YXJ0cyB1cDwvYj4KKyAgICA8cD4KKyAgICAgICAgV2hlbiBUb21jYXRCIHN0YXJ0cyB1cCwgaXQgZm9sbG93cyB0aGUgc2FtZSBzZXF1ZW5jZSBhcyBUb21jYXRBIGRpZCB3aXRoIG9uZSBleGNlcHRpb24uCisgICAgICAgIFRoZSBjbHVzdGVyIGlzIHN0YXJ0ZWQgYW5kIHdpbGwgZXN0YWJsaXNoIGEgbWVtYmVyc2hpcCAoVG9tY2F0QSxUb21jYXRCKS4KKyAgICAgICAgVG9tY2F0QiB3aWxsIG5vdyByZXF1ZXN0IHRoZSBzZXNzaW9uIHN0YXRlIGZyb20gYSBzZXJ2ZXIgdGhhdCBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgY2x1c3RlciwKKyAgICAgICAgaW4gdGhpcyBjYXNlIFRvbWNhdEEuIFRvbWNhdEEgcmVzcG9uZHMgdG8gdGhlIHJlcXVlc3QsIGFuZCBiZWZvcmUgVG9tY2F0QiBzdGFydHMgbGlzdGVuaW5nCisgICAgICAgIGZvciBIVFRQIHJlcXVlc3RzLCB0aGUgc3RhdGUgaGFzIGJlZW4gdHJhbnNmZXJyZWQgZnJvbSBUb21jYXRBIHRvIFRvbWNhdEIuCisgICAgICAgIEluIGNhc2UgVG9tY2F0QSBkb2Vzbid0IHJlc3BvbmQsIFRvbWNhdEIgd2lsbCB0aW1lIG91dCBhZnRlciA2MCBzZWNvbmRzLCBhbmQgaXNzdWUgYSBsb2cKKyAgICAgICAgZW50cnkuIFRoZSBzZXNzaW9uIHN0YXRlIGdldHMgdHJhbnNmZXJyZWQgZm9yIGVhY2ggd2ViIGFwcGxpY2F0aW9uIHRoYXQgaGFzIGRpc3RyaWJ1dGFibGUgaW4KKyAgICAgICAgaXRzIHdlYi54bWwuIE5vdGU6IFRvIHVzZSBzZXNzaW9uIHJlcGxpY2F0aW9uIGVmZmljaWVudGx5LCBhbGwgeW91ciB0b21jYXQgaW5zdGFuY2VzIHNob3VsZCBiZQorICAgICAgICBjb25maWd1cmVkIHRoZSBzYW1lLgorICAgIDwvcD48cD48L3A+Cis8L2xpPgorPGxpPjxCPjxjb2RlPlRvbWNhdEE8L2NvZGU+IHJlY2VpdmVzIGEgcmVxdWVzdCwgYSBzZXNzaW9uIDxjb2RlPlMxPC9jb2RlPiBpcyBjcmVhdGVkLjwvQj4KKyAgICA8cD4KKyAgICAgICAgVGhlIHJlcXVlc3QgY29taW5nIGluIHRvIFRvbWNhdEEgaXMgdHJlYXRlZCBleGFjdGx5IHRoZSBzYW1lIHdheSBhcyB3aXRob3V0IHNlc3Npb24gcmVwbGljYXRpb24uCisgICAgICAgIFRoZSBhY3Rpb24gaGFwcGVucyB3aGVuIHRoZSByZXF1ZXN0IGlzIGNvbXBsZXRlZCwgdGhlIDxjb2RlPlJlcGxpY2F0aW9uVmFsdmU8L2NvZGU+IHdpbGwgaW50ZXJjZXB0CisgICAgICAgIHRoZSByZXF1ZXN0IGJlZm9yZSB0aGUgcmVzcG9uc2UgaXMgcmV0dXJuZWQgdG8gdGhlIHVzZXIuCisgICAgICAgIEF0IHRoaXMgcG9pbnQgaXQgZmluZHMgdGhhdCB0aGUgc2Vzc2lvbiBoYXMgYmVlbiBtb2RpZmllZCwgYW5kIGl0IHVzZXMgVENQIHRvIHJlcGxpY2F0YSB0aGUKKyAgICAgICAgc2Vzc2lvbiB0byBUb21jYXRCLiBPbmNlIHRoZSBzZXJpYWxpemVkIGRhdGEgaGFzIGJlZW4gaGFuZGVkIG9mZiB0byB0aGUgb3BlcmF0aW5nIHN5c3RlbXMgVENQIGxvZ2ljLAorICAgICAgICB0aGUgcmVxdWVzdCByZXR1cm5zIHRvIHRoZSB1c2VyLCBiYWNrIHRocm91Z2ggdGhlIHZhbHZlIHBpcGVsaW5lLgorICAgICAgICBGb3IgZWFjaCByZXF1ZXN0IHRoZSBlbnRpcmUgc2Vzc2lvbiBpcyByZXBsaWNhdGVkLCB0aGlzIGFsbG93cyBjb2RlIHRoYXQgbW9kaWZpZXMgYXR0cmlidXRlcworICAgICAgICBpbiB0aGUgc2Vzc2lvbiB3aXRob3V0IGNhbGxpbmcgc2V0QXR0cmlidXRlIG9yIHJlbW92ZUF0dHJpYnV0ZSB0byBiZSByZXBsaWNhdGVkLgorICAgICAgICBhIHVzZURpcnR5RmxhZyBjb25maWd1cmF0aW9uIHBhcmFtZXRlciBjYW4gYmUgdXNlZCB0byBvcHRpbWl6ZSB0aGUgbnVtYmVyIG9mIHRpbWVzCisgICAgICAgIGEgc2Vzc2lvbiBpcyByZXBsaWNhdGVkLgorICAgIDwvcD48cD48L3A+CisKKzwvbGk+Cis8bGk+PGI+PGNvZGU+VG9tY2F0QTwvY29kZT4gY3Jhc2hlczwvYj4KKyAgICA8cD4KKyAgICAgICAgV2hlbiBUb21jYXRBIGNyYXNoZXMsIFRvbWNhdEIgcmVjZWl2ZXMgYSBub3RpZmljYXRpb24gdGhhdCBUb21jYXRBIGhhcyBkcm9wcGVkIG91dAorICAgICAgICBvZiB0aGUgY2x1c3Rlci4gVG9tY2F0QiByZW1vdmVzIFRvbWNhdEEgZnJvbSBpdHMgbWVtYmVyc2hpcCBsaXN0LCBhbmQgVG9tY2F0QSB3aWxsIG5vIGxvbmdlcgorICAgICAgICBiZSBub3RpZmllZCBvZiBhbnkgY2hhbmdlcyB0aGF0IG9jY3VycyBpbiBUb21jYXRCLgorICAgICAgICBUaGUgbG9hZCBiYWxhbmNlciB3aWxsIHJlZGlyZWN0IHRoZSByZXF1ZXN0cyBmcm9tIFRvbWNhdEEgdG8gVG9tY2F0QiBhbmQgYWxsIHRoZSBzZXNzaW9ucworICAgICAgICBhcmUgY3VycmVudC4KKyAgICA8L3A+PHA+PC9wPgorPC9saT4KKzxsaT48Yj48Y29kZT5Ub21jYXRCPC9jb2RlPiByZWNlaXZlcyBhIHJlcXVlc3QgZm9yIHNlc3Npb24gPGNvZGU+UzE8L2NvZGU+PC9iPgorICAgIDxwPk5vdGhpbmcgZXhjaXRpbmcsIFRvbWNhdEIgd2lsbCBwcm9jZXNzIHRoZSByZXF1ZXN0IGFzIGFueSBvdGhlciByZXF1ZXN0LgorICAgIDwvcD48cD48L3A+Cis8L2xpPgorPGxpPjxiPjxjb2RlPlRvbWNhdEE8L2NvZGU+IHN0YXJ0cyB1cDwvYj4KKyAgICA8cD5VcG9uIHN0YXJ0IHVwLCBiZWZvcmUgVG9tY2F0QSBzdGFydHMgdGFraW5nIG5ldyByZXF1ZXN0IGFuZCBtYWtpbmcgaXRzZWxmCisgICAgYXZhaWxhYmxlIHRvIGl0IHdpbGwgZm9sbG93IHRoZSBzdGFydCB1cCBzZXF1ZW5jZSBkZXNjcmliZWQgYWJvdmUgMSkgMikuCisgICAgSXQgd2lsbCBqb2luIHRoZSBjbHVzdGVyLCBjb250YWN0IFRvbWNhdEIgZm9yIHRoZSBjdXJyZW50IHN0YXRlIG9mIGFsbCB0aGUgc2Vzc2lvbnMuCisgICAgQW5kIG9uY2UgaXQgcmVjZWl2ZXMgdGhlIHNlc3Npb24gc3RhdGUsIGl0IGZpbmlzaGVzIGxvYWRpbmcgYW5kIG9wZW5zIGl0cyBIVFRQL21vZF9qayBwb3J0cy4KKyAgICBTbyBubyByZXF1ZXN0cyB3aWxsIG1ha2UgaXQgdG8gVG9tY2F0QSB1bnRpbCBpdCBoYXMgcmVjZWl2ZWQgdGhlIHNlc3Npb24gc3RhdGUgZnJvbSBUb21jYXRCLgorICAgIDwvcD48cD48L3A+Cis8L2xpPgorPGxpPjxiPjxjb2RlPlRvbWNhdEE8L2NvZGU+IHJlY2VpdmVzIGEgcmVxdWVzdCwgaW52YWxpZGF0ZSBpcyBjYWxsZWQgb24gdGhlIHNlc3Npb24gKDxjb2RlPlMxPC9jb2RlPik8L2I+CisgICAgPHA+VGhlIGludmFsaWRhdGUgaXMgY2FsbCBpcyBpbnRlcmNlcHRlZCwgYW5kIHRoZSBzZXNzaW9uIGlzIHF1ZXVlZCB3aXRoIGludmFsaWRhdGVkIHNlc3Npb25zLgorICAgICAgICBXaGVuIHRoZSByZXF1ZXN0IGlzIGNvbXBsZXRlLCBpbnN0ZWFkIG9mIHNlbmRpbmcgb3V0IHRoZSBzZXNzaW9uIHRoYXQgaGFzIGNoYW5nZWQsIGl0IHNlbmRzIG91dAorICAgICAgICBhbiAiZXhwaXJlIiBtZXNzYWdlIHRvIFRvbWNhdEIgYW5kIFRvbWNhdEIgd2lsbCBpbnZhbGlkYXRlIHRoZSBzZXNzaW9uIGFzIHdlbGwuCisgICAgPC9wPjxwPjwvcD4KKworPC9saT4KKzxsaT48Yj48Y29kZT5Ub21jYXRCPC9jb2RlPiByZWNlaXZlcyBhIHJlcXVlc3QsIGZvciBhIG5ldyBzZXNzaW9uICg8Y29kZT5TMjwvY29kZT4pPC9iPgorICAgIDxwPlNhbWUgc2NlbmFyaW8gYXMgaW4gc3RlcCAzKQorICAgIDwvcD48cD48L3A+CisKKworPC9saT4KKzxsaT48Y29kZT5Ub21jYXRBPC9jb2RlPiBUaGUgc2Vzc2lvbiA8Y29kZT5TMjwvY29kZT4gZXhwaXJlcyBkdWUgdG8gaW5hY3Rpdml0eS4KKyAgICA8cD5UaGUgaW52YWxpZGF0ZSBpcyBjYWxsIGlzIGludGVyY2VwdGVkIHRoZSBzYW1lIHdhcyBhcyB3aGVuIGEgc2Vzc2lvbiBpcyBpbnZhbGlkYXRlZCBieSB0aGUgdXNlciwKKyAgICAgICBhbmQgdGhlIHNlc3Npb24gaXMgcXVldWVkIHdpdGggaW52YWxpZGF0ZWQgc2Vzc2lvbnMuCisgICAgICAgQXQgdGhpcyBwb2ludCwgdGhlIGludmFsaWRldCBzZXNzaW9uIHdpbGwgbm90IGJlIHJlcGxpY2F0ZWQgYWNyb3NzIHVudGlsCisgICAgICAgYW5vdGhlciByZXF1ZXN0IGNvbWVzIHRocm91Z2ggdGhlIHN5c3RlbSBhbmQgY2hlY2tzIHRoZSBpbnZhbGlkIHF1ZXVlLgorICAgIDwvcD48cD48L3A+Cis8L2xpPgorPC9vbD4KKworPHA+UGh1dXVoaCEgOik8L3A+CisKKzxwPjxiPk1lbWJlcnNoaXA8L2I+CisgICAgQ2x1c3RlcmluZyBtZW1iZXJzaGlwIGlzIGVzdGFibGlzaGVkIHVzaW5nIHZlcnkgc2ltcGxlIG11bHRpY2FzdCBwaW5ncy4KKyAgICBFYWNoIFRvbWNhdCBpbnN0YW5jZSB3aWxsIHBlcmlvZGljYWxseSBzZW5kIG91dCBhIG11bHRpY2FzdCBwaW5nLAorICAgIGluIHRoZSBwaW5nIG1lc3NhZ2UgdGhlIGluc3RhbmNlIHdpbGwgYnJvYWQgY2FzdCBpdHMgSVAgYW5kIFRDUCBsaXN0ZW4gcG9ydAorICAgIGZvciByZXBsaWNhdGlvbi4KKyAgICBJZiBhbiBpbnN0YW5jZSBoYXMgbm90IHJlY2VpdmVkIHN1Y2ggYSBwaW5nIHdpdGhpbiBhIGdpdmVuIHRpbWVmcmFtZSwgdGhlCisgICAgbWVtYmVyIGlzIGNvbnNpZGVyZWQgZGVhZC4gVmVyeSBzaW1wbGUsIGFuZCB2ZXJ5IGVmZmVjdGl2ZSEKKyAgICBPZiBjb3Vyc2UsIHlvdSBuZWVkIHRvIGVuYWJsZSBtdWx0aWNhc3Rpbmcgb24geW91ciBzeXN0ZW0uCis8L3A+CisKKzxwPjxiPlRDUCBSZXBsaWNhdGlvbjwvYj4KKyAgICBPbmNlIGEgbXVsdGljYXN0IHBpbmcgaGFzIGJlZW4gcmVjZWl2ZWQsIHRoZSBtZW1iZXIgaXMgYWRkZWQgdG8gdGhlIGNsdXN0ZXIKKyAgICBVcG9uIHRoZSBuZXh0IHJlcGxpY2F0aW9uIHJlcXVlc3QsIHRoZSBzZW5kaW5nIGluc3RhbmNlIHdpbGwgdXNlIHRoZSBob3N0IGFuZAorICAgIHBvcnQgaW5mbyBhbmQgZXN0YWJsaXNoIGEgVENQIHNvY2tldC4gVXNpbmcgdGhpcyBzb2NrZXQgaXQgc2VuZHMgb3ZlciB0aGUgc2VyaWFsaXplZCBkYXRhLgorICAgIFRoZSByZWFzb24gSSBjaG9vc2UgVENQIHNvY2tldHMgaXMgYmVjYXVzZSBpdCBoYXMgYnVpbHQgaW4gZmxvdyBjb250cm9sIGFuZCBndWFyYW50ZWVkIGRlbGl2ZXJ5LgorICAgIFNvIEkga25vdywgd2hlbiBJIHNlbmQgc29tZSBkYXRhLCBpdCB3aWxsIG1ha2UgaXQgdGhlcmUgOikKKzwvcD4KKworPHA+PGI+RGlzdHJpYnV0ZWQgbG9ja2luZyBhbmQgcGFnZXMgdXNpbmcgZnJhbWVzPC9iPgorICAgIFRvbWNhdCBkb2VzIG5vdCBrZWVwIHNlc3Npb24gaW5zdGFuY2VzIGluIHN5bmMgYWNyb3NzIHRoZSBjbHVzdGVyLgorICAgIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiBzdWNoIGxvZ2ljIHdvdWxkIGJlIHRvIG11Y2ggb3ZlcmhlYWQgYW5kIGNhdXNlIGFsbAorICAgIGtpbmRzIG9mIHByb2JsZW1zLiBJZiB5b3VyIGNsaWVudCBhY2Nlc3NlcyB0aGUgc2FtZSBzZXNzaW9uCisgICAgc2ltdWx0YW5vdXNseSB1c2luZyBtdWx0aXBsZSByZXF1ZXN0cywgdGhlbiB0aGUgbGFzdCByZXF1ZXN0CisgICAgd2lsbCBvdmVycmlkZSB0aGUgb3RoZXIgc2Vzc2lvbnMgaW4gdGhlIGNsdXN0ZXIuCis8L3A+CisKKzwvc2VjdGlvbj4KKworPHNlY3Rpb24gbmFtZT0iQ2x1c3RlciBBcmNoaXRlY3R1cmUiPgorCis8cD5Db21wb25lbnQgTGV2ZWxzOgorPHNvdXJjZT4KKyAgICAgICAgU2VydmVyCisgICAgICAgICAgfAorICAgICAgICBTZXJ2aWNlCisgICAgICAgICAgfAorICAgICAgICBFbmdpbmUKKyAgICAgICAvICAgICBcCisgICBDbHVzdGVyIFJlcGxpY2F0aW9uVmFsdmUKKyAgICAgIHwKKyAgIE1hbmFnZXIKKyAgICAgIHwKKyAgU2Vzc2lvbgorPC9zb3VyY2U+PC9wPgorCisKKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IkNsdXN0ZXIgQ29uZmlndXJhdGlvbiI+Cis8cD5UaGUgY2x1c3RlciBjb25maWd1cmF0aW9uIGlzIGRlc2NyaWJlZCBpbiB0aGUgc2FtcGxlIHNlcnZlci54bWwgZmlsZS4KK1doYXQgaXMgd29ydGggdG8gbWVudGlvbiBpcyB0aGF0IHRoZSBhdHRyaWJ1dGVzIHN0YXJ0aW5nIHdpdGggbWNhc3RYWFgKK2FyZSBmb3IgdGhlIG1lbWJlcnNoaXAgbXVsdGljYXN0IHBpbmcsIGFuZCB0aGUgYXR0cmlidXRlcyBzdGFydGluZyB3aXRoIHRjcFhYWAorYXJlIGZvciB0aGUgYWN0dWFsIFRDUCByZXBsaWNhdGlvbi4KKzwvcD4KKzxwPgorICAgIFRoZSBtZW1iZXJzaGlwIGlzIGVzdGFibGlzaGVkIGJ5IGFsbCB0aGUgdG9tY2F0IGluc3RhbmNlcyBhcmUgc2VuZGluZyBicm9hZGNhc3QgbWVzc2FnZXMKKyAgICBvbiB0aGUgc2FtZSBtdWx0aWNhc3QgSVAgYW5kIHBvcnQuCisgICAgVGhlIFRDUCBsaXN0ZW4gcG9ydCwgaXMgdGhlIHBvcnQgd2hlcmUgdGhlIHNlc3Npb24gcmVwbGljYXRpb24gaXMgcmVjZWl2ZWQgZnJvbSBvdGhlciBtZW1iZXJzLgorPC9wPgorPHA+CisgICAgVGhlIHJlcGxpY2F0aW9uIHZhbHZlIGlzIHVzZWQgdG8gZmluZCBvdXQgd2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbiBjb21wbGV0ZWQgYW5kIGluaXRpYXRlIHRoZQorICAgIHJlcGxpY2F0aW9uLgorPC9wPgorPHA+CisgICAgT25lIG9mIHRoZSBtb3N0IGltcG9ydGFudCBwZXJmb3JtYW5jZSBjb25zaWRlcmF0aW9ucyBpcyB0aGUgc3luY2hyb25vdXMgKHBvb2xlZCBvciBub3QgcG9vbGVkKSB2ZXJzdXMgYXN5bmNocm9ub3VzIHJlcGxpY2F0aW9uCisgICAgbW9kZS4gSW4gYSBzeW5jaHJvbm91cyByZXBsaWNhdGlvbiBtb2RlIHRoZSByZXF1ZXN0IGRvZXNuJ3QgcmV0dXJuIHVudGlsIHRoZSByZXBsaWNhdGVkIHNlc3Npb24gaGFzIGJlZW4KKyAgICBzZW50IG92ZXIgdGhlIHdpcmUgYW5kIHJlaW5zdGFudGlhdGVkIG9uIGFsbCB0aGUgb3RoZXIgY2x1c3RlciBub2Rlcy4KKyAgICBUaGVyZSBhcmUgdHdvIHNldHRpbmdzIGZvciBzeW5jaHJvbm91cyByZXBsaWNhdGlvbi4gUG9vbGVkIG9yIG5vdCBwb29sZWQuCisgICAgTm90IHBvb2xlZCAoaWUgcmVwbGljYXRpb25Nb2RlPSZxdW90O3N5bmNocm9ub3VzJnF1b3Q7KSBtZWFucyB0aGF0IGFsbCB0aGUgcmVwbGljYXRpb24gcmVxdWVzdCBhcmUgc2VudCBvdmVyIGEgc2luZ2xlCisgICAgc29ja2V0LgorICAgIFVzaW5nIHN5bmNocm9ub3VzIG1vZGUgcG90ZW50aWFsbHkgYmVjb21lcyBhIGJvdHRsZW5lY2ssCisgICAgWW91IGNhbiBvdmVyY29tZSB0aGlzIGJvdHRsZW5lY2sgYnkgc2V0dGluZyByZXBsaWNhdGlvbk1vZGU9JnF1b3Q7cG9vbGVkJnF1b3Q7LgorICAgIFdoYXQgaXMgcmVjb21tZW5kZWQgaGVyZSBpcyB0byBpbmNyZWFzZSB0aGUgbnVtYmVyIG9mIHRocmVhZHMgdGhhdCBoYW5kbGUKKyAgICBpbmNvbWluZyByZXBsaWNhdGlvbiByZXF1ZXN0LiBUaGlzIGlzIHRoZSB0Y3BUaHJlYWRDb3VudCBwcm9wZXJ0eSBpbiB0aGUgY2x1c3RlcgorICAgIHNlY3Rpb24gb2Ygc2VydmVyLnhtbC4gVGhlIHBvb2xlZCBzZXR0aW5nIG1lYW5zIHRoYXQgd2UgYXJlIHVzaW5nIG11bHRpcGxlIHNvY2tldHMsIGhlbmNlIGluY3JlYXNlcyB0aGUgcGVyZm9ybWFuY2UuCisgICAgQXN5bmNocm9ub3VzIHJlcGxpY2F0aW9uLCBzaG91bGQgYmUgdXNlZCBpZiB5b3UgaGF2ZSBzdGlja3kgc2Vzc2lvbnMgdW50aWwgZmFpbCBvdmVyLCB0aGVuCisgICAgeW91ciByZXBsaWNhdGVkIGRhdGEgaXMgbm90IHRpbWUgY3J1Y2lhbCwgYnV0IHRoZSByZXF1ZXN0IHRpbWUgaXMsIGF0IHRoaXMgdGltZSBsZWF2ZSB0aGUgdGNwVGhyZWFkQ291bnQgdG8KKyAgICBiZSBudW1iZXItb2Ytbm9kZXMtMS4KKyAgICBEdXJpbmcgYXN5bmMgcmVwbGljYXRpb24sIHRoZSByZXF1ZXN0IGlzIHJldHVybmVkIGJlZm9yZSB0aGUgZGF0YSBoYXMgYmVlbiByZXBsaWNhdGVkLiBhc3luYyByZXBsaWNhdGlvbiB5aWVsZHMgc2hvcnRlcgorICAgIHJlcXVlc3QgdGltZXMsIGFuZCBzeW5jaHJvbm91cyByZXBsaWNhdGlvbiBndWFyYW50ZWVzIHRoZSBzZXNzaW9uIHRvIGJlIHJlcGxpY2F0ZWQgYmVmb3JlIHRoZSByZXF1ZXN0IHJldHVybnMuCis8L3A+Cis8cD4KKyAgICBUaGUgcGFyYW1ldGVyICZxdW90O3JlcGxpY2F0aW9uTW9kZSZxdW90OyBoYXMgdGhyZWUgZGlmZmVyZW50IHNldHRpbmdzOiAmcXVvdDtwb29sZWQmcXVvdDssICZxdW90O3N5bmNocm9ub3VzJnF1b3Q7IGFuZCAmcXVvdDthc3luY2hyb25vdXMmcXVvdDsKKzwvcD4KKzwvc2VjdGlvbj4KKworCis8c2VjdGlvbiBuYW1lPSJGQVEiPgorPHA+VG8gYmUgY29tcGxldGVkIG9uY2UgSSByZWNlaXZlIHF1ZXN0aW9ucyBhYm91dCBzZXNzaW9uIHJlcGxpY2F0aW9uOjwvcD4KKzxvbD4KKzxsaT5ROiBXaGF0IGhhcHBlbnMgd2hlbiBJIHB1bGwgdGhlIG5ldHdvcmsgY29yZD88cD48L3A+CisKKyAgICBBOiBXZWxsLCB0aGUgb3RoZXIgbWVtYmVycyB3aWxsIHJlbW92ZSB0aGUgaW5zdGFuY2UgZnJvbSB0aGUgY2x1c3RlciwKKyAgICAgICBidXQgd2hlbiB5b3UgaW5zZXJ0IHRoZSBjYWJsZSBhZ2FpbiwgdGhlIFRvbWNhdCBpbnN0YW5jZSBtaWdodCBoYXZlIGNvbXBsZXRlbHkgZmxpcHBlZCBvdXQuCisgICAgICAgVGhpcyBpcyBiZWNhdXNlIHRoZSBPUyBtaWdodCBzdGFydCBnb2luZyAxMDAlIENQVSB3aGVuIGEgbXVsdGljYXN0IG1lc3NhZ2UgaXMgc2VudC4KKyAgICAgICBUaGVyZSBoYXMgbm90IHlldCBiZWVuIGEgZ29vZCBzb2x1dGlvbiBmb3IgdGhpcywgSSB3aWxsIGxldCB5b3Uga25vdyB3aGVuIEkgaGF2ZSBjb21lIHVwIHdpdGggb25lLgorICA8L2xpPgorCis8L29sPgorPC9zZWN0aW9uPgorCis8L2JvZHk+CisKKzwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9kb2NzL2NvbmZpZy9hanAueG1sIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9jb25maWcvYWpwLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODIyZWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9jb25maWcvYWpwLnhtbApAQCAtMCwwICsxLDE1OCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IURPQ1RZUEUgZG9jdW1lbnQgWworICA8IUVOVElUWSBwcm9qZWN0IFNZU1RFTSAicHJvamVjdC54bWwiPgorXT4KKzxkb2N1bWVudCB1cmw9ImFqcC5odG1sIj4KKworICAmcHJvamVjdDsKKworICA8cHJvcGVydGllcz4KKyAgICA8YXV0aG9yIGVtYWlsPSJyZW1tQGFwYWNoZS5vcmciPlJlbXkgTWF1Y2hlcmF0PC9hdXRob3I+CisgICAgPGF1dGhvciBlbWFpbD0ieW9hdnNAYXBhY2hlLm9yZyI+WW9hdiBTaGFwaXJhPC9hdXRob3I+CisgICAgPHRpdGxlPlRoZSBBSlAgQ29ubmVjdG9yPC90aXRsZT4KKyAgPC9wcm9wZXJ0aWVzPgorCis8Ym9keT4KKworCis8c2VjdGlvbiBuYW1lPSJJbnRyb2R1Y3Rpb24iPgorCisgIDxwPlRoZSA8c3Ryb25nPkFKUCBDb25uZWN0b3I8L3N0cm9uZz4gZWxlbWVudCByZXByZXNlbnRzIGEKKyAgPHN0cm9uZz5Db25uZWN0b3I8L3N0cm9uZz4gY29tcG9uZW50IHRoYXQgY29tbXVuaWNhdGVzIHdpdGggYSB3ZWIKKyAgY29ubmVjdG9yIHZpYSB0aGUgPGNvZGU+QUpQPC9jb2RlPiBwcm90b2NvbC4gIFRoaXMgaXMgdXNlZCBmb3IgY2FzZXMKKyAgd2hlcmUgeW91IHdpc2ggdG8gaW52aXNpYmx5IGludGVncmF0ZSBUb21jYXQgNSBpbnRvIGFuIGV4aXN0aW5nIChvciBuZXcpCisgIEFwYWNoZSBpbnN0YWxsYXRpb24sIGFuZCB5b3Ugd2FudCBBcGFjaGUgdG8gaGFuZGxlIHRoZSBzdGF0aWMgY29udGVudAorICBjb250YWluZWQgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbiwgYW5kL29yIHV0aWxpemUgQXBhY2hlJ3MgU1NMCisgIHByb2Nlc3NpbmcuPC9wPgorCisgIDxwPlRoaXMgY29ubmVjdG9yIHN1cHBvcnRzIGxvYWQgYmFsYW5jaW5nIHdoZW4gdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoCisgIHRoZSA8Y29kZT5qdm1Sb3V0ZTwvY29kZT4gYXR0cmlidXRlIG9mIHRoZSAKKyAgPGEgaHJlZj0iZW5naW5lLmh0bWwiPkVuZ2luZTwvYT4uPC9wPgorCis8cD5UaGUgbmF0aXZlIGNvbm5lY3RvcnMgc3VwcG9ydGVkIHdpdGggdGhpcyBUb21jYXQgcmVsZWFzZSBhcmU6Cis8dWw+Cis8bGk+SksgMS4yLnggd2l0aCBhbnkgb2YgdGhlIHN1cHBvcnRlZCBzZXJ2ZXJzPC9saT4KKzxsaT5tb2RfcHJveHkgb24gQXBhY2hlIGh0dHBkIDIueCAoaW5jbHVkZWQgYnkgZGVmYXVsdCBpbiBBcGFjaGUgSFRUUCBTZXJ2ZXIgMi4yKSwgCit3aXRoIEFKUCBlbmFibGVkPC9saT4KKzwvdWw+Cis8L3A+CisKKzxwPjxiPk90aGVyIG5hdGl2ZSBjb25uZWN0b3JzIHN1cHBvcnRpbmcgQUpQIG1heSB3b3JrLCBidXQgYXJlIG5vIGxvbmdlciBzdXBwb3J0ZWQuPC9iPjwvcD4KKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IkF0dHJpYnV0ZXMiPgorCisgIDxzdWJzZWN0aW9uIG5hbWU9IkNvbW1vbiBBdHRyaWJ1dGVzIj4KKworICA8cD5BbGwgaW1wbGVtZW50YXRpb25zIG9mIDxzdHJvbmc+Q29ubmVjdG9yPC9zdHJvbmc+CisgIHN1cHBvcnQgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOjwvcD4KKworICA8YXR0cmlidXRlcz4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0iYWRkcmVzcyIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgIDxwPkZvciBzZXJ2ZXJzIHdpdGggbW9yZSB0aGFuIG9uZSBJUCBhZGRyZXNzLCB0aGlzIGF0dHJpYnV0ZQorICAgICAgc3BlY2lmaWVzIHdoaWNoIGFkZHJlc3Mgd2lsbCBiZSB1c2VkIGZvciBsaXN0ZW5pbmcgb24gdGhlIHNwZWNpZmllZAorICAgICAgcG9ydC4gIEJ5IGRlZmF1bHQsIHRoaXMgcG9ydCB3aWxsIGJlIHVzZWQgb24gYWxsIElQIGFkZHJlc3NlcworICAgICAgYXNzb2NpYXRlZCB3aXRoIHRoZSBzZXJ2ZXIuPC9wPgorICAgIDwvYXR0cmlidXRlPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJhbGxvd1RyYWNlIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgPHA+QSBib29sZWFuIHZhbHVlIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSBvciBkaXNhYmxlIHRoZSBUUkFDRQorICAgICAgSFRUUCBtZXRob2QuIElmIG5vdCBzcGVjaWZpZWQsIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byBmYWxzZS48L3A+CisgICAgPC9hdHRyaWJ1dGU+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9ImVuYWJsZUxvb2t1cHMiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICA8cD5TZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgeW91IHdhbnQgY2FsbHMgdG8KKyAgICAgIDxjb2RlPnJlcXVlc3QuZ2V0UmVtb3RlSG9zdCgpPC9jb2RlPiB0byBwZXJmb3JtIEROUyBsb29rdXBzIGluCisgICAgICBvcmRlciB0byByZXR1cm4gdGhlIGFjdHVhbCBob3N0IG5hbWUgb2YgdGhlIHJlbW90ZSBjbGllbnQuICBTZXQKKyAgICAgIHRvIDxjb2RlPmZhbHNlPC9jb2RlPiB0byBza2lwIHRoZSBETlMgbG9va3VwIGFuZCByZXR1cm4gdGhlIElQCisgICAgICBhZGRyZXNzIGluIFN0cmluZyBmb3JtIGluc3RlYWQgKHRoZXJlYnkgaW1wcm92aW5nIHBlcmZvcm1hbmNlKS4KKyAgICAgIEJ5IGRlZmF1bHQsIEROUyBsb29rdXBzIGFyZSBlbmFibGVkLjwvcD4KKyAgICA8L2F0dHJpYnV0ZT4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0ibWF4UG9zdFNpemUiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICA8cD5UaGUgbWF4aW11bSBzaXplIGluIGJ5dGVzIG9mIHRoZSBQT1NUIHdoaWNoIHdpbGwgYmUgaGFuZGxlZCBieSAKKyAgICAgIHRoZSBjb250YWluZXIgRk9STSBVUkwgcGFyYW1ldGVyIHBhcnNpbmcuIFRoZSBmZWF0dXJlIGNhbiBiZSBkaXNibGVkIGJ5IAorICAgICAgc2V0dGluZyB0aGlzIGF0dHJpYnV0ZSB0byBhIHZhbHVlIGluZmVyaW9yIG9yIGVxdWFsIHRvIDAuIAorICAgICAgSWYgbm90IHNwZWNpZmllZCwgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIDIwOTcxNTIgKDIgbWVnYWJ5dGVzKS48L3A+CisgICAgPC9hdHRyaWJ1dGU+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9InJlZGlyZWN0UG9ydCIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgIDxwPklmIHRoaXMgPHN0cm9uZz5Db25uZWN0b3I8L3N0cm9uZz4gaXMgc3VwcG9ydGluZyBub24tU1NMCisgICAgICByZXF1ZXN0cywgYW5kIGEgcmVxdWVzdCBpcyByZWNlaXZlZCBmb3Igd2hpY2ggYSBtYXRjaGluZworICAgICAgPGNvZGU+Jmx0O3NlY3VyaXR5LWNvbnN0cmFpbnQmZ3Q7PC9jb2RlPiByZXF1aXJlcyBTU0wgdHJhbnNwb3J0LAorICAgICAgQ2F0YWxpbmEgd2lsbCBhdXRvbWF0aWNhbGx5IHJlZGlyZWN0IHRoZSByZXF1ZXN0IHRvIHRoZSBwb3J0CisgICAgICBudW1iZXIgc3BlY2lmaWVkIGhlcmUuPC9wPgorICAgIDwvYXR0cmlidXRlPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJzY2hlbWUiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICA8cD5TZXQgdGhpcyBhdHRyaWJ1dGUgdG8gdGhlIG5hbWUgb2YgdGhlIHByb3RvY29sIHlvdSB3aXNoIHRvIGhhdmUKKyAgICAgIHJldHVybmVkIGJ5IGNhbGxzIHRvIDxjb2RlPnJlcXVlc3QuZ2V0U2NoZW1lKCk8L2NvZGU+LiAgRm9yCisgICAgICBleGFtcGxlLCB5b3Ugd291bGQgc2V0IHRoaXMgYXR0cmlidXRlIHRvICI8Y29kZT5odHRwczwvY29kZT4iCisgICAgICBmb3IgYW4gU1NMIENvbm5lY3Rvci4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzICI8Y29kZT5odHRwPC9jb2RlPiIuPC9wPgorICAgIDwvYXR0cmlidXRlPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJzZWN1cmUiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICA8cD5TZXQgdGhpcyBhdHRyaWJ1dGUgdG8gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgeW91IHdpc2ggdG8gaGF2ZQorICAgICAgY2FsbHMgdG8gPGNvZGU+cmVxdWVzdC5pc1NlY3VyZSgpPC9jb2RlPiB0byByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4KKyAgICAgIGZvciByZXF1ZXN0cyByZWNlaXZlZCBieSB0aGlzIENvbm5lY3RvciAoeW91IHdvdWxkIHdhbnQgdGhpcyBvbiBhbgorICAgICAgU1NMIENvbm5lY3RvcikuICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT5mYWxzZTwvY29kZT4uPC9wPgorICAgIDwvYXR0cmlidXRlPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJVUklFbmNvZGluZyIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgIDxwPlRoaXMgc3BlY2lmaWVzIHRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcgdXNlZCB0byBkZWNvZGUgdGhlIFVSSSBieXRlcywKKyAgICAgIGFmdGVyICV4eCBkZWNvZGluZyB0aGUgVVJMLiBJZiBub3Qgc3BlY2lmaWVkLCBJU08tODg1OS0xIHdpbGwgYmUgdXNlZC4KKyAgICAgIDwvcD4KKyAgICA8L2F0dHJpYnV0ZT4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0idXNlQm9keUVuY29kaW5nRm9yVVJJIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgPHA+VGhpcyBzcGVjaWZpZXMgaWYgdGhlIGVuY29kaW5nIHNwZWNpZmllZCBpbiBjb250ZW50VHlwZSBzaG91bGQgYmUgdXNlZAorICAgICAgZm9yIFVSSSBxdWVyeSBwYXJhbWV0ZXJzLCBpbnN0ZWFkIG9mIHVzaW5nIHRoZSBVUklFbmNvZGluZy4gVGhpcyAKKyAgICAgIHNldHRpbmcgaXMgcHJlc2VudCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIFRvbWNhdCA0LjEueCwgd2hlcmUgdGhlIAorICAgICAgZW5jb2Rpbmcgc3BlY2lmaWVkIGluIHRoZSBjb250ZW50VHlwZSwgb3IgZXhwbGljaXRlbHkgc2V0IHVzaW5nIAorICAgICAgUmVxdWVzdC5zZXRDaGFyYWN0ZXJFbmNvZGluZyBtZXRob2Qgd2FzIGFsc28gdXNlZCBmb3IgdGhlIHBhcmFtZXRlcnMgZnJvbQorICAgICAgdGhlIFVSTC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+ZmFsc2U8L2NvZGU+LgorICAgICAgPC9wPgorICAgIDwvYXR0cmlidXRlPgorCisgIDwvYXR0cmlidXRlcz4KKworICA8L3N1YnNlY3Rpb24+CisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iU3RhbmRhcmQgSW1wbGVtZW50YXRpb24iPgorCisgIDxwPlRoZSBzdGFuZGFyZCBpbXBsZW1lbnRhdGlvbiBvZiA8c3Ryb25nPkFKUCBDb25uZWN0b3I8L3N0cm9uZz4gaXMKKyAgPHN0cm9uZz5vcmcuYXBhY2hlLmNveW90ZS50b21jYXQ1LkNveW90ZUNvbm5lY3Rvcjwvc3Ryb25nPiwgYnV0IHlvdQorICBtdXN0IHNwZWNpZnkgdGhlIHByb3RvY29sIGF0dHJpYnV0ZSAoc2VlIGJlbG93KS48L3A+CisKKyAgPHA+PHN0cm9uZz5UaGlzIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIHRoZSBBSlAgMS4zIHByb3RvY29sLjwvc3Ryb25nPjwvcD4KKworICA8cD5JdCBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgYXR0cmlidXRlcyAoaW4gYWRkaXRpb24gdG8gdGhlCisgIGNvbW1vbiBhdHRyaWJ1dGVzIGxpc3RlZCBhYm92ZSk6PC9wPgorCisgIDxhdHRyaWJ1dGVzPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJwcm90b2NvbCIgcmVxdWlyZWQ9InRydWUiPgorICAgICAgPHA+VGhpcyBhdHRyaWJ1dGUgdmFsdWUgbXVzdCBiZSA8Y29kZT5BSlAvMS4zPC9jb2RlPiB0byB1c2UgdGhlIEFKUAorICAgICAgaGFuZGxlci48L3A+CisgICAgPC9hdHRyaWJ1dGU+CisKKyAgPC9hdHRyaWJ1dGVzPgorCisgIDwvc3Vic2VjdGlvbj4KKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9Ik5lc3RlZCBDb21wb25lbnRzIj4KKworICA8cD5Ob25lIGF0IHRoaXMgdGltZS48L3A+CisKKzwvc2VjdGlvbj4KKworCis8L2JvZHk+CisKKzwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9kb2NzL2NvbmZpZy9jb250ZXh0LnhtbCBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvY29uZmlnL2NvbnRleHQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3Y2FlM2QKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2NvbmZpZy9jb250ZXh0LnhtbApAQCAtMCwwICsxLDc1MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IURPQ1RZUEUgZG9jdW1lbnQgWworICA8IUVOVElUWSBwcm9qZWN0IFNZU1RFTSAicHJvamVjdC54bWwiPgorXT4KKzxkb2N1bWVudCB1cmw9ImNvbnRleHQuaHRtbCI+CisKKyAgJnByb2plY3Q7CisKKyAgPHByb3BlcnRpZXM+CisgICAgPGF1dGhvciBlbWFpbD0iY3JhaWdtY2NAYXBhY2hlLm9yZyI+Q3JhaWcgUi4gTWNDbGFuYWhhbjwvYXV0aG9yPgorICAgIDx0aXRsZT5UaGUgQ29udGV4dCBDb250YWluZXI8L3RpdGxlPgorICA8L3Byb3BlcnRpZXM+CisKKzxib2R5PgorCisKKzxzZWN0aW9uIG5hbWU9IkludHJvZHVjdGlvbiI+CisKKyAgPHA+VGhlIDxzdHJvbmc+Q29udGV4dDwvc3Ryb25nPiBlbGVtZW50IHJlcHJlc2VudHMgYSA8ZW0+d2ViCisgIGFwcGxpY2F0aW9uPC9lbT4sIHdoaWNoIGlzIHJ1biB3aXRoaW4gYSBwYXJ0aWN1bGFyIHZpcnR1YWwgaG9zdC4KKyAgRWFjaCB3ZWIgYXBwbGljYXRpb24gaXMgYmFzZWQgb24gYSA8ZW0+V2ViIEFwcGxpY2F0aW9uIEFyY2hpdmU8L2VtPgorICAoV0FSKSBmaWxlLCBvciBhIGNvcnJlc3BvbmRpbmcgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGNvcnJlc3BvbmRpbmcKKyAgdW5wYWNrZWQgY29udGVudHMsIGFzIGRlc2NyaWJlZCBpbiB0aGUgU2VydmxldCBTcGVjaWZpY2F0aW9uICh2ZXJzaW9uCisgIDIuMiBvciBsYXRlcikuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB3ZWIgYXBwbGljYXRpb24gYXJjaGl2ZXMsCisgIHlvdSBjYW4gZG93bmxvYWQgdGhlCisgIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvc2VydmxldC9kb3dubG9hZC5odG1sIj5TZXJ2bGV0CisgIFNwZWNpZmljYXRpb248L2E+LCBhbmQgcmV2aWV3IHRoZSBUb21jYXQKKyAgPGEgaHJlZj0iLi4vYXBwZGV2L2luZGV4Lmh0bWwiPkFwcGxpY2F0aW9uIERldmVsb3BlcidzIEd1aWRlPC9hPi48L3A+CisKKyAgPHA+VGhlIHdlYiBhcHBsaWNhdGlvbiB1c2VkIHRvIHByb2Nlc3MgZWFjaCBIVFRQIHJlcXVlc3QgaXMgc2VsZWN0ZWQKKyAgYnkgQ2F0YWxpbmEgYmFzZWQgb24gbWF0Y2hpbmcgdGhlIGxvbmdlc3QgcG9zc2libGUgcHJlZml4IG9mIHRoZQorICBSZXF1ZXN0IFVSSSBhZ2FpbnN0IHRoZSA8ZW0+Y29udGV4dCBwYXRoPC9lbT4gb2YgZWFjaCBkZWZpbmVkIENvbnRleHQuCisgIE9uY2Ugc2VsZWN0ZWQsIHRoYXQgQ29udGV4dCB3aWxsIHNlbGVjdCBhbiBhcHByb3ByaWF0ZSBzZXJ2bGV0IHRvCisgIHByb2Nlc3MgdGhlIGluY29taW5nIHJlcXVlc3QsIGFjY29yZGluZyB0byB0aGUgc2VydmxldCBtYXBwaW5ncyBkZWZpbmVkCisgIGluIHRoZSA8ZW0+d2ViIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQgZGVzY3JpcHRvcjwvZW0+IGZpbGUgKHdoaWNoIE1VU1QKKyAgYmUgbG9jYXRlZCBhdCA8Y29kZT4vV0VCLUlORi93ZWIueG1sPC9jb2RlPiB3aXRoaW4gdGhlIHdlYiBhcHAncworICBkaXJlY3RvcnkgaGllcmFyY2h5KS48L3A+CisKKyAgPHA+WW91IG1heSBkZWZpbmUgYXMgbWFueSA8c3Ryb25nPkNvbnRleHQ8L3N0cm9uZz4gZWxlbWVudHMgYXMgeW91CisgIHdpc2guICBFYWNoIHN1Y2ggQ29udGV4dCBNVVNUIGhhdmUgYSB1bmlxdWUKKyAgY29udGV4dCBwYXRoLCB3aGljaCBpcyBkZWZpbmVkIGJ5IHRoZSA8Y29kZT5wYXRoPC9jb2RlPiBhdHRyaWJ1dGUuCisgIEluIGFkZGl0aW9uLCB5b3UgTVVTVCBkZWZpbmUgYSBDb250ZXh0IHdpdGggYSBjb250ZXh0IHBhdGggZXF1YWwgdG8KKyAgYSB6ZXJvLWxlbmd0aCBzdHJpbmcuICBUaGlzIENvbnRleHQgYmVjb21lcyB0aGUgPGVtPmRlZmF1bHQ8L2VtPgorICB3ZWIgYXBwbGljYXRpb24gZm9yIHRoaXMgdmlydHVhbCBob3N0LCBhbmQgaXMgdXNlZCB0byBwcm9jZXNzIGFsbAorICByZXF1ZXN0cyB0aGF0IGRvIG5vdCBtYXRjaCBhbnkgb3RoZXIgQ29udGV4dCdzIGNvbnRleHQgcGF0aC48L3A+CisKKyAgPHA+SW4gYWRkaXRpb24gdG8gbmVzdGluZyA8c3Ryb25nPkNvbnRleHQ8L3N0cm9uZz4gZWxlbWVudHMgaW5zaWRlIGEKKyAgPGEgaHJlZj0iaG9zdC5odG1sIj5Ib3N0PC9hPiBlbGVtZW50LCB5b3UgY2FuIGFsc28gc3RvcmUgdGhlbTo8L3A+CisgIDx1bD4KKyAgPGxpPmluIHRoZSBpbmRpdmlkdWFsIDxjb2RlPiRDQVRBTElOQV9IT01FL2NvbmYvY29udGV4dC54bWw8L2NvZGU+IGZpbGU6IAorICB0aGUgQ29udGV4dCBlbGVtZW50IGluZm9ybWF0aW9uIHdpbGwgYmUgbG9hZGVkIGJ5IGFsbCB3ZWJhcHBzPC9saT4KKyAgPGxpPmluIHRoZSBpbmRpdmlkdWFsIAorICA8Y29kZT4kQ0FUQUxJTkFfSE9NRS9jb25mL1tlbmdpbmVuYW1lXS9baG9zdG5hbWVdL2NvbnRleHQueG1sLmRlZmF1bHQ8L2NvZGU+CisgIGZpbGU6IHRoZSBDb250ZXh0IGVsZW1lbnQgaW5mb3JtYXRpb24gd2lsbCBiZSBsb2FkZWQgYnkgYWxsIHdlYmFwcHMgb2YgdGhhdAorICBob3N0PC9saT4KKyAgPGxpPmluIGluZGl2aWR1YWwgZmlsZXMgKHdpdGggYSAiLnhtbCIgZXh0ZW5zaW9uKSBpbiB0aGUgCisgIDxjb2RlPiRDQVRBTElOQV9IT01FL2NvbmYvW2VuZ2luZW5hbWVdL1tob3N0bmFtZV0vPC9jb2RlPiBkaXJlY3Rvcnk8L2xpPgorICA8bGk+aWYgdGhlIHByZXZpb3VzIGZpbGUgd2FzIG5vdCBmb3VuZCBmb3IgdGhpcyBhcHBsaWNhdGlvbiwgaW4gaW5kaXZpZHVhbCBmaWxlCisgIGF0IDxjb2RlPi9NRVRBLUlORi9jb250ZXh0LnhtbDwvY29kZT4gaW5zaWRlIHRoZSBhcHBsaWNhdGlvbiBmaWxlczwvbGk+CisgIDwvdWw+CisgIDxwPlNlZQorICA8YSBocmVmPSJob3N0Lmh0bWwjQXV0b21hdGljIEFwcGxpY2F0aW9uIERlcGxveW1lbnQiPkF1dG9tYXRpYworICBBcHBsaWNhdGlvbiBEZXBsb3ltZW50PC9hPiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gVGhpcyBtZXRob2QgYWxsb3dzIGR5bmFtaWMKKyAgcmVjb25maWd1cmF0aW9uIG9mIHRoZSB3ZWIgYXBwbGljYXRpb24sIHNpbmNlIHRoZSBtYWluIAorICA8Y29kZT5jb25mL3NlcnZlci54bWw8L2NvZGU+IGZpbGUgY2Fubm90IGJlIHJlbG9hZGVkIHdpdGhvdXQgcmVzdGFydGluZworICBUb21jYXQuIDxiPlBsZWFzZSBub3RlIHRoYXQgZm9yIHRvbWNhdCA1LCB1bmxpa2UgdG9tY2F0IDQueCwgaXQgaXMgTk9UCisgIHJlY29tbWVuZGVkIHRvIHBsYWNlICZsdDtDb250ZXh0Jmd0OyBlbGVtZW50cyBkaXJlY3RseSBpbiB0aGUgc2VydmVyLnhtbCBmaWxlLjwvYj4KKyAgSW5zdGVhZCwgcHV0IHRoZW0gaW4gdGhlIE1FVEEtSU5GL2NvbnRleHQueG1sIGRpcmVjdG9yeSBvZiB5b3VyIFdBUiBmaWxlIG9yCisgIHRoZSBjb25mIGRpcmVjdG9yeSBhcyBkZXNjcmliZWQgYWJvdmUuCisgIDwvcD4KKworICA8cD5JbiBhZGRpdGlvbiB0byBleHBsaWNpdGx5IHNwZWNpZmllZCBDb250ZXh0IGVsZW1lbnRzLCB0aGVyZSBhcmUKKyAgc2V2ZXJhbCB0ZWNobmlxdWVzIGJ5IHdoaWNoIENvbnRleHQgZWxlbWVudHMgY2FuIGJlIGNyZWF0ZWQgYXV0b21hdGljYWxseQorICBmb3IgeW91LiAgU2VlIDxhIGhyZWY9Imhvc3QuaHRtbCNBdXRvbWF0aWMgQXBwbGljYXRpb24gRGVwbG95bWVudCI+CisgIEF1dG9tYXRpYyBBcHBsaWNhdGlvbiBEZXBsb3ltZW50PC9hPiBhbmQKKyAgPGEgaHJlZj0iaG9zdC5odG1sI1VzZXIgV2ViIEFwcGxpY2F0aW9ucyI+VXNlciBXZWIgQXBwbGljYXRpb25zPC9hPgorICBmb3IgbW9yZSBpbmZvcm1hdGlvbi48L3A+CisKKyAgICA8YmxvY2txdW90ZT48ZW0+CisgICAgPHA+VGhlIGRlc2NyaXB0aW9uIGJlbG93IHVzZXMgdGhlIHZhcmlhYmxlIG5hbWUgJENBVEFMSU5BX0hPTUUKKyAgICB0byByZWZlciB0byB0aGUgZGlyZWN0b3J5IGludG8gd2hpY2ggeW91IGhhdmUgaW5zdGFsbGVkIFRvbWNhdCA1LAorICAgIGFuZCBpcyB0aGUgYmFzZSBkaXJlY3RvcnkgYWdhaW5zdCB3aGljaCBtb3N0IHJlbGF0aXZlIHBhdGhzIGFyZQorICAgIHJlc29sdmVkLiAgSG93ZXZlciwgaWYgeW91IGhhdmUgY29uZmlndXJlZCBUb21jYXQgNSBmb3IgbXVsdGlwbGUKKyAgICBpbnN0YW5jZXMgYnkgc2V0dGluZyBhIENBVEFMSU5BX0JBU0UgZGlyZWN0b3J5LCB5b3Ugc2hvdWxkIHVzZQorICAgICRDQVRBTElOQV9CQVNFIGluc3RlYWQgb2YgJENBVEFMSU5BX0hPTUUgZm9yIGVhY2ggb2YgdGhlc2UKKyAgICByZWZlcmVuY2VzLjwvcD4KKyAgICA8L2VtPjwvYmxvY2txdW90ZT4KKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IkF0dHJpYnV0ZXMiPgorCisgIDxzdWJzZWN0aW9uIG5hbWU9IkNvbW1vbiBBdHRyaWJ1dGVzIj4KKworICAgIDxwPkFsbCBpbXBsZW1lbnRhdGlvbnMgb2YgPHN0cm9uZz5Db250ZXh0PC9zdHJvbmc+CisgICAgc3VwcG9ydCB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6PC9wPgorCisgICAgPGF0dHJpYnV0ZXM+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYmFja2dyb3VuZFByb2Nlc3NvckRlbGF5IiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgICA8cD5UaGlzIHZhbHVlIHJlcHJlc2VudHMgdGhlIGRlbGF5IGluIHNlY29uZHMgYmV0d2VlbiB0aGUgCisgICAgICAgIGludm9jYXRpb24gb2YgdGhlIGJhY2tncm91bmRQcm9jZXNzIG1ldGhvZCBvbiB0aGlzIGNvbnRleHQgYW5kIAorICAgICAgICBpdHMgY2hpbGQgY29udGFpbmVycywgaW5jbHVkaW5nIGFsbCB3cmFwcGVycy4gCisgICAgICAgIENoaWxkIGNvbnRhaW5lcnMgd2lsbCBub3QgYmUgaW52b2tlZCBpZiB0aGVpciBkZWxheSB2YWx1ZSBpcyBub3QgCisgICAgICAgIG5lZ2F0aXZlICh3aGljaCB3b3VsZCBtZWFuIHRoZXkgYXJlIHVzaW5nIHRoZWlyIG93biBwcm9jZXNzaW5nIAorICAgICAgICB0aHJlYWQpLiBTZXR0aW5nIHRoaXMgdG8gYSBwb3NpdGl2ZSB2YWx1ZSB3aWxsIGNhdXNlIAorICAgICAgICBhIHRocmVhZCB0byBiZSBzcGF3bi4gQWZ0ZXIgd2FpdGluZyB0aGUgc3BlY2lmaWVkIGFtb3VudCBvZiB0aW1lLCAKKyAgICAgICAgdGhlIHRocmVhZCB3aWxsIGludm9rZSB0aGUgYmFja2dyb3VuZFByb2Nlc3MgbWV0aG9kIG9uIHRoaXMgaG9zdCAKKyAgICAgICAgYW5kIGFsbCBpdHMgY2hpbGQgY29udGFpbmVycy4gQSBjb250ZXh0IHdpbGwgdXNlIGJhY2tncm91bmQgCisgICAgICAgIHByb2Nlc3NpbmcgdG8gcGVyZm9ybSBzZXNzaW9uIGV4cGlyYXRpb24gYW5kIGNsYXNzIG1vbml0b3JpbmcgZm9yCisgICAgICAgIHJlbG9hZGluZy4gSWYgbm90IHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMgYXR0cmlidXRlIGlzIAorICAgICAgICAtMSwgd2hpY2ggbWVhbnMgdGhlIGNvbnRleHQgd2lsbCByZWx5IG9uIHRoZSBiYWNrZ3JvdW5kIHByb2Nlc3NpbmcgCisgICAgICAgIHRocmVhZCBvZiBpdHMgcGFyZW50IGhvc3QuPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NOYW1lIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgICA8cD5KYXZhIGNsYXNzIG5hbWUgb2YgdGhlIGltcGxlbWVudGF0aW9uIHRvIHVzZS4gIFRoaXMgY2xhc3MgbXVzdAorICAgICAgICBpbXBsZW1lbnQgdGhlIDxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGV4dDwvY29kZT4gaW50ZXJmYWNlLgorICAgICAgICBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgc3RhbmRhcmQgdmFsdWUgKGRlZmluZWQgYmVsb3cpIHdpbGwgYmUgdXNlZC48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb29raWVzIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgICA8cD5TZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgeW91IHdhbnQgY29va2llcyB0byBiZSB1c2VkIGZvcgorICAgICAgICBzZXNzaW9uIGlkZW50aWZpZXIgY29tbXVuaWNhdGlvbiBpZiBzdXBwb3J0ZWQgYnkgdGhlIGNsaWVudCAodGhpcworICAgICAgICBpcyB0aGUgZGVmYXVsdCkuICBTZXQgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHlvdSB3YW50IHRvIGRpc2FibGUKKyAgICAgICAgdGhlIHVzZSBvZiBjb29raWVzIGZvciBzZXNzaW9uIGlkZW50aWZpZXIgY29tbXVuaWNhdGlvbiwgYW5kIHJlbHkKKyAgICAgICAgb25seSBvbiBVUkwgcmV3cml0aW5nIGJ5IHRoZSBhcHBsaWNhdGlvbi48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjcm9zc0NvbnRleHQiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPlNldCB0byA8Y29kZT50cnVlPC9jb2RlPiBpZiB5b3Ugd2FudCBjYWxscyB3aXRoaW4gdGhpcyBhcHBsaWNhdGlvbgorICAgICAgICB0byA8Y29kZT5TZXJ2bGV0Q29udGV4dC5nZXRDb250ZXh0KCk8L2NvZGU+IHRvIHN1Y2Nlc3NmdWxseSByZXR1cm4gYQorICAgICAgICByZXF1ZXN0IGRpc3BhdGNoZXIgZm9yIG90aGVyIHdlYiBhcHBsaWNhdGlvbnMgcnVubmluZyBvbiB0aGlzIHZpcnR1YWwKKyAgICAgICAgaG9zdC4gIFNldCB0byA8Y29kZT5mYWxzZTwvY29kZT4gKHRoZSBkZWZhdWx0KSBpbiBzZWN1cml0eQorICAgICAgICBjb25zY2lvdXMgZW52aXJvbm1lbnRzLCB0byBtYWtlIDxjb2RlPmdldENvbnRleHQoKTwvY29kZT4gYWx3YXlzCisgICAgICAgIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkb2NCYXNlIiByZXF1aXJlZD0idHJ1ZSI+CisgICAgICAgIDxwPlRoZSA8ZW0+RG9jdW1lbnQgQmFzZTwvZW0+IChhbHNvIGtub3duIGFzIHRoZSA8ZW0+Q29udGV4dAorICAgICAgICBSb290PC9lbT4pIGRpcmVjdG9yeSBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24sIG9yIHRoZSBwYXRobmFtZQorICAgICAgICB0byB0aGUgd2ViIGFwcGxpY2F0aW9uIGFyY2hpdmUgZmlsZSAoaWYgdGhpcyB3ZWIgYXBwbGljYXRpb24gaXMKKyAgICAgICAgYmVpbmcgZXhlY3V0ZWQgZGlyZWN0bHkgZnJvbSB0aGUgV0FSIGZpbGUpLiAgICBZb3UgbWF5IHNwZWNpZnkKKyAgICAgICAgYW4gYWJzb2x1dGUgcGF0aG5hbWUgZm9yIHRoaXMgZGlyZWN0b3J5IG9yIFdBUiBmaWxlLCBvciBhIHBhdGhuYW1lCisgICAgICAgIHRoYXQgaXMgcmVsYXRpdmUgdG8gdGhlIDxjb2RlPmFwcEJhc2U8L2NvZGU+IGRpcmVjdG9yeSBvZiB0aGUKKyAgICAgICAgb3duaW5nIDxhIGhyZWY9Imhvc3QuaHRtbCI+SG9zdDwvYT4uPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ib3ZlcnJpZGUiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPlNldCB0byA8Y29kZT50cnVlPC9jb2RlPiB0byBoYXZlIGV4cGxpY2l0IHNldHRpbmdzIGluIHRoaXMKKyAgICAgICAgQ29udGV4dCBlbGVtZW50IG92ZXJyaWRlIGFueSBjb3JyZXNwb25kaW5nIHNldHRpbmdzIGluIHRoZQorICAgICAgICA8YSBocmVmPSJkZWZhdWx0Y29udGV4dC5odG1sIj5EZWZhdWx0Q29udGV4dDwvYT4gZWxlbWVudCBhc3NvY2lhdGVkCisgICAgICAgIHdpdGggb3VyIG93bmluZyA8YSBocmVmPSJob3N0Lmh0bWwiPkhvc3Q8L2E+LiAgQnkgZGVmYXVsdCwgc2V0dGluZ3MKKyAgICAgICAgaW4gdGhlIERlZmF1bHRDb250ZXh0IGVsZW1lbnQgd2lsbCBiZSB1c2VkLjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9InByaXZpbGVnZWQiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPlNldCB0byA8Y29kZT50cnVlPC9jb2RlPiB0byBhbGxvdyB0aGlzIGNvbnRleHQgdG8gdXNlIGNvbnRhaW5lcgorICAgICAgICBzZXJ2bGV0cywgbGlrZSB0aGUgbWFuYWdlciBzZXJ2bGV0LjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9InBhdGgiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPlRoZSA8ZW0+Y29udGV4dCBwYXRoPC9lbT4gb2YgdGhpcyB3ZWIgYXBwbGljYXRpb24sIHdoaWNoIGlzCisgICAgICAgIG1hdGNoZWQgYWdhaW5zdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggcmVxdWVzdCBVUkkgdG8gc2VsZWN0IHRoZQorICAgICAgICBhcHByb3ByaWF0ZSB3ZWIgYXBwbGljYXRpb24gZm9yIHByb2Nlc3NpbmcuICBBbGwgb2YgdGhlIGNvbnRleHQgcGF0aHMKKyAgICAgICAgd2l0aGluIGEgcGFydGljdWxhciA8YSBocmVmPSJob3N0Lmh0bWwiPkhvc3Q8L2E+IG11c3QgYmUgdW5pcXVlLgorICAgICAgICBJZiB5b3Ugc3BlY2lmeSBhIGNvbnRleHQgcGF0aCBvZiBhbiBlbXB0eSBzdHJpbmcgKCIiKSwgeW91IGFyZQorICAgICAgICBkZWZpbmluZyB0aGUgPGVtPmRlZmF1bHQ8L2VtPiB3ZWIgYXBwbGljYXRpb24gZm9yIHRoaXMgSG9zdCwgd2hpY2gKKyAgICAgICAgd2lsbCBwcm9jZXNzIGFsbCByZXF1ZXN0cyBub3QgYXNzaWduZWQgdG8gb3RoZXIgQ29udGV4dHMuIFRoZSB2YWx1ZSBvZgorICAgICAgICB0aGlzIGZpZWxkIG11c3Qgbm90IGJlIHNldCBtb3N0IG9mIHRoZSB0aW1lLCBhcyBpdCB3aWxsIGJlIGluZmVyZWQgZnJvbQorICAgICAgICB0aGUgZmlsZW5hbWVzIHVzZWQgZm9yIGVpdGhlciB0aGUgLnhtbCBjb250ZXh0IGZpbGUgb2YgdGhlIGRvY0Jhc2UuPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icmVsb2FkYWJsZSIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+U2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+IGlmIHlvdSB3YW50IENhdGFsaW5hIHRvIG1vbml0b3IgY2xhc3NlcyBpbgorICAgICAgICA8Y29kZT4vV0VCLUlORi9jbGFzc2VzLzwvY29kZT4gYW5kIDxjb2RlPi9XRUItSU5GL2xpYjwvY29kZT4gZm9yCisgICAgICAgIGNoYW5nZXMsIGFuZCBhdXRvbWF0aWNhbGx5IHJlbG9hZCB0aGUgd2ViIGFwcGxpY2F0aW9uIGlmIGEgY2hhbmdlCisgICAgICAgIGlzIGRldGVjdGVkLiAgVGhpcyBmZWF0dXJlIGlzIHZlcnkgdXNlZnVsIGR1cmluZyBhcHBsaWNhdGlvbgorICAgICAgICBkZXZlbG9wbWVudCwgYnV0IGl0IHJlcXVpcmVzIHNpZ25pZmljYW50IHJ1bnRpbWUgb3ZlcmhlYWQgYW5kIGlzCisgICAgICAgIG5vdCByZWNvbW1lbmRlZCBmb3IgdXNlIG9uIGRlcGxveWVkIHByb2R1Y3Rpb24gYXBwbGljYXRpb25zLiAgVGhhdCdzCisgICAgICAgIHdoeSB0aGUgZGVmYXVsdCBzZXR0aW5nIGZvciB0aGlzIGF0dHJpYnV0ZSBpcyA8aT5mYWxzZTwvaT4uICBZb3UKKyAgICAgICAgY2FuIHVzZSB0aGUgPGEgaHJlZj0iLi4vbWFuYWdlci1ob3d0by5odG1sIj5NYW5hZ2VyPC9hPiB3ZWIKKyAgICAgICAgYXBwbGljYXRpb24sIGhvd2V2ZXIsIHRvIHRyaWdnZXIgcmVsb2FkcyBvZiBkZXBsb3llZCBhcHBsaWNhdGlvbnMKKyAgICAgICAgb24gZGVtYW5kLjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9IndyYXBwZXJDbGFzcyIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+SmF2YSBjbGFzcyBuYW1lIG9mIHRoZSA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLldyYXBwZXI8L2NvZGU+CisgICAgICAgIGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQgd2lsbCBiZSB1c2VkIGZvciBzZXJ2bGV0cyBtYW5hZ2VkIGJ5IHRoaXMKKyAgICAgICAgQ29udGV4dC4gIElmIG5vdCBzcGVjaWZpZWQsIGEgc3RhbmRhcmQgZGVmYXVsdCB2YWx1ZSB3aWxsIGJlIHVzZWQuPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICA8L2F0dHJpYnV0ZXM+CisKKyAgPC9zdWJzZWN0aW9uPgorCisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iU3RhbmRhcmQgSW1wbGVtZW50YXRpb24iPgorCisgICAgPHA+VGhlIHN0YW5kYXJkIGltcGxlbWVudGF0aW9uIG9mIDxzdHJvbmc+Q29udGV4dDwvc3Ryb25nPiBpcworICAgIDxzdHJvbmc+b3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkQ29udGV4dDwvc3Ryb25nPi4KKyAgICBJdCBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgYXR0cmlidXRlcyAoaW4gYWRkaXRpb24gdG8gdGhlCisgICAgY29tbW9uIGF0dHJpYnV0ZXMgbGlzdGVkIGFib3ZlKTo8L3A+CisKKyAgICA8YXR0cmlidXRlcz4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJhbGxvd0xpbmtpbmciIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPklmIHRoZSB2YWx1ZSBvZiB0aGlzIGZsYWcgaXMgPGNvZGU+dHJ1ZTwvY29kZT4sIHN5bWxpbmtzIHdpbGwgYmUKKyAgICAgICAgYWxsb3dlZCBpbnNpZGUgdGhlIHdlYiBhcHBsaWNhdGlvbiwgcG9pbnRpbmcgdG8gcmVzb3VyY2VzIG91dHNpZGUgdGhlCisgICAgICAgIHdlYiBhcHBsaWNhdGlvbiBiYXNlIHBhdGguIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0IHZhbHVlCisgICAgICAgIG9mIHRoZSBmbGFnIGlzIDxjb2RlPmZhbHNlPC9jb2RlPi48L3A+CisgICAgICAgIDxwPjxiPk5PVEU6IFRoaXMgZmxhZyBNVVNUIE5PVCBiZSBzZXQgdG8gdHJ1ZSBvbiB0aGUgV2luZG93cyBwbGF0Zm9ybQorICAgICAgICAob3IgYW55IG90aGVyIE9TIHdoaWNoIGRvZXMgbm90IGhhdmUgYSBjYXNlIHNlbnNpdGl2ZSBmaWxlc3lzdGVtKSwKKyAgICAgICAgYXMgaXQgd2lsbCBkaXNhYmxlIGNhc2Ugc2Vuc2l0aXZpdHkgY2hlY2tzLCBhbGxvd2luZyBKU1Agc291cmNlIGNvZGUKKyAgICAgICAgZGlzY2xvc3VyZSwgYW1vbmcgb3RoZXIgc2VjdXJpdHkgcHJvYmxlbXMuPC9iPjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9ImFudGlKQVJMb2NraW5nIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgICA8cD5JZiB0cnVlLCB0aGUgVG9tY2F0IGNsYXNzbG9hZGVyIHdpbGwgdGFrZSBleHRyYSBtZWFzdXJlcyB0byBhdm9pZAorICAgICAgICBKQVIgZmlsZSBsb2NraW5nIHdoZW4gcmVzb3VyY2VzIGFyZSBhY2Nlc3NlZCBpbnNpZGUgSkFScyB0aHJvdWdoIFVSTHMuCisgICAgICAgIFRoaXMgd2lsbCBpbXBhY3Qgc3RhcnR1cCB0aW1lIG9mIGFwcGxpY2F0aW9ucywgYnV0IGNvdWxkIHByb3ZlIHRvIGJlIHVzZWZ1bAorICAgICAgICBvbiBwbGF0Zm9ybXMgb3IgY29uZmlndXJhdGlvbnMgd2hlcmUgZmlsZSBsb2NraW5nIGNhbiBvY2N1ci4KKyAgICAgICAgSWYgbm90IHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+ZmFsc2U8L2NvZGU+LjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9ImFudGlSZXNvdXJjZUxvY2tpbmciIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPklmIHRydWUsIFRvbWNhdCB3aWxsIHByZXZlbnQgYW55IGZpbGUgbG9ja2luZy4KKyAgICAgICAgVGhpcyB3aWxsIHNpZ25pZmljYW50bHkgaW1wYWN0IHN0YXJ0dXAgdGltZSBvZiBhcHBsaWNhdGlvbnMsIAorICAgICAgICBidXQgYWxsb3dzIGZ1bGwgd2ViYXBwIGhvdCBkZXBsb3kgYW5kIHVuZGVwbG95IG9uIHBsYXRmb3JtcyAKKyAgICAgICAgb3IgY29uZmlndXJhdGlvbnMgd2hlcmUgZmlsZSBsb2NraW5nIGNhbiBvY2N1ci4KKyAgICAgICAgSWYgbm90IHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+ZmFsc2U8L2NvZGU+LjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNhY2hlTWF4U2l6ZSIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+TWF4aW11bSBzaXplIG9mIHRoZSBzdGF0aWMgcmVzb3VyY2UgY2FjaGUgaW4ga2lsb2J5dGVzLiAKKyAgICAgICAgSWYgbm90IHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+MTAyNDA8L2NvZGU+CisgICAgICAgICgxMCBtZWdhYnl0ZXMpLjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNhY2hlVFRMIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgICA8cD5BbW91bnQgb2YgdGltZSBpbiBtaWxsaXNlY29uZHMgYmV0d2VlbiBjYWNoZSBlbnRyaWVzIHJldmFsaWRhdGlvbi4KKyAgICAgICAgSWYgbm90IHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+NTAwMDwvY29kZT4gCisgICAgICAgICg1IHNlY29uZHMpLjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNhY2hpbmdBbGxvd2VkIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgICA8cD5JZiB0aGUgdmFsdWUgb2YgdGhpcyBmbGFnIGlzIDxjb2RlPnRydWU8L2NvZGU+LCB0aGUgY2FjaGUgZm9yIHN0YXRpYworICAgICAgICByZXNvdXJjZXMgd2lsbCBiZSB1c2VkLiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCB2YWx1ZQorICAgICAgICBvZiB0aGUgZmxhZyBpcyA8Y29kZT50cnVlPC9jb2RlPi48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjYXNlU2Vuc2l0aXZlIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgICA8cD5JZiB0aGUgdmFsdWUgb2YgdGhpcyBmbGFnIGlzIDxjb2RlPnRydWU8L2NvZGU+LCBhbGwgY2FzZSBzZW5zaXRpdml0eQorICAgICAgICBjaGVja3Mgd2lsbCBiZSBkaXNhYmxlZC4gSWYgbm90IAorICAgICAgICBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBmbGFnIGlzIDxjb2RlPnRydWU8L2NvZGU+LjwvcD4KKyAgICAgICAgPHA+PGI+Tk9URTogVGhpcyBmbGFnIE1VU1QgTk9UIGJlIHNldCB0byBmYWxzZSBvbiB0aGUgV2luZG93cyBwbGF0Zm9ybQorICAgICAgICAob3IgYW55IG90aGVyIE9TIHdoaWNoIGRvZXMgbm90IGhhdmUgYSBjYXNlIHNlbnNpdGl2ZSBmaWxlc3lzdGVtKSwKKyAgICAgICAgYXMgaXQgd2lsbCBkaXNhYmxlIGNhc2Ugc2Vuc2l0aXZpdHkgY2hlY2tzLCBhbGxvd2luZyBKU1Agc291cmNlIGNvZGUKKyAgICAgICAgZGlzY2xvc3VyZSwgYW1vbmcgb3RoZXIgc2VjdXJpdHkgcHJvYmxlbXMuPC9iPjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9Im1hbmFnZXJDaGVja3NGcmVxdWVuY3kiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPkZyZXF1ZW5jeSBvZiB0aGUgc2Vzc2lvbiBleHBpcmF0aW9uLCBhbmQgcmVsYXRlZCBtYW5hZ2VyIG9wZXJhdGlvbnMuCisgICAgICAgIE1hbmFnZXIgb3BlcmF0aW9ucyB3aWxsIGJlIGRvbmUgb25jZSBmb3IgdGhlIHNwZWNpZmllZCBhbW91bnQgb2YKKyAgICAgICAgYmFja2dyb25kUHJvY2VzcyBjYWxscyAoaWUsIHRoZSBsb3dlciB0aGUgYW1vdW50LCB0aGUgbW9zdCBvZnRlbiB0aGUKKyAgICAgICAgY2hlY2tzIHdpbGwgb2NjdXIpLiBUaGUgbWluaW11bSB2YWx1ZSBpcyAxLCBhbmQgdGhlIGRlZmF1bHQgdmFsdWUgaXMgNi4KKyAgICAgICAgPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icHJvY2Vzc1RsZHMiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPldoZXRoZXIgdGhlIGNvbnRleHQgc2hvdWxkIHByb2Nlc3MgVExEcyBvbiBzdGFydHVwLiAgVGhlIGRlZmF1bHQKKyAgICAgICAgaXMgdHJ1ZS4gIFRoZSBmYWxzZSBzZXR0aW5nIGlzIGludGVuZGVkIGZvciBzcGVjaWFsIGNhc2VzCisgICAgICAgIHRoYXQga25vdyBpbiBhZHZhbmNlIFRMRHMgYXJlIG5vdCBwYXJ0IG9mIHRoZSB3ZWJhcHAuPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3dhbGxvd091dHB1dCIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+SWYgdGhlIHZhbHVlIG9mIHRoaXMgZmxhZyBpcyA8Y29kZT50cnVlPC9jb2RlPiwgdGhlIGJ5dGVzIG91dHB1dCB0bworICAgICAgICBTeXN0ZW0ub3V0IGFuZCBTeXN0ZW0uZXJyIGJ5IHRoZSB3ZWIgYXBwbGljYXRpb24gd2lsbCBiZSByZWRpcmVjdGVkIHRvCisgICAgICAgIHRoZSB3ZWIgYXBwbGljYXRpb24gbG9nZ2VyLiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCB2YWx1ZQorICAgICAgICBvZiB0aGUgZmxhZyBpcyA8Y29kZT5mYWxzZTwvY29kZT4uPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idGxkTmFtZXNwYWNlQXdhcmUiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPklmIHRoZSB2YWx1ZSBvZiB0aGlzIGZsYWcgaXMgPGNvZGU+dHJ1ZTwvY29kZT4sIHRoZSBUTEQgZmlsZXMKKyAgICAgICAgWE1MIHZhbGlkYXRpb24gd2lsbCBiZSBuYW1lc3BhY2UtYXdhcmUuICBJZiB5b3UgdHVybiB0aGlzIGZsYWcgb24sCisgICAgICAgIHlvdSBzaG91bGQgcHJvYmFibHkgYWxzbyB0dXJuIDxjb2RlPnRsZFZhbGlkYXRpb248L2NvZGU+IG9uLiAgVGhlCisgICAgICAgIGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMgZmxhZyBpcyA8Y29kZT5mYWxzZTwvY29kZT4sIGFuZCBzZXR0aW5nIGl0CisgICAgICAgIHRvIHRydWUgd2lsbCBpbmN1ciBhIHBlcmZvcm1hbmNlIHBlbmFsdHkuCisgICAgICAgIDwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9InRsZFZhbGlkYXRpb24iIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPklmIHRoZSB2YWx1ZSBvZiB0aGlzIGZsYWcgaXMgPGNvZGU+dHJ1ZTwvY29kZT4sIHRoZSBUTEQgZmlsZXMKKyAgICAgICAgd2lsbCBiZSBYTUwgdmFsaWRhdGVkIG9uIGNvbnRleHQgc3RhcnR1cC4gIFRoZSBkZWZhdWx0IHZhbHVlIGZvcgorICAgICAgICB0aGlzIGZsYWcgaXMgPGNvZGU+ZmFsc2U8L2NvZGU+LCBhbmQgc2V0dGluZyBpdCB0byB0cnVlIHdpbGwgaW5jdXIKKyAgICAgICAgYSBwZXJmb3JtYW5jZSBwZW5hbHR5LjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9InVucGFja1dBUiIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+SWYgdHJ1ZSwgVG9tY2F0IHdpbGwgdW5wYWNrIGFsbCBjb21wcmVzc2VkIHdlYiBhcHBsaWNhdGlvbnMgYmVmb3JlCisgICAgICAgIHJ1bm5pbmcgdGhlbS4KKyAgICAgICAgSWYgbm90IHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+dHJ1ZTwvY29kZT4uPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idXNlTmFtaW5nIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgICA8cD5TZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4gKHRoZSBkZWZhdWx0KSB0byBoYXZlIENhdGFsaW5hIGVuYWJsZSBhCisgICAgICAgIEpOREkgPGNvZGU+SW5pdGlhbENvbnRleHQ8L2NvZGU+IGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbiB0aGF0IGlzCisgICAgICAgIGNvbXBhdGlibGUgd2l0aCBKYXZhMiBFbnRlcnByaXNlIEVkaXRpb24gKEoyRUUpIHBsYXRmb3JtCisgICAgICAgIGNvbnZlbnRpb25zLjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9IndvcmtEaXIiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPlBhdGhuYW1lIHRvIGEgc2NyYXRjaCBkaXJlY3RvcnkgdG8gYmUgcHJvdmlkZWQgYnkgdGhpcyBDb250ZXh0CisgICAgICAgIGZvciB0ZW1wb3JhcnkgcmVhZC13cml0ZSB1c2UgYnkgc2VydmxldHMgd2l0aGluIHRoZSBhc3NvY2lhdGVkIHdlYgorICAgICAgICBhcHBsaWNhdGlvbi4gIFRoaXMgZGlyZWN0b3J5IHdpbGwgYmUgbWFkZSB2aXNpYmxlIHRvIHNlcnZsZXRzIGluIHRoZQorICAgICAgICB3ZWIgYXBwbGljYXRpb24gYnkgYSBzZXJ2bGV0IGNvbnRleHQgYXR0cmlidXRlIChvZiB0eXBlCisgICAgICAgIDxjb2RlPmphdmEuaW8uRmlsZTwvY29kZT4pIG5hbWVkCisgICAgICAgIDxjb2RlPmphdmF4LnNlcnZsZXQuY29udGV4dC50ZW1wZGlyPC9jb2RlPiBhcyBkZXNjcmliZWQgaW4gdGhlCisgICAgICAgIFNlcnZsZXQgU3BlY2lmaWNhdGlvbi4gIElmIG5vdCBzcGVjaWZpZWQsIGEgc3VpdGFibGUgZGlyZWN0b3J5CisgICAgICAgIHVuZGVybmVhdGggPGNvZGU+JENBVEFMSU5BX0hPTUUvd29yazwvY29kZT4gd2lsbCBiZSBwcm92aWRlZC48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgIDwvYXR0cmlidXRlcz4KKworICA8L3N1YnNlY3Rpb24+CisKKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9Ik5lc3RlZCBDb21wb25lbnRzIj4KKworICA8cD5Zb3UgY2FuIG5lc3QgYXQgbW9zdCBvbmUgaW5zdGFuY2Ugb2YgdGhlIGZvbGxvd2luZyB1dGlsaXR5IGNvbXBvbmVudHMKKyAgYnkgbmVzdGluZyBhIGNvcnJlc3BvbmRpbmcgZWxlbWVudCBpbnNpZGUgeW91ciA8c3Ryb25nPkNvbnRleHQ8L3N0cm9uZz4KKyAgZWxlbWVudDo8L3A+CisgIDx1bD4KKyAgPGxpPjxhIGhyZWY9ImxvYWRlci5odG1sIj48c3Ryb25nPkxvYWRlcjwvc3Ryb25nPjwvYT4gLQorICAgICAgQ29uZmlndXJlIHRoZSB3ZWIgYXBwbGljYXRpb24gY2xhc3MgbG9hZGVyIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGxvYWQKKyAgICAgIHNlcnZsZXQgYW5kIGJlYW4gY2xhc3NlcyBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24uICBOb3JtYWxseSwgdGhlCisgICAgICBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gb2YgdGhlIGNsYXNzIGxvYWRlciB3aWxsIGJlIHN1ZmZpY2llbnQuPC9saT4KKyAgPGxpPjxhIGhyZWY9Im1hbmFnZXIuaHRtbCI+PHN0cm9uZz5NYW5hZ2VyPC9zdHJvbmc+PC9hPiAtCisgICAgICBDb25maWd1cmUgdGhlIHNlc3Npb24gbWFuYWdlciB0aGF0IHdpbGwgYmUgdXNlZCB0byBjcmVhdGUsIGRlc3Ryb3ksCisgICAgICBhbmQgcGVyc2lzdCBIVFRQIHNlc3Npb25zIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbi4gIE5vcm1hbGx5LCB0aGUKKyAgICAgIGRlZmF1bHQgY29uZmlndXJhdGlvbiBvZiB0aGUgc2Vzc2lvbiBtYW5hZ2VyIHdpbGwgYmUgc3VmZmljaWVudC48L2xpPgorICA8bGk+PGEgaHJlZj0icmVhbG0uaHRtbCI+PHN0cm9uZz5SZWFsbTwvc3Ryb25nPjwvYT4gLQorICAgICAgQ29uZmlndXJlIGEgcmVhbG0gdGhhdCB3aWxsIGFsbG93IGl0cworICAgICAgZGF0YWJhc2Ugb2YgdXNlcnMsIGFuZCB0aGVpciBhc3NvY2lhdGVkIHJvbGVzLCB0byBiZSB1dGlsaXplZCBzb2xlbHkKKyAgICAgIGZvciB0aGlzIHBhcnRpY3VsYXIgd2ViIGFwcGxpY2F0aW9uLiAgSWYgbm90IHNwZWNpZmllZCwgdGhpcyB3ZWIKKyAgICAgIGFwcGxpY2F0aW9uIHdpbGwgdXRpbGl6ZSB0aGUgUmVhbG0gYXNzb2NpYXRlZCB3aXRoIHRoZSBvd25pbmcKKyAgICAgIDxhIGhyZWY9Imhvc3QuaHRtbCI+SG9zdDwvYT4gb3IgPGEgaHJlZj0iZW5naW5lLmh0bWwiPkVuZ2luZTwvYT4uPC9saT4KKyAgPGxpPjxhIGhyZWY9InJlc291cmNlcy5odG1sIj48c3Ryb25nPlJlc291cmNlczwvc3Ryb25nPjwvYT4gLQorICAgICAgQ29uZmlndXJlIHRoZSByZXNvdXJjZSBtYW5hZ2VyIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGFjY2VzcyB0aGUgc3RhdGljCisgICAgICByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViIGFwcGxpY2F0aW9uLiAgTm9ybWFsbHksIHRoZQorICAgICAgZGVmYXVsdCBjb25maWd1cmF0aW9uIG9mIHRoZSByZXNvdXJjZSBtYW5hZ2VyIHdpbGwgYmUgc3VmZmljaWVudC48L2xpPgorICA8bGk+PHN0cm9uZz5XYXRjaGVkUmVzb3VyY2U8L3N0cm9uZz4gLSBUaGUgYXV0byBkZXBsb3llciB3aWxsIG1vbml0b3IgdGhlIAorICAgICAgc3BlY2lmaWVkIHN0YXRpYyByZXNvdXJjZSBvZiB0aGUgd2ViIGFwcGxpY2F0aW9uIGZvciB1cGRhdGVzLCBhbmQgd2lsbAorICAgICAgcmVsb2FkIHRoZSB3ZWIgYXBwbGljYXRpb24gaWYgaXMgaXMgdXBkYXRlZC4gVGhlIGNvbnRlbnQgb2YgdGhpcyBlbGVtZW50CisgICAgICBtdXN0IGJlIGEgc3RyaW5nLjwvbGk+CisgIDwvdWw+CisKKzwvc2VjdGlvbj4KKworCis8c2VjdGlvbiBuYW1lPSJTcGVjaWFsIEZlYXR1cmVzIj4KKworCisgIDxzdWJzZWN0aW9uIG5hbWU9IkxvZ2dpbmciPgorCisgICAgPHA+QSBjb250ZXh0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgCisgICAgICAgPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLkNvbnRhaW5lckJhc2UuW2VuZ2luZW5hbWVdLltob3N0bmFtZV0uW3BhdGhdPC9jb2RlPgorICAgICAgIGxvZyBjYXRlZ29yeS4gIE5vdGUgdGhhdCB0aGUgYnJhY2tldHMgYXJlIGFjdHVhbGx5IHBhcnQgb2YgdGhlIG5hbWUsIGRvbid0IG9taXQgdGhlbS48L3A+CisKKyAgPC9zdWJzZWN0aW9uPgorCisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iQWNjZXNzIExvZ3MiPgorCisgICAgPHA+V2hlbiB5b3UgcnVuIGEgd2ViIHNlcnZlciwgb25lIG9mIHRoZSBvdXRwdXQgZmlsZXMgbm9ybWFsbHkgZ2VuZXJhdGVkCisgICAgaXMgYW4gPGVtPmFjY2VzcyBsb2c8L2VtPiwgd2hpY2ggZ2VuZXJhdGVzIG9uZSBsaW5lIG9mIGluZm9ybWF0aW9uIGZvcgorICAgIGVhY2ggcmVxdWVzdCBwcm9jZXNzZWQgYnkgdGhlIHNlcnZlciwgaW4gYSBzdGFuZGFyZCBmb3JtYXQuICBDYXRhbGluYQorICAgIGluY2x1ZGVzIGFuIG9wdGlvbmFsIDxhIGhyZWY9InZhbHZlLmh0bWwiPlZhbHZlPC9hPiBpbXBsZW1lbnRhdGlvbiB0aGF0CisgICAgY2FuIGNyZWF0ZSBhY2Nlc3MgbG9ncyBpbiB0aGUgc2FtZSBzdGFuZGFyZCBmb3JtYXQgY3JlYXRlZCBieSB3ZWIgc2VydmVycywKKyAgICBvciBpbiBhbnkgbnVtYmVyIG9mIGN1c3RvbSBmb3JtYXRzLjwvcD4KKworICAgIDxwPllvdSBjYW4gYXNrIENhdGFsaW5hIHRvIGNyZWF0ZSBhbiBhY2Nlc3MgbG9nIGZvciBhbGwgcmVxdWVzdHMKKyAgICBwcm9jZXNzZWQgYnkgYW4gPGEgaHJlZj0iZW5naW5lLmh0bWwiPkVuZ2luZTwvYT4sCisgICAgPGEgaHJlZj0iaG9zdC5odG1sIj5Ib3N0PC9hPiwgb3IgPGEgaHJlZj0iY29udGV4dC5odG1sIj5Db250ZXh0PC9hPgorICAgIGJ5IG5lc3RpbmcgYSA8YSBocmVmPSJ2YWx2ZS5odG1sIj5WYWx2ZTwvYT4gZWxlbWVudCBsaWtlIHRoaXM6PC9wPgorCis8c291cmNlPgorJmx0O0NvbnRleHQgcGF0aD0iL2V4YW1wbGVzIiAuLi4mZ3Q7CisgIC4uLgorICAmbHQ7VmFsdmUgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcy5BY2Nlc3NMb2dWYWx2ZSIKKyAgICAgICAgIHByZWZpeD0ibG9jYWxob3N0X2FjY2Vzc19sb2cuIiBzdWZmaXg9Ii50eHQiCisgICAgICAgICBwYXR0ZXJuPSJjb21tb24iLyZndDsKKyAgLi4uCismbHQ7L0NvbnRleHQmZ3Q7Cis8L3NvdXJjZT4KKworICAgIDxwPlNlZSA8YSBocmVmPSJ2YWx2ZS5odG1sI0FjY2VzcyBMb2cgVmFsdmUiPkFjY2VzcyBMb2cgVmFsdmU8L2E+CisgICAgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIGNvbmZpZ3VyYXRpb24gYXR0cmlidXRlcyB0aGF0IGFyZQorICAgIHN1cHBvcnRlZC48L3A+CisKKyAgPC9zdWJzZWN0aW9uPgorCisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iQXV0b21hdGljIENvbnRleHQgQ29uZmlndXJhdGlvbiI+CisKKyAgICA8cD5JZiB5b3UgdXNlIHRoZSBzdGFuZGFyZCA8c3Ryb25nPkNvbnRleHQ8L3N0cm9uZz4gaW1wbGVtZW50YXRpb24sCisgICAgdGhlIGZvbGxvd2luZyBjb25maWd1cmF0aW9uIHN0ZXBzIG9jY3VyIGF1dG9tdGljYWxseSB3aGVuIENhdGFsaW5hCisgICAgaXMgc3RhcnRlZCwgb3Igd2hlbmV2ZXIgdGhpcyB3ZWIgYXBwbGljYXRpb24gaXMgcmVsb2FkZWQuICBObyBzcGVjaWFsCisgICAgY29uZmlndXJhdGlvbiBpcyByZXF1aXJlZCB0byBlbmFibGUgdGhpcyBmZWF0dXJlLjwvcD4KKyAgICAKKyAgICA8dWw+CisgICAgPGxpPklmIHlvdSBoYXZlIG5vdCBkZWNsYXJlZCB5b3VyIG93biA8YSBocmVmPSJsb2FkZXIuaHRtbCI+TG9hZGVyPC9hPgorICAgICAgIGVsZW1lbnQsIGEgc3RhbmRhcmQgd2ViIGFwcGxpY2F0aW9uIGNsYXNzIGxvYWRlciB3aWxsIGJlIGNvbmZpZ3VyZWQuCisgICAgICAgPC9saT4KKyAgICA8bGk+SWYgeW91IGhhdmUgbm90IGRlY2xhcmVkIHlvdXIgb3duIDxhIGhyZWY9Im1hbmFnZXIuaHRtbCI+TWFuYWdlcjwvYT4KKyAgICAgICAgZWxlbWVudCwgYSBzdGFuZGFyZCBzZXNzaW9uIG1hbmFnZXIgd2lsbCBiZSBjb25maWd1cmVkLjwvbGk+CisgICAgPGxpPklmIHlvdSBoYXZlIG5vdCBkZWNsYXJlZCB5b3VyIG93biA8YSBocmVmPSJyZXNvdXJjZXMuaHRtbCI+UmVzb3VyY2VzPC9hPgorICAgICAgICBlbGVtZW50LCBhIHN0YW5kYXJkIHJlc291cmNlcyBtYW5hZ2VyIHdpbGwgYmUgY29uZmlndXJlZC48L2xpPgorICAgIDxsaT5UaGUgd2ViIGFwcGxpY2F0aW9uIHByb3BlcnRpZXMgbGlzdGVkIGluIDxjb2RlPmNvbmYvd2ViLnhtbDwvY29kZT4KKyAgICAgICAgd2lsbCBiZSBwcm9jZXNzZWQgYXMgZGVmYXVsdHMgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLiAgVGhpcyBpcyB1c2VkCisgICAgICAgIHRvIGVzdGFibGlzaCBkZWZhdWx0IG1hcHBpbmdzIChzdWNoIGFzIG1hcHBpbmcgdGhlIDxjb2RlPiouanNwPC9jb2RlPgorICAgICAgICBleHRlbnNpb24gdG8gdGhlIGNvcnJlc3BvbmRpbmcgSlNQIHNlcnZsZXQpLCBhbmQgb3RoZXIgc3RhbmRhcmQKKyAgICAgICAgZmVhdHVyZXMgdGhhdCBhcHBseSB0byBhbGwgd2ViIGFwcGxpY2F0aW9ucy48L2xpPgorICAgIDxsaT5UaGUgd2ViIGFwcGxpY2F0aW9uIHByb3BlcnRpZXMgbGlzdGVkIGluIHRoZQorICAgICAgICA8Y29kZT4vV0VCLUlORi93ZWIueG1sPC9jb2RlPiByZXNvdXJjZSBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24KKyAgICAgICAgd2lsbCBiZSBwcm9jZXNzZWQgKGlmIHRoaXMgcmVzb3VyY2UgZXhpc3RzKS48L2xpPgorICAgIDxsaT5JZiB5b3VyIHdlYiBhcHBsaWNhdGlvbiBoYXMgc3BlY2lmaWVkIHNlY3VyaXR5IGNvbnN0cmFpbnRzIHRoYXQgbWlnaHQKKyAgICAgICAgcmVxdWlyZSB1c2VyIGF1dGhlbnRpY2F0aW9uLCBhbiBhcHByb3ByaWF0ZSBBdXRoZW50aWNhdG9yIHRoYXQKKyAgICAgICAgaW1wbGVtZW50cyB0aGUgbG9naW4gbWV0aG9kIHlvdSBoYXZlIHNlbGVjdGVkIHdpbGwgYmUgY29uZmlndXJlZC48L2xpPgorICAgIDwvdWw+CisKKyAgPC9zdWJzZWN0aW9uPgorCisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iQ29udGV4dCBQYXJhbWV0ZXJzIj4KKworICAgIDxwPllvdSBjYW4gY29uZmlndXJlIG5hbWVkIHZhbHVlcyB0aGF0IHdpbGwgYmUgbWFkZSB2aXNpYmxlIHRvIHRoZQorICAgIHdlYiBhcHBsaWNhdGlvbiBhcyBzZXJ2bGV0IGNvbnRleHQgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycyBieSBuZXN0aW5nCisgICAgPGNvZGU+Jmx0O1BhcmFtZXRlciZndDs8L2NvZGU+IGVsZW1lbnRzIGluc2lkZSB0aGlzIGVsZW1lbnQuICBGb3IKKyAgICBleGFtcGxlLCB5b3UgY2FuIGNyZWF0ZSBhbiBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIgbGlrZSB0aGlzOjwvcD4KKzxzb3VyY2U+CismbHQ7Q29udGV4dCAuLi4mZ3Q7CisgIC4uLgorICAmbHQ7UGFyYW1ldGVyIG5hbWU9ImNvbXBhbnlOYW1lIiB2YWx1ZT0iTXkgQ29tcGFueSwgSW5jb3Jwb3JhdGVkIgorICAgICAgICAgb3ZlcnJpZGU9ImZhbHNlIi8mZ3Q7CisgIC4uLgorJmx0Oy9Db250ZXh0Jmd0OworPC9zb3VyY2U+CisKKyAgICA8cD5UaGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlIGluY2x1c2lvbiBvZiB0aGUgZm9sbG93aW5nIGVsZW1lbnQgaW4gdGhlCisgICAgd2ViIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQgZGVzY3JpcHRvciAoPGNvZGU+L1dFQi1JTkYvd2ViLnhtbDwvY29kZT4pOgorICAgIDwvcD4KKzxzb3VyY2U+CismbHQ7Y29udGV4dC1wYXJhbSZndDsKKyAgJmx0O3BhcmFtLW5hbWUmZ3Q7Y29tcGFueU5hbWUmbHQ7L3BhcmFtLW5hbWUmZ3Q7CisgICZsdDtwYXJhbS12YWx1ZSZndDtNeSBDb21wYW55LCBJbmNvcnBvcmF0ZWQmbHQ7L3BhcmFtLXZhbHVlJmd0OworJmx0Oy9jb250ZXh0LXBhcmFtJmd0OworPC9zb3VyY2U+CisgICAgPHA+YnV0IGRvZXMgPGVtPm5vdDwvZW0+IHJlcXVpcmUgbW9kaWZpY2F0aW9uIG9mIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IKKyAgICB0byBjdXN0b21pemUgdGhpcyB2YWx1ZS48L3A+CisKKyAgICA8cD5UaGUgdmFsaWQgYXR0cmlidXRlcyBmb3IgYSA8Y29kZT4mbHQ7UGFyYW1ldGVyJmd0OzwvY29kZT4gZWxlbWVudAorICAgIGFyZSBhcyBmb2xsb3dzOjwvcD4KKworICAgIDxhdHRyaWJ1dGVzPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlc2NyaXB0aW9uIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgICA8cD5PcHRpb25hbCwgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhpcyBjb250ZXh0CisgICAgICAgIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlci48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiByZXF1aXJlZD0idHJ1ZSI+CisgICAgICAgIDxwPlRoZSBuYW1lIG9mIHRoZSBjb250ZXh0IGluaXRpYWxpemF0aW9uIHBhcmFtZXRlciB0byBiZSBjcmVhdGVkLjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9Im92ZXJyaWRlIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgICA8cD5TZXQgdGhpcyB0byA8Y29kZT5mYWxzZTwvY29kZT4gaWYgeW91IGRvIDxzdHJvbmc+bm90PC9zdHJvbmc+IHdhbnQKKyAgICAgICAgYSA8Y29kZT4mbHQ7Y29udGV4dC1wYXJhbSZndDs8L2NvZGU+IGZvciB0aGUgc2FtZSBwYXJhbWV0ZXIgbmFtZSwKKyAgICAgICAgZm91bmQgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IsIHRvIG92ZXJyaWRlIHRoZQorICAgICAgICB2YWx1ZSBzcGVjaWZpZWQgaGVyZS4gIEJ5IGRlZmF1bHQsIG92ZXJyaWRlcyBhcmUgYWxsb3dlZC48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgcmVxdWlyZWQ9InRydWUiPgorICAgICAgICA8cD5UaGUgcGFyYW1ldGVyIHZhbHVlIHRoYXQgd2lsbCBiZSBwcmVzZW50ZWQgdG8gdGhlIGFwcGxpY2F0aW9uCisgICAgICAgIHdoZW4gcmVxdWVzdGVkIGJ5IGNhbGxpbmcKKyAgICAgICAgPGNvZGU+U2VydmxldENvbnRleHQuZ2V0SW5pdFBhcmFtZXRlcigpPC9jb2RlPi48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgIDwvYXR0cmlidXRlcz4KKworICA8L3N1YnNlY3Rpb24+CisKKworICA8c3Vic2VjdGlvbiBuYW1lPSJFbnZpcm9ubWVudCBFbnRyaWVzIj4KKworICAgIDxwPllvdSBjYW4gY29uZmlndXJlIG5hbWVkIHZhbHVlcyB0aGF0IHdpbGwgYmUgbWFkZSB2aXNpYmxlIHRvIHRoZQorICAgIHdlYiBhcHBsaWNhdGlvbiBhcyBlbnZpcm9ubWVudCBlbnRyeSByZXNvdXJjZXMsIGJ5IG5lc3RpbmcKKyAgICA8Y29kZT4mbHQ7RW52aXJvbm1lbnQmZ3Q7PC9jb2RlPiBlbnRyaWVzIGluc2lkZSB0aGlzIGVsZW1lbnQuICBGb3IKKyAgICBleGFtcGxlLCB5b3UgY2FuIGNyZWF0ZSBhbiBlbnZpcm9ubWVudCBlbnRyeSBsaWtlIHRoaXM6PC9wPgorPHNvdXJjZT4KKyZsdDtDb250ZXh0IC4uLiZndDsKKyAgLi4uCisgICZsdDtFbnZpcm9ubWVudCBuYW1lPSJtYXhFeGVtcHRpb25zIiB2YWx1ZT0iMTAiCisgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuSW50ZWdlciIgb3ZlcnJpZGU9ImZhbHNlIi8mZ3Q7CisgIC4uLgorJmx0Oy9Db250ZXh0Jmd0OworPC9zb3VyY2U+CisKKyAgICA8cD5UaGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlIGluY2x1c2lvbiBvZiB0aGUgZm9sbG93aW5nIGVsZW1lbnQgaW4gdGhlCisgICAgd2ViIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQgZGVzY3JpcHRvciAoPGNvZGU+L1dFQi1JTkYvd2ViLnhtbDwvY29kZT4pOgorICAgIDwvcD4KKzxzb3VyY2U+CismbHQ7ZW52LWVudHJ5Jmd0OworICAmbHQ7ZW52LWVudHJ5LW5hbWUmZ3Q7bWF4RXhlbXB0aW9ucyZsdDsvcGFyYW0tbmFtZSZndDsKKyAgJmx0O2Vudi1lbnRyeS12YWx1ZSZndDsxMCZsdDsvZW52LWVudHJ5LXZhbHVlJmd0OworICAmbHQ7ZW52LWVudHJ5LXR5cGUmZ3Q7amF2YS5sYW5nLkludGVnZXImbHQ7L2Vudi1lbnRyeS10eXBlJmd0OworJmx0Oy9lbnYtZW50cnkmZ3Q7Cis8L3NvdXJjZT4KKyAgICA8cD5idXQgZG9lcyA8ZW0+bm90PC9lbT4gcmVxdWlyZSBtb2RpZmljYXRpb24gb2YgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvcgorICAgIHRvIGN1c3RvbWl6ZSB0aGlzIHZhbHVlLjwvcD4KKworICAgIDxwPlRoZSB2YWxpZCBhdHRyaWJ1dGVzIGZvciBhbiA8Y29kZT4mbHQ7RW52aXJvbm1lbnQmZ3Q7PC9jb2RlPiBlbGVtZW50CisgICAgYXJlIGFzIGZvbGxvd3M6PC9wPgorCisgICAgPGF0dHJpYnV0ZXM+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVzY3JpcHRpb24iIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPk9wdGlvbmFsLCBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGlzIGVudmlyb25tZW50IGVudHJ5LjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHJlcXVpcmVkPSJ0cnVlIj4KKyAgICAgICAgPHA+VGhlIG5hbWUgb2YgdGhlIGVudmlyb25tZW50IGVudHJ5IHRvIGJlIGNyZWF0ZWQsIHJlbGF0aXZlIHRvIHRoZQorICAgICAgICA8Y29kZT5qYXZhOmNvbXAvZW52PC9jb2RlPiBjb250ZXh0LjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9Im92ZXJyaWRlIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgICA8cD5TZXQgdGhpcyB0byA8Y29kZT5mYWxzZTwvY29kZT4gaWYgeW91IGRvIDxzdHJvbmc+bm90PC9zdHJvbmc+IHdhbnQKKyAgICAgICAgYW4gPGNvZGU+Jmx0O2Vudi1lbnRyeSZndDs8L2NvZGU+IGZvciB0aGUgc2FtZSBlbnZpcm9ubWVudCBlbnRyeSBuYW1lLAorICAgICAgICBmb3VuZCBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQgZGVzY3JpcHRvciwgdG8gb3ZlcnJpZGUgdGhlCisgICAgICAgIHZhbHVlIHNwZWNpZmllZCBoZXJlLiAgQnkgZGVmYXVsdCwgb3ZlcnJpZGVzIGFyZSBhbGxvd2VkLjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9InR5cGUiIHJlcXVpcmVkPSJ0cnVlIj4KKyAgICAgICAgPHA+VGhlIGZ1bGx5IHF1YWxpZmllZCBKYXZhIGNsYXNzIG5hbWUgZXhwZWN0ZWQgYnkgdGhlIHdlYiBhcHBsaWNhdGlvbgorICAgICAgICBmb3IgdGhpcyBlbnZpcm9ubWVudCBlbnRyeS4gIE11c3QgYmUgb25lIG9mIHRoZSBsZWdhbCB2YWx1ZXMgZm9yCisgICAgICAgIDxjb2RlPiZsdDtlbnYtZW50cnktdHlwZSZndDs8L2NvZGU+IGluIHRoZSB3ZWIgYXBwbGljYXRpb24gZGVwbG95bWVudAorICAgICAgICBkZXNjcmlwdG9yOiAgPGNvZGU+amF2YS5sYW5nLkJvb2xlYW48L2NvZGU+LAorICAgICAgICA8Y29kZT5qYXZhLmxhbmcuQnl0ZTwvY29kZT4sIDxjb2RlPmphdmEubGFuZy5DaGFyYWN0ZXI8L2NvZGU+LAorICAgICAgICA8Y29kZT5qYXZhLmxhbmcuRG91YmxlPC9jb2RlPiwgPGNvZGU+amF2YS5sYW5nLkZsb2F0PC9jb2RlPiwKKyAgICAgICAgPGNvZGU+amF2YS5sYW5nLkludGVnZXI8L2NvZGU+LCA8Y29kZT5qYXZhLmxhbmcuTG9uZzwvY29kZT4sCisgICAgICAgIDxjb2RlPmphdmEubGFuZy5TaG9ydDwvY29kZT4sIG9yIDxjb2RlPmphdmEubGFuZy5TdHJpbmc8L2NvZGU+LjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9InZhbHVlIiByZXF1aXJlZD0idHJ1ZSI+CisgICAgICAgIDxwPlRoZSBwYXJhbWV0ZXIgdmFsdWUgdGhhdCB3aWxsIGJlIHByZXNlbnRlZCB0byB0aGUgYXBwbGljYXRpb24KKyAgICAgICAgd2hlbiByZXF1ZXN0ZWQgZnJvbSB0aGUgSk5ESSBjb250ZXh0LiAgVGhpcyB2YWx1ZSBtdXN0IGJlIGNvbnZlcnRhYmxlCisgICAgICAgIHRvIHRoZSBKYXZhIHR5cGUgZGVmaW5lZCBieSB0aGUgPGNvZGU+dHlwZTwvY29kZT4gYXR0cmlidXRlLjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgPC9hdHRyaWJ1dGVzPgorCisgIDwvc3Vic2VjdGlvbj4KKworCisgIDxzdWJzZWN0aW9uIG5hbWU9IkxpZmVjeWNsZSBMaXN0ZW5lcnMiPgorCisgICAgPHA+SWYgeW91IGhhdmUgaW1wbGVtZW50ZWQgYSBKYXZhIG9iamVjdCB0aGF0IG5lZWRzIHRvIGtub3cgd2hlbiB0aGlzCisgICAgPHN0cm9uZz5Db250ZXh0PC9zdHJvbmc+IGlzIHN0YXJ0ZWQgb3Igc3RvcHBlZCwgeW91IGNhbiBkZWNsYXJlIGl0IGJ5CisgICAgbmVzdGluZyBhIDxzdHJvbmc+TGlzdGVuZXI8L3N0cm9uZz4gZWxlbWVudCBpbnNpZGUgdGhpcyBlbGVtZW50LiAgVGhlCisgICAgY2xhc3MgbmFtZSB5b3Ugc3BlY2lmeSBtdXN0IGltcGxlbWVudCB0aGUKKyAgICA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZUxpc3RlbmVyPC9jb2RlPiBpbnRlcmZhY2UsIGFuZAorICAgIGl0IHdpbGwgYmUgbm90aWZpZWQgYWJvdXQgdGhlIG9jY3VycmVuY2Ugb2YgdGhlIGNvcmVzcG9uZGluZworICAgIGxpZmVjeWNsZSBldmVudHMuICBDb25maWd1cmF0aW9uIG9mIHN1Y2ggYSBsaXN0ZW5lciBsb29rcyBsaWtlIHRoaXM6PC9wPgorCis8c291cmNlPgorJmx0O0NvbnRleHQgcGF0aD0iL2V4YW1wbGVzIiAuLi4mZ3Q7CisgIC4uLgorICAmbHQ7TGlzdGVuZXIgY2xhc3NOYW1lPSJjb20ubXljb21wYW55Lm15cGFja2FnZS5NeUxpc3RlbmVyIiAuLi4gJmd0OworICAuLi4KKyZsdDsvQ29udGV4dCZndDsKKzwvc291cmNlPgorCisgICAgPHA+Tm90ZSB0aGF0IGEgTGlzdGVuZXIgY2FuIGhhdmUgYW55IG51bWJlciBvZiBhZGRpdGlvbmFsIHByb3BlcnRpZXMKKyAgICB0aGF0IG1heSBiZSBjb25maWd1cmVkIGZyb20gdGhpcyBlbGVtZW50LiAgQXR0cmlidXRlIG5hbWVzIGFyZSBtYXRjaGVkCisgICAgdG8gY29ycmVzcG9uZGluZyBKYXZhQmVhbiBwcm9wZXJ0eSBuYW1lcyB1c2luZyB0aGUgc3RhbmRhcmQgcHJvcGVydHkKKyAgICBtZXRob2QgbmFtaW5nIHBhdHRlcm5zLjwvcD4KKworICA8L3N1YnNlY3Rpb24+CisKKworICA8c3Vic2VjdGlvbiBuYW1lPSJSZXF1ZXN0IEZpbHRlcnMiPgorCisgICAgPHA+WW91IGNhbiBhc2sgQ2F0YWxpbmEgdG8gY2hlY2sgdGhlIElQIGFkZHJlc3MsIG9yIGhvc3QgbmFtZSwgb24gZXZlcnkKKyAgICBpbmNvbWluZyByZXF1ZXN0IGRpcmVjdGVkIHRvIHRoZSBzdXJyb3VuZGluZworICAgIDxhIGhyZWY9ImVuZ2luZS5odG1sIj5FbmdpbmU8L2E+LCA8YSBocmVmPSJob3N0Lmh0bWwiPkhvc3Q8L2E+LCBvcgorICAgIDxhIGhyZWY9ImNvbnRleHQuaHRtbCI+Q29udGV4dDwvYT4gZWxlbWVudC4gIFRoZSByZW1vdGUgYWRkcmVzcyBvciBuYW1lCisgICAgd2lsbCBiZSBjaGVja2VkIGFnYWluc3QgYSBjb25maWd1cmVkIGxpc3Qgb2YgImFjY2VwdCIgYW5kL29yICJkZW55IgorICAgIGZpbHRlcnMsIHdoaWNoIGFyZSBkZWZpbmVkIHVzaW5nIHRoZSBSZWd1bGFyIEV4cHJlc3Npb24gc3ludGF4IHN1cHBvcnRlZAorICAgIGJ5IHRoZSA8YSBocmVmPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3JlZ2V4cC8iPkpha2FydGEgUmVnZXhwPC9hPgorICAgIHJlZ3VsYXIgZXhwcmVzc2lvbiBsaWJyYXJ5LiAgUmVxdWVzdHMgdGhhdCBjb21lIGZyb20gbG9jYXRpb25zIHRoYXQgYXJlCisgICAgbm90IGFjY2VwdGVkIHdpbGwgYmUgcmVqZWN0ZWQgd2l0aCBhbiBIVFRQICJGb3JiaWRkZW4iIGVycm9yLgorICAgIEV4YW1wbGUgZmlsdGVyIGRlY2xhcmF0aW9uczo8L3A+CisKKzxzb3VyY2U+CismbHQ7Q29udGV4dCBwYXRoPSIvZXhhbXBsZXMiIC4uLiZndDsKKyAgLi4uCisgICZsdDtWYWx2ZSBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEudmFsdmVzLlJlbW90ZUhvc3RWYWx2ZSIKKyAgICAgICAgIGFsbG93PSIqLm15Y29tcGFueS5jb20sd3d3LnlvdXJjb21wYW55LmNvbSIvJmd0OworICAmbHQ7VmFsdmUgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcy5SZW1vdGVBZGRyVmFsdmUiCisgICAgICAgICBkZW55PSIxOTIuMTY4LjEuKiIvJmd0OworICAuLi4KKyZsdDsvQ29udGV4dCZndDsKKzwvc291cmNlPgorCisgICAgPHA+U2VlIDxhIGhyZWY9InZhbHZlLmh0bWwjUmVtb3RlIEFkZHJlc3MgRmlsdGVyIj5SZW1vdGUgQWRkcmVzcyBGaWx0ZXI8L2E+CisgICAgYW5kIDxhIGhyZWY9InZhbHZlLmh0bWwjUmVtb3RlIEhvc3QgRmlsdGVyIj5SZW1vdGUgSG9zdCBGaWx0ZXI8L2E+IGZvcgorICAgIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0aGF0IGFyZSBzdXBwb3J0ZWQuPC9wPgorCisgIDwvc3Vic2VjdGlvbj4KKworCisgIDxzdWJzZWN0aW9uIG5hbWU9IlJlc291cmNlIERlZmluaXRpb25zIj4KKworICAgIDxwPllvdSBjYW4gZGVjbGFyZSB0aGUgY2hhcmFjdGVyaXN0aWNzIG9mIHRoZSByZXNvdXJjZQorICAgIHRvIGJlIHJldHVybmVkIGZvciBKTkRJIGxvb2t1cHMgb2YgPGNvZGU+Jmx0O3Jlc291cmNlLXJlZiZndDs8L2NvZGU+IGFuZAorICAgIDxjb2RlPiZsdDtyZXNvdXJjZS1lbnYtcmVmJmd0OzwvY29kZT4gZWxlbWVudHMgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbgorICAgIGRlcGxveW1lbnQgZGVzY3JpcHRvci4gIFlvdSA8c3Ryb25nPk1VU1Q8L3N0cm9uZz4gYWxzbyBkZWZpbmUKKyAgICB0aGUgbmVlZGVkIHJlc291cmNlIHBhcmFtZXRlcnMgYXMgYXR0cmlidXRlcyBvZiB0aGUgPGNvZGU+UmVzb3VyY2U8L2NvZGU+IAorICAgIGVsZW1lbnQsIHRvIGNvbmZpZ3VyZSB0aGUgb2JqZWN0IGZhY3RvcnkgdG8gYmUgdXNlZCAoaWYgbm90IGtub3duIHRvIFRvbWNhdCAKKyAgICBhbHJlYWR5KSwgYW5kIHRoZSBwcm9wZXJ0aWVzIHVzZWQgdG8gY29uZmlndXJlIHRoYXQgb2JqZWN0IGZhY3RvcnkuPC9wPgorCisgICAgPHA+Rm9yIGV4YW1wbGUsIHlvdSBjYW4gY3JlYXRlIGEgcmVzb3VyY2UgZGVmaW5pdGlvbiBsaWtlIHRoaXM6PC9wPgorPHNvdXJjZT4KKyZsdDtDb250ZXh0IC4uLiZndDsKKyAgLi4uCisgICZsdDtSZXNvdXJjZSBuYW1lPSJqZGJjL0VtcGxveWVlREIiIGF1dGg9IkNvbnRhaW5lciIKKyAgICAgICAgICAgIHR5cGU9ImphdmF4LnNxbC5EYXRhU291cmNlIgorICAgICBkZXNjcmlwdGlvbj0iRW1wbG95ZWVzIERhdGFiYXNlIGZvciBIUiBBcHBsaWNhdGlvbnMiLyZndDsKKyAgLi4uCismbHQ7L0NvbnRleHQmZ3Q7Cis8L3NvdXJjZT4KKworICAgIDxwPlRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgaW5jbHVzaW9uIG9mIHRoZSBmb2xsb3dpbmcgZWxlbWVudCBpbiB0aGUKKyAgICB3ZWIgYXBwbGljYXRpb24gZGVwbG95bWVudCBkZXNjcmlwdG9yICg8Y29kZT4vV0VCLUlORi93ZWIueG1sPC9jb2RlPik6PC9wPgorPHNvdXJjZT4KKyZsdDtyZXNvdXJjZS1yZWYmZ3Q7CisgICZsdDtkZXNjcmlwdGlvbiZndDtFbXBsb3llZXMgRGF0YWJhc2UgZm9yIEhSIEFwcGxpY2F0aW9ucyZsdDsvZGVzY3JpcHRpb24mZ3Q7CisgICZsdDtyZXMtcmVmLW5hbWUmZ3Q7amRiYy9FbXBsb3llZURCJmx0Oy9yZXMtcmVmLW5hbWUmZ3Q7CisgICZsdDtyZXMtcmVmLXR5cGUmZ3Q7amF2YXguc3FsLkRhdGFTb3VyY2UmbHQ7L3Jlcy1yZWYtdHlwZSZndDsKKyAgJmx0O3Jlcy1hdXRoJmd0O0NvbnRhaW5lciZsdDsvcmVzLWF1dGgmZ3Q7CismbHQ7L3Jlc291cmNlLXJlZiZndDsKKzwvc291cmNlPgorCisgICAgPHA+YnV0IGRvZXMgPGVtPm5vdDwvZW0+IHJlcXVpcmUgbW9kaWZpY2F0aW9uIG9mIHRoZSBkZXBsb3ltZW50CisgICAgZGVzY3JpcHRvciB0byBjdXN0b21pemUgdGhpcyB2YWx1ZS48L3A+CisKKyAgICA8cD5UaGUgdmFsaWQgYXR0cmlidXRlcyBmb3IgYSA8Y29kZT4mbHQ7UmVzb3VyY2UmZ3Q7PC9jb2RlPiBlbGVtZW50CisgICAgYXJlIGFzIGZvbGxvd3M6PC9wPgorCisgICAgPGF0dHJpYnV0ZXM+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYXV0aCIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+U3BlY2lmeSB3aGV0aGVyIHRoZSB3ZWIgQXBwbGljYXRpb24gY29kZSBzaWducyBvbiB0byB0aGUKKyAgICAgICAgY29ycmVzcG9uZGluZyByZXNvdXJjZSBtYW5hZ2VyIHByb2dyYW1hdGljYWxseSwgb3Igd2hldGhlciB0aGUKKyAgICAgICAgQ29udGFpbmVyIHdpbGwgc2lnbiBvbiB0byB0aGUgcmVzb3VyY2UgbWFuYWdlciBvbiBiZWhhbGYgb2YgdGhlCisgICAgICAgIGFwcGxpY2F0aW9uLiAgVGhlIHZhbHVlIG9mIHRoaXMgYXR0cmlidXRlIG11c3QgYmUKKyAgICAgICAgPGNvZGU+QXBwbGljYXRpb248L2NvZGU+IG9yIDxjb2RlPkNvbnRhaW5lcjwvY29kZT4uICBUaGlzCisgICAgICAgIGF0dHJpYnV0ZSBpcyA8c3Ryb25nPnJlcXVpcmVkPC9zdHJvbmc+IGlmIHRoZSB3ZWIgYXBwbGljYXRpb24KKyAgICAgICAgd2lsbCB1c2UgYSA8Y29kZT4mbHQ7cmVzb3VyY2UtcmVmJmd0OzwvY29kZT4gZWxlbWVudCBpbiB0aGUgd2ViCisgICAgICAgIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQgZGVzY3JpcHRvciwgYnV0IGlzIG9wdGlvbmFsIGlmIHRoZQorICAgICAgICBhcHBsaWNhdGlvbiB1c2VzIGEgPGNvZGU+Jmx0O3Jlc291cmNlLWVudi1yZWYmZ3Q7PC9jb2RlPiBpbnN0ZWFkLjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlc2NyaXB0aW9uIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgICA8cD5PcHRpb25hbCwgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhpcyByZXNvdXJjZS48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiByZXF1aXJlZD0idHJ1ZSI+CisgICAgICAgIDxwPlRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZSB0byBiZSBjcmVhdGVkLCByZWxhdGl2ZSB0byB0aGUKKyAgICAgICAgPGNvZGU+amF2YTpjb21wL2VudjwvY29kZT4gY29udGV4dC48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzY29wZSIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+U3BlY2lmeSB3aGV0aGVyIGNvbm5lY3Rpb25zIG9idGFpbmVkIHRocm91Z2ggdGhpcyByZXNvdXJjZQorICAgICAgICBtYW5hZ2VyIGNhbiBiZSBzaGFyZWQuICBUaGUgdmFsdWUgb2YgdGhpcyBhdHRyaWJ1dGUgbXVzdCBiZQorICAgICAgICA8Y29kZT5TaGFyZWFibGU8L2NvZGU+IG9yIDxjb2RlPlVuc2hhcmVhYmxlPC9jb2RlPi4gIEJ5IGRlZmF1bHQsCisgICAgICAgIGNvbm5lY3Rpb25zIGFyZSBhc3N1bWVkIHRvIGJlIHNoYXJlYWJsZS48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiByZXF1aXJlZD0idHJ1ZSI+CisgICAgICAgIDxwPlRoZSBmdWxseSBxdWFsaWZpZWQgSmF2YSBjbGFzcyBuYW1lIGV4cGVjdGVkIGJ5IHRoZSB3ZWIKKyAgICAgICAgYXBwbGljYXRpb24gd2hlbiBpdCBwZXJmb3JtcyBhIGxvb2t1cCBmb3IgdGhpcyByZXNvdXJjZS48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgIDwvYXR0cmlidXRlcz4KKworCisgIDwvc3Vic2VjdGlvbj4KKworCisgIDxzdWJzZWN0aW9uIG5hbWU9IlJlc291cmNlIExpbmtzIj4KKworICAgICA8cD5UaGlzIGVsZW1lbnQgaXMgdXNlZCB0byBjcmVhdGUgYSBsaW5rIHRvIGEgZ2xvYmFsIEpOREkgcmVzb3VyY2UuIERvaW5nCisgICAgIGEgSk5ESSBsb29rdXAgb24gdGhlIGxpbmsgbmFtZSB3aWxsIHRoZW4gcmV0dXJuIHRoZSBsaW5rZWQgZ2xvYmFsIAorICAgICByZXNvdXJjZS48L3A+CisKKyAgICA8cD5Gb3IgZXhhbXBsZSwgeW91IGNhbiBjcmVhdGUgYSByZXNvdXJjZSBsaW5rIGxpa2UgdGhpczo8L3A+Cis8c291cmNlPgorJmx0O0NvbnRleHQgLi4uJmd0OworICAuLi4KKyAgJmx0O1Jlc291cmNlTGluayBuYW1lPSJsaW5rVG9HbG9iYWxSZXNvdXJjZSIKKyAgICAgICAgICAgIGdsb2JhbD0ic2ltcGxlVmFsdWUiCisgICAgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuSW50ZWdlciIKKyAgLi4uCismbHQ7L0NvbnRleHQmZ3Q7Cis8L3NvdXJjZT4KKworICAgIDxwPlRoZSB2YWxpZCBhdHRyaWJ1dGVzIGZvciBhIDxjb2RlPiZsdDtSZXNvdXJjZUxpbmsmZ3Q7PC9jb2RlPiBlbGVtZW50CisgICAgYXJlIGFzIGZvbGxvd3M6PC9wPgorCisgICAgPGF0dHJpYnV0ZXM+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZ2xvYmFsIiByZXF1aXJlZD0idHJ1ZSI+CisgICAgICAgIDxwPlRoZSBuYW1lIG9mIHRoZSBsaW5rZWQgZ2xvYmFsIHJlc291cmNlIGluIHRoZSAKKyAgICAgICAgZ2xvYmFsIEpOREkgY29udGV4dC48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiByZXF1aXJlZD0idHJ1ZSI+CisgICAgICAgIDxwPlRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZSBsaW5rIHRvIGJlIGNyZWF0ZWQsIHJlbGF0aXZlIHRvIHRoZQorICAgICAgICA8Y29kZT5qYXZhOmNvbXAvZW52PC9jb2RlPiBjb250ZXh0LjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9InR5cGUiIHJlcXVpcmVkPSJ0cnVlIj4KKyAgICAgICAgPHA+VGhlIGZ1bGx5IHF1YWxpZmllZCBKYXZhIGNsYXNzIG5hbWUgZXhwZWN0ZWQgYnkgdGhlIHdlYgorICAgICAgICBhcHBsaWNhdGlvbiB3aGVuIGl0IHBlcmZvcm1zIGEgbG9va3VwIGZvciB0aGlzIHJlc291cmNlIGxpbmsuPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICA8L2F0dHJpYnV0ZXM+CisKKyAgPC9zdWJzZWN0aW9uPgorCis8L3NlY3Rpb24+CisKKworPC9ib2R5PgorCisKKzwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9kb2NzL2NvbmZpZy9lbmdpbmUueG1sIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9jb25maWcvZW5naW5lLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2Q2MDUxCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9jb25maWcvZW5naW5lLnhtbApAQCAtMCwwICsxLDI0MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IURPQ1RZUEUgZG9jdW1lbnQgWworICA8IUVOVElUWSBwcm9qZWN0IFNZU1RFTSAicHJvamVjdC54bWwiPgorXT4KKzxkb2N1bWVudCB1cmw9ImVuZ2luZS5odG1sIj4KKworICAmcHJvamVjdDsKKworICA8cHJvcGVydGllcz4KKyAgICA8YXV0aG9yIGVtYWlsPSJjcmFpZ21jY0BhcGFjaGUub3JnIj5DcmFpZyBSLiBNY0NsYW5haGFuPC9hdXRob3I+CisgICAgPHRpdGxlPlRoZSBFbmdpbmUgQ29udGFpbmVyPC90aXRsZT4KKyAgPC9wcm9wZXJ0aWVzPgorCis8Ym9keT4KKworCis8c2VjdGlvbiBuYW1lPSJJbnRyb2R1Y3Rpb24iPgorCisgIDxwPlRoZSA8c3Ryb25nPkVuZ2luZTwvc3Ryb25nPiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIGVudGlyZSByZXF1ZXN0CisgIHByb2Nlc3NpbmcgbWFjaGluZXJ5IGFzc29jaWF0ZWQgd2l0aCBhIHBhcnRpY3VsYXIgQ2F0YWxpbmEKKyAgPGEgaHJlZj0ic2VydmljZS5odG1sIj5TZXJ2aWNlPC9hPi4gIEl0IHJlY2VpdmVzIGFuZCBwcm9jZXNzZXMKKyAgPGVtPmFsbDwvZW0+IHJlcXVlc3RzIGZyb20gb25lIG9yIG1vcmUgPHN0cm9uZz5Db25uZWN0b3JzPC9zdHJvbmc+LAorICBhbmQgcmV0dXJucyB0aGUgY29tcGxldGVkIHJlc3BvbnNlIHRvIHRoZSBDb25uZWN0b3IgZm9yIHVsdGltYXRlCisgIHRyYW5zbWlzc2lvbiBiYWNrIHRvIHRoZSBjbGllbnQuPC9wPgorCisgIDxwPkV4YWN0bHkgb25lIDxzdHJvbmc+RW5naW5lPC9zdHJvbmc+IGVsZW1lbnQgTVVTVCBiZSBuZXN0ZWQgaW5zaWRlCisgIGEgPGEgaHJlZj0ic2VydmljZS5odG1sIj5TZXJ2aWNlPC9hPiBlbGVtZW50LCBmb2xsb3dpbmcgYWxsIG9mIHRoZQorICBjb3JyZXNwb25kaW5nIENvbm5lY3RvciBlbGVtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhpcyBTZXJ2aWNlLjwvcD4KKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IkF0dHJpYnV0ZXMiPgorCisgIDxzdWJzZWN0aW9uIG5hbWU9IkNvbW1vbiBBdHRyaWJ1dGVzIj4KKworICAgIDxwPkFsbCBpbXBsZW1lbnRhdGlvbnMgb2YgPHN0cm9uZz5FbmdpbmU8L3N0cm9uZz4KKyAgICBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczo8L3A+CisKKyAgICA8YXR0cmlidXRlcz4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJiYWNrZ3JvdW5kUHJvY2Vzc29yRGVsYXkiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPlRoaXMgdmFsdWUgcmVwcmVzZW50cyB0aGUgZGVsYXkgaW4gc2Vjb25kcyBiZXR3ZWVuIHRoZSAKKyAgICAgICAgaW52b2NhdGlvbiBvZiB0aGUgYmFja2dyb3VuZFByb2Nlc3MgbWV0aG9kIG9uIHRoaXMgZW5naW5lIGFuZCAKKyAgICAgICAgaXRzIGNoaWxkIGNvbnRhaW5lcnMsIGluY2x1ZGluZyBhbGwgaG9zdHMgYW5kIGNvbnRleHRzLiAKKyAgICAgICAgQ2hpbGQgY29udGFpbmVycyB3aWxsIG5vdCBiZSBpbnZva2VkIGlmIHRoZWlyIGRlbGF5IHZhbHVlIGlzIG5vdCAKKyAgICAgICAgbmVnYXRpdmUgKHdoaWNoIHdvdWxkIG1lYW4gdGhleSBhcmUgdXNpbmcgdGhlaXIgb3duIHByb2Nlc3NpbmcgCisgICAgICAgIHRocmVhZCkuIFNldHRpbmcgdGhpcyB0byBhIHBvc2l0aXZlIHZhbHVlIHdpbGwgY2F1c2UgCisgICAgICAgIGEgdGhyZWFkIHRvIGJlIHNwYXduLiBBZnRlciB3YWl0aW5nIHRoZSBzcGVjaWZpZWQgYW1vdW50IG9mIHRpbWUsIAorICAgICAgICB0aGUgdGhyZWFkIHdpbGwgaW52b2tlIHRoZSBiYWNrZ3JvdW5kUHJvY2VzcyBtZXRob2Qgb24gdGhpcyBlbmdpbmUgCisgICAgICAgIGFuZCBhbGwgaXRzIGNoaWxkIGNvbnRhaW5lcnMuIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0IHZhbHVlIGZvcgorICAgICAgICB0aGlzIGF0dHJpYnV0ZSBpcyAxMCwgd2hpY2ggcmVwcmVzZW50IGEgMTAgc2Vjb25kcyBkZWxheS48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc05hbWUiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPkphdmEgY2xhc3MgbmFtZSBvZiB0aGUgaW1wbGVtZW50YXRpb24gdG8gdXNlLiAgVGhpcyBjbGFzcyBtdXN0CisgICAgICAgIGltcGxlbWVudCB0aGUgPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5FbmdpbmU8L2NvZGU+IGludGVyZmFjZS4KKyAgICAgICAgSWYgbm90IHNwZWNpZmllZCwgdGhlIHN0YW5kYXJkIHZhbHVlIChkZWZpbmVkIGJlbG93KSB3aWxsIGJlIHVzZWQuPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVmYXVsdEhvc3QiIHJlcXVpcmVkPSJ0cnVlIj4KKyAgICAgICAgPHA+VGhlIGRlZmF1bHQgaG9zdCBuYW1lLCB3aGljaCBpZGVudGlmaWVzIHRoZQorICAgICAgICA8YSBocmVmPSJob3N0Lmh0bWwiPkhvc3Q8L2E+IHRoYXQgd2lsbCBwcm9jZXNzIHJlcXVlc3RzIGRpcmVjdGVkCisgICAgICAgIHRvIGhvc3QgbmFtZXMgb24gdGhpcyBzZXJ2ZXIsIGJ1dCB3aGljaCBhcmUgbm90IGNvbmZpZ3VyZWQgaW4KKyAgICAgICAgdGhpcyBjb25maWd1cmF0aW9uIGZpbGUuICBUaGlzIG5hbWUgTVVTVCBtYXRjaCB0aGUgPGNvZGU+bmFtZTwvY29kZT4KKyAgICAgICAgYXR0cmlidXRlcyBvZiBvbmUgb2YgdGhlIDxhIGhyZWY9Imhvc3QuaHRtbCI+SG9zdDwvYT4gZWxlbWVudHMKKyAgICAgICAgbmVzdGVkIGltbWVkaWF0ZWx5IGluc2lkZS48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJqdm1Sb3V0ZSIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+SWRlbnRpZmllciB3aGljaCBtdXN0IGJlIHVzZWQgaW4gbG9hZCBiYWxhbmNpbmcgc2NlbmFyaW9zIHRvIGVuYWJsZQorICAgICAgICBzZXNzaW9uIGFmZmluaXR5LiBUaGUgaW5kZXRpZmllciwgd2hpY2ggbXVzdCBiZSB1bmlxdWUgYWNyb3NzIGFsbAorICAgICAgICBUb21jYXQgNSBzZXJ2ZXJzIHdoaWNoIHBhcnRpY2lwYXRlIGluIHRoZSBjbHVzdGVyLCB3aWxsIGJlIGFwcGVuZGVkIHRvCisgICAgICAgIHRoZSBnZW5lcmF0ZWQgc2Vzc2lvbiBpZGVudGlmaWVyLCB0aGVyZWZvcmUgYWxsb3dpbmcgdGhlIGZyb250IGVuZAorICAgICAgICBwcm94eSB0byBhbHdheXMgZm9yd2FyZCBhIHBhcnRpY3VsYXIgc2Vzc2lvbiB0byB0aGUgc2FtZSBUb21jYXQgNQorICAgICAgICBpbnN0YW5jZS48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiByZXF1aXJlZD0idHJ1ZSI+CisgICAgICAgIDxwPkxvZ2ljYWwgbmFtZSBvZiB0aGlzIEVuZ2luZSwgdXNlZCBpbiBsb2cgYW5kIGVycm9yIG1lc3NhZ2VzLjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgPC9hdHRyaWJ1dGVzPgorCisgIDwvc3Vic2VjdGlvbj4KKworCisgIDxzdWJzZWN0aW9uIG5hbWU9IlN0YW5kYXJkIEltcGxlbWVudGF0aW9uIj4KKworICAgIDxwPlRoZSBzdGFuZGFyZCBpbXBsZW1lbnRhdGlvbiBvZiA8c3Ryb25nPkVuZ2luZTwvc3Ryb25nPiBpcworICAgIDxzdHJvbmc+b3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkRW5naW5lPC9zdHJvbmc+LgorICAgIEl0IHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBhdHRyaWJ1dGVzIChpbiBhZGRpdGlvbiB0byB0aGUKKyAgICBjb21tb24gYXR0cmlidXRlcyBsaXN0ZWQgYWJvdmUpOjwvcD4KKworICAgIDxhdHRyaWJ1dGVzPgorCisgICAgPC9hdHRyaWJ1dGVzPgorCisgIDwvc3Vic2VjdGlvbj4KKworCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iTmVzdGVkIENvbXBvbmVudHMiPgorCisgIDxwPllvdSBjYW4gbmVzdCBvbmUgb3IgbW9yZSA8YSBocmVmPSJob3N0Lmh0bWwiPkhvc3Q8L2E+IGVsZW1lbnRzIGluc2lkZQorICB0aGlzIDxzdHJvbmc+RW5naW5lPC9zdHJvbmc+IGVsZW1lbnQsIGVhY2ggcmVwcmVzZW50aW5nIGEgZGlmZmVyZW50IHZpcnR1YWwKKyAgaG9zdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBzZXJ2ZXIuICBBdCBsZWFzdCBvbmUgPGEgaHJlZj0iaG9zdC5odG1sIj5Ib3N0PC9hPgorICBpcyByZXF1aXJlZCwgYW5kIG9uZSBvZiB0aGUgbmVzdGVkIDxhIGhyZWY9Imhvc3QuaHRtbCI+SG9zdHM8L2E+IE1VU1QKKyAgaGF2ZSBhIG5hbWUgdGhhdCBtYXRjaGVzIHRoZSBuYW1lIHNwZWNpZmllZCBmb3IgdGhlCisgIDxjb2RlPmRlZmF1bHRIb3N0PC9jb2RlPiBhdHRyaWJ1dGUsIGxpc3RlZCBhYm92ZS48L3A+CisKKyAgPHA+WW91IGNhbiBvcHRpb25hbCBuZXN0IGEgPGEgaHJlZj0iZGVmYXVsdGNvbnRleHQuaHRtbCI+RGVmYXVsdENvbnRleHQ8L2E+CisgIGVsZW1lbnQgaW5zaWRlIHRoaXMgPHN0cm9uZz5FbmdpbmU8L3N0cm9uZz4gZWxlbWVudCwgdG8gZGVmaW5lIHRoZSBkZWZhdWx0CisgIGNoYXJhY3RlcmlzdGljcyBvZiB3ZWIgYXBwbGljYXRpb25zIHRoYXQgYXJlIGF1dG9tYXRpY2FsbHkgZGVwbG95ZWQuPC9wPgorCisgIDxwPllvdSBjYW4gbmVzdCBhdCBtb3N0IG9uZSBpbnN0YW5jZSBvZiB0aGUgZm9sbG93aW5nIHV0aWxpdHkgY29tcG9uZW50cworICBieSBuZXN0aW5nIGEgY29ycmVzcG9uZGluZyBlbGVtZW50IGluc2lkZSB5b3VyIDxzdHJvbmc+RW5naW5lPC9zdHJvbmc+CisgIGVsZW1lbnQ6PC9wPgorICA8dWw+CisgIDxsaT48YSBocmVmPSJyZWFsbS5odG1sIj48c3Ryb25nPlJlYWxtPC9zdHJvbmc+PC9hPiAtCisgICAgICBDb25maWd1cmUgYSByZWFsbSB0aGF0IHdpbGwgYWxsb3cgaXRzCisgICAgICBkYXRhYmFzZSBvZiB1c2VycywgYW5kIHRoZWlyIGFzc29jaWF0ZWQgcm9sZXMsIHRvIGJlIHNoYXJlZCBhY3Jvc3MgYWxsCisgICAgICA8YSBocmVmPSJob3N0Lmh0bWwiPkhvc3RzPC9hPiBhbmQgPGEgaHJlZj0iY29udGV4dC5odG1sIj5Db250ZXh0czwvYT4KKyAgICAgIG5lc3RlZCBpbnNpZGUgdGhpcyBFbmdpbmUsIHVubGVzcyBvdmVycmlkZGVuIGJ5IGEKKyAgICAgIDxhIGhyZWY9InJlYWxtLmh0bWwiPlJlYWxtPC9hPiBjb25maWd1cmF0aW9uIGF0IGEgbG93ZXIgbGV2ZWwuPC9saT4KKyAgPC91bD4KKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IlNwZWNpYWwgRmVhdHVyZXMiPgorCisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iTG9nZ2luZyI+CisKKyAgICA8cD5BbiBlbmdpbmUgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSAKKyAgICAgICA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuQ29udGFpbmVyQmFzZS5bZW5naW5lbmFtZV08L2NvZGU+CisgICAgICAgbG9nIGNhdGVnb3J5LiAgTm90ZSB0aGF0IHRoZSBicmFja2V0cyBhcmUgYWN0dWFsbHkgcGFydCBvZiB0aGUgbmFtZSwKKyAgICAgICBkb24ndCBvbWl0IHRoZW0uPC9wPgorCisgIDwvc3Vic2VjdGlvbj4KKworCisgIDxzdWJzZWN0aW9uIG5hbWU9IkFjY2VzcyBMb2dzIj4KKworICAgIDxwPldoZW4geW91IHJ1biBhIHdlYiBzZXJ2ZXIsIG9uZSBvZiB0aGUgb3V0cHV0IGZpbGVzIG5vcm1hbGx5IGdlbmVyYXRlZAorICAgIGlzIGFuIDxlbT5hY2Nlc3MgbG9nPC9lbT4sIHdoaWNoIGdlbmVyYXRlcyBvbmUgbGluZSBvZiBpbmZvcm1hdGlvbiBmb3IKKyAgICBlYWNoIHJlcXVlc3QgcHJvY2Vzc2VkIGJ5IHRoZSBzZXJ2ZXIsIGluIGEgc3RhbmRhcmQgZm9ybWF0LiAgQ2F0YWxpbmEKKyAgICBpbmNsdWRlcyBhbiBvcHRpb25hbCA8YSBocmVmPSJ2YWx2ZS5odG1sIj5WYWx2ZTwvYT4gaW1wbGVtZW50YXRpb24gdGhhdAorICAgIGNhbiBjcmVhdGUgYWNjZXNzIGxvZ3MgaW4gdGhlIHNhbWUgc3RhbmRhcmQgZm9ybWF0IGNyZWF0ZWQgYnkgd2ViIHNlcnZlcnMsCisgICAgb3IgaW4gYW55IG51bWJlciBvZiBjdXN0b20gZm9ybWF0cy48L3A+CisKKyAgICA8cD5Zb3UgY2FuIGFzayBDYXRhbGluYSB0byBjcmVhdGUgYW4gYWNjZXNzIGxvZyBmb3IgYWxsIHJlcXVlc3RzCisgICAgcHJvY2Vzc2VkIGJ5IGFuIDxhIGhyZWY9ImVuZ2luZS5odG1sIj5FbmdpbmU8L2E+LAorICAgIDxhIGhyZWY9Imhvc3QuaHRtbCI+SG9zdDwvYT4sIG9yIDxhIGhyZWY9ImNvbnRleHQuaHRtbCI+Q29udGV4dDwvYT4KKyAgICBieSBuZXN0aW5nIGEgPGEgaHJlZj0idmFsdmUuaHRtbCI+VmFsdmU8L2E+IGVsZW1lbnQgbGlrZSB0aGlzOjwvcD4KKworPHNvdXJjZT4KKyZsdDtFbmdpbmUgbmFtZT0iU3RhbmRhbG9uZSIgLi4uJmd0OworICAuLi4KKyAgJmx0O1ZhbHZlIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS52YWx2ZXMuQWNjZXNzTG9nVmFsdmUiCisgICAgICAgICBwcmVmaXg9ImNhdGFsaW5hX2FjY2Vzc19sb2cuIiBzdWZmaXg9Ii50eHQiCisgICAgICAgICBwYXR0ZXJuPSJjb21tb24iLyZndDsKKyAgLi4uCismbHQ7L0VuZ2luZSZndDsKKzwvc291cmNlPgorCisgICAgPHA+U2VlIDxhIGhyZWY9InZhbHZlLmh0bWwjQWNjZXNzIExvZyBWYWx2ZSI+QWNjZXNzIExvZyBWYWx2ZTwvYT4KKyAgICBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgY29uZmlndXJhdGlvbiBhdHRyaWJ1dGVzIHRoYXQgYXJlCisgICAgc3VwcG9ydGVkLjwvcD4KKworICA8L3N1YnNlY3Rpb24+CisKKworICA8c3Vic2VjdGlvbiBuYW1lPSJMaWZlY3ljbGUgTGlzdGVuZXJzIj4KKworICAgIDxwPklmIHlvdSBoYXZlIGltcGxlbWVudGVkIGEgSmF2YSBvYmplY3QgdGhhdCBuZWVkcyB0byBrbm93IHdoZW4gdGhpcworICAgIDxzdHJvbmc+RW5naW5lPC9zdHJvbmc+IGlzIHN0YXJ0ZWQgb3Igc3RvcHBlZCwgeW91IGNhbiBkZWNsYXJlIGl0IGJ5CisgICAgbmVzdGluZyBhIDxzdHJvbmc+TGlzdGVuZXI8L3N0cm9uZz4gZWxlbWVudCBpbnNpZGUgdGhpcyBlbGVtZW50LiAgVGhlCisgICAgY2xhc3MgbmFtZSB5b3Ugc3BlY2lmeSBtdXN0IGltcGxlbWVudCB0aGUKKyAgICA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZUxpc3RlbmVyPC9jb2RlPiBpbnRlcmZhY2UsIGFuZAorICAgIGl0IHdpbGwgYmUgbm90aWZpZWQgYWJvdXQgdGhlIG9jY3VycmVuY2Ugb2YgdGhlIGNvcmVzcG9uZGluZworICAgIGxpZmVjeWNsZSBldmVudHMuICBDb25maWd1cmF0aW9uIG9mIHN1Y2ggYSBsaXN0ZW5lciBsb29rcyBsaWtlIHRoaXM6PC9wPgorCis8c291cmNlPgorJmx0O0VuZ2luZSBuYW1lPSJTdGFuZGFsb25lIiAuLi4mZ3Q7CisgIC4uLgorICAmbHQ7TGlzdGVuZXIgY2xhc3NOYW1lPSJjb20ubXljb21wYW55Lm15cGFja2FnZS5NeUxpc3RlbmVyIiAuLi4gJmd0OworICAuLi4KKyZsdDsvRW5naW5lJmd0OworPC9zb3VyY2U+CisKKyAgICA8cD5Ob3RlIHRoYXQgYSBMaXN0ZW5lciBjYW4gaGF2ZSBhbnkgbnVtYmVyIG9mIGFkZGl0aW9uYWwgcHJvcGVydGllcworICAgIHRoYXQgbWF5IGJlIGNvbmZpZ3VyZWQgZnJvbSB0aGlzIGVsZW1lbnQuICBBdHRyaWJ1dGUgbmFtZXMgYXJlIG1hdGNoZWQKKyAgICB0byBjb3JyZXNwb25kaW5nIEphdmFCZWFuIHByb3BlcnR5IG5hbWVzIHVzaW5nIHRoZSBzdGFuZGFyZCBwcm9wZXJ0eQorICAgIG1ldGhvZCBuYW1pbmcgcGF0dGVybnMuPC9wPgorCisgIDwvc3Vic2VjdGlvbj4KKworCisgIDxzdWJzZWN0aW9uIG5hbWU9IlJlcXVlc3QgRmlsdGVycyI+CisKKyAgICA8cD5Zb3UgY2FuIGFzayBDYXRhbGluYSB0byBjaGVjayB0aGUgSVAgYWRkcmVzcywgb3IgaG9zdCBuYW1lLCBvbiBldmVyeQorICAgIGluY29taW5nIHJlcXVlc3QgZGlyZWN0ZWQgdG8gdGhlIHN1cnJvdW5kaW5nCisgICAgPGEgaHJlZj0iZW5naW5lLmh0bWwiPkVuZ2luZTwvYT4sIDxhIGhyZWY9Imhvc3QuaHRtbCI+SG9zdDwvYT4sIG9yCisgICAgPGEgaHJlZj0iY29udGV4dC5odG1sIj5Db250ZXh0PC9hPiBlbGVtZW50LiAgVGhlIHJlbW90ZSBhZGRyZXNzIG9yIG5hbWUKKyAgICB3aWxsIGJlIGNoZWNrZWQgYWdhaW5zdCBhIGNvbmZpZ3VyZWQgbGlzdCBvZiAiYWNjZXB0IiBhbmQvb3IgImRlbnkiCisgICAgZmlsdGVycywgd2hpY2ggYXJlIGRlZmluZWQgdXNpbmcgdGhlIFJlZ3VsYXIgRXhwcmVzc2lvbiBzeW50YXggc3VwcG9ydGVkCisgICAgYnkgdGhlIDxhIGhyZWY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvcmVnZXhwLyI+SmFrYXJ0YSBSZWdleHA8L2E+CisgICAgcmVndWxhciBleHByZXNzaW9uIGxpYnJhcnkuICBSZXF1ZXN0cyB0aGF0IGNvbWUgZnJvbSBsb2NhdGlvbnMgdGhhdCBhcmUKKyAgICBub3QgYWNjZXB0ZWQgd2lsbCBiZSByZWplY3RlZCB3aXRoIGFuIEhUVFAgIkZvcmJpZGRlbiIgZXJyb3IuCisgICAgRXhhbXBsZSBmaWx0ZXIgZGVjbGFyYXRpb25zOjwvcD4KKworPHNvdXJjZT4KKyZsdDtFbmdpbmUgbmFtZT0iU3RhbmRhbG9uZSIgLi4uJmd0OworICAuLi4KKyAgJmx0O1ZhbHZlIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS52YWx2ZXMuUmVtb3RlSG9zdFZhbHZlIgorICAgICAgICAgYWxsb3c9IioubXljb21wYW55LmNvbSx3d3cueW91cmNvbXBhbnkuY29tIi8mZ3Q7CisgICZsdDtWYWx2ZSBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEudmFsdmVzLlJlbW90ZUFkZHJWYWx2ZSIKKyAgICAgICAgIGRlbnk9IjE5Mi4xNjguMS4qIi8mZ3Q7CisgIC4uLgorJmx0Oy9FbmdpbmUmZ3Q7Cis8L3NvdXJjZT4KKworICA8cD5TZWUgPGEgaHJlZj0idmFsdmUuaHRtbCNSZW1vdGUgQWRkcmVzcyBGaWx0ZXIiPlJlbW90ZSBBZGRyZXNzIEZpbHRlcjwvYT4KKyAgYW5kIDxhIGhyZWY9InZhbHZlLmh0bWwjUmVtb3RlIEhvc3QgRmlsdGVyIj5SZW1vdGUgSG9zdCBGaWx0ZXI8L2E+IGZvcgorICBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdGhhdCBhcmUgc3VwcG9ydGVkLjwvcD4KKworICA8L3N1YnNlY3Rpb24+CisKKworPC9zZWN0aW9uPgorCisKKzwvYm9keT4KKworCis8L2RvY3VtZW50PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9jb25maWcvZ2xvYmFscmVzb3VyY2VzLnhtbCBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvY29uZmlnL2dsb2JhbHJlc291cmNlcy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBmNTE5MgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvY29uZmlnL2dsb2JhbHJlc291cmNlcy54bWwKQEAgLTAsMCArMSwyMzQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCFET0NUWVBFIGRvY3VtZW50IFsKKyAgPCFFTlRJVFkgcHJvamVjdCBTWVNURU0gInByb2plY3QueG1sIj4KK10+Cis8ZG9jdW1lbnQgdXJsPSJnbG9iYWxyZXNvdXJjZXMuaHRtbCI+CisKKyAgJnByb2plY3Q7CisKKyAgPHByb3BlcnRpZXM+CisgICAgPGF1dGhvciBlbWFpbD0icmVtbUBhcGFjaGUub3JnIj5SZW15IE1hdWNoZXJhdDwvYXV0aG9yPgorICAgIDxhdXRob3IgZW1haWw9InlvYXZzQGFwYWNoZS5vcmciPllvYXYgU2hhcGlyYTwvYXV0aG9yPgorICAgIDx0aXRsZT5UaGUgR2xvYmFsTmFtaW5nUmVzb3VyY2VzIENvbXBvbmVudDwvdGl0bGU+CisgIDwvcHJvcGVydGllcz4KKworPGJvZHk+CisKKworPHNlY3Rpb24gbmFtZT0iSW50cm9kdWN0aW9uIj4KKworICA8cD5UaGUgPHN0cm9uZz5HbG9iYWxOYW1pbmdSZXNvdXJjZXM8L3N0cm9uZz4gZWxlbWVudCBkZWZpbmVzIHRoZSBnbG9iYWwKKyAgSk5ESSByZXNvdXJjZXMgZm9yIHRoZSA8YSBocmVmPSJzZXJ2ZXIuaHRtbCI+U2VydmVyPC9hPi48L3A+CisKKyAgPHA+VGhlc2UgcmVzb3VyY2VzIGFyZSBsaXN0ZWQgaW4gdGhlIHNlcnZlcidzIGdsb2JhbCBKTkRJIHJlc291cmNlIGNvbnRleHQuCisgICBUaGlzIGNvbnRleHQgaXMgZGlzdGluY3QgZnJvbSB0aGUgcGVyLXdlYi1hcHBsaWNhdGlvbiBKTkRJIGNvbnRleHRzIAorICBkZXNjcmliZWQgaW4KKyAgdGhlIDxhIGhyZWY9Ii4uL2puZGktcmVzb3VyY2VzLWhvd3RvLmh0bWwiPkpOREkgUmVzb3VyY2VzIEhPVy1UTzwvYT4uCisgIFdpdGggdGhlIGV4Y2VwdGlvbiBvZiA8Y29kZT48c3Ryb25nPiZsdDtFbnZpcm9ubWVudCZndDs8L3N0cm9uZz48L2NvZGU+IAorICB2YWx1ZXMsCisgIHRoZSByZXNvdXJjZXMgZGVmaW5lZCBpbiB0aGlzIGVsZW1lbnQgYXJlIDxzdHJvbmc+bm90PC9zdHJvbmc+IHZpc2libGUgaW4KKyAgdGhlIHBlci13ZWItYXBwbGljYXRpb24gY29udGV4dHMgdW5sZXNzIHlvdSBleHBsaWNpdGx5IGxpbmsgdGhlbSB3aXRoCisgIDxhIGhyZWY9ImNvbnRleHQuaHRtbCNSZXNvdXJjZSBMaW5rcyI+Jmx0O1Jlc291cmNlTGluayZndDs8L2E+IGVsZW1lbnRzLgorICA8L3A+CisKKzwvc2VjdGlvbj4KKworCis8c2VjdGlvbiBuYW1lPSJBdHRyaWJ1dGVzIj4KKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9Ik5lc3RlZCBDb21wb25lbnRzIj4KKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IlNwZWNpYWwgRmVhdHVyZXMiPgorCisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iRW52aXJvbm1lbnQgRW50cmllcyI+CisKKyAgPHA+WW91IGNhbiBjb25maWd1cmUgbmFtZWQgdmFsdWVzIHRoYXQgd2lsbCBiZSBtYWRlIHZpc2libGUgdG8gYWxsCisgICAgd2ViIGFwcGxpY2F0aW9ucyBhcyBlbnZpcm9ubWVudCBlbnRyeSByZXNvdXJjZXMgYnkgbmVzdGluZworICAgIDxjb2RlPiZsdDtFbnZpcm9ubWVudCZndDs8L2NvZGU+IGVudHJpZXMgaW5zaWRlIHRoaXMgZWxlbWVudC4gRm9yCisgICAgZXhhbXBsZSwgeW91IGNhbiBjcmVhdGUgYW4gZW52aXJvbm1lbnQgZW50cnkgbGlrZSB0aGlzOjwvcD4KKzxzb3VyY2U+CismbHQ7R2xvYmFsTmFtaW5nUmVzb3VyY2VzIC4uLiZndDsKKyAgLi4uCisgICZsdDtFbnZpcm9ubWVudCBuYW1lPSJtYXhFeGVtcHRpb25zIiB2YWx1ZT0iMTAiCisgICAgICAgICB0eXBlPSJqYXZhLmxhbmcuSW50ZWdlciIgb3ZlcnJpZGU9ImZhbHNlIi8mZ3Q7CisgIC4uLgorJmx0Oy9HbG9iYWxOYW1pbmdSZXNvdXJjZXMmZ3Q7Cis8L3NvdXJjZT4KKworICAgIDxwPlRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgaW5jbHVzaW9uIG9mIHRoZSBmb2xsb3dpbmcgZWxlbWVudCBpbiB0aGUKKyAgICB3ZWIgYXBwbGljYXRpb24gZGVwbG95bWVudCBkZXNjcmlwdG9yICg8Y29kZT4vV0VCLUlORi93ZWIueG1sPC9jb2RlPik6CisgICAgPC9wPgorPHNvdXJjZT4KKyZsdDtlbnYtZW50cnkmZ3Q7CisgICZsdDtlbnYtZW50cnktbmFtZSZndDttYXhFeGVtcHRpb25zJmx0Oy9wYXJhbS1uYW1lJmd0OworICAmbHQ7ZW52LWVudHJ5LXZhbHVlJmd0OzEwJmx0Oy9lbnYtZW50cnktdmFsdWUmZ3Q7CisgICZsdDtlbnYtZW50cnktdHlwZSZndDtqYXZhLmxhbmcuSW50ZWdlciZsdDsvZW52LWVudHJ5LXR5cGUmZ3Q7CismbHQ7L2Vudi1lbnRyeSZndDsKKzwvc291cmNlPgorICAgIDxwPmJ1dCBkb2VzIDxlbT5ub3Q8L2VtPiByZXF1aXJlIG1vZGlmaWNhdGlvbiBvZiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yCisgICAgdG8gY3VzdG9taXplIHRoaXMgdmFsdWUuPC9wPgorCisgICAgPHA+VGhlIHZhbGlkIGF0dHJpYnV0ZXMgZm9yIGFuIDxjb2RlPiZsdDtFbnZpcm9ubWVudCZndDs8L2NvZGU+IGVsZW1lbnQKKyAgICBhcmUgYXMgZm9sbG93czo8L3A+CisKKyAgICA8YXR0cmlidXRlcz4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXNjcmlwdGlvbiIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+T3B0aW9uYWwsIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoaXMgZW52aXJvbm1lbnQgZW50cnkuPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgcmVxdWlyZWQ9InRydWUiPgorICAgICAgICA8cD5UaGUgbmFtZSBvZiB0aGUgZW52aXJvbm1lbnQgZW50cnkgdG8gYmUgY3JlYXRlZCwgcmVsYXRpdmUgdG8gdGhlCisgICAgICAgIDxjb2RlPmphdmE6Y29tcC9lbnY8L2NvZGU+IGNvbnRleHQuPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ib3ZlcnJpZGUiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPlNldCB0aGlzIHRvIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB5b3UgZG8gPHN0cm9uZz5ub3Q8L3N0cm9uZz4gd2FudAorICAgICAgICBhbiA8Y29kZT4mbHQ7ZW52LWVudHJ5Jmd0OzwvY29kZT4gZm9yIHRoZSBzYW1lIGVudmlyb25tZW50IGVudHJ5IG5hbWUsCisgICAgICAgIGZvdW5kIGluIHRoZSB3ZWIgYXBwbGljYXRpb24gZGVwbG95bWVudCBkZXNjcmlwdG9yLCB0byBvdmVycmlkZSB0aGUKKyAgICAgICAgdmFsdWUgc3BlY2lmaWVkIGhlcmUuICBCeSBkZWZhdWx0LCBvdmVycmlkZXMgYXJlIGFsbG93ZWQuPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZSIgcmVxdWlyZWQ9InRydWUiPgorICAgICAgICA8cD5UaGUgZnVsbHkgcXVhbGlmaWVkIEphdmEgY2xhc3MgbmFtZSBleHBlY3RlZCBieSB0aGUgd2ViIGFwcGxpY2F0aW9uCisgICAgICAgIGZvciB0aGlzIGVudmlyb25tZW50IGVudHJ5LiAgTXVzdCBiZSBvbmUgb2YgdGhlIGxlZ2FsIHZhbHVlcyBmb3IKKyAgICAgICAgPGNvZGU+Jmx0O2Vudi1lbnRyeS10eXBlJmd0OzwvY29kZT4gaW4gdGhlIHdlYiBhcHBsaWNhdGlvbiBkZXBsb3ltZW50CisgICAgICAgIGRlc2NyaXB0b3I6ICA8Y29kZT5qYXZhLmxhbmcuQm9vbGVhbjwvY29kZT4sCisgICAgICAgIDxjb2RlPmphdmEubGFuZy5CeXRlPC9jb2RlPiwgPGNvZGU+amF2YS5sYW5nLkNoYXJhY3RlcjwvY29kZT4sCisgICAgICAgIDxjb2RlPmphdmEubGFuZy5Eb3VibGU8L2NvZGU+LCA8Y29kZT5qYXZhLmxhbmcuRmxvYXQ8L2NvZGU+LAorICAgICAgICA8Y29kZT5qYXZhLmxhbmcuSW50ZWdlcjwvY29kZT4sIDxjb2RlPmphdmEubGFuZy5Mb25nPC9jb2RlPiwKKyAgICAgICAgPGNvZGU+amF2YS5sYW5nLlNob3J0PC9jb2RlPiwgb3IgPGNvZGU+amF2YS5sYW5nLlN0cmluZzwvY29kZT4uPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHJlcXVpcmVkPSJ0cnVlIj4KKyAgICAgICAgPHA+VGhlIHBhcmFtZXRlciB2YWx1ZSB0aGF0IHdpbGwgYmUgcHJlc2VudGVkIHRvIHRoZSBhcHBsaWNhdGlvbgorICAgICAgICB3aGVuIHJlcXVlc3RlZCBmcm9tIHRoZSBKTkRJIGNvbnRleHQuICBUaGlzIHZhbHVlIG11c3QgYmUgY29udmVydGFibGUKKyAgICAgICAgdG8gdGhlIEphdmEgdHlwZSBkZWZpbmVkIGJ5IHRoZSA8Y29kZT50eXBlPC9jb2RlPiBhdHRyaWJ1dGUuPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICA8L2F0dHJpYnV0ZXM+CisKKyAgPC9zdWJzZWN0aW9uPgorCisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iUmVzb3VyY2UgRGVmaW5pdGlvbnMiPgorCisgICAgPHA+WW91IGNhbiBkZWNsYXJlIHRoZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgcmVzb3VyY2VzCisgICAgdG8gYmUgcmV0dXJuZWQgZm9yIEpOREkgbG9va3VwcyBvZiA8Y29kZT4mbHQ7cmVzb3VyY2UtcmVmJmd0OzwvY29kZT4gYW5kCisgICAgPGNvZGU+Jmx0O3Jlc291cmNlLWVudi1yZWYmZ3Q7PC9jb2RlPiBlbGVtZW50cyBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uCisgICAgZGVwbG95bWVudCBkZXNjcmlwdG9yIGJ5IGRlZmluaW5nIHRoZW0gaW4gdGhpcyBlbGVtZW50IGFuZCB0aGVuIGxpbmtpbmcgCisgICAgdGhlbSB3aXRoIDxhIGhyZWY9ImNvbnRleHQuaHRtbCNSZXNvdXJjZSBMaW5rcyI+Jmx0O1Jlc291cmNlTGluayZndDs8L2E+IAorICAgIGVsZW1lbnRzCisgICAgaW4gdGhlIDxjb2RlPjxzdHJvbmc+Jmx0O0NvbnRleHQmZ3Q7PC9zdHJvbmc+PC9jb2RlPiBlbGVtZW50LiAgCisKKyAgICBZb3UgPHN0cm9uZz5NVVNUPC9zdHJvbmc+IGFsc28gZGVmaW5lIGFueSBvdGhlciBuZWVkZWQgcGFyYW1ldGVycyB1c2luZworICAgIGF0dHJpYnV0ZXMgb24gdGhlIFJlc291cmNlIGVsZW1lbnQsIHRvIGNvbmZpZ3VyZQorICAgIHRoZSBvYmplY3QgZmFjdG9yeSB0byBiZSB1c2VkIChpZiBub3Qga25vd24gdG8gVG9tY2F0IGFscmVhZHkpLCBhbmQKKyAgICB0aGUgcHJvcGVydGllcyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGF0IG9iamVjdCBmYWN0b3J5LjwvcD4KKworICAgIDxwPkZvciBleGFtcGxlLCB5b3UgY2FuIGNyZWF0ZSBhIHJlc291cmNlIGRlZmluaXRpb24gbGlrZSB0aGlzOjwvcD4KKzxzb3VyY2U+CismbHQ7R2xvYmFsTmFtaW5nUmVzb3VyY2VzIC4uLiZndDsKKyAgLi4uCisgICZsdDtSZXNvdXJjZSBuYW1lPSJqZGJjL0VtcGxveWVlREIiIGF1dGg9IkNvbnRhaW5lciIKKyAgICAgICAgICAgIHR5cGU9ImphdmF4LnNxbC5EYXRhU291cmNlIgorICAgICBkZXNjcmlwdGlvbj0iRW1wbG95ZWVzIERhdGFiYXNlIGZvciBIUiBBcHBsaWNhdGlvbnMiLyZndDsKKyAgLi4uCismbHQ7L0dsb2JhbE5hbWluZ1Jlc291cmNlcyZndDsKKzwvc291cmNlPgorCisgICAgPHA+VGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSBpbmNsdXNpb24gb2YgdGhlIGZvbGxvd2luZyBlbGVtZW50IGluIHRoZQorICAgIHdlYiBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IgKDxjb2RlPi9XRUItSU5GL3dlYi54bWw8L2NvZGU+KTo8L3A+Cis8c291cmNlPgorJmx0O3Jlc291cmNlLXJlZiZndDsKKyAgJmx0O2Rlc2NyaXB0aW9uJmd0O0VtcGxveWVlcyBEYXRhYmFzZSBmb3IgSFIgQXBwbGljYXRpb25zJmx0Oy9kZXNjcmlwdGlvbiZndDsKKyAgJmx0O3Jlcy1yZWYtbmFtZSZndDtqZGJjL0VtcGxveWVlREImbHQ7L3Jlcy1yZWYtbmFtZSZndDsKKyAgJmx0O3Jlcy1yZWYtdHlwZSZndDtqYXZheC5zcWwuRGF0YVNvdXJjZSZsdDsvcmVzLXJlZi10eXBlJmd0OworICAmbHQ7cmVzLWF1dGgmZ3Q7Q29udGFpbmVyJmx0Oy9yZXMtYXV0aCZndDsKKyZsdDsvcmVzb3VyY2UtcmVmJmd0OworPC9zb3VyY2U+CisKKyAgICA8cD5idXQgZG9lcyA8ZW0+bm90PC9lbT4gcmVxdWlyZSBtb2RpZmljYXRpb24gb2YgdGhlIGRlcGxveW1lbnQKKyAgICBkZXNjcmlwdG9yIHRvIGN1c3RvbWl6ZSB0aGlzIHZhbHVlLjwvcD4KKworICAgIDxwPlRoZSB2YWxpZCBhdHRyaXV0ZXMgZm9yIGEgPGNvZGU+Jmx0O1Jlc291cmNlJmd0OzwvY29kZT4gZWxlbWVudAorICAgIGFyZSBhcyBmb2xsb3dzOjwvcD4KKworICAgIDxhdHRyaWJ1dGVzPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9ImF1dGgiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPlNwZWNpZnkgd2hldGhlciB0aGUgd2ViIEFwcGxpY2F0aW9uIGNvZGUgc2lnbnMgb24gdG8gdGhlCisgICAgICAgIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UgbWFuYWdlciBwcm9ncmFtYXRpY2FsbHksIG9yIHdoZXRoZXIgdGhlCisgICAgICAgIENvbnRhaW5lciB3aWxsIHNpZ24gb24gdG8gdGhlIHJlc291cmNlIG1hbmFnZXIgb24gYmVoYWxmIG9mIHRoZQorICAgICAgICBhcHBsaWNhdGlvbi4gIFRoZSB2YWx1ZSBvZiB0aGlzIGF0dHJpYnV0ZSBtdXN0IGJlCisgICAgICAgIDxjb2RlPkFwcGxpY2F0aW9uPC9jb2RlPiBvciA8Y29kZT5Db250YWluZXI8L2NvZGU+LiAgVGhpcworICAgICAgICBhdHRyaWJ1dGUgaXMgPHN0cm9uZz5yZXF1aXJlZDwvc3Ryb25nPiBpZiB0aGUgd2ViIGFwcGxpY2F0aW9uCisgICAgICAgIHdpbGwgdXNlIGEgPGNvZGU+Jmx0O3Jlc291cmNlLXJlZiZndDs8L2NvZGU+IGVsZW1lbnQgaW4gdGhlIHdlYgorICAgICAgICBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IsIGJ1dCBpcyBvcHRpb25hbCBpZiB0aGUKKyAgICAgICAgYXBwbGljYXRpb24gdXNlcyBhIDxjb2RlPiZsdDtyZXNvdXJjZS1lbnYtcmVmJmd0OzwvY29kZT4gaW5zdGVhZC48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXNjcmlwdGlvbiIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+T3B0aW9uYWwsIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoaXMgcmVzb3VyY2UuPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgcmVxdWlyZWQ9InRydWUiPgorICAgICAgICA8cD5UaGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UgdG8gYmUgY3JlYXRlZCwgcmVsYXRpdmUgdG8gdGhlCisgICAgICAgIDxjb2RlPmphdmE6Y29tcC9lbnY8L2NvZGU+IGNvbnRleHQuPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic2NvcGUiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPlNwZWNpZnkgd2hldGhlciBjb25uZWN0aW9ucyBvYnRhaW5lZCB0aHJvdWdoIHRoaXMgcmVzb3VyY2UKKyAgICAgICAgbWFuYWdlciBjYW4gYmUgc2hhcmVkLiAgVGhlIHZhbHVlIG9mIHRoaXMgYXR0cmlidXRlIG11c3QgYmUKKyAgICAgICAgPGNvZGU+U2hhcmVhYmxlPC9jb2RlPiBvciA8Y29kZT5VbnNoYXJlYWJsZTwvY29kZT4uICBCeSBkZWZhdWx0LAorICAgICAgICBjb25uZWN0aW9ucyBhcmUgYXNzdW1lZCB0byBiZSBzaGFyZWFibGUuPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZSIgcmVxdWlyZWQ9InRydWUiPgorICAgICAgICA8cD5UaGUgZnVsbHkgcXVhbGlmaWVkIEphdmEgY2xhc3MgbmFtZSBleHBlY3RlZCBieSB0aGUgd2ViCisgICAgICAgIGFwcGxpY2F0aW9uIHdoZW4gaXQgcGVyZm9ybXMgYSBsb29rdXAgZm9yIHRoaXMgcmVzb3VyY2UuPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICA8L2F0dHJpYnV0ZXM+CisKKworICA8L3N1YnNlY3Rpb24+CisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iUmVzb3VyY2UgTGlua3MiPgorICAgIDxwPlVzZSA8YSBocmVmPSJjb250ZXh0Lmh0bWwjUmVzb3VyY2UgTGlua3MiPiZsdDtSZXNvdXJjZUxpbmsmZ3Q7PC9hPiAKKyAgICBlbGVtZW50cyB0byBsaW5rIHJlc291cmNlcyBmcm9tIHRoZSBnbG9iYWwgY29udGV4dCBpbnRvIAorICAgIHBlci13ZWItYXBwbGljYXRpb24gY29udGV4dHMuIEhlcmUgaXMgYW4gZXhhbXBsZSBvZiBtYWtpbmcgYSBjdXN0b20gCisgICAgZmFjdG9yeSBhdmFpbGFibGUgdG8gYWxsIGFwcGxpY2F0aW9ucyBpbiB0aGUgc2VydmVyLCBiYXNlZCBvbiB0aGUgZXhhbXBsZSAKKyAgICBkZWZpbml0aW9uIGluIHRoZSAKKyAgICA8YSBocmVmPSIuLi9qbmRpLXJlc291cmNlLWhvd3RvLmh0bWwjR2VuZXJpYyBKYXZhQmVhbiBSZXNvdXJjZXMiPgorICAgIEpOREkgUmVzb3VyY2UgSE9XLVRPPC9hPjoKKyAgICA8L3A+CisKKyAgICA8c291cmNlPgorICAgICAgPCFbQ0RBVEFbCisgICAgICAgIDxEZWZhdWx0Q29udGV4dD4KKyAgICAgICAgICA8UmVzb3VyY2VMaW5rIAorICAgICAgICAgICAgbmFtZT0iYmVhbi9NeUJlYW5GYWN0b3J5IgorICAgICAgICAgICAgZ2xvYmFsPSJiZWFuL015QmVhbkZhY3RvcnkiCisgICAgICAgICAgICB0eXBlPSJjb20ubXljb21wYW55Lk15QmVhbiIKKyAgICAgICAgICAvPgorICAgICAgICA8L0RlZmF1bHRDb250ZXh0PgorICAgICAgXV0+CisgICAgPC9zb3VyY2U+CisKKyAgIDwvc3Vic2VjdGlvbj4KKworPC9zZWN0aW9uPgorCisKKzwvYm9keT4KKworCis8L2RvY3VtZW50PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9jb25maWcvaG9zdC54bWwgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2NvbmZpZy9ob3N0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTIzNTYxCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9jb25maWcvaG9zdC54bWwKQEAgLTAsMCArMSw1NDEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCFET0NUWVBFIGRvY3VtZW50IFsKKyAgPCFFTlRJVFkgcHJvamVjdCBTWVNURU0gInByb2plY3QueG1sIj4KK10+Cis8ZG9jdW1lbnQgdXJsPSJob3N0Lmh0bWwiPgorCisgICZwcm9qZWN0OworCisgIDxwcm9wZXJ0aWVzPgorICAgIDxhdXRob3IgZW1haWw9ImNyYWlnbWNjQGFwYWNoZS5vcmciPkNyYWlnIFIuIE1jQ2xhbmFoYW48L2F1dGhvcj4KKyAgICA8YXV0aG9yIGVtYWlsPSJyZW1tQGFwYWNoZS5vcmciPlJlbXkgTWF1Y2hlcmF0PC9hdXRob3I+CisgICAgPGF1dGhvciBlbWFpbD0ieW9hdnNAYXBhY2hlLm9yZyI+WW9hdiBTaGFwaXJhPC9hdXRob3I+CisgICAgPHRpdGxlPlRoZSBIb3N0IENvbnRhaW5lcjwvdGl0bGU+CisgIDwvcHJvcGVydGllcz4KKworPGJvZHk+CisKKworPHNlY3Rpb24gbmFtZT0iSW50cm9kdWN0aW9uIj4KKworICA8cD5UaGUgPHN0cm9uZz5Ib3N0PC9zdHJvbmc+IGVsZW1lbnQgcmVwcmVzZW50cyBhIDxlbT52aXJ0dWFsIGhvc3Q8L2VtPiwKKyAgd2hpY2ggaXMgYW4gYXNzb2NpYXRpb24gb2YgYSBuZXR3b3JrIG5hbWUgZm9yIGEgc2VydmVyIChzdWNoIGFzCisgICJ3d3cubXljb21wYW55LmNvbSIgd2l0aCB0aGUgcGFydGljdWxhciBzZXJ2ZXIgb24gd2hpY2ggQ2F0YWxpbmEgaXMKKyAgcnVubmluZy4gIEluIG9yZGVyIHRvIGJlIGVmZmVjdGl2ZSwgdGhpcyBuYW1lIG11c3QgYmUgcmVnaXN0ZXJlZCBpbiB0aGUKKyAgPGVtPkRvbWFpbiBOYW1lIFNlcnZpY2U8L2VtPiAoRE5TKSBzZXJ2ZXIgdGhhdCBtYW5hZ2VzIHRoZSBJbnRlcm5ldAorICBkb21haW4geW91IGJlbG9uZyB0byAtIGNvbnRhY3QgeW91ciBOZXR3b3JrIEFkbWluaXN0cmF0b3IgZm9yIG1vcmUKKyAgaW5mb3JtYXRpb24uPC9wPgorCisgIDxwPkluIG1hbnkgY2FzZXMsIFN5c3RlbSBBZG1pbmlzdHJhdG9ycyB3aXNoIHRvIGFzc29jaWF0ZSBtb3JlIHRoYW4KKyAgb25lIG5ldHdvcmsgbmFtZSAoc3VjaCBhcyA8Y29kZT53d3cubXljb21wYW55LmNvbTwvY29kZT4gYW5kCisgIDxjb2RlPmNvbXBhbnkuY29tPC9jb2RlPikgd2l0aCB0aGUgc2FtZSB2aXJ0dWFsIGhvc3QgYW5kIGFwcGxpY2F0aW9ucy4KKyAgVGhpcyBjYW4gYmUgYWNjb21wbGlzaGVkIHVzaW5nIHRoZSA8YSBocmVmPSIjSG9zdCBOYW1lIEFsaWFzZXMiPkhvc3QKKyAgTmFtZSBBbGlhc2VzPC9hPiBmZWF0dXJlIGRpc2N1c3NlZCBiZWxvdy48L3A+CisKKyAgPHA+T25lIG9yIG1vcmUgPHN0cm9uZz5Ib3N0PC9zdHJvbmc+IGVsZW1lbnRzIGFyZSBuZXN0ZWQgaW5zaWRlIGFuCisgIDxhIGhyZWY9ImVuZ2luZS5odG1sIj5FbmdpbmU8L2E+IGVsZW1lbnQuICBJbnNpZGUgdGhlIEhvc3QgZWxlbWVudCwgeW91CisgIGNhbiBuZXN0IDxhIGhyZWY9ImNvbnRleHQuaHRtbCI+Q29udGV4dDwvYT4gZWxlbWVudHMgZm9yIHRoZSB3ZWIKKyAgYXBwbGljYXRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHZpcnR1YWwgaG9zdC4gIEV4YWN0bHkgb25lIG9mIHRoZSBIb3N0cworICBhc3NvY2lhdGVkIHdpdGggZWFjaCBFbmdpbmUgTVVTVCBoYXZlIGEgbmFtZSBtYXRjaGluZyB0aGUKKyAgPGNvZGU+ZGVmYXVsdEhvc3Q8L2NvZGU+IGF0dHJpYnV0ZSBvZiB0aGF0IEVuZ2luZS48L3A+CisKKyAgICA8YmxvY2txdW90ZT48ZW0+CisgICAgPHA+VGhlIGRlc2NyaXB0aW9uIGJlbG93IHVzZXMgdGhlIHZhcmlhYmxlIG5hbWUgJENBVEFMSU5BX0hPTUUKKyAgICB0byByZWZlciB0byB0aGUgZGlyZWN0b3J5IGludG8gd2hpY2ggeW91IGhhdmUgaW5zdGFsbGVkIFRvbWNhdCA1LAorICAgIGFuZCBpcyB0aGUgYmFzZSBkaXJlY3RvcnkgYWdhaW5zdCB3aGljaCBtb3N0IHJlbGF0aXZlIHBhdGhzIGFyZQorICAgIHJlc29sdmVkLiAgSG93ZXZlciwgaWYgeW91IGhhdmUgY29uZmlndXJlZCBUb21jYXQgNSBmb3IgbXVsdGlwbGUKKyAgICBpbnN0YW5jZXMgYnkgc2V0dGluZyBhIENBVEFMSU5BX0JBU0UgZGlyZWN0b3J5LCB5b3Ugc2hvdWxkIHVzZQorICAgICRDQVRBTElOQV9CQVNFIGluc3RlYWQgb2YgJENBVEFMSU5BX0hPTUUgZm9yIGVhY2ggb2YgdGhlc2UKKyAgICByZWZlcmVuY2VzLjwvcD4KKyAgICA8L2VtPjwvYmxvY2txdW90ZT4KKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IkF0dHJpYnV0ZXMiPgorCisgIDxzdWJzZWN0aW9uIG5hbWU9IkNvbW1vbiBBdHRyaWJ1dGVzIj4KKworICAgIDxwPkFsbCBpbXBsZW1lbnRhdGlvbnMgb2YgPHN0cm9uZz5Ib3N0PC9zdHJvbmc+CisgICAgc3VwcG9ydCB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6PC9wPgorCisgICAgPGF0dHJpYnV0ZXM+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYXBwQmFzZSIgcmVxdWlyZWQ9InRydWUiPgorICAgICAgICA8cD5UaGUgPGVtPkFwcGxpY2F0aW9uIEJhc2U8L2VtPiBkaXJlY3RvcnkgZm9yIHRoaXMgdmlydHVhbCBob3N0LgorICAgICAgICBUaGlzIGlzIHRoZSBwYXRobmFtZSBvZiBhIGRpcmVjdG9yeSB0aGF0IG1heSBjb250YWluIHdlYiBhcHBsaWNhdGlvbnMKKyAgICAgICAgdG8gYmUgZGVwbG95ZWQgb24gdGhpcyB2aXJ0dWFsIGhvc3QuICBZb3UgbWF5IHNwZWNpZnkgYW4KKyAgICAgICAgYWJzb2x1dGUgcGF0aG5hbWUgZm9yIHRoaXMgZGlyZWN0b3J5LCBvciBhIHBhdGhuYW1lIHRoYXQgaXMgcmVsYXRpdmUKKyAgICAgICAgdG8gdGhlIDxjb2RlPiRDQVRBTElOQV9IT01FPC9jb2RlPiBkaXJlY3RvcnkuICBTZWUKKyAgICAgICAgPGEgaHJlZj0iI0F1dG9tYXRpYyBBcHBsaWNhdGlvbiBEZXBsb3ltZW50Ij5BdXRvbWF0aWMgQXBwbGljYXRpb24KKyAgICAgICAgRGVwbG95bWVudDwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gYXV0b21hdGljIHJlY29nbml0aW9uIGFuZAorICAgICAgICBkZXBsb3ltZW50IG9mIHdlYiBhcHBsaWNhdGlvbnMgdG8gYmUgZGVwbG95ZWQgYXV0b21hdGljYWxseS48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJhdXRvRGVwbG95IiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgICA8cD5UaGlzIGZsYWcgdmFsdWUgaW5kaWNhdGVzIGlmIG5ldyB3ZWIgYXBwbGljYXRpb25zLCBkcm9wcGVkIGluIHRvCisgICAgICAgIHRoZSA8Y29kZT5hcHBCYXNlPC9jb2RlPiBkaXJlY3Rvcnkgd2hpbGUgVG9tY2F0IGlzIHJ1bm5pbmcsIHNob3VsZAorICAgICAgICBiZSBhdXRvbWF0aWNhbGx5IGRlcGxveWVkLiAgVGhlIGZsYWcncyB2YWx1ZSBkZWZhdWx0cyB0byB0cnVlLiAgU2VlCisgICAgICAgIDxhIGhyZWY9IiNBdXRvbWF0aWMgQXBwbGljYXRpb24gRGVwbG95bWVudCI+QXV0b21hdGljIEFwcGxpY2F0aW9uCisgICAgICAgIERlcGxveW1lbnQ8L2E+IGZvciBtb3JlIGluZm9ybWF0aW9uLjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9ImJhY2tncm91bmRQcm9jZXNzb3JEZWxheSIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+VGhpcyB2YWx1ZSByZXByZXNlbnRzIHRoZSBkZWxheSBpbiBzZWNvbmRzIGJldHdlZW4gdGhlIAorICAgICAgICBpbnZvY2F0aW9uIG9mIHRoZSBiYWNrZ3JvdW5kUHJvY2VzcyBtZXRob2Qgb24gdGhpcyBob3N0IGFuZCAKKyAgICAgICAgaXRzIGNoaWxkIGNvbnRhaW5lcnMsIGluY2x1ZGluZyBhbGwgY29udGV4dHMuIAorICAgICAgICBDaGlsZCBjb250YWluZXJzIHdpbGwgbm90IGJlIGludm9rZWQgaWYgdGhlaXIgZGVsYXkgdmFsdWUgaXMgbm90IAorICAgICAgICBuZWdhdGl2ZSAod2hpY2ggd291bGQgbWVhbiB0aGV5IGFyZSB1c2luZyB0aGVpciBvd24gcHJvY2Vzc2luZyAKKyAgICAgICAgdGhyZWFkKS4gU2V0dGluZyB0aGlzIHRvIGEgcG9zaXRpdmUgdmFsdWUgd2lsbCBjYXVzZSAKKyAgICAgICAgYSB0aHJlYWQgdG8gYmUgc3Bhd24uIEFmdGVyIHdhaXRpbmcgdGhlIHNwZWNpZmllZCBhbW91bnQgb2YgdGltZSwgCisgICAgICAgIHRoZSB0aHJlYWQgd2lsbCBpbnZva2UgdGhlIGJhY2tncm91bmRQcm9jZXNzIG1ldGhvZCBvbiB0aGlzIGhvc3QgCisgICAgICAgIGFuZCBhbGwgaXRzIGNoaWxkIGNvbnRhaW5lcnMuIEEgaG9zdCB3aWxsIHVzZSBiYWNrZ3JvdW5kIHByb2Nlc3NpbmcgdG8KKyAgICAgICAgcGVyZm9ybSBsaXZlIHdlYiBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IHJlbGF0ZWQgdGFza3MuIElmIG5vdCAKKyAgICAgICAgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhpcyBhdHRyaWJ1dGUgaXMgLTEsIHdoaWNoIG1lYW5zIAorICAgICAgICB0aGUgaG9zdCB3aWxsIHJlbHkgb24gdGhlIGJhY2tncm91bmQgcHJvY2Vzc2luZyB0aHJlYWQgb2YgaXRzIHBhcmVudCAKKyAgICAgICAgZW5naW5lLjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzTmFtZSIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+SmF2YSBjbGFzcyBuYW1lIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiB0byB1c2UuICBUaGlzIGNsYXNzIG11c3QKKyAgICAgICAgaW1wbGVtZW50IHRoZSA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLkhvc3Q8L2NvZGU+IGludGVyZmFjZS4KKyAgICAgICAgSWYgbm90IHNwZWNpZmllZCwgdGhlIHN0YW5kYXJkIHZhbHVlIChkZWZpbmVkIGJlbG93KSB3aWxsIGJlIHVzZWQuPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVwbG95T25TdGFydHVwIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgICA8cD5UaGlzIGZsYWcgdmFsdWUgaW5kaWNhdGVzIGlmIHdlYiBhcHBsaWNhdGlvbnMgZnJvbSB0aGlzIGhvc3Qgc2hvdWxkCisgICAgICAgIGJlIGF1dG9tYXRpY2FsbHkgZGVwbG95ZWQgYnkgdGhlIGhvc3QgY29uZmlndXJhdG9yLgorICAgICAgICBUaGUgZmxhZydzIHZhbHVlIGRlZmF1bHRzIHRvIHRydWUuICBTZWUKKyAgICAgICAgPGEgaHJlZj0iI0F1dG9tYXRpYyBBcHBsaWNhdGlvbiBEZXBsb3ltZW50Ij5BdXRvbWF0aWMgQXBwbGljYXRpb24KKyAgICAgICAgRGVwbG95bWVudDwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24uPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgcmVxdWlyZWQ9InRydWUiPgorICAgICAgICA8cD5OZXR3b3JrIG5hbWUgb2YgdGhpcyB2aXJ0dWFsIGhvc3QsIGFzIHJlZ2lzdGVyZWQgaW4geW91cgorICAgICAgICA8ZW0+RG9tYWluIE5hbWUgU2VydmljZTwvZW0+IHNlcnZlci4gIE9uZSBvZiB0aGUgSG9zdHMgbmVzdGVkIHdpdGhpbgorICAgICAgICBhbiA8YSBocmVmPSJlbmdpbmUuaHRtbCI+RW5naW5lPC9hPiBNVVNUIGhhdmUgYSBuYW1lIHRoYXQgbWF0Y2hlcyB0aGUKKyAgICAgICAgPGNvZGU+ZGVmYXVsdEhvc3Q8L2NvZGU+IHNldHRpbmcgZm9yIHRoYXQgRW5naW5lLiAgU2VlCisgICAgICAgIDxhIGhyZWY9IiNIb3N0IE5hbWUgQWxpYXNlcyI+SG9zdCBOYW1lIEFsaWFzZXM8L2E+IGZvciBpbmZvcm1hdGlvbgorICAgICAgICBvbiBob3cgdG8gYXNzaWduIG1vcmUgdGhhbiBvbmUgbmV0d29yayBuYW1lIHRvIHRoZSBzYW1lCisgICAgICAgIHZpcnR1YWwgaG9zdC48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgIDwvYXR0cmlidXRlcz4KKworICA8L3N1YnNlY3Rpb24+CisKKworICA8c3Vic2VjdGlvbiBuYW1lPSJTdGFuZGFyZCBJbXBsZW1lbnRhdGlvbiI+CisKKyAgICA8cD5UaGUgc3RhbmRhcmQgaW1wbGVtZW50YXRpb24gb2YgPHN0cm9uZz5Ib3N0PC9zdHJvbmc+IGlzCisgICAgPHN0cm9uZz5vcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRIb3N0PC9zdHJvbmc+LgorICAgIEl0IHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBhdHRyaWJ1dGVzIChpbiBhZGRpdGlvbiB0byB0aGUKKyAgICBjb21tb24gYXR0cmlidXRlcyBsaXN0ZWQgYWJvdmUpOjwvcD4KKworICAgIDxhdHRyaWJ1dGVzPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlcGxveVhNTCIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+U2V0IHRvIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB5b3Ugd2FudCB0byBkaXNhYmxlIHBhcnNpbmcgdGhlIGNvbnRleHQueG1sCisgICAgICAgIGZpbGUgZW1iZWRkZWQgaW5zaWRlIHRoZSBhcHBsaWNhdGlvbiAobG9jYXRlZCBhdCA8Y29kZT4vTUVUQS1JTkYvY29udGV4dC54bWw8L2NvZGU+KS4gCisgICAgICAgIFNlY3VyaXR5IGNvbnNpb3VzIGVudmlyb25tZW50cyBzaG91bGQgc2V0IHRoaXMgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIHByZXZlbnQKKyAgICAgICAgYXBwbGljYXRpb25zIGZyb20gaW50ZXJhY3Rpbmcgd2l0aCB0aGUgY29udGFpbmVyJ3MgY29uZmlndXJhdGlvbi4gVGhlIAorICAgICAgICBhZG1pbmlzdHJhdG9yIHdpbGwgdGhlbiBiZSByZXNwb25zaWJsZSBmb3IgcHJvdmlkaW5nIGFuIGV4dGVybmFsIGNvbnRleHQgCisgICAgICAgIGNvbmZpZ3VyYXRpb24gZmlsZSwgYW5kIHB1dCBpdCBpbiAKKyAgICAgICAgPGNvZGU+JENBVEFMSU5BX0hPTUUvY29uZi9bZW5naW5lbmFtZV0vW2hvc3RuYW1lXS88L2NvZGU+LgorICAgICAgICBUaGUgZmxhZydzIHZhbHVlIGRlZmF1bHRzIHRvIDxjb2RlPnRydWU8L2NvZGU+LjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9ImVycm9yUmVwb3J0VmFsdmVDbGFzcyIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+SmF2YSBjbGFzcyBuYW1lIG9mIHRoZSBlcnJvciByZXBvcnRpbmcgdmFsdmUgd2hpY2ggd2lsbCBiZSB1c2VkCisgICAgICAgIGJ5IHRoaXMgSG9zdC4gVGhlIHJlc3BvbnNhYmlsaXR5IG9mIHRoaXMgdmFsdmUgaXMgdG8gb3V0cHV0IGVycm9yCisgICAgICAgIHJlcG9ydHMuIFNldHRpbmcgdGhpcyBwcm9wZXJ0eSBhbGxvd3MgdG8gY3VzdG9taXplIHRoZSBsb29rIG9mIHRoZQorICAgICAgICBlcnJvciBwYWdlcyB3aGljaCB3aWxsIGJlIGdlbmVyYXRlZCBieSBUb21jYXQuIFRoaXMgY2xhc3MgbXVzdAorICAgICAgICBpbXBsZW1lbnQgdGhlCisgICAgICAgIDxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuVmFsdmU8L2NvZGU+IGludGVyZmFjZS4gSWYgbm9uZSBpcyBzcGVjaWZpZWQsCisgICAgICAgIHRoZSB2YWx1ZSA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcy5FcnJvclJlcG9ydFZhbHZlPC9jb2RlPgorICAgICAgICB3aWxsIGJlIHVzZWQgYnkgZGVmYXVsdC48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ1bnBhY2tXQVJzIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgICA8cD5TZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgeW91IHdhbnQgd2ViIGFwcGxpY2F0aW9ucyB0aGF0IGFyZQorICAgICAgICBwbGFjZWQgaW4gdGhlIDxjb2RlPmFwcEJhc2U8L2NvZGU+IGRpcmVjdG9yeSBhcyB3ZWIgYXBwbGljYXRpb24KKyAgICAgICAgYXJjaGl2ZSAoV0FSKSBmaWxlcyB0byBiZSB1bnBhY2tlZCBpbnRvIGEgY29ycmVzcG9uZGluZyBkaXNrIGRpcmVjdG9yeQorICAgICAgICBzdHJ1Y3R1cmUsIDxjb2RlPmZhbHNlPC9jb2RlPiB0byBydW4gc3VjaCB3ZWIgYXBwbGljYXRpb25zIGRpcmVjdGx5CisgICAgICAgIGZyb20gYSBXQVIgZmlsZS4gIFNlZQorICAgICAgICA8YSBocmVmPSIjQXV0b21hdGljIEFwcGxpY2F0aW9uIERlcGxveW1lbnQiPkF1dG9tYXRpYyBBcHBsaWNhdGlvbgorICAgICAgICBEZXBsb3ltZW50PC9hPiBmb3IgbW9yZSBpbmZvcm1hdGlvbi48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ3b3JrRGlyIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgICA8cD5QYXRobmFtZSB0byBhIHNjcmF0Y2ggZGlyZWN0b3J5IHRvIGJlIHVzZWQgYnkgYXBwbGljYXRpb25zIGZvcgorICAgICAgICB0aGlzIEhvc3QuIEVhY2ggYXBwbGljYXRpb24gd2lsbCBoYXZlIGl0cyBvd24gc3ViIGRpcmVjdG9yeSB3aXRoCisgICAgICAgIHRlbXBvcmFyeSByZWFkLXdyaXRlIHVzZS4gIENvbmZpZ3VyaW5nIGEgQ29udGV4dCB3b3JrRGlyIHdpbGwgb3ZlcnJpZGUKKyAgICAgICAgdXNlIG9mIHRoZSBIb3N0IHdvcmtEaXIgY29uZmlndXJhdGlvbi4gIFRoaXMgZGlyZWN0b3J5IHdpbGwgYmUgbWFkZQorICAgICAgICB2aXNpYmxlIHRvIHNlcnZsZXRzIGluIHRoZSB3ZWIgYXBwbGljYXRpb24gYnkgYSBzZXJ2bGV0IGNvbnRleHQKKyAgICAgICAgYXR0cmlidXRlIChvZiB0eXBlIDxjb2RlPmphdmEuaW8uRmlsZTwvY29kZT4pIG5hbWVkCisgICAgICAgIDxjb2RlPmphdmF4LnNlcnZsZXQuY29udGV4dC50ZW1wZGlyPC9jb2RlPiBhcyBkZXNjcmliZWQgaW4gdGhlCisgICAgICAgIFNlcnZsZXQgU3BlY2lmaWNhdGlvbi4gIElmIG5vdCBzcGVjaWZpZWQsIGEgc3VpdGFibGUgZGlyZWN0b3J5CisgICAgICAgIHVuZGVybmVhdGggPGNvZGU+JENBVEFMSU5BX0hPTUUvd29yazwvY29kZT4gd2lsbCBiZSBwcm92aWRlZC48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgIDwvYXR0cmlidXRlcz4KKworICA8L3N1YnNlY3Rpb24+CisKKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9Ik5lc3RlZCBDb21wb25lbnRzIj4KKworICA8cD5Zb3UgY2FuIG5lc3Qgb25lIG9yIG1vcmUgPGEgaHJlZj0iY29udGV4dC5odG1sIj5Db250ZXh0PC9hPiBlbGVtZW50cworICBpbnNpZGUgdGhpcyA8c3Ryb25nPkhvc3Q8L3N0cm9uZz4gZWxlbWVudCwgZWFjaCByZXByZXNlbnRpbmcgYSBkaWZmZXJlbnQgd2ViCisgIGFwcGxpY2F0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHZpcnR1YWwgaG9zdC4gIEluIGFkZGl0aW9uLCB5b3UgY2FuIG5lc3QgYQorICBzaW5nbGUgPGEgaHJlZj0iZGVmYXVsdGNvbnRleHQuaHRtbCI+RGVmYXVsdENvbnRleHQ8L2E+IGVsZW1lbnQgdGhhdCBkZWZpbmVzCisgIGRlZmF1bHQgdmFsdWVzIGZvciBzdWJzZXF1ZW50bHkgZGVwbG95ZWQgd2ViIGFwcGxpY2F0aW9ucy48L3A+CisKKyAgPHA+WW91IGNhbiBvcHRpb25hbCBuZXN0IGEgPGEgaHJlZj0iZGVmYXVsdGNvbnRleHQuaHRtbCI+RGVmYXVsdENvbnRleHQ8L2E+CisgIGVsZW1lbnQgaW5zaWRlIHRoaXMgPHN0cm9uZz5Ib3N0PC9zdHJvbmc+IGVsZW1lbnQsIHRvIGRlZmluZSB0aGUgZGVmYXVsdAorICBjaGFyYWN0ZXJpc3RpY3Mgb2Ygd2ViIGFwcGxpY2F0aW9ucyB0aGF0IGFyZSBhdXRvbWF0aWNhbGx5IGRlcGxveWVkLjwvcD4KKworICA8cD5Zb3UgY2FuIG5lc3QgYXQgbW9zdCBvbmUgaW5zdGFuY2Ugb2YgdGhlIGZvbGxvd2luZyB1dGlsaXR5IGNvbXBvbmVudHMKKyAgYnkgbmVzdGluZyBhIGNvcnJlc3BvbmRpbmcgZWxlbWVudCBpbnNpZGUgeW91ciA8c3Ryb25nPkhvc3Q8L3N0cm9uZz4KKyAgZWxlbWVudDo8L3A+CisgIDx1bD4KKyAgPGxpPjxhIGhyZWY9InJlYWxtLmh0bWwiPjxzdHJvbmc+UmVhbG08L3N0cm9uZz48L2E+IC0KKyAgICAgIENvbmZpZ3VyZSBhIHJlYWxtIHRoYXQgd2lsbCBhbGxvdyBpdHMKKyAgICAgIGRhdGFiYXNlIG9mIHVzZXJzLCBhbmQgdGhlaXIgYXNzb2NpYXRlZCByb2xlcywgdG8gYmUgc2hhcmVkIGFjcm9zcyBhbGwKKyAgICAgIDxhIGhyZWY9ImNvbnRleHQuaHRtbCI+Q29udGV4dHM8L2E+IG5lc3RlZCBpbnNpZGUgdGhpcyBIb3N0ICh1bmxlc3MKKyAgICAgIG92ZXJyaWRkZW4gYnkgYSA8YSBocmVmPSJyZWFsbS5odG1sIj5SZWFsbTwvYT4gY29uZmlndXJhdGlvbgorICAgICAgYXQgYSBsb3dlciBsZXZlbCkuPC9saT4KKyAgPC91bD4KKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IlNwZWNpYWwgRmVhdHVyZXMiPgorCisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iTG9nZ2luZyI+CisKKyAgICA8cD5BIGhvc3QgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSAKKyAgICAgICA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuQ29udGFpbmVyQmFzZS5bZW5naW5lbmFtZV0uW2hvc3RuYW1lXTwvY29kZT4KKyAgICAgICBsb2cgY2F0ZWdvcnkuICBOb3RlIHRoYXQgdGhlIGJyYWNrZXRzIGFyZSBhY3R1YWxsIHBhcnQgb2YgdGhlIG5hbWUsCisgICAgICAgZG9uJ3Qgb21pdCB0aGVtLjwvcD4KKworICA8L3N1YnNlY3Rpb24+CisKKworICA8c3Vic2VjdGlvbiBuYW1lPSJBY2Nlc3MgTG9ncyI+CisKKyAgICA8cD5XaGVuIHlvdSBydW4gYSB3ZWIgc2VydmVyLCBvbmUgb2YgdGhlIG91dHB1dCBmaWxlcyBub3JtYWxseSBnZW5lcmF0ZWQKKyAgICBpcyBhbiA8ZW0+YWNjZXNzIGxvZzwvZW0+LCB3aGljaCBnZW5lcmF0ZXMgb25lIGxpbmUgb2YgaW5mb3JtYXRpb24gZm9yCisgICAgZWFjaCByZXF1ZXN0IHByb2Nlc3NlZCBieSB0aGUgc2VydmVyLCBpbiBhIHN0YW5kYXJkIGZvcm1hdC4gIENhdGFsaW5hCisgICAgaW5jbHVkZXMgYW4gb3B0aW9uYWwgPGEgaHJlZj0idmFsdmUuaHRtbCI+VmFsdmU8L2E+IGltcGxlbWVudGF0aW9uIHRoYXQKKyAgICBjYW4gY3JlYXRlIGFjY2VzcyBsb2dzIGluIHRoZSBzYW1lIHN0YW5kYXJkIGZvcm1hdCBjcmVhdGVkIGJ5IHdlYiBzZXJ2ZXJzLAorICAgIG9yIGluIGFueSBudW1iZXIgb2YgY3VzdG9tIGZvcm1hdHMuPC9wPgorCisgICAgPHA+WW91IGNhbiBhc2sgQ2F0YWxpbmEgdG8gY3JlYXRlIGFuIGFjY2VzcyBsb2cgZm9yIGFsbCByZXF1ZXN0cworICAgIHByb2Nlc3NlZCBieSBhbiA8YSBocmVmPSJlbmdpbmUuaHRtbCI+RW5naW5lPC9hPiwKKyAgICA8YSBocmVmPSJob3N0Lmh0bWwiPkhvc3Q8L2E+LCBvciA8YSBocmVmPSJjb250ZXh0Lmh0bWwiPkNvbnRleHQ8L2E+CisgICAgYnkgbmVzdGluZyBhIDxhIGhyZWY9InZhbHZlLmh0bWwiPlZhbHZlPC9hPiBlbGVtZW50IGxpa2UgdGhpczo8L3A+CisKKzxzb3VyY2U+CismbHQ7SG9zdCBuYW1lPSJsb2NhbGhvc3QiIC4uLiZndDsKKyAgLi4uCisgICZsdDtWYWx2ZSBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEudmFsdmVzLkFjY2Vzc0xvZ1ZhbHZlIgorICAgICAgICAgcHJlZml4PSJsb2NhbGhvc3RfYWNjZXNzX2xvZy4iIHN1ZmZpeD0iLnR4dCIKKyAgICAgICAgIHBhdHRlcm49ImNvbW1vbiIvJmd0OworICAuLi4KKyZsdDsvSG9zdCZndDsKKzwvc291cmNlPgorCisgICAgPHA+U2VlIDxhIGhyZWY9InZhbHZlLmh0bWwjQWNjZXNzIExvZyBWYWx2ZSI+QWNjZXNzIExvZyBWYWx2ZTwvYT4KKyAgICBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgY29uZmlndXJhdGlvbiBhdHRyaWJ1dGVzIHRoYXQgYXJlCisgICAgc3VwcG9ydGVkLjwvcD4KKworICA8L3N1YnNlY3Rpb24+CisKKworICA8c3Vic2VjdGlvbiBuYW1lPSJBdXRvbWF0aWMgQXBwbGljYXRpb24gRGVwbG95bWVudCI+CisKKyAgICA8cD5JZiB5b3UgYXJlIHVzaW5nIHRoZSBzdGFuZGFyZCA8c3Ryb25nPkhvc3Q8L3N0cm9uZz4gaW1wbGVtZW50YXRpb24sCisgICAgdGhlIGZvbGxvd2luZyBhY3Rpb25zIHRha2UgcGxhY2UgYXV0b21hdGljYWxseSB3aGVuIENhdGFsaW5hIGlzIGZpcnN0CisgICAgc3RhcnRlZCwgaWYgdGhlIDxjb2RlPmRlcGxveU9uU3RhcnR1cDwvY29kZT4gcHJvcGVydHkgaXMgc2V0IHRvCisgICAgPGNvZGU+dHJ1ZTwvY29kZT4gKHdoaWNoIGlzIHRoZSBkZWZhdWx0IHZhbHVlKTo8L3A+CisgICAgPHVsPgorICAgIDxsaT5BbnkgWE1MIGZpbGUgaW4gdGhlIAorICAgICAgICA8Y29kZT4kQ0FUQUxJTkFfSE9NRS9jb25mL1tlbmdpbmVfbmFtZV0vW2hvc3RfbmFtZV08L2NvZGU+IGRpcmVjdG9yeSBpcworICAgICAgICBhc3N1bWVkIHRvIGNvbnRhaW4gYQorICAgICAgICA8YSBocmVmPSJjb250ZXh0Lmh0bWwiPkNvbnRleHQ8L2E+IGVsZW1lbnQgKGFuZCBpdHMgYXNzb2NpYXRlZAorICAgICAgICBzdWJlbGVtZW50cykgZm9yIGEgc2luZ2xlIHdlYiBhcHBsaWNhdGlvbi4gIFRoZSA8Y29kZT5kb2NCYXNlPC9jb2RlPgorICAgICAgICBhdHRyaWJ1dGUgb2YgdGhpcyA8Y29kZT4mbHQ7Q29udGV4dCZndDs8L2NvZGU+IGVsZW1lbnQgd2lsbCB0eXBpY2FsbHkKKyAgICAgICAgYmUgdGhlIGFic29sdXRlIHBhdGhuYW1lIHRvIGEgd2ViIGFwcGxpY2F0aW9uIGRpcmVjdG9yeSwgb3IgdGhlCisgICAgICAgIGFic29sdXRlIHBhdGhuYW1lIG9mIGEgd2ViIGFwcGxpY2F0aW9uIGFyY2hpdmUgKFdBUikgZmlsZSAod2hpY2gKKyAgICAgICAgd2lsbCBub3QgYmUgZXhwYW5kZWQpLjwvbGk+CisgICAgPGxpPkFueSB3ZWIgYXBwbGljYXRpb24gYXJjaGl2ZSBmaWxlIHdpdGhpbiB0aGUgYXBwbGljYXRpb24gYmFzZSAoYXBwQmFzZSkKKyAgICAgICAgZGlyZWN0b3J5IHRoYXQgZG9lcyBub3QgaGF2ZSBhIGNvcnJlc3BvbmRpbmcKKyAgICAgICAgZGlyZWN0b3J5IG9mIHRoZSBzYW1lIG5hbWUgKHdpdGhvdXQgdGhlICIud2FyIiBleHRlbnNpb24pIHdpbGwgYmUKKyAgICAgICAgYXV0b21hdGljYWxseSBleHBhbmRlZCwgdW5sZXNzIHRoZSA8Y29kZT51bnBhY2tXQVJzPC9jb2RlPiBwcm9wZXJ0eQorICAgICAgICBpcyBzZXQgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+LiAgSWYgeW91IHJlZGVwbG95IGFuIHVwZGF0ZWQgV0FSIGZpbGUsCisgICAgICAgIGJlIHN1cmUgdG8gZGVsZXRlIHRoZSBleHBhbmRlZCBkaXJlY3Rvcnkgd2hlbiByZXN0YXJ0aW5nIFRvbWNhdCwgc28KKyAgICAgICAgdGhhdCB0aGUgdXBkYXRlZCBXQVIgZmlsZSB3aWxsIGJlIHJlLWV4cGFuZGVkIChub3RlIHRoYXQgdGhlIGF1dG8KKyAgICAgICAgZGVwbG95ZXIgd2lsbCBhdXRvbWF0aWNhbGx5IHRha2UgY2FyZSBvZiB0aGlzIGlmIGl0IGlzIGVuYWJsZWQpLjwvbGk+CisgICAgPGxpPkFueSBzdWJkaXJlY3Rvcnkgd2l0aGluIHRoZSA8ZW0+YXBwbGljYXRpb24gYmFzZSBkaXJlY3Rvcnk8L2VtPgorICAgICAgICB0aGF0IGFwcGVhcnMgdG8gYmUgYW4gdW5wYWNrZWQgd2ViIGFwcGxpY2F0aW9uICh0aGF0IGlzLCBpdCBjb250YWlucworICAgICAgICBhIDxjb2RlPi9XRUItSU5GL3dlYi54bWw8L2NvZGU+IGZpbGUpIHdpbGwgcmVjZWl2ZSBhbiBhdXRvbWF0aWNhbGx5CisgICAgICAgIGdlbmVyYXRlZCA8YSBocmVmPSJjb250ZXh0Lmh0bWwiPkNvbnRleHQ8L2E+IGVsZW1lbnQsIGV2ZW4gaWYgdGhpcworICAgICAgICBkaXJlY3RvcnkgaXMgbm90IG1lbnRpb25lZCBpbiB0aGUgPGNvZGU+Y29uZi9zZXJ2ZXIueG1sPC9jb2RlPiBmaWxlLgorICAgICAgICBUaGlzIGdlbmVyYXRlZCBDb250ZXh0IGVudHJ5IHdpbGwgYmUgY29uZmlndXJlZCBhY2NvcmRpbmcgdG8gdGhlCisgICAgICAgIHByb3BlcnRpZXMgc2V0IGluIGFueSA8YSBocmVmPSJkZWZhdWx0Y29udGV4dC5odG1sIj5EZWZhdWx0Q29udGV4dDwvYT4KKyAgICAgICAgZWxlbWVudCBuZXN0ZWQgaW4gdGhpcyBIb3N0IGVsZW1lbnQuICBUaGUgY29udGV4dCBwYXRoIGZvciB0aGlzCisgICAgICAgIGRlcGxveWVkIENvbnRleHQgd2lsbCBiZSBhIHNsYXNoIGNoYXJhY3RlciAoIi8iKSBmb2xsb3dlZCBieSB0aGUKKyAgICAgICAgZGlyZWN0b3J5IG5hbWUsIHVubGVzcyB0aGUgZGlyZWN0b3J5IG5hbWUgaXMgUk9PVCwgaW4gd2hpY2ggY2FzZQorICAgICAgICB0aGUgY29udGV4dCBwYXRoIHdpbGwgYmUgYW4gZW1wdHkgc3RyaW5nICgiIikuPC9saT4KKyAgICA8L3VsPgorCisgICAgPHA+SW4gYWRkaXRpb24gdG8gdGhlIGF1dG9tYXRpYyBkZXBsb3ltZW50IHRoYXQgb2NjdXJzIGF0IHN0YXJ0dXAgdGltZSwKKyAgICB5b3UgY2FuIGFsc28gcmVxdWVzdCB0aGF0IG5ldyBYTUwgY29uZmlndXJhdGlvbiBmaWxlcywgV0FSIGZpbGVzLCBvcgorICAgIHN1YmRpcmVjdG9yaWVzIChjb250YWluaW5nIHdlYiBhcHBsaWNhdGlvbnMpIHRoYXQgYXJlIGRyb3BwZWQgaW4gdG8gdGhlCisgICAgPGNvZGU+YXBwQmFzZTwvY29kZT4gKG9yIAorICAgIDxjb2RlPiRDQVRBTElOQV9IT01FL2NvbmYvW2VuZ2luZV9uYW1lXS9baG9zdF9uYW1lXTwvY29kZT4gaW4gdGhlIGNhc2Ugb2YKKyAgICBhbiBYTUwgY29uZmlndXJhdGlvbiBmaWxlKSBkaXJlY3Rvcnkgd2hpbGUgVG9tY2F0IGlzIHJ1bm5pbmcgd2lsbCBiZQorICAgIGF1dG9tYXRpY2FsbHkgZGVwbG95ZWQsIGFjY29yZGluZyB0byB0aGUgcnVsZXMgZGVzY3JpYmVkIGFib3ZlLiBUaGUgCisgICAgYXV0byBkZXBsb3llciB3aWxsIGFsc28gdHJhY2sgd2ViIGFwcGxpY2F0aW9ucyBmb3IgdGhlIGZvbGxvd2luZyBjaGFuZ2VzOgorICAgIDx1bD4KKyAgICAgICAgPGxpPkFuIHVwZGF0ZSB0byB0aGUgV0VCLUlORi93ZWIueG1sIGZpbGUgd2lsbCB0cmlnZ2VyIGEgcmVsb2FkIG9mIHRoZQorICAgICAgICB3ZWIgYXBwbGljYXRpb248L2xpPgorICAgICAgICA8bGk+QW4gdXBkYXRlIHRvIGEgV0FSIHdoaWNoIGhhcyBiZWVuIGV4cGFuZGVkIHdpbGwgdHJpZ2dlciAKKyAgICAgICAgYW4gdW5kZXBsb3kgKDxzdHJvbmc+d2l0aCBhIHJlbW92YWwgb2YgdGhlIGV4cGFuZGVkIHdlYmFwcDwvc3Ryb25nPiksIAorICAgICAgICBmb2xsb3dlZCBieSBhIGRlcGxveW1lbnQ8L2xpPgorICAgICAgICA8bGk+QW4gdXBkYXRlIHRvIGEgWE1MIGNvbmZpZ3VyYXRpb24gZmlsZSB3aWxsIHRyaWdnZXIgYW4gdW5kZXBsb3kKKyAgICAgICAgKHdpdGhvdXQgdGhlIHJlbW92YWwgb2YgYW55IGV4cGFuZGVkIGRpcmVjdG9yeSksIGZvbGxvd2VkIGJ5IAorICAgICAgICBhIGRlcGxveW1lbnQgb2YgdGhlIGFzc29jaWF0ZWQgd2ViIGFwcGxpY2F0aW9uPC9saT4KKyAgICA8L3VsPgorICAgIDwvcD4KKworICAgIDxwPldoZW4gdXNpbmcgYXV0b21hdGljIGRlcGxveW1lbnQsIHRoZSA8Y29kZT5kb2NCYXNlPC9jb2RlPiBkZWZpbmVkIGJ5CisgICAgYW4gWE1MIDxhIGhyZWY9ImNvbnRleHQuaHRtbCI+Q29udGV4dDwvYT4gZmlsZSBzaG91bGQgYmUgb3V0c2lkZSBvZiB0aGUKKyAgICA8Y29kZT5hcHBCYXNlPC9jb2RlPiBkaXJlY3RvcnkuIElmIHRoaXMgaXMgbm90IHRoZSBjYXNlIGRpZmZpY3VsdGllcworICAgIG1heSBiZSBleHBlcmllbmNlZCBkZXBsb3lpbmcgdGhlIHdlYiBhcHBsaWNhdGlvbiBvciB0aGUgYXBwbGljYXRpb24gbWF5CisgICAgYmUgZGVwbG95ZWQgdHdpY2UuPC9wPgorCisgICAgPHA+RmluYWxseSwgbm90ZSB0aGF0IGlmIHlvdSBhcmUgZGVmaW5pbmcgY29udGV4dHMgZXhwbGljaXRseSwgeW91IHNob3VsZAorICAgIHByb2JhYmx5IHR1cm4gb2ZmIGF1dG9tYXRpYyBhcHBsaWNhdGlvbiBkZXBsb3ltZW50LiAgT3RoZXJ3aXNlLCB5b3VyIGNvbnRleHQKKyAgICB3aWxsIGJlIGRlcGxveWVkIHR3aWNlIGVhY2gsIGFuZCB0aGF0IG1heSBjYXVzZSBwcm9ibGVtcyBmb3IgeW91ciBhcHAuCisgICAgPC9wPgorCisgIDwvc3Vic2VjdGlvbj4KKworCisgIDxzdWJzZWN0aW9uIG5hbWU9Ikhvc3QgTmFtZSBBbGlhc2VzIj4KKworICAgIDxwPkluIG1hbnkgc2VydmVyIGVudmlyb25tZW50cywgTmV0d29yayBBZG1pbmlzdHJhdG9ycyBoYXZlIGNvbmZpZ3VyZWQKKyAgICBtb3JlIHRoYW4gb25lIG5ldHdvcmsgbmFtZSAoaW4gdGhlIDxlbT5Eb21haW4gTmFtZSBTZXJ2aWNlPC9lbT4gKEROUykKKyAgICBzZXJ2ZXIpLCB0aGF0IHJlc29sdmUgdG8gdGhlIElQIGFkZHJlc3Mgb2YgdGhlIHNhbWUgc2VydmVyLiAgTm9ybWFsbHksCisgICAgZWFjaCBzdWNoIG5ldHdvcmsgbmFtZSB3b3VsZCBiZSBjb25maWd1cmVkIGFzIGEgc2VwYXJhdGUKKyAgICA8c3Ryb25nPkhvc3Q8L3N0cm9uZz4gZWxlbWVudCBpbiA8Y29kZT5jb25mL3NlcnZlci54bWw8L2NvZGU+LCBlYWNoCisgICAgd2l0aCBpdHMgb3duIHNldCBvZiB3ZWIgYXBwbGljYXRpb25zLjwvcD4KKworICAgIDxwPkhvd2V2ZXIsIGluIHNvbWUgY2lyY3Vtc3RhbmNlcywgaXQgaXMgZGVzaXJlYWJsZSB0aGF0IHR3byBvciBtb3JlCisgICAgbmV0d29yayBuYW1lcyBzaG91bGQgcmVzb2x2ZSB0byB0aGUgPHN0cm9uZz5zYW1lPC9zdHJvbmc+IHZpcnR1YWwgaG9zdCwKKyAgICBydW5uaW5nIHRoZSBzYW1lIHNldCBvZiBhcHBsaWNhdGlvbnMuICBBIGNvbW1vbiB1c2UgY2FzZSBmb3IgdGhpcworICAgIHNjZW5hcmlvIGlzIGEgY29ycG9yYXRlIHdlYiBzaXRlLCB3aGVyZSBpdCBpcyBkZXNpcmVhYmxlIHRoYXQgdXNlcnMKKyAgICBiZSBhYmxlIHRvIHV0aWxpemUgZWl0aGVyIDxjb2RlPnd3dy5teWNvbXBhbnkuY29tPC9jb2RlPiBvcgorICAgIDxjb2RlPmNvbXBhbnkuY29tPC9jb2RlPiB0byBhY2Nlc3MgZXhhY3RseSB0aGUgc2FtZSBjb250ZW50IGFuZAorICAgIGFwcGxpY2F0aW9ucy48L3A+CisKKyAgICA8cD5UaGlzIGlzIGFjY29tcGxpc2hlZCBieSB1dGlsaXppbmcgb25lIG9yIG1vcmUgPHN0cm9uZz5BbGlhczwvc3Ryb25nPgorICAgIGVsZW1lbnRzIG5lc3RlZCBpbnNpZGUgeW91ciA8c3Ryb25nPkhvc3Q8L3N0cm9uZz4gZWxlbWVudC4gIEZvcgorICAgIGV4YW1wbGU6PC9wPgorPHNvdXJjZT4KKyZsdDtIb3N0IG5hbWU9Ind3dy5teWNvbXBhbnkuY29tIiAuLi4mZ3Q7CisgIC4uLgorICAmbHQ7QWxpYXMmZ3Q7bXljb21wYW55LmNvbSZsdDsvQWxpYXMmZ3Q7CisgIC4uLgorJmx0Oy9Ib3N0Jmd0OworPC9zb3VyY2U+CisKKyAgICA8cD5JbiBvcmRlciBmb3IgdGhpcyBzdHJhdGVneSB0byBiZSBlZmZlY3RpdmUsIGFsbCBvZiB0aGUgbmV0d29yayBuYW1lcworICAgIGludm9sdmVkIG11c3QgYmUgcmVnaXN0ZXJlZCBpbiB5b3VyIEROUyBzZXJ2ZXIgdG8gcmVzb2x2ZSB0byB0aGUKKyAgICBzYW1lIGNvbXB1dGVyIHRoYXQgaXMgcnVubmluZyB0aGlzIGluc3RhbmNlIG9mIENhdGFsaW5hLjwvcD4KKworICA8L3N1YnNlY3Rpb24+CisKKworICA8c3Vic2VjdGlvbiBuYW1lPSJMaWZlY3ljbGUgTGlzdGVuZXJzIj4KKworICAgIDxwPklmIHlvdSBoYXZlIGltcGxlbWVudGVkIGEgSmF2YSBvYmplY3QgdGhhdCBuZWVkcyB0byBrbm93IHdoZW4gdGhpcworICAgIDxzdHJvbmc+SG9zdDwvc3Ryb25nPiBpcyBzdGFydGVkIG9yIHN0b3BwZWQsIHlvdSBjYW4gZGVjbGFyZSBpdCBieQorICAgIG5lc3RpbmcgYSA8c3Ryb25nPkxpc3RlbmVyPC9zdHJvbmc+IGVsZW1lbnQgaW5zaWRlIHRoaXMgZWxlbWVudC4gIFRoZQorICAgIGNsYXNzIG5hbWUgeW91IHNwZWNpZnkgbXVzdCBpbXBsZW1lbnQgdGhlCisgICAgPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGVMaXN0ZW5lcjwvY29kZT4gaW50ZXJmYWNlLCBhbmQKKyAgICBpdCB3aWxsIGJlIG5vdGlmaWVkIGFib3V0IHRoZSBvY2N1cnJlbmNlIG9mIHRoZSBjb3Jlc3BvbmRpbmcKKyAgICBsaWZlY3ljbGUgZXZlbnRzLiAgQ29uZmlndXJhdGlvbiBvZiBzdWNoIGEgbGlzdGVuZXIgbG9va3MgbGlrZSB0aGlzOjwvcD4KKworPHNvdXJjZT4KKyZsdDtIb3N0IG5hbWU9ImxvY2FsaG9zdCIgLi4uJmd0OworICAuLi4KKyAgJmx0O0xpc3RlbmVyIGNsYXNzTmFtZT0iY29tLm15Y29tcGFueS5teXBhY2thZ2UuTXlMaXN0ZW5lciIgLi4uICZndDsKKyAgLi4uCismbHQ7L0hvc3QmZ3Q7Cis8L3NvdXJjZT4KKworICAgIDxwPk5vdGUgdGhhdCBhIExpc3RlbmVyIGNhbiBoYXZlIGFueSBudW1iZXIgb2YgYWRkaXRpb25hbCBwcm9wZXJ0aWVzCisgICAgdGhhdCBtYXkgYmUgY29uZmlndXJlZCBmcm9tIHRoaXMgZWxlbWVudC4gIEF0dHJpYnV0ZSBuYW1lcyBhcmUgbWF0Y2hlZAorICAgIHRvIGNvcnJlc3BvbmRpbmcgSmF2YUJlYW4gcHJvcGVydHkgbmFtZXMgdXNpbmcgdGhlIHN0YW5kYXJkIHByb3BlcnR5CisgICAgbWV0aG9kIG5hbWluZyBwYXR0ZXJucy48L3A+CisKKyAgPC9zdWJzZWN0aW9uPgorCisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iUmVxdWVzdCBGaWx0ZXJzIj4KKworICAgIDxwPllvdSBjYW4gYXNrIENhdGFsaW5hIHRvIGNoZWNrIHRoZSBJUCBhZGRyZXNzLCBvciBob3N0IG5hbWUsIG9uIGV2ZXJ5CisgICAgaW5jb21pbmcgcmVxdWVzdCBkaXJlY3RlZCB0byB0aGUgc3Vycm91bmRpbmcKKyAgICA8YSBocmVmPSJlbmdpbmUuaHRtbCI+RW5naW5lPC9hPiwgPGEgaHJlZj0iaG9zdC5odG1sIj5Ib3N0PC9hPiwgb3IKKyAgICA8YSBocmVmPSJjb250ZXh0Lmh0bWwiPkNvbnRleHQ8L2E+IGVsZW1lbnQuICBUaGUgcmVtb3RlIGFkZHJlc3Mgb3IgbmFtZQorICAgIHdpbGwgYmUgY2hlY2tlZCBhZ2FpbnN0IGEgY29uZmlndXJlZCBsaXN0IG9mICJhY2NlcHQiIGFuZC9vciAiZGVueSIKKyAgICBmaWx0ZXJzLCB3aGljaCBhcmUgZGVmaW5lZCB1c2luZyB0aGUgUmVndWxhciBFeHByZXNzaW9uIHN5bnRheCBzdXBwb3J0ZWQKKyAgICBieSB0aGUgPGEgaHJlZj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9yZWdleHAvIj5KYWthcnRhIFJlZ2V4cDwvYT4KKyAgICByZWd1bGFyIGV4cHJlc3Npb24gbGlicmFyeS4gIFJlcXVlc3RzIHRoYXQgY29tZSBmcm9tIGxvY2F0aW9ucyB0aGF0IGFyZQorICAgIG5vdCBhY2NlcHRlZCB3aWxsIGJlIHJlamVjdGVkIHdpdGggYW4gSFRUUCAiRm9yYmlkZGVuIiBlcnJvci4KKyAgICBFeGFtcGxlIGZpbHRlciBkZWNsYXJhdGlvbnM6PC9wPgorCis8c291cmNlPgorJmx0O0hvc3QgbmFtZT0ibG9jYWxob3N0IiAuLi4mZ3Q7CisgIC4uLgorICAmbHQ7VmFsdmUgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcy5SZW1vdGVIb3N0VmFsdmUiCisgICAgICAgICBhbGxvdz0iKi5teWNvbXBhbnkuY29tLHd3dy55b3VyY29tcGFueS5jb20iLyZndDsKKyAgJmx0O1ZhbHZlIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS52YWx2ZXMuUmVtb3RlQWRkclZhbHZlIgorICAgICAgICAgZGVueT0iMTkyLjE2OC4xLioiLyZndDsKKyAgLi4uCismbHQ7L0hvc3QmZ3Q7Cis8L3NvdXJjZT4KKworICA8cD5TZWUgPGEgaHJlZj0idmFsdmUuaHRtbCNSZW1vdGUgQWRkcmVzcyBGaWx0ZXIiPlJlbW90ZSBBZGRyZXNzIEZpbHRlcjwvYT4KKyAgYW5kIDxhIGhyZWY9InZhbHZlLmh0bWwjUmVtb3RlIEhvc3QgRmlsdGVyIj5SZW1vdGUgSG9zdCBGaWx0ZXI8L2E+IGZvcgorICBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdGhhdCBhcmUgc3VwcG9ydGVkLjwvcD4KKworICA8L3N1YnNlY3Rpb24+CisKKworICA8c3Vic2VjdGlvbiBuYW1lPSJTaW5nbGUgU2lnbiBPbiI+CisKKyAgICA8cD5JbiBtYW55IGVudmlyb25tZW50cywgYnV0IHBhcnRpY3VsYXJseSBpbiBwb3J0YWwgZW52aXJvbm1lbnRzLCBpdAorICAgIGlzIGRlc2lyZWFibGUgdG8gaGF2ZSBhIHVzZXIgY2hhbGxlbmdlZCB0byBhdXRoZW50aWNhdGUgdGhlbXNlbHZlcyBvbmx5CisgICAgb25jZSBvdmVyIGEgc2V0IG9mIHdlYiBhcHBsaWNhdGlvbnMgZGVwbG95ZWQgb24gYSBwYXJ0aWN1bGFyIHZpcnR1YWwKKyAgICBob3N0LiAgVGhpcyBjYW4gYmUgYWNjb21wbGlzaGVkIGJ5IG5lc3RpbmcgYW4gZWxlbWVudCBsaWtlIHRoaXMgaW5zaWRlCisgICAgdGhlIEhvc3QgZWxlbWVudCBmb3IgdGhpcyB2aXJ0dWFsIGhvc3Q6PC9wPgorCis8c291cmNlPgorJmx0O0hvc3QgbmFtZT0ibG9jYWxob3N0IiAuLi4mZ3Q7CisgIC4uLgorICAmbHQ7VmFsdmUgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmF1dGhlbnRpY2F0b3IuU2luZ2xlU2lnbk9uIgorICAgICAgICAgZGVidWc9IjAiLyZndDsKKyAgLi4uCismbHQ7L0hvc3QmZ3Q7Cis8L3NvdXJjZT4KKworICAgIDxwPlRoZSBTaW5nbGUgU2lnbiBPbiBmYWNpbGl0eSBvcGVyYXRlcyBhY2NvcmRpbmcgdG8gdGhlIGZvbGxvd2luZyBydWxlczoKKyAgICA8L3A+CisgICAgPHVsPgorICAgIDxsaT5BbGwgd2ViIGFwcGxpY2F0aW9ucyBjb25maWd1cmVkIGZvciB0aGlzIHZpcnR1YWwgaG9zdCBtdXN0IHNoYXJlIHRoZQorICAgICAgICBzYW1lIDxhIGhyZWY9InJlYWxtLmh0bWwiPlJlYWxtPC9hPi4gIEluIHByYWN0aWNlLCB0aGF0IG1lYW5zIHlvdSBjYW4KKyAgICAgICAgbmVzdCB0aGUgUmVhbG0gZWxlbWVudCBpbnNpZGUgdGhpcyBIb3N0IGVsZW1lbnQgKG9yIHRoZSBzdXJyb3VuZGluZworICAgICAgICA8YSBocmVmPSJlbmdpbmUuaHRtbCI+RW5naW5lPC9hPiBlbGVtZW50KSwgYnV0IG5vdCBpbnNpZGUgYQorICAgICAgICA8YSBocmVmPSJjb250ZXh0Lmh0bWwiPkNvbnRleHQ8L2E+IGVsZW1lbnQgZm9yIG9uZSBvZiB0aGUgaW52b2x2ZWQKKyAgICAgICAgd2ViIGFwcGxpY2F0aW9ucy48L2xpPgorICAgIDxsaT5BcyBsb25nIGFzIHRoZSB1c2VyIGFjY2Vzc2VzIG9ubHkgdW5wcm90ZWN0ZWQgcmVzb3VyY2VzIGluIGFueSBvZiB0aGUKKyAgICAgICAgd2ViIGFwcGxpY2F0aW9ucyBvbiB0aGlzIHZpcnR1YWwgaG9zdCwgdGhleSB3aWxsIG5vdCBiZSBjaGFsbGVuZ2VkCisgICAgICAgIHRvIGF1dGhlbnRpY2F0ZSB0aGVtc2VsdmVzLjwvbGk+CisgICAgPGxpPkFzIHNvb24gYXMgdGhlIHVzZXIgYWNjZXNzZXMgYSBwcm90ZWN0ZWQgcmVzb3VyY2UgaW4KKyAgICAgICAgPHN0cm9uZz5hbnk8L3N0cm9uZz4gd2ViIGFwcGxpY2F0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHZpcnR1YWwKKyAgICAgICAgaG9zdCwgdGhlIHVzZXIgd2lsbCBiZSBjaGFsbGVuZ2VkIHRvIGF1dGhlbnRpY2F0ZSBoaW1zZWxmIG9yIGhlcnNlbGYsCisgICAgICAgIHVzaW5nIHRoZSBsb2dpbiBtZXRob2QgZGVmaW5lZCBmb3IgdGhlIHdlYiBhcHBsaWNhdGlvbiBjdXJyZW50bHkKKyAgICAgICAgYmVpbmcgYWNjZXNzZWQuPC9saT4KKyAgICA8bGk+T25jZSBhdXRoZW50aWNhdGVkLCB0aGUgcm9sZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdXNlciB3aWxsIGJlCisgICAgICAgIHV0aWxpemVkIGZvciBhY2Nlc3MgY29udHJvbCBkZWNpc2lvbnMgYWNyb3NzIDxzdHJvbmc+YWxsPC9zdHJvbmc+CisgICAgICAgIG9mIHRoZSBhc3NvY2lhdGVkIHdlYiBhcHBsaWNhdGlvbnMsIHdpdGhvdXQgY2hhbGxlbmdpbmcgdGhlIHVzZXIKKyAgICAgICAgdG8gYXV0aGVudGljYXRlIHRoZW1zZWx2ZXMgdG8gZWFjaCBhcHBsaWNhdGlvbiBpbmRpdmlkdWFsbHkuPC9saT4KKyAgICA8bGk+QXMgc29vbiBhcyB0aGUgdXNlciBsb2dzIG91dCBvZiBvbmUgd2ViIGFwcGxpY2F0aW9uIChmb3IgZXhhbXBsZSwKKyAgICAgICAgYnkgaW52YWxpZGF0aW5nIHRoZSBjb3JyZXNwb25kaW5nIHNlc3Npb24gaWYgZm9ybQorICAgICAgICBiYXNlZCBsb2dpbiBpcyB1c2VkKSwgdGhlIHVzZXIncyBzZXNzaW9ucyBpbiA8c3Ryb25nPmFsbDwvc3Ryb25nPgorICAgICAgICB3ZWIgYXBwbGljYXRpb25zIHdpbGwgYmUgaW52YWxpZGF0ZWQuICBBbnkgc3Vic2VxdWVudCBhdHRlbXB0IHRvCisgICAgICAgIGFjY2VzcyBhIHByb3RlY3RlZCByZXNvdXJjZSBpbiBhbnkgYXBwbGljYXRpb24gd2lsbCByZXF1aXJlIHRoZQorICAgICAgICB1c2VyIHRvIGF1dGhlbnRpY2F0ZSBoaW1zZWxmIG9yIGhlcnNlbGYgYWdhaW4uPC9saT4KKyAgICA8bGk+VGhlIFNpbmdsZSBTaWduIE9uIGZlYXR1cmUgdXRpbGl6ZXMgSFRUUCBjb29raWVzIHRvIHRyYW5zbWl0IGEgdG9rZW4KKyAgICAgICAgdGhhdCBhc3NvY2lhdGVzIGVhY2ggcmVxdWVzdCB3aXRoIHRoZSBzYXZlZCB1c2VyIGlkZW50aXR5LCBzbyBpdCBjYW4KKyAgICAgICAgb25seSBiZSB1dGlsaXplZCBpbiBjbGllbnQgZW52aXJvbm1lbnRzIHRoYXQgc3VwcG9ydCBjb29raWVzLjwvbGk+CisgICAgPC91bD4KKworICA8L3N1YnNlY3Rpb24+CisKKworICA8c3Vic2VjdGlvbiBuYW1lPSJVc2VyIFdlYiBBcHBsaWNhdGlvbnMiPgorCisgICAgPHA+TWFueSB3ZWIgc2VydmVycyBjYW4gYXV0b21hdGljYWxseSBtYXAgYSByZXF1ZXN0IFVSSSBzdGFydGluZyB3aXRoCisgICAgYSB0aWxkZSBjaGFyYWN0ZXIgKCJ+IikgYW5kIGEgdXNlcm5hbWUgdG8gYSBkaXJlY3RvcnkgKGNvbW1vbmx5IG5hbWVkCisgICAgPGNvZGU+cHVibGljX2h0bWw8L2NvZGU+KSBpbiB0aGF0IHVzZXIncyBob21lIGRpcmVjdG9yeSBvbiB0aGUgc2VydmVyLgorICAgIFlvdSBjYW4gYWNjb21wbGlzaCB0aGUgc2FtZSB0aGluZyBpbiBDYXRhbGluYSBieSB1c2luZyBhIHNwZWNpYWwKKyAgICA8c3Ryb25nPkxpc3RlbmVyPC9zdHJvbmc+IGVsZW1lbnQgbGlrZSB0aGlzIChvbiBhIFVuaXggc3lzdGVtIHRoYXQKKyAgICB1c2VzIHRoZSA8Y29kZT4vZXRjL3Bhc3N3ZDwvY29kZT4gZmlsZSB0byBpZGVudGlmeSB2YWxpZCB1c2Vycyk6PC9wPgorCis8c291cmNlPgorJmx0O0hvc3QgbmFtZT0ibG9jYWxob3N0IiAuLi4mZ3Q7CisgIC4uLgorICAmbHQ7TGlzdGVuZXIgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0YXJ0dXAuVXNlckNvbmZpZyIKKyAgICAgICAgICAgIGRpcmVjdG9yeU5hbWU9InB1YmxpY19odG1sIgorICAgICAgICAgICAgdXNlckNsYXNzPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0YXJ0dXAuUGFzc3dkVXNlckRhdGFiYXNlIi8mZ3Q7CisgIC4uLgorJmx0Oy9Ib3N0Jmd0OworPC9zb3VyY2U+CisKKyAgICA8cD5PbiBhIHNlcnZlciB3aGVyZSA8Y29kZT4vZXRjL3Bhc3N3ZDwvY29kZT4gaXMgbm90IGluIHVzZSwgeW91IGNhbgorICAgIHJlcXVlc3QgQ2F0YWxpbmEgdG8gY29uc2lkZXIgYWxsIGRpcmVjdG9yaWVzIGZvdW5kIGluIGEgc3BlY2lmaWVkIGJhc2UKKyAgICBkaXJlY3RvcnkgKHN1Y2ggYXMgPGNvZGU+YzpcSG9tZXM8L2NvZGU+IGluIHRoaXMgZXhhbXBsZSkgdG8gYmUKKyAgICBjb25zaWRlcmVkICJ1c2VyIGhvbWUiIGRpcmVjdG9yaWVzIGZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkaXJlY3RpdmU6PC9wPgorCis8c291cmNlPgorJmx0O0hvc3QgbmFtZT0ibG9jYWxob3N0IiAuLi4mZ3Q7CisgIC4uLgorICAmbHQ7TGlzdGVuZXIgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLnN0YXJ0dXAuVXNlckNvbmZpZyIKKyAgICAgICAgICAgIGRpcmVjdG9yeU5hbWU9InB1YmxpY19odG1sIgorICAgICAgICAgICAgaG9tZUJhc2U9YzpcSG9tZXMiCisgICAgICAgICAgICB1c2VyQ2xhc3M9Im9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cC5Ib21lc1VzZXJEYXRhYmFzZSIvJmd0OworICAuLi4KKyZsdDsvSG9zdCZndDsKKzwvc291cmNlPgorCisgICAgPHA+SWYgYSB1c2VyIGhvbWUgZGlyZWN0b3J5IGhhcyBiZWVuIHNldCB1cCBmb3IgYSB1c2VyIG5hbWVkCisgICAgPGNvZGU+Y3JhaWdtY2M8L2NvZGU+LCB0aGVuIGl0cyBjb250ZW50cyB3aWxsIGJlIHZpc2libGUgZnJvbSBhCisgICAgY2xpZW50IGJyb3dzZXIgYnkgbWFraW5nIGEgcmVxdWVzdCB0byBhIFVSTCBsaWtlOjwvcD4KKworPHNvdXJjZT4KK2h0dHA6Ly93d3cubXljb21wYW55LmNvbTo4MDgwL35jcmFpZ21jYworPC9zb3VyY2U+CisKKyAgICA8cD5TdWNjZXNzZnVsIHVzZSBvZiB0aGlzIGZlYXR1cmUgcmVxdWlyZXMgcmVjb2duaXRpb24gb2YgdGhlIGZvbGxvd2luZworICAgIGNvbnNpZGVyYXRpb25zOjwvcD4KKyAgICA8dWw+CisgICAgPGxpPkVhY2ggdXNlciB3ZWIgYXBwbGljYXRpb24gd2lsbCBiZSBkZXBsb3llZCB3aXRoIGNoYXJhY3RlcmlzdGljcworICAgICAgICBlc3RhYmxpc2hlZCBieSBhbnkgPGEgaHJlZj0iZGVmYXVsdGNvbnRleHQuaHRtbCI+RGVmYXVsdENvbnRleHQ8L2E+CisgICAgICAgIGVsZW1lbnQgeW91IGhhdmUgY29uZmlndXJlZCBmb3IgdGhpcyBIb3N0LjwvbGk+CisgICAgPGxpPkl0IGlzIGxlZ2FsIHRvIGluY2x1ZGUgbW9yZSB0aGFuIG9uZSBpbnN0YW5jZSBvZiB0aGlzIExpc3RlbmVyCisgICAgICAgIGVsZW1lbnQuICBUaGlzIHdvdWxkIG9ubHkgYmUgdXNlZnVsLCBob3dldmVyLCBpbiBjaXJjdW1zdGFuY2VzCisgICAgICAgIHdoZXJlIHlvdSB3YW50ZWQgdG8gY29uZmlndXJlIG1vcmUgdGhhbiBvbmUgImhvbWVCYXNlIiBkaXJlY3RvcnkuPC9saT4KKyAgICA8bGk+VGhlIG9wZXJhdGluZyBzeXN0ZW0gdXNlcm5hbWUgdW5kZXIgd2hpY2ggQ2F0YWxpbmEgaXMgZXhlY3V0ZWQKKyAgICAgICAgTVVTVCBoYXZlIHJlYWQgYWNjZXNzIHRvIGVhY2ggdXNlcidzIHdlYiBhcHBsaWNhdGlvbiBkaXJlY3RvcnksCisgICAgICAgIGFuZCBhbGwgb2YgaXRzIGNvbnRlbnRzLjwvbGk+CisgICAgPC91bD4KKworICA8L3N1YnNlY3Rpb24+CisKKworPC9zZWN0aW9uPgorCisKKzwvYm9keT4KKworCis8L2RvY3VtZW50PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9jb25maWcvaHR0cC54bWwgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2NvbmZpZy9odHRwLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2RmMWI2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9jb25maWcvaHR0cC54bWwKQEAgLTAsMCArMSw0NDEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCFET0NUWVBFIGRvY3VtZW50IFsKKyAgPCFFTlRJVFkgcHJvamVjdCBTWVNURU0gInByb2plY3QueG1sIj4KK10+Cis8ZG9jdW1lbnQgdXJsPSJodHRwLmh0bWwiPgorCisgICZwcm9qZWN0OworCisgIDxwcm9wZXJ0aWVzPgorICAgIDxhdXRob3IgZW1haWw9ImNyYWlnbWNjQGFwYWNoZS5vcmciPkNyYWlnIFIuIE1jQ2xhbmFoYW48L2F1dGhvcj4KKyAgICA8YXV0aG9yIGVtYWlsPSJ5b2F2c0BhcGFjaGUub3JnIj5Zb2F2IFNoYXBpcmE8L2F1dGhvcj4KKyAgICA8dGl0bGU+VGhlIEhUVFAgQ29ubmVjdG9yPC90aXRsZT4KKyAgPC9wcm9wZXJ0aWVzPgorCis8Ym9keT4KKworCis8c2VjdGlvbiBuYW1lPSJJbnRyb2R1Y3Rpb24iPgorCisgIDxwPlRoZSA8c3Ryb25nPkhUVFAgQ29ubmVjdG9yPC9zdHJvbmc+IGVsZW1lbnQgcmVwcmVzZW50cyBhCisgIDxzdHJvbmc+Q29ubmVjdG9yPC9zdHJvbmc+IGNvbXBvbmVudCB0aGF0IHN1cHBvcnRzIHRoZSBIVFRQLzEuMSBwcm90b2NvbC4KKyAgSXQgZW5hYmxlcyBDYXRhbGluYSB0byBmdW5jdGlvbiBhcyBhIHN0YW5kLWFsb25lIHdlYiBzZXJ2ZXIsIGluIGFkZGl0aW9uCisgIHRvIGl0cyBhYmlsaXR5IHRvIGV4ZWN1dGUgc2VydmxldHMgYW5kIEpTUCBwYWdlcy4gIEEgcGFydGljdWxhciBpbnN0YW5jZQorICBvZiB0aGlzIGNvbXBvbmVudCBsaXN0ZW5zIGZvciBjb25uZWN0aW9ucyBvbiBhIHNwZWNpZmljIFRDUCBwb3J0IG51bWJlcgorICBvbiB0aGUgc2VydmVyLiAgT25lIG9yIG1vcmUgc3VjaCA8c3Ryb25nPkNvbm5lY3RvcnM8L3N0cm9uZz4gY2FuIGJlCisgIGNvbmZpZ3VyZWQgYXMgcGFydCBvZiBhIHNpbmdsZSA8YSBocmVmPSJzZXJ2aWNlLmh0bWwiPlNlcnZpY2U8L2E+LCBlYWNoCisgIGZvcndhcmRpbmcgdG8gdGhlIGFzc29jaWF0ZWQgPGEgaHJlZj0iZW5naW5lLmh0bWwiPkVuZ2luZTwvYT4gdG8gcGVyZm9ybQorICByZXF1ZXN0IHByb2Nlc3NpbmcgYW5kIGNyZWF0ZSB0aGUgcmVzcG9uc2UuPC9wPgorCisgIDxwPklmIHlvdSB3aXNoIHRvIGNvbmZpZ3VyZSB0aGUgPHN0cm9uZz5Db25uZWN0b3I8L3N0cm9uZz4gdGhhdCBpcyB1c2VkCisgIGZvciBjb25uZWN0aW9ucyB0byB3ZWIgc2VydmVycyB1c2luZyB0aGUgQUpQIHByb3RvY29sIChzdWNoIGFzIHRoZQorICA8Y29kZT5tb2RfamsgMS4yLng8L2NvZGU+IGNvbm5lY3RvciBmb3IgQXBhY2hlIDEuMyksIHNlZQorICA8YSBocmVmPSJhanAuaHRtbCI+aGVyZTwvYT4gaW5zdGVhZC48L3A+CisKKyAgPHA+QXQgc2VydmVyIHN0YXJ0dXAgdGltZSwgdGhpcyA8c3Ryb25nPkNvbm5lY3Rvcjwvc3Ryb25nPiB3aWxsIGNyZWF0ZSBhCisgIG51bWJlciBvZiByZXF1ZXN0IHByb2Nlc3NpbmcgdGhyZWFkcyAoYmFzZWQgb24gdGhlIHZhbHVlIGNvbmZpZ3VyZWQgZm9yCisgIHRoZSA8Y29kZT5taW5TcGFyZVRocmVhZHM8L2NvZGU+IGF0dHJpYnV0ZSkuICBFYWNoIGluY29taW5nIHJlcXVlc3QgcmVxdWlyZXMKKyAgYSB0aHJlYWQgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGF0IHJlcXVlc3QuICBJZiBtb3JlIHNpbXVsdGFuZW91cyByZXF1ZXN0cworICBhcmUgcmVjZWl2ZWQgdGhhbiBjYW4gYmUgaGFuZGxlZCBieSB0aGUgY3VycmVudGx5IGF2YWlsYWJsZSByZXF1ZXN0CisgIHByb2Nlc3NpbmcgdGhyZWFkcywgYWRkaXRpb25hbCB0aHJlYWRzIHdpbGwgYmUgY3JlYXRlZCB1cCB0byB0aGUKKyAgY29uZmlndXJlZCBtYXhpbXVtICh0aGUgdmFsdWUgb2YgdGhlIDxjb2RlPm1heFRocmVhZHM8L2NvZGU+IGF0dHJpYnV0ZSkuCisgIElmIHN0aWxsIG1vcmUgc2ltdWx0YW5lb3VzIHJlcXVlc3RzIGFyZSByZWNlaXZlZCwgdGhleSBhcmUgc3RhY2tlZCB1cAorICBpbnNpZGUgdGhlIHNlcnZlciBzb2NrZXQgY3JlYXRlZCBieSB0aGUgPHN0cm9uZz5Db25uZWN0b3I8L3N0cm9uZz4sIHVwIHRvCisgIHRoZSBjb25maWd1cmVkIG1heGltdW0gKHRoZSB2YWx1ZSBvZiB0aGUgPGNvZGU+YWNjZXB0Q291bnQ8L2NvZGU+CisgIGF0dHJpYnV0ZS4gIEFueSBmdXJ0aGVyIHNpbXVsdGFuZW91cyByZXF1ZXN0cyB3aWxsIHJlY2VpdmUgImNvbm5lY3Rpb24KKyAgcmVmdXNlZCIgZXJyb3JzLCB1bnRpbCByZXNvdXJjZXMgYXJlIGF2YWlsYWJsZSB0byBwcm9jZXNzIHRoZW0uPC9wPgorCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iQXR0cmlidXRlcyI+CisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iQ29tbW9uIEF0dHJpYnV0ZXMiPgorCisgIDxwPkFsbCBpbXBsZW1lbnRhdGlvbnMgb2YgPHN0cm9uZz5Db25uZWN0b3I8L3N0cm9uZz4KKyAgc3VwcG9ydCB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6PC9wPgorCisgIDxhdHRyaWJ1dGVzPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJhZGRyZXNzIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgPHA+Rm9yIHNlcnZlcnMgd2l0aCBtb3JlIHRoYW4gb25lIElQIGFkZHJlc3MsIHRoaXMgYXR0cmlidXRlCisgICAgICBzcGVjaWZpZXMgd2hpY2ggYWRkcmVzcyB3aWxsIGJlIHVzZWQgZm9yIGxpc3RlbmluZyBvbiB0aGUgc3BlY2lmaWVkCisgICAgICBwb3J0LiAgQnkgZGVmYXVsdCwgdGhpcyBwb3J0IHdpbGwgYmUgdXNlZCBvbiBhbGwgSVAgYWRkcmVzc2VzCisgICAgICBhc3NvY2lhdGVkIHdpdGggdGhlIHNlcnZlci48L3A+CisgICAgPC9hdHRyaWJ1dGU+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9ImFsbG93VHJhY2UiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICA8cD5BIGJvb2xlYW4gdmFsdWUgd2hpY2ggY2FuIGJlIHVzZWQgdG8gZW5hYmxlIG9yIGRpc2FibGUgdGhlIFRSQUNFCisgICAgICBIVFRQIG1ldGhvZC4gSWYgbm90IHNwZWNpZmllZCwgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIGZhbHNlLjwvcD4KKyAgICA8L2F0dHJpYnV0ZT4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0iZW5hYmxlTG9va3VwcyIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgIDxwPlNldCB0byA8Y29kZT50cnVlPC9jb2RlPiBpZiB5b3Ugd2FudCBjYWxscyB0bworICAgICAgPGNvZGU+cmVxdWVzdC5nZXRSZW1vdGVIb3N0KCk8L2NvZGU+IHRvIHBlcmZvcm0gRE5TIGxvb2t1cHMgaW4KKyAgICAgIG9yZGVyIHRvIHJldHVybiB0aGUgYWN0dWFsIGhvc3QgbmFtZSBvZiB0aGUgcmVtb3RlIGNsaWVudC4gIFNldAorICAgICAgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIHNraXAgdGhlIEROUyBsb29rdXAgYW5kIHJldHVybiB0aGUgSVAKKyAgICAgIGFkZHJlc3MgaW4gU3RyaW5nIGZvcm0gaW5zdGVhZCAodGhlcmVieSBpbXByb3ZpbmcgcGVyZm9ybWFuY2UpLgorICAgICAgQnkgZGVmYXVsdCwgRE5TIGxvb2t1cHMgYXJlIGVuYWJsZWQuPC9wPgorICAgIDwvYXR0cmlidXRlPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJtYXhQb3N0U2l6ZSIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgIDxwPlRoZSBtYXhpbXVtIHNpemUgaW4gYnl0ZXMgb2YgdGhlIFBPU1Qgd2hpY2ggd2lsbCBiZSBoYW5kbGVkIGJ5CisgICAgICB0aGUgY29udGFpbmVyIEZPUk0gVVJMIHBhcmFtZXRlciBwYXJzaW5nLiBUaGUgZmVhdHVyZSBjYW4gYmUgZGlzYmxlZCBieQorICAgICAgc2V0dGluZyB0aGlzIGF0dHJpYnV0ZSB0byBhIHZhbHVlIGluZmVyaW9yIG9yIGVxdWFsIHRvIDAuCisgICAgICBJZiBub3Qgc3BlY2lmaWVkLCB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gMjA5NzE1MiAoMiBtZWdhYnl0ZXMpLjwvcD4KKyAgICA8L2F0dHJpYnV0ZT4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0icmVkaXJlY3RQb3J0IiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgPHA+SWYgdGhpcyA8c3Ryb25nPkNvbm5lY3Rvcjwvc3Ryb25nPiBpcyBzdXBwb3J0aW5nIG5vbi1TU0wKKyAgICAgIHJlcXVlc3RzLCBhbmQgYSByZXF1ZXN0IGlzIHJlY2VpdmVkIGZvciB3aGljaCBhIG1hdGNoaW5nCisgICAgICA8Y29kZT4mbHQ7c2VjdXJpdHktY29uc3RyYWludCZndDs8L2NvZGU+IHJlcXVpcmVzIFNTTCB0cmFuc3BvcnQsCisgICAgICBDYXRhbGluYSB3aWxsIGF1dG9tYXRpY2FsbHkgcmVkaXJlY3QgdGhlIHJlcXVlc3QgdG8gdGhlIHBvcnQKKyAgICAgIG51bWJlciBzcGVjaWZpZWQgaGVyZS48L3A+CisgICAgPC9hdHRyaWJ1dGU+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9InNjaGVtZSIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgIDxwPlNldCB0aGlzIGF0dHJpYnV0ZSB0byB0aGUgbmFtZSBvZiB0aGUgcHJvdG9jb2wgeW91IHdpc2ggdG8gaGF2ZQorICAgICAgcmV0dXJuZWQgYnkgY2FsbHMgdG8gPGNvZGU+cmVxdWVzdC5nZXRTY2hlbWUoKTwvY29kZT4uICBGb3IKKyAgICAgIGV4YW1wbGUsIHlvdSB3b3VsZCBzZXQgdGhpcyBhdHRyaWJ1dGUgdG8gIjxjb2RlPmh0dHBzPC9jb2RlPiIKKyAgICAgIGZvciBhbiBTU0wgQ29ubmVjdG9yLiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgIjxjb2RlPmh0dHA8L2NvZGU+Ii4KKyAgICAgIFNlZSA8YSBocmVmPSIjU1NMIFN1cHBvcnQiPlNTTCBTdXBwb3J0PC9hPiBmb3IgbW9yZSBpbmZvcm1hdGlvbi48L3A+CisgICAgPC9hdHRyaWJ1dGU+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9InNlY3VyZSIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgIDxwPlNldCB0aGlzIGF0dHJpYnV0ZSB0byA8Y29kZT50cnVlPC9jb2RlPiBpZiB5b3Ugd2lzaCB0byBoYXZlCisgICAgICBjYWxscyB0byA8Y29kZT5yZXF1ZXN0LmlzU2VjdXJlKCk8L2NvZGU+IHRvIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPgorICAgICAgZm9yIHJlcXVlc3RzIHJlY2VpdmVkIGJ5IHRoaXMgQ29ubmVjdG9yICh5b3Ugd291bGQgd2FudCB0aGlzIG9uIGFuCisgICAgICBTU0wgQ29ubmVjdG9yKS4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPmZhbHNlPC9jb2RlPi48L3A+CisgICAgPC9hdHRyaWJ1dGU+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9IlVSSUVuY29kaW5nIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgPHA+VGhpcyBzcGVjaWZpZXMgdGhlIGNoYXJhY3RlciBlbmNvZGluZyB1c2VkIHRvIGRlY29kZSB0aGUgVVJJIGJ5dGVzLAorICAgICAgYWZ0ZXIgJXh4IGRlY29kaW5nIHRoZSBVUkwuIElmIG5vdCBzcGVjaWZpZWQsIElTTy04ODU5LTEgd2lsbCBiZSB1c2VkLgorICAgICAgPC9wPgorICAgIDwvYXR0cmlidXRlPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJ1c2VCb2R5RW5jb2RpbmdGb3JVUkkiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICA8cD5UaGlzIHNwZWNpZmllcyBpZiB0aGUgZW5jb2Rpbmcgc3BlY2lmaWVkIGluIGNvbnRlbnRUeXBlIHNob3VsZCBiZSB1c2VkCisgICAgICBmb3IgVVJJIHF1ZXJ5IHBhcmFtZXRlcnMsIGluc3RlYWQgb2YgdXNpbmcgdGhlIFVSSUVuY29kaW5nLiBUaGlzCisgICAgICBzZXR0aW5nIGlzIHByZXNlbnQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBUb21jYXQgNC4xLngsIHdoZXJlIHRoZQorICAgICAgZW5jb2Rpbmcgc3BlY2lmaWVkIGluIHRoZSBjb250ZW50VHlwZSwgb3IgZXhwbGljaXRlbHkgc2V0IHVzaW5nCisgICAgICBSZXF1ZXN0LnNldENoYXJhY3RlckVuY29kaW5nIG1ldGhvZCB3YXMgYWxzbyB1c2VkIGZvciB0aGUgcGFyYW1ldGVycyBmcm9tCisgICAgICB0aGUgVVJMLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT5mYWxzZTwvY29kZT4uCisgICAgICA8L3A+CisgICAgPC9hdHRyaWJ1dGU+CisKKyAgPC9hdHRyaWJ1dGVzPgorCisgIDwvc3Vic2VjdGlvbj4KKworICA8c3Vic2VjdGlvbiBuYW1lPSJTdGFuZGFyZCBJbXBsZW1lbnRhdGlvbiI+CisKKyAgPHA+VGhlIHN0YW5kYXJkIGltcGxlbWVudGF0aW9uIG9mIHRoZSA8c3Ryb25nPkhUVFAKKyAgQ29ubmVjdG9yPC9zdHJvbmc+IGlzCisgIDxzdHJvbmc+b3JnLmFwYWNoZS5jb3lvdGUudG9tY2F0NS5Db3lvdGVDb25uZWN0b3I8L3N0cm9uZz4uCisgIEl0IHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBhdHRyaWJ1dGVzIChpbiBhZGRpdGlvbiB0byB0aGUKKyAgY29tbW9uIGF0dHJpYnV0ZXMgbGlzdGVkIGFib3ZlKTo8L3A+CisKKyAgPGF0dHJpYnV0ZXM+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9ImFjY2VwdENvdW50IiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgPHA+VGhlIG1heGltdW0gcXVldWUgbGVuZ3RoIGZvciBpbmNvbWluZyBjb25uZWN0aW9uIHJlcXVlc3RzIHdoZW4KKyAgICAgIGFsbCBwb3NzaWJsZSByZXF1ZXN0IHByb2Nlc3NpbmcgdGhyZWFkcyBhcmUgaW4gdXNlLiAgQW55IHJlcXVlc3RzCisgICAgICByZWNlaXZlZCB3aGVuIHRoZSBxdWV1ZSBpcyBmdWxsIHdpbGwgYmUgcmVmdXNlZC4gIFRoZSBkZWZhdWx0CisgICAgICB2YWx1ZSBpcyAxMC48L3A+CisgICAgPC9hdHRyaWJ1dGU+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9ImJ1ZmZlclNpemUiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICA8cD5UaGUgc2l6ZSAoaW4gYnl0ZXMpIG9mIHRoZSBidWZmZXIgdG8gYmUgcHJvdmlkZWQgZm9yIGlucHV0CisgICAgICBzdHJlYW1zIGNyZWF0ZWQgYnkgdGhpcyBjb25uZWN0b3IuICBCeSBkZWZhdWx0LCBidWZmZXJzIG9mCisgICAgICAyMDQ4IGJ5dGVzIHdpbGwgYmUgcHJvdmlkZWQuPC9wPgorICAgIDwvYXR0cmlidXRlPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb21wcmVzc2FibGVNaW1lVHlwZXMiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICA8cD5UaGUgdmFsdWUgaXMgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBNSU1FIHR5cGVzIGZvciB3aGljaCBIVFRQCisgICAgICBjb21wcmVzc2lvbiBtYXkgYmUgdXNlZC4KKyAgICAgIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPnRleHQvaHRtbCx0ZXh0L3htbCx0ZXh0L3BsYWluPC9jb2RlPi48L3A+CisgICAgPC9hdHRyaWJ1dGU+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9ImNvbXByZXNzaW9uIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgPHA+VGhlIDxzdHJvbmc+Q29ubmVjdG9yPC9zdHJvbmc+IG1heSB1c2UgSFRUUC8xLjEgR1pJUCBjb21wcmVzc2lvbiBpbgorICAgICAgYW4gYXR0ZW1wdCB0byBzYXZlIHNlcnZlciBiYW5kd2lkdGguIFRoZSBhY2NlcHRhYmxlIHZhbHVlcyBmb3IgdGhlCisgICAgICBwYXJhbWV0ZXIgaXMgIm9mZiIgKGRpc2FibGUgY29tcHJlc3Npb24pLCAib24iIChhbGxvdyBjb21wcmVzc2lvbiwgd2hpY2gKKyAgICAgIGNhdXNlcyB0ZXh0IGRhdGEgdG8gYmUgY29tcHJlc3NlZCksICJmb3JjZSIgKGZvcmNlcyBjb21wcmVzc2lvbiBpbiBhbGwKKyAgICAgIGNhc2VzKSwgb3IgYSBudW1lcmljYWwgaW50ZWdlciB2YWx1ZSAod2hpY2ggaXMgZXF1aXZhbGVudCB0byAib24iLCBidXQKKyAgICAgIHNwZWNpZmllcyB0aGUgbWluaW11bSBhbW91bnQgb2YgZGF0YSBiZWZvcmUgdGhlIG91dHB1dCBpcyBjb21wcmVzc2VkKS4gSWYKKyAgICAgIHRoZSBjb250ZW50LWxlbmd0aCBpcyBub3Qga25vd24gYW5kIGNvbXByZXNzaW9uIGlzIHNldCB0byAib24iIG9yIG1vcmUKKyAgICAgIGFnZ3Jlc3NpdmUsIHRoZSBvdXRwdXQgd2lsbCBhbHNvIGJlIGNvbXByZXNzZWQuIElmIG5vdCBzcGVjaWZpZWQsIHRoaXMKKyAgICAgIGF0dHJpYnV0ZSBpcyBzZXQgdG8gIm9mZiIuPC9wPgorICAgIDwvYXR0cmlidXRlPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb25uZWN0aW9uTGluZ2VyIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgPHA+VGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgZHVyaW5nIHdoaWNoIHRoZSBzb2NrZXRzIHVzZWQgYnkgdGhpcworICAgICAgPHN0cm9uZz5Db25uZWN0b3I8L3N0cm9uZz4gd2lsbCBsaW5nZXIgd2hlbiB0aGV5IGFyZSBjbG9zZWQuCisgICAgICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAtMSAoc29ja2V0IGxpbmdlciBpcyBkaXNhYmxlZCkuPC9wPgorICAgIDwvYXR0cmlidXRlPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb25uZWN0aW9uVGltZW91dCIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgIDxwPlRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRoaXMgPHN0cm9uZz5Db25uZWN0b3I8L3N0cm9uZz4gd2lsbCB3YWl0LAorICAgICAgYWZ0ZXIgYWNjZXB0aW5nIGEgY29ubmVjdGlvbiwgZm9yIHRoZSByZXF1ZXN0IFVSSSBsaW5lIHRvIGJlCisgICAgICBwcmVzZW50ZWQuICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA2MDAwMCAoaS5lLiA2MCBzZWNvbmRzKS48L3A+CisgICAgPC9hdHRyaWJ1dGU+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9ImRpc2FibGVVcGxvYWRUaW1lb3V0IiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgPHA+VGhpcyBmbGFnIGFsbG93cyB0aGUgc2VydmxldCBjb250YWluZXIgdG8gdXNlIGEgZGlmZmVyZW50LCBsb25nZXIKKyAgICAgIGNvbm5lY3Rpb24gdGltZW91dCB3aGlsZSBhIHNlcnZsZXQgaXMgYmVpbmcgZXhlY3V0ZWQsIHdoaWNoIGluIHRoZSBlbmQKKyAgICAgIGFsbG93cyBlaXRoZXIgdGhlIHNlcnZsZXQgYSBsb25nZXIgYW1vdW50IG9mIHRpbWUgdG8gY29tcGxldGUgaXRzCisgICAgICBleGVjdXRpb24sIG9yIGEgbG9uZ2VyIHRpbWVvdXQgZHVyaW5nIGRhdGEgdXBsb2FkLiBJZiBub3Qgc3BlY2lmaWVkLAorICAgICAgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvICJmYWxzZSIuPC9wPgorICAgIDwvYXR0cmlidXRlPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJtYXhIdHRwSGVhZGVyU2l6ZSIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgIDxwPlRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIHJlcXVlc3QgYW5kIHJlc3BvbnNlIEhUVFAgaGVhZGVyLCBzcGVjaWZpZWQKKyAgICAgIGluIGJ5dGVzLgorICAgICAgSWYgbm90IHNwZWNpZmllZCwgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIDQwOTYgKDQgS0IpLjwvcD4KKyAgICA8L2F0dHJpYnV0ZT4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0ibWF4S2VlcEFsaXZlUmVxdWVzdHMiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICA8cD5UaGUgbWF4aW11bSBudW1iZXIgb2YgSFRUUCByZXF1ZXN0cyB3aGljaCBjYW4gYmUgcGlwZWxpbmVkIHVudGlsCisgICAgICB0aGUgY29ubmVjdGlvbiBpcyBjbG9zZWQgYnkgdGhlIHNlcnZlci4gU2V0dGluZyB0aGlzIGF0dHJpYnV0ZSB0byAxIHdpbGwKKyAgICAgIGRpc2FibGUgSFRUUC8xLjAga2VlcC1hbGl2ZSwgYXMgd2VsbCBhcyBIVFRQLzEuMSBrZWVwLWFsaXZlIGFuZAorICAgICAgcGlwZWxpbmluZy4gU2V0dGluZyB0aGlzIHRvIC0xIHdpbGwgYWxsb3cgYW4gdW5saW1pdGVkIGFtb3VudCBvZgorICAgICAgcGlwZWxpbmVkIG9yIGtlZXAtYWxpdmUgSFRUUCByZXF1ZXN0cy4KKyAgICAgIElmIG5vdCBzcGVjaWZpZWQsIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byAxMDAuPC9wPgorICAgIDwvYXR0cmlidXRlPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJtYXhTcGFyZVRocmVhZHMiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICA8cD5UaGUgbWF4aW11bSBudW1iZXIgb2YgdW51c2VkIHJlcXVlc3QgcHJvY2Vzc2luZyB0aHJlYWRzIHRoYXQKKyAgICAgIHdpbGwgYmUgYWxsb3dlZCB0byBleGlzdCB1bnRpbCB0aGUgdGhyZWFkIHBvb2wgc3RhcnRzIHN0b3BwaW5nIHRoZQorICAgICAgdW5uZWNlc3NhcnkgdGhyZWFkcy4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDUwLjwvcD4KKyAgICA8L2F0dHJpYnV0ZT4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0ibWF4VGhyZWFkcyIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgIDxwPlRoZSBtYXhpbXVtIG51bWJlciBvZiByZXF1ZXN0IHByb2Nlc3NpbmcgdGhyZWFkcyB0byBiZSBjcmVhdGVkCisgICAgICBieSB0aGlzIDxzdHJvbmc+Q29ubmVjdG9yPC9zdHJvbmc+LCB3aGljaCB0aGVyZWZvcmUgZGV0ZXJtaW5lcyB0aGUKKyAgICAgIG1heGltdW0gbnVtYmVyIG9mIHNpbXVsdGFuZW91cyByZXF1ZXN0cyB0aGF0IGNhbiBiZSBoYW5kbGVkLiAgSWYKKyAgICAgIG5vdCBzcGVjaWZpZWQsIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byAyMDAuPC9wPgorICAgIDwvYXR0cmlidXRlPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJtaW5TcGFyZVRocmVhZHMiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICA8cD5UaGUgbnVtYmVyIG9mIHJlcXVlc3QgcHJvY2Vzc2luZyB0aHJlYWRzIHRoYXQgd2lsbCBiZSBjcmVhdGVkCisgICAgICB3aGVuIHRoaXMgPHN0cm9uZz5Db25uZWN0b3I8L3N0cm9uZz4gaXMgZmlyc3Qgc3RhcnRlZC4gIFRoZSBjb25uZWN0b3IKKyAgICAgIHdpbGwgYWxzbyBtYWtlIHN1cmUgaXQgaGFzIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGlkbGUgcHJvY2Vzc2luZworICAgICAgdGhyZWFkcyBhdmFpbGFibGUuIFRoaXMgYXR0cmlidXRlIHNob3VsZCBiZSBzZXQgdG8gYSB2YWx1ZSBzbWFsbGVyCisgICAgICB0aGFuIHRoYXQgc2V0IGZvciA8Y29kZT5tYXhUaHJlYWRzPC9jb2RlPi4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDQuPC9wPgorICAgIDwvYXR0cmlidXRlPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJub0NvbXByZXNzaW9uVXNlckFnZW50cyIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgIDxwPlRoZSB2YWx1ZSBpcyBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIHJlZ3VsYXIgZXhwcmVzc2lvbnMgbWF0Y2hpbmcKKyAgICAgIHVzZXItYWdlbnRzIG9mIEhUVFAgY2xpZW50cyBmb3Igd2hpY2ggY29tcHJlc3Npb24gc2hvdWxkIG5vdCBiZSB1c2VkLAorICAgICAgYmVjYXVzZSB0aGVzZSBjbGllbnRzLCBhbHRob3VnaCB0aGV5IGRvIGFkdmVydGlzZSBzdXBwb3J0IGZvciB0aGUKKyAgICAgIGZlYXR1cmUsIGhhdmUgYSBicm9rZW4gaW1wbGVtZW50YXRpb24uCisgICAgICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBhbiBlbXB0eSBTdHJpbmcgKHJlZ2V4cCBtYXRjaGluZyBkaXNhYmxlZCkuPC9wPgorICAgIDwvYXR0cmlidXRlPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb3J0IiByZXF1aXJlZD0idHJ1ZSI+CisgICAgICA8cD5UaGUgVENQIHBvcnQgbnVtYmVyIG9uIHdoaWNoIHRoaXMgPHN0cm9uZz5Db25uZWN0b3I8L3N0cm9uZz4KKyAgICAgIHdpbGwgY3JlYXRlIGEgc2VydmVyIHNvY2tldCBhbmQgYXdhaXQgaW5jb21pbmcgY29ubmVjdGlvbnMuICBZb3VyCisgICAgICBvcGVyYXRpbmcgc3lzdGVtIHdpbGwgYWxsb3cgb25seSBvbmUgc2VydmVyIGFwcGxpY2F0aW9uIHRvIGxpc3RlbgorICAgICAgdG8gYSBwYXJ0aWN1bGFyIHBvcnQgbnVtYmVyIG9uIGEgcGFydGljdWxhciBJUCBhZGRyZXNzLjwvcD4KKyAgICA8L2F0dHJpYnV0ZT4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0icHJvdG9jb2wiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICA8cD5UaGlzIGF0dHJpYnV0ZSB2YWx1ZSBtdXN0IGJlIDxjb2RlPkhUVFAvMS4xPC9jb2RlPiB0byB1c2UgdGhlIEhUVFAKKyAgICAgIGhhbmRsZXIsIHdoaWNoIGlzIHRoZSBkZWZhdWx0LjwvcD4KKyAgICA8L2F0dHJpYnV0ZT4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0icHJveHlOYW1lIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgPHA+SWYgdGhpcyA8c3Ryb25nPkNvbm5lY3Rvcjwvc3Ryb25nPiBpcyBiZWluZyB1c2VkIGluIGEgcHJveHkKKyAgICAgIGNvbmZpZ3VyYXRpb24sIGNvbmZpZ3VyZSB0aGlzIGF0dHJpYnV0ZSB0byBzcGVjaWZ5IHRoZSBzZXJ2ZXIgbmFtZQorICAgICAgdG8gYmUgcmV0dXJuZWQgZm9yIGNhbGxzIHRvIDxjb2RlPnJlcXVlc3QuZ2V0U2VydmVyTmFtZSgpPC9jb2RlPi4KKyAgICAgIFNlZSA8YSBocmVmPSIjUHJveHkgU3VwcG9ydCI+UHJveHkgU3VwcG9ydDwvYT4gZm9yIG1vcmUKKyAgICAgIGluZm9ybWF0aW9uLjwvcD4KKyAgICA8L2F0dHJpYnV0ZT4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0icHJveHlQb3J0IiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgPHA+SWYgdGhpcyA8c3Ryb25nPkNvbm5lY3Rvcjwvc3Ryb25nPiBpcyBiZWluZyB1c2VkIGluIGEgcHJveHkKKyAgICAgIGNvbmZpZ3VyYXRpb24sIGNvbmZpZ3VyZSB0aGlzIGF0dHJpYnV0ZSB0byBzcGVjaWZ5IHRoZSBzZXJ2ZXIgcG9ydAorICAgICAgdG8gYmUgcmV0dXJuZWQgZm9yIGNhbGxzIHRvIDxjb2RlPnJlcXVlc3QuZ2V0U2VydmVyUG9ydCgpPC9jb2RlPi4KKyAgICAgIFNlZSA8YSBocmVmPSIjUHJveHkgU3VwcG9ydCI+UHJveHkgU3VwcG9ydDwvYT4gZm9yIG1vcmUKKyAgICAgIGluZm9ybWF0aW9uLjwvcD4KKyAgICA8L2F0dHJpYnV0ZT4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0icmVzdHJpY3RlZFVzZXJBZ2VudHMiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICA8cD5UaGUgdmFsdWUgaXMgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiByZWd1bGFyIGV4cHJlc3Npb25zIG1hdGNoaW5nCisgICAgICB1c2VyLWFnZW50cyBvZiBIVFRQIGNsaWVudHMgZm9yIHdoaWNoIEhUVFAvMS4xIG9yIEhUVFAvMS4wIGtlZXAgYWxpdmUKKyAgICAgIHNob3VsZCBub3QgYmUgdXNlZCwgZXZlbiBpZiB0aGUgY2xpZW50cyBhZHZlcnRpc2Ugc3VwcG9ydCBmb3IgdGhlc2UKKyAgICAgIGZlYXR1cmVzLgorICAgICAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgYW4gZW1wdHkgU3RyaW5nIChyZWdleHAgbWF0Y2hpbmcgZGlzYWJsZWQpLjwvcD4KKyAgICA8L2F0dHJpYnV0ZT4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0ic29ja2V0QnVmZmVyIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgPHA+VGhlIHNpemUgKGluIGJ5dGVzKSBvZiB0aGUgYnVmZmVyIHRvIGJlIHByb3ZpZGVkIGZvciBzb2NrZXQKKyAgICAgIG91dHB1dCBidWZmZXJpbmcuIC0xIGNhbiBiZSBzcGVjaWZpZWQgdG8gZGlzYWJsZSB0aGUgdXNlIG9mIGEgYnVmZmVyLgorICAgICAgQnkgZGVmYXVsdCwgYSBidWZmZXJzIG9mIDkwMDAgYnl0ZXMgd2lsbCBiZSB1c2VkLjwvcD4KKyAgICA8L2F0dHJpYnV0ZT4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0idGNwTm9EZWxheSIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgIDxwPklmIHNldCB0byA8Y29kZT50cnVlPC9jb2RlPiwgdGhlIFRDUF9OT19ERUxBWSBvcHRpb24gd2lsbCBiZQorICAgICAgc2V0IG9uIHRoZSBzZXJ2ZXIgc29ja2V0LCB3aGljaCBpbXByb3ZlcyBwZXJmb3JtYW5jZSB1bmRlciBtb3N0CisgICAgICBjaXJjdW1zdGFuY2VzLiAgVGhpcyBpcyBzZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4gYnkgZGVmYXVsdC48L3A+CisgICAgPC9hdHRyaWJ1dGU+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9InRocmVhZFByaW9yaXR5IiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgPHA+VGhlIHByaW9yaXR5IG9mIHRoZSByZXF1ZXN0IHByb2Nlc3NpbmcgdGhyZWFkcyB3aXRoaW4gdGhlIEpWTS4KKyAgICAgIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPmphdmEubGFuZy5UaHJlYWQjTk9STV9QUklPUklUWTwvY29kZT4uCisgICAgICBTZWUgdGhlIEphdmFEb2MgZm9yIHRoZSBqYXZhLmxhbmcuVGhyZWFkIGNsYXNzIGZvciBtb3JlIGRldGFpbHMgb24KKyAgICAgIHdoYXQgdGhpcyBwcmlvcml0eSBtZWFucy4KKyAgICAgIDwvcD4KKyAgICA8L2F0dHJpYnV0ZT4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0ic2VydmVyIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgPHA+VGhlIFNlcnZlciBoZWFkZXIgZm9yIHRoZSBodHRwIHJlc3BvbnNlLgorICAgICAgICAgVW5sZXNzIHlvdXIgcGFyYW5vaWQsIHlvdSB3b24ndCBuZWVkIHRoaXMgZmVhdHVyZS4KKyAgICAgIDwvcD4KKyAgICA8L2F0dHJpYnV0ZT4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3RyYXRlZ3kiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICA8cD5UaGUgdGhyZWFkIHBvb2xpbmcgc3RyYXRlZ3kgd2hpY2ggd2lsbCBiZSB1c2VkLiBUaGUgZGVmYXVsdCBzdHJhdGVneSBkb2VzIAorICAgICAgbm90IHVzZSBhIG1hc3RlciB0aHJlYWQsIGJ1dCBhIG1vcmUgY29udmVudGlvbmFsIHN0cmF0ZWd5IHVzaW5nIGEgCisgICAgICBtYXN0ZXIgbGlzdGVuZXIgdGhyZWFkIGNhbiBiZSB1c2VkIGJ5IHNldHRpbmcgIm1zIiBhcyB0aGlzIGF0dHJpYnV0ZSdzIHZhbHVlLiAKKyAgICAgIFRoZSBtYXN0ZXIgc3RyYXRlZ3kgd2lsbCB3b3JrIHNpZ25pZmljYW50bHkgYmV0dGVyIHVzaW5nIHRoZSB0aHJlYWRQcmlvcml0eSAKKyAgICAgIGF0dHJpYnV0ZSwgd2hpY2ggd2lsbCBhcHBseSBvbmx5IHRvIHRoZSB0aHJlYWQgd2hpY2ggbGlzdGVucyBvbiB0aGUgc2VydmVyIHNvY2tldC4KKyAgICAgIFRoaXMgaXMgc2V0IHRvIDxjb2RlPmxmPC9jb2RlPiBieSBkZWZhdWx0LgorICAgICAgPC9wPgorICAgIDwvYXR0cmlidXRlPgorCisgIDwvYXR0cmlidXRlcz4KKworICA8L3N1YnNlY3Rpb24+CisKKzwvc2VjdGlvbj4KKworCis8c2VjdGlvbiBuYW1lPSJOZXN0ZWQgQ29tcG9uZW50cyI+CisKKyAgPHA+VGhlIG9ubHkgZWxlbWVudCB0aGF0IG1heSBiZSBlbWJlZGRlZCBpbnNpZGUgYSA8c3Ryb25nPkNvbm5lY3Rvcjwvc3Ryb25nPgorICBlbGVtZW50IGlzIGEgPHN0cm9uZz5GYWN0b3J5PC9zdHJvbmc+IGVsZW1lbnQsIHdoaWNoIGlzIHVzZWQgdG8gY29uZmlndXJlCisgIGEgc2VydmVyIHNvY2tldCBmYWN0b3J5IGNvbXBvbmVudC4gIFRoaXMgZWxlbWVudCBpcyBuZXZlciByZXF1aXJlZCwgYnV0CisgIGlzIHN0aWxsIHN1cHBvcnRlZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBlYXJsaWVyIHZlcnNpb24gb2YKKyAgVG9tY2F0LjwvcD4KKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IlNwZWNpYWwgRmVhdHVyZXMiPgorCisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iSFRUUC8xLjEgYW5kIEhUVFAvMS4wIFN1cHBvcnQiPgorCisgIDxwPlRoaXMgPHN0cm9uZz5Db25uZWN0b3I8L3N0cm9uZz4gc3VwcG9ydHMgYWxsIG9mIHRoZSByZXF1aXJlZCBmZWF0dXJlcworICBvZiB0aGUgSFRUUC8xLjEgcHJvdG9jb2wsIGFzIGRlc2NyaWJlZCBpbiBSRkMgMjYxNiwgaW5jbHVkaW5nIHBlcnNpc3RlbnQKKyAgY29ubmVjdGlvbnMsIHBpcGVsaW5pbmcsIGV4cGVjdGF0aW9ucyBhbmQgY2h1bmtlZCBlbmNvZGluZy4gIElmIHRoZSBjbGllbnQKKyAgKHR5cGljYWxseSBhIGJyb3dzZXIpIHN1cHBvcnRzIG9ubHkgSFRUUC8xLjAsIHRoZQorICA8c3Ryb25nPkNvbm5lY3Rvcjwvc3Ryb25nPiB3aWxsIGdyYWNlZnVsbHkgZmFsbCBiYWNrIHRvIHN1cHBvcnRpbmcgdGhpcworICBwcm90b2NvbCBhcyB3ZWxsLiAgTm8gc3BlY2lhbCBjb25maWd1cmF0aW9uIGlzIHJlcXVpcmVkIHRvIGVuYWJsZSB0aGlzCisgIHN1cHBvcnQuIFRoZSA8c3Ryb25nPkNvbm5lY3Rvcjwvc3Ryb25nPiBhbHNvIHN1cHBvcnRzIEhUVFAvMS4wCisgIGtlZXAtYWxpdmUuPC9wPgorCisgIDxwPlJGQyAyNjE2IHJlcXVpcmVzIHRoYXQgSFRUUCBzZXJ2ZXJzIGFsd2F5cyBiZWdpbiB0aGVpciByZXNwb25zZXMgd2l0aAorICB0aGUgaGlnaGVzdCBIVFRQIHZlcnNpb24gdGhhdCB0aGV5IGNsYWltIHRvIHN1cHBvcnQuICBUaGVyZWZvcmUsIHRoaXMKKyAgPHN0cm9uZz5Db25uZWN0b3I8L3N0cm9uZz4gd2lsbCBhbHdheXMgcmV0dXJuIDxjb2RlPkhUVFAvMS4xPC9jb2RlPiBhdAorICB0aGUgYmVnaW5uaW5nIG9mIGl0cyByZXNwb25zZXMuPC9wPgorCisgIDwvc3Vic2VjdGlvbj4KKworCisgIDxzdWJzZWN0aW9uIG5hbWU9IkxvZ2dpbmcgT3V0cHV0Ij4KKworICA8cD5BbnkgZGVidWdnaW5nIG9yIGV4Y2VwdGlvbiBsb2dnaW5nIGluZm9ybWF0aW9uIGdlbmVyYXRlZCBieSB0aGlzCisgIDxzdHJvbmc+Q29ubmVjdG9yPC9zdHJvbmc+IHdpbGwgYmUgYXV0b21hdGljYWxseSByb3V0ZWQgdG8gdGhlCisgIGxvZ2dpbmcgY29uZmlndXJhdGlvbiBmb3IgdGhlIGNvbnRhaW5pbmcgCisgIDxhIGhyZWY9ImVuZ2luZS5odG1sIj5FbmdpbmU8L2E+LiAgTm8gc3BlY2lhbCBjb25maWd1cmF0aW9uIGlzIHJlcXVpcmVkCisgIHRvIGVuYWJsZSB0aGlzIHN1cHBvcnQuPC9wPgorCisgIDwvc3Vic2VjdGlvbj4KKworCisgIDxzdWJzZWN0aW9uIG5hbWU9IlByb3h5IFN1cHBvcnQiPgorCisgIDxwPlRoZSA8Y29kZT5wcm94eU5hbWU8L2NvZGU+IGFuZCA8Y29kZT5wcm94eVBvcnQ8L2NvZGU+IGF0dHJpYnV0ZXMgY2FuCisgIGJlIHVzZWQgd2hlbiBUb21jYXQgaXMgcnVuIGJlaGluZCBhIHByb3h5IHNlcnZlci4gIFRoZXNlIGF0dHJpYnV0ZXMKKyAgbW9kaWZ5IHRoZSB2YWx1ZXMgcmV0dXJuZWQgdG8gd2ViIGFwcGxpY2F0aW9ucyB0aGF0IGNhbGwgdGhlCisgIDxjb2RlPnJlcXVlc3QuZ2V0U2VydmVyTmFtZSgpPC9jb2RlPiBhbmQgPGNvZGU+cmVxdWVzdC5nZXRTZXJ2ZXJQb3J0KCk8L2NvZGU+CisgIG1ldGhvZHMsIHdoaWNoIGFyZSBvZnRlbiB1c2VkIHRvIGNvbnN0cnVjdCBhYnNvbHV0ZSBVUkxzIGZvciByZWRpcmVjdHMuCisgIFdpdGhvdXQgY29uZmlndXJpbmcgdGhlc2UgYXR0cmlidXRlcywgdGhlIHZhbHVlcyByZXR1cm5lZCB3b3VsZCByZWZsZWN0CisgIHRoZSBzZXJ2ZXIgbmFtZSBhbmQgcG9ydCBvbiB3aGljaCB0aGUgY29ubmVjdGlvbiBmcm9tIHRoZSBwcm94eSBzZXJ2ZXIKKyAgd2FzIHJlY2VpdmVkLCByYXRoZXIgdGhhbiB0aGUgc2VydmVyIG5hbWUgYW5kIHBvcnQgdG8gd2hvbSB0aGUgY2xpZW50CisgIGRpcmVjdGVkIHRoZSBvcmlnaW5hbCByZXF1ZXN0LjwvcD4KKworICA8cD5Gb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZQorICA8YSBocmVmPSIuLi9wcm94eS1ob3d0by5odG1sIj5Qcm94eSBTdXBwb3J0IEhPVy1UTzwvYT4uPC9wPgorCisgIDwvc3Vic2VjdGlvbj4KKworCisgIDxzdWJzZWN0aW9uIG5hbWU9IlNTTCBTdXBwb3J0Ij4KKworICA8cD5Zb3UgY2FuIGVuYWJsZSBTU0wgc3VwcG9ydCBmb3IgYSBwYXJ0aWN1bGFyIGluc3RhbmNlIG9mIHRoaXMKKyAgPHN0cm9uZz5Db25uZWN0b3I8L3N0cm9uZz4gYnkgc2V0dGluZyB0aGUgPGNvZGU+c2VjdXJlPC9jb2RlPiBhdHRyaWJ1dGUgdG8KKyAgPGNvZGU+dHJ1ZTwvY29kZT4uICBJbiBhZGRpdGlvbiwgeW91IG1heSBuZWVkIHRvIGNvbmZpZ3VyZSB0aGUgZm9sbG93aW5nCisgIGF0dHJpYnV0ZXM6PC9wPgorCisgIDxhdHRyaWJ1dGVzPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJhbGdvcml0aG0iIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICA8cD5UaGUgY2VydGlmaWNhdGUgZW5jb2RpbmcgYWxnb3JpdGhtIHRvIGJlIHVzZWQuICBJZiBub3QKKyAgICAgIHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+U3VuWDUwOTwvY29kZT4uPC9wPgorICAgIDwvYXR0cmlidXRlPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGllbnRBdXRoIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgPHA+U2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+IGlmIHlvdSB3YW50IHRoZSBTU0wgc3RhY2sgdG8KKyAgICAgIHJlcXVpcmUgYSB2YWxpZCBjZXJ0aWZpY2F0ZSBjaGFpbiBmcm9tIHRoZSBjbGllbnQgYmVmb3JlCisgICAgICBhY2NlcHRpbmcgYSBjb25uZWN0aW9uLiAgQSA8Y29kZT5mYWxzZTwvY29kZT4gdmFsdWUgKHdoaWNoCisgICAgICBpcyB0aGUgZGVmYXVsdCkgd2lsbCBub3QgcmVxdWlyZSBhIGNlcnRpZmljYXRlIGNoYWluIHVubGVzcworICAgICAgdGhlIGNsaWVudCByZXF1ZXN0cyBhIHJlc291cmNlIHByb3RlY3RlZCBieSBhIHNlY3VyaXR5IGNvbnN0cmFpbnQKKyAgICAgIHRoYXQgdXNlcyA8Y29kZT5DTElFTlQtQ0VSVDwvY29kZT4gYXV0aGVudGljYXRpb24uPC9wPgorICAgIDwvYXR0cmlidXRlPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJrZXlzdG9yZUZpbGUiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICA8cD5UaGUgcGF0aG5hbWUgb2YgdGhlIGtleXN0b3JlIGZpbGUgd2hlcmUgeW91IGhhdmUgc3RvcmVkIHRoZQorICAgICAgc2VydmVyIGNlcnRpZmljYXRlIHRvIGJlIGxvYWRlZC4gIEJ5IGRlZmF1bHQsIHRoZSBwYXRobmFtZSBpcworICAgICAgdGhlIGZpbGUgIjxjb2RlPi5rZXlzdG9yZTwvY29kZT4iIGluIHRoZSBvcGVyYXRpbmcgc3lzdGVtIGhvbWUKKyAgICAgIGRpcmVjdG9yeSBvZiB0aGUgdXNlciB0aGF0IGlzIHJ1bm5pbmcgVG9tY2F0LjwvcD4KKyAgICA8L2F0dHJpYnV0ZT4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0ia2V5c3RvcmVQYXNzIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgPHA+VGhlIHBhc3N3b3JkIHVzZWQgdG8gYWNjZXNzIHRoZSBzZXJ2ZXIgY2VydGlmaWNhdGUgZnJvbSB0aGUKKyAgICAgIHNwZWNpZmllZCBrZXlzdG9yZSBmaWxlLiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgIjxjb2RlPmNoYW5nZWl0PC9jb2RlPiIuCisgICAgICA8L3A+CisgICAgPC9hdHRyaWJ1dGU+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9ImtleXN0b3JlVHlwZSIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgIDxwPlRoZSB0eXBlIG9mIGtleXN0b3JlIGZpbGUgdG8gYmUgdXNlZCBmb3IgdGhlIHNlcnZlciBjZXJ0aWZpY2F0ZS4KKyAgICAgIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0IHZhbHVlIGlzICI8Y29kZT5KS1M8L2NvZGU+Ii48L3A+CisgICAgPC9hdHRyaWJ1dGU+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9InNzbFByb3RvY29sIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgPHA+VGhlIHZlcnNpb24gb2YgdGhlIFNTTCBwcm90b2NvbCB0byB1c2UuICBJZiBub3Qgc3BlY2lmaWVkLAorICAgICAgdGhlIGRlZmF1bHQgaXMgIjxjb2RlPlRMUzwvY29kZT4iLjwvcD4KKyAgICA8L2F0dHJpYnV0ZT4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2lwaGVycyIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgIDxwPkEgY29tbWEgc2VwZXJhdGVkIGxpc3Qgb2YgdGhlIGVuY3J5cHRpb24gY2lwaGVycyB0aGF0IG1heSBiZSB1c2VkLgorICAgICAgSWYgbm90IHNwZWNpZmllZCwgdGhlbiBhbnkgYXZhaWxhYmxlIGNpcGhlciBtYXkgYmUgdXNlZC48L3A+CisgICAgPC9hdHRyaWJ1dGU+CisKKyAgPC9hdHRyaWJ1dGVzPgorCisgIDxwPkZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlCisgIDxhIGhyZWY9Ii4uL3NzbC1ob3d0by5odG1sIj5TU0wgQ29uZmlndXJhdGlvbiBIT1ctVE88L2E+LjwvcD4KKworICA8L3N1YnNlY3Rpb24+CisKKworPC9zZWN0aW9uPgorCisKKzwvYm9keT4KKworPC9kb2N1bWVudD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvY29uZmlnL2luZGV4LnhtbCBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvY29uZmlnL2luZGV4LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTRkZTg5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9jb25maWcvaW5kZXgueG1sCkBAIC0wLDAgKzEsNzEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCFET0NUWVBFIGRvY3VtZW50IFsKKyAgPCFFTlRJVFkgcHJvamVjdCBTWVNURU0gInByb2plY3QueG1sIj4KK10+Cis8ZG9jdW1lbnQgdXJsPSJpbmRleC5odG1sIj4KKworICAmcHJvamVjdDsKKworICA8cHJvcGVydGllcz4KKyAgICA8YXV0aG9yIGVtYWlsPSJjcmFpZ21jY0BhcGFjaGUub3JnIj5DcmFpZyBSLiBNY0NsYW5haGFuPC9hdXRob3I+CisgICAgPHRpdGxlPk92ZXJ2aWV3PC90aXRsZT4KKyAgPC9wcm9wZXJ0aWVzPgorCis8Ym9keT4KKworCis8c2VjdGlvbiBuYW1lPSJPdmVydmlldyI+CisKKzxwPlRoaXMgbWFudWFsIGNvbnRhaW5zIHJlZmVyZW5jZSBpbmZvcm1hdGlvbiBhYm91dCBhbGwgb2YgdGhlIGNvbmZpZ3VyYXRpb24KK2RpcmVjdGl2ZXMgdGhhdCBjYW4gYmUgaW5jbHVkZWQgaW4gYSA8Y29kZT5jb25mL3NlcnZlci54bWw8L2NvZGU+IGZpbGUgdG8KK2NvbmZpZ3VyZSB0aGUgYmVoYXZpb3Igb2YgdGhlIFRvbWNhdCA1IFNlcnZsZXQvSlNQIGNvbnRhaW5lci4gIEl0IGRvZXMgbm90CithdHRlbXB0IHRvIGRlc2NyaWJlIHdoaWNoIGNvbmZpZ3VyYXRpb24gZGlyZWN0aXZlcyBzaG91bGQgYmUgdXNlZCB0byBwZXJmb3JtCitzcGVjaWZpYyB0YXNrcyAtIGZvciB0aGF0LCBzZWUgdGhlIHZhcmlvdXMgPGVtPkhPVy1UTzwvZW0+IGRvY3VtZW50cyBvbiB0aGUKK21haW4gaW5kZXggcGFnZS48L3A+CisKKzxwPlRoZSBjb25maWd1cmF0aW9uIGVsZW1lbnQgZGVzY3JpcHRpb25zIGFyZSBvcmdhbml6ZWQgaW50byB0aGUgZm9sbG93aW5nCittYWpvciBjYXRlZ29yaWVzOjwvcD4KKzx1bD4KKzxsaT48c3Ryb25nPlRvcCBMZXZlbCBFbGVtZW50czwvc3Ryb25nPiAtIDxjb2RlPiZsdDtTZXJ2ZXImZ3Q7PC9jb2RlPiBpcyB0aGUKKyAgICByb290IGVsZW1lbnQgb2YgdGhlIGVudGlyZSBjb25maWd1cmF0aW9uIGZpbGUsIHdoaWxlCisgICAgPGNvZGU+Jmx0O1NlcnZpY2UmZ3Q7PC9jb2RlPiByZXByZXNlbnRzIGEgZ3JvdXAgb2YgQ29ubmVjdG9ycyB0aGF0IGlzCisgICAgYXNzb2NpYXRlZCB3aXRoIGFuIEVuZ2luZS48L2xpPgorPGxpPjxzdHJvbmc+Q29ubmVjdG9yczwvc3Ryb25nPiAtIFJlcHJlc2VudCB0aGUgaW50ZXJmYWNlIGJldHdlZW4gZXh0ZXJuYWwKKyAgICBjbGllbnRzIHNlbmRpbmcgcmVxdWVzdHMgdG8gKGFuZCByZWNlaXZpbmcgcmVzcG9uc2VzIGZyb20pIGEgcGFydGljdWxhcgorICAgIFNlcnZpY2UuPC9saT4KKzxsaT48c3Ryb25nPkNvbnRhaW5lcnM8L3N0cm9uZz4gLSBSZXByZXNlbnQgY29tcG9uZW50cyB3aG9zZSBmdW5jdGlvbiBpcyB0bworICAgIHByb2Nlc3MgaW5jb21pbmcgcmVxdWVzdHMsIGFuZCBjcmVhdGUgdGhlIGNvcnJlc3BvbmRpbmcgcmVzcG9uc2VzLgorICAgIEFuIEVuZ2luZSBoYW5kbGVzIGFsbCByZXF1ZXN0cyBmb3IgYSBTZXJ2aWNlLCBhIEhvc3QgaGFuZGxlcyBhbGwgcmVxdWVzdHMKKyAgICBmb3IgYSBwYXJ0aWN1bGFyIHZpcnR1YWwgaG9zdCwgYW5kIGEgQ29udGV4dCBoYW5kbGVzIGFsbCByZXF1ZXN0cyBmb3IgYQorICAgIHNwZWNpZmljIHdlYiBhcHBsaWNhdGlvbi48L2xpPgorPGxpPjxzdHJvbmc+TmVzdGVkIENvbXBvbmVudHM8L3N0cm9uZz4gLSBSZXByZXNlbnQgZWxlbWVudHMgdGhhdCBjYW4gYmUKKyAgICBuZXN0ZWQgaW5zaWRlIHRoZSBlbGVtZW50IGZvciBhIENvbnRhaW5lci4gIFNvbWUgZWxlbWVudHMgY2FuIGJlIG5lc3RlZAorICAgIGluc2lkZSBhbnkgQ29udGFpbmVyLCB3aGlsZSBvdGhlcnMgY2FuIG9ubHkgYmUgbmVzdGVkIGluc2lkZSBhCisgICAgQ29udGV4dC48L2xpPgorPC91bD4KKworPHA+Rm9yIGVhY2ggZWxlbWVudCwgdGhlIGNvcnJlc3BvbmRpbmcgZG9jdW1lbnRhdGlvbiBmb2xsb3dzIHRoaXMgZ2VuZXJhbAorb3V0bGluZTo8L3A+Cis8dWw+Cis8bGk+PHN0cm9uZz5JbnRyb2R1Y3Rpb248L3N0cm9uZz4gLSBPdmVyYWxsIGRlc2NyaXB0aW9uIG9mIHRoaXMgcGFydGljdWxhcgorICAgIGNvbXBvbmVudC4gIFRoZXJlIHdpbGwgYmUgYSBjb3JyZXNwb25kaW5nIEphdmEgPGVtPmludGVyZmFjZTwvZW0+IChpbgorICAgIHRoZSA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hPC9jb2RlPiBwYWNha2dlKSB0aGF0IGlzIGltcGxlbWVudGVkIGJ5IG9uZQorICAgIG9yIG1vcmUgc3RhbmRhcmQgaW1wbGVtZW50YXRpb25zLjwvbGk+Cis8bGk+PHN0cm9uZz5BdHRyaWJ1dGVzPC9zdHJvbmc+IC0gVGhlIHNldCBvZiBhdHRyaWJ1dGVzIHRoYXQgYXJlIGxlZ2FsIGZvcgorICAgIHRoaXMgZWxlbWVudC4gIEdlbmVyYWxseSwgdGhpcyB3aWxsIGJlIHN1YmRpdmlkZWQgaW50byA8ZW0+Q29tbW9uPC9lbT4KKyAgICBhdHRyaWJ1dGVzIHRoYXQgYXJlIHN1cHBvcnRlZCBieSBhbGwgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBjb3JyZXNwb25kaW5nCisgICAgSmF2YSBpbnRlcmZhY2UsIGFuZCA8ZW0+U3RhbmRhcmQgSW1wbGVtZW50YXRpb248L2VtPiBhdHRyaWJ1dGVzIHRoYXQgYXJlCisgICAgc3BlY2lmaWMgdG8gYSBwYXJ0aWN1bGFyIEphdmEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoaXMgaW50ZXJmYWNlLgorICAgIFRoZSBuYW1lcyBvZiByZXF1aXJlZCBhdHRyaWJ1dGVzIGFyZSA8c3Ryb25nPmJvbGRlZDwvc3Ryb25nPi48L2xpPgorPGxpPjxzdHJvbmc+TmVzdGVkIENvbXBvbmVudHM8L3N0cm9uZz4gLSBFbnVtZXJhdGVzIHdoaWNoIG9mIHRoZSA8ZW0+TmVzdGVkCisgICAgQ29tcG9uZW50czwvZW0+IGNhbiBiZSBsZWdhbGx5IG5lc3RlZCB3aXRoaW4gdGhpcyBlbGVtZW50LjwvbGk+Cis8bGk+PHN0cm9uZz5TcGVjaWFsIEZlYXR1cmVzPC9zdHJvbmc+IC0gRGVzY3JpYmVzIHRoZSBjb25maWd1cmF0aW9uIG9mIGEgbGFyZ2UKKyAgICB2YXJpZXR5IG9mIHNwZWNpYWwgZmVhdHVyZXMgKHNwZWNpZmljIHRvIGVhY2ggZWxlbWVudCB0eXBlKSB0aGF0IGFyZQorICAgIHN1cHBvcnRlZCBieSB0aGUgc3RhbmRhcmQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBpbnRlcmZhY2UuPC9saT4KKzwvdWw+CisKKzwvc2VjdGlvbj4KKworCis8L2JvZHk+Cis8L2RvY3VtZW50PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9jb25maWcvbG9hZGVyLnhtbCBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvY29uZmlnL2xvYWRlci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVhMWNiZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvY29uZmlnL2xvYWRlci54bWwKQEAgLTAsMCArMSwxNDkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCFET0NUWVBFIGRvY3VtZW50IFsKKyAgPCFFTlRJVFkgcHJvamVjdCBTWVNURU0gInByb2plY3QueG1sIj4KK10+Cis8ZG9jdW1lbnQgdXJsPSJsb2FkZXIuaHRtbCI+CisKKyAgJnByb2plY3Q7CisKKyAgPHByb3BlcnRpZXM+CisgICAgPGF1dGhvciBlbWFpbD0iY3JhaWdtY2NAYXBhY2hlLm9yZyI+Q3JhaWcgUi4gTWNDbGFuYWhhbjwvYXV0aG9yPgorICAgIDx0aXRsZT5UaGUgTG9hZGVyIENvbXBvbmVudDwvdGl0bGU+CisgIDwvcHJvcGVydGllcz4KKworPGJvZHk+CisKKworPHNlY3Rpb24gbmFtZT0iSW50cm9kdWN0aW9uIj4KKworICA8cD5UaGUgPHN0cm9uZz5Mb2FkZXI8L3N0cm9uZz4gZWxlbWVudCByZXByZXNlbnRzIHRoZSA8ZW0+d2ViCisgIGFwcGxpY2F0aW9uIGNsYXNzIGxvYWRlcjwvZW0+IHRoYXQgd2lsbCBiZSB1c2VkIHRvIGxvYWQgSmF2YQorICBjbGFzc2VzIGFuZCByZXNvdXJjZXMgZm9yIHlvdXIgd2ViIGFwcGxpY2F0aW9uLiAgU3VjaAorICBhIGNsYXNzIGxvYWRlciBtdXN0IGZvbGxvdyB0aGUgcmVxdWlyZW1lbnRzIG9mIHRoZSBTZXJ2bGV0CisgIFNwZWNpZmljYXRpb24sIGFuZCBsb2FkIGNsYXNzZXMgZnJvbSB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+CisgIDx1bD4KKyAgPGxpPkZyb20gdGhlIDxjb2RlPi9XRUItSU5GL2NsYXNzZXM8L2NvZGU+IGRpcmVjdG9yeSBpbnNpZGUgeW91cgorICAgICAgd2ViIGFwcGxpY2F0aW9uLjwvbGk+CisgIDxsaT5Gcm9tIEpBUiBmaWxlcyBpbiB0aGUgPGNvZGU+L1dFQi1JTkYvbGliPC9jb2RlPiBkaXJlY3RvcnkKKyAgICAgIGluc2lkZSB5b3VyIHdlYiBhcHBsaWNhdGlvbi48L2xpPgorICA8bGk+RnJvbSByZXNvdXJjZXMgbWFkZSBhdmFpbGFibGUgYnkgQ2F0YWxpbmEgdG8gYWxsIHdlYgorICAgICAgYXBwbGljYXRpb25zIGdsb2JhbGx5LjwvbGk+CisgIDwvdWw+CisKKyAgPHA+QSBMb2FkZXIgZWxlbWVudCBNQVkgYmUgbmVzdGVkIGluc2lkZSBhIDxhIGhyZWY9ImNvbnRleHQuaHRtbCI+Q29udGV4dDwvYT4KKyAgY29tcG9uZW50LiAgSWYgaXQgaXMgbm90IGluY2x1ZGVkLCBhIGRlZmF1bHQgTG9hZGVyIGNvbmZpZ3VyYXRpb24gd2lsbCBiZQorICBjcmVhdGVkIGF1dG9tYXRpY2FsbHksIHdoaWNoIGlzIHN1ZmZpY2llbnQgZm9yIG1vc3QgcmVxdWlyZW1lbnRzLjwvcD4KKworICA8cD5Gb3IgYSBtb3JlIGluLWRlcHRoIGRlc2NyaXB0aW9uIG9mIHRoZSBjbGFzcyBsb2FkZXIgaGllcmFyY2h5CisgIHRoYXQgaXMgaW1wbGVtZW50ZWQgYnkgQ2F0YWxpbmEsIHNlZSA8c3Ryb25nPkZJWE1FIC0gUmVmZXJlbmNlPC9zdHJvbmc+LjwvcD4KKworICAgIDxibG9ja3F1b3RlPjxlbT4KKyAgICA8cD5UaGUgZGVzY3JpcHRpb24gYmVsb3cgdXNlcyB0aGUgdmFyaWFibGUgbmFtZSAkQ0FUQUxJTkFfSE9NRQorICAgIHRvIHJlZmVyIHRvIHRoZSBkaXJlY3RvcnkgaW50byB3aGljaCB5b3UgaGF2ZSBpbnN0YWxsZWQgVG9tY2F0IDUsCisgICAgYW5kIGlzIHRoZSBiYXNlIGRpcmVjdG9yeSBhZ2FpbnN0IHdoaWNoIG1vc3QgcmVsYXRpdmUgcGF0aHMgYXJlCisgICAgcmVzb2x2ZWQuICBIb3dldmVyLCBpZiB5b3UgaGF2ZSBjb25maWd1cmVkIFRvbWNhdCA1IGZvciBtdWx0aXBsZQorICAgIGluc3RhbmNlcyBieSBzZXR0aW5nIGEgQ0FUQUxJTkFfQkFTRSBkaXJlY3RvcnksIHlvdSBzaG91bGQgdXNlCisgICAgJENBVEFMSU5BX0JBU0UgaW5zdGVhZCBvZiAkQ0FUQUxJTkFfSE9NRSBmb3IgZWFjaCBvZiB0aGVzZQorICAgIHJlZmVyZW5jZXMuPC9wPgorICAgIDwvZW0+PC9ibG9ja3F1b3RlPgorCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iQXR0cmlidXRlcyI+CisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iQ29tbW9uIEF0dHJpYnV0ZXMiPgorCisgICAgPHA+QWxsIGltcGxlbWVudGF0aW9ucyBvZiA8c3Ryb25nPkxvYWRlcjwvc3Ryb25nPgorICAgIHN1cHBvcnQgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOjwvcD4KKworICAgIDxhdHRyaWJ1dGVzPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzTmFtZSIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+SmF2YSBjbGFzcyBuYW1lIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiB0byB1c2UuICBUaGlzIGNsYXNzIG11c3QKKyAgICAgICAgaW1wbGVtZW50IHRoZSA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLkxvYWRlcjwvY29kZT4gaW50ZXJmYWNlLgorICAgICAgICBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgc3RhbmRhcmQgdmFsdWUgKGRlZmluZWQgYmVsb3cpIHdpbGwgYmUgdXNlZC48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZWxlZ2F0ZSIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+U2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+IGlmIHlvdSB3YW50IHRoZSBjbGFzcyBsb2FkZXIgdG8gZm9sbG93CisgICAgICAgIHRoZSBzdGFuZGFyZCBKYXZhMiBkZWxlZ2F0aW9uIG1vZGVsLCBhbmQgYXR0ZW1wdCB0byBsb2FkIGNsYXNzZXMgZnJvbQorICAgICAgICBwYXJlbnQgY2xhc3MgbG9hZGVycyA8c3Ryb25nPmJlZm9yZTwvc3Ryb25nPiBsb29raW5nIGluc2lkZSB0aGUgd2ViCisgICAgICAgIGFwcGxpY2F0aW9uLiAgU2V0IHRvIDxjb2RlPmZhbHNlPC9jb2RlPiAodGhlIGRlZmF1bHQpIHRvIGhhdmUgdGhlCisgICAgICAgIGNsYXNzIGxvYWRlciBsb29rIGluc2lkZSB0aGUgd2ViIGFwcGxpY2F0aW9uIGZpcnN0LCBiZWZvcmUgYXNraW5nCisgICAgICAgIHBhcmVudCBjbGFzcyBsb2FkZXJzIHRvIGZpbmQgcmVxdWVzdGVkIGNsYXNzZXMgb3IgcmVzb3VyY2VzLjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9InJlbG9hZGFibGUiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPlNldCB0byA8Y29kZT50cnVlPC9jb2RlPiBpZiB5b3Ugd2FudCBDYXRhbGluYSB0byBtb25pdG9yIGNsYXNzZXMgaW4KKyAgICAgICAgPGNvZGU+L1dFQi1JTkYvY2xhc3Nlcy88L2NvZGU+IGFuZCA8Y29kZT4vV0VCLUlORi9saWI8L2NvZGU+IGZvcgorICAgICAgICBjaGFuZ2VzLCBhbmQgYXV0b21hdGljYWxseSByZWxvYWQgdGhlIHdlYiBhcHBsaWNhdGlvbiBpZiBhIGNoYW5nZQorICAgICAgICBpcyBkZXRlY3RlZC4gIFRoaXMgZmVhdHVyZSBpcyB2ZXJ5IHVzZWZ1bCBkdXJpbmcgYXBwbGljYXRpb24KKyAgICAgICAgZGV2ZWxvcG1lbnQsIGJ1dCBpdCByZXF1aXJlcyBzaWduaWZpY2FudCBydW50aW1lIG92ZXJoZWFkIGFuZCBpcworICAgICAgICBub3QgcmVjb21tZW5kZWQgZm9yIHVzZSBvbiBkZXBsb3llZCBwcm9kdWN0aW9uIGFwcGxpY2F0aW9ucy4gIFlvdQorICAgICAgICBjYW4gdXNlIHRoZSA8YSBocmVmPSIuLi9tYW5hZ2VyLWhvd3RvLmh0bWwiPk1hbmFnZXI8L2E+IHdlYgorICAgICAgICBhcHBsaWNhdGlvbiwgaG93ZXZlciwgdG8gdHJpZ2dlciByZWxvYWRzIG9mIGRlcGxveWVkIGFwcGxpY2F0aW9ucworICAgICAgICBvbiBkZW1hbmQuPC9wPgorCisgICAgICAgIDxwPjxzdHJvbmc+Tk9URTwvc3Ryb25nPiAtIFRoZSB2YWx1ZSBmb3IgdGhpcyBwcm9wZXJ0eSB3aWxsIGJlCisgICAgICAgIGluaGVyaXRlZCBmcm9tIHRoZSA8Y29kZT5yZWxvYWRhYmxlPC9jb2RlPiBhdHRyaWJ1dGUgeW91IHNldCBvbgorICAgICAgICB0aGUgc3Vycm91bmRpbmcgPGEgaHJlZj0iY29udGV4dC5odG1sIj5Db250ZXh0PC9hPiBjb21wb25lbnQsCisgICAgICAgIGFuZCBhbnkgdmFsdWUgeW91IGV4cGxpY2l0bHkgc2V0IGhlcmUgd2lsbCBiZSByZXBsYWNlZC48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgIDwvYXR0cmlidXRlcz4KKworICA8L3N1YnNlY3Rpb24+CisKKworICA8c3Vic2VjdGlvbiBuYW1lPSJTdGFuZGFyZCBJbXBsZW1lbnRhdGlvbiI+CisKKyAgICA8cD5UaGUgc3RhbmRhcmQgaW1wbGVtZW50YXRpb24gb2YgPHN0cm9uZz5Mb2FkZXI8L3N0cm9uZz4gaXMKKyAgICA8c3Ryb25nPm9yZy5hcGFjaGUuY2F0YWxpbmEubG9hZGVyLldlYmFwcExvYWRlcjwvc3Ryb25nPi4KKyAgICBJdCBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgYXR0cmlidXRlcyAoaW4gYWRkaXRpb24gdG8gdGhlCisgICAgY29tbW9uIGF0dHJpYnV0ZXMgbGlzdGVkIGFib3ZlKTo8L3A+CisKKyAgICA8YXR0cmlidXRlcz4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjaGVja0ludGVydmFsIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgICA8cD5UaGUgbnVtYmVyIG9mIHNlY29uZHMgYmV0d2VlbiBjaGVja3MgZm9yIG1vZGlmaWVkIGNsYXNzZXMgYW5kCisgICAgICAgIHJlc291cmNlcywgaWYgPGNvZGU+cmVsb2FkYWJsZTwvY29kZT4gaGFzIGJlZW4gc2V0IHRvCisgICAgICAgIDxjb2RlPnRydWU8L2NvZGU+LiAgVGhlIGRlZmF1bHQgaXMgMTUgc2Vjb25kcy48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsb2FkZXJDbGFzcyIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+SmF2YSBjbGFzcyBuYW1lIG9mIHRoZSA8Y29kZT5qYXZhLmxhbmcuQ2xhc3NMb2FkZXI8L2NvZGU+CisgICAgICAgIGltcGxlbWVudGF0aW9uIGNsYXNzIHRvIHVzZS4gIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0IHZhbHVlIGlzCisgICAgICAgIDxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEubG9hZGVyLldlYmFwcENsYXNzTG9hZGVyPC9jb2RlPi48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgIDwvYXR0cmlidXRlcz4KKworICA8L3N1YnNlY3Rpb24+CisKKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9Ik5lc3RlZCBDb21wb25lbnRzIj4KKworICA8cD5ObyBjb21wb25lbnRzIG1heSBiZSBuZXN0ZWQgaW5zaWRlIGEgPHN0cm9uZz5Mb2FkZXI8L3N0cm9uZz4gZWxlbWVudC48L3A+CisKKzwvc2VjdGlvbj4KKworCis8c2VjdGlvbiBuYW1lPSJTcGVjaWFsIEZlYXR1cmVzIj4KKworICA8c3Vic2VjdGlvbiBuYW1lPSJMb2dnaW5nIj4KKworICAgIDxwPkEgbG9hZGVyIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgbG9nIGNhdGVnb3J5IGJhc2VkIG9uIGl0cyBjbGFzc25hbWUuPC9wPgorCisgIDwvc3Vic2VjdGlvbj4KKworPC9zZWN0aW9uPgorCisKKzwvYm9keT4KKworCis8L2RvY3VtZW50PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9jb25maWcvbWFuYWdlci54bWwgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2NvbmZpZy9tYW5hZ2VyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDM2ODk0Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9jb25maWcvbWFuYWdlci54bWwKQEAgLTAsMCArMSw0MjQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCFET0NUWVBFIGRvY3VtZW50IFsKKyAgPCFFTlRJVFkgcHJvamVjdCBTWVNURU0gInByb2plY3QueG1sIj4KK10+Cis8ZG9jdW1lbnQgdXJsPSJtYW5hZ2VyLmh0bWwiPgorCisgICZwcm9qZWN0OworCisgIDxwcm9wZXJ0aWVzPgorICAgIDxhdXRob3IgZW1haWw9ImNyYWlnbWNjQGFwYWNoZS5vcmciPkNyYWlnIFIuIE1jQ2xhbmFoYW48L2F1dGhvcj4KKyAgICA8dGl0bGU+VGhlIE1hbmFnZXIgQ29tcG9uZW50PC90aXRsZT4KKyAgPC9wcm9wZXJ0aWVzPgorCis8Ym9keT4KKworCis8c2VjdGlvbiBuYW1lPSJJbnRyb2R1Y3Rpb24iPgorCisgIDxwPlRoZSA8c3Ryb25nPk1hbmFnZXI8L3N0cm9uZz4gZWxlbWVudCByZXByZXNlbnRzIHRoZSA8ZW0+c2Vzc2lvbgorICBtYW5hZ2VyPC9lbT4gdGhhdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIGFuZCBtYWludGFpbiBIVFRQIHNlc3Npb25zCisgIGFzIHJlcXVlc3RlZCBieSB0aGUgYXNzb2NpYXRlZCB3ZWIgYXBwbGljYXRpb24uPC9wPgorCisgIDxwPkEgTWFuYWdlciBlbGVtZW50IE1BWSBiZSBuZXN0ZWQgaW5zaWRlIGEKKyAgPGEgaHJlZj0iY29udGV4dC5odG1sIj5Db250ZXh0PC9hPiBjb21wb25lbnQuICBJZiBpdCBpcyBub3QgaW5jbHVkZWQsCisgIGEgZGVmYXVsdCBNYW5hZ2VyIGNvbmZpZ3VyYXRpb24gd2lsbCBiZSBjcmVhdGVkIGF1dG9tYXRpY2FsbHksIHdoaWNoCisgIGlzIHN1ZmZpY2llbnQgZm9yIG1vc3QgcmVxdWlyZW1lbnRzLjwvcD4KKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IkF0dHJpYnV0ZXMiPgorCisgIDxzdWJzZWN0aW9uIG5hbWU9IkNvbW1vbiBBdHRyaWJ1dGVzIj4KKworICAgIDxwPkFsbCBpbXBsZW1lbnRhdGlvbnMgb2YgPHN0cm9uZz5NYW5hZ2VyPC9zdHJvbmc+CisgICAgc3VwcG9ydCB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6PC9wPgorCisgICAgPGF0dHJpYnV0ZXM+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NOYW1lIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgICA8cD5KYXZhIGNsYXNzIG5hbWUgb2YgdGhlIGltcGxlbWVudGF0aW9uIHRvIHVzZS4gIFRoaXMgY2xhc3MgbXVzdAorICAgICAgICBpbXBsZW1lbnQgdGhlIDxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuTWFuYWdlcjwvY29kZT4gaW50ZXJmYWNlLgorICAgICAgICBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgc3RhbmRhcmQgdmFsdWUgKGRlZmluZWQgYmVsb3cpIHdpbGwgYmUgdXNlZC48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkaXN0cmlidXRhYmxlIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgICA8cD5TZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4gdG8gYXNrIHRoZSBzZXNzaW9uIG1hbmFnZXIgdG8gZW5mb3JjZQorICAgICAgICB0aGUgcmVzdHJpY3Rpb25zIGRlc2NyaWJlZCBpbiB0aGUgU2VydmxldCBTcGVjaWZpY2F0aW9uIG9uCisgICAgICAgIGRpc3RyaWJ1dGFibGUgYXBwbGljYXRpb25zIChwcmltYXJpbHksIHRoaXMgd291bGQgbWVhbiB0aGF0IGFsbAorICAgICAgICBzZXNzaW9uIGF0dHJpYnV0ZXMgbXVzdCBpbXBsZW1lbnQgPGNvZGU+amF2YS5pby5TZXJpYWxpemFibGU8L2NvZGU+KS4KKyAgICAgICAgU2V0IHRvIDxjb2RlPmZhbHNlPC9jb2RlPiAodGhlIGRlZmF1bHQpIHRvIG5vdCBlbmZvcmNlIHRoZXNlCisgICAgICAgIHJlc3RyaWN0aW9ucy48L3A+CisKKyAgICAgICAgPHA+PHN0cm9uZz5OT1RFPC9zdHJvbmc+IC0gVGhlIHZhbHVlIGZvciB0aGlzIHByb3BlcnR5IGlzIGluaGVyaXRlZAorICAgICAgICBhdXRvbWF0aWNhbGx5IGJhc2VkIG9uIHRoZSBwcmVzZW5jZSBvciBhYnNlbmNlIG9mIHRoZQorICAgICAgICA8Y29kZT4mbHQ7ZGlzdHJpYnV0YWJsZSZndDs8L2NvZGU+IGVsZW1lbnQgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbgorICAgICAgICBkZXBsb3ltZW50IGRlc2NyaXB0b3IgKDxjb2RlPi9XRUItSU5GL3dlYi54bWw8L2NvZGU+KS48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgIDwvYXR0cmlidXRlcz4KKworICA8L3N1YnNlY3Rpb24+CisKKworICA8c3Vic2VjdGlvbiBuYW1lPSJTdGFuZGFyZCBJbXBsZW1lbnRhdGlvbiI+CisKKyAgICA8cD5Ub21jYXQgcHJvdmlkZXMgdHdvIHN0YW5kYXJkIGltcGxlbWVudGF0aW9ucyBvZiA8c3Ryb25nPk1hbmFnZXI8L3N0cm9uZz4KKyAgICBmb3IgdXNlIC0gdGhlIGRlZmF1bHQgb25lIHN0b3JlcyBhY3RpdmUgc2Vzc2lvbnMsIHdoaWxlIHRoZSBvcHRpb25hbCBvbmUKKyAgICBzdG9yZXMgYWN0aXZlIHNlc3Npb25zIHRoYXQgaGF2ZSBiZWVuIHN3YXBwZWQgb3V0IChpbiBhZGRpdGlvbiB0byBzYXZpbmcKKyAgICBzZXNzaW9ucyBhY3Jvc3MgYSByZXN0YXJ0IG9mIFRvbWNhdCkgaW4gYSBzdG9yYWdlIGxvY2F0aW9uIHRoYXQgaXMgc2VsZWN0ZWQKKyAgICB2aWEgdGhlIHVzZSBvZiBhbiBhcHByb3ByaWF0ZSA8c3Ryb25nPlN0b3JlPC9zdHJvbmc+IG5lc3RlZCBlbGVtZW50LjwvcD4KKworICAgIDxoMz5TdGFuZGFyZCBNYW5hZ2VyIEltcGxlbWVudGF0aW9uPC9oMz4KKworICAgIDxwPlRoZSBzdGFuZGFyZCBpbXBsZW1lbnRhdGlvbiBvZiA8c3Ryb25nPk1hbmFnZXI8L3N0cm9uZz4gaXMKKyAgICA8c3Ryb25nPm9yZy5hcGFjaGUuY2F0YWxpbmEuc2Vzc2lvbi5TdGFuZGFyZE1hbmFnZXI8L3N0cm9uZz4uCisgICAgSXQgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIGF0dHJpYnV0ZXMgKGluIGFkZGl0aW9uIHRvIHRoZQorICAgIGNvbW1vbiBhdHRyaWJ1dGVzIGxpc3RlZCBhYm92ZSk6PC9wPgorCisgICAgPGF0dHJpYnV0ZXM+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYWxnb3JpdGhtIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgICA8cD5OYW1lIG9mIHRoZSA8ZW0+TWVzc2FnZSBEaWdlc3Q8L2VtPiBhbGdvcml0aG0gdXNlZCB0byBjYWxjdWxhdGUKKyAgICAgICAgc2Vzc2lvbiBpZGVudGlmaWVycyBwcm9kdWNlZCBieSB0aGlzIE1hbmFnZXIuICBUaGlzIHZhbHVlIG11c3QKKyAgICAgICAgYmUgc3VwcG9ydGVkIGJ5IHRoZSA8Y29kZT5qYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3Q8L2NvZGU+IGNsYXNzLgorICAgICAgICBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCB2YWx1ZSBpcyAiTUQ1Ii48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjaGVja0ludGVydmFsIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgICA8cD5UaGUgbnVtYmVyIG9mIHNlY29uZHMgYmV0d2VlbiBjaGVja3MgZm9yIGV4cGlyZWQgc2Vzc2lvbnMKKyAgICAgICAgZm9yIHRoaXMgbWFuYWdlci4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDYwIHNlY29uZHMuPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZW50cm9weSIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+QSBTdHJpbmcgdmFsdWUgdGhhdCBpcyB1dGlsaXplZCB3aGVuIHNlZWRpbmcgdGhlIHJhbmRvbSBudW1iZXIKKyAgICAgICAgZ2VuZXJhdG9yIHVzZWQgdG8gY3JlYXRlIHNlc3Npb24gaWRlbnRpZmllcnMgZm9yIHRoaXMgTWFuYWdlci4KKyAgICAgICAgSWYgbm90IHNwZWNpZmllZCwgYSBzZW1pLXVzZWZ1bCB2YWx1ZSBpcyBjYWxjdWxhdGVkLCBidXQgYSBsb25nCisgICAgICAgIFN0cmluZyB2YWx1ZSBzaG91bGQgYmUgc3BlY2lmaWVkIGluIHNlY3VyaXR5LWNvbnNjaW91cworICAgICAgICBlbnZpcm9ubWVudHMuPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibWF4QWN0aXZlU2Vzc2lvbnMiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPlRoZSBtYXhpbXVtIG51bWJlciBvZiBhY3RpdmUgc2Vzc2lvbnMgdGhhdCB3aWxsIGJlIGNyZWF0ZWQgYnkKKyAgICAgICAgdGhpcyBNYW5hZ2VyLCBvciAtMSAodGhlIGRlZmF1bHQpIGZvciBubyBsaW1pdC48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwYXRobmFtZSIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+QWJzb2x1dGUgb3IgcmVsYXRpdmUgKHRvIHRoZSB3b3JrIGRpcmVjdG9yeSBmb3IgdGhpcyBDb250ZXh0KQorICAgICAgICBwYXRobmFtZSBvZiB0aGUgZmlsZSBpbiB3aGljaCBzZXNzaW9uIHN0YXRlIHdpbGwgYmUgcHJlc2VydmVkCisgICAgICAgIGFjcm9zcyBhcHBsaWNhdGlvbiByZXN0YXJ0cywgaWYgcG9zc2libGUuICBUaGUgZGVmYXVsdCBpcworICAgICAgICAiU0VTU0lPTlMuc2VyIi4gIFNlZSA8YSBocmVmPSIjUmVzdGFydCBQZXJzaXN0ZW5jZSI+UmVzdGFydAorICAgICAgICBQZXJzaXN0ZW5jZTwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24uIFJlc3RhcnQgcGVyc2lzdGVuY2UgbWF5IGJlIAorICAgICAgICBkaXNhYmxlZCBieSBzZXR0aW5nIHRoaXMgYXR0cmlidXRlIHRvIGFuIGVtcHR5IHN0cmluZy48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJyYW5kb21DbGFzcyIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+SmF2YSBjbGFzcyBuYW1lIG9mIHRoZSA8Y29kZT5qYXZhLnV0aWwuUmFuZG9tPC9jb2RlPgorICAgICAgICBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0byB1c2UuICBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCB2YWx1ZSBpcworICAgICAgICA8Y29kZT5qYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbTwvY29kZT4uPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICA8L2F0dHJpYnV0ZXM+CisKKyAgICA8aDM+UGVyc2lzdGVudCBNYW5hZ2VyIEltcGxlbWVudGF0aW9uPC9oMz4KKworICAgIDxwPjxlbT48c3Ryb25nPldBUk5JTkcgLSBVc2Ugb2YgdGhpcyBNYW5hZ2VyIGltcGxlbWVudGF0aW9uCisgICAgaGFzIG5vdCBiZWVuIHRob3JvdWdobHkgdGVzdGVkLCBhbmQgc2hvdWxkIGJlIGNvbnNpZGVyZWQgZXhwZXJpbWVudGFsIQorICAgIDwvc3Ryb25nPjwvZW0+PC9wPgorCisgICAgPHA+VGhlIHBlcnNpc3RlbnQgaW1wbGVtZW50YXRpb24gb2YgPHN0cm9uZz5NYW5hZ2VyPC9zdHJvbmc+IGlzCisgICAgPHN0cm9uZz5vcmcuYXBhY2hlLmNhdGFsaW5hLnNlc3Npb24uUGVyc2lzdGVudE1hbmFnZXI8L3N0cm9uZz4uICBJbgorICAgIGFkZGl0aW9uIHRvIHRoZSB1c3VhbCBvcGVyYXRpb25zIG9mIGNyZWF0aW5nIGFuZCBkZWxldGluZyBzZXNzaW9ucywgYQorICAgIDxjb2RlPlBlcnNpc3RlbnRNYW5hZ2VyPC9jb2RlPiBoYXMgdGhlIGNhcGFiaWxpdHkgdG8gc3dhcCBhY3RpdmUgKGJ1dAorICAgIGlkbGUpIHNlc3Npb25zIG91dCB0byBhIHBlcnNpc3RlbnQgc3RvcmFnZSBtZWNoYW5pc20sIGFzIHdlbGwgYXMgdG8gc2F2ZQorICAgIGFsbCBzZXNzaW9ucyBhY3Jvc3MgYSBub3JtYWwgcmVzdGFydCBvZiBUb21jYXQuICBUaGUgYWN0dWFsIHBlcnNpc3RlbnQKKyAgICBzdG9yYWdlIG1lY2hhbmlzbSB1c2VkIGlzIHNlbGVjdGVkIGJ5IHlvdXIgY2hvaWNlIG9mIGEKKyAgICA8c3Ryb25nPlN0b3JlPC9zdHJvbmc+IGVsZW1lbnQgbmVzdGVkIGluc2lkZSB0aGUgPHN0cm9uZz5NYW5hZ2VyPC9zdHJvbmc+CisgICAgZWxlbWVudCAtIHRoaXMgaXMgcmVxdWlyZWQgZm9yIHVzZSBvZiA8Y29kZT5QZXJzaXN0ZW50TWFuYWdlcjwvY29kZT4uPC9wPgorCisgICAgPHA+VGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBNYW5hZ2VyIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBpbgorICAgIGFkZGl0aW9uIHRvIHRoZSA8YSBocmVmPSIjQ29tbW9uIEF0dHJpYnV0ZXMiPkNvbW1vbiBBdHRyaWJ1dGVzPC9hPgorICAgIGRlc2NyaWJlZCBlYXJsaWVyLjwvcD4KKworICAgIDxhdHRyaWJ1dGVzPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9ImFsZ29yaXRobSIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+TmFtZSBvZiB0aGUgPGVtPk1lc3NhZ2UgRGlnZXN0PC9lbT4gYWxnb3JpdGhtIHVzZWQgdG8gY2FsY3VsYXRlCisgICAgICAgIHNlc3Npb24gaWRlbnRpZmllcnMgcHJvZHVjZWQgYnkgdGhpcyBNYW5hZ2VyLiAgVGhpcyB2YWx1ZSBtdXN0CisgICAgICAgIGJlIHN1cHBvcnRlZCBieSB0aGUgPGNvZGU+amF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0PC9jb2RlPiBjbGFzcy4KKyAgICAgICAgSWYgbm90IHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgdmFsdWUgaXMgIk1ENSIuPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2hlY2tJbnRlcnZhbCIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+VGhlIG51bWJlciBvZiBzZWNvbmRzIGJldHdlZW4gY2hlY2tzIGZvciBleHBpcmVkIHNlc3Npb25zCisgICAgICAgIGZvciB0aGlzIE1hbmFnZXIuICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA2MCBzZWNvbmRzLjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzTmFtZSIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+SmF2YSBjbGFzcyBuYW1lIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiB0byB1c2UuICBUaGlzIGNsYXNzIG11c3QKKyAgICAgICAgaW1wbGVtZW50IHRoZSA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLk1hbmFnZXI8L2NvZGU+IGludGVyZmFjZS4KKyAgICAgICAgWW91IDxzdHJvbmc+bXVzdDwvc3Ryb25nPiBzcGVjaWZ5CisgICAgICAgIDxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuc2Vzc2lvbi5QZXJzaXN0ZW50TWFuYWdlcjwvY29kZT4gdG8gdXNlCisgICAgICAgIHRoaXMgbWFuYWdlciBpbXBsZW1lbnRhdGlvbi48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJlbnRyb3B5IiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgICA8cD5BIFN0cmluZyB2YWx1ZSB0aGF0IGlzIHV0aWxpemVkIHdoZW4gc2VlZGluZyB0aGUgcmFuZG9tIG51bWJlcgorICAgICAgICBnZW5lcmF0b3IgdXNlZCB0byBjcmVhdGUgc2Vzc2lvbiBpZGVudGlmaWVycyBmb3IgdGhpcyBNYW5hZ2VyLgorICAgICAgICBJZiBub3Qgc3BlY2lmaWVkLCBhIHNlbWktdXNlZnVsIHZhbHVlIGlzIGNhbGN1bGF0ZWQsIGJ1dCBhIGxvbmcKKyAgICAgICAgU3RyaW5nIHZhbHVlIHNob3VsZCBiZSBzcGVjaWZpZWQgaW4gc2VjdXJpdHktY29uc2Npb3VzCisgICAgICAgIGVudmlyb25tZW50cy48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJtYXhBY3RpdmVTZXNzaW9ucyIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+VGhlIG1heGltdW0gbnVtYmVyIG9mIGFjdGl2ZSBzZXNzaW9ucyB0aGF0IHdpbGwgYmUgY3JlYXRlZCBieQorICAgICAgICB0aGlzIE1hbmFnZXIsIG9yIC0xICh0aGUgZGVmYXVsdCkgZm9yIG5vIGxpbWl0LjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9Im1heElkbGVCYWNrdXAiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPlRoZSB0aW1lIGludGVydmFsIChpbiBzZWNvbmRzKSBzaW5jZSB0aGUgbGFzdCBhY2Nlc3MgdG8gYSBzZXNzaW9uCisgICAgICAgIGJlZm9yZSBpdCBpcyBlbGlnaWJsZSBmb3IgYmVpbmcgcGVyc2lzdGVkIHRvIHRoZSBzZXNzaW9uIHN0b3JlLCBvcgorICAgICAgICA8Y29kZT4tMTwvY29kZT4gdG8gZGlzYWJsZSB0aGlzIGZlYXR1cmUuICBCeSBkZWZhdWx0LCB0aGlzIGZlYXR1cmUgaXMKKyAgICAgICAgZGlzYWJsZWQuPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibWF4SWRsZVN3YXAiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPlRoZSB0aW1lIGludGVydmFsIChpbiBzZWNvbmRzKSBzaW5jZSB0aGUgbGFzdCBhY2Nlc3MgdG8gYSBzZXNzaW9uCisgICAgICAgIGJlZm9yZSBpdCBzaG91bGQgYmUgcGVyc2lzdGVkIHRvIHRoZSBzZXNzaW9uIHN0b3JlLCBhbmQKKyAgICAgICAgcGFzc2l2YXRlZCBvdXQgb2YgdGhlIHNlcnZlcidzIG1lbW9yeSwgb3IgPGNvZGU+LTE8L2NvZGU+IHRvIGRpc2FibGUKKyAgICAgICAgdGhpcyBmZWF0dXJlLiAgSWYgdGhpcyBmZWF0dXJlIGlzIGVuYWJsZWQsIHRoZSB0aW1lIGludGVydmFsIHNwZWNpZmllZAorICAgICAgICBoZXJlIHNob3VsZCBiZSBlcXVhbCB0byBvciBsb25nZXIgdGhhbiB0aGUgdmFsdWUgc3BlY2lmaWVkIGZvcgorICAgICAgICA8Y29kZT5tYXhJZGxlQmFja3VwPC9jb2RlPi4gIEJ5IGRlZmF1bHQsIHRoaXMgZmVhdHVyZSBpcyBkaXNhYmxlZC48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJtaW5JZGxlU3dhcCIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+VGhlIHRpbWUgaW50ZXJ2YWwgKGluIHNlY29uZHMpIHNpbmNlIHRoZSBsYXN0IGFjY2VzcyB0byBhIHNlc3Npb24KKyAgICAgICAgYmVmb3JlIGl0IHdpbGwgYmUgZWxpZ2libGUgdG8gYmUgcGVyc2lzdGVkIHRvIHRoZSBzZXNzaW9uIHN0b3JlLCBhbmQKKyAgICAgICAgcGFzc2l2YXRlZCBvdXQgb2YgdGhlIHNlcnZlcidzIG1lbW9yeSwgb3IgPGNvZGU+LTE8L2NvZGU+IGZvciB0aGlzCisgICAgICAgIHN3YXBwaW5nIHRvIGJlIGF2YWlsYWJsZSBhdCBhbnkgdGltZS4gIElmIHNwZWNpZmllZCwgdGhpcyB2YWx1ZSBzaG91bGQKKyAgICAgICAgYmUgbGVzcyB0aGFuIHRoYXQgc3BlY2lmaWVkIGJ5IDxjb2RlPm1heElkbGVTd2FwPC9jb2RlPi4gIEJ5IGRlZmF1bHQsCisgICAgICAgIHRoaXMgdmFsdWUgaXMgc2V0IHRvIDxjb2RlPi0xPC9jb2RlPi48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJyYW5kb21DbGFzcyIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+SmF2YSBjbGFzcyBuYW1lIG9mIHRoZSA8Y29kZT5qYXZhLnV0aWwuUmFuZG9tPC9jb2RlPgorICAgICAgICBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0byB1c2UuICBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCB2YWx1ZSBpcworICAgICAgICA8Y29kZT5qYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbTwvY29kZT4uPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic2F2ZU9uUmVzdGFydCIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+U2hvdWxkIGFsbCBzZXNzaW9ucyBiZSBwZXJzaXN0ZWQgYW5kIHJlbG9hZGVkIHdoZW4gVG9tY2F0IGlzIHNodXQKKyAgICAgICAgZG93biBhbmQgcmVzdGFydGVkIChvciB3aGVuIHRoaXMgYXBwbGljYXRpb24gaXMgcmVsb2FkZWQpPyAgQnkgZGVmYXVsdCwKKyAgICAgICAgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+LjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgPC9hdHRyaWJ1dGVzPgorCisgICAgPHA+SW4gb3JkZXIgdG8gc3VjY2Vzc2Z1bGx5IHVzZSBhIFBlcnNpc3RlbnRNYW5hZ2VyLCB5b3UgbXVzdCBuZXN0IGluc2lkZQorICAgIGl0IGEgPHN0cm9uZz4mbHQ7U3RvcmUmZ3Q7PC9zdHJvbmc+IGVsZW1lbnQsIGFzIGRlc2NyaWJlZCBiZWxvdy48L3A+CisKKyAgPC9zdWJzZWN0aW9uPgorCisKKzwvc2VjdGlvbj4KKworCis8c2VjdGlvbiBuYW1lPSJOZXN0ZWQgQ29tcG9uZW50cyI+CisKKyAgPGgzPlN0YW5kYXJkIE1hbmFnZXIgSW1wbGVtZW50YXRpb248L2gzPgorCisgIDxwPklmIHlvdSBhcmUgdXNpbmcgdGhlIDxlbT5TdGFuZGFyZCBNYW5hZ2VyIEltcGxlbWVudGF0aW9uPC9lbT4KKyAgYXMgZGVzY3JpYmVkIGFib3ZlLCBubyBlbGVtZW50cyBtYXkgYmUgbmVzdGVkIGluc2lkZSB5b3VyCisgIDxzdHJvbmc+Jmx0O01hbmFnZXImZ3Q7PC9zdHJvbmc+IGVsZW1lbnQuPC9wPgorCisgIDxoMz5QZXJzaXN0ZW50IE1hbmFnZXIgSW1wbGVtZW50YXRpb248L2gzPgorCisgIDxwPklmIHlvdSBhcmUgdXNpbmcgdGhlIDxlbT5QZXJzaXN0ZW50IE1hbmFnZXIgSW1wbGVtZW50YXRpb248L2VtPgorICBhcyBkZXNjcmliZWQgYWJvdmUsIHlvdSA8c3Ryb25nPk1VU1Q8L3N0cm9uZz4gbmVzdCBhCisgIDxzdHJvbmc+Jmx0O1N0b3JlJmd0Ozwvc3Ryb25nPiBlbGVtZW50IGluc2lkZSwgd2hpY2ggZGVmaW5lcyB0aGUKKyAgY2hhcmFjdGVyaXN0aWNzIG9mIHRoZSBwZXJzaXN0ZW50IGRhdGEgc3RvcmFnZS4gIFR3byBpbXBsZW1lbnRhdGlvbnMKKyAgb2YgdGhlIDxjb2RlPiZsdDtTdG9yZSZndDs8L2NvZGU+IGVsZW1lbnQgYXJlIGN1cnJlbnRseSBhdmFpbGFibGUsCisgIHdpdGggZGlmZmVyZW50IGNoYXJhY3RlcmlzdGljcywgYXMgZGVzY3JpYmVkIGJlbG93bDwvcD4KKworICA8aDU+RmlsZSBCYXNlZCBTdG9yZTwvaDU+CisKKyAgPHA+VGhlIDxlbT5GaWxlIEJhc2VkIFN0b3JlPC9lbT4gaW1wbGVtZW50YXRpb24gc2F2ZXMgc3dhcHBlZCBvdXQKKyAgc2Vzc2lvbnMgaW4gaW5kaXZpZHVhbCBmaWxlcyAobmFtZWQgYmFzZWQgb24gdGhlIHNlc3Npb24gaWRlbnRpZmllcikKKyAgaW4gYSBjb25maWd1cmFibGUgZGlyZWN0b3J5LiAgVGhlcmVmb3JlLCB5b3UgYXJlIGxpa2VseSB0byBlbmNvdW50ZXIKKyAgc2NhbGFiaWxpdHkgcHJvYmxlbXMgYXMgdGhlIG51bWJlciBvZiBhY3RpdmUgc2Vzc2lvbnMgaW5jcmVhc2VzLCBhbmQKKyAgdGhpcyBzaG91bGQgcHJpbWFyaWx5IGJlIGNvbnNpZGVyZWQgYSBtZWFucyB0byBlYXNpbHkgZXhwZXJpbWVudC48L3A+CisKKyAgPHA+VG8gY29uZmlndXJlIHRoaXMsIGFkZCBhIDxjb2RlPiZsdDtTdG9yZSZndDs8L2NvZGU+IG5lc3RlZCBpbnNpZGUKKyAgeW91ciA8Y29kZT4mbHQ7TWFuYWdlciZndDs8L2NvZGU+IGVsZW1lbnQgd2l0aCB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6CisgIDwvcD4KKworICA8YXR0cmlidXRlcz4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2hlY2tJbnRlcnZhbCIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgIDxwPlRoZSBpbnRlcnZhbCAoaW4gc2Vjb25kcykgYmV0d2VlbiBjaGVja3MgZm9yIGV4cGlyZWQgc2Vzc2lvbnMKKyAgICAgIGFtb25nIHRob3NlIHNlc3Npb25zIHRoYXQgYXJlIGN1cnJlbnRseSBzd2FwcGVkIG91dC4gIEJ5IGRlZmF1bHQsCisgICAgICB0aGlzIGludGVydmFsIGlzIHNldCB0byA2MCBzZWNvbmRzIChvbmUgbWludXRlKS48L3A+CisgICAgPC9hdHRyaWJ1dGU+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzTmFtZSIgcmVxdWlyZWQ9InRydWUiPgorICAgICAgPHA+SmF2YSBjbGFzcyBuYW1lIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiB0byB1c2UuICBUaGlzIGNsYXNzIG11c3QKKyAgICAgIGltcGxlbWVudCB0aGUgPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5TdG9yZTwvY29kZT4gaW50ZXJmYWNlLiAgWW91CisgICAgICA8c3Ryb25nPm11c3Q8L3N0cm9uZz4gc3BlY2lmeQorICAgICAgPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5zZXNzaW9uLkZpbGVTdG9yZTwvY29kZT4KKyAgICAgIHRvIHVzZSB0aGlzIGltcGxlbWVudGF0aW9uLjwvcD4KKyAgICA8L2F0dHJpYnV0ZT4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGlyZWN0b3J5IiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgPHA+QWJzb2x1dGUgb3IgcmVsYXRpdmUgKHRvIHRoZSB0ZW1wb3Jhcnkgd29yayBkaXJlY3RvcnkgZm9yIHRoaXMgd2ViCisgICAgICBhcHBsaWNhdGlvbikgcGF0aG5hbWUgb2YgdGhlIGRpcmVjdG9yeSBpbnRvIHdoaWNoIGluZGl2aWR1YWwgc2Vzc2lvbgorICAgICAgZmlsZXMgYXJlIHdyaXR0ZW4uICBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgdGVtcG9yYXJ5IHdvcmsgZGlyZWN0b3J5CisgICAgICBhc3NpZ25lZCBieSB0aGUgY29udGFpbmVyIGlzIHV0aWxpemVkLjwvcD4KKyAgICA8L2F0dHJpYnV0ZT4KKworICA8L2F0dHJpYnV0ZXM+CisKKworICA8aDU+SkRCQyBCYXNlZCBTdG9yZTwvaDU+CisKKyAgPHA+VGhlIDxlbT5KREJDIEJhc2VkIFN0b3JlPC9lbT4gaW1wbGVtZW50YXRpb24gc2F2ZXMgc3dhcHBlZCBvdXQKKyAgc2Vzc2lvbnMgaW4gaW5kaXZpZHVhbCByb3dzIG9mIGEgcHJlY29uZmlndXJlZCB0YWJsZSBpbiBhIGRhdGFiYXNlCisgIHRoYXQgaXMgYWNjZXNzZWQgdmlhIGEgSkRCQyBkcml2ZXIuICBXaXRoIGxhcmdlIG51bWJlcnMgb2Ygc3dhcHBlZCBvdXQKKyAgc2Vzc2lvbnMsIHRoaXMgaW1wbGVtZW50YXRpb24gd2lsbCBleGhpYml0IGltcHJvdmVkIHBlcmZvcm1hbmNlIG92ZXIKKyAgdGhlIEZpbGUgQmFzZWQgU3RvcmUgZGVzY3JpYmVkIGFib3ZlLjwvcD4KKworICA8cD5UbyBjb25maWd1cmUgdGhpcywgYWRkIGEgPGNvZGU+Jmx0O1N0b3JlJmd0OzwvY29kZT4gbmVzdGVkIGluc2lkZQorICB5b3VyIDxjb2RlPiZsdDtNYW5hZ2VyJmd0OzwvY29kZT4gZWxlbWVudCB3aXRoIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczoKKyAgPC9wPgorCisgIDxhdHRyaWJ1dGVzPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJjaGVja0ludGVydmFsIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgPHA+VGhlIGludGVydmFsIChpbiBzZWNvbmRzKSBiZXR3ZWVuIGNoZWNrcyBmb3IgZXhwaXJlZCBzZXNzaW9ucworICAgICAgYW1vbmcgdGhvc2Ugc2Vzc2lvbnMgdGhhdCBhcmUgY3VycmVudGx5IHN3YXBwZWQgb3V0LiAgQnkgZGVmYXVsdCwKKyAgICAgIHRoaXMgaW50ZXJ2YWwgaXMgc2V0IHRvIDYwIHNlY29uZHMgKG9uZSBtaW51dGUpLjwvcD4KKyAgICA8L2F0dHJpYnV0ZT4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NOYW1lIiByZXF1aXJlZD0idHJ1ZSI+CisgICAgICA8cD5KYXZhIGNsYXNzIG5hbWUgb2YgdGhlIGltcGxlbWVudGF0aW9uIHRvIHVzZS4gIFRoaXMgY2xhc3MgbXVzdAorICAgICAgaW1wbGVtZW50IHRoZSA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLlN0b3JlPC9jb2RlPiBpbnRlcmZhY2UuICBZb3UKKyAgICAgIDxzdHJvbmc+bXVzdDwvc3Ryb25nPiBzcGVjaWZ5CisgICAgICA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLnNlc3Npb24uSkRCQ1N0b3JlPC9jb2RlPgorICAgICAgdG8gdXNlIHRoaXMgaW1wbGVtZW50YXRpb24uPC9wPgorICAgIDwvYXR0cmlidXRlPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb25uZWN0aW9uVVJMIiByZXF1aXJlZD0idHJ1ZSI+CisgICAgICA8cD5UaGUgY29ubmVjdGlvbiBVUkwgdGhhdCB3aWxsIGJlIGhhbmRlZCB0byB0aGUgY29uZmlndXJlZCBKREJDCisgICAgICBkcml2ZXIgdG8gZXN0YWJsaXNoIGEgY29ubmVjdGlvbiB0byB0aGUgZGF0YWJhc2UgY29udGFpbmluZyBvdXIKKyAgICAgIHNlc3Npb24gdGFibGUuPC9wPgorICAgIDwvYXR0cmlidXRlPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJkcml2ZXJOYW1lIiByZXF1aXJlZD0idHJ1ZSI+CisgICAgICA8cD5KYXZhIGNsYXNzIG5hbWUgb2YgdGhlIEpEQkMgZHJpdmVyIHRvIGJlIHVzZWQuPC9wPgorICAgIDwvYXR0cmlidXRlPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJzZXNzaW9uQXBwQ29sIiByZXF1aXJlZD0idHJ1ZSI+CisgICAgICA8cD5OYW1lIG9mIHRoZSBkYXRhYmFzZSBjb2x1bW4sIGNvbnRhaW5lZCBpbiB0aGUgc3BlY2lmaWVkIHNlc3Npb24KKyAgICAgIHRhYmxlLCB0aGF0IGNvbnRhaW5zIHRoZSBFbmdpbmUsIEhvc3QsIGFuZCBXZWIgQXBwbGljYXRpb24gQ29udGV4dAorICAgICAgbmFtZSBpbiB0aGUgZm9ybWF0IDxjb2RlPi9FbmdpbmUvSG9zdC9Db250ZXh0PC9jb2RlPi48L3A+CisgICAgPC9hdHRyaWJ1dGU+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9InNlc3Npb25EYXRhQ29sIiByZXF1aXJlZD0idHJ1ZSI+CisgICAgICA8cD5OYW1lIG9mIHRoZSBkYXRhYmFzZSBjb2x1bW4sIGNvbnRhaW5lZCBpbiB0aGUgc3BlY2lmaWVkCisgICAgICBzZXNzaW9uIHRhYmxlLCB0aGF0IGNvbnRhaW5zIHRoZSBzZXJpYWxpemVkIGZvcm0gb2YgYWxsIHNlc3Npb24KKyAgICAgIGF0dHJpYnV0ZXMgZm9yIGEgc3dhcHBlZCBvdXQgc2Vzc2lvbi4gIFRoZSBjb2x1bW4gdHlwZSBtdXN0IGFjY2VwdAorICAgICAgYSBiaW5hcnkgb2JqZWN0ICh0eXBpY2FsbHkgY2FsbGVkIGEgQkxPQikuPC9wPgorICAgIDwvYXR0cmlidXRlPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJzZXNzaW9uSWRDb2wiIHJlcXVpcmVkPSJ0cnVlIj4KKyAgICAgIDxwPk5hbWUgb2YgdGhlIGRhdGFiYXNlIGNvbHVtbiwgY29udGFpbmVkIGluIHRoZSBzcGVjaWZpZWQKKyAgICAgIHNlc3Npb24gdGFibGUsIHRoYXQgY29udGFpbnMgdGhlIHNlc3Npb24gaWRlbnRpZmllciBvZiB0aGUKKyAgICAgIHN3YXBwZWQgb3V0IHNlc3Npb24uICBUaGUgY29sdW1uIHR5cGUgbXVzdCBhY2NlcHQgY2hhcmFjdGVyCisgICAgICBzdHJpbmcgZGF0YSBvZiBhdCBsZWFzdCBhcyBtYW55IGNoYXJhY3RlcnMgYXMgYXJlIGNvbnRhaW5lZAorICAgICAgaW4gc2Vzc2lvbiBpZGVudGlmaWVycyBjcmVhdGVkIGJ5IFRvbWNhdCAodHlwaWNhbGx5IDMyKS48L3A+CisgICAgPC9hdHRyaWJ1dGU+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9InNlc3Npb25MYXN0QWNjZXNzZWRDb2wiIHJlcXVpcmVkPSJ0cnVlIj4KKyAgICAgIDxwPk5hbWUgb2YgdGhlIGRhdGFiYXNlIGNvbHVtbiwgY29udGFpbmVkIGluIHRoZSBzcGVjaWZpZWQKKyAgICAgIHNlc3Npb24gdGFibGUsIHRoYXQgY29udGFpbnMgdGhlIDxjb2RlPmxhc3RBY2Nlc3NlZFRpbWU8L2NvZGU+CisgICAgICBwcm9wZXJ0eSBvZiB0aGlzIHNlc3Npb24uICBUaGUgY29sdW1uIHR5cGUgbXVzdCBhY2NlcHQgYQorICAgICAgSmF2YSA8Y29kZT5sb25nPC9jb2RlPiAoNjQgYml0cykuPC9wPgorICAgIDwvYXR0cmlidXRlPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJzZXNzaW9uTWF4SW5hY3RpdmVDb2wiIHJlcXVpcmVkPSJ0cnVlIj4KKyAgICAgIDxwPk5hbWUgb2YgdGhlIGRhdGFiYXNlIGNvbHVtbiwgY29udGFpbmVkIGluIHRoZSBzcGVjaWZpZWQKKyAgICAgIHNlc3Npb24gdGFibGUsIHRoYXQgY29udGFpbnMgdGhlIDxjb2RlPm1heEluYWN0aXZlSW50ZXJ2YWw8L2NvZGU+CisgICAgICBwcm9wZXJ0eSBvZiB0aGlzIHNlc3Npb24uICBUaGUgY29sdW1uIHR5cGUgbXVzdCBhY2NlcHQgYQorICAgICAgSmF2YSA8Y29kZT5pbnRlZ2VyPC9jb2RlPiAoMzIgYml0cykuPC9wPgorICAgIDwvYXR0cmlidXRlPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJzZXNzaW9uVGFibGUiIHJlcXVpcmVkPSJ0cnVlIj4KKyAgICAgIDxwPk5hbWUgb2YgdGhlIGRhdGFiYXNlIHRhYmxlIHRvIGJlIHVzZWQgZm9yIHN0b3Jpbmcgc3dhcHBlZCBvdXQKKyAgICAgIHNlc3Npb25zLiAgVGhpcyB0YWJsZSBtdXN0IGNvbnRhaW4gKGF0IGxlYXN0KSB0aGUgZGF0YWJhc2UgY29sdW1ucworICAgICAgdGhhdCBhcmUgY29uZmlndXJlZCBieSB0aGUgb3RoZXIgYXR0cmlidXRlcyBvZiB0aGlzIGVsZW1lbnQuPC9wPgorICAgIDwvYXR0cmlidXRlPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJzZXNzaW9uVmFsaWRDb2wiIHJlcXVpcmVkPSJ0cnVlIj4KKyAgICAgIDxwPk5hbWUgb2YgdGhlIGRhdGFiYXNlIGNvbHVtbiwgY29udGFpbmVkIGluIHRoZSBzcGVjaWZpZWQKKyAgICAgIHNlc3Npb24gdGFibGUsIHRoYXQgY29udGFpbnMgYSBmbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGlzCisgICAgICBzd2FwcGVkIG91dCBzZXNzaW9uIGlzIHN0aWxsIHZhbGlkIG9yIG5vdC4gIFRoZSBjb2x1bW4gdHlwZQorICAgICAgbXVzdCBhY2NlcHQgYSBzaW5nbGUgY2hhcmFjdGVyLjwvcD4KKyAgICA8L2F0dHJpYnV0ZT4KKworICA8L2F0dHJpYnV0ZXM+CisKKyAgPHA+QmVmb3JlIGF0dGVtcHRpbmcgdG8gdXNlIHRoZSBKREJDIEJhc2VkIFN0b3JlIGZvciB0aGUgZmlyc3QgdGltZSwKKyAgeW91IG11c3QgY3JlYXRlIHRoZSB0YWJsZSB0aGF0IHdpbGwgYmUgdXNlZCB0byBzdG9yZSBzd2FwcGVkIG91dCBzZXNzaW9ucy4KKyAgRGV0YWlsZWQgU1FMIGNvbW1hbmRzIHZhcnkgZGVwZW5kaW5nIG9uIHRoZSBkYXRhYmFzZSB5b3UgYXJlIHVzaW5nLCBidXQKKyAgYSBzY3JpcHQgbGlrZSB0aGlzIHdpbGwgZ2VuZXJhbGx5IGJlIHJlcXVpcmVkOjwvcD4KKworPHNvdXJjZT4KK2NyZWF0ZSB0YWJsZSB0b21jYXRfc2Vzc2lvbnMgKAorICBzZXNzaW9uX2lkICAgICB2YXJjaGFyKDEwMCkgbm90IG51bGwgcHJpbWFyeSBrZXksCisgIHZhbGlkX3Nlc3Npb24gIGNoYXIoMSkgbm90IG51bGwsCisgIG1heF9pbmFjdGl2ZSAgIGludCBub3QgbnVsbCwKKyAgbGFzdF9hY2Nlc3MgICAgYmlnaW50IG5vdCBudWxsLAorICBhcHBfbmFtZSAgICAgICB2YXJjaGFyKDI1NSksCisgIHNlc3Npb25fZGF0YSAgIG1lZGl1bWJsb2IsCisgIEtFWSBrYXBwX25hbWUoYXBwX25hbWUpCispOworPC9zb3VyY2U+CisKKyAgPHA+SW4gb3JkZXIgZm9yIHRoZSBKREJDIEJhc2VkIFN0b3JlIHRvIHN1Y2Nlc3NmdWxseSBjb25uZWN0IHRvIHlvdXIKKyAgZGF0YWJhc2UsIHRoZSBKREJDIGRyaXZlciB5b3UgY29uZmlndXJlIG11c3QgYmUgdmlzaWJsZSB0byBUb21jYXQncworICBpbnRlcm5hbCBjbGFzcyBsb2FkZXIuICBHZW5lcmFsbHksIHRoYXQgbWVhbnMgeW91IG11c3QgcGxhY2UgdGhlIEpBUgorICBmaWxlIGNvbnRhaW5pbmcgdGhpcyBkcml2ZXIgaW50byB0aGUgPGNvZGU+JENBVEFMSU5BX0hPTUUvc2VydmVyL2xpYjwvY29kZT4KKyAgZGlyZWN0b3J5IChpZiB5b3VyIGFwcGxpY2F0aW9ucyBkbyBub3QgYWxzbyBuZWVkIGl0KSBvciBpbnRvIHRoZQorICA8Y29kZT4kQ0FUQUxJTkFfSE9NRS9jb21tb24vbGliPC9jb2RlPiBkaXJlY3RvcnkgKGlmIHlvdSB3aXNoIHRvIHNoYXJlCisgIHRoaXMgZHJpdmVyIHdpdGggeW91ciB3ZWIgYXBwbGljYXRpb25zLjwvcD4KKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IlNwZWNpYWwgRmVhdHVyZXMiPgorCisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iUmVzdGFydCBQZXJzaXN0ZW5jZSI+CisKKyAgICA8cD5XaGVudmVyIENhdGFsaW5hIGlzIHNodXQgZG93biBub3JtYWxseSBhbmQgcmVzdGFydGVkLCBvciB3aGVuIGFuCisgICAgYXBwbGljYXRpb24gcmVsb2FkIGlzIHRyaWdnZXJlZCwgdGhlIHN0YW5kYXJkIE1hbmFnZXIgaW1wbGVtZW50YXRpb24KKyAgICB3aWxsIGF0dGVtcHQgdG8gc2VyaWFsaXplIGFsbCBjdXJyZW50bHkgYWN0aXZlIHNlc3Npb25zIHRvIGEgZGlzaworICAgIGZpbGUgbG9jYXRlZCB2aWEgdGhlIDxjb2RlPnBhdGhuYW1lPC9jb2RlPiBhdHRyaWJ1dGUuICBBbGwgc3VjaCBzYXZlZAorICAgIHNlc3Npb25zIHdpbGwgdGhlbiBiZSBkZXNlcmlhbGl6ZWQgYW5kIGFjdGl2YXRlZCAoYXNzdW1pbmcgdGhleSBoYXZlCisgICAgbm90IGV4cGlyZWQgaW4gdGhlIG1lYW4gdGltZSkgd2hlbiB0aGUgYXBwbGljYXRpb24gcmVsb2FkIGlzIGNvbXBsZXRlZC48L3A+CisKKyAgICA8cD5JbiBvcmRlciB0byBzdWNjZXNzZnVsbHkgcmVzdG9yZSB0aGUgc3RhdGUgb2Ygc2Vzc2lvbiBhdHRyaWJ1dGVzLAorICAgIGFsbCBzdWNoIGF0dHJpYnV0ZXMgTVVTVCBpbXBsZW1lbnQgdGhlIDxjb2RlPmphdmEuaW8uU2VyaWFsaXphYmxlPC9jb2RlPgorICAgIGludGVyZmFjZS4gIFlvdSBNQVkgY2F1c2UgdGhlIE1hbmFnZXIgdG8gZW5mb3JjZSB0aGlzIHJlc3RyaWN0aW9uIGJ5CisgICAgaW5jbHVkaW5nIHRoZSA8Y29kZT4mbHQ7ZGlzdHJpYnV0YWJsZSZndDs8L2NvZGU+IGVsZW1lbnQgaW4geW91ciB3ZWIKKyAgICBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IgKDxjb2RlPi9XRUItSU5GL3dlYi54bWw8L2NvZGU+KS48L3A+CisKKyAgPC9zdWJzZWN0aW9uPgorCis8L3NlY3Rpb24+CisKKworPC9ib2R5PgorCisKKzwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9kb2NzL2NvbmZpZy9wcm9qZWN0LnhtbCBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvY29uZmlnL3Byb2plY3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkM2M1OGYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2NvbmZpZy9wcm9qZWN0LnhtbApAQCAtMCwwICsxLDQ2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Cis8cHJvamVjdCBuYW1lPSJTZXJ2ZXIgQ29uZmlndXJhdGlvbiBSZWZlcmVuY2UiCisgICAgICAgIGhyZWY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvdG9tY2F0LyI+CisKKyAgPHRpdGxlPlNlcnZlciBDb25maWd1cmF0aW9uIFJlZmVyZW5jZTwvdGl0bGU+CisKKyAgPGxvZ28gaHJlZj0iL2ltYWdlcy90b21jYXQuZ2lmIj4KKyAgICBUaGUgVG9tY2F0IFNlcnZsZXQvSlNQIENvbnRhaW5lcgorICA8L2xvZ28+CisKKyAgICAKKyAgPGJvZHk+CisKKyAgICA8bWVudSBuYW1lPSJMaW5rcyI+CisgICAgICAgIDxpdGVtIG5hbWU9IkRvY3MgSG9tZSIgICAgICAgICAgICAgaHJlZj0iLi4vaW5kZXguaHRtbCIvPgorICAgICAgICA8aXRlbSBuYW1lPSJDb25maWcgUmVmLiBIb21lIiAgICAgIGhyZWY9ImluZGV4Lmh0bWwiLz4KKyAgICA8L21lbnU+CisKKyAgICA8bWVudSBuYW1lPSJUb3AgTGV2ZWwgRWxlbWVudHMiPgorICAgICAgICA8aXRlbSBuYW1lPSJTZXJ2ZXIiICAgICAgICAgICAgICAgIGhyZWY9InNlcnZlci5odG1sIi8+CisgICAgICAgIDxpdGVtIG5hbWU9IlNlcnZpY2UiICAgICAgICAgICAgICAgaHJlZj0ic2VydmljZS5odG1sIi8+CisgICAgPC9tZW51PgorCisgICAgPG1lbnUgbmFtZT0iQ29ubmVjdG9ycyI+CisgICAgICAgIDxpdGVtIG5hbWU9IkhUVFAiICAgICAgICAgICAgICAgICAgaHJlZj0iaHR0cC5odG1sIi8+CisgICAgICAgIDxpdGVtIG5hbWU9IkFKUCIgICAgICAgICAgICAgICAgICAgaHJlZj0iYWpwLmh0bWwiLz4KKyAgICA8L21lbnU+CisKKyAgICA8bWVudSBuYW1lPSJDb250YWluZXJzIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iQ29udGV4dCIgICAgICAgICAgICAgICBocmVmPSJjb250ZXh0Lmh0bWwiLz4KKyAgICAgICAgPGl0ZW0gbmFtZT0iRW5naW5lIiAgICAgICAgICAgICAgICBocmVmPSJlbmdpbmUuaHRtbCIvPgorICAgICAgICA8aXRlbSBuYW1lPSJIb3N0IiAgICAgICAgICAgICAgICAgIGhyZWY9Imhvc3QuaHRtbCIvPgorICAgIDwvbWVudT4KKworICAgIDxtZW51IG5hbWU9Ik5lc3RlZCBDb21wb25lbnRzIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iR2xvYmFsIFJlc291cmNlcyIgICAgICBocmVmPSJnbG9iYWxyZXNvdXJjZXMuaHRtbCIvPgorICAgICAgICA8aXRlbSBuYW1lPSJMb2FkZXIiICAgICAgICAgICAgICAgIGhyZWY9ImxvYWRlci5odG1sIi8+CisgICAgICAgIDxpdGVtIG5hbWU9Ik1hbmFnZXIiICAgICAgICAgICAgICAgaHJlZj0ibWFuYWdlci5odG1sIi8+IAorICAgICAgICA8aXRlbSBuYW1lPSJSZWFsbSIgICAgICAgICAgICAgICAgIGhyZWY9InJlYWxtLmh0bWwiLz4KKyAgICAgICAgPGl0ZW0gbmFtZT0iUmVzb3VyY2VzIiAgICAgICAgICAgICBocmVmPSJyZXNvdXJjZXMuaHRtbCIvPgorICAgICAgICA8aXRlbSBuYW1lPSJWYWx2ZSIgICAgICAgICAgICAgICAgIGhyZWY9InZhbHZlLmh0bWwiLz4KKyAgICA8L21lbnU+CisKKyAgPC9ib2R5PgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9kb2NzL2NvbmZpZy9yZWFsbS54bWwgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2NvbmZpZy9yZWFsbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzUwNTIzNAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvY29uZmlnL3JlYWxtLnhtbApAQCAtMCwwICsxLDQ4MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IURPQ1RZUEUgZG9jdW1lbnQgWworICA8IUVOVElUWSBwcm9qZWN0IFNZU1RFTSAicHJvamVjdC54bWwiPgorXT4KKzxkb2N1bWVudCB1cmw9InJlYWxtLmh0bWwiPgorCisgICZwcm9qZWN0OworCisgIDxwcm9wZXJ0aWVzPgorICAgIDxhdXRob3IgZW1haWw9ImNyYWlnbWNjQGFwYWNoZS5vcmciPkNyYWlnIFIuIE1jQ2xhbmFoYW48L2F1dGhvcj4KKyAgICA8dGl0bGU+VGhlIFJlYWxtIENvbXBvbmVudDwvdGl0bGU+CisgIDwvcHJvcGVydGllcz4KKworPGJvZHk+CisKKworPHNlY3Rpb24gbmFtZT0iSW50cm9kdWN0aW9uIj4KKworICA8cD5BIDxzdHJvbmc+UmVhbG08L3N0cm9uZz4gZWxlbWVudCByZXByZXNlbnRzIGEgImRhdGFiYXNlIiBvZiB1c2VybmFtZXMsCisgIHBhc3N3b3JkcywgYW5kIDxlbT5yb2xlczwvZW0+IChzaW1pbGFyIHRvIFVuaXggPGVtPmdyb3VwczwvZW0+KSBhc3NpZ25lZAorICB0byB0aG9zZSB1c2Vycy4gIERpZmZlcmVudCBpbXBsZW1lbnRhdGlvbnMgb2YgUmVhbG0gYWxsb3cgQ2F0YWxpbmEgdG8gYmUKKyAgaW50ZWdyYXRlZCBpbnRvIGVudmlyb25tZW50cyB3aGVyZSBzdWNoIGF1dGhlbnRpY2F0aW9uIGluZm9ybWF0aW9uIGlzIGFscmVhZHkKKyAgYmVpbmcgY3JlYXRlZCBhbmQgbWFpbnRhaW5lZCwgYW5kIHRoZW4gdXRpbGl6ZSB0aGF0IGluZm9ybWF0aW9uIHRvIGltcGxlbWVudAorICA8ZW0+Q29udGFpbmVyIE1hbmFnZWQgU2VjdXJpdHk8L2VtPiBhcyBkZXNjcmliZWQgaW4gdGhlIFNlcnZsZXQKKyAgU3BlY2lmaWNhdGlvbi48L3A+CisKKyAgPHA+WW91IG1heSBuZXN0IGEgUmVhbG0gaW5zaWRlIGFueSBDYXRhbGluYSBjb250YWluZXIKKyAgPGEgaHJlZj0iZW5naW5lLmh0bWwiPkVuZ2luZTwvYT4sIDxhIGhyZWY9Imhvc3QuaHRtbCI+SG9zdDwvYT4sIG9yCisgIDxhIGhyZWY9ImNvbnRleHQuaHRtbCI+Q29udGV4dDwvYT4pLiAgSW4gYWRkaXRpb24sIFJlYWxtcyBhc3NvY2lhdGVkIHdpdGgKKyAgYW4gRW5naW5lIG9yIGEgSG9zdCBhcmUgYXV0b21hdGljYWxseSBpbmhlcml0ZWQgYnkgbG93ZXItbGV2ZWwKKyAgY29udGFpbmVycywgdW5sZXNzIGV4cGxpY2l0bHkgb3ZlcnJpZGRlbi48L3A+CisKKyAgPHA+Rm9yIG1vcmUgaW4tZGVwdGggaW5mb3JtYXRpb24gYWJvdXQgY29udGFpbmVyIG1hbmFnZWQgc2VjdXJpdHkgaW4gd2ViCisgIGFwcGxpY2F0aW9ucywgc2VlIDxzdHJvbmc+RklYTUUgLSBsaW5rIHRvICJDb250YWluZXIgTWFuYWdlZCBTZWN1cml0eSBHdWlkZSIKKyAgaW4gdGhlIGFwcGxpY2F0aW9uIGRldmVsb3BlcidzIHNlY3Rpb248L3N0cm9uZz4uICBGb3IgbW9yZSBpbi1kZXB0aAorICBpbmZvcm1hdGlvbiBhYm91dCBjb25maWd1aW5nIGFuZCB1c2luZyB0aGUgc3RhbmRhcmQgUmVhbG0gY29tcG9uZW50CisgIGltcGxlbWVudGF0aW9ucywgc2VlIDxzdHJvbmc+RklYTUUgLSBsaW5rIHRvICJSZWFsbSBDb25maWd1cmF0aW9uIEhPVy1UTyIKKyAgaW4gdGhlIGFkbWluaXN0cmF0b3IncyBzZWN0aW9uPC9zdHJvbmc+LjwvcD4KKworICAgIDxibG9ja3F1b3RlPjxlbT4KKyAgICA8cD5UaGUgZGVzY3JpcHRpb24gYmVsb3cgdXNlcyB0aGUgdmFyaWFibGUgbmFtZSAkQ0FUQUxJTkFfSE9NRQorICAgIHRvIHJlZmVyIHRvIHRoZSBkaXJlY3RvcnkgaW50byB3aGljaCB5b3UgaGF2ZSBpbnN0YWxsZWQgVG9tY2F0IDUsCisgICAgYW5kIGlzIHRoZSBiYXNlIGRpcmVjdG9yeSBhZ2FpbnN0IHdoaWNoIG1vc3QgcmVsYXRpdmUgcGF0aHMgYXJlCisgICAgcmVzb2x2ZWQuICBIb3dldmVyLCBpZiB5b3UgaGF2ZSBjb25maWd1cmVkIFRvbWNhdCA1IGZvciBtdWx0aXBsZQorICAgIGluc3RhbmNlcyBieSBzZXR0aW5nIGEgQ0FUQUxJTkFfQkFTRSBkaXJlY3RvcnksIHlvdSBzaG91bGQgdXNlCisgICAgJENBVEFMSU5BX0JBU0UgaW5zdGVhZCBvZiAkQ0FUQUxJTkFfSE9NRSBmb3IgZWFjaCBvZiB0aGVzZQorICAgIHJlZmVyZW5jZXMuPC9wPgorICAgIDwvZW0+PC9ibG9ja3F1b3RlPgorCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iQXR0cmlidXRlcyI+CisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iQ29tbW9uIEF0dHJpYnV0ZXMiPgorCisgICAgPHA+QWxsIGltcGxlbWVudGF0aW9ucyBvZiA8c3Ryb25nPlJlYWxtPC9zdHJvbmc+CisgICAgc3VwcG9ydCB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6PC9wPgorCisgICAgPGF0dHJpYnV0ZXM+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NOYW1lIiByZXF1aXJlZD0idHJ1ZSI+CisgICAgICAgIDxwPkphdmEgY2xhc3MgbmFtZSBvZiB0aGUgaW1wbGVtZW50YXRpb24gdG8gdXNlLiAgVGhpcyBjbGFzcyBtdXN0CisgICAgICAgIGltcGxlbWVudCB0aGUgPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5SZWFsbTwvY29kZT4gaW50ZXJmYWNlLjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgPC9hdHRyaWJ1dGVzPgorCisgIDwvc3Vic2VjdGlvbj4KKworCisgIDxzdWJzZWN0aW9uIG5hbWU9IlN0YW5kYXJkIEltcGxlbWVudGF0aW9uIj4KKworICAgIDxwPlVubGlrZSBtb3N0IENhdGFsaW5hIGNvbXBvbmVudHMsIHRoZXJlIGFyZSBzZXZlcmFsIHN0YW5kYXJkCisgICAgPHN0cm9uZz5SZWFsbTwvc3Ryb25nPiBpbXBsZW1lbnRhdGlvbnMgYXZhaWxhYmxlLiAgQXMgYSByZXN1bHQsCisgICAgdGhlIDxjb2RlPmNsYXNzTmFtZTwvY29kZT4gYXR0cmlidXRlIE1VU1QgYmUgdXNlZCB0byBzZWxlY3QgdGhlCisgICAgaW1wbGVtZW50YXRpb24geW91IHdpc2ggdG8gdXNlLjwvcD4KKworICAgIDxoMz5KREJDIERhdGFiYXNlIFJlYWxtIChvcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtLkpEQkNSZWFsbSk8L2gzPgorCisgICAgPHA+VGhlIDxzdHJvbmc+SkRCQyBEYXRhYmFzZSBSZWFsbTwvc3Ryb25nPiBjb25uZWN0cyBDYXRhbGluYSB0bworICAgIGEgcmVsYXRpb25hbCBkYXRhYmFzZSwgYWNjZXNzZWQgdGhyb3VnaCBhbiBhcHByb3ByaWF0ZSBKREJDIGRyaXZlciwKKyAgICB0byBwZXJmb3JtIGxvb2t1cHMgb2YgdXNlcm5hbWVzLCBwYXNzd29yZHMsIGFuZCB0aGVpciBhc3NvY2lhdGVkCisgICAgcm9sZXMuICBCZWNhdXNlIHRoZSBsb29rdXAgaXMgZG9uZSBlYWNoIHRpbWUgdGhhdCBpdCBpcyByZXF1aXJlZCwKKyAgICBjaGFuZ2VzIHRvIHRoZSBkYXRhYmFzZSB3aWxsIGJlIGltbWVkaWF0ZWx5IHJlZmxlY3RlZCBpbiB0aGUKKyAgICBpbmZvcm1hdGlvbiB1c2VkIHRvIGF1dGhlbnRpY2F0ZSBuZXcgbG9naW5zLjwvcD4KKworICAgIDxwPkEgcmljaCBzZXQgb2YgYWRkaXRpb25hbCBhdHRyaWJ1dGVzIGxldHMgeW91IGNvbmZpZ3VyZSB0aGUgcmVxdWlyZWQKKyAgICBjb25uZWN0aW9uIHRvIHRoZSB1bmRlcmx5aW5nIGRhdGFiYXNlLCBhcyB3ZWxsIGFzIHRoZSB0YWJsZSBhbmQKKyAgICBjb2x1bW4gbmFtZXMgdXNlZCB0byByZXRyaWV2ZSB0aGUgcmVxdWlyZWQgaW5mb3JtYXRpb246PC9wPgorCisgICAgPGF0dHJpYnV0ZXM+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29ubmVjdGlvbk5hbWUiIHJlcXVpcmVkPSJ0cnVlIj4KKyAgICAgICAgPHA+VGhlIGRhdGFiYXNlIHVzZXJuYW1lIHRvIHVzZSB3aGVuIGVzdGFibGlzaGluZyB0aGUgSkRCQworICAgICAgICBjb25uZWN0aW9uLjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNvbm5lY3Rpb25QYXNzd29yZCIgcmVxdWlyZWQ9InRydWUiPgorICAgICAgICA8cD5UaGUgZGF0YWJhc2UgcGFzc3dvcmQgdG8gdXNlIHdoZW4gZXN0YWJsaXNoaW5nIHRoZSBKREJDCisgICAgICAgIGNvbm5lY3Rpb24uPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29ubmVjdGlvblVSTCIgcmVxdWlyZWQ9InRydWUiPgorICAgICAgICA8cD5UaGUgY29ubmVjdGlvbiBVUkwgdG8gYmUgcGFzc2VkIHRvIHRoZSBKREJDIGRyaXZlciB3aGVuCisgICAgICAgIGVzdGFibGlzaGluZyBhIGRhdGFiYXNlIGNvbm5lY3Rpb24uPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGlnZXN0IiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgICA8cD5UaGUgbmFtZSBvZiB0aGUgPGNvZGU+TWVzc2FnZURpZ2VzdDwvY29kZT4gYWxnb3JpdGhtIHVzZWQKKyAgICAgICAgdG8gZW5jb2RlIHVzZXIgcGFzc3dvcmRzIHN0b3JlZCBpbiB0aGUgZGF0YWJhc2UuICBJZiBub3Qgc3BlY2lmaWVkLAorICAgICAgICB1c2VyIHBhc3N3b3JkcyBhcmUgYXNzdW1lZCB0byBiZSBzdG9yZWQgaW4gY2xlYXItdGV4dC48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkcml2ZXJOYW1lIiByZXF1aXJlZD0idHJ1ZSI+CisgICAgICAgIDxwPkZ1bGx5IHF1YWxpZmllZCBKYXZhIGNsYXNzIG5hbWUgb2YgdGhlIEpEQkMgZHJpdmVyIHRvIGJlCisgICAgICAgIHVzZWQgdG8gY29ubmVjdCB0byB0aGUgYXV0aGVudGljYXRpb24gZGF0YWJhc2UuPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icm9sZU5hbWVDb2wiIHJlcXVpcmVkPSJ0cnVlIj4KKyAgICAgICAgPHA+TmFtZSBvZiB0aGUgY29sdW1uLCBpbiB0aGUgInVzZXIgcm9sZXMiIHRhYmxlLCB3aGljaCBjb250YWlucworICAgICAgICBhIHJvbGUgbmFtZSBhc3NpZ25lZCB0byB0aGUgY29ycmVzcG9uZGluZyB1c2VyLjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9InVzZXJDcmVkQ29sIiByZXF1aXJlZD0idHJ1ZSI+CisgICAgICAgIDxwPk5hbWUgb2YgdGhlIGNvbHVtbiwgaW4gdGhlICJ1c2VycyIgdGFibGUsIHdoaWNoIGNvbnRhaW5zCisgICAgICAgIHRoZSB1c2VyJ3MgY3JlZGVudGlhbHMgKGkuZS4gcGFzc3dvcmQoLiAgSWYgYSB2YWx1ZSBmb3IgdGhlCisgICAgICAgIDxjb2RlPmRpZ2VzdDwvY29kZT4gYXR0cmlidXRlIGlzIHNwZWNpZmllZCwgdGhpcyBjb21wb25lbnQKKyAgICAgICAgd2lsbCBhc3N1bWUgdGhhdCB0aGUgcGFzc3dvcmRzIGhhdmUgYmVlbiBlbmNvZGVkIHdpdGggdGhlCisgICAgICAgIHNwZWNpZmllZCBhbGdvcml0aG0uICBPdGhlcndpc2UsIHRoZXkgd2lsbCBiZSBhc3N1bWVkIHRvIGJlCisgICAgICAgIGluIGNsZWFyIHRleHQuPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idXNlck5hbWVDb2wiIHJlcXVpcmVkPSJ0cnVlIj4KKyAgICAgICAgPHA+TmFtZSBvZiB0aGUgY29sdW1uLCBpbiB0aGUgInVzZXJzIiBhbmQgInVzZXIgcm9sZXMiIHRhYmxlLAorICAgICAgICB0aGF0IGNvbnRhaW5zIHRoZSB1c2VyJ3MgdXNlcm5hbWUuPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idXNlclJvbGVUYWJsZSIgcmVxdWlyZWQ9InRydWUiPgorICAgICAgICA8cD5OYW1lIG9mIHRoZSAidXNlciByb2xlcyIgdGFibGUsIHdoaWNoIG11c3QgY29udGFpbiBjb2x1bW5zCisgICAgICAgIG5hbWVkIGJ5IHRoZSA8Y29kZT51c2VyTmFtZUNvbDwvY29kZT4gYW5kIDxjb2RlPnJvbGVOYW1lQ29sPC9jb2RlPgorICAgICAgICBhdHRyaWJ1dGVzLjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9InVzZXJUYWJsZSIgcmVxdWlyZWQ9InRydWUiPgorICAgICAgICA8cD5OYW1lIG9mIHRoZSAidXNlcnMiIHRhYmxlLCB3aGljaCBtdXN0IGNvbnRhaW4gY29sdW1ucyBuYW1lZAorICAgICAgICBieSB0aGUgPGNvZGU+dXNlck5hbWVDb2w8L2NvZGU+IGFuZCA8Y29kZT51c2VyQ3JlZENvbDwvY29kZT4KKyAgICAgICAgYXR0cmlidXRlcy48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgIDwvYXR0cmlidXRlcz4KKworICAgIDxwPlNlZSA8c3Ryb25nPkZJWE1FIC0gTmVzdGVkIHBvaW50ZXIgaW50byBIT1ctVE88L3N0cm9uZz4gZm9yIG1vcmUKKyAgICBpbmZvcm1hdGlvbiBvbiBzZXR0aW5nIHVwIGNvbnRhaW5lciBtYW5hZ2VkIHNlY3VyaXR5IHVzaW5nIHRoZQorICAgIEpEQkMgRGF0YWJhc2UgUmVhbG0gY29tcG9uZW50LjwvcD4KKworCisgICAgPGgzPgorICAgICAgRGF0YVNvdXJjZSBEYXRhYmFzZSBSZWFsbSAob3JnLmFwYWNoZS5jYXRhbGluYS5yZWFsbS5EYXRhU291cmNlUmVhbG0pCisgICAgPC9oMz4KKworICAgIDxwPlRoZSA8c3Ryb25nPkRhdGFTb3VyY2UgRGF0YWJhc2UgUmVhbG08L3N0cm9uZz4gY29ubmVjdHMgQ2F0YWxpbmEgdG8KKyAgICBhIHJlbGF0aW9uYWwgZGF0YWJhc2UsIGFjY2Vzc2VkIHRocm91Z2ggYSBKTkRJIG5hbWVkIEpEQkMgRGF0YVNvdXJjZQorICAgIHRvIHBlcmZvcm0gbG9va3VwcyBvZiB1c2VybmFtZXMsIHBhc3N3b3JkcywgYW5kIHRoZWlyIGFzc29jaWF0ZWQKKyAgICByb2xlcy4gIEJlY2F1c2UgdGhlIGxvb2t1cCBpcyBkb25lIGVhY2ggdGltZSB0aGF0IGl0IGlzIHJlcXVpcmVkLAorICAgIGNoYW5nZXMgdG8gdGhlIGRhdGFiYXNlIHdpbGwgYmUgaW1tZWRpYXRlbHkgcmVmbGVjdGVkIGluIHRoZQorICAgIGluZm9ybWF0aW9uIHVzZWQgdG8gYXV0aGVudGljYXRlIG5ldyBsb2dpbnMuPC9wPgorCisgICAgPHA+VGhlIEpEQkMgUmVhbG0gdXNlcyBhIHNpbmdsZSBkYiBjb25uZWN0aW9uLiBUaGlzIHJlcXVpcmVzIHRoYXQKKyAgICByZWFsbSBiYXNlZCBhdXRoZW50aWNhdGlvbiBiZSBzeW5jaHJvbml6ZWQsIGkuZS4gb25seSBvbmUgYXV0aGVudGljYXRpb24KKyAgICBjYW4gYmUgZG9uZSBhdCBhIHRpbWUuIFRoaXMgY291bGQgYmUgYSBib3R0bGVuZWNrIGZvciBhcHBsaWNhdGlvbnMKKyAgICB3aXRoIGhpZ2ggdm9sdW1lcyBvZiByZWFsbSBiYXNlZCBhdXRoZW50aWNhdGlvbnMuPC9wPgorCisgICAgPHA+VGhlIERhdGFTb3VyY2UgRGF0YWJhc2UgUmVhbG0gc3VwcG9ydHMgc2ltdWx0YW5lb3VzIHJlYWxtIGJhc2VkCisgICAgYXV0aGVudGljYXRpb25zIGFuZCBhbGxvd3MgdGhlIHVuZGVybHlpbmcgSkRCQyBEYXRhU291cmNlIHRvCisgICAgaGFuZGxlIG9wdGltaXphdGlvbnMgbGlrZSBkYXRhYmFzZSBjb25uZWN0aW9uIHBvb2xpbmcuPC9wPgorCisgICAgPHA+QSByaWNoIHNldCBvZiBhZGRpdGlvbmFsIGF0dHJpYnV0ZXMgbGV0cyB5b3UgY29uZmlndXJlIHRoZSBuYW1lCisgICAgb2YgdGhlIEpOREkgSkRCQyBEYXRhU291cmNlLCBhcyB3ZWxsIGFzIHRoZSB0YWJsZSBhbmQKKyAgICBjb2x1bW4gbmFtZXMgdXNlZCB0byByZXRyaWV2ZSB0aGUgcmVxdWlyZWQgaW5mb3JtYXRpb246PC9wPgorCisgICAgPGF0dHJpYnV0ZXM+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGF0YVNvdXJjZU5hbWUiIHJlcXVpcmVkPSJ0cnVlIj4KKyAgICAgICAgPHA+VGhlIG5hbWUgb2YgdGhlIEpOREkgSkRCQyBEYXRhU291cmNlIGZvciB0aGlzIFJlYWxtLjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9ImRpZ2VzdCIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+VGhlIG5hbWUgb2YgdGhlIDxjb2RlPk1lc3NhZ2VEaWdlc3Q8L2NvZGU+IGFsZ29yaXRobSB1c2VkCisgICAgICAgIHRvIGVuY29kZSB1c2VyIHBhc3N3b3JkcyBzdG9yZWQgaW4gdGhlIGRhdGFiYXNlLiAgSWYgbm90IHNwZWNpZmllZCwKKyAgICAgICAgdXNlciBwYXNzd29yZHMgYXJlIGFzc3VtZWQgdG8gYmUgc3RvcmVkIGluIGNsZWFyLXRleHQuPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icm9sZU5hbWVDb2wiIHJlcXVpcmVkPSJ0cnVlIj4KKyAgICAgICAgPHA+TmFtZSBvZiB0aGUgY29sdW1uLCBpbiB0aGUgInVzZXIgcm9sZXMiIHRhYmxlLCB3aGljaCBjb250YWlucworICAgICAgICBhIHJvbGUgbmFtZSBhc3NpZ25lZCB0byB0aGUgY29ycmVzcG9uZGluZyB1c2VyLjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9InVzZXJDcmVkQ29sIiByZXF1aXJlZD0idHJ1ZSI+CisgICAgICAgIDxwPk5hbWUgb2YgdGhlIGNvbHVtbiwgaW4gdGhlICJ1c2VycyIgdGFibGUsIHdoaWNoIGNvbnRhaW5zCisgICAgICAgIHRoZSB1c2VyJ3MgY3JlZGVudGlhbHMgKGkuZS4gcGFzc3dvcmQoLiAgSWYgYSB2YWx1ZSBmb3IgdGhlCisgICAgICAgIDxjb2RlPmRpZ2VzdDwvY29kZT4gYXR0cmlidXRlIGlzIHNwZWNpZmllZCwgdGhpcyBjb21wb25lbnQKKyAgICAgICAgd2lsbCBhc3N1bWUgdGhhdCB0aGUgcGFzc3dvcmRzIGhhdmUgYmVlbiBlbmNvZGVkIHdpdGggdGhlCisgICAgICAgIHNwZWNpZmllZCBhbGdvcml0aG0uICBPdGhlcndpc2UsIHRoZXkgd2lsbCBiZSBhc3N1bWVkIHRvIGJlCisgICAgICAgIGluIGNsZWFyIHRleHQuPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idXNlck5hbWVDb2wiIHJlcXVpcmVkPSJ0cnVlIj4KKyAgICAgICAgPHA+TmFtZSBvZiB0aGUgY29sdW1uLCBpbiB0aGUgInVzZXJzIiBhbmQgInVzZXIgcm9sZXMiIHRhYmxlLAorICAgICAgICB0aGF0IGNvbnRhaW5zIHRoZSB1c2VyJ3MgdXNlcm5hbWUuPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idXNlclJvbGVUYWJsZSIgcmVxdWlyZWQ9InRydWUiPgorICAgICAgICA8cD5OYW1lIG9mIHRoZSAidXNlciByb2xlcyIgdGFibGUsIHdoaWNoIG11c3QgY29udGFpbiBjb2x1bW5zCisgICAgICAgIG5hbWVkIGJ5IHRoZSA8Y29kZT51c2VyTmFtZUNvbDwvY29kZT4gYW5kIDxjb2RlPnJvbGVOYW1lQ29sPC9jb2RlPgorICAgICAgICBhdHRyaWJ1dGVzLjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9InVzZXJUYWJsZSIgcmVxdWlyZWQ9InRydWUiPgorICAgICAgICA8cD5OYW1lIG9mIHRoZSAidXNlcnMiIHRhYmxlLCB3aGljaCBtdXN0IGNvbnRhaW4gY29sdW1ucyBuYW1lZAorICAgICAgICBieSB0aGUgPGNvZGU+dXNlck5hbWVDb2w8L2NvZGU+IGFuZCA8Y29kZT51c2VyQ3JlZENvbDwvY29kZT4KKyAgICAgICAgYXR0cmlidXRlcy48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgIDwvYXR0cmlidXRlcz4KKworICAgIDxwPlNlZSB0aGUgPGEgaHJlZj0iLi4vcmVhbG0taG93dG8uaHRtbCNEYXRhU291cmNlUmVhbG0iPgorICAgIERhdGFTb3VyY2UgUmVhbG0gSE9XLVRPPC9hPiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBzZXR0aW5nIHVwIGNvbnRhaW5lcgorICAgIG1hbmFnZWQgc2VjdXJpdHkgdXNpbmcgdGhlIERhdGFTb3VyY2UgRGF0YWJhc2UgUmVhbG0gY29tcG9uZW50LjwvcD4KKworCisgICAgPGgzPkpOREkgRGlyZWN0b3J5IFJlYWxtIChvcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtLkpORElSZWFsbSk8L2gzPgorCisKKyAgICA8cD5UaGUgPHN0cm9uZz5KTkRJIERpcmVjdG9yeSBSZWFsbTwvc3Ryb25nPiBjb25uZWN0cyBDYXRhbGluYSB0bworICAgIGFuIExEQVAgRGlyZWN0b3J5LCBhY2Nlc3NlZCB0aHJvdWdoIGFuIGFwcHJvcHJpYXRlIEpOREkgZHJpdmVyLAorICAgIHRoYXQgc3RvcmVzIHVzZXJuYW1lcywgcGFzc3dvcmRzLCBhbmQgdGhlaXIgYXNzb2NpYXRlZAorICAgIHJvbGVzLiBDaGFuZ2VzIHRvIHRoZSBkaXJlY3RvcnkgYXJlIGltbWVkaWF0ZWx5IHJlZmxlY3RlZCBpbiB0aGUKKyAgICBpbmZvcm1hdGlvbiB1c2VkIHRvIGF1dGhlbnRpY2F0ZSBuZXcgbG9naW5zLjwvcD4KKworCisgICAgPHA+VGhlIGRpcmVjdG9yeSByZWFsbSBzdXBwb3J0cyBhIHZhcmlldHkgb2YgYXBwcm9hY2hlcyB0byB1c2luZworICAgIExEQVAgZm9yIGF1dGhlbnRpY2F0aW9uOjwvcD4KKworICAgIDx1bD4KKyAgICA8bGk+VGhlIHJlYWxtIGNhbiBlaXRoZXIgdXNlIGEgcGF0dGVybiB0byBkZXRlcm1pbmUgdGhlCisgICAgZGlzdGluZ3Vpc2hlZCBuYW1lIChETikgb2YgdGhlIHVzZXIncyBkaXJlY3RvcnkgZW50cnksIG9yIHNlYXJjaAorICAgIHRoZSBkaXJlY3RvcnkgdG8gbG9jYXRlIHRoYXQgZW50cnkuCisgICAgPC9saT4KKworICAgIDxsaT5UaGUgcmVhbG0gY2FuIGF1dGhlbnRpY2F0ZSB0aGUgdXNlciBlaXRoZXIgYnkgYmluZGluZyB0byB0aGUKKyAgICBkaXJlY3Rvcnkgd2l0aCB0aGUgRE4gb2YgdGhlIHVzZXIncyBlbnRyeSBhbmQgdGhlIHBhc3N3b3JkCisgICAgcHJlc2VudGVkIGJ5IHRoZSB1c2VyLCBvciBieSByZXRyaWV2aW5nIHRoZSBwYXNzd29yZCBmcm9tIHRoZQorICAgIHVzZXIncyBlbnRyeSBhbmQgcGVyZm9ybWluZyBhIGNvbXBhcmlzb24gbG9jYWxseS4KKyAgICA8L2xpPgorCisgICAgPGxpPlJvbGVzIG1heSBiZSByZXByZXNlbnRlZCBpbiB0aGUgZGlyZWN0b3J5IGFzIGV4cGxpY2l0IGVudHJpZXMKKyAgICBmb3VuZCBieSBhIGRpcmVjdG9yeSBzZWFyY2ggKGUuZy4gZ3JvdXAgZW50cmllcyBvZiB3aGljaCB0aGUgdXNlcgorICAgIGlzIGEgbWVtYmVyKSwgYXMgdGhlIHZhbHVlcyBvZiBhbiBhdHRyaWJ1dGUgaW4gdGhlIHVzZXIncyBlbnRyeSwKKyAgICBvciBib3RoLgorICAgIDwvbGk+CisgICAgPC91bD4KKworICAgIDxwPiBBIHJpY2ggc2V0IG9mIGFkZGl0aW9uYWwgYXR0cmlidXRlcyBsZXRzIHlvdSBjb25maWd1cmUgdGhlCisgICAgcmVxdWlyZWQgYmVoYXZpb3VyIGFzIHdlbGwgYXMgdGhlIGNvbm5lY3Rpb24gdG8gdGhlIHVuZGVybHlpbmcKKyAgICBkaXJlY3RvcnkgYW5kIHRoZSBlbGVtZW50IGFuZCBhdHRyaWJ1dGUgbmFtZXMgdXNlZCB0byByZXRyaWV2ZQorICAgIGluZm9ybWF0aW9uIGZyb20gdGhlIGRpcmVjdG9yeTo8L3A+CisKKyAgICA8YXR0cmlidXRlcz4KKyAgICAgICA8YXR0cmlidXRlIG5hbWU9ImF1dGhlbnRpY2F0aW9uIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgICAgPHA+QSBzdHJpbmcgc3BlY2lmeWluZyB0aGUgdHlwZSBvZiBhdXRoZW50aWNhdGlvbiB0byB1c2UuCisgICAgICAgICAibm9uZSIsICJzaW1wbGUiLCAic3Ryb25nIiBvciBhIHByb3ZpZGVyIHNwZWNpZmljIGRlZmluaXRpb24KKyAgICAgICAgIGNhbiBiZSB1c2VkLiBJZiBubyB2YWx1ZSBpcyBnaXZlbiB0aGUgcHJvdmlkZXJzIGRlZmF1bHQgaXMgdXNlZC48L3A+CisgICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29ubmVjdGlvbk5hbWUiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPlRoZSBkaXJlY3RvcnkgdXNlcm5hbWUgdG8gdXNlIHdoZW4gZXN0YWJsaXNoaW5nIGEKKyAgICAgICAgY29ubmVjdGlvbiB0byB0aGUgZGlyZWN0b3J5IGZvciBMREFQIHNlYXJjaCBvcGVyYXRpb25zLiBJZiBub3QKKyAgICAgICAgc3BlY2lmaWVkIGFuIGFub255bW91cyBjb25uZWN0aW9uIGlzIG1hZGUsIHdoaWNoIGlzIG9mdGVuCisgICAgICAgIHN1ZmZpY2llbnQgdW5sZXNzIHlvdSBzcGVjaWZ5IHRoZSA8Y29kZT51c2VyUGFzc3dvcmQ8L2NvZGU+CisgICAgICAgIHByb3BlcnR5LjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNvbm5lY3Rpb25QYXNzd29yZCIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+VGhlIGRpcmVjdG9yeSBwYXNzd29yZCB0byB1c2Ugd2hlbiBlc3RhYmxpc2hpbmcgYQorICAgICAgICBjb25uZWN0aW9uIHRvIHRoZSBkaXJlY3RvcnkgZm9yIExEQVAgc2VhcmNoIG9wZXJhdGlvbnMuIElmIG5vdAorICAgICAgICBzcGVjaWZpZWQgYW4gYW5vbnltb3VzIGNvbm5lY3Rpb24gaXMgbWFkZSwgd2hpY2ggaXMgb2Z0ZW4KKyAgICAgICAgc3VmZmljaWVudCB1bmxlc3MgeW91IHNwZWNpZnkgdGhlIDxjb2RlPnVzZXJQYXNzd29yZDwvY29kZT4KKyAgICAgICAgcHJvcGVydHkuPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29ubmVjdGlvblVSTCIgcmVxdWlyZWQ9InRydWUiPgorICAgICAgICA8cD5UaGUgY29ubmVjdGlvbiBVUkwgdG8gYmUgcGFzc2VkIHRvIHRoZSBKTkRJIGRyaXZlciB3aGVuCisgICAgICAgIGVzdGFibGlzaGluZyBhIGNvbm5lY3Rpb24gdG8gdGhlIGRpcmVjdG9yeS48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb250ZXh0RmFjdG9yeSIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+RnVsbHkgcXVhbGlmaWVkIEphdmEgY2xhc3MgbmFtZSBvZiB0aGUgZmFjdG9yeSBjbGFzcyB1c2VkCisgICAgICAgIHRvIGFjcXVpcmUgb3VyIEpOREkgPGNvZGU+SW5pdGlhbENvbnRleHQ8L2NvZGU+LiAgQnkgZGVmYXVsdCwKKyAgICAgICAgYXNzdW1lcyB0aGF0IHRoZSBzdGFuZGFyZCBKTkRJIExEQVAgcHJvdmlkZXIgd2lsbCBiZSB1dGlsaXplZC48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIAorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwcm90b2NvbCIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgIDxwPkEgc3RyaW5nIHNwZWNpZnlpbmcgdGhlIHNlY3VyaXR5IHByb3RvY29sIHRvIHVzZS4gSWYgbm90IGdpdmVuCisgICAgICAgICB0aGUgcHJvdmlkZXJzIGRlZmF1bHQgaXMgdXNlZC48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJyb2xlQmFzZSIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+VGhlIGJhc2UgZGlyZWN0b3J5IGVudHJ5IGZvciBwZXJmb3JtaW5nIHJvbGUgc2VhcmNoZXMuIElmCisgICAgICAgIG5vdCBzcGVjaWZpZWQgdGhlIHRvcC1sZXZlbCBlbGVtZW50IGluIHRoZSBkaXJlY3RvcnkgY29udGV4dAorICAgICAgICB3aWxsIGJlIHVzZWQuPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icm9sZU5hbWUiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPlRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdGhhdCBjb250YWlucyByb2xlIG5hbWVzIGluIHRoZQorICAgICAgICBkaXJlY3RvcnkgZW50cmllcyBmb3VuZCBieSBhIHJvbGUgc2VhcmNoLiBJbiBhZGRpdGlvbiB5b3UgY2FuCisgICAgICAgIHVzZSB0aGUgPGNvZGU+dXNlclJvbGVOYW1lPC9jb2RlPiBwcm9wZXJ0eSB0byBzcGVjaWZ5IHRoZSBuYW1lCisgICAgICAgIG9mIGFuIGF0dHJpYnV0ZSwgaW4gdGhlIHVzZXIncyBlbnRyeSwgY29udGFpbmluZyBhZGRpdGlvbmFsCisgICAgICAgIHJvbGUgbmFtZXMuICBJZiA8Y29kZT5yb2xlTmFtZTwvY29kZT4gaXMgbm90IHNwZWNpZmllZCBhIHJvbGUKKyAgICAgICAgc2VhcmNoIGRvZXMgbm90IHRha2UgcGxhY2UsIGFuZCByb2xlcyBhcmUgdGFrZW4gb25seSBmcm9tIHRoZQorICAgICAgICB1c2VyJ3MgZW50cnkuPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icm9sZVNlYXJjaCIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+VGhlIExEQVAgZmlsdGVyIGV4cHJlc3Npb24gdXNlZCBmb3IgcGVyZm9ybWluZyByb2xlCisgICAgICAgIHNlYXJjaGVzLiAgVXNlIDxjb2RlPnswfTwvY29kZT4gdG8gc3Vic3RpdHV0ZSB0aGUKKyAgICAgICAgZGlzdGluZ3Vpc2hlZCBuYW1lIChETikgb2YgdGhlIHVzZXIsIGFuZC9vciA8Y29kZT57MX08L2NvZGU+IHRvCisgICAgICAgIHN1YnN0aXR1dGUgdGhlIHVzZXJuYW1lLiBJZiBub3Qgc3BlY2lmaWVkIGEgcm9sZSBzZWFyY2ggZG9lcworICAgICAgICBub3QgdGFrZSBwbGFjZSBhbmQgcm9sZXMgYXJlIHRha2VuIG9ubHkgZnJvbSB0aGUgYXR0cmlidXRlIGluCisgICAgICAgIHRoZSB1c2VyJ3MgZW50cnkgc3BlY2lmaWVkIGJ5IHRoZSA8Y29kZT51c2VyUm9sZU5hbWU8L2NvZGU+CisgICAgICAgIHByb3BlcnR5LjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9InJvbGVTdWJ0cmVlIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgICA8cD5TZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgeW91IHdhbnQgdG8gc2VhcmNoIHRoZSBlbnRpcmUKKyAgICAgICAgc3VidHJlZSBvZiB0aGUgZWxlbWVudCBzcGVjaWZpZWQgYnkgdGhlIDxjb2RlPnJvbGVCYXNlPC9jb2RlPgorICAgICAgICBwcm9wZXJ0eSBmb3Igcm9sZSBlbnRyaWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlci4gVGhlCisgICAgICAgIGRlZmF1bHQgdmFsdWUgb2YgPGNvZGU+ZmFsc2U8L2NvZGU+IGNhdXNlcyBvbmx5IHRoZSB0b3AgbGV2ZWwKKyAgICAgICAgdG8gYmUgc2VhcmNoZWQuPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idXNlckJhc2UiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPlRoZSBiYXNlIGVsZW1lbnQgZm9yIHVzZXIgc2VhcmNoZXMgcGVyZm9ybWVkIHVzaW5nIHRoZQorICAgICAgICA8Y29kZT51c2VyU2VhcmNoPC9jb2RlPiBleHByZXNzaW9uLiAgTm90IHVzZWQgaWYgeW91IGFyZSB1c2luZworICAgICAgICB0aGUgPGNvZGU+dXNlclBhdHRlcm48L2NvZGU+IGV4cHJlc3Npb24uPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idXNlclBhc3N3b3JkIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgICA8cD5OYW1lIG9mIHRoZSBhdHRyaWJ1dGUgaW4gdGhlIHVzZXIncyBlbnRyeSBjb250YWluaW5nIHRoZQorICAgICAgICB1c2VyJ3MgcGFzc3dvcmQuICBJZiB5b3Ugc3BlY2lmeSB0aGlzIHZhbHVlLCBKTkRJUmVhbG0gd2lsbAorICAgICAgICBiaW5kIHRvIHRoZSBkaXJlY3RvcnkgdXNpbmcgdGhlIHZhbHVlcyBzcGVjaWZpZWQgYnkKKyAgICAgICAgPGNvZGU+Y29ubmVjdGlvbk5hbWU8L2NvZGU+IGFuZAorICAgICAgICA8Y29kZT5jb25uZWN0aW9uUGFzc3dvcmQ8L2NvZGU+IHByb3BlcnRpZXMsIGFuZCByZXRyaWV2ZSB0aGUKKyAgICAgICAgY29ycmVzcG9uZGluZyBhdHRyaWJ1dGUgZm9yIGNvbXBhcmlzb24gdG8gdGhlIHZhbHVlIHNwZWNpZmllZAorICAgICAgICBieSB0aGUgdXNlciBiZWluZyBhdXRoZW50aWNhdGVkLiAgSWYgeW91IGRvCisgICAgICAgIDxzdHJvbmc+bm90PC9zdHJvbmc+IHNwZWNpZnkgdGhpcyB2YWx1ZSwgSk5ESVJlYWxtIHdpbGwKKyAgICAgICAgYXR0ZW1wdCBhIHNpbXBsZSBiaW5kIHRvIHRoZSBkaXJlY3RvcnkgdXNpbmcgdGhlIEROIG9mIHRoZQorICAgICAgICB1c2VyJ3MgZW50cnkgYW5kIHRoZSBwYXNzd29yZCBwcmVzZW50ZWQgYnkgdGhlIHVzZXIsIHdpdGggYQorICAgICAgICBzdWNjZXNzZnVsIGJpbmQgYmVpbmcgaW50ZXJwcmV0ZWQgYXMgYW4gYXV0aGVudGljYXRlZAorICAgICAgICB1c2VyLjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9InVzZXJQYXR0ZXJuIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgICA8cD5QYXR0ZXJuIGZvciB0aGUgZGlzdGluZ3Vpc2hlZCBuYW1lIChETikgb2YgdGhlIHVzZXIncworICAgICAgICBkaXJlY3RvcnkgZW50cnksIHdpdGggPGNvZGU+ezB9PC9jb2RlPiBtYXJraW5nIHdoZXJlIHRoZQorICAgICAgICBhY3R1YWwgdXNlcm5hbWUgc2hvdWxkIGJlIGluc2VydGVkLiBZb3UgY2FuIHVzZSB0aGlzIHByb3BlcnR5CisgICAgICAgIGluc3RlYWQgb2YgPGNvZGU+dXNlclNlYXJjaDwvY29kZT4sIDxjb2RlPnVzZXJTdWJ0cmVlPC9jb2RlPgorICAgICAgICBhbmQgPGNvZGU+dXNlckJhc2U8L2NvZGU+IHdoZW4gdGhlIGRpc3Rpbmd1aXNoZWQgbmFtZSBjb250YWlucworICAgICAgICB0aGUgdXNlcm5hbWUgYW5kIGlzIG90aGVyd2lzZSB0aGUgc2FtZSBmb3IgYWxsIHVzZXJzLjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9InVzZXJSb2xlTmFtZSIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+VGhlIG5hbWUgb2YgYW4gYXR0cmlidXRlIGluIHRoZSB1c2VyJ3MgZGlyZWN0b3J5IGVudHJ5CisgICAgICAgIGNvbnRhaW5pbmcgemVybyBvciBtb3JlIHZhbHVlcyBmb3IgdGhlIG5hbWVzIG9mIHJvbGVzIGFzc2lnbmVkCisgICAgICAgIHRvIHRoaXMgdXNlci4gIEluIGFkZGl0aW9uIHlvdSBjYW4gdXNlIHRoZQorICAgICAgICA8Y29kZT5yb2xlTmFtZTwvY29kZT4gcHJvcGVydHkgdG8gc3BlY2lmeSB0aGUgbmFtZSBvZiBhbgorICAgICAgICBhdHRyaWJ1dGUgdG8gYmUgcmV0cmlldmVkIGZyb20gaW5kaXZpZHVhbCByb2xlIGVudHJpZXMgZm91bmQKKyAgICAgICAgYnkgc2VhcmNoaW5nIHRoZSBkaXJlY3RvcnkuIElmIDxjb2RlPnVzZXJSb2xlTmFtZTwvY29kZT4gaXMKKyAgICAgICAgbm90IHNwZWNpZmllZCBhbGwgdGhlIHJvbGVzIGZvciBhIHVzZXIgZGVyaXZlIGZyb20gdGhlIHJvbGUKKyAgICAgICAgc2VhcmNoLjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9InVzZXJTZWFyY2giIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPlRoZSBMREFQIGZpbHRlciBleHByZXNzaW9uIHRvIHVzZSB3aGVuIHNlYXJjaGluZyBmb3IgYQorICAgICAgICB1c2VyJ3MgZGlyZWN0b3J5IGVudHJ5LCB3aXRoIDxjb2RlPnswfTwvY29kZT4gbWFya2luZyB3aGVyZQorICAgICAgICB0aGUgYWN0dWFsIHVzZXJuYW1lIHNob3VsZCBiZSBpbnNlcnRlZC4gIFVzZSB0aGlzIHByb3BlcnR5CisgICAgICAgIChhbG9uZyB3aXRoIHRoZSA8Y29kZT51c2VyQmFzZTwvY29kZT4gYW5kCisgICAgICAgIDxjb2RlPnVzZXJTdWJ0cmVlPC9jb2RlPiBwcm9wZXJ0aWVzKSBpbnN0ZWFkIG9mCisgICAgICAgIDxjb2RlPnVzZXJQYXR0ZXJuPC9jb2RlPiB0byBzZWFyY2ggdGhlIGRpcmVjdG9yeSBmb3IgdGhlCisgICAgICAgIHVzZXIncyBlbnRyeS48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ1c2VyU3VidHJlZSIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+U2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+IGlmIHlvdSB3YW50IHRvIHNlYXJjaCB0aGUgZW50aXJlCisgICAgICAgIHN1YnRyZWUgb2YgdGhlIGVsZW1lbnQgc3BlY2lmaWVkIGJ5IHRoZSA8Y29kZT51c2VyQmFzZTwvY29kZT4KKyAgICAgICAgcHJvcGVydHkgZm9yIHRoZSB1c2VyJ3MgZW50cnkuIFRoZSBkZWZhdWx0IHZhbHVlIG9mCisgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBjYXVzZXMgb25seSB0aGUgdG9wIGxldmVsIHRvIGJlIHNlYXJjaGVkLgorICAgICAgICBOb3QgdXNlZCBpZiB5b3UgYXJlIHVzaW5nIHRoZSA8Y29kZT51c2VyUGF0dGVybjwvY29kZT4KKyAgICAgICAgZXhwcmVzc2lvbi48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgIDwvYXR0cmlidXRlcz4KKworICAgIDxwPlNlZSA8c3Ryb25nPkZJWE1FIC0gTmVzdGVkIHBvaW50ZXIgaW50byBIT1ctVE88L3N0cm9uZz4gZm9yIG1vcmUKKyAgICBpbmZvcm1hdGlvbiBvbiBzZXR0aW5nIHVwIGNvbnRhaW5lciBtYW5hZ2VkIHNlY3VyaXR5IHVzaW5nIHRoZQorICAgIEpOREkgRGlyZWN0b3J5IFJlYWxtIGNvbXBvbmVudC48L3A+CisKKworICAgIDxoMz5NZW1vcnkgQmFzZWQgUmVhbG0gKG9yZy5hcGFjaGUuY2F0YWxpbmEucmVhbG0uTWVtb3J5UmVhbG0pPC9oMz4KKworICAgIDxwPlRoZSA8c3Ryb25nPk1lbW9yeSBCYXNlZCBSZWFsbTwvc3Ryb25nPiBpcyBhIHNpbXBsZSBSZWFsbSBpbXBsZW1lbnRhdGlvbgorICAgIHRoYXQgcmVhZHMgdXNlciBpbmZvcm1hdGlvbiBmcm9tIGFuIFhNTCBmb3JtYXQsIGFuZCByZXByZXNlbnRzIGl0IGFzIGEKKyAgICBjb2xsZWN0aW9uIG9mIEphdmEgb2JqZWN0cyBpbiBtZW1vcnkuICBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGludGVuZGVkCisgICAgc29sZWx5IHRvIGdldCB1cCBhbmQgcnVubmluZyB3aXRoIGNvbnRhaW5lciBtYW5hZ2VkIHNlY3VyaXR5IC0gaXQgaXMgTk9UCisgICAgaW50ZW5kZWQgZm9yIHByb2R1Y3Rpb24gdXNlLiAgQXMgc3VjaCwgdGhlcmUgYXJlIG5vIG1lY2hhbmlzbXMgZm9yCisgICAgdXBkYXRpbmcgdGhlIGluLW1lbW9yeSBjb2xsZWN0aW9uIG9mIHVzZXJzIHdoZW4gdGhlIGNvbnRlbnQgb2YgdGhlCisgICAgdW5kZXJseWluZyBkYXRhIGZpbGUgaXMgY2hhbmdlZC48L3A+CisKKyAgICA8cD5UaGUgTWVtb3J5IEJhc2VkIFJlYWxtIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcKKyAgICBhZGRpdGlvbmFsIGF0dHJpYnV0ZXM6PC9wPgorCisgICAgPGF0dHJpYnV0ZXM+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icGF0aG5hbWUiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPkFic29sdXRlIG9yIHJlbGF0aXZlICh0byAkQ0FUQUxJTkFfSE9NRSkgcGF0aG5hbWUgdG8gdGhlIFhNTCBmaWxlCisgICAgICAgIGNvbnRhaW5pbmcgb3VyIHVzZXIgaW5mb3JtYXRpb24uICBTZWUgYmVsb3cgZm9yIGRldGFpbHMgb24gdGhlCisgICAgICAgIFhNTCBlbGVtZW50IGZvcm1hdCByZXF1aXJlZC4gIElmIG5vIHBhdGhuYW1lIGlzIHNwZWNpZmllZCwgdGhlCisgICAgICAgIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+Y29uZi90b21jYXQtdXNlcnMueG1sPC9jb2RlPi48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgIDwvYXR0cmlidXRlcz4KKworICAgIDxwPlRoZSBYTUwgZG9jdW1lbnQgcmVmZXJlbmNlZCBieSB0aGUgPGNvZGU+cGF0aG5hbWU8L2NvZGU+IGF0dHJpYnV0ZSBtdXN0CisgICAgY29uZm9ybSB0byB0aGUgZm9sbG93aW5nIHJlcXVpcmVtZW50czo8L3A+CisgICAgPHVsPgorICAgIDxsaT5UaGUgcm9vdCAob3V0ZXIpIGVsZW1lbnQgbXVzdCBiZSA8Y29kZT4mbHQ7dG9tY2F0LXVzZXJzJmd0OzwvY29kZT4uCisgICAgICAgIDwvbGk+CisgICAgPGxpPkVhY2ggYXV0aG9yaXplZCB1c2VyIG11c3QgYmUgcmVwcmVzZW50ZWQgYnkgYSBzaW5nbGUgWE1MIGVsZW1lbnQKKyAgICAgICAgPGNvZGU+Jmx0O3VzZXImZ3Q7PC9jb2RlPiwgbmVzdGVkIGluc2lkZSB0aGUgcm9vdCBlbGVtZW50LjwvbGk+CisgICAgPGxpPkVhY2ggPGNvZGU+Jmx0O3VzZXImZ3Q7PC9jb2RlPiBlbGVtZW50IG11c3QgaGF2ZSB0aGUgZm9sbG93aW5nCisgICAgICAgIGF0dHJpYnV0ZXM6CisgICAgICAgIDx1bD4KKyAgICAgICAgPGxpPjxzdHJvbmc+bmFtZTwvc3Ryb25nPiAtIFVzZXJuYW1lIG9mIHRoaXMgdXNlciAobXVzdCBiZSB1bmlxdWUKKyAgICAgICAgICAgIHdpdGhpbiB0aGlzIGZpbGUpLjwvbGk+CisgICAgICAgIDxsaT48c3Ryb25nPnBhc3N3b3JkPC9zdHJvbmc+IC0gUGFzc3dvcmQgb2YgdGhpcyB1c2VyIChpbgorICAgICAgICAgICAgY2xlYXIgdGV4dCkuPC9saT4KKyAgICAgICAgPGxpPjxzdHJvbmc+cm9sZXM8L3N0cm9uZz4gLSBDb21tYS1kZWxpbWl0ZWQgbGlzdCBvZiB0aGUgcm9sZSBuYW1lcworICAgICAgICAgICAgYXNzaWduZWQgdG8gdGhpcyB1c2VyLjwvbGk+CisgICAgICAgIDwvdWw+PC9saT4KKyAgICA8L3VsPgorCisgICAgPHA+U2VlIDxzdHJvbmc+RklYTUUgLSBOZXN0ZWQgcG9pbnRlciBpbnRvIEhPVy1UTzwvc3Ryb25nPiBmb3IgbW9yZQorICAgIGluZm9ybWF0aW9uIG9uIHNldHRpbmcgdXAgY29udGFpbmVyIG1hbmFnZWQgc2VjdXJpdHkgdXNpbmcgdGhlCisgICAgTWVtb3J5IEJhc2VkIFJlYWxtIGNvbXBvbmVudC48L3A+CisKKworICA8L3N1YnNlY3Rpb24+CisKKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9Ik5lc3RlZCBDb21wb25lbnRzIj4KKworICA8cD5ObyBjb21wb25lbnRzIG1heSBiZSBuZXN0ZWQgaW5zaWRlIGEgPHN0cm9uZz5SZWFsbTwvc3Ryb25nPiBlbGVtZW50LjwvcD4KKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IlNwZWNpYWwgRmVhdHVyZXMiPgorCisgIDxwPlNlZSA8YSBocmVmPSJob3N0Lmh0bWwiPlNpbmdsZSBTaWduIE9uPC9hPiBmb3IgaW5mb3JtYXRpb24gYWJvdXQKKyAgY29uZmlndXJpbmcgU2luZ2xlIFNpZ24gT24gc3VwcG9ydCBmb3IgYSB2aXJ0dWFsIGhvc3QuPC9wPgorCis8L3NlY3Rpb24+CisKKworPC9ib2R5PgorCisKKzwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9kb2NzL2NvbmZpZy9yZXNvdXJjZXMueG1sIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9jb25maWcvcmVzb3VyY2VzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTc0NWRlCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9jb25maWcvcmVzb3VyY2VzLnhtbApAQCAtMCwwICsxLDEwMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IURPQ1RZUEUgZG9jdW1lbnQgWworICA8IUVOVElUWSBwcm9qZWN0IFNZU1RFTSAicHJvamVjdC54bWwiPgorXT4KKzxkb2N1bWVudCB1cmw9InJlc291cmNlcy5odG1sIj4KKworICAmcHJvamVjdDsKKworICA8cHJvcGVydGllcz4KKyAgICA8YXV0aG9yIGVtYWlsPSJyZW1tQGFwYWNoZS5vcmciPlJlbXkgTWF1Y2hlcmF0PC9hdXRob3I+CisgICAgPHRpdGxlPlRoZSBSZXNvdXJjZXMgQ29tcG9uZW50PC90aXRsZT4KKyAgPC9wcm9wZXJ0aWVzPgorCis8Ym9keT4KKworCis8c2VjdGlvbiBuYW1lPSJJbnRyb2R1Y3Rpb24iPgorCisgIDxwPlRoZSA8c3Ryb25nPlJlc291cmNlczwvc3Ryb25nPiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIDxlbT53ZWIKKyAgYXBwbGljYXRpb24gc3RhdGljIHJlc291cmNlczwvZW0+LCBmcm9tIHdoaWNoIGNsYXNzZXMgd2lsbCBiZSBsb2FkZWQsIAorICBIVE1MLCBKU1AgYW5kIHRoZSBvdGhlciBzdGF0aWMgZmlsZXMgd2lsbCBiZSBzZXJ2ZWQuIFRoaXMgYWxsb3dzIHRoZSB3ZWJhcHAKKyAgdG8gcmVzaWRlIG9uIHZhcmlvdXMgbWVkaXVtcyBvdGhlciB0aGFuIHRoZSBmaWxlc3lzdGVtLCBsaWtlIGNvbXByZXNzZWQKKyAgaW4gYSBXQVIgZmlsZSwgaW4gYSBKREJDIGRhdGFiYXNlLCBvciBpbiBhIG1vcmUgYWR2YW5jZWQgdmVyc2lvbmluZworICByZXBvc2l0b3J5LjwvcD4KKworICA8cD5BIHVuaWZpZWQgY2FjaGluZyBlbmdpbmUgaXMgcHJvdmlkZWQgZm9yIGFsbCBhY2Nlc3NlcyB0byB0aGUgd2ViYXBwCisgIHJlc291cmNlcyBtYWRlIGJ5IHRoZSBzZXJ2bGV0IGNvbnRhaW5lciBhbmQgd2ViIGFwcGxpY2F0aW9ucyB3aGljaCB1c2UgdGhlCisgIGNvbnRhaW5lciBwcm92aWRlZCBtZWNoYW5pc21zIHRvIGFjY2VzcyBzdWNoIHJlc291cmNlcywgc3VjaCBhcyBjbGFzcyBsYW9kZXIKKyAgYWNjZXNzLCBhY2Nlc3MgdGhyb3VnaCB0aGUgPGNvZGU+U2VydmxldENvbnRleHQ8L2NvZGU+IGludGVyZmFjZSwgb3IgbmF0aXZlCisgIGFjY2VzcyB0aHJvdWdoIHRoZSA8Y29kZT5EaXJlY3RvcnlDb250ZXh0PC9jb2RlPiBpbnRlcmZhY2UuPC9wPgorCisgIDxwPjxzdHJvbmc+Tm90ZTogUnVubmluZyBhIHdlYmFwcCB3aXRoIG5vbi1maWxlc3lzdGVtIGJhc2VkIAorICBSZXNvdXJjZXMgaW1wbGVtZW50YXRpb25zIGlzIG9ubHkgcG9zc2libGUgd2hlbiB0aGUgd2ViYXBwIGRvZXMgbm90IAorICByZWx5IG9uIGRpcmVjdCBmaWxlc3lzdGVtIGFjY2VzcyB0byBpdHMgb3duIHJlc291cmNlcywgYW5kIHVzZXMgdGhlIG1ldGhvZHMKKyAgaW4gdGhlIFNlcnZsZXRDb250ZXh0IGludGVyZmFjZSB0byBhY2Nlc3MgdGhlbS48L3N0cm9uZz48L3A+CisKKyAgPHA+QSBSZXNvdXJjZXMgZWxlbWVudCBNQVkgYmUgbmVzdGVkIGluc2lkZSBhIAorICA8YSBocmVmPSJjb250ZXh0Lmh0bWwiPkNvbnRleHQ8L2E+IGNvbXBvbmVudC4gIElmIGl0IGlzIG5vdCBpbmNsdWRlZCwgCisgIGEgZGVmYXVsdCBmaWxlc3lzdGVtIGJhc2VkIFJlc291cmNlcyB3aWxsIGJlIGNyZWF0ZWQgYXV0b21hdGljYWxseSwgCisgIHdoaWNoIGlzIHN1ZmZpY2llbnQgZm9yIG1vc3QgcmVxdWlyZW1lbnRzLjwvcD4KKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IkF0dHJpYnV0ZXMiPgorCisgIDxzdWJzZWN0aW9uIG5hbWU9IkNvbW1vbiBBdHRyaWJ1dGVzIj4KKworICAgIDxwPkFsbCBpbXBsZW1lbnRhdGlvbnMgb2YgPHN0cm9uZz5SZXNvdXJjZXM8L3N0cm9uZz4KKyAgICBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczo8L3A+CisKKyAgICA8YXR0cmlidXRlcz4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc05hbWUiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPkphdmEgY2xhc3MgbmFtZSBvZiB0aGUgaW1wbGVtZW50YXRpb24gdG8gdXNlLiAgVGhpcyBjbGFzcyBtdXN0CisgICAgICAgIGltcGxlbWVudCB0aGUgPGNvZGU+amF2YXgubmFtaW5nLmRpcmVjdG9yeS5EaXJDb250ZXh0PC9jb2RlPiBpbnRlcmZhY2UuCisgICAgICAgIEl0IGlzIHJlY29tbWVuZGVkIGZvciBvcHRpbWFsIGZ1bmN0aW9uYWxpdHkgYW5kIHBlcmZvcm1hbmNlLCAKKyAgICAgICAgYnV0IG5vdCBtYW5kYXRvcnksIHRoYXQgdGhlIGNsYXNzIGV4dGVuZCAKKyAgICAgICAgPGNvZGU+b3JnLmFwYWNoZS5uYW1pbmcucmVzb3VyY2VzLkJhc2VEaXJDb250ZXh0PC9jb2RlPiwgYXMgd2VsbCBhcworICAgICAgICB1c2UgdGhlIHNwZWNpYWwgb2JqZWN0IHR5cGVzIHByb3ZpZGVkIGluIHRoZSAKKyAgICAgICAgPGNvZGU+b3JnLmFwYWNoZS5uYW1pbmcucmVzb3VyY2VzPC9jb2RlPiBmb3IgcmV0dXJuZWQgb2JqZWN0cy4KKyAgICAgICAgSWYgbm90IHNwZWNpZmllZCwgdGhlIHN0YW5kYXJkIHZhbHVlIChkZWZpbmVkIGJlbG93KSB3aWxsIGJlIHVzZWQuPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICA8L2F0dHJpYnV0ZXM+CisKKyAgPC9zdWJzZWN0aW9uPgorCisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iU3RhbmRhcmQgSW1wbGVtZW50YXRpb24iPgorCisgICAgPHA+VGhlIHN0YW5kYXJkIGltcGxlbWVudGF0aW9uIG9mIDxzdHJvbmc+UmVzb3VyY2VzPC9zdHJvbmc+IGlzCisgICAgPHN0cm9uZz5vcmcuYXBhY2hlLm5hbWluZy5yZXNvdXJjZXMuRmlsZURpckNvbnRleHQ8L3N0cm9uZz4sIGFuZCAKKyAgICBpcyBjb25maWd1cmVkIGJ5IGl0cyBwYXJlbnQgQ29udGV4dCBlbGVtZW50LjwvcD4KKworICA8L3N1YnNlY3Rpb24+CisKKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9Ik5lc3RlZCBDb21wb25lbnRzIj4KKworICA8cD5ObyBjb21wb25lbnRzIG1heSBiZSBuZXN0ZWQgaW5zaWRlIGEgPHN0cm9uZz5SZXNvdXJjZXM8L3N0cm9uZz4gZWxlbWVudC48L3A+CisKKzwvc2VjdGlvbj4KKworCis8c2VjdGlvbiBuYW1lPSJTcGVjaWFsIEZlYXR1cmVzIj4KKworICA8cD5ObyBzcGVjaWFsIGZlYXR1cmVzIGFyZSBhc3NvY2lhdGVkIHdpdGggYSA8c3Ryb25nPlJlc291cmNlczwvc3Ryb25nPgorICBlbGVtZW50LjwvcD4KKworPC9zZWN0aW9uPgorCisKKzwvYm9keT4KKworCis8L2RvY3VtZW50PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9jb25maWcvc2VydmVyLnhtbCBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvY29uZmlnL3NlcnZlci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjIyYmRhYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvY29uZmlnL3NlcnZlci54bWwKQEAgLTAsMCArMSw5NyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IURPQ1RZUEUgZG9jdW1lbnQgWworICA8IUVOVElUWSBwcm9qZWN0IFNZU1RFTSAicHJvamVjdC54bWwiPgorXT4KKzxkb2N1bWVudCB1cmw9InNlcnZlci5odG1sIj4KKworICAmcHJvamVjdDsKKworICA8cHJvcGVydGllcz4KKyAgICA8YXV0aG9yIGVtYWlsPSJjcmFpZ21jY0BhcGFjaGUub3JnIj5DcmFpZyBSLiBNY0NsYW5haGFuPC9hdXRob3I+CisgICAgPHRpdGxlPlRoZSBTZXJ2ZXIgQ29tcG9uZW50PC90aXRsZT4KKyAgPC9wcm9wZXJ0aWVzPgorCis8Ym9keT4KKworCis8c2VjdGlvbiBuYW1lPSJJbnRyb2R1Y3Rpb24iPgorCisgIDxwPkEgPHN0cm9uZz5TZXJ2ZXI8L3N0cm9uZz4gZWxlbWVudCByZXByZXNlbnRzIHRoZSBlbnRpcmUgQ2F0YWxpbmEKKyAgc2VydmxldCBjb250YWluZXIuICBUaGVyZWZvcmUsIGl0IG11c3QgYmUgdGhlIHNpbmdsZSBvdXRlcm1vc3QgZWxlbWVudAorICBpbiB0aGUgPGNvZGU+Y29uZi9zZXJ2ZXIueG1sPC9jb2RlPiBjb25maWd1cmF0aW9uIGZpbGUuICBJdHMgYXR0cmlidXRlcworICByZXByZXNlbnQgdGhlIGNoYXJhY3RlcmlzdGljcyBvZiB0aGUgc2VydmxldCBjb250YWluZXIgYXMgYSB3aG9sZS48L3A+CisKKzwvc2VjdGlvbj4KKworCis8c2VjdGlvbiBuYW1lPSJBdHRyaWJ1dGVzIj4KKworICA8c3Vic2VjdGlvbiBuYW1lPSJDb21tb24gQXR0cmlidXRlcyI+CisKKyAgPHA+QWxsIGltcGxlbWVudGF0aW9ucyBvZiA8c3Ryb25nPlNlcnZlcjwvc3Ryb25nPgorICBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczo8L3A+CisKKyAgPGF0dHJpYnV0ZXM+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzTmFtZSIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgIDxwPkphdmEgY2xhc3MgbmFtZSBvZiB0aGUgaW1wbGVtZW50YXRpb24gdG8gdXNlLiAgVGhpcyBjbGFzcyBtdXN0CisgICAgICBpbXBsZW1lbnQgdGhlIDxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuU2VydmVyPC9jb2RlPiBpbnRlcmZhY2UuCisgICAgICBJZiBubyBjbGFzcyBuYW1lIGlzIHNwZWNpZmllZCwgdGhlIHN0YW5kYXJkIGltcGxlbWVudGF0aW9uIHdpbGwKKyAgICAgIGJlIHVzZWQuPC9wPgorICAgIDwvYXR0cmlidXRlPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb3J0IiByZXF1aXJlZD0idHJ1ZSI+CisgICAgICA8cD5UaGUgVENQL0lQIHBvcnQgbnVtYmVyIG9uIHdoaWNoIHRoaXMgc2VydmVyIHdhaXRzIGZvciBhIHNodXRkb3duCisgICAgICBjb21tYW5kLiAgVGhpcyBjb25uZWN0aW9uIG11c3QgYmUgaW5pdGlhdGVkIGZyb20gdGhlIHNhbWUgc2VydmVyCisgICAgICBjb21wdXRlciB0aGF0IGlzIHJ1bm5pbmcgdGhpcyBpbnN0YW5jZSBvZiBUb21jYXQuPC9wPgorICAgIDwvYXR0cmlidXRlPgorCisgICAgPGF0dHJpYnV0ZSBuYW1lPSJzaHV0ZG93biIgcmVxdWlyZWQ9InRydWUiPgorICAgICAgPHA+VGhlIGNvbW1hbmQgc3RyaW5nIHRoYXQgbXVzdCBiZSByZWNlaXZlZCB2aWEgYSBUQ1AvSVAgY29ubmVjdGlvbgorICAgICAgdG8gdGhlIHNwZWNpZmllZCBwb3J0IG51bWJlciwgaW4gb3JkZXIgdG8gc2h1dCBkb3duIFRvbWNhdC48L3A+CisgICAgPC9hdHRyaWJ1dGU+CisKKyAgPC9hdHRyaWJ1dGVzPgorCisgIDwvc3Vic2VjdGlvbj4KKworICA8c3Vic2VjdGlvbiBuYW1lPSJTdGFuZGFyZCBJbXBsZW1lbnRhdGlvbiI+CisKKyAgPHA+VGhlIHN0YW5kYXJkIGltcGxlbWVudGF0aW9uIG9mIDxzdHJvbmc+U2VydmVyPC9zdHJvbmc+IGlzCisgIDxzdHJvbmc+b3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkU2VydmVyPC9zdHJvbmc+LgorICBJdCBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgYXR0cmlidXRlcyAoaW4gYWRkaXRpb24gdG8gdGhlCisgIGNvbW1vbiBhdHRyaWJ1dGVzIGxpc3RlZCBhYm92ZSk6PC9wPgorCisgIDxhdHRyaWJ1dGVzPgorICA8L2F0dHJpYnV0ZXM+CisKKyAgPC9zdWJzZWN0aW9uPgorCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iTmVzdGVkIENvbXBvbmVudHMiPgorCisgIDxwPlRoZSBmb2xsb3dpbmcgY29tcG9uZW50cyBtYXkgYmUgbmVzdGVkIGluc2lkZSBhIDxzdHJvbmc+U2VydmVyPC9zdHJvbmc+CisgIGVsZW1lbnQ6PC9wPgorICA8dWw+CisgIDxsaT48YSBocmVmPSJzZXJ2aWNlLmh0bWwiPjxzdHJvbmc+U2VydmljZTwvc3Ryb25nPjwvYT4gLSAKKyAgICAgIE9uZSBvciBtb3JlIHNlcnZpY2UgZWxlbWVudC48L2xpPgorICA8bGk+PGEgaHJlZj0iZ2xvYmFscmVzb3VyY2VzLmh0bWwiPjxzdHJvbmc+R2xvYmFsTmFtaW5nUmVzb3VyY2VzPC9zdHJvbmc+PC9hPiAtIAorICAgICAgQ29uZmlndXJlIHRoZSBKTkRJIGdsb2JhbCByZXNvdXJjZXMgZm9yIHRoZSBzZXJ2ZXIuPC9saT4KKyAgPC91bD4KKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IlNwZWNpYWwgRmVhdHVyZXMiPgorCisgIDxwPlRoZXJlIGFyZSBubyBzcGVjaWFsIGZlYXR1cmVzIGFzc29jaWF0ZWQgd2l0aCBhIDxzdHJvbmc+U2VydmVyPC9zdHJvbmc+LgorICA8L3A+CisKKzwvc2VjdGlvbj4KKworCis8L2JvZHk+CisKKzwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9kb2NzL2NvbmZpZy9zZXJ2aWNlLnhtbCBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvY29uZmlnL3NlcnZpY2UueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwYTk2NjEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2NvbmZpZy9zZXJ2aWNlLnhtbApAQCAtMCwwICsxLDkxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhRE9DVFlQRSBkb2N1bWVudCBbCisgIDwhRU5USVRZIHByb2plY3QgU1lTVEVNICJwcm9qZWN0LnhtbCI+CitdPgorPGRvY3VtZW50IHVybD0ic2VydmljZS5odG1sIj4KKworICAmcHJvamVjdDsKKworICA8cHJvcGVydGllcz4KKyAgICA8YXV0aG9yIGVtYWlsPSJjcmFpZ21jY0BhcGFjaGUub3JnIj5DcmFpZyBSLiBNY0NsYW5haGFuPC9hdXRob3I+CisgICAgPHRpdGxlPlRoZSBTZXJ2aWNlIENvbXBvbmVudDwvdGl0bGU+CisgIDwvcHJvcGVydGllcz4KKworPGJvZHk+CisKKworPHNlY3Rpb24gbmFtZT0iSW50cm9kdWN0aW9uIj4KKworICA8cD5BIDxzdHJvbmc+U2VydmljZTwvc3Ryb25nPiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIGNvbWJpbmF0aW9uIG9mIG9uZSBvcgorICBtb3JlIDxzdHJvbmc+Q29ubmVjdG9yPC9zdHJvbmc+IGNvbXBvbmVudHMgdGhhdCBzaGFyZSBhIHNpbmdsZQorICA8YSBocmVmPSJlbmdpbmUuaHRtbCI+RW5naW5lPC9hPiBjb21wb25lbnQgZm9yIHByb2Nlc3NpbmcgaW5jb21pbmcKKyAgcmVxdWVzdHMuICBPbmUgb3IgbW9yZSA8c3Ryb25nPlNlcnZpY2U8L3N0cm9uZz4gZWxlbWVudHMgbWF5IGJlIG5lc3RlZAorICBpbnNpZGUgYSA8YSBocmVmPSJzZXJ2ZXIuaHRtbCI+U2VydmVyPC9hPiBlbGVtZW50LjwvcD4KKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IkF0dHJpYnV0ZXMiPgorCisgIDxzdWJzZWN0aW9uIG5hbWU9IkNvbW1vbiBBdHRyaWJ1dGVzIj4KKworICA8cD5BbGwgaW1wbGVtZW50YXRpb25zIG9mIDxzdHJvbmc+U2VydmljZTwvc3Ryb25nPgorICBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczo8L3A+CisKKyAgPGF0dHJpYnV0ZXM+CisKKyAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzTmFtZSIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgIDxwPkphdmEgY2xhc3MgbmFtZSBvZiB0aGUgaW1wbGVtZW50YXRpb24gdG8gdXNlLiAgVGhpcyBjbGFzcyBtdXN0CisgICAgICBpbXBsZW1lbnQgdGhlIDxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuU2VydmljZTwvY29kZT4gaW50ZXJmYWNlLgorICAgICAgSWYgbm8gY2xhc3MgbmFtZSBpcyBzcGVjaWZpZWQsIHRoZSBzdGFuZGFyZCBpbXBsZW1lbnRhdGlvbiB3aWxsCisgICAgICBiZSB1c2VkLjwvcD4KKyAgICA8L2F0dHJpYnV0ZT4KKworICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgcmVxdWlyZWQ9InRydWUiPgorICAgICAgPHA+VGhlIGRpc3BsYXkgbmFtZSBvZiB0aGlzIDxzdHJvbmc+U2VydmljZTwvc3Ryb25nPiwgd2hpY2ggd2lsbAorICAgICAgYmUgaW5jbHVkZWQgaW4gbG9nIG1lc3NhZ2VzIGlmIHlvdSB1dGlsaXplIHN0YW5kYXJkIENhdGFsaW5hCisgICAgICBjb21wb25lbnRzLiAgVGhlIG5hbWUgb2YgZWFjaCA8c3Ryb25nPlNlcnZpY2U8L3N0cm9uZz4gdGhhdCBpcworICAgICAgYXNzb2NpYXRlZCB3aXRoIGEgcGFydGljdWxhciA8YSBocmVmPSJzZXJ2ZXIuaHRtbCI+U2VydmVyPC9hPgorICAgICAgbXVzdCBiZSB1bmlxdWUuPC9wPgorICAgIDwvYXR0cmlidXRlPgorCisgIDwvYXR0cmlidXRlcz4KKworICA8L3N1YnNlY3Rpb24+CisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iU3RhbmRhcmQgSW1wbGVtZW50YXRpb24iPgorCisgIDxwPlRoZSBzdGFuZGFyZCBpbXBsZW1lbnRhdGlvbiBvZiA8c3Ryb25nPlNlcnZpY2U8L3N0cm9uZz4gaXMKKyAgPHN0cm9uZz5vcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRTZXJ2aWNlPC9zdHJvbmc+LgorICBJdCBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgYXR0cmlidXRlcyAoaW4gYWRkaXRpb24gdG8gdGhlCisgIGNvbW1vbiBhdHRyaWJ1dGVzIGxpc3RlZCBhYm92ZSk6PC9wPgorCisgIDxhdHRyaWJ1dGVzPgorCisgIDwvYXR0cmlidXRlcz4KKworICA8L3N1YnNlY3Rpb24+CisKKzwvc2VjdGlvbj4KKworCis8c2VjdGlvbiBuYW1lPSJOZXN0ZWQgQ29tcG9uZW50cyI+CisKKyAgPHA+VGhlIG9ubHkgY29tcG9uZW50cyB0aGF0IG1heSBiZSBuZXN0ZWQgaW5zaWRlIGEgPHN0cm9uZz5TZXJ2aWNlPC9zdHJvbmc+CisgIGVsZW1lbnQgYXJlIG9uZSBvciBtb3JlIDxzdHJvbmc+Q29ubmVjdG9yPC9zdHJvbmc+IGVsZW1lbnRzLAorICBmb2xsb3dlZCBieSBleGFjdGx5IG9uZSA8YSBocmVmPSJlbmdpbmUuaHRtbCI+RW5naW5lPC9hPiBlbGVtZW50LjwvcD4KKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IlNwZWNpYWwgRmVhdHVyZXMiPgorCisgIDxwPlRoZXJlIGFyZSBubyBzcGVjaWFsIGZlYXR1cmVzIGFzc29jaWF0ZWQgd2l0aCBhIDxzdHJvbmc+U2VydmljZTwvc3Ryb25nPi4KKyAgPC9wPgorCis8L3NlY3Rpb24+CisKKworPC9ib2R5PgorCis8L2RvY3VtZW50PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9jb25maWcvdmFsdmUueG1sIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9jb25maWcvdmFsdmUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzMjE5MDIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2NvbmZpZy92YWx2ZS54bWwKQEAgLTAsMCArMSwzODggQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCFET0NUWVBFIGRvY3VtZW50IFsKKyAgPCFFTlRJVFkgcHJvamVjdCBTWVNURU0gInByb2plY3QueG1sIj4KK10+Cis8ZG9jdW1lbnQgdXJsPSJ2YWx2ZS5odG1sIj4KKworICAmcHJvamVjdDsKKworICA8cHJvcGVydGllcz4KKyAgICA8YXV0aG9yIGVtYWlsPSJjcmFpZ21jY0BhcGFjaGUub3JnIj5DcmFpZyBSLiBNY0NsYW5haGFuPC9hdXRob3I+CisgICAgPHRpdGxlPlRoZSBWYWx2ZSBDb21wb25lbnQ8L3RpdGxlPgorICA8L3Byb3BlcnRpZXM+CisKKzxib2R5PgorCisKKzxzZWN0aW9uIG5hbWU9IkludHJvZHVjdGlvbiI+CisKKyAgPHA+QSA8c3Ryb25nPlZhbHZlPC9zdHJvbmc+IGVsZW1lbnQgcmVwcmVzZW50cyBhIGNvbXBvbmVudCB0aGF0IHdpbGwgYmUKKyAgaW5zZXJ0ZWQgaW50byB0aGUgcmVxdWVzdCBwcm9jZXNzaW5nIHBpcGVsaW5lIGZvciB0aGUgYXNzb2NpYXRlZAorICBDYXRhbGluYSBjb250YWluZXIgKDxhIGhyZWY9ImVuZ2luZS5odG1sIj5FbmdpbmU8L2E+LAorICA8YSBocmVmPSJob3N0Lmh0bWwiPkhvc3Q8L2E+LCBvciA8YSBocmVmPSJjb250ZXh0Lmh0bWwiPkNvbnRleHQ8L2E+KS4KKyAgSW5kaXZpZHVhbCBWYWx2ZXMgaGF2ZSBkaXN0aW5jdCBwcm9jZXNzaW5nIGNhcGFiaWxpdGllcywgYW5kIGFyZQorICBkZXNjcmliZWQgaW5kaXZpZHVhbGx5IGJlbG93LjwvcD4KKworICAgIDxibG9ja3F1b3RlPjxlbT4KKyAgICA8cD5UaGUgZGVzY3JpcHRpb24gYmVsb3cgdXNlcyB0aGUgdmFyaWFibGUgbmFtZSAkQ0FUQUxJTkFfSE9NRQorICAgIHRvIHJlZmVyIHRvIHRoZSBkaXJlY3RvcnkgaW50byB3aGljaCB5b3UgaGF2ZSBpbnN0YWxsZWQgVG9tY2F0IDUsCisgICAgYW5kIGlzIHRoZSBiYXNlIGRpcmVjdG9yeSBhZ2FpbnN0IHdoaWNoIG1vc3QgcmVsYXRpdmUgcGF0aHMgYXJlCisgICAgcmVzb2x2ZWQuICBIb3dldmVyLCBpZiB5b3UgaGF2ZSBjb25maWd1cmVkIFRvbWNhdCA1IGZvciBtdWx0aXBsZQorICAgIGluc3RhbmNlcyBieSBzZXR0aW5nIGEgQ0FUQUxJTkFfQkFTRSBkaXJlY3RvcnksIHlvdSBzaG91bGQgdXNlCisgICAgJENBVEFMSU5BX0JBU0UgaW5zdGVhZCBvZiAkQ0FUQUxJTkFfSE9NRSBmb3IgZWFjaCBvZiB0aGVzZQorICAgIHJlZmVyZW5jZXMuPC9wPgorICAgIDwvZW0+PC9ibG9ja3F1b3RlPgorCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iQWNjZXNzIExvZyBWYWx2ZSI+CisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iSW50cm9kdWN0aW9uIj4KKworICAgIDxwPlRoZSA8c3Ryb25nPkFjY2VzcyBMb2cgVmFsdmU8L3N0cm9uZz4gY3JlYXRlcyBsb2cgZmlsZXMgaW4gdGhlIHNhbWUKKyAgICBmb3JtYXQgYXMgdGhvc2UgY3JlYXRlZCBieSBzdGFuZGFyZCB3ZWIgc2VydmVycy4gIFRoZXNlIGxvZ3MgY2FuIGxhdGVyCisgICAgYmUgYW5hbHl6ZWQgYnkgc3RhbmRhcmQgbG9nIGFuYWx5c2lzIHRvb2xzIHRvIHRyYWNrIHBhZ2UgaGl0IGNvdW50cywKKyAgICB1c2VyIHNlc3Npb24gYWN0aXZpdHksIGFuZCBzbyBvbi4gIFRoZSBmaWxlcyBwcm9kdWNlcyBieSB0aGlzIDxjb2RlPlZhbHZlPC9jb2RlPgorICAgIGFyZSByb2xsZWQgb3ZlciBuaWdodGx5IGF0IG1pZG5pZ2h0LiAgVGhpcyA8Y29kZT5WYWx2ZTwvY29kZT4KKyAgICBtYXkgYmUgYXNzb2NpYXRlZCB3aXRoIGFueSBDYXRhbGluYSBjb250YWluZXIgKDxjb2RlPkNvbnRleHQ8L2NvZGU+LAorICAgIDxjb2RlPkhvc3Q8L2NvZGU+LCBvciA8Y29kZT5FbmdpbmU8L2NvZGU+KSwgYW5kCisgICAgd2lsbCByZWNvcmQgQUxMIHJlcXVlc3RzIHByb2Nlc3NlZCBieSB0aGF0IGNvbnRhaW5lci48L3A+CisKKyAgPC9zdWJzZWN0aW9uPgorCisgIDxzdWJzZWN0aW9uIG5hbWU9IkF0dHJpYnV0ZXMiPgorCisgICAgPHA+VGhlIDxzdHJvbmc+QWNjZXNzIExvZyBWYWx2ZTwvc3Ryb25nPiBzdXBwb3J0cyB0aGUgZm9sbG93aW5nCisgICAgY29uZmlndXJhdGlvbiBhdHRyaWJ1dGVzOjwvcD4KKworICAgIDxhdHRyaWJ1dGVzPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzTmFtZSIgcmVxdWlyZWQ9InRydWUiPgorICAgICAgICA8cD5KYXZhIGNsYXNzIG5hbWUgb2YgdGhlIGltcGxlbWVudGF0aW9uIHRvIHVzZS4gIFRoaXMgTVVTVCBiZSBzZXQgdG8KKyAgICAgICAgPHN0cm9uZz5vcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcy5BY2Nlc3NMb2dWYWx2ZTwvc3Ryb25nPi48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkaXJlY3RvcnkiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPkFic29sdXRlIG9yIHJlbGF0aXZlIHBhdGhuYW1lIG9mIGEgZGlyZWN0b3J5IGluIHdoaWNoIGxvZyBmaWxlcworICAgICAgICBjcmVhdGVkIGJ5IHRoaXMgdmFsdmUgd2lsbCBiZSBwbGFjZWQuICBJZiBhIHJlbGF0aXZlIHBhdGggaXMKKyAgICAgICAgc3BlY2lmaWVkLCBpdCBpcyBpbnRlcnByZXRlZCBhcyByZWxhdGl2ZSB0byAkQ0FUQUxJTkFfSE9NRS4gIElmCisgICAgICAgIG5vIGRpcmVjdG9yeSBhdHRyaWJ1dGUgaXMgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCB2YWx1ZSBpcyAibG9ncyIKKyAgICAgICAgKHJlbGF0aXZlIHRvICRDQVRBTElOQV9IT01FKS48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwYXR0ZXJuIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgICA8cD5BIGZvcm1hdHRpbmcgbGF5b3V0IGlkZW50aWZ5aW5nIHRoZSB2YXJpb3VzIGluZm9ybWF0aW9uIGZpZWxkcworICAgICAgICBmcm9tIHRoZSByZXF1ZXN0IGFuZCByZXNwb25zZSB0byBiZSBsb2dnZWQsIG9yIHRoZSB3b3JkCisgICAgICAgIDxjb2RlPmNvbW1vbjwvY29kZT4gb3IgPGNvZGU+Y29tYmluZWQ8L2NvZGU+IHRvIHNlbGVjdCBhCisgICAgICAgIHN0YW5kYXJkIGZvcm1hdC4gIFNlZSBiZWxvdyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBjb25maWd1cmluZworICAgICAgICB0aGlzIGF0dHJpYnV0ZS48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwcmVmaXgiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPlRoZSBwcmVmaXggYWRkZWQgdG8gdGhlIHN0YXJ0IG9mIGVhY2ggbG9nIGZpbGUncyBuYW1lLiAgSWYgbm90CisgICAgICAgIHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgdmFsdWUgaXMgImFjY2Vzc19sb2cuIi4gIFRvIHNwZWNpZnkgbm8gcHJlZml4LAorICAgICAgICB1c2UgYSB6ZXJvLWxlbmd0aCBzdHJpbmcuPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icmVzb2x2ZUhvc3RzIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgICA8cD5TZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4gdG8gY29udmVydCB0aGUgSVAgYWRkcmVzcyBvZiB0aGUgcmVtb3RlCisgICAgICAgIGhvc3QgaW50byB0aGUgY29ycmVzcG9uZGluZyBob3N0IG5hbWUgdmlhIGEgRE5TIGxvb2t1cC4gIFNldCB0bworICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gdG8gc2tpcCB0aGlzIGxvb2t1cCwgYW5kIHJlcG9ydCB0aGUgcmVtb3RlIElQCisgICAgICAgIGFkZHJlc3MgaW5zdGVhZC48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzdWZmaXgiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPlRoZSBzdWZmaXggYWRkZWQgdG8gdGhlIGVuZCBvZiBlYWNoIGxvZyBmaWxlJ3MgbmFtZS4gIElmIG5vdAorICAgICAgICBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0IHZhbHVlIGlzICIiLiAgVG8gc3BlY2lmeSBubyBzdWZmaXgsCisgICAgICAgIHVzZSBhIHplcm8tbGVuZ3RoIHN0cmluZy48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJyb3RhdGFibGUiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPkRlYWZ1bHQgdHJ1ZS4gRmxhZyB0byBkZXRlcm1pbmUgaWYgbG9nIHJvdGF0aW9uIHNob3VsZCBvY2N1ci4KKyAgICAgICAgICAgSWYgc2V0IHRvIGZhbHNlLCB0aGVuIHRoaXMgZmlsZSBpcyBuZXZlciByb3RhdGVkIGFuZAorICAgICAgICAgICA8dHQ+ZmlsZURhdGVGb3JtYXQ8L3R0PiBpcyBpZ25vcmVkLiBVc2Ugd2l0aCBjYXV0aW9uIQorICAgICAgICA8L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb25kaXRpb24iIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPlR1cm5zIG9uIGNvbmRpdGlvbmFsIGxvZ2dpbmcuIElmIHNldCwgcmVxdWVzdHMgd2lsbCBiZQorICAgICAgICAgICBsb2dnZWQgb25seSBpZiA8dHQ+U2VydmxldFJlcXVlc3QuZ2V0QXR0cmlidXRlKCk8L3R0PiBpcworICAgICAgICAgICBudWxsLiBGb3IgZXhhbXBsZSwgaWYgdGhpcyB2YWx1ZSBpcyBzZXQgdG8KKyAgICAgICAgICAgPHR0Pmp1bms8L3R0PiwgdGhlbiBhIHBhcnRpY3VsYXIgcmVxdWVzdCB3aWxsIG9ubHkgYmUgbG9nZ2VkCisgICAgICAgICAgIGlmIDx0dD5TZXJ2bGV0UmVxdWVzdC5nZXRBdHRyaWJ1dGUoImp1bmsiKSA9PSBudWxsPC90dD4uCisgICAgICAgICAgIFRoZSB1c2Ugb2YgRmlsdGVycyBpcyBhbiBlYXN5IHdheSB0byBzZXQvdW5zZXQgdGhlIGF0dHJpYnV0ZQorICAgICAgICAgICBpbiB0aGUgU2VydmxldFJlcXVlc3Qgb24gbWFueSBkaWZmZXJlbnQgcmVxdWVzdHMuCisgICAgICAgIDwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9ImZpbGVEYXRlRm9ybWF0IiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgICA8cD5BbGxvd3MgYSBjdXN0b21pemVkIGRhdGUgZm9ybWF0IGluIHRoZSBhY2Nlc3MgbG9nIGZpbGUgbmFtZS4KKyAgICAgICAgICAgVGhlIGRhdGUgZm9ybWF0IGFsc28gZGVjaWRlcyBob3cgb2Z0ZW4gdGhlIGZpbGUgaXMgcm90YXRlZC4KKyAgICAgICAgICAgSWYgeW91IHdpc2ggdG8gcm90YXRlIGV2ZXJ5IGhvdXIsIHRoZW4gc2V0IHRoaXMgdmFsdWUKKyAgICAgICAgICAgdG86IDx0dD55eXl5LU1NLWRkLkhIPC90dD4KKyAgICAgICAgPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICA8L2F0dHJpYnV0ZXM+CisKKyAgICA8cD5WYWx1ZXMgZm9yIHRoZSA8Y29kZT5wYXR0ZXJuPC9jb2RlPiBhdHRyaWJ1dGUgYXJlIG1hZGUgdXAgb2YgbGl0ZXJhbAorICAgIHRleHQgc3RyaW5ncywgY29tYmluZWQgd2l0aCBwYXR0ZXJuIGlkZW50aWZpZXJzIHByZWZpeGVkIGJ5IHRoZSAiJSIKKyAgICBjaGFyYWN0ZXIgdG8gY2F1c2UgcmVwbGFjZW1lbnQgYnkgdGhlIGNvcnJlc3BvbmRpbmcgdmFyaWFibGUgdmFsdWUgZnJvbQorICAgIHRoZSBjdXJyZW50IHJlcXVlc3QgYW5kIHJlc3BvbnNlLiAgVGhlIGZvbGxvd2luZyBwYXR0ZXJuIGNvZGVzIGFyZQorICAgIHN1cHBvcnRlZDo8L3A+CisgICAgPHVsPgorICAgIDxsaT48Yj4lYTwvYj4gLSBSZW1vdGUgSVAgYWRkcmVzczwvbGk+CisgICAgPGxpPjxiPiVBPC9iPiAtIExvY2FsIElQIGFkZHJlc3M8L2xpPgorICAgIDxsaT48Yj4lYjwvYj4gLSBCeXRlcyBzZW50LCBleGNsdWRpbmcgSFRUUCBoZWFkZXJzLCBvciAnLScgaWYgemVybzwvbGk+CisgICAgPGxpPjxiPiVCPC9iPiAtIEJ5dGVzIHNlbnQsIGV4Y2x1ZGluZyBIVFRQIGhlYWRlcnM8L2xpPgorICAgIDxsaT48Yj4laDwvYj4gLSBSZW1vdGUgaG9zdCBuYW1lIChvciBJUCBhZGRyZXNzIGlmCisgICAgICAgIDxjb2RlPnJlc29sdmVIb3N0czwvY29kZT4gaXMgZmFsc2UpPC9saT4KKyAgICA8bGk+PGI+JUg8L2I+IC0gUmVxdWVzdCBwcm90b2NvbDwvbGk+CisgICAgPGxpPjxiPiVsPC9iPiAtIFJlbW90ZSBsb2dpY2FsIHVzZXJuYW1lIGZyb20gaWRlbnRkIChhbHdheXMgcmV0dXJucworICAgICAgICAnLScpPC9saT4KKyAgICA8bGk+PGI+JW08L2I+IC0gUmVxdWVzdCBtZXRob2QgKEdFVCwgUE9TVCwgZXRjLik8L2xpPgorICAgIDxsaT48Yj4lcDwvYj4gLSBMb2NhbCBwb3J0IG9uIHdoaWNoIHRoaXMgcmVxdWVzdCB3YXMgcmVjZWl2ZWQ8L2xpPgorICAgIDxsaT48Yj4lcTwvYj4gLSBRdWVyeSBzdHJpbmcgKHByZXBlbmRlZCB3aXRoIGEgJz8nIGlmIGl0IGV4aXN0cyk8L2xpPgorICAgIDxsaT48Yj4lcjwvYj4gLSBGaXJzdCBsaW5lIG9mIHRoZSByZXF1ZXN0IChtZXRob2QgYW5kIHJlcXVlc3QgVVJJKTwvbGk+CisgICAgPGxpPjxiPiVzPC9iPiAtIEhUVFAgc3RhdHVzIGNvZGUgb2YgdGhlIHJlc3BvbnNlPC9saT4KKyAgICA8bGk+PGI+JVM8L2I+IC0gVXNlciBzZXNzaW9uIElEPC9saT4KKyAgICA8bGk+PGI+JXQ8L2I+IC0gRGF0ZSBhbmQgdGltZSwgaW4gQ29tbW9uIExvZyBGb3JtYXQ8L2xpPgorICAgIDxsaT48Yj4ldTwvYj4gLSBSZW1vdGUgdXNlciB0aGF0IHdhcyBhdXRoZW50aWNhdGVkIChpZiBhbnkpLCBlbHNlICctJzwvbGk+CisgICAgPGxpPjxiPiVVPC9iPiAtIFJlcXVlc3RlZCBVUkwgcGF0aDwvbGk+CisgICAgPGxpPjxiPiV2PC9iPiAtIExvY2FsIHNlcnZlciBuYW1lPC9saT4KKyAgICA8bGk+PGI+JUQ8L2I+IC0gVGltZSB0YWtlbiB0byBwcm9jZXNzIHRoZSByZXF1ZXN0LCBpbiBtaWxsaXM8L2xpPgorICAgIDxsaT48Yj4lVDwvYj4gLSBUaW1lIHRha2VuIHRvIHByb2Nlc3MgdGhlIHJlcXVlc3QsIGluIHNlY29uZHM8L2xpPgorICAgIDwvdWw+CisKKyAgICA8cD4KKyAgICBUaGVyZSBpcyBhbHNvIHN1cHBvcnQgdG8gd3JpdGUgaW5mb3JtYXRpb24gZnJvbSB0aGUgY29va2llLCBpbmNvbWluZworICAgIGhlYWRlciwgdGhlIFNlc3Npb24gb3Igc29tZXRoaW5nIGVsc2UgaW4gdGhlIFNlcnZsZXRSZXF1ZXN0LgorICAgIEl0IGlzIG1vZGVsZWQgYWZ0ZXIgdGhlIGFwYWNoZSBzeW50YXg6CisgICAgPHVsPgorICAgIDxsaT48Yj48Y29kZT4le3h4eH1pPC9jb2RlPjwvYj4gZm9yIGluY29taW5nIGhlYWRlcnM8L2xpPgorICAgIDxsaT48Yj48Y29kZT4le3h4eH1jPC9jb2RlPjwvYj4gZm9yIGEgc3BlY2lmaWMgY29va2llPC9saT4KKyAgICA8bGk+PGI+PGNvZGU+JXt4eHh9cjwvY29kZT48L2I+IHh4eCBpcyBhbiBhdHRyaWJ1dGUgaW4gdGhlIFNlcnZsZXRSZXF1ZXN0PC9saT4KKyAgICA8bGk+PGI+PGNvZGU+JXt4eHh9czwvY29kZT48L2I+IHh4eCBpcyBhbiBhdHRyaWJ1dGUgaW4gdGhlIEh0dHBTZXNzaW9uPC9saT4KKyAgICA8L3VsPgorICAgIDwvcD4KKworCisgICAgPHA+VGhlIHNob3J0aGFuZCBwYXR0ZXJuIG5hbWUgPGNvZGU+Y29tbW9uPC9jb2RlPiAod2hpY2ggaXMgYWxzbyB0aGUKKyAgICBkZWZhdWx0KSBjb3JyZXNwb25kcyB0byA8c3Ryb25nPiVoICVsICV1ICV0ICIlciIgJXMgJWIiPC9zdHJvbmc+LjwvcD4KKworICAgIDxwPlRoZSBzaG9ydGhhbmQgcGF0dGVybiBuYW1lIDxjb2RlPmNvbWJpbmVkPC9jb2RlPiBhcHBlbmRzIHRoZQorICAgIHZhbHVlcyBvZiB0aGUgPGNvZGU+UmVmZXJlcjwvY29kZT4gYW5kIDxjb2RlPlVzZXItQWdlbnQ8L2NvZGU+IGhlYWRlcnMsCisgICAgZWFjaCBpbiBkb3VibGUgcXVvdGVzLCB0byB0aGUgPGNvZGU+Y29tbW9uPC9jb2RlPiBwYXR0ZXJuCisgICAgZGVzY3JpYmVkIGluIHRoZSBwcmV2aW91cyBwYXJhZ3JhcGguPC9wPgorCisgIDwvc3Vic2VjdGlvbj4KKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IlJlbW90ZSBBZGRyZXNzIEZpbHRlciI+CisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iSW50cm9kdWN0aW9uIj4KKworICAgIDxwPlRoZSA8c3Ryb25nPlJlbW90ZSBBZGRyZXNzIEZpbHRlcjwvc3Ryb25nPiBhbGxvd3MgeW91IHRvIGNvbXBhcmUgdGhlCisgICAgSVAgYWRkcmVzcyBvZiB0aGUgY2xpZW50IHRoYXQgc3VibWl0dGVkIHRoaXMgcmVxdWVzdCBhZ2FpbnN0IG9uZSBvciBtb3JlCisgICAgPGVtPnJlZ3VsYXIgZXhwcmVzc2lvbnM8L2VtPiwgYW5kIGVpdGhlciBhbGxvdyB0aGUgcmVxdWVzdCB0byBjb250aW51ZQorICAgIG9yIHJlZnVzZSB0byBwcm9jZXNzIHRoZSByZXF1ZXN0IGZyb20gdGhpcyBjbGllbnQuICBBIFJlbW90ZSBBZGRyZXNzCisgICAgRmlsdGVyIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggYW55IENhdGFsaW5hIGNvbnRhaW5lcgorICAgICg8YSBocmVmPSJlbmdpbmUuaHRtbCI+RW5naW5lPC9hPiwgPGEgaHJlZj0iaG9zdC5odG1sIj5Ib3N0PC9hPiwgb3IKKyAgICA8YSBocmVmPSJjb250ZXh0Lmh0bWwiPkNvbnRleHQ8L2E+KSwgYW5kIG11c3QgYWNjZXB0IGFueSByZXF1ZXN0CisgICAgcHJlc2VudGVkIHRvIHRoaXMgY29udGFpbmVyIGZvciBwcm9jZXNzaW5nIGJlZm9yZSBpdCB3aWxsIGJlIHBhc3NlZCBvbi48L3A+CisKKyAgICA8cD5UaGUgc3ludGF4IGZvciA8ZW0+cmVndWxhciBleHByZXNzaW9uczwvZW0+IGlzIGRpZmZlcmVudCB0aGFuIHRoYXQgZm9yCisgICAgJ3N0YW5kYXJkJyB3aWxkY2FyZCBtYXRjaGluZy4gVG9tY2F0IHVzZXMgdGhlCisgICAgPGEgaHJlZj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9yZWdleHAvIj5KYWthcnRhIFJlZ2V4cDwvYT4gbGlicmFyeS4KKyAgICBQbGVhc2UgY29uc3VsdCB0aGUgUmVnZXhwIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMgb2YgdGhlIGV4cHJlc3Npb25zCisgICAgc3VwcG9ydGVkLjwvcD4KKworICA8L3N1YnNlY3Rpb24+CisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iQXR0cmlidXRlcyI+CisKKyAgICA8cD5UaGUgPHN0cm9uZz5SZW1vdGUgQWRkcmVzcyBGaWx0ZXI8L3N0cm9uZz4gc3VwcG9ydHMgdGhlIGZvbGxvd2luZworICAgIGNvbmZpZ3VyYXRpb24gYXR0cmlidXRlczo8L3A+CisKKyAgICA8YXR0cmlidXRlcz4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc05hbWUiIHJlcXVpcmVkPSJ0cnVlIj4KKyAgICAgICAgPHA+SmF2YSBjbGFzcyBuYW1lIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiB0byB1c2UuICBUaGlzIE1VU1QgYmUgc2V0IHRvCisgICAgICAgIDxzdHJvbmc+b3JnLmFwYWNoZS5jYXRhbGluYS52YWx2ZXMuUmVtb3RlQWRkclZhbHZlPC9zdHJvbmc+LjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9ImFsbG93IiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgICA8cD5BIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIDxlbT5yZWd1bGFyIGV4cHJlc3Npb248L2VtPiBwYXR0ZXJucworICAgICAgICB0aGF0IHRoZSByZW1vdGUgY2xpZW50J3MgSVAgYWRkcmVzcyBpcyBjb21wYXJlZCB0by4gIElmIHRoaXMgYXR0cmlidXRlCisgICAgICAgIGlzIHNwZWNpZmllZCwgdGhlIHJlbW90ZSBhZGRyZXNzIE1VU1QgbWF0Y2ggZm9yIHRoaXMgcmVxdWVzdCB0byBiZQorICAgICAgICBhY2NlcHRlZC4gIElmIHRoaXMgYXR0cmlidXRlIGlzIG5vdCBzcGVjaWZpZWQsIGFsbCByZXF1ZXN0cyB3aWxsIGJlCisgICAgICAgIGFjY2VwdGVkIFVOTEVTUyB0aGUgcmVtb3RlIGFkZHJlc3MgbWF0Y2hlcyBhIDxjb2RlPmRlbnk8L2NvZGU+CisgICAgICAgIHBhdHRlcm4uPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVueSIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+QSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiA8ZW0+cmVndWxhciBleHByZXNzaW9uPC9lbT4gcGF0dGVybnMKKyAgICAgICAgdGhhdCB0aGUgcmVtb3RlIGNsaWVudCdzIElQIGFkZHJlc3MgaXMgY29tcGFyZWQgdG8uICBJZiB0aGlzIGF0dHJpYnV0ZQorICAgICAgICBpcyBzcGVjaWZpZWQsIHRoZSByZW1vdGUgYWRkcmVzcyBNVVNUIE5PVCBtYXRjaCBmb3IgdGhpcyByZXF1ZXN0IHRvIGJlCisgICAgICAgIGFjY2VwdGVkLiAgSWYgdGhpcyBhdHRyaWJ1dGUgaXMgbm90IHNwZWNpZmllZCwgcmVxdWVzdCBhY2NlcHRhbmNlIGlzCisgICAgICAgIGdvdmVybmVkIHNvbGVseSBieSB0aGUgPGNvZGU+YWNjZXB0PC9jb2RlPiBhdHRyaWJ1dGUuPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICA8L2F0dHJpYnV0ZXM+CisKKyAgPC9zdWJzZWN0aW9uPgorCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iUmVtb3RlIEhvc3QgRmlsdGVyIj4KKworICA8c3Vic2VjdGlvbiBuYW1lPSJJbnRyb2R1Y3Rpb24iPgorCisgICAgPHA+VGhlIDxzdHJvbmc+UmVtb3RlIEhvc3QgRmlsdGVyPC9zdHJvbmc+IGFsbG93cyB5b3UgdG8gY29tcGFyZSB0aGUKKyAgICBob3N0bmFtZSBvZiB0aGUgY2xpZW50IHRoYXQgc3VibWl0dGVkIHRoaXMgcmVxdWVzdCBhZ2FpbnN0IG9uZSBvciBtb3JlCisgICAgPGVtPnJlZ3VsYXIgZXhwcmVzc2lvbnM8L2VtPiwgYW5kIGVpdGhlciBhbGxvdyB0aGUgcmVxdWVzdCB0byBjb250aW51ZQorICAgIG9yIHJlZnVzZSB0byBwcm9jZXNzIHRoZSByZXF1ZXN0IGZyb20gdGhpcyBjbGllbnQuICBBIFJlbW90ZSBIb3N0CisgICAgRmlsdGVyIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggYW55IENhdGFsaW5hIGNvbnRhaW5lcgorICAgICg8YSBocmVmPSJlbmdpbmUuaHRtbCI+RW5naW5lPC9hPiwgPGEgaHJlZj0iaG9zdC5odG1sIj5Ib3N0PC9hPiwgb3IKKyAgICA8YSBocmVmPSJjb250ZXh0Lmh0bWwiPkNvbnRleHQ8L2E+KSwgYW5kIG11c3QgYWNjZXB0IGFueSByZXF1ZXN0CisgICAgcHJlc2VudGVkIHRvIHRoaXMgY29udGFpbmVyIGZvciBwcm9jZXNzaW5nIGJlZm9yZSBpdCB3aWxsIGJlIHBhc3NlZCBvbi48L3A+CisKKyAgICA8cD5UaGUgc3ludGF4IGZvciA8ZW0+cmVndWxhciBleHByZXNzaW9uczwvZW0+IGlzIGRpZmZlcmVudCB0aGFuIHRoYXQgZm9yCisgICAgJ3N0YW5kYXJkJyB3aWxkY2FyZCBtYXRjaGluZy4gVG9tY2F0IHVzZXMgdGhlCisgICAgPGEgaHJlZj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9yZWdleHAvIj5KYWthcnRhIFJlZ2V4cDwvYT4gbGlicmFyeS4KKyAgICBQbGVhc2UgY29uc3VsdCB0aGUgUmVnZXhwIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMgb2YgdGhlIGV4cHJlc3Npb25zCisgICAgc3VwcG9ydGVkLjwvcD4KKworICA8L3N1YnNlY3Rpb24+CisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iQXR0cmlidXRlcyI+CisKKyAgICA8cD5UaGUgPHN0cm9uZz5SZW1vdGUgSG9zdCBGaWx0ZXI8L3N0cm9uZz4gc3VwcG9ydHMgdGhlIGZvbGxvd2luZworICAgIGNvbmZpZ3VyYXRpb24gYXR0cmlidXRlczo8L3A+CisKKyAgICA8YXR0cmlidXRlcz4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc05hbWUiIHJlcXVpcmVkPSJ0cnVlIj4KKyAgICAgICAgPHA+SmF2YSBjbGFzcyBuYW1lIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiB0byB1c2UuICBUaGlzIE1VU1QgYmUgc2V0IHRvCisgICAgICAgIDxzdHJvbmc+b3JnLmFwYWNoZS5jYXRhbGluYS52YWx2ZXMuUmVtb3RlSG9zdFZhbHZlPC9zdHJvbmc+LjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9ImFsbG93IiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgICA8cD5BIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIDxlbT5yZWd1bGFyIGV4cHJlc3Npb248L2VtPiBwYXR0ZXJucworICAgICAgICB0aGF0IHRoZSByZW1vdGUgY2xpZW50J3MgaG9zdG5hbWUgaXMgY29tcGFyZWQgdG8uICBJZiB0aGlzIGF0dHJpYnV0ZQorICAgICAgICBpcyBzcGVjaWZpZWQsIHRoZSByZW1vdGUgaG9zdG5hbWUgTVVTVCBtYXRjaCBmb3IgdGhpcyByZXF1ZXN0IHRvIGJlCisgICAgICAgIGFjY2VwdGVkLiAgSWYgdGhpcyBhdHRyaWJ1dGUgaXMgbm90IHNwZWNpZmllZCwgYWxsIHJlcXVlc3RzIHdpbGwgYmUKKyAgICAgICAgYWNjZXB0ZWQgVU5MRVNTIHRoZSByZW1vdGUgaG9zdG5hbWUgbWF0Y2hlcyBhIDxjb2RlPmRlbnk8L2NvZGU+CisgICAgICAgIHBhdHRlcm4uPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVueSIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+QSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiA8ZW0+cmVndWxhciBleHByZXNzaW9uPC9lbT4gcGF0dGVybnMKKyAgICAgICAgdGhhdCB0aGUgcmVtb3RlIGNsaWVudCdzIGhvc3RuYW1lIGlzIGNvbXBhcmVkIHRvLiAgSWYgdGhpcyBhdHRyaWJ1dGUKKyAgICAgICAgaXMgc3BlY2lmaWVkLCB0aGUgcmVtb3RlIGhvc3RuYW1lIE1VU1QgTk9UIG1hdGNoIGZvciB0aGlzIHJlcXVlc3QgdG8gYmUKKyAgICAgICAgYWNjZXB0ZWQuICBJZiB0aGlzIGF0dHJpYnV0ZSBpcyBub3Qgc3BlY2lmaWVkLCByZXF1ZXN0IGFjY2VwdGFuY2UgaXMKKyAgICAgICAgZ292ZXJuZWQgc29sZWx5IGJ5IHRoZSA8Y29kZT5hY2NlcHQ8L2NvZGU+IGF0dHJpYnV0ZS48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgIDwvYXR0cmlidXRlcz4KKworICA8L3N1YnNlY3Rpb24+CisKKzwvc2VjdGlvbj4KKworCis8c2VjdGlvbiBuYW1lPSJSZXF1ZXN0IER1bXBlciBWYWx2ZSI+CisKKworICA8c3Vic2VjdGlvbiBuYW1lPSJJbnRyb2R1Y3Rpb24iPgorCisgICAgPHA+VGhlIDxlbT5SZXF1ZXN0IER1bXBlciBWYWx2ZTwvZW0+IGlzIGEgdXNlZnVsIHRvb2wgaW4gZGVidWdnaW5nCisgICAgaW50ZXJhY3Rpb25zIHdpdGggYSBjbGllbnQgYXBwbGljYXRpb24gKG9yIGJyb3dzZXIpIHRoYXQgaXMgc2VuZGluZworICAgIEhUVFAgcmVxdWVzdHMgdG8geW91ciBUb21jYXQtYmFzZWQgc2VydmVyLiAgV2hlbiBjb25maWd1cmVkLCBpdCBjYXVzZXMKKyAgICBkZXRhaWxzIGFib3V0IGVhY2ggcmVxdWVzdCBwcm9jZXNzZWQgYnkgaXRzIGFzc29jaWF0ZWQgPGNvZGU+RW5naW5lPC9jb2RlPiwgCisgICAgPGNvZGU+SG9zdDwvY29kZT4sIG9yIDxjb2RlPkNvbnRleHQ8L2NvZGU+IHRvIGJlIGxvZ2dlZCBhY2NvcmRpbmcgdG8gCisgICAgdGhlIGxvZ2dpbmcgY29uZmlndXJhdGlvbiBmb3IgdGhhdCBjb250YWluZXIuPC9wPgorCisgICAgPHA+PHN0cm9uZz5XQVJOSU5HOiBVc2luZyB0aGlzIHZhbHZlIGhhcyBzaWRlLWVmZmVjdHMuPC9zdHJvbmc+ICBUaGUKKyAgICBvdXRwdXQgZnJvbSB0aGlzIHZhbHZlIGluY2x1ZGVzIGFueSBwYXJhbWV0ZXJzIGluY2x1ZGVkIHdpdGggdGhlIHJlcXVlc3QuCisgICAgVGhlIHBhcmFtZXRlcnMgd2lsbCBiZSBkZWNvZGVkIHVzaW5nIHRoZSBkZWZhdWx0IHBsYXRmb3JtIGVuY29kaW5nLiBBbnkKKyAgICBzdWJzZXF1ZW50IGNhbGxzIHRvIDxjb2RlPnJlcXVlc3Quc2V0Q2hhcmFjdGVyRW5jb2RpbmcoKTwvY29kZT4gd2l0aGluCisgICAgdGhlIHdlYiBhcHBsaWNhdGlvbiB3aWxsIGhhdmUgbm8gZWZmZWN0LjwvcD4KKworICA8L3N1YnNlY3Rpb24+CisKKworICA8c3Vic2VjdGlvbiBuYW1lPSJBdHRyaWJ1dGVzIj4KKworICAgIDxwPlRoZSA8c3Ryb25nPlJlcXVlc3QgRHVtcGVyIFZhbHZlPC9zdHJvbmc+IHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcKKyAgICBjb25maWd1cmF0aW9uIGF0dHJpYnV0ZXM6PC9wPgorCisgICAgPGF0dHJpYnV0ZXM+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NOYW1lIiByZXF1aXJlZD0idHJ1ZSI+CisgICAgICAgIDxwPkphdmEgY2xhc3MgbmFtZSBvZiB0aGUgaW1wbGVtZW50YXRpb24gdG8gdXNlLiAgVGhpcyBNVVNUIGJlIHNldCB0bworICAgICAgICA8c3Ryb25nPm9yZy5hcGFjaGUuY2F0YWxpbmEudmFsdmVzLlJlcXVlc3REdW1wZXJWYWx2ZTwvc3Ryb25nPi48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgIDwvYXR0cmlidXRlcz4KKworICA8L3N1YnNlY3Rpb24+CisKKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IlNpbmdsZSBTaWduIE9uIFZhbHZlIj4KKworICA8c3Vic2VjdGlvbiBuYW1lPSJJbnRyb2R1Y3Rpb24iPgorCisgICAgPHA+VGhlIDxlbT5TaW5nbGUgU2lnbiBPbiBWYWxlPC9lbT4gaXMgdXRpbGl6ZWQgd2hlbiB5b3Ugd2lzaCB0byBnaXZlIHVzZXJzCisgICAgdGhlIGFiaWxpdHkgdG8gc2lnbiBvbiB0byBhbnkgb25lIG9mIHRoZSB3ZWIgYXBwbGljYXRpb25zIGFzc29jaWF0ZWQgd2l0aAorICAgIHlvdXIgdmlydHVhbCBob3N0LCBhbmQgdGhlbiBoYXZlIHRoZWlyIGlkZW50aXR5IHJlY29nbml6ZWQgYnkgYWxsIG90aGVyCisgICAgd2ViIGFwcGxpY2F0aW9ucyBvbiB0aGUgc2FtZSB2aXJ0dWFsIGhvc3QuPC9wPgorCisgICAgPHA+U2VlIHRoZSA8YSBocmVmPSJob3N0Lmh0bWwjU2luZ2xlIFNpZ24gT24iPlNpbmdsZSBTaWduIE9uPC9hPiBzcGVjaWFsCisgICAgZmVhdHVyZSBvbiB0aGUgPHN0cm9uZz5Ib3N0PC9zdHJvbmc+IGVsZW1lbnQgZm9yIG1vcmUgaW5mb3JtYXRpb24uPC9wPgorCisgIDwvc3Vic2VjdGlvbj4KKworCisgIDxzdWJzZWN0aW9uIG5hbWU9IkF0dHJpYnV0ZXMiPgorCisgICAgPHA+VGhlIDxzdHJvbmc+U2luZ2xlIFNpZ24gT248L3N0cm9uZz4gVmFsdmUgc3VwcG9ydHMgdGhlIGZvbGxvd2luZworICAgIGNvbmZpZ3VyYXRpb24gYXR0cmlidXRlczo8L3A+CisKKyAgICA8YXR0cmlidXRlcz4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc05hbWUiIHJlcXVpcmVkPSJ0cnVlIj4KKyAgICAgICAgPHA+SmF2YSBjbGFzcyBuYW1lIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiB0byB1c2UuICBUaGlzIE1VU1QgYmUgc2V0IHRvCisgICAgICAgIDxzdHJvbmc+b3JnLmFwYWNoZS5jYXRhbGluYS5hdXRoZW50aWNhdG9yLlNpbmdsZVNpZ25Pbjwvc3Ryb25nPi48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJyZXF1aXJlUmVhdXRoZW50aWNhdGlvbiIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+RGVmYXVsdCBmYWxzZS4gRmxhZyB0byBkZXRlcm1pbmUgd2hldGhlciBlYWNoIHJlcXVlc3QgbmVlZHMgdG8gYmUgCisgICAgICAgIHJlYXV0aGVudGljYXRlZCB0byB0aGUgc2VjdXJpdHkgPHN0cm9uZz5SZWFsbTwvc3Ryb25nPi4gSWYgInRydWUiLCB0aGlzCisgICAgICAgIFZhbHZlIHVzZXMgY2FjaGVkIHNlY3VyaXR5IGNyZWRlbnRpYWxzICh1c2VybmFtZSBhbmQgcGFzc3dvcmQpIHRvCisgICAgICAgIHJlYXV0aGVudGljYXRlIHRvIHRoZSA8c3Ryb25nPlJlYWxtPC9zdHJvbmc+IGVhY2ggcmVxdWVzdCBhc3NvY2lhdGVkIAorICAgICAgICB3aXRoIGFuIFNTTyBzZXNzaW9uLiAgSWYgImZhbHNlIiwgdGhlIFZhbHZlIGNhbiBpdHNlbGYgYXV0aGVudGljYXRlIAorICAgICAgICByZXF1ZXN0cyBiYXNlZCBvbiB0aGUgcHJlc2VuY2Ugb2YgYSB2YWxpZCBTU08gY29va2llLCB3aXRob3V0IAorICAgICAgICByZWNoZWNraW5nIHdpdGggdGhlIDxzdHJvbmc+UmVhbG08L3N0cm9uZz4uPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisgCisKKyAgICA8L2F0dHJpYnV0ZXM+CisKKyAgPC9zdWJzZWN0aW9uPgorCisKKzwvc2VjdGlvbj4KKworCis8L2JvZHk+CisKKworPC9kb2N1bWVudD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvY29ubmVjdG9ycy54bWwgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2Nvbm5lY3RvcnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyNzEwMWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2Nvbm5lY3RvcnMueG1sCkBAIC0wLDAgKzEsNjEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCFET0NUWVBFIGRvY3VtZW50IFsKKyAgPCFFTlRJVFkgcHJvamVjdCBTWVNURU0gInByb2plY3QueG1sIj4KK10+Cis8ZG9jdW1lbnQgdXJsPSJjb25uZWN0b3JzLmh0bWwiPgorCisgICAgJnByb2plY3Q7CisKKyAgICA8cHJvcGVydGllcz4KKyAgICAgICAgPGF1dGhvciBlbWFpbD0icmVtbUBhcGFjaGUub3JnIj5SZW15IE1hdWNoZXJhdDwvYXV0aG9yPgorICAgICAgICA8dGl0bGU+Q29ubmVjdG9ycyBIb3cgVG88L3RpdGxlPgorICAgIDwvcHJvcGVydGllcz4KKworPGJvZHk+CisKKzxzZWN0aW9uIG5hbWU9IkludHJvZHVjdGlvbiI+CisKKzxwPkNob29zaW5nIGEgY29ubmVjdG9yIHRvIHVzZSB3aXRoIFRvbWNhdCBjYW4gYmUgZGlmZmljdWx0LiBUaGlzIHBhZ2Ugd2lsbAorbGlzdCB0aGUgY29ubmVjdG9ycyB3aGljaCBhcmUgc3VwcG9ydGVkIHdpdGggdGhpcyBUb21jYXQgcmVsZWFzZSwgYW5kIHdpbGwKK2hvcGVmdWxseSBoZWxwIHlvdSBtYWtlIHRoZSByaWdodCBjaG9pY2UgYWNjb3JkaW5nIHRvIHlvdXIgbmVlZHMuPC9wPgorCis8L3NlY3Rpb24+CisKKzxzZWN0aW9uIG5hbWU9IkhUVFAiPgorCis8cD5UaGUgSFRUUCBjb25uZWN0b3IgaXMgc2V0dXAgYnkgZGVmYXVsdCB3aXRoIFRvbWNhdCwgYW5kIGlzIHJlYWR5IHRvIHVzZS4gVGhpcworY29ubmVjdG9yIGZlYXR1cmVzIHRoZSBsb3dlc3QgbGF0ZW5jeSBhbmQgYmVzdCBvdmVyYWxsIHBlcmZvcm1hbmNlLjwvcD4KKworPHA+Rm9yIGNsdXN0ZXJpbmcsIGEgSFRUUCBsb2FkIGJhbGFuY2VyIDxiPndpdGggc3VwcG9ydCBmb3Igd2ViIHNlc3Npb25zIHN0aWNraW5lc3M8L2I+CittdXN0IGJlIGluc3RhbGxlZCB0byBkaXJlY3QgdGhlIHRyYWZmaWMgdG8gdGhlIFRvbWNhdCBzZXJ2ZXJzLiBUb21jYXQgc3VwcG9ydHMgbW9kX3Byb3h5Cisob24gQXBhY2hlIEhUVFAgU2VydmVyIDIueCwgYW5kIGluY2x1ZGVkIGJ5IGRlZmF1bHQgaW4gQXBhY2hlIEhUVFAgU2VydmVyIDIuMikgYXMgdGhlIGxvYWQgYmFsYW5jZXIuIAorSXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQgdGhlIHBlcmZvcm1hbmNlIG9mIEhUVFAgcHJveHlpbmcgaXMgdXN1YWxseSBsb3dlciB0aGFuIHRoZSAKK3BlcmZvcm1hbmNlIG9mIEFKUCwgc28gQUpQIGNsdXN0ZXJpbmcgaXMgb2Z0ZW4gcHJlZmVyYWJsZS48L3A+CisKKzwvc2VjdGlvbj4KKworPHNlY3Rpb24gbmFtZT0iQUpQIj4KKworPHA+V2hlbiB1c2luZyBhIHNpbmdsZSBzZXJ2ZXIsIHRoZSBwZXJmb3JtYW5jZSB3aGVuIHVzaW5nIGEgbmF0aXZlIHdlYnNlcnZlciBpbiAKK2Zyb250IG9mIHRoZSBUb21jYXQgaW5zdGFuY2UgaXMgbW9zdCBvZiB0aGUgdGltZSBzaWduaWZpY2FudGx5IHdvcnNlIHRoYW4gYQorc3RhbmRhbG9uZSBUb21jYXQgd2l0aCBpdHMgZGVmYXVsdCBIVFRQIGNvbm5lY3RvciwgZXZlbiBpZiBhIGxhcmdlIHBhcnQgb2YgdGhlIHdlYgorYXBwbGljYXRpb24gaXMgbWFkZSBvZiBzdGF0aWMgZmlsZXMuIElmIGludGVncmF0aW9uIHdpdGggdGhlIG5hdGl2ZSB3ZWJzZXJ2ZXIgaXMgCituZWVkZWQgZm9yIGFueSByZWFzb24sIGFuIEFKUCBjb25uZWN0b3Igd2lsbCBwcm92aWRlIGZhc3RlciBwZXJmb3JtYW5jZSB0aGFuIAorcHJveGllZCBIVFRQLiBBSlAgY2x1c3RlcmluZyBpcyB0aGUgbW9zdCBlZmZpY2llbnQgZnJvbSB0aGUgVG9tY2F0IHBlcnNwZWN0aXZlLiAKK0l0IGlzIG90aGVyd2lzZSBmdW5jdGlvbmFsbHkgZXF1aXZhbGVudCB0byBIVFRQIGNsdXN0ZXJpbmcuPC9wPgorCis8cD5UaGUgbmF0aXZlIGNvbm5lY3RvcnMgc3VwcG9ydGVkIHdpdGggdGhpcyBUb21jYXQgcmVsZWFzZSBhcmU6Cis8dWw+Cis8bGk+SksgMS4yLnggd2l0aCBhbnkgb2YgdGhlIHN1cHBvcnRlZCBzZXJ2ZXJzPC9saT4KKzxsaT5tb2RfcHJveHkgb24gQXBhY2hlIEhUVFAgU2VydmVyIDIueCAoaW5jbHVkZWQgYnkgZGVmYXVsdCBpbiBBcGFjaGUgSFRUUCBTZXJ2ZXIgMi4yKSwgCit3aXRoIEFKUCBlbmFibGVkPC9saT4KKzwvdWw+Cis8L3A+CisKKzxwPjxiPk90aGVyIG5hdGl2ZSBjb25uZWN0b3JzIHN1cHBvcnRpbmcgQUpQIG1heSB3b3JrLCBidXQgYXJlIG5vIGxvbmdlciBzdXBwb3J0ZWQuPC9iPjwvcD4KKworPC9zZWN0aW9uPgorCis8L2JvZHk+CisKKzwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9kb2NzL2RlZmF1bHQtc2VydmxldC54bWwgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2RlZmF1bHQtc2VydmxldC54bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjg5ZGM5OQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvZGVmYXVsdC1zZXJ2bGV0LnhtbApAQCAtMCwwICsxLDI4MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IURPQ1RZUEUgZG9jdW1lbnQgWworICA8IUVOVElUWSBwcm9qZWN0IFNZU1RFTSAicHJvamVjdC54bWwiPgorXT4KKzxkb2N1bWVudCB1cmw9ImRlZmF1bHQtc2VydmxldC5odG1sIj4KKworICAgICZwcm9qZWN0OworCisgICAgPHByb3BlcnRpZXM+CisgICAgICAgIDxhdXRob3IgZW1haWw9ImZ1bmttYW5AYXBhY2hlLm9yZyI+VGltIEZ1bms8L2F1dGhvcj4KKyAgICAgICAgPHRpdGxlPkRlZmF1bHQgU2VydmxldCBSZWZlcmVuY2U8L3RpdGxlPgorICAgIDwvcHJvcGVydGllcz4KKworPGJvZHk+CisKKzxzZWN0aW9uIG5hbWU9IkludHJvZHVjdGlvbiI+CisKK1RoaXMgZGlzY3Vzc2VzIGRpZmZlcmVudCB3YXlzIHRvIG1hbmlwdWxhdGUgdGhlIGRlZmF1bHQgc2VydmxldC4gVG9waWNzIGFyZQorPHVsPgorICA8bGk+PGEgaHJlZj0iI3doYXQiPldoYXQgaXMgdGhlIERlZmF1bHRTZXJ2bGV0PzwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iI3doZXJlIj5XaGVyZSBpcyBpdCBkZWNsYXJlZD88L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IiNjaGFuZ2UiPldoYXQgY2FuIEkgY2hhbmdlPzwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iI2RpciI+SG93IGRvIEkgY3VzdG9taXplIGRpcmVjdG9yeSBsaXN0aW5ncz88L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IiNzZWN1cmUiPkhvdyBkbyBJIHNlY3VyZSBkaXJlY3RvcnkgbGlzdGluZ3M/PC9hPjwvbGk+CisKKzwvdWw+CisKKzwvc2VjdGlvbj4KKworPHNlY3Rpb24gbmFtZT0iV2hhdCBpcyB0aGUgRGVmYXVsdFNlcnZsZXQiPgorPGEgbmFtZT0id2hhdCI+PC9hPgorVGhlIGRlZmF1bHQgc2VydmxldCBpcyB0aGUgc2VydmxldCB3aGljaCBzZXJ2ZXMgc3RhdGljIHJlc291cmNlcyBhcyB3ZWxsCithcyBzZXJ2ZXMgdGhlIGRpcmVjdG9yeSBsaXN0aW5ncyAoaWYgZGlyZWN0b3J5IGxpc3RpbmdzIGFyZSBlbmFibGVkKS4KKworPC9zZWN0aW9uPgorCis8c2VjdGlvbiBuYW1lPSJXaGVyZSBpcyBpdCBkZWNsYXJlZD8iPgorPGEgbmFtZT0id2hlcmUiPjwvYT4KK0l0IGlzIGRlY2xhcmVkIGdsb2JhbGx5IGluIDxpPiRDQVRBTElOQV9IT01FL2NvbmYvd2ViLnhtbDwvaT4uCitCeSBkZWZhdWx0IGhlcmUgaXMgaXQncyBkZWNsYXJhdGlvbjoKKzxzb3VyY2U+CisgICAgJmx0O3NlcnZsZXQmZ3Q7CisgICAgICAgICZsdDtzZXJ2bGV0LW5hbWUmZ3Q7ZGVmYXVsdCZsdDsvc2VydmxldC1uYW1lJmd0OworICAgICAgICAmbHQ7c2VydmxldC1jbGFzcyZndDsKKyAgICAgICAgICBvcmcuYXBhY2hlLmNhdGFsaW5hLnNlcnZsZXRzLkRlZmF1bHRTZXJ2bGV0CisgICAgICAgICZsdDsvc2VydmxldC1jbGFzcyZndDsKKyAgICAgICAgJmx0O2luaXQtcGFyYW0mZ3Q7CisgICAgICAgICAgICAmbHQ7cGFyYW0tbmFtZSZndDtkZWJ1ZyZsdDsvcGFyYW0tbmFtZSZndDsKKyAgICAgICAgICAgICZsdDtwYXJhbS12YWx1ZSZndDswJmx0Oy9wYXJhbS12YWx1ZSZndDsKKyAgICAgICAgJmx0Oy9pbml0LXBhcmFtJmd0OworICAgICAgICAmbHQ7aW5pdC1wYXJhbSZndDsKKyAgICAgICAgICAgICZsdDtwYXJhbS1uYW1lJmd0O2xpc3RpbmdzJmx0Oy9wYXJhbS1uYW1lJmd0OworICAgICAgICAgICAgJmx0O3BhcmFtLXZhbHVlJmd0O3RydWUmbHQ7L3BhcmFtLXZhbHVlJmd0OworICAgICAgICAmbHQ7L2luaXQtcGFyYW0mZ3Q7CisgICAgICAgICZsdDtsb2FkLW9uLXN0YXJ0dXAmZ3Q7MSZsdDsvbG9hZC1vbi1zdGFydHVwJmd0OworICAgICZsdDsvc2VydmxldCZndDsKKworLi4uCisKKyAgICAmbHQ7c2VydmxldC1tYXBwaW5nJmd0OworICAgICAgICAmbHQ7c2VydmxldC1uYW1lJmd0O2RlZmF1bHQmbHQ7L3NlcnZsZXQtbmFtZSZndDsKKyAgICAgICAgJmx0O3VybC1wYXR0ZXJuJmd0Oy8mbHQ7L3VybC1wYXR0ZXJuJmd0OworICAgICZsdDsvc2VydmxldC1tYXBwaW5nJmd0OworCis8L3NvdXJjZT4KKworU28gYnkgZGVmYXVsdCwgdGhlIGRlZmF1bHQgc2VydmxldCBpcyBsb2FkZWQgYXQgd2ViYXBwIHN0YXJ0dXAgYW5kCitkaXJlY3RvcnkgbGlzdGluZ3MgYXJlIGVuYWJsZWQgYW5kIGRlYnVnZ2luZyBpcyB0dXJuZWQgb2ZmLgorPC9zZWN0aW9uPgorCis8c2VjdGlvbiBuYW1lPSJXaGF0IGNhbiBJIGNoYW5nZT8iPgorPGEgbmFtZT0iY2hhbmdlIj48L2E+CitUaGUgRGVmYXVsdFNlcnZsZXQgYWxsb3dzIHRoZSBmb2xsb3dpbmcgaW5pdFBhcmFtdGVyczoKKworPHRhYmxlIGJvcmRlcj0iMSI+CisgIDx0cj4KKyAgICA8dGggdmFsaWduPSd0b3AnPmRlYnVnPC90aD4KKyAgICA8dGQgdmFsaWduPSd0b3AnPgorICAgICAgICBEZWJ1Z2dpbmcgbGV2ZWwuIEl0IGlzIG5vdCB2ZXJ5IHVzZWZ1bCB1bmxlc3MgeW91IGFyZSBhIHRvbWNhdAorICAgICAgICBkZXZlbG9wZXIuIEFzCisgICAgICAgIG9mIHRoaXMgd3JpdGluZywgdXNlZnVsIHZhbHVlcyBhcmUgMCwgMSwgMTEsIDEwMDAuCisgICAgPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0aCB2YWxpZ249J3RvcCc+bGlzdGluZ3M8L3RoPgorICAgIDx0ZCB2YWxpZ249J3RvcCc+CisgICAgICAgIElmIG5vIHdlbGNvbWUgZmlsZSBpcyBwcmVzZW50LCBjYW4gYSBkaXJlY3RvcnkgbGlzdGluZyBiZQorICAgICAgICBzaG93bj8KKyAgICAgICAgdmFsdWUgbWF5IGJlIDxiPnRydWU8L2I+IG9yIDxiPmZhbHNlPC9iPgorICAgICAgICA8YnIgLz4KKyAgICAgICAgV2VsY29tZSBmaWxlcyBhcmUgcGFydCBvZiB0aGUgc2VydmxldCBhcGkuCisgICAgPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0aCB2YWxpZ249J3RvcCc+cmVhZG1lRmlsZTwvdGg+CisgICAgPHRkIHZhbGlnbj0ndG9wJz4KKyAgICAgICAgSWYgYSBkaXJlY3RvcnkgbGlzdGluZyBpcyBwcmVzZW50ZWQsIGEgcmVhZG1lIGZpbGUgbWF5IGFsc28KKyAgICAgICAgYmUgcHJlc2VudGVkIHdpdGggdGhlIGxpc3RpbmcuIFRoaXMgZmlsZSBpcyBpbnNlcnRlZCBhcyBpcworICAgICAgICBzbyBpdCBtYXkgY29udGFpbiBIVE1MLiBkZWZhdWx0IHZhbHVlIGlzIG51bGwKKyAgICA8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRoIHZhbGlnbj0ndG9wJz5nbG9iYWxYc2x0RmlsZTwvdGg+CisgICAgPHRkIHZhbGlnbj0ndG9wJz4KKyAgICAgICAgSWYgeW91IHdpc2ggdG8gY3VzdG9taXplIHlvdXIgZGlyZWN0b3J5IGxpc3RpbmcsIHlvdQorICAgICAgICBjYW4gdXNlIGFuIFhTTCB0cmFuc2Zvcm1hdGlvbi4gVGhpcyB2YWx1ZSBpcyBhbiBhYnNvbHV0ZQorICAgICAgICBmaWxlIG5hbWUgd2hpY2ggYmUgdXNlZCBmb3IgYWxsIGRpcmVjb3RvcnkgbGlzdGluZ3MuCisgICAgICAgIFRoaXMgY2FuIGJlIGRpc2FibGVkIGJ5IHBlciB3ZWJhcHAgYnkgYWxzbyBkZWNsYXJpbmcgdGhlCisgICAgICAgIGRlZmF1bHQgc2VydmxldCBpbiB5b3VyIGxvY2FsIHdlYmFwcCdzIHdlYi54bWwuIFRoZSBmb3JtYXQKKyAgICAgICAgb2YgdGhlIHhtbCBpcyBzaG93biBiZWxvdy4KKyAgICA8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRoIHZhbGlnbj0ndG9wJz5sb2NhbFhzbHRGaWxlPC90aD4KKyAgICA8dGQgdmFsaWduPSd0b3AnPgorICAgICAgICBZb3UgbWF5IGFsc28gY3VzdG9taXplIHlvdXIgZGlyZWN0b3J5IGxpc3RpbmcgYnkgZGlyZWN0b3J5IGJ5CisgICAgICAgIGNvbmZpZ3VyaW5nIDxjb2RlPmxvY2FsWHNsdEZpbGU8L2NvZGU+LiBUaGlzIHNob3VsZCBiZSBhIHJlbGF0aXZlCisgICAgICAgIGZpbGUgbmFtZSBpbiB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBsaXN0aW5nIHdpbGwgdGFrZSBwbGFjZS4KKyAgICAgICAgVGhpcyBvdmVycmlkZXMgPGNvZGU+Z2xvYmFsWHNsdEZpbGU8L2NvZGU+LiBJZiB0aGlzIHZhbHVlCisgICAgICAgIGlzIHByZXNlbnQgYnV0IGEgZmlsZSBkb2VzIG5vdCBleGlzdCwgdGhlbgorICAgICAgICA8Y29kZT5nbG9iYWxYc2x0RmlsZTwvY29kZT4gd2lsbCBiZSB1c2VkLiBJZgorICAgICAgICA8Y29kZT5nbG9iYWxYc2x0RmlsZTwvY29kZT4gZG9lcyBub3QgZXhpc3QsIHRoZW4gdGhlIGRlZmF1bHQKKyAgICAgICAgZGlyZWN0b3J5IGxpc3Rpbmcgd2lsbCBiZSBzaG93bi4KKyAgICA8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRoIHZhbGlnbj0ndG9wJz5pbnB1dDwvdGg+CisgICAgPHRkIHZhbGlnbj0ndG9wJz4KKyAgICAgICAgSW5wdXQgYnVmZmVyIHNpemUgKGluIGJ5dGVzKSB3aGVuIHJlYWRpbmcKKyAgICAgICAgcmVzb3VyY2VzIHRvIGJlIHNlcnZlZC4gIFsyMDQ4XQorICAgIDwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGggdmFsaWduPSd0b3AnPm91dHB1dDwvdGg+CisgICAgPHRkIHZhbGlnbj0ndG9wJz4KKyAgICAgICAgT3V0cHV0IGJ1ZmZlciBzaXplIChpbiBieXRlcykgd2hlbiB3cml0aW5nCisgICAgICAgIHJlc291cmNlcyB0byBiZSBzZXJ2ZWQuICBbMjA0OF0KKyAgICA8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRoIHZhbGlnbj0ndG9wJz5yZWFkb25seTwvdGg+CisgICAgPHRkIHZhbGlnbj0ndG9wJz4KKyAgICAgICAgSXMgdGhpcyBjb250ZXh0ICJyZWFkIG9ubHkiLCBzbyBIVFRQIGNvbW1hbmRzIGxpa2UgUFVUIGFuZAorICAgICAgICBERUxFVEUgYXJlIHJlamVjdGVkPyAgW3RydWVdCisgICAgPC90ZD4KKyAgPC90cj4KKworCis8L3RhYmxlPgorPC9zZWN0aW9uPgorCis8c2VjdGlvbiBuYW1lPSJIb3cgZG8gSSBjdXN0b21pemUgZGlyZWN0b3J5IGxpc3RpbmdzPyI+Cis8YSBuYW1lPSJkaXIiPjwvYT4KKzxwPllvdSBjYW4gb3ZlcnJpZGUgRGVmYXVsdFNlcnZsZXQgd2l0aCB5b3Ugb3duIGltcGxlbWVudGF0aW9uIGFuZCB1c2UgdGhhdAoraW4geW91ciB3ZWIueG1sIGRlY2xhcmF0aW9uLiBJZiB5b3UKK2NhbiB1bmRlcnRhbmQgd2hhdCB3YXMganVzdCBzYWlkLCB3ZSB3aWxsIGFzc3VtZSB5byBjYW4gcmVhZCB0aGUgY29kZQordG8gRGVmYXVsdFNlcnZsZXQgc2VydmxldCBhbmQgbWFrZSB0aGUgYXBwcm9wcmlhdGUgYWRqdXN0bWVudHMuIChJZiBub3QsCit0aGVuIHRoYXQgbWV0aG9kIGlzbid0IGZvciB5b3UpCis8L3A+Cis8cD4KK1lvdSBjYW4gdXNlIGVpdGhlciAgPGNvZGU+bG9jYWxYc2x0RmlsZTwvY29kZT4gb3IKKzxjb2RlPmdsb2JhbFhzbHRGaWxlPC9jb2RlPiBhbmQgRGVmYXVsdFNlcnZsZXQgd2lsbCBjcmVhdGUKK2FuIHhtbCBkb2N1bWVudCBhbmQgcnVuIGl0IHRocm91Z2ggYW4geHNsIHRyYW5zZm9ybWF0aW9uIGJhc2VkCitvbiB0aGUgdmFsdWVzIHByb3ZpZGVkIGluIDxjb2RlPmxvY2FsWHNsdEZpbGU8L2NvZGU+IGFuZAorPGNvZGU+Z2xvYmFsWHNsdEZpbGU8L2NvZGU+LiA8Y29kZT5sb2NhbFhzbHRGaWxlPC9jb2RlPiBpcyBmaXJzdAorY2hlY2tlZCwgZm9sbG93ZWQgYnkgPGNvZGU+Z2xvYmFsWHNsdEZpbGU8L2NvZGU+LCB0aGVuIGRlZmF1bHQKK2JlaGF2aW9ycyB0YWtlcyBwbGFjZS4KKzwvcD4KKworPHA+CitGb3JtYXQ6Cis8c291cmNlPgorICAgICZsdDtsaXN0aW5nJmd0OworICAgICAmbHQ7ZW50cmllcyZndDsKKyAgICAgICZsdDtlbnRyeSB0eXBlPSdmaWxlfGRpcicgdXJsUGF0aD0nYVBhdGgnIHNpemU9JyMjIycgZGF0ZT0nZ210IGRhdGUnJmd0OworICAgICAgICBmaWxlTmFtZTEKKyAgICAgICZsdDsvZW50cnkmZ3Q7CisgICAgICAmbHQ7ZW50cnkgdHlwZT0nZmlsZXxkaXInIHVybFBhdGg9J2FQYXRoJyBzaXplPScjIyMnIGRhdGU9J2dtdCBkYXRlJyZndDsKKyAgICAgICAgZmlsZU5hbWUyCisgICAgICAmbHQ7L2VudHJ5Jmd0OworICAgICAgLi4uCisgICAgICZsdDsvZW50cmllcyZndDsKKyAgICAgJmx0O3JlYWRtZSZndDsmbHQ7L3JlYWRtZSZndDsKKyAgICAmbHQ7L2xpc3RpbmcmZ3Q7Cis8L3NvdXJjZT4KKzx1bD4KKyAgPGxpPnNpemUgd2lsbCBiZSBtaXNzaW5nIGlmIDxjb2RlPnR5cGU9J2Rpcic8L2NvZGU+PC9saT4KKyAgPGxpPlJlYWRtZSBpcyBhIENEQVRBIGVudHJ5PC9saT4KKzwvdWw+Cis8L3A+CitUaGUgZm9sbG93aW5nIGlzIGEgc2FtcGxlIHhzbCBmaWxlIHdoaWNoIG1pbWljcyB0aGUgZGVmYXVsdCB0b21jYXQgYmVoYXZpb3I6Cis8c291cmNlPgorJmx0Oz94bWwgdmVyc2lvbj0iMS4wIj8mZ3Q7CisKKyZsdDt4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKKyAgdmVyc2lvbj0iMS4wIiZndDsKKworICAmbHQ7eHNsOm91dHB1dCBtZXRob2Q9InhodG1sIiBlbmNvZGluZz0iaXNvLTg4NTktMSIgaW5kZW50PSJubyIvJmd0OworCisgICZsdDt4c2w6dGVtcGxhdGUgbWF0Y2g9Imxpc3RpbmciJmd0OworICAgJmx0O2h0bWwmZ3Q7CisgICAgJmx0O2hlYWQmZ3Q7CisgICAgICAmbHQ7dGl0bGUmZ3Q7CisgICAgICAgIFNhbXBsZSBEaXJlY3RvcnkgTGlzdGluZyBGb3IKKyAgICAgICAgJmx0O3hzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBkaXJlY3RvcnkiLyZndDsKKyAgICAgICZsdDsvdGl0bGUmZ3Q7CisgICAgICAmbHQ7c3R5bGUmZ3Q7CisgICAgICAgIGgxe2NvbG9yIDogd2hpdGU7YmFja2dyb3VuZC1jb2xvciA6ICMwMDg2YjI7fQorICAgICAgICBoM3tjb2xvciA6IHdoaXRlO2JhY2tncm91bmQtY29sb3IgOiAjMDA4NmIyO30KKyAgICAgICAgYm9keXtmb250LWZhbWlseSA6IHNhbnMtc2VyaWYsQXJpYWwsVGFob21hOworICAgICAgICAgICAgIGNvbG9yIDogYmxhY2s7YmFja2dyb3VuZC1jb2xvciA6IHdoaXRlO30KKyAgICAgICAgYntjb2xvciA6IHdoaXRlO2JhY2tncm91bmQtY29sb3IgOiAjMDA4NmIyO30KKyAgICAgICAgYXtjb2xvciA6IGJsYWNrO30gSFJ7Y29sb3IgOiAjMDA4NmIyO30KKyAgICAgICZsdDsvc3R5bGUmZ3Q7CisgICAgJmx0Oy9oZWFkJmd0OworICAgICZsdDtib2R5Jmd0OworICAgICAgJmx0O2gxJmd0O1NhbXBsZSBEaXJlY3RvcnkgTGlzdGluZyBGb3IKKyAgICAgICAgICAgICZsdDt4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAZGlyZWN0b3J5Ii8mZ3Q7CisgICAgICAmbHQ7L2gxJmd0OworICAgICAgJmx0O2hyIHNpemU9IjEiIC8mZ3Q7CisgICAgICAmbHQ7dGFibGUgY2VsbHNwYWNpbmc9IjAiCisgICAgICAgICAgICAgICAgICB3aWR0aD0iMTAwJSIKKyAgICAgICAgICAgIGNlbGxwYWRkaW5nPSI1IgorICAgICAgICAgICAgICAgICAgYWxpZ249ImNlbnRlciImZ3Q7CisgICAgICAgICZsdDt0ciZndDsKKyAgICAgICAgICAmbHQ7dGggYWxpZ249ImxlZnQiJmd0O0ZpbGVuYW1lJmx0Oy90aCZndDsKKyAgICAgICAgICAmbHQ7dGggYWxpZ249ImNlbnRlciImZ3Q7U2l6ZSZsdDsvdGgmZ3Q7CisgICAgICAgICAgJmx0O3RoIGFsaWduPSJyaWdodCImZ3Q7TGFzdCBNb2RpZmllZCZsdDsvdGgmZ3Q7CisgICAgICAgICZsdDsvdHImZ3Q7CisgICAgICAgICZsdDt4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iZW50cmllcyIvJmd0OworICAgICAgICAmbHQ7L3RhYmxlJmd0OworICAgICAgJmx0O3hzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJyZWFkbWUiLyZndDsKKyAgICAgICZsdDtociBzaXplPSIxIiAvJmd0OworICAgICAgJmx0O2gzJmd0O0FwYWNoZSBUb21jYXQvNS4wJmx0Oy9oMyZndDsKKyAgICAmbHQ7L2JvZHkmZ3Q7CisgICAmbHQ7L2h0bWwmZ3Q7CisgICZsdDsveHNsOnRlbXBsYXRlJmd0OworCisKKyAgJmx0O3hzbDp0ZW1wbGF0ZSBtYXRjaD0iZW50cmllcyImZ3Q7CisgICAgJmx0O3hzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJlbnRyeSIvJmd0OworICAmbHQ7L3hzbDp0ZW1wbGF0ZSZndDsKKworICAmbHQ7eHNsOnRlbXBsYXRlIG1hdGNoPSJyZWFkbWUiJmd0OworICAgICZsdDtociBzaXplPSIxIiAvJmd0OworICAgICZsdDtwcmUmZ3Q7Jmx0O3hzbDphcHBseS10ZW1wbGF0ZXMvJmd0OyZsdDsvcHJlJmd0OworICAmbHQ7L3hzbDp0ZW1wbGF0ZSZndDsKKworICAmbHQ7eHNsOnRlbXBsYXRlIG1hdGNoPSJlbnRyeSImZ3Q7CisgICAgJmx0O3RyJmd0OworICAgICAgJmx0O3RkIGFsaWduPSJsZWZ0IiZndDsKKyAgICAgICAgJmx0O3hzbDp2YXJpYWJsZSBuYW1lPSJ1cmxQYXRoIiBzZWxlY3Q9IkB1cmxQYXRoIi8mZ3Q7CisgICAgICAgICZsdDthIGhyZWY9InskdXJsUGF0aH0iJmd0OworICAgICAgICAgICZsdDt0dCZndDsmbHQ7eHNsOmFwcGx5LXRlbXBsYXRlcy8mZ3Q7Jmx0Oy90dCZndDsKKyAgICAgICAgJmx0Oy9hJmd0OworICAgICAgJmx0Oy90ZCZndDsKKyAgICAgICZsdDt0ZCBhbGlnbj0icmlnaHQiJmd0OworICAgICAgICAmbHQ7dHQmZ3Q7Jmx0O3hzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBzaXplIi8mZ3Q7Jmx0Oy90dCZndDsKKyAgICAgICZsdDsvdGQmZ3Q7CisgICAgICAmbHQ7dGQgYWxpZ249InJpZ2h0IiZndDsKKyAgICAgICAgJmx0O3R0Jmd0OyZsdDt4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAZGF0ZSIvJmd0OyZsdDsvdHQmZ3Q7CisgICAgICAmbHQ7L3RkJmd0OworICAgICZsdDsvdHImZ3Q7CisgICZsdDsveHNsOnRlbXBsYXRlJmd0OworCismbHQ7L3hzbDpzdHlsZXNoZWV0Jmd0OworPC9zb3VyY2U+CisKKzwvc2VjdGlvbj4KKworPHNlY3Rpb24gbmFtZT0iSG93IGRvIEkgc2VjdXJlIGRpcmVjdG9yeSBsaXN0aW5ncz8iPgorPGEgbmFtZT0ic2VjdXJlIj48L2E+CitVc2Ugd2ViLnhtbCBpbiBlYWNoIGluZGl2aWR1YWwgd2ViYXBwLiBTZWUgdGhlIHNlY3VyaXR5IHNlY3Rpb24gb2YgdGhlCitTZXJ2bGV0IHNwZWNpZmljYXRpb24uCisKKzwvc2VjdGlvbj4KKworPC9ib2R5PgorCis8L2RvY3VtZW50PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9kZXBsb3llci1ob3d0by54bWwgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2RlcGxveWVyLWhvd3RvLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2ZjNDEyCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9kZXBsb3llci1ob3d0by54bWwKQEAgLTAsMCArMSwxODEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCFET0NUWVBFIGRvY3VtZW50IFsKKyAgPCFFTlRJVFkgcHJvamVjdCBTWVNURU0gInByb2plY3QueG1sIj4KK10+Cis8ZG9jdW1lbnQgdXJsPSJkZXBsb3llci1ob3d0by5odG1sIj4KKworICAgICZwcm9qZWN0OworCisgICAgPHByb3BlcnRpZXM+CisgICAgICAgIDxhdXRob3IgZW1haWw9InJlbW1AYXBhY2hlLm9yZyI+UmVteSBNYXVjaGVyYXQ8L2F1dGhvcj4KKyAgICAgICAgPHRpdGxlPkRlcGxveWVyIEhPVy1UTzwvdGl0bGU+CisgICAgPC9wcm9wZXJ0aWVzPgorCis8Ym9keT4KKworPHNlY3Rpb24gbmFtZT0iVGFibGUgb2YgQ29udGVudHMiPgorCis8cD4KKzxhIGhyZWY9IiNJbnRyb2R1Y3Rpb24iPkludHJvZHVjdGlvbjwvYT48YnIgLz4KKzxhIGhyZWY9IiNDb250ZXh0IGRlc2NyaXB0b3JzIj5Db250ZXh0IFhNTCBkZXNjcmlwdG9yczwvYT48YnIgLz4KKzxhIGhyZWY9IiNEZXBsb3lpbmcgb24gVG9tY2F0IHN0YXJ0dXAiPkRlcGxveWluZyBvbiBUb21jYXQgc3RhcnR1cDwvYT48YnIgLz4KKzxhIGhyZWY9IiNEZXBsb3lpbmcgb24gYSBydW5uaW5nIFRvbWNhdCBzZXJ2ZXIiPkRlcGxveWluZyBvbiBydW5uaW5nIFRvbWNhdCBzZXJ2ZXI8L2E+PGJyIC8+Cis8YSBocmVmPSIjRGVwbG95aW5nIHVzaW5nIHRoZSBDbGllbnQgRGVwbG95ZXIgUGFja2FnZSI+RGVwbG95aW5nIHVzaW5nIHRoZSBDbGllbnQgRGVwbG95ZXIgUGFja2FnZTwvYT48YnIgLz4KKzxibG9ja3F1b3RlPgorPC9ibG9ja3F1b3RlPgorPC9wPgorCis8L3NlY3Rpb24+CisKKzxzZWN0aW9uIG5hbWU9IkludHJvZHVjdGlvbiI+CisKKzxwPlRoZSBkZXBsb3llciwgYXMgaXRzIG5hbWUgaW1wbGllcywgYWxsb3dzIGRlcGxveWluZyBhbmQgdW5kZXBsb3lpbmcgd2ViCithcHBsaWNhdGlvbnMgdG8gdGhlIFRvbWNhdCBzZXJ2ZXIsIGVpdGhlciBzdGF0aWNhbGx5ICh0aGUgYXBwbGljYXRpb24gaXMgCitzZXR1cCBiZWZvcmUgdGhlIHNlcnZlciBpcyBzdGFydGVkKSwgb3IgZHluYW1pY2FsbHkgKGluIGNvbmp1bmN0aW9uIHdpdGggdGhlCitUb21jYXQgTWFuYWdlciB3ZWIgYXBwbGljYXRpb24gb3IgbWFuaXB1bGF0aW5nIGFscmVhZHkgZGVwbG95ZWQgYXBwbGljYXRpb25zKS4KKzwvcD4KKworPC9zZWN0aW9uPgorCis8c2VjdGlvbiBuYW1lPSJDb250ZXh0IGRlc2NyaXB0b3JzIj4KKworPHA+QSBDb250ZXh0IFhNTCBkZXNjcmlwdG9yIGlzIGEgZnJhZ21lbnQgb2YgWE1MIGRhdGEgd2hpY2ggY29udGFpbnMgYSB2YWxpZAorQ29udGV4dCBlbGVtZW50IHdoaWNoIHdvdWxkIG5vcm1hbGx5IGJlIGZvdW5kIGluIHRoZSBtYWluIHNlcnZlciBjb25maWd1cmF0aW9uCitmaWxlIChjb25mL3NlcnZlci54bWwpLCBhbmQgYWxsb3dzIGVhc3kgYW5kIGF1dG9tYXRlZCBtYW5pcHVsYXRpb24gCitvZiB3ZWIgYXBwbGljYXRpb25zIGJ5IHRoZSB2YXJpb3VzIG1hbmFnZW1lbnQgdG9vbHMgYXZhaWxhYmxlIGluIFRvbWNhdC4gCitGb3IgYSBnaXZlbiBob3N0LCB0aGUgQ29udGV4dCBkZXNjcmlwdG9ycyBhcmUgbG9jYXRlZCBpbiAKKzxjb2RlPiRDQVRBTElOQV9IT01FL2NvbmYvW2VuZ2luZW5hbWVdL1tob3N0bmFtZV0vZm9vLnhtbDwvY29kZT4uIE5vdGUgdGhhdCAKK3doaWxlIHRoZSBuYW1lIG9mIHRoZSBmaWxlIGlzIG5vdCB0aWVkIHRvIHRoZSB3ZWJhcHAgbmFtZSwgVG9tY2F0IHdpbGwgY3JlYXRlCitDb250ZXh0IGRlc2NyaXB0b3JzIHdoaWNoIG1hdGNoIHRoZSB3ZWJhcHAgbmFtZSB3aGVuZXZlciBpdCB3aWxsIGdlbmVyYXRlIGEKK0NvbnRleHQgZGVzY3JpcHRvci4KKzwvcD4KKworPHA+Q29udGV4dCBkZXNjcmlwdG9ycyBhbGxvdyBkZWZpbmluZyBhbGwgYXNwZWN0cyBhbmQgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCitvZiBhIENvbnRleHQsIHN1Y2ggYXMgbmFtaW5nIHJlc291cmNlcyBhbmQgc2Vzc2lvbiBtYW5hZ2VyIGNvbmZpZ3VyYXRpb24uCitJdCBzaG91bGQgYmUgbm90ZWQgdGhhdCB0aGUgZG9jQmFzZSBzcGVjaWZpZWQgaW4gdGhlIENvbnRleHQgZWxlbWVudCBjYW4gCityZWZlciB0byBlaXRoZXIgdGhlIC5XQVIgb3IgdGhlIGRpcmVjdG9yeSB3aGljaCB3aWxsIGJlIGNyZWF0ZWQgd2hlbiB0aGUKKy5XQVIgaXMgZXhwYW5kZWQgb3IgdGhlIC5XQVIgaXRzZWxmLjwvcD4KKworPC9zZWN0aW9uPgorCis8c2VjdGlvbiBuYW1lPSJEZXBsb3lpbmcgb24gVG9tY2F0IHN0YXJ0dXAiPgorCis8cD5UaGUgd2ViYXBwcyB3aGljaCBhcmUgcHJlc2VudCBpbiB0aGUgaG9zdCBhcHBCYXNlIHdpbGwgYmUgZGVwbG95ZWQgaWYgdGhlCitob3N0ICJkZXBsb3lPblN0YXJ0dXAiIHByb3BlcnR5IGlzIHRydWUuIFRoZSBkZXBsb3ltZW50IHByb2Nlc3MgaXMgCit0aGUgZm9sbG93aW5nOgorPHVsPgorICAgIDxsaT5UaGUgQ29udGV4dCBYTUwgZGVjbGFyYXRpb25zIHdpbGwgYmUgZGVwbG95ZWQgZmlyc3Q8L2xpPgorICAgIDxsaT5FeHBhbmRlZCB3ZWIgYXBwbGljYXRpb25zIG5vdCByZWZlcmVuY2VkIGJ5IENvbnRleHQgWE1MIGRlY2xhcmF0aW9ucworICAgICAgICB3aWxsIHRoZW4gYmUgZGVwbG95ZWQ7IGlmIHRoZXkgaGF2ZSBhbiBhc3NvY2lhdGVkIC5XQVIgZmlsZSBhbmQgaXQgaXMKKyAgICAgICAgbmV3ZXIgdGhhbiB0aGUgZXhwYW5kZWQgd2ViIGFwcGxpY2F0aW9uLCB0aGUgZXhwYW5kZWQgZGlyZWN0b3J5IHdpbGwKKyAgICAgICAgYmUgcmVtb3ZlZCBhbmQgdGhlIHdlYmFwcCB3aWxsIGJlIHJlZGVwbG95ZWQgZnJvbSB0aGUgLldBUjwvbGk+CisgICAgPGxpPi5XQVIgZmlsZXMgd2lsbCBiZSBkZXBsb3llZDwvbGk+Cis8L3VsPgorRm9yIGVhY2ggZGVwbG95ZWQgd2ViIGFwcGxpY2F0aW9uLCBhIG1hdGNoaW5nIENvbnRleHQgWE1MIGRlc2NyaXB0b3Igd2lsbCBiZQorY3JlYXRlZCB1bmxlc3Mgb25lIGV4aXN0cyBhbHJlYWR5LgorPC9wPgorCis8L3NlY3Rpb24+CisKKzxzZWN0aW9uIG5hbWU9IkRlcGxveWluZyBvbiBhIHJ1bm5pbmcgVG9tY2F0IHNlcnZlciI+CisKKzxwPklmIHRoZSBob3N0ICJhdXRvRGVwbG95IiBwcm9wZXJ0eSBpcyB0cnVlLCB0aGUgaG9zdCB3aWxsIGF0dGVtcHQgdG8gZGVwbG95IAorYW5kIHVwZGF0ZSB3ZWIgYXBwbGljYXRpb25zIGR5bmFtaWNhbGx5LCBhcyBuZWVkZWQuIFRoZSBob3N0IHdpbGwgbmVlZCB0bworaGF2ZSBiYWNrZ3JvdW5kIHByb2Nlc3NpbmcgZW5hYmxlZCBmb3IgYXV0b21hdGljIHJlbG9hZGluZyB0byB3b3JrLCB3aGljaAoraXMgdGhlIGRlZmF1bHQuPC9wPgorCis8cD5UaGlzIGluY2x1ZGVzOgorPHVsPgorICAgIDxsaT5EZXBsb3ltZW50IG9mIFdBUnMgd2hpY2ggYXJlIGNvcGllZCB0byB0aGUgaG9zdCBhcHBCYXNlLjwvbGk+CisgICAgPGxpPkRlcGxveW1lbnQgb2YgZXhwYW5kZWQgd2ViIGFwcGxpY2F0aW9ucyB3aGljaCBhcmUgY29waWVkIHRvIHRoZSBob3N0CisgICAgICAgIGFwcEJhc2UuPC9saT4KKyAgICA8bGk+UmVkZXBsb3ltZW50IG9mIGEgd2ViIGFwcGxpY2F0aW9uIHdoaWNoIGhhcyBiZWVuIGRlcGxveWVkIGZyb20gYSBXQVIKKyAgICAgICAgd2hlbiB0aGUgV0FSIGlzIHVwZGF0ZWQ6IHRoZSBleHBhbmRlZCB3ZWIgYXBwbGljYXRpb24gaXMgcmVtb3ZlZCwgCisgICAgICAgIGFuZCB0aGUgV0FSIGlzIGV4cGFuZGVkIGFnYWluLiBUaGlzIHdpbGwgbm90IGhhcHBlbiBpZiB0aGUgaG9zdCBpcworICAgICAgICBjb25maWd1cmVkIHNvIHRoYXQgV0FScyBhcmUgbm90IGV4cGFuZGVkLCBpbiB3aGljaCBjYXNlIHRoZSB3ZWJhcHAKKyAgICAgICAgd2lsbCBiZSBzaW1wbHkgcmVkZXBsb3llZC48L2xpPgorICAgIDxsaT5SZWRlcGxveW1lbnQgb2YgdGhlIHdlYiBhcHBsaWNhdGlvbiBpZiB0aGUgL1dFQi1JTkYvd2ViLnhtbCBmaWxlIGlzCisgICAgICAgIHVwZGF0ZWQuPC9saT4KKyAgICA8bGk+UmVkZXBsb3ltZW50IG9mIHRoZSB3ZWIgYXBwbGljYXRpb24gaWYgdGhlIGNvbnRleHQgWE1MIGZpbGUgZnJvbSB3aGljaAorICAgICAgICB0aGUgd2ViIGFwcGxpY2F0aW9uIGhhcyBiZWVuIGRlcGxveWVkIGlzIHVwZGF0ZWQuPC9saT4KKyAgICA8bGk+UmVkZXBsb3ltZW50IG9mIHRoZSB3ZWIgYXBwbGljYXRpb24gaWYgYSBjb250ZXh0IFhNTCBmaWxlICh3aXRoIGEKKyAgICAgICAgbmFtZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBjb250ZXh0IHBhdGggb2YgdGhlIHByZXZpb3VzbHkgZGVwbG95ZWQKKyAgICAgICAgYXBwbGljYXRpb24pIGlzIGFkZGVkIGluIHRoZSAKKyAgICAgICAgPGNvZGU+JENBVEFMSU5BX0hPTUUvY29uZi9bZW5naW5lbmFtZV0vW2hvc3RuYW1lXS88L2NvZGU+IGZvbGRlci48L2xpPgorICAgIDxsaT5VbmRlcGxveW1lbnQgb2YgdGhlIHdlYiBhcHBsaWNhdGlvbiBpZiBpdHMgZG9jdW1lbnQgYmFzZSBpcyBkZWxldGVkCisgICAgICAgIChvbiBXaW5kb3dzLCB0aGlzIGFzc3VtZXMgdGhhdCBhbnRpIGxvY2tpbmcgZmVhdHVyZXMgYXJlIGVuYWJsZWQsIG90aGVyd2lzZQorICAgICAgICBpdCBpcyBub3QgcG9zc2libGUgdG8gZGVsZXRlIHRoZSByZXNvdXJjZXMgb2YgYSBydW5uaW5nIHdlYiBhcHBsaWNhdGlvbikuPC9saT4KKzwvdWw+CitOb3RlOiBXZWIgYXBwbGljYXRpb24gcmVsb2FkaW5nIGNhbiBhbHNvIGJlIGNvbmZpZ3VyZWQgaW4gdGhlIGxvYWRlciwgaW4gd2hpY2gKK2Nhc2UgbG9hZGVkIGNsYXNzZXMgd2lsbCBiZSB0cmFja2VkIGZvciBjaGFuZ2VzLgorPC9wPgorCis8L3NlY3Rpb24+CisKKzxzZWN0aW9uIG5hbWU9IkRlcGxveWluZyB1c2luZyB0aGUgQ2xpZW50IERlcGxveWVyIFBhY2thZ2UiPgorCis8cD5UaGUgY2xpZW50IGRlcGxveWVyIGlzIGEgcGFja2FnZSB3aGljaCBjYW4gYmUgdXNlZCB0byB2YWxpZGF0ZSwgY29tcGlsZSwKK2FuZCBkZXBsb3kgYSB3ZWIgYXBwbGljYXRpb24gdG8gYSBwcm9kdWN0aW9uIG9yIGRldmVsb3BtZW50IHNlcnZlci4gSXQgc2hvdWxkIAorYmUgbm90ZWQgdGhhdCB0aGlzIGZlYXR1cmUgdXNlcyB0aGUgVG9tY2F0IG1hbmFnZXIgZm9yIGF1dG9tYXRpYyBkZXBsb3ltZW50LgorPC9wPgorCis8cD5UaGUgZGVwbG95ZXIgaW5jbHVkZXMgdGhlIENhdGFsaW5hIG1hbmFnZXIgQW50IHRhc2tzLCB0aGUgSmFzcGVyIHBhZ2UKK2NvbXBpbGVyIGZvciBKU1AgY29tcGlsYXRpb24gYmVmb3JlIGRlcGxveW1lbnQsIGFzIHdlbGwgYXMgYSB0YXNrIHdoaWNoCit2YWxpZGF0ZXMgdGhlIHdlYmFwcCdzIGRlcGxveW1lbnQgZGVzY3JpcHRvci4gVGhlIHZhbGlkYXRvciB0YXNrIChjbGFzcworPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5hbnQuVmFsaWRhdG9yVGFzazwvY29kZT4pIGFsbG93cyBvbmx5IG9uZSBwYXJhbWV0ZXI6Cit0aGUgYmFzZSBwYXRoIG9mIGFuIGV4cGFuZGVkIHdlYiBhcHBsaWNhdGlvbi48L3A+CisKKzxwPlRoZSBkZXBsb3llciB1c2VzIGFuIHVucGFja2VkIHdlYiBhcHBsaWNhdGlvbiBhcyBpbnB1dCAoc2VlIHRoZSBsaXN0IG9mIHRoZQorcHJvcGVydGllcyB1c2VkIGJ5IHRoZSBkZXBsb3llciBiZWxvdykuIEEgd2ViIGFwcGxpY2F0aW9uIHdoaWNoIAoraXMgcHJvZ3JhbWF0aWNhbGx5IGRlcGxveWVkIHdpdGggdGhlIGRlcGxveWVyIG1heSBpbmNsdWRlIFRvbWNhdCBzcGVjaWZpYyAKK2RlcGxveW1lbnQgY29uZmlndXJhdGlvbiwgYnkgaW5jbHVkaW5nIGEgQ29udGV4dCBjb25maWd1cmF0aW9uIFhNTCBmaWxlIGluIAorPGNvZGU+L01FVEEtSU5GL2NvbnRleHQueG1sPC9jb2RlPi48L3A+CisKKzxwPlRoZSBkZXBsb3llciBwYWNrYWdlIGluY2x1ZGVzIGEgcmVhZHkgdG8gdXNlIEFudCBzY3JpcHQsIHdpdGggdGhlIGZvbGxvd2luZwordGFyZ2V0czoKKzx1bD4KKyAgICA8bGk+PGNvZGU+Y29tcGlsZTwvY29kZT4gKGRlZmF1bHQpOiBDb21waWxlIGFuZCB2YWxpZGF0ZSB0aGUgd2ViIAorICAgICAgICBhcHBsaWNhdGlvbi4gVGhpcyBjYW4gYmUgdXNlZCBzdGFuZGFsb25lLCBhbmQgZG9lcyBub3QgbmVlZCBhIHJ1bm5pbmcKKyAgICAgICAgVG9tY2F0IHNlcnZlci4gVGhlIGNvbXBpbGVkIGFwcGxpY2F0aW9uIHdpbGwgb25seSBydW4gb24gdGhlIGFzc29jaWF0ZWQKKyAgICAgICAgVG9tY2F0IDUuNS54IHNlcnZlciByZWxlYXNlLCBhbmQgaXMgbm90IGd1YXJhbnRlZWQgdG8gd29yayBvbiBhbm90aGVyCisgICAgICAgIFRvbWNhdCByZWxlYXNlLCBhcyB0aGUgY29kZSBnZW5lcmF0ZWQgYnkgSmFzcGVyIGRlcGVuZHMgb24gaXRzIHJ1bnRpbWUKKyAgICAgICAgY29tcG9uZW50LiBJdCBzaG91bGQgYWxzbyBiZSBub3RlZCB0aGF0IHRoaXMgdGFyZ2V0IHdpbGwgYWxzbyBjb21waWxlCisgICAgICAgIGF1dG9tYXRpY2FsbHkgYW55IEphdmEgc291cmNlIGZpbGUgbG9jYXRlZCBpbiB0aGUgCisgICAgICAgIDxjb2RlPi9XRUItSU5GL2NsYXNzZXM8L2NvZGU+IGZvbGRlciBvZiB0aGUgd2ViIGFwcGxpY2F0aW9uLjwvbGk+CisgICAgPGxpPjxjb2RlPmRlcGxveTwvY29kZT46IERlcGxveSBhIHdlYiBhcHBsaWNhdGlvbiAoY29tcGlsZWQgb3Igbm90KSB0byAKKyAgICAgICAgYSBUb21jYXQgc2VydmVyPC9saT4KKyAgICA8bGk+PGNvZGU+dW5kZXBsb3k8L2NvZGU+OiBVbmRlcGxveSBhIHdlYiBhcHBsaWNhdGlvbjwvbGk+CisgICAgPGxpPjxjb2RlPnN0YXJ0PC9jb2RlPjogU3RhcnQgd2ViIGFwcGxpY2F0aW9uPC9saT4KKyAgICA8bGk+PGNvZGU+cmVsb2FkPC9jb2RlPjogUmVsb2FkIHdlYiBhcHBsaWNhdGlvbjwvbGk+CisgICAgPGxpPjxjb2RlPnN0b3A8L2NvZGU+OiBTdG9wIHdlYiBhcHBsaWNhdGlvbjwvbGk+Cis8L3VsPgorVGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIGNhbiBiZSBzcGVjaWZpZWQsIGVpdGhlciBhcyBzeXN0ZW0gcHJvcGVydGllcywgb3IgYnkKK3VzaW5nIGEgPGNvZGU+ZGVwbG95ZXIucHJvcGVydGllczwvY29kZT4gZmlsZSBsb2NhdGVkIGluIHRoZSByb290IGZvbGRlciBvZiB0aGUKK2RlcGxveWVyIHBhY2thZ2U6Cis8dWw+CisgICAgPGxpPjxjb2RlPmJ1aWxkPC9jb2RlPjogVGhlIGJ1aWxkIGZvbGRlciB1c2VkIHdpbGwgYmUsIGJ5IGRlZmF1bHQsIAorICAgICAgICA8Y29kZT4ke2J1aWxkfS93ZWJhcHAke3BhdGh9PC9jb2RlPi4gQWZ0ZXIgdGhlIGVuZCBvZiB0aGUgZXhlY3V0aW9uCisgICAgICAgIG9mIHRoZSA8Y29kZT5jb21waWxlPC9jb2RlPiB0YXJnZXQsIHRoZSB3ZWIgYXBwbGljYXRpb24gV0FSIHdpbGwgYmUKKyAgICAgICAgbG9jYXRlZCBhdCA8Y29kZT4ke2J1aWxkfS93ZWJhcHAke3BhdGh9LndhcjwvY29kZT4uPC9saT4KKyAgICA8bGk+PGNvZGU+d2ViYXBwPC9jb2RlPjogRm9sZGVyIGNvbnRhaW5pbmcgdGhlIGV4cGFuZGVkIHdlYiBhcHBsaWNhdGlvbiAKKyAgICAgICAgd2hpY2ggd2lsbCBiZSBjb21waWxlZCBhbmQgdmFsaWRhdGVkLiBCeSBkZWZhdWx0LCB0aGUgZm9sZGVyIGlzCisgICAgICAgIDxjb2RlPm15YXBwPC9jb2RlPi48L2xpPgorICAgIDxsaT48Y29kZT5wYXRoPC9jb2RlPjogRGVwbG95ZWQgY29udGV4dCBwYXRoIG9mIHRoZSB3ZWIgYXBwbGljYXRpb24sIAorICAgICAgICBieSBkZWZhdWx0IDxjb2RlPi9teWFwcDwvY29kZT4uPC9saT4KKyAgICA8bGk+PGNvZGU+dXJsPC9jb2RlPjogQWJzb2x1dGUgVVJMIHRvIHRoZSBtYW5hZ2VyIHdlYiBhcHBsaWNhdGlvbiBvZiBhIAorICAgICAgICBydW5uaW5nIFRvbWNhdCBzZXJ2ZXIsIHdoaWNoIHdpbGwgYmUgdXNlZCB0byBkZXBsb3kgYW5kIHVuZGVwbG95IHRoZQorICAgICAgICB3ZWIgYXBwbGljYXRpb24uIEJ5IGRlZmF1bHQsIHRoZSBkZXBsb3llciB3aWxsIGF0dGVtcHQgdG8gYWNjZXNzIAorICAgICAgICBhIFRvbWNhdCBpbnN0YW5jZSBydW5uaW5nIG9uIGxvY2FsaG9zdCwgYXQgCisgICAgICAgIDxjb2RlPmh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9tYW5hZ2VyPC9jb2RlPi48L2xpPgorICAgIDxsaT48Y29kZT51c2VybmFtZTwvY29kZT46IFVzZXJuYW1lIHRvIGJlIHVzZWQgdG8gY29ubmVjdCB0byB0aGUgVG9tY2F0IAorICAgICAgICBtYW5hZ2VyLjwvbGk+CisgICAgPGxpPjxjb2RlPnBhc3N3b3JkPC9jb2RlPjogUGFzc3dvcmQgdG8gYmUgdXNlZCB0byBjb25uZWN0IHRvIHRoZSBUb21jYXQKKyAgICAgICAgbWFuYWdlci48L2xpPgorPC91bD4KKzwvcD4KKworPC9zZWN0aW9uPgorCis8L2JvZHk+CisKKzwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9kb2NzL2RldmVsb3BlcnMueG1sIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9kZXZlbG9wZXJzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmRhYTA3Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9kZXZlbG9wZXJzLnhtbApAQCAtMCwwICsxLDU3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhRE9DVFlQRSBkb2N1bWVudCBbCisgIDwhRU5USVRZIHByb2plY3QgU1lTVEVNICJwcm9qZWN0LnhtbCI+CitdPgorPGRvY3VtZW50IHVybD0iZGV2ZWxvcGVycy5odG1sIj4KKworICAmcHJvamVjdDsKKworICA8cHJvcGVydGllcz4KKyAgICA8YXV0aG9yIGVtYWlsPSJyZW1tQGFwYWNoZS5vcmciPlJlbXkgTWF1Y2hlcmF0PC9hdXRob3I+CisgICAgPGF1dGhvciBlbWFpbD0ieW9hdnNAYXBhY2hlLm9yZyI+WW9hdiBTaGFwaXJhPC9hdXRob3I+CisgICAgPHRpdGxlPlRvbWNhdCBEZXZlbG9wZXJzPC90aXRsZT4KKyAgPC9wcm9wZXJ0aWVzPgorCis8Ym9keT4KKworICA8c2VjdGlvbiBuYW1lPSJBY3RpdmUgRGV2ZWxvcGVycyI+CisKKyAgICA8cD4KKyAgICAgIFRoZSBsaXN0IGluZGljYXRlcyB0aGUgZGV2ZWxvcGVycycgbWFpbiBhcmVhcyBvZiBpbnRlcmVzdC4gRmVlbCBmcmVlIHRvCisgICAgICBhZGQgdG8gdGhlIGxpc3QgOikgVGhlIGRldmVsb3BlcnMgZW1haWwgYWRkcmVzc2VzIGFyZSAKKyAgICAgIDxjb2RlPltsb2dpbl1AYXBhY2hlLm9yZzwvY29kZT4uIFBsZWFzZSA8c3Ryb25nPmRvIG5vdDwvc3Ryb25nPiBjb250YWN0IAorICAgICAgZGV2ZWxvcGVycyBkaXJlY3RseSBmb3IgYW55IHN1cHBvcnQgaXNzdWVzIChwbGVhc2UgcG9zdCB0byB0aGUgCisgICAgICB0b21jYXQtdXNlcnMgbWFpbGluZyBsaXN0IGluc3RlYWQsIG9yIG9uZSBvZiB0aGUgb3RoZXIgc3VwcG9ydCAKKyAgICAgIHJlc291cmNlczsgc29tZSBvcmdhbml6YXRpb25zIGFuZCBpbmRpdmlkdWFsIGNvbnN1bHRhbnRzIGFsc28gb2ZmZXIgCisgICAgICBmb3IgcGF5IFRvbWNhdCBzdXBwb3J0LCBhcyBsaXN0ZWQgb24gdGhlIAorICAgICAgPGEgaHJlZj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9zaXRlL3ZlbmRvcnMuaHRtbCI+dmVuZG9ycyBwYWdlPC9hPgorICAgICAgb24gdGhlIEpha2FydGEgd2Vic2l0ZSkuCisgICAgPC9wPgorCisgICAgPHVsPgorICAgICAgPGxpPkFteSBSb2ggKGFteXJvaCk6IENhdGFsaW5hLCBBZG1pbiB3ZWJhcHA8L2xpPgorICAgICAgPGxpPkJpbGwgQmFya2VyIChiaWxsYmFya2VyKTogQ29ubmVjdG9yczwvbGk+CisgICAgICA8bGk+Q29zdGluIE1hbm9sYWNoZSAoY29zdGluKTogQ2F0YWxpbmEsIENvbm5lY3RvcnM8L2xpPgorICAgICAgPGxpPkZpbGlwIEhhbmlrIChmaGFuaWspOiBDbHVzdGVyaW5nPC9saT4KKyAgICAgIDxsaT5HbGVubiBOaWVsc2VuIChnbGVubik6IENhdGFsaW5hLCBDb25uZWN0b3JzPC9saT4KKyAgICAgIDxsaT5IZW5yaSBHb21leiAoaGdvbWV6KTogQ29ubmVjdG9yczwvbGk+CisgICAgICA8bGk+SmFuIEx1ZWhlIChsdWVoZSk6IEphc3BlcjwvbGk+CisgICAgICA8bGk+SmVhbi1GcmFuY29pcyBBcmNhbmQgKGpmYXJjYW5kKTogQ2F0YWxpbmE8L2xpPgorICAgICAgPGxpPkplYW4tRnJlZGVyaWMgQ2xlcmUgKGpmY2xlcmUpOiBDb25uZWN0b3JzPC9saT4KKyAgICAgIDxsaT5LaW4tTWFuIENodW5nIChraW5tYW4pOiBKYXNwZXI8L2xpPgorICAgICAgPGxpPk1sYWRlbiBUdXJrIChtdHVyayk6IENvbm5lY3RvcnM8L2xpPgorICAgICAgPGxpPlJlbXkgTWF1Y2hlcmF0IChyZW1tKTogQ2F0YWxpbmEsIENvbm5lY3RvcnMsIERvY3M8L2xpPgorICAgICAgPGxpPlRpbSBGdW5rIChmdW5rbWFuKTogQ2F0YWxpbmEsIERvY3M8L2xpPgorICAgICAgPGxpPllvYXYgU2hhcGlyYSAoeW9hdnMpOiBEb2NzLCBKTVgsIENhdGFsaW5hLCBiYWxhbmNlciwgUmVsZWFzZSBNYW5hZ2VyPC9saT4KKyAgICA8L3VsPgorCisgIDwvc2VjdGlvbj4KKworICA8c2VjdGlvbiBuYW1lPSJSZXRpcmVkIERldmVsb3BlcnMiPgorCisKKworICA8L3NlY3Rpb24+CisKKzwvYm9keT4KKzwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9kb2NzL2Z1bmNzcGVjcy9mcy1hZG1pbi1hcHBzLnhtbCBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvZnVuY3NwZWNzL2ZzLWFkbWluLWFwcHMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjMzM3YzkKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2Z1bmNzcGVjcy9mcy1hZG1pbi1hcHBzLnhtbApAQCAtMCwwICsxLDI3OCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IURPQ1RZUEUgZG9jdW1lbnQgWworICA8IUVOVElUWSBwcm9qZWN0IFNZU1RFTSAicHJvamVjdC54bWwiPgorXT4KKzxkb2N1bWVudCB1cmw9ImZzLWFkbWluLWFwcHMuaHRtbCI+CisKKyAgJnByb2plY3Q7CisKKyAgPHByb3BlcnRpZXM+CisgICAgPGF1dGhvciBlbWFpbD0iY3JhaWdtY2NAYXBhY2hlLm9yZyI+Q3JhaWcgTWNDbGFuYWhhbjwvYXV0aG9yPgorICAgIDx0aXRsZT5BZG1pbmlzdHJhdGl2ZSBBcHBzIC0gT3ZlcmFsbCBSZXF1aXJlbWVudHM8L3RpdGxlPgorICAgIDxyZXZpc2lvbj4kSWQkPC9yZXZpc2lvbj4KKyAgPC9wcm9wZXJ0aWVzPgorCis8Ym9keT4KKworCis8c2VjdGlvbiBuYW1lPSJPdmVydmlldyI+CisKKworICA8c3Vic2VjdGlvbiBuYW1lPSJJbnRyb2R1Y3Rpb24iPgorCisgICAgPHA+VGhlIHB1cnBvc2Ugb2YgdGhpcyBzcGVjaWZpY2F0aW9uIGlzIHRvIGRlZmluZSBoaWdoIGxldmVsIHJlcXVpcmVtZW50cworICAgIGZvciBhZG1pbmlzdHJhdGl2ZSBhcHBsaWNhdGlvbnMgdGhhdCBjYW4gYmUgdXNlZCB0byBtYW5hZ2UgdGhlIG9wZXJhdGlvbgorICAgIG9mIGEgcnVubmluZyBUb21jYXQgNSBjb250YWluZXIuICBBIHZhcmlldHkgb2YgPGVtPkFjY2VzcyBNZXRob2RzPC9lbT4KKyAgICB0byB0aGUgc3VwcG9ydGVkIGFkbWluaXN0cmF0aXZlIGZ1bmN0aW9uYWxpdHkgc2hhbGwgYmUgc3VwcG9ydGVkLCB0bworICAgIG1lZXQgdmFyeWluZyByZXF1aXJlbWVudHM6PC9wPgorICAgIDx1bD4KKyAgICA8bGk+PGVtPkFzIEEgU2NyaXB0YWJsZSBXZWIgQXBwbGljYXRpb248L2VtPiAtIFRoZSBleGlzdGluZworICAgICAgICA8Y29kZT5NYW5hZ2VyPC9jb2RlPiB3ZWIgYXBwbGljYXRpb24gcHJvdmlkZXMgYSBzaW1wbGUgSFRUUC1iYXNlZAorICAgICAgICBpbnRlcmZhY2UgZm9yIG1hbmFnaW5nIFRvbWNhdCB0aHJvdWdoIGNvbW1hbmRzIHRoYXQgYXJlIGV4cHJlc3NlZAorICAgICAgICBlbnRpcmVseSB0aHJvdWdoIGEgcmVxdWVzdCBVUkkuICBUaGlzIGlzIHVzZWZ1bCBpbiBlbnZpcm9ubWVudHMKKyAgICAgICAgd2hlcmUgeW91IHdpc2ggdG8gc2NyaXB0IGFkbWluaXN0cmF0aXZlIGNvbW1hbmRzIHdpdGggdG9vbHMgdGhhdAorICAgICAgICBjYW4gZ2VuZXJhdGUgSFRUUCB0cmFuc2FjdGlvbnMuPC9saT4KKyAgICA8bGk+PGVtPkFzIEFuIEhUTUwtQmFzZWQgV2ViIEFwcGxpY2F0aW9uPC9lbT4gLSBVc2UgYW4gSFRNTCBwcmVzZW50YXRpb24KKyAgICAgICAgdG8gcHJvdmlkZSBhIEdVSS1saWtlIHVzZXIgaW50ZXJmYWNlIGZvciBodW1hbnMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUKKyAgICAgICAgYWRtaW5pc3RyYXRpdmUgY2FwYWJpbGl0aWVzLjwvbGk+CisgICAgPGxpPjxlbT5BcyBTT0FQLUJhc2VkIFdlYiBTZXJ2aWNlczwvZW0+IC0gVGhlIG9wZXJhdGlvbmFsIGNvbW1hbmRzIHRvCisgICAgICAgIGFkbWluaXN0ZXIgVG9tY2F0IGFyZSBtYWRlIGF2YWlsYWJsZSBhcyB3ZWIgc2VydmljZXMgdGhhdCB1dGlsaXplCisgICAgICAgIFNPQVAgbWVzc2FnZSBmb3JtYXRzLjwvbGk+CisgICAgPGxpPjxlbT5BcyBKYXZhIE1hbmFnZW1lbnQgRXh0ZW5zaW9ucyAoSk1YKSBDb21tYW5kczwvZW0+IC0gVGhlIG9wZXJhdGlvbmFsCisgICAgICAgIGNvbW1hbmRzIHRvIGFkbWluaXN0ZXIgVG9tY2F0IGFyZSBtYWRlIGF2YWlsYWJsZSB0aHJvdWdoIEpNWCBBUElzLAorICAgICAgICBmb3IgaW50ZWdyYXRpb24gaW50byBtYW5hZ2VtZW50IGNvbnNvbGVzIHRoYXQgdXRpbGl6ZSB0aGVtLjwvbGk+CisgICAgPGxpPjxlbT5PdGhlciBSZW1vdGUgQWNjZXNzIEFQSXM8L2VtPiAtIE90aGVyIHJlbW90ZSBhY2Nlc3MgQVBJcywgc3VjaAorICAgICAgICBhcyBKSU5JLCBSTUksIGFuZCBDT1JCQSBjYW4gYWxzbyBiZSB1dGlsaXplZCB0byBhY2Nlc3MgYWRtaW5pc3RyYXRpdmUKKyAgICAgICAgY2FwYWJpbGl0aWVzLjwvbGk+CisgICAgPC91bD4KKworICAgIDxwPlVuZGVybHlpbmcgYWxsIG9mIHRoZSBhY2Nlc3MgbWV0aG9kcyBkZXNjcmliZWQgYWJvdmUsIGl0IGlzIGFzc3VtZWQKKyAgICB0aGF0IHRoZSBhY3R1YWwgb3BlcmF0aW9ucyBhcmUgcGVyZm9ybWVkIGVpdGhlciBkaXJlY3RseSBvbiB0aGUKKyAgICBjb3JyZXNwb25kaW5nIENhdGFsaW5hIGNvbXBvbmVudHMgKHN1Y2ggYXMgY2FsbGluZyB0aGUKKyAgICA8Y29kZT5EZXBsb3llci5kZXBsb3koKTwvY29kZT4gbWV0aG9kIHRvIGRlcGxveSBhIG5ldyB3ZWIgYXBwbGljYXRpb24pLAorICAgIG9yIHRocm91Z2ggYSAiYnVzaW5lc3MgbG9naWMiIGxheWVyIHRoYXQgY2FuIGJlIHNoYXJlZCBhY3Jvc3MgYWxsIG9mIHRoZQorICAgIGFjY2VzcyBtZXRob2RzLiAgVGhpcyBhcHByb2FjaCBtaW5pbWl6ZXMgdGhlIGNvc3Qgb2YgYWRkaW5nIG5ldworICAgIGFkbWluaXN0cmF0aXZlIGNhcGFiaWxpdGllcyBsYXRlciAtLSBpdCBpcyBvbmx5IG5lY2Vzc2FyeSB0byBhZGQgdGhlCisgICAgY29ycmVzcG9uZGluZyBidXNpbmVzcyBsb2dpYyBmdW5jdGlvbiwgYW5kIHRoZW4gd3JpdGUgYWRhcHRlcnMgdG8gaXQgZm9yCisgICAgYWxsIGRlc2lyZWQgYWNjZXNzIG1ldGhvZHMuPC9wPgorCisgICAgPHA+VGhlIGN1cnJlbnQgc3RhdHVzIG9mIHRoaXMgZnVuY3Rpb25hbCBzcGVjaWZpY2F0aW9uIGlzCisgICAgPHN0cm9uZz5QUk9QT1NFRDwvc3Ryb25nPi4gIEl0IGhhcyBub3QgeWV0IGJlZW4gZGlzY3Vzc2VkIGFuZAorICAgIGFncmVlZCB0byBvbiB0aGUgVE9NQ0FULURFViBtYWlsaW5nIGxpc3QuPC9wPgorCisgIDwvc3Vic2VjdGlvbj4KKworCisgIDxzdWJzZWN0aW9uIG5hbWU9IkV4dGVybmFsIFNwZWNpZmljYXRpb25zIj4KKworICAgIDxwPlRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGZ1bmN0aW9uYWxpdHkgZGVwZW5kcyBvbiB0aGUgZm9sbG93aW5nCisgICAgZXh0ZXJuYWwgc3BlY2lmaWNhdGlvbnM6PC9wPgorICAgIDx1bD4KKyAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9qZGsvaWRsL2luZGV4Lmh0bWwiPkphdmEKKyAgICAgICAgSURMPC9hPiAoZm9yIENPUkJBLCBpbmNsdWRlZCBpbiB0aGUgSkRLKTwvbGk+CisgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvSmF2YU1hbmFnZW1lbnQvaW5kZXguaHRtbCI+CisgICAgICAgIEphdmEgTWFuYWdlbWVudCBFeHRlbnNpb25zPC9hPjwvbGk+CisgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvcm1pL2luZGV4Lmh0bWwiPlJlbW90ZQorICAgICAgICBNZXRob2QgSW52b2NhdGlvbjwvYT4gKEluY2x1ZGVkIGluIHRoZSBKREspPC9saT4KKyAgICA8L3VsPgorCisgIDwvc3Vic2VjdGlvbj4KKworCisgIDxzdWJzZWN0aW9uIG5hbWU9IkltcGxlbWVudGF0aW9uIFJlcXVpcmVtZW50cyI+CisKKyAgICA8cD5UaGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBmdW5jdGlvbmFsaXR5IHNoYWxsIGNvbmZvcm0gdG8gdGhlCisgICAgZm9sbG93aW5nIHJlcXVpcmVtZW50czo8L3A+CisgICAgPHVsPgorICAgIDxsaT5UbyB0aGUgbWF4aW11bSBleHRlbnQgZmVhc2libGUsIGFsbCBhZG1pbmlzdHJhdGl2ZSBmdW5jdGlvbnMsCisgICAgICAgIGFuZCB0aGUgYWNjZXNzIG1ldGhvZHMgdGhhdCBzdXBwb3J0IHRoZW0sIHNoYWxsIHJ1biBwb3J0YWJseQorICAgICAgICBvbiBhbGwgcGxhdGZvcm1zIHdoZXJlIFRvbWNhdCA1IGl0c2VsZiBydW5zLjwvbGk+CisgICAgPGxpPkluIGEgZGVmYXVsdCBUb21jYXQgZGlzdHJpYnV0aW9uLCBhbGwgYWRtaW5pc3RyYXRpdmUgY2FwYWJpbGl0aWVzCisgICAgICAgIHNoYWxsIGJlIGRpc2FibGVkLiAgSXQgc2hhbGwgYmUgbmVjZXNzYXJ5IGZvciBhIHN5c3RlbQorICAgICAgICBhZG1pbmlzdHJhdG9yIHRvIHNwZWNpZmljYWxseSBlbmFibGUgdGhlIGRlc2lyZWQgYWNjZXNzIG1ldGhvZHMKKyAgICAgICAgKHN1Y2ggYXMgYnkgYWRkaW5nIGEgdXNlcm5hbWUvcGFzc3dvcmQgd2l0aCBhIHNwZWNpZmljIHJvbGUgdG8KKyAgICAgICAgdGhlIFRvbWNhdCB1c2VyJ3MgZGF0YWJhc2UuPC9saT4KKyAgICA8bGk+QWRtaW5pc3RyYXRpdmUgZnVuY3Rpb25zIHNoYWxsIGJlIHJlYWxpemVkIGFzIGRpcmVjdCBjYWxscyB0bworICAgICAgICBjb3JyZXNwb25kaW5nIENhdGFsaW5hIEFQSXMsIG9yIHRocm91Z2ggYSBidXNpbmVzcyBsb2dpYyBsYXllcgorICAgICAgICB0aGF0IGlzIGluZGVwZW5kZW50IG9mIHRoZSBhY2Nlc3MgbWV0aG9kIHVzZWQgdG8gaW5pdGlhdGUgaXQuPC9saT4KKyAgICA8bGk+VGhlIGNvbW1vbiBidXNpbmVzcyBsb2dpYyBjb21wb25lbnRzIHNoYWxsIGJlIGltcGxlbWVudGVkIGluCisgICAgICAgIHBhY2thZ2UgPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5hZG1pbjwvY29kZT4uPC9saT4KKyAgICA8bGk+VGhlIGNvbW1vbiBidXNpbmVzcyBsb2dpYyBjb21wb25lbnRzIHNoYWxsIGJlIGJ1aWx0IGFzIHBhcnQgb2YgdGhlCisgICAgICAgIHN0YW5kYXJkIENhdGFsaW5hIGJ1aWxkIHByb2Nlc3MsIGFuZCBtYWRlIHZpc2libGUgaW4gdGhlCisgICAgICAgIENhdGFsaW5hIGNsYXNzIGxvYWRlci48L2xpPgorICAgIDxsaT5UaGUgSmF2YSBjb21wb25lbnRzIHJlcXVpcmVkIGZvciBlYWNoIGFjY2VzcyBtZXRob2Qgc2hhbGwgYmUKKyAgICAgICAgaW1wbGVtZW50ZWQgaW4gc3VicGFja2FnZXMgb2YgPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5hZG1pbjwvY29kZT4uCisgICAgICAgIDwvbGk+CisgICAgPGxpPlRoZSBidWlsZCBzY3JpcHRzIHNob3VsZCB0cmVhdCBlYWNoIGFjY2VzcyBtZXRob2QgYXMgb3B0aW9uYWwsCisgICAgICAgIHNvIHRoYXQgaXQgd2lsbCBiZSBidWlsdCBvbmx5IGlmIHRoZSBjb3JyZXNwb25kaW5nIHJlcXVpcmVkCisgICAgICAgIEFQSXMgYXJlIHByZXNlbnQgYXQgYnVpbGQgdGltZS48L2xpPgorICAgIDxsaT5JdCBzaGFsbCBiZSBwb3NzaWJsZSB0byBzYXZlIHRoZSBjb25maWd1cmVkIHN0YXRlIG9mIHRoZSBydW5uaW5nCisgICAgICAgIFRvbWNhdCBjb250YWluZXIgc3VjaCB0aGF0IHRoaXMgc3RhdGUgY2FuIGJlIHJlcHJvZHVjZWQgd2hlbiB0aGUKKyAgICAgICAgY29udGFpbmVyIGlzIHNodXQgZG93biBhbmQgcmVzdGFydGVkLjwvbGk+CisgICAgPGxpPkFkbWluc3RyYXRpdmUgY29tbWFuZHMgdG8gc3RhcnQgdXAgYW5kIHNodXQgZG93biB0aGUgb3ZlcmFsbAorICAgICAgICBUb21jYXQgY29udGFpbmVyIGFyZSA8c3Ryb25nPm91dCBvZiBzY29wZTwvc3Ryb25nPiBmb3IgdGhlCisgICAgICAgIHB1cnBvc2VzIG9mIHRoZXNlIGFwcGxpY2F0aW9ucy4gIEl0IGlzIGFzc3VtZWQgdGhhdCBvdGhlcgorICAgICAgICAodXN1YWxseSBwbGF0Zm9ybS1zcGVjaWZpYykgbWVjaGFuaXNtcyB3aWxsIGJlIHVzZWQgZm9yIGNvbnRhaW5lcgorICAgICAgICBzdGFydHVwIGFuZCBzaHV0ZG93bi48L2xpPgorICAgIDwvdWw+CisKKyAgPC9zdWJzZWN0aW9uPgorCisKKzwvc2VjdGlvbj4KKworCis8c2VjdGlvbiBuYW1lPSJEZXBlbmRlbmNpZXMiPgorCisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iRW52aXJvbm1lbnRhbCBEZXBlbmRlbmNpZXMiPgorCisgICAgPHA+VGhlIGZvbGxvd2luZyBlbnZpcm9ubWVudGFsIGRlcGVuZGVuY2llcyBtdXN0IGJlIG1ldCBpbiBvcmRlciBmb3IKKyAgICBhZG1pbmlzdHJhdGl2ZSBhcHBsaWNhdGlvbnMgdG8gb3BlcmF0ZSBjb3JyZWN0bHk6PC9wPgorICAgIDx1bD4KKyAgICA8bGk+Rm9yIGFjY2VzcyBtZXRob2RzIHRoYXQgcmVxdWlyZSBjcmVhdGlvbiBvZiBzZXJ2ZXIgc29ja2V0cywgdGhlCisgICAgICAgIGFwcHJvcHJpYXRlIHBvcnRzIG11c3QgYmUgY29uZmlndXJlZCBhbmQgYXZhaWxhYmxlLjwvbGk+CisgICAgPC91bD4KKworICA8L3N1YnNlY3Rpb24+CisKKworICA8c3Vic2VjdGlvbiBuYW1lPSJDb250YWluZXIgRGVwZW5kZW5jaWVzIj4KKworICAgIDxwPkNvcnJlY3Qgb3BlcmF0aW9uIG9mIGFkbWluaXN0cmF0aXZlIGFwcGxpY2F0aW9ucyBkZXBlbmRzIG9uIHRoZQorICAgICAgIGZvbGxvd2luZyBzcGVjaWZpYyBmZWF0dXJlcyBvZiB0aGUgc3Vycm91bmRpbmcgY29udGFpbmVyOjwvcD4KKyAgICA8dWw+CisgICAgPGxpPlRvIHRoZSBtYXhpbXVtIGV4dGVudCBmZWFzaWJsZSwgQ2F0YWxpbmEgY29tcG9uZW50cyB0aGF0IG9mZmVyCisgICAgICAgIGRpcmVjdCBhZG1pbmlzdHJhdGl2ZSBBUElzIGFuZCBwcm9wZXJ0eSBzZXR0ZXJzIHNoYWxsIHN1cHBvcnQKKyAgICAgICAgImxpdmUiIGNoYW5nZXMgdG8gdGhlaXIgb3BlcmF0aW9uLCB3aXRob3V0IHJlcXVpcmluZyBhIGNvbnRhaW5lcgorICAgICAgICByZXN0YXJ0LjwvbGk+CisgICAgPC91bD4KKworICA8L3N1YnNlY3Rpb24+CisKKworICA8c3Vic2VjdGlvbiBuYW1lPSJFeHRlcm5hbCBUZWNobm9sb2dpZXMiPgorCisgICAgPHA+VGhlIGF2YWlsYWJpbGl0eSBvZiB0aGUgZm9sbG93aW5nIHRlY2hub2xvZ2llcyBjYW4gYmUgYXNzdW1lZAorICAgIGZvciB0aGUgaW1wbGVtZW50YXRpb24gYW5kIG9wZXJhdGlvbiBvZiB0aGUgdmFyaW91cyBhY2Nlc3MgbWV0aG9kcworICAgIGFuZCB0aGUgY29ycmVzcG9uZGluZyBhZG1pbmlzdHJhdGl2ZSBidXNpbmVzcyBsb2dpYzo8L3A+CisgICAgPHVsPgorICAgIDxsaT48YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvIj5KYXZhIDIgU3RhbmRhcmQgRWRpdGlvbjwvYT4KKyAgICAgICAgKFZlcnNpb24gMS4yIG9yIGxhdGVyKTwvbGk+CisgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cuamNwLm9yZy9qc3IvZGV0YWlsLzE1NC5qc3AiPlNlcnZsZXQgMi40PC9hPgorICAgICAgICAoc3VwcG9ydGVkIG5hdGl2ZWx5IGJ5IFRvbWNhdCA1KTwvbGk+CisgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cuamNwLm9yZy9qc3IvZGV0YWlsLzE1Mi5qc3AiPkphdmFTZXJ2ZXIgUGFnZXMgMi4wPC9hPgorICAgICAgICAoc3VwcG9ydGVkIG5hdGl2ZWx5IGJ5IFRvbWNhdCA1KTwvbGk+CisgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvdGFnbGlicy9kb2Mvc3RhbmRhcmQtZG9jL2ludHJvLmh0bWwiPkphdmFTZXJ2ZXIgUGFnZXMgU3RhbmRhcmQgVGFnIExpYnJhcnkgMS4wIChKYWthcnRhIFRhZ2xpYnMtU3RhbmRhcmQgMS4wLjMpPC9hPjwvbGk+CisgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvc3RydXRzLyI+U3RydXRzIEZyYW1ld29yazwvYT4KKyAgICAgICAgKFZlcnNpb24gMS4wKSAtIE1WQyBGcmFtZXdvcmsgZm9yIFdlYiBBcHBsaWNhdGlvbnM8L2xpPgorICAgIDxsaT48c3Ryb25nPlRPIEJFIERFVEVSTUlORUQ8L3N0cm9uZz4gLSBBcHBsaWNhdGlvbiBmb3IgaG9zdGluZyBTT0FQCisgICAgICAgIGJhc2VkIHdlYiBzZXJ2aWNlczwvbGk+CisgICAgPC91bD4KKworICA8L3N1YnNlY3Rpb24+CisKKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IkZ1bmN0aW9uYWxpdHkiPgorCisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iUHJvcGVydGllcyBvZiBBZG1pbmlzdGVyZWQgT2JqZWN0cyI+CisKKyAgPHA+RnVuY3Rpb25hbCByZXF1aXJlbWVudHMgZm9yIGFkbWluaXN0cmF0aXZlIGFwcGxpY2F0aW9ucyBhcmUgc3BlY2lmaWVkCisgIGluIHRlcm1zIG9mIDxlbT5BZG1pbmlzdGVyZWQgT2JqZWN0czwvZW0+LCB3aG9zZSBkZWZpbml0aW9ucyBhbmQgZGV0YWlsZWQKKyAgcHJvcGVydGllcyBhcmUgbGlzdGVkIDxhIGhyZWY9ImZzLWFkbWluLW9iamVjdHMuaHRtbCI+aGVyZTwvYT4uICBJbiBnZW5lcmFsLAorICBBZG1pbmlzdGVyZWQgT2JqZWN0cyBjb3JyZXNwb25kIHRvIGNvbXBvbmVudHMgaW4gdGhlIENhdGFsaW5hIGFyY2hpdGVjdHVyZSwKKyAgYnV0IHRoZXNlIG9iamVjdHMgYXJlIGRlZmluZWQgc2VwYXJhdGVseSBoZXJlIGZvciB0aGUgZm9sbG93aW5nIHJlYXNvbnM6PC9wPgorICA8dWw+CisgIDxsaT5JdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSBhZG1pbmlzdHJhdGl2ZSBhcHBsaWNhdGlvbnMgZG8gbm90IGV4cG9zZQorICAgICAgZXZlcnkgcG9zc2libGUgY29uZmlndXJhYmxlIGZhY2V0IG9mIHRoZSB1bmRlcmx5aW5nIGNvbXBvbmVudHMuPC9saT4KKyAgPGxpPkluIHNvbWUgY2FzZXMsIGFuIEFkbWluaXN0ZXJlZCBPYmplY3QgKGZyb20gdGhlIHBlcnNwZWN0aXZlIG9mIGFuCisgICAgICBhZG1pbmlzdHJhdGl2ZSBvcGVyYXRpb24pIGlzIHJlYWxpemVkIGJ5IG1vcmUgdGhhbiBvbmUgQ2F0YWxpbmEKKyAgICAgIGNvbXBvbmVudCwgYXQgYSBmaW5lci1ncmFpbmVkIGxldmVsIG9mIGRldGFpbC48L2xpPgorICA8bGk+SXQgaXMgbmVjZXNzYXJ5IHRvIHJlcHJlc2VudCB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgYQorICAgICAgY29tcG9uZW50IHNlcGFyYXRlbHkgZnJvbSB0aGUgY29tcG9uZW50IGl0c2VsZiAoZm9yIGluc3RhbmNlLCBpbgorICAgICAgb3JkZXIgdG8gc3RvcmUgdGhhdCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBsYXRlciB1c2UpLjwvbGk+CisgIDxsaT5JdCBpcyBuZWNlc3NhcnkgdG8gcmVwcmVzZW50IGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gKHN1Y2ggYXMKKyAgICAgIGEgRGVmYXVsdCBDb250ZXh0KSB3aGVuIHRoZXJlIGlzIG5vIGNvcnJlc3BvbmRpbmcgY29tcG9uZW50IGluc3RhbmNlLgorICAgICAgPC9saT4KKyAgPGxpPkFkbWluaXN0ZXJlZCBPYmplY3RzLCB3aGVuIHJlYWxpemVkIGFzIEphdmEgY2xhc3Nlcywgd2lsbCBpbmNsdWRlCisgICAgICBtZXRob2RzIGZvciBhZG1pbmlzdHJhdGl2ZSBvcGVyYXRpb25zIHRoYXQgaGF2ZSBubyBjb3JyZXNwb25kZW5jZQorICAgICAgdG8gb3BlcmF0aW9ucyBwZXJmb3JtZWQgYnkgdGhlIGNvcnJlc3BvbmRpbmcgYWN0dWFsIGNvbXBvbmVudHMuPC9saT4KKyAgPC91bD4KKworICA8cD5JdCBpcyBhc3N1bWVkIHRoYXQgdGhlIHJlYWRlciBpcyBmYW1pbGlhciB3aXRoIHRoZSBvdmVyYWxsIGNvbXBvbmVudAorICBhcmNoaXRlY3R1cmUgb2YgQ2F0YWxpbmEuICBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiwgc2VlIHRoZSBjb3JyZXNwb25kaW5nCisgIERldmVsb3BlciBEb2N1bWVudGF0aW9uLiAgVG8gZGlzdGluZ3Vpc2ggbmFtZXMgdGhhdCBhcmUgdXNlZCBhcyBib3RoCisgIDxlbT5BZG1pbmlzdGVyZWQgT2JqZWN0czwvZW0+IGFuZCA8Y29kZT5Db21wb25lbnRzPC9jb2RlPiwgZGlmZmVyZW50CisgIGZvbnQgcHJlc2VudGF0aW9ucyBhcmUgdXRpbGl6ZWQuICBEZWZhdWx0IHZhbHVlcyBmb3IgbWFueSBwcm9wZXJ0aWVzCisgIGFyZSBsaXN0ZWQgaW4gW3NxdWFyZSBicmFja2V0c10uPC9wPgorCisgIDwvc3Vic2VjdGlvbj4KKworCisgIDxzdWJzZWN0aW9uIG5hbWU9IlN1cHBvcnRlZCBBZG1pbmlzdHJhdGl2ZSBPcGVyYXRpb25zIj4KKworICA8cD5UaGUgYWRtaW5pc3RyYXRpdmUgb3BlcmF0aW9ucyB0aGF0IGFyZSBhdmFpbGFibGUgYXJlIGRlc2NyaWJlZCBpbiB0ZXJtcworICBvZiB0aGUgY29ycmVzcG9uZGluZyBBZG1pbmlzdGVyZWQgT2JqZWN0cyAoYXMgZGVmaW5lZCBhYm92ZSksIGluIGEgbWFubmVyCisgIHRoYXQgaXMgaW5kZXBlbmRlbnQgb2YgdGhlIGFjY2VzcyBtZXRob2QgYnkgd2hpY2ggdGhlc2Ugb3BlcmF0aW9ucyBhcmUKKyAgcmVxdWVzdGVkLiAgSW4gZ2VuZXJhbCwgc3VjaCBvcGVyYXRpb25zIGFyZSByZWxldmFudCBvbmx5IGluIHRoZSBjb250ZXh0CisgIG9mIGEgcGFydGljdWxhciBBZG1pbmlzdGVyZWQgT2JqZWN0IChhbmQgd2lsbCBtb3N0IGxpa2VseSBiZSByZWFsaXplZCBhcworICBtZXRob2QgY2FsbHMgb24gdGhlIGNvcnJlc3BvbmRpbmcgQWRtaW5pc3RlcmVkIE9iamVjdCBjbGFzc2VzKSwgc28gdGhleQorICBhcmUgb3JnYW5pemVkIGJhc2VkIG9uIHRoZSBjdXJyZW50bHkgImZvY3VzZWQiIGFkbWluaXN0ZXJlZCBvYmplY3QuCisgIFRoZSBhdmFpbGFibGUgU3VwcG9ydGVkIE9wZXJhdGlvbnMgYXJlIGRvY3VtZW50ZWQKKyAgPGEgaHJlZj0iZnMtYWRtaW4tb3BlcnMuaHRtbCI+aGVyZTwvYT4uPC9wPgorCisgIDwvc3Vic2VjdGlvbj4KKworCisgIDxzdWJzZWN0aW9uIG5hbWU9IkFjY2VzcyBNZXRob2QgU3BlY2lmaWMgUmVxdWlyZW1lbnRzIj4KKworICA8aDU+U2NyaXB0YWJsZSBXZWIgQXBwbGljYXRpb248L2g1PgorCisgIDxwPkFuIGFwcHJvcHJpYXRlIHN1YnNldCBvZiB0aGUgYWRtaW5pc3RyYXRpdmUgb3BlcmF0aW9ucyBkZXNjcmliZWQgYWJvdmUKKyAgc2hhbGwgYmUgaW1wbGVtZW50ZWQgYXMgY29tbWFuZHMgdGhhdCBjYW4gYmUgcGVyZm9ybWVkIGJ5IHRoZSAiTWFuYWdlciIKKyAgd2ViIGFwcGxpY2F0aW9uLiAgPHN0cm9uZz5GSVhNRTwvc3Ryb25nPiAtIEVudW1lcmF0ZSB0aGVtLjwvcD4KKworICA8cD5JbiBhZGRpdGlvbiwgdGhpcyB3ZWIgYXBwbGljYXRpb24gc2hhbGwgY29uZm9ybSB0byB0aGUgZm9sbG93aW5nCisgIHJlcXVpcmVtZW50czo8L3A+CisgIDx1bD4KKyAgPGxpPkFsbCByZXF1ZXN0IFVSSXMgc2hhbGwgYmUgcHJvdGVjdGVkIGJ5IGEgc2VjdXJpdHkgY29uc3RyYWludCB0aGF0CisgICAgICByZXF1aXJlcyBzZWN1cml0eSByb2xlIDxjb2RlPm1hbmFnZXI8L2NvZGU+IGZvciBwcm9jZXNzaW5nLjwvbGk+CisgIDxsaT5UaGUgZGVmYXVsdCB1c2VyIGRhdGFiYXNlIHNoYWxsIDxzdHJvbmc+bm90PC9zdHJvbmc+IGNvbnRhaW4gYW55CisgICAgICB1c2VyIHRoYXQgaGFzIGJlZW4gYXNzaWduZWQgdGhlIHJvbGUgPGNvZGU+bWFuYWdlcjwvY29kZT4uPC9saT4KKyAgPC91bD4KKworICA8aDU+SFRNTC1CYXNlZCBXZWIgQXBwbGljYXRpb248L2g1PgorCisgIDxwPlRoZSBlbnRpcmUgc3VpdGUgb2YgYWRtaW5pc3RyYXRpdmUgb3BlcmF0aW9ucyBkZXNjcmliZWQgYWJvdmUgc2hhbGwgYmUKKyAgbWFkZSBhdmFpbGFibGUgdGhyb3VnaCBhIHdlYiBhcHBsaWNhdGlvbiBkZXNpZ25lZCBmb3IgaHVtYW4gaW50ZXJhY3Rpb24uCisgIEluIGFkZGl0aW9uLCB0aGlzIHdlYiBhcHBsaWNhdGlvbiBzaGFsbCBjb25mb3JtIHRvIHRoZSBmb2xsb3dpbmcKKyAgcmVxdWlyZW1lbnRzOjwvcD4KKyAgPHVsPgorICA8bGk+TXVzdCBiZSBpbXBsZW1lbnRlZCB1c2luZyBzZXJ2bGV0LCBKU1AsIGFuZCBNVkMgZnJhbWV3b3JrIHRlY2hub2xvZ2llcworICAgICAgZGVzY3JpYmVkIHVuZGVyICJFeHRlcm5hbCBUZWNobm9sb2dpZXMiLCBhYm92ZS48L2xpPgorICA8bGk+UHJvbXB0cyBhbmQgZXJyb3IgbWVzc2FnZXMgbXVzdCBiZSBpbnRlcm5hdGlvbmFsaXphYmxlIHRvIG11bHRpcGxlCisgICAgICBsYW5ndWFnZXMuPC9saT4KKyAgPGxpPlJlbmRlcmVkIEhUTUwgbXVzdCBiZSBjb21wYXRpYmxlIHdpdGggTmV0c2NhcGUgTmF2aWdhdG9yICh2ZXJzb24gNC43CisgICAgICBvciBsYXRlcikgYW5kIEludGVybmV0IEV4cGxvcmVyICh2ZXJzaW9uIDUuMCBvciBsYXRlcikuPC9saT4KKyAgPC91bD4KKworICA8L3N1YnNlY3Rpb24+CisKKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IlRlc3RhYmxlIEFzc2VydGlvbnMiPgorCisgIDxwPjxzdHJvbmc+RklYTUU8L3N0cm9uZz4gLSBDb21wbGV0ZSB0aGlzIHNlY3Rpb24uPC9wPgorCis8L3NlY3Rpb24+CisKKworPC9ib2R5PgorCis8L2RvY3VtZW50PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9mdW5jc3BlY3MvZnMtYWRtaW4tb2JqZWN0cy54bWwgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2Z1bmNzcGVjcy9mcy1hZG1pbi1vYmplY3RzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjRhZDkwCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9mdW5jc3BlY3MvZnMtYWRtaW4tb2JqZWN0cy54bWwKQEAgLTAsMCArMSw0ODEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCFET0NUWVBFIGRvY3VtZW50IFsKKyAgPCFFTlRJVFkgcHJvamVjdCBTWVNURU0gInByb2plY3QueG1sIj4KK10+Cis8ZG9jdW1lbnQgdXJsPSJmcy1hZG1pbi1vYmplY3RzLmh0bWwiPgorCisgICZwcm9qZWN0OworCisgIDxwcm9wZXJ0aWVzPgorICAgIDxhdXRob3IgZW1haWw9ImNyYWlnbWNjQGFwYWNoZS5vcmciPkNyYWlnIE1jQ2xhbmFoYW48L2F1dGhvcj4KKyAgICA8dGl0bGU+QWRtaW5pc3RyYXRpdmUgQXBwcyAtIEFkbWluaXN0ZXJlZCBPYmplY3RzPC90aXRsZT4KKyAgICA8cmV2aXNpb24+JElkJDwvcmV2aXNpb24+CisgIDwvcHJvcGVydGllcz4KKworPGJvZHk+CisKKworPHNlY3Rpb24gbmFtZT0iQWRtaW5pc3RlcmVkIE9iamVjdHMgT3ZlcnZpZXciPgorCis8cD5UaGlzIGRvY3VtZW50IGRlZmluZXMgdGhlIDxlbT5BZG1pbmlzdGVyZWQgT2JqZWN0czwvZW0+IHRoYXQgcmVwcmVzZW50Cit0aGUgaW50ZXJuYWwgYXJjaGl0ZWN0dXJhbCBjb21wb25lbnRzIG9mIHRoZSBDYXRhbGluYSBzZXJ2bGV0IGNvbnRhaW5lci4KK0Fzc29jaWF0ZWQgd2l0aCBlYWNoIGlzIGEgc2V0IG9mIDxhIGhyZWY9ImZzLWFkbWluLW9wZXJzLmh0bWwiPlN1cHBvcnRlZAorT3BlcmF0aW9uczwvYT4gdGhhdCBjYW4gYmUgcGVyZm9ybWVkIHdoZW4gdGhlIGFkbWluaXN0cmF0aXZlIGFwcGxpY2F0aW9uIGlzCisiZm9jdXNlZCIgb24gYSBwYXJ0aWN1bGFyIGNvbmZpZ3VyYWJsZSBvYmplY3QuPC9wPgorCis8cD5UaGUgZm9sbG93aW5nIEFkbWluaXN0ZXJlZCBPYmplY3RzIGFyZSBkZWZpbmVkOjwvcD4KKzx1bD4KKzxsaT48YSBocmVmPSIjQWNjZXNzIExvZ2dlciI+QWNjZXNzIExvZ2dlcjwvYT48L2xpPgorPGxpPjxhIGhyZWY9IiNDb25uZWN0b3IiPkNvbm5lY3RvcjwvYT48L2xpPgorPGxpPjxhIGhyZWY9IiNDb250ZXh0Ij5Db250ZXh0PC9hPjwvbGk+Cis8bGk+PGEgaHJlZj0iI0RlZmF1bHQgQ29udGV4dCI+RGVmYXVsdCBDb250ZXh0PC9hPjwvbGk+Cis8bGk+PGEgaHJlZj0iI0RlZmF1bHQgRGVwbG95bWVudCBEZXNjcmlwdG9yIj5EZWZhdWx0IERlcGxveW1lbnQgRGVzY3JpcHRvcjwvYT48L2xpPgorPGxpPjxhIGhyZWY9IiNFbmdpbmUiPkVuZ2luZTwvYT48L2xpPgorPGxpPjxhIGhyZWY9IiNFbnZpcm9ubWVudCBFbnRyeSI+RW52aXJvbm1lbnQgRW50cnk8L2E+PC9saT4KKzxsaT48YSBocmVmPSIjSG9zdCI+SG9zdDwvYT48L2xpPgorPGxpPjxhIGhyZWY9IiNKREJDIFJlc291cmNlIj5KREJDIFJlc291cmNlPC9hPjwvbGk+Cis8bGk+PGEgaHJlZj0iI0xvYWRlciI+TG9hZGVyPC9hPjwvbGk+Cis8bGk+PGEgaHJlZj0iI01hbmFnZXIiPk1hbmFnZXI8L2E+PC9saT4KKzxsaT48YSBocmVmPSIjUmVhbG0iPlJlYWxtPC9hPjwvbGk+Cis8bGk+PGEgaHJlZj0iI1JlcXVlc3QgRmlsdGVyIj5SZXF1ZXN0IEZpbHRlcjwvYT48L2xpPgorPGxpPjxhIGhyZWY9IiNTZXJ2ZXIiPlNlcnZlcjwvYT48L2xpPgorPGxpPjxhIGhyZWY9IiNTZXJ2aWNlIj5TZXJ2aWNlPC9hPjwvbGk+Cis8L3VsPgorCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iQWNjZXNzIExvZ2dlciI+CisKKyAgPHA+QW4gPGVtPkFjY2VzcyBMb2dnZXI8L2VtPiBpcyBhbiBvcHRpb25hbCA8Y29kZT5WYWx2ZTwvY29kZT4gdGhhdCBjYW4KKyAgY3JlYXRlIHJlcXVlc3QgYWNjZXNzIGxvZ3MgaW4gdGhlIHNhbWUgZm9ybWF0cyBhcyB0aG9zZSBwcm92aWRlZCBieQorICB3ZWIgc2VydmVycy4gIFN1Y2ggYWNjZXNzIGxvZ3MgYXJlIHVzZWZ1bCBpbnB1dCB0byBoaXQgY291bnQgYW5kIHVzZXIKKyAgYWNjZXNzIHRyYWNraW5nIGFuYWx5c2lzIHByb2dyYW1zLiAgQW4gQWNjZXNzIExvZ2dlciBjYW4gYmUgYXR0YWNoZWQgdG8KKyAgYW4gPGVtPkVuZ2luZTwvZW0+LCBhIDxlbT5Ib3N0PC9lbT4sIGEgPGVtPkNvbnRleHQ8L2VtPiwgb3IgYSA8ZW0+RGVmYXVsdAorICBDb250ZXh0PC9lbT4uPC9wPgorCisgIDxwPlRoZSBzdGFuZGFyZCBjb21wb25lbnQgaW1wbGVtZW50aW5nIGFuIDxlbT5BY2Nlc3MgTG9nZ2VyPC9lbT4gaXMKKyAgPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS52YWx2ZXMuQWNjZXNzTG9nVmFsdmU8L2NvZGU+LiAgSXQgc3VwcG9ydHMgdGhlCisgIGZvbGxvd2luZyBjb25maWd1cmFibGUgcHJvcGVydGllczo8L3A+CisgIDx1bD4KKyAgPGxpPjxjb2RlPmRlYnVnPC9jb2RlPiAtIERlYnVnZ2luZyBkZXRhaWwgbGV2ZWwuICBbMF08L2xpPgorICA8bGk+PGNvZGU+ZGlyZWN0b3J5PC9jb2RlPiAtIEFic29sdXRlIG9yIHJlbGF0aXZlICh0byAkQ0FUQUxJTkFfSE9NRSkgcGF0aAorICAgICAgb2YgdGhlIGRpcmVjdG9yeSBpbnRvIHdoaWNoIGFjY2VzcyBsb2cgZmlsZXMgYXJlIGNyZWF0ZWQuCisgICAgICBbbG9nc10uPC9saT4KKyAgPGxpPjxjb2RlPnBhdHRlcm48L2NvZGU+IC0gUGF0dGVybiBzdHJpbmcgZGVmaW5pbmcgdGhlIGZpZWxkcyB0byBiZQorICAgICAgaW5jbHVkZWQgaW4gdGhlIGFjY2VzcyBsb2cgb3V0cHV0LCBvciAiY29tbW9uIiBmb3IgdGhlIHN0YW5kYXJkCisgICAgICBhY2Nlc3MgbG9nIHBhdHRlcm4uICBTZWUKKyAgICAgIDxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEudmFsdmVzLkFjY2Vzc0xvZ1ZhbHZlPC9jb2RlPiBmb3IgbW9yZQorICAgICAgaW5mb3JtYXRpb24uICBbY29tbW9uXTwvbGk+CisgIDxsaT48Y29kZT5wcmVmaXg8L2NvZGU+IC0gUHJlZml4IGFkZGVkIHRvIHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBsb2cgZmlsZQorICAgICAgbmFtZSBjcmVhdGVkIGJ5IHRoaXMgYWNjZXNzIGxvZ2dlci48L2xpPgorICA8bGk+PGNvZGU+cmVzb2x2ZUhvc3RzPC9jb2RlPiAtIFNob3VsZCBJUCBhZGRyZXNzZXMgYmUgcmVzb2x2ZWQgdG8gaG9zdAorICAgICAgbmFtZXMgaW4gdGhlIGxvZz8gIFtmYWxzZV08L2xpPgorICA8bGk+PGNvZGU+c3VmZml4PC9jb2RlPiAtIFN1ZmZpeCBhZGRlZCB0byB0aGUgZW5kIG9mIGVhY2ggbG9nIGZpbGUgbmFtZQorICAgICAgY3JlYXRlZCBieSB0aGlzIGFjY2VzcyBsb2dnZXIuPC9saT4KKyAgPC91bD4KKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IkNvbm5lY3RvciI+CisKKyAgPHA+QSA8ZW0+Q29ubmVjdG9yPC9lbT4gaXMgdGhlIHJlcHJlc2VudGF0aW9uIG9mIGEgY29tbXVuaWNhdGlvbnMgZW5kcG9pbnQKKyAgYnkgd2hpY2ggcmVxdWVzdHMgYXJlIHJlY2VpdmVkIGZyb20gKGFuZCByZXNwb25zZXMgcmV0dXJuZWQgdG8pIGEgVG9tY2F0CisgIGNsaWVudC4gIFRoZSBhZG1pbmlzdHJhdGl2ZSBhcHBsaWNhdGlvbnMgc2hhbGwgc3VwcG9ydCB0aG9zZSBjb25uZWN0b3JzCisgIHRoYXQgYXJlIGNvbW1vbmx5IHV0aWxpemVkIGluIFRvbWNhdCBpbnN0YWxsYXRpb25zLCBhcyBkZXNjcmliZWQgaW4gZGV0YWlsCisgIGJlbG93LjwvcD4KKworICA8cD5Gb3Igc3RhbmRhbG9uZSB1c2UsIHRoZSBzdGFuZGFyZCBjb25uZWN0b3Igc3VwcG9ydGluZyB0aGUgSFRUUC8xLjEKKyAgcHJvdG9jb2wgaXMgPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3JzLmh0dHAuSHR0cENvbm5lY3RvcjwvY29kZT4uCisgIEl0IHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgY29uZmlndXJhYmxlIHByb3BlcnRpZXM6PC9wPgorICA8dWw+CisgIDxsaT48Y29kZT5hY2NlcHRDb3VudDwvY29kZT4gLSBUaGUgbWF4aW11bSBxdWV1ZSBsZW5ndGggb2YgaW5jb21pbmcKKyAgICAgIGNvbm5lY3Rpb25zIHRoYXQgaGF2ZSBub3QgeWV0IGJlZW4gYWNjZXB0ZWQuICBbMTBdPC9saT4KKyAgPGxpPjxjb2RlPmFkZHJlc3M8L2NvZGU+IC0gRm9yIHNlcnZlcnMgd2l0aCBtb3JlIHRoYW4gb25lIElQIGFkZHJlc3MsIHRoZQorICAgICAgYWRkcmVzcyB1cG9uIHdoaWNoIHRoaXMgY29ubmVjdG9yIHNob3VsZCBsaXN0ZW4uICBbQWxsIEFkZHJlc3Nlc108L2xpPgorICA8bGk+PGNvZGU+YnVmZmVyU2l6ZTwvY29kZT4gLSBEZWZhdWx0IGlucHV0IGJ1ZmZlciBzaXplIChpbiBieXRlcykgZm9yCisgICAgICByZXF1ZXN0cyBjcmVhdGVkIGJ5IHRoaXMgQ29ubmVjdG9yLiAgWzIwNDhdPC9saT4KKyAgPGxpPjxjb2RlPmRlYnVnPC9jb2RlPiAtIERlYnVnZ2luZyBkZXRhaWwgbGV2ZWwuICBbMF08L2xpPgorICA8bGk+PGNvZGU+ZW5hYmxlTG9va3VwczwvY29kZT4gLSBTaG91bGQgd2UgcGVyZm9ybSBETlMgbG9va3VwcyBvbiByZW1vdGUKKyAgICAgIElQIGFkZHJlc3NlcyB3aGVuIDxjb2RlPnJlcXVlc3QuZ2V0UmVtb3RlSG9zdCgpPC9jb2RlPiBpcyBjYWxsZWQ/CisgICAgICBbdHJ1ZV08L2xpPgorICA8bGk+PGNvZGU+bWF4UHJvY2Vzc29yczwvY29kZT4gLSBUaGUgbWF4aW11bSBudW1iZXIgb2YgcHJvY2Vzc29yIHRocmVhZHMKKyAgICAgIHN1cHBvcnRlZCBieSB0aGlzIGNvbm5lY3Rvci4gIFsyMF08L2xpPgorICA8bGk+PGNvZGU+bWluUHJvY2Vzc29yczwvY29kZT4gLSBUaGUgbWluaW11bSBudW1iZXIgb2YgcHJvY2Vzc29yIHRocmVhZHMKKyAgICAgIHRvIGJlIGNyZWF0ZWQgYXQgY29udGFpbmVyIHN0YXJ0dXAuICBbNV08L2xpPgorICA8bGk+PGNvZGU+cG9ydDwvY29kZT4gLSBUQ1AvSVAgcG9ydCBudW1iZXIgb24gd2hpY2ggdGhpcyBDb25uZWN0b3Igc2hvdWxkCisgICAgICBsaXN0ZW4gZm9yIGluY29taW5nIHJlcXVlc3RzLiBbODA4MF08L2xpPgorICA8bGk+PGNvZGU+cHJveHlOYW1lPC9jb2RlPiAtIEhvc3QgbmFtZSB0byBiZSByZXR1cm5lZCB3aGVuIGFuIGFwcGxpY2F0aW9uCisgICAgICBjYWxscyA8Y29kZT5yZXF1ZXN0LmdldFNlcnZlck5hbWUoKTwvY29kZT4uICBbVmFsdWUgb2YgSG9zdDogaGVhZGVyXTwvbGk+CisgIDxsaT48Y29kZT5wcm94eVBvcnQ8L2NvZGU+IC0gUG9ydCBudW1iZXIgdG8gYmUgcmV0dXJuZWQgd2hlbiBhbiBhcHBsaWNhdGlvbgorICAgICAgY2FsbHMgPGNvZGU+cmVxdWVzdC5nZXRTZXJ2ZXJQb3J0KCk8L2NvZGU+LiAgW1NhbWUgYXMgPGNvZGU+cG9ydDwvY29kZT5dCisgICAgICA8L2xpPgorICA8L3VsPgorCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iQ29udGV4dCI+CisKKyAgPHA+QSA8ZW0+Q29udGV4dDwvZW0+IGlzIHRoZSByZXByZXNlbnRhdGlvbiBvZiBhbiBpbmRpdmlkdWFsIHdlYiBhcHBsaWNhdGlvbiwKKyAgd2hpY2ggaXMgYXNzb2NpYXRlZCB3aXRoIGEgY29ycmVzcG9uZGluZyA8ZW0+SG9zdDwvZW0+LiAgTm90ZSB0aGF0IHRoZQorICBhZG1pbmlzdHJhYmxlIHByb3BlcnRpZXMgb2YgYSA8ZW0+Q29udGV4dDwvZW0+IGRvIDxzdHJvbmc+bm90PC9zdHJvbmc+CisgIGluY2x1ZGUgYW55IHNldHRpbmdzIGZyb20gaW5zaWRlIHRoZSB3ZWIgYXBwbGljYXRpb24gZGVwbG95bWVudCBkZXNjcmlwdG9yCisgIGZvciB0aGF0IGFwcGxpY2F0aW9uLjwvcD4KKworICA8cD5UaGUgc3RhbmRhcmQgY29tcG9uZW50IGltcGxlbWVudGluZyBhIDxlbT5Db250ZXh0PC9lbT4gaXMKKyAgPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkQ29udGV4dDwvY29kZT4uICBJdCBzdXBwb3J0cyB0aGUKKyAgZm9sbG93aW5nIGNvbmZpZ3VyYWJsZSBwcm9wZXJ0aWVzOjwvcD4KKyAgPHVsPgorICA8bGk+PGNvZGU+Y29va2llczwvY29kZT4gLSBTaG91bGQgYmUgdXNlIGNvb2tpZXMgZm9yIHNlc3Npb24gaWRlbnRpZmllcgorICAgICAgY29tbXVuaWNhdGlvbj8gIFt0cnVlXTwvbGk+CisgIDxsaT48Y29kZT5jcm9zc0NvbnRleHQ8L2NvZGU+IC0gU2hvdWxkIGNhbGxzIHRvCisgICAgICA8Y29kZT5TZXJ2bGV0Q29udGV4dC5nZXRTZXJ2bGV0Q29udGV4dCgpPC9jb2RlPiByZXR1cm4gdGhlIGFjdHVhbAorICAgICAgY29udGV4dCByZXNwb25zaWJsZSBmb3IgdGhlIHNwZWNpZmllZCBwYXRoPyAgW2ZhbHNlXTwvbGk+CisgIDxsaT48Y29kZT5kZWJ1ZzwvY29kZT4gLSBEZWJ1Z2dpbmcgZGV0YWlsIGxldmVsLiAgWzBdPC9saT4KKyAgPGxpPjxjb2RlPmRvY0Jhc2U8L2NvZGU+IC0gVGhlIGFic29sdXRlIG9yIHJlbGF0aXZlICh0byB0aGUKKyAgICAgIDxjb2RlPmFwcEJhc2U8L2NvZGU+IG9mIG91ciBvd25pbmcgPGVtPkhvc3Q8L2VtPikgcGF0aG5hbWUgb2YgYQorICAgICAgZGlyZWN0b3J5IGNvbnRhaW5pbmcgYW4gdW5wYWNrZWQgd2ViIGFwcGxpY2F0aW9uLCBvciBvZiBhIHdlYgorICAgICAgYXBwbGljYXRpb24gYXJjaGl2ZSAoV0FSKSBmaWxlLjwvbGk+CisgIDxsaT48Y29kZT5vdmVycmlkZTwvY29kZT4gLSBTaG91bGQgc2V0dGluZ3MgaW4gdGhpcyA8ZW0+Q29udGV4dDwvZW0+CisgICAgICBvdmVycmlkZSBjb3JyZXNwb25kaW5nIHNldHRpbmdzIGluIHRoZSA8ZW0+RGVmYXVsdCBDb250ZXh0PC9lbT4/CisgICAgICBbZmFsc2VdPC9saT4KKyAgPGxpPjxjb2RlPnBhdGg8L2NvZGU+IC0gQ29udGV4dCBwYXRoIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbiwgb3IgYW4gZW1wdHkKKyAgICAgIHN0cmluZyBmb3IgdGhlIHJvb3QgYXBwbGljYXRpb24gb2YgYSA8ZW0+SG9zdDwvZW0+LiAgW0luZmVycmVkIGZyb20KKyAgICAgIGRpcmVjdG9yeSBvciBXQVIgZmlsZSBuYW1lXTwvbGk+CisgIDxsaT48Y29kZT5yZWxvYWRhYmxlPC9jb2RlPiAtIFNob3VsZCBUb21jYXQgbW9uaXRvciBjbGFzc2VzIGluIHRoZQorICAgICAgPGNvZGU+L1dFQi1JTkYvY2xhc3NlczwvY29kZT4gZGlyZWN0b3J5IGZvciBjaGFuZ2VzLCBhbmQgcmVsb2FkIHRoZQorICAgICAgYXBwbGljYXRpb24gaWYgdGhleSBvY2N1cj8gIFtmYWxzZV08L2xpPgorICA8bGk+PGNvZGU+dXNlTmFtaW5nPC9jb2RlPiAtIFNob3VsZCBUb21jYXQgcHJvdmlkZSBhIEpOREkgbmFtaW5nIGNvbnRleHQsCisgICAgICBjb250YWluaW5nIHByZWNvbmZpZ3VyZWQgZW50cmllcyBhbmQgcmVzb3VyY2VzLCBjb3JyZXNwb25kaW5nIHRvIHRoZQorICAgICAgcmVxdWlyZW1lbnRzIG9mIHRoZSBKYXZhMiBFbnRlcnByaXNlIEVkaXRpb24gc3BlY2lmaWNhdGlvbj8gIFt0cnVlXTwvbGk+CisgIDxsaT48Y29kZT53b3JrRGlyPC9jb2RlPiAtIEFic29sdXRlIHBhdGhuYW1lIG9mIGEgc2NyYXRjaCBkaXJlY3RvcnkgdGhhdCBpcworICAgICAgcHJvdmlkZWQgdG8gdGhpcyB3ZWIgYXBwbGljYXRpb24uICBbQXV0b21hdGljYWxseSBhc3NpZ25lZCByZWxhdGl2ZSB0bworICAgICAgJENBVEFMSU5BX0hPTUUvd29ya108L2xpPgorICA8L3VsPgorCisgIDxwPkVhY2ggPGVtPkNvbnRleHQ8L2VtPiBpcyBvd25lZCBieSBhIHBhcmVudCA8ZW0+SG9zdDwvZW0+LCBhbmQgaXMKKyAgYXNzb2NpYXRlZCB3aXRoOjwvcD4KKyAgPHVsPgorICA8bGk+QW4gb3B0aW9uYWwgPGVtPkFjY2VzcyBMb2dnZXI8L2VtPiB0aGF0IGxvZ3MgYWxsIHJlcXVlc3RzIHByb2Nlc3NlZAorICAgICAgYnkgdGhpcyB3ZWIgYXBwbGljYXRpb24uPC9saT4KKyAgPGxpPlplcm8gb3IgbW9yZSA8ZW0+RW52aXJvbm1lbnQgRW50cmllczwvZW0+IHJlcHJlc2VudGluZyBlbnZpcm9ubWVudAorICAgICAgZW50cmllcyBmb3IgdGhlIEpOREkgbmFtaW5nIGNvbnRleHQgYXNzb2NpYXRlZCB3aXRoIGEgd2ViCisgICAgICBhcHBsaWNhdGlvbi48L2xpPgorICA8bGk+WmVybyBvciBtb3JlIDxlbT5KREJDIFJlc291cmNlczwvZW0+IHJlcHJlc2VudGluZyBkYXRhYmFzZSBjb25uZWN0aW9uCisgICAgICBwb29scyBhc3NvY2lhdGVkIHdpdGggYSB3ZWIgYXBwbGljYXRpb24uPC9saT4KKyAgPGxpPkEgPGVtPkxvYWRlcjwvZW0+IHJlcHJlc2VudGluZyB0aGUgd2ViIGFwcGxpY2F0aW9uIGNsYXNzIGxvYWRlciB1c2VkCisgICAgICBieSB0aGlzIHdlYiBhcHBsaWNhdGlvbi48L2xpPgorICA8bGk+QSA8ZW0+TWFuYWdlcjwvZW0+IHJlcHJlc2VudGluZyB0aGUgc2Vzc2lvbiBtYW5hZ2VyIHVzZWQgYnkgdGhpcworICAgICAgd2ViIGFwcGxpY2F0aW9uLjwvbGk+CisgIDxsaT5BbiBvcHRpb25hbCA8ZW0+UmVhbG08L2VtPiB1c2VkIHRvIHByb3ZpZGUgYXV0aGVudGljYXRpb24gYW5kIGFjY2VzcworICAgICAgY29udHJvbCBpbmZvcm1hdGlvbiBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24uPC9saT4KKyAgPGxpPlplcm8gb3IgbW9yZSA8ZW0+UmVxdWVzdCBGaWx0ZXJzPC9lbT4gdXNlZCB0byBsaW1pdCBhY2Nlc3MgdG8gdGhpcworICAgICAgd2ViIGFwcGxpY2F0aW9uIGJhc2VkIG9uIHJlbW90ZSBob3N0IG5hbWUgb3IgSVAgYWRkcmVzcy48L2xpPgorICA8L3VsPgorCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iRGVmYXVsdCBDb250ZXh0Ij4KKworICA8cD5BIDxlbT5EZWZhdWx0IENvbnRleHQ8L2VtPiByZXByZXNlbnRzIGEgc3Vic2V0IG9mIHRoZSBjb25maWd1cmFibGUKKyAgcHJvcGVydGllcyBvZiBhIDxlbT5Db250ZXh0PC9lbT4sIGFuZCBpcyB1c2VkIHRvIHNldCBkZWZhdWx0cyBmb3IgdGhvc2UKKyAgcHJvcGVydGllcyB3aGVuIHdlYiBhcHBsaWNhdGlvbnMgYXJlIGF1dG9tYXRpY2FsbHkgZGVwbG95ZWQuICBBIDxlbT5EZWZhdWx0CisgIENvbnRleHQ8L2VtPiBvYmplY3QgY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBhbiA8ZW0+RW5naW5lPC9lbT4gb3IgYQorICA8ZW0+SG9zdDwvZW0+LiAgVGhlIGZvbGxvd2luZyBjb25maWd1cmFibGUgcHJvcGVydGllcyBhcmUgc3VwcG9ydGVkOjwvcD4KKyAgPHVsPgorICA8bGk+PGNvZGU+Y29va2llczwvY29kZT4gLSBTaG91bGQgYmUgdXNlIGNvb2tpZXMgZm9yIHNlc3Npb24gaWRlbnRpZmllcgorICAgICAgY29tbXVuaWNhdGlvbj8gIFt0cnVlXTwvbGk+CisgIDxsaT48Y29kZT5jcm9zc0NvbnRleHQ8L2NvZGU+IC0gU2hvdWxkIGNhbGxzIHRvCisgICAgICA8Y29kZT5TZXJ2bGV0Q29udGV4dC5nZXRTZXJ2bGV0Q29udGV4dCgpPC9jb2RlPiByZXR1cm4gdGhlIGFjdHVhbAorICAgICAgY29udGV4dCByZXNwb25zaWJsZSBmb3IgdGhlIHNwZWNpZmllZCBwYXRoPyAgW2ZhbHNlXTwvbGk+CisgIDxsaT48Y29kZT5yZWxvYWRhYmxlPC9jb2RlPiAtIFNob3VsZCBUb21jYXQgbW9uaXRvciBjbGFzc2VzIGluIHRoZQorICAgICAgPGNvZGU+L1dFQi1JTkYvY2xhc3NlczwvY29kZT4gZGlyZWN0b3J5IGZvciBjaGFuZ2VzLCBhbmQgcmVsb2FkIHRoZQorICAgICAgYXBwbGljYXRpb24gaWYgdGhleSBvY2N1cj8gIFtmYWxzZV08L2xpPgorICA8bGk+PGNvZGU+dXNlTmFtaW5nPC9jb2RlPiAtIFNob3VsZCBUb21jYXQgcHJvdmlkZSBhIEpOREkgbmFtaW5nIGNvbnRleHQsCisgICAgICBjb250YWluaW5nIHByZWNvbmZpZ3VyZWQgZW50cmllcyBhbmQgcmVzb3VyY2VzLCBjb3JyZXNwb25kaW5nIHRvIHRoZQorICAgICAgcmVxdWlyZW1lbnRzIG9mIHRoZSBKYXZhMiBFbnRlcnByaXNlIEVkaXRpb24gc3BlY2lmaWNhdGlvbj8gIFt0cnVlXTwvbGk+CisgIDwvdWw+CisKKyAgPHA+RWFjaCA8ZW0+RGVmYXVsdCBDb250ZXh0PC9lbT4gaXMgb3duZWQgYnkgYSBwYXJlbnQgPGVtPkVuZ2luZTwvZW0+IG9yCisgIDxlbT5Ib3N0PC9lbT4sIGFuZCBpcyBhc3NvY2lhdGVkIHdpdGg6PC9wPgorICA8dWw+CisgIDxsaT5aZXJvIG9yIG1vcmUgPGVtPkVudmlyb25tZW50IEVudHJpZXM8L2VtPiByZXByZXNlbnRpbmcgZW52aXJvbm1lbnQKKyAgICAgIGVudHJpZXMgZm9yIHRoZSBKTkRJIG5hbWluZyBjb250ZXh0IGFzc29jaWF0ZWQgd2l0aCBhIHdlYgorICAgICAgYXBwbGljYXRpb24uPC9saT4KKyAgPGxpPlplcm8gb3IgbW9yZSA8ZW0+SkRCQyBSZXNvdXJjZXM8L2VtPiByZXByZXNlbnRpbmcgZGF0YWJhc2UgY29ubmVjdGlvbgorICAgICAgcG9vbHMgYXNzb2NpYXRlZCB3aXRoIGEgd2ViIGFwcGxpY2F0aW9uLjwvbGk+CisgIDxsaT5BbiBvcHRpb25hbCA8ZW0+TG9hZGVyPC9lbT4gcmVwcmVzZW50aW5nIGRlZmF1bHQgY29uZmlndXJhdGlvbgorICAgICAgcHJvcGVydGllcyBmb3IgdGhlIExvYWRlciBjb21wb25lbnQgb2YgZGVwbG95ZWQgd2ViIGFwcGxpY2F0aW9ucy48L2xpPgorICA8bGk+QW4gb3B0aW9uYWwgPGVtPk1hbmFnZXI8L2VtPiByZXByZXNlbnRpbmcgZGVmYXVsdCBjb25maWd1cmF0aW9uCisgICAgICBwcm9wZXJ0aWVzIGZvciB0aGUgTWFuYWdlciBjb21wb25lbnQgZm8gZGVwbG95ZWQgd2ViIGFwcGxpY2F0aW9ucy48L2xpPgorICA8L3VsPgorCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iRGVmYXVsdCBEZXBsb3ltZW50IERlc2NyaXB0b3IiPgorCisgIDxwPkRlZmF1bHQgd2ViIGFwcGxpY2F0aW9uIGNoYXJhY3RlcmlzdGljcyBhcmUgY29uZmlndXJlZCBpbiBhIHNwZWNpYWwKKyAgZGVwbG95bWVudCBkZXNjcmlwdG9yIG5hbWVkIDxjb2RlPiRDQVRBTElOQV9IT01FL2NvbmYvd2ViLnhtbDwvY29kZT4uICBUaGlzCisgIHNlY3Rpb24gZGVzY3JpYmVzIHRoZSBjb25maWd1cmFibGUgY29tcG9uZW50cyB0aGF0IG1heSBiZSBzdG9yZWQgdGhlcmUuPC9wPgorCisgIDxwPjxzdHJvbmc+RklYTUU8L3N0cm9uZz4gLSBDb21wbGV0ZSB0aGUgZGVzY3JpcHRpb24gb2YgZGVmYXVsdCBzZXJ2bGV0cywKKyAgZGVmYXVsdCBtYXBwaW5ncywgZGVmYXVsdCBNSU1FIHR5cGVzLCBhbmQgc28gb24uPC9wPgorCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iRW5naW5lIj4KKworICA8cD5BbiA8ZW0+RW5naW5lPC9lbT4gaXMgdGhlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBlbnRpcmUgQ2F0YWxpbmEKKyAgc2VydmxldCBjb250YWluZXIsIGFuZCBwcm9jZXNzZXMgYWxsIHJlcXVlc3RzIGZvciBhbGwgb2YgdGhlIGFzc29jaWF0ZWQKKyAgdmlydHVhbCBob3N0cyBhbmQgd2ViIGFwcGxpY2F0aW9ucy48L3A+CisKKyAgPHA+VGhlIHN0YW5kYXJkIGNvbXBvbmVudCBpbXBsZW1lbnRpbmcgYW4gPGVtPkVuZ2luZTwvZW0+IGlzCisgIDxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZEVuZ2luZTwvY29kZT4uICBJdCBzdXBwb3J0cyB0aGUKKyAgZm9sbG93aW5nIGNvbmZpZ3VyYWJsZSBwcm9wZXJ0aWVzOjwvcD4KKyAgPHVsPgorICA8bGk+PGNvZGU+ZGVidWc8L2NvZGU+IC0gRGVidWdnaW5nIGRldGFpbCBsZXZlbC4gIFswXTwvbGk+CisgIDxsaT48Y29kZT5kZWZhdWx0SG9zdDwvY29kZT4gLSBOYW1lIG9mIHRoZSA8ZW0+SG9zdDwvZW0+IHRvIHdoaWNoIHJlcXVlc3RzCisgICAgICB3aWxsIGJlIGRpcmVjdGVkIGlmIHRoZSByZXF1ZXN0ZWQgaG9zdCBpcyB1bmtub3duLiAgW2xvY2FsaG9zdF08L2xpPgorICA8bGk+PGNvZGU+bmFtZTwvY29kZT4gLSBMb2dpY2FsIG5hbWUgb2YgdGhpcyBlbmdpbmUuIFtUb21jYXQgU3RhbmQtQWxvbmVdCisgICAgICA8L2xpPgorICA8L3VsPgorCisgIDxwPkVhY2ggPGVtPkVuZ2luZTwvZW0+IGlzIG93bmVkIGJ5IGEgcGFyZW50IDxlbT5TZXJ2aWNlPC9lbT4sIGFuZCBpcworICBhc3NvY2lhdGVkIHdpdGg6PC9wPgorICA8dWw+CisgIDxsaT5BbiBvcHRpb25hbCA8ZW0+QWNjZXNzIExvZ2dlcjwvZW0+IHRoYXQgbG9ncyBhbGwgcmVxdWVzdHMgcHJvY2Vzc2VkCisgICAgICBieSB0aGUgZW50aXJlIGNvbnRhaW5lci48L2xpPgorICA8bGk+QSA8ZW0+RGVmYXVsdCBDb250ZXh0PC9lbT4sIHJlcHJlc2VudGluZyBkZWZhdWx0IHByb3BlcnRpZXMgb2YgYQorICAgICAgPGVtPkNvbnRleHQ8L2VtPiBmb3IgYXV0b21hdGljYWxseSBkZXBsb3llZCBhcHBsaWNhdGlvbnMgZm9yIGFsbAorICAgICAgYXNzb2NpYXRlZCA8ZW0+SG9zdHM8L2VtPiAodW5sZXNzIG92ZXJyaWRkZW4gYnkgYSBzdWJvcmRpbmF0ZQorICAgICAgY29tcG9uZW50KS48L2xpPgorICA8bGk+T25lIG9yIG1vcmUgPGVtPkhvc3RzPC9lbT4gcmVwcmVzZW50aW5nIGluZGl2aWR1YWwgdmlydHVhbCBob3N0cworICAgICAgc3VwcG9ydGVkIGJ5IHRoaXMgY29udGFpbmVyLjwvbGk+CisgIDxsaT5BIDxlbT5SZWFsbTwvZW0+IHVzZWQgdG8gcHJvdmlkZSBhdXRoZW50aWNhdGlvbiBhbmQgYWNjZXNzIGNvbnRyb2wKKyAgICAgIGluZm9ybWF0aW9uIGZvciBhbGwgdmlydHVhbCBob3N0cyBhbmQgd2ViIGFwcGxpY2F0aW9ucyAodW5sZXNzCisgICAgICBvdmVycmlkZGVuIGJ5IGEgc3Vib3JkaW5hdGUgY29tcG9uZW50KS48L2xpPgorICA8bGk+WmVybyBvciBtb3JlIDxlbT5SZXF1ZXN0IEZpbHRlcnM8L2VtPiB1c2VkIHRvIGxpbWl0IGFjY2VzcyB0byB0aGUKKyAgICAgIGVudGlyZSBjb250YWluZXIgYmFzZWQgb24gcmVtb3RlIGhvc3QgbmFtZSBvciBJUCBhZGRyZXNzLjwvbGk+CisgIDwvdWw+CisKKzwvc2VjdGlvbj4KKworCis8c2VjdGlvbiBuYW1lPSJFbnZpcm9ubWVudCBFbnRyeSI+CisKKyAgPHA+QW4gPGVtPkVudmlyb25tZW50IEVudHJ5PC9lbT4gaXMgdGhlIHJlcHJlc2VudGF0aW9uIG9mIGEKKyAgPGNvZGU+Jmx0O2Vudi1lbnRyeSZndDs8L2NvZGU+IGVsZW1lbnQgZnJvbSBhIHdlYiBhcHBsaWNhdGlvbiBkZXBsb3ltZW50CisgIGRlc2NyaXB0b3IuICBJdCB3aWxsIGNhdXNlIHRoZSBjcmVhdGlvbiBvZiBhIGNvcnJlc3BvbmRpbmcgZW50cnkgaW4gdGhlCisgIEpOREkgbmFtaW5nIGNvbnRleHQgcHJvdmlkZWQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgPGVtPkNvbnRleHQ8L2VtPi4gIFRoZQorICBmb2xsb3dpbmcgY29uZmlndXJhYmxlIHByb3BlcnRpZXMgYXJlIHN1cHBvcnRlZDo8L3A+CisgIDx1bD4KKyAgPGxpPjxjb2RlPmRlc2NyaXB0aW9uPC9jb2RlPiAtIERlc2NyaXB0aW9uIG9mIHRoaXMgZW52aXJvbm1lbnQgZW50cnkuPC9saT4KKyAgPGxpPjxjb2RlPm5hbWU8L2NvZGU+IC0gRW52aXJvbm1lbnQgZW50cnkgbmFtZSAocmVsYXRpdmUgdG8gdGhlCisgICAgICA8Y29kZT5qYXZhOmNvbXAvZW52PC9jb2RlPiBjb250ZXh0KTwvbGk+CisgIDxsaT48Y29kZT50eXBlPC9jb2RlPiAtIEVudmlyb25tZW50IGVudHJ5IHR5cGUgKG11c3QgYmUgb25lIG9mIHRoZSBmdWxseQorICAgICAgcXVhbGlmaWVkIEphdmEgY2xhc3NlcyBsaXN0ZWQgaW4gdGhlIHNlcnZsZXQgc3BlYykuPC9saT4KKyAgPGxpPjxjb2RlPnZhbHVlPC9jb2RlPiAtIEVudmlyb25tZW50IGVudHJ5IHZhbHVlIChtdXN0IGJlIGNvbnZlcnRpYmxlIGZyb20KKyAgICAgIFN0cmluZyB0byB0aGUgc3BlY2lmaWVkIDxjb2RlPnR5cGU8L2NvZGU+LjwvbGk+CisgIDwvdWw+CisKKzwvc2VjdGlvbj4KKworCis8c2VjdGlvbiBuYW1lPSJIb3N0Ij4KKworICA8cD5BIDxlbT5Ib3N0PC9lbT4gaXMgdGhlIHJlcHJlc2VudGF0aW9uIG9mIGFuIGluZGl2aWR1YWwgdmlydHVhbCBob3N0LAorICB3aGljaCBoYXMgYSB1bmlxdWUgc2V0IG9mIGFzc29jaWF0ZWQgd2ViIGFwcGxpY2F0aW9ucy48L3A+CisKKyAgPHA+VGhlIHN0YW5kYXJkIGNvbXBvbmVudCBpbXBsZW1lbnRpbmcgYSA8ZW0+SG9zdDwvZW0+IGlzCisgIDxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZEhvc3Q8L2NvZGU+LiAgSXQgc3VwcG9ydHMgdGhlCisgIGZvbGxvd2luZyBjb25maWd1cmFibGUgcHJvcGVydGllczo8L3A+CisgIDx1bD4KKyAgPGxpPjxjb2RlPmFsaWFzZXM8L2NvZGU+IC0gWmVybyBvciBtb3JlIEROUyBuYW1lcyB0aGF0IGFyZSBhbHNvIGFzc29jaWF0ZWQKKyAgICAgIHdpdGggdGhpcyBob3N0IChmb3IgZXhhbXBsZSwgYSBwYXJ0aWN1bGFyIGhvc3QgbWlnaHQgYmUgbmFtZWQKKyAgICAgIDxjb2RlPnd3dy5teWNvbXBhbnkuY29tPC9jb2RlPiB3aXRoIGFuIGFsaWFzIDxjb2RlPmNvbXBhbnkuY29tPC9jb2RlPikuCisgICAgICA8L2xpPgorICA8bGk+PGNvZGU+YXBwQmFzZTwvY29kZT4gLSBBYnNvbHV0ZSBvciByZWxhdGl2ZSAodG8gJENBVEFMSU5BX0hPTUUpIHBhdGgKKyAgICAgIHRvIGEgZGlyZWN0b3J5IGZyb20gd2hpY2ggd2ViIGFwcGxpY2F0aW9ucyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkKKyAgICAgIGRlcGxveWVkLjwvbGk+CisgIDxsaT48Y29kZT5kZWJ1ZzwvY29kZT4gLSBEZWJ1Z2dpbmcgZGV0YWlsIGxldmVsLiAgWzBdPC9saT4KKyAgPGxpPjxjb2RlPm5hbWU8L2NvZGU+IC0gRE5TIE5hbWUgb2YgdGhlIHZpcnR1YWwgaG9zdCByZXByZXNlbnRlZCBieSB0aGlzCisgICAgICBvYmplY3QuPC9saT4KKyAgPGxpPjxjb2RlPnVucGFja1dBUnM8L2NvZGU+IC0gU2hvdWxkIHdlYiBhcHBsaWNhdGlvbiBhcmNoaXZlIGZpbGVzCisgICAgICBkZXBsb3llZCBieSB0aGlzIHZpcnR1YWwgaG9zdCBiZSB1bnBhY2tlZCBmaXJzdD8gIFt0cnVlXTwvbGk+CisgIDwvdWw+CisKKyAgPHA+RWFjaCA8ZW0+SG9zdDwvZW0+IGlzIG93bmVkIGJ5IGEgcGFyZW50IDxlbT5FbmdpbmU8L2VtPiwgYW5kIGlzCisgIGFzc29jaWF0ZWQgd2l0aDo8L3A+CisgIDx1bD4KKyAgPGxpPkFuIG9wdGlvbmFsIDxlbT5BY2Nlc3MgTG9nZ2VyPC9lbT4gdGhhdCBsb2dzIGFsbCByZXF1ZXN0cyBwcm9jZXNzZWQKKyAgICAgIGJ5IHRoaXMgdmlydHVhbCBob3N0LjwvbGk+CisgIDxsaT5PbmUgb3IgbW9yZSA8ZW0+Q29udGV4dHM8L2VtPiByZXByZXNlbnRpbmcgdGhlIHdlYiBhcHBsaWNhdGlvbnMKKyAgICAgIG9wZXJhdGluZyBvbiB0aGlzIDxlbT5Ib3N0PC9lbT4uPC9saT4KKyAgPGxpPkEgPGVtPkRlZmF1bHQgQ29udGV4dDwvZW0+IHJlcHJlc2VudGluZyBkZWZhdWx0IDxlbT5Db250ZXh0PC9lbT4KKyAgICAgIHByb3BlcnRpZXMgZm9yIHdlYiBhcHBsaWNhdGlvbnMgdGhhdCBhcmUgYXV0b21hdGljYWxseSBkZXBsb3llZAorICAgICAgYnkgdGhpcyA8ZW0+SG9zdDwvZW0+LjwvbGk+CisgIDxsaT5BIG9wdGlvbmFsIDxlbT5SZWFsbTwvZW0+IHVzZWQgdG8gcHJvdmlkZSBhdXRoZW50aWNhdGlvbiBhbmQgYWNjZXNzCisgICAgICBjb250cm9sIGluZm9ybWF0aW9uIGZvciBhbGwgd2ViIGFwcGxpY2F0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhpcworICAgICAgdmlydHVhbCBob3N0ICh1bmxlc3Mgb3ZlcnJpZGRlbiBieSBhIHN1Ym9yZGluYXRlIGNvbXBvbmVudCkuPC9saT4KKyAgPC91bD4KKworICA8cD48c3Ryb25nPkZJWE1FPC9zdHJvbmc+IC0gU2hvdWxkIHdlIHN1cHBvcnQgY29uZmlndXJhdGlvbiBvZiB0aGUKKyAgVXNlciBXZWIgQXBwbGljYXRpb25zIGZ1bmN0aW9uYWxpdHk/PC9wPgorCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iSkRCQyBSZXNvdXJjZSI+CisKKyAgPHA+QSA8ZW0+SkRCQyBSZXNvdXJjZXM8L2VtPiByZXByZXNlbnRzIGEgZGF0YWJhc2UgY29ubmVjdGlvbiBwb29sIChpLmUuCisgIGFuIGltcGxlbWVudGF0aW9uIG9mIDxjb2RlPmphdmF4LnNxbC5EYXRhU291cmNlPC9jb2RlPiB0aGF0IHdpbGwgYmUKKyAgY29uZmlndXJlZCBhbmQgbWFkZSBhdmFpbGFibGUgaW4gdGhlIEpOREkgbmFtaW5nIGNvbnRleHQgYXNzb2NpYXRlZCB3aXRoCisgIGEgd2ViIGFwcGxpY2F0aW9uLjwvcD4KKworICA8cD48c3Ryb25nPkZJWE1FPC9zdHJvbmc+IC0gcHJvcGVydGllcyBvZiB0aGlzIGFkbWluaXN0ZXJlZCBvYmplY3Q8L3A+CisKKzwvc2VjdGlvbj4KKworCis8c2VjdGlvbiBuYW1lPSJMb2FkZXIiPgorCisgIDxwPkEgPGVtPkxvYWRlcjwvZW0+IHJlcHJlc2VudHMgYSB3ZWIgYXBwbGljYXRpb24gY2xhc3MgbG9hZGVyIHRoYXQgd2lsbAorICBiZSB1dGlsaXplZCB0byBwcm92aWRlIGNsYXNzIGxvYWRpbmcgc2VydmljZXMgZm9yIGEgcGFydGljdWxhcgorICA8ZW0+Q29udGV4dDwvZW0+LjwvcD4KKworICA8cD5UaGUgc3RhbmRhcmQgY29tcG9uZW50IGltcGxlbWVudGluZyBhIDxlbT5Mb2FkZXI8L2VtPiBpcworICA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLmxvYWRlci5TdGFuZGFyZExvYWRlcjwvY29kZT4uICBJdCBzdXBwb3J0cworICB0aGUgZm9sbG93aW5nIGNvbmZpZ3VyYWJsZSBwcm9wZXJ0aWVzOjwvcD4KKyAgPHVsPgorICA8bGk+PGNvZGU+Y2hlY2tJbnRlcnZhbDwvY29kZT4gLSBOdW1iZXIgb2Ygc2Vjb25kcyBiZXR3ZWVuIGNoZWNrcyBmb3IKKyAgICAgIG1vZGlmaWVkIGNsYXNzZXMsIGlmIGF1dG9tYXRpYyByZWxvYWRpbmcgaXMgZW5hYmxlZC4gIFsxNV08L2xpPgorICA8bGk+PGNvZGU+ZGVidWc8L2NvZGU+IC0gRGVidWdnaW5nIGRldGFpbCBsZXZlbC4gIFswXTwvbGk+CisgIDxsaT48Y29kZT5yZWxvYWRhYmxlPC9jb2RlPiAtIFNob3VsZCB0aGlzIGNsYXNzIGxvYWRlciBjaGVjayBmb3IgbW9kaWZpZWQKKyAgICAgIGNsYXNzZXMgYW5kIGluaXRpYXRlIGF1dG9tYXRpYyByZWxvYWRzPyAgW1NldCBhdXRvbWF0aWNhbGx5IGZyb20gdGhlCisgICAgICA8Y29kZT5yZWxvYWRhYmxlPC9jb2RlPiBwcm9wZXJ0eSBvZiB0aGUgY29ycmVzcG9uZGluZyA8ZW0+Q29udGV4dDwvZW0+XQorICAgICAgPC9saT4KKyAgPC91bD4KKworICA8cD5FYWNoIDxlbT5Mb2FkZXI8L2VtPiBpcyBvd25lZCBieSBhIHBhcmVudCA8ZW0+Q29udGV4dDwvZW0+LjwvcD4KKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9Ik1hbmFnZXIiPgorCisgIDxwPkEgPGVtPk1hbmFnZXI8L2VtPiByZXByZXNlbnRzIGEgc2Vzc2lvbiBtYW5hZ2VyIHRoYXQgd2lsbCBiZSBhc3NvY2lhdGVkCisgIHdpdGggYSBwYXJ0aWN1bGFyIHdlYiBhcHBsaWNhdGlvbi4gIDxzdHJvbmc+RklYTUU8L3N0cm9uZz4gLSBBZGQgc3VwcG9ydAorICBmb3IgYWR2YW5jZWQgc2Vzc2lvbiBtYW5hZ2VycyBhbmQgdGhlaXIgYXNzb2NpYXRlZCBTdG9yZXMuPC9wPgorCisgIDxwPlRoZSBzdGFuZGFyZCBjb21wb25lbnQgaW1wbGVtZW50aW5nIGEgPGVtPk1hbmFnZXI8L2VtPiBpcworICA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLnNlc3Npb24uU3RhbmRhcmRNYW5hZ2VyPC9jb2RlPi4gIEl0IHN1cHBvcnRzCisgIHRoZSBmb2xsb3dpbmcgY29uZmlndXJhYmxlIHByb3BlcnRpZXM6PC9wPgorICA8dWw+CisgIDxsaT48Y29kZT5jaGVja0ludGVydmFsPC9jb2RlPiAtIE51bWJlciBvZiBzZWNvbmRzIGJldHdlZW4gY2hlY2tzIGZvcgorICAgICAgZXhwaXJlZCBzZXNzaW9ucy4gIFs2MF08L2xpPgorICA8bGk+PGNvZGU+ZGVidWc8L2NvZGU+IC0gRGVidWdnaW5nIGRldGFpbCBsZXZlbC4gIFswXTwvbGk+CisgIDxsaT48Y29kZT5lbnRyb3B5PC9jb2RlPiAtIFN0cmluZyBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIgdXNlZCB0byBpbmNyZWFzZQorICAgICAgdGhlIGVudHJvcHkgKGluaXRpYWwgcmFuZG9tbmVzcykgb2YgdGhlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIHVzZWQgdG8KKyAgICAgIGNyZWF0ZSBzZXNzaW9uIGlkZW50aWZpZXJzLiAgW0luZmVycmVkIGZyb20gZW5naW5lLCBob3N0LCBhbmQgY29udGV4dF0KKyAgICAgIDwvbGk+CisgIDxsaT48Y29kZT5tYXhBY3RpdmVTZXNzaW9uczwvY29kZT4gLSBUaGUgbWF4aW11bSBudW1iZXIgb2YgYWN0aXZlIHNlc3Npb25zCisgICAgICB0aGF0IGFyZSBhbGxvd2VkLCBvciAtMSBmb3Igbm8gbGltaXQuICBbLTFdPC9saT4KKyAgPC91bD4KKworICA8cD5FYWNoIDxlbT5NYW5hZ2VyPC9lbT4gaXMgb3duZWQgYnkgYSBwYXJlbnQgPGVtPkNvbnRleHQ8L2VtPi48L3A+CisKKzwvc2VjdGlvbj4KKworCis8c2VjdGlvbiBuYW1lPSJSZWFsbSI+CisKKyAgPHA+QSA8ZW0+UmVhbG08L2VtPiByZXByZXNlbnRzIGEgImRhdGFiYXNlIiBvZiBpbmZvcm1hdGlvbiBhYm91dCBhdXRob3JpemVkCisgIHVzZXJzLCB0aGVpciBwYXNzd29yZHMsIGFuZCB0aGUgc2VjdXJpdHkgcm9sZXMgYXNzaWduZWQgdG8gdGhlbS4gIFRoaXMgd2lsbAorICBiZSB1c2VkIGJ5IHRoZSBjb250YWluZXIgaW4gdGhlIGltcGxlbWVudGF0aW9uIG9mIGNvbnRhaW5lci1tYW5hZ2VkIHNlY3VyaXR5CisgIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU2VydmxldCBTcGVjaWZpY2F0aW9uLiAgU2V2ZXJhbCBhbHRlcm5hdGl2ZQorICBpbXBsZW1lbnRhdGlvbnMgYXJlIHN1cHBvcnRlZC48L3A+CisKKyAgPHA+PGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5yZWFsbS5NZW1vcnlSZWFsbTwvY29kZT4gaW5pdGlhbGl6ZXMgaXRzIHVzZXIKKyAgaW5mb3JtYXRpb24gZnJvbSBhIHNpbXBsZSBYTUwgZmlsZSBhdCBzdGFydHVwIHRpbWUuICBJZiBjaGFuZ2VzIGFyZSBtYWRlCisgIHRvIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzIGZpbGUsIHRoZSBjb3JyZXNwb25kaW5nIHdlYiBhcHBsaWNhdGlvbnMgdXNpbmcKKyAgaXQgbXVzdCBiZSByZXN0YXJ0ZWQgZm9yIHRoZSBjaGFuZ2VzIHRvIHRha2UgZWZmZWN0LiAgSXQgc3VwcG9ydHMgdGhlCisgIGZvbGxvd2luZyBjb25maWd1cmFibGUgcHJvcGVydGllczo8L3A+CisgIDx1bD4KKyAgPGxpPjxjb2RlPmRlYnVnPC9jb2RlPiAtIERlYnVnZ2luZyBkZXRhaWwgbGV2ZWwuICBbMF08L2xpPgorICA8bGk+PGNvZGU+cGF0aG5hbWU8L2NvZGU+IC0gQWJzb2x1dGUgb3IgcmVsYXRpdmUgKHRvICRDQVRBTElOQV9IT01FKSBwYXRoIHRvCisgICAgICB0aGUgWE1MIGZpbGUgY29udGFpbmluZyBvdXIgdXNlciBpbmZvcm1hdGlvbi4gIFtjb25mL3RvbWNhdC11c2Vycy54bWxdCisgICAgICA8L2xpPgorICA8L3VsPgorCisgIDxwPjxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEucmVhbG0uSkRCQ1JlYWxtPC9jb2RlPiB1c2VzIGEgcmVsYXRpb25hbAorICBkYXRhYmFzZSAoYWNjZXNzZWQgdmlhIEpEQkMgQVBJcykgdG8gY29udGFpbiB0aGUgdXNlciBpbmZvcm1hdGlvbi4gIENoYW5nZXMKKyAgaW4gdGhlIGNvbnRlbnRzIG9mIHRoaXMgZGF0YWJhc2UgdGFrZSBlZmZlY3QgaW1tZWRpYXRlbHk7IGhvd2V2ZXIsIHRoZSByb2xlcworICBhc3NpZ25lZCB0byBhIHBhcnRpY3VsYXIgdXNlciBhcmUgY2FsY3VsYXRlZCBvbmx5IHdoZW4gdGhlIHVzZXIgaW5pdGlhbGx5CisgIGxvZ3Mgb24gKGFuZCBub3QgcGVyIHJlcXVlc3QpLiAgVGhlIGZvbGxvd2luZyBjb25maWd1cmFibGUgcHJvcGVydGllcworICBhcmUgc3VwcG9ydGVkOjwvcD4KKyAgPHVsPgorICA8bGk+PGNvZGU+Y29ubmVjdGlvbk5hbWU8L2NvZGU+IC0gRGF0YWJhc2UgdXNlcm5hbWUgdG8gdXNlIHdoZW4gZXN0YWJsaXNoaW5nCisgICAgICBhIEpEQkMgY29ubmVjdGlvbi48L2xpPgorICA8bGk+PGNvZGU+Y29ubmVjdGlvblBhc3N3b3JkPC9jb2RlPiAtIERhdGFiYXNlIHBhc3N3b3JkIHRvIHVzZSB3aGVuCisgICAgICBlc3RhYmxpc2hpbmcgYSBKREJDIGNvbm5lY3Rpb24uPC9saT4KKyAgPGxpPjxjb2RlPmNvbm5lY3Rpb25VUkw8L2NvZGU+IC0gQ29ubmVjdGlvbiBVUkwgdG8gdXNlIHdoZW4gZXN0YWJsaXNoaW5nCisgICAgICBhIEpEQkMgY29ubmVjdGlvbi48L2xpPgorICA8bGk+PGNvZGU+ZGVidWc8L2NvZGU+IC0gRGVidWdnaW5nIGRldGFpbCBsZXZlbC4gIFswXTwvbGk+CisgIDxsaT48Y29kZT5kaWdlc3Q8L2NvZGU+IC0gTmFtZSBvZiB0aGUgPGNvZGU+TWVzc2FnZURpZ2VzdDwvY29kZT4gYWxnb3JpdGhtCisgICAgICB1c2VkIHRvIGVuY29kZSBwYXNzd29yZHMgaW4gdGhlIGRhdGFiYXNlLCBvciBhIHplcm8tbGVuZ3RoIHN0cmluZyBmb3IKKyAgICAgIG5vIGVuY29kaW5nLiAgW1plcm8tbGVuZ3RoIFN0cmluZ108L2xpPgorICA8bGk+PGNvZGU+ZHJpdmVyTmFtZTwvY29kZT4gLSBGdWxseSBxdWFsaWZpZWQgSmF2YSBjbGFzcyBuYW1lIG9mIHRoZSBKREJDCisgICAgICBkcml2ZXIgdG8gYmUgdXRpbGl6ZWQuPC9saT4KKyAgPGxpPjxjb2RlPnJvbGVOYW1lQ29sPC9jb2RlPiAtIE5hbWUgb2YgdGhlIGNvbHVtbiwgaW4gdGhlIFVzZXIgUm9sZXMgdGFibGUsCisgICAgICB3aGljaCBjb250YWlucyB0aGUgcm9sZSBuYW1lLjwvbGk+CisgIDxsaT48Y29kZT51c2VyQ3JlZENvbDwvY29kZT4gLSBOYW1lIG9mIHRoZSBjb2x1bW4sIGluIHRoZSBVc2VycyB0YWJsZSwKKyAgICAgIHdoaWNoIGNvbnRhaW5zIHRoZSBwYXNzd29yZCAoZW5jcnlwdGVkIG9yIHVuZW5jcnlwdGVkKS48L2xpPgorICA8bGk+PGNvZGU+dXNlck5hbWVDb2w8L2NvZGU+IC0gTmFtZSBvZiB0aGUgY29sdW1uLCBpbiBib3RoIHRoZSBVc2VycyBhbmQKKyAgICAgIFVzZXIgUm9sZXMgdGFibGVzLCB0aGF0IGNvbnRhaW5zIHRoZSB1c2VybmFtZS48L2xpPgorICA8bGk+PGNvZGU+dXNlclJvbGVUYWJsZTwvY29kZT4gLSBOYW1lIG9mIHRoZSBVc2VyIFJvbGVzIHRhYmxlLCB3aGljaCBjb250YWlucworICAgICAgb25lIHJvdyBwZXIgc2VjdXJpdHkgcm9sZSBhc3NpZ25lZCB0byBhIHBhcnRpY3VsYXIgdXNlci4gIFRoaXMgdGFibGUgbXVzdAorICAgICAgY29udGFpbiB0aGUgY29sdW1ucyBzcGVjaWZpZWQgYnkgdGhlIDxjb2RlPnVzZXJOYW1lQ29sPC9jb2RlPiBhbmQKKyAgICAgIDxjb2RlPnJvbGVOYW1lQ29sPC9jb2RlPiBwcm9wZXJ0aWVzLjwvbGk+CisgIDxsaT48Y29kZT51c2VyVGFibGU8L2NvZGU+IC0gTmFtZSBvZiB0aGUgVXNlcnMgdGFibGUsIHdoaWNoIGNvbnRhaW5zIG9uZSByb3cKKyAgICAgIHBlciBhdXRob3JpemVkIHVzZXIuICBUaGlzIHRhYmxlIG11c3QgY29udGFpbiB0aGUgY29sdW1ucyBzcGVjaWZpZWQgYnkKKyAgICAgIHRoZSA8Y29kZT51c2VyTmFtZUNvbDwvY29kZT4gYW5kIDxjb2RlPnVzZXJDcmVkQ29sPC9jb2RlPiBwcm9wZXJ0aWVzLgorICAgICAgPC9saT4KKyAgPC91bD4KKworICA8cD48c3Ryb25nPkZJWE1FPC9zdHJvbmc+IC0gU2hvdWxkIHdlIHByb3ZpZGUgbWVjaGFuaXNtcyB0byBlZGl0IHRoZSBjb250ZW50cworICBvZiBhICJ0b21jYXQtdXNlcnMueG1sIiBmaWxlIHRocm91Z2ggdGhlIGFkbWluIGFwcGxpY2F0aW9ucz88L3A+CisKKyAgPHA+RWFjaCA8ZW0+UmVhbG08L2VtPiBpcyBvd25lZCBieSBhIHBhcmVudCA8ZW0+RW5naW5lPC9lbT4sIDxlbT5Ib3N0PC9lbT4sCisgIG9yIDxlbT5Db250ZXh0PC9lbT4uPC9wPgorCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iUmVxdWVzdCBGaWx0ZXIiPgorCisgIDxwPjxzdHJvbmc+RklYTUU8L3N0cm9uZz4gLSBjb21wbGV0ZSB0aGlzIGVudHJ5PC9wPgorCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iU2VydmVyIj4KKworICA8cD48c3Ryb25nPkZJWE1FPC9zdHJvbmc+IC0gY29tcGxldGUgdGhpcyBlbnRyeTwvcD4KKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IlNlcnZpY2UiPgorCisgIDxwPjxzdHJvbmc+RklYTUU8L3N0cm9uZz4gLSBjb21wbGV0ZSB0aGlzIGVudHJ5PC9wPgorCis8L3NlY3Rpb24+CisKKzwvYm9keT4KKworPC9kb2N1bWVudD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvZnVuY3NwZWNzL2ZzLWFkbWluLW9wZXJzLnhtbCBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvZnVuY3NwZWNzL2ZzLWFkbWluLW9wZXJzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NThiYzI5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9mdW5jc3BlY3MvZnMtYWRtaW4tb3BlcnMueG1sCkBAIC0wLDAgKzEsMzI0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhRE9DVFlQRSBkb2N1bWVudCBbCisgIDwhRU5USVRZIHByb2plY3QgU1lTVEVNICJwcm9qZWN0LnhtbCI+CitdPgorPGRvY3VtZW50IHVybD0iZnMtYWRtaW4tb3BlcnMuaHRtbCI+CisKKyAgJnByb2plY3Q7CisKKyAgPHByb3BlcnRpZXM+CisgICAgPGF1dGhvciBlbWFpbD0iY3JhaWdtY2NAYXBhY2hlLm9yZyI+Q3JhaWcgTWNDbGFuYWhhbjwvYXV0aG9yPgorICAgIDx0aXRsZT5BZG1pbmlzdHJhdGl2ZSBBcHBzIC0gU3VwcG9ydGVkIE9wZXJhdGlvbnM8L3RpdGxlPgorICAgIDxyZXZpc2lvbj4kSWQkPC9yZXZpc2lvbj4KKyAgPC9wcm9wZXJ0aWVzPgorCis8Ym9keT4KKworCis8c2VjdGlvbiBuYW1lPSJTdXBwb3J0ZWQgT3BlcmF0aW9ucyBPdmVydmlldyI+CisKKzxwPlRoaXMgZG9jdW1lbnQgZGVmaW5lcyB0aGUgPGVtPlN1cHBvcnRlZCBPcGVyYXRpb25zPC9lbT4gdGhhdCBtYXkKK2JlIHBlcmZvcm1lZCBhZ2FpbnN0IHRoZSA8YSBocmVmPSJmcy1hZG1pbi1vYmplY3RzLmh0bWwiPkFkbWluaXN0ZXJlZAorT2JqZWN0czwvYT4gdGhhdCBhcmUgc3VwcG9ydGVkIGJ5IFRvbWNhdCA1IGFkbWluaXN0cmF0aXZlIGFwcGxpY2F0aW9ucy4KK05vdCBhbGwgb3BlcmF0aW9ucyBhcmUgcmVxdWlyZWQgdG8gYmUgYXZhaWxhYmxlIHRocm91Z2ggZXZlcnkgYWRtaW5pc3RyYXRpdmUKK2FwcGxpY2F0aW9uIHRoYXQgaXMgaW1wbGVtZW50ZWQuICBIb3dldmVyLCBpZiBhIGdpdmVuIG9wZXJhdGlvbiBpcyBhdmFpbGFibGUsCitpdCBzaG91bGQgb3BlcmF0ZSBjb25zaXN0ZW50bHkgd2l0aCB0aGUgZGVzY3JpcHRpb25zIGZvdW5kIGhlcmUuPC9wPgorCis8cD5TdXBwb3J0ZWQgT3BlcmF0aW9ucyBhcmUgZGVzY3JpYmVkIGZvciB0aGUgZm9sbG93aW5nIEFkbWluaXN0ZXJlZAorT2JqZWN0czo8L3A+Cis8dWw+Cis8bGk+PGEgaHJlZj0iI0FjY2VzcyBMb2dnZXIiPkFjY2VzcyBMb2dnZXI8L2E+PC9saT4KKzxsaT48YSBocmVmPSIjQ29ubmVjdG9yIj5Db25uZWN0b3I8L2E+PC9saT4KKzxsaT48YSBocmVmPSIjQ29udGV4dCI+Q29udGV4dDwvYT48L2xpPgorPGxpPjxhIGhyZWY9IiNEZWZhdWx0IENvbnRleHQiPkRlZmF1bHQgQ29udGV4dDwvYT48L2xpPgorPGxpPjxhIGhyZWY9IiNFbmdpbmUiPkVuZ2luZTwvYT48L2xpPgorPGxpPjxhIGhyZWY9IiNFbnZpcm9ubWVudCBFbnRyeSI+RW52aXJvbm1lbnQgRW50cnk8L2E+PC9saT4KKzxsaT48YSBocmVmPSIjSG9zdCI+SG9zdDwvYT48L2xpPgorPGxpPjxhIGhyZWY9IiNKREJDIFJlc291cmNlIj5KREJDIFJlc291cmNlPC9hPjwvbGk+Cis8bGk+PGEgaHJlZj0iI0xvYWRlciI+TG9hZGVyPC9hPjwvbGk+Cis8bGk+PGEgaHJlZj0iI01hbmFnZXIiPk1hbmFnZXI8L2E+PC9saT4KKzxsaT48YSBocmVmPSIjUmVhbG0iPlJlYWxtPC9hPjwvbGk+Cis8bGk+PGEgaHJlZj0iI1JlcXVlc3QgRmlsdGVyIj5SZXF1ZXN0IEZpbHRlcjwvYT48L2xpPgorPGxpPjxhIGhyZWY9IiNTZXJ2ZXIiPlNlcnZlcjwvYT48L2xpPgorPGxpPjxhIGhyZWY9IiNTZXJ2aWNlIj5TZXJ2aWNlPC9hPjwvbGk+Cis8L3VsPgorCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iQWNjZXNzIExvZ2dlciI+CisKKyAgPHA+RnJvbSB0aGUgcGVyc3BlY3RpdmUgb2YgYSBwYXJ0aWN1bGFyIDxlbT5BY2Nlc3MgTG9nZ2VyPC9lbT4sIGl0IHNoYWxsCisgIGJlIHBvc3NpYmxlIHRvIHBlcmZvcm0gdGhlIGZvbGxvd2luZyBhZG1pbmlzdHJhdGl2ZSBvcGVyYXRpb25zOjwvcD4KKyAgPHVsPgorICA8bGk+TmF2aWdhdGUgdG8gdGhlIG93bmluZyA8ZW0+RW5naW5lPC9lbT4sIDxlbT5Ib3N0PC9lbT4sIG9yCisgICAgICA8ZW0+Q29udGV4dDwvZW0+LjwvbGk+CisgIDxsaT5FZGl0IHRoZSBjb25maWd1cmFibGUgcHJvcGVydGllcyBvZiB0aGlzIG9iamVjdC48L2xpPgorICA8L3VsPgorCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iQ29ubmVjdG9yIj4KKworICA8cD5Gcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiBhIHBhcnRpY3VsYXIgPGVtPkNvbm5lY3RvcjwvZW0+LCBpdCBzaGFsbCBiZQorICBwb3NzaWJsZSB0byBwZXJmb3JtIHRoZSBmb2xsb3dpbmcgYWRtaW5pc3RyYXRpdmUgb3BlcmF0aW9uczo8L3A+CisgIDx1bD4KKyAgPGxpPk5hdmlnYXRlIHRvIHRoZSBvd25pbmcgPGVtPlNlcnZpY2U8L2VtPi48L2xpPgorICA8bGk+RWRpdCB0aGUgY29uZmlndXJhYmxlIHByb3BlcnRpZXMgb2YgdGhpcyBvYmplY3QuPC9saT4KKyAgPC91bD4KKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IkNvbnRleHQiPgorCisgIDxwPkZyb20gdGhlIHBlcnNwZWN0aXZlIG9mIGEgcGFydGljdWxhciA8ZW0+Q29udGV4dDwvZW0+LCBpdCBzaGFsbCBiZQorICBwb3NzaWJsZSB0byBwZXJmb3JtIHRoZSBmb2xsb3dpbmcgYWRtaW5pc3RyYXRpdmUgb3BlcmF0aW9uczo8L3A+CisgIDx1bD4KKyAgPGxpPk5hdmlnYXRlIHRvIHRoZSBvd25pbmcgPGVtPkhvc3Q8L2VtPi48L2xpPgorICA8bGk+RWRpdCB0aGUgY29uZmlndXJhYmxlIHByb3BlcnRpZXMgb2YgdGhpcyBvYmplY3QuPC9saT4KKyAgPGxpPkNyZWF0ZSBhbmQgY29uZmlndXJlIGEgbmV3IDxlbT5BY2Nlc3MgTG9nZ2VyPC9lbT4gYXNzb2NpYXRlZAorICAgICAgd2l0aCB0aGlzIG9iamVjdC48L2xpPgorICA8bGk+RWRpdCB0aGUgY29uZmlndXJhYmxlIHByb3BlcnRpZXMgb2YgdGhlIGFzc29jaWF0ZWQgPGVtPkFjY2VzcworICAgICAgTG9nZ2VyPC9lbT4uPC9saT4KKyAgPGxpPlJlbW92ZSB0aGUgYXNzb2NpYXRlZCA8ZW0+QWNjZXNzIExvZ2dlcjwvZW0+LjwvbGk+CisgIDxsaT5DcmVhdGUgYW5kIGNvbmZpZ3VyZSBhIG5ldyA8ZW0+RW52aXJvbm1lbnQgRW50cnk8L2VtPiBhc3NvY2lhdGVkCisgICAgICB3aXRoIHRoaXMgb2JqZWN0LjwvbGk+CisgIDxsaT5TZWxlY3QgYW5kIGVkaXQgdGhlIGNvbmZpZ3VyYWJsZSBwcm9wZXJ0aWVzIG9mIGFuIGFzc29jaWF0ZWQKKyAgICAgIDxlbT5FbnZpcm9ubWVudCBFbnRyeTwvZW0+LjwvbGk+CisgIDxsaT5SZW1vdmUgYW4gYXNzb2NpYXRlZCA8ZW0+RW52aXJvbm1lbnQgRW50cnk8L2VtPi48L2xpPgorICA8bGk+Q3JlYXRlIGFuZCBjb25maWd1cmUgYSBuZXcgPGVtPkpEQkMgUmVzb3VyY2U8L2VtPiBhc3NvY2lhdGVkCisgICAgICB3aXRoIHRoaXMgb2JqZWN0LjwvbGk+CisgIDxsaT5TZWxlY3QgYW5kIGVkaXQgdGhlIGNvbmZpZ3VyYWJsZSBwcm9wZXJ0aWVzIG9mIGFuIGFzc29jaWF0ZWQKKyAgICAgIDxlbT5KREJDIFJlc291cmNlPC9lbT4uPC9saT4KKyAgPGxpPlJlbW92ZSBhbiBhc3NvY2lhdGVkIDxlbT5KREJDIFJlc291cmNlPC9lbT4uPC9saT4KKyAgPGxpPkNyZWF0ZSBhbmQgY29uZmlndXJlIGEgbmV3IDxlbT5Mb2FkZXI8L2VtPiBhc3NvY2lhdGVkIHdpdGgKKyAgICAgIHRoaXMgb2JqZWN0LjwvbGk+CisgIDxsaT5FZGl0IHRoZSBjb25maWd1cmFibGUgcHJvcGVydGllcyBvZiB0aGUgYXNzb2NpYXRlZCA8ZW0+TG9hZGVyPC9lbT4uPC9saT4KKyAgPGxpPlJlbW92ZSB0aGUgYXNzb2NpYXRlZCA8ZW0+TG9hZGVyPC9lbT4uPC9saT4KKyAgPGxpPkNyZWF0ZSBhbmQgY29uZmlndXJlIGEgbmV3IDxlbT5NYW5hZ2VyPC9lbT4gYXNzb2NpYXRlZCB3aXRoCisgICAgICB0aGlzIG9iamVjdC48L2xpPgorICA8bGk+RWRpdCB0aGUgY29uZmlndXJhYmxlIHByb3BlcnRpZXMgb2YgdGhlIGFzc29jaWF0ZWQgPGVtPk1hbmFnZXI8L2VtPi48L2xpPgorICA8bGk+UmVtb3ZlIHRoZSBhc3NvY2lhdGVkIDxlbT5NYW5hZ2VyPC9lbT4uPC9saT4KKyAgPGxpPkNyZWF0ZSBhbmQgY29uZmlndXJlIGEgbmV3IDxlbT5SZWFsbTwvZW0+IGFzc29jaWF0ZWQgd2l0aAorICAgICAgdGhpcyBvYmplY3QuPC9saT4KKyAgPGxpPkVkaXQgdGhlIGNvbmZpZ3VyYWJsZSBwcm9wZXJ0aWVzIG9mIHRoZSBhc3NvY2lhdGVkIDxlbT5SZWFsbTwvZW0+LjwvbGk+CisgIDxsaT5SZW1vdmUgdGhlIGFzc29jaWF0ZWQgPGVtPlJlYWxtPC9lbT4uPC9saT4KKyAgPGxpPkNyZWF0ZSBhbmQgY29uZmlndXJlIGEgbmV3IDxlbT5SZXF1ZXN0IEZpbHRlcjwvZW0+IGFzc29jaWF0ZWQgd2l0aAorICAgICAgdGhpcyBvYmplY3QuPC9saT4KKyAgPGxpPlNlbGVjdCBhbmQgZWRpdCB0aGUgY29uZmlndXJhYmxlIHByb3BlcnRpZXMgb2YgYW4KKyAgICAgIGFzc29jaWF0ZWQgPGVtPlJlcXVlc3QgRmlsdGVyPC9lbT48L2xpPgorICA8bGk+UmVtb3ZlIGFuIGFzc29jaWF0ZWQgPGVtPlJlcXVlc3QgRmlsdGVyPC9lbT4uPC9saT4KKyAgPC91bD4KKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IkRlZmF1bHQgQ29udGV4dCI+CisKKyAgPHA+RnJvbSB0aGUgcGVyc3BlY3RpdmUgb2YgYSBwYXJ0aWN1bGFyIDxlbT5EZWZhdWx0IENvbnRleHQ8L2VtPiwgaXQgc2hhbGwKKyAgYmUgcG9zc2libGUgdG8gcGVyZm9ybSB0aGUgZm9sbG93aW5nIGFkbWluaXN0cmF0aXZlIG9wZXJhdGlvbnM6PC9wPgorICA8dWw+CisgIDxsaT5OYXZpZ2F0ZSB0byB0aGUgb3duaW5nIDxlbT5FbmdpbmU8L2VtPiBvciA8ZW0+SG9zdDwvZW0+LjwvbGk+CisgIDxsaT5FZGl0IHRoZSBjb25maWd1cmFibGUgcHJvcGVydGllcyBvZiB0aGlzIG9iamVjdC48L2xpPgorICA8bGk+Q3JlYXRlIGFuZCBjb25maWd1cmUgYSBuZXcgPGVtPkVudmlyb25tZW50IEVudHJ5PC9lbT4gYXNzb2NpYXRlZAorICAgICAgd2l0aCB0aGlzIG9iamVjdC48L2xpPgorICA8bGk+U2VsZWN0IGFuZCBlZGl0IHRoZSBjb25maWd1cmFibGUgcHJvcGVydGllcyBvZiBhbiBhc3NvY2lhdGVkCisgICAgICA8ZW0+RW52aXJvbm1lbnQgRW50cnk8L2VtPi48L2xpPgorICA8bGk+UmVtb3ZlIGFuIGFzc29jaWF0ZWQgPGVtPkVudmlyb25tZW50IEVudHJ5PC9lbT4uPC9saT4KKyAgPGxpPkNyZWF0ZSBhbmQgY29uZmlndXJlIGEgbmV3IDxlbT5KREJDIFJlc291cmNlPC9lbT4gYXNzb2NpYXRlZAorICAgICAgd2l0aCB0aGlzIG9iamVjdC48L2xpPgorICA8bGk+U2VsZWN0IGFuZCBlZGl0IHRoZSBjb25maWd1cmFibGUgcHJvcGVydGllcyBvZiBhbiBhc3NvY2lhdGVkCisgICAgICA8ZW0+SkRCQyBSZXNvdXJjZTwvZW0+LjwvbGk+CisgIDxsaT5SZW1vdmUgYW4gYXNzb2NpYXRlZCA8ZW0+SkRCQyBSZXNvdXJjZTwvZW0+LjwvbGk+CisgIDwvdWw+CisKKzwvc2VjdGlvbj4KKworCis8c2VjdGlvbiBuYW1lPSJFbmdpbmUiPgorCisgIDxwPkZyb20gdGhlIHBlcnNwZWN0aXZlIG9mIGEgcGFydGljdWxhciA8ZW0+RW5naW5lPC9lbT4sIGl0IHNoYWxsIGJlCisgIHBvc3NpYmxlIHRvIHBlcmZvcm0gdGhlIGZvbGxvd2luZyBhZG1pbmlzdHJhdGl2ZSBvcGVyYXRpb25zOjwvcD4KKyAgPHVsPgorICA8bGk+TmF2aWdhdGUgdG8gdGhlIG93bmluZyA8ZW0+U2VydmljZTwvZW0+LjwvbGk+CisgIDxsaT5FZGl0IHRoZSBjb25maWd1cmFibGUgcHJvcGVydGllcyBvZiB0aGlzIG9iamVjdC48L2xpPgorICA8bGk+Q3JlYXRlIGFuZCBjb25maWd1cmUgYSBuZXcgPGVtPkFjY2VzcyBMb2dnZXI8L2VtPiBhc3NvY2lhdGVkCisgICAgICB3aXRoIHRoaXMgb2JqZWN0LjwvbGk+CisgIDxsaT5FZGl0IHRoZSBjb25maWd1cmFibGUgcHJvcGVydGllcyBvZiB0aGUgYXNzb2NpYXRlZCA8ZW0+QWNjZXNzCisgICAgICBMb2dnZXI8L2VtPi48L2xpPgorICA8bGk+UmVtb3ZlIHRoZSBhc3NvY2lhdGVkIDxlbT5BY2Nlc3MgTG9nZ2VyPC9lbT4uPC9saT4KKyAgPGxpPkNyZWF0ZSBhbmQgY29uZmlndXJlIGEgbmV3IDxlbT5EZWZhdWx0IENvbnRleHQ8L2VtPiBhc3NvY2lhdGVkCisgICAgICB3aXRoIHRoaXMgb2JqZWN0LjwvbGk+CisgIDxsaT5FZGl0IHRoZSBjb25maWd1cmFibGUgcHJvcGVydGllcyBvZiB0aGUgYXNzb2NpYXRlZCA8ZW0+RGVmYXVsdAorICAgICAgQ29udGV4dDwvZW0+LjwvbGk+CisgIDxsaT5SZW1vdmUgdGhlIGFzc29jaWF0ZWQgPGVtPkRlZmF1bHQgQ29udGV4dDwvZW0+LjwvbGk+CisgIDxsaT5DcmVhdGUgYW5kIGNvbmZpZ3VyZSBhIG5ldyA8ZW0+SG9zdDwvZW0+IGFzc29jaWF0ZWQgd2l0aAorICAgICAgdGhpcyBvYmplY3QuPC9saT4KKyAgPGxpPlNlbGVjdCBhbmQgZWRpdCB0aGUgY29uZmlndXJhYmxlIHByb3BlcnRpZXMgb2YgYW4KKyAgICAgIGFzc29jaWF0ZWQgPGVtPkhvc3Q8L2VtPi48L2xpPgorICA8bGk+UmVtb3ZlIGFuIGFzc29jaWF0ZWQgPGVtPkhvc3Q8L2VtPi48L2xpPgorICA8bGk+Q3JlYXRlIGFuZCBjb25maWd1cmUgYSBuZXcgPGVtPlJlYWxtPC9lbT4gYXNzb2NpYXRlZCB3aXRoCisgICAgICB0aGlzIG9iamVjdC48L2xpPgorICA8bGk+RWRpdCB0aGUgY29uZmlndXJhYmxlIHByb3BlcnRpZXMgb2YgdGhlIGFzc29jaWF0ZWQgPGVtPlJlYWxtPC9lbT4uPC9saT4KKyAgPGxpPlJlbW92ZSB0aGUgYXNzb2NpYXRlZCA8ZW0+UmVhbG08L2VtPi48L2xpPgorICA8bGk+Q3JlYXRlIGFuZCBjb25maWd1cmUgYSBuZXcgPGVtPlJlcXVlc3QgRmlsdGVyPC9lbT4gYXNzb2NpYXRlZCB3aXRoCisgICAgICB0aGlzIG9iamVjdC48L2xpPgorICA8bGk+U2VsZWN0IGFuZCBlZGl0IHRoZSBjb25maWd1cmFibGUgcHJvcGVydGllcyBvZiBhbgorICAgICAgYXNzb2NpYXRlZCA8ZW0+UmVxdWVzdCBGaWx0ZXI8L2VtPjwvbGk+CisgIDxsaT5SZW1vdmUgYW4gYXNzb2NpYXRlZCA8ZW0+UmVxdWVzdCBGaWx0ZXI8L2VtPi48L2xpPgorICA8L3VsPgorCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iRW52aXJvbm1lbnQgRW50cnkiPgorCisgIDxwPkZyb20gdGhlIHBlcnNwZWN0aXZlIG9mIGEgcGFydGljdWxhciA8ZW0+RW52aXJvbm1lbnQgRW50cnk8L2VtPiwgaXQgc2hhbGwKKyAgYmUgcG9zc2libGUgdG8gcGVyZm9ybSB0aGUgZm9sbG93aW5nIGFkbWluaXN0cmF0aXZlIG9wZXJhdGlvbnM6PC9wPgorICA8dWw+CisgIDxsaT5OYXZpZ2F0ZSB0byB0aGUgb3duaW5nIDxlbT5Db250ZXh0PC9lbT4gb3IgPGVtPkRlZmF1bHQgQ29udGV4dDwvZW0+LjwvbGk+CisgIDxsaT5FZGl0IHRoZSBjb25maWd1cmFibGUgcHJvcGVydGllcyBvZiB0aGlzIG9iamVjdC48L2xpPgorICA8L3VsPgorCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iSG9zdCI+CisKKyAgPHA+RnJvbSB0aGUgcGVyc3BlY3RpdmUgb2YgYSBwYXJ0aWN1bGFyIDxlbT5Ib3N0PC9lbT4sIGl0IHNoYWxsIGJlCisgIHBvc3NpYmxlIHRvIHBlcmZvcm0gdGhlIGZvbGxvd2luZyBhZG1pbmlzdHJhdGl2ZSBvcGVyYXRpb25zOjwvcD4KKyAgPHVsPgorICA8bGk+TmF2aWdhdGUgdG8gdGhlIG93bmluZyA8ZW0+RW5naW5lPC9lbT4uPC9saT4KKyAgPGxpPkVkaXQgdGhlIGNvbmZpZ3VyYWJsZSBwcm9wZXJ0aWVzIG9mIHRoaXMgb2JqZWN0LjwvbGk+CisgIDxsaT5DcmVhdGUgYW5kIGNvbmZpZ3VyZSBhIG5ldyA8ZW0+QWNjZXNzIExvZ2dlcjwvZW0+IGFzc29jaWF0ZWQKKyAgICAgIHdpdGggdGhpcyBvYmplY3QuPC9saT4KKyAgPGxpPkVkaXQgdGhlIGNvbmZpZ3VyYWJsZSBwcm9wZXJ0aWVzIG9mIHRoZSBhc3NvY2lhdGVkIDxlbT5BY2Nlc3MKKyAgICAgIExvZ2dlcjwvZW0+LjwvbGk+CisgIDxsaT5SZW1vdmUgdGhlIGFzc29jaWF0ZWQgPGVtPkFjY2VzcyBMb2dnZXI8L2VtPi48L2xpPgorICA8bGk+Q3JlYXRlIGFuZCBjb25maWd1cmUgYSBuZXcgPGVtPkNvbnRleHQ8L2VtPiBhc3NvY2lhdGVkIHdpdGgKKyAgICAgIHRoaXMgb2JqZWN0LjwvbGk+CisgIDxsaT5TZWxlY3QgYW5kIGVkaXQgdGhlIGNvbmZpZ3VyYWJsZSBwcm9wZXJ0aWVzIG9mIGFuIGFzc29jaWF0ZWQKKyAgICAgIDxlbT5Db250ZXh0PC9lbT4uPC9saT4KKyAgPGxpPlJlbW92ZSBhbiBhc3NvY2lhdGVkIDxlbT5Db250ZXh0PC9lbT4uPC9saT4KKyAgPGxpPkNyZWF0ZSBhbmQgY29uZmlndXJlIGEgbmV3IDxlbT5EZWZhdWx0IENvbnRleHQ8L2VtPiBhc3NvY2lhdGVkCisgICAgICB3aXRoIHRoaXMgb2JqZWN0LjwvbGk+CisgIDxsaT5FZGl0IHRoZSBjb25maWd1cmFibGUgcHJvcGVydGllcyBvZiB0aGUgYXNzb2NpYXRlZCA8ZW0+RGVmYXVsdAorICAgICAgQ29udGV4dDwvZW0+LjwvbGk+CisgIDxsaT5SZW1vdmUgdGhlIGFzc29jaWF0ZWQgPGVtPkRlZmF1bHQgQ29udGV4dDwvZW0+LjwvbGk+CisgIDxsaT5DcmVhdGUgYW5kIGNvbmZpZ3VyZSBhIG5ldyA8ZW0+UmVhbG08L2VtPiBhc3NvY2lhdGVkIHdpdGgKKyAgICAgIHRoaXMgb2JqZWN0LjwvbGk+CisgIDxsaT5FZGl0IHRoZSBjb25maWd1cmFibGUgcHJvcGVydGllcyBvZiB0aGUgYXNzb2NpYXRlZCA8ZW0+UmVhbG08L2VtPi48L2xpPgorICA8bGk+UmVtb3ZlIHRoZSBhc3NvY2lhdGVkIDxlbT5SZWFsbTwvZW0+LjwvbGk+CisgIDxsaT5DcmVhdGUgYW5kIGNvbmZpZ3VyZSBhIG5ldyA8ZW0+UmVxdWVzdCBGaWx0ZXI8L2VtPiBhc3NvY2lhdGVkIHdpdGgKKyAgICAgIHRoaXMgb2JqZWN0LjwvbGk+CisgIDxsaT5TZWxlY3QgYW5kIGVkaXQgdGhlIGNvbmZpZ3VyYWJsZSBwcm9wZXJ0aWVzIG9mIGFuCisgICAgICBhc3NvY2lhdGVkIDxlbT5SZXF1ZXN0IEZpbHRlcjwvZW0+PC9saT4KKyAgPGxpPlJlbW92ZSBhbiBhc3NvY2lhdGVkIDxlbT5SZXF1ZXN0IEZpbHRlcjwvZW0+LjwvbGk+CisgIDwvdWw+CisKKzwvc2VjdGlvbj4KKworCis8c2VjdGlvbiBuYW1lPSJKREJDIFJlc291cmNlIj4KKworICA8cD5Gcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiBhIHBhcnRpY3VsYXIgPGVtPkpEQkMgUmVzb3VyY2U8L2VtPiwgaXQgc2hhbGwKKyAgYmUgcG9zc2libGUgdG8gcGVyZm9ybSB0aGUgZm9sbG93aW5nIGFkbWluaXN0cmF0aXZlIG9wZXJhdGlvbnM6PC9wPgorICA8dWw+CisgIDxsaT5OYXZpZ2F0ZSB0byB0aGUgb3duaW5nIDxlbT5Db250ZXh0PC9lbT4gb3IgPGVtPkRlZmF1bHQgQ29udGV4dDwvZW0+LjwvbGk+CisgIDxsaT5FZGl0IHRoZSBjb25maWd1cmFibGUgcHJvcGVydGllcyBvZiB0aGlzIG9iamVjdC48L2xpPgorICA8L3VsPgorCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iTG9hZGVyIj4KKworICA8cD5Gcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiBhIHBhcnRpY3VsYXIgPGVtPkxvYWRlcjwvZW0+LCBpdCBzaGFsbAorICBiZSBwb3NzaWJsZSB0byBwZXJmb3JtIHRoZSBmb2xsb3dpbmcgYWRtaW5pc3RyYXRpdmUgb3BlcmF0aW9uczo8L3A+CisgIDx1bD4KKyAgPGxpPk5hdmlnYXRlIHRvIHRoZSBvd25pbmcgPGVtPkNvbnRleHQ8L2VtPi48L2xpPgorICA8bGk+RWRpdCB0aGUgY29uZmlndXJhYmxlIHByb3BlcnRpZXMgb2YgdGhpcyBvYmplY3QuPC9saT4KKyAgPC91bD4KKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9Ik1hbmFnZXIiPgorCisgIDxwPkZyb20gdGhlIHBlcnNwZWN0aXZlIG9mIGEgcGFydGljdWxhciA8ZW0+TWFuYWdlcjwvZW0+LCBpdCBzaGFsbAorICBiZSBwb3NzaWJsZSB0byBwZXJmb3JtIHRoZSBmb2xsb3dpbmcgYWRtaW5pc3RyYXRpdmUgb3BlcmF0aW9uczo8L3A+CisgIDx1bD4KKyAgPGxpPk5hdmlnYXRlIHRvIHRoZSBvd25pbmcgPGVtPkNvbnRleHQ8L2VtPi48L2xpPgorICA8bGk+RWRpdCB0aGUgY29uZmlndXJhYmxlIHByb3BlcnRpZXMgb2YgdGhpcyBvYmplY3QuPC9saT4KKyAgPC91bD4KKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IlJlYWxtIj4KKworICA8cD5Gcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiBhIHBhcnRpY3VsYXIgPGVtPlJlYWxtPC9lbT4sIGl0IHNoYWxsCisgIGJlIHBvc3NpYmxlIHRvIHBlcmZvcm0gdGhlIGZvbGxvd2luZyBhZG1pbmlzdHJhdGl2ZSBvcGVyYXRpb25zOjwvcD4KKyAgPHVsPgorICA8bGk+TmF2aWdhdGUgdG8gdGhlIG93bmluZyA8ZW0+RW5naW5lPC9lbT4sIDxlbT5Ib3N0PC9lbT4sIG9yCisgICAgICA8ZW0+Q29udGV4dDwvZW0+LjwvbGk+CisgIDxsaT5FZGl0IHRoZSBjb25maWd1cmFibGUgcHJvcGVydGllcyBvZiB0aGlzIG9iamVjdC48L2xpPgorICA8L3VsPgorCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iUmVxdWVzdCBGaWx0ZXIiPgorCisgIDxwPkZyb20gdGhlIHBlcnNwZWN0aXZlIG9mIGEgcGFydGljdWxhciA8ZW0+UmVxdWVzdCBGaWx0ZXI8L2VtPiwgaXQgc2hhbGwKKyAgYmUgcG9zc2libGUgdG8gcGVyZm9ybSB0aGUgZm9sbG93aW5nIGFkbWluaXN0cmF0aXZlIG9wZXJhdGlvbnM6PC9wPgorICA8dWw+CisgIDxsaT5OYXZpZ2F0ZSB0byB0aGUgb3duaW5nIDxlbT5FbmdpbmU8L2VtPiwgPGVtPkhvc3Q8L2VtPiwgb3IKKyAgICAgIDxlbT5Db250ZXh0PC9lbT4uPC9saT4KKyAgPGxpPkVkaXQgdGhlIGNvbmZpZ3VyYWJsZSBwcm9wZXJ0aWVzIG9mIHRoaXMgb2JqZWN0LjwvbGk+CisgIDwvdWw+CisKKzwvc2VjdGlvbj4KKworCis8c2VjdGlvbiBuYW1lPSJTZXJ2ZXIiPgorCisgIDxwPkZyb20gdGhlIHBlcnNwZWN0aXZlIG9mIHRoZSBvdmVyYWxsIDxlbT5TZXJ2ZXI8L2VtPiwgaXQgc2hhbGwgYmUKKyAgcG9zc2libGUgdG8gcGVyZm9ybSB0aGUgZm9sbG93aW5nIGFkbWluaXN0cmF0aXZlIG9wZXJhdGlvbnM6PC9wPgorICA8dWw+CisgIDxsaT5FZGl0IHRoZSBjb25maWd1cmFibGUgcHJvcGVydGllcyBvZiB0aGlzIG9iamVjdC48L2xpPgorICA8bGk+Q3JlYXRlIGFuZCBjb25maWd1cmUgYSBuZXcgPGVtPlNlcnZpY2U8L2VtPiBhc3NvY2lhdGVkIHdpdGgKKyAgICAgIHRoaXMgb2JqZWN0LjwvbGk+CisgIDxsaT5TZWxlY3QgYW5kIGVkaXQgdGhlIGNvbmZpZ3VyYWJsZSBwcm9wZXJ0aWVzIG9mIGFuIGFzc29jaWF0ZWQKKyAgICAgIDxlbT5TZXJ2aWNlPC9lbT4uPC9saT4KKyAgPC91bD4KKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IlNlcnZpY2UiPgorCisgIDxwPkZyb20gdGhlIHBlcnNwZWN0aXZlIG9mIGEgcGFydGljdWxhciA8ZW0+U2VydmljZTwvZW0+LCBpdCBzaGFsbCBiZQorICBwb3NzaWJsZSB0byBwZXJmb3JtIHRoZSBmb2xsb3dpbmcgYWRtaW5pc3RyYXRpdmUgb3BlcmF0aW9uczo8L3A+CisgIDx1bD4KKyAgPGxpPk5hdmlnYXRlIHRvIHRoZSBvd25pbmcgPGVtPlNlcnZlcjwvZW0+LjwvbGk+CisgIDxsaT5FZGl0IHRoZSBjb25maWd1cmFibGUgcHJvcGVydGllcyBvZiB0aGlzIG9iamVjdC48L2xpPgorICA8bGk+Q3JlYXRlIGFuZCBjb25maWd1cmUgYSBuZXcgPGVtPkNvbm5lY3RvcjwvZW0+IGFzc29jaWF0ZWQgd2l0aAorICAgICAgdGhpcyBvYmplY3QuPC9saT4KKyAgPGxpPlNlbGVjdCBhbmQgZWRpdCB0aGUgY29uZmlndXJhYmxlIHByb3BlcnRpZXMgb2YgYW4gYXNzb2NpYXRlZAorICAgICAgPGVtPkNvbm5lY3RvcjwvZW0+LjwvbGk+CisgIDxsaT5SZW1vdmUgYW4gYXNzb2NpYXRlZCA8ZW0+Q29ubmVjdG9yPC9lbT4uPC9saT4KKyAgPGxpPkNyZWF0ZSBhbmQgY29uZmlndXJlIGEgbmV3IDxlbT5FbmdpbmU8L2VtPiBhc3NvY2lhdGVkIHdpdGgKKyAgICAgIHRoaXMgb2JqZWN0LjwvbGk+CisgIDxsaT5FZGl0IHRoZSBjb25maWd1cmFibGUgcHJvcGVydGllcyBvZiB0aGUgYXNzb2NpYXRlZCA8ZW0+RW5naW5lPC9lbT4uPC9saT4KKyAgPGxpPlJlbW92ZSB0aGUgYXNzb2NpYXRlZCA8ZW0+RW5naW5lPC9lbT4uPC9saT4KKyAgPC91bD4KKworPC9zZWN0aW9uPgorCisKKzwvYm9keT4KKworPC9kb2N1bWVudD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvZnVuY3NwZWNzL2ZzLWRlZmF1bHQueG1sIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9mdW5jc3BlY3MvZnMtZGVmYXVsdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNkNjE2MwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvZnVuY3NwZWNzL2ZzLWRlZmF1bHQueG1sCkBAIC0wLDAgKzEsMjUyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhRE9DVFlQRSBkb2N1bWVudCBbCisgIDwhRU5USVRZIHByb2plY3QgU1lTVEVNICJwcm9qZWN0LnhtbCI+CitdPgorPGRvY3VtZW50IHVybD0iZnMtZGVmYXVsdC5odG1sIj4KKworICAmcHJvamVjdDsKKworICA8cHJvcGVydGllcz4KKyAgICA8YXV0aG9yIGVtYWlsPSJjcmFpZ21jY0BhcGFjaGUub3JnIj5DcmFpZyBNY0NsYW5haGFuPC9hdXRob3I+CisgICAgPHRpdGxlPkRlZmF1bHQgU2VydmxldDwvdGl0bGU+CisgICAgPHJldmlzaW9uPiRJZCQ8L3JldmlzaW9uPgorICA8L3Byb3BlcnRpZXM+CisKKzxib2R5PgorCisKKzxzZWN0aW9uIG5hbWU9Ik92ZXJ2aWV3Ij4KKworCisgIDxzdWJzZWN0aW9uIG5hbWU9IkludHJvZHVjdGlvbiI+CisKKyAgICA8cD5UaGUgcHVycG9zZSBvZiB0aGUgPHN0cm9uZz5EZWZhdWx0IFNlcnZsZXQ8L3N0cm9uZz4gaXMgdG8gc2VydmUKKyAgICBzdGF0aWMgcmVzb3VyY2VzIG9mIGEgd2ViIGFwcGxpY2F0aW9uIGluIHJlc3BvbnNlIHRvIGNsaWVudCByZXF1ZXN0cy4KKyAgICBBcyB0aGUgbmFtZSBpbXBsaWVzLCBpdCBpcyBnZW5lcmFsbHkgY29uZmlndXJlZCBhcyB0aGUgImRlZmF1bHQiCisgICAgc2VydmxldCBmb3IgYSB3ZWIgYXBwbGljYXRpb24sIGJ5IGJlaW5nIG1hcHBlZCB0byBhIFVSTCBwYXR0ZXJuICIvIi48L3A+CisKKyAgPC9zdWJzZWN0aW9uPgorCisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iRXh0ZXJuYWwgU3BlY2lmaWNhdGlvbnMiPgorCisgICAgPHA+VGhlIGZvbGxvd2luZyBleHRlcm5hbCBzcGVjaWZpY2F0aW9ucyBoYXZlIHByb3Zpc2lvbnMgd2hpY2gKKyAgICBwYXJ0aWFsbHkgZGVmaW5lIHRoZSBjb3JyZWN0IGJlaGF2aW9yIG9mIHRoZSBkZWZhdWx0IHNlcnZsZXQ6PC9wPgorICAgIDx1bD4KKyAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9zZXJ2bGV0L2Rvd25sb2FkLmh0bWwiPgorICAgICAgICBTZXJ2bGV0IFNwZWNpZmljYXRpb248L2E+IChWZXJzaW9uIDIuMyBQRkQyKTwvbGk+CisgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzIwNDYudHh0Ij5NdWx0aXB1cnBvc2UKKyAgICAgICAgSW50ZXJuZXQgTWFpbCBFeHRlbnNpb25zIChNSU1FKSBQYXJ0IFR3bzogTWVkaWEgVHlwZXM8L2E+PC9saT4KKyAgICA8bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjMjYxNi50eHQiPkh5cGVydGV4dAorICAgICAgICBUcmFuc2ZlciBQcm90b2NvbCAtLSBIVFRQLzEuMTwvYT48L2xpPgorICAgIDwvdWw+CisKKyAgPC9zdWJzZWN0aW9uPgorCisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iSW1wbGVtZW50YXRpb24gUmVxdWlyZW1lbnRzIj4KKworICAgIDxwPlRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGZ1bmN0aW9uYWxpdHkgc2hhbGwgY29uZm9ybSB0byB0aGUKKyAgICBmb2xsb3dpbmcgcmVxdWlyZW1lbnRzOjwvcD4KKyAgICA8dWw+CisgICAgPGxpPk11c3QgYmUgaW1wbGVtZW50ZWQgYXMgYSBzZXJ2bGV0LjwvbGk+CisgICAgPGxpPk11c3Qgc3VwcG9ydCBjb25maWd1cmFibGUgcGFyYW1ldGVycyBmb3IgZGVidWdnaW5nIGRldGFpbCBsZXZlbCwKKyAgICAgICAgaW5wdXQgYnVmZmVyIHNpemUsIG91dHB1dCBidWZmZXIgc2l6ZSwgd2hldGhlciBvciBub3QgdG8gcHJvZHVjZQorICAgICAgICBkaXJlY3RvcnkgbGlzdGluZ3Mgd2hlbiBubyB3ZWxjb21lIGZpbGUgaXMgcHJlc2VudCwgYW5kIHdoZXRoZXIgb3Igbm90CisgICAgICAgIG1vZGlmaWNhdGlvbnMgYXJlIHN1cHBvcnRlZCB2aWEgREVMRVRFIGFuZCBQVVQuPC9saT4KKyAgICA8bGk+TG9nIGRlYnVnZ2luZyBhbmQgb3BlcmF0aW9uYWwgbWVzc2FnZXMgKHN1aXRhYmx5IGludGVybmF0aW9uYWxpemVkKQorICAgICAgICB2aWEgdGhlIDxjb2RlPmdldFNlcnZsZXRDb250ZXh0KCkubG9nKCk8L2NvZGU+IG1ldGhvZC48L2xpPgorICAgIDwvdWw+CisKKyAgPC9zdWJzZWN0aW9uPgorCisKKzwvc2VjdGlvbj4KKworCis8c2VjdGlvbiBuYW1lPSJEZXBlbmRlbmNpZXMiPgorCisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iRW52aXJvbm1lbnRhbCBEZXBlbmRlbmNpZXMiPgorCisgICAgPHA+VGhlIGZvbGxvd2luZyBlbnZpcm9ubWVudGFsIGRlcGVuZGVuY2llcyBtdXN0IGJlIG1ldCBpbiBvcmRlciBmb3IKKyAgICB0aGUgZGVmYXVsdCBzZXJ2bGV0IHRvIG9wZXJhdGUgY29ycmVjdGx5OjwvcD4KKyAgICA8dWw+CisgICAgPGxpPlRoZSBkZWZhdWx0IHNlcnZsZXQgbXVzdCBiZSByZWdpc3RlcmVkIGluIHRoZSBhcHBsaWNhdGlvbiBkZXBsb3ltZW50CisgICAgICAgIGRlc2NyaXB0b3IgKG9yIHRoZSBkZWZhdWx0IGRlcGxveW1lbnQgZGVzY3JpcHRvciBpbiBmaWxlCisgICAgICAgIDxjb2RlPiRDQVRBTElOQV9IT01FL2NvbmYvd2ViLnhtbDwvY29kZT4pIHVzaW5nIGEgImRlZmF1bHQgc2VydmxldCIKKyAgICAgICAgc2VydmxldCBtYXBwaW5nLCBzaWduaWZpZWQgYnkgVVJMIHBhdHRlcm4gIi8iLjwvbGk+CisgICAgPC91bD4KKworICA8L3N1YnNlY3Rpb24+CisKKworICA8c3Vic2VjdGlvbiBuYW1lPSJDb250YWluZXIgRGVwZW5kZW5jaWVzIj4KKworICAgIDxwPkNvcnJlY3Qgb3BlcmF0aW9uIG9mIHRoZSBkZWZhdWx0IHNlcnZsZXQgZGVwZW5kcyBvbiB0aGUgZm9sbG93aW5nCisgICAgc3BlY2lmaWMgZmVhdHVyZXMgb2YgdGhlIHN1cnJvdW5kaW5nIGNvbnRhaW5lcjo8L3A+CisgICAgPHVsPgorICAgIDxsaT5UaGUgY29udGFpbmVyIHNoYWxsIHByb3ZpZGUgYSBzZXJ2bGV0IGNvbnRleHQgYXR0cmlidXRlIHRoYXQKKyAgICAgICAgbGlzdHMgdGhlIHdlbGNvbWUgZmlsZSBuYW1lcyB0aGF0IGhhdmUgYmVlbiBkZWZpbmVkIGZvciB0aGlzCisgICAgICAgIHdlYiBhcHBsaWNhdGlvbi48L2xpPgorICAgIDxsaT5UaGUgY29udGFpbmVyIHNoYWxsIHByb3ZpZGUgYSBzZXJ2bGV0IGNvbnRleHQgYXR0cmlidXRlIHRoYXQKKyAgICAgICAgY29udGFpbnMgYSA8Y29kZT5qYXZheC5uYW1pbmcuZGlyZWN0b3J5LkRpckNvbnRleHQ8L2NvZGU+CisgICAgICAgIGltcGxlbWVudGF0aW9uIHJlcHJlc2VudGluZyB0aGUgc3RhdGljIHJlc291cmNlcyBvZiB0aGlzCisgICAgICAgIHdlYiBhcHBsaWNhdGlvbi48L2xpPgorICAgIDwvdWw+CisKKyAgPC9zdWJzZWN0aW9uPgorCisKKzwvc2VjdGlvbj4KKworCis8c2VjdGlvbiBuYW1lPSJGdW5jdGlvbmFsaXR5Ij4KKworCisgIDxzdWJzZWN0aW9uIG5hbWU9IkluaXRpYWxpemF0aW9uIEZ1bmN0aW9uYWxpdHkiPgorCisgICAgPHA+VGhlIGZvbGxvd2luZyBwcm9jZXNzaW5nIG11c3QgYmUgcGVyZm9ybWVkIHdoZW4gdGhlIDxjb2RlPmluaXQoKTwvY29kZT4KKyAgICBtZXRob2Qgb2YgdGhlIGludm9rZXIgc2VydmxldCBpcyBjYWxsZWQ6PC9wPgorICAgIDx1bD4KKyAgICA8bGk+UHJvY2VzcyBhbmQgc2FuaXR5IGNoZWNrIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycy48L2xpPgorICAgIDwvdWw+CisKKyAgPC9zdWJzZWN0aW9uPgorCisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iUGVyLVJlcXVlc3QgRnVuY3Rpb25hbGl0eSI+CisKKworICAgIDxwPkZvciBhbGwgSFRUUCByZXF1ZXN0IG1ldGhvZHMsIHRoZSByZXNvdXJjZSBwYXRoIGlzIGRldGVybWluZWQgZnJvbQorICAgIHRoZSBwYXRoIGluZm9ybWF0aW9uIHByb3ZpZGVkIHRvIHRoaXMgcmVxdWVzdCwgZWl0aGVyIGFzIHJlcXVlc3QgYXR0cmlidXRlCisgICAgPGNvZGU+amF2YXguc2VydmxldC5pbmNsdWRlLnBhdGhfaW5mbzwvY29kZT4gKGZvciBhIHJlcXVlc3QgZGlzcGF0Y2hlcgorICAgIGFjY2VzcyB0byBhIHN0YXRpYyByZXNvdXJjZSkgb3IgYnkgY2FsbGluZworICAgIDxjb2RlPnJlcXVlc3QuZ2V0UGF0aEluZm8oKTwvY29kZT4gZGlyZWN0bHkuPC9wPgorCisgICAgPHA+T24gZWFjaCBIVFRQIERFTEVURSByZXF1ZXN0IHByb2Nlc3NlZCBieSB0aGlzIHNlcnZsZXQsIHRoZSBmb2xsb3dpbmcKKyAgICBwcm9jZXNzaW5nIHNoYWxsIGJlIHBlcmZvcm1lZDo8L3A+CisgICAgPHVsPgorICAgIDxsaT5JZiBtb2RpZmljYXRpb25zIHRvIHRoZSBzdGF0aWMgcmVzb3VyY2VzIGFyZSBub3QgYWxsb3dlZCAoc2V0IGJ5IGEKKyAgICAgICAgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIpLCByZXR1cm4gSFRUUCBzdGF0dXMgNDAzIChmb3JiaWRkZW4pLjwvbGk+CisgICAgPGxpPklmIGFuIGF0dGVtcHQgaXMgbWFkZSB0byBkZWxldGUgYSByZXNvdXJjZSBmcm9tIDxjb2RlPi9NRVRBLUlORjwvY29kZT4KKyAgICAgICAgb3IgPGNvZGU+L1dFQi1JTkY8L2NvZGU+LCByZXR1cm4gSFRUUCBzdGF0dXMgNDAzIChmb3JiaWRkZW4pLjwvbGk+CisgICAgPGxpPklmIHRoZSByZXF1ZXN0ZWQgcmVzb3VyY2UgZG9lcyBub3QgZXhpc3QsIHJldHVybiBIVFRQIHN0YXR1cyA0MDQKKyAgICAgICAgKG5vdCBmb3VuZCk8L2xpPgorICAgIDxsaT5VbmJpbmQgdGhlIHJlc291cmNlIGZyb20gdGhlIGRpcmVjdG9yeSBjb250ZXh0IGNvbnRhaW5pbmcgdGhlCisgICAgICAgIHN0YXRpYyByZXNvdXJjZXMgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLiAgSWYgc3VjY2Vzc2Z1bCwgcmV0dXJuCisgICAgICAgIEhUVFAgc3RhdHVzIDIwNCAobm8gY29udGVudCkuICBPdGhlcndpc2UsIHJldHVybiBIVFRQIHN0YXR1cyA0MDUKKyAgICAgICAgKG1ldGhvZCBub3QgYWxsb3dlZCkuPC9saT4KKyAgICA8L3VsPgorCisKKyAgICA8cD5PbiBlYWNoIEhUVFAgR0VUIHJlcXVlc3QgcHJvY2Vzc2VkIGJ5IHRoaXMgc2VydmxldCwgdGhlIGZvbGxvd2luZworICAgIHByb2Nlc3Npbmcgc2hhbGwgYmUgcGVyZm9ybWVkOjwvcD4KKyAgICA8dWw+CisgICAgPGxpPklmIHRoZSByZXF1ZXN0IGlzIGZvciBhIHJlc291cmNlIHVuZGVyIDxjb2RlPi9NRVRBLUlORjwvY29kZT4gb3IKKyAgICAgICAgPGNvZGU+L1dFQi1JTkY8L2NvZGU+LCByZXR1cm4gSFRUUCBzdGF0dXMgNDA0IChub3QgZm91bmQpLjwvbGk+CisgICAgPGxpPklmIHRoZSByZXF1ZXN0ZWQgcmVzb3VyY2UgZG9lcyBub3QgZXhpc3QsIHJldHVybiBIVFRQIHN0YXR1cyA0MDQKKyAgICAgICAgKG5vdCBmb3VuZCkuPC9saT4KKyAgICA8bGk+SWYgdGhlIHJlcXVlc3RlZCByZXNvdXJjZSBpcyBub3QgYSBkaXJlY3RvcnksIGJ1dCB0aGUgcmVzb3VyY2UKKyAgICAgICAgcGF0aCBlbmRzIGluICIvIiBvciAiXCIsIHJldHVybiBIVFRQIHN0YXR1cyA0MDQgKG5vdCBmb3VuZCkuPC9saT4KKyAgICA8bGk+SWYgdGhlIHJlcXVlc3RlZCByZXNvdXJjZSBpcyBhIGRpcmVjdG9yeToKKyAgICAgICAgPHVsPgorICAgICAgICA8bGk+SWYgdGhlIHJlcXVlc3QgcGF0aCBkb2VzIG5vdCBlbmQgd2l0aCAiLyIsIHJlZGlyZWN0IHRvIGEKKyAgICAgICAgICAgIGNvcnJlc3BvbmRpbmcgcGF0aCB3aXRoICIvIiBhcHBlbmRlZCBzbyB0aGF0IHJlbGF0aXZlIHJlZmVyZW5jZXMKKyAgICAgICAgICAgIGluIHdlbGNvbWUgZmlsZXMgYXJlIHJlc29sdmVkIGNvcnJlY3RseS48L2xpPgorICAgICAgICA8bGk+SWYgb25lIG9mIHRoZSBzcGVjaWZpZWQgd2VsY29tZSBmaWxlcyBleGlzdHMsIHJlZGlyZWN0IHRvIHRoZQorICAgICAgICAgICAgcGF0aCBmb3IgdGhhdCB3ZWxjb21lIGZpbGUgc28gdGhhdCBpdCB3aWxsIGJlIHNlcnZlZCBleHBsaWNpdGx5LgorICAgICAgICAgICAgPC9saT4KKyAgICAgICAgPC91bD48L2xpPgorICAgIDxsaT5JZiB0aGUgcmVxdWVzdCBiZWluZyBwcm9jZXNzZWQgY29udGFpbnMgYW4gPGNvZGU+SWYtUmFuZ2U8L2NvZGU+CisgICAgICAgIGhlYWRlciwgcGVyZm9ybSB0aGUgcHJvY2Vzc2luZyBkZXNjcmliZWQgaW4gdGhlIEhUVFAvMS4xIHNwZWNpZmljYXRpb24KKyAgICAgICAgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGNsaWVudCdzIGluZm9ybWF0aW9uIGlzIHVwIHRvIGRhdGUuPC9saT4KKyAgICA8bGk+RGV0ZXJtaW5lIHRoZSBjb250ZW50IHR5cGUgb2YgdGhlIHJlc3BvbnNlLCBieSBsb29raW5nIHVwIHRoZQorICAgICAgICBjb3JyZXNwb25kaW5nIE1JTUUgdHlwZSBpbiBvdXIgc2VydmxldCBjb250ZXh0LjwvbGk+CisgICAgPGxpPklmIHRoZSByZXF1ZXN0ZWQgcmVzb3VyY2UgaXMgYSBkaXJlY3Rvcnk6CisgICAgICAgIDx1bD4KKyAgICAgICAgPGxpPklmIGRpcmVjdG9yeSBsaXN0aW5ncyBhcmUgc3VwcHJlc3NlZCwgcmV0dXJuIEhUVFAgc3RhdHVzIDQwNAorICAgICAgICAgICAgKG5vdCBmb3VuZCkuPC9saT4KKyAgICAgICAgPGxpPlNldCB0aGUgY29udGVudCB0eXBlIHRvIDxjb2RlPnRleHQvaHRtbDwvY29kZT4uPC9saT4KKyAgICAgICAgPC91bD48L2xpPgorICAgIDxsaT5EZXRlcm1pbmUgdGhlIHJhbmdlKHMpIHRvIGJlIHJldHVybmVkLCBiYXNlZCBvbiB0aGUgZXhpc3RlbmNlIG9mCisgICAgICAgIGFueSA8Y29kZT5JZi1SYW5nZTwvY29kZT4gYW5kIDxjb2RlPlJhbmdlPC9jb2RlPiBoZWFkZXJzLjwvbGk+CisgICAgPGxpPklmIHRoZSByZXF1ZXN0ZWQgcmVzb3VyY2UgaXMgYSBkaXJlY3RvcnksIGluY2x1ZGUgYW4gPGNvZGU+RVRhZzwvY29kZT4KKyAgICAgICAgaGVhZGVyIGluIHRoZSByZXNwb25zZSwgd2l0aCB0aGUgdmFsdWUgY2FsY3VsYXRlZCBiYXNlZCBvbiB0aGUgY29udGVudAorICAgICAgICBvZiB0aGUgZGlyZWN0b3J5LjwvbGk+CisgICAgPGxpPkluY2x1ZGUgYSA8Y29kZT5MYXN0LU1vZGlmaWVkPC9jb2RlPiBoZWFkZXIgaW4gdGhlIHJlc3BvbnNlIGRvY3VtZW50aW5nCisgICAgICAgIHRoZSBkYXRlL3RpbWUgdGhhdCB0aGUgcmVzb3VyY2Ugd2FzIGxhc3QgbW9kaWZpZWQuPC9saT4KKyAgICA8bGk+VW5sZXNzIHdlIGFyZSBwcm9jZXNzaW5nIGEgSEVBRCByZXF1ZXN0LCBpbmNsdWRlIHRoZSBhcHByb3ByaWF0ZQorICAgICAgICBjb250ZW50IChvciBjb250ZW50IHJhbmdlcykgaW4gdGhlIHJlc3BvbnNlLjwvbGk+CisgICAgPC91bD4KKworICAgIDxwPk9uIGVhY2ggSFRUUCBIRUFEIHJlcXVlc3QgcHJvY2Vzc2VkIGJ5IHRoaXMgc2VydmxldCwgdGhlIGZvbGxvd2luZworICAgIHByb2Nlc3Npbmcgc2hhbGwgYmUgcGVyZm9ybWVkOjwvcD4KKyAgICA8dWw+CisgICAgPGxpPlByb2Nlc3NlZCBpZGVudGljYWxseSB0byBhbiBIVFRQIEdFVCByZXF1ZXN0LCBleGNlcHQgdGhhdCB0aGUgZGF0YQorICAgICAgICBjb250ZW50IGlzIG5vdCB0cmFuc21pdHRlZCBhZnRlciB0aGUgaGVhZGVycy48L2xpPgorICAgIDwvdWw+CisKKyAgICA8cD5PbiBlYWNoIEhUVFAgUE9TVCByZXF1ZXN0IHByb2Nlc3NlZCBieSB0aGlzIHNlcnZsZXQsIHRoZSBmb2xsb3dpbmcKKyAgICBwcm9jZXNzaW5nIHNoYWxsIGJlIHBlcmZvcm1lZDo8L3A+CisgICAgPHVsPgorICAgIDxsaT5Qcm9jZXNzZWQgaWRlbnRpY2FsbHkgdG8gYW4gSFRUUCBHRVQgcmVxdWVzdC48L2xpPgorICAgIDwvdWw+CisKKworICAgIDxwPk9uIGVhY2ggSFRUUCBQVVQgcmVxdWVzdCBwcm9jZXNzZWQgYnkgdGhpcyBzZXJ2bGV0LCB0aGUgZm9sbG93aW5nCisgICAgcHJvY2Vzc2luZyBzaGFsbCBiZSBwZXJmb21yZWQ6PC9wPgorICAgIDx1bD4KKyAgICA8bGk+SWYgbW9kaWZpY2F0aW9ucyB0byB0aGUgc3RhdGljIHJlc291cmNlcyBhcmUgbm90IGFsbG93ZWQgKHNldCBieSBhCisgICAgICAgIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyKSwgcmV0dXJuIEhUVFAgc3RhdHVzIDQwMyAoZm9yYmlkZGVuKS48L2xpPgorICAgIDxsaT5JZiBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gZGVsZXRlIGEgcmVzb3VyY2UgZnJvbSA8Y29kZT4vTUVUQS1JTkY8L2NvZGU+CisgICAgICAgIG9yIDxjb2RlPi9XRUItSU5GPC9jb2RlPiwgcmV0dXJuIEhUVFAgc3RhdHVzIDQwMyAoZm9yYmlkZGVuKS48L2xpPgorICAgIDxsaT5DcmVhdGUgYSBuZXcgcmVzb3VyY2UgZnJvbSB0aGUgYm9keSBvZiB0aGlzIHJlcXVlc3QuPC9saT4KKyAgICA8bGk+QmluZCBvciByZWJpbmQgdGhlIHNwZWNpZmllZCBwYXRoIHRvIHRoZSBuZXcgcmVzb3VyY2UgKGRlcGVuZGluZyBvbgorICAgICAgICB3aGV0aGVyIGl0IGN1cnJlbnRseSBleGlzdHMgb3Igbm90KS4gIFJldHVybiBIVFRQIHN0YXR1cyBhcyBmb2xsb3dzOgorICAgICAgICA8dWw+CisgICAgICAgIDxsaT5JZiBiaW5kaW5nIHdhcyB1bnN1Y2Nlc3NmdWwsIHJldHVybiBIVFRQIHN0YXR1cyA0MDkgKGNvbmZsaWN0KS4KKyAgICAgICAgICAgIDwvbGk+CisgICAgICAgIDxsaT5JZiBiaW5kaW5nIHdhcyBzdWNjZXNzZnVsIGFuZCB0aGUgcmVzb3VyY2UgZGlkIG5vdCBwcmV2aW91c2x5CisgICAgICAgICAgICBleGlzdCwgcmV0dXJuIEhUVFAgc3RhdHVzIDIwMSAoY3JlYXRlZCkuPC9saT4KKyAgICAgICAgPGxpPklmIGJpbmRpbmcgd2FzIHN1Y2Nlc3NmdWwgYW5kIHRoZSByZXNvdXJjZSBwcmV2aW91c2x5IGV4aXN0ZWQsCisgICAgICAgICAgICByZXR1cm4gSFRUUCBzdGF0dXMgMjA0IChubyBjb250ZW50KS48L2xpPgorICAgICAgICA8L3VsPjwvbGk+CisgICAgPC91bD4KKworICA8L3N1YnNlY3Rpb24+CisKKworICA8c3Vic2VjdGlvbiBuYW1lPSJGaW5hbGl6YXRpb24gRnVuY3Rpb25hbGl0eSI+CisKKyAgICA8cD5ObyBzcGVjaWZpYyBwcm9jZXNzaW5nIGlzIHJlcXVpcmVkIHdoZW4gdGhlIDxjb2RlPmRlc3Ryb3koKTwvY29kZT4KKyAgICBtZXRob2QgaXMgY2FsbGVkOjwvcD4KKworICA8L3N1YnNlY3Rpb24+CisKKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IlRlc3RhYmxlIEFzc2VydGlvbnMiPgorCisgIDxwPkluIGFkZGl0aW9uIHRoZSB0aGUgYXNzZXJ0aW9ucyBpbXBsaWVkIGJ5IHRoZSBmdW5jdGlvbmFsaXR5IHJlcXVpcmVtZW50cworICBsaXN0ZWQgYWJvdmUsIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBhc3NlcnRpb25zIHNoYWxsIGJlIHRlc3RlZCB0bworICB2YWxpZGF0ZSB0aGUgYmVoYXZpb3Igb2YgdGhlIGludm9rZXIgc2VydmxldDo8L3A+CisgIDx1bD4KKyAgPGxpPlJlcXVlc3RzIGZvciByZXNvdXJjZXMgdGhhdCBkbyBub3QgZXhpc3QgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbiBtdXN0CisgICAgICByZXR1cm4gSFRUUCBzdGF0dXMgNDA0IChub3QgZm91bmQpLjwvbGk+CisgIDxsaT5UaGUgZGVmYXVsdCBzZXJ2bGV0IG11c3Qgb3BlcmF0ZSBpZGVudGljYWxseSBmb3Igd2ViIGFwcGxpY2F0aW9ucyB0aGF0CisgICAgICBhcmUgcnVuIG91dCBvZiBhIFdBUiBmaWxlIGRpcmVjdGx5LCBvciBmcm9tIGFuIHVucGFja2VkIGRpcmVjdG9yeQorICAgICAgc3RydWN0dXJlLjwvbGk+CisgIDxsaT5JZiB0aGUgd2ViIGFwcGxpY2F0aW9uIGlzIHJ1bm5pbmcgb3V0IG9mIGFuIHVucGFja2VkIGRpcmVjdG9yeQorICAgICAgc3RydWN0dXJlLCB0aGUgZGVmYXVsdCBzZXJ2bGV0IG11c3QgcmVjb2duaXplIGNhc2VzIHdoZXJlIHRoZSByZXNvdXJjZQorICAgICAgaGFzIGJlZW4gdXBkYXRlZCB0aHJvdWdoIGV4dGVybmFsIG1lYW5zLjwvbGk+CisgIDwvdWw+CisKKzwvc2VjdGlvbj4KKworCis8L2JvZHk+CisKKzwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9kb2NzL2Z1bmNzcGVjcy9mcy1pbnZva2VyLnhtbCBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvZnVuY3NwZWNzL2ZzLWludm9rZXIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhMjc0MDcKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2Z1bmNzcGVjcy9mcy1pbnZva2VyLnhtbApAQCAtMCwwICsxLDI0NyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IURPQ1RZUEUgZG9jdW1lbnQgWworICA8IUVOVElUWSBwcm9qZWN0IFNZU1RFTSAicHJvamVjdC54bWwiPgorXT4KKzxkb2N1bWVudCB1cmw9ImZzLWludm9rZXIuaHRtbCI+CisKKyAgJnByb2plY3Q7CisKKyAgPHByb3BlcnRpZXM+CisgICAgPGF1dGhvciBlbWFpbD0iY3JhaWdtY2NAYXBhY2hlLm9yZyI+Q3JhaWcgTWNDbGFuYWhhbjwvYXV0aG9yPgorICAgIDx0aXRsZT5JbnZva2VyIFNlcnZsZXQ8L3RpdGxlPgorICAgIDxyZXZpc2lvbj4kSWQkPC9yZXZpc2lvbj4KKyAgPC9wcm9wZXJ0aWVzPgorCis8Ym9keT4KKworCis8c2VjdGlvbiBuYW1lPSJPdmVydmlldyI+CisKKworICA8c3Vic2VjdGlvbiBuYW1lPSJJbnRyb2R1Y3Rpb24iPgorCisgICAgPHA+VGhlIHB1cnBvc2Ugb2YgdGhlIDxzdHJvbmc+SW52b2tlciBTZXJ2bGV0PC9zdHJvbmc+IGlzIHRvIGFsbG93IGEKKyAgICB3ZWIgYXBwbGljYXRpb24gdG8gZHluYW1pY2FsbHkgcmVnaXN0ZXIgbmV3IDxlbT5zZXJ2bGV0IGRlZmluaXRpb25zPC9lbT4KKyAgICB0aGF0IGNvcnJlc3BvbmQgd2l0aCBhIDxjb2RlPiZsdDtzZXJ2bGV0Jmd0OzwvY29kZT4gZWxlbWVudCBpbiB0aGUKKyAgICA8Y29kZT4vV0VCLUlORi93ZWIueG1sPC9jb2RlPiBkZXBsb3ltZW50IGRlc2NyaXB0b3IsIGFuZCBleGVjdXRlCisgICAgcmVxdWVzdHMgdXRpbGl6aW5nIHRoZSBuZXcgc2VydmxldCBkZWZpbml0aW9ucy4gIEZyb20gdGhlIHBlcnNwZWN0aXZlCisgICAgb2YgdGhlIG5ld2x5IHJlZ2lzdGVyZWQgc2VydmxldHMsIGFsbCBzZXJ2bGV0IGxpZmVjeWNsZSByZXF1aXJlbWVudHMKKyAgICBvZiB0aGUgU2VydmxldCBTcGVjaWZpY2F0aW9uIChzdWNoIGFzIGNhbGxpbmcgPGNvZGU+aW5pdCgpPC9jb2RlPiBhbmQKKyAgICA8Y29kZT5kZXN0cm95KCk8L2NvZGU+IGF0IHRoZSBjb3JyZWN0IHRpbWVzKSB3aWxsIGJlIHJlc3BlY3RlZC48L3A+CisKKyAgPC9zdWJzZWN0aW9uPgorCisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iRXh0ZXJuYWwgU3BlY2lmaWNhdGlvbnMiPgorCisgICAgPHA+SSBkbyBub3Qga25vdyBvZiBhbnkgZm9ybWFsIHNwZWNpZmljYXRpb24gb2YgdGhlIGJlaGF2aW9yIG9mIGFuCisgICAgaW52b2tlciBzZXJ2bGV0IHRoYXQgaXMgcHVibGljbHkgYXZhaWxhYmxlLiAgQW55b25lIGtub3cgb2Ygb25lPzwvcD4KKworICA8L3N1YnNlY3Rpb24+CisKKworICA8c3Vic2VjdGlvbiBuYW1lPSJJbXBsZW1lbnRhdGlvbiBSZXF1aXJlbWVudHMiPgorCisgICAgPHA+VGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnVuY3Rpb25hbGl0eSBzaGFsbCBjb25mb3JtIHRvIHRoZQorICAgIGZvbGxvd2luZyByZXF1aXJlbWVudHM6PC9wPgorICAgIDx1bD4KKyAgICA8bGk+SW1wbGVtZW50ZWQgYXMgYSBzZXJ2bGV0LjwvbGk+CisgICAgPGxpPkV4aXN0IGluIHRoZSA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLnNlcnZsZXRzPC9jb2RlPiBwYWNrYWdlCisgICAgICAgIHNvIHRoYXQgaXQgY2FuIGJlIGxvYWRlZCBieSB0aGUgQ2F0YWxpbmEgY2xhc3MgbG9hZGVyLjwvbGk+CisgICAgPGxpPkltcGxlbWVudCB0aGUgPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5Db250YWluZXJTZXJ2bGV0PC9jb2RlPgorICAgICAgICBpbnRlcmZhY2UsIHNvIHRoYXQgaXQgZ2FpbnMga25vd2xlZGdlIG9mIHRoZSA8Y29kZT5XcmFwcGVyPC9jb2RlPgorICAgICAgICB0aGF0IGlzIHJlc3BvbnNpYmxlIGZvciBpdHNlbGYgYW5kLCB0aGVyZWZvcmUsIGFjY2VzcyB0byBvdGhlcgorICAgICAgICBpbnRlcm5hbCBDYXRhbGluYSBjb21wb25lbnRzLjwvbGk+CisgICAgPGxpPlN1cHBvcnQgYSBjb25maWd1cmFibGUgZGVidWdnaW5nIGRldGFpbCBsZXZlbC48L2xpPgorICAgIDxsaT5Mb2cgZGVidWdnaW5nIGFuZCBvcGVyYXRpb25hbCBtZXNzYWdlcyAoc3VpdGFibHkgaW50ZXJuYXRpb25hbGl6ZWQpCisgICAgICAgIHZpYSB0aGUgPGNvZGU+Z2V0U2VydmxldENvbnRleHQoKS5sb2coKTwvY29kZT4gbWV0aG9kLjwvbGk+CisgICAgPC91bD4KKworICA8L3N1YnNlY3Rpb24+CisKKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IkRlcGVuZGVuY2llcyI+CisKKworICA8c3Vic2VjdGlvbiBuYW1lPSJFbnZpcm9ubWVudGFsIERlcGVuZGVuY2llcyI+CisKKyAgICA8cD5UaGUgZm9sbG93aW5nIGVudmlyb25tZW50YWwgZGVwZW5kZW5jaWVzIG11c3QgYmUgbWV0IGluIG9yZGVyIGZvcgorICAgIHRoZSBJbnZva2VyIHNlcnZsZXQgdG8gb3BlcmF0ZSBjb3JyZWN0bHk6PC9wPgorICAgIDx1bD4KKyAgICA8bGk+VGhlIGludm9rZXIgc2VydmxldCBtdXN0IGJlIHJlZ2lzdGVyZWQgaW4gdGhlIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQKKyAgICAgICAgZGVzY3JpcHRvciAob3IgdGhlIGRlZmF1bHQgZGVwbG95bWVudCBkZXNjcmlwdG9yIGluIGZpbGUKKyAgICAgICAgPGNvZGU+JENBVEFMSU5BX0hPTUUvY29uZi93ZWIueG1sPC9jb2RlPikgdXNpbmcgYSAicGF0aCBtYXBwZWQiCisgICAgICAgIHNlcnZsZXQgbWFwcGluZy4gIFRoZSBoaXN0b3JpY2FsIGRlZmF1bHQgbWFwcGluZyBpcyB0byBVUkwgcGF0dGVybgorICAgICAgICAiPGNvZGU+L3NlcnZsZXQvKjwvY29kZT4iLCBhbHRob3VnaCB0aGUgaW52b2tlciBzZXJ2bGV0IG11c3Qgb3BlcmF0ZQorICAgICAgICBjb3JyZWN0bHkgd2l0aCBhbiBhcmJpdHJhcnkgbWFwcGluZy48L2xpPgorICAgIDwvdWw+CisKKyAgPC9zdWJzZWN0aW9uPgorCisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iQ29udGFpbmVyIERlcGVuZGVuY2llcyI+CisKKyAgICA8cD5Db3JyZWN0IG9wZXJhdGlvbiBvZiB0aGUgaW52b2tlciBzZXJ2bGV0IGRlcGVuZHMgb24gdGhlIGZvbGxvd2luZworICAgIHNwZWNpZmljIGZlYXR1cmVzIG9mIHRoZSBzdXJyb3VuZGluZyBjb250YWluZXI6PC9wPgorICAgIDx1bD4KKyAgICA8bGk+Q29ycmVjdCBzdXBwb3J0IGZvciB0aGUgPGNvZGU+Q29udGFpbmVyU2VydmxldDwvY29kZT4gaW50ZXJmYWNlLAorICAgICAgICBpbmNsdWRpbmcgY2FsbGluZyA8Y29kZT5zZXRXcmFwcGVyKCk8L2NvZGU+IDxzdHJvbmc+YmVmb3JlPC9zdHJvbmc+CisgICAgICAgIHRoZSA8Y29kZT5pbml0KCk8L2NvZGU+IG1ldGhvZCBvZiB0aGUgaW52b2tlciBzZXJ2bGV0IGlzIGNhbGxlZC48L2xpPgorICAgIDxsaT5UaGUgd2ViIGFwcGxpY2F0aW9uIGNsYXNzIGxvYWRlciBtdXN0IGJlIHN0b3JlZCBhcyB0aGUgY29udGV4dAorICAgICAgICBjbGFzcyBsb2FkZXIgb2YgdGhlIHJlcXVlc3QgcHJvY2Vzc2luZyB0aHJlYWQuPC9saT4KKyAgICA8L3VsPgorCisgIDwvc3Vic2VjdGlvbj4KKworCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iRnVuY3Rpb25hbGl0eSI+CisKKworICA8c3Vic2VjdGlvbiBuYW1lPSJJbml0aWFsaXphdGlvbiBGdW5jdGlvbmFsaXR5Ij4KKworICAgIDxwPlRoZSBmb2xsb3dpbmcgcHJvY2Vzc2luZyBtdXN0IGJlIHBlcmZvcm1lZCB3aGVuIHRoZSA8Y29kZT5pbml0KCk8L2NvZGU+CisgICAgbWV0aG9kIG9mIHRoZSBpbnZva2VyIHNlcnZsZXQgaXMgY2FsbGVkOjwvcD4KKyAgICA8dWw+CisgICAgPGxpPkVuc3VyZSB0aGF0IHRoZSBjb250YWluZXIgaGFzIGNhbGxlZCA8Y29kZT5zZXRXcmFwcGVyKCk8L2NvZGU+LiAgSWYKKyAgICAgICAgbm90LCB0aHJvdyBhIHBlcm1hbmVudCA8Y29kZT5VbmF2YWlsYWJsZUV4Y2VwdGlvbjwvY29kZT4uPC9saT4KKyAgICA8bGk+TG9vayB1cCBhbmQgY2FjaGUgdGhlIDxjb2RlPkNvbnRleHQ8L2NvZGU+IHRoYXQgY29ycmVzcG9uZHMgdG8gb3VyCisgICAgICAgIDxjb2RlPldyYXBwZXI8L2NvZGU+LiAgVGhpcyBpcyB0aGUgY29tcG9uZW50IHdpdGggd2hpY2ggbmV3IHNlcnZsZXQKKyAgICAgICAgZGVmaW5pdGlvbnMgYW5kIG1hcHBpbmdzIHdpbGwgYmUgcmVnaXN0ZXJlZC48L2xpPgorICAgIDwvdWw+CisKKyAgPC9zdWJzZWN0aW9uPgorCisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iUGVyLVJlcXVlc3QgRnVuY3Rpb25hbGl0eSI+CisKKyAgICA8cD5PbiBlYWNoIHJlcXVlc3QsIHRoZSBmb2xsb3dpbmcgcHJvY2Vzc2luZyBzaGFsbCBiZSBwZXJmb3JtZWQ6PC9wPgorICAgIDxvbD4KKyAgICA8bGk+Q2FsY3VsYXRlIHRoZSA8Y29kZT57U2VydmxldFBhdGh9PC9jb2RlPiBmb3IgdGhpcyByZXF1ZXN0LCBlaXRoZXIgZnJvbQorICAgICAgICByZXF1ZXN0IGF0dHJpYnV0ZSA8Y29kZT5qYXZheC5zZXJ2bGV0LmluY2x1ZGUuc2VydmxldF9wYXRoPC9jb2RlPiBvcgorICAgICAgICBieSBjYWxsaW5nIDxjb2RlPnJlcXVlc3QuZ2V0U2VydmxldFBhdGgoKTwvY29kZT4uPC9saT4KKyAgICA8bGk+Q2FsY3VsYXRlIHRoZSA8Y29kZT57UGF0aEluZm99PC9jb2RlPiBmb3IgdGhpcyByZXF1ZXN0LCBlaXRoZXIgZnJvbQorICAgICAgICByZXF1ZXN0IGF0dHJpYnV0ZSA8Y29kZT5qYXZheC5zZXJ2bGV0LmluY2x1ZGUucGF0aF9pbmZvPC9jb2RlPiBvcgorICAgICAgICBieSBjYWxsaW5nIDxjb2RlPnJlcXVlc3QuZ2V0UGF0aEluZm8oKTwvY29kZT4uICBJZiB0aGUgY2FsY3VsYXRlZAorICAgICAgICA8Y29kZT57UGF0aEluZm99PC9jb2RlPiBpcyBudWxsLCByZXR1cm4gSFRUUCBzdGF0dXMgNDAwCisgICAgICAgIChiYWQgcmVxdWVzdCkuPC9saT4KKyAgICA8bGk+UGFyc2UgdGhlIGNhbGN1bGF0ZWQgPGNvZGU+e1BhdGhJbmZvfTwvY29kZT4gdmFsdWUgYXMgZm9sbG93czoKKyAgICAgICAgPG9sPgorICAgICAgICA8bGk+SWdub3JlIHRoZSBsZWFkaW5nIHNsYXNoIGNoYXJhY3Rlci48L2xpPgorICAgICAgICA8bGk+QWNjdW11bGF0ZSBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBuZXh0ICcvJyAoaWYgYW55KSBhcyB0aGUKKyAgICAgICAgICAgIDxjb2RlPntTZXJ2bGV0U2VsZWN0b3J9PC9jb2RlPi48L2xpPgorICAgICAgICA8bGk+SWYgYSAnLycgd2FzIGVuY291bnRlcmVkLCBhY2N1bXVsYXRlIGFsbCBjaGFyYWN0ZXJzIGZyb20gdGhhdAorICAgICAgICAgICAgc2xhc2ggKGluY2x1c2l2ZSkgdG8gdGhlIGVuZCBvZiB0aGUgc3RyaW5nIGFzCisgICAgICAgICAgICA8Y29kZT57UGF0aFJlbWFpbmRlcn08L2NvZGU+LiAgSWYgbm8gc2xhc2ggd2FzIGVuY291bnRlcmVkLAorICAgICAgICAgICAgc2V0IDxjb2RlPntQYXRoUmVtYWluZGVyfTwvY29kZT4gdG8gYSB6ZXJvLWxlbmd0aCBzdHJpbmcuPC9saT4KKyAgICAgICAgPC9vbD48L2xpPgorICAgIDxsaT5EZXRlcm1pbmUgd2hldGhlciA8Y29kZT57U2VydmxldFNlbGVjdG9yfTwvY29kZT4gaXMgdGhlIG5hbWUgb2YgYW4KKyAgICAgICAgZXhpc3Rpbmcgc2VydmxldCBkZWZpbml0aW9uLCBhbmQgcHJvY2VzcyBpdCBhcyBmb2xsb3dzOgorICAgICAgICA8b2w+CisgICAgICAgIDxsaT5Bc2sgb3VyIGFzc29jaWF0ZWQgPGNvZGU+Q29udGV4dDwvY29kZT4gdG8gZmluZCBhbmQgcmV0dXJuIGEKKyAgICAgICAgICAgIGNoaWxkIDxjb2RlPldyYXBwZXI8L2NvZGU+IG5hbWVkIDxjb2RlPntTZXJ2bGV0U2VsZWN0b3J9PC9jb2RlPi4KKyAgICAgICAgICAgIDwvbGk+CisgICAgICAgIDxsaT5JZiB0aGVyZSBpcyBubyBzdWNoIGNoaWxkLCBza2lwIHRvIHRoZSBuZXh0IG1ham9yIHN0ZXAuPC9saT4KKyAgICAgICAgPGxpPlJlZ2lzdGVyIGEgbmV3IHNlcnZsZXQgbWFwcGluZyBmb3IgdGhpcyA8Y29kZT5XcmFwcGVyPC9jb2RlPiwKKyAgICAgICAgICAgIHVzaW5nIGEgVVJMIHBhdHRlcm4gY2FsY3VsYXRlZCBhcyBmb2xsb3dzOgorICAgICAgICAgICAgPGNvZGU+e1NlcnZsZXRQYXRofTwvY29kZT4gKyAiLyIgKyA8Y29kZT57U2VydmxldFNlbGVjdG9yfTwvY29kZT4KKyAgICAgICAgICAgICsgIi8qIjwvbGk+CisgICAgICAgIDxsaT5DcmVhdGUgYSByZXF1ZXN0IGRpc3BhdGNoZXIgdXNpbmcgYSBwYXRoIGNhbGN1bGF0ZWQgYXMgZm9sbG93czoKKyAgICAgICAgICAgIDxjb2RlPntTZXJ2bGV0UGF0aH08L2NvZGU+ICsgIi8iICsgPGNvZGU+e1NlcnZsZXRTZWxlY3Rvcn08L2NvZGU+CisgICAgICAgICAgICArIDxjb2RlPntQYXRoUmVtYWluZGVyfTwvY29kZT48L2xpPgorICAgICAgICA8bGk+Rm9yd2FyZCB0aGlzIHJlcXVlc3QgdG8gdGhlIGNyZWF0ZWQgcmVxdWVzdCBkaXNwYXRjaGVyLCBhbmQKKyAgICAgICAgICAgIGV4aXQgZnJvbSB0aGlzIHJlcXVlc3QuPC9saT4KKyAgICAgICAgPC9vbD48L2xpPgorICAgIDxsaT5Bc3N1bWUgdGhhdCA8Y29kZT57U2VydmxldFNlbGVjdG9yfTwvY29kZT4gaXMgdGhlIGZ1bGx5IHF1YWxpZmllZAorICAgICAgICBuYW1lIG9mIGEgSmF2YSBjbGFzcyB0aGF0IGltcGxlbWVudHMgPGNvZGU+amF2YXguc2VydmxldC5TZXJ2bGV0PC9jb2RlPgorICAgICAgICBhbmQgcHJvY2VzcyBpdCBhcyBmb2xsb3dzOgorICAgICAgICA8b2w+CisgICAgICAgIDxsaT5TeW50aGVzaXplIGEgbmV3IDxjb2RlPntTZXJ2bGV0TmFtZX08L2NvZGU+IGZvciB0aGUgc2VydmxldAorICAgICAgICAgICAgZGVmaW5pdGlvbiB0aGF0IHdpbGwgYmUgY3JlYXRlZC48L2xpPgorICAgICAgICA8bGk+SWYgdGhlcmUgaXMgYWxyZWFkeSBhIGNoaWxkIDxjb2RlPldyYXBwZXI8L2NvZGU+IGFzc29jaWF0ZWQgd2l0aAorICAgICAgICAgICAgdGhpcyBuYW1lLCByZXR1cm4gSFRUUCBzdGF0dXMgNTAwIChpbnRlcm5hbCBzZXJ2ZXIgZXJyb3IpLCBiZWNhdXNlCisgICAgICAgICAgICBhIG1hcHBpbmcgc2hvdWxkIGhhdmUgYWxyZWFkeSBiZWVuIGNyZWF0ZWQgZm9yIHRoaXMgc2VydmxldC48L2xpPgorICAgICAgICA8bGk+QXR0ZW1wdCB0byBsb2FkIGEgY2xhc3MgbmFtZWQgPGNvZGU+e1NlcnZsZXRTZWxlY3Rvcn08L2NvZGU+IGZyb20KKyAgICAgICAgICAgIHRoZSB3ZWIgYXBwbGljYXRpb24gY2xhc3MgbG9hZGVyIChpLmUuIHRoZSBjb250ZXh0IGNsYXNzIGxvYWRlcgorICAgICAgICAgICAgZm9yIG91ciBjdXJyZW50IHRocmVhZCkuICBJZiB0aGlzIGZhaWxzLCByZXR1cm4gSFRUUCBzdGF0dXMgNDA0CisgICAgICAgICAgICAobm90IGZvdW5kKS48L2xpPgorICAgICAgICA8bGk+SW5zdGFudGlhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4gIElmIGFuIGVycm9yIG9jY3VycywKKyAgICAgICAgICAgIHJldHVybiBIVFRQIHN0YXR1cyA0MDQgKG5vdCBmb3VuZCkuPC9saT4KKyAgICAgICAgPGxpPklmIHRoaXMgY2xhc3MgZG9lcyBub3QgaW1wbGVtZW50IHRoZQorICAgICAgICAgICAgPGNvZGU+amF2YXguc2VydmxldC5TZXJ2bGV0PC9jb2RlPiBpbnRlcmZhY2UsIHJldHVybiBIVFRQIHN0YXR1cworICAgICAgICAgICAgNDA0IChub3QgZm91bmQpLjwvbGk+CisgICAgICAgIDxsaT5DcmVhdGUgYW5kIHJlZ2lzdGVyIGEgbmV3IDxjb2RlPldyYXBwZXI8L2NvZGU+IGNoaWxkIHdpdGggb3VyCisgICAgICAgICAgICA8Y29kZT5Db250ZXh0PC9jb2RlPiwgdW5kZXIgbmFtZSA8Y29kZT57U2VydmxldE5hbWV9PC9jb2RlPi48L2xpPgorICAgICAgICA8bGk+UmVnaXN0ZXIgYSBuZXcgc2VydmxldCBtYXBwaW5nIGZvciB0aGlzIDxjb2RlPldyYXBwZXI8L2NvZGU+LAorICAgICAgICAgICAgdXNpbmcgYSBVUkwgcGF0dGVybiBjYWxjdWxhdGVkIGFzIGZvbGxvd3M6CisgICAgICAgICAgICA8Y29kZT57U2VydmxldFBhdGh9PC9jb2RlPiArICIvIiArIDxjb2RlPntTZXJ2bGV0U2VsZWN0b3J9PC9jb2RlPgorICAgICAgICAgICAgKyAiLyoiPC9saT4KKyAgICAgICAgPGxpPkNyZWF0ZSBhIHJlcXVlc3QgZGlzcGF0Y2hlciB1c2luZyBhIHBhdGggY2FsY3VsYXRlZCBhcyBmb2xsb3dzOgorICAgICAgICAgICAgPGNvZGU+e1NlcnZsZXRQYXRofTwvY29kZT4gKyAiLyIgKyA8Y29kZT57U2VydmxldFNlbGVjdG9yfTwvY29kZT4KKyAgICAgICAgICAgICsgPGNvZGU+e1BhdGhSZW1haW5kZXJ9PC9jb2RlPjwvbGk+CisgICAgICAgIDxsaT5Gb3J3YXJkIHRoaXMgcmVxdWVzdCB0byB0aGUgY3JlYXRlZCByZXF1ZXN0IGRpc3BhdGNoZXIsIGFuZAorICAgICAgICAgICAgZXhpdCBmcm9tIHRoaXMgcmVxdWVzdC48L2xpPgorICAgICAgICA8L29sPjwvbGk+CisgICAgPC9vbD4KKworICA8L3N1YnNlY3Rpb24+CisKKworICA8c3Vic2VjdGlvbiBuYW1lPSJGaW5hbGl6YXRpb24gRnVuY3Rpb25hbGl0eSI+CisKKyAgICA8cD5ObyBzcGVjaWZpYyBwcm9jZXNzaW5nIGlzIHJlcXVpcmVkIHdoZW4gdGhlIDxjb2RlPmRlc3Ryb3koKTwvY29kZT4KKyAgICBtZXRob2QgaXMgY2FsbGVkOjwvcD4KKworICA8L3N1YnNlY3Rpb24+CisKKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IlRlc3RhYmxlIEFzc2VydGlvbnMiPgorCisgIDxwPkluIGFkZGl0aW9uIHRoZSB0aGUgYXNzZXJ0aW9ucyBpbXBsaWVkIGJ5IHRoZSBmdW5jdGlvbmFsaXR5IHJlcXVpcmVtZW50cworICBsaXN0ZWQgYWJvdmUsIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBhc3NlcnRpb25zIHNoYWxsIGJlIHRlc3RlZCB0bworICB2YWxpZGF0ZSB0aGUgYmVoYXZpb3Igb2YgdGhlIGludm9rZXIgc2VydmxldDo8L3A+CisgIDx1bD4KKyAgPGxpPkl0IGlzIHBvc3NpYmxlIHRvIGFjY2VzcyBhbiBleGlzdGluZyBzZXJ2bGV0IGRlZmluaXRpb24gYnkgbmFtZQorICAgICAgdGhyb3VnaCB0aGUgaW52b2tlci4gIFRoZSBleGlzdGluZyBzZXJ2bGV0IGRlZmluaXRpb24gY2FuIGluY2x1ZGUKKyAgICAgIGVpdGhlciBhIDxjb2RlPiZsdDtzZXJ2bGV0LWNsYXNzJmd0OzwvY29kZT4gb3IKKyAgICAgIDxjb2RlPiZsdDtqc3AtZmlsZSZndDs8L2NvZGU+IHN1YmVsZW1lbnQuPC9saT4KKyAgPGxpPldoZW4gYW4gZXhpc3Rpbmcgc2VydmxldCBkZWZpbml0aW9uIGlzIGFjY2Vzc2VkIGJ5IG5hbWUsIHRoZSByZXF1ZXN0CisgICAgICB3aWxsIGJlIHVsdGltYXRlbHkgcHJvY2Vzc2VkIGJ5IHRoZSBzYW1lIHNlcnZsZXQgaW5zdGFuY2UgdGhhdCB3b3VsZAorICAgICAgaGF2ZSBwcm9jZXNzZWQgaXQgaGFkIGEgbWFwcGluZyB0byB0aGF0IHNlcnZsZXQgZGVmaW5pdGlvbiBiZWVuIHVzZWQKKyAgICAgIG9uIHRoZSByZXF1ZXN0IGRpcmVjdGx5LjwvbGk+CisgIDxsaT5JdCBpcyBwb3NzaWJsZSB0byBhY2Nlc3MgYW4gYW5vbnltb3VzIHNlcnZsZXQgYnkgY2xhc3MgbmFtZQorICAgICAgdGhyb3VnaCB0aGUgaW52b2tlci48L2xpPgorICA8bGk+V2hlbiBhbiBhbm9ueW1vdXMgc2VydmxldCBpcyBhY2Nlc3NlZCwgdGhlIHNlcnZsZXQgaW5zdGFuY2UgaXMgcHJvY2Vzc2VkCisgICAgICBhY2NvcmRpbmcgdG8gdGhlIGxpZmVjeWNsZSByZXF1aXJlbWVudHMgb2YgdGhlIFNlcnZsZXQgU3BlY2lmaWNhdGlvbi4KKyAgICAgIDwvbGk+CisgIDxsaT5XaGVuIGFuIGFub255bW91cyBzZXJ2bGV0IGlzIGFjY2Vzc2VkLCB0aGUgc2VydmxldCBpbnN0YW5jZSByZWNlaXZlcworICAgICAgYSA8Y29kZT5TZXJ2bGV0Q29uZmlnPC9jb2RlPiBpbnN0YW5jZSB3aXRoIG5vIHNlcnZsZXQgaW5pdGlhbGl6YXRpb24KKyAgICAgIHBhcmFtZXRlcnMuPC9saT4KKyAgPGxpPkl0IGlzIHBvc3NpYmxlIHRvIHV0aWxpemUgdGhlIGludm9rZXIgc2VydmxldCB2aWEgYSBkaXJlY3QgcmVxdWVzdC48L2xpPgorICA8bGk+SXQgaXMgcG9zc2libGUgdG8gdXRpbGl6ZSB0aGUgaW52b2tlciBzZXJ2bGV0IHZpYSBhIGNhbGwgdG8KKyAgICAgIDxjb2RlPlJlcXVlc3REaXNwYXRjaGVyLmZvcndhcmQoKTwvY29kZT4sIG9yIHRoZSBjb3JyZXNwb25kaW5nCisgICAgICA8Y29kZT4mbHQ7anNwOmZvcndhcmQmZ3Q7PC9jb2RlPiB0YWcgaW4gYSBKU1AgcGFnZS48L2xpPgorICA8bGk+SXQgaXMgcG9zc2libGUgdG8gdXRpbGl6ZSB0aGUgaW52b2tlciBzZXJ2bGV0IHZpYSBhIGNhbGwgdG8KKyAgICAgIDxjb2RlPlJlcXVlc3REaXNwYXRjaGVyLmluY2x1ZGUoKTwvY29kZT4sIG9yIHRoZSBjb3JyZXNwb25kaW5nCisgICAgICA8Y29kZT4mbHQ7anNwOmluY2x1ZGUmZ3Q7PC9jb2RlPiB0YWcgaW4gYSBKU1AgcGFnZS48L2xpPgorICA8bGk+SXQgaXMgcG9zc2libGUgdG8gdXNlIGFueSBIVFRQIG1ldGhvZCAoaW5jbHVkaW5nIEdFVCBhbmQgUE9TVCkgdGhhdAorICAgICAgaXMgc3VwcG9ydGVkIGJ5IHRoZSBTZXJ2bGV0IGNsYXNzIHRoYXQgaXMgdWx0aW1hdGVseSBleGVjdXRlZC48L2xpPgorICA8bGk+VGhlIGludm9rZXIgc2VydmxldCBzaG91bGQgbmV2ZXIgYmUgYXNrZWQgdG8gcHJvY2VzcyBhIHNlY29uZCBvcgorICAgICAgc3Vic2VxdWVudCByZXF1ZXN0IGZvciB0aGUgc2FtZSA8Y29kZT57U2VydmxldFNlbGVjdG9yfTwvY29kZT4gKGJlY2F1c2UKKyAgICAgIGl0IHdpbGwgaGF2ZSByZWdpc3RlcmVkIGFuIGFwcHJvcHJpYXRlIHNlcnZsZXQgbWFwcGluZy48L2xpPgorICA8L3VsPgorCis8L3NlY3Rpb24+CisKKworPC9ib2R5PgorCis8L2RvY3VtZW50PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9mdW5jc3BlY3MvZnMtamRiYy1yZWFsbS54bWwgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2Z1bmNzcGVjcy9mcy1qZGJjLXJlYWxtLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGFjZDNiCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9mdW5jc3BlY3MvZnMtamRiYy1yZWFsbS54bWwKQEAgLTAsMCArMSwyNDggQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCFET0NUWVBFIGRvY3VtZW50IFsKKyAgPCFFTlRJVFkgcHJvamVjdCBTWVNURU0gInByb2plY3QueG1sIj4KK10+Cis8ZG9jdW1lbnQgdXJsPSJmcy1qZGJjLXJlYWxtLmh0bWwiPgorCisgICZwcm9qZWN0OworCisgIDxwcm9wZXJ0aWVzPgorICAgIDxhdXRob3IgZW1haWw9ImNyYWlnbWNjQGFwYWNoZS5vcmciPkNyYWlnIE1jQ2xhbmFoYW48L2F1dGhvcj4KKyAgICA8dGl0bGU+SkRCQ1JlYWxtPC90aXRsZT4KKyAgICA8cmV2aXNpb24+JElkJDwvcmV2aXNpb24+CisgIDwvcHJvcGVydGllcz4KKworPGJvZHk+CisKKworPHNlY3Rpb24gbmFtZT0iT3ZlcnZpZXciPgorCisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iSW50cm9kdWN0aW9uIj4KKworICAgIDxwPlRoZSBwdXJwb3NlIG9mIHRoZSA8c3Ryb25nPkpEQkNSZWFsbTwvc3Ryb25nPiBpbXBsZW1lbnRhdGlvbiBpcyB0bworICAgIHByb3ZpZGUgYSBtZWNoYW5pc20gYnkgd2hpY2ggVG9tY2F0IDUgY2FuIGFjcXVpcmUgaW5mb3JtYXRpb24gbmVlZGVkCisgICAgdG8gYXV0aGVudGljYXRlIHdlYiBhcHBsaWNhdGlvbiB1c2VycywgYW5kIGRlZmluZSB0aGVpciBzZWN1cml0eSByb2xlcywKKyAgICBmcm9tIGEgcmVsYXRpb25hbCBkYXRhYmFzZSBhY2Nlc3NlZCB2aWEgSkRCQyBBUElzLiAgRm9yIGludGVncmF0aW9uCisgICAgd2l0aCBDYXRhbGluYSwgdGhlIHJlc3VsdGluZyBjbGFzcyhlcykgbXVzdCBpbXBsZW1lbnQgdGhlCisgICAgPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5SZWFsbTwvY29kZT4gaW50ZXJmYWNlLjwvcD4KKworICAgIDxwPlRoaXMgc3BlY2lmaWNhdGlvbiByZWZsZWN0cyBhIGNvbWJpbmF0aW9uIG9mIGZ1bmN0aW9uYWxpdHkgdGhhdCBpcworICAgIGFscmVhZHkgcHJlc2VudCBpbiB0aGUgPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5yZWFsbS5KREJDUmVhbG08L2NvZGU+CisgICAgY2xhc3MsIGFzIHdlbGwgYXMgcmVxdWlyZW1lbnRzIGZvciBlbmhhbmNlbWVudHMgdGhhdCBoYXZlIGJlZW4KKyAgICBkaXNjdXNzZWQuICBXaGVyZSBhcHByb3ByaWF0ZSwgcmVxdWlyZW1lbnRzIHN0YXRlbWVudHMgYXJlIG1hcmtlZAorICAgIDxlbT5bQ3VycmVudF08L2VtPiBhbmQgPGVtPltSZXF1ZXN0ZWRdPC9lbT4gdG8gZGlzdGluZ3Vpc2ggdGhlbS48L3A+CisKKyAgICA8cD5UaGUgY3VycmVudCBzdGF0dXMgb2YgdGhpcyBmdW5jdGlvbmFsIHNwZWNpZmljYXRpb24gaXMKKyAgICA8c3Ryb25nPlBST1BPU0VEPC9zdHJvbmc+LiAgSXQgaGFzIG5vdCB5ZXQgYmVlbiBkaXNjdXNzZWQgYW5kCisgICAgYWdyZWVkIHRvIG9uIHRoZSBUT01DQVQtREVWIG1haWxpbmcgbGlzdC48L3A+CisKKyAgPC9zdWJzZWN0aW9uPgorCisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iRXh0ZXJuYWwgU3BlY2lmaWNhdGlvbnMiPgorCisgICAgPHA+VGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnVuY3Rpb25hbGl0eSBkZXBlbmRzIG9uIHRoZSBmb2xsb3dpbmcKKyAgICBleHRlcm5hbCBzcGVjaWZpY2F0aW9uczo8L3A+CisgICAgPHVsPgorICAgIDxsaT48YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL2pkYmMvIj5KYXZhIERhdGFiYXNlCisgICAgICAgIENvbm5lY3Rpdml0eTwvYT4gKHZlcnNpb24gMi4wIG9yIGxhdGVyKTwvbGk+CisgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvamRiYy8iPkphdmEgRGF0YWJhc2UKKyAgICAgICAgQ29ubmVjdGl2aXR5IE9wdGlvbmFsIFBhY2thZ2U8L2E+ICh2ZXJzaW9uIDIuMCBvciBsYXRlcik8L2xpPgorICAgIDwvdWw+CisKKyAgPC9zdWJzZWN0aW9uPgorCisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iSW1wbGVtZW50YXRpb24gUmVxdWlyZW1lbnRzIj4KKworICAgIDxwPlRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGZ1bmN0aW9uYWxpdHkgc2hhbGwgY29uZm9ybSB0byB0aGUKKyAgICBmb2xsb3dpbmcgcmVxdWlyZW1lbnRzOjwvcD4KKyAgICA8dWw+CisgICAgPGxpPkJlIHJlYWxpemVkIGluIG9uZSBvciBtb3JlIGltcGxlbWVudGF0aW9uIGNsYXNzZXMuPC9saT4KKyAgICA8bGk+SW1wbGVtZW50IHRoZSA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLlJlYWxtPC9jb2RlPiBpbnRlcmZhY2UuCisgICAgICAgIFtDdXJyZW50XTwvbGk+CisgICAgPGxpPkltcGxlbWVudCB0aGUgPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGU8L2NvZGU+CisgICAgICAgIGludGVyZmFjZS4gIFtDdXJyZW50XTwvbGk+CisgICAgPGxpPlN1YmNsYXNzIHRoZSA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtLlJlYWxtQmFzZTwvY29kZT4KKyAgICAgICAgYmFzZSBjbGFzcy48L2xpPgorICAgIDxsaT5MaXZlIGluIHRoZSA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtPC9jb2RlPiBwYWNrYWdlLgorICAgICAgICBbQ3VycmVudF08L2xpPgorICAgIDxsaT5TdXBwb3J0IGEgY29uZmlndXJhYmxlIGRlYnVnZ2luZyBkZXRhaWwgbGV2ZWwuIFtDdXJyZW50XTwvbGk+CisgICAgPGxpPkxvZyBkZWJ1Z2dpbmcgYW5kIG9wZXJhdGlvbmFsIG1lc3NhZ2VzIChzdWl0YWJseSBpbnRlcm5hdGlvbmFsaXplZCkKKyAgICAgICAgdmlhIHRoZSA8Y29kZT5nZXRDb250YWluZXIoKS5sb2coKTwvY29kZT4gbWV0aG9kLiBbQ3VycmVudF08L2xpPgorICAgIDwvdWw+CisKKyAgPC9zdWJzZWN0aW9uPgorCisKKzwvc2VjdGlvbj4KKworCis8c2VjdGlvbiBuYW1lPSJEZXBlbmRlbmNpZXMiPgorCisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iRW52aXJvbm1lbnRhbCBEZXBlbmRlbmNpZXMiPgorCisgICAgPHA+VGhlIGZvbGxvd2luZyBlbnZpcm9ubWVudGFsIGRlcGVuZGVuY2llcyBtdXN0IGJlIG1ldCBpbiBvcmRlciBmb3IKKyAgICBKREJDUmVhbG0gdG8gb3BlcmF0ZSBjb3JyZWN0bHk6PC9wPgorICAgIDx1bD4KKyAgICA8bGk+VGhlIGRlc2lyZSB0byB1dGlsaXplIEpEQkNSZWFsbSBtdXN0IGJlIHJlZ2lzdGVyZWQgaW4KKyAgICAgICAgPGNvZGU+JENBVEFMSU5BX0hPTUUvY29uZi9zZXJ2ZXIueG1sPC9jb2RlPiwgaW4gYQorICAgICAgICA8Y29kZT4mbHQ7UmVhbG0mZ3Q7PC9jb2RlPiBlbGVtZW50IHRoYXQgaXMgbmVzdGVkIGluc2lkZSBhCisgICAgICAgIGNvcnJlc3BvbmRpbmcgPGNvZGU+Jmx0O0VuZ2luZSZndDs8L2NvZGU+LCA8Y29kZT4mbHQ7SG9zdCZndDs8L2NvZGU+LAorICAgICAgICBvciA8Y29kZT4mbHQ7Q29udGV4dCZndDs8L2NvZGU+IGVsZW1lbnQuPC9saT4KKyAgICA8L3VsPgorCisgIDwvc3Vic2VjdGlvbj4KKworCisgIDxzdWJzZWN0aW9uIG5hbWU9IkNvbnRhaW5lciBEZXBlbmRlbmNpZXMiPgorCisgICAgPHA+Q29ycmVjdCBvcGVyYXRpb24gb2YgSkRCQ1JlYWxtIGRlcGVuZHMgb24gdGhlIGZvbGxvd2luZworICAgIHNwZWNpZmljIGZlYXR1cmVzIG9mIHRoZSBzdXJyb3VuZGluZyBjb250YWluZXI6PC9wPgorICAgIDx1bD4KKyAgICA8bGk+SW50ZXJhY3Rpb25zIHdpdGggPGNvZGU+SkRCQ1JlYWxtPC9jb2RlPiB3aWxsIGJlIGluaXRpYXRlZCBieQorICAgICAgICB0aGUgYXBwcm9wcmlhdGUgPGNvZGU+QXV0aGVudGljYXRvcjwvY29kZT4gaW1wbGVtZW50YXRpb24sIGJhc2VkCisgICAgICAgIG9uIHRoZSBsb2dpbiBtZXRob2QgdGhhdCBpcyBzZWxlY3RlZC48L2xpPgorICAgIDxsaT48Y29kZT5KREJDUmVhbG08L2NvZGU+IG11c3QgaGF2ZSB0aGUgSkRCQyBzdGFuZGFyZCBBUEkgY2xhc3NlcworICAgICAgICBhdmFpbGFibGUgdG8gaXQuICBGb3IgYSBKREsgMS4yIG9yIGxhdGVyIGNvbnRhaW5lciwgdGhlc2UgQVBJcworICAgICAgICBhcmUgaW5jbHVkZWQgaW4gdGhlIHN0YW5kYXJkIHBsYXRmb3JtLjwvbGk+CisgICAgPGxpPldoZW4gY29ubmVjdGlvbiBwb29saW5nIGlzIGltcGxlbWVudGVkLCA8Y29kZT5KREJDUmVhbG08L2NvZGU+CisgICAgICAgIG11c3QgaGF2ZSB0aGUgSkRCQyBPcHRpb25hbCBQYWNrYWdlICh2ZXJzaW9uIDIuMCBvciBsYXRlcikgQVBJcworICAgICAgICBhdmFpbGFibGUgdG8gaXQuICBUaGlzIGxpYnJhcnkgaXMgYXZhaWxhYmxlIGFzIGEgc2VwYXJhdGUKKyAgICAgICAgZG93bmxvYWQgKGFuZCB3aWxsIGJlIGluY2x1ZGVkIGluIFRvbWNhdCBiaW5hcnkgZGlzdHJpYnV0aW9ucykuPC9saT4KKyAgICA8L3VsPgorCisgIDwvc3Vic2VjdGlvbj4KKworCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iRnVuY3Rpb25hbGl0eSI+CisKKworICA8c3Vic2VjdGlvbiBuYW1lPSJPdmVydmlldyBvZiBPcGVyYXRpb24iPgorCisgICAgPHA+VGhlIG1haW4gcHVycG9zZSBvZiA8Y29kZT5KREJDUmVhbG08L2NvZGU+IGlzIHRvIGFsbG93IENhdGFsaW5hIHRvCisgICAgYXV0aGVudGljYXRlIHVzZXJzLCBhbmQgbG9vayB1cCB0aGUgY29ycmVzcG9uZGluZyBzZWN1cml0eSByb2xlcywgZnJvbQorICAgIHRoZSBpbmZvcm1hdGlvbiBmb3VuZCBpbiBhIHJlbGF0aW9uYWwgZGF0YWJhc2UgYWNjZXNzZWQgdmlhIEpEQkMgQVBJcy4KKyAgICBGb3IgbWF4aW11bSBmbGV4aWJpbGl0eSwgdGhlIGRldGFpbHMgb2YgaG93IHRoaXMgaXMgZG9uZSAoZm9yIGV4YW1wbGUsCisgICAgdGhlIG5hbWVzIG9mIHRoZSByZXF1aXJlZCB0YWJsZXMgYW5kIGNvbHVtbnMpIHNob3VsZCBiZSBjb25maWd1cmFibGUuPC9wPgorCisgICAgPHA+RWFjaCB0aW1lIHRoYXQgQ2F0YWxpbmEgbmVlZHMgdG8gYXV0aGVudGljYXRlIGEgdXNlciwgaXQgd2lsbCBjYWxsCisgICAgdGhlIDxjb2RlPmF1dGhlbnRpY2F0ZSgpPC9jb2RlPiBtZXRob2Qgb2YgdGhpcyBSZWFsbSBpbXBsZW1lbnRhdGlvbiwKKyAgICBwYXNzaW5nIHRoZSB1c2VybmFtZSBhbmQgcGFzc3dvcmQgdGhhdCB3ZXJlIHNwZWNpZmllZCBieSB0aGUgdXNlci4gIElmCisgICAgd2UgZmluZCB0aGUgdXNlciBpbiB0aGUgZGF0YWJhc2UgKGFuZCBtYXRjaCBvbiB0aGUgcGFzc3dvcmQpLCB3ZSBhY2N1bXVsYXRlCisgICAgYWxsIG9mIHRoZSBzZWN1cml0eSByb2xlcyB0aGF0IGFyZSBkZWZpbmVkIGZvciB0aGlzIHVzZXIsIGFuZCBjcmVhdGUgYQorICAgIG5ldyA8Y29kZT5HZW5lcmljUHJpbmNpcGFsPC9jb2RlPiBvYmplY3QgdG8gYmUgcmV0dXJuZWQuICBJZiB0aGUgdXNlcgorICAgIGlzIG5vdCBhdXRoZW50aWNhdGVkLCB3ZSByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaW5zdGVhZC4gIFRoZQorICAgIDxjb2RlPkdlbmVyaWNVc2VyPC9jb2RlPiBvYmplY3QgY2FjaGVzIHRoZSBzZXQgb2Ygc2VjdXJpdHkgcm9sZXMgdGhhdAorICAgIHdlcmUgb3duZWQgYnkgdGhpcyB1c2VyIGF0IHRoZSB0aW1lIG9mIGF1dGhlbnRpY2F0aW9uLCBzbyB0aGF0IGNhbGxzIHRvCisgICAgPGNvZGU+aXNVc2VySW5Sb2xlKCk8L2NvZGU+IGNhbiBiZSBhbnN3ZXJlZCB3aXRob3V0IGdvaW5nIGJhY2sgdG8gdGhlCisgICAgZGF0YWJhc2UgZXZlcnkgdGltZS48L3A+CisKKyAgPC9zdWJzZWN0aW9uPgorCisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iRGV0YWlsZWQgRnVuY3Rpb25hbCBSZXF1aXJlbWVudHMiPgorCisKKyAgICA8aDM+Q29uZmlndXJhYmxlIFByb3BlcnRpZXM8L2gzPgorCisgICAgPHA+VGhlIGltcGxlbWVudGF0aW9uIHNoYWxsIHN1cHBvcnQgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzCisgICAgdGhhdCBjYW4gYmUgY29uZmlndXJlZCB3aXRoIEphdmFCZWFucyBwcm9wZXJ0eSBzZXR0ZXJzOjwvcD4KKyAgICA8dWw+CisgICAgPGxpPkNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBkZWZpbmluZyB0aGUgSkRCQyBkcml2ZXIgdG8gdXNlLCB0aGUKKyAgICAgICAgZGF0YWJhc2UgY29ubmVjdGlvbiBVUkwgdG8gYmUgYWNjZXNzZWQsIGFuZCB0aGUgdXNlcm5hbWUvcGFzc3dvcmQKKyAgICAgICAgdG8gdXNlIGZvciBsb2dnaW5nIGluLiBbQ3VycmVudF08L2xpPgorICAgIDxsaT5Db25maWd1cmF0aW9uIHBhcmFtZXRlcnMgZGVzY3JpYmluZyB0aGUgY29ubmVjdGlvbiBwb29sIHRvIGJlCisgICAgICAgIGNyZWF0ZWQgdG8gc3VwcG9ydCBzaW11bHRhbmVvdXMgYXV0aGVudGljYXRpb25zLiBbUmVxdWVzdGVkXTwvbGk+CisgICAgPGxpPk5hbWUgb2YgdGhlIHRhYmxlcyB0byBiZSBzZWFyY2hlZCBmb3IgdXNlcnMgYW5kIHJvbGVzLiBbQ3VycmVudF08L2xpPgorICAgIDxsaT5OYW1lIG9mIHRoZSBjb2x1bW5zIHRvIGJlIHVzZWQgZm9yIHVzZXJuYW1lcywgcGFzc3dvcmRzLCBhbmQKKyAgICAgICAgcm9sZSBuYW1lcy4gIFtDdXJyZW50XTwvbGk+CisgICAgPC91bD4KKworICAgIDxoMz5MaWZlY3ljbGUgRnVuY3Rpb25hbGl0eTwvaDM+CisKKyAgICA8cD5UaGUgZm9sbG93aW5nIHByb2Nlc3NpbmcgbXVzdCBiZSBwZXJmb3JtZWQgd2hlbiB0aGUgPGNvZGU+c3RhcnQoKTwvY29kZT4KKyAgICBtZXRob2QgaXMgY2FsbGVkOjwvcD4KKyAgICA8dWw+CisgICAgPGxpPkVzdGFibGlzaCBhIGNvbm5lY3Rpb24gdG8gdGhlIGNvbmZpZ3VyZWQgZGF0YWJhc2UsIHVzaW5nIHRoZQorICAgICAgICBjb25maWd1cmVkIHVzZXJuYW1lIGFuZCBwYXNzd29yZC4gIFtDdXJyZW50XTwvbGk+CisgICAgPGxpPkNvbmZpZ3VyZSBhbmQgZXN0YWJsaXNoIGEgY29ubmVjdGlvbiBwb29sIG9mIGNvbm5lY3Rpb25zIHRvIHRoZQorICAgICAgICBkYXRhYmFzZS4gIFtSZXF1ZXN0ZWRdPC9saT4KKyAgICA8L3VsPgorCisgICAgPHA+VGhlIGZvbGxvd2luZyBwcm9jZXNzaW5nIG11c3QgYmUgcGVyZm9ybWVkIHdoZW4gdGhlIDxjb2RlPnN0b3AoKTwvY29kZT4KKyAgICBtZXRob2QgaXMgY2FsbGVkOjwvcD4KKyAgICA8dWw+CisgICAgPGxpPkNsb3NlIGFueSBvcGVuZWQgY29ubmVjdGlvbnMgdG8gdGhlIGRhdGFiYXNlLjwvbGk+CisgICAgPC91bD4KKworCisgICAgPGgzPk1ldGhvZCBhdXRoZW50aWNhdGUoKSBGdW5jdGlvbmFsaXR5PC9oMz4KKworICAgIDxwPldoZW4gPGNvZGU+YXV0aGVudGljYXRlKCk8L2NvZGU+IGlzIGNhbGxlZCwgdGhlIGZvbGxvd2luZyBwcm9jZXNzaW5nCisgICAgaXMgcmVxdWlyZWQ6PC9wPgorICAgIDx1bD4KKyAgICA8bGk+QWNxdWlyZSB0aGUgb25lIGFuZCBvbmx5IGNvbm5lY3Rpb24gW0N1cnJlbnRdIG9yIGFjcXVpcmUgYSBjb25uZWN0aW9uCisgICAgICAgIGZyb20gdGhlIGNvbm5lY3Rpb24gcG9vbCBbUmVxdWVzdGVkXS48L2xpPgorICAgIDxsaT5TZWxlY3QgdGhlIG9uZSBhbmQgb25seSByb3cgZnJvbSB0aGUgdXNlcidzIHRhYmxlIGZvciB0aGlzIHVzZXIsCisgICAgICAgIGFuZCByZXRyaWV2ZSB0aGUgY29ycmVzcG9uZGluZyBwYXNzd29yZCBjb2x1bW4uICBJZiB6ZXJvIHJvd3MgKG9yCisgICAgICAgIG1vcmUgdGhhbiBvbmUgcm93KSBhcmUgZm91bmQsIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi48L2xpPgorICAgIDxsaT5BdXRoZW50aWNhdGUgdGhlIHVzZXIgYnkgY29tcGFyaW5nIHRoZSAocG9zc2libHkgZW5jcnlwdGVkKSBwYXNzd29yZAorICAgICAgICB2YWx1ZSB0aGF0IHdhcyByZWNlaXZlZCBhZ2FpbnN0IHRoZSBwYXNzd29yZCBwcmVzZW50ZWQgYnkgdGhlIHVzZXIuCisgICAgICAgIElmIHRoZXJlIGlzIG5vIG1hdGNoLCByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uPC9saT4KKyAgICA8bGk+QWNxdWlyZSBhIDxjb2RlPkxpc3Q8L2NvZGU+IG9mIHRoZSBzZWN1cml0eSByb2xlcyBhc3NpZ25lZCB0byB0aGUKKyAgICAgICAgYXV0aGVudGljYXRlZCB1c2VyIGJ5IHNlbGVjdGluZyBmcm9tIHRoZSByb2xlcyB0YWJsZS48L2xpPgorICAgIDxsaT5Db25zdHJ1Y3QgYSBuZXcgaW5zdGFuY2Ugb2YgY2xhc3MKKyAgICAgICAgPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5yZWFsbS5HZW5lcmljUHJpbmNpcGFsPC9jb2RlPiwgcGFzc2luZyBhcworICAgICAgICBjb25zdHJ1Y3RvciBhcmd1bWVudHM6ICB0aGlzIHJlYWxtIGluc3RhbmNlLCB0aGUgYXV0aGVudGljYXRlZAorICAgICAgICB1c2VybmFtZSwgYW5kIGEgPGNvZGU+TGlzdDwvY29kZT4gb2YgdGhlIHNlY3VyaXR5IHJvbGVzIGFzc29jaWF0ZWQKKyAgICAgICAgd2l0aCB0aGlzIHVzZXIuPC9saT4KKyAgICA8bGk+PHN0cm9uZz5XQVJOSU5HPC9zdHJvbmc+IC0gRG8gbm90IGF0dGVtcHQgdG8gY2FjaGUgYW5kIHJldXNlIHByZXZpb3VzCisgICAgICAgIDxjb2RlPkdlbmVyaWNQcmluY2lwYWw8L2NvZGU+IG9iamVjdHMgZm9yIGEgcGFydGljdWxhciB1c2VyLCBiZWNhdXNlCisgICAgICAgIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgZGlyZWN0b3J5IHNlcnZlciBtaWdodCBoYXZlIGNoYW5nZWQgc2luY2UgdGhlCisgICAgICAgIGxhc3QgdGltZSB0aGlzIHVzZXIgd2FzIGF1dGhlbnRpY2F0ZWQuPC9saT4KKyAgICA8bGk+UmV0dXJuIHRoZSBuZXdseSBjb25zdHJ1Y3RlZCA8Y29kZT5HZW5lcmljUHJpbmNpcGFsPC9jb2RlPi48L2xpPgorICAgIDwvdWw+CisKKworICAgIDxoMz5NZXRob2QgaGFzUm9sZSgpIEZ1bmN0aW9uYWxpdHk8L2gzPgorCisgICAgPHA+V2hlbiA8Y29kZT5oYXNSb2xlKCk8L2NvZGU+IGlzIGNhbGxlZCwgdGhlIGZvbGxvd2luZyBwcm9jZXNzaW5nCisgICAgaXMgcmVxdWlyZWQ6PC9wPgorICAgIDx1bD4KKyAgICA8bGk+VGhlIDxjb2RlPnByaW5jaXBhbDwvY29kZT4gdGhhdCBpcyBwYXNzZWQgYXMgYW4gYXJndW1lbnQgU0hPVUxECisgICAgICAgIGJlIG9uZSB0aGF0IHdlIHJldHVybmVkIChpbnN0YW5jZW9mIGNsYXNzCisgICAgICAgIDxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEucmVhbG0uR2VuZXJpY1ByaW5jaXBhbDwvY29kZT4sIHdpdGggYQorICAgICAgICA8Y29kZT5yZWFsbTwvY29kZT4gcHJvcGVydHkgdGhhdCBpcyBlcXVhbCB0byBvdXIgaW5zdGFuY2UuPC9saT4KKyAgICA8bGk+SWYgdGhlIHBhc3NlZCA8Y29kZT5wcmluY2lwYWw8L2NvZGU+IG1lZXRzIHRoZXNlIGNyaXRlcmlhLCBjaGVjaworICAgICAgICB0aGUgc3BlY2lmaWVkIHJvbGUgYWdhaW5zdCB0aGUgbGlzdCByZXR1cm5lZCBieQorICAgICAgICA8Y29kZT5nZXRSb2xlcygpPC9jb2RlPiwgYW5kIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUKKyAgICAgICAgc3BlY2lmaWVkIHJvbGUgaXMgaW5jbHVkZWQ7IG90aGVyd2lzZSwgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPi48L2xpPgorICAgIDxsaT5JZiB0aGUgcGFzc2VkIDxjb2RlPnByaW5jaXBhbDwvY29kZT4gZG9lcyBub3QgbWVldCB0aGVzZSBjcml0ZXJpYSwKKyAgICAgICAgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPi48L2xpPgorICAgIDwvdWw+CisKKyAgPC9zdWJzZWN0aW9uPgorCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iVGVzdGFibGUgQXNzZXJ0aW9ucyI+CisKKyAgPHA+SW4gYWRkaXRpb24gdGhlIHRoZSBhc3NlcnRpb25zIGltcGxpZWQgYnkgdGhlIGZ1bmN0aW9uYWxpdHkgcmVxdWlyZW1lbnRzCisgIGxpc3RlZCBhYm92ZSwgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIGFzc2VydGlvbnMgc2hhbGwgYmUgdGVzdGVkIHRvCisgIHZhbGlkYXRlIHRoZSBiZWhhdmlvciBvZiA8Y29kZT5KREJDUmVhbG08L2NvZGU+OjwvcD4KKyAgPHVsPgorICA8L3VsPgorCis8L3NlY3Rpb24+CisKKworPC9ib2R5PgorCis8L2RvY3VtZW50PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9mdW5jc3BlY3MvZnMtam5kaS1yZWFsbS54bWwgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2Z1bmNzcGVjcy9mcy1qbmRpLXJlYWxtLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjlmZTBhCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9mdW5jc3BlY3MvZnMtam5kaS1yZWFsbS54bWwKQEAgLTAsMCArMSw0MDMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCFET0NUWVBFIGRvY3VtZW50IFsKKyAgPCFFTlRJVFkgcHJvamVjdCBTWVNURU0gInByb2plY3QueG1sIj4KK10+Cis8ZG9jdW1lbnQgdXJsPSJmcy1qbmRpLXJlYWxtLmh0bWwiPgorCisgICZwcm9qZWN0OworCisgIDxwcm9wZXJ0aWVzPgorICAgIDxhdXRob3IgZW1haWw9ImNyYWlnbWNjQGFwYWNoZS5vcmciPkNyYWlnIE1jQ2xhbmFoYW48L2F1dGhvcj4KKyAgICA8dGl0bGU+Sk5ESVJlYWxtPC90aXRsZT4KKyAgICA8cmV2aXNpb24+JElkJDwvcmV2aXNpb24+CisgIDwvcHJvcGVydGllcz4KKworPGJvZHk+CisKKworPHNlY3Rpb24gbmFtZT0iT3ZlcnZpZXciPgorCisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iSW50cm9kdWN0aW9uIj4KKworICAgIDxwPlRoZSBwdXJwb3NlIG9mIHRoZSA8c3Ryb25nPkpORElSZWFsbTwvc3Ryb25nPiBpbXBsZW1lbnRhdGlvbiBpcyB0bworICAgIHByb3ZpZGUgYSBtZWNoYW5pc20gYnkgd2hpY2ggVG9tY2F0IDUgY2FuIGFjcXVpcmUgaW5mb3JtYXRpb24gbmVlZGVkCisgICAgdG8gYXV0aGVudGljYXRlIHdlYiBhcHBsaWNhdGlvbiB1c2VycywgYW5kIGRlZmluZSB0aGVpciBzZWN1cml0eSByb2xlcywKKyAgICBmcm9tIGEgZGlyZWN0b3J5IHNlcnZlciBvciBvdGhlciBzZXJ2aWNlIGFjY2Vzc2VkIHZpYSBKTkRJIEFQSXMuICBGb3IKKyAgICBpbnRlZ3JhdGlvbiB3aXRoIENhdGFsaW5hLCB0aGlzIGNsYXNzIG11c3QgaW1wbGVtZW50IHRoZQorICAgIDxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuUmVhbG08L2NvZGU+IGludGVyZmFjZS48L3A+CisKKyAgICA8cD5UaGlzIHNwZWNpZmljYXRpb24gcmVmbGVjdHMgYSBjb21iaW5hdGlvbiBvZiBmdW5jdGlvbmFsaXR5IHRoYXQgaXMKKyAgICBhbHJlYWR5IHByZXNlbnQgaW4gdGhlIDxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEucmVhbG0uSk5ESVJlYWxtPC9jb2RlPgorICAgIGNsYXNzLCBhcyB3ZWxsIGFzIHJlcXVpcmVtZW50cyBmb3IgZW5oYW5jZW1lbnRzIHRoYXQgaGF2ZSBiZWVuCisgICAgZGlzY3Vzc2VkLiAgV2hlcmUgYXBwcm9wcmlhdGUsIHJlcXVpcmVtZW50cyBzdGF0ZW1lbnRzIGFyZSBtYXJrZWQKKyAgICA8ZW0+W0N1cnJlbnRdPC9lbT4gYW5kIDxlbT5bUmVxdWVzdGVkXTwvZW0+IHRvIGRpc3Rpbmd1aXNoIHRoZW0uPC9wPgorCisgICAgPHA+VGhlIGN1cnJlbnQgc3RhdHVzIG9mIHRoaXMgZnVuY3Rpb25hbCBzcGVjaWZpY2F0aW9uIGlzCisgICAgPHN0cm9uZz5QUk9QT1NFRDwvc3Ryb25nPi4gIEl0IGhhcyBub3QgeWV0IGJlZW4gZGlzY3Vzc2VkIGFuZAorICAgIGFncmVlZCB0byBvbiB0aGUgVE9NQ0FULURFViBtYWlsaW5nIGxpc3QuPC9wPgorCisgICAgPHA+VGhlIGNvZGUgaW4gdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiA8Y29kZT5KTkRJUmVhbG08L2NvZGU+LCBhbmQgdGhlCisgICAgaWRlYXMgZXhwcmVzc2VkIGluIHRoaXMgZnVuY3Rpb25hbCBzcGVjaWZpY2F0aW9uLCBhcmUgdGhlIHJlc3VsdHMgb2YKKyAgICBjb250cmlidXRpb25zIGZyb20gbWFueSBpbmRpdmlkdWFscywgaW5jbHVkaW5nIChhbHBoYWJldGljYWxseSk6PC9wPgorICAgIDx1bD4KKyAgICA8bGk+SG9sbWFuLCBKb2huICZsdDtqLmcuaG9sbWFuQHFtdy5hYy51ayZndDs8L2xpPgorICAgIDxsaT5Mb2NraGFydCwgRWxsZW4gJmx0O2Vsb2NraGFydEBob21lLmNvbSZndDs8L2xpPgorICAgIDxsaT5NY0NsYW5haGFuLCBDcmFpZyAmbHQ7Y3JhaWdtY2NAYXBhY2hlLm9yZyZndDs8L2xpPgorICAgIDwvdWw+CisKKyAgPC9zdWJzZWN0aW9uPgorCisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iRXh0ZXJuYWwgU3BlY2lmaWNhdGlvbnMiPgorCisgICAgPHA+VGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnVuY3Rpb25hbGl0eSBkZXBlbmRzIG9uIHRoZSBmb2xsb3dpbmcKKyAgICBleHRlcm5hbCBzcGVjaWZpY2F0aW9uczo8L3A+CisgICAgPHVsPgorICAgIDxsaT48YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL2puZGkvIj5KYXZhIE5hbWluZyBhbmQKKyAgICAgICAgRGlyZWN0b3J5IEludGVyZmFjZTwvYT4gKHZlcnNpb24gMS4yLjEgb3IgbGF0ZXIpPC9saT4KKyAgICA8L3VsPgorCisgIDwvc3Vic2VjdGlvbj4KKworCisgIDxzdWJzZWN0aW9uIG5hbWU9IkltcGxlbWVudGF0aW9uIFJlcXVpcmVtZW50cyI+CisKKyAgICA8cD5UaGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBmdW5jdGlvbmFsaXR5IHNoYWxsIGNvbmZvcm0gdG8gdGhlCisgICAgZm9sbG93aW5nIHJlcXVpcmVtZW50czo8L3A+CisgICAgPHVsPgorICAgIDxsaT5CZSByZWFsaXplZCBpbiBvbmUgb3IgbW9yZSBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzLjwvbGk+CisgICAgPGxpPkltcGxlbWVudCB0aGUgPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5SZWFsbTwvY29kZT4gaW50ZXJmYWNlLgorICAgICAgICBbQ3VycmVudF08L2xpPgorICAgIDxsaT5JbXBsZW1lbnQgdGhlIDxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlPC9jb2RlPgorICAgICAgICBpbnRlcmZhY2UuICBbQ3VycmVudF08L2xpPgorICAgIDxsaT5TdWJjbGFzcyB0aGUgPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5yZWFsbS5SZWFsbUJhc2U8L2NvZGU+CisgICAgICAgIGJhc2UgY2xhc3MuPC9saT4KKyAgICA8bGk+TGl2ZSBpbiB0aGUgPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5yZWFsbTwvY29kZT4gcGFja2FnZS4KKyAgICAgICAgW0N1cnJlbnRdPC9saT4KKyAgICA8bGk+U3VwcG9ydCBhIGNvbmZpZ3VyYWJsZSBkZWJ1Z2dpbmcgZGV0YWlsIGxldmVsLiBbQ3VycmVudF08L2xpPgorICAgIDxsaT5Mb2cgZGVidWdnaW5nIGFuZCBvcGVyYXRpb25hbCBtZXNzYWdlcyAoc3VpdGFibHkgaW50ZXJuYXRpb25hbGl6ZWQpCisgICAgICAgIHZpYSB0aGUgPGNvZGU+Z2V0Q29udGFpbmVyKCkubG9nKCk8L2NvZGU+IG1ldGhvZC4gW0N1cnJlbnRdPC9saT4KKyAgICA8L3VsPgorCisgIDwvc3Vic2VjdGlvbj4KKworCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iRGVwZW5kZW5jaWVzIj4KKworCisgIDxzdWJzZWN0aW9uIG5hbWU9IkVudmlyb25tZW50YWwgRGVwZW5kZW5jaWVzIj4KKworICAgIDxwPlRoZSBmb2xsb3dpbmcgZW52aXJvbm1lbnRhbCBkZXBlbmRlbmNpZXMgbXVzdCBiZSBtZXQgaW4gb3JkZXIgZm9yCisgICAgSk5ESVJlYWxtIHRvIG9wZXJhdGUgY29ycmVjdGx5OjwvcD4KKyAgICA8dWw+CisgICAgPGxpPlRoZSBkZXNpcmUgdG8gdXRpbGl6ZSBKTkRJUmVhbG0gbXVzdCBiZSByZWdpc3RlcmVkIGluCisgICAgICAgIDxjb2RlPiRDQVRBTElOQV9IT01FL2NvbmYvc2VydmVyLnhtbDwvY29kZT4sIGluIGEKKyAgICAgICAgPGNvZGU+Jmx0O1JlYWxtJmd0OzwvY29kZT4gZWxlbWVudCB0aGF0IGlzIG5lc3RlZCBpbnNpZGUgYQorICAgICAgICBjb3JyZXNwb25kaW5nIDxjb2RlPiZsdDtFbmdpbmUmZ3Q7PC9jb2RlPiwgPGNvZGU+Jmx0O0hvc3QmZ3Q7PC9jb2RlPiwKKyAgICAgICAgb3IgPGNvZGU+Jmx0O0NvbnRleHQmZ3Q7PC9jb2RlPiBlbGVtZW50LjwvbGk+CisgICAgPGxpPklmIHRoZSA8ZW0+QWRtaW5pc3RyYXRvciBMb2dpbjwvZW0+IG9wZXJhdGlvbmFsIG1vZGUgaXMgc2VsZWN0ZWQsCisgICAgICAgIHRoZSBjb25maWd1cmVkIGFkbWluaXN0cmF0b3IgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIG11c3QgYmUgY29uZmlndXJlZAorICAgICAgICBpbiB0aGUgY29ycmVzcG9uZGluZyBkaXJlY3Rvcnkgc2VydmVyLjwvbGk+CisgICAgPGxpPklmIHRoZSA8ZW0+VXNlcm5hbWUgTG9naW48L2VtPiBvcGVyYXRpb25hbCBtb2RlIGlzIHNlbGVjdGVkLAorICAgICAgICB0aGUgY29ycmVzcG9uZGluZyBkaXJlY3Rvcnkgc2VydmVyIG11c3QgYmUgY29uZmlndXJlZCB0byBhY2NlcHQKKyAgICAgICAgbG9naW5zIHdpdGggdGhlIHVzZXJuYW1lIGFuZCBwYXNzd29yZCB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvCisgICAgICAgIDxjb2RlPkpORElSZWFsbTwvY29kZT4gYnkgdGhlIGFwcHJvcHJpYXRlIDxjb2RlPkF1dGhlbnRpY2F0b3I8L2NvZGU+LgorICAgICAgICA8L2xpPgorICAgIDwvdWw+CisKKyAgPC9zdWJzZWN0aW9uPgorCisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iQ29udGFpbmVyIERlcGVuZGVuY2llcyI+CisKKyAgICA8cD5Db3JyZWN0IG9wZXJhdGlvbiBvZiBKTkRJUmVhbG0gZGVwZW5kcyBvbiB0aGUgZm9sbG93aW5nCisgICAgc3BlY2lmaWMgZmVhdHVyZXMgb2YgdGhlIHN1cnJvdW5kaW5nIGNvbnRhaW5lcjo8L3A+CisgICAgPHVsPgorICAgIDxsaT5JbnRlcmFjdGlvbnMgd2l0aCA8Y29kZT5KTkRJUmVhbG08L2NvZGU+IHdpbGwgYmUgaW5pdGlhdGVkIGJ5CisgICAgICAgIHRoZSBhcHByb3ByaWF0ZSA8Y29kZT5BdXRoZW50aWNhdG9yPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiwgYmFzZWQKKyAgICAgICAgb24gdGhlIGxvZ2luIG1ldGhvZCB0aGF0IGlzIHNlbGVjdGVkLjwvbGk+CisgICAgPGxpPjxjb2RlPkpORElSZWFsbTwvY29kZT4gbXVzdCBoYXZlIHRoZSBKTkRJIEFQSSBjbGFzc2VzIGF2YWlsYWJsZQorICAgICAgICB0byBpdC4gIEZvciBhIEpESyAxLjIgY29udGFpbmVyLCB0aGF0IG1lYW5zIDxjb2RlPmpuZGkuamFyPC9jb2RlPgorICAgICAgICBhbmQgdGhlIGFwcHJvcHJpYXRlIGltcGxlbWVudGF0aW9uIChzdWNoIGFzIDxjb2RlPmxkYXAuamFyPC9jb2RlPikKKyAgICAgICAgbXVzdCBiZSBwbGFjZWQgaW4gdGhlIDxjb2RlPnNlcnZlci9saWI8L2NvZGU+IGRpcmVjdG9yeS48L2xpPgorICAgIDwvdWw+CisKKyAgPC9zdWJzZWN0aW9uPgorCisKKzwvc2VjdGlvbj4KKworCis8c2VjdGlvbiBuYW1lPSJGdW5jdGlvbmFsaXR5Ij4KKworCisgIDxzdWJzZWN0aW9uIG5hbWU9Ik9wZXJhdGlvbmFsIE1vZGVzIj4KKworICAgIDxwPlRoZSBjb21wbGV0ZWQgPGNvZGU+Sk5ESVJlYWxtPC9jb2RlPiBtdXN0IHN1cHBvcnQgdHdvIG1ham9yIG9wZXJhdGlvbmFsCisgICAgbW9kZXMgaW4gb3JkZXIgdG8gc3VwcG9ydCBhbGwgb2YgdGhlIHJlcXVpcmVkIHVzZSBjYXNlcy4gIEZvciB0aGUgcHVycG9zZXMKKyAgICBvZiB0aGlzIGRvY3VtZW50LCB0aGUgbW9kZXMgYXJlIGNhbGxlZCA8ZW0+YWRtaW5pc3RyYXRvciBsb2dpbjwvZW0+IGFuZAorICAgIDxlbT5Vc2VybmFtZSBMb2dpbjwvZW0+LiAgVGhleSBhcmUgZGVzY3JpYmVkIGZ1cnRoZXIgaW4gdGhlIGZvbGxvd2luZworICAgIHBhcmFncmFwaHMuPC9wPgorCisgICAgPHA+Rm9yIDxlbT5BZG1pbmlzdHJhdG9yIExvZ2luPC9lbT4gbW9kZSwgPGNvZGU+Sk5ESVJlYWxtPC9jb2RlPiB3aWxsIGJlCisgICAgY29uZmlndXJlZCB0byBlc3RhYmxpc2ggb25lIG9yIG1vcmUgY29ubmVjdGlvbnMgKHVzaW5nIGEgY29ubmVjdGlvbiBwb29sKQorICAgIHRvIGFuIGFwcHJvcHJpYXRlIGRpcmVjdG9yeSBzZXJ2ZXIsIHVzaW5nIEpOREkgQVBJcywgdW5kZXIgYSAic3lzdGVtCisgICAgYWRtaW5pc3RyYXRvciIgdXNlcm5hbWUgYW5kIHBhc3N3b3JkLiAgVGhpcyBpcyBzaW1pbGFyIHRvIHRoZSBhcHByb2FjaAorICAgIG5vcm1hbGx5IHVzZWQgdG8gY29uZmlndXJlIDxjb2RlPkpEQkNSZWFsbTwvY29kZT4gdG8gYWNjZXNzIGF1dGhlbnRpY2F0aW9uCisgICAgYW5kIGFjY2VzcyBjb250cm9sIGluZm9ybWF0aW9uIGluIGEgZGF0YWJhc2UuICBJdCBpcyBhc3N1bWVkIHRoYXQgdGhlCisgICAgc3lzdGVtIGFkbWluaXN0cmF0b3IgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIHRoYXQgYXJlIGNvbmZpZ3VyZWQgcHJvdmlkZQorICAgIHN1ZmZpY2llbnQgcHJpdmlsZWdlcyB3aXRoaW4gdGhlIGRpcmVjdG9yeSBzZXJ2ZXIgdG8gcmVhZCAoYnV0IG5vdCBtb2RpZnkpCisgICAgdGhlIHVzZXJuYW1lLCBwYXNzd29yZCwgYW5kIGFzc2lnbmVkIHJvbGVzIGZvciBlYWNoIHZhbGlkIHVzZXIgb2YgdGhlCisgICAgd2ViIGFwcGxpY2F0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIDxjb2RlPlJlYWxtPC9jb2RlPi4gIFRoZSBwYXNzd29yZAorICAgIGNhbiBiZSBzdG9yZWQgaW4gY2xlYXJ0ZXh0LCBvciBpbiBvbmUgb2YgdGhlIGRpZ2VzdGVkIG1vZGVzIHN1cHBvcnRlZCBieQorICAgIHRoZSA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtLlJlYWxtQmFzZTwvY29kZT4gYmFzZSBjbGFzcy48L3A+CisKKyAgICA8cD5Gb3IgPGVtPlVzZXJuYW1lIExvZ2luPC9lbT4gbW9kZSwgPGNvZGU+Sk5ESVJlYWxtPC9jb2RlPiBkb2VzIG5vdAorICAgIG5vcm1hbGx5IHJlbWFpbiBjb25uZWN0ZWQgdG8gdGhlIGRpcmVjdG9yeSBzZXJ2ZXIuICBJbnN0ZWFkLCB3aGVuZXZlciBhCisgICAgdXNlciBpcyB0byBiZSBhdXRoZW50aWNhdGVkLCBhIGNvbm5lY3Rpb24gdG8gdGhlIGRpcmVjdG9yeSBzZXJ2ZXIKKyAgICAodXNpbmcgdGhlIHVzZXJuYW1lIGFuZCBwYXNzd29yZCByZWNlaXZlZCBmcm9tIHRoZSBhdXRoZW50aWNhdG9yKSBpcworICAgIGF0dGVtcHRlZC4gIElmIHRoaXMgY29ubmVjdGlvbiBpcyBzdWNjZXNzZnVsLCB0aGUgdXNlciBpcyBhc3N1bWVkIHRvIGJlCisgICAgc3VjY2Vzc2Z1bGx5IGF1dGhlbnRpY2F0ZWQuICBUaGlzIGNvbm5lY3Rpb24gaXMgdGhlbiB1dGlsaXplZCB0byByZWFkCisgICAgdGhlIGNvcnJlc3BvbmRpbmcgc2VjdXJpdHkgcm9sZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdXNlciwgYW5kIHRoZQorICAgIGNvbm5lY3Rpb24gaXMgdGhlbiBicm9rZW4uPC9wPgorCisgICAgPHA+PHN0cm9uZz5OT1RFPC9zdHJvbmc+IC0gPGVtPlVzZXJuYW1lIExvZ2luPC9lbT4gbW9kZSBjYW5ub3QgYmUgdXNlZAorICAgIGlmIHlvdSBoYXZlIHNlbGVjdGVkIGxvZ2luIG1ldGhvZCA8Y29kZT5ESUdFU1Q8L2NvZGU+IGluIHlvdXIgd2ViCisgICAgYXBwbGljYXRpb24gZGVwbG95bWVudCBkZXNjcmlwdG9yICg8Y29kZT53ZWIueG1sPC9jb2RlPikgZmlsZS4gIFRoaXMKKyAgICByZXN0cmljdGlvbiBleGlzdHMgYmVjYXVzZSB0aGUgY2xlYXJ0ZXh0IHBhc3N3b3JkIGlzIG5ldmVyIGF2YWlsYWJsZQorICAgIHRvIHRoZSBjb250YWluZXIsIHNvIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBiaW5kIHRvIHRoZSBkaXJlY3Rvcnkgc2VydmVyCisgICAgdXNpbmcgdGhlIHVzZXIncyB1c2VybmFtZSBhbmQgcGFzc3dvcmQuPC9wPgorCisgICAgPHA+QmVjYXVzZSB0aGVzZSBvcGVyYXRpb25hbCBtb2RlcyB3b3JrIHNvIGRpZmZlcmVudGx5LCB0aGUgZnVuY3Rpb25hbGl0eQorICAgIGZvciBlYWNoIG1vZGUgd2lsbCBiZSBkZXNjcmliZWQgc2VwYXJhdGVseS4gIFdoZXRoZXIgb3Igbm90IGJvdGggbW9kZXMKKyAgICBhcmUgYWN0dWFsbHkgc3VwcG9ydGVkIGJ5IGEgc2luZ2xlIGNsYXNzICh2ZXJzdXMgYSBjbGFzcyBwZXIgbW9kZSkgaXMKKyAgICBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwgbGVmdCB0byB0aGUgZGVzaWduZXIuPC9wPgorCisgICAgPHA+PHN0cm9uZz5OT1RFPC9zdHJvbmc+IC0gVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gb25seSBpbXBsZW1lbnRzCisgICAgcGFydCBvZiB0aGUgPGVtPkFkbWluaXN0cmF0b3IgTG9va3VwPC9lbT4gbW9kZSByZXF1aXJlbWVudHMuICBJdCBkb2VzCisgICAgbm90IHN1cHBvcnQgdGhlIDxlbT5Vc2VybmFtZSBMb29rdXA8L2VtPiBtb2RlIGF0IGFsbCwgYXQgdGhpcyBwb2ludC48L3A+CisKKyAgPC9zdWJzZWN0aW9uPgorCisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iQWRtaW5pc3RyYXRvciBMb2dpbiBNb2RlIEZ1bmN0aW9uYWxpdHkiPgorCisKKyAgICA8aDM+Q29uZmlndXJhYmxlIFByb3BlcnRpZXM8L2gzPgorCisgICAgPHA+VGhlIGltcGxlbWVudGF0aW9uIHNoYWxsIHN1cHBvcnQgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzCisgICAgdGhhdCBjYW4gYmUgY29uZmlndXJlZCB3aXRoIEphdmFCZWFucyBwcm9wZXJ0eSBzZXR0ZXJzOjwvcD4KKyAgICA8dWw+CisgICAgPGxpPjxjb2RlPmNvbm5lY3Rpb25VUkw8L2NvZGU+IC0gVVJMIG9mIHRoZSBkaXJlY3Rvcnkgc2VydmVyIHdlIHdpbGwKKyAgICAgICAgYmUgY29udGFjdGluZy48L2xpPgorICAgIDxsaT48Y29kZT5jb250ZXh0RmFjdG9yeTwvY29kZT4gLSBGdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgSk5ESQorICAgICAgICBjb250ZXh0IGZhY3RvcnkgdXNlZCB0byByZXRyaWV2ZSBvdXIgSW5pdGlhbENvbnRleHQuCisgICAgICAgIFtjb20uc3VuLmpuZGkubGRhcC5MZGFwQ3R4RmFjdG9yeV08L2xpPgorICAgIDxsaT5BZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcyByZXF1aXJlZCB0byBlc3RhYmxpc2ggdGhlCisgICAgICAgIGFwcHJvcHJpYXRlIGNvbm5lY3Rpb24uICBbUmVxdWVzdGVkXTwvbGk+CisgICAgPGxpPkNvbm5lY3Rpb24gcG9vbCBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMuICBbUmVxdWVzdGVkXTwvbGk+CisgICAgPGxpPkNvbmZpZ3VyYXRpb24gcHJvcGVydGllcyBkZWZpbmluZyBob3cgYSBwYXJ0aWN1bGFyIHVzZXIgaXMKKyAgICAgICAgYXV0aGVudGljYXRlZC4gIFRoZSBmb2xsb3dpbmcgY2FwYWJpbGl0aWVzIHNob3VsZCBiZSBzdXBwb3J0ZWQ6CisgICAgICAgIDx1bD4KKyAgICAgICAgPGxpPlN1YnN0aXR1dGUgdGhlIHNwZWNpZmllZCB1c2VybmFtZSBpbnRvIGEgc3RyaW5nLiAgW1JlcXVlc3RlZF08L2xpPgorICAgICAgICA8bGk+UmV0cmlldmUgdGhlIGRpc3Rpbmd1aXNoZWQgbmFtZSAoRE4pIG9mIGFuIGF1dGhvcml6ZWQgdXNlciB2aWEgYW4KKyAgICAgICAgICAgIExEQVAgc2VhcmNoIHN0cmluZyB3aXRoIGEgcmVwbGFjZW1lbnQgcGxhY2Vob2xkZXIgZm9yIHRoZQorICAgICAgICAgICAgdXNlcm5hbWUsIGFuZCBjb21wYXJpc29uIG9mIHRoZSBwYXNzd29yZCB0byBhIGNvbmZpZ3VyYWJsZQorICAgICAgICAgICAgYXR0cmlidXRlIHJldHJpZXZlZCBmcm9tIHRoZSBzZWFyY2ggcmVzdWx0LiAgW0N1cnJlbnRdPC9saT4KKyAgICAgICAgPC91bD48L2xpPgorICAgIDxsaT5Db25maWd1cmF0aW9uIHByb3BlcnRpZXMgZGVmaW5pbmcgaG93IHRoZSByb2xlcyBhc3NvY2lhdGVkIHdpdGggYQorICAgICAgICBwYXJ0aWN1bGFyIGF1dGhlbnRpY2F0ZWQgdXNlciBjYW4gYmUgcmV0cmlldmVkLiAgVGhlIGZvbGxvd2luZworICAgICAgICBhcHByb2FjaGVzIHNob3VsZCBiZSBzdXBwb3J0ZWQ6CisgICAgICAgIDx1bD4KKyAgICAgICAgPGxpPlJldHJpZXZlIGEgc3BlY2lmaWVkIGF0dHJpYnV0ZSAocG9zc2libHkgbXVsdGktdmFsdWVkKQorICAgICAgICAgICAgZnJvbSBhbiBMREFQIHNlYXJjaCBleHByZXNzaW9uLAorICAgICAgICAgICAgd2l0aCBhIHJlcGxhY2VtZW50IHBsYWNlaG9sZGVyIGZvciB0aGUgRE4gb2YgdGhlIHVzZXIuCisgICAgICAgICAgICBbQ3VycmVudF08L2xpPgorICAgICAgICA8bGk+UmV0cmlldmUgYSBzZXQgb2Ygcm9sZSBuYW1lcyB0aGF0IGFyZSBkZWZpbmVkIGltcGxpY2l0bHkgKGJ5CisgICAgICAgICAgICBzZWxlY3RpbmcgcHJpbmNpcGFscyB0aGF0IG1hdGNoIGEgc2VhcmNoIHBhdHRlcm4pIHJhdGhlciB0aGFuCisgICAgICAgICAgICBleHBsaWNpdGx5IChieSBmaW5kaW5nIGEgcGFydGljdWxhciBhdHRyaWJ1dGUgdmFsdWUpLgorICAgICAgICAgICAgW1JlcXVlc3RlZF08L2xpPgorICAgICAgICA8L3VsPjwvbGk+CisgICAgPC91bD4KKworICAgIDxoMz5MaWZlY3ljbGUgRnVuY3Rpb25hbGl0eTwvaDM+CisKKyAgICA8cD5UaGUgZm9sbG93aW5nIHByb2Nlc3NpbmcgbXVzdCBiZSBwZXJmb3JtZWQgd2hlbiB0aGUgPGNvZGU+c3RhcnQoKTwvY29kZT4KKyAgICBtZXRob2QgaXMgY2FsbGVkOjwvcD4KKyAgICA8dWw+CisgICAgPGxpPkVzdGFibGlzaCBhIGNvbm5lY3Rpb24gdG8gdGhlIGNvbmZpZ3VyZWQgZGlyZWN0b3J5IHNlcnZlciwgdXNpbmcgdGhlCisgICAgICAgIGNvbmZpZ3VyZWQgc3lzdGVtIGFkbWluaXN0cmF0b3IgdXNlcm5hbWUgYW5kIHBhc3N3b3JkLiAgW0N1cnJlbnRdPC9saT4KKyAgICA8bGk+Q29uZmlndXJlIGFuZCBlc3RhYmxpc2ggYSBjb25uZWN0aW9uIHBvb2wgb2YgY29ubmVjdGlvbnMgdG8gdGhlCisgICAgICAgIGRpcmVjdG9yeSBzZXJ2ZXIuICBbUmVxdWVzdGVkXTwvbGk+CisgICAgPC91bD4KKworICAgIDxwPlRoZSBmb2xsb3dpbmcgcHJvY2Vzc2luZyBtdXN0IGJlIHBlcmZvcm1lZCB3aGVuIHRoZSA8Y29kZT5zdG9wKCk8L2NvZGU+CisgICAgbWV0aG9kIGlzIGNhbGxlZDo8L3A+CisgICAgPHVsPgorICAgIDxsaT5DbG9zZSBhbnkgb3BlbmVkIGNvbm5lY3Rpb25zIHRvIHRoZSBkaXJlY3Rvcnkgc2VydmVyLjwvbGk+CisgICAgPC91bD4KKworCisgICAgPGgzPk1ldGhvZCBhdXRoZW50aWNhdGUoKSBGdW5jdGlvbmFsaXR5PC9oMz4KKworICAgIDxwPldoZW4gPGNvZGU+YXV0aGVudGljYXRlKCk8L2NvZGU+IGlzIGNhbGxlZCwgdGhlIGZvbGxvd2luZyBwcm9jZXNzaW5nCisgICAgaXMgcmVxdWlyZWQ6PC9wPgorICAgIDx1bD4KKyAgICA8bGk+QWNxdWlyZSB0aGUgb25lIGFuZCBvbmx5IGNvbm5lY3Rpb24gW0N1cnJlbnRdIG9yIGFjcXVpcmUgYSBjb25uZWN0aW9uCisgICAgICAgIGZyb20gdGhlIGNvbm5lY3Rpb24gcG9vbCBbUmVxdWVzdGVkXS48L2xpPgorICAgIDxsaT5BdXRoZW50aWNhdGUgdGhlIHVzZXIgYnkgcmV0cmlldmluZyB0aGUgdXNlcidzIERpc3Rpbmd1aXNoZWQgTmFtZSwKKyAgICAgICAgYmFzZWQgb24gdGhlIHNwZWNpZmllZCB1c2VybmFtZSBhbmQgcGFzc3dvcmQuPC9saT4KKyAgICA8bGk+SWYgdGhlIHVzZXIgd2FzIG5vdCBhdXRoZW50aWNhdGVkLCByZWxlYXNlIHRoZSBhbGxvY2F0ZWQgY29ubmVjdGlvbgorICAgICAgICBhbmQgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LjwvbGk+CisgICAgPGxpPkFjcXVpcmUgYSA8Y29kZT5MaXN0PC9jb2RlPiBvZiB0aGUgc2VjdXJpdHkgcm9sZXMgYXNzaWduZWQgdG8gdGhlCisgICAgICAgIGF1dGhlbnRpY2F0ZWQgdXNlci48L2xpPgorICAgIDxsaT5Db25zdHJ1Y3QgYSBuZXcgaW5zdGFuY2Ugb2YgY2xhc3MKKyAgICAgICAgPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5yZWFsbS5HZW5lcmljUHJpbmNpcGFsPC9jb2RlPiwgcGFzc2luZyBhcworICAgICAgICBjb25zdHJ1Y3RvciBhcmd1bWVudHM6ICB0aGlzIHJlYWxtIGluc3RhbmNlLCB0aGUgYXV0aGVudGljYXRlZAorICAgICAgICB1c2VybmFtZSwgYW5kIGEgPGNvZGU+TGlzdDwvY29kZT4gb2YgdGhlIHNlY3VyaXR5IHJvbGVzIGFzc29jaWF0ZWQKKyAgICAgICAgd2l0aCB0aGlzIHVzZXIuPC9saT4KKyAgICA8bGk+PHN0cm9uZz5XQVJOSU5HPC9zdHJvbmc+IC0gRG8gbm90IGF0dGVtcHQgdG8gY2FjaGUgYW5kIHJldXNlIHByZXZpb3VzCisgICAgICAgIDxjb2RlPkdlbmVyaWNQcmluY2lwYWw8L2NvZGU+IG9iamVjdHMgZm9yIGEgcGFydGljdWxhciB1c2VyLCBiZWNhdXNlCisgICAgICAgIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgZGlyZWN0b3J5IHNlcnZlciBtaWdodCBoYXZlIGNoYW5nZWQgc2luY2UgdGhlCisgICAgICAgIGxhc3QgdGltZSB0aGlzIHVzZXIgd2FzIGF1dGhlbnRpY2F0ZWQuPC9saT4KKyAgICA8bGk+UmV0dXJuIHRoZSBuZXdseSBjb25zdHJ1Y3RlZCA8Y29kZT5HZW5lcmljUHJpbmNpcGFsPC9jb2RlPi48L2xpPgorICAgIDwvdWw+CisKKworICAgIDxoMz5NZXRob2QgaGFzUm9sZSgpIEZ1bmN0aW9uYWxpdHk8L2gzPgorCisgICAgPHA+V2hlbiA8Y29kZT5oYXNSb2xlKCk8L2NvZGU+IGlzIGNhbGxlZCwgdGhlIGZvbGxvd2luZyBwcm9jZXNzaW5nCisgICAgaXMgcmVxdWlyZWQ6PC9wPgorICAgIDx1bD4KKyAgICA8bGk+VGhlIDxjb2RlPnByaW5jaXBhbDwvY29kZT4gdGhhdCBpcyBwYXNzZWQgYXMgYW4gYXJndW1lbnQgU0hPVUxECisgICAgICAgIGJlIG9uZSB0aGF0IHdlIHJldHVybmVkIChpbnN0YW5jZW9mIGNsYXNzCisgICAgICAgIDxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEucmVhbG0uR2VuZXJpY1ByaW5jaXBhbDwvY29kZT4sIHdpdGggYQorICAgICAgICA8Y29kZT5yZWFsbTwvY29kZT4gcHJvcGVydHkgdGhhdCBpcyBlcXVhbCB0byBvdXIgaW5zdGFuY2UuPC9saT4KKyAgICA8bGk+SWYgdGhlIHBhc3NlZCA8Y29kZT5wcmluY2lwYWw8L2NvZGU+IG1lZXRzIHRoZXNlIGNyaXRlcmlhLCBjaGVjaworICAgICAgICB0aGUgc3BlY2lmaWVkIHJvbGUgYWdhaW5zdCB0aGUgbGlzdCByZXR1cm5lZCBieQorICAgICAgICA8Y29kZT5nZXRSb2xlcygpPC9jb2RlPiwgYW5kIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUKKyAgICAgICAgc3BlY2lmaWVkIHJvbGUgaXMgaW5jbHVkZWQ7IG90aGVyd2lzZSwgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPi48L2xpPgorICAgIDxsaT5JZiB0aGUgcGFzc2VkIDxjb2RlPnByaW5jaXBhbDwvY29kZT4gZG9lcyBub3QgbWVldCB0aGVzZSBjcml0ZXJpYSwKKyAgICAgICAgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPi48L2xpPgorICAgIDwvdWw+CisKKyAgPC9zdWJzZWN0aW9uPgorCisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iVXNlcm5hbWUgTG9naW4gTW9kZSBGdW5jdGlvbmFsaXR5Ij4KKworICAgIDxoMz5Db25maWd1cmFibGUgUHJvcGVydGllczwvaDM+CisKKyAgICA8cD5UaGUgaW1wbGVtZW50YXRpb24gc2hhbGwgc3VwcG9ydCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXMKKyAgICB0aGF0IGNhbiBiZSBjb25maWd1cmVkIHdpdGggSmF2YUJlYW5zIHByb3BlcnR5IHNldHRlcnM6PC9wPgorICAgIDx1bD4KKyAgICA8bGk+PGNvZGU+Y29ubmVjdGlvblVSTDwvY29kZT4gLSBVUkwgb2YgdGhlIGRpcmVjdG9yeSBzZXJ2ZXIgd2Ugd2lsbAorICAgICAgICBiZSBjb250YWN0aW5nLjwvbGk+CisgICAgPGxpPjxjb2RlPmNvbnRleHRGYWN0b3J5PC9jb2RlPiAtIEZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBKTkRJCisgICAgICAgIGNvbnRleHQgZmFjdG9yeSB1c2VkIHRvIHJldHJpZXZlIG91ciBJbml0aWFsQ29udGV4dC4KKyAgICAgICAgW2NvbS5zdW4uam5kaS5sZGFwLkxkYXBDdHhGYWN0b3J5XTwvbGk+CisgICAgPGxpPkFkZGl0aW9uYWwgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIHJlcXVpcmVkIHRvIGVzdGFibGlzaCB0aGUKKyAgICAgICAgYXBwcm9wcmlhdGUgY29ubmVjdGlvbi4gIFtSZXF1ZXN0ZWRdPC9saT4KKyAgICA8bGk+Q29ubmVjdGlvbiBwb29sIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcy4gIFtSZXF1ZXN0ZWRdPC9saT4KKyAgICA8bGk+Q29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIGRlZmluaW5nIGlmIGFuZCBob3cgYSB1c2VyIG1pZ2h0IGJlIGxvb2tlZAorICAgICAgICB1cCBiZWZvcmUgYmluZGluZyB0byB0aGUgZGlyZWN0b3J5IHNlcnZlci4gIFRoZSBmb2xsb3dpbmcgYXBwcm9hY2hlcworICAgICAgICBzaG91bGQgYmUgc3VwcG9ydGVkOgorICAgICAgICA8dWw+CisgICAgICAgIDxsaT5ObyBwcmV2aW91cyBsb29rdXAgaXMgcmVxdWlyZWQgLSB1c2VybmFtZSBzcGVjaWZpZWQgYnkgdGhlIHVzZXIKKyAgICAgICAgICAgIGlzIHRoZSBzYW1lIGFzIHRoYXQgdXNlZCB0byBhdXRoZW50aWNhdGUgdG8gdGhlIGRpcmVjdG9yeQorICAgICAgICAgICAgc2VydmVyLjwvbGk+CisgICAgICAgIDxsaT5TdWJzdGl0dXRlIHRoZSBzcGVjaWZpZWQgdXNlcm5hbWUgaW50byBhIHN0cmluZy48L2xpPgorICAgICAgICA8bGk+U2VhcmNoIHRoZSBkaXJlY3Rvcnkgc2VydmVyIGJhc2VkIG9uIGNvbmZpZ3VyZWQgY3JpdGVyaWEgdG8KKyAgICAgICAgICAgIHJldHJpZXZlIHRoZSBkaXN0aW5ndWlzaGVkIG5hbWUgb2YgdGhlIHVzZXIsIHRoZW4gYXR0ZW1wdCB0bworICAgICAgICAgICAgYmluZCB3aXRoIHRoYXQgZGlzdGluZ3Vpc2hlZCBuYW1lLjwvbGk+CisgICAgICAgIDwvdWw+PC9saT4KKyAgICA8bGk+Q29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIGRlZmluaW5nIGhvdyB0aGUgcm9sZXMgYXNzb2NpYXRlZCB3aXRoIGEKKyAgICAgICAgcGFydGljdWxhciBhdXRoZW50aWNhdGVkIHVzZXIgY2FuIGJlIHJldHJpZXZlZC4gIFRoZSBmb2xsb3dpbmcKKyAgICAgICAgYXBwcm9hY2hlcyBzaG91bGQgYmUgc3VwcG9ydGVkOgorICAgICAgICA8dWw+CisgICAgICAgIDxsaT5SZXRyaWV2ZSBhIHNwZWNpZmllZCBhdHRyaWJ1dGUgKHBvc3NpYmx5IG11bHRpLXZhbHVlZCkKKyAgICAgICAgICAgIGZyb20gYW4gTERBUCBzZWFyY2ggZXhwcmVzc2lvbiwKKyAgICAgICAgICAgIHdpdGggYSByZXBsYWNlbWVudCBwbGFjZWhvbGRlciBmb3IgdGhlIEROIG9mIHRoZSB1c2VyLgorICAgICAgICAgICAgW0N1cnJlbnRdPC9saT4KKyAgICAgICAgPC91bD48L2xpPgorICAgIDwvdWw+CisKKyAgICA8aDM+TGlmZWN5Y2xlIEZ1bmN0aW9uYWxpdHk8L2gzPgorCisgICAgPHA+VGhlIGZvbGxvd2luZyBwcm9jZXNzaW5nIG11c3QgYmUgcGVyZm9ybWVkIHdoZW4gdGhlIDxjb2RlPnN0YXJ0KCk8L2NvZGU+CisgICAgbWV0aG9kIGlzIGNhbGxlZDo8L3A+CisgICAgPHVsPgorICAgIDxsaT5Ob25lIHJlcXVpcmVkLjwvbGk+CisgICAgPC91bD4KKworICAgIDxwPlRoZSBmb2xsb3dpbmcgcHJvY2Vzc2luZyBtdXN0IGJlIHBlcmZvcm1lZCB3aGVuIHRoZSA8Y29kZT5zdG9wKCk8L2NvZGU+CisgICAgbWV0aG9kIGlzIGNhbGxlZDo8L3A+CisgICAgPHVsPgorICAgIDxsaT5Ob25lIHJlcXVpcmVkLjwvbGk+CisgICAgPC91bD4KKworCisgICAgPGgzPk1ldGhvZCBhdXRoZW50aWNhdGUoKSBGdW5jdGlvbmFsaXR5PC9oMz4KKworICAgIDxwPldoZW4gPGNvZGU+YXV0aGVudGljYXRlKCk8L2NvZGU+IGlzIGNhbGxlZCwgdGhlIGZvbGxvd2luZyBwcm9jZXNzaW5nCisgICAgaXMgcmVxdWlyZWQ6PC9wPgorICAgIDx1bD4KKyAgICA8bGk+QXR0ZW1wdCB0byBiaW5kIHRvIHRoZSBkaXJlY3Rvcnkgc2VydmVyLCB1c2luZyB0aGUgdXNlcm5hbWUgYW5kCisgICAgICAgIHBhc3N3b3JkIHByb3ZpZGVkIGJ5IHRoZSB1c2VyLjwvbGk+CisgICAgPGxpPklmIHRoZSB1c2VyIHdhcyBub3QgYXV0aGVudGljYXRlZCwgcmVsZWFzZSB0aGUgYWxsb2NhdGVkIGNvbm5lY3Rpb24KKyAgICAgICAgYW5kIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi48L2xpPgorICAgIDxsaT5BY3F1aXJlIGEgPGNvZGU+TGlzdDwvY29kZT4gb2YgdGhlIHNlY3VyaXR5IHJvbGVzIGFzc2lnbmVkIHRvIHRoZQorICAgICAgICBhdXRoZW50aWNhdGVkIHVzZXIuPC9saT4KKyAgICA8bGk+Q29uc3RydWN0IGEgbmV3IGluc3RhbmNlIG9mIGNsYXNzCisgICAgICAgIDxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEucmVhbG0uR2VuZXJpY1ByaW5jaXBhbDwvY29kZT4sIHBhc3NpbmcgYXMKKyAgICAgICAgY29uc3RydWN0b3IgYXJndW1lbnRzOiAgdGhpcyByZWFsbSBpbnN0YW5jZSwgdGhlIGF1dGhlbnRpY2F0ZWQKKyAgICAgICAgdXNlcm5hbWUsIGFuZCBhIDxjb2RlPkxpc3Q8L2NvZGU+IG9mIHRoZSBzZWN1cml0eSByb2xlcyBhc3NvY2lhdGVkCisgICAgICAgIHdpdGggdGhpcyB1c2VyLjwvbGk+CisgICAgPGxpPjxzdHJvbmc+V0FSTklORzwvc3Ryb25nPiAtIERvIG5vdCBhdHRlbXB0IHRvIGNhY2hlIGFuZCByZXVzZSBwcmV2aW91cworICAgICAgICA8Y29kZT5HZW5lcmljUHJpbmNpcGFsPC9jb2RlPiBvYmplY3RzIGZvciBhIHBhcnRpY3VsYXIgdXNlciwgYmVjYXVzZQorICAgICAgICB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIGRpcmVjdG9yeSBzZXJ2ZXIgbWlnaHQgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZQorICAgICAgICBsYXN0IHRpbWUgdGhpcyB1c2VyIHdhcyBhdXRoZW50aWNhdGVkLjwvbGk+CisgICAgPGxpPlJldHVybiB0aGUgbmV3bHkgY29uc3RydWN0ZWQgPGNvZGU+R2VuZXJpY1ByaW5jaXBhbDwvY29kZT4uPC9saT4KKyAgICA8L3VsPgorCisKKyAgICA8aDM+TWV0aG9kIGhhc1JvbGUoKSBGdW5jdGlvbmFsaXR5PC9oMz4KKworICAgIDxwPldoZW4gPGNvZGU+aGFzUm9sZSgpPC9jb2RlPiBpcyBjYWxsZWQsIHRoZSBmb2xsb3dpbmcgcHJvY2Vzc2luZworICAgIGlzIHJlcXVpcmVkOjwvcD4KKyAgICA8dWw+CisgICAgPGxpPlRoZSA8Y29kZT5wcmluY2lwYWw8L2NvZGU+IHRoYXQgaXMgcGFzc2VkIGFzIGFuIGFyZ3VtZW50IFNIT1VMRAorICAgICAgICBiZSBvbmUgdGhhdCB3ZSByZXR1cm5lZCAoaW5zdGFuY2VvZiBjbGFzcworICAgICAgICA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtLkdlbmVyaWNQcmluY2lwYWw8L2NvZGU+LCB3aXRoIGEKKyAgICAgICAgPGNvZGU+cmVhbG08L2NvZGU+IHByb3BlcnR5IHRoYXQgaXMgZXF1YWwgdG8gb3VyIGluc3RhbmNlLjwvbGk+CisgICAgPGxpPklmIHRoZSBwYXNzZWQgPGNvZGU+cHJpbmNpcGFsPC9jb2RlPiBtZWV0cyB0aGVzZSBjcml0ZXJpYSwgY2hlY2sKKyAgICAgICAgdGhlIHNwZWNpZmllZCByb2xlIGFnYWluc3QgdGhlIGxpc3QgcmV0dXJuZWQgYnkKKyAgICAgICAgPGNvZGU+Z2V0Um9sZXMoKTwvY29kZT4sIGFuZCByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlCisgICAgICAgIHNwZWNpZmllZCByb2xlIGlzIGluY2x1ZGVkOyBvdGhlcndpc2UsIHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4uPC9saT4KKyAgICA8bGk+SWYgdGhlIHBhc3NlZCA8Y29kZT5wcmluY2lwYWw8L2NvZGU+IGRvZXMgbm90IG1lZXQgdGhlc2UgY3JpdGVyaWEsCisgICAgICAgIHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4uPC9saT4KKyAgICA8L3VsPgorCisgIDwvc3Vic2VjdGlvbj4KKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IlRlc3RhYmxlIEFzc2VydGlvbnMiPgorCisgIDxwPkluIGFkZGl0aW9uIHRoZSB0aGUgYXNzZXJ0aW9ucyBpbXBsaWVkIGJ5IHRoZSBmdW5jdGlvbmFsaXR5IHJlcXVpcmVtZW50cworICBsaXN0ZWQgYWJvdmUsIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBhc3NlcnRpb25zIHNoYWxsIGJlIHRlc3RlZCB0bworICB2YWxpZGF0ZSB0aGUgYmVoYXZpb3Igb2YgPGNvZGU+Sk5ESVJlYWxtPC9jb2RlPjo8L3A+CisgIDx1bD4KKyAgPC91bD4KKworPC9zZWN0aW9uPgorCisKKzwvYm9keT4KKworPC9kb2N1bWVudD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvZnVuY3NwZWNzL2ZzLW1lbW9yeS1yZWFsbS54bWwgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2Z1bmNzcGVjcy9mcy1tZW1vcnktcmVhbG0ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2ZDhhYjYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2Z1bmNzcGVjcy9mcy1tZW1vcnktcmVhbG0ueG1sCkBAIC0wLDAgKzEsMjM5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhRE9DVFlQRSBkb2N1bWVudCBbCisgIDwhRU5USVRZIHByb2plY3QgU1lTVEVNICJwcm9qZWN0LnhtbCI+CitdPgorPGRvY3VtZW50IHVybD0iZnMtbWVtb3J5LXJlYWxtLmh0bWwiPgorCisgICZwcm9qZWN0OworCisgIDxwcm9wZXJ0aWVzPgorICAgIDxhdXRob3IgZW1haWw9ImNyYWlnbWNjQGFwYWNoZS5vcmciPkNyYWlnIE1jQ2xhbmFoYW48L2F1dGhvcj4KKyAgICA8dGl0bGU+TWVtb3J5UmVhbG08L3RpdGxlPgorICAgIDxyZXZpc2lvbj4kSWQkPC9yZXZpc2lvbj4KKyAgPC9wcm9wZXJ0aWVzPgorCis8Ym9keT4KKworCis8c2VjdGlvbiBuYW1lPSJPdmVydmlldyI+CisKKworICA8c3Vic2VjdGlvbiBuYW1lPSJJbnRyb2R1Y3Rpb24iPgorCisgICAgPHA+VGhlIHB1cnBvc2Ugb2YgdGhlIDxzdHJvbmc+TWVtb3J5UmVhbG08L3N0cm9uZz4gaW1wbGVtZW50YXRpb24gaXMgdG8KKyAgICBwcm92aWRlIGEgbWVjaGFuaXNtIGJ5IHdoaWNoIFRvbWNhdCA1IGNhbiBhY3F1aXJlIGluZm9ybWF0aW9uIG5lZWRlZAorICAgIHRvIGF1dGhlbnRpY2F0ZSB3ZWIgYXBwbGljYXRpb24gdXNlcnMsIGFuZCBkZWZpbmUgdGhlaXIgc2VjdXJpdHkgcm9sZXMsCisgICAgZnJvbSBhIHNpbXBsZSB0ZXh0LWJhc2VkIGNvbmZpZ3VyYXRpb24gZmlsZSBpbiBYTUwgZm9ybWF0LiAgVGhpcyBpcworICAgIGludGVuZGVkIHRvIHNpbXBsaWZ5IHRoZSBpbml0aWFsIGluc3RhbGxhdGlvbiBhbmQgb3BlcmF0aW9uIG9mIFRvbWNhdCA1LAorICAgIHdpdGhvdXQgdGhlIGNvbXBsZXhpdHkgb2YgY29uZmlndXJpbmcgYSBkYXRhYmFzZSBvciBkaXJlY3Rvcnkgc2VydmVyCisgICAgYmFzZWQgUmVhbG0uICBJdCBpcyBub3QgaW50ZW5kZWQgZm9yIHByb2R1Y3Rpb24gdXNlLjwvcD4KKworICAgIDxwPlRoaXMgc3BlY2lmaWNhdGlvbiByZWZsZWN0cyBhIGNvbWJpbmF0aW9uIG9mIGZ1bmN0aW9uYWxpdHkgdGhhdCBpcworICAgIGFscmVhZHkgcHJlc2VudCBpbiB0aGUgPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5yZWFsbS5NZW1vcnlSZWFsbTwvY29kZT4KKyAgICBjbGFzcywgYXMgd2VsbCBhcyByZXF1aXJlbWVudHMgZm9yIGVuaGFuY2VtZW50cyB0aGF0IGhhdmUgYmVlbgorICAgIGRpc2N1c3NlZC4gIFdoZXJlIGFwcHJvcHJpYXRlLCByZXF1aXJlbWVudHMgc3RhdGVtZW50cyBhcmUgbWFya2VkCisgICAgPGVtPltDdXJyZW50XTwvZW0+IGFuZCA8ZW0+W1JlcXVlc3RlZF08L2VtPiB0byBkaXN0aW5ndWlzaCB0aGVtLjwvcD4KKworICAgIDxwPlRoZSBjdXJyZW50IHN0YXR1cyBvZiB0aGlzIGZ1bmN0aW9uYWwgc3BlY2lmaWNhdGlvbiBpcworICAgIDxzdHJvbmc+UFJPUE9TRUQ8L3N0cm9uZz4uICBJdCBoYXMgbm90IHlldCBiZWVuIGRpc2N1c3NlZCBhbmQKKyAgICBhZ3JlZWQgdG8gb24gdGhlIFRPTUNBVC1ERVYgbWFpbGluZyBsaXN0LjwvcD4KKworICA8L3N1YnNlY3Rpb24+CisKKworICA8c3Vic2VjdGlvbiBuYW1lPSJFeHRlcm5hbCBTcGVjaWZpY2F0aW9ucyI+CisKKyAgICA8cD5UaGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBmdW5jdGlvbmFsaXR5IGRlcGVuZHMgb24gdGhlIGZvbGxvd2luZworICAgIGV4dGVybmFsIHNwZWNpZmljYXRpb25zOjwvcD4KKyAgICA8dWw+CisgICAgPGxpPk5vbmU8L2xpPgorICAgIDwvdWw+CisKKyAgPC9zdWJzZWN0aW9uPgorCisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iSW1wbGVtZW50YXRpb24gUmVxdWlyZW1lbnRzIj4KKworICAgIDxwPlRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGZ1bmN0aW9uYWxpdHkgc2hhbGwgY29uZm9ybSB0byB0aGUKKyAgICBmb2xsb3dpbmcgcmVxdWlyZW1lbnRzOjwvcD4KKyAgICA8dWw+CisgICAgPGxpPkJlIHJlYWxpemVkIGluIG9uZSBvciBtb3JlIGltcGxlbWVudGF0aW9uIGNsYXNzZXMuPC9saT4KKyAgICA8bGk+SW1wbGVtZW50IHRoZSA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLlJlYWxtPC9jb2RlPiBpbnRlcmZhY2UuCisgICAgICAgIFtDdXJyZW50XTwvbGk+CisgICAgPGxpPkltcGxlbWVudCB0aGUgPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGU8L2NvZGU+CisgICAgICAgIGludGVyZmFjZS4gIFtDdXJyZW50XTwvbGk+CisgICAgPGxpPlN1YmNsYXNzIHRoZSA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtLlJlYWxtQmFzZTwvY29kZT4KKyAgICAgICAgYmFzZSBjbGFzcy48L2xpPgorICAgIDxsaT5MaXZlIGluIHRoZSA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtPC9jb2RlPiBwYWNrYWdlLgorICAgICAgICBbQ3VycmVudF08L2xpPgorICAgIDxsaT5TdXBwb3J0IGEgY29uZmlndXJhYmxlIGRlYnVnZ2luZyBkZXRhaWwgbGV2ZWwuIFtDdXJyZW50XTwvbGk+CisgICAgPGxpPkxvZyBkZWJ1Z2dpbmcgYW5kIG9wZXJhdGlvbmFsIG1lc3NhZ2VzIChzdWl0YWJseSBpbnRlcm5hdGlvbmFsaXplZCkKKyAgICAgICAgdmlhIHRoZSA8Y29kZT5nZXRDb250YWluZXIoKS5sb2coKTwvY29kZT4gbWV0aG9kLiBbQ3VycmVudF08L2xpPgorICAgIDwvdWw+CisKKyAgPC9zdWJzZWN0aW9uPgorCisKKzwvc2VjdGlvbj4KKworCis8c2VjdGlvbiBuYW1lPSJEZXBlbmRlbmNpZXMiPgorCisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iRW52aXJvbm1lbnRhbCBEZXBlbmRlbmNpZXMiPgorCisgICAgPHA+VGhlIGZvbGxvd2luZyBlbnZpcm9ubWVudGFsIGRlcGVuZGVuY2llcyBtdXN0IGJlIG1ldCBpbiBvcmRlciBmb3IKKyAgICBNZW1vcnlSZWFsbSB0byBvcGVyYXRlIGNvcnJlY3RseTo8L3A+CisgICAgPHVsPgorICAgIDxsaT5UaGUgZGVzaXJlIHRvIHV0aWxpemUgTWVtb3J5UmVhbG0gbXVzdCBiZSByZWdpc3RlcmVkIGluCisgICAgICAgIDxjb2RlPiRDQVRBTElOQV9IT01FL2NvbmYvc2VydmVyLnhtbDwvY29kZT4sIGluIGEKKyAgICAgICAgPGNvZGU+Jmx0O1JlYWxtJmd0OzwvY29kZT4gZWxlbWVudCB0aGF0IGlzIG5lc3RlZCBpbnNpZGUgYQorICAgICAgICBjb3JyZXNwb25kaW5nIDxjb2RlPiZsdDtFbmdpbmUmZ3Q7PC9jb2RlPiwgPGNvZGU+Jmx0O0hvc3QmZ3Q7PC9jb2RlPiwKKyAgICAgICAgb3IgPGNvZGU+Jmx0O0NvbnRleHQmZ3Q7PC9jb2RlPiBlbGVtZW50LiAgKFRoaXMgaXMgYWxyZWFkeQorICAgICAgICBpbmNsdWRlZCBpbiB0aGUgZGVmYXVsdCA8Y29kZT5zZXJ2ZXIueG1sPC9jb2RlPiBmaWxlLik8L2xpPgorICAgIDwvdWw+CisKKyAgPC9zdWJzZWN0aW9uPgorCisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iQ29udGFpbmVyIERlcGVuZGVuY2llcyI+CisKKyAgICA8cD5Db3JyZWN0IG9wZXJhdGlvbiBvZiBNZW1vcnlSZWFsbSBkZXBlbmRzIG9uIHRoZSBmb2xsb3dpbmcKKyAgICBzcGVjaWZpYyBmZWF0dXJlcyBvZiB0aGUgc3Vycm91bmRpbmcgY29udGFpbmVyOjwvcD4KKyAgICA8dWw+CisgICAgPGxpPkludGVyYWN0aW9ucyB3aXRoIDxjb2RlPk1lbW9yeVJlYWxtPC9jb2RlPiB3aWxsIGJlIGluaXRpYXRlZCBieQorICAgICAgICB0aGUgYXBwcm9wcmlhdGUgPGNvZGU+QXV0aGVudGljYXRvcjwvY29kZT4gaW1wbGVtZW50YXRpb24sIGJhc2VkCisgICAgICAgIG9uIHRoZSBsb2dpbiBtZXRob2QgdGhhdCBpcyBzZWxlY3RlZC48L2xpPgorICAgIDxsaT48Y29kZT5NZW1vcnlSZWFsbTwvY29kZT4gbXVzdCBoYXZlIGFuIFhNTCBwYXJzZXIgY29tcGF0aWJsZSB3aXRoCisgICAgICAgIHRoZSBKQVhQLzEuMSBBUElzIGF2YWlsYWJsZSB0byBpdC4gIFRoaXMgaXMgbm9ybWFsbHkgYWNjb21wbGlzaGVkCisgICAgICAgIGJ5IHBsYWNpbmcgdGhlIGNvcnJlc3BvbmRpbmcgSkFSIGZpbGVzIGluIGRpcmVjdG9yeQorICAgICAgICA8Y29kZT4kQ0FUQUxJTkFfSE9NRS9zZXJ2ZXIvbGliPC9jb2RlPiAodG8gbWFrZSB0aGVtIHZpc2libGUgb25seQorICAgICAgICB0byBpbnRlcm5hbCBDYXRhbGluYSBjbGFzc2VzKSBvciBpbiBkaXJlY3RvcnkKKyAgICAgICAgPGNvZGU+JENBVEFMSU5BX0hPTUUvY29tbW9uL2xpYjwvY29kZT4gKHRvIG1ha2UgdGhlbSB2aXNpYmxlIHRvCisgICAgICAgIENhdGFsaW5hIGludGVybmFsIGNsYXNzZXMgPHN0cm9uZz5hbmQ8L3N0cm9uZz4gaW5zdGFsbGVkIHdlYgorICAgICAgICBhcHBsaWNhdGlvbnMpLjwvbGk+CisgICAgPC91bD4KKworICA8L3N1YnNlY3Rpb24+CisKKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IkZ1bmN0aW9uYWxpdHkiPgorCisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iT3ZlcnZpZXcgb2YgT3BlcmF0aW9uIj4KKworICAgIDxwPlRoZSBtYWluIHB1cnBvc2Ugb2YgPGNvZGU+TWVtb3J5UmVhbG08L2NvZGU+IGlzIHRvIGFsbG93IENhdGFsaW5hIHRvCisgICAgYXV0aGVudGljYXRlIHVzZXJzLCBhbmQgbG9vayB1cCB0aGUgY29ycmVzcG9uZGluZyBzZWN1cml0eSByb2xlcywgZnJvbQorICAgIHRoZSBpbmZvcm1hdGlvbiBmb3VuZCBpbiBhbiBYTUwtZm9ybWF0IGNvbmZpZ3VyYXRpb24gZmlsZS4gIFRoZSBmb3JtYXQKKyAgICBvZiB0aGlzIGZpbGUgaXMgZGVzY3JpYmVkIGJlbG93LiAgV2hlbiBhIDxjb2RlPk1lbW9yeVJlYWxtPC9jb2RlPgorICAgIGluc3RhbmNlIGlzIHN0YXJ0ZWQsIGl0IHdpbGwgcmVhZCB0aGUgY29udGVudHMgb2YgdGhpcyBYTUwgZmlsZSBhbmQgY3JlYXRlCisgICAgYW4gImluIG1lbW9yeSBkYXRhYmFzZSIgb2YgYWxsIHRoZSB2YWxpZCB1c2VycyBhbmQgdGhlaXIgYXNzb2NpYXRlZAorICAgIHNlY3VyaXR5IHJvbGVzLjwvcD4KKworICAgIDxwPkVhY2ggdGltZSB0aGF0IENhdGFsaW5hIG5lZWRzIHRvIGF1dGhlbnRpY2F0ZSBhIHVzZXIsIGl0IHdpbGwgY2FsbAorICAgIHRoZSA8Y29kZT5hdXRoZW50aWNhdGUoKTwvY29kZT4gbWV0aG9kIG9mIHRoaXMgUmVhbG0gaW1wbGVtZW50YXRpb24sCisgICAgcGFzc2luZyB0aGUgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIHRoYXQgd2VyZSBzcGVjaWZpZWQgYnkgdGhlIHVzZXIuICBJZgorICAgIHdlIGZpbmQgdGhlIHVzZXIgaW4gdGhlIGRhdGFiYXNlIChhbmQgbWF0Y2ggb24gdGhlIHBhc3N3b3JkKSwgd2UgYWNjdW11bGF0ZQorICAgIGFsbCBvZiB0aGUgc2VjdXJpdHkgcm9sZXMgdGhhdCBhcmUgZGVmaW5lZCBmb3IgdGhpcyB1c2VyLCBhbmQgY3JlYXRlIGEKKyAgICBuZXcgPGNvZGU+R2VuZXJpY1ByaW5jaXBhbDwvY29kZT4gb2JqZWN0IHRvIGJlIHJldHVybmVkLiAgSWYgdGhlIHVzZXIKKyAgICBpcyBub3QgYXV0aGVudGljYXRlZCwgd2UgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGluc3RlYWQuICBUaGUKKyAgICA8Y29kZT5HZW5lcmljVXNlcjwvY29kZT4gb2JqZWN0IGNhY2hlcyB0aGUgc2V0IG9mIHNlY3VyaXR5IHJvbGVzIHRoYXQKKyAgICB3ZXJlIG93bmVkIGJ5IHRoaXMgdXNlciBhdCB0aGUgdGltZSBvZiBhdXRoZW50aWNhdGlvbiwgc28gdGhhdCBjYWxscyB0bworICAgIDxjb2RlPmlzVXNlckluUm9sZSgpPC9jb2RlPiBjYW4gYmUgYW5zd2VyZWQgd2l0aG91dCBnb2luZyBiYWNrIHRvIHRoZQorICAgIGRhdGFiYXNlIGV2ZXJ5IHRpbWUuPC9wPgorCisgIDwvc3Vic2VjdGlvbj4KKworCisgIDxzdWJzZWN0aW9uIG5hbWU9IkRldGFpbGVkIEZ1bmN0aW9uYWwgUmVxdWlyZW1lbnRzIj4KKworCisgICAgPGgzPkNvbmZpZ3VyYWJsZSBQcm9wZXJ0aWVzPC9oMz4KKworICAgIDxwPlRoZSBpbXBsZW1lbnRhdGlvbiBzaGFsbCBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgcHJvcGVydGllcworICAgIHRoYXQgY2FuIGJlIGNvbmZpZ3VyZWQgd2l0aCBKYXZhQmVhbnMgcHJvcGVydHkgc2V0dGVyczo8L3A+CisgICAgPHVsPgorICAgIDxsaT5Db25maWd1cmFibGUgZGVidWdnaW5nIGRldGFpbCBsZXZlbC48L2xpPgorICAgIDxsaT5Db25maWd1cmFibGUgZmlsZSBwYXRobmFtZSAoYWJzb2x1dGUgb3IgcmVsYXRpdmUgdG8KKyAgICAgICAgPGNvZGU+JENBVEFMSU5BX0hPTUU8L2NvZGU+IG9mIHRoZSBYTUwgZmlsZSBjb250YWluaW5nIG91cgorICAgICAgICBkZWZpbmVkIHVzZXJzLiAgWzxjb2RlPmNvbmYvdG9tY2F0LXVzZXJzLnhtbDwvY29kZT5dLjwvbGk+CisgICAgPC91bD4KKworICAgIDxoMz5MaWZlY3ljbGUgRnVuY3Rpb25hbGl0eTwvaDM+CisKKyAgICA8cD5UaGUgZm9sbG93aW5nIHByb2Nlc3NpbmcgbXVzdCBiZSBwZXJmb3JtZWQgd2hlbiB0aGUgPGNvZGU+c3RhcnQoKTwvY29kZT4KKyAgICBtZXRob2QgaXMgY2FsbGVkOjwvcD4KKyAgICA8dWw+CisgICAgPGxpPk9wZW4gYW5kIHBhcnNlIHRoZSBzcGVjaWZpZWQgWE1MIGZpbGUuPC9saT4KKyAgICA8bGk+Q3JlYXRlIGFuIGluLW1lbW9yeSBkYXRhYmFzZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgWE1MIGZpbGUKKyAgICAgICAgY29udGVudHMuPC9saT4KKyAgICA8bGk+PHN0cm9uZz5OT1RFPC9zdHJvbmc+IC0gVGhlcmUgaXMgbm8gcmVxdWlyZW1lbnQgdG8gcmVjb2duaXplCisgICAgICAgIHN1YnNlcXVlbnQgY2hhbmdlcyB0byB0aGUgY29udGVudHMgb2YgdGhlIFhNTCBmaWxlLjwvbGk+CisgICAgPC91bD4KKworICAgIDxwPlRoZSBmb2xsb3dpbmcgcHJvY2Vzc2luZyBtdXN0IGJlIHBlcmZvcm1lZCB3aGVuIHRoZSA8Y29kZT5zdG9wKCk8L2NvZGU+CisgICAgbWV0aG9kIGlzIGNhbGxlZDo8L3A+CisgICAgPHVsPgorICAgIDxsaT5SZWxlYXNlIG9iamVjdCByZWZlcmVuY2VzIHRvIHRoZSBpbi1tZW1vcnkgZGF0YWJhc2UgcmVwcmVzZW50YXRpb24uPC9saT4KKyAgICA8L3VsPgorCisKKyAgICA8aDM+TWV0aG9kIGF1dGhlbnRpY2F0ZSgpIEZ1bmN0aW9uYWxpdHk8L2gzPgorCisgICAgPHA+V2hlbiA8Y29kZT5hdXRoZW50aWNhdGUoKTwvY29kZT4gaXMgY2FsbGVkLCB0aGUgZm9sbG93aW5nIHByb2Nlc3NpbmcKKyAgICBpcyByZXF1aXJlZDo8L3A+CisgICAgPHVsPgorICAgIDxsaT5TZWxlY3QgdGhlIG9uZSBhbmQgb25seSAidXNlciIgaW5zdGFuY2UgZnJvbSB0aGUgaW4tbWVtb3J5IGRhdGFiYXNlLAorICAgICAgICBiYXNlZCBvbiBtYXRjaGluZyB0aGUgc3BlY2lmaWVkIHVzZXJuYW1lLiAgSWYgdGhlcmUgaXMgbm8gc3VjaAorICAgICAgICBpbnN0YW5jZSwgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LjwvbGk+CisgICAgPGxpPkF1dGhlbnRpY2F0ZSB0aGUgdXNlciBieSBjb21wYXJpbmcgdGhlIChwb3NzaWJseSBlbmNyeXB0ZWQpIHBhc3N3b3JkCisgICAgICAgIHZhbHVlIHRoYXQgd2FzIHJlY2VpdmVkIGFnYWluc3QgdGhlIHBhc3N3b3JkIHByZXNlbnRlZCBieSB0aGUgdXNlci4KKyAgICAgICAgSWYgdGhlcmUgaXMgbm8gbWF0Y2gsIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi48L2xpPgorICAgIDxsaT5Db25zdHJ1Y3QgYSBuZXcgaW5zdGFuY2Ugb2YgY2xhc3MKKyAgICAgICAgPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5yZWFsbS5HZW5lcmljUHJpbmNpcGFsPC9jb2RlPiAoaWYgbm90CisgICAgICAgIGFscmVhZHkgdXNpbmcgdGhpcyBhcyB0aGUgaW50ZXJuYWwgZGF0YWJhc2UgcmVwcmVzZW50YXRpb24pIHRoYXQKKyAgICAgICAgY29udGFpbnMgdGhlIGF1dGhlbnRpY2F0ZWQgdXNlcm5hbWUgYW5kIGEgPGNvZGU+TGlzdDwvY29kZT4gb2YgdGhlCisgICAgICAgIHNlY3VyaXR5IHJvbGVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHVzZXIuPC9saT4KKyAgICA8bGk+UmV0dXJuIHRoZSBuZXdseSBjb25zdHJ1Y3RlZCA8Y29kZT5HZW5lcmljUHJpbmNpcGFsPC9jb2RlPi48L2xpPgorICAgIDwvdWw+CisKKworICAgIDxoMz5NZXRob2QgaGFzUm9sZSgpIEZ1bmN0aW9uYWxpdHk8L2gzPgorCisgICAgPHA+V2hlbiA8Y29kZT5oYXNSb2xlKCk8L2NvZGU+IGlzIGNhbGxlZCwgdGhlIGZvbGxvd2luZyBwcm9jZXNzaW5nCisgICAgaXMgcmVxdWlyZWQ6PC9wPgorICAgIDx1bD4KKyAgICA8bGk+VGhlIDxjb2RlPnByaW5jaXBhbDwvY29kZT4gdGhhdCBpcyBwYXNzZWQgYXMgYW4gYXJndW1lbnQgU0hPVUxECisgICAgICAgIGJlIG9uZSB0aGF0IHdlIHJldHVybmVkIChpbnN0YW5jZW9mIGNsYXNzCisgICAgICAgIDxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEucmVhbG0uR2VuZXJpY1ByaW5jaXBhbDwvY29kZT4sIHdpdGggYQorICAgICAgICA8Y29kZT5yZWFsbTwvY29kZT4gcHJvcGVydHkgdGhhdCBpcyBlcXVhbCB0byBvdXIgaW5zdGFuY2UuPC9saT4KKyAgICA8bGk+SWYgdGhlIHBhc3NlZCA8Y29kZT5wcmluY2lwYWw8L2NvZGU+IG1lZXRzIHRoZXNlIGNyaXRlcmlhLCBjaGVjaworICAgICAgICB0aGUgc3BlY2lmaWVkIHJvbGUgYWdhaW5zdCB0aGUgbGlzdCByZXR1cm5lZCBieQorICAgICAgICA8Y29kZT5nZXRSb2xlcygpPC9jb2RlPiwgYW5kIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUKKyAgICAgICAgc3BlY2lmaWVkIHJvbGUgaXMgaW5jbHVkZWQ7IG90aGVyd2lzZSwgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPi48L2xpPgorICAgIDxsaT5JZiB0aGUgcGFzc2VkIDxjb2RlPnByaW5jaXBhbDwvY29kZT4gZG9lcyBub3QgbWVldCB0aGVzZSBjcml0ZXJpYSwKKyAgICAgICAgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPi48L2xpPgorICAgIDwvdWw+CisKKyAgPC9zdWJzZWN0aW9uPgorCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iVGVzdGFibGUgQXNzZXJ0aW9ucyI+CisKKyAgPHA+SW4gYWRkaXRpb24gdGhlIHRoZSBhc3NlcnRpb25zIGltcGxpZWQgYnkgdGhlIGZ1bmN0aW9uYWxpdHkgcmVxdWlyZW1lbnRzCisgIGxpc3RlZCBhYm92ZSwgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIGFzc2VydGlvbnMgc2hhbGwgYmUgdGVzdGVkIHRvCisgIHZhbGlkYXRlIHRoZSBiZWhhdmlvciBvZiA8Y29kZT5NZW1vcnlSZWFsbTwvY29kZT46PC9wPgorICA8dWw+CisgIDwvdWw+CisKKzwvc2VjdGlvbj4KKworCis8L2JvZHk+CisKKzwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9kb2NzL2Z1bmNzcGVjcy9pbmRleC54bWwgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2Z1bmNzcGVjcy9pbmRleC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGIzMDY3OQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvZnVuY3NwZWNzL2luZGV4LnhtbApAQCAtMCwwICsxLDU0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhRE9DVFlQRSBkb2N1bWVudCBbCisgIDwhRU5USVRZIHByb2plY3QgU1lTVEVNICJwcm9qZWN0LnhtbCI+CitdPgorPGRvY3VtZW50IHVybD0iaW5kZXguaHRtbCI+CisKKyAgJnByb2plY3Q7CisKKyAgPHByb3BlcnRpZXM+CisgICAgPGF1dGhvciBlbWFpbD0iY3JhaWdtY2NAYXBhY2hlLm9yZyI+Q3JhaWcgUi4gTWNDbGFuYWhhbjwvYXV0aG9yPgorICAgIDx0aXRsZT5UYWJsZSBvZiBDb250ZW50czwvdGl0bGU+CisgIDwvcHJvcGVydGllcz4KKworPGJvZHk+CisKKworPHNlY3Rpb24gbmFtZT0iQ2F0YWxpbmEgRnVuY3Rpb25hbCBTcGVjaWZpY2F0aW9ucyI+CisKKzxwPlRoaXMgZG9jdW1lbnRhdGlvbiBhcmVhIGluY2x1ZGVzIDxlbT5mdW5jdGlvbmFsIHNwZWNpZmljYXRpb25zPC9lbT4gZm9yCittYW55IGZlYXR1cmVzIHN1cHBvcnRlZCBieSB0aGUgPHN0cm9uZz5DYXRhbGluYTwvc3Ryb25nPiBzZXJ2bGV0IGNvbnRhaW5lcgorcG9ydGlvbiBvZiBUb21jYXQgNS4gIEluIG1vc3QgY2FzZXMsIHRoZXNlIGZlYXR1cmVzIGFyZSBub3QgZG9jdW1lbnRlZCBpbiB0aGUKK3VuZGVybHlpbmcgU2VydmxldCBvciBKU1Agc3BlY2lmaWNhdGlvbnMsIHNvIGEgZGVmaW5pdGlvbiBvZiB0aGUgZXhwZWN0ZWQKK2NvcnJlY3QgYmVoYXZpb3IgaXMgaW1wb3J0YW50IGJvdGggdG8gaW1wbGVtZW50b3JzIG9mIHRob3NlIGZlYXR1cmVzLCBhbmQgdG8KK3Rlc3Qgd3JpdGVycyB0cnlpbmcgdG8gZGVjaWRlIHdoYXQgdG8gdGVzdC48L3A+CisKKzxwPlRoZSBmdW5jdGlvbmFsIHNwZWNpZmljYXRpb25zIGFyZSBkaXZpZGVkIGludG8gdGhlIGZvbGxvd2luZyBjYXRlZ29yaWVzCitpbiB0aGUgbWVudSAodG8gdGhlIGxlZnQpOjwvcD4KKzx1bD4KKzxsaT48ZW0+QWRtaW5pc3RyYXRpdmUgQXBwczwvZW0+IC0gT3ZlcmFsbCByZXF1aXJlbWVudHMgZm9yIHN1cHBvcnRpbmcgYW4KKyAgICBhYmlsaXR5IHRvIGNvbmZpZ3VyZSBhbmQgb3BlcmF0ZSBhIFRvbWNhdCA1IGluc3RhbGxhdGlvbiB0aHJvdWdoIHRvb2xzLAorICAgIGFzIHdlbGwgYXMgZGV0YWlsZWQgcmVxdWlyZW1lbnRzIGZvciB0aGUgdG9vbHMgdGhlbXNlbHZlcy48L2xpPgorPGxpPjxlbT5JbnRlcm5hbCBTZXJ2bGV0czwvZW0+IC0gUmVxdWlyZW1lbnRzIGZvciBDYXRhbGluYSBmZWF0dXJlcyB0aGF0IGFyZQorICAgIGltcGxlbWVudGVkIGFzIGludGVybmFsLCBjb250YWluZXItbWFuYWdlZCwgc2VydmxldHMuPC9saT4KKzxsaT48ZW0+UmVhbG0gSW1wbGVtZW50YXRpb25zPC9lbT4gLSBSZXF1aXJlbWVudHMgZm9yIHRoZSBpbXBsZW1lbnRhdGlvbnMgb2YKKyAgICB0aGUgPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5SZWFsbTwvY29kZT4gaW50ZXJmYWNlIChwcm92aWRpbmcgYWNjZXNzIHRvCisgICAgY29sbGVjdGlvbnMgb2YgdXNlcnMsIHBhc3N3b3JkcyBhbmQgcm9sZXMpIHRoYXQgYXJlIGluY2x1ZGVkIGluIHRoZQorICAgIHN0YW5kYXJkIFRvbWNhdCA1IGRpc3RyaWJ1dGlvbi48L2xpPgorPC91bD4KKworPHA+PGVtPk5PVEU8L2VtPiAtIEluIHNvbWUgY2FzZXMsIHRoZSBjb250ZW50cyBvZiB0aGVzZSBmdW5jdGlvbmFsIHNwZWNzIGhhcworYmVlbiAicmV2ZXJzZSBlbmdpbmVlcmVkIiBmcm9tIGV4aXN0aW5nIGltcGxlbWVudGF0aW9ucy4gIFRoaXMgZXhlcmNpc2UgaXMKK3N0aWwgdXNlZnVsLCBiZWNhdXNlIGl0IHByb3ZpZGVzIGFuIGludHJvZHVjdGlvbiB0byA8c3Ryb25nPndoYXQ8L3N0cm9uZz4KK0NhdGFsaW5hIGRvZXMsIHdpdGhvdXQgYmVpbmcgYXMgY29uY2VybmVkIHdpdGggPHN0cm9uZz5ob3c8L3N0cm9uZz4gdGhpcyBpcworYWNjb21wbGlzaGVkLjwvcD4KKworPHA+PHN0cm9uZz5UT0RPPC9zdHJvbmc+IC0gT2J2aW91c2x5LCB0aGlzIGFyZWEgaGFzIGEgbG9uZyB3YXlzIHRvIGdvIGJlZm9yZQoraXQgaXMgY29tcGxldGUuICBDb250cmlidXRpb25zIGFyZSB3ZWxjb21lITwvcD4KKworPC9zZWN0aW9uPgorCisKKzwvYm9keT4KKworPC9kb2N1bWVudD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvZnVuY3NwZWNzL21iZWFuLW5hbWVzLnhtbCBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvZnVuY3NwZWNzL21iZWFuLW5hbWVzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjEyYzk1Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9mdW5jc3BlY3MvbWJlYW4tbmFtZXMueG1sCkBAIC0wLDAgKzEsODcwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhRE9DVFlQRSBkb2N1bWVudCBbCisgIDwhRU5USVRZIHByb2plY3QgU1lTVEVNICJwcm9qZWN0LnhtbCI+CitdPgorPGRvY3VtZW50IHVybD0ibWJlYW4tbmFtZXMuaHRtbCI+CisKKyAgJnByb2plY3Q7CisKKyAgPHByb3BlcnRpZXM+CisgICAgPGF1dGhvciBlbWFpbD0iY3JhaWdtY2NAYXBhY2hlLm9yZyI+Q3JhaWcgTWNDbGFuYWhhbjwvYXV0aG9yPgorICAgIDxhdXRob3IgZW1haWw9ImFteXJvaEBhcGFjaGUub3JnIj5BbXkgUm9oPC9hdXRob3I+CisgICAgPHRpdGxlPlRvbWNhdCBNQmVhbiBOYW1lczwvdGl0bGU+CisgICAgPHJldmlzaW9uPiRJZCQ8L3JldmlzaW9uPgorICA8L3Byb3BlcnRpZXM+CisKKzxib2R5PgorCisKKzxzZWN0aW9uIG5hbWU9IkJhY2tncm91bmQiPgorCisgICAgPHA+V2Ugd2lsbCBiZSB1c2luZyA8ZW0+Sk1YIE1CZWFuczwvZW0+IGFzIHRoZSB0ZWNobm9sb2d5IGZvcgorICAgIGltcGxlbWVudGluZyBtYW5hZ2VhYmlsaXR5IG9mIFRvbWNhdC48L3A+CisKKyAgICA8cD5PbmUgb2YgdGhlIGtleSBjb25jZXB0cyBvZiBKTVggKGFuZCBKU1ItNzcpIGlzIHRoYXQgZWFjaCBtYW5hZ2VtZW50CisgICAgYmVhbiBoYXMgYSB1bmlxdWUgbmFtZSBpbiB0aGUgTUJlYW5TZXJ2ZXIncyByZWdpc3RyeSwgYW5kIHRoYXQKKyAgICBtYW5hZ2VtZW50IGFwcGxpY2F0aW9ucyBjYW4gdXRpbGl6ZSB0aGVzZSBuYW1lcyB0byByZXRyaWV2ZSB0aGUgTUJlYW4KKyAgICBvZiBpbnRlcmVzdCB0byB0aGVtIGZvciBhIHBhcnRpY3VsYXIgbWFuYWdlbWVudCBvcGVyYXRpb24uCisgICAgVGhpcyBkb2N1bWVudCBwcm9wb3NlcyBhIG5hbWluZyBjb252ZW50aW9uIGZvciBNQmVhbnMgdGhhdCBhbGxvd3MgZWFzeQorICAgIGNhbGN1bGF0aW9uIG9mIHRoZSBuYW1lIGZvciBhIHBhcnRpY3VsYXIgTUJlYW4uICBGb3IgYmFja2dyb3VuZAorICAgIGluZm9ybWF0aW9uIG9uIEpNWCBNQmVhbiBuYW1lcywgc2VlIHRoZSA8ZW0+SmF2YSBNYW5hZ2VtZW50IEV4dGVuc2lvbnMKKyAgICBJbnN0cnVtZW50YXRpb24gYW5kIEFnZW50IFNwZWNpZmljYXRpb248L2VtPiwgdmVyc2lvbiAxLjAsIHNlY3Rpb24gNi4KKyAgICBJbiBwYXJ0aWN1bGFyLCB3ZSB3aWxsIGJlIGRpc2N1c3NpbmcgdGhlIFN0cmluZyBSZXByZXNlbnRhdGlvbiBvZgorICAgIDxjb2RlPk9iamVjdE5hbWU8L2NvZGU+IGluc3RhbmNlcy48L3A+CisKKzwvc2VjdGlvbj4KKworPHNlY3Rpb24gbmFtZT0iQ2F0YWxpbmEgT2JqZWN0IEhpZXJhcmNoeSI+CisKKzxwPlRvbWNhdCdzIHNlcnZsZXQgY29udGFpbmVyIGltcGxlbWVudGF0aW9uLCBjYWxsZWQgQ2F0YWxpbmEsIGNhbiBiZQorcmVwcmVzZW50ZWQgYXMgYSBoaWVyYXJjaHkgb2Ygb2JqZWN0cyB0aGF0IGNvbnRhaW4gcmVmZXJlbmNlcyB0byBlYWNoIG90aGVyLgorVGhlIG9iamVjdCBoaWVyYXJjaHkgY2FuIGJlIHJlcHJlc2VudGVkIGFzIGEgdHJlZSwgb3IgKGlzb21vcnBoaWNhbGx5KSBiYXNlZAorb24gdGhlIG5lc3Rpbmcgb2YgY29uZmlndXJhdGlvbiBlbGVtZW50cyBpbiB0aGUgPGNvZGU+Y29uZi9zZXJ2ZXIueG1sPC9jb2RlPgorZmlsZSB0aGF0IGlzIHRyYWRpdGlvbmFsbHkgdXNlZCB0byBjb25maWd1cmUgVG9tY2F0IHN0YW5kLWFsb25lLjwvcD4KKworPHA+VGhlIHZhbGlkIGNvbXBvbmVudCBuZXN0aW5ncyBmb3IgQ2F0YWxpbmEgYXJlIGRlcGljdGVkIGluIHRoZSBmb2xsb3dpbmcKK3RhYmxlLCB3aXRoIGNvbHVtbnMgdGhhdCBjb250YWluIHRoZSBmb2xsb3dpbmcgdmFsdWVzOjwvcD4KKzx1bD4KKzxsaT48ZW0+UGF0dGVybjwvZW0+IC0gTmVzdGluZyBwYXR0ZXJuIG9mIFhNTCBlbGVtZW50cyAoaW4gdGhlCisgICAgPGNvZGU+Y29uZi9zZXJ2ZXIueG1sPC9jb2RlPiBmaWxlKSB1c2VkIHRvIGNvbmZpZ3VyZSB0aGlzIGNvbXBvbmVudC48L2xpPgorPGxpPjxlbT5DYXJkaW5hbGl0eTwvZW0+IC0gTWluaW11bSBhbmQgbWF4aW11bSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgb2YKKyAgICB0aGlzIGVsZW1lbnQgYXQgdGhpcyBuZXN0aW5nIHBvc2l0aW9uLCB3aGljaCBhbHNvIGNvcnJlc3BvbmRzIHRvIHRoZQorICAgIG1pbmltdW0gYW5kIG1heGltdW0gbnVtYmVyIG9mIENhdGFsaW5hIGNvbXBvbmVudHMuPC9saT4KKzxsaT48ZW0+SWRlbnRpZmllcjwvZW0+IC0gTmFtZSBvZiB0aGUgSmF2YUJlYW5zIHByb3BlcnR5IG9mIHRoaXMgY29tcG9uZW50CisgICAgdGhhdCByZXByZXNlbnRzIHRoZSB1bmlxdWUgaWRlbnRpZmllciAod2l0aGluIHRoZSBuZXN0ZWQgaGllcmFyY2h5KSwKKyAgICBpZiBhbnkuPC9saT4KKzxsaT48ZW0+TUJlYW4gT2JqZWN0TmFtZTwvZW0+IC0gVGhlIHBvcnRpb24gb2YgdGhlIE1CZWFuIG9iamVjdCBuYW1lIHRoYXQKKyAgICBhcHBlYXJzIDxzdHJvbmc+YWZ0ZXI8L3N0cm9uZz4gdGhlIGRvbWFpbiBuYW1lLiAgRm9yIG5vdywgaXQgc2hvdWxkIGJlCisgICAgYXNzdW1lZCB0aGF0IGFsbCBvZiB0aGVzZSBNQmVhbnMgYXBwZWFyIGluIHRoZSBkZWZhdWx0IEpNWCBkb21haW4uPC9saT4KKzwvdWw+CisKKzxwPkluIHRoZSA8ZW0+TUJlYW4gT2JqZWN0TmFtZTwvZW0+IGRlc2NyaXB0aW9ucywgc2V2ZXJhbCB0eXBlcyBvZiBzeW1ib2xpYworZXhwcmVzc2lvbnMgYXJlIHV0aWxpemVkIHRvIGRlZmluZSB2YXJpYWJsZSB0ZXh0IHRoYXQgaXMgcmVwbGFjZWQgYnkKK2NvcnJlc3BvbmRpbmcgdmFsdWVzOjwvcD4KKzx1bD4KKzxsaT48ZW0+JHtHUk9VUH08L2VtPiAtIE9uZSBvZiB0aGUgc3RhbmRhcmQgTUJlYW4gbmFtZXMgb2YgdGhlIHNwZWNpZmllZAorICAgICJncm91cCIgY2F0ZWdvcnkuICBGb3IgZXhhbXBsZSwgdGhlIGV4cHJlc3Npb24gPGNvZGU+JHtSRUFMTX08L2NvZGU+CisgICAgcmVwcmVzZW50cyB0aGUgdmFsdWVzIGxpa2UgPGNvZGU+SkRCQ1JlYWxtPC9jb2RlPiBhbmQgPGNvZGU+SkFBU1JlYWxtPC9jb2RlPgorICAgIHRoYXQgaWRlbnRpZnkgdGhlIHZhcmlvdXMgTUJlYW5zIGZvciBwb3NzaWJsZSA8Y29kZT5SZWFsbTwvY29kZT4gY29tcG9uZW50cy48L2xpPgorPGxpPjxlbT4ke25hbWV9PC9lbT4gLSBSZXBsYWNlZCBieSB0aGUgdmFsdWUgb2YgcHJvcGVydHkgPGNvZGU+bmFtZTwvY29kZT4KKyAgICBmcm9tIHRoZSBjdXJyZW50IGNvbXBvbmVudC48L2xpPgorPGxpPjxlbT4ke3BhcmVudC5uYW1lfTwvZW0+IC0gUmVwbGFjZWQgYnkgdGhlIHZhbHVlIG9mIHByb3BlcnR5CisgICAgPGNvZGU+bmFtZTwvY29kZT4gZnJvbSBhIHBhcmVudCBvZiB0aGUgY3VycmVudCBjb21wb25lbnQsIHdpdGggdGhlCisgICAgcGFyZW50J3MgdHlwZSBpZGVudGlmaWVkIGJ5IDxlbT5wYXJlbnQ8L2VtPi48L2xpPgorPGxpPjxlbT4keyMjI308L2VtPiAtIEFuIGFyYml0cmFyeSBudW1lcmljIGlkZW50aWZpZXIgdGhhdCBwcmVzZXJ2ZXMKKyAgICBvcmRlciBidXQgaGFzIG5vIG90aGVyIHBhcnRpY3VsYXIgbWVhbmluZy4gIEluIGdlbmVyYWwsIHRoZSBzZXJ2ZXIgd2lsbAorICAgIGFzc2lnbiBudW1lcmljIHZhbHVlcyB0byBleGlzdGluZyBpbnN0YW5jZXMgd2l0aCBsYXJnZSBnYXBzIGludG8gd2hpY2gKKyAgICBuZXcgaXRlbXMgY2FuIGJlIGNvbmZpZ3VyZWQgaWYgZGVzaXJlZC48L2xpPgorPC91bD4KKworPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjUiPgorCisgIDx0cj4KKyAgICA8dGggYWxpZ249ImNlbnRlciIgYmdjb2xvcj0iYXF1YSI+UGF0dGVybjwvdGg+CisgICAgPHRoIGFsaWduPSJjZW50ZXIiIGJnY29sb3I9ImFxdWEiPkNhcmRpbmFsaXR5PC90aD4KKyAgICA8dGggYWxpZ249ImNlbnRlciIgYmdjb2xvcj0iYXF1YSI+SWRlbnRpZmllcjwvdGg+CisgICAgPHRoIGFsaWduPSJjZW50ZXIiIGJnY29sb3I9ImFxdWEiPk1CZWFuIE9iamVjdE5hbWU8L3RoPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+U2VydmVyPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+MS4uMTwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPihub25lKTwvdGQ+CisgICAgPHRkPjxjb2RlPnR5cGU9JHtTRVJWRVJ9PC9jb2RlPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD5TZXJ2ZXIgLyBMaXN0ZW5lcjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPjAuLm48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj4obm9uZSk8L3RkPgorICAgIDx0ZD48Y29kZT50eXBlPSR7TElTVEVORVJ9LCBzZXF1ZW5jZT0keyMjI308L2NvZGU+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPlNlcnZlciAvIFNlcnZpY2U8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj4xLi5uPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+PGNvZGU+bmFtZTwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT50eXBlPSR7U0VSVklDRX0sIG5hbWU9JHtuYW1lfTwvY29kZT48L3RkPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+U2VydmVyIC8gU2VydmljZSAvIENvbm5lY3RvcjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPjEuLm48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj48Y29kZT5hZGRyZXNzLCBwb3J0PC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPnR5cGU9JHtDT05ORUNUT1J9LCBzZXJ2aWNlPSR7c2VydmljZX0sIHBvcnQ9JHtwb3J0fSwKKyAgICAgICAgYWRkcmVzcz0ke2FkZHJlc3N9PC9jb2RlPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD5TZXJ2ZXIgLyBTZXJ2aWNlIC8gQ29ubmVjdG9yIC8gRmFjdG9yeTwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPjAuLjE8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj4obm9uZSk8L3RkPgorICAgIDx0ZD4oT25seSBkZWZpbmVkIGV4cGxpY2l0bHkgZm9yIGFuIFNTTCBjb25uZWN0b3IsIGJ1dCBjYW4gYmUgdHJlYXRlZAorICAgICAgICBhcyBwYXJ0IG9mIHRoZSBjb25uZWN0b3IgY29tcG9uZW50KTwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD5TZXJ2ZXIgLyBTZXJ2aWNlIC8gQ29ubmVjdG9yIC8gTGlzdGVuZXI8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj4wLi5uPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+KG5vbmUpPC90ZD4KKyAgICA8dGQ+PGNvZGU+dHlwZT0ke0xJU1RFTkVSfSwgc2VxdWVuY2U9JHsjIyN9LCBzZXJ2aWNlPSR7c2VydmljZX0sCisgICAgICAgIHBvcnQ9JHtjb25uZWN0b3IucG9ydH0sIGFkZHJlc3M9JHtjb25uZWN0b3IuYWRkcmVzc308L2NvZGU+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPlNlcnZlciAvIFNlcnZpY2UgLyBFbmdpbmU8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj4xLi4xPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+KG5vbmUpPC90ZD4KKyAgICA8dGQ+PGNvZGU+dHlwZT0ke0VOR0lORX0sIHNlcnZpY2U9JHtzZXJ2aWNlLm5hbWV9PC9jb2RlPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD5TZXJ2ZXIgLyBTZXJ2aWNlIC8gRW5naW5lIC8gRGVmYXVsdENvbnRleHQ8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj4wLi4xPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+KG5vbmUpPC90ZD4KKyAgICA8dGQ+PGNvZGU+dHlwZT0ke0RFRkFVTFQtQ09OVEVYVH0sIHNlcnZpY2U9JHtzZXJ2aWNlLm5hbWV9PC9jb2RlPjwvdGQ+CisgIDwvdHI+CisKKzwhLS0KKyAgPHRyPgorICAgIDx0ZD5TZXJ2ZXIgLyBTZXJ2aWNlIC8gRW5naW5lIC8gRGVmYXVsdENvbnRleHQgLyBJbnN0YW5jZUxpc3RlbmVyPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+MC4ubjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPihub25lKTwvdGQ+CisgICAgPHRkPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD5TZXJ2ZXIgLyBTZXJ2aWNlIC8gRW5naW5lIC8gRGVmYXVsdENvbnRleHQgLyBMaXN0ZW5lcjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPjAuLm48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj4obm9uZSk8L3RkPgorICAgIDx0ZD48Y29kZT50eXBlPSR7TElTVEVORVJ9LCBzZXF1ZW5jZT0keyMjI308L2NvZGU+PC90ZD4KKyAgICA8dGQ+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPlNlcnZlciAvIFNlcnZpY2UgLyBFbmdpbmUgLyBEZWZhdWx0Q29udGV4dCAvIExvYWRlcjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPjAuLjE8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj4obm9uZSk8L3RkPgorICAgIDx0ZD48L3RkPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+U2VydmVyIC8gU2VydmljZSAvIEVuZ2luZSAvIERlZmF1bHRDb250ZXh0IC8gTWFuYWdlcjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPjAuLjE8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj4obm9uZSk8L3RkPgorICAgIDx0ZD48L3RkPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+U2VydmVyIC8gU2VydmljZSAvIEVuZ2luZSAvIERlZmF1bHRDb250ZXh0IC8gUmVhbG08L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj4wLi4xPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+KG5vbmUpPC90ZD4KKyAgICA8dGQ+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPlNlcnZlciAvIFNlcnZpY2UgLyBFbmdpbmUgLyBEZWZhdWx0Q29udGV4dCAvIFJlc291cmNlczwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPjAuLjE8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj4obm9uZSk8L3RkPgorICAgIDx0ZD48L3RkPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+U2VydmVyIC8gU2VydmljZSAvIEVuZ2luZSAvIERlZmF1bHRDb250ZXh0IC8gVmFsdmU8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj4wLi5uPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+KG5vbmUpPC90ZD4KKyAgICA8dGQ+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPlNlcnZlciAvIFNlcnZpY2UgLyBFbmdpbmUgLyBEZWZhdWx0Q29udGV4dCAvIFdyYXBwZXJMaWZlY3ljbGU8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj4wLi5uPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+KG5vbmUpPC90ZD4KKyAgICA8dGQ+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPlNlcnZlciAvIFNlcnZpY2UgLyBFbmdpbmUgLyBEZWZhdWx0Q29udGV4dCAvIFdyYXBwZXJMaXN0ZW5lcjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPjAuLm48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj4obm9uZSk8L3RkPgorICAgIDx0ZD48L3RkPgorICA8L3RyPgorLS0+CisKKyAgPHRyPgorICAgIDx0ZD5TZXJ2ZXIgLyBTZXJ2aWNlIC8gRW5naW5lIC8gSG9zdDwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPjEuLm48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj48Y29kZT5uYW1lPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPnR5cGU9JHtIT1NUfSwgaG9zdD0ke25hbWV9LAorICAgICAgICBzZXJ2aWNlPSR7c2VydmljZS5uYW1lfTwvY29kZT48L3RkPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+U2VydmVyIC8gU2VydmljZSAvIEVuZ2luZSAvIEhvc3QgLyBDb250ZXh0PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+MS4ubjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPjxjb2RlPnBhdGg8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+dHlwZT0ke0NPTlRFWFR9LCBwYXRoPSR7cGF0aH0sIGhvc3Q9JHtob3N0Lm5hbWV9LAorICAgICAgICBzZXJ2aWNlPSR7c2VydmljZS5uYW1lfTwvY29kZT48L3RkPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+U2VydmVyIC8gU2VydmljZSAvIEVuZ2luZSAvIEhvc3QgLyBDb250ZXh0IC8gSW5zdGFuY2VMaXN0ZW5lcjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPjAuLm48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj4obm9uZSk8L3RkPgorICAgIDx0ZD48Y29kZT50eXBlPSR7SU5TVEFOQ0UtTElTVEVORVJ9LCBzZXF1ZW5jZT0keyMjI30sIHBhdGg9JHtjb250ZXh0LnBhdGh9LAorICAgICAgICBob3N0PSR7aG9zdC5uYW1lfSwgc2VydmljZT0ke3NlcnZpY2UubmFtZX08L2NvZGU+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPlNlcnZlciAvIFNlcnZpY2UgLyBFbmdpbmUgLyBIb3N0IC8gQ29udGV4dCAvIExpc3RlbmVyPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+MC4ubjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPihub25lKTwvdGQ+CisgICAgPHRkPjxjb2RlPnR5cGU9JHtMSVNURU5FUn0sIHNlcXVlbmNlPSR7IyMjfSwgcGF0aD0ke2NvbnRleHQucGF0aH0sCisgICAgICAgIGhvc3Q9JHtob3N0Lm5hbWV9LCBzZXJ2aWNlPSR7c2VydmljZS5uYW1lfTwvY29kZT48L3RkPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+U2VydmVyIC8gU2VydmljZSAvIEVuZ2luZSAvIEhvc3QgLyBDb250ZXh0IC8gTG9hZGVyPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+MC4uMTwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPihub25lKTwvdGQ+CisgICAgPHRkPjxjb2RlPnR5cGU9JHtMT0FERVJ9LCBwYXRoPSR7Y29udGV4dC5wYXRofSwgaG9zdD0ke2hvc3QubmFtZX0sCisgICAgICAgIHNlcnZpY2U9JHtzZXJ2aWNlLm5hbWV9PC9jb2RlPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD5TZXJ2ZXIgLyBTZXJ2aWNlIC8gRW5naW5lIC8gSG9zdCAvIENvbnRleHQgLyBNYW5hZ2VyPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+MC4uMTwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPihub25lKTwvdGQ+CisgICAgPHRkPjxjb2RlPnR5cGU9JHtNQU5BR0VSfSwgcGF0aD0ke2NvbnRleHQucGF0aH0sIGhvc3Q9JHtob3N0Lm5hbWV9LAorICAgICAgICBzZXJ2aWNlPSR7c2VydmljZS5uYW1lfTwvY29kZT48L3RkPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+U2VydmVyIC8gU2VydmljZSAvIEVuZ2luZSAvIEhvc3QgLyBDb250ZXh0IC8gUmVhbG08L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj4wLi4xPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+KG5vbmUpPC90ZD4KKyAgICA8dGQ+PGNvZGU+dHlwZT0ke1JFQUxNfSwgcGF0aD0ke2NvbnRleHQucGF0aH0sIGhvc3Q9JHtob3N0Lm5hbWV9LAorICAgICAgICBzZXJ2aWNlPSR7c2VydmljZS5uYW1lfTwvY29kZT48L3RkPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+U2VydmVyIC8gU2VydmljZSAvIEVuZ2luZSAvIEhvc3QgLyBDb250ZXh0IC8gUmVzb3VyY2VzPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+MC4uMTwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPihub25lKTwvdGQ+CisgICAgPHRkPjxjb2RlPnR5cGU9JHtSRVNPVVJDRVN9LCBwYXRoPSR7Y29udGV4dC5wYXRofSwgaG9zdD0ke2hvc3QubmFtZX0sCisgICAgICAgIHNlcnZpY2U9JHtzZXJ2aWNlLm5hbWV9PC9jb2RlPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD5TZXJ2ZXIgLyBTZXJ2aWNlIC8gRW5naW5lIC8gSG9zdCAvIENvbnRleHQgLyBWYWx2ZTwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPjAuLm48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj4obm9uZSk8L3RkPgorICAgIDx0ZD48Y29kZT50eXBlPSR7VkFMVkV9LCBzZXF1ZW5jZT0keyMjI30sIHBhdGg9JHtjb250ZXh0LnBhdGh9LAorICAgICAgICBob3N0PSR7aG9zdC5uYW1lfSwgc2VydmljZT0ke3NlcnZpY2UubmFtZX08L2NvZGU+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPlNlcnZlciAvIFNlcnZpY2UgLyBFbmdpbmUgLyBIb3N0IC8gQ29udGV4dCAvIFdyYXBwZXJMaWZlY3ljbGU8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj4wLi5uPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+KG5vbmUpPC90ZD4KKyAgICA8dGQ+PGNvZGU+dHlwZT0ke1dSQVBQRVItTElGRUNZQ0xFfSwgc2VxdWVuY2U9JHsjIyN9LCBwYXRoPSR7Y29udGV4dC5wYXRofSwKKyAgICAgICAgaG9zdD0ke2hvc3QubmFtZX0sIHNlcnZpY2U9JHtzZXJ2aWNlLm5hbWV9PC9jb2RlPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD5TZXJ2ZXIgLyBTZXJ2aWNlIC8gRW5naW5lIC8gSG9zdCAvIENvbnRleHQgLyBXcmFwcGVyTGlzdGVuZXI8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj4wLi5uPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+KG5vbmUpPC90ZD4KKyAgICA8dGQ+PGNvZGU+dHlwZT0ke1dSQVBQRVItTElTVEVORVJ9LCBzZXF1ZW5jZT0keyMjI30sIHBhdGg9JHtjb250ZXh0LnBhdGh9LAorICAgICAgICBob3N0PSR7aG9zdC5uYW1lfSwgc2VydmljZT0ke3NlcnZpY2UubmFtZX08L2NvZGU+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPlNlcnZlciAvIFNlcnZpY2UgLyBFbmdpbmUgLyBIb3N0IC8gRGVmYXVsdENvbnRleHQ8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj4wLi4xPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+KG5vbmUpPC90ZD4KKyAgICA8dGQ+PGNvZGU+dHlwZT1EZWZhdWx0Q29udGV4dCwgaG9zdD0ke2hvc3QubmFtZX0sCisgICAgICAgIHNlcnZpY2U9JHtzZXJ2aWNlLm5hbWV9PC9jb2RlPjwvdGQ+CisgIDwvdHI+CisKKzwhLS0KKyAgPHRyPgorICAgIDx0ZD5TZXJ2ZXIgLyBTZXJ2aWNlIC8gRW5naW5lIC8gSG9zdCAvIERlZmF1bHRDb250ZXh0IC8gSW5zdGFuY2VMaXN0ZW5lcjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPjAuLm48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj4obm9uZSk8L3RkPgorICAgIDx0ZD48L3RkPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+U2VydmVyIC8gU2VydmljZSAvIEVuZ2luZSAvIEhvc3QgLyBEZWZhdWx0Q29udGV4dCAvIExpc3RlbmVyPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+MC4ubjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPihub25lKTwvdGQ+CisgICAgPHRkPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD5TZXJ2ZXIgLyBTZXJ2aWNlIC8gRW5naW5lIC8gSG9zdCAvIERlZmF1bHRDb250ZXh0IC8gTG9hZGVyPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+MC4uMTwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPihub25lKTwvdGQ+CisgICAgPHRkPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD5TZXJ2ZXIgLyBTZXJ2aWNlIC8gRW5naW5lIC8gSG9zdCAvIERlZmF1bHRDb250ZXh0IC8gTWFuYWdlcjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPjAuLjE8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj4obm9uZSk8L3RkPgorICAgIDx0ZD48L3RkPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+U2VydmVyIC8gU2VydmljZSAvIEVuZ2luZSAvIEhvc3QgLyBEZWZhdWx0Q29udGV4dCAvIFJlYWxtPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+MC4uMTwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPihub25lKTwvdGQ+CisgICAgPHRkPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD5TZXJ2ZXIgLyBTZXJ2aWNlIC8gRW5naW5lIC8gSG9zdCAvIERlZmF1bHRDb250ZXh0IC8gUmVzb3VyY2VzPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+MC4uMTwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPihub25lKTwvdGQ+CisgICAgPHRkPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD5TZXJ2ZXIgLyBTZXJ2aWNlIC8gRW5naW5lIC8gSG9zdCAvIERlZmF1bHRDb250ZXh0IC8gVmFsdmU8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj4wLi5uPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+KG5vbmUpPC90ZD4KKyAgICA8dGQ+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPlNlcnZlciAvIFNlcnZpY2UgLyBFbmdpbmUgLyBIb3N0IC8gRGVmYXVsdENvbnRleHQgLyBXcmFwcGVyTGlmZWN5Y2xlPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+MC4ubjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPihub25lKTwvdGQ+CisgICAgPHRkPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD5TZXJ2ZXIgLyBTZXJ2aWNlIC8gRW5naW5lIC8gSG9zdCAvIERlZmF1bHRDb250ZXh0IC8gV3JhcHBlckxpc3RlbmVyPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+MC4ubjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPihub25lKTwvdGQ+CisgICAgPHRkPjwvdGQ+CisgIDwvdHI+CistLT4KKworICA8dHI+CisgICAgPHRkPlNlcnZlciAvIFNlcnZpY2UgLyBFbmdpbmUgLyBIb3N0IC8gTGlzdGVuZXI8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj4wLi5uPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+KG5vbmUpPC90ZD4KKyAgICA8dGQ+PGNvZGU+dHlwZT0ke0xJU1RFTkVSfSwgc2VxdWVuY2U9JHsjIyN9LCBob3N0PSR7aG9zdC5uYW1lfSwKKyAgICAgICAgc2VydmljZT0ke3NlcnZpY2UubmFtZX08L2NvZGU+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPlNlcnZlciAvIFNlcnZpY2UgLyBFbmdpbmUgLyBIb3N0IC8gUmVhbG08L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj4wLi4xPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+KG5vbmUpPC90ZD4KKyAgICA8dGQ+PGNvZGU+dHlwZT0ke1JFQUxNfSwgaG9zdD0ke2hvc3QubmFtZX0sCisgICAgICAgIHNlcnZpY2U9JHtzZXJ2aWNlLm5hbWV9PC9jb2RlPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD5TZXJ2ZXIgLyBTZXJ2aWNlIC8gRW5naW5lIC8gSG9zdCAvIFZhbHZlPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+MC4ubjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPihub25lKTwvdGQ+CisgICAgPHRkPjxjb2RlPnR5cGU9JHtWQUxWRX0sIHNlcXVlbmNlPSR7IyMjfSwKKyAgICAgICAgaG9zdD0ke2hvc3QubmFtZX0sIHNlcnZpY2U9JHtzZXJ2aWNlLm5hbWV9PC9jb2RlPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD5TZXJ2ZXIgLyBTZXJ2aWNlIC8gRW5naW5lIC8gTGlzdGVuZXI8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj4wLi5uPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+KG5vbmUpPC90ZD4KKyAgICA8dGQ+PGNvZGU+dHlwZT0ke0xJU1RFTkVSfSwgc2VxdWVuY2U9JHsjIyN9PC9jb2RlPgorICAgICAgICAoPHN0cm9uZz5GSVhNRTwvc3Ryb25nPiAtIGRpc2FtYmlndWF0ZSBmcm9tIFNlcnZlciAvIFNlcnZpY2UgLworICAgICAgICBMaXN0ZW5lcik8L3RkPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+U2VydmVyIC8gU2VydmljZSAvIEVuZ2luZSAvIFJlYWxtPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+MC4uMTwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPihub25lKTwvdGQ+CisgICAgPHRkPjxjb2RlPnR5cGU9JHtSRUFMTX0sIHNlcnZpY2U9JHtzZXJ2aWNlLm5hbWV9PC9jb2RlPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD5TZXJ2ZXIgLyBTZXJ2aWNlIC8gRW5naW5lIC8gVmFsdmU8L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj4wLi5uPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+KG5vbmUpPC90ZD4KKyAgICA8dGQ+PGNvZGU+dHlwZT0ke1ZBTFZFfSwgc2VxdWVuY2U9JHsjIyN9LAorICAgICAgICBzZXJ2aWNlPSR7c2VydmljZS5uYW1lfTwvY29kZT48L3RkPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+U2VydmVyIC8gU2VydmljZSAvIExpc3RlbmVyPC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+MC4ubjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPihub25lKTwvdGQ+CisgICAgPHRkPjxjb2RlPnR5cGU9JHtMSVNURU5FUn0sIHNlcXVlbmNlPSR7IyMjfTwvY29kZT4KKyAgICAgICAgKDxzdHJvbmc+RklYTUU8L3N0cm9uZz4gLSBkaXNhbWJpZ3VhdGUgZnJvbSBTZXJ2ZXIgLyBTZXJ2aWNlIC8KKyAgICAgICAgRW5naW5lIC8gTGlzdGVuZXIpPC90ZD4KKyAgPC90cj4KKworPC90YWJsZT4KKworPC9zZWN0aW9uPgorCis8c2VjdGlvbiBuYW1lPSJNQmVhbiBHcm91cHMgYW5kIE5hbWVzIj4KKworPHA+VGhlIGZvbGxvd2luZyBNQmVhbiBuYW1lcyBzaGFsbCBiZSBkZWZpbmVkIGluIHRoZSByZXNvdXJjZSBmaWxlCis8Y29kZT4vb3JnL2FwYWNoZS9jYXRhbGluYS9tYmVhbnMvbWJlYW5zLWRlc2NyaXB0b3JzLnhtbDwvY29kZT4gKGFuZAordGhlcmVmb3JlIGF2YWlsYWJsZSBmb3IgdXNlIHdpdGhpbiB0aGUgQWRtaW5pc3RyYXRpb24vQ29uZmlndXJhdGlvbgord2ViIGFwcGxpY2F0aW9uIGZvciBUb21jYXQpOjwvcD4KKworPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjUiPgorCisgIDx0cj4KKyAgICA8dGggYWxpZ249ImNlbnRlciIgYmdjb2xvcj0iYXF1YSI+TUJlYW4gTmFtZTwvdGg+CisgICAgPHRoIGFsaWduPSJjZW50ZXIiIGJnY29sb3I9ImFxdWEiPkdyb3VwIE5hbWU8L3RoPgorICAgIDx0aCBhbGlnbj0iY2VudGVyIiBiZ2NvbG9yPSJhcXVhIj5DYXRhbGluYSBJbnRlcmZhY2U8L3RoPgorICAgIDx0aCBhbGlnbj0iY2VudGVyIiBiZ2NvbG9yPSJhcXVhIj5JbXBsZW1lbnRhdGlvbiBDbGFzczwvdGg+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD48Y29kZT5BY2Nlc3NMb2dWYWx2ZTwvY29kZT48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj48Y29kZT5WQUxWRTwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLlZhbHZlPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEudmFsdmVzLkFjY2Vzc0xvZ1ZhbHZlPC9jb2RlPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD48Y29kZT5CYXNpY0F1dGhlbnRpY2F0b3I8L2NvZGU+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+PGNvZGU+VkFMVkU8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5WYWx2ZTwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLmF1dGhlbnRpY2F0b3IuQmFzaWNBdXRoZW50aWNhdG9yPC9jb2RlPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD48Y29kZT5DZXJ0aWZpY2F0ZXNWYWx2ZTwvY29kZT48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj48Y29kZT5WQUxWRTwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLlZhbHZlPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEudmFsdmVzLkNlcnRpZmljYXRlc1ZhbHZlPC9jb2RlPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD48Y29kZT5Db250ZXh0Q29uZmlnPC9jb2RlPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPjxjb2RlPkxJU1RFTkVSPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlTGlzdGVuZXI8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5zdGFydHVwLkNvbnRleHRDb25maWc8L2NvZGU+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPjxjb2RlPkNvbnRleHRFbnZpcm9ubWVudDwvY29kZT48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj48Y29kZT5SRVNPVVJDRVM8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuQ29udGV4dEVudmlyb25tZW50PC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkNvbnRleHRFbnZpcm9ubWVudDwvY29kZT48L3RkPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+PGNvZGU+Q29udGV4dFJlc291cmNlPC9jb2RlPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPjxjb2RlPlJFU09VUkNFUzwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5Db250ZXh0UmVzb3VyY2U8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuQ29udGV4dFJlc291cmNlPC9jb2RlPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD48Y29kZT5Db250ZXh0UmVzb3VyY2VMaW5rPC9jb2RlPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPjxjb2RlPlJFU09VUkNFUzwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5Db250ZXh0UmVzb3VyY2VMaW5rPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkNvbnRleHRSZXNvdXJjZUxpbms8L2NvZGU+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPjxjb2RlPkNveW90ZUNvbm5lY3RvcjwvY29kZT48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj48Y29kZT5DT05ORUNUT1I8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5Db25uZWN0b3I8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+b3JnLmFwYWNoZS5jb3lvdGUudG9tY2F0NC5Db3lvdGVDb25uZWN0b3I8L2NvZGU+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPjxjb2RlPkRlZmF1bHRDb250ZXh0PC9jb2RlPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPjxjb2RlPkRFRkFVTFQtQ09OVEVYVDwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLkRlZmF1bHRDb250ZXh0PC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZERlZmF1bHRDb250ZXh0PC9jb2RlPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD48Y29kZT5EaWdlc3RBdXRoZW50aWNhdG9yPC9jb2RlPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPjxjb2RlPlZBTFZFPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuVmFsdmU8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5hdXRoZW50aWNhdG9yLkRpZ2VzdEF1dGhlbnRpY2F0b3I8L2NvZGU+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPjxjb2RlPkVuZ2luZUNvbmZpZzwvY29kZT48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj48Y29kZT5MSVNURU5FUjwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLkxpZmVjeWNsZUxpc3RlbmVyPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuc3RhcnR1cC5FbmdpbmVDb25maWc8L2NvZGU+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPjxjb2RlPkVycm9yUmVwb3J0VmFsdmU8L2NvZGU+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+PGNvZGU+VkFMVkU8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5WYWx2ZTwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcy5FcnJvclJlcG9ydFZhbHZlPC9jb2RlPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD48Y29kZT5FcnJvckRpc3BhdGNoZXJWYWx2ZTwvY29kZT48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj48Y29kZT5WQUxWRTwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLlZhbHZlPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEudmFsdmVzLkVycm9yRGlzcGF0Y2hlclZhbHZlPC9jb2RlPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD48Y29kZT5Gb3JtQXV0aGVudGljYXRvcjwvY29kZT48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj48Y29kZT5WQUxWRTwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLlZhbHZlPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuYXV0aGVudGljYXRvci5Gb3JtQXV0aGVudGljYXRvcjwvY29kZT48L3RkPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+PGNvZGU+R3JvdXA8L2NvZGU+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+PGNvZGU+R1JPVVA8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5Hcm91cDwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLkdyb3VwPC9jb2RlPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD48Y29kZT5Ib3N0Q29uZmlnPC9jb2RlPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPjxjb2RlPkxJU1RFTkVSPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlTGlzdGVuZXI8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5zdGFydHVwLkhvc3RDb25maWc8L2NvZGU+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPjxjb2RlPkh0dHBDb25uZWN0b3IxMDwvY29kZT48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj48Y29kZT5DT05ORUNUT1I8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5Db25uZWN0b3I8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuaHR0cDEwLkh0dHBDb25uZWN0b3I8L2NvZGU+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPjxjb2RlPkh0dHBDb25uZWN0b3IxMTwvY29kZT48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj48Y29kZT5DT05ORUNUT1I8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5Db25uZWN0b3I8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5jb25uZWN0b3IuaHR0cC5IdHRwQ29ubmVjdG9yPC9jb2RlPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD48Y29kZT5KQUFTUmVhbG08L2NvZGU+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+PGNvZGU+UkVBTE08L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5SZWFsbTwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtLkpBQVNSZWFsbTwvY29kZT48L3RkPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+PGNvZGU+SkRCQ1JlYWxtPC9jb2RlPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPjxjb2RlPlJFQUxNPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuUmVhbG08L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5yZWFsbS5KREJDUmVhbG08L2NvZGU+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPjxjb2RlPkpEQkNVc2VyRGF0YWJhc2U8L2NvZGU+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+PGNvZGU+VVNFUkRBVEFCQVNFPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEudXNlcnMuSkRCQ1VzZXJEYXRhYmFzZTwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLnVzZXJzLkpEQkNVc2VyRGF0YWJhc2U8L2NvZGU+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPjxjb2RlPkpORElSZWFsbTwvY29kZT48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj48Y29kZT5SRUFMTTwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLlJlYWxtPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEucmVhbG0uSk5ESVJlYWxtPC9jb2RlPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD48Y29kZT5NQmVhbkZhY3Rvcnk8L2NvZGU+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+PGNvZGU+PC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPjwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLm1iZWFucy5NQmVhbkZhY3Rvcnk8L2NvZGU+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPjxjb2RlPk1lbW9yeVJlYWxtPC9jb2RlPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPjxjb2RlPlJFQUxNPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuUmVhbG08L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5yZWFsbS5NZW1vcnlSZWFsbTwvY29kZT48L3RkPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+PGNvZGU+TWVtb3J5VXNlckRhdGFiYXNlPC9jb2RlPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPjxjb2RlPlVTRVJEQVRBQkFTRTwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLnVzZXJzLk1lbW9yeVVzZXJEYXRhYmFzZTwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLnVzZXJzLk1lbW9yeVVzZXJEYXRhYmFzZTwvY29kZT48L3RkPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+PGNvZGU+TmFtaW5nQ29udGV4dExpc3RlbmVyPC9jb2RlPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPjxjb2RlPkxJU1RFTkVSPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuTGlmZWN5Y2xlTGlzdGVuZXI8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLk5hbWluZ0NvbnRleHRMaXN0ZW5lcjwvY29kZT48L3RkPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+PGNvZGU+TmFtaW5nUmVzb3VyY2VzPC9jb2RlPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPjxjb2RlPlJFU09VUkNFUzwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLmRlcGxveS5OYW1pbmdSZXNvdXJjZXM8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5kZXBsb3kuTmFtaW5nUmVzb3VyY2VzPC9jb2RlPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD48Y29kZT5Ob25Mb2dpbkF1dGhlbnRpY2F0b3I8L2NvZGU+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+PGNvZGU+VkFMVkU8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5WYWx2ZTwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLmF1dGhlbnRpY2F0b3IuTm9uTG9naW5BdXRoZW50aWNhdG9yPC9jb2RlPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD48Y29kZT5QZXJzaXN0ZW50TWFuYWdlcjwvY29kZT48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj48Y29kZT5NQU5BR0VSPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuTWFuYWdlcjwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLnNlc3Npb24uUGVyc2lzdGVudE1hbmFnZXI8L2NvZGU+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPjxjb2RlPlJlbW90ZUFkZHJWYWx2ZTwvY29kZT48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj48Y29kZT5WQUxWRTwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLlZhbHZlPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEudmFsdmVzLlJlbW90ZUFkZHJWYWx2ZTwvY29kZT48L3RkPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+PGNvZGU+UmVtb3RlSG9zdFZhbHZlPC9jb2RlPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPjxjb2RlPlZBTFZFPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuVmFsdmU8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS52YWx2ZXMuUmVtb3RlSG9zdFZhbHZlPC9jb2RlPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD48Y29kZT5SZXF1ZXN0RHVtcGVyVmFsdmU8L2NvZGU+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+PGNvZGU+VkFMVkU8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5WYWx2ZTwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcy5SZXF1ZXN0RHVtcGVyVmFsdmU8L2NvZGU+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPjxjb2RlPlJvbGU8L2NvZGU+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+PGNvZGU+Uk9MRTwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLlJvbGU8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5Sb2xlPC9jb2RlPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD48Y29kZT5TaW5nbGVTaWduT248L2NvZGU+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+PGNvZGU+VkFMVkU8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5WYWx2ZTwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLnZhbHZlcy5TaW5nbGVTaWduT248L2NvZGU+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPjxjb2RlPlNTTEF1dGhlbnRpY2F0b3I8L2NvZGU+PC90ZD4KKyAgICA8dGQgYWxpZ249ImNlbnRlciI+PGNvZGU+VkFMVkU8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5WYWx2ZTwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLmF1dGhlbnRpY2F0b3IuU1NMQXV0aGVudGljYXRvcjwvY29kZT48L3RkPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+PGNvZGU+U3RhbmRhcmRDb250ZXh0PC9jb2RlPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPjxjb2RlPkNPTlRFWFQ8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5Db250ZXh0PC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZENvbnRleHQ8L2NvZGU+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPjxjb2RlPlN0YW5kYXJkQ29udGV4dFZhbHZlPC9jb2RlPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPjxjb2RlPlZBTFZFPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuVmFsdmU8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkQ29udGV4dFZhbHZlPC9jb2RlPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD48Y29kZT5TdGFuZGFyZEVuZ2luZTwvY29kZT48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj48Y29kZT5FTkdJTkU8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5FbmdpbmU8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkRW5naW5lPC9jb2RlPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD48Y29kZT5TdGFuZGFyZEVuZ2luZVZhbHZlPC9jb2RlPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPjxjb2RlPlZBTFZFPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuVmFsdmU8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlN0YW5kYXJkRW5naW5lVmFsdmU8L2NvZGU+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPjxjb2RlPlN0YW5kYXJkSG9zdDwvY29kZT48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj48Y29kZT5IT1NUPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuSG9zdDwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRIb3N0PC9jb2RlPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD48Y29kZT5TdGFuZGFyZEhvc3RWYWx2ZTwvY29kZT48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj48Y29kZT5WQUxWRTwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLlZhbHZlPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZEhvc3RWYWx2ZTwvY29kZT48L3RkPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+PGNvZGU+U3RhbmRhcmRNYW5hZ2VyPC9jb2RlPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPjxjb2RlPk1BTkFHRVI8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5NYW5hZ2VyPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuc2Vzc2lvbi5TdGFuZGFyZE1hbmFnZXI8L2NvZGU+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPjxjb2RlPlN0YW5kYXJkU2VydmVyPC9jb2RlPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPjxjb2RlPlNFUlZFUjwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLlNlcnZlcjwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRTZXJ2ZXI8L2NvZGU+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPjxjb2RlPlN0YW5kYXJkU2VydmljZTwvY29kZT48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj48Y29kZT5TRVJWSUNFPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuU2VydmljZTwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuU3RhbmRhcmRTZXJ2aWNlPC9jb2RlPjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD48Y29kZT5TdGFuZGFyZFdyYXBwZXJWYWx2ZTwvY29kZT48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj48Y29kZT5WQUxWRTwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLlZhbHZlPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZFdyYXBwZXJWYWx2ZTwvY29kZT48L3RkPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+PGNvZGU+VXNlcjwvY29kZT48L3RkPgorICAgIDx0ZCBhbGlnbj0iY2VudGVyIj48Y29kZT5VU0VSPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuVXNlcjwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLlVzZXI8L2NvZGU+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPjxjb2RlPlVzZXJEYXRhYmFzZVJlYWxtPC9jb2RlPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPjxjb2RlPlJFQUxNPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuUmVhbG08L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5yZWFsbS5Vc2VyRGF0YWJhc2VSZWFsbTwvY29kZT48L3RkPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+PGNvZGU+V2ViYXBwTG9hZGVyPC9jb2RlPjwvdGQ+CisgICAgPHRkIGFsaWduPSJjZW50ZXIiPjxjb2RlPkxPQURFUjwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLkxvYWRlcjwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLmxvYWRlci5XZWJhcHBMb2FkZXI8L2NvZGU+PC90ZD4KKyAgPC90cj4KKworPC90YWJsZT4KKworPC9zZWN0aW9uPgorCis8c2VjdGlvbiBuYW1lPSJKU1ItNzcgQ3Jvc3MgUmVmZXJlbmNlIj4KKworPHA+VGhlIG1hbmFnZWQgb2JqZWN0cyBpbiB0aGUgSlNSLTc3IG9iamVjdCBoaWVyYXJjaHkgY29ycmVzcG9uZAordG8gdGhlIHNwZWNpZmllZCBNQmVhbiBuYW1lcyBvciBncm91cHMgYXMgZm9sbG93czo8L3A+CisKKzx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSI1Ij4KKworICA8dHI+CisgICAgPHRoIGFsaWduPSJjZW50ZXIiIGJnY29sb3I9ImFxdWEiPkpTUi03NyBNYW5hZ2VkIE9iamVjdDwvdGg+CisgICAgPHRoIGFsaWduPSJjZW50ZXIiIGJnY29sb3I9ImFxdWEiPk1CZWFuIE5hbWUgb3IgR3JvdXA8L3RoPgorICAgIDx0aCBhbGlnbj0iY2VudGVyIiBiZ2NvbG9yPSJhcXVhIj5Db21tZW50czwvdGg+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD48Y29kZT5KMkVFU2VydmVyPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPiR7U0VSVklDRX08L2NvZGU+PC90ZD4KKyAgICA8dGQ+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPjxjb2RlPk5vZGU8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+JHtTRVJWSUNFfTwvY29kZT48L3RkPgorICAgIDx0ZD5Ub21jYXQgc3VwcG9ydHMgYSBzaW5nbGUgbm9kZSBvbmx5LjwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD48Y29kZT5Qb3J0PC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPiR7Q09OTkVDVE9SfTwvY29kZT48L3RkPgorICAgIDx0ZD48L3RkPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+PGNvZGU+U2VydmxldDwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT4ke1dSQVBQRVJ9PC9jb2RlPjwvdGQ+CisgICAgPHRkPjxzdHJvbmc+RklYTUU8L3N0cm9uZz4gLSBOb3QgeWV0IGlkZW50aWZpZWQgYXMgYW4gTUJlYW48L3RkPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+PGNvZGU+V2ViTW9kdWxlPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPiR7Q09OVEVYVH08L2NvZGU+PC90ZD4KKyAgICA8dGQ+PC90ZD4KKyAgPC90cj4KKworPC90YWJsZT4KKworPC9zZWN0aW9uPgorCis8c2VjdGlvbiBuYW1lPSJKU1ItODggQ3Jvc3MgUmVmZXJlbmNlIj4KKworPHA+VGhlIGRlcGxveW1lbnQgb2JqZWN0cyBpbiB0aGUgSlNSLTg4IEFQSSBvYmplY3QgaGllcmFyY2h5IGNvcnJlc3BvbmQKK3RvIHRoZSBzcGVjaWZpZWQgTUJlYW4gbmFtZXMgb3IgZ3JvdXBzIGFzIGZvbGxvd3M6PC9wPgorCis8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iNSI+CisKKyAgPHRyPgorICAgIDx0aCBhbGlnbj0iY2VudGVyIiBiZ2NvbG9yPSJhcXVhIj5KU1ItODggQVBJIE9iamVjdDwvdGg+CisgICAgPHRoIGFsaWduPSJjZW50ZXIiIGJnY29sb3I9ImFxdWEiPk1CZWFuIE5hbWUgb3IgR3JvdXA8L3RoPgorICAgIDx0aCBhbGlnbj0iY2VudGVyIiBiZ2NvbG9yPSJhcXVhIj5Db21tZW50czwvdGg+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD48Y29kZT5EZXBsb3lhYmxlT2JqZWN0PC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPiR7Q09OVEVYVH08L2NvZGU+PC90ZD4KKyAgICA8dGQ+Q29udGV4dCBkZXBsb3ltZW50IGluZm8gcGx1cyB0aGUgY29ycmVzcG9uZGluZyBXQVIgZmlsZTwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD48Y29kZT5UYXJnZXQ8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+JHtIT1NUfTwvY29kZT48L3RkPgorICAgIDx0ZD48L3RkPgorICA8L3RyPgorCis8L3RhYmxlPgorCis8L3NlY3Rpb24+CisKKzwvYm9keT4KKworPC9kb2N1bWVudD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvZnVuY3NwZWNzL3Byb2plY3QueG1sIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9mdW5jc3BlY3MvcHJvamVjdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI2NWEwNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvZnVuY3NwZWNzL3Byb2plY3QueG1sCkBAIC0wLDAgKzEsMzkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KKzxwcm9qZWN0IG5hbWU9IkNhdGFsaW5hIEZ1bmN0aW9uYWwgU3BlY2lmaWNhdGlvbnMiCisgICAgICAgIGhyZWY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvdG9tY2F0LyI+CisKKyAgICA8dGl0bGU+Q2F0YWxpbmEgRnVuY3Rpb25hbCBTcGVjaWZpY2F0aW9uczwvdGl0bGU+CisKKyAgICA8bG9nbyBocmVmPSIvaW1hZ2VzL3RvbWNhdC5naWYiPgorICAgICAgQ2F0YWxpbmEgRnVuY3Rpb25hbCBTcGVjaWZpY2F0aW9ucworICAgIDwvbG9nbz4KKworICAgIDxib2R5PgorCisgICAgPG1lbnUgbmFtZT0iTGlua3MiPgorICAgICAgICA8aXRlbSBuYW1lPSJEb2NzIEhvbWUiICAgICAgICAgICAgIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiLz4KKyAgICAgICAgPGl0ZW0gbmFtZT0iRnVuY3Rpb25hbCBTcGVjcyIgICAgICBocmVmPSJpbmRleC5odG1sIi8+CisgICAgPC9tZW51PgorCisgICAgPG1lbnUgbmFtZT0iQWRtaW5pc3RyYXRpdmUgQXBwcyI+CisgICAgICAgIDxpdGVtIG5hbWU9Ik92ZXJhbGwgUmVxdWlyZW1lbnRzIiAgaHJlZj0iZnMtYWRtaW4tYXBwcy5odG1sIi8+CisJICA8aXRlbSBuYW1lPSJUb21jYXQgTUJlYW4gTmFtZXMiICAgIGhyZWY9Im1iZWFuLW5hbWVzLmh0bWwiLz4KKyAgICAgICAgPGl0ZW0gbmFtZT0iQWRtaW5pc3RlcmVkIE9iamVjdHMiICBocmVmPSJmcy1hZG1pbi1vYmplY3RzLmh0bWwiLz4KKyAgICAgICAgPGl0ZW0gbmFtZT0iU3VwcG9ydGVkIE9wZXJhdGlvbnMiICBocmVmPSJmcy1hZG1pbi1vcGVycy5odG1sIi8+CisgICAgPC9tZW51PgorCisgICAgPG1lbnUgbmFtZT0iSW50ZXJuYWwgU2VydmxldHMiPgorICAgICAgICA8aXRlbSBuYW1lPSJEZWZhdWx0IFNlcnZsZXQiICAgICAgIGhyZWY9ImZzLWRlZmF1bHQuaHRtbCIvPgorICAgICAgICA8aXRlbSBuYW1lPSJJbnZva2VyIFNlcnZsZXQiICAgICAgIGhyZWY9ImZzLWludm9rZXIuaHRtbCIvPgorICAgIDwvbWVudT4KKworICAgIDxtZW51IG5hbWU9IlJlYWxtIEltcGxlbWVudGF0aW9ucyI+CisgICAgICAgIDxpdGVtIG5hbWU9IkpEQkMgUmVhbG0iICAgICAgICAgICAgaHJlZj0iZnMtamRiYy1yZWFsbS5odG1sIi8+CisgICAgICAgIDxpdGVtIG5hbWU9IkpOREkgUmVhbG0iICAgICAgICAgICAgaHJlZj0iZnMtam5kaS1yZWFsbS5odG1sIi8+CisgICAgICAgIDxpdGVtIG5hbWU9Ik1lbW9yeSBSZWFsbSIgICAgICAgICAgaHJlZj0iZnMtbWVtb3J5LXJlYWxtLmh0bWwiLz4KKyAgICA8L21lbnU+CisKKworICAgIDwvYm9keT4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9odG1sLW1hbmFnZXItaG93dG8ueG1sIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9odG1sLW1hbmFnZXItaG93dG8ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmM2E3NDcKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2h0bWwtbWFuYWdlci1ob3d0by54bWwKQEAgLTAsMCArMSw1NDMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCFET0NUWVBFIGRvY3VtZW50IFsKKyAgPCFFTlRJVFkgcHJvamVjdCBTWVNURU0gInByb2plY3QueG1sIj4KK10+Cis8ZG9jdW1lbnQgdXJsPSJodG1sLW1hbmFnZXItaG93dG8uaHRtbCI+CisKKyAgICAmcHJvamVjdDsKKworICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICA8YXV0aG9yIGVtYWlsPSJnbGVubkBhcGFjaGUub3JnIj5HbGVubiBMLiBOaWVsc2VuPC9hdXRob3I+CisgICAgICAgIDx0aXRsZT5Ub21jYXQgV2ViIEFwcGxpY2F0aW9uIE1hbmFnZXIgSG93IFRvPC90aXRsZT4KKyAgICA8L3Byb3BlcnRpZXM+CisKKzxib2R5PgorCis8c2VjdGlvbiBuYW1lPSJJbnRyb2R1Y3Rpb24iPgorCis8cD5JbiBtYW55IHByb2R1Y3Rpb24gZW52aXJvbm1lbnRzIGl0IGlzIHZlcnkgdXNlZnVsIHRvIGhhdmUgdGhlIGNhcGFiaWxpdHkKK3RvIG1hbmFnZSB5b3VyIHdlYiBhcHBsaWNhdGlvbnMgd2l0aG91dCBoYXZpbmcgdG8gc2h1dCBkb3duIGFuZCByZXN0YXJ0CitUb21jYXQuICBUaGlzIGRvY3VtZW50IGlzIGZvciB0aGUgSFRNTCB3ZWIgaW50ZXJmYWNlIHRvIHRoZSB3ZWIgYXBwbGljYXRpb24KKzxhIGhyZWY9Im1hbmFnZXItaG93dG8uaHRtbCI+bWFuYWdlcjwvYT4uPC9wPgorCis8cD5UaGUgaW50ZXJmYWNlIGlzIGRpdmlkZWQgaW50byBmaXZlIHNlY3Rpb25zOgorPHVsPgorICA8bGk+PHN0cm9uZz5NZXNzYWdlPC9zdHJvbmc+IC0gRGlzcGxheXMgc3VjY2VzcyBhbmQgZmFpbHVyZSBtZXNzYWdlcy48L2xpPgorICA8bGk+PHN0cm9uZz5NYW5hZ2VyPC9zdHJvbmc+IC0gR2VuZXJhbCBtYW5hZ2VyIG9wZXJhdGlvbnMgbGlrZSBsaXN0IGFuZAorICAgICAgaGVscC48L2xpPgorICA8bGk+PHN0cm9uZz5BcHBsaWNhdGlvbnM8L3N0cm9uZz4gLSBMaXN0IG9mIHdlYiBhcHBsaWNhdGlvbnMgYW5kCisgICAgICBjb21tYW5kcy48L2xpPgorICA8bGk+PHN0cm9uZz5EZXBsb3k8L3N0cm9uZz4gLSBEZXBsb3lpbmcgd2ViIGFwcGxpY2F0aW9ucy48L2xpPgorICA8bGk+PHN0cm9uZz5TZXJ2ZXIgSW5mb3JtYXRpb248L3N0cm9uZz4gLSBJbmZvcm1hdGlvbiBhYm91dCB0aGUgVG9tY2F0CisgICAgICBzZXJ2ZXIuPC9saT4KKzwvdWw+Cis8L3A+CisKKzwvc2VjdGlvbj4KKworPHNlY3Rpb24gbmFtZT0iTWVzc2FnZSI+CisKKzxwPgorRGlzcGxheXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN1Y2Nlc3Mgb3IgZmFpbHVyZSBvZiB0aGUgbGFzdCB3ZWIgYXBwbGljYXRpb24KK21hbmFnZXIgY29tbWFuZCB5b3UgcGVyZm9ybWVkLiBJZiBpdCBzdWNjZWVkZWQgPHN0cm9uZz5PSzwvc3Ryb25nPiBpcyBkaXNwbGF5ZWQKK2FuZCBtYXkgYmUgZm9sbG93ZWQgYnkgYSBzdWNjZXNzIG1lc3NhZ2UuIElmIGl0IGZhaWxlZCA8c3Ryb25nPkZBSUw8L3N0cm9uZz4KK2lzIGRpc3BsYXllZCBmb2xsb3dlZCBieSBhbiBlcnJvciBtZXNzYWdlLiBDb21tb24gZmFpbHVyZSBtZXNzYWdlcyBhcmUKK2RvY3VtZW50ZWQgYmVsb3cgZm9yIGVhY2ggY29tbWFuZC4gIFRoZSBjb21wbGV0ZSBsaXN0IG9mIGZhaWx1cmUgbWVzc2FnZXMgZm9yCitlYWNoIGNvbW1hbmQgY2FuIGJlIGZvdW5kIGluIHRoZSA8YSBocmVmPSJtYW5hZ2VyLWhvd3RvLmh0bWwiPm1hbmFnZXI8L2E+IHdlYgorYXBwbGljYXRpb24gZG9jdW1lbnRhdGlvbi4KKzwvcD4KKworPC9zZWN0aW9uPgorCis8c2VjdGlvbiBuYW1lPSJNYW5hZ2VyIj4KKworPHA+VGhlIE1hbmFnZXIgc2VjdGlvbiBoYXMgdGhyZWUgbGlua3M6Cis8dWw+CisgIDxsaT48c3Ryb25nPkxpc3QgQXBwbGljYXRpb25zPC9zdHJvbmc+IC0gUmVkaXNwbGF5IGEgbGlzdCBvZiB3ZWIKKyAgICAgIGFwcGxpY2F0aW9ucy48L2xpPgorICA8bGk+PHN0cm9uZz5IVE1MIE1hbmFnZXIgSGVscDwvc3Ryb25nPiAtIEEgbGluayB0byB0aGlzIGRvY3VtZW50LjwvbGk+CisgIDxsaT48c3Ryb25nPk1hbmFnZXIgSGVscDwvc3Ryb25nPiAtIEEgbGluayB0byB0aGUgY29tcHJlaGVuc2l2ZSBNYW5hZ2VyCisgICAgICBBcHAgSE9XIFRPLjwvbGk+Cis8L3VsPgorPC9wPgorCis8L3NlY3Rpb24+CisKKzxzZWN0aW9uIG5hbWU9IkFwcGxpY2F0aW9ucyI+CisKKzxwPlRoZSBBcHBsaWNhdGlvbnMgc2VjdGlvbiBsaXN0cyBpbmZvcm1hdGlvbiBhYm91dCBhbGwgdGhlIGluc3RhbGxlZCB3ZWIKK2FwcGxpY2F0aW9ucyBhbmQgcHJvdmlkZXMgbGlua3MgZm9yIG1hbmFnaW5nIHRoZW0uIEZvciBlYWNoIHdlYiBhcHBsaWNhdGlvbgordGhlIGZvbGxvd2luZyBpcyBkaXNwbGF5ZWQ6Cis8dWw+CisgIDxsaT48c3Ryb25nPlBhdGg8L3N0cm9uZz4gLSBUaGUgd2ViIGFwcGxpY2F0b24gY29udGV4dCBwYXRoLjwvbGk+CisgIDxsaT48c3Ryb25nPkRpc3BsYXkgTmFtZTwvc3Ryb25nPiAtIFRoZSBkaXNwbGF5IG5hbWUgZm9yIHRoZSB3ZWIgYXBwbGljYXRpb24KKyAgICAgIGlmIGl0IGhhcyBvbmUgY29uZmlndXJlZCBpbiBpdHMgIndlYi54bWwiIGZpbGUuPC9saT4KKyAgPGxpPjxzdHJvbmc+UnVubmluZzwvc3Ryb25nPiAtIFdoZXRoZXIgdGhlIHdlYiBhcHBsaWNhdGlvbiBpcyBydW5uaW5nIGFuZAorICAgICAgYXZhaWxhYmxlICh0cnVlKSwgb3Igbm90IHJ1bm5pbmcgYW5kIHVuYXZhaWxhYmxlIChmYWxzZSkuPC9saT4KKyAgPGxpPjxzdHJvbmc+U2Vzc2lvbnM8L3N0cm9uZz4gLSBUaGUgbnVtYmVyIG9mIGFjdGl2ZSBzZXNzaW9ucyBmb3IgcmVtb3RlCisgICAgICB1c2VycyBvZiB0aGlzIHdlYiBhcHBsaWNhdGlvbi4gIFRoZSBudW1iZXIgb2Ygc2Vzc2lvbnMgaXMgYSBsaW5rIHdoaWNoCisgICAgICB3aGVuIHN1Ym1pdHRlZCBkaXNwbGF5cyBtb3JlIGRldGFpbHMgYWJvdXQgc2Vzc2lvbiB1c2FnZSBieSB0aGUgd2ViCisgICAgICBhcHBsaWNhdGlvbiBpbiB0aGUgTWVzc2FnZSBib3guPC9saT4KKyAgPGxpPjxzdHJvbmc+Q29tbWFuZHM8L3N0cm9uZz4gLSBMaXN0cyBhbGwgY29tbWFuZHMgd2hpY2ggY2FuIGJlIHBlcmZvcm1lZCBvbgorICAgICAgdGhlIHdlYiBhcHBsaWNhdGlvbi4gT25seSB0aG9zZSBjb21tYW5kcyB3aGljaCBjYW4gYmUgcGVyZm9ybWVkIHdpbGwgYmUKKyAgICAgIGxpc3RlZCBhcyBhIGxpbmsgd2hpY2ggY2FuIGJlIHN1Ym1pdHRlZC4gTm8gY29tbWFuZHMgY2FuIGJlIHBlcmZvcm1lZCBvbgorICAgICAgdGhlIG1hbmFnZXIgd2ViIGFwcGxpY2F0aW9uIGl0c2VsZi4gVGhlIGZvbGxvd2luZyBjb21tYW5kcyBjYW4gYmUKKyAgICAgIHBlcmZvcm1lZDoKKyAgICAgIDx1bD4KKyAgICAgICAgPGxpPjxzdHJvbmc+U3RhcnQ8L3N0cm9uZz4gLSBTdGFydCBhIHdlYiBhcHBsaWNhdGlvbiB3aGljaCBoYWQgYmVlbgorICAgICAgICAgICAgc3RvcHBlZC48L2xpPgorICAgICAgICA8bGk+PHN0cm9uZz5TdG9wPC9zdHJvbmc+IC0gU3RvcCBhIHdlYiBhcHBsaWNhdGlvbiB3aGljaCBpcyBjdXJyZW50bHkKKyAgICAgICAgICAgIHJ1bm5pbmcgYW5kIG1ha2UgaXQgdW5hdmFpbGFibGUuPC9saT4KKyAgICAgICAgPGxpPjxzdHJvbmc+UmVsb2FkPC9zdHJvbmc+IC0gUmVsb2FkIHRoZSB3ZWIgYXBwbGljYXRpb24gc28gdGhhdCBuZXcKKyAgICAgICAgICAgICIuamFyIiBmaWxlcyBpbiA8Y29kZT4vV0VCLUlORi9saWIvPC9jb2RlPiBvciBuZXcgY2xhc3NlcyBpbgorICAgICAgICAgICAgPGNvZGU+L1dFQi1JTkYvY2xhc3Nlcy88L2NvZGU+IGNhbiBiZSB1c2VkLjwvbGk+CisgICAgICAgIDxsaT48c3Ryb25nPlVuZGVwbG95PC9zdHJvbmc+IC0gU3RvcCBhbmQgdGhlbiByZW1vdmUgdGhpcyB3ZWIKKyAgICAgICAgICAgICBhcHBsaWNhdGlvbiBmcm9tIHRoZSBzZXJ2ZXIuPC9saT4KKyAgICAgIDwvdWw+CisgIDwvbGk+Cis8L3VsPgorPC9wPgorCis8c3Vic2VjdGlvbiBuYW1lPSJTdGFydCI+CisKKzxwPlNpZ25hbCBhIHN0b3BwZWQgYXBwbGljYXRpb24gdG8gcmVzdGFydCwgYW5kIG1ha2UgaXRzZWxmIGF2YWlsYWJsZSBhZ2Fpbi4KK1N0b3BwaW5nIGFuZCBzdGFydGluZyBpcyB1c2VmdWwsIGZvciBleGFtcGxlLCBpZiB0aGUgZGF0YWJhc2UgcmVxdWlyZWQgYnkKK3lvdXIgYXBwbGljYXRpb24gYmVjb21lcyB0ZW1wb3JhcmlseSB1bmF2YWlsYWJsZS4gIEl0IGlzIHVzdWFsbHkgYmV0dGVyIHRvCitzdG9wIHRoZSB3ZWIgYXBwbGljYXRpb24gdGhhdCByZWxpZXMgb24gdGhpcyBkYXRhYmFzZSByYXRoZXIgdGhhbiBsZXR0aW5nCit1c2VycyBjb250aW51b3VzbHkgZW5jb3VudGVyIGRhdGFiYXNlIGV4Y2VwdGlvbnMuPC9wPgorCis8cD5JZiB0aGlzIGNvbW1hbmQgc3VjY2VlZHMsIHlvdSB3aWxsIHNlZSBhIE1lc3NhZ2UgbGlrZSB0aGlzOjwvcD4KKzxzb3VyY2U+CitPSyAtIFN0YXJ0ZWQgYXBwbGljYXRpb24gYXQgY29udGV4dCBwYXRoIC9leGFtcGxlcworPC9zb3VyY2U+CisKKzxwPk90aGVyd2lzZSwgdGhlIE1lc3NhZ2Ugd2lsbCBzdGFydCB3aXRoIDxjb2RlPkZBSUw8L2NvZGU+IGFuZCBpbmNsdWRlIGFuCitlcnJvciBtZXNzYWdlLiAgUG9zc2libGUgY2F1c2VzIGZvciBwcm9ibGVtcyBpbmNsdWRlOgorPHVsPgorPGxpPjxlbT5FbmNvdW50ZXJlZCBleGNlcHRpb248L2VtPgorICAgIDxibG9ja3F1b3RlPiAgICAgICAgICAgICAKKyAgICA8cD5BbiBleGNlcHRpb24gd2FzIGVuY291bnRlcmVkIHRyeWluZyB0byBzdGFydCB0aGUgd2ViIGFwcGxpY2F0aW9uLgorICAgIENoZWNrIHRoZSBUb21jYXQgNSBsb2dzIGZvciB0aGUgZGV0YWlscy48L3A+CisgICAgPC9ibG9ja3F1b3RlPjwvbGk+ICAgICAgIAorPGxpPjxlbT5JbnZhbGlkIGNvbnRleHQgcGF0aCB3YXMgc3BlY2lmaWVkPC9lbT4KKyAgICA8YmxvY2txdW90ZT4gICAgICAgICAgICAgCisgICAgPHA+VGhlIGNvbnRleHQgcGF0aCBtdXN0IHN0YXJ0IHdpdGggYSBzbGFzaCBjaGFyYWN0ZXIsIHVubGVzcyB5b3UgYXJlCisgICAgcmVmZXJlbmNpbmcgdGhlIFJPT1Qgd2ViIGFwcGxpY2F0aW9uIC0tIGluIHdoaWNoIGNhc2UgdGhlIGNvbnRleHQgcGF0aAorICAgIG11c3QgYmUgYSB6ZXJvLWxlbmd0aCBzdHJpbmcuPC9wPgorICAgIDwvYmxvY2txdW90ZT48L2xpPiAgICAgICAKKzxsaT48ZW0+Tm8gY29udGV4dCBleGlzdHMgZm9yIHBhdGggL2ZvbzwvZW0+CisgICAgPGJsb2NrcXVvdGU+ICAgICAgICAgICAgIAorICAgIDxwPlRoZXJlIGlzIG5vIGRlcGxveWVkIGFwcGxpY2F0aW9uIG9uIHRoZSBjb250ZXh0IHBhdGgKKyAgICB0aGF0IHlvdSBzcGVjaWZpZWQuPC9wPiAgCisgICAgPC9ibG9ja3F1b3RlPjwvbGk+ICAgICAgIAorPGxpPjxlbT5ObyBjb250ZXh0IHBhdGggd2FzIHNwZWNpZmllZDwvZW0+CisgICAgPGJsb2NrcXVvdGU+ICAgICAgICAgICAgIAorICAgIFRoZSA8Y29kZT5wYXRoPC9jb2RlPiBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQuCisgICAgPC9ibG9ja3F1b3RlPjwvbGk+ICAgICAgIAorPC91bD4KKzwvcD4KKworPC9zdWJzZWN0aW9uPgorCis8c3Vic2VjdGlvbiBuYW1lPSJTdG9wIj4KKworPHA+U2lnbmFsIGFuIGV4aXN0aW5nIGFwcGxpY2F0aW9uIHRvIG1ha2UgaXRzZWxmIHVuYXZhaWxhYmxlLCBidXQgbGVhdmUgaXQKK2RlcGxveWVkLiAgQW55IHJlcXVlc3QgdGhhdCBjb21lcyBpbiB3aGlsZSBhbiBhcHBsaWNhdGlvbiBpcworc3RvcHBlZCB3aWxsIHNlZSBhbiBIVFRQIGVycm9yIDQwNCwgYW5kIHRoaXMgYXBwbGljYXRpb24gd2lsbCBzaG93IGFzCisic3RvcHBlZCIgb24gYSBsaXN0IGFwcGxpY2F0aW9ucyBjb21tYW5kLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCis8cD5JZiB0aGlzIGNvbW1hbmQgc3VjY2VlZHMsIHlvdSB3aWxsIHNlZSBhIE1lc3NhZ2UgbGlrZSB0aGlzOjwvcD4KKzxzb3VyY2U+CitPSyAtIFN0b3BwZWQgYXBwbGljYXRpb24gYXQgY29udGV4dCBwYXRoIC9leGFtcGxlcworPC9zb3VyY2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorPHA+T3RoZXJ3aXNlLCB0aGUgTWVzc2FnZSB3aWxsIHN0YXJ0IHdpdGggPGNvZGU+RkFJTDwvY29kZT4gYW5kIGluY2x1ZGUgYW4KK2Vycm9yIG1lc3NhZ2UuICBQb3NzaWJsZSBjYXVzZXMgZm9yIHByb2JsZW1zIGluY2x1ZGU6Cis8dWw+ICAgICAgICAgICAgICAgICAgICAgICAgIAorPGxpPjxlbT5FbmNvdW50ZXJlZCBleGNlcHRpb248L2VtPgorICAgIDxibG9ja3F1b3RlPiAgICAgICAgICAgICAKKyAgICA8cD5BbiBleGNlcHRpb24gd2FzIGVuY291bnRlcmVkIHRyeWluZyB0byBzdG9wIHRoZSB3ZWIgYXBwbGljYXRpb24uCisgICAgQ2hlY2sgdGhlIFRvbWNhdCA1IGxvZ3MgZm9yIHRoZSBkZXRhaWxzLjwvcD4KKyAgICA8L2Jsb2NrcXVvdGU+PC9saT4gICAgICAgCis8bGk+PGVtPkludmFsaWQgY29udGV4dCBwYXRoIHdhcyBzcGVjaWZpZWQ8L2VtPgorICAgIDxibG9ja3F1b3RlPiAgICAgICAgICAgICAKKyAgICA8cD5UaGUgY29udGV4dCBwYXRoIG11c3Qgc3RhcnQgd2l0aCBhIHNsYXNoIGNoYXJhY3RlciwgdW5sZXNzIHlvdSBhcmUKKyAgICByZWZlcmVuY2luZyB0aGUgUk9PVCB3ZWIgYXBwbGljYXRpb24gLS0gaW4gd2hpY2ggY2FzZSB0aGUgY29udGV4dCBwYXRoCisgICAgbXVzdCBiZSBhIHplcm8tbGVuZ3RoIHN0cmluZy48L3A+CisgICAgPC9ibG9ja3F1b3RlPjwvbGk+ICAgICAgIAorPGxpPjxlbT5ObyBjb250ZXh0IGV4aXN0cyBmb3IgcGF0aCAvZm9vPC9lbT4KKyAgICA8YmxvY2txdW90ZT4gICAgICAgICAgICAgCisgICAgPHA+VGhlcmUgaXMgbm8gZGVwbG95ZWQgYXBwbGljYXRpb24gb24gdGhlIGNvbnRleHQgcGF0aAorICAgIHRoYXQgeW91IHNwZWNpZmllZC48L3A+ICAKKyAgICA8L2Jsb2NrcXVvdGU+PC9saT4gICAgICAgCis8bGk+PGVtPk5vIGNvbnRleHQgcGF0aCB3YXMgc3BlY2lmaWVkPC9lbT4KKyAgICA8YmxvY2txdW90ZT4gICAgICAgICAgICAgCisgICAgVGhlIDxjb2RlPnBhdGg8L2NvZGU+IHBhcmFtZXRlciBpcyByZXF1aXJlZC4KKyAgICA8L2Jsb2NrcXVvdGU+PC9saT4gICAgICAgCis8L3VsPgorPC9wPgorCis8L3N1YnNlY3Rpb24+CisKKzxzdWJzZWN0aW9uIG5hbWU9IlJlbG9hZCI+CisKKzxwPlNpZ25hbCBhbiBleGlzdGluZyBhcHBsaWNhdGlvbiB0byBzaHV0IGl0c2VsZiBkb3duIGFuZCByZWxvYWQuICBUaGlzIGNhbgorYmUgdXNlZnVsIHdoZW4gdGhlIHdlYiBhcHBsaWNhdGlvbiBjb250ZXh0IGlzIG5vdCByZWxvYWRhYmxlIGFuZCB5b3UgaGF2ZQordXBkYXRlZCBjbGFzc2VzIG9yIHByb3BlcnR5IGZpbGVzIGluIHRoZSA8Y29kZT4vV0VCLUlORi9jbGFzc2VzPC9jb2RlPgorZGlyZWN0b3J5IG9yIHdoZW4geW91IGhhdmUgYWRkZWQgb3IgdXBkYXRlZCBqYXIgZmlsZXMgaW4gdGhlCis8Y29kZT4vV0VCLUlORi9saWI8L2NvZGU+IGRpcmVjdG9yeS4KKzwvcD4KKzxwPjxzdHJvbmc+Tk9URTo8L3N0cm9uZz4gVGhlIDxjb2RlPi9XRUItSU5GL3dlYi54bWw8L2NvZGU+Cit3ZWIgYXBwbGljYXRpb24gY29uZmlndXJhdGlvbiBmaWxlIGlzIG5vdCBjaGVja2VkIG9uIGEgcmVsb2FkOwordGhlIHByZXZpb3VzIHdlYi54bWwgY29uZmlndXJhdGlvbiBpcyB1c2VkLgorSWYgeW91IGhhdmUgbWFkZSBjaGFuZ2VzIHRvIHlvdXIgd2ViLnhtbCBmaWxlIHlvdSBtdXN0IHN0b3AKK3RoZW4gc3RhcnQgdGhlIHdlYiBhcHBsaWNhdGlvbi4KKzwvcD4KKworPHA+SWYgdGhpcyBjb21tYW5kIHN1Y2NlZWRzLCB5b3Ugd2lsbCBzZWUgYSBNZXNzYWdlIGxpa2UgdGhpczo8L3A+Cis8c291cmNlPgorT0sgLSBSZWxvYWRlZCBhcHBsaWNhdGlvbiBhdCBjb250ZXh0IHBhdGggL2V4YW1wbGVzCis8L3NvdXJjZT4KKworPHA+T3RoZXJ3aXNlLCB0aGUgTWVzc2FnZSB3aWxsIHN0YXJ0IHdpdGggPGNvZGU+RkFJTDwvY29kZT4gYW5kIGluY2x1ZGUgYW4KK2Vycm9yIG1lc3NhZ2UuICBQb3NzaWJsZSBjYXVzZXMgZm9yIHByb2JsZW1zIGluY2x1ZGU6Cis8dWw+Cis8bGk+PGVtPkVuY291bnRlcmVkIGV4Y2VwdGlvbjwvZW0+CisgICAgPGJsb2NrcXVvdGU+ICAgICAgICAgICAgIAorICAgIDxwPkFuIGV4Y2VwdGlvbiB3YXMgZW5jb3VudGVyZWQgdHJ5aW5nIHRvIHJlc3RhcnQgdGhlIHdlYiBhcHBsaWNhdGlvbi4KKyAgICBDaGVjayB0aGUgVG9tY2F0IDUgbG9ncyBmb3IgdGhlIGRldGFpbHMuPC9wPgorICAgIDwvYmxvY2txdW90ZT48L2xpPiAgICAgICAKKzxsaT48ZW0+SW52YWxpZCBjb250ZXh0IHBhdGggd2FzIHNwZWNpZmllZDwvZW0+CisgICAgPGJsb2NrcXVvdGU+ICAgICAgICAgICAgIAorICAgIDxwPlRoZSBjb250ZXh0IHBhdGggbXVzdCBzdGFydCB3aXRoIGEgc2xhc2ggY2hhcmFjdGVyLCB1bmxlc3MgeW91IGFyZQorICAgIHJlZmVyZW5jaW5nIHRoZSBST09UIHdlYiBhcHBsaWNhdGlvbiAtLSBpbiB3aGljaCBjYXNlIHRoZSBjb250ZXh0IHBhdGgKKyAgICBtdXN0IGJlIGEgemVyby1sZW5ndGggc3RyaW5nLjwvcD4KKyAgICA8L2Jsb2NrcXVvdGU+PC9saT4gICAgICAgCis8bGk+PGVtPk5vIGNvbnRleHQgZXhpc3RzIGZvciBwYXRoIC9mb288L2VtPgorICAgIDxibG9ja3F1b3RlPiAgICAgICAgICAgICAKKyAgICA8cD5UaGVyZSBpcyBubyBkZXBsb3llZCBhcHBsaWNhdGlvbiBvbiB0aGUgY29udGV4dCBwYXRoCisgICAgdGhhdCB5b3Ugc3BlY2lmaWVkLjwvcD4gIAorICAgIDwvYmxvY2txdW90ZT48L2xpPiAgICAgICAKKzxsaT48ZW0+Tm8gY29udGV4dCBwYXRoIHdhcyBzcGVjaWZpZWQ8L2VtPgorICAgIDxibG9ja3F1b3RlPiAgICAgICAgICAgICAKKyAgICBUaGUgPGNvZGU+cGF0aDwvY29kZT4gcGFyYW1ldGVyIGlzIHJlcXVpcmVkLgorICAgIDwvYmxvY2txdW90ZT48L2xpPiAgICAgICAKKzxsaT48ZW0+UmVsb2FkIG5vdCBzdXBwb3J0ZWQgb24gV0FSIGRlcGxveWVkIGF0IHBhdGggL2ZvbzwvZW0+CisgICAgPGJsb2NrcXVvdGU+ICAgICAgICAgICAgIAorICAgIEN1cnJlbnRseSwgYXBwbGljYXRpb24gcmVsb2FkaW5nICh0byBwaWNrIHVwIGNoYW5nZXMgdG8gdGhlIGNsYXNzZXMgb3IKKyAgICA8Y29kZT53ZWIueG1sPC9jb2RlPiBmaWxlKSBpcyBub3Qgc3VwcG9ydGVkIHdoZW4gYSB3ZWIgYXBwbGljYXRpb24gaXMKKyAgICBpbnN0YWxsZWQgZGlyZWN0bHkgZnJvbSBhIFdBUiBmaWxlLCB3aGljaCBoYXBwZW5zIHdoZW4gdGhlIGhvc3QgaXMgCisgICAgY29uZmlndXJlZCB0byBub3QgdW5wYWNrIFdBUiBmaWxlcy4gQXMgaXQgb25seSB3b3JrcyB3aGVuIHRoZSB3ZWIgCisgICAgYXBwbGljYXRpb24gaXMgaW5zdGFsbGVkIGZyb20gYW4gdW5wYWNrZWQgZGlyZWN0b3J5LCBpZiB5b3UgYXJlIHVzaW5nIAorICAgIGEgV0FSIGZpbGUsIHlvdSBzaG91bGQgPGNvZGU+dW5kZXBsb3k8L2NvZGU+IGFuZCB0aGVuIDxjb2RlPmRlcGxveTwvY29kZT4gCisgICAgdGhlIGFwcGxpY2F0aW9uIGFnYWluIHRvIHBpY2sgdXAgeW91ciBjaGFuZ2VzLgorICAgIDwvYmxvY2txdW90ZT48L2xpPiAgICAgICAKKzwvdWw+Cis8L3A+CisKKzwvc3Vic2VjdGlvbj4KKworPHN1YnNlY3Rpb24gbmFtZT0iVW5kZXBsb3kiPgorCis8cD48c3Ryb25nPjxmb250IGNvbG9yPSJyZWQiPldBUk5JTkc8L2ZvbnQ+IC0gVGhpcyBjb21tYW5kIHdpbGwgZGVsZXRlIHRoZQorY29udGVudHMgb2YgdGhlIHdlYiBhcHBsaWNhdGlvbiBkaXJlY3RvcnkgYW5kL29yICIud2FyIiBmaWxlIGlmIGl0IGV4aXN0cyB3aXRoaW4KK3RoZSA8Y29kZT5hcHBCYXNlPC9jb2RlPiBkaXJlY3RvcnkgKHR5cGljYWxseSAid2ViYXBwcyIpIGZvciB0aGlzIHZpcnR1YWwgaG9zdAorPC9zdHJvbmc+LiAgVGhlIHdlYiBhcHBsaWNhdGlvbiB0ZW1wb3Jhcnkgd29yayBkaXJlY3RvcnkgaXMgYWxzbyBkZWxldGVkLiAgSWYKK3lvdSBzaW1wbHkgd2FudCB0byB0YWtlIGFuIGFwcGxpY2F0aW9uIG91dCBvZiBzZXJ2aWNlLCB5b3Ugc2hvdWxkIHVzZSB0aGUKKzxjb2RlPi9zdG9wPC9jb2RlPiBjb21tYW5kIGluc3RlYWQuPC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKzxwPlNpZ25hbCBhbiBleGlzdGluZyBhcHBsaWNhdGlvbiB0byBncmFjZWZ1bGx5IHNodXQgaXRzZWxmIGRvd24sIGFuZCB0aGVuCityZW1vdmUgaXQgZnJvbSBUb21jYXQgKHdoaWNoIGFsc28gbWFrZXMgdGhpcyBjb250ZXh0IHBhdGggYXZhaWxhYmxlIGZvcgorcmV1c2UgbGF0ZXIpLiAgVGhpcyBjb21tYW5kIGlzIHRoZSBsb2dpY2FsIG9wcG9zaXRlIG9mIHRoZQorPGNvZGU+L2RlcGxveTwvY29kZT4gQW50IGNvbW1hbmQsIGFuZCB0aGUgcmVsYXRlZCBkZXBsb3kgZmVhdHVyZXMgYXZhaWxhYmxlIAoraW4gdGhlIEhUTUwgbWFuYWdlci48L3A+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorPHA+SWYgdGhpcyBjb21tYW5kIHN1Y2NlZWRzLCB5b3Ugd2lsbCBzZWUgYSBNZXNzYWdlIGxpa2UgdGhpczo8L3A+Cis8c291cmNlPgorT0sgLSBVbmRlcGxveWVkIGFwcGxpY2F0aW9uIGF0IGNvbnRleHQgcGF0aCAvZXhhbXBsZXMKKzwvc291cmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKzxwPk90aGVyd2lzZSwgdGhlIE1lc3NhZ2Ugd2lsbCBzdGFydCB3aXRoIDxjb2RlPkZBSUw8L2NvZGU+IGFuZCBpbmNsdWRlIGFuCitlcnJvciBtZXNzYWdlLiAgUG9zc2libGUgY2F1c2VzIGZvciBwcm9ibGVtcyBpbmNsdWRlOgorPHVsPiAgICAgICAgICAgICAgICAgICAgICAgICAKKzxsaT48ZW0+RW5jb3VudGVyZWQgZXhjZXB0aW9uPC9lbT4KKyAgICA8YmxvY2txdW90ZT4gICAgICAgICAgICAgCisgICAgPHA+QW4gZXhjZXB0aW9uIHdhcyBlbmNvdW50ZXJlZCB0cnlpbmcgdG8gdW5kZXBsb3kgdGhlIHdlYiBhcHBsaWNhdGlvbi4KKyAgICBDaGVjayB0aGUgVG9tY2F0IGxvZ3MgZm9yIHRoZSBkZXRhaWxzLjwvcD4KKyAgICA8L2Jsb2NrcXVvdGU+PC9saT4gICAgICAgCis8bGk+PGVtPkludmFsaWQgY29udGV4dCBwYXRoIHdhcyBzcGVjaWZpZWQ8L2VtPgorICAgIDxibG9ja3F1b3RlPiAgICAgICAgICAgICAKKyAgICA8cD5UaGUgY29udGV4dCBwYXRoIG11c3Qgc3RhcnQgd2l0aCBhIHNsYXNoIGNoYXJhY3RlciwgdW5sZXNzIHlvdSBhcmUKKyAgICByZWZlcmVuY2luZyB0aGUgUk9PVCB3ZWIgYXBwbGljYXRpb24gLS0gaW4gd2hpY2ggY2FzZSB0aGUgY29udGV4dCBwYXRoCisgICAgbXVzdCBiZSBhIHplcm8tbGVuZ3RoIHN0cmluZy48L3A+CisgICAgPC9ibG9ja3F1b3RlPjwvbGk+ICAgICAgIAorPGxpPjxlbT5ObyBjb250ZXh0IGV4aXN0cyBmb3IgcGF0aCAvZm9vPC9lbT4KKyAgICA8YmxvY2txdW90ZT4gICAgICAgICAgICAgCisgICAgPHA+VGhlcmUgaXMgbm8gZGVwbG95ZWQgYXBwbGljYXRpb24gb24gdGhlIGNvbnRleHQgcGF0aAorICAgIHRoYXQgeW91IHNwZWNpZmllZC48L3A+ICAKKyAgICA8L2Jsb2NrcXVvdGU+PC9saT4gICAgICAgCis8bGk+PGVtPk5vIGNvbnRleHQgcGF0aCB3YXMgc3BlY2lmaWVkPC9lbT4KKyAgICA8YmxvY2txdW90ZT4gICAgICAgICAgICAgCisgICAgVGhlIDxjb2RlPnBhdGg8L2NvZGU+IHBhcmFtZXRlciBpcyByZXF1aXJlZC4KKyAgICA8L2Jsb2NrcXVvdGU+PC9saT4gICAgICAgCis8L3VsPgorPC9wPgorCis8L3N1YnNlY3Rpb24+CisKKzwvc2VjdGlvbj4KKworPHNlY3Rpb24gbmFtZT0iRGVwbG95Ij4KKworPHA+V2ViIGFwcGxpY2F0aW9ucyBjYW4gYmUgZGVwbG95ZWQgdXNpbmcgZmlsZXMgb3IgZGlyZWN0b3JpZXMgbG9jYXRlZAorb24gdGhlIFRvbWNhdCBzZXJ2ZXIgb3IgeW91IGNhbiB1cGxvYWQgYSB3ZWIgYXBwbGljYXRpb24gYXJjaGl2ZSAoV0FSKQorZmlsZSB0byB0aGUgc2VydmVyLjwvcD4KKworPHA+VG8gaW5zdGFsbCBhbiBhcHBsaWNhdGlvbiwgZmlsbCBpbiB0aGUgYXBwcm9wcmlhdGUgZmllbGRzIGZvciB0aGUgdHlwZQorb2YgaW5zdGFsbCB5b3Ugd2FudCB0byBkbyBhbmQgdGhlbiBzdWJtaXQgaXQgdXNpbmcgdGhlIDxpPkluc3RhbGw8L2k+CitidXR0b24uPC9wPgorCis8c3Vic2VjdGlvbiBuYW1lPSJEZXBsb3kgZGlyZWN0b3J5IG9yIFdBUiBmaWxlIGxvY2F0ZWQgb24gc2VydmVyIj4KKworPHA+RGVwbG95IGFuZCBzdGFydCBhIG5ldyB3ZWIgYXBwbGljYXRpb24sIGF0dGFjaGVkIHRvIHRoZSBzcGVjaWZpZWQgPGk+Q29udGV4dAorUGF0aDo8L2k+ICh3aGljaCBtdXN0IG5vdCBiZSBpbiB1c2UgYnkgYW55IG90aGVyIHdlYiBhcHBsaWNhdGlvbikuCitUaGlzIGNvbW1hbmQgaXMgdGhlIGxvZ2ljYWwgb3Bwb3NpdGUgb2YgdGhlIDxlbT5VbmRlcGxveTwvZW0+IGNvbW1hbmQuPC9wPgorCis8cD5UaGVyZSBhcmUgYSBudW1iZXIgb2YgZGlmZmVyZW50IHdheXMgdGhlIGRlcGxveSBjb21tYW5kIGNhbiBiZSB1c2VkLjwvcD4KKworPGgzPkRlcGxveSBhIERpcmVjdG9yeSBvciBXQVIgYnkgVVJMPC9oMz4KKworPHA+SW5zdGFsbCBhIHdlYiBhcHBsaWNhdGlvbiBkaXJlY3Rvcnkgb3IgIi53YXIiIGZpbGUgbG9jYXRlZCBvbiB0aGUgVG9tY2F0CitzZXJ2ZXIuIElmIG5vIDxpPkNvbnRleHQgUGF0aDwvaT4gaXMgc3BlY2lmaWVkLCB0aGUgZGlyZWN0b3J5IG5hbWUgb3IgdGhlCit3YXIgZmlsZSBuYW1lIHdpdGhvdXQgdGhlICIud2FyIiBleHRlbnNpb24gaXMgdXNlZCBhcyB0aGUgcGF0aC4gVGhlCis8aT5XQVIgb3IgRGlyZWN0b3J5IFVSTDwvaT4gc3BlY2lmaWVzIGEgVVJMIChpbmNsdWRpbmcgdGhlIDxjb2RlPmZpbGU6PC9jb2RlPgorc2NoZW1lKSBmb3IgZWl0aGVyIGEgZGlyZWN0b3J5IG9yIGEgd2ViIGFwcGxpY2F0aW9uIGFyY2hpdmUgKFdBUikgZmlsZS4gVGhlCitzdXBwb3J0ZWQgc3ludGF4IGZvciBhIFVSTCByZWZlcnJpbmcgdG8gYSBXQVIgZmlsZSBpcyBkZXNjcmliZWQgb24gdGhlIEphdmFkb2NzCitwYWdlIGZvciB0aGUgPGNvZGU+amF2YS5uZXQuSmFyVVJMQ29ubmVjdGlvbjwvY29kZT4gY2xhc3MuICBVc2Ugb25seSBVUkxzIHRoYXQKK3JlZmVyIHRvIHRoZSBlbnRpcmUgV0FSIGZpbGUuPC9wPgorCis8cD5JbiB0aGlzIGV4YW1wbGUgdGhlIHdlYiBhcHBsaWNhdGlvbiBsb2NhdGVkIGluIHRoZSBkaXJlY3RvcnkKKzxjb2RlPkM6XHBhdGhcdG9cZm9vPC9jb2RlPiBvbiB0aGUgVG9tY2F0IHNlcnZlciAocnVubmluZyBvbiBXaW5kb3dzKQoraXMgZGVwbG95ZWQgYXMgdGhlIHdlYiBhcHBsaWNhdGlvbiBjb250ZXh0IG5hbWVkIDxjb2RlPi9mb290b288L2NvZGU+LgorPHNvdXJjZT4KK0NvbnRleHQgUGF0aDogL2Zvb3RvbworV0FSIG9yIERpcmVjdG9yeSBVUkw6IGZpbGU6QzovcGF0aC90by9mb28KKzwvc291cmNlPgorPC9wPgorCis8cD5JbiB0aGlzIGV4YW1wbGUgdGhlICIud2FyIiBmaWxlIDxjb2RlPi9wYXRoL3RvL2Jhci53YXI8L2NvZGU+IG9uIHRoZQorVG9tY2F0IHNlcnZlciAocnVubmluZyBvbiBVbml4KSBpcyBkZXBsb3llZCBhcyB0aGUgd2ViIGFwcGxpY2F0aW9uCitjb250ZXh0IG5hbWVkIDxjb2RlPi9iYXI8L2NvZGU+LiBOb3RpY2UgdGhhdCB0aGVyZSBpcyBubyA8Y29kZT5wYXRoPC9jb2RlPgorcGFyYW1ldGVyIHNvIHRoZSBjb250ZXh0IHBhdGggZGVmYXVsdHMgdG8gdGhlIG5hbWUgb2YgdGhlIHdlYiBhcHBsaWNhdGlvbgorYXJjaGl2ZSBmaWxlIHdpdGhvdXQgdGhlICIud2FyIiBleHRlbnNpb24uCis8c291cmNlPgorV0FSIG9yIERpcmVjdG9yeSBVUkw6IGphcjpmaWxlOi9wYXRoL3RvL2Jhci53YXIhLworPC9zb3VyY2U+Cis8L3A+CisKKzxoMz5EZXBsb3kgYSBEaXJlY3Rvcnkgb3IgV2FyIGZyb20gdGhlIEhvc3QgYXBwQmFzZTwvaDM+CisKKzxwPkluc3RhbGwgYSB3ZWIgYXBwbGljYXRpb24gZGlyZWN0b3J5IG9yICIud2FyIiBmaWxlIGxvY2F0ZWQgaW4geW91ciBIb3N0CithcHBCYXNlIGRpcmVjdG9yeS4gSWYgbm8gPGk+Q29udGV4dCBQYXRoPC9pPiBpcyBzcGVjaWZpZWQgdGhlIGRpcmVjdG9yeSBuYW1lCitvciB0aGUgd2FyIGZpbGUgbmFtZSB3aXRob3V0IHRoZSAiLndhciIgZXh0ZW5zaW9uIGlzIHVzZWQgYXMgdGhlIHBhdGguPC9wPgorCis8cD5JbiB0aGlzIGV4YW1wbGUgdGhlIHdlYiBhcHBsaWNhdGlvbiBsb2NhdGVkIGluIGEgc3ViZGlyZWN0b3J5IG5hbWVkCis8Y29kZT5mb288L2NvZGU+IGluIHRoZSBIb3N0IGFwcEJhc2UgZGlyZWN0b3J5IG9mIHRoZSBUb21jYXQgc2VydmVyIGlzCitkZXBsb3llZCBhcyB0aGUgd2ViIGFwcGxpY2F0aW9uIGNvbnRleHQgbmFtZWQgPGNvZGU+L2ZvbzwvY29kZT4uIE5vdGljZQordGhhdCB0aGVyZSBpcyBubyA8Y29kZT5wYXRoPC9jb2RlPiBwYXJhbWV0ZXIgc28gdGhlIGNvbnRleHQgcGF0aCBkZWZhdWx0cwordG8gdGhlIG5hbWUgb2YgdGhlIHdlYiBhcHBsaWNhdGlvbiBkaXJlY3RvcnkuCis8c291cmNlPgorV0FSIG9yIERpcmVjdG9yeSBVUkw6IGZvbworPC9zb3VyY2U+Cis8L3A+CisKKzxwPkluIHRoaXMgZXhhbXBsZSB0aGUgIi53YXIiIGZpbGUgPGNvZGU+YmFyLndhcjwvY29kZT4gbG9jYXRlZCBpbiB5b3VyCitIb3N0IGFwcEJhc2UgZGlyZWN0b3J5IG9uIHRoZSBUb21jYXQgc2VydmVyIGlzIGRlcGxveWVkIGFzIHRoZSB3ZWIKK2FwcGxpY2F0aW9uIGNvbnRleHQgbmFtZWQgPGNvZGU+L2JhcnRvbzwvY29kZT4uCis8c291cmNlPgorQ29udGV4dCBQYXRoOiAvYmFydG9vCitXQVIgb3IgRGlyZWN0b3J5IFVSTDogYmFyLndhcgorPC9zb3VyY2U+Cis8L3A+CisKKzxoMz5EZXBsb3kgdXNpbmcgYSBDb250ZXh0IGNvbmZpZ3VyYXRpb24gIi54bWwiIGZpbGU8L2gzPgorCis8cD5JZiB0aGUgSG9zdCBkZXBsb3lYTUwgZmxhZyBpcyBzZXQgdG8gdHJ1ZSwgeW91IGNhbiBpbnN0YWxsIGEgd2ViCithcHBsaWNhdGlvbiB1c2luZyBhIENvbnRleHQgY29uZmlndXJhdGlvbiAiLnhtbCIgZmlsZSBhbmQgYW4gb3B0aW9uYWwKKyIud2FyIiBmaWxlIG9yIHdlYiBhcHBsaWNhdGlvbiBkaXJlY3RvcnkuIFRoZSA8aT5Db250ZXh0IFBhdGg8L2k+CitpcyBub3QgdXNlZCB3aGVuIGluc3RhbGxpbmcgYSB3ZWIgYXBwbGljYXRpb24gdXNpbmcgYSBjb250ZXh0ICIueG1sIgorY29uZmlndXJhdGlvbiBmaWxlLjwvcD4KKworPHA+QSBDb250ZXh0IGNvbmZpZ3VyYXRpb24gIi54bWwiIGZpbGUgY2FuIGNvbnRhaW4gdmFsaWQgWE1MIGZvciBhCit3ZWIgYXBwbGljYXRpb24gQ29udGV4dCBqdXN0IGFzIGlmIGl0IHdlcmUgY29uZmlndXJlZCBpbiB5b3VyCitUb21jYXQgPGNvZGU+c2VydmVyLnhtbDwvY29kZT4gY29uZmlndXJhdGlvbiBmaWxlLiBIZXJlIGlzIGFuCitleGFtcGxlIGZvciBUb21jYXQgcnVubmluZyBvbiBXaW5kb3dzOgorPHNvdXJjZT4KKyZsdDtDb250ZXh0IHBhdGg9Ii9mb29iYXIiIGRvY0Jhc2U9IkM6XHBhdGhcdG9cYXBwbGljYXRpb25cZm9vYmFyIgorICAgICAgICAgZGVidWc9IjAiJmd0OworCisgICZsdDshLS0gTGluayB0byB0aGUgdXNlciBkYXRhYmFzZSB3ZSB3aWxsIGdldCByb2xlcyBmcm9tIC0tJmd0OworICAmbHQ7UmVzb3VyY2VMaW5rIG5hbWU9InVzZXJzIiBnbG9iYWw9IlVzZXJEYXRhYmFzZSIKKyAgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLlVzZXJEYXRhYmFzZSIvJmd0OworCismbHQ7L0NvbnRleHQmZ3Q7Cis8L3NvdXJjZT4KKzwvcD4KKworPHA+VXNlIG9mIHRoZSA8aT5XQVIgb3IgRGlyZWN0b3J5IFVSTDwvaT4gaXMgb3B0aW9uYWwuIFdoZW4gdXNlZAordG8gc2VsZWN0IGEgd2ViIGFwcGxpY2F0aW9uICIud2FyIiBmaWxlIG9yIGRpcmVjdG9yeSBpdCBvdmVycmlkZXMgYW55Citkb2NCYXNlIGNvbmZpZ3VyZWQgaW4gdGhlIGNvbnRleHQgY29uZmlndXJhdGlvbiAiLnhtbCIgZmlsZS48L3A+CisKKzxwPkhlcmUgaXMgYW4gZXhhbXBsZSBvZiBpbnN0YWxsaW5nIGFuIGFwcGxpY2F0aW9uIHVzaW5nIGEgQ29udGV4dAorY29uZmlndXJhdGlvbiAiLnhtbCIgZmlsZSBmb3IgVG9tY2F0IHJ1bm5pbmcgb24gV2luZG93cy4KKzxzb3VyY2U+CitYTUwgQ29uZmlndXJhdGlvbiBmaWxlIFVSTDogZmlsZTpDOi9wYXRoL3RvL2NvbnRleHQueG1sCis8L3NvdXJjZT4KKzwvcD4KKworPHA+SGVyZSBpcyBhbiBleGFtcGxlIG9mIGluc3RhbGxpbmcgYW4gYXBwbGljYXRpb24gdXNpbmcgYSBDb250ZXh0Citjb25maWd1cmF0aW9uICIueG1sIiBmaWxlIGFuZCBhIHdlYiBhcHBsaWNhdGlvbiAiLndhciIgZmlsZSBsb2NhdGVkCitvbiB0aGUgc2VydmVyIChUb21jYXQgcnVubmluZyBvbiBVbml4KS4KKzxzb3VyY2U+CitYTUwgQ29uZmlndXJhdGlvbiBmaWxlIFVSTDogZmlsZTovcGF0aC90by9jb250ZXh0LnhtbAorV0FSIG9yIERpcmVjdG9yeSBVUkw6IGphcjpmaWxlOi9wYXRoL3RvL2Jhci53YXIhLworPC9zb3VyY2U+Cis8L3A+CisKKzwvc3Vic2VjdGlvbj4KKworPHN1YnNlY3Rpb24gbmFtZT0iVXBsb2FkIGEgV0FSIGZpbGUgdG8gaW5zdGFsbCI+CisKKzxwPlVwbG9hZCBhIFdBUiBmaWxlIGZyb20geW91ciBsb2NhbCBzeXN0ZW0gYW5kIGluc3RhbGwgaXQgaW50byB0aGUKK2FwcEJhc2UgZm9yIHlvdXIgSG9zdC4gVGhlIG5hbWUgb2YgdGhlIFdBUiBmaWxlIHdpdGhvdXQgdGhlICIud2FyIgorZXh0ZW5zaW9uIGlzIHVzZWQgYXMgdGhlIGNvbnRleHQgcGF0aCBuYW1lLjwvcD4KKworPHA+VXNlIHRoZSA8aT5Ccm93c2U8L2k+IGJ1dHRvbiB0byBzZWxlY3QgYSBXQVIgZmlsZSB0byB1cGxvYWQgdG8gdGhlCitzZXJ2ZXIgZnJvbSB5b3VyIGxvY2FsIGRlc2t0b3Agc3lzdGVtLjwvcD4KKworPHA+VGhlIC5XQVIgZmlsZSBtYXkgaW5jbHVkZSBUb21jYXQgc3BlY2lmaWMgZGVwbG95bWVudCBjb25maWd1cmF0aW9uLCBieSAKK2luY2x1ZGluZyBhIENvbnRleHQgY29uZmlndXJhdGlvbiBYTUwgZmlsZSBpbiAKKzxjb2RlPi9NRVRBLUlORi9jb250ZXh0LnhtbDwvY29kZT4uPC9wPgorCis8cD5VcGxvYWQgb2YgYSBXQVIgZmlsZSBjb3VsZCBmYWlsIGZvciB0aGUgZm9sbG93aW5nIHJlYXNvbnM6PC9wPgorPHVsPgorPGxpPjxlbT5GaWxlIHVwbG9hZGVkIG11c3QgYmUgYSAud2FyPC9lbT4KKyAgICA8YmxvY2txdW90ZT4KKyAgICA8cD5UaGUgdXBsb2FkIGluc3RhbGwgd2lsbCBvbmx5IGFjY2VwdCBmaWxlcyB3aGljaCBoYXZlIHRoZSBmaWxlbmFtZQorICAgIGV4dGVuc2lvbiBvZiAiLndhciIuPC9wPgorICAgIDwvYmxvY2txdW90ZT48L2xpPgorPGxpPjxlbT5XYXIgZmlsZSBhbHJlYWR5IGV4aXN0cyBvbiBzZXJ2ZXI8L2VtPgorICAgIDxibG9ja3F1b3RlPgorICAgIDxwPklmIGEgd2FyIGZpbGUgb2YgdGhlIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cyBpbiB5b3VyIEhvc3QncworICAgIGFwcEJhc2UgdGhlIHVwbG9hZCB3aWxsIGZhaWwuIEVpdGhlciB1bmRlcGxveSB0aGUgZXhpc3Rpbmcgd2FyIGZpbGUKKyAgICBmcm9tIHlvdXIgSG9zdCdzIGFwcEJhc2Ugb3IgdXBsb2FkIHRoZSBuZXcgd2FyIGZpbGUgdXNpbmcgYSBkaWZmZXJlbnQKKyAgICBuYW1lLjwvcD4KKyAgICA8L2Jsb2NrcXVvdGU+PC9saT4KKzxsaT48ZW0+RmlsZSB1cGxvYWQgZmFpbGVkLCBubyBmaWxlPC9lbT4KKyAgICA8YmxvY2txdW90ZT4KKyAgICA8cD5UaGUgZmlsZSB1cGxvYWQgZmFpbGVkLCBubyBmaWxlIHdhcyByZWNlaXZlZCBieSB0aGUgc2VydmVyLjwvcD4KKyAgICA8L2Jsb2NrcXVvdGU+PC9saT4KKzxsaT48ZW0+SW5zdGFsbCBVcGxvYWQgRmFpbGVkLCBFeGNlcHRpb246PC9lbT4KKyAgICA8YmxvY2txdW90ZT4KKyAgICA8cD5UaGUgd2FyIGZpbGUgdXBsb2FkIG9yIGluc3RhbGwgZmFpbGVkIHdpdGggYSBKYXZhIEV4Y2VwdGlvbi4KKyAgICBUaGUgZXhjZXB0aW9uIG1lc3NhZ2Ugd2lsbCBiZSBsaXN0ZWQuPC9wPgorICAgIDwvYmxvY2txdW90ZT48L2xpPgorPC91bD4KKworPC9zdWJzZWN0aW9uPgorCis8c3Vic2VjdGlvbiBuYW1lPSJEZXBsb3ltZW50IE5vdGVzIj4KKworPHA+SWYgdGhlIEhvc3QgaXMgY29uZmlndXJlZCB3aXRoIHVucGFja1dBUnM9dHJ1ZSBhbmQgeW91IGluc3RhbGwgYSB3YXIKK2ZpbGUsIHRoZSB3YXIgd2lsbCBiZSB1bnBhY2tlZCBpbnRvIGEgZGlyZWN0b3J5IGluIHlvdXIgSG9zdCBhcHBCYXNlCitkaXJlY3RvcnkuPC9wPgorCis8cD5JZiB0aGUgYXBwbGljYXRpb24gd2FyIG9yIGRpcmVjdG9yeSBpcyBkZXBsb3llZCBpbiB5b3VyIEhvc3QgYXBwQmFzZQorZGlyZWN0b3J5IGFuZCBlaXRoZXIgdGhlIEhvc3QgaXMgY29uZmlndXJlZCB3aXRoIGF1dG9EZXBsb3k9dHJ1ZSBvcgorbGl2ZURlcGxveT10cnVlLCB0aGUgQ29udGV4dCBwYXRoIG11c3QgbWF0Y2ggdGhlIGRpcmVjdG9yeSBuYW1lIG9yCit3YXIgZmlsZSBuYW1lIHdpdGhvdXQgdGhlICIud2FyIiBleHRlbnNpb24uPC9wPgorCis8cD5Gb3Igc2VjdXJpdHkgd2hlbiB1bnRydXN0ZWQgdXNlcnMgY2FuIG1hbmFnZSB3ZWIgYXBwbGljYXRpb25zLCB0aGUKK0hvc3QgZGVwbG95WE1MIGZsYWcgY2FuIGJlIHNldCB0byBmYWxzZS4gIFRoaXMgcHJldmVudHMgdW50cnVzdGVkIHVzZXJzCitmcm9tIGluc3RhbGxpbmcgd2ViIGFwcGxpY2F0aW9ucyB1c2luZyBhIGNvbmZpZ3VyYXRpb24gWE1MIGZpbGUgYW5kCithbHNvIHByZXZlbnRzIHRoZW0gZnJvbSBpbnN0YWxsaW5nIGFwcGxpY2F0aW9uIGRpcmVjdG9yaWVzIG9yICIud2FyIgorZmlsZXMgbG9jYXRlZCBvdXRzaWRlIG9mIHRoZWlyIEhvc3QgYXBwQmFzZS48L3A+CisKKzwvc3Vic2VjdGlvbj4KKworPHN1YnNlY3Rpb24gbmFtZT0iRGVwbG95IE1lc3NhZ2UiPgorCis8cD5JZiBkZXBsb3ltZW50IGFuZCBzdGFydHVwIGlzIHN1Y2Nlc3NmdWwsIHlvdSB3aWxsIHJlY2VpdmUgYSBNZXNzYWdlCitsaWtlIHRoaXM6PC9wPgorPHNvdXJjZT4KK09LIC0gRGVwbG95ZWQgYXBwbGljYXRpb24gYXQgY29udGV4dCBwYXRoIC9mb28KKzwvc291cmNlPgorCis8cD5PdGhlcndpc2UsIHRoZSBNZXNzYWdlIHdpbGwgc3RhcnQgd2l0aCA8Y29kZT5GQUlMPC9jb2RlPiBhbmQgaW5jbHVkZSBhbgorZXJyb3IgbWVzc2FnZS4gIFBvc3NpYmxlIGNhdXNlcyBmb3IgcHJvYmxlbXMgaW5jbHVkZTo8L3A+Cis8dWw+Cis8bGk+PGVtPkFwcGxpY2F0aW9uIGFscmVhZHkgZXhpc3RzIGF0IHBhdGggL2ZvbzwvZW0+CisgICAgPGJsb2NrcXVvdGU+CisgICAgPHA+VGhlIGNvbnRleHQgcGF0aHMgZm9yIGFsbCBjdXJyZW50bHkgcnVubmluZyB3ZWIgYXBwbGljYXRpb25zIG11c3QgYmUKKyAgICB1bmlxdWUuICBUaGVyZWZvcmUsIHlvdSBtdXN0IGVpdGhlciB1bmRlcGxveSB0aGUgZXhpc3Rpbmcgd2ViCisgICAgYXBwbGljYXRpb24gdXNpbmcgdGhpcyBjb250ZXh0IHBhdGgsIG9yIGNob29zZSBhIGRpZmZlcmVudCBjb250ZXh0IHBhdGgKKyAgICBmb3IgdGhlIG5ldyBvbmUuPC9wPgorICAgIDwvYmxvY2txdW90ZT48L2xpPgorPGxpPjxlbT5Eb2N1bWVudCBiYXNlIGRvZXMgbm90IGV4aXN0IG9yIGlzIG5vdCBhIHJlYWRhYmxlIGRpcmVjdG9yeTwvZW0+CisgICAgPGJsb2NrcXVvdGU+CisgICAgPHA+VGhlIFVSTCBzcGVjaWZpZWQgYnkgdGhlIDxpPldBUiBvciBEaXJlY3RvcnkgVVJMOjwvaT4gZmllbGQgbXVzdAorICAgIGlkZW50aWZ5IGEgZGlyZWN0b3J5IG9uIHRoaXMgc2VydmVyIHRoYXQgY29udGFpbnMgdGhlICJ1bnBhY2tlZCIgdmVyc2lvbgorICAgIG9mIGEgd2ViIGFwcGxpY2F0aW9uLCBvciB0aGUgYWJzb2x1dGUgVVJMIG9mIGEgd2ViIGFwcGxpY2F0aW9uIGFyY2hpdmUKKyAgICAoV0FSKSBmaWxlIHRoYXQgY29udGFpbnMgdGhpcyBhcHBsaWNhdGlvbi4gIENvcnJlY3QgdGhlIHZhbHVlIGVudGVyZWQgZm9yCisgICAgdGhlIDxpPldBUiBvciBEaXJlY3RvcnkgVVJMOjwvaT4gZmllbGQuPC9wPgorICAgIDwvYmxvY2txdW90ZT48L2xpPgorPGxpPjxlbT5FbmNvdW50ZXJlZCBleGNlcHRpb248L2VtPgorICAgIDxibG9ja3F1b3RlPgorICAgIDxwPkFuIGV4Y2VwdGlvbiB3YXMgZW5jb3VudGVyZWQgdHJ5aW5nIHRvIHN0YXJ0IHRoZSBuZXcgd2ViIGFwcGxpY2F0aW9uLgorICAgIENoZWNrIHRoZSBUb21jYXQgNSBsb2dzIGZvciB0aGUgZGV0YWlscywgYnV0IGxpa2VseSBleHBsYW5hdGlvbnMgaW5jbHVkZQorICAgIHByb2JsZW1zIHBhcnNpbmcgeW91ciA8Y29kZT4vV0VCLUlORi93ZWIueG1sPC9jb2RlPiBmaWxlLCBvciBtaXNzaW5nCisgICAgY2xhc3NlcyBlbmNvdW50ZXJlZCB3aGVuIGluaXRpYWxpemluZyBhcHBsaWNhdGlvbiBldmVudCBsaXN0ZW5lcnMgYW5kCisgICAgZmlsdGVycy48L3A+CisgICAgPC9ibG9ja3F1b3RlPjwvbGk+Cis8bGk+PGVtPkludmFsaWQgYXBwbGljYXRpb24gVVJMIHdhcyBzcGVjaWZpZWQ8L2VtPgorICAgIDxibG9ja3F1b3RlPgorICAgIDxwPlRoZSBVUkwgZm9yIHRoZSA8aT5XQVIgb3IgRGlyZWN0b3J5IFVSTDo8L2k+IGZpZWxkIHRoYXQgeW91IHNwZWNpZmllZAorICAgIHdhcyBub3QgdmFsaWQuICBTdWNoIFVSTHMgbXVzdCBzdGFydCB3aXRoIDxjb2RlPmZpbGU6PC9jb2RlPiwgYW5kIFVSTHMKKyAgICBmb3IgYSBXQVIgZmlsZSBtdXN0IGVuZCBpbiAiLndhciIuPC9wPgorICAgIDwvYmxvY2txdW90ZT48L2xpPgorPGxpPjxlbT5JbnZhbGlkIGNvbnRleHQgcGF0aCB3YXMgc3BlY2lmaWVkPC9lbT4KKyAgICA8YmxvY2txdW90ZT4KKyAgICA8cD5UaGUgY29udGV4dCBwYXRoIG11c3Qgc3RhcnQgd2l0aCBhIHNsYXNoIGNoYXJhY3RlciwgdW5sZXNzIHlvdSBhcmUKKyAgICByZWZlcmVuY2luZyB0aGUgUk9PVCB3ZWIgYXBwbGljYXRpb24gLS0gaW4gd2hpY2ggY2FzZSB0aGUgY29udGV4dCBwYXRoCisgICAgbXVzdCBiZSBhICIvIiBzdHJpbmcuPC9wPgorICAgIDwvYmxvY2txdW90ZT48L2xpPgorPGxpPjxlbT5Db250ZXh0IHBhdGggbXVzdCBtYXRjaCB0aGUgZGlyZWN0b3J5IG9yIFdBUiBmaWxlIG5hbWU6PC9lbT4KKyAgICA8YmxvY2txdW90ZT4KKyAgICBJZiB0aGUgYXBwbGljYXRpb24gd2FyIG9yIGRpcmVjdG9yeSBpcyBkZXBsb3llZCBpbiB5b3VyIEhvc3QgYXBwQmFzZQorICAgIGRpcmVjdG9yeSBhbmQgZWl0aGVyIHRoZSBIb3N0IGlzIGNvbmZpZ3VyZWQgd2l0aCBhdXRvRGVwbG95PXRydWUgb3IKKyAgICBsaXZlRGVwbG95PXRydWUsIHRoZSBDb250ZXh0IHBhdGggbXVzdCBtYXRjaCB0aGUgZGlyZWN0b3J5IG5hbWUgb3IKKyAgICB3YXIgZmlsZSBuYW1lIHdpdGhvdXQgdGhlICIud2FyIiBleHRlbnNpb24uCisgICAgPC9ibG9ja3F1b3RlPjwvbGk+Cis8bGk+PGVtPk9ubHkgd2ViIGFwcGxpY2F0aW9ucyBpbiB0aGUgSG9zdCB3ZWIgYXBwbGljYXRpb24gZGlyZWN0b3J5IGNhbgorICAgICBiZSBkZXBsb3llZDwvZW0+CisgICAgIDxibG9ja3F1b3RlPgorICAgICBJZiB0aGUgSG9zdCBkZXBsb3lYTUwgZmxhZyBpcyBzZXQgdG8gZmFsc2UgdGhpcyBlcnJvciB3aWxsIGhhcHBlbgorICAgICBpZiBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gaW5zdGFsbCBhIHdlYiBhcHBsaWNhdGlvbiBkaXJlY3Rvcnkgb3IKKyAgICAgICIud2FyIiBmaWxlIG91dHNpZGUgb2YgdGhlIEhvc3QgYXBwQmFzZSBkaXJlY3RvcnkuCisgICAgIDwvYmxvY2txdW90ZT48L2xpPgorPC91bD4KKworPC9zdWJzZWN0aW9uPgorPC9zZWN0aW9uPgorCis8c2VjdGlvbiBuYW1lPSJTZXJ2ZXIgSW5mb3JtYXRpb24iPgorCis8cD5UaGlzIHNlY3Rpb24gZGlzcGxheXMgaW5mb3JtYXRpb24gYWJvdXQgVG9tY2F0LCB0aGUgb3BlcmF0aW5nIHN5c3RlbSBvZgordGhlIHNlcnZlciBUb21jYXQgaXMgaG9zdGVkIG9uLCBhbmQgdGhlIEphdmEgVmlydHVhbCBNYWNoaW5lIFRvbWNhdCBpcworcnVubmluZyBpbi48L3A+CisKKzwvc2VjdGlvbj4KKworPC9ib2R5PgorCis8L2RvY3VtZW50PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9pbWFnZXMvYWRkLmdpZiBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvaW1hZ2VzL2FkZC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc3NGQwNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvaW1hZ2VzL2FkZC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9pbWFnZXMvY29kZS5naWYgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2ltYWdlcy9jb2RlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjczMDdiCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9pbWFnZXMvY29kZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9pbWFnZXMvZGVzaWduLmdpZiBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvaW1hZ2VzL2Rlc2lnbi5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVkYjBhOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvaW1hZ2VzL2Rlc2lnbi5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9pbWFnZXMvZG9jcy5naWYgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2ltYWdlcy9kb2NzLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjRhNGExCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9pbWFnZXMvZG9jcy5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9pbWFnZXMvZml4LmdpZiBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvaW1hZ2VzL2ZpeC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU5YWQ2NAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvaW1hZ2VzL2ZpeC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9pbWFnZXMvamFrYXJ0YS1sb2dvLmdpZiBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvaW1hZ2VzL2pha2FydGEtbG9nby5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ5Y2Y4MgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvaW1hZ2VzL2pha2FydGEtbG9nby5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9pbWFnZXMvcHJpbnRlci5naWYgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2ltYWdlcy9wcmludGVyLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDIxMTg3Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9pbWFnZXMvcHJpbnRlci5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9pbWFnZXMvdG9tY2F0LmdpZiBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvaW1hZ2VzL3RvbWNhdC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE3NTY3MwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvaW1hZ2VzL3RvbWNhdC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9pbWFnZXMvdXBkYXRlLmdpZiBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvaW1hZ2VzL3VwZGF0ZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFlMjJhYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvaW1hZ2VzL3VwZGF0ZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9pbWFnZXMvdm9pZC5naWYgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2ltYWdlcy92b2lkLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTY1ODI0Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9pbWFnZXMvdm9pZC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9pbmRleC54bWwgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2luZGV4LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmQ0NGEyCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9pbmRleC54bWwKQEAgLTAsMCArMSwxNjkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCFET0NUWVBFIGRvY3VtZW50IFsKKyAgPCFFTlRJVFkgcHJvamVjdCBTWVNURU0gInByb2plY3QueG1sIj4KK10+Cis8ZG9jdW1lbnQgdXJsPSJpbmRleC5odG1sIj4KKworICAmcHJvamVjdDsKKworICA8cHJvcGVydGllcz4KKyAgICA8YXV0aG9yIGVtYWlsPSJjcmFpZ21jY0BhcGFjaGUub3JnIj5DcmFpZyBSLiBNY0NsYW5haGFuPC9hdXRob3I+CisgICAgPGF1dGhvciBlbWFpbD0icmVtbUBhcGFjaGUub3JnIj5SZW15IE1hdWNoZXJhdDwvYXV0aG9yPgorICAgIDxhdXRob3IgZW1haWw9InlvYXZzQGFwYWNoZS5vcmciPllvYXYgU2hhcGlyYTwvYXV0aG9yPgorICAgIDx0aXRsZT5Eb2N1bWVudGF0aW9uIEluZGV4PC90aXRsZT4KKyAgPC9wcm9wZXJ0aWVzPgorCis8Ym9keT4KKworPHNlY3Rpb24gbmFtZT0iSW50cm9kdWN0aW9uIj4KKworPHA+VGhpcyBpcyB0aGUgdG9wLWxldmVsIGVudHJ5IHBvaW50IG9mIHRoZSBkb2N1bWVudGF0aW9uIGJ1bmRsZSBmb3IgdGhlCis8c3Ryb25nPkFwYWNoZSBKYWthcnRhIFRvbWNhdDwvc3Ryb25nPiBTZXJ2bGV0L0pTUCBjb250YWluZXIuICBUb21jYXQgdmVyc2lvbiA1LjUgCitpbXBsZW1lbnRzIHRoZQorU2VydmxldCAyLjQgYW5kIEphdmFTZXJ2ZXIgUGFnZXMgMi4wIHNwZWNpZmljYXRpb25zIGZyb20gdGhlCis8YSBocmVmPSJodHRwOi8vd3d3LmpjcC5vcmciPkphdmEgQ29tbXVuaXR5IFByb2Nlc3M8L2E+LCBhbmQgaW5jbHVkZXMgbWFueQorYWRkaXRpb25hbCBmZWF0dXJlcyB0aGF0IG1ha2UgaXQgYSB1c2VmdWwgcGxhdGZvcm0gZm9yIGRldmVsb3BpbmcgYW5kIGRlcGxveWluZword2ViIGFwcGxpY2F0aW9ucyBhbmQgd2ViIHNlcnZpY2VzLjwvcD4KKworPHA+U2VsZWN0IG9uZSBvZiB0aGUgbGlua3MgZnJvbSB0aGUgbmF2aWdhdGlvbiBtZW51ICh0byB0aGUgbGVmdCkgdG8gZHJpbGwKK2Rvd24gdG8gdGhlIG1vcmUgZGV0YWlsZWQgZG9jdW1lbmF0aW9uIHRoYXQgaXMgYXZhaWxhYmxlLiAgRWFjaCBhdmFpbGFibGUKK21hbnVhbCBpcyBkZXNjcmliZWQgaW4gbW9yZSBkZXRhaWwgYmVsb3cuPC9wPgorCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iVG9tY2F0IFVzZXIgR3VpZGUiPgorCis8cD5UaGUgZm9sbG93aW5nIGRvY3VtZW50cyB3aWxsIGFzc2lzdCB5b3UgaW4gZG93bmxvYWRpbmcsIGluc3RhbGxpbmcKK1RvbWNhdCA1LCBhbmQgdXNpbmcgbWFueSBvZiB0aGUgVG9tY2F0IGZlYXR1cmVzLjwvcD4KKworPG9sPgorPGxpPjxhIGhyZWY9ImludHJvZHVjdGlvbi5odG1sIj48c3Ryb25nPkludHJvZHVjdGlvbjwvc3Ryb25nPjwvYT4gLSBBCisgICAgYnJpZWYsIGhpZ2ggbGV2ZWwsIG92ZXJ2aWV3IG9mIFRvbWNhdC48L2xpPgorPGxpPjxhIGhyZWY9InNldHVwLmh0bWwiPjxzdHJvbmc+U2V0dXA8L3N0cm9uZz48L2E+IC0gSG93IHRvIGluc3RhbGwgYW5kIHJ1bgorICAgIFRvbWNhdCBvbiBhIHZhcmlldHkgb2YgcGxhdGZvcm1zLjwvbGk+Cis8bGk+PGEgaHJlZj0iYXBwZGV2L2luZGV4Lmh0bWwiPjxzdHJvbmc+Rmlyc3Qgd2ViIGFwcGxpY2F0aW9uPC9zdHJvbmc+PC9hPgorICAgIC0gQW4gaW50cm9kdWN0aW9uIHRvIHRoZSBjb25jZXB0cyBvZiBhIDxlbT53ZWIgYXBwbGljYXRpb248L2VtPiBhcyBkZWZpbmVkCisgICAgaW4gdGhlIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvc2VydmxldC9kb3dubG9hZC5odG1sIj5TZXJ2bGV0CisgICAgMi4zIFNwZWNpZmljYXRpb248L2E+LiAgQ292ZXJzIGJhc2ljIG9yZ2FuaXphdGlvbiBvZiB5b3VyIHdlYiBhcHBsaWNhdGlvbgorICAgIHNvdXJjZSB0cmVlLCB0aGUgc3RydWN0dXJlIG9mIGEgd2ViIGFwcGxpY2F0aW9uIGFyY2hpdmUsIGFuZCBhbgorICAgIGludHJvZHVjdGlvbiB0byB0aGUgd2ViIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQgZGVzY3JpcHRvcgorICAgICg8Y29kZT4vV0VCLUlORi93ZWIueG1sPC9jb2RlPikuPC9saT4KKzxsaT48YSBocmVmPSJkZXBsb3llci1ob3d0by5odG1sIj48c3Ryb25nPkRlcGxveWVyPC9zdHJvbmc+PC9hPiAtCisgICAgT3BlcmF0aW5nIHRoZSBUb21jYXQgRGVwbG95ZXIgdG8gZGVwbG95LCBwcmVjb21waWxlLCBhbmQgdmFsaWRhdGUgd2ViCisgICAgYXBwbGljYXRpb25zLjwvbGk+Cis8bGk+PGEgaHJlZj0ibWFuYWdlci1ob3d0by5odG1sIj48c3Ryb25nPk1hbmFnZXI8L3N0cm9uZz48L2E+IC0KKyAgICBPcGVyYXRpbmcgdGhlIDxjb2RlPk1hbmFnZXI8L2NvZGU+IHdlYiBhcHAgdG8gZGVwbG95LCB1bmRlcGxveSwgYW5kCisgICAgcmVkZXBsb3kgYXBwbGljYXRpb25zIHdoaWxlIFRvbWNhdCBpcyBydW5uaW5nLjwvbGk+Cis8bGk+PGEgaHJlZj0icmVhbG0taG93dG8uaHRtbCI+PHN0cm9uZz5SZWFsbXMgYW5kIEFjY2VzcyBDb250cm9sPC9zdHJvbmc+PC9hPgorICAgIC0gRGVzY3JpcHRpb24gb2YgaG93IHRvIGNvbmZpZ3VyZSA8ZW0+UmVhbG1zPC9lbT4gKGRhdGFiYXNlcyBvZiB1c2VycywKKyAgICBwYXNzd29yZHMsIGFuZCB0aGVpciBhc3NvY2lhdGVkIHJvbGVzKSBmb3IgdXNlIGluIHdlYiBhcHBsaWNhdGlvbnMgdGhhdAorICAgIHV0aWxpemUgPGVtPkNvbnRhaW5lciBNYW5hZ2VkIFNlY3VyaXR5PC9lbT4uPC9saT4KKzxsaT48YSBocmVmPSJzZWN1cml0eS1tYW5hZ2VyLWhvd3RvLmh0bWwiPjxzdHJvbmc+U2VjdXJpdHkgTWFuYWdlcjwvc3Ryb25nPjwvYT4KKyAgICAtIENvbmZpZ3VyaW5nIGFuZCB1c2luZyBhIEphdmEgU2VjdXJpdHkgTWFuYWdlciB0bworICAgIHN1cHBvcnQgZmluZS1ncmFpbmVkIGNvbnRyb2wgb3ZlciB0aGUgYmVoYXZpb3Igb2YgeW91ciB3ZWIgYXBwbGljYXRpb25zLgorICAgIDwvbGk+Cis8bGk+PGEgaHJlZj0iam5kaS1yZXNvdXJjZXMtaG93dG8uaHRtbCI+PHN0cm9uZz5KTkRJIFJlc291cmNlczwvc3Ryb25nPjwvYT4KKyAgICAtIENvbmZpZ3VyaW5nIHN0YW5kYXJkIGFuZCBjdXN0b20gcmVzb3VyY2VzIGluIHRoZSBKTkRJIG5hbWluZyBjb250ZXh0CisgICAgdGhhdCBpcyBwcm92aWRlZCB0byBlYWNoIHdlYiBhcHBsaWNhdGlvbi48L2xpPgorPGxpPjxhIGhyZWY9ImpuZGktZGF0YXNvdXJjZS1leGFtcGxlcy1ob3d0by5odG1sIj4KKyAgICA8c3Ryb25nPkpEQkMgRGF0YVNvdXJjZTwvc3Ryb25nPjwvYT4KKyAgICAtIENvbmZpZ3VyaW5nIGEgSk5ESSBEYXRhU291cmUgd2l0aCBhIERCIGNvbm5lY3Rpb24gcG9vbC4KKyAgICBFeGFtcGxlcyBmb3IgbWFueSBwb3B1bGFyIGRhdGFiYXNlcy48L2xpPgorPGxpPjxhIGhyZWY9ImNsYXNzLWxvYWRlci1ob3d0by5odG1sIj48c3Ryb25nPkNsYXNzbG9hZGluZzwvc3Ryb25nPjwvYT4KKyAgICAtIEluZm9ybWF0aW9uIGFib3V0IGNsYXNzIGxvYWRpbmcgaW4gVG9tY2F0IDUsIGluY2x1ZGluZyB3aGVyZSB0byBwbGFjZQorICAgIHlvdXIgYXBwbGljYXRpb24gY2xhc3NlcyBzbyB0aGF0IHRoZXkgYXJlIHZpc2libGUuPC9saT4KKzxsaT48YSBocmVmPSJqYXNwZXItaG93dG8uaHRtbCI+PHN0cm9uZz5KU1BzPC9zdHJvbmc+PC9hPgorICAgIC0gSW5mb3JtYXRpb24gYWJvdXQgSmFzcGVyIGNvbmZpZ3VyYXRpb24sIGFzIHdlbGwgYXMgdGhlIEpTUCBjb21waWxlcgorICAgIHVzYWdlLjwvbGk+Cis8bGk+PGEgaHJlZj0ic3NsLWhvd3RvLmh0bWwiPjxzdHJvbmc+U1NMPC9zdHJvbmc+PC9hPiAtCisgICAgSW5zdGFsbGluZyBhbmQKKyAgICBjb25maWd1cmluZyBTU0wgc3VwcG9ydCBzbyB0aGF0IHlvdXIgVG9tY2F0IHdpbGwgc2VydmUgcmVxdWVzdHMgdXNpbmcKKyAgICB0aGUgPGNvZGU+aHR0cHM8L2NvZGU+IHByb3RvY29sLjwvbGk+Cis8bGk+PGEgaHJlZj0ic3NpLWhvd3RvLmh0bWwiPjxzdHJvbmc+U1NJPC9zdHJvbmc+PC9hPiAtCisgICAgVXNpbmcgU2VydmVyIFNpZGUgSW5jbHVkZXMgaW4gVG9tY2F0LjwvbGk+Cis8bGk+PGEgaHJlZj0iY2dpLWhvd3RvLmh0bWwiPjxzdHJvbmc+Q0dJPC9zdHJvbmc+PC9hPiAtCisgICAgVXNpbmcgQ0dJcyB3aXRoIFRvbWNhdC48L2xpPgorPGxpPjxhIGhyZWY9InByb3h5LWhvd3RvLmh0bWwiPjxzdHJvbmc+UHJveHkgU3VwcG9ydDwvc3Ryb25nPjwvYT4gLQorICAgIENvbmZpZ3VyaW5nIFRvbWNhdCA1IHRvIHJ1biBiZWhpbmQgYSBwcm94eSBzZXJ2ZXIgKG9yIGEgd2ViIHNlcnZlcgorICAgIGZ1bmN0aW9uaW5nIGFzIGEgcHJveHkgc2VydmVyKS48L2xpPgorPGxpPjxhIGhyZWY9Im1iZWFucy1kZXNjcmlwdG9yLWhvd3RvLmh0bWwiPjxzdHJvbmc+TUJlYW4gRGVzY3JpcHRvcjwvc3Ryb25nPjwvYT4gLQorICAgIENvbmZpZ3VyaW5nIE1CZWFuIGRlc2NyaXB0b3JzIGZpbGVzIGZvciBjdXN0b20gY29tcG9uZW50cy48L2xpPgorPGxpPjxhIGhyZWY9ImRlZmF1bHQtc2VydmxldC5odG1sIj48c3Ryb25nPkRlZmF1bHQgU2VydmxldDwvc3Ryb25nPjwvYT4gLQorICAgIENvbmZpZ3VyaW5nIHRoZSBkZWZhdWx0IHNlcnZsZXQgYW5kIGN1c3RvbWl6aW5nIGRpcmVjdG9yeSBsaXN0aW5ncy48L2xpPgorPGxpPjxhIGhyZWY9ImNsdXN0ZXItaG93dG8uaHRtbCI+PHN0cm9uZz5Ub21jYXQgQ2x1c3RlcmluZzwvc3Ryb25nPjwvYT4gLQorICAgIEVuYWJsZSBzZXNzaW9uIHJlcGxpY2F0aW9uIGluIGEgVG9tY2F0IGVudmlyb25tZW50LjwvbGk+Cis8bGk+PGEgaHJlZj0iYmFsYW5jZXItaG93dG8uaHRtbCI+PHN0cm9uZz5CYWxhbmNlcjwvc3Ryb25nPjwvYT4gLQorICAgIENvbmZpZ3VyaW5nLCB1c2luZywgYW5kIGV4dGVuZGluZyB0aGUgbG9hZCBiYWxhbmNlciBhcHBsaWNhdGlvbi48L2xpPgorPGxpPjxhIGhyZWY9ImNvbm5lY3RvcnMuaHRtbCI+PHN0cm9uZz5Db25uZWN0b3JzPC9zdHJvbmc+PC9hPiAtCisgICAgQ29ubmVjdG9ycyBhdmFpbGFibGUgaW4gVG9tY2F0LCBhbmQgbmF0aXZlIHdlYiBzZXJ2ZXIgaW50ZWdyYXRpb24uPC9saT4KKworPC9vbD4KKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IlJlZmVyZW5jZSI+CisKKzxwPlRoZSBmb2xsb3dpbmcgZG9jdW1lbnRzIGFyZSBhaW1lZCBhdCA8ZW0+U3lzdGVtIEFkbWluaXN0cmF0b3JzPC9lbT4gd2hvCithcmUgcmVzcG9uc2libGUgZm9yIGluc3RhbGxpbmcsIGNvbmZpZ3VyaW5nLCBhbmQgb3BlcmF0aW5nIGEgVG9tY2F0IDUgc2VydmVyLgorPC9wPgorPHVsPgorPGxpPjxhIGhyZWY9IlJFTEVBU0UtTk9URVMudHh0Ij48c3Ryb25nPlJlbGVhc2Ugbm90ZXM8L3N0cm9uZz48L2E+CisgICAgLSBLbm93biBpc3N1ZXMgaW4gdGhpcyBUb21jYXQgcmVsZWFzZS4KKyAgICA8L2xpPgorPGxpPjxhIGhyZWY9ImNvbmZpZy9pbmRleC5odG1sIj48c3Ryb25nPlRvbWNhdCBTZXJ2ZXIgQ29uZmlndXJhdGlvbiBSZWZlcmVuY2U8L3N0cm9uZz48L2E+CisgICAgLSBSZWZlcmVuY2UgbWFudWFsIHRoYXQgZG9jdW1lbnRzIGFsbCBhdmFpbGFibGUgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMKKyAgICAgIHRoYXQgbWF5IGJlIHBsYWNlZCBpbnRvIGEgVG9tY2F0IDUgPGNvZGU+Y29uZi9zZXJ2ZXIueG1sPC9jb2RlPiBmaWxlLgorICAgIDwvbGk+Cis8bGk+PGEgaHJlZj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy90b21jYXQvY29ubmVjdG9ycy1kb2MvamsyL2luZGV4Lmh0bWwiPjxzdHJvbmc+SksgRG9jdW1lbmF0aW9uPC9zdHJvbmc+PC9hPgorICAgIC0gQ29tcGxldGUgZG9jdW1lbnRhdGlvbiBhbmQgSE9XVE9zIG9uIHRoZSBKSyBuYXRpdmUgd2Vic2VydmVyIGNvbm5lY3RvciwKKyAgICAgIHVzZWQgdG8gaW50ZXJmYWNlIFRvbWNhdCB3aXRoIHNlcnZlcnMgbGlrZSBBcGFjaGUgSFRUUGQsIElJUworICAgICAgYW5kIG90aGVycy48L2xpPgorPGxpPjxhIGhyZWY9InNlcnZsZXRhcGkvaW5kZXguaHRtbCI+PHN0cm9uZz5TZXJ2bGV0IEFQSSBKYXZhZG9jczwvc3Ryb25nPjwvYT4gLQorICAgIFRoZSBTZXJ2bGV0IDIuNCBBUEkgSmF2YWRvY3MuPC9saT4KKzxsaT48YSBocmVmPSJqc3BhcGkvaW5kZXguaHRtbCI+PHN0cm9uZz5KU1AgQVBJIEphdmFkb2NzPC9zdHJvbmc+PC9hPiAtCisgICAgVGhlIEpTUCAyLjAgQVBJIEphdmFkb2NzLjwvbGk+Cis8L3VsPgorCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iVG9tY2F0IERldmVsb3BlcnMiPgorCis8cD5UaGUgZm9sbG93aW5nIGRvY3VtZW50cyBhcmUgZm9yIEphdmEgZGV2ZWxvcGVycyB3aG8gd2lzaCB0byBjb250cmlidXRlIHRvCit0aGUgZGV2ZWxvcG1lbnQgb2YgdGhlIDxlbT5Ub21jYXQ8L2VtPiBwcm9qZWN0LjwvcD4KKzx1bD4KKzxsaT48YSBocmVmPSJidWlsZGluZy5odG1sIj48c3Ryb25nPkJ1aWxkaW5nIGZyb20gU291cmNlPC9zdHJvbmc+PC9hPiAtIAorICAgIERldGFpbHMgdGhlIHN0ZXBzIG5lY2Vzc2FyeSB0byBkb3dubG9hZCBUb21jYXQgNSBzb3VyY2UgY29kZSAoYW5kIHRoZSAKKyAgICBvdGhlciBwYWNrYWdlcyB0aGF0IGl0IGRlcGVuZHMgb24pLCBhbmQgYnVpbGQgYSBiaW5hcnkgZGlzdHJpYnV0aW9uIGZyb20gCisgICAgdGhvc2Ugc291cmNlcy4KKyAgICA8L2xpPgorPGxpPjxhIGhyZWY9ImNoYW5nZWxvZy5odG1sIj48c3Ryb25nPkNoYW5nZWxvZzwvc3Ryb25nPjwvYT4gLSBEZXRhaWxzIHRoZQorICAgIGNoYW5nZXMgbWFkZSB0byBUb21jYXQuCisgICAgPC9saT4KKzxsaT48YSBocmVmPSJzdGF0dXMuaHRtbCI+PHN0cm9uZz5TdGF0dXM8L3N0cm9uZz48L2E+IC0gVG9tY2F0IGRldmVsb3BtZW50IAorICAgIHN0YXR1cy4KKyAgICA8L2xpPgorPGxpPjxhIGhyZWY9ImRldmVsb3BlcnMuaHRtbCI+PHN0cm9uZz5EZXZlbG9wZXJzPC9zdHJvbmc+PC9hPiAtIExpc3Qgb2YgYWN0aXZlCisgICAgVG9tY2F0IGNvbnRyaWJ1dG9ycy4KKyAgICA8L2xpPgorPGxpPjxhIGhyZWY9ImNhdGFsaW5hL2Z1bmNzcGVjcy9pbmRleC5odG1sIj48c3Ryb25nPkZ1bmN0aW9uYWwgU3BlY2lmaWNhdGlvbnM8L3N0cm9uZz48L2E+CisgICAgLSBSZXF1aXJlbWVudHMgc3BlY2lmaWNhdGlvbnMgZm9yIGZlYXR1cmVzIG9mIHRoZSA8ZW0+Q2F0YWxpbmE8L2VtPiBzZXJ2bGV0CisgICAgY29udGFpbmVyIHBvcnRpb24gb2YgVG9tY2F0IDUuPC9saT4KKzxsaT48YSBocmVmPSJjYXRhbGluYS9kb2NzL2FwaS9pbmRleC5odG1sIj48c3Ryb25nPkNhdGFsaW5hIEphdmFkb2NzPC9zdHJvbmc+PC9hPgorICAgIC0gSmF2YWRvYyBBUEkgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIDxlbT5DYXRhbGluYTwvZW0+IHNlcnZsZXQKKyAgICBjb250YWluZXIgYW5kIGl0cyBkZXBlbmRlbmNpZXMuPC9saT4KKzxsaT48YSBocmVmPSJqYXNwZXIvZG9jcy9hcGkvaW5kZXguaHRtbCI+PHN0cm9uZz5KYXNwZXIgSmF2YWRvY3M8L3N0cm9uZz48L2E+CisgICAgLSBKYXZhZG9jIEFQSSBkb2N1bWVudGF0aW9uIGZvciB0aGUgPGVtPkphc3BlcjwvZW0+IEpTUCBjb250YWluZXIKKyAgICBwb3J0aW9uIG9mIFRvbWNhdCA1LjwvbGk+Cis8bGk+PGEgaHJlZj0iYXJjaGl0ZWN0dXJlL2luZGV4Lmh0bWwiPjxzdHJvbmc+VG9tY2F0IEFyY2hpdGVjdHVyZTwvc3Ryb25nPjwvYT4KKyAgICAtIERvY3VtZW50YXRpb24gb2YgdGhlIFRvbWNhdCBTZXJ2ZXIgQXJjaGl0ZWN0dXJlLjwvbGk+CisgICAgCis8L3VsPgorCis8L3NlY3Rpb24+CisKKworPC9ib2R5PgorPC9kb2N1bWVudD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvaW50cm9kdWN0aW9uLnhtbCBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvaW50cm9kdWN0aW9uLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWFiMDUxCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9pbnRyb2R1Y3Rpb24ueG1sCkBAIC0wLDAgKzEsMTMwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhRE9DVFlQRSBkb2N1bWVudCBbCisgIDwhRU5USVRZIHByb2plY3QgU1lTVEVNICJwcm9qZWN0LnhtbCI+CitdPgorPGRvY3VtZW50IHVybD0iaW50cm9kdWN0aW9uLmh0bWwiPgorCisgICAgJnByb2plY3Q7CisKKyAgICA8cHJvcGVydGllcz4KKyAgICAgICAgPGF1dGhvciBlbWFpbD0icnNsaWZrYUBzZnUuY2EiPlJvYmVydCBTbGlma2E8L2F1dGhvcj4KKyAgICAgICAgPHRpdGxlPkludHJvZHVjdGlvbjwvdGl0bGU+CisgICAgPC9wcm9wZXJ0aWVzPgorCis8Ym9keT4KKworCis8c2VjdGlvbiBuYW1lPSJJbnRyb2R1Y3Rpb24iPgorCis8cD5Gb3IgYWRtaW5pc3RyYXRvcnMgYW5kIHdlYiBkZXZlbG9wZXJzIGFsaWtlLCB0aGVyZSBhcmUgc29tZSBpbXBvcnRhbnQgYml0cworb2YgaW5mb3JtYXRpb24geW91IHNob3VsZCBmYW1pbGlhcml6ZSB5b3Vyc2VsZiB3aXRoIGJlZm9yZSBzdGFydGluZyBvdXQuIFRoaXMKK2RvY3VtZW50IHNlcnZlcyBhcyBhIGJyaWVmIGludHJvZHVjdGlvbiB0byBzb21lIG9mIHRoZSBjb25jZXB0cyBhbmQKK3Rlcm1pbm9sb2d5IGJlaGluZCB0aGUgVG9tY2F0IGNvbnRhaW5lci4gQXMgd2VsbCwgd2hlcmUgdG8gZ28gd2hlbiB5b3UgbmVlZAoraGVscC48L3A+CisKKzwvc2VjdGlvbj4KKworCis8c2VjdGlvbiBuYW1lPSJUZXJtaW5vbG9neSI+CisKKzxwPkluIHRoZSBjb3Vyc2Ugb2YgcmVhZGluZyB0aGVzZSBkb2N1bWVudHMsIHlvdSdsbCBydW4gYWNyb3NzIGEgbnVtYmVyIG9mCit0ZXJtczsgc29tZSBzcGVjaWZpYyB0byBUb21jYXQsIGFuZCBvdGhlcnMgZGVmaW5lZCBieSB0aGUKKzxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvc2VydmxldC8iPlNlcnZsZXQ8L2E+IG9yCis8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL2pzcC8iPkpTUDwvYT4gc3BlY2lmaWNhdGlvbnMuPC9wPgorCis8dWw+Cis8bGk+PHN0cm9uZz5Db250ZXh0PC9zdHJvbmc+IC0gSW4gYSBudXRzaGVsbCwgYSBDb250ZXh0IGlzIGEKKyAgICB3ZWIgYXBwbGljYXRpb24uPC9saT4KKzxsaT48c3Ryb25nPlRlcm0yPC9zdHJvbmc+IC0gVGhpcyBpcyBpdC48L2xpPgorPGxpPjxzdHJvbmc+VGVybTM8L3N0cm9uZz4gLSBUaGlzIGlzIGl0ITwvbGk+Cis8L3VsPgorCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iRGlyZWN0b3JpZXMgYW5kIEZpbGVzIj4KKworPHA+VGhyb3VnaG91dCB0aGUgZG9jcywgeW91J2xsIG5vdGljZSB0aGVyZSBhcmUgbnVtZXJvdXMgcmVmZXJlbmNlcyB0bworPHN0cm9uZz4kQ0FUQUxJTkFfSE9NRTwvc3Ryb25nPi4gVGhpcyByZXByZXNlbnRzIHRoZSByb290IG9mIHlvdXIgVG9tY2F0CitpbnN0YWxsYXRpb24uIFdoZW4gd2Ugc2F5LCAiVGhpcyBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4geW91cgorJENBVEFMSU5BX0hPTUUvUkVBRE1FLnR4dCBmaWxlIiB3ZSBtZWFuIHRvIGxvb2sgYXQgdGhlIFJFQURNRS50eHQgZmlsZSBhdCB0aGUKK3Jvb3Qgb2YgeW91ciBUb21jYXQgaW5zdGFsbC48L3A+CisKKzxwPlRoZXNlIGFyZSBzb21lIG9mIHRoZSBrZXkgdG9tY2F0IGRpcmVjdG9yaWVzLCBhbGwgcmVsYXRpdmUKK3RvIDxzdHJvbmc+JENBVEFMSU5BX0hPTUU8L3N0cm9uZz46PC9wPgorCis8dWw+Cis8bGk+PHN0cm9uZz4vYmluPC9zdHJvbmc+IC0gU3RhcnR1cCwgc2h1dGRvd24sIGFuZCBvdGhlciBzY3JpcHRzLiBUaGUKKyAgICA8Y29kZT4qLnNoPC9jb2RlPiBmaWxlcyAoZm9yIFVuaXggc3lzdGVtcykgYXJlIGZ1bmN0aW9uYWwgZHVwbGljYXRlcyBvZgorICAgIHRoZSA8Y29kZT4qLmJhdDwvY29kZT4gZmlsZXMgKGZvciBXaW5kb3dzIHN5c3RlbXMpLiAgU2luY2UgdGhlIFdpbjMyCisgICAgY29tbWFuZC1saW5lIGxhY2tzIGNlcnRhaW4gZnVuY3Rpb25hbGl0eSwgdGhlcmUgYXJlIHNvbWUgYWRkaXRpb25hbAorICAgIGZpbGVzIGluIGhlcmUuPC9saT4KKzxsaT48c3Ryb25nPi9jb25mPC9zdHJvbmc+IC0gQ29uZmlndXJhdGlvbiBmaWxlcyBhbmQgcmVsYXRlZCBEVERzLiAgVGhlIG1vc3QKKyAgICBpbXBvcnRhbnQgZmlsZSBpbiBoZXJlIGlzIHNlcnZlci54bWwuICBJdCBpcyB0aGUgbWFpbiBjb25maWd1cmF0aW9uIGZpbGUKKyAgICBmb3IgdGhlIGNvbnRhaW5lci48L2xpPgorPGxpPjxzdHJvbmc+L2xvZ3M8L3N0cm9uZz4gLSBMb2cgZmlsZXMgYXJlIGhlcmUgYnkgZGVmYXVsdC48L2xpPgorPGxpPjxzdHJvbmc+L3dlYmFwcHM8L3N0cm9uZz4gLSBUaGlzIGlzIHdoZXJlIHlvdXIgd2ViYXBwcyBnby48L2xpPgorPC91bD4KKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IkNvbmZpZ3VyaW5nIFRvbWNhdCI+CisKKzxwPlRoaXMgc2VjdGlvbiB3aWxsIGFjcXVhaW50IHlvdSB3aXRoIHRoZSBiYXNpYyBpbmZvcm1hdGlvbiB1c2VkIGR1cmluZwordGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGNvbnRhaW5lci48L3A+CisKKzxwPkFsbCBvZiB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZXMgaXMgcmVhZCBhdCBzdGFydHVwLAorbWVhbmluZyB0aGF0IGFueSBjaGFuZ2UgdG8gdGhlIGZpbGVzIG5lY2Vzc2l0YXRlcyBhIHJlc3RhcnQgb2YgdGhlIGNvbnRhaW5lci4KKzwvcD4KKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IldoZXJlIHRvIEdvIGZvciBIZWxwIj4KKworPHA+V2hpbGUgd2UndmUgZG9uZSBvdXIgYmVzdCB0byBlbnN1cmUgdGhhdCB0aGVzZSBkb2N1bWVudHMgYXJlIGNsZWFybHkKK3dyaXR0ZW4gYW5kIGVhc3kgdG8gdW5kZXJzdGFuZCwgd2UgbWF5IGhhdmUgbWlzc2VkIHNvbWV0aGluZy4gIFByb3ZpZGVkCitiZWxvdyBhcmUgdmFyaW91cyB3ZWIgc2l0ZXMgYW5kIG1haWxpbmcgbGlzdHMgaW4gY2FzZSB5b3UgZ2V0IHN0dWNrLjwvcD4KKworPHA+QXMgVG9tY2F0IDUgaXMgYSBuZXcgcmVsZWFzZSBvZiBUb21jYXQsIGtlZXAgaW4gbWluZCB0aGF0IHNvbWUgb2YgdGhlCitpc3N1ZXMgYW5kIHNvbHV0aW9ucyB2YXJ5IGJldHdlZW4gdGhlIG1ham9yIHZlcnNpb25zIG9mIFRvbWNhdCAoNC54IHZlcnN1cworNSkuICBBcyB5b3Ugc2VhcmNoIGFyb3VuZCB0aGUgd2ViLCB0aGVyZSB3aWxsIGJlIHNvbWUgZG9jdW1lbnRhdGlvbiB0aGF0CitpcyBub3QgcmVsZXZhbnQgdG8gVG9tY2F0IDUsIGJ1dCAzLnggYW5kIDQueC4gIERvaW5nIDMueCBvciA0LnggdGhpbmdzIHRvIDUKK3dpbGwgcHJvYmFibHkgbm90IHdvcmsgaW4gbW9zdCBjYXNlcyBhcyB0aGUgc2VydmVyLnhtbCBmaWxlcyBhcmUgdmVyeQorZGlmZmVyZW50LjwvcD4KKworPHVsPgorPGxpPkN1cnJlbnQgZG9jdW1lbnQgLSBtb3N0IGRvY3VtZW50cyB3aWxsIGxpc3QgcG90ZW50aWFsIGhhbmd1cHMuIEJlIHN1cmUKKyAgICB0byBmdWxseSByZWFkIHRoZSByZWxldmFudCBkb2N1bWVudGF0aW9uIGFzIGl0IHdpbGwgc2F2ZSB5b3UgbXVjaCB0aW1lCisgICAgYW5kIGVmZm9ydC4gVGhlcmUncyBub3RoaW5nIGxpa2Ugc2NvdXJpbmcgdGhlIHdlYiBvbmx5IHRvIGZpbmQgb3V0IHRoYXQKKyAgICB0aGUgYW5zd2VyIHdhcyByaWdodCBpbiBmcm9udCBvZiB5b3UgYWxsIGFsb25nITwvbGk+Cis8bGk+PGEgaHJlZj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy90b21jYXQvZmFxLyI+VG9tY2F0IEZBUTwvYT4gYXMgbWFpbnRhaW5lZCBieSB0aGUgZGV2ZWxvcGVycy48L2xpPgorPGxpPjxhIGhyZWY9Imh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvamFrYXJ0YS10b21jYXQvIj5Ub21jYXQgV0lLSTwvYT48L2xpPgorPGxpPlRvbWNhdCBGQVEgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5qZ3VydS5jb20vZmFxL2hvbWUuanNwP3RvcGljPVRvbWNhdCI+akd1cnU8L2E+PC9saT4KKzxsaT5Ub21jYXQgbWFpbGluZyBsaXN0IGFyY2hpdmVzIC0gbnVtZXJvdXMgc2l0ZXMgYXJjaGl2ZSB0aGUgVG9tY2F0IG1haWxpbmcKKyAgICBsaXN0cy4gU2luY2UgdGhlIGxpbmtzIGNoYW5nZSBvdmVyIHRpbWUsIGNsaWNraW5nIGhlcmUgd2lsbCBzZWFyY2gKKyAgICA8YSBocmVmPSJodHRwOi8vd3d3Lmdvb2dsZS5jb20vc2VhcmNoP3E9dG9tY2F0K21haWxpbmcrbGlzdCthcmNoaXZlcyI+R29vZ2xlPC9hPi4KKyAgICA8L2xpPgorPGxpPlRoZSBUT01DQVQtVVNFUiBtYWlsaW5nIGxpc3QsIHdoaWNoIHlvdSBjYW4gc3Vic2NyaWJlIHRvCisgICAgPGEgaHJlZj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9zaXRlL21haWwuaHRtbCI+aGVyZTwvYT4uIElmIHlvdSBkb24ndAorICAgIGdldCBhIHJlcGx5LCB0aGVuIHRoZXJlJ3MgYSBnb29kIGNoYW5jZSB0aGF0IHlvdXIgcXVlc3Rpb24gd2FzIHByb2JhYmx5CisgICAgYW5zd2VyZWQgaW4gdGhlIGxpc3QgYXJjaGl2ZXMgb3Igb25lIG9mIHRoZSBGQVFzLiAgQWx0aG91Z2ggcXVlc3Rpb25zCisgICAgYWJvdXQgd2ViIGFwcGxpY2F0aW9uIGRldmVsb3BtZW50IGluIGdlbmVyYWwgYXJlIHNvbWV0aW1lcyBhc2tlZCBhbmQKKyAgICBhbnN3ZXJlZCwgcGxlYXNlIGZvY3VzIHlvdXIgcXVlc3Rpb25zIG9uIFRvbWNhdC1zcGVjaWZpYyBpc3N1ZXMuPC9saT4KKzxsaT5UaGUgVE9NQ0FULURFViBtYWlsaW5nIGxpc3QsIHdoaWNoIHlvdSBjYW4gc3Vic2NyaWJlIHRvCisgICAgPGEgaHJlZj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9zaXRlL21haWwuaHRtbCI+aGVyZTwvYT4uICBUaGlzIGxpc3QgaXMKKyAgICA8c3Ryb25nPnJlc2VydmVkPC9zdHJvbmc+IGZvciBkaXNjdXNzaW9ucyBhYm91dCB0aGUgZGV2ZWxvcG1lbnQgb2YgVG9tY2F0CisgICAgaXRzZWxmLiAgUXVlc3Rpb25zIGFib3V0IFRvbWNhdCBjb25maWd1cmF0aW9uLCBhbmQgdGhlIHByb2JsZW1zIHlvdSBydW4KKyAgICBpbnRvIHdoaWxlIGRldmVsb3BpbmcgYW5kIHJ1bm5pbmcgYXBwbGljYXRpb25zLCB3aWxsIG5vcm1hbGx5IGJlIG1vcmUKKyAgICBhcHByb3ByaWF0ZSBvbiB0aGUgVE9NQ0FULVVTRVIgbGlzdCBpbnN0ZWFkLjwvbGk+Cis8L3VsPgorCis8cD5BbmQsIGlmIHlvdSB0aGluayBzb21ldGhpbmcgc2hvdWxkIGJlIGluIHRoZSBkb2NzLCBieSBhbGwgbWVhbnMgbGV0IHVzIGtub3cKK29uIHRoZSBUT01DQVQtREVWIGxpc3QsIG9yIHNlbmQgb25lIG9mIHRoZSBkb2MgYXV0aG9ycyBlbWFpbC48L3A+CisKKzwvc2VjdGlvbj4KKworPC9ib2R5PgorCis8L2RvY3VtZW50PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9qYXNwZXItaG93dG8ueG1sIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9qYXNwZXItaG93dG8ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3YmJlYWUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2phc3Blci1ob3d0by54bWwKQEAgLTAsMCArMSwyOTggQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCFET0NUWVBFIGRvY3VtZW50IFsKKyAgPCFFTlRJVFkgcHJvamVjdCBTWVNURU0gInByb2plY3QueG1sIj4KK10+Cis8ZG9jdW1lbnQgdXJsPSJqYXNwZXItaG93dG8uaHRtbCI+CisKKyAgICAmcHJvamVjdDsKKworICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICA8YXV0aG9yIGVtYWlsPSJnbGVubkBhcGFjaGUub3JnIj5HbGVubiBMLiBOaWVsc2VuPC9hdXRob3I+CisgICAgICAgIDx0aXRsZT5KYXNwZXIgMiBKU1AgRW5naW5lIEhvdyBUbzwvdGl0bGU+CisgICAgPC9wcm9wZXJ0aWVzPgorCis8Ym9keT4KKworPHNlY3Rpb24gbmFtZT0iVGFibGUgb2YgQ29udGVudHMiPgorPHA+Cis8YSBocmVmPSIjSW50cm9kdWN0aW9uIj5JbnRyb2R1Y3Rpb248L2E+PGJyIC8+Cis8YSBocmVmPSIjQ29uZmlndXJhdGlvbiI+Q29uZmlndXJhdGlvbjwvYT48YnIgLz4KKzxhIGhyZWY9IiNQcm9kdWN0aW9uIENvbmZpZ3VyYXRpb24iPlByb2R1Y3Rpb24gQ29uZmlndXJhdGlvbjwvYT48YnIgLz4KKzxhIGhyZWY9IiNXZWIgQXBwbGljYXRpb24gQ29tcGlsYXRpb24iPldlYiBBcHBsaWNhdGlvbiBDb21waWxhdGlvbjwvYT48YnIgLz4KKzxhIGhyZWY9IiNVc2luZyBKaWtlcyI+VXNpbmcgSmlrZXM8L2E+PGJyIC8+Cis8L3A+Cis8L3NlY3Rpb24+CisKKzxzZWN0aW9uIG5hbWU9IkludHJvZHVjdGlvbiI+CisKKzxwPlRvbWNhdCA1LjUgdXNlcyB0aGUgSmFzcGVyIDIgSlNQIEVuZ2luZSB0byBpbXBsZW1lbnQKK3RoZSA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL2pzcC8iPkphdmFTZXJ2ZXIgUGFnZXMgMi4wPC9hPgorc3BlY2lmaWNhdGlvbi48L3A+CisKKzxwPkphc3BlciAyIGhhcyBiZWVuIHJlZGVzaWduZWQgdG8gc2lnbmlmaWNhbnRseSBpbXByb3ZlIHBlcmZvcm1hbmNlIG92ZXIKK3RoZSBvcmlnbmFsIEphc3Blci4gIEluIGFkZGl0aW9uIHRvIGdlbmVyYWwgY29kZSBpbXByb3ZlbWVudHMgdGhlIGZvbGxvd2luZworY2hhbmdlcyB3ZXJlIG1hZGU6Cis8dWw+Cis8bGk+PHN0cm9uZz5KU1AgQ3VzdG9tIFRhZyBQb29saW5nPC9zdHJvbmc+IC0gVGhlIGphdmEgb2JqZWN0cyBpbnN0YW50aWF0ZWQKK2ZvciBKU1AgQ3VzdG9tIFRhZ3MgY2FuIG5vdyBiZSBwb29sZWQgYW5kIHJldXNlZC4gIFRoaXMgc2lnbmlmaWNhbnRseSBib29zdHMKK3RoZSBwZXJmb3JtYW5jZSBvZiBKU1AgcGFnZXMgd2hpY2ggdXNlIGN1c3RvbSB0YWdzLjwvbGk+Cis8bGk+PHN0cm9uZz5CYWNrZ3JvdW5kIEpTUCBjb21waWxhdGlvbjwvc3Ryb25nPiAtIElmIHlvdSBtYWtlIGEgY2hhbmdlIHRvCithIEpTUCBwYWdlIHdoaWNoIGhhZCBhbHJlYWR5IGJlZW4gY29tcGlsZWQgSmFzcGVyIDIgY2FuIHJlY29tcGlsZSB0aGF0CitwYWdlIGluIHRoZSBiYWNrZ3JvdW5kLiAgVGhlIHByZXZpb3VzbHkgY29tcGlsZWQgSlNQIHBhZ2Ugd2lsbCBzdGlsbCBiZQorYXZhaWxhYmxlIHRvIHNlcnZlIHJlcXVlc3RzLiAgT25jZSB0aGUgbmV3IHBhZ2UgaGFzIGJlZW4gY29tcGlsZWQKK3N1Y2Nlc3NmdWxseSBpdCB3aWxsIHJlcGxhY2UgdGhlIG9sZCBwYWdlLiAgVGhpcyBoZWxwcyBpbXByb3ZlIGF2YWlsYWJsaXR5CitvZiB5b3VyIEpTUCBwYWdlcyBvbiBhIHByb2R1Y3Rpb24gc2VydmVyLjwvbGk+Cis8bGk+PHN0cm9uZz5SZWNvbXBpbGUgSlNQIHdoZW4gaW5jbHVkZWQgcGFnZSBjaGFuZ2VzPC9zdHJvbmc+IC0gSmFzcGVyIDIKK2NhbiBub3cgZGV0ZWN0IHdoZW4gYSBwYWdlIGluY2x1ZGVkIGF0IGNvbXBpbGUgdGltZSBmcm9tIGEgSlNQIGhhcyBjaGFuZ2VkCithbmQgdGhlbiByZWNvbXBpbGUgdGhlIHBhcmVudCBKU1AuPC9saT4KKzxsaT48c3Ryb25nPkpEVCB1c2VkIHRvIGNvbXBpbGUgSlNQIHBhZ2VzPC9zdHJvbmc+IC0gVGhlCitFY2xpcHNlIEpEVCBKYXZhIGNvbXBpbGVyIGlzIG5vdyB1c2VkIHRvIHBlcmZvcm0gSlNQIGphdmEgc291cmNlIGNvZGUKK2NvbXBpbGF0aW9uLiBUaGlzIGNvbXBpbGVyIGxvYWRzIHNvdXJjZSBkZXBlbmRlbmNpZXMgZnJvbSB0aGUgY29udGFpbmVyCitjbGFzc2xvYWRlci4gQW50IGFuZCBqYXZhYyBjYW4gc3RpbGwgYmUgdXNlZC48L2xpPgorPC91bD4KKzwvcD4KKworPHA+SmFzcGVyIGlzIGltcGxlbWVudGVkIHVzaW5nIHRoZSBzZXJ2bGV0IGNsYXNzCis8Y29kZT5vcmcuYXBhY2hlLmphc3Blci5zZXJ2bGV0LkpzcFNlcnZsZXQ8L2NvZGU+LjwvcD4KKworPC9zZWN0aW9uPgorCis8c2VjdGlvbiBuYW1lPSJDb25maWd1cmF0aW9uIj4KKworPHA+QnkgZGVmYXVsdCBKYXNwZXIgaXMgY29uZmlndXJlZCBmb3IgdXNlIHdoZW4gZG9pbmcgd2ViIGFwcGxpY2F0aW9uCitkZXZlbG9wbWVudC4gIFNlZSB0aGUgc2VjdGlvbiA8YSBocmVmPSIjUHJvZHVjdGlvbiBDb25maWd1cmF0aW9uIj4KK1Byb2R1Y3Rpb24gQ29uZmlndXJhdGlvbjwvYT4gZm9yIGluZm9ybWF0aW9uIG9uIGNvbmZpZ3VyaW5nIEphc3BlcgorZm9yIHVzZSBvbiBhIHByb2R1Y3Rpb24gVG9tY2F0IHNlcnZlci48L3A+CisKKzxwPlRoZSBzZXJ2bGV0IHdoaWNoIGltcGxlbWVudHMgSmFzcGVyIGlzIGNvbmZpZ3VyZWQgdXNpbmcgaW5pdCBwYXJhbWV0ZXJzCitpbiB5b3VyIGdsb2JhbCA8Y29kZT4kQ0FUQUxJTkFfQkFTRS9jb25mL3dlYi54bWw8L2NvZGU+LgorCis8dWw+Cis8bGk+PHN0cm9uZz5jaGVja0ludGVydmFsPC9zdHJvbmc+IC0gSWYgZGV2ZWxvcG1lbnQgaXMgZmFsc2UgYW5kIHJlbG9hZGluZyBpcwordHJ1ZSwgYmFja2dyb3VuZCBjb21waWxlcyBhcmUgZW5hYmxlZC4gY2hlY2tJbnRlcnZhbCBpcyB0aGUgdGltZSBpbiBzZWNvbmRzCitiZXR3ZWVuIGNoZWNrcyB0byBzZWUgaWYgYSBKU1AgcGFnZSBuZWVkcyB0byBiZSByZWNvbXBpbGVkLiBEZWZhdWx0Cis8Y29kZT4zMDA8L2NvZGU+IHNlY29uZHMuPC9saT4KKworPGxpPjxzdHJvbmc+Y29tcGlsZXI8L3N0cm9uZz4gLSBXaGljaCBjb21waWxlciBBbnQgc2hvdWxkIHVzZSB0byBjb21waWxlIEpTUAorcGFnZXMuICBTZWUgdGhlIEFudCBkb2N1bWVuYXRpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24uIElmIHRoZSB2YWx1ZSBpcyBub3Qgc2V0LAordGhlbiB0aGUgZGVmYXVsdCBFY2xpcHNlIEpEVCBKYXZhIGNvbXBpbGVyIHdpbGwgYmUgdXNlZCBpbnN0ZWFkIG9mIHVzaW5nIEFudC4gCitObyBkZWZhdWx0IHZhbHVlLjwvbGk+CisKKzxsaT48c3Ryb25nPmNsYXNzZGVidWdpbmZvPC9zdHJvbmc+IC0gU2hvdWxkIHRoZSBjbGFzcyBmaWxlIGJlIGNvbXBpbGVkIHdpdGgKK2RlYnVnZ2luZyBpbmZvcm1hdGlvbj8gIDxjb2RlPnRydWU8L2NvZGU+IG9yIDxjb2RlPmZhbHNlPC9jb2RlPiwgZGVmYXVsdAorPGNvZGU+dHJ1ZTwvY29kZT4uCis8L2xpPgorCis8bGk+PHN0cm9uZz5jbGFzc3BhdGg8L3N0cm9uZz4gLSBXaGF0IGNsYXNzIHBhdGggc2hvdWxkIEkgdXNlIHdoaWxlIGNvbXBpbGluZworZ2VuZXJhdGVkIHNlcnZsZXRzPyAgQnkgZGVmYXVsdCB0aGUgY2xhc3NwYXRoIGlzIGNyZWF0ZWQgZHluYW1pY2FsbHkgYmFzZWQgb24KK3RoZSBjdXJyZW50IHdlYiBhcHBsaWNhdGlvbi48L2xpPgorCis8bGk+PHN0cm9uZz5kZXZlbG9wbWVudDwvc3Ryb25nPiAtIElzIEphc3BlciB1c2VkIGluIGRldmVsb3BtZW50IG1vZGUgKHdpbGwKK2NoZWNrIGZvciBKU1AgbW9kaWZpY2F0aW9uIG9uIGV2ZXJ5IGFjY2Vzcyk/IDxjb2RlPnRydWU8L2NvZGU+IG9yCis8Y29kZT5mYWxzZTwvY29kZT4sIGRlZmF1bHQgPGNvZGU+dHJ1ZTwvY29kZT4uPC9saT4KKworPGxpPjxzdHJvbmc+ZW5hYmxlUG9vbGluZzwvc3Ryb25nPiAtIERldGVybWluZXMgd2hldGhlciB0YWcgaGFuZGxlciBwb29saW5nIGlzCitlbmFibGVkLiA8Y29kZT50cnVlPC9jb2RlPiBvciA8Y29kZT5mYWxzZTwvY29kZT4sIGRlZmF1bHQgPGNvZGU+dHJ1ZTwvY29kZT4uCis8L2xpPgorCis8bGk+PHN0cm9uZz5pZUNsYXNzSWQ8L3N0cm9uZz4gLSBUaGUgY2xhc3MtaWQgdmFsdWUgdG8gYmUgc2VudCB0byBJbnRlcm5ldAorRXhwbG9yZXIgd2hlbiB1c2luZyAmbHQ7anNwOnBsdWdpbiZndDsgdGFncy4gICBEZWZhdWx0Cis8Y29kZT5jbHNpZDo4QUQ5Qzg0MC0wNDRFLTExRDEtQjNFOS0wMDgwNUY0OTlEOTM8L2NvZGU+LjwvbGk+CisKKzxsaT48c3Ryb25nPmZvcms8L3N0cm9uZz4gLSBIYXZlIEFudCBmb3JrIEpTUCBwYWdlIGNvbXBpbGVzIHNvIHRoZXkgYXJlCitwZXJmb3JtZWQgaW4gYSBzZXBlcmF0ZSBKVk0gZnJvbSBUb21jYXQ/IDxjb2RlPnRydWU8L2NvZGU+IG9yCis8Y29kZT5mYWxzZTwvY29kZT4sIGRlZmF1bHQgPGNvZGU+dHJ1ZTwvY29kZT4uPC9saT4KKworPGxpPjxzdHJvbmc+amF2YUVuY29kaW5nPC9zdHJvbmc+IC0gSmF2YSBmaWxlIGVuY29kaW5nIHRvIHVzZSBmb3IgZ2VuZXJhdGluZworamF2YSBzb3VyY2UgZmlsZXMuIERlZmF1bHQgPGNvZGU+VVRGODwvY29kZT4uPC9saT4KKworPGxpPjxzdHJvbmc+Z2VuU3RyQXNDaGFyQXJyYXk8L3N0cm9uZz4gLSBTaG91bGQgdGV4dCBzdHJpbmdzIGJlIGdlbmVyYXRlZCBhcyBjaGFyCithcnJheXMsIHRvIGltcHJvdmUgcGVyZm9ybWFuY2UgaW4gc29tZSBjYXNlcz8gRGVmYXVsdCA8Y29kZT5mYWxzZTwvY29kZT4uPC9saT4KKworPGxpPjxzdHJvbmc+a2VlcGdlbmVyYXRlZDwvc3Ryb25nPiAtIFNob3VsZCB3ZSBrZWVwIHRoZSBnZW5lcmF0ZWQgSmF2YSBzb3VyY2UKK2NvZGUgZm9yIGVhY2ggcGFnZSBpbnN0ZWFkIG9mIGRlbGV0aW5nIGl0PyA8Y29kZT50cnVlPC9jb2RlPiBvcgorPGNvZGU+ZmFsc2U8L2NvZGU+LCBkZWZhdWx0IDxjb2RlPnRydWU8L2NvZGU+LjwvbGk+CisKKzxsaT48c3Ryb25nPm1hcHBlZGZpbGU8L3N0cm9uZz4gLSBTaG91bGQgd2UgZ2VuZXJhdGUgc3RhdGljIGNvbnRlbnQgd2l0aCBvbmUgCitwcmludCBzdGF0ZW1lbnQgcGVyIGlucHV0IGxpbmUsIHRvIGVhc2UgZGVidWdnaW5nPworPGNvZGU+dHJ1ZTwvY29kZT4gb3IgPGNvZGU+ZmFsc2U8L2NvZGU+LCBkZWZhdWx0IDxjb2RlPnRydWU8L2NvZGU+LjwvbGk+CisKKzxsaT48c3Ryb25nPm1vZGlmaWNhdGlvblRlc3RJbnRlcnZhbDwvc3Ryb25nPiAtIENoZWNrcyBmb3IgbW9kaWZpY2F0aW9uIGZvciBhIGdpdmVuCitKU1AgZmlsZSAoYW5kIGFsbCBpdHMgZGVwZW5kZW50IGZpbGVzKSB3aWxsIGJlIHBlcmZvcm1lZCBvbmx5IG9uY2UgZXZlcnkgc3BlY2lmaWVkIGFtb3VudAorb2YgbWlsbGlzZWNvbmRzLiBTZXR0aW5nIHRoaXMgdG8gMCB3aWxsIGNhdXNlIHRoZSBKU1AgdG8gYmUgY2hlY2tlZCBvbiBldmVyeSBhY2Nlc3MuCitEZWZhdWx0IGlzIDxjb2RlPjQ8L2NvZGU+IHNlY29uZHMuPC9saT4KKworPGxpPjxzdHJvbmc+cmVsb2FkaW5nPC9zdHJvbmc+IC0gU2hvdWxkIEphc3BlciBjaGVjayBmb3IgbW9kaWZpZWQgSlNQcz8KKzxjb2RlPnRydWU8L2NvZGU+IG9yIDxjb2RlPmZhbHNlPC9jb2RlPiwgZGVmYXVsdCA8Y29kZT5mYWxzZTwvY29kZT4uPC9saT4KKworPGxpPjxzdHJvbmc+c2NyYXRjaGRpcjwvc3Ryb25nPiAtIFdoYXQgc2NyYXRjaCBkaXJlY3Rvcnkgc2hvdWxkIHdlIHVzZSB3aGVuCitjb21waWxpbmcgSlNQIHBhZ2VzPyBEZWZhdWx0IGlzIHRoZSB3b3JrIGRpcmVjdG9yeSBmb3IgdGhlIGN1cnJlbnQgd2ViCithcHBsaWNhdGlvbi48L2xpPgorCis8bGk+PHN0cm9uZz50cmltU3BhY2VzPC9zdHJvbmc+IC0gU2hvdWxkIHdoaXRlIHNwYWNlcyBpbiB0ZW1wbGF0ZSB0ZXh0IGJldHdlZW4KK2FjdGlvbnMgb3IgZGlyZWN0aXZlcyBiZSB0cmltbWVkID8sIGRlZmF1bHQgPGNvZGU+ZmFsc2U8L2NvZGU+LjwvbGk+Cis8L3VsPgorPC9wPgorCis8cD5UaGUgSmF2YSBjb21waWxlciBmcm9tIEVjbGlwc2UgSkRUIGluIGluY2x1ZGVkIGFzIHRoZSBkZWZhdWx0IGNvbXBpbGVyLiBJdCBpcyBhbgorYWR2YW5jZWQgSmF2YSBjb21waWxlciB3aGljaCB3aWxsIGxvYWQgYWxsIGRlcGVuZGVuY2llcyBmcm9tIHRoZSBUb21jYXQgY2xhc3MgbG9hZGVyLCAKK3doaWNoIHdpbGwgaGVscCB0cmVtZW5kb3VzbHkgd2hlbiBjb21waWxpbmcgb24gbGFyZ2UgaW5zdGFsbGF0aW9ucyB3aXRoIHRlbnMgb2YgSkFScy4KK09uIGZhc3Qgc2VydmVycywgdGhpcyB3aWxsIGFsbG93IHN1Yi1zZWNvbmQgcmVjb21waWxhdGlvbiBjeWNsZXMgZm9yIGV2ZW4gbGFyZ2UgSlNQIAorcGFnZXMuIFRoaXMgbmV3IGNvbXBpbGVyIHdpbGwgYmUgdXBkYXRlZCB0byBzdXBwb3J0IHRoZSBKYXZhIDUgc3ludGF4IGFzIHNvb24gYXMKK3Bvc3NpYmxlLjwvcD4KKworPHA+QXBhY2hlIEFudCwgd2hpY2ggd2FzIHVzZWQgaW4gcHJldmlvdXMgVG9tY2F0IHJlbGVhc2VzLCBjYW4gYmUgdXNlZCBpbnN0ZWFkIGluc3RlYWQgb2YgCit0aGUgbmV3IGNvbXBpbGVyIGJ5IHNpbXBseSByZW1vdmluZyB0aGUgPGNvZGU+Y29tbW9uL2xpYi9qYXNwZXItY29tcGlsZXItamR0LmphcjwvY29kZT4gZmlsZSwgCithbmQgcGxhY2luZyB0aGUgPGNvZGU+YW50LmphcjwvY29kZT4gZmlsZSBmcm9tIHRoZSBsYXRlc3QgQW50IGRpc3RyaWJ1dGlvbiBpbiB0aGUgCis8Y29kZT5jb21tb24vbGliPC9jb2RlPiBmb2xkZXIuPC9wPgorCis8L3NlY3Rpb24+CisKKzxzZWN0aW9uIG5hbWU9IlByb2R1Y3Rpb24gQ29uZmlndXJhdGlvbiI+CisKKzxwPlRoZSBtYWluIEpTUCBvcHRpbWl6YXRpb24gd2hpY2ggY2FuIGJlIGRvbmUgaXMgcHJlY29tcGlsYXRpb24gb2YgSlNQcy4gSG93ZXZlciwKK3RoaXMgbWlnaHQgbm90IGJlIHBvc3NpYmxlIChmb3IgZXhhbXBsZSwgd2hlbiB1c2luZyB0aGUganNwLXByb3BlcnR5LWdyb3VwIGZlYXR1cmUpCitvciBwcmFjdGljYWwsIGluIHdoaWNoIGNhc2UgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIEphc3BlciBzZXJ2bGV0IGJlY29tZXMgY3JpdGljYWwuPC9wPgorCis8cD5XaGVuIHVzaW5nIEphc3BlciAyIGluIGEgcHJvZHVjdGlvbiBUb21jYXQgc2VydmVyIHlvdSBzaG91bGQgY29uc2lkZXIKK21ha2luZyB0aGUgZm9sbG93aW5nIGNoYW5nZXMgZnJvbSB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uLgorPHVsPgorPGxpPjxzdHJvbmc+ZGV2ZWxvcG1lbnQ8L3N0cm9uZz4gLSBUbyBkaXNhYmxlIG9uIGFjY2VzcyBjaGVja3MgZm9yIEpTUAorcGFnZXMgY29tcGlsYXRpb24gc2V0IHRoaXMgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+LjwvbGk+Cis8bGk+PHN0cm9uZz5nZW5TdHJBc0NoYXJBcnJheTwvc3Ryb25nPiAtIFRvIGdlbmVyYXRlIHNsaWdodGx5IG1vcmUgZWZmaWNpZW50IAorY2hhciBhcnJheXMsIHNldCB0aGlzIHRvIDxjb2RlPnRydWU8L2NvZGU+LjwvbGk+Cis8bGk+PHN0cm9uZz5tb2RpZmljYXRpb25UZXN0SW50ZXJ2YWw8L3N0cm9uZz4gLSBJZiBkZXZlbG9wbWVudCBoYXMgdG8gYmUgc2V0IHRvCis8Y29kZT50cnVlPC9jb2RlPiBmb3IgYW55IHJlYXNvbiAoc3VjaCBhcyBkeW5hbWljIGdlbmVyYXRpb24gb2YgSlNQcyksIHNldHRpbmcKK3RoaXMgdG8gYSBoaWdoIHZhbHVlIHdpbGwgaW1wcm92ZSBwZXJmb3JtYW5jZSBhIGxvdC48L2xpPgorPGxpPjxzdHJvbmc+dHJpbVNwYWNlczwvc3Ryb25nPiAtIFRvIHJlbW92ZSB1c2VsZXNzIGJ5dGVzIGZyb20gdGhlIHJlc3BvbnNlLAorc2V0IHRoaXMgdG8gPGNvZGU+dHJ1ZTwvY29kZT4uPC9saT4KKzwvdWw+Cis8L3A+CisKKzwvc2VjdGlvbj4KKworPHNlY3Rpb24gbmFtZT0iV2ViIEFwcGxpY2F0aW9uIENvbXBpbGF0aW9uIj4KKworPHA+VXNpbmcgQW50IGlzIHRoZSBwcmVmZXJyZWQgd2F5IHRvIGNvbXBpbGUgd2ViIGFwcGxpY2F0aW9ucyB1c2luZyBKU1BDLiAKK1VzZSB0aGUgc2NyaXB0IGdpdmVuIGJlbG93IChhIHNpbWlsYXIgc2NyaXB0IGlzIGluY2x1ZGVkIGluIHRoZSAiZGVwbG95ZXIiIAorZG93bmxvYWQpIHRvIHByZWNvbXBpbGUgYSB3ZWJhcHA6Cis8L3A+CisKKzxwPgorPHNvdXJjZT4KKyZsdDtwcm9qZWN0IG5hbWU9IldlYmFwcCBQcmVjb21waWxhdGlvbiIgZGVmYXVsdD0iYWxsIiBiYXNlZGlyPSIuIiZndDsgCisKKyAgJmx0O3RhcmdldCBuYW1lPSJqc3BjIiZndDsgCisKKyAgICAmbHQ7dGFza2RlZiBjbGFzc25hbWU9Im9yZy5hcGFjaGUuamFzcGVyLkpzcEMiIG5hbWU9Imphc3BlcjIiICZndDsgCisgICAgICAmbHQ7Y2xhc3NwYXRoIGlkPSJqc3BjLmNsYXNzcGF0aCImZ3Q7IAorICAgICAgICAmbHQ7cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7amF2YS5ob21lfS8uLi9saWIvdG9vbHMuamFyIi8mZ3Q7IAorICAgICAgICAmbHQ7ZmlsZXNldCBkaXI9IiR7dG9tY2F0LmhvbWV9L2JpbiImZ3Q7IAorICAgICAgICAgICZsdDtpbmNsdWRlIG5hbWU9IiouamFyIi8mZ3Q7IAorICAgICAgICAmbHQ7L2ZpbGVzZXQmZ3Q7IAorICAgICAgICAmbHQ7ZmlsZXNldCBkaXI9IiR7dG9tY2F0LmhvbWV9L3NlcnZlci9saWIiJmd0OyAKKyAgICAgICAgICAmbHQ7aW5jbHVkZSBuYW1lPSIqLmphciIvJmd0OyAKKyAgICAgICAgJmx0Oy9maWxlc2V0Jmd0OyAKKyAgICAgICAgJmx0O2ZpbGVzZXQgZGlyPSIke3RvbWNhdC5ob21lfS9jb21tb24vbGliIiZndDsgCisgICAgICAgICAgJmx0O2luY2x1ZGUgbmFtZT0iKi5qYXIiLyZndDsgCisgICAgICAgICZsdDsvZmlsZXNldCZndDsgCisgICAgICAmbHQ7L2NsYXNzcGF0aCZndDsgCisgICAgJmx0Oy90YXNrZGVmJmd0OyAKKworICAgICZsdDtqYXNwZXIyIAorICAgICAgICAgICAgIHZhbGlkYXRlWG1sPSJmYWxzZSIgCisgICAgICAgICAgICAgdXJpcm9vdD0iJHt3ZWJhcHAucGF0aH0iIAorICAgICAgICAgICAgIHdlYlhtbEZyYWdtZW50PSIke3dlYmFwcC5wYXRofS9XRUItSU5GL2dlbmVyYXRlZF93ZWIueG1sIiAKKyAgICAgICAgICAgICBvdXRwdXREaXI9IiR7d2ViYXBwLnBhdGh9L1dFQi1JTkYvc3JjIiAvJmd0OyAKKworICAmbHQ7L3RhcmdldCZndDsgCisKKyAgJmx0O3RhcmdldCBuYW1lPSJjb21waWxlIiZndDsKKworICAgICZsdDtta2RpciBkaXI9IiR7d2ViYXBwLnBhdGh9L1dFQi1JTkYvY2xhc3NlcyIvJmd0OworICAgICZsdDtta2RpciBkaXI9IiR7d2ViYXBwLnBhdGh9L1dFQi1JTkYvbGliIi8mZ3Q7CisKKyAgICAmbHQ7amF2YWMgZGVzdGRpcj0iJHt3ZWJhcHAucGF0aH0vV0VCLUlORi9jbGFzc2VzIgorICAgICAgICAgICBvcHRpbWl6ZT0ib2ZmIgorICAgICAgICAgICBkZWJ1Zz0ib24iIGZhaWxvbmVycm9yPSJmYWxzZSIKKyAgICAgICAgICAgc3JjZGlyPSIke3dlYmFwcC5wYXRofS9XRUItSU5GL3NyYyIgCisJICAgZXhjbHVkZXM9IioqLyouc21hcCImZ3Q7CisgICAgICAmbHQ7Y2xhc3NwYXRoJmd0OworICAgICAgICAmbHQ7cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7d2ViYXBwLnBhdGh9L1dFQi1JTkYvY2xhc3NlcyIvJmd0OworICAgICAgICAmbHQ7ZmlsZXNldCBkaXI9IiR7d2ViYXBwLnBhdGh9L1dFQi1JTkYvbGliIiZndDsKKyAgICAgICAgICAmbHQ7aW5jbHVkZSBuYW1lPSIqLmphciIvJmd0OworICAgICAgICAmbHQ7L2ZpbGVzZXQmZ3Q7CisgICAgICAgICZsdDtwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt0b21jYXQuaG9tZX0vY29tbW9uL2NsYXNzZXMiLyZndDsKKyAgICAgICAgJmx0O2ZpbGVzZXQgZGlyPSIke3RvbWNhdC5ob21lfS9jb21tb24vbGliIiZndDsKKyAgICAgICAgICAmbHQ7aW5jbHVkZSBuYW1lPSIqLmphciIvJmd0OworICAgICAgICAmbHQ7L2ZpbGVzZXQmZ3Q7CisgICAgICAgICZsdDtwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt0b21jYXQuaG9tZX0vc2hhcmVkL2NsYXNzZXMiLyZndDsKKyAgICAgICAgJmx0O2ZpbGVzZXQgZGlyPSIke3RvbWNhdC5ob21lfS9zaGFyZWQvbGliIiZndDsKKyAgICAgICAgICAmbHQ7aW5jbHVkZSBuYW1lPSIqLmphciIvJmd0OworICAgICAgICAmbHQ7L2ZpbGVzZXQmZ3Q7CisgICAgICAgICZsdDtmaWxlc2V0IGRpcj0iJHt0b21jYXQuaG9tZX0vYmluIiZndDsgCisgICAgICAgICAgJmx0O2luY2x1ZGUgbmFtZT0iKi5qYXIiLyZndDsgCisgICAgICAgICZsdDsvZmlsZXNldCZndDsgCisgICAgICAmbHQ7L2NsYXNzcGF0aCZndDsKKyAgICAgICZsdDtpbmNsdWRlIG5hbWU9IioqIiAvJmd0OworICAgICAgJmx0O2V4Y2x1ZGUgbmFtZT0idGFncy8qKiIgLyZndDsKKyAgICAmbHQ7L2phdmFjJmd0OworCisgICZsdDsvdGFyZ2V0Jmd0OworCisgICZsdDt0YXJnZXQgbmFtZT0iYWxsIiBkZXBlbmRzPSJqc3BjLGNvbXBpbGUiJmd0OworICAmbHQ7L3RhcmdldCZndDsKKworJmx0Oy9wcm9qZWN0Jmd0OworPC9zb3VyY2U+Cis8L3A+CisKKzxwPgorVGhlIGZvbGxvd2luZyBjb21tYW5kIGxpbmUgY2FuIGJlIHVzZWQgdG8gcnVuIHRoZSBzY3JpcHQKKyhyZXBsYWNpbmcgdGhlIHRva2VucyB3aXRoIHRoZSBUb21jYXQgYmFzZSBwYXRoIGFuZCB0aGUgcGF0aCB0byB0aGUgd2ViYXBwIAord2hpY2ggc2hvdWxkIGJlIHByZWNvbXBpbGVkKTo8YnIvPgorPHNvdXJjZT4KKyRBTlRfSE9NRS9iaW4vYW50IC1EdG9tY2F0LmhvbWU9Jmx0OyRUT01DQVRfSE9NRSZndDsgLUR3ZWJhcHAucGF0aD0mbHQ7JFdFQkFQUF9QQVRIJmd0OworPC9zb3VyY2U+Cis8L3A+CisKKzxwPgorVGhlbiwgdGhlIGRlY2xhcmF0aW9ucyBhbmQgbWFwcGluZ3MgZm9yIHRoZSBzZXJ2bGV0cyB3aGljaCB3ZXJlIGdlbmVyYXRlZCAKK2R1cmluZyB0aGUgcHJlY29tcGlsYXRpb24gbXVzdCBiZSBhZGRlZCB0byB0aGUgd2ViIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQKK2Rlc2NyaXB0b3IuIEluc2VydCB0aGUgPGNvZGU+JHt3ZWJhcHAucGF0aH0vV0VCLUlORi9nZW5lcmF0ZWRfd2ViLnhtbDwvY29kZT4KK2F0IHRoZSByaWdodCBwbGFjZSBpbnNpZGUgdGhlIDxjb2RlPiR7d2ViYXBwLnBhdGh9L1dFQi1JTkYvd2ViLnhtbDwvY29kZT4gZmlsZS4KK1Jlc3RhcnQgdGhlIHdlYiBhcHBsaWNhdGlvbiAodXNpbmcgdGhlIG1hbmFnZXIpIGFuZCB0ZXN0IGl0IHRvIHZlcmlmeSBpdCBpcyAKK3J1bm5pbmcgZmluZSB3aXRoIHByZWNvbXBpbGVkIHNlcnZsZXRzLiBBbiBhcHByb3ByaWF0ZSB0b2tlbiBwbGFjZWQgaW4gdGhlCit3ZWIgYXBwbGljYXRpb24gZGVwbG95bWVudCBkZXNjcmlwdG9yIG1heSBhbHNvIGJlIHVzZWQgdG8gYXV0b21hdGljYWxseQoraW5zZXJ0IHRoZSBnZW5lcmF0ZWQgc2VydmxldCBkZWNsYXJhdGlvbnMgYW5kIG1hcHBpbmdzIHVzaW5nIEFudCBmaWx0ZXJpbmcgCitjYXBhYmlsaXRpZXMuIFRoaXMgaXMgYWN0dWFsbHkgaG93IGFsbCB0aGUgd2ViYXBwcyBkaXN0cmlidXRlZCB3aXRoIFRvbWNhdCAKK2FyZSBhdXRvbWF0aWNhbGx5IGNvbXBpbGVkIGFzIHBhcnQgb2YgdGhlIGJ1aWxkIHByb2Nlc3MuCis8L3A+CisKKzwvc2VjdGlvbj4KKworPHNlY3Rpb24gbmFtZT0iVXNpbmcgSmlrZXMiPgorCis8cD5JZiB5b3Ugd2lzaCB0byB1c2UKKzxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2ppa2VzLyI+CitKaWtlczwvYT4gdG8gY29tcGlsZSBKU1AgcGFnZXM6Cis8dWw+Cis8bGk+RG93bmxvYWQgYW5kIGluc3RhbGwgdGhlIEFudCBKQVIgaW4gPGNvZGU+JENBVEFMSU5BX0JBU0UvY29tbW9uL2xpYjwvY29kZT4uPC9saT4KKzxsaT5Eb3dubG9hZCBhbmQgaW5zdGFsbCBqaWtlcy4gamlrZXMgbXVzdCBzdXBwb3J0IHRoZSAtZW5jb2Rpbmcgb3B0aW9uLgorRXhlY3V0ZSA8Y29kZT5qaWtlcyAtaGVscDwvY29kZT4gdG8gdmVyaWZ5IHRoYXQgaXQgd2FzIGJ1aWx0IHdpdGggc3VwcG9ydAorZm9yIDxjb2RlPi1lbmNvZGluZzwvY29kZT4uPC9saT4KKzxsaT5TZXQgdGhlIGluaXQgcGFyYW1ldGVyIDxjb2RlPmNvbXBpbGVyPC9jb2RlPiB0byA8Y29kZT5qaWtlczwvY29kZT4uPC9saT4KKzxsaT5EZWZpbmUgdGhlIHByb3BlcnR5IDxjb2RlPi1EYnVpbGQuY29tcGlsZXIuZW1hY3M9dHJ1ZTwvY29kZT4gd2hlbiBzdGFydGluZworVG9tY2F0IGJ5IGFkZGluZyBpdCB0byB5b3VyIDxjb2RlPkNBVEFMSU5BX09QVFM8L2NvZGU+IGVudmlyb25tZW50IHZhcmlhYmxlLgorVGhpcyBjaGFuZ2VzIGhvdyBqaWtlcyBvdXRwdXRzIGVycm9yIG1lc3NhZ2VzIHNvIHRoYXQgaXQgaXMgY29tcGF0aWJsZSB3aXRoCitKYXNwZXIuPC9saT4KKzxsaT5JZiB5b3UgZ2V0IGFuIGVycm9yIHJlcG9ydGluZyB0aGF0IGppa2VzIGNhbid0IHVzZSBVVEY4IGVuY29kaW5nLCB0cnkKK3NldHRpbmcgdGhlIGluaXQgcGFyYW1ldGVyIDxjb2RlPmphdmFFbmNvZGluZzwvY29kZT4gdG8KKzxjb2RlPklTTy04ODU5LTE8L2NvZGU+LjwvbGk+Cis8L3VsPgorPC9wPgorCis8L3NlY3Rpb24+Cis8L2JvZHk+CisKKzwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9kb2NzL2phc3Blci9kb2NzL2FwaS9pbmRleC5odG1sIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9qYXNwZXIvZG9jcy9hcGkvaW5kZXguaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmU4ZjlhCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9qYXNwZXIvZG9jcy9hcGkvaW5kZXguaHRtbApAQCAtMCwwICsxLDE3IEBACis8IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwL3N0cmljdC5kdGQiPgorPGh0bWw+CisgICAgPGhlYWQ+CisgICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+CisgICAgPHRpdGxlPkFkbWluaXN0cmF0aW9uPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHk+CisKK1RvbWNhdCdzIGludGVybmFsIGphdmFkb2MgaXMgbm8gbG9uZ2VyIGluc3RhbGxlZCBieSBkZWZhdWx0LiBEb3dubG9hZCBhbmQgaW5zdGFsbCAKK3RoZSAiZnVsbGRvY3MiIHBhY2thZ2UgdG8gZ2V0IGl0LgorCitZb3UgY2FuIGFsc28gYWNjZXNzIHRoZSBqYXZhZG9jIG9ubGluZSBpbiB0aGUgVG9tY2F0IAorPGEgaHJlZj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy90b21jYXQvdG9tY2F0LTUuNS1kb2MvIj5kb2N1bWVudGF0aW9uIGJ1bmRsZTwvYT4uCisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2RvY3Mvam5kaS1kYXRhc291cmNlLWV4YW1wbGVzLWhvd3RvLnhtbCBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3Mvam5kaS1kYXRhc291cmNlLWV4YW1wbGVzLWhvd3RvLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTZjNTg4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9qbmRpLWRhdGFzb3VyY2UtZXhhbXBsZXMtaG93dG8ueG1sCkBAIC0wLDAgKzEsNTUwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhRE9DVFlQRSBkb2N1bWVudCBbCisgIDwhRU5USVRZIHByb2plY3QgU1lTVEVNICJwcm9qZWN0LnhtbCI+CitdPgorPGRvY3VtZW50IHVybD0iam5kaS1kYXRhc291cmNlLWV4YW1wbGVzLWhvd3RvLmh0bWwiPgorCisgICAgJnByb2plY3Q7CisKKyAgICA8cHJvcGVydGllcz4KKyAgICAgICAgPGF1dGhvciBlbWFpbD0ibGVzbGllLmh1Z2hlc0BydWJ1cy5jb20iPkxlcyBIdWdoZXM8L2F1dGhvcj4KKyAgICAgICAgPGF1dGhvciBlbWFpbD0iZGF2aWQtdG9tY2F0QGhhcmFidXJkYS5jb20iPkRhdmlkIEhhcmFidXJkYTwvYXV0aG9yPgorICAgICAgICA8YXV0aG9yPkdsZW5uIE5pZWxzZW48L2F1dGhvcj4KKyAgICAgICAgPGF1dGhvciBlbWFpbD0ieW9hdnNAYXBhY2hlLm9yZyI+WW9hdiBTaGFwaXJhPC9hdXRob3I+CisgICAgICAgIDx0aXRsZT5KTkRJIERhdGFzb3VyY2UgSE9XLVRPPC90aXRsZT4KKyAgICA8L3Byb3BlcnRpZXM+CisKKzxib2R5PgorCis8c2VjdGlvbiBuYW1lPSJUYWJsZSBvZiBDb250ZW50cyI+Cis8cD4KKzxhIGhyZWY9IiNJbnRyb2R1Y3Rpb24iPkludHJvZHVjdGlvbjwvYT48YnIgLz4KKzxhIGhyZWY9IiNEYXRhYmFzZSBDb25uZWN0aW9uIFBvb2wgKERCQ1ApIENvbmZpZ3VyYXRpb25zIj4KK0RhdGFiYXNlIENvbm5lY3Rpb24gUG9vbCAoREJDUCkgQ29uZmlndXJhdGlvbnM8L2E+PGJyIC8+Cis8YSBocmVmPSIjTm9uIERCQ1AgU29sdXRpb25zIj5Ob24gREJDUCBTb2x1dGlvbnM8L2E+PGJyIC8+Cis8YSBocmVmPSIjT3JhY2xlIDhpIHdpdGggT0NJIGNsaWVudCI+T3JhY2xlIDhpIHdpdGggT0NJIGNsaWVudDwvYT48YnIgLz4KKzxhIGhyZWY9IiNDb21tb24gUHJvYmxlbXMiPkNvbW1vbiBQcm9ibGVtczwvYT48YnIgLz4KKzwvcD4KKzwvc2VjdGlvbj4KKworPHNlY3Rpb24gbmFtZT0iSW50cm9kdWN0aW9uIj4KKworPHA+Sk5ESSBEYXRhc291cmNlIGNvbmZpZ3VyYXRpb24gaXMgY292ZXJlZCBleHRlbnNpdmVseSBpbiB0aGUKK0pOREktUmVzb3VyY2VzLUhPV1RPIGhvd2V2ZXIsIGZlZWRiYWNrIGZyb20gPGNvZGU+dG9tY2F0LXVzZXI8L2NvZGU+IGhhcworc2hvd24gdGhhdCBzcGVjaWZpY3MgZm9yIGluZGl2aWR1YWwgY29uZmlndXJhdGlvbnMgY2FuIGJlIHJhdGhlciB0cmlja3kuPC9wPgorCis8cD5IZXJlIHRoZW4gYXJlIHNvbWUgZXhhbXBsZSBjb25maWd1cmF0aW9ucyB0aGF0IGhhdmUgYmVlbiBwb3N0ZWQgdG8KK3RvbWNhdC11c2VyIGZvciBwb3B1bGFyIGRhdGFiYXNlcyBhbmQgc29tZSBnZW5lcmFsIHRpcHMgZm9yIGRiIHVzZWFnZS48L3A+CisKKzxwPllvdSBzaG91bGQgYmUgYXdhcmUgdGhhdCBzaW5jZSB0aGVzZSBub3RlcyBhcmUgZGVyaXZlZCBmcm9tIGNvbmZpZ3VyYXRpb24KK2FuZC9vciBmZWVkYmFjayBwb3N0ZWQgdG8gPGNvZGU+dG9tY2F0LXVzZXI8L2NvZGU+IFlNTVYgOi0pLiBQbGVhc2UgbGV0IHVzCitrbm93IGlmIHlvdSBoYXZlIGFueSBvdGhlciB0ZXN0ZWQgY29uZmlndXJhdGlvbnMgdGhhdCB5b3UgZmVlbCBtYXkgYmUgb2YgdXNlCit0byB0aGUgd2lkZXIgYXVkaWVuY2UsIG9yIGlmIHlvdSBmZWVsIHdlIGNhbiBpbXByb3ZlIHRoaXMgc2VjdGlvbiBpbiBhbnl3YXkuPC9wPgorCis8L3NlY3Rpb24+CisKKzxzZWN0aW9uIG5hbWU9IkRhdGFiYXNlIENvbm5lY3Rpb24gUG9vbCAoREJDUCkgQ29uZmlndXJhdGlvbnMiPgorCis8cD5EQkNQIHByb3ZpZGVzIHN1cHBvcnQgZm9yIEpEQkMgMi4wLiAgT24gc3lzdGVtcyB1c2luZyBhIDEuNCBKVk0gREJDUAord2lsbCBzdXBwb3J0IEpEQkMgMy4wLiBQbGVhc2UgbGV0IHVzIGtub3cgaWYgeW91IGhhdmUgdXNlZCBEQkNQIGFuZCBpdHMKK0pEQkMgMy4wIGZlYXR1cmVzIHdpdGggYSAxLjQgSlZNLgorPC9wPgorCis8cD5TZWUgdGhlIDxhIGhyZWY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvY29tbW9ucy9kYmNwL2FwaS9pbmRleC5odG1sIj4KK0RCQ1AgSmF2YWRvY3M8L2E+IEJhc2ljRGF0YVNvdXJjZSBjbGFzcyBmb3IgYSBjb21wbGV0ZSBsaXN0CitvZiBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMuCis8L3A+CisKKzxzdWJzZWN0aW9uIG5hbWU9Ikluc3RhbGxhdGlvbiI+Cis8cD5EQkNQIHVzZXMgdGhlIEpha2FydGEtQ29tbW9ucyBEYXRhYmFzZSBDb25uZWN0aW9uIFBvb2wuIEl0IHJlbGllcyBvbgorbnVtYmVyIG9mIEpha2FydGEtQ29tbW9ucyBjb21wb25lbnRzOgorPHVsPgorPGxpPkpha2FydGEtQ29tbW9ucyBEQkNQPC9saT4KKzxsaT5KYWthcnRhLUNvbW1vbnMgQ29sbGVjdGlvbnM8L2xpPgorPGxpPkpha2FydGEtQ29tbW9ucyBQb29sPC9saT4KKzwvdWw+CitUaGVzZSBsaWJyYXJpZXMgYXJlIGxvY2F0ZWQgaW4gYSBzaW5nbGUgSkFSIGF0IAorPGNvZGU+JENBVEFMSU5BX0hPTUUvY29tbW9uL2xpYi9uYW1pbmctZmFjdG9yeS1kYmNwLmphcjwvY29kZT4uIEhvd2V2ZXIsCitvbmx5IHRoZSBjbGFzc2VzIG5lZWRlZCBmb3IgY29ubmVjdGlvbiBwb29saW5nIGhhdmUgYmVlbiBpbmNsdWRlZCwgYW5kIHRoZQorcGFja2FnZXMgaGF2ZSBiZWVuIHJlbmFtZWQgdG8gYXZvaWQgaW50ZXJmZXJpbmcgd2l0aCBhcHBsaWNhdGlvbnMuCis8L3A+CisKKzwvc3Vic2VjdGlvbj4KKworPHN1YnNlY3Rpb24gbmFtZT0iUHJldmVudGluZyBkQiBjb25uZWN0aW9uIHBvb2wgbGVha3MiPgorCis8cD4KK0EgZGF0YWJhc2UgY29ubmVjdGlvbiBwb29sIGNyZWF0ZXMgYW5kIG1hbmFnZXMgYSBwb29sIG9mIGNvbm5lY3Rpb25zCit0byBhIGRhdGFiYXNlLiBSZWN5Y2xpbmcgYW5kIHJldXNpbmcgYWxyZWFkeSBleGlzdGluZyBjb25uZWN0aW9ucwordG8gYSBkQiBpcyBtb3JlIGVmZmljaWVudCB0aGFuIG9wZW5pbmcgYSBuZXcgY29ubmVjdGlvbi4KKzwvcD4KKworPHA+CitUaGVyZSBpcyBvbmUgcHJvYmxlbSB3aXRoIGNvbm5lY3Rpb24gcG9vbGluZy4gIEEgd2ViIGFwcGxpY2F0aW9uIGhhcwordG8gZXhwbGljZXRlbHkgY2xvc2UgUmVzdWx0U2V0J3MsIFN0YXRlbWVudCdzLCBhbmQgQ29ubmVjdGlvbidzLgorRmFpbHVyZSBvZiBhIHdlYiBhcHBsaWNhdGlvbiB0byBjbG9zZSB0aGVzZSByZXNvdXJjZXMgY2FuIHJlc3VsdCBpbgordGhlbSBuZXZlciBiZWluZyBhdmFpbGFibGUgYWdhaW4gZm9yIHJldXNlLCBhIGRiIGNvbm5lY3Rpb24gcG9vbCAibGVhayIuCitUaGlzIGNhbiBldmVudHVhbGx5IHJlc3VsdCBpbiB5b3VyIHdlYiBhcHBsaWNhdGlvbiBkYiBjb25uZWN0aW9ucyBmYWlsaW5nCitpZiB0aGVyZSBhcmUgbm8gbW9yZSBhdmFpbGFibGUgY29ubmVjdGlvbnMuPC9wPgorCis8cD4KK1RoZXJlIGlzIGEgc29sdXRpb24gdG8gdGhpcyBwcm9ibGVtLiAgVGhlIEpha2FydGEtQ29tbW9ucyBEQkNQIGNhbiBiZQorY29uZmlndXJlZCB0byB0cmFjayBhbmQgcmVjb3ZlciB0aGVzZSBhYmFuZG9uZWQgZEIgY29ubmVjdGlvbnMuICBOb3QKK29ubHkgY2FuIGl0IHJlY292ZXIgdGhlbSwgYnV0IGFsc28gZ2VuZXJhdGUgYSBzdGFjayB0cmFjZSBmb3IgdGhlIGNvZGUKK3doaWNoIG9wZW5lZCB0aGVzZSByZXNvdXJjZXMgYW5kIG5ldmVyIGNsb3NlZCB0aGVtLjwvcD4KKworPHA+CitUbyBjb25maWd1cmUgYSBEQkNQIERhdGFTb3VyY2Ugc28gdGhhdCBhYmFuZG9uZWQgZEIgY29ubmVjdGlvbnMgYXJlCityZW1vdmVkIGFuZCByZWN5Y2xlZCBhZGQgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGUgdG8gdGhlCis8Y29kZT5SZXNvdXJjZTwvY29kZT4gY29uZmlndXJhdGlvbiBmb3IgeW91ciBEQkNQIERhdGFTb3VyY2U6Cis8c291cmNlPgorICAgICAgICAgICAgcmVtb3ZlQWJhbmRvbmVkPSJ0cnVlIgorPC9zb3VyY2U+CitXaGVuIGF2YWlsYWJsZSBkYiBjb25uZWN0aW9ucyBydW4gbG93IERCQ1Agd2lsbCByZWNvdmVyIGFuZCByZWN5bGUKK2FueSBhYmFuZG9uZWQgZEIgY29ubmVjdGlvbnMgaXQgZmluZHMuIFRoZSBkZWZhdWx0IGlzIDxjb2RlPmZhbHNlPC9jb2RlPi4KKzwvcD4KKworPHA+CitVc2UgdGhlIDxjb2RlPnJlbW92ZUFiYW5kb25lZFRpbWVvdXQ8L2NvZGU+IGF0dHJpYnV0ZSB0byBzZXQgdGhlIG51bWJlcgorb2Ygc2Vjb25kcyBhIGRCIGNvbm5lY3Rpb24gaGFzIGJlZW4gaWRsZSBiZWZvcmUgaXQgaXMgY29uc2lkZXJlZCBhYmFuZG9uZWQuCis8c291cmNlPgorICAgICAgICAgICAgcmVtb3ZlQWJhbmRvbmVkVGltZW91dD0iNjAiCis8L3NvdXJjZT4KK1RoZSBkZWZhdWx0IHRpbWVvdXQgZm9yIHJlbW92aW5nIGFiYW5kb25lZCBjb25uZWN0aW9ucyBpcyAzMDAgc2Vjb25kcy4KKzwvcD4KKworPHA+CitUaGUgPGNvZGU+bG9nQWJhbmRvbmVkPC9jb2RlPiBhdHRyaWJ1dGUgY2FuIGJlIHNldCB0byA8Y29kZT50cnVlPC9jb2RlPgoraWYgeW91IHdhbnQgREJDUCB0byBsb2cgYSBzdGFjayB0cmFjZSBvZiB0aGUgY29kZSB3aGljaCBhYmFuZG9uZWQgdGhlCitkQiBjb25uZWN0aW9uIHJlc291cmNlcy4KKzxzb3VyY2U+CisgICAgICAgICAgICBsb2dBYmFuZG9uZWQ9InRydWUiCis8L3NvdXJjZT4KK1RoZSBkZWZhdWx0IGlzIDxjb2RlPmZhbHNlPC9jb2RlPi4KKzwvcD4KKworPC9zdWJzZWN0aW9uPgorCis8c3Vic2VjdGlvbiBuYW1lPSJNeVNRTCBEQkNQIEV4YW1wbGUiPgorCis8aDM+MC4gSW50cm9kdWN0aW9uPC9oMz4KKzxwPlZlcnNpb25zIG9mIDxhIGhyZWY9Imh0dHA6Ly93d3cubXlzcWwuY29tL3Byb2R1Y3RzL215c3FsL2luZGV4Lmh0bWwiPk15U1FMPC9hPiBhbmQgSkRCQyBkcml2ZXJzIHRoYXQgaGF2ZSBiZWVuIHJlcG9ydGVkIHRvIHdvcms6Cis8dWw+Cis8bGk+TXlTUUwgMy4yMy40NywgTXlTUUwgMy4yMy40NyB1c2luZyBJbm5vREIsLCBNeVNRTCAzLjIzLjU4LCAgTXlTUUwgNC4wLjFhbHBoYTwvbGk+Cis8bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5teXNxbC5jb20vcHJvZHVjdHMvY29ubmVjdG9yLWoiPkNvbm5lY3Rvci9KPC9hPiAzLjAuMTEtc3RhYmxlICh0aGUgb2ZmaWNpYWwgSkRCQyBEcml2ZXIpPC9saT4KKzxsaT48YSBocmVmPSJodHRwOi8vbW1teXNxbC5zb3VyY2Vmb3JnZS5uZXQiPm1tLm15c3FsPC9hPiAyLjAuMTQgKGFuIG9sZCAzcmQgcGFydHkgSkRCQyBEcml2ZXIpPC9saT4KKzwvdWw+Cis8L3A+CisKKzxwPkJlZm9yZSB5b3UgcHJvY2VlZCwgZG9uJ3QgZm9yZ2V0IHRvIGNvcHkgdGhlIEpEQkMgRHJpdmVyJ3MgamFyIGludG8gPGNvZGU+JENBVEFMSU5BX0hPTUUvY29tbW9uL2xpYjwvY29kZT4uPC9wPgorCis8aDM+MS4gTXlTUUwgY29uZmlndXJhdGlvbjwvaDM+Cis8cD4KK0Vuc3VyZSB0aGF0IHlvdSBmb2xsb3cgdGhlc2UgaW5zdHJ1Y3Rpb25zIGFzIHZhcmlhdGlvbnMgY2FuIGNhdXNlIHByb2JsZW1zLgorPC9wPgorCis8cD5DcmVhdGUgYSBuZXcgdGVzdCB1c2VyLCBhIG5ldyBkYXRhYmFzZSBhbmQgYSBzaW5nbGUgdGVzdCB0YWJsZS4KK1lvdXIgTXlTUUwgdXNlciA8c3Ryb25nPm11c3Q8L3N0cm9uZz4gaGF2ZSBhIHBhc3N3b3JkIGFzc2lnbmVkLiBUaGUgZHJpdmVyCit3aWxsIGZhaWwgaWYgeW91IHRyeSB0byBjb25uZWN0IHdpdGggYW4gZW1wdHkgcGFzc3dvcmQuCis8c291cmNlPgorbXlzcWwmZ3Q7IEdSQU5UIEFMTCBQUklWSUxFR0VTIE9OICouKiBUTyBqYXZhdXNlckBsb2NhbGhvc3QgCisgICAgLSZndDsgICBJREVOVElGSUVEIEJZICdqYXZhZHVkZScgV0lUSCBHUkFOVCBPUFRJT047CitteXNxbCZndDsgY3JlYXRlIGRhdGFiYXNlIGphdmF0ZXN0OworbXlzcWwmZ3Q7IHVzZSBqYXZhdGVzdDsKK215c3FsJmd0OyBjcmVhdGUgdGFibGUgdGVzdGRhdGEgKAorICAgIC0mZ3Q7ICAgaWQgaW50IG5vdCBudWxsIGF1dG9faW5jcmVtZW50IHByaW1hcnkga2V5LAorICAgIC0mZ3Q7ICAgZm9vIHZhcmNoYXIoMjUpLCAKKyAgICAtJmd0OyAgIGJhciBpbnQpOworPC9zb3VyY2U+Cis8YmxvY2txdW90ZT4KKzxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gdGhlIGFib3ZlIHVzZXIgc2hvdWxkIGJlIHJlbW92ZWQgb25jZSB0ZXN0aW5nIGlzCitjb21wbGV0ZSEKKzwvYmxvY2txdW90ZT4KKzwvcD4KKworPHA+TmV4dCBpbnNlcnQgc29tZSB0ZXN0IGRhdGEgaW50byB0aGUgdGVzdGRhdGEgdGFibGUuCis8c291cmNlPgorbXlzcWwmZ3Q7IGluc2VydCBpbnRvIHRlc3RkYXRhIHZhbHVlcyhudWxsLCAnaGVsbG8nLCAxMjM0NSk7CitRdWVyeSBPSywgMSByb3cgYWZmZWN0ZWQgKDAuMDAgc2VjKQorCitteXNxbD4gc2VsZWN0ICogZnJvbSB0ZXN0ZGF0YTsKKystLS0tKy0tLS0tLS0rLS0tLS0tLSsKK3wgSUQgfCBGT08gICB8IEJBUiAgIHwKKystLS0tKy0tLS0tLS0rLS0tLS0tLSsKK3wgIDEgfCBoZWxsbyB8IDEyMzQ1IHwKKystLS0tKy0tLS0tLS0rLS0tLS0tLSsKKzEgcm93IGluIHNldCAoMC4wMCBzZWMpCisKK215c3FsJmd0OworPC9zb3VyY2U+Cis8L3A+CisKKzxoMz4yLiBzZXJ2ZXIueG1sIGNvbmZpZ3VyYXRpb248L2gzPgorPHA+Q29uZmlndXJlIHRoZSBKTkRJIERhdGFTb3VyY2UgaW4gVG9tY2F0IGJ5IGFkZGluZyBhIGRlY2xhcmF0aW9uIGZvciB5b3VyCityZXNvdXJjZSB0byA8Y29kZT4kQ0FUQUxJTkFfSE9NRS9jb25mL3NlcnZlci54bWw8L2NvZGU+LjwvcD4KKzxwPkFkZCB0aGlzIGluIGJldHdlZW4gdGhlIDxjb2RlPiZsdDsvQ29udGV4dCZndDs8L2NvZGU+IHRhZyBvZiB0aGUgZXhhbXBsZXMKK2NvbnRleHQgYW5kIHRoZSA8Y29kZT4mbHQ7L0hvc3QmZ3Q7PC9jb2RlPiB0YWcgY2xvc2luZyB0aGUgbG9jYWxob3N0IGRlZmluaXRpb24uPHNvdXJjZT4KKyZsdDtDb250ZXh0IHBhdGg9Ii9EQlRlc3QiIGRvY0Jhc2U9IkRCVGVzdCIKKyAgICAgICAgZGVidWc9IjUiIHJlbG9hZGFibGU9InRydWUiIGNyb3NzQ29udGV4dD0idHJ1ZSImZ3Q7CisKKyAgICAmbHQ7IS0tIG1heEFjdGl2ZTogTWF4aW11bSBudW1iZXIgb2YgZEIgY29ubmVjdGlvbnMgaW4gcG9vbC4gTWFrZSBzdXJlIHlvdQorICAgICAgICAgY29uZmlndXJlIHlvdXIgbXlzcWxkIG1heF9jb25uZWN0aW9ucyBsYXJnZSBlbm91Z2ggdG8gaGFuZGxlCisgICAgICAgICBhbGwgb2YgeW91ciBkYiBjb25uZWN0aW9ucy4gU2V0IHRvIDAgZm9yIG5vIGxpbWl0LgorICAgICAgICAgLS0mZ3Q7CisKKyAgICAmbHQ7IS0tIG1heElkbGU6IE1heGltdW0gbnVtYmVyIG9mIGlkbGUgZEIgY29ubmVjdGlvbnMgdG8gcmV0YWluIGluIHBvb2wuCisgICAgICAgICBTZXQgdG8gLTEgZm9yIG5vIGxpbWl0LiAgU2VlIGFsc28gdGhlIERCQ1AgZG9jdW1lbnRhdGlvbiBvbiB0aGlzCisgICAgICAgICBhbmQgdGhlIG1pbkV2aWN0YWJsZUlkbGVUaW1lTWlsbGlzIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyLgorICAgICAgICAgLS0mZ3Q7CisKKyAgICAmbHQ7IS0tIG1heFdhaXQ6IE1heGltdW0gdGltZSB0byB3YWl0IGZvciBhIGRCIGNvbm5lY3Rpb24gdG8gYmVjb21lIGF2YWlsYWJsZQorICAgICAgICAgaW4gbXMsIGluIHRoaXMgZXhhbXBsZSAxMCBzZWNvbmRzLiBBbiBFeGNlcHRpb24gaXMgdGhyb3duIGlmCisgICAgICAgICB0aGlzIHRpbWVvdXQgaXMgZXhjZWVkZWQuICBTZXQgdG8gLTEgdG8gd2FpdCBpbmRlZmluaXRlbHkuCisgICAgICAgICAtLSZndDsKKworICAgICZsdDshLS0gdXNlcm5hbWUgYW5kIHBhc3N3b3JkOiBNeVNRTCBkQiB1c2VybmFtZSBhbmQgcGFzc3dvcmQgZm9yIGRCIGNvbm5lY3Rpb25zICAtLSZndDsKKworICAgICZsdDshLS0gZHJpdmVyQ2xhc3NOYW1lOiBDbGFzcyBuYW1lIGZvciB0aGUgb2xkIG1tLm15c3FsIEpEQkMgZHJpdmVyIGlzCisgICAgICAgICBvcmcuZ2p0Lm1tLm15c3FsLkRyaXZlciAtIHdlIHJlY29tbWVuZCB1c2luZyBDb25uZWN0b3IvSiB0aG91Z2guCisgICAgICAgICBDbGFzcyBuYW1lIGZvciB0aGUgb2ZmaWNpYWwgTXlTUUwgQ29ubmVjdG9yL0ogZHJpdmVyIGlzIGNvbS5teXNxbC5qZGJjLkRyaXZlci4KKyAgICAgICAgIC0tJmd0OworICAgIAorICAgICZsdDshLS0gdXJsOiBUaGUgSkRCQyBjb25uZWN0aW9uIHVybCBmb3IgY29ubmVjdGluZyB0byB5b3VyIE15U1FMIGRCLgorICAgICAgICAgVGhlIGF1dG9SZWNvbm5lY3Q9dHJ1ZSBhcmd1bWVudCB0byB0aGUgdXJsIG1ha2VzIHN1cmUgdGhhdCB0aGUKKyAgICAgICAgIG1tLm15c3FsIEpEQkMgRHJpdmVyIHdpbGwgYXV0b21hdGljYWxseSByZWNvbm5lY3QgaWYgbXlzcWxkIGNsb3NlZCB0aGUKKyAgICAgICAgIGNvbm5lY3Rpb24uICBteXNxbGQgYnkgZGVmYXVsdCBjbG9zZXMgaWRsZSBjb25uZWN0aW9ucyBhZnRlciA4IGhvdXJzLgorICAgICAgICAgLS0mZ3Q7CisKKyAgJmx0O1Jlc291cmNlIG5hbWU9ImpkYmMvVGVzdERCIiBhdXRoPSJDb250YWluZXIiIHR5cGU9ImphdmF4LnNxbC5EYXRhU291cmNlIgorICAgICAgICAgICAgICAgbWF4QWN0aXZlPSIxMDAiIG1heElkbGU9IjMwIiBtYXhXYWl0PSIxMDAwMCIKKyAgICAgICAgICAgICAgIHVzZXJuYW1lPSJqYXZhdXNlciIgcGFzc3dvcmQ9ImphdmFkdWRlIiBkcml2ZXJDbGFzc05hbWU9ImNvbS5teXNxbC5qZGJjLkRyaXZlciIKKyAgICAgICAgICAgICAgIHVybD0iamRiYzpteXNxbDovL2xvY2FsaG9zdDozMzA2L2phdmF0ZXN0P2F1dG9SZWNvbm5lY3Q9dHJ1ZSIvJmd0OworCismbHQ7L0NvbnRleHQmZ3Q7Cis8L3NvdXJjZT4KKzwvcD4KKworPGgzPjMuIHdlYi54bWwgY29uZmlndXJhdGlvbjwvaDM+CisKKzxwPk5vdyBjcmVhdGUgYSA8Y29kZT5XRUItSU5GL3dlYi54bWw8L2NvZGU+IGZvciB0aGlzIHRlc3QgYXBwbGljYXRpb24uCis8c291cmNlPgorJmx0O3dlYi1hcHAgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCisgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUKK2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvd2ViLWFwcF8yXzQueHNkIgorICAgIHZlcnNpb249IjIuNCImZ3Q7CisgICZsdDtkZXNjcmlwdGlvbiZndDtNeVNRTCBUZXN0IEFwcCZsdDsvZGVzY3JpcHRpb24mZ3Q7CisgICZsdDtyZXNvdXJjZS1yZWYmZ3Q7CisgICAgICAmbHQ7ZGVzY3JpcHRpb24mZ3Q7REIgQ29ubmVjdGlvbiZsdDsvZGVzY3JpcHRpb24mZ3Q7CisgICAgICAmbHQ7cmVzLXJlZi1uYW1lJmd0O2pkYmMvVGVzdERCJmx0Oy9yZXMtcmVmLW5hbWUmZ3Q7CisgICAgICAmbHQ7cmVzLXR5cGUmZ3Q7amF2YXguc3FsLkRhdGFTb3VyY2UmbHQ7L3Jlcy10eXBlJmd0OworICAgICAgJmx0O3Jlcy1hdXRoJmd0O0NvbnRhaW5lciZsdDsvcmVzLWF1dGgmZ3Q7CisgICZsdDsvcmVzb3VyY2UtcmVmJmd0OworJmx0Oy93ZWItYXBwJmd0OworPC9zb3VyY2U+Cis8L3A+CisKKzxoMz40LiBUZXN0IGNvZGU8L2gzPgorPHA+Tm93IGNyZWF0ZSBhIHNpbXBsZSA8Y29kZT50ZXN0LmpzcDwvY29kZT4gcGFnZSBmb3IgdXNlIGxhdGVyLgorPHNvdXJjZT4KKyZsdDslQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzcC9qc3RsL3NxbCIgcHJlZml4PSJzcWwiICUmZ3Q7CismbHQ7JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc3AvanN0bC9jb3JlIiBwcmVmaXg9ImMiICUmZ3Q7CisKKyZsdDtzcWw6cXVlcnkgdmFyPSJycyIgZGF0YVNvdXJjZT0iamRiYy9UZXN0REIiJmd0Oworc2VsZWN0IGlkLCBmb28sIGJhciBmcm9tIHRlc3RkYXRhCismbHQ7L3NxbDpxdWVyeSZndDsKKworJmx0O2h0bWwmZ3Q7CisgICZsdDtoZWFkJmd0OworICAgICZsdDt0aXRsZSZndDtEQiBUZXN0Jmx0Oy90aXRsZSZndDsKKyAgJmx0Oy9oZWFkJmd0OworICAmbHQ7Ym9keSZndDsKKworICAmbHQ7aDImZ3Q7UmVzdWx0cyZsdDsvaDImZ3Q7CisgIAorJmx0O2M6Zm9yRWFjaCB2YXI9InJvdyIgaXRlbXM9IiR7cnMucm93c30iJmd0OworICAgIEZvbyAke3Jvdy5mb299Jmx0O2JyLyZndDsKKyAgICBCYXIgJHtyb3cuYmFyfSZsdDtici8mZ3Q7CismbHQ7L2M6Zm9yRWFjaCZndDsKKworICAmbHQ7L2JvZHkmZ3Q7CismbHQ7L2h0bWwmZ3Q7Cis8L3NvdXJjZT4KKzwvcD4KKworPHA+VGhhdCBKU1AgcGFnZSBtYWtlcyB1c2Ugb2YgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9qc3AvanN0bCI+SlNUTDwvYT4ncyBTUUwgYW5kIENvcmUgdGFnbGlicy4gWW91IGNhbiBnZXQgaXQgZnJvbSBTdW4ncyA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3dlYnNlcnZpY2VzL2Rvd25sb2Fkcy93ZWJzZXJ2aWNlc3BhY2suaHRtbCI+SmF2YSBXZWIgU2VydmljZXMgRGV2ZWxvcGVyIFBhY2s8L2E+IG9yIDxhIGhyZWY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvdGFnbGlicy9kb2Mvc3RhbmRhcmQtZG9jL2ludHJvLmh0bWwiPkpha2FydGEgVGFnbGliIFN0YW5kYXJkIDEuMTwvYT4gcHJvamVjdCAtIGp1c3QgbWFrZSBzdXJlIHlvdSBnZXQgYSAxLjEueCByZWxlYXNlLiBPbmNlIHlvdSBoYXZlIEpTVEwsIGNvcHkgPGNvZGU+anN0bC5qYXI8L2NvZGU+IGFuZCA8Y29kZT5zdGFuZGFyZC5qYXI8L2NvZGU+IHRvIHlvdXIgd2ViIGFwcCdzIDxjb2RlPldFQi1JTkYvbGliPC9jb2RlPiBkaXJlY3RvcnkuCisKKzwvcD4KKworPHA+RmluYWxseSBkZXBsb3kgeW91ciB3ZWIgYXBwIGludG8gPGNvZGU+JENBVEFMSU5BX0hPTUUvd2ViYXBwczwvY29kZT4gZWl0aGVyCithcyBhIHdhcmZpbGUgY2FsbGVkIDxjb2RlPkRCVGVzdC53YXI8L2NvZGU+IG9yIGludG8gYSBzdWItZGlyZWN0b3J5IGNhbGxlZAorPGNvZGU+REJUZXN0PC9jb2RlPjwvcD4KKzxwPk9uY2UgZGVwbG95ZWQsIHBvaW50IGEgYnJvd3NlciBhdAorPGNvZGU+aHR0cDovL2xvY2FsaG9zdDo4MDgwL0RCVGVzdC90ZXN0LmpzcDwvY29kZT4gdG8gdmlldyB0aGUgZnJ1aXRzIG9mCit5b3VyIGhhcmQgd29yay48L3A+CisKKzwvc3Vic2VjdGlvbj4KKworPHN1YnNlY3Rpb24gbmFtZT0iT3JhY2xlIDhpIj4KKzxoMz4wLiAgICBJbnRyb2R1Y3Rpb248L2gzPgorPHA+PGk+V2Ugd291bGQgYXBwcmVjaWF0ZSBjb21tZW50cyBvbiB0aGlzIHNlY3Rpb24gYXMgSSdtIG5vdCBhbiBPcmFjbGUgREJBIDotKTwvaT48L3A+Cis8cD5PcmFjbGUgcmVxdWlyZXMgbWluaW1hbCBjaGFuZ2VzIGZyb20gdGhlIE15U1FMIGNvbmZpZ3VyYXRpb24gZXhjZXB0IGZvciB0aGUgdXN1YWwgZ290Y2hhcyA6LSkgRmlyc3RseQorYnkgZGVmYXVsdCwgVG9tY2F0IHdpbGwgb25seSB1c2UgPGNvZGU+Ki5qYXI8L2NvZGU+IGZpbGVzIGluc3RhbGxlZCBpbiA8Y29kZT4kQ0FUQUxJTkFfSE9NRS9jb21tb24vbGliPC9jb2RlPgorIHRoZXJlZm9yZSA8Y29kZT5jbGFzc2VzMTExLnppcDwvY29kZT4gb3IgPGNvZGU+Y2xhc3NlczEyLnppcDwvY29kZT4gd2lsbCBuZWVkIHRvIGJlIHJlbmFtZWQgd2l0aCBhIDxjb2RlPi5qYXI8L2NvZGU+IAorZXh0ZW5zaW9uLiBTaW5jZSBqYXJmaWxlcyBhcmUgemlwZmlsZXMsIHRoZXJlIGlzIG5vIG5lZWQgdG8gdW56aXAgYW5kIGphciB0aGVzZSBmaWxlcyAtIGEgc2ltcGxlIHJlbmFtZSB3aWxsIHN1ZmZpY2UuCitBbHNvLCB5b3Ugc2hvdWxkIGJlIGF3YXJlIHRoYXQgc29tZSAoZWFybHkpIHZlcnNpb25zIG9mIFRvbWNhdCA0LjAgd2hlbiB1c2VkIHdpdGggSkRLIDEuNCB3aWxsIG5vdCBsb2FkIGNsYXNzZXMxMi56aXAgdW5sZXNzCit5b3UgdW56aXAgdGhlIGZpbGUsIHJlbW92ZSB0aGUgPGNvZGU+amF2YXguc3FsLio8L2NvZGU+IGNsYXNzIGhlaXJhcmNoeSBhbmQgcmVqYXIuPC9wPgorPGgzPjEuICAgIHNlcnZlci54bWwgY29uZmlndXJhdGlvbjwvaDM+Cis8cD5JbiBhIHNpbWlsYXIgbWFubmVyIHRvIHRoZSBteXNxbCBjb25maWcgYWJvdmUsIHlvdSB3aWxsIG5lZWQgdG8gZGVmaW5lIHlvdXIgRGF0YXNvdXJjZSBpbiB5b3VyIHNlcnZlci54bWwKK2ZpbGUuIEhlcmUgd2UgZGVmaW5lIGEgRGF0YXNvdXJjZSBjYWxsZWQgbXlvcmFjbGUgdXNpbmcgdGhlIHRoaW4gZHJpdmVyIHRvIGNvbm5lY3QgYXMgdXNlciBzY290dCwgcGFzc3dvcmQgdGlnZXIKK3RvIHRoZSBzY2hlbWEgY2FsbGVkIG15c2NoZW1hIGluIHRoZSBzaWQgY2FsbGVkIG15c2lkLiAoTm90ZTogd2l0aCB0aGUgdGhpbiBkcml2ZXIgdGhpcyBzaWQgaXMgbm90IHRoZSBzYW1lIGFzIHRoZSB0bnNuYW1lKTwvcD4KKworPHA+VXNlIG9mIHRoZSBPQ0kgZHJpdmVyIHNob3VsZCBzaW1wbHkgaW52b2x2ZSBhIGNoYW5naW5nIHRoaW4gdG8gb2NpIGluIHRoZSBVUkwgc3RyaW5nLgorPHNvdXJjZT4KKyZsdDtSZXNvdXJjZSBuYW1lPSJqZGJjL215b3JhY2xlIiBhdXRoPSJDb250YWluZXIiCisgICAgICAgICAgICAgIHR5cGU9ImphdmF4LnNxbC5EYXRhU291cmNlIiBkcml2ZXJDbGFzc05hbWU9Im9yYWNsZS5qZGJjLmRyaXZlci5PcmFjbGVEcml2ZXIiCisgICAgICAgICAgICAgIHVybD0iamRiYzpvcmFjbGU6dGhpbjpteXNjaGVtYUAxMjcuMC4wLjE6MTUyMTpteXNpZCIKKyAgICAgICAgICAgICAgdXNlcm5hbWU9InNjb3R0IiBwYXNzd29yZD0idGlnZXIiIG1heEFjdGl2ZT0iMjAiIG1heElkbGU9IjEwIgorICAgICAgICAgICAgICBtYXhXYWl0PSItMSIvJmd0OyAKKzwvc291cmNlPgorPC9wPgorCis8aDM+Mi4gICAgd2ViLnhtbCBjb25maWd1cmF0aW9uPC9oMz4KKzxwPllvdSBzaG91bGQgZW5zdXJlIHRoYXQgeW91IHJlc3BlY3QgdGhlIGVsZW1lZW50IG9yZGVyaW5nIGRlZmluZWQgYnkgdGhlIERURCB3aGVuIHlvdQorY3JlYXRlIHlvdSBhcHBsaWNhdGlvbnMgd2ViLnhtbCBmaWxlLjwvcD4KKzxzb3VyY2U+CismbHQ7cmVzb3VyY2UtcmVmJmd0OworICZsdDtkZXNjcmlwdGlvbiZndDtPcmFjbGUgRGF0YXNvdXJjZSBleGFtcGxlJmx0Oy9kZXNjcmlwdGlvbiZndDsKKyAmbHQ7cmVzLXJlZi1uYW1lJmd0O2pkYmMvbXlvcmFjbGUmbHQ7L3Jlcy1yZWYtbmFtZSZndDsKKyAmbHQ7cmVzLXR5cGUmZ3Q7amF2YXguc3FsLkRhdGFTb3VyY2UmbHQ7L3Jlcy10eXBlJmd0OworICZsdDtyZXMtYXV0aCZndDtDb250YWluZXImbHQ7L3Jlcy1hdXRoJmd0OworJmx0Oy9yZXNvdXJjZS1yZWYmZ3Q7Cis8L3NvdXJjZT4KKzxoMz4zLiAgIENvZGUgZXhhbXBsZTwvaDM+Cis8cD5Zb3UgY2FuIHVzZSB0aGUgc2FtZSBleGFtcGxlIGFwcGxpY2F0aW9uIGFzIGFib3ZlIChhc3VtaW5nIHlvdSBjcmVhdGUgdGhlIHJlcXVpcmVkIERCCitpbnN0YW5jZSwgdGFibGVzIGV0Yy4pIHJlcGxhY2luZyB0aGUgRGF0YXNvdXJjZSBjb2RlIHdpdGggc29tZXRoaW5nIGxpa2U8L3A+Cis8c291cmNlPgorQ29udGV4dCBpbml0Q29udGV4dCA9IG5ldyBJbml0aWFsQ29udGV4dCgpOworQ29udGV4dCBlbnZDb250ZXh0ICA9IChDb250ZXh0KWluaXRDb250ZXh0Lmxvb2t1cCgiamF2YTovY29tcC9lbnYiKTsKK0RhdGFTb3VyY2UgZHMgPSAoRGF0YVNvdXJjZSllbnZDb250ZXh0Lmxvb2t1cCgiamRiYy9teW9yYWNsZSIpOworQ29ubmVjdGlvbiBjb25uID0gZHMuZ2V0Q29ubmVjdGlvbigpOworLy9ldGMuCis8L3NvdXJjZT4KKzwvc3Vic2VjdGlvbj4KKworCis8c3Vic2VjdGlvbiBuYW1lPSJQb3N0Z3JlU1FMIj4KKzxoMz4wLiAgICBJbnRyb2R1Y3Rpb248L2gzPgorPHA+UG9zdGdyZVNRTCBpcyBjb25maWd1cmVkIGluIGEgc2ltaWxhciBtYW5uZXIgdG8gT3JhY2xlLiBBZ2FpbiwgaGlnaGxpZ2h0aW5nIHRoZSBkaWZmZXJlbmNlcy4KK1RoZXNlIG5vdGVzIGFyZSB1bnRlc3RlZCBhcyB5ZXQgYW5kIHdlIHdvdWxkIGFwcHJlY2lhdGUgZmVlZGJhY2suPC9wPgorPGgzPjEuICAgIHNlcnZlci54bWwgY29uZmlndXJhdGlvbjwvaDM+Cis8c291cmNlPgorJmx0O1Jlc291cmNlIG5hbWU9ImpkYmMvcG9zdGdyZXMiIGF1dGg9IkNvbnRhaW5lciIKKyAgICAgICAgICB0eXBlPSJqYXZheC5zcWwuRGF0YVNvdXJjZSIgZHJpdmVyQ2xhc3NOYW1lPSJvcmcucG9zdGdyZXNxbC5Ecml2ZXIiCisgICAgICAgICAgdXJsPSJqZGJjOnBvc3RncmVzcWw6Ly8xMjcuMC4wLjE6NTQzMi9teWRiIgorICAgICAgICAgIHVzZXJuYW1lPSJteXVzZXIiIHBhc3N3b3JkPSJteXBhc3N3ZCIgbWF4QWN0aXZlPSIyMCIgbWF4SWRsZT0iMTAiIG1heFdhaXQ9Ii0xIi8+IAorPC9zb3VyY2U+Cis8aDM+Mi4gICAgd2ViLnhtbCBjb25maWd1cmF0aW9uPC9oMz4KKzxzb3VyY2U+CismbHQ7cmVzb3VyY2UtcmVmJmd0OworICZsdDtkZXNjcmlwdGlvbiZndDtwb3N0Z3JlU1FMIERhdGFzb3VyY2UgZXhhbXBsZSZsdDsvZGVzY3JpcHRpb24mZ3Q7CisgJmx0O3Jlcy1yZWYtbmFtZSZndDtqZGJjL3Bvc3RncmVzJmx0Oy9yZXMtcmVmLW5hbWUmZ3Q7CisgJmx0O3Jlcy10eXBlJmd0O2phdmF4LnNxbC5EYXRhU291cmNlJmx0Oy9yZXMtdHlwZSZndDsKKyAmbHQ7cmVzLWF1dGgmZ3Q7Q29udGFpbmVyJmx0Oy9yZXMtYXV0aCZndDsKKyZsdDsvcmVzb3VyY2UtcmVmJmd0OworPC9zb3VyY2U+Cis8L3N1YnNlY3Rpb24+Cis8L3NlY3Rpb24+CisKKzxzZWN0aW9uIG5hbWU9Ik5vbiBEQkNQIFNvbHV0aW9ucyI+Cis8cD4KK1RoZXNlIHNvbHV0aW9ucyBlaXRoZXIgdXRpbGlzZSBhIHNpbmdsZSBjb25uZWN0aW9uIHRvIHRoZSBkYXRhYmFzZSAobm90IHJlY29tbWVuZGVkIGZvciBhbnl0aGluZyBvdGhlcgordGhhbiB0ZXN0aW5nISkgb3Igc29tZSBvdGhlciBwb29saW5nIHRlY2hub2xvZ3kuCis8L3A+Cis8L3NlY3Rpb24+CisKKzxzZWN0aW9uIG5hbWU9Ik9yYWNsZSA4aSB3aXRoIE9DSSBjbGllbnQiPgorPHN1YnNlY3Rpb24gbmFtZT0iSW50cm9kdWN0aW9uIj4KKzxwPldoaWxzdCBub3Qgc3RyaWN0bHkgYWRkcmVzc2luZyB0aGUgY3JlYXRpb24gb2YgYSBKTkRJIERhdGFTb3VyY2UgdXNpbmcgdGhlIE9DSSBjbGllbnQsIHRoZXNlIG5vdGVzIGNhbiBiZSBjb21iaW5lZCB3aXRoIHRoZQorT3JhY2xlIGFuZCBEQkNQIHNvbHV0aW9uIGFib3ZlLjwvcD4KKzxwPgorSW4gb3JkZXIgdG8gdXNlIE9DSSBkcml2ZXIsIHlvdSBzaG91bGQgaGF2ZSBhbiBPcmFjbGUgY2xpZW50IGluc3RhbGxlZC4gWW91IHNob3VsZCBoYXZlIGluc3RhbGxlZAorT3JhY2xlOGkoOC4xLjcpIGNsaWVudCBmcm9tIGNkLCAgYW5kIGRvd25sb2FkIHRoZSBzdWl0YWJsZSBKREJDL09DSQorZHJpdmVyKE9yYWNsZThpIDguMS43LjEgSkRCQy9PQ0kgRHJpdmVyKSBmcm9tIDxhIGhyZWY9Imh0dHA6Ly9vdG4ub3JhY2xlLmNvbS8iPm90bi5vcmFjbGUuY29tPC9hPi4gCis8L3A+Cis8cD4KK0FmdGVyIHJlbmFtaW5nIDxjb2RlPmNsYXNzZXMxMi56aXA8L2NvZGU+IGZpbGUgdG8gPGNvZGU+Y2xhc3NlczEyLmphcjwvY29kZT4KK2ZvciBUb21jYXQsIGNvcHkgaXQgaW50byA8Y29kZT4kQ0FUQUxJTkFfSE9NRS9jb21tb24vbGliPC9jb2RlPi4gCitZb3UgbWF5IGFsc28gaGF2ZSB0byByZW1vdmUgdGhlIDxjb2RlPmphdmF4LnNxbC4qPC9jb2RlPiBjbGFzc2VzCitmcm9tIHRoaXMgZmlsZSBkZXBlbmRpbmcgdXBvbiB0aGUgdmVyc2lvbiBvZiBUb21jYXQgYW5kIEpESyB5b3UgYXJlIHVzaW5nLgorPC9wPgorPC9zdWJzZWN0aW9uPgorCis8c3Vic2VjdGlvbiBuYW1lPSJQdXR0aW5nIGl0IGFsbCB0b2dldGhlciI+Cis8cD4KK0Vuc3VyZSB0aGF0IHlvdSBoYXZlIHRoZSA8Y29kZT5vY2lqZGJjOC5kbGw8L2NvZGU+IG9yIDxjb2RlPi5zbzwvY29kZT4gaW4geW91ciA8Y29kZT4kUEFUSDwvY29kZT4gb3IgPGNvZGU+TERfTElCUkFSWV9QQVRIPC9jb2RlPgorIChwb3NzaWJseSBpbiA8Y29kZT4kT1JBSE9NRVxiaW48L2NvZGU+KSBhbmQgYWxzbyBjb25maXJtIHRoYXQgdGhlIG5hdGl2ZSBsaWJyYXJ5IGNhbiBiZSBsb2FkZWQgYnkgYSBzaW1wbGUgdGVzdCBwcm9ncmFtIAordXNpbmcgPGNvZGU+U3lzdGVtLmxvYWRMaWJyYXJ5KCJvY2lqZGJjOCIpOzwvY29kZT4KKzwvcD4KKzxwPgorWW91IHNob3VsZCBuZXh0IGNyZWF0ZSBhIHNpbXBsZSB0ZXN0IHNlcnZsZXQgb3IganNwIHRoYXQgaGFzIHRoZXNlCis8c3Ryb25nPmNyaXRpY2FsIGxpbmVzPC9zdHJvbmc+OgorPC9wPgorPHNvdXJjZT4KK0RyaXZlck1hbmFnZXIucmVnaXN0ZXJEcml2ZXIobmV3CitvcmFjbGUuamRiYy5kcml2ZXIuT3JhY2xlRHJpdmVyKCkpOworY29ubiA9CitEcml2ZXJNYW5hZ2VyLmdldENvbm5lY3Rpb24oImpkYmM6b3JhY2xlOm9jaTg6QGRhdGFiYXNlIiwidXNlcm5hbWUiLCJwYXNzd29yZCIpOworPC9zb3VyY2U+Cis8cD4KK3doZXJlIGRhdGFiYXNlIGlzIG9mIHRoZSBmb3JtIDxjb2RlPmhvc3Q6cG9ydDpTSUQ8L2NvZGU+IE5vdyBpZiB5b3UgdHJ5IHRvIGFjY2VzcyB0aGUgVVJMIG9mIHlvdXIgCit0ZXN0IHNlcnZsZXQvanNwIGFuZCB3aGF0IHlvdSBnZXQgaXMgYSAKKzxjb2RlPlNlcnZsZXRFeGNlcHRpb248L2NvZGU+IHdpdGggYSByb290IGNhdXNlIG9mIDxjb2RlPmphdmEubGFuZy5VbnNhdGlzZmllZExpbmtFcnJvcjpnZXRfZW52X2hhbmRsZTwvY29kZT4uCis8L3A+Cis8cD4KK0ZpcnN0LCB0aGUgPGNvZGU+VW5zYXRpc2ZpZWRMaW5rRXJyb3I8L2NvZGU+IGluZGljYXRlcyB0aGF0IHlvdSBoYXZlIAorPHVsPgorPGxpPmEgbWlzbWF0Y2ggYmV0d2VlbiB5b3VyIEpEQkMgY2xhc3NlcyBmaWxlIGFuZAoreW91ciBPcmFjbGUgY2xpZW50IHZlcnNpb24uIFRoZSBnaXZlYXdheSBoZXJlIGlzIHRoZSBtZXNzYWdlIHN0YXRpbmcgdGhhdCBhIG5lZWRlZCBsaWJyYXJ5IGZpbGUgY2Fubm90IGJlCitmb3VuZC4gRm9yIGV4YW1wbGUsIHlvdSBtYXkgYmUgdXNpbmcgYSBjbGFzc2VzMTIuemlwIGZpbGUgZnJvbSBPcmFjbGUgVmVyc2lvbiA4LjEuNiB3aXRoIGEgVmVyc2lvbiA4LjEuNQorT3JhY2xlIGNsaWVudC4gVGhlIGNsYXNzZVhYWHMuemlwIGZpbGUgYW5kIE9yYWNsZSBjbGllbnQgc29mdHdhcmUgdmVyc2lvbnMgbXVzdCBtYXRjaC4KKzwvbGk+Cis8bGk+QSA8Y29kZT4kUEFUSDwvY29kZT4sIDxjb2RlPkxEX0xJQlJBUllfUEFUSDwvY29kZT4gcHJvYmxlbS48L2xpPgorPGxpPkl0IGhhcyBiZWVuIHJlcG9ydGVkIHRoYXQgaWdub3JpbmcgdGhlIGRyaXZlciB5b3UgaGF2ZSBkb3dubG9kZWQgZnJvbSBvdG4gYW5kIHVzaW5nIAordGhlIGNsYXNzZXMxMi56aXAgZmlsZSBmcm9tIHRoZSBkaXJlY3RvcnkgPGNvZGU+JE9SQUhPTUVcamRiY1xsaWI8L2NvZGU+IHdpbGwgYWxzbyB3b3JrLgorPC9saT4KKzwvdWw+Cis8L3A+Cis8cD4KK05leHQgeW91IG1heSBleHBlcmllbmNlIHRoZSBlcnJvciA8Y29kZT5PUkEtMDY0MDEgTkVUQ01OOiBpbnZhbGlkIGRyaXZlciBkZXNpZ25hdG9yPC9jb2RlPgorPC9wPgorPHA+CitUaGUgT3JhY2xlIGRvY3VtZW50YXRpb24gc2F5cyA6ICJDYXVzZTogVGhlIGxvZ2luIChjb25uZWN0KSBzdHJpbmcgY29udGFpbnMgYW4gaW52YWxpZAorZHJpdmVyIGRlc2lnbmF0b3IuIEFjdGlvbjogQ29ycmVjdCB0aGUgc3RyaW5nIGFuZCByZS1zdWJtaXQuIgorCitDaGFuZ2UgdGhlIGRhdGFiYXNlIGNvbm5lY3Qgc3RyaW5nIChvZiB0aGUgZm9ybSA8Y29kZT5ob3N0OnBvcnQ6U0lEPC9jb2RlPikgd2l0aCB0aGlzIG9uZToKKzxjb2RlPihkZXNjcmlwdGlvbj0oYWRkcmVzcz0oaG9zdD1teWhvc3QpKHByb3RvY29sPXRjcCkocG9ydD0xNTIxKSkoY29ubmVjdF9kYXRhPShzaWQ9b3JjbCkpKTwvY29kZT4KKzwvcD4KKzxwPgorPGk+RWQuIEhtbSwgSSBkb24ndCB0aGluayB0aGlzIGlzIHJlYWxseSBuZWVkZWQgaWYgeW91IHNvcnQgb3V0IHlvdXIgVE5TTmFtZXMgLSBidXQgSSdtIG5vdCBhbiBPcmFjbGUgREJBIDotKTwvaT4KKzwvcD4KKzwvc3Vic2VjdGlvbj4KKzwvc2VjdGlvbj4KKworPHNlY3Rpb24gbmFtZT0iQ29tbW9uIFByb2JsZW1zIj4KKzxwPkhlcmUgYXJlIHNvbWUgY29tbW9uIHByb2JsZW1zIGVuY291bnRlcmVkIHdpdGggYSB3ZWIgYXBwbGljYXRpb24gd2hpY2gKK3VzZXMgYSBkYXRhYmFzZSBhbmQgdGlwcyBmb3IgaG93IHRvIHNvbHZlIHRoZW0uPC9wPgorCis8c3Vic2VjdGlvbiBuYW1lPSJJbnRlcm1pdHRlbnQgZEIgQ29ubmVjdGlvbiBGYWlsdXJlcyI+Cis8cD4KK1RvbWNhdCBydW5zIHdpdGhpbiBhIEpWTS4gIFRoZSBKVk0gcGVyaW9kaWNhbGx5IHBlcmZvcm1zIGdhcmJhZ2UgY29sbGVjdGlvbgorKEdDKSB0byByZW1vdmUgamF2YSBvYmplY3RzIHdoaWNoIGFyZSBubyBsb25nZXIgYmVpbmcgdXNlZC4gIFdoZW4gdGhlIEpWTQorcGVyZm9ybXMgR0MgZXhlY3V0aW9uIG9mIGNvZGUgd2l0aGluIFRvbWNhdCBmcmVlemVzLiBJZiB0aGUgbWF4aW11bSB0aW1lCitjb25maWd1cmVkIGZvciBlc3RhYmxpc2htZW50IG9mIGEgZEIgY29ubmVjdGlvbiBpcyBsZXNzIHRoYW4gdGhlIGFtb3VudAorb2YgdGltZSBnYXJiYWdlIGNvbGxlY3Rpb24gdG9vayB5b3UgY2FuIGdldCBhIGRiIGNvbm5lY2l0b24gZmFpbHVyZS4KKzwvcD4KKworPHA+VG8gY29sbGVjdCBkYXRhIG9uIGhvdyBsb25nIGdhcmJhZ2UgY29sbGVjdGlvbiBpcyB0YWtpbmcgYWRkIHRoZQorPGNvZGU+LXZlcmJvc2U6Z2M8L2NvZGU+IGFyZ3VtZW50IHRvIHlvdXIgPGNvZGU+Q0FUQUxJTkFfT1BUUzwvY29kZT4KK2Vudmlyb25tZW50IHZhcmlhYmxlIHdoZW4gc3RhcnRpbmcgVG9tY2F0LiAgV2hlbiB2ZXJib3NlIGdjIGlzIGVuYWJsZWQKK3lvdXIgPGNvZGU+JENBVEFMSU5BX0JBU0UvbG9ncy9jYXRhbGluYS5vdXQ8L2NvZGU+IGxvZyBmaWxlIHdpbGwgaW5jbHVkZQorZGF0YSBmb3IgZXZlcnkgZ2FyYmFnZSBjb2xsZWN0aW9uIGluY2x1ZGluZyBob3cgbG9uZyBpdCB0b29rLjwvcD4KKworPHA+V2hlbiB5b3VyIEpWTSBpcyB0dW5lZCBjb3JyZWN0bHkgOTklIG9mIHRoZSB0aW1lIGEgR0Mgd2lsbCB0YWtlIGxlc3MKK3RoYW4gb25lIHNlY29uZC4gIFRoZSByZW1haW5kZXIgd2lsbCBvbmx5IHRha2UgYSBmZXcgc2Vjb25kcy4gIFJhcmVseSwKK2lmIGV2ZXIgc2hvdWxkIGEgR0MgdGFrZSBtb3JlIHRoYW4gMTAgc2Vjb25kcy48L3A+CisKKzxwPk1ha2Ugc3VyZSB0aGF0IHRoZSBkYiBjb25uZWN0aW9uIHRpbWVvdXQgaXMgc2V0IHRvIDEwLTE1IHNlY29uZHMuCitGb3IgdGhlIERCQ1AgeW91IHNldCB0aGlzIHVzaW5nIHRoZSBwYXJhbWV0ZXIgPGNvZGU+bWF4V2FpdDwvY29kZT4uPC9wPgorCis8L3N1YnNlY3Rpb24+CisKKzxzdWJzZWN0aW9uIG5hbWU9IlJhbmRvbSBDb25uZWN0aW9uIENsb3NlZCBFeGNlcHRpb25zIj4KKzxwPgorVGhlc2UgY2FuIG9jY3VyIHdoZW4gb25lIHJlcXVlc3QgZ2V0cyBhIGRiIGNvbm5lY3Rpb24gZnJvbSB0aGUgY29ubmVjdGlvbgorcG9vbCBhbmQgY2xvc2VzIGl0IHR3aWNlLiAgV2hlbiB1c2luZyBhIGNvbm5lY3Rpb24gcG9vbCwgY2xvc2luZyB0aGUKK2Nvbm5lY3Rpb24ganVzdCByZXR1cm5zIGl0IHRvIHRoZSBwb29sIGZvciByZXVzZSBieSBhbm90aGVyIHJlcXVlc3QsCitpdCBkb2Vzbid0IGNsb3NlIHRoZSBjb25uZWN0aW9uLiAgQW5kIFRvbWNhdCB1c2VzIG11bHRpcGxlIHRocmVhZHMgdG8KK2hhbmRsZSBjb25jdXJyZW50IHJlcXVlc3RzLiBIZXJlIGlzIGFuIGV4YW1wbGUgb2YgdGhlIHNlcXVlbmNlCitvZiBldmVudHMgd2hpY2ggY291bGQgY2F1c2UgdGhpcyBlcnJvciBpbiBUb21jYXQ6Cis8cHJlPgorICBSZXF1ZXN0IDEgcnVubmluZyBpbiBUaHJlYWQgMSBnZXRzIGEgZGIgY29ubmVjdGlvbi4KKworICBSZXF1ZXN0IDEgY2xvc2VzIHRoZSBkYiBjb25uZWN0aW9uLgorCisgIFRoZSBKVk0gc3dpdGNoZXMgdGhlIHJ1bm5pbmcgdGhyZWFkIHRvIFRocmVhZCAyCisKKyAgUmVxdWVzdCAyIHJ1bm5pbmcgaW4gVGhyZWFkIDIgZ2V0cyBhIGRiIGNvbm5lY3Rpb24KKyAgKHRoZSBzYW1lIGRiIGNvbm5lY3Rpb24ganVzdCBjbG9zZWQgYnkgUmVxdWVzdCAxKS4KKworICBUaGUgSlZNIHN3aXRjaGVzIHRoZSBydW5uaW5nIHRocmVhZCBiYWNrIHRvIFRocmVhZCAxCisKKyAgUmVxdWVzdCAxIGNsb3NlcyB0aGUgZGIgY29ubmVjdGlvbiBhIHNlY29uZCB0aW1lIGluIGEgZmluYWxseSBibG9jay4KKworICBUaGUgSlZNIHN3aXRjaGVzIHRoZSBydW5uaW5nIHRocmVhZCBiYWNrIHRvIFRocmVhZCAyCisKKyAgUmVxdWVzdCAyIFRocmVhZCAyIHRyaWVzIHRvIHVzZSB0aGUgZGIgY29ubmVjdGlvbiBidXQgZmFpbHMKKyAgYmVjYXVzZSBSZXF1ZXN0IDEgY2xvc2VkIGl0LgorPC9wcmU+CitIZXJlIGlzIGFuIGV4YW1wbGUgb2YgcHJvcGVybHkgd3JpdHRlbiBjb2RlIHRvIHVzZSBhIGRiIGNvbm5lY3Rpb24KK29idGFpbmVkIGZyb20gYSBjb25uZWN0aW9uIHBvb2w6Cis8cHJlPgorICBDb25uZWN0aW9uIGNvbm4gPSBudWxsOworICBTdGF0ZW1lbnQgc3RtdCA9IG51bGw7ICAvLyBPciBQcmVwYXJlZFN0YXRlbWVudCBpZiBuZWVkZWQKKyAgUmVzdWx0U2V0IHJzID0gbnVsbDsKKyAgdHJ5IHsKKyAgICBjb25uID0gLi4uIGdldCBjb25uZWN0aW9uIGZyb20gY29ubmVjdGlvbiBwb29sIC4uLgorICAgIHN0bXQgPSBjb25uLmNyZWF0ZVN0YXRlbWVudCgic2VsZWN0IC4uLiIpOworICAgIHJzID0gc3RtdC5leGVjdXRlUXVlcnkoKTsKKyAgICAuLi4gaXRlcmF0ZSB0aHJvdWdoIHRoZSByZXN1bHQgc2V0IC4uLgorICAgIHJzLmNsb3NlKCk7CisgICAgcnMgPSBudWxsOworICAgIHN0bXQuY2xvc2UoKTsKKyAgICBzdG10ID0gbnVsbDsKKyAgICBjb25uLmNsb3NlKCk7IC8vIFJldHVybiB0byBjb25uZWN0aW9uIHBvb2wKKyAgICBjb25uID0gbnVsbDsgIC8vIE1ha2Ugc3VyZSB3ZSBkb24ndCBjbG9zZSBpdCB0d2ljZQorICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZSkgeworICAgIC4uLiBkZWFsIHdpdGggZXJyb3JzIC4uLgorICB9IGZpbmFsbHkgeworICAgIC8vIEFsd2F5cyBtYWtlIHN1cmUgcmVzdWx0IHNldHMgYW5kIHN0YXRlbWVudHMgYXJlIGNsb3NlZCwKKyAgICAvLyBhbmQgdGhlIGNvbm5lY3Rpb24gaXMgcmV0dXJuZWQgdG8gdGhlIHBvb2wKKyAgICBpZiAocnMgIT0gbnVsbCkgeworICAgICAgdHJ5IHsgcnMuY2xvc2UoKTsgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGUpIHsgOyB9CisgICAgICBycyA9IG51bGw7CisgICAgfQorICAgIGlmIChzdG10ICE9IG51bGwpIHsKKyAgICAgIHRyeSB7IHN0bXQuY2xvc2UoKTsgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGUpIHsgOyB9CisgICAgICBzdG10ID0gbnVsbDsKKyAgICB9CisgICAgaWYgKGNvbm4gIT0gbnVsbCkgeworICAgICAgdHJ5IHsgY29ubi5jbG9zZSgpOyB9IGNhdGNoIChTUUxFeGNlcHRpb24gZSkgeyA7IH0KKyAgICAgIGNvbm4gPSBudWxsOworICAgIH0KKyAgfQorPC9wcmU+Cis8L3A+CisKKzwvc3Vic2VjdGlvbj4KKworPHN1YnNlY3Rpb24gbmFtZT0iQ29udGV4dCB2ZXJzdXMgR2xvYmFsTmFtaW5nUmVzb3VyY2VzIj4KKzxwPgorICBQbGVhc2Ugbm90ZSB0aGF0IGFsdGhvdWdoIHRoZSBhYm92ZSBpbnN0cnVjdGlvbnMgcGxhY2UgdGhlIEpOREkgZGVjbGFyYXRpb25zIGluIGEgQ29udGV4dAorICBlbGVtZW50LCBpdCBpcyBwb3NzaWJsZSBhbmQgc29tZXRpbWVzIGRlc2lyYWJsZSB0byBwbGFjZSB0aGVzZSBkZWNsYXJhdGlvbnMgaW4gdGhlIAorICA8YSBocmVmPSJjb25maWcvZ2xvYmFscmVzb3VyY2VzLmh0bWwiPkdsb2JhbE5hbWluZ1Jlc291cmNlczwvYT4gc2VjdGlvbiBvZiB0aGUgc2VydmVyCisgIGNvbmZpZ3VyYXRpb24gZmlsZS4gIEEgcmVzb3VyY2UgcGxhY2VkIGluIHRoZSBHbG9iYWxOYW1pbmdSZXNvdXJjZXMgc2VjdGlvbiB3aWxsIGJlIHNoYXJlZAorICBhbW9uZyB0aGUgQ29udGV4dHMgb2YgdGhlIHNlcnZlci4KKzwvcD4KKzwvc3Vic2VjdGlvbj4KKworPHN1YnNlY3Rpb24gbmFtZT0iSk5ESSBSZXNvdXJjZSBOYW1pbmcgYW5kIFJlYWxtIEludGVyYWN0aW9uIj4KKzxwPgorICBJbiBvcmRlciB0byBnZXQgUmVhbG1zIHRvIHdvcmssIHRoZSByZWFsbSBtdXN0IHJlZmVyIHRvIHRoZSBkYXRhc291cmNlIGFzCisgIGRlZmluZWQgaW4gdGhlICZsdDtHbG9iYWxOYW1pbmdSZXNvdXJjZXMmZ3Q7IG9yICZsdDtDb250ZXh0Jmd0OyBzZWN0aW9uLCBub3QgYSBkYXRhc291cmNlIGFzIHJlbmFtZWQKKyAgdXNpbmcgJmx0O1Jlc291cmNlTGluayZndDsuCis8L3A+Cis8L3N1YnNlY3Rpb24+IAorCis8L3NlY3Rpb24+CisKKzwvYm9keT4KKzwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9kb2NzL2puZGktcmVzb3VyY2VzLWhvd3RvLnhtbCBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3Mvam5kaS1yZXNvdXJjZXMtaG93dG8ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkOTFhYmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL2puZGktcmVzb3VyY2VzLWhvd3RvLnhtbApAQCAtMCwwICsxLDc0NSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IURPQ1RZUEUgZG9jdW1lbnQgWworICA8IUVOVElUWSBwcm9qZWN0IFNZU1RFTSAicHJvamVjdC54bWwiPgorXT4KKzxkb2N1bWVudCB1cmw9ImpuZGktcmVzb3VyY2VzLWhvd3RvLmh0bWwiPgorCisgICAgJnByb2plY3Q7CisKKyAgICA8cHJvcGVydGllcz4KKyAgICAgIDxhdXRob3IgZW1haWw9ImNyYWlnbWNjQGFwYWNoZS5vcmciPkNyYWlnIFIuIE1jQ2xhbmFoYW48L2F1dGhvcj4KKyAgICAgIDxhdXRob3IgZW1haWw9InlvYXZzQGFwYWNoZS5vcmciPllvYXYgU2hhcGlyYTwvYXV0aG9yPgorICAgICAgPHRpdGxlPkpOREkgUmVzb3VyY2VzIEhPVy1UTzwvdGl0bGU+CisgICAgPC9wcm9wZXJ0aWVzPgorCis8Ym9keT4KKworCis8c2VjdGlvbiBuYW1lPSJJbnRyb2R1Y3Rpb24iPgorCis8cD5Ub21jYXQgNSBwcm92aWRlcyBhIEpOREkgPHN0cm9uZz5Jbml0aWFsQ29udGV4dDwvc3Ryb25nPiBpbXBsZW1lbnRhdGlvbgoraW5zdGFuY2UgZm9yIGVhY2ggd2ViIGFwcGxpY2F0aW9uIHJ1bm5pbmcgdW5kZXIgaXQsIGluIGEgbWFubmVyIHRoYXQgaXMgCitjb21wYXRpYmxlIHdpdGggdGhvc2UgcHJvdmlkZWQgYnkgYSAKKzxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJlZSI+SmF2YTIgRW50ZXJwcmlzZSBFZGl0aW9uPC9hPiBhcHBsaWNhdGlvbiAKK3NlcnZlci4gCisKK1RoZSBKMkVFIHN0YW5kYXJkIHByb3ZpZGVzIGEgc3RhbmRhcmQgc2V0IG9mIGVsZW1lbnRzIGluIAordGhlIDxjb2RlPi9XRUItSU5GL3dlYi54bWw8L2NvZGU+IGZpbGUgdG8gcmVmZXJlbmNlIHJlc291cmNlczsgcmVzb3VyY2VzIAorcmVmZXJlbmNlZCBpbiB0aGVzZSBlbGVtZW50cyBtdXN0IGJlIGRlZmluZWQgaW4gYW4gYXBwbGljYXRpb24tc2VydmVyLXNwZWNpZmljIGNvbmZpZ3VyYXRpb24uIAorPC9wPgorCis8cD5Gb3IgVG9tY2F0IDUsIHRoZXNlIGVudHJpZXMgaW4gcGVyLXdlYi1hcHBsaWNhdGlvbiAKKzxjb2RlPkluaXRpYWxDb250ZXh0PC9jb2RlPiBhcmUgY29uZmlndXJlZCBpbiB0aGUgCis8Y29kZT48c3Ryb25nPiZsdDtDb250ZXh0Jmd0Ozwvc3Ryb25nPjwvY29kZT4gZWxlbWVudHMgdGhhdCBjYW4gYmUgc3BlY2lmaWVkIAoraW4gZWl0aGVyIDxjb2RlPiRDQVRBTElOQV9IT01FL2NvbmYvc2VydmVyLnhtbDwvY29kZT4gb3IsIHByZWZlcmFibHksIAordGhlIHBlci13ZWItYXBwbGljYXRpb24gY29udGV4dCBYTUwgZmlsZSAoZWl0aGVyIDxjb2RlPk1FVEEtSU5GL2NvbnRleHQueG1sPC9jb2RlPikuCis8L3A+CisKKzxwPlRvbWNhdCA1IG1haW50YWlucyBhIHNlcGFyYXRlIG5hbWVzcGFjZSBvZiBnbG9iYWwgcmVzb3VyY2VzIGZvciB0aGUgCitlbnRpcmUgc2VydmVyLiAgVGhlc2UgYXJlIGNvbmZpZ3VyZWQgaW4gdGhlIAorPGEgaHJlZj0iY29uZmlnL2dsb2JhbHJlc291cmNlcy5odG1sIj4KKzxjb2RlPjxzdHJvbmc+Jmx0O0dsb2JhbE5hbWVpbmdSZXNvdXJjZXMmZ3Q7PC9zdHJvbmc+PC9jb2RlPjwvYT4gZWxlbWVudCBvZiAKKzxjb2RlPiRDQVRBTElOQV9IT01FL2NvbmYvc2VydmVyLnhtbDwvY29kZT4uIFlvdSBtYXkgZXhwb3NlIHRoZXNlIHJlc291cmNlcyB0byAKK3dlYiBhcHBsaWNhdGlvbnMgYnkgdXNpbmcgCis8Y29kZT48c3Ryb25nPiZsdDtSZXNvdXJjZUxpbmsmZ3Q7PC9zdHJvbmc+PC9jb2RlPiBlbGVtZW50cy4KKzwvcD4KKworPHA+VGhlIHJlc291cmNlcyBkZWZpbmVkIGluIHRoZXNlIGVsZW1lbnRzCittYXkgYmUgcmVmZXJlbmNlZCBieSB0aGUgZm9sbG93aW5nIGVsZW1lbnRzIGluIHRoZSB3ZWIgYXBwbGljYXRpb24gZGVwbG95bWVudAorZGVzY3JpcHRvciAoPGNvZGU+L1dFQi1JTkYvd2ViLnhtbDwvY29kZT4pIG9mIHlvdXIgd2ViIGFwcGxpY2F0aW9uOjwvcD4KKzx1bD4KKzxsaT48Y29kZT48c3Ryb25nPiZsdDtlbnYtZW50cnkmZ3Q7PC9zdHJvbmc+PC9jb2RlPiAtIEVudmlyb25tZW50IGVudHJ5LCBhCisgICAgc2luZ2xlLXZhbHVlIHBhcmFtZXRlciB0aGF0IGNhbiBiZSB1c2VkIHRvIGNvbmZpZ3VyZSBob3cgdGhlIGFwcGxpY2F0aW9uCisgICAgd2lsbCBvcGVyYXRlLjwvbGk+Cis8bGk+PGNvZGU+PHN0cm9uZz4mbHQ7cmVzb3VyY2UtcmVmJmd0Ozwvc3Ryb25nPjwvY29kZT4gLSBSZXNvdXJjZSByZWZlcmVuY2UsCisgICAgd2hpY2ggaXMgdHlwaWNhbGx5IHRvIGFuIG9iamVjdCBmYWN0b3J5IGZvciByZXNvdXJjZXMgc3VjaCBhcyBhIEpEQkMKKyAgICA8Y29kZT5EYXRhU291cmNlPC9jb2RlPiwgYSBKYXZhTWFpbCA8Y29kZT5TZXNzaW9uPC9jb2RlPiwgb3IgY3VzdG9tCisgICAgb2JqZWN0IGZhY3RvcmllcyBjb25maWd1cmVkIGludG8gVG9tY2F0IDUuPC9saT4KKzxsaT48Y29kZT48c3Ryb25nPiZsdDtyZXNvdXJjZS1lbnYtcmVmJmd0Ozwvc3Ryb25nPjwvY29kZT4gLSBSZXNvdXJjZQorICAgIGVudmlyb25tZW50IHJlZmVyZW5jZSwgYSBuZXcgdmFyaWF0aW9uIG9mIDxjb2RlPnJlc291cmNlLXJlZjwvY29kZT4KKyAgICBhZGRlZCBpbiBTZXJ2bGV0IDIuNCB0aGF0IGlzIHNpbXBsZXIgdG8gY29uZmlndXJlIGZvciByZXNvdXJjZXMKKyAgICB0aGF0IGRvIG5vdCByZXF1aXJlIGF1dGhlbnRpY2F0aW9uIGluZm9ybWF0aW9uLjwvbGk+Cis8L3VsPgorCis8cD5UaGUgPGNvZGU+SW5pdGlhbENvbnRleHQ8L2NvZGU+IGlzIGNvbmZpZ3VyZWQgYXMgYSB3ZWIgYXBwbGljYXRpb24gaXMKK2luaXRpYWxseSBkZXBsb3llZCwgYW5kIGlzIG1hZGUgYXZhaWxhYmxlIHRvIHdlYiBhcHBsaWNhdGlvbiBjb21wb25lbnRzIChmb3IKK3JlYWQtb25seSBhY2Nlc3MpLiAgQWxsIGNvbmZpZ3VyZWQgZW50cmllcyBhbmQgcmVzb3VyY2VzIGFyZSBwbGFjZWQgaW4KK3RoZSA8Y29kZT5qYXZhOmNvbXAvZW52PC9jb2RlPiBwb3J0aW9uIG9mIHRoZSBKTkRJIG5hbWVzcGFjZSwgc28gYSB0eXBpY2FsCithY2Nlc3MgdG8gYSByZXNvdXJjZSAtIGluIHRoaXMgY2FzZSwgdG8gYSBKREJDIDxjb2RlPkRhdGFTb3VyY2U8L2NvZGU+IC0KK3dvdWxkIGxvb2sgc29tZXRoaW5nIGxpa2UgdGhpczo8L3A+CisKKzxzb3VyY2U+CisvLyBPYnRhaW4gb3VyIGVudmlyb25tZW50IG5hbWluZyBjb250ZXh0CitDb250ZXh0IGluaXRDdHggPSBuZXcgSW5pdGlhbENvbnRleHQoKTsKK0NvbnRleHQgZW52Q3R4ID0gKENvbnRleHQpIGluaXRDdHgubG9va3VwKCJqYXZhOmNvbXAvZW52Iik7CisKKy8vIExvb2sgdXAgb3VyIGRhdGEgc291cmNlCitEYXRhU291cmNlIGRzID0gKERhdGFTb3VyY2UpCisgIGVudkN0eC5sb29rdXAoImpkYmMvRW1wbG95ZWVEQiIpOworCisvLyBBbGxvY2F0ZSBhbmQgdXNlIGEgY29ubmVjdGlvbiBmcm9tIHRoZSBwb29sCitDb25uZWN0aW9uIGNvbm4gPSBkcy5nZXRDb25uZWN0aW9uKCk7CisuLi4gdXNlIHRoaXMgY29ubmVjdGlvbiB0byBhY2Nlc3MgdGhlIGRhdGFiYXNlIC4uLgorY29ubi5jbG9zZSgpOworPC9zb3VyY2U+CisKKzxwPlNlZSB0aGUgZm9sbG93aW5nIFNwZWNpZmljYXRpb25zIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHByb2dyYW1taW5nIEFQSXMKK2ZvciBKTkRJLCBhbmQgZm9yIHRoZSBmZWF0dXJlcyBzdXBwb3J0ZWQgYnkgSmF2YTIgRW50ZXJwcmlzZSBFZGl0aW9uIChKMkVFKQorc2VydmVycywgd2hpY2ggVG9tY2F0IGVtdWxhdGVzIGZvciB0aGUgc2VydmljZXMgdGhhdCBpdCBwcm92aWRlczo8L3A+Cis8dWw+Cis8bGk+PGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9qbmRpLyNkb3dubG9hZCI+SmF2YSBOYW1pbmcgYW5kCisgICAgRGlyZWN0b3J5IEludGVyZmFjZTwvYT4gKGluY2x1ZGVkIGluIEpESyAxLjQsIGF2YWlsYWJsZSBzZXBhcmF0ZWx5IGZvcgorICAgIHByaW9yIEpESyB2ZXJzaW9ucyk8L2xpPgorPGxpPjxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJlZS9kb3dubG9hZC5odG1sIj5KMkVFIFBsYXRmb3JtCisgICAgU3BlY2lmaWNhdGlvbjwvYT4gKGluIHBhcnRpY3VsYXIsIHNlZSBDaGFwdGVyIDUgb24gPGVtPk5hbWluZzwvZW0+KTwvbGk+Cis8L3VsPgorCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iQ29uZmlndXJpbmcgSk5ESSBSZXNvdXJjZXMiPgorCis8cD5FYWNoIGF2YWlsYWJsZSBKTkRJIFJlc291cmNlIGlzIGNvbmZpZ3VyZWQgYmFzZWQgb24gaW5jbHVzaW9uIG9mIHRoZQorZm9sbG93aW5nIGVsZW1lbnRzIGluIHRoZSA8Y29kZT48c3Ryb25nPiZsdDtDb250ZXh0Jmd0Ozwvc3Ryb25nPjwvY29kZT4gb3IgCis8Y29kZT48c3Ryb25nPiZsdDtEZWZhdWx0Q29udGV4dCZndDs8L3N0cm9uZz48L2NvZGU+IGVsZW1lbnRzOjwvcD4KKworPHVsPgorPGxpPjxhIGhyZWY9ImNvbmZpZy9jb250ZXh0Lmh0bWwjRW52aXJvbm1lbnQgRW50cmllcyI+Jmx0O0Vudmlyb25tZW50Jmd0OzwvYT4gLQorICAgIENvbmZpZ3VyZSBuYW1lcyBhbmQgdmFsdWVzIGZvciBzY2FsYXIgZW52aXJvbm1lbnQgZW50cmllcyB0aGF0IHdpbGwgYmUKKyAgICBleHBvc2VkIHRvIHRoZSB3ZWIgYXBwbGljYXRpb24gdGhyb3VnaCB0aGUgSk5ESQorICAgIDxjb2RlPkluaXRpYWxDb250ZXh0PC9jb2RlPiAoZXF1aXZhbGVudCB0byB0aGUgaW5jbHVzaW9uIG9mIGFuCisgICAgPGNvZGU+Jmx0O2Vudi1lbnRyeSZndDs8L2NvZGU+IGVsZW1lbnQgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbgorICAgIGRlcGxveW1lbnQgZGVzY3JpcHRvcikuPC9saT4KKzxsaT48YSBocmVmPSJjb25maWcvY29udGV4dC5odG1sI1Jlc291cmNlIERlZmluaXRpb25zIj4mbHQ7UmVzb3VyY2UmZ3Q7PC9hPiAtCisgICAgQ29uZmlndXJlIHRoZSBuYW1lIGFuZCBkYXRhIHR5cGUgb2YgYSByZXNvdXJjZSBtYWRlIGF2YWlsYWJsZSB0byB0aGUKKyAgICBhcHBsaWNhdGlvbiAoZXF1aXZhbGVudCB0byB0aGUgaW5jbHVzaW9uIG9mIGEKKyAgICA8Y29kZT4mbHQ7cmVzb3VyY2UtcmVmJmd0OzwvY29kZT4gZWxlbWVudCBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uCisgICAgZGVwbG95bWVudCBkZXNjcmlwdG9yKS48L2xpPgorPGxpPjxhIGhyZWY9ImNvbmZpZy9jb250ZXh0Lmh0bWwjUmVzb3VyY2UgTGlua3MiPiZsdDtSZXNvdXJjZUxpbmsmZ3Q7PC9hPiAtCisgICAgQWRkIGEgbGluayB0byBhIHJlc291cmNlIGRlZmluZWQgaW4gdGhlIGdsb2JhbCBKTkRJIGNvbnRleHQuIFVzZSByZXNvdXJjZSAKKyAgICBsaW5rcyB0byBnaXZlIGEgd2ViIGFwcGxpY2F0aW9uIGFjY2VzcyB0byBhIHJlc291cmNlIGRlZmluZWQgaW4gCisgICAgdGhlPGEgaHJlZj0iY29uZmlnL2dsb2JhbHJlc291cmNlcy5odG1sIj4mbHQ7R2xvYmFsTmFtaW5nUmVzb3VyY2VzJmd0OzwvYT4KKyAgICBjaGlsZCBlbGVtZW50IG9mIHRoZSA8YSBocmVmPSJjb25maWcvc2VydmVyLmh0bWwiPiZsdDtTZXJ2ZXImZ3Q7PC9hPgorICAgIGVsZW1lbnQuPC9saT4KKworPC91bD4KKworPHA+QW55IG51bWJlciBvZiB0aGVzZSBlbGVtZW50cyBtYXkgYmUgbmVzdGVkIGluc2lkZSBhCis8YSBocmVmPSJjb25maWcvY29udGV4dC5odG1sIj4mbHQ7Q29udGV4dCZndDs8L2E+IGVsZW1lbnQgKHRvIGJlIGFzc29jaWF0ZWQKK29ubHkgd2l0aCB0aGF0IHBhcnRpY3VsYXIgd2ViIGFwcGxpY2F0aW9uKS48L3A+CisKKzxwPkluIGFkZGl0aW9uLCB0aGUgbmFtZXMgYW5kIHZhbHVlcyBvZiBhbGwgPGNvZGU+Jmx0O2Vudi1lbnRyeSZndDs8L2NvZGU+CitlbGVtZW50cyBpbmNsdWRlZCBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQgZGVzY3JpcHRvcgorKDxjb2RlPi9XRUItSU5GL3dlYi54bWw8L2NvZGU+KSBhcmUgY29uZmlndXJlZCBpbnRvIHRoZSBpbml0aWFsIGNvbnRleHQgYXMKK3dlbGwsIG92ZXJyaWRpbmcgY29ycmVzcG9uZGluZyB2YWx1ZXMgZnJvbSA8Y29kZT5jb25mL3NlcnZlci54bWw8L2NvZGU+Cis8c3Ryb25nPm9ubHk8L3N0cm9uZz4gaWYgYWxsb3dlZCBieSB0aGUgY29ycmVzcG9uZGluZworPGNvZGU+Jmx0O0Vudmlyb25tZW50Jmd0OzwvY29kZT4gZWxlbWVudCAoYnkgc2V0dGluZyB0aGUKKzxjb2RlPm92ZXJyaWRlPC9jb2RlPiBhdHRyaWJ1dGUgdG8gInRydWUiKS48L3A+CisKKzxwPkdsb2JhbCByZXNvdXJjZXMgY2FuIGJlIGRlZmluZWQgaW4gdGhlIHNlcnZlci13aWRlIEpOREkgY29udGV4dCwgYnkgYWRkaW5nCit0aGUgcmVzb3VyY2UgZWxlbWVudHMgZGVzY3JpYmVkIGFib3ZlIHRvIHRoZQorPGEgaHJlZj0iY29uZmlnL2dsb2JhbHJlc291cmNlcy5odG1sIj4mbHQ7R2xvYmFsTmFtaW5nUmVzb3VyY2VzJmd0OzwvYT4KK2NoaWxkIGVsZW1lbnQgb2YgdGhlIDxhIGhyZWY9ImNvbmZpZy9zZXJ2ZXIuaHRtbCI+Jmx0O1NlcnZlciZndDs8L2E+CitlbGVtZW50IGFuZCB1c2luZyBhIAorPGEgaHJlZj0iY29uZmlnL2NvbnRleHQuaHRtbCNSZXNvdXJjZSBMaW5rcyI+Jmx0O1Jlc291cmNlTGluayZndDs8L2E+IHRvCitpbmNsdWRlIGl0IGluIHRoZSBwZXItd2ViLWFwcGxpY2F0aW9uIGNvbnRleHQuPC9wPgorCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iVG9tY2F0IFN0YW5kYXJkIFJlc291cmNlIEZhY3RvcmllcyI+CisKKyAgPHA+VG9tY2F0IDUgaW5jbHVkZXMgYSBzZXJpZXMgb2Ygc3RhbmRhcmQgcmVzb3VyY2UgZmFjdG9yaWVzIHRoYXQgY2FuCisgIHByb3ZpZGUgc2VydmljZXMgdG8geW91ciB3ZWIgYXBwbGljYXRpb25zLCBidXQgZ2l2ZSB5b3UgY29uZmlndXJhdGlvbgorICBmbGV4aWJpbGl0eSAoaW4gPGNvZGU+JENBVEFMSU5BX0hPTUUvY29uZi9zZXJ2ZXIueG1sPC9jb2RlPikgd2l0aG91dAorICBtb2RpZnlpbmcgdGhlIHdlYiBhcHBsaWNhdGlvbiBvciB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLiAgRWFjaAorICBzdWJzZWN0aW9uIGJlbG93IGRldGFpbHMgdGhlIGNvbmZpZ3VyYXRpb24gYW5kIHVzYWdlIG9mIHRoZSBzdGFuZGFyZAorICByZXNvdXJjZSBmYWN0b3JpZXMuPC9wPgorCisgIDxwPlNlZSA8YSBocmVmPSIjQWRkaW5nIEN1c3RvbSBSZXNvdXJjZSBGYWN0b3JpZXMiPkFkZGluZyBDdXN0b20KKyAgUmVzb3VyY2UgRmFjdG9yaWVzPC9hPiBmb3IgaW5mb3JtYXRpb24gYWJvdXQgaG93IHRvIGNyZWF0ZSwgaW5zdGFsbCwKKyAgY29uZmlndXJlLCBhbmQgdXNlIHlvdXIgb3duIGN1c3RvbSByZXNvdXJjZSBmYWN0b3J5IGNsYXNzZXMgd2l0aAorICBUb21jYXQgNS48L3A+CisKKyAgPHA+PGVtPk5PVEU8L2VtPiAtIE9mIHRoZSBzdGFuZGFyZCByZXNvdXJjZSBmYWN0b3JpZXMsIG9ubHkgdGhlCisgICJKREJDIERhdGEgU291cmNlIiBhbmQgIlVzZXIgVHJhbnNhY3Rpb24iIGZhY3RvcmllcyBhcmUgbWFuZGF0ZWQgdG8KKyAgYmUgYXZhaWxhYmxlIG9uIG90aGVyIHBsYXRmb3JtcywgYW5kIHRoZW4gdGhleSBhcmUgcmVxdWlyZWQgb25seSBpZgorICB0aGUgcGxhdGZvcm0gaW1wbGVtZW50cyB0aGUgSmF2YTIgRW50ZXJwcmlzZSBFZGl0aW9uIChKMkVFKSBzcGVjcy4KKyAgQWxsIG90aGVyIHN0YW5kYXJkIHJlc291cmNlIGZhY3RvcmllcywgcGx1cyBjdXN0b20gcmVzb3VyY2UgZmFjdG9yaWVzCisgIHRoYXQgeW91IHdyaXRlIHlvdXJzZWxmLCBhcmUgc3BlY2lmaWMgdG8gVG9tY2F0IGFuZCBjYW5ub3QgYmUgYXNzdW1lZAorICB0byBiZSBhdmFpbGFibGUgb24gb3RoZXIgY29udGFpbmVycy48L3A+CisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iR2VuZXJpYyBKYXZhQmVhbiBSZXNvdXJjZXMiPgorCisgICAgPGgzPjAuICBJbnRyb2R1Y3Rpb248L2gzPgorCisgICAgPHA+VGhpcyByZXNvdXJjZSBmYWN0b3J5IGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBvYmplY3RzIG9mIDxlbT5hbnk8L2VtPgorICAgIEphdmEgY2xhc3MgdGhhdCBjb25mb3JtcyB0byBzdGFuZGFyZCBKYXZhQmVhbnMgbmFtaW5nIGNvbnZlbnRpb25zIChpLmUuCisgICAgaXQgaGFzIGEgemVyby1hcmd1bWVudHMgY29uc3RydWN0b3IsIGFuZCBoYXMgcHJvcGVydHkgc2V0dGVycyB0aGF0CisgICAgY29uZm9ybSB0byB0aGUgc2V0Rm9vKCkgbmFtaW5nIHBhdHRlcm4uICBUaGUgcmVzb3VyY2UgZmFjdG9yeSB3aWxsCisgICAgY3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBhcHByb3ByaWF0ZSBiZWFuIGNsYXNzIGV2ZXJ5IHRpbWUgYQorICAgIDxjb2RlPmxvb2t1cCgpPC9jb2RlPiBmb3IgdGhpcyBlbnRyeSBpcyBtYWRlLjwvcD4KKworICAgIDxwPlRoZSBzdGVwcyByZXF1aXJlZCB0byB1c2UgdGhpcyBmYWNpbGl0eSBhcmUgZGVzY3JpYmVkIGJlbG93LjwvcD4KKworICAgIDxoMz4xLiAgQ3JlYXRlIFlvdXIgSmF2YUJlYW4gQ2xhc3M8L2gzPgorCisgICAgPHA+Q3JlYXRlIHRoZSBKYXZhQmVhbiBjbGFzcyB3aGljaCB3aWxsIGJlIGluc3RhbnRpYXRlZCBlYWNoIHRpbWUKKyAgICB0aGF0IHRoZSByZXNvdXJjZSBmYWN0b3J5IGlzIGxvb2tlZCB1cC4gIEZvciB0aGlzIGV4YW1wbGUsIGFzc3VtZQorICAgIHlvdSBjcmVhdGUgYSBjbGFzcyA8Y29kZT5jb20ubXljb21wYW55Lk15QmVhbjwvY29kZT4sIHdoaWNoIGxvb2tzCisgICAgbGlrZSB0aGlzOjwvcD4KKworPHNvdXJjZT4KK3BhY2thZ2UgY29tLm15Y29tcGFueTsKKworcHVibGljIGNsYXNzIE15QmVhbiB7CisKKyAgcHJpdmF0ZSBTdHJpbmcgZm9vID0gIkRlZmF1bHQgRm9vIjsKKworICBwdWJsaWMgU3RyaW5nIGdldEZvbygpIHsKKyAgICByZXR1cm4gKHRoaXMuZm9vKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldEZvbyhTdHJpbmcgZm9vKSB7CisgICAgdGhpcy5mb28gPSBmb287CisgIH0KKworICBwcml2YXRlIGludCBiYXIgPSAwOworCisgIHB1YmxpYyBpbnQgZ2V0QmFyKCkgeworICAgIHJldHVybiAodGhpcy5iYXIpOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0QmFyKGludCBiYXIpIHsKKyAgICB0aGlzLmJhciA9IGJhcjsKKyAgfQorCisKK30KKzwvc291cmNlPgorCisgIDxoMz4yLiAgRGVjbGFyZSBZb3VyIFJlc291cmNlIFJlcXVpcmVtZW50czwvaDM+CisKKyAgPHA+TmV4dCwgbW9kaWZ5IHlvdXIgd2ViIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQgZGVzY3JpcHRvcgorICAoPGNvZGU+L1dFQi1JTkYvd2ViLnhtbDwvY29kZT4pIHRvIGRlY2xhcmUgdGhlIEpOREkgbmFtZSB1bmRlciB3aGljaAorICB5b3Ugd2lsbCByZXF1ZXN0IG5ldyBpbnN0YW5jZXMgb2YgdGhpcyBiZWFuLiAgVGhlIHNpbXBsZXN0IGFwcHJvYWNoIGlzCisgIHRvIHVzZSBhIDxjb2RlPiZsdDtyZXNvdXJjZS1lbnYtcmVmJmd0OzwvY29kZT4gZWxlbWVudCwgbGlrZSB0aGlzOjwvcD4KKworPHNvdXJjZT4KKyZsdDtyZXNvdXJjZS1lbnYtcmVmJmd0OworICAmbHQ7ZGVzY3JpcHRpb24mZ3Q7CisgICAgT2JqZWN0IGZhY3RvcnkgZm9yIE15QmVhbiBpbnN0YW5jZXMuCisgICZsdDsvZGVzY3JpcHRpb24mZ3Q7CisgICZsdDtyZXNvdXJjZS1lbnYtcmVmLW5hbWUmZ3Q7CisgICAgYmVhbi9NeUJlYW5GYWN0b3J5CisgICZsdDsvcmVzb3VyY2UtZW52LXJlZi1uYW1lJmd0OworICAmbHQ7cmVzb3VyY2UtZW52LXJlZi10eXBlJmd0OworICAgIGNvbS5teWNvbXBhbnkuTXlCZWFuCisgICZsdDsvcmVzb3VyY2UtZW52LXJlZi10eXBlJmd0OworJmx0Oy9yZXNvdXJjZS1lbnYtcmVmJmd0OworPC9zb3VyY2U+CisKKyAgICA8cD48c3Ryb25nPldBUk5JTkc8L3N0cm9uZz4gLSBCZSBzdXJlIHlvdSByZXNwZWN0IHRoZSBlbGVtZW50IG9yZGVyaW5nCisgICAgdGhhdCBpcyByZXF1aXJlZCBieSB0aGUgRFREIGZvciB3ZWIgYXBwbGljYXRpb24gZGVwbG95bWVudCBkZXNjcmlwdG9ycyEKKyAgICBTZWUgdGhlCisgICAgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9zZXJ2bGV0L2Rvd25sb2FkLmh0bWwiPlNlcnZsZXQKKyAgICBTcGVjaWZpY2F0aW9uPC9hPiBmb3IgZGV0YWlscy48L3A+CisKKyAgPGgzPjMuICBDb2RlIFlvdXIgQXBwbGljYXRpb24ncyBVc2UgT2YgVGhpcyBSZXNvdXJjZTwvaDM+CisKKyAgPHA+QSB0eXBpY2FsIHVzZSBvZiB0aGlzIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZSBtaWdodCBsb29rCisgIGxpa2UgdGhpczo8L3A+CisKKzxzb3VyY2U+CitDb250ZXh0IGluaXRDdHggPSBuZXcgSW5pdGlhbENvbnRleHQoKTsKK0NvbnRleHQgZW52Q3R4ID0gKENvbnRleHQpIGluaXRDdHgubG9va3VwKCJqYXZhOmNvbXAvZW52Iik7CitNeUJlYW4gYmVhbiA9IChNeUJlYW4pIGVudkN0eC5sb29rdXAoImJlYW4vTXlCZWFuRmFjdG9yeSIpOworCit3cml0ZXIucHJpbnRsbigiZm9vID0gIiArIGJlYW4uZ2V0Rm9vKCkgKyAiLCBiYXIgPSAiICsKKyAgICAgICAgICAgICAgIGJlYW4uZ2V0QmFyKCkpOworPC9zb3VyY2U+CisKKyAgICA8aDM+NC4gIENvbmZpZ3VyZSBUb21jYXQncyBSZXNvdXJjZSBGYWN0b3J5PC9oMz4KKworICAgIDxwPlRvIGNvbmZpZ3VyZSBUb21jYXQncyByZXNvdXJjZSBmYWN0b3J5LCBhZGQgYW4gZWxlbWVudHMgbGlrZSB0aGlzIHRvIHRoZQorICAgIDxjb2RlPiRDQVRBTElOQV9IT01FL2NvbmYvc2VydmVyLnhtbDwvY29kZT4gZmlsZSwgbmVzdGVkIGluc2lkZSB0aGUKKyAgICA8Y29kZT5Db250ZXh0PC9jb2RlPiBlbGVtZW50IGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbi48L3A+Cis8c291cmNlPgorJmx0O0NvbnRleHQgLi4uJmd0OworICAuLi4KKyAgJmx0O1Jlc291cmNlIG5hbWU9ImJlYW4vTXlCZWFuRmFjdG9yeSIgYXV0aD0iQ29udGFpbmVyIgorICAgICAgICAgICAgdHlwZT0iY29tLm15Y29tcGFueS5NeUJlYW4iCisgICAgICAgICAgICBmYWN0b3J5PSJvcmcuYXBhY2hlLm5hbWluZy5mYWN0b3J5LkJlYW5GYWN0b3J5IgorICAgICAgICAgICAgYmFyPSIyMyIvJmd0OworICAuLi4KKyZsdDsvQ29udGV4dCZndDsKKzwvc291cmNlPgorCisgICAgPHA+Tm90ZSB0aGF0IHRoZSByZXNvdXJjZSBuYW1lIChoZXJlLCA8Y29kZT5iZWFuL015QmVhbkZhY3Rvcnk8L2NvZGU+CisgICAgbXVzdCBtYXRjaCB0aGUgdmFsdWUgc3BlY2lmaWVkIGluIHRoZSB3ZWIgYXBwbGljYXRpb24gZGVwbG95bWVudAorICAgIGRlc2NyaXB0b3IuICBXZSBhcmUgYWxzbyBpbml0aWFsaXppbmcgdGhlIHZhbHVlIG9mIHRoZSA8Y29kZT5iYXI8L2NvZGU+CisgICAgcHJvcGVydHksIHdoaWNoIHdpbGwgY2F1c2UgPGNvZGU+c2V0QmFyKDIzKTwvY29kZT4gdG8gYmUgY2FsbGVkIGJlZm9yZQorICAgIHRoZSBuZXcgYmVhbiBpcyByZXR1cm5lZC4gIEJlY2F1c2Ugd2UgYXJlIG5vdCBpbml0aWFsaXppbmcgdGhlCisgICAgPGNvZGU+Zm9vPC9jb2RlPiBwcm9wZXJ0eSAoYWx0aG91Z2ggd2UgY291bGQgaGF2ZSksIHRoZSBiZWFuIHdpbGwKKyAgICBjb250YWluIHdoYXRldmVyIGRlZmF1bHQgdmFsdWUgaXMgc2V0IHVwIGJ5IGl0cyBjb25zdHJ1Y3Rvci48L3A+CisKKyAgPC9zdWJzZWN0aW9uPgorCisKKyAgPHN1YnNlY3Rpb24gbmFtZT0iSmF2YU1haWwgU2Vzc2lvbnMiPgorCisgICAgPGgzPjAuICBJbnRyb2R1Y3Rpb248L2gzPgorCisgICAgPHA+SW4gbWFueSB3ZWIgYXBwbGljYXRpb25zLCBzZW5kaW5nIGVsZWN0cm9uaWMgbWFpbCBtZXNzYWdlcyBpcyBhCisgICAgcmVxdWlyZWQgcGFydCBvZiB0aGUgc3lzdGVtJ3MgZnVuY3Rpb25hbGl0eS4gIFRoZQorICAgIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvamF2YW1haWwiPkphdmEgTWFpbDwvYT4gQVBJCisgICAgbWFrZXMgdGhpcyBwcm9jZXNzIHJlbGF0aXZlbHkgc3RyYWlnaHRmb3J3YXJkLCBidXQgcmVxdWlyZXMgbWFueQorICAgIGNvbmZpZ3VyYXRpb24gZGV0YWlscyB0aGF0IHRoZSBjbGllbnQgYXBwbGljYXRpb24gbXVzdCBiZSBhd2FyZSBvZgorICAgIChpbmNsdWRpbmcgdGhlIG5hbWUgb2YgdGhlIFNNVFAgaG9zdCB0byBiZSB1c2VkIGZvciBtZXNzYWdlIHNlbmRpbmcpLjwvcD4KKworICAgIDxwPlRvbWNhdCA1IGluY2x1ZGVzIGEgc3RhbmRhcmQgcmVzb3VyY2UgZmFjdG9yeSB0aGF0IHdpbGwgY3JlYXRlCisgICAgPGNvZGU+amF2YXgubWFpbC5TZXNzaW9uPC9jb2RlPiBzZXNzaW9uIGluc3RhbmNlcyBmb3IgeW91LCBhbHJlYWR5CisgICAgY29ubmVjdGVkIHRvIHRoZSBTTVRQIHNlcnZlciB0aGF0IGlzIGNvbmZpZ3VyZWQgaW4gPGNvZGU+c2VydmVyLnhtbDwvY29kZT4uCisgICAgSW4gdGhpcyB3YXksIHRoZSBhcHBsaWNhdGlvbiBpcyB0b3RhbGx5IGluc3VsYXRlZCBmcm9tIGNoYW5nZXMgaW4gdGhlCisgICAgZW1haWwgc2VydmVyIGNvbmZpZ3VyYXRpb24gZW52aXJvbm1lbnQgLSBpdCBzaW1wbHkgYXNrcyBmb3IsIGFuZCByZWNlaXZlcywKKyAgICBhIHByZWNvbmZpZ3VyZWQgc2Vzc2lvbiB3aGVuZXZlciBuZWVkZWQuPC9wPgorCisgICAgPHA+VGhlIHN0ZXBzIHJlcXVpcmVkIGZvciB0aGlzIGFyZSBvdXRsaW5lZCBiZWxvdy48L3A+CisKKyAgICA8aDM+MS4gIERlY2xhcmUgWW91ciBSZXNvdXJjZSBSZXF1aXJlbWVudHM8L2gzPgorCisgICAgPHA+VGhlIGZpcnN0IHRoaW5nIHlvdSBzaG91bGQgZG8gaXMgbW9kaWZ5IHRoZSB3ZWIgYXBwbGljYXRpb24gZGVwbG95bWVudAorICAgIGRlc2NyaXB0b3IgKDxjb2RlPi9XRUItSU5GL3dlYi54bWw8L2NvZGU+KSB0byBkZWNsYXJlIHRoZSBKTkRJIG5hbWUgdW5kZXIKKyAgICB3aGljaCB5b3Ugd2lsbCBsb29rIHVwIHByZWNvbmZpZ3VyZWQgc2Vzc2lvbnMuICBCeSBjb252ZW50aW9uLCBhbGwgc3VjaAorICAgIG5hbWVzIHNob3VsZCByZXNvbHZlIHRvIHRoZSA8Y29kZT5tYWlsPC9jb2RlPiBzdWJjb250ZXh0IChyZWxhdGl2ZSB0byB0aGUKKyAgICBzdGFuZGFyZCA8Y29kZT5qYXZhOmNvbXAvZW52PC9jb2RlPiBuYW1pbmcgY29udGV4dCB0aGF0IGlzIHRoZSByb290IG9mCisgICAgYWxsIHByb3ZpZGVkIHJlc291cmNlIGZhY3Rvcmllcy4gIEEgdHlwaWNhbCA8Y29kZT53ZWIueG1sPC9jb2RlPiBlbnRyeQorICAgIG1pZ2h0IGxvb2sgbGlrZSB0aGlzOjwvcD4KKzxzb3VyY2U+CismbHQ7cmVzb3VyY2UtcmVmJmd0OworICAmbHQ7ZGVzY3JpcHRpb24mZ3Q7CisgICAgUmVzb3VyY2UgcmVmZXJlbmNlIHRvIGEgZmFjdG9yeSBmb3IgamF2YXgubWFpbC5TZXNzaW9uCisgICAgaW5zdGFuY2VzIHRoYXQgbWF5IGJlIHVzZWQgZm9yIHNlbmRpbmcgZWxlY3Ryb25pYyBtYWlsCisgICAgbWVzc2FnZXMsIHByZWNvbmZpZ3VyZWQgdG8gY29ubmVjdCB0byB0aGUgYXBwcm9wcmlhdGUKKyAgICBTTVRQIHNlcnZlci4KKyAgJmx0Oy9kZXNjcmlwdGlvbiZndDsKKyAgJmx0O3Jlcy1yZWYtbmFtZSZndDsKKyAgICBtYWlsL1Nlc3Npb24KKyAgJmx0Oy9yZXMtcmVmLW5hbWUmZ3Q7CisgICZsdDtyZXMtdHlwZSZndDsKKyAgICBqYXZheC5tYWlsLlNlc3Npb24KKyAgJmx0Oy9yZXMtdHlwZSZndDsKKyAgJmx0O3Jlcy1hdXRoJmd0OworICAgIENvbnRhaW5lcgorICAmbHQ7L3Jlcy1hdXRoJmd0OworJmx0Oy9yZXNvdXJjZS1yZWYmZ3Q7Cis8L3NvdXJjZT4KKworICAgIDxwPjxzdHJvbmc+V0FSTklORzwvc3Ryb25nPiAtIEJlIHN1cmUgeW91IHJlc3BlY3QgdGhlIGVsZW1lbnQgb3JkZXJpbmcKKyAgICB0aGF0IGlzIHJlcXVpcmVkIGJ5IHRoZSBEVEQgZm9yIHdlYiBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIQorICAgIFNlZSB0aGUKKyAgICA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL3NlcnZsZXQvZG93bmxvYWQuaHRtbCI+U2VydmxldAorICAgIFNwZWNpZmljYXRpb248L2E+IGZvciBkZXRhaWxzLjwvcD4KKworICAgIDxoMz4yLiAgQ29kZSBZb3VyIEFwcGxpY2F0aW9uJ3MgVXNlIE9mIFRoaXMgUmVzb3VyY2U8L2gzPgorCisgICAgPHA+QSB0eXBpY2FsIHVzZSBvZiB0aGlzIHJlc291cmNlIHJlZmVyZW5jZSBtaWdodCBsb29rIGxpa2UgdGhpczo8L3A+Cis8c291cmNlPgorQ29udGV4dCBpbml0Q3R4ID0gbmV3IEluaXRpYWxDb250ZXh0KCk7CitDb250ZXh0IGVudkN0eCA9IChDb250ZXh0KSBpbml0Q3R4Lmxvb2t1cCgiamF2YTpjb21wL2VudiIpOworU2Vzc2lvbiBzZXNzaW9uID0gKFNlc3Npb24pIGVudkN0eC5sb29rdXAoIm1haWwvU2Vzc2lvbiIpOworCitNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTWltZU1lc3NhZ2Uoc2Vzc2lvbik7CittZXNzYWdlLnNldEZyb20obmV3IEludGVybmV0QWRkcmVzcyhyZXF1ZXN0LmdldFBhcmFtZXRlcigiZnJvbSIpKTsKK0ludGVybmV0QWRkcmVzcyB0b1tdID0gbmV3IEludGVybmV0QWRkcmVzc1sxXTsKK3RvWzBdID0gbmV3IEludGVybmV0QWRkcmVzcyhyZXF1ZXN0LmdldFBhcmFtZXRlcigidG8iKSk7CittZXNzYWdlLnNldFJlY2lwaWVudHMoTWVzc2FnZS5SZWNpcGllbnRUeXBlLlRPLCB0byk7CittZXNzYWdlLnNldFN1YmplY3QocmVxdWVzdC5nZXRQYXJhbWV0ZXIoInN1YmplY3QiKSk7CittZXNzYWdlLnNldENvbnRlbnQocmVxdWVzdC5nZXRQYXJhbWV0ZXIoImNvbnRlbnQiKSwgInRleHQvcGxhaW4iKTsKK1RyYW5zcG9ydC5zZW5kKG1lc3NhZ2UpOworPC9zb3VyY2U+CisKKyAgICA8cD5Ob3RlIHRoYXQgdGhlIGFwcGxpY2F0aW9uIHVzZXMgdGhlIHNhbWUgcmVzb3VyY2UgcmVmZXJlbmNlIG5hbWUKKyAgICB0aGF0IHdhcyBkZWNsYXJlZCBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQgZGVzY3JpcHRvci4gIFRoaXMKKyAgICBpcyBtYXRjaGVkIHVwIGFnYWluc3QgdGhlIHJlc291cmNlIGZhY3RvcnkgdGhhdCBpcyBjb25maWd1cmVkIGluCisgICAgPGNvZGU+JENBVEFMSU5BX0hPTUUvY29uZi9zZXJ2ZXIueG1sPC9jb2RlPiwgYXMgZGVzY3JpYmVkIGJlbG93LjwvcD4KKworICAgIDxoMz4zLiAgQ29uZmlndXJlIFRvbWNhdCdzIFJlc291cmNlIEZhY3Rvcnk8L2gzPgorCisgICAgPHA+VG8gY29uZmlndXJlIFRvbWNhdCdzIHJlc291cmNlIGZhY3RvcnksIGFkZCBhbiBlbGVtZW50cyBsaWtlIHRoaXMgdG8gdGhlCisgICAgPGNvZGU+JENBVEFMSU5BX0hPTUUvY29uZi9zZXJ2ZXIueG1sPC9jb2RlPiBmaWxlLCBuZXN0ZWQgaW5zaWRlIHRoZQorICAgIDxjb2RlPkNvbnRleHQ8L2NvZGU+IGVsZW1lbnQgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLjwvcD4KKzxzb3VyY2U+CismbHQ7Q29udGV4dCAuLi4mZ3Q7CisgIC4uLgorICAmbHQ7UmVzb3VyY2UgbmFtZT0ibWFpbC9TZXNzaW9uIiBhdXRoPSJDb250YWluZXIiCisgICAgICAgICAgICB0eXBlPSJqYXZheC5tYWlsLlNlc3Npb24iCisgICAgICAgICAgICBtYWlsLnNtdHAuaG9zdD0ibG9jYWxob3N0Ii8mZ3Q7CisgIC4uLgorJmx0Oy9Db250ZXh0Jmd0OworPC9zb3VyY2U+CisKKyAgICA8cD5Ob3RlIHRoYXQgdGhlIHJlc291cmNlIG5hbWUgKGhlcmUsIDxjb2RlPm1haWwvU2Vzc2lvbjwvY29kZT4pIG11c3QKKyAgICBtYXRjaCB0aGUgdmFsdWUgc3BlY2lmaWVkIGluIHRoZSB3ZWIgYXBwbGljYXRpb24gZGVwbG95bWVudCBkZXNjcmlwdG9yLgorICAgIEN1c3RvbWl6ZSB0aGUgdmFsdWUgb2YgdGhlIDxjb2RlPm1haWwuc210cC5ob3N0PC9jb2RlPiBwYXJhbWV0ZXIgdG8KKyAgICBwb2ludCBhdCB0aGUgc2VydmVyIHRoYXQgcHJvdmlkZXMgU01UUCBzZXJ2aWNlIGZvciB5b3VyIG5ldHdvcmsuPC9wPgorCisgICAgPGgzPkV4YW1wbGUgQXBwbGljYXRpb248L2gzPgorCisgICAgPHA+VGhlIDxjb2RlPi9leGFtcGxlczwvY29kZT4gYXBwbGljYXRpb24gaW5jbHVkZWQgd2l0aCBUb21jYXQgY29udGFpbnMKKyAgICBhbiBleGFtcGxlIG9mIHV0aWxpemluZyB0aGlzIHJlc291cmNlIGZhY3RvcnkuICBJdCBpcyBhY2Nlc3NlZCB2aWEgdGhlCisgICAgIkpTUCBFeGFtcGxlcyIgbGluay4gIFRoZSBzb3VyY2UgY29kZSBmb3IgdGhlIHNlcnZsZXQgdGhhdCBhY3R1YWxseQorICAgIHNlbmRzIHRoZSBtYWlsIG1lc3NhZ2UgaXMgaW4KKyAgICA8Y29kZT4vV0VCLUlORi9jbGFzc2VzL1NlbmRNYWlsU2VydmxldC5qYXZhPC9jb2RlPi48L3A+CisKKyAgICA8cD48c3Ryb25nPldBUk5JTkc8L3N0cm9uZz4gLSBUaGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIGFzc3VtZXMgdGhhdAorICAgIHRoZXJlIGlzIGFuIFNNVFAgc2VydmVyIGxpc3Rpbmcgb24gcG9ydCAyNSBvbiA8Y29kZT5sb2NhbGhvc3Q8L2NvZGU+LgorICAgIElmIHRoaXMgaXMgbm90IHRoZSBjYXNlLCBlZGl0IHRoZQorICAgIDxjb2RlPiRDQVRBTElOQV9IT01FL2NvbmYvc2VydmVyLnhtbDwvY29kZT4gZmlsZSwgYW5kIG1vZGlmeSB0aGUKKyAgICBwYXJhbWV0ZXIgdmFsdWUgZm9yIHRoZSA8Y29kZT5tYWlsLnNtdHAuaG9zdDwvY29kZT4gcGFyYW1ldGVyIHRvIGJlCisgICAgdGhlIGhvc3QgbmFtZSBvZiBhbiBTTVRQIHNlcnZlciBvbiB5b3VyIG5ldHdvcmsuPC9wPgorCisgIDwvc3Vic2VjdGlvbj4KKworICA8c3Vic2VjdGlvbiBuYW1lPSJKREJDIERhdGEgU291cmNlcyI+CisKKyAgICA8aDM+MC4gIEludHJvZHVjdGlvbjwvaDM+CisKKyAgICA8cD5NYW55IHdlYiBhcHBsaWNhdGlvbnMgbmVlZCB0byBhY2Nlc3MgYSBkYXRhYmFzZSB2aWEgYSBKREJDIGRyaXZlciwKKyAgICB0byBzdXBwb3J0IHRoZSBmdW5jdGlvbmFsaXR5IHJlcXVpcmVkIGJ5IHRoYXQgYXBwbGljYXRpb24uICBUaGUgSjJFRQorICAgIFBsYXRmb3JtIFNwZWNpZmljYXRpb24gcmVxdWlyZXMgSjJFRSBBcHBsaWNhdGlvbiBTZXJ2ZXJzIHRvIG1ha2UKKyAgICBhdmFpbGFibGUgYSA8ZW0+RGF0YVNvdXJjZTwvZW0+IGltcGxlbWVudGF0aW9uICh0aGF0IGlzLCBhIGNvbm5lY3Rpb24KKyAgICBwb29sIGZvciBKREJDIGNvbm5lY3Rpb25zKSBmb3IgdGhpcyBwdXJwb3NlLiAgVG9tY2F0IDUgb2ZmZXJzIGV4YWN0bHkKKyAgICB0aGUgc2FtZSBzdXBwb3J0LCBzbyB0aGF0IGRhdGFiYXNlLWJhc2VkIGFwcGxpY2F0aW9ucyB5b3UgZGV2ZWxvcCBvbgorICAgIFRvbWNhdCB1c2luZyB0aGlzIHNlcnZpY2Ugd2lsbCBydW4gdW5jaGFuZ2VkIG9uIGFueSBKMkVFIHNlcnZlci48L3A+CisKKyAgICA8cD5Gb3IgaW5mb3JtYXRpb24gYWJvdXQgSkRCQywgeW91IHNob3VsZCBjb25zdWx0IHRoZSBmb2xsb3dpbmc6PC9wPgorICAgIDx1bD4KKyAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9qZGJjLyI+aHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9qZGJjLzwvYT4gLQorICAgICAgICBIb21lIHBhZ2UgZm9yIGluZm9ybWF0aW9uIGFib3V0IEphdmEgRGF0YWJhc2UgQ29ubmVjdGl2aXR5LjwvbGk+CisgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjMvZG9jcy9ndWlkZS9qZGJjL3NwZWMyL2pkYmMyLjEuZnJhbWUuaHRtbCI+aHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuMy9kb2NzL2d1aWRlL2pkYmMvc3BlYzIvamRiYzIuMS5mcmFtZS5odG1sPC9hPiAtCisgICAgICAgIFRoZSBKREJDIDIuMSBBUEkgU3BlY2lmaWNhdGlvbi48L2xpPgorICAgIDxsaT48YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL2pkYmMvamRiYzIwLnN0ZGV4dC5wZGYiPmh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvamRiYy9qZGJjMjAuc3RkZXh0LnBkZjwvYT4gLQorICAgICAgICBUaGUgSkRCQyAyLjAgU3RhbmRhcmQgRXh0ZW5zaW9uIEFQSSAoaW5jbHVkaW5nIHRoZQorICAgICAgICA8Y29kZT5qYXZheC5zcWwuRGF0YVNvdXJjZTwvY29kZT4gQVBJKS4gIFRoaXMgcGFja2FnZSBpcyBub3cga25vd24KKyAgICAgICAgYXMgdGhlICJKREJDIE9wdGlvbmFsIFBhY2thZ2UiLjwvbGk+CisgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJlZS9kb3dubG9hZC5odG1sIj5odHRwOi8vamF2YS5zdW4uY29tL2oyZWUvZG93bmxvYWQuaHRtbDwvYT4gLQorICAgICAgICBUaGUgSjJFRSBQbGF0Zm9ybSBTcGVjaWZpY2F0aW9uIChjb3ZlcnMgdGhlIEpEQkMgZmFjaWxpdGllcyB0aGF0CisgICAgICAgIGFsbCBKMkVFIHBsYXRmb3JtcyBtdXN0IHByb3ZpZGUgdG8gYXBwbGljYXRpb25zKS48L2xpPgorICAgIDwvdWw+CisKKyAgICA8cD48c3Ryb25nPk5PVEU8L3N0cm9uZz4gLSBUaGUgZGVmYXVsdCBkYXRhIHNvdXJjZSBzdXBwb3J0IGluIFRvbWNhdAorICAgIGlzIGJhc2VkIG9uIHRoZSA8c3Ryb25nPkRCQ1A8L3N0cm9uZz4gY29ubmVjdGlvbiBwb29sIGZyb20gdGhlCisgICAgPGEgaHJlZj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9jb21tb25zIj5KYWthcnRhIENvbW1vbnM8L2E+CisgICAgc3VicHJvamVjdC4gIEhvd2V2ZXIsIGl0IGlzIHBvc3NpYmxlIHRvIHVzZSBhbnkgb3RoZXIgY29ubmVjdGlvbiBwb29sCisgICAgdGhhdCBpbXBsZW1lbnRzIDxjb2RlPmphdmF4LnNxbC5EYXRhU291cmNlPC9jb2RlPiwgYnkgd3JpdGluZyB5b3VyCisgICAgb3duIGN1c3RvbSByZXNvdXJjZSBmYWN0b3J5LCBhcyBkZXNjcmliZWQKKyAgICA8YSBocmVmPSIjQWRkaW5nIEN1c3RvbSBSZXNvdXJjZSBGYWN0b3JpZXMiPmJlbG93PC9hPi48L3A+CisKKyAgICA8aDM+MS4gIEluc3RhbGwgWW91ciBKREJDIERyaXZlcjwvaDM+CisKKyAgICA8cD5Vc2Ugb2YgdGhlIDxlbT5KREJDIERhdGEgU291cmNlczwvZW0+IEpOREkgUmVzb3VyY2UgRmFjdG9yeSByZXF1aXJlcworICAgIHRoYXQgeW91IG1ha2UgYW4gYXBwcm9wcmlhdGUgSkRCQyBkcml2ZXIgYXZhaWxhYmxlIHRvIGJvdGggVG9tY2F0IGludGVybmFsCisgICAgY2xhc3NlcyBhbmQgdG8geW91ciB3ZWIgYXBwbGljYXRpb24uICBUaGlzIGlzIG1vc3QgZWFzaWx5IGFjY29tcGxpc2hlZCBieQorICAgIGluc3RhbGxpbmcgdGhlIGRyaXZlcidzIEpBUiBmaWxlKHMpIGludG8gdGhlCisgICAgPGNvZGU+JENBVEFMSU5BX0hPTUUvY29tbW9uL2xpYjwvY29kZT4gZGlyZWN0b3J5LCB3aGljaCBtYWtlcyB0aGUgZHJpdmVyCisgICAgYXZhaWxhYmxlIGJvdGggdG8gdGhlIHJlc291cmNlIGZhY3RvcnkgYW5kIHRvIHlvdXIgYXBwbGljYXRpb24uPC9wPgorCisgICAgPGgzPjIuICBEZWNsYXJlIFlvdXIgUmVzb3VyY2UgUmVxdWlyZW1lbnRzPC9oMz4KKworICAgIDxwPk5leHQsIG1vZGlmeSB0aGUgd2ViIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQgZGVzY3JpcHRvcgorICAgICg8Y29kZT4vV0VCLUlORi93ZWIueG1sPC9jb2RlPikgdG8gZGVjbGFyZSB0aGUgSk5ESSBuYW1lIHVuZGVyCisgICAgd2hpY2ggeW91IHdpbGwgbG9vayB1cCBwcmVjb25maWd1cmVkIGRhdGEgc291cmNlLiAgQnkgY29udmVudGlvbiwgYWxsIHN1Y2gKKyAgICBuYW1lcyBzaG91bGQgcmVzb2x2ZSB0byB0aGUgPGNvZGU+amRiYzwvY29kZT4gc3ViY29udGV4dCAocmVsYXRpdmUgdG8gdGhlCisgICAgc3RhbmRhcmQgPGNvZGU+amF2YTpjb21wL2VudjwvY29kZT4gbmFtaW5nIGNvbnRleHQgdGhhdCBpcyB0aGUgcm9vdCBvZgorICAgIGFsbCBwcm92aWRlZCByZXNvdXJjZSBmYWN0b3JpZXMuICBBIHR5cGljYWwgPGNvZGU+d2ViLnhtbDwvY29kZT4gZW50cnkKKyAgICBtaWdodCBsb29rIGxpa2UgdGhpczo8L3A+Cis8c291cmNlPgorJmx0O3Jlc291cmNlLXJlZiZndDsKKyAgJmx0O2Rlc2NyaXB0aW9uJmd0OworICAgIFJlc291cmNlIHJlZmVyZW5jZSB0byBhIGZhY3RvcnkgZm9yIGphdmEuc3FsLkNvbm5lY3Rpb24KKyAgICBpbnN0YW5jZXMgdGhhdCBtYXkgYmUgdXNlZCBmb3IgdGFsa2luZyB0byBhIHBhcnRpY3VsYXIKKyAgICBkYXRhYmFzZSB0aGF0IGlzIGNvbmZpZ3VyZWQgaW4gdGhlIHNlcnZlci54bWwgZmlsZS4KKyAgJmx0Oy9kZXNjcmlwdGlvbiZndDsKKyAgJmx0O3Jlcy1yZWYtbmFtZSZndDsKKyAgICBqZGJjL0VtcGxveWVlREIKKyAgJmx0Oy9yZXMtcmVmLW5hbWUmZ3Q7CisgICZsdDtyZXMtdHlwZSZndDsKKyAgICBqYXZheC5zcWwuRGF0YVNvdXJjZQorICAmbHQ7L3Jlcy10eXBlJmd0OworICAmbHQ7cmVzLWF1dGgmZ3Q7CisgICAgQ29udGFpbmVyCisgICZsdDsvcmVzLWF1dGgmZ3Q7CismbHQ7L3Jlc291cmNlLXJlZiZndDsKKzwvc291cmNlPgorCisgICAgPHA+PHN0cm9uZz5XQVJOSU5HPC9zdHJvbmc+IC0gQmUgc3VyZSB5b3UgcmVzcGVjdCB0aGUgZWxlbWVudCBvcmRlcmluZworICAgIHRoYXQgaXMgcmVxdWlyZWQgYnkgdGhlIERURCBmb3Igd2ViIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMhCisgICAgU2VlIHRoZQorICAgIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvc2VydmxldC9kb3dubG9hZC5odG1sIj5TZXJ2bGV0CisgICAgU3BlY2lmaWNhdGlvbjwvYT4gZm9yIGRldGFpbHMuPC9wPgorCisgICAgPGgzPjMuICBDb2RlIFlvdXIgQXBwbGljYXRpb24ncyBVc2UgT2YgVGhpcyBSZXNvdXJjZTwvaDM+CisKKyAgICA8cD5BIHR5cGljYWwgdXNlIG9mIHRoaXMgcmVzb3VyY2UgcmVmZXJlbmNlIG1pZ2h0IGxvb2sgbGlrZSB0aGlzOjwvcD4KKzxzb3VyY2U+CitDb250ZXh0IGluaXRDdHggPSBuZXcgSW5pdGlhbENvbnRleHQoKTsKK0NvbnRleHQgZW52Q3R4ID0gKENvbnRleHQpIGluaXRDdHgubG9va3VwKCJqYXZhOmNvbXAvZW52Iik7CitEYXRhU291cmNlIGRzID0gKERhdGFTb3VyY2UpCisgIGVudkN0eC5sb29rdXAoImpkYmMvRW1wbG95ZWVEQiIpOworCitDb25uZWN0aW9uIGNvbm4gPSBkcy5nZXRDb25uZWN0aW9uKCk7CisuLi4gdXNlIHRoaXMgY29ubmVjdGlvbiB0byBhY2Nlc3MgdGhlIGRhdGFiYXNlIC4uLgorY29ubi5jbG9zZSgpOworPC9zb3VyY2U+CisKKyAgICA8cD5Ob3RlIHRoYXQgdGhlIGFwcGxpY2F0aW9uIHVzZXMgdGhlIHNhbWUgcmVzb3VyY2UgcmVmZXJlbmNlIG5hbWUKKyAgICB0aGF0IHdhcyBkZWNsYXJlZCBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQgZGVzY3JpcHRvci4gIFRoaXMKKyAgICBpcyBtYXRjaGVkIHVwIGFnYWluc3QgdGhlIHJlc291cmNlIGZhY3RvcnkgdGhhdCBpcyBjb25maWd1cmVkIGluCisgICAgPGNvZGU+JENBVEFMSU5BX0hPTUUvY29uZi9zZXJ2ZXIueG1sPC9jb2RlPiwgYXMgZGVzY3JpYmVkIGJlbG93LjwvcD4KKworICAgIDxoMz40LiAgQ29uZmlndXJlIFRvbWNhdCdzIFJlc291cmNlIEZhY3Rvcnk8L2gzPgorCisgICAgPHA+VG8gY29uZmlndXJlIFRvbWNhdCdzIHJlc291cmNlIGZhY3RvcnksIGFkZCBhbiBlbGVtZW50IGxpa2UgdGhpcyB0byB0aGUKKyAgICA8Y29kZT4vTUVUQS1JTkYvY29udGV4dC54bWw8L2NvZGU+IGZpbGUgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbi48L3A+Cis8c291cmNlPgorJmx0O0NvbnRleHQgLi4uJmd0OworICAuLi4KKyAgJmx0O1Jlc291cmNlIG5hbWU9ImpkYmMvRW1wbG95ZWVEQiIgYXV0aD0iQ29udGFpbmVyIgorICAgICAgICAgICAgdHlwZT0iamF2YXguc3FsLkRhdGFTb3VyY2UiIHVzZXJuYW1lPSJkYnVzZXJuYW1lIiBwYXNzd29yZD0iZGJwYXNzd29yZCIKKyAgICAgICAgICAgIGRyaXZlckNsYXNzTmFtZT0ib3JnLmhzcWwuamRiY0RyaXZlciIgdXJsPSJqZGJjOkh5cGVyc29uaWNTUUw6ZGF0YWJhc2UiCisgICAgICAgICAgICBtYXhBY3RpdmU9IjgiIG1heElkbGU9IjQiLyZndDsKKyAgLi4uCismbHQ7L0NvbnRleHQmZ3Q7Cis8L3NvdXJjZT4KKworICAgIDxwPk5vdGUgdGhhdCB0aGUgcmVzb3VyY2UgbmFtZSAoaGVyZSwgPGNvZGU+amRiYy9FbXBsb3llZURCPC9jb2RlPikgbXVzdAorICAgIG1hdGNoIHRoZSB2YWx1ZSBzcGVjaWZpZWQgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IuPC9wPgorCisgICAgPHA+VGhpcyBleGFtcGxlIGFzc3VtZXMgdGhhdCB5b3UgYXJlIHVzaW5nIHRoZSBIeXBlcnNvbmljU1FMIGRhdGFiYXNlCisgICAgSkRCQyBkcml2ZXIuICBDdXN0b21pemUgdGhlIDxjb2RlPmRyaXZlckNsYXNzTmFtZTwvY29kZT4gYW5kCisgICAgPGNvZGU+ZHJpdmVyTmFtZTwvY29kZT4gcGFyYW1ldGVycyB0byBtYXRjaCB5b3VyIGFjdHVhbCBkYXRhYmFzZSdzCisgICAgSkRCQyBkcml2ZXIgYW5kIGNvbm5lY3Rpb24gVVJMLjwvcD4KKworICAgIDxwPlRoZSBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMgZm9yIFRvbWNhdCdzIHN0YW5kYXJkIGRhdGEgc291cmNlCisgICAgcmVzb3VyY2UgZmFjdG9yeQorICAgICg8Y29kZT5vcmcuYXBhY2hlLnRvbWNhdC5kYmNwLmRiY3AuQmFzaWNEYXRhU291cmNlRmFjdG9yeTwvY29kZT4pIGFyZQorICAgIGFzIGZvbGxvd3M6PC9wPgorICAgIDx1bD4KKyAgICA8bGk+PHN0cm9uZz5kcml2ZXJDbGFzc05hbWU8L3N0cm9uZz4gLSBGdWxseSBxdWFsaWZpZWQgSmF2YSBjbGFzcyBuYW1lCisgICAgICAgIG9mIHRoZSBKREJDIGRyaXZlciB0byBiZSB1c2VkLjwvbGk+CisgICAgPGxpPjxzdHJvbmc+bWF4QWN0aXZlPC9zdHJvbmc+IC0gVGhlIG1heGltdW0gbnVtYmVyIG9mIGFjdGl2ZSBpbnN0YW5jZXMKKyAgICAgICAgdGhhdCBjYW4gYmUgYWxsb2NhdGVkIGZyb20gdGhpcyBwb29sIGF0IHRoZSBzYW1lIHRpbWUuPC9saT4KKyAgICA8bGk+PHN0cm9uZz5tYXhJZGxlPC9zdHJvbmc+IC0gVGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbm5lY3Rpb25zIHRoYXQKKyAgICAgICAgY2FuIHNpdCBpZGxlIGluIHRoaXMgcG9vbCBhdCB0aGUgc2FtZSB0aW1lLjwvbGk+CisgICAgPGxpPjxzdHJvbmc+bWF4V2FpdDwvc3Ryb25nPiAtIFRoZSBtYXhpbXVtIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdGhhdCB0aGUKKyAgICAgICAgcG9vbCB3aWxsIHdhaXQgKHdoZW4gdGhlcmUgYXJlIG5vIGF2YWlsYWJsZSBjb25uZWN0aW9ucykgZm9yIGEKKyAgICAgICAgY29ubmVjdGlvbiB0byBiZSByZXR1cm5lZCBiZWZvcmUgdGhyb3dpbmcgYW4gZXhjZXB0aW9uLjwvbGk+CisgICAgPGxpPjxzdHJvbmc+cGFzc3dvcmQ8L3N0cm9uZz4gLSBEYXRhYmFzZSBwYXNzd29yZCB0byBiZSBwYXNzZWQgdG8gb3VyCisgICAgICAgIEpEQkMgZHJpdmVyLjwvbGk+CisgICAgPGxpPjxzdHJvbmc+dXJsPC9zdHJvbmc+IC0gQ29ubmVjdGlvbiBVUkwgdG8gYmUgcGFzc2VkIHRvIG91ciBKREJDIGRyaXZlci4KKyAgICAgICAgKEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgdGhlIHByb3BlcnR5IDxjb2RlPmRyaXZlck5hbWU8L2NvZGU+CisgICAgICAgIGlzIGFsc28gcmVjb2duaXplZC4pPC9saT4KKyAgICA8bGk+PHN0cm9uZz51c2VyPC9zdHJvbmc+IC0gRGF0YWJhc2UgdXNlcm5hbWUgdG8gYmUgcGFzc2VkIHRvIG91cgorICAgICAgICBKREJDIGRyaXZlci48L2xpPgorICAgIDxsaT48c3Ryb25nPnZhbGlkYXRpb25RdWVyeTwvc3Ryb25nPiAtIFNRTCBxdWVyeSB0aGF0IGNhbiBiZSB1c2VkIGJ5IHRoZQorICAgICAgICBwb29sIHRvIHZhbGlkYXRlIGNvbm5lY3Rpb25zIGJlZm9yZSB0aGV5IGFyZSByZXR1cm5lZCB0byB0aGUKKyAgICAgICAgYXBwbGljYXRpb24uICBJZiBzcGVjaWZpZWQsIHRoaXMgcXVlcnkgTVVTVCBiZSBhbiBTUUwgU0VMRUNUCisgICAgICAgIHN0YXRlbWVudCB0aGF0IHJldHVybnMgYXQgbGVhc3Qgb25lIHJvdy48L2xpPgorICAgIDwvdWw+CisgICAgPHA+Rm9yIG1vcmUgZGV0YWlscywgcGxlYXNlIHJlZmVyIHRvIHRoZSBjb21tb25zLWRiY3AgZG9jdW1lbnRhdGlvbi48L3A+CisKKyAgPC9zdWJzZWN0aW9uPgorCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iQWRkaW5nIEN1c3RvbSBSZXNvdXJjZSBGYWN0b3JpZXMiPgorCisgIDxwPklmIG5vbmUgb2YgdGhlIHN0YW5kYXJkIHJlc291cmNlIGZhY3RvcmllcyBtZWV0IHlvdXIgbmVlZHMsIHlvdSBjYW4KKyAgd3JpdGUgeW91ciBvd24gZmFjdG9yeSBhbmQgaW50ZWdyYXRlIGl0IGludG8gVG9tY2F0IDUsIGFuZCB0aGVuIGNvbmZpZ3VyZQorICB0aGUgdXNlIG9mIHRoaXMgZmFjdG9yeSBpbiB0aGUgPGNvZGU+Y29uZi9zZXJ2ZXIueG1sPC9jb2RlPiBjb25maWd1cmF0aW9uCisgIGZpbGUuICBJbiB0aGUgZXhhbXBsZSBiZWxvdywgd2Ugd2lsbCBjcmVhdGUgYSBmYWN0b3J5IHRoYXQgb25seSBrbm93cyBob3cKKyAgdG8gY3JlYXRlIDxjb2RlPmNvbS5teWNvbXBhbnkuTXlCZWFuPC9jb2RlPiBiZWFucywgZnJvbSB0aGUKKyAgPGEgaHJlZj0iI0dlbmVyaWMgSmF2YUJlYW4gUmVzb3VyY2VzIj5HZW5lcmljIEphdmFCZWFuIFJlc291cmNlczwvYT4KKyAgZXhhbXBsZSwgYWJvdmUuPC9wPgorCisgIDxoMz4xLiAgV3JpdGUgQSBSZXNvdXJjZSBGYWN0b3J5IENsYXNzPC9oMz4KKworICA8cD5Zb3UgbXVzdCB3cml0ZSBhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgSk5ESSBzZXJ2aWNlIHByb3ZpZGVyCisgIDxjb2RlPmphdmF4Lm5hbWluZy5zcGkuT2JqZWN0RmFjdG9yeTwvY29kZT4gaW50ZWZhY2UuICBFdmVyeSB0aW1lIHlvdXIKKyAgd2ViIGFwcGxpY2F0aW9uIGNhbGxzIDxjb2RlPmxvb2t1cCgpPC9jb2RlPiBvbiBhIGNvbnRleHQgZW50cnkgdGhhdCBpcworICBib3VuZCB0byB0aGlzIGZhY3RvcnksIHRoZSA8Y29kZT5nZXRPYmplY3RJbnN0YW5jZSgpPC9jb2RlPiBtZXRob2QgaXMKKyAgY2FsbGVkLCB3aXRoIHRoZSBmb2xsb3dpbmcgYXJndW1lbnRzOjwvcD4KKyAgPHVsPgorICA8bGk+PHN0cm9uZz5PYmplY3Qgb2JqPC9zdHJvbmc+IC0gVGhlIChwb3NzaWJseSBudWxsKSBvYmplY3QgY29udGFpbmluZworICAgICAgbG9jYXRpb24gb3IgcmVmZXJlbmNlIGluZm9ybWF0aW9uIHRoYXQgY2FuIGJlIHVzZWQgaW4gY3JlYXRpbmcgYW4KKyAgICAgIG9iamVjdC4gIEZvciBUb21jYXQsIHRoaXMgd2lsbCBhbHdheXMgYmUgYW4gb2JqZWN0IG9mIHR5cGUKKyAgICAgIDxjb2RlPmphdmF4Lm5hbWluZy5SZWZlcmVuY2U8L2NvZGU+LCB3aGljaCBjb250YWlucyB0aGUgY2xhc3MgbmFtZQorICAgICAgb2YgdGhpcyBmYWN0b3J5IGNsYXNzLCBhcyB3ZWxsIGFzIHRoZSBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMKKyAgICAgIChmcm9tIDxjb2RlPmNvbmYvc2VydmVyLnhtbDwvY29kZT4pIHRvIHVzZSBpbiBjcmVhdGluZyBvYmplY3RzCisgICAgICB0byBiZSByZXR1cm5lZC48L2xpPgorICA8bGk+PHN0cm9uZz5OYW1lIG5hbWU8L3N0cm9uZz4gLSBUaGUgbmFtZSB0byB3aGljaCB0aGlzIGZhY3RvcnkgaXMgYm91bmQKKyAgICAgIHJlbGF0aXZlIHRvIDxjb2RlPm5hbWVDdHg8L2NvZGU+LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBuYW1lCisgICAgICBpcyBzcGVjaWZpZWQuPC9saT4KKyAgPGxpPjxzdHJvbmc+Q29udGV4dCBuYW1lQ3R4PC9zdHJvbmc+IC0gVGhlIGNvbnRleHQgcmVsYXRpdmUgdG8gd2hpY2ggdGhlCisgICAgICA8Y29kZT5uYW1lPC9jb2RlPiBwYXJhbWV0ZXIgaXMgc3BlY2lmaWVkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgorICAgICAgPGNvZGU+bmFtZTwvY29kZT4gaXMgcmVsYXRpdmUgdG8gdGhlIGRlZmF1bHQgaW5pdGlhbCBjb250ZXh0LjwvbGk+CisgIDxsaT48c3Ryb25nPkhhc2h0YWJsZSBlbnZpcm9ubWVudDwvc3Ryb25nPiAtIFRoZSAocG9zc2libHkgbnVsbCkKKyAgICAgIGVudmlyb25tZW50IHRoYXQgaXMgdXNlZCBpbiBjcmVhdGluZyB0aGlzIG9iamVjdC4gIFRoaXMgaXMgZ2VuZXJhbGx5CisgICAgICBpZ25vcmVkIGluIFRvbWNhdCBvYmplY3QgZmFjdG9yaWVzLjwvbGk+CisgIDwvdWw+CisKKyAgPHA+VG8gY3JlYXRlIGEgcmVzb3VyY2UgZmFjdG9yeSB0aGF0IGtub3dzIGhvdyB0byBwcm9kdWNlIDxjb2RlPk15QmVhbjwvY29kZT4KKyAgaW5zdGFuY2VzLCB5b3UgbWlnaHQgY3JlYXRlIGEgY2xhc3MgbGlrZSB0aGlzOjwvcD4KKworPHNvdXJjZT4KK3BhY2thZ2UgY29tLm15Y29tcGFueTsKKworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmF4Lm5hbWluZy5Db250ZXh0OworaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1lOworaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1pbmdFeGNlcHRpb247CitpbXBvcnQgamF2YXgubmFtaW5nLlJlZkFkZHI7CitpbXBvcnQgamF2YXgubmFtaW5nLlJlZmVyZW5jZTsKK2ltcG9ydCBqYXZheC5uYW1pbmcuc3BpLk9iamVjdEZhY3Rvcnk7CisKK3B1YmxpYyBjbGFzcyBNeUJlYW5GYWN0b3J5IGltcGxlbWVudHMgT2JqZWN0RmFjdG9yeSB7CisKKyAgcHVibGljIE9iamVjdCBnZXRPYmplY3RJbnN0YW5jZShPYmplY3Qgb2JqLAorICAgICAgTmFtZSBuYW1lLCBDb250ZXh0IG5hbWVDdHgsIEhhc2h0YWJsZSBlbnZpcm9ubWVudCkKKyAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworCisgICAgICAvLyBBY3F1aXJlIGFuIGluc3RhbmNlIG9mIG91ciBzcGVjaWZpZWQgYmVhbiBjbGFzcworICAgICAgTXlCZWFuIGJlYW4gPSBuZXcgTXlCZWFuKCk7CisKKyAgICAgIC8vIEN1c3RvbWl6ZSB0aGUgYmVhbiBwcm9wZXJ0aWVzIGZyb20gb3VyIGF0dHJpYnV0ZXMKKyAgICAgIFJlZmVyZW5jZSByZWYgPSAoUmVmZXJlbmNlKSBvYmo7CisgICAgICBFbnVtZXJhdGlvbiBhZGRycyA9IHJlZi5nZXRBbGwoKTsKKyAgICAgIHdoaWxlIChhZGRycy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgIFJlZkFkZHIgYWRkciA9IChSZWZBZGRyKSBhZGRycy5uZXh0RWxlbWVudCgpOworICAgICAgICAgIFN0cmluZyBuYW1lID0gYWRkci5nZXRUeXBlKCk7CisgICAgICAgICAgU3RyaW5nIHZhbHVlID0gKFN0cmluZykgYWRkci5nZXRDb250ZW50KCk7CisgICAgICAgICAgaWYgKG5hbWUuZXF1YWxzKCJmb28iKSkgeworICAgICAgICAgICAgICBiZWFuLnNldEZvbyh2YWx1ZSk7CisgICAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscygiYmFyIikpIHsKKyAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgIGJlYW4uc2V0QmFyKEludGVnZXIucGFyc2VJbnQodmFsdWUpKTsKKyAgICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBOYW1pbmdFeGNlcHRpb24oIkludmFsaWQgJ2JhcicgdmFsdWUgIiArIHZhbHVlKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLy8gUmV0dXJuIHRoZSBjdXN0b21pemVkIGluc3RhbmNlCisgICAgICByZXR1cm4gKGJlYW4pOworCisgIH0KKworfQorPC9zb3VyY2U+CisKKyAgPHA+SW4gdGhpcyBleGFtcGxlLCB3ZSBhcmUgdW5jb25kaXRpb25hbGx5IGNyZWF0aW5nIGEgbmV3IGluc3RhbmNlIG9mCisgIHRoZSA8Y29kZT5jb20ubXljb21wYW55Lk15QmVhbjwvY29kZT4gY2xhc3MsIGFuZCBwb3B1bGF0aW5nIGl0cyBwcm9wZXJ0aWVzCisgIGJhc2VkIG9uIHRoZSBwYXJhbWV0ZXJzIGluY2x1ZGVkIGluIHRoZSA8Y29kZT4mbHQ7UmVzb3VyY2VQYXJhbXMmZ3Q7PC9jb2RlPgorICBlbGVtZW50IHRoYXQgY29uZmlndXJlcyB0aGlzIGZhY3RvcnkgKHNlZSBiZWxvdykuICBZb3Ugc2hvdWxkIG5vdGUgdGhhdCBhbnkKKyAgcGFyYW1ldGVyIG5hbWVkIDxjb2RlPmZhY3Rvcnk8L2NvZGU+IHNob3VsZCBiZSBza2lwcGVkIC0gdGhhdCBwYXJhbWV0ZXIgaXMKKyAgdXNlZCB0byBzcGVjaWZ5IHRoZSBuYW1lIG9mIHRoZSBmYWN0b3J5IGNsYXNzIGl0c2VsZiAoaW4gdGhpcyBjYXNlLAorICA8Y29kZT5jb20ubXljb21wYW55Lk15QmVhbkZhY3Rvcnk8L2NvZGU+KSByYXRoZXIgdGhhbiBhIHByb3BlcnR5IG9mIHRoZQorICBiZWFuIGJlaW5nIGNvbmZpZ3VyZWQuPC9wPgorCisgIDxwPkZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IDxjb2RlPk9iamVjdEZhY3Rvcnk8L2NvZGU+LCBzZWUgdGhlCisgIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvam5kaS9kb2NzLmh0bWwiPkpOREkgMS4yIFNlcnZpY2UKKyAgUHJvdmlkZXIgSW50ZXJmYWNlIChTUEkpIFNwZWNpZmljYXRpb248L2E+LjwvcD4KKworICA8cD5Zb3Ugd2lsbCBuZWVkIHRvIGNvbXBpbGUgdGhpcyBjbGFzcyBhZ2FpbnN0IGEgY2xhc3MgcGF0aCB0aGF0IGluY2x1ZGVzCisgIGFsbCBvZiB0aGUgSkFSIGZpbGVzIGluIHRoZSA8Y29kZT4kQ0FUQUxJTkFfSE9NRS9jb21tb24vbGliPC9jb2RlPiBhbmQKKyAgPGNvZGU+JENBVEFMSU5BX0hPTUUvc2VydmVyL2xpYjwvY29kZT4gZGlyZWN0b3JpZXMuICBXaGVuIHlvdSBhcmUgdGhyb3VnaCwKKyAgcGxhY2UgdGhlIGZhY3RvcnkgY2xhc3MgKGFuZCB0aGUgY29ycmVzcG9uZGluZyBiZWFuIGNsYXNzKSB1bnBhY2tlZCB1bmRlcgorICA8Y29kZT4kQ0FUQUxJTkFfSE9NRS9jb21tb24vY2xhc3NlczwvY29kZT4sIG9yIGluIGEgSkFSIGZpbGUgaW5zaWRlCisgIDxjb2RlPiRDQVRBTElOQV9IT01FL2NvbW1vbi9saWI8L2NvZGU+LiAgSW4gdGhpcyB3YXksIHRoZSByZXF1aXJlZCBjbGFzcworICBmaWxlcyBhcmUgdmlzaWJsZSB0byBib3RoIENhdGFsaW5hIGludGVybmFsIHJlc291cmNlcyBhbmQgeW91ciB3ZWIKKyAgYXBwbGljYXRpb24uPC9wPgorCisgIDxoMz4yLiAgRGVjbGFyZSBZb3VyIFJlc291cmNlIFJlcXVpcmVtZW50czwvaDM+CisKKyAgPHA+TmV4dCwgbW9kaWZ5IHlvdXIgd2ViIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQgZGVzY3JpcHRvcgorICAoPGNvZGU+L1dFQi1JTkYvd2ViLnhtbDwvY29kZT4pIHRvIGRlY2xhcmUgdGhlIEpOREkgbmFtZSB1bmRlciB3aGljaAorICB5b3Ugd2lsbCByZXF1ZXN0IG5ldyBpbnN0YW5jZXMgb2YgdGhpcyBiZWFuLiAgVGhlIHNpbXBsZXN0IGFwcHJvYWNoIGlzCisgIHRvIHVzZSBhIDxjb2RlPiZsdDtyZXNvdXJjZS1lbnYtcmVmJmd0OzwvY29kZT4gZWxlbWVudCwgbGlrZSB0aGlzOjwvcD4KKworPHNvdXJjZT4KKyZsdDtyZXNvdXJjZS1lbnYtcmVmJmd0OworICAmbHQ7ZGVzY3JpcHRpb24mZ3Q7CisgICAgT2JqZWN0IGZhY3RvcnkgZm9yIE15QmVhbiBpbnN0YW5jZXMuCisgICZsdDsvZGVzY3JpcHRpb24mZ3Q7CisgICZsdDtyZXNvdXJjZS1lbnYtcmVmLW5hbWUmZ3Q7CisgICAgYmVhbi9NeUJlYW5GYWN0b3J5CisgICZsdDsvcmVzb3VyY2UtZW52LXJlZi1uYW1lJmd0OworICAmbHQ7cmVzb3VyY2UtZW52LXJlZi10eXBlJmd0OworICAgIGNvbS5teWNvbXBhbnkuTXlCZWFuCisgICZsdDsvcmVzb3VyY2UtZW52LXJlZi10eXBlJmd0OworJmx0O3Jlc291cmNlLWVudi1yZWYmZ3Q7Cis8L3NvdXJjZT4KKworICAgIDxwPjxzdHJvbmc+V0FSTklORzwvc3Ryb25nPiAtIEJlIHN1cmUgeW91IHJlc3BlY3QgdGhlIGVsZW1lbnQgb3JkZXJpbmcKKyAgICB0aGF0IGlzIHJlcXVpcmVkIGJ5IHRoZSBEVEQgZm9yIHdlYiBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIQorICAgIFNlZSB0aGUKKyAgICA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL3NlcnZsZXQvZG93bmxvYWQuaHRtbCI+U2VydmxldAorICAgIFNwZWNpZmljYXRpb248L2E+IGZvciBkZXRhaWxzLjwvcD4KKworICA8aDM+My4gIENvZGUgWW91ciBBcHBsaWNhdGlvbidzIFVzZSBPZiBUaGlzIFJlc291cmNlPC9oMz4KKworICA8cD5BIHR5cGljYWwgdXNlIG9mIHRoaXMgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlIG1pZ2h0IGxvb2sKKyAgbGlrZSB0aGlzOjwvcD4KKworPHNvdXJjZT4KK0NvbnRleHQgaW5pdEN0eCA9IG5ldyBJbml0aWFsQ29udGV4dCgpOworQ29udGV4dCBlbnZDdHggPSAoQ29udGV4dCkgaW5pdEN0eC5sb29rdXAoImphdmE6Y29tcC9lbnYiKTsKK015QmVhbiBiZWFuID0gKE15QmVhbikgZW52Q3R4Lmxvb2t1cCgiYmVhbi9NeUJlYW5GYWN0b3J5Iik7CisKK3dyaXRlci5wcmludGxuKCJmb28gPSAiICsgYmVhbi5nZXRGb28oKSArICIsIGJhciA9ICIgKworICAgICAgICAgICAgICAgYmVhbi5nZXRCYXIoKSk7Cis8L3NvdXJjZT4KKworICAgIDxoMz40LiAgQ29uZmlndXJlIFRvbWNhdCdzIFJlc291cmNlIEZhY3Rvcnk8L2gzPgorCisgICAgPHA+VG8gY29uZmlndXJlIFRvbWNhdCdzIHJlc291cmNlIGZhY3RvcnksIGFkZCBhbiBlbGVtZW50cyBsaWtlIHRoaXMgdG8gdGhlCisgICAgPGNvZGU+JENBVEFMSU5BX0hPTUUvY29uZi9zZXJ2ZXIueG1sPC9jb2RlPiBmaWxlLCBuZXN0ZWQgaW5zaWRlIHRoZQorICAgIDxjb2RlPkNvbnRleHQ8L2NvZGU+IGVsZW1lbnQgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLjwvcD4KKzxzb3VyY2U+CismbHQ7Q29udGV4dCAuLi4mZ3Q7CisgIC4uLgorICAmbHQ7UmVzb3VyY2UgbmFtZT0iYmVhbi9NeUJlYW5GYWN0b3J5IiBhdXRoPSJDb250YWluZXIiCisgICAgICAgICAgICB0eXBlPSJjb20ubXljb21wYW55Lk15QmVhbiIKKyAgICAgICAgICAgIGZhY3Rvcnk9ImNvbS5teWNvbXBhbnkuTXlCZWFuRmFjdG9yeSIKKyAgICAgICAgICAgIGJhcj0iMjMiLyZndDsKKyAgLi4uCismbHQ7L0NvbnRleHQmZ3Q7Cis8L3NvdXJjZT4KKworICAgIDxwPk5vdGUgdGhhdCB0aGUgcmVzb3VyY2UgbmFtZSAoaGVyZSwgPGNvZGU+YmVhbi9NeUJlYW5GYWN0b3J5PC9jb2RlPgorICAgIG11c3QgbWF0Y2ggdGhlIHZhbHVlIHNwZWNpZmllZCBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQKKyAgICBkZXNjcmlwdG9yLiAgV2UgYXJlIGFsc28gaW5pdGlhbGl6aW5nIHRoZSB2YWx1ZSBvZiB0aGUgPGNvZGU+YmFyPC9jb2RlPgorICAgIHByb3BlcnR5LCB3aGljaCB3aWxsIGNhdXNlIDxjb2RlPnNldEJhcigyMyk8L2NvZGU+IHRvIGJlIGNhbGxlZCBiZWZvcmUKKyAgICB0aGUgbmV3IGJlYW4gaXMgcmV0dXJuZWQuICBCZWNhdXNlIHdlIGFyZSBub3QgaW5pdGlhbGl6aW5nIHRoZQorICAgIDxjb2RlPmZvbzwvY29kZT4gcHJvcGVydHkgKGFsdGhvdWdoIHdlIGNvdWxkIGhhdmUpLCB0aGUgYmVhbiB3aWxsCisgICAgY29udGFpbiB3aGF0ZXZlciBkZWZhdWx0IHZhbHVlIGlzIHNldCB1cCBieSBpdHMgY29uc3RydWN0b3IuPC9wPgorCisgICAgPHA+WW91IHdpbGwgYWxzbyBub3RlIHRoYXQsIGZyb20gdGhlIGFwcGxpY2F0aW9uIGRldmVsb3BlcidzIHBlcnNwZWN0aXZlLAorICAgIHRoZSBkZWNsYXJhdGlvbiBvZiB0aGUgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlLCBhbmQgdGhlIHByb2dyYW1taW5nCisgICAgdXNlZCB0byByZXF1ZXN0IG5ldyBpbnN0YW5jZXMsIGlzIGlkZW50aWNhbCB0byB0aGUgYXBwcm9hY2ggdXNlZCBmb3IgdGhlCisgICAgPGVtPkdlbmVyaWMgSmF2YUJlYW4gUmVzb3VyY2VzPC9lbT4gZXhhbXBsZS4gIFRoaXMgaWxsdXN0cmF0ZXMgb25lIG9mIHRoZQorICAgIGFkdmFudGFnZXMgb2YgdXNpbmcgSk5ESSByZXNvdXJjZXMgdG8gZW5jYXBzdWxhdGUgZnVuY3Rpb25hbGl0eSAtIHlvdSBjYW4KKyAgICBjaGFuZ2UgdGhlIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24gd2l0aG91dCBuZWNlc3NhcmlseSBoYXZpbmcgdG8KKyAgICBtb2RpZnkgYXBwbGljYXRpb25zIHVzaW5nIHRoZSByZXNvdXJjZXMsIGFzIGxvbmcgYXMgeW91IG1haW50YWluCisgICAgY29tcGF0aWJsZSBBUElzLjwvcD4KKworPC9zZWN0aW9uPgorCisKKworPC9ib2R5PgorCis8L2RvY3VtZW50PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9tYW5hZ2VyLWhvd3RvLnhtbCBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvbWFuYWdlci1ob3d0by54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg3ODcyNAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvbWFuYWdlci1ob3d0by54bWwKQEAgLTAsMCArMSwxMDkzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhRE9DVFlQRSBkb2N1bWVudCBbCisgIDwhRU5USVRZIHByb2plY3QgU1lTVEVNICJwcm9qZWN0LnhtbCI+CitdPgorPGRvY3VtZW50IHVybD0ibWFuYWdlci1ob3d0by5odG1sIj4KKworICAgICZwcm9qZWN0OworCisgICAgPHByb3BlcnRpZXM+CisgICAgICAgIDxhdXRob3IgZW1haWw9ImNyYWlnbWNjQGFwYWNoZS5vcmciPkNyYWlnIFIuIE1jQ2xhbmFoYW48L2F1dGhvcj4KKyAgICAgICAgPHRpdGxlPk1hbmFnZXIgQXBwIEhPVy1UTzwvdGl0bGU+CisgICAgPC9wcm9wZXJ0aWVzPgorCis8Ym9keT4KKworPHNlY3Rpb24gbmFtZT0iVGFibGUgb2YgQ29udGVudHMiPgorCis8cD4KKzxhIGhyZWY9IiNJbnRyb2R1Y3Rpb24iPkludHJvZHVjdGlvbjwvYT48YnIgLz4KKzxhIGhyZWY9IiNDb25maWd1cmluZyBNYW5hZ2VyIEFwcGxpY2F0aW9uIEFjY2VzcyI+CitDb25maWd1cmluZyBNYW5hZ2VyIEFwcGxpY2F0aW9uIEFjY2VzczwvYT48YnIgLz4KKzxhIGhyZWY9IiNTdXBwb3J0ZWQgTWFuYWdlciBDb21tYW5kcyI+U3VwcG9ydGVkIE1hbmFnZXIgQ29tbWFuZHM8L2E+PGJyIC8+Cis8YmxvY2txdW90ZT4KKzxhIGhyZWY9IiNEZXBsb3kgQSBOZXcgQXBwbGljYXRpb24gUmVtb3RlbHkiPkRlcGxveSBBIE5ldyBBcHBsaWNhdGlvbiBSZW1vdGVseTwvYT48YnIgLz4KKzxhIGhyZWY9IiNEZXBsb3kgQSBOZXcgQXBwbGljYXRpb24gZnJvbSBhIExvY2FsIFBhdGgiPkRlcGxveSBBIE5ldyBBcHBsaWNhdGlvbiBmcm9tIGEgTG9jYWwgUGF0aDwvYT48YnIgLz4KKzxhIGhyZWY9IiNMaXN0IEN1cnJlbnRseSBEZXBsb3llZCBhbmQgSW5zdGFsbGVkIEFwcGxpY2F0aW9ucyI+CitMaXN0IEN1cnJlbnRseSBEZXBsb3llZCBhbmQgSW5zdGFsbGVkIEFwcGxpY2F0aW9uczwvYT48YnIgLz4KKzxhIGhyZWY9IiNSZWxvYWQgQW4gRXhpc3RpbmcgQXBwbGljYXRpb24iPlJlbG9hZCBBbiBFeGlzdGluZyBBcHBsaWNhdGlvbjwvYT48YnIgLz4KKzxhIGhyZWY9IiNMaXN0IE9TIGFuZCBKVk0gUHJvcGVydGllcyI+TGlzdCBPUyBhbmQgSlZNIFByb3BlcnRpZXM8L2E+PGJyIC8+Cis8YSBocmVmPSIjTGlzdCBBdmFpbGFibGUgR2xvYmFsIEpOREkgUmVzb3VyY2VzIj4KK0xpc3QgQXZhaWxhYmxlIEdsb2JhbCBKTkRJIFJlc291cmNlczwvYT48YnIgLz4KKzxhIGhyZWY9IiNMaXN0IEF2YWlsYWJsZSBTZWN1cml0eSBSb2xlcyI+TGlzdCBBdmFpbGFibGUgU2VjdXJpdHkgUm9sZXM8L2E+PGJyIC8+Cis8YSBocmVmPSIjU2Vzc2lvbiBTdGF0aXN0aWNzIj5TZXNzaW9uIFN0YXRpc3RpY3M8L2E+PGJyIC8+Cis8YSBocmVmPSIjU3RhcnQgYW4gRXhpc3RpbmcgQXBwbGljYXRpb24iPlN0YXJ0IGFuIEV4aXN0aW5nIEFwcGxpY2F0aW9uPC9hPjxiciAvPgorPGEgaHJlZj0iI1N0b3AgYW4gRXhpc3RpbmcgQXBwbGljYXRpb24iPlN0b3AgYW4gRXhpc3RpbmcgQXBwbGljYXRpb248L2E+PGJyIC8+Cis8YSBocmVmPSIjVW5kZXBsb3kgYW4gRXhpc3RpbmcgQXBwbGljYXRpb24iPgorVW5kZXBsb3kgYW4gRXhpc3RpbmcgQXBwbGljYXRpb248L2E+PGJyIC8+Cis8L2Jsb2NrcXVvdGU+Cis8YSBocmVmPSIjRXhlY3V0aW5nIE1hbmFnZXIgQ29tbWFuZHMgV2l0aCBBbnQiPgorRXhlY3V0aW5nIE1hbmFnZXIgQ29tbWFuZHMgV2l0aCBBbnQ8L2E+PGJyIC8+Cis8YSBocmVmPSIjVXNpbmcgdGhlIEpNWCBQcm94eSBTZXJ2bGV0Ij4KK1VzaW5nIHRoZSBKTVggUHJveHkgU2VydmxldDwvYT48YnIgLz4KKzxibG9ja3F1b3RlPgorPGEgaHJlZj0iI1doYXQgaXMgSk1YIFByb3h5IFNlcnZsZXQiPldoYXQgaXMgSk1YIFByb3h5IFNlcnZsZXQ/PC9hPjxiciAvPgorPGEgaHJlZj0iI0pNWCBRdWVyeSBjb21tYW5kIj5RdWVyeSBjb21tYW5kPC9hPjxiciAvPgorPGEgaHJlZj0iI0pNWCBTZXQgY29tbWFuZCI+U2V0IGNvbW1hbmQ8L2E+PGJyIC8+Cis8L2Jsb2NrcXVvdGU+Cis8L3A+CisKKzwvc2VjdGlvbj4KKworPHNlY3Rpb24gbmFtZT0iSW50cm9kdWN0aW9uIj4KKworPHA+SW4gbWFueSBwcm9kdWN0aW9uIGVudmlyb25tZW50cywgaXQgaXMgdmVyeSB1c2VmdWwgdG8gaGF2ZSB0aGUgY2FwYWJpbGl0eQordG8gZGVwbG95IGEgbmV3IHdlYiBhcHBsaWNhdGlvbiwgb3IgdW5kZXBsb3kgYW4gZXhpc3Rpbmcgb25lLCB3aXRob3V0IGhhdmluZwordG8gc2h1dCBkb3duIGFuZCByZXN0YXJ0IHRoZSBlbnRpcmUgY29udGFpbmVyLiAgSW4gYWRkaXRpb24sIHlvdSBjYW4gcmVxdWVzdAorYW4gZXhpc3RpbmcgYXBwbGljYXRpb24gdG8gcmVsb2FkIGl0c2VsZiwgZXZlbiBpZiB5b3UgaGF2ZSBub3QgZGVjbGFyZWQgaXQKK3RvIGJlIDxjb2RlPnJlbG9hZGFibGU8L2NvZGU+IGluIHRoZSBUb21jYXQgNSBzZXJ2ZXIKK2NvbmZpZ3VyYXRpb24gZmlsZS48L3A+CisKKzxwPlRvIHN1cHBvcnQgdGhlc2UgY2FwYWJpbGl0aWVzLCBUb21jYXQgNSBpbmNsdWRlcyBhIHdlYiBhcHBsaWNhdGlvbgorKGluc3RhbGxlZCBieSBkZWZhdWx0IG9uIGNvbnRleHQgcGF0aCA8Y29kZT4vbWFuYWdlcjwvY29kZT4pIHRoYXQgc3VwcG9ydHMKK3RoZSBmb2xsb3dpbmcgZnVuY3Rpb25zOjwvcD4KKzx1bD4KKzxsaT5EZXBsb3kgYSBuZXcgd2ViIGFwcGxpY2F0aW9uLCBvbiBhIHNwZWNpZmllZCBjb250ZXh0IHBhdGgsIGZyb20KKyAgICB0aGUgdXBsb2FkZWQgY29udGVudHMgb2YgYSBXQVIgZmlsZS48L2xpPgorPGxpPkluc3RhbGwgYSBuZXcgd2ViIGFwcGxpY2F0aW9uLCB3aGljaCBjYW4gYmUgYW55d2hlcmUgb24gdGhlCisgICAgc2VydmVyJ3MgZGlza3MuPC9saT4KKzxsaT5MaXN0IHRoZSBjdXJyZW50bHkgZGVwbG95ZWQgd2ViIGFwcGxpY2F0aW9ucywgYXMgd2VsbCBhcyB0aGUKKyAgICBzZXNzaW9ucyB0aGF0IGFyZSBjdXJyZW50bHkgYWN0aXZlIGZvciB0aG9zZSB3ZWIgYXBwcy48L2xpPgorPGxpPlJlbG9hZCBhbiBleGlzdGluZyB3ZWIgYXBwbGljYXRpb24sIHRvIHJlZmxlY3QgY2hhbmdlcyBpbiB0aGUKKyAgICBjb250ZW50cyBvZiA8Y29kZT4vV0VCLUlORi9jbGFzc2VzPC9jb2RlPiBvciA8Y29kZT4vV0VCLUlORi9saWI8L2NvZGU+LgorICAgIDwvbGk+Cis8bGk+TGlzdCB0aGUgT1MgYW5kIEpWTSBwcm9wZXJ0eSB2YWx1ZXMuPC9saT4KKzxsaT5MaXN0IHRoZSBhdmFpbGFibGUgZ2xvYmFsIEpOREkgcmVzb3VyY2VzLCBmb3IgdXNlIGluIGRlcGxveW1lbnQKKyAgICB0b29scyB0aGF0IGFyZSBwcmVwYXJpbmcgPGNvZGU+Jmx0O1Jlc291cmNlTGluayZndDs8L2NvZGU+IGVsZW1lbnRzCisgICAgbmVzdGVkIGluIGEgPGNvZGU+Jmx0O0NvbnRleHQmZ3Q7PC9jb2RlPiBkZXBsb3ltZW50IGRlc2NyaXB0aW9uLjwvbGk+Cis8bGk+TGlzdCB0aGUgYXZhaWxhYmxlIHNlY3VyaXR5IHJvbGVzIGRlZmluZWQgaW4gdGhlIHVzZXIgZGF0YWJhc2UuPC9saT4KKzxsaT5SZW1vdmUgYW4gaW5zdGFsbGVkIHdlYiBhcHBsaWNhdGlvbi48L2xpPgorPGxpPlN0YXJ0IGEgc3RvcHBlZCBhcHBsaWNhdGlvbiAodGh1cyBtYWtpbmcgaXQgYXZhaWxhYmxlIGFnYWluKS48L2xpPgorPGxpPlN0b3AgYW4gZXhpc3RpbmcgYXBwbGljYXRpb24gKHNvIHRoYXQgaXQgYmVjb21lcyB1bmF2YWlsYWJsZSksIGJ1dAorICAgIGRvIG5vdCB1bmRlcGxveSBpdC48L2xpPgorPGxpPlVuZGVwbG95IGEgZGVwbG95ZWQgd2ViIGFwcGxpY2F0aW9uIGFuZCBkZWxldGUgaXRzIGRvY3VtZW50IGJhc2UKKyAgICBkaXJlY3RvcnkuPC9saT4KKzwvdWw+CisKKzxwPlRoZXJlIGFyZSB0d28gd2F5cyB0byBjb25maWd1cmUgdGhlIE1hbmFnZXIgd2ViIGFwcGxpY2F0aW9uCis8Y29kZT5Db250ZXh0PC9jb2RlPjoKKzx1bD4KKzxsaT5JbnN0YWxsIHRoZSA8Y29kZT5tYW5hZ2VyLnhtbDwvY29kZT4gY29udGV4dCBjb25maWd1cmF0aW9uIGZpbGUKKyAgICBpbiB0aGUgPGNvZGU+JENBVEFMSU5BX0hPTUUvY29uZi9bZW5naW5lbmFtZV0vW2hvc3RuYW1lXTwvY29kZT4gZm9sZGVyLgorPC9saT4KKzxsaT5Db25maWd1cmUgdGhlIE1hbmFnZXIgPGNvZGU+Q29udGV4dDwvY29kZT4gd2l0aGluIHRoZQorICAgIDxjb2RlPkhvc3Q8L2NvZGU+IGNvbmZpZ3VyYXRpb24gaW4geW91ciBUb21jYXQgPGNvZGU+c2VydmVyLnhtbDwvY29kZT4KKyAgICBjb25maWd1cmF0aW9uLiBIZXJlIGlzIGFuIGV4YW1wbGU6Cis8cHJlPgorJmx0O0NvbnRleHQgcGF0aD0iL21hbmFnZXIiIGRlYnVnPSIwIiBwcml2aWxlZ2VkPSJ0cnVlIgorICAgICAgICAgZG9jQmFzZT0iL3Vzci9sb2NhbC9raW5ldGljL3RvbWNhdDUvc2VydmVyL3dlYmFwcHMvbWFuYWdlciImZ3Q7CismbHQ7L0NvbnRleHQmZ3Q7Cis8L3ByZT4KKzwvbGk+Cis8L3VsPgorPC9wPgorCis8cD5JZiB5b3UgaGF2ZSBUb21jYXQgY29uZmlndXJlZCB0byBzdXBwb3J0IG11bHRpcGxlIHZpcnR1YWwgaG9zdHMKKyh3ZWJzaXRlcykgeW91IHdvdWxkIG5lZWQgdG8gY29uZmlndXJlIGEgTWFuYWdlciBmb3IgZWFjaC48L3A+CisKKzxwPlRoZXJlIGFyZSB0aHJlZSB3YXlzIHRvIHVzZSB0aGUgPGNvZGU+TWFuYWdlcjwvY29kZT4gd2ViIGFwcGxpY2F0aW9uLgorPHVsPgorPGxpPkFzIGFuIGFwcGxpY2F0aW9uIHdpdGggYSB1c2VyIGludGVyZmFjZSB5b3UgdXNlIGluIHlvdXIgYnJvd3Nlci4KK0hlcmUgaXMgYW4gZXhhbXBsZSBVUkwgd2hlcmUgeW91IGNhbiByZXBsYWNlIDxjb2RlPmxvY2FsaG9zdDwvY29kZT4gd2l0aAoreW91ciB3ZWJzaXRlIGhvc3QgbmFtZTogIDxjb2RlPmh0dHA6Ly9sb2NhbGhvc3QvbWFuYWdlci9odG1sLzwvY29kZT4gLjwvbGk+Cis8bGk+QSBtaW5pbWFsIHZlcnNpb24gdXNpbmcgSFRUUCByZXF1ZXN0cyBvbmx5IHdoaWNoIGlzIHN1aXRhYmxlIGZvciB1c2UKK2J5IHNjcmlwdHMgc2V0dXAgYnkgc3lzdGVtIGFkbWluaXN0cmF0b3JzLiAgQ29tbWFuZHMgYXJlIGdpdmVuIGFzIHBhcnQgb2YgdGhlCityZXF1ZXN0IFVSSSwgYW5kIHJlc3BvbnNlcyBhcmUgaW4gdGhlIGZvcm0gb2Ygc2ltcGxlIHRleHQgdGhhdCBjYW4gYmUgZWFzaWx5CitwYXJzZWQgYW5kIHByb2Nlc3NlZC4gIFNlZSA8YSBocmVmPSIjU3VwcG9ydGVkIE1hbmFnZXIgQ29tbWFuZHMiPgorU3VwcG9ydGVkIE1hbmFnZXIgQ29tbWFuZHM8L2E+IGZvciBtb3JlIGluZm9ybWF0aW9uLjwvbGk+Cis8bGk+QSBjb252ZW5pZW50IHNldCBvZiB0YXNrIGRlZmluaXRpb25zIGZvciB0aGUgPGVtPkFudDwvZW0+CisodmVyc2lvbiAxLjQgb3IgbGF0ZXIpIGJ1aWxkIHRvb2wuICBTZWUKKzxhIGhyZWY9IiNFeGVjdXRpbmcgTWFuYWdlciBDb21tYW5kcyBXaXRoIEFudCI+RXhlY3V0aW5nIE1hbmFnZXIgQ29tbWFuZHMKK1dpdGggQW50PC9hPiBmb3IgbW9yZSBpbmZvcm1hdGlvbi48L2xpPgorPC91bD4KKzwvcD4KKworPHA+RnV0dXJlIHZlcnNpb25zIG9mIFRvbWNhdCA1IHdpbGwgaW5jbHVkZSBhZG1pbmlzdHJhdGl2ZSBmdW5jdGlvbmFsaXR5IHRoYXQKK2lzIHByZXNlbnRlZCBpbiAoYXQgbGVhc3QpIHRoZSBmb2xsb3dpbmcgZm9ybXM6Cis8dWw+Cis8bGk+QXMgd2ViIHNlcnZpY2VzLCBzbyB0aGF0IFRvbWNhdCBhZG1pbmlzdHJhdGlvbiBjYW4gYmUgZWFzaWx5IGludGVncmF0ZWQKKyAgICBpbnRvIHJlbW90ZSBhbmQvb3Igbm9uLUphdmEgbW5hZ2VtZW50IGVudmlyb25tZW50cy48L2xpPgorPGxpPkFzIGEgd2ViIGFwcGxpY2F0aW9uIHdpdGggYSBuaWNlIHVzZXIgaW50ZXJmYWNlIChidWlsdCBvbiB0b3Agb2YgdGhlCisgICAgd2ViIHNlcnZpY2VzIHByb2Nlc3NpbmcgbGF5ZXIpIGZvciBlYXN5IFRvbWNhdCBhZG1pbmlzdHJhdGlvbiB2aWEgYQorICAgIHdlYiBicm93c2VyLjwvbGk+Cis8L3VsPgorPC9wPgorCis8L3NlY3Rpb24+CisKKzxzZWN0aW9uIG5hbWU9IkNvbmZpZ3VyaW5nIE1hbmFnZXIgQXBwbGljYXRpb24gQWNjZXNzIj4KKworICAgIDxibG9ja3F1b3RlPjxlbT4KKyAgICA8cD5UaGUgZGVzY3JpcHRpb24gYmVsb3cgdXNlcyB0aGUgdmFyaWFibGUgbmFtZSAkQ0FUQUxJTkFfSE9NRQorICAgIHRvIHJlZmVyIHRvIHRoZSBkaXJlY3RvcnkgaW50byB3aGljaCB5b3UgaGF2ZSBpbnN0YWxsZWQgVG9tY2F0IDUsCisgICAgYW5kIGlzIHRoZSBiYXNlIGRpcmVjdG9yeSBhZ2FpbnN0IHdoaWNoIG1vc3QgcmVsYXRpdmUgcGF0aHMgYXJlCisgICAgcmVzb2x2ZWQuICBIb3dldmVyLCBpZiB5b3UgaGF2ZSBjb25maWd1cmVkIFRvbWNhdCA1IGZvciBtdWx0aXBsZQorICAgIGluc3RhbmNlcyBieSBzZXR0aW5nIGEgQ0FUQUxJTkFfQkFTRSBkaXJlY3RvcnksIHlvdSBzaG91bGQgdXNlCisgICAgJENBVEFMSU5BX0JBU0UgaW5zdGVhZCBvZiAkQ0FUQUxJTkFfSE9NRSBmb3IgZWFjaCBvZiB0aGVzZQorICAgIHJlZmVyZW5jZXMuPC9wPgorICAgIDwvZW0+PC9ibG9ja3F1b3RlPgorCis8cD5JdCB3b3VsZCBiZSBxdWl0ZSB1bnNhZmUgdG8gc2hpcCBUb21jYXQgd2l0aCBkZWZhdWx0IHNldHRpbmdzIHRoYXQgYWxsb3dlZAorYW55b25lIG9uIHRoZSBJbnRlcm5ldCB0byBleGVjdXRlIHRoZSBNYW5hZ2VyIGFwcGxpY2F0aW9uIG9uIHlvdXIgc2VydmVyLgorVGhlcmVmb3JlLCB0aGUgTWFuYWdlciBhcHBsaWNhdGlvbiBpcyBzaGlwcGVkIHdpdGggdGhlIHJlcXVpcmVtZW50IHRoYXQgYW55b25lCit3aG8gYXR0ZW1wdHMgdG8gdXNlIGl0IG11c3QgYXV0aGVudGljYXRlIHRoZW1zZWx2ZXMsIHVzaW5nIGEgdXNlcm5hbWUgYW5kCitwYXNzd29yZCB0aGF0IGhhdmUgdGhlIHJvbGUgPHN0cm9uZz5tYW5hZ2VyPC9zdHJvbmc+IGFzc29jaWF0ZWQgd2l0aCB0aGVtLgorRnVydGhlciwgdGhlcmUgaXMgbm8gdXNlcm5hbWUgaW4gdGhlIGRlZmF1bHQgdXNlcnMgZmlsZQorKDxjb25mPiRDQVRBTElOQV9IT01FL2NvbmYvdG9tY2F0LXVzZXJzLnhtbDwvY29uZj4pIHRoYXQgaXMgYXNzaWduZWQgdGhpcworcm9sZS4gIFRoZXJlZm9yZSwgYWNjZXNzIHRvIHRoZSBNYW5hZ2VyIGFwcGxpY2F0aW9uIGlzIGNvbXBsZXRlbHkgZGlzYWJsZWQKK2J5IGRlZmF1bHQuPC9wPgorCis8cD5UbyBlbmFibGUgYWNjZXNzIHRvIHRoZSBNYW5hZ2VyIHdlYiBhcHBsaWNhdGlvbiwgeW91IG11c3QgZWl0aGVyIGNyZWF0ZQorYSBuZXcgdXNlcm5hbWUvcGFzc3dvcmQgY29tYmluYXRpb24gYW5kIGFzc29jaWF0ZSB0aGUgcm9sZSBuYW1lCis8c3Ryb25nPm1hbmFnZXI8L3N0cm9uZz4gd2l0aCBpdCwgb3IgYWRkIHRoZSA8c3Ryb25nPm1hbmFnZXI8L3N0cm9uZz4gcm9sZQordG8gc29tZSBleGlzdGluZyB1c2VybmFtZS9wYXNzd29yZCBjb21iaW5hdGlvbi4gIEV4YWN0bHkgd2hlcmUgdGhpcyBpcyBkb25lCitkZXBlbmRzIG9uIHdoaWNoIDxjb2RlPlJlYWxtPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiB5b3UgYXJlIHVzaW5nOjwvcD4KKzx1bD4KKzxsaT48ZW0+TWVtb3J5UmVhbG08L2VtPiAtIElmIHlvdSBoYXZlIG5vdCBjdXN0b21pemVkIHlvdXIKKyAgICA8Y29kZT4kQ0FUQUxJTkFfSE9NRS9jb25mL3NlcnZlci54bWw8L2NvZGU+IHRvIHNlbGVjdCBhIGRpZmZlcmVudCBvbmUsCisgICAgVG9tY2F0IDUgZGVmYXVsdHMgdG8gYW4gWE1MLWZvcm1hdCBmaWxlIHN0b3JlZCBhdAorICAgIDxjb2RlPiRDQVRBTElOQV9IT01FL2NvbmYvdG9tY2F0LXVzZXJzLnhtbDwvY29kZT4sIHdoaWNoIGNhbiBiZQorICAgIGVkaXRlZCB3aXRoIGFueSB0ZXh0IGVkaXRvci4gIFRoaXMgZmlsZSBjb250YWlucyBhbiBYTUwKKyAgICA8Y29kZT4mbHQ7dXNlciZndDs8L2NvZGU+IGZvciBlYWNoIGluZGl2aWR1YWwgdXNlciwgd2hpY2ggbWlnaHQKKyAgICBsb29rIHNvbWV0aGluZyBsaWtlIHRoaXM6Cis8c291cmNlPgorJmx0O3VzZXIgbmFtZT0iY3JhaWdtY2MiIHBhc3N3b3JkPSJzZWNyZXQiIHJvbGVzPSJzdGFuZGFyZCxtYW5hZ2VyIiAvJmd0OworPC9zb3VyY2U+CisgICAgd2hpY2ggZGVmaW5lcyB0aGUgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIHVzZWQgYnkgdGhpcyBpbmRpdmlkdWFsIHRvCisgICAgbG9nIG9uLCBhbmQgdGhlIHJvbGUgbmFtZXMgaGUgb3Igc2hlIGlzIGFzc29jaWF0ZWQgd2l0aC4gIFlvdSBjYW4KKyAgICBhZGQgdGhlIDxzdHJvbmc+bWFuYWdlcjwvc3Ryb25nPiByb2xlIHRvIHRoZSBjb21tYS1kZWxpbWl0ZWQKKyAgICA8Y29kZT5yb2xlczwvY29kZT4gYXR0cmlidXRlIGZvciBvbmUgb3IgbW9yZSBleGlzdGluZyB1c2VycywgYW5kL29yCisgICAgY3JlYXRlIG5ldyB1c2VycyB3aXRoIHRoYXQgYXNzaWduZWQgcm9sZS48L2xpPgorPGxpPjxlbT5KREJDUmVhbG08L2VtPiAtIFlvdXIgdXNlciBhbmQgcm9sZSBpbmZvcm1hdGlvbiBpcyBzdG9yZWQgaW4KKyAgICBhIGRhdGFiYXNlIGFjY2Vzc2VkIHZpYSBKREJDLiAgQWRkIHRoZSA8c3Ryb25nPm1hbmFnZXI8L3N0cm9uZz4gcm9sZQorICAgIHRvIG9uZSBvciBtb3JlIGV4aXN0aW5nIHVzZXJzLCBhbmQvb3IgY3JlYXRlIG9uZSBvciBtb3JlIG5ldyB1c2VycworICAgIHdpdGggdGhpcyByb2xlIGFzc2lnbmVkLCBmb2xsb3dpbmcgdGhlIHN0YW5kYXJkIHByb2NlZHVyZXMgZm9yIHlvdXIKKyAgICBlbnZpcm9ubWVudC48L2xpPgorPGxpPjxlbT5KTkRJUmVhbG08L2VtPiAtIFlvdXIgdXNlciBhbmQgcm9sZSBpbmZvcm1hdGlvbiBpcyBzdG9yZWQgaW4KKyAgICBhIGRpcmVjdG9yeSBzZXJ2ZXIgYWNjZXNzZWQgdmlhIExEQVAuICBBZGQgdGhlIDxzdHJvbmc+bWFuYWdlcjwvc3Ryb25nPgorICAgIHJvbGUgdG8gb25lIG9yIG1vcmUgZXhpc3RpbmcgdXNlcnMsIGFuZC9vciBjcmVhdGUgb25lIG9yIG1vcmUgbmV3IHVzZXJzCisgICAgd2l0aCB0aGlzIHJvbGUgYXNzaWduZWQsIGZvbGxvd2luZyB0aGUgc3RhbmRhcmQgcHJvY2VkdXJlcyBmb3IgeW91cgorICAgIGVudmlyb25tZW50LjwvbGk+Cis8L3VsPgorCis8cD5UaGUgZmlyc3QgdGltZSB5b3UgYXR0ZW1wdCB0byBpc3N1ZSBvbmUgb2YgdGhlIE1hbmFnZXIgY29tbWFuZHMKK2Rlc2NyaWJlZCBpbiB0aGUgbmV4dCBzZWN0aW9uLCB5b3Ugd2lsbCBiZSBjaGFsbGVuZ2VkIHRvIGxvZyBvbiB1c2luZworQkFTSUMgYXV0aGVudGljYXRpb24uICBUaGUgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIHlvdSBlbnRlciBkbyBub3QgbWF0dGVyLAorYXMgbG9uZyBhcyB0aGV5IGlkZW50aWZ5IGEgdmFsaWQgdXNlciBpbiB0aGUgdXNlcnMgZGF0YWJhc2Ugd2hvIHBvc3Nlc3NlcwordGhlIHJvbGUgPHN0cm9uZz5tYW5hZ2VyPC9zdHJvbmc+LjwvcD4KKworPHA+SW4gYWRkaXRpb24gdG8gdGhlIHBhc3N3b3JkIHJlc3RyaWN0aW9ucyB0aGUgbWFuYWdlciB3ZWIgYXBwbGljYXRpb24KK2NvdWxkIGJlIHJlc3RyaWN0ZWQgYnkgdGhlIHJlbW90ZSBJUCBhZGRyZXNzIG9yIGhvc3QgYnkgYWRkaW5nIGEKKzxjb2RlPlJlbW90ZUFkZHJWYWx2ZTwvY29kZT4gb3IgPGNvZGU+UmVtb3RlSG9zdFZhbHZlPC9jb2RlPi4gIEhlcmUgaXMKK2FuIGV4YW1wbGUgb2YgcmVzdHJpY3RpbmcgYWNjZXNzIHRvIHRoZSBsb2NhbGhvc3QgYnkgSVAgYWRkcmVzczoKKzxwcmU+CismbHQ7Q29udGV4dCBwYXRoPSIvbWFuYWdlciIgZGVidWc9IjAiIHByaXZpbGVnZWQ9InRydWUiCisgICAgICAgICBkb2NCYXNlPSIvdXNyL2xvY2FsL2tpbmV0aWMvdG9tY2F0NS9zZXJ2ZXIvd2ViYXBwcy9tYW5hZ2VyIiZndDsKKyAgICAgICAgICZsdDtWYWx2ZSBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEudmFsdmVzLlJlbW90ZUFkZHJWYWx2ZSIKKyAgICAgICAgICAgICAgICBhbGxvdz0iMTI3LjAuMC4xIi8mZ3Q7CismbHQ7L0NvbnRleHQmZ3Q7Cis8L3ByZT4KKzwvcD4KKzwvc2VjdGlvbj4KKworCis8c2VjdGlvbiBuYW1lPSJTdXBwb3J0ZWQgTWFuYWdlciBDb21tYW5kcyI+CisKKzxwPkFsbCBjb21tYW5kcyB0aGF0IHRoZSBNYW5hZ2VyIGFwcGxpY2F0aW9uIGtub3dzIGhvdyB0byBwcm9jZXNzIGFyZQorc3BlY2lmaWVkIGluIGEgc2luZ2xlIHJlcXVlc3QgVVJJIGxpa2UgdGhpczo8L3A+Cis8c291cmNlPgoraHR0cDovL3tob3N0fTp7cG9ydH0vbWFuYWdlci97Y29tbWFuZH0/e3BhcmFtZXRlcnN9Cis8L3NvdXJjZT4KKzxwPndoZXJlIDxjb2RlPntob3N0fTwvY29kZT4gYW5kIDxjb2RlPntwb3J0fTwvY29kZT4gcmVwcmVzZW50IHRoZSBob3N0bmFtZQorYW5kIHBvcnQgbnVtYmVyIG9uIHdoaWNoIFRvbWNhdCBpcyBydW5uaW5nLCA8Y29kZT57Y29tbWFuZH08L2NvZGU+CityZXByZXNlbnRzIHRoZSBNYW5hZ2VyIGNvbW1hbmQgeW91IHdpc2ggdG8gZXhlY3V0ZSwgYW5kCis8Y29kZT57cGFyYW1ldGVyc308L2NvZGU+IHJlcHJlc2VudHMgdGhlIHF1ZXJ5IHBhcmFtZXRlcnMKK3RoYXQgYXJlIHNwZWNpZmljIHRvIHRoYXQgY29tbWFuZC4gIEluIHRoZSBpbGx1c3RyYXRpb25zIGJlbG93LCBjdXN0b21pemUKK3RoZSBob3N0IGFuZCBwb3J0IGFwcHJvcHJpYXRlbHkgZm9yIHlvdXIgaW5zdGFsbGF0aW9uLjwvcD4KKworPHA+TW9zdCBjb21tYW5kcyBhY2NlcHQgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBxdWVyeSBwYXJhbWV0ZXJzOjwvcD4KKzx1bD4KKzxsaT48c3Ryb25nPnBhdGg8L3N0cm9uZz4gLSBUaGUgY29udGV4dCBwYXRoIChpbmNsdWRpbmcgdGhlIGxlYWRpbmcgc2xhc2gpCisgICAgb2YgdGhlIHdlYiBhcHBsaWNhdGlvbiB5b3UgYXJlIGRlYWxpbmcgd2l0aC4gIFRvIHNlbGVjdCB0aGUgUk9PVCB3ZWIKKyAgICBhcHBsaWNhdGlvbiwgc3BlY2lmeSBhIHplcm8tbGVuZ3RoIHN0cmluZy4gIDxzdHJvbmc+Tk9URTwvc3Ryb25nPiAtCisgICAgSXQgaXMgbm90IHBvc3NpYmxlIHRvIHBlcmZvcm0gYWRtaW5pc3RyYXRpdmUgY29tbWFuZHMgb24gdGhlCisgICAgTWFuYWdlciBhcHBsaWNhdGlvbiBpdHNlbGYuPC9saT4KKzxsaT48c3Ryb25nPndhcjwvc3Ryb25nPiAtIFVSTCBvZiBhIHdlYiBhcHBsaWNhdGlvbiBhcmNoaXZlIChXQVIpIGZpbGUsCisgICAgcGF0aG5hbWUgb2YgYSBkaXJlY3Rvcnkgd2hpY2ggY29udGFpbnMgdGhlIHdlYiBhcHBsaWNhdGlvbiwgb3IgYQorICAgIENvbnRleHQgY29uZmlndXJhdGlvbiAiLnhtbCIgZmlsZS4gIFlvdSBjYW4gdXNlIFVSTHMgaW4gYW55IG9mIHRoZQorICAgIGZvbGxvd2luZyBmb3JtYXRzOgorICAgIDx1bD4KKyAgICA8bGk+PHN0cm9uZz5maWxlOi9hYnNvbHV0ZS9wYXRoL3RvL2EvZGlyZWN0b3J5PC9zdHJvbmc+IC0gVGhlIGFic29sdXRlCisgICAgICAgIHBhdGggb2YgYSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyB0aGUgdW5wYWNrZWQgdmVyc2lvbiBvZiBhIHdlYgorICAgICAgICBhcHBsaWNhdGlvbi4gIFRoaXMgZGlyZWN0b3J5IHdpbGwgYmUgYXR0YWNoZWQgdG8gdGhlIGNvbnRleHQgcGF0aAorICAgICAgICB5b3Ugc3BlY2lmeSB3aXRob3V0IGFueSBjaGFuZ2VzLjwvbGk+CisgICAgPGxpPjxzdHJvbmc+ZmlsZTovYWJzb2x1dGUvcGF0aC90by9hL3dlYmFwcC53YXI8L3N0cm9uZz4gLSBUaGUgYWJzb2x1dGUKKyAgICAgICAgcGF0aCBvZiBhIHdlYiBhcHBsaWNhdGlvbiBhcmNoaXZlIChXQVIpIGZpbGUuICBUaGlzIGlzIHZhbGlkCisgICAgICAgIDxzdHJvbmc+b25seTwvc3Ryb25nPiBmb3IgdGhlIDxjb2RlPi9kZXBsb3k8L2NvZGU+IGNvbW1hbmQsIGFuZCBpcworICAgICAgICB0aGUgb25seSBhY2NlcHRhYmxlIGZvcm1hdCB0byB0aGF0IGNvbW1hbmQuPC9saT4KKyAgICA8bGk+PHN0cm9uZz5qYXI6ZmlsZTovYWJzb2x1dGUvcGF0aC90by9hL3dhcmZpbGUud2FyIS88L3N0cm9uZz4gLSBUaGUKKyAgICAgICAgVVJMIHRvIGEgbG9jYWwgd2ViIGFwcGxpY2F0aW9uIGFyY2hpdmUgKFdBUikgZmlsZS4gIFlvdSBjYW4gdXNlIGFueQorICAgICAgICBzeW50YXggdGhhdCBpcyB2YWxpZCBmb3IgdGhlIDxjb2RlPkphclVSTENvbm5lY3Rpb248L2NvZGU+IGNsYXNzCisgICAgICAgIGZvciByZWZlcmVuY2UgdG8gYW4gZW50aXJlIEpBUiBmaWxlLjwvbGk+CisgICAgPGxpPjxzdHJvbmc+ZmlsZTovYWJzb2x1dGUvcGF0aC90by9hL2NvbnRleHQueG1sPC9zdHJvbmc+IC0gVGhlCisgICAgICAgIGFic29sdXRlIHBhdGggb2YgYSB3ZWIgYXBwbGljYXRpb24gQ29udGV4dCBjb25maWd1cmF0aW9uICIueG1sIgorICAgICAgICBmaWxlIHdoaWNoIGNvbnRhaW5zIHRoZSBDb250ZXh0IGNvbmZpZ3VyYXRpb24gZWxlbWVudC48L2xpPgorICAgIDxsaT48c3Ryb25nPmRpcmVjdG9yeTwvc3Ryb25nPiAtIFRoZSBkaXJlY3RvcnkgbmFtZSBmb3IgdGhlIHdlYgorICAgICAgICBhcHBsY2lhdGlvbiBjb250ZXh0IGluIHRoZSBIb3N0J3MgYXBwbGljYXRpb24gYmFzZSBkaXJlY3RvcnkuPC9saT4KKyAgICA8bGk+PHN0cm9uZz53ZWJhcHAud2FyPC9zdHJvbmc+IC0gVGhlIG5hbWUgb2YgYSB3ZWIgYXBwbGljYXRpb24gd2FyIGZpbGUKKyAgICAgICAgbG9jYXRlZCBpbiB0aGUgSG9zdCdzIGFwcGxpY2F0aW9uIGJhc2UgZGlyZWN0b3J5LjwvbGk+CisgICAgPC91bD48L2xpPgorPC91bD4KKworPHA+RWFjaCBjb21tYW5kIHdpbGwgcmV0dXJuIGEgcmVzcG9uc2UgaW4gPGNvZGU+dGV4dC9wbGFpbjwvY29kZT4gZm9ybWF0CisoaS5lLiBwbGFpbiBBU0NJSSB3aXRoIG5vIEhUTUwgbWFya3VwKSwgbWFraW5nIGl0IGVhc3kgZm9yIGJvdGggaHVtYW5zIGFuZAorcHJvZ3JhbXMgdG8gcmVhZCkuICBUaGUgZmlyc3QgbGluZSBvZiB0aGUgcmVzcG9uc2Ugd2lsIGJlZ2luIHdpdGggZWl0aGVyCis8Y29kZT5PSzwvY29kZT4gb3IgPGNvZGU+RkFJTDwvY29kZT4sIGluZGljYXRpbmcgd2hldGhlciB0aGUgcmVxdWVzdGVkCitjb21tYW5kIHdhcyBzdWNjZXNzZnVsIG9yIG5vdC4gIEluIHRoZSBjYXNlIG9mIGZhaWx1cmUsIHRoZSByZXN0IG9mIHRoZSBmaXJzdAorbGluZSB3aWxsIGNvbnRhaW4gYSBkZXNjcmlwdGlvbiBvZiB0aGUgcHJvYmxlbSB0aGF0IHdhcyBlbmNvdW50ZXJlZC4gIFNvbWUKK2NvbW1hbmRzIGluY2x1ZGUgYWRkaXRpb25hbCBsaW5lcyBvZiBpbmZvcm1hdGlvbiBhcyBkZXNjcmliZWQgYmVsb3cuPC9wPgorCis8cD48ZW0+SW50ZXJuYXRpb25hbGl6YXRpb24gTm90ZTwvZW0+IC0gVGhlIE1hbmFnZXIgYXBwbGljYXRpb24gbG9va3MgdXAKK2l0cyBtZXNzYWdlIHN0cmluZ3MgaW4gcmVzb3VyY2UgYnVuZGxlcywgc28gaXQgaXMgcG9zc2libGUgdGhhdCB0aGUgc3RyaW5ncworaGF2ZSBiZWVuIHRyYW5zbGF0ZWQgZm9yIHlvdXIgcGxhdGZvcm0uICBUaGUgZXhhbXBsZXMgYmVsb3cgc2hvdyB0aGUgRW5nbGlzaAordmVyc2lvbiBvZiB0aGUgbWVzc2FnZXMuPC9wPgorCis8c3Vic2VjdGlvbiBuYW1lPSJEZXBsb3kgQSBOZXcgQXBwbGljYXRpb24gUmVtb3RlbHkiPgorCis8c291cmNlPgoraHR0cDovL2xvY2FsaG9zdDo4MDgwL21hbmFnZXIvZGVwbG95P3BhdGg9L2ZvbworPC9zb3VyY2U+CisKKzxwPlVwbG9hZCB0aGUgd2ViIGFwcGxpY2F0aW9uIGFyY2hpdmUgKFdBUikgZmlsZSB0aGF0IGlzIHNwZWNpZmllZCBhcyB0aGUKK3JlcXVlc3QgZGF0YSBpbiB0aGlzIEhUVFAgUFVUIHJlcXVlc3QsIGluc3RhbGwgaXQgaW50byB0aGUgPGNvZGU+YXBwQmFzZTwvY29kZT4KK2RpcmVjdG9yeSBvZiBvdXIgY29ycmVzcG9uZGluZyB2aXJ0dWFsIGhvc3QsIGFuZCBzdGFydCBpdCBvbiB0aGUgY29udGV4dCBwYXRoCitzcGVjaWZpZWQgYnkgdGhlIDxjb2RlPnBhdGg8L2NvZGU+IHJlcXVlc3QgcGFyYW1ldGVyLiAgSWYgbm8gPGNvZGU+cGF0aDwvY29kZT4KK2lzIHNwZWNpZmllZCB0aGUgZGlyZWN0b3J5IG5hbWUgb3IgdGhlIHdhciBmaWxlIG5hbWUgd2l0aG91dCB0aGUgLndhciBleHRlbnNpb24KK2lzIHVzZWQgYXMgdGhlIHBhdGguICBUaGUgYXBwbGljYXRpb24gY2FuCitsYXRlciBiZSB1bmRlcGxveWVkIChhbmQgdGhlIGNvcnJlc3BvbmRpbmcgYXBwbGljYXRpb24gZGlyZWN0b3J5IHJlbW92ZWQpCitieSB1c2Ugb2YgdGhlIDxjb2RlPi91bmRlcGxveTwvY29kZT4uPC9wPgorCis8cD5UaGUgLldBUiBmaWxlIG1heSBpbmNsdWRlIFRvbWNhdCBzcGVjaWZpYyBkZXBsb3ltZW50IGNvbmZpZ3VyYXRpb24sIGJ5IAoraW5jbHVkaW5nIGEgQ29udGV4dCBjb25maWd1cmF0aW9uIFhNTCBmaWxlIGluIAorPGNvZGU+L01FVEEtSU5GL2NvbnRleHQueG1sPC9jb2RlPi48L3A+CisKKzxwPlVSTCBwYXJhbWV0ZXJzIGluY2x1ZGU6Cis8dWw+Cis8bGk+PGNvZGU+dXBkYXRlPC9jb2RlPjogV2hlbiBzZXQgdG8gdHJ1ZSwgYW55IGV4aXN0aW5nIHVwZGF0ZSB3aWxsIGJlCisgICAgdW5kZXBsb3llZCBmaXJzdC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgc2V0IHRvIGZhbHNlLjwvbGk+Cis8bGk+PGNvZGU+dGFnPC9jb2RlPjogU3BlY2lmeWluZyBhIHRhZyBuYW1lLCB0aGlzIGFsbG93cyBhc3NvY2lhdGluZyB0aGUKKyAgICBkZXBsb3llZCB3ZWJhcHAgd2l0aCBhIHZlcnNpb24gbnVtYmVyLiBUaGUgYXBwbGljYXRpb24gdmVyc2lvbiBjYW4KKyAgICBiZSBsYXRlciByZWRlcGxveWVkIHdoZW4gbmVlZGVkIHVzaW5nIG9ubHkgdGhlIHRhZy48L2xpPgorPC91bD4KKzwvcD4KKworPHA+PHN0cm9uZz5OT1RFPC9zdHJvbmc+IC0gVGhpcyBjb21tYW5kIGlzIHRoZSBsb2dpY2FsCitvcHBvc2l0ZSBvZiB0aGUgPGNvZGU+L3VuZGVwbG95PC9jb2RlPiBjb21tYW5kLjwvcD4KKworPHA+SWYgaW5zdGFsbGF0aW9uIGFuZCBzdGFydHVwIGlzIHN1Y2Nlc3NmdWwsIHlvdSB3aWxsIHJlY2VpdmUgYSByZXNwb25zZQorbGlrZSB0aGlzOjwvcD4KKzxzb3VyY2U+CitPSyAtIERlcGxveWVkIGFwcGxpY2F0aW9uIGF0IGNvbnRleHQgcGF0aCAvZm9vCis8L3NvdXJjZT4KKworPHA+T3RoZXJ3aXNlLCB0aGUgcmVzcG9uc2Ugd2lsbCBzdGFydCB3aXRoIDxjb2RlPkZBSUw8L2NvZGU+IGFuZCBpbmNsdWRlIGFuCitlcnJvciBtZXNzYWdlLiAgUG9zc2libGUgY2F1c2VzIGZvciBwcm9ibGVtcyBpbmNsdWRlOjwvcD4KKzx1bD4KKzxsaT48ZW0+QXBwbGljYXRpb24gYWxyZWFkeSBleGlzdHMgYXQgcGF0aCAvZm9vPC9lbT4KKyAgICA8YmxvY2txdW90ZT4KKyAgICA8cD5UaGUgY29udGV4dCBwYXRocyBmb3IgYWxsIGN1cnJlbnRseSBydW5uaW5nIHdlYiBhcHBsaWNhdGlvbnMgbXVzdCBiZQorICAgIHVuaXF1ZS4gIFRoZXJlZm9yZSwgeW91IG11c3QgZWl0aGVyIHJlbW92ZSBvciB1bmRlcGxveSB0aGUgZXhpc3Rpbmcgd2ViCisgICAgYXBwbGljYXRpb24gdXNpbmcgdGhpcyBjb250ZXh0IHBhdGgsIG9yIGNob29zZSBhIGRpZmZlcmVudCBjb250ZXh0IHBhdGgKKyAgICBmb3IgdGhlIG5ldyBvbmUuIFRoZSA8Y29kZT51cGRhdGU8L2NvZGU+IHBhcmFtZXRlciBtYXkgYmUgc3BlY2lmaWVkIGFzCisgICAgYSBwYXJhbWV0ZXIgb24gdGhlIFVSTCwgd2l0aCBhIHZhbHVlIG9mIDxjb2RlPnRydWU8L2NvZGU+IHRvIGF2b2lkIHRoaXMKKyAgICBlcnJvci4gSW4gdGhhdCBjYXNlLCBhbiB1bmRlcGxveSB3aWxsIGJlIHBlcmZvcm1lZCBvbiBhbiBleGlzdGluZworICAgIGFwcGxpY2F0aW9uIGJlZm9yZSBwZXJmb3JtaW5nIHRoZSBkZXBsb3ltZW50LjwvcD4KKyAgICA8L2Jsb2NrcXVvdGU+PC9saT4KKzxsaT48ZW0+RW5jb3VudGVyZWQgZXhjZXB0aW9uPC9lbT4KKyAgICA8YmxvY2txdW90ZT4KKyAgICA8cD5BbiBleGNlcHRpb24gd2FzIGVuY291bnRlcmVkIHRyeWluZyB0byBzdGFydCB0aGUgbmV3IHdlYiBhcHBsaWNhdGlvbi4KKyAgICBDaGVjayB0aGUgVG9tY2F0IDUgbG9ncyBmb3IgdGhlIGRldGFpbHMsIGJ1dCBsaWtlbHkgZXhwbGFuYXRpb25zIGluY2x1ZGUKKyAgICBwcm9ibGVtcyBwYXJzaW5nIHlvdXIgPGNvZGU+L1dFQi1JTkYvd2ViLnhtbDwvY29kZT4gZmlsZSwgb3IgbWlzc2luZworICAgIGNsYXNzZXMgZW5jb3VudGVyZWQgd2hlbiBpbml0aWFsaXppbmcgYXBwbGljYXRpb24gZXZlbnQgbGlzdGVuZXJzIGFuZAorICAgIGZpbHRlcnMuPC9wPgorICAgIDwvYmxvY2txdW90ZT48L2xpPgorPGxpPjxlbT5JbnZhbGlkIGNvbnRleHQgcGF0aCB3YXMgc3BlY2lmaWVkPC9lbT4KKyAgICA8YmxvY2txdW90ZT4KKyAgICA8cD5UaGUgY29udGV4dCBwYXRoIG11c3Qgc3RhcnQgd2l0aCBhIHNsYXNoIGNoYXJhY3RlciwgdW5sZXNzIHlvdSBhcmUKKyAgICByZWZlcmVuY2luZyB0aGUgUk9PVCB3ZWIgYXBwbGljYXRpb24gLS0gaW4gd2hpY2ggY2FzZSB0aGUgY29udGV4dCBwYXRoCisgICAgbXVzdCBiZSBhIHplcm8tbGVuZ3RoIHN0cmluZy48L3A+CisgICAgPC9ibG9ja3F1b3RlPjwvbGk+Cis8bGk+PGVtPk5vIGNvbnRleHQgcGF0aCB3YXMgc3BlY2lmaWVkPC9lbT4KKyAgICA8YmxvY2txdW90ZT4KKyAgICBUaGUgPGNvZGU+cGF0aDwvY29kZT4gcGFyYW1ldGVyIGlzIHJlcXVpcmVkLgorICAgIDwvYmxvY2txdW90ZT48L2xpPgorPC91bD4KKworPC9zdWJzZWN0aW9uPgorCis8c3Vic2VjdGlvbiBuYW1lPSJEZXBsb3kgQSBOZXcgQXBwbGljYXRpb24gZnJvbSBhIExvY2FsIFBhdGgiPgorCis8cD5JbnN0YWxsIGFuZCBzdGFydCBhIG5ldyB3ZWIgYXBwbGljYXRpb24sIGF0dGFjaGVkIHRvIHRoZSBzcGVjaWZpZWQgY29udGV4dAorPGNvZGU+cGF0aDwvY29kZT4gKHdoaWNoIG11c3Qgbm90IGJlIGluIHVzZSBieSBhbnkgb3RoZXIgd2ViIGFwcGxpY2F0aW9uKS4KK1RoaXMgY29tbWFuZCBpcyB0aGUgbG9naWNhbCBvcHBvc2l0ZSBvZiB0aGUgPGNvZGU+L3JlbW92ZTwvY29kZT4gY29tbWFuZC48L3A+CisKKzxwPlRoZXJlIGFyZSBhIG51bWJlciBvZiBkaWZmZXJlbnQgd2F5cyB0aGUgaW5zdGFsbCBjb21tYW5kIGNhbiBiZSB1c2VkLjwvcD4KKworPGgzPkluc3RhbGwgYSB2ZXJzaW9uIG9mIGEgcHJldmlvdXNseSBkZXBsb3llZCB3ZWJhcHA8L2gzPgorCis8cD5UaGlzIGNhbiBiZSB1c2VkIHRvIGRlcGxveSBhIHByZXZpb3VzIHZlcnNpb24gb2YgYSB3ZWIgYXBwbGljYWlvbiwgd2hpY2gKK2hhcyBiZWVuIGRlcGxveWVkIHVzaW5nIHRoZSA8Y29kZT50YWc8L2NvZGU+IGF0dHJpYnV0ZS4gTm90ZSB0aGF0IHRoZSB3b3JrCitkaXJlY3RvcnkgZm9yIHRoZSBtYW5hZ2VyIHdlYmFwcCB3aWxsIGNvbnRhaW4gdGhlIHByZXZpb3VzbHkgZGVwbG95ZWQgV0FSczsKK3JlbW92aW5nIGl0IHdvdWxkIG1ha2UgdGhlIGRlcGxveW1lbnQgZmFpbC4KKzxzb3VyY2U+CitodHRwOi8vbG9jYWxob3N0OjgwODAvbWFuYWdlci9kZXBsb3k/cGF0aD0vZm9vdG9vJmFtcDt0YWc9Zm9vdGFnCis8L3NvdXJjZT4KKzwvcD4KKworPGgzPkluc3RhbGwgYSBEaXJlY3Rvcnkgb3IgV0FSIGJ5IFVSTDwvaDM+CisKKzxwPkluc3RhbGwgYSB3ZWIgYXBwbGljYXRpb24gZGlyZWN0b3J5IG9yICIud2FyIiBmaWxlIGxvY2F0ZWQgb24gdGhlIFRvbWNhdAorc2VydmVyLiBJZiBubyA8Y29kZT5wYXRoPC9jb2RlPiBpcyBzcGVjaWZpZWQsIHRoZSBkaXJlY3RvcnkgbmFtZSBvciB0aGUgd2FyIGZpbGUKK25hbWUgd2l0aG91dCB0aGUgIi53YXIiIGV4dGVuc2lvbiBpcyB1c2VkIGFzIHRoZSBwYXRoLiBUaGUgPGNvZGU+d2FyPC9jb2RlPgorcGFyYW1ldGVyIHNwZWNpZmllcyBhIFVSTCAoaW5jbHVkaW5nIHRoZSA8Y29kZT5maWxlOjwvY29kZT4gc2NoZW1lKSBmb3IgZWl0aGVyCithIGRpcmVjdG9yeSBvciBhIHdlYiBhcHBsaWNhdGlvbiBhcmNoaXZlIChXQVIpIGZpbGUuIFRoZSBzdXBwb3J0ZWQgc3ludGF4IGZvcgorYSBVUkwgcmVmZXJyaW5nIHRvIGEgV0FSIGZpbGUgaXMgZGVzY3JpYmVkIG9uIHRoZSBKYXZhZG9jcyBwYWdlIGZvciB0aGUKKzxjb2RlPmphdmEubmV0LkphclVSTENvbm5lY3Rpb248L2NvZGU+IGNsYXNzLiAgVXNlIG9ubHkgVVJMcyB0aGF0IHJlZmVyIHRvCit0aGUgZW50aXJlIFdBUiBmaWxlLjwvcD4KKworPHA+SW4gdGhpcyBleGFtcGxlIHRoZSB3ZWIgYXBwbGljYXRpb24gbG9jYXRlZCBpbiB0aGUgZGlyZWN0b3J5Cis8Y29kZT4vcGF0aC90by9mb288L2NvZGU+IG9uIHRoZSBUb21jYXQgc2VydmVyIGlzIGluc3RhbGxlZCBhcyB0aGUKK3dlYiBhcHBsaWNhdGlvbiBjb250ZXh0IG5hbWVkIDxjb2RlPi9mb290b288L2NvZGU+LgorPHNvdXJjZT4KK2h0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9tYW5hZ2VyL2RlcGxveT9wYXRoPS9mb290b28mYW1wO3dhcj1maWxlOi9wYXRoL3RvL2ZvbworPC9zb3VyY2U+Cis8L3A+CisKKzxwPkluIHRoaXMgZXhhbXBsZSB0aGUgIi53YXIiIGZpbGUgPGNvZGU+L3BhdGgvdG8vYmFyLndhcjwvY29kZT4gb24gdGhlCitUb21jYXQgc2VydmVyIGlzIGluc3RhbGxlZCBhcyB0aGUgd2ViIGFwcGxpY2F0aW9uIGNvbnRleHQgbmFtZWQKKzxjb2RlPi9iYXI8L2NvZGU+LiBOb3RpY2UgdGhhdCB0aGVyZSBpcyBubyA8Y29kZT5wYXRoPC9jb2RlPiBwYXJhbWV0ZXIKK3NvIHRoZSBjb250ZXh0IHBhdGggZGVmYXVsdHMgdG8gdGhlIG5hbWUgb2YgdGhlIHdlYiBhcHBsaWNhdGlvbiBhcmNoaXZlCitmaWxlIHdpdGhvdXQgdGhlICIud2FyIiBleHRlbnNpb24uCis8c291cmNlPgoraHR0cDovL2xvY2FsaG9zdDo4MDgwL21hbmFnZXIvZGVwbG95P3dhcj1qYXI6ZmlsZTovcGF0aC90by9iYXIud2FyIS8KKzwvc291cmNlPgorPC9wPgorCis8aDM+SW5zdGFsbCBhIERpcmVjdG9yeSBvciBXYXIgZnJvbSB0aGUgSG9zdCBhcHBCYXNlPC9oMz4KKworPHA+SW5zdGFsbCBhIHdlYiBhcHBsaWNhdGlvbiBkaXJlY3Rvcnkgb3IgIi53YXIiIGZpbGUgbG9jYXRlZCBpbiB5b3VyIEhvc3QKK2FwcEJhc2UgZGlyZWN0b3J5LiBJZiBubyA8Y29kZT5wYXRoPC9jb2RlPiBpcyBzcGVjaWZpZWQgdGhlIGRpcmVjdG9yeSBuYW1lCitvciB0aGUgd2FyIGZpbGUgbmFtZSB3aXRob3V0IHRoZSAiLndhciIgZXh0ZW5zaW9uIGlzIHVzZWQgYXMgdGhlIHBhdGguPC9wPgorCis8cD5JbiB0aGlzIGV4YW1wbGUgdGhlIHdlYiBhcHBsaWNhdGlvbiBsb2NhdGVkIGluIGEgc3ViIGRpcmVjdG9yeSBuYW1lZAorPGNvZGU+Zm9vPC9jb2RlPiBpbiB0aGUgSG9zdCBhcHBCYXNlIGRpcmVjdG9yeSBvZiB0aGUgVG9tY2F0IHNlcnZlciBpcworaW5zdGFsbGVkIGFzIHRoZSB3ZWIgYXBwbGljYXRpb24gY29udGV4dCBuYW1lZCA8Y29kZT4vZm9vPC9jb2RlPi4gTm90aWNlCit0aGF0IHRoZXJlIGlzIG5vIDxjb2RlPnBhdGg8L2NvZGU+IHBhcmFtZXRlciBzbyB0aGUgY29udGV4dCBwYXRoIGRlZmF1bHRzCit0byB0aGUgbmFtZSBvZiB0aGUgd2ViIGFwcGxpY2F0aW9uIGRpcmVjdG9yeS4KKzxzb3VyY2U+CitodHRwOi8vbG9jYWxob3N0OjgwODAvbWFuYWdlci9kZXBsb3k/d2FyPWZvbworPC9zb3VyY2U+Cis8L3A+CisKKzxwPkluIHRoaXMgZXhhbXBsZSB0aGUgIi53YXIiIGZpbGUgPGNvZGU+YmFyLndhcjwvY29kZT4gbG9jYXRlZCBpbiB5b3VyCitIb3N0IGFwcEJhc2UgZGlyZWN0b3J5IG9uIHRoZSBUb21jYXQgc2VydmVyIGlzIGluc3RhbGxlZCBhcyB0aGUgd2ViCithcHBsaWNhdGlvbiBjb250ZXh0IG5hbWVkIDxjb2RlPi9iYXJ0b288L2NvZGU+LgorPHNvdXJjZT4KK2h0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9tYW5hZ2VyL2RlcGxveT9wYXRoPS9iYXJ0b28mYW1wO3dhcj1iYXIud2FyCis8L3NvdXJjZT4KKzwvcD4KKworPGgzPkluc3RhbGwgdXNpbmcgYSBDb250ZXh0IGNvbmZpZ3VyYXRpb24gIi54bWwiIGZpbGU8L2gzPgorCis8cD5JZiB0aGUgSG9zdCBkZXBsb3lYTUwgZmxhZyBpcyBzZXQgdG8gdHJ1ZSB5b3UgY2FuIGluc3RhbGwgYSB3ZWIKK2FwcGxpY2F0aW9uIHVzaW5nIGEgQ29udGV4dCBjb25maWd1cmF0aW9uICIueG1sIiBmaWxlIGFuZCBhbiBvcHRpb25hbAorIi53YXIiIGZpbGUgb3Igd2ViIGFwcGxpY2F0aW9uIGRpcmVjdG9yeS4gVGhlIGNvbnRleHQgPGNvZGU+cGF0aDwvY29kZT4KK2lzIG5vdCB1c2VkIHdoZW4gaW5zdGFsbGluZyBhIHdlYiBhcHBsaWNhdGlvbiB1c2luZyBhIGNvbnRleHQgIi54bWwiCitjb25maWd1cmF0aW9uIGZpbGUuPC9wPgorCis8cD5BIENvbnRleHQgY29uZmlndXJhdGlvbiAiLnhtbCIgZmlsZSBjYW4gY29udGFpbiB2YWxpZCBYTUwgZm9yIGEKK3dlYiBhcHBsaWNhdGlvbiBDb250ZXh0IGp1c3QgYXMgaWYgaXQgd2VyZSBjb25maWd1cmVkIGluIHlvdXIKK1RvbWNhdCA8Y29kZT5zZXJ2ZXIueG1sPC9jb2RlPiBjb25maWd1cmF0aW9uIGZpbGUuIEhlcmUgaXMgYW4KK2V4YW1wbGU6Cis8c291cmNlPgorJmx0O0NvbnRleHQgcGF0aD0iL2Zvb2JhciIgZG9jQmFzZT0iL3BhdGgvdG8vYXBwbGljYXRpb24vZm9vYmFyIgorICAgICAgICAgZGVidWc9IjAiJmd0OworCisgICZsdDshLS0gTGluayB0byB0aGUgdXNlciBkYXRhYmFzZSB3ZSB3aWxsIGdldCByb2xlcyBmcm9tIC0tJmd0OworICAmbHQ7UmVzb3VyY2VMaW5rIG5hbWU9InVzZXJzIiBnbG9iYWw9IlVzZXJEYXRhYmFzZSIKKyAgICAgICAgICAgICAgICB0eXBlPSJvcmcuYXBhY2hlLmNhdGFsaW5hLlVzZXJEYXRhYmFzZSIvJmd0OworCismbHQ7L0NvbnRleHQmZ3Q7Cis8L3NvdXJjZT4KKzwvcD4KKworPHA+V2hlbiB0aGUgb3B0aW9uYWwgPGNvZGU+d2FyPC9jb2RlPiBwYXJhbWV0ZXIgaXMgc2V0IHRvIHRoZSBVUkwKK2ZvciBhIHdlYiBhcHBsaWNhdGlvbiAiLndhciIgZmlsZSBvciBkaXJlY3RvcnkgaXQgb3ZlcnJpZGVzIGFueQorZG9jQmFzZSBjb25maWd1cmVkIGluIHRoZSBjb250ZXh0IGNvbmZpZ3VyYXRpb24gIi54bWwiIGZpbGUuPC9wPgorCis8cD5IZXJlIGlzIGFuIGV4YW1wbGUgb2YgaW5zdGFsbGluZyBhbiBhcHBsaWNhdGlvbiB1c2luZyBhIENvbnRleHQKK2NvbmZpZ3VyYXRpb24gIi54bWwiIGZpbGUuCis8c291cmNlPgoraHR0cDovL2xvY2FsaG9zdDo4MDgwL21hbmFnZXIvZGVwbG95P2NvbmZpZz1maWxlOi9wYXRoL2NvbnRleHQueG1sCis8L3NvdXJjZT4KKzwvcD4KKworPHA+SGVyZSBpcyBhbiBleGFtcGxlIG9mIGluc3RhbGxpbmcgYW4gYXBwbGljYXRpb24gdXNpbmcgYSBDb250ZXh0Citjb25maWd1cmF0aW9uICIueG1sIiBmaWxlIGFuZCBhIHdlYiBhcHBsaWNhdGlvbiAiLndhciIgZmlsZSBsb2NhdGVkCitvbiB0aGUgc2VydmVyLgorPHNvdXJjZT4KK2h0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9tYW5hZ2VyL2RlcGxveT9jb25maWc9ZmlsZTovcGF0aC9jb250ZXh0LnhtbCZhbXA7d2FyPWphcjpmaWxlOi9wYXRoL2Jhci53YXIhLworPC9zb3VyY2U+Cis8L3A+CisKKzxoMz5JbnN0YWxsYXRpb24gTm90ZXM8L2gzPgorCis8cD5JZiB0aGUgSG9zdCBpcyBjb25maWd1cmVkIHdpdGggdW5wYWNrV0FScz10cnVlIGFuZCB5b3UgaW5zdGFsbCBhIHdhcgorZmlsZSwgdGhlIHdhciB3aWxsIGJlIHVucGFja2VkIGludG8gYSBkaXJlY3RvcnkgaW4geW91ciBIb3N0IGFwcEJhc2UKK2RpcmVjdG9yeS48L3A+CisKKzxwPklmIHRoZSBhcHBsaWNhdGlvbiB3YXIgb3IgZGlyZWN0b3J5IGlzIGluc3RhbGxlZCBpbiB5b3VyIEhvc3QgYXBwQmFzZQorZGlyZWN0b3J5IGFuZCBlaXRoZXIgdGhlIEhvc3QgaXMgY29uZmlndXJlZCB3aXRoIGF1dG9EZXBsb3k9dHJ1ZSBvcgorbGl2ZURlcGxveT10cnVlLCB0aGUgQ29udGV4dCBwYXRoIG11c3QgbWF0Y2ggdGhlIGRpcmVjdG9yeSBuYW1lIG9yCit3YXIgZmlsZSBuYW1lIHdpdGhvdXQgdGhlICIud2FyIiBleHRlbnNpb24uPC9wPgorCis8cD5Gb3Igc2VjdXJpdHkgd2hlbiB1bnRydXN0ZWQgdXNlcnMgY2FuIG1hbmFnZSB3ZWIgYXBwbGljYXRpb25zLCB0aGUKK0hvc3QgZGVwbG95WE1MIGZsYWcgY2FuIGJlIHNldCB0byBmYWxzZS4gIFRoaXMgcHJldmVudHMgdW50cnVzdGVkIHVzZXJzCitmcm9tIGluc3RhbGxpbmcgd2ViIGFwcGxpY2F0aW9ucyB1c2luZyBhIGNvbmZpZ3VyYXRpb24gWE1MIGZpbGUgYW5kCithbHNvIHByZXZlbnRzIHRoZW0gZnJvbSBpbnN0YWxsaW5nIGFwcGxpY2F0aW9uIGRpcmVjdG9yaWVzIG9yICIud2FyIgorZmlsZXMgbG9jYXRlZCBvdXRzaWRlIG9mIHRoZWlyIEhvc3QgYXBwQmFzZS48L3A+CisKKworPGgzPkluc3RhbGwgUmVzcG9uc2U8L2gzPgorCis8cD5JZiBpbnN0YWxsYXRpb24gYW5kIHN0YXJ0dXAgaXMgc3VjY2Vzc2Z1bCwgeW91IHdpbGwgcmVjZWl2ZSBhIHJlc3BvbnNlCitsaWtlIHRoaXM6PC9wPgorPHNvdXJjZT4KK09LIC0gRGVwbG95ZWQgYXBwbGljYXRpb24gYXQgY29udGV4dCBwYXRoIC9mb28KKzwvc291cmNlPgorCis8cD5PdGhlcndpc2UsIHRoZSByZXNwb25zZSB3aWxsIHN0YXJ0IHdpdGggPGNvZGU+RkFJTDwvY29kZT4gYW5kIGluY2x1ZGUgYW4KK2Vycm9yIG1lc3NhZ2UuICBQb3NzaWJsZSBjYXVzZXMgZm9yIHByb2JsZW1zIGluY2x1ZGU6PC9wPgorPHVsPgorPGxpPjxlbT5BcHBsaWNhdGlvbiBhbHJlYWR5IGV4aXN0cyBhdCBwYXRoIC9mb288L2VtPgorICAgIDxibG9ja3F1b3RlPgorICAgIDxwPlRoZSBjb250ZXh0IHBhdGhzIGZvciBhbGwgY3VycmVudGx5IHJ1bm5pbmcgd2ViIGFwcGxpY2F0aW9ucyBtdXN0IGJlCisgICAgdW5pcXVlLiAgVGhlcmVmb3JlLCB5b3UgbXVzdCBlaXRoZXIgcmVtb3ZlIG9yIHVuZGVwbG95IHRoZSBleGlzdGluZyB3ZWIKKyAgICBhcHBsaWNhdGlvbiB1c2luZyB0aGlzIGNvbnRleHQgcGF0aCwgb3IgY2hvb3NlIGEgZGlmZmVyZW50IGNvbnRleHQgcGF0aAorICAgIGZvciB0aGUgbmV3IG9uZS4gVGhlIDxjb2RlPnVwZGF0ZTwvY29kZT4gcGFyYW1ldGVyIG1heSBiZSBzcGVjaWZpZWQgYXMKKyAgICBhIHBhcmFtZXRlciBvbiB0aGUgVVJMLCB3aXRoIGEgdmFsdWUgb2YgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gYXZvaWQgdGhpcworICAgIGVycm9yLiBJbiB0aGF0IGNhc2UsIGFuIHVuZGVwbG95IHdpbGwgYmUgcGVyZm9ybWVkIG9uIGFuIGV4aXN0aW5nCisgICAgYXBwbGljYXRpb24gYmVmb3JlIHBlcmZvcm1pbmcgdGhlIGRlcGxveW1lbnQuPC9wPgorICAgIDwvYmxvY2txdW90ZT48L2xpPgorPGxpPjxlbT5Eb2N1bWVudCBiYXNlIGRvZXMgbm90IGV4aXN0IG9yIGlzIG5vdCBhIHJlYWRhYmxlIGRpcmVjdG9yeTwvZW0+CisgICAgPGJsb2NrcXVvdGU+CisgICAgPHA+VGhlIFVSTCBzcGVjaWZpZWQgYnkgdGhlIDxjb2RlPndhcjwvY29kZT4gcGFyYW1ldGVyIG11c3QgaWRlbnRpZnkgYQorICAgIGRpcmVjdG9yeSBvbiB0aGlzIHNlcnZlciB0aGF0IGNvbnRhaW5zIHRoZSAidW5wYWNrZWQiIHZlcnNpb24gb2YgYQorICAgIHdlYiBhcHBsaWNhdGlvbiwgb3IgdGhlIGFic29sdXRlIFVSTCBvZiBhIHdlYiBhcHBsaWNhdGlvbiBhcmNoaXZlIChXQVIpCisgICAgZmlsZSB0aGF0IGNvbnRhaW5zIHRoaXMgYXBwbGljYXRpb24uICBDb3JyZWN0IHRoZSB2YWx1ZSBzcGVjaWZpZWQgYnkKKyAgICB0aGUgPGNvZGU+d2FyPC9jb2RlPiBwYXJhbWV0ZXIuPC9wPgorICAgIDwvYmxvY2txdW90ZT48L2xpPgorPGxpPjxlbT5FbmNvdW50ZXJlZCBleGNlcHRpb248L2VtPgorICAgIDxibG9ja3F1b3RlPgorICAgIDxwPkFuIGV4Y2VwdGlvbiB3YXMgZW5jb3VudGVyZWQgdHJ5aW5nIHRvIHN0YXJ0IHRoZSBuZXcgd2ViIGFwcGxpY2F0aW9uLgorICAgIENoZWNrIHRoZSBUb21jYXQgNSBsb2dzIGZvciB0aGUgZGV0YWlscywgYnV0IGxpa2VseSBleHBsYW5hdGlvbnMgaW5jbHVkZQorICAgIHByb2JsZW1zIHBhcnNpbmcgeW91ciA8Y29kZT4vV0VCLUlORi93ZWIueG1sPC9jb2RlPiBmaWxlLCBvciBtaXNzaW5nCisgICAgY2xhc3NlcyBlbmNvdW50ZXJlZCB3aGVuIGluaXRpYWxpemluZyBhcHBsaWNhdGlvbiBldmVudCBsaXN0ZW5lcnMgYW5kCisgICAgZmlsdGVycy48L3A+CisgICAgPC9ibG9ja3F1b3RlPjwvbGk+Cis8bGk+PGVtPkludmFsaWQgYXBwbGljYXRpb24gVVJMIHdhcyBzcGVjaWZpZWQ8L2VtPgorICAgIDxibG9ja3F1b3RlPgorICAgIDxwPlRoZSBVUkwgZm9yIHRoZSBkaXJlY3Rvcnkgb3Igd2ViIGFwcGxpY2F0aW9uIHRoYXQgeW91IHNwZWNpZmllZAorICAgIHdhcyBub3QgdmFsaWQuICBTdWNoIFVSTHMgbXVzdCBzdGFydCB3aXRoIDxjb2RlPmZpbGU6PC9jb2RlPiwgYW5kIFVSTHMKKyAgICBmb3IgYSBXQVIgZmlsZSBtdXN0IGVuZCBpbiAiLndhciIuPC9wPgorICAgIDwvYmxvY2txdW90ZT48L2xpPgorPGxpPjxlbT5JbnZhbGlkIGNvbnRleHQgcGF0aCB3YXMgc3BlY2lmaWVkPC9lbT4KKyAgICA8YmxvY2txdW90ZT4KKyAgICA8cD5UaGUgY29udGV4dCBwYXRoIG11c3Qgc3RhcnQgd2l0aCBhIHNsYXNoIGNoYXJhY3RlciwgdW5sZXNzIHlvdSBhcmUKKyAgICByZWZlcmVuY2luZyB0aGUgUk9PVCB3ZWIgYXBwbGljYXRpb24gLS0gaW4gd2hpY2ggY2FzZSB0aGUgY29udGV4dCBwYXRoCisgICAgbXVzdCBiZSBhICIvIiBzdHJpbmcuPC9wPgorICAgIDwvYmxvY2txdW90ZT48L2xpPgorPGxpPjxlbT5Db250ZXh0IHBhdGggbXVzdCBtYXRjaCB0aGUgZGlyZWN0b3J5IG9yIFdBUiBmaWxlIG5hbWU6PC9lbT4KKyAgICA8YmxvY2txdW90ZT4KKyAgICBJZiB0aGUgYXBwbGljYXRpb24gd2FyIG9yIGRpcmVjdG9yeSBpcyBpbnN0YWxsZWQgaW4geW91ciBIb3N0IGFwcEJhc2UKKyAgICBkaXJlY3RvcnkgYW5kIGVpdGhlciB0aGUgSG9zdCBpcyBjb25maWd1cmVkIHdpdGggYXV0b0RlcGxveT10cnVlIG9yCisgICAgbGl2ZURlcGxveT10cnVlLCB0aGUgQ29udGV4dCBwYXRoIG11c3QgbWF0Y2ggdGhlIGRpcmVjdG9yeSBuYW1lIG9yCisgICAgd2FyIGZpbGUgbmFtZSB3aXRob3V0IHRoZSAiLndhciIgZXh0ZW5zaW9uLgorICAgIDwvYmxvY2txdW90ZT48L2xpPgorPGxpPjxlbT5Pbmx5IHdlYiBhcHBsaWNhdGlvbnMgaW4gdGhlIEhvc3Qgd2ViIGFwcGxpY2F0aW9uIGRpcmVjdG9yeSBjYW4KKyAgICAgYmUgaW5zdGFsbGVkPC9lbT4KKyAgICAgPGJsb2NrcXVvdGU+CisgICAgIElmIHRoZSBIb3N0IGRlcGxveVhNTCBmbGFnIGlzIHNldCB0byBmYWxzZSB0aGlzIGVycm9yIHdpbGwgaGFwcGVuCisgICAgIGlmIGFuIGF0dGVtcHQgaXMgbWFkZSB0byBpbnN0YWxsIGEgd2ViIGFwcGxpY2F0aW9uIGRpcmVjdG9yeSBvcgorICAgICAgIi53YXIiIGZpbGUgb3V0c2lkZSBvZiB0aGUgSG9zdCBhcHBCYXNlIGRpcmVjdG9yeS4KKyAgICAgPC9ibG9ja3F1b3RlPjwvbGk+Cis8L3VsPgorCis8L3N1YnNlY3Rpb24+CisKKzxzdWJzZWN0aW9uIG5hbWU9Ikxpc3QgQ3VycmVudGx5IERlcGxveWVkIGFuZCBJbnN0YWxsZWQgQXBwbGljYXRpb25zIj4KKworPHNvdXJjZT4KK2h0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9tYW5hZ2VyL2xpc3QKKzwvc291cmNlPgorCis8cD5MaXN0IHRoZSBjb250ZXh0IHBhdGhzLCBjdXJyZW50IHN0YXR1cyAoPGNvZGU+cnVubmluZzwvY29kZT4gb3IKKzxjb2RlPnN0b3BwZWQ8L2NvZGU+KSwgYW5kIG51bWJlciBvZiBhY3RpdmUgc2Vzc2lvbnMgZm9yIGFsbCBjdXJyZW50bHkKK2RlcGxveWVkIGFuZCBpbnN0YWxsZWQgd2ViIGFwcGxpY2F0aW9ucy4gIEEgdHlwaWNhbCByZXNwb25zZSBpbW1lZGlhdGVseQorYWZ0ZXIgc3RhcnRpbmcgVG9tY2F0IG1pZ2h0IGxvb2sgbGlrZSB0aGlzOjwvcD4KKzxzb3VyY2U+CitPSyAtIExpc3RlZCBhcHBsaWNhdGlvbnMgZm9yIHZpcnR1YWwgaG9zdCBsb2NhbGhvc3QKKy93ZWJkYXY6cnVubmluZzowCisvZXhhbXBsZXM6cnVubmluZzowCisvbWFuYWdlcjpydW5uaW5nOjAKKy86cnVubmluZzowCis8L3NvdXJjZT4KKworPC9zdWJzZWN0aW9uPgorCis8c3Vic2VjdGlvbiBuYW1lPSJSZWxvYWQgQW4gRXhpc3RpbmcgQXBwbGljYXRpb24iPgorCis8c291cmNlPgoraHR0cDovL2xvY2FsaG9zdDo4MDgwL21hbmFnZXIvcmVsb2FkP3BhdGg9L2V4YW1wbGVzCis8L3NvdXJjZT4KKworPHA+U2lnbmFsIGFuIGV4aXN0aW5nIGFwcGxpY2F0aW9uIHRvIHNodXQgaXRzZWxmIGRvd24gYW5kIHJlbG9hZC4gIFRoaXMgY2FuCitiZSB1c2VmdWwgd2hlbiB0aGUgd2ViIGFwcGxpY2F0aW9uIGNvbnRleHQgaXMgbm90IHJlbG9hZGFibGUgYW5kIHlvdSBoYXZlCit1cGRhdGVkIGNsYXNzZXMgb3IgcHJvcGVydHkgZmlsZXMgaW4gdGhlIDxjb2RlPi9XRUItSU5GL2NsYXNzZXM8L2NvZGU+CitkaXJlY3Rvcnkgb3Igd2hlbiB5b3UgaGF2ZSBhZGRlZCBvciB1cGRhdGVkIGphciBmaWxlcyBpbiB0aGUKKzxjb2RlPi9XRUItSU5GL2xpYjwvY29kZT4gZGlyZWN0b3J5LgorPC9wPgorPHA+PHN0cm9uZz5OT1RFOjwvc3Ryb25nPiBUaGUgPGNvZGU+L1dFQi1JTkYvd2ViLnhtbDwvY29kZT4KK3dlYiBhcHBsaWNhdGlvbiBjb25maWd1cmF0aW9uIGZpbGUgaXMgbm90IHJlcmVhZCBvbiBhIHJlbG9hZC4KK0lmIHlvdSBoYXZlIG1hZGUgY2hhbmdlcyB0byB5b3VyIHdlYi54bWwgZmlsZSB5b3UgbXVzdCBzdG9wCit0aGVuIHN0YXJ0IHRoZSB3ZWIgYXBwbGljYXRpb24uCis8L3A+CisKKzxwPklmIHRoaXMgY29tbWFuZCBzdWNjZWVkcywgeW91IHdpbGwgc2VlIGEgcmVzcG9uc2UgbGlrZSB0aGlzOjwvcD4KKzxzb3VyY2U+CitPSyAtIFJlbG9hZGVkIGFwcGxpY2F0aW9uIGF0IGNvbnRleHQgcGF0aCAvZXhhbXBsZXMKKzwvc291cmNlPgorCis8cD5PdGhlcndpc2UsIHRoZSByZXNwb25zZSB3aWxsIHN0YXJ0IHdpdGggPGNvZGU+RkFJTDwvY29kZT4gYW5kIGluY2x1ZGUgYW4KK2Vycm9yIG1lc3NhZ2UuICBQb3NzaWJsZSBjYXVzZXMgZm9yIHByb2JsZW1zIGluY2x1ZGU6PC9wPgorPHVsPgorPGxpPjxlbT5FbmNvdW50ZXJlZCBleGNlcHRpb248L2VtPgorICAgIDxibG9ja3F1b3RlPgorICAgIDxwPkFuIGV4Y2VwdGlvbiB3YXMgZW5jb3VudGVyZWQgdHJ5aW5nIHRvIHJlc3RhcnQgdGhlIHdlYiBhcHBsaWNhdGlvbi4KKyAgICBDaGVjayB0aGUgVG9tY2F0IDUgbG9ncyBmb3IgdGhlIGRldGFpbHMuPC9wPgorICAgIDwvYmxvY2txdW90ZT48L2xpPgorPGxpPjxlbT5JbnZhbGlkIGNvbnRleHQgcGF0aCB3YXMgc3BlY2lmaWVkPC9lbT4KKyAgICA8YmxvY2txdW90ZT4KKyAgICA8cD5UaGUgY29udGV4dCBwYXRoIG11c3Qgc3RhcnQgd2l0aCBhIHNsYXNoIGNoYXJhY3RlciwgdW5sZXNzIHlvdSBhcmUKKyAgICByZWZlcmVuY2luZyB0aGUgUk9PVCB3ZWIgYXBwbGljYXRpb24gLS0gaW4gd2hpY2ggY2FzZSB0aGUgY29udGV4dCBwYXRoCisgICAgbXVzdCBiZSBhIHplcm8tbGVuZ3RoIHN0cmluZy48L3A+CisgICAgPC9ibG9ja3F1b3RlPjwvbGk+Cis8bGk+PGVtPk5vIGNvbnRleHQgZXhpc3RzIGZvciBwYXRoIC9mb288L2VtPgorICAgIDxibG9ja3F1b3RlPgorICAgIDxwPlRoZXJlIGlzIG5vIGRlcGxveWVkIG9yIGluc3RhbGxlZCBhcHBsaWNhdGlvbiBvbiB0aGUgY29udGV4dCBwYXRoCisgICAgdGhhdCB5b3Ugc3BlY2lmaWVkLjwvcD4KKyAgICA8L2Jsb2NrcXVvdGU+PC9saT4KKzxsaT48ZW0+Tm8gY29udGV4dCBwYXRoIHdhcyBzcGVjaWZpZWQ8L2VtPgorICAgIDxibG9ja3F1b3RlPgorICAgIFRoZSA8Y29kZT5wYXRoPC9jb2RlPiBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQuCisgICAgPC9ibG9ja3F1b3RlPjwvbGk+Cis8bGk+PGVtPlJlbG9hZCBub3Qgc3VwcG9ydGVkIG9uIFdBUiBkZXBsb3llZCBhdCBwYXRoIC9mb288L2VtPgorICAgIDxibG9ja3F1b3RlPgorICAgIEN1cnJlbnRseSwgYXBwbGljYXRpb24gcmVsb2FkaW5nICh0byBwaWNrIHVwIGNoYW5nZXMgdG8gdGhlIGNsYXNzZXMgb3IKKyAgICA8Y29kZT53ZWIueG1sPC9jb2RlPiBmaWxlKSBpcyBub3Qgc3VwcG9ydGVkIHdoZW4gYSB3ZWIgYXBwbGljYXRpb24gaXMKKyAgICBpbnN0YWxsZWQgZGlyZWN0bHkgZnJvbSBhIFdBUiBmaWxlLiAgSXQgb25seSB3b3JrcyB3aGVuIHRoZSB3ZWIgYXBwbGljYXRpb24KKyAgICBpcyBpbnN0YWxsZWQgZnJvbSBhbiB1bnBhY2tlZCBkaXJlY3RvcnkuICBJZiB5b3UgYXJlIHVzaW5nIGEgV0FSIGZpbGUsCisgICAgeW91IHNob3VsZCA8Y29kZT5yZW1vdmU8L2NvZGU+IGFuZCB0aGVuIDxjb2RlPmluc3RhbGw8L2NvZGU+IHRoZQorICAgIGFwcGxpY2F0aW9uIGFnYWluIHRvIHBpY2sgdXAgeW91ciBjaGFuZ2VzLgorICAgIDwvYmxvY2txdW90ZT48L2xpPgorPC91bD4KKworPC9zdWJzZWN0aW9uPgorCis8c3Vic2VjdGlvbiBuYW1lPSJMaXN0IE9TIGFuZCBKVk0gUHJvcGVydGllcyI+CisKKzxzb3VyY2U+CitodHRwOi8vbG9jYWxob3N0OjgwODAvbWFuYWdlci9zZXJ2ZXJpbmZvCis8L3NvdXJjZT4KKworPHA+TGlzdHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIFRvbWNhdCB2ZXJzaW9uLCBPUywgYW5kIEpWTSBwcm9wZXJ0aWVzLjwvcD4KKworPHA+SWYgYW4gZXJyb3Igb2NjdXJzLCB0aGUgcmVzcG9uc2Ugd2lsbCBzdGFydCB3aXRoIDxjb2RlPkZBSUw8L2NvZGU+IGFuZAoraW5jbHVkZSBhbiBlcnJvciBtZXNzYWdlLiAgUG9zc2libGUgY2F1c2VzIGZvciBwcm9ibGVtcyBpbmNsdWRlOjwvcD4KKzx1bD4KKzxsaT48ZW0+RW5jb3VudGVyZWQgZXhjZXB0aW9uPC9lbT4KKyAgICA8YmxvY2txdW90ZT4KKyAgICA8cD5BbiBleGNlcHRpb24gd2FzIGVuY291bnRlcmVkIHRyeWluZyB0byBlbnVtZXJhdGUgdGhlIHN5c3RlbSBwcm9wZXJ0aWVzLgorICAgIENoZWNrIHRoZSBUb21jYXQgNSBsb2dzIGZvciB0aGUgZGV0YWlscy48L3A+CisgICAgPC9ibG9ja3F1b3RlPjwvbGk+Cis8L3VsPgorCis8L3N1YnNlY3Rpb24+CisKKzxzdWJzZWN0aW9uIG5hbWU9Ikxpc3QgQXZhaWxhYmxlIEdsb2JhbCBKTkRJIFJlc291cmNlcyI+CisKKzxzb3VyY2U+CitodHRwOi8vbG9jYWxob3N0OjgwODAvbWFuYWdlci9yZXNvdXJjZXNbP3R5cGU9eHh4eHhdCis8L3NvdXJjZT4KKworPHA+TGlzdCB0aGUgZ2xvYmFsIEpOREkgcmVzb3VyY2VzIHRoYXQgYXJlIGF2YWlsYWJsZSBmb3IgdXNlIGluIHJlc291cmNlCitsaW5rcyBmb3IgY29udGV4dCBjb25maWd1cmF0aW9uIGZpbGVzLiAgSWYgeW91IHNwZWNpZnkgdGhlIDxjb2RlPnR5cGU8L2NvZGU+CityZXF1ZXN0IHBhcmFtZXRlciwgdGhlIHZhbHVlIG11c3QgYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBKYXZhIGNsYXNzIG5hbWUgb2YKK3RoZSByZXNvdXJjZSB0eXBlIHlvdSBhcmUgaW50ZXJlc3RlZCBpbiAoZm9yIGV4YW1wbGUsIHlvdSB3b3VsZCBzcGVjaWZ5Cis8Y29kZT5qYXZheC5zcWwuRGF0YVNvdXJjZTwvY29kZT4gdG8gYWNxdWlyZSB0aGUgbmFtZXMgb2YgYWxsIGF2YWlsYWJsZQorSkRCQyBkYXRhIHNvdXJjZXMpLiAgSWYgeW91IGRvIG5vdCBzcGVjaWZ5IHRoZSA8Y29kZT50eXBlPC9jb2RlPiByZXF1ZXN0CitwYXJhbWV0ZXIsIHJlc291cmNlcyBvZiBhbGwgdHlwZXMgd2lsbCBiZSByZXR1cm5lZC48L3A+CisKKzxwPkRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSA8Y29kZT50eXBlPC9jb2RlPiByZXF1ZXN0IHBhcmFtZXRlciBpcyBzcGVjZmllZAorb3Igbm90LCB0aGUgZmlyc3QgbGluZSBvZiBhIG5vcm1hbCByZXNwb25zZSB3aWxsIGJlOjwvcD4KKzxwcmU+CisgIE9LIC0gTGlzdGVkIGdsb2JhbCByZXNvdXJjZXMgb2YgYWxsIHR5cGVzCis8L3ByZT4KKzxwPm9yPC9wPgorPHByZT4KKyAgT0sgLSBMaXN0ZWQgZ2xvYmFsIHJlc291cmNlcyBvZiB0eXBlIHh4eHh4Cis8L3ByZT4KKzxwPmZvbGxvd2VkIGJ5IG9uZSBsaW5lIGZvciBlYWNoIHJlc291cmNlLiAgRWFjaCBsaW5lIGlzIGNvbXBvc2VkIG9mIGZpZWxkcworZGVsaW1pdGVkIGJ5IGNvbG9uIGNoYXJhY3RlcnMgKCI6IiksIGFzIGZvbGxvd3M6PC9wPgorPHVsPgorPGxpPjxlbT5HbG9iYWwgUmVzb3VyY2UgTmFtZTwvZW0+IC0gVGhlIG5hbWUgb2YgdGhpcyBnbG9iYWwgSk5ESSByZXNvdXJjZSwKKyAgICB3aGljaCB3b3VsZCBiZSB1c2VkIGluIHRoZSA8Y29kZT5nbG9iYWw8L2NvZGU+IGF0dHJpYnV0ZSBvZiBhCisgICAgPGNvZGU+Jmx0O1Jlc291cmNlTGluayZndDs8L2NvZGU+IGVsZW1lbnQuPC9saT4KKzxsaT48ZW0+R2xvYmFsIFJlc291cmNlIFR5cGU8L2VtPiAtIFRoZSBmdWxseSBxdWFsaWZpZWQgSmF2YSBjbGFzcyBuYW1lIG9mCisgICAgdGhpcyBnbG9iYWwgSk5ESSByZXNvdXJjZS48L2xpPgorPC91bD4KKworPHA+SWYgYW4gZXJyb3Igb2NjdXJzLCB0aGUgcmVzcG9uc2Ugd2lsbCBzdGFydCB3aXRoIDxjb2RlPkZBSUw8L2NvZGU+IGFuZAoraW5jbHVkZSBhbiBlcnJvciBtZXNzYWdlLiAgUG9zc2libGUgY2F1c2VzIGZvciBwcm9ibGVtcyBpbmNsdWRlOjwvcD4KKzx1bD4KKzxsaT48ZW0+RW5jb3VudGVyZWQgZXhjZXB0aW9uPC9lbT4KKyAgICA8YmxvY2txdW90ZT4KKyAgICA8cD5BbiBleGNlcHRpb24gd2FzIGVuY291bnRlcmVkIHRyeWluZyB0byBlbnVtZXJhdGUgdGhlIGdsb2JhbCBKTkRJCisgICAgcmVzb3VyY2VzLiAgQ2hlY2sgdGhlIFRvbWNhdCA1IGxvZ3MgZm9yIHRoZSBkZXRhaWxzLjwvcD4KKyAgICA8L2Jsb2NrcXVvdGU+PC9saT4KKzxsaT48ZW0+Tm8gZ2xvYmFsIEpOREkgcmVzb3VyY2VzIGFyZSBhdmFpbGFibGU8L2VtPgorICAgIDxibG9ja3F1b3RlPgorICAgIDxwPlRoZSBUb21jYXQgc2VydmVyIHlvdSBhcmUgcnVubmluZyBoYXMgYmVlbiBjb25maWd1cmVkIHdpdGhvdXQKKyAgICBnbG9iYWwgSk5ESSByZXNvdXJjZXMuPC9wPgorICAgIDwvYmxvY2txdW90ZT48L2xpPgorPC91bD4KKworCis8L3N1YnNlY3Rpb24+CisKKworPHN1YnNlY3Rpb24gbmFtZT0iTGlzdCBBdmFpbGFibGUgU2VjdXJpdHkgUm9sZXMiPgorCis8c291cmNlPgoraHR0cDovL2xvY2FsaG9zdDo4MDgwL21hbmFnZXIvcm9sZXMKKzwvc291cmNlPgorCis8cD5MaXN0IHRoZSBzZWN1cml0eSByb2xlIG5hbWVzIChhbmQgY29ycmVzcG9uZGluZyBkZXNjcmlwdGlvbnMpIHRoYXQgYXJlCithdmFpbGFibGUgaW4gdGhlIDxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEuVXNlckRhdGFiYXNlPC9jb2RlPiByZXNvdXJjZSB0aGF0CitpcyBsaW5rZWQgdG8gdGhlIDxjb2RlPnVzZXJzPC9jb2RlPiByZXNvdXJjZSByZWZlcmVuY2UgaW4gdGhlIHdlYi54bWwgZmlsZQorZm9yIHRoZSBNYW5hZ2VyIHdlYiBhcHBsaWNhdGlvbi4gIFRoaXMgd291bGQgdHlwaWNhbGx5IGJlIHVzZWQsIGZvciBleGFtcGxlLAorYnkgYSBkZXBsb3ltZW50IHRvb2wgdGhhdCB3YW50ZWQgdG8gY3JlYXRlCis8Y29kZT4mbHQ7c2VjdXJpdHktcm9sZS1yZWYmZ3Q7PC9jb2RlPiBlbGVtZW50cyB0byBtYXAgc2VjdXJpdHkgcm9sZSBuYW1lcwordXNlZCBpbiBhIHdlYiBhcHBsaWNhdGlvbiB0byB0aGUgcm9sZSBuYW1lcyBhY3R1YWxseSBkZWZpbmVkIHdpdGhpbiB0aGUKK2NvbnRhaW5lci48L3A+CisKKzxwPkJ5IGRlZmF1bHQsIHRoZSA8Y29kZT51c2VyczwvY29kZT4gcmVzb3VyY2UgcmVmZXJlbmNlIGlzIHBvaW50ZWQgYXQgdGhlCitnbG9iYWwgPGNvZGU+VXNlckRhdGFiYXNlPC9jb2RlPiByZXNvdXJjZS4gIElmIHlvdSBjaG9vc2UgdG8gdXRpbGl6ZSBhCitkaWZmZXJlbnQgdXNlciBkYXRhYmFzZSBwZXIgdmlydHVhbCBob3N0LCB5b3Ugc2hvdWxkIG1vZGlmeSB0aGUKKzxjb2RlPiZsdDtSZXNvdXJjZUxpbmsmZ3Q7PC9jb2RlPiBlbGVtZW50IGluIHRoZSBkZWZhdWx0Cis8Y29kZT5tYW5hZ2VyLnhtbDwvY29kZT4gY29udGV4dCBjb25maWd1cmF0aW9uIGZpbGUgdG8gcG9pbnQgYXQgdGhlIGdsb2JhbAordXNlciBkYXRhYmFzZSByZXNvdXJjZSBmb3IgdGhpcyB2aXJ0dWFsIGhvc3QuPC9wPgorCis8cD5XaGVuIHRoaXMgY29tbWFuZCBpcyBleGVjdXRlZCwgdGhlIGZpcnN0IGxpbmUgb2YgdGhlIHJlc3BvbnNlIHdpbGwgYmU6PC9wPgorPHByZT4KKyAgT0sgLSBMaXN0ZWQgc2VjdXJpdHkgcm9sZXMKKzwvcHJlPgorPHA+Zm9sbG93ZWQgYnkgb25lIGxpbmUgZm9yIGVhY2ggc2VjdXJpdHkgcm9sZS4gIEVhY2ggbGluZSBpcyBjb21wb3NlZCBvZgorZmllbGRzIGRlbGltaXRlZCBieSBjb2xvbiBjaGFyYWN0ZXJzICgiOiIpIGFzIGZvbGxvd3M6PC9wPgorPHVsPgorPGxpPjxlbT5TZWN1cml0eSBSb2xlIE5hbWU8L2VtPiAtIEEgc2VjdXJpdHkgcm9sZSBuYW1lIHRoYXQgaXMga25vd24gdG8gVG9tY2F0CisgICAgaW4gdGhlIHVzZXIgZGF0YWJhc2UuPC9saT4KKzxsaT48ZW0+RGVzY3JpcHRpb248L2VtPiAtIERlc2NyaXB0aW9uIG9mIHRoaXMgc2VjdXJpdHkgcm9sZSAodXNlZnVsIGluCisgICAgY3JlYXRpbmcgdXNlciBpbnRlcmZhY2VzIGZvciBzZWxlY3Rpbmcgcm9sZXMuPC9saT4KKzwvdWw+CisKKzxwPklmIGFuIGVycm9yIG9jY3VycywgdGhlIHJlc3BvbnNlIHdpbGwgc3RhcnQgd2l0aCA8Y29kZT5GQUlMPC9jb2RlPiBhbmQKK2luY2x1ZGUgYW4gZXJyb3IgbWVzc2FnZS4gIFBvc3NpYmxlIGNhdXNlcyBmb3IgcHJvYmxlbXMgaW5jbHVkZTo8L3A+Cis8dWw+Cis8bGk+PGVtPkNhbm5vdCByZXNvbHZlIHVzZXIgZGF0YWJhc2UgcmVmZXJlbmNlPC9lbT4gLSBBIEpOREkgZXJyb3IgcHJldmVudGVkCisgICAgdGhlIHN1Y2Nlc3NmdWwgbG9va3VwIG9mIHRoZSA8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLlVzZXJEYXRhYmFzZTwvY29kZT4KKyAgICByZXNvdXJjZS4gIENoZWNrIHRoZSBUb21jYXQgbG9nIGZpbGVzIGZvciBhIHN0YWNrIHRyYWNlIGFzc29jaWF0ZWQgd2l0aAorICAgIHRoaXMgZXJyb3IuPC9saT4KKzxsaT48ZW0+Tm8gdXNlciBkYXRhYmFzZSBpcyBhdmFpbGFibGU8L2VtPiAtIFlvdSBoYXZlIG5vdCBjb25maWd1cmVkIGEgcmVzb3VyY2UKKyAgICByZWZlcmVuY2UgZm9yIHRoZSA8Y29kZT51c2VyczwvY29kZT4gcmVzb3VyY2UgdGhhdCBwb2ludHMgYXQgYW4KKyAgICBhcHByb3ByaWF0ZSB1c2VyIGRhdGFiYXNlIGluc3RhbmNlLiAgQ2hlY2sgeW91ciA8Y29kZT5tYW5hZ2VyLnhtbDwvY29kZT4KKyAgICBmaWxlIGFuZCBlbnN1cmUgdGhhdCB5b3UgaGF2ZSBjcmVhdGVkIGFuIGFwcHJvcHJpYXRlCisgICAgPGNvZGU+Jmx0O1Jlc291cmNlTGluayZndDs8L2NvZGU+IG9yCisgICAgPGNvZGU+Jmx0O1Jlc291cmNlUGFyYW1zJmd0OzwvY29kZT4gZWxlbWVudCBmb3IgdGhpcyByZXNvdXJjZS48L2xpPgorPC91bD4KKworPC9zdWJzZWN0aW9uPgorCisKKzxzdWJzZWN0aW9uIG5hbWU9IlNlc3Npb24gU3RhdGlzdGljcyI+CisKKzxzb3VyY2U+CitodHRwOi8vbG9jYWxob3N0OjgwODAvbWFuYWdlci9zZXNzaW9ucz9wYXRoPS9leGFtcGxlcworPC9zb3VyY2U+CisKKzxwPkRpc3BsYXkgdGhlIGRlZmF1bHQgc2Vzc2lvbiB0aW1lb3V0IGZvciBhIHdlYiBhcHBsaWNhdGlvbiwgYW5kIHRoZQorbnVtYmVyIG9mIGN1cnJlbnRseSBhY3RpdmUgc2Vzc2lvbnMgdGhhdCBmYWxsIHdpdGhpbiB0ZW4tbWludXRlIHJhbmdlcyBvZgordGhlaXIgYWN0dWFsIHRpbWVvdXQgdGltZXMuICBGb3IgZXhhbXBsZSwgYWZ0ZXIgcmVzdGFydGluZyBUb21jYXQgYW5kIHRoZW4KK2V4ZWN1dGluZyBvbmUgb2YgdGhlIEpTUCBzYW1wbGVzIGluIHRoZSA8Y29kZT4vZXhhbXBsZXM8L2NvZGU+IHdlYiBhcHAsCit5b3UgbWlnaHQgZ2V0IHNvbWV0aGluZyBsaWtlIHRoaXM6PC9wPgorPHNvdXJjZT4KK09LIC0gU2Vzc2lvbiBpbmZvcm1hdGlvbiBmb3IgYXBwbGljYXRpb24gYXQgY29udGV4dCBwYXRoIC9leGFtcGxlcworRGVmYXVsdCBtYXhpbXVtIHNlc3Npb24gaW5hY3RpdmUgaW50ZXJ2YWwgMzAgbWludXRlcworMzAgLSAmbHQ7NDAgbWludXRlczoxIHNlc3Npb25zCis8L3NvdXJjZT4KKworPC9zdWJzZWN0aW9uPgorCisKKzxzdWJzZWN0aW9uIG5hbWU9IlN0YXJ0IGFuIEV4aXN0aW5nIEFwcGxpY2F0aW9uIj4KKworPHNvdXJjZT4KK2h0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9tYW5hZ2VyL3N0YXJ0P3BhdGg9L2V4YW1wbGVzCis8L3NvdXJjZT4KKworPHA+U2lnbmFsIGEgc3RvcHBlZCBhcHBsaWNhdGlvbiB0byByZXN0YXJ0LCBhbmQgbWFrZSBpdHNlbGYgYXZhaWxhYmxlIGFnYWluLgorU3RvcHBpbmcgYW5kIHN0YXJ0aW5nIGlzIHVzZWZ1bCwgZm9yIGV4YW1wbGUsIGlmIHRoZSBkYXRhYmFzZSByZXF1aXJlZCBieQoreW91ciBhcHBsaWNhdGlvbiBiZWNvbWVzIHRlbXBvcmFyaWx5IHVuYXZhaWxhYmxlLiAgSXQgaXMgdXN1YWxseSBiZXR0ZXIgdG8KK3N0b3AgdGhlIHdlYiBhcHBsaWNhdGlvbiB0aGF0IHJlbGllcyBvbiB0aGlzIGRhdGFiYXNlIHJhdGhlciB0aGFuIGxldHRpbmcKK3VzZXJzIGNvbnRpbnVvdXNseSBlbmNvdW50ZXIgZGF0YWJhc2UgZXhjZXB0aW9ucy48L3A+CisKKzxwPklmIHRoaXMgY29tbWFuZCBzdWNjZWVkcywgeW91IHdpbGwgc2VlIGEgcmVzcG9uc2UgbGlrZSB0aGlzOjwvcD4KKzxzb3VyY2U+CitPSyAtIFN0YXJ0ZWQgYXBwbGljYXRpb24gYXQgY29udGV4dCBwYXRoIC9leGFtcGxlcworPC9zb3VyY2U+CisKKzxwPk90aGVyd2lzZSwgdGhlIHJlc3BvbnNlIHdpbGwgc3RhcnQgd2l0aCA8Y29kZT5GQUlMPC9jb2RlPiBhbmQgaW5jbHVkZSBhbgorZXJyb3IgbWVzc2FnZS4gIFBvc3NpYmxlIGNhdXNlcyBmb3IgcHJvYmxlbXMgaW5jbHVkZTo8L3A+Cis8dWw+Cis8bGk+PGVtPkVuY291bnRlcmVkIGV4Y2VwdGlvbjwvZW0+CisgICAgPGJsb2NrcXVvdGU+CisgICAgPHA+QW4gZXhjZXB0aW9uIHdhcyBlbmNvdW50ZXJlZCB0cnlpbmcgdG8gc3RhcnQgdGhlIHdlYiBhcHBsaWNhdGlvbi4KKyAgICBDaGVjayB0aGUgVG9tY2F0IDUgbG9ncyBmb3IgdGhlIGRldGFpbHMuPC9wPgorICAgIDwvYmxvY2txdW90ZT48L2xpPgorPGxpPjxlbT5JbnZhbGlkIGNvbnRleHQgcGF0aCB3YXMgc3BlY2lmaWVkPC9lbT4KKyAgICA8YmxvY2txdW90ZT4KKyAgICA8cD5UaGUgY29udGV4dCBwYXRoIG11c3Qgc3RhcnQgd2l0aCBhIHNsYXNoIGNoYXJhY3RlciwgdW5sZXNzIHlvdSBhcmUKKyAgICByZWZlcmVuY2luZyB0aGUgUk9PVCB3ZWIgYXBwbGljYXRpb24gLS0gaW4gd2hpY2ggY2FzZSB0aGUgY29udGV4dCBwYXRoCisgICAgbXVzdCBiZSBhIHplcm8tbGVuZ3RoIHN0cmluZy48L3A+CisgICAgPC9ibG9ja3F1b3RlPjwvbGk+Cis8bGk+PGVtPk5vIGNvbnRleHQgZXhpc3RzIGZvciBwYXRoIC9mb288L2VtPgorICAgIDxibG9ja3F1b3RlPgorICAgIDxwPlRoZXJlIGlzIG5vIGRlcGxveWVkIG9yIGluc3RhbGxlZCBhcHBsaWNhdGlvbiBvbiB0aGUgY29udGV4dCBwYXRoCisgICAgdGhhdCB5b3Ugc3BlY2lmaWVkLjwvcD4KKyAgICA8L2Jsb2NrcXVvdGU+PC9saT4KKzxsaT48ZW0+Tm8gY29udGV4dCBwYXRoIHdhcyBzcGVjaWZpZWQ8L2VtPgorICAgIDxibG9ja3F1b3RlPgorICAgIFRoZSA8Y29kZT5wYXRoPC9jb2RlPiBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQuCisgICAgPC9ibG9ja3F1b3RlPjwvbGk+Cis8L3VsPgorCis8L3N1YnNlY3Rpb24+CisKKzxzdWJzZWN0aW9uIG5hbWU9IlN0b3AgYW4gRXhpc3RpbmcgQXBwbGljYXRpb24iPgorCis8c291cmNlPgoraHR0cDovL2xvY2FsaG9zdDo4MDgwL21hbmFnZXIvc3RvcD9wYXRoPS9leGFtcGxlcworPC9zb3VyY2U+CisKKzxwPlNpZ25hbCBhbiBleGlzdGluZyBhcHBsaWNhdGlvbiB0byBtYWtlIGl0c2VsZiB1bmF2YWlsYWJsZSwgYnV0IGxlYXZlIGl0CitkZXBsb3llZCBvciBpbnN0YWxsZWQuICBBbnkgcmVxdWVzdCB0aGF0IGNvbWVzIGluIHdoaWxlIGFuIGFwcGxpY2F0aW9uIGlzCitzdG9wcGVkIHdpbGwgc2VlIGFuIEhUVFAgZXJyb3IgNDA0LCBhbmQgdGhpcyBhcHBsaWNhdGlvbiB3aWxsIHNob3cgYXMKKyJzdG9wcGVkIiBvbiBhIGxpc3QgYXBwbGljYXRpb25zIGNvbW1hbmQuPC9wPgorCis8cD5JZiB0aGlzIGNvbW1hbmQgc3VjY2VlZHMsIHlvdSB3aWxsIHNlZSBhIHJlc3BvbnNlIGxpa2UgdGhpczo8L3A+Cis8c291cmNlPgorT0sgLSBTdG9wcGVkIGFwcGxpY2F0aW9uIGF0IGNvbnRleHQgcGF0aCAvZXhhbXBsZXMKKzwvc291cmNlPgorCis8cD5PdGhlcndpc2UsIHRoZSByZXNwb25zZSB3aWxsIHN0YXJ0IHdpdGggPGNvZGU+RkFJTDwvY29kZT4gYW5kIGluY2x1ZGUgYW4KK2Vycm9yIG1lc3NhZ2UuICBQb3NzaWJsZSBjYXVzZXMgZm9yIHByb2JsZW1zIGluY2x1ZGU6PC9wPgorPHVsPgorPGxpPjxlbT5FbmNvdW50ZXJlZCBleGNlcHRpb248L2VtPgorICAgIDxibG9ja3F1b3RlPgorICAgIDxwPkFuIGV4Y2VwdGlvbiB3YXMgZW5jb3VudGVyZWQgdHJ5aW5nIHRvIHN0b3AgdGhlIHdlYiBhcHBsaWNhdGlvbi4KKyAgICBDaGVjayB0aGUgVG9tY2F0IDUgbG9ncyBmb3IgdGhlIGRldGFpbHMuPC9wPgorICAgIDwvYmxvY2txdW90ZT48L2xpPgorPGxpPjxlbT5JbnZhbGlkIGNvbnRleHQgcGF0aCB3YXMgc3BlY2lmaWVkPC9lbT4KKyAgICA8YmxvY2txdW90ZT4KKyAgICA8cD5UaGUgY29udGV4dCBwYXRoIG11c3Qgc3RhcnQgd2l0aCBhIHNsYXNoIGNoYXJhY3RlciwgdW5sZXNzIHlvdSBhcmUKKyAgICByZWZlcmVuY2luZyB0aGUgUk9PVCB3ZWIgYXBwbGljYXRpb24gLS0gaW4gd2hpY2ggY2FzZSB0aGUgY29udGV4dCBwYXRoCisgICAgbXVzdCBiZSBhIHplcm8tbGVuZ3RoIHN0cmluZy48L3A+CisgICAgPC9ibG9ja3F1b3RlPjwvbGk+Cis8bGk+PGVtPk5vIGNvbnRleHQgZXhpc3RzIGZvciBwYXRoIC9mb288L2VtPgorICAgIDxibG9ja3F1b3RlPgorICAgIDxwPlRoZXJlIGlzIG5vIGRlcGxveWVkIG9yIGluc3RhbGxlZCBhcHBsaWNhdGlvbiBvbiB0aGUgY29udGV4dCBwYXRoCisgICAgdGhhdCB5b3Ugc3BlY2lmaWVkLjwvcD4KKyAgICA8L2Jsb2NrcXVvdGU+PC9saT4KKzxsaT48ZW0+Tm8gY29udGV4dCBwYXRoIHdhcyBzcGVjaWZpZWQ8L2VtPgorICAgIDxibG9ja3F1b3RlPgorICAgIFRoZSA8Y29kZT5wYXRoPC9jb2RlPiBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQuCisgICAgPC9ibG9ja3F1b3RlPjwvbGk+Cis8L3VsPgorCis8L3N1YnNlY3Rpb24+CisKKworPHN1YnNlY3Rpb24gbmFtZT0iVW5kZXBsb3kgYW4gRXhpc3RpbmcgQXBwbGljYXRpb24iPgorCis8c291cmNlPgoraHR0cDovL2xvY2FsaG9zdDo4MDgwL21hbmFnZXIvdW5kZXBsb3k/cGF0aD0vZXhhbXBsZXMKKzwvc291cmNlPgorCis8cD48c3Ryb25nPjxmb250IGNvbG9yPSJyZWQiPldBUk5JTkc8L2ZvbnQ+IC0gVGhpcyBjb21tYW5kIHdpbGwKK2RlbGV0ZSB0aGUgY29udGVudHMgb2YgdGhlIHdlYiBhcHBsaWNhdGlvbiBkaXJlY3RvcnkgaWYgaXQgZXhpc3RzIHdpdGhpbiB0aGUKKzxjb2RlPmFwcEJhc2U8L2NvZGU+IGRpcmVjdG9yeSAodHlwaWNhbGx5ICJ3ZWJhcHBzIikgZm9yIHRoaXMgdmlydHVhbCBob3N0Cis8L3N0cm9uZz4uICBUaGlzIHdpbGwgYWxzbyBkZWxldGUgdGhlIHNvdXJjZSAuV0FSIGlmIGV4cGFuZGluZyBvY2N1cnJlZCwgYXMKK3dlbGwgYXMgdGhlIFhNTCBDb250ZXh0IGRlZmluaXRpb24uIElmIHlvdSBzaW1wbHkgd2FudCB0byB0YWtlIGFuIGFwcGxpY2F0aW9uCitvdXQgb2Ygc2VydmljZSwgeW91IHNob3VsZCB1c2UgdGhlIDxjb2RlPi9zdG9wPC9jb2RlPiBjb21tYW5kIGluc3RlYWQuPC9wPgorCis8cD5TaWduYWwgYW4gZXhpc3RpbmcgYXBwbGljYXRpb24gdG8gZ3JhY2VmdWxseSBzaHV0IGl0c2VsZiBkb3duLCBhbmQKK3JlbW92ZSBpdCBmcm9tIFRvbWNhdCAod2hpY2ggYWxzbyBtYWtlcyB0aGlzIGNvbnRleHQgcGF0aCBhdmFpbGFibGUgZm9yCityZXVzZSBsYXRlcikuICBJbiBhZGRpdGlvbiwgdGhlIGRvY3VtZW50IHJvb3QgZGlyZWN0b3J5IGlzIHJlbW92ZWQsIGlmIGl0CitleGlzdHMgaW4gdGhlIDxjb2RlPmFwcEJhc2U8L2NvZGU+IGRpcmVjdG9yeSAodHlwaWNhbGx5ICJ3ZWJhcHBzIikgZm9yCit0aGlzIHZpcnR1YWwgaG9zdC4gIFRoaXMgY29tbWFuZCBpcyB0aGUgbG9naWNhbCBvcHBvc2l0ZSBvZiB0aGUKKzxjb2RlPi9kZXBsb3k8L2NvZGU+IGNvbW1hbmQuPC9wPgorCis8cD5JZiB0aGlzIGNvbW1hbmQgc3VjY2VlZHMsIHlvdSB3aWxsIHNlZSBhIHJlc3BvbnNlIGxpa2UgdGhpczo8L3A+Cis8c291cmNlPgorT0sgLSBVbmRlcGxveWVkIGFwcGxpY2F0aW9uIGF0IGNvbnRleHQgcGF0aCAvZXhhbXBsZXMKKzwvc291cmNlPgorCis8cD5PdGhlcndpc2UsIHRoZSByZXNwb25zZSB3aWxsIHN0YXJ0IHdpdGggPGNvZGU+RkFJTDwvY29kZT4gYW5kIGluY2x1ZGUgYW4KK2Vycm9yIG1lc3NhZ2UuICBQb3NzaWJsZSBjYXVzZXMgZm9yIHByb2JsZW1zIGluY2x1ZGU6PC9wPgorPHVsPgorPGxpPjxlbT5FbmNvdW50ZXJlZCBleGNlcHRpb248L2VtPgorICAgIDxibG9ja3F1b3RlPgorICAgIDxwPkFuIGV4Y2VwdGlvbiB3YXMgZW5jb3VudGVyZWQgdHJ5aW5nIHRvIHVuZGVwbG95IHRoZSB3ZWIgYXBwbGljYXRpb24uCisgICAgQ2hlY2sgdGhlIFRvbWNhdCA1IGxvZ3MgZm9yIHRoZSBkZXRhaWxzLjwvcD4KKyAgICA8L2Jsb2NrcXVvdGU+PC9saT4KKzxsaT48ZW0+SW52YWxpZCBjb250ZXh0IHBhdGggd2FzIHNwZWNpZmllZDwvZW0+CisgICAgPGJsb2NrcXVvdGU+CisgICAgPHA+VGhlIGNvbnRleHQgcGF0aCBtdXN0IHN0YXJ0IHdpdGggYSBzbGFzaCBjaGFyYWN0ZXIsIHVubGVzcyB5b3UgYXJlCisgICAgcmVmZXJlbmNpbmcgdGhlIFJPT1Qgd2ViIGFwcGxpY2F0aW9uIC0tIGluIHdoaWNoIGNhc2UgdGhlIGNvbnRleHQgcGF0aAorICAgIG11c3QgYmUgYSB6ZXJvLWxlbmd0aCBzdHJpbmcuPC9wPgorICAgIDwvYmxvY2txdW90ZT48L2xpPgorPGxpPjxlbT5ObyBjb250ZXh0IGV4aXN0cyBmb3IgcGF0aCAvZm9vPC9lbT4KKyAgICA8YmxvY2txdW90ZT4KKyAgICA8cD5UaGVyZSBpcyBubyBkZXBsb3llZCBvciBpbnN0YWxsZWQgYXBwbGljYXRpb24gb24gdGhlIGNvbnRleHQgcGF0aAorICAgIHRoYXQgeW91IHNwZWNpZmllZC48L3A+CisgICAgPC9ibG9ja3F1b3RlPjwvbGk+Cis8bGk+PGVtPk5vIGNvbnRleHQgcGF0aCB3YXMgc3BlY2lmaWVkPC9lbT4KKyAgICA8YmxvY2txdW90ZT4KKyAgICBUaGUgPGNvZGU+cGF0aDwvY29kZT4gcGFyYW1ldGVyIGlzIHJlcXVpcmVkLgorICAgIDwvYmxvY2txdW90ZT48L2xpPgorPC91bD4KKworPC9zdWJzZWN0aW9uPgorCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iRXhlY3V0aW5nIE1hbmFnZXIgQ29tbWFuZHMgV2l0aCBBbnQiPgorCis8cD5JbiBhZGRpdGlvbiB0byB0aGUgYWJpbGl0eSB0byBleGVjdXRlIE1hbmFnZXIgY29tbWFuZHMgdmlhIEhUVFAgcmVxdWVzdHMsCithcyBkb2N1bWVudGVkIGFib3ZlLCBUb21jYXQgNSBpbmNsdWRlcyBhIGNvbnZlbmllbnQgc2V0IG9mIFRhc2sgZGVmaW5pdGlvbnMKK2ZvciB0aGUgPGVtPkFudDwvZW0+ICh2ZXJzaW9uIDEuNCBvciBsYXRlcikgYnVpbGQgdG9vbC4gIEluIG9yZGVyIHRvIHVzZSB0aGVzZQorY29tbWFuZHMsIHlvdSBtdXN0IHBlcmZvcm0gdGhlIGZvbGxvd2luZyBzZXR1cCBvcGVyYXRpb25zOjwvcD4KKzx1bD4KKzxsaT5Eb3dubG9hZCB0aGUgYmluYXJ5IGRpc3RyaWJ1dGlvbiBvZiBBbnQgZnJvbQorICAgIDxhIGhyZWY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvYW50LyI+aHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9hbnQ8L2E+LgorICAgIFlvdSBtdXN0IHVzZSB2ZXJzaW9uIDxzdHJvbmc+MS40PC9zdHJvbmc+IG9yIGxhdGVyLjwvbGk+Cis8bGk+SW5zdGFsbCB0aGUgQW50IGRpc3RyaWJ1dGlvbiBpbiBhIGNvbnZlbmllbnQgZGlyZWN0b3J5IChjYWxsZWQKKyAgICBBTlRfSE9NRSBpbiB0aGUgcmVtYWluZGVyIG9mIHRoZXNlIGluc3RydWN0aW9ucykuPC9saT4KKzxsaT5Db3B5IHRoZSBmaWxlIDxjb2RlPnNlcnZlci9saWIvY2F0YWxpbmEtYW50LmphcjwvY29kZT4gZnJvbSB5b3VyIFRvbWNhdCA1CisgICAgaW5zdGFsbGF0aW9uIGludG8gQW50J3MgbGlicmFyeSBkaXJlY3RvcnkgKDxjb2RlPiRBTlRfSE9NRS9saWI8L2NvZGU+KS4KKyAgICA8L2xpPgorPGxpPkFkZCB0aGUgPGNvZGU+JEFOVF9IT01FL2JpbjwvY29kZT4gZGlyZWN0b3J5IHRvIHlvdXIgPGNvZGU+UEFUSDwvY29kZT4KKyAgICBlbnZpcm9ubWVudCB2YXJpYWJsZS48L2xpPgorPGxpPkNvbmZpZ3VyZSBhdCBsZWFzdCBvbmUgdXNlcm5hbWUvcGFzc3dvcmQgY29tYmluYXRpb24gaW4geW91ciBUb21jYXQKKyAgICB1c2VyIGRhdGFiYXNlIHRoYXQgaW5jbHVkZXMgdGhlIDxjb2RlPm1hbmFnZXI8L2NvZGU+IHJvbGUuPC9saT4KKzwvdWw+CisKKzxwPlRvIHVzZSBjdXN0b20gdGFza3Mgd2l0aGluIEFudCwgeW91IG11c3QgZGVjbGFyZSB0aGVtIGZpcnN0IHdpdGggYQorPGNvZGU+Jmx0O3Rhc2tkZWYmZ3Q7PC9jb2RlPiBlbGVtZW50LiAgVGhlcmVmb3JlLCB5b3VyIDxjb2RlPmJ1aWxkLnhtbDwvY29kZT4KK2ZpbGUgbWlnaHQgbG9vayBzb21ldGhpbmcgbGlrZSB0aGlzOjwvcD4KKworPHRhYmxlIGJvcmRlcj0iMSI+Cis8dHI+PHRkPjxwcmU+CismbHQ7cHJvamVjdCBuYW1lPSJNeSBBcHBsaWNhdGlvbiIgZGVmYXVsdD0iY29tcGlsZSIgYmFzZWRpcj0iLiImZ3Q7CisKKyAgJmx0OyEtLSBDb25maWd1cmUgdGhlIGRpcmVjdG9yeSBpbnRvIHdoaWNoIHRoZSB3ZWIgYXBwbGljYXRpb24gaXMgYnVpbHQgLS0mZ3Q7CisgICZsdDtwcm9wZXJ0eSBuYW1lPSJidWlsZCIgICAgdmFsdWU9IiR7YmFzZWRpcn0vYnVpbGQiLyZndDsKKworICAmbHQ7IS0tIENvbmZpZ3VyZSB0aGUgY29udGV4dCBwYXRoIGZvciB0aGlzIGFwcGxpY2F0aW9uIC0tJmd0OworICAmbHQ7cHJvcGVydHkgbmFtZT0icGF0aCIgICAgIHZhbHVlPSIvbXlhcHAiLyZndDsKKworICAmbHQ7IS0tIENvbmZpZ3VyZSBwcm9wZXJ0aWVzIHRvIGFjY2VzcyB0aGUgTWFuYWdlciBhcHBsaWNhdGlvbiAtLSZndDsKKyAgJmx0O3Byb3BlcnR5IG5hbWU9InVybCIgICAgICB2YWx1ZT0iaHR0cDovL2xvY2FsaG9zdDo4MDgwL21hbmFnZXIiLyZndDsKKyAgJmx0O3Byb3BlcnR5IG5hbWU9InVzZXJuYW1lIiB2YWx1ZT0ibXl1c2VybmFtZSIvJmd0OworICAmbHQ7cHJvcGVydHkgbmFtZT0icGFzc3dvcmQiIHZhbHVlPSJteXBhc3N3b3JkIi8mZ3Q7CisKKyAgJmx0OyEtLSBDb25maWd1cmUgdGhlIGN1c3RvbSBBbnQgdGFza3MgZm9yIHRoZSBNYW5hZ2VyIGFwcGxpY2F0aW9uIC0tJmd0OworICAmbHQ7dGFza2RlZiBuYW1lPSJkZXBsb3kiICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5hbnQuRGVwbG95VGFzayIvJmd0OworICAmbHQ7dGFza2RlZiBuYW1lPSJsaXN0IiAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5hbnQuTGlzdFRhc2siLyZndDsKKyAgJmx0O3Rhc2tkZWYgbmFtZT0icmVsb2FkIiAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuYW50LlJlbG9hZFRhc2siLyZndDsKKyAgJmx0O3Rhc2tkZWYgbmFtZT0icmVzb3VyY2VzIiBjbGFzc25hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuYW50LlJlc291cmNlc1Rhc2siLyZndDsKKyAgJmx0O3Rhc2tkZWYgbmFtZT0icm9sZXMiICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuYW50LlJvbGVzVGFzayIvJmd0OworICAmbHQ7dGFza2RlZiBuYW1lPSJzdGFydCIgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5hbnQuU3RhcnRUYXNrIi8mZ3Q7CisgICZsdDt0YXNrZGVmIG5hbWU9InN0b3AiICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmNhdGFsaW5hLmFudC5TdG9wVGFzayIvJmd0OworICAmbHQ7dGFza2RlZiBuYW1lPSJ1bmRlcGxveSIgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5hbnQuVW5kZXBsb3lUYXNrIi8mZ3Q7CisKKyAgJmx0OyEtLSBFeGVjdXRhYmxlIFRhcmdldHMgLS0mZ3Q7CisgICZsdDt0YXJnZXQgbmFtZT0iY29tcGlsZSIgZGVzY3JpcHRpb249IkNvbXBpbGUgd2ViIGFwcGxpY2F0aW9uIiZndDsKKyAgICAmbHQ7IS0tIC4uLiBjb25zdHJ1Y3Qgd2ViIGFwcGxpY2F0aW9uIGluICR7YnVpbGR9IHN1YmRpcmVjdG9yeSwgYW5kCisgICAgICAgICAgICBnZW5lcmF0ZWQgYSAke3BhdGh9LndhciAuLi4gLS0mZ3Q7CisgICZsdDsvdGFyZ2V0Jmd0OworCisgICZsdDt0YXJnZXQgbmFtZT0iZGVwbG95IiBkZXNjcmlwdGlvbj0iSW5zdGFsbCB3ZWIgYXBwbGljYXRpb24iCisgICAgICAgICAgZGVwZW5kcz0iY29tcGlsZSImZ3Q7CisgICAgJmx0O2RlcGxveSB1cmw9IiR7dXJsfSIgdXNlcm5hbWU9IiR7dXNlcm5hbWV9IiBwYXNzd29yZD0iJHtwYXNzd29yZH0iCisgICAgICAgICAgICBwYXRoPSIke3BhdGh9IiB3YXI9IiR7YnVpbGR9JHtwYXRofS53YXIiLyZndDsKKyAgJmx0Oy90YXJnZXQmZ3Q7CisKKyAgJmx0O3RhcmdldCBuYW1lPSJyZWxvYWQiIGRlc2NyaXB0aW9uPSJSZWxvYWQgd2ViIGFwcGxpY2F0aW9uIgorICAgICAgICAgIGRlcGVuZHM9ImNvbXBpbGUiJmd0OworICAgICZsdDtyZWxvYWQgIHVybD0iJHt1cmx9IiB1c2VybmFtZT0iJHt1c2VybmFtZX0iIHBhc3N3b3JkPSIke3Bhc3N3b3JkfSIKKyAgICAgICAgICAgIHBhdGg9IiR7cGF0aH0iLyZndDsKKyAgJmx0Oy90YXJnZXQmZ3Q7CisKKyAgJmx0O3RhcmdldCBuYW1lPSJ1bmRlcGxveSIgZGVzY3JpcHRpb249IlJlbW92ZSB3ZWIgYXBwbGljYXRpb24iJmd0OworICAgICZsdDt1bmRlcGxveSB1cmw9IiR7dXJsfSIgdXNlcm5hbWU9IiR7dXNlcm5hbWV9IiBwYXNzd29yZD0iJHtwYXNzd29yZH0iCisgICAgICAgICAgICBwYXRoPSIke3BhdGh9Ii8mZ3Q7CisgICZsdDsvdGFyZ2V0Jmd0OworCismbHQ7L3Byb2plY3QmZ3Q7Cis8L3ByZT48L3RkPjwvdHI+Cis8L3RhYmxlPgorCis8cD5Ob3csIHlvdSBjYW4gZXhlY3V0ZSBjb21tYW5kcyBsaWtlIDxjb2RlPmFudCBkZXBsb3k8L2NvZGU+IHRvIGRlcGxveSB0aGUKK2FwcGxjYXRpb24gdG8gYSBydW5uaW5nIGluc3RhbmNlIG9mIFRvbWNhdCwgb3IgPGNvZGU+YW50IHJlbG9hZDwvY29kZT4gdG8KK3RlbGwgVG9tY2F0IHRvIHJlbG9hZCBpdC4gIE5vdGUgYWxzbyB0aGF0IG1vc3Qgb2YgdGhlIGludGVyZXN0aW5nIHZhbHVlcyBpbgordGhpcyA8Y29kZT5idWlsZC54bWw8L2NvZGU+IGZpbGUgYXJlIGRlZmluZWQgYXMgcmVwbGFjZWFibGUgcHJvcGVydGllcywgc28KK3lvdSBjYW4gb3ZlcnJpZGUgdGhlaXIgdmFsdWVzIGZyb20gdGhlIGNvbW1hbmQgbGluZS4gIEZvciBleGFtcGxlLCB5b3UgbWlnaHQKK2NvbnNpZGVyIGl0IGEgc2VjdXJpdHkgcmlzayB0byBpbmNsdWRlIHRoZSByZWFsIG1hbmFnZXIgcGFzc3dvcmQgaW4geW91cgorPGNvZGU+YnVpbGQueG1sPC9jb2RlPiBmaWxlJ3Mgc291cmNlIGNvZGUuICBUbyBhdm9pZCB0aGlzLCBvbWl0IHRoZSBwYXNzd29yZAorcHJvcGVydHksIGFuZCBzcGVjaWZ5IGl0IGZyb20gdGhlIGNvbW1hbmQgbGluZTo8L3A+Cis8cHJlPgorICBhbnQgLURwYXNzd29yZD1zZWNyZXQgZGVwbG95Cis8L3ByZT4KKworPC9zZWN0aW9uPgorCis8c2VjdGlvbiBuYW1lPSJVc2luZyB0aGUgSk1YIFByb3h5IFNlcnZsZXQiPgorCisgIDxzdWJzZWN0aW9uIG5hbWU9IldoYXQgaXMgSk1YIFByb3h5IFNlcnZsZXQiPgorICAgIFRoZSBKTVggUHJveHkgU2VydmxldCBpcyBhIGxpZ2h0d2VpZ2h0IHByb3h5IHRvIGdldCBhbmQgc2V0IHRoZQorICAgIHRvbWNhdCBpbnRlcm5hbHMuIChPciBhbnkgY2xhc3MgdGhhdCBoYXMgYmVlbiBleHBvc2VkIHZpYSBhbiBNQmVhbikKKyAgICBJdHMgdXNhZ2UgaXMgbm90IHZlcnkgdXNlciBmcmllbmRseSBidXQgdGhlIFVJIGlzCisgICAgZXh0cmVtZWx5IGhlbHAgZm9yIGludGVncmF0aW5nIGNvbW1hbmQgbGluZSBzY3JpcHRzIGZvciBtb25pdG9yaW5nCisgICAgYW5kIGNoYW5naW5nIHRoZSBpbnRlcm5hbHMgb2YgdG9tY2F0LiBZb3UgY2FuIGRvIHR3byB0aGluZ3Mgd2l0aCB0aGUgcHJveHk6CisgICAgZ2V0IGluZm9ybWF0aW9uIGFuZCBzZXQgaW5mb3JtYXRpb24uIEZvciB5b3UgdG8gcmVhbGx5IHVuZGVyc3RhbmQgdGhlCisgICAgSk1YIFByb3h5IFNlcnZsZXQsIHlvdSBzaG91bGQgaGF2ZSBhIGdlbmVyYWwgdW5kZXJzdGFuZGluZyBvZiBKTVguCisgICAgSWYgeW91IGRvbid0IGtub3cgd2hhdCBKTVggaXMsIHRoZW4gcHJlcGFyZSB0byBiZSBjb25mdXNlZC4KKyAgPC9zdWJzZWN0aW9uPgorCisgIDxzdWJzZWN0aW9uIG5hbWU9IkpNWCBRdWVyeSBjb21tYW5kIj4KKyAgICBUaGlzIHRha2VzIHRoZSBmb3JtOgorPHNvdXJjZT4KK2h0dHA6Ly93ZWJzZXJ2ZXIvbWFuYWdlci9qbXhwcm94eS8/cXJ5PVNUVUZGCis8L3NvdXJjZT4KKyAgICBXaGVyZSA8Y29kZT5TVFVGRjwvY29kZT4gaXMgdGhlIEpNWCBxdWVyeSB5b3Ugd2lzaCB0byBwZXJmb3JtLiBGb3IgZXhhbXBsZSwKKyAgICBoZXJlIGFyZSBzb21lIHF1ZXJpZXMgeW91IG1pZ2h0IHdpc2ggdG8gcnVuOgorICAgIDx1bD4KKyAgICAgIDxsaT4KKyAgICAgICAgPGNvZGU+cXJ5PSolM0F0eXBlJTNEUmVxdWVzdFByb2Nlc3NvciUyQyogLS0+CisgICAgICAgICB0eXBlPVJlcXVlc3RQcm9jZXNzb3I8L2NvZGU+IHdoaWNoIHdpbGwgbG9jYXRlIGFsbAorICAgICAgICAgd29ya2VycyB3aGljaCBjYW4gcHJvY2VzcyByZXF1ZXN0cyBhbmQgcmVwb3J0CisgICAgICAgICB0aGVpciBzdGF0ZS4KKyAgICAgIDwvbGk+CisgICAgICA8bGk+CisgICAgICAgIDxjb2RlPnFyeT0qJTNBajJlZVR5cGU9U2VydmxldCUyYyogLS0+CisgICAgICAgICAgICBqMmVlVHlwZT1TZXJ2bGV0PC9jb2RlPiB3aGljaCByZXR1cm4gYWxsIGxvYWRlZCBzZXJ2bGV0cy4KKyAgICAgIDwvbGk+CisgICAgICA8bGk+CisgICAgICAgIDxjb2RlPnFyeT1DYXRhbGluYSUzQXR5cGUlM0RFbnZpcm9ubWVudCUyQ3Jlc291cmNldHlwZSUzREdsb2JhbCUyQ25hbWUlM0RzaW1wbGVWYWx1ZSAtLT4KKyAgICAgICAgICAgIENhdGFsaW5hOnR5cGU9RW52aXJvbm1lbnQscmVzb3VyY2V0eXBlPUdsb2JhbCxuYW1lPXNpbXBsZVZhbHVlPC9jb2RlPgorICAgICAgICAgICAgd2hpY2ggbG9vayBmb3IgYSBzcGVjaWZpYyBNQmVhbiBieSB0aGUgZ2l2ZW4gbmFtZS4KKyAgICAgIDwvbGk+CisgICAgPC91bD4KKyAgICBZb3UnbGwgbmVlZCB0byBleHBlcmltZW50IHdpdGggdGhpcyB0byByZWFsbHkgdW5kZXJzdGFuZCBpdHMgY2FwYWJpbGl0ZXMuCisgICAgSWYgeW91IHByb3ZpZGUgbm8gPGNvZGU+cXJ5PC9jb2RlPiBwYXJhbWV0ZXIsIHRoZW4gYWxsIG9mIHRoZSBNQmVhbnMgd2lsbAorICAgIGJlIGRpc3BsYXllZC4gV2UgcmVhbGx5IHJlY29tbWVuZCBsb29raW5nIGF0IHRoZSB0b21jYXQgc291cmNlIGNvZGUgYW5kCisgICAgdW5kZXJzdGFuZCB0aGUgSk1YIHNwZWMgdG8gZ2V0IGEgYmV0dGVyIHVuZGVyc3RhbmRpbmcgb2YgYWxsIHRoZSBxdWVyaWVzCisgICAgeW91IG1heSBydW4uCisgIDwvc3Vic2VjdGlvbj4KKworICA8c3Vic2VjdGlvbiBuYW1lPSJKTVggU2V0IGNvbW1hbmQiPgorICAgIE5vdyB0aGF0IHlvdSBjYW4gcXVlcnkgYW4gTUJlYW4sIGl0cyB0aW1lIHRvIG11Y2sgd2l0aCBUb21jYXQncyBpbnRlcm5hbHMhCisgICAgVGhlIGdlbmVyYWwgZm9ybSBvZiB0aGUgc2V0IGNvbW1hbmQgaXMgOgorPHNvdXJjZT4KK2h0dHA6Ly93ZWJzZXJ2ZXIvbWFuYWdlci9qbXhwcm94eS8/c2V0PUJFQU5OQU1FJmFtcDthdHQ9TVlBVFRSSUJVVEUmYW1wO3ZhbD1ORVdWQUxVRQorPC9zb3VyY2U+CisgICAgU28geW91IG5lZWQgdG8gcHJvdmlkZSAzIHJlcXVlc3QgcGFyYW1ldGVyczoKKyAgICA8b2w+CisgICAgICA8bGk+PGNvZGU+c2V0PC9jb2RlPjogVGhlIGZ1bGwgYmVhbiBuYW1lPC9saT4KKyAgICAgIDxsaT48Y29kZT5hdHQ8L2NvZGU+OiBUaGUgYXR0cmlidXRlIHlvdSB3aXNoIHRvIGFsdGVyPC9saT4KKyAgICAgIDxsaT48Y29kZT52YWw8L2NvZGU+OiBUaGUgbmV3IHZhbHVlIDwvbGk+CisgICAgPC9vbD4KKyAgICBJZiBhbGwgZ29lcyBvaywgdGhlbiBpdCB3aWxsIHNheSBPSywgb3RoZXJ3aXNlIGFuIGVycm9yIG1lc3NhZ2Ugd2lsbCBiZQorICAgIHNob3duLiBGb3IgZXhhbXBsZSwgbGV0cyBzYXkgd2Ugd2lzaCB0byB0dXJuIHVwIGRlYnVnZ2luZyBvbiB0aGUgZmx5IGZvciB0aGUKKyAgICA8Y29kZT5FcnJvclJlcG9ydFZhbHZlPC9jb2RlPi4gVGhlIGZvbGxvd2luZyB3aWxsIHNldCBkZWJ1Z2dpbmcgdG8gMTAuCis8c291cmNlPgoraHR0cDovL2xvY2FsaG9zdDo4MDgwL21hbmFnZXIvam14cHJveHkvCis/c2V0PUNhdGFsaW5hJTNBdHlwZSUzRFZhbHZlJTJDbmFtZSUzREVycm9yUmVwb3J0VmFsdmUlMkNob3N0JTNEbG9jYWxob3N0JmFtcDthdHQ9ZGVidWcmYW1wO3ZhbD0xMAorPC9zb3VyY2U+CisgICAgYW5kIG15IHJlc3VsdCBpcyAoWU1NVik6Cis8c291cmNlPgorUmVzdWx0OiBvaworPC9zb3VyY2U+CisKKyAgICBIZXJlIGlzIHdoYXQgSSBzZWUgaWYgSSBwYXNzIGluIGEgYmFkIHZhbHVlLiBIZXJlIGlzIHRoZSBVUkwgSSB1c2VkLAorICAgIEkgdHJ5IHNldCBkZWJ1Z2dpbmcgZXF1YWwgdG8gJ2Nvd2JlbGwnOgorPHNvdXJjZT4KK2h0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9tYW5hZ2VyL2pteHByb3h5LworP3NldD1DYXRhbGluYSUzQXR5cGUlM0RWYWx2ZSUyQ25hbWUlM0RFcnJvclJlcG9ydFZhbHZlJTJDaG9zdCUzRGxvY2FsaG9zdCZhbXA7YXR0PWRlYnVnJmFtcDt2YWw9Y293YmVsbAorPC9zb3VyY2U+CisgICAgV2hlbiBJIHRyeSB0aGF0LCBteSByZXN1bHQgaXMKKzxzb3VyY2U+CitFcnJvcjogamF2YS5sYW5nLk51bWJlckZvcm1hdEV4Y2VwdGlvbjogRm9yIGlucHV0IHN0cmluZzogImNvd2JlbGwiCis8L3NvdXJjZT4KKyAgPC9zdWJzZWN0aW9uPgorCisKKzwvc2VjdGlvbj4KKworCisKKzwvYm9keT4KKworPC9kb2N1bWVudD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvbWJlYW5zLWRlc2NyaXB0b3ItaG93dG8ueG1sIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9tYmVhbnMtZGVzY3JpcHRvci1ob3d0by54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdjOWNhMAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvbWJlYW5zLWRlc2NyaXB0b3ItaG93dG8ueG1sCkBAIC0wLDAgKzEsNjMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCFET0NUWVBFIGRvY3VtZW50IFsKKyAgPCFFTlRJVFkgcHJvamVjdCBTWVNURU0gInByb2plY3QueG1sIj4KK10+Cis8ZG9jdW1lbnQgdXJsPSJtYmVhbi1kZXNjcmlwdG9yLWhvd3RvLmh0bWwiPgorCisgICAgJnByb2plY3Q7CisKKyAgICA8cHJvcGVydGllcz4KKyAgICAgICAgPGF1dGhvciBlbWFpbD0iYW15cm9oQGFwYWNoZS5vcmciPkFteSBSb2g8L2F1dGhvcj4KKyAgICAgICAgPHRpdGxlPk1CZWFuIERlc2NyaXB0b3IgSG93IFRvPC90aXRsZT4KKyAgICA8L3Byb3BlcnRpZXM+CisKKzxib2R5PgorCis8c2VjdGlvbiBuYW1lPSJJbnRyb2R1Y3Rpb24iPgorCis8cD5Ub21jYXQgNSB1c2VzIEpNWCBNQmVhbnMgYXMgdGhlIHRlY2hub2xvZ3kgZm9yIGltcGxlbWVudGluZyAKK21hbmFnZWFiaWxpdHkgb2YgVG9tY2F0LjwvcD4KKworPHA+VGhlIGRlc2NyaXB0aW9ucyBvZiBKTVggTUJlYW5zIGZvciBDYXRhbGluYSBhcmUgaW4gdGhlIG1iZWFucy1kZXNjcmlwdG9yLnhtbCAKK2ZpbGUgaW4gZWFjaCBwYWNrYWdlLjwvcD4KKworPHA+WW91IHdpbGwgbmVlZCB0byBhZGQgTUJlYW4gZGVzY3JpcHRpb25zIGZvciB5b3VyIGN1c3RvbSBjb21wb25lbnRzIAoraW4gb3JkZXIgdG8gYXZvaWQgYSAiTWFuYWdlZEJlYW4gaXMgbm90IGZvdW5kIiBleGNlcHRpb24uPC9wPgorCis8L3NlY3Rpb24+CisKKzxzZWN0aW9uIG5hbWU9IkFkZGluZyBNQmVhbiBkZXNjcmlwdGlvbnMiPgorCis8cD5Zb3UgbWF5IGFsc28gYWRkIE1CZWFuIGRlc2NyaXB0aW9ucyBmb3IgY3VzdG9tIGNvbXBvbmVudHMgaW4gCithIG1iZWFucy1kZXNjcmlwdG9yLnhtbCBmaWxlLCBsb2NhdGVkIGluIHRoZSBzYW1lIHBhY2thZ2UgYXMgdGhlIGNsYXNzIGZpbGVzCitpdCBkZXNjcmliZXMuPC9wPgorCis8c291cmNlPgorICAmbHQ7bWJlYW4gICAgICAgICBuYW1lPSJMREFQUmVhbG0iCisgICAgICAgICAgICBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEubWJlYW5zLkNsYXNzTmFtZU1CZWFuIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJDdXN0b20gTERBUFJlYWxtIgorICAgICAgICAgICAgICAgZG9tYWluPSJDYXRhbGluYSIKKyAgICAgICAgICAgICAgICBncm91cD0iUmVhbG0iCisgICAgICAgICAgICAgICAgIHR5cGU9ImNvbS5teWZpcm0ubXlwYWNrYWdlLkxEQVBSZWFsbSImZ3Q7CisKKyAgICAmbHQ7YXR0cmlidXRlICAgbmFtZT0iY2xhc3NOYW1lIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJGdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgbWFuYWdlZCBvYmplY3QiCisgICAgICAgICAgICAgICAgIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICB3cml0ZWFibGU9ImZhbHNlIi8mZ3Q7CisKKyAgICAmbHQ7YXR0cmlidXRlICAgbmFtZT0iZGVidWciCisgICAgICAgICAgZGVzY3JpcHRpb249IlRoZSBkZWJ1Z2dpbmcgZGV0YWlsIGxldmVsIGZvciB0aGlzIGNvbXBvbmVudCIKKyAgICAgICAgICAgICAgICAgdHlwZT0iaW50Ii8mZ3Q7CisgICAgLgorICAgIC4KKyAgICAuCisKKyAgJmx0Oy9tYmVhbiZndDsKKzwvc291cmNlPgorCisKKzwvc2VjdGlvbj4KKworPC9ib2R5PgorCis8L2RvY3VtZW50PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9wcm9qZWN0LnhtbCBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvcHJvamVjdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y5YzFiMAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvcHJvamVjdC54bWwKQEAgLTAsMCArMSw2NiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgorPHByb2plY3QgbmFtZT0iQXBhY2hlIEpha2FydGEgVG9tY2F0IERvY3VtZW50YXRpb24gLSBUb3AgTGV2ZWwgRGlyZWN0b3J5IgorICAgICAgICBocmVmPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3RvbWNhdC8iPgorCisgICAgPHRpdGxlPlRoZSBBcGFjaGUgSmFrYXJ0YSBUb21jYXQgNS41IFNlcnZsZXQvSlNQIENvbnRhaW5lcjwvdGl0bGU+CisKKyAgICA8bG9nbyBocmVmPSIvaW1hZ2VzL3RvbWNhdC5naWYiPgorICAgICAgVGhlIEFwYWNoZSBKYWthcnRhIFRvbWNhdCBTZXJ2bGV0L0pTUCBDb250YWluZXIKKyAgICA8L2xvZ28+CisKKworICAgIDxib2R5PgorCisgICAgPG1lbnUgbmFtZT0iTGlua3MiPgorICAgICAgICA8aXRlbSBuYW1lPSJEb2NzIEhvbWUiICAgICAgICAgICAgIGhyZWY9ImluZGV4Lmh0bWwiLz4KKyAgICA8L21lbnU+CisKKyAgICA8bWVudSBuYW1lPSJVc2VyIEd1aWRlIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iMSkgSW50cm9kdWN0aW9uIiAgICAgICAgaHJlZj0iaW50cm9kdWN0aW9uLmh0bWwiLz4KKyAgICAgICAgPGl0ZW0gbmFtZT0iMikgU2V0dXAiICAgICAgICAgICAgICAgaHJlZj0ic2V0dXAuaHRtbCIvPgorICAgICAgICA8aXRlbSBuYW1lPSIzKSBGaXJzdCB3ZWJhcHAiICAgICAgICBocmVmPSJhcHBkZXYvaW5kZXguaHRtbCIvPgorICAgICAgICA8aXRlbSBuYW1lPSI0KSBEZXBsb3llciIgICAgICAgICAgICBocmVmPSJkZXBsb3llci1ob3d0by5odG1sIi8+CisgICAgICAgIDxpdGVtIG5hbWU9IjUpIE1hbmFnZXIiICAgICAgICAgICAgIGhyZWY9Im1hbmFnZXItaG93dG8uaHRtbCIvPgorICAgICAgICA8aXRlbSBuYW1lPSI2KSBSZWFsbXMgYW5kIEFBQSIgICAgICBocmVmPSJyZWFsbS1ob3d0by5odG1sIi8+CisgICAgICAgIDxpdGVtIG5hbWU9IjcpIFNlY3VyaXR5IE1hbmFnZXIiCisgICAgICAgICAgICAgIGhyZWY9InNlY3VyaXR5LW1hbmFnZXItaG93dG8uaHRtbCIvPgorICAgICAgICA8aXRlbSBuYW1lPSI4KSBKTkRJIFJlc291cmNlcyIgICAgICBocmVmPSJqbmRpLXJlc291cmNlcy1ob3d0by5odG1sIi8+CisgICAgICAgIDxpdGVtIG5hbWU9IjkpIEpEQkMgRGF0YVNvdXJjZXMiCisgICAgICAgICAgICAgIGhyZWY9ImpuZGktZGF0YXNvdXJjZS1leGFtcGxlcy1ob3d0by5odG1sIi8+CisgICAgICAgIDxpdGVtIG5hbWU9IjEwKSBDbGFzc2xvYWRpbmciICAgICAgIGhyZWY9ImNsYXNzLWxvYWRlci1ob3d0by5odG1sIi8+CisgICAgICAgIDxpdGVtIG5hbWU9IjExKSBKU1BzIiAgICAgICAgICAgICAgIGhyZWY9Imphc3Blci1ob3d0by5odG1sIi8+CisgICAgICAgIDxpdGVtIG5hbWU9IjEyKSBTU0wiICAgICAgICAgICAgICAgIGhyZWY9InNzbC1ob3d0by5odG1sIi8+CisgICAgICAgIDxpdGVtIG5hbWU9IjEzKSBTU0kiICAgICAgICAgICAgICAgIGhyZWY9InNzaS1ob3d0by5odG1sIi8+CisgICAgICAgIDxpdGVtIG5hbWU9IjE0KSBDR0kiICAgICAgICAgICAgICAgIGhyZWY9ImNnaS1ob3d0by5odG1sIi8+CisgICAgICAgIDxpdGVtIG5hbWU9IjE1KSBQcm94eSBTdXBwb3J0IiAgICAgIGhyZWY9InByb3h5LWhvd3RvLmh0bWwiLz4KKyAgICAgICAgPGl0ZW0gbmFtZT0iMTYpIE1CZWFuIERlc2NyaXB0b3IiCisgICAgICAgICAgICAgIGhyZWY9Im1iZWFucy1kZXNjcmlwdG9yLWhvd3RvLmh0bWwiLz4KKyAgICAgICAgPGl0ZW0gbmFtZT0iMTcpIERlZmF1bHQgU2VydmxldCIgICAgaHJlZj0iZGVmYXVsdC1zZXJ2bGV0Lmh0bWwiLz4KKyAgICAgICAgPGl0ZW0gbmFtZT0iMTgpIENsdXN0ZXJpbmciICAgICAgICAgaHJlZj0iY2x1c3Rlci1ob3d0by5odG1sIi8+CisgICAgICAgIDxpdGVtIG5hbWU9IjE5KSBMb2FkIEJhbGFuY2VyIiAgICAgIGhyZWY9ImJhbGFuY2VyLWhvd3RvLmh0bWwiLz4KKyAgICAgICAgPGl0ZW0gbmFtZT0iMjApIENvbm5lY3RvcnMiICAgICAgICAgaHJlZj0iY29ubmVjdG9ycy5odG1sIi8+CisgICAgPC9tZW51PgorCisgICAgPG1lbnUgbmFtZT0iUmVmZXJlbmNlIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iUmVsZWFzZSBOb3RlcyIgICAgICAgICBocmVmPSJSRUxFQVNFLU5PVEVTLnR4dCIvPgorICAgICAgICA8aXRlbSBuYW1lPSJUb21jYXQgQ29uZmlndXJhdGlvbiIgIGhyZWY9ImNvbmZpZy9pbmRleC5odG1sIi8+CisgICAgICAgIDxpdGVtIG5hbWU9IkpLIERvY3VtZW50YXRpb24iICAgICAgCisgICAgICAgICAgICAgIGhyZWY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvdG9tY2F0L2Nvbm5lY3RvcnMtZG9jL2prMi9pbmRleC5odG1sIi8+CisgICAgICAgIDxpdGVtIG5hbWU9IlNlcnZsZXQgQVBJIEphdmFkb2NzIiAgaHJlZj0ic2VydmxldGFwaS9pbmRleC5odG1sIi8+CisgICAgICAgIDxpdGVtIG5hbWU9IkpTUCBBUEkgSmF2YWRvY3MiICAgICAgaHJlZj0ianNwYXBpL2luZGV4Lmh0bWwiLz4KKyAgICA8L21lbnU+CisKKyAgICA8bWVudSBuYW1lPSJUb21jYXQgRGV2ZWxvcG1lbnQiPgorICAgICAgICA8aXRlbSBuYW1lPSJCdWlsZGluZyIgICAgICAgICAgICAgIGhyZWY9ImJ1aWxkaW5nLmh0bWwiLz4KKyAgICAgICAgPGl0ZW0gbmFtZT0iQ2hhbmdlbG9nIiAgICAgICAgICAgICBocmVmPSJjaGFuZ2Vsb2cuaHRtbCIvPgorICAgICAgICA8aXRlbSBuYW1lPSJTdGF0dXMiICAgICAgICAgICAgICAgIGhyZWY9InN0YXR1cy5odG1sIi8+CisgICAgICAgIDxpdGVtIG5hbWU9IkRldmVsb3BlcnMiICAgICAgICAgICAgaHJlZj0iZGV2ZWxvcGVycy5odG1sIi8+CisgICAgICAgIDxpdGVtIG5hbWU9IkZ1bmN0aW9uYWwgU3BlY3MuIiAgICAgaHJlZj0iY2F0YWxpbmEvZnVuY3NwZWNzL2luZGV4Lmh0bWwiLz4KKyAgICAgICAgPGl0ZW0gbmFtZT0iVG9tY2F0IEphdmFkb2NzIiAgICAgICBocmVmPSJjYXRhbGluYS9kb2NzL2FwaS9pbmRleC5odG1sIi8+CisgICAgICAgIDxpdGVtIG5hbWU9Ikphc3BlciBKYXZhZG9jcyIgICAgICAgaHJlZj0iamFzcGVyL2RvY3MvYXBpL2luZGV4Lmh0bWwiLz4KKyAgICAgICAgPGl0ZW0gbmFtZT0iQXJjaGl0ZWN0dXJlIiAgICAgICAgICBocmVmPSJhcmNoaXRlY3R1cmUvaW5kZXguaHRtbCIgLz4KKyAgICA8L21lbnU+CisKKyAgICA8L2JvZHk+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvcHJveHktaG93dG8ueG1sIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9wcm94eS1ob3d0by54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM1NGMzMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvcHJveHktaG93dG8ueG1sCkBAIC0wLDAgKzEsMTM0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhRE9DVFlQRSBkb2N1bWVudCBbCisgIDwhRU5USVRZIHByb2plY3QgU1lTVEVNICJwcm9qZWN0LnhtbCI+CitdPgorPGRvY3VtZW50IHVybD0icHJveHktaG93dG8uaHRtbCI+CisKKyAgICAmcHJvamVjdDsKKworICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICA8YXV0aG9yIGVtYWlsPSJjcmFpZ21jY0BhcGFjaGUub3JnIj5DcmFpZyBSLiBNY0NsYW5haGFuPC9hdXRob3I+CisgICAgICAgIDx0aXRsZT5Qcm94eSBTdXBwb3J0IEhPVy1UTzwvdGl0bGU+CisgICAgPC9wcm9wZXJ0aWVzPgorCis8Ym9keT4KKworCis8c2VjdGlvbiBuYW1lPSJJbnRyb2R1Y3Rpb24iPgorCis8cD5Vc2luZyBzdGFuZGFyZCBjb25maWd1cmF0aW9ucyBvZiBUb21jYXQsIHdlYiBhcHBsaWNhdGlvbnMgY2FuIGFzayBmb3IKK3RoZSBzZXJ2ZXIgbmFtZSBhbmQgcG9ydCBudW1iZXIgdG8gd2hpY2ggdGhlIHJlcXVlc3Qgd2FzIGRpcmVjdGVkIGZvcgorcHJvY2Vzc2luZy4gIFdoZW4gVG9tY2F0IGlzIHJ1bm5pbmcgc3RhbmRhbG9uZSB3aXRoIHRoZQorPGEgaHJlZj0iY29uZmlnL2NveW90ZS5odG1sIj5Db3lvdGUgSFRUUC8xLjEgQ29ubmVjdG9yPC9hPiwgaXQgd2lsbCBnZW5lcmFsbHkKK3JlcG9ydCB0aGUgc2VydmVyIG5hbWUgc3BlY2lmaWVkIGluIHRoZSByZXF1ZXN0LCBhbmQgdGhlIHBvcnQgbnVtYmVyIG9uCit3aGljaCB0aGUgPHN0cm9uZz5Db25uZWN0b3I8L3N0cm9uZz4gaXMgbGlzdGVuaW5nLiAgVGhlIHR3byBzZXJ2bGV0IEFQSQorY2FsbHMgb2YgaW50ZXJlc3QsIGZvciB0aGlzIHB1cnBvc2UsIGFyZTo8L3A+Cis8dWw+Cis8bGk+PGNvZGU+U2VydmxldFJlcXVlc3QuZ2V0U2VydmVyTmFtZSgpPC9jb2RlPjwvbGk+Cis8bGk+PGNvZGU+U2VydmxldFJlcXVlc3QuZ2V0U2VydmVyUG9ydCgpPC9jb2RlPjwvbGk+Cis8L3VsPgorCis8cD5XaGVuIHlvdSBhcmUgcnVubmluZyBiZWhpbmQgYSBwcm94eSBzZXJ2ZXIgKG9yIGEgd2ViIHNlcnZlciB0aGF0IGlzCitjb25maWd1cmVkIHRvIGJlaGF2ZSBsaWtlIGEgcHJveHkgc2VydmVyKSwgeW91IHdpbGwgc29tZXRpbWVzIHByZWZlciB0bworbWFuYWdlIHRoZSB2YWx1ZXMgcmV0dXJuZWQgYnkgdGhlc2UgY2FsbHMuICBJbiBwYXJ0aWN1bGFyLCB5b3Ugd2lsbAorZ2VuZXJhbGx5IHdhbnQgdGhlIHBvcnQgbnVtYmVyIHRvIHJlZmxlY3QgdGhhdCBzcGVjaWZpZWQgaW4gdGhlIG9yaWdpbmFsCityZXF1ZXN0LCBub3QgdGhlIG9uZSBvbiB3aGljaCB0aGUgPHN0cm9uZz5Db25uZWN0b3I8L3N0cm9uZz4gaXRzZWxmIGlzCitsaXN0ZW5pbmcuICBZb3UgY2FuIHVzZSB0aGUgPGNvZGU+cHJveHlOYW1lPC9jb2RlPiBhbmQgPGNvZGU+cHJveHlQb3J0PC9jb2RlPgorYXR0cmlidXRlcyBvbiB0aGUgPGNvZGU+Jmx0O0Nvbm5lY3RvciZndDs8L2NvZGU+IGVsZW1lbnQgdG8gY29uZmlndXJlCit0aGVzZSB2YWx1ZXMuPC9wPgorCis8cD5Qcm94eSBzdXBwb3J0IGNhbiB0YWtlIG1hbnkgZm9ybXMuICBUaGUgZm9sbG93aW5nIHNlY3Rpb25zIGRlc2NyaWJlCitwcm94eSBjb25maWd1cmF0aW9ucyBmb3Igc2V2ZXJhbCBjb21tb24gY2FzZXMuPC9wPgorCis8L3NlY3Rpb24+CisKKzxzZWN0aW9uIG5hbWU9IkFwYWNoZSAxLjMgUHJveHkgU3VwcG9ydCI+CisKKzxwPkFwYWNoZSAxLjMgc3VwcG9ydHMgYW4gb3B0aW9uYWwgbW9kdWxlICg8Y29kZT5tb2RfcHJveHk8L2NvZGU+KSB0aGF0Citjb25maWd1cmVzIHRoZSB3ZWIgc2VydmVyIHRvIGFjdCBhcyBhIHByb3h5IHNlcnZlci4gIFRoaXMgY2FuIGJlIHVzZWQgdG8KK2ZvcndhcmQgcmVxdWVzdHMgZm9yIGEgcGFydGljdWxhciB3ZWIgYXBwbGljYXRpb24gdG8gYSBUb21jYXQgNSBpbnN0YW5jZSwKK3dpdGhvdXQgaGF2aW5nIHRvIGNvbmZpZ3VyZSBhIHdlYiBjb25uZWN0b3Igc3VjaCBhcyA8Y29kZT5tb2Rfams8L2NvZGU+LgorVG8gYWNjb21wbGlzaCB0aGlzLCB5b3UgbmVlZCB0byBwZXJmb3JtIHRoZSBmb2xsb3dpbmcgdGFza3M6PC9wPgorPG9sPgorPGxpPkNvbmZpZ3VyZSB5b3VyIGNvcHkgb2YgQXBhY2hlIHNvIHRoYXQgaXQgaW5jbHVkZXMgdGhlCisgICAgPGNvZGU+bW9kX3Byb3h5PC9jb2RlPiBtb2R1bGUuICBJZiB5b3UgYXJlIGJ1aWxkaW5nIGZyb20gc291cmNlLAorICAgIHRoZSBlYXNpZXN0IHdheSB0byBkbyB0aGlzIGlzIHRvIGluY2x1ZGUgdGhlCisgICAgPGNvZGU+LS1lbmFibGUtbW9kdWxlPXByb3h5PC9jb2RlPiBkaXJlY3RpdmUgb24gdGhlCisgICAgPGNvZGU+Li9jb25maWd1cmU8L2NvZGU+IGNvbW1hbmQgbGluZS48L2xpPgorPGxpPklmIG5vdCBhbHJlYWR5IGFkZGVkIGZvciB5b3UsIG1ha2Ugc3VyZSB0aGF0IHlvdSBhcmUgbG9hZGluZyB0aGUKKyAgICA8Y29kZT5tb2RfcHJveHk8L2NvZGU+IG1vZHVsZSBhdCBBcGFjaGUgc3RhcnR1cCB0aW1lLCBieSB1c2luZyB0aGUKKyAgICBmb2xsb3dpbmcgZGlyZWN0aXZlcyBpbiB5b3VyIDxjb2RlPmh0dHBkLmNvbmY8L2NvZGU+IGZpbGU6Cis8c291cmNlPgorTG9hZE1vZHVsZSBwcm94eV9tb2R1bGUgIHtwYXRoLXRvLW1vZHVsZXN9L21vZF9wcm94eS5zbworQWRkTW9kdWxlICBtb2RfcHJveHkuYworPC9zb3VyY2U+PC9saT4KKzxsaT5JbmNsdWRlIHR3byBkaXJlY3RpdmVzIGluIHlvdXIgPGNvZGU+aHR0cGQuY29uZjwvY29kZT4gZmlsZSBmb3IKKyAgICBlYWNoIHdlYiBhcHBsaWNhdGlvbiB0aGF0IHlvdSB3aXNoIHRvIGZvcndhcmQgdG8gVG9tY2F0IDUuICBGb3IKKyAgICBleGFtcGxlLCB0byBmb3J3YXJkIGFuIGFwcGxpY2F0aW9uIGF0IGNvbnRleHQgcGF0aCA8Y29kZT4vbXlhcHA8L2NvZGU+OgorPHNvdXJjZT4KK1Byb3h5UGFzcyAgICAgICAgIC9teWFwcCAgaHR0cDovL2xvY2FsaG9zdDo4MDgxL215YXBwCitQcm94eVBhc3NSZXZlcnNlICAvbXlhcHAgIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MS9teWFwcAorPC9zb3VyY2U+CisgICAgd2hpY2ggdGVsbHMgQXBhY2hlIHRvIGZvcndhcmQgVVJMcyBvZiB0aGUgZm9ybQorICAgIDxjb2RlPmh0dHA6Ly9sb2NhbGhvc3QvbXlhcHAvKjwvY29kZT4gdG8gdGhlIFRvbWNhdCA1IGNvbm5lY3RvcgorICAgIGxpc3RlbmluZyBvbiBwb3J0IDgwODEuPC9saT4KKzxsaT5Db25maWd1cmUgeW91ciBjb3B5IG9mIFRvbWNhdCA1IHRvIGluY2x1ZGUgYSBzcGVjaWFsCisgICAgPGNvZGU+Jmx0O0Nvbm5lY3RvciZndDs8L2NvZGU+IGVsZW1lbnQsIHdpdGggYXBwcm9wcmlhdGUKKyAgICBwcm94eSBzZXR0aW5ncywgZm9yIGV4YW1wbGU6Cis8c291cmNlPgorJmx0O0Nvbm5lY3RvciBwb3J0PSI4MDgxIiAuLi4KKyAgICAgICAgICAgICAgcHJveHlOYW1lPSJ3d3cubXljb21wYW55LmNvbSIKKyAgICAgICAgICAgICAgcHJveHlQb3J0PSI4MCIvJmd0OworPC9zb3VyY2U+CisgICAgd2hpY2ggd2lsbCBjYXVzZSBzZXJ2bGV0cyBpbnNpZGUgdGhpcyB3ZWIgYXBwbGljYXRpb24gdG8gdGhpbmsgdGhhdAorICAgIGFsbCBwcm94aWVkIHJlcXVlc3RzIHdlcmUgZGlyZWN0ZWQgdG8gPGNvZGU+d3d3Lm15Y29tcGFueS5jb208L2NvZGU+CisgICAgb24gcG9ydCA4MC48L2xpPgorPGxpPkl0IGlzIGxlZ2FsIHRvIG9taXQgdGhlIDxjb2RlPnByb3h5TmFtZTwvY29kZT4gYXR0cmlidXRlIGZyb20gdGhlCisgICAgPGNvZGU+Jmx0O0Nvbm5lY3RvciZndDs8L2NvZGU+IGVsZW1lbnQuICBJZiB5b3UgZG8gc28sIHRoZSB2YWx1ZQorICAgIHJldHVybmVkIGJ5IDxjb2RlPnJlcXVlc3QuZ2V0U2VydmVyTmFtZSgpPC9jb2RlPiB3aWxsIGJ5IHRoZSBob3N0CisgICAgbmFtZSBvbiB3aGljaCBUb21jYXQgaXMgcnVubmluZy4gIEluIHRoZSBleGFtcGxlIGFib3ZlLCBpdCB3b3VsZCBiZQorICAgIDxjb2RlPmxvY2FsaG9zdDwvY29kZT4uPC9saT4KKzxsaT5JZiB5b3UgYWxzbyBoYXZlIGEgPGNvZGU+Jmx0O0Nvbm5lY3RvciZndDs8L2NvZGU+IGxpc3RlbmluZyBvbiBwb3J0CisgICAgODA4MCAobmVzdGVkIHdpdGhpbiB0aGUgc2FtZSA8YSBocmVmPSJjb25maWcvc2VydmljZS5odG1sIj5TZXJ2aWNlPC9hPgorICAgIGVsZW1lbnQpLCB0aGUgcmVxdWVzdHMgdG8gZWl0aGVyIHBvcnQgd2lsbCBzaGFyZSB0aGUgc2FtZSBzZXQgb2YKKyAgICB2aXJ0dWFsIGhvc3RzIGFuZCB3ZWIgYXBwbGljYXRpb25zLjwvbGk+Cis8bGk+WW91IG1pZ2h0IHdpc2ggdG8gdXNlIHRoZSBJUCBmaWx0ZXJpbmcgZmVhdHVyZXMgb2YgeW91ciBvcGVyYXRpbmcKKyAgICBzeXN0ZW0gdG8gcmVzdHJpY3QgY29ubmVjdGlvbnMgdG8gcG9ydCA4MDgxIChpbiB0aGlzIGV4YW1wbGUpIHRvCisgICAgYmUgYWxsb3dlZCA8c3Ryb25nPm9ubHk8L3N0cm9uZz4gZnJvbSB0aGUgc2VydmVyIHRoYXQgaXMgcnVubmluZworICAgIEFwYWNoZS48L2xpPgorPGxpPkFsdGVybmF0aXZlbHksIHlvdSBjYW4gc2V0IHVwIGEgc2VyaWVzIG9mIHdlYiBhcHBsaWNhdGlvbnMgdGhhdCBhcmUKKyAgICBvbmx5IGF2YWlsYWJsZSB2aWEgcHJveHlpbmcsIGFzIGZvbGxvd3M6CisgICAgPHVsPgorICAgIDxsaT5Db25maWd1cmUgYW5vdGhlciA8Y29kZT4mbHQ7U2VydmljZSZndDs8L2NvZGU+IHRoYXQgY29udGFpbnMKKyAgICAgICAgb25seSBhIDxjb2RlPiZsdDtDb25uZWN0b3ImZ3Q7PC9jb2RlPiBmb3IgdGhlIHByb3h5IHBvcnQuPC9saT4KKyAgICA8bGk+Q29uZmlndXJlIGFwcHJvcHJpYXRlIDxhIGhyZWY9ImNvbmZpZy9lbmdpbmUuaHRtbCI+RW5naW5lPC9hPiwKKyAgICAgICAgPGEgaHJlZj0iY29uZmlnL2hvc3QuaHRtbCI+SG9zdDwvYT4sIGFuZAorICAgICAgICA8YSBocmVmPSJjb25maWcvY29udGV4dC5odG1sIj5Db250ZXh0PC9hPiBlbGVtZW50cyBmb3IgdGhlIHZpcnR1YWwgaG9zdHMKKyAgICAgICAgYW5kIHdlYiBhcHBsaWNhdGlvbnMgYWNjZXNzaWJsZSB2aWEgcHJveHlpbmcuPC9saT4KKyAgICA8bGk+T3B0aW9uYWxseSwgcHJvdGVjdCBwb3J0IDgwODEgd2l0aCBJUCBmaWx0ZXJzIGFzIGRlc2NyaWJlZAorICAgICAgICBlYXJsaWVyLjwvbGk+CisgICAgPC91bD48L2xpPgorPGxpPldoZW4gcmVxdWVzdHMgYXJlIHByb3hpZWQgYnkgQXBhY2hlLCB0aGUgd2ViIHNlcnZlciB3aWxsIGJlIHJlY29yZGluZworICAgIHRoZXNlIHJlcXVlc3RzIGluIGl0cyBhY2Nlc3MgbG9nLiAgVGhlcmVmb3JlLCB5b3Ugd2lsbCBnZW5lcmFsbHkgd2FudCB0bworICAgIGRpc2FibGUgYW55IGFjY2VzcyBsb2dnaW5nIHBlcmZvcm1lZCBieSBUb21jYXQgaXRzZWxmLjwvbGk+Cis8L29sPgorCis8cD5XaGVuIHJlcXVlc3RzIGFyZSBwcm94aWVkIGluIHRoaXMgbWFubmVyLCA8c3Ryb25nPmFsbDwvc3Ryb25nPiByZXF1ZXN0cworZm9yIHRoZSBjb25maWd1cmVkIHdlYiBhcHBsaWNhdGlvbnMgd2lsbCBiZSBwcm9jZXNzZWQgYnkgVG9tY2F0IChpbmNsdWRpbmcKK3JlcXVlc3RzIGZvciBzdGF0aWMgY29udGVudCkuICBZb3UgY2FuIGltcHJvdmUgcGVyZm9ybWFuY2UgYnkgdXNpbmcgdGhlCis8Y29kZT5tb2Rfams8L2NvZGU+IHdlYiBjb25uZWN0b3IgaW5zdGVhZCBvZiA8Y29kZT5tb2RfcHJveHk8L2NvZGU+LiAKKzxjb2RlPm1vZF9qazwvY29kZT4gY2FuIGJlIGNvbmZpZ3VyZWQgc28gdGhhdCB0aGUgd2ViIHNlcnZlciBzZXJ2ZXMgc3RhdGljCitjb250ZW50IHRoYXQgaXMgbm90IHByb2Nlc3NlZCBieSBmaWx0ZXJzIG9yIHNlY3VyaXR5IGNvbnN0cmFpbnRzIGRlZmluZWQKK3dpdGhpbiB0aGUgd2ViIGFwcGxpY2F0aW9uJ3MgZGVwbG95bWVudCBkZXNjcmlwdG9yCisoPGNvZGU+L1dFQi1JTkYvd2ViLnhtbDwvY29kZT4pLjwvcD4KKworPC9zZWN0aW9uPgorCis8c2VjdGlvbiBuYW1lPSJBcGFjaGUgMi4wIFByb3h5IFN1cHBvcnQiPgorVGhlIHNhbWUgaW5zdHJ1Y3Rpb25zIGhvbGQgdHJ1ZSBhcyBmb3IgMS4zLiAoRXhjZXB0IGluIEFwYWNoZSAyLjAsCit5b3UgbWF5IG9taXQgPGNvZGU+QWRkTW9kdWxlICBtb2RfcHJveHkuYzwvY29kZT4pCis8L3NlY3Rpb24+CisKKzwvYm9keT4KKworPC9kb2N1bWVudD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvcmVhbG0taG93dG8ueG1sIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9yZWFsbS1ob3d0by54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZkYTM3YgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvcmVhbG0taG93dG8ueG1sCkBAIC0wLDAgKzEsMTM3NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IURPQ1RZUEUgZG9jdW1lbnQgWworICA8IUVOVElUWSBwcm9qZWN0IFNZU1RFTSAicHJvamVjdC54bWwiPgorXT4KKzxkb2N1bWVudCB1cmw9InJlYWxtLWhvd3RvLmh0bWwiPgorCisgICAgJnByb2plY3Q7CisKKyAgICA8cHJvcGVydGllcz4KKyAgICAgICAgPGF1dGhvciBlbWFpbD0iY3JhaWdtY2NAYXBhY2hlLm9yZyI+Q3JhaWcgUi4gTWNDbGFuYWhhbjwvYXV0aG9yPgorICAgICAgICA8dGl0bGU+UmVhbG0gQ29uZmlndXJhdGlvbiBIT1ctVE88L3RpdGxlPgorICAgIDwvcHJvcGVydGllcz4KKworPGJvZHk+CisKKworPHNlY3Rpb24gbmFtZT0iVGFibGUgb2YgQ29udGVudHMiPgorCis8cD4KKzxhIGhyZWY9IiNRdWljayBTdGFydCI+UXVpY2sgU3RhcnQ8L2E+PGJyIC8+Cis8YmxvY2txdW90ZT4KKzxhIGhyZWY9IiNXaGF0IGlzIGEgUmVhbG0/Ij5XaGF0IGlzIGEgUmVhbG0/PC9hPjxiciAvPgorPGEgaHJlZj0iI0NvbmZpZ3VyaW5nIGEgUmVhbG0iPkNvbmZpZ3VyaW5nIGEgUmVhbG08L2E+PGJyIC8+Cis8L2Jsb2NrcXVvdGU+Cis8YSBocmVmPSIjQ29tbW9uIEZlYXR1cmVzIj5Db21tb24gRmVhdHVyZXM8L2E+PGJyIC8+Cis8YmxvY2txdW90ZT4KKzxhIGhyZWY9IiNEaWdlc3RlZCBQYXNzd29yZHMiPkRpZ2VzdGVkIFBhc3N3b3JkczwvYT48YnIgLz4KKzxhIGhyZWY9IiNFeGFtcGxlIEFwcGxpY2F0aW9uIj5FeGFtcGxlIEFwcGxpY2F0aW9uPC9hPjxiciAvPgorPGEgaHJlZj0iI01hbmFnZXIgQXBwbGljYXRpb24iPk1hbmFnZXIgQXBwbGljYXRpb248L2E+PGJyIC8+Cis8YSBocmVmPSIjUmVhbG0gTG9nZ2luZyI+TG9nZ2luZyBXaXRoaW4gUmVhbG1zPC9hPjxiciAvPgorPC9ibG9ja3F1b3RlPgorPGEgaHJlZj0iI1N0YW5kYXJkIFJlYWxtIEltcGxlbWVudGF0aW9ucyI+CitTdGFuZGFyZCBSZWFsbSBJbXBsZW1lbnRhdGlvbnM8L2E+PGJyIC8+Cis8YmxvY2txdW90ZT4KKzxhIGhyZWY9IiNKREJDUmVhbG0iPkpEQkNSZWFsbTwvYT48YnIgLz4KKzxhIGhyZWY9IiNEYXRhU291cmNlUmVhbG0iPkRhdGFTb3VyY2VSZWFsbTwvYT48YnIgLz4KKzxhIGhyZWY9IiNKTkRJUmVhbG0iPkpORElSZWFsbTwvYT48YnIgLz4KKzxhIGhyZWY9IiNNZW1vcnlSZWFsbSI+TWVtb3J5UmVhbG08L2E+PGJyIC8+Cis8YSBocmVmPSIjSkFBU1JlYWxtIj5KQUFTUmVhbG08L2E+PGJyIC8+Cis8L2Jsb2NrcXVvdGU+Cis8L3A+CisKKzwvc2VjdGlvbj4KKworPHNlY3Rpb24gbmFtZT0iUXVpY2sgU3RhcnQiPgorCis8cD5UaGlzIGRvY3VtZW50IGRlc2NyaWJlcyBob3cgdG8gY29uZmlndXJlIFRvbWNhdCB0byBzdXBwb3J0IDxlbT5jb250YWluZXIKK21hbmFnZWQgc2VjdXJpdHk8L2VtPiwgYnkgY29ubmVjdGluZyB0byBhbiBleGlzdGluZyAiZGF0YWJhc2UiIG9mIHVzZXJuYW1lcywKK3Bhc3N3b3JkcywgYW5kIHVzZXIgcm9sZXMuICBZb3Ugb25seSBuZWVkIHRvIGNhcmUgYWJvdXQgdGhpcyBpZiB5b3UgYXJlIHVzaW5nCithIHdlYiBhcHBsaWNhdGlvbiB0aGF0IGluY2x1ZGVzIG9uZSBvciBtb3JlCis8Y29kZT4mbHQ7c2VjdXJpdHktY29uc3RyYWludCZndDs8L2NvZGU+IGVsZW1lbnRzLCBhbmQgYQorPGNvZGU+Jmx0O2xvZ2luLWNvbmZpZyZndDs8L2NvZGU+IGVsZW1lbnQgZGVmaW5pbmcgaG93IHVzZXJzIGFyZSByZXF1aXJlZAordG8gYXV0aGVudGljYXRlIHRoZW1zZWx2ZXMuICBJZiB5b3UgYXJlIG5vdCB1dGlsaXppbmcgdGhlc2UgZmVhdHVyZXMsIHlvdSBjYW4KK3NhZmVseSBza2lwIHRoaXMgZG9jdW1lbnQuPC9wPgorCis8cD5Gb3IgZnVuZGFtZW50YWwgYmFja2dyb3VuZCBpbmZvcm1hdGlvbiBhYm91dCBjb250YWluZXIgbWFuYWdlZCBzZWN1cml0eSwKK3NlZSB0aGUgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9zZXJ2bGV0L2Rvd25sb2FkLmh0bWwiPlNlcnZsZXQKK1NwZWNpZmljYXRpb24gKFZlcnNpb24gMi40KTwvYT4sIFNlY3Rpb24gMTIuPC9wPgorCis8cD5Gb3IgaW5mb3JtYXRpb24gYWJvdXQgdXRpbGl6aW5nIHRoZSA8ZW0+U2luZ2xlIFNpZ24gT248L2VtPiBmZWF0dXJlIG9mCitUb21jYXQgNSAoYWxsb3dpbmcgYSB1c2VyIHRvIGF1dGhlbnRpY2F0ZSB0aGVtc2VsdmVzIG9uY2UgYWNyb3NzIHRoZSBlbnRpcmUKK3NldCBvZiB3ZWIgYXBwbGljYXRpb25zIGFzc29jaWF0ZWQgd2l0aCBhIHZpcnR1YWwgaG9zdCksIHNlZQorPGEgaHJlZj0iY29uZmlnL2hvc3QuaHRtbCNTaW5nbGUgU2lnbiBPbiI+aGVyZTwvYT4uPC9wPgorCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iT3ZlcnZpZXciPgorCisKKzxzdWJzZWN0aW9uIG5hbWU9IldoYXQgaXMgYSBSZWFsbT8iPgorCis8cD5BIDxzdHJvbmc+UmVhbG08L3N0cm9uZz4gaXMgYSAiZGF0YWJhc2UiIG9mIHVzZXJuYW1lcyBhbmQgcGFzc3dvcmRzIHRoYXQKK2lkZW50aWZ5IHZhbGlkIHVzZXJzIG9mIGEgd2ViIGFwcGxpY2F0aW9uIChvciBzZXQgb2Ygd2ViIGFwcGxpY2F0aW9ucyksIHBsdXMKK2FuIGVudW1lcmF0aW9uIG9mIHRoZSBsaXN0IG9mIDxlbT5yb2xlczwvZW0+IGFzc29jaWF0ZWQgd2l0aCBlYWNoIHZhbGlkIHVzZXIuCitZb3UgY2FuIHRoaW5rIG9mIHJvbGVzIGFzIHNpbWlsYXIgdG8gPGVtPmdyb3VwczwvZW0+IGluIFVuaXgtbGlrZSBvcGVyYXRpbmcKK3N5c3RlbXMsIGJlY2F1c2UgYWNjZXNzIHRvIHNwZWNpZmljIHdlYiBhcHBsaWNhdGlvbiByZXNvdXJjZXMgaXMgZ3JhbnRlZCB0bworYWxsIHVzZXJzIHBvc3Nlc3NpbmcgYSBwYXJ0aWN1bGFyIHJvbGUgKHJhdGhlciB0aGFuIGVudW1lcmF0aW5nIHRoZSBsaXN0IG9mCithc3NvY2lhdGVkIHVzZXJuYW1lcykuICBBIHBhcnRpY3VsYXIgdXNlciBjYW4gaGF2ZSBhbnkgbnVtYmVyIG9mIHJvbGVzCithc3NvY2lhdGVkIHdpdGggdGhlaXIgdXNlcm5hbWUuPC9wPgorCis8cD5BbHRob3VnaCB0aGUgU2VydmxldCBTcGVjaWZpY2F0aW9uIGRlc2NyaWJlcyBhIHBvcnRhYmxlIG1lY2hhbmlzbSBmb3IKK2FwcGxpY2F0aW9ucyB0byA8ZW0+ZGVjbGFyZTwvZW0+IHRoZWlyIHNlY3VyaXR5IHJlcXVpcmVtZW50cyAoaW4gdGhlCis8Y29kZT53ZWIueG1sPC9jb2RlPiBkZXBsb3ltZW50IGRlc2NyaXB0b3IpLCB0aGVyZSBpcyBubyBwb3J0YWJsZSBBUEkKK2RlZmluaW5nIHRoZSBpbnRlcmZhY2UgYmV0d2VlbiBhIHNlcnZsZXQgY29udGFpbmVyIGFuZCB0aGUgYXNzb2NpYXRlZCB1c2VyCithbmQgcm9sZSBpbmZvcm1hdGlvbi4gIEluIG1hbnkgY2FzZXMsIGhvd2V2ZXIsIGl0IGlzIGRlc2lyZWFibGUgdG8gImNvbm5lY3QiCithIHNlcnZsZXQgY29udGFpbmVyIHRvIHNvbWUgZXhpc3RpbmcgYXV0aGVudGljYXRpb24gZGF0YWJhc2Ugb3IgbWVjaGFuaXNtCit0aGF0IGFscmVhZHkgZXhpc3RzIGluIHRoZSBwcm9kdWN0aW9uIGVudmlyb25tZW50LiAgVGhlcmVmb3JlLCBUb21jYXQgNQorZGVmaW5lcyBhIEphdmEgaW50ZXJmYWNlICg8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLlJlYWxtPC9jb2RlPikgdGhhdAorY2FuIGJlIGltcGxlbWVudGVkIGJ5ICJwbHVnIGluIiBjb21wb25lbnRzIHRvIGVzdGFibGlzaCB0aGlzIGNvbm5lY3Rpb24uCitUaHJlZSBzdGFuZGFyZCBwbHVnLWlucyBhcmUgcHJvdmlkZWQsIHN1cHBvcnRpbmcgY29ubmVjdGlvbiB0byB0aHJlZSBkaWZmZXJlbnQKK3NvdXJjZXMgb2YgYXV0aGVudGljYXRpb24gaW5mb3JtYXRpb246PC9wPgorPHVsPgorPGxpPjxhIGhyZWY9IiNEYXRhU291cmNlUmVhbG0iPkRhdGFTb3VyY2VSZWFsbTwvYT4gLSBBY2Nlc3NlcyBhdXRoZW50aWNhdGlvbgorICAgIGluZm9ybWF0aW9uIHN0b3JlZCBpbiBhIHJlbGF0aW9uYWwgZGF0YWJhc2UsIGFjY2Vzc2VkIHZpYSBhIG5hbWVkIEpOREkKKyAgICBKREJDIERhdGFTb3VyY2UuPC9saT4KKzxsaT48YSBocmVmPSIjSkRCQ1JlYWxtIj5KREJDUmVhbG08L2E+IC0gQWNjZXNzZXMgYXV0aGVudGljYXRpb24gaW5mb3JtYXRpb24KKyAgICBzdG9yZWQgaW4gYSByZWxhdGlvbmFsIGRhdGFiYXNlLCBhY2Nlc3NlZCB2aWEgYSBKREJDIGRyaXZlci48L2xpPgorPGxpPjxhIGhyZWY9IiNKTkRJUmVhbG0iPkpORElSZWFsbTwvYT4gLSBBY2Nlc3NlcyBhdXRoZW50aWNhdGlvbiBpbmZvcm1hdGlvbgorICAgIHN0b3JlZCBpbiBhbiBMREFQIGJhc2VkIGRpcmVjdG9yeSBzZXJ2ZXIsIGFjY2Vzc2VkIHZpYSBhIEpOREkgcHJvdmlkZXIuCisgICAgPC9saT4KKzxsaT48YSBocmVmPSIjTWVtb3J5UmVhbG0iPk1lbW9yeVJlYWxtPC9hPiAtIEFjY2Vzc2VzIGF1dGhlbnRpY2F0aW9uCisgICAgaW5mb3JtYXRpb24gc3RvcmVkIGluIGFuIGluLW1lbW9yeSBvYmplY3QgY29sbGVjdGlvbiwgd2hpY2ggaXMgaW5pdGlhbGl6ZWQKKyAgICBmcm9tIGFuIFhNTCBkb2N1bWVudCAoPGNvZGU+Y29uZi90b21jYXQtdXNlcnMueG1sPC9jb2RlPikuPC9saT4KKzwvdWw+CisKKzxwPkl0IGlzIGFsc28gcG9zc2libGUgdG8gd3JpdGUgeW91ciBvd24gPGNvZGU+UmVhbG08L2NvZGU+IGltcGxlbWVudGF0aW9uLAorYW5kIGludGVncmF0ZSBpdCB3aXRoIFRvbWNhdCA1LiAgSG93ZXZlciwgZG9pbmcgdGhpcyBpcyBiZXlvbmQgdGhlIHNjb3BlIG9mCit0aGlzIGRvY3VtZW50LiAgU2VlICg8c3Ryb25nPkZJWE1FPC9zdHJvbmc+IC0gcmVmZXJlbmNlIHRvIGRldmVsb3BlciBzdHVmZikKK2ZvciBtb3JlIGluZm9ybWF0aW9uLjwvcD4KKworPC9zdWJzZWN0aW9uPgorCisKKzxzdWJzZWN0aW9uIG5hbWU9IkNvbmZpZ3VyaW5nIGEgUmVhbG0iPgorCis8cD5CZWZvcmUgZ2V0dGluZyBpbnRvIHRoZSBkZXRhaWxzIG9mIHRoZSBzdGFuZGFyZCBSZWFsbSBpbXBsZW1lbnRhdGlvbnMsIGl0IGlzCitpbXBvcnRhbnQgdG8gdW5kZXJzdGFuZCwgaW4gZ2VuZXJhbCB0ZXJtcywgaG93IGEgUmVhbG0gaXMgY29uZmlndXJlZC4gIEluCitnZW5lcmFsLCB5b3Ugd2lsbCBiZSBhZGRpbmcgYW4gWE1MIGVsZW1lbnQgdG8geW91ciA8Y29kZT5jb25mL3NlcnZlci54bWw8L2NvZGU+Citjb25maWd1cmF0aW9uIGZpbGUsIHRoYXQgbG9va3Mgc29tZXRoaW5nIGxpa2UgdGhpczo8L3A+CisKKzxzb3VyY2U+CismbHQ7UmVhbG0gY2xhc3NOYW1lPSIuLi4gY2xhc3MgbmFtZSBmb3IgdGhpcyBpbXBsZW1lbnRhdGlvbiIKKyAgICAgICAuLi4gb3RoZXIgYXR0cmlidXRlcyBmb3IgdGhpcyBpbXBsZW1lbnRhdGlvbiAuLi4vJmd0OworPC9zb3VyY2U+CisKKzxwPlRoZSA8Y29kZT4mbHQ7UmVhbG0mZ3Q7PC9jb2RlPiBlbGVtZW50IGNhbiBiZSBuZXN0ZWQgaW5zaWRlIG9uZSBvZiB0aHJlZQorZGlmZmVyZW50IGVsZW1lbnRzLCB3aGljaCBoYXMgYSBkaXJlY3QgaW1wYWN0IG9uIHRoZSAic2NvcGUiIG9mIHRoYXQgUmVhbG0KKyhpLmUuIHdoaWNoIHdlYiBhcHBsaWNhdGlvbnMgd2lsbCBzaGFyZSB0aGUgc2FtZSBhdXRoZW50aWNhdGlvbiBpbmZvcm1hdGlvbik6Cis8L3A+Cis8dWw+Cis8bGk+PGVtPkluc2lkZSBhbiAmbHQ7RW5naW5lJmd0OyBlbGVtZW50PC9lbT4gLSBUaGlzIFJlYWxtIHdpbGwgYmUgc2hhcmVkCisgICAgYWNyb3NzIEFMTCB3ZWIgYXBwbGljYXRpb25zIG9uIEFMTCB2aXJ0dWFsIGhvc3RzLCBVTkxFU1MgaXQgaXMgb3ZlcnJpZGRlbgorICAgIGJ5IGEgUmVhbG0gZWxlbWVudCBuZXN0ZWQgaW5zaWRlIGEgc3Vib3JkaW5hdGUgPGNvZGU+Jmx0O0hvc3QmZ3Q7PC9jb2RlPgorICAgIG9yIDxjb2RlPiZsdDtDb250ZXh0Jmd0OzwvY29kZT4gZWxlbWVudC48L2xpPgorPGxpPjxlbT5JbnNpZGUgYSAmbHQ7SG9zdCZndDsgZWxlbWVudDwvZW0+IC0gVGhpcyBSZWFsbSB3aWxsIGJlIHNoYXJlZCBhY3Jvc3MKKyAgICBBTEwgd2ViIGFwcGxpY2F0aW9ucyBmb3IgVEhJUyB2aXJ0dWFsIGhvc3QsIFVOTEVTUyBpdCBpcyBvdmVycmlkZGVuCisgICAgYnkgYSBSZWFsbSBlbGVtZW50IG5lc3RlZCBpbnNpZGUgYSBzdWJvcmRpbmF0ZSA8Y29kZT4mbHQ7Q29udGV4dCZndDs8L2NvZGU+CisgICAgZWxlbWVudC48L2xpPgorPGxpPjxlbT5JbnNpZGUgYSAmbHQ7Q29udGV4dCZndDsgZWxlbWVudDwvZW0+IC0gVGhpcyBSZWFsbSB3aWxsIGJlIHVzZWQgT05MWQorICAgIGZvciBUSElTIHdlYiBhcHBsaWNhdGlvbi48L2xpPgorPC91bD4KKworCis8L3N1YnNlY3Rpb24+CisKKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IkNvbW1vbiBGZWF0dXJlcyI+CisKKworPHN1YnNlY3Rpb24gbmFtZT0iRGlnZXN0ZWQgUGFzc3dvcmRzIj4KKworPHA+Rm9yIGVhY2ggb2YgdGhlIHN0YW5kYXJkIDxjb2RlPlJlYWxtPC9jb2RlPiBpbXBsZW1lbnRhdGlvbnMsIHRoZQordXNlcidzIHBhc3N3b3JkIChieSBkZWZhdWx0KSBpcyBzdG9yZWQgaW4gY2xlYXIgdGV4dC4gIEluIG1hbnkKK2Vudmlyb25tZW50cywgdGhpcyBpcyB1bmRlc2lyZWFibGUgYmVjYXVzZSBjYXN1YWwgb2JzZXJ2ZXJzIG9mIHRoZQorYXV0aGVudGljYXRpb24gZGF0YSBjYW4gY29sbGVjdCBlbm91Z2ggaW5mb3JtYXRpb24gdG8gbG9nIG9uCitzdWNjZXNzZnVsbHksIGFuZCBpbXBlcnNvbmF0ZSBvdGhlciB1c2Vycy4gIFRvIGF2b2lkIHRoaXMgcHJvYmxlbSwgdGhlCitzdGFuZGFyZCBpbXBsZW1lbnRhdGlvbnMgc3VwcG9ydCB0aGUgY29uY2VwdCBvZiA8ZW0+ZGlnZXN0aW5nPC9lbT4KK3VzZXIgcGFzc3dvcmRzLiAgVGhpcyBhbGxvd3MgdGhlIHN0b3JlZCB2ZXJzaW9uIG9mIHRoZSBwYXNzd29yZHMgdG8gYmUKK2VuY29kZWQgKGluIGEgZm9ybSB0aGF0IGlzIG5vdCBlYXNpbHkgcmV2ZXJzaWJsZSksIGJ1dCB0aGF0IHRoZQorPGNvZGU+UmVhbG08L2NvZGU+IGltcGxlbWVudGF0aW9uIGNhbiBzdGlsbCB1dGlsaXplIGZvcgorYXV0aGVudGljYXRpb24uPC9wPgorCis8cD5XaGVuIGEgc3RhbmRhcmQgcmVhbG0gYXV0aGVudGljYXRlcyBieSByZXRyaWV2aW5nIHRoZSBzdG9yZWQKK3Bhc3N3b3JkIGFuZCBjb21wYXJpbmcgaXQgd2l0aCB0aGUgdmFsdWUgcHJlc2VudGVkIGJ5IHRoZSB1c2VyLCB5b3UKK2NhbiBzZWxlY3QgZGlnZXN0ZWQgcGFzc3dvcmRzIGJ5IHNwZWNpZnlpbmcgdGhlIDxjb2RlPmRpZ2VzdDwvY29kZT4KK2F0dHJpYnV0ZSBvbiB5b3VyIDxjb2RlPiZsdDtSZWFsbSZndDs8L2NvZGU+IGVsZW1lbnQuICBUaGUgdmFsdWUgZm9yCit0aGlzIGF0dHJpYnV0ZSBtdXN0IGJlIG9uZSBvZiB0aGUgZGlnZXN0IGFsZ29yaXRobXMgc3VwcG9ydGVkIGJ5IHRoZQorPGNvZGU+amF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0PC9jb2RlPiBjbGFzcyAoU0hBLCBNRDIsIG9yIE1ENSkuCitXaGVuIHlvdSBzZWxlY3QgdGhpcyBvcHRpb24sIHRoZSBjb250ZW50cyBvZiB0aGUgcGFzc3dvcmQgdGhhdCBpcworc3RvcmVkIGluIHRoZSA8Y29kZT5SZWFsbTwvY29kZT4gbXVzdCBiZSB0aGUgY2xlYXJ0ZXh0IHZlcnNpb24gb2YgdGhlCitwYXNzd29yZCwgYXMgZGlnZXN0ZWQgYnkgdGhlIHNwZWNpZmllZCBhbGdvcml0aG0uPC9wPgorCis8cD5XaGVuIHRoZSA8Y29kZT5hdXRoZW50aWNhdGUoKTwvY29kZT4gbWV0aG9kIG9mIHRoZSBSZWFsbSBpcyBjYWxsZWQsIHRoZQorKGNsZWFydGV4dCkgcGFzc3dvcmQgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyIGlzIGl0c2VsZiBkaWdlc3RlZCBieSB0aGUgc2FtZQorYWxnb3JpdGhtLCBhbmQgdGhlIHJlc3VsdCBpcyBjb21wYXJlZCB3aXRoIHRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGUKKzxjb2RlPlJlYWxtPC9jb2RlPi4gIEFuIGVxdWFsIG1hdGNoIGltcGxpZXMgdGhhdCB0aGUgY2xlYXJ0ZXh0IHZlcnNpb24gb2YgdGhlCitvcmlnaW5hbCBwYXNzd29yZCBpcyB0aGUgc2FtZSBhcyB0aGUgb25lIHByZXNlbnRlZCBieSB0aGUgdXNlciwgc28gdGhhdCB0aGlzCit1c2VyIHNob3VsZCBiZSBhdXRob3JpemVkLjwvcD4KKworPHA+VG8gY2FsY3VsYXRlIHRoZSBkaWdlc3RlZCB2YWx1ZSBvZiBhIGNsZWFydGV4dCBwYXNzd29yZCwgdHdvIGNvbnZlbmllbmNlCit0ZWNobmlxdWVzIGFyZSBzdXBwb3J0ZWQ6PC9wPgorPHVsPgorPGxpPklmIHlvdSBhcmUgd3JpdGluZyBhbiBhcHBsaWNhdGlvbiB0aGF0IG5lZWRzIHRvIGNhbGN1bGF0ZSBkaWdlc3RlZAorICAgIHBhc3N3b3JkcyBkeW5hbWljYWxseSwgY2FsbCB0aGUgc3RhdGljIDxjb2RlPkRpZ2VzdCgpPC9jb2RlPiBtZXRob2Qgb2YgdGhlCisgICAgPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5yZWFsbS5SZWFsbUJhc2U8L2NvZGU+IGNsYXNzLCBwYXNzaW5nIHRoZQorICAgIGNsZWFydGV4dCBwYXNzd29yZCBhbmQgdGhlIGRpZ2VzdCBhbGdvcml0aG0gbmFtZSBhcyBhcmd1bWVudHMuICBUaGlzCisgICAgbWV0aG9kIHdpbGwgcmV0dXJuIHRoZSBkaWdlc3RlZCBwYXNzd29yZC48L2xpPgorPGxpPklmIHlvdSB3YW50IHRvIGV4ZWN1dGUgYSBjb21tYW5kIGxpbmUgdXRpbGl0eSB0byBjYWxjdWxhdGUgdGhlIGRpZ2VzdGVkCisgICAgcGFzc3dvcmQsIHNpbXBseSBleGVjdXRlCis8c291cmNlPgoramF2YSBvcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtLlJlYWxtQmFzZSBcCisgICAgLWEge2FsZ29yaXRobX0ge2NsZWFydGV4dC1wYXNzd29yZH0KKzwvc291cmNlPgorICAgIGFuZCB0aGUgZGlnZXN0ZWQgdmVyc2lvbiBvZiB0aGlzIGNsZWFydGV4dCBwYXNzd29yZCB3aWxsIGJlIHJldHVybmVkIHRvCisgICAgc3RhbmRhcmQgb3V0cHV0LjwvbGk+Cis8L3VsPgorCis8cD5UbyB1c2UgZWl0aGVyIG9mIHRoZSBhYm92ZSB0ZWNobmlxdWVzLCB0aGUKKzxjb2RlPiRDQVRBTElOQV9IT01FL3NlcnZlci9saWIvY2F0YWxpbmEuamFyPC9jb2RlPiBmaWxlIHdpbGwgbmVlZCB0byBiZQorb24geW91ciBjbGFzcyBwYXRoIHRvIG1ha2UgdGhlIDxjb2RlPlJlYWxtQmFzZTwvY29kZT4gY2xhc3MgYXZhaWxhYmxlLjwvcD4KKworPC9zdWJzZWN0aW9uPgorCisKKworPHN1YnNlY3Rpb24gbmFtZT0iRXhhbXBsZSBBcHBsaWNhdGlvbiI+CisKKzxwPlRoZSBleGFtcGxlIGFwcGxpY2F0aW9uIHNoaXBwZWQgd2l0aCBUb21jYXQgNSBpbmNsdWRlcyBhbiBhcmVhIHRoYXQgaXMKK3Byb3RlY3RlZCBieSBhIHNlY3VyaXR5IGNvbnN0cmFpbnQsIHV0aWxpemluZyBmb3JtLWJhc2VkIGxvZ2luLiAgVG8gYWNjZXNzIGl0LAorcG9pbnQgeW91ciBicm93c2VyIGF0Cis8YSBocmVmPSJodHRwOi8vbG9jYWxob3N0OjgwODAvanNwLWV4YW1wbGVzL3NlY3VyaXR5L3Byb3RlY3RlZC8iPmh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qc3AtZXhhbXBsZXMvc2VjdXJpdHkvcHJvdGVjdGVkLzwvYT4KK2FuZCBsb2cgb24gd2l0aCBvbmUgb2YgdGhlIHVzZXJuYW1lcyBhbmQgcGFzc3dvcmRzIGRlc2NyaWJlZCBmb3IgdGhlIGRlZmF1bHQKKzxhIGhyZWY9IiNNZW1vcnlSZWFsbSI+TWVtb3J5UmVhbG08L2E+LjwvcD4KKworPC9zdWJzZWN0aW9uPgorCisKKzxzdWJzZWN0aW9uIG5hbWU9Ik1hbmFnZXIgQXBwbGljYXRpb24iPgorCis8cD5JZiB5b3Ugd2lzaCB0byB1c2UgdGhlIDxhIGhyZWY9Im1hbmFnZXItaG93dG8uaHRtbCI+TWFuYWdlciBBcHBsaWNhdGlvbjwvYT4KK3RvIGRlcGxveSBhbmQgdW5kZXBsb3kgYXBwbGljYXRpb25zIGluIGEgcnVubmluZyBUb21jYXQgNSBpbnN0YWxsYXRpb24sIHlvdQorTVVTVCBhZGQgdGhlICJtYW5hZ2VyIiByb2xlIHRvIGF0IGxlYXN0IG9uZSB1c2VybmFtZSBpbiB5b3VyIHNlbGVjdGVkIFJlYWxtCitpbXBsZW1lbnRhdGlvbi4gIFRoaXMgaXMgYmVjYXVzZSB0aGUgbWFuYWdlciB3ZWIgYXBwbGljYXRpb24gaXRzZWxmIHVzZXMgYQorc2VjdXJpdHkgY29uc3RyYWludCB0aGF0IHJlcXVpcmVzIHJvbGUgIm1hbmFnZXIiIHRvIGFjY2VzcyBBTlkgcmVxdWVzdCBVUkkKK3dpdGhpbiB0aGF0IGFwcGxpY2F0aW9uLjwvcD4KKworPHA+Rm9yIHNlY3VyaXR5IHJlYXNvbnMsIG5vIHVzZXJuYW1lIGluIHRoZSBkZWZhdWx0IFJlYWxtIChpLmUuIHVzaW5nCis8Y29kZT5jb25mL3RvbWNhdC11c2Vycy54bWw8L2NvZGU+IGlzIGFzc2lnbmVkIHRoZSAibWFuYWdlciIgcm9sZS4gIFRoZXJmb3JlLAorbm8gb25lIHdpbGwgYmUgYWJsZSB0byB1dGlsaXplIHRoZSBmZWF0dXJlcyBvZiB0aGlzIGFwcGxpY2F0aW9uIHVudGlsIHRoZQorVG9tY2F0IGFkbWluaXN0cmF0b3Igc3BlY2lmaWNhbGx5IGFzc2lnbnMgdGhpcyByb2xlIHRvIG9uZSBvciBtb3JlIHVzZXJzLjwvcD4KKworPC9zdWJzZWN0aW9uPgorCis8c3Vic2VjdGlvbiBuYW1lPSJSZWFsbSBMb2dnaW5nIj4KKworPHA+RGVidWdnaW5nIGFuZCBleGNlcHRpb24gbWVzc2FnZXMgbG9nZ2VkIGJ5IGEgPGNvZGU+UmVhbG08L2NvZGU+IHdpbGwKKyAgIGJlIHJlY29yZGVkIGJ5IHRoZSBsb2dnaW5nIGNvbmZpZ3VyYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBjb250YWluZXIKKyAgIGZvciB0aGUgcmVhbG06IGl0cyBzdXJyb3VuZGluZyA8YSBocmVmPSJjb250ZXh0Lmh0bWwiPkNvbnRleHQ8L2E+LAorICAgPGEgaHJlZj0iaG9zdC5odG1sIj5Ib3N0PC9hPiwgb3IgPGEgaHJlZj0iZW5naW5lLmh0bWwiPkVuZ2luZTwvYT4uPC9wPgorCis8L3N1YnNlY3Rpb24+CisKKzwvc2VjdGlvbj4KKworCis8c2VjdGlvbiBuYW1lPSJTdGFuZGFyZCBSZWFsbSBJbXBsZW1lbnRhdGlvbnMiPgorCis8c3Vic2VjdGlvbiBuYW1lPSJKREJDUmVhbG0iPgorCis8aDM+SW50cm9kdWN0aW9uPC9oMz4KKworPHA+PHN0cm9uZz5KREJDUmVhbG08L3N0cm9uZz4gaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIFRvbWNhdCA1Cis8Y29kZT5SZWFsbTwvY29kZT4gaW50ZXJmYWNlIHRoYXQgbG9va3MgdXAgdXNlcnMgaW4gYSByZWxhdGlvbmFsIGRhdGFiYXNlCithY2Nlc3NlZCB2aWEgYSBKREJDIGRyaXZlci4gIFRoZXJlIGlzIHN1YnN0YW50aWFsIGNvbmZpZ3VyYXRpb24gZmxleGliaWxpdHkKK3RoYXQgbGV0cyB5b3UgYWRhcHQgdG8gZXhpc3RpbmcgdGFibGUgYW5kIGNvbHVtbiBuYW1lcywgYXMgbG9uZyBhcyB5b3VyCitkYXRhYmFzZSBzdHJ1Y3R1cmUgY29uZm9ybXMgdG8gdGhlIGZvbGxvd2luZyByZXF1aXJlbWVudHM6PC9wPgorPHVsPgorPGxpPlRoZXJlIG11c3QgYmUgYSB0YWJsZSwgcmVmZXJlbmNlZCBiZWxvdyBhcyB0aGUgPGVtPnVzZXJzPC9lbT4gdGFibGUsCisgICAgdGhhdCBjb250YWlucyBvbmUgcm93IGZvciBldmVyeSB2YWxpZCB1c2VyIHRoYXQgdGhpcyA8Y29kZT5SZWFsbTwvY29kZT4KKyAgICBzaG91bGQgcmVjb2duaXplLjwvbGk+Cis8bGk+VGhlIDxlbT51c2VyczwvZW0+IHRhYmxlIG11c3QgY29udGFpbiBhdCBsZWFzdCB0d28gY29sdW1ucyAoaXQgbWF5CisgICAgY29udGFpbiBtb3JlIGlmIHlvdXIgZXhpc3RpbmcgYXBwbGljYXRpb25zIHJlcXVpcmVkIGl0KToKKyAgICA8dWw+CisgICAgPGxpPlVzZXJuYW1lIHRvIGJlIHJlY29nbml6ZWQgYnkgVG9tY2F0IHdoZW4gdGhlIHVzZXIgbG9ncyBpbi48L2xpPgorICAgIDxsaT5QYXNzd29yZCB0byBiZSByZWNvZ25pemVkIGJ5IFRvbWNhdCB3aGVuIHRoZSB1c2VyIGxvZ3MgaW4uCisgICAgICAgIFRoaXMgdmFsdWUgbWF5IGluIGNsZWFydGV4dCBvciBkaWdlc3RlZCAtIHNlZSBiZWxvdyBmb3IgbW9yZQorICAgICAgICBpbmZvcm1hdGlvbi48L2xpPgorICAgIDwvdWw+PC9saT4KKzxsaT5UaGVyZSBtdXN0IGJlIGEgdGFibGUsIHJlZmVyZW5jZWQgYmVsb3cgYXMgdGhlIDxlbT51c2VyIHJvbGVzPC9lbT4gdGFibGUsCisgICAgdGhhdCBjb250YWlucyBvbmUgcm93IGZvciBldmVyeSB2YWxpZCByb2xlIHRoYXQgaXMgYXNzaWduZWQgdG8gYQorICAgIHBhcnRpY3VsYXIgdXNlci4gIEl0IGlzIGxlZ2FsIGZvciBhIHVzZXIgdG8gaGF2ZSB6ZXJvLCBvbmUsIG9yIG1vcmUgdGhhbgorICAgIG9uZSB2YWxpZCByb2xlLjwvbGk+Cis8bGk+VGhlIDxlbT51c2VyIHJvbGVzPC9lbT4gdGFibGUgbXVzdCBjb250YWluIGF0IGxlYXN0IHR3byBjb2x1bW5zIChpdCBtYXkKKyAgICBjb250YWluIG1vcmUgaWYgeW91ciBleGlzdGluZyBhcHBsaWNhdGlvbnMgcmVxdWlyZWQgaXQpOgorICAgIDx1bD4KKyAgICA8bGk+VXNlcm5hbWUgdG8gYmUgcmVjb2duaXplZCBieSBUb21jYXQgKHNhbWUgdmFsdWUgYXMgaXMgc3BlY2lmaWVkCisgICAgICAgIGluIHRoZSA8ZW0+dXNlcnM8L2VtPiB0YWJsZSkuPC9saT4KKyAgICA8bGk+Um9sZSBuYW1lIG9mIGEgdmFsaWQgcm9sZSBhc3NvY2lhdGVkIHdpdGggdGhpcyB1c2VyLjwvbGk+CisgICAgPC91bD48L2xpPgorPC91bD4KKworPGgzPlF1aWNrIFN0YXJ0PC9oMz4KKworPHA+VG8gc2V0IHVwIFRvbWNhdCB0byB1c2UgSkRCQ1JlYWxtLCB5b3Ugd2lsbCBuZWVkIHRvIGZvbGxvdyB0aGVzZSBzdGVwczo8L3A+Cis8b2w+Cis8bGk+SWYgeW91IGhhdmUgbm90IHlldCBkb25lIHNvLCBjcmVhdGUgdGFibGVzIGFuZCBjb2x1bW5zIGluIHlvdXIgZGF0YWJhc2UKKyAgICB0aGF0IGNvbmZvcm0gdG8gdGhlIHJlcXVpcmVtZW50cyBkZXNjcmliZWQgYWJvdmUuPC9saT4KKzxsaT5Db25maWd1cmUgYSBkYXRhYmFzZSB1c2VybmFtZSBhbmQgcGFzc3dvcmQgZm9yIHVzZSBieSBUb21jYXQsIHRoYXQgaGFzCisgICAgYXQgbGVhc3QgcmVhZCBvbmx5IGFjY2VzcyB0byB0aGUgdGFibGVzIGRlc2NyaWJlZCBhYm92ZS4gIChUb21jYXQgd2lsbAorICAgIG5ldmVyIGF0dGVtcHQgdG8gd3JpdGUgdG8gdGhlc2UgdGFibGVzLik8L2xpPgorPGxpPlBsYWNlIGEgY29weSBvZiB0aGUgSkRCQyBkcml2ZXIgeW91IHdpbGwgYmUgdXNpbmcgaW5zaWRlIHRoZQorICAgIDxjb2RlPiRDQVRBTElOQV9IT01FL3NlcnZlci9saWI8L2NvZGU+IGRpcmVjdG9yeSAoaWYgeW91IGRvIG5vdCBuZWVkIGl0CisgICAgdmlzaWJsZSB0byB3ZWIgYXBwbGljYXRpb25zKSBvciA8Y29kZT4kQ0FUQUxJTkFfSE9NRS9jb21tb24vbGliPC9jb2RlPgorICAgIChpZiBpdCB3aWxsIGJlIHVzZWQgYm90aCBieSBUb21jYXQgNSA8ZW0+YW5kPC9lbT4gYnkgeW91ciBhcHBzKS4KKyAgICBOb3RlIHRoYXQgPHN0cm9uZz5vbmx5PC9zdHJvbmc+IEpBUiBmaWxlcyBhcmUgcmVjb2duaXplZCE8L2xpPgorPGxpPlNldCB1cCBhIDxjb2RlPiZsdDtSZWFsbSZndDs8L2NvZGU+IGVsZW1lbnQsIGFzIGRlc2NyaWJlZCBiZWxvdywgaW4geW91cgorICAgIDxjb2RlPiRDQVRBTElOQV9IT01FL2NvbmYvc2VydmVyLnhtbDwvY29kZT4gZmlsZS48L2xpPgorPGxpPlJlc3RhcnQgVG9tY2F0IDUgaWYgaXQgaXMgYWxyZWFkeSBydW5uaW5nLjwvbGk+Cis8L29sPgorCis8aDM+UmVhbG0gRWxlbWVudCBBdHRyaWJ1dGVzPC9oMz4KKworPHA+VG8gY29uZmlndXJlIEpEQkNSZWFsbSwgeW91IHdpbGwgY3JlYXRlIGEgPGNvZGU+Jmx0O1JlYWxtJmd0OzwvY29kZT4KK2VsZW1lbnQgYW5kIG5lc3QgaXQgaW4geW91ciA8Y29kZT4kQ0FUQUxJTkFfSE9NRS9jb25mL3NlcnZlci54bWw8L2NvZGU+IGZpbGUsCithcyBkZXNjcmliZWQgPGEgaHJlZj0iI0NvbmZpZ3VyaW5nIGEgUmVhbG0iPmFib3ZlPC9hPi4gIFRoZSBmb2xsb3dpbmcKK2F0dHJpYnV0ZXMgYXJlIHN1cHBvcnRlZCBieSB0aGlzIGltcGxlbWVudGF0aW9uOjwvcD4KKworPGF0dHJpYnV0ZXM+CisKKyAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc05hbWUiIHJlcXVpcmVkPSJ0cnVlIj4KKyAgICA8cD5UaGUgZnVsbHkgcXVhbGlmaWVkIEphdmEgY2xhc3MgbmFtZSBvZiB0aGlzIFJlYWxtIGltcGxlbWVudGF0aW9uLgorICAgIFlvdSA8c3Ryb25nPk1VU1Q8L3N0cm9uZz4gc3BlY2lmeSB0aGUgdmFsdWUKKyAgICAiPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5yZWFsbS5KREJDUmVhbG08L2NvZGU+IiBoZXJlLjwvcD4KKyAgPC9hdHRyaWJ1dGU+CisKKyAgPGF0dHJpYnV0ZSBuYW1lPSJjb25uZWN0aW9uTmFtZSIgcmVxdWlyZWQ9InRydWUiPgorICAgIDxwPlRoZSBkYXRhYmFzZSB1c2VybmFtZSB1c2VkIHRvIGVzdGFibGlzaCBhIEpEQkMgY29ubmVjdGlvbi48L3A+CisgIDwvYXR0cmlidXRlPgorCisgIDxhdHRyaWJ1dGUgbmFtZT0iY29ubmVjdGlvblBhc3N3b3JkIiByZXF1aXJlZD0idHJ1ZSI+CisgICAgPHA+VGhlIGRhdGFiYXNlIHBhc3N3b3JkIHVzZWQgdG8gZXN0YWJsaXNoIGEgSkRCQyBjb25uZWN0aW9uLjwvcD4KKyAgPC9hdHRyaWJ1dGU+CisKKyAgPGF0dHJpYnV0ZSBuYW1lPSJjb25uZWN0aW9uVVJMIiByZXF1aXJlZD0idHJ1ZSI+CisgICAgPHA+VGhlIGRhdGFiYXNlIFVSTCB1c2VkIHRvIGVzdGFibGlzaCBhIEpEQkMgY29ubmVjdGlvbi48L3A+CisgIDwvYXR0cmlidXRlPgorCisgIDxhdHRyaWJ1dGUgbmFtZT0iZGlnZXN0IiByZXF1aXJlZD0iZmFsc2UiPgorICAgIDxwPlRoZSBkaWdlc3QgYWxnb3JpdGhtIHVzZWQgdG8gc3RvcmUgcGFzc3dvcmRzIGluIG5vbi1wbGFpbnRleHQgZm9ybWF0cy4KKyAgICBWYWxpZCB2YWx1ZXMgYXJlIHRob3NlIGFjY2VwdGVkIGZvciB0aGUgYWxnb3JpdGhtIG5hbWUgYnkgdGhlCisgICAgPGNvZGU+amF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0PC9jb2RlPiBjbGFzcy4gIFNlZQorICAgIDxhIGhyZWY9IiNEaWdlc3RlZCBQYXNzd29yZHMiPkRpZ2VzdGVkIFBhc3N3b3JkczwvYT4gZm9yIG1vcmUKKyAgICBpbmZvcm1hdGlvbi4gIElmIG5vdCBzcGVjaWZpZWQsIHBhc3N3b3JkcyBhcmUgc3RvcmVkIGluIGNsZWFyIHRleHQuPC9wPgorICA8L2F0dHJpYnV0ZT4KKworICA8YXR0cmlidXRlIG5hbWU9ImRyaXZlck5hbWUiIHJlcXVpcmVkPSJ0cnVlIj4KKyAgICA8cD5UaGUgZnVsbHkgcXVhbGlmaWVkIEphdmEgY2xhc3MgbmFtZSBvZiB0aGUgSkRCQyBkcml2ZXIgdG8gYmUgdXNlZC4KKyAgICBDb25zdWx0IHRoZSBkb2N1bWVudGF0aW9uIGZvciB5b3VyIEpEQkMgZHJpdmVyIGZvciB0aGUgYXBwcm9wcmlhdGUKKyAgICB2YWx1ZS48L3A+CisgIDwvYXR0cmlidXRlPgorCisgIDxhdHRyaWJ1dGUgbmFtZT0icm9sZU5hbWVDb2wiIHJlcXVpcmVkPSJ0cnVlIj4KKyAgICA8cD5UaGUgbmFtZSBvZiB0aGUgY29sdW1uLCBpbiB0aGUgPGVtPnVzZXIgcm9sZXM8L2VtPiB0YWJsZSwgdGhhdAorICAgIGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgcm9sZSBhc3NpZ25lZCB0byB0aGlzIHVzZXIuPC9wPgorICA8L2F0dHJpYnV0ZT4KKworICA8YXR0cmlidXRlIG5hbWU9InVzZXJDcmVkQ29sIiByZXF1aXJlZD0idHJ1ZSI+CisgICAgPHA+VGhlIG5hbWUgb2YgdGhlIGNvbHVtbiwgaW4gdGhlIDxlbT51c2VyczwvZW0+IHRhYmxlLCB0aGF0IGNvbnRhaW5zCisgICAgdGhlIHBhc3N3b3JkIGZvciB0aGlzIHVzZXIgKGVpdGhlciBpbiBjbGVhciB0ZXh0LCBvciBkaWdlc3RlZCBpZiB0aGUKKyAgICA8Y29kZT5kaWdlc3Q8L2NvZGU+IGF0dHJpYnV0ZSBpcyBzZXQpLjwvcD4KKyAgPC9hdHRyaWJ1dGU+CisKKyAgPGF0dHJpYnV0ZSBuYW1lPSJ1c2VyTmFtZUNvbCIgcmVxdWlyZWQ9InRydWUiPgorICAgIDxwPlRoZSBuYW1lIG9mIHRoZSBjb2x1bW4sIGluIHRoZSA8ZW0+dXNlcnM8L2VtPiBhbmQgPGVtPnVzZXIgcm9sZXM8L2VtPgorICAgIHRhYmxlcywgdGhhdCBjb250YWlucyB0aGUgdXNlcm5hbWUgb2YgdGhpcyB1c2VyLjwvcD4KKyAgPC9hdHRyaWJ1dGU+CisKKyAgPGF0dHJpYnV0ZSBuYW1lPSJ1c2VyUm9sZVRhYmxlIiByZXF1aXJlZD0idHJ1ZSI+CisgICAgPHA+VGhlIG5hbWUgb2YgdGhlIHRhYmxlIHRoYXQgY29udGFpbnMgb25lIHJvdyBmb3IgZWFjaCA8ZW0+cm9sZTwvZW0+CisgICAgYXNzaWduZWQgdG8gYSBwYXJ0aWN1bGFyIDxlbT51c2VybmFtZTwvZW0+LiAgVGhpcyB0YWJsZSBtdXN0IGluY2x1ZGUgYXQKKyAgICBsZWFzdCB0aGUgY29sdW1ucyBuYW1lZCBieSB0aGUgPGNvZGU+dXNlck5hbWVDb2w8L2NvZGU+IGFuZAorICAgIDxjb2RlPnJvbGVOYW1lQ29sPC9jb2RlPiBhdHRyaWJ1dGVzLjwvcD4KKyAgPC9hdHRyaWJ1dGU+CisKKyAgPGF0dHJpYnV0ZSBuYW1lPSJ1c2VyVGFibGUiIHJlcXVpcmVkPSJ0cnVlIj4KKyAgICA8cD5UaGUgbmFtZSBvZiB0aGUgdGFibGUgdGhhdCBjb250YWlucyBvbmUgcm93IGZvciBlYWNoIDxlbT51c2VybmFtZTwvZW0+CisgICAgdG8gYmUgcmVjb2duaXplZCBieSBUb21jYXQuICBUaGlzIHRhYmxlIG11c3QgaW5jbHVkZSBhdCBsZWFzdCB0aGUgY29sdW1ucworICAgIG5hbWVkIGJ5IHRoZSA8Y29kZT51c2VyTmFtZUNvbDwvY29kZT4gYW5kIDxjb2RlPnVzZXJDcmVkQ29sPC9jb2RlPgorICAgIGF0dHJpYnV0ZXMuPC9wPgorICA8L2F0dHJpYnV0ZT4KKworPC9hdHRyaWJ1dGVzPgorCis8aDM+RXhhbXBsZTwvaDM+CisKKzxwPkFuIGV4YW1wbGUgU1FMIHNjcmlwdCB0byBjcmVhdGUgdGhlIG5lZWRlZCB0YWJsZXMgbWlnaHQgbG9vayBzb21ldGhpbmcKK2xpa2UgdGhpcyAoYWRhcHQgdGhlIHN5bnRheCBhcyByZXF1aXJlZCBmb3IgeW91ciBwYXJ0aWN1bGFyIGRhdGFiYXNlKTo8L3A+Cis8c291cmNlPgorY3JlYXRlIHRhYmxlIHVzZXJzICgKKyAgdXNlcl9uYW1lICAgICAgICAgdmFyY2hhcigxNSkgbm90IG51bGwgcHJpbWFyeSBrZXksCisgIHVzZXJfcGFzcyAgICAgICAgIHZhcmNoYXIoMTUpIG5vdCBudWxsCispOworCitjcmVhdGUgdGFibGUgdXNlcl9yb2xlcyAoCisgIHVzZXJfbmFtZSAgICAgICAgIHZhcmNoYXIoMTUpIG5vdCBudWxsLAorICByb2xlX25hbWUgICAgICAgICB2YXJjaGFyKDE1KSBub3QgbnVsbCwKKyAgcHJpbWFyeSBrZXkgKHVzZXJfbmFtZSwgcm9sZV9uYW1lKQorKTsKKzwvc291cmNlPgorCis8cD5FeGFtcGxlIDxjb2RlPlJlYWxtPC9jb2RlPiBlbGVtZW50cyBhcmUgaW5jbHVkZWQgKGNvbW1lbnRlZCBvdXQpIGluIHRoZQorZGVmYXVsdCA8Y29kZT4kQ0FUQUxJTkFfSE9NRS9jb25mL3NlcnZlci54bWw8L2NvZGU+IGZpbGUuICBIZXJlJ3MgYW4gZXhhbXBsZQorZm9yIHVzaW5nIGEgTXlTUUwgZGF0YWJhc2UgY2FsbGVkICJhdXRob3JpdHkiLCBjb25maWd1cmVkIHdpdGggdGhlIHRhYmxlcworZGVzY3JpYmVkIGFib3ZlLCBhbmQgYWNjZXNzZWQgd2l0aCB1c2VybmFtZSAiZGJ1c2VyIiBhbmQgcGFzc3dvcmQgImRicGFzcyI6PC9wPgorPHNvdXJjZT4KKyZsdDtSZWFsbSBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEucmVhbG0uSkRCQ1JlYWxtIiBkZWJ1Zz0iOTkiCisgICAgICBkcml2ZXJOYW1lPSJvcmcuZ2p0Lm1tLm15c3FsLkRyaXZlciIKKyAgIGNvbm5lY3Rpb25VUkw9ImpkYmM6bXlzcWw6Ly9sb2NhbGhvc3QvYXV0aG9yaXR5P3VzZXI9ZGJ1c2VyJmFtcDthbXA7cGFzc3dvcmQ9ZGJwYXNzIgorICAgICAgIHVzZXJUYWJsZT0idXNlcnMiIHVzZXJOYW1lQ29sPSJ1c2VyX25hbWUiIHVzZXJDcmVkQ29sPSJ1c2VyX3Bhc3MiCisgICB1c2VyUm9sZVRhYmxlPSJ1c2VyX3JvbGVzIiByb2xlTmFtZUNvbD0icm9sZV9uYW1lIi8mZ3Q7Cis8L3NvdXJjZT4KKworPGgzPkFkZGl0aW9uYWwgTm90ZXM8L2gzPgorCis8cD5KREJDUmVhbG0gb3BlcmF0ZXMgYWNjb3JkaW5nIHRvIHRoZSBmb2xsb3dpbmcgcnVsZXM6PC9wPgorPHVsPgorPGxpPldoZW4gYSB1c2VyIGF0dGVtcHRzIHRvIGFjY2VzcyBhIHByb3RlY3RlZCByZXNvdXJjZSBmb3IgdGhlIGZpcnN0IHRpbWUsCisgICAgVG9tY2F0IDUgd2lsbCBjYWxsIHRoZSA8Y29kZT5hdXRoZW50aWNhdGUoKTwvY29kZT4gbWV0aG9kIG9mIHRoaXMKKyAgICA8Y29kZT5SZWFsbTwvY29kZT4uICBUaHVzLCBhbnkgY2hhbmdlcyB5b3UgaGF2ZSBtYWRlIHRvIHRoZSBkYXRhYmFzZQorICAgIGRpcmVjdGx5IChuZXcgdXNlcnMsIGNoYW5nZWQgcGFzc3dvcmRzIG9yIHJvbGVzLCBldGMuKSB3aWxsIGJlIGltbWVkaWF0ZWx5CisgICAgcmVmbGVjdGVkLjwvbGk+Cis8bGk+T25jZSBhIHVzZXIgaGFzIGJlZW4gYXV0aGVudGljYXRlZCwgdGhlIHVzZXIgKGFuZCBoaXMgb3IgaGVyIGFzc29jaWF0ZWQKKyAgICByb2xlcykgYXJlIGNhY2hlZCB3aXRoaW4gVG9tY2F0IGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIHVzZXIncyBsb2dpbi4KKyAgICAoRm9yIEZPUk0tYmFzZWQgYXV0aGVudGljYXRpb24sIHRoYXQgbWVhbnMgdW50aWwgdGhlIHNlc3Npb24gdGltZXMgb3V0IG9yCisgICAgaXMgaW52YWxpZGF0ZWQ7IGZvciBCQVNJQyBhdXRoZW50aWNhdGlvbiwgdGhhdCBtZWFucyB1bnRpbCB0aGUgdXNlcgorICAgIGNsb3NlcyB0aGVpciBicm93c2VyKS4gIFRoZSBjYWNoZWQgdXNlciBpcyA8c3Ryb25nPm5vdDwvc3Ryb25nPiBzYXZlZCBhbmQKKyAgICByZXN0b3JlZCBhY3Jvc3Mgc2Vzc2lvbnMgc2VyaWFsaXNhdGlvbnMuIEFueSBjaGFuZ2VzIHRvIHRoZSBkYXRhYmFzZQorICAgIGluZm9ybWF0aW9uIGZvciBhbiBhbHJlYWR5IGF1dGhlbnRpY2F0ZWQgdXNlciB3aWxsIDxzdHJvbmc+bm90PC9zdHJvbmc+IGJlCisgICAgcmVmbGVjdGVkIHVudGlsIHRoZSBuZXh0IHRpbWUgdGhhdCB1c2VyIGxvZ3Mgb24gYWdhaW4uPC9saT4KKzxsaT5BZG1pbmlzdGVyaW5nIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgPGVtPnVzZXJzPC9lbT4gYW5kIDxlbT51c2VyIHJvbGVzPC9lbT4KKyAgICB0YWJsZSBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgeW91ciBvd24gYXBwbGljYXRpb25zLiAgVG9tY2F0IGRvZXMgbm90CisgICAgcHJvdmlkZSBhbnkgYnVpbHQtaW4gY2FwYWJpbGl0aWVzIHRvIG1haW50YWluIHVzZXJzIGFuZCByb2xlcy48L2xpPgorPC91bD4KKworPC9zdWJzZWN0aW9uPgorCisKKzxzdWJzZWN0aW9uIG5hbWU9IkRhdGFTb3VyY2VSZWFsbSI+CisKKzxoMz5JbnRyb2R1Y3Rpb248L2gzPgorCis8cD48c3Ryb25nPkRhdGFTb3VyY2VSZWFsbTwvc3Ryb25nPiBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVG9tY2F0IDUKKzxjb2RlPlJlYWxtPC9jb2RlPiBpbnRlcmZhY2UgdGhhdCBsb29rcyB1cCB1c2VycyBpbiBhIHJlbGF0aW9uYWwgZGF0YWJhc2UKK2FjY2Vzc2VkIHZpYSBhIEpOREkgbmFtZWQgSkRCQyBEYXRhU291cmNlLiAgVGhlcmUgaXMgc3Vic3RhbnRpYWwgY29uZmlndXJhdGlvbgorZmxleGliaWxpdHkgdGhhdCBsZXRzIHlvdSBhZGFwdCB0byBleGlzdGluZyB0YWJsZSBhbmQgY29sdW1uIG5hbWVzLCBhcyBsb25nCithcyB5b3VyIGRhdGFiYXNlIHN0cnVjdHVyZSBjb25mb3JtcyB0byB0aGUgZm9sbG93aW5nIHJlcXVpcmVtZW50czo8L3A+Cis8dWw+Cis8bGk+VGhlcmUgbXVzdCBiZSBhIHRhYmxlLCByZWZlcmVuY2VkIGJlbG93IGFzIHRoZSA8ZW0+dXNlcnM8L2VtPiB0YWJsZSwKKyAgICB0aGF0IGNvbnRhaW5zIG9uZSByb3cgZm9yIGV2ZXJ5IHZhbGlkIHVzZXIgdGhhdCB0aGlzIDxjb2RlPlJlYWxtPC9jb2RlPgorICAgIHNob3VsZCByZWNvZ25pemUuPC9saT4KKzxsaT5UaGUgPGVtPnVzZXJzPC9lbT4gdGFibGUgbXVzdCBjb250YWluIGF0IGxlYXN0IHR3byBjb2x1bW5zIChpdCBtYXkKKyAgICBjb250YWluIG1vcmUgaWYgeW91ciBleGlzdGluZyBhcHBsaWNhdGlvbnMgcmVxdWlyZWQgaXQpOgorICAgIDx1bD4KKyAgICA8bGk+VXNlcm5hbWUgdG8gYmUgcmVjb2duaXplZCBieSBUb21jYXQgd2hlbiB0aGUgdXNlciBsb2dzIGluLjwvbGk+CisgICAgPGxpPlBhc3N3b3JkIHRvIGJlIHJlY29nbml6ZWQgYnkgVG9tY2F0IHdoZW4gdGhlIHVzZXIgbG9ncyBpbi4KKyAgICAgICAgVGhpcyB2YWx1ZSBtYXkgaW4gY2xlYXJ0ZXh0IG9yIGRpZ2VzdGVkIC0gc2VlIGJlbG93IGZvciBtb3JlCisgICAgICAgIGluZm9ybWF0aW9uLjwvbGk+CisgICAgPC91bD48L2xpPiAgICAKKzxsaT5UaGVyZSBtdXN0IGJlIGEgdGFibGUsIHJlZmVyZW5jZWQgYmVsb3cgYXMgdGhlIDxlbT51c2VyIHJvbGVzPC9lbT4gdGFibGUsCisgICAgdGhhdCBjb250YWlucyBvbmUgcm93IGZvciBldmVyeSB2YWxpZCByb2xlIHRoYXQgaXMgYXNzaWduZWQgdG8gYQorICAgIHBhcnRpY3VsYXIgdXNlci4gIEl0IGlzIGxlZ2FsIGZvciBhIHVzZXIgdG8gaGF2ZSB6ZXJvLCBvbmUsIG9yIG1vcmUgdGhhbgorICAgIG9uZSB2YWxpZCByb2xlLjwvbGk+Cis8bGk+VGhlIDxlbT51c2VyIHJvbGVzPC9lbT4gdGFibGUgbXVzdCBjb250YWluIGF0IGxlYXN0IHR3byBjb2x1bW5zIChpdCBtYXkKKyAgICBjb250YWluIG1vcmUgaWYgeW91ciBleGlzdGluZyBhcHBsaWNhdGlvbnMgcmVxdWlyZWQgaXQpOgorICAgIDx1bD4KKyAgICA8bGk+VXNlcm5hbWUgdG8gYmUgcmVjb2duaXplZCBieSBUb21jYXQgKHNhbWUgdmFsdWUgYXMgaXMgc3BlY2lmaWVkCisgICAgICAgIGluIHRoZSA8ZW0+dXNlcnM8L2VtPiB0YWJsZSkuPC9saT4KKyAgICA8bGk+Um9sZSBuYW1lIG9mIGEgdmFsaWQgcm9sZSBhc3NvY2lhdGVkIHdpdGggdGhpcyB1c2VyLjwvbGk+CisgICAgPC91bD48L2xpPiAgICAKKzwvdWw+CisKKzxoMz5RdWljayBTdGFydDwvaDM+CisgICAgICAgICAgICAgICAgICAKKzxwPlRvIHNldCB1cCBUb21jYXQgdG8gdXNlIERhdGFTb3VyY2VSZWFsbSwgeW91IHdpbGwgbmVlZCB0byBmb2xsb3cgdGhlc2Ugc3RlcHM6PC9wPgorPG9sPiAgICAgICAgICAgICAgCis8bGk+SWYgeW91IGhhdmUgbm90IHlldCBkb25lIHNvLCBjcmVhdGUgdGFibGVzIGFuZCBjb2x1bW5zIGluIHlvdXIgZGF0YWJhc2UKKyAgICB0aGF0IGNvbmZvcm0gdG8gdGhlIHJlcXVpcmVtZW50cyBkZXNjcmliZWQgYWJvdmUuPC9saT4KKzxsaT5Db25maWd1cmUgYSBkYXRhYmFzZSB1c2VybmFtZSBhbmQgcGFzc3dvcmQgZm9yIHVzZSBieSBUb21jYXQsIHRoYXQgaGFzCisgICAgYXQgbGVhc3QgcmVhZCBvbmx5IGFjY2VzcyB0byB0aGUgdGFibGVzIGRlc2NyaWJlZCBhYm92ZS4gIChUb21jYXQgd2lsbAorICAgIG5ldmVyIGF0dGVtcHQgdG8gd3JpdGUgdG8gdGhlc2UgdGFibGVzLik8L2xpPgorPGxpPkNvbmZpZ3VyZSBhIEpOREkgbmFtZWQgSkRCQyBEYXRhU291cmNlIGZvciB5b3VyIGRhdGFiYXNlLiAgUmVmZXIgdG8gdGhlCisgICAgPGEgaHJlZj0iam5kaS1kYXRhc291cmNlLWV4YW1wbGVzLWhvd3RvLmh0bWwiPkpOREkgRGF0YVNvdXJjZSBFeGFtcGxlIEhPVy1UTzwvYT4KKyAgICBmb3IgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbmZpZ3VyZSBhIEpOREkgbmFtZWQgSkRCQyBEYXRhU291cmNlLjwvbGk+Cis8bGk+U2V0IHVwIGEgPGNvZGU+Jmx0O1JlYWxtJmd0OzwvY29kZT4gZWxlbWVudCwgYXMgZGVzY3JpYmVkIGJlbG93LCBpbiB5b3VyCisgICAgPGNvZGU+JENBVEFMSU5BX0hPTUUvY29uZi9zZXJ2ZXIueG1sPC9jb2RlPiBmaWxlLjwvbGk+Cis8bGk+UmVzdGFydCBUb21jYXQgNSBpZiBpdCBpcyBhbHJlYWR5IHJ1bm5pbmcuPC9saT4KKzwvb2w+CisKKzxoMz5SZWFsbSBFbGVtZW50IEF0dHJpYnV0ZXM8L2gzPgorCis8cD5UbyBjb25maWd1cmUgRGF0YVNvdXJjZVJlYWxtLCB5b3Ugd2lsbCBjcmVhdGUgYSA8Y29kZT4mbHQ7UmVhbG0mZ3Q7PC9jb2RlPgorZWxlbWVudCBhbmQgbmVzdCBpdCBpbiB5b3VyIDxjb2RlPiRDQVRBTElOQV9IT01FL2NvbmYvc2VydmVyLnhtbDwvY29kZT4gZmlsZSwKK2FzIGRlc2NyaWJlZCA8YSBocmVmPSIjQ29uZmlndXJpbmcgYSBSZWFsbSI+YWJvdmU8L2E+LiAgVGhlIGZvbGxvd2luZworYXR0cmlidXRlcyBhcmUgc3VwcG9ydGVkIGJ5IHRoaXMgaW1wbGVtZW50YXRpb246PC9wPgorCis8YXR0cmlidXRlcz4KKworICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzTmFtZSIgcmVxdWlyZWQ9InRydWUiPgorICAgIDxwPlRoZSBmdWxseSBxdWFsaWZpZWQgSmF2YSBjbGFzcyBuYW1lIG9mIHRoaXMgUmVhbG0gaW1wbGVtZW50YXRpb24uCisgICAgWW91IDxzdHJvbmc+TVVTVDwvc3Ryb25nPiBzcGVjaWZ5IHRoZSB2YWx1ZQorICAgICI8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtLkRhdGFTb3VyY2VSZWFsbTwvY29kZT4iIGhlcmUuPC9wPgorICA8L2F0dHJpYnV0ZT4KKworICA8YXR0cmlidXRlIG5hbWU9ImRhdGFTb3VyY2VOYW1lIiByZXF1aXJlZD0idHJ1ZSI+CisgICAgPHA+VGhlIEpOREkgbmFtZWQgSkRCQyBEYXRhU291cmNlIGZvciB5b3VyIGRhdGFiYXNlLiBJZiB0aGUgRGF0YVNvdXJjZSBpcworICAgIGxvY2FsIHRvIHRoZSBjb250ZXh0LCB0aGUgbmFtZSBpcyByZWxhdGl2ZSB0byA8Y29kZT5qYXZhOi9jb21wL2VudjwvY29kZT4sCisgICAgYW5kIG90aGVyd2lzZSB0aGUgbmFtZSBzaG91bGQgbWF0Y2ggdGhlIG5hbWUgdXNlZCB0byBkZWZpbmUgdGhlIGdsb2JhbAorICAgIERhdGFTb3VyY2UuPC9wPgorICA8L2F0dHJpYnV0ZT4KKworICA8YXR0cmlidXRlIG5hbWU9ImRpZ2VzdCIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICA8cD5UaGUgZGlnZXN0IGFsZ29yaXRobSB1c2VkIHRvIHN0b3JlIHBhc3N3b3JkcyBpbiBub24tcGxhaW50ZXh0IGZvcm1hdHMuCisgICAgVmFsaWQgdmFsdWVzIGFyZSB0aG9zZSBhY2NlcHRlZCBmb3IgdGhlIGFsZ29yaXRobSBuYW1lIGJ5IHRoZQorICAgIDxjb2RlPmphdmEuc2VjdXJpdHkuTWVzc2FnZURpZ2VzdDwvY29kZT4gY2xhc3MuICBTZWUKKyAgICA8YSBocmVmPSIjRGlnZXN0ZWQgUGFzc3dvcmRzIj5EaWdlc3RlZCBQYXNzd29yZHM8L2E+IGZvciBtb3JlCisgICAgaW5mb3JtYXRpb24uICBJZiBub3Qgc3BlY2lmaWVkLCBwYXNzd29yZHMgYXJlIHN0b3JlZCBpbiBjbGVhciB0ZXh0LjwvcD4KKyAgPC9hdHRyaWJ1dGU+CisgICAgCisgIDxhdHRyaWJ1dGUgbmFtZT0ibG9jYWxEYXRhU291cmNlIiByZXF1aXJlZD0iZmFsc2UiPgorICAgIDxwPldoZW4gdGhlIHJlYWxtIGlzIG5lc3RlZCBpbnNpZGUgYSBDb250ZXh0IGVsZW1lbnQsIHRoaXMgYWxsb3dzIHRoZSAKKyAgICByZWFsbSB0byB1c2UgYSBEYXRhU291cmNlIGRlZmluZWQgZm9yIHRoZSBDb250ZXh0IHJhdGhlciB0aGFuIGEgZ2xvYmFsCisgICAgRGF0YVNvdXJjZS4gIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0IGlzIDxjb2RlPmZhbHNlPC9jb2RlPjogdXNlIGEgCisgICAgZ2xvYmFsIERhdGFTb3VyY2UuPC9wPgorICA8L2F0dHJpYnV0ZT4KKyAgICAKKyAgPGF0dHJpYnV0ZSBuYW1lPSJyb2xlTmFtZUNvbCIgcmVxdWlyZWQ9InRydWUiPgorICAgIDxwPlRoZSBuYW1lIG9mIHRoZSBjb2x1bW4sIGluIHRoZSA8ZW0+dXNlciByb2xlczwvZW0+IHRhYmxlLCB0aGF0CisgICAgY29udGFpbnMgdGhlIG5hbWUgb2YgYSByb2xlIGFzc2lnbmVkIHRvIHRoaXMgdXNlci48L3A+CisgIDwvYXR0cmlidXRlPgorICAgIAorICA8YXR0cmlidXRlIG5hbWU9InVzZXJDcmVkQ29sIiByZXF1aXJlZD0idHJ1ZSI+CisgICAgPHA+VGhlIG5hbWUgb2YgdGhlIGNvbHVtbiwgaW4gdGhlIDxlbT51c2VyczwvZW0+IHRhYmxlLCB0aGF0IGNvbnRhaW5zCisgICAgdGhlIHBhc3N3b3JkIGZvciB0aGlzIHVzZXIgKGVpdGhlciBpbiBjbGVhciB0ZXh0LCBvciBkaWdlc3RlZCBpZiB0aGUKKyAgICA8Y29kZT5kaWdlc3Q8L2NvZGU+IGF0dHJpYnV0ZSBpcyBzZXQpLjwvcD4KKyAgPC9hdHRyaWJ1dGU+CisgICAgCisgIDxhdHRyaWJ1dGUgbmFtZT0idXNlck5hbWVDb2wiIHJlcXVpcmVkPSJ0cnVlIj4KKyAgICA8cD5UaGUgbmFtZSBvZiB0aGUgY29sdW1uLCBpbiB0aGUgPGVtPnVzZXJzPC9lbT4gYW5kIDxlbT51c2VyIHJvbGVzPC9lbT4KKyAgICB0YWJsZXMsIHRoYXQgY29udGFpbnMgdGhlIHVzZXJuYW1lIG9mIHRoaXMgdXNlci48L3A+CisgIDwvYXR0cmlidXRlPgorCisgIDxhdHRyaWJ1dGUgbmFtZT0idXNlclJvbGVUYWJsZSIgcmVxdWlyZWQ9InRydWUiPgorICAgIDxwPlRoZSBuYW1lIG9mIHRoZSB0YWJsZSB0aGF0IGNvbnRhaW5zIG9uZSByb3cgZm9yIGVhY2ggPGVtPnJvbGU8L2VtPgorICAgIGFzc2lnbmVkIHRvIGEgcGFydGljdWxhciA8ZW0+dXNlcm5hbWU8L2VtPi4gIFRoaXMgdGFibGUgbXVzdCBpbmNsdWRlIGF0CisgICAgbGVhc3QgdGhlIGNvbHVtbnMgbmFtZWQgYnkgdGhlIDxjb2RlPnVzZXJOYW1lQ29sPC9jb2RlPiBhbmQKKyAgICA8Y29kZT5yb2xlTmFtZUNvbDwvY29kZT4gYXR0cmlidXRlcy48L3A+CisgIDwvYXR0cmlidXRlPgorCisgIDxhdHRyaWJ1dGUgbmFtZT0idXNlclRhYmxlIiByZXF1aXJlZD0idHJ1ZSI+CisgICAgPHA+VGhlIG5hbWUgb2YgdGhlIHRhYmxlIHRoYXQgY29udGFpbnMgb25lIHJvdyBmb3IgZWFjaCA8ZW0+dXNlcm5hbWU8L2VtPgorICAgIHRvIGJlIHJlY29nbml6ZWQgYnkgVG9tY2F0LiAgVGhpcyB0YWJsZSBtdXN0IGluY2x1ZGUgYXQgbGVhc3QgdGhlIGNvbHVtbnMKKyAgICBuYW1lZCBieSB0aGUgPGNvZGU+dXNlck5hbWVDb2w8L2NvZGU+IGFuZCA8Y29kZT51c2VyQ3JlZENvbDwvY29kZT4KKyAgICBhdHRyaWJ1dGVzLjwvcD4KKyAgPC9hdHRyaWJ1dGU+CisKKzwvYXR0cmlidXRlcz4KKworPGgzPkV4YW1wbGU8L2gzPgorCis8cD5BbiBleGFtcGxlIFNRTCBzY3JpcHQgdG8gY3JlYXRlIHRoZSBuZWVkZWQgdGFibGVzIG1pZ2h0IGxvb2sgc29tZXRoaW5nCitsaWtlIHRoaXMgKGFkYXB0IHRoZSBzeW50YXggYXMgcmVxdWlyZWQgZm9yIHlvdXIgcGFydGljdWxhciBkYXRhYmFzZSk6PC9wPgorPHNvdXJjZT4KK2NyZWF0ZSB0YWJsZSB1c2VycyAoCisgIHVzZXJfbmFtZSAgICAgICAgIHZhcmNoYXIoMTUpIG5vdCBudWxsIHByaW1hcnkga2V5LAorICB1c2VyX3Bhc3MgICAgICAgICB2YXJjaGFyKDE1KSBub3QgbnVsbAorKTsKKworY3JlYXRlIHRhYmxlIHVzZXJfcm9sZXMgKAorICB1c2VyX25hbWUgICAgICAgICB2YXJjaGFyKDE1KSBub3QgbnVsbCwKKyAgcm9sZV9uYW1lICAgICAgICAgdmFyY2hhcigxNSkgbm90IG51bGwsCisgIHByaW1hcnkga2V5ICh1c2VyX25hbWUsIHJvbGVfbmFtZSkKKyk7Cis8L3NvdXJjZT4KKworPHA+SGVyZSBpcyBhbiBleGFtcGxlIGZvciB1c2luZyBhIE15U1FMIGRhdGFiYXNlIGNhbGxlZCAiYXV0aG9yaXR5IiwgY29uZmlndXJlZAord2l0aCB0aGUgdGFibGVzIGRlc2NyaWJlZCBhYm92ZSwgYW5kIGFjY2Vzc2VkIHdpdGggdGhlIEpOREkgSkRCQyBEYXRhU291cmNlIHdpdGgKK25hbWUgImphdmE6L2NvbXAvZW52L2pkYmMvYXV0aG9yaXR5Ii48L3A+Cis8c291cmNlPgorJmx0O1JlYWxtIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5yZWFsbS5EYXRhU291cmNlUmVhbG0iIGRlYnVnPSI5OSIKKyAgIGRhdGFTb3VyY2VOYW1lPSJqZGJjL2F1dGhvcml0eSIKKyAgIHVzZXJUYWJsZT0idXNlcnMiIHVzZXJOYW1lQ29sPSJ1c2VyX25hbWUiIHVzZXJDcmVkQ29sPSJ1c2VyX3Bhc3MiCisgICB1c2VyUm9sZVRhYmxlPSJ1c2VyX3JvbGVzIiByb2xlTmFtZUNvbD0icm9sZV9uYW1lIi8mZ3Q7Cis8L3NvdXJjZT4KKworPGgzPkFkZGl0aW9uYWwgTm90ZXM8L2gzPgorCis8cD5EYXRhU291cmNlUmVhbG0gb3BlcmF0ZXMgYWNjb3JkaW5nIHRvIHRoZSBmb2xsb3dpbmcgcnVsZXM6PC9wPgorPHVsPgorPGxpPldoZW4gYSB1c2VyIGF0dGVtcHRzIHRvIGFjY2VzcyBhIHByb3RlY3RlZCByZXNvdXJjZSBmb3IgdGhlIGZpcnN0IHRpbWUsCisgICAgVG9tY2F0IDUgd2lsbCBjYWxsIHRoZSA8Y29kZT5hdXRoZW50aWNhdGUoKTwvY29kZT4gbWV0aG9kIG9mIHRoaXMKKyAgICA8Y29kZT5SZWFsbTwvY29kZT4uICBUaHVzLCBhbnkgY2hhbmdlcyB5b3UgaGF2ZSBtYWRlIHRvIHRoZSBkYXRhYmFzZQorICAgIGRpcmVjdGx5IChuZXcgdXNlcnMsIGNoYW5nZWQgcGFzc3dvcmRzIG9yIHJvbGVzLCBldGMuKSB3aWxsIGJlIGltbWVkaWF0ZWx5CisgICAgcmVmbGVjdGVkLjwvbGk+Cis8bGk+T25jZSBhIHVzZXIgaGFzIGJlZW4gYXV0aGVudGljYXRlZCwgdGhlIHVzZXIgKGFuZCBoaXMgb3IgaGVyIGFzc29jaWF0ZWQKKyAgICByb2xlcykgYXJlIGNhY2hlZCB3aXRoaW4gVG9tY2F0IGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIHVzZXIncyBsb2dpbi4KKyAgICAoRm9yIEZPUk0tYmFzZWQgYXV0aGVudGljYXRpb24sIHRoYXQgbWVhbnMgdW50aWwgdGhlIHNlc3Npb24gdGltZXMgb3V0IG9yCisgICAgaXMgaW52YWxpZGF0ZWQ7IGZvciBCQVNJQyBhdXRoZW50aWNhdGlvbiwgdGhhdCBtZWFucyB1bnRpbCB0aGUgdXNlcgorICAgIGNsb3NlcyB0aGVpciBicm93c2VyKS4gIFRoZSBjYWNoZWQgdXNlciBpcyA8c3Ryb25nPm5vdDwvc3Ryb25nPiBzYXZlZCBhbmQKKyAgICByZXN0b3JlZCBhY3Jvc3Mgc2Vzc2lvbnMgc2VyaWFsaXNhdGlvbnMuIEFueSBjaGFuZ2VzIHRvIHRoZSBkYXRhYmFzZQorICAgIGluZm9ybWF0aW9uIGZvciBhbiBhbHJlYWR5IGF1dGhlbnRpY2F0ZWQgdXNlciB3aWxsIDxzdHJvbmc+bm90PC9zdHJvbmc+IGJlCisgICAgcmVmbGVjdGVkIHVudGlsIHRoZSBuZXh0IHRpbWUgdGhhdCB1c2VyIGxvZ3Mgb24gYWdhaW4uPC9saT4KKzxsaT5BZG1pbmlzdGVyaW5nIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgPGVtPnVzZXJzPC9lbT4gYW5kIDxlbT51c2VyIHJvbGVzPC9lbT4KKyAgICB0YWJsZSBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgeW91ciBvd24gYXBwbGljYXRpb25zLiAgVG9tY2F0IGRvZXMgbm90CisgICAgcHJvdmlkZSBhbnkgYnVpbHQtaW4gY2FwYWJpbGl0aWVzIHRvIG1haW50YWluIHVzZXJzIGFuZCByb2xlcy48L2xpPgorPC91bD4KKworPC9zdWJzZWN0aW9uPgorCisKKzxzdWJzZWN0aW9uIG5hbWU9IkpORElSZWFsbSI+CisKKzxoMz5JbnRyb2R1Y3Rpb248L2gzPgorCis8cD48c3Ryb25nPkpORElSZWFsbTwvc3Ryb25nPiBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVG9tY2F0IDUKKzxjb2RlPlJlYWxtPC9jb2RlPiBpbnRlcmZhY2UgdGhhdCBsb29rcyB1cCB1c2VycyBpbiBhbiBMREFQIGRpcmVjdG9yeQorc2VydmVyIGFjY2Vzc2VkIGJ5IGEgSk5ESSBwcm92aWRlciAodHlwaWNhbGx5LCB0aGUgc3RhbmRhcmQgTERBUAorcHJvdmlkZXIgdGhhdCBpcyBhdmFpbGFibGUgd2l0aCB0aGUgSk5ESSBBUEkgY2xhc3NlcykuIFRoZSByZWFsbQorc3VwcG9ydHMgYSB2YXJpZXR5IG9mIGFwcHJvYWNoZXMgdG8gdXNpbmcgYSBkaXJlY3RvcnkgZm9yCithdXRoZW50aWNhdGlvbi48L3A+CisKKzxoND5Db25uZWN0aW5nIHRvIHRoZSBkaXJlY3Rvcnk8L2g0PgorCis8cD5UaGUgcmVhbG0ncyBjb25uZWN0aW9uIHRvIHRoZSBkaXJlY3RvcnkgaXMgZGVmaW5lZCBieSB0aGUKKzxzdHJvbmc+Y29ubmVjdGlvblVSTDwvc3Ryb25nPiBjb25maWd1cmF0aW9uIGF0dHJpYnV0ZS4gVGhpcyBpcyBhIFVSTAord2hvc2UgZm9ybWF0IGlzIGRlZmluZWQgYnkgdGhlIEpOREkgcHJvdmlkZXIuIEl0IGlzIHVzdWFsbHkgYW4gTERBUAorVVJMIHRoYXQgc3BlY2lmaWVzIHRoZSBkb21haW4gbmFtZSBvZiB0aGUgZGlyZWN0b3J5IHNlcnZlciB0byBjb25uZWN0Cit0bywgYW5kIG9wdGlvbmFsbHkgdGhlIHBvcnQgbnVtYmVyIGFuZCBkaXN0aW5ndWlzaGVkIG5hbWUgKEROKSBvZiB0aGUKK3JlcXVpcmVkIHJvb3QgbmFtaW5nIGNvbnRleHQuPC9wPgorCis8cD5JZiB5b3UgaGF2ZSBtb3JlIHRoYW4gb25lIHByb3ZpZGVyIHlvdSBjYW4gY29uZmlndXJlIGFuCis8c3Ryb25nPmFsdGVybmF0ZVVSTDwvc3Ryb25nPi4gIElmIGEgc29ja2V0IGNvbm5lY3Rpb24gY2FuIG5vdCBiZQorbWFkZSB0byB0aGUgcHJvdmlkZXIgYXQgdGhlIDxzdHJvbmc+Y29ubmVjdGlvblVSTDwvc3Ryb25nPiBhbgorYXR0ZW1wdCB3aWxsIGJlIG1hZGUgdG8gdXNlIHRoZSA8c3Ryb25nPmFsdGVybmF0ZVVSTDwvc3Ryb25nPi48L3A+CisKKzxwPldoZW4gbWFraW5nIGEgY29ubmVjdGlvbiBpbiBvcmRlciB0byBzZWFyY2ggdGhlIGRpcmVjdG9yeSBhbmQKK3JldHJpZXZlIHVzZXIgYW5kIHJvbGUgaW5mb3JtYXRpb24sIHRoZSByZWFsbSBhdXRoZW50aWNhdGVzIGl0c2VsZiB0bwordGhlIGRpcmVjdG9yeSB3aXRoIHRoZSB1c2VybmFtZSBhbmQgcGFzc3dvcmQgc3BlY2lmaWVkIGJ5IHRoZQorPHN0cm9uZz5jb25uZWN0aW9uTmFtZTwvc3Ryb25nPiBhbmQKKzxzdHJvbmc+Y29ubmVjdGlvblBhc3N3b3JkPC9zdHJvbmc+IHByb3BlcnRpZXMuIElmIHRoZXNlIHByb3BlcnRpZXMKK2FyZSBub3Qgc3BlY2lmaWVkIHRoZSBjb25uZWN0aW9uIGlzIGFub255bW91cy4gVGhpcyBpcyBzdWZmaWNpZW50IGluCittYW55IGNhc2VzLgorPC9wPgorCisKKzxoND5TZWxlY3RpbmcgdGhlIHVzZXIncyBkaXJlY3RvcnkgZW50cnk8L2g0PgorCis8cD5FYWNoIHVzZXIgdGhhdCBjYW4gYmUgYXV0aGVudGljYXRlZCBtdXN0IGJlIHJlcHJlc2VudGVkIGluIHRoZQorZGlyZWN0b3J5IGJ5IGFuIGluZGl2aWR1YWwgZW50cnkgdGhhdCBjb3JyZXNwb25kcyB0byBhbiBlbGVtZW50IGluIHRoZQoraW5pdGlhbCA8Y29kZT5EaXJDb250ZXh0PC9jb2RlPiBkZWZpbmVkIGJ5IHRoZQorPHN0cm9uZz5jb25uZWN0aW9uVVJMPC9zdHJvbmc+IGF0dHJpYnV0ZS4gVGhpcyB1c2VyIGVudHJ5IG11c3QgaGF2ZSBhbgorYXR0cmlidXRlIGNvbnRhaW5pbmcgdGhlIHVzZXJuYW1lIHRoYXQgaXMgcHJlc2VudGVkIGZvcgorYXV0aGVudGljYXRpb24uPC9wPgorCis8cD5PZnRlbiB0aGUgZGlzdGluZ3Vpc2hlZCBuYW1lIG9mIHRoZSB1c2VyJ3MgZW50cnkgY29udGFpbnMgdGhlCit1c2VybmFtZSBwcmVzZW50ZWQgZm9yIGF1dGhlbnRpY2F0aW9uIGJ1dCBpcyBvdGhlcndpc2UgdGhlIHNhbWUgZm9yCithbGwgdXNlcnMuIEluIHRoaXMgY2FzZSB0aGUgPHN0cm9uZz51c2VyUGF0dGVybjwvc3Ryb25nPiBhdHRyaWJ1dGUgbWF5CitiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIEROLCB3aXRoICJ7MH0iIG1hcmtpbmcgd2hlcmUKK3RoZSB1c2VybmFtZSBzaG91bGQgYmUgc3Vic3RpdHV0ZWQuPC9wPgorCis8cD5PdGhlcndpc2UgdGhlIHJlYWxtIG11c3Qgc2VhcmNoIHRoZSBkaXJlY3RvcnkgdG8gZmluZCBhIHVuaXF1ZSBlbnRyeQorY29udGFpbmluZyB0aGUgdXNlcm5hbWUuIFRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBjb25maWd1cmUgdGhpcworc2VhcmNoOgorCisgICAgIDx1bD4KKyAgICAgPGxpPjxzdHJvbmc+dXNlckJhc2U8L3N0cm9uZz4gLSB0aGUgZW50cnkgdGhhdCBpcyB0aGUgYmFzZSBvZgorICAgICAgICAgdGhlIHN1YnRyZWUgY29udGFpbmluZyB1c2Vycy4gIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBzZWFyY2gKKyAgICAgICAgIGJhc2UgaXMgdGhlIHRvcC1sZXZlbCBjb250ZXh0LjwvbGk+CisKKyAgICAgPGxpPjxzdHJvbmc+dXNlclN1YnRyZWU8L3N0cm9uZz4gLSB0aGUgc2VhcmNoIHNjb3BlLiBTZXQgdG8KKyAgICAgICAgIDxjb2RlPnRydWU8L2NvZGU+IGlmIHlvdSB3aXNoIHRvIHNlYXJjaCB0aGUgZW50aXJlIHN1YnRyZWUKKyAgICAgICAgIHJvb3RlZCBhdCB0aGUgPHN0cm9uZz51c2VyQmFzZTwvc3Ryb25nPiBlbnRyeS4gVGhlIGRlZmF1bHQgdmFsdWUKKyAgICAgICAgIG9mIDxjb2RlPmZhbHNlPC9jb2RlPiByZXF1ZXN0cyBhIHNpbmdsZS1sZXZlbCBzZWFyY2gKKyAgICAgICAgIGluY2x1ZGluZyBvbmx5IHRoZSB0b3AgbGV2ZWwuPC9saT4KKworICAgICA8bGk+PHN0cm9uZz51c2VyU2VhcmNoPC9zdHJvbmc+IC0gcGF0dGVybiBzcGVjaWZ5aW5nIHRoZSBMREFQCisgICAgICAgICBzZWFyY2ggZmlsdGVyIHRvIHVzZSBhZnRlciBzdWJzdGl0dXRpb24gb2YgdGhlIHVzZXJuYW1lLjwvbGk+CisKKyAgICA8L3VsPgorPC9wPgorCisKKzxoND5BdXRoZW50aWNhdGluZyB0aGUgdXNlcjwvaDQ+CisKKzx1bD4KKzxsaT4KKzxwPjxiPkJpbmQgbW9kZTwvYj48L3A+CisKKzxwPkJ5IGRlZmF1bHQgdGhlIHJlYWxtIGF1dGhlbnRpY2F0ZXMgYSB1c2VyIGJ5IGJpbmRpbmcgdG8KK3RoZSBkaXJlY3Rvcnkgd2l0aCB0aGUgRE4gb2YgdGhlIGVudHJ5IGZvciB0aGF0IHVzZXIgYW5kIHRoZSBwYXNzd29yZAorcHJlc2VudGVkIGJ5IHRoZSB1c2VyLiBJZiB0aGlzIHNpbXBsZSBiaW5kIHN1Y2NlZWRzIHRoZSB1c2VyIGlzIGNvbnNpZGVyZWQgdG8KK2JlIGF1dGhlbnRpY2F0ZWQuPC9wPgorCis8cD5Gb3Igc2VjdXJpdHkgcmVhc29ucyBhIGRpcmVjdG9yeSBtYXkgc3RvcmUgYSBkaWdlc3Qgb2YgdGhlIHVzZXIncworcGFzc3dvcmQgcmF0aGVyIHRoYW4gdGhlIGNsZWFyIHRleHQgdmVyc2lvbiAoc2VlIDxhIGhyZWY9IiNEaWdlc3RlZAorUGFzc3dvcmRzIj5EaWdlc3RlZCBQYXNzd29yZHM8L2E+IGZvciBtb3JlIGluZm9ybWF0aW9uKS4gSW4gdGhhdCBjYXNlLAorYXMgcGFydCBvZiB0aGUgc2ltcGxlIGJpbmQgb3BlcmF0aW9uIHRoZSBkaXJlY3RvcnkgYXV0b21hdGljYWxseQorY29tcHV0ZXMgdGhlIGNvcnJlY3QgZGlnZXN0IG9mIHRoZSBwbGFpbnRleHQgcGFzc3dvcmQgcHJlc2VudGVkIGJ5IHRoZQordXNlciBiZWZvcmUgdmFsaWRhdGluZyBpdCBhZ2FpbnN0IHRoZSBzdG9yZWQgdmFsdWUuIEluIGJpbmQgbW9kZSwKK3RoZXJlZm9yZSwgdGhlIHJlYWxtIGlzIG5vdCBpbnZvbHZlZCBpbiBkaWdlc3QgcHJvY2Vzc2luZy4gVGhlCis8c3Ryb25nPmRpZ2VzdDwvc3Ryb25nPiBhdHRyaWJ1dGUgaXMgbm90IHVzZWQsIGFuZCB3aWxsIGJlIGlnbm9yZWQgaWYKK3NldC48L3A+Cis8L2xpPgorCis8bGk+Cis8cD48Yj5Db21wYXJpc29uIG1vZGU8L2I+PC9wPgorPHA+QWx0ZXJuYXRpdmVseSwgdGhlIHJlYWxtIG1heSByZXRyaWV2ZSB0aGUgc3RvcmVkCitwYXNzd29yZCBmcm9tIHRoZSBkaXJlY3RvcnkgYW5kIGNvbXBhcmUgaXQgZXhwbGljaXRseSB3aXRoIHRoZSB2YWx1ZQorcHJlc2VudGVkIGJ5IHRoZSB1c2VyLiBUaGlzIG1vZGUgaXMgY29uZmlndXJlZCBieSBzZXR0aW5nIHRoZQorPHN0cm9uZz51c2VyUGFzc3dvcmQ8L3N0cm9uZz4gYXR0cmlidXRlIHRvIHRoZSBuYW1lIG9mIGEgZGlyZWN0b3J5CithdHRyaWJ1dGUgaW4gdGhlIHVzZXIncyBlbnRyeSB0aGF0IGNvbnRhaW5zIHRoZSBwYXNzd29yZC48L3A+CisKKzxwPkNvbXBhcmlzb24gbW9kZSBoYXMgc29tZSBkaXNhZHZhbnRhZ2VzLiBGaXJzdCwgdGhlCis8c3Ryb25nPmNvbm5lY3Rpb25OYW1lPC9zdHJvbmc+IGFuZAorPHN0cm9uZz5jb25uZWN0aW9uUGFzc3dvcmQ8L3N0cm9uZz4gYXR0cmlidXRlcyBtdXN0IGJlIGNvbmZpZ3VyZWQgdG8KK2FsbG93IHRoZSByZWFsbSB0byByZWFkIHVzZXJzJyBwYXNzd29yZHMgaW4gdGhlIGRpcmVjdG9yeS4gRm9yCitzZWN1cml0eSByZWFzb25zIHRoaXMgaXMgZ2VuZXJhbGx5IHVuZGVzaXJhYmxlOyBpbmRlZWQgbWFueSBkaXJlY3RvcnkKK2ltcGxlbWVudGF0aW9ucyB3aWxsIG5vdCBhbGxvdyBldmVuIHRoZSBkaXJlY3RvcnkgbWFuYWdlciB0byByZWFkCit0aGVzZSBwYXNzd29yZHMuIEluIGFkZGl0aW9uLCB0aGUgcmVhbG0gbXVzdCBoYW5kbGUgcGFzc3dvcmQgZGlnZXN0cworaXRzZWxmLCBpbmNsdWRpbmcgdmFyaWF0aW9ucyBpbiB0aGUgYWxnb3JpdGhtcyB1c2VkIGFuZCB3YXlzIG9mCityZXByZXNlbnRpbmcgcGFzc3dvcmQgaGFzaGVzIGluIHRoZSBkaXJlY3RvcnkuIEhvd2V2ZXIsIHRoZSByZWFsbSBtYXkKK3NvbWV0aW1lcyBuZWVkIGFjY2VzcyB0byB0aGUgc3RvcmVkIHBhc3N3b3JkLCBmb3IgZXhhbXBsZSB0byBzdXBwb3J0CitIVFRQIERpZ2VzdCBBY2Nlc3MgQXV0aGVudGljYXRpb24gKFJGQyAyMDY5KS4gKE5vdGUgdGhhdCBIVFRQIGRpZ2VzdAorYXV0aGVudGljYXRpb24gaXMgZGlmZmVyZW50IGZyb20gdGhlIHN0b3JhZ2Ugb2YgcGFzc3dvcmQgZGlnZXN0cyBpbgordGhlIHJlcG9zaXRvcnkgZm9yIHVzZXIgaW5mb3JtYXRpb24gYXMgZGlzY3Vzc2VkIGFib3ZlKS4KKzwvcD4KKzwvbGk+Cis8L3VsPgorCis8aDQ+QXNzaWduaW5nIHJvbGVzIHRvIHRoZSB1c2VyPC9oND4KKworPHA+VGhlIGRpcmVjdG9yeSByZWFsbSBzdXBwb3J0cyB0d28gYXBwcm9hY2hlcyB0byB0aGUgcmVwcmVzZW50YXRpb24KK29mIHJvbGVzIGluIHRoZSBkaXJlY3Rvcnk6PC9wPgorCis8dWw+Cis8bGk+Cis8cD48Yj5Sb2xlcyBhcyBleHBsaWNpdCBkaXJlY3RvcnkgZW50cmllczwvYj48L3A+CisKKzxwPlJvbGVzIG1heSBiZSByZXByZXNlbnRlZCBieSBleHBsaWNpdCBkaXJlY3RvcnkgZW50cmllcy4gQSByb2xlCitlbnRyeSBpcyB1c3VhbGx5IGFuIExEQVAgZ3JvdXAgZW50cnkgd2l0aCBvbmUgYXR0cmlidXRlCitjb250YWluaW5nIHRoZSBuYW1lIG9mIHRoZSByb2xlIGFuZCBhbm90aGVyIHdob3NlIHZhbHVlcyBhcmUgdGhlCitkaXN0aW5ndWlzaGVkIG5hbWVzIG9yIHVzZXJuYW1lcyBvZiB0aGUgdXNlcnMgaW4gdGhhdCByb2xlLiAgVGhlCitmb2xsb3dpbmcgYXR0cmlidXRlcyBjb25maWd1cmUgYSBkaXJlY3Rvcnkgc2VhcmNoIHRvCitmaW5kIHRoZSBuYW1lcyBvZiByb2xlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGF1dGhlbnRpY2F0ZWQgdXNlcjo8L3A+CisKKzx1bD4KKzxsaT48c3Ryb25nPnJvbGVCYXNlPC9zdHJvbmc+IC0gdGhlIGJhc2UgZW50cnkgZm9yIHRoZSByb2xlIHNlYXJjaC4KKyAgICBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgc2VhcmNoIGJhc2UgaXMgdGhlIHRvcC1sZXZlbCBkaXJlY3RvcnkKKyAgICBjb250ZXh0LjwvbGk+CisKKzxsaT48c3Ryb25nPnJvbGVTdWJ0cmVlPC9zdHJvbmc+IC0gdGhlIHNlYXJjaAorICAgIHNjb3BlLiBTZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgeW91IHdpc2ggdG8gc2VhcmNoIHRoZSBlbnRpcmUKKyAgICBzdWJ0cmVlIHJvb3RlZCBhdCB0aGUgPGNvZGU+cm9sZUJhc2U8L2NvZGU+IGVudHJ5LiBUaGUgZGVmYXVsdAorICAgIHZhbHVlIG9mIDxjb2RlPmZhbHNlPC9jb2RlPiByZXF1ZXN0cyBhIHNpbmdsZS1sZXZlbCBzZWFyY2gKKyAgICBpbmNsdWRpbmcgdGhlIHRvcCBsZXZlbCBvbmx5LjwvbGk+CisKKzxsaT48c3Ryb25nPnJvbGVTZWFyY2g8L3N0cm9uZz4gLSB0aGUgTERBUCBzZWFyY2ggZmlsdGVyIGZvcgorICAgIHNlbGVjdGluZyByb2xlIGVudHJpZXMuIEl0IG9wdGlvbmFsbHkgaW5jbHVkZXMgcGF0dGVybgorICAgIHJlcGxhY2VtZW50cyAiezB9IiBmb3IgdGhlIGRpc3Rpbmd1aXNoZWQgbmFtZSBhbmQvb3IgInsxfSIgZm9yIHRoZQorICAgIHVzZXJuYW1lIG9mIHRoZSBhdXRoZW50aWNhdGVkIHVzZXIuPC9saT4KKworPGxpPjxzdHJvbmc+cm9sZU5hbWU8L3N0cm9uZz4gLSB0aGUgYXR0cmlidXRlIGluIGEgcm9sZSBlbnRyeQorICAgICBjb250YWluaW5nIHRoZSBuYW1lIG9mIHRoYXQgcm9sZS48L2xpPgorCis8L3VsPgorCis8L2xpPgorPC91bD4KKworPHVsPgorPGxpPgorPHA+PGI+Um9sZXMgYXMgYW4gYXR0cmlidXRlIG9mIHRoZSB1c2VyIGVudHJ5PC9iPjwvcD4KKworPHA+Um9sZSBuYW1lcyBtYXkgYWxzbyBiZSBoZWxkIGFzIHRoZSB2YWx1ZXMgb2YgYW4gYXR0cmlidXRlIGluIHRoZQordXNlcidzIGRpcmVjdG9yeSBlbnRyeS4gVXNlIDxzdHJvbmc+dXNlclJvbGVOYW1lPC9zdHJvbmc+IHRvIHNwZWNpZnkKK3RoZSBuYW1lIG9mIHRoaXMgYXR0cmlidXRlLjwvcD4KKworPC9saT4KKzwvdWw+Cis8cD5BIGNvbWJpbmF0aW9uIG9mIGJvdGggYXBwcm9hY2hlcyB0byByb2xlIHJlcHJlc2VudGF0aW9uIG1heSBiZSB1c2VkLjwvcD4KKworPGgzPlF1aWNrIFN0YXJ0PC9oMz4KKworPHA+VG8gc2V0IHVwIFRvbWNhdCB0byB1c2UgSk5ESVJlYWxtLCB5b3Ugd2lsbCBuZWVkIHRvIGZvbGxvdyB0aGVzZSBzdGVwczo8L3A+Cis8b2w+Cis8bGk+TWFrZSBzdXJlIHlvdXIgZGlyZWN0b3J5IHNlcnZlciBpcyBjb25maWd1cmVkIHdpdGggYSBzY2hlbWEgdGhhdCBtYXRjaGVzCisgICAgdGhlIHJlcXVpcmVtZW50cyBsaXN0ZWQgYWJvdmUuPC9saT4KKzxsaT5JZiByZXF1aXJlZCwgY29uZmlndXJlIGEgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIGZvciB1c2UgYnkgVG9tY2F0LCB0aGF0IGhhcworICAgIHJlYWQgb25seSBhY2Nlc3MgdG8gdGhlIGluZm9ybWF0aW9uIGRlc2NyaWJlZCBhYm92ZS4gIChUb21jYXQgd2lsbAorICAgIG5ldmVyIGF0dGVtcHQgdG8gbW9kaWZ5IHRoaXMgaW5mb3JtYXRpb24uKTwvbGk+Cis8bGk+UGxhY2UgYSBjb3B5IG9mIHRoZSBKTkRJIGRyaXZlciB5b3Ugd2lsbCBiZSB1c2luZyAodHlwaWNhbGx5CisgICAgPGNvZGU+bGRhcC5qYXI8L2NvZGU+IGF2YWlsYWJsZSB3aXRoIEpOREkpIGluc2lkZSB0aGUKKyAgICA8Y29kZT4kQ0FUQUxJTkFfSE9NRS9zZXJ2ZXIvbGliPC9jb2RlPiBkaXJlY3RvcnkgKGlmIHlvdSBkbyBub3QgbmVlZCBpdAorICAgIHZpc2libGUgdG8gd2ViIGFwcGxpY2F0aW9ucykgb3IgPGNvZGU+JENBVEFMSU5BX0hPTUUvY29tbW9uL2xpYjwvY29kZT4KKyAgICAoaWYgaXQgd2lsbCBiZSB1c2VkIGJvdGggYnkgVG9tY2F0IDUgPGVtPmFuZDwvZW0+IGJ5IHlvdXIgYXBwcykuPC9saT4KKzxsaT5TZXQgdXAgYSA8Y29kZT4mbHQ7UmVhbG0mZ3Q7PC9jb2RlPiBlbGVtZW50LCBhcyBkZXNjcmliZWQgYmVsb3csIGluIHlvdXIKKyAgICA8Y29kZT4kQ0FUQUxJTkFfSE9NRS9jb25mL3NlcnZlci54bWw8L2NvZGU+IGZpbGUuPC9saT4KKzxsaT5SZXN0YXJ0IFRvbWNhdCA1IGlmIGl0IGlzIGFscmVhZHkgcnVubmluZy48L2xpPgorPC9vbD4KKworPGgzPlJlYWxtIEVsZW1lbnQgQXR0cmlidXRlczwvaDM+CisKKzxwPlRvIGNvbmZpZ3VyZSBKTkRJUmVhbG0sIHlvdSB3aWxsIGNyZWF0ZSBhIDxjb2RlPiZsdDtSZWFsbSZndDs8L2NvZGU+CitlbGVtZW50IGFuZCBuZXN0IGl0IGluIHlvdXIgPGNvZGU+JENBVEFMSU5BX0hPTUUvY29uZi9zZXJ2ZXIueG1sPC9jb2RlPiBmaWxlLAorYXMgZGVzY3JpYmVkIDxhIGhyZWY9IiNDb25maWd1cmluZyBhIFJlYWxtIj5hYm92ZTwvYT4uICBUaGUgZm9sbG93aW5nCithdHRyaWJ1dGVzIGFyZSBzdXBwb3J0ZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvbjo8L3A+CisKKzxhdHRyaWJ1dGVzPgorICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzTmFtZSIgcmVxdWlyZWQ9InRydWUiPgorICAgIDxwPlRoZSBmdWxseSBxdWFsaWZpZWQgSmF2YSBjbGFzcyBuYW1lIG9mIHRoaXMgUmVhbG0gaW1wbGVtZW50YXRpb24uCisgICAgWW91IDxzdHJvbmc+TVVTVDwvc3Ryb25nPiBzcGVjaWZ5IHRoZSB2YWx1ZQorICAgICI8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLnJlYWxtLkpORElSZWFsbTwvY29kZT4iIGhlcmUuPC9wPgorICA8L2F0dHJpYnV0ZT4KKworCisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNvbm5lY3Rpb25OYW1lIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgICA8cD5UaGUgZGlyZWN0b3J5IHVzZXJuYW1lIHRvIHVzZSB3aGVuIGVzdGFibGlzaGluZyBhCisgICAgICAgIGNvbm5lY3Rpb24gdG8gdGhlIGRpcmVjdG9yeSBmb3IgTERBUCBzZWFyY2ggb3BlcmF0aW9ucy4gSWYgbm90CisgICAgICAgIHNwZWNpZmllZCBhbiBhbm9ueW1vdXMgY29ubmVjdGlvbiBpcyBtYWRlLCB3aGljaCBpcyBvZnRlbgorICAgICAgICBzdWZmaWNpZW50IHVubGVzcyB5b3Ugc3BlY2lmeSB0aGUgPGNvZGU+dXNlclBhc3N3b3JkPC9jb2RlPgorICAgICAgICBwcm9wZXJ0eS48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb25uZWN0aW9uUGFzc3dvcmQiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPlRoZSBkaXJlY3RvcnkgcGFzc3dvcmQgdG8gdXNlIHdoZW4gZXN0YWJsaXNoaW5nIGEKKyAgICAgICAgY29ubmVjdGlvbiB0byB0aGUgZGlyZWN0b3J5IGZvciBMREFQIHNlYXJjaCBvcGVyYXRpb25zLiBJZiBub3QKKyAgICAgICAgc3BlY2lmaWVkIGFuIGFub255bW91cyBjb25uZWN0aW9uIGlzIG1hZGUsIHdoaWNoIGlzIG9mdGVuCisgICAgICAgIHN1ZmZpY2llbnQgdW5sZXNzIHlvdSBzcGVjaWZ5IHRoZSA8Y29kZT51c2VyUGFzc3dvcmQ8L2NvZGU+CisgICAgICAgIHByb3BlcnR5LjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNvbm5lY3Rpb25VUkwiIHJlcXVpcmVkPSJ0cnVlIj4KKyAgICAgICAgPHA+VGhlIGNvbm5lY3Rpb24gVVJMIHRvIGJlIHBhc3NlZCB0byB0aGUgSk5ESSBkcml2ZXIgd2hlbgorICAgICAgICBlc3RhYmxpc2hpbmcgYSBjb25uZWN0aW9uIHRvIHRoZSBkaXJlY3RvcnkuPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29udGV4dEZhY3RvcnkiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPlRoZSBmdWxseSBxdWFsaWZpZWQgSmF2YSBjbGFzcyBuYW1lIG9mIHRoZSBKTkRJIGNvbnRleHQKKyAgICAgICAgZmFjdG9yeSB0byBiZSB1c2VkIGZvciB0aGlzIGNvbm5lY3Rpb24uICBCeSBkZWZhdWx0LCB0aGUgc3RhbmRhcmQKKyAgICAgICAgSk5ESSBMREFQIHByb3ZpZGVyIGlzIHVzZWQKKyAgICAgICAgKDxjb2RlPmNvbS5zdW4uam5kaS5sZGFwLkxkYXBDdHhGYWN0b3J5PC9jb2RlPikuPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGlnZXN0IiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgICA8cD5UaGUgZGlnZXN0IGFsZ29yaXRobSB0byBhcHBseSB0byB0aGUgcGxhaW50ZXh0IHBhc3N3b3JkIG9mZmVyZWQKKyAgICAgICAgYnkgdGhlIHVzZXIgYmVmb3JlIGNvbXBhcmluZyBpdCB3aXRoIHRoZSB2YWx1ZSByZXRyaWV2ZWQgZnJvbSB0aGUKKyAgICAgICAgZGlyZWN0b3J5LiAgVmFsaWQgdmFsdWVzIGFyZSB0aG9zZSBhY2NlcHRlZCBmb3IgdGhlIGFsZ29yaXRobSBuYW1lCisgICAgICAgIGJ5IHRoZSA8Y29kZT5qYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3Q8L2NvZGU+IGNsYXNzLiAgU2VlIDxhCisgICAgICAgIGhyZWY9IiNEaWdlc3RlZCBQYXNzd29yZHMiPkRpZ2VzdGVkIFBhc3N3b3JkczwvYT4gZm9yIG1vcmUKKyAgICAgICAgaW5mb3JtYXRpb24uIElmIG5vdCBzcGVjaWZpZWQgdGhlIHBsYWludGV4dCBwYXNzd29yZCBpcyBhc3N1bWVkIHRvCisgICAgICAgIGJlIHJldHJpZXZlZC4gTm90IHJlcXVpcmVkIHVubGVzcyA8Y29kZT51c2VyUGFzc3dvcmQ8L2NvZGU+IGlzCisgICAgICAgIHNwZWNpZmllZDwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9InJvbGVCYXNlIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgICA8cD5UaGUgYmFzZSBkaXJlY3RvcnkgZW50cnkgZm9yIHBlcmZvcm1pbmcgcm9sZSBzZWFyY2hlcy4gSWYKKyAgICAgICAgbm90IHNwZWNpZmllZCwgdGhlIHRvcCBsZXZlbCBlbGVtZW50IGluIHRoZSBkaXJlY3RvcnkgY29udGV4dAorICAgICAgICB3aWxsIGJlIHVzZWQuPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icm9sZU5hbWUiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPlRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdGhhdCBjb250YWlucyByb2xlIG5hbWVzIGluIHRoZQorICAgICAgICBkaXJlY3RvcnkgZW50cmllcyBmb3VuZCBieSBhIHJvbGUgc2VhcmNoLiBJbiBhZGRpdGlvbiB5b3UgY2FuCisgICAgICAgIHVzZSB0aGUgPGNvZGU+dXNlclJvbGVOYW1lPC9jb2RlPiBwcm9wZXJ0eSB0byBzcGVjaWZ5IHRoZSBuYW1lCisgICAgICAgIG9mIGFuIGF0dHJpYnV0ZSwgaW4gdGhlIHVzZXIncyBlbnRyeSwgY29udGFpbmluZyBhZGRpdGlvbmFsCisgICAgICAgIHJvbGUgbmFtZXMuICBJZiA8Y29kZT5yb2xlTmFtZTwvY29kZT4gaXMgbm90IHNwZWNpZmllZCBhIHJvbGUKKyAgICAgICAgc2VhcmNoIGRvZXMgbm90IHRha2UgcGxhY2UsIGFuZCByb2xlcyBhcmUgdGFrZW4gb25seSBmcm9tIHRoZQorICAgICAgICB1c2VyJ3MgZW50cnkuPC9wPgorICAgICAgPC9hdHRyaWJ1dGU+CisKKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icm9sZVNlYXJjaCIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+VGhlIExEQVAgZmlsdGVyIGV4cHJlc3Npb24gdXNlZCBmb3IgcGVyZm9ybWluZyByb2xlCisgICAgICAgIHNlYXJjaGVzLCBmb2xsb3dpbmcgdGhlIHN5bnRheCBzdXBwb3J0ZWQgYnkgdGhlCisgICAgICAgIDxjb2RlPmphdmEudGV4dC5NZXNzYWdlRm9ybWF0PC9jb2RlPiBjbGFzcy4gIFVzZQorICAgICAgICA8Y29kZT57MH08L2NvZGU+IHRvIHN1YnN0aXR1dGUgdGhlIGRpc3Rpbmd1aXNoZWQgbmFtZSAoRE4pIG9mCisgICAgICAgIHRoZSB1c2VyLCBhbmQvb3IgPGNvZGU+ezF9PC9jb2RlPiB0byBzdWJzdGl0dXRlIHRoZQorICAgICAgICB1c2VybmFtZS4gSWYgbm90IHNwZWNpZmllZCBhIHJvbGUgc2VhcmNoIGRvZXMgbm90IHRha2UgcGxhY2UKKyAgICAgICAgYW5kIHJvbGVzIGFyZSB0YWtlbiBvbmx5IGZyb20gdGhlIGF0dHJpYnV0ZSBpbiB0aGUgdXNlcidzCisgICAgICAgIGVudHJ5IHNwZWNpZmllZCBieSB0aGUgPGNvZGU+dXNlclJvbGVOYW1lPC9jb2RlPiBwcm9wZXJ0eS48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJyb2xlU3VidHJlZSIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+U2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+IGlmIHlvdSB3YW50IHRvIHNlYXJjaCB0aGUgZW50aXJlCisgICAgICAgIHN1YnRyZWUgb2YgdGhlIGVsZW1lbnQgc3BlY2lmaWVkIGJ5IHRoZSA8Y29kZT5yb2xlQmFzZTwvY29kZT4KKyAgICAgICAgcHJvcGVydHkgZm9yIHJvbGUgZW50cmllcyBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIuIFRoZQorICAgICAgICBkZWZhdWx0IHZhbHVlIG9mIDxjb2RlPmZhbHNlPC9jb2RlPiBjYXVzZXMgb25seSB0aGUgdG9wIGxldmVsCisgICAgICAgIHRvIGJlIHNlYXJjaGVkLjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9InVzZXJCYXNlIiByZXF1aXJlZD0iZmFsc2UiPgorICAgICAgICA8cD5UaGUgYmFzZSBlbGVtZW50IGZvciB1c2VyIHNlYXJjaGVzIHBlcmZvcm1lZCB1c2luZyB0aGUKKyAgICAgICAgPGNvZGU+dXNlclNlYXJjaDwvY29kZT4gZXhwcmVzc2lvbi4gIElmIG5vdCBzcGVjaWZpZWQsIHRoZSB0b3AKKyAgICAgICAgbGV2ZWwgZWxlbWVudCBpbiB0aGUgZGlyZWN0b3J5IGNvbnRleHQgd2lsbCBiZSB1c2VkLiBOb3QgdXNlZAorICAgICAgICBpZiB5b3UgYXJlIHVzaW5nIHRoZSA8Y29kZT51c2VyUGF0dGVybjwvY29kZT4gZXhwcmVzc2lvbi48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ1c2VyUGFzc3dvcmQiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPk5hbWUgb2YgdGhlIGF0dHJpYnV0ZSBpbiB0aGUgdXNlcidzIGVudHJ5IGNvbnRhaW5pbmcgdGhlCisgICAgICAgIHVzZXIncyBwYXNzd29yZC4gIElmIHlvdSBzcGVjaWZ5IHRoaXMgdmFsdWUsIEpORElSZWFsbSB3aWxsCisgICAgICAgIGJpbmQgdG8gdGhlIGRpcmVjdG9yeSB1c2luZyB0aGUgdmFsdWVzIHNwZWNpZmllZCBieQorICAgICAgICA8Y29kZT5jb25uZWN0aW9uTmFtZTwvY29kZT4gYW5kCisgICAgICAgIDxjb2RlPmNvbm5lY3Rpb25QYXNzd29yZDwvY29kZT4gcHJvcGVydGllcywgYW5kIHJldHJpZXZlIHRoZQorICAgICAgICBjb3JyZXNwb25kaW5nIGF0dHJpYnV0ZSBmb3IgY29tcGFyaXNvbiB0byB0aGUgdmFsdWUgc3BlY2lmaWVkCisgICAgICAgIGJ5IHRoZSB1c2VyIGJlaW5nIGF1dGhlbnRpY2F0ZWQuICBJZiB0aGUgPGNvZGU+ZGlnZXN0PC9jb2RlPgorICAgICAgICBhdHRyaWJ1dGUgaXMgc2V0LCB0aGUgc3BlY2lmaWVkIGRpZ2VzdCBhbGdvcml0aG0gaXMgYXBwbGllZCB0bworICAgICAgICB0aGUgcGFzc3dvcmQgb2ZmZXJlZCBieSB0aGUgdXNlciBiZWZvcmUgY29tcGFyaW5nIGl0IHdpdGggdGhlCisgICAgICAgIHZhbHVlIHJldHJpZXZlZCBmcm9tIHRoZSBkaXJlY3RvcnkuICBJZiB5b3UgZG8KKyAgICAgICAgPHN0cm9uZz5ub3Q8L3N0cm9uZz4gc3BlY2lmeSB0aGlzIHZhbHVlLCBKTkRJUmVhbG0gd2lsbAorICAgICAgICBhdHRlbXB0IGEgc2ltcGxlIGJpbmQgdG8gdGhlIGRpcmVjdG9yeSB1c2luZyB0aGUgRE4gb2YgdGhlCisgICAgICAgIHVzZXIncyBlbnRyeSBhbmQgcGFzc3dvcmQgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLCB3aXRoIGEKKyAgICAgICAgc3VjY2Vzc2Z1bCBiaW5kIGJlaW5nIGludGVycHJldGVkIGFzIGFuIGF1dGhlbnRpY2F0ZWQKKyAgICAgICAgdXNlci48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ1c2VyUGF0dGVybiIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+QSBwYXR0ZXJuIGZvciB0aGUgZGlzdGluZ3Vpc2hlZCBuYW1lIChETikgb2YgdGhlIHVzZXIncworICAgICAgICBkaXJlY3RvcnkgZW50cnksIGZvbGxvd2luZyB0aGUgc3ludGF4IHN1cHBvcnRlZCBieSB0aGUKKyAgICAgICAgPGNvZGU+amF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ8L2NvZGU+IGNsYXNzIHdpdGgKKyAgICAgICAgPGNvZGU+ezB9PC9jb2RlPiBtYXJraW5nIHdoZXJlIHRoZSBhY3R1YWwgdXNlcm5hbWUgc2hvdWxkIGJlCisgICAgICAgIGluc2VydGVkLiBZb3UgY2FuIHVzZSB0aGlzIHByb3BlcnR5IGluc3RlYWQgb2YKKyAgICAgICAgPGNvZGU+dXNlclNlYXJjaDwvY29kZT4sIDxjb2RlPnVzZXJTdWJ0cmVlPC9jb2RlPiBhbmQKKyAgICAgICAgPGNvZGU+dXNlckJhc2U8L2NvZGU+IHdoZW4gdGhlIGRpc3Rpbmd1aXNoZWQgbmFtZSBjb250YWlucyB0aGUKKyAgICAgICAgdXNlcm5hbWUgYW5kIGlzIG90aGVyd2lzZSB0aGUgc2FtZSBmb3IgYWxsIHVzZXJzLjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9InVzZXJSb2xlTmFtZSIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+VGhlIG5hbWUgb2YgYW4gYXR0cmlidXRlIGluIHRoZSB1c2VyJ3MgZGlyZWN0b3J5IGVudHJ5CisgICAgICAgIGNvbnRhaW5pbmcgemVybyBvciBtb3JlIHZhbHVlcyBmb3IgdGhlIG5hbWVzIG9mIHJvbGVzIGFzc2lnbmVkCisgICAgICAgIHRvIHRoaXMgdXNlci4gIEluIGFkZGl0aW9uIHlvdSBjYW4gdXNlIHRoZQorICAgICAgICA8Y29kZT5yb2xlTmFtZTwvY29kZT4gcHJvcGVydHkgdG8gc3BlY2lmeSB0aGUgbmFtZSBvZiBhbgorICAgICAgICBhdHRyaWJ1dGUgdG8gYmUgcmV0cmlldmVkIGZyb20gaW5kaXZpZHVhbCByb2xlIGVudHJpZXMgZm91bmQKKyAgICAgICAgYnkgc2VhcmNoaW5nIHRoZSBkaXJlY3RvcnkuIElmIDxjb2RlPnVzZXJSb2xlTmFtZTwvY29kZT4gaXMKKyAgICAgICAgbm90IHNwZWNpZmllZCBhbGwgdGhlIHJvbGVzIGZvciBhIHVzZXIgZGVyaXZlIGZyb20gdGhlIHJvbGUKKyAgICAgICAgc2VhcmNoLjwvcD4KKyAgICAgIDwvYXR0cmlidXRlPgorCisgICAgICA8YXR0cmlidXRlIG5hbWU9InVzZXJTZWFyY2giIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgICAgIDxwPlRoZSBMREFQIGZpbHRlciBleHByZXNzaW9uIHRvIHVzZSB3aGVuIHNlYXJjaGluZyBmb3IgYQorICAgICAgICB1c2VyJ3MgZGlyZWN0b3J5IGVudHJ5LCB3aXRoIDxjb2RlPnswfTwvY29kZT4gbWFya2luZyB3aGVyZQorICAgICAgICB0aGUgYWN0dWFsIHVzZXJuYW1lIHNob3VsZCBiZSBpbnNlcnRlZC4gIFVzZSB0aGlzIHByb3BlcnR5CisgICAgICAgIChhbG9uZyB3aXRoIHRoZSA8Y29kZT51c2VyQmFzZTwvY29kZT4gYW5kCisgICAgICAgIDxjb2RlPnVzZXJTdWJ0cmVlPC9jb2RlPiBwcm9wZXJ0aWVzKSBpbnN0ZWFkIG9mCisgICAgICAgIDxjb2RlPnVzZXJQYXR0ZXJuPC9jb2RlPiB0byBzZWFyY2ggdGhlIGRpcmVjdG9yeSBmb3IgdGhlCisgICAgICAgIHVzZXIncyBlbnRyeS48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ1c2VyU3VidHJlZSIgcmVxdWlyZWQ9ImZhbHNlIj4KKyAgICAgICAgPHA+U2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+IGlmIHlvdSB3YW50IHRvIHNlYXJjaCB0aGUgZW50aXJlCisgICAgICAgIHN1YnRyZWUgb2YgdGhlIGVsZW1lbnQgc3BlY2lmaWVkIGJ5IHRoZSA8Y29kZT51c2VyQmFzZTwvY29kZT4KKyAgICAgICAgcHJvcGVydHkgZm9yIHRoZSB1c2VyJ3MgZW50cnkuIFRoZSBkZWZhdWx0IHZhbHVlIG9mCisgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBjYXVzZXMgb25seSB0aGUgdG9wIGxldmVsIHRvIGJlIHNlYXJjaGVkLgorICAgICAgICBOb3QgdXNlZCBpZiB5b3UgYXJlIHVzaW5nIHRoZSA8Y29kZT51c2VyUGF0dGVybjwvY29kZT4KKyAgICAgICAgZXhwcmVzc2lvbi48L3A+CisgICAgICA8L2F0dHJpYnV0ZT4KKworPC9hdHRyaWJ1dGVzPgorCis8aDM+RXhhbXBsZTwvaDM+CisKKzxwPkNyZWF0aW9uIG9mIHRoZSBhcHByb3ByaWF0ZSBzY2hlbWEgaW4geW91ciBkaXJlY3Rvcnkgc2VydmVyIGlzIGJleW9uZCB0aGUKK3Njb3BlIG9mIHRoaXMgZG9jdW1lbnQsIGJlY2F1c2UgaXQgaXMgdW5pcXVlIHRvIGVhY2ggZGlyZWN0b3J5IHNlcnZlcgoraW1wbGVtZW50YXRpb24uICBJbiB0aGUgZXhhbXBsZXMgYmVsb3csIHdlIHdpbGwgYXNzdW1lIHRoYXQgeW91IGFyZSB1c2luZyBhCitkaXN0cmlidXRpb24gb2YgdGhlIE9wZW5MREFQIGRpcmVjdG9yeSBzZXJ2ZXIgKHZlcnNpb24gMi4wLjExIG9yIGxhdGVyKSwgd2hpY2gKK2NhbiBiZSBkb3dubG9hZGVkIGZyb20KKzxhIGhyZWY9Imh0dHA6Ly93d3cub3BlbmxkYXAub3JnIj5odHRwOi8vd3d3Lm9wZW5sZGFwLm9yZzwvYT4uICBBc3N1bWUgdGhhdAoreW91ciA8Y29kZT5zbGFwZC5jb25mPC9jb2RlPiBmaWxlIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgc2V0dGluZ3MKKyhhbW9uZyBvdGhlcnMpOjwvcD4KKzxzb3VyY2U+CitkYXRhYmFzZSBsZGJtCitzdWZmaXggZGM9Im15Y29tcGFueSIsZGM9ImNvbSIKK3Jvb3RkbiAiY249TWFuYWdlcixkYz1teWNvbXBhbnksZGM9Y29tIgorcm9vdHB3IHNlY3JldAorPC9zb3VyY2U+CisKKzxwPldlIHdpbGwgYXNzdW1lIGZvciA8Y29kZT5jb25uZWN0aW9uVVJMPC9jb2RlPiB0aGF0IHRoZSBkaXJlY3RvcnkKK3NlcnZlciBydW5zIG9uIHRoZSBzYW1lIG1hY2hpbmUgYXMgVG9tY2F0LiAgU2VlIDxhCitocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL2puZGkvZG9jcy5odG1sIj5odHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL2puZGkvZG9jcy5odG1sPC9hPgorZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgY29uZmlndXJpbmcgYW5kIHVzaW5nIHRoZSBKTkRJIExEQVAKK3Byb3ZpZGVyLjwvcD4KKworPHA+TmV4dCwgYXNzdW1lIHRoYXQgdGhpcyBkaXJlY3Rvcnkgc2VydmVyIGhhcyBiZWVuIHBvcHVsYXRlZCB3aXRoIGVsZW1lbnRzCithcyBzaG93biBiZWxvdyAoaW4gTERJRiBmb3JtYXQpOjwvcD4KKworPHNvdXJjZT4KKworIyBEZWZpbmUgdG9wLWxldmVsIGVudHJ5CitkbjogZGM9bXljb21wYW55LGRjPWNvbQorb2JqZWN0Q2xhc3M6IGRjT2JqZWN0CitkYzpteWNvbXBhbnkKKworIyBEZWZpbmUgYW4gZW50cnkgdG8gY29udGFpbiBwZW9wbGUKKyMgc2VhcmNoZXMgZm9yIHVzZXJzIGFyZSBiYXNlZCBvbiB0aGlzIGVudHJ5Citkbjogb3U9cGVvcGxlLGRjPW15Y29tcGFueSxkYz1jb20KK29iamVjdENsYXNzOiBvcmdhbml6YXRpb25hbFVuaXQKK291OiBwZW9wbGUKKworIyBEZWZpbmUgYSB1c2VyIGVudHJ5IGZvciBKYW5ldCBKb25lcworZG46IHVpZD1qam9uZXMsb3U9cGVvcGxlLGRjPW15Y29tcGFueSxkYz1jb20KK29iamVjdENsYXNzOiBpbmV0T3JnUGVyc29uCit1aWQ6IGpqb25lcworc246IGpvbmVzCitjbjogamFuZXQgam9uZXMKK21haWw6IGouam9uZXNAbXljb21wYW55LmNvbQordXNlclBhc3N3b3JkOiBqYW5ldAorCisjIERlZmluZSBhIHVzZXIgZW50cnkgZm9yIEZyZWQgQmxvZ2dzCitkbjogdWlkPWZibG9nZ3Msb3U9cGVvcGxlLGRjPW15Y29tcGFueSxkYz1jb20KK29iamVjdENsYXNzOiBpbmV0T3JnUGVyc29uCit1aWQ6IGZibG9nZ3MKK3NuOiBibG9nZ3MKK2NuOiBmcmVkIGJsb2dncworbWFpbDogZi5ibG9nZ3NAbXljb21wYW55LmNvbQordXNlclBhc3N3b3JkOiBmcmVkCisKKyMgRGVmaW5lIGFuIGVudHJ5IHRvIGNvbnRhaW4gTERBUCBncm91cHMKKyMgc2VhcmNoZXMgZm9yIHJvbGVzIGFyZSBiYXNlZCBvbiB0aGlzIGVudHJ5Citkbjogb3U9Z3JvdXBzLGRjPW15Y29tcGFueSxkYz1jb20KK29iamVjdENsYXNzOiBvcmdhbml6YXRpb25hbFVuaXQKK291OiBncm91cHMKKworIyBEZWZpbmUgYW4gZW50cnkgZm9yIHRoZSAidG9tY2F0IiByb2xlCitkbjogY249dG9tY2F0LG91PWdyb3VwcyxkYz1teWNvbXBhbnksZGM9Y29tCitvYmplY3RDbGFzczogZ3JvdXBPZlVuaXF1ZU5hbWVzCitjbjogdG9tY2F0Cit1bmlxdWVNZW1iZXI6IHVpZD1qam9uZXMsb3U9cGVvcGxlLGRjPW15Y29tcGFueSxkYz1jb20KK3VuaXF1ZU1lbWJlcjogdWlkPWZibG9nZ3Msb3U9cGVvcGxlLGRjPW15Y29tcGFueSxkYz1jb20KKworIyBEZWZpbmUgYW4gZW50cnkgZm9yIHRoZSAicm9sZTEiIHJvbGUKK2RuOiBjbj1yb2xlMSxvdT1ncm91cHMsZGM9bXljb21wYW55LGRjPWNvbQorb2JqZWN0Q2xhc3M6IGdyb3VwT2ZVbmlxdWVOYW1lcworY246IHJvbGUxCit1bmlxdWVNZW1iZXI6IHVpZD1mYmxvZ2dzLG91PXBlb3BsZSxkYz1teWNvbXBhbnksZGM9Y29tCis8L3NvdXJjZT4KKworPHA+QW4gZXhhbXBsZSA8Y29kZT5SZWFsbTwvY29kZT4gZWxlbWVudCBmb3IgdGhlIE9wZW5MREFQIGRpcmVjdG9yeQorc2VydmVyIGNvbmZpZ3VyZWQgYXMgZGVzY3JpYmVkIGFib3ZlIG1pZ2h0IGxvb2sgbGlrZSB0aGlzLCBhc3N1bWluZwordGhhdCB1c2VycyB1c2UgdGhlaXIgdWlkIChlLmcuIGpqb25lcykgdG8gbG9naW4gdG8gdGhlCithcHBsaWNhdGlvbiBhbmQgdGhhdCBhbiBhbm9ueW1vdXMgY29ubmVjdGlvbiBpcyBzdWZmaWNpZW50IHRvIHNlYXJjaAordGhlIGRpcmVjdG9yeSBhbmQgcmV0cmlldmUgcm9sZSBpbmZvcm1hdGlvbjo8L3A+CisKKzxzb3VyY2U+CismbHQ7UmVhbG0gICBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEucmVhbG0uSk5ESVJlYWxtIiBkZWJ1Zz0iOTkiCisgICAgIGNvbm5lY3Rpb25VUkw9ImxkYXA6Ly9sb2NhbGhvc3Q6Mzg5IgorICAgICAgIHVzZXJQYXR0ZXJuPSJ1aWQ9ezB9LG91PXBlb3BsZSxkYz1teWNvbXBhbnksZGM9Y29tIgorICAgICAgICAgIHJvbGVCYXNlPSJvdT1ncm91cHMsZGM9bXljb21wYW55LGRjPWNvbSIKKyAgICAgICAgICByb2xlTmFtZT0iY24iCisgICAgICAgIHJvbGVTZWFyY2g9Iih1bmlxdWVNZW1iZXI9ezB9KSIKKy8mZ3Q7Cis8L3NvdXJjZT4KKworPHA+V2l0aCB0aGlzIGNvbmZpZ3VyYXRpb24sIHRoZSByZWFsbSB3aWxsIGRldGVybWluZSB0aGUgdXNlcidzCitkaXN0aW5ndWlzaGVkIG5hbWUgYnkgc3Vic3RpdHV0aW5nIHRoZSB1c2VybmFtZSBpbnRvIHRoZQorPGNvZGU+dXNlclBhdHRlcm48L2NvZGU+LCBhdXRoZW50aWNhdGUgYnkgYmluZGluZyB0byB0aGUgZGlyZWN0b3J5Cit3aXRoIHRoaXMgRE4gYW5kIHRoZSBwYXNzd29yZCByZWNlaXZlZCBmcm9tIHRoZSB1c2VyLCBhbmQgc2VhcmNoIHRoZQorZGlyZWN0b3J5IHRvIGZpbmQgdGhlIHVzZXIncyByb2xlcy48L3A+CisKKzxwPk5vdyBzdXBwb3NlIHRoYXQgdXNlcnMgYXJlIGV4cGVjdGVkIHRvIGVudGVyIHRoZWlyIGVtYWlsIGFkZHJlc3MKK3JhdGhlciB0aGFuIHRoZWlyIHVzZXJpZCB3aGVuIGxvZ2dpbmcgaW4uIEluIHRoaXMgY2FzZSB0aGUgcmVhbG0gbXVzdAorc2VhcmNoIHRoZSBkaXJlY3RvcnkgZm9yIHRoZSB1c2VyJ3MgZW50cnkuIChBIHNlYXJjaCBpcyBhbHNvIG5lY2Vzc2FyeQord2hlbiB1c2VyIGVudHJpZXMgYXJlIGhlbGQgaW4gbXVsdGlwbGUgc3VidHJlZXMgY29ycmVzcG9uZGluZyBwZXJoYXBzCit0byBkaWZmZXJlbnQgb3JnYW5pemF0aW9uYWwgdW5pdHMgb3IgY29tcGFueSBsb2NhdGlvbnMpLjwvcD4KKworPHA+RnVydGhlciwgc3VwcG9zZSB0aGF0IGluIGFkZGl0aW9uIHRvIHRoZSBncm91cCBlbnRyaWVzIHlvdSB3YW50IHRvCit1c2UgYW4gYXR0cmlidXRlIG9mIHRoZSB1c2VyJ3MgZW50cnkgdG8gaG9sZCByb2xlcy4gTm93IHRoZSBlbnRyeSBmb3IKK0phbmV0IEpvbmVzIG1pZ2h0IHJlYWQgYXMgZm9sbG93czo8L3A+CisKKzxzb3VyY2U+CitkbjogdWlkPWpqb25lcyxvdT1wZW9wbGUsZGM9bXljb21wYW55LGRjPWNvbQorb2JqZWN0Q2xhc3M6IGluZXRPcmdQZXJzb24KK3VpZDogampvbmVzCitzbjogam9uZXMKK2NuOiBqYW5ldCBqb25lcworbWFpbDogai5qb25lc0BteWNvbXBhbnkuY29tCittZW1iZXJPZjogcm9sZTIKK21lbWJlck9mOiByb2xlMwordXNlclBhc3N3b3JkOiBqYW5ldAorPC9zb3VyY2U+CisKKzxwPiBUaGlzIHJlYWxtIGNvbmZpZ3VyYXRpb24gd291bGQgc2F0aXNmeSB0aGUgbmV3IHJlcXVpcmVtZW50czo8L3A+CisKKzxzb3VyY2U+CismbHQ7UmVhbG0gICBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEucmVhbG0uSk5ESVJlYWxtIiBkZWJ1Zz0iOTkiCisgICAgIGNvbm5lY3Rpb25VUkw9ImxkYXA6Ly9sb2NhbGhvc3Q6Mzg5IgorICAgICAgICAgIHVzZXJCYXNlPSJvdT1wZW9wbGUsZGM9bXljb21wYW55LGRjPWNvbSIKKyAgICAgICAgdXNlclNlYXJjaD0iKG1haWw9ezB9KSIKKyAgICAgIHVzZXJSb2xlTmFtZT0ibWVtYmVyT2YiCisgICAgICAgICAgcm9sZUJhc2U9Im91PWdyb3VwcyxkYz1teWNvbXBhbnksZGM9Y29tIgorICAgICAgICAgIHJvbGVOYW1lPSJjbiIKKyAgICAgICAgcm9sZVNlYXJjaD0iKHVuaXF1ZU1lbWJlcj17MH0pIgorLyZndDsKKzwvc291cmNlPgorCis8cD5Ob3cgd2hlbiBKYW5ldCBKb25lcyBsb2dzIGluIGFzICJqLmpvbmVzQG15Y29tcGFueS5jb20iLCB0aGUgcmVhbG0KK3NlYXJjaGVzIHRoZSBkaXJlY3RvcnkgZm9yIGEgdW5pcXVlIGVudHJ5IHdpdGggdGhhdCB2YWx1ZSBhcyBpdHMgbWFpbAorYXR0cmlidXRlIGFuZCBhdHRlbXB0cyB0byBiaW5kIHRvIHRoZSBkaXJlY3RvcnkgYXMKKzxjb2RlPnVpZD1qam9uZXMsb3U9cGVvcGxlLGRjPW15Y29tcGFueSxkYz1jb208L2NvZGU+IHdpdGggdGhlIGdpdmVuCitwYXNzd29yZC4gSWYgYXV0aGVudGljYXRpb24gc3VjY2VlZHMsIHNoZSBpcyBhc3NpZ25lZCB0aHJlZSByb2xlczoKKyJyb2xlMiIgYW5kICJyb2xlMyIsIHRoZSB2YWx1ZXMgb2YgdGhlICJtZW1iZXJPZiIgYXR0cmlidXRlIGluIGhlcgorZGlyZWN0b3J5IGVudHJ5LCBhbmQgInRvbWNhdCIsIHRoZSB2YWx1ZSBvZiB0aGUgImNuIiBhdHRyaWJ1dGUgaW4gdGhlCitvbmx5IGdyb3VwIGVudHJ5IG9mIHdoaWNoIHNoZSBpcyBhIG1lbWJlci48L3A+CisKKzxwPkZpbmFsbHksIHRvIGF1dGhlbnRpY2F0ZSB0aGUgdXNlciBieSByZXRyaWV2aW5nCit0aGUgcGFzc3dvcmQgZnJvbSB0aGUgZGlyZWN0b3J5IGFuZCBtYWtpbmcgYSBsb2NhbCBjb21wYXJpc29uIGluIHRoZQorcmVhbG0sIHlvdSBtaWdodCB1c2UgYSByZWFsbSBjb25maWd1cmF0aW9uIGxpa2UgdGhpczo8L3A+CisKKzxzb3VyY2U+CismbHQ7UmVhbG0gICBjbGFzc05hbWU9Im9yZy5hcGFjaGUuY2F0YWxpbmEucmVhbG0uSk5ESVJlYWxtIiBkZWJ1Zz0iOTkiCisgICAgY29ubmVjdGlvbk5hbWU9ImNuPU1hbmFnZXIsZGM9bXljb21wYW55LGRjPWNvbSIKK2Nvbm5lY3Rpb25QYXNzd29yZD0ic2VjcmV0IgorICAgICBjb25uZWN0aW9uVVJMPSJsZGFwOi8vbG9jYWxob3N0OjM4OSIKKyAgICAgIHVzZXJQYXNzd29yZD0idXNlclBhc3N3b3JkIgorICAgICAgIHVzZXJQYXR0ZXJuPSJ1aWQ9ezB9LG91PXBlb3BsZSxkYz1teWNvbXBhbnksZGM9Y29tIgorICAgICAgICAgIHJvbGVCYXNlPSJvdT1ncm91cHMsZGM9bXljb21wYW55LGRjPWNvbSIKKyAgICAgICAgICByb2xlTmFtZT0iY24iCisgICAgICAgIHJvbGVTZWFyY2g9Iih1bmlxdWVNZW1iZXI9ezB9KSIKKy8mZ3Q7Cis8L3NvdXJjZT4KKworPHA+SG93ZXZlciwgYXMgZGlzY3Vzc2VkIGFib3ZlLCB0aGUgZGVmYXVsdCBiaW5kIG1vZGUgZm9yCithdXRoZW50aWNhdGlvbiBpcyB1c3VhbGx5IHRvIGJlIHByZWZlcnJlZC48L3A+CisKKzxoMz5BZGRpdGlvbmFsIE5vdGVzPC9oMz4KKworPHA+Sk5ESVJlYWxtIG9wZXJhdGVzIGFjY29yZGluZyB0byB0aGUgZm9sbG93aW5nIHJ1bGVzOjwvcD4KKzx1bD4KKzxsaT5XaGVuIGEgdXNlciBhdHRlbXB0cyB0byBhY2Nlc3MgYSBwcm90ZWN0ZWQgcmVzb3VyY2UgZm9yIHRoZSBmaXJzdCB0aW1lLAorICAgIFRvbWNhdCA1IHdpbGwgY2FsbCB0aGUgPGNvZGU+YXV0aGVudGljYXRlKCk8L2NvZGU+IG1ldGhvZCBvZiB0aGlzCisgICAgPGNvZGU+UmVhbG08L2NvZGU+LiAgVGh1cywgYW55IGNoYW5nZXMgeW91IGhhdmUgbWFkZSB0byB0aGUgZGlyZWN0b3J5CisgICAgKG5ldyB1c2VycywgY2hhbmdlZCBwYXNzd29yZHMgb3Igcm9sZXMsIGV0Yy4pIHdpbGwgYmUgaW1tZWRpYXRlbHkKKyAgICByZWZsZWN0ZWQuPC9saT4KKzxsaT5PbmNlIGEgdXNlciBoYXMgYmVlbiBhdXRoZW50aWNhdGVkLCB0aGUgdXNlciAoYW5kIGhpcyBvciBoZXIgYXNzb2NpYXRlZAorICAgIHJvbGVzKSBhcmUgY2FjaGVkIHdpdGhpbiBUb21jYXQgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgdXNlcidzIGxvZ2luLgorICAgIChGb3IgRk9STS1iYXNlZCBhdXRoZW50aWNhdGlvbiwgdGhhdCBtZWFucyB1bnRpbCB0aGUgc2Vzc2lvbiB0aW1lcyBvdXQgb3IKKyAgICBpcyBpbnZhbGlkYXRlZDsgZm9yIEJBU0lDIGF1dGhlbnRpY2F0aW9uLCB0aGF0IG1lYW5zIHVudGlsIHRoZSB1c2VyCisgICAgY2xvc2VzIHRoZWlyIGJyb3dzZXIpLiAgVGhlIGNhY2hlZCB1c2VyIGlzIDxzdHJvbmc+bm90PC9zdHJvbmc+IHNhdmVkIGFuZAorICAgIHJlc3RvcmVkIGFjcm9zcyBzZXNzaW9ucyBzZXJpYWxpc2F0aW9ucy4gQW55IGNoYW5nZXMgdG8gdGhlIGRpcmVjdG9yeQorICAgIGluZm9ybWF0aW9uIGZvciBhbiBhbHJlYWR5IGF1dGhlbnRpY2F0ZWQgdXNlciB3aWxsIDxzdHJvbmc+bm90PC9zdHJvbmc+IGJlCisgICAgcmVmbGVjdGVkIHVudGlsIHRoZSBuZXh0IHRpbWUgdGhhdCB1c2VyIGxvZ3Mgb24gYWdhaW4uPC9saT4KKzxsaT5BZG1pbmlzdGVyaW5nIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgZGlyZWN0b3J5IHNlcnZlcgorICAgIGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB5b3VyIG93biBhcHBsaWNhdGlvbnMuICBUb21jYXQgZG9lcyBub3QKKyAgICBwcm92aWRlIGFueSBidWlsdC1pbiBjYXBhYmlsaXRpZXMgdG8gbWFpbnRhaW4gdXNlcnMgYW5kIHJvbGVzLjwvbGk+Cis8L3VsPgorCis8L3N1YnNlY3Rpb24+CisKKworPHN1YnNlY3Rpb24gbmFtZT0iTWVtb3J5UmVhbG0iPgorCis8aDM+SW50cm9kdWN0aW9uPC9oMz4KKworPHA+PHN0cm9uZz5NZW1vcnlSZWFsbTwvc3Ryb25nPiBpcyBhIHNpbXBsZSBkZW1vbnN0cmF0aW9uIGltcGxlbWVudGF0aW9uIG9mIHRoZQorVG9tY2F0IDUgPGNvZGU+UmVhbG08L2NvZGU+IGludGVyZmFjZS4gIEl0IGlzIG5vdCBkZXNpZ25lZCBmb3IgcHJvZHVjdGlvbiB1c2UuCitBdCBzdGFydHVwIHRpbWUsIE1lbW9yeVJlYWxtIGxvYWRzIGluZm9ybWF0aW9uIGFib3V0IGFsbCB1c2VycywgYW5kIHRoZWlyCitjb3JyZXNwb25kaW5nIHJvbGVzLCBmcm9tIGFuIFhNTCBkb2N1bWVudCAoYnkgZGVmYXVsdCwgdGhpcyBkb2N1bWVudCBpcyBsb2FkZWQgZnJvbSA8Y29kZT4kQ0FUQUxJTkFfSE9NRS9jb25mL3RvbWNhdC11c2Vycy54bWw8L2NvZGU+KS4gIENoYW5nZXMgdG8gdGhlIGRhdGEKK2luIHRoaXMgZmlsZSBhcmUgbm90IHJlY29nbml6ZWQgdW50aWwgVG9tY2F0IGlzIHJlc3RhcnRlZC48L3A+CisKKzxoMz5SZWFsbSBFbGVtZW50IEF0dHJpYnV0ZXM8L2gzPgorCis8cD5UbyBjb25maWd1cmUgTWVtb3J5UmVhbG0sIHlvdSB3aWxsIGNyZWF0ZSBhIDxjb2RlPiZsdDtSZWFsbSZndDs8L2NvZGU+CitlbGVtZW50IGFuZCBuZXN0IGl0IGluIHlvdXIgPGNvZGU+JENBVEFMSU5BX0hPTUUvY29uZi9zZXJ2ZXIueG1sPC9jb2RlPiBmaWxlLAorYXMgZGVzY3JpYmVkIDxhIGhyZWY9IiNDb25maWd1cmluZyBhIFJlYWxtIj5hYm92ZTwvYT4uICBUaGUgZm9sbG93aW5nCithdHRyaWJ1dGVzIGFyZSBzdXBwb3J0ZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvbjo8L3A+CisKKzxhdHRyaWJ1dGVzPgorCisgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NOYW1lIiByZXF1aXJlZD0idHJ1ZSI+CisgICAgPHA+VGhlIGZ1bGx5IHF1YWxpZmllZCBKYXZhIGNsYXNzIG5hbWUgb2YgdGhpcyBSZWFsbSBpbXBsZW1lbnRhdGlvbi4KKyAgICBZb3UgPHN0cm9uZz5NVVNUPC9zdHJvbmc+IHNwZWNpZnkgdGhlIHZhbHVlCisgICAgIjxjb2RlPm9yZy5hcGFjaGUuY2F0YWxpbmEucmVhbG0uTWVtb3J5UmVhbG08L2NvZGU+IiBoZXJlLjwvcD4KKyAgPC9hdHRyaWJ1dGU+CisKKyAgPGF0dHJpYnV0ZSBuYW1lPSJkaWdlc3QiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgPHA+VGhlIGRpZ2VzdCBhbGdvcml0aG0gdXNlZCB0byBzdG9yZSBwYXNzd29yZHMgaW4gbm9uLXBsYWludGV4dCBmb3JtYXRzLgorICAgIFZhbGlkIHZhbHVlcyBhcmUgdGhvc2UgYWNjZXB0ZWQgZm9yIHRoZSBhbGdvcml0aG0gbmFtZSBieSB0aGUKKyAgICA8Y29kZT5qYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3Q8L2NvZGU+IGNsYXNzLiAgU2VlCisgICAgPGEgaHJlZj0iI0RpZ2VzdGVkIFBhc3N3b3JkcyI+RGlnZXN0ZWQgUGFzc3dvcmRzPC9hPiBmb3IgbW9yZQorICAgIGluZm9ybWF0aW9uLiAgSWYgbm90IHNwZWNpZmllZCwgcGFzc3dvcmRzIGFyZSBzdG9yZWQgaW4gY2xlYXIgdGV4dC48L3A+CisgIDwvYXR0cmlidXRlPgorCisgIDxhdHRyaWJ1dGUgbmFtZT0icGF0aG5hbWUiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgPHA+QWJzb2x1dGUgb3IgcmVsYXRpdmUgKHRvICRDQVRBTElOQV9IT01FKSBwYXRobmFtZSBvZiB0aGUgWE1MIGRvY3VtZW50CisgICAgY29udGFpbmluZyBvdXIgdmFsaWQgdXNlcm5hbWVzLCBwYXNzd29yZHMsIGFuZCByb2xlcy4gIFNlZSBiZWxvdyBmb3IgbW9yZQorICAgIGluZm9ybWF0aW9uIG9uIHRoZSBmb3JtYXQgb2YgdGhpcyBmaWxlLiAgSWYgbm90IHNwZWNpZmllZCwgdGhlIHZhbHVlCisgICAgPGNvZGU+Y29uZi90b21jYXQtdXNlcnMueG1sPC9jb2RlPiBpcyB1c2VkLjwvcD4KKyAgPC9hdHRyaWJ1dGU+CisKKzwvYXR0cmlidXRlcz4KKworPGgzPlVzZXIgRmlsZSBGb3JtYXQ8L2gzPgorCis8cD5UaGUgdXNlcnMgZmlsZSAoYnkgZGVmYXVsdCwgPGNvZGU+Y29uZi90b21jYXQtdXNlcnMueG1sPC9jb2RlPiBtdXN0IGJlIGFuCitYTUwgZG9jdW1lbnQsIHdpdGggYSByb290IGVsZW1lbnQgPGNvZGU+Jmx0O3RvbWNhdC11c2VycyZndDs8L2NvZGU+LiAgTmVzdGVkCitpbnNpZGUgdGhlIHJvb3QgZWxlbWVudCB3aWxsIGJlIGEgPGNvZGU+Jmx0O3VzZXImZ3Q7PC9jb2RlPiBlbGVtZW50IGZvciBlYWNoCit2YWxpZCB1c2VyLCBjb25zaXN0aW5nIG9mIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczo8L3A+Cis8dWw+Cis8bGk+PHN0cm9uZz5uYW1lPC9zdHJvbmc+IC0gVXNlcm5hbWUgdGhpcyB1c2VyIG11c3QgbG9nIG9uIHdpdGguPC9saT4KKzxsaT48c3Ryb25nPnBhc3N3b3JkPC9zdHJvbmc+IC0gUGFzc3dvcmQgdGhpcyB1c2VyIG11c3QgbG9nIG9uIHdpdGggKGluCisgICAgY2xlYXIgdGV4dCBpZiB0aGUgPGNvZGU+ZGlnZXN0PC9jb2RlPiBhdHRyaWJ1dGUgd2FzIG5vdCBzZXQgb24gdGhlCisgICAgPGNvZGU+Jmx0O1JlYWxtJmd0OzwvY29kZT4gZWxlbWVudCwgb3IgZGlnZXN0ZWQgYXBwcm9wcmlhdGVseSBhcworICAgIGRlc2NyaWJlZCA8YSBocmVmPSIjRGlnZXN0ZWQgUGFzc3dvcmRzIj5oZXJlPC9hPiBvdGhlcndpc2UpLjwvbGk+Cis8bGk+PHN0cm9uZz5yb2xlczwvc3Ryb25nPiAtIENvbW1hLWRlbGltaXRlZCBsaXN0IG9mIHRoZSByb2xlIG5hbWVzCisgICAgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdXNlci48L2xpPgorPC91bD4KKworPGgzPkV4YW1wbGU8L2gzPgorCis8cD5UaGUgZGVmYXVsdCBpbnN0YWxsYXRpb24gb2YgVG9tY2F0IDUgaXMgY29uZmlndXJlZCB3aXRoIGEgTWVtb3J5UmVhbG0KK25lc3RlZCBpbnNpZGUgdGhlIDxjb2RlPiZsdDtFbmdpbmUmZ3Q7PC9jb2RlPiBlbGVtZW50LCBzbyB0aGF0IGl0IGFwcGxpZXMKK3RvIGFsbCB2aXJ0dWFsIGhvc3RzIGFuZCB3ZWIgYXBwbGljYXRpb25zLiAgVGhlIGRlZmF1bHQgY29udGVudHMgb2YgdGhlCis8Y29kZT5jb25mL3RvbWNhdC11c2Vycy54bWw8L2NvZGU+IGZpbGUgaXM6PC9wPgorPHNvdXJjZT4KKyZsdDt0b21jYXQtdXNlcnMmZ3Q7CisgICZsdDt1c2VyIG5hbWU9InRvbWNhdCIgcGFzc3dvcmQ9InRvbWNhdCIgcm9sZXM9InRvbWNhdCIgLyZndDsKKyAgJmx0O3VzZXIgbmFtZT0icm9sZTEiICBwYXNzd29yZD0idG9tY2F0IiByb2xlcz0icm9sZTEiICAvJmd0OworICAmbHQ7dXNlciBuYW1lPSJib3RoIiAgIHBhc3N3b3JkPSJ0b21jYXQiIHJvbGVzPSJ0b21jYXQscm9sZTEiIC8mZ3Q7CismbHQ7L3RvbWNhdC11c2VycyZndDsKKzwvc291cmNlPgorCis8aDM+QWRkaXRpb25hbCBOb3RlczwvaDM+CisKKzxwPk1lbW9yeVJlYWxtIG9wZXJhdGVzIGFjY29yZGluZyB0byB0aGUgZm9sbG93aW5nIHJ1bGVzOjwvcD4KKzx1bD4KKzxsaT5XaGVuIFRvbWNhdCBmaXJzdCBzdGFydHMgdXAsIGl0IGxvYWRzIGFsbCBkZWZpbmVkIHVzZXJzIGFuZCB0aGVpcgorICAgIGFzc29jaWF0ZWQgaW5mb3JtYXRpb24gZnJvbSB0aGUgdXNlcnMgZmlsZS4gIENoYW5nZXMgdG8gdGhlIGRhdGEgaW4KKyAgICB0aGlzIGZpbGUgd2lsbCA8c3Ryb25nPm5vdDwvc3Ryb25nPiBiZSByZWNvZ25pemVkIHVudGlsIFRvbWNhdCBpcworICAgIHJlc3RhcnRlZC48L2xpPgorPGxpPldoZW4gYSB1c2VyIGF0dGVtcHRzIHRvIGFjY2VzcyBhIHByb3RlY3RlZCByZXNvdXJjZSBmb3IgdGhlIGZpcnN0IHRpbWUsCisgICAgVG9tY2F0IDUgd2lsbCBjYWxsIHRoZSA8Y29kZT5hdXRoZW50aWNhdGUoKTwvY29kZT4gbWV0aG9kIG9mIHRoaXMKKyAgICA8Y29kZT5SZWFsbTwvY29kZT4uPC9saT4KKzxsaT5PbmNlIGEgdXNlciBoYXMgYmVlbiBhdXRoZW50aWNhdGVkLCB0aGUgdXNlciAoYW5kIGhpcyBvciBoZXIgYXNzb2NpYXRlZAorICAgIHJvbGVzKSBhcmUgY2FjaGVkIHdpdGhpbiBUb21jYXQgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgdXNlcidzIGxvZ2luLgorICAgIChGb3IgRk9STS1iYXNlZCBhdXRoZW50aWNhdGlvbiwgdGhhdCBtZWFucyB1bnRpbCB0aGUgc2Vzc2lvbiB0aW1lcyBvdXQgb3IKKyAgICBpcyBpbnZhbGlkYXRlZDsgZm9yIEJBU0lDIGF1dGhlbnRpY2F0aW9uLCB0aGF0IG1lYW5zIHVudGlsIHRoZSB1c2VyCisgICAgY2xvc2VzIHRoZWlyIGJyb3dzZXIpLiAgVGhlIGNhY2hlZCB1c2VyIGlzIDxzdHJvbmc+bm90PC9zdHJvbmc+IHNhdmVkIGFuZAorICAgIHJlc3RvcmVkIGFjcm9zcyBzZXNzaW9ucyBzZXJpYWxpc2F0aW9ucy48L2xpPgorPGxpPkFkbWluaXN0ZXJpbmcgdGhlIGluZm9ybWF0aW9uIGluIHRoZSB1c2VycyBmaWxlIGlzIHRoZSByZXNwb25zaWJpbGl0eQorICAgIG9mIHlvdXIgYXBwbGljYXRpb24uICBUb21jYXQgZG9lcyBub3QKKyAgICBwcm92aWRlIGFueSBidWlsdC1pbiBjYXBhYmlsaXRpZXMgdG8gbWFpbnRhaW4gdXNlcnMgYW5kIHJvbGVzLjwvbGk+Cis8L3VsPgorCisKKzwvc3Vic2VjdGlvbj4KKworCis8c3Vic2VjdGlvbiBuYW1lPSJKQUFTUmVhbG0iPgorCis8aDM+SW50cm9kdWN0aW9uPC9oMz4KKworICAgICAgICA8cD48c3Ryb25nPkpBQVNSZWFsbTwvc3Ryb25nPiBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVG9tY2F0Cis0IDxjb2RlPlJlYWxtPC9jb2RlPiBpbnRlcmZhY2UgdGhhdCBhdXRoZW50aWNhdGVzIHVzZXJzIHRocm91Z2ggdGhlIEphdmEKK0F1dGhlbnRpY2F0aW9uICZhbXA7IEF1dGhvcml6YXRpb24gU2VydmljZSAoSkFBUykgZnJhbWV3b3JrLCBhIEphdmEKK3BhY2thZ2UgdGhhdCBpcyBhdmFpbGFibGUgYXMgYW4gb3B0aW9uYWwgcGFja2FnZSBpbiBKYXZhIDIgU0RLIDEuMyBhbmQKK2lzIGZ1bGx5IGludGVncmF0ZWQgYXMgb2YgU0RLIDEuNCAuPC9wPgorICAgICAgICA8cD5Vc2luZyBKQUFTUmVhbG0gZ2l2ZXMgdGhlIGRldmVsb3BlciB0aGUgYWJpbGl0eSB0byBjb21iaW5lCitwcmFjdGljYWxseSBhbnkgY29uY2VpdmFibGUgc2VjdXJpdHkgcmVhbG0gd2l0aCBUb21jYXQncyBDTUEuIDwvcD4KKyAgICAgICAgPHA+SkFBU1JlYWxtIGlzIHByb3RvdHlwZSBmb3IgVG9tY2F0IG9mIHRoZSBwcm9wb3NlZCBKQUFTLWJhc2VkCitKMkVFIGF1dGhlbnRpY2F0aW9uIGZyYW1ld29yayBmb3IgSjJFRSB2MS40LCBiYXNlZCBvbiB0aGUgPGEKKyBocmVmPSJodHRwOi8vd3d3LmpjcC5vcmcvZW4vanNyL2RldGFpbD9pZD0xOTYiPkpDUCBTcGVjaWZpY2F0aW9uCitSZXF1ZXN0IDE5NjwvYT4gdG8gZW5oYW5jZSBjb250YWluZXItbWFuYWdlZCBzZWN1cml0eSBhbmQgcHJvbW90ZQorJ3BsdWdnYWJsZScgYXV0aGVudGljYXRpb24gbWVjaGFuaXNtcyB3aG9zZSBpbXBsZW1lbnRhdGlvbnMgd291bGQgYmUKK2NvbnRhaW5lci1pbmRlcGVuZGVudC4KKyAgICAgICAgPC9wPgorICAgICAgICA8cD5CYXNlZCBvbiB0aGUgSkFBUyBsb2dpbiBtb2R1bGUgYW5kIHByaW5jaXBhbCAoc2VlIDxjb2RlPmphdmF4LnNlY3VyaXR5LmF1dGguc3BpLkxvZ2luTW9kdWxlPC9jb2RlPgorYW5kIDxjb2RlPmphdmF4LnNlY3VyaXR5LlByaW5jaXBhbDwvY29kZT4pLCB5b3UgY2FuIGRldmVsb3AgeW91ciBvd24KK3NlY3VyaXR5IG1lY2hhbmlzbSBvciB3cmFwIGFub3RoZXIgdGhpcmQtcGFydHkgbWVjaGFuaXNtIGZvcgoraW50ZWdyYXRpb24gd2l0aCB0aGUgQ01BIGFzIGltcGxlbWVudGVkIGJ5IFRvbWNhdC4KKyAgICAgICAgPC9wPgorCisgICAgICAgIDxoMz5RdWljayBTdGFydDwvaDM+CisgICAgICAgIDxwPlRvIHNldCB1cCBUb21jYXQgdG8gdXNlIEpBQVNSZWFsbSB3aXRoIHlvdXIgb3duIEpBQVMgbG9naW4gbW9kdWxlLAorIHlvdSB3aWxsIG5lZWQgdG8gZm9sbG93IHRoZXNlIHN0ZXBzOjwvcD4KKyAgICAgICAgPG9sPgorICAgICAgICAgIDxsaT5Xcml0ZSB5b3VyIG93biBMb2dpbk1vZHVsZSwgVXNlciBhbmQgUm9sZSBjbGFzc2VzIGJhc2VkCitvbiBKQUFTIChzZWUgCis8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS40LjEvZG9jcy9ndWlkZS9zZWN1cml0eS9qYWFzL3R1dG9yaWFscy9HZW5lcmFsQWNuT25seS5odG1sIj50aGUKK0pBQVMgQXV0aGVudGljYXRpb24gVHV0b3JpYWw8L2E+IGFuZCAKKzxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjQuMS9kb2NzL2d1aWRlL3NlY3VyaXR5L2phYXMvSkFBU0xNRGV2R3VpZGUuaHRtbCI+dGhlIEpBQVMgTG9naW4gTW9kdWxlIAorRGV2ZWxvcGVyJ3MgR3VpZGU8L2E+KSB0byBiZSBtYW5hZ2VkIGJ5IHRoZSBKQUFTIExvZ2luCitDb250ZXh0ICg8Y29kZT5qYXZheC5zZWN1cml0eS5hdXRoLmxvZ2luLkxvZ2luQ29udGV4dDwvY29kZT4pCisgICAgICAgICAgPC9saT4KKyAgICAgICAgICA8bGk+QWx0aG91Z2ggbm90IHNwZWNpZmllZCBpbiBKQUFTLCB5b3Ugc2hvdWxkIGNyZWF0ZQorc2VwZXJhdGUgY2xhc3NlcyB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIHVzZXJzIGFuZCByb2xlcywgZXh0ZW5kaW5nIDxjb2RlPmphdmF4LnNlY3VyaXR5LlByaW5jaXBhbDwvY29kZT4sCitzbyB0aGF0IFRvbWNhdCBjYW4gdGVsbCB3aGljaCBQcmluY2lwYWxzIHJldHVybmVkIGZyb20geW91ciBsb2dpbgorbW9kdWxlIGFyZSB1c2VycyBhbmQgd2hpY2ggYXJlIHJvbGVzIChzZWUgPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5yZWFsbS5KQUFTUmVhbG08L2NvZGU+KS4KKyAgICAgICAgICA8L2xpPgorICAgICAgICAgIDxsaT5QbGFjZSB0aGUgY29tcGlsZWQgY2xhc3NlcyBvbiBUb21jYXQncyBjbGFzc3BhdGgKKyAgICAgICAgICA8L2xpPgorICAgICAgICAgIDxsaT5TZXQgdXAgYSBsb2dpbi5jb25maWcgZmlsZSBmb3IgSmF2YSAoc2VlIDxhCisgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNC4xL2RvY3MvZ3VpZGUvc2VjdXJpdHkvamFhcy90dXRvcmlhbHMvTG9naW5Db25maWdGaWxlLmh0bWwiPkpBQVMKK0xvZ2luQ29uZmlnIGZpbGU8L2E+KSBhbmQgdGVsbCBUb21jYXQgd2hlcmUgdG8gZmluZCBpdCBieSBzcGVjaWZ5aW5nCitpdHMgbG9jYXRpb24gdG8gdGhlIEpWTSwgZm9yIGluc3RhbmNlIGJ5IHNldHRpbmcgdGhlIGVudmlyb25tZW50Cit2YXJpYWJsZTogSkFWQV9PUFRTPS1EPGNvZGU+SkFWQV9PUFRTPS1EamF2YS5zZWN1cml0eS5hdXRoLmxvZ2luLmNvbmZpZz09JENBVEFMSU5BX0hPTUUvY29uZi9qYWFzLmNvbmZpZzwvY29kZT48L2xpPgorICAgICAgICAgIDxsaT5Db25maWd1cmUgeW91ciBzZWN1cml0eS1jb25zdHJhaW50cyBpbiB5b3VyIHdlYi54bWwgZm9yCit0aGUgcmVzb3VyY2VzIHlvdSB3YW50IHRvIHByb3RlY3Q8L2xpPgorICAgICAgICAgIDxsaT5Db25maWd1cmUgdGhlIEpBQVNSZWFsbSBtb2R1bGUgaW4geW91ciBzZXJ2ZXIueG1sIDwvbGk+CisgICAgICAgICAgPGxpPlJlc3RhcnQgVG9tY2F0IDQgaWYgaXQgaXMgYWxyZWFkeSBydW5uaW5nLjwvbGk+CisgICAgICAgIDwvb2w+CisgICAgICAgIDxoMz5SZWFsbSBFbGVtZW50IEF0dHJpYnV0ZXM8L2gzPgorICAgICAgICA8cD5UbyBjb25maWd1cmUgSkFBU1JlYWxtIGFzIGZvciBzdGVwIDYgYWJvdmUsIHlvdSBjcmVhdGUKK2EgPGNvZGU+Jmx0O1JlYWxtJmd0OzwvY29kZT4gZWxlbWVudCBhbmQgbmVzdCBpdCBpbiB5b3VyIAorPGNvZGU+JENBVEFMSU5BX0hPTUUvY29uZi9zZXJ2ZXIueG1sPC9jb2RlPgorZmlsZSB3aXRoaW4geW91ciA8Y29kZT4mbHQ7RW5naW5lJmd0OzwvY29kZT4gbm9kZS4gVGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIAorYXJlIHN1cHBvcnRlZCBieSB0aGlzIGltcGxlbWVudGF0aW9uOjwvcD4KKworPGF0dHJpYnV0ZXM+CisKKyAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc05hbWUiIHJlcXVpcmVkPSJ0cnVlIj4KKyAgICA8cD5UaGUgZnVsbHkgcXVhbGlmaWVkIEphdmEgY2xhc3MgbmFtZSBvZiB0aGlzIFJlYWxtIGltcGxlbWVudGF0aW9uLgorICAgIFlvdSA8c3Ryb25nPk1VU1Q8L3N0cm9uZz4gc3BlY2lmeSB0aGUgdmFsdWUKKyAgICAiPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5yZWFsbS5NZW1vcnlSZWFsbTwvY29kZT4iIGhlcmUuPC9wPgorICA8L2F0dHJpYnV0ZT4KKworICA8YXR0cmlidXRlIG5hbWU9ImFwcE5hbWUiIHJlcXVpcmVkPSJ0cnVlIj4KKyAgICA8cD5UaGUgbmFtZSBvZiB0aGUgcmVhbG0gYXMgY29uZmlndXJlZCBpbiB5b3VyIGxvZ2luIGNvbmZpZ3VyYXRpb24gZmlsZSAKKyAgICAoPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNC4xL2RvY3MvZ3VpZGUvc2VjdXJpdHkvamFhcy90dXRvcmlhbHMvTG9naW5Db25maWdGaWxlLmh0bWwiPkpBQVMgTG9naW5Db25maWc8L2E+KS48L3A+CisgIDwvYXR0cmlidXRlPgorCisgIDxhdHRyaWJ1dGUgbmFtZT0idXNlckNsYXNzTmFtZXMiIHJlcXVpcmVkPSJ0cnVlIj4KKyAgICA8cD5BIGNvbW1hLXNlcGVyYXRlZCBsaXN0IG9mIHRoZSBuYW1lcyBvZiB0aGUgY2xhc3NlcyB0aGF0IHlvdSBoYXZlIG1hZGUgCisgICAgZm9yIHlvdXIgdXNlciA8Y29kZT5QcmluY2lwYWxzPC9jb2RlPi48L3A+CisgIDwvYXR0cmlidXRlPgorCisgIDxhdHRyaWJ1dGUgbmFtZT0icm9sZUNsYXNzTmFtZXMiIHJlcXVpcmVkPSJmYWxzZSI+CisgICAgPHA+QSBjb21tYS1zZXBlcmF0ZWQgbGlzdCBvZiB0aGUgbmFtZXMgb2YgdGhlIGNsYXNzZXMgdGhhdCB5b3UgaGF2ZSBtYWRlIAorICAgIGZvciB5b3VyIHJvbGUgPGNvZGU+UHJpbmNpcGFsczwvY29kZT4uPC9wPgorICA8L2F0dHJpYnV0ZT4KKworPC9hdHRyaWJ1dGVzPgorCis8aDM+RXhhbXBsZTwvaDM+CisKKzxwPkhlcmUgaXMgYW4gZXhhbXBsZSBvZiBob3cgeW91ciBzZXJ2ZXIueG1sIHNuaXBwZXQgc2hvdWxkIGxvb2suPC9wPgorCis8c291cmNlPgorJmx0O1JlYWxtIGNsYXNzTmFtZT0ib3JnLmFwYWNoZS5jYXRhbGluYS5yZWFsbS5KQUFTUmVhbG0iICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBhcHBOYW1lPSJNeUZvb1JlYWxtIiAgICAgICAKKyAgICB1c2VyQ2xhc3NOYW1lcz0ib3JnLmZvb2Jhci5yZWFsbS5Gb29Vc2VyIiAgICAgICAKKyAgICAgcm9sZUNsYXNzTmFtZXM9Im9yZy5mb29iYXIucmVhbG0uRm9vUm9sZSIgCisgICAgICAgICAgICAgICAgICAgICAgZGVidWc9Ijk5Ii8mZ3Q7Cis8L3NvdXJjZT4KKworPHA+SXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHlvdXIgbG9naW4gbW9kdWxlIHRvIGNyZWF0ZSBhbmQgc2F2ZSBVc2VyIGFuZCAKK1JvbGUgb2JqZWN0cyByZXByZXNlbnRpbmcgUHJpbmNpcGFscyBmb3IgdGhlIHVzZXIgCisoPGNvZGU+amF2YXguc2VjdXJpdHkuYXV0aC5TdWJqZWN0PC9jb2RlPikuIElmIHlvdXIgbG9naW4gbW9kdWxlIGRvZXNuJ3QgCitjcmVhdGUgYSB1c2VyIG9iamVjdCBidXQgYWxzbyBkb2Vzbid0IHRocm93IGEgbG9naW4gZXhjZXB0aW9uLCB0aGVuIHRoZSAKK1RvbWNhdCBDTUEgd2lsbCBicmVhayBhbmQgeW91IHdpbGwgYmUgbGVmdCBhdCB0aGUgCitodHRwOi8vbG9jYWxob3N0OjgwODAvbXlhcHAval9zZWN1cml0eV9jaGVjayBVUkkgb3IgYXQgc29tZSBvdGhlciAKK3Vuc3BlY2lmaWVkIGxvY2F0aW9uLjwvcD4KKworICAgICAgICA8cD5UaGUgZmxleGliaWxpdHkgb2YgdGhlIEpBQVMgYXBwcm9hY2ggaXMgdHdvLWZvbGQ6IDwvcD4KKyAgICAgICAgPHVsPgorICAgICAgICAgIDxsaT55b3UgY2FuIGNhcnJ5IG91dCB3aGF0ZXZlciBwcm9jZXNzaW5nIHlvdSByZXF1aXJlIGJlaGluZAordGhlIHNjZW5lcyBpbiB5b3VyIG93biBsb2dpbiBtb2R1bGUuPC9saT4KKyAgICAgICAgICA8bGk+eW91IGNhbiBwbHVnIGluIGEgY29tcGxldGVseSBkaWZmZXJlbnQgTG9naW5Nb2R1bGUgYnkgY2hhbmdpbmcgdGhlIGNvbmZpZ3VyYXRpb24gCithbmQgcmVzdGFydGluZyB0aGUgc2VydmVyLCB3aXRob3V0IGFueSBjb2RlIGNoYW5nZXMgdG8geW91ciBhcHBsaWNhdGlvbi48L2xpPgorICAgICAgICA8L3VsPgorCisgICAgICAgIDxoMz5BZGRpdGlvbmFsIE5vdGVzPC9oMz4KKyAgICAgICAgPHVsPgorICAgICAgICAgIDxsaT5XaGVuIGEgdXNlciBhdHRlbXB0cyB0byBhY2Nlc3MgYSBwcm90ZWN0ZWQgcmVzb3VyY2UgZm9yCisgICAgICAgICAgICAgIHRoZSBmaXJzdCB0aW1lLCBUb21jYXQgNCB3aWxsIGNhbGwgdGhlIDxjb2RlPmF1dGhlbnRpY2F0ZSgpPC9jb2RlPgorICAgICAgICAgICAgICBtZXRob2Qgb2YgdGhpcyA8Y29kZT5SZWFsbTwvY29kZT4uICBUaHVzLCBhbnkgY2hhbmdlcyB5b3UgaGF2ZSBtYWRlIGluCisgICAgICAgICAgICAgIHRoZSBzZWN1cml0eSBtZWNoYW5pc20gZGlyZWN0bHkgKG5ldyB1c2VycywgY2hhbmdlZCBwYXNzd29yZHMgb3IKKyAgICAgICAgICAgICAgcm9sZXMsIGV0Yy4pIHdpbGwgYmUgaW1tZWRpYXRlbHkgcmVmbGVjdGVkLjwvbGk+CisgICAgICAgICAgPGxpPk9uY2UgYSB1c2VyIGhhcyBiZWVuIGF1dGhlbnRpY2F0ZWQsIHRoZSB1c2VyIChhbmQgaGlzIG9yCisgICAgICAgICAgICAgIGhlciBhc3NvY2lhdGVkIHJvbGVzKSBhcmUgY2FjaGVkIHdpdGhpbiBUb21jYXQgZm9yIHRoZSBkdXJhdGlvbiBvZgorICAgICAgICAgICAgICB0aGUgdXNlcidzIGxvZ2luLiAgRm9yIEZPUk0tYmFzZWQgYXV0aGVudGljYXRpb24sIHRoYXQgbWVhbnMgdW50aWwKKyAgICAgICAgICAgICAgdGhlIHNlc3Npb24gdGltZXMgb3V0IG9yIGlzIGludmFsaWRhdGVkOyBmb3IgQkFTSUMgYXV0aGVudGljYXRpb24sCisgICAgICAgICAgICAgIHRoYXQgbWVhbnMgdW50aWwgdGhlIHVzZXIgY2xvc2VzIHRoZWlyIGJyb3dzZXIuICBBbnkgY2hhbmdlcyB0byB0aGUKKyAgICAgICAgICAgICAgc2VjdXJpdHkgaW5mb3JtYXRpb24gZm9yIGFuIGFscmVhZHkgYXV0aGVudGljYXRlZCB1c2VyIHdpbGwgPHN0cm9uZz5ub3Q8L3N0cm9uZz4KKyAgICAgICAgICAgICAgYmUgcmVmbGVjdGVkIHVudGlsIHRoZSBuZXh0IHRpbWUgdGhhdCB1c2VyIGxvZ3Mgb24gYWdhaW4uPC9saT4KKyAgICAgICAgPC91bD4KKworPC9zdWJzZWN0aW9uPgorCisKKzwvc2VjdGlvbj4KKworPC9ib2R5PgorCis8L2RvY3VtZW50PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9zZWN1cml0eS1tYW5hZ2VyLWhvd3RvLnhtbCBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3Mvc2VjdXJpdHktbWFuYWdlci1ob3d0by54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdlZmIwYwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3Mvc2VjdXJpdHktbWFuYWdlci1ob3d0by54bWwKQEAgLTAsMCArMSwzODMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCFET0NUWVBFIGRvY3VtZW50IFsKKyAgPCFFTlRJVFkgcHJvamVjdCBTWVNURU0gInByb2plY3QueG1sIj4KK10+Cis8ZG9jdW1lbnQgdXJsPSJzZWN1cml0eS1tYW5hZ2VyLWhvd3RvLmh0bWwiPgorCisgICAgJnByb2plY3Q7CisKKyAgICA8cHJvcGVydGllcz4KKyAgICAgICAgPGF1dGhvciBlbWFpbD0iZ2xlbm5Adm95YWdlci5hcGcubW9yZS5uZXQiPkdsZW5uIE5pZWxzZW48L2F1dGhvcj4KKyAgICAgICAgPGF1dGhvciBlbWFpbD0iamVhbmZyYW5jb2lzLmFyY2FuZEBzdW4uY29tIj5KZWFuLUZyYW5jb2lzIEFyY2FuZDwvYXV0aG9yPgorICAgICAgICA8dGl0bGU+U2VjdXJpdHkgTWFuYWdlciBIT1ctVE88L3RpdGxlPgorICAgIDwvcHJvcGVydGllcz4KKworPGJvZHk+CisKKworPHNlY3Rpb24gbmFtZT0iQmFja2dyb3VuZCI+CisKKyAgPHA+VGhlIEphdmEgPHN0cm9uZz5TZWN1cml0eU1hbmFnZXI8L3N0cm9uZz4gaXMgd2hhdCBhbGxvd3MgYSB3ZWIgYnJvd3NlcgorICB0byBydW4gYW4gYXBwbGV0IGluIGl0cyBvd24gc2FuZGJveCB0byBwcmV2ZW50IHVudHJ1c3RlZCBjb2RlIGZyb20KKyAgYWNjZXNzaW5nIGZpbGVzIG9uIHRoZSBsb2NhbCBmaWxlIHN5c3RlbSwgY29ubmVjdGluZyB0byBhIGhvc3Qgb3RoZXIKKyAgdGhhbiB0aGUgb25lIHRoZSBhcHBsZXQgd2FzIGxvYWRlZCBmcm9tLCBhbmQgc28gb24uICBJbiB0aGUgc2FtZSB3YXkKKyAgdGhlIFNlY3VyaXR5TWFuYWdlciBwcm90ZWN0cyB5b3UgZnJvbSBhbiB1bnRydXN0ZWQgYXBwbGV0IHJ1bm5pbmcgaW4KKyAgeW91ciBicm93c2VyLCB1c2Ugb2YgYSBTZWN1cml0eU1hbmFnZXIgd2hpbGUgcnVubmluZyBUb21jYXQgY2FuIHByb3RlY3QKKyAgeW91ciBzZXJ2ZXIgZnJvbSB0cm9qYW4gc2VydmxldHMsIEpTUHMsIEpTUCBiZWFucywgYW5kIHRhZyBsaWJyYXJpZXMuCisgIE9yIGV2ZW4gaW5hZHZlcnRlbnQgbWlzdGFrZXMuPC9wPgorCisgIDxwPkltYWdpbmUgaWYgc29tZW9uZSB3aG8gaXMgYXV0aG9yaXplZCB0byBwdWJsaXNoIEpTUHMgb24geW91ciBzaXRlCisgIGluYWR2ZXJ0ZW50bHkgaW5jbHVkZWQgdGhlIGZvbGxvd2luZyBpbiB0aGVpciBKU1A6PC9wPgorPHNvdXJjZT4KKyZsdDslIFN5c3RlbS5leGl0KDEpOyAlJmd0OworPC9zb3VyY2U+CisKKyAgPHA+RXZlcnkgdGltZSB0aGlzIEpTUCB3YXMgZXhlY3V0ZWQgYnkgVG9tY2F0LCBUb21jYXQgd291bGQgZXhpdC4KKyAgVXNpbmcgdGhlIEphdmEgU2VjdXJpdHlNYW5hZ2VyIGlzIGp1c3Qgb25lIG1vcmUgbGluZSBvZiBkZWZlbnNlIGEKKyAgc3lzdGVtIGFkbWluaXN0cmF0b3IgY2FuIHVzZSB0byBrZWVwIHRoZSBzZXJ2ZXIgc2VjdXJlIGFuZCByZWxpYWJsZS48L3A+CisKKyAgPHA+PHN0cm9uZz5XQVJOSU5HPC9zdHJvbmc+IC0gQSBzZWN1cml0eSBhdWRpdAorICBoYXZlIGJlZW4gY29uZHVjdGVkIHVzaW5nIHRoZSBUb21jYXQgNSBjb2RlYmFzZS4gTW9zdCBvZiB0aGUgY3JpdGljYWwKKyAgcGFja2FnZSBoYXZlIGJlZW4gcHJvdGVjdGVkIGFuZCBhIG5ldyBzZWN1cml0eSBwYWNrYWdlIHByb3RlY3Rpb24gbWVjaGFuaXNtIAorICBoYXMgYmVlbiBpbXBsZW1lbnRlZC4gU3RpbGwsIG1ha2Ugc3VyZSB0aGF0IHlvdSBhcmUgc2F0aXNmaWVkIHdpdGggeW91ciBTZWN1cml0eU1hbmFnZXIgCisgIGNvbmZpZ3VyYXRpb24gYmVmb3JlIGFsbG93aW5nIHVudHJ1c3RlZCB1c2VycyB0byBwdWJsaXNoIHdlYiBhcHBsaWNhdGlvbnMsIAorICBKU1BzLCBzZXJ2bGV0cywgYmVhbnMsIG9yIHRhZyBsaWJyYXJpZXMuICA8c3Ryb25nPkhvd2V2ZXIsIHJ1bm5pbmcgd2l0aCBhIAorICBTZWN1cml0eU1hbmFnZXIgaXMgZGVmaW5pdGVseSBiZXR0ZXIgdGhhbiBydW5uaW5nIHdpdGhvdXQgb25lLjwvc3Ryb25nPjwvcD4KKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IlBlcm1pc3Npb25zIj4KKworICA8cD5QZXJtaXNzaW9uIGNsYXNzZXMgYXJlIHVzZWQgdG8gZGVmaW5lIHdoYXQgUGVybWlzc2lvbnMgYSBjbGFzcyBsb2FkZWQKKyAgYnkgVG9tY2F0IHdpbGwgaGF2ZS4gIFRoZXJlIGFyZSBhIG51bWJlciBvZiBQZXJtaXNzaW9uIGNsYXNzZXMgdGhhdCBhcmUKKyAgYSBzdGFuZGFyZCBwYXJ0IG9mIHRoZSBKREssIGFuZCB5b3UgY2FuIGNyZWF0ZSB5b3VyIG93biBQZXJtaXNzaW9uIGNsYXNzCisgIGZvciB1c2UgaW4geW91ciBvd24gd2ViIGFwcGxpY2F0aW9ucy4gIEJvdGggdGVjaG5pcXVlcyBhcmUgdXNlZCBpbgorICBUb21jYXQgNS48L3A+CisKKworICA8c3Vic2VjdGlvbiBuYW1lPSJTdGFuZGFyZCBQZXJtaXNzaW9ucyI+CisKKyAgICA8cD5UaGlzIGlzIGp1c3QgYSBzaG9ydCBzdW1tYXJ5IG9mIHRoZSBzdGFuZGFyZCBzeXN0ZW0gU2VjdXJpdHlNYW5hZ2VyCisgICAgUGVybWlzc2lvbiBjbGFzc2VzIGFwcGxpY2FibGUgdG8gVG9tY2F0LiAgU2VlCisgICAgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9zZWN1cml0eS8iPmh0dHA6Ly9qYXZhLnN1bi5jb20vc2VjdXJpdHkvPC9hPgorICAgIGZvciBtb3JlIGluZm9ybWF0aW9uLjwvcD4KKworICAgIDx1bD4KKyAgICA8bGk+PHN0cm9uZz5qYXZhLnV0aWwuUHJvcGVydHlQZXJtaXNzaW9uPC9zdHJvbmc+IC0gQ29udHJvbHMgcmVhZC93cml0ZQorICAgICAgICBhY2Nlc3MgdG8gSlZNIHByb3BlcnRpZXMgc3VjaCBhcyA8Y29kZT5qYXZhLmhvbWU8L2NvZGU+LjwvbGk+CisgICAgPGxpPjxzdHJvbmc+amF2YS5sYW5nLlJ1bnRpbWVQZXJtaXNzaW9uPC9zdHJvbmc+IC0gQ29udHJvbHMgdXNlIG9mCisgICAgICAgIHNvbWUgU3lzdGVtL1J1bnRpbWUgZnVuY3Rpb25zIGxpa2UgPGNvZGU+ZXhpdCgpPC9jb2RlPiBhbmQKKyAgICAgICAgPGNvZGU+ZXhlYygpPC9jb2RlPi4gQWxzbyBjb250cm9sIHRoZSBwYWNrYWdlIGFjY2Vzcy9kZWZpbml0aW9uLjwvbGk+CisgICAgPGxpPjxzdHJvbmc+amF2YS5pby5GaWxlUGVybWlzc2lvbjwvc3Ryb25nPiAtIENvbnRyb2xzIHJlYWQvd3JpdGUvZXhlY3V0ZQorICAgICAgICBhY2Nlc3MgdG8gZmlsZXMgYW5kIGRpcmVjdG9yaWVzLjwvbGk+CisgICAgPGxpPjxzdHJvbmc+amF2YS5uZXQuU29ja2V0UGVybWlzc2lvbjwvc3Ryb25nPiAtIENvbnRyb2xzIHVzZSBvZgorICAgICAgICBuZXR3b3JrIHNvY2tldHMuPC9saT4KKyAgICA8bGk+PHN0cm9uZz5qYXZhLm5ldC5OZXRQZXJtaXNzaW9uPC9zdHJvbmc+IC0gQ29udHJvbHMgdXNlIG9mCisgICAgICAgIG11bHRpY2FzdCBuZXR3b3JrIGNvbm5lY3Rpb25zLjwvbGk+CisgICAgPGxpPjxzdHJvbmc+amF2YS5sYW5nLnJlZmxlY3QuUmVmbGVjdFBlcm1pc3Npb248L3N0cm9uZz4gLSBDb250cm9scworICAgICAgICB1c2Ugb2YgcmVmbGVjdGlvbiB0byBkbyBjbGFzcyBpbnRyb3NwZWN0aW9uLjwvbGk+CisgICAgPGxpPjxzdHJvbmc+amF2YS5zZWN1cml0eS5TZWN1cml0eVBlcm1pc3Npb248L3N0cm9uZz4gLSBDb250cm9scyBhY2Nlc3MKKyAgICAgICAgdG8gU2VjdXJpdHkgbWV0aG9kcy48L2xpPgorICAgIDxsaT48c3Ryb25nPmphdmEuc2VjdXJpdHkuQWxsUGVybWlzc2lvbjwvc3Ryb25nPiAtIEFsbG93cyBhY2Nlc3MgdG8gYWxsCisgICAgICAgIHBlcm1pc3Npb25zLCBqdXN0IGFzIGlmIHlvdSB3ZXJlIHJ1bm5pbmcgVG9tY2F0IHdpdGhvdXQgYQorICAgICAgICBTZWN1cml0eU1hbmFnZXIuPC9saT4KKyAgICA8L3VsPgorCisgIDwvc3Vic2VjdGlvbj4KKworCisgIDxzdWJzZWN0aW9uIG5hbWU9IlRvbWNhdCBDdXN0b20gUGVybWlzc2lvbnMiPgorCisgICAgPHA+VG9tY2F0IHV0aWxpemVzIGEgY3VzdG9tIHBlcm1pc3Npb24gY2xhc3MgY2FsbGVkCisgICAgPHN0cm9uZz5vcmcuYXBhY2hlLm5hbWluZy5KbmRpUGVybWlzc2lvbjwvc3Ryb25nPi4gIFRoaXMgcGVybWlzc2lvbgorICAgIGNvbnRyb2xzIHJlYWQgYWNjZXNzIHRvIEpOREkgbmFtZWQgZmlsZSBiYXNlZCByZXNvdXJjZXMuICBUaGUgcGVybWlzc2lvbgorICAgIG5hbWUgaXMgdGhlIEpOREkgbmFtZSBhbmQgdGhlcmUgYXJlIG5vIGFjdGlvbnMuICBBIHRyYWlsaW5nICIqIiBjYW4gYmUKKyAgICB1c2VkIHRvIGRvIHdpbGQgY2FyZCBtYXRjaGluZyBmb3IgYSBKTkRJIG5hbWVkIGZpbGUgcmVzb3VyY2Ugd2hlbgorICAgIGdyYW50aW5nIHBlcm1pc3Npb24uICBGb3IgZXhhbXBsZSwgeW91IG1pZ2h0IGluY2x1ZGUgdGhlIGZvbGxvd2luZworICAgIGluIHlvdXIgcG9saWN5IGZpbGU6PC9wPgorPHNvdXJjZT4KK3Blcm1pc3Npb24gIG9yZy5hcGFjaGUubmFtaW5nLkpuZGlQZXJtaXNzaW9uICAiam5kaTovL2xvY2FsaG9zdC9leGFtcGxlcy8qIjsKKzwvc291cmNlPgorCisgICAgPHA+QSBQZXJtaXNzaW9uIGVudHJ5IGxpa2UgdGhpcyBpcyBnZW5lcmF0ZWQgZHluYW1pY2FsbHkgZm9yIGVhY2ggd2ViCisgICAgYXBwbGljYXRpb24gdGhhdCBpcyBkZXBsb3llZCwgdG8gYWxsb3cgaXQgdG8gcmVhZCBpdHMgb3duIHN0YXRpYyByZXNvdXJjZXMKKyAgICBidXQgZGlzYWxsb3cgaXQgZnJvbSB1c2luZyBmaWxlIGFjY2VzcyB0byByZWFkIGFueSBvdGhlciBmaWxlcyAodW5sZXNzCisgICAgcGVybWlzc2lvbnMgZm9yIHRob3NlIGZpbGVzIGFyZSBleHBsaWNpdGx5IGdyYW50ZWQpLjwvcD4KKworICAgIDxwPkFsc28sIFRvbWNhdCBhbHdheXMgZHluYW1pY2FsbHkgY3JlYXRlcyB0aGUgZm9sbG93aW5nIGZpbGUgcGVybWlzc2lvbjo8L3A+Cis8c291cmNlPiAgCitwZXJtaXNzaW9uIGphdmEuaW8uRmlsZVBlcm1pc3Npb24gIioqIHlvdXIgYXBwbGljYXRpb24gY29udGV4dCoqIiwgInJlYWQiOworPC9zb3VyY2U+ICAKKyAgICA8cD5XaGVyZSAqKnlvdXIgYXBwbGljYXRpb24gY29udGV4dCoqIGVxdWFscyB0aGUgZm9sZGVyKG9yIFdBUiBmaWxlKSB1bmRlciB3aGljaCAKKyAgICB5b3VyIGFwcGxpY2F0aW9uIGhhcyBiZWVuIGRlcGxveWVkLiA8L3A+ICAKKworICA8L3N1YnNlY3Rpb24+CisKKworPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIG5hbWU9IkNvbmZpZ3VyaW5nIFRvbWNhdCBXaXRoIEEgU2VjdXJpdHlNYW5hZ2VyIj4KKworICA8aDM+UG9saWN5IEZpbGUgRm9ybWF0PC9oMz4KKworICA8cD5UaGUgc2VjdXJpdHkgcG9saWNpZXMgaW1wbGVtZW50ZWQgYnkgdGhlIEphdmEgU2VjdXJpdHlNYW5hZ2VyIGFyZQorICBjb25maWd1cmVkIGluIHRoZSA8Y29kZT4kQ0FUQUxJTkFfSE9NRS9jb25mL2NhdGFsaW5hLnBvbGljeTwvY29kZT4gZmlsZS4KKyAgVGhpcyBmaWxlIGNvbXBsZXRlbHkgcmVwbGFjZXMgdGhlIDxjb2RlPmphdmEucG9saWN5PC9jb2RlPiBmaWxlIHByZXNlbnQKKyAgaW4geW91ciBKREsgc3lzdGVtIGRpcmVjdG9yaWVzLiAgVGhlIDxjb2RlPmNhdGFsaW5hLnBvbGljeTwvY29kZT4gZmlsZQorICBjYW4gYmUgZWRpdGVkIGJ5IGhhbmQsIG9yIHlvdSBjYW4gdXNlIHRoZQorICA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL2pkay8xLjIvZG9jcy90b29sZG9jcy9zb2xhcmlzL3BvbGljeXRvb2wuaHRtbCI+cG9saWN5dG9vbDwvYT4KKyAgYXBwbGljYXRpb24gdGhhdCBjb21lcyB3aXRoIEphdmEgMS4yIG9yIGxhdGVyLjwvcD4KKworICA8cD5FbnRyaWVzIGluIHRoZSA8Y29kZT5jYXRhbGluYS5wb2xpY3k8L2NvZGU+IGZpbGUgdXNlIHRoZSBzdGFuZGFyZAorICA8Y29kZT5qYXZhLnBvbGljeTwvY29kZT4gZmlsZSBmb3JtYXQsIGFzIGZvbGxvd3M6PC9wPgorPHNvdXJjZT4KKy8vIEV4YW1wbGUgcG9saWN5IGZpbGUgZW50cnkKKworZ3JhbnQgW3NpZ25lZEJ5ICZsdDtzaWduZXImZ3Q7LF0gW2NvZGVCYXNlICZsdDtjb2RlIHNvdXJjZSZndDtdIHsKKyAgcGVybWlzc2lvbiAgJmx0O2NsYXNzJmd0OyAgWyZsdDtuYW1lJmd0OyBbLCAmbHQ7YWN0aW9uIGxpc3QmZ3Q7XV07Cit9OworPC9zb3VyY2U+CisKKyAgPHA+VGhlIDxzdHJvbmc+c2lnbmVkQnk8L3N0cm9uZz4gYW5kIDxzdHJvbmc+Y29kZUJhc2U8L3N0cm9uZz4gZW50cmllcyBhcmUKKyAgb3B0aW9uYWwgd2hlbiBncmFudGluZyBwZXJtaXNzaW9ucy4gIENvbW1lbnQgbGluZXMgYmVnaW4gd2l0aCAiLy8iIGFuZAorICBlbmQgYXQgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBsaW5lLiAgVGhlIDxjb2RlPmNvZGVCYXNlPC9jb2RlPiBpcyBpbiB0aGUKKyAgZm9ybSBvZiBhIFVSTCwgYW5kIGZvciBhIGZpbGUgVVJMIGNhbiB1c2UgdGhlIDxjb2RlPiR7amF2YS5ob21lfTwvY29kZT4KKyAgYW5kIDxjb2RlPiR7Y2F0YWxpbmEuaG9tZX08L2NvZGU+IHByb3BlcnRpZXMgKHdoaWNoIGFyZSBleHBhbmRlZCBvdXQgdG8KKyAgdGhlIGRpcmVjdG9yeSBwYXRocyBkZWZpbmVkIGZvciB0aGVtIGJ5IHRoZSA8Y29kZT5KQVZBX0hPTUU8L2NvZGU+IGFuZAorICA8Y29kZT5DQVRBTElOQV9IT01FPC9jb2RlPiBlbnZpcm9ubWVudCB2YXJpYWJsZXMpLjwvcD4KKworICA8aDM+VGhlIERlZmF1bHQgUG9saWN5IEZpbGU8L2gzPgorCisgIDxwPlRoZSBkZWZhdWx0IDxjb2RlPiRDQVRBTElOQV9IT01FL2NvbmYvY2F0YWxpbmEucG9saWN5PC9jb2RlPiBmaWxlCisgIGxvb2tzIGxpa2UgdGhpczo8L3A+Cis8c291cmNlPgorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gY2F0YWxpbmEuY29yZXBvbGljeSAtIFNlY3VyaXR5IFBvbGljeSBQZXJtaXNzaW9ucyBmb3IgVG9tY2F0IDUKKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgYSBkZWZhdWx0IHNldCBvZiBzZWN1cml0eSBwb2xpY2llcyB0byBiZSBlbmZvcmNlZCAoYnkgdGhlCisvLyBKVk0pIHdoZW4gQ2F0YWxpbmEgaXMgZXhlY3V0ZWQgd2l0aCB0aGUgIi1zZWN1cml0eSIgb3B0aW9uLiAgSW4gYWRkaXRpb24KKy8vIHRvIHRoZSBwZXJtaXNzaW9ucyBncmFudGVkIGhlcmUsIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBwZXJtaXNzaW9ucyBhcmUKKy8vIGdyYW50ZWQgdG8gdGhlIGNvZGViYXNlIHNwZWNpZmljIHRvIGVhY2ggd2ViIGFwcGxpY2F0aW9uOgorLy8KKy8vICogUmVhZCBhY2Nlc3MgdG8gdGhlIGRvY3VtZW50IHJvb3QgZGlyZWN0b3J5CisvLworLy8gJElkJAorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisKKy8vID09PT09PT09PT0gU1lTVEVNIENPREUgUEVSTUlTU0lPTlMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCisvLyBUaGVzZSBwZXJtaXNzaW9ucyBhcHBseSB0byBqYXZhYworZ3JhbnQgY29kZUJhc2UgImZpbGU6JHtqYXZhLmhvbWV9L2xpYi8tIiB7CisgICAgICAgIHBlcm1pc3Npb24gamF2YS5zZWN1cml0eS5BbGxQZXJtaXNzaW9uOworfTsKKworLy8gVGhlc2UgcGVybWlzc2lvbnMgYXBwbHkgdG8gYWxsIHNoYXJlZCBzeXN0ZW0gZXh0ZW5zaW9ucworZ3JhbnQgY29kZUJhc2UgImZpbGU6JHtqYXZhLmhvbWV9L2pyZS9saWIvZXh0Ly0iIHsKKyAgICAgICAgcGVybWlzc2lvbiBqYXZhLnNlY3VyaXR5LkFsbFBlcm1pc3Npb247Cit9OworCisvLyBUaGVzZSBwZXJtaXNzaW9ucyBhcHBseSB0byBqYXZhYyB3aGVuICR7amF2YS5ob21lXSBwb2ludHMgYXQgJEpBVkFfSE9NRS9qcmUKK2dyYW50IGNvZGVCYXNlICJmaWxlOiR7amF2YS5ob21lfS8uLi9saWIvLSIgeworICAgICAgICBwZXJtaXNzaW9uIGphdmEuc2VjdXJpdHkuQWxsUGVybWlzc2lvbjsKK307CisKKy8vIFRoZXNlIHBlcm1pc3Npb25zIGFwcGx5IHRvIGFsbCBzaGFyZWQgc3lzdGVtIGV4dGVuc2lvbnMgd2hlbgorLy8gJHtqYXZhLmhvbWV9IHBvaW50cyBhdCAkSkFWQV9IT01FL2pyZQorZ3JhbnQgY29kZUJhc2UgImZpbGU6JHtqYXZhLmhvbWV9L2xpYi9leHQvLSIgeworICAgICAgICBwZXJtaXNzaW9uIGphdmEuc2VjdXJpdHkuQWxsUGVybWlzc2lvbjsKK307CisKKworLy8gPT09PT09PT09PSBDQVRBTElOQSBDT0RFIFBFUk1JU1NJT05TID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisKKy8vIFRoZXNlIHBlcm1pc3Npb25zIGFwcGx5IHRvIHRoZSBsYXVuY2hlciBjb2RlCitncmFudCBjb2RlQmFzZSAiZmlsZToke2NhdGFsaW5hLmhvbWV9L2Jpbi9jb21tb25zLWxhdW5jaGVyLmphciIgeworICAgICAgICBwZXJtaXNzaW9uIGphdmEuc2VjdXJpdHkuQWxsUGVybWlzc2lvbjsKK307CisKKy8vIFRoZXNlIHBlcm1pc3Npb25zIGFwcGx5IHRvIHRoZSBzZXJ2ZXIgc3RhcnR1cCBjb2RlCitncmFudCBjb2RlQmFzZSAiZmlsZToke2NhdGFsaW5hLmhvbWV9L2Jpbi9ib290c3RyYXAuamFyIiB7CisgICAgICAgIHBlcm1pc3Npb24gamF2YS5zZWN1cml0eS5BbGxQZXJtaXNzaW9uOworfTsKKworLy8gVGhlc2UgcGVybWlzc2lvbnMgYXBwbHkgdG8gdGhlIHNlcnZsZXQgQVBJIGNsYXNzZXMKKy8vIGFuZCB0aG9zZSB0aGF0IGFyZSBzaGFyZWQgYWNyb3NzIGFsbCBjbGFzcyBsb2FkZXJzCisvLyBsb2NhdGVkIGluIHRoZSAiY29tbW9uIiBkaXJlY3RvcnkKK2dyYW50IGNvZGVCYXNlICJmaWxlOiR7Y2F0YWxpbmEuaG9tZX0vY29tbW9uLy0iIHsKKyAgICAgICAgcGVybWlzc2lvbiBqYXZhLnNlY3VyaXR5LkFsbFBlcm1pc3Npb247Cit9OworCisvLyBUaGVzZSBwZXJtaXNzaW9ucyBhcHBseSB0byB0aGUgY29udGFpbmVyJ3MgY29yZSBjb2RlLCBwbHVzIGFueSBhZGRpdGlvbmFsCisvLyBsaWJyYXJpZXMgaW5zdGFsbGVkIGluIHRoZSAic2VydmVyIiBkaXJlY3RvcnkKK2dyYW50IGNvZGVCYXNlICJmaWxlOiR7Y2F0YWxpbmEuaG9tZX0vc2VydmVyLy0iIHsKKyAgICAgICAgcGVybWlzc2lvbiBqYXZhLnNlY3VyaXR5LkFsbFBlcm1pc3Npb247Cit9OworCisvLyA9PT09PT09PT09IFdFQiBBUFBMSUNBVElPTiBQRVJNSVNTSU9OUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKworLy8gVGhlc2UgcGVybWlzc2lvbnMgYXJlIGdyYW50ZWQgYnkgZGVmYXVsdCB0byBhbGwgd2ViIGFwcGxpY2F0aW9ucworLy8gSW4gYWRkaXRpb24sIGEgd2ViIGFwcGxpY2F0aW9uIHdpbGwgYmUgZ2l2ZW4gYSByZWFkIEZpbGVQZXJtaXNzaW9uCisvLyBhbmQgSm5kaVBlcm1pc3Npb24gZm9yIGFsbCBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgaW4gaXRzIGRvY3VtZW50IHJvb3QuCitncmFudCB7IAorICAgICAgICAvLyBSZXF1aXJlZCBmb3IgSk5ESSBsb29rdXAgb2YgbmFtZWQgSkRCQyBEYXRhU291cmNlJ3MgYW5kCisgICAgICAgIC8vIGphdmFtYWlsIG5hbWVkIE1pbWVQYXJ0IERhdGFTb3VyY2UgdXNlZCB0byBzZW5kIG1haWwKKyAgICAgICAgcGVybWlzc2lvbiBqYXZhLnV0aWwuUHJvcGVydHlQZXJtaXNzaW9uICJqYXZhLmhvbWUiLCAicmVhZCI7CisgICAgICAgIHBlcm1pc3Npb24gamF2YS51dGlsLlByb3BlcnR5UGVybWlzc2lvbiAiamF2YS5uYW1pbmcuKiIsICJyZWFkIjsKKyAgICAgICAgcGVybWlzc2lvbiBqYXZhLnV0aWwuUHJvcGVydHlQZXJtaXNzaW9uICJqYXZheC5zcWwuKiIsICJyZWFkIjsKKworICAgICAgICAvLyBPUyBTcGVjaWZpYyBwcm9wZXJ0aWVzIHRvIGFsbG93IHJlYWQgYWNjZXNzCisJcGVybWlzc2lvbiBqYXZhLnV0aWwuUHJvcGVydHlQZXJtaXNzaW9uICJvcy5uYW1lIiwgInJlYWQiOworCXBlcm1pc3Npb24gamF2YS51dGlsLlByb3BlcnR5UGVybWlzc2lvbiAib3MudmVyc2lvbiIsICJyZWFkIjsKKwlwZXJtaXNzaW9uIGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24gIm9zLmFyY2giLCAicmVhZCI7CisJcGVybWlzc2lvbiBqYXZhLnV0aWwuUHJvcGVydHlQZXJtaXNzaW9uICJmaWxlLnNlcGFyYXRvciIsICJyZWFkIjsKKwlwZXJtaXNzaW9uIGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24gInBhdGguc2VwYXJhdG9yIiwgInJlYWQiOworCXBlcm1pc3Npb24gamF2YS51dGlsLlByb3BlcnR5UGVybWlzc2lvbiAibGluZS5zZXBhcmF0b3IiLCAicmVhZCI7CisKKyAgICAgICAgLy8gSlZNIHByb3BlcnRpZXMgdG8gYWxsb3cgcmVhZCBhY2Nlc3MKKyAgICAgICAgcGVybWlzc2lvbiBqYXZhLnV0aWwuUHJvcGVydHlQZXJtaXNzaW9uICJqYXZhLnZlcnNpb24iLCAicmVhZCI7CisgICAgICAgIHBlcm1pc3Npb24gamF2YS51dGlsLlByb3BlcnR5UGVybWlzc2lvbiAiamF2YS52ZW5kb3IiLCAicmVhZCI7CisgICAgICAgIHBlcm1pc3Npb24gamF2YS51dGlsLlByb3BlcnR5UGVybWlzc2lvbiAiamF2YS52ZW5kb3IudXJsIiwgInJlYWQiOworICAgICAgICBwZXJtaXNzaW9uIGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24gImphdmEuY2xhc3MudmVyc2lvbiIsICJyZWFkIjsKKwlwZXJtaXNzaW9uIGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24gImphdmEuc3BlY2lmaWNhdGlvbi52ZXJzaW9uIiwgInJlYWQiOworCXBlcm1pc3Npb24gamF2YS51dGlsLlByb3BlcnR5UGVybWlzc2lvbiAiamF2YS5zcGVjaWZpY2F0aW9uLnZlbmRvciIsICJyZWFkIjsKKwlwZXJtaXNzaW9uIGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24gImphdmEuc3BlY2lmaWNhdGlvbi5uYW1lIiwgInJlYWQiOworCisJcGVybWlzc2lvbiBqYXZhLnV0aWwuUHJvcGVydHlQZXJtaXNzaW9uICJqYXZhLnZtLnNwZWNpZmljYXRpb24udmVyc2lvbiIsICJyZWFkIjsKKwlwZXJtaXNzaW9uIGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24gImphdmEudm0uc3BlY2lmaWNhdGlvbi52ZW5kb3IiLCAicmVhZCI7CisJcGVybWlzc2lvbiBqYXZhLnV0aWwuUHJvcGVydHlQZXJtaXNzaW9uICJqYXZhLnZtLnNwZWNpZmljYXRpb24ubmFtZSIsICJyZWFkIjsKKwlwZXJtaXNzaW9uIGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24gImphdmEudm0udmVyc2lvbiIsICJyZWFkIjsKKwlwZXJtaXNzaW9uIGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24gImphdmEudm0udmVuZG9yIiwgInJlYWQiOworCXBlcm1pc3Npb24gamF2YS51dGlsLlByb3BlcnR5UGVybWlzc2lvbiAiamF2YS52bS5uYW1lIiwgInJlYWQiOworCisgICAgICAgIC8vIFJlcXVpcmVkIGZvciBnZXR0aW5nIEJlYW5JbmZvCisgICAgICAgIHBlcm1pc3Npb24gamF2YS5sYW5nLlJ1bnRpbWVQZXJtaXNzaW9uICJhY2Nlc3NDbGFzc0luUGFja2FnZS5zdW4uYmVhbnMuKiI7CisKKyAgICAgICAgLy8gUmVxdWlyZWQgZm9yIE9wZW5KTVgKKyAgICAgICAgcGVybWlzc2lvbiBqYXZhLmxhbmcuUnVudGltZVBlcm1pc3Npb24gImdldEF0dHJpYnV0ZSI7CisKKwkvLyBBbGxvdyByZWFkIG9mIEpBWFAgY29tcGxpYW50IFhNTCBwYXJzZXIgZGVidWcKKwlwZXJtaXNzaW9uIGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24gImpheHAuZGVidWciLCAicmVhZCI7Cit9OworCisKKy8vIFlvdSBjYW4gYXNzaWduIGFkZGl0aW9uYWwgcGVybWlzc2lvbnMgdG8gcGFydGljdWxhciB3ZWIgYXBwbGljYXRpb25zIGJ5CisvLyBhZGRpbmcgYWRkaXRpb25hbCAiZ3JhbnQiIGVudHJpZXMgaGVyZSwgYmFzZWQgb24gdGhlIGNvZGUgYmFzZSBmb3IgdGhhdAorLy8gYXBwbGljYXRpb24sIC9XRUItSU5GL2NsYXNzZXMvLCBvciAvV0VCLUlORi9saWIvIGphciBmaWxlcy4KKy8vCisvLyBEaWZmZXJlbnQgcGVybWlzc2lvbnMgY2FuIGJlIGdyYW50ZWQgdG8gSlNQIHBhZ2VzLCBjbGFzc2VzIGxvYWRlZCBmcm9tCisvLyB0aGUgL1dFQi1JTkYvY2xhc3Nlcy8gZGlyZWN0b3J5LCBhbGwgamFyIGZpbGVzIGluIHRoZSAvV0VCLUlORi9saWIvCisvLyBkaXJlY3RvcnksIG9yIGV2ZW4gdG8gaW5kaXZpZHVhbCBqYXIgZmlsZXMgaW4gdGhlIC9XRUItSU5GL2xpYi8gZGlyZWN0b3J5LgorLy8KKy8vIEZvciBpbnN0YW5jZSwgYXNzdW1lIHRoYXQgdGhlIHN0YW5kYXJkICJleGFtcGxlcyIgYXBwbGljYXRpb24KKy8vIGluY2x1ZGVkIGEgSkRCQyBkcml2ZXIgdGhhdCBuZWVkZWQgdG8gZXN0YWJsaXNoIGEgbmV0d29yayBjb25uZWN0aW9uIHRvIHRoZQorLy8gY29ycmVzcG9uZGluZyBkYXRhYmFzZSBhbmQgdXNlZCB0aGUgc2NyYXBlIHRhZ2xpYiB0byBnZXQgdGhlIHdlYXRoZXIgZnJvbQorLy8gdGhlIE5PQUEgd2ViIHNlcnZlci4gIFlvdSBtaWdodCBjcmVhdGUgYSAiZ3JhbnQiIGVudHJpZXMgbGlrZSB0aGlzOgorLy8KKy8vIFRoZSBwZXJtaXNzaW9ucyBncmFudGVkIHRvIHRoZSBjb250ZXh0IHJvb3QgZGlyZWN0b3J5IGFwcGx5IHRvIEpTUCBwYWdlcy4KKy8vIGdyYW50IGNvZGVCYXNlICJmaWxlOiR7Y2F0YWxpbmEuaG9tZX0vd2ViYXBwcy9leGFtcGxlcy8tIiB7CisvLyAgICAgIHBlcm1pc3Npb24gamF2YS5uZXQuU29ja2V0UGVybWlzc2lvbiAiZGJob3N0Lm15Y29tcGFueS5jb206NTQzMiIsICJjb25uZWN0IjsKKy8vICAgICAgcGVybWlzc2lvbiBqYXZhLm5ldC5Tb2NrZXRQZXJtaXNzaW9uICIqLm5vYWEuZ292OjgwIiwgImNvbm5lY3QiOworLy8gfTsKKy8vCisvLyBUaGUgcGVybWlzc2lvbnMgZ3JhbnRlZCB0byB0aGUgY29udGV4dCBXRUItSU5GL2NsYXNzZXMgZGlyZWN0b3J5CisvLyBncmFudCBjb2RlQmFzZSAiZmlsZToke2NhdGFsaW5hLmhvbWV9L3dlYmFwcHMvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzLy0iIHsKKy8vIH07CisvLworLy8gVGhlIHBlcm1pc3Npb24gZ3JhbnRlZCB0byB5b3VyIEpEQkMgZHJpdmVyCisvLyBncmFudCBjb2RlQmFzZSAiamFyOmZpbGU6JHtjYXRhbGluYS5ob21lfS93ZWJhcHBzL2V4YW1wbGVzL1dFQi1JTkYvbGliL2RyaXZlci5qYXIhLy0iIHsKKy8vICAgICAgcGVybWlzc2lvbiBqYXZhLm5ldC5Tb2NrZXRQZXJtaXNzaW9uICJkYmhvc3QubXljb21wYW55LmNvbTo1NDMyIiwgImNvbm5lY3QiOworLy8gfTsKKy8vIFRoZSBwZXJtaXNzaW9uIGdyYW50ZWQgdG8gdGhlIHNjcmFwZSB0YWdsaWIKKy8vIGdyYW50IGNvZGVCYXNlICJqYXI6ZmlsZToke2NhdGFsaW5hLmhvbWV9L3dlYmFwcHMvZXhhbXBsZXMvV0VCLUlORi9saWIvc2NyYXBlLmphciEvLSIgeworLy8gICAgICBwZXJtaXNzaW9uIGphdmEubmV0LlNvY2tldFBlcm1pc3Npb24gIioubm9hYS5nb3Y6ODAiLCAiY29ubmVjdCI7CisvLyB9OworPC9zb3VyY2U+CisKKyAgPGgzPlN0YXJ0aW5nIFRvbWNhdCBXaXRoIEEgU2VjdXJpdHlNYW5hZ2VyPC9oMz4KKworICA8cD5PbmNlIHlvdSBoYXZlIGNvbmZpZ3VyZWQgdGhlIDxjb2RlPmNhdGFsaW5hLnBvbGljeTwvY29kZT4gZmlsZSBmb3IgdXNlCisgIHdpdGggYSBTZWN1cml0eU1hbmFnZXIsIFRvbWNhdCBjYW4gYmUgc3RhcnRlZCB3aXRoIGEgU2VjdXJpdHlNYW5hZ2VyIGluCisgIHBsYWNlIGJ5IHVzaW5nIHRoZSAiLXNlY3VyaXR5IiBvcHRpb246PC9wPgorPHNvdXJjZT4KKyRDQVRBTElOQV9IT01FL2Jpbi9jYXRhbGluYS5zaCBzdGFydCAtc2VjdXJpdHkgICAgKFVuaXgpCislQ0FUQUxJTkFfSE9NRSVcYmluXGNhdGFsaW5hIHN0YXJ0IC1zZWN1cml0eSAgICAgIChXaW5kb3dzKQorPC9zb3VyY2U+CisKKzwvc2VjdGlvbj4KKzxzZWN0aW9uIG5hbWU9IkNvbmZpZ3VyaW5nIFBhY2thZ2UgUHJvdGVjdGlvbiBpbiBUb21jYXQiPgorICA8cD5TdGFydGluZyB3aXRoIFRvbWNhdCA1LCBpdCBpcyBub3cgcG9zc2libGUgdG8gY29uZmlndXJlIHdoaWNoIFRvbWNhdAorICBpbnRlcm5hbCBwYWNrYWdlIGFyZSBwcm90ZWN0ZWQgYWdhaW50cyBwYWNrYWdlIGRlZmluaXRpb24gYW5kIGFjY2Vzcy4gU2VlCisgIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vc2VjdXJpdHkvc2VjY29kZWd1aWRlLmh0bWwiPgorICAgIGh0dHA6Ly9qYXZhLnN1bi5jb20vc2VjdXJpdHkvc2VjY29kZWd1aWRlLmh0bWw8L2E+CisgICAgZm9yIG1vcmUgaW5mb3JtYXRpb24uPC9wPiAgICAKKworICAKKyAgPHA+PHN0cm9uZz5XQVJOSU5HPC9zdHJvbmc+OiBCZSBhd2FyZSB0aGF0IHJlbW92aW5nIHRoZSBkZWZhdWx0IHBhY2thZ2UgcHJvdGVjdGlvbiAKKyAgY291bGQgcG9zc2libHkgb3BlbiBhIHNlY3VyaXR5IGhvbGU8L3A+CisKKyAgPGgzPlRoZSBEZWZhdWx0IFByb3BlcnRpZXMgRmlsZTwvaDM+CisKKyAgPHA+VGhlIGRlZmF1bHQgPGNvZGU+JENBVEFMSU5BX0hPTUUvY29uZi9jYXRhbGluYS5wcm9wZXJ0aWVzPC9jb2RlPiBmaWxlCisgIGxvb2tzIGxpa2UgdGhpczo8L3A+Cis8c291cmNlPiAgCisjCisjIExpc3Qgb2YgY29tbWEtc2VwYXJhdGVkIHBhY2thZ2VzIHRoYXQgc3RhcnQgd2l0aCBvciBlcXVhbCB0aGlzIHN0cmluZworIyB3aWxsIGNhdXNlIGEgc2VjdXJpdHkgZXhjZXB0aW9uIHRvIGJlIHRocm93biB3aGVuCisjIHBhc3NlZCB0byBjaGVja1BhY2thZ2VBY2Nlc3MgdW5sZXNzIHRoZQorIyBjb3JyZXNwb25kaW5nIFJ1bnRpbWVQZXJtaXNzaW9uICgiYWNjZXNzQ2xhc3NJblBhY2thZ2UuIitwYWNrYWdlKSBoYXMKKyMgYmVlbiBncmFudGVkLgorcGFja2FnZS5hY2Nlc3M9c3VuLixvcmcuYXBhY2hlLmNhdGFsaW5hLixvcmcuYXBhY2hlLmNveW90ZS4sb3JnLmFwYWNoZS50b21jYXQuLAorb3JnLmFwYWNoZS5qYXNwZXIuCisjCisjIExpc3Qgb2YgY29tbWEtc2VwYXJhdGVkIHBhY2thZ2VzIHRoYXQgc3RhcnQgd2l0aCBvciBlcXVhbCB0aGlzIHN0cmluZworIyB3aWxsIGNhdXNlIGEgc2VjdXJpdHkgZXhjZXB0aW9uIHRvIGJlIHRocm93biB3aGVuCisjIHBhc3NlZCB0byBjaGVja1BhY2thZ2VEZWZpbml0aW9uIHVubGVzcyB0aGUKKyMgY29ycmVzcG9uZGluZyBSdW50aW1lUGVybWlzc2lvbiAoImRlZmluZUNsYXNzSW5QYWNrYWdlLiIrcGFja2FnZSkgaGFzCisjIGJlZW4gZ3JhbnRlZC4KKyMKKyMgYnkgZGVmYXVsdCwgbm8gcGFja2FnZXMgYXJlIHJlc3RyaWN0ZWQgZm9yIGRlZmluaXRpb24sIGFuZCBub25lIG9mCisjIHRoZSBjbGFzcyBsb2FkZXJzIHN1cHBsaWVkIHdpdGggdGhlIEpESyBjYWxsIGNoZWNrUGFja2FnZURlZmluaXRpb24uCisjCitwYWNrYWdlLmRlZmluaXRpb249c3VuLixqYXZhLixvcmcuYXBhY2hlLmNhdGFsaW5hLixvcmcuYXBhY2hlLmNveW90ZS4sCitvcmcuYXBhY2hlLnRvbWNhdC4sb3JnLmFwYWNoZS5qYXNwZXIuCis8L3NvdXJjZT4KKyAgPHA+T25jZSB5b3UgaGF2ZSBjb25maWd1cmVkIHRoZSA8Y29kZT5jYXRhbGluYS5wcm9wZXJ0aWVzPC9jb2RlPiBmaWxlIGZvciB1c2UKKyAgd2l0aCBhIFNlY3VyaXR5TWFuYWdlciwgcmVtZW1iZXIgdG8gcmUtc3RhcnQgVG9tY2F0LjwvcD4KKzwvc2VjdGlvbj4KKworPHNlY3Rpb24gbmFtZT0iVHJvdWJsZXNob290aW5nIj4KKworICA8cD5JZiB5b3VyIHdlYiBhcHBsaWNhdGlvbiBhdHRlbXB0cyB0byBleGVjdXRlIGFuIG9wZXJhdGlvbiB0aGF0IGlzCisgIHByb2hpYml0ZWQgYnkgbGFjayBvZiBhIHJlcXVpcmVkIFBlcm1pc3Npb24sIGl0IHdpbGwgdGhyb3cgYW4KKyAgPGNvZGU+QWNjZXNzQ29udHJvTEV4Y2VwdGlvbjwvY29kZT4gb3IgYSA8Y29kZT5TZWN1cml0eUV4Y2VwdGlvbjwvY29kZT4KKyAgd2hlbiB0aGUgU2VjdXJpdHlNYW5hZ2VyIGRldGVjdHMgdGhlIHZpb2xhdGlvbi4gIERlYnVnZ2luZyB0aGUgcGVybWlzc2lvbgorICB0aGF0IGlzIG1pc3NpbmcgY2FuIGJlIGNoYWxsZW5naW5nLCBhbmQgb25lIG9wdGlvbiBpcyB0byB0dXJuIG9uIGRlYnVnCisgIG91dHB1dCBvZiBhbGwgc2VjdXJpdHkgZGVjaXNpb25zIHRoYXQgYXJlIG1hZGUgZHVyaW5nIGV4ZWN1dGlvbi4gIFRoaXMKKyAgaXMgZG9uZSBieSBzZXR0aW5nIGEgc3lzdGVtIHByb3BlcnR5IGJlZm9yZSBzdGFydGluZyBUb21jYXQuICBUaGUgZWFzaWVzdAorICB3YXkgdG8gZG8gdGhpcyBpcyB2aWEgdGhlIDxjb2RlPkNBVEFMSU5BX09QVFM8L2NvZGU+IGVudmlyb25tZW50IHZhcmlhYmxlLgorICBFeGVjdXRlIHRoaXMgY29tbWFuZDo8L3A+Cis8c291cmNlPgorZXhwb3J0IENBVEFMSU5BX09QVFM9LURqYXZhLnNlY3VyaXR5LmRlYnVnPWFsbCAgICAoVW5peCkKK3NldCBDQVRBTElOQV9PUFRTPS1EamF2YS5zZWN1cml0eS5kZWJ1Zz1hbGwgICAgICAgKFdpbmRvd3MpCis8L3NvdXJjZT4KKworICA8cD5iZWZvcmUgc3RhcnRpbmcgVG9tY2F0LjwvcD4KKworICA8cD48c3Ryb25nPldBUk5JTkc8L3N0cm9uZz4gLSBUaGlzIHdpbGwgZ2VuZXJhdGUgPGVtPm1hbnkgbWVnYWJ5dGVzPC9lbT4KKyAgb2Ygb3V0cHV0ISAgSG93ZXZlciwgaXQgY2FuIGhlbHAgeW91IHRyYWNrIGRvd24gcHJvYmxlbXMgYnkgc2VhcmNoaW5nCisgIGZvciB0aGUgd29yZCAiRkFJTEVEIiBhbmQgZGV0ZXJtaW5pbmcgd2hpY2ggcGVybWlzc2lvbiB3YXMgYmVpbmcgY2hlY2tlZAorICBmb3IuICBTZWUgdGhlIEphdmEgc2VjdXJpdHkgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBvcHRpb25zIHRoYXQgeW91IGNhbgorICBzcGVjaWZ5IGhlcmUgYXMgd2VsbC48L3A+CisKKzwvc2VjdGlvbj4KKworCis8L2JvZHk+CisKKzwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9kb2NzL3NldHVwLnhtbCBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3Mvc2V0dXAueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmZjUwNjgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL3NldHVwLnhtbApAQCAtMCwwICsxLDEzMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IURPQ1RZUEUgZG9jdW1lbnQgWworICA8IUVOVElUWSBwcm9qZWN0IFNZU1RFTSAicHJvamVjdC54bWwiPgorXT4KKzxkb2N1bWVudCB1cmw9InNldHVwLmh0bWwiPgorCisgICZwcm9qZWN0OworCisgIDxwcm9wZXJ0aWVzPgorICAgIDxhdXRob3IgZW1haWw9InJlbW1AYXBhY2hlLm9yZyI+UmVteSBNYXVjaGVyYXQ8L2F1dGhvcj4KKyAgICA8dGl0bGU+VG9tY2F0IFNldHVwPC90aXRsZT4KKyAgPC9wcm9wZXJ0aWVzPgorCis8Ym9keT4KKworICA8c2VjdGlvbiBuYW1lPSJJbnRyb2R1Y3Rpb24iPgorCisKKworICA8L3NlY3Rpb24+CisKKyAgPHNlY3Rpb24gbmFtZT0iV2luZG93cyI+CisKKyAgICA8cD4KKyAgICAgIEluc3RhbGxpbmcgVG9tY2F0IG9uIFdpbmRvd3MgY2FuIGJlIGRvbmUgZWFzaWx5IHVzaW5nIHRoZSBXaW5kb3dzIAorICAgICAgaW5zdGFsbGVyLiBJdHMgaW50ZXJmYWNlIGFuZCBmdW5jdGlvbmFsaXR5IGlzIHNpbWlsYXIgdG8gb3RoZXIgd2l6YXJkCisgICAgICBiYXNlZCBpbnN0YWxsZXJzLCB3aXRoIG9ubHkgYSBmZXcgaXRlbXMgb2YgaW50ZXJlc3QuCisgICAgPC9wPgorCisgICAgPHA+CisgICAgICA8dWw+CisgICAgICAgIDxsaT48c3Ryb25nPkluc3RhbGxhdGlvbiBhcyBhIHNlcnZpY2U8L3N0cm9uZz46IFRvbWNhdCB3aWxsIGJlIAorICAgICAgICAgICAgaW5zdGFsbGVkIGFzIGEgV2luZG93cworICAgICAgICAgICAgTlQvMmsvWFAgc2VydmljZSBubyBtYXR0ZXIgd2hhdCBzZXR0aW5nIGlzIHNlbGVjdGVkLiBVc2luZyB0aGUKKyAgICAgICAgICAgIGNoZWNrYm94IG9uIHRoZSBjb21wb25lbnQgcGFnZSBzZXRzIHRoZSBzZXJ2aWNlIGFzICJhdXRvIgorICAgICAgICAgICAgc3RhcnR1cCwgc28gdGhhdCBUb21jYXQgaXMgYXV0b21hdGljYWxseSBzdGFydGVkIHdoZW4gV2luZG93cworICAgICAgICAgICAgc3RhcnRzLiBGb3Igb3B0aW1hbCBzZWN1cml0eSwgdGhlIHNlcnZpY2Ugc2hvdWxkIGJlIHJ1biBhcyBhCisgICAgICAgICAgICBzZXBhcmF0ZSB1c2VyLCB3aXRoIHJlZHVjZWQgcGVybWlzc2lvbnMgKHNlZSB0aGUgV2luZG93cyBTZXJ2aWNlcworICAgICAgICAgICAgYWRtaW5pc3RyYXRpb24gdG9vbCBhbmQgaXRzIGRvY3VtZW50YXRpb24pLjwvbGk+CisgICAgICAgIDxsaT48c3Ryb25nPkphdmEgbG9jYXRpb248L3N0cm9uZz46IFRoZSBpbnN0YWxsZXIgd2lsbCB1c2UgdGhlIHJlZ2lzdHJ5CisgICAgICAgICAgICBvciB0aGUgSkFWQV9IT01FIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIGRldGVybWluZSB0aGUgYmFzZSBwYXRoCisgICAgICAgICAgICBvZiBhIEoyU0UgNSBKUkUuCisgICAgICAgICAgICA8L2xpPgorICAgICAgICA8bGk+PHN0cm9uZz5UcmF5IGljb248L3N0cm9uZz46IFdoZW4gVG9tY2F0IGlzIHJ1biBhcyBhIHNlcnZpY2UsIHRoZXJlCisgICAgICAgICAgICB3aWxsIG5vdCBiZSBhbnkgdHJheSBpY29uIHByZXNlbnQgd2hlbiBUb21jYXQgaXMgcnVubmluZy4gTm90ZSB0aGF0CisgICAgICAgICAgICB3aGVuIGNob29zaW5nIHRvIHJ1biBUb21jYXQgYXQgdGhlIGVuZCBvZiBpbnN0YWxsYXRpb24sIHRoZSB0cmF5CisgICAgICAgICAgICBpY29uIHdpbGwgYmUgdXNlZCBldmVuIGlmIFRvbWNhdCB3YXMgaW5zdGFsbGVkIGFzIGEgc2VydmljZS48L2xpPgorICAgICAgICA8bGk+UmVmZXIgdG8gdGhlCisgICAgICAgICAgICA8YSBocmVmPSJ3aW5kb3dzLXNlcnZpY2UtaG93dG8uaHRtbCI+V2luZG93cyBTZXJ2aWNlIEhPVy1UTzwvYT4KKyAgICAgICAgICAgIGZvciBpbmZvcm1hdGlvbiBvbiBob3cgdG8gbWFuYWdlIFRvbWNhdCBhcyBXaW5kb3dzIE5UIHNlcnZpY2UuCisgICAgICAgICAgICA8L2xpPiAgICAgICAgICAgIAorICAgICAgPC91bD4KKyAgICA8L3A+CisKKyAgICA8cD5UaGUgaW5zdGFsbGVyIHdpbGwgY3JlYXRlIHNob3J0Y3V0cyBhbGxvd2luZyBzdGFydGluZyBhbmQgY29uZmlndXJpbmcgCisgICAgICAgVG9tY2F0LiBJdCBpcyBpbXBvcnRhbnQgdG8gbm90ZSB0aGF0IHRoZSBUb21jYXQgYWRtaW5pc3RyYXRpb24gd2ViIAorICAgICAgIGFwcGxpY2F0aW9uIGNhbiBvbmx5IGJlIHVzZWQgd2hlbiBUb21jYXQgaXMgcnVubmluZy48L3A+CisKKyAgICA8cD5JZiB1c2luZyBhIEoyU0UgMS40IEpSRSwgdGhlIGNvbXBhdGliaWxpdHkgcGFja2FnZSBtdXN0IGJlIGRvd25sb2FkZWQgYW5kCisgICAgICAgZXhwYW5kZWQgaW5zaWRlIHRoZSBmb2xkZXIgd2hlcmUgVG9tY2F0IHdhcyBpbnN0YWxsZWQuPC9wPgorCisgIDwvc2VjdGlvbj4KKworICA8c2VjdGlvbiBuYW1lPSJVbml4IGRhZW1vbiI+CisKKyAgICA8cD5Ub21jYXQgY2FuIGJlIHJ1biBhcyBhIGRhZW1vbiB1c2luZyB0aGUganN2YyB0b29sIGZyb20gdGhlIAorICAgICAgIGNvbW1vbnMtZGFlbW9uIHByb2plY3QuIFNvdXJjZSB0YXJiYWxscyBmb3IganN2YyBhcmUgaW5jbHVkZWQgd2l0aCB0aGUKKyAgICAgICBUb21jYXQgYmluYXJpZXMsIGFuZCBuZWVkIHRvIGJlIGNvbXBpbGVkLiBCdWlsZGluZyBqc3ZjIHJlcXVpcmVzCisgICAgICAgYSBDIEFOU0kgY29tcGlsZXIgKHN1Y2ggYXMgR0NDKSwgR05VIEF1dG9jb25mLCBhbmQgYSBKREsuPC9wPgorCisgICAgPHA+QmVmb3JlIHJ1bm5pbmcgdGhlIHNjcmlwdCwgdGhlIDxjb2RlPkpBVkFfSE9NRTwvY29kZT4gZW52aXJvbm1lbnQKKyAgICAgICB2YXJpYWJsZSBzaG91bGQgYmUgc2V0IHRvIHRoZSBiYXNlIHBhdGggb2YgdGhlIEpESy4gQWx0ZXJuYXRlbHksIHdoZW4KKyAgICAgICBjYWxsaW5nIHRoZSA8Y29kZT4uL2NvbmZpZ3VyZTwvY29kZT4gc2NyaXB0LCB0aGUgcGF0aCBvZiB0aGUgSkRLIG1heQorICAgICAgIGJlIHNwZWNpZmllZCB1c2luZyB0aGUgPGNvZGU+LS13aXRoLWphdmE8L2NvZGU+IHBhcmFtZXRlciwgc3VjaCBhcworICAgICAgIDxjb2RlPi4vY29uZmlndXJlIC0td2l0aC1qYXZhPS91c3IvamF2YTwvY29kZT4uPC9wPgorCisgICAgPHA+VXNpbmcgdGhlIGZvbGxvd2luZyBjb21tYW5kcyBzaG91bGQgcmVzdWx0IGluIGEgY29tcGlsZWQganN2YyBiaW5hcnksCisgICAgICAgbG9jYXRlZCBpbiB0aGUgPGNvZGU+JENBVEFMSU5BX0hPTUUvYmluPC9jb2RlPiBmb2xkZXIuIFRoaXMgYXNzdW1lcworICAgICAgIHRoYXQgR05VIFRBUiBpcyB1c2VkLCBhbmQgdGhhdCA8Y29kZT5DQVRBTElOQV9IT01FPC9jb2RlPiBpcyBhbiAKKyAgICAgICBlbnZpcm9ubWVudCB2YXJpYWJsZSBwb2ludGluZyB0byB0aGUgYmFzZSBwYXRoIG9mIHRoZSBUb21jYXQgCisgICAgICAgaW5zdGFsbGF0aW9uLjwvcD4KKyAgCisgICAgPHA+UGxlYXNlIG5vdGUgdGhhdCB5b3Ugc2hvdWxkIHVzZSB0aGUgR05VIG1ha2UgKGdtYWtlKSBpbnN0ZWFkIG9mCisgICAgICAgdGhlIG5hdGl2ZSBCU0QgbWFrZSBvbiBGcmVlQlNEIHN5c3RlbXMuPC9wPgorCisKKzxzb3VyY2U+CisgICAgY2QgJENBVEFMSU5BX0hPTUUvYmluCisgICAgdGFyIHh2ZnoganN2Yy50YXIuZ3oKKyAgICBjZCBqc3ZjLXNyYworICAgIGF1dG9jb25mCisgICAgLi9jb25maWd1cmUKKyAgICBtYWtlCisgICAgY3AganN2YyAuLgorICAgIGNkIC4uCis8L3NvdXJjZT4KKworICAgIDxwPlRvbWNhdCBjYW4gdGhlbiBiZSBydW4gYXMgYSBkYWVtb24gdXNpbmcgdGhlIGZvbGxvd2luZyBjb21tYW5kcy48L3A+CisKKzxzb3VyY2U+CisgICAgY2QgJENBVEFMSU5BX0hPTUUKKyAgICAuL2Jpbi9qc3ZjIC1EamF2YS5lbmRvcnNlZC5kaXJzPS4vY29tbW9uL2VuZG9yc2VkIC1jcCAuL2Jpbi9ib290c3RyYXAuamFyIFwKKyAgICAgICAgLW91dGZpbGUgLi9sb2dzL2NhdGFsaW5hLm91dCAtZXJyZmlsZSAuL2xvZ3MvY2F0YWxpbmEuZXJyIFwKKyAgICAgICAgb3JnLmFwYWNoZS5jYXRhbGluYS5zdGFydHVwLkJvb3RzdHJhcAorPC9zb3VyY2U+CisKKyAgICA8cD5qc3ZjIGhhcyBvdGhlciB1c2VmdWwgcGFyYW1ldGVycywgc3VjaCBhcyA8Y29kZT4tdXNlcjwvY29kZT4gd2hpY2ggCisgICAgICAgY2F1c2VzIGl0IHRvIHN3aXRjaCB0byBhbm90aGVyIHVzZXIgYWZ0ZXIgdGhlIGRhZW1vbiBpbml0aWFsaXphdGlvbiBpcworICAgICAgIGNvbXBsZXRlLiBUaGlzIGFsbG93cywgZm9yIGV4YW1wbGUsIHJ1bm5pbmcgVG9tY2F0IGFzIGEgbm9uIHByaXZpbGVnZWQKKyAgICAgICB1c2VyIHdoaWxlIHN0aWxsIGJlaW5nIGFibGUgdG8gdXNlIHByaXZpbGVnZWQgcG9ydHMuIAorICAgICAgIDxjb2RlPmpzdmMgLS1oZWxwPC9jb2RlPiB3aWxsIHJldHVybiB0aGUgZnVsbCBqc3ZjIHVzYWdlIAorICAgICAgIGluZm9ybWF0aW9uLiBJbiBwYXJ0aWN1bGFyLCB0aGUgPGNvZGU+LWRlYnVnPC9jb2RlPiBvcHRpb24gaXMgdXNlZnVsCisgICAgICAgdG8gZGVidWcgaXNzdWVzIHJ1bm5pbmcganN2Yy48L3A+CisKKyAgICA8cD5UaGUgZmlsZSA8Y29kZT4kQ0FUQUxJTkFfSE9NRS9iaW4vanN2Yy9uYXRpdmUvdG9tY2F0LnNoPC9jb2RlPiBjYW4gYmUgCisgICAgICAgdXNlZCBhcyBhIHRlbXBsYXRlIGZvciBzdGFydGluZyBUb21jYXQgYXV0b21hdGljYWxseSBhdCBib290IHRpbWUgZnJvbSAKKyAgICAgICA8Y29kZT4vZXRjL2luaXQuZDwvY29kZT4uICBUaGUgZmlsZSBpcyBjdXJyZW50bHkgc2V0dXAgZm9yIHJ1bm5pbmcgCisgICAgICAgVG9tY2F0IDQuMS54LCBzbyBpdCBpcyBuZWNlc3NhcnkgdG8gZWRpdCBpdCBhbmQgY2hhbmdlIHRoZSBjbGFzc25hbWUgCisgICAgICAgZnJvbSA8Y29kZT5Cb290c3RyYXBTZXJ2aWNlPC9jb2RlPiB0byA8Y29kZT5Cb290c3RyYXA8L2NvZGU+LjwvcD4KKworICAgIDxwPk5vdGUgdGhhdCB0aGUgQ29tbW9ucy1EYWVtb24gSkFSIGZpbGUgbXVzdCBiZSBvbiB5b3VyIHJ1bnRpbWUgY2xhc3NwYXRoIAorICAgICAgIHRvIHJ1biBUb21jYXQgaW4gdGhpcyBtYW5uZXIuICBUaGUgQ29tbW9ucy1EYWVtb24gSkFSIGZpbGUgaXMgaW4gdGhlIENsYXNzLVBhdGggCisgICAgICAgZW50cnkgb2YgdGhlIGJvb3RzdHJhcC5qYXIgbWFuaWZlc3QsIGJ1dCBpZiB5b3UgZ2V0IGEgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiAKKyAgICAgICBvciBhIE5vQ2xhc3NEZWZGb3VuZEVycm9yIGZvciBhIENvbW1vbnMtRGFlbW9uIGNsYXNzLCBhZGQgdGhlIENvbW1vbnMtRGFlbW9uIAorICAgICAgIEpBUiB0byB0aGUgLWNwIGFyZ3VtZW50IHdoZW4gbGF1bmNoaW5nIGpzdmMuPC9wPiAKKworICA8L3NlY3Rpb24+CisKKzwvYm9keT4KKzwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9kb2NzL3NzaS1ob3d0by54bWwgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL3NzaS1ob3d0by54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMwMTc2MgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3Mvc3NpLWhvd3RvLnhtbApAQCAtMCwwICsxLDc1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhRE9DVFlQRSBkb2N1bWVudCBbCisgIDwhRU5USVRZIHByb2plY3QgU1lTVEVNICJwcm9qZWN0LnhtbCI+CitdPgorPGRvY3VtZW50IHVybD0ic3NpLWhvd3RvLmh0bWwiPgorCisgICAgJnByb2plY3Q7CisKKyAgICA8cHJvcGVydGllcz4KKyAgICAgICAgPGF1dGhvciBlbWFpbD0iZ2xlbm5AYXBhY2hlLm9yZyI+R2xlbm4gTC4gTmllbHNlbjwvYXV0aG9yPgorICAgICAgICA8dGl0bGU+U1NJIEhvdyBUbzwvdGl0bGU+CisgICAgPC9wcm9wZXJ0aWVzPgorCis8Ym9keT4KKworPHNlY3Rpb24gbmFtZT0iSW50cm9kdWN0aW9uIj4KKworPHA+U1NJIChTZXJ2ZXIgU2lkZSBJbmNsdWRlcykgYXJlIGRpcmVjdGl2ZXMgdGhhdCBhcmUgcGxhY2VkIGluIEhUTUwgcGFnZXMsCithbmQgZXZhbHVhdGVkIG9uIHRoZSBzZXJ2ZXIgd2hpbGUgdGhlIHBhZ2VzIGFyZSBiZWluZyBzZXJ2ZWQuIFRoZXkgbGV0IHlvdQorYWRkIGR5bmFtaWNhbGx5IGdlbmVyYXRlZCBjb250ZW50IHRvIGFuIGV4aXN0aW5nIEhUTUwgcGFnZSwgd2l0aG91dCBoYXZpbmcKK3RvIHNlcnZlIHRoZSBlbnRpcmUgcGFnZSB2aWEgYSBDR0kgcHJvZ3JhbSwgb3Igb3RoZXIgZHluYW1pYyB0ZWNobm9sb2d5LgorPC9wPgorCis8cD5XaXRoaW4gVG9tY2F0IFNTSSBzdXBwb3J0IGNhbiBiZSBhZGRlZCB3aGVuIHVzaW5nIFRvbWNhdCBhcyB5b3VyCitIVFRQIHNlcnZlciBhbmQgeW91IHJlcXVpcmUgU1NJIHN1cHBvcnQuICBUeXBpY2FsbHkgdGhpcyBpcyBkb25lCitkdXJpbmcgZGV2ZWxvcG1lbnQgd2hlbiB5b3UgZG9uJ3Qgd2FudCB0byBydW4gYSB3ZWIgc2VydmVyIGxpa2UgQXBhY2hlLjwvcD4KKworPHA+VG9tY2F0IFNTSSBzdXBwb3J0IGltcGxlbWVudHMgdGhlIHNhbWUgU1NJIGRpcmVjdGl2ZXMgYXMgQXBhY2hlLiAgU2VlIHRoZQorPGEgaHJlZj0iaHR0cDovL2h0dHBkLmFwYWNoZS5vcmcvZG9jcy9ob3d0by9zc2kuaHRtbCNiYXNpY3NzaWRpcmVjdGl2ZXMiPgorQXBhY2hlIEludHJvZHVjdGlvbiB0byBTU0k8L2E+IGZvciBpbmZvcm1hdGlvbiBvbiB1c2luZyBTU0kgZGlyZWN0aXZlcy48L3A+CisKKzxwPlNTSSBzdXBwb3J0IGlzIGltcGxlbWVudGVkIHVzaW5nIHRoZSBzZXJ2bGV0IGNsYXNzCis8Y29kZT5vcmcuYXBhY2hlLmNhdGFsaW5hLnNzaS5TU0lTZXJ2bGV0PC9jb2RlPi4gIFRyYWRpdGlvbmFsbHksIHRoaXMgc2VydmxldAoraXMgbWFwcGVkIHRvIHRoZSBVUkwgcGF0dGVybiAiKi5zaHRtbCIuPC9wPgorCis8cD5CeSBkZWZhdWx0IFNTSSBzdXBwb3J0IGlzIGRpc2FibGVkIGluIFRvbWNhdC48L3A+Cis8L3NlY3Rpb24+CisKKzxzZWN0aW9uIG5hbWU9Ikluc3RhbGxhdGlvbiI+CisKKzxwPjxzdHJvbmc+Q0FVVElPTjwvc3Ryb25nPiAtIFNTSSBkaXJlY3RpdmVzIGNhbiBiZSB1c2VkIHRvIGV4ZWN1dGUgcHJvZ3JhbXMKK2V4dGVybmFsIHRvIHRoZSBUb21jYXQgSlZNLiBJZiB5b3UgYXJlIHVzaW5nIHRoZSBKYXZhIFNlY3VyaXR5TWFuYWdlciB0aGlzCit3aWxsIGJ5cGFzcyB5b3VyIHNlY3VyaXR5IHBvbGljeSBjb25maWd1cmF0aW9uIGluIDxjb2RlPmNhdGFsaW5hLnBvbGljeS48L2NvZGU+Cis8L3A+CisKKzxwPlJlbmFtZSA8Y29kZT4kQ0FUQUxJTkFfQkFTRS9zZXJ2ZXIvbGliL3NlcnZsZXRzLXNzaS5yZW5hbWV0b2phcjwvY29kZT4KK3RvIDxjb2RlPiRDQVRBTElOQV9CQVNFL3NlcnZlci9saWIvc2VydmxldHMtc3NpLmphcjwvY29kZT4uPC9wPgorCis8cD5SZW1vdmUgdGhlIFhNTCBjb21tZW50cyBmcm9tIGFyb3VuZCB0aGUgU1NJIHNlcnZsZXQgYW5kIHNlcnZsZXQtbWFwcGluZworY29uZmlndXJhdGlvbiBpbiA8Y29kZT4kQ0FUQUxJTkFfQkFTRS9jb25mL3dlYi54bWw8L2NvZGU+LjwvcD4KKzwvc2VjdGlvbj4KKworPHNlY3Rpb24gbmFtZT0iQ29uZmlndXJhdGlvbiI+CisKKzxwPlRoZXJlIGFyZSBzZXZlcmFsIHNlcnZsZXQgaW5pdCBwYXJhbWV0ZXJzIHdoaWNoIGNhbiBiZSB1c2VkIHRvCitjb25maWd1cmUgdGhlIGJlaGF2aW91ciBvZiB0aGUgU1NJIHNlcnZsZXQuCis8dWw+Cis8bGk+PHN0cm9uZz5idWZmZXJlZDwvc3Ryb25nPiAtIFNob3VsZCBvdXRwdXQgZnJvbSB0aGlzIHNlcnZsZXQgYmUgYnVmZmVyZWQ/CisoMD1mYWxzZSwgMT10cnVlKSBEZWZhdWx0IDAgKGZhbHNlKS48L2xpPgorPGxpPjxzdHJvbmc+ZGVidWc8L3N0cm9uZz4gLSBEZWJ1Z2dpbmcgZGV0YWlsIGxldmVsIGZvciBtZXNzYWdlcyBsb2dnZWQKK2J5IHRoaXMgc2VydmxldC4gRGVmYXVsdCAwLjwvbGk+Cis8bGk+PHN0cm9uZz5leHBpcmVzPC9zdHJvbmc+IC0gVGhlIG51bWJlciBvZiBzZWNvbmRzIGJlZm9yZSBhIHBhZ2Ugd2l0aCBTU0kKK2RpcmVjdGl2ZXMgd2lsbCBleHBpcmUuIERlZmF1bHQgYmVoYXZpb3VyIGlzIGZvciBhbGwgU1NJIGRpcmVjdGl2ZXMgdG8gYmUKK2V2YWx1YXRlZCBmb3IgZXZlcnkgcmVxdWVzdC48L2xpPgorPGxpPjxzdHJvbmc+aXNWaXJ0dWFsV2ViYXBwUmVsYXRpdmU8L3N0cm9uZz4gLSBTaG91bGQgInZpcnR1YWwiIFNTSSBkaXJlY3RpdmUKK3BhdGhzIGJlIGludGVycHJldGVkIGFzIHJlbGF0aXZlIHRvIHRoZSBjb250ZXh0IHJvb3QsIGluc3RlYWQgb2YgdGhlIHNlcnZlcgorcm9vdD8gKDA9ZmFsc2UsIDE9dHJ1ZSkgRGVmYXVsdCAwIChmYWxzZSkuPC9saT4KKzwvdWw+Cis8L3A+CisKKzwvc2VjdGlvbj4KKworPC9ib2R5PgorCis8L2RvY3VtZW50PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9zc2wtaG93dG8ueG1sIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9zc2wtaG93dG8ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5YzE1YTkKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL3NzbC1ob3d0by54bWwKQEAgLTAsMCArMSw1MDkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCFET0NUWVBFIGRvY3VtZW50IFsKKyAgPCFFTlRJVFkgcHJvamVjdCBTWVNURU0gInByb2plY3QueG1sIj4KK10+Cis8ZG9jdW1lbnQgdXJsPSJzc2wtaG93dG8uaHRtbCI+CisKKyAgICAmcHJvamVjdDsKKworICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICA8YXV0aG9yIGVtYWlsPSJjY2FpbkBhcGFjaGUub3JnIj5DaHJpc3RvcGhlciBDYWluPC9hdXRob3I+CisgICAgICAgIDx0aXRsZT5TU0wgQ29uZmlndXJhdGlvbiBIT1ctVE88L3RpdGxlPgorICAgIDwvcHJvcGVydGllcz4KKworPGJvZHk+CisKKworPHNlY3Rpb24gbmFtZT0iUXVpY2stU3RhcnQgVmVyc2lvbiI+CisKKyAgICA8YmxvY2txdW90ZT48ZW0+CisgICAgPHA+VGhlIGRlc2NyaXB0aW9uIGJlbG93IHVzZXMgdGhlIHZhcmlhYmxlIG5hbWUgJENBVEFMSU5BX0hPTUUKKyAgICB0byByZWZlciB0byB0aGUgZGlyZWN0b3J5IGludG8gd2hpY2ggeW91IGhhdmUgaW5zdGFsbGVkIFRvbWNhdCA1LAorICAgIGFuZCBpcyB0aGUgYmFzZSBkaXJlY3RvcnkgYWdhaW5zdCB3aGljaCBtb3N0IHJlbGF0aXZlIHBhdGhzIGFyZQorICAgIHJlc29sdmVkLiAgSG93ZXZlciwgaWYgeW91IGhhdmUgY29uZmlndXJlZCBUb21jYXQgNSBmb3IgbXVsdGlwbGUKKyAgICBpbnN0YW5jZXMgYnkgc2V0dGluZyBhIENBVEFMSU5BX0JBU0UgZGlyZWN0b3J5LCB5b3Ugc2hvdWxkIHVzZQorICAgICRDQVRBTElOQV9CQVNFIGluc3RlYWQgb2YgJENBVEFMSU5BX0hPTUUgZm9yIGVhY2ggb2YgdGhlc2UKKyAgICByZWZlcmVuY2VzLjwvcD4KKyAgICA8L2VtPjwvYmxvY2txdW90ZT4KKworPHA+VG8gaW5zdGFsbCBhbmQgY29uZmlndXJlIFNTTCBzdXBwb3J0IG9uIFRvbWNhdCA1LCB5b3UgbmVlZCB0byBmb2xsb3cKK3RoZXNlIHNpbXBsZSBzdGVwcy4gIEZvciBtb3JlIGluZm9ybWF0aW9uLCByZWFkIHRoZSByZXN0IG9mIHRoaXMgSE9XLVRPLjwvcD4KKzxvbD4KKzxsaT5JZiB5b3UgYXJlIHJ1bm5pbmcgYSAxLjMgSlZNLCBkb3dubG9hZCBKU1NFIDEuMC4zIChvciBsYXRlcikgZnJvbQorICAgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9qc3NlLyI+aHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9qc3NlLzwvYT4KKyAgIGFuZCBlaXRoZXIgbWFrZSBpdCBhbiA8ZW0+aW5zdGFsbGVkIGV4dGVuc2lvbjwvZW0+IG9uIHRoZSBzeXN0ZW0sIG9yIGVsc2UKKyAgIHNldCBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSA8Y29kZT5KU1NFX0hPTUU8L2NvZGU+IHRoYXQgcG9pbnRzIGF0IHRoZQorICAgZGlyZWN0b3J5IGludG8gd2hpY2ggeW91IGluc3RhbGxlZCBKU1NFLiAgPC9saT48YnIvPjxici8+Cis8bGk+Q3JlYXRlIGEgY2VydGlmaWNhdGUga2V5c3RvcmUgYnkgZXhlY3V0aW5nIHRoZSBmb2xsb3dpbmcgY29tbWFuZDoKKzxwPldpbmRvd3M6PC9wPgorPHNvdXJjZT4KKyVKQVZBX0hPTUUlXGJpblxrZXl0b29sIC1nZW5rZXkgLWFsaWFzIHRvbWNhdCAta2V5YWxnIFJTQQorPC9zb3VyY2U+Cis8cD5Vbml4OjwvcD4KKzxzb3VyY2U+CiskSkFWQV9IT01FL2Jpbi9rZXl0b29sIC1nZW5rZXkgLWFsaWFzIHRvbWNhdCAta2V5YWxnIFJTQQorPC9zb3VyY2U+Cis8cD48L3A+CisgICAgYW5kIHNwZWNpZnkgYSBwYXNzd29yZCB2YWx1ZSBvZiAiY2hhbmdlaXQiLjwvbGk+PGJyLz48YnIvPgorPGxpPlVuY29tbWVudCB0aGUgIlNTTCBIVFRQLzEuMSBDb25uZWN0b3IiIGVudHJ5IGluCisgICAgPGNvZGU+JENBVEFMSU5BX0hPTUUvY29uZi9zZXJ2ZXIueG1sPC9jb2RlPiBhbmQgdHdlYWsgYXMgbmVjZXNzYXJ5LjwvbGk+CisgICAgPGJyLz48YnIvPgorPC9vbD4KKworCis8L3NlY3Rpb24+CisKKworPHNlY3Rpb24gbmFtZT0iSW50cm9kdWN0aW9uIHRvIFNTTCI+CisKKzxwPlNTTCwgb3IgU2VjdXJlIFNvY2tldCBMYXllciwgaXMgYSB0ZWNobm9sb2d5IHdoaWNoIGFsbG93cyB3ZWIgYnJvd3NlcnMgYW5kCit3ZWIgc2VydmVycyB0byBjb21tdW5pY2F0ZSBvdmVyIGEgc2VjdXJlZCBjb25uZWN0aW9uLiAgVGhpcyBtZWFucyB0aGF0IHRoZSBkYXRhCitiZWluZyBzZW50IGlzIGVuY3J5cHRlZCBieSBvbmUgc2lkZSwgdHJhbnNtaXR0ZWQsIHRoZW4gZGVjcnlwdGVkIGJ5IHRoZSBvdGhlcgorc2lkZSBiZWZvcmUgcHJvY2Vzc2luZy4gIFRoaXMgaXMgYSB0d28td2F5IHByb2Nlc3MsIG1lYW5pbmcgdGhhdCBib3RoIHRoZQorc2VydmVyIEFORCB0aGUgYnJvd3NlciBlbmNyeXB0IGFsbCB0cmFmZmljIGJlZm9yZSBzZW5kaW5nIG91dCBkYXRhLjwvcD4KKworPHA+QW5vdGhlciBpbXBvcnRhbnQgYXNwZWN0IG9mIHRoZSBTU0wgcHJvdG9jb2wgaXMgQXV0aGVudGljYXRpb24uICBUaGlzIG1lYW5zCit0aGF0IGR1cmluZyB5b3VyIGluaXRpYWwgYXR0ZW1wdCB0byBjb21tdW5pY2F0ZSB3aXRoIGEgd2ViIHNlcnZlciBvdmVyIGEgc2VjdXJlCitjb25uZWN0aW9uLCB0aGF0IHNlcnZlciB3aWxsIHByZXNlbnQgeW91ciB3ZWIgYnJvd3NlciB3aXRoIGEgc2V0IG9mCitjcmVkZW50aWFscywgaW4gdGhlIGZvcm0gb2YgYSAiQ2VydGlmaWNhdGUiLCBhcyBwcm9vZiB0aGUgc2l0ZSBpcyB3aG8gYW5kIHdoYXQKK2l0IGNsYWltcyB0byBiZS4gIEluIGNlcnRhaW4gY2FzZXMsIHRoZSBzZXJ2ZXIgbWF5IGFsc28gcmVxdWVzdCBhIENlcnRpZmljYXRlCitmcm9tIHlvdXIgd2ViIGJyb3dzZXIsIGFza2luZyBmb3IgcHJvb2YgdGhhdCA8ZW0+eW91PC9lbT4gYXJlIHdobyB5b3UgY2xhaW0KK3RvIGJlLiAgVGhpcyBpcyBrbm93biBhcyAiQ2xpZW50IEF1dGhlbnRpY2F0aW9uLCIgYWx0aG91Z2ggaW4gcHJhY3RpY2UgdGhpcyBpcwordXNlZCBtb3JlIGZvciBidXNpbmVzcy10by1idXNpbmVzcyAoQjJCKSB0cmFuc2FjdGlvbnMgdGhhbiB3aXRoIGluZGl2aWR1YWwKK3VzZXJzLiAgTW9zdCBTU0wtZW5hYmxlZCB3ZWIgc2VydmVycyBkbyBub3QgcmVxdWVzdCBDbGllbnQgQXV0aGVudGljYXRpb24uPC9wPgorCis8L3NlY3Rpb24+CisKKzxzZWN0aW9uIG5hbWU9IlNTTCBhbmQgVG9tY2F0Ij4KKworPHA+SXQgaXMgaW1wb3J0YW50IHRvIG5vdGUgdGhhdCBjb25maWd1cmluZyBUb21jYXQgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YKK3NlY3VyZSBzb2NrZXRzIGlzIHVzdWFsbHkgb25seSBuZWNlc3Nhcnkgd2hlbiBydW5uaW5nIGl0IGFzIGEgc3RhbmQtYWxvbmUKK3dlYiBzZXJ2ZXIuICBXaGVuIHJ1bm5pbmcgVG9tY2F0IHByaW1hcmlseSBhcyBhIFNlcnZsZXQvSlNQIGNvbnRhaW5lciBiZWhpbmQKK2Fub3RoZXIgd2ViIHNlcnZlciwgc3VjaCBhcyBBcGFjaGUgb3IgTWljcm9zb2Z0IElJUywgaXQgaXMgdXN1YWxseSBuZWNlc3NhcnkKK3RvIGNvbmZpZ3VyZSB0aGUgcHJpbWFyeSB3ZWIgc2VydmVyIHRvIGhhbmRsZSB0aGUgU1NMIGNvbm5lY3Rpb25zIGZyb20gdXNlcnMuCitUeXBpY2FsbHksIHRoaXMgc2VydmVyIHdpbGwgbmVnb3RpYXRlIGFsbCBTU0wtcmVsYXRlZCBmdW5jdGlvbmFsaXR5LCB0aGVuCitwYXNzIG9uIGFueSByZXF1ZXN0cyBkZXN0aW5lZCBmb3IgdGhlIFRvbWNhdCBjb250YWluZXIgb25seSBhZnRlciBkZWNyeXB0aW5nCit0aG9zZSByZXF1ZXN0cy4gIExpa2V3aXNlLCBUb21jYXQgd2lsbCByZXR1cm4gY2xlYXJ0ZXh0IHJlc3BvbnNlcywgdGhhdCB3aWxsCitiZSBlbmNyeXB0ZWQgYmVmb3JlIGJlaW5nIHJldHVybmVkIHRvIHRoZSB1c2VyJ3MgYnJvd3Nlci4gIEluIHRoaXMgZW52aXJvbm1lbnQsCitUb21jYXQga25vd3MgdGhhdCBjb21tdW5pY2F0aW9ucyBiZXR3ZWVuIHRoZSBwcmltYXJ5IHdlYiBzZXJ2ZXIgYW5kIHRoZQorY2xpZW50IGFyZSB0YWtpbmcgcGxhY2Ugb3ZlciBhIHNlY3VyZSBjb25uZWN0aW9uIChiZWNhdXNlIHlvdXIgYXBwbGljYXRpb24KK25lZWRzIHRvIGJlIGFibGUgdG8gYXNrIGFib3V0IHRoaXMpLCBidXQgaXQgZG9lcyBub3QgcGFydGljaXBhdGUgaW4gdGhlCitlbmNyeXB0aW9uIG9yIGRlY3J5cHRpb24gaXRzZWxmLjwvcD4KKworPC9zZWN0aW9uPgorCis8c2VjdGlvbiBuYW1lPSJDZXJ0aWZpY2F0ZXMiPgorCis8cD5JbiBvcmRlciB0byBpbXBsZW1lbnQgU1NMLCBhIHdlYiBzZXJ2ZXIgbXVzdCBoYXZlIGFuIGFzc29jaWF0ZWQgQ2VydGlmaWNhdGUKK2ZvciBlYWNoIGV4dGVybmFsIGludGVyZmFjZSAoSVAgYWRkcmVzcykgdGhhdCBhY2NlcHRzIHNlY3VyZSBjb25uZWN0aW9ucy4KK1RoZSB0aGVvcnkgYmVoaW5kIHRoaXMgZGVzaWduIGlzIHRoYXQgYSBzZXJ2ZXIgc2hvdWxkIHByb3ZpZGUgc29tZSBraW5kIG9mCityZWFzb25hYmxlIGFzc3VyYW5jZSB0aGF0IGl0cyBvd25lciBpcyB3aG8geW91IHRoaW5rIGl0IGlzLCBwYXJ0aWN1bGFybHkKK2JlZm9yZSByZWNlaXZpbmcgYW55IHNlbnNpdGl2ZSBpbmZvcm1hdGlvbi4gIFdoaWxlIGEgYnJvYWRlciBleHBsYW5hdGlvbiBvZgorQ2VydGlmaWNhdGVzIGlzIGJleW9uZCB0aGUgc2NvcGUgb2YgdGhpcyBkb2N1bWVudCwgdGhpbmsgb2YgYSBDZXJ0aWZpY2F0ZQorYXMgYSAiZGlnaXRhbCBkcml2ZXIncyBsaWNlbnNlIiBmb3IgYW4gSW50ZXJuZXQgYWRkcmVzcy4gIEl0IHN0YXRlcyB3aGF0Citjb21wYW55IHRoZSBzaXRlIGlzIGFzc29jaWF0ZWQgd2l0aCwgYWxvbmcgd2l0aCBzb21lIGJhc2ljIGNvbnRhY3QKK2luZm9ybWF0aW9uIGFib3V0IHRoZSBzaXRlIG93bmVyIG9yIGFkbWluaXN0cmF0b3IuPC9wPgorCis8cD5UaGlzICJkcml2ZXIncyBsaWNlbnNlIiBpcyBjcnlwdG9ncmFwaGljYWxseSBzaWduZWQgYnkgaXRzIG93bmVyLCBhbmQgaXMKK3RoZXJlZm9yZSBleHRyZW1lbHkgZGlmZmljdWx0IGZvciBhbnlvbmUgZWxzZSB0byBmb3JnZS4gIEZvciBzaXRlcyBpbnZvbHZlZAoraW4gZS1jb21tZXJjZSwgb3IgYW55IG90aGVyIGJ1c2luZXNzIHRyYW5zYWN0aW9uIGluIHdoaWNoIGF1dGhlbnRpY2F0aW9uIG9mCitpZGVudGl0eSBpcyBpbXBvcnRhbnQsIGEgQ2VydGlmaWNhdGUgaXMgdHlwaWNhbGx5IHB1cmNoYXNlZCBmcm9tIGEgd2VsbC1rbm93bgorPGVtPkNlcnRpZmljYXRlIEF1dGhvcml0eTwvZW0+IChDQSkgc3VjaCBhcyBWZXJpU2lnbiBvciBUaGF3dGUuICBTdWNoCitjZXJ0aWZpY2F0ZXMgY2FuIGJlIGVsZWN0cm9uaWNhbGx5IHZlcmlmaWVkIC0tIGluIGVmZmVjdCwgdGhlIENlcnRpZmljYXRlCitBdXRob3JpdHkgd2lsbCB2b3VjaCBmb3IgdGhlIGF1dGhlbnRpY2l0eSBvZiB0aGUgY2VydGlmaWNhdGVzIHRoYXQgaXQgZ3JhbnRzLAorc28geW91IGNhbiBiZWxpZXZlIHRoYXQgdGhhdCBDZXJ0aWZpY2F0ZSBpcyB2YWxpZCBpZiB5b3UgdHJ1c3QgdGhlIENlcnRpZmljYXRlCitBdXRob3JpdHkgdGhhdCBncmFudGVkIGl0LjwvcD4KKworPHA+SW4gbWFueSBjYXNlcywgaG93ZXZlciwgYXV0aGVudGljYXRpb24gaXMgbm90IHJlYWxseSBhIGNvbmNlcm4uICBBbgorYWRtaW5pc3RyYXRvciBtYXkgc2ltcGx5IHdhbnQgdG8gZW5zdXJlIHRoYXQgdGhlIGRhdGEgYmVpbmcgdHJhbnNtaXR0ZWQgYW5kCityZWNlaXZlZCBieSB0aGUgc2VydmVyIGlzIHByaXZhdGUgYW5kIGNhbm5vdCBiZSBzbm9vcGVkIGJ5IGFueW9uZSB3aG8gbWF5IGJlCitlYXZlc2Ryb3BwaW5nIG9uIHRoZSBjb25uZWN0aW9uLiAgRm9ydHVuYXRlbHksIEphdmEgcHJvdmlkZXMgYSByZWxhdGl2ZWx5CitzaW1wbGUgY29tbWFuZC1saW5lIHRvb2wsIGNhbGxlZCA8Y29kZT5rZXl0b29sPC9jb2RlPiwgd2hpY2ggY2FuIGVhc2lseSBjcmVhdGUKK2EgInNlbGYtc2lnbmVkIiBDZXJ0aWZpY2F0ZS4gIFNlbGYtc2lnbmVkIENlcnRpZmljYXRlcyBhcmUgc2ltcGx5IHVzZXIKK2dlbmVyYXRlZCBDZXJ0aWZpY2F0ZXMgd2hpY2ggaGF2ZSBub3QgYmVlbiBvZmZpY2lhbGx5IHJlZ2lzdGVyZWQgd2l0aCBhbnkKK3dlbGwta25vd24gQ0EsIGFuZCBhcmUgdGhlcmVmb3JlIG5vdCByZWFsbHkgZ3VhcmFudGVlZCB0byBiZSBhdXRoZW50aWMgYXQgYWxsLgorQWdhaW4sIHRoaXMgbWF5IG9yIG1heSBub3QgZXZlbiBiZSBpbXBvcnRhbnQsIGRlcGVuZGluZyBvbiB5b3VyIG5lZWRzLjwvcD4KKworPC9zZWN0aW9uPgorCis8c2VjdGlvbiBuYW1lPSJHZW5lcmFsIFRpcHMgb24gUnVubmluZyBTU0wiPgorCis8cD5UaGUgZmlyc3QgdGltZSBhIHVzZXIgYXR0ZW1wdHMgdG8gYWNjZXNzIGEgc2VjdXJlZCBwYWdlIG9uIHlvdXIgc2l0ZSwKK2hlIG9yIHNoZSBpcyB0eXBpY2FsbHkgcHJlc2VudGVkIHdpdGggYSBkaWFsb2cgY29udGFpbmluZyB0aGUgZGV0YWlscyBvZgordGhlIGNlcnRpZmljYXRlIChzdWNoIGFzIHRoZSBjb21wYW55IGFuZCBjb250YWN0IG5hbWUpLCBhbmQgYXNrZWQgaWYgaGUgb3Igc2hlCit3aXNoZXMgdG8gYWNjZXB0IHRoZSBDZXJ0aWZpY2F0ZSBhcyB2YWxpZCBhbmQgY29udGludWUgd2l0aCB0aGUgdHJhbnNhY3Rpb24uCitTb21lIGJyb3dzZXJzIHdpbGwgcHJvdmlkZSBhbiBvcHRpb24gZm9yIHBlcm1hbmVudGx5IGFjY2VwdGluZyBhIGdpdmVuCitDZXJ0aWZpY2F0ZSBhcyB2YWxpZCwgaW4gd2hpY2ggY2FzZSB0aGUgdXNlciB3aWxsIG5vdCBiZSBib3RoZXJlZCB3aXRoIGEKK3Byb21wdCBlYWNoIHRpbWUgdGhleSB2aXNpdCB5b3VyIHNpdGUuICBPdGhlciBicm93c2VycyBkbyBub3QgcHJvdmlkZSB0aGlzCitvcHRpb24uICBPbmNlIGFwcHJvdmVkIGJ5IHRoZSB1c2VyLCBhIENlcnRpZmljYXRlIHdpbGwgYmUgY29uc2lkZXJlZCB2YWxpZAorZm9yIGF0IGxlYXN0IHRoZSBlbnRpcmUgYnJvd3NlciBzZXNzaW9uLjwvcD4KKworPHA+QWxzbywgd2hpbGUgdGhlIFNTTCBwcm90b2NvbCB3YXMgZGVzaWduZWQgdG8gYmUgYXMgZWZmaWNpZW50IGFzIHNlY3VyZWx5Citwb3NzaWJsZSwgZW5jcnlwdGlvbi9kZWNyeXB0aW9uIGlzIGEgY29tcHV0YXRpb25hbGx5IGV4cGVuc2l2ZSBwcm9jZXNzIGZyb20KK2EgcGVyZm9ybWFuY2Ugc3RhbmRwb2ludC4gIEl0IGlzIG5vdCBzdHJpY3RseSBuZWNlc3NhcnkgdG8gcnVuIGFuIGVudGlyZQord2ViIGFwcGxpY2F0aW9uIG92ZXIgU1NMLCBhbmQgaW5kZWVkIGEgZGV2ZWxvcGVyIGNhbiBwaWNrIGFuZCBjaG9vc2Ugd2hpY2gKK3BhZ2VzIHJlcXVpcmUgYSBzZWN1cmUgY29ubmVjdGlvbiBhbmQgd2hpY2ggZG8gbm90LiAgRm9yIGEgcmVhc29uYWJseSBidXN5CitzaXRlLCBpdCBpcyBjdXN0b21hcnkgdG8gb25seSBydW4gY2VydGFpbiBwYWdlcyB1bmRlciBTU0wsIG5hbWVseSB0aG9zZQorcGFnZXMgd2hlcmUgc2Vuc2l0aXZlIGluZm9ybWF0aW9uIGNvdWxkIHBvc3NpYmx5IGJlIGV4Y2hhbmdlZC4gIFRoaXMgd291bGQKK2luY2x1ZGUgdGhpbmdzIGxpa2UgbG9naW4gcGFnZXMsIHBlcnNvbmFsIGluZm9ybWF0aW9uIHBhZ2VzLCBhbmQgc2hvcHBpbmcKK2NhcnQgY2hlY2tvdXRzLCB3aGVyZSBjcmVkaXQgY2FyZCBpbmZvcm1hdGlvbiBjb3VsZCBwb3NzaWJseSBiZSB0cmFuc21pdHRlZC4KK0FueSBwYWdlIHdpdGhpbiBhbiBhcHBsaWNhdGlvbiBjYW4gYmUgcmVxdWVzdGVkIG92ZXIgYSBzZWN1cmUgc29ja2V0IGJ5CitzaW1wbHkgcHJlZml4aW5nIHRoZSBhZGRyZXNzIHdpdGggPGNvZGU+aHR0cHM6PC9jb2RlPiBpbnN0ZWFkIG9mCis8Y29kZT5odHRwOjwvY29kZT4uICBBbnkgcGFnZXMgd2hpY2ggYWJzb2x1dGVseSA8c3Ryb25nPnJlcXVpcmU8L3N0cm9uZz4KK2Egc2VjdXJlIGNvbm5lY3Rpb24gc2hvdWxkIGNoZWNrIHRoZSBwcm90b2NvbCB0eXBlIGFzc29jaWF0ZWQgd2l0aCB0aGUKK3BhZ2UgcmVxdWVzdCBhbmQgdGFrZSB0aGUgYXBwcm9wcmlhdGUgYWN0aW9uIG9mIDxjb2RlPmh0dHBzPC9jb2RlPiBpcyBub3QKK3NwZWNpZmllZC48L3A+CisKKzxwPkZpbmFsbHksIHVzaW5nIG5hbWUtYmFzZWQgdmlydHVhbCBob3N0cyBvbiBhIHNlY3VyZWQgY29ubmVjdGlvbiBjYW4gYmUKK3Byb2JsZW1hdGljLiAgVGhpcyBpcyBhIGRlc2lnbiBsaW1pdGF0aW9uIG9mIHRoZSBTU0wgcHJvdG9jb2wgaXRzZWxmLiAgVGhlIFNTTAoraGFuZHNoYWtlLCB3aGVyZSB0aGUgY2xpZW50IGJyb3dzZXIgYWNjZXB0cyB0aGUgc2VydmVyIGNlcnRpZmljYXRlLCBtdXN0IG9jY3VyCitiZWZvcmUgdGhlIEhUVFAgcmVxdWVzdCBpcyBhY2Nlc3NlZC4gIEFzIGEgcmVzdWx0LCB0aGUgcmVxdWVzdCBpbmZvcm1hdGlvbgorY29udGFpbmluZyB0aGUgdmlydHVhbCBob3N0IG5hbWUgY2Fubm90IGJlIGRldGVybWluZWQgcHJpb3IgdG8gYXV0aGVudGljYXRpb24sCithbmQgaXQgaXMgdGhlcmVmb3JlIG5vdCBwb3NzaWJsZSB0byBhc3NpZ24gbXVsdGlwbGUgY2VydGlmaWNhdGVzIHRvIGEgc2luZ2xlCitJUCBhZGRyZXNzLiAgSWYgYWxsIHZpcnR1YWwgaG9zdHMgb24gYSBzaW5nbGUgSVAgYWRkcmVzcyBuZWVkIHRvIGF1dGhlbnRpY2F0ZQorYWdhaW5zdCB0aGUgc2FtZSBjZXJ0aWZpY2F0ZSwgdGhlIGFkZGl0aW9uIG9mIG11bHRpcGxlIHZpcnR1YWwgaG9zdHMgc2hvdWxkIG5vdAoraW50ZXJmZXJlIHdpdGggbm9ybWFsIFNTTCBvcGVyYXRpb25zIG9uIHRoZSBzZXJ2ZXIuICBCZSBhd2FyZSwgaG93ZXZlciwgdGhhdAorbW9zdCBjbGllbnQgYnJvd3NlcnMgd2lsbCBjb21wYXJlIHRoZSBzZXJ2ZXIncyBkb21haW4gbmFtZSBhZ2FpbnN0IHRoZSBkb21haW4KK25hbWUgbGlzdGVkIGluIHRoZSBjZXJ0aWZpY2F0ZSwgaWYgYW55IChhcHBsaWNhYmxlIHByaW1hcmlseSB0byBvZmZpY2lhbCwKK0NBLXNpZ25lZCBjZXJ0aWZpY2F0ZXMpLiAgSWYgdGhlIGRvbWFpbiBuYW1lcyBkbyBub3QgbWF0Y2gsIHRoZXNlIGJyb3dzZXJzIHdpbGwKK2Rpc3BsYXkgYSB3YXJuaW5nIHRvIHRoZSBjbGllbnQgdXNlci4gIEluIGdlbmVyYWwsIG9ubHkgYWRkcmVzcy1iYXNlZCB2aXJ0dWFsCitob3N0cyBhcmUgY29tbW9ubHkgdXNlZCB3aXRoIFNTTCBpbiBhIHByb2R1Y3Rpb24gZW52aXJvbm1lbnQuPC9wPgorCis8L3NlY3Rpb24+CisKKzxzZWN0aW9uIG5hbWU9IkNvbmZpZ3VyYXRpb24iPgorCis8c3Vic2VjdGlvbiBuYW1lPSJEb3dubG9hZCBhbmQgSW5zdGFsbCBKU1NFIj4KKworPHA+RG93bmxvYWQgdGhlIDxlbT5KYXZhIFNlY3VyZSBTb2NrZXQgRXh0ZW5zaW9uczwvZW0+IChKU1NFKSBwYWNrYWdlLAordmVyc2lvbiAxLjAuMyBvciBsYXRlciwgZnJvbQorPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9qc3NlLyI+aHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9qc3NlLzwvYT4uCitJZiB5b3UgYnVpbHQgVG9tY2F0IGZyb20gc291cmNlLCB5b3UgaGF2ZSBwcm9iYWJseSBhbHJlYWR5IGRvd25sb2FkZWQgdGhpcworcGFja2FnZS4gIElmIHlvdSBhcmUgcnVubmluZyBKREsgMS40LngsIHRoZXNlIGNsYXNzZXMgaGF2ZQorYmVlbiBpbnRlZ3JhdGVkIGRpcmVjdGx5IGludG8gdGhlIEpESywgc28geW91IGNhbiBza2lwIHRoaXMgZW50aXJlIHN0ZXAuPC9wPgorCis8cD5BZnRlciBleHBhbmRpbmcgdGhlIHBhY2thZ2UsIHRoZXJlIGFyZSB0d28gd2F5cyB0byBtYWtlIGl0IGF2YWlsYWJsZSB0bworVG9tY2F0IChjaG9vc2Ugb25lIG9yIHRoZSBvdGhlcik6PC9wPgorPHVsPgorPGxpPk1ha2UgSlNTRSBhbiA8ZW0+aW5zdGFsbGVkIGV4dGVuc2lvbjwvZW0+IGJ5IGNvcHlpbmcgYWxsIHRocmVlIEpBUiBmaWxlcworICAgICg8Y29kZT5qY2VydC5qYXI8L2NvZGU+LCA8Y29kZT5qbmV0LmphcjwvY29kZT4sIGFuZCA8Y29kZT5qc3NlLmphcjwvY29kZT4pCisgICAgaW50byB5b3VyIDxjb2RlPiRKQVZBX0hPTUUvanJlL2xpYi9leHQ8L2NvZGU+IGRpcmVjdG9yeS48L2xpPgorPGxpPkNyZWF0ZSBhIG5ldyBlbnZpcm9ubWVudCB2YXJpYWJsZSA8Y29kZT5KU1NFX0hPTUU8L2NvZGU+IHRoYXQgY29udGFpbnMKKyAgICB0aGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgZGlyZWN0b3J5IGludG8gd2hpY2ggeW91IHVucGFja2VkIHRoZQorICAgIEpTU0UgYmluYXJ5IGRpc3RyaWJ1dGlvbi48L2xpPgorPC91bD4KKworPC9zdWJzZWN0aW9uPgorCis8c3Vic2VjdGlvbiBuYW1lPSJQcmVwYXJlIHRoZSBDZXJ0aWZpY2F0ZSBLZXlzdG9yZSI+CisKKzxwPlRvbWNhdCBjdXJyZW50bHkgb3BlcmF0ZXMgb25seSBvbiA8Y29kZT5KS1M8L2NvZGU+IG9yIDxjb2RlPlBLQ1MxMjwvY29kZT4KK2Zvcm1hdCBrZXlzdG9yZXMuICBUaGUgPGNvZGU+SktTPC9jb2RlPiBmb3JtYXQKK2lzIEphdmEncyBzdGFuZGFyZCAiSmF2YSBLZXlTdG9yZSIgZm9ybWF0LCBhbmQgaXMgdGhlIGZvcm1hdCBjcmVhdGVkIGJ5IHRoZQorPGNvZGU+a2V5dG9vbDwvY29kZT4gY29tbWFuZC1saW5lIHV0aWxpdHkuICBUaGlzIHRvb2wgaXMgaW5jbHVkZWQgaW4gdGhlIEpESy4KK1RoZSA8Y29kZT5QS0NTMTI8L2NvZGU+IGZvcm1hdCBpcyBhbiBpbnRlcm5ldCBzdGFuZGFyZCwgYW5kIGNhbiBiZSBtYW5pcHVsYXRlZAordmlhIChhbW9uZyBvdGhlciB0aGluZ3MpIE9wZW5TU0wgYW5kIE1pY3Jvc29mdCdzIEtleS1NYW5hZ2VyLiAgSG93ZXZlciwgCitjdXJyZW50bHkgdGhlcmUgYXJlIHNvbWUgbGltaXRhdGlvbnMgb24gdGhlIHN1cHBvcnQgZm9yIDxjb2RlPlBLQ1MxMjwvY29kZT4uCis8L3A+CisKKzxwPlRvIGltcG9ydCBhbiBleGlzdGluZyBjZXJ0aWZpY2F0ZSBpbnRvIGEgSktTIGtleXN0b3JlLCBwbGVhc2UgcmVhZCB0aGUKK2RvY3VtZW50YXRpb24gKGluIHlvdXIgSkRLIGRvY3VtZW50YXRpb24gcGFja2FnZSkgYWJvdXQgPGNvZGU+a2V5dG9vbDwvY29kZT4uCis8L3A+Cis8cD5UbyBpbXBvcnQgYW4gZXhpc3RpbmcgY2VydGlmaWNhdGUgc2lnbmVkIGJ5IHlvdXIgb3duIENBIGludG8gYSBQS0NTMTIgCitrZXlzdG9yZSB1c2luZyBPcGVuU1NMIHlvdSB3b3VsZCBleGVjdXRlIGEgY29tbWFuZCBsaWtlOgorPHNvdXJjZT5vcGVuc3NsIHBrY3MxMiAtZXhwb3J0IC1pbmZpbGUgbXljZXJ0LmNydCAtaW5rZXkgbXlrZXkua2V5IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIC1vdXRmaWxlIG15Y2VydC5wMTIgLW5hbWUgdG9tY2F0IC1DQWZpbGUgbXlDQS5jcnQgXAorICAgICAgICAgICAgICAgICAgICAgICAgLWNhbmFtZSByb290IC1jaGFpbgorPC9zb3VyY2U+CitGb3IgbW9yZSBhZHZhbmNlZCBjYXNlcywgY29uc3VsdCB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8iPk9wZW5TU0wKK2RvY3VtZW50ZW50YXRpb248L2E+LgorPC9wPgorPHA+VG8gY3JlYXRlIGEgbmV3IGtleXN0b3JlIGZyb20gc2NyYXRjaCwgY29udGFpbmluZyBhIHNpbmdsZSBzZWxmLXNpZ25lZAorQ2VydGlmaWNhdGUsIGV4ZWN1dGUgdGhlIGZvbGxvd2luZyBmcm9tIGEgdGVybWluYWwgY29tbWFuZCBsaW5lOjwvcD4KKzxwPldpbmRvd3M6PC9wPgorPHNvdXJjZT4KKyVKQVZBX0hPTUUlXGJpblxrZXl0b29sIC1nZW5rZXkgLWFsaWFzIHRvbWNhdCAta2V5YWxnIFJTQQorPC9zb3VyY2U+Cis8cD5Vbml4OjwvcD4KKzxzb3VyY2U+CiskSkFWQV9IT01FL2Jpbi9rZXl0b29sIC1nZW5rZXkgLWFsaWFzIHRvbWNhdCAta2V5YWxnIFJTQQorPC9zb3VyY2U+CisKKzxwPihUaGUgUlNBIGFsZ29yaXRobSBzaG91bGQgYmUgcHJlZmVycmVkIGFzIGEgc2VjdXJlIGFsZ29yaXRobSwgYW5kIHRoaXMKK2Fsc28gZW5zdXJlcyBnZW5lcmFsIGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlciBzZXJ2ZXJzIGFuZCBjb21wb25lbnRzLik8L3A+CisKKzxwPlRoaXMgY29tbWFuZCB3aWxsIGNyZWF0ZSBhIG5ldyBmaWxlLCBpbiB0aGUgaG9tZSBkaXJlY3Rvcnkgb2YgdGhlIHVzZXIKK3VuZGVyIHdoaWNoIHlvdSBydW4gaXQsIG5hbWVkICI8Y29kZT4ua2V5c3RvcmU8L2NvZGU+Ii4gIFRvIHNwZWNpZnkgYQorZGlmZmVyZW50IGxvY2F0aW9uIG9yIGZpbGVuYW1lLCBhZGQgdGhlIDxjb2RlPi1rZXlzdG9yZTwvY29kZT4gcGFyYW1ldGVyLAorZm9sbG93ZWQgYnkgdGhlIGNvbXBsZXRlIHBhdGhuYW1lIHRvIHlvdXIga2V5c3RvcmUgZmlsZSwKK3RvIHRoZSA8Y29kZT5rZXl0b29sPC9jb2RlPiBjb21tYW5kIHNob3duIGFib3ZlLiAgWW91IHdpbGwgYWxzbyBuZWVkIHRvCityZWZsZWN0IHRoaXMgbmV3IGxvY2F0aW9uIGluIHRoZSA8Y29kZT5zZXJ2ZXIueG1sPC9jb2RlPiBjb25maWd1cmF0aW9uIGZpbGUsCithcyBkZXNjcmliZWQgbGF0ZXIuICBGb3IgZXhhbXBsZTo8L3A+Cis8cD5XaW5kb3dzOjwvcD4KKzxzb3VyY2U+CislSkFWQV9IT01FJVxiaW5ca2V5dG9vbCAtZ2Vua2V5IC1hbGlhcyB0b21jYXQgLWtleWFsZyBSU0EgXAorICAta2V5c3RvcmUgXHBhdGhcdG9cbXlca2V5c3RvcmUKKzwvc291cmNlPgorPHA+VW5peDo8L3A+Cis8c291cmNlPgorJEpBVkFfSE9NRS9iaW4va2V5dG9vbCAtZ2Vua2V5IC1hbGlhcyB0b21jYXQgLWtleWFsZyBSU0EgXAorICAta2V5c3RvcmUgL3BhdGgvdG8vbXkva2V5c3RvcmUKKzwvc291cmNlPgorCis8cD5BZnRlciBleGVjdXRpbmcgdGhpcyBjb21tYW5kLCB5b3Ugd2lsbCBmaXJzdCBiZSBwcm9tcHRlZCBmb3IgdGhlIGtleXN0b3JlCitwYXNzd29yZC4gIFRoZSBkZWZhdWx0IHBhc3N3b3JkIHVzZWQgYnkgVG9tY2F0IGlzICI8Y29kZT5jaGFuZ2VpdDwvY29kZT4iCisoYWxsIGxvd2VyIGNhc2UpLCBhbHRob3VnaCB5b3UgY2FuIHNwZWNpZnkgYSBjdXN0b20gcGFzc3dvcmQgaWYgeW91IGxpa2UuCitZb3Ugd2lsbCBhbHNvIG5lZWQgdG8gc3BlY2lmeSB0aGUgY3VzdG9tIHBhc3N3b3JkIGluIHRoZQorPGNvZGU+c2VydmVyLnhtbDwvY29kZT4gY29uZmlndXJhdGlvbiBmaWxlLCBhcyBkZXNjcmliZWQgbGF0ZXIuPC9wPgorCis8cD5OZXh0LCB5b3Ugd2lsbCBiZSBwcm9tcHRlZCBmb3IgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIENlcnRpZmljYXRlLAorc3VjaCBhcyBjb21wYW55LCBjb250YWN0IG5hbWUsIGFuZCBzbyBvbi4gIFRoaXMgaW5mb3JtYXRpb24gd2lsbCBiZSBkaXNwbGF5ZWQKK3RvIHVzZXJzIHdobyBhdHRlbXB0IHRvIGFjY2VzcyBhIHNlY3VyZSBwYWdlIGluIHlvdXIgYXBwbGljYXRpb24sIHNvIG1ha2UKK3N1cmUgdGhhdCB0aGUgaW5mb3JtYXRpb24gcHJvdmlkZWQgaGVyZSBtYXRjaGVzIHdoYXQgdGhleSB3aWxsIGV4cGVjdC48L3A+CisKKzxwPkZpbmFsbHksIHlvdSB3aWxsIGJlIHByb21wdGVkIGZvciB0aGUgPGVtPmtleSBwYXNzd29yZDwvZW0+LCB3aGljaCBpcyB0aGUKK3Bhc3N3b3JkIHNwZWNpZmljYWxseSBmb3IgdGhpcyBDZXJ0aWZpY2F0ZSAoYXMgb3Bwb3NlZCB0byBhbnkgb3RoZXIKK0NlcnRpZmljYXRlcyBzdG9yZWQgaW4gdGhlIHNhbWUga2V5c3RvcmUgZmlsZSkuICBZb3UgPHN0cm9uZz5NVVNUPC9zdHJvbmc+Cit1c2UgdGhlIHNhbWUgcGFzc3dvcmQgaGVyZSBhcyB3YXMgdXNlZCBmb3IgdGhlIGtleXN0b3JlIHBhc3N3b3JkIGl0c2VsZi4KKyhDdXJyZW50bHksIHRoZSA8Y29kZT5rZXl0b29sPC9jb2RlPiBwcm9tcHQgd2lsbCB0ZWxsIHlvdSB0aGF0IHByZXNzaW5nIHRoZQorRU5URVIga2V5IGRvZXMgdGhpcyBmb3IgeW91IGF1dG9tYXRpY2FsbHkuKTwvcD4KKworPHA+SWYgZXZlcnl0aGluZyB3YXMgc3VjY2Vzc2Z1bCwgeW91IG5vdyBoYXZlIGEga2V5c3RvcmUgZmlsZSB3aXRoIGEKK0NlcnRpZmljYXRlIHRoYXQgY2FuIGJlIHVzZWQgYnkgeW91ciBzZXJ2ZXIuPC9wPgorCis8L3N1YnNlY3Rpb24+CisKKzxzdWJzZWN0aW9uIG5hbWU9IkVkaXQgdGhlIFRvbWNhdCBDb25maWd1cmF0aW9uIEZpbGUiPgorCis8cD5UaGUgZmluYWwgc3RlcCBpcyB0byBjb25maWd1cmUgeW91ciBzZWN1cmUgc29ja2V0IGluIHRoZQorPGNvZGU+JENBVEFMSU5BX0hPTUUvY29uZi9zZXJ2ZXIueG1sPC9jb2RlPiBmaWxlLCB3aGVyZQorPGNvZGU+JENBVEFMSU5BX0hPTUU8L2NvZGU+IHJlcHJlc2VudHMgdGhlIGRpcmVjdG9yeSBpbnRvIHdoaWNoIHlvdQoraW5zdGFsbGVkIFRvbWNhdCA1LiAgQW4gZXhhbXBsZSA8Y29kZT4mbHQ7Q29ubmVjdG9yJmd0OzwvY29kZT4gZWxlbWVudAorZm9yIGFuIFNTTCBjb25uZWN0b3IgaXMgaW5jbHVkZWQgaW4gdGhlIGRlZmF1bHQgPGNvZGU+c2VydmVyLnhtbDwvY29kZT4KK2ZpbGUgaW5zdGFsbGVkIHdpdGggVG9tY2F0LiAgSXQgd2lsbCBsb29rIHNvbWV0aGluZyBsaWtlIHRoaXM6PC9wPgorPHNvdXJjZT4KKyZsdDstLSBEZWZpbmUgYSBTU0wgQ295b3RlIEhUVFAvMS4xIENvbm5lY3RvciBvbiBwb3J0IDg0NDMgLS0mZ3Q7CismbHQ7IS0tCismbHQ7Q29ubmVjdG9yIAorICAgICAgICAgICBwb3J0PSI4NDQzIiBtaW5Qcm9jZXNzb3JzPSI1IiBtYXhQcm9jZXNzb3JzPSI3NSIKKyAgICAgICAgICAgZW5hYmxlTG9va3Vwcz0idHJ1ZSIgZGlzYWJsZVVwbG9hZFRpbWVvdXQ9InRydWUiCisgICAgICAgICAgIGFjY2VwdENvdW50PSIxMDAiIGRlYnVnPSIwIiBzY2hlbWU9Imh0dHBzIiBzZWN1cmU9InRydWUiOworICAgICAgICAgICBjbGllbnRBdXRoPSJmYWxzZSIgc3NsUHJvdG9jb2w9IlRMUyIvJmd0OworLS0mZ3Q7Cis8L3NvdXJjZT4KKworPHA+WW91IHdpbGwgbm90ZSB0aGF0IHRoZSBDb25uZWN0b3IgZWxlbWVudCBpdHNlbGYgaXMgY29tbWVudGVkIG91dCBieSBkZWZhdWx0LAorc28geW91IHdpbGwgbmVlZCB0byByZW1vdmUgdGhlIGNvbW1lbnQgdGFncyBhcm91bmQgaXQuICBUaGVuLCB5b3UgY2FuCitjdXN0b21pemUgdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGVzIGFzIG5lY2Vzc2FyeS4gIEZvciBkZXRhaWxlZCBpbmZvcm1hdGlvbgorYWJvdXQgdGhlIHZhcmlvdXMgb3B0aW9ucywgY29uc3VsdCB0aGUKKzxhIGhyZWY9ImNvbmZpZy9pbmRleC5odG1sIj5TZXJ2ZXIgQ29uZmlndXJhdGlvbiBSZWZlcmVuY2U8L2E+LiAgVGhlCitmb2xsb3dpbmcgZGlzY3Vzc2lvbiBjb3ZlcnMgb25seSB0aG9zZSBhdHRyaWJ1dGVzIG9mIG1vc3QgaW50ZXJlc3Qgd2hlbgorc2V0dGluZyB1cCBTU0wgY29tbXVuaWNhdGlvbi48L3A+CisKKzxwPlRoZSA8Y29kZT5wb3J0PC9jb2RlPiBhdHRyaWJ1dGUgKGRlZmF1bHQgdmFsdWUgaXMgODQ0MykgaXMgdGhlIFRDUC9JUAorcG9ydCBudW1iZXIgb24gd2hpY2ggVG9tY2F0IHdpbGwgbGlzdGVuIGZvciBzZWN1cmUgY29ubmVjdGlvbnMuICBZb3UgY2FuCitjaGFuZ2UgdGhpcyB0byBhbnkgcG9ydCBudW1iZXIgeW91IHdpc2ggKHN1Y2ggYXMgdG8gdGhlIGRlZmF1bHQgcG9ydCBmb3IKKzxjb2RlPmh0dHBzPC9jb2RlPiBjb21tdW5pY2F0aW9ucywgd2hpY2ggaXMgNDQzKS4gIEhvd2V2ZXIsIHNwZWNpYWwgc2V0dXAKKyhvdXRzaWRlIHRoZSBzY29wZSBvZiB0aGlzIGRvY3VtZW50KSBpcyBuZWNlc3NhcnkgdG8gcnVuIFRvbWNhdCBvbiBwb3J0CitudW1iZXJzIGxvd2VyIHRoYW4gMTAyNCBvbiBtYW55IG9wZXJhdGluZyBzeXN0ZW1zLjwvcD4KKworICA8YmxvY2txdW90ZT48ZW0+CisgIDxwPklmIHlvdSBjaGFuZ2UgdGhlIHBvcnQgbnVtYmVyIGhlcmUsIHlvdSBzaG91bGQgYWxzbyBjaGFuZ2UgdGhlCisgIHZhbHVlIHNwZWNpZmllZCBmb3IgdGhlIDxjb2RlPnJlZGlyZWN0UG9ydDwvY29kZT4gYXR0cmlidXRlIG9uIHRoZQorICBub24tU1NMIGNvbm5lY3Rvci4gIFRoaXMgYWxsb3dzIFRvbWNhdCB0byBhdXRvbWF0aWNhbGx5IHJlZGlyZWN0CisgIHVzZXJzIHdobyBhdHRlbXB0IHRvIGFjY2VzcyBhIHBhZ2Ugd2l0aCBhIHNlY3VyaXR5IGNvbnN0cmFpbnQgc3BlY2lmeWluZworICB0aGF0IFNTTCBpcyByZXF1aXJlZCwgYXMgcmVxdWlyZWQgYnkgdGhlIFNlcnZsZXQgMi40IFNwZWNpZmljYXRpb24uPC9wPgorICA8L2VtPjwvYmxvY2txdW90ZT4KKworPHA+VGhlcmUgYXJlIGFkZGlvbmFsIG9wdGlvbiB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgU1NMIHByb3RvY29sLgorICBZb3UgbWF5IG5lZWQgdG8gYWRkIG9yIGNoYW5nZSB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZQordmFsdWVzLCBkZXBlbmRpbmcgb24gaG93IHlvdSBjb25maWd1cmVkIHlvdXIga2V5c3RvcmUgZWFybGllcjo8L3A+CisKKzx0YWJsZSBib3JkZXI9IjEiPgorICA8dHI+CisgICAgPHRoPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoPkRlc2NyaXB0aW9uPC90aD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD48Y29kZT5jbGllbnRBdXRoPC9jb2RlPjwvdGQ+CisgICAgPHRkPlNldCB0aGlzIHZhbHVlIHRvIDxjb2RlPnRydWU8L2NvZGU+IGlmIHlvdSB3YW50IFRvbWNhdCB0byByZXF1aXJlCisgICAgICAgIGFsbCBTU0wgY2xpZW50cyB0byBwcmVzZW50IGEgY2xpZW50IENlcnRpZmljYXRlIGluIG9yZGVyIHRvIHVzZQorICAgICAgICB0aGlzIHNvY2tldC4gIFNldCB0aGlzIHZhbHVlIHRvIDxjb2RlPndhbnQ8L2NvZGU+IGlmIHlvdSB3YW50IFRvbWNhdAorICAgICAgICB0byByZXF1ZXN0IGEgY2xpZW50IENlcnRpZmljYXRlLCBidXQgbm90IGZhaWwgaWYgb25lIGlzbid0IHByZXNlbnRlZC4KKyAgICA8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPjxjb2RlPmtleXN0b3JlRmlsZTwvY29kZT48L3RkPgorICAgIDx0ZD5BZGQgdGhpcyBhdHRyaWJ1dGUgaWYgdGhlIGtleXN0b3JlIGZpbGUgeW91IGNyZWF0ZWQgaXMgbm90IGluCisgICAgICAgIHRoZSBkZWZhdWx0IHBsYWNlIHRoYXQgVG9tY2F0IGV4cGVjdHMgKGEgZmlsZSBuYW1lZAorICAgICAgICA8Y29kZT4ua2V5c3RvcmU8L2NvZGU+IGluIHRoZSB1c2VyIGhvbWUgZGlyZWN0b3J5IHVuZGVyCisgICAgICAgIHdoaWNoIFRvbWNhdCBpcyBydW5uaW5nKS4gIFlvdSBjYW4gc3BlY2lmeSBhbiBhYnNvbHV0ZSBwYXRobmFtZSwKKyAgICAgICAgb3IgYSByZWxhdGl2ZSBwYXRobmFtZSB0aGF0IGlzIHJlc29sdmVkIGFnYWluc3QgdGhlCisgICAgICAgIDxjb2RlPiRDQVRBTElOQV9CQVNFPC9jb2RlPiBlbnZpcm9ubWVudCB2YXJpYWJsZS48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPjxjb2RlPmtleXN0b3JlUGFzczwvY29kZT48L3RkPgorICAgIDx0ZD5BZGQgdGhpcyBlbGVtZW50IGlmIHlvdSB1c2VkIGEgZGlmZmVyZW50IGtleXN0b3JlIChhbmQgQ2VydGlmaWNhdGUpCisgICAgICAgIHBhc3N3b3JkIHRoYW4gdGhlIG9uZSBUb21jYXQgZXhwZWN0cyAoPGNvZGU+Y2hhbmdlaXQ8L2NvZGU+KS48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPjxjb2RlPmtleXN0b3JlVHlwZTwvY29kZT48L3RkPgorICAgIDx0ZD5BZGQgdGhpcyBlbGVtZW50IGlmIHVzaW5nIGEgUEtDUzEyIGtleXN0b3JlLiAgVGhlIHZhbGlkIHZhbHVlcyBhcmUKKyAgICAgICAgPGNvZGU+SktTPC9jb2RlPiBhbmQgPGNvZGU+UEtDUzEyPC9jb2RlPi48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPjxjb2RlPnNzbFByb3RvY29sPC9jb2RlPjwvdGQ+CisgICAgPHRkPlRoZSBlbmNyeXB0aW9uL2RlY3J5cHRpb24gcHJvdG9jb2wgdG8gYmUgdXNlZCBvbiB0aGlzIHNvY2tldC4KKyAgICAgICAgSXQgaXMgbm90IHJlY29tbWVuZGVkIHRvIGNoYW5nZSB0aGlzIHZhbHVlIGlmIHlvdSBhcmUgdXNpbmcgU3VuJ3MKKyAgICAgICAgSlZNLiAgSXQgaXMgcmVwb3J0ZWQgdGhhdCBJQk0ncyAxLjQuMSBpbXBsZW1lbnRhdGlvbgorICAgICAgICBvZiB0aGUgVExTIHByb3RvY29sIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggc29tZSBwb3B1bGFyIGJyb3dzZXJzLgorICAgICAgICBJbiB0aGlzIGNhc2UsIHVzZSB0aGUgdmFsdWUgPGNvZGU+U1NMPC9jb2RlPi48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPjxjb2RlPmNpcGhlcnM8L2NvZGU+PC90ZD4KKyAgICA8dGQ+VGhlIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGVuY3J5cHRpb24gY2lwaGVycyB0aGF0IHRoaXMgc29ja2V0IGlzIAorICAgICAgICBhbGxvd2VkIHRvIHVzZS4gIEJ5IGRlZmF1bHQsIGFueSBhdmFpbGFibGUgY2lwaGVyIGlzIGFsbG93ZWQuPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD48Y29kZT5hbGdvcml0aG08L2NvZGU+PC90ZD4KKyAgICA8dGQ+VGhlIDxjb2RlPlg1MDk8L2NvZGU+IGFsZ29yaXRobSB0byB1c2UuICBUaGlzIGRlZmF1bHRzIHRvIHRoZSBTdW4gCisgICAgICAgIGltcGxlbWVudGF0aW9uICg8Y29kZT5TdW5YNTA5PC9jb2RlPikuICBGb3IgSUJNIEpWTXMgeW91IHNob3VsZCB1c2UKKyAgICAgICAgdGhlIHZhbHVlIDxjb2RlPklibVg1MDk8L2NvZGU+LiAgRm9yIG90aGVyIHZlbmRvcnMsIGNvbnN1bHQgdGhlIEpWTQorICAgICAgICBkb2N1bWVudGF0aW9uIGZvciB0aGUgY29ycmVjdCB2YWx1ZS4KKyAgICA8L3RkPgorICA8L3RyPgorICA8dHI+CisgICA8dGQ+PGNvZGU+dHJ1c3RzdG9yZUZpbGU8L2NvZGU+PC90ZD4KKyAgIDx0ZD5UaGUgVHJ1c3RTdG9yZSBmaWxlIHRvIHVzZSB0byB2YWxpZGF0ZSBjbGllbnQgY2VydGlmaWNhdGVzLjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgIDx0ZD48Y29kZT50cnVzdHN0b3JlUGFzczwvY29kZT48L3RkPgorICAgPHRkPlRoZSBwYXNzd29yZCB0byBhY2Nlc3MgdGhlIFRydXN0U3RvcmUuICBUaGlzIGRlZmF1bHRzIHRvIHRoZSB2YWx1ZQorICAgICAgIG9mIDxjb2RlPmtleXN0b3JlUGFzczwvY29kZT4uPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgPHRkPjxjb2RlPnRydXN0c3RvcmVUeXBlPC9jb2RlPjwvdGQ+CisgICAgPHRkPkFkZCB0aGlzIGVsZW1lbnQgaWYgeW91ciBhcmUgdXNpbmcgYSBkaWZmZXJlbnQgZm9ybWF0IGZvciB0aGUgCisgICAgICAgIFRydXN0U3RvcmUgdGhlbiB5b3UgYXJlIHVzaW5nIGZvciB0aGUgS2V5U3RvcmUuICBUaGUgdmFsaWQgdmFsdWVzIGFyZQorICAgICAgICA8Y29kZT5KS1M8L2NvZGU+IGFuZCA8Y29kZT5QS0NTMTI8L2NvZGU+LjwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorCis8cD5BZnRlciBjb21wbGV0aW5nIHRoZXNlIGNvbmZpZ3VyYXRpb24gY2hhbmdlcywgeW91IG11c3QgcmVzdGFydCBUb21jYXQgYXMKK3lvdSBub3JtYWxseSBkbywgYW5kIHlvdSBzaG91bGQgYmUgaW4gYnVzaW5lc3MuICBZb3Ugc2hvdWxkIGJlIGFibGUgdG8gYWNjZXNzCithbnkgd2ViIGFwcGxpY2F0aW9uIHN1cHBvcnRlZCBieSBUb21jYXQgdmlhIFNTTC4gIEZvciBleGFtcGxlLCB0cnk6PC9wPgorPHNvdXJjZT4KK2h0dHBzOi8vbG9jYWxob3N0Ojg0NDMKKzwvc291cmNlPgorCis8cD5hbmQgeW91IHNob3VsZCBzZWUgdGhlIHVzdWFsIFRvbWNhdCBzcGxhc2ggcGFnZSAodW5sZXNzIHlvdSBoYXZlIG1vZGlmaWVkCit0aGUgUk9PVCB3ZWIgYXBwbGljYXRpb24pLiAgSWYgdGhpcyBkb2VzIG5vdCB3b3JrLCB0aGUgZm9sbG93aW5nIHNlY3Rpb24KK2NvbnRhaW5zIHNvbWUgdHJvdWJsZXNob290aW5nIHRpcHMuPC9wPgorCis8L3N1YnNlY3Rpb24+CisKKzwvc2VjdGlvbj4KKworPHNlY3Rpb24gbmFtZT0iSW5zdGFsbGluZyBhIENlcnRpZmljYXRlIGZyb20gYSBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkiPgorPHA+VG8gb2JzdGFpbiBhbmQgaW5zdGFsbCBhIENlcnRpZmljYXRlIGZyb20gYSBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgKGxpa2UgdmVyaXNpZ24uY29tLCB0aGF3dGUuY29tIAorb3IgdHJ1c3RjZW50ZXIuZGUpIHlvdSBzaG91bGQgaGF2ZSByZWFkIHRoZSBwcmV2aW91cyBzZWN0aW9uIGFuZCB0aGVuIGZvbGxvdyB0aGVzZSBpbnN0cnVjdGlvbnM6PC9wPgorCis8c3Vic2VjdGlvbiBuYW1lPSJDcmVhdGUgYSBsb2NhbCBDZXJ0aWZpY2F0ZSBTaWduaW5nIFJlcXVlc3QgKENTUikiPgorPHA+SW4gb3JkZXIgdG8gb2J0YWluIGEgQ2VydGlmaWNhdGUgZnJvbSB0aGUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IG9mIHlvdXIgY2hvaWNlIAoreW91IGhhdmUgdG8gY3JlYXRlIGEgc28gY2FsbGVkIENlcnRpZmljYXRlIFNpZ25pbmcgUmVxdWVzdCAoQ1NSKS4gVGhhdCBDU1Igd2lsbCBiZSB1c2VkIAorYnkgdGhlIENlcnRpZmljYXRlIEF1dGhvcml0eSB0byBjcmVhdGUgYSBDZXJ0aWZpY2F0ZSB0aGF0IHdpbGwgaWRlbnRpZnkgeW91ciB3ZWJzaXRlIAorYXMgInNlY3VyZSIuIFRvIGNyZWF0ZSBhIENTUiBmb2xsb3cgdGhlc2Ugc3RlcHM6PC9wPgorPHVsPgorPGxpPkNyZWF0ZSBhIGxvY2FsIENlcnRpZmljYXRlIChhcyBkZXNjcmliZWQgaW4gdGhlIHByZXZpb3VzIHNlY3Rpb24pOgorCTxzb3VyY2U+a2V5dG9vbCAtZ2Vua2V5IC1hbGlhcyB0b21jYXQgLWtleWFsZyBSU0EgXAorCS1rZXlzdG9yZSAmbHQ7eW91cl9rZXlzdG9yZV9maWxlbmFtZSZndDs8L3NvdXJjZT4KKwlOb3RlOiBJbiBzb21lIGNhc2VzIHlvdSB3aWxsIGhhdmUgdG8gZW50ZXIgdGhlIGRvbWFpbiBvZiB5b3VyIHdlYnNpdGUgKGkuZS4gPGNvZGU+d3d3Lm15c2lkZS5vcmc8L2NvZGU+KQorCWluIHRoZSBmaWVsZCAiZmlyc3QtIGFuZCBsYXN0bmFtZSIgaW4gb3JkZXIgdG8gY3JlYXRlIGEgd29ya2luZyBDZXJ0aWZpY2F0ZS4gCis8L2xpPgorPGxpPlRoZSBDU1IgaXMgdGhlbiBjcmVhdGVkIHdpdGg6CisJPHNvdXJjZT5rZXl0b29sIC1jZXJ0cmVxIC1rZXlhbGcgUlNBIC1hbGlhcyB0b21jYXQgLWZpbGUgY2VydHJlcS5jc3IgXAorCS1rZXlzdG9yZSAmbHQ7eW91cl9rZXlzdG9yZV9maWxlbmFtZSZndDs8L3NvdXJjZT4KKzwvbGk+Cis8L3VsPgorPHA+Tm93IHlvdSBoYXZlIGEgZmlsZSBjYWxsZWQgPGNvZGU+Y2VydHJlcS5jc3I8L2NvZGU+IHRoYXQgeW91IGNhbiBzdWJtaXQgdG8gdGhlIENlcnRpZmljYXRlIEF1dGhvcml0eSAobG9vayBhdCB0aGUKK2RvY3VtZW5hdGlvbiBvZiB0aGUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IHdlYnNpdGUgb24gaG93IHRvIGRvIHRoaXMpLiBJbiByZXR1cm4geW91IGdldCBhIENlcnRpZmljYXRlLjwvcD4KKzwvc3Vic2VjdGlvbj4KKworPHN1YnNlY3Rpb24gbmFtZT0iSW1wb3J0aW5nIHRoZSBDZXJ0aWZpY2F0ZSI+Cis8cD5Ob3cgdGhhdCB5b3UgaGF2ZSB5b3VyIENlcnRpZmljYXRlIHlvdSBjYW4gaW1wb3J0IGl0IGludG8geW91IGxvY2FsIGtleXN0b3JlLiAKK0ZpcnN0IG9mIGFsbCB5b3UgaGF2ZSB0byBpbXBvcnQgYSBzbyBjYWxsZWQgQ2hhaW4gQ2VydGlmaWNhdGUgb3IgUm9vdCBDZXJ0aWZpY2F0ZSBpbnRvIHlvdXIga2V5c3RvcmUuIAorQWZ0ZXIgdGhhdCB5b3UgY2FuIHByb2NlZGUgd2l0aCBpbXBvcnRpbmcgeW91ciBDZXJ0aWZpY2F0ZS48L3A+CisKKzx1bD4KKzxsaT5Eb3dubG9hZCBhIENoYWluIENlcnRpZmljYXRlIGZyb20gdGhlIENlcnRpZmljYXRlIEF1dGhvcml0eSB5b3Ugb2J0YWluZWQgdGhlIENlcnRpZmljYXRlIGZyb20uPGJyLz4KKwlGb3IgVmVyaXNpZ24uY29tIGdvIHRvOiBodHRwOi8vd3d3LnZlcmlzaWduLmNvbS9zdXBwb3J0L2luc3RhbGwvaW50ZXJtZWRpYXRlLmh0bWw8YnIvPgorCUZvciBUcnVzdGNlbnRlci5kZSBnbyB0bzogaHR0cDovL3d3dy50cnVzdGNlbnRlci5kZS9jZXJ0c2VydmljZXMvY2FjZXJ0cy9lbi9lbi5odG0jc2VydmVyPGJyLz4KKwlGb3IgVGhhd3RlLmNvbSBnbyB0bzogaHR0cDovL3d3dy50aGF3dGUuY29tL2NlcnRzL3RydXN0bWFwLmh0bWw8YnIvPgorPC9saT4KKzxsaT5JbXBvcnQgdGhlIENoYWluIENlcnRpZmljYXRlIGludG8geW91IGtleXN0b3JlCisgICAgPHNvdXJjZT5rZXl0b29sIC1pbXBvcnQgLWFsaWFzIHJvb3QgLWtleXN0b3JlICZsdDt5b3VyX2tleXN0b3JlX2ZpbGVuYW1lJmd0OyBcCisJLXRydXN0Y2FjZXJ0cyAtZmlsZSAmbHQ7ZmlsZW5hbWVfb2ZfdGhlX2NoYWluX2NlcnRpZmljYXRlJmd0Ozwvc291cmNlPgorPC9saT4KKzxsaT5BbmQgZmluYWxseSBpbXBvcnQgeW91ciBuZXcgQ2VydGlmaWNhdGUKKwk8c291cmNlPmtleXRvb2wgLWltcG9ydCAtYWxpYXMgdG9tY2F0IC1rZXlzdG9yZSAmbHQ7eW91cl9rZXlzdG9yZV9maWxlbmFtZSZndDsgXAorCS10cnVzdGNhY2VydHMgLWZpbGUgJmx0O3lvdXJfY2VydGlmaWNhdGVfZmlsZW5hbWUmZ3Q7PC9zb3VyY2U+Cis8L2xpPgorPC91bD4KKzwvc3Vic2VjdGlvbj4KKzwvc2VjdGlvbj4KKworPHNlY3Rpb24gbmFtZT0iVHJvdWJsZXNob290aW5nIj4KKworPHA+SGVyZSBpcyBhIGxpc3Qgb2YgY29tbW9uIHByb2JsZW1zIHRoYXQgeW91IG1heSBlbmNvdW50ZXIgd2hlbiBzZXR0aW5nIHVwCitTU0wgY29tbXVuaWNhdGlvbnMsIGFuZCB3aGF0IHRvIGRvIGFib3V0IHRoZW0uPC9wPgorCis8dWw+CisKKzxsaT5JIGdldCAiamF2YS5zZWN1cml0eS5Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb24iIGVycm9ycyBpbiBteQorICAgIGxvZyBmaWxlcy4KKyAgICA8YmxvY2txdW90ZT4KKyAgICA8cD5UaGUgSlZNIGNhbm5vdCBmaW5kIHRoZSBKU1NFIEpBUiBmaWxlcy4gIEZvbGxvdyBhbGwgb2YgdGhlIGRpcmVjdGlvbnMgdG8KKyAgICA8YSBocmVmPSIjRG93bmxvYWQgYW5kIEluc3RhbGwgSlNTRSI+ZG93bmxvYWQgYW5kIGluc3RhbGwgSlNTRTwvYT4uPC9wPgorICAgIDwvYmxvY2txdW90ZT48L2xpPgorCis8bGk+V2hlbiBUb21jYXQgc3RhcnRzIHVwLCBJIGdldCBhbiBleGNlcHRpb24gbGlrZQorICAgICJqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjoge3NvbWUtZGlyZWN0b3J5fS97c29tZS1maWxlfSBub3QgZm91bmQiLgorICAgIDxibG9ja3F1b3RlPgorICAgIDxwPkEgbGlrZWx5IGV4cGxhbmF0aW9uIGlzIHRoYXQgVG9tY2F0IGNhbm5vdCBmaW5kIHRoZSBrZXlzdG9yZSBmaWxlCisgICAgd2hlcmUgaXQgaXMgbG9va2luZy4gIEJ5IGRlZmF1bHQsIFRvbWNhdCBleHBlY3RzIHRoZSBrZXlzdG9yZSBmaWxlIHRvCisgICAgYmUgbmFtZWQgPGNvZGU+LmtleXN0b3JlPC9jb2RlPiBpbiB0aGUgdXNlciBob21lIGRpcmVjdG9yeSB1bmRlciB3aGljaAorICAgIFRvbWNhdCBpcyBydW5uaW5nICh3aGljaCBtYXkgb3IgbWF5IG5vdCBiZSB0aGUgc2FtZSBhcyB5b3VycyA6LSkuICBJZgorICAgIHRoZSBrZXlzdG9yZSBmaWxlIGlzIGFueXdoZXJlIGVsc2UsIHlvdSB3aWxsIG5lZWQgdG8gYWRkIGEKKyAgICA8Y29kZT5rZXlzdG9yZUZpbGU8L2NvZGU+IGF0dHJpYnV0ZSB0byB0aGUgPGNvZGU+Jmx0O0ZhY3RvcnkmZ3Q7PC9jb2RlPgorICAgIGVsZW1lbnQgaW4gdGhlIDxhIGhyZWY9IiNFZGl0IHRoZSBUb21jYXQgQ29uZmlndXJhdGlvbiBGaWxlIj5Ub21jYXQKKyAgICBjb25maWd1cmF0aW9uIGZpbGU8L2E+LjwvcD4KKyAgICA8L2Jsb2NrcXVvdGU+PC9saT4KKworPGxpPldoZW4gVG9tY2F0IHN0YXJ0cyB1cCwgSSBnZXQgYW4gZXhjZXB0aW9uIGxpa2UKKyAgICAiamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb246ICBLZXlzdG9yZSB3YXMgdGFtcGVyZWQgd2l0aCwgb3IKKyAgICBwYXNzd29yZCB3YXMgaW5jb3JyZWN0Ii4KKyAgICA8YmxvY2txdW90ZT4KKyAgICA8cD5Bc3N1bWluZyB0aGF0IHNvbWVvbmUgaGFzIG5vdCA8ZW0+YWN0dWFsbHk8L2VtPiB0YW1wZXJlZCB3aXRoCisgICAgeW91ciBrZXlzdG9yZSBmaWxlLCB0aGUgbW9zdCBsaWtlbHkgY2F1c2UgaXMgdGhhdCBUb21jYXQgaXMgdXNpbmcKKyAgICBhIGRpZmZlcmVudCBwYXNzd29yZCB0aGFuIHRoZSBvbmUgeW91IHVzZWQgd2hlbiB5b3UgY3JlYXRlZCB0aGUKKyAgICBrZXlzdG9yZSBmaWxlLiAgVG8gZml4IHRoaXMsIHlvdSBjYW4gZWl0aGVyIGdvIGJhY2sgYW5kCisgICAgPGEgaHJlZj0iI1ByZXBhcmUgdGhlIENlcnRpZmljYXRlIEtleXN0b3JlIj5yZWNyZWF0ZSB0aGUga2V5c3RvcmUKKyAgICBmaWxlPC9hPiwgb3IgeW91IGNhbiBhZGQgb3IgdXBkYXRlIHRoZSA8Y29kZT5rZXlzdG9yZVBhc3M8L2NvZGU+CisgICAgYXR0cmlidXRlIG9uIHRoZSA8Y29kZT4mbHQ7RmFjdG9yeSZndDs8L2NvZGU+IGVsZW1lbnQgaW4gdGhlCisgICAgPGEgaHJlZj0iI0VkaXQgdGhlIFRvbWNhdCBDb25maWd1cmF0aW9uIEZpbGUiPlRvbWNhdCBjb25maWd1cmF0aW9uCisgICAgZmlsZTwvYT4uICA8c3Ryb25nPlJFTUlOREVSPC9zdHJvbmc+IC0gUGFzc3dvcmRzIGFyZSBjYXNlIHNlbnNpdGl2ZSE8L3A+CisgICAgPC9ibG9ja3F1b3RlPjwvbGk+CisKKzwvdWw+CisKKzxwPklmIHlvdSBhcmUgc3RpbGwgaGF2aW5nIHByb2JsZW1zLCBhIGdvb2Qgc291cmNlIG9mIGluZm9ybWF0aW9uIGlzIHRoZQorPHN0cm9uZz5UT01DQVQtVVNFUjwvc3Ryb25nPiBtYWlsaW5nIGxpc3QuICBZb3UgY2FuIGZpbmQgcG9pbnRlcnMgdG8gYXJjaGl2ZXMKK29mIHByZXZpb3VzIG1lc3NhZ2VzIG9uIHRoaXMgbGlzdCwgYXMgd2VsbCBhcyBzdWJzY3JpcHRpb24gYW5kIHVuc3Vic2NyaXB0aW9uCitpbmZvcm1hdGlvbiwgYXQKKzxhIGhyZWY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvc2l0ZS9tYWlsLmh0bWwiPmh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvc2l0ZS9tYWlsLmh0bWwiPC9hPi48L3A+CisKKzwvc2VjdGlvbj4KKworPC9ib2R5PgorCis8L2RvY3VtZW50PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9zdGF0dXMueG1sIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy9zdGF0dXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzNDRiYjUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL3N0YXR1cy54bWwKQEAgLTAsMCArMSwxMjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCFET0NUWVBFIGRvY3VtZW50IFsKKyAgPCFFTlRJVFkgcHJvamVjdCBTWVNURU0gInByb2plY3QueG1sIj4KK10+Cis8ZG9jdW1lbnQgdXJsPSJzdGF0dXMuaHRtbCI+CisKKyAgJnByb2plY3Q7CisKKyAgPHByb3BlcnRpZXM+CisgICAgPGF1dGhvciBlbWFpbD0icmVtbUBhcGFjaGUub3JnIj5SZW15IE1hdWNoZXJhdDwvYXV0aG9yPgorICAgIDxhdXRob3IgZW1haWw9InlvYXZzQGFwYWNoZS5vcmciPllvYXYgU2hhcGlyYTwvYXV0aG9yPgorICAgIDx0aXRsZT5Qcm9qZWN0IFN0YXR1czwvdGl0bGU+CisgIDwvcHJvcGVydGllcz4KKworPGJvZHk+CisgIDxzZWN0aW9uIG5hbWU9IlByZWZhY2UiPgorICAgIDxwPgorICAgICAgVGhpcyBkb2N1bWVudCBhdHRlbXB0cyB0byBjb252ZXkgdGhlIGN1cnJlbnQgc3RhdHVzIG9mIFRvbWNhdCBkZXZlbG9wbWVudAorICAgICAgaW4gImJpZyBwaWN0dXJlIiB0ZXJtcy4gIFRoaXMgaXMgbm90IHRoZSBwbGFjZSB0byBjaGVjayBpZiBhbiBpbmRpdmlkdWFsCisgICAgICBidWcgcmVwb3J0IGhhcyBiZWVuIGFkZHJlc3NlZCBvciB3aGVuIGFuIGluZGl2aWR1YWwgZmVhdHVyZSB3aWxsIGJlIGF2YWlsYWJsZS4KKyAgICA8L3A+CisgICAgPHA+CisgICAgICBUaGlzIHBhZ2UgaXMgdXBkYXRlZCByb3VnaGx5IG9uY2UgcGVyIGV2ZXJ5IGNvdXBsZSBvZiBUb21jYXQgbWlub3IgcmVsZWFzZXMsCisgICAgICBzbyBmb3IgZGF5LXRvLWRheSBzdGF0dXMgeW91IHNob3VsZCBjaGVjayB0aGUgdG9tY2F0LXVzZXIgYW5kIHRvbWNhdC1kZXYgbWFpbGluZworICAgICAgbGlzdHMuICBZb3UgY2FuIGFsd2F5cyBpbnF1aXJlIHRoZXJlIGFzIHRvIHRoZSBhdmFpbGFiaWxpdHkgb3Igc3RhdHVzIG9mIGEKKyAgICAgIHNwZWNpZmljIGZlYXR1cmUgb3IgY29tcG9uZW50LgorICAgIDwvcD4KKyAgPC9zZWN0aW9uPgorCisgIDxzZWN0aW9uIG5hbWU9IkN1cnJlbnQgU3RhdHVzIFN1bW1hcnkiPgorICAgIDxwPgorICAgICAgPGI+VG9tY2F0IDUuMC4yNzwvYj4gd2FzIHJlbGVhc2VkIG9uIEp1bmUgMTd0aCwgMjAwNC4gIEF0IHRoYXQgdGltZSwgdGhlIFRPTUNBVF81XzAKKyAgICAgIGJyYW5jaCB3YXMgdGFnZ2VkIGluIENWUywgYW5kIHdvcmsgb24gVG9tY2F0IDUuNSBiZWdhbi4gIFVudGlsIHRoZSBmaXJzdCBzdGFibGUgCisgICAgICByZWxlYXNlIG9mIFRvbWNhdCA1LjUsIGJ1aWxkaW5nIGZyb20KKyAgICAgIENWUyBoZWFkIG1heSBiZSB1bnN0YWJsZSBvciBicm9rZW46IHVzZSB0aGUgVE9NQ0FUXzVfMCBicmFuY2ggdGFnIHRvIGJ1aWxkCisgICAgICB0aGUgVG9tY2F0IDUuMCByZWxlYXNlcy4KKyAgICA8L3A+CisgICAgPHA+CisgICAgICA8Yj5Ub21jYXQgNS41PC9iPiBoYXMgc2V2ZXJhbCBtYWpvciBnb2Fscy4gIFRoZXkgYXJlIGRpc2N1c3NlZCBpbiB0aGUgdG9tY2F0LWRldgorICAgICAgbWFpbGluZyBsaXN0J3MgIjUubmV4dCIgdGhyZWFkOiAKKyAgICAgIDxhIGhyZWY9Imh0dHA6Ly9tYXJjLnRoZWFpbXNncm91cC5jb20vP2w9dG9tY2F0LWRldiZhbXA7dz0yJmFtcDtyPTEmYW1wO3M9NS5uZXh0JmFtcDtxPWIiPk1BUkM8L2E+LgorICAgICAgVGhlIHN0YXR1cyBvZiBzb21lIG9mIHRoZXNlIGl0ZW1zIGlzIGRldGFpbGVkIGJlbG93LiAgT25jZSA1LjUgcmVsZWFzZXMgYXJlCisgICAgICBhdmFpbGFibGUsIHBsZWFzZSByZWZlciB0byB0aGUgQ2hhbmdlbG9nIGFjY29tcGFueWluZyBlYWNoIHJlbGVhc2UgZm9yIGRldGFpbGVkCisgICAgICBjaGFuZ2VzLCBlbmhhbmNlbWVudHMsIGFuZCBmaXhlcy4KKyAgICA8L3A+CisgICAgPHA+CisgICAgICA8Yj5Ub21jYXQgNC4xLng8L2I+IGlzIG5vIGxvbmdlciBhY3RpdmVseSBkZXZlbG9wZWQuICBJdCBpcyBtYWludGFpbmVkIHRvIGFkZHJlc3MKKyAgICAgIG9ubHkgc2hvd3N0b3BwZXIsIHNlY3VyaXR5LCBhbmQgU2VydmxldCBTcGVjaWZpY2F0aW9uIGNvbXBsaWFuY2UgaXNzdWVzLiAgTWFpbnRlbmFuY2UKKyAgICAgIGZvciBUb21jYXQgNC4xLnggd2lsbCBsaWtlbHkgY2Vhc2Ugb25jZSBhIHN0YWJsZSByZWxlYXNlIG9yIHR3byBvZiBUb21jYXQgNS41IGFyZSBvdXQuCisgICAgICBVc2VycyBvZiBUb21jYXQgNC4xLnggYXJlIHN0cm9uZ2x5IGVuY291cmFnZWQgdG8gdXBncmFkZSB0byB0aGUgbGF0ZXN0IHN0YWJsZSBUb21jYXQKKyAgICAgIDUuMCByZWxlYXNlLgorICAgIDwvcD4KKyAgICA8cD4KKyAgICAgIDxiPlRvbWNhdCA0LjAueDwvYj4gaXMgcmVsYXRpdmVseSBvbGQsIGFuZCBub3QgYWN0aXZlbHkgbWFpbnRhaW5lZCBvciBzdXBwb3J0ZWQuCisgICAgICBJdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB0aGF0IHVzZXJzIG9mIHRoZXNlIHJlbGVhc2VzIHVwZ3JhZGUgdG8gdGhlIGxhdGVzdAorICAgICAgc3RhYmxlIFRvbWNhdCA1LjAgcmVsZWFzZSBvciBhdCBsZWFzdCB0aGUgbGF0ZXN0IHN0YWJsZSBUb21jYXQgNC4xIHJlbGVhc2UuCisgICAgPC9wPgorICAgIDxwPgorICAgICAgPGI+VG9tY2F0IDMuMy54PC9iPiBpcyBpbiByb3VnaGx5IHRoZSBzYW1lIG1haW50ZW5hbmNlIG1vZGUgYXMgVG9tY2F0IDQuMS54LgorICAgIDwvcD4KKyAgICA8cD4KKyAgICAgIDxiPlRvbWNhdCAzLjI8L2I+IGFuZCBlYXJsaWVyIGFyZSBpbiByb3VnaGx5IHRoZSBzYW1lIHN1cHBvcnQgc3RhdGUgYXMgVG9tY2F0IDQuMC54LgorICAgICAgVXNlcnMgc2hvdWxkIHVwZ3JhZGUgdG8gVG9tY2F0IDMuMy54IG9yIHRoZSBsYXRlc3Qgc3RhYmxlIFRvbWNhdCA1LjAueC4KKyAgICA8L3A+CisgIDwvc2VjdGlvbj4KKworICA8c2VjdGlvbiBuYW1lPSJIb3cgdG8gcmVhZCB0aGUgcmVwb3J0Ij4KKyAgICAKKyAgICA8cD4KKyAgICAgIFRoZSBjb2x1bW5zIGluIHRoaXMgcmVwb3J0IGNvbnRhaW4gdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbjoKKyAgICA8dWw+CisgICAgICA8bGk+PGI+UHJpb3JpdHk8L2I+IC0gQSBzZW5zZSBvZiBob3cgaW1wb3J0YW50IGl0IGlzIHRvIGFkZHJlc3MgdGhpcyAKKyAgICAgICAgaXNzdWUgaW4gdGhlIHNob3J0IHRlcm0uPC9saT4KKyAgICAgIDxsaT48Yj5BY3Rpb24gSXRlbTwvYj4gLSBDb25jaXNlIGRlc2NyaXB0aW9uIG9mIHRoZSBhY3Rpb24gaXRlbQorICAgICAgICB0byBiZSBjb21wbGV0ZWQuICBXaGVyZSByZWxldmFudCwgSmF2YSBwYWNrYWdlIG5hbWVzIG9mIHRoZQorICAgICAgICBwcmltYXJ5IGNsYXNzZXMgaW52b2x2ZWQgYXJlIGxpc3RlZCBpbiBbc3F1YXJlIGJyYWNrZXRzXTwvbGk+CisgICAgICA8bGk+PGI+Vm9sdW50ZWVyczwvYj4gLSBMb2dpbiBvZiB0aG9zZSBkZXZlbG9wZXJzIHdobworICAgICAgICBoYXZlIHZvbHVudGVlcmVkIHRvIGFzc2lzdCBpbiB0aGUgZGVzaWduLCBpbXBsZW1lbnRhdGlvbiwgdGVzdGluZywgYW5kCisgICAgICAgIGRvY3VtZW50YXRpb24gb2YgdGhpcyBhY3Rpb24gaXRlbSdzIGNoYW5nZXMgdG8gVG9tY2F0LjwvbGk+CisgICAgPC91bD4KKyAgICAgIERldmVsb3BlcnMgY2FuIG5vbWluYXRlCisgICAgICB0aGVtc2VsdmVzIHRvIHdvcmsgb24gcGFydGljdWxhciBhY3Rpb24gaXRlbXMgYnkgYXNraW5nIGEgQ29tbWl0dGVyIHRvIAorICAgICAgYWRkIHRoZWlyIG5hbWUgYWRkcmVzcyB0byB0aG9zZSBpdGVtcy4gIFRoZSBkZXZlbG9wZXJzIAorICAgICAgd29ya2luZyBvbiBlYWNoIGl0ZW0gc2hvdWxkIGRpc2N1c3MgYW5kIGFncmVlIHVwb24gdGhlIGFwcHJvYWNoIHRvIGJlIAorICAgICAgdXNlZCBmb3IgaW1wbGVtZW50aW5nIHRoZSBpdGVtJ3MgY2hhbmdlcyB0byB0aGUgcHJvamVjdCBzb3VyY2UgY29kZSAKKyAgICAgIGFuZCBkb2N1bWVudGF0aW9uLCBwcmlvciB0byBjb21wbGV0aW5nIHRob3NlIGNoYW5nZXMuICBTdWNoIGRpc2N1c3Npb25zIAorICAgICAgc2hvdWxkIHRha2UgcGxhY2Ugb24gdGhlIHRvbWNhdC1kZXYgbWFpbGluZyBsaXN0IHNvIHRoYXQgZXZlcnlvbmUgY2FuIAorICAgICAgc3RheSBhcHByaXNlZCBvZiB3aGF0IGlzIGdvaW5nIG9uLCBvciBjaGltZSBpbiBpZiB0aGV5IHdhbnQgdG8gCisgICAgICBjb250cmlidXRlIGlkZWFzIGFuZCBzdWdnZXN0aW9ucy4KKyAgICA8L3A+CisgICAgCisgIDwvc2VjdGlvbj4KKworICA8c2VjdGlvbiBuYW1lPSJUT0RPIExpc3QiPgorCisgICAgPHN0YXR1cz4KKyAgICAgIDxpdGVtIHByaW9yaXR5PSJIaWdoIiBvd25lcj0iY29zdGluIj4KKyAgICAgICAgUmVmYWN0b3IgQ2xhc3NMb2FkZXJzIGZvciBUb21jYXQgNS41IHRvIGFsbG93IGNvbnRhaW5lciBwbHVnaW5zLgorICAgICAgPC9pdGVtPgorICAgICAgPGl0ZW0gcHJpb3JpdHk9Ik1lZGl1bSIgb3duZXI9ImZoYW5payI+CisgICAgICAgIEVuaGFuY2UgQ2x1c3RlciBmdW5jdGlvbmFsaXR5IGZvciBUb21jYXQgNS41LgorICAgICAgPC9pdGVtPgorICAgICAgPGl0ZW0gcHJpb3JpdHk9IkxvdyIgb3duZXI9InlvYXZzLCByZW1tLCBmdW5rbWFuIj4KKyAgICAgICAgVXBkYXRlIGRvY3MsIHNpdGUsIGFuZCBGQVEgZm9yIFRvbWNhdCA1LjUgb25jZSByZWFkeS4KKyAgICAgIDwvaXRlbT4KKyAgICAgIDxpdGVtIHByaW9yaXR5PSJMb3ciIG93bmVyPSJldmVyeW9uZSI+CisgICAgICAgIENvbnRpbnVlIGZpeGluZyBidWdzIDspCisgICAgICA8L2l0ZW0+CisgICAgPC9zdGF0dXM+CisKKyAgPC9zZWN0aW9uPgorCisgIDxzZWN0aW9uIG5hbWU9Ik9wZW4gYnVncyI+CisgICAgCisgICAgPHA+CisgICAgICBUaGUgbGlzdCBvZiB0aGUgYnVncyB3aGljaCBhcmUgaW4gYW4gdW5yZXNvbHZlZCBzdGF0ZSBmb3IgVG9tY2F0IDUgY2FuIGJlCisgICAgICBzZWVuIAorICAgICAgPGEgaHJlZj0iaHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2J1Z3ppbGxhL2J1Z2xpc3QuY2dpP2J1Z19zdGF0dXM9VU5DT05GSVJNRUQmYW1wO2J1Z19zdGF0dXM9TkVXJmFtcDtidWdfc3RhdHVzPUFTU0lHTkVEJmFtcDtidWdfc3RhdHVzPVJFT1BFTkVEJmFtcDtidWdfc3RhdHVzPVJFU09MVkVEJmFtcDtyZXNvbHV0aW9uPUxBVEVSJmFtcDtyZXNvbHV0aW9uPVJFTUlORCZhbXA7cmVzb2x1dGlvbj0tLS0mYW1wO2VtYWlsMT0mYW1wO2VtYWlsdHlwZTE9c3Vic3RyaW5nJmFtcDtlbWFpbGFzc2lnbmVkX3RvMT0xJmFtcDtlbWFpbDI9JmFtcDtlbWFpbHR5cGUyPXN1YnN0cmluZyZhbXA7ZW1haWxyZXBvcnRlcjI9MSZhbXA7YnVnaWR0eXBlPWluY2x1ZGUmYW1wO2J1Z19pZD0mYW1wO2NoYW5nZWRpbj0mYW1wO3ZvdGVzPSZhbXA7Y2hmaWVsZGZyb209JmFtcDtjaGZpZWxkdG89Tm93JmFtcDtjaGZpZWxkdmFsdWU9JmFtcDtwcm9kdWN0PVRvbWNhdCs1JmFtcDtzaG9ydF9kZXNjPSZhbXA7c2hvcnRfZGVzY190eXBlPWFsbHdvcmRzc3Vic3RyJmFtcDtsb25nX2Rlc2M9JmFtcDtsb25nX2Rlc2NfdHlwZT1hbGx3b3Jkc3N1YnN0ciZhbXA7YnVnX2ZpbGVfbG9jPSZhbXA7YnVnX2ZpbGVfbG9jX3R5cGU9YWxsd29yZHNzdWJzdHImYW1wO2tleXdvcmRzPSZhbXA7a2V5d29yZHNfdHlwZT1hbnl3b3JkcyZhbXA7ZmllbGQwLTAtMD1ub29wJmFtcDt0eXBlMC0wLTA9bm9vcCZhbXA7dmFsdWUwLTAtMD0mYW1wO2NtZHR5cGU9ZG9pdCZhbXA7b3JkZXI9JTI3SW1wb3J0YW5jZSUyNyI+aGVyZTwvYT4uCisgICAgICBBc3BpcmluZyB2b2x1bnRlZXJzIGFuZCBvdGhlcnMgYXJlIHN0cm9uZ2x5IGVuY291cmFnZWQgdG8gYXR0ZW1wdCAKKyAgICAgIHRvIGNvbW1lbnQgYW5kIGhlbHAgcmVzb2x2ZSB0aGVzZSBpc3N1ZXMuCisgICAgPC9wPgorICAgIAorICA8L3NlY3Rpb24+CisKKzwvYm9keT4KKzwvZG9jdW1lbnQ+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9kb2NzL3RvbWNhdC1kb2NzLnhzbCBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3MvdG9tY2F0LWRvY3MueHNsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1MjgxODAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9kb2NzL3RvbWNhdC1kb2NzLnhzbApAQCAtMCwwICsxLDQyOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgorPCEtLSBDb250ZW50IFN0eWxlc2hlZXQgZm9yICJ0b21jYXQtZG9jcyIgRG9jdW1lbnRhdGlvbiAtLT4KKworPCEtLSAkSWQkIC0tPgorCis8eHNsOnN0eWxlc2hlZXQgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCisgIHZlcnNpb249IjEuMCI+CisKKworICA8IS0tIE91dHB1dCBtZXRob2QgLS0+CisgIDx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIKKyAgICAgICAgICAgIGVuY29kaW5nPSJpc28tODg1OS0xIgorICAgICAgICAgICAgICBpbmRlbnQ9Im5vIi8+CisKKworICA8IS0tIERlZmluZWQgcGFyYW1ldGVycyAob3ZlcnJpZGVhYmxlKSAtLT4KKyAgPHhzbDpwYXJhbSAgICBuYW1lPSJob21lLW5hbWUiICAgICAgICBzZWxlY3Q9IidUaGUgSmFrYXJ0YSBQcm9qZWN0JyIvPgorICA8eHNsOnBhcmFtICAgIG5hbWU9ImhvbWUtaHJlZiIgICAgICAgIHNlbGVjdD0iJ2h0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvJyIvPgorICA8eHNsOnBhcmFtICAgIG5hbWU9ImhvbWUtbG9nbyIgICAgICAgIHNlbGVjdD0iJy9pbWFnZXMvamFrYXJ0YS1sb2dvLmdpZiciLz4KKyAgPHhzbDpwYXJhbSAgICBuYW1lPSJwcmludGVyLWxvZ28iICAgICBzZWxlY3Q9IicvaW1hZ2VzL3ByaW50ZXIuZ2lmJyIvPgorICA8eHNsOnBhcmFtICAgIG5hbWU9InJlbGF0aXZlLXBhdGgiICAgIHNlbGVjdD0iJy4nIi8+CisgIDx4c2w6cGFyYW0gICAgbmFtZT0idm9pZC1pbWFnZSIgICAgICAgc2VsZWN0PSInL2ltYWdlcy92b2lkLmdpZiciLz4KKyAgPHhzbDpwYXJhbSAgICBuYW1lPSJwcm9qZWN0LW1lbnUiICAgICBzZWxlY3Q9IidtZW51JyIvPgorICA8eHNsOnBhcmFtICAgIG5hbWU9InN0YW5kYWxvbmUiICAgICAgIHNlbGVjdD0iJyciLz4KKyAgPHhzbDpwYXJhbSAgICBuYW1lPSJidWdsaW5rIiAgICAgICAgICBzZWxlY3Q9IidodHRwOi8vbmFnb3lhLmFwYWNoZS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPSciLz4KKworICA8IS0tIERlZmluZWQgdmFyaWFibGVzIChub24tb3ZlcnJpZGVhYmxlKSAtLT4KKyAgPHhzbDp2YXJpYWJsZSBuYW1lPSJib2R5LWJnIiAgICAgICAgICBzZWxlY3Q9IicjZmZmZmZmJyIvPgorICA8eHNsOnZhcmlhYmxlIG5hbWU9ImJvZHktZmciICAgICAgICAgIHNlbGVjdD0iJyMwMDAwMDAnIi8+CisgIDx4c2w6dmFyaWFibGUgbmFtZT0iYm9keS1saW5rIiAgICAgICAgc2VsZWN0PSInIzUyNUQ3NiciLz4KKyAgPHhzbDp2YXJpYWJsZSBuYW1lPSJiYW5uZXItYmciICAgICAgICBzZWxlY3Q9IicjNTI1RDc2JyIvPgorICA8eHNsOnZhcmlhYmxlIG5hbWU9ImJhbm5lci1mZyIgICAgICAgIHNlbGVjdD0iJyNmZmZmZmYnIi8+CisgIDx4c2w6dmFyaWFibGUgbmFtZT0ic3ViLWJhbm5lci1iZyIgICAgc2VsZWN0PSInIzgyOERBNiciLz4KKyAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzdWItYmFubmVyLWZnIiAgICBzZWxlY3Q9IicjZmZmZmZmJyIvPgorICA8eHNsOnZhcmlhYmxlIG5hbWU9InNvdXJjZS1jb2xvciIgICAgIHNlbGVjdD0iJyMwMjMyNjQnIi8+CisgIDx4c2w6dmFyaWFibGUgbmFtZT0iYXR0cmlidXRlcy1jb2xvciIgc2VsZWN0PSInIzAyMzI2NCciLz4KKyAgPHhzbDp2YXJpYWJsZSBuYW1lPSJ0YWJsZS10aC1iZyIgICAgICBzZWxlY3Q9IicjMDM5YWNjJyIvPgorICA8eHNsOnZhcmlhYmxlIG5hbWU9InRhYmxlLXRkLWJnIiAgICAgIHNlbGVjdD0iJyNhMGRkZjAnIi8+CisKKyAgPCEtLSBQcm9jZXNzIGFuIGVudGlyZSBkb2N1bWVudCBpbnRvIGFuIEhUTUwgcGFnZSAtLT4KKyAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iZG9jdW1lbnQiPgorICAgIDxodG1sPgorICAgIDxoZWFkPgorICAgIDx0aXRsZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0icHJvamVjdC90aXRsZSIvPiAtIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJwcm9wZXJ0aWVzL3RpdGxlIi8+PC90aXRsZT4KKyAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0icHJvcGVydGllcy9hdXRob3IiPgorICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJuYW1lIj4KKyAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLz4KKyAgICAgIDwveHNsOnZhcmlhYmxlPgorICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJlbWFpbCI+CisgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAZW1haWwiLz4KKyAgICAgIDwveHNsOnZhcmlhYmxlPgorICAgICAgPG1ldGEgbmFtZT0iYXV0aG9yIiB2YWx1ZT0ieyRuYW1lfSIvPgorICAgICAgPG1ldGEgbmFtZT0iZW1haWwiIHZhbHVlPSJ7JGVtYWlsfSIvPgorICAgIDwveHNsOmZvci1lYWNoPgorICAgIDwvaGVhZD4KKworICAgIDxib2R5IGJnY29sb3I9InskYm9keS1iZ30iIHRleHQ9InskYm9keS1mZ30iIGxpbms9InskYm9keS1saW5rfSIKKyAgICAgICAgICBhbGluaz0ieyRib2R5LWxpbmt9IiB2bGluaz0ieyRib2R5LWxpbmt9Ij4KKworICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iNCI+CisKKyAgICAgIDx4c2w6Y29tbWVudD5QQUdFIEhFQURFUjwveHNsOmNvbW1lbnQ+CisgICAgICA8dHI+PHRkIGNvbHNwYW49IjIiPgorCisgICAgICAgIDx4c2w6Y29tbWVudD5KQUtBUlRBIExPR088L3hzbDpjb21tZW50PgorICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImFsdCI+CisgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRob21lLW5hbWUiLz4KKyAgICAgICAgPC94c2w6dmFyaWFibGU+CisgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaHJlZiI+CisgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRob21lLWhyZWYiLz4KKyAgICAgICAgPC94c2w6dmFyaWFibGU+CisgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ic3JjIj4KKyAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlbGF0aXZlLXBhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGhvbWUtbG9nbyIvPgorICAgICAgICA8L3hzbDp2YXJpYWJsZT4KKyAgICAgICAgPGEgaHJlZj0ieyRocmVmfSI+CisgICAgICAgICAgPGltZyBzcmM9Inskc3JjfSIgYWxpZ249ImxlZnQiIGFsdD0ieyRhbHR9IiBib3JkZXI9IjAiLz4KKyAgICAgICAgPC9hPgorICAgICAgICA8eHNsOmlmIHRlc3Q9InByb2plY3QvbG9nbyI+CisgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJhbHQiPgorICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InByb2plY3QvbG9nbyIvPgorICAgICAgICAgIDwveHNsOnZhcmlhYmxlPgorICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaG9tZSI+CisgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0icHJvamVjdC9AaHJlZiIvPgorICAgICAgICAgIDwveHNsOnZhcmlhYmxlPgorICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ic3JjIj4KKyAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVsYXRpdmUtcGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJwcm9qZWN0L2xvZ28vQGhyZWYiLz4KKyAgICAgICAgICA8L3hzbDp2YXJpYWJsZT4KKworICAgICAgICAgIDx4c2w6Y29tbWVudD5QUk9KRUNUIExPR088L3hzbDpjb21tZW50PgorICAgICAgICAgIDxhIGhyZWY9InskaG9tZX0iPgorICAgICAgICAgICAgPGltZyBzcmM9Inskc3JjfSIgYWxpZ249InJpZ2h0IiBhbHQ9InskYWx0fSIgYm9yZGVyPSIwIi8+CisgICAgICAgICAgPC9hPgorICAgICAgICA8L3hzbDppZj4KKworICAgICAgPC90ZD48L3RyPgorCisgICAgICA8eHNsOmNvbW1lbnQ+SEVBREVSIFNFUEFSQVRPUjwveHNsOmNvbW1lbnQ+CisgICAgICA8dHI+CisgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4KKyAgICAgICAgICA8aHIgbm9zaGFkZT0ibm9zaGFkZSIgc2l6ZT0iMSIvPgorICAgICAgICA8L3RkPgorICAgICAgPC90cj4KKworICAgICAgPHRyPgorCisgICAgICAgIDwhLS0gRG9uJ3QgZ2VuZXJhdGUgYSBtZW51IGlmIHN0eWxpbmcgcHJpbnRlciBmcmllbmRseSBkb2NzIC0tPgorICAgICAgICA8eHNsOmlmIHRlc3Q9IiRwcm9qZWN0LW1lbnUgPSAnbWVudSciPgorICAgICAgICAgIDx4c2w6Y29tbWVudD5MRUZUIFNJREUgTkFWSUdBVElPTjwveHNsOmNvbW1lbnQ+CisgICAgICAgICAgPHRkIHdpZHRoPSIyMCUiIHZhbGlnbj0idG9wIiBub3dyYXA9InRydWUiPgorICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJwcm9qZWN0L2JvZHkvbWVudSIvPgorICAgICAgICAgIDwvdGQ+CisgICAgICAgIDwveHNsOmlmPgorCisgICAgICAgIDx4c2w6Y29tbWVudD5SSUdIVCBTSURFIE1BSU4gQk9EWTwveHNsOmNvbW1lbnQ+CisgICAgICAgIDx0ZCB3aWR0aD0iODAlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgorICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iNCI+CisgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgIDx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgorICAgICAgICAgICAgICAgIDxoMT48eHNsOnZhbHVlLW9mIHNlbGVjdD0icHJvamVjdC90aXRsZSIvPjwvaDE+CisgICAgICAgICAgICAgICAgPGgyPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJwcm9wZXJ0aWVzL3RpdGxlIi8+PC9oMj4KKyAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCIgdmFsaWduPSJ0b3AiIG5vd3JhcD0idHJ1ZSI+CisgICAgICAgICAgICAgICAgPCEtLSBBZGQgdGhlIHByaW50ZXIgZnJpZW5kbHkgbGluayBmb3IgZG9jcyB3aXRoIGEgbWVudSAtLT4KKyAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IiRwcm9qZWN0LW1lbnUgPSAnbWVudSciPgorICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzcmMiPgorICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlbGF0aXZlLXBhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByaW50ZXItbG9nbyIvPgorICAgICAgICAgICAgICAgICAgPC94c2w6dmFyaWFibGU+CisgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InVybCI+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvZG9jdW1lbnQvQHVybCIvPgorICAgICAgICAgICAgICAgICAgPC94c2w6dmFyaWFibGU+CisgICAgICAgICAgICAgICAgICA8c21hbGw+CisgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9InByaW50ZXIveyR1cmx9Ij4KKyAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz0ieyRzcmN9IiBib3JkZXI9IjAiIGFsdD0iUHJpbnRlciBGcmllbmRseSBWZXJzaW9uIi8+CisgICAgICAgICAgICAgICAgICAgICAgPGJyIC8+cHJpbnQtZnJpZW5kbHk8YnIgLz52ZXJzaW9uCisgICAgICAgICAgICAgICAgICAgIDwvYT4KKyAgICAgICAgICAgICAgICAgIDwvc21hbGw+CisgICAgICAgICAgICAgICAgPC94c2w6aWY+CisgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIkcHJvamVjdC1tZW51ICE9ICdtZW51JyI+CisgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InZvaWQiPgorICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlbGF0aXZlLXBhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZvaWQtaW1hZ2UiLz4KKyAgICAgICAgICAgICAgICAgICAgPC94c2w6dmFyaWFibGU+CisgICAgICAgICAgICAgICAgICA8aW1nIHNyYz0ieyR2b2lkfSIgd2lkdGg9IjEiIGhlaWdodD0iMSIgdnNwYWNlPSIwIiBoc3BhY2U9IjAiIGJvcmRlcj0iMCIvPgorICAgICAgICAgICAgICAgIDwveHNsOmlmPgorICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iYm9keS9zZWN0aW9uIi8+CisgICAgICAgIDwvdGQ+CisKKyAgICAgIDwvdHI+CisKKyAgICAgIDx4c2w6Y29tbWVudD5GT09URVIgU0VQQVJBVE9SPC94c2w6Y29tbWVudD4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkIGNvbHNwYW49IjIiPgorICAgICAgICAgIDxociBub3NoYWRlPSJub3NoYWRlIiBzaXplPSIxIi8+CisgICAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorCisgICAgICA8eHNsOmNvbW1lbnQ+UEFHRSBGT09URVI8L3hzbDpjb21tZW50PgorICAgICAgPHRyPjx0ZCBjb2xzcGFuPSIyIj4KKyAgICAgICAgPGRpdiBhbGlnbj0iY2VudGVyIj48Zm9udCBjb2xvcj0ieyRib2R5LWxpbmt9IiBzaXplPSItMSI+PGVtPgorICAgICAgICBDb3B5cmlnaHQgJiMxNjk7IDE5OTktMjAwNCwgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAgICAgICAgPC9lbT48L2ZvbnQ+PC9kaXY+CisgICAgICA8L3RkPjwvdHI+CisKKyAgICA8L3RhYmxlPgorICAgIDwvYm9keT4KKyAgICA8L2h0bWw+CisKKyAgPC94c2w6dGVtcGxhdGU+CisKKworICA8IS0tIFByb2Nlc3MgYSBtZW51IGZvciB0aGUgbmF2aWdhdGlvbiBiYXIgLS0+CisgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Im1lbnUiPgorICAgIDxwPjxzdHJvbmc+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC9zdHJvbmc+PC9wPgorICAgIDx1bD4KKyAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iaXRlbSIvPgorICAgIDwvdWw+CisgIDwveHNsOnRlbXBsYXRlPgorCisKKyAgPCEtLSBQcm9jZXNzIGEgbWVudSBpdGVtIGZvciB0aGUgbmF2aWdhdGlvbiBiYXIgLS0+CisgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Iml0ZW0iPgorICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaHJlZiI+CisgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGhyZWYiLz4KKyAgICA8L3hzbDp2YXJpYWJsZT4KKyAgICA8bGk+PGEgaHJlZj0ieyRocmVmfSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC9hPjwvbGk+CisgIDwveHNsOnRlbXBsYXRlPgorCisKKyAgPCEtLSBQcm9jZXNzIGEgZG9jdW1lbnRhdGlvbiBzZWN0aW9uIC0tPgorICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJzZWN0aW9uIj4KKyAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im5hbWUiPgorICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+CisgICAgPC94c2w6dmFyaWFibGU+CisgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIj4KKyAgICAgIDwhLS0gU2VjdGlvbiBoZWFkaW5nIC0tPgorICAgICAgPHRyPjx0ZCBiZ2NvbG9yPSJ7JGJhbm5lci1iZ30iPgorICAgICAgICAgIDxmb250IGNvbG9yPSJ7JGJhbm5lci1mZ30iIGZhY2U9ImFyaWFsLGhlbHZldGljYS5zYW5zZXJpZiI+CisgICAgICAgICAgPGEgbmFtZT0ieyRuYW1lfSI+CisgICAgICAgICAgPHN0cm9uZz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L3N0cm9uZz48L2E+PC9mb250PgorICAgICAgPC90ZD48L3RyPgorICAgICAgPCEtLSBTZWN0aW9uIGJvZHkgLS0+CisgICAgICA8dHI+PHRkPjxibG9ja3F1b3RlPgorICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+CisgICAgICA8L2Jsb2NrcXVvdGU+PC90ZD48L3RyPgorICAgIDwvdGFibGU+CisgIDwveHNsOnRlbXBsYXRlPgorCisKKyAgPCEtLSBQcm9jZXNzIGEgZG9jdW1lbnRhdGlvbiBzdWJzZWN0aW9uIC0tPgorICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJzdWJzZWN0aW9uIj4KKyAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im5hbWUiPgorICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+CisgICAgPC94c2w6dmFyaWFibGU+CisgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIj4KKyAgICAgIDwhLS0gU3Vic2VjdGlvbiBoZWFkaW5nIC0tPgorICAgICAgPHRyPjx0ZCBiZ2NvbG9yPSJ7JHN1Yi1iYW5uZXItYmd9Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0ieyRzdWItYmFubmVyLWZnfSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLnNhbnNlcmlmIj4KKyAgICAgICAgICA8YSBuYW1lPSJ7JG5hbWV9Ij4KKyAgICAgICAgICA8c3Ryb25nPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwvc3Ryb25nPjwvYT48L2ZvbnQ+CisgICAgICA8L3RkPjwvdHI+CisgICAgICA8IS0tIFN1YnNlY3Rpb24gYm9keSAtLT4KKyAgICAgIDx0cj48dGQ+PGJsb2NrcXVvdGU+CisgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KKyAgICAgIDwvYmxvY2txdW90ZT48L3RkPjwvdHI+CisgICAgPC90YWJsZT4KKyAgPC94c2w6dGVtcGxhdGU+CisKKworICA8IS0tIFByb2Nlc3MgYSBzb3VyY2UgY29kZSBleGFtcGxlIC0tPgorICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJzb3VyY2UiPgorICAgIDx4c2w6dmFyaWFibGUgbmFtZT0idm9pZCI+CisgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlbGF0aXZlLXBhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZvaWQtaW1hZ2UiLz4KKyAgICA8L3hzbDp2YXJpYWJsZT4KKyAgICA8ZGl2IGFsaWduPSJsZWZ0Ij4KKyAgICAgIDx0YWJsZSBjZWxsc3BhY2luZz0iNCIgY2VsbHBhZGRpbmc9IjAiIGJvcmRlcj0iMCI+CisgICAgICAgIDx0cj4KKyAgICAgICAgICA8dGQgYmdjb2xvcj0ieyRzb3VyY2UtY29sb3J9IiB3aWR0aD0iMSIgaGVpZ2h0PSIxIj4KKyAgICAgICAgICAgIDxpbWcgc3JjPSJ7JHZvaWR9IiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB2c3BhY2U9IjAiIGhzcGFjZT0iMCIgYm9yZGVyPSIwIi8+CisgICAgICAgICAgPC90ZD4KKyAgICAgICAgICA8dGQgYmdjb2xvcj0ieyRzb3VyY2UtY29sb3J9IiBoZWlnaHQ9IjEiPgorICAgICAgICAgICAgPGltZyBzcmM9Inskdm9pZH0iIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHZzcGFjZT0iMCIgaHNwYWNlPSIwIiBib3JkZXI9IjAiLz4KKyAgICAgICAgICA8L3RkPgorICAgICAgICAgIDx0ZCBiZ2NvbG9yPSJ7JHNvdXJjZS1jb2xvcn0iIHdpZHRoPSIxIiBoZWlnaHQ9IjEiPgorICAgICAgICAgICAgPGltZyBzcmM9Inskdm9pZH0iIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHZzcGFjZT0iMCIgaHNwYWNlPSIwIiBib3JkZXI9IjAiLz4KKyAgICAgICAgICA8L3RkPgorICAgICAgICA8L3RyPgorICAgICAgICA8dHI+CisgICAgICAgICAgPHRkIGJnY29sb3I9Inskc291cmNlLWNvbG9yfSIgd2lkdGg9IjEiPgorICAgICAgICAgICAgPGltZyBzcmM9Inskdm9pZH0iIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHZzcGFjZT0iMCIgaHNwYWNlPSIwIiBib3JkZXI9IjAiLz4KKyAgICAgICAgICA8L3RkPgorICAgICAgICAgIDx0ZCBiZ2NvbG9yPSIjZmZmZmZmIiBoZWlnaHQ9IjEiPjxwcmU+CisgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iLiIvPgorICAgICAgICAgIDwvcHJlPjwvdGQ+CisgICAgICAgICAgPHRkIGJnY29sb3I9Inskc291cmNlLWNvbG9yfSIgd2lkdGg9IjEiPgorICAgICAgICAgICAgPGltZyBzcmM9Inskdm9pZH0iIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHZzcGFjZT0iMCIgaHNwYWNlPSIwIiBib3JkZXI9IjAiLz4KKyAgICAgICAgICA8L3RkPgorICAgICAgICA8L3RyPgorICAgICAgICA8dHI+CisgICAgICAgICAgPHRkIGJnY29sb3I9Inskc291cmNlLWNvbG9yfSIgd2lkdGg9IjEiIGhlaWdodD0iMSI+CisgICAgICAgICAgICA8aW1nIHNyYz0ieyR2b2lkfSIgd2lkdGg9IjEiIGhlaWdodD0iMSIgdnNwYWNlPSIwIiBoc3BhY2U9IjAiIGJvcmRlcj0iMCIvPgorICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgPHRkIGJnY29sb3I9Inskc291cmNlLWNvbG9yfSIgaGVpZ2h0PSIxIj4KKyAgICAgICAgICAgIDxpbWcgc3JjPSJ7JHZvaWR9IiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB2c3BhY2U9IjAiIGhzcGFjZT0iMCIgYm9yZGVyPSIwIi8+CisgICAgICAgICAgPC90ZD4KKyAgICAgICAgICA8dGQgYmdjb2xvcj0ieyRzb3VyY2UtY29sb3J9IiB3aWR0aD0iMSIgaGVpZ2h0PSIxIj4KKyAgICAgICAgICAgIDxpbWcgc3JjPSJ7JHZvaWR9IiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB2c3BhY2U9IjAiIGhzcGFjZT0iMCIgYm9yZGVyPSIwIi8+CisgICAgICAgICAgPC90ZD4KKyAgICAgICAgPC90cj4KKyAgICAgIDwvdGFibGU+CisgICAgPC9kaXY+CisgIDwveHNsOnRlbXBsYXRlPgorCisKKyAgPCEtLSBQcm9jZXNzIGFuIGF0dHJpYnV0ZXMgbGlzdCB3aXRoIG5lc3RlZCBhdHRyaWJ1dGUgZWxlbWVudHMgLS0+CisgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImF0dHJpYnV0ZXMiPgorICAgIDx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSI1Ij4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRoIHdpZHRoPSIxNSUiIGJnY29sb3I9InskYXR0cmlidXRlcy1jb2xvcn0iPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjZmZmZmZmIj5BdHRyaWJ1dGU8L2ZvbnQ+CisgICAgICAgIDwvdGg+CisgICAgICAgIDx0aCB3aWR0aD0iODUlIiBiZ2NvbG9yPSJ7JGF0dHJpYnV0ZXMtY29sb3J9Ij4KKyAgICAgICAgICA8Zm9udCBjb2xvcj0iI2ZmZmZmZiI+RGVzY3JpcHRpb248L2ZvbnQ+CisgICAgICAgIDwvdGg+CisgICAgICA8L3RyPgorICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImF0dHJpYnV0ZSI+CisgICAgICAgIDx0cj4KKyAgICAgICAgICA8dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0iY2VudGVyIj4KKyAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iQHJlcXVpcmVkID0gJ3RydWUnIj4KKyAgICAgICAgICAgICAgPHN0cm9uZz48Y29kZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L2NvZGU+PC9zdHJvbmc+CisgICAgICAgICAgICA8L3hzbDppZj4KKyAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iQHJlcXVpcmVkICE9ICd0cnVlJyI+CisgICAgICAgICAgICAgIDxjb2RlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwvY29kZT4KKyAgICAgICAgICAgIDwveHNsOmlmPgorICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgPHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249ImNlbnRlciI+CisgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+CisgICAgICAgICAgPC90ZD4KKyAgICAgICAgPC90cj4KKyAgICAgIDwveHNsOmZvci1lYWNoPgorICAgIDwvdGFibGU+CisgIDwveHNsOnRlbXBsYXRlPgorCisgIDwhLS0gRml4IHJlbGF0aXZlIGxpbmtzIGluIHByaW50ZXIgZnJpZW5kbHkgdmVyc2lvbnMgb2YgdGhlIGRvY3MgLS0+CisgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImEiPgorICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaHJlZiIgc2VsZWN0PSJAaHJlZiIvPgorICAgIDx4c2w6Y2hvb3NlPgorICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRzdGFuZGFsb25lID0gJ3N0YW5kYWxvbmUnIj4KKyAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPgorICAgICAgPC94c2w6d2hlbj4KKyAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkcHJvamVjdC1tZW51ICE9ICdtZW51JyBhbmQgc3RhcnRzLXdpdGgoQGhyZWYsJy4uLycpIj4KKyAgICAgICAgPGEgaHJlZj0iLi4veyRocmVmfSI+PHhzbDphcHBseS10ZW1wbGF0ZXMvPjwvYT4KKyAgICAgIDwveHNsOndoZW4+CisgICAgICA8eHNsOndoZW4gdGVzdD0iJHByb2plY3QtbWVudSAhPSAnbWVudScgYW5kIHN0YXJ0cy13aXRoKEBocmVmLCcuLycpIGFuZCBjb250YWlucyhzdWJzdHJpbmcoQGhyZWYsMyksJy8nKSI+CisgICAgICAgIDxhIGhyZWY9Ii57JGhyZWZ9Ij48eHNsOmFwcGx5LXRlbXBsYXRlcy8+PC9hPgorICAgICAgPC94c2w6d2hlbj4KKyAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkcHJvamVjdC1tZW51ICE9ICdtZW51JyBhbmQgbm90KGNvbnRhaW5zKEBocmVmLCcvLycpKSBhbmQgbm90KHN0YXJ0cy13aXRoKEBocmVmLCcvJykpIGFuZCBub3Qoc3RhcnRzLXdpdGgoQGhyZWYsJyMnKSkgYW5kIGNvbnRhaW5zKEBocmVmLCcvJykiPgorICAgICAgICA8YSBocmVmPSIuLi97JGhyZWZ9Ij48eHNsOmFwcGx5LXRlbXBsYXRlcy8+PC9hPgorICAgICAgPC94c2w6d2hlbj4KKyAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkaHJlZiAhPSAnJyI+CisgICAgICAgIDxhIGhyZWY9InskaHJlZn0iPjx4c2w6YXBwbHktdGVtcGxhdGVzLz48L2E+CisgICAgICA8L3hzbDp3aGVuPgorICAgICAgPHhzbDpvdGhlcndpc2U+CisgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ibmFtZSIgc2VsZWN0PSJAbmFtZSIvPgorICAgICAgICA8YSBuYW1lPSJ7JG5hbWV9Ij48eHNsOmFwcGx5LXRlbXBsYXRlcy8+PC9hPgorICAgICAgPC94c2w6b3RoZXJ3aXNlPgorICAgIDwveHNsOmNob29zZT4KKyAgPC94c2w6dGVtcGxhdGU+CisKKyAgPCEtLSBDaGFuZ2Vsb2cgcmVsYXRlZCB0YWdzIC0tPgorICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJjaGFuZ2Vsb2ciPgorICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMiI+CisgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+CisgICAgPC90YWJsZT4KKyAgPC94c2w6dGVtcGxhdGU+CisKKyAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iY2hhbmdlbG9nL2FkZCI+CisgICAgPHRyPgorICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzcmMiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVsYXRpdmUtcGF0aCIvPi9pbWFnZXMvYWRkLmdpZjwveHNsOnZhcmlhYmxlPgorICAgICAgPHRkPjxpbWcgYWx0PSJhZGQiIGNsYXNzPSJpY29uIiBzcmM9Inskc3JjfSIvPjwvdGQ+CisgICAgICA8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMvPjwvdGQ+CisgICAgPC90cj4KKyAgPC94c2w6dGVtcGxhdGU+CisKKyAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iY2hhbmdlbG9nL3VwZGF0ZSI+CisgICAgPHRyPgorICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzcmMiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVsYXRpdmUtcGF0aCIvPi9pbWFnZXMvdXBkYXRlLmdpZjwveHNsOnZhcmlhYmxlPgorICAgICAgPHRkPjxpbWcgYWx0PSJ1cGRhdGUiIGNsYXNzPSJpY29uIiBzcmM9Inskc3JjfSIvPjwvdGQ+CisgICAgICA8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMvPjwvdGQ+CisgICAgPC90cj4KKyAgPC94c2w6dGVtcGxhdGU+CisKKyAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iY2hhbmdlbG9nL2Rlc2lnbiI+CisgICAgPHRyPgorICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzcmMiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVsYXRpdmUtcGF0aCIvPi9pbWFnZXMvZGVzaWduLmdpZjwveHNsOnZhcmlhYmxlPgorICAgICAgPHRkPjxpbWcgYWx0PSJkZXNpZ24iIGNsYXNzPSJpY29uIiBzcmM9Inskc3JjfSIvPjwvdGQ+CisgICAgICA8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMvPjwvdGQ+CisgICAgPC90cj4KKyAgPC94c2w6dGVtcGxhdGU+CisKKyAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iY2hhbmdlbG9nL2RvY3MiPgorICAgIDx0cj4KKyAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ic3JjIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlbGF0aXZlLXBhdGgiLz4vaW1hZ2VzL2RvY3MuZ2lmPC94c2w6dmFyaWFibGU+CisgICAgICA8dGQ+PGltZyBhbHQ9ImRvY3MiIGNsYXNzPSJpY29uIiBzcmM9Inskc3JjfSIvPjwvdGQ+CisgICAgICA8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMvPjwvdGQ+CisgICAgPC90cj4KKyAgPC94c2w6dGVtcGxhdGU+CisKKyAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iY2hhbmdlbG9nL2ZpeCI+CisgICAgPHRyPgorICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzcmMiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVsYXRpdmUtcGF0aCIvPi9pbWFnZXMvZml4LmdpZjwveHNsOnZhcmlhYmxlPgorICAgICAgPHRkPjxpbWcgYWx0PSJmaXgiIGNsYXNzPSJpY29uIiBzcmM9Inskc3JjfSIvPjwvdGQ+CisgICAgICA8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMvPjwvdGQ+CisgICAgPC90cj4KKyAgPC94c2w6dGVtcGxhdGU+CisKKyAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iY2hhbmdlbG9nL3Njb2RlIj4KKyAgICA8dHI+CisgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InNyYyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZWxhdGl2ZS1wYXRoIi8+L2ltYWdlcy9jb2RlLmdpZjwveHNsOnZhcmlhYmxlPgorICAgICAgPHRkPjxpbWcgYWx0PSJjb2RlIiBjbGFzcz0iaWNvbiIgc3JjPSJ7JHNyY30iLz48L3RkPgorICAgICAgPHRkPjx4c2w6YXBwbHktdGVtcGxhdGVzLz48L3RkPgorICAgIDwvdHI+CisgIDwveHNsOnRlbXBsYXRlPgorCisgIDwhLS0gUHJvY2VzcyBhbiBhdHRyaWJ1dGVzIGxpc3Qgd2l0aCBuZXN0ZWQgYXR0cmlidXRlIGVsZW1lbnRzIC0tPgorICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJzdGF0dXMiPgorICAgIDx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSI1Ij4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRoIHdpZHRoPSIxNSUiIGJnY29sb3I9InskYXR0cmlidXRlcy1jb2xvcn0iPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjZmZmZmZmIj5Qcmlvcml0eTwvZm9udD4KKyAgICAgICAgPC90aD4KKyAgICAgICAgPHRoIHdpZHRoPSI1MCUiIGJnY29sb3I9InskYXR0cmlidXRlcy1jb2xvcn0iPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjZmZmZmZmIj5BY3Rpb24gSXRlbTwvZm9udD4KKyAgICAgICAgPC90aD4KKyAgICAgICAgPHRoIHdpZHRoPSIyNSUiIGJnY29sb3I9InskYXR0cmlidXRlcy1jb2xvcn0iPgorICAgICAgICAgIDxmb250IGNvbG9yPSIjZmZmZmZmIj5Wb2x1bnRlZXJzPC9mb250PgorICAgICAgICA8L3RoPgorICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iaXRlbSI+CisgICAgICAgIDx0cj4KKyAgICAgICAgICA8dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0iY2VudGVyIj4KKyAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcHJpb3JpdHkiLz4KKyAgICAgICAgICA8L3RkPgorICAgICAgICAgIDx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJjZW50ZXIiPgorICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPgorICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgPHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249ImNlbnRlciI+CisgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG93bmVyIi8+CisgICAgICAgICAgPC90ZD4KKyAgICAgICAgPC90cj4KKyAgICAgICAgPC94c2w6Zm9yLWVhY2g+CisgICAgICA8L3RyPgorICAgIDwvdGFibGU+CisgIDwveHNsOnRlbXBsYXRlPgorCisgIDwhLS0gTGluayB0byBhIGJ1ZyByZXBvcnQgLS0+CisgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImJ1ZyI+CisgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImxpbmsiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYnVnbGluayIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiLz48L3hzbDp2YXJpYWJsZT4KKyAgICAgIDxhIGhyZWY9InskbGlua30iPjx4c2w6YXBwbHktdGVtcGxhdGVzLz48L2E+CisgIDwveHNsOnRlbXBsYXRlPgorCisgIDwhLS0gUHJvY2VzcyBldmVyeXRoaW5nIGVsc2UgYnkganVzdCBwYXNzaW5nIGl0IHRocm91Z2ggLS0+CisgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Iip8QCoiPgorICAgIDx4c2w6Y29weT4KKyAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQCp8Knx0ZXh0KCkiLz4KKyAgICA8L3hzbDpjb3B5PgorICA8L3hzbDp0ZW1wbGF0ZT4KKworPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL2RvY3Mvd2luZG93cy1zZXJ2aWNlLWhvd3RvLnhtbCBiL2NvbnRhaW5lci93ZWJhcHBzL2RvY3Mvd2luZG93cy1zZXJ2aWNlLWhvd3RvLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmJmMDQ4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvZG9jcy93aW5kb3dzLXNlcnZpY2UtaG93dG8ueG1sCkBAIC0wLDAgKzEsMzUyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhRE9DVFlQRSBkb2N1bWVudCBbCisgIDwhRU5USVRZIHByb2plY3QgU1lTVEVNICJwcm9qZWN0LnhtbCI+CitdPgorPGRvY3VtZW50IHVybD0id2luZG93cy1zZXJ2aWNlLWhvd3RvLmh0bWwiPgorCisgICAgJnByb2plY3Q7CisKKyAgICA8cHJvcGVydGllcz4KKyAgICAgIDxhdXRob3IgZW1haWw9Im10dXJrQGFwYWNoZS5vcmciPk1sYWRlbiBUdXJrPC9hdXRob3I+CisgICAgICA8dGl0bGU+V2luZG93cyBzZXJ2aWNlIEhPVy1UTzwvdGl0bGU+CisgICAgPC9wcm9wZXJ0aWVzPgorCis8Ym9keT4KKyAKKzxzZWN0aW9uIG5hbWU9Ik5PVElDRSI+Cis8cD4KKyAgICA8Yj5UaGlzIHNlY3Rpb24gb2YgdGhlIGRvY3VtZW50YXRpb24gYXBwbGllcyB0byBwcm9jcnVuIDEuMCwgYW5kIGlzIG5vdyBvYnNvbGV0ZS48L2I+Cis8L3A+Cis8L3NlY3Rpb24+Cis8c2VjdGlvbiBuYW1lPSJUb21jYXQ1IHNlcnZpY2UgYXBwbGljYXRpb24iPgorPHA+CisgICAgPGI+VG9tY2F0NTwvYj4gaXMgYSBzZXJ2aWNlIGFwcGxpY2F0aW9uIGZvciBydW5uaW5nIFRvbWNhdDUgYXMgTlQgc2VydmljZS4KKzwvcD4KKzwvc2VjdGlvbj4KKzxzZWN0aW9uIG5hbWU9IlRvbWNhdDV3IG1vbml0b3IgYXBwbGljYXRpb24iPgorPHA+CisgICAgPGI+VG9tY2F0NXc8L2I+IGlzIGEgR1VJIGFwcGxpY2F0aW9uIGZvciBtb25pdG9yaW5nIGFuZCBjb25maWd1cmluZyBUb21jYXQKKyAgICBzZXJ2aWNlcy4KKzwvcD4gICAgCisgICAgPHA+VGhlIGF2YWlsYWJsZSBjb21tYW5kIGxpbmUgb3B0aW9ucyBhcmU6PC9wPgorPHA+IAorICAgIDx0YWJsZT4KKyAgICA8dHI+PHRoPi8vRVMvLzwvdGg+CisgICAgICAgIDx0ZD5FZGl0IHNlcnZpY2UgY29uZmlndXJhdGlvbjwvdGQ+CisgICAgICAgIDx0ZD5UaGlzIGlzIHRoZSBkZWZhdWx0IG9wZXJhdGlvbi4gSXQgaXMgY2FsbGVkIGlmIHRoZSBubyBvcHRpb24gaXMKKyAgICAgICAgICAgIHByb3ZpZGVkIGJ1dCB0aGUgZXhlY3V0YWJsZSBpcyByZW5hbWVkIHRvIDxiPnNlcnZpY2VuYW1lVy5leGU8L2I+PC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj48dGg+Ly9NUy8vPC90aD4KKyAgICAgICAgPHRkPk1vbml0b3Igc2VydmljZTwvdGQ+CisgICAgICAgIDx0ZD5QdXQgdGhlIGljb24gaW4gdGhlIHN5c3RlbSB0cnk8L3RkPgorICAgIDwvdHI+CisgICAgPC90YWJsZT4KKzwvcD4KKzwvc2VjdGlvbj4KKzxzZWN0aW9uIG5hbWU9IkNvbW1hbmQgbGluZSBhcmd1bWVudHMiPgorPHA+CisgICAgRWFjaCBjb21tYW5kIGxpbmUgZGlyZWN0aXZlIGlzIGluIHRoZSBmb3JtIG9mIDxiPi8vWFgvL1NlcnZpY2VOYW1lPC9iPgorPC9wPgorICAgIDxwPlRoZSBhdmFpbGFibGUgY29tbWFuZCBsaW5lIG9wdGlvbnMgYXJlOjwvcD4KKzxwPiAKKyAgICA8dGFibGU+CisgICAgPHRyPjx0aD4vL1RTLy88L3RoPgorICAgICAgICA8dGQ+UnVuIHRoZSBzZXJ2aWNlIGFzIGNvbnNvbGUgYXBwbGljYXRpb248L3RkPgorICAgICAgICA8dGQ+VGhpcyBpcyB0aGUgZGVmYXVsdCBvcGVyYXRpb24uIEl0IGlzIGNhbGxlZCBpZiB0aGUgbm8gb3B0aW9uIGlzCisgICAgICAgICAgICBwcm92aWRlZC4gVGhlIFNlcnZpY2VOYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBleGVjdXRhYmxlIHdpdGhvdXQKKyAgICAgICAgICAgIGV4ZSBzdWZpeCwgbWVhbmluZyBUb21jYXQ1PC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj48dGg+Ly9SUy8vPC90aD4KKyAgICAgICAgPHRkPlJ1biB0aGUgc2VydmljZTwvdGQ+CisgICAgICAgIDx0ZD5DYWxsZWQgb25seSBmcm9tIFNlcnZpY2VNYW5hZ2VyPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj48dGg+Ly9TUy8vPC90aD4KKyAgICAgICAgPHRkPlN0b3AgdGhlIHNlcnZpY2U8L3RkPgorICAgICAgICA8dGQ+PC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj48dGg+Ly9VUy8vPC90aD4KKyAgICAgICAgPHRkPlVwZGF0ZSBzZXJ2aWNlIHBhcmFtZXRlcnM8L3RkPgorICAgICAgICA8dGQ+PC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj48dGg+Ly9JUy8vPC90aD4KKyAgICAgICAgPHRkPkluc3RhbGwgc2VydmljZTwvdGQ+CisgICAgICAgIDx0ZD48L3RkPgorICAgIDwvdHI+CisgICAgPHRyPjx0aD4vL0RTLy88L3RoPgorICAgICAgICA8dGQ+RGVsZXRlIHNlcnZpY2U8L3RkPgorICAgICAgICA8dGQ+U3RvcHMgdGhlIHNlcnZpY2UgaWYgcnVubmluZzwvdGQ+CisgICAgPC90cj4gICAgICAgIAorICAgIDwvdGFibGU+Cis8L3A+IAorPC9zZWN0aW9uPgorPHNlY3Rpb24gbmFtZT0iQ29tbWFuZCBsaW5lIHBhcmFtZXRlcnMiPgorPHA+CisgICAgRWFjaCBjb21tYW5kIHBhcmFtZXRlciBpcyBwcmVmaXhlZCB3aXRoIDxiPi0tPC9iPi4KKyAgICBJZiB0aGUgY29tbWFuZCBsaW5lIGlzIHByZWZpeGVkIHdpdGggPGI+Kys8L2I+IHRoZW4gaXQncyB2YWx1ZSB3aWxsCisgICAgYmUgYXBwZW5kZWQgdG8gdGhlIGV4aXN0aW5nIG9wdGlvbi4KKyAgICBJZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXIgYnV0CisgICAgcHJlZml4ZWQgd2l0aCA8Y29kZT5QUl88L2NvZGU+IGV4aXN0cyBpdCB3aWxsIHRha2UgcHJlY2VkZW5jZS4KKyAgICBGb3IgZXhhbXBsZToKKzxzb3VyY2U+c2V0IFBSX0NMQVNTUEFUSD14eC5qYXI8L3NvdXJjZT4KKzwvcD4gICAgCis8cD5pcyBlcXVpdmFsZW50IHRvIHByb3ZpZGluZworPHNvdXJjZT4tLUNsYXNzcGF0aD14eC5qYXI8L3NvdXJjZT4KKzwvcD4KKzxwPiBhcyBjb21tYW5kIGxpbmUgcGFyYW1ldGVyLjwvcD4KKzxwPiAKKyAgICA8dGFibGU+CisgICAgPHRyPgorICAgIDx0aD5QYXJhbWV0ZXJOYW1lPC90aD4KKwk8dGg+RGVmYXVsdDwvdGg+CisJPHRoPkRlc2NyaXB0aW9uPC90aD4KKwk8L3RyPiAKKyAgICA8dHI+CisgICAgPHRkPi0tRGVzY3JpcHRpb248L3RkPgorICAgIDx0ZD48L3RkPgorICAgIDx0ZD5TZXJ2aWNlIG5hbWUgZGVzY3JpcHRpb24gKG1heGltdW0gMTAyNCBjaGFyYWN0ZXJzKTwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgPHRkPi0tRGlzcGxheU5hbWU8L3RkPgorICAgIDx0ZD5TZXJ2aWNlTmFtZTwvdGQ+CisgICAgPHRkPlNlcnZpY2UgZGlzcGxheSBuYW1lPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICA8dGQ+LS1JbnN0YWxsPC90ZD4KKyAgICA8dGQ+cHJvY3J1bi5leGUgLy9SUy8vU2VydmljZU5hbWU8L3RkPgorICAgIDx0ZD5JbnN0YWxsIGltYWdlPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICA8dGQ+LS1TdGFydHVwPC90ZD4KKyAgICA8dGQ+bWFudWFsPC90ZD4KKyAgICA8dGQ+U2VydmljZSBzdGFydHVwIG1vZGUgY2FuIGJlIGVpdGhlciA8Yj5hdXRvPC9iPiBvciA8Yj5tYW51YWw8L2I+PC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICA8dGQ+LS1EZXBlbmRzT248L3RkPgorICAgIDx0ZD48L3RkPgorICAgIDx0ZD5MaXN0IG9mIHNlcnZpY2VzIHRoYXQgdGhpcyBzZXJ2aWNlIGRlcGVuZCBvbi4gRGVwZW5kZW50IHNlcnZpY2VzCisgICAgICAgIGFyZSBzZXBhcmF0ZWQgdXNpbmcgZWl0aGVyIDxiPiM8L2I+IG9yIDxiPjs8L2I+IGNoYXJhY3RlcnM8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgIDx0ZD4tLUVudmlyb25tZW50PC90ZD4KKyAgICA8dGQ+PC90ZD4KKyAgICA8dGQ+TGlzdCBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdGhhdCB3aWxsIGJlIHByb3ZpZGVkIHRvIHRoZSBzZXJ2aWNlCisgICAgICAgIGluIHRoZSBmb3JtIDxiPmtleT12YWx1ZTwvYj4uIFRoZXkgYXJlIHNlcGFyYXRlZCB1c2luZyBlaXRoZXIKKyAgICAgICAgPGI+IzwvYj4gb3IgPGI+OzwvYj4gY2hhcmFjdGVyczwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgPHRkPi0tVXNlcjwvdGQ+CisgICAgPHRkPjwvdGQ+CisgICAgPHRkPlVzZXIgYWNjb3VudCB1c2VkIGZvciBydW5uaW5nIGV4ZWN1dGFibGUuIEl0IGlzIHVzZWQgb25seSBmb3IKKyAgICAJU3RhcnRNb2RlIDxiPmphdmE8L2I+IG9yIDxiPmV4ZTwvYj4gYW5kIGVuYWJsZXMgcnVubmluZyBhcHBsaWNhdGlvbnMKKyAgICAJYXMgc2VydmljZSB1bmRlciBhY2NvdW50IHdpdGhvdXQgTG9nb25Bc1NlcnZpY2UgcHJpdmlsZWdlLjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgPHRkPi0tUGFzc3dvcmQ8L3RkPgorICAgIDx0ZD48L3RkPgorICAgIDx0ZD5QYXNzd29yZCBmb3IgdXNlciBhY2NvdW50IHNldCBieSAtLVVzZXIgcGFyYW1ldGVyPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICA8dGQ+LS1KYXZhSG9tZTwvdGQ+CisgICAgPHRkPkpBVkFfSE9NRTwvdGQ+CisgICAgPHRkPlNldCBhIGRpZmZlcmVudCBKQVZBX0hPTUUgdGhlbiBkZWZpbmVkIGJ5IEpBVkFfSE9NRSBlbnZpcm9ubWVudAorICAgICAgICB2YXJpYWJsZTwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgPHRkPi0tSnZtPC90ZD4KKyAgICA8dGQ+YXV0bzwvdGQ+CisgICAgPHRkPlVzZSBlaXRoZXIgPGI+YXV0bzwvYj4gb3Igc3BlY2lmeSB0aGUgZnVsbCBwYXRoIHRvIHRoZSA8Yj5qdm0uZGxsPC9iPi4KKyAgICAgICAgWW91IGNhbiB1c2UgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIGV4cGFuc2lvbiBoZXJlLjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgPHRkPi0tSnZtT3B0aW9uczwvdGQ+CisgICAgPHRkPi1YcnM8L3RkPgorICAgIDx0ZD5MaXN0IG9mIG9wdGlvbnMgaW4gdGhlIGZvcm0gb2YgPGI+LUQ8L2I+IG9yIDxiPi1YPC9iPiB0aGF0IHdpbGwgYmUKKyAgICAgICAgcGFzc2VkIHRvIHRoZSBKVk0uIFRoZSBvcHRpb25zIGFyZSBzZXBhcmF0ZWQgdXNpbmcgZWl0aGVyCisgICAgICAgIDxiPiM8L2I+IG9yIDxiPjs8L2I+IGNoYXJhY3RlcnMuPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICA8dGQ+LS1DbGFzc3BhdGg8L3RkPgorICAgIDx0ZD48L3RkPgorICAgIDx0ZD5TZXQgdGhlIEphdmEgY2xhc3NwYXRoPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICA8dGQ+LS1Kdm1NczwvdGQ+CisgICAgPHRkPjwvdGQ+CisgICAgPHRkPkluaXRpYWwgbWVtb3J5IHBvb2wgc2l6ZSBpbiBNQjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgPHRkPi0tSnZtTXg8L3RkPgorICAgIDx0ZD48L3RkPgorICAgIDx0ZD5NYXhpbXVtIG1lbW9yeSBwb29sIHNpemUgaW4gTUI8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgIDx0ZD4tLUp2bVNzPC90ZD4KKyAgICA8dGQ+PC90ZD4KKyAgICA8dGQ+VGhyZWFkIHN0YWNrIHNpemUgaW4gS0I8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgIDx0cj4KKyAgICA8dGQ+LS1TdGFydEltYWdlPC90ZD4KKyAgICA8dGQ+PC90ZD4KKyAgICA8dGQ+RXhlY3V0YWJsZSB0aGF0IHdpbGwgYmUgcnVuLjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgPHRkPi0tU3RhcnRQYXRoPC90ZD4KKyAgICA8dGQ+PC90ZD4KKyAgICA8dGQ+V29ya2luZyBwYXRoIGZvciB0aGUgc3RhcnQgaW1hZ2UgZXhlY3V0YWJsZS48L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgIDx0ZD4tLVN0YXJ0Q2xhc3M8L3RkPgorICAgIDx0ZD48L3RkPgorICAgIDx0ZD5DbGFzcyB0aGF0IHdpbGwgYmUgdXNlZCBmb3Igc3RhcnR1cC48L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgIDx0ZD4tLVN0YXJ0UGFyYW1zPC90ZD4KKyAgICA8dGQ+PC90ZD4KKyAgICA8dGQ+TGlzdCBvZiBwYXJhbWV0ZXJzIHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gZWl0aGVyIFN0YXJ0SW1hZ2Ugb3IKKyAgICAgICAgU3RhcnRDbGFzcy4gUGFyYW1ldGVycyBhcmUgc2VwYXJhdGVkIHVzaW5nIGVpdGhlciA8Yj4jPC9iPiBvcgorICAgICAgICA8Yj47PC9iPiBjaGFyYWN0ZXIuPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICA8dGQ+LS1TdGFydE1ldGhvZDwvdGQ+CisgICAgPHRkPk1haW48L3RkPgorICAgIDx0ZD5NZXRob2QgbmFtZSBpZiBkaWZmZXJzIHRoZW4gbWFpbjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgPHRkPi0tU3RhcnRNb2RlPC90ZD4KKyAgICA8dGQ+ZXhlY3V0YWJsZTwvdGQ+CisgICAgPHRkPkNhbiBvbmUgb2YgPGI+anZtPC9iPiA8Yj5qYXZhPC9iPiBvciA8Yj5leGU8L2I+PC90ZD4KKyAgICA8L3RyPgorICAgIDx0ZD4tLVN0b3BJbWFnZTwvdGQ+CisgICAgPHRkPjwvdGQ+CisgICAgPHRkPkV4ZWN1dGFibGUgdGhhdCB3aWxsIGJlIHJ1biBvbiBTdG9wIHNlcnZpY2Ugc2lnbmFsLjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgPHRkPi0tU3RvcFBhdGg8L3RkPgorICAgIDx0ZD48L3RkPgorICAgIDx0ZD5Xb3JraW5nIHBhdGggZm9yIHRoZSBzdG9wIGltYWdlIGV4ZWN1dGFibGUuPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICA8dGQ+LS1TdG9wQ2xhc3M8L3RkPgorICAgIDx0ZD48L3RkPgorICAgIDx0ZD5DbGFzcyB0aGF0IHdpbGwgYmUgdXNlZCBvbiBTdG9wIHNlcnZpY2Ugc2lnbmFsLjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgPHRkPi0tU3RvcFBhcmFtczwvdGQ+CisgICAgPHRkPjwvdGQ+CisgICAgPHRkPkxpc3Qgb2YgcGFyYW1ldGVycyB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIGVpdGhlciBTdG9wSW1hZ2Ugb3IKKyAgICAgICAgU3RvcENsYXNzLiBQYXJhbWV0ZXJzIGFyZSBzZXBhcmF0ZWQgdXNpbmcgZWl0aGVyIDxiPiM8L2I+IG9yCisgICAgICAgIDxiPjs8L2I+IGNoYXJhY3Rlci48L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgIDx0ZD4tLVN0b3BNZXRob2Q8L3RkPgorICAgIDx0ZD5NYWluPC90ZD4KKyAgICA8dGQ+TWV0aG9kIG5hbWUgaWYgZGlmZmVycyB0aGVuIG1haW48L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgIDx0ZD4tLVN0b3BNb2RlPC90ZD4KKyAgICA8dGQ+ZXhlY3V0YWJsZTwvdGQ+CisgICAgPHRkPkNhbiBvbmUgb2YgPGI+anZtPC9iPiA8Yj5qYXZhPC9iPiBvciA8Yj5leGU8L2I+PC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICA8dGQ+LS1TdG9wVGltZW91dDwvdGQ+CisgICAgPHRkPk5vIFRpbWVvdXQ8L3RkPgorICAgIDx0ZD5EZWZpbmVzIHRoZSB0aW1lb3V0IGluIHNlY29uZHMgdGhhdCBwcm9jcnVuIHdhaXRzIGZvciBzZXJ2aWNlIHRvCisgICAgICAgIGV4aXQgZ3JhY2VmdWxseS48L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgIDx0ZD4tLUxvZ1BhdGg8L3RkPgorICAgIDx0ZD53b3JraW5nIHBhdGg8L3RkPgorICAgIDx0ZD5EZWZpbmVzIHRoZSBwYXRoIGZvciBsb2dnaW5nPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICA8dGQ+LS1Mb2dQcmVmaXg8L3RkPgorICAgIDx0ZD5qYWthcnRhX3NlcnZpY2U8L3RkPgorICAgIDx0ZD5EZWZpbmVzIHRoZSBzZXJ2aWNlIGxvZyBmaWxlbmFtZTwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgPHRkPi0tTG9nTGV2ZWw8L3RkPgorICAgIDx0ZD5JTkZPPC90ZD4KKyAgICA8dGQ+RGVmaW5lcyB0aGUgbG9nZ2luZyBsZXZlbCBhbmQgY2FuIGJlIGVpdGhlciA8Yj5lcnJvcjwvYj4sCisgICAgICAgIDxiPmluZm88L2I+LCA8Yj53YXJuPC9iPiBvciA8Yj5kZWJ1ZzwvYj48L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgIDx0ZD4tLVN0ZE91dHB1dDwvdGQ+CisgICAgPHRkPjwvdGQ+CisgICAgPHRkPlJlZGlyZWN0ZWQgc3Rkb3V0IGZpbGVuYW1lPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICA8dGQ+LS1TdGRFcnJvcjwvdGQ+CisgICAgPHRkPjwvdGQ+CisgICAgPHRkPlJlZGlyZWN0ZWQgc3RkZXJyIGZpbGVuYW1lPC90ZD4KKyAgICA8L3RyPiAgICAKKyAgICA8L3RhYmxlPgorPC9wPiAKKzwvc2VjdGlvbj4KKzxzZWN0aW9uIG5hbWU9Ikluc3RhbGxpbmcgc2VydmljZXMiPgorPHA+CitUaGUgc2FmZXN0IHdheSB0byBtYW51YWxseSBpbnN0YWxsIHRoZSBzZXJ2aWNlIGlzIHRvIHVzZSB0aGUgcHJvdmlkZWQgPGI+c2VydmljZS5iYXQ8L2I+IHNjcmlwdC4KKzwvcD4KKzxwPgorPHNvdXJjZT4KK0luc3RhbGwgdGhlIHNlcnZpY2UgbmFtZWQgJ1RvbWNhdDUnCitDOlw+IHNlcnZpY2UuYmF0IGluc3RhbGwKKzwvc291cmNlPgorPC9wPgorPHA+CitJZiB1c2luZyB0b21jYXQ1LmV4ZSwgeW91IG5lZWQgdG8gdXNlIHRoZSA8Yj4vL0lTLy88L2I+IHBhcmFtZXRlci4KKzwvcD4KKzxwPgorPHNvdXJjZT4KK0luc3RhbGwgdGhlIHNlcnZpY2UgbmFtZWQgJ1RvbWNhdDUnCitDOlw+IHRvbWNhdDUgLy9JUy8vVG9tY2F0NSAtLURpc3BsYXlOYW1lPSJBcGFjaGUgVG9tY2F0IDUiIFwKK0M6XD4gLS1JbnN0YWxsPSJDOlxQcm9ncmFtIEZpbGVzXFRvbWNhdFxiaW5cdG9tY2F0NS5leGUiIC0tSnZtPWF1dG8gXAorQzpcPiAtLVN0YXJ0TW9kZT1qdm0gLS1TdG9wTW9kZT1qdm0gXAorQzpcPiAtLVN0YXJ0Q2xhc3M9b3JnLmFwYWNoZS5jYXRhbGluYS5zdGFydHVwLkJvb3RzdHJhcCAtLVN0YXJ0UGFyYW1zPXN0YXJ0IFwKK0M6XD4gLS1TdG9wQ2xhc3M9b3JnLmFwYWNoZS5jYXRhbGluYS5zdGFydHVwLkJvb3RzdHJhcCAtLVN0b3BQYXJhbXM9c3RvcAorPC9zb3VyY2U+Cis8L3A+Cis8L3NlY3Rpb24+Cis8c2VjdGlvbiBuYW1lPSJVcGRhdGluZyBzZXJ2aWNlcyI+Cis8cD4KK1RvIHVwZGF0ZSB0aGUgc2VydmljZSBwYXJhbWV0ZXJzLCB5b3UgbmVlZCB0byB1c2UgdGhlIDxiPi8vVVMvLzwvYj4gcGFyYW1ldGVyLgorPC9wPgorPHA+Cis8c291cmNlPgorVXBkYXRlIHRoZSBzZXJ2aWNlIG5hbWVkICdUb21jYXQ1CitDOlw+IHRvbWNhdDUgLy9VUy8vVG9tY2F0NSAtLURlc2NyaXB0aW9uPSJBcGFjaGUgVG9tY2F0IFNlcnZlciAtIGh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvdG9tY2F0ICIgXAorQzpcPiAtLVN0YXJ0dXA9YXV0byAtLUNsYXNzcGF0aD0lSkFWQV9IT01FJVxsaWJcdG9vbHMuamFyOyVDQVRBTElOQV9IT01FJVxiaW5cYm9vdHN0cmFwLmphcgorPC9zb3VyY2U+Cis8L3A+Cis8L3NlY3Rpb24+Cis8c2VjdGlvbiBuYW1lPSJSZW1vdmluZyBzZXJ2aWNlcyI+Cis8cD4KK1RvIHJlbW92ZSB0aGUgc2VydmljZSwgeW91IG5lZWQgdG8gdXNlIHRoZSA8Yj4vL0RTLy88L2I+IHBhcmFtZXRlci48YnIvPgorSWYgdGhlIHNlcnZpY2UgaXMgcnVubmluZyBpdCB3aWxsIGJlIHN0b3BwZWQgYW5kIHRoZW4gZGVsZXRlZC4KKzwvcD4KKzxwPgorPHNvdXJjZT4KK1JlbW92ZSB0aGUgc2VydmljZSBuYW1lZCAnVG9tY2F0NScKK0M6XD4gdG9tY2F0NSAvL0RTLy9Ub21jYXQ1Cis8L3NvdXJjZT4KKzwvcD4KKzwvc2VjdGlvbj4KKzxzZWN0aW9uIG5hbWU9IkRlYnVnZ2luZyBzZXJ2aWNlcyI+Cis8cD4KK1RvIHJ1biB0aGUgc2VydmljZSBpbiBjb25zb2xlIG1vZGUsIHlvdSBuZWVkIHRvIHVzZSB0aGUgPGI+Ly9UUy8vPC9iPiBwYXJhbWV0ZXIuCitUaGUgc2VydmljZSBzaHV0ZG93biBjYW4gYmUgaW5pdGlhdGVkIGJ5IHByZXNzaW5nIDxiPkNUUkwrQzwvYj4gb3IKKzxiPkNUUkwrQlJFQUs8L2I+LgorSWYgeW91IHJlbmFtZSB0aGUgdG9tY2F0NS5leGUgdG8gdGVzdHNlcnZpY2UuZXhlIHRoZW4geW91IGNhbiBqdXN0IGV4ZWN1dGUgdGhlCit0ZXN0c2VydmljZS5leGUgYW5kIHRoaXMgY29tbWFuZCBtb2RlIHdpbGwgYmUgZXhlY3V0ZWQgYnkgZGVmYXVsdC4KKzwvcD4KKzxwPgorPHNvdXJjZT4KK1J1biB0aGUgc2VydmljZSBuYW1lZCAnVG9tY2F0NScgaW4gY29uc29sZSBtb2RlCitDOlw+IHRvbWNhdDUgLy9UUy8vVG9tY2F0NSBbYWRkaXRpb25hbCBhcmd1bWVudHNdCitPciBzaW1wbHkgZXhlY3V0ZToKK0M6XD4gdG9tY2F0NQorPC9zb3VyY2U+Cis8L3A+Cis8L3NlY3Rpb24+Cis8L2JvZHk+Cis8L2RvY3VtZW50PiAKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL21hbmFnZXIvV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvY2F0YWxpbmEvbWFuYWdlci9Db25zdGFudHMuamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL21hbmFnZXIvV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvY2F0YWxpbmEvbWFuYWdlci9Db25zdGFudHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjRlN2M4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvbWFuYWdlci9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS9jYXRhbGluYS9tYW5hZ2VyL0NvbnN0YW50cy5qYXZhCkBAIC0wLDAgKzEsMjAyIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLm1hbmFnZXI7CisKKworcHVibGljIGNsYXNzIENvbnN0YW50cyB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQYWNrYWdlID0gIm9yZy5hcGFjaGUuY2F0YWxpbmEubWFuYWdlciI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVE1MX0hFQURFUl9TRUNUSU9OID0KKyAgICAgICAgIjxodG1sPlxuIiArCisgICAgICAgICI8aGVhZD5cbiIgKworICAgICAgICAiPHN0eWxlPlxuIiArCisgICAgICAgIG9yZy5hcGFjaGUuY2F0YWxpbmEudXRpbC5Ub21jYXRDU1MuVE9NQ0FUX0NTUyArCisgICAgICAgICIgIHRhYmxlIHtcbiIgKworICAgICAgICAiICAgIHdpZHRoOiAxMDAlO1xuIiArCisgICAgICAgICIgIH1cbiIgKworICAgICAgICAiICB0ZC5wYWdlLXRpdGxlIHtcbiIgKworICAgICAgICAiICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiIgKworICAgICAgICAiICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7XG4iICsKKyAgICAgICAgIiAgICBmb250LWZhbWlseTpzYW5zLXNlcmlmLFRhaG9tYSxBcmlhbDtcbiIgKworICAgICAgICAiICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xuIiArCisgICAgICAgICIgICAgYmFja2dyb3VuZDogd2hpdGU7XG4iICsKKyAgICAgICAgIiAgICBjb2xvcjogYmxhY2s7XG4iICsKKyAgICAgICAgIiAgfVxuIiArCisgICAgICAgICIgIHRkLnRpdGxlIHtcbiIgKworICAgICAgICAiICAgIHRleHQtYWxpZ246IGxlZnQ7XG4iICsKKyAgICAgICAgIiAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wO1xuIiArCisgICAgICAgICIgICAgZm9udC1mYW1pbHk6c2Fucy1zZXJpZixUYWhvbWEsQXJpYWw7XG4iICsKKyAgICAgICAgIiAgICBmb250LXN0eWxlOml0YWxpYztcbiIgKworICAgICAgICAiICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xuIiArCisgICAgICAgICIgICAgYmFja2dyb3VuZDogI0QyQTQxQztcbiIgKworICAgICAgICAiICB9XG4iICsKKyAgICAgICAgIiAgdGQuaGVhZGVyLWxlZnQge1xuIiArCisgICAgICAgICIgICAgdGV4dC1hbGlnbjogbGVmdDtcbiIgKworICAgICAgICAiICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7XG4iICsKKyAgICAgICAgIiAgICBmb250LWZhbWlseTpzYW5zLXNlcmlmLFRhaG9tYSxBcmlhbDtcbiIgKworICAgICAgICAiICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xuIiArCisgICAgICAgICIgICAgYmFja2dyb3VuZDogI0ZGREM3NTtcbiIgKworICAgICAgICAiICB9XG4iICsKKyAgICAgICAgIiAgdGQuaGVhZGVyLWNlbnRlciB7XG4iICsKKyAgICAgICAgIiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4iICsKKyAgICAgICAgIiAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wO1xuIiArCisgICAgICAgICIgICAgZm9udC1mYW1pbHk6c2Fucy1zZXJpZixUYWhvbWEsQXJpYWw7XG4iICsKKyAgICAgICAgIiAgICBmb250LXdlaWdodDogYm9sZDtcbiIgKworICAgICAgICAiICAgIGJhY2tncm91bmQ6ICNGRkRDNzU7XG4iICsKKyAgICAgICAgIiAgfVxuIiArCisgICAgICAgICIgIHRkLnJvdy1sZWZ0IHtcbiIgKworICAgICAgICAiICAgIHRleHQtYWxpZ246IGxlZnQ7XG4iICsKKyAgICAgICAgIiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuIiArCisgICAgICAgICIgICAgZm9udC1mYW1pbHk6c2Fucy1zZXJpZixUYWhvbWEsQXJpYWw7XG4iICsKKyAgICAgICAgIiAgICBjb2xvcjogYmxhY2s7XG4iICsKKyAgICAgICAgIiAgICBiYWNrZ3JvdW5kOiB3aGl0ZTtcbiIgKworICAgICAgICAiICB9XG4iICsKKyAgICAgICAgIiAgdGQucm93LWNlbnRlciB7XG4iICsKKyAgICAgICAgIiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4iICsKKyAgICAgICAgIiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuIiArCisgICAgICAgICIgICAgZm9udC1mYW1pbHk6c2Fucy1zZXJpZixUYWhvbWEsQXJpYWw7XG4iICsKKyAgICAgICAgIiAgICBjb2xvcjogYmxhY2s7XG4iICsKKyAgICAgICAgIiAgICBiYWNrZ3JvdW5kOiB3aGl0ZTtcbiIgKworICAgICAgICAiICB9XG4iICsKKyAgICAgICAgIiAgdGQucm93LXJpZ2h0IHtcbiIgKworICAgICAgICAiICAgIHRleHQtYWxpZ246IHJpZ2h0O1xuIiArCisgICAgICAgICIgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiIgKworICAgICAgICAiICAgIGZvbnQtZmFtaWx5OnNhbnMtc2VyaWYsVGFob21hLEFyaWFsO1xuIiArCisgICAgICAgICIgICAgY29sb3I6IGJsYWNrO1xuIiArCisgICAgICAgICIgICAgYmFja2dyb3VuZDogd2hpdGU7XG4iICsKKyAgICAgICAgIiAgfVxuIiArCisgICAgICAgICIgIFRIIHtcbiIgKworICAgICAgICAiICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiIgKworICAgICAgICAiICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7XG4iICsKKyAgICAgICAgIiAgICBmb250LWZhbWlseTpzYW5zLXNlcmlmLFRhaG9tYSxBcmlhbDtcbiIgKworICAgICAgICAiICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xuIiArCisgICAgICAgICIgICAgYmFja2dyb3VuZDogI0ZGREM3NTtcbiIgKworICAgICAgICAiICB9XG4iICsKKyAgICAgICAgIiAgVEQge1xuIiArCisgICAgICAgICIgICAgdGV4dC1hbGlnbjogY2VudGVyO1xuIiArCisgICAgICAgICIgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiIgKworICAgICAgICAiICAgIGZvbnQtZmFtaWx5OnNhbnMtc2VyaWYsVGFob21hLEFyaWFsO1xuIiArCisgICAgICAgICIgICAgY29sb3I6IGJsYWNrO1xuIiArCisgICAgICAgICIgICAgYmFja2dyb3VuZDogd2hpdGU7XG4iICsKKyAgICAgICAgIiAgfVxuIiArCisgICAgICAgICI8L3N0eWxlPlxuIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJPRFlfSEVBREVSX1NFQ1RJT04gPQorICAgICAgICAiPHRpdGxlPnswfTwvdGl0bGU+XG4iICsKKyAgICAgICAgIjwvaGVhZD5cbiIgKworICAgICAgICAiXG4iICsKKyAgICAgICAgIjxib2R5IGJnY29sb3I9XCIjRkZGRkZGXCI+XG4iICsKKyAgICAgICAgIlxuIiArCisgICAgICAgICI8dGFibGUgY2VsbHNwYWNpbmc9XCI0XCIgd2lkdGg9XCIxMDAlXCIgYm9yZGVyPVwiMFwiPlxuIiArCisgICAgICAgICIgPHRyPlxuIiArCisgICAgICAgICIgIDx0ZCBjb2xzcGFuPVwiMlwiPlxuIiArCisgICAgICAgICIgICA8YSBocmVmPVwiaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9cIj5cbiIgKworICAgICAgICAiICAgIDxpbWcgYm9yZGVyPVwiMFwiIGFsdD1cIlRoZSBKYWthcnRhIFByb2plY3RcIiBhbGlnbj1cImxlZnRcIlxuIiArCisgICAgICAgICIgICAgICAgICBzcmM9XCJ7MH0vaW1hZ2VzL2pha2FydGEtbG9nby5naWZcIj5cbiIgKworICAgICAgICAiICAgPC9hPlxuIiArCisgICAgICAgICIgICA8YSBocmVmPVwiaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy90b21jYXQvXCI+XG4iICsKKyAgICAgICAgIiAgICA8aW1nIGJvcmRlcj1cIjBcIiBhbHQ9XCJUaGUgVG9tY2F0IFNlcnZsZXQvSlNQIENvbnRhaW5lclwiXG4iICsKKyAgICAgICAgIiAgICAgICAgIGFsaWduPVwicmlnaHRcIiBzcmM9XCJ7MH0vaW1hZ2VzL3RvbWNhdC5naWZcIj5cbiIgKworICAgICAgICAiICAgPC9hPlxuIiArCisgICAgICAgICIgIDwvdGQ+XG4iICsKKyAgICAgICAgIiA8L3RyPlxuIiArCisgICAgICAgICI8L3RhYmxlPlxuIiArCisgICAgICAgICI8aHIgc2l6ZT1cIjFcIiBub3NoYWRlPVwibm9zaGFkZVwiPlxuIiArCisgICAgICAgICI8dGFibGUgY2VsbHNwYWNpbmc9XCI0XCIgd2lkdGg9XCIxMDAlXCIgYm9yZGVyPVwiMFwiPlxuIiArCisgICAgICAgICIgPHRyPlxuIiArCisgICAgICAgICIgIDx0ZCBjbGFzcz1cInBhZ2UtdGl0bGVcIiBib3JkZXJjb2xvcj1cIiMwMDAwMDBcIiAiICsKKyAgICAgICAgImFsaWduPVwibGVmdFwiIG5vd3JhcD5cbiIgKworICAgICAgICAiICAgPGZvbnQgc2l6ZT1cIisyXCI+ezF9PC9mb250PlxuIiArCisgICAgICAgICIgIDwvdGQ+XG4iICsKKyAgICAgICAgIiA8L3RyPlxuIiArCisgICAgICAgICI8L3RhYmxlPlxuIiArCisgICAgICAgICI8YnI+XG4iICsKKyAgICAgICAgIlxuIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0VfU0VDVElPTiA9CisgICAgICAgICI8dGFibGUgYm9yZGVyPVwiMVwiIGNlbGxzcGFjaW5nPVwiMFwiIGNlbGxwYWRkaW5nPVwiM1wiPlxuIiArCisgICAgICAgICIgPHRyPlxuIiArCisgICAgICAgICIgIDx0ZCBjbGFzcz1cInJvdy1sZWZ0XCIgd2lkdGg9XCIxMCVcIj4iICsKKyAgICAgICAgIjxzbWFsbD48c3Ryb25nPnswfTwvc3Ryb25nPjwvc21hbGw+Jm5ic3A7PC90ZD5cbiIgKworICAgICAgICAiICA8dGQgY2xhc3M9XCJyb3ctbGVmdFwiPjxwcmU+ezF9PC9wcmU+PC90ZD5cbiIgKworICAgICAgICAiIDwvdHI+XG4iICsKKyAgICAgICAgIjwvdGFibGU+XG4iICsKKyAgICAgICAgIjxicj5cbiIgKworICAgICAgICAiXG4iOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFOQUdFUl9TRUNUSU9OID0KKyAgICAgICAgIjx0YWJsZSBib3JkZXI9XCIxXCIgY2VsbHNwYWNpbmc9XCIwXCIgY2VsbHBhZGRpbmc9XCIzXCI+XG4iICsKKyAgICAgICAgIjx0cj5cbiIgKworICAgICAgICAiIDx0ZCBjb2xzcGFuPVwiNFwiIGNsYXNzPVwidGl0bGVcIj57MH08L3RkPlxuIiArCisgICAgICAgICI8L3RyPlxuIiArCisgICAgICAgICIgPHRyPlxuIiArCisgICAgICAgICIgIDx0ZCBjbGFzcz1cInJvdy1sZWZ0XCI+PGEgaHJlZj1cInsxfVwiPnsyfTwvYT48L3RkPlxuIiArCisgICAgICAgICIgIDx0ZCBjbGFzcz1cInJvdy1jZW50ZXJcIj48YSBocmVmPVwiezN9XCI+ezR9PC9hPjwvdGQ+XG4iICsKKyAgICAgICAgIiAgPHRkIGNsYXNzPVwicm93LWNlbnRlclwiPjxhIGhyZWY9XCJ7NX1cIj57Nn08L2E+PC90ZD5cbiIgKworICAgICAgICAiICA8dGQgY2xhc3M9XCJyb3ctcmlnaHRcIj48YSBocmVmPVwiezd9XCI+ezh9PC9hPjwvdGQ+XG4iICsKKyAgICAgICAgIiA8L3RyPlxuIiArCisgICAgICAgICI8L3RhYmxlPlxuIiArCisgICAgICAgICI8YnI+XG4iICsKKyAgICAgICAgIlxuIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZFUl9IRUFERVJfU0VDVElPTiA9CisgICAgICAgICI8dGFibGUgYm9yZGVyPVwiMVwiIGNlbGxzcGFjaW5nPVwiMFwiIGNlbGxwYWRkaW5nPVwiM1wiPlxuIiArCisgICAgICAgICI8dHI+XG4iICsKKyAgICAgICAgIiA8dGQgY29sc3Bhbj1cIjZcIiBjbGFzcz1cInRpdGxlXCI+ezB9PC90ZD5cbiIgKworICAgICAgICAiPC90cj5cbiIgKworICAgICAgICAiPHRyPlxuIiArCisgICAgICAgICIgPHRkIGNsYXNzPVwiaGVhZGVyLWNlbnRlclwiPjxzbWFsbD57MX08L3NtYWxsPjwvdGQ+XG4iICsKKyAgICAgICAgIiA8dGQgY2xhc3M9XCJoZWFkZXItY2VudGVyXCI+PHNtYWxsPnsyfTwvc21hbGw+PC90ZD5cbiIgKworICAgICAgICAiIDx0ZCBjbGFzcz1cImhlYWRlci1jZW50ZXJcIj48c21hbGw+ezN9PC9zbWFsbD48L3RkPlxuIiArCisgICAgICAgICIgPHRkIGNsYXNzPVwiaGVhZGVyLWNlbnRlclwiPjxzbWFsbD57NH08L3NtYWxsPjwvdGQ+XG4iICsKKyAgICAgICAgIiA8dGQgY2xhc3M9XCJoZWFkZXItY2VudGVyXCI+PHNtYWxsPns1fTwvc21hbGw+PC90ZD5cbiIgKworICAgICAgICAiIDx0ZCBjbGFzcz1cImhlYWRlci1jZW50ZXJcIj48c21hbGw+ezZ9PC9zbWFsbD48L3RkPlxuIiArCisgICAgICAgICI8L3RyPlxuIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZFUl9ST1dfU0VDVElPTiA9CisgICAgICAgICI8dHI+XG4iICsKKyAgICAgICAgIiA8dGQgY2xhc3M9XCJyb3ctY2VudGVyXCI+PHNtYWxsPnswfTwvc21hbGw+PC90ZD5cbiIgKworICAgICAgICAiIDx0ZCBjbGFzcz1cInJvdy1jZW50ZXJcIj48c21hbGw+ezF9PC9zbWFsbD48L3RkPlxuIiArCisgICAgICAgICIgPHRkIGNsYXNzPVwicm93LWNlbnRlclwiPjxzbWFsbD57Mn08L3NtYWxsPjwvdGQ+XG4iICsKKyAgICAgICAgIiA8dGQgY2xhc3M9XCJyb3ctY2VudGVyXCI+PHNtYWxsPnszfTwvc21hbGw+PC90ZD5cbiIgKworICAgICAgICAiIDx0ZCBjbGFzcz1cInJvdy1jZW50ZXJcIj48c21hbGw+ezR9PC9zbWFsbD48L3RkPlxuIiArCisgICAgICAgICIgPHRkIGNsYXNzPVwicm93LWNlbnRlclwiPjxzbWFsbD57NX08L3NtYWxsPjwvdGQ+XG4iICsKKyAgICAgICAgIjwvdHI+XG4iICsKKyAgICAgICAgIjwvdGFibGU+XG4iICsKKyAgICAgICAgIjxicj5cbiIgKworICAgICAgICAiXG4iOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRNTF9UQUlMX1NFQ1RJT04gPQorICAgICAgICAiPGhyIHNpemU9XCIxXCIgbm9zaGFkZT1cIm5vc2hhZGVcIj5cbiIgKworICAgICAgICAiPGNlbnRlcj48Zm9udCBzaXplPVwiLTFcIiBjb2xvcj1cIiM1MjVENzZcIj5cbiIgKworICAgICAgICAiIDxlbT5Db3B5cmlnaHQgJmNvcHk7IDE5OTktMjAwMywgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248L2VtPiIgKworICAgICAgICAiPC9mb250PjwvY2VudGVyPlxuIiArCisgICAgICAgICJcbiIgKworICAgICAgICAiPC9ib2R5PlxuIiArCisgICAgICAgICI8L2h0bWw+IjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSEFSU0VUPSJ1dGYtOCI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfREVDTEFSQVRJT04gPQorICAgICAgICAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiIitDSEFSU0VUKyJcIj8+IjsKKwkJCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX1NUWUxFID0KKyAgICAgICAgIjw/eG1sLXN0eWxlc2hlZXQgdHlwZT1cInRleHQveHNsXCIgaHJlZj1cIi9tYW5hZ2VyL3hmb3JtLnhzbFwiID8+IjsKKworfQorCmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9tYW5hZ2VyL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL2NhdGFsaW5hL21hbmFnZXIvSFRNTE1hbmFnZXJTZXJ2bGV0LmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9tYW5hZ2VyL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL2NhdGFsaW5hL21hbmFnZXIvSFRNTE1hbmFnZXJTZXJ2bGV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMwZjI4MQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL21hbmFnZXIvV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvY2F0YWxpbmEvbWFuYWdlci9IVE1MTWFuYWdlclNlcnZsZXQuamF2YQpAQCAtMCwwICsxLDY3NCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5tYW5hZ2VyOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKK2ltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGFpbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuU2VydmVySW5mbzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuZmlsZXVwbG9hZC5GaWxlSXRlbTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuZmlsZXVwbG9hZC5EaXNrRmlsZVVwbG9hZDsKKworLyoqCisqIFNlcnZsZXQgdGhhdCBlbmFibGVzIHJlbW90ZSBtYW5hZ2VtZW50IG9mIHRoZSB3ZWIgYXBwbGljYXRpb25zIGRlcGxveWVkCisqIHdpdGhpbiB0aGUgc2FtZSB2aXJ0dWFsIGhvc3QgYXMgdGhpcyB3ZWIgYXBwbGljYXRpb24gaXMuICBOb3JtYWxseSwgdGhpcworKiBmdW5jdGlvbmFsaXR5IHdpbGwgYmUgcHJvdGVjdGVkIGJ5IGEgc2VjdXJpdHkgY29uc3RyYWludCBpbiB0aGUgd2ViCisqIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQgZGVzY3JpcHRvci4gIEhvd2V2ZXIsIHRoaXMgcmVxdWlyZW1lbnQgY2FuIGJlCisqIHJlbGF4ZWQgZHVyaW5nIHRlc3RpbmcuCisqIDxwPgorKiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSA8Y29kZT5NYW5hZ2VyU2VydmxldDwvY29kZT4gYW5kIHRoaXMKKyogU2VydmxldCBpcyB0aGF0IHRoaXMgU2VydmxldCBwcmludHMgb3V0IGEgSFRNTCBpbnRlcmZhY2Ugd2hpY2gKKyogbWFrZXMgaXQgZWFzaWVyIHRvIGFkbWluaXN0cmF0ZS4KKyogPHA+CisqIEhvd2V2ZXIgaWYgeW91IHVzZSBhIHNvZnR3YXJlIHRoYXQgcGFyc2VzIHRoZSBvdXRwdXQgb2YKKyogPGNvZGU+TWFuYWdlclNlcnZsZXQ8L2NvZGUgeW91IHdvbid0IGJlIGFibGUgdG8gdXBncmFkZQorKiB0byB0aGlzIFNlcnZsZXQgc2luY2UgdGhlIG91dHB1dCBhcmUgbm90IGluIHRoZQorKiBzYW1lIGZvcm1hdCBhciBmcm9tIDxjb2RlPk1hbmFnZXJTZXJ2bGV0PC9jb2RlPgorKgorKiBAYXV0aG9yIEJpcCBUaGVsaW4KKyogQGF1dGhvciBNYWxjb2xtIEVkZ2FyCisqIEBhdXRob3IgR2xlbm4gTC4gTmllbHNlbgorKiBAdmVyc2lvbiAkUmV2aXNpb24kLCAkRGF0ZSQKKyogQHNlZSBNYW5hZ2VyU2VydmxldAorKi8KKworcHVibGljIGZpbmFsIGNsYXNzIEhUTUxNYW5hZ2VyU2VydmxldCBleHRlbmRzIE1hbmFnZXJTZXJ2bGV0IHsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisgICAgLyoqCisgICAgICogUHJvY2VzcyBhIEdFVCByZXF1ZXN0IGZvciB0aGUgc3BlY2lmaWVkIHJlc291cmNlLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgc2VydmxldCByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQtc3BlY2lmaWVkIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gSWRlbnRpZnkgdGhlIHJlcXVlc3QgcGFyYW1ldGVycyB0aGF0IHdlIG5lZWQKKyAgICAgICAgU3RyaW5nIGNvbW1hbmQgPSByZXF1ZXN0LmdldFBhdGhJbmZvKCk7CisKKyAgICAgICAgU3RyaW5nIHBhdGggPSByZXF1ZXN0LmdldFBhcmFtZXRlcigicGF0aCIpOworICAgICAgICBTdHJpbmcgZGVwbG95UGF0aCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJkZXBsb3lQYXRoIik7CisgICAgICAgIFN0cmluZyBkZXBsb3lDb25maWcgPSByZXF1ZXN0LmdldFBhcmFtZXRlcigiZGVwbG95Q29uZmlnIik7CisgICAgICAgIFN0cmluZyBkZXBsb3lXYXIgPSByZXF1ZXN0LmdldFBhcmFtZXRlcigiZGVwbG95V2FyIik7CisKKyAgICAgICAgLy8gUHJlcGFyZSBvdXIgb3V0cHV0IHdyaXRlciB0byBnZW5lcmF0ZSB0aGUgcmVzcG9uc2UgbWVzc2FnZQorICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9odG1sOyBjaGFyc2V0PSIgKyBDb25zdGFudHMuQ0hBUlNFVCk7CisKKyAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiIjsKKyAgICAgICAgLy8gUHJvY2VzcyB0aGUgcmVxdWVzdGVkIGNvbW1hbmQKKyAgICAgICAgaWYgKGNvbW1hbmQgPT0gbnVsbCB8fCBjb21tYW5kLmVxdWFscygiLyIpKSB7CisgICAgICAgIH0gZWxzZSBpZiAoY29tbWFuZC5lcXVhbHMoIi9kZXBsb3kiKSkgeworICAgICAgICAgICAgbWVzc2FnZSA9IGRlcGxveUludGVybmFsKGRlcGxveUNvbmZpZywgZGVwbG95UGF0aCwgZGVwbG95V2FyKTsKKyAgICAgICAgfSBlbHNlIGlmIChjb21tYW5kLmVxdWFscygiL2xpc3QiKSkgeworICAgICAgICB9IGVsc2UgaWYgKGNvbW1hbmQuZXF1YWxzKCIvcmVsb2FkIikpIHsKKyAgICAgICAgICAgIG1lc3NhZ2UgPSByZWxvYWQocGF0aCk7CisgICAgICAgIH0gZWxzZSBpZiAoY29tbWFuZC5lcXVhbHMoIi91bmRlcGxveSIpKSB7CisgICAgICAgICAgICBtZXNzYWdlID0gdW5kZXBsb3kocGF0aCk7CisgICAgICAgIH0gZWxzZSBpZiAoY29tbWFuZC5lcXVhbHMoIi9zZXNzaW9ucyIpKSB7CisgICAgICAgICAgICBtZXNzYWdlID0gc2Vzc2lvbnMocGF0aCk7CisgICAgICAgIH0gZWxzZSBpZiAoY29tbWFuZC5lcXVhbHMoIi9zdGFydCIpKSB7CisgICAgICAgICAgICBtZXNzYWdlID0gc3RhcnQocGF0aCk7CisgICAgICAgIH0gZWxzZSBpZiAoY29tbWFuZC5lcXVhbHMoIi9zdG9wIikpIHsKKyAgICAgICAgICAgIG1lc3NhZ2UgPSBzdG9wKHBhdGgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWVzc2FnZSA9CisgICAgICAgICAgICAgICAgc20uZ2V0U3RyaW5nKCJtYW5hZ2VyU2VydmxldC51bmtub3duQ29tbWFuZCIsIGNvbW1hbmQpOworICAgICAgICB9CisKKyAgICAgICAgbGlzdChyZXF1ZXN0LCByZXNwb25zZSwgbWVzc2FnZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJvY2VzcyBhIFBPU1QgcmVxdWVzdCBmb3IgdGhlIHNwZWNpZmllZCByZXNvdXJjZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIHNlcnZsZXQgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0LXNwZWNpZmllZCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkb1Bvc3QoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICAvLyBJZGVudGlmeSB0aGUgcmVxdWVzdCBwYXJhbWV0ZXJzIHRoYXQgd2UgbmVlZAorICAgICAgICBTdHJpbmcgY29tbWFuZCA9IHJlcXVlc3QuZ2V0UGF0aEluZm8oKTsKKworICAgICAgICBpZiAoY29tbWFuZCA9PSBudWxsIHx8ICFjb21tYW5kLmVxdWFscygiL3VwbG9hZCIpKSB7CisgICAgICAgICAgICBkb0dldChyZXF1ZXN0LHJlc3BvbnNlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFByZXBhcmUgb3VyIG91dHB1dCB3cml0ZXIgdG8gZ2VuZXJhdGUgdGhlIHJlc3BvbnNlIG1lc3NhZ2UKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvaHRtbDsgY2hhcnNldD0iICsgQ29uc3RhbnRzLkNIQVJTRVQpOworCisgICAgICAgIFN0cmluZyBtZXNzYWdlID0gIiI7CisKKyAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IGZpbGUgdXBsb2FkIGhhbmRsZXIKKyAgICAgICAgRGlza0ZpbGVVcGxvYWQgdXBsb2FkID0gbmV3IERpc2tGaWxlVXBsb2FkKCk7CisKKyAgICAgICAgLy8gR2V0IHRoZSB0ZW1wZGlyCisgICAgICAgIEZpbGUgdGVtcGRpciA9IChGaWxlKSBnZXRTZXJ2bGV0Q29udGV4dCgpLmdldEF0dHJpYnV0ZQorICAgICAgICAgICAgKCJqYXZheC5zZXJ2bGV0LmNvbnRleHQudGVtcGRpciIpOworICAgICAgICAvLyBTZXQgdXBsb2FkIHBhcmFtZXRlcnMKKyAgICAgICAgdXBsb2FkLnNldFNpemVNYXgoLTEpOworICAgICAgICB1cGxvYWQuc2V0UmVwb3NpdG9yeVBhdGgodGVtcGRpci5nZXRDYW5vbmljYWxQYXRoKCkpOworICAgIAorICAgICAgICAvLyBQYXJzZSB0aGUgcmVxdWVzdAorICAgICAgICBTdHJpbmcgYmFzZW5hbWUgPSBudWxsOworICAgICAgICBTdHJpbmcgd2FyID0gbnVsbDsKKyAgICAgICAgRmlsZUl0ZW0gd2FyVXBsb2FkID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIExpc3QgaXRlbXMgPSB1cGxvYWQucGFyc2VSZXF1ZXN0KHJlcXVlc3QpOworICAgICAgICAKKyAgICAgICAgICAgIC8vIFByb2Nlc3MgdGhlIHVwbG9hZGVkIGZpZWxkcworICAgICAgICAgICAgSXRlcmF0b3IgaXRlciA9IGl0ZW1zLml0ZXJhdG9yKCk7CisgICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBGaWxlSXRlbSBpdGVtID0gKEZpbGVJdGVtKSBpdGVyLm5leHQoKTsKKyAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKCFpdGVtLmlzRm9ybUZpZWxkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0uZ2V0RmllbGROYW1lKCkuZXF1YWxzKCJkZXBsb3lXYXIiKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgd2FyVXBsb2FkID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdhclVwbG9hZCA9IGl0ZW07CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmRlbGV0ZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICBpZiAod2FyVXBsb2FkID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IHNtLmdldFN0cmluZworICAgICAgICAgICAgICAgICAgICAgICAgKCJodG1sTWFuYWdlclNlcnZsZXQuZGVwbG95VXBsb2FkTm9GaWxlIik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3YXIgPSB3YXJVcGxvYWQuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgIGlmICghd2FyLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoIi53YXIiKSkgeworICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gc20uZ2V0U3RyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAoImh0bWxNYW5hZ2VyU2VydmxldC5kZXBsb3lVcGxvYWROb3RXYXIiLHdhcik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIGZpbGVuYW1lIGlmIHVwbG9hZGVkIG5hbWUgaW5jbHVkZXMgYSBwYXRoCisgICAgICAgICAgICAgICAgaWYgKHdhci5sYXN0SW5kZXhPZignXFwnKSA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHdhciA9IHdhci5zdWJzdHJpbmcod2FyLmxhc3RJbmRleE9mKCdcXCcpICsgMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh3YXIubGFzdEluZGV4T2YoJy8nKSA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHdhciA9IHdhci5zdWJzdHJpbmcod2FyLmxhc3RJbmRleE9mKCcvJykgKyAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gSWRlbnRpZnkgdGhlIGFwcEJhc2Ugb2YgdGhlIG93bmluZyBIb3N0IG9mIHRoaXMgQ29udGV4dAorICAgICAgICAgICAgICAgIC8vIChpZiBhbnkpCisgICAgICAgICAgICAgICAgYmFzZW5hbWUgPSB3YXIuc3Vic3RyaW5nKDAsIHdhci5pbmRleE9mKCIud2FyIikpOworICAgICAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGdldEFwcEJhc2UoKSwgd2FyKTsKKyAgICAgICAgICAgICAgICBpZiAoZmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gc20uZ2V0U3RyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAoImh0bWxNYW5hZ2VyU2VydmxldC5kZXBsb3lVcGxvYWRXYXJFeGlzdHMiLHdhcik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IG51bGw7CisgICAgICAgICAgICAgICAgaWYgKGJhc2VuYW1lLmVxdWFscygiUk9PVCIpKSB7CisgICAgICAgICAgICAgICAgICAgIHBhdGggPSAiIjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBwYXRoID0gIi8iICsgYmFzZW5hbWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFpc1NlcnZpY2VkKHBhdGgpKSB7CisgICAgICAgICAgICAgICAgICAgIGFkZFNlcnZpY2VkKHBhdGgpOworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgd2FyVXBsb2FkLndyaXRlKGZpbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gUGVyZm9ybSBuZXcgZGVwbG95bWVudAorICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2socGF0aCk7CisgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVTZXJ2aWNlZChwYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbWVzc2FnZSA9IHNtLmdldFN0cmluZworICAgICAgICAgICAgICAgICgiaHRtbE1hbmFnZXJTZXJ2bGV0LmRlcGxveVVwbG9hZEZhaWwiLCBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICBsb2cobWVzc2FnZSwgZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAod2FyVXBsb2FkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB3YXJVcGxvYWQuZGVsZXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3YXJVcGxvYWQgPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgbGlzdChyZXF1ZXN0LCByZXNwb25zZSwgbWVzc2FnZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVwbG95IGFuIGFwcGxpY2F0aW9uIGZvciB0aGUgc3BlY2lmaWVkIHBhdGggZnJvbSB0aGUgc3BlY2lmaWVkCisgICAgICogd2ViIGFwcGxpY2F0aW9uIGFyY2hpdmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29uZmlnIFVSTCBvZiB0aGUgY29udGV4dCBjb25maWd1cmF0aW9uIGZpbGUgdG8gYmUgZGVwbG95ZWQKKyAgICAgKiBAcGFyYW0gcGF0aCBDb250ZXh0IHBhdGggb2YgdGhlIGFwcGxpY2F0aW9uIHRvIGJlIGRlcGxveWVkCisgICAgICogQHBhcmFtIHdhciBVUkwgb2YgdGhlIHdlYiBhcHBsaWNhdGlvbiBhcmNoaXZlIHRvIGJlIGRlcGxveWVkCisgICAgICogQHJldHVybiBtZXNzYWdlIFN0cmluZworICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZGVwbG95SW50ZXJuYWwoU3RyaW5nIGNvbmZpZywgU3RyaW5nIHBhdGgsIFN0cmluZyB3YXIpIHsKKworICAgICAgICBTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBQcmludFdyaXRlciBwcmludFdyaXRlciA9IG5ldyBQcmludFdyaXRlcihzdHJpbmdXcml0ZXIpOworCisgICAgICAgIHN1cGVyLmRlcGxveShwcmludFdyaXRlciwgY29uZmlnLCBwYXRoLCB3YXIsIGZhbHNlKTsKKworICAgICAgICByZXR1cm4gc3RyaW5nV3JpdGVyLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVuZGVyIGEgSFRNTCBsaXN0IG9mIHRoZSBjdXJyZW50bHkgYWN0aXZlIENvbnRleHRzIGluIG91ciB2aXJ0dWFsIGhvc3QsCisgICAgICogYW5kIG1lbW9yeSBhbmQgc2VydmVyIHN0YXR1cyBpbmZvcm1hdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSByZXF1ZXN0CisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSByZXNwb25zZQorICAgICAqIEBwYXJhbSBtZXNzYWdlIGEgbWVzc2FnZSB0byBkaXNwbGF5CisgICAgICovCisgICAgcHVibGljIHZvaWQgbGlzdChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAoZGVidWcgPj0gMSkKKyAgICAgICAgICAgIGxvZygibGlzdDogTGlzdGluZyBjb250ZXh0cyBmb3IgdmlydHVhbCBob3N0ICciICsKKyAgICAgICAgICAgICAgICBob3N0LmdldE5hbWUoKSArICInIik7CisKKyAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisKKyAgICAgICAgLy8gSFRNTCBIZWFkZXIgU2VjdGlvbgorICAgICAgICB3cml0ZXIucHJpbnQoQ29uc3RhbnRzLkhUTUxfSEVBREVSX1NFQ1RJT04pOworCisgICAgICAgIC8vIEJvZHkgSGVhZGVyIFNlY3Rpb24KKyAgICAgICAgT2JqZWN0W10gYXJncyA9IG5ldyBPYmplY3RbMl07CisgICAgICAgIGFyZ3NbMF0gPSByZXF1ZXN0LmdldENvbnRleHRQYXRoKCk7CisgICAgICAgIGFyZ3NbMV0gPSBzbS5nZXRTdHJpbmcoImh0bWxNYW5hZ2VyU2VydmxldC50aXRsZSIpOworICAgICAgICB3cml0ZXIucHJpbnQoTWVzc2FnZUZvcm1hdC5mb3JtYXQKKyAgICAgICAgICAgICAgICAgICAgIChDb25zdGFudHMuQk9EWV9IRUFERVJfU0VDVElPTiwgYXJncykpOworCisgICAgICAgIC8vIE1lc3NhZ2UgU2VjdGlvbgorICAgICAgICBhcmdzID0gbmV3IE9iamVjdFszXTsKKyAgICAgICAgYXJnc1swXSA9IHNtLmdldFN0cmluZygiaHRtbE1hbmFnZXJTZXJ2bGV0Lm1lc3NhZ2VMYWJlbCIpOworICAgICAgICBhcmdzWzFdID0gKG1lc3NhZ2UgPT0gbnVsbCB8fCBtZXNzYWdlLmxlbmd0aCgpID09IDApID8gIk9LIiA6IG1lc3NhZ2U7CisgICAgICAgIHdyaXRlci5wcmludChNZXNzYWdlRm9ybWF0LmZvcm1hdChDb25zdGFudHMuTUVTU0FHRV9TRUNUSU9OLCBhcmdzKSk7CisKKyAgICAgICAgLy8gTWFuYWdlciBTZWN0aW9uCisgICAgICAgIGFyZ3MgPSBuZXcgT2JqZWN0WzldOworICAgICAgICBhcmdzWzBdID0gc20uZ2V0U3RyaW5nKCJodG1sTWFuYWdlclNlcnZsZXQubWFuYWdlciIpOworICAgICAgICBhcmdzWzFdID0gcmVzcG9uc2UuZW5jb2RlVVJMKHJlcXVlc3QuZ2V0Q29udGV4dFBhdGgoKSArICIvaHRtbC9saXN0Iik7CisgICAgICAgIGFyZ3NbMl0gPSBzbS5nZXRTdHJpbmcoImh0bWxNYW5hZ2VyU2VydmxldC5saXN0Iik7CisgICAgICAgIGFyZ3NbM10gPSByZXNwb25zZS5lbmNvZGVVUkwKKyAgICAgICAgICAgIChyZXF1ZXN0LmdldENvbnRleHRQYXRoKCkgKyAiLyIgKworICAgICAgICAgICAgIHNtLmdldFN0cmluZygiaHRtbE1hbmFnZXJTZXJ2bGV0LmhlbHBIdG1sTWFuYWdlckZpbGUiKSk7CisgICAgICAgIGFyZ3NbNF0gPSBzbS5nZXRTdHJpbmcoImh0bWxNYW5hZ2VyU2VydmxldC5oZWxwSHRtbE1hbmFnZXIiKTsKKyAgICAgICAgYXJnc1s1XSA9IHJlc3BvbnNlLmVuY29kZVVSTAorICAgICAgICAgICAgKHJlcXVlc3QuZ2V0Q29udGV4dFBhdGgoKSArICIvIiArCisgICAgICAgICAgICAgc20uZ2V0U3RyaW5nKCJodG1sTWFuYWdlclNlcnZsZXQuaGVscE1hbmFnZXJGaWxlIikpOworICAgICAgICBhcmdzWzZdID0gc20uZ2V0U3RyaW5nKCJodG1sTWFuYWdlclNlcnZsZXQuaGVscE1hbmFnZXIiKTsKKyAgICAgICAgYXJnc1s3XSA9IHJlc3BvbnNlLmVuY29kZVVSTAorICAgICAgICAgICAgKHJlcXVlc3QuZ2V0Q29udGV4dFBhdGgoKSArICIvc3RhdHVzIik7CisgICAgICAgIGFyZ3NbOF0gPSBzbS5nZXRTdHJpbmcoInN0YXR1c1NlcnZsZXQudGl0bGUiKTsKKyAgICAgICAgd3JpdGVyLnByaW50KE1lc3NhZ2VGb3JtYXQuZm9ybWF0KENvbnN0YW50cy5NQU5BR0VSX1NFQ1RJT04sIGFyZ3MpKTsKKworICAgICAgICAvLyBBcHBzIEhlYWRlciBTZWN0aW9uCisgICAgICAgIGFyZ3MgPSBuZXcgT2JqZWN0WzZdOworICAgICAgICBhcmdzWzBdID0gc20uZ2V0U3RyaW5nKCJodG1sTWFuYWdlclNlcnZsZXQuYXBwc1RpdGxlIik7CisgICAgICAgIGFyZ3NbMV0gPSBzbS5nZXRTdHJpbmcoImh0bWxNYW5hZ2VyU2VydmxldC5hcHBzUGF0aCIpOworICAgICAgICBhcmdzWzJdID0gc20uZ2V0U3RyaW5nKCJodG1sTWFuYWdlclNlcnZsZXQuYXBwc05hbWUiKTsKKyAgICAgICAgYXJnc1szXSA9IHNtLmdldFN0cmluZygiaHRtbE1hbmFnZXJTZXJ2bGV0LmFwcHNBdmFpbGFibGUiKTsKKyAgICAgICAgYXJnc1s0XSA9IHNtLmdldFN0cmluZygiaHRtbE1hbmFnZXJTZXJ2bGV0LmFwcHNTZXNzaW9ucyIpOworICAgICAgICBhcmdzWzVdID0gc20uZ2V0U3RyaW5nKCJodG1sTWFuYWdlclNlcnZsZXQuYXBwc1Rhc2tzIik7CisgICAgICAgIHdyaXRlci5wcmludChNZXNzYWdlRm9ybWF0LmZvcm1hdChBUFBTX0hFQURFUl9TRUNUSU9OLCBhcmdzKSk7CisKKyAgICAgICAgLy8gQXBwcyBSb3cgU2VjdGlvbgorICAgICAgICAvLyBDcmVhdGUgc29ydGVkIG1hcCBvZiBkZXBsb3llZCBhcHBsaWNhdGlvbnMgY29udGV4dCBwYXRocy4KKyAgICAgICAgQ29udGFpbmVyIGNoaWxkcmVuW10gPSBob3N0LmZpbmRDaGlsZHJlbigpOworICAgICAgICBTdHJpbmcgY29udGV4dFBhdGhzW10gPSBuZXcgU3RyaW5nW2NoaWxkcmVuLmxlbmd0aF07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBjb250ZXh0UGF0aHNbaV0gPSBjaGlsZHJlbltpXS5nZXROYW1lKCk7CisKKyAgICAgICAgVHJlZU1hcCBzb3J0ZWRDb250ZXh0UGF0aHNNYXAgPSBuZXcgVHJlZU1hcCgpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29udGV4dFBhdGhzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBTdHJpbmcgZGlzcGxheVBhdGggPSBjb250ZXh0UGF0aHNbaV07CisgICAgICAgICAgICBzb3J0ZWRDb250ZXh0UGF0aHNNYXAucHV0KGRpc3BsYXlQYXRoLCBjb250ZXh0UGF0aHNbaV0pOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIGFwcHNTdGFydCA9IHNtLmdldFN0cmluZygiaHRtbE1hbmFnZXJTZXJ2bGV0LmFwcHNTdGFydCIpOworICAgICAgICBTdHJpbmcgYXBwc1N0b3AgPSBzbS5nZXRTdHJpbmcoImh0bWxNYW5hZ2VyU2VydmxldC5hcHBzU3RvcCIpOworICAgICAgICBTdHJpbmcgYXBwc1JlbG9hZCA9IHNtLmdldFN0cmluZygiaHRtbE1hbmFnZXJTZXJ2bGV0LmFwcHNSZWxvYWQiKTsKKyAgICAgICAgU3RyaW5nIGFwcHNVbmRlcGxveSA9IHNtLmdldFN0cmluZygiaHRtbE1hbmFnZXJTZXJ2bGV0LmFwcHNVbmRlcGxveSIpOworCisgICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gc29ydGVkQ29udGV4dFBhdGhzTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworICAgICAgICAgICAgTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlcmF0b3IubmV4dCgpOworICAgICAgICAgICAgU3RyaW5nIGRpc3BsYXlQYXRoID0gKFN0cmluZykgZW50cnkuZ2V0S2V5KCk7CisgICAgICAgICAgICBTdHJpbmcgY29udGV4dFBhdGggPSAoU3RyaW5nKSBlbnRyeS5nZXRLZXkoKTsKKyAgICAgICAgICAgIENvbnRleHQgY29udGV4dCA9IChDb250ZXh0KSBob3N0LmZpbmRDaGlsZChjb250ZXh0UGF0aCk7CisgICAgICAgICAgICBpZiAoZGlzcGxheVBhdGguZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgICAgIGRpc3BsYXlQYXRoID0gIi8iOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY29udGV4dCAhPSBudWxsICkgeworICAgICAgICAgICAgICAgIGFyZ3MgPSBuZXcgT2JqZWN0WzVdOworICAgICAgICAgICAgICAgIGFyZ3NbMF0gPSBkaXNwbGF5UGF0aDsKKyAgICAgICAgICAgICAgICBhcmdzWzFdID0gY29udGV4dC5nZXREaXNwbGF5TmFtZSgpOworICAgICAgICAgICAgICAgIGlmIChhcmdzWzFdID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgYXJnc1sxXSA9ICImbmJzcDsiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhcmdzWzJdID0gbmV3IEJvb2xlYW4oY29udGV4dC5nZXRBdmFpbGFibGUoKSk7CisgICAgICAgICAgICAgICAgYXJnc1szXSA9IHJlc3BvbnNlLmVuY29kZVVSTAorICAgICAgICAgICAgICAgICAgICAocmVxdWVzdC5nZXRDb250ZXh0UGF0aCgpICsKKyAgICAgICAgICAgICAgICAgICAgICIvaHRtbC9zZXNzaW9ucz9wYXRoPSIgKyBkaXNwbGF5UGF0aCk7CisgICAgICAgICAgICAgICAgaWYgKGNvbnRleHQuZ2V0TWFuYWdlcigpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgYXJnc1s0XSA9IG5ldyBJbnRlZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAoY29udGV4dC5nZXRNYW5hZ2VyKCkuZ2V0QWN0aXZlU2Vzc2lvbnMoKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYXJnc1s0XSA9IG5ldyBJbnRlZ2VyKDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQKKyAgICAgICAgICAgICAgICAgICAgKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEFQUFNfUk9XX0RFVEFJTFNfU0VDVElPTiwgYXJncykpOworCisgICAgICAgICAgICAgICAgYXJncyA9IG5ldyBPYmplY3RbOF07CisgICAgICAgICAgICAgICAgYXJnc1swXSA9IHJlc3BvbnNlLmVuY29kZVVSTAorICAgICAgICAgICAgICAgICAgICAocmVxdWVzdC5nZXRDb250ZXh0UGF0aCgpICsKKyAgICAgICAgICAgICAgICAgICAgICIvaHRtbC9zdGFydD9wYXRoPSIgKyBkaXNwbGF5UGF0aCk7CisgICAgICAgICAgICAgICAgYXJnc1sxXSA9IGFwcHNTdGFydDsKKyAgICAgICAgICAgICAgICBhcmdzWzJdID0gcmVzcG9uc2UuZW5jb2RlVVJMCisgICAgICAgICAgICAgICAgICAgIChyZXF1ZXN0LmdldENvbnRleHRQYXRoKCkgKworICAgICAgICAgICAgICAgICAgICAgIi9odG1sL3N0b3A/cGF0aD0iICsgZGlzcGxheVBhdGgpOworICAgICAgICAgICAgICAgIGFyZ3NbM10gPSBhcHBzU3RvcDsKKyAgICAgICAgICAgICAgICBhcmdzWzRdID0gcmVzcG9uc2UuZW5jb2RlVVJMCisgICAgICAgICAgICAgICAgICAgIChyZXF1ZXN0LmdldENvbnRleHRQYXRoKCkgKworICAgICAgICAgICAgICAgICAgICAgIi9odG1sL3JlbG9hZD9wYXRoPSIgKyBkaXNwbGF5UGF0aCk7CisgICAgICAgICAgICAgICAgYXJnc1s1XSA9IGFwcHNSZWxvYWQ7CisgICAgICAgICAgICAgICAgYXJnc1s2XSA9IHJlc3BvbnNlLmVuY29kZVVSTAorICAgICAgICAgICAgICAgICAgICAocmVxdWVzdC5nZXRDb250ZXh0UGF0aCgpICsKKyAgICAgICAgICAgICAgICAgICAgICIvaHRtbC91bmRlcGxveT9wYXRoPSIgKyBkaXNwbGF5UGF0aCk7CisgICAgICAgICAgICAgICAgYXJnc1s3XSA9IGFwcHNVbmRlcGxveTsKKyAgICAgICAgICAgICAgICBpZiAoY29udGV4dC5nZXRQYXRoKCkuZXF1YWxzKHRoaXMuY29udGV4dC5nZXRQYXRoKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5wcmludChNZXNzYWdlRm9ybWF0LmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIE1BTkFHRVJfQVBQX1JPV19CVVRUT05fU0VDVElPTiwgYXJncykpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29udGV4dC5nZXRBdmFpbGFibGUoKSkgeworICAgICAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQoTWVzc2FnZUZvcm1hdC5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICBTVEFSVEVEX0FQUFNfUk9XX0JVVFRPTl9TRUNUSU9OLCBhcmdzKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgU1RPUFBFRF9BUFBTX1JPV19CVVRUT05fU0VDVElPTiwgYXJncykpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gRGVwbG95IFNlY3Rpb24KKyAgICAgICAgYXJncyA9IG5ldyBPYmplY3RbN107CisgICAgICAgIGFyZ3NbMF0gPSBzbS5nZXRTdHJpbmcoImh0bWxNYW5hZ2VyU2VydmxldC5kZXBsb3lUaXRsZSIpOworICAgICAgICBhcmdzWzFdID0gc20uZ2V0U3RyaW5nKCJodG1sTWFuYWdlclNlcnZsZXQuZGVwbG95U2VydmVyIik7CisgICAgICAgIGFyZ3NbMl0gPSByZXNwb25zZS5lbmNvZGVVUkwocmVxdWVzdC5nZXRDb250ZXh0UGF0aCgpICsgIi9odG1sL2RlcGxveSIpOworICAgICAgICBhcmdzWzNdID0gc20uZ2V0U3RyaW5nKCJodG1sTWFuYWdlclNlcnZsZXQuZGVwbG95UGF0aCIpOworICAgICAgICBhcmdzWzRdID0gc20uZ2V0U3RyaW5nKCJodG1sTWFuYWdlclNlcnZsZXQuZGVwbG95Q29uZmlnIik7CisgICAgICAgIGFyZ3NbNV0gPSBzbS5nZXRTdHJpbmcoImh0bWxNYW5hZ2VyU2VydmxldC5kZXBsb3lXYXIiKTsKKyAgICAgICAgYXJnc1s2XSA9IHNtLmdldFN0cmluZygiaHRtbE1hbmFnZXJTZXJ2bGV0LmRlcGxveUJ1dHRvbiIpOworICAgICAgICB3cml0ZXIucHJpbnQoTWVzc2FnZUZvcm1hdC5mb3JtYXQoREVQTE9ZX1NFQ1RJT04sIGFyZ3MpKTsKKworICAgICAgICBhcmdzID0gbmV3IE9iamVjdFs0XTsKKyAgICAgICAgYXJnc1swXSA9IHNtLmdldFN0cmluZygiaHRtbE1hbmFnZXJTZXJ2bGV0LmRlcGxveVVwbG9hZCIpOworICAgICAgICBhcmdzWzFdID0gcmVzcG9uc2UuZW5jb2RlVVJMKHJlcXVlc3QuZ2V0Q29udGV4dFBhdGgoKSArICIvaHRtbC91cGxvYWQiKTsKKyAgICAgICAgYXJnc1syXSA9IHNtLmdldFN0cmluZygiaHRtbE1hbmFnZXJTZXJ2bGV0LmRlcGxveVVwbG9hZEZpbGUiKTsKKyAgICAgICAgYXJnc1szXSA9IHNtLmdldFN0cmluZygiaHRtbE1hbmFnZXJTZXJ2bGV0LmRlcGxveUJ1dHRvbiIpOworICAgICAgICB3cml0ZXIucHJpbnQoTWVzc2FnZUZvcm1hdC5mb3JtYXQoVVBMT0FEX1NFQ1RJT04sIGFyZ3MpKTsKKworICAgICAgICAvLyBTZXJ2ZXIgSGVhZGVyIFNlY3Rpb24KKyAgICAgICAgYXJncyA9IG5ldyBPYmplY3RbN107CisgICAgICAgIGFyZ3NbMF0gPSBzbS5nZXRTdHJpbmcoImh0bWxNYW5hZ2VyU2VydmxldC5zZXJ2ZXJUaXRsZSIpOworICAgICAgICBhcmdzWzFdID0gc20uZ2V0U3RyaW5nKCJodG1sTWFuYWdlclNlcnZsZXQuc2VydmVyVmVyc2lvbiIpOworICAgICAgICBhcmdzWzJdID0gc20uZ2V0U3RyaW5nKCJodG1sTWFuYWdlclNlcnZsZXQuc2VydmVySlZNVmVyc2lvbiIpOworICAgICAgICBhcmdzWzNdID0gc20uZ2V0U3RyaW5nKCJodG1sTWFuYWdlclNlcnZsZXQuc2VydmVySlZNVmVuZG9yIik7CisgICAgICAgIGFyZ3NbNF0gPSBzbS5nZXRTdHJpbmcoImh0bWxNYW5hZ2VyU2VydmxldC5zZXJ2ZXJPU05hbWUiKTsKKyAgICAgICAgYXJnc1s1XSA9IHNtLmdldFN0cmluZygiaHRtbE1hbmFnZXJTZXJ2bGV0LnNlcnZlck9TVmVyc2lvbiIpOworICAgICAgICBhcmdzWzZdID0gc20uZ2V0U3RyaW5nKCJodG1sTWFuYWdlclNlcnZsZXQuc2VydmVyT1NBcmNoIik7CisgICAgICAgIHdyaXRlci5wcmludChNZXNzYWdlRm9ybWF0LmZvcm1hdAorICAgICAgICAgICAgICAgICAgICAgKENvbnN0YW50cy5TRVJWRVJfSEVBREVSX1NFQ1RJT04sIGFyZ3MpKTsKKworICAgICAgICAvLyBTZXJ2ZXIgUm93IFNlY3Rpb24KKyAgICAgICAgYXJncyA9IG5ldyBPYmplY3RbNl07CisgICAgICAgIGFyZ3NbMF0gPSBTZXJ2ZXJJbmZvLmdldFNlcnZlckluZm8oKTsKKyAgICAgICAgYXJnc1sxXSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5ydW50aW1lLnZlcnNpb24iKTsKKyAgICAgICAgYXJnc1syXSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS52bS52ZW5kb3IiKTsKKyAgICAgICAgYXJnc1szXSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MubmFtZSIpOworICAgICAgICBhcmdzWzRdID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcy52ZXJzaW9uIik7CisgICAgICAgIGFyZ3NbNV0gPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLmFyY2giKTsKKyAgICAgICAgd3JpdGVyLnByaW50KE1lc3NhZ2VGb3JtYXQuZm9ybWF0KENvbnN0YW50cy5TRVJWRVJfUk9XX1NFQ1RJT04sIGFyZ3MpKTsKKworICAgICAgICAvLyBIVE1MIFRhaWwgU2VjdGlvbgorICAgICAgICB3cml0ZXIucHJpbnQoQ29uc3RhbnRzLkhUTUxfVEFJTF9TRUNUSU9OKTsKKworICAgICAgICAvLyBGaW5pc2ggdXAgdGhlIHJlc3BvbnNlCisgICAgICAgIHdyaXRlci5mbHVzaCgpOworICAgICAgICB3cml0ZXIuY2xvc2UoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWxvYWQgdGhlIHdlYiBhcHBsaWNhdGlvbiBhdCB0aGUgc3BlY2lmaWVkIGNvbnRleHQgcGF0aC4KKyAgICAgKgorICAgICAqIEBzZWUgTWFuYWdlclNlcnZsZXQjcmVsb2FkKFByaW50V3JpdGVyLCBTdHJpbmcpCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0aCBDb250ZXh0IHBhdGggb2YgdGhlIGFwcGxpY2F0aW9uIHRvIGJlIHJlc3RhcnRlZAorICAgICAqIEByZXR1cm4gbWVzc2FnZSBTdHJpbmcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHJlbG9hZChTdHJpbmcgcGF0aCkgeworCisgICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIFByaW50V3JpdGVyIHByaW50V3JpdGVyID0gbmV3IFByaW50V3JpdGVyKHN0cmluZ1dyaXRlcik7CisKKyAgICAgICAgc3VwZXIucmVsb2FkKHByaW50V3JpdGVyLCBwYXRoKTsKKworICAgICAgICByZXR1cm4gc3RyaW5nV3JpdGVyLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVW5kZXBsb3kgdGhlIHdlYiBhcHBsaWNhdGlvbiBhdCB0aGUgc3BlY2lmaWVkIGNvbnRleHQgcGF0aC4KKyAgICAgKgorICAgICAqIEBzZWUgTWFuYWdlclNlcnZsZXQjdW5kZXBsb3koUHJpbnRXcml0ZXIsIFN0cmluZykKKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXRoIENvbnRleHQgcGF0aCBvZiB0aGUgYXBwbGljYXRpb24gdG8gYmUgdW5kZXBsb3lkCisgICAgICogQHJldHVybiBtZXNzYWdlIFN0cmluZworICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgdW5kZXBsb3koU3RyaW5nIHBhdGgpIHsKKworICAgICAgICBTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBQcmludFdyaXRlciBwcmludFdyaXRlciA9IG5ldyBQcmludFdyaXRlcihzdHJpbmdXcml0ZXIpOworCisgICAgICAgIHN1cGVyLnVuZGVwbG95KHByaW50V3JpdGVyLCBwYXRoKTsKKworICAgICAgICByZXR1cm4gc3RyaW5nV3JpdGVyLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGlzcGxheSBzZXNzaW9uIGluZm9ybWF0aW9uIGFuZCBpbnZva2UgbGlzdC4KKyAgICAgKgorICAgICAqIEBzZWUgTWFuYWdlclNlcnZsZXQjc2Vzc2lvbnMoUHJpbnRXcml0ZXIsIFN0cmluZykKKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXRoIENvbnRleHQgcGF0aCBvZiB0aGUgYXBwbGljYXRpb24gdG8gbGlzdCBzZXNzaW9uIGluZm9ybWF0aW9uCisgICAgICogQHJldHVybiBtZXNzYWdlIFN0cmluZworICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgc2Vzc2lvbnMoU3RyaW5nIHBhdGgpIHsKKworICAgICAgICBTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBQcmludFdyaXRlciBwcmludFdyaXRlciA9IG5ldyBQcmludFdyaXRlcihzdHJpbmdXcml0ZXIpOworCisgICAgICAgIHN1cGVyLnNlc3Npb25zKHByaW50V3JpdGVyLCBwYXRoKTsKKworICAgICAgICByZXR1cm4gc3RyaW5nV3JpdGVyLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnQgdGhlIHdlYiBhcHBsaWNhdGlvbiBhdCB0aGUgc3BlY2lmaWVkIGNvbnRleHQgcGF0aC4KKyAgICAgKgorICAgICAqIEBzZWUgTWFuYWdlclNlcnZsZXQjc3RhcnQoUHJpbnRXcml0ZXIsIFN0cmluZykKKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXRoIENvbnRleHQgcGF0aCBvZiB0aGUgYXBwbGljYXRpb24gdG8gYmUgc3RhcnRlZAorICAgICAqIEByZXR1cm4gbWVzc2FnZSBTdHJpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHN0YXJ0KFN0cmluZyBwYXRoKSB7CisKKyAgICAgICAgU3RyaW5nV3JpdGVyIHN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgUHJpbnRXcml0ZXIgcHJpbnRXcml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIoc3RyaW5nV3JpdGVyKTsKKworICAgICAgICBzdXBlci5zdGFydChwcmludFdyaXRlciwgcGF0aCk7CisKKyAgICAgICAgcmV0dXJuIHN0cmluZ1dyaXRlci50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0b3AgdGhlIHdlYiBhcHBsaWNhdGlvbiBhdCB0aGUgc3BlY2lmaWVkIGNvbnRleHQgcGF0aC4KKyAgICAgKgorICAgICAqIEBzZWUgTWFuYWdlclNlcnZsZXQjc3RvcChQcmludFdyaXRlciwgU3RyaW5nKQorICAgICAqCisgICAgICogQHBhcmFtIHBhdGggQ29udGV4dCBwYXRoIG9mIHRoZSBhcHBsaWNhdGlvbiB0byBiZSBzdG9wcGVkCisgICAgICogQHJldHVybiBtZXNzYWdlIFN0cmluZworICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgc3RvcChTdHJpbmcgcGF0aCkgeworCisgICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIFByaW50V3JpdGVyIHByaW50V3JpdGVyID0gbmV3IFByaW50V3JpdGVyKHN0cmluZ1dyaXRlcik7CisKKyAgICAgICAgc3VwZXIuc3RvcChwcmludFdyaXRlciwgcGF0aCk7CisKKyAgICAgICAgcmV0dXJuIHN0cmluZ1dyaXRlci50b1N0cmluZygpOworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcml2YXRlIENvbnN0YW50cworCisgICAgLy8gVGhlc2UgSFRNTCBzZWN0aW9ucyBhcmUgYnJva2VuIGluIHJlbGF0aXZlbHkgc21hbGwgc2VjdGlvbnMsIGJlY2F1c2Ugb2YKKyAgICAvLyBsaW1pdGVkIG51bWJlciBvZiBzdWJzaXR1dGlvbnMgTWVzc2FnZUZvcm1hdCBjYW4gcHJvY2VzcworICAgIC8vIChtYXhpbWl1bSBvZiAxMCkuCisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQU19IRUFERVJfU0VDVElPTiA9CisgICAgICAgICI8dGFibGUgYm9yZGVyPVwiMVwiIGNlbGxzcGFjaW5nPVwiMFwiIGNlbGxwYWRkaW5nPVwiM1wiPlxuIiArCisgICAgICAgICI8dHI+XG4iICsKKyAgICAgICAgIiA8dGQgY29sc3Bhbj1cIjVcIiBjbGFzcz1cInRpdGxlXCI+ezB9PC90ZD5cbiIgKworICAgICAgICAiPC90cj5cbiIgKworICAgICAgICAiPHRyPlxuIiArCisgICAgICAgICIgPHRkIGNsYXNzPVwiaGVhZGVyLWxlZnRcIj48c21hbGw+ezF9PC9zbWFsbD48L3RkPlxuIiArCisgICAgICAgICIgPHRkIGNsYXNzPVwiaGVhZGVyLWxlZnRcIj48c21hbGw+ezJ9PC9zbWFsbD48L3RkPlxuIiArCisgICAgICAgICIgPHRkIGNsYXNzPVwiaGVhZGVyLWNlbnRlclwiPjxzbWFsbD57M308L3NtYWxsPjwvdGQ+XG4iICsKKyAgICAgICAgIiA8dGQgY2xhc3M9XCJoZWFkZXItY2VudGVyXCI+PHNtYWxsPns0fTwvc21hbGw+PC90ZD5cbiIgKworICAgICAgICAiIDx0ZCBjbGFzcz1cImhlYWRlci1jZW50ZXJcIj48c21hbGw+ezV9PC9zbWFsbD48L3RkPlxuIiArCisgICAgICAgICI8L3RyPlxuIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBTX1JPV19ERVRBSUxTX1NFQ1RJT04gPQorICAgICAgICAiPHRyPlxuIiArCisgICAgICAgICIgPHRkIGNsYXNzPVwicm93LWxlZnRcIj48c21hbGw+PGEgaHJlZj1cInswfVwiPnswfTwvYT4iICsKKyAgICAgICAgIjwvc21hbGw+PC90ZD5cbiIgKworICAgICAgICAiIDx0ZCBjbGFzcz1cInJvdy1sZWZ0XCI+PHNtYWxsPnsxfTwvc21hbGw+PC90ZD5cbiIgKworICAgICAgICAiIDx0ZCBjbGFzcz1cInJvdy1jZW50ZXJcIj48c21hbGw+ezJ9PC9zbWFsbD48L3RkPlxuIiArCisgICAgICAgICIgPHRkIGNsYXNzPVwicm93LWNlbnRlclwiPiIgKworICAgICAgICAiPHNtYWxsPjxhIGhyZWY9XCJ7M31cIj57NH08L2E+PC9zbWFsbD48L3RkPlxuIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNQU5BR0VSX0FQUF9ST1dfQlVUVE9OX1NFQ1RJT04gPQorICAgICAgICAiIDx0ZCBjbGFzcz1cInJvdy1sZWZ0XCI+XG4iICsKKyAgICAgICAgIiAgPHNtYWxsPlxuIiArCisgICAgICAgICIgICZuYnNwO3sxfSZuYnNwO1xuIiArCisgICAgICAgICIgICZuYnNwO3szfSZuYnNwO1xuIiArCisgICAgICAgICIgICZuYnNwO3s1fSZuYnNwO1xuIiArCisgICAgICAgICIgICZuYnNwO3s3fSZuYnNwO1xuIiArCisgICAgICAgICIgIDwvc21hbGw+XG4iICsKKyAgICAgICAgIiA8L3RkPlxuIiArCisgICAgICAgICI8L3RyPlxuIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFSVEVEX0FQUFNfUk9XX0JVVFRPTl9TRUNUSU9OID0KKyAgICAgICAgIiA8dGQgY2xhc3M9XCJyb3ctbGVmdFwiPlxuIiArCisgICAgICAgICIgIDxzbWFsbD5cbiIgKworICAgICAgICAiICAmbmJzcDt7MX0mbmJzcDtcbiIgKworICAgICAgICAiICAmbmJzcDs8YSBocmVmPVwiezJ9XCIgb25jbGljaz1cInJldHVybihjb25maXJtKCcnQXJlIHlvdSBzdXJlPycnKSlcIj57M308L2E+Jm5ic3A7XG4iICsKKyAgICAgICAgIiAgJm5ic3A7PGEgaHJlZj1cIns0fVwiIG9uY2xpY2s9XCJyZXR1cm4oY29uZmlybSgnJ0FyZSB5b3Ugc3VyZT8nJykpXCI+ezV9PC9hPiZuYnNwO1xuIiArCisgICAgICAgICIgICZuYnNwOzxhIGhyZWY9XCJ7Nn1cIiBvbmNsaWNrPVwicmV0dXJuKGNvbmZpcm0oJydBcmUgeW91IHN1cmU/JycpKVwiPns3fTwvYT4mbmJzcDtcbiIgKworICAgICAgICAiICA8L3NtYWxsPlxuIiArCisgICAgICAgICIgPC90ZD5cbiIgKworICAgICAgICAiPC90cj5cbiI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RPUFBFRF9BUFBTX1JPV19CVVRUT05fU0VDVElPTiA9CisgICAgICAgICIgPHRkIGNsYXNzPVwicm93LWxlZnRcIj5cbiIgKworICAgICAgICAiICA8c21hbGw+XG4iICsKKyAgICAgICAgIiAgJm5ic3A7PGEgaHJlZj1cInswfVwiIG9uY2xpY2s9XCJyZXR1cm4oY29uZmlybSgnJ0FyZSB5b3Ugc3VyZT8nJykpXCI+ezF9PC9hPiZuYnNwO1xuIiArCisgICAgICAgICIgICZuYnNwO3szfSZuYnNwO1xuIiArCisgICAgICAgICIgICZuYnNwO3s1fSZuYnNwO1xuIiArCisgICAgICAgICIgICZuYnNwOzxhIGhyZWY9XCJ7Nn1cIiBvbmNsaWNrPVwicmV0dXJuKGNvbmZpcm0oJydBcmUgeW91IHN1cmU/JycpKVwiPns3fTwvYT4mbmJzcDtcbiIgKworICAgICAgICAiICA8L3NtYWxsPlxuIiArCisgICAgICAgICIgPC90ZD5cbiIgKworICAgICAgICAiPC90cj5cbiI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVQTE9ZX1NFQ1RJT04gPQorICAgICAgICAiPC90YWJsZT5cbiIgKworICAgICAgICAiPGJyPlxuIiArCisgICAgICAgICI8dGFibGUgYm9yZGVyPVwiMVwiIGNlbGxzcGFjaW5nPVwiMFwiIGNlbGxwYWRkaW5nPVwiM1wiPlxuIiArCisgICAgICAgICI8dHI+XG4iICsKKyAgICAgICAgIiA8dGQgY29sc3Bhbj1cIjJcIiBjbGFzcz1cInRpdGxlXCI+ezB9PC90ZD5cbiIgKworICAgICAgICAiPC90cj5cbiIgKworICAgICAgICAiPHRyPlxuIiArCisgICAgICAgICIgPHRkIGNvbHNwYW49XCIyXCIgY2xhc3M9XCJoZWFkZXItbGVmdFwiPjxzbWFsbD57MX08L3NtYWxsPjwvdGQ+XG4iICsKKyAgICAgICAgIjwvdHI+XG4iICsKKyAgICAgICAgIjx0cj5cbiIgKworICAgICAgICAiIDx0ZCBjb2xzcGFuPVwiMlwiPlxuIiArCisgICAgICAgICI8Zm9ybSBtZXRob2Q9XCJnZXRcIiBhY3Rpb249XCJ7Mn1cIj5cbiIgKworICAgICAgICAiPHRhYmxlIGNlbGxzcGFjaW5nPVwiMFwiIGNlbGxwYWRkaW5nPVwiM1wiPlxuIiArCisgICAgICAgICI8dHI+XG4iICsKKyAgICAgICAgIiA8dGQgY2xhc3M9XCJyb3ctcmlnaHRcIj5cbiIgKworICAgICAgICAiICA8c21hbGw+ezN9PC9zbWFsbD5cbiIgKworICAgICAgICAiIDwvdGQ+XG4iICsKKyAgICAgICAgIiA8dGQgY2xhc3M9XCJyb3ctbGVmdFwiPlxuIiArCisgICAgICAgICIgIDxpbnB1dCB0eXBlPVwidGV4dFwiIG5hbWU9XCJkZXBsb3lQYXRoXCIgc2l6ZT1cIjIwXCI+XG4iICsKKyAgICAgICAgIiA8L3RkPlxuIiArCisgICAgICAgICI8L3RyPlxuIiArCisgICAgICAgICI8dHI+XG4iICsKKyAgICAgICAgIiA8dGQgY2xhc3M9XCJyb3ctcmlnaHRcIj5cbiIgKworICAgICAgICAiICA8c21hbGw+ezR9PC9zbWFsbD5cbiIgKworICAgICAgICAiIDwvdGQ+XG4iICsKKyAgICAgICAgIiA8dGQgY2xhc3M9XCJyb3ctbGVmdFwiPlxuIiArCisgICAgICAgICIgIDxpbnB1dCB0eXBlPVwidGV4dFwiIG5hbWU9XCJkZXBsb3lDb25maWdcIiBzaXplPVwiMjBcIj5cbiIgKworICAgICAgICAiIDwvdGQ+XG4iICsKKyAgICAgICAgIjwvdHI+XG4iICsKKyAgICAgICAgIjx0cj5cbiIgKworICAgICAgICAiIDx0ZCBjbGFzcz1cInJvdy1yaWdodFwiPlxuIiArCisgICAgICAgICIgIDxzbWFsbD57NX08L3NtYWxsPlxuIiArCisgICAgICAgICIgPC90ZD5cbiIgKworICAgICAgICAiIDx0ZCBjbGFzcz1cInJvdy1sZWZ0XCI+XG4iICsKKyAgICAgICAgIiAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbmFtZT1cImRlcGxveVdhclwiIHNpemU9XCI0MFwiPlxuIiArCisgICAgICAgICIgPC90ZD5cbiIgKworICAgICAgICAiPC90cj5cbiIgKworICAgICAgICAiPHRyPlxuIiArCisgICAgICAgICIgPHRkIGNsYXNzPVwicm93LXJpZ2h0XCI+XG4iICsKKyAgICAgICAgIiAgJm5ic3A7XG4iICsKKyAgICAgICAgIiA8L3RkPlxuIiArCisgICAgICAgICIgPHRkIGNsYXNzPVwicm93LWxlZnRcIj5cbiIgKworICAgICAgICAiICA8aW5wdXQgdHlwZT1cInN1Ym1pdFwiIHZhbHVlPVwiezZ9XCI+XG4iICsKKyAgICAgICAgIiA8L3RkPlxuIiArCisgICAgICAgICI8L3RyPlxuIiArCisgICAgICAgICI8L3RhYmxlPlxuIiArCisgICAgICAgICI8L2Zvcm0+XG4iICsKKyAgICAgICAgIjwvdGQ+XG4iICsKKyAgICAgICAgIjwvdHI+XG4iOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVQTE9BRF9TRUNUSU9OID0KKyAgICAgICAgIjx0cj5cbiIgKworICAgICAgICAiIDx0ZCBjb2xzcGFuPVwiMlwiIGNsYXNzPVwiaGVhZGVyLWxlZnRcIj48c21hbGw+ezB9PC9zbWFsbD48L3RkPlxuIiArCisgICAgICAgICI8L3RyPlxuIiArCisgICAgICAgICI8dHI+XG4iICsKKyAgICAgICAgIiA8dGQgY29sc3Bhbj1cIjJcIj5cbiIgKworICAgICAgICAiPGZvcm0gYWN0aW9uPVwiezF9XCIgbWV0aG9kPVwicG9zdFwiICIgKworICAgICAgICAiZW5jdHlwZT1cIm11bHRpcGFydC9mb3JtLWRhdGFcIj5cbiIgKworICAgICAgICAiPHRhYmxlIGNlbGxzcGFjaW5nPVwiMFwiIGNlbGxwYWRkaW5nPVwiM1wiPlxuIiArCisgICAgICAgICI8dHI+XG4iICsKKyAgICAgICAgIiA8dGQgY2xhc3M9XCJyb3ctcmlnaHRcIj5cbiIgKworICAgICAgICAiICA8c21hbGw+ezJ9PC9zbWFsbD5cbiIgKworICAgICAgICAiIDwvdGQ+XG4iICsKKyAgICAgICAgIiA8dGQgY2xhc3M9XCJyb3ctbGVmdFwiPlxuIiArCisgICAgICAgICIgIDxpbnB1dCB0eXBlPVwiZmlsZVwiIG5hbWU9XCJkZXBsb3lXYXJcIiBzaXplPVwiNDBcIj5cbiIgKworICAgICAgICAiIDwvdGQ+XG4iICsKKyAgICAgICAgIjwvdHI+XG4iICsKKyAgICAgICAgIjx0cj5cbiIgKworICAgICAgICAiIDx0ZCBjbGFzcz1cInJvdy1yaWdodFwiPlxuIiArCisgICAgICAgICIgICZuYnNwO1xuIiArCisgICAgICAgICIgPC90ZD5cbiIgKworICAgICAgICAiIDx0ZCBjbGFzcz1cInJvdy1sZWZ0XCI+XG4iICsKKyAgICAgICAgIiAgPGlucHV0IHR5cGU9XCJzdWJtaXRcIiB2YWx1ZT1cInszfVwiPlxuIiArCisgICAgICAgICIgPC90ZD5cbiIgKworICAgICAgICAiPC90cj5cbiIgKworICAgICAgICAiPC90YWJsZT5cbiIgKworICAgICAgICAiPC9mb3JtPlxuIiArCisgICAgICAgICI8L3RhYmxlPlxuIiArCisgICAgICAgICI8YnI+XG4iICsKKyAgICAgICAgIlxuIjsKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvbWFuYWdlci9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS9jYXRhbGluYS9tYW5hZ2VyL0pNWFByb3h5U2VydmxldC5qYXZhIGIvY29udGFpbmVyL3dlYmFwcHMvbWFuYWdlci9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS9jYXRhbGluYS9tYW5hZ2VyL0pNWFByb3h5U2VydmxldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkMjY2NjgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9tYW5hZ2VyL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL2NhdGFsaW5hL21hbmFnZXIvSk1YUHJveHlTZXJ2bGV0LmphdmEKQEAgLTAsMCArMSwyMTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEubWFuYWdlcjsKKworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5JbmZvOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5BdHRyaWJ1dGVJbmZvOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuQXR0cmlidXRlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXQ7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubW9kZWxlci5SZWdpc3RyeTsKKworLyoqCisgKiBUaGlzIHNlcnZsZXQgd2lsbCBkdW1wIEpNWCBhdHRyaWJ1dGVzIGluIGEgc2ltcGxlIGZvcm1hdAorICogYW5kIGltcGxlbWVudCBwcm94eSBzZXJ2aWNlcyBmb3IgbW9kZWxlci4KKyAqCisgKiBAYXV0aG9yIENvc3RpbiBNYW5vbGFjaGUKKyAqLworcHVibGljIGNsYXNzIEpNWFByb3h5U2VydmxldCBleHRlbmRzIEh0dHBTZXJ2bGV0ICB7CisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKyAgICAvKioKKyAgICAgKiBNQmVhbiBzZXJ2ZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIE1CZWFuU2VydmVyIG1CZWFuU2VydmVyID0gbnVsbDsKKyAgICBwcm90ZWN0ZWQgUmVnaXN0cnkgcmVnaXN0cnk7CisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemUgdGhpcyBzZXJ2bGV0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGluaXQoKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIFJldHJpZXZlIHRoZSBNQmVhbiBzZXJ2ZXIKKyAgICAgICAgcmVnaXN0cnkgPSBSZWdpc3RyeS5nZXRSZWdpc3RyeShudWxsLCBudWxsKTsKKyAgICAgICAgbUJlYW5TZXJ2ZXIgPSBSZWdpc3RyeS5nZXRSZWdpc3RyeShudWxsLCBudWxsKS5nZXRNQmVhblNlcnZlcigpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUHJvY2VzcyBhIEdFVCByZXF1ZXN0IGZvciB0aGUgc3BlY2lmaWVkIHJlc291cmNlLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgc2VydmxldCByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQtc3BlY2lmaWVkIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbgorICAgIHsKKworICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9wbGFpbiIpOworCisgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworICAgICAgICBTdHJpbmcgcXJ5U3RyaW5nPSByZXF1ZXN0LmdldFF1ZXJ5U3RyaW5nKCk7CisKKyAgICAgICAgaWYoIG1CZWFuU2VydmVyPT1udWxsICkgeworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIkVycm9yIC0gTm8gbWJlYW4gc2VydmVyIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgcXJ5PXJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJzZXQiKTsKKyAgICAgICAgaWYoIHFyeSE9IG51bGwgKSB7CisgICAgICAgICAgICBTdHJpbmcgbmFtZT1yZXF1ZXN0LmdldFBhcmFtZXRlcigiYXR0Iik7CisgICAgICAgICAgICBTdHJpbmcgdmFsPXJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJ2YWwiKTsKKworICAgICAgICAgICAgc2V0QXR0cmlidXRlKCB3cml0ZXIsIHFyeSwgbmFtZSwgdmFsICk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBxcnk9cmVxdWVzdC5nZXRQYXJhbWV0ZXIoInFyeSIpOworICAgICAgICBpZiggcXJ5ID09IG51bGwgKSB7CisgICAgICAgICAgICBxcnkgPSAiKjoqIjsKKyAgICAgICAgfQorCisgICAgICAgIGxpc3RCZWFucyggd3JpdGVyLCBxcnkgKTsKKworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZSggUHJpbnRXcml0ZXIgd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG9uYW1lU3RyLCBTdHJpbmcgYXR0LCBTdHJpbmcgdmFsICkKKyAgICB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBPYmplY3ROYW1lIG9uYW1lPW5ldyBPYmplY3ROYW1lKCBvbmFtZVN0ciApOworICAgICAgICAgICAgU3RyaW5nIHR5cGU9cmVnaXN0cnkuZ2V0VHlwZShvbmFtZSwgYXR0KTsKKyAgICAgICAgICAgIE9iamVjdCB2YWx1ZU9iaj1yZWdpc3RyeS5jb252ZXJ0VmFsdWUodHlwZSwgdmFsICk7CisgICAgICAgICAgICBtQmVhblNlcnZlci5zZXRBdHRyaWJ1dGUoIG9uYW1lLCBuZXcgQXR0cmlidXRlKGF0dCwgdmFsdWVPYmopKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJPSyAtIEF0dHJpYnV0ZSBzZXQiKTsKKyAgICAgICAgfSBjYXRjaCggRXhjZXB0aW9uIGV4ICkgeworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIkVycm9yIC0gIiArIGV4LnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbGlzdEJlYW5zKCBQcmludFdyaXRlciB3cml0ZXIsIFN0cmluZyBxcnkgKQorICAgIHsKKworICAgICAgICBTZXQgbmFtZXMgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmFtZXM9bUJlYW5TZXJ2ZXIucXVlcnlOYW1lcyhuZXcgT2JqZWN0TmFtZShxcnkpLCBudWxsKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJPSyAtIE51bWJlciBvZiByZXN1bHRzOiAiICsgbmFtZXMuc2l6ZSgpKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiRXJyb3IgLSAiICsgZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIEl0ZXJhdG9yIGl0PW5hbWVzLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlKCBpdC5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIE9iamVjdE5hbWUgb25hbWU9KE9iamVjdE5hbWUpaXQubmV4dCgpOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oICJOYW1lOiAiICsgb25hbWUudG9TdHJpbmcoKSk7CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgTUJlYW5JbmZvIG1pbmZvPW1CZWFuU2VydmVyLmdldE1CZWFuSW5mbyhvbmFtZSk7CisgICAgICAgICAgICAgICAgLy8gY2FuJ3QgYmUgbnVsbCAtIEkgdGhpbmwKKyAgICAgICAgICAgICAgICBTdHJpbmcgY29kZT1taW5mby5nZXRDbGFzc05hbWUoKTsKKyAgICAgICAgICAgICAgICBpZiAoIm9yZy5hcGFjaGUuY29tbW9ucy5tb2RlbGVyLkJhc2VNb2RlbE1CZWFuIi5lcXVhbHMoY29kZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29kZT0oU3RyaW5nKW1CZWFuU2VydmVyLmdldEF0dHJpYnV0ZShvbmFtZSwgIm1vZGVsZXJUeXBlIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCJtb2RlbGVyVHlwZTogIiArIGNvZGUpOworCisgICAgICAgICAgICAgICAgTUJlYW5BdHRyaWJ1dGVJbmZvIGF0dHJzW109bWluZm8uZ2V0QXR0cmlidXRlcygpOworICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZT1udWxsOworCisgICAgICAgICAgICAgICAgZm9yKCBpbnQgaT0wOyBpPCBhdHRycy5sZW5ndGg7IGkrKyApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoICEgYXR0cnNbaV0uaXNSZWFkYWJsZSgpICkgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIGlmKCAhIGlzU3VwcG9ydGVkKCBhdHRyc1tpXS5nZXRUeXBlKCkgKSkgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhdHROYW1lPWF0dHJzW2ldLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoIGF0dE5hbWUuaW5kZXhPZiggIj0iKSA+PTAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHROYW1lLmluZGV4T2YoICI6IikgPj0wIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0TmFtZS5pbmRleE9mKCAiICIpID49MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPW1CZWFuU2VydmVyLmdldEF0dHJpYnV0ZShvbmFtZSwgYXR0TmFtZSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2goIFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIGdldHRpbmcgYXR0cmlidXRlICIgKyBvbmFtZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIiArIGF0dE5hbWUgKyAiICIgKyB0LnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYoIHZhbHVlPT1udWxsICkgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIGlmKCAibW9kZWxlclR5cGUiLmVxdWFscyggYXR0TmFtZSkpIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWVTdHJpbmc9dmFsdWUudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIGF0dE5hbWUgKyAiOiAiICsgZXNjYXBlKHZhbHVlU3RyaW5nKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBJZ25vcmUKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZXNjYXBlKFN0cmluZyB2YWx1ZSkgeworICAgICAgICAvLyBUaGUgb25seSBpbnZhbGlkIGNoYXIgaXMgXG4KKyAgICAgICAgLy8gV2UgYWxzbyBuZWVkIHRvIGtlZXAgdGhlIHN0cmluZyBzaG9ydCBhbmQgc3BsaXQgaXQgd2l0aCBcblNQQUNFCisgICAgICAgIC8vIFhYWCBUT0RPCisgICAgICAgIGludCBpZHg9dmFsdWUuaW5kZXhPZiggIlxuIiApOworICAgICAgICBpZiggaWR4IDwgMCApIHJldHVybiB2YWx1ZTsKKworICAgICAgICBpbnQgcHJldj0wOworICAgICAgICBTdHJpbmdCdWZmZXIgc2I9bmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICB3aGlsZSggaWR4ID49IDAgKSB7CisgICAgICAgICAgICBhcHBlbmRIZWFkKHNiLCB2YWx1ZSwgcHJldiwgaWR4LTEpOworCisgICAgICAgICAgICBzYi5hcHBlbmQoICJcXG5cbiAiKTsKKyAgICAgICAgICAgIHByZXY9aWR4KzE7CisgICAgICAgICAgICBpZiggaWR4PT12YWx1ZS5sZW5ndGgoKSAtMSApIGJyZWFrOworICAgICAgICAgICAgaWR4PXZhbHVlLmluZGV4T2YoJ1xuJywgaWR4KzEpOworICAgICAgICB9CisgICAgICAgIGlmKCBwcmV2IDwgdmFsdWUubGVuZ3RoKCkgKQorICAgICAgICAgICAgYXBwZW5kSGVhZCggc2IsIHZhbHVlLCBwcmV2LCB2YWx1ZS5sZW5ndGgoKSk7CisgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhcHBlbmRIZWFkKCBTdHJpbmdCdWZmZXIgc2IsIFN0cmluZyB2YWx1ZSwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7CisgICAgICAgIGludCBwb3M9c3RhcnQ7CisgICAgICAgIHdoaWxlKCBlbmQtcG9zID4gNzggKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIHZhbHVlLnN1YnN0cmluZyhwb3MsIHBvcys3OCkpOworICAgICAgICAgICAgc2IuYXBwZW5kKCAiXG4gIik7CisgICAgICAgICAgICBwb3M9cG9zKzc4OworICAgICAgICB9CisgICAgICAgIHNiLmFwcGVuZCggdmFsdWUuc3Vic3RyaW5nKHBvcyxlbmQpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1N1cHBvcnRlZCggU3RyaW5nIHR5cGUgKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL21hbmFnZXIvV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvY2F0YWxpbmEvbWFuYWdlci9Mb2NhbFN0cmluZ3MucHJvcGVydGllcyBiL2NvbnRhaW5lci93ZWJhcHBzL21hbmFnZXIvV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvY2F0YWxpbmEvbWFuYWdlci9Mb2NhbFN0cmluZ3MucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTk2NWI1Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvbWFuYWdlci9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS9jYXRhbGluYS9tYW5hZ2VyL0xvY2FsU3RyaW5ncy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsODAgQEAKK2h0bWxNYW5hZ2VyU2VydmxldC5hcHBzQXZhaWxhYmxlPVJ1bm5pbmcKK2h0bWxNYW5hZ2VyU2VydmxldC5hcHBzTmFtZT1EaXNwbGF5IE5hbWUKK2h0bWxNYW5hZ2VyU2VydmxldC5hcHBzUGF0aD1QYXRoCitodG1sTWFuYWdlclNlcnZsZXQuYXBwc1JlbG9hZD1SZWxvYWQKK2h0bWxNYW5hZ2VyU2VydmxldC5hcHBzVW5kZXBsb3k9VW5kZXBsb3kKK2h0bWxNYW5hZ2VyU2VydmxldC5hcHBzU2Vzc2lvbnM9U2Vzc2lvbnMKK2h0bWxNYW5hZ2VyU2VydmxldC5hcHBzU3RhcnQ9U3RhcnQKK2h0bWxNYW5hZ2VyU2VydmxldC5hcHBzU3RvcD1TdG9wCitodG1sTWFuYWdlclNlcnZsZXQuYXBwc1Rhc2tzPUNvbW1hbmRzCitodG1sTWFuYWdlclNlcnZsZXQuYXBwc1RpdGxlPUFwcGxpY2F0aW9ucworaHRtbE1hbmFnZXJTZXJ2bGV0LmhlbHBIdG1sTWFuYWdlcj1IVE1MIE1hbmFnZXIgSGVscAoraHRtbE1hbmFnZXJTZXJ2bGV0LmhlbHBIdG1sTWFuYWdlckZpbGU9aHRtbC1tYW5hZ2VyLWhvd3RvLmh0bWwKK2h0bWxNYW5hZ2VyU2VydmxldC5oZWxwTWFuYWdlcj1NYW5hZ2VyIEhlbHAKK2h0bWxNYW5hZ2VyU2VydmxldC5oZWxwTWFuYWdlckZpbGU9bWFuYWdlci1ob3d0by5odG1sCitodG1sTWFuYWdlclNlcnZsZXQuZGVwbG95QnV0dG9uPURlcGxveQoraHRtbE1hbmFnZXJTZXJ2bGV0LmRlcGxveUNvbmZpZz1YTUwgQ29uZmlndXJhdGlvbiBmaWxlIFVSTDoKK2h0bWxNYW5hZ2VyU2VydmxldC5kZXBsb3lQYXRoPUNvbnRleHQgUGF0aCAob3B0aW9uYWwpOgoraHRtbE1hbmFnZXJTZXJ2bGV0LmRlcGxveVNlcnZlcj1EZXBsb3kgZGlyZWN0b3J5IG9yIFdBUiBmaWxlIGxvY2F0ZWQgb24gc2VydmVyCitodG1sTWFuYWdlclNlcnZsZXQuZGVwbG95VGl0bGU9RGVwbG95CitodG1sTWFuYWdlclNlcnZsZXQuZGVwbG95VXBsb2FkPVdBUiBmaWxlIHRvIGRlcGxveQoraHRtbE1hbmFnZXJTZXJ2bGV0LmRlcGxveVVwbG9hZEZhaWw9RkFJTCAtIERlcGxveSBVcGxvYWQgRmFpbGVkLCBFeGNlcHRpb246IHswfQoraHRtbE1hbmFnZXJTZXJ2bGV0LmRlcGxveVVwbG9hZEZpbGU9U2VsZWN0IFdBUiBmaWxlIHRvIHVwbG9hZAoraHRtbE1hbmFnZXJTZXJ2bGV0LmRlcGxveVVwbG9hZE5vdFdhcj1GQUlMIC0gRmlsZSB1cGxvYWRlZCBcInswfVwiIG11c3QgYmUgYSAud2FyCitodG1sTWFuYWdlclNlcnZsZXQuZGVwbG95VXBsb2FkTm9GaWxlPUZBSUwgLSBGaWxlIHVwbG9hZCBmYWlsZWQsIG5vIGZpbGUKK2h0bWxNYW5hZ2VyU2VydmxldC5kZXBsb3lVcGxvYWRXYXJFeGlzdHM9RkFJTCAtIFdhciBmaWxlIFwiezB9XCIgYWxyZWFkeSBleGlzdHMgb24gc2VydmVyCitodG1sTWFuYWdlclNlcnZsZXQuZGVwbG95V2FyPVdBUiBvciBEaXJlY3RvcnkgVVJMOgoraHRtbE1hbmFnZXJTZXJ2bGV0Lmxpc3Q9TGlzdCBBcHBsaWNhdGlvbnMKK2h0bWxNYW5hZ2VyU2VydmxldC5tYW5hZ2VyPU1hbmFnZXIKK2h0bWxNYW5hZ2VyU2VydmxldC5tZXNzYWdlTGFiZWw9TWVzc2FnZToKK2h0bWxNYW5hZ2VyU2VydmxldC5zZXJ2ZXJKVk1WZW5kb3I9SlZNIFZlbmRvcgoraHRtbE1hbmFnZXJTZXJ2bGV0LnNlcnZlckpWTVZlcnNpb249SlZNIFZlcnNpb24KK2h0bWxNYW5hZ2VyU2VydmxldC5zZXJ2ZXJPU0FyY2g9T1MgQXJjaGl0ZWN0dXJlCitodG1sTWFuYWdlclNlcnZsZXQuc2VydmVyT1NOYW1lPU9TIE5hbWUKK2h0bWxNYW5hZ2VyU2VydmxldC5zZXJ2ZXJPU1ZlcnNpb249T1MgVmVyc2lvbgoraHRtbE1hbmFnZXJTZXJ2bGV0LnNlcnZlclRpdGxlPVNlcnZlciBJbmZvcm1hdGlvbgoraHRtbE1hbmFnZXJTZXJ2bGV0LnNlcnZlclZlcnNpb249VG9tY2F0IFZlcnNpb24KK2h0bWxNYW5hZ2VyU2VydmxldC50aXRsZT1Ub21jYXQgV2ViIEFwcGxpY2F0aW9uIE1hbmFnZXIKK21hbmFnZXJTZXJ2bGV0LmFscmVhZHlDb250ZXh0PUZBSUwgLSBBcHBsaWNhdGlvbiBhbHJlYWR5IGV4aXN0cyBhdCBwYXRoIHswfQorbWFuYWdlclNlcnZsZXQuYWxyZWFkeURvY0Jhc2U9RkFJTCAtIERpcmVjdG9yeSB7MH0gaXMgYWxyZWFkeSBpbiB1c2UKK21hbmFnZXJTZXJ2bGV0LmNhbm5vdEludm9rZT1DYW5ub3QgaW52b2tlIG1hbmFnZXIgc2VydmxldCB0aHJvdWdoIGludm9rZXIKK21hbmFnZXJTZXJ2bGV0LmNvbmZpZ3VyZWQ9T0sgLSBEZXBsb3llZCBhcHBsaWNhdGlvbiBmcm9tIGNvbnRleHQgZmlsZSB7MH0KK21hbmFnZXJTZXJ2bGV0LmRlcGxveWVkPU9LIC0gRGVwbG95ZWQgYXBwbGljYXRpb24gYXQgY29udGV4dCBwYXRoIHswfQorbWFuYWdlclNlcnZsZXQuZXhjZXB0aW9uPUZBSUwgLSBFbmNvdW50ZXJlZCBleGNlcHRpb24gezB9CittYW5hZ2VyU2VydmxldC5kZXBsb3llZD1PSyAtIERlcGxveWVkIGFwcGxpY2F0aW9uIGF0IGNvbnRleHQgcGF0aCB7MH0KK21hbmFnZXJTZXJ2bGV0LmludmFsaWRQYXRoPUZBSUwgLSBJbnZhbGlkIGNvbnRleHQgcGF0aCB7MH0gd2FzIHNwZWNpZmllZAorbWFuYWdlclNlcnZsZXQuaW52YWxpZFdhcj1GQUlMIC0gSW52YWxpZCBhcHBsaWNhdGlvbiBVUkwgezB9IHdhcyBzcGVjaWZpZWQKK21hbmFnZXJTZXJ2bGV0Lmxpc3RlZD1PSyAtIExpc3RlZCBhcHBsaWNhdGlvbnMgZm9yIHZpcnR1YWwgaG9zdCB7MH0KK21hbmFnZXJTZXJ2bGV0Lmxpc3RpdGVtPXswfTp7MX06ezJ9OnszfQorbWFuYWdlclNlcnZsZXQubm9BcHBCYXNlPUZBSUwgLSBDYW5ub3QgaWRlbnRpZnkgYXBwbGljYXRpb24gYmFzZSBmb3IgY29udGV4dCBwYXRoIHswfQorbWFuYWdlclNlcnZsZXQubm9Db21tYW5kPUZBSUwgLSBObyBjb21tYW5kIHdhcyBzcGVjaWZpZWQKK21hbmFnZXJTZXJ2bGV0Lm5vQ29udGV4dD1GQUlMIC0gTm8gY29udGV4dCBleGlzdHMgZm9yIHBhdGggezB9CittYW5hZ2VyU2VydmxldC5ub0RpcmVjdG9yeT1GQUlMIC0gTm9uLWRpcmVjdG9yeSBkb2N1bWVudCBiYXNlIGZvciBwYXRoIHswfQorbWFuYWdlclNlcnZsZXQubm9Eb2NCYXNlPUZBSUwgLSBDYW5ub3QgdW5kZXBsb3kgZG9jdW1lbnQgYmFzZSBmb3IgcGF0aCB7MH0KK21hbmFnZXJTZXJ2bGV0Lm5vR2xvYmFsPUZBSUwgLSBObyBnbG9iYWwgSk5ESSByZXNvdXJjZXMgYXJlIGF2YWlsYWJsZQorbWFuYWdlclNlcnZsZXQubm9SZWxvYWQ9RkFJTCAtIFJlbG9hZCBub3Qgc3VwcG9ydGVkIG9uIFdBUiBkZXBsb3llZCBhdCBwYXRoIHswfQorbWFuYWdlclNlcnZsZXQubm9SZW5hbWU9RkFJTCAtIENhbm5vdCBkZXBsb3kgdXBsb2FkZWQgV0FSIGZvciBwYXRoIHswfQorbWFuYWdlclNlcnZsZXQubm9Sb2xlPUZBSUwgLSBVc2VyIGRvZXMgbm90IHBvc3Nlc3Mgcm9sZSB7MH0KK21hbmFnZXJTZXJ2bGV0Lm5vU2VsZj1GQUlMIC0gVGhlIG1hbmFnZXIgY2FuIG5vdCByZWxvYWQsIHVuZGVwbG95LCBzdG9wLCBvciB1bmRlcGxveSBpdHNlbGYKK21hbmFnZXJTZXJ2bGV0Lm5vV3JhcHBlcj1Db250YWluZXIgaGFzIG5vdCBjYWxsZWQgc2V0V3JhcHBlcigpIGZvciB0aGlzIHNlcnZsZXQKK21hbmFnZXJTZXJ2bGV0LnJlbG9hZGVkPU9LIC0gUmVsb2FkZWQgYXBwbGljYXRpb24gYXQgY29udGV4dCBwYXRoIHswfQorbWFuYWdlclNlcnZsZXQudW5kZXBsb3lkPU9LIC0gVW5kZXBsb3llZCBhcHBsaWNhdGlvbiBhdCBjb250ZXh0IHBhdGggezB9CittYW5hZ2VyU2VydmxldC5yZXNvdXJjZXNBbGw9T0sgLSBMaXN0ZWQgZ2xvYmFsIHJlc291cmNlcyBvZiBhbGwgdHlwZXMKK21hbmFnZXJTZXJ2bGV0LnJlc291cmNlc1R5cGU9T0sgLSBMaXN0ZWQgZ2xvYmFsIHJlc291cmNlcyBvZiB0eXBlIHswfQorbWFuYWdlclNlcnZsZXQucm9sZXNMaXN0PU9LIC0gTGlzdGVkIHNlY3VyaXR5IHJvbGVzCittYW5hZ2VyU2VydmxldC5zYXZlRmFpbD1GQUlMIC0gQ29uZmlndXJhdGlvbiBzYXZlIGZhaWxlZDogezB9CittYW5hZ2VyU2VydmxldC5zYXZlZD1PSyAtIFNlcnZlciBjb25maWd1cmF0aW9uIHNhdmVkCittYW5hZ2VyU2VydmxldC5zYXZlZENvbnRleHQ9T0sgLSBDb250ZXh0IHswfSBjb25maWd1cmF0aW9uIHNhdmVkCittYW5hZ2VyU2VydmxldC5zZXNzaW9uZGVmYXVsdG1heD1EZWZhdWx0IG1heGltdW0gc2Vzc2lvbiBpbmFjdGl2ZSBpbnRlcnZhbCB7MH0gbWludXRlcworbWFuYWdlclNlcnZsZXQuc2Vzc2lvbnRpbWVvdXQ9ezB9IG1pbnV0ZXM6ezF9IHNlc3Npb25zCittYW5hZ2VyU2VydmxldC5zZXNzaW9ucz1PSyAtIFNlc3Npb24gaW5mb3JtYXRpb24gZm9yIGFwcGxpY2F0aW9uIGF0IGNvbnRleHQgcGF0aCB7MH0KK21hbmFnZXJTZXJ2bGV0LnN0YXJ0ZWQ9T0sgLSBTdGFydGVkIGFwcGxpY2F0aW9uIGF0IGNvbnRleHQgcGF0aCB7MH0KK21hbmFnZXJTZXJ2bGV0LnN0YXJ0RmFpbGVkPUZBSUwgLSBBcHBsaWNhdGlvbiBhdCBjb250ZXh0IHBhdGggezB9IGNvdWxkIG5vdCBiZSBzdGFydGVkCittYW5hZ2VyU2VydmxldC5zdG9wcGVkPU9LIC0gU3RvcHBlZCBhcHBsaWNhdGlvbiBhdCBjb250ZXh0IHBhdGggezB9CittYW5hZ2VyU2VydmxldC51bmRlcGxveWVkPU9LIC0gVW5kZXBsb3llZCBhcHBsaWNhdGlvbiBhdCBjb250ZXh0IHBhdGggezB9CittYW5hZ2VyU2VydmxldC51bmtub3duQ29tbWFuZD1GQUlMIC0gVW5rbm93biBjb21tYW5kIHswfQorbWFuYWdlclNlcnZsZXQudXNlckRhdGFiYXNlRXJyb3I9RkFJTCAtIENhbm5vdCByZXNvbHZlIHVzZXIgZGF0YWJhc2UgcmVmZXJlbmNlCittYW5hZ2VyU2VydmxldC51c2VyRGF0YWJhc2VNaXNzaW5nPUZBSUwgLSBObyB1c2VyIGRhdGFiYXNlIGlzIGF2YWlsYWJsZQorCitzdGF0dXNTZXJ2bGV0LnRpdGxlPVNlcnZlciBTdGF0dXMKK3N0YXR1c1NlcnZsZXQuY29tcGxldGU9Q29tcGxldGUgU2VydmVyIFN0YXR1cwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvbWFuYWdlci9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS9jYXRhbGluYS9tYW5hZ2VyL0xvY2FsU3RyaW5nc19kZS5wcm9wZXJ0aWVzIGIvY29udGFpbmVyL3dlYmFwcHMvbWFuYWdlci9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS9jYXRhbGluYS9tYW5hZ2VyL0xvY2FsU3RyaW5nc19kZS5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwYWRhNDAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9tYW5hZ2VyL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL2NhdGFsaW5hL21hbmFnZXIvTG9jYWxTdHJpbmdzX2RlLnByb3BlcnRpZXMKQEAgLTAsMCArMSw3OCBAQAoraHRtbE1hbmFnZXJTZXJ2bGV0LmFwcHNBdmFpbGFibGU9VmVyZvxnYmFyCitodG1sTWFuYWdlclNlcnZsZXQuYXBwc05hbWU9QW56ZWlnZW5hbWUKK2h0bWxNYW5hZ2VyU2VydmxldC5hcHBzUGF0aD1Lb250ZXh0IFBmYWQKK2h0bWxNYW5hZ2VyU2VydmxldC5hcHBzUmVsb2FkPU5ldSBsYWRlbgoraHRtbE1hbmFnZXJTZXJ2bGV0LmFwcHNVbmRlcGxveT1FbnRmZXJuZW4KK2h0bWxNYW5hZ2VyU2VydmxldC5hcHBzU2Vzc2lvbnM9U2l0enVuZ2VuCitodG1sTWFuYWdlclNlcnZsZXQuYXBwc1N0YXJ0PVN0YXJ0CitodG1sTWFuYWdlclNlcnZsZXQuYXBwc1N0b3A9U3RvcAoraHRtbE1hbmFnZXJTZXJ2bGV0LmFwcHNUYXNrcz1Lb21tYW5kb3MKK2h0bWxNYW5hZ2VyU2VydmxldC5hcHBzVGl0bGU9QW53ZW5kdW5nZW4KK2h0bWxNYW5hZ2VyU2VydmxldC5oZWxwSHRtbE1hbmFnZXI9SGlsZmVzZWl0ZSBIVE1MIE1hbmFnZXIgKGVuZ2xpc2NoKQoraHRtbE1hbmFnZXJTZXJ2bGV0LmhlbHBIdG1sTWFuYWdlckZpbGU9aHRtbC1tYW5hZ2VyLWhvd3RvLmh0bWwKK2h0bWxNYW5hZ2VyU2VydmxldC5oZWxwTWFuYWdlcj1IaWxmZXNlaXRlIE1hbmFnZXIgKGVuZ2xpc2NoKQoraHRtbE1hbmFnZXJTZXJ2bGV0LmhlbHBNYW5hZ2VyRmlsZT1tYW5hZ2VyLWhvd3RvLmh0bWwKK2h0bWxNYW5hZ2VyU2VydmxldC5kZXBsb3lCdXR0b249SW5zdGFsbGllcmVuCitodG1sTWFuYWdlclNlcnZsZXQuZGVwbG95Q29uZmlnPVhNTCBLb25maWd1cmF0aW9uc2RhdGVpIFVSTDoKK2h0bWxNYW5hZ2VyU2VydmxldC5kZXBsb3lQYXRoPUtvbnRleHQgUGZhZCAob3B0aW9uYWwpOgoraHRtbE1hbmFnZXJTZXJ2bGV0LmRlcGxveVNlcnZlcj1WZXJ6ZWljaG5pcyBvZGVyIFdBUiBEYXRlaSBhdWYgU2VydmVyIGluc3RhbGxpZXJlbgoraHRtbE1hbmFnZXJTZXJ2bGV0LmRlcGxveVRpdGxlPUluc3RhbGxpZXJlbgoraHRtbE1hbmFnZXJTZXJ2bGV0LmRlcGxveVVwbG9hZD1Mb2thbGUgV0FSIERhdGVpIHp1ciBJbnN0YWxsYXRpb24gaG9jaGxhZGVuCitodG1sTWFuYWdlclNlcnZsZXQuZGVwbG95VXBsb2FkRmFpbD1GRUhMRVIgLSBIb2NobGFkZW4genVyIEluc3RhbGxhdGlvbiBmZWhsZ2VzY2hsYWdlbiwgQXVzbmFobWU6IHswfQoraHRtbE1hbmFnZXJTZXJ2bGV0LmRlcGxveVVwbG9hZEZpbGU9V0FSIERhdGVpIGF1c3fkaGxlbgoraHRtbE1hbmFnZXJTZXJ2bGV0LmRlcGxveVVwbG9hZE5vdFdhcj1GRUhMRVIgLSBIb2NoZ2VsYWRlbmUgRGF0ZWkgXCJ7MH1cIiBtdXNzIGVpbiAud2FyIHNlaW4KK2h0bWxNYW5hZ2VyU2VydmxldC5kZXBsb3lVcGxvYWROb0ZpbGU9RkVITEVSIC0gSG9jaGxhZGVuIGZlaGxnZXNjaGxhZ2VuLCBrZWluZSBEYXRlaSB2b3JoYW5kZW4KK2h0bWxNYW5hZ2VyU2VydmxldC5kZXBsb3lVcGxvYWRXYXJFeGlzdHM9RkVITEVSIC0gV0FSIERhdGVpIFwiezB9XCIgZXhpc3RpZXJ0IGJlcmVpdHMgYXVmIFNlcnZlcgoraHRtbE1hbmFnZXJTZXJ2bGV0LmRlcGxveVdhcj1XQVIgb2RlciBWZXJ6ZWljaG5pcyBVUkw6CitodG1sTWFuYWdlclNlcnZsZXQubGlzdD1BbndlbmR1bmdlbiBhdWZsaXN0ZW4KK2h0bWxNYW5hZ2VyU2VydmxldC5tYW5hZ2VyPU1hbmFnZXIKK2h0bWxNYW5hZ2VyU2VydmxldC5tZXNzYWdlTGFiZWw9TmFjaHJpY2h0OgoraHRtbE1hbmFnZXJTZXJ2bGV0LnNlcnZlckpWTVZlbmRvcj1KVk0gSGVyc3RlbGxlcgoraHRtbE1hbmFnZXJTZXJ2bGV0LnNlcnZlckpWTVZlcnNpb249SlZNIFZlcnNpb24KK2h0bWxNYW5hZ2VyU2VydmxldC5zZXJ2ZXJPU0FyY2g9T1MgQXJjaGl0ZWt0dXIKK2h0bWxNYW5hZ2VyU2VydmxldC5zZXJ2ZXJPU05hbWU9T1MgTmFtZQoraHRtbE1hbmFnZXJTZXJ2bGV0LnNlcnZlck9TVmVyc2lvbj1PUyBWZXJzaW9uCitodG1sTWFuYWdlclNlcnZsZXQuc2VydmVyVGl0bGU9U2VydmVyIEluZm9ybWF0aW9uZW4KK2h0bWxNYW5hZ2VyU2VydmxldC5zZXJ2ZXJWZXJzaW9uPVRvbWNhdCBWZXJzaW9uCitodG1sTWFuYWdlclNlcnZsZXQudGl0bGU9VG9tY2F0IFdlYmFud2VuZHVuZ3MtTWFuYWdlcgorbWFuYWdlclNlcnZsZXQuYWxyZWFkeUNvbnRleHQ9RkVITEVSIC0gQW53ZW5kdW5nIGV4aXN0aWVydCBiZXJlaXRzIGb8ciBLb250ZXh0IFBmYWQgezB9CittYW5hZ2VyU2VydmxldC5hbHJlYWR5RG9jQmFzZT1GRUhMRVIgLSBWZXJ6ZWljaG5pcyB7MH0gYmVyZWl0cyBpbiBCZW51dHp1bmcKK21hbmFnZXJTZXJ2bGV0LmNhbm5vdEludm9rZT1LYW5uIE1hbmFnZXItU2VydmxldCBuaWNodCBkdXJjaCBJbnZva2VyIGF1ZnJ1ZmVuCittYW5hZ2VyU2VydmxldC5jb25maWd1cmVkPU9LIC0gQW53ZW5kdW5nIHZvbiBLb250ZXh0LURhdGVpIHswfSBpbnN0YWxsaWVydAorbWFuYWdlclNlcnZsZXQuZGVwbG95ZWQ9T0sgLSBBbndlbmR1bmcgbWl0IEtvbnRleHQgUGZhZCB7MH0gaW5zdGFsbGllcnQKK21hbmFnZXJTZXJ2bGV0LmV4Y2VwdGlvbj1GRUhMRVIgLSBBdXNuYWhtZSBhdWZnZXRyZXRlbiB7MH0KK21hbmFnZXJTZXJ2bGV0LmRlcGxveWVkPU9LIC0gQW53ZW5kdW5nIG1pdCBLb250ZXh0IFBmYWQgezB9IGluc3RhbGxpZXJ0CittYW5hZ2VyU2VydmxldC5pbnZhbGlkUGF0aD1GRUhMRVIgLSBVbmf8bHRpZ2VyIEtvbnRleHQgUGZhZCB7MH0gYW5nZWdlYmVuCittYW5hZ2VyU2VydmxldC5pbnZhbGlkV2FyPUZFSExFUiAtIFVuZ/xsdGlnZSBVUkwgezB9IGb8ciBBbndlbmR1bmcgYW5nZWdlYmVuCittYW5hZ2VyU2VydmxldC5saXN0ZWQ9T0sgLSBBdWZsaXN0dW5nIGRlciBXZWJhbndlbmR1bmdlbiBm/HIgdmlydHVlbGxlbiBTZXJ2ZXIgezB9CittYW5hZ2VyU2VydmxldC5saXN0aXRlbT17MH06ezF9OnsyfTp7M30KK21hbmFnZXJTZXJ2bGV0Lm5vQXBwQmFzZT1GRUhMRVIgLSBLYW5uIFZlcnplaWNobmlzIGb8ciBLb250ZXh0IFBmYWQgezB9IG5pY2h0IGZpbmRlbgorbWFuYWdlclNlcnZsZXQubm9Db21tYW5kPUZFSExFUiAtIEVzIHd1cmRlIGtlaW4gS29tbWFuZG8gYW5nZWdlYmVuCittYW5hZ2VyU2VydmxldC5ub0NvbnRleHQ9RkVITEVSIC0gRXMgZXhpc3RpZXJ0IGtlaW4gS29udGV4dCBm/HIgUGZhZCB7MH0KK21hbmFnZXJTZXJ2bGV0Lm5vRGlyZWN0b3J5PUZFSExFUiAtIFBmYWQgezB9IGlzdCBrZWluIFZlcnplaWNobmlzCittYW5hZ2VyU2VydmxldC5ub0RvY0Jhc2U9RkVITEVSIC0gS2FubiBXZWJhbndlbmR1bmdzLVZlcnplaWNobmlzIG5pY2h0IGVudGZlcm5lbiBm/HIgS29udGV4dCBQZmFkIHswfQorbWFuYWdlclNlcnZsZXQubm9HbG9iYWw9RkVITEVSIC0gS2VpbmUgZ2xvYmFsZW4gSk5ESSBSZXNzb3VyY2VuIHZlcmb8Z2JhcgorbWFuYWdlclNlcnZsZXQubm9SZWxvYWQ9RkVITEVSIC0gTmV1IGxhZGVuIG5pY2h0IHVudGVyc3T8dHp0IGb8ciBXQVIgbWl0IFBmYWQgezB9CittYW5hZ2VyU2VydmxldC5ub1JlbmFtZT1GRUhMRVIgLSBLYW5uIGhvY2hnZWxhZGVuZXMgV0FSIG1pdCBQZmFkIHswfSBuaWNodCBpbnN0YWxsaWVyZW4KK21hbmFnZXJTZXJ2bGV0Lm5vUm9sZT1GRUhMRVIgLSBCZW51dHplciBuaWNodCBpbiBSb2xsZSB7MH0KK21hbmFnZXJTZXJ2bGV0Lm5vU2VsZj1GRUhMRVIgLSBNYW5hZ2VyLUtvbW1hbmRvcyBr9m5uZW4gbmljaHQgYXVmIGRpZSBNYW5hZ2VyLUFud2VuZHVuZyBzZWxic3QgYW5nZXdlbmRldCB3ZXJkZW4KK21hbmFnZXJTZXJ2bGV0Lm5vV3JhcHBlcj1Db250YWluZXIgaGF0IHNldFdyYXBwZXIoKSBm/HIgZGllc2VzIFNlcnZsZXQgbmljaHQgYXVmZ2VydWZlbgorbWFuYWdlclNlcnZsZXQucmVsb2FkZWQ9T0sgLSBBbndlbmR1bmcgbWl0IEtvbnRleHQgUGZhZCB7MH0gbmV1IGdlbGFkZW4KK21hbmFnZXJTZXJ2bGV0LnVuZGVwbG95ZD1PSyAtIEFud2VuZHVuZyBtaXQgS29udGV4dCBQZmFkIHswfSBlbnRmZXJudAorbWFuYWdlclNlcnZsZXQucmVzb3VyY2VzQWxsPU9LIC0gQXVmbGlzdHVuZyBnbG9iYWxlciBSZXNzb3VyY2VuIChhbGxlIFR5cGVuKQorbWFuYWdlclNlcnZsZXQucmVzb3VyY2VzVHlwZT1PSyAtIEF1Zmxpc3R1bmcgZ2xvYmFsZXIgUmVzc291cmNlbiB2b24gVHlwIHswfQorbWFuYWdlclNlcnZsZXQucm9sZXNMaXN0PU9LIC0gQXVmbGlzdHVuZyBkZXIgU2ljaGVyaGVpdHMtUm9sbGVuCittYW5hZ2VyU2VydmxldC5zYXZlRmFpbD1GRUhMRVIgLSBTcGVpY2hlcm4gZGVyIEtvbmZpZ3VyYXRpb24gZmVobGdlc2NobGFnZW46IHswfQorbWFuYWdlclNlcnZsZXQuc2Vzc2lvbmRlZmF1bHRtYXg9Vm9yZWluZ2VzdGVsbHRlciBTaXR6dW5nc2FibGF1ZiBuYWNoIG1heGltYWwgezB9IE1pbnV0ZW4gSW5ha3Rpdml05HQKK21hbmFnZXJTZXJ2bGV0LnNlc3Npb250aW1lb3V0PXswfSBNaW51dGVuOiB7MX0gU2l0enVuZ2VuCittYW5hZ2VyU2VydmxldC5zZXNzaW9ucz1PSyAtIFNpdHp1bmdzLUluZm9ybWF0aW9uZW4gZvxyIEFud2VuZHVuZyBtaXQgS29udGV4dCBQZmFkIHswfQorbWFuYWdlclNlcnZsZXQuc3RhcnRlZD1PSyAtIEFud2VuZHVuZyBtaXQgS29udGV4dCBQZmFkIHswfSBnZXN0YXJ0ZXQKK21hbmFnZXJTZXJ2bGV0LnN0YXJ0RmFpbGVkPUZFSExFUiAtIEFud2VuZHVuZyBtaXQgS29udGV4dCBQZmFkIHswfSBrb25udGUgbmljaHQgZ2VzdGFydGV0IHdlcmRlbgorbWFuYWdlclNlcnZsZXQuc3RvcHBlZD1PSyAtIEFud2VuZHVuZyBtaXQgS29udGV4dCBQZmFkIHswfSBnZXN0b3BwdAorbWFuYWdlclNlcnZsZXQudW5kZXBsb3llZD1PSyAtIEFud2VuZHVuZyBtaXQgS29udGV4dCBQZmFkIHswfSBlbnRmZXJudAorbWFuYWdlclNlcnZsZXQudW5rbm93bkNvbW1hbmQ9RkVITEVSIC0gVW5iZWthbm50ZXMgS29tbWFuZG8gezB9CittYW5hZ2VyU2VydmxldC51c2VyRGF0YWJhc2VFcnJvcj1GRUhMRVIgLSBLYW5uIFJlZmVyZW56IGF1ZiBCZW51dHplcmRhdGVuZGFuayBuaWNodCBhdWZs9nNlbgorbWFuYWdlclNlcnZsZXQudXNlckRhdGFiYXNlTWlzc2luZz1GRUhMRVIgLSBLZWluZSBCZW51dHplcmRhdGVuYmFuayB2b3JoYW5kZW4KKworc3RhdHVzU2VydmxldC50aXRsZT1TZXJ2ZXIgU3RhdHVzCitzdGF0dXNTZXJ2bGV0LmNvbXBsZXRlPUF1c2b8aHJsaWNoZXIgU2VydmVyIFN0YXR1cwpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvbWFuYWdlci9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS9jYXRhbGluYS9tYW5hZ2VyL0xvY2FsU3RyaW5nc19lcy5wcm9wZXJ0aWVzIGIvY29udGFpbmVyL3dlYmFwcHMvbWFuYWdlci9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS9jYXRhbGluYS9tYW5hZ2VyL0xvY2FsU3RyaW5nc19lcy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyYTJjMWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9tYW5hZ2VyL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL2NhdGFsaW5hL21hbmFnZXIvTG9jYWxTdHJpbmdzX2VzLnByb3BlcnRpZXMKQEAgLTAsMCArMSw4MCBAQAoraHRtbE1hbmFnZXJTZXJ2bGV0LmFwcHNBdmFpbGFibGU9RWplY3V04W5kb3NlCitodG1sTWFuYWdlclNlcnZsZXQuYXBwc05hbWU9Tm9tYnJlIGEgTW9zdHJhcgoraHRtbE1hbmFnZXJTZXJ2bGV0LmFwcHNQYXRoPVRyYXllY3RvcmlhCitodG1sTWFuYWdlclNlcnZsZXQuYXBwc1JlbG9hZD1SZWNhcmdhcgoraHRtbE1hbmFnZXJTZXJ2bGV0LmFwcHNVbmRlcGxveT1SZXBsZWdhcgoraHRtbE1hbmFnZXJTZXJ2bGV0LmFwcHNTZXNzaW9ucz1TZXNpb25lcworaHRtbE1hbmFnZXJTZXJ2bGV0LmFwcHNTdGFydD1BcnJhbmNhcgoraHRtbE1hbmFnZXJTZXJ2bGV0LmFwcHNTdG9wPVBhcmFyCitodG1sTWFuYWdlclNlcnZsZXQuYXBwc1Rhc2tzPUNvbWFuZG9zCitodG1sTWFuYWdlclNlcnZsZXQuYXBwc1RpdGxlPUFwbGljYWNpb25lcworaHRtbE1hbmFnZXJTZXJ2bGV0LmhlbHBIdG1sTWFuYWdlcj1BeXVkYSBIVE1MIGRlIEdlc3RvcgoraHRtbE1hbmFnZXJTZXJ2bGV0LmhlbHBIdG1sTWFuYWdlckZpbGU9aHRtbC1tYW5hZ2VyLWhvd3RvLmh0bWwKK2h0bWxNYW5hZ2VyU2VydmxldC5oZWxwTWFuYWdlcj1BeXVkYSBkZSBHZXN0b3IKK2h0bWxNYW5hZ2VyU2VydmxldC5oZWxwTWFuYWdlckZpbGU9bWFuYWdlci1ob3d0by5odG1sCitodG1sTWFuYWdlclNlcnZsZXQuZGVwbG95QnV0dG9uPURlc3BsZWdhcgoraHRtbE1hbmFnZXJTZXJ2bGV0LmRlcGxveUNvbmZpZz1VUkwgZGUgYXJjaGl2byBkZSBDb25maWd1cmFjafNuIFhNTDoKK2h0bWxNYW5hZ2VyU2VydmxldC5kZXBsb3lQYXRoPVRyYXllY3RvcmlhIGRlIENvbnRleHRvIChvcGNpb25hbCk6CitodG1sTWFuYWdlclNlcnZsZXQuZGVwbG95U2VydmVyPURlc3BsZWdhciBkaXJlY3RvcmlvIG8gYXJjaGl2byBXQVIgbG9jYWxpemFkbyBlbiBzZXJ2aWRvcgoraHRtbE1hbmFnZXJTZXJ2bGV0LmRlcGxveVRpdGxlPURlc3BsZWdhcgoraHRtbE1hbmFnZXJTZXJ2bGV0LmRlcGxveVVwbG9hZD1BcmNoaXZvIFdBUiBhIGRlc3BsZWdhcgoraHRtbE1hbmFnZXJTZXJ2bGV0LmRlcGxveVVwbG9hZEZhaWw9RkFMTE8gLSBGYWxs8yBDYXJnYSBkZSBEZXNwbGllZ3VlLCBFeGNlcGNp8246IHswfQoraHRtbE1hbmFnZXJTZXJ2bGV0LmRlcGxveVVwbG9hZEZpbGU9U2VsZWNjaW9uZSBhcmNoaXZvIFdBUiBhIGNhcmdhcgoraHRtbE1hbmFnZXJTZXJ2bGV0LmRlcGxveVVwbG9hZE5vdFdhcj1GQUxMTyAtIEVsIGFyY2hpdm8gY2FyZ2FkbyBcInswfVwiIGRlYmUgZGUgc2VyIHVuIC53YXIKK2h0bWxNYW5hZ2VyU2VydmxldC5kZXBsb3lVcGxvYWROb0ZpbGU9RkFMTE8gLSBGYWxs8yBsYSBjYXJnYSBkZSBhcmNoaXZvLCBubyBoYXkgYXJjaGl2bworaHRtbE1hbmFnZXJTZXJ2bGV0LmRlcGxveVVwbG9hZFdhckV4aXN0cz1GQUxMTyAtIEVsIGFyY2hpdm8gd2FyIFwiezB9XCIgeWEgZXhpc3RlIGVuIGVsIHNlcnZpZG9yCitodG1sTWFuYWdlclNlcnZsZXQuZGVwbG95V2FyPVVSTCBkZSBXQVIgbyBEaXJlY3RvcmlvOgoraHRtbE1hbmFnZXJTZXJ2bGV0Lmxpc3Q9TGlzdGFyIEFwbGljYWNpb25lcworaHRtbE1hbmFnZXJTZXJ2bGV0Lm1hbmFnZXI9R2VzdG9yCitodG1sTWFuYWdlclNlcnZsZXQubWVzc2FnZUxhYmVsPU1lbnNhamU6CitodG1sTWFuYWdlclNlcnZsZXQuc2VydmVySlZNVmVuZG9yPVZlbmRlZG9yIEpWTQoraHRtbE1hbmFnZXJTZXJ2bGV0LnNlcnZlckpWTVZlcnNpb249VmVyc2nzbiBKVk0KK2h0bWxNYW5hZ2VyU2VydmxldC5zZXJ2ZXJPU0FyY2g9QXJxdWl0ZWN0dXJhIGRlIFNPCitodG1sTWFuYWdlclNlcnZsZXQuc2VydmVyT1NOYW1lPU5vbWJyZSBkZSBTTworaHRtbE1hbmFnZXJTZXJ2bGV0LnNlcnZlck9TVmVyc2lvbj1WZXJzafNuIGRlIFNPCitodG1sTWFuYWdlclNlcnZsZXQuc2VydmVyVGl0bGU9SW5mb3JtYWNp824gZGUgU2Vydmlkb3IKK2h0bWxNYW5hZ2VyU2VydmxldC5zZXJ2ZXJWZXJzaW9uPVZlcnNp824gZGUgVG9tY2F0CitodG1sTWFuYWdlclNlcnZsZXQudGl0bGU9R2VzdG9yIGRlIEFwbGljYWNpb25lcyBXZWIgZGUgVG9tY2F0CittYW5hZ2VyU2VydmxldC5hbHJlYWR5Q29udGV4dD1GQUxMTyAtIFlhIGV4aXN0ZSBsYSBhcGxpY2FjafNuIGVuIGxhIHRyYXllY3RvcmlhIHswfQorbWFuYWdlclNlcnZsZXQuYWxyZWFkeURvY0Jhc2U9RkFMTE8gLSBEaXJlY3RvcmlvIHswfSB5YSBlc3ThIHNpZW5kbyB1c2FkbworbWFuYWdlclNlcnZsZXQuY2Fubm90SW52b2tlPU5vIHB1ZWRvIGludm9jYXIgc2VydmxldCBkZSBnZXN0b3IgYSB0cmF26XMgZGUgaW52b2NhZG9yCittYW5hZ2VyU2VydmxldC5jb25maWd1cmVkPU9LIC0gRGVzcGxlZ2FkYSBhcGxpY2FjafNuIGRlc2RlIGFyY2hpdm8gZGUgY29udGV4dG8gezB9CittYW5hZ2VyU2VydmxldC5kZXBsb3llZD1PSyAtIERlc3BsZWdhZGEgYXBsaWNhY2nzbiBlbiB0cmF5ZWN0b3JpYSBkZSBjb250ZXh0byB7MH0KK21hbmFnZXJTZXJ2bGV0LmV4Y2VwdGlvbj1GQUxMTyAtIEVuY29udHJhZGEgZXhjZXBjafNuIHswfQorbWFuYWdlclNlcnZsZXQuZGVwbG95ZWQ9T0sgLSBEZXNwbGVnYWRhIGFwbGljYWNp824gZW4gdHJheWVjdG9yaWEgZGUgY29udGV4dG8gezB9CittYW5hZ2VyU2VydmxldC5pbnZhbGlkUGF0aD1GQUxMTyAtIFNlIGhhIGVzcGVjaWZpY2FkbyB1bmEgdHJheWVjdG9yaWEgaW524WxpZGEgZGUgY29udGV4dG8gezB9CittYW5hZ2VyU2VydmxldC5pbnZhbGlkV2FyPUZBTExPIC0gU2UgaGEgZXNwZWNpZmljYWRvIHVuYSBVUkwgZGUgYXBsaWNhY2nzbiBpbnbhbGlkYSB7MH0KK21hbmFnZXJTZXJ2bGV0Lmxpc3RlZD1PSyAtIEFwbGljYWNpb25lcyBsaXN0YWRhcyBwYXJhIG3hcXVpbmRhIHZpcnV0YWwgezB9CittYW5hZ2VyU2VydmxldC5saXN0aXRlbT17MH06ezF9OnsyfTp7M30KK21hbmFnZXJTZXJ2bGV0Lm5vQXBwQmFzZT1GQUxMTyAtIE5vIHB1ZWRvIGlkZW50aWZpY2FyIGFwbGljYWNp824gYmFzZSBwYXJhIHRyYXllY3RvcmlhIGRlIGNvbnRleHRvIHswfQorbWFuYWdlclNlcnZsZXQubm9Db21tYW5kPUZBTExPIC0gTm8gc2UgaGEgZXNwZWNpZmljYWRvIGNvbWFuZG8KK21hbmFnZXJTZXJ2bGV0Lm5vQ29udGV4dD1GQUxMTyAtIE5vIGV4aXN0ZSBjb250ZXh0byBwYXJhIHRyYXllY3RvcmlhIHswfQorbWFuYWdlclNlcnZsZXQubm9EaXJlY3Rvcnk9RkFMTE8gLSBEb2N1bWVudG8gYmFzZSBOby1kaXJlY3RvcmlvIHBhcmEgdHJheWVjdG9yaWEgezB9CittYW5hZ2VyU2VydmxldC5ub0RvY0Jhc2U9RkFMTE8gLSBObyBwdWVkbyByZXBsZWdhciBkb2N1bWVudG8gYmFzZSBwYXJhIHRyYXllY3RvcmlhIHswfQorbWFuYWdlclNlcnZsZXQubm9HbG9iYWw9RkFMTE8gLSBObyBoYXkgZGlzcG9uaWJsZXMgcmVjdXJzb3MgZ2xvYmFsZXMgSk5ESSAKK21hbmFnZXJTZXJ2bGV0Lm5vUmVsb2FkPUZBTExPIC0gUmVjYXJnYSBubyBzb3BvcnRhZGEgZW4gV0FSIGRlc3BsZWdhZG8gZW4gdHJheWVjdG9yaWEgezB9CittYW5hZ2VyU2VydmxldC5ub1JlbmFtZT1GQUxMTyAtIE5vIHB1ZGVvIGRlc3BsZWdhciBXQVIgY2FyZ2FkbyBwYXJhIHRyYXllY3RvcmlhIHswfQorbWFuYWdlclNlcnZsZXQubm9Sb2xlPUZBTExPIC0gRWwgdXN1YXJpbyBubyBkZXNlbXBl8WEgZWwgcGFwZWwgZGUgezB9CittYW5hZ2VyU2VydmxldC5ub1NlbGY9RkFMTE8gLSBFbCBnZXN0b3Igbm8gcHVlZGUgcmVjYXJnYXJzZSwgcmVwbGVnYXJzZSwgcGFyYXJzZSBvIHJlcGxlZ2Fyc2UgYSBz7SBtaXNtbworbWFuYWdlclNlcnZsZXQubm9XcmFwcGVyPUVsIENvbnRlbmVkb3Igbm8gaGEgbGxhbWFkbyBhIHNldFdyYXBwZXIoKSBwYXJhIGVzdGUgc2VydmxldAorbWFuYWdlclNlcnZsZXQucmVsb2FkZWQ9T0sgLSBSZWNhcmdhZGEgYXBsaWNhY2nzbiBlbiB0cmF5ZWN0b3JpYSBkZSBjb250ZXh0byB7MH0KK21hbmFnZXJTZXJ2bGV0LnVuZGVwbG95ZD1PSyAtIFJlcGxlZ2FkYSBhcGxpY2FjafNuIGVuIHRyYXllY3RvcmlhIGRlIGNvbnRleHRvIHswfQorbWFuYWdlclNlcnZsZXQucmVzb3VyY2VzQWxsPU9LIC0gTGlzdGFkb3MgcmVjdXJzb3MgZ2xvYmFsZXMgZGUgdG9kb3MgbG9zIHRpcG9zCittYW5hZ2VyU2VydmxldC5yZXNvdXJjZXNUeXBlPU9LIC0gTGlzdGFkb3MgcmVjdXJzb3MgZ2xvYmFsZXMgZGUgdGlwbyB7MH0KK21hbmFnZXJTZXJ2bGV0LnJvbGVzTGlzdD1PSyAtIExpc3RhZG9zIHBhcGVsZXMgZGUgc2VndXJpZGFkCittYW5hZ2VyU2VydmxldC5zYXZlRmFpbD1GQUlMIC0gRmFsbG8gYWwgZ3VhcmRhciBsYSBjb25maWd1cmFjafNuOiB7MH0KK21hbmFnZXJTZXJ2bGV0LnNhdmVkPU9LIC0gQ29uZmlndXJhY2nzbiBkZSBTZXJ2aWRvciBndWFyZGFkYQorbWFuYWdlclNlcnZsZXQuc2F2ZWRDb250ZXh0PU9LIC0gQ29uZmlndXJhY2nzbiBkZSBDb250ZXh0byB7MH0gZ3VhcmRhZGEKK21hbmFnZXJTZXJ2bGV0LnNlc3Npb25kZWZhdWx0bWF4PUludGVydmFsbyBt4XhpbW8gcG9yIGRlZmVjdG8gZGUgc2VzafNuIGluYWN0aXZhIHswfSBtaW51dG9zCittYW5hZ2VyU2VydmxldC5zZXNzaW9udGltZW91dD17MH0gbWludXRvczogezF9IHNlc2lvbmVzCittYW5hZ2VyU2VydmxldC5zZXNzaW9ucz1PSyAtIEluZm9ybWFjafNuIGRlIHNlc2nzbiBwYXJhIGFwbGljYWNp824gZW4gdHJheWVjdG9yaWEgZGUgY29udGV4dG8gezB9CittYW5hZ2VyU2VydmxldC5zdGFydGVkPU9LIC0gQXJyYW5jYWRhIGFwbGljYWNp824gZW4gdHJheWVjdG9yaWEgZGUgY29udGV4dG8gezB9CittYW5hZ2VyU2VydmxldC5zdGFydEZhaWxlZD1GQUxMTyAtIE5vIHNlIHB1ZG8gYXJyYW5jYXIgbGEgYXBsaWNhY2nzbiBlbiB0cmF5ZWN0b3JpYSBkZSBjb250ZXh0byB7MH0KK21hbmFnZXJTZXJ2bGV0LnN0b3BwZWQ9T0sgLSBQYXJhZGEgYXBsaWNhY2nzbiBlbiB0cmF5ZWN0b3JpYSBkZSBjb250ZXh0byB7MH0KK21hbmFnZXJTZXJ2bGV0LnVuZGVwbG95ZWQ9T0sgLSBSZXBsZWdhZGEgYXBsaWNhY2FjafNuIGVuIHRyYXllY3RvcmlhIGRlIGNvbnRleHRvIHswfQorbWFuYWdlclNlcnZsZXQudW5rbm93bkNvbW1hbmQ9RkFMTE8gLSBDb21hbmRvIGRlc2Nvbm9jaWRvIHswfQorbWFuYWdlclNlcnZsZXQudXNlckRhdGFiYXNlRXJyb3I9RkFMTE8gLSBObyBwdWVkbyByZXNvbHZlciByZWZlcmVuY2lhIGRlIGJhc2UgZGUgZGF0b3MgZGUgdXN1YXJpbworbWFuYWdlclNlcnZsZXQudXNlckRhdGFiYXNlTWlzc2luZz1GQUxMTyAtIE5vIHNlIGVuY3VlbnRyYSBkaXNwb25pYmxlIGJhc2UgZGUgZGF0b3MgZGUgdXN1YXJpbworCitzdGF0dXNTZXJ2bGV0LnRpdGxlPUVzdGFkbyBkZSBTZXJ2aWRvcgorc3RhdHVzU2VydmxldC5jb21wbGV0ZT1Fc3RhZG8gQ29tcGxldG8gZGUgU2Vydmlkb3IKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL21hbmFnZXIvV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvY2F0YWxpbmEvbWFuYWdlci9Mb2NhbFN0cmluZ3NfZnIucHJvcGVydGllcyBiL2NvbnRhaW5lci93ZWJhcHBzL21hbmFnZXIvV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvY2F0YWxpbmEvbWFuYWdlci9Mb2NhbFN0cmluZ3NfZnIucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjJkYTUzCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvbWFuYWdlci9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS9jYXRhbGluYS9tYW5hZ2VyL0xvY2FsU3RyaW5nc19mci5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNjQgQEAKK2h0bWxNYW5hZ2VyU2VydmxldC5hcHBzQXZhaWxhYmxlPUZvbmN0aW9ubmFudAoraHRtbE1hbmFnZXJTZXJ2bGV0LmFwcHNOYW1lPU5vbSBkJydhZmZpY2hhZ2UKK2h0bWxNYW5hZ2VyU2VydmxldC5hcHBzUGF0aD1DaGVtaW4KK2h0bWxNYW5hZ2VyU2VydmxldC5hcHBzUmVsb2FkPVJlY2hhcmdlcgoraHRtbE1hbmFnZXJTZXJ2bGV0LmFwcHNSZW1vdmU9UmV0aXJlcgoraHRtbE1hbmFnZXJTZXJ2bGV0LmFwcHNTZXNzaW9ucz1TZXNzaW9ucworaHRtbE1hbmFnZXJTZXJ2bGV0LmFwcHNTdGFydD1E6W1hcnJlcgoraHRtbE1hbmFnZXJTZXJ2bGV0LmFwcHNTdG9wPUFycul0ZXIKK2h0bWxNYW5hZ2VyU2VydmxldC5hcHBzVGl0bGU9QXBwbGljYXRpb25zCitodG1sTWFuYWdlclNlcnZsZXQuaW5zdGFsbEJ1dHRvbj1JbnN0YWxsYXRpb24KK2h0bWxNYW5hZ2VyU2VydmxldC5pbnN0YWxsQ29uZmlnPVVSTCBkZSBjb25maWd1cmF0aW9uOgoraHRtbE1hbmFnZXJTZXJ2bGV0Lmluc3RhbGxQYXRoPUNoZW1pbjoKK2h0bWxNYW5hZ2VyU2VydmxldC5pbnN0YWxsVGl0bGU9SW5zdGFsbGF0aW9uCitodG1sTWFuYWdlclNlcnZsZXQuaW5zdGFsbFdhcj1VUkwgZHUgV0FSOgoraHRtbE1hbmFnZXJTZXJ2bGV0Lm1lc3NhZ2VMYWJlbD1NZXNzYWdlOgoraHRtbE1hbmFnZXJTZXJ2bGV0LnNlcnZlckpWTVZlbmRvcj1Gb3Vybmlzc2V1ciBkZSBsYSBKVk0KK2h0bWxNYW5hZ2VyU2VydmxldC5zZXJ2ZXJKVk1WZXJzaW9uPVZlcnNpb24gZGUgbGEgSlZNCitodG1sTWFuYWdlclNlcnZsZXQuc2VydmVyT1NBcmNoPUFyY2hpdGVjdHVyZSBkJydPUworaHRtbE1hbmFnZXJTZXJ2bGV0LnNlcnZlck9TTmFtZT1Ob20gZCcnT1MKK2h0bWxNYW5hZ2VyU2VydmxldC5zZXJ2ZXJPU1ZlcnNpb249VmVyc2lvbiBkJydPUworaHRtbE1hbmFnZXJTZXJ2bGV0LnNlcnZlclRpdGxlPVNlcnZldXIKK2h0bWxNYW5hZ2VyU2VydmxldC5zZXJ2ZXJWZXJzaW9uPVZlcnNpb24gZGUgc2VydmV1cgoraHRtbE1hbmFnZXJTZXJ2bGV0LnRpdGxlPUdlc3Rpb25uYWlyZSBkJydhcHBsaWNhdGlvbnMgV0VCIFRvbWNhdAorbWFuYWdlclNlcnZsZXQuYWxyZWFkeUNvbnRleHQ9RUNIRUMgLSBsJydhcHBsaWNhdGlvbiBleGlzdGUgZOlq4CBkYW5zIGxlIGNoZW1pbiB7MH0KK21hbmFnZXJTZXJ2bGV0LmFscmVhZHlEb2NCYXNlPUVDSEVDIC0gTGUgculwZXJ0b2lyZSB7MH0gZXN0IGTpauAgdXRpbGlz6QorbWFuYWdlclNlcnZsZXQuY2Fubm90SW52b2tlPUltcG9zc2libGUgZCd1dGlsaXNlciBsZSBnZXN0aW9ubmFpcmUgZGUgc2VydmxldCBhdSB0cmF2ZXJzIGR1IGTpbOlndekgKGludm9rZXIpCittYW5hZ2VyU2VydmxldC5jb25maWd1cmVkPU9LIC0gQXBwbGljYXRpb24gY29uZmlndXLpZSBkZXB1aXMgbGUgZmljaGllciBjb250ZXh0ZSB7MH0KK21hbmFnZXJTZXJ2bGV0LmRlcGxveWVkPU9LIC0gQXBwbGljYXRpb24gZOlwbG956WUgcG91ciBsZSBjaGVtaW4gZGUgY29udGV4dGUgezB9CittYW5hZ2VyU2VydmxldC5leGNlcHRpb249RUNIRUMgLSBMJydleGNlcHRpb24gezB9IGEg6XTpIHJlbmNvbnRy6WUKK21hbmFnZXJTZXJ2bGV0Lmluc3RhbGxlZD1PSyAtIEFwcGxpY2F0aW9uIGluc3RhbGzpZSBwb3VyIGxlIGNoZW1pbiBkZSBjb250ZXh0ZSB7MH0KK21hbmFnZXJTZXJ2bGV0LmludmFsaWRQYXRoPUVDSEVDIC0gVW4gY2hlbWluIGRlIGNvbnRleHRlIGludmFsaWRlIHswfSBhIOl06SBzcOljaWZp6QorbWFuYWdlclNlcnZsZXQuaW52YWxpZFdhcj1FQ0hFQyAtIFVuZSBVUkwgZCcnYXBwbGljYXRpb24gaW52YWxpZGUgezB9IGEg6XTpIHNw6WNpZmnpZQorbWFuYWdlclNlcnZsZXQubGlzdGVkPU9LIC0gQXBwbGljYXRpb25zIGxpc3TpZXMgcG91ciBsJydo9HRlIHZpcnR1ZWwgKHZpcnR1YWwgaG9zdCkgezB9CittYW5hZ2VyU2VydmxldC5saXN0aXRlbT17MH06ezF9OnsyfTp7M30KK21hbmFnZXJTZXJ2bGV0Lm5vQXBwQmFzZT1FQ0hFQyAtIEltcG9zc2libGUgZCcnaWRlbnRpZmllciBsYSBiYXNlIGRlIGwnJ2FwcGxpY2F0aW9uIGJhc2UgcG91ciBsZSBjaGVtaW4gZGUgY29udGV4dCB7MH0KK21hbmFnZXJTZXJ2bGV0Lm5vQ29tbWFuZD1FQ0hFQyAtIEF1Y3VuZSBjb21tYW5kZSBuJydhIOl06SBzcOljaWZp6WUKK21hbmFnZXJTZXJ2bGV0Lm5vQ29udGV4dD1FQ0hFQyAtIEF1Y3VuZSBjb250ZXh0ZSBuJydleGlzdGUgcG91ciBsZSBjaGVtaW4gezB9CittYW5hZ2VyU2VydmxldC5ub0RpcmVjdG9yeT1FQ0hFQyAtIExhIGJhc2UgZGUgZG9jdW1lbnQgbicnZXN0IHBhcyB1biBy6XBlcnRvaXJlIHBvdXIgbGUgY2hlbWluIHswfQorbWFuYWdlclNlcnZsZXQubm9Eb2NCYXNlPUVDSEVDIC0gSW1wb3NzaWJsZSBkZSByZXRpcmVyIGxhIGJhc2UgZGUgZG9jdW1lbnQgcG91ciBsZSBjaGVtaW4gezB9CittYW5hZ2VyU2VydmxldC5ub0dsb2JhbD1FQ0hFQyAtIEF1Y3VuZSByZXNzb3VyY2UgSk5ESSBnbG9iYWxlIG4nJ2VzdCBkaXNwb25pYmxlCittYW5hZ2VyU2VydmxldC5ub1JlbG9hZD1FQ0hFQyAtIFJlY2hhcmdlbWVudCBub24gc3VwcG9ydOkgcGFyIGxlIFdBUiBk6XBsb3npIGF1IGNoZW1pbiB7MH0KK21hbmFnZXJTZXJ2bGV0Lm5vUmVuYW1lPUVDSEVDIC0gSW1wb3NzaWJsZSBkZSBk6XBsb3llciB1biBXQVIgdOls6WNoYXJn6SBwb3VyIGxlIGNoZW1pbiB7MH0KK21hbmFnZXJTZXJ2bGV0Lm5vUm9sZT1FQ0hFQyAtIEwnJ3V0aWxpc2F0ZXVyIG5lIHBvc3PoZGUgcGFzIGxlIHL0bGUgezB9CittYW5hZ2VyU2VydmxldC5ub1NlbGY9RUNIRUMgLSBMZSBnZXN0aW9ubmFpcmUgbmUgcGV1dCByZWNoYXJnZXIsIHJldGlyZXIsIGFycup0ZXIsIG91IHNlIGTpcGxveWVyIGx1aS1t6m1lCittYW5hZ2VyU2VydmxldC5ub1dyYXBwZXI9TGUgY29udGVuZXVyIG4nJ2EgcGFzIGFwcGVs6SAic2V0V3JhcHBlcigpIiBwb3VyIGNldHRlIHNlcnZsZXQKK21hbmFnZXJTZXJ2bGV0LnJlbG9hZGVkPU9LIC0gQXBwbGljYXRpb24gcmVjaGFyZ+llIGF1IGNoZW1pbiBkZSBjb250ZXh0ZSB7MH0KK21hbmFnZXJTZXJ2bGV0LnJlbW92ZWQ9T0sgLSBBcHBsaWNhdGlvbiByZXRpcullIGF1IGNoZW1pbiBkZSBjb250ZXh0ZSB7MH0KK21hbmFnZXJTZXJ2bGV0LnJlc291cmNlc0FsbD1PSyAtIExpc3RlIGRlcyByZXNzb3VyY2VzIGdsb2JhbGVzIGRlIHRvdXQgdHlwZQorbWFuYWdlclNlcnZsZXQucmVzb3VyY2VzVHlwZT1PSyAtIExpc3RlIGRlcyByZXNzb3VyY2VzIGdsb2JhbGVzIGRlIHR5cGUgezB9CittYW5hZ2VyU2VydmxldC5yb2xlc0xpc3Q9T0sgLSBMaXN0ZSBkZSBy9GxlcyBkZSBzZWN1cml06QorbWFuYWdlclNlcnZsZXQuc2F2ZUZhaWw9RUNIRUMgLSBMYSBzYXV2ZWdhcmRlIGRlIGxhIGNvbmZpZ3VyYXRpb24gYSDpY2hvdek6IHswfQorbWFuYWdlclNlcnZsZXQuc2Vzc2lvbmRlZmF1bHRtYXg9SW50ZXJ2YWwgcGFyIGTpZmF1dCBkZSBtYXhpbXVtIGRlIHNlc3Npb24gaW5hY3RpdmUgezB9IG1pbnV0ZXMKK21hbmFnZXJTZXJ2bGV0LnNlc3Npb250aW1lb3V0PXswfSBtaW51dGVzOnsxfSBzZXNzaW9ucworbWFuYWdlclNlcnZsZXQuc2Vzc2lvbnM9T0sgLSBJbmZvcm1hdGlvbiBkZSBzZXNzaW9uIHBvdXIgbCcnYXBwbGljYXRpb24gYXUgY2hlbWluIGRlIGNvbnRleHRlIHswfQorbWFuYWdlclNlcnZsZXQuc3RhcnRlZD1PSyAtIEFwcGxpY2F0aW9uIGTpbWFycullIHBvdXIgbGUgY2hlbWluIGRlIGNvbnRleHRlIHswfQorbWFuYWdlclNlcnZsZXQuc3RhcnRGYWlsZWQ9RUNIRUMgLSBMJ2FwcGxpY2F0aW9uIHBvdXIgbGUgY2hlbWluIGRlIGNvbnRleHRlIHswfSBuJydhIHBhcyBwdep0cmVk6W1hcnLpZQorbWFuYWdlclNlcnZsZXQuc3RvcHBlZD1PSyAtIEFwcGxpY2F0aW9uIGFycul06WUgcG91ciBsZSBjaGVtaW4gZGUgY29udGV4dGUgezB9CittYW5hZ2VyU2VydmxldC51bmRlcGxveWVkPU9LIC0gQXBwbGljYXRpb24gbm9uLWTpcGxveellIHBvdXIgbGUgY2hlbWluIGRlIGNvbnRleHRlIHswfQorbWFuYWdlclNlcnZsZXQudW5rbm93bkNvbW1hbmQ9RUNIRUMgLSBDb21tYW5kZSBpbmNvbm51ZSB7MH0KK21hbmFnZXJTZXJ2bGV0LnVzZXJEYXRhYmFzZUVycm9yPUVDSEVDIC0gSW1wb3NzaWJsZSBkZSBy6XNvdWRyZSBsYSBiYXNlIGRlIGRvbm7pZXMgdXRpbGlzYXRldXJzIGRlculm6XJlbmNlCittYW5hZ2VyU2VydmxldC51c2VyRGF0YWJhc2VNaXNzaW5nPUVDSEVDIC0gQXVjdW5lIGJhc2UgZGUgZG9ubullcyB1dGlsaXNhdGV1cnMgbicnZXN0IGRpc3BvbmlibGUKKworc3RhdHVzU2VydmxldC50aXRsZT1FdGF0IGR1IHNlcnZldXIKK3N0YXR1c1NlcnZsZXQuY29tcGxldGU9RXRhdCBjb21wbGV0IGR1IHNlcnZldXIKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL21hbmFnZXIvV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvY2F0YWxpbmEvbWFuYWdlci9Mb2NhbFN0cmluZ3NfamEucHJvcGVydGllcyBiL2NvbnRhaW5lci93ZWJhcHBzL21hbmFnZXIvV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvY2F0YWxpbmEvbWFuYWdlci9Mb2NhbFN0cmluZ3NfamEucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDI2NzkyCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvbWFuYWdlci9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS9jYXRhbGluYS9tYW5hZ2VyL0xvY2FsU3RyaW5nc19qYS5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNzkgQEAKK2h0bWxNYW5hZ2VyU2VydmxldC5hcHBzQXZhaWxhYmxlPVx1NWI5Zlx1ODg0Y1x1NGUyZAoraHRtbE1hbmFnZXJTZXJ2bGV0LmFwcHNOYW1lPVx1ODg2OFx1NzkzYVx1NTQwZAoraHRtbE1hbmFnZXJTZXJ2bGV0LmFwcHNQYXRoPVx1MzBkMVx1MzBiOQoraHRtbE1hbmFnZXJTZXJ2bGV0LmFwcHNSZWxvYWQ9XHU1MThkXHUzMGVkXHUzMGZjXHUzMGM5CitodG1sTWFuYWdlclNlcnZsZXQuYXBwc1VuZGVwbG95PVx1OTE0ZFx1NTA5OVx1ODllM1x1OTY2NAoraHRtbE1hbmFnZXJTZXJ2bGV0LmFwcHNTZXNzaW9ucz1cdTMwYmJcdTMwYzNcdTMwYjdcdTMwZTdcdTMwZjMKK2h0bWxNYW5hZ2VyU2VydmxldC5hcHBzU3RhcnQ9XHU4ZDc3XHU1MmQ1CitodG1sTWFuYWdlclNlcnZsZXQuYXBwc1N0b3A9XHU1MDVjXHU2YjYyCitodG1sTWFuYWdlclNlcnZsZXQuYXBwc1Rhc2tzPVx1MzBiM1x1MzBkZVx1MzBmM1x1MzBjOQoraHRtbE1hbmFnZXJTZXJ2bGV0LmFwcHNUaXRsZT1cdTMwYTJcdTMwZDdcdTMwZWFcdTMwYjFcdTMwZmNcdTMwYjdcdTMwZTdcdTMwZjMKK2h0bWxNYW5hZ2VyU2VydmxldC5oZWxwSHRtbE1hbmFnZXI9SFRNTFx1MzBkZVx1MzBjZFx1MzBmY1x1MzBiOFx1MzBlM1x1MzBkOFx1MzBlYlx1MzBkNworaHRtbE1hbmFnZXJTZXJ2bGV0LmhlbHBIdG1sTWFuYWdlckZpbGU9aHRtbC1tYW5hZ2VyLWhvd3RvLmh0bWwKK2h0bWxNYW5hZ2VyU2VydmxldC5oZWxwTWFuYWdlcj1cdTMwZGVcdTMwY2RcdTMwZmNcdTMwYjhcdTMwZTNcdTMwZDhcdTMwZWJcdTMwZDcKK2h0bWxNYW5hZ2VyU2VydmxldC5oZWxwTWFuYWdlckZpbGU9bWFuYWdlci1ob3d0by5odG1sCitodG1sTWFuYWdlclNlcnZsZXQuZGVwbG95QnV0dG9uPVx1OTE0ZFx1NTA5OQoraHRtbE1hbmFnZXJTZXJ2bGV0LmRlcGxveUNvbmZpZz1YTUxcdThhMmRcdTViOWFcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTMwNmVVUkw6CitodG1sTWFuYWdlclNlcnZsZXQuZGVwbG95UGF0aD1cdTMwYjNcdTMwZjNcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzhcdTMwZDFcdTMwYjkgKFx1NzcwMVx1NzU2NVx1NTNlZik6CitodG1sTWFuYWdlclNlcnZsZXQuZGVwbG95U2VydmVyPVx1MzBiNVx1MzBmY1x1MzBkMFx1NGUwYVx1MzA2ZVdBUlx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1NTNjOFx1MzA2Zlx1MzBjN1x1MzBhM1x1MzBlY1x1MzBhZlx1MzBjOFx1MzBlYVx1MzA2ZVx1OTE0ZFx1NTA5OQoraHRtbE1hbmFnZXJTZXJ2bGV0LmRlcGxveVRpdGxlPVx1OTE0ZFx1NTA5OQoraHRtbE1hbmFnZXJTZXJ2bGV0LmRlcGxveVVwbG9hZD1XQVJcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTMwNmVcdTkxNGRcdTUwOTkKK2h0bWxNYW5hZ2VyU2VydmxldC5kZXBsb3lVcGxvYWRGYWlsPUZBSUwgLSBcdTkxNGRcdTUwOTlcdTMwNmVcdTMwYTJcdTMwYzNcdTMwZDdcdTMwZWRcdTMwZmNcdTMwYzlcdTMwNGNcdTU5MzFcdTY1NTdcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWZcdTMwMDFcdTRmOGJcdTU5MTY6IHswfQoraHRtbE1hbmFnZXJTZXJ2bGV0LmRlcGxveVVwbG9hZEZpbGU9XHUzMGEyXHUzMGMzXHUzMGQ3XHUzMGVkXHUzMGZjXHUzMGM5XHUzMDU5XHUzMDhiV0FSXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMDZlXHU5MDc4XHU2MjllCitodG1sTWFuYWdlclNlcnZsZXQuZGVwbG95VXBsb2FkTm90V2FyPUZBSUwgLSBcdTMwYTJcdTMwYzNcdTMwZDdcdTMwZWRcdTMwZmNcdTMwYzlcdTMwNTlcdTMwOGJcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWIgXCJ7MH1cIiBcdTMwNmZXQVJcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTMwNjdcdTMwNmFcdTMwNTFcdTMwOGNcdTMwNzBcdTMwNDRcdTMwNTFcdTMwN2VcdTMwNWJcdTMwOTMKK2h0bWxNYW5hZ2VyU2VydmxldC5kZXBsb3lVcGxvYWROb0ZpbGU9RkFJTCAtIFx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA2ZVx1MzBhMlx1MzBjM1x1MzBkN1x1MzBlZFx1MzBmY1x1MzBjOVx1MzA0Y1x1NTkzMVx1NjU1N1x1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1Zlx1MzAwMVx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA0Y1x1NWI1OFx1NTcyOFx1MzA1N1x1MzA3ZVx1MzA1Ylx1MzA5MworaHRtbE1hbmFnZXJTZXJ2bGV0LmRlcGxveVVwbG9hZFdhckV4aXN0cz1GQUlMIC0gV0FSXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViIFwiezB9XCIgXHUzMDZmXHU2NWUyXHUzMDZiXHUzMGI1XHUzMGZjXHUzMGQwXHU0ZTBhXHUzMDZiXHU1YjU4XHU1NzI4XHUzMDU3XHUzMDdlXHUzMDU5CitodG1sTWFuYWdlclNlcnZsZXQuZGVwbG95V2FyPVdBUlx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1NTNjOFx1MzA2Zlx1MzBjN1x1MzBhM1x1MzBlY1x1MzBhZlx1MzBjOFx1MzBlYVx1MzA2ZVVSTDoKK2h0bWxNYW5hZ2VyU2VydmxldC5saXN0PVx1MzBhMlx1MzBkN1x1MzBlYVx1MzBiMVx1MzBmY1x1MzBiN1x1MzBlN1x1MzBmM1x1MzA2ZVx1NGUwMFx1ODlhNworaHRtbE1hbmFnZXJTZXJ2bGV0Lm1hbmFnZXI9XHUzMGRlXHUzMGNkXHUzMGZjXHUzMGI4XHUzMGUzCitodG1sTWFuYWdlclNlcnZsZXQubWVzc2FnZUxhYmVsPVx1MzBlMVx1MzBjM1x1MzBiYlx1MzBmY1x1MzBiOAoraHRtbE1hbmFnZXJTZXJ2bGV0LnNlcnZlckpWTVZlbmRvcj1KVk1cdTMwZDlcdTMwZjNcdTMwYzAKK2h0bWxNYW5hZ2VyU2VydmxldC5zZXJ2ZXJKVk1WZXJzaW9uPUpWTVx1MzBkMFx1MzBmY1x1MzBiOFx1MzBlN1x1MzBmMworaHRtbE1hbmFnZXJTZXJ2bGV0LnNlcnZlck9TQXJjaD1PU1x1MzBhMlx1MzBmY1x1MzBhZFx1MzBjNlx1MzBhZlx1MzBjMVx1MzBlMworaHRtbE1hbmFnZXJTZXJ2bGV0LnNlcnZlck9TTmFtZT1PU1x1NTQwZAoraHRtbE1hbmFnZXJTZXJ2bGV0LnNlcnZlck9TVmVyc2lvbj1PU1x1MzBkMFx1MzBmY1x1MzBiOFx1MzBlN1x1MzBmMworaHRtbE1hbmFnZXJTZXJ2bGV0LnNlcnZlclRpdGxlPVx1MzBiNVx1MzBmY1x1MzBkMFx1NjBjNVx1NTgzMQoraHRtbE1hbmFnZXJTZXJ2bGV0LnNlcnZlclZlcnNpb249VG9tY2F0XHUzMGQwXHUzMGZjXHUzMGI4XHUzMGU3XHUzMGYzCitodG1sTWFuYWdlclNlcnZsZXQudGl0bGU9VG9tY2F0IFdlYlx1MzBhMlx1MzBkN1x1MzBlYVx1MzBiMVx1MzBmY1x1MzBiN1x1MzBlN1x1MzBmM1x1MzBkZVx1MzBjZFx1MzBmY1x1MzBiOFx1MzBlMworbWFuYWdlclNlcnZsZXQuYWxyZWFkeUNvbnRleHQ9RkFJTCAtIFx1MzBhMlx1MzBkN1x1MzBlYVx1MzBiMVx1MzBmY1x1MzBiN1x1MzBlN1x1MzBmM1x1MzA2Zlx1MzAwMVx1NjVlMlx1MzA2Ylx1MzBkMVx1MzBiOSB7MH0gXHUzMDZiXHU1YjU4XHU1NzI4XHUzMDU3XHUzMDdlXHUzMDU5CittYW5hZ2VyU2VydmxldC5hbHJlYWR5RG9jQmFzZT1GQUlMIC0gXHUzMGM3XHUzMGEzXHUzMGVjXHUzMGFmXHUzMGM4XHUzMGVhIHswfSBcdTMwNmZcdTY1ZTJcdTMwNmJcdTRmN2ZcdTc1MjhcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkKK21hbmFnZXJTZXJ2bGV0LmNhbm5vdEludm9rZT1cdTMwYTRcdTMwZjNcdTMwZGNcdTMwZmNcdTMwYWJcdTMwNjdcdTMwZGVcdTMwY2RcdTMwZmNcdTMwYjhcdTMwZTNcdTMwYjVcdTMwZmNcdTMwZDZcdTMwZWNcdTMwYzNcdTMwYzhcdTMwOTJcdThkNzdcdTUyZDVcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwNjdcdTMwNTdcdTMwNWYKK21hbmFnZXJTZXJ2bGV0LmNvbmZpZ3VyZWQ9T0sgLSBcdTMwYjNcdTMwZjNcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzhcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWIgezB9IFx1MzA0Ylx1MzA4OVx1MzBhMlx1MzBkN1x1MzBlYVx1MzBiMVx1MzBmY1x1MzBiN1x1MzBlN1x1MzBmM1x1MzA5Mlx1MzBhNFx1MzBmM1x1MzBiOVx1MzBjOFx1MzBmY1x1MzBlYlx1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1ZgorbWFuYWdlclNlcnZsZXQuZGVwbG95ZWQ9T0sgLSBcdTMwYjNcdTMwZjNcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzhcdTMwZDFcdTMwYjkgezB9IFx1MzA2N1x1MzBhMlx1MzBkN1x1MzBlYVx1MzBiMVx1MzBmY1x1MzBiN1x1MzBlN1x1MzBmM1x1MzA5Mlx1OTE0ZFx1NTA5OVx1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1ZgorbWFuYWdlclNlcnZsZXQuZXhjZXB0aW9uPUZBSUwgLSBcdTRmOGJcdTU5MTYgezB9IFx1MzA0Y1x1NzY3YVx1NzUxZlx1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1ZgorbWFuYWdlclNlcnZsZXQuZGVwbG95ZWQ9T0sgLSBcdTMwYjNcdTMwZjNcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzhcdTMwZDFcdTMwYjkgezB9IFx1MzA2Ylx1MzBhMlx1MzBkN1x1MzBlYVx1MzBiMVx1MzBmY1x1MzBiN1x1MzBlN1x1MzBmM1x1MzA5Mlx1MzBhNFx1MzBmM1x1MzBiOVx1MzBjOFx1MzBmY1x1MzBlYlx1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1ZgorbWFuYWdlclNlcnZsZXQuaW52YWxpZFBhdGg9RkFJTCAtIFx1NzEyMVx1NTJiOVx1MzA2YVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBhZFx1MzBiOVx1MzBjOFx1MzBkMVx1MzBiOSB7MH0gXHUzMDRjXHU2MzA3XHU1YjlhXHUzMDU1XHUzMDhjXHUzMDdlXHUzMDU3XHUzMDVmCittYW5hZ2VyU2VydmxldC5pbnZhbGlkV2FyPUZBSUwgLSBcdTcxMjFcdTUyYjlcdTMwNmFcdTMwYTJcdTMwZDdcdTMwZWFcdTMwYjFcdTMwZmNcdTMwYjdcdTMwZTdcdTMwZjNcdTMwNmVVUkwgezB9IFx1MzA0Y1x1NjMwN1x1NWI5YVx1MzA1NVx1MzA4Y1x1MzA3ZVx1MzA1N1x1MzA1ZgorbWFuYWdlclNlcnZsZXQubGlzdGVkPU9LIC0gXHUzMGQwXHUzMGZjXHUzMGMxXHUzMGUzXHUzMGViXHUzMGRiXHUzMGI5XHUzMGM4IHswfSBcdTMwNmVcdTMwYTJcdTMwZDdcdTMwZWFcdTMwYjFcdTMwZmNcdTMwYjdcdTMwZTdcdTMwZjNcdTRlMDBcdTg5YTdcdTMwNjdcdTMwNTkKK21hbmFnZXJTZXJ2bGV0Lmxpc3RpdGVtPXswfTp7MX06ezJ9CittYW5hZ2VyU2VydmxldC5ub0FwcEJhc2U9RkFJTCAtIFx1MzBiM1x1MzBmM1x1MzBjNlx1MzBhZFx1MzBiOVx1MzBjOFx1MzBkMVx1MzBiOSB7MH0gXHUzMDZiXHU1YmZlXHUzMDU3XHUzMDY2XHUzMGEyXHUzMGQ3XHUzMGVhXHUzMGIxXHUzMGZjXHUzMGI3XHUzMGU3XHUzMGYzXHUzMGQ5XHUzMGZjXHUzMGI5XHUzMDkyXHU3OGJhXHU4YThkXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzCittYW5hZ2VyU2VydmxldC5ub0NvbW1hbmQ9RkFJTCAtIFx1MzBiM1x1MzBkZVx1MzBmM1x1MzBjOVx1MzA0Y1x1NjMwN1x1NWI5YVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5MworbWFuYWdlclNlcnZsZXQubm9Db250ZXh0PUZBSUwgLSBcdTMwZDFcdTMwYjkgezB9IFx1MzA2ZVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBhZFx1MzBiOVx1MzBjOFx1MzA0Y1x1NWI1OFx1NTcyOFx1MzA1N1x1MzA3ZVx1MzA1Ylx1MzA5MworbWFuYWdlclNlcnZsZXQubm9EaXJlY3Rvcnk9RkFJTCAtIFx1MzBkMVx1MzBiOSB7MH0gXHUzMDZiXHU1YmZlXHUzMDU5XHUzMDhiXHUzMGM3XHUzMGEzXHUzMGVjXHUzMGFmXHUzMGM4XHUzMGVhXHUzMGM5XHUzMGFkXHUzMGU1XHUzMGUxXHUzMGYzXHUzMGM4XHUzMGQ5XHUzMGZjXHUzMGI5XHUzMDRjXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDViXHUzMDkzCittYW5hZ2VyU2VydmxldC5ub0RvY0Jhc2U9RkFJTCAtIFx1MzBkMVx1MzBiOSB7MH0gXHUzMDZiXHU1YmZlXHUzMDU5XHUzMDhiXHUzMGM5XHUzMGFkXHUzMGU1XHUzMGUxXHUzMGYzXHUzMGM4XHUzMGQ5XHUzMGZjXHUzMGI5XHUzMDkyXHU1MjRhXHU5NjY0XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzCittYW5hZ2VyU2VydmxldC5ub0dsb2JhbD1GQUlMIC0gXHUzMGIwXHUzMGVkXHUzMGZjXHUzMGQwXHUzMGViXHUzMDZhSk5ESVx1MzBlYVx1MzBiZFx1MzBmY1x1MzBiOVx1MzA0Y1x1NTIyOVx1NzUyOFx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5MworbWFuYWdlclNlcnZsZXQubm9SZWxvYWQ9RkFJTCAtIFx1MzBkMVx1MzBiOSB7MH0gXHUzMDZiXHU5MTRkXHU1MDk5XHUzMDU1XHUzMDhjXHUzMDVmV0FSXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMDY3XHUzMDZmXHU1MThkXHUzMGVkXHUzMGZjXHUzMGM5XHUzMDRjXHUzMGI1XHUzMGRkXHUzMGZjXHUzMGM4XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzCittYW5hZ2VyU2VydmxldC5ub1JlbmFtZT1GQUlMIC0gXHUzMGEyXHUzMGMzXHUzMGQ3XHUzMGVkXHUzMGZjXHUzMGM5XHUzMDU1XHUzMDhjXHUzMDVmV0FSXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMDkyXHUzMGQxXHUzMGI5IHswfSBcdTMwNmJcdTkxNGRcdTUwOTlcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMKK21hbmFnZXJTZXJ2bGV0Lm5vUm9sZT1GQUlMIC0gXHUzMGU2XHUzMGZjXHUzMGI2XHUzMDZmXHUzMGVkXHUzMGZjXHUzMGViIHswfSBcdTMwOTJcdTYzMDFcdTMwNjNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNWJcdTMwOTMKK21hbmFnZXJTZXJ2bGV0Lm5vU2VsZj1GQUlMIC0gXHUzMGRlXHUzMGNkXHUzMGZjXHUzMGI4XHUzMGUzXHU4MWVhXHU4ZWFiXHUzMDkyXHU1MThkXHUzMGVkXHUzMGZjXHUzMGM5XHUzMDAxXHU1MjRhXHU5NjY0XHUzMDAxXHU1MDVjXHU2YjYyXHUzMDAxXHU1M2M4XHUzMDZmXHU5MTRkXHU1MDk5XHU4OWUzXHU5NjY0XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzCittYW5hZ2VyU2VydmxldC5ub1dyYXBwZXI9XHUzMGIzXHUzMGYzXHUzMGM2XHUzMGNhXHUzMDZmXHUzMDUzXHUzMDZlXHUzMGI1XHUzMGZjXHUzMGQ2XHUzMGVjXHUzMGMzXHUzMGM4XHUzMDZiXHU1YmZlXHUzMDU3XHUzMDY2XHU1NDdjXHUzMDczXHU1MWZhXHUzMDU1XHUzMDhjXHUzMDVmc2V0V3JhcHBlcigpXHUzMDkyXHU2MzAxXHUzMDYzXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzCittYW5hZ2VyU2VydmxldC5yZWxvYWRlZD1PSyAtIFx1MzBiM1x1MzBmM1x1MzBjNlx1MzBhZFx1MzBiOVx1MzBjOFx1MzBkMVx1MzBiOSB7MH0gXHUzMDZlXHUzMGEyXHUzMGQ3XHUzMGVhXHUzMGIxXHUzMGZjXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDkyXHU1MThkXHUzMGVkXHUzMGZjXHUzMGM5XHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmCittYW5hZ2VyU2VydmxldC51bmRlcGxveWQ9T0sgLSBcdTMwYjNcdTMwZjNcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzhcdTMwZDFcdTMwYjkgezB9IFx1MzA0Ylx1MzA4OVx1MzBhMlx1MzBkN1x1MzBlYVx1MzBiMVx1MzBmY1x1MzBiN1x1MzBlN1x1MzBmM1x1MzA5Mlx1OTE0ZFx1NTA5OVx1ODllM1x1OTY2NFx1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1ZgorbWFuYWdlclNlcnZsZXQucmVzb3VyY2VzQWxsPU9LIC0gXHUzMDU5XHUzMDc5XHUzMDY2XHUzMDZlXHUzMGJmXHUzMGE0XHUzMGQ3XHUzMDZlXHUzMGIwXHUzMGVkXHUzMGZjXHUzMGQwXHUzMGViXHUzMGVhXHUzMGJkXHUzMGZjXHUzMGI5XHUzMDkyXHU1MjE3XHU2MzE5XHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmCittYW5hZ2VyU2VydmxldC5yZXNvdXJjZXNUeXBlPU9LIC0gXHUzMGJmXHUzMGE0XHUzMGQ3IHswfSBcdTMwNmVcdTMwYjBcdTMwZWRcdTMwZmNcdTMwZDBcdTMwZWJcdTMwZWFcdTMwYmRcdTMwZmNcdTMwYjlcdTMwOTJcdTUyMTdcdTYzMTlcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWYKK21hbmFnZXJTZXJ2bGV0LnJvbGVzTGlzdD1PSyAtIFx1MzBiYlx1MzBhZFx1MzBlNVx1MzBlYVx1MzBjNlx1MzBhM1x1MzBlZFx1MzBmY1x1MzBlYlx1MzA5Mlx1NTIxN1x1NjMxOVx1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1ZgorbWFuYWdlclNlcnZsZXQuc2F2ZUZhaWw9RkFJTCAtIFx1OGEyZFx1NWI5YVx1MzA2ZVx1NGZkZFx1NWI1OFx1MzA2Ylx1NTkzMVx1NjU1N1x1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1ZjogezB9CittYW5hZ2VyU2VydmxldC5zYXZlZD1PSyAtIFx1MzBiNVx1MzBmY1x1MzBkMFx1MzA2ZVx1OGEyZFx1NWI5YVx1MzA5Mlx1NGZkZFx1NWI1OFx1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1ZgorbWFuYWdlclNlcnZsZXQuc2F2ZWRDb250ZXh0PU9LIC0gXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4IHswfSBcdTMwNmVcdThhMmRcdTViOWFcdTMwOTJcdTRmZGRcdTViNThcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWYKK21hbmFnZXJTZXJ2bGV0LnNlc3Npb25kZWZhdWx0bWF4PVx1MzBjN1x1MzBkNVx1MzBhOVx1MzBlYlx1MzBjOFx1MzA2ZVx1NjcwMFx1NTkyN1x1MzBiYlx1MzBjM1x1MzBiN1x1MzBlN1x1MzBmM1x1NTA1Y1x1NmI2Mlx1OTU5M1x1OTY5NFx1MzA2ZnswfVx1NTIwNlx1MzA2N1x1MzA1OQorbWFuYWdlclNlcnZsZXQuc2Vzc2lvbnRpbWVvdXQ9ezB9XHU1MjA2OiB7MX1cdTMwYmJcdTMwYzNcdTMwYjdcdTMwZTdcdTMwZjMKK21hbmFnZXJTZXJ2bGV0LnNlc3Npb25zPU9LIC0gXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4XHUzMGQxXHUzMGI5IHswfSBcdTMwNmVcdTMwYTJcdTMwZDdcdTMwZWFcdTMwYjFcdTMwZmNcdTMwYjdcdTMwZTdcdTMwZjNcdTMwNmVcdTMwYmJcdTMwYzNcdTMwYjdcdTMwZTdcdTMwZjNcdTYwYzVcdTU4MzFcdTMwNjdcdTMwNTkKK21hbmFnZXJTZXJ2bGV0LnN0YXJ0ZWQ9T0sgLSBcdTMwYjNcdTMwZjNcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzhcdTMwZDFcdTMwYjkgezB9IFx1MzA2N1x1MzBhMlx1MzBkN1x1MzBlYVx1MzBiMVx1MzBmY1x1MzBiN1x1MzBlN1x1MzBmM1x1MzA5Mlx1OGQ3N1x1NTJkNVx1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1ZgorbWFuYWdlclNlcnZsZXQuc3RhcnRGYWlsZWQ9RkFJTCAtIFx1MzBiM1x1MzBmM1x1MzBjNlx1MzBhZFx1MzBiOVx1MzBjOFx1MzBkMVx1MzBiOSB7MH0gXHUzMDZlXHUzMGEyXHUzMGQ3XHUzMGVhXHUzMGIxXHUzMGZjXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDRjXHU4ZDc3XHU1MmQ1XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzCittYW5hZ2VyU2VydmxldC5zdG9wcGVkPU9LIC0gXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4XHUzMGQxXHUzMGI5IHswfSBcdTMwNjdcdTMwYTJcdTMwZDdcdTMwZWFcdTMwYjFcdTMwZmNcdTMwYjdcdTMwZTdcdTMwZjNcdTMwOTJcdTUwNWNcdTZiNjJcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWYKK21hbmFnZXJTZXJ2bGV0LnVuZGVwbG95ZWQ9T0sgLSBcdTMwYjNcdTMwZjNcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzhcdTMwZDFcdTMwYjkgezB9IFx1MzA2ZVx1MzBhMlx1MzBkN1x1MzBlYVx1MzBiMVx1MzBmY1x1MzBiN1x1MzBlN1x1MzBmM1x1MzA5Mlx1OTE0ZFx1NTA5OVx1ODllM1x1OTY2NFx1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1ZgorbWFuYWdlclNlcnZsZXQudW5rbm93bkNvbW1hbmQ9RkFJTCAtIFx1NjcyYVx1NzdlNVx1MzA2ZVx1MzBiM1x1MzBkZVx1MzBmM1x1MzBjOSB7MH0gXHUzMDY3XHUzMDU5CittYW5hZ2VyU2VydmxldC51c2VyRGF0YWJhc2VFcnJvcj1GQUlMIC0gXHUzMGU2XHUzMGZjXHUzMGI2XHUzMGM3XHUzMGZjXHUzMGJmXHUzMGQ5XHUzMGZjXHUzMGI5XHU1M2MyXHU3MTY3XHUzMDkyXHU4OWUzXHU2YzdhXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzCittYW5hZ2VyU2VydmxldC51c2VyRGF0YWJhc2VNaXNzaW5nPUZBSUwgLSBcdTMwZTZcdTMwZmNcdTMwYjZcdTMwYzdcdTMwZmNcdTMwYmZcdTMwZDlcdTMwZmNcdTMwYjlcdTMwNGNcdTUyMjlcdTc1MjhcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMKK3N0YXR1c1NlcnZsZXQudGl0bGU9XHUzMGI1XHUzMGZjXHUzMGQwXHUzMDZlXHU3MmI2XHU2MTRiCitzdGF0dXNTZXJ2bGV0LmNvbXBsZXRlPVx1MzBiNVx1MzBmY1x1MzBkMFx1MzA2ZVx1NTE2OFx1NzJiNlx1NjE0YgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvbWFuYWdlci9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS9jYXRhbGluYS9tYW5hZ2VyL01hbmFnZXJTZXJ2bGV0LmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9tYW5hZ2VyL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL2NhdGFsaW5hL21hbmFnZXIvTWFuYWdlclNlcnZsZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzk5YTZkCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvbWFuYWdlci9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS9jYXRhbGluYS9tYW5hZ2VyL01hbmFnZXJTZXJ2bGV0LmphdmEKQEAgLTAsMCArMSwxNjA2IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuYXBhY2hlLmNhdGFsaW5hLm1hbmFnZXI7CisKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CitpbXBvcnQgamF2YXgubmFtaW5nLkJpbmRpbmc7CitpbXBvcnQgamF2YXgubmFtaW5nLkluaXRpYWxDb250ZXh0OworaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1pbmdFbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm5hbWluZy5kaXJlY3RvcnkuRGlyQ29udGV4dDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YXguc2VydmxldC5VbmF2YWlsYWJsZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXQ7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkNvbnRhaW5lclNlcnZsZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Db250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuRW5naW5lOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuR2xvYmFsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLkhvc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5MaWZlY3ljbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Sb2xlOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuU2VydmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuU2VydmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLlNlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5Vc2VyRGF0YWJhc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS5XcmFwcGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5TdGFuZGFyZFNlcnZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuU2VydmVySW5mbzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuU3RyaW5nTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubW9kZWxlci5SZWdpc3RyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLm5hbWluZy5yZXNvdXJjZXMuUHJveHlEaXJDb250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUubmFtaW5nLnJlc291cmNlcy5XQVJEaXJDb250ZXh0OworCisKKy8qKgorICogU2VydmxldCB0aGF0IGVuYWJsZXMgcmVtb3RlIG1hbmFnZW1lbnQgb2YgdGhlIHdlYiBhcHBsaWNhdGlvbnMgaW5zdGFsbGVkCisgKiB3aXRoaW4gdGhlIHNhbWUgdmlydHVhbCBob3N0IGFzIHRoaXMgd2ViIGFwcGxpY2F0aW9uIGlzLiAgTm9ybWFsbHksIHRoaXMKKyAqIGZ1bmN0aW9uYWxpdHkgd2lsbCBiZSBwcm90ZWN0ZWQgYnkgYSBzZWN1cml0eSBjb25zdHJhaW50IGluIHRoZSB3ZWIKKyAqIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQgZGVzY3JpcHRvci4gIEhvd2V2ZXIsIHRoaXMgcmVxdWlyZW1lbnQgY2FuIGJlCisgKiByZWxheGVkIGR1cmluZyB0ZXN0aW5nLgorICogPHA+CisgKiBUaGlzIHNlcnZsZXQgZXhhbWluZXMgdGhlIHZhbHVlIHJldHVybmVkIGJ5IDxjb2RlPmdldFBhdGhJbmZvKCk8L2NvZGU+CisgKiBhbmQgcmVsYXRlZCBxdWVyeSBwYXJhbWV0ZXJzIHRvIGRldGVybWluZSB3aGF0IGFjdGlvbiBpcyBiZWluZyByZXF1ZXN0ZWQuCisgKiBUaGUgZm9sbG93aW5nIGFjdGlvbnMgYW5kIHBhcmFtZXRlcnMgKHN0YXJ0aW5nIGFmdGVyIHRoZSBzZXJ2bGV0IHBhdGgpCisgKiBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogPGxpPjxiPi9kZXBsb3k/Y29uZmlnPXtjb25maWctdXJsfTwvYj4gLSBJbnN0YWxsIGFuZCBzdGFydCBhIG5ldworICogICAgIHdlYiBhcHBsaWNhdGlvbiwgYmFzZWQgb24gdGhlIGNvbnRlbnRzIG9mIHRoZSBjb250ZXh0IGNvbmZpZ3VyYXRpb24KKyAqICAgICBmaWxlIGZvdW5kIGF0IHRoZSBzcGVjaWZpZWQgVVJMLiAgVGhlIDxjb2RlPmRvY0Jhc2U8L2NvZGU+IGF0dHJpYnV0ZQorICogICAgIG9mIHRoZSBjb250ZXh0IGNvbmZpZ3VyYXRpb24gZmlsZSBpcyB1c2VkIHRvIGxvY2F0ZSB0aGUgYWN0dWFsCisgKiAgICAgV0FSIG9yIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBhcHBsaWNhdGlvbi48L2xpPgorICogPGxpPjxiPi9kZXBsb3k/Y29uZmlnPXtjb25maWctdXJsfSZ3YXI9e3dhci11cmx9LzwvYj4gLSBJbnN0YWxsIGFuZCBzdGFydAorICogICAgIGEgbmV3IHdlYiBhcHBsaWNhdGlvbiwgYmFzZWQgb24gdGhlIGNvbnRlbnRzIG9mIHRoZSBjb250ZXh0CisgKiAgICAgY29uZmlndXJhdGlvbiBmaWxlIGZvdW5kIGF0IDxjb2RlPntjb25maWctdXJsfTwvY29kZT4sIG92ZXJyaWRpbmcgdGhlCisgKiAgICAgPGNvZGU+ZG9jQmFzZTwvY29kZT4gYXR0cmlidXRlIHdpdGggdGhlIGNvbnRlbnRzIG9mIHRoZSB3ZWIKKyAqICAgICBhcHBsaWNhdGlvbiBhcmNoaXZlIGZvdW5kIGF0IDxjb2RlPnt3YXItdXJsfTwvY29kZT4uPC9saT4KKyAqIDxsaT48Yj4vZGVwbG95P3BhdGg9L3h4eCZ3YXI9e3dhci11cmx9PC9iPiAtIEluc3RhbGwgYW5kIHN0YXJ0IGEgbmV3CisgKiAgICAgd2ViIGFwcGxpY2F0aW9uIGF0dGFjaGVkIHRvIGNvbnRleHQgcGF0aCA8Y29kZT4veHh4PC9jb2RlPiwgYmFzZWQKKyAqICAgICBvbiB0aGUgY29udGVudHMgb2YgdGhlIHdlYiBhcHBsaWNhdGlvbiBhcmNoaXZlIGZvdW5kIGF0IHRoZQorICogICAgIHNwZWNpZmllZCBVUkwuPC9saT4KKyAqIDxsaT48Yj4vbGlzdDwvYj4gLSBMaXN0IHRoZSBjb250ZXh0IHBhdGhzIG9mIGFsbCBjdXJyZW50bHkgaW5zdGFsbGVkIHdlYgorICogICAgIGFwcGxpY2F0aW9ucyBmb3IgdGhpcyB2aXJ0dWFsIGhvc3QuICBFYWNoIGNvbnRleHQgd2lsbCBiZSBsaXN0ZWQgd2l0aAorICogICAgIHRoZSBmb2xsb3dpbmcgZm9ybWF0IDxjb2RlPnBhdGg6c3RhdHVzOnNlc3Npb25zPC9jb2RlPi4KKyAqICAgICBXaGVyZSBwYXRoIGlzIHRoZSBjb250ZXh0IHBhdGguICBTdGF0dXMgaXMgZWl0aGVyIHJ1bm5pbmcgb3Igc3RvcHBlZC4KKyAqICAgICBTZXNzaW9ucyBpcyB0aGUgbnVtYmVyIG9mIGFjdGl2ZSBTZXNzaW9ucy48L2xpPgorICogPGxpPjxiPi9yZWxvYWQ/cGF0aD0veHh4PC9iPiAtIFJlbG9hZCB0aGUgSmF2YSBjbGFzc2VzIGFuZCByZXNvdXJjZXMgZm9yCisgKiAgICAgdGhlIGFwcGxpY2F0aW9uIGF0IHRoZSBzcGVjaWZpZWQgcGF0aC48L2xpPgorICogPGxpPjxiPi9yZXNvdXJjZXM/dHlwZT14eHh4PC9iPiAtIEVudW1lcmF0ZSB0aGUgYXZhaWxhYmxlIGdsb2JhbCBKTkRJCisgKiAgICAgcmVzb3VyY2VzLCBvcHRpb25hbGx5IGxpbWl0ZWQgdG8gdGhvc2Ugb2YgdGhlIHNwZWNpZmllZCB0eXBlCisgKiAgICAgKGZ1bGx5IHF1YWxpZmllZCBKYXZhIGNsYXNzIG5hbWUpLCBpZiBhdmFpbGFibGUuPC9saT4KKyAqIDxsaT48Yj4vcm9sZXM8L2I+IC0gRW51bWVyYXRlIHRoZSBhdmFpbGFibGUgc2VjdXJpdHkgcm9sZSBuYW1lcyBhbmQKKyAqICAgICBkZXNjcmlwdGlvbnMgZnJvbSB0aGUgdXNlciBkYXRhYmFzZSBjb25uZWN0ZWQgdG8gdGhlIDxjb2RlPnVzZXJzPC9jb2RlPgorICogICAgIHJlc291cmNlIHJlZmVyZW5jZS4KKyAqIDxsaT48Yj4vc2VydmVyaW5mbzwvYj4gLSBEaXNwbGF5IHN5c3RlbSBPUyBhbmQgSlZNIHByb3BlcnRpZXMuCisgKiA8bGk+PGI+L3Nlc3Npb25zP3BhdGg9L3h4eDwvYj4gLSBMaXN0IHNlc3Npb24gaW5mb3JtYXRpb24gYWJvdXQgdGhlIHdlYgorICogICAgIGFwcGxpY2F0aW9uIGF0dGFjaGVkIHRvIGNvbnRleHQgcGF0aCA8Y29kZT4veHh4PC9jb2RlPiBmb3IgdGhpcworICogICAgIHZpcnR1YWwgaG9zdC48L2xpPgorICogPGxpPjxiPi9zdGFydD9wYXRoPS94eHg8L2I+IC0gU3RhcnQgdGhlIHdlYiBhcHBsaWNhdGlvbiBhdHRhY2hlZCB0bworICogICAgIGNvbnRleHQgcGF0aCA8Y29kZT4veHh4PC9jb2RlPiBmb3IgdGhpcyB2aXJ0dWFsIGhvc3QuPC9saT4KKyAqIDxsaT48Yj4vc3RvcD9wYXRoPS94eHg8L2I+IC0gU3RvcCB0aGUgd2ViIGFwcGxpY2F0aW9uIGF0dGFjaGVkIHRvCisgKiAgICAgY29udGV4dCBwYXRoIDxjb2RlPi94eHg8L2NvZGU+IGZvciB0aGlzIHZpcnR1YWwgaG9zdC48L2xpPgorICogPGxpPjxiPi91bmRlcGxveT9wYXRoPS94eHg8L2I+IC0gU2h1dGRvd24gYW5kIHJlbW92ZSB0aGUgd2ViIGFwcGxpY2F0aW9uCisgKiAgICAgYXR0YWNoZWQgdG8gY29udGV4dCBwYXRoIDxjb2RlPi94eHg8L2NvZGU+IGZvciB0aGlzIHZpcnR1YWwgaG9zdCwKKyAqICAgICBhbmQgcmVtb3ZlIHRoZSB1bmRlcmx5aW5nIFdBUiBmaWxlIG9yIGRvY3VtZW50IGJhc2UgZGlyZWN0b3J5LgorICogICAgICg8ZW0+Tk9URTwvZW0+IC0gVGhpcyBpcyBvbmx5IGFsbG93ZWQgaWYgdGhlIFdBUiBmaWxlIG9yIGRvY3VtZW50CisgKiAgICAgYmFzZSBpcyBzdG9yZWQgaW4gdGhlIDxjb2RlPmFwcEJhc2U8L2NvZGU+IGRpcmVjdG9yeSBvZiB0aGlzIGhvc3QsCisgKiAgICAgdHlwaWNhbGx5IGFzIGEgcmVzdWx0IG9mIGJlaW5nIHBsYWNlZCB0aGVyZSB2aWEgdGhlIDxjb2RlPi9kZXBsb3k8L2NvZGU+CisgKiAgICAgY29tbWFuZC48L2xpPgorICogPC91bD4KKyAqIDxwPlVzZSA8Y29kZT5wYXRoPS88L2NvZGU+IGZvciB0aGUgUk9PVCBjb250ZXh0LjwvcD4KKyAqIDxwPlRoZSBzeW50YXggb2YgdGhlIFVSTCBmb3IgYSB3ZWIgYXBwbGljYXRpb24gYXJjaGl2ZSBtdXN0IGNvbmZvcm0gdG8gb25lCisgKiBvZiB0aGUgZm9sbG93aW5nIHBhdHRlcm5zIHRvIGJlIHN1Y2Nlc3NmdWxseSBkZXBsb3llZDo8L3A+CisgKiA8dWw+CisgKiA8bGk+PGI+ZmlsZTovYWJzb2x1dGUvcGF0aC90by9hL2RpcmVjdG9yeTwvYj4gLSBZb3UgY2FuIHNwZWNpZnkgdGhlIGFic29sdXRlCisgKiAgICAgcGF0aCBvZiBhIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIHRoZSB1bnBhY2tlZCB2ZXJzaW9uIG9mIGEgd2ViCisgKiAgICAgYXBwbGljYXRpb24uICBUaGlzIGRpcmVjdG9yeSB3aWxsIGJlIGF0dGFjaGVkIHRvIHRoZSBjb250ZXh0IHBhdGggeW91CisgKiAgICAgc3BlY2lmeSB3aXRob3V0IGFueSBjaGFuZ2VzLjwvbGk+CisgKiA8bGk+PGI+amFyOmZpbGU6L2Fic29sdXRlL3BhdGgvdG8vYS93YXJmaWxlLndhciEvPC9iPiAtIFlvdSBjYW4gc3BlY2lmeSBhCisgKiAgICAgVVJMIHRvIGEgbG9jYWwgd2ViIGFwcGxpY2F0aW9uIGFyY2hpdmUgZmlsZS4gIFRoZSBzeW50YXggbXVzdCBjb25mb3JtIHRvCisgKiAgICAgdGhlIHJ1bGVzIHNwZWNpZmllZCBieSB0aGUgPGNvZGU+SmFyVVJMQ29ubmVjdGlvbjwvY29kZT4gY2xhc3MgZm9yIGEKKyAqICAgICByZWZlcmVuY2UgdG8gYW4gZW50aXJlIEpBUiBmaWxlLjwvbGk+CisgKiA8bGk+PGI+amFyOmh0dHA6Ly9ob3N0bmFtZTpwb3J0L3BhdGgvdG8vYS93YXJmaWxlLndhciEvPC9iPiAtIFlvdSBjYW4gc3BlY2lmeQorICogICAgIGEgVVJMIHRvIGEgcmVtb3RlIChIVFRQLWFjY2Vzc2libGUpIHdlYiBhcHBsaWNhdGlvbiBhcmNoaXZlIGZpbGUuICBUaGUKKyAqICAgICBzeW50YXggbXVzdCBjb25mb3JtIHRvIHRoZSBydWxlcyBzcGVjaWZpZWQgYnkgdGhlCisgKiAgICAgPGNvZGU+SmFyVVJMQ29ubmVjdGlvbjwvY29kZT4gY2xhc3MgZm9yIGEgcmVmZXJlbmNlIHRvIGFuIGVudGlyZQorICogICAgIEpBUiBmaWxlLjwvbGk+CisgKiA8L3VsPgorICogPHA+CisgKiA8Yj5OT1RFPC9iPiAtIEF0dGVtcHRpbmcgdG8gcmVsb2FkIG9yIHJlbW92ZSB0aGUgYXBwbGljYXRpb24gY29udGFpbmluZworICogdGhpcyBzZXJ2bGV0IGl0c2VsZiB3aWxsIG5vdCBzdWNjZWVkLiAgVGhlcmVmb3JlLCB0aGlzIHNlcnZsZXQgc2hvdWxkCisgKiBnZW5lcmFsbHkgYmUgZGVwbG95ZWQgYXMgYSBzZXBhcmF0ZSB3ZWIgYXBwbGljYXRpb24gd2l0aGluIHRoZSB2aXJ0dWFsIGhvc3QKKyAqIHRvIGJlIG1hbmFnZWQuCisgKiA8cD4KKyAqIDxiPk5PVEU8L2I+IC0gRm9yIHNlY3VyaXR5IHJlYXNvbnMsIHRoaXMgYXBwbGljYXRpb24gd2lsbCBub3Qgb3BlcmF0ZQorICogd2hlbiBhY2Nlc3NlZCB2aWEgdGhlIGludm9rZXIgc2VydmxldC4gIFlvdSBtdXN0IGV4cGxpY2l0bHkgbWFwIHRoaXMgc2VydmxldAorICogd2l0aCBhIHNlcnZsZXQgbWFwcGluZywgYW5kIHlvdSB3aWxsIGFsd2F5cyB3YW50IHRvIHByb3RlY3QgaXQgd2l0aAorICogYXBwcm9wcmlhdGUgc2VjdXJpdHkgY29uc3RyYWludHMgYXMgd2VsbC4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBzZXJ2bGV0IGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMgYXJlIHJlY29nbml6ZWQ6CisgKiA8dWw+CisgKiA8bGk+PGI+ZGVidWc8L2I+IC0gVGhlIGRlYnVnZ2luZyBkZXRhaWwgbGV2ZWwgdGhhdCBjb250cm9scyB0aGUgYW1vdW50CisgKiAgICAgb2YgaW5mb3JtYXRpb24gdGhhdCBpcyBsb2dnZWQgYnkgdGhpcyBzZXJ2bGV0LiAgRGVmYXVsdCBpcyB6ZXJvLgorICogPC91bD4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEBhdXRob3IgUmVteSBNYXVjaGVyYXQKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIE1hbmFnZXJTZXJ2bGV0CisgICAgZXh0ZW5kcyBIdHRwU2VydmxldCBpbXBsZW1lbnRzIENvbnRhaW5lclNlcnZsZXQgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogUGF0aCB3aGVyZSBjb250ZXh0IGRlc2NyaXB0b3JzIHNob3VsZCBiZSBkZXBsb3llZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRmlsZSBjb25maWdCYXNlID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIENvbnRleHQgY29udGFpbmVyIGFzc29jaWF0ZWQgd2l0aCBvdXIgd2ViIGFwcGxpY2F0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCBDb250ZXh0IGNvbnRleHQgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVidWdnaW5nIGRldGFpbCBsZXZlbCBmb3IgdGhpcyBzZXJ2bGV0LgorICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgZGVidWcgPSAxOworCisKKyAgICAvKioKKyAgICAgKiBGaWxlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGRpcmVjdG9yeSBpbnRvIHdoaWNoIHRoZSBkZXBsb3koKSBjb21tYW5kCisgICAgICogd2lsbCBzdG9yZSB0aGUgV0FSIGFuZCBjb250ZXh0IGNvbmZpZ3VyYXRpb24gZmlsZXMgdGhhdCBoYXZlIGJlZW4KKyAgICAgKiB1cGxvYWRlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRmlsZSBkZXBsb3llZCA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFBhdGggdXNlZCB0byBzdG9yZSByZXZpc2lvbnMgb2Ygd2ViYXBwcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRmlsZSB2ZXJzaW9uZWQgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBQYXRoIHVzZWQgdG8gc3RvcmUgY29udGV4dCBkZXNjcmlwdG9ycy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRmlsZSBjb250ZXh0RGVzY3JpcHRvcnMgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgYXNzb2NpYXRlZCBob3N0LgorICAgICAqLworICAgIHByb3RlY3RlZCBIb3N0IGhvc3QgPSBudWxsOworCisgICAgCisgICAgLyoqCisgICAgICogVGhlIGhvc3QgYXBwQmFzZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRmlsZSBhcHBCYXNlID0gbnVsbDsKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBNQmVhbiBzZXJ2ZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIE1CZWFuU2VydmVyIG1CZWFuU2VydmVyID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIGFzc29jaWF0ZWQgZGVwbG95ZXIgT2JqZWN0TmFtZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgT2JqZWN0TmFtZSBvbmFtZSA9IG51bGw7CisgICAgCisKKyAgICAvKioKKyAgICAgKiBUaGUgZ2xvYmFsIEpOREkgPGNvZGU+TmFtaW5nQ29udGV4dDwvY29kZT4gZm9yIHRoaXMgc2VydmVyLAorICAgICAqIGlmIGF2YWlsYWJsZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgamF2YXgubmFtaW5nLkNvbnRleHQgZ2xvYmFsID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIHN0cmluZyBtYW5hZ2VyIGZvciB0aGlzIHBhY2thZ2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmdNYW5hZ2VyIHNtID0KKyAgICAgICAgU3RyaW5nTWFuYWdlci5nZXRNYW5hZ2VyKENvbnN0YW50cy5QYWNrYWdlKTsKKworCisgICAgLyoqCisgICAgICogVGhlIFdyYXBwZXIgY29udGFpbmVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNlcnZsZXQuCisgICAgICovCisgICAgcHJvdGVjdGVkIFdyYXBwZXIgd3JhcHBlciA9IG51bGw7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnRhaW5lclNlcnZsZXQgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIFdyYXBwZXIgd2l0aCB3aGljaCB3ZSBhcmUgYXNzb2NpYXRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgV3JhcHBlciBnZXRXcmFwcGVyKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy53cmFwcGVyKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBXcmFwcGVyIHdpdGggd2hpY2ggd2UgYXJlIGFzc29jaWF0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gd3JhcHBlciBUaGUgbmV3IHdyYXBwZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRXcmFwcGVyKFdyYXBwZXIgd3JhcHBlcikgeworCisgICAgICAgIHRoaXMud3JhcHBlciA9IHdyYXBwZXI7CisgICAgICAgIGlmICh3cmFwcGVyID09IG51bGwpIHsKKyAgICAgICAgICAgIGNvbnRleHQgPSBudWxsOworICAgICAgICAgICAgaG9zdCA9IG51bGw7CisgICAgICAgICAgICBvbmFtZSA9IG51bGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb250ZXh0ID0gKENvbnRleHQpIHdyYXBwZXIuZ2V0UGFyZW50KCk7CisgICAgICAgICAgICBob3N0ID0gKEhvc3QpIGNvbnRleHQuZ2V0UGFyZW50KCk7CisgICAgICAgICAgICBFbmdpbmUgZW5naW5lID0gKEVuZ2luZSkgaG9zdC5nZXRQYXJlbnQoKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgb25hbWUgPSBuZXcgT2JqZWN0TmFtZShlbmdpbmUuZ2V0TmFtZSgpIAorICAgICAgICAgICAgICAgICAgICAgICAgKyAiOnR5cGU9RGVwbG95ZXIsaG9zdD0iICsgaG9zdC5nZXROYW1lKCkpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyA/CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXRyaWV2ZSB0aGUgTUJlYW4gc2VydmVyCisgICAgICAgIG1CZWFuU2VydmVyID0gUmVnaXN0cnkuZ2V0UmVnaXN0cnkobnVsbCwgbnVsbCkuZ2V0TUJlYW5TZXJ2ZXIoKTsKKyAgICAgICAgCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogRmluYWxpemUgdGhpcyBzZXJ2bGV0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3koKSB7CisKKyAgICAgICAgOyAgICAgICAvLyBObyBhY3Rpb25zIG5lY2Vzc2FyeQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIGEgR0VUIHJlcXVlc3QgZm9yIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBzZXJ2bGV0IHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldC1zcGVjaWZpZWQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICAvLyBWZXJpZnkgdGhhdCB3ZSB3ZXJlIG5vdCBhY2Nlc3NlZCB1c2luZyB0aGUgaW52b2tlciBzZXJ2bGV0CisgICAgICAgIGlmIChyZXF1ZXN0LmdldEF0dHJpYnV0ZShHbG9iYWxzLklOVk9LRURfQVRUUikgIT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBVbmF2YWlsYWJsZUV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoIm1hbmFnZXJTZXJ2bGV0LmNhbm5vdEludm9rZSIpKTsKKworICAgICAgICAvLyBJZGVudGlmeSB0aGUgcmVxdWVzdCBwYXJhbWV0ZXJzIHRoYXQgd2UgbmVlZAorICAgICAgICBTdHJpbmcgY29tbWFuZCA9IHJlcXVlc3QuZ2V0UGF0aEluZm8oKTsKKyAgICAgICAgaWYgKGNvbW1hbmQgPT0gbnVsbCkKKyAgICAgICAgICAgIGNvbW1hbmQgPSByZXF1ZXN0LmdldFNlcnZsZXRQYXRoKCk7CisgICAgICAgIFN0cmluZyBjb25maWcgPSByZXF1ZXN0LmdldFBhcmFtZXRlcigiY29uZmlnIik7CisgICAgICAgIFN0cmluZyBwYXRoID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoInBhdGgiKTsKKyAgICAgICAgU3RyaW5nIHR5cGUgPSByZXF1ZXN0LmdldFBhcmFtZXRlcigidHlwZSIpOworICAgICAgICBTdHJpbmcgd2FyID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoIndhciIpOworICAgICAgICBTdHJpbmcgdGFnID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoInRhZyIpOworICAgICAgICBib29sZWFuIHVwZGF0ZSA9IGZhbHNlOworICAgICAgICBpZiAoKHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJ1cGRhdGUiKSAhPSBudWxsKSAKKyAgICAgICAgICAgICYmIChyZXF1ZXN0LmdldFBhcmFtZXRlcigidXBkYXRlIikuZXF1YWxzKCJ0cnVlIikpKSB7CisgICAgICAgICAgICB1cGRhdGUgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8gUHJlcGFyZSBvdXIgb3V0cHV0IHdyaXRlciB0byBnZW5lcmF0ZSB0aGUgcmVzcG9uc2UgbWVzc2FnZQorICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9wbGFpbjsgY2hhcnNldD0iICsgQ29uc3RhbnRzLkNIQVJTRVQpOworICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSByZXNwb25zZS5nZXRXcml0ZXIoKTsKKworICAgICAgICAvLyBQcm9jZXNzIHRoZSByZXF1ZXN0ZWQgY29tbWFuZCAobm90ZSAtICIvZGVwbG95IiBpcyBub3QgbGlzdGVkIGhlcmUpCisgICAgICAgIGlmIChjb21tYW5kID09IG51bGwpIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKHNtLmdldFN0cmluZygibWFuYWdlclNlcnZsZXQubm9Db21tYW5kIikpOworICAgICAgICB9IGVsc2UgaWYgKGNvbW1hbmQuZXF1YWxzKCIvZGVwbG95IikpIHsKKyAgICAgICAgICAgIGlmICh3YXIgIT0gbnVsbCB8fCBjb25maWcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGRlcGxveSh3cml0ZXIsIGNvbmZpZywgcGF0aCwgd2FyLCB1cGRhdGUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkZXBsb3kod3JpdGVyLCBwYXRoLCB0YWcpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGNvbW1hbmQuZXF1YWxzKCIvaW5zdGFsbCIpKSB7CisgICAgICAgICAgICAvLyBEZXByZWNhdGVkCisgICAgICAgICAgICBkZXBsb3kod3JpdGVyLCBjb25maWcsIHBhdGgsIHdhciwgZmFsc2UpOworICAgICAgICB9IGVsc2UgaWYgKGNvbW1hbmQuZXF1YWxzKCIvbGlzdCIpKSB7CisgICAgICAgICAgICBsaXN0KHdyaXRlcik7CisgICAgICAgIH0gZWxzZSBpZiAoY29tbWFuZC5lcXVhbHMoIi9yZWxvYWQiKSkgeworICAgICAgICAgICAgcmVsb2FkKHdyaXRlciwgcGF0aCk7CisgICAgICAgIH0gZWxzZSBpZiAoY29tbWFuZC5lcXVhbHMoIi9yZW1vdmUiKSkgeworICAgICAgICAgICAgLy8gRGVwcmVjYXRlZAorICAgICAgICAgICAgcmVtb3ZlKHdyaXRlciwgcGF0aCk7CisgICAgICAgIH0gZWxzZSBpZiAoY29tbWFuZC5lcXVhbHMoIi9yZXNvdXJjZXMiKSkgeworICAgICAgICAgICAgcmVzb3VyY2VzKHdyaXRlciwgdHlwZSk7CisgICAgICAgIH0gZWxzZSBpZiAoY29tbWFuZC5lcXVhbHMoIi9yb2xlcyIpKSB7CisgICAgICAgICAgICByb2xlcyh3cml0ZXIpOworICAgICAgICB9IGVsc2UgaWYgKGNvbW1hbmQuZXF1YWxzKCIvc2F2ZSIpKSB7CisgICAgICAgICAgICBzYXZlKHdyaXRlciwgcGF0aCk7CisgICAgICAgIH0gZWxzZSBpZiAoY29tbWFuZC5lcXVhbHMoIi9zZXJ2ZXJpbmZvIikpIHsKKyAgICAgICAgICAgIHNlcnZlcmluZm8od3JpdGVyKTsKKyAgICAgICAgfSBlbHNlIGlmIChjb21tYW5kLmVxdWFscygiL3Nlc3Npb25zIikpIHsKKyAgICAgICAgICAgIHNlc3Npb25zKHdyaXRlciwgcGF0aCk7CisgICAgICAgIH0gZWxzZSBpZiAoY29tbWFuZC5lcXVhbHMoIi9zdGFydCIpKSB7CisgICAgICAgICAgICBzdGFydCh3cml0ZXIsIHBhdGgpOworICAgICAgICB9IGVsc2UgaWYgKGNvbW1hbmQuZXF1YWxzKCIvc3RvcCIpKSB7CisgICAgICAgICAgICBzdG9wKHdyaXRlciwgcGF0aCk7CisgICAgICAgIH0gZWxzZSBpZiAoY29tbWFuZC5lcXVhbHMoIi91bmRlcGxveSIpKSB7CisgICAgICAgICAgICB1bmRlcGxveSh3cml0ZXIsIHBhdGgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oc20uZ2V0U3RyaW5nKCJtYW5hZ2VyU2VydmxldC51bmtub3duQ29tbWFuZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gRmluaXNoIHVwIHRoZSByZXNwb25zZQorICAgICAgICB3cml0ZXIuZmx1c2goKTsKKyAgICAgICAgd3JpdGVyLmNsb3NlKCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgYSBQVVQgcmVxdWVzdCBmb3IgdGhlIHNwZWNpZmllZCByZXNvdXJjZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIHNlcnZsZXQgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0LXNwZWNpZmllZCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkb1B1dChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIC8vIFZlcmlmeSB0aGF0IHdlIHdlcmUgbm90IGFjY2Vzc2VkIHVzaW5nIHRoZSBpbnZva2VyIHNlcnZsZXQKKyAgICAgICAgaWYgKHJlcXVlc3QuZ2V0QXR0cmlidXRlKEdsb2JhbHMuSU5WT0tFRF9BVFRSKSAhPSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IFVuYXZhaWxhYmxlRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygibWFuYWdlclNlcnZsZXQuY2Fubm90SW52b2tlIikpOworCisgICAgICAgIC8vIElkZW50aWZ5IHRoZSByZXF1ZXN0IHBhcmFtZXRlcnMgdGhhdCB3ZSBuZWVkCisgICAgICAgIFN0cmluZyBjb21tYW5kID0gcmVxdWVzdC5nZXRQYXRoSW5mbygpOworICAgICAgICBpZiAoY29tbWFuZCA9PSBudWxsKQorICAgICAgICAgICAgY29tbWFuZCA9IHJlcXVlc3QuZ2V0U2VydmxldFBhdGgoKTsKKyAgICAgICAgU3RyaW5nIHBhdGggPSByZXF1ZXN0LmdldFBhcmFtZXRlcigicGF0aCIpOworICAgICAgICBTdHJpbmcgdGFnID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoInRhZyIpOworICAgICAgICBib29sZWFuIHVwZGF0ZSA9IGZhbHNlOworICAgICAgICBpZiAoKHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJ1cGRhdGUiKSAhPSBudWxsKSAKKyAgICAgICAgICAgICYmIChyZXF1ZXN0LmdldFBhcmFtZXRlcigidXBkYXRlIikuZXF1YWxzKCJ0cnVlIikpKSB7CisgICAgICAgICAgICB1cGRhdGUgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8gUHJlcGFyZSBvdXIgb3V0cHV0IHdyaXRlciB0byBnZW5lcmF0ZSB0aGUgcmVzcG9uc2UgbWVzc2FnZQorICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9wbGFpbjtjaGFyc2V0PSIrQ29uc3RhbnRzLkNIQVJTRVQpOworICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSByZXNwb25zZS5nZXRXcml0ZXIoKTsKKworICAgICAgICAvLyBQcm9jZXNzIHRoZSByZXF1ZXN0ZWQgY29tbWFuZAorICAgICAgICBpZiAoY29tbWFuZCA9PSBudWxsKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihzbS5nZXRTdHJpbmcoIm1hbmFnZXJTZXJ2bGV0Lm5vQ29tbWFuZCIpKTsKKyAgICAgICAgfSBlbHNlIGlmIChjb21tYW5kLmVxdWFscygiL2RlcGxveSIpKSB7CisgICAgICAgICAgICBkZXBsb3kod3JpdGVyLCBwYXRoLCB0YWcsIHVwZGF0ZSwgcmVxdWVzdCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihzbS5nZXRTdHJpbmcoIm1hbmFnZXJTZXJ2bGV0LnVua25vd25Db21tYW5kIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBGaW5pc2ggdXAgdGhlIHJlc3BvbnNlCisgICAgICAgIHdyaXRlci5mbHVzaCgpOworICAgICAgICB3cml0ZXIuY2xvc2UoKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSB0aGlzIHNlcnZsZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgaW5pdCgpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICAvLyBFbnN1cmUgdGhhdCBvdXIgQ29udGFpbmVyU2VydmxldCBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBzZXQKKyAgICAgICAgaWYgKCh3cmFwcGVyID09IG51bGwpIHx8IChjb250ZXh0ID09IG51bGwpKQorICAgICAgICAgICAgdGhyb3cgbmV3IFVuYXZhaWxhYmxlRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygibWFuYWdlclNlcnZsZXQubm9XcmFwcGVyIikpOworCisgICAgICAgIC8vIFZlcmlmeSB0aGF0IHdlIHdlcmUgbm90IGFjY2Vzc2VkIHVzaW5nIHRoZSBpbnZva2VyIHNlcnZsZXQKKyAgICAgICAgU3RyaW5nIHNlcnZsZXROYW1lID0gZ2V0U2VydmxldENvbmZpZygpLmdldFNlcnZsZXROYW1lKCk7CisgICAgICAgIGlmIChzZXJ2bGV0TmFtZSA9PSBudWxsKQorICAgICAgICAgICAgc2VydmxldE5hbWUgPSAiIjsKKyAgICAgICAgaWYgKHNlcnZsZXROYW1lLnN0YXJ0c1dpdGgoIm9yZy5hcGFjaGUuY2F0YWxpbmEuSU5WT0tFUi4iKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBVbmF2YWlsYWJsZUV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoIm1hbmFnZXJTZXJ2bGV0LmNhbm5vdEludm9rZSIpKTsKKworICAgICAgICAvLyBTZXQgb3VyIHByb3BlcnRpZXMgZnJvbSB0aGUgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycworICAgICAgICBTdHJpbmcgdmFsdWUgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdmFsdWUgPSBnZXRTZXJ2bGV0Q29uZmlnKCkuZ2V0SW5pdFBhcmFtZXRlcigiZGVidWciKTsKKyAgICAgICAgICAgIGRlYnVnID0gSW50ZWdlci5wYXJzZUludCh2YWx1ZSk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICA7CisgICAgICAgIH0KKworICAgICAgICAvLyBBY3F1aXJlIGdsb2JhbCBKTkRJIHJlc291cmNlcyBpZiBhdmFpbGFibGUKKyAgICAgICAgU2VydmVyIHNlcnZlciA9IFNlcnZlckZhY3RvcnkuZ2V0U2VydmVyKCk7CisgICAgICAgIGlmICgoc2VydmVyICE9IG51bGwpICYmIChzZXJ2ZXIgaW5zdGFuY2VvZiBTdGFuZGFyZFNlcnZlcikpIHsKKyAgICAgICAgICAgIGdsb2JhbCA9ICgoU3RhbmRhcmRTZXJ2ZXIpIHNlcnZlcikuZ2V0R2xvYmFsTmFtaW5nQ29udGV4dCgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBkaXJlY3RvcnkgaW50byB3aGljaCB3ZSB3aWxsIGJlIGRlcGxveWluZyBhcHBsaWNhdGlvbnMKKyAgICAgICAgdmVyc2lvbmVkID0gKEZpbGUpIGdldFNlcnZsZXRDb250ZXh0KCkuZ2V0QXR0cmlidXRlCisgICAgICAgICAgICAoImphdmF4LnNlcnZsZXQuY29udGV4dC50ZW1wZGlyIik7CisKKyAgICAgICAgLy8gSWRlbnRpZnkgdGhlIGFwcEJhc2Ugb2YgdGhlIG93bmluZyBIb3N0IG9mIHRoaXMgQ29udGV4dAorICAgICAgICAvLyAoaWYgYW55KQorICAgICAgICBTdHJpbmcgYXBwQmFzZSA9ICgoSG9zdCkgY29udGV4dC5nZXRQYXJlbnQoKSkuZ2V0QXBwQmFzZSgpOworICAgICAgICBkZXBsb3llZCA9IG5ldyBGaWxlKGFwcEJhc2UpOworICAgICAgICBpZiAoIWRlcGxveWVkLmlzQWJzb2x1dGUoKSkgeworICAgICAgICAgICAgZGVwbG95ZWQgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImNhdGFsaW5hLmJhc2UiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwQmFzZSk7CisgICAgICAgIH0KKyAgICAgICAgY29uZmlnQmFzZSA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2F0YWxpbmEuYmFzZSIpLCAiY29uZiIpOworICAgICAgICBDb250YWluZXIgY29udGFpbmVyID0gY29udGV4dDsKKyAgICAgICAgQ29udGFpbmVyIGhvc3QgPSBudWxsOworICAgICAgICBDb250YWluZXIgZW5naW5lID0gbnVsbDsKKyAgICAgICAgd2hpbGUgKGNvbnRhaW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgSG9zdCkKKyAgICAgICAgICAgICAgICBob3N0ID0gY29udGFpbmVyOworICAgICAgICAgICAgaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIEVuZ2luZSkKKyAgICAgICAgICAgICAgICBlbmdpbmUgPSBjb250YWluZXI7CisgICAgICAgICAgICBjb250YWluZXIgPSBjb250YWluZXIuZ2V0UGFyZW50KCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVuZ2luZSAhPSBudWxsKSB7CisgICAgICAgICAgICBjb25maWdCYXNlID0gbmV3IEZpbGUoY29uZmlnQmFzZSwgZW5naW5lLmdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGhvc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgY29uZmlnQmFzZSA9IG5ldyBGaWxlKGNvbmZpZ0Jhc2UsIGhvc3QuZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICAvLyBOb3RlOiBUaGUgZGlyZWN0b3J5IG11c3QgZXhpc3QgZm9yIHRoaXMgdG8gd29yay4KKworICAgICAgICAvLyBMb2cgZGVidWdnaW5nIG1lc3NhZ2VzIGFzIG5lY2Vzc2FyeQorICAgICAgICBpZiAoZGVidWcgPj0gMSkgeworICAgICAgICAgICAgbG9nKCJpbml0OiBBc3NvY2lhdGVkIHdpdGggRGVwbG95ZXIgJyIgKworICAgICAgICAgICAgICAgIG9uYW1lICsgIiciKTsKKyAgICAgICAgICAgIGlmIChnbG9iYWwgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGxvZygiaW5pdDogR2xvYmFsIHJlc291cmNlcyBhcmUgYXZhaWxhYmxlIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcml2YXRlIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogU3RvcmUgc2VydmVyIGNvbmZpZ3VyYXRpb24uCisgICAgICogCisgICAgICogQHBhcmFtIHBhdGggT3B0aW9uYWwgY29udGV4dCBwYXRoIHRvIHNhdmUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgc2F2ZShQcmludFdyaXRlciB3cml0ZXIsIFN0cmluZyBwYXRoKSB7CisKKyAgICAgICAgU2VydmVyIHNlcnZlciA9IFNlcnZlckZhY3RvcnkuZ2V0U2VydmVyKCk7CisKKyAgICAgICAgaWYgKCEoc2VydmVyIGluc3RhbmNlb2YgU3RhbmRhcmRTZXJ2ZXIpKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihzbS5nZXRTdHJpbmcoIm1hbmFnZXJTZXJ2bGV0LnNhdmVGYWlsIiwgc2VydmVyKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoKHBhdGggPT0gbnVsbCkgfHwgcGF0aC5sZW5ndGgoKSA9PSAwIHx8ICFwYXRoLnN0YXJ0c1dpdGgoIi8iKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAoKFN0YW5kYXJkU2VydmVyKSBzZXJ2ZXIpLnN0b3JlQ29uZmlnKCk7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oc20uZ2V0U3RyaW5nKCJtYW5hZ2VyU2VydmxldC5zYXZlZCIpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgbG9nKCJtYW5hZ2VyU2VydmxldC5zdG9yZUNvbmZpZyIsIGUpOworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKHNtLmdldFN0cmluZygibWFuYWdlclNlcnZsZXQuZXhjZXB0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS50b1N0cmluZygpKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU3RyaW5nIGNvbnRleHRQYXRoID0gcGF0aDsKKyAgICAgICAgICAgIGlmIChwYXRoLmVxdWFscygiLyIpKSB7CisgICAgICAgICAgICAgICAgY29udGV4dFBhdGggPSAiIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnRleHQgY29udGV4dCA9IChDb250ZXh0KSBob3N0LmZpbmRDaGlsZChjb250ZXh0UGF0aCk7CisgICAgICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oc20uZ2V0U3RyaW5nKCJtYW5hZ2VyU2VydmxldC5ub0NvbnRleHQiLCBwYXRoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAoKFN0YW5kYXJkU2VydmVyKSBzZXJ2ZXIpLnN0b3JlQ29udGV4dChjb250ZXh0KTsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihzbS5nZXRTdHJpbmcoIm1hbmFnZXJTZXJ2bGV0LnNhdmVkQ29udGV4dCIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgbG9nKCJtYW5hZ2VyU2VydmxldC5zYXZlWyIgKyBwYXRoICsgIl0iLCBlKTsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihzbS5nZXRTdHJpbmcoIm1hbmFnZXJTZXJ2bGV0LmV4Y2VwdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUudG9TdHJpbmcoKSkpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBEZXBsb3kgYSB3ZWIgYXBwbGljYXRpb24gYXJjaGl2ZSAoaW5jbHVkZWQgaW4gdGhlIGN1cnJlbnQgcmVxdWVzdCkKKyAgICAgKiBhdCB0aGUgc3BlY2lmaWVkIGNvbnRleHQgcGF0aC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB3cml0ZXIgV3JpdGVyIHRvIHJlbmRlciByZXN1bHRzIHRvCisgICAgICogQHBhcmFtIHBhdGggQ29udGV4dCBwYXRoIG9mIHRoZSBhcHBsaWNhdGlvbiB0byBiZSBpbnN0YWxsZWQKKyAgICAgKiBAcGFyYW0gdGFnIFRhZyB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIHdlYmFwcAorICAgICAqIEBwYXJhbSByZXF1ZXN0IFNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqLworICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBkZXBsb3kKKyAgICAgICAgKFByaW50V3JpdGVyIHdyaXRlciwgU3RyaW5nIHBhdGgsCisgICAgICAgICBTdHJpbmcgdGFnLCBib29sZWFuIHVwZGF0ZSwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKworICAgICAgICBpZiAoZGVidWcgPj0gMSkgeworICAgICAgICAgICAgbG9nKCJkZXBsb3k6IERlcGxveWluZyB3ZWIgYXBwbGljYXRpb24gYXQgJyIgKyBwYXRoICsgIiciKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFZhbGlkYXRlIHRoZSByZXF1ZXN0ZWQgY29udGV4dCBwYXRoCisgICAgICAgIGlmICgocGF0aCA9PSBudWxsKSB8fCBwYXRoLmxlbmd0aCgpID09IDAgfHwgIXBhdGguc3RhcnRzV2l0aCgiLyIpKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihzbS5nZXRTdHJpbmcoIm1hbmFnZXJTZXJ2bGV0LmludmFsaWRQYXRoIiwgcGF0aCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBkaXNwbGF5UGF0aCA9IHBhdGg7CisgICAgICAgIGlmKCBwYXRoLmVxdWFscygiLyIpICkKKyAgICAgICAgICAgIHBhdGggPSAiIjsKKyAgICAgICAgU3RyaW5nIGJhc2VuYW1lID0gZ2V0RG9jQmFzZShwYXRoKTsKKworICAgICAgICAvLyBDaGVjayBpZiBhcHAgYWxyZWFkeSBleGlzdHMsIG9yIHVuZGVwbG95IGl0IGlmIHVwZGF0aW5nCisgICAgICAgIENvbnRleHQgY29udGV4dCA9IChDb250ZXh0KSBob3N0LmZpbmRDaGlsZChwYXRoKTsKKyAgICAgICAgaWYgKHVwZGF0ZSkgeworICAgICAgICAgICAgaWYgKGNvbnRleHQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHVuZGVwbG95KHdyaXRlciwgZGlzcGxheVBhdGgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udGV4dCA9IChDb250ZXh0KSBob3N0LmZpbmRDaGlsZChwYXRoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY29udGV4dCAhPSBudWxsKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbgorICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoIm1hbmFnZXJTZXJ2bGV0LmFscmVhZHlDb250ZXh0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlQYXRoKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIGJhc2UgcGF0aAorICAgICAgICBGaWxlIGRlcGxveWVkUGF0aCA9IGRlcGxveWVkOworICAgICAgICBpZiAodGFnICE9IG51bGwpIHsKKyAgICAgICAgICAgIGRlcGxveWVkUGF0aCA9IG5ldyBGaWxlKHZlcnNpb25lZCwgdGFnKTsKKyAgICAgICAgICAgIGRlcGxveWVkUGF0aC5ta2RpcnMoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFVwbG9hZCB0aGUgd2ViIGFwcGxpY2F0aW9uIGFyY2hpdmUgdG8gYSBsb2NhbCBXQVIgZmlsZQorICAgICAgICBGaWxlIGxvY2FsV2FyID0gbmV3IEZpbGUoZGVwbG95ZWRQYXRoLCBiYXNlbmFtZSArICIud2FyIik7CisgICAgICAgIGlmIChkZWJ1ZyA+PSAyKSB7CisgICAgICAgICAgICBsb2coIlVwbG9hZGluZyBXQVIgZmlsZSB0byAiICsgbG9jYWxXYXIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ29weSBXQVIgdG8gYXBwQmFzZQorICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKCFpc1NlcnZpY2VkKHBhdGgpKSB7CisgICAgICAgICAgICAgICAgYWRkU2VydmljZWQocGF0aCk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVXBsb2FkIFdBUgorICAgICAgICAgICAgICAgICAgICB1cGxvYWRXYXIocmVxdWVzdCwgbG9jYWxXYXIpOworICAgICAgICAgICAgICAgICAgICAvLyBDb3B5IFdBUiBhbmQgWE1MIHRvIHRoZSBob3N0IGFwcCBiYXNlIGlmIG5lZWRlZAorICAgICAgICAgICAgICAgICAgICBpZiAodGFnICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlcGxveWVkUGF0aCA9IGRlcGxveWVkOworICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSBsb2NhbFdhckNvcHkgPSBuZXcgRmlsZShkZXBsb3llZFBhdGgsIGJhc2VuYW1lICsgIi53YXIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvcHkobG9jYWxXYXIsIGxvY2FsV2FyQ29weSk7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFdhciA9IGxvY2FsV2FyQ29weTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvcHkobG9jYWxXYXIsIG5ldyBGaWxlKGdldEFwcEJhc2UoKSwgYmFzZW5hbWUgKyAiLndhciIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBQZXJmb3JtIG5ldyBkZXBsb3ltZW50CisgICAgICAgICAgICAgICAgICAgIGNoZWNrKHBhdGgpOworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIHJlbW92ZVNlcnZpY2VkKHBhdGgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZygibWFuYWdlclNlcnZsZXQuY2hlY2tbIiArIGRpc3BsYXlQYXRoICsgIl0iLCBlKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKHNtLmdldFN0cmluZygibWFuYWdlclNlcnZsZXQuZXhjZXB0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnRvU3RyaW5nKCkpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgY29udGV4dCA9IChDb250ZXh0KSBob3N0LmZpbmRDaGlsZChwYXRoKTsKKyAgICAgICAgaWYgKGNvbnRleHQgIT0gbnVsbCkgeworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oc20uZ2V0U3RyaW5nKCJtYW5hZ2VyU2VydmxldC5kZXBsb3llZCIsIGRpc3BsYXlQYXRoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBTb21ldGhpbmcgZmFpbGVkCisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihzbS5nZXRTdHJpbmcoIm1hbmFnZXJTZXJ2bGV0LmRlcGxveUZhaWxlZCIsIGRpc3BsYXlQYXRoKSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBJbnN0YWxsIGFuIGFwcGxpY2F0aW9uIGZvciB0aGUgc3BlY2lmaWVkIHBhdGggZnJvbSB0aGUgc3BlY2lmaWVkCisgICAgICogd2ViIGFwcGxpY2F0aW9uIGFyY2hpdmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gd3JpdGVyIFdyaXRlciB0byByZW5kZXIgcmVzdWx0cyB0bworICAgICAqIEBwYXJhbSB0YWcgUmV2aXNpb24gdGFnIHRvIGRlcGxveSBmcm9tCisgICAgICogQHBhcmFtIHBhdGggQ29udGV4dCBwYXRoIG9mIHRoZSBhcHBsaWNhdGlvbiB0byBiZSBpbnN0YWxsZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBkZXBsb3koUHJpbnRXcml0ZXIgd3JpdGVyLCBTdHJpbmcgcGF0aCwgU3RyaW5nIHRhZykgeworCisgICAgICAgIC8vIFZhbGlkYXRlIHRoZSByZXF1ZXN0ZWQgY29udGV4dCBwYXRoCisgICAgICAgIGlmICgocGF0aCA9PSBudWxsKSB8fCBwYXRoLmxlbmd0aCgpID09IDAgfHwgIXBhdGguc3RhcnRzV2l0aCgiLyIpKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihzbS5nZXRTdHJpbmcoIm1hbmFnZXJTZXJ2bGV0LmludmFsaWRQYXRoIiwgcGF0aCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBkaXNwbGF5UGF0aCA9IHBhdGg7CisgICAgICAgIGlmKCBwYXRoLmVxdWFscygiLyIpICkKKyAgICAgICAgICAgIHBhdGggPSAiIjsKKworICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIGJhc2UgcGF0aAorICAgICAgICBGaWxlIGRlcGxveWVkUGF0aCA9IHZlcnNpb25lZDsKKyAgICAgICAgaWYgKHRhZyAhPSBudWxsKSB7CisgICAgICAgICAgICBkZXBsb3llZFBhdGggPSBuZXcgRmlsZShkZXBsb3llZFBhdGgsIHRhZyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBGaW5kIHRoZSBsb2NhbCBXQVIgZmlsZQorICAgICAgICBGaWxlIGxvY2FsV2FyID0gbmV3IEZpbGUoZGVwbG95ZWRQYXRoLCBnZXREb2NCYXNlKHBhdGgpICsgIi53YXIiKTsKKyAgICAgICAgLy8gRmluZCB0aGUgbG9jYWwgY29udGV4dCBkZXBsb3ltZW50IGZpbGUgKGlmIGFueSkKKyAgICAgICAgRmlsZSBsb2NhbFhtbCA9IG5ldyBGaWxlKGNvbmZpZ0Jhc2UsIGdldENvbmZpZ0ZpbGUocGF0aCkgKyAiLnhtbCIpOworCisgICAgICAgIC8vIENoZWNrIGlmIGFwcCBhbHJlYWR5IGV4aXN0cywgb3IgdW5kZXBsb3kgaXQgaWYgdXBkYXRpbmcKKyAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gKENvbnRleHQpIGhvc3QuZmluZENoaWxkKHBhdGgpOworICAgICAgICBpZiAoY29udGV4dCAhPSBudWxsKSB7CisgICAgICAgICAgICB1bmRlcGxveSh3cml0ZXIsIGRpc3BsYXlQYXRoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENvcHkgV0FSIHRvIGFwcEJhc2UKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICghaXNTZXJ2aWNlZChwYXRoKSkgeworICAgICAgICAgICAgICAgIGFkZFNlcnZpY2VkKHBhdGgpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGNvcHkobG9jYWxXYXIsIG5ldyBGaWxlKGdldEFwcEJhc2UoKSwgZ2V0RG9jQmFzZShwYXRoKSArICIud2FyIikpOworICAgICAgICAgICAgICAgICAgICAvLyBQZXJmb3JtIG5ldyBkZXBsb3ltZW50CisgICAgICAgICAgICAgICAgICAgIGNoZWNrKHBhdGgpOworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIHJlbW92ZVNlcnZpY2VkKHBhdGgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZygibWFuYWdlclNlcnZsZXQuY2hlY2tbIiArIGRpc3BsYXlQYXRoICsgIl0iLCBlKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKHNtLmdldFN0cmluZygibWFuYWdlclNlcnZsZXQuZXhjZXB0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnRvU3RyaW5nKCkpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgY29udGV4dCA9IChDb250ZXh0KSBob3N0LmZpbmRDaGlsZChwYXRoKTsKKyAgICAgICAgaWYgKGNvbnRleHQgIT0gbnVsbCkgeworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oc20uZ2V0U3RyaW5nKCJtYW5hZ2VyU2VydmxldC5kZXBsb3llZCIsIGRpc3BsYXlQYXRoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBTb21ldGhpbmcgZmFpbGVkCisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihzbS5nZXRTdHJpbmcoIm1hbmFnZXJTZXJ2bGV0LmRlcGxveUZhaWxlZCIsIGRpc3BsYXlQYXRoKSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBJbnN0YWxsIGFuIGFwcGxpY2F0aW9uIGZvciB0aGUgc3BlY2lmaWVkIHBhdGggZnJvbSB0aGUgc3BlY2lmaWVkCisgICAgICogd2ViIGFwcGxpY2F0aW9uIGFyY2hpdmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gd3JpdGVyIFdyaXRlciB0byByZW5kZXIgcmVzdWx0cyB0bworICAgICAqIEBwYXJhbSBjb25maWcgVVJMIG9mIHRoZSBjb250ZXh0IGNvbmZpZ3VyYXRpb24gZmlsZSB0byBiZSBpbnN0YWxsZWQKKyAgICAgKiBAcGFyYW0gcGF0aCBDb250ZXh0IHBhdGggb2YgdGhlIGFwcGxpY2F0aW9uIHRvIGJlIGluc3RhbGxlZAorICAgICAqIEBwYXJhbSB3YXIgVVJMIG9mIHRoZSB3ZWIgYXBwbGljYXRpb24gYXJjaGl2ZSB0byBiZSBpbnN0YWxsZWQKKyAgICAgKiBAcGFyYW0gdXBkYXRlIHRydWUgdG8gb3ZlcnJpZGUgYW55IGV4aXN0aW5nIHdlYmFwcCBvbiB0aGUgcGF0aAorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGRlcGxveShQcmludFdyaXRlciB3cml0ZXIsIFN0cmluZyBjb25maWcsCisgICAgICAgICAgICBTdHJpbmcgcGF0aCwgU3RyaW5nIHdhciwgYm9vbGVhbiB1cGRhdGUpIHsKKyAgICAgICAgCisgICAgICAgIGlmICh3YXIgIT0gbnVsbCAmJiB3YXIubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgd2FyID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKGRlYnVnID49IDEpIHsKKyAgICAgICAgICAgIGlmIChjb25maWcgIT0gbnVsbCAmJiBjb25maWcubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgaWYgKHdhciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZygiaW5zdGFsbDogSW5zdGFsbGluZyBjb250ZXh0IGNvbmZpZ3VyYXRpb24gYXQgJyIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZyArICInIGZyb20gJyIgKyB3YXIgKyAiJyIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGxvZygiaW5zdGFsbDogSW5zdGFsbGluZyBjb250ZXh0IGNvbmZpZ3VyYXRpb24gYXQgJyIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZyArICInIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAocGF0aCAhPSBudWxsICYmIHBhdGgubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZygiaW5zdGFsbDogSW5zdGFsbGluZyB3ZWIgYXBwbGljYXRpb24gYXQgJyIgKyBwYXRoICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJyBmcm9tICciICsgd2FyICsgIiciKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBsb2coImluc3RhbGw6IEluc3RhbGxpbmcgd2ViIGFwcGxpY2F0aW9uIGZyb20gJyIgKyB3YXIgKyAiJyIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKHBhdGggPT0gbnVsbCB8fCBwYXRoLmxlbmd0aCgpID09IDAgfHwgIXBhdGguc3RhcnRzV2l0aCgiLyIpKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihzbS5nZXRTdHJpbmcoIm1hbmFnZXJTZXJ2bGV0LmludmFsaWRQYXRoIiwKKyAgICAgICAgICAgICAgICAgICAgcGF0aCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBkaXNwbGF5UGF0aCA9IHBhdGg7CisgICAgICAgIGlmKCIvIi5lcXVhbHMocGF0aCkpIHsKKyAgICAgICAgICAgIHBhdGggPSAiIjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gQ2hlY2sgaWYgYXBwIGFscmVhZHkgZXhpc3RzLCBvciB1bmRlcGxveSBpdCBpZiB1cGRhdGluZworICAgICAgICBDb250ZXh0IGNvbnRleHQgPSAoQ29udGV4dCkgaG9zdC5maW5kQ2hpbGQocGF0aCk7CisgICAgICAgIGlmICh1cGRhdGUpIHsKKyAgICAgICAgICAgIGlmIChjb250ZXh0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB1bmRlcGxveSh3cml0ZXIsIGRpc3BsYXlQYXRoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRleHQgPSAoQ29udGV4dCkgaG9zdC5maW5kQ2hpbGQocGF0aCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvbnRleHQgIT0gbnVsbCkgeworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4KKyAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoIm1hbmFnZXJTZXJ2bGV0LmFscmVhZHlDb250ZXh0IiwKKyAgICAgICAgICAgICAgICAgICAgZGlzcGxheVBhdGgpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKGNvbmZpZyAhPSBudWxsICYmIChjb25maWcuc3RhcnRzV2l0aCgiZmlsZToiKSkpIHsKKyAgICAgICAgICAgIGNvbmZpZyA9IGNvbmZpZy5zdWJzdHJpbmcoImZpbGU6Ii5sZW5ndGgoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHdhciAhPSBudWxsICYmICh3YXIuc3RhcnRzV2l0aCgiZmlsZToiKSkpIHsKKyAgICAgICAgICAgIHdhciA9IHdhci5zdWJzdHJpbmcoImZpbGU6Ii5sZW5ndGgoKSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoIWlzU2VydmljZWQocGF0aCkpIHsKKyAgICAgICAgICAgICAgICBhZGRTZXJ2aWNlZChwYXRoKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvcHkobmV3IEZpbGUoY29uZmlnKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKGNvbmZpZ0Jhc2UsIGdldENvbmZpZ0ZpbGUocGF0aCkgKyAiLnhtbCIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAod2FyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3YXIuZW5kc1dpdGgoIi53YXIiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcHkobmV3IEZpbGUod2FyKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZShnZXRBcHBCYXNlKCksIGdldERvY0Jhc2UocGF0aCkgKyAiLndhciIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weShuZXcgRmlsZSh3YXIpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKGdldEFwcEJhc2UoKSwgZ2V0RG9jQmFzZShwYXRoKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIFBlcmZvcm0gbmV3IGRlcGxveW1lbnQKKyAgICAgICAgICAgICAgICAgICAgY2hlY2socGF0aCk7CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgcmVtb3ZlU2VydmljZWQocGF0aCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oc20uZ2V0U3RyaW5nKCJtYW5hZ2VyU2VydmxldC5kZXBsb3llZCIsCisgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlQYXRoKSk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICBsb2coIk1hbmFnZXJTZXJ2bGV0Lmluc3RhbGxbIiArIGRpc3BsYXlQYXRoICsgIl0iLCB0KTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKHNtLmdldFN0cmluZygibWFuYWdlclNlcnZsZXQuZXhjZXB0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgdC50b1N0cmluZygpKSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW5kZXIgYSBsaXN0IG9mIHRoZSBjdXJyZW50bHkgYWN0aXZlIENvbnRleHRzIGluIG91ciB2aXJ0dWFsIGhvc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gd3JpdGVyIFdyaXRlciB0byByZW5kZXIgdG8KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBsaXN0KFByaW50V3JpdGVyIHdyaXRlcikgeworCisgICAgICAgIGlmIChkZWJ1ZyA+PSAxKQorICAgICAgICAgICAgbG9nKCJsaXN0OiBMaXN0aW5nIGNvbnRleHRzIGZvciB2aXJ0dWFsIGhvc3QgJyIgKworICAgICAgICAgICAgICAgIGhvc3QuZ2V0TmFtZSgpICsgIiciKTsKKworICAgICAgICB3cml0ZXIucHJpbnRsbihzbS5nZXRTdHJpbmcoIm1hbmFnZXJTZXJ2bGV0Lmxpc3RlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3N0LmdldE5hbWUoKSkpOworICAgICAgICBDb250YWluZXJbXSBjb250ZXh0cyA9IGhvc3QuZmluZENoaWxkcmVuKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29udGV4dHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIENvbnRleHQgY29udGV4dCA9IChDb250ZXh0KSBjb250ZXh0c1tpXTsKKyAgICAgICAgICAgIFN0cmluZyBkaXNwbGF5UGF0aCA9IGNvbnRleHQuZ2V0UGF0aCgpOworICAgICAgICAgICAgaWYoIGRpc3BsYXlQYXRoLmVxdWFscygiIikgKQorICAgICAgICAgICAgICAgIGRpc3BsYXlQYXRoID0gIi8iOworICAgICAgICAgICAgaWYgKGNvbnRleHQgIT0gbnVsbCApIHsKKyAgICAgICAgICAgICAgICBpZiAoY29udGV4dC5nZXRBdmFpbGFibGUoKSkgeworICAgICAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihzbS5nZXRTdHJpbmcoIm1hbmFnZXJTZXJ2bGV0Lmxpc3RpdGVtIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJ1bm5pbmciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiArIGNvbnRleHQuZ2V0TWFuYWdlcigpLmZpbmRTZXNzaW9ucygpLmxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0RG9jQmFzZSgpKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oc20uZ2V0U3RyaW5nKCJtYW5hZ2VyU2VydmxldC5saXN0aXRlbSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5UGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdG9wcGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0RG9jQmFzZSgpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZWxvYWQgdGhlIHdlYiBhcHBsaWNhdGlvbiBhdCB0aGUgc3BlY2lmaWVkIGNvbnRleHQgcGF0aC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB3cml0ZXIgV3JpdGVyIHRvIHJlbmRlciB0bworICAgICAqIEBwYXJhbSBwYXRoIENvbnRleHQgcGF0aCBvZiB0aGUgYXBwbGljYXRpb24gdG8gYmUgcmVzdGFydGVkCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcmVsb2FkKFByaW50V3JpdGVyIHdyaXRlciwgU3RyaW5nIHBhdGgpIHsKKworICAgICAgICBpZiAoZGVidWcgPj0gMSkKKyAgICAgICAgICAgIGxvZygicmVzdGFydDogUmVsb2FkaW5nIHdlYiBhcHBsaWNhdGlvbiBhdCAnIiArIHBhdGggKyAiJyIpOworCisgICAgICAgIGlmICgocGF0aCA9PSBudWxsKSB8fCAoIXBhdGguc3RhcnRzV2l0aCgiLyIpICYmIHBhdGguZXF1YWxzKCIiKSkpIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKHNtLmdldFN0cmluZygibWFuYWdlclNlcnZsZXQuaW52YWxpZFBhdGgiLCBwYXRoKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIGRpc3BsYXlQYXRoID0gcGF0aDsKKyAgICAgICAgaWYoIHBhdGguZXF1YWxzKCIvIikgKQorICAgICAgICAgICAgcGF0aCA9ICIiOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDb250ZXh0IGNvbnRleHQgPSAoQ29udGV4dCkgaG9zdC5maW5kQ2hpbGQocGF0aCk7CisgICAgICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oc20uZ2V0U3RyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJtYW5hZ2VyU2VydmxldC5ub0NvbnRleHQiLCBkaXNwbGF5UGF0aCkpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERpckNvbnRleHQgcmVzb3VyY2VzID0gY29udGV4dC5nZXRSZXNvdXJjZXMoKTsKKyAgICAgICAgICAgIGlmIChyZXNvdXJjZXMgaW5zdGFuY2VvZiBQcm94eURpckNvbnRleHQpIHsKKyAgICAgICAgICAgICAgICByZXNvdXJjZXMgPSAoKFByb3h5RGlyQ29udGV4dCkgcmVzb3VyY2VzKS5nZXREaXJDb250ZXh0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocmVzb3VyY2VzIGluc3RhbmNlb2YgV0FSRGlyQ29udGV4dCkgeworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKHNtLmdldFN0cmluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgibWFuYWdlclNlcnZsZXQubm9SZWxvYWQiLCBkaXNwbGF5UGF0aCkpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEl0IGlzbid0IHBvc3NpYmxlIGZvciB0aGUgbWFuYWdlciB0byByZWxvYWQgaXRzZWxmCisgICAgICAgICAgICBpZiAoY29udGV4dC5nZXRQYXRoKCkuZXF1YWxzKHRoaXMuY29udGV4dC5nZXRQYXRoKCkpKSB7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oc20uZ2V0U3RyaW5nKCJtYW5hZ2VyU2VydmxldC5ub1NlbGYiKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udGV4dC5yZWxvYWQoKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygibWFuYWdlclNlcnZsZXQucmVsb2FkZWQiLCBkaXNwbGF5UGF0aCkpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgbG9nKCJNYW5hZ2VyU2VydmxldC5yZWxvYWRbIiArIGRpc3BsYXlQYXRoICsgIl0iLCB0KTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKHNtLmdldFN0cmluZygibWFuYWdlclNlcnZsZXQuZXhjZXB0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnRvU3RyaW5nKCkpKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgdGhlIHdlYiBhcHBsaWNhdGlvbiBhdCB0aGUgc3BlY2lmaWVkIGNvbnRleHQgcGF0aC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB3cml0ZXIgV3JpdGVyIHRvIHJlbmRlciB0bworICAgICAqIEBwYXJhbSBwYXRoIENvbnRleHQgcGF0aCBvZiB0aGUgYXBwbGljYXRpb24gdG8gYmUgcmVtb3ZlZAorICAgICAqIEBkZXByZWNhdGVkIFJlcGxhY2VkIGJ5IHVuZGVwbG95CisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcmVtb3ZlKFByaW50V3JpdGVyIHdyaXRlciwgU3RyaW5nIHBhdGgpIHsKKworICAgICAgICBpZiAoZGVidWcgPj0gMSkKKyAgICAgICAgICAgIGxvZygicmVtb3ZlOiBSZW1vdmluZyB3ZWIgYXBwbGljYXRpb24gYXQgJyIgKyBwYXRoICsgIiciKTsKKworICAgICAgICBpZiAoKHBhdGggPT0gbnVsbCkgfHwgKCFwYXRoLnN0YXJ0c1dpdGgoIi8iKSAmJiBwYXRoLmVxdWFscygiIikpKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihzbS5nZXRTdHJpbmcoIm1hbmFnZXJTZXJ2bGV0LmludmFsaWRQYXRoIiwgcGF0aCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBkaXNwbGF5UGF0aCA9IHBhdGg7CisgICAgICAgIGlmKCBwYXRoLmVxdWFscygiLyIpICkKKyAgICAgICAgICAgIHBhdGggPSAiIjsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gKENvbnRleHQpIGhvc3QuZmluZENoaWxkKHBhdGgpOworICAgICAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKHNtLmdldFN0cmluZygibWFuYWdlclNlcnZsZXQubm9Db250ZXh0IiwgZGlzcGxheVBhdGgpKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBJdCBpc24ndCBwb3NzaWJsZSBmb3IgdGhlIG1hbmFnZXIgdG8gcmVtb3ZlIGl0c2VsZgorICAgICAgICAgICAgaWYgKGNvbnRleHQuZ2V0UGF0aCgpLmVxdWFscyh0aGlzLmNvbnRleHQuZ2V0UGF0aCgpKSkgeworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKHNtLmdldFN0cmluZygibWFuYWdlclNlcnZsZXQubm9TZWxmIikpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGhvc3QucmVtb3ZlQ2hpbGQoY29udGV4dCk7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihzbS5nZXRTdHJpbmcoIm1hbmFnZXJTZXJ2bGV0LnVuZGVwbG95ZWQiLCBkaXNwbGF5UGF0aCkpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgbG9nKCJNYW5hZ2VyU2VydmxldC5yZW1vdmVbIiArIGRpc3BsYXlQYXRoICsgIl0iLCB0KTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKHNtLmdldFN0cmluZygibWFuYWdlclNlcnZsZXQuZXhjZXB0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnRvU3RyaW5nKCkpKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZW5kZXIgYSBsaXN0IG9mIGF2YWlsYWJsZSBnbG9iYWwgSk5ESSByZXNvdXJjZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHlwZSBGdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgcmVzb3VyY2UgdHlwZSBvZiBpbnRlcmVzdCwKKyAgICAgKiAgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8gbGlzdCByZXNvdXJjZXMgb2YgYWxsIHR5cGVzCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcmVzb3VyY2VzKFByaW50V3JpdGVyIHdyaXRlciwgU3RyaW5nIHR5cGUpIHsKKworICAgICAgICBpZiAoZGVidWcgPj0gMSkgeworICAgICAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGxvZygicmVzb3VyY2VzOiAgTGlzdGluZyByZXNvdXJjZXMgb2YgdHlwZSAiICsgdHlwZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGxvZygicmVzb3VyY2VzOiAgTGlzdGluZyByZXNvdXJjZXMgb2YgYWxsIHR5cGVzIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBJcyB0aGUgZ2xvYmFsIEpOREkgcmVzb3VyY2VzIGNvbnRleHQgYXZhaWxhYmxlPworICAgICAgICBpZiAoZ2xvYmFsID09IG51bGwpIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKHNtLmdldFN0cmluZygibWFuYWdlclNlcnZsZXQubm9HbG9iYWwiKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBFbnVtZXJhdGUgdGhlIGdsb2JhbCBKTkRJIHJlc291cmNlcyBvZiB0aGUgcmVxdWVzdGVkIHR5cGUKKyAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCkgeworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oc20uZ2V0U3RyaW5nKCJtYW5hZ2VyU2VydmxldC5yZXNvdXJjZXNUeXBlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihzbS5nZXRTdHJpbmcoIm1hbmFnZXJTZXJ2bGV0LnJlc291cmNlc0FsbCIpKTsKKyAgICAgICAgfQorCisgICAgICAgIENsYXNzIGNsYXp6ID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICh0eXBlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjbGF6eiA9IENsYXNzLmZvck5hbWUodHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICBsb2coIk1hbmFnZXJTZXJ2bGV0LnJlc291cmNlc1siICsgdHlwZSArICJdIiwgdCk7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihzbS5nZXRTdHJpbmcoIm1hbmFnZXJTZXJ2bGV0LmV4Y2VwdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC50b1N0cmluZygpKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBwcmludFJlc291cmNlcyh3cml0ZXIsICIiLCBnbG9iYWwsIHR5cGUsIGNsYXp6KTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogTGlzdCB0aGUgcmVzb3VyY2VzIG9mIHRoZSBnaXZlbiBjb250ZXh0LgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHByaW50UmVzb3VyY2VzKFByaW50V3JpdGVyIHdyaXRlciwgU3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC5uYW1pbmcuQ29udGV4dCBuYW1pbmdDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0eXBlLCBDbGFzcyBjbGF6eikgeworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBOYW1pbmdFbnVtZXJhdGlvbiBpdGVtcyA9IG5hbWluZ0NvbnRleHQubGlzdEJpbmRpbmdzKCIiKTsKKyAgICAgICAgICAgIHdoaWxlIChpdGVtcy5oYXNNb3JlKCkpIHsKKyAgICAgICAgICAgICAgICBCaW5kaW5nIGl0ZW0gPSAoQmluZGluZykgaXRlbXMubmV4dCgpOworICAgICAgICAgICAgICAgIGlmIChpdGVtLmdldE9iamVjdCgpIGluc3RhbmNlb2YgamF2YXgubmFtaW5nLkNvbnRleHQpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRSZXNvdXJjZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICh3cml0ZXIsIHByZWZpeCArIGl0ZW0uZ2V0TmFtZSgpICsgIi8iLAorICAgICAgICAgICAgICAgICAgICAgICAgIChqYXZheC5uYW1pbmcuQ29udGV4dCkgaXRlbS5nZXRPYmplY3QoKSwgdHlwZSwgY2xhenopOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgoY2xhenogIT0gbnVsbCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICghKGNsYXp6LmlzSW5zdGFuY2UoaXRlbS5nZXRPYmplY3QoKSkpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KHByZWZpeCArIGl0ZW0uZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KCc6Jyk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5wcmludChpdGVtLmdldENsYXNzTmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gRG8gd2Ugd2FudCBhIGRlc2NyaXB0aW9uIGlmIGF2YWlsYWJsZT8KKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICBsb2coIk1hbmFnZXJTZXJ2bGV0LnJlc291cmNlc1siICsgdHlwZSArICJdIiwgdCk7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihzbS5nZXRTdHJpbmcoIm1hbmFnZXJTZXJ2bGV0LmV4Y2VwdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC50b1N0cmluZygpKSk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVuZGVyIGEgbGlzdCBvZiBzZWN1cml0eSByb2xlIG5hbWVzIChhbmQgY29ycmVzcG9uZGluZyBkZXNjcmlwdGlvbnMpCisgICAgICogZnJvbSB0aGUgPGNvZGU+b3JnLmFwYWNoZS5jYXRhbGluYS5Vc2VyRGF0YWJhc2U8L2NvZGU+IHJlc291cmNlIHRoYXQgaXMKKyAgICAgKiBjb25uZWN0ZWQgdG8gdGhlIDxjb2RlPnVzZXJzPC9jb2RlPiByZXNvdXJjZSByZWZlcmVuY2UuICBUeXBpY2FsbHksIHRoaXMKKyAgICAgKiB3aWxsIGJlIHRoZSBnbG9iYWwgdXNlciBkYXRhYmFzZSwgYnV0IGNhbiBiZSBhZGp1c3RlZCBpZiB5b3UgaGF2ZQorICAgICAqIGRpZmZlcmVudCB1c2VyIGRhdGFiYXNlcyBmb3IgZGlmZmVyZW50IHZpcnR1YWwgaG9zdHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gd3JpdGVyIFdyaXRlciB0byByZW5kZXIgdG8KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCByb2xlcyhQcmludFdyaXRlciB3cml0ZXIpIHsKKworICAgICAgICBpZiAoZGVidWcgPj0gMSkgeworICAgICAgICAgICAgbG9nKCJyb2xlczogIExpc3Qgc2VjdXJpdHkgcm9sZXMgZnJvbSB1c2VyIGRhdGFiYXNlIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBMb29rIHVwIHRoZSBVc2VyRGF0YWJhc2UgaW5zdGFuY2Ugd2Ugc2hvdWxkIHVzZQorICAgICAgICBVc2VyRGF0YWJhc2UgZGF0YWJhc2UgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgSW5pdGlhbENvbnRleHQgaWMgPSBuZXcgSW5pdGlhbENvbnRleHQoKTsKKyAgICAgICAgICAgIGRhdGFiYXNlID0gKFVzZXJEYXRhYmFzZSkgaWMubG9va3VwKCJqYXZhOmNvbXAvZW52L3VzZXJzIik7CisgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihzbS5nZXRTdHJpbmcoIm1hbmFnZXJTZXJ2bGV0LnVzZXJEYXRhYmFzZUVycm9yIikpOworICAgICAgICAgICAgbG9nKCJqYXZhOmNvbXAvZW52L3VzZXJzIiwgZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRhdGFiYXNlID09IG51bGwpIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKHNtLmdldFN0cmluZygibWFuYWdlclNlcnZsZXQudXNlckRhdGFiYXNlTWlzc2luZyIpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEVudW1lcmF0ZSB0aGUgYXZhaWxhYmxlIHJvbGVzCisgICAgICAgIHdyaXRlci5wcmludGxuKHNtLmdldFN0cmluZygibWFuYWdlclNlcnZsZXQucm9sZXNMaXN0IikpOworICAgICAgICBJdGVyYXRvciByb2xlcyA9IGRhdGFiYXNlLmdldFJvbGVzKCk7CisgICAgICAgIGlmIChyb2xlcyAhPSBudWxsKSB7CisgICAgICAgICAgICB3aGlsZSAocm9sZXMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgUm9sZSByb2xlID0gKFJvbGUpIHJvbGVzLm5leHQoKTsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQocm9sZS5nZXRSb2xlbmFtZSgpKTsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQoJzonKTsKKyAgICAgICAgICAgICAgICBpZiAocm9sZS5nZXREZXNjcmlwdGlvbigpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KHJvbGUuZ2V0RGVzY3JpcHRpb24oKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgU3lzdGVtIE9TIGFuZCBKVk0gcHJvcGVydGllcy4KKyAgICAgKiBAcGFyYW0gd3JpdGVyIFdyaXRlciB0byByZW5kZXIgdG8KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXJ2ZXJpbmZvKFByaW50V3JpdGVyIHdyaXRlcikgeworICAgICAgICBpZiAoZGVidWcgPj0gMSkKKyAgICAgICAgICAgIGxvZygic2VydmVyaW5mbyIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHByb3BzID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICAgICAgcHJvcHMuYXBwZW5kKCJPSyAtIFNlcnZlciBpbmZvIik7CisgICAgICAgICAgICBwcm9wcy5hcHBlbmQoIlxuVG9tY2F0IFZlcnNpb246ICIpOworICAgICAgICAgICAgcHJvcHMuYXBwZW5kKFNlcnZlckluZm8uZ2V0U2VydmVySW5mbygpKTsKKyAgICAgICAgICAgIHByb3BzLmFwcGVuZCgiXG5PUyBOYW1lOiAiKTsKKyAgICAgICAgICAgIHByb3BzLmFwcGVuZChTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKSk7CisgICAgICAgICAgICBwcm9wcy5hcHBlbmQoIlxuT1MgVmVyc2lvbjogIik7CisgICAgICAgICAgICBwcm9wcy5hcHBlbmQoU3lzdGVtLmdldFByb3BlcnR5KCJvcy52ZXJzaW9uIikpOworICAgICAgICAgICAgcHJvcHMuYXBwZW5kKCJcbk9TIEFyY2hpdGVjdHVyZTogIik7CisgICAgICAgICAgICBwcm9wcy5hcHBlbmQoU3lzdGVtLmdldFByb3BlcnR5KCJvcy5hcmNoIikpOworICAgICAgICAgICAgcHJvcHMuYXBwZW5kKCJcbkpWTSBWZXJzaW9uOiAiKTsKKyAgICAgICAgICAgIHByb3BzLmFwcGVuZChTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEucnVudGltZS52ZXJzaW9uIikpOworICAgICAgICAgICAgcHJvcHMuYXBwZW5kKCJcbkpWTSBWZW5kb3I6ICIpOworICAgICAgICAgICAgcHJvcHMuYXBwZW5kKFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS52bS52ZW5kb3IiKSk7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihwcm9wcy50b1N0cmluZygpKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIGdldFNlcnZsZXRDb250ZXh0KCkubG9nKCJNYW5hZ2VyU2VydmxldC5zZXJ2ZXJpbmZvIix0KTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKHNtLmdldFN0cmluZygibWFuYWdlclNlcnZsZXQuZXhjZXB0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnRvU3RyaW5nKCkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNlc3Npb24gaW5mb3JtYXRpb24gZm9yIHRoZSB3ZWIgYXBwbGljYXRpb24gYXQgdGhlIHNwZWNpZmllZCBjb250ZXh0IHBhdGguCisgICAgICogRGlzcGxheXMgYSBwcm9maWxlIG9mIHNlc3Npb24gTWF4SW5hY3RpdmVJbnRlcnZhbCB0aW1lb3V0cyBsaXN0aW5nIG51bWJlcgorICAgICAqIG9mIHNlc3Npb25zIGZvciBlYWNoIDEwIG1pbnV0ZSB0aW1lb3V0IGludGVydmFsIHVwIHRvIDEwIGhvdXJzLgorICAgICAqCisgICAgICogQHBhcmFtIHdyaXRlciBXcml0ZXIgdG8gcmVuZGVyIHRvCisgICAgICogQHBhcmFtIHBhdGggQ29udGV4dCBwYXRoIG9mIHRoZSBhcHBsaWNhdGlvbiB0byBsaXN0IHNlc3Npb24gaW5mb3JtYXRpb24gZm9yCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2Vzc2lvbnMoUHJpbnRXcml0ZXIgd3JpdGVyLCBTdHJpbmcgcGF0aCkgeworCisgICAgICAgIGlmIChkZWJ1ZyA+PSAxKQorICAgICAgICAgICAgbG9nKCJzZXNzaW9uczogU2Vzc2lvbiBpbmZvcm1hdGlvbiBmb3Igd2ViIGFwcGxpY2F0aW9uIGF0ICciICsgcGF0aCArICInIik7CisKKyAgICAgICAgaWYgKChwYXRoID09IG51bGwpIHx8ICghcGF0aC5zdGFydHNXaXRoKCIvIikgJiYgcGF0aC5lcXVhbHMoIiIpKSkgeworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oc20uZ2V0U3RyaW5nKCJtYW5hZ2VyU2VydmxldC5pbnZhbGlkUGF0aCIsIHBhdGgpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgZGlzcGxheVBhdGggPSBwYXRoOworICAgICAgICBpZiggcGF0aC5lcXVhbHMoIi8iKSApCisgICAgICAgICAgICBwYXRoID0gIiI7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDb250ZXh0IGNvbnRleHQgPSAoQ29udGV4dCkgaG9zdC5maW5kQ2hpbGQocGF0aCk7CisgICAgICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oc20uZ2V0U3RyaW5nKCJtYW5hZ2VyU2VydmxldC5ub0NvbnRleHQiLCBkaXNwbGF5UGF0aCkpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKHNtLmdldFN0cmluZygibWFuYWdlclNlcnZsZXQuc2Vzc2lvbnMiLCBkaXNwbGF5UGF0aCkpOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oc20uZ2V0U3RyaW5nKCJtYW5hZ2VyU2VydmxldC5zZXNzaW9uZGVmYXVsdG1heCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiICsgY29udGV4dC5nZXRNYW5hZ2VyKCkuZ2V0TWF4SW5hY3RpdmVJbnRlcnZhbCgpLzYwKSk7CisgICAgICAgICAgICBTZXNzaW9uIFtdIHNlc3Npb25zID0gY29udGV4dC5nZXRNYW5hZ2VyKCkuZmluZFNlc3Npb25zKCk7CisgICAgICAgICAgICBpbnQgW10gdGltZW91dCA9IG5ldyBpbnRbNjBdOworICAgICAgICAgICAgaW50IG5vdGltZW91dCA9IDA7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlc3Npb25zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaW50IHRpbWUgPSBzZXNzaW9uc1tpXS5nZXRNYXhJbmFjdGl2ZUludGVydmFsKCkvKDEwKjYwKTsKKyAgICAgICAgICAgICAgICBpZiAodGltZSA8IDApCisgICAgICAgICAgICAgICAgICAgIG5vdGltZW91dCsrOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRpbWUgPj0gdGltZW91dC5sZW5ndGgpCisgICAgICAgICAgICAgICAgICAgIHRpbWVvdXRbdGltZW91dC5sZW5ndGgtMV0rKzsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHRpbWVvdXRbdGltZV0rKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0aW1lb3V0WzBdID4gMCkKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihzbS5nZXRTdHJpbmcoIm1hbmFnZXJTZXJ2bGV0LnNlc3Npb250aW1lb3V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjwxMCIsICIiICsgdGltZW91dFswXSkpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCB0aW1lb3V0Lmxlbmd0aC0xOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAodGltZW91dFtpXSA+IDApCisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKHNtLmdldFN0cmluZygibWFuYWdlclNlcnZsZXQuc2Vzc2lvbnRpbWVvdXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiICsgKGkpKjEwICsgIiAtIDwiICsgKGkrMSkqMTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiArIHRpbWVvdXRbaV0pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0aW1lb3V0W3RpbWVvdXQubGVuZ3RoLTFdID4gMCkKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihzbS5nZXRTdHJpbmcoIm1hbmFnZXJTZXJ2bGV0LnNlc3Npb250aW1lb3V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIj49IiArIHRpbWVvdXQubGVuZ3RoKjEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiArIHRpbWVvdXRbdGltZW91dC5sZW5ndGgtMV0pKTsKKyAgICAgICAgICAgIGlmIChub3RpbWVvdXQgPiAwKQorICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKHNtLmdldFN0cmluZygibWFuYWdlclNlcnZsZXQuc2Vzc2lvbnRpbWVvdXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5saW1pdGVkIiwiIiArIG5vdGltZW91dCkpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgbG9nKCJNYW5hZ2VyU2VydmxldC5zZXNzaW9uc1siICsgZGlzcGxheVBhdGggKyAiXSIsIHQpOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oc20uZ2V0U3RyaW5nKCJtYW5hZ2VyU2VydmxldC5leGNlcHRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQudG9TdHJpbmcoKSkpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFN0YXJ0IHRoZSB3ZWIgYXBwbGljYXRpb24gYXQgdGhlIHNwZWNpZmllZCBjb250ZXh0IHBhdGguCisgICAgICoKKyAgICAgKiBAcGFyYW0gd3JpdGVyIFdyaXRlciB0byByZW5kZXIgdG8KKyAgICAgKiBAcGFyYW0gcGF0aCBDb250ZXh0IHBhdGggb2YgdGhlIGFwcGxpY2F0aW9uIHRvIGJlIHN0YXJ0ZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzdGFydChQcmludFdyaXRlciB3cml0ZXIsIFN0cmluZyBwYXRoKSB7CisKKyAgICAgICAgaWYgKGRlYnVnID49IDEpCisgICAgICAgICAgICBsb2coInN0YXJ0OiBTdGFydGluZyB3ZWIgYXBwbGljYXRpb24gYXQgJyIgKyBwYXRoICsgIiciKTsKKworICAgICAgICBpZiAoKHBhdGggPT0gbnVsbCkgfHwgKCFwYXRoLnN0YXJ0c1dpdGgoIi8iKSAmJiBwYXRoLmVxdWFscygiIikpKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihzbS5nZXRTdHJpbmcoIm1hbmFnZXJTZXJ2bGV0LmludmFsaWRQYXRoIiwgcGF0aCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBkaXNwbGF5UGF0aCA9IHBhdGg7CisgICAgICAgIGlmKCBwYXRoLmVxdWFscygiLyIpICkKKyAgICAgICAgICAgIHBhdGggPSAiIjsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gKENvbnRleHQpIGhvc3QuZmluZENoaWxkKHBhdGgpOworICAgICAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKHNtLmdldFN0cmluZygibWFuYWdlclNlcnZsZXQubm9Db250ZXh0IiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlQYXRoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKChMaWZlY3ljbGUpIGNvbnRleHQpLnN0YXJ0KCk7CisgICAgICAgICAgICBpZiAoY29udGV4dC5nZXRBdmFpbGFibGUoKSkKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbgorICAgICAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJtYW5hZ2VyU2VydmxldC5zdGFydGVkIiwgZGlzcGxheVBhdGgpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbgorICAgICAgICAgICAgICAgICAgICAoc20uZ2V0U3RyaW5nKCJtYW5hZ2VyU2VydmxldC5zdGFydEZhaWxlZCIsIGRpc3BsYXlQYXRoKSk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICBnZXRTZXJ2bGV0Q29udGV4dCgpLmxvZworICAgICAgICAgICAgICAgIChzbS5nZXRTdHJpbmcoIm1hbmFnZXJTZXJ2bGV0LnN0YXJ0RmFpbGVkIiwgZGlzcGxheVBhdGgpLCB0KTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuCisgICAgICAgICAgICAgICAgKHNtLmdldFN0cmluZygibWFuYWdlclNlcnZsZXQuc3RhcnRGYWlsZWQiLCBkaXNwbGF5UGF0aCkpOworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oc20uZ2V0U3RyaW5nKCJtYW5hZ2VyU2VydmxldC5leGNlcHRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQudG9TdHJpbmcoKSkpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFN0b3AgdGhlIHdlYiBhcHBsaWNhdGlvbiBhdCB0aGUgc3BlY2lmaWVkIGNvbnRleHQgcGF0aC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB3cml0ZXIgV3JpdGVyIHRvIHJlbmRlciB0bworICAgICAqIEBwYXJhbSBwYXRoIENvbnRleHQgcGF0aCBvZiB0aGUgYXBwbGljYXRpb24gdG8gYmUgc3RvcHBlZAorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHN0b3AoUHJpbnRXcml0ZXIgd3JpdGVyLCBTdHJpbmcgcGF0aCkgeworCisgICAgICAgIGlmIChkZWJ1ZyA+PSAxKQorICAgICAgICAgICAgbG9nKCJzdG9wOiBTdG9wcGluZyB3ZWIgYXBwbGljYXRpb24gYXQgJyIgKyBwYXRoICsgIiciKTsKKworICAgICAgICBpZiAoKHBhdGggPT0gbnVsbCkgfHwgKCFwYXRoLnN0YXJ0c1dpdGgoIi8iKSAmJiBwYXRoLmVxdWFscygiIikpKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihzbS5nZXRTdHJpbmcoIm1hbmFnZXJTZXJ2bGV0LmludmFsaWRQYXRoIiwgcGF0aCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBkaXNwbGF5UGF0aCA9IHBhdGg7CisgICAgICAgIGlmKCBwYXRoLmVxdWFscygiLyIpICkKKyAgICAgICAgICAgIHBhdGggPSAiIjsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gKENvbnRleHQpIGhvc3QuZmluZENoaWxkKHBhdGgpOworICAgICAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKHNtLmdldFN0cmluZygibWFuYWdlclNlcnZsZXQubm9Db250ZXh0IiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlQYXRoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gSXQgaXNuJ3QgcG9zc2libGUgZm9yIHRoZSBtYW5hZ2VyIHRvIHN0b3AgaXRzZWxmCisgICAgICAgICAgICBpZiAoY29udGV4dC5nZXRQYXRoKCkuZXF1YWxzKHRoaXMuY29udGV4dC5nZXRQYXRoKCkpKSB7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oc20uZ2V0U3RyaW5nKCJtYW5hZ2VyU2VydmxldC5ub1NlbGYiKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKChMaWZlY3ljbGUpIGNvbnRleHQpLnN0b3AoKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKHNtLmdldFN0cmluZygibWFuYWdlclNlcnZsZXQuc3RvcHBlZCIsIGRpc3BsYXlQYXRoKSk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICBsb2coIk1hbmFnZXJTZXJ2bGV0LnN0b3BbIiArIGRpc3BsYXlQYXRoICsgIl0iLCB0KTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKHNtLmdldFN0cmluZygibWFuYWdlclNlcnZsZXQuZXhjZXB0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnRvU3RyaW5nKCkpKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBVbmRlcGxveSB0aGUgd2ViIGFwcGxpY2F0aW9uIGF0IHRoZSBzcGVjaWZpZWQgY29udGV4dCBwYXRoLgorICAgICAqCisgICAgICogQHBhcmFtIHdyaXRlciBXcml0ZXIgdG8gcmVuZGVyIHRvCisgICAgICogQHBhcmFtIHBhdGggQ29udGV4dCBwYXRoIG9mIHRoZSBhcHBsaWNhdGlvbiB0byBiZSByZW1vdmVkCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgdW5kZXBsb3koUHJpbnRXcml0ZXIgd3JpdGVyLCBTdHJpbmcgcGF0aCkgeworCisgICAgICAgIGlmIChkZWJ1ZyA+PSAxKQorICAgICAgICAgICAgbG9nKCJ1bmRlcGxveTogVW5kZXBsb3lpbmcgd2ViIGFwcGxpY2F0aW9uIGF0ICciICsgcGF0aCArICInIik7CisKKyAgICAgICAgaWYgKChwYXRoID09IG51bGwpIHx8ICghcGF0aC5zdGFydHNXaXRoKCIvIikgJiYgcGF0aC5lcXVhbHMoIiIpKSkgeworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oc20uZ2V0U3RyaW5nKCJtYW5hZ2VyU2VydmxldC5pbnZhbGlkUGF0aCIsIHBhdGgpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgZGlzcGxheVBhdGggPSBwYXRoOworICAgICAgICBpZiggcGF0aC5lcXVhbHMoIi8iKSApCisgICAgICAgICAgICBwYXRoID0gIiI7CisKKyAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgLy8gVmFsaWRhdGUgdGhlIENvbnRleHQgb2YgdGhlIHNwZWNpZmllZCBhcHBsaWNhdGlvbgorICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gKENvbnRleHQpIGhvc3QuZmluZENoaWxkKHBhdGgpOworICAgICAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKHNtLmdldFN0cmluZygibWFuYWdlclNlcnZsZXQubm9Db250ZXh0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheVBhdGgpKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIElkZW50aWZ5IHRoZSBhcHBCYXNlIG9mIHRoZSBvd25pbmcgSG9zdCBvZiB0aGlzIENvbnRleHQgKGlmIGFueSkKKyAgICAgICAgICAgIFN0cmluZyBhcHBCYXNlID0gbnVsbDsKKyAgICAgICAgICAgIEZpbGUgYXBwQmFzZURpciA9IG51bGw7CisgICAgICAgICAgICBpZiAoY29udGV4dC5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIEhvc3QpIHsKKyAgICAgICAgICAgICAgICBhcHBCYXNlID0gKChIb3N0KSBjb250ZXh0LmdldFBhcmVudCgpKS5nZXRBcHBCYXNlKCk7CisgICAgICAgICAgICAgICAgYXBwQmFzZURpciA9IG5ldyBGaWxlKGFwcEJhc2UpOworICAgICAgICAgICAgICAgIGlmICghYXBwQmFzZURpci5pc0Fic29sdXRlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYXBwQmFzZURpciA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2F0YWxpbmEuYmFzZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwQmFzZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBTdG9wIHRoZSBjb250ZXh0IGZpcnN0IHRvIGJlIG5pY2VyCisgICAgICAgICAgICBpZiAoIWlzU2VydmljZWQocGF0aCkpIHsKKyAgICAgICAgICAgICAgICBhZGRTZXJ2aWNlZChwYXRoKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAoKExpZmVjeWNsZSkgY29udGV4dCkuc3RvcCgpOworICAgICAgICAgICAgICAgICAgICBGaWxlIHdhciA9IG5ldyBGaWxlKGdldEFwcEJhc2UoKSwgZ2V0RG9jQmFzZShwYXRoKSArICIud2FyIik7CisgICAgICAgICAgICAgICAgICAgIEZpbGUgZGlyID0gbmV3IEZpbGUoZ2V0QXBwQmFzZSgpLCBnZXREb2NCYXNlKHBhdGgpKTsKKyAgICAgICAgICAgICAgICAgICAgRmlsZSB4bWwgPSBuZXcgRmlsZShjb25maWdCYXNlLCBnZXRDb25maWdGaWxlKHBhdGgpICsgIi54bWwiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdhci5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgd2FyLmRlbGV0ZSgpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRpci5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdW5kZXBsb3lEaXIoZGlyKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHhtbC5kZWxldGUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBQZXJmb3JtIG5ldyBkZXBsb3ltZW50CisgICAgICAgICAgICAgICAgICAgIGNoZWNrKHBhdGgpOworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIHJlbW92ZVNlcnZpY2VkKHBhdGgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKHNtLmdldFN0cmluZygibWFuYWdlclNlcnZsZXQudW5kZXBsb3llZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheVBhdGgpKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIGxvZygiTWFuYWdlclNlcnZsZXQudW5kZXBsb3lbIiArIGRpc3BsYXlQYXRoICsgIl0iLCB0KTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKHNtLmdldFN0cmluZygibWFuYWdlclNlcnZsZXQuZXhjZXB0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnRvU3RyaW5nKCkpKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTdXBwb3J0IE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogR2l2ZW4gYSBjb250ZXh0IHBhdGgsIGdldCB0aGUgY29uZmlnIGZpbGUgbmFtZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENvbmZpZ0ZpbGUoU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgU3RyaW5nIGJhc2VuYW1lID0gbnVsbDsKKyAgICAgICAgaWYgKHBhdGguZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgYmFzZW5hbWUgPSAiUk9PVCI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBiYXNlbmFtZSA9IHBhdGguc3Vic3RyaW5nKDEpLnJlcGxhY2UoJy8nLCAnIycpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoYmFzZW5hbWUpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2l2ZW4gYSBjb250ZXh0IHBhdGgsIGdldCB0aGUgY29uZmlnIGZpbGUgbmFtZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldERvY0Jhc2UoU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgU3RyaW5nIGJhc2VuYW1lID0gbnVsbDsKKyAgICAgICAgaWYgKHBhdGguZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgYmFzZW5hbWUgPSAiUk9PVCI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBiYXNlbmFtZSA9IHBhdGguc3Vic3RyaW5nKDEpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoYmFzZW5hbWUpOworICAgIH0KKworICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiBhIEZpbGUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgImFwcGxpY2F0aW9uIHJvb3QiIGRpcmVjdG9yeQorICAgICAqIGZvciBvdXIgYXNzb2NpYXRlZCBIb3N0LgorICAgICAqLworICAgIHByb3RlY3RlZCBGaWxlIGdldEFwcEJhc2UoKSB7CisKKyAgICAgICAgaWYgKGFwcEJhc2UgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGFwcEJhc2U7CisgICAgICAgIH0KKworICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShob3N0LmdldEFwcEJhc2UoKSk7CisgICAgICAgIGlmICghZmlsZS5pc0Fic29sdXRlKCkpCisgICAgICAgICAgICBmaWxlID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJjYXRhbGluYS5iYXNlIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdC5nZXRBcHBCYXNlKCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYXBwQmFzZSA9IGZpbGUuZ2V0Q2Fub25pY2FsRmlsZSgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhcHBCYXNlID0gZmlsZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKGFwcEJhc2UpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBJbnZva2UgdGhlIGNoZWNrIG1ldGhvZCBvbiB0aGUgZGVwbG95ZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgY2hlY2soU3RyaW5nIG5hbWUpIAorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nW10gcGFyYW1zID0geyBuYW1lIH07CisgICAgICAgIFN0cmluZ1tdIHNpZ25hdHVyZSA9IHsgImphdmEubGFuZy5TdHJpbmciIH07CisgICAgICAgIG1CZWFuU2VydmVyLmludm9rZShvbmFtZSwgImNoZWNrIiwgcGFyYW1zLCBzaWduYXR1cmUpOworICAgIH0KKyAgICAKKworICAgIC8qKgorICAgICAqIEludm9rZSB0aGUgY2hlY2sgbWV0aG9kIG9uIHRoZSBkZXBsb3llci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1NlcnZpY2VkKFN0cmluZyBuYW1lKSAKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1tdIHBhcmFtcyA9IHsgbmFtZSB9OworICAgICAgICBTdHJpbmdbXSBzaWduYXR1cmUgPSB7ICJqYXZhLmxhbmcuU3RyaW5nIiB9OworICAgICAgICBCb29sZWFuIHJlc3VsdCA9IAorICAgICAgICAgICAgKEJvb2xlYW4pIG1CZWFuU2VydmVyLmludm9rZShvbmFtZSwgImlzU2VydmljZWQiLCBwYXJhbXMsIHNpZ25hdHVyZSk7CisgICAgICAgIHJldHVybiByZXN1bHQuYm9vbGVhblZhbHVlKCk7CisgICAgfQorICAgIAorCisgICAgLyoqCisgICAgICogSW52b2tlIHRoZSBjaGVjayBtZXRob2Qgb24gdGhlIGRlcGxveWVyLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGFkZFNlcnZpY2VkKFN0cmluZyBuYW1lKSAKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1tdIHBhcmFtcyA9IHsgbmFtZSB9OworICAgICAgICBTdHJpbmdbXSBzaWduYXR1cmUgPSB7ICJqYXZhLmxhbmcuU3RyaW5nIiB9OworICAgICAgICBtQmVhblNlcnZlci5pbnZva2Uob25hbWUsICJhZGRTZXJ2aWNlZCIsIHBhcmFtcywgc2lnbmF0dXJlKTsKKyAgICB9CisgICAgCisKKyAgICAvKioKKyAgICAgKiBJbnZva2UgdGhlIGNoZWNrIG1ldGhvZCBvbiB0aGUgZGVwbG95ZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU2VydmljZWQoU3RyaW5nIG5hbWUpIAorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nW10gcGFyYW1zID0geyBuYW1lIH07CisgICAgICAgIFN0cmluZ1tdIHNpZ25hdHVyZSA9IHsgImphdmEubGFuZy5TdHJpbmciIH07CisgICAgICAgIG1CZWFuU2VydmVyLmludm9rZShvbmFtZSwgInJlbW92ZVNlcnZpY2VkIiwgcGFyYW1zLCBzaWduYXR1cmUpOworICAgIH0KKyAgICAKKworICAgIC8qKgorICAgICAqIERlbGV0ZSB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSwgaW5jbHVkaW5nIGFsbCBvZiBpdHMgY29udGVudHMgYW5kCisgICAgICogc3ViZGlyZWN0b3JpZXMgcmVjdXJzaXZlbHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGlyIEZpbGUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZGlyZWN0b3J5IHRvIGJlIGRlbGV0ZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB1bmRlcGxveURpcihGaWxlIGRpcikgeworCisgICAgICAgIFN0cmluZyBmaWxlc1tdID0gZGlyLmxpc3QoKTsKKyAgICAgICAgaWYgKGZpbGVzID09IG51bGwpIHsKKyAgICAgICAgICAgIGZpbGVzID0gbmV3IFN0cmluZ1swXTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShkaXIsIGZpbGVzW2ldKTsKKyAgICAgICAgICAgIGlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgICAgICB1bmRlcGxveURpcihmaWxlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZmlsZS5kZWxldGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBkaXIuZGVsZXRlKCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFVwbG9hZCB0aGUgV0FSIGZpbGUgaW5jbHVkZWQgaW4gdGhpcyByZXF1ZXN0LCBhbmQgc3RvcmUgaXQgYXQgdGhlCisgICAgICogc3BlY2lmaWVkIGZpbGUgbG9jYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHdhciBUaGUgZmlsZSBpbnRvIHdoaWNoIHdlIHNob3VsZCBzdG9yZSB0aGUgdXBsb2FkZWQgV0FSCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIEkvTyBlcnJvciBvY2N1cnMgZHVyaW5nIHByb2Nlc3NpbmcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB1cGxvYWRXYXIoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEZpbGUgd2FyKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIHdhci5kZWxldGUoKTsKKyAgICAgICAgU2VydmxldElucHV0U3RyZWFtIGlzdHJlYW0gPSBudWxsOworICAgICAgICBCdWZmZXJlZE91dHB1dFN0cmVhbSBvc3RyZWFtID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlzdHJlYW0gPSByZXF1ZXN0LmdldElucHV0U3RyZWFtKCk7CisgICAgICAgICAgICBvc3RyZWFtID0KKyAgICAgICAgICAgICAgICBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0od2FyKSwgMTAyNCk7CisgICAgICAgICAgICBieXRlIGJ1ZmZlcltdID0gbmV3IGJ5dGVbMTAyNF07CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgIGludCBuID0gaXN0cmVhbS5yZWFkKGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgaWYgKG4gPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvc3RyZWFtLndyaXRlKGJ1ZmZlciwgMCwgbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvc3RyZWFtLmZsdXNoKCk7CisgICAgICAgICAgICBvc3RyZWFtLmNsb3NlKCk7CisgICAgICAgICAgICBvc3RyZWFtID0gbnVsbDsKKyAgICAgICAgICAgIGlzdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgICAgIGlzdHJlYW0gPSBudWxsOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB3YXIuZGVsZXRlKCk7CisgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKG9zdHJlYW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIG9zdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG9zdHJlYW0gPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGlzdHJlYW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGlzdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlzdHJlYW0gPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvcHkgdGhlIHNwZWNpZmllZCBmaWxlIG9yIGRpcmVjdG9yeSB0byB0aGUgZGVzdGluYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3JjIEZpbGUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgc291cmNlCisgICAgICogQHBhcmFtIGRlc3QgRmlsZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBkZXN0aW5hdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb3B5KEZpbGUgc3JjLCBGaWxlIGRlc3QpIHsKKyAgICAgICAgcmV0dXJuIGNvcHlJbnRlcm5hbChzcmMsIGRlc3QsIG5ldyBieXRlWzQwOTZdKTsKKyAgICB9CisKKyAgICAKKyAgICAvKioKKyAgICAgKiBDb3B5IHRoZSBzcGVjaWZpZWQgZmlsZSBvciBkaXJlY3RvcnkgdG8gdGhlIGRlc3RpbmF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHNyYyBGaWxlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHNvdXJjZQorICAgICAqIEBwYXJhbSBkZXN0IEZpbGUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZGVzdGluYXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29weUludGVybmFsKEZpbGUgc3JjLCBGaWxlIGRlc3QsIGJ5dGVbXSBidWYpIHsKKyAgICAgICAgCisgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKKyAgICAgICAgCisgICAgICAgIFN0cmluZyBmaWxlc1tdID0gbnVsbDsKKyAgICAgICAgaWYgKHNyYy5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICBmaWxlcyA9IHNyYy5saXN0KCk7CisgICAgICAgICAgICByZXN1bHQgPSBkZXN0Lm1rZGlyKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmaWxlcyA9IG5ldyBTdHJpbmdbMV07CisgICAgICAgICAgICBmaWxlc1swXSA9ICIiOworICAgICAgICB9CisgICAgICAgIGlmIChmaWxlcyA9PSBudWxsKSB7CisgICAgICAgICAgICBmaWxlcyA9IG5ldyBTdHJpbmdbMF07CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IChpIDwgZmlsZXMubGVuZ3RoKSAmJiByZXN1bHQ7IGkrKykgeworICAgICAgICAgICAgRmlsZSBmaWxlU3JjID0gbmV3IEZpbGUoc3JjLCBmaWxlc1tpXSk7CisgICAgICAgICAgICBGaWxlIGZpbGVEZXN0ID0gbmV3IEZpbGUoZGVzdCwgZmlsZXNbaV0pOworICAgICAgICAgICAgaWYgKGZpbGVTcmMuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNvcHlJbnRlcm5hbChmaWxlU3JjLCBmaWxlRGVzdCwgYnVmKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIGlzID0gbnVsbDsKKyAgICAgICAgICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIG9zID0gbnVsbDsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZVNyYyk7CisgICAgICAgICAgICAgICAgICAgIG9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZURlc3QpOworICAgICAgICAgICAgICAgICAgICBpbnQgbGVuID0gMDsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IGlzLnJlYWQoYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZW4gPT0gLTEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBvcy53cml0ZShidWYsIDAsIGxlbik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG9zICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAKKyAgICB9CisgICAgCisgICAgCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9tYW5hZ2VyL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL2NhdGFsaW5hL21hbmFnZXIvU3RhdHVzTWFuYWdlclNlcnZsZXQuamF2YSBiL2NvbnRhaW5lci93ZWJhcHBzL21hbmFnZXIvV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvY2F0YWxpbmEvbWFuYWdlci9TdGF0dXNNYW5hZ2VyU2VydmxldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiM2FkNmIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9tYW5hZ2VyL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL2NhdGFsaW5hL21hbmFnZXIvU3RhdHVzTWFuYWdlclNlcnZsZXQuamF2YQpAQCAtMCwwICsxLDM1NyBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXRhbGluYS5tYW5hZ2VyOworCisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXJOb3RpZmljYXRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5Ob3RpZmljYXRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5Ob3RpZmljYXRpb25MaXN0ZW5lcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdEluc3RhbmNlOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXQ7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5tb2RlbGVyLlJlZ2lzdHJ5OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLlNlcnZlckluZm87CitpbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS51dGlsLlN0cmluZ01hbmFnZXI7CisKKy8qKgorICogVGhpcyBzZXJ2bGV0IHdpbGwgZGlzcGxheSBhIGNvbXBsZXRlIHN0YXR1cyBvZiB0aGUgSFRUUC8xLjEgY29ubmVjdG9yLgorICoKKyAqIEBhdXRob3IgUmVteSBNYXVjaGVyYXQKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIFN0YXR1c01hbmFnZXJTZXJ2bGV0CisgICAgZXh0ZW5kcyBIdHRwU2VydmxldCBpbXBsZW1lbnRzIE5vdGlmaWNhdGlvbkxpc3RlbmVyIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBkZWJ1Z2dpbmcgZGV0YWlsIGxldmVsIGZvciB0aGlzIHNlcnZsZXQuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgZGVidWcgPSAwOworCisKKyAgICAvKioKKyAgICAgKiBNQmVhbiBzZXJ2ZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIE1CZWFuU2VydmVyIG1CZWFuU2VydmVyID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVmVjdG9yIG9mIHByb3RvY29sIGhhbmRsZXJzIG9iamVjdCBuYW1lcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgVmVjdG9yIHByb3RvY29sSGFuZGxlcnMgPSBuZXcgVmVjdG9yKCk7CisKKworICAgIC8qKgorICAgICAqIFZlY3RvciBvZiB0aHJlYWQgcG9vbHMgb2JqZWN0IG5hbWVzLgorICAgICAqLworICAgIHByb3RlY3RlZCBWZWN0b3IgdGhyZWFkUG9vbHMgPSBuZXcgVmVjdG9yKCk7CisKKworICAgIC8qKgorICAgICAqIFZlY3RvciBvZiByZXF1ZXN0IHByb2Nlc3NvcnMgb2JqZWN0IG5hbWVzLgorICAgICAqLworICAgIHByb3RlY3RlZCBWZWN0b3IgcmVxdWVzdFByb2Nlc3NvcnMgPSBuZXcgVmVjdG9yKCk7CisKKworICAgIC8qKgorICAgICAqIFZlY3RvciBvZiBnbG9iYWwgcmVxdWVzdCBwcm9jZXNzb3JzIG9iamVjdCBuYW1lcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgVmVjdG9yIGdsb2JhbFJlcXVlc3RQcm9jZXNzb3JzID0gbmV3IFZlY3RvcigpOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc3RyaW5nIG1hbmFnZXIgZm9yIHRoaXMgcGFja2FnZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZ01hbmFnZXIgc20gPQorICAgICAgICBTdHJpbmdNYW5hZ2VyLmdldE1hbmFnZXIoQ29uc3RhbnRzLlBhY2thZ2UpOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSB0aGlzIHNlcnZsZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgaW5pdCgpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICAvLyBSZXRyaWV2ZSB0aGUgTUJlYW4gc2VydmVyCisgICAgICAgIG1CZWFuU2VydmVyID0gUmVnaXN0cnkuZ2V0UmVnaXN0cnkobnVsbCwgbnVsbCkuZ2V0TUJlYW5TZXJ2ZXIoKTsKKworICAgICAgICAvLyBTZXQgb3VyIHByb3BlcnRpZXMgZnJvbSB0aGUgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycworICAgICAgICBTdHJpbmcgdmFsdWUgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdmFsdWUgPSBnZXRTZXJ2bGV0Q29uZmlnKCkuZ2V0SW5pdFBhcmFtZXRlcigiZGVidWciKTsKKyAgICAgICAgICAgIGRlYnVnID0gSW50ZWdlci5wYXJzZUludCh2YWx1ZSk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICA7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworCisgICAgICAgICAgICAvLyBRdWVyeSBwcm90b2NvbCBoYW5kbGVycworICAgICAgICAgICAgU3RyaW5nIG9uU3RyID0gIio6dHlwZT1Qcm90b2NvbEhhbmRsZXIsKiI7CisgICAgICAgICAgICBPYmplY3ROYW1lIG9iamVjdE5hbWUgPSBuZXcgT2JqZWN0TmFtZShvblN0cik7CisgICAgICAgICAgICBTZXQgc2V0ID0gbUJlYW5TZXJ2ZXIucXVlcnlNQmVhbnMob2JqZWN0TmFtZSwgbnVsbCk7CisgICAgICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IHNldC5pdGVyYXRvcigpOworICAgICAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIE9iamVjdEluc3RhbmNlIG9pID0gKE9iamVjdEluc3RhbmNlKSBpdGVyYXRvci5uZXh0KCk7CisgICAgICAgICAgICAgICAgcHJvdG9jb2xIYW5kbGVycy5hZGRFbGVtZW50KG9pLmdldE9iamVjdE5hbWUoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFF1ZXJ5IFRocmVhZCBQb29scworICAgICAgICAgICAgb25TdHIgPSAiKjp0eXBlPVRocmVhZFBvb2wsKiI7CisgICAgICAgICAgICBvYmplY3ROYW1lID0gbmV3IE9iamVjdE5hbWUob25TdHIpOworICAgICAgICAgICAgc2V0ID0gbUJlYW5TZXJ2ZXIucXVlcnlNQmVhbnMob2JqZWN0TmFtZSwgbnVsbCk7CisgICAgICAgICAgICBpdGVyYXRvciA9IHNldC5pdGVyYXRvcigpOworICAgICAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIE9iamVjdEluc3RhbmNlIG9pID0gKE9iamVjdEluc3RhbmNlKSBpdGVyYXRvci5uZXh0KCk7CisgICAgICAgICAgICAgICAgdGhyZWFkUG9vbHMuYWRkRWxlbWVudChvaS5nZXRPYmplY3ROYW1lKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBRdWVyeSBHbG9iYWwgUmVxdWVzdCBQcm9jZXNzb3JzCisgICAgICAgICAgICBvblN0ciA9ICIqOnR5cGU9R2xvYmFsUmVxdWVzdFByb2Nlc3NvciwqIjsKKyAgICAgICAgICAgIG9iamVjdE5hbWUgPSBuZXcgT2JqZWN0TmFtZShvblN0cik7CisgICAgICAgICAgICBzZXQgPSBtQmVhblNlcnZlci5xdWVyeU1CZWFucyhvYmplY3ROYW1lLCBudWxsKTsKKyAgICAgICAgICAgIGl0ZXJhdG9yID0gc2V0Lml0ZXJhdG9yKCk7CisgICAgICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgT2JqZWN0SW5zdGFuY2Ugb2kgPSAoT2JqZWN0SW5zdGFuY2UpIGl0ZXJhdG9yLm5leHQoKTsKKyAgICAgICAgICAgICAgICBnbG9iYWxSZXF1ZXN0UHJvY2Vzc29ycy5hZGRFbGVtZW50KG9pLmdldE9iamVjdE5hbWUoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFF1ZXJ5IFJlcXVlc3QgUHJvY2Vzc29ycworICAgICAgICAgICAgb25TdHIgPSAiKjp0eXBlPVJlcXVlc3RQcm9jZXNzb3IsKiI7CisgICAgICAgICAgICBvYmplY3ROYW1lID0gbmV3IE9iamVjdE5hbWUob25TdHIpOworICAgICAgICAgICAgc2V0ID0gbUJlYW5TZXJ2ZXIucXVlcnlNQmVhbnMob2JqZWN0TmFtZSwgbnVsbCk7CisgICAgICAgICAgICBpdGVyYXRvciA9IHNldC5pdGVyYXRvcigpOworICAgICAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIE9iamVjdEluc3RhbmNlIG9pID0gKE9iamVjdEluc3RhbmNlKSBpdGVyYXRvci5uZXh0KCk7CisgICAgICAgICAgICAgICAgcmVxdWVzdFByb2Nlc3NvcnMuYWRkRWxlbWVudChvaS5nZXRPYmplY3ROYW1lKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBSZWdpc3RlciB3aXRoIE1CZWFuIHNlcnZlcgorICAgICAgICAgICAgb25TdHIgPSAiSk1JbXBsZW1lbnRhdGlvbjp0eXBlPU1CZWFuU2VydmVyRGVsZWdhdGUiOworICAgICAgICAgICAgb2JqZWN0TmFtZSA9IG5ldyBPYmplY3ROYW1lKG9uU3RyKTsKKyAgICAgICAgICAgIG1CZWFuU2VydmVyLmFkZE5vdGlmaWNhdGlvbkxpc3RlbmVyKG9iamVjdE5hbWUsIHRoaXMsIG51bGwsIG51bGwpOworCisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEZpbmFsaXplIHRoaXMgc2VydmxldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkZXN0cm95KCkgeworCisgICAgICAgIDsgICAgICAgLy8gTm8gYWN0aW9ucyBuZWNlc3NhcnkKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUHJvY2VzcyBhIEdFVCByZXF1ZXN0IGZvciB0aGUgc3BlY2lmaWVkIHJlc291cmNlLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXNwb25zZSBUaGUgc2VydmxldCByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQtc3BlY2lmaWVkIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gbW9kZSBpcyBmbGFnIGZvciBIVE1MIG9yIFhNTCBvdXRwdXQKKyAgICAgICAgaW50IG1vZGUgPSAwOworICAgICAgICAvLyBpZiA/WE1MPXRydWUsIHNldCB0aGUgbW9kZSB0byBYTUwKKyAgICAgICAgaWYgKHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJYTUwiKSAhPSBudWxsIAorICAgICAgICAgICAgJiYgcmVxdWVzdC5nZXRQYXJhbWV0ZXIoIlhNTCIpLmVxdWFscygidHJ1ZSIpKSB7CisgICAgICAgICAgICBtb2RlID0gMTsKKyAgICAgICAgfQorICAgICAgICBTdGF0dXNUcmFuc2Zvcm1lci5zZXRDb250ZW50VHlwZShyZXNwb25zZSwgbW9kZSk7CisKKyAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisKKyAgICAgICAgYm9vbGVhbiBjb21wbGV0ZVN0YXR1cyA9IGZhbHNlOworICAgICAgICBpZiAoKHJlcXVlc3QuZ2V0UGF0aEluZm8oKSAhPSBudWxsKSAKKyAgICAgICAgICAgICYmIChyZXF1ZXN0LmdldFBhdGhJbmZvKCkuZXF1YWxzKCIvYWxsIikpKSB7CisgICAgICAgICAgICBjb21wbGV0ZVN0YXR1cyA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgLy8gdXNlIFN0YXR1c1RyYW5zZm9ybWVyIHRvIG91dHB1dCBzdGF0dXMKKyAgICAgICAgU3RhdHVzVHJhbnNmb3JtZXIud3JpdGVIZWFkZXIod3JpdGVyLG1vZGUpOworCisgICAgICAgIC8vIEJvZHkgSGVhZGVyIFNlY3Rpb24KKyAgICAgICAgT2JqZWN0W10gYXJncyA9IG5ldyBPYmplY3RbMl07CisgICAgICAgIGFyZ3NbMF0gPSByZXF1ZXN0LmdldENvbnRleHRQYXRoKCk7CisgICAgICAgIGlmIChjb21wbGV0ZVN0YXR1cykgeworICAgICAgICAgICAgYXJnc1sxXSA9IHNtLmdldFN0cmluZygic3RhdHVzU2VydmxldC5jb21wbGV0ZSIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXJnc1sxXSA9IHNtLmdldFN0cmluZygic3RhdHVzU2VydmxldC50aXRsZSIpOworICAgICAgICB9CisgICAgICAgIC8vIHVzZSBTdGF0dXNUcmFuc2Zvcm1lciB0byBvdXRwdXQgc3RhdHVzCisgICAgICAgIFN0YXR1c1RyYW5zZm9ybWVyLndyaXRlQm9keSh3cml0ZXIsYXJncyxtb2RlKTsKKworICAgICAgICAvLyBNYW5hZ2VyIFNlY3Rpb24KKyAgICAgICAgYXJncyA9IG5ldyBPYmplY3RbOV07CisgICAgICAgIGFyZ3NbMF0gPSBzbS5nZXRTdHJpbmcoImh0bWxNYW5hZ2VyU2VydmxldC5tYW5hZ2VyIik7CisgICAgICAgIGFyZ3NbMV0gPSByZXNwb25zZS5lbmNvZGVVUkwocmVxdWVzdC5nZXRDb250ZXh0UGF0aCgpICsgIi9odG1sL2xpc3QiKTsKKyAgICAgICAgYXJnc1syXSA9IHNtLmdldFN0cmluZygiaHRtbE1hbmFnZXJTZXJ2bGV0Lmxpc3QiKTsKKyAgICAgICAgYXJnc1szXSA9IHJlc3BvbnNlLmVuY29kZVVSTAorICAgICAgICAgICAgKHJlcXVlc3QuZ2V0Q29udGV4dFBhdGgoKSArICIvIiArCisgICAgICAgICAgICAgc20uZ2V0U3RyaW5nKCJodG1sTWFuYWdlclNlcnZsZXQuaGVscEh0bWxNYW5hZ2VyRmlsZSIpKTsKKyAgICAgICAgYXJnc1s0XSA9IHNtLmdldFN0cmluZygiaHRtbE1hbmFnZXJTZXJ2bGV0LmhlbHBIdG1sTWFuYWdlciIpOworICAgICAgICBhcmdzWzVdID0gcmVzcG9uc2UuZW5jb2RlVVJMCisgICAgICAgICAgICAocmVxdWVzdC5nZXRDb250ZXh0UGF0aCgpICsgIi8iICsKKyAgICAgICAgICAgICBzbS5nZXRTdHJpbmcoImh0bWxNYW5hZ2VyU2VydmxldC5oZWxwTWFuYWdlckZpbGUiKSk7CisgICAgICAgIGFyZ3NbNl0gPSBzbS5nZXRTdHJpbmcoImh0bWxNYW5hZ2VyU2VydmxldC5oZWxwTWFuYWdlciIpOworICAgICAgICBpZiAoY29tcGxldGVTdGF0dXMpIHsKKyAgICAgICAgICAgIGFyZ3NbN10gPSByZXNwb25zZS5lbmNvZGVVUkwKKyAgICAgICAgICAgICAgICAocmVxdWVzdC5nZXRDb250ZXh0UGF0aCgpICsgIi9zdGF0dXMiKTsKKyAgICAgICAgICAgIGFyZ3NbOF0gPSBzbS5nZXRTdHJpbmcoInN0YXR1c1NlcnZsZXQudGl0bGUiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFyZ3NbN10gPSByZXNwb25zZS5lbmNvZGVVUkwKKyAgICAgICAgICAgICAgICAocmVxdWVzdC5nZXRDb250ZXh0UGF0aCgpICsgIi9zdGF0dXMvYWxsIik7CisgICAgICAgICAgICBhcmdzWzhdID0gc20uZ2V0U3RyaW5nKCJzdGF0dXNTZXJ2bGV0LmNvbXBsZXRlIik7CisgICAgICAgIH0KKyAgICAgICAgLy8gdXNlIFN0YXR1c1RyYW5zZm9ybWVyIHRvIG91dHB1dCBzdGF0dXMKKyAgICAgICAgU3RhdHVzVHJhbnNmb3JtZXIud3JpdGVNYW5hZ2VyKHdyaXRlcixhcmdzLG1vZGUpOworCisgICAgICAgIC8vIFNlcnZlciBIZWFkZXIgU2VjdGlvbgorICAgICAgICBhcmdzID0gbmV3IE9iamVjdFs3XTsKKyAgICAgICAgYXJnc1swXSA9IHNtLmdldFN0cmluZygiaHRtbE1hbmFnZXJTZXJ2bGV0LnNlcnZlclRpdGxlIik7CisgICAgICAgIGFyZ3NbMV0gPSBzbS5nZXRTdHJpbmcoImh0bWxNYW5hZ2VyU2VydmxldC5zZXJ2ZXJWZXJzaW9uIik7CisgICAgICAgIGFyZ3NbMl0gPSBzbS5nZXRTdHJpbmcoImh0bWxNYW5hZ2VyU2VydmxldC5zZXJ2ZXJKVk1WZXJzaW9uIik7CisgICAgICAgIGFyZ3NbM10gPSBzbS5nZXRTdHJpbmcoImh0bWxNYW5hZ2VyU2VydmxldC5zZXJ2ZXJKVk1WZW5kb3IiKTsKKyAgICAgICAgYXJnc1s0XSA9IHNtLmdldFN0cmluZygiaHRtbE1hbmFnZXJTZXJ2bGV0LnNlcnZlck9TTmFtZSIpOworICAgICAgICBhcmdzWzVdID0gc20uZ2V0U3RyaW5nKCJodG1sTWFuYWdlclNlcnZsZXQuc2VydmVyT1NWZXJzaW9uIik7CisgICAgICAgIGFyZ3NbNl0gPSBzbS5nZXRTdHJpbmcoImh0bWxNYW5hZ2VyU2VydmxldC5zZXJ2ZXJPU0FyY2giKTsKKyAgICAgICAgLy8gdXNlIFN0YXR1c1RyYW5zZm9ybWVyIHRvIG91dHB1dCBzdGF0dXMKKyAgICAgICAgU3RhdHVzVHJhbnNmb3JtZXIud3JpdGVQYWdlSGVhZGluZyh3cml0ZXIsYXJncyxtb2RlKTsKKworICAgICAgICAvLyBTZXJ2ZXIgUm93IFNlY3Rpb24KKyAgICAgICAgYXJncyA9IG5ldyBPYmplY3RbNl07CisgICAgICAgIGFyZ3NbMF0gPSBTZXJ2ZXJJbmZvLmdldFNlcnZlckluZm8oKTsKKyAgICAgICAgYXJnc1sxXSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5ydW50aW1lLnZlcnNpb24iKTsKKyAgICAgICAgYXJnc1syXSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS52bS52ZW5kb3IiKTsKKyAgICAgICAgYXJnc1szXSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MubmFtZSIpOworICAgICAgICBhcmdzWzRdID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcy52ZXJzaW9uIik7CisgICAgICAgIGFyZ3NbNV0gPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLmFyY2giKTsKKyAgICAgICAgLy8gdXNlIFN0YXR1c1RyYW5zZm9ybWVyIHRvIG91dHB1dCBzdGF0dXMKKyAgICAgICAgU3RhdHVzVHJhbnNmb3JtZXIud3JpdGVTZXJ2ZXJJbmZvKHdyaXRlciwgYXJncywgbW9kZSk7CisKKyAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgLy8gRGlzcGxheSB2aXJ0dWFsIG1hY2hpbmUgc3RhdGlzdGljcworICAgICAgICAgICAgU3RhdHVzVHJhbnNmb3JtZXIud3JpdGVWTVN0YXRlKHdyaXRlcixtb2RlKTsKKworICAgICAgICAgICAgRW51bWVyYXRpb24gZW51bWVyYXRpb24gPSB0aHJlYWRQb29scy5lbGVtZW50cygpOworICAgICAgICAgICAgd2hpbGUgKGVudW1lcmF0aW9uLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSBvYmplY3ROYW1lID0gKE9iamVjdE5hbWUpIGVudW1lcmF0aW9uLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBvYmplY3ROYW1lLmdldEtleVByb3BlcnR5KCJuYW1lIik7CisgICAgICAgICAgICAgICAgLy8gdXNlIFN0YXR1c1RyYW5zZm9ybWVyIHRvIG91dHB1dCBzdGF0dXMKKyAgICAgICAgICAgICAgICBTdGF0dXNUcmFuc2Zvcm1lci53cml0ZUNvbm5lY3RvclN0YXRlCisgICAgICAgICAgICAgICAgICAgICh3cml0ZXIsIG9iamVjdE5hbWUsCisgICAgICAgICAgICAgICAgICAgICBuYW1lLCBtQmVhblNlcnZlciwgZ2xvYmFsUmVxdWVzdFByb2Nlc3NvcnMsCisgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0UHJvY2Vzc29ycywgbW9kZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgocmVxdWVzdC5nZXRQYXRoSW5mbygpICE9IG51bGwpIAorICAgICAgICAgICAgICAgICYmIChyZXF1ZXN0LmdldFBhdGhJbmZvKCkuZXF1YWxzKCIvYWxsIikpKSB7CisgICAgICAgICAgICAgICAgLy8gTm90ZTogUmV0cmlldmluZyB0aGUgZnVsbCBzdGF0dXMgaXMgbXVjaCBzbG93ZXIKKyAgICAgICAgICAgICAgICAvLyB1c2UgU3RhdHVzVHJhbnNmb3JtZXIgdG8gb3V0cHV0IHN0YXR1cworICAgICAgICAgICAgICAgIFN0YXR1c1RyYW5zZm9ybWVyLndyaXRlRGV0YWlsZWRTdGF0ZQorICAgICAgICAgICAgICAgICAgICAod3JpdGVyLCBtQmVhblNlcnZlciwgbW9kZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uKGUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gdXNlIFN0YXR1c1RyYW5zZm9ybWVyIHRvIG91dHB1dCBzdGF0dXMKKyAgICAgICAgU3RhdHVzVHJhbnNmb3JtZXIud3JpdGVGb290ZXIod3JpdGVyLCBtb2RlKTsKKworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTm90aWZpY2F0aW9uTGlzdGVuZXIgTWV0aG9kcworCisKKyAgICBwdWJsaWMgdm9pZCBoYW5kbGVOb3RpZmljYXRpb24oTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLk9iamVjdCBoYW5kYmFjaykgeworCisgICAgICAgIGlmIChub3RpZmljYXRpb24gaW5zdGFuY2VvZiBNQmVhblNlcnZlck5vdGlmaWNhdGlvbikgeworICAgICAgICAgICAgT2JqZWN0TmFtZSBvYmplY3ROYW1lID0gCisgICAgICAgICAgICAgICAgKChNQmVhblNlcnZlck5vdGlmaWNhdGlvbikgbm90aWZpY2F0aW9uKS5nZXRNQmVhbk5hbWUoKTsKKyAgICAgICAgICAgIGlmIChub3RpZmljYXRpb24uZ2V0VHlwZSgpLmVxdWFscworICAgICAgICAgICAgICAgIChNQmVhblNlcnZlck5vdGlmaWNhdGlvbi5SRUdJU1RSQVRJT05fTk9USUZJQ0FUSU9OKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyB0eXBlID0gb2JqZWN0TmFtZS5nZXRLZXlQcm9wZXJ0eSgidHlwZSIpOworICAgICAgICAgICAgICAgIGlmICh0eXBlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUuZXF1YWxzKCJQcm90b2NvbEhhbmRsZXIiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2xIYW5kbGVycy5hZGRFbGVtZW50KG9iamVjdE5hbWUpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUuZXF1YWxzKCJUaHJlYWRQb29sIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFBvb2xzLmFkZEVsZW1lbnQob2JqZWN0TmFtZSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZS5lcXVhbHMoIkdsb2JhbFJlcXVlc3RQcm9jZXNzb3IiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsUmVxdWVzdFByb2Nlc3NvcnMuYWRkRWxlbWVudChvYmplY3ROYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlLmVxdWFscygiUmVxdWVzdFByb2Nlc3NvciIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0UHJvY2Vzc29ycy5hZGRFbGVtZW50KG9iamVjdE5hbWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChub3RpZmljYXRpb24uZ2V0VHlwZSgpLmVxdWFscworICAgICAgICAgICAgICAgICAgICAgICAoTUJlYW5TZXJ2ZXJOb3RpZmljYXRpb24uVU5SRUdJU1RSQVRJT05fTk9USUZJQ0FUSU9OKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyB0eXBlID0gb2JqZWN0TmFtZS5nZXRLZXlQcm9wZXJ0eSgidHlwZSIpOworICAgICAgICAgICAgICAgIGlmICh0eXBlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUuZXF1YWxzKCJQcm90b2NvbEhhbmRsZXIiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2xIYW5kbGVycy5yZW1vdmVFbGVtZW50KG9iamVjdE5hbWUpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUuZXF1YWxzKCJUaHJlYWRQb29sIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFBvb2xzLnJlbW92ZUVsZW1lbnQob2JqZWN0TmFtZSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZS5lcXVhbHMoIkdsb2JhbFJlcXVlc3RQcm9jZXNzb3IiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsUmVxdWVzdFByb2Nlc3NvcnMucmVtb3ZlRWxlbWVudChvYmplY3ROYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlLmVxdWFscygiUmVxdWVzdFByb2Nlc3NvciIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0UHJvY2Vzc29ycy5yZW1vdmVFbGVtZW50KG9iamVjdE5hbWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFN0cmluZyBqMmVlVHlwZSA9IG9iamVjdE5hbWUuZ2V0S2V5UHJvcGVydHkoImoyZWVUeXBlIik7CisgICAgICAgICAgICAgICAgaWYgKGoyZWVUeXBlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvbWFuYWdlci9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS9jYXRhbGluYS9tYW5hZ2VyL1N0YXR1c1RyYW5zZm9ybWVyLmphdmEgYi9jb250YWluZXIvd2ViYXBwcy9tYW5hZ2VyL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL2NhdGFsaW5hL21hbmFnZXIvU3RhdHVzVHJhbnNmb3JtZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWE1NGI3Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvbWFuYWdlci9XRUItSU5GL2NsYXNzZXMvb3JnL2FwYWNoZS9jYXRhbGluYS9tYW5hZ2VyL1N0YXR1c1RyYW5zZm9ybWVyLmphdmEKQEAgLTAsMCArMSw4NjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2F0YWxpbmEubWFuYWdlcjsKKworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnV0aWwuUmVxdWVzdFV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS50b21jYXQudXRpbC5jb21wYXQuSmRrQ29tcGF0OworCitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdEluc3RhbmNlOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsKKworLyoqCisgKiBUaGlzIGlzIGEgcmVmYWN0b3Jpbmcgb2YgdGhlIHNlcnZsZXQgdG8gZXh0ZXJuYWxpemUKKyAqIHRoZSBvdXRwdXQgaW50byBhIHNpbXBsZSBjbGFzcy4gQWx0aG91Z2ggd2UgY291bGQKKyAqIHVzZSBYU0xULCB0aGF0IGlzIHVubmVjZXNzYXJpbHkgY29tcGxleC4KKyAqCisgKiBAYXV0aG9yIFBldGVyIExpbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgU3RhdHVzVHJhbnNmb3JtZXIgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldENvbnRlbnRUeXBlKEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW9kZSkgeworICAgICAgICBpZiAobW9kZSA9PSAwKXsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L2h0bWw7Y2hhcnNldD0iK0NvbnN0YW50cy5DSEFSU0VUKTsKKyAgICAgICAgfSBlbHNlIGlmIChtb2RlID09IDEpeworICAgICAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQveG1sO2NoYXJzZXQ9IitDb25zdGFudHMuQ0hBUlNFVCk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgYSBHRVQgcmVxdWVzdCBmb3IgdGhlIHNwZWNpZmllZCByZXNvdXJjZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIHNlcnZsZXQgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0LXNwZWNpZmllZCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVIZWFkZXIoUHJpbnRXcml0ZXIgd3JpdGVyLCBpbnQgbW9kZSkgeworICAgICAgICBpZiAobW9kZSA9PSAwKXsKKyAgICAgICAgICAgIC8vIEhUTUwgSGVhZGVyIFNlY3Rpb24KKyAgICAgICAgICAgIHdyaXRlci5wcmludChDb25zdGFudHMuSFRNTF9IRUFERVJfU0VDVElPTik7CisgICAgICAgIH0gZWxzZSBpZiAobW9kZSA9PSAxKXsKKyAgICAgICAgICAgIHdyaXRlci53cml0ZShDb25zdGFudHMuWE1MX0RFQ0xBUkFUSU9OKTsKKyAgICAgICAgICAgIHdyaXRlci53cml0ZQorICAgICAgICAgICAgICAgIChDb25zdGFudHMuWE1MX1NUWUxFKTsKKyAgICAgICAgICAgIHdyaXRlci53cml0ZSgiPHN0YXR1cz4iKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogV3JpdGUgdGhlIGhlYWRlciBib2R5LiBYTUwgb3V0cHV0IGRvZXNuJ3QgYm90aGVyCisgICAgICogdG8gb3V0cHV0IHRoaXMgc3R1ZmYsIHNpbmNlIGl0J3MganVzdCB0aXRsZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gd3JpdGVyIFRoZSBvdXRwdXQgd3JpdGVyCisgICAgICogQHBhcmFtIGFyZ3MgV2hhdCB0byB3cml0ZQorICAgICAqIEBwYXJhbSBtb2RlIDAgbWVhbnMgd3JpdGUgCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlQm9keShQcmludFdyaXRlciB3cml0ZXIsIE9iamVjdFtdIGFyZ3MsIGludCBtb2RlKSB7CisgICAgICAgIGlmIChtb2RlID09IDApeworICAgICAgICAgICAgd3JpdGVyLnByaW50KE1lc3NhZ2VGb3JtYXQuZm9ybWF0CisgICAgICAgICAgICAgICAgICAgICAgICAgKENvbnN0YW50cy5CT0RZX0hFQURFUl9TRUNUSU9OLCBhcmdzKSk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFdyaXRlIHRoZSBtYW5hZ2VyIHdlYmFwcCBpbmZvcm1hdGlvbi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gd3JpdGVyIFRoZSBvdXRwdXQgd3JpdGVyCisgICAgICogQHBhcmFtIGFyZ3MgV2hhdCB0byB3cml0ZQorICAgICAqIEBwYXJhbSBtb2RlIDAgbWVhbnMgd3JpdGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVNYW5hZ2VyKFByaW50V3JpdGVyIHdyaXRlciwgT2JqZWN0W10gYXJncywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW9kZSkgeworICAgICAgICBpZiAobW9kZSA9PSAwKXsKKyAgICAgICAgICAgIHdyaXRlci5wcmludChNZXNzYWdlRm9ybWF0LmZvcm1hdChDb25zdGFudHMuTUFOQUdFUl9TRUNUSU9OLCBhcmdzKSk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZVBhZ2VIZWFkaW5nKFByaW50V3JpdGVyIHdyaXRlciwgT2JqZWN0W10gYXJncywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1vZGUpIHsKKyAgICAgICAgaWYgKG1vZGUgPT0gMCl7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoTWVzc2FnZUZvcm1hdC5mb3JtYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAoQ29uc3RhbnRzLlNFUlZFUl9IRUFERVJfU0VDVElPTiwgYXJncykpOworICAgICAgICB9CisgICAgfQorCisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVTZXJ2ZXJJbmZvKFByaW50V3JpdGVyIHdyaXRlciwgT2JqZWN0W10gYXJncywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW9kZSl7CisgICAgICAgIGlmIChtb2RlID09IDApeworICAgICAgICAgICAgd3JpdGVyLnByaW50KE1lc3NhZ2VGb3JtYXQuZm9ybWF0KENvbnN0YW50cy5TRVJWRVJfUk9XX1NFQ1RJT04sIGFyZ3MpKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlRm9vdGVyKFByaW50V3JpdGVyIHdyaXRlciwgaW50IG1vZGUpIHsKKyAgICAgICAgaWYgKG1vZGUgPT0gMCl7CisgICAgICAgICAgICAvLyBIVE1MIFRhaWwgU2VjdGlvbgorICAgICAgICAgICAgd3JpdGVyLnByaW50KENvbnN0YW50cy5IVE1MX1RBSUxfU0VDVElPTik7CisgICAgICAgIH0gZWxzZSBpZiAobW9kZSA9PSAxKXsKKyAgICAgICAgICAgIHdyaXRlci53cml0ZSgiPC9zdGF0dXM+Iik7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFdyaXRlIHRoZSBWTSBzdGF0ZS4gTW9kZSAwIHdpbGwgZ2VuZXJhdGUgSFRNTC4KKyAgICAgKiBNb2RlIDEgd2lsbCBnZW5lcmF0ZSBYTUwuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlVk1TdGF0ZShQcmludFdyaXRlciB3cml0ZXIsIGludCBtb2RlKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAobW9kZSA9PSAwKXsKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiPGgxPkpWTTwvaDE+Iik7CisKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiPHA+Iik7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoIiBGcmVlIG1lbW9yeTogIik7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoZm9ybWF0U2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgIChuZXcgTG9uZyhSdW50aW1lLmdldFJ1bnRpbWUoKS5mcmVlTWVtb3J5KCkpLCB0cnVlKSk7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoIiBUb3RhbCBtZW1vcnk6ICIpOworICAgICAgICAgICAgd3JpdGVyLnByaW50KGZvcm1hdFNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAobmV3IExvbmcoUnVudGltZS5nZXRSdW50aW1lKCkudG90YWxNZW1vcnkoKSksIHRydWUpKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiIE1heCBtZW1vcnk6ICIpOworICAgICAgICAgICAgd3JpdGVyLnByaW50KGZvcm1hdFNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAobmV3IExvbmcoSmRrQ29tcGF0LmdldEpka0NvbXBhdCgpLmdldE1heE1lbW9yeSgpKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiPC9wPiIpOworICAgICAgICB9IGVsc2UgaWYgKG1vZGUgPT0gMSl7CisgICAgICAgICAgICB3cml0ZXIud3JpdGUoIjxqdm0+Iik7CisKKyAgICAgICAgICAgIHdyaXRlci53cml0ZSgiPG1lbW9yeSIpOworICAgICAgICAgICAgd3JpdGVyLndyaXRlKCIgZnJlZT0nIiArIFJ1bnRpbWUuZ2V0UnVudGltZSgpLmZyZWVNZW1vcnkoKSArICInIik7CisgICAgICAgICAgICB3cml0ZXIud3JpdGUoIiB0b3RhbD0nIiArIFJ1bnRpbWUuZ2V0UnVudGltZSgpLnRvdGFsTWVtb3J5KCkgKyAiJyIpOworICAgICAgICAgICAgd3JpdGVyLndyaXRlKCIgbWF4PSciICsgSmRrQ29tcGF0LmdldEpka0NvbXBhdCgpLmdldE1heE1lbW9yeSgpICsgIicvPiIpOworCisgICAgICAgICAgICB3cml0ZXIud3JpdGUoIjwvanZtPiIpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFdyaXRlIGNvbm5lY3RvciBzdGF0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVDb25uZWN0b3JTdGF0ZShQcmludFdyaXRlciB3cml0ZXIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgdHBOYW1lLCBTdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQmVhblNlcnZlciBtQmVhblNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3IgZ2xvYmFsUmVxdWVzdFByb2Nlc3NvcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yIHJlcXVlc3RQcm9jZXNzb3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtb2RlKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAobW9kZSA9PSAwKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoIjxoMT4iKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludChuYW1lKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiPC9oMT4iKTsKKworICAgICAgICAgICAgd3JpdGVyLnByaW50KCI8cD4iKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiIE1heCB0aHJlYWRzOiAiKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludChtQmVhblNlcnZlci5nZXRBdHRyaWJ1dGUodHBOYW1lLCAibWF4VGhyZWFkcyIpKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiIE1pbiBzcGFyZSB0aHJlYWRzOiAiKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludChtQmVhblNlcnZlci5nZXRBdHRyaWJ1dGUodHBOYW1lLCAibWluU3BhcmVUaHJlYWRzIikpOworICAgICAgICAgICAgd3JpdGVyLnByaW50KCIgTWF4IHNwYXJlIHRocmVhZHM6ICIpOworICAgICAgICAgICAgd3JpdGVyLnByaW50KG1CZWFuU2VydmVyLmdldEF0dHJpYnV0ZSh0cE5hbWUsICJtYXhTcGFyZVRocmVhZHMiKSk7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoIiBDdXJyZW50IHRocmVhZCBjb3VudDogIik7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQobUJlYW5TZXJ2ZXIuZ2V0QXR0cmlidXRlKHRwTmFtZSwgImN1cnJlbnRUaHJlYWRDb3VudCIpKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiIEN1cnJlbnQgdGhyZWFkIGJ1c3k6ICIpOworICAgICAgICAgICAgd3JpdGVyLnByaW50KG1CZWFuU2VydmVyLmdldEF0dHJpYnV0ZSh0cE5hbWUsICJjdXJyZW50VGhyZWFkc0J1c3kiKSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiPGJyPiIpOworCisgICAgICAgICAgICBPYmplY3ROYW1lIGdycE5hbWUgPSBudWxsOworCisgICAgICAgICAgICBFbnVtZXJhdGlvbiBlbnVtZXJhdGlvbiA9IGdsb2JhbFJlcXVlc3RQcm9jZXNzb3JzLmVsZW1lbnRzKCk7CisgICAgICAgICAgICB3aGlsZSAoZW51bWVyYXRpb24uaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICBPYmplY3ROYW1lIG9iamVjdE5hbWUgPSAoT2JqZWN0TmFtZSkgZW51bWVyYXRpb24ubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMob2JqZWN0TmFtZS5nZXRLZXlQcm9wZXJ0eSgibmFtZSIpKSkgeworICAgICAgICAgICAgICAgICAgICBncnBOYW1lID0gb2JqZWN0TmFtZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChncnBOYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiIE1heCBwcm9jZXNzaW5nIHRpbWU6ICIpOworICAgICAgICAgICAgd3JpdGVyLnByaW50KGZvcm1hdFRpbWUobUJlYW5TZXJ2ZXIuZ2V0QXR0cmlidXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ3JwTmFtZSwgIm1heFRpbWUiKSwgZmFsc2UpKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiIFByb2Nlc3NpbmcgdGltZTogIik7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoZm9ybWF0VGltZShtQmVhblNlcnZlci5nZXRBdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChncnBOYW1lLCAicHJvY2Vzc2luZ1RpbWUiKSwgdHJ1ZSkpOworICAgICAgICAgICAgd3JpdGVyLnByaW50KCIgUmVxdWVzdCBjb3VudDogIik7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQobUJlYW5TZXJ2ZXIuZ2V0QXR0cmlidXRlKGdycE5hbWUsICJyZXF1ZXN0Q291bnQiKSk7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoIiBFcnJvciBjb3VudDogIik7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQobUJlYW5TZXJ2ZXIuZ2V0QXR0cmlidXRlKGdycE5hbWUsICJlcnJvckNvdW50IikpOworICAgICAgICAgICAgd3JpdGVyLnByaW50KCIgQnl0ZXMgcmVjZWl2ZWQ6ICIpOworICAgICAgICAgICAgd3JpdGVyLnByaW50KGZvcm1hdFNpemUobUJlYW5TZXJ2ZXIuZ2V0QXR0cmlidXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ3JwTmFtZSwgImJ5dGVzUmVjZWl2ZWQiKSwgdHJ1ZSkpOworICAgICAgICAgICAgd3JpdGVyLnByaW50KCIgQnl0ZXMgc2VudDogIik7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoZm9ybWF0U2l6ZShtQmVhblNlcnZlci5nZXRBdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChncnBOYW1lLCAiYnl0ZXNTZW50IiksIHRydWUpKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiPC9wPiIpOworCisgICAgICAgICAgICB3cml0ZXIucHJpbnQoIjx0YWJsZSBib3JkZXI9XCIwXCI+PHRyPjx0aD5TdGFnZTwvdGg+PHRoPlRpbWU8L3RoPjx0aD5CIFNlbnQ8L3RoPjx0aD5CIFJlY3Y8L3RoPjx0aD5DbGllbnQ8L3RoPjx0aD5WSG9zdDwvdGg+PHRoPlJlcXVlc3Q8L3RoPjwvdHI+Iik7CisKKyAgICAgICAgICAgIGVudW1lcmF0aW9uID0gcmVxdWVzdFByb2Nlc3NvcnMuZWxlbWVudHMoKTsKKyAgICAgICAgICAgIHdoaWxlIChlbnVtZXJhdGlvbi5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgb2JqZWN0TmFtZSA9IChPYmplY3ROYW1lKSBlbnVtZXJhdGlvbi5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgICAgIGlmIChuYW1lLmVxdWFscyhvYmplY3ROYW1lLmdldEtleVByb3BlcnR5KCJ3b3JrZXIiKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KCI8dHI+Iik7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlUHJvY2Vzc29yU3RhdGUod3JpdGVyLCBvYmplY3ROYW1lLCBtQmVhblNlcnZlciwgbW9kZSk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5wcmludCgiPC90cj4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiPC90YWJsZT4iKTsKKworICAgICAgICAgICAgd3JpdGVyLnByaW50KCI8cD4iKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiUDogUGFyc2UgYW5kIHByZXBhcmUgcmVxdWVzdCBTOiBTZXJ2aWNlIEY6IEZpbmlzaGluZyBSOiBSZWFkeSBLOiBLZWVwYWxpdmUiKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiPC9wPiIpOworICAgICAgICB9IGVsc2UgaWYgKG1vZGUgPT0gMSl7CisgICAgICAgICAgICB3cml0ZXIud3JpdGUoIjxjb25uZWN0b3IgbmFtZT0nIiArIG5hbWUgKyAiJz4iKTsKKworICAgICAgICAgICAgd3JpdGVyLndyaXRlKCI8dGhyZWFkSW5mbyAiKTsKKyAgICAgICAgICAgIHdyaXRlci53cml0ZSgiIG1heFRocmVhZHM9XCIiICsgbUJlYW5TZXJ2ZXIuZ2V0QXR0cmlidXRlKHRwTmFtZSwgIm1heFRocmVhZHMiKSArICJcIiIpOworICAgICAgICAgICAgd3JpdGVyLndyaXRlKCIgbWluU3BhcmVUaHJlYWRzPVwiIiArIG1CZWFuU2VydmVyLmdldEF0dHJpYnV0ZSh0cE5hbWUsICJtaW5TcGFyZVRocmVhZHMiKSArICJcIiIpOworICAgICAgICAgICAgd3JpdGVyLndyaXRlKCIgbWF4U3BhcmVUaHJlYWRzPVwiIiArIG1CZWFuU2VydmVyLmdldEF0dHJpYnV0ZSh0cE5hbWUsICJtYXhTcGFyZVRocmVhZHMiKSArICJcIiIpOworICAgICAgICAgICAgd3JpdGVyLndyaXRlKCIgY3VycmVudFRocmVhZENvdW50PVwiIiArIG1CZWFuU2VydmVyLmdldEF0dHJpYnV0ZSh0cE5hbWUsICJjdXJyZW50VGhyZWFkQ291bnQiKSArICJcIiIpOworICAgICAgICAgICAgd3JpdGVyLndyaXRlKCIgY3VycmVudFRocmVhZHNCdXN5PVwiIiArIG1CZWFuU2VydmVyLmdldEF0dHJpYnV0ZSh0cE5hbWUsICJjdXJyZW50VGhyZWFkc0J1c3kiKSArICJcIiIpOworICAgICAgICAgICAgd3JpdGVyLndyaXRlKCIgLz4iKTsKKworICAgICAgICAgICAgT2JqZWN0TmFtZSBncnBOYW1lID0gbnVsbDsKKworICAgICAgICAgICAgRW51bWVyYXRpb24gZW51bWVyYXRpb24gPSBnbG9iYWxSZXF1ZXN0UHJvY2Vzc29ycy5lbGVtZW50cygpOworICAgICAgICAgICAgd2hpbGUgKGVudW1lcmF0aW9uLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSBvYmplY3ROYW1lID0gKE9iamVjdE5hbWUpIGVudW1lcmF0aW9uLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgaWYgKG5hbWUuZXF1YWxzKG9iamVjdE5hbWUuZ2V0S2V5UHJvcGVydHkoIm5hbWUiKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZ3JwTmFtZSA9IG9iamVjdE5hbWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZ3JwTmFtZSAhPSBudWxsKSB7CisKKyAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoIjxyZXF1ZXN0SW5mbyAiKTsKKyAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoIiBtYXhUaW1lPVwiIiArIG1CZWFuU2VydmVyLmdldEF0dHJpYnV0ZShncnBOYW1lLCAibWF4VGltZSIpICsgIlwiIik7CisgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKCIgcHJvY2Vzc2luZ1RpbWU9XCIiICsgbUJlYW5TZXJ2ZXIuZ2V0QXR0cmlidXRlKGdycE5hbWUsICJwcm9jZXNzaW5nVGltZSIpICsgIlwiIik7CisgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKCIgcmVxdWVzdENvdW50PVwiIiArIG1CZWFuU2VydmVyLmdldEF0dHJpYnV0ZShncnBOYW1lLCAicmVxdWVzdENvdW50IikgKyAiXCIiKTsKKyAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoIiBlcnJvckNvdW50PVwiIiArIG1CZWFuU2VydmVyLmdldEF0dHJpYnV0ZShncnBOYW1lLCAiZXJyb3JDb3VudCIpICsgIlwiIik7CisgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKCIgYnl0ZXNSZWNlaXZlZD1cIiIgKyBtQmVhblNlcnZlci5nZXRBdHRyaWJ1dGUoZ3JwTmFtZSwgImJ5dGVzUmVjZWl2ZWQiKSArICJcIiIpOworICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZSgiIGJ5dGVzU2VudD1cIiIgKyBtQmVhblNlcnZlci5nZXRBdHRyaWJ1dGUoZ3JwTmFtZSwgImJ5dGVzU2VudCIpICsgIlwiIik7CisgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKCIgLz4iKTsKKworICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZSgiPHdvcmtlcnM+Iik7CisgICAgICAgICAgICAgICAgZW51bWVyYXRpb24gPSByZXF1ZXN0UHJvY2Vzc29ycy5lbGVtZW50cygpOworICAgICAgICAgICAgICAgIHdoaWxlIChlbnVtZXJhdGlvbi5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgICAgICBPYmplY3ROYW1lIG9iamVjdE5hbWUgPSAoT2JqZWN0TmFtZSkgZW51bWVyYXRpb24ubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUuZXF1YWxzKG9iamVjdE5hbWUuZ2V0S2V5UHJvcGVydHkoIndvcmtlciIpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVQcm9jZXNzb3JTdGF0ZSh3cml0ZXIsIG9iamVjdE5hbWUsIG1CZWFuU2VydmVyLCBtb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoIjwvd29ya2Vycz4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgd3JpdGVyLndyaXRlKCI8L2Nvbm5lY3Rvcj4iKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBXcml0ZSBwcm9jZXNzb3Igc3RhdGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHdyaXRlUHJvY2Vzc29yU3RhdGUoUHJpbnRXcml0ZXIgd3JpdGVyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3ROYW1lIHBOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1CZWFuU2VydmVyIG1CZWFuU2VydmVyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW9kZSkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgSW50ZWdlciBzdGFnZVZhbHVlID0gCisgICAgICAgICAgICAoSW50ZWdlcikgbUJlYW5TZXJ2ZXIuZ2V0QXR0cmlidXRlKHBOYW1lLCAic3RhZ2UiKTsKKyAgICAgICAgaW50IHN0YWdlID0gc3RhZ2VWYWx1ZS5pbnRWYWx1ZSgpOworICAgICAgICBib29sZWFuIGZ1bGxTdGF0dXMgPSB0cnVlOworICAgICAgICBib29sZWFuIHNob3dSZXF1ZXN0ID0gdHJ1ZTsKKyAgICAgICAgU3RyaW5nIHN0YWdlU3RyID0gbnVsbDsKKworICAgICAgICBzd2l0Y2ggKHN0YWdlKSB7CisKKyAgICAgICAgY2FzZSAoMS8qb3JnLmFwYWNoZS5jb3lvdGUuQ29uc3RhbnRzLlNUQUdFX1BBUlNFKi8pOgorICAgICAgICAgICAgc3RhZ2VTdHIgPSAiUCI7CisgICAgICAgICAgICBmdWxsU3RhdHVzID0gZmFsc2U7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAoMi8qb3JnLmFwYWNoZS5jb3lvdGUuQ29uc3RhbnRzLlNUQUdFX1BSRVBBUkUqLyk6CisgICAgICAgICAgICBzdGFnZVN0ciA9ICJQIjsKKyAgICAgICAgICAgIGZ1bGxTdGF0dXMgPSBmYWxzZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICgzLypvcmcuYXBhY2hlLmNveW90ZS5Db25zdGFudHMuU1RBR0VfU0VSVklDRSovKToKKyAgICAgICAgICAgIHN0YWdlU3RyID0gIlMiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgKDQvKm9yZy5hcGFjaGUuY295b3RlLkNvbnN0YW50cy5TVEFHRV9FTkRJTlBVVCovKToKKyAgICAgICAgICAgIHN0YWdlU3RyID0gIkYiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgKDUvKm9yZy5hcGFjaGUuY295b3RlLkNvbnN0YW50cy5TVEFHRV9FTkRPVVRQVVQqLyk6CisgICAgICAgICAgICBzdGFnZVN0ciA9ICJGIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICg3LypvcmcuYXBhY2hlLmNveW90ZS5Db25zdGFudHMuU1RBR0VfRU5ERUQqLyk6CisgICAgICAgICAgICBzdGFnZVN0ciA9ICJSIjsKKyAgICAgICAgICAgIGZ1bGxTdGF0dXMgPSBmYWxzZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICg2LypvcmcuYXBhY2hlLmNveW90ZS5Db25zdGFudHMuU1RBR0VfS0VFUEFMSVZFKi8pOgorICAgICAgICAgICAgc3RhZ2VTdHIgPSAiSyI7CisgICAgICAgICAgICBmdWxsU3RhdHVzID0gdHJ1ZTsKKyAgICAgICAgICAgIHNob3dSZXF1ZXN0ID0gZmFsc2U7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAoMC8qb3JnLmFwYWNoZS5jb3lvdGUuQ29uc3RhbnRzLlNUQUdFX05FVyovKToKKyAgICAgICAgICAgIHN0YWdlU3RyID0gIlIiOworICAgICAgICAgICAgZnVsbFN0YXR1cyA9IGZhbHNlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAvLyBVbmtub3duIHN0YWdlCisgICAgICAgICAgICBzdGFnZVN0ciA9ICI/IjsKKyAgICAgICAgICAgIGZ1bGxTdGF0dXMgPSBmYWxzZTsKKworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1vZGUgPT0gMCkgeworICAgICAgICAgICAgd3JpdGVyLndyaXRlKCI8dGQ+PHN0cm9uZz4iKTsKKyAgICAgICAgICAgIHdyaXRlci53cml0ZShzdGFnZVN0cik7CisgICAgICAgICAgICB3cml0ZXIud3JpdGUoIjwvc3Ryb25nPjwvdGQ+Iik7CisKKyAgICAgICAgICAgIGlmIChmdWxsU3RhdHVzKSB7CisgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKCI8dGQ+Iik7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KGZvcm1hdFRpbWUobUJlYW5TZXJ2ZXIuZ2V0QXR0cmlidXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBOYW1lLCAicmVxdWVzdFByb2Nlc3NpbmdUaW1lIiksIGZhbHNlKSk7CisgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKCI8L3RkPiIpOworICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZSgiPHRkPiIpOworICAgICAgICAgICAgICAgIGlmIChzaG93UmVxdWVzdCkgeworICAgICAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQoZm9ybWF0U2l6ZShtQmVhblNlcnZlci5nZXRBdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBOYW1lLCAicmVxdWVzdEJ5dGVzU2VudCIpLCBmYWxzZSkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZSgiPyIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoIjwvdGQ+Iik7CisgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKCI8dGQ+Iik7CisgICAgICAgICAgICAgICAgaWYgKHNob3dSZXF1ZXN0KSB7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5wcmludChmb3JtYXRTaXplKG1CZWFuU2VydmVyLmdldEF0dHJpYnV0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocE5hbWUsICJyZXF1ZXN0Qnl0ZXNSZWNlaXZlZCIpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoIj8iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKCI8L3RkPiIpOworICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZSgiPHRkPiIpOworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludChmaWx0ZXIobUJlYW5TZXJ2ZXIuZ2V0QXR0cmlidXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocE5hbWUsICJyZW1vdGVBZGRyIikpKTsKKyAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoIjwvdGQ+Iik7CisgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKCI8dGQgbm93cmFwPiIpOworICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZShmaWx0ZXIobUJlYW5TZXJ2ZXIuZ2V0QXR0cmlidXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocE5hbWUsICJ2aXJ0dWFsSG9zdCIpKSk7CisgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKCI8L3RkPiIpOworICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZSgiPHRkIG5vd3JhcD4iKTsKKyAgICAgICAgICAgICAgICBpZiAoc2hvd1JlcXVlc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKGZpbHRlcihtQmVhblNlcnZlci5nZXRBdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocE5hbWUsICJtZXRob2QiKSkpOworICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoIiAiKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKGZpbHRlcihtQmVhblNlcnZlci5nZXRBdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocE5hbWUsICJjdXJyZW50VXJpIikpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHF1ZXJ5U3RyaW5nID0gKFN0cmluZykgbUJlYW5TZXJ2ZXIuZ2V0QXR0cmlidXRlCisgICAgICAgICAgICAgICAgICAgICAgICAocE5hbWUsICJjdXJyZW50UXVlcnlTdHJpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChxdWVyeVN0cmluZyAhPSBudWxsKSAmJiAoIXF1ZXJ5U3RyaW5nLmVxdWFscygiIikpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoIj8iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci5wcmludChSZXF1ZXN0VXRpbC5maWx0ZXIocXVlcnlTdHJpbmcpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoIiAiKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKGZpbHRlcihtQmVhblNlcnZlci5nZXRBdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocE5hbWUsICJwcm90b2NvbCIpKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKCI/Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZSgiPC90ZD4iKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKCI8dGQ+PzwvdGQ+PHRkPj88L3RkPjx0ZD4/PC90ZD48dGQ+PzwvdGQ+PHRkPj88L3RkPjx0ZD4/PC90ZD4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChtb2RlID09IDEpeworICAgICAgICAgICAgd3JpdGVyLndyaXRlKCI8d29ya2VyICIpOworICAgICAgICAgICAgd3JpdGVyLndyaXRlKCIgc3RhZ2U9XCIiICsgc3RhZ2VTdHIgKyAiXCIiKTsKKworICAgICAgICAgICAgaWYgKGZ1bGxTdGF0dXMpIHsKKyAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoIiByZXF1ZXN0UHJvY2Vzc2luZ1RpbWU9XCIiIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1CZWFuU2VydmVyLmdldEF0dHJpYnV0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocE5hbWUsICJyZXF1ZXN0UHJvY2Vzc2luZ1RpbWUiKSArICJcIiIpOworICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZSgiIHJlcXVlc3RCeXRlc1NlbnQ9XCIiKTsKKyAgICAgICAgICAgICAgICBpZiAoc2hvd1JlcXVlc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKCIiICsgbUJlYW5TZXJ2ZXIuZ2V0QXR0cmlidXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocE5hbWUsICJyZXF1ZXN0Qnl0ZXNTZW50IikpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZSgiMCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoIlwiIik7CisgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKCIgcmVxdWVzdEJ5dGVzUmVjZWl2ZWQ9XCIiKTsKKyAgICAgICAgICAgICAgICBpZiAoc2hvd1JlcXVlc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKCIiICsgbUJlYW5TZXJ2ZXIuZ2V0QXR0cmlidXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocE5hbWUsICJyZXF1ZXN0Qnl0ZXNSZWNlaXZlZCIpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoIjAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKCJcIiIpOworICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZSgiIHJlbW90ZUFkZHI9XCIiIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGZpbHRlcihtQmVhblNlcnZlci5nZXRBdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBOYW1lLCAicmVtb3RlQWRkciIpKSArICJcIiIpOworICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZSgiIHZpcnR1YWxIb3N0PVwiIiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBmaWx0ZXIobUJlYW5TZXJ2ZXIuZ2V0QXR0cmlidXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwTmFtZSwgInZpcnR1YWxIb3N0IikpICsgIlwiIik7CisKKyAgICAgICAgICAgICAgICBpZiAoc2hvd1JlcXVlc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKCIgbWV0aG9kPVwiIiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZmlsdGVyKG1CZWFuU2VydmVyLmdldEF0dHJpYnV0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBOYW1lLCAibWV0aG9kIikpICsgIlwiIik7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZSgiIGN1cnJlbnRVcmk9XCIiIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBmaWx0ZXIobUJlYW5TZXJ2ZXIuZ2V0QXR0cmlidXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocE5hbWUsICJjdXJyZW50VXJpIikpICsgIlwiIik7CisKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHF1ZXJ5U3RyaW5nID0gKFN0cmluZykgbUJlYW5TZXJ2ZXIuZ2V0QXR0cmlidXRlCisgICAgICAgICAgICAgICAgICAgICAgICAocE5hbWUsICJjdXJyZW50UXVlcnlTdHJpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChxdWVyeVN0cmluZyAhPSBudWxsKSAmJiAoIXF1ZXJ5U3RyaW5nLmVxdWFscygiIikpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoIiBjdXJyZW50UXVlcnlTdHJpbmc9XCIiIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgUmVxdWVzdFV0aWwuZmlsdGVyKHF1ZXJ5U3RyaW5nKSArICJcIiIpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKCIgY3VycmVudFF1ZXJ5U3RyaW5nPVwiJiM2MztcIiIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZSgiIHByb3RvY29sPVwiIiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZmlsdGVyKG1CZWFuU2VydmVyLmdldEF0dHJpYnV0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBOYW1lLCAicHJvdG9jb2wiKSkgKyAiXCIiKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoIiBtZXRob2Q9XCImIzYzO1wiIik7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZSgiIGN1cnJlbnRVcmk9XCImIzYzO1wiIik7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZSgiIGN1cnJlbnRRdWVyeVN0cmluZz1cIiYjNjM7XCIiKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKCIgcHJvdG9jb2w9XCImIzYzO1wiIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoIiByZXF1ZXN0UHJvY2Vzc2luZ1RpbWU9XCIwXCIiKTsKKyAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoIiByZXF1ZXN0Qnl0ZXNTZW50PVwiMFwiIik7CisgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKCIgcmVxdWVzdEJ5dGVzUmVjaWV2ZWQ9XCIwXCIiKTsKKyAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoIiByZW1vdGVBZGRyPVwiJiM2MztcIiIpOworICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZSgiIHZpcnR1YWxIb3N0PVwiJiM2MztcIiIpOworICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZSgiIG1ldGhvZD1cIiYjNjM7XCIiKTsKKyAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoIiBjdXJyZW50VXJpPVwiJiM2MztcIiIpOworICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZSgiIGN1cnJlbnRRdWVyeVN0cmluZz1cIiYjNjM7XCIiKTsKKyAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoIiBwcm90b2NvbD1cIiYjNjM7XCIiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdyaXRlci53cml0ZSgiIC8+Iik7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogV3JpdGUgYXBwbGljYXRpb25zIHN0YXRlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZURldGFpbGVkU3RhdGUoUHJpbnRXcml0ZXIgd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUJlYW5TZXJ2ZXIgbUJlYW5TZXJ2ZXIsIGludCBtb2RlKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAobW9kZSA9PSAwKXsKKyAgICAgICAgICAgIE9iamVjdE5hbWUgcXVlcnlIb3N0cyA9IG5ldyBPYmplY3ROYW1lKCIqOmoyZWVUeXBlPVdlYk1vZHVsZSwqIik7CisgICAgICAgICAgICBTZXQgaG9zdHNPTiA9IG1CZWFuU2VydmVyLnF1ZXJ5TmFtZXMocXVlcnlIb3N0cywgbnVsbCk7CisKKyAgICAgICAgICAgIC8vIE5hdmlnYXRpb24gbWVudQorICAgICAgICAgICAgd3JpdGVyLnByaW50KCI8aDE+Iik7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoIkFwcGxpY2F0aW9uIGxpc3QiKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiPC9oMT4iKTsKKworICAgICAgICAgICAgd3JpdGVyLnByaW50KCI8cD4iKTsKKyAgICAgICAgICAgIGludCBjb3VudCA9IDA7CisgICAgICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IGhvc3RzT04uaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBPYmplY3ROYW1lIGNvbnRleHRPTiA9IChPYmplY3ROYW1lKSBpdGVyYXRvci5uZXh0KCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIHdlYk1vZHVsZU5hbWUgPSBjb250ZXh0T04uZ2V0S2V5UHJvcGVydHkoIm5hbWUiKTsKKyAgICAgICAgICAgICAgICBpZiAod2ViTW9kdWxlTmFtZS5zdGFydHNXaXRoKCIvLyIpKSB7CisgICAgICAgICAgICAgICAgICAgIHdlYk1vZHVsZU5hbWUgPSB3ZWJNb2R1bGVOYW1lLnN1YnN0cmluZygyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW50IHNsYXNoID0gd2ViTW9kdWxlTmFtZS5pbmRleE9mKCIvIik7CisgICAgICAgICAgICAgICAgaWYgKHNsYXNoID09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludCgiPGEgaHJlZj1cIiMiICsgKGNvdW50KyspICsgIi4wXCI+Iik7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KHdlYk1vZHVsZU5hbWUpOworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludCgiPC9hPiIpOworICAgICAgICAgICAgICAgIGlmIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KCI8YnI+Iik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoIjwvcD4iKTsKKworICAgICAgICAgICAgLy8gV2ViYXBwIGxpc3QKKyAgICAgICAgICAgIGNvdW50ID0gMDsKKyAgICAgICAgICAgIGl0ZXJhdG9yID0gaG9zdHNPTi5pdGVyYXRvcigpOworICAgICAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgY29udGV4dE9OID0gKE9iamVjdE5hbWUpIGl0ZXJhdG9yLm5leHQoKTsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQoIjxhIGNsYXNzPVwiQS5uYW1lXCIgbmFtZT1cIiIgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKGNvdW50KyspICsgIi4wXCI+Iik7CisgICAgICAgICAgICAgICAgd3JpdGVDb250ZXh0KHdyaXRlciwgY29udGV4dE9OLCBtQmVhblNlcnZlciwgbW9kZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBlbHNlIGlmIChtb2RlID09IDEpeworICAgICAgICAgICAgLy8gZm9yIG5vdyB3ZSBkb24ndCB3cml0ZSBvdXQgdGhlIERldGFpbGVkIHN0YXRlIGluIFhNTAorICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFdyaXRlIGNvbnRleHQgc3RhdGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHdyaXRlQ29udGV4dChQcmludFdyaXRlciB3cml0ZXIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSBvYmplY3ROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUJlYW5TZXJ2ZXIgbUJlYW5TZXJ2ZXIsIGludCBtb2RlKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAobW9kZSA9PSAwKXsKKyAgICAgICAgICAgIFN0cmluZyB3ZWJNb2R1bGVOYW1lID0gb2JqZWN0TmFtZS5nZXRLZXlQcm9wZXJ0eSgibmFtZSIpOworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSB3ZWJNb2R1bGVOYW1lOworICAgICAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgU3RyaW5nIGhvc3ROYW1lID0gbnVsbDsKKyAgICAgICAgICAgIFN0cmluZyBjb250ZXh0TmFtZSA9IG51bGw7CisgICAgICAgICAgICBpZiAobmFtZS5zdGFydHNXaXRoKCIvLyIpKSB7CisgICAgICAgICAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IHNsYXNoID0gbmFtZS5pbmRleE9mKCIvIik7CisgICAgICAgICAgICBpZiAoc2xhc2ggIT0gLTEpIHsKKyAgICAgICAgICAgICAgICBob3N0TmFtZSA9IG5hbWUuc3Vic3RyaW5nKDAsIHNsYXNoKTsKKyAgICAgICAgICAgICAgICBjb250ZXh0TmFtZSA9IG5hbWUuc3Vic3RyaW5nKHNsYXNoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBPYmplY3ROYW1lIHF1ZXJ5TWFuYWdlciA9IG5ldyBPYmplY3ROYW1lCisgICAgICAgICAgICAgICAgKG9iamVjdE5hbWUuZ2V0RG9tYWluKCkgKyAiOnR5cGU9TWFuYWdlcixwYXRoPSIgKyBjb250ZXh0TmFtZSAKKyAgICAgICAgICAgICAgICAgKyAiLGhvc3Q9IiArIGhvc3ROYW1lICsgIiwqIik7CisgICAgICAgICAgICBTZXQgbWFuYWdlcnNPTiA9IG1CZWFuU2VydmVyLnF1ZXJ5TmFtZXMocXVlcnlNYW5hZ2VyLCBudWxsKTsKKyAgICAgICAgICAgIE9iamVjdE5hbWUgbWFuYWdlck9OID0gbnVsbDsKKyAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yMiA9IG1hbmFnZXJzT04uaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIHdoaWxlIChpdGVyYXRvcjIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgbWFuYWdlck9OID0gKE9iamVjdE5hbWUpIGl0ZXJhdG9yMi5uZXh0KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIE9iamVjdE5hbWUgcXVlcnlKc3BNb25pdG9yID0gbmV3IE9iamVjdE5hbWUKKyAgICAgICAgICAgICAgICAob2JqZWN0TmFtZS5nZXREb21haW4oKSArICI6dHlwZT1Kc3BNb25pdG9yLFdlYk1vZHVsZT0iICsKKyAgICAgICAgICAgICAgICAgd2ViTW9kdWxlTmFtZSArICIsKiIpOworICAgICAgICAgICAgU2V0IGpzcE1vbml0b3JzT04gPSBtQmVhblNlcnZlci5xdWVyeU5hbWVzKHF1ZXJ5SnNwTW9uaXRvciwgbnVsbCk7CisgICAgICAgICAgICBPYmplY3ROYW1lIGpzcE1vbml0b3JPTiA9IG51bGw7CisgICAgICAgICAgICBpdGVyYXRvcjIgPSBqc3BNb25pdG9yc09OLml0ZXJhdG9yKCk7CisgICAgICAgICAgICB3aGlsZSAoaXRlcmF0b3IyLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIGpzcE1vbml0b3JPTiA9IChPYmplY3ROYW1lKSBpdGVyYXRvcjIubmV4dCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIHRoZSByb290IGNvbnRleHQKKyAgICAgICAgICAgIGlmIChjb250ZXh0TmFtZS5lcXVhbHMoIi8iKSkgeworICAgICAgICAgICAgICAgIGNvbnRleHROYW1lID0gIiI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiPGgxPiIpOworICAgICAgICAgICAgd3JpdGVyLnByaW50KG5hbWUpOworICAgICAgICAgICAgd3JpdGVyLnByaW50KCI8L2gxPiIpOworICAgICAgICAgICAgd3JpdGVyLnByaW50KCI8L2E+Iik7CisKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiPHA+Iik7CisgICAgICAgICAgICBPYmplY3Qgc3RhcnRUaW1lID0gbUJlYW5TZXJ2ZXIuZ2V0QXR0cmlidXRlKG9iamVjdE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdGFydFRpbWUiKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiIFN0YXJ0IHRpbWU6ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEYXRlKCgoTG9uZykgc3RhcnRUaW1lKS5sb25nVmFsdWUoKSkpOworICAgICAgICAgICAgd3JpdGVyLnByaW50KCIgU3RhcnR1cCB0aW1lOiAiKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludChmb3JtYXRUaW1lKG1CZWFuU2VydmVyLmdldEF0dHJpYnV0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9iamVjdE5hbWUsICJzdGFydHVwVGltZSIpLCBmYWxzZSkpOworICAgICAgICAgICAgd3JpdGVyLnByaW50KCIgVExEIHNjYW4gdGltZTogIik7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoZm9ybWF0VGltZShtQmVhblNlcnZlci5nZXRBdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvYmplY3ROYW1lLCAidGxkU2NhblRpbWUiKSwgZmFsc2UpKTsKKyAgICAgICAgICAgIGlmIChtYW5hZ2VyT04gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHdyaXRlTWFuYWdlcih3cml0ZXIsIG1hbmFnZXJPTiwgbUJlYW5TZXJ2ZXIsIG1vZGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGpzcE1vbml0b3JPTiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgd3JpdGVKc3BNb25pdG9yKHdyaXRlciwganNwTW9uaXRvck9OLCBtQmVhblNlcnZlciwgbW9kZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoIjwvcD4iKTsKKworICAgICAgICAgICAgU3RyaW5nIG9uU3RyID0gb2JqZWN0TmFtZS5nZXREb21haW4oKSAKKyAgICAgICAgICAgICAgICArICI6ajJlZVR5cGU9U2VydmxldCxXZWJNb2R1bGU9IiArIHdlYk1vZHVsZU5hbWUgKyAiLCoiOworICAgICAgICAgICAgT2JqZWN0TmFtZSBzZXJ2bGV0T2JqZWN0TmFtZSA9IG5ldyBPYmplY3ROYW1lKG9uU3RyKTsKKyAgICAgICAgICAgIFNldCBzZXQgPSBtQmVhblNlcnZlci5xdWVyeU1CZWFucyhzZXJ2bGV0T2JqZWN0TmFtZSwgbnVsbCk7CisgICAgICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IHNldC5pdGVyYXRvcigpOworICAgICAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIE9iamVjdEluc3RhbmNlIG9pID0gKE9iamVjdEluc3RhbmNlKSBpdGVyYXRvci5uZXh0KCk7CisgICAgICAgICAgICAgICAgd3JpdGVXcmFwcGVyKHdyaXRlciwgb2kuZ2V0T2JqZWN0TmFtZSgpLCBtQmVhblNlcnZlciwgbW9kZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBlbHNlIGlmIChtb2RlID09IDEpeworICAgICAgICAgICAgLy8gZm9yIG5vdyB3ZSBkb24ndCB3cml0ZSBvdXQgdGhlIGNvbnRleHQgaW4gWE1MCisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogV3JpdGUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgYSBtYW5hZ2VyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZU1hbmFnZXIoUHJpbnRXcml0ZXIgd3JpdGVyLCBPYmplY3ROYW1lIG9iamVjdE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQmVhblNlcnZlciBtQmVhblNlcnZlciwgaW50IG1vZGUpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIGlmIChtb2RlID09IDApIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiPGJyPiIpOworICAgICAgICAgICAgd3JpdGVyLnByaW50KCIgQWN0aXZlIHNlc3Npb25zOiAiKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludChtQmVhblNlcnZlci5nZXRBdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAob2JqZWN0TmFtZSwgImFjdGl2ZVNlc3Npb25zIikpOworICAgICAgICAgICAgd3JpdGVyLnByaW50KCIgU2Vzc2lvbiBjb3VudDogIik7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQobUJlYW5TZXJ2ZXIuZ2V0QXR0cmlidXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgKG9iamVjdE5hbWUsICJzZXNzaW9uQ291bnRlciIpKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiIE1heCBhY3RpdmUgc2Vzc2lvbnM6ICIpOworICAgICAgICAgICAgd3JpdGVyLnByaW50KG1CZWFuU2VydmVyLmdldEF0dHJpYnV0ZShvYmplY3ROYW1lLCAibWF4QWN0aXZlIikpOworICAgICAgICAgICAgd3JpdGVyLnByaW50KCIgUmVqZWN0ZWQgc2Vzc2lvbiBjcmVhdGlvbnM6ICIpOworICAgICAgICAgICAgd3JpdGVyLnByaW50KG1CZWFuU2VydmVyLmdldEF0dHJpYnV0ZQorICAgICAgICAgICAgICAgICAgICAgICAgIChvYmplY3ROYW1lLCAicmVqZWN0ZWRTZXNzaW9ucyIpKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiIEV4cGlyZWQgc2Vzc2lvbnM6ICIpOworICAgICAgICAgICAgd3JpdGVyLnByaW50KG1CZWFuU2VydmVyLmdldEF0dHJpYnV0ZQorICAgICAgICAgICAgICAgICAgICAgICAgIChvYmplY3ROYW1lLCAiZXhwaXJlZFNlc3Npb25zIikpOworICAgICAgICAgICAgd3JpdGVyLnByaW50KCIgTG9uZ2VzdCBzZXNzaW9uIGFsaXZlIHRpbWU6ICIpOworICAgICAgICAgICAgd3JpdGVyLnByaW50KGZvcm1hdFNlY29uZHMobUJlYW5TZXJ2ZXIuZ2V0QXR0cmlidXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlc3Npb25NYXhBbGl2ZVRpbWUiKSkpOworICAgICAgICAgICAgd3JpdGVyLnByaW50KCIgQXZlcmFnZSBzZXNzaW9uIGFsaXZlIHRpbWU6ICIpOworICAgICAgICAgICAgd3JpdGVyLnByaW50KGZvcm1hdFNlY29uZHMobUJlYW5TZXJ2ZXIuZ2V0QXR0cmlidXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlc3Npb25BdmVyYWdlQWxpdmVUaW1lIikpKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiIFByb2Nlc3NpbmcgdGltZTogIik7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoZm9ybWF0VGltZShtQmVhblNlcnZlci5nZXRBdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvYmplY3ROYW1lLCAicHJvY2Vzc2luZ1RpbWUiKSwgZmFsc2UpKTsKKyAgICAgICAgfSBlbHNlIGlmIChtb2RlID09IDEpIHsKKyAgICAgICAgICAgIC8vIGZvciBub3cgd2UgZG9uJ3Qgd3JpdGUgb3V0IHRoZSB3cmFwcGVyIGRldGFpbHMKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBXcml0ZSBKU1AgbW9uaXRvcmluZyBpbmZvcm1hdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVKc3BNb25pdG9yKFByaW50V3JpdGVyIHdyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgb2JqZWN0TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1CZWFuU2VydmVyIG1CZWFuU2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1vZGUpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAobW9kZSA9PSAwKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoIjxicj4iKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiIEpTUHMgbG9hZGVkOiAiKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludChtQmVhblNlcnZlci5nZXRBdHRyaWJ1dGUob2JqZWN0TmFtZSwgImpzcENvdW50IikpOworICAgICAgICAgICAgd3JpdGVyLnByaW50KCIgSlNQcyByZWxvYWRlZDogIik7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQobUJlYW5TZXJ2ZXIuZ2V0QXR0cmlidXRlKG9iamVjdE5hbWUsICJqc3BSZWxvYWRDb3VudCIpKTsKKyAgICAgICAgfSBlbHNlIGlmIChtb2RlID09IDEpIHsKKyAgICAgICAgICAgIC8vIGZvciBub3cgd2UgZG9uJ3Qgd3JpdGUgb3V0IGFueXRoaW5nCisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFdyaXRlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IGEgd3JhcHBlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVXcmFwcGVyKFByaW50V3JpdGVyIHdyaXRlciwgT2JqZWN0TmFtZSBvYmplY3ROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUJlYW5TZXJ2ZXIgbUJlYW5TZXJ2ZXIsIGludCBtb2RlKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAobW9kZSA9PSAwKSB7CisgICAgICAgICAgICBTdHJpbmcgc2VydmxldE5hbWUgPSBvYmplY3ROYW1lLmdldEtleVByb3BlcnR5KCJuYW1lIik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIFN0cmluZ1tdIG1hcHBpbmdzID0gKFN0cmluZ1tdKSAKKyAgICAgICAgICAgICAgICBtQmVhblNlcnZlci5pbnZva2Uob2JqZWN0TmFtZSwgImZpbmRNYXBwaW5ncyIsIG51bGwsIG51bGwpOworICAgICAgICAgICAgCisgICAgICAgICAgICB3cml0ZXIucHJpbnQoIjxoMj4iKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludChzZXJ2bGV0TmFtZSk7CisgICAgICAgICAgICBpZiAoKG1hcHBpbmdzICE9IG51bGwpICYmIChtYXBwaW5ncy5sZW5ndGggPiAwKSkgeworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludCgiIFsgIik7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXBwaW5ncy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQobWFwcGluZ3NbaV0pOworICAgICAgICAgICAgICAgICAgICBpZiAoaSA8IG1hcHBpbmdzLmxlbmd0aCAtIDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci5wcmludCgiICwgIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KCIgXSAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiPC9oMj4iKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgd3JpdGVyLnByaW50KCI8cD4iKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiIFByb2Nlc3NpbmcgdGltZTogIik7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoZm9ybWF0VGltZShtQmVhblNlcnZlci5nZXRBdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvYmplY3ROYW1lLCAicHJvY2Vzc2luZ1RpbWUiKSwgdHJ1ZSkpOworICAgICAgICAgICAgd3JpdGVyLnByaW50KCIgTWF4IHRpbWU6ICIpOworICAgICAgICAgICAgd3JpdGVyLnByaW50KGZvcm1hdFRpbWUobUJlYW5TZXJ2ZXIuZ2V0QXR0cmlidXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob2JqZWN0TmFtZSwgIm1heFRpbWUiKSwgZmFsc2UpKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiIFJlcXVlc3QgY291bnQ6ICIpOworICAgICAgICAgICAgd3JpdGVyLnByaW50KG1CZWFuU2VydmVyLmdldEF0dHJpYnV0ZShvYmplY3ROYW1lLCAicmVxdWVzdENvdW50IikpOworICAgICAgICAgICAgd3JpdGVyLnByaW50KCIgRXJyb3IgY291bnQ6ICIpOworICAgICAgICAgICAgd3JpdGVyLnByaW50KG1CZWFuU2VydmVyLmdldEF0dHJpYnV0ZShvYmplY3ROYW1lLCAiZXJyb3JDb3VudCIpKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiIExvYWQgdGltZTogIik7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoZm9ybWF0VGltZShtQmVhblNlcnZlci5nZXRBdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvYmplY3ROYW1lLCAibG9hZFRpbWUiKSwgZmFsc2UpKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiIENsYXNzbG9hZGluZyB0aW1lOiAiKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludChmb3JtYXRUaW1lKG1CZWFuU2VydmVyLmdldEF0dHJpYnV0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9iamVjdE5hbWUsICJjbGFzc0xvYWRUaW1lIiksIGZhbHNlKSk7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoIjwvcD4iKTsKKyAgICAgICAgfSBlbHNlIGlmIChtb2RlID09IDEpeworICAgICAgICAgICAgLy8gZm9yIG5vdyB3ZSBkb24ndCB3cml0ZSBvdXQgdGhlIHdyYXBwZXIgZGV0YWlscworICAgICAgICB9CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEZpbHRlciB0aGUgc3BlY2lmaWVkIG1lc3NhZ2Ugc3RyaW5nIGZvciBjaGFyYWN0ZXJzIHRoYXQgYXJlIHNlbnNpdGl2ZQorICAgICAqIGluIEhUTUwuICBUaGlzIGF2b2lkcyBwb3RlbnRpYWwgYXR0YWNrcyBjYXVzZWQgYnkgaW5jbHVkaW5nIEphdmFTY3JpcHQKKyAgICAgKiBjb2RlcyBpbiB0aGUgcmVxdWVzdCBVUkwgdGhhdCBpcyBvZnRlbiByZXBvcnRlZCBpbiBlcnJvciBtZXNzYWdlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvYmogVGhlIG1lc3NhZ2Ugc3RyaW5nIHRvIGJlIGZpbHRlcmVkCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZmlsdGVyKE9iamVjdCBvYmopIHsKKworICAgICAgICBpZiAob2JqID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKCI/Iik7CisgICAgICAgIFN0cmluZyBtZXNzYWdlID0gb2JqLnRvU3RyaW5nKCk7CisKKyAgICAgICAgY2hhciBjb250ZW50W10gPSBuZXcgY2hhclttZXNzYWdlLmxlbmd0aCgpXTsKKyAgICAgICAgbWVzc2FnZS5nZXRDaGFycygwLCBtZXNzYWdlLmxlbmd0aCgpLCBjb250ZW50LCAwKTsKKyAgICAgICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoY29udGVudC5sZW5ndGggKyA1MCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29udGVudC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgc3dpdGNoIChjb250ZW50W2ldKSB7CisgICAgICAgICAgICBjYXNlICc8JzoKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCImbHQ7Iik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICc+JzoKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCImZ3Q7Iik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICcmJzoKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCImYW1wOyIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnIic6CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiJnF1b3Q7Iik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoY29udGVudFtpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChyZXN1bHQudG9TdHJpbmcoKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIERpc3BsYXkgdGhlIGdpdmVuIHNpemUgaW4gYnl0ZXMsIGVpdGhlciBhcyBLQiBvciBNQi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYiB0cnVlIHRvIGRpc3BsYXkgbWVnYWJ5dGVzLCBmYWxzZSBmb3Iga2lsb2J5dGVzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZm9ybWF0U2l6ZShPYmplY3Qgb2JqLCBib29sZWFuIG1iKSB7CisKKyAgICAgICAgbG9uZyBieXRlcyA9IC0xTDsKKworICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgTG9uZykgeworICAgICAgICAgICAgYnl0ZXMgPSAoKExvbmcpIG9iaikubG9uZ1ZhbHVlKCk7CisgICAgICAgIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgSW50ZWdlcikgeworICAgICAgICAgICAgYnl0ZXMgPSAoKEludGVnZXIpIG9iaikuaW50VmFsdWUoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtYikgeworICAgICAgICAgICAgbG9uZyBtYnl0ZXMgPSBieXRlcyAvICgxMDI0ICogMTAyNCk7CisgICAgICAgICAgICBsb25nIHJlc3QgPSAKKyAgICAgICAgICAgICAgICAoKGJ5dGVzIC0gKG1ieXRlcyAqICgxMDI0ICogMTAyNCkpKSAqIDEwMCkgLyAoMTAyNCAqIDEwMjQpOworICAgICAgICAgICAgcmV0dXJuIChtYnl0ZXMgKyAiLiIgKyAoKHJlc3QgPCAxMCkgPyAiMCIgOiAiIikgKyByZXN0ICsgIiBNQiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuICgoYnl0ZXMgLyAxMDI0KSArICIgS0IiKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBEaXNwbGF5IHRoZSBnaXZlbiB0aW1lIGluIG1zLCBlaXRoZXIgYXMgbXMgb3Igcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWNvbmRzIHRydWUgdG8gZGlzcGxheSBzZWNvbmRzLCBmYWxzZSBmb3IgbWlsbGlzZWNvbmRzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZm9ybWF0VGltZShPYmplY3Qgb2JqLCBib29sZWFuIHNlY29uZHMpIHsKKworICAgICAgICBsb25nIHRpbWUgPSAtMUw7CisKKyAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIExvbmcpIHsKKyAgICAgICAgICAgIHRpbWUgPSAoKExvbmcpIG9iaikubG9uZ1ZhbHVlKCk7CisgICAgICAgIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgSW50ZWdlcikgeworICAgICAgICAgICAgdGltZSA9ICgoSW50ZWdlcikgb2JqKS5pbnRWYWx1ZSgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNlY29uZHMpIHsKKyAgICAgICAgICAgIHJldHVybiAoKHRpbWUgLyAxMDAwKSArICIgcyIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuICh0aW1lICsgIiBtcyIpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBGb3JtYXRzIHRoZSBnaXZlbiB0aW1lIChnaXZlbiBpbiBzZWNvbmRzKSBhcyBhIHN0cmluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvYmogVGltZSBvYmplY3QgdG8gYmUgZm9ybWF0dGVkIGFzIHN0cmluZworICAgICAqCisgICAgICogQHJldHVybiBTdHJpbmcgZm9ybWF0dGVkIHRpbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBmb3JtYXRTZWNvbmRzKE9iamVjdCBvYmopIHsKKworICAgICAgICBsb25nIHRpbWUgPSAtMUw7CisKKyAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIExvbmcpIHsKKyAgICAgICAgICAgIHRpbWUgPSAoKExvbmcpIG9iaikubG9uZ1ZhbHVlKCk7CisgICAgICAgIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgSW50ZWdlcikgeworICAgICAgICAgICAgdGltZSA9ICgoSW50ZWdlcikgb2JqKS5pbnRWYWx1ZSgpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICh0aW1lICsgIiBzIik7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9tYW5hZ2VyL1dFQi1JTkYvd2ViLnhtbCBiL2NvbnRhaW5lci93ZWJhcHBzL21hbmFnZXIvV0VCLUlORi93ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmMThiZmIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9tYW5hZ2VyL1dFQi1JTkYvd2ViLnhtbApAQCAtMCwwICsxLDE3MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgorCis8IURPQ1RZUEUgd2ViLWFwcAorICAgIFBVQkxJQyAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIFdlYiBBcHBsaWNhdGlvbiAyLjMvL0VOIgorICAgICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC93ZWItYXBwXzJfMy5kdGQiPgorCis8d2ViLWFwcD4KKworICA8ZGlzcGxheS1uYW1lPlRvbWNhdCBNYW5hZ2VyIEFwcGxpY2F0aW9uPC9kaXNwbGF5LW5hbWU+CisgIDxkZXNjcmlwdGlvbj4KKyAgICBBIHNjcmlwdGFibGUgbWFuYWdlbWVudCB3ZWIgYXBwbGljYXRpb24gZm9yIHRoZSBUb21jYXQgV2ViIFNlcnZlcjsKKwlNYW5hZ2VyIGxldHMgeW91IHZpZXcsIGxvYWQvdW5sb2FkL2V0YyBwYXJ0aWN1bGFyIHdlYiBhcHBsaWNhdGlvbnMuCisgIDwvZGVzY3JpcHRpb24+CisKKyAgPCEtLSBEZWZpbmUgdGhlIE1hbmFnZXIgU2VydmxldAorICAgICAgIENoYW5nZSBzZXJ2bGV0LWNsYXNzIHRvOiBvcmcuYXBhY2hlLmNhdGFsaW5hLnNlcnZsZXRzLkhUTUxNYW5hZ2VyU2VydmxldAorICAgICAgIHRvIGdldCBhIFNlcnZsZXQgd2l0aCBhIG1vcmUgaW50dWl0aXZlIEhUTUwgaW50ZXJmYWNlLCBkb24ndCBjaGFuZ2UgaWYgeW91CisgICAgICAgaGF2ZSBzb2Z0d2FyZSB0aGF0IGlzIGV4cGVjdGVkIHRvIHBhcnNlIHRoZSBvdXRwdXQgZnJvbSBNYW5hZ2VyU2VydmxldAorICAgICAgIHNpbmNlIHRoZXkncmUgbm90IGNvbXBhdGlibGUuCisgICAtLT4KKyAgPHNlcnZsZXQ+CisgICAgPHNlcnZsZXQtbmFtZT5NYW5hZ2VyPC9zZXJ2bGV0LW5hbWU+CisgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS5jYXRhbGluYS5tYW5hZ2VyLk1hbmFnZXJTZXJ2bGV0PC9zZXJ2bGV0LWNsYXNzPgorICAgIDxpbml0LXBhcmFtPgorICAgICAgPHBhcmFtLW5hbWU+ZGVidWc8L3BhcmFtLW5hbWU+CisgICAgICA8cGFyYW0tdmFsdWU+MjwvcGFyYW0tdmFsdWU+CisgICAgPC9pbml0LXBhcmFtPgorICA8L3NlcnZsZXQ+CisgIDxzZXJ2bGV0PgorICAgIDxzZXJ2bGV0LW5hbWU+SFRNTE1hbmFnZXI8L3NlcnZsZXQtbmFtZT4KKyAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLmNhdGFsaW5hLm1hbmFnZXIuSFRNTE1hbmFnZXJTZXJ2bGV0PC9zZXJ2bGV0LWNsYXNzPgorICAgIDxpbml0LXBhcmFtPgorICAgICAgPHBhcmFtLW5hbWU+ZGVidWc8L3BhcmFtLW5hbWU+CisgICAgICA8cGFyYW0tdmFsdWU+MjwvcGFyYW0tdmFsdWU+CisgICAgPC9pbml0LXBhcmFtPgorICA8L3NlcnZsZXQ+CisgIDxzZXJ2bGV0PgorICAgIDxzZXJ2bGV0LW5hbWU+U3RhdHVzPC9zZXJ2bGV0LW5hbWU+CisgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS5jYXRhbGluYS5tYW5hZ2VyLlN0YXR1c01hbmFnZXJTZXJ2bGV0PC9zZXJ2bGV0LWNsYXNzPgorICAgIDxpbml0LXBhcmFtPgorICAgICAgPHBhcmFtLW5hbWU+ZGVidWc8L3BhcmFtLW5hbWU+CisgICAgICA8cGFyYW0tdmFsdWU+MDwvcGFyYW0tdmFsdWU+CisgICAgPC9pbml0LXBhcmFtPgorICA8L3NlcnZsZXQ+CisKKyAgPHNlcnZsZXQ+CisgICAgPHNlcnZsZXQtbmFtZT5KTVhQcm94eTwvc2VydmxldC1uYW1lPgorICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUuY2F0YWxpbmEubWFuYWdlci5KTVhQcm94eVNlcnZsZXQ8L3NlcnZsZXQtY2xhc3M+CisgIDwvc2VydmxldD4KKworICA8IS0tIERlZmluZSB0aGUgTWFuYWdlciBTZXJ2bGV0IE1hcHBpbmcgLS0+CisgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgPHNlcnZsZXQtbmFtZT5NYW5hZ2VyPC9zZXJ2bGV0LW5hbWU+CisgICAgICA8dXJsLXBhdHRlcm4+L2xpc3Q8L3VybC1wYXR0ZXJuPgorICA8L3NlcnZsZXQtbWFwcGluZz4KKyAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICA8c2VydmxldC1uYW1lPk1hbmFnZXI8L3NlcnZsZXQtbmFtZT4KKyAgICAgIDx1cmwtcGF0dGVybj4vc2Vzc2lvbnM8L3VybC1wYXR0ZXJuPgorICA8L3NlcnZsZXQtbWFwcGluZz4KKyAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICA8c2VydmxldC1uYW1lPk1hbmFnZXI8L3NlcnZsZXQtbmFtZT4KKyAgICAgIDx1cmwtcGF0dGVybj4vc3RhcnQ8L3VybC1wYXR0ZXJuPgorICA8L3NlcnZsZXQtbWFwcGluZz4KKyAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICA8c2VydmxldC1uYW1lPk1hbmFnZXI8L3NlcnZsZXQtbmFtZT4KKyAgICAgIDx1cmwtcGF0dGVybj4vc3RvcDwvdXJsLXBhdHRlcm4+CisgIDwvc2VydmxldC1tYXBwaW5nPgorICA8c2VydmxldC1tYXBwaW5nPgorICAgIDxzZXJ2bGV0LW5hbWU+TWFuYWdlcjwvc2VydmxldC1uYW1lPgorICAgICAgPHVybC1wYXR0ZXJuPi9pbnN0YWxsPC91cmwtcGF0dGVybj4KKyAgPC9zZXJ2bGV0LW1hcHBpbmc+CisgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgPHNlcnZsZXQtbmFtZT5NYW5hZ2VyPC9zZXJ2bGV0LW5hbWU+CisgICAgICA8dXJsLXBhdHRlcm4+L3JlbW92ZTwvdXJsLXBhdHRlcm4+CisgIDwvc2VydmxldC1tYXBwaW5nPgorICA8c2VydmxldC1tYXBwaW5nPgorICAgIDxzZXJ2bGV0LW5hbWU+TWFuYWdlcjwvc2VydmxldC1uYW1lPgorICAgICAgPHVybC1wYXR0ZXJuPi9kZXBsb3k8L3VybC1wYXR0ZXJuPgorICA8L3NlcnZsZXQtbWFwcGluZz4KKyAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICA8c2VydmxldC1uYW1lPk1hbmFnZXI8L3NlcnZsZXQtbmFtZT4KKyAgICAgIDx1cmwtcGF0dGVybj4vdW5kZXBsb3k8L3VybC1wYXR0ZXJuPgorICA8L3NlcnZsZXQtbWFwcGluZz4KKyAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICA8c2VydmxldC1uYW1lPk1hbmFnZXI8L3NlcnZsZXQtbmFtZT4KKyAgICAgIDx1cmwtcGF0dGVybj4vcmVsb2FkPC91cmwtcGF0dGVybj4KKyAgPC9zZXJ2bGV0LW1hcHBpbmc+CisgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgPHNlcnZsZXQtbmFtZT5NYW5hZ2VyPC9zZXJ2bGV0LW5hbWU+CisgICAgICA8dXJsLXBhdHRlcm4+L3NhdmU8L3VybC1wYXR0ZXJuPgorICA8L3NlcnZsZXQtbWFwcGluZz4KKyAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICA8c2VydmxldC1uYW1lPk1hbmFnZXI8L3NlcnZsZXQtbmFtZT4KKyAgICAgIDx1cmwtcGF0dGVybj4vc2VydmVyaW5mbzwvdXJsLXBhdHRlcm4+CisgIDwvc2VydmxldC1tYXBwaW5nPgorICA8c2VydmxldC1tYXBwaW5nPgorICAgIDxzZXJ2bGV0LW5hbWU+TWFuYWdlcjwvc2VydmxldC1uYW1lPgorICAgICAgPHVybC1wYXR0ZXJuPi9yb2xlczwvdXJsLXBhdHRlcm4+CisgIDwvc2VydmxldC1tYXBwaW5nPgorICA8c2VydmxldC1tYXBwaW5nPgorICAgIDxzZXJ2bGV0LW5hbWU+TWFuYWdlcjwvc2VydmxldC1uYW1lPgorICAgICAgPHVybC1wYXR0ZXJuPi9yZXNvdXJjZXM8L3VybC1wYXR0ZXJuPgorICA8L3NlcnZsZXQtbWFwcGluZz4KKyAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICA8c2VydmxldC1uYW1lPlN0YXR1czwvc2VydmxldC1uYW1lPgorICAgIDx1cmwtcGF0dGVybj4vc3RhdHVzLyo8L3VybC1wYXR0ZXJuPgorICA8L3NlcnZsZXQtbWFwcGluZz4KKyAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICA8c2VydmxldC1uYW1lPkpNWFByb3h5PC9zZXJ2bGV0LW5hbWU+CisgICAgICA8dXJsLXBhdHRlcm4+L2pteHByb3h5Lyo8L3VybC1wYXR0ZXJuPgorICA8L3NlcnZsZXQtbWFwcGluZz4KKyAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICA8c2VydmxldC1uYW1lPkhUTUxNYW5hZ2VyPC9zZXJ2bGV0LW5hbWU+CisgICAgPHVybC1wYXR0ZXJuPi9odG1sLyo8L3VybC1wYXR0ZXJuPgorICA8L3NlcnZsZXQtbWFwcGluZz4KKworICA8IS0tIERlZmluZSByZWZlcmVuY2UgdG8gdGhlIHVzZXIgZGF0YWJhc2UgZm9yIGxvb2tpbmcgdXAgcm9sZXMgLS0+CisgIDxyZXNvdXJjZS1lbnYtcmVmPgorICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgIExpbmsgdG8gdGhlIFVzZXJEYXRhYmFzZSBpbnN0YW5jZSBmcm9tIHdoaWNoIHdlIHJlcXVlc3QgbGlzdHMgb2YKKyAgICAgIGRlZmluZWQgcm9sZSBuYW1lcy4gIFR5cGljYWxseSwgdGhpcyB3aWxsIGJlIGNvbm5lY3RlZCB0byB0aGUgZ2xvYmFsCisgICAgICB1c2VyIGRhdGFiYXNlIHdpdGggYSBSZXNvdXJjZUxpbmsgZWxlbWVudCBpbiBzZXJ2ZXIueG1sIG9yIHRoZSBjb250ZXh0CisgICAgICBjb25maWd1cmF0aW9uIGZpbGUgZm9yIHRoZSBNYW5hZ2VyIHdlYiBhcHBsaWNhdGlvbi4KKyAgICA8L2Rlc2NyaXB0aW9uPgorICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+dXNlcnM8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KKyAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPgorICAgICAgb3JnLmFwYWNoZS5jYXRhbGluYS5Vc2VyRGF0YWJhc2UKKyAgICA8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KKyAgPC9yZXNvdXJjZS1lbnYtcmVmPgorCisgIDwhLS0gRGVmaW5lIGEgU2VjdXJpdHkgQ29uc3RyYWludCBvbiB0aGlzIEFwcGxpY2F0aW9uIC0tPgorICA8c2VjdXJpdHktY29uc3RyYWludD4KKyAgICA8d2ViLXJlc291cmNlLWNvbGxlY3Rpb24+CisgICAgICA8d2ViLXJlc291cmNlLW5hbWU+SFRNTE1hbmdlciBhbmQgTWFuYWdlciBjb21tYW5kPC93ZWItcmVzb3VyY2UtbmFtZT4KKyAgICAgIDx1cmwtcGF0dGVybj4vam14cHJveHkvKjwvdXJsLXBhdHRlcm4+CisgICAgICA8dXJsLXBhdHRlcm4+L2h0bWwvKjwvdXJsLXBhdHRlcm4+CisgICAgICA8dXJsLXBhdHRlcm4+L2xpc3Q8L3VybC1wYXR0ZXJuPgorICAgICAgPHVybC1wYXR0ZXJuPi9zZXNzaW9uczwvdXJsLXBhdHRlcm4+CisgICAgICA8dXJsLXBhdHRlcm4+L3N0YXJ0PC91cmwtcGF0dGVybj4KKyAgICAgIDx1cmwtcGF0dGVybj4vc3RvcDwvdXJsLXBhdHRlcm4+CisgICAgICA8dXJsLXBhdHRlcm4+L2luc3RhbGw8L3VybC1wYXR0ZXJuPgorICAgICAgPHVybC1wYXR0ZXJuPi9yZW1vdmU8L3VybC1wYXR0ZXJuPgorICAgICAgPHVybC1wYXR0ZXJuPi9kZXBsb3k8L3VybC1wYXR0ZXJuPgorICAgICAgPHVybC1wYXR0ZXJuPi91bmRlcGxveTwvdXJsLXBhdHRlcm4+CisgICAgICA8dXJsLXBhdHRlcm4+L3JlbG9hZDwvdXJsLXBhdHRlcm4+CisgICAgICA8dXJsLXBhdHRlcm4+L3NhdmU8L3VybC1wYXR0ZXJuPgorICAgICAgPHVybC1wYXR0ZXJuPi9zZXJ2ZXJpbmZvPC91cmwtcGF0dGVybj4KKyAgICAgIDx1cmwtcGF0dGVybj4vc3RhdHVzLyo8L3VybC1wYXR0ZXJuPgorICAgICAgPHVybC1wYXR0ZXJuPi9yb2xlczwvdXJsLXBhdHRlcm4+CisgICAgICA8dXJsLXBhdHRlcm4+L3Jlc291cmNlczwvdXJsLXBhdHRlcm4+CisgICAgPC93ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KKyAgICA8YXV0aC1jb25zdHJhaW50PgorICAgICAgIDwhLS0gTk9URTogIFRoaXMgcm9sZSBpcyBub3QgcHJlc2VudCBpbiB0aGUgZGVmYXVsdCB1c2VycyBmaWxlIC0tPgorICAgICAgIDxyb2xlLW5hbWU+bWFuYWdlcjwvcm9sZS1uYW1lPgorICAgIDwvYXV0aC1jb25zdHJhaW50PgorICA8L3NlY3VyaXR5LWNvbnN0cmFpbnQ+CisKKyAgPCEtLSBEZWZpbmUgdGhlIExvZ2luIENvbmZpZ3VyYXRpb24gZm9yIHRoaXMgQXBwbGljYXRpb24gLS0+CisgIDxsb2dpbi1jb25maWc+CisgICAgPGF1dGgtbWV0aG9kPkJBU0lDPC9hdXRoLW1ldGhvZD4KKyAgICA8cmVhbG0tbmFtZT5Ub21jYXQgTWFuYWdlciBBcHBsaWNhdGlvbjwvcmVhbG0tbmFtZT4KKyAgPC9sb2dpbi1jb25maWc+CisKKyAgPCEtLSBTZWN1cml0eSByb2xlcyByZWZlcmVuY2VkIGJ5IHRoaXMgd2ViIGFwcGxpY2F0aW9uIC0tPgorICA8c2VjdXJpdHktcm9sZT4KKyAgICA8ZGVzY3JpcHRpb24+CisgICAgICBUaGUgcm9sZSB0aGF0IGlzIHJlcXVpcmVkIHRvIGxvZyBpbiB0byB0aGUgTWFuYWdlciBBcHBsaWNhdGlvbgorICAgIDwvZGVzY3JpcHRpb24+CisgICAgPHJvbGUtbmFtZT5tYW5hZ2VyPC9yb2xlLW5hbWU+CisgIDwvc2VjdXJpdHktcm9sZT4KKworPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvbWFuYWdlci9idWlsZC54bWwgYi9jb250YWluZXIvd2ViYXBwcy9tYW5hZ2VyL2J1aWxkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjZlY2RhCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvbWFuYWdlci9idWlsZC54bWwKQEAgLTAsMCArMSwxMjggQEAKKzxwcm9qZWN0IG5hbWU9Im1hbmFnZXIiIGRlZmF1bHQ9ImJ1aWxkLW1haW4iIGJhc2VkaXI9Ii4iPgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT0gSW5pdGlhbGl6ZSBQcm9wZXJ0eSBWYWx1ZXMgPT09PT09PT09PT09PT09PT09PSAtLT4KKworICA8IS0tIFNlZSAiYnVpbGQucHJvcGVydGllcy5zYW1wbGUiIGluIHRoZSB0b3AgbGV2ZWwgZGlyZWN0b3J5IGZvciBhbGwgICAgIC0tPgorICA8IS0tIHByb3BlcnR5IHZhbHVlcyB5b3UgbXVzdCBjdXN0b21pemUgZm9yIHN1Y2Nlc3NmdWwgYnVpbGRpbmchISEgICAgICAgIC0tPgorICA8cHJvcGVydHkgZmlsZT0iYnVpbGQucHJvcGVydGllcyIvPgorICA8cHJvcGVydHkgZmlsZT0iLi4vYnVpbGQucHJvcGVydGllcyIvPgorICA8cHJvcGVydHkgZmlsZT0iLi4vLi4vYnVpbGQucHJvcGVydGllcyIvPgorICA8cHJvcGVydHkgZmlsZT0iJHt1c2VyLmhvbWV9L2J1aWxkLnByb3BlcnRpZXMiLz4KKworICA8cHJvcGVydHkgbmFtZT0iYnVpbGQuY29tcGlsZXIiICB2YWx1ZT0ibW9kZXJuIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJ3ZWJhcHBzLmJ1aWxkIiAgIHZhbHVlPSIuLi9idWlsZCIvPgorICA8cHJvcGVydHkgbmFtZT0id2ViYXBwcy5kaXN0IiAgICB2YWx1ZT0iLi4vZGlzdCIvPgorICA8cHJvcGVydHkgbmFtZT0id2ViYXBwLm5hbWUiICAgICB2YWx1ZT0ibWFuYWdlciIvPgorCisgIDwhLS0gRGVwZW5kZW50IEpBUnMgYW5kIGZpbGVzIC0tPgorICA8cHJvcGVydHkgbmFtZT0ic2VydmxldC1hcGkuamFyIiB2YWx1ZT0iJHthcGkuaG9tZX0vanNyMTU0L2Rpc3QvbGliL3NlcnZsZXQtYXBpLmphciIvPgorICA8cHJvcGVydHkgbmFtZT0ianNwLWFwaS5qYXIiICAgICB2YWx1ZT0iJHthcGkuaG9tZX0vanNyMTUyL2Rpc3QvbGliL2pzcC1hcGkuamFyIi8+CisKKyAgPCEtLSBDb25zdHJ1Y3QgQWRtaW4gY2xhc3NwYXRoIC0tPgorICA8cGF0aCBpZD0ibWFuYWdlci5jbGFzc3BhdGgiPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjYXRhbGluYS5kZXBsb3l9L2NsYXNzZXMiLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y29tbW9ucy1maWxldXBsb2FkLmphcn0iLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y29tbW9ucy1tb2RlbGVyLmphcn0iLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7am14Lmphcn0iLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7c2VydmxldC1hcGkuamFyfSIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtqc3AtYXBpLmphcn0iLz4KKyAgPC9wYXRoPgorCisKKwkgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09IEJVSUxEOiBDb3B5IEpBUnMgPT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisJICA8dGFyZ2V0IG5hbWU9ImNvcHktZmlsZXVwbG9hZC5qYXIiPgorCSAgICA8Y29weSB0b2Rpcj0iJHt3ZWJhcHBzLmJ1aWxkfS8ke3dlYmFwcC5uYW1lfS9XRUItSU5GL2xpYiIgZmlsZT0iJHtjb21tb25zLWZpbGV1cGxvYWQuamFyfSIvPgorCSAgPC90YXJnZXQ+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT0gQlVJTEQ6IENyZWF0ZSBEaXJlY3RvcmllcyA9PT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImJ1aWxkLXByZXBhcmUiPgorICAgIDxta2RpciBkaXI9IiR7d2ViYXBwcy5idWlsZH0iLz4KKyAgICA8bWtkaXIgZGlyPSIke3dlYmFwcHMuYnVpbGR9LyR7d2ViYXBwLm5hbWV9Ii8+CisgICAgPG1rZGlyIGRpcj0iJHt3ZWJhcHBzLmJ1aWxkfS8ke3dlYmFwcC5uYW1lfS9pbWFnZXMiLz4KKyAgICA8bWtkaXIgZGlyPSIke3dlYmFwcHMuYnVpbGR9LyR7d2ViYXBwLm5hbWV9L1dFQi1JTkYiLz4KKyAgICA8bWtkaXIgZGlyPSIke3dlYmFwcHMuYnVpbGR9LyR7d2ViYXBwLm5hbWV9L1dFQi1JTkYvY2xhc3NlcyIvPgorICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PSBCVUlMRDogQ29weSBTdGF0aWMgRmlsZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iYnVpbGQtc3RhdGljIiBkZXBlbmRzPSJidWlsZC1wcmVwYXJlLGNvcHktZmlsZXVwbG9hZC5qYXIiPgorICAgIDxjb3B5IHRvZGlyPSIke3dlYmFwcHMuYnVpbGR9LyR7d2ViYXBwLm5hbWV9Ij4KKyAgICAgIDxmaWxlc2V0IGRpcj0iLiI+CisgICAgICAgIDxleGNsdWRlIG5hbWU9ImJ1aWxkLioiLz4KKyAgICAgIDwvZmlsZXNldD4KKyAgICA8L2NvcHk+CisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PSBCVUlMRDogQ29tcGlsZSBTZXJ2ZXIgQ29tcG9uZW50cyA9PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJidWlsZC1tYWluIiBkZXBlbmRzPSJidWlsZC1zdGF0aWMiPgorCisgICAgPCEtLSBUb3AgTGV2ZWwgRGlyZWN0b3J5IC0tPgorICAgIDxzdHlsZSBiYXNlZGlyPSIuLi9kb2NzIgorICAgICAgICAgICBkZXN0ZGlyPSIke3dlYmFwcHMuYnVpbGR9LyR7d2ViYXBwLm5hbWV9IgorICAgICAgICAgICBleHRlbnNpb249Ii5odG1sIgorICAgICAgICAgICBzdHlsZT0idG9tY2F0LWRvY3MueHNsIgorICAgICAgICAgICBleGNsdWRlcz0iYnVpbGQueG1sIHByb2plY3QueG1sIgorICAgICAgICAgICBpbmNsdWRlcz0ibWFuYWdlci1ob3d0by54bWwsaHRtbC1tYW5hZ2VyLWhvd3RvLnhtbCI+CisgICAgICA8cGFyYW0gbmFtZT0icmVsYXRpdmUtcGF0aCIgZXhwcmVzc2lvbj0iLiIvPgorICAgICAgPHBhcmFtIG5hbWU9InByb2plY3QtbWVudSIgZXhwcmVzc2lvbj0ibm9tZW51Ii8+CisgICAgICA8cGFyYW0gbmFtZT0ic3RhbmRhbG9uZSIgZXhwcmVzc2lvbj0ic3RhbmRhbG9uZSIvPgorICAgIDwvc3R5bGU+CisKKyAgICA8IS0tIEltYWdlcyBTdWJkaXJlY3RvcnkgLS0+CisgICAgPGNvcHkgdG9kaXI9IiR7d2ViYXBwcy5idWlsZH0vJHt3ZWJhcHAubmFtZX0vaW1hZ2VzIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iLi4vZG9jcy9pbWFnZXMiPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSJwcmludGVyLmdpZiIvPgorICAgICAgPC9maWxlc2V0PgorICAgIDwvY29weT4KKworICAgIDxqYXZhYyAgIHNyY2Rpcj0iV0VCLUlORi9jbGFzc2VzIiAKKyAgICAgICAgICAgICBkZXN0ZGlyPSIke3dlYmFwcHMuYnVpbGR9LyR7d2ViYXBwLm5hbWV9L1dFQi1JTkYvY2xhc3NlcyIKKyAgICAgICAgICAgICBkZWJ1Zz0iJHtjb21waWxlLmRlYnVnfSIgZGVwcmVjYXRpb249IiR7Y29tcGlsZS5kZXByZWNhdGlvbn0iCisgICAgICAgICAgICAgb3B0aW1pemU9IiR7Y29tcGlsZS5vcHRpbWl6ZX0iCisgICAgICAgICAgICAgZXhjbHVkZXM9IioqL0NWUy8qKiI+CisgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJtYW5hZ2VyLmNsYXNzcGF0aCIgLz4KKyAgICA8L2phdmFjPgorCisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PSBCVUlMRDogUmVidWlsZCBFdmVyeXRoaW5nID09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJhbGwiIGRlcGVuZHM9ImJ1aWxkLWNsZWFuLGJ1aWxkLW1haW4iCisgICBkZXNjcmlwdGlvbj0iQ2xlYW4gYW5kIGJ1aWxkIG1hbmFnZXIgd2ViYXBwIi8+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09IEJVSUxEOiBDbGVhbiBEaXJlY3RvcnkgPT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImJ1aWxkLWNsZWFuIj4KKyAgICA8ZGVsZXRlIGRpcj0iJHt3ZWJhcHBzLmJ1aWxkfS8ke3dlYmFwcC5uYW1lfSIvPgorICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT0gRElTVDogQ3JlYXRlIERpcmVjdG9yaWVzID09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iZGlzdC1wcmVwYXJlIj4KKyAgICA8bWtkaXIgZGlyPSIke3dlYmFwcHMuZGlzdH0iLz4KKyAgPC90YXJnZXQ+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09IERJU1Q6IENyZWF0ZSBEaXN0cmlidXRpb24gRmlsZXMgPT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImRpc3QiIGRlcGVuZHM9ImJ1aWxkLW1haW4sZGlzdC1wcmVwYXJlIgorICAgZGVzY3JpcHRpb249IkNyZWF0ZSBtYW5hZ2VyIHdlYmFwcCBiaW5hcnkgZGlzdHJpYnV0aW9uIj4KKyAgICAgIDxqYXIgICBqYXJmaWxlPSIke3dlYmFwcHMuZGlzdH0vJHt3ZWJhcHAubmFtZX0ud2FyIgorICAgICAgICAgICAgIGJhc2VkaXI9IiR7d2ViYXBwcy5idWlsZH0vJHt3ZWJhcHAubmFtZX0iIGluY2x1ZGVzPSIqKiIvPgorICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT0gRElTVDogQ2xlYW4gRGlyZWN0b3J5ID09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iZGlzdC1jbGVhbiI+CisgICAgPGRlbHRyZWUgZGlyPSIke2Rpc3QuZGlyfS8ke3dlYmFwcC5uYW1lfSIvPgorICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PSBDb252ZW5pZW50IFN5bm9ueW1zID09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iY2xlYW4iIGRlcGVuZHM9ImJ1aWxkLWNsZWFuLGRpc3QtY2xlYW4iCisgICBkZXNjcmlwdGlvbj0iQ2xlYW4gYnVpbGQgYW5kIGRpc3QgZGlyZWN0b3JpZXMiLz4KKworCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9tYW5hZ2VyL21hbmFnZXIueG1sIGIvY29udGFpbmVyL3dlYmFwcHMvbWFuYWdlci9tYW5hZ2VyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmMwMjZlCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvbWFuYWdlci9tYW5hZ2VyLnhtbApAQCAtMCwwICsxLDE3IEBACis8IS0tCisKKyAgICBDb250ZXh0IGNvbmZpZ3VyYXRpb24gZmlsZSBmb3IgdGhlIFRvbWNhdCBNYW5hZ2VyIFdlYiBBcHAKKworICAgICRJZCQKKworLS0+CisKKworPENvbnRleHQgZG9jQmFzZT0iJHtjYXRhbGluYS5ob21lfS9zZXJ2ZXIvd2ViYXBwcy9tYW5hZ2VyIgorICAgICAgICAgcHJpdmlsZWdlZD0idHJ1ZSIgYW50aVJlc291cmNlTG9ja2luZz0iZmFsc2UiIGFudGlKQVJMb2NraW5nPSJmYWxzZSI+CisKKyAgPCEtLSBMaW5rIHRvIHRoZSB1c2VyIGRhdGFiYXNlIHdlIHdpbGwgZ2V0IHJvbGVzIGZyb20gLS0+CisgIDxSZXNvdXJjZUxpbmsgbmFtZT0idXNlcnMiIGdsb2JhbD0iVXNlckRhdGFiYXNlIgorICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5hcGFjaGUuY2F0YWxpbmEuVXNlckRhdGFiYXNlIi8+CisKKzwvQ29udGV4dD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL21hbmFnZXIvc3RhdHVzLnhzZCBiL2NvbnRhaW5lci93ZWJhcHBzL21hbmFnZXIvc3RhdHVzLnhzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjI2NmRlCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvbWFuYWdlci9zdGF0dXMueHNkCkBAIC0wLDAgKzEsNjMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIGVkaXRlZCB3aXRoIFhNTFNQWSB2NSByZWwuIDQgVSAoaHR0cDovL3d3dy54bWxzcHkuY29tKSBieSBwZXRlciBsaW4gKGNvbnN1bHRhbnQpIC0tPgorPCEtLVczQyBTY2hlbWEgZ2VuZXJhdGVkIGJ5IFhNTFNQWSB2NSByZWwuIDQgVSAoaHR0cDovL3d3dy54bWxzcHkuY29tKS0tPgorPHhzOnNjaGVtYSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4KKwk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY29ubmVjdG9yIj4KKwkJPHhzOnNlcXVlbmNlPgorCQkJPHhzOmVsZW1lbnQgbmFtZT0idGhyZWFkSW5mbyIgdHlwZT0idGhyZWFkSW5mbyIvPgorCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVxdWVzdEluZm8iIHR5cGU9InJlcXVlc3RJbmZvIi8+CisJCQk8eHM6ZWxlbWVudCBuYW1lPSJ3b3JrZXJzIiB0eXBlPSJ3b3JrZXJzIi8+CisJCTwveHM6c2VxdWVuY2U+CisJCTx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisJPC94czpjb21wbGV4VHlwZT4KKwk8eHM6Y29tcGxleFR5cGUgbmFtZT0ianZtIj4KKwkJPHhzOnNlcXVlbmNlPgorCQkJPHhzOmVsZW1lbnQgbmFtZT0ibWVtb3J5IiB0eXBlPSJtZW1vcnkiLz4KKwkJPC94czpzZXF1ZW5jZT4KKwk8L3hzOmNvbXBsZXhUeXBlPgorCTx4czpjb21wbGV4VHlwZSBuYW1lPSJtZW1vcnkiPgorCQk8eHM6YXR0cmlidXRlIG5hbWU9ImZyZWUiIHR5cGU9InhzOmxvbmciIHVzZT0icmVxdWlyZWQiLz4KKwkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0b3RhbCIgdHlwZT0ieHM6bG9uZyIgdXNlPSJyZXF1aXJlZCIvPgorCQk8eHM6YXR0cmlidXRlIG5hbWU9Im1heCIgdHlwZT0ieHM6bG9uZyIgdXNlPSJyZXF1aXJlZCIvPgorCTwveHM6Y29tcGxleFR5cGU+CisJPHhzOmNvbXBsZXhUeXBlIG5hbWU9InJlcXVlc3RJbmZvIj4KKwkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJtYXhUaW1lIiB0eXBlPSJ4czpsb25nIiB1c2U9InJlcXVpcmVkIi8+CisJCTx4czphdHRyaWJ1dGUgbmFtZT0icHJvY2Vzc2luZ1RpbWUiIHR5cGU9InhzOmludCIgdXNlPSJyZXF1aXJlZCIvPgorCQk8eHM6YXR0cmlidXRlIG5hbWU9InJlcXVlc3RDb3VudCIgdHlwZT0ieHM6bG9uZyIgdXNlPSJyZXF1aXJlZCIvPgorCQk8eHM6YXR0cmlidXRlIG5hbWU9ImVycm9yQ291bnQiIHR5cGU9InhzOmxvbmciIHVzZT0icmVxdWlyZWQiLz4KKwkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJieXRlc1JlY2VpdmVkIiB0eXBlPSJ4czpsb25nIiB1c2U9InJlcXVpcmVkIi8+CisJCTx4czphdHRyaWJ1dGUgbmFtZT0iYnl0ZXNTZW50IiB0eXBlPSJ4czpsb25nIiB1c2U9InJlcXVpcmVkIi8+CisJPC94czpjb21wbGV4VHlwZT4KKwk8eHM6ZWxlbWVudCBuYW1lPSJzdGF0dXMiPgorCQk8eHM6Y29tcGxleFR5cGU+CisJCQk8eHM6c2VxdWVuY2U+CisJCQkJPHhzOmVsZW1lbnQgbmFtZT0ianZtIiB0eXBlPSJqdm0iLz4KKwkJCQk8eHM6ZWxlbWVudCBuYW1lPSJjb25uZWN0b3IiIHR5cGU9ImNvbm5lY3RvciIvPgorCQkJPC94czpzZXF1ZW5jZT4KKwkJPC94czpjb21wbGV4VHlwZT4KKwk8L3hzOmVsZW1lbnQ+CisJPHhzOmNvbXBsZXhUeXBlIG5hbWU9InRocmVhZEluZm8iPgorCQk8eHM6YXR0cmlidXRlIG5hbWU9Im1heFRocmVhZHMiIHR5cGU9InhzOmludCIgdXNlPSJyZXF1aXJlZCIvPgorCQk8eHM6YXR0cmlidXRlIG5hbWU9Im1pblNwYXJlVGhyZWFkcyIgdHlwZT0ieHM6aW50IiB1c2U9InJlcXVpcmVkIi8+CisJCTx4czphdHRyaWJ1dGUgbmFtZT0ibWF4U3BhcmVUaHJlYWRzIiB0eXBlPSJ4czppbnQiIHVzZT0icmVxdWlyZWQiLz4KKwkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJjdXJyZW50VGhyZWFkQ291bnQiIHR5cGU9InhzOmludCIgdXNlPSJyZXF1aXJlZCIvPgorCQk8eHM6YXR0cmlidXRlIG5hbWU9ImN1cnJlbnRUaHJlYWRzQnVzeSIgdHlwZT0ieHM6aW50IiB1c2U9InJlcXVpcmVkIi8+CisJPC94czpjb21wbGV4VHlwZT4KKwk8eHM6Y29tcGxleFR5cGUgbmFtZT0id29ya2VyIj4KKwkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJzdGFnZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisJCTx4czphdHRyaWJ1dGUgbmFtZT0icmVxdWVzdFByb2Nlc3NpbmdUaW1lIiB0eXBlPSJ4czppbnQiIHVzZT0icmVxdWlyZWQiLz4KKwkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZXF1ZXN0Qnl0ZXNTZW50IiB0eXBlPSJ4czpsb25nIiB1c2U9InJlcXVpcmVkIi8+CisJCTx4czphdHRyaWJ1dGUgbmFtZT0icmVxdWVzdEJ5dGVzUmVjaWV2ZWQiIHR5cGU9InhzOmxvbmciIHVzZT0icmVxdWlyZWQiLz4KKwkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZW1vdGVBZGRyIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKwkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJ2aXJ0dWFsSG9zdCIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisJCTx4czphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKwkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJjdXJyZW50VXJpIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKwkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJjdXJyZW50UXVlcnlTdHJpbmciIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgorCQk8eHM6YXR0cmlidXRlIG5hbWU9InByb3RvY29sIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KKwk8L3hzOmNvbXBsZXhUeXBlPgorCTx4czpjb21wbGV4VHlwZSBuYW1lPSJ3b3JrZXJzIj4KKwkJPHhzOnNlcXVlbmNlPgorCQkJPHhzOmVsZW1lbnQgbmFtZT0id29ya2VyIiB0eXBlPSJ3b3JrZXIiLz4KKwkJPC94czpzZXF1ZW5jZT4KKwk8L3hzOmNvbXBsZXhUeXBlPgorPC94czpzY2hlbWE+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy9tYW5hZ2VyL3hmb3JtLnhzbCBiL2NvbnRhaW5lci93ZWJhcHBzL21hbmFnZXIveGZvcm0ueHNsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1Y2VkM2IKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXIvd2ViYXBwcy9tYW5hZ2VyL3hmb3JtLnhzbApAQCAtMCwwICsxLDk2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKworPHhzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgorICB2ZXJzaW9uPSIxLjAiPgorCisgIDwhLS0gT3V0cHV0IG1ldGhvZCAtLT4KKyAgPHhzbDpvdXRwdXQgZW5jb2Rpbmc9Imlzby04ODU5LTEiCisgICAgICAgICAgICAgIGluZGVudD0ibm8iLz4KKworICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJzdGF0dXMiPgorICAgIDxodG1sPgorICAgIDxoZWFkPgorICAgIAk8VElUTEU+VG9tY2F0IFN0YXR1czwvVElUTEU+CisJCTxTVFlMRSB0eXBlPSJ0ZXh0L2NzcyI+CisJCQlib2R5LCB0YWJsZSwgdHIsIHRkLCBhLCBkaXYsIHNwYW4geworCQkJCXZlcnRpY2FsLWFsaWduIDogdG9wOworCQkJfQorCQk8L1NUWUxFPgorICAgIDwvaGVhZD4KKyAgICA8Ym9keT4KKyAgICAgIDxkaXYgc3R5bGU9J2ZvbnQtc2l6ZToyMHB4Oyc+VG9tY2F0IFN0YXR1czwvZGl2PgorCisgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Imp2bSIvPgorICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJjb25uZWN0b3IiLz4KKyAgICAgPC9ib2R5PgorICAgIDwvaHRtbD4KKyAgPC94c2w6dGVtcGxhdGU+CisKKyAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ianZtIj4KKyAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0ibWVtb3J5Ii8+CisgIDwveHNsOnRlbXBsYXRlPgorCisgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Im1lbW9yeSI+CisgICAgPHRhYmxlPjx0cj4KKyAgICAJCSA8dGQ+PGI+SlZNOjwvYj48L3RkPgorICAgIAkJIDx0ZD48Yj5mcmVlOjwvYj4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBmcmVlIi8+PC90ZD4KKyAgICAJCSA8dGQ+PGI+dG90YWw6PC9iPiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHRvdGFsIi8+PC90ZD4KKyAgICAJCSA8dGQ+PGI+bWF4OjwvYj4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBtYXgiLz48L3RkPgorICAgIAkgICA8L3RyPgorICAgIDwvdGFibGU+PGhyIC8+CisgIDwveHNsOnRlbXBsYXRlPgorCisgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImNvbm5lY3RvciI+CisJIDxiPkNvbm5lY3RvciAtLSA8L2I+IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjxiciAvPgorCisgIAk8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9InRocmVhZEluZm8iLz4KKyAgCTx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0icmVxdWVzdEluZm8iLz4KKyAgCTx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0id29ya2VycyIvPgorICA8L3hzbDp0ZW1wbGF0ZT4KKworICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJ0aHJlYWRJbmZvIj4KKyAgICA8dGFibGU+PHRyPgorICAgIAkJIDx0ZD48Yj50aHJlYWRJbmZvIDwvYj48L3RkPgorICAgIAkJIDx0ZD48Yj5tYXhUaHJlYWRzOjwvYj4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBtYXhUaHJlYWRzIi8+PC90ZD4KKyAgICAJCSA8dGQ+PGI+bWluU3BhcmVUaHJlYWRzOjwvYj4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBtaW5TcGFyZVRocmVhZHMiLz48L3RkPgorICAgIAkJIDx0ZD48Yj5tYXhTcGFyZVRocmVhZHM6PC9iPiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG1heFNwYXJlVGhyZWFkcyIvPjwvdGQ+CisgICAgCQkgPHRkPjxiPmN1cnJlbnRUaHJlYWRDb3VudDo8L2I+IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAY3VycmVudFRocmVhZENvdW50Ii8+PC90ZD4KKyAgICAJCSA8dGQ+PGI+Y3VycmVudFRocmVhZHNCdXN5OjwvYj4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBjdXJyZW50VGhyZWFkc0J1c3kiLz48L3RkPgorICAgIAkgICA8L3RyPgorICAgIDwvdGFibGU+PGhyIC8+CisgIDwveHNsOnRlbXBsYXRlPgorCisgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InJlcXVlc3RJbmZvIj4KKyAgICA8dGFibGU+PHRyPgorICAgIAkJIDx0ZD48Yj5yZXF1ZXN0SW5mbyA8L2I+PC90ZD4KKyAgICAJCSA8dGQ+PGI+bWF4VGltZTo8L2I+IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbWF4VGltZSIvPjwvdGQ+CisgICAgCQkgPHRkPjxiPnByb2Nlc3NpbmdUaW1lOjwvYj4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBwcm9jZXNzaW5nVGltZSIvPjwvdGQ+CisgICAgCQkgPHRkPjxiPnJlcXVlc3RDb3VudDo8L2I+IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcmVxdWVzdENvdW50Ii8+PC90ZD4KKyAgICAJCSA8dGQ+PGI+ZXJyb3JDb3VudDo8L2I+IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAZXJyb3JDb3VudCIvPjwvdGQ+CisgICAgCQkgPHRkPjxiPmJ5dGVzUmVjZWl2ZWQ6PC9iPiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGJ5dGVzUmVjZWl2ZWQiLz48L3RkPgorICAgIAkJIDx0ZD48Yj5ieXRlc1NlbnQ6PC9iPiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGJ5dGVzU2VudCIvPjwvdGQ+CisgICAgCSAgIDwvdHI+CisgICAgPC90YWJsZT48aHIgLz4KKyAgPC94c2w6dGVtcGxhdGU+CisKKyAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0id29ya2VycyI+CisgICA8dGFibGU+CisgICAgPHRyPjx0aD5TdGFnZTwvdGg+PHRoPlRpbWU8L3RoPjx0aD5CIFNlbnQ8L3RoPjx0aD5CIFJlY3Y8L3RoPjx0aD5DbGllbnQ8L3RoPjx0aD5WSG9zdDwvdGg+PHRoPlJlcXVlc3Q8L3RoPjwvdHI+CisgIAk8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IndvcmtlciIvPgorCisgICA8L3RhYmxlPjxociAvPgorICA8L3hzbDp0ZW1wbGF0ZT4KKworICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJ3b3JrZXIiPgorICAgPHRyPgorICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHN0YWdlIi8+PC90ZD4KKyAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkByZXF1ZXN0UHJvY2Vzc2luZ1RpbWUiLz48L3RkPgorICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHJlcXVlc3RCeXRlc1NlbnQiLz48L3RkPgorICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHJlcXVlc3RCeXRlc1JlY2VpdmVkIi8+PC90ZD4KKyAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkByZW1vdGVBZGRyIi8+PC90ZD4KKyAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB2aXJ0dWFsSG9zdCIvPjwvdGQ+CisgICAgPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbWV0aG9kIi8+IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAY3VycmVudFVyaSIvPj88eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGN1cnJlbnRRdWVyeVN0cmluZyIvPiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHByb3RvY29sIi8+PC90ZD4KKyAgIDwvdHI+CisgIDwveHNsOnRlbXBsYXRlPgorCis8L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvd2ViZGF2L1dFQi1JTkYvd2ViLnhtbCBiL2NvbnRhaW5lci93ZWJhcHBzL3dlYmRhdi9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTAxZmExNAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL3dlYmRhdi9XRUItSU5GL3dlYi54bWwKQEAgLTAsMCArMSw3NyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgorCis8IURPQ1RZUEUgd2ViLWFwcAorICAgIFBVQkxJQyAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIFdlYiBBcHBsaWNhdGlvbiAyLjMvL0VOIgorICAgICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC93ZWItYXBwXzJfMy5kdGQiPgorCis8d2ViLWFwcD4KKworICA8ZGlzcGxheS1uYW1lPldlYmRhdiBDb250ZW50IE1hbmFnZW1lbnQ8L2Rpc3BsYXktbmFtZT4KKyAgPGRlc2NyaXB0aW9uPgorICAgICBXZWJkYXYgQ29udGVudCBNYW5hZ2VtZW50CisgIDwvZGVzY3JpcHRpb24+CisKKyAgPHNlcnZsZXQ+CisgICAgPHNlcnZsZXQtbmFtZT53ZWJkYXY8L3NlcnZsZXQtbmFtZT4KKyAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLmNhdGFsaW5hLnNlcnZsZXRzLldlYmRhdlNlcnZsZXQ8L3NlcnZsZXQtY2xhc3M+CisgICAgPGluaXQtcGFyYW0+CisgICAgICA8cGFyYW0tbmFtZT5kZWJ1ZzwvcGFyYW0tbmFtZT4KKyAgICAgIDxwYXJhbS12YWx1ZT4wPC9wYXJhbS12YWx1ZT4KKyAgICA8L2luaXQtcGFyYW0+CisgICAgPGluaXQtcGFyYW0+CisgICAgICA8cGFyYW0tbmFtZT5saXN0aW5nczwvcGFyYW0tbmFtZT4KKyAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KKyAgICA8L2luaXQtcGFyYW0+CisgICAgPCEtLSBVbmNvbW1lbnQgdGhpcyB0byBlbmFibGUgcmVhZCBhbmQgd3JpdGUgYWNjZXNzIC0tPgorPCEtLQorICAgIDxpbml0LXBhcmFtPgorICAgICAgPHBhcmFtLW5hbWU+cmVhZG9ubHk8L3BhcmFtLW5hbWU+CisgICAgICA8cGFyYW0tdmFsdWU+ZmFsc2U8L3BhcmFtLXZhbHVlPgorICAgIDwvaW5pdC1wYXJhbT4KKy0tPgorICAgIDwhLS1sb2FkLW9uLXN0YXJ0dXA+MTwvbG9hZC1vbi1zdGFydHVwLS0+CisgIDwvc2VydmxldD4KKworICA8IS0tIFRoZSBtYXBwaW5nIGZvciB0aGUgd2ViZGF2IHNlcnZsZXQgLS0+CisgIDwhLS0gVXNpbmcgLyogYXMgdGhlIG1hcHBpbmcgZW5zdXJlcyB0aGF0IGphc3Blciwgd2VsY29tZSBmaWxlcyBldGMgYXJlCisgICAgICAgb3Zlci1yaWRkZW4gYW5kIGFsbCByZXF1ZXN0cyBhcmUgcHJvY2Vzc2VkIGJ5IHRoZSB3ZWJkYXYgc2VydmxldC4KKyAgICAgICBUaGlzIGFsc28gb3ZlcmNvbWVzIGEgbnVtYmVyIG9mIGlzc3VlcyB3aXRoIHNvbWUgd2ViZGF2IGNsaWVudHMKKyAgICAgICAoaW5jbHVkaW5nIE1TIFdlYmZvbGRlcnMpIHRoYXQgZG8gbm90IHJlc3BvbmQgY29ycmVjdGx5CisgdG8gdGhlCisgICAgICAgcmVkaXJlY3RzICgzMDIpIHRoYXQgcmVzdWx0IGZyb20gdXNpbmcgYSBtYXBwaW5nIG9mIC8gLS0+CisgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgPHNlcnZsZXQtbmFtZT53ZWJkYXY8L3NlcnZsZXQtbmFtZT4KKyAgICA8dXJsLXBhdHRlcm4+Lyo8L3VybC1wYXR0ZXJuPgorICA8L3NlcnZsZXQtbWFwcGluZz4KKworICA8IS0tID09PT09PT09PT09PT09PT0gU2VjdXJpdHkgQ29uc3RyYWludHMgZm9yIFRlc3RpbmcgPT09PT09PT09PT09PT09IC0tPgorCis8IS0tCisgIDxzZWN1cml0eS1jb25zdHJhaW50PgorICAgIDx3ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KKyAgICAgIDx3ZWItcmVzb3VyY2UtbmFtZT5UaGUgRW50aXJlIFdlYiBBcHBsaWNhdGlvbjwvd2ViLXJlc291cmNlLW5hbWU+CisgICAgICA8dXJsLXBhdHRlcm4+Lyo8L3VybC1wYXR0ZXJuPgorICAgIDwvd2ViLXJlc291cmNlLWNvbGxlY3Rpb24+CisgICAgPGF1dGgtY29uc3RyYWludD4KKyAgICAgIDxyb2xlLW5hbWU+dG9tY2F0PC9yb2xlLW5hbWU+CisgICAgPC9hdXRoLWNvbnN0cmFpbnQ+CisgIDwvc2VjdXJpdHktY29uc3RyYWludD4KKworICA8bG9naW4tY29uZmlnPgorICAgIDxhdXRoLW1ldGhvZD5CQVNJQzwvYXV0aC1tZXRob2Q+CisgICAgPHJlYWxtLW5hbWU+VG9tY2F0IFN1cHBvcnRlZCBSZWFsbTwvcmVhbG0tbmFtZT4KKyAgPC9sb2dpbi1jb25maWc+CisKKyAgPHNlY3VyaXR5LXJvbGU+CisgICAgPGRlc2NyaXB0aW9uPgorICAgICAgQW4gZXhhbXBsZSByb2xlIGRlZmluZWQgaW4gImNvbmYvdG9tY2F0LXVzZXJzLnhtbCIKKyAgICA8L2Rlc2NyaXB0aW9uPgorICAgIDxyb2xlLW5hbWU+dG9tY2F0PC9yb2xlLW5hbWU+CisgIDwvc2VjdXJpdHktcm9sZT4KKy0tPgorCisgIDx3ZWxjb21lLWZpbGUtbGlzdD4KKyAgICA8d2VsY29tZS1maWxlLz4KKyAgPC93ZWxjb21lLWZpbGUtbGlzdD4gIAorCis8L3dlYi1hcHA+CmRpZmYgLS1naXQgYS9jb250YWluZXIvd2ViYXBwcy93ZWJkYXYvYnVpbGQueG1sIGIvY29udGFpbmVyL3dlYmFwcHMvd2ViZGF2L2J1aWxkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWZhMTI0Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvd2ViZGF2L2J1aWxkLnhtbApAQCAtMCwwICsxLDc3IEBACis8cHJvamVjdCBuYW1lPSJ3ZWJkYXYiIGRlZmF1bHQ9ImJ1aWxkLW1haW4iIGJhc2VkaXI9Ii4iPgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT0gSW5pdGlhbGl6ZSBQcm9wZXJ0eSBWYWx1ZXMgPT09PT09PT09PT09PT09PT09PSAtLT4KKworICA8IS0tIFNlZSAiYnVpbGQucHJvcGVydGllcy5zYW1wbGUiIGluIHRoZSB0b3AgbGV2ZWwgZGlyZWN0b3J5IGZvciBhbGwgICAgIC0tPgorICA8IS0tIHByb3BlcnR5IHZhbHVlcyB5b3UgbXVzdCBjdXN0b21pemUgZm9yIHN1Y2Nlc3NmdWwgYnVpbGRpbmchISEgICAgICAgIC0tPgorICA8cHJvcGVydHkgZmlsZT0iYnVpbGQucHJvcGVydGllcyIvPgorICA8cHJvcGVydHkgZmlsZT0iLi4vYnVpbGQucHJvcGVydGllcyIvPgorICA8cHJvcGVydHkgZmlsZT0iLi4vLi4vYnVpbGQucHJvcGVydGllcyIvPgorICA8cHJvcGVydHkgZmlsZT0iJHt1c2VyLmhvbWV9L2J1aWxkLnByb3BlcnRpZXMiLz4KKworICA8cHJvcGVydHkgbmFtZT0iYnVpbGQuY29tcGlsZXIiICB2YWx1ZT0ibW9kZXJuIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJ3ZWJhcHBzLmJ1aWxkIiAgIHZhbHVlPSIuLi9idWlsZCIvPgorICA8cHJvcGVydHkgbmFtZT0id2ViYXBwcy5kaXN0IiAgICB2YWx1ZT0iLi4vZGlzdCIvPgorICA8cHJvcGVydHkgbmFtZT0id2ViYXBwLm5hbWUiICAgICB2YWx1ZT0id2ViZGF2Ii8+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT0gQlVJTEQ6IENyZWF0ZSBEaXJlY3RvcmllcyA9PT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImJ1aWxkLXByZXBhcmUiPgorICAgIDxta2RpciBkaXI9IiR7d2ViYXBwcy5idWlsZH0iLz4KKyAgICA8bWtkaXIgZGlyPSIke3dlYmFwcHMuYnVpbGR9LyR7d2ViYXBwLm5hbWV9Ii8+CisgICAgPG1rZGlyIGRpcj0iJHt3ZWJhcHBzLmJ1aWxkfS8ke3dlYmFwcC5uYW1lfS9XRUItSU5GIi8+CisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09IEJVSUxEOiBDb3B5IFN0YXRpYyBGaWxlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJidWlsZC1zdGF0aWMiIGRlcGVuZHM9ImJ1aWxkLXByZXBhcmUiPgorICAgIDxjb3B5IHRvZGlyPSIke3dlYmFwcHMuYnVpbGR9LyR7d2ViYXBwLm5hbWV9Ij4KKyAgICAgIDxmaWxlc2V0IGRpcj0iLiI+CisgICAgICAgIDxleGNsdWRlIG5hbWU9ImJ1aWxkLioiLz4KKyAgICAgIDwvZmlsZXNldD4KKyAgICA8L2NvcHk+CisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PSBCVUlMRDogQ29tcGlsZSBTZXJ2ZXIgQ29tcG9uZW50cyA9PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJidWlsZC1tYWluIiBkZXBlbmRzPSJidWlsZC1zdGF0aWMiLz4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT0gQlVJTEQ6IFJlYnVpbGQgRXZlcnl0aGluZyA9PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iYWxsIiBkZXBlbmRzPSJidWlsZC1jbGVhbixidWlsZC1tYWluIgorICAgZGVzY3JpcHRpb249IkNsZWFuIGFuZCBidWlsZCB3ZWJkYXYgd2ViYXBwIi8+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09IEJVSUxEOiBDbGVhbiBEaXJlY3RvcnkgPT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImJ1aWxkLWNsZWFuIj4KKyAgICA8ZGVsZXRlIGRpcj0iJHt3ZWJhcHBzLmJ1aWxkfS8ke3dlYmFwcC5uYW1lfSIvPgorICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT0gRElTVDogQ3JlYXRlIERpcmVjdG9yaWVzID09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iZGlzdC1wcmVwYXJlIj4KKyAgICA8bWtkaXIgZGlyPSIke3dlYmFwcHMuZGlzdH0iLz4KKyAgPC90YXJnZXQ+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09IERJU1Q6IENyZWF0ZSBEaXN0cmlidXRpb24gRmlsZXMgPT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImRpc3QiIGRlcGVuZHM9ImJ1aWxkLW1haW4sZGlzdC1wcmVwYXJlIgorICAgZGVzY3JpcHRpb249IkNyZWF0ZSB3ZWJkYXYgd2ViYXBwIGJpbmFyeSBkaXN0cmlidXRpb24iPgorICAgICAgPGphciAgIGphcmZpbGU9IiR7d2ViYXBwcy5kaXN0fS8ke3dlYmFwcC5uYW1lfS53YXIiCisgICAgICAgICAgICAgYmFzZWRpcj0iJHt3ZWJhcHBzLmJ1aWxkfS8ke3dlYmFwcC5uYW1lfSIgaW5jbHVkZXM9IioqIi8+CisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PSBESVNUOiBDbGVhbiBEaXJlY3RvcnkgPT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJkaXN0LWNsZWFuIj4KKyAgICA8ZGVsZXRlIGRpcj0iJHtkaXN0LmRpcn0vJHt3ZWJhcHAubmFtZX0iLz4KKyAgPC90YXJnZXQ+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PT0gQ29udmVuaWVudCBTeW5vbnltcyA9PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImNsZWFuIiBkZXBlbmRzPSJidWlsZC1jbGVhbixkaXN0LWNsZWFuIgorICAgZGVzY3JpcHRpb249IkNsZWFuIGJ1aWxkIGFuZCBkaXN0IGRpcmVjdG9yaWVzIi8+CisKKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVyL3dlYmFwcHMvd2ViZGF2L2luZGV4Lmh0bWwgYi9jb250YWluZXIvd2ViYXBwcy93ZWJkYXYvaW5kZXguaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzhmZTJlCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVyL3dlYmFwcHMvd2ViZGF2L2luZGV4Lmh0bWwKQEAgLTAsMCArMSw2MiBAQAorPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4KKzxodG1sPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKzxtZXRhIG5hbWU9IkdFTkVSQVRPUiIgY29udGVudD0iTW96aWxsYS80LjcyIFtlbl0gKFdpbk5UOyBVKSBbTmV0c2NhcGVdIj4KKzxtZXRhIG5hbWU9IkF1dGhvciIgY29udGVudD0iQW5pbCBLLiBWaWplbmRyYW4iPgorPHRpdGxlPlRvbWNhdCBXZWJEQVYgc3VwcG9ydDwvdGl0bGU+Cis8L2hlYWQ+Cis8Ym9keSBiZ2NvbG9yPSIjRkZGRkZGIj4KKzxpbWcgU1JDPSJ0b21jYXQuZ2lmIiBoZWlnaHQ9OTIgd2lkdGg9MTMwIGFsaWduPUxFRlQ+PGI+PGZvbnQgZmFjZT0iQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZiI+PGZvbnQgc2l6ZT0rMz5Ub21jYXQ8L2ZvbnQ+PC9mb250PjwvYj4gCis8YnI+Cis8Yj48Zm9udCBmYWNlPSJBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmIj48Zm9udCBzaXplPS0xPldlYkRBViBzdXBwb3J0PC9mb250PjwvZm9udD48L2I+Cis8cD5UaGlzIGlzIHRoZSBob21lIHBhZ2UgZm9yIHRoZSB3ZWJkYXYgY29udGV4dC4gVGhpcyBwYWdlIGlzIGxvY2F0ZWQgYXQ6Cis8dWw+Cis8bGk+Cis8Zm9udCBmYWNlPSJDb3VyaWVyIE5ldywgQ291cmllcixtb25vIj4kVE9NQ0FUX0hPTUUvd2ViYXBwcy93ZWJkYXYvaW5kZXguaHRtbDwvZm9udD48L2xpPgorPC91bD4KKworPHA+VG9tY2F0IGluY2x1ZGVzIGJ1aWx0LWluIHN1cHBvcnQgZm9yIFdlYkRBViBsZXZlbCAyLCB3aGljaCBlbmFibGVzIAorcmVtb3RlIGF1dGhvcmluZyBvZiB0aGUgd2Vic2l0ZS4gWW91IGNhbiB0ZXN0IHRoZXNlIGNhcGFiaWxpdGllcyB1c2luZyBhIFdlYkRBVgorY2xpZW50IGxpa2UgTVMgV2ViRm9sZGVycyAoaW5jbHVkZWQgd2l0aCBJRSA0LjAgYW5kIHVwKSwgTVMgT2ZmaWNlIDIwMDAsIERBVgorRXhwbG9yZXIgKG90aGVycyBhcmUgbGlzdGVkIG9uIHRoZSB3ZWJwYWdlcyBsaW5rZWQgYmVsb3cpLCBhbmQgcG9pbnQgdG8gdGhlCis8Yj4vd2ViZGF2PC9iPiBwYXRoIG9mIHRoZSBzZXJ2ZXIuCisKKzxwPlRoaXMgdGVzdCBjb250ZXh0IGlzIERBViBlbmFibGVkLCBidXQgaGFzIGJlZW4gc2V0IHVwIGluIHJlYWQtb25seSBtb2RlIGZvcgorc2FmZXR5IHJlYXNvbnMuIEl0IGNhbiBiZSBwdXQgaW4gcmVhZC13cml0ZSBtb2RlIGJ5IGVkaXRpbmcgdGhlIHdlYiAKK2FwcGxpY2F0aW9uIGRlc2NyaXB0b3IgZmlsZSAoV0VCLUlORi93ZWIueG1sKS4KKworPHA+V29ya2luZyBXZWJEQVYgY2xpZW50cyBpbmNsdWRlIDoKKzx1bD4KKzxsaT5BZG9iZSBHb0xpdmUgNS4wIChhbmQgb3RoZXIgV2ViREFWLWVuYWJsZWQgQWRvYmUgcHJvZHVjdHMsIGxpa2UKKyAgUGhvdG9zaG9wKTwvbGk+Cis8bGk+Q2FkYXZlciAwLjE1PC9saT4KKzxsaT5EQVYgRXhwbG9yZXIgMC42MCBhbmQgMC43MDwvbGk+Cis8bGk+SW50ZXJuZXQgRXhwbG9yZXIgNSAoV2luZG93cyAyMDAwKTwvbGk+Cis8bGk+SW50ZXJuZXQgRXhwbG9yZXIgNS41IChXaW5kb3dzIDIwMDApPC9saT4KKzxsaT5KYWthcnRhIFNsaWRlIDEuMCBXZWJEQVYgY2xpZW50IGxpYnJhcnk8L2xpPgorPGxpPk9mZmljZSAyMDAwIChXaW5kb3dzIDIwMDApPC9saT4KKzxsaT5Ta3Vua0RBViAxLjA8L2xpPgorPC91bD4KKworPHA+V2ViREFWIGxpbmtzOjwvcD4KKzx1bD4KKzxsaT48Yj48YSBocmVmPSJodHRwOi8vd3d3LndlYmRhdi5vcmciPkdlbmVyYWwgaW5mbyBvbiBXZWJEQVY8L2E+PC9iPjwvbGk+Cis8bGk+PGI+PGEgaHJlZj0iaHR0cDovL3d3dy5pY3MudWNpLmVkdS9wdWIvaWV0Zi93ZWJkYXYvIj5XZWJEQVYgd29ya2luZyAKK2dyb3VwPC9hPjwvYj48L2xpPgorPGxpPjxiPjxhIGhyZWY9Imh0dHA6Ly93d3cud2ViZGF2Lm9yZy9wcm9qZWN0cy8iPldlYkRBViBjbGllbnRzPC9hPjwvYj48L2xpPgorPGxpPjxiPgorPGEgaHJlZj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9zbGlkZS8iPlRoZSBKYWthcnRhIFNsaWRlIFByb2plY3Q8L2E+Cis8L2I+PC9saT4KKzwvdWw+CisKKworPGhyPgorPHAgYWxpZ249InJpZ2h0Ij48Zm9udCBzaXplPS0xPjxpbWcgc3JjPSJ0b21jYXQtcG93ZXIuZ2lmIiB3aWR0aD0iNzciIGhlaWdodD0iODAiPjwvZm9udD48YnI+CismbmJzcDsKKzxmb250IHNpemU9LTE+Q29weXJpZ2h0ICZjb3B5OyAxOTk5LTIwMDEgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248L2ZvbnQ+PGJyPgorPGZvbnQgc2l6ZT0tMT5BbGwgUmlnaHRzIFJlc2VydmVkPC9mb250PiA8YnI+CismbmJzcDs8L3A+Cis8cCBhbGlnbj0icmlnaHQiPiZuYnNwOzwvcD4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL3dlYmRhdi90b21jYXQtcG93ZXIuZ2lmIGIvY29udGFpbmVyL3dlYmFwcHMvd2ViZGF2L3RvbWNhdC1wb3dlci5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFhNzQwNAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL3dlYmRhdi90b21jYXQtcG93ZXIuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRhaW5lci93ZWJhcHBzL3dlYmRhdi90b21jYXQuZ2lmIGIvY29udGFpbmVyL3dlYmFwcHMvd2ViZGF2L3RvbWNhdC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE3NTY3MwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lci93ZWJhcHBzL3dlYmRhdi90b21jYXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2phc3Blci9MSUNFTlNFIGIvamFzcGVyL0xJQ0VOU0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY0NTY5NQotLS0gL2Rldi9udWxsCisrKyBiL2phc3Blci9MSUNFTlNFCkBAIC0wLDAgKzEsMjAyIEBACisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0CisgICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCisKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgorCisgICAxLiBEZWZpbml0aW9ucy4KKworICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKKyAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgorCisgICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQorICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCisgICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCisgICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAorICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCisgICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgorICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCisgICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgorCisgICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgorCisgICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKKyAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KKyAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisKKyAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCisgICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CisgICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCisgICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCisKKyAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCisgICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCisgICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKKyAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCisKKyAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKKyAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKKyAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKKyAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCisgICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KKyAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKKyAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCisKKyAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCisgICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCisgICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKKyAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKKyAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgorICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCisgICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50CisgICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bworICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKKyAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCisgICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKKyAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCisgICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKKworICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAorICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCisKKyAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAorICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCisgICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgorCisgICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKKyAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAorICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKKyAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCisgICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCisgICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQorICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKKyAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKKyAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0CisgICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCisgICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKKyAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KKworICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKKyAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAorICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKKyAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgorICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCisKKyAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKKworICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCisgICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAorICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCisgICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgorICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKKworICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCisgICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAorICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAorICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAorICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQorICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCisgICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgorICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAorICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKKyAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKKyAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCisgICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KKyAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQorICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAorICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAorICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KKworICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCisgICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCisgICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKKyAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAorICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KKworICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAorICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCisgICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCisgICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5CisgICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAorICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgorCisgICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCisgICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCisgICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKKyAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgorCisgICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKKyAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKKyAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisgICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucworICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQorICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCisgICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKKyAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KKworICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCisgICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKKyAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5CisgICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQorICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAorICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCisgICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCisgICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCisgICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAorICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgorICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgorCisgICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCisgICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAorICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKKyAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCisgICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQorICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKKyAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKKyAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQorICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgorICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCisKKyAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworCisgICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCisKKyAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nCisgICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCisgICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQorICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUKKyAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQorICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQorICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyCisgICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCisKKyAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQorCisgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvamFzcGVyL2phc3BlcjIvLmN2c2lnbm9yZSBiL2phc3Blci9qYXNwZXIyLy5jdnNpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQwYjcxYQotLS0gL2Rldi9udWxsCisrKyBiL2phc3Blci9qYXNwZXIyLy5jdnNpZ25vcmUKQEAgLTAsMCArMSwyIEBACitidWlsZAorZGlzdApkaWZmIC0tZ2l0IGEvamFzcGVyL2phc3BlcjIvQlVJTERJTkcudHh0IGIvamFzcGVyL2phc3BlcjIvQlVJTERJTkcudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlZDBiNWIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXNwZXIvamFzcGVyMi9CVUlMRElORy50eHQKQEAgLTAsMCArMSw3MyBAQAorJElkJAorCisgICAgICAgICBCdWlsZGluZyBUaGUgVG9tY2F0IDQuMCBTZXJ2bGV0L0pTUCBDb250YWluZXIgV2l0aCBKYXNwZXIyCisgICAgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0phc3BlcjIgaXMgYSByZWltcGxlbWVudGF0aW9uIG9mIHRoZSBKU1AgQ29udGFpbmVyIGZvciBUb21jYXQgNC4wIHRoYXQgaXMKK2NsZWFuZXIgYW5kIGVhc2llciB0byBleHRlbmQuICBJdCBhbHNvIGZvcm1zIHRoZSBiYXNpcyBvZiB0aGUgSlNQIDIuMCAKK2ltcGxlbWVudGF0aW9uLiAgSmFzcGVyMiB3aWxsIGV2ZW50dWFsbHkgcmVwbGFjZSB0aGUgSmFzcGVyIG1vZHVsZQorYnVpbHQgaW50byB0aGUgVG9tY2F0IGRpc3RyaWJ1dGlvbi4gIEluIHRoZSBtZWFud2hpbGUsIHlvdSBjYW4gYnVpbGQgSmFzcGVyMgorYWxvbmdzaWRlIFRvbWNhdCA0LjAgYW5kIHJlcGxhY2UgSmFzcGVyLgorCitUbyBidWlsZCBKYXNwZXIyLCBmaXJzdCBtYWtlIHN1cmUgeW91IGhhdmUgYSB3b3JraW5nIGJ1aWxkIGVudmlyb25tZW50IGZvcgorVG9tY2F0IDQuMC4gIFlvdSBjYW4gZG8gc28gYnkgZm9sbG93aW5nIHRoZSBpbnN0cnVjdGlvbnMgaW4gdGhlIEJVSUxESU5HLnR4dAorZmlsZSBpbiB0aGUgVG9tY2F0IDQuMCB3b3Jrc3BhY2UuCisKK09uY2UgeW91IGhhdmUgYSB3b3JraW5nIGJ1aWxkIGVudmlyb25tZW50IGZvciBUb21jYXQgNC4wLCBkbyB0aGUgZm9sbG93aW5nOgorCisoMCkgTW9kaWZ5IHlvdXIgYnVpbGQucHJvcGVydGllcyBmaWxlIGluIFRvbWNhdCA0LjAKKworKiBBZGQgYSBsaW5lIHRvIHlvdXIgYnVpbGQucHJvcGVydGllcyBmaWxlIGZvciBUb21jYXQgNC4wIHRoYXQKKyAgcG9pbnRzIHRoZSBidWlsZCBzY3JpcHQgdG8gSmFzcGVyMiBpbnN0ZWFkIG9mIEphc3BlciwgYXMgZm9sbG93czoKKworICAgICAgIyAtLS0tLSBKYWthcnRhIFRvbWNhdCBKYXNwZXIgc291cmNlIHBhdGggLS0tLS0KKyAgICAgIGphc3Blci5ob21lPSR7YmFzZS5wYXRofS9qYWthcnRhLXRvbWNhdC1qYXNwZXIvamFzcGVyMgorCisgIFRoaXMgZGlyZWN0b3J5IGlzIHJlbGF0aXZlIHRvIHRoZSBsb2NhdGlvbiBvZiBidWlsZC54bWwgZm9yIFRvbWNhdC4KKworKDEpIFVzZSBhbm9ueW1vdXMgQ1ZTIChhcyBkZXNjcmliZWQgb24gdGhlIEpha2FydGEgd2ViIHNpdGUgYXQKKyAgICA8aHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9zaXRlL2N2c2luZGV4Lmh0bWw+LCBvciBkb3dubG9hZCBhIHNvdXJjZQorICAgIGRpc3RyaWJ1dGlvbiBvZiB0aGUgImpha2FydGEtdGFnbGlicyIgcmVwb3NpdG9yeSAoNy8xNS8yMDAyIG9yIGxhdGVyKS4KKworICAgIGh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvYnVpbGRzL2pha2FydGEtdGFnbGlicy9uaWdodGx5L3Byb2plY3RzL3N0YW5kYXJkLworCisqIFVucGFjayB0aGUgcGFja2FnZSBpbnRvIGEgY29udmVuaWVudCBsb2NhdGlvbiBzbyB0aGF0CisgIGl0IHJlc2lkZXMgaW4gaXRzIG93biBzdWJkaXJlY3RvcnkuCisKKyogRm9sbG93IHRoZSBpbnN0cnVjdGlvbnMgaW4gQlVJTERJTkcudHh0IHRvIHNldCB1cCB0aGUgY29ycmVjdCAKKyAgYnVpbGQgZW52aXJvbm1lbnQuICBNYWtlIHN1cmUgeW91IGhhdmUgYSB2YWxpZCBidWlsZC5wcm9wZXJ0aWVzIGZpbGUuCisKKyogQ2hhbmdlIGRpcmVjdG9yeSB0byAic3RhbmRhcmQiIGFuZCBidWlsZCB0aGUgc3BlY2lhbCBKU1AgMi4wIGJ1aWxkIHRhcmdldAorICBmb3IgcHJvZHVjaW5nIHRoZSBKU1AgMi4wIEV4cHJlc3Npb24gTGFuZ3VhZ2UgRXZhbHVhdG9yLiAgVGhlIGFudCB0YXJnZXQKKyAgaXMgY2FsbGVkIGpzcDIwZWwuZGlzdC4KKworICAgICAgICBjZCBzdGFuZGFyZAorICAgICAgICBhbnQganNwMjBlbC5kaXN0CisKKygyKSBDdXN0b21pemUgQnVpbGQgUHJvcGVydGllcyBmb3IgdGhpcyBzdWJwcm9qZWN0CisKK01vc3QgSmFrYXJ0YSBzdWJwcm9qZWN0cyBhbGxvdyB5b3UgdG8gY3VzdG9taXplIEFudCBwcm9wZXJ0aWVzICh3aXRoIGRlZmF1bHQKK3ZhbHVlcyBkZWZpbmVkIGluIHRoZSAiYnVpbGQueG1sIiBmaWxlLiAgVGhpcyBpcyBkb25lIGJ5IGNyZWF0aW5nIGEgdGV4dCBmaWxlCituYW1lZCAiYnVpbGQucHJvcGVydGllcyIgaW4gdGhlIHNvdXJjZSBkaXN0cmlidXRpb24gZGlyZWN0b3J5IChmb3IgcHJvcGVydHkKK2RlZmluaXRpb25zIGxvY2FsIHRvIHRoaXMgc3VicHJvamVjdCkgYW5kL29yIHlvdXIgdXNlciBob21lIGRpcmVjdG9yeSAoZm9yCitwcm9wZXJ0eSBkZWZpbml0aW9ucyBzaGFyZWQgYWNyb3NzIHN1YnByb2plY3RzKS4gIFlvdSBjYW4gdXNlIHRoZSBpbmNsdWRlZAorImJ1aWxkLnByb3BlcnRpZXMuc2FtcGxlIiBmaWxlIGFzIGEgc3RhcnRpbmcgcG9pbnQgZm9yIHRoaXMuCisKK0phc3BlcjIgaGFzIGV4dGVybmFsIGRlcGVuZGVuY2llcyB0aGF0IGFyZSBzYXRpc2ZpZWQgYnkgY29uZmlndXJpbmcKK2FwcHJvcHJpYXRlIHZhbHVlcyBpbiB5b3VyIGJ1aWxkLnByb3BlcnRpZXMgZmlsZS4gIFRoZSBlYXNpZXN0Cit3YXkgdG8gc2F0aXNmeSB0aGVzZSBkZXBlbmRlbmNpZXMgaXMgdG8gY29weSB0aGUgImJ1aWxkLnByb3BlcnRpZXMuc2FtcGxlIgorZmlsZSAoaW4gdGhlIHRvcC1sZXZlbCBUb21jYXQgc291cmNlIGRpcmVjdG9yeSkgdG8gImJ1aWxkLnByb3BlcnRpZXMiLCBhbmQKK3RoZW4gZWRpdCBpdCB0byBzdWl0IHlvdXIgZW52aXJvbm1lbnQuICBPbiBVbml4LCB0aGlzIHdvdWxkIGJlIGRvbmUgYXM6CisKKyAgY2QgJHtqYXNwZXIyLnNvdXJjZX0KKyAgY3AgYnVpbGQucHJvcGVydGllcy5zYW1wbGUgYnVpbGQucHJvcGVydGllcworICBlbWFjcyBidWlsZC5wcm9wZXJ0aWVzCisKK05PVEU6ICBCZSAqc3VyZSogdGhhdCB5b3UgZG8gbm90IGNoZWNrICJidWlsZC5wcm9wZXJ0aWVzIiBpbiB0byB0aGUgQ1ZTCityZXBvc2l0b3J5LiAgVGhpcyBmaWxlIGlzIGxvY2FsIHRvIHlvdXIgb3duIGRldmVsb3BtZW50IGVudmlyb25tZW50LCBhbmQKK2VhY2ggZGV2ZWxvcGVyIHdpbGwgaGF2ZSB0aGVpciBvd24gdmVyc2lvbi4KKworKDMpIEJ1aWxkIEEgQmluYXJ5IERpc3RyaWJ1dGlvbgorCitKYXNwZXIyIGlzIGJ1aWx0IGFzIHBhcnQgb2YgVG9tY2F0LiAgRm9sbG93IHRoZSBpbnN0cnVjdGlvbnMgaW4gCitCVUlMRElORy50eHQgaW4gdGhlIFRvbWNhdCBwcm9qZWN0IHRvIGJ1aWxkIFRvbWNhdCB3aXRoIEphc3BlcjIuCmRpZmYgLS1naXQgYS9qYXNwZXIvamFzcGVyMi9SRUFETUUudHh0IGIvamFzcGVyL2phc3BlcjIvUkVBRE1FLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjQ0OWEwCi0tLSAvZGV2L251bGwKKysrIGIvamFzcGVyL2phc3BlcjIvUkVBRE1FLnR4dApAQCAtMCwwICsxLDI0IEBACitUaGlzIHByb2plY3QgaXMgYSByZXdyaXRlIG9mIEphc3BlciBmb3IgdG9tY2F0IDQueC4KKworMS4gTWFpbiBnb2FsczoKKworICAgKiBDbGVhbnVwIG9mIHRoZSBjdXJyZW50IEphc3Blci4KKyAgICogVXNlIGZvciBSSSB3b3JrIGZvciBKU1AgMS4zCisgICAqIFVzZSBmb3Igb3B0aW1pemF0aW9uIHdvcmsgZm9yIGdlbmVyYXRlZCBzZXJ2bGV0IGNvZGVzLgorCisyLiBTdGF0dXMKKworICAgKiBNYWluIGphc3BlciBlbmdpbmUgKHBhcnNlciwgYXR0cmlidXRlIHZhbGlkYXRlcywgY29kZSBnZW5lcmF0b3IpCisgICAgIGJhc2ljYWxseSBjb21wbGV0ZS4KKworMy4gVG9kbworCisgICAqIFJld3JpdGUgYXR0cmlidXRlIHBhcnNlciBmb3IgYmV0dGVyIHNwZWMgY29tZm9ybWFuY2UuCisgICAqIE1vcmUgY2xlYW51cCwgZXNwZWNpYWxseSBqc3BjIHBhcnRzLgorICAgKiBBZGRlZCBsYXJnZSBmaWxlIG9wdGlvbi4KKyAgICogRXJyb3IgbWVzc2FnZXMuCisgICAqIEpTUjA0NSBzdXBwb3J0CisgICAqIEV4cHJlc3Npb24gbGFuZ3VhZ2Ugc3VwcG9ydCAoSlNQMS4zKQorICAgKiBPcHRpbWl6YXRpb25zLCBvcHRpbWl6YXRpb25zLCBhbmQgb3B0aW1pemF0aW9ucworCisKZGlmZiAtLWdpdCBhL2phc3Blci9qYXNwZXIyL2J1aWxkLnByb3BlcnRpZXMuc2FtcGxlIGIvamFzcGVyL2phc3BlcjIvYnVpbGQucHJvcGVydGllcy5zYW1wbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk5YTNhZAotLS0gL2Rldi9udWxsCisrKyBiL2phc3Blci9qYXNwZXIyL2J1aWxkLnByb3BlcnRpZXMuc2FtcGxlCkBAIC0wLDAgKzEsMTcgQEAKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgYnVpbGQucHJvcGVydGllcy5zYW1wbGUKKyMKKyMgVGhpcyBpcyBhbiBleGFtcGxlICJidWlsZC5wcm9wZXJ0aWVzIiBmaWxlLCB1c2VkIHRvIGN1c3RvbWl6ZSBidWlsZGluZyAKKyMgSmFzcGVyMiBmb3IgeW91ciBsb2NhbCBlbnZpcm9ubWVudC4gIEl0IGRlZmluZXMgdGhlIGxvY2F0aW9uIG9mIGFsbCBleHRlcm5hbAorIyBtb2R1bGVzIHRoYXQgSmFzcGVyMiBkZXBlbmRzIG9uLiAgQ29weSB0aGlzIGZpbGUgdG8gImJ1aWxkLnByb3BlcnRpZXMiCisjIGluIHRoZSB0b3AtbGV2ZWwgc291cmNlIGRpcmVjdG9yeSwgYW5kIGN1c3RvbWl6ZSBpdCBhcyBuZWVkZWQuCisjCisjICRJZCQKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyAtLS0tLSBQb2ludGVyIHRvIENhdGFsaW5hIC0tLS0tCitjYXRhbGluYS5ob21lPS4uLy4uL2pha2FydGEtdG9tY2F0LTUvYnVpbGQKKworIyAtLS0tLSBQb2ludGVyIHRvIEpTUCBTdGFuZGFyZCBUYWcgTGlicmFyeSBkaXN0cmlidXRpb24gLS0tLS0KKyNzdGFuZGFyZC5ob21lPSR7YmFzZS5wYXRofS9qYWthcnRhLXRhZ2xpYnMvc3RhbmRhcmQKKyNqc3AyMGVsLmphcj0ke3N0YW5kYXJkLmhvbWV9Ly4uL2Rpc3QvanNwMjBlbC9qc3AyMGVsLmphcgpkaWZmIC0tZ2l0IGEvamFzcGVyL2phc3BlcjIvYnVpbGQueG1sIGIvamFzcGVyL2phc3BlcjIvYnVpbGQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5YzNlYjcKLS0tIC9kZXYvbnVsbAorKysgYi9qYXNwZXIvamFzcGVyMi9idWlsZC54bWwKQEAgLTAsMCArMSwzMDYgQEAKKzxwcm9qZWN0IG5hbWU9Ikphc3BlcjIiIGRlZmF1bHQ9ImRlcGxveSIgYmFzZWRpcj0iLiI+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PSBJbml0aWFsaXplIFByb3BlcnR5IFZhbHVlcyA9PT09PT09PT09PT09PT09PT09IC0tPgorCisgIDwhLS0gU2VlICJidWlsZC5wcm9wZXJ0aWVzLnNhbXBsZSIgaW4gdGhlIHRvcCBsZXZlbCBkaXJlY3RvcnkgZm9yIGFsbCAgICAgLS0+CisgIDwhLS0gcHJvcGVydHkgdmFsdWVzIHlvdSBtdXN0IGN1c3RvbWl6ZSBmb3Igc3VjY2Vzc2Z1bCBidWlsZGluZyEhISAgICAgICAgLS0+CisgIDxwcm9wZXJ0eSBmaWxlPSIke3VzZXIuaG9tZX0vYnVpbGQucHJvcGVydGllcyIvPgorICA8cHJvcGVydHkgZmlsZT0iYnVpbGQucHJvcGVydGllcyIvPgorICA8cHJvcGVydHkgZmlsZT0iYnVpbGQucHJvcGVydGllcy5zYW1wbGUiLz4KKyAgPHByb3BlcnR5IGZpbGU9IiR7Y2F0YWxpbmEuaG9tZX0vYnVpbGQucHJvcGVydGllcyIvPgorCisgIDwhLS0gQnVpbGQgRGVmYXVsdHMgLS0+CisgIDxwcm9wZXJ0eSBuYW1lPSJqYXNwZXIuYnVpbGQiICAgICAgdmFsdWU9IiR7YmFzZWRpcn0vYnVpbGQiLz4KKyAgPHByb3BlcnR5IG5hbWU9ImNhdGFsaW5hLmhvbWUiICAgICB2YWx1ZT0iLi4vLi4vamFrYXJ0YS10b21jYXQtNC4xL2J1aWxkIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJqYXNwZXIuZGVwbG95IiAgICAgdmFsdWU9IiR7Y2F0YWxpbmEuaG9tZX0iLz4KKyAgPHByb3BlcnR5IG5hbWU9Imphc3Blci5kaXN0IiAgICAgICB2YWx1ZT0iJHtiYXNlZGlyfS9kaXN0Ii8+CisgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0LmZhaWxvbmVycm9yIiAgdmFsdWU9InRydWUiLz4KKyAgPHByb3BlcnR5IG5hbWU9InRlc3QucnVubmVyIiAgICAgICB2YWx1ZT0ianVuaXQudGV4dHVpLlRlc3RSdW5uZXIiLz4KKyAgPHByb3BlcnR5IG5hbWU9InRvb2xzLmphciIgICAgICAgICB2YWx1ZT0iJHtqYXZhLmhvbWV9L2xpYi90b29scy5qYXIiLz4KKyAgPHByb3BlcnR5IG5hbWU9ImFudC5qYXIiICAgICAgICAgICB2YWx1ZT0iJHthbnQuaG9tZX0vbGliL2FudC5qYXIiLz4KKyAgPHByb3BlcnR5IG5hbWU9InNlcnZsZXQtYXBpLmphciIgdmFsdWU9IiR7YXBpLmhvbWV9L2pzcjE1NC9kaXN0L2xpYi9zZXJ2bGV0LWFwaS5qYXIiLz4KKyAgPHByb3BlcnR5IG5hbWU9ImpzcC1hcGkuamFyIiB2YWx1ZT0iJHthcGkuaG9tZX0vanNyMTUyL2Rpc3QvbGliL2pzcC1hcGkuamFyIi8+CisKKworICA8IS0tIENvbnN0cnVjdCBKYXNwZXIgY2xhc3NwYXRoIC0tPgorICA8cGF0aCBpZD0iamFzcGVyLmNsYXNzcGF0aCI+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2FudC5qYXJ9Ii8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3NlcnZsZXQtYXBpLmphcn0iLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7anNwLWFwaS5qYXJ9Ii8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3Rvb2xzLmphcn0iLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7amFzcGVyLWNvbXBpbGVyLWpkdC5qYXJ9Ii8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3hlcmNlcy5qYXJ9Ii8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3hlcmNlc0ltcGwuamFyfSIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt4bWwtYXBpcy5qYXJ9Ii8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NvbW1vbnMtZWwuamFyfSIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjb21tb25zLWNvbGxlY3Rpb25zLmphcn0iLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y29tbW9ucy1sb2dnaW5nLmphcn0iLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y29tbW9ucy1kYWVtb24tbGF1bmNoZXIuamFyfSIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtqYXNwZXIuYnVpbGR9L3NoYXJlZC9jbGFzc2VzIi8+CisgIDwvcGF0aD4KKworICA8IS0tIENvbnN0cnVjdCB1bml0IHRlc3RzIGNsYXNzcGF0aCAtLT4KKyAgPHBhdGggaWQ9InRlc3QuY2xhc3NwYXRoIj4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7YW50Lmphcn0iLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7anVuaXQuamFyfSIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtzZXJ2bGV0LWFwaS5qYXJ9Ii8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2pzcC1hcGkuamFyfSIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt0b29scy5qYXJ9Ii8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3hlcmNlcy5qYXJ9Ii8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3hlcmNlc0ltcGwuamFyfSIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt4bWwtYXBpcy5qYXJ9Ii8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NvbW1vbnMtY29sbGVjdGlvbnMuamFyfSIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjb21tb25zLWxhdW5jaGVyLmphcn0iLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7amFzcGVyLmJ1aWxkfS9zaGFyZWQvY2xhc3NlcyIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtqYXNwZXIuYnVpbGR9L3Rlc3RzIi8+CisgIDwvcGF0aD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PSBCVUlMRDogQ3JlYXRlIERpcmVjdG9yaWVzID09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iYnVpbGQtcHJlcGFyZSI+CisKKyAgICA8YXZhaWxhYmxlIGNsYXNzbmFtZT0ianVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIiBwcm9wZXJ0eT0ianVuaXQucHJlc2VudCIgLz4KKyAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJsYXVuY2hlci5wcmVzZW50IgorICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUuY29tbW9ucy5sYXVuY2hlci5MYXVuY2hlciIKKyAgICAgY2xhc3NwYXRoPSIke2NvbW1vbnMtZGFlbW9uLWxhdW5jaGVyLmphcn0iLz4KKyAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJsYXVuY2hlci5ib290c3RyYXAucHJlc2VudCIKKyAgICAgZmlsZT0iJHtjb21tb25zLWRhZW1vbi1sYXVuY2hlci1ib290c3RyYXAuY2xhc3N9Ii8+CisKKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJjb3B5LmxhdW5jaGVyLmphcnMiPgorICAgICAgPGFuZD4KKyAgICAgICAgPGVxdWFscyBhcmcxPSIke2xhdW5jaGVyLnByZXNlbnR9IiBhcmcyPSJ0cnVlIiAvPgorICAgICAgICA8ZXF1YWxzIGFyZzE9IiR7bGF1bmNoZXIuYm9vdHN0cmFwLnByZXNlbnR9IiBhcmcyPSJ0cnVlIiAvPgorICAgICAgPC9hbmQ+CisgICAgPC9jb25kaXRpb24+CisKKyAgICA8bWtkaXIgZGlyPSIke2phc3Blci5idWlsZH0iLz4KKyAgICA8bWtkaXIgZGlyPSIke2phc3Blci5idWlsZH0vYmluIi8+CisgICAgPG1rZGlyIGRpcj0iJHtqYXNwZXIuYnVpbGR9L2NvbW1vbi9jbGFzc2VzIi8+CisgICAgPG1rZGlyIGRpcj0iJHtqYXNwZXIuYnVpbGR9L2NvbW1vbi9saWIiLz4KKyAgICA8bWtkaXIgZGlyPSIke2phc3Blci5idWlsZH0vc2hhcmVkL2NsYXNzZXMiLz4KKyAgICA8bWtkaXIgZGlyPSIke2phc3Blci5idWlsZH0vc2hhcmVkL2xpYiIvPgorCisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09IEJVSUxEOiBDb3B5IExhdW5jaGVyIEZpbGVzID09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJjb3B5LWxhdW5jaGVyLmphcnMiIGlmPSJjb3B5LmxhdW5jaGVyLmphcnMiPgorICAgIDwhLS0gPGNvcHkgdG9kaXI9IiR7amFzcGVyLmJ1aWxkfS9jb21tb24vbGliIiBmaWxlPSIke2FudC5qYXJ9Ii8+IC0tPgorICAgIDxjb3B5IHRvZGlyPSIke2phc3Blci5idWlsZH0vYmluIiBmaWxlPSIke2NvbW1vbnMtZGFlbW9uLWxhdW5jaGVyLmphcn0iLz4KKyAgICA8Y29weSB0b2Rpcj0iJHtqYXNwZXIuYnVpbGR9L2JpbiIgZmlsZT0iJHtjb21tb25zLWRhZW1vbi1sYXVuY2hlci1ib290c3RyYXAuY2xhc3N9Ii8+CisgICAgPGNvcHkgdG9kaXI9IiR7amFzcGVyLmJ1aWxkfS9iaW4iPgorICAgICAgPGZpbGVzZXQgZGlyPSJzcmMvYmluIiBpbmNsdWRlcz0iKi11c2luZy1sYXVuY2hlci4qLGxhdW5jaGVyLnByb3BlcnRpZXMsamFzcGVyLnhtbCIgLz4KKyAgICA8L2NvcHk+CisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09IEJVSUxEOiBDb3B5IFN0YXRpYyBGaWxlcyA9PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJidWlsZC1zdGF0aWMiIGRlcGVuZHM9ImJ1aWxkLXByZXBhcmUsY29weS1sYXVuY2hlci5qYXJzIj4KKworICAgIDwhLS0gRXhlY3V0YWJsZSBDb21tYW5kcyAtLT4KKyAgICA8Y29weSB0b2Rpcj0iJHtqYXNwZXIuYnVpbGR9L2JpbiI+CisgICAgICA8ZmlsZXNldCBkaXI9InNyYy9iaW4iIGV4Y2x1ZGVzPSIqLXVzaW5nLWxhdW5jaGVyLiosbGF1bmNoZXIucHJvcGVydGllcyxqYXNwZXIueG1sIiAvPgorICAgIDwvY29weT4KKyAgICA8Zml4Y3JsZiBzcmNkaXI9IiR7amFzcGVyLmJ1aWxkfS9iaW4iIGluY2x1ZGVzPSIqLnNoIiBlb2w9ImxmIi8+CisgICAgPGZpeGNybGYgc3JjZGlyPSIke2phc3Blci5idWlsZH0vYmluIiBpbmNsdWRlcz0iKi5iYXQiIGVvbD0iY3JsZiIvPgorICAgIDxjaG1vZCBwZXJtPSIreCIgZGlyPSIke2phc3Blci5idWlsZH0vYmluIiBpbmNsdWRlcz0iKi5zaCIvPgorCisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PSBCVUlMRDogQ29tcGlsZSBTZXJ2ZXIgQ29tcG9uZW50cyA9PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJidWlsZC1tYWluIiBkZXBlbmRzPSJidWlsZC1zdGF0aWMsYnVpbGQtb25seSI+CisgICAgPCEtLSBFeHRyYSBvcGVyYXRpb25zOiBTdXBwb3J0aW5nIEpBUiBGaWxlcyAtLT4KKyAgICA8Y29weSB0b2Rpcj0iJHtqYXNwZXIuYnVpbGR9L3NoYXJlZC9saWIiIGZpbGU9IiR7Y29tbW9ucy1lbC5qYXJ9Ii8+CisgIDwvdGFyZ2V0PgorCisgIDwhLS0gSnVzdCBidWlsZCBqYXNwZXIgLS0+CisgIDx0YXJnZXQgbmFtZT0iYnVpbGQtb25seSI+CisgICAgPHByb3BlcnR5IG5hbWU9Imphc3Blci5jbGFzc2VzIiB2YWx1ZT0iJHtqYXNwZXIuYnVpbGR9L3NoYXJlZC9jbGFzc2VzIi8+CisgICAgPHByb3BlcnR5IG5hbWU9Imphc3Blci1jb21waWxlci5qYXIiIHZhbHVlPSIke2phc3Blci5idWlsZH0vc2hhcmVkL2xpYi9qYXNwZXItY29tcGlsZXIuamFyIi8+CisgICAgPHByb3BlcnR5IG5hbWU9Imphc3Blci1ydW50aW1lLmphciIgdmFsdWU9IiR7amFzcGVyLmJ1aWxkfS9zaGFyZWQvbGliL2phc3Blci1ydW50aW1lLmphciIvPgorCisgICAgPCEtLSBDb21waWxlIGludGVybmFsIHNlcnZlciBjb21wb25lbnRzIC0tPgorICAgIDxqYXZhYyBzcmNkaXI9InNyYy9zaGFyZSIgZGVzdGRpcj0iJHtqYXNwZXIuY2xhc3Nlc30iCisgICAgICAgICAgIGRlYnVnPSIke2NvbXBpbGUuZGVidWd9IgorICAgICAgICAgICBkZXByZWNhdGlvbj0iJHtjb21waWxlLmRlcHJlY2F0aW9ufSIKKyAgICAgICAgICAgc291cmNlPSIke2NvbXBpbGUuc291cmNlfSIKKyAgICAgICAgICAgb3B0aW1pemU9IiR7Y29tcGlsZS5vcHRpbWl6ZX0iCisgICAgICAgICAgIGV4Y2x1ZGVzPSIqKi9DVlMvKioiPgorICAgICAgPGNsYXNzcGF0aCByZWZpZD0iamFzcGVyLmNsYXNzcGF0aCIgLz4KKyAgICA8L2phdmFjPgorCisgICAgPCEtLSBDb3B5IHN0YXRpYyByZXNvdXJjZSBmaWxlcyAtLT4KKyAgICA8Y29weSB0b2Rpcj0iJHtqYXNwZXIuY2xhc3Nlc30iPgorICAgICAgPGZpbGVzZXQgZGlyPSJzcmMvc2hhcmUiPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnByb3BlcnRpZXMiLz4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5kdGQiLz4KKyAgICAgIDwvZmlsZXNldD4KKyAgICA8L2NvcHk+CisKKyAgIDwhLS0gSmFzcGVyIENvbXBpbGVyIEpBUiBGaWxlIC0tPgorICAgPGphciAgamFyZmlsZT0iJHtqYXNwZXItY29tcGlsZXIuamFyfSI+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7amFzcGVyLmNsYXNzZXN9Ij4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvKioiIC8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvamFzcGVyL3htbHBhcnNlci8qKiIgLz4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9qYXNwZXIvc2VydmxldC8qKiIgLz4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9qYXNwZXIvdGFncGx1Z2lucy8qKiIgLz4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9qYXNwZXIvQ29uc3RhbnRzLmNsYXNzIiAvPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2phc3Blci9KYXNwZXJFeGNlcHRpb24uY2xhc3MiIC8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvamFzcGVyLyouY2xhc3MiIC8+CisgICAgICAgIDwhLS0gSmF2YWRvYyBhbmQgaTE4biBleGNsdXNpb25zIC0tPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi9wYWNrYWdlLmh0bWwiIC8+CisgICAgICAgIDxleGNsdWRlIG5hbWU9IioqL0xvY2FsU3RyaW5nc18qIiAvPgorICAgICAgPC9maWxlc2V0PgorICAgIDwvamFyPgorCisgICAgPCEtLSBKYXNwZXIgUnVudGltZSBKQVIgRmlsZSAtLT4KKyAgICA8amFyICBqYXJmaWxlPSIke2phc3Blci1ydW50aW1lLmphcn0iPgorICAgICAgPGZpbGVzZXQgZGlyPSIke2phc3Blci5jbGFzc2VzfSI+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvamFzcGVyL0NvbnN0YW50cy5jbGFzcyIgLz4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9qYXNwZXIvSmFzcGVyRXhjZXB0aW9uLmNsYXNzIiAvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9Mb2NhbGl6ZXIuY2xhc3MiIC8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvamFzcGVyL3Jlc291cmNlcy8qKiIgLz4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9qYXNwZXIvcnVudGltZS8qKiIgLz4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9qYXNwZXIvc2VjdXJpdHkvKioiIC8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvamFzcGVyL3V0aWwvKioiIC8+CisgICAgICAgIDwhLS0gSmF2YWRvYyBhbmQgaTE4biBleGNsdXNpb25zIC0tPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi9wYWNrYWdlLmh0bWwiIC8+CisgICAgICAgIDxleGNsdWRlIG5hbWU9IioqL0xvY2FsU3RyaW5nc18qIiAvPgorICAgICAgPC9maWxlc2V0PgorICAgIDwvamFyPgorCisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09IEJVSUxEOiBDcmVhdGUgSmFzcGVyIEphdmFkb2NzID09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJqYXZhZG9jIj4KKyAgICA8ZGVsZXRlIGRpcj0iJHtqYXNwZXIuYnVpbGR9L2phdmFkb2MiLz4KKyAgICA8bWtkaXIgZGlyPSIke2phc3Blci5idWlsZH0vamF2YWRvYyIvPgorICAgIDxqYXZhZG9jIHBhY2thZ2VuYW1lcz0ib3JnLmFwYWNoZS5qYXNwZXIuKiIKKyAgICAgY2xhc3NwYXRocmVmPSJqYXNwZXIuY2xhc3NwYXRoIgorICAgICBzb3VyY2VwYXRoPSJzcmMvc2hhcmUiCisgICAgIGRlc3RkaXI9IiR7amFzcGVyLmJ1aWxkfS9qYXZhZG9jIgorICAgICBhdXRob3I9InRydWUiCisgICAgIHZlcnNpb249InRydWUiCisgICAgIHdpbmRvd3RpdGxlPSJKYXNwZXIgSW50ZXJuYWwgQVBJIERvY3VtZW50YXRpb24iCisgICAgIGRvY3RpdGxlPSJKYXNwZXIgQVBJIgorICAgICBib3R0b209IkNvcHlyaWdodCAmIzE2OTsgMjAwMC0yMDA0IEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4iCisgICAgIGFkZGl0aW9uYWxwYXJhbT0iLWJyZWFraXRlcmF0b3IiCisgICAgLz4KKyAgPC90YXJnZXQ+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09IEJVSUxEOiBDbGVhbiBEaXJlY3RvcnkgPT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImJ1aWxkLWNsZWFuIj4KKyAgICA8ZGVsZXRlIGRpcj0iJHtqYXNwZXIuYnVpbGR9Ii8+CisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PSBCVUlMRDogUmVidWlsZCBFdmVyeXRoaW5nID09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJhbGwiIGRlcGVuZHM9ImJ1aWxkLWNsZWFuLGJ1aWxkLW1haW4iCisgICBkZXNjcmlwdGlvbj0iQ2xlYW4sIGJ1aWxkLCBhbmQgZGVwbG95IEphc3BlciBjb21wb25lbnQiLz4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09IEJVSUxEOiBDb21waWxlIFVuaXQgVGVzdHMgPT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iYnVpbGQtdGVzdHMiIGRlcGVuZHM9ImJ1aWxkLW1haW4iIGlmPSJqdW5pdC5wcmVzZW50Ij4KKyAgICA8bWtkaXIgICAgICBkaXI9IiR7amFzcGVyLmJ1aWxkfS90ZXN0cyIvPgorICAgIDwhLS0gQ29tcGlsZSB1bml0IHRlc3QgY2xhc3NlcyAtLT4KKzwhLS0KKyAgICA8amF2YWMgICBzcmNkaXI9InNyYy90ZXN0IiBkZXN0ZGlyPSIke2phc3Blci5idWlsZH0vdGVzdHMiCisgICAgICAgICAgICAgZGVwcmVjYXRpb249IiR7Y29tcGlsZS5kZXByZWNhdGlvbn0iCisgICAgICAgICAgICAgZGVidWc9IiR7Y29tcGlsZS5kZWJ1Z30iCisgICAgICAgICAgICAgc291cmNlPSIke2NvbXBpbGUuc291cmNlfSIKKyAgICAgICAgICAgICBvcHRpbWl6ZT0ib2ZmIgorICAgICAgICAgICAgIGV4Y2x1ZGVzPSIqKi9DVlMvKioiPgorICAgICAgPGNsYXNzcGF0aCByZWZpZD0idGVzdC5jbGFzc3BhdGgiLz4KKyAgICA8L2phdmFjPgorLS0+CisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PSBCVUlMRDogRXhlY3V0ZSBVbml0IFRlc3RzID09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJ0ZXN0IiBpZj0ianVuaXQucHJlc2VudCIKKyAgIGRlc2NyaXB0aW9uPSJSdW4gYWxsIHVuaXQgdGVzdCBjYXNlcyIKKyAgIGRlcGVuZHM9ImJ1aWxkLXRlc3RzIj4KKyAgPC90YXJnZXQ+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PT0gREVQTE9ZOiBDcmVhdGUgRGlyZWN0b3JpZXMgPT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImRlcGxveS1wcmVwYXJlIj4KKyAgICA8bWtkaXIgZGlyPSIke2phc3Blci5kZXBsb3l9Ii8+CisgICAgPG1rZGlyIGRpcj0iJHtqYXNwZXIuZGVwbG95fS9iaW4iLz4KKyAgICA8bWtkaXIgZGlyPSIke2phc3Blci5kZXBsb3l9L2NvbW1vbi9saWIiLz4KKyAgPC90YXJnZXQ+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PT0gREVQTE9ZOiBDb3B5IFN0YXRpYyBGaWxlcyA9PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImRlcGxveS1zdGF0aWMiIGRlcGVuZHM9ImJ1aWxkLW1haW4sZGVwbG95LXByZXBhcmUiPgorCisgICAgPCEtLSBFeGVjdXRhYmxlIENvbW1hbmRzIC0tPgorICAgIDxjb3B5IHRvZGlyPSIke2phc3Blci5kZXBsb3l9L2JpbiI+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7amFzcGVyLmJ1aWxkfS9iaW4iIC8+CisgICAgPC9jb3B5PgorICAgIDxmaXhjcmxmIHNyY2Rpcj0iJHtqYXNwZXIuZGVwbG95fS9iaW4iIGluY2x1ZGVzPSIqLnNoIiBlb2w9ImxmIi8+CisgICAgPGZpeGNybGYgc3JjZGlyPSIke2phc3Blci5kZXBsb3l9L2JpbiIgaW5jbHVkZXM9IiouYmF0IiBlb2w9ImNybGYiLz4KKyAgICA8Y2htb2QgcGVybT0iK3giIGZpbGU9IiR7amFzcGVyLmRlcGxveX0vYmluL2pzcGMuc2giLz4KKworICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PSBERVBMT1k6IENyZWF0ZSBKYXNwZXIgSkFScyA9PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iZGVwbG95IiBkZXBlbmRzPSJkZXBsb3ktc3RhdGljLGJ1aWxkLW1haW4iCisgICBkZXNjcmlwdGlvbj0iQnVpbGQgYW5kIGRlcGxveSBKYXNwZXIgY29tcG9uZW50Ij4KKyAgICA8ZWNobyBtZXNzYWdlPSJEZXBsb3kgdG8gJHtqYXNwZXIuZGVwbG95fS9jb21tb24vbGliIiAvPiAKKyAgICA8IS0tIEphc3BlciBDb21waWxlciBKQVIgRmlsZSAtLT4KKyAgICA8Y29weSBmaWxlPSIke2phc3Blci5idWlsZH0vc2hhcmVkL2xpYi9qYXNwZXItY29tcGlsZXIuamFyIgorICAgICAgICAgIHRvZmlsZT0iJHtqYXNwZXIuZGVwbG95fS9jb21tb24vbGliL2phc3Blci1jb21waWxlci5qYXIiIC8+CisKKyAgICA8Y29weSBmaWxlPSIke2phc3Blci5idWlsZH0vc2hhcmVkL2xpYi9qYXNwZXItcnVudGltZS5qYXIiCisgICAgICAgICAgdG9maWxlPSIke2phc3Blci5kZXBsb3l9L2NvbW1vbi9saWIvamFzcGVyLXJ1bnRpbWUuamFyIiAvPgorCisgICAgPCEtLSBDb3B5IEpBUnMgLS0+CisgICAgPGNvcHkgdG9kaXI9IiR7amFzcGVyLmRlcGxveX0vY29tbW9uL2xpYiIgZmlsZT0iJHtqYXNwZXItY29tcGlsZXItamR0Lmphcn0iLz4KKyAgICA8Y29weSB0b2Rpcj0iJHtqYXNwZXIuZGVwbG95fS9jb21tb24vbGliIiBmaWxlPSIke2pzcC1hcGkuamFyfSIvPgorICAgIDxjb3B5IHRvZGlyPSIke2phc3Blci5kZXBsb3l9L2NvbW1vbi9saWIiIGZpbGU9IiR7Y29tbW9ucy1lbC5qYXJ9Ii8+CisKKyAgPC90YXJnZXQ+CisKKworICA8IS0tID09PT09PT09PT09PT09PT0gRElTVDogQ3JlYXRlIERpc3RyaWJ1dGlvbiA9PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImRpc3QiIGRlcGVuZHM9ImJ1aWxkLW1haW4iCisgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIGJpbmFyeSBkaXN0cmlidXRpb24iPgorCisgICAgPCEtLSBFeGVjdXRhYmxlIGNvbW1hbmRzIC0tPgorICAgIDxta2RpciBkaXI9IiR7amFzcGVyLmRpc3R9L2JpbiIvPgorICAgIDxjb3B5IHRvZGlyPSIke2phc3Blci5kaXN0fS9iaW4iPgorICAgICAgPGZpbGVzZXQgZGlyPSIke2phc3Blci5idWlsZH0vYmluIiAvPgorICAgIDwvY29weT4KKyAgICA8Zml4Y3JsZiBzcmNkaXI9IiR7amFzcGVyLmRpc3R9L2JpbiIgaW5jbHVkZXM9Iiouc2giIGVvbD0ibGYiLz4KKyAgICA8Zml4Y3JsZiBzcmNkaXI9IiR7amFzcGVyLmRpc3R9L2JpbiIgaW5jbHVkZXM9IiouYmF0IiBlb2w9ImNybGYiLz4KKyAgICA8Y2htb2QgcGVybT0iK3giIGZpbGU9IiR7amFzcGVyLmRpc3R9L2Jpbi9qc3BjLnNoIi8+CisKKyAgICA8IS0tIEphc3BlciBDb21waWxlciBhbmQgUnVudGltZSBKQVIgRmlsZXMgLS0+CisgICAgPG1rZGlyIGRpcj0iJHtqYXNwZXIuZGlzdH0vc2hhcmVkL2xpYiIvPgorICAgIDxjb3B5IHRvZGlyPSIke2phc3Blci5kaXN0fS9zaGFyZWQvbGliIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHtqYXNwZXIuYnVpbGR9L3NoYXJlZC9saWIiLz4KKyAgICA8L2NvcHk+CisKKworICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09IERJU1Q6IENsZWFuIERpcmVjdG9yeSA9PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iZGlzdC1jbGVhbiI+CisgICAgPGRlbGV0ZSBkaXI9IiR7amFzcGVyLmRpc3R9Ii8+CisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09IENvbnZlbmllbnQgU3lub255bXMgPT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJjbGVhbiIgZGVwZW5kcz0iYnVpbGQtY2xlYW4sIGRpc3QtY2xlYW4iCisgICBkZXNjcmlwdGlvbj0iQ2xlYW4gYnVpbGQgYW5kIGRpc3QgZGlyZWN0b3JpZXMiLz4KKworCis8L3Byb2plY3Q+CisKZGlmZiAtLWdpdCBhL2phc3Blci9qYXNwZXIyL2RvYy9qc3BjLmh0bWwgYi9qYXNwZXIvamFzcGVyMi9kb2MvanNwYy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiOTBkOWMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXNwZXIvamFzcGVyMi9kb2MvanNwYy5odG1sCkBAIC0wLDAgKzEsMTM3IEBACis8aHRtbD4KKzxoZWFkPgorPHRpdGxlPiZsdDtqc3BjJmd0OzwvdGl0bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKzxIMT4gSnNwQyAtLSBBIENvbW1hbmQgTGluZSBKU1AgQ29tcGlsYXRpb24gVG9vbCA8L0gxPgorPEgzPiRJZCQ8L0gzPgorCis8SDI+T1ZFUlZJRVcgPC9IMj4KKworRXZlbiB0aG91Z2h0IHRoZSBwcmltYXJ5IGZvY3VzIG9mIEpTUCBpcyBhcyBhIGNvbnRhaW5lciBydW4gZW52aXJvbm1lbnQsCitzb21ldGltZXMgaXQgaXMgdXNlZnVsIHRvIGNyZWF0ZSBhIHB1cmUgc2VydmxldCBvdXQgb2YgdGhlIEpTUCBwYWdlLgorSnNwQyBlbmNhcHN1bGF0ZXMgdGhlIGNvcmUgSlNQIHRvIHNlcnZsZXQgdHJhbnNsYXRpb24gaW50byBhIHByb2dyYW0KK3RoYXQgaGFzIG5vIGRlcGVuZGVuY2llcyBvbiBhIGNvbnRhaW5pbmcgc2VydmxldCBlbmdpbmUgYW5kIGFsbG93cyB5b3UKK3RvIHRyYW5zbGF0ZSBKU1AgcGFnZXMgaW50byBhbiBlcXVpdmFsZW50IEphdmEgc2VydmxldC4KKworPEgyPkdFTkVSQUwgVVNFIDwvSDI+CisKK1RoZSBtb3N0IGJhc2ljIHVzZSBvZiBKc3BDIGlzIHRvIGNvbXBpbGUgYSBKU1AgcGFnZSBpbiBwbGFjZSB3aXRoIHRoZQoranNwIHBhZ2UocykgYXMgdGhlIGFyZ3VtZW50cy4gIFRoaXMgd2lsbCBjb21waWxlIHRoZSBwYWdlIHdpdGggdGhlCityZXN1bHRpbmcgamF2YSBmaWxlcyBwbGFjZWQgaW4gdGhlIGRpcmVjdG9yeSBKc3BDIHdhcyBjYWxsZWQgZnJvbS4gIFRoZQorcGFja2FnZSB3aWxsIGJlIGRldGVybWluZWQgZnJvbSB0aGUgZGlyZWN0b3JpZXMgdGhhdCB0aGUgSlNQIHBhZ2UgbGl2ZXMKK2luLiAgVGhpcyB3aWxsIGJlIHJlbGF0aXZlIHRvIHRoZSB3ZWItYXBwIGl0IGxpdmUgaW4gKGlmIGl0IGV4aXN0cyBvciBpcworc3BlY2lmaWVkKSBvciB0aGUgZGVmYXVsdCBwYWNrYWdlLiAgVGhlIGNsYXNzIG5hbWUgd2lsbCBiZSB0aGUgbmFtZSBvZgordGhlIEpTUCBwYWdlIHdpdGhvdXQgdGhlIGV4dGVuc2lvbi4KKworPFA+VG8gb3ZlcnJpZGUgdGhlc2UgZGVmYXVsdCB2YWx1ZXMgeW91IGNhbiB1c2UgdGhlIDx0dD4tYzwvdHQ+IGFuZCAKKzx0dD4tcDwvdHQ+IG9wdGlvbnMuICA8dHQ+LWMgJmx0O2NsYXNzIG5hbWUmZ3Q7PC90dD4gY2hhbmdlcyB0aGUgbmFtZSBvZiAKK3RoZSBjbGFzcyBvZiB0aGUgZmlyc3QgY29tcGlsZWQgSlNQIHBhZ2UgdG8gdGhlIGNsYXNzIHNwZWNpZmllZC4KK1N1YnNlcXVlbnQgSlNQIHBhZ2VzIHdpbGwgbm90IGJlIGFmZmVjdGVkIGJ5IHRoaXMgb3B0aW9uLiAgVGhlIAorPHR0Pi1wICZsdDtwYWNrYWdlIG5hbWUmZ3Q7PC90dD4gb3B0aW9uIHNldHMgdGhlIHBhY2thZ2UgbmFtZSBvZiBhbGwgSlNQIAorcGFnZXMgY29tcGlsZWQgYnkgdGhhdCBpbnZvY2F0aW9uLiAgV2ViLUFwcHMgc3BlY2lmaWVkIGZvciB0cmFuc2xhdGlvbiAKK3dpbGwgbm90IGJlIGFmZmVjdGVkIGJ5IGVpdGhlciBvZiB0aGVzZSBvcHRpb25zLjwvUD4KKworPFA+VGhlIGRpcmVjdG9yeSB0aGF0IHRoZSByZXN1bHRpbmcgamF2YSBmaWxlcyB3aWxsIGdvIGludG8gaXMgc3BlY2lmaWVkIGJ5Cit0aGUgPFRUPi1kICZsdDtkaXImZ3Q7PC9UVD4gYW5kIDx0dD4tZGQgJmx0O2RpciZndDs8L3R0PiBvcHRpb25zLiAgQm90aAorb2YgdGhlc2Ugc3BlY2lmeSBhIGRpcmVjdG9yeSB0aGF0IGZpbGVzIHdpbGwgYmUgd3JpdHRlbiBpbnRvLiAgV2hlbgordXNpbmcgPHR0Pi1kPC90dD4gdGhlIGphdmEgZmlsZXMgd2lsbCBiZSBwbGFjZWQgaW4gcGFja2FnZSBhcHByb3ByaWF0ZQorc3ViIGRpcmVjdG9yaWVzIHdoaWxlIHdpdGggPHR0Pi1kZDwvdHQ+IGFsbCBvZiB0aGUgamF2YSBmaWxlcyB3aWxsIGJlCitwbGFjZWQgbGl0ZXJhbGx5IGludG8gdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkgKHdpdGhvdXQgYW55IHN1YmRpcmVjdG9yeQorc3RydWN0dXJlKS48L1A+CisKKzxQPlRoZSBhbW91bnQgb2YgY29tbWFuZCBsaW5lIG91dHB1dCBjYW4gYmUgdGhyb3R0bGVkIGJ5IHRoZSA8dHQ+LXE8L3R0PiBhbmQgCit0aGUgPHR0Pi12Jmx0OyMmZ3Q7PC90dD4gb3B0aW9ucy4gIDx0dD4tcTwvdHQ+IGhhcyB0aGUgc2FtZSBlZmZlY3QgYXMKKzx0dD4tdjA8L3R0Piwgd2hpY2ggaXMgdG8gdHVybiBvZmYgYWxsIGJ1dCBmYXRhbCBlcnJvciBtZXNzYWdlcy4gIAorPHR0Pi12MTwvdHQ+IGJ1aWxkcyBvbiA8dHQ+LXYwPC90dD4gYW5kIGl0IHdpbGwgcHJpbnQgb3V0IGVycm9yIG1lc3NhZ2VzLCAKKzx0dD4tdjI8L3R0PiBhZGRzIHdhcm5pbmdzLCA8dHQ+LXYzPC90dD4gYWRkcyBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzCit0aGF0IGhhdmUgbm8gb3BlcmF0aW9uYWwgaW1wYWN0LCBhbmQgPHR0Pi12NDwvdHQ+IGFkZHMgdmFyaW91cyBtZXNzYWdlcwordXNlZCBpbiBkZWJ1Z2dpbmcgSnNwQyBpdHNlbGYuPC9QPgorCis8UD48dHQ+LWllcGx1Z2luPC90dD4gaXMgdXNlZCBieSB0aGUgPHR0PiZsdDtqc3A6cGx1Z2luJmd0OzwvdHQ+IHRhZ3MuCitJZiB0aGUgSmF2YSBQbHVnLWluIENPTSBDbGFzcy1JRCB5b3Ugd2FudCB0byB1c2UgY2hhbmdlcyB0aGVuIGl0IGNhbiBiZQorc3BlY2lmaWVkIGhlcmUuICBUaGlzIHNob3VsZCBub3QgbmVlZCB0byBiZSBhbHRlcmVkLjwvUD4KKworPFA+QXMgYW4gYWlkIHRvIG1ha2VmaWxlcywgdGhlIDx0dD4tZGllWyNdPC90dD4gb3B0aW9uIHdpbGwgY2F1c2UgdGhlCitKVk0gdG8gZXhpdCB3aXRoIGFuIGVycm9yIGNvZGUgaWYgYSBmYXRhbCBlcnJvciBvY2N1cnMgZHVyaW5nIHRoZQordHJhbnNsYXRpb24uICAgVGhpcyBjYW4gYmUgY2F1c2VkIGJ5IHN1Y2ggdGhpbmdzIGFzIGFuIGludmFsaWQgSlNQIAorb3IgYW4gdW53cml0YWJsZSBkZXN0aW5hdGlvbi4gIFRoZXJlIGlzIGFuIG9wdGlvbmFsIG51bWJlciB0aGF0IGNhbiBiZSAKK3NwZWNpZmllZCB0byBzcGVjaWZ5IHRoZSBzcGVjaWZpYyBleGl0IGNvZGUsIGJ1dCBpdCBkZWZhdWx0cyB0byAKKzx0dD4xPC90dD4gaWYgaXQgaXMgbm90IHNwZWNpZmllZCBvciBjYW5ub3QgYmUgZGVjaXBoZXJlZC48L1A+CisKKzxQPlRoZSA8dHQ+LW1hcHBlZDwvdHQ+IG9wdGlvbiB3aWxsIHNwbGl0IHRoZSBKU1AgdGV4dCBjb250ZW50IGludG8gYQorb25lIGxpbmUgcGVyIGNhbGwgZm9ybWF0LiAgVGhlcmUgYXJlIGNvbW1lbnRzIGFib3ZlIGFuZCBiZWxvdyB0aGUgbWFwcGVkCit3cml0ZSBjYWxscyB0byBsb2NhbGl6ZSB3aGVyZSBpbiB0aGUgSlNQIGZpbGUgZWFjaCBsaW5lIG9mIHRleHQgY29tZXMKK2Zyb20uICBUaGlzIGNhbiBsZWFkIHRvIGEgbWlub3IgcGVyZm9ybWFuY2UgZGVncmFkYXRpb24gKGJ1dCBpdCBpcyBib3VuZCAKK2J5IGEgbGluZWFyIGNvbXBsZXhpdHkpLiAgV2l0aG91dCB0aGlzIG9wdGlvbnMgYWxsIGFkamFjZW50IHdyaXRlcyBhcmUKK2NvbmNhdGVuYXRlZCBpbnRvIGEgc2luZ2xlIHdyaXRlLjwvUD4KKworPEgyPldFQi1BUFAgSU5URUdSQVRJT048L0gyPgorPFA+SnNwQyBpcyB3ZWItYXBwIGF3YXJlLiAgVGhlIHBhY2thZ2UgbmFtZXMgYW5kIGFsbCByZWxhdGl2ZSB1cmkKK3JlZmVyZW5jZXMgaW4gSlNQIGVsZW1lbnRzIGFyZSByb290ZWQgdG8gYSB3ZWItYXBwIGJhc2UgdGhhdCBpcyBlaXRoZXIKK2hldXJpc3RpY2FsbHkgZGV0ZXJtaW5lZCBvciBzcGVjaWZpZWQgYnkgdGhlIHVzZXIuPFA+CisKKzxQPjx0dD4tdXJpcm9vdCAmbHQ7ZGlyJmd0OzwvdHQ+IHNwZWNpZmllcyB0aGUgcm9vdCBvZiB0aGUgd2ViIAorYXBwbGljYXRpb24uICBUaGlzIGlzIHdoZXJlIGFsbCBhYnNvbHV0ZSB1cmlzIHdpbGwgYmUgcmVzb2x2ZWQgZnJvbS4gIAorSWYgaXQgaXMgbm90IHNwZWNpZmllZCB0aGVuIHRoZSBmaXJzdCBKU1AgcGFnZSB3aWxsIGJlIHVzZWQgdG8gZGVyaXZlIAoraXQuICBUbyBkZXJpdmUgaXQgZWFjaCBwYXJlbnQgZGlyZWN0b3J5IG9mIHRoZSBmaXJzdCBKU1AgcGFnZSBpcyAKK3NlYXJjaGVkIGZvciBhIDx0dD5XRUItSU5GPC90dD4gZGlyZWN0b3J5LCBhbmQgdGhlIGRpcmVjdG9yeSBjbG9zZXN0IHRvIAordGhlIEpTUCBwYWdlIHRoYXQgaGFzIG9uZSB3aWxsIGJlIHVzZWQuICBJZiBub25lIGNhbiBiZSBmb3VuZCB0aGVuIHRoZSAKK2RpcmVjdG9yeSBKc3BDIHdhcyBjYWxsZWQgZnJvbSB3aWxsIGJlIHVzZWQuICBUaGlzIG9ubHkgYWZmZWN0cyBwYWdlcyAKK3RyYW5zbGF0ZWQgZnJvbSBhbiBleHBsaWNpdGx5IGRlY2xhcmVkIEpTUCBmaWxlLjwvUD4KKworPFA+PHR0Pi11cmliYXNlICZsdDt1cmkmZ3Q7PC90dD4gaXMgdXNlZCB0byBlc3RhYmxpc2ggdGhlIHVyaSBjb250ZXh0IG9mCityZWxhdGl2ZSBVUkkgcmVmZXJlbmNlcyBpbiB0aGUgSlNQIHBhZ2VzLiAgSWYgaXQgZG9lcyBub3QgZXhpc3QgdGhlbiBpdAoraXMgZGVyaXZlZCBmcm9tIHRoZSBsb2NhdGlvbiBvZiB0aGUgZmlsZSByZWxhdGl2ZSB0byB0aGUgZGVjbGFyZWQgb3IgCitkZXJpdmVkIHZhbHVlIG9mIDx0dD4tdXJpcm9vdDwvdHQ+LiAgICBUaGlzIG9ubHkgYWZmZWN0cyBwYWdlcyAKK3RyYW5zbGF0ZWQgZnJvbSBhbiBleHBsaWNpdGx5IGRlY2xhcmVkIEpTUCBmaWxlLjwvUD4KKworPFA+IFRoZSBqc3AgZmlsZXMgb3B0aW9uIG9mIDx0dD4td2ViYXBwICZsdDtkaXImZ3Q7PC90dD4gaXMgdXNlZCB0bworc3BlY2lmeSB0aGF0IGFuIGVudGlyZSB3ZWItYXBwJ3MgSlNQIGZpbGVzIGFyZSB0byBiZSB0cmFuc2xhdGVkLiAgVGhlCit2YWx1ZSBvZiA8dHQ+LXVyaXJvb3Q8L3R0PiBmb3IgdGhhdCBkaXJlY3RvcnkgYmVjb21lcyB0aGUgc3BlY2lmaWVkCitkaXJlY3RvcnksIGFuZCBhbGwgcmVsYXRpdmUgdXJpcyBhcmUgcmVzb2x2ZWQgYWdhaW5zdCB0aGVpciBwb3NpdGlvbiBpbgordGhlIHdlYiBhcHAuICBDdXJyZW50bHkgc3BlY2lmeWluZyBhIHdhciwgamFyLCBvciB6aXAgZmlsZSBpcyBub3QKK3N1cHBvcnRlZC4gIEVhY2ggZGlyZWN0b3J5IGlzIHJlY3Vyc2l2ZWx5IHNlYXJjaGVkIGFuZCBhbnkgZmlsZSB3aXRoIGEgCis8dHQ+LmpzcDwvdHQ+IGV4dGVuc2lvbiBpcyBwYXJzZWQgYXMgdGhvdWdoIGl0IGlzIGEgSlNQIHBhZ2UuICBUaGVzZQorcGFnZXMgb2JleSB0aGUgPHR0Pi1kPC90dD4sIDx0dD4tZGQ8L3R0PiwgYW5kIDx0dD4tcDwvdHQ+IG9wdGlvbnMuCisKKzxQPkFwcHJvcHJpYXRlIGVudHJpZXMgZm9yIHRoZSA8dHQ+d2ViLnhtbDwvdHQ+IGZpbGUgY2FuIGJlIGNyZWF0ZWQgdmlhCit0aGUgPHR0Pi13ZWJpbmMgJmx0O2ZpbGUmZ3Q7PC90dD4gYW5kIDx0dD4td2VieG1sICZsdDtmaWxlJmd0OzwvdHQ+CitvcHRpb25zLiAgQWxsIEpTUCBmaWxlcyBhbmQgd2ViLWFwcHMgcGFyc2VkIGJ5IHRoZSBzaW5nbGUgaW52b2NhdGlvbgord2lsbCBoYXZlIGFwcHJvcHJpYXRlIDx0dD5zZXJ2bGV0PC90dD4gYW5kIDx0dD5zZXJ2bGV0LW1hcHBpbmc8L3R0PiAKK2VsZW1lbnRzIGNyZWF0ZWQgZm9yIHRoZW0uICBUaGUgPHR0PndlYmluYzwvdHQ+IGNyZWF0ZXMgb25seSBhbiBYTUwKK2ZyYWdtZW50IHN1aXRhYmxlIGZvciBpbmNsdXNpb24gaW50byBhbiBleGlzdGluZyA8dHQ+d2ViLnhtbDwvdHQ+IGZpbGUsCit3aGlsZSB0aGUgPHR0PndlYnhtbDwvdHQ+IG9wdGlvbiBjcmVhdGVzIGFuIGVudGlyZSBmaWxlIHdpdGggdGhlIAorYXBwcm9wcmlhdGUgaGVhZGVycyBhbmQgcm9vdCBlbGVtZW50cyBzdWl0YWJsZSBmb3IgdXNlIGFzIGEgCis8dHQ+d2ViLnhtbDwvdHQ+IGZpbGUuPC9QPgorCis8SDI+Q09NTUFORCBMSU5FIFNVTU1BUlk8L0gyPgorPHByZT4KK1VzYWdlOiBqc3BjICZsdDtvcHRpb25zJmd0OyBbLS1dICZsdDtqc3AgZmlsZXMmZ3Q7Cit3aGVyZSBqc3AgZmlsZXMgaXMgYW55IG51bWJlciBvZjoKKyAgICAmbHQ7ZmlsZSZndDsgICAgICAgICBBIGZpbGUgdG8gYmUgcGFyc2VkIGFzIGEganNwIHBhZ2UKKyAgICAtd2ViYXBwICZsdDtkaXImZ3Q7ICBBIGRpcmVjdG9yeSBjb250YWluaW5nIGEgd2ViLWFwcCwgYWxsIGpzcCBwYWdlcworICAgICAgICAgICAgICAgICAgIHdpbGwgcmVjdXJzaXZlbHkgYmUgcGFyc2VkCit3aGVyZSBvcHRpb25zIGluY2x1ZGU6CisgICAgLXEgICAgICAgICAgUXVpdGUgbW9kZSAoc2FtZSBhcyAtdjApCisgICAgLXZbI10gICAgICAgVmVyYm9zZSBtb2RlIChvcHRpb25hbCBudW1iZXIgaXMgbGV2ZWwsIGRlZmF1bHQgaXMgMikKKyAgICAtZCAmbHQ7ZGlyJmd0OyAgICBPdXRwdXQgRGlyZWN0b3J5CisgICAgLWRkICZsdDtkaXImZ3Q7ICAgTGl0ZXJhbCBPdXRwdXQgRGlyZWN0b3J5LiAgKHBhY2thZ2UgZGlycyB3aWxsIG5vdCBiZSBtYWRlKQorICAgIC1wICZsdDtuYW1lJmd0OyAgICAgICAgIE5hbWUgb2YgdGFyZ2V0IHBhY2thZ2UKKyAgICAtYyAmbHQ7bmFtZSZndDsgICAgICAgICBOYW1lIG9mIHRhcmdldCBjbGFzcyBuYW1lCisgICAgICAgICAgICAgICAgKG9ubHkgYXBwbGllcyB0byBmaXJzdCBKU1AgcGFnZSkKKyAgICAtbWFwcGVkICAgICBHZW5lcmF0ZSBzZXBhcmF0ZSB3cml0ZSgpIGNhbGxzIGZvciBlYWNoIEhUTUwgbGluZSBpbiB0aGUgSlNQCisgICAgLWRpZVsjXSAgICAgR2VuZXJhdGUgYW4gZXJyb3IgcmV0dXJuIGNvZGUgKCMpIG9uIGZhdGFsIGVycm9ycy4KKyAgICAgICAgICAgICAgICBJZiB0aGUgbnVtYmVyIGlzIGFic2VudCBvciB1bnBhcnNhYmxlIGl0IGRlZmF1bHRzIHRvIDEuCisgICAgLXVyaWJhc2UgJmx0O2RpciZndDsgIFRoZSB1cmkgZGlyZWN0b3J5IGNvbXBpbGF0aW9ucyBzaG91bGQgYmUgcmVsYXRpdmUgdG8KKyAgICAgICAgICAgICAgICAgICAgKERlZmF1bHQgaXMgIi8iKQorICAgIC11cmlyb290ICZsdDtkaXImZ3Q7ICBUaGUgcm9vdCBkaXJlY3RvcnkgdGhhdCB1cmkgZmlsZXMgc2hvdWxkIGJlIHJlc29sdmVkCisgICAgICAgICAgICAgICAgICAgIGFnYWluc3QsIChEZWZhdWx0IGlzIHRoZSBkaXJlY3RvcnkganNwYyBpcyBpbnZva2VkIGZyb20pCisgICAgLXdlYmluYyAmbHQ7ZmlsZSZndDsgIENyZWF0ZXMgcGFydGlhbCBzZXJ2bGV0IG1hcHBpbmdzIGZvciB0aGUgLXdlYmFwcCBvcHRpb24KKyAgICAtd2VieG1sICZsdDtmaWxlJmd0OyAgQ3JlYXRlcyBhIGNvbXBsZXRlIHdlYi54bWwgd2hlbiB1c2luZyB0aGUgLXdlYmFwcCBvcHRpb24uCisgICAgLWllcGx1Z2luICZsdDtjbHNpZCZndDsgIEphdmEgUGx1Z2luIGNsYXNzaWQgZm9yIEludGVybmV0IEV4cGxvcmVyCisgICAgLXNheDIgJmx0O2RyaXZlcmNsYXNzbmFtZSZndDsgRHJpdmVyIGNsYXNzIG5hbWUgZm9yIHRoZSBTQVggMi4wIHBhcnNlciB0byBiZSB1c2VkCis8L3ByZT4KKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvamFzcGVyL2phc3BlcjIvc3JjL2Jpbi9qYXNwZXIuYmF0IGIvamFzcGVyL2phc3BlcjIvc3JjL2Jpbi9qYXNwZXIuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmZkODdlNWYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXNwZXIvamFzcGVyMi9zcmMvYmluL2phc3Blci5iYXQKQEAgLTAsMCArMSw3MSBAQAorQGVjaG8gb2ZmCitpZiAiJU9TJSIgPT0gIldpbmRvd3NfTlQiIHNldGxvY2FsCityZW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCityZW0gU2NyaXB0IGZvciBKYXNwZXIgY29tcGlsZXIKK3JlbQorcmVtIEVudmlyb25tZW50IFZhcmlhYmxlIFByZXF1aXNpdGVzCityZW0KK3JlbSAgIEpBU1BFUl9IT01FICAgTWF5IHBvaW50IGF0IHlvdXIgQ2F0YWxpbmEgImJ1aWxkIiBkaXJlY3RvcnkuCityZW0KK3JlbSAgIEpBU1BFUl9PUFRTICAgKE9wdGlvbmFsKSBKYXZhIHJ1bnRpbWUgb3B0aW9ucyB1c2VkIHdoZW4gdGhlICJzdGFydCIsCityZW0gICAgICAgICAgICAgICAgICJzdG9wIiwgb3IgInJ1biIgY29tbWFuZCBpcyBleGVjdXRlZC4KK3JlbQorcmVtICAgSkFWQV9IT01FICAgICBNdXN0IHBvaW50IGF0IHlvdXIgSmF2YSBEZXZlbG9wbWVudCBLaXQgaW5zdGFsbGF0aW9uLgorcmVtCityZW0gICBKQVZBX09QVFMgICAgIChPcHRpb25hbCkgSmF2YSBydW50aW1lIG9wdGlvbnMgdXNlZCB3aGVuIHRoZSAic3RhcnQiLAorcmVtICAgICAgICAgICAgICAgICAic3RvcCIsIG9yICJydW4iIGNvbW1hbmQgaXMgZXhlY3V0ZWQuCityZW0KK3JlbSAkSWQkCityZW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3JlbSBHdWVzcyBKQVNQRVJfSE9NRSBpZiBub3QgZGVmaW5lZAoraWYgbm90ICIlSkFTUEVSX0hPTUUlIiA9PSAiIiBnb3RvIGdvdEhvbWUKK3NldCBKQVNQRVJfSE9NRT0uCitpZiBleGlzdCAiJUpBU1BFUl9IT01FJVxiaW5camFzcGVyLmJhdCIgZ290byBva0hvbWUKK3NldCBKQVNQRVJfSE9NRT0uLgorOmdvdEhvbWUKK2lmIGV4aXN0ICIlSkFTUEVSX0hPTUUlXGJpblxqYXNwZXIuYmF0IiBnb3RvIG9rSG9tZQorZWNobyBUaGUgSkFTUEVSX0hPTUUgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbm90IGRlZmluZWQgY29ycmVjdGx5CitlY2hvIFRoaXMgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbmVlZGVkIHRvIHJ1biB0aGlzIHByb2dyYW0KK2dvdG8gZW5kCis6b2tIb21lCisKK3JlbSBHZXQgc3RhbmRhcmQgZW52aXJvbm1lbnQgdmFyaWFibGVzCitpZiBleGlzdCAiJUpBU1BFUl9IT01FJVxiaW5cc2V0ZW52LmJhdCIgY2FsbCAiJUpBU1BFUl9IT01FJVxiaW5cc2V0ZW52LmJhdCIKKworcmVtIEdldCBzdGFuZGFyZCBKYXZhIGVudmlyb25tZW50IHZhcmlhYmxlcworaWYgZXhpc3QgIiVKQVNQRVJfSE9NRSVcYmluXHNldGNsYXNzcGF0aC5iYXQiIGdvdG8gb2tTZXRjbGFzc3BhdGgKK2VjaG8gQ2Fubm90IGZpbmQgJUpBU1BFUl9IT01FJVxiaW5cc2V0Y2xhc3NwYXRoLmJhdAorZWNobyBUaGlzIGZpbGUgaXMgbmVlZGVkIHRvIHJ1biB0aGlzIHByb2dyYW0KK2dvdG8gZW5kCis6b2tTZXRjbGFzc3BhdGgKK3NldCBCQVNFRElSPSVKQVNQRVJfSE9NRSUKK2NhbGwgIiVKQVNQRVJfSE9NRSVcYmluXHNldGNsYXNzcGF0aC5iYXQiCisKK3JlbSBBZGQgb24gZXh0cmEgamFyIGZpbGVzIHRvIENMQVNTUEFUSAorZm9yICUlaSBpbiAoIiVKQVNQRVJfSE9NRSVcY29tbW9uXGVuZG9yc2VkXCouamFyIikgZG8gY2FsbCAiJUpBU1BFUl9IT01FJVxiaW5cY3BhcHBlbmQuYmF0IiAlJWkKK2ZvciAlJWkgaW4gKCIlSkFTUEVSX0hPTUUlXGNvbW1vblxsaWJcKi5qYXIiKSBkbyBjYWxsICIlSkFTUEVSX0hPTUUlXGJpblxjcGFwcGVuZC5iYXQiICUlaQorZm9yICUlaSBpbiAoIiVKQVNQRVJfSE9NRSVcc2hhcmVkXGxpYlwqLmphciIpIGRvIGNhbGwgIiVKQVNQRVJfSE9NRSVcYmluXGNwYXBwZW5kLmJhdCIgJSVpCitzZXQgQ0xBU1NQQVRIPSVDTEFTU1BBVEglOyVKQVNQRVJfSE9NRSVcc2hhcmVkXGNsYXNzZXMKKworcmVtIFBhcnNlIGFyZ3VtZW50cworaWYgIiIlMSIiID09ICIianNwYyIiIGdvdG8gZG9Kc3BjCitlY2hvIFVzYWdlOiBqYXNwZXIgKCBqc3BjICkKK2VjaG8gQ29tbWFuZHM6CitlY2hvICAganNwYyAtIFJ1biB0aGUgb2ZmbGluZSBKU1AgY29tcGlsZXIKK2dvdG8gZW5kCis6ZG9Kc3BjCitzaGlmdAorCityZW0gR2V0IHJlbWFpbmluZyB1bnNoaWZ0ZWQgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBhbmQgc2F2ZSB0aGVtIGluIHRoZQorc2V0IENNRF9MSU5FX0FSR1M9Cis6c2V0QXJncworaWYgIiIlMSIiPT0iIiIiIGdvdG8gZG9uZVNldEFyZ3MKK3NldCBDTURfTElORV9BUkdTPSVDTURfTElORV9BUkdTJSAlMQorc2hpZnQKK2dvdG8gc2V0QXJncworOmRvbmVTZXRBcmdzCisKKyVfUlVOSkFWQSUgJUpBVkFfT1BUUyUgJUpBU1BFUl9PUFRTJSAtRGphdmEuZW5kb3JzZWQuZGlycz0iJUpBVkFfRU5ET1JTRURfRElSUyUiIC1jbGFzc3BhdGggIiVDTEFTU1BBVEglIiAtRGphc3Blci5ob21lPSIlSkFTUEVSX0hPTUUlIiBvcmcuYXBhY2hlLmphc3Blci5Kc3BDICVDTURfTElORV9BUkdTJQorCis6ZW5kCmRpZmYgLS1naXQgYS9qYXNwZXIvamFzcGVyMi9zcmMvYmluL2phc3Blci5zaCBiL2phc3Blci9qYXNwZXIyL3NyYy9iaW4vamFzcGVyLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlYmQ5YTYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXNwZXIvamFzcGVyMi9zcmMvYmluL2phc3Blci5zaApAQCAtMCwwICsxLDExMSBAQAorIyEvYmluL3NoCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFNjcmlwdCBmb3IgSmFzcGVyIGNvbXBpbGVyCisjCisjIEVudmlyb25tZW50IFZhcmlhYmxlIFByZXF1aXNpdGVzCisjCisjICAgSkFTUEVSX0hPTUUgICBNYXkgcG9pbnQgYXQgeW91ciBDYXRhbGluYSAiYnVpbGQiIGRpcmVjdG9yeS4KKyMKKyMgICBKQVNQRVJfT1BUUyAgIChPcHRpb25hbCkgSmF2YSBydW50aW1lIG9wdGlvbnMgdXNlZCB3aGVuIHRoZSAic3RhcnQiLAorIyAgICAgICAgICAgICAgICAgInN0b3AiLCBvciAicnVuIiBjb21tYW5kIGlzIGV4ZWN1dGVkLgorIworIyAgIEpBVkFfSE9NRSAgICAgTXVzdCBwb2ludCBhdCB5b3VyIEphdmEgRGV2ZWxvcG1lbnQgS2l0IGluc3RhbGxhdGlvbi4KKyMKKyMgICBKQVZBX09QVFMgICAgIChPcHRpb25hbCkgSmF2YSBydW50aW1lIG9wdGlvbnMgdXNlZCB3aGVuIHRoZSAic3RhcnQiLAorIyAgICAgICAgICAgICAgICAgInN0b3AiLCBvciAicnVuIiBjb21tYW5kIGlzIGV4ZWN1dGVkLgorIworIyAkSWQkCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgT1Mgc3BlY2lmaWMgc3VwcG9ydC4gICR2YXIgX211c3RfIGJlIHNldCB0byBlaXRoZXIgdHJ1ZSBvciBmYWxzZS4KK2N5Z3dpbj1mYWxzZQorb3M0MDA9ZmFsc2UKK2Nhc2UgImB1bmFtZWAiIGluCitDWUdXSU4qKSBjeWd3aW49dHJ1ZTs7CitPUzQwMCopIG9zNDAwPXRydWU7OworZXNhYworCisjIHJlc29sdmUgbGlua3MgLSAkMCBtYXkgYmUgYSBzb2Z0bGluaworUFJHPSIkMCIKKword2hpbGUgWyAtaCAiJFBSRyIgXTsgZG8KKyAgbHM9YGxzIC1sZCAiJFBSRyJgCisgIGxpbms9YGV4cHIgIiRscyIgOiAnLiotPiBcKC4qXCkkJ2AKKyAgaWYgZXhwciAiJGxpbmsiIDogJy4qLy4qJyA+IC9kZXYvbnVsbDsgdGhlbgorICAgIFBSRz0iJGxpbmsiCisgIGVsc2UKKyAgICBQUkc9YGRpcm5hbWUgIiRQUkciYC8iJGxpbmsiCisgIGZpCitkb25lCisKKyMgR2V0IHN0YW5kYXJkIGVudmlyb25tZW50IHZhcmlhYmxlcworUFJHRElSPWBkaXJuYW1lICIkUFJHImAKK0pBU1BFUl9IT01FPWBjZCAiJFBSR0RJUi8uLiIgOyBwd2RgCitpZiBbIC1yICIkSkFTUEVSX0hPTUUiL2Jpbi9zZXRlbnYuc2ggXTsgdGhlbgorICAuICIkSkFTUEVSX0hPTUUiL2Jpbi9zZXRlbnYuc2gKK2ZpCisKKyMgRm9yIEN5Z3dpbiwgZW5zdXJlIHBhdGhzIGFyZSBpbiBVTklYIGZvcm1hdCBiZWZvcmUgYW55dGhpbmcgaXMgdG91Y2hlZAoraWYgJGN5Z3dpbjsgdGhlbgorICBbIC1uICIkSkFWQV9IT01FIiBdICYmIEpBVkFfSE9NRT1gY3lncGF0aCAtLXVuaXggIiRKQVZBX0hPTUUiYAorICBbIC1uICIkSkFTUEVSX0hPTUUiIF0gJiYgSkFTUEVSX0hPTUU9YGN5Z3BhdGggLS11bml4ICIkSkFTUEVSX0hPTUUiYAorICBbIC1uICIkQ0xBU1NQQVRIIiBdICYmIENMQVNTUEFUSD1gY3lncGF0aCAtLXBhdGggLS11bml4ICIkQ0xBU1NQQVRIImAKK2ZpCisKKyMgR2V0IHN0YW5kYXJkIEphdmEgZW52aXJvbm1lbnQgdmFyaWFibGVzCitpZiBbIC1yICIkSkFTUEVSX0hPTUUiL2Jpbi9zZXRjbGFzc3BhdGguc2ggXTsgdGhlbgorICBCQVNFRElSPSIkSkFTUEVSX0hPTUUiCisgIC4gIiRKQVNQRVJfSE9NRSIvYmluL3NldGNsYXNzcGF0aC5zaAorZWxzZQorICBlY2hvICJDYW5ub3QgZmluZCAkSkFTUEVSX0hPTUUvYmluL3NldGNsYXNzcGF0aC5zaCIKKyAgZWNobyAiVGhpcyBmaWxlIGlzIG5lZWRlZCB0byBydW4gdGhpcyBwcm9ncmFtIgorICBleGl0IDEKK2ZpCisKKyMgQWRkIG9uIGV4dHJhIGphciBmaWxlcyB0byBDTEFTU1BBVEgKK2ZvciBpIGluICIkSkFTUEVSX0hPTUUiL2NvbW1vbi9lbmRvcnNlZC8qLmphcjsgZG8KKyAgQ0xBU1NQQVRIPSIkQ0xBU1NQQVRIIjoiJGkiCitkb25lCitmb3IgaSBpbiAiJEpBU1BFUl9IT01FIi9jb21tb24vbGliLyouamFyOyBkbworICBDTEFTU1BBVEg9IiRDTEFTU1BBVEgiOiIkaSIKK2RvbmUKK2ZvciBpIGluICIkSkFTUEVSX0hPTUUiL3NoYXJlZC9saWIvKi5qYXI7IGRvCisgIENMQVNTUEFUSD0iJENMQVNTUEFUSCI6IiRpIgorZG9uZQorQ0xBU1NQQVRIPSIkQ0xBU1NQQVRIIjoiJEpBU1BFUl9IT01FIi9zaGFyZWQvY2xhc3NlcworCisjIEZvciBDeWd3aW4sIHN3aXRjaCBwYXRocyB0byBXaW5kb3dzIGZvcm1hdCBiZWZvcmUgcnVubmluZyBqYXZhCitpZiAkY3lnd2luOyB0aGVuCisgIEpBVkFfSE9NRT1gY3lncGF0aCAtLXBhdGggLS13aW5kb3dzICIkSkFWQV9IT01FImAKKyAgSkFTUEVSX0hPTUU9YGN5Z3BhdGggLS1wYXRoIC0td2luZG93cyAiJEpBU1BFUl9IT01FImAKKyAgQ0xBU1NQQVRIPWBjeWdwYXRoIC0tcGF0aCAtLXdpbmRvd3MgIiRDTEFTU1BBVEgiYAorZmkKKworIyAtLS0tLSBFeGVjdXRlIFRoZSBSZXF1ZXN0ZWQgQ29tbWFuZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpZiBbICIkMSIgPSAianNwYyIgXSA7IHRoZW4KKworICBzaGlmdAorICBleGVjICIkX1JVTkpBVkEiICRKQVZBX09QVFMgJEpBU1BFUl9PUFRTIFwKKyAgICAtRGphdmEuZW5kb3JzZWQuZGlycz0iJEpBVkFfRU5ET1JTRURfRElSUyIgLWNsYXNzcGF0aCAiJENMQVNTUEFUSCIgXAorICAgIC1EamFzcGVyLmhvbWU9IiRKQVNQRVJfSE9NRSIgXAorICAgIC1EY2F0YWxpbmEuaG9tZT0iJEpBU1BFUl9IT01FIiBcCisgICAgb3JnLmFwYWNoZS5qYXNwZXIuSnNwQyAiJEAiCisKK2VsaWYgWyAiJDEiID0gImRlYnVnIiBdIDsgdGhlbgorCisgIHNoaWZ0CisgIGV4ZWMgIiRfUlVOSkRCIiAkSkFWQV9PUFRTICRKQVNQRVJfT1BUUyBcCisgICAgLURqYXZhLmVuZG9yc2VkLmRpcnM9IiRKQVZBX0VORE9SU0VEX0RJUlMiIC1jbGFzc3BhdGggIiRDTEFTU1BBVEgiIFwKKyAgICAtRGphc3Blci5ob21lPSIkSkFTUEVSX0hPTUUiIFwKKyAgICAtRGNhdGFsaW5hLmhvbWU9IiRKQVNQRVJfSE9NRSIgXAorICAgIG9yZy5hcGFjaGUuamFzcGVyLkpzcEMgIiRAIgorCitlbHNlCisKKyAgZWNobyAiVXNhZ2U6IGphc3Blci5zaCAoIGpzcGMgKSIKKyAgZWNobyAiQ29tbWFuZHM6IgorICBlY2hvICIgIGpzcGMgLSBSdW4gdGhlIG9mZmxpbmUgSlNQIGNvbXBpbGVyIgorICBleGl0IDEKKworZmkKZGlmZiAtLWdpdCBhL2phc3Blci9qYXNwZXIyL3NyYy9iaW4vamFzcGVyLnhtbCBiL2phc3Blci9qYXNwZXIyL3NyYy9iaW4vamFzcGVyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmMxMTUwCi0tLSAvZGV2L251bGwKKysrIGIvamFzcGVyL2phc3BlcjIvc3JjL2Jpbi9qYXNwZXIueG1sCkBAIC0wLDAgKzEsOTcgQEAKKzwhLS0KKworICBYTUwgZmlsZSBmb3IgbGF1bmNoaW5nIEphc3BlciBhcHBsaWNhdGlvbnMgdXNpbmcgdGhlIExhdW5jaGVyLgorCisgIFRvIHJ1biBhbnkgb2YgdGhlIGFwcGxpY2F0aW9ucyBpbiB0aGUgSkRCIGRlYnVnZ2VyLCBleGVjdXRlIHRoZSBMYXVuY2hlciB3aXRoCisgIGEgIi1EZGVidWc9dHJ1ZSIgYXJndW1lbnQuCisKKyAgVG8gcnVuIGFueSBvZiB0aGUgYXBwbGljYXRpb25zIGluIEpQREEgbW9kZSwgZXhlY3V0ZSB0aGUgTGF1bmNoZXIgd2l0aCBhCisgICItRGpwZGE9dHJ1ZSIgYXJndW1lbnQuCisKKy0tPgorCis8cHJvamVjdCBuYW1lPSJKYXNwZXIgTGF1bmNoZXIiIGRlZmF1bHQ9ImpzcGMiIGJhc2VkaXI9Ii4iPgorCisgIDwhLS0gU2V0IHRoZSBhcHBsaWNhdGlvbiBob21lIHRvIHRoZSBwYXJlbnQgZGlyZWN0b3J5IG9mIHRoaXMgZGlyZWN0b3J5IC0tPgorICA8cHJvcGVydHkgbmFtZT0iamFzcGVyLmhvbWUiIGxvY2F0aW9uPSIke2Jhc2VkaXJ9Ly4uIi8+CisKKyAgPCEtLSBJbXBvcnQgdGhlIHVzZXIncyBjdXN0b20gcHJvcGVydGllcyAtLT4KKyAgPHByb3BlcnR5IGZpbGU9IiR7amFzcGVyLmhvbWV9L2Jpbi9qYXNwZXIucHJvcGVydGllcyIvPgorCisgIDwhLS0gU2V0IHVzZXIgY29uZmlndXJhYmxlIHByb3BlcnRpZXMgLS0+CisgIDxwcm9wZXJ0eSBuYW1lPSJqYXNwZXIuanZtLmFyZ3MiIHZhbHVlPSIiLz4KKyAgPHByb3BlcnR5IG5hbWU9Imphc3Blci5zb3VyY2UucGF0aCIgdmFsdWU9IiR7amFzcGVyLmhvbWV9Ly4uLy4uL2pha2FydGEtc2VydmxldGFwaS01L3NyYy9zaGFyZToke2phc3Blci5ob21lfS8uLi8uLi9qYWthcnRhLXRvbWNhdC1qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUiLz4KKworICA8IS0tIEJ1aWxkIHRoZSBjbGFzc3BhdGggcmVsYXRpdmUgdG8gdGhlIGFwcGxpY2F0aW9uIGhvbWUgLS0+CisgIDxwYXRoIGlkPSJiYXNlLmNsYXNzLnBhdGgiPgorICAgIDxmaWxlc2V0IGRpcj0iJHtqYXNwZXIuaG9tZX0vY29tbW9uL2xpYiIgaW5jbHVkZXM9IiouamFyIi8+CisgICAgPGZpbGVzZXQgZGlyPSIke2phc3Blci5ob21lfS9jb21tb24vZW5kb3JzZWQiIGluY2x1ZGVzPSIqLmphciIvPgorICAgIDxmaWxlc2V0IGRpcj0iJHtqYXNwZXIuaG9tZX0vc2hhcmVkL2xpYiIgaW5jbHVkZXM9IiouamFyIi8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2phc3Blci5ob21lfS9zaGFyZWQvY2xhc3NlcyIvPgorICA8L3BhdGg+CisKKyAgPCEtLSBCdWlsZCB0aGUgc3lzcHJvcGVydGllcyByZWxhdGl2ZSB0byB0aGUgYXBwbGljYXRpb24gaG9tZSAtLT4KKyAgPHN5c3Byb3BlcnR5c2V0IGlkPSJiYXNlLnN5cy5wcm9wZXJ0aWVzIj4KKyAgICA8c3lzcHJvcGVydHkga2V5PSJqYXZhLmVuZG9yc2VkLmRpcnMiIGZpbGU9IiR7amFzcGVyLmhvbWV9L2NvbW1vbi9lbmRvcnNlZCIvPgorICAgIDxzeXNwcm9wZXJ0eSBrZXk9Imphc3Blci5ob21lIiBmaWxlPSIke2phc3Blci5ob21lfSIvPgorICA8L3N5c3Byb3BlcnR5c2V0PgorCisgIDwhLS0gQnVpbGQgdGhlIHN0YW5kYXJkIGp2bWFyZ3MgLS0+CisgIDxqdm1hcmdzZXQgaWQ9ImJhc2UuanZtLmFyZ3MiPgorICAgIDxqdm1hcmcgbGluZT0iJHtqYXNwZXIuanZtLmFyZ3N9Ii8+CisgICAgPGp2bWFyZyB2YWx1ZT0iLVhkZWJ1ZyIgaWY9ImpwZGEuc2V0dGluZ3MiLz4KKyAgICA8anZtYXJnIHZhbHVlPSItWHJ1bmpkd3A6JHtqcGRhLnNldHRpbmdzfSIgaWY9ImpwZGEuc2V0dGluZ3MiLz4KKyAgICA8anZtYXJnIHZhbHVlPSItc291cmNlcGF0aCIgaWY9ImpkYiIvPgorICAgIDxqdm1hcmcgcGF0aD0iJHtqYXNwZXIuc291cmNlLnBhdGh9IiBpZj0iamRiIi8+CisgIDwvanZtYXJnc2V0PgorCisgIDwhLS0gVGFyZ2V0IHRoYXQgc2V0cyBKREIgcHJvcGVydGllcyB3aGVuIHRoZSAiZGVidWciIHByb3BlcnR5IGlzIHNldCAtLT4KKyAgPHRhcmdldCBuYW1lPSJzZXRqZGIiIGRlc2NyaXB0aW9uPSJTZXQgSkRCIHByb3BlcnRpZXMiIGlmPSJkZWJ1ZyI+CisKKyAgICA8cHJvcGVydHkgbmFtZT0iamRiIiB2YWx1ZT0idHJ1ZSIvPgorCisgIDwvdGFyZ2V0PgorCisgIDwhLS0gVGFyZ2V0IHRoYXQgc2V0cyBKUERBIHByb3BlcnRpZXMgd2hlbiB0aGUgImpwZGEiIHByb3BlcnR5IGlzIHNldCAtLT4KKyAgPHRhcmdldCBuYW1lPSJzZXRqcGRhIiBkZXNjcmlwdGlvbj0iU2V0IEpQREEgcHJvcGVydGllcyIgaWY9ImpwZGEiPgorCisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0ianBkYS50cmFuc3BvcnQiIHZhbHVlPSJkdF9zaG1lbSI+CisgICAgICA8b3MgZmFtaWx5PSJ3aW5kb3dzIi8+CisgICAgPC9jb25kaXRpb24+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0ianBkYS50cmFuc3BvcnQiIHZhbHVlPSJkdF9zb2NrZXQiPgorICAgICAgPG5vdD4KKyAgICAgICAgPG9zIGZhbWlseT0id2luZG93cyIvPgorICAgICAgPC9ub3Q+CisgICAgPC9jb25kaXRpb24+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0ianBkYS5hZGRyZXNzIiB2YWx1ZT0iamRiY29ubiI+CisgICAgICA8ZXF1YWxzIGFyZzE9IiR7anBkYS50cmFuc3BvcnR9IiBhcmcyPSJkdF9zaG1lbSIvPgorICAgIDwvY29uZGl0aW9uPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9ImpwZGEuYWRkcmVzcyIgdmFsdWU9IjgwMDAiPgorICAgICAgPG5vdD4KKyAgICAgICAgPGVxdWFscyBhcmcxPSIke2pwZGEudHJhbnNwb3J0fSIgYXJnMj0iZHRfc2htZW0iLz4KKyAgICAgIDwvbm90PgorICAgIDwvY29uZGl0aW9uPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJqcGRhLnN1c3BlbmQiIHZhbHVlPSJ5Ii8+CisgICAgPHByb3BlcnR5IG5hbWU9ImpwZGEuc2V0dGluZ3MiIHZhbHVlPSJ0cmFuc3BvcnQ9JHtqcGRhLnRyYW5zcG9ydH0sYWRkcmVzcz0ke2pwZGEuYWRkcmVzc30sc2VydmVyPXksc3VzcGVuZD0ke2pwZGEuc3VzcGVuZH0iLz4KKworICA8L3RhcmdldD4KKworICA8IS0tIFRhcmdldCB0aGF0IGV4ZWN1dGVzIHRoZSBKU1BDIGNvbXBpbGVyLS0+CisgIDx0YXJnZXQgbmFtZT0ianNwYyIgZGVzY3JpcHRpb249IkV4ZWN1dGUgSlNQQyBjb21waWxlciIKKyAgICBkZXBlbmRzPSJzZXRqZGIsc2V0anBkYSI+CisKKyAgICA8IS0tIExhdW5jaCBKU1BDIGNvbXBpbGVyIC0tPgorICAgIDxsYXVuY2ggY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmphc3Blci5Kc3BDIgorICAgICAgZGVidWc9IiR7amRifSIKKyAgICAgIHByaW50PSIke3ByaW50fSIKKyAgICAgIHVzZXN5c3RlbWluPSJmYWxzZSIKKyAgICAgIHJlcXVpcmV0b29scz0idHJ1ZSI+CisgICAgICAgIDxqdm1hcmdzZXQgcmVmaWQ9ImJhc2UuanZtLmFyZ3MiLz4KKyAgICAgICAgPGFyZyB2YWx1ZT0ianNwYyIvPgorICAgICAgICA8c3lzcHJvcGVydHlzZXQgcmVmaWQ9ImJhc2Uuc3lzLnByb3BlcnRpZXMiLz4KKyAgICAgICAgPGNsYXNzcGF0aCByZWZpZD0iYmFzZS5jbGFzcy5wYXRoIi8+CisgICAgPC9sYXVuY2g+CisKKyAgPC90YXJnZXQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2phc3Blci9qYXNwZXIyL3NyYy9iaW4vanNwYy11c2luZy1sYXVuY2hlci5iYXQgYi9qYXNwZXIvamFzcGVyMi9zcmMvYmluL2pzcGMtdXNpbmctbGF1bmNoZXIuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmY1MjdlOGUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXNwZXIvamFzcGVyMi9zcmMvYmluL2pzcGMtdXNpbmctbGF1bmNoZXIuYmF0CkBAIC0wLDAgKzEsNDAgQEAKK0BlY2hvIG9mZgoraWYgIiVPUyUiID09ICJXaW5kb3dzX05UIiBzZXRsb2NhbAorCityZW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCityZW0KK3JlbSBTY3JpcHQgZm9yIHJ1bm5pbmcgSlNQQyBjb21waWxlciB1c2luZyB0aGUgTGF1bmNoZXIKK3JlbQorcmVtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCityZW0gR2V0IHN0YW5kYXJkIGVudmlyb25tZW50IHZhcmlhYmxlcworc2V0IFBSRz0lMAoraWYgZXhpc3QgJVBSRyVcLi5cc2V0ZW52LmJhdCBnb3RvIGdvdENtZFBhdGgKK3JlbSAlMCBtdXN0IGhhdmUgYmVlbiBmb3VuZCBieSBET1MgdXNpbmcgdGhlICVQQVRIJSBzbyB3ZSBhc3N1bWUgdGhhdAorcmVtIHNldGVudi5iYXQgd2lsbCBhbHNvIGJlIGZvdW5kIGluIHRoZSAlUEFUSCUKK2NhbGwgc2V0ZW52LmJhdAorZ290byBkb25lU2V0ZW52Cis6Z290Q21kUGF0aAorY2FsbCAlUFJHJVwuLlxzZXRlbnYuYmF0Cis6ZG9uZVNldGVudgorCityZW0gTWFrZSBzdXJlIHByZXJlcXVpc2l0ZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIHNldAoraWYgbm90ICIlSkFWQV9IT01FJSIgPT0gIiIgZ290byBnb3RKYXZhSG9tZQorZWNobyBUaGUgSkFWQV9IT01FIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5vdCBkZWZpbmVkCitlY2hvIFRoaXMgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbmVlZGVkIHRvIHJ1biB0aGlzIHByb2dyYW0KK2dvdG8gZW5kCis6Z290SmF2YUhvbWUKKworcmVtIEdldCBjb21tYW5kIGxpbmUgYXJndW1lbnRzIGFuZCBzYXZlIHRoZW0gd2l0aCB0aGUgcHJvcGVyIHF1b3RpbmcKK3NldCBDTURfTElORV9BUkdTPQorOnNldEFyZ3MKK2lmICIiJTEiIj09IiIiIiBnb3RvIGRvbmVTZXRBcmdzCitzZXQgQ01EX0xJTkVfQVJHUz0lQ01EX0xJTkVfQVJHUyUgJTEKK3NoaWZ0Citnb3RvIHNldEFyZ3MKKzpkb25lU2V0QXJncworCityZW0gRXhlY3V0ZSB0aGUgTGF1bmNoZXIgdXNpbmcgdGhlICJqc3BjIiB0YXJnZXQKKyIlSkFWQV9IT01FJVxiaW5camF2YS5leGUiIC1jbGFzc3BhdGggJVBSRyVcLi47IiVQQVRIJSI7LiBMYXVuY2hlckJvb3RzdHJhcCAtbGF1bmNoZmlsZSBqYXNwZXIueG1sIC12ZXJib3NlIGpzcGMgJUNNRF9MSU5FX0FSR1MlCisKKzplbmQKZGlmZiAtLWdpdCBhL2phc3Blci9qYXNwZXIyL3NyYy9iaW4vanNwYy11c2luZy1sYXVuY2hlci5zaCBiL2phc3Blci9qYXNwZXIyL3NyYy9iaW4vanNwYy11c2luZy1sYXVuY2hlci5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYThkOWVjCi0tLSAvZGV2L251bGwKKysrIGIvamFzcGVyL2phc3BlcjIvc3JjL2Jpbi9qc3BjLXVzaW5nLWxhdW5jaGVyLnNoCkBAIC0wLDAgKzEsMjkgQEAKKyMhL2Jpbi9zaAorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjCisjIFNjcmlwdCBmb3IgcnVubmluZyBKU1BDIGNvbXBpbGVyIHVzaW5nIHRoZSBMYXVuY2hlcgorIworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIFJlc29sdmUgbGlua3MgLSAkMCBtYXkgYmUgYSBzb2Z0bGluaworUFJHPSIkMCIKKword2hpbGUgWyAtaCAiJFBSRyIgXTsgZG8KKyAgbHM9YGxzIC1sZCAiJFBSRyJgCisgIGxpbms9YGV4cHIgIiRscyIgOiAnLiotPiBcKC4qXCkkJ2AKKyAgaWYgZXhwciAiJGxpbmsiIDogJy4qLy4qJyA+IC9kZXYvbnVsbDsgdGhlbgorICAgIFBSRz0iJGxpbmsiCisgIGVsc2UKKyAgICBQUkc9YGRpcm5hbWUgIiRQUkciYC8iJGxpbmsiCisgIGZpCitkb25lCisKKyMgR2V0IHN0YW5kYXJkIGVudmlyb25tZW50IHZhcmlhYmxlcworUFJHRElSPWBkaXJuYW1lICIkUFJHImAKK2lmIFsgLXIgIiRQUkdESVIiL3NldGVudi5zaCBdOyB0aGVuCisgIC4gIiRQUkdESVIiL3NldGVudi5zaAorZmkKKworIyBFeGVjdXRlIHRoZSBMYXVuY2hlciB1c2luZyB0aGUgImpzcGMiIHRhcmdldAorZXhlYyAiJEpBVkFfSE9NRSIvYmluL2phdmEgLWNsYXNzcGF0aCAiJFBSR0RJUiIgTGF1bmNoZXJCb290c3RyYXAgLWxhdW5jaGZpbGUgamFzcGVyLnhtbCAtdmVyYm9zZSBqc3BjICIkQCIKZGlmZiAtLWdpdCBhL2phc3Blci9qYXNwZXIyL3NyYy9iaW4vanNwYy5iYXQgYi9qYXNwZXIvamFzcGVyMi9zcmMvYmluL2pzcGMuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjI5NTljYmIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXNwZXIvamFzcGVyMi9zcmMvYmluL2pzcGMuYmF0CkBAIC0wLDAgKzEsNDEgQEAKK0BlY2hvIG9mZgoraWYgIiVPUyUiID09ICJXaW5kb3dzX05UIiBzZXRsb2NhbAorcmVtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorcmVtIFNjcmlwdCB0byBydW4gdGhlIEphc3BlciAib2ZmbGluZSBKU1AgY29tcGlsZXIiCityZW0KK3JlbSAkSWQkCityZW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3JlbSBHdWVzcyBKQVNQRVJfSE9NRSBpZiBub3QgZGVmaW5lZAoraWYgbm90ICIlSkFTUEVSX0hPTUUlIiA9PSAiIiBnb3RvIGdvdEhvbWUKK3NldCBKQVNQRVJfSE9NRT0uCitpZiBleGlzdCAiJUpBU1BFUl9IT01FJVxiaW5canNwYy5iYXQiIGdvdG8gb2tIb21lCitzZXQgSkFTUEVSX0hPTUU9Li4KKzpnb3RIb21lCitpZiBleGlzdCAiJUpBU1BFUl9IT01FJVxiaW5canNwYy5iYXQiIGdvdG8gb2tIb21lCitlY2hvIFRoZSBKQVNQRVJfSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBub3QgZGVmaW5lZCBjb3JyZWN0bHkKK2VjaG8gVGhpcyBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBuZWVkZWQgdG8gcnVuIHRoaXMgcHJvZ3JhbQorZ290byBlbmQKKzpva0hvbWUKKworc2V0IEVYRUNVVEFCTEU9JUpBU1BFUl9IT01FJVxiaW5camFzcGVyLmJhdAorCityZW0gQ2hlY2sgdGhhdCB0YXJnZXQgZXhlY3V0YWJsZSBleGlzdHMKK2lmIGV4aXN0ICIlRVhFQ1VUQUJMRSUiIGdvdG8gb2tFeGVjCitlY2hvIENhbm5vdCBmaW5kICVFWEVDVVRBQkxFJQorZWNobyBUaGlzIGZpbGUgaXMgbmVlZGVkIHRvIHJ1biB0aGlzIHByb2dyYW0KK2dvdG8gZW5kCis6b2tFeGVjCisKK3JlbSBHZXQgcmVtYWluaW5nIHVuc2hpZnRlZCBjb21tYW5kIGxpbmUgYXJndW1lbnRzIGFuZCBzYXZlIHRoZW0gaW4gdGhlCitzZXQgQ01EX0xJTkVfQVJHUz0KKzpzZXRBcmdzCitpZiAiIiUxIiI9PSIiIiIgZ290byBkb25lU2V0QXJncworc2V0IENNRF9MSU5FX0FSR1M9JUNNRF9MSU5FX0FSR1MlICUxCitzaGlmdAorZ290byBzZXRBcmdzCis6ZG9uZVNldEFyZ3MKKworY2FsbCAiJUVYRUNVVEFCTEUlIiBqc3BjICVDTURfTElORV9BUkdTJQorCis6ZW5kCmRpZmYgLS1naXQgYS9qYXNwZXIvamFzcGVyMi9zcmMvYmluL2pzcGMuc2ggYi9qYXNwZXIvamFzcGVyMi9zcmMvYmluL2pzcGMuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmMyNjc4NwotLS0gL2Rldi9udWxsCisrKyBiL2phc3Blci9qYXNwZXIyL3NyYy9iaW4vanNwYy5zaApAQCAtMCwwICsxLDM2IEBACisjIS9iaW4vc2gKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU2NyaXB0IHRvIHJ1biB0aGUgSmFzcGVyICJvZmZsaW5lIEpTUCBjb21waWxlciIKKyMKKyMgJElkJAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIHJlc29sdmUgbGlua3MgLSAkMCBtYXkgYmUgYSBzb2Z0bGluaworUFJHPSIkMCIKKword2hpbGUgWyAtaCAiJFBSRyIgXSA7IGRvCisgIGxzPWBscyAtbGQgIiRQUkciYAorICBsaW5rPWBleHByICIkbHMiIDogJy4qLT4gXCguKlwpJCdgCisgIGlmIGV4cHIgIiRsaW5rIiA6ICcuKi8uKicgPiAvZGV2L251bGw7IHRoZW4KKyAgICBQUkc9IiRsaW5rIgorICBlbHNlCisgICAgUFJHPWBkaXJuYW1lICIkUFJHImAvIiRsaW5rIgorICBmaQorZG9uZQorIAorUFJHRElSPWBkaXJuYW1lICIkUFJHImAKK0VYRUNVVEFCTEU9amFzcGVyLnNoCisKKyMgQ2hlY2sgdGhhdCB0YXJnZXQgZXhlY3V0YWJsZSBleGlzdHMKK2lmIFsgISAteCAiJFBSR0RJUiIvIiRFWEVDVVRBQkxFIiBdOyB0aGVuCisgIGVjaG8gIkNhbm5vdCBmaW5kICRQUkdESVIvJEVYRUNVVEFCTEUiCisgIGVjaG8gIlRoaXMgZmlsZSBpcyBuZWVkZWQgdG8gcnVuIHRoaXMgcHJvZ3JhbSIKKyAgZXhpdCAxCitmaQorCitpZiBbICIkMSIgPSAiZGVidWciIF07IHRoZW4KKyAgc2hpZnQKKyAgZXhlYyAiJFBSR0RJUiIvIiRFWEVDVVRBQkxFIiBkZWJ1ZyAiJEAiCitlbHNlCisgIGV4ZWMgIiRQUkdESVIiLyIkRVhFQ1VUQUJMRSIganNwYyAiJEAiCitmaQpkaWZmIC0tZ2l0IGEvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL0NvbnN0YW50cy5qYXZhIGIvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL0NvbnN0YW50cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMDc2ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvQ29uc3RhbnRzLmphdmEKQEAgLTAsMCArMSwxOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphc3BlcjsKKworCisvKioKKyAqIFNvbWUgY29uc3RhbnRzIGFuZCBvdGhlciBnbG9iYWwgZGF0YSB0aGF0IGFyZSB1c2VkIGJ5IHRoZSBjb21waWxlciBhbmQgdGhlIHJ1bnRpbWUuCisgKgorICogQGF1dGhvciBBbmlsIEsuIFZpamVuZHJhbgorICogQGF1dGhvciBIYXJpc2ggUHJhYmFuZGhhbQorICogQGF1dGhvciBTaGF3biBCYXllcm4KKyAqIEBhdXRob3IgTWFyayBSb3RoCisgKi8KK3B1YmxpYyBjbGFzcyBDb25zdGFudHMgeworICAgIC8qKgorICAgICAqIFRoZSBiYXNlIGNsYXNzIG9mIHRoZSBnZW5lcmF0ZWQgc2VydmxldHMuIAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9TRVJWTEVUX0JBU0UgPSAib3JnLmFwYWNoZS5qYXNwZXIucnVudGltZS5IdHRwSnNwQmFzZSI7CisKKyAgICAvKioKKyAgICAgKiBfanNwU2VydmljZSBpcyB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kIHRoYXQgaXMgY2FsbGVkIGJ5IAorICAgICAqIEh0dHBKc3BCYXNlLnNlcnZpY2UoKS4gVGhpcyBpcyB3aGVyZSBtb3N0IG9mIHRoZSBjb2RlIGdlbmVyYXRlZAorICAgICAqIGZyb20gSlNQcyBnby4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFX01FVEhPRF9OQU1FID0gIl9qc3BTZXJ2aWNlIjsKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgc2VydmxldCBjb250ZW50IHR5cGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVkxFVF9DT05URU5UX1RZUEUgPSAidGV4dC9odG1sIjsKKworICAgIC8qKgorICAgICAqIFRoZXNlIGNsYXNzZXMvcGFja2FnZXMgYXJlIGF1dG9tYXRpY2FsbHkgaW1wb3J0ZWQgYnkgdGhlCisgICAgICogZ2VuZXJhdGVkIGNvZGUuIAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gU1RBTkRBUkRfSU1QT1JUUyA9IHsgCisJImphdmF4LnNlcnZsZXQuKiIsIAorCSJqYXZheC5zZXJ2bGV0Lmh0dHAuKiIsIAorCSJqYXZheC5zZXJ2bGV0LmpzcC4qIgorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBGSVhNRQorICAgICAqIFNlcnZsZXRDb250ZXh0IGF0dHJpYnV0ZSBmb3IgY2xhc3NwYXRoLiBUaGlzIGlzIHRvbWNhdCBzcGVjaWZpYy4gCisgICAgICogT3RoZXIgc2VydmxldCBlbmdpbmVzIG1heSBjaG9vc2UgdG8gc3VwcG9ydCB0aGlzIGF0dHJpYnV0ZSBpZiB0aGV5IAorICAgICAqIHdhbnQgdG8gaGF2ZSB0aGlzIEpTUCBlbmdpbmUgcnVubmluZyBvbiB0aGVtLiAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWTEVUX0NMQVNTUEFUSCA9ICJvcmcuYXBhY2hlLmNhdGFsaW5hLmpzcF9jbGFzc3BhdGgiOworCisgICAgLyoqCisgICAgICogRklYTUUKKyAgICAgKiBSZXF1ZXN0IGF0dHJpYnV0ZSBmb3IgPGNvZGU+Jmx0O2pzcC1maWxlJmd0OzwvY29kZT4gZWxlbWVudCBvZiBhCisgICAgICogc2VydmxldCBkZWZpbml0aW9uLiAgSWYgcHJlc2VudCBvbiBhIHJlcXVlc3QsIHRoaXMgb3ZlcnJpZGVzIHRoZQorICAgICAqIHZhbHVlIHJldHVybmVkIGJ5IDxjb2RlPnJlcXVlc3QuZ2V0U2VydmxldFBhdGgoKTwvY29kZT4gdG8gc2VsZWN0CisgICAgICogdGhlIEpTUCBwYWdlIHRvIGJlIGV4ZWN1dGVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9GSUxFID0gIm9yZy5hcGFjaGUuY2F0YWxpbmEuanNwX2ZpbGUiOworCisKKyAgICAvKioKKyAgICAgKiBGSVhNRQorICAgICAqIFNlcnZsZXRDb250ZXh0IGF0dHJpYnV0ZSBmb3IgY2xhc3MgbG9hZGVyLiBUaGlzIGlzIHRvbWNhdCBzcGVjaWZpYy4gCisgICAgICogT3RoZXIgc2VydmxldCBlbmdpbmVzIGNhbiBjaG9vc2UgdG8gaGF2ZSB0aGlzIGF0dHJpYnV0ZSBpZiB0aGV5IAorICAgICAqIHdhbnQgdG8gaGF2ZSB0aGlzIEpTUCBlbmdpbmUgcnVubmluZyBvbiB0aGVtLiAKKyAgICAgKi8KKyAgICAvL3B1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZMRVRfQ0xBU1NfTE9BREVSID0gIm9yZy5hcGFjaGUudG9tY2F0LmNsYXNzbG9hZGVyIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWTEVUX0NMQVNTX0xPQURFUiA9ICJvcmcuYXBhY2hlLmNhdGFsaW5hLmNsYXNzbG9hZGVyIjsKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgc2l6ZSBvZiB0aGUgSlNQIGJ1ZmZlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLID0gMTAyNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0JVRkZFUl9TSVpFID0gOCpLOworCisgICAgLyoqCisgICAgICogRGVmYXVsdCBzaXplIGZvciB0aGUgdGFnIGJ1ZmZlcnMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9UQUdfQlVGRkVSX1NJWkUgPSA1MTI7CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IHRhZyBoYW5kbGVyIHBvb2wgc2l6ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVhfUE9PTF9TSVpFID0gNTsKKworICAgIC8qKgorICAgICAqIFRoZSBxdWVyeSBwYXJhbWV0ZXIgdGhhdCBjYXVzZXMgdGhlIEpTUCBlbmdpbmUgdG8ganVzdAorICAgICAqIHByZWdlbmVyYXRlZCB0aGUgc2VydmxldCBidXQgbm90IGludm9rZSBpdC4gCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFQ09NUElMRSA9ICJqc3BfcHJlY29tcGlsZSI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBwYWNrYWdlIG5hbWUgZm9yIGNvbXBpbGVkIGpzcCBwYWdlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfUEFDS0FHRV9OQU1FID0gIm9yZy5hcGFjaGUuanNwIjsKKworICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IHBhY2thZ2UgbmFtZSBmb3IgdGFnIGhhbmRsZXJzIGdlbmVyYXRlZCBmcm9tIHRhZyBmaWxlcworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19GSUxFX1BBQ0tBR0VfTkFNRSA9ICJvcmcuYXBhY2hlLmpzcC50YWciOworCisgICAgLyoqCisgICAgICogU2VydmxldCBjb250ZXh0IGFuZCByZXF1ZXN0IGF0dHJpYnV0ZXMgdGhhdCB0aGUgSlNQIGVuZ2luZQorICAgICAqIHVzZXMuIAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOQ19SRVFVRVNUX1VSSSA9ICJqYXZheC5zZXJ2bGV0LmluY2x1ZGUucmVxdWVzdF91cmkiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOQ19TRVJWTEVUX1BBVEggPSAiamF2YXguc2VydmxldC5pbmNsdWRlLnNlcnZsZXRfcGF0aCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE1QX0RJUiA9ICJqYXZheC5zZXJ2bGV0LmNvbnRleHQudGVtcGRpciI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9SV0FSRF9TRUVOID0gImphdmF4LnNlcnZsZXQuZm9yd2FyZC5zZWVuIjsKKworICAgIC8qKgorICAgICAqIFB1YmxpYyBJZCBhbmQgdGhlIFJlc291cmNlIHBhdGggKG9mIHRoZSBjYWNoZWQgY29weSkgCisgICAgICogb2YgdGhlIERURHMgZm9yIHRhZyBsaWJyYXJ5IGRlc2NyaXB0b3JzLiAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdMSUJfRFREX1BVQkxJQ19JRF8xMSA9IAorCSItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgSlNQIFRhZyBMaWJyYXJ5IDEuMS8vRU4iOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR0xJQl9EVERfUkVTT1VSQ0VfUEFUSF8xMSA9IAorCSIvamF2YXgvc2VydmxldC9qc3AvcmVzb3VyY2VzL3dlYi1qc3B0YWdsaWJyYXJ5XzFfMS5kdGQiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR0xJQl9EVERfUFVCTElDX0lEXzEyID0gCisJIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBKU1AgVGFnIExpYnJhcnkgMS4yLy9FTiI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHTElCX0RURF9SRVNPVVJDRV9QQVRIXzEyID0gCisJIi9qYXZheC9zZXJ2bGV0L2pzcC9yZXNvdXJjZXMvd2ViLWpzcHRhZ2xpYnJhcnlfMV8yLmR0ZCI7CisKKyAgICAvKioKKyAgICAgKiBQdWJsaWMgSWQgYW5kIHRoZSBSZXNvdXJjZSBwYXRoIChvZiB0aGUgY2FjaGVkIGNvcHkpIAorICAgICAqIG9mIHRoZSBEVERzIGZvciB3ZWIgYXBwbGljYXRpb24gZGVwbG95bWVudCBkZXNjcmlwdG9ycworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQkFQUF9EVERfUFVCTElDX0lEXzIyID0gCisJIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBXZWIgQXBwbGljYXRpb24gMi4yLy9FTiI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCQVBQX0RURF9SRVNPVVJDRV9QQVRIXzIyID0gCisJIi9qYXZheC9zZXJ2bGV0L3Jlc291cmNlcy93ZWItYXBwXzJfMi5kdGQiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQkFQUF9EVERfUFVCTElDX0lEXzIzID0gCisJIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBXZWIgQXBwbGljYXRpb24gMi4zLy9FTiI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCQVBQX0RURF9SRVNPVVJDRV9QQVRIXzIzID0gCisJIi9qYXZheC9zZXJ2bGV0L3Jlc291cmNlcy93ZWItYXBwXzJfMy5kdGQiOworCisgICAgLyoqCisgICAgICogTGlzdCBvZiB0aGUgUHVibGljIElEcyB0aGF0IHdlIGNhY2hlLCBhbmQgdGhlaXIKKyAgICAgKiBhc3NvY2lhdGVkIGxvY2F0aW9uLiBUaGlzIGlzIHVzZWQgYnkgCisgICAgICogYW4gRW50aXR5UmVzb2x2ZXIgdG8gcmV0dXJuIHRoZSBsb2NhdGlvbiBvZiB0aGUKKyAgICAgKiBjYWNoZWQgY29weSBvZiBhIERURC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIENBQ0hFRF9EVERfUFVCTElDX0lEUyA9IHsKKwlUQUdMSUJfRFREX1BVQkxJQ19JRF8xMSwKKwlUQUdMSUJfRFREX1BVQkxJQ19JRF8xMiwKKwlXRUJBUFBfRFREX1BVQkxJQ19JRF8yMiwKKwlXRUJBUFBfRFREX1BVQkxJQ19JRF8yMywKKyAgICB9OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gQ0FDSEVEX0RURF9SRVNPVVJDRV9QQVRIUyA9IHsKKwlUQUdMSUJfRFREX1JFU09VUkNFX1BBVEhfMTEsCisJVEFHTElCX0RURF9SRVNPVVJDRV9QQVRIXzEyLAorCVdFQkFQUF9EVERfUkVTT1VSQ0VfUEFUSF8yMiwKKwlXRUJBUFBfRFREX1JFU09VUkNFX1BBVEhfMjMsCisgICAgfTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IFVSTHMgdG8gZG93bmxvYWQgdGhlIHBsdWdpbmcgZm9yIE5ldHNjYXBlIGFuZCBJRS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOU19QTFVHSU5fVVJMID0gCisgICAgICAgICJodHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL3BsdWdpbi8iOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUVfUExVR0lOX1VSTCA9IAorICAgICAgICAiaHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9wbHVnaW4vMS4yLjIvamluc3RhbGwtMV8yXzItd2luLmNhYiNWZXJzaW9uPTEsMiwyLDAiOworCisgICAgLyoqCisgICAgICogUHJlZml4IHRvIHVzZSBmb3IgZ2VuZXJhdGVkIHRlbXBvcmFyeSB2YXJpYWJsZSBuYW1lcworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFTVBfVkFSSUFCTEVfTkFNRV9QUkVGSVggPQorICAgICAgICAiX2pzcHhfdGVtcCI7CisKKyAgICAvKioKKyAgICAgKiBBIHJlcGxhY2VtZW50IGNoYXIgZm9yICJcJCIuCisgICAgICogWFhYIFRoaXMgaXMgYSBoYWNrIHRvIGF2b2lkIGNoYW5naW5nIEVMIGludGVycHJldGVyIHRvIHJlY29nbml6ZSAiXCQiCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIEVTQz0nXHUwMDFiJzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFU0NTdHI9IidcXHUwMDFiJyI7Cit9CisKZGlmZiAtLWdpdCBhL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9FbWJlZGRlZFNlcnZsZXRPcHRpb25zLmphdmEgYi9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvRW1iZWRkZWRTZXJ2bGV0T3B0aW9ucy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1ODQzYzAKLS0tIC9kZXYvbnVsbAorKysgYi9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvRW1iZWRkZWRTZXJ2bGV0T3B0aW9ucy5qYXZhCkBAIC0wLDAgKzEsNjQwIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYXNwZXI7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLio7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb25maWc7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKKworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLmNvbXBpbGVyLlRsZExvY2F0aW9uc0NhY2hlOworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLmNvbXBpbGVyLkpzcENvbmZpZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5jb21waWxlci5UYWdQbHVnaW5NYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLmNvbXBpbGVyLkxvY2FsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci54bWxwYXJzZXIuUGFyc2VyVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7CisKKy8qKgorICogQSBjbGFzcyB0byBob2xkIGFsbCBpbml0IHBhcmFtZXRlcnMgc3BlY2lmaWMgdG8gdGhlIEpTUCBlbmdpbmUuIAorICoKKyAqIEBhdXRob3IgQW5pbCBLLiBWaWplbmRyYW4KKyAqIEBhdXRob3IgSGFucyBCZXJnc3RlbgorICogQGF1dGhvciBQaWVycmUgRGVsaXNsZQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgRW1iZWRkZWRTZXJ2bGV0T3B0aW9ucyBpbXBsZW1lbnRzIE9wdGlvbnMgeworCisgICAgLy8gTG9nZ2VyCisgICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEVtYmVkZGVkU2VydmxldE9wdGlvbnMuY2xhc3MpOworCisgICAgcHJpdmF0ZSBQcm9wZXJ0aWVzIHNldHRpbmdzID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBJcyBKYXNwZXIgYmVpbmcgdXNlZCBpbiBkZXZlbG9wbWVudCBtb2RlPworICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBkZXZlbG9wbWVudCA9IHRydWU7CisKKyAgICAvKioKKyAgICAgKiBTaG91bGQgQW50IGZvcmsgaXRzIGphdmEgY29tcGlsZXMgb2YgSlNQIHBhZ2VzLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGZvcmsgPSB0cnVlOworCisgICAgLyoqCisgICAgICogRG8geW91IHdhbnQgdG8ga2VlcCB0aGUgZ2VuZXJhdGVkIEphdmEgZmlsZXMgYXJvdW5kPworICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBrZWVwR2VuZXJhdGVkID0gdHJ1ZTsKKworICAgIC8qKgorICAgICAqIFNob3VsZCB3aGl0ZSBzcGFjZXMgYmV0d2VlbiBkaXJlY3RpdmVzIG9yIGFjdGlvbnMgYmUgdHJpbW1lZD8KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gdHJpbVNwYWNlcyA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRhZyBoYW5kbGVyIHBvb2xpbmcgaXMgZW5hYmxlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaXNQb29saW5nRW5hYmxlZCA9IHRydWU7CisKKyAgICAvKioKKyAgICAgKiBEbyB5b3Ugd2FudCBzdXBwb3J0IGZvciAibWFwcGVkIiBmaWxlcz8gVGhpcyB3aWxsIGdlbmVyYXRlCisgICAgICogc2VydmxldCB0aGF0IGhhcyBhIHByaW50IHN0YXRlbWVudCBwZXIgbGluZSBvZiB0aGUgSlNQIGZpbGUuCisgICAgICogVGhpcyBzZWVtcyBsaWtlIGEgcmVhbGx5IG5pY2UgZmVhdHVyZSB0byBoYXZlIGZvciBkZWJ1Z2dpbmcuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIG1hcHBlZEZpbGUgPSB0cnVlOworICAgIAorICAgIC8qKgorICAgICAqIERvIHlvdSB3YW50IHN0YWNrIHRyYWNlcyBhbmQgc3VjaCBkaXNwbGF5ZWQgaW4gdGhlIGNsaWVudCdzCisgICAgICogYnJvd3Nlcj8gSWYgdGhpcyBpcyBmYWxzZSwgc3VjaCBtZXNzYWdlcyBnbyB0byB0aGUgc3RhbmRhcmQKKyAgICAgKiBlcnJvciBvciBhIGxvZyBmaWxlIGlmIHRoZSBzdGFuZGFyZCBlcnJvciBpcyByZWRpcmVjdGVkLiAKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gc2VuZEVycm9yVG9DbGllbnQgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIERvIHdlIHdhbnQgdG8gaW5jbHVkZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaW4gdGhlIGNsYXNzIGZpbGU/CisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGNsYXNzRGVidWdJbmZvID0gdHJ1ZTsKKworICAgIC8qKgorICAgICAqIEJhY2tncm91bmQgY29tcGlsZSB0aHJlYWQgY2hlY2sgaW50ZXJ2YWwgaW4gc2Vjb25kcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBjaGVja0ludGVydmFsID0gMzAwOworCisgICAgLyoqCisgICAgICogSlNQIHJlbG9hZGluZyBjaGVjayA/CisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHJlbG9hZGluZyA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogSXMgdGhlIGdlbmVyYXRpb24gb2YgU01BUCBpbmZvIGZvciBKU1I0NSBkZWJ1Z2dpbiBzdXBwcmVzc2VkPworICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBpc1NtYXBTdXBwcmVzc2VkID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBTaG91bGQgU01BUCBpbmZvIGZvciBKU1I0NSBkZWJ1Z2dpbmcgYmUgZHVtcGVkIHRvIGEgZmlsZT8KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaXNTbWFwRHVtcGVkID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBBcmUgVGV4dCBzdHJpbmdzIHRvIGJlIGdlbmVyYXRlZCBhcyBjaGFyIGFycmF5cz8KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gZ2VuU3RyaW5nQXNDaGFyQXJyYXkgPSBmYWxzZTsKKworICAgIHByaXZhdGUgYm9vbGVhbiBlcnJvck9uVXNlQmVhbkludmFsaWRDbGFzc0F0dHJpYnV0ZSA9IHRydWU7CisKKyAgICAvKioKKyAgICAgKiBJIHdhbnQgdG8gc2VlIG15IGdlbmVyYXRlZCBzZXJ2bGV0cy4gV2hpY2ggZGlyZWN0b3J5IGFyZSB0aGV5CisgICAgICogaW4/CisgICAgICovCisgICAgcHJpdmF0ZSBGaWxlIHNjcmF0Y2hEaXI7CisgICAgCisgICAgLyoqCisgICAgICogTmVlZCB0byBoYXZlIHRoaXMgYXMgaXMgZm9yIHZlcnNpb25zIDQgYW5kIDUgb2YgSUUuIENhbiBiZSBzZXQgZnJvbQorICAgICAqIHRoZSBpbml0UGFyYW1zIHNvIGlmIGl0IGNoYW5nZXMgaW4gdGhlIGZ1dHVyZSBhbGwgdGhhdCBpcyBuZWVkZWQgaXMKKyAgICAgKiB0byBoYXZlIGEganNwIGluaXRQYXJhbSBvZiB0eXBlIGllQ2xhc3NJZD0iPHZhbHVlPiIKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBpZUNsYXNzSWQgPSAiY2xzaWQ6OEFEOUM4NDAtMDQ0RS0xMUQxLUIzRTktMDA4MDVGNDk5RDkzIjsKKworICAgIC8qKgorICAgICAqIFdoYXQgY2xhc3NwYXRoIHNob3VsZCBJIHVzZSB3aGlsZSBjb21waWxpbmcgZ2VuZXJhdGVkIHNlcnZsZXRzPworICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGNsYXNzcGF0aCA9IG51bGw7CisgICAgCisgICAgLyoqCisgICAgICogQ29tcGlsZXIgdG8gdXNlLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGNvbXBpbGVyID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIENvbXBpbGVyIHRhcmdldCBWTS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBjb21waWxlclRhcmdldFZNID0gIjEuNCI7CisKKyAgICAvKioKKyAgICAgKiBDYWNoZSBmb3IgdGhlIFRMRCBsb2NhdGlvbnMKKyAgICAgKi8KKyAgICBwcml2YXRlIFRsZExvY2F0aW9uc0NhY2hlIHRsZExvY2F0aW9uc0NhY2hlID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIEpzcCBjb25maWcgaW5mb3JtYXRpb24KKyAgICAgKi8KKyAgICBwcml2YXRlIEpzcENvbmZpZyBqc3BDb25maWcgPSBudWxsOworCisgICAgLyoqCisgICAgICogVGFnUGx1Z2luTWFuYWdlcgorICAgICAqLworICAgIHByaXZhdGUgVGFnUGx1Z2luTWFuYWdlciB0YWdQbHVnaW5NYW5hZ2VyID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIEphdmEgcGxhdGZvcm0gZW5jb2RpbmcgdG8gZ2VuZXJhdGUgdGhlIEpTUAorICAgICAqIHBhZ2Ugc2VydmxldC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBqYXZhRW5jb2RpbmcgPSAiVVRGOCI7CisKKyAgICAvKioKKyAgICAgKiBNb2RpZmljYXRpb24gdGVzdCBpbnRlcnZhbC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBtb2RpZmljYXRpb25UZXN0SW50ZXJ2YWwgPSA0OworICAgIAorICAgIC8qKgorICAgICAqIElzIGdlbmVyYXRpb24gb2YgWC1Qb3dlcmVkLUJ5IHJlc3BvbnNlIGhlYWRlciBlbmFibGVkL2Rpc2FibGVkPworICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiB4cG93ZXJlZEJ5OworCisgICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eShTdHJpbmcgbmFtZSApIHsKKyAgICAgICAgcmV0dXJuIHNldHRpbmdzLmdldFByb3BlcnR5KCBuYW1lICk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSApIHsKKyAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCAmJiB2YWx1ZSAhPSBudWxsKXsgCisgICAgICAgICAgICBzZXR0aW5ncy5zZXRQcm9wZXJ0eSggbmFtZSwgdmFsdWUgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBBcmUgd2Uga2VlcGluZyBnZW5lcmF0ZWQgY29kZSBhcm91bmQ/CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0S2VlcEdlbmVyYXRlZCgpIHsKKyAgICAgICAgcmV0dXJuIGtlZXBHZW5lcmF0ZWQ7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNob3VsZCB3aGl0ZSBzcGFjZXMgYmV0d2VlbiBkaXJlY3RpdmVzIG9yIGFjdGlvbnMgYmUgdHJpbW1lZD8KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRUcmltU3BhY2VzKCkgeworICAgICAgICByZXR1cm4gdHJpbVNwYWNlczsKKyAgICB9CisgICAgCisgICAgcHVibGljIGJvb2xlYW4gaXNQb29saW5nRW5hYmxlZCgpIHsKKwlyZXR1cm4gaXNQb29saW5nRW5hYmxlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBcmUgd2Ugc3VwcG9ydGluZyBIVE1MIG1hcHBlZCBzZXJ2bGV0cz8KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRNYXBwZWRGaWxlKCkgeworICAgICAgICByZXR1cm4gbWFwcGVkRmlsZTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2hvdWxkIGVycm9ycyBiZSBzZW50IHRvIGNsaWVudCBvciB0aHJvd24gaW50byBzdGRlcnI/CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0U2VuZEVycm9yVG9DbGllbnQoKSB7CisgICAgICAgIHJldHVybiBzZW5kRXJyb3JUb0NsaWVudDsKKyAgICB9CisgCisgICAgLyoqCisgICAgICogU2hvdWxkIGNsYXNzIGZpbGVzIGJlIGNvbXBpbGVkIHdpdGggZGVidWcgaW5mb3JtYXRpb24/CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0Q2xhc3NEZWJ1Z0luZm8oKSB7CisgICAgICAgIHJldHVybiBjbGFzc0RlYnVnSW5mbzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCYWNrZ3JvdW5kIEpTUCBjb21waWxlIHRocmVhZCBjaGVjayBpbnRlcnZhbGwKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldENoZWNrSW50ZXJ2YWwoKSB7CisgICAgICAgIHJldHVybiBjaGVja0ludGVydmFsOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1vZGlmaWNhdGlvbiB0ZXN0IGludGVydmFsLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0TW9kaWZpY2F0aW9uVGVzdEludGVydmFsKCkgeworICAgICAgICByZXR1cm4gbW9kaWZpY2F0aW9uVGVzdEludGVydmFsOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBJcyBKYXNwZXIgYmVpbmcgdXNlZCBpbiBkZXZlbG9wbWVudCBtb2RlPworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldERldmVsb3BtZW50KCkgeworICAgICAgICByZXR1cm4gZGV2ZWxvcG1lbnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogSlNQIHJlbG9hZGluZyBjaGVjayA/CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0UmVsb2FkaW5nKCkgeworICAgICAgICByZXR1cm4gcmVsb2FkaW5nOworICAgIH0KKworICAgIC8qKgorICAgICAqIElzIHRoZSBnZW5lcmF0aW9uIG9mIFNNQVAgaW5mbyBmb3IgSlNSNDUgZGVidWdnaW4gc3VwcHJlc3NlZD8KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1NtYXBTdXBwcmVzc2VkKCkgeworICAgICAgICByZXR1cm4gaXNTbWFwU3VwcHJlc3NlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTaG91bGQgU01BUCBpbmZvIGZvciBKU1I0NSBkZWJ1Z2dpbmcgYmUgZHVtcGVkIHRvIGEgZmlsZT8KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1NtYXBEdW1wZWQoKSB7CisgICAgICAgIHJldHVybiBpc1NtYXBEdW1wZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXJlIFRleHQgc3RyaW5ncyB0byBiZSBnZW5lcmF0ZWQgYXMgY2hhciBhcnJheXM/CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2VuU3RyaW5nQXNDaGFyQXJyYXkoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmdlblN0cmluZ0FzQ2hhckFycmF5OworICAgIH0KKworICAgIC8qKgorICAgICAqIENsYXNzIElEIGZvciB1c2UgaW4gdGhlIHBsdWdpbiB0YWcgd2hlbiB0aGUgYnJvd3NlciBpcyBJRS4gCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJZUNsYXNzSWQoKSB7CisgICAgICAgIHJldHVybiBpZUNsYXNzSWQ7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFdoYXQgaXMgbXkgc2NyYXRjaCBkaXI/CisgICAgICovCisgICAgcHVibGljIEZpbGUgZ2V0U2NyYXRjaERpcigpIHsKKyAgICAgICAgcmV0dXJuIHNjcmF0Y2hEaXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hhdCBjbGFzc3BhdGggc2hvdWxkIEkgdXNlIHdoaWxlIGNvbXBpbGluZyB0aGUgc2VydmxldHMKKyAgICAgKiBnZW5lcmF0ZWQgZnJvbSBKU1AgZmlsZXM/CisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDbGFzc1BhdGgoKSB7CisgICAgICAgIHJldHVybiBjbGFzc3BhdGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogSXMgZ2VuZXJhdGlvbiBvZiBYLVBvd2VyZWQtQnkgcmVzcG9uc2UgaGVhZGVyIGVuYWJsZWQvZGlzYWJsZWQ/CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNYcG93ZXJlZEJ5KCkgeworICAgICAgICByZXR1cm4geHBvd2VyZWRCeTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21waWxlciB0byB1c2UuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDb21waWxlcigpIHsKKyAgICAgICAgcmV0dXJuIGNvbXBpbGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgT3B0aW9ucyNnZXRDb21waWxlclRhcmdldFZNCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDb21waWxlclRhcmdldFZNKCkgeworICAgICAgICByZXR1cm4gY29tcGlsZXJUYXJnZXRWTTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRFcnJvck9uVXNlQmVhbkludmFsaWRDbGFzc0F0dHJpYnV0ZSgpIHsKKyAgICAgICAgcmV0dXJuIGVycm9yT25Vc2VCZWFuSW52YWxpZENsYXNzQXR0cmlidXRlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEVycm9yT25Vc2VCZWFuSW52YWxpZENsYXNzQXR0cmlidXRlKGJvb2xlYW4gYikgeworICAgICAgICBlcnJvck9uVXNlQmVhbkludmFsaWRDbGFzc0F0dHJpYnV0ZSA9IGI7CisgICAgfQorCisgICAgcHVibGljIFRsZExvY2F0aW9uc0NhY2hlIGdldFRsZExvY2F0aW9uc0NhY2hlKCkgeworCXJldHVybiB0bGRMb2NhdGlvbnNDYWNoZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUbGRMb2NhdGlvbnNDYWNoZSggVGxkTG9jYXRpb25zQ2FjaGUgdGxkQyApIHsKKyAgICAgICAgdGxkTG9jYXRpb25zQ2FjaGUgPSB0bGRDOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SmF2YUVuY29kaW5nKCkgeworCXJldHVybiBqYXZhRW5jb2Rpbmc7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZ2V0Rm9yaygpIHsKKyAgICAgICAgcmV0dXJuIGZvcms7CisgICAgfQorCisgICAgcHVibGljIEpzcENvbmZpZyBnZXRKc3BDb25maWcoKSB7CisJcmV0dXJuIGpzcENvbmZpZzsKKyAgICB9CisKKyAgICBwdWJsaWMgVGFnUGx1Z2luTWFuYWdlciBnZXRUYWdQbHVnaW5NYW5hZ2VyKCkgeworCXJldHVybiB0YWdQbHVnaW5NYW5hZ2VyOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhbiBFbWJlZGRlZFNlcnZsZXRPcHRpb25zIG9iamVjdCB1c2luZyBkYXRhIGF2YWlsYWJsZSBmcm9tCisgICAgICogU2VydmxldENvbmZpZyBhbmQgU2VydmxldENvbnRleHQuIAorICAgICAqLworICAgIHB1YmxpYyBFbWJlZGRlZFNlcnZsZXRPcHRpb25zKFNlcnZsZXRDb25maWcgY29uZmlnLAorCQkJCSBTZXJ2bGV0Q29udGV4dCBjb250ZXh0KSB7CisKKyAgICAgICAgRW51bWVyYXRpb24gZW51bWVyYXRpb249Y29uZmlnLmdldEluaXRQYXJhbWV0ZXJOYW1lcygpOworICAgICAgICB3aGlsZSggZW51bWVyYXRpb24uaGFzTW9yZUVsZW1lbnRzKCkgKSB7CisgICAgICAgICAgICBTdHJpbmcgaz0oU3RyaW5nKWVudW1lcmF0aW9uLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICBTdHJpbmcgdj1jb25maWcuZ2V0SW5pdFBhcmFtZXRlciggayApOworICAgICAgICAgICAgc2V0UHJvcGVydHkoIGssIHYpOworICAgICAgICB9CisKKyAgICAgICAgLy8gcXVpY2sgaGFjaworICAgICAgICBTdHJpbmcgdmFsaWRhdGluZz1jb25maWcuZ2V0SW5pdFBhcmFtZXRlciggInZhbGlkYXRpbmciKTsKKyAgICAgICAgaWYoICJmYWxzZSIuZXF1YWxzKCB2YWxpZGF0aW5nICkpIFBhcnNlclV0aWxzLnZhbGlkYXRpbmc9ZmFsc2U7CisgICAgICAgIAorICAgICAgICBTdHJpbmcga2VlcGdlbiA9IGNvbmZpZy5nZXRJbml0UGFyYW1ldGVyKCJrZWVwZ2VuZXJhdGVkIik7CisgICAgICAgIGlmIChrZWVwZ2VuICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChrZWVwZ2VuLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSkgeworICAgICAgICAgICAgICAgIHRoaXMua2VlcEdlbmVyYXRlZCA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGtlZXBnZW4uZXF1YWxzSWdub3JlQ2FzZSgiZmFsc2UiKSkgeworICAgICAgICAgICAgICAgIHRoaXMua2VlcEdlbmVyYXRlZCA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKwkJaWYgKGxvZy5pc1dhcm5FbmFibGVkKCkpIHsKKwkJICAgIGxvZy53YXJuKExvY2FsaXplci5nZXRNZXNzYWdlKCJqc3Aud2FybmluZy5rZWVwZ2VuIikpOworCQl9CisJICAgIH0KKyAgICAgICAgfQorICAgICAgICAgICAgCisKKyAgICAgICAgU3RyaW5nIHRyaW1zcCA9IGNvbmZpZy5nZXRJbml0UGFyYW1ldGVyKCJ0cmltU3BhY2VzIik7IAorICAgICAgICBpZiAodHJpbXNwICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmICh0cmltc3AuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpKSB7CisgICAgICAgICAgICAgICAgdHJpbVNwYWNlcyA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHRyaW1zcC5lcXVhbHNJZ25vcmVDYXNlKCJmYWxzZSIpKSB7CisgICAgICAgICAgICAgICAgdHJpbVNwYWNlcyA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKwkJaWYgKGxvZy5pc1dhcm5FbmFibGVkKCkpIHsKKwkJICAgIGxvZy53YXJuKExvY2FsaXplci5nZXRNZXNzYWdlKCJqc3Aud2FybmluZy50cmltc3BhY2VzIikpOworCQl9CisJICAgIH0KKyAgICAgICAgfQorCQorCXRoaXMuaXNQb29saW5nRW5hYmxlZCA9IHRydWU7CisgICAgICAgIFN0cmluZyBwb29saW5nRW5hYmxlZFBhcmFtCisJICAgID0gY29uZmlnLmdldEluaXRQYXJhbWV0ZXIoImVuYWJsZVBvb2xpbmciKTsgCisgICAgICAgIGlmIChwb29saW5nRW5hYmxlZFBhcmFtICE9IG51bGwKKyAgCSAgICAgICAgJiYgIXBvb2xpbmdFbmFibGVkUGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpKSB7CisgICAgICAgICAgICBpZiAocG9vbGluZ0VuYWJsZWRQYXJhbS5lcXVhbHNJZ25vcmVDYXNlKCJmYWxzZSIpKSB7CisgICAgICAgICAgICAgICAgdGhpcy5pc1Bvb2xpbmdFbmFibGVkID0gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgeworCQlpZiAobG9nLmlzV2FybkVuYWJsZWQoKSkgeworCQkgICAgbG9nLndhcm4oTG9jYWxpemVyLmdldE1lc3NhZ2UoImpzcC53YXJuaW5nLmVuYWJsZVBvb2xpbmciKSk7CisJCX0JCSAgICAgICAJICAgCisJICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBtYXBGaWxlID0gY29uZmlnLmdldEluaXRQYXJhbWV0ZXIoIm1hcHBlZGZpbGUiKTsgCisgICAgICAgIGlmIChtYXBGaWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChtYXBGaWxlLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSkgeworICAgICAgICAgICAgICAgIHRoaXMubWFwcGVkRmlsZSA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1hcEZpbGUuZXF1YWxzSWdub3JlQ2FzZSgiZmFsc2UiKSkgeworICAgICAgICAgICAgICAgIHRoaXMubWFwcGVkRmlsZSA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKwkJaWYgKGxvZy5pc1dhcm5FbmFibGVkKCkpIHsKKwkJICAgIGxvZy53YXJuKExvY2FsaXplci5nZXRNZXNzYWdlKCJqc3Aud2FybmluZy5tYXBwZWRGaWxlIikpOworCQl9CisJICAgIH0KKyAgICAgICAgfQorCQorICAgICAgICBTdHJpbmcgc2VuZGVyciA9IGNvbmZpZy5nZXRJbml0UGFyYW1ldGVyKCJzZW5kRXJyVG9DbGllbnQiKTsKKyAgICAgICAgaWYgKHNlbmRlcnIgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKHNlbmRlcnIuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpKSB7CisgICAgICAgICAgICAgICAgdGhpcy5zZW5kRXJyb3JUb0NsaWVudCA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHNlbmRlcnIuZXF1YWxzSWdub3JlQ2FzZSgiZmFsc2UiKSkgeworICAgICAgICAgICAgICAgIHRoaXMuc2VuZEVycm9yVG9DbGllbnQgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisJCWlmIChsb2cuaXNXYXJuRW5hYmxlZCgpKSB7CisJCSAgICBsb2cud2FybihMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgianNwLndhcm5pbmcuc2VuZEVyclRvQ2xpZW50IikpOworCQl9CisJICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBkZWJ1Z0luZm8gPSBjb25maWcuZ2V0SW5pdFBhcmFtZXRlcigiY2xhc3NkZWJ1Z2luZm8iKTsKKyAgICAgICAgaWYgKGRlYnVnSW5mbyAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoZGVidWdJbmZvLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSkgeworICAgICAgICAgICAgICAgIHRoaXMuY2xhc3NEZWJ1Z0luZm8gID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZGVidWdJbmZvLmVxdWFsc0lnbm9yZUNhc2UoImZhbHNlIikpIHsKKyAgICAgICAgICAgICAgICB0aGlzLmNsYXNzRGVidWdJbmZvICA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKwkJaWYgKGxvZy5pc1dhcm5FbmFibGVkKCkpIHsKKwkJICAgIGxvZy53YXJuKExvY2FsaXplci5nZXRNZXNzYWdlKCJqc3Aud2FybmluZy5jbGFzc0RlYnVnSW5mbyIpKTsKKwkJfQorCSAgICB9CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgY2hlY2tJbnRlcnZhbCA9IGNvbmZpZy5nZXRJbml0UGFyYW1ldGVyKCJjaGVja0ludGVydmFsIik7CisgICAgICAgIGlmIChjaGVja0ludGVydmFsICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisJCXRoaXMuY2hlY2tJbnRlcnZhbCA9IEludGVnZXIucGFyc2VJbnQoY2hlY2tJbnRlcnZhbCk7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMuY2hlY2tJbnRlcnZhbCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tJbnRlcnZhbCA9IDMwMDsKKwkJICAgIGlmIChsb2cuaXNXYXJuRW5hYmxlZCgpKSB7CisJCQlsb2cud2FybihMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgianNwLndhcm5pbmcuY2hlY2tJbnRlcnZhbCIpKTsKKwkJICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleCkgeworCQlpZiAobG9nLmlzV2FybkVuYWJsZWQoKSkgeworCQkgICAgbG9nLndhcm4oTG9jYWxpemVyLmdldE1lc3NhZ2UoImpzcC53YXJuaW5nLmNoZWNrSW50ZXJ2YWwiKSk7CisJCX0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBtb2RpZmljYXRpb25UZXN0SW50ZXJ2YWwgPSBjb25maWcuZ2V0SW5pdFBhcmFtZXRlcigibW9kaWZpY2F0aW9uVGVzdEludGVydmFsIik7CisgICAgICAgIGlmIChtb2RpZmljYXRpb25UZXN0SW50ZXJ2YWwgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB0aGlzLm1vZGlmaWNhdGlvblRlc3RJbnRlcnZhbCA9IEludGVnZXIucGFyc2VJbnQobW9kaWZpY2F0aW9uVGVzdEludGVydmFsKTsKKyAgICAgICAgICAgIH0gY2F0Y2goTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc1dhcm5FbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oTG9jYWxpemVyLmdldE1lc3NhZ2UoImpzcC53YXJuaW5nLm1vZGlmaWNhdGlvblRlc3RJbnRlcnZhbCIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgZGV2ZWxvcG1lbnQgPSBjb25maWcuZ2V0SW5pdFBhcmFtZXRlcigiZGV2ZWxvcG1lbnQiKTsKKyAgICAgICAgaWYgKGRldmVsb3BtZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChkZXZlbG9wbWVudC5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikpIHsKKyAgICAgICAgICAgICAgICB0aGlzLmRldmVsb3BtZW50ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZGV2ZWxvcG1lbnQuZXF1YWxzSWdub3JlQ2FzZSgiZmFsc2UiKSkgeworICAgICAgICAgICAgICAgIHRoaXMuZGV2ZWxvcG1lbnQgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisJCWlmIChsb2cuaXNXYXJuRW5hYmxlZCgpKSB7CisJCSAgICBsb2cud2FybihMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgianNwLndhcm5pbmcuZGV2ZWxvcG1lbnQiKSk7CisJCX0KKwkgICAgfQorICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIHJlbG9hZGluZyA9IGNvbmZpZy5nZXRJbml0UGFyYW1ldGVyKCJyZWxvYWRpbmciKTsKKyAgICAgICAgaWYgKHJlbG9hZGluZyAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAocmVsb2FkaW5nLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSkgeworICAgICAgICAgICAgICAgIHRoaXMucmVsb2FkaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocmVsb2FkaW5nLmVxdWFsc0lnbm9yZUNhc2UoImZhbHNlIikpIHsKKyAgICAgICAgICAgICAgICB0aGlzLnJlbG9hZGluZyA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKwkJaWYgKGxvZy5pc1dhcm5FbmFibGVkKCkpIHsKKwkJICAgIGxvZy53YXJuKExvY2FsaXplci5nZXRNZXNzYWdlKCJqc3Aud2FybmluZy5yZWxvYWRpbmciKSk7CisJCX0KKwkgICAgfQorICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIHN1cHByZXNzU21hcCA9IGNvbmZpZy5nZXRJbml0UGFyYW1ldGVyKCJzdXBwcmVzc1NtYXAiKTsKKyAgICAgICAgaWYgKHN1cHByZXNzU21hcCAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoc3VwcHJlc3NTbWFwLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSkgeworCQlpc1NtYXBTdXBwcmVzc2VkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3VwcHJlc3NTbWFwLmVxdWFsc0lnbm9yZUNhc2UoImZhbHNlIikpIHsKKyAgICAgICAgICAgICAgICBpc1NtYXBTdXBwcmVzc2VkID0gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNXYXJuRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKExvY2FsaXplci5nZXRNZXNzYWdlKCJqc3Aud2FybmluZy5zdXBwcmVzc1NtYXAiKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIGR1bXBTbWFwID0gY29uZmlnLmdldEluaXRQYXJhbWV0ZXIoImR1bXBTbWFwIik7CisgICAgICAgIGlmIChkdW1wU21hcCAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoZHVtcFNtYXAuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpKSB7CisgICAgICAgICAgICAgICAgaXNTbWFwRHVtcGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZHVtcFNtYXAuZXF1YWxzSWdub3JlQ2FzZSgiZmFsc2UiKSkgeworICAgICAgICAgICAgICAgIGlzU21hcER1bXBlZCA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzV2FybkVuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBsb2cud2FybihMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgianNwLndhcm5pbmcuZHVtcFNtYXAiKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIGdlbkNoYXJBcnJheSA9IGNvbmZpZy5nZXRJbml0UGFyYW1ldGVyKCJnZW5TdHJBc0NoYXJBcnJheSIpOworICAgICAgICBpZiAoZ2VuQ2hhckFycmF5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChnZW5DaGFyQXJyYXkuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpKSB7CisgICAgICAgICAgICAgICAgZ2VuU3RyaW5nQXNDaGFyQXJyYXkgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmIChnZW5DaGFyQXJyYXkuZXF1YWxzSWdub3JlQ2FzZSgiZmFsc2UiKSkgeworICAgICAgICAgICAgICAgIGdlblN0cmluZ0FzQ2hhckFycmF5ID0gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNXYXJuRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKExvY2FsaXplci5nZXRNZXNzYWdlKCJqc3Aud2FybmluZy5nZW5jaGFyYXJyYXkiKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIGVyckJlYW5DbGFzcyA9CisJICAgIGNvbmZpZy5nZXRJbml0UGFyYW1ldGVyKCJlcnJvck9uVXNlQmVhbkludmFsaWRDbGFzc0F0dHJpYnV0ZSIpOworICAgICAgICBpZiAoZXJyQmVhbkNsYXNzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChlcnJCZWFuQ2xhc3MuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpKSB7CisgICAgICAgICAgICAgICAgZXJyb3JPblVzZUJlYW5JbnZhbGlkQ2xhc3NBdHRyaWJ1dGUgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmIChlcnJCZWFuQ2xhc3MuZXF1YWxzSWdub3JlQ2FzZSgiZmFsc2UiKSkgeworICAgICAgICAgICAgICAgIGVycm9yT25Vc2VCZWFuSW52YWxpZENsYXNzQXR0cmlidXRlID0gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNXYXJuRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKExvY2FsaXplci5nZXRNZXNzYWdlKCJqc3Aud2FybmluZy5lcnJCZWFuIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBpZUNsYXNzSWQgPSBjb25maWcuZ2V0SW5pdFBhcmFtZXRlcigiaWVDbGFzc0lkIik7CisgICAgICAgIGlmIChpZUNsYXNzSWQgIT0gbnVsbCkKKyAgICAgICAgICAgIHRoaXMuaWVDbGFzc0lkID0gaWVDbGFzc0lkOworCisgICAgICAgIFN0cmluZyBjbGFzc3BhdGggPSBjb25maWcuZ2V0SW5pdFBhcmFtZXRlcigiY2xhc3NwYXRoIik7CisgICAgICAgIGlmIChjbGFzc3BhdGggIT0gbnVsbCkKKyAgICAgICAgICAgIHRoaXMuY2xhc3NwYXRoID0gY2xhc3NwYXRoOworCisJLyoKKwkgKiBzY3JhdGNoZGlyCisJICovCisgICAgICAgIFN0cmluZyBkaXIgPSBjb25maWcuZ2V0SW5pdFBhcmFtZXRlcigic2NyYXRjaGRpciIpOyAKKyAgICAgICAgaWYgKGRpciAhPSBudWxsKSB7CisgICAgICAgICAgICBzY3JhdGNoRGlyID0gbmV3IEZpbGUoZGlyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIEZpcnN0IHRyeSB0aGUgU2VydmxldCAyLjIgamF2YXguc2VydmxldC5jb250ZXh0LnRlbXBkaXIgcHJvcGVydHkKKyAgICAgICAgICAgIHNjcmF0Y2hEaXIgPSAoRmlsZSkgY29udGV4dC5nZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLlRNUF9ESVIpOworICAgICAgICAgICAgaWYgKHNjcmF0Y2hEaXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIE5vdCBydW5uaW5nIGluIGEgU2VydmxldCAyLjIgY29udGFpbmVyLgorICAgICAgICAgICAgICAgIC8vIFRyeSB0byBnZXQgdGhlIEpESyAxLjIgamF2YS5pby50bXBkaXIgcHJvcGVydHkKKyAgICAgICAgICAgICAgICBkaXIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaW8udG1wZGlyIik7CisgICAgICAgICAgICAgICAgaWYgKGRpciAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBzY3JhdGNoRGlyID0gbmV3IEZpbGUoZGlyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAgICAgIAorICAgICAgICBpZiAodGhpcy5zY3JhdGNoRGlyID09IG51bGwpIHsKKyAgICAgICAgICAgIGxvZy5mYXRhbChMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgianNwLmVycm9yLm5vLnNjcmF0Y2guZGlyIikpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgaWYgKCEoc2NyYXRjaERpci5leGlzdHMoKSAmJiBzY3JhdGNoRGlyLmNhblJlYWQoKSAmJgorICAgICAgICAgICAgICBzY3JhdGNoRGlyLmNhbldyaXRlKCkgJiYgc2NyYXRjaERpci5pc0RpcmVjdG9yeSgpKSkKKyAgICAgICAgICAgIGxvZy5mYXRhbChMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgianNwLmVycm9yLmJhZC5zY3JhdGNoLmRpciIsCisJCQkJCSAgIHNjcmF0Y2hEaXIuZ2V0QWJzb2x1dGVQYXRoKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgdGhpcy5jb21waWxlciA9IGNvbmZpZy5nZXRJbml0UGFyYW1ldGVyKCJjb21waWxlciIpOworICAgICAgICAKKyAgICAgICAgU3RyaW5nIGNvbXBpbGVyVGFyZ2V0Vk0gPSBjb25maWcuZ2V0SW5pdFBhcmFtZXRlcigiY29tcGlsZXJUYXJnZXRWTSIpOworICAgICAgICBpZihjb21waWxlclRhcmdldFZNICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMuY29tcGlsZXJUYXJnZXRWTSA9IGNvbXBpbGVyVGFyZ2V0Vk07CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgamF2YUVuY29kaW5nID0gY29uZmlnLmdldEluaXRQYXJhbWV0ZXIoImphdmFFbmNvZGluZyIpOworICAgICAgICBpZiAoamF2YUVuY29kaW5nICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMuamF2YUVuY29kaW5nID0gamF2YUVuY29kaW5nOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIGZvcmsgPSBjb25maWcuZ2V0SW5pdFBhcmFtZXRlcigiZm9yayIpOworICAgICAgICBpZiAoZm9yayAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoZm9yay5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikpIHsKKyAgICAgICAgICAgICAgICB0aGlzLmZvcmsgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmIChmb3JrLmVxdWFsc0lnbm9yZUNhc2UoImZhbHNlIikpIHsKKyAgICAgICAgICAgICAgICB0aGlzLmZvcmsgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisJCWlmIChsb2cuaXNXYXJuRW5hYmxlZCgpKSB7CisJCSAgICBsb2cud2FybihMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgianNwLndhcm5pbmcuZm9yayIpKTsKKwkJfQorCSAgICB9CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgeHBvd2VyZWRCeSA9IGNvbmZpZy5nZXRJbml0UGFyYW1ldGVyKCJ4cG93ZXJlZEJ5Iik7IAorICAgICAgICBpZiAoeHBvd2VyZWRCeSAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoeHBvd2VyZWRCeS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikpIHsKKyAgICAgICAgICAgICAgICB0aGlzLnhwb3dlcmVkQnkgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmICh4cG93ZXJlZEJ5LmVxdWFsc0lnbm9yZUNhc2UoImZhbHNlIikpIHsKKyAgICAgICAgICAgICAgICB0aGlzLnhwb3dlcmVkQnkgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisJCWlmIChsb2cuaXNXYXJuRW5hYmxlZCgpKSB7CisJCSAgICBsb2cud2FybihMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgianNwLndhcm5pbmcueHBvd2VyZWRCeSIpKTsKKwkJfQorCSAgICB9CisgICAgICAgIH0KKworCS8vIFNldHVwIHRoZSBnbG9iYWwgVGFnIExpYnJhcmllcyBsb2NhdGlvbiBjYWNoZSBmb3IgdGhpcworCS8vIHdlYi1hcHBsaWNhdGlvbi4KKwl0bGRMb2NhdGlvbnNDYWNoZSA9IG5ldyBUbGRMb2NhdGlvbnNDYWNoZShjb250ZXh0KTsKKworCS8vIFNldHVwIHRoZSBqc3AgY29uZmlnIGluZm8gZm9yIHRoaXMgd2ViIGFwcC4KKwlqc3BDb25maWcgPSBuZXcgSnNwQ29uZmlnKGNvbnRleHQpOworCisJLy8gQ3JlYXRlIGEgVGFnIHBsdWdpbiBpbnN0YW5jZQorCXRhZ1BsdWdpbk1hbmFnZXIgPSBuZXcgVGFnUGx1Z2luTWFuYWdlcihjb250ZXh0KTsKKyAgICB9CisKK30KKwpkaWZmIC0tZ2l0IGEvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL0phc3BlckV4Y2VwdGlvbi5qYXZhIGIvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL0phc3BlckV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxMzVhNTEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvSmFzcGVyRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFzcGVyOworCisvKioKKyAqIEJhc2UgY2xhc3MgZm9yIGFsbCBleGNlcHRpb25zIGdlbmVyYXRlZCBieSB0aGUgSlNQIGVuZ2luZS4gTWFrZXMgaXQKKyAqIGNvbnZpZW5pZW50IHRvIGNhdGNoIGp1c3QgdGhpcyBhdCB0aGUgdG9wLWxldmVsLiAKKyAqCisgKiBAYXV0aG9yIEFuaWwgSy4gVmlqZW5kcmFuCisgKi8KK3B1YmxpYyBjbGFzcyBKYXNwZXJFeGNlcHRpb24gZXh0ZW5kcyBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb24geworICAgIAorICAgIHB1YmxpYyBKYXNwZXJFeGNlcHRpb24oU3RyaW5nIHJlYXNvbikgeworCXN1cGVyKHJlYXNvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIEphc3BlckV4Y2VwdGlvbiB3aXRoIHRoZSBlbWJlZGRlZCBleGNlcHRpb24gYW5kIHRoZSByZWFzb24gZm9yCisgICAgICogdGhyb3dpbmcgYSBKYXNwZXJFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgSmFzcGVyRXhjZXB0aW9uIChTdHJpbmcgcmVhc29uLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7CisgICAJc3VwZXIocmVhc29uLCBleGNlcHRpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBKYXNwZXJFeGNlcHRpb24gd2l0aCB0aGUgZW1iZWRkZWQgZXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIEphc3BlckV4Y2VwdGlvbiAoVGhyb3dhYmxlIGV4Y2VwdGlvbikgeworICAgCXN1cGVyKGV4Y2VwdGlvbik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL0pzcEMuamF2YSBiL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9Kc3BDLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI1OTk4MwotLS0gL2Rldi9udWxsCisrKyBiL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9Kc3BDLmphdmEKQEAgLTAsMCArMSwxMTY2IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYXNwZXI7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uQ2hhckFycmF5V3JpdGVyOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOworaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CitpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIuY29tcGlsZXIuQ29tcGlsZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIuY29tcGlsZXIuSnNwQ29uZmlnOworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLmNvbXBpbGVyLkpzcFJ1bnRpbWVDb250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLmNvbXBpbGVyLkxvY2FsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5jb21waWxlci5UYWdQbHVnaW5NYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLmNvbXBpbGVyLlRsZExvY2F0aW9uc0NhY2hlOworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLnNlcnZsZXQuSnNwQ1NlcnZsZXRDb250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkFudENsYXNzTG9hZGVyOworCisvKioKKyAqIFNoZWxsIGZvciB0aGUganNwYyBjb21waWxlci4gIEhhbmRsZXMgYWxsIG9wdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZQorICogY29tbWFuZCBsaW5lIGFuZCBjcmVhdGVzIGNvbXBpbGF0aW9uIGNvbnRleHRzIHdoaWNoIGl0IHRoZW4gY29tcGlsZXMKKyAqIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIG9wdGlvbnMuCisgKgorICogVGhpcyB2ZXJzaW9uIGNhbiBwcm9jZXNzIGZpbGVzIGZyb20gYSBfc2luZ2xlXyB3ZWJhcHAgYXQgb25jZSwgaS5lLgorICogYSBzaW5nbGUgZG9jYmFzZSBjYW4gYmUgc3BlY2lmaWVkLgorICoKKyAqIEl0IGNhbiBiZSB1c2VkIGFzIGFuIEFudCB0YXNrIHVzaW5nOgorICogPHByZT4KKyAqICAgJmx0O3Rhc2tkZWYgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmphc3Blci5Kc3BDIiBuYW1lPSJqYXNwZXIyIiAmZ3Q7CisgKiAgICAgICZsdDtjbGFzc3BhdGgmZ3Q7CisgKiAgICAgICAgICAmbHQ7cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7amF2YS5ob21lfS8uLi9saWIvdG9vbHMuamFyIi8mZ3Q7CisgKiAgICAgICAgICAmbHQ7ZmlsZXNldCBkaXI9IiR7RU5WLkNBVEFMSU5BX0hPTUV9L3NlcnZlci9saWIiJmd0OworICogICAgICAgICAgICAgICZsdDtpbmNsdWRlIG5hbWU9IiouamFyIi8mZ3Q7CisgKiAgICAgICAgICAmbHQ7L2ZpbGVzZXQmZ3Q7CisgKiAgICAgICAgICAmbHQ7ZmlsZXNldCBkaXI9IiR7RU5WLkNBVEFMSU5BX0hPTUV9L2NvbW1vbi9saWIiJmd0OworICogICAgICAgICAgICAgICZsdDtpbmNsdWRlIG5hbWU9IiouamFyIi8mZ3Q7CisgKiAgICAgICAgICAmbHQ7L2ZpbGVzZXQmZ3Q7CisgKiAgICAgICAgICAmbHQ7cGF0aCByZWZpZD0ibXlqYXJzIi8mZ3Q7CisgKiAgICAgICAmbHQ7L2NsYXNzcGF0aCZndDsKKyAqICAmbHQ7L3Rhc2tkZWYmZ3Q7CisgKgorICogICZsdDtqYXNwZXIyIHZlcmJvc2U9IjAiCisgKiAgICAgICAgICAgcGFja2FnZT0ibXkucGFja2FnZSIKKyAqICAgICAgICAgICB1cmlyb290PSIke3dlYmFwcHMuZGlyfS8ke3dlYmFwcC5uYW1lfSIKKyAqICAgICAgICAgICB3ZWJYbWxGcmFnbWVudD0iJHtidWlsZC5kaXJ9L2dlbmVyYXRlZF93ZWIueG1sIgorICogICAgICAgICAgIG91dHB1dERpcj0iJHt3ZWJhcHAuZGlyfS8ke3dlYmFwcC5uYW1lfS9XRUItSU5GL3NyYy9teS9wYWNrYWdlIiAvJmd0OworICogPC9wcmU+CisgKgorICogQGF1dGhvciBEYW5ubyBGZXJyaW4KKyAqIEBhdXRob3IgUGllcnJlIERlbGlzbGUKKyAqIEBhdXRob3IgQ29zdGluIE1hbm9sYWNoZQorICovCitwdWJsaWMgY2xhc3MgSnNwQyBpbXBsZW1lbnRzIE9wdGlvbnMgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9JRV9DTEFTU19JRCA9CisgICAgICAgICAgICAiY2xzaWQ6OEFEOUM4NDAtMDQ0RS0xMUQxLUIzRTktMDA4MDVGNDk5RDkzIjsKKworICAgIC8vIExvZ2dlcgorICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhKc3BDLmNsYXNzKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTV0lUQ0hfVkVSQk9TRSA9ICItdiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNXSVRDSF9IRUxQID0gIi1oZWxwIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1dJVENIX1FVSUVUID0gIi1xIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1dJVENIX09VVFBVVF9ESVIgPSAiLWQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTV0lUQ0hfSUVfQ0xBU1NfSUQgPSAiLWllcGx1Z2luIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1dJVENIX1BBQ0tBR0VfTkFNRSA9ICItcCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNXSVRDSF9DTEFTU19OQU1FID0gIi1jIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1dJVENIX0ZVTExfU1RPUCA9ICItLSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNXSVRDSF9DT01QSUxFID0gIi1jb21waWxlIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1dJVENIX1VSSV9CQVNFID0gIi11cmliYXNlIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1dJVENIX1VSSV9ST09UID0gIi11cmlyb290IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1dJVENIX0ZJTEVfV0VCQVBQID0gIi13ZWJhcHAiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTV0lUQ0hfV0VCQVBQX0lOQyA9ICItd2ViaW5jIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1dJVENIX1dFQkFQUF9YTUwgPSAiLXdlYnhtbCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNXSVRDSF9NQVBQRUQgPSAiLW1hcHBlZCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNXSVRDSF9YUE9XRVJFRF9CWSA9ICIteHBvd2VyZWRCeSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNXSVRDSF9UUklNX1NQQUNFUyA9ICItdHJpbVNwYWNlcyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNXSVRDSF9DTEFTU1BBVEggPSAiLWNsYXNzcGF0aCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNXSVRDSF9ESUUgPSAiLWRpZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNXSVRDSF9QT09MSU5HID0gIi1wb29saW5nRW5hYmxlZCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNXSVRDSF9FTkNPRElORyA9ICItamF2YUVuY29kaW5nIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0hPV19TVUNDRVNTID0iLXMiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMSVNUX0VSUk9SUyA9ICItbCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5PX1dFQlhNTCA9IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOQ19XRUJYTUwgPSAxMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQUxMX1dFQlhNTCA9IDIwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0RJRV9MRVZFTCA9IDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5PX0RJRV9MRVZFTCA9IDA7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBpbnNlcnRCZWZvcmUgPQorICAgIHsgIjwvd2ViLWFwcD4iLCAiPHNlcnZsZXQtbWFwcGluZz4iLCAiPHNlc3Npb24tY29uZmlnPiIsCisgICAgICAiPG1pbWUtbWFwcGluZz4iLCAiPHdlbGNvbWUtZmlsZS1saXN0PiIsICI8ZXJyb3ItcGFnZT4iLCAiPHRhZ2xpYj4iLAorICAgICAgIjxyZXNvdXJjZS1lbnYtcmVmPiIsICI8cmVzb3VyY2UtcmVmPiIsICI8c2VjdXJpdHktY29uc3RyYWludD4iLAorICAgICAgIjxsb2dpbi1jb25maWc+IiwgIjxzZWN1cml0eS1yb2xlPiIsICI8ZW52LWVudHJ5PiIsICI8ZWpiLXJlZj4iLAorICAgICAgIjxlamItbG9jYWwtcmVmPiIgfTsKKworICAgIHByaXZhdGUgc3RhdGljIGludCBkaWU7CisgICAgcHJpdmF0ZSBTdHJpbmcgY2xhc3NQYXRoID0gbnVsbDsKKyAgICBwcml2YXRlIFVSTENsYXNzTG9hZGVyIGxvYWRlciA9IG51bGw7CisgICAgcHJpdmF0ZSBib29sZWFuIHRyaW1TcGFjZXMgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gZ2VuU3RyaW5nQXNDaGFyQXJyYXkgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4geHBvd2VyZWRCeTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbWFwcGVkRmlsZSA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBwb29saW5nRW5hYmxlZCA9IHRydWU7CisgICAgcHJpdmF0ZSBGaWxlIHNjcmF0Y2hEaXI7CisgICAgcHJpdmF0ZSBTdHJpbmcgaWVDbGFzc0lkID0gREVGQVVMVF9JRV9DTEFTU19JRDsKKyAgICBwcml2YXRlIFN0cmluZyB0YXJnZXRQYWNrYWdlOworICAgIHByaXZhdGUgU3RyaW5nIHRhcmdldENsYXNzTmFtZTsKKyAgICBwcml2YXRlIFN0cmluZyB1cmlCYXNlOworICAgIHByaXZhdGUgU3RyaW5nIHVyaVJvb3Q7CisgICAgcHJpdmF0ZSBpbnQgZGllTGV2ZWw7CisgICAgcHJpdmF0ZSBib29sZWFuIGhlbHBOZWVkZWQgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gY29tcGlsZSA9IGZhbHNlOworCisgICAgcHJpdmF0ZSBTdHJpbmcgY29tcGlsZXIgPSBudWxsOworCisgICAgcHJpdmF0ZSBTdHJpbmcgY29tcGlsZXJUYXJnZXRWTSA9ICIxLjQiOworCisgICAgcHJpdmF0ZSBib29sZWFuIGNsYXNzRGVidWdJbmZvID0gdHJ1ZTsKKyAgICBwcml2YXRlIFZlY3RvciBleHRlbnNpb25zOworICAgIHByaXZhdGUgVmVjdG9yIHBhZ2VzID0gbmV3IFZlY3RvcigpOworICAgIHByaXZhdGUgYm9vbGVhbiBlcnJvck9uVXNlQmVhbkludmFsaWRDbGFzc0F0dHJpYnV0ZSA9IHRydWU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgamF2YSBmaWxlIGVuY29kaW5nLiAgRGVmYXVsdAorICAgICAqIGlzIFVURi04LiAgQWRkZWQgcGVyIGJ1Z3ppbGxhIDE5NjIyLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGphdmFFbmNvZGluZyA9ICJVVEYtOCI7CisKKyAgICAvLyBHZW5lcmF0aW9uIG9mIHdlYi54bWwgZnJhZ21lbnRzCisgICAgcHJpdmF0ZSBTdHJpbmcgd2VieG1sRmlsZTsKKyAgICBwcml2YXRlIGludCB3ZWJ4bWxMZXZlbDsKKyAgICBwcml2YXRlIGJvb2xlYW4gYWRkV2ViWG1sTWFwcGluZ3MgPSBmYWxzZTsKKworICAgIHByaXZhdGUgV3JpdGVyIG1hcG91dDsKKyAgICBwcml2YXRlIENoYXJBcnJheVdyaXRlciBzZXJ2bGV0b3V0OworICAgIHByaXZhdGUgQ2hhckFycmF5V3JpdGVyIG1hcHBpbmdvdXQ7CisKKyAgICBwcml2YXRlIEpzcENTZXJ2bGV0Q29udGV4dCBjb250ZXh0OworCisgICAgLy8gTWFpbnRhaW4gYSBkdW1teSBKc3BSdW50aW1lQ29udGV4dCBmb3IgY29tcGlsaW5nIHRhZyBmaWxlcworICAgIHByaXZhdGUgSnNwUnVudGltZUNvbnRleHQgcmN0eHQ7CisKKyAgICAvKioKKyAgICAgKiBDYWNoZSBmb3IgdGhlIFRMRCBsb2NhdGlvbnMKKyAgICAgKi8KKyAgICBwcml2YXRlIFRsZExvY2F0aW9uc0NhY2hlIHRsZExvY2F0aW9uc0NhY2hlID0gbnVsbDsKKworICAgIHByaXZhdGUgSnNwQ29uZmlnIGpzcENvbmZpZyA9IG51bGw7CisgICAgcHJpdmF0ZSBUYWdQbHVnaW5NYW5hZ2VyIHRhZ1BsdWdpbk1hbmFnZXIgPSBudWxsOworCisgICAgcHJpdmF0ZSBib29sZWFuIHZlcmJvc2UgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbGlzdEVycm9ycyA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBzaG93U3VjY2VzcyA9IGZhbHNlOworICAgIHByaXZhdGUgaW50IGFyZ1BvczsKKyAgICBwcml2YXRlIGJvb2xlYW4gZnVsbHN0b3AgPSBmYWxzZTsKKyAgICBwcml2YXRlIFN0cmluZyBhcmdzW107CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnW10pIHsKKyAgICAgICAgaWYgKGFyZy5sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKExvY2FsaXplci5nZXRNZXNzYWdlKCJqc3BjLnVzYWdlIikpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBKc3BDIGpzcGMgPSBuZXcgSnNwQygpOworICAgICAgICAgICAgICAgIGpzcGMuc2V0QXJncyhhcmcpOworICAgICAgICAgICAgICAgIGlmIChqc3BjLmhlbHBOZWVkZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKExvY2FsaXplci5nZXRNZXNzYWdlKCJqc3BjLnVzYWdlIikpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGpzcGMuZXhlY3V0ZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKEphc3BlckV4Y2VwdGlvbiBqZSkgeworICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihqZSk7CisgICAgICAgICAgICAgICAgLy9TeXN0ZW0uZXJyLnByaW50bG4oamUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICBpZiAoZGllICE9IE5PX0RJRV9MRVZFTCkgeworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXhpdChkaWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEFyZ3MoU3RyaW5nW10gYXJnKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgYXJncyA9IGFyZzsKKyAgICAgICAgU3RyaW5nIHRvazsKKworICAgICAgICBkaWVMZXZlbCA9IE5PX0RJRV9MRVZFTDsKKyAgICAgICAgZGllID0gZGllTGV2ZWw7CisKKyAgICAgICAgd2hpbGUgKCh0b2sgPSBuZXh0QXJnKCkpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmICh0b2suZXF1YWxzKFNXSVRDSF9WRVJCT1NFKSkgeworICAgICAgICAgICAgICAgIHZlcmJvc2UgPSB0cnVlOworICAgICAgICAgICAgICAgIHNob3dTdWNjZXNzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBsaXN0RXJyb3JzID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rLmVxdWFscyhTV0lUQ0hfT1VUUFVUX0RJUikpIHsKKyAgICAgICAgICAgICAgICB0b2sgPSBuZXh0QXJnKCk7CisgICAgICAgICAgICAgICAgc2V0T3V0cHV0RGlyKCB0b2sgKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rLmVxdWFscyhTV0lUQ0hfUEFDS0FHRV9OQU1FKSkgeworICAgICAgICAgICAgICAgIHRhcmdldFBhY2thZ2UgPSBuZXh0QXJnKCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHRvay5lcXVhbHMoU1dJVENIX0NPTVBJTEUpKSB7CisgICAgICAgICAgICAgICAgY29tcGlsZT10cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmICh0b2suZXF1YWxzKFNXSVRDSF9DTEFTU19OQU1FKSkgeworICAgICAgICAgICAgICAgIHRhcmdldENsYXNzTmFtZSA9IG5leHRBcmcoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rLmVxdWFscyhTV0lUQ0hfVVJJX0JBU0UpKSB7CisgICAgICAgICAgICAgICAgdXJpQmFzZT1uZXh0QXJnKCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHRvay5lcXVhbHMoU1dJVENIX1VSSV9ST09UKSkgeworICAgICAgICAgICAgICAgIHNldFVyaXJvb3QoIG5leHRBcmcoKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHRvay5lcXVhbHMoU1dJVENIX0ZJTEVfV0VCQVBQKSkgeworICAgICAgICAgICAgICAgIHNldFVyaXJvb3QoIG5leHRBcmcoKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCB0b2suZXF1YWxzKCBTSE9XX1NVQ0NFU1MgKSApIHsKKyAgICAgICAgICAgICAgICBzaG93U3VjY2VzcyA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCB0b2suZXF1YWxzKCBMSVNUX0VSUk9SUyApICkgeworICAgICAgICAgICAgICAgIGxpc3RFcnJvcnMgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmICh0b2suZXF1YWxzKFNXSVRDSF9XRUJBUFBfSU5DKSkgeworICAgICAgICAgICAgICAgIHdlYnhtbEZpbGUgPSBuZXh0QXJnKCk7CisgICAgICAgICAgICAgICAgaWYgKHdlYnhtbEZpbGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB3ZWJ4bWxMZXZlbCA9IElOQ19XRUJYTUw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmICh0b2suZXF1YWxzKFNXSVRDSF9XRUJBUFBfWE1MKSkgeworICAgICAgICAgICAgICAgIHdlYnhtbEZpbGUgPSBuZXh0QXJnKCk7CisgICAgICAgICAgICAgICAgaWYgKHdlYnhtbEZpbGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB3ZWJ4bWxMZXZlbCA9IEFMTF9XRUJYTUw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmICh0b2suZXF1YWxzKFNXSVRDSF9NQVBQRUQpKSB7CisgICAgICAgICAgICAgICAgbWFwcGVkRmlsZSA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHRvay5lcXVhbHMoU1dJVENIX1hQT1dFUkVEX0JZKSkgeworICAgICAgICAgICAgICAgIHhwb3dlcmVkQnkgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmICh0b2suZXF1YWxzKFNXSVRDSF9UUklNX1NQQUNFUykpIHsKKyAgICAgICAgICAgICAgICBzZXRUcmltU3BhY2VzKHRydWUpOworICAgICAgICAgICAgfSBlbHNlIGlmICh0b2suZXF1YWxzKFNXSVRDSF9DTEFTU1BBVEgpKSB7CisgICAgICAgICAgICAgICAgc2V0Q2xhc3NQYXRoKG5leHRBcmcoKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHRvay5zdGFydHNXaXRoKFNXSVRDSF9ESUUpKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgZGllTGV2ZWwgPSBJbnRlZ2VyLnBhcnNlSW50KAorICAgICAgICAgICAgICAgICAgICAgICAgdG9rLnN1YnN0cmluZyhTV0lUQ0hfRElFLmxlbmd0aCgpKSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgeworICAgICAgICAgICAgICAgICAgICBkaWVMZXZlbCA9IERFRkFVTFRfRElFX0xFVkVMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkaWUgPSBkaWVMZXZlbDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rLmVxdWFscyhTV0lUQ0hfSEVMUCkpIHsKKyAgICAgICAgICAgICAgICBoZWxwTmVlZGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rLmVxdWFscyhTV0lUQ0hfUE9PTElORykpIHsKKyAgICAgICAgICAgICAgICB0b2sgPSBuZXh0QXJnKCk7CisgICAgICAgICAgICAgICAgaWYgKCJmYWxzZSIuZXF1YWxzKHRvaykpIHsKKyAgICAgICAgICAgICAgICAgICAgcG9vbGluZ0VuYWJsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBwb29saW5nRW5hYmxlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmICh0b2suZXF1YWxzKFNXSVRDSF9FTkNPRElORykpIHsKKyAgICAgICAgICAgICAgICBzZXRKYXZhRW5jb2RpbmcobmV4dEFyZygpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHRvay5zdGFydHNXaXRoKCItIikpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEphc3BlckV4Y2VwdGlvbigiVW5yZWNvZ25pemVkIG9wdGlvbjogIiArIHRvayArCisgICAgICAgICAgICAgICAgICAgICAgICAiLiAgVXNlIC1oZWxwIGZvciBoZWxwLiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIWZ1bGxzdG9wKSB7CisgICAgICAgICAgICAgICAgICAgIGFyZ1Bvcy0tOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBTdGFydCB0cmVhdGluZyB0aGUgcmVzdCBhcyBKU1AgUGFnZXMKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEFkZCBhbGwgZXh0cmEgYXJndW1lbnRzIHRvIHRoZSBsaXN0IG9mIGZpbGVzCisgICAgICAgIHdoaWxlKCB0cnVlICkgeworICAgICAgICAgICAgU3RyaW5nIGZpbGUgPSBuZXh0RmlsZSgpOworICAgICAgICAgICAgaWYoIGZpbGU9PW51bGwgKSBicmVhazsKKyAgICAgICAgICAgIHBhZ2VzLmFkZEVsZW1lbnQoIGZpbGUgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGdldEtlZXBHZW5lcmF0ZWQoKSB7CisgICAgICAgIC8vIGlzbid0IHRoaXMgd2h5IHdlIGFyZSBydW5uaW5nIGpzcGM/CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGdldFRyaW1TcGFjZXMoKSB7CisgICAgICAgIHJldHVybiB0cmltU3BhY2VzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFRyaW1TcGFjZXMoYm9vbGVhbiB0cykgeworICAgICAgICB0aGlzLnRyaW1TcGFjZXMgPSB0czsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1Bvb2xpbmdFbmFibGVkKCkgeworICAgICAgICByZXR1cm4gcG9vbGluZ0VuYWJsZWQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UG9vbGluZ0VuYWJsZWQoYm9vbGVhbiBwb29saW5nRW5hYmxlZCkgeworICAgICAgICB0aGlzLnBvb2xpbmdFbmFibGVkID0gcG9vbGluZ0VuYWJsZWQ7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNYcG93ZXJlZEJ5KCkgeworICAgICAgICByZXR1cm4geHBvd2VyZWRCeTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRYcG93ZXJlZEJ5KGJvb2xlYW4geHBvd2VyZWRCeSkgeworICAgICAgICB0aGlzLnhwb3dlcmVkQnkgPSB4cG93ZXJlZEJ5OworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGdldEVycm9yT25Vc2VCZWFuSW52YWxpZENsYXNzQXR0cmlidXRlKCkgeworICAgICAgICByZXR1cm4gZXJyb3JPblVzZUJlYW5JbnZhbGlkQ2xhc3NBdHRyaWJ1dGU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RXJyb3JPblVzZUJlYW5JbnZhbGlkQ2xhc3NBdHRyaWJ1dGUoYm9vbGVhbiBiKSB7CisgICAgICAgIGVycm9yT25Vc2VCZWFuSW52YWxpZENsYXNzQXR0cmlidXRlID0gYjsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFRhZ1Bvb2xTaXplKCkgeworICAgICAgICByZXR1cm4gQ29uc3RhbnRzLk1BWF9QT09MX1NJWkU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXJlIHdlIHN1cHBvcnRpbmcgSFRNTCBtYXBwZWQgc2VydmxldHM/CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0TWFwcGVkRmlsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1hcHBlZEZpbGU7CisgICAgfQorCisgICAgLy8gT2ZmLWxpbmUgY29tcGlsZXIsIG5vIG5lZWQgZm9yIHNlY3VyaXR5IG1hbmFnZXIKKyAgICBwdWJsaWMgT2JqZWN0IGdldFByb3RlY3Rpb25Eb21haW4oKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGdldFNlbmRFcnJvclRvQ2xpZW50KCkgeworICAgICAgICAvLyBpbXBsaWVkIHNlbmQgdG8gU3lzdGVtLmVycgorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc0RlYnVnSW5mbyggYm9vbGVhbiBiICkgeworICAgICAgICBjbGFzc0RlYnVnSW5mbz1iOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGdldENsYXNzRGVidWdJbmZvKCkgeworICAgICAgICAvLyBjb21waWxlIHdpdGggZGVidWcgaW5mbworICAgICAgICByZXR1cm4gY2xhc3NEZWJ1Z0luZm87CisgICAgfQorCisgICAgLyoqCisgICAgICogQmFja2dyb3VuZCBjb21waWxhdGlvbiBjaGVjayBpbnRlcnZhbHMgaW4gc2Vjb25kcworICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0Q2hlY2tJbnRlcnZhbCgpIHsKKyAgICAgICAgcmV0dXJuIDMwMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNb2RpZmljYXRpb24gdGVzdCBpbnRlcnZhbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldE1vZGlmaWNhdGlvblRlc3RJbnRlcnZhbCgpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogSXMgSmFzcGVyIGJlaW5nIHVzZWQgaW4gZGV2ZWxvcG1lbnQgbW9kZT8KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXREZXZlbG9wbWVudCgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEpTUCByZWxvYWRpbmcgY2hlY2sgPworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldFJlbG9hZGluZygpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogSXMgdGhlIGdlbmVyYXRpb24gb2YgU01BUCBpbmZvIGZvciBKU1I0NSBkZWJ1Z2dpbiBzdXBwcmVzc2VkPworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzU21hcFN1cHByZXNzZWQoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNob3VsZCBTTUFQIGluZm8gZm9yIEpTUjQ1IGRlYnVnZ2luZyBiZSBkdW1wZWQgdG8gYSBmaWxlPworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzU21hcER1bXBlZCgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIERldGVybWluZXMgd2hldGhlciB0ZXh0IHN0cmluZ3MgYXJlIHRvIGJlIGdlbmVyYXRlZCBhcyBjaGFyIGFycmF5cywKKyAgICAgKiB3aGljaCBpbXByb3ZlcyBwZXJmb3JtYW5jZSBpbiBzb21lIGNhc2VzLgorICAgICAqCisgICAgICogQHBhcmFtIGdlblN0cmluZ0FzQ2hhckFycmF5IHRydWUgaWYgdGV4dCBzdHJpbmdzIGFyZSB0byBiZSBnZW5lcmF0ZWQgYXMKKyAgICAgKiBjaGFyIGFycmF5cywgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0R2VuU3RyaW5nQXNDaGFyQXJyYXkoYm9vbGVhbiBnZW5TdHJpbmdBc0NoYXJBcnJheSkgeworICAgICAgICB0aGlzLmdlblN0cmluZ0FzQ2hhckFycmF5ID0gZ2VuU3RyaW5nQXNDaGFyQXJyYXk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGV4dCBzdHJpbmdzIGFyZSB0byBiZSBnZW5lcmF0ZWQgYXMgY2hhciBhcnJheXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGV4dCBzdHJpbmdzIGFyZSB0byBiZSBnZW5lcmF0ZWQgYXMgY2hhciBhcnJheXMsIGZhbHNlCisgICAgICogb3RoZXJ3aXNlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2VuU3RyaW5nQXNDaGFyQXJyYXkoKSB7CisgICAgICAgIHJldHVybiBnZW5TdHJpbmdBc0NoYXJBcnJheTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBjbGFzcy1pZCB2YWx1ZSB0byBiZSBzZW50IHRvIEludGVybmV0IEV4cGxvcmVyIHdoZW4gdXNpbmcKKyAgICAgKiA8anNwOnBsdWdpbj4gdGFncy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpZUNsYXNzSWQgQ2xhc3MtaWQgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJZUNsYXNzSWQoU3RyaW5nIGllQ2xhc3NJZCkgeworICAgICAgICB0aGlzLmllQ2xhc3NJZCA9IGllQ2xhc3NJZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBjbGFzcy1pZCB2YWx1ZSB0aGF0IGlzIHNlbnQgdG8gSW50ZXJuZXQgRXhwbG9yZXIgd2hlbiB1c2luZworICAgICAqIDxqc3A6cGx1Z2luPiB0YWdzLgorICAgICAqCisgICAgICogQHJldHVybiBDbGFzcy1pZCB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWVDbGFzc0lkKCkgeworICAgICAgICByZXR1cm4gaWVDbGFzc0lkOworICAgIH0KKworICAgIHB1YmxpYyBGaWxlIGdldFNjcmF0Y2hEaXIoKSB7CisgICAgICAgIHJldHVybiBzY3JhdGNoRGlyOworICAgIH0KKworICAgIHB1YmxpYyBDbGFzcyBnZXRKc3BDb21waWxlclBsdWdpbigpIHsKKyAgICAgICAvLyB3ZSBkb24ndCBjb21waWxlLCBzbyB0aGlzIGlzIG1lYW5saW5nbGVzcworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEpzcENvbXBpbGVyUGF0aCgpIHsKKyAgICAgICAvLyB3ZSBkb24ndCBjb21waWxlLCBzbyB0aGlzIGlzIG1lYW5saW5nbGVzcworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21waWxlciB0byB1c2UuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDb21waWxlcigpIHsKKyAgICAgICAgcmV0dXJuIGNvbXBpbGVyOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENvbXBpbGVyKFN0cmluZyBjKSB7CisgICAgICAgIGNvbXBpbGVyPWM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSBPcHRpb25zI2dldENvbXBpbGVyVGFyZ2V0Vk0KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbXBpbGVyVGFyZ2V0Vk0oKSB7CisgICAgICAgIHJldHVybiBjb21waWxlclRhcmdldFZNOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENvbXBpbGVUYXJnZXRWTShTdHJpbmcgdm0pIHsKKyAgICAgICAgY29tcGlsZXJUYXJnZXRWTSA9IHZtOworICAgIH0KKworICAgIHB1YmxpYyBUbGRMb2NhdGlvbnNDYWNoZSBnZXRUbGRMb2NhdGlvbnNDYWNoZSgpIHsKKyAgICByZXR1cm4gdGxkTG9jYXRpb25zQ2FjaGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZW5jb2RpbmcgdG8gdXNlIGZvcgorICAgICAqIGphdmEgZmlsZXMuICBUaGUgZGVmYXVsdCBpcyBVVEYtOC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gU3RyaW5nIFRoZSBlbmNvZGluZworICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SmF2YUVuY29kaW5nKCkgeworICAgICAgICByZXR1cm4gamF2YUVuY29kaW5nOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGVuY29kaW5nIHRvIHVzZSBmb3IKKyAgICAgKiBqYXZhIGZpbGVzLgorICAgICAqCisgICAgICogQHBhcmFtIGVuY29kaW5nTmFtZSBUaGUgbmFtZSwgZS5nLiAiVVRGLTgiCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SmF2YUVuY29kaW5nKFN0cmluZyBlbmNvZGluZ05hbWUpIHsKKyAgICAgICAgamF2YUVuY29kaW5nID0gZW5jb2RpbmdOYW1lOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGdldEZvcmsoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzUGF0aCgpIHsKKyAgICAgICAgaWYoIGNsYXNzUGF0aCAhPSBudWxsICkKKyAgICAgICAgICAgIHJldHVybiBjbGFzc1BhdGg7CisgICAgICAgIHJldHVybiBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuY2xhc3MucGF0aCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENsYXNzUGF0aChTdHJpbmcgcykgeworICAgICAgICBjbGFzc1BhdGg9czsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCYXNlIGRpciBmb3IgdGhlIHdlYmFwcC4gVXNlZCB0byBnZW5lcmF0ZSBjbGFzcyBuYW1lcyBhbmQgcmVzb2x2ZQorICAgICAqIGluY2x1ZGVzCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VXJpcm9vdCggU3RyaW5nIHMgKSB7CisgICAgICAgIGlmKCBzPT1udWxsICkgeworICAgICAgICAgICAgdXJpUm9vdD1zOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB1cmlSb290PW5ldyBGaWxlKCBzICkuZ2V0Q2Fub25pY2FsUGF0aCgpOworICAgICAgICB9IGNhdGNoKCBFeGNlcHRpb24gZXggKSB7CisgICAgICAgICAgICB1cmlSb290PXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIFBhcnNlcyBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBKU1AgZmlsZXMgdG8gYmUgcHJvY2Vzc2VkLgorICAgICAqCisgICAgICogPHA+RWFjaCBmaWxlIGlzIGludGVycHJldGVkIHJlbGF0aXZlIHRvIHVyaXJvb3QsIHVubGVzcyBpdCBpcyBhYnNvbHV0ZSwKKyAgICAgKiBpbiB3aGljaCBjYXNlIGl0IG11c3Qgc3RhcnQgd2l0aCB1cmlyb290LgorICAgICAqCisgICAgICogQHBhcmFtIGpzcEZpbGVzIENvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIEpTUCBmaWxlcyB0byBiZSBwcm9jZXNzZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRKc3BGaWxlcyhTdHJpbmcganNwRmlsZXMpIHsKKyAgICAgICAgU3RyaW5nVG9rZW5pemVyIHRvayA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoanNwRmlsZXMsICIgLCIpOworICAgICAgICB3aGlsZSAodG9rLmhhc01vcmVUb2tlbnMoKSkgeworICAgICAgICAgICAgcGFnZXMuYWRkRWxlbWVudCh0b2submV4dFRva2VuKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q29tcGlsZSggYm9vbGVhbiBiICkgeworICAgICAgICBjb21waWxlPWI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VmVyYm9zZSggaW50IGxldmVsICkgeworICAgICAgICBpZiAobGV2ZWwgPiAwKSB7CisgICAgICAgICAgICB2ZXJib3NlID0gdHJ1ZTsKKyAgICAgICAgICAgIHNob3dTdWNjZXNzID0gdHJ1ZTsKKyAgICAgICAgICAgIGxpc3RFcnJvcnMgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VmFsaWRhdGVYbWwoIGJvb2xlYW4gYiApIHsKKyAgICAgICAgb3JnLmFwYWNoZS5qYXNwZXIueG1scGFyc2VyLlBhcnNlclV0aWxzLnZhbGlkYXRpbmc9YjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRMaXN0RXJyb3JzKCBib29sZWFuIGIgKSB7CisgICAgICAgIGxpc3RFcnJvcnMgPSBiOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE91dHB1dERpciggU3RyaW5nIHMgKSB7CisgICAgICAgIGlmKCBzIT0gbnVsbCApIHsKKyAgICAgICAgICAgIHNjcmF0Y2hEaXIgPSBuZXcgRmlsZShzKS5nZXRBYnNvbHV0ZUZpbGUoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNjcmF0Y2hEaXI9bnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBhY2thZ2UoIFN0cmluZyBwICkgeworICAgICAgICB0YXJnZXRQYWNrYWdlPXA7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xhc3MgbmFtZSBvZiB0aGUgZ2VuZXJhdGVkIGZpbGUgKCB3aXRob3V0IHBhY2thZ2UgKS4KKyAgICAgKiBDYW4gb25seSBiZSB1c2VkIGlmIGEgc2luZ2xlIGZpbGUgaXMgY29udmVydGVkLgorICAgICAqIFhYWCBEbyB3ZSBuZWVkIHRoaXMgZmVhdHVyZSA/CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2xhc3NOYW1lKCBTdHJpbmcgcCApIHsKKyAgICAgICAgdGFyZ2V0Q2xhc3NOYW1lPXA7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmlsZSB3aGVyZSB3ZSBnZW5lcmF0ZSBhIHdlYi54bWwgZnJhZ21lbnQgd2l0aCB0aGUgY2xhc3MgZGVmaW5pdGlvbnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0V2ViWG1sRnJhZ21lbnQoIFN0cmluZyBzICkgeworICAgICAgICB3ZWJ4bWxGaWxlPXM7CisgICAgICAgIHdlYnhtbExldmVsPUlOQ19XRUJYTUw7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmlsZSB3aGVyZSB3ZSBnZW5lcmF0ZSBhIGNvbXBsZXRlIHdlYi54bWwgd2l0aCB0aGUgY2xhc3MgZGVmaW5pdGlvbnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0V2ViWG1sKCBTdHJpbmcgcyApIHsKKyAgICAgICAgd2VieG1sRmlsZT1zOworICAgICAgICB3ZWJ4bWxMZXZlbD1BTExfV0VCWE1MOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEFkZFdlYlhtbE1hcHBpbmdzKGJvb2xlYW4gYikgeworICAgICAgICBhZGRXZWJYbWxNYXBwaW5ncyA9IGI7CisgICAgfQorCisgICAgLyoqCisgICAgICogT2J0YWluIEpTUCBjb25maWd1cmF0aW9uIGluZm9ybWFudGlvbiBzcGVjaWZpZWQgaW4gd2ViLnhtbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgSnNwQ29uZmlnIGdldEpzcENvbmZpZygpIHsKKyAgICAgICAgcmV0dXJuIGpzcENvbmZpZzsKKyAgICB9CisKKyAgICBwdWJsaWMgVGFnUGx1Z2luTWFuYWdlciBnZXRUYWdQbHVnaW5NYW5hZ2VyKCkgeworICAgICAgICByZXR1cm4gdGFnUGx1Z2luTWFuYWdlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnZW5lcmF0ZVdlYk1hcHBpbmcoIFN0cmluZyBmaWxlLCBKc3BDb21waWxhdGlvbkNvbnRleHQgY2xjdHh0ICkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gY2xjdHh0LmdldFNlcnZsZXRDbGFzc05hbWUoKTsKKyAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gY2xjdHh0LmdldFNlcnZsZXRQYWNrYWdlTmFtZSgpOworCisgICAgICAgIFN0cmluZyB0aGlzU2VydmxldE5hbWU7CisgICAgICAgIGlmICAoIiIuZXF1YWxzKHBhY2thZ2VOYW1lKSkgeworICAgICAgICAgICAgdGhpc1NlcnZsZXROYW1lID0gY2xhc3NOYW1lOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhpc1NlcnZsZXROYW1lID0gcGFja2FnZU5hbWUgKyAnLicgKyBjbGFzc05hbWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2VydmxldG91dCAhPSBudWxsKSB7CisgICAgICAgICAgICBzZXJ2bGV0b3V0LndyaXRlKCJcbiAgICA8c2VydmxldD5cbiAgICAgICAgPHNlcnZsZXQtbmFtZT4iKTsKKyAgICAgICAgICAgIHNlcnZsZXRvdXQud3JpdGUodGhpc1NlcnZsZXROYW1lKTsKKyAgICAgICAgICAgIHNlcnZsZXRvdXQud3JpdGUoIjwvc2VydmxldC1uYW1lPlxuICAgICAgICA8c2VydmxldC1jbGFzcz4iKTsKKyAgICAgICAgICAgIHNlcnZsZXRvdXQud3JpdGUodGhpc1NlcnZsZXROYW1lKTsKKyAgICAgICAgICAgIHNlcnZsZXRvdXQud3JpdGUoIjwvc2VydmxldC1jbGFzcz5cbiAgICA8L3NlcnZsZXQ+XG4iKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobWFwcGluZ291dCAhPSBudWxsKSB7CisgICAgICAgICAgICBtYXBwaW5nb3V0LndyaXRlKCJcbiAgICA8c2VydmxldC1tYXBwaW5nPlxuICAgICAgICA8c2VydmxldC1uYW1lPiIpOworICAgICAgICAgICAgbWFwcGluZ291dC53cml0ZSh0aGlzU2VydmxldE5hbWUpOworICAgICAgICAgICAgbWFwcGluZ291dC53cml0ZSgiPC9zZXJ2bGV0LW5hbWU+XG4gICAgICAgIDx1cmwtcGF0dGVybj4iKTsKKyAgICAgICAgICAgIG1hcHBpbmdvdXQud3JpdGUoZmlsZS5yZXBsYWNlKCdcXCcsICcvJykpOworICAgICAgICAgICAgbWFwcGluZ291dC53cml0ZSgiPC91cmwtcGF0dGVybj5cbiAgICA8L3NlcnZsZXQtbWFwcGluZz5cbiIpOworCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmNsdWRlIHRoZSBnZW5lcmF0ZWQgd2ViLnhtbCBpbnNpZGUgdGhlIHdlYmFwcCdzIHdlYi54bWwuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgbWVyZ2VJbnRvV2ViWG1sKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICBGaWxlIHdlYmFwcEJhc2UgPSBuZXcgRmlsZSh1cmlSb290KTsKKyAgICAgICAgRmlsZSB3ZWJYbWwgPSBuZXcgRmlsZSh3ZWJhcHBCYXNlLCAiV0VCLUlORi93ZWIueG1sIik7CisgICAgICAgIEZpbGUgd2ViWG1sMiA9IG5ldyBGaWxlKHdlYmFwcEJhc2UsICJXRUItSU5GL3dlYjIueG1sIik7CisgICAgICAgIFN0cmluZyBpbnNlcnRTdGFydE1hcmtlciA9CisgICAgICAgICAgICBMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgianNwYy53ZWJpbmMuaW5zZXJ0U3RhcnQiKTsKKyAgICAgICAgU3RyaW5nIGluc2VydEVuZE1hcmtlciA9CisgICAgICAgICAgICBMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgianNwYy53ZWJpbmMuaW5zZXJ0RW5kIik7CisKKyAgICAgICAgQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKHdlYlhtbCkpOworICAgICAgICBCdWZmZXJlZFJlYWRlciBmcmFnbWVudFJlYWRlciA9CisgICAgICAgICAgICBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIod2VieG1sRmlsZSkpOworICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIobmV3IEZpbGVXcml0ZXIod2ViWG1sMikpOworCisgICAgICAgIC8vIEluc2VydCB0aGUgPHNlcnZsZXQ+IGFuZCA8c2VydmxldC1tYXBwaW5nPiBkZWNsYXJhdGlvbnMKKyAgICAgICAgaW50IHBvcyA9IC0xOworICAgICAgICBTdHJpbmcgbGluZSA9IG51bGw7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCk7CisgICAgICAgICAgICBpZiAobGluZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBTa2lwIGFueXRoaW5nIHByZXZpb3VzbHkgZ2VuZXJhdGVkIGJ5IEpTUEMKKyAgICAgICAgICAgIGlmIChsaW5lLmluZGV4T2YoaW5zZXJ0U3RhcnRNYXJrZXIpID49IDApIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgICAgICBsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobGluZS5pbmRleE9mKGluc2VydEVuZE1hcmtlcikgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9IHJlYWRlci5yZWFkTGluZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9IHJlYWRlci5yZWFkTGluZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnNlcnRCZWZvcmUubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBwb3MgPSBsaW5lLmluZGV4T2YoaW5zZXJ0QmVmb3JlW2ldKTsKKyAgICAgICAgICAgICAgICBpZiAocG9zID49IDApCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBvcyA+PSAwKSB7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KGxpbmUuc3Vic3RyaW5nKDAsIHBvcykpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihsaW5lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHdyaXRlci5wcmludGxuKGluc2VydFN0YXJ0TWFya2VyKTsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIFN0cmluZyBsaW5lMiA9IGZyYWdtZW50UmVhZGVyLnJlYWRMaW5lKCk7CisgICAgICAgICAgICBpZiAobGluZTIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihsaW5lMik7CisgICAgICAgIH0KKyAgICAgICAgd3JpdGVyLnByaW50bG4oaW5zZXJ0RW5kTWFya2VyKTsKKyAgICAgICAgd3JpdGVyLnByaW50bG4oKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBvczsgaSsrKSB7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoIiAiKTsKKyAgICAgICAgfQorICAgICAgICB3cml0ZXIucHJpbnRsbihsaW5lLnN1YnN0cmluZyhwb3MpKTsKKworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgbGluZSA9IHJlYWRlci5yZWFkTGluZSgpOworICAgICAgICAgICAgaWYgKGxpbmUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd3JpdGVyLnByaW50bG4obGluZSk7CisgICAgICAgIH0KKyAgICAgICAgd3JpdGVyLmNsb3NlKCk7CisKKyAgICAgICAgcmVhZGVyLmNsb3NlKCk7CisgICAgICAgIGZyYWdtZW50UmVhZGVyLmNsb3NlKCk7CisKKyAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0od2ViWG1sMik7CisgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0od2ViWG1sKTsKKworICAgICAgICBieXRlIGJ1ZltdID0gbmV3IGJ5dGVbNTEyXTsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIGludCBuID0gZmlzLnJlYWQoYnVmKTsKKyAgICAgICAgICAgIGlmIChuIDwgMCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9zLndyaXRlKGJ1ZiwgMCwgbik7CisgICAgICAgIH0KKworICAgICAgICBmaXMuY2xvc2UoKTsKKyAgICAgICAgZm9zLmNsb3NlKCk7CisKKyAgICAgICAgd2ViWG1sMi5kZWxldGUoKTsKKyAgICAgICAgKG5ldyBGaWxlKHdlYnhtbEZpbGUpKS5kZWxldGUoKTsKKworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzRmlsZShTdHJpbmcgZmlsZSkKKyAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIHNldCB1cCBhIHNjcmF0Y2gvb3V0cHV0IGRpciBpZiBub25lIGlzIHByb3ZpZGVkCisgICAgICAgICAgICBpZiAoc2NyYXRjaERpciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHRlbXAgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaW8udG1wZGlyIik7CisgICAgICAgICAgICAgICAgaWYgKHRlbXAgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0ZW1wID0gIiI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNjcmF0Y2hEaXIgPSBuZXcgRmlsZShuZXcgRmlsZSh0ZW1wKS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0cmluZyBqc3BVcmk9ZmlsZS5yZXBsYWNlKCdcXCcsJy8nKTsKKyAgICAgICAgICAgIEpzcENvbXBpbGF0aW9uQ29udGV4dCBjbGN0eHQgPSBuZXcgSnNwQ29tcGlsYXRpb25Db250ZXh0CisgICAgICAgICAgICAgICAgKCBqc3BVcmksIGZhbHNlLCAgdGhpcywgY29udGV4dCwgbnVsbCwgcmN0eHQgKTsKKworICAgICAgICAgICAgLyogT3ZlcnJpZGUgdGhlIGRlZmF1bHRzICovCisgICAgICAgICAgICBpZiAoKHRhcmdldENsYXNzTmFtZSAhPSBudWxsKSAmJiAodGFyZ2V0Q2xhc3NOYW1lLmxlbmd0aCgpID4gMCkpIHsKKyAgICAgICAgICAgICAgICBjbGN0eHQuc2V0U2VydmxldENsYXNzTmFtZSh0YXJnZXRDbGFzc05hbWUpOworICAgICAgICAgICAgICAgIHRhcmdldENsYXNzTmFtZSA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodGFyZ2V0UGFja2FnZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY2xjdHh0LnNldFNlcnZsZXRQYWNrYWdlTmFtZSh0YXJnZXRQYWNrYWdlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoIGxvYWRlcj09bnVsbCApCisgICAgICAgICAgICAgICAgaW5pdENsYXNzTG9hZGVyKCBjbGN0eHQgKTsKKworICAgICAgICAgICAgY2xjdHh0LnNldENsYXNzTG9hZGVyKGxvYWRlcik7CisgICAgICAgICAgICBjbGN0eHQuc2V0Q2xhc3NQYXRoKGNsYXNzUGF0aCk7CisKKyAgICAgICAgICAgIENvbXBpbGVyIGNsYyA9IGNsY3R4dC5jcmVhdGVDb21waWxlcigpOworCisgICAgICAgICAgICAvLyBJZiBjb21waWxlIGlzIHNldCwgZ2VuZXJhdGUgYm90aCAuamF2YSBhbmQgLmNsYXNzLCBpZgorICAgICAgICAgICAgLy8gLmpzcCBmaWxlIGlzIG5ld2VyIHRoYW4gLmNsYXNzIGZpbGU7CisgICAgICAgICAgICAvLyBPdGhlcndpc2Ugb25seSBnZW5lcmF0ZSAuamF2YSwgaWYgLmpzcCBmaWxlIGlzIG5ld2VyIHRoYW4KKyAgICAgICAgICAgIC8vIHRoZSAuamF2YSBmaWxlCisgICAgICAgICAgICBpZiggY2xjLmlzT3V0RGF0ZWQoY29tcGlsZSkgKSB7CisgICAgICAgICAgICAgICAgY2xjLmNvbXBpbGUoY29tcGlsZSwgdHJ1ZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEdlbmVyYXRlIG1hcHBpbmcKKyAgICAgICAgICAgIGdlbmVyYXRlV2ViTWFwcGluZyggZmlsZSwgY2xjdHh0ICk7CisgICAgICAgICAgICBpZiAoIHNob3dTdWNjZXNzICkgeworICAgICAgICAgICAgICAgIGxvZy5pbmZvKCAiQnVpbHQgRmlsZTogIiArIGZpbGUgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGNhdGNoIChKYXNwZXJFeGNlcHRpb24gamUpIHsKKyAgICAgICAgICAgIFRocm93YWJsZSByb290Q2F1c2UgPSBqZTsKKyAgICAgICAgICAgIHdoaWxlIChyb290Q2F1c2UgaW5zdGFuY2VvZiBKYXNwZXJFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgJiYgKChKYXNwZXJFeGNlcHRpb24pIHJvb3RDYXVzZSkuZ2V0Um9vdENhdXNlKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJvb3RDYXVzZSA9ICgoSmFzcGVyRXhjZXB0aW9uKSByb290Q2F1c2UpLmdldFJvb3RDYXVzZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJvb3RDYXVzZSAhPSBqZSkgeworICAgICAgICAgICAgICAgIGxvZy5lcnJvcihMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgianNwYy5lcnJvci5nZW5lcmFsRXhjZXB0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RDYXVzZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBqZTsKKworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgaWYgKChlIGluc3RhbmNlb2YgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKSAmJiBsb2cuaXNXYXJuRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgbG9nLndhcm4oTG9jYWxpemVyLmdldE1lc3NhZ2UoImpzcGMuZXJyb3IuZmlsZURvZXNOb3RFeGlzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRNZXNzYWdlKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IG5ldyBKYXNwZXJFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2NhdGUgYWxsIGpzcCBmaWxlcyBpbiB0aGUgd2ViYXBwLiBVc2VkIGlmIG5vIGV4cGxpY2l0CisgICAgICoganNwcyBhcmUgc3BlY2lmaWVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNjYW5GaWxlcyggRmlsZSBiYXNlICkgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgIFN0YWNrIGRpcnMgPSBuZXcgU3RhY2soKTsKKyAgICAgICAgZGlycy5wdXNoKGJhc2UpOworICAgICAgICBpZiAoZXh0ZW5zaW9ucyA9PSBudWxsKSB7CisgICAgICAgICAgICBleHRlbnNpb25zID0gbmV3IFZlY3RvcigpOworICAgICAgICAgICAgZXh0ZW5zaW9ucy5hZGRFbGVtZW50KCJqc3AiKTsKKyAgICAgICAgICAgIGV4dGVuc2lvbnMuYWRkRWxlbWVudCgianNweCIpOworICAgICAgICB9CisgICAgICAgIHdoaWxlICghZGlycy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBzID0gZGlycy5wb3AoKS50b1N0cmluZygpOworICAgICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUocyk7CisgICAgICAgICAgICBpZiAoZi5leGlzdHMoKSAmJiBmLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmdbXSBmaWxlcyA9IGYubGlzdCgpOworICAgICAgICAgICAgICAgIFN0cmluZyBleHQ7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IChmaWxlcyAhPSBudWxsKSAmJiBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgRmlsZSBmMiA9IG5ldyBGaWxlKHMsIGZpbGVzW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGYyLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpcnMucHVzaChmMi5nZXRQYXRoKCkpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBmMi5nZXRQYXRoKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdXJpID0gcGF0aC5zdWJzdHJpbmcodXJpUm9vdC5sZW5ndGgoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBleHQgPSBmaWxlc1tpXS5zdWJzdHJpbmcoZmlsZXNbaV0ubGFzdEluZGV4T2YoJy4nKSArMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXh0ZW5zaW9ucy5jb250YWlucyhleHQpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAganNwQ29uZmlnLmlzSnNwUGFnZSh1cmkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZXMuYWRkRWxlbWVudChwYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKHVyaVJvb3QgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmKCBwYWdlcy5zaXplKCkgPT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEphc3BlckV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsaXplci5nZXRNZXNzYWdlKCJqc3AuZXJyb3IuanNwYy5taXNzaW5nVGFyZ2V0IikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTdHJpbmcgZmlyc3RKc3A9KFN0cmluZylwYWdlcy5lbGVtZW50QXQoIDAgKTsKKyAgICAgICAgICAgICAgICBGaWxlIGZpcnN0SnNwRiA9IG5ldyBGaWxlKCBmaXJzdEpzcCApOworICAgICAgICAgICAgICAgIGlmICghZmlyc3RKc3BGLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBKYXNwZXJFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgianNwYy5lcnJvci5maWxlRG9lc05vdEV4aXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0SnNwKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxvY2F0ZVVyaVJvb3QoIGZpcnN0SnNwRiApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodXJpUm9vdCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEphc3BlckV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgTG9jYWxpemVyLmdldE1lc3NhZ2UoImpzcC5lcnJvci5qc3BjLm5vX3VyaXJvb3QiKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKCBjb250ZXh0PT1udWxsICkgeworICAgICAgICAgICAgICAgIGluaXRTZXJ2bGV0Q29udGV4dCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBObyBleHBsaWNpdCBwYWdlcywgd2UnbGwgcHJvY2VzcyBhbGwgLmpzcCBpbiB0aGUgd2ViYXBwCisgICAgICAgICAgICBpZiAocGFnZXMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICBzY2FuRmlsZXMoIG5ldyBGaWxlKCB1cmlSb290ICkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBGaWxlIHVyaVJvb3RGID0gbmV3IEZpbGUodXJpUm9vdCk7CisgICAgICAgICAgICBpZiAoIXVyaVJvb3RGLmV4aXN0cygpIHx8ICF1cmlSb290Ri5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEphc3BlckV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgTG9jYWxpemVyLmdldE1lc3NhZ2UoImpzcC5lcnJvci5qc3BjLnVyaXJvb3Rfbm90X2RpciIpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW5pdFdlYlhtbCgpOworCisgICAgICAgICAgICBFbnVtZXJhdGlvbiBlID0gcGFnZXMuZWxlbWVudHMoKTsKKyAgICAgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIG5leHRqc3AgPSBlLm5leHRFbGVtZW50KCkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBGaWxlIGZqc3AgPSBuZXcgRmlsZShuZXh0anNwKTsKKyAgICAgICAgICAgICAgICBpZiAoIWZqc3AuaXNBYnNvbHV0ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGZqc3AgPSBuZXcgRmlsZSh1cmlSb290RiwgbmV4dGpzcCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghZmpzcC5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzV2FybkVuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTG9jYWxpemVyLmdldE1lc3NhZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJqc3BjLmVycm9yLmZpbGVEb2VzTm90RXhpc3QiLCBmanNwLnRvU3RyaW5nKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU3RyaW5nIHMgPSBmanNwLmdldEFic29sdXRlUGF0aCgpOworICAgICAgICAgICAgICAgIGlmIChzLnN0YXJ0c1dpdGgodXJpUm9vdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbmV4dGpzcCA9IHMuc3Vic3RyaW5nKHVyaVJvb3QubGVuZ3RoKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobmV4dGpzcC5zdGFydHNXaXRoKCIuIiArIEZpbGUuc2VwYXJhdG9yQ2hhcikpIHsKKyAgICAgICAgICAgICAgICAgICAgbmV4dGpzcCA9IG5leHRqc3Auc3Vic3RyaW5nKDIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwcm9jZXNzRmlsZShuZXh0anNwKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY29tcGxldGVXZWJYbWwoKTsKKworICAgICAgICAgICAgaWYgKGFkZFdlYlhtbE1hcHBpbmdzKSB7CisgICAgICAgICAgICAgICAgbWVyZ2VJbnRvV2ViWG1sKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSmFzcGVyRXhjZXB0aW9uKGlvZSk7CisKKyAgICAgICAgfSBjYXRjaCAoSmFzcGVyRXhjZXB0aW9uIGplKSB7CisgICAgICAgICAgICBUaHJvd2FibGUgcm9vdENhdXNlID0gamU7CisgICAgICAgICAgICB3aGlsZSAocm9vdENhdXNlIGluc3RhbmNlb2YgSmFzcGVyRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgICYmICgoSmFzcGVyRXhjZXB0aW9uKSByb290Q2F1c2UpLmdldFJvb3RDYXVzZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByb290Q2F1c2UgPSAoKEphc3BlckV4Y2VwdGlvbikgcm9vdENhdXNlKS5nZXRSb290Q2F1c2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChyb290Q2F1c2UgIT0gamUpIHsKKyAgICAgICAgICAgICAgICByb290Q2F1c2UucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBqZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vID09PT09PT09PT09PT09PT09PT09IFByaXZhdGUgdXRpbGl0eSBtZXRob2RzID09PT09PT09PT09PT09PT09PT09CisKKyAgICBwcml2YXRlIFN0cmluZyBuZXh0QXJnKCkgeworICAgICAgICBpZiAoKGFyZ1BvcyA+PSBhcmdzLmxlbmd0aCkKKyAgICAgICAgICAgIHx8IChmdWxsc3RvcCA9IFNXSVRDSF9GVUxMX1NUT1AuZXF1YWxzKGFyZ3NbYXJnUG9zXSkpKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBhcmdzW2FyZ1BvcysrXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIG5leHRGaWxlKCkgeworICAgICAgICBpZiAoZnVsbHN0b3ApIGFyZ1BvcysrOworICAgICAgICBpZiAoYXJnUG9zID49IGFyZ3MubGVuZ3RoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBhcmdzW2FyZ1BvcysrXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0V2ViWG1sKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKHdlYnhtbExldmVsID49IElOQ19XRUJYTUwpIHsKKyAgICAgICAgICAgICAgICBGaWxlIGZtYXBpbmdzID0gbmV3IEZpbGUod2VieG1sRmlsZSk7CisgICAgICAgICAgICAgICAgbWFwb3V0ID0gbmV3IEZpbGVXcml0ZXIoZm1hcGluZ3MpOworICAgICAgICAgICAgICAgIHNlcnZsZXRvdXQgPSBuZXcgQ2hhckFycmF5V3JpdGVyKCk7CisgICAgICAgICAgICAgICAgbWFwcGluZ291dCA9IG5ldyBDaGFyQXJyYXlXcml0ZXIoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbWFwb3V0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICBzZXJ2bGV0b3V0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICBtYXBwaW5nb3V0ID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh3ZWJ4bWxMZXZlbCA+PSBBTExfV0VCWE1MKSB7CisgICAgICAgICAgICAgICAgbWFwb3V0LndyaXRlKExvY2FsaXplci5nZXRNZXNzYWdlKCJqc3BjLndlYnhtbC5oZWFkZXIiKSk7CisgICAgICAgICAgICAgICAgbWFwb3V0LmZsdXNoKCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCh3ZWJ4bWxMZXZlbD49IElOQ19XRUJYTUwpICYmICFhZGRXZWJYbWxNYXBwaW5ncykgeworICAgICAgICAgICAgICAgIG1hcG91dC53cml0ZShMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgianNwYy53ZWJpbmMuaGVhZGVyIikpOworICAgICAgICAgICAgICAgIG1hcG91dC5mbHVzaCgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgIG1hcG91dCA9IG51bGw7CisgICAgICAgICAgICBzZXJ2bGV0b3V0ID0gbnVsbDsKKyAgICAgICAgICAgIG1hcHBpbmdvdXQgPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNvbXBsZXRlV2ViWG1sKCkgeworICAgICAgICBpZiAobWFwb3V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc2VydmxldG91dC53cml0ZVRvKG1hcG91dCk7CisgICAgICAgICAgICAgICAgbWFwcGluZ291dC53cml0ZVRvKG1hcG91dCk7CisgICAgICAgICAgICAgICAgaWYgKHdlYnhtbExldmVsID49IEFMTF9XRUJYTUwpIHsKKyAgICAgICAgICAgICAgICAgICAgbWFwb3V0LndyaXRlKExvY2FsaXplci5nZXRNZXNzYWdlKCJqc3BjLndlYnhtbC5mb290ZXIiKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgod2VieG1sTGV2ZWwgPj0gSU5DX1dFQlhNTCkgJiYgIWFkZFdlYlhtbE1hcHBpbmdzKSB7CisgICAgICAgICAgICAgICAgICAgIG1hcG91dC53cml0ZShMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgianNwYy53ZWJpbmMuZm9vdGVyIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtYXBvdXQuY2xvc2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgICAgIC8vIG5vdGluZyB0byBkbyBpZiBpdCBmYWlscyBzaW5jZSB3ZSBhcmUgZG9uZSB3aXRoIGl0CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdFNlcnZsZXRDb250ZXh0KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgY29udGV4dCA9bmV3IEpzcENTZXJ2bGV0Q29udGV4dAorICAgICAgICAgICAgICAgIChuZXcgUHJpbnRXcml0ZXIoU3lzdGVtLm91dCksCisgICAgICAgICAgICAgICAgIG5ldyBVUkwoImZpbGU6IiArIHVyaVJvb3QucmVwbGFjZSgnXFwnLCcvJykgKyAnLycpKTsKKyAgICAgICAgICAgIHRsZExvY2F0aW9uc0NhY2hlID0gbmV3IFRsZExvY2F0aW9uc0NhY2hlKGNvbnRleHQsIHRydWUpOworICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbWUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioiICsgbWUpOworICAgICAgICB9CisgICAgICAgIHJjdHh0ID0gbmV3IEpzcFJ1bnRpbWVDb250ZXh0KGNvbnRleHQsIHRoaXMpOworICAgICAgICBqc3BDb25maWcgPSBuZXcgSnNwQ29uZmlnKGNvbnRleHQpOworICAgICAgICB0YWdQbHVnaW5NYW5hZ2VyID0gbmV3IFRhZ1BsdWdpbk1hbmFnZXIoY29udGV4dCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXRDbGFzc0xvYWRlcihKc3BDb21waWxhdGlvbkNvbnRleHQgY2xjdHh0KQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIGNsYXNzUGF0aCA9IGdldENsYXNzUGF0aCgpOworCisgICAgICAgIENsYXNzTG9hZGVyIGpzcGNMb2FkZXIgPSBnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCk7CisgICAgICAgIGlmIChqc3BjTG9hZGVyIGluc3RhbmNlb2YgQW50Q2xhc3NMb2FkZXIpIHsKKyAgICAgICAgICAgIGNsYXNzUGF0aCArPSBGaWxlLnBhdGhTZXBhcmF0b3IKKyAgICAgICAgICAgICAgICArICgoQW50Q2xhc3NMb2FkZXIpIGpzcGNMb2FkZXIpLmdldENsYXNzcGF0aCgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gVHVybiB0aGUgY2xhc3NQYXRoIGludG8gVVJMcworICAgICAgICBBcnJheUxpc3QgdXJscyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoY2xhc3NQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlLnBhdGhTZXBhcmF0b3IpOworICAgICAgICB3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgeworICAgICAgICAgICAgU3RyaW5nIHBhdGggPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIEZpbGUgbGliRmlsZSA9IG5ldyBGaWxlKHBhdGgpOworICAgICAgICAgICAgICAgIHVybHMuYWRkKGxpYkZpbGUudG9VUkwoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgICAgICAvLyBGYWlsaW5nIGEgdG9DYW5vbmljYWxQYXRoIG9uIGEgZmlsZSB0aGF0CisgICAgICAgICAgICAgICAgLy8gZXhpc3RzKCkgc2hvdWxkIGJlIGEgSlZNIHJlZ3Jlc3Npb24gdGVzdCwKKyAgICAgICAgICAgICAgICAvLyB0aGVyZWZvcmUgd2UgaGF2ZSBwZXJtaXNzaW9uIHRvIGZyZWFrIHVvdAorICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGlvZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEZpbGUgd2ViYXBwQmFzZSA9IG5ldyBGaWxlKHVyaVJvb3QpOworICAgICAgICBpZiAod2ViYXBwQmFzZS5leGlzdHMoKSkgeworICAgICAgICAgICAgRmlsZSBjbGFzc2VzID0gbmV3IEZpbGUod2ViYXBwQmFzZSwgIi9XRUItSU5GL2NsYXNzZXMiKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYgKGNsYXNzZXMuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2xhc3NQYXRoID0gY2xhc3NQYXRoICsgRmlsZS5wYXRoU2VwYXJhdG9yCisgICAgICAgICAgICAgICAgICAgICAgICArIGNsYXNzZXMuZ2V0Q2Fub25pY2FsUGF0aCgpOworICAgICAgICAgICAgICAgICAgICB1cmxzLmFkZChjbGFzc2VzLmdldENhbm9uaWNhbEZpbGUoKS50b1VSTCgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgICAgICAvLyBmYWlsaW5nIGEgdG9DYW5vbmljYWxQYXRoIG9uIGEgZmlsZSB0aGF0CisgICAgICAgICAgICAgICAgLy8gZXhpc3RzKCkgc2hvdWxkIGJlIGEgSlZNIHJlZ3Jlc3Npb24gdGVzdCwKKyAgICAgICAgICAgICAgICAvLyB0aGVyZWZvcmUgd2UgaGF2ZSBwZXJtaXNzaW9uIHRvIGZyZWFrIG91dAorICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGlvZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZpbGUgbGliID0gbmV3IEZpbGUod2ViYXBwQmFzZSwgIi9XRUItSU5GL2xpYiIpOworICAgICAgICAgICAgaWYgKGxpYi5leGlzdHMoKSAmJiBsaWIuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgICAgIFN0cmluZ1tdIGxpYnMgPSBsaWIubGlzdCgpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlicy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiggbGlic1tpXS5sZW5ndGgoKSA8NSApIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZXh0PWxpYnNbaV0uc3Vic3RyaW5nKCBsaWJzW2ldLmxlbmd0aCgpIC0gNCApOworICAgICAgICAgICAgICAgICAgICBpZiAoISAiLmphciIuZXF1YWxzSWdub3JlQ2FzZShleHQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIi50bGQiLmVxdWFsc0lnbm9yZUNhc2UoZXh0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKCJUTEQgZmlsZXMgc2hvdWxkIG5vdCBiZSBwbGFjZWQgaW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIi9XRUItSU5GL2xpYiIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUgbGliRmlsZSA9IG5ldyBGaWxlKGxpYiwgbGlic1tpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc1BhdGggPSBjbGFzc1BhdGggKyBGaWxlLnBhdGhTZXBhcmF0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGxpYkZpbGUuZ2V0Q2Fub25pY2FsUGF0aCgpOworICAgICAgICAgICAgICAgICAgICAgICAgdXJscy5hZGQobGliRmlsZS5nZXRDYW5vbmljYWxGaWxlKCkudG9VUkwoKSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFpbGluZyBhIHRvQ2Fub25pY2FsUGF0aCBvbiBhIGZpbGUgdGhhdAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhpc3RzKCkgc2hvdWxkIGJlIGEgSlZNIHJlZ3Jlc3Npb24gdGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZXJlZm9yZSB3ZSBoYXZlIHBlcm1pc3Npb24gdG8gZnJlYWsgb3V0CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihpb2UudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBXaGF0IGlzIHRoaXMgPz8KKyAgICAgICAgdXJscy5hZGQobmV3IEZpbGUoY2xjdHh0LmdldFJlYWxQYXRoKCIvIikpLmdldENhbm9uaWNhbEZpbGUoKS50b1VSTCgpKTsKKworICAgICAgICBVUkwgdXJsc0FbXT1uZXcgVVJMW3VybHMuc2l6ZSgpXTsKKyAgICAgICAgdXJscy50b0FycmF5KHVybHNBKTsKKyAgICAgICAgbG9hZGVyID0gbmV3IFVSTENsYXNzTG9hZGVyKHVybHNBLCB0aGlzLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7CisgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKGxvYWRlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluZCB0aGUgV0VCLUlORiBkaXIgYnkgbG9va2luZyB1cCBpbiB0aGUgZGlyZWN0b3J5IHRyZWUuCisgICAgICogVGhpcyBpcyB1c2VkIGlmIG5vIGV4cGxpY2l0IGRvY2Jhc2UgaXMgc2V0LCBidXQgb25seSBmaWxlcy4KKyAgICAgKiBYWFggTWF5YmUgd2Ugc2hvdWxkIHJlcXVpcmUgdGhlIGRvY2Jhc2UuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGxvY2F0ZVVyaVJvb3QoIEZpbGUgZiApIHsKKyAgICAgICAgU3RyaW5nIHRVcmlCYXNlID0gdXJpQmFzZTsKKyAgICAgICAgaWYgKHRVcmlCYXNlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRVcmlCYXNlID0gIi8iOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoZi5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgIGYgPSBuZXcgRmlsZShmLmdldENhbm9uaWNhbFBhdGgoKSk7CisgICAgICAgICAgICAgICAgd2hpbGUgKGYgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBGaWxlIGcgPSBuZXcgRmlsZShmLCAiV0VCLUlORiIpOworICAgICAgICAgICAgICAgICAgICBpZiAoZy5leGlzdHMoKSAmJiBnLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVyaVJvb3QgPSBmLmdldENhbm9uaWNhbFBhdGgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVyaUJhc2UgPSB0VXJpQmFzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNJbmZvRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oTG9jYWxpemVyLmdldE1lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImpzcGMuaW1wbGljaXQudXJpUm9vdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJpUm9vdCkpOworCQkJfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGYuZXhpc3RzKCkgJiYgZi5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0VXJpQmFzZSA9ICIvIiArIGYuZ2V0TmFtZSgpICsgIi8iICsgdFVyaUJhc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZlBhcmVudCA9IGYuZ2V0UGFyZW50KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChmUGFyZW50ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZiA9IG5ldyBGaWxlKGZQYXJlbnQpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gYWNjZXB0aWJsZSBjYW5kaWRhdGUsIHVyaVJvb3Qgd2lsbAorICAgICAgICAgICAgICAgICAgICAvLyByZW1haW4gbnVsbCB0byBpbmRpY2F0ZSB0byB0aGUgQ29tcGlsZXJDb250ZXh0IHRvCisgICAgICAgICAgICAgICAgICAgIC8vIHVzZSB0aGUgY3VycmVudCB3b3JraW5nL3VzZXIgZGlyLgorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh1cmlSb290ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgRmlsZSBmcm9vdCA9IG5ldyBGaWxlKHVyaVJvb3QpOworICAgICAgICAgICAgICAgICAgICB1cmlSb290ID0gZnJvb3QuZ2V0Q2Fub25pY2FsUGF0aCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICAvLyBzaW5jZSB0aGlzIGlzIGFuIG9wdGlvbmFsIGRlZmF1bHQgYW5kIGEgbnVsbCB2YWx1ZQorICAgICAgICAgICAgLy8gZm9yIHVyaVJvb3QgaGFzIGEgbm9uLWVycm9yIG1lYW5pbmcsIHdlIGNhbiBqdXN0CisgICAgICAgICAgICAvLyBwYXNzIHN0cmFpZ2h0IHRocm91Z2gKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL0pzcENvbXBpbGF0aW9uQ29udGV4dC5qYXZhIGIvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL0pzcENvbXBpbGF0aW9uQ29udGV4dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5MTViMWQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvSnNwQ29tcGlsYXRpb25Db250ZXh0LmphdmEKQEAgLTAsMCArMSw2OTggQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphc3BlcjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEubmV0LlVSTENsYXNzTG9hZGVyOworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZ0luZm87CisKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5jb21waWxlci5Db21waWxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5jb21waWxlci5Kc3BSdW50aW1lQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5jb21waWxlci5Kc3BVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLmNvbXBpbGVyLkxvY2FsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5jb21waWxlci5TZXJ2bGV0V3JpdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLnNlcnZsZXQuSmFzcGVyTG9hZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLnNlcnZsZXQuSnNwU2VydmxldFdyYXBwZXI7CisKKy8qKgorICogQSBwbGFjZSBob2xkZXIgZm9yIHZhcmlvdXMgdGhpbmdzIHRoYXQgYXJlIHVzZWQgdGhyb3VnaCBvdXQgdGhlIEpTUAorICogZW5naW5lLiBUaGlzIGlzIGEgcGVyLXJlcXVlc3QvcGVyLWNvbnRleHQgZGF0YSBzdHJ1Y3R1cmUuIFNvbWUgb2YKKyAqIHRoZSBpbnN0YW5jZSB2YXJpYWJsZXMgYXJlIHNldCBhdCBkaWZmZXJlbnQgcG9pbnRzLgorICoKKyAqIE1vc3Qgb2YgdGhlIHBhdGgtcmVsYXRlZCBzdHVmZiBpcyBoZXJlIC0gbWFuZ2xpbmcgbmFtZXMsIHZlcnNpb25zLCBkaXJzLAorICogbG9hZGluZyByZXNvdXJjZXMgYW5kIGRlYWxpbmcgd2l0aCB1cmlzLiAKKyAqCisgKiBAYXV0aG9yIEFuaWwgSy4gVmlqZW5kcmFuCisgKiBAYXV0aG9yIEhhcmlzaCBQcmFiYW5kaGFtCisgKiBAYXV0aG9yIFBpZXJyZSBEZWxpc2xlCisgKiBAYXV0aG9yIENvc3RpbiBNYW5vbGFjaGUKKyAqIEBhdXRob3IgS2luLW1hbiBDaHVuZworICovCitwdWJsaWMgY2xhc3MgSnNwQ29tcGlsYXRpb25Db250ZXh0IHsKKworICAgIHByaXZhdGUgSGFzaHRhYmxlIHRhZ0ZpbGVKYXJVcmxzOworICAgIHByaXZhdGUgYm9vbGVhbiBpc1BhY2thZ2VkVGFnRmlsZTsKKworICAgIHByaXZhdGUgU3RyaW5nIGNsYXNzTmFtZTsKKyAgICBwcml2YXRlIFN0cmluZyBqc3BVcmk7CisgICAgcHJpdmF0ZSBib29sZWFuIGlzRXJyUGFnZTsKKyAgICBwcml2YXRlIFN0cmluZyBiYXNlUGFja2FnZU5hbWU7CisgICAgcHJpdmF0ZSBTdHJpbmcgZGVyaXZlZFBhY2thZ2VOYW1lOworICAgIHByaXZhdGUgU3RyaW5nIHNlcnZsZXRKYXZhRmlsZU5hbWU7CisgICAgcHJpdmF0ZSBTdHJpbmcgamF2YVBhdGg7CisgICAgcHJpdmF0ZSBTdHJpbmcgY2xhc3NGaWxlTmFtZTsKKyAgICBwcml2YXRlIFN0cmluZyBjb250ZW50VHlwZTsKKyAgICBwcml2YXRlIFNlcnZsZXRXcml0ZXIgd3JpdGVyOworICAgIHByaXZhdGUgT3B0aW9ucyBvcHRpb25zOworICAgIHByaXZhdGUgSnNwU2VydmxldFdyYXBwZXIganN3OworICAgIHByaXZhdGUgQ29tcGlsZXIganNwQ29tcGlsZXI7CisgICAgcHJpdmF0ZSBTdHJpbmcgY2xhc3NQYXRoOworCisgICAgcHJpdmF0ZSBTdHJpbmcgYmFzZVVSSTsKKyAgICBwcml2YXRlIFN0cmluZyBiYXNlT3V0cHV0RGlyOworICAgIHByaXZhdGUgU3RyaW5nIG91dHB1dERpcjsKKyAgICBwcml2YXRlIFNlcnZsZXRDb250ZXh0IGNvbnRleHQ7CisgICAgcHJpdmF0ZSBVUkxDbGFzc0xvYWRlciBsb2FkZXI7CisKKyAgICBwcml2YXRlIEpzcFJ1bnRpbWVDb250ZXh0IHJjdHh0OworCisgICAgcHJpdmF0ZSBpbnQgcmVtb3ZlZCA9IDA7CisKKyAgICBwcml2YXRlIFVSTENsYXNzTG9hZGVyIGpzcExvYWRlcjsKKyAgICBwcml2YXRlIFVSTCBiYXNlVXJsOworICAgIHByaXZhdGUgQ2xhc3Mgc2VydmxldENsYXNzOworCisgICAgcHJpdmF0ZSBib29sZWFuIGlzVGFnRmlsZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gcHJvdG9UeXBlTW9kZTsKKyAgICBwcml2YXRlIFRhZ0luZm8gdGFnSW5mbzsKKyAgICBwcml2YXRlIFVSTCB0YWdGaWxlSmFyVXJsOworCisgICAgLy8ganNwVVJJIF9tdXN0XyBiZSByZWxhdGl2ZSB0byB0aGUgY29udGV4dAorICAgIHB1YmxpYyBKc3BDb21waWxhdGlvbkNvbnRleHQoU3RyaW5nIGpzcFVyaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNFcnJQYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9ucyBvcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmxldENvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpzcFNlcnZsZXRXcmFwcGVyIGpzdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpzcFJ1bnRpbWVDb250ZXh0IHJjdHh0KSB7CisKKyAgICAgICAgdGhpcy5qc3BVcmkgPSBjYW5vbmljYWxVUkkoanNwVXJpKTsKKyAgICAgICAgdGhpcy5pc0VyclBhZ2UgPSBpc0VyclBhZ2U7CisgICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CisgICAgICAgIHRoaXMuanN3ID0ganN3OworICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0OworCisgICAgICAgIHRoaXMuYmFzZVVSSSA9IGpzcFVyaS5zdWJzdHJpbmcoMCwganNwVXJpLmxhc3RJbmRleE9mKCcvJykgKyAxKTsKKyAgICAgICAgLy8gaGFjayBmaXggZm9yIHJlc29sdmVSZWxhdGl2ZVVSSQorICAgICAgICBpZiAoYmFzZVVSSSA9PSBudWxsKSB7CisgICAgICAgICAgICBiYXNlVVJJID0gIi8iOworICAgICAgICB9IGVsc2UgaWYgKGJhc2VVUkkuY2hhckF0KDApICE9ICcvJykgeworICAgICAgICAgICAgLy8gc3RyaXAgdGhlIGJhc2RlIHNsYXNoIHNpbmNlIGl0IHdpbGwgYmUgY29tYmluZWQgd2l0aCB0aGUKKyAgICAgICAgICAgIC8vIHVyaUJhc2UgdG8gZ2VuZXJhdGUgYSBmaWxlCisgICAgICAgICAgICBiYXNlVVJJID0gIi8iICsgYmFzZVVSSTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYmFzZVVSSS5jaGFyQXQoYmFzZVVSSS5sZW5ndGgoKSAtIDEpICE9ICcvJykgeworICAgICAgICAgICAgYmFzZVVSSSArPSAnLyc7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLnJjdHh0ID0gcmN0eHQ7CisgICAgICAgIHRoaXMudGFnRmlsZUphclVybHMgPSBuZXcgSGFzaHRhYmxlKCk7CisgICAgICAgIHRoaXMuYmFzZVBhY2thZ2VOYW1lID0gQ29uc3RhbnRzLkpTUF9QQUNLQUdFX05BTUU7CisgICAgfQorCisgICAgcHVibGljIEpzcENvbXBpbGF0aW9uQ29udGV4dChTdHJpbmcgdGFnZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhZ0luZm8gdGFnSW5mbywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25zIG9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2bGV0Q29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSnNwU2VydmxldFdyYXBwZXIganN3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSnNwUnVudGltZUNvbnRleHQgcmN0eHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkwgdGFnRmlsZUphclVybCkgeworICAgICAgICB0aGlzKHRhZ2ZpbGUsIGZhbHNlLCBvcHRpb25zLCBjb250ZXh0LCBqc3csIHJjdHh0KTsKKyAgICAgICAgdGhpcy5pc1RhZ0ZpbGUgPSB0cnVlOworICAgICAgICB0aGlzLnRhZ0luZm8gPSB0YWdJbmZvOworICAgICAgICB0aGlzLnRhZ0ZpbGVKYXJVcmwgPSB0YWdGaWxlSmFyVXJsOworICAgICAgICBpZiAodGFnRmlsZUphclVybCAhPSBudWxsKSB7CisgICAgICAgICAgICBpc1BhY2thZ2VkVGFnRmlsZSA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiA9PT09PT09PT09PT09PT09PT09PSBNZXRob2RzIHRvIG92ZXJyaWRlID09PT09PT09PT09PT09PT09PT09ICovCisgICAgCisgICAgLyoqIC0tLS0tLS0tLS0gQ2xhc3MgcGF0aCBhbmQgbG9hZGVyIC0tLS0tLS0tLS0gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBjbGFzc3BhdGggdGhhdCBpcyBwYXNzZWQgb2ZmIHRvIHRoZSBKYXZhIGNvbXBpbGVyLiAKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzUGF0aCgpIHsKKyAgICAgICAgaWYoIGNsYXNzUGF0aCAhPSBudWxsICkKKyAgICAgICAgICAgIHJldHVybiBjbGFzc1BhdGg7CisgICAgICAgIHJldHVybiByY3R4dC5nZXRDbGFzc1BhdGgoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgY2xhc3NwYXRoIHRoYXQgaXMgcGFzc2VkIG9mZiB0byB0aGUgSmF2YSBjb21waWxlci4gCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2xhc3NQYXRoKFN0cmluZyBjbGFzc1BhdGgpIHsKKyAgICAgICAgdGhpcy5jbGFzc1BhdGggPSBjbGFzc1BhdGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hhdCBjbGFzcyBsb2FkZXIgdG8gdXNlIGZvciBsb2FkaW5nIGNsYXNzZXMgd2hpbGUgY29tcGlsaW5nCisgICAgICogdGhpcyBKU1A/CisgICAgICovCisgICAgcHVibGljIENsYXNzTG9hZGVyIGdldENsYXNzTG9hZGVyKCkgeworICAgICAgICBpZiggbG9hZGVyICE9IG51bGwgKQorICAgICAgICAgICAgcmV0dXJuIGxvYWRlcjsKKyAgICAgICAgcmV0dXJuIHJjdHh0LmdldFBhcmVudENsYXNzTG9hZGVyKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q2xhc3NMb2FkZXIoVVJMQ2xhc3NMb2FkZXIgbG9hZGVyKSB7CisgICAgICAgIHRoaXMubG9hZGVyID0gbG9hZGVyOworICAgIH0KKworICAgIHB1YmxpYyBDbGFzc0xvYWRlciBnZXRKc3BMb2FkZXIoKSB7CisgICAgICAgIGlmKCBqc3BMb2FkZXIgPT0gbnVsbCApIHsKKyAgICAgICAgICAgIGpzcExvYWRlciA9IG5ldyBKYXNwZXJMb2FkZXIKKyAgICAgICAgICAgIChuZXcgVVJMW10ge2Jhc2VVcmx9LAorICAgICAgICAgICAgICAgICAgICBnZXRDbGFzc0xvYWRlcigpLAorICAgICAgICAgICAgICAgICAgICByY3R4dC5nZXRQZXJtaXNzaW9uQ29sbGVjdGlvbigpLAorICAgICAgICAgICAgICAgICAgICByY3R4dC5nZXRDb2RlU291cmNlKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBqc3BMb2FkZXI7CisgICAgfQorCisgICAgLyoqIC0tLS0tLS0tLS0gSW5wdXQvT3V0cHV0ICAtLS0tLS0tLS0tICovCisgICAgCisgICAgLyoqCisgICAgICogVGhlIG91dHB1dCBkaXJlY3RvcnkgdG8gZ2VuZXJhdGUgY29kZSBpbnRvLiAgVGhlIG91dHB1dCBkaXJlY3RvcnkKKyAgICAgKiBpcyBtYWtlIHVwIG9mIHRoZSBzY3JhdGNoIGRpcmVjdG9yeSwgd2hpY2ggaXMgcHJvdmlkZSBpbiBPcHRpb25zLAorICAgICAqIHBsdXMgdGhlIGRpcmVjdG9yeSBkZXJpdmVkIGZyb20gdGhlIHBhY2thZ2UgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE91dHB1dERpcigpIHsKKwlpZiAob3V0cHV0RGlyID09IG51bGwpIHsKKwkgICAgY3JlYXRlT3V0cHV0RGlyKCk7CisJfQorCisgICAgICAgIHJldHVybiBvdXRwdXREaXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgIkNvbXBpbGVyIiBvYmplY3QgYmFzZWQgb24gc29tZSBpbml0IHBhcmFtIGRhdGEuIFRoaXMKKyAgICAgKiBpcyBub3QgZG9uZSB5ZXQuIFJpZ2h0IG5vdyB3ZSdyZSBqdXN0IGhhcmRjb2RpbmcgdGhlIGFjdHVhbAorICAgICAqIGNvbXBpbGVycyB0aGF0IGFyZSBjcmVhdGVkLiAKKyAgICAgKi8KKyAgICBwdWJsaWMgQ29tcGlsZXIgY3JlYXRlQ29tcGlsZXIoKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGpzcENvbXBpbGVyICE9IG51bGwgKSB7CisgICAgICAgICAgICByZXR1cm4ganNwQ29tcGlsZXI7CisgICAgICAgIH0KKyAgICAgICAganNwQ29tcGlsZXIgPSBudWxsOworICAgICAgICBpZiAob3B0aW9ucy5nZXRDb21waWxlcigpID09IG51bGwpIHsKKyAgICAgICAgICAgIGpzcENvbXBpbGVyID0gY3JlYXRlQ29tcGlsZXIoIm9yZy5hcGFjaGUuamFzcGVyLmNvbXBpbGVyLkpEVENvbXBpbGVyIik7CisgICAgICAgICAgICBpZiAoanNwQ29tcGlsZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGpzcENvbXBpbGVyID0gY3JlYXRlQ29tcGlsZXIoIm9yZy5hcGFjaGUuamFzcGVyLmNvbXBpbGVyLkFudENvbXBpbGVyIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBqc3BDb21waWxlciA9IGNyZWF0ZUNvbXBpbGVyKCJvcmcuYXBhY2hlLmphc3Blci5jb21waWxlci5BbnRDb21waWxlciIpOworICAgICAgICAgICAgaWYgKGpzcENvbXBpbGVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBqc3BDb21waWxlciA9IGNyZWF0ZUNvbXBpbGVyKCJvcmcuYXBhY2hlLmphc3Blci5jb21waWxlci5KRFRDb21waWxlciIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGpzcENvbXBpbGVyLmluaXQodGhpcywganN3KTsKKyAgICAgICAgcmV0dXJuIGpzcENvbXBpbGVyOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIENvbXBpbGVyIGNyZWF0ZUNvbXBpbGVyKFN0cmluZyBjbGFzc05hbWUpIHsKKyAgICAgICAgQ29tcGlsZXIgY29tcGlsZXIgPSBudWxsOyAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNvbXBpbGVyID0gKENvbXBpbGVyKSBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSkubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIC8vIExvZyA/CisgICAgICAgICAgICAvLyBGSVhNRTogbG9nCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvbXBpbGVyOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgQ29tcGlsZXIgZ2V0Q29tcGlsZXIoKSB7CisgICAgICAgIHJldHVybiBqc3BDb21waWxlcjsKKyAgICB9CisKKyAgICAvKiogLS0tLS0tLS0tLSBBY2Nlc3MgcmVzb3VyY2VzIGluIHRoZSB3ZWJhcHAgLS0tLS0tLS0tLSAqLworCisgICAgLyoqIAorICAgICAqIEdldCB0aGUgZnVsbCB2YWx1ZSBvZiBhIFVSSSByZWxhdGl2ZSB0byB0aGlzIGNvbXBpbGF0aW9ucyBjb250ZXh0CisgICAgICogdXNlcyBjdXJyZW50IGZpbGUgYXMgdGhlIGJhc2UuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyByZXNvbHZlUmVsYXRpdmVVcmkoU3RyaW5nIHVyaSkgeworICAgICAgICAvLyBzb21ldGltZXMgd2UgZ2V0IHVyaSdzIG1hc3NhZ2VkIGZyb20gRmlsZShTdHJpbmcpLCBzbyBjaGVjayBmb3IKKyAgICAgICAgLy8gYSByb290IGRpcmVjdG9yeSBkZXBlcmF0b3IgY2hhcgorICAgICAgICBpZiAodXJpLnN0YXJ0c1dpdGgoIi8iKSB8fCB1cmkuc3RhcnRzV2l0aChGaWxlLnNlcGFyYXRvcikpIHsKKyAgICAgICAgICAgIHJldHVybiB1cmk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gYmFzZVVSSSArIHVyaTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgYSByZXNvdXJjZSBhcyBhIHN0cmVhbSwgcmVsYXRpdmUgdG8gdGhlIG1lYW5pbmdzIG9mIHRoaXMKKyAgICAgKiBjb250ZXh0J3MgaW1wbGVtZW50YXRpb24uCisgICAgICogQHJldHVybiBhIG51bGwgaWYgdGhlIHJlc291cmNlIGNhbm5vdCBiZSBmb3VuZCBvciByZXByZXNlbnRlZCAKKyAgICAgKiAgICAgICAgIGFzIGFuIElucHV0U3RyZWFtLgorICAgICAqLworICAgIHB1YmxpYyBqYXZhLmlvLklucHV0U3RyZWFtIGdldFJlc291cmNlQXNTdHJlYW0oU3RyaW5nIHJlcykgeworICAgICAgICByZXR1cm4gY29udGV4dC5nZXRSZXNvdXJjZUFzU3RyZWFtKGNhbm9uaWNhbFVSSShyZXMpKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBVUkwgZ2V0UmVzb3VyY2UoU3RyaW5nIHJlcykgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBjb250ZXh0LmdldFJlc291cmNlKGNhbm9uaWNhbFVSSShyZXMpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU2V0IGdldFJlc291cmNlUGF0aHMoU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0UmVzb3VyY2VQYXRocyhjYW5vbmljYWxVUkkocGF0aCkpOworICAgIH0KKworICAgIC8qKiAKKyAgICAgKiBHZXRzIHRoZSBhY3R1YWwgcGF0aCBvZiBhIFVSSSByZWxhdGl2ZSB0byB0aGUgY29udGV4dCBvZgorICAgICAqIHRoZSBjb21waWxhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlYWxQYXRoKFN0cmluZyBwYXRoKSB7CisgICAgICAgIGlmIChjb250ZXh0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmdldFJlYWxQYXRoKHBhdGgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwYXRoOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHRhZy1maWxlLW5hbWUtdG8tSkFSLWZpbGUgbWFwIG9mIHRoaXMgY29tcGlsYXRpb24gdW5pdCwKKyAgICAgKiB3aGljaCBtYXBzIHRhZyBmaWxlIG5hbWVzIHRvIHRoZSBKQVIgZmlsZXMgaW4gd2hpY2ggdGhlIHRhZyBmaWxlcyBhcmUKKyAgICAgKiBwYWNrYWdlZC4KKyAgICAgKgorICAgICAqIFRoZSBtYXAgaXMgcG9wdWxhdGVkIHdoZW4gcGFyc2luZyB0aGUgdGFnLWZpbGUgZWxlbWVudHMgb2YgdGhlIFRMRHMKKyAgICAgKiBvZiBhbnkgaW1wb3J0ZWQgdGFnbGlicy4gCisgICAgICovCisgICAgcHVibGljIEhhc2h0YWJsZSBnZXRUYWdGaWxlSmFyVXJscygpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMudGFnRmlsZUphclVybHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgSkFSIGZpbGUgaW4gd2hpY2ggdGhlIHRhZyBmaWxlIGZvciB3aGljaCB0aGlzCisgICAgICogSnNwQ29tcGlsYXRpb25Db250ZXh0IHdhcyBjcmVhdGVkIGlzIHBhY2thZ2VkLCBvciBudWxsIGlmIHRoaXMKKyAgICAgKiBKc3BDb21waWxhdGlvbkNvbnRleHQgZG9lcyBub3QgY29ycmVzcG9uZCB0byBhIHRhZyBmaWxlLCBvciBpZiB0aGUKKyAgICAgKiBjb3JyZXNwb25kaW5nIHRhZyBmaWxlIGlzIG5vdCBwYWNrYWdlZCBpbiBhIEpBUi4KKyAgICAgKi8KKyAgICBwdWJsaWMgVVJMIGdldFRhZ0ZpbGVKYXJVcmwoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnRhZ0ZpbGVKYXJVcmw7CisgICAgfQorCisgICAgLyogPT09PT09PT09PT09PT09PT09PT0gQ29tbW9uIGltcGxlbWVudGF0aW9uID09PT09PT09PT09PT09PT09PT09ICovCisKKyAgICAvKioKKyAgICAgKiBKdXN0IHRoZSBjbGFzcyBuYW1lIChkb2VzIG5vdCBpbmNsdWRlIHBhY2thZ2UgbmFtZSkgb2YgdGhlCisgICAgICogZ2VuZXJhdGVkIGNsYXNzLiAKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFNlcnZsZXRDbGFzc05hbWUoKSB7CisKKyAgICAgICAgaWYgKGNsYXNzTmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gY2xhc3NOYW1lOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGlzVGFnRmlsZSkgeworICAgICAgICAgICAgY2xhc3NOYW1lID0gdGFnSW5mby5nZXRUYWdDbGFzc05hbWUoKTsKKyAgICAgICAgICAgIGludCBsYXN0SW5kZXggPSBjbGFzc05hbWUubGFzdEluZGV4T2YoJy4nKTsKKyAgICAgICAgICAgIGlmIChsYXN0SW5kZXggIT0gLTEpIHsKKyAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSBjbGFzc05hbWUuc3Vic3RyaW5nKGxhc3RJbmRleCArIDEpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IGlTZXAgPSBqc3BVcmkubGFzdEluZGV4T2YoJy8nKSArIDE7CisgICAgICAgICAgICBjbGFzc05hbWUgPSBKc3BVdGlsLm1ha2VKYXZhSWRlbnRpZmllcihqc3BVcmkuc3Vic3RyaW5nKGlTZXApKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY2xhc3NOYW1lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFNlcnZsZXRDbGFzc05hbWUoU3RyaW5nIGNsYXNzTmFtZSkgeworICAgICAgICB0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUGF0aCBvZiB0aGUgSlNQIFVSSS4gTm90ZSB0aGF0IHRoaXMgaXMgbm90IGEgZmlsZSBuYW1lLiBUaGlzIGlzCisgICAgICogdGhlIGNvbnRleHQgcm9vdGVkIFVSSSBvZiB0aGUgSlNQIGZpbGUuIAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SnNwRmlsZSgpIHsKKyAgICAgICAgcmV0dXJuIGpzcFVyaTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBcmUgd2UgcHJvY2Vzc2luZyBzb21ldGhpbmcgdGhhdCBoYXMgYmVlbiBkZWNsYXJlZCBhcyBhbgorICAgICAqIGVycm9ycGFnZT8gCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNFcnJvclBhZ2UoKSB7CisgICAgICAgIHJldHVybiBpc0VyclBhZ2U7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RXJyb3JQYWdlKGJvb2xlYW4gaXNFcnJQYWdlKSB7CisgICAgICAgIHRoaXMuaXNFcnJQYWdlID0gaXNFcnJQYWdlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzVGFnRmlsZSgpIHsKKyAgICAgICAgcmV0dXJuIGlzVGFnRmlsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgVGFnSW5mbyBnZXRUYWdJbmZvKCkgeworICAgICAgICByZXR1cm4gdGFnSW5mbzsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUYWdJbmZvKFRhZ0luZm8gdGFnaSkgeworICAgICAgICB0YWdJbmZvID0gdGFnaTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcnVlIGlmIHdlIGFyZSBjb21waWxpbmcgYSB0YWcgZmlsZSBpbiBwcm90b3R5cGUgbW9kZS4KKyAgICAgKiBpZSB3ZSBvbmx5IGdlbmVyYXRlIGNvZGVzIHdpdGggY2xhc3MgZm9yIHRoZSB0YWcgaGFuZGxlciB3aXRoIGVtcHR5CisgICAgICogbWV0aG9kIGJvZGllcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1Byb3RvdHlwZU1vZGUoKSB7CisgICAgICAgIHJldHVybiBwcm90b1R5cGVNb2RlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFByb3RvdHlwZU1vZGUoYm9vbGVhbiBwbSkgeworICAgICAgICBwcm90b1R5cGVNb2RlID0gcG07CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFja2FnZSBuYW1lIGZvciB0aGUgZ2VuZXJhdGVkIGNsYXNzIGlzIG1ha2UgdXAgb2YgdGhlIGJhc2UgcGFja2FnZQorICAgICAqIG5hbWUsIHdoaWNoIGlzIHVzZXIgc2V0dGFibGUsIGFuZCB0aGUgZGVyaXZlZCBwYWNrYWdlIG5hbWUuICBUaGUKKyAgICAgKiBkZXJpdmVkIHBhY2thZ2UgbmFtZSBkaXJlY3RseSBtaXJyb3JzIHRoZSBmaWxlIGhlaXJhY2h5IG9mIHRoZSBKU1AgcGFnZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFNlcnZsZXRQYWNrYWdlTmFtZSgpIHsKKyAgICAgICAgaWYgKGlzVGFnRmlsZSgpKSB7CisgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gdGFnSW5mby5nZXRUYWdDbGFzc05hbWUoKTsKKyAgICAgICAgICAgIGludCBsYXN0SW5kZXggPSBjbGFzc05hbWUubGFzdEluZGV4T2YoJy4nKTsKKyAgICAgICAgICAgIFN0cmluZyBwa2dOYW1lID0gIiI7CisgICAgICAgICAgICBpZiAobGFzdEluZGV4ICE9IC0xKSB7CisgICAgICAgICAgICAgICAgcGtnTmFtZSA9IGNsYXNzTmFtZS5zdWJzdHJpbmcoMCwgbGFzdEluZGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBwa2dOYW1lOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU3RyaW5nIGRQYWNrYWdlTmFtZSA9IGdldERlcml2ZWRQYWNrYWdlTmFtZSgpOworICAgICAgICAgICAgaWYgKGRQYWNrYWdlTmFtZS5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VQYWNrYWdlTmFtZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBiYXNlUGFja2FnZU5hbWUgKyAnLicgKyBnZXREZXJpdmVkUGFja2FnZU5hbWUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGdldERlcml2ZWRQYWNrYWdlTmFtZSgpIHsKKyAgICAgICAgaWYgKGRlcml2ZWRQYWNrYWdlTmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICBpbnQgaVNlcCA9IGpzcFVyaS5sYXN0SW5kZXhPZignLycpOworICAgICAgICAgICAgZGVyaXZlZFBhY2thZ2VOYW1lID0gKGlTZXAgPiAwKSA/CisgICAgICAgICAgICAgICAgICAgIEpzcFV0aWwubWFrZUphdmFQYWNrYWdlKGpzcFVyaS5zdWJzdHJpbmcoMSxpU2VwKSkgOiAiIjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZGVyaXZlZFBhY2thZ2VOYW1lOworICAgIH0KKwkgICAgCisgICAgLyoqCisgICAgICogVGhlIHBhY2thZ2UgbmFtZSBpbnRvIHdoaWNoIHRoZSBzZXJ2bGV0IGNsYXNzIGlzIGdlbmVyYXRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2bGV0UGFja2FnZU5hbWUoU3RyaW5nIHNlcnZsZXRQYWNrYWdlTmFtZSkgeworICAgICAgICB0aGlzLmJhc2VQYWNrYWdlTmFtZSA9IHNlcnZsZXRQYWNrYWdlTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGdWxsIHBhdGggbmFtZSBvZiB0aGUgSmF2YSBmaWxlIGludG8gd2hpY2ggdGhlIHNlcnZsZXQgaXMgYmVpbmcKKyAgICAgKiBnZW5lcmF0ZWQuIAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmxldEphdmFGaWxlTmFtZSgpIHsKKworICAgICAgICBpZiAoc2VydmxldEphdmFGaWxlTmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICBzZXJ2bGV0SmF2YUZpbGVOYW1lID0KKwkJZ2V0T3V0cHV0RGlyKCkgKyBnZXRTZXJ2bGV0Q2xhc3NOYW1lKCkgKyAiLmphdmEiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gTWFrZSBzdXJlIG91dHB1dCBkaXIgZXhpc3RzCisgICAgICAgICAgICBtYWtlT3V0cHV0RGlyKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNlcnZsZXRKYXZhRmlsZU5hbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U2VydmxldEphdmFGaWxlTmFtZShTdHJpbmcgc2VydmxldEphdmFGaWxlTmFtZSkgeworICAgICAgICB0aGlzLnNlcnZsZXRKYXZhRmlsZU5hbWUgPSBzZXJ2bGV0SmF2YUZpbGVOYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBob2xkIG9mIHRoZSBPcHRpb25zIG9iamVjdCBmb3IgdGhpcyBjb250ZXh0LiAKKyAgICAgKi8KKyAgICBwdWJsaWMgT3B0aW9ucyBnZXRPcHRpb25zKCkgeworICAgICAgICByZXR1cm4gb3B0aW9uczsKKyAgICB9CisKKyAgICBwdWJsaWMgU2VydmxldENvbnRleHQgZ2V0U2VydmxldENvbnRleHQoKSB7CisgICAgICAgIHJldHVybiBjb250ZXh0OworICAgIH0KKworICAgIHB1YmxpYyBKc3BSdW50aW1lQ29udGV4dCBnZXRSdW50aW1lQ29udGV4dCgpIHsKKyAgICAgICAgcmV0dXJuIHJjdHh0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhdGggb2YgdGhlIEphdmEgZmlsZSByZWxhdGl2ZSB0byB0aGUgd29yayBkaXJlY3RvcnkuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRKYXZhUGF0aCgpIHsKKworICAgICAgICBpZiAoamF2YVBhdGggIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGphdmFQYXRoOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGlzVGFnRmlsZSgpKSB7CisJICAgIFN0cmluZyB0YWdOYW1lID0gdGFnSW5mby5nZXRUYWdDbGFzc05hbWUoKTsKKyAgICAgICAgICAgIGphdmFQYXRoID0gdGFnTmFtZS5yZXBsYWNlKCcuJywgJy8nKSArICIuamF2YSI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBqYXZhUGF0aCA9IGdldFNlcnZsZXRQYWNrYWdlTmFtZSgpLnJlcGxhY2UoJy4nLCAnLycpICsgJy8nICsKKyAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2VydmxldENsYXNzTmFtZSgpICsgIi5qYXZhIjsKKwl9CisgICAgICAgIHJldHVybiBqYXZhUGF0aDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzRmlsZU5hbWUoKSB7CisKKyAgICAgICAgaWYgKGNsYXNzRmlsZU5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgY2xhc3NGaWxlTmFtZSA9IGdldE91dHB1dERpcigpICsgZ2V0U2VydmxldENsYXNzTmFtZSgpICsgIi5jbGFzcyI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBNYWtlIHN1cmUgb3V0cHV0IGRpciBleGlzdHMKKyAgICAgICAgICAgIG1ha2VPdXRwdXREaXIoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY2xhc3NGaWxlTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGNvbnRlbnQgdHlwZSBvZiB0aGlzIEpTUC4KKyAgICAgKgorICAgICAqIENvbnRlbnQgdHlwZSBpbmNsdWRlcyBjb250ZW50IHR5cGUgYW5kIGVuY29kaW5nLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGUoKSB7CisgICAgICAgIHJldHVybiBjb250ZW50VHlwZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDb250ZW50VHlwZShTdHJpbmcgY29udGVudFR5cGUpIHsKKyAgICAgICAgdGhpcy5jb250ZW50VHlwZSA9IGNvbnRlbnRUeXBlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXJlIGlzIHRoZSBzZXJ2bGV0IGJlaW5nIGdlbmVyYXRlZD8KKyAgICAgKi8KKyAgICBwdWJsaWMgU2VydmxldFdyaXRlciBnZXRXcml0ZXIoKSB7CisgICAgICAgIHJldHVybiB3cml0ZXI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0V3JpdGVyKFNlcnZsZXRXcml0ZXIgd3JpdGVyKSB7CisgICAgICAgIHRoaXMud3JpdGVyID0gd3JpdGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlICdsb2NhdGlvbicgb2YgdGhlIFRMRCBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHRhZ2xpYiAndXJpJy4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIEFuIGFycmF5IG9mIHR3byBTdHJpbmdzOiBUaGUgZmlyc3QgZWxlbWVudCBkZW5vdGVzIHRoZSByZWFsCisgICAgICogcGF0aCB0byB0aGUgVExELiBJZiB0aGUgcGF0aCB0byB0aGUgVExEIHBvaW50cyB0byBhIGphciBmaWxlLCB0aGVuIHRoZQorICAgICAqIHNlY29uZCBlbGVtZW50IGRlbm90ZXMgdGhlIG5hbWUgb2YgdGhlIFRMRCBlbnRyeSBpbiB0aGUgamFyIGZpbGUuCisgICAgICogUmV0dXJucyBudWxsIGlmIHRoZSBnaXZlbiB1cmkgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCBhbnkgdGFnIGxpYnJhcnkKKyAgICAgKiAnZXhwb3NlZCcgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VGxkTG9jYXRpb24oU3RyaW5nIHVyaSkgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1tdIGxvY2F0aW9uID0gCisgICAgICAgICAgICBnZXRPcHRpb25zKCkuZ2V0VGxkTG9jYXRpb25zQ2FjaGUoKS5nZXRMb2NhdGlvbih1cmkpOworICAgICAgICByZXR1cm4gbG9jYXRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogQXJlIHdlIGtlZXBpbmcgZ2VuZXJhdGVkIGNvZGUgYXJvdW5kPworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGtlZXBHZW5lcmF0ZWQoKSB7CisgICAgICAgIHJldHVybiBnZXRPcHRpb25zKCkuZ2V0S2VlcEdlbmVyYXRlZCgpOworICAgIH0KKworICAgIC8vID09PT09PT09PT09PT09PT09PT09IFJlbW92YWwgPT09PT09PT09PT09PT09PT09PT0gCisKKyAgICBwdWJsaWMgdm9pZCBpbmNyZW1lbnRSZW1vdmVkKCkgeworICAgICAgICBpZiAocmVtb3ZlZCA+IDEpIHsKKyAgICAgICAgICAgIGpzcENvbXBpbGVyLnJlbW92ZUdlbmVyYXRlZEZpbGVzKCk7CisgICAgICAgICAgICBpZiggcmN0eHQgIT0gbnVsbCApCisgICAgICAgICAgICAgICAgcmN0eHQucmVtb3ZlV3JhcHBlcihqc3BVcmkpOworICAgICAgICB9CisgICAgICAgIHJlbW92ZWQrKzsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JlbW92ZWQoKSB7CisgICAgICAgIGlmIChyZW1vdmVkID4gMSApIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyA9PT09PT09PT09PT09PT09PT09PSBDb21waWxlIGFuZCByZWxvYWQgPT09PT09PT09PT09PT09PT09PT0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBjb21waWxlKCkgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgY3JlYXRlQ29tcGlsZXIoKTsKKyAgICAgICAgaWYgKGlzUGFja2FnZWRUYWdGaWxlIHx8IGpzcENvbXBpbGVyLmlzT3V0RGF0ZWQoKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBqc3BMb2FkZXIgPSBudWxsOworICAgICAgICAgICAgICAgIGpzcENvbXBpbGVyLmNvbXBpbGUoKTsKKyAgICAgICAgICAgICAgICBqc3cuc2V0UmVsb2FkKHRydWUpOworICAgICAgICAgICAgICAgIGpzdy5zZXRDb21waWxhdGlvbkV4Y2VwdGlvbihudWxsKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEphc3BlckV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIC8vIENhY2hlIGNvbXBpbGF0aW9uIGV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIGpzdy5zZXRDb21waWxhdGlvbkV4Y2VwdGlvbihleCk7CisgICAgICAgICAgICAgICAgdGhyb3cgZXg7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICBleC5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICBKYXNwZXJFeGNlcHRpb24gamUgPSBuZXcgSmFzcGVyRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsaXplci5nZXRNZXNzYWdlKCJqc3AuZXJyb3IudW5hYmxlLmNvbXBpbGUiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBleCk7CisgICAgICAgICAgICAgICAgLy8gQ2FjaGUgY29tcGlsYXRpb24gZXhjZXB0aW9uCisgICAgICAgICAgICAgICAganN3LnNldENvbXBpbGF0aW9uRXhjZXB0aW9uKGplKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBqZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vID09PT09PT09PT09PT09PT09PT09IE1hbmlwdWxhdGluZyB0aGUgY2xhc3MgPT09PT09PT09PT09PT09PT09PT0KKworICAgIHB1YmxpYyBDbGFzcyBsb2FkKCkgCisgICAgICAgIHRocm93cyBKYXNwZXJFeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGdldEpzcExvYWRlcigpOworICAgICAgICAgICAgCisgICAgICAgICAgICBTdHJpbmcgbmFtZTsKKyAgICAgICAgICAgIGlmIChpc1RhZ0ZpbGUoKSkgeworICAgICAgICAgICAgICAgIG5hbWUgPSB0YWdJbmZvLmdldFRhZ0NsYXNzTmFtZSgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBuYW1lID0gZ2V0U2VydmxldFBhY2thZ2VOYW1lKCkgKyAiLiIgKyBnZXRTZXJ2bGV0Q2xhc3NOYW1lKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXJ2bGV0Q2xhc3MgPSBqc3BMb2FkZXIubG9hZENsYXNzKG5hbWUpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGNleCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEphc3BlckV4Y2VwdGlvbihMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgianNwLmVycm9yLnVuYWJsZS5sb2FkIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNleCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEphc3BlckV4Y2VwdGlvbihMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgianNwLmVycm9yLnVuYWJsZS5jb21waWxlIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4KTsKKyAgICAgICAgfQorICAgICAgICByZW1vdmVkID0gMDsKKyAgICAgICAgcmV0dXJuIHNlcnZsZXRDbGFzczsKKyAgICB9CisKKyAgICAvLyA9PT09PT09PT09PT09PT09PT09PSBQcml2YXRlIG1ldGhvZHMgPT09PT09PT09PT09PT09PT09PT0gCisKKyAgICBzdGF0aWMgT2JqZWN0IG91dHB1dERpckxvY2sgPSBuZXcgT2JqZWN0KCk7CisKKyAgICBwcml2YXRlIHZvaWQgbWFrZU91dHB1dERpcigpIHsKKyAgICAgICAgc3luY2hyb25pemVkKG91dHB1dERpckxvY2spIHsKKyAgICAgICAgICAgIEZpbGUgb3V0RGlyRmlsZSA9IG5ldyBGaWxlKG91dHB1dERpcik7CisgICAgICAgICAgICBvdXREaXJGaWxlLm1rZGlycygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZU91dHB1dERpcigpIHsKKyAgICAgICAgU3RyaW5nIHBhdGggPSBudWxsOworICAgICAgICBpZiAoaXNUYWdGaWxlKCkpIHsKKwkgICAgU3RyaW5nIHRhZ05hbWUgPSB0YWdJbmZvLmdldFRhZ0NsYXNzTmFtZSgpOworICAgICAgICAgICAgcGF0aCA9IHRhZ05hbWUucmVwbGFjZSgnLicsICcvJyk7CisJICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZygwLCBwYXRoLmxhc3RJbmRleE9mKCcvJykpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcGF0aCA9IGdldFNlcnZsZXRQYWNrYWdlTmFtZSgpLnJlcGxhY2UoJy4nLCAnLycpOworCX0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gQXBwZW5kIHNlcnZsZXQgb3IgdGFnIGhhbmRsZXIgcGF0aCB0byBzY3JhdGNoIGRpcgorICAgICAgICAgICAgYmFzZVVybCA9IG9wdGlvbnMuZ2V0U2NyYXRjaERpcigpLnRvVVJMKCk7CisgICAgICAgICAgICBTdHJpbmcgb3V0VXJsU3RyaW5nID0gYmFzZVVybC50b1N0cmluZygpICsgJy8nICsgcGF0aDsKKyAgICAgICAgICAgIFVSTCBvdXRVcmwgPSBuZXcgVVJMKG91dFVybFN0cmluZyk7CisgICAgICAgICAgICBvdXRwdXREaXIgPSBvdXRVcmwuZ2V0RmlsZSgpICsgRmlsZS5zZXBhcmF0b3I7CisgICAgICAgICAgICBtYWtlT3V0cHV0RGlyKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJObyBvdXRwdXQgZGlyZWN0b3J5OiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNQYXRoU2VwYXJhdG9yKGNoYXIgYykgeworICAgICAgIHJldHVybiAoYyA9PSAnLycgfHwgYyA9PSAnXFwnKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgY2Fub25pY2FsVVJJKFN0cmluZyBzKSB7CisgICAgICAgaWYgKHMgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisgICAgICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICBmaW5hbCBpbnQgbGVuID0gcy5sZW5ndGgoKTsKKyAgICAgICBpbnQgcG9zID0gMDsKKyAgICAgICB3aGlsZSAocG9zIDwgbGVuKSB7CisgICAgICAgICAgIGNoYXIgYyA9IHMuY2hhckF0KHBvcyk7CisgICAgICAgICAgIGlmICggaXNQYXRoU2VwYXJhdG9yKGMpICkgeworICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAqIG11bHRpcGxlIHBhdGggc2VwYXJhdG9ycy4KKyAgICAgICAgICAgICAgICAqICdmb28vLy9iYXInIC0+ICdmb28vYmFyJworICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICB3aGlsZSAocG9zKzEgPCBsZW4gJiYgaXNQYXRoU2VwYXJhdG9yKHMuY2hhckF0KHBvcysxKSkpIHsKKyAgICAgICAgICAgICAgICAgICArK3BvczsKKyAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgaWYgKHBvcysxIDwgbGVuICYmIHMuY2hhckF0KHBvcysxKSA9PSAnLicpIHsKKyAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAqIGEgc2luZ2xlIGRvdCBhdCB0aGUgZW5kIG9mIHRoZSBwYXRoIC0gd2UgYXJlIGRvbmUuCisgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgaWYgKHBvcysyID49IGxlbikgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHMuY2hhckF0KHBvcysyKSkgeworICAgICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgICAgKiBzZWxmIGRpcmVjdG9yeSBpbiBwYXRoCisgICAgICAgICAgICAgICAgICAgICAgICAqIGZvby8uL2JhciAtPiBmb28vYmFyCisgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgIGNhc2UgJy8nOgorICAgICAgICAgICAgICAgICAgIGNhc2UgJ1xcJzoKKyAgICAgICAgICAgICAgICAgICAgICAgcG9zICs9IDI7CisgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAgICAqIHR3byBkb3RzIGluIGEgcGF0aDogZ28gYmFjayBvbmUgaGllcmFyY2h5LgorICAgICAgICAgICAgICAgICAgICAgICAgKiBmb28vYmFyLy4uL2JheiAtPiBmb28vYmF6CisgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgIGNhc2UgJy4nOgorICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IGlmIHdlIGhhdmUgZXhhY3RseSBfdHdvXyBkb3RzLgorICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9zKzMgPCBsZW4gJiYgaXNQYXRoU2VwYXJhdG9yKHMuY2hhckF0KHBvcyszKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcyArPSAzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlcGFyYXRvclBvcyA9IHJlc3VsdC5sZW5ndGgoKS0xOworICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHNlcGFyYXRvclBvcyA+PSAwICYmIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEgaXNQYXRoU2VwYXJhdG9yKHJlc3VsdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jaGFyQXQoc2VwYXJhdG9yUG9zKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLXNlcGFyYXRvclBvczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXBhcmF0b3JQb3MgPj0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuc2V0TGVuZ3RoKHNlcGFyYXRvclBvcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgfQorICAgICAgICAgICByZXN1bHQuYXBwZW5kKGMpOworICAgICAgICAgICArK3BvczsKKyAgICAgICB9CisgICAgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL09wdGlvbnMuamF2YSBiL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9PcHRpb25zLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVhMmM0MgotLS0gL2Rldi9udWxsCisrKyBiL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9PcHRpb25zLmphdmEKQEAgLTAsMCArMSwxNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphc3BlcjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLmNvbXBpbGVyLkpzcENvbmZpZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5jb21waWxlci5UYWdQbHVnaW5NYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLmNvbXBpbGVyLlRsZExvY2F0aW9uc0NhY2hlOworCisvKioKKyAqIEEgY2xhc3MgdG8gaG9sZCBhbGwgaW5pdCBwYXJhbWV0ZXJzIHNwZWNpZmljIHRvIHRoZSBKU1AgZW5naW5lLiAKKyAqCisgKiBAYXV0aG9yIEFuaWwgSy4gVmlqZW5kcmFuCisgKiBAYXV0aG9yIEhhbnMgQmVyZ3N0ZW4KKyAqIEBhdXRob3IgUGllcnJlIERlbGlzbGUKKyAqLworcHVibGljIGludGVyZmFjZSBPcHRpb25zIHsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiBKYXNwZXIgaXNzdWVzIGEgY29tcGlsYXRpb24gZXJyb3IgaW5zdGVhZCBvZiBhIHJ1bnRpbWUKKyAgICAgKiBJbnN0YW50aWF0aW9uIGVycm9yIGlmIHRoZSBjbGFzcyBhdHRyaWJ1dGUgc3BlY2lmaWVkIGluIHVzZUJlYW4gYWN0aW9uCisgICAgICogaXMgaW52YWxpZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRFcnJvck9uVXNlQmVhbkludmFsaWRDbGFzc0F0dHJpYnV0ZSgpOworCisgICAgLyoqCisgICAgICogQXJlIHdlIGtlZXBpbmcgZ2VuZXJhdGVkIGNvZGUgYXJvdW5kPworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldEtlZXBHZW5lcmF0ZWQoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0YWcgaGFuZGxlciBwb29saW5nIGlzIGVuYWJsZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1Bvb2xpbmdFbmFibGVkKCk7CisKKyAgICAvKioKKyAgICAgKiBBcmUgd2Ugc3VwcG9ydGluZyBIVE1MIG1hcHBlZCBzZXJ2bGV0cz8KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRNYXBwZWRGaWxlKCk7CisKKyAgICAvKioKKyAgICAgKiBTaG91bGQgZXJyb3JzIGJlIHNlbnQgdG8gY2xpZW50IG9yIHRocm93biBpbnRvIHN0ZGVycj8KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRTZW5kRXJyb3JUb0NsaWVudCgpOworIAorICAgIC8qKgorICAgICAqIFNob3VsZCB3ZSBpbmNsdWRlIGRlYnVnIGluZm9ybWF0aW9uIGluIGNvbXBpbGVkIGNsYXNzPworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldENsYXNzRGVidWdJbmZvKCk7CisKKyAgICAvKioKKyAgICAgKiBCYWNrZ3JvdW5kIGNvbXBpbGUgdGhyZWFkIGNoZWNrIGludGVydmFsIGluIHNlY29uZHMKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldENoZWNrSW50ZXJ2YWwoKTsKKworICAgIC8qKgorICAgICAqIElzIEphc3BlciBiZWluZyB1c2VkIGluIGRldmVsb3BtZW50IG1vZGU/CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0RGV2ZWxvcG1lbnQoKTsKKworICAgIC8qKgorICAgICAqIEpTUCByZWxvYWRpbmcgY2hlY2sgPworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldFJlbG9hZGluZygpOworCisgICAgLyoqCisgICAgICogSXMgdGhlIGdlbmVyYXRpb24gb2YgU01BUCBpbmZvIGZvciBKU1I0NSBkZWJ1Z2dpbmcgc3VwcHJlc3NlZD8KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1NtYXBTdXBwcmVzc2VkKCk7CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciBTTUFQIGluZm8gZm9yIEpTUjQ1IGRlYnVnZ2luZyBzaG91bGQgYmUgZHVtcGVkIHRvIGEKKyAgICAgKiBmaWxlLgorICAgICAqIElnbm9yZWQgaXMgc3VwcHJlc3NTbWFwKCkgaXMgdHJ1ZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzU21hcER1bXBlZCgpOworCisgICAgLyoqCisgICAgICogU2hvdWxkIHdoaXRlIHNwYWNlcyBiZXR3ZWVuIGRpcmVjdGl2ZXMgb3IgYWN0aW9ucyBiZSB0cmltbWVkPworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldFRyaW1TcGFjZXMoKTsKKworICAgIC8qKgorICAgICAqIENsYXNzIElEIGZvciB1c2UgaW4gdGhlIHBsdWdpbiB0YWcgd2hlbiB0aGUgYnJvd3NlciBpcyBJRS4gCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJZUNsYXNzSWQoKTsKKworICAgIC8qKgorICAgICAqIFdoYXQgaXMgbXkgc2NyYXRjaCBkaXI/CisgICAgICovCisgICAgcHVibGljIEZpbGUgZ2V0U2NyYXRjaERpcigpOworCisgICAgLyoqCisgICAgICogV2hhdCBjbGFzc3BhdGggc2hvdWxkIEkgdXNlIHdoaWxlIGNvbXBpbGluZyB0aGUgc2VydmxldHMKKyAgICAgKiBnZW5lcmF0ZWQgZnJvbSBKU1AgZmlsZXM/CisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDbGFzc1BhdGgoKTsKKworICAgIC8qKgorICAgICAqIENvbXBpbGVyIHRvIHVzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbXBpbGVyKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY29tcGlsZXIgdGFyZ2V0IFZNLCBlLmcuIDEuMSwgMS4yLCAxLjMsIG9yIDEuNC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbXBpbGVyVGFyZ2V0Vk0oKTsKKworICAgIC8qKgorICAgICAqIFRoZSBjYWNoZSBmb3IgdGhlIGxvY2F0aW9uIG9mIHRoZSBUTEQncworICAgICAqIGZvciB0aGUgdmFyaW91cyB0YWcgbGlicmFyaWVzICdleHBvc2VkJworICAgICAqIGJ5IHRoZSB3ZWIgYXBwbGljYXRpb24uCisgICAgICogQSB0YWcgbGlicmFyeSBpcyAnZXhwb3NlZCcgZWl0aGVyIGV4cGxpY2l0ZWx5IGluIAorICAgICAqIHdlYi54bWwgb3IgaW1wbGljaXRlbHkgdmlhIHRoZSB1cmkgdGFnIGluIHRoZSBUTEQgCisgICAgICogb2YgYSB0YWdsaWIgZGVwbG95ZWQgaW4gYSBqYXIgZmlsZSAoV0VCLUlORi9saWIpLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgaW5zdGFuY2Ugb2YgdGhlIFRsZExvY2F0aW9uc0NhY2hlCisgICAgICogZm9yIHRoZSB3ZWItYXBwbGljYXRpb24uCisgICAgICovCisgICAgcHVibGljIFRsZExvY2F0aW9uc0NhY2hlIGdldFRsZExvY2F0aW9uc0NhY2hlKCk7CisKKyAgICAvKioKKyAgICAgKiBKYXZhIHBsYXRmb3JtIGVuY29kaW5nIHRvIGdlbmVyYXRlIHRoZSBKU1AKKyAgICAgKiBwYWdlIHNlcnZsZXQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRKYXZhRW5jb2RpbmcoKTsKKworICAgIC8qKgorICAgICAqIGJvb2xlYW4gZmxhZyB0byB0ZWxsIEFudCB3aGV0aGVyIHRvIGZvcmsgSlNQIHBhZ2UgY29tcGlsYXRpb25zLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldEZvcmsoKTsKKworICAgIC8qKgorICAgICAqIE9idGFpbiBKU1AgY29uZmlndXJhdGlvbiBpbmZvcm1hbnRpb24gc3BlY2lmaWVkIGluIHdlYi54bWwuICAKKyAgICAgKi8KKyAgICBwdWJsaWMgSnNwQ29uZmlnIGdldEpzcENvbmZpZygpOworCisgICAgLyoqCisgICAgICogSXMgZ2VuZXJhdGlvbiBvZiBYLVBvd2VyZWQtQnkgcmVzcG9uc2UgaGVhZGVyIGVuYWJsZWQvZGlzYWJsZWQ/CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNYcG93ZXJlZEJ5KCk7CisKKyAgICAvKioKKyAgICAgKiBPYnRhaW4gYSBUYWcgUGx1Z2luIE1hbmFnZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgVGFnUGx1Z2luTWFuYWdlciBnZXRUYWdQbHVnaW5NYW5hZ2VyKCk7CisKKyAgICAvKioKKyAgICAgKiBBcmUgVGV4dCBzdHJpbmdzIHRvIGJlIGdlbmVyYXRlZCBhcyBjaGFyIGFycmF5cz8KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZW5TdHJpbmdBc0NoYXJBcnJheSgpOworICAgIAorICAgIC8qKgorICAgICAqIE1vZGlmaWNhdGlvbiB0ZXN0IGludGVydmFsLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0TW9kaWZpY2F0aW9uVGVzdEludGVydmFsKCk7CisgICAgCit9CmRpZmYgLS1naXQgYS9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvQW50Q29tcGlsZXIuamF2YSBiL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9BbnRDb21waWxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwYTQ2NjkKLS0tIC9kZXYvbnVsbAorKysgYi9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvQW50Q29tcGlsZXIuamF2YQpAQCAtMCwwICsxLDI2MiBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFzcGVyLmNvbXBpbGVyOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLkphc3BlckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci51dGlsLlN5c3RlbUxvZ0hhbmRsZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuRGVmYXVsdExvZ2dlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkphdmFjOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGg7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0dGVyblNldDsKKworLyoqCisgKiBNYWluIEpTUCBjb21waWxlciBjbGFzcy4gVGhpcyBjbGFzcyB1c2VzIEFudCBmb3IgY29tcGlsaW5nLgorICoKKyAqIEBhdXRob3IgQW5pbCBLLiBWaWplbmRyYW4KKyAqIEBhdXRob3IgTWFuZGFyIFJhamUKKyAqIEBhdXRob3IgUGllcnJlIERlbGlzbGUKKyAqIEBhdXRob3IgS2luLW1hbiBDaHVuZworICogQGF1dGhvciBSZW15IE1hdWNoZXJhdAorICogQGF1dGhvciBNYXJrIFJvdGgKKyAqLworcHVibGljIGNsYXNzIEFudENvbXBpbGVyIGV4dGVuZHMgQ29tcGlsZXIgeworCisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKyAgICBwcm90ZWN0ZWQgUHJvamVjdCBwcm9qZWN0PW51bGw7CisgICAgcHJvdGVjdGVkIEphc3BlckFudExvZ2dlciBsb2dnZXI7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3IKKworICAgIC8vIExhenkgZXZhbCAtIGlmIHdlIGRvbid0IG5lZWQgdG8gY29tcGlsZSB3ZSBwcm9iYWJseSBkb24ndCBuZWVkIHRoZSBwcm9qZWN0CisgICAgcHJvdGVjdGVkIFByb2plY3QgZ2V0UHJvamVjdCgpIHsKKyAgICAgICAgCisgICAgICAgIGlmKCBwcm9qZWN0IT1udWxsICkgcmV0dXJuIHByb2plY3Q7CisgICAgICAgIAorICAgICAgICAvLyBJbml0aWFsaXppbmcgcHJvamVjdAorICAgICAgICBwcm9qZWN0ID0gbmV3IFByb2plY3QoKTsKKyAgICAgICAgbG9nZ2VyID0gbmV3IEphc3BlckFudExvZ2dlcigpOworICAgICAgICBsb2dnZXIuc2V0T3V0cHV0UHJpbnRTdHJlYW0oU3lzdGVtLm91dCk7CisgICAgICAgIGxvZ2dlci5zZXRFcnJvclByaW50U3RyZWFtKFN5c3RlbS5lcnIpOworICAgICAgICBsb2dnZXIuc2V0TWVzc2FnZU91dHB1dExldmVsKFByb2plY3QuTVNHX0lORk8pOworICAgICAgICBwcm9qZWN0LmFkZEJ1aWxkTGlzdGVuZXIoIGxvZ2dlcik7CisgICAgICAgIGlmIChTeXN0ZW0uZ2V0UHJvcGVydHkoImNhdGFsaW5hLmhvbWUiKSAhPSBudWxsKSB7CisgICAgICAgICAgICBwcm9qZWN0LnNldEJhc2VkaXIoIFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2F0YWxpbmEuaG9tZSIpKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYoIG9wdGlvbnMuZ2V0Q29tcGlsZXIoKSAhPSBudWxsICkgeworICAgICAgICAgICAgaWYoIGxvZy5pc0RlYnVnRW5hYmxlZCgpICkKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkNvbXBpbGVyICIgKyBvcHRpb25zLmdldENvbXBpbGVyKCkgKTsKKyAgICAgICAgICAgIHByb2plY3Quc2V0UHJvcGVydHkoImJ1aWxkLmNvbXBpbGVyIiwgb3B0aW9ucy5nZXRDb21waWxlcigpICk7CisgICAgICAgIH0KKyAgICAgICAgcHJvamVjdC5pbml0KCk7CisgICAgICAgIHJldHVybiBwcm9qZWN0OworICAgIH0KKyAgICAKKyAgICBjbGFzcyBKYXNwZXJBbnRMb2dnZXIgZXh0ZW5kcyBEZWZhdWx0TG9nZ2VyIHsKKyAgICAgICAgCisgICAgICAgIHByb3RlY3RlZCBTdHJpbmdCdWZmZXIgcmVwb3J0QnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICAKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgcHJpbnRNZXNzYWdlKGZpbmFsIFN0cmluZyBtZXNzYWdlLAorICAgICAgICAgICAgICAgIGZpbmFsIFByaW50U3RyZWFtIHN0cmVhbSwKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcHJpb3JpdHkpIHsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgbG9nKFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgICAgICByZXBvcnRCdWYuYXBwZW5kKG1lc3NhZ2UpOworICAgICAgICAgICAgcmVwb3J0QnVmLmFwcGVuZChTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIikpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFJlcG9ydCgpIHsKKyAgICAgICAgICAgIFN0cmluZyByZXBvcnQgPSByZXBvcnRCdWYudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIHJlcG9ydEJ1Zi5zZXRMZW5ndGgoMCk7CisgICAgICAgICAgICByZXR1cm4gcmVwb3J0OworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKiogCisgICAgICogQ29tcGlsZSB0aGUgc2VydmxldCBmcm9tIC5qYXZhIGZpbGUgdG8gLmNsYXNzIGZpbGUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZUNsYXNzKFN0cmluZ1tdIHNtYXApCisgICAgICAgIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIEphc3BlckV4Y2VwdGlvbiwgRXhjZXB0aW9uIHsKKyAgICAgICAgCisgICAgICAgIGxvbmcgdDE9U3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIFN0cmluZyBqYXZhRW5jb2RpbmcgPSBjdHh0LmdldE9wdGlvbnMoKS5nZXRKYXZhRW5jb2RpbmcoKTsKKyAgICAgICAgU3RyaW5nIGphdmFGaWxlTmFtZSA9IGN0eHQuZ2V0U2VydmxldEphdmFGaWxlTmFtZSgpOworICAgICAgICBTdHJpbmcgY2xhc3NwYXRoID0gY3R4dC5nZXRDbGFzc1BhdGgoKTsgCisgICAgICAgIAorICAgICAgICBTdHJpbmcgc2VwID0gU3lzdGVtLmdldFByb3BlcnR5KCJwYXRoLnNlcGFyYXRvciIpOworICAgICAgICAKKyAgICAgICAgU3RyaW5nQnVmZmVyIGVycm9yUmVwb3J0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICAKKyAgICAgICAgU3RyaW5nQnVmZmVyIGluZm89bmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBpbmZvLmFwcGVuZCgiQ29tcGlsZTogamF2YUZpbGVOYW1lPSIgKyBqYXZhRmlsZU5hbWUgKyAiXG4iICk7CisgICAgICAgIGluZm8uYXBwZW5kKCIgICAgY2xhc3NwYXRoPSIgKyBjbGFzc3BhdGggKyAiXG4iICk7CisgICAgICAgIAorICAgICAgICAvLyBTdGFydCBjYXB0dXJpbmcgdGhlIFN5c3RlbS5lcnIgb3V0cHV0IGZvciB0aGlzIHRocmVhZAorICAgICAgICBTeXN0ZW1Mb2dIYW5kbGVyLnNldFRocmVhZCgpOworICAgICAgICAKKyAgICAgICAgLy8gSW5pdGlhbGl6aW5nIGphdmFjIHRhc2sKKyAgICAgICAgZ2V0UHJvamVjdCgpOworICAgICAgICBKYXZhYyBqYXZhYyA9IChKYXZhYykgcHJvamVjdC5jcmVhdGVUYXNrKCJqYXZhYyIpOworICAgICAgICAKKyAgICAgICAgLy8gSW5pdGlhbGl6aW5nIGNsYXNzcGF0aAorICAgICAgICBQYXRoIHBhdGggPSBuZXcgUGF0aChwcm9qZWN0KTsKKyAgICAgICAgcGF0aC5zZXRQYXRoKFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5jbGFzcy5wYXRoIikpOworICAgICAgICBpbmZvLmFwcGVuZCgiICAgIGNwPSIgKyBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuY2xhc3MucGF0aCIpICsgIlxuIik7CisgICAgICAgIFN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGNsYXNzcGF0aCwgc2VwKTsKKyAgICAgICAgd2hpbGUgKHRva2VuaXplci5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgU3RyaW5nIHBhdGhFbGVtZW50ID0gdG9rZW5pemVyLm5leHRUb2tlbigpOworICAgICAgICAgICAgRmlsZSByZXBvc2l0b3J5ID0gbmV3IEZpbGUocGF0aEVsZW1lbnQpOworICAgICAgICAgICAgcGF0aC5zZXRMb2NhdGlvbihyZXBvc2l0b3J5KTsKKyAgICAgICAgICAgIGluZm8uYXBwZW5kKCIgICAgY3A9IiArIHJlcG9zaXRvcnkgKyAiXG4iKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYoIGxvZy5pc0RlYnVnRW5hYmxlZCgpICkKKyAgICAgICAgICAgIGxvZy5kZWJ1ZyggIlVzaW5nIGNsYXNzcGF0aDogIiArIFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5jbGFzcy5wYXRoIikgKyBzZXAKKyAgICAgICAgICAgICAgICAgICAgKyBjbGFzc3BhdGgpOworICAgICAgICAKKyAgICAgICAgLy8gSW5pdGlhbGl6aW5nIHNvdXJjZXBhdGgKKyAgICAgICAgUGF0aCBzcmNQYXRoID0gbmV3IFBhdGgocHJvamVjdCk7CisgICAgICAgIHNyY1BhdGguc2V0TG9jYXRpb24ob3B0aW9ucy5nZXRTY3JhdGNoRGlyKCkpOworICAgICAgICAKKyAgICAgICAgaW5mby5hcHBlbmQoIiAgICB3b3JrIGRpcj0iICsgb3B0aW9ucy5nZXRTY3JhdGNoRGlyKCkgKyAiXG4iKTsKKyAgICAgICAgCisgICAgICAgIC8vIEluaXRpYWxpemUgYW5kIHNldCBqYXZhIGV4dGVuc2lvbnMKKyAgICAgICAgU3RyaW5nIGV4dHMgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuZXh0LmRpcnMiKTsKKyAgICAgICAgaWYgKGV4dHMgIT0gbnVsbCkgeworICAgICAgICAgICAgUGF0aCBleHRkaXJzID0gbmV3IFBhdGgocHJvamVjdCk7CisgICAgICAgICAgICBleHRkaXJzLnNldFBhdGgoZXh0cyk7CisgICAgICAgICAgICBqYXZhYy5zZXRFeHRkaXJzKGV4dGRpcnMpOworICAgICAgICAgICAgaW5mby5hcHBlbmQoIiAgICBleHRlbnNpb24gZGlyPSIgKyBleHRzICsgIlxuIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBBZGQgZW5kb3JzZWQgZGlyZWN0b3JpZXMgaWYgYW55IGFyZSBzcGVjaWZpZWQgYW5kIHdlJ3JlIGZvcmtpbmcKKyAgICAgICAgLy8gU2VlIEJ1Z3ppbGxhIDMxMjU3CisgICAgICAgIGlmKGN0eHQuZ2V0T3B0aW9ucygpLmdldEZvcmsoKSkgeworICAgICAgICAgICAgU3RyaW5nIGVuZG9yc2VkID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmVuZG9yc2VkLmRpcnMiKTsKKyAgICAgICAgICAgIGlmKGVuZG9yc2VkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBKYXZhYy5JbXBsZW1lbnRhdGlvblNwZWNpZmljQXJndW1lbnQgZW5kb3JzZWRBcmcgPSAKKyAgICAgICAgICAgICAgICAgICAgamF2YWMuY3JlYXRlQ29tcGlsZXJBcmcoKTsKKyAgICAgICAgICAgICAgICBlbmRvcnNlZEFyZy5zZXRMaW5lKCItSi1EamF2YS5lbmRvcnNlZC5kaXJzPSIrZW5kb3JzZWQpOworICAgICAgICAgICAgICAgIGluZm8uYXBwZW5kKCIgICAgZW5kb3JzZWQgZGlyPSIgKyBlbmRvcnNlZCArICJcbiIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbmZvLmFwcGVuZCgiICAgIG5vIGVuZG9yc2VkIGRpcnMgc3BlY2lmaWVkXG4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gQ29uZmlndXJlIHRoZSBjb21waWxlciBvYmplY3QKKyAgICAgICAgamF2YWMuc2V0RW5jb2RpbmcoamF2YUVuY29kaW5nKTsKKyAgICAgICAgamF2YWMuc2V0Q2xhc3NwYXRoKHBhdGgpOworICAgICAgICBqYXZhYy5zZXREZWJ1ZyhjdHh0LmdldE9wdGlvbnMoKS5nZXRDbGFzc0RlYnVnSW5mbygpKTsKKyAgICAgICAgamF2YWMuc2V0U3JjZGlyKHNyY1BhdGgpOworICAgICAgICBqYXZhYy5zZXRUZW1wZGlyKG9wdGlvbnMuZ2V0U2NyYXRjaERpcigpKTsKKyAgICAgICAgamF2YWMuc2V0T3B0aW1pemUoISBjdHh0LmdldE9wdGlvbnMoKS5nZXRDbGFzc0RlYnVnSW5mbygpICk7CisgICAgICAgIGphdmFjLnNldEZvcmsoY3R4dC5nZXRPcHRpb25zKCkuZ2V0Rm9yaygpKTsKKyAgICAgICAgaW5mby5hcHBlbmQoIiAgICBzcmNEaXI9IiArIHNyY1BhdGggKyAiXG4iICk7CisgICAgICAgIAorICAgICAgICAvLyBTZXQgdGhlIEphdmEgY29tcGlsZXIgdG8gdXNlCisgICAgICAgIGlmIChvcHRpb25zLmdldENvbXBpbGVyKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgamF2YWMuc2V0Q29tcGlsZXIob3B0aW9ucy5nZXRDb21waWxlcigpKTsKKyAgICAgICAgICAgIGluZm8uYXBwZW5kKCIgICAgY29tcGlsZXI9IiArIG9wdGlvbnMuZ2V0Q29tcGlsZXIoKSArICJcbiIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG9wdGlvbnMuZ2V0Q29tcGlsZXJUYXJnZXRWTSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGphdmFjLnNldFRhcmdldChvcHRpb25zLmdldENvbXBpbGVyVGFyZ2V0Vk0oKSk7CisgICAgICAgICAgICBpbmZvLmFwcGVuZCgiICAgY29tcGlsZXJUYXJnZXRWTT0iICsgb3B0aW9ucy5nZXRDb21waWxlclRhcmdldFZNKCkgKyAiXG4iKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gQnVpbGQgaW5jbHVkZXMgcGF0aAorICAgICAgICBQYXR0ZXJuU2V0Lk5hbWVFbnRyeSBpbmNsdWRlcyA9IGphdmFjLmNyZWF0ZUluY2x1ZGUoKTsKKyAgICAgICAgCisgICAgICAgIGluY2x1ZGVzLnNldE5hbWUoY3R4dC5nZXRKYXZhUGF0aCgpKTsKKyAgICAgICAgaW5mby5hcHBlbmQoIiAgICBpbmNsdWRlPSIrIGN0eHQuZ2V0SmF2YVBhdGgoKSArICJcbiIgKTsKKyAgICAgICAgCisgICAgICAgIEJ1aWxkRXhjZXB0aW9uIGJlID0gbnVsbDsKKyAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoY3R4dC5nZXRPcHRpb25zKCkuZ2V0Rm9yaygpKSB7CisgICAgICAgICAgICAgICAgamF2YWMuZXhlY3V0ZSgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQoamF2YWNMb2NrKSB7CisgICAgICAgICAgICAgICAgICAgIGphdmFjLmV4ZWN1dGUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGJlID0gZTsKKyAgICAgICAgICAgIGxvZy5lcnJvciggIkphdmFjIGV4Y2VwdGlvbiAiLCBlKTsKKyAgICAgICAgICAgIGxvZy5lcnJvciggIkVudjogIiArIGluZm8udG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGVycm9yUmVwb3J0LmFwcGVuZChsb2dnZXIuZ2V0UmVwb3J0KCkpOworICAgICAgICAKKyAgICAgICAgLy8gU3RvcCBjYXB0dXJpbmcgdGhlIFN5c3RlbS5lcnIgb3V0cHV0IGZvciB0aGlzIHRocmVhZAorICAgICAgICBTdHJpbmcgZXJyb3JDYXB0dXJlID0gU3lzdGVtTG9nSGFuZGxlci51bnNldFRocmVhZCgpOworICAgICAgICBpZiAoZXJyb3JDYXB0dXJlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGVycm9yUmVwb3J0LmFwcGVuZChTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIikpOworICAgICAgICAgICAgZXJyb3JSZXBvcnQuYXBwZW5kKGVycm9yQ2FwdHVyZSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmICghY3R4dC5rZWVwR2VuZXJhdGVkKCkpIHsKKyAgICAgICAgICAgIEZpbGUgamF2YUZpbGUgPSBuZXcgRmlsZShqYXZhRmlsZU5hbWUpOworICAgICAgICAgICAgamF2YUZpbGUuZGVsZXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChiZSAhPSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgZXJyb3JSZXBvcnRTdHJpbmcgPSBlcnJvclJlcG9ydC50b1N0cmluZygpOworICAgICAgICAgICAgbG9nLmVycm9yKCJFcnJvciBjb21waWxpbmcgZmlsZTogIiArIGphdmFGaWxlTmFtZSArICIgIgorICAgICAgICAgICAgICAgICAgICArIGVycm9yUmVwb3J0U3RyaW5nKTsKKyAgICAgICAgICAgIEphdmFjRXJyb3JEZXRhaWxbXSBqYXZhY0Vycm9ycyA9IEVycm9yRGlzcGF0Y2hlci5wYXJzZUphdmFjRXJyb3JzKAorICAgICAgICAgICAgICAgICAgICBlcnJvclJlcG9ydFN0cmluZywgamF2YUZpbGVOYW1lLCBwYWdlTm9kZXMpOworICAgICAgICAgICAgaWYgKGphdmFjRXJyb3JzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBlcnJEaXNwYXRjaGVyLmphdmFjRXJyb3IoamF2YWNFcnJvcnMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBlcnJEaXNwYXRjaGVyLmphdmFjRXJyb3IoZXJyb3JSZXBvcnRTdHJpbmcsIGJlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYoIGxvZy5pc0RlYnVnRW5hYmxlZCgpICkgeworICAgICAgICAgICAgbG9uZyB0Mj1TeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgIGxvZy5kZWJ1ZyggIkNvbXBpbGVkICIgKyBjdHh0LmdldFNlcnZsZXRKYXZhRmlsZU5hbWUoKSArICIgIiArICh0Mi10MSkgKyAibXMiKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgbG9nZ2VyID0gbnVsbDsKKyAgICAgICAgcHJvamVjdCA9IG51bGw7CisgICAgICAgIAorICAgICAgICBpZiAoY3R4dC5pc1Byb3RvdHlwZU1vZGUoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBKU1I0NSBTdXBwb3J0CisgICAgICAgIGlmICghIG9wdGlvbnMuaXNTbWFwU3VwcHJlc3NlZCgpKSB7CisgICAgICAgICAgICBTbWFwVXRpbC5pbnN0YWxsU21hcChzbWFwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIAorfQpkaWZmIC0tZ2l0IGEvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL2NvbXBpbGVyL0JlYW5SZXBvc2l0b3J5LmphdmEgYi9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvQmVhblJlcG9zaXRvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODYyZWE5Ci0tLSAvZGV2L251bGwKKysrIGIvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL2NvbXBpbGVyL0JlYW5SZXBvc2l0b3J5LmphdmEKQEAgLTAsMCArMSwxMTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYXNwZXIuY29tcGlsZXI7CisKKworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLkphc3BlckV4Y2VwdGlvbjsKKworLyoqCisgKiBSZXBvc2l0b3J5IG9mIHtwYWdlLCByZXF1ZXN0LCBzZXNzaW9uLCBhcHBsaWNhdGlvbn0tc2NvcGVkIGJlYW5zIAorICoKKyAqIEBhdXRob3IgTWFuZGFyIFJhamUKKyAqLworY2xhc3MgQmVhblJlcG9zaXRvcnkgeworCisgICAgcHJpdmF0ZSBWZWN0b3Igc2Vzc2lvbkJlYW5zOworICAgIHByaXZhdGUgVmVjdG9yIHBhZ2VCZWFuczsKKyAgICBwcml2YXRlIFZlY3RvciBhcHBCZWFuczsKKyAgICBwcml2YXRlIFZlY3RvciByZXF1ZXN0QmVhbnM7CisgICAgcHJpdmF0ZSBIYXNodGFibGUgYmVhblR5cGVzOworICAgIHByaXZhdGUgQ2xhc3NMb2FkZXIgbG9hZGVyOworICAgIHByaXZhdGUgRXJyb3JEaXNwYXRjaGVyIGVyckRpc3BhdGNoZXI7CisKKyAgICAvKgorICAgICAqIENvbnN0cnVjdG9yLgorICAgICAqLyAgICAKKyAgICBwdWJsaWMgQmVhblJlcG9zaXRvcnkoQ2xhc3NMb2FkZXIgbG9hZGVyLCBFcnJvckRpc3BhdGNoZXIgZXJyKSB7CisKKyAgICAgICAgdGhpcy5sb2FkZXIgPSBsb2FkZXI7CisJdGhpcy5lcnJEaXNwYXRjaGVyID0gZXJyOworCisJc2Vzc2lvbkJlYW5zID0gbmV3IFZlY3RvcigxMSk7CisJcGFnZUJlYW5zID0gbmV3IFZlY3RvcigxMSk7CisJYXBwQmVhbnMgPSBuZXcgVmVjdG9yKDExKTsKKwlyZXF1ZXN0QmVhbnMgPSBuZXcgVmVjdG9yKDExKTsKKwliZWFuVHlwZXMgPSBuZXcgSGFzaHRhYmxlKCk7CisgICAgfQorICAgICAgICAKKyAgICBwdWJsaWMgdm9pZCBhZGRCZWFuKE5vZGUuVXNlQmVhbiBuLCBTdHJpbmcgcywgU3RyaW5nIHR5cGUsIFN0cmluZyBzY29wZSkKKwkgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisKKwlpZiAoc2NvcGUgPT0gbnVsbCB8fCBzY29wZS5lcXVhbHMoInBhZ2UiKSkgeworCSAgICBwYWdlQmVhbnMuYWRkRWxlbWVudChzKTsJCisJfSBlbHNlIGlmIChzY29wZS5lcXVhbHMoInJlcXVlc3QiKSkgeworCSAgICByZXF1ZXN0QmVhbnMuYWRkRWxlbWVudChzKTsKKwl9IGVsc2UgaWYgKHNjb3BlLmVxdWFscygic2Vzc2lvbiIpKSB7CisJICAgIHNlc3Npb25CZWFucy5hZGRFbGVtZW50KHMpOworCX0gZWxzZSBpZiAoc2NvcGUuZXF1YWxzKCJhcHBsaWNhdGlvbiIpKSB7CisJICAgIGFwcEJlYW5zLmFkZEVsZW1lbnQocyk7CisJfSBlbHNlIHsKKwkgICAgZXJyRGlzcGF0Y2hlci5qc3BFcnJvcihuLCAianNwLmVycm9yLnVzZUJlYW4uYmFkU2NvcGUiKTsKKwl9CisJCisJcHV0QmVhblR5cGUocywgdHlwZSk7CisgICAgfQorICAgICAgICAgICAgCisgICAgcHVibGljIENsYXNzIGdldEJlYW5UeXBlKFN0cmluZyBiZWFuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwlDbGFzcyBjbGF6eiA9IG51bGw7CisJdHJ5IHsKKwkgICAgY2xhenogPSBsb2FkZXIubG9hZENsYXNzICgoU3RyaW5nKWJlYW5UeXBlcy5nZXQoYmVhbikpOworCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZXgpIHsKKwkgICAgdGhyb3cgbmV3IEphc3BlckV4Y2VwdGlvbiAoZXgpOworCX0KKwlyZXR1cm4gY2xheno7CisgICAgfQorICAgICAgCisgICAgcHVibGljIGJvb2xlYW4gY2hlY2tWYXJpYWJsZSAoU3RyaW5nIGJlYW4pIHsKKwkvLyBYWFggTm90IHN1cmUgaWYgdGhpcyBpcyB0aGUgY29ycmVjdCB3YXkuCisJLy8gQWZ0ZXIgcGFnZUNvbnRleHQgaXMgZmluYWxpc2VkIHRoaXMgd2lsbCBjaGFuZ2UuCisJcmV0dXJuIChjaGVja1BhZ2VCZWFuKGJlYW4pIHx8IGNoZWNrU2Vzc2lvbkJlYW4oYmVhbikgfHwKKwkJY2hlY2tSZXF1ZXN0QmVhbihiZWFuKSB8fCBjaGVja0FwcGxpY2F0aW9uQmVhbihiZWFuKSk7CisgICAgfQorCisKKyAgICBwcml2YXRlIHZvaWQgcHV0QmVhblR5cGUoU3RyaW5nIGJlYW4sIFN0cmluZyB0eXBlKSB7CisJYmVhblR5cGVzLnB1dCAoYmVhbiwgdHlwZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrUGFnZUJlYW4gKFN0cmluZyBzKSB7CisJcmV0dXJuIHBhZ2VCZWFucy5jb250YWlucyAocyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrUmVxdWVzdEJlYW4gKFN0cmluZyBzKSB7CisJcmV0dXJuIHJlcXVlc3RCZWFucy5jb250YWlucyAocyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrU2Vzc2lvbkJlYW4gKFN0cmluZyBzKSB7CisJcmV0dXJuIHNlc3Npb25CZWFucy5jb250YWlucyAocyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrQXBwbGljYXRpb25CZWFuIChTdHJpbmcgcykgeworCXJldHVybiBhcHBCZWFucy5jb250YWlucyAocyk7CisgICAgfQorCit9CisKKworCisKZGlmZiAtLWdpdCBhL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9Db2xsZWN0b3IuamF2YSBiL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9Db2xsZWN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjcyMGM4Ci0tLSAvZGV2L251bGwKKysrIGIvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL2NvbXBpbGVyL0NvbGxlY3Rvci5qYXZhCkBAIC0wLDAgKzEsMjAzIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYXNwZXIuY29tcGlsZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5KYXNwZXJFeGNlcHRpb247CisKKy8qKgorICogQ29sbGVjdCBpbmZvIGFib3V0IHRoZSBwYWdlIGFuZCBub2RlcywgYW5kIG1ha2UgdGhlbSBhdmFpbGFiZSB0aHJvdWdoCisgKiB0aGUgUGFnZUluZm8gb2JqZWN0LgorICoKKyAqIEBhdXRob3IgS2luLW1hbiBDaHVuZworICogQGF1dGhvciBNYXJrIFJvdGgKKyAqLworCitjbGFzcyBDb2xsZWN0b3IgeworCisgICAgLyoqCisgICAgICogQSB2aXNpdG9yIGZvciBjb2xsZWN0aW5nIGluZm9ybWF0aW9uIG9uIHRoZSBwYWdlIGFuZCB0aGUgYm9keSBvZgorICAgICAqIHRoZSBjdXN0b20gdGFncy4KKyAgICAgKi8KKyAgICBzdGF0aWMgY2xhc3MgQ29sbGVjdFZpc2l0b3IgZXh0ZW5kcyBOb2RlLlZpc2l0b3IgeworCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBzY3JpcHRpbmdFbGVtZW50U2VlbiA9IGZhbHNlOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gdXNlYmVhblNlZW4gPSBmYWxzZTsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGluY2x1ZGVBY3Rpb25TZWVuID0gZmFsc2U7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBwYXJhbUFjdGlvblNlZW4gPSBmYWxzZTsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIHNldFByb3BlcnR5U2VlbiA9IGZhbHNlOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gaGFzU2NyaXB0aW5nVmFycyA9IGZhbHNlOworCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuUGFyYW1BY3Rpb24gbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAobi5nZXRWYWx1ZSgpLmlzRXhwcmVzc2lvbigpKSB7CisgICAgICAgICAgICAgICAgc2NyaXB0aW5nRWxlbWVudFNlZW4gPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGFyYW1BY3Rpb25TZWVuID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuSW5jbHVkZUFjdGlvbiBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChuLmdldFBhZ2UoKS5pc0V4cHJlc3Npb24oKSkgeworICAgICAgICAgICAgICAgIHNjcmlwdGluZ0VsZW1lbnRTZWVuID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGluY2x1ZGVBY3Rpb25TZWVuID0gdHJ1ZTsKKyAgICAgICAgICAgIHZpc2l0Qm9keShuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuRm9yd2FyZEFjdGlvbiBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChuLmdldFBhZ2UoKS5pc0V4cHJlc3Npb24oKSkgeworICAgICAgICAgICAgICAgIHNjcmlwdGluZ0VsZW1lbnRTZWVuID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpc2l0Qm9keShuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuU2V0UHJvcGVydHkgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAobi5nZXRWYWx1ZSgpICE9IG51bGwgJiYgbi5nZXRWYWx1ZSgpLmlzRXhwcmVzc2lvbigpKSB7CisgICAgICAgICAgICAgICAgc2NyaXB0aW5nRWxlbWVudFNlZW4gPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0UHJvcGVydHlTZWVuID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuVXNlQmVhbiBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChuLmdldEJlYW5OYW1lKCkgIT0gbnVsbCAmJiBuLmdldEJlYW5OYW1lKCkuaXNFeHByZXNzaW9uKCkpIHsKKyAgICAgICAgICAgICAgICBzY3JpcHRpbmdFbGVtZW50U2VlbiA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1c2ViZWFuU2VlbiA9IHRydWU7CisgICAgICAgICAgICAgICAgdmlzaXRCb2R5KG4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5QbHVnSW4gbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAobi5nZXRIZWlnaHQoKSAhPSBudWxsICYmIG4uZ2V0SGVpZ2h0KCkuaXNFeHByZXNzaW9uKCkpIHsKKyAgICAgICAgICAgICAgICBzY3JpcHRpbmdFbGVtZW50U2VlbiA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobi5nZXRXaWR0aCgpICE9IG51bGwgJiYgbi5nZXRXaWR0aCgpLmlzRXhwcmVzc2lvbigpKSB7CisgICAgICAgICAgICAgICAgc2NyaXB0aW5nRWxlbWVudFNlZW4gPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmlzaXRCb2R5KG4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5DdXN0b21UYWcgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICAvLyBDaGVjayB0byBzZWUgd2hhdCBraW5kcyBvZiBlbGVtZW50IHdlIHNlZSBhcyBjaGlsZCBlbGVtZW50cworICAgICAgICAgICAgY2hlY2tTZWVuKCBuLmdldENoaWxkSW5mbygpLCBuICk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ2hlY2sgYWxsIGNoaWxkIG5vZGVzIGZvciB2YXJpb3VzIGVsZW1lbnRzIGFuZCB1cGRhdGUgdGhlIGdpdmVuCisgICAgICAgICAqIENoaWxkSW5mbyBvYmplY3QgYWNjb3JkaW5nbHkuICBWaXNpdHMgYm9keSBpbiB0aGUgcHJvY2Vzcy4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgdm9pZCBjaGVja1NlZW4oIE5vZGUuQ2hpbGRJbmZvIGNpLCBOb2RlIG4gKQorICAgICAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICAvLyBzYXZlIHZhbHVlcyBjb2xsZWN0ZWQgc28gZmFyCisgICAgICAgICAgICBib29sZWFuIHNjcmlwdGluZ0VsZW1lbnRTZWVuU2F2ZSA9IHNjcmlwdGluZ0VsZW1lbnRTZWVuOworICAgICAgICAgICAgc2NyaXB0aW5nRWxlbWVudFNlZW4gPSBmYWxzZTsKKyAgICAgICAgICAgIGJvb2xlYW4gdXNlYmVhblNlZW5TYXZlID0gdXNlYmVhblNlZW47CisgICAgICAgICAgICB1c2ViZWFuU2VlbiA9IGZhbHNlOworICAgICAgICAgICAgYm9vbGVhbiBpbmNsdWRlQWN0aW9uU2VlblNhdmUgPSBpbmNsdWRlQWN0aW9uU2VlbjsKKyAgICAgICAgICAgIGluY2x1ZGVBY3Rpb25TZWVuID0gZmFsc2U7CisgICAgICAgICAgICBib29sZWFuIHBhcmFtQWN0aW9uU2VlblNhdmUgPSBwYXJhbUFjdGlvblNlZW47CisgICAgICAgICAgICBwYXJhbUFjdGlvblNlZW4gPSBmYWxzZTsKKyAgICAgICAgICAgIGJvb2xlYW4gc2V0UHJvcGVydHlTZWVuU2F2ZSA9IHNldFByb3BlcnR5U2VlbjsKKyAgICAgICAgICAgIHNldFByb3BlcnR5U2VlbiA9IGZhbHNlOworICAgICAgICAgICAgYm9vbGVhbiBoYXNTY3JpcHRpbmdWYXJzU2F2ZSA9IGhhc1NjcmlwdGluZ1ZhcnM7CisgICAgICAgICAgICBoYXNTY3JpcHRpbmdWYXJzID0gZmFsc2U7CisKKyAgICAgICAgICAgIC8vIFNjYW4gYXR0cmlidXRlIGxpc3QgZm9yIGV4cHJlc3Npb25zCisgICAgICAgICAgICBpZiggbiBpbnN0YW5jZW9mIE5vZGUuQ3VzdG9tVGFnICkgeworICAgICAgICAgICAgICAgIE5vZGUuQ3VzdG9tVGFnIGN0ID0gKE5vZGUuQ3VzdG9tVGFnKW47CisgICAgICAgICAgICAgICAgTm9kZS5Kc3BBdHRyaWJ1dGVbXSBhdHRycyA9IGN0LmdldEpzcEF0dHJpYnV0ZXMoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgYXR0cnMgIT0gbnVsbCAmJiBpIDwgYXR0cnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGF0dHJzW2ldLmlzRXhwcmVzc2lvbigpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRpbmdFbGVtZW50U2VlbiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmlzaXRCb2R5KG4pOworCisgICAgICAgICAgICBpZiggKG4gaW5zdGFuY2VvZiBOb2RlLkN1c3RvbVRhZykgJiYgIWhhc1NjcmlwdGluZ1ZhcnMpIHsKKyAgICAgICAgICAgICAgICBOb2RlLkN1c3RvbVRhZyBjdCA9IChOb2RlLkN1c3RvbVRhZyluOworICAgICAgICAgICAgICAgIGhhc1NjcmlwdGluZ1ZhcnMgPSBjdC5nZXRWYXJpYWJsZUluZm9zKCkubGVuZ3RoID4gMCB8fAorICAgICAgICAgICAgICAgICAgICBjdC5nZXRUYWdWYXJpYWJsZUluZm9zKCkubGVuZ3RoID4gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gUmVjb3JkIGlmIHRoZSB0YWcgZWxlbWVudCBhbmQgaXRzIGJvZHkgY29udGFpbnMgYW55IHNjcmlwdGxldC4KKyAgICAgICAgICAgIGNpLnNldFNjcmlwdGxlc3MoISBzY3JpcHRpbmdFbGVtZW50U2Vlbik7CisgICAgICAgICAgICBjaS5zZXRIYXNVc2VCZWFuKHVzZWJlYW5TZWVuKTsKKyAgICAgICAgICAgIGNpLnNldEhhc0luY2x1ZGVBY3Rpb24oaW5jbHVkZUFjdGlvblNlZW4pOworICAgICAgICAgICAgY2kuc2V0SGFzUGFyYW1BY3Rpb24ocGFyYW1BY3Rpb25TZWVuKTsKKyAgICAgICAgICAgIGNpLnNldEhhc1NldFByb3BlcnR5KHNldFByb3BlcnR5U2Vlbik7CisgICAgICAgICAgICBjaS5zZXRIYXNTY3JpcHRpbmdWYXJzKGhhc1NjcmlwdGluZ1ZhcnMpOworCisgICAgICAgICAgICAvLyBQcm9wYWdhdGUgdmFsdWUgb2Ygc2NyaXB0aW5nRWxlbWVudFNlZW4gdXAuCisgICAgICAgICAgICBzY3JpcHRpbmdFbGVtZW50U2VlbiA9IHNjcmlwdGluZ0VsZW1lbnRTZWVuIHx8IHNjcmlwdGluZ0VsZW1lbnRTZWVuU2F2ZTsKKyAgICAgICAgICAgIHVzZWJlYW5TZWVuID0gdXNlYmVhblNlZW4gfHwgdXNlYmVhblNlZW5TYXZlOworICAgICAgICAgICAgc2V0UHJvcGVydHlTZWVuID0gc2V0UHJvcGVydHlTZWVuIHx8IHNldFByb3BlcnR5U2VlblNhdmU7CisgICAgICAgICAgICBpbmNsdWRlQWN0aW9uU2VlbiA9IGluY2x1ZGVBY3Rpb25TZWVuIHx8IGluY2x1ZGVBY3Rpb25TZWVuU2F2ZTsKKyAgICAgICAgICAgIHBhcmFtQWN0aW9uU2VlbiA9IHBhcmFtQWN0aW9uU2VlbiB8fCBwYXJhbUFjdGlvblNlZW5TYXZlOworICAgICAgICAgICAgaGFzU2NyaXB0aW5nVmFycyA9IGhhc1NjcmlwdGluZ1ZhcnMgfHwgaGFzU2NyaXB0aW5nVmFyc1NhdmU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLkpzcEVsZW1lbnQgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAobi5nZXROYW1lQXR0cmlidXRlKCkuaXNFeHByZXNzaW9uKCkpCisgICAgICAgICAgICAgICAgc2NyaXB0aW5nRWxlbWVudFNlZW4gPSB0cnVlOworCisgICAgICAgICAgICBOb2RlLkpzcEF0dHJpYnV0ZVtdIGF0dHJzID0gbi5nZXRKc3BBdHRyaWJ1dGVzKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHJzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGF0dHJzW2ldLmlzRXhwcmVzc2lvbigpKSB7CisgICAgICAgICAgICAgICAgICAgIHNjcmlwdGluZ0VsZW1lbnRTZWVuID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdmlzaXRCb2R5KG4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5Kc3BCb2R5IG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgY2hlY2tTZWVuKCBuLmdldENoaWxkSW5mbygpLCBuICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLk5hbWVkQXR0cmlidXRlIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgY2hlY2tTZWVuKCBuLmdldENoaWxkSW5mbygpLCBuICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLkRlY2xhcmF0aW9uIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgc2NyaXB0aW5nRWxlbWVudFNlZW4gPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5FeHByZXNzaW9uIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgc2NyaXB0aW5nRWxlbWVudFNlZW4gPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5TY3JpcHRsZXQgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBzY3JpcHRpbmdFbGVtZW50U2VlbiA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB1cGRhdGVQYWdlSW5mbyhQYWdlSW5mbyBwYWdlSW5mbykgeworICAgICAgICAgICAgcGFnZUluZm8uc2V0U2NyaXB0bGVzcyghIHNjcmlwdGluZ0VsZW1lbnRTZWVuKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGNvbGxlY3QoQ29tcGlsZXIgY29tcGlsZXIsIE5vZGUuTm9kZXMgcGFnZSkKKyAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisKKyAgICBDb2xsZWN0VmlzaXRvciBjb2xsZWN0VmlzaXRvciA9IG5ldyBDb2xsZWN0VmlzaXRvcigpOworICAgICAgICBwYWdlLnZpc2l0KGNvbGxlY3RWaXNpdG9yKTsKKyAgICAgICAgY29sbGVjdFZpc2l0b3IudXBkYXRlUGFnZUluZm8oY29tcGlsZXIuZ2V0UGFnZUluZm8oKSk7CisKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9Db21waWxlci5qYXZhIGIvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL2NvbXBpbGVyL0NvbXBpbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk3YmQ4OAotLS0gL2Rldi9udWxsCisrKyBiL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9Db21waWxlci5qYXZhCkBAIC0wLDAgKzEsNDc5IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYXNwZXIuY29tcGlsZXI7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLm5ldC5VUkxDb25uZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLkphc3BlckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5Kc3BDb21waWxhdGlvbkNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIuT3B0aW9uczsKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5zZXJ2bGV0LkpzcFNlcnZsZXRXcmFwcGVyOworCisvKioKKyAqIE1haW4gSlNQIGNvbXBpbGVyIGNsYXNzLiBUaGlzIGNsYXNzIHVzZXMgQW50IGZvciBjb21waWxpbmcuCisgKgorICogQGF1dGhvciBBbmlsIEsuIFZpamVuZHJhbgorICogQGF1dGhvciBNYW5kYXIgUmFqZQorICogQGF1dGhvciBQaWVycmUgRGVsaXNsZQorICogQGF1dGhvciBLaW4tbWFuIENodW5nCisgKiBAYXV0aG9yIFJlbXkgTWF1Y2hlcmF0CisgKiBAYXV0aG9yIE1hcmsgUm90aAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29tcGlsZXIgeworICAgIHByb3RlY3RlZCBzdGF0aWMgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGxvZz0KKyAgICAgICAgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeS5nZXRMb2coIENvbXBpbGVyLmNsYXNzICk7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTdGF0aWMKKworCisgICAgLy8gU29tZSBqYXZhYyBhcmUgbm90IHRocmVhZCBzYWZlOyB1c2UgYSBsb2NrIHRvIHNlcmlhbGl6ZSBjb21waWxhdGlvbiwgCisgICAgc3RhdGljIE9iamVjdCBqYXZhY0xvY2sgPSBuZXcgT2JqZWN0KCk7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICBwcm90ZWN0ZWQgSnNwQ29tcGlsYXRpb25Db250ZXh0IGN0eHQ7CisKKyAgICBwcm90ZWN0ZWQgRXJyb3JEaXNwYXRjaGVyIGVyckRpc3BhdGNoZXI7CisgICAgcHJvdGVjdGVkIFBhZ2VJbmZvIHBhZ2VJbmZvOworICAgIHByb3RlY3RlZCBKc3BTZXJ2bGV0V3JhcHBlciBqc3c7CisgICAgcHJvdGVjdGVkIFRhZ0ZpbGVQcm9jZXNzb3IgdGZwOworCisgICAgcHJvdGVjdGVkIE9wdGlvbnMgb3B0aW9uczsKKworICAgIHByb3RlY3RlZCBOb2RlLk5vZGVzIHBhZ2VOb2RlczsKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3IKKworICAgIHB1YmxpYyB2b2lkIGluaXQoSnNwQ29tcGlsYXRpb25Db250ZXh0IGN0eHQsIEpzcFNlcnZsZXRXcmFwcGVyIGpzdykgeworICAgICAgICB0aGlzLmpzdyA9IGpzdzsKKyAgICAgICAgdGhpcy5jdHh0ID0gY3R4dDsKKyAgICAgICAgdGhpcy5vcHRpb25zID0gY3R4dC5nZXRPcHRpb25zKCk7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKiAKKyAgICAgKiBDb21waWxlIHRoZSBqc3AgZmlsZSBpbnRvIGVxdWl2YWxlbnQgc2VydmxldCBpbiAuamF2YSBmaWxlCisgICAgICogQHJldHVybiBhIHNtYXAgZm9yIHRoZSBjdXJyZW50IEpTUCBwYWdlLCBpZiBvbmUgaXMgZ2VuZXJhdGVkLAorICAgICAqICAgICAgICAgbnVsbCBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nW10gZ2VuZXJhdGVKYXZhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgU3RyaW5nW10gc21hcFN0ciA9IG51bGw7CisKKyAgICAgICAgbG9uZyB0MT1TeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKworICAgICAgICAvLyBTZXR1cCBwYWdlIGluZm8gYXJlYQorICAgICAgICBwYWdlSW5mbyA9IG5ldyBQYWdlSW5mbyhuZXcgQmVhblJlcG9zaXRvcnkoY3R4dC5nZXRDbGFzc0xvYWRlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyRGlzcGF0Y2hlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eHQuZ2V0SnNwRmlsZSgpKTsKKworICAgICAgICBKc3BDb25maWcganNwQ29uZmlnID0gb3B0aW9ucy5nZXRKc3BDb25maWcoKTsKKyAgICAgICAgSnNwQ29uZmlnLkpzcFByb3BlcnR5IGpzcFByb3BlcnR5ID0KKyAgICAgICAgICAgIGpzcENvbmZpZy5maW5kSnNwUHJvcGVydHkoY3R4dC5nZXRKc3BGaWxlKCkpOworCisgICAgICAgIC8qCisgICAgICAgICAqIElmIHRoZSBjdXJyZW50IHVyaSBpcyBtYXRjaGVkIGJ5IGEgcGF0dGVybiBzcGVjaWZpZWQgaW4KKyAgICAgICAgICogYSBqc3AtcHJvcGVydHktZ3JvdXAgaW4gd2ViLnhtbCwgaW5pdGlhbGl6ZSBwYWdlSW5mbyB3aXRoCisgICAgICAgICAqIHRob3NlIHByb3BlcnRpZXMuCisgICAgICAgICAqLworICAgICAgICBwYWdlSW5mby5zZXRFTElnbm9yZWQoSnNwVXRpbC5ib29sZWFuVmFsdWUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzcFByb3BlcnR5LmlzRUxJZ25vcmVkKCkpKTsKKyAgICAgICAgcGFnZUluZm8uc2V0U2NyaXB0aW5nSW52YWxpZChKc3BVdGlsLmJvb2xlYW5WYWx1ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganNwUHJvcGVydHkuaXNTY3JpcHRpbmdJbnZhbGlkKCkpKTsKKyAgICAgICAgaWYgKGpzcFByb3BlcnR5LmdldEluY2x1ZGVQcmVsdWRlKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgcGFnZUluZm8uc2V0SW5jbHVkZVByZWx1ZGUoanNwUHJvcGVydHkuZ2V0SW5jbHVkZVByZWx1ZGUoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGpzcFByb3BlcnR5LmdldEluY2x1ZGVDb2RhKCkgIT0gbnVsbCkgeworCSAgICBwYWdlSW5mby5zZXRJbmNsdWRlQ29kYShqc3BQcm9wZXJ0eS5nZXRJbmNsdWRlQ29kYSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBqYXZhRmlsZU5hbWUgPSBjdHh0LmdldFNlcnZsZXRKYXZhRmlsZU5hbWUoKTsKKyAgICAgICAgU2VydmxldFdyaXRlciB3cml0ZXIgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBTZXR1cCB0aGUgU2VydmxldFdyaXRlcgorICAgICAgICAgICAgU3RyaW5nIGphdmFFbmNvZGluZyA9IGN0eHQuZ2V0T3B0aW9ucygpLmdldEphdmFFbmNvZGluZygpOworICAgICAgICAgICAgT3V0cHV0U3RyZWFtV3JpdGVyIG9zdyA9IG51bGw7IAorCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG9zdyA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGVPdXRwdXRTdHJlYW0oamF2YUZpbGVOYW1lKSwgamF2YUVuY29kaW5nKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICBlcnJEaXNwYXRjaGVyLmpzcEVycm9yKCJqc3AuZXJyb3IubmVlZEFsdGVybmF0ZUphdmFFbmNvZGluZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhRW5jb2RpbmcpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3cml0ZXIgPSBuZXcgU2VydmxldFdyaXRlcihuZXcgUHJpbnRXcml0ZXIob3N3KSk7CisgICAgICAgICAgICBjdHh0LnNldFdyaXRlcih3cml0ZXIpOworCisgICAgICAgICAgICAvLyBSZXNldCB0aGUgdGVtcG9yYXJ5IHZhcmlhYmxlIGNvdW50ZXIgZm9yIHRoZSBnZW5lcmF0b3IuCisgICAgICAgICAgICBKc3BVdGlsLnJlc2V0VGVtcG9yYXJ5VmFyaWFibGVOYW1lKCk7CisKKwkgICAgLy8gUGFyc2UgdGhlIGZpbGUKKwkgICAgUGFyc2VyQ29udHJvbGxlciBwYXJzZXJDdGwgPSBuZXcgUGFyc2VyQ29udHJvbGxlcihjdHh0LCB0aGlzKTsKKwkgICAgcGFnZU5vZGVzID0gcGFyc2VyQ3RsLnBhcnNlKGN0eHQuZ2V0SnNwRmlsZSgpKTsKKworCSAgICBpZiAoY3R4dC5pc1Byb3RvdHlwZU1vZGUoKSkgeworICAgICAgICAgICAgICAgIC8vIGdlbmVyYXRlIHByb3RvdHlwZSAuamF2YSBmaWxlIGZvciB0aGUgdGFnIGZpbGUKKyAgICAgICAgICAgICAgICBHZW5lcmF0b3IuZ2VuZXJhdGUod3JpdGVyLCB0aGlzLCBwYWdlTm9kZXMpOworICAgICAgICAgICAgICAgIHdyaXRlci5jbG9zZSgpOworICAgICAgICAgICAgICAgIHdyaXRlciA9IG51bGw7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFZhbGlkYXRlIGFuZCBwcm9jZXNzIGF0dHJpYnV0ZXMKKyAgICAgICAgICAgIFZhbGlkYXRvci52YWxpZGF0ZSh0aGlzLCBwYWdlTm9kZXMpOworCisgICAgICAgICAgICBsb25nIHQyPVN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICAgICAgLy8gRHVtcCBvdXQgdGhlIHBhZ2UgKGZvciBkZWJ1Z2dpbmcpCisgICAgICAgICAgICAvLyBEdW1wZXIuZHVtcChwYWdlTm9kZXMpOworCisgICAgICAgICAgICAvLyBDb2xsZWN0IHBhZ2UgaW5mbworICAgICAgICAgICAgQ29sbGVjdG9yLmNvbGxlY3QodGhpcywgcGFnZU5vZGVzKTsKKworICAgICAgICAgICAgLy8gQ29tcGlsZSAoaWYgbmVjZXNzYXJ5KSBhbmQgbG9hZCB0aGUgdGFnIGZpbGVzIHJlZmVyZW5jZWQgaW4KKyAgICAgICAgICAgIC8vIHRoaXMgY29tcGlsYXRpb24gdW5pdC4KKyAgICAgICAgICAgIHRmcCA9IG5ldyBUYWdGaWxlUHJvY2Vzc29yKCk7CisgICAgICAgICAgICB0ZnAubG9hZFRhZ0ZpbGVzKHRoaXMsIHBhZ2VOb2Rlcyk7CisKKyAgICAgICAgICAgIGxvbmcgdDM9U3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIAorICAgICAgICAgICAgLy8gRGV0ZXJtaW5lIHdoaWNoIGN1c3RvbSB0YWcgbmVlZHMgdG8gZGVjbGFyZSB3aGljaCBzY3JpcHRpbmcgdmFycworICAgICAgICAgICAgU2NyaXB0aW5nVmFyaWFibGVyLnNldChwYWdlTm9kZXMsIGVyckRpc3BhdGNoZXIpOworCisgICAgICAgICAgICAvLyBPcHRpbWl6YXRpb25zIGJ5IFRhZyBQbHVnaW5zCisgICAgICAgICAgICBUYWdQbHVnaW5NYW5hZ2VyIHRhZ1BsdWdpbk1hbmFnZXIgPSBvcHRpb25zLmdldFRhZ1BsdWdpbk1hbmFnZXIoKTsKKyAgICAgICAgICAgIHRhZ1BsdWdpbk1hbmFnZXIuYXBwbHkocGFnZU5vZGVzLCBlcnJEaXNwYXRjaGVyLCBwYWdlSW5mbyk7CisKKyAgICAgICAgICAgIC8vIE9wdGltaXphdGlvbjogY29uY2F0ZW5hdGUgY29udGlndW91cyB0ZW1wbGF0ZSB0ZXh0cy4KKyAgICAgICAgICAgIFRleHRPcHRpbWl6ZXIuY29uY2F0ZW5hdGUodGhpcywgcGFnZU5vZGVzKTsKKworICAgICAgICAgICAgLy8gR2VuZXJhdGUgc3RhdGljIGZ1bmN0aW9uIG1hcHBlciBjb2Rlcy4KKyAgICAgICAgICAgIEVMRnVuY3Rpb25NYXBwZXIubWFwKHRoaXMsIHBhZ2VOb2Rlcyk7CisKKyAgICAgICAgICAgIC8vIGdlbmVyYXRlIHNlcnZsZXQgLmphdmEgZmlsZQorICAgICAgICAgICAgR2VuZXJhdG9yLmdlbmVyYXRlKHdyaXRlciwgdGhpcywgcGFnZU5vZGVzKTsKKyAgICAgICAgICAgIHdyaXRlci5jbG9zZSgpOworICAgICAgICAgICAgd3JpdGVyID0gbnVsbDsKKworICAgICAgICAgICAgLy8gVGhlIHdyaXRlciBpcyBvbmx5IHVzZWQgZHVyaW5nIHRoZSBjb21waWxlLCBkZXJlZmVyZW5jZQorICAgICAgICAgICAgLy8gaXQgaW4gdGhlIEpzcENvbXBpbGF0aW9uQ29udGV4dCB3aGVuIGRvbmUgdG8gYWxsb3cgaXQKKyAgICAgICAgICAgIC8vIHRvIGJlIEdDJ2QgYW5kIHNhdmUgbWVtb3J5LgorICAgICAgICAgICAgY3R4dC5zZXRXcml0ZXIobnVsbCk7CisKKyAgICAgICAgICAgIGxvbmcgdDQ9U3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICBpZiggdDQtdDEgPiA1MDAgKSB7CisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJHZW5lcmF0ZWQgIisgamF2YUZpbGVOYW1lICsgIiB0b3RhbD0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHQ0LXQxKSArICIgZ2VuZXJhdGU9IiArICggdDQtdDMgKSArICIgdmFsaWRhdGU9IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICggdDItdDEgKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGlmICh3cml0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICB3cml0ZXIgPSBudWxsOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlMSkgeworICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3RoaW5nCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBnZW5lcmF0ZWQgLmphdmEgZmlsZQorICAgICAgICAgICAgbmV3IEZpbGUoamF2YUZpbGVOYW1lKS5kZWxldGUoKTsKKyAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAod3JpdGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICB3cml0ZXIuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZTIpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZG8gbm90aGluZworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gSlNSNDUgU3VwcG9ydAorICAgICAgICBpZiAoISBvcHRpb25zLmlzU21hcFN1cHByZXNzZWQoKSkgeworICAgICAgICAgICAgc21hcFN0ciA9IFNtYXBVdGlsLmdlbmVyYXRlU21hcChjdHh0LCBwYWdlTm9kZXMpOworICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgYW55IHByb3RvIHR5cGUgLmphdmEgYW5kIC5jbGFzcyBmaWxlcyB3YXMgZ2VuZXJhdGVkLAorICAgICAgICAvLyB0aGUgcHJvdG90eXBlIC5qYXZhIG1heSBoYXZlIGJlZW4gcmVwbGFjZWQgYnkgdGhlIGN1cnJlbnQKKyAgICAgICAgLy8gY29tcGlsYXRpb24gKGlmIHRoZSB0YWcgZmlsZSBpcyBzZWxmIHJlZmVyZW5jaW5nKSwgYnV0IHRoZQorICAgICAgICAvLyAuY2xhc3MgZmlsZSBuZWVkIHRvIGJlIHJlbW92ZWQsIHRvIG1ha2Ugc3VyZSB0aGF0IGphdmFjIHdvdWxkCisgICAgICAgIC8vIGdlbmVyYXRlIC5jbGFzcyBhZ2FpbiBmcm9tIHRoZSBuZXcgLmphdmEgZmlsZSBqdXN0IGdlbmVyYXRlZC4KKyAgICAgICAgdGZwLnJlbW92ZVByb3RvVHlwZUZpbGVzKGN0eHQuZ2V0Q2xhc3NGaWxlTmFtZSgpKTsKKworICAgICAgICByZXR1cm4gc21hcFN0cjsKKyAgICB9CisKKyAgICAvKiogCisgICAgICogQ29tcGlsZSB0aGUgc2VydmxldCBmcm9tIC5qYXZhIGZpbGUgdG8gLmNsYXNzIGZpbGUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBnZW5lcmF0ZUNsYXNzKFN0cmluZ1tdIHNtYXApCisgICAgICAgIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIEphc3BlckV4Y2VwdGlvbiwgRXhjZXB0aW9uOworICAgIAorICAgIAorICAgIC8qKiAKKyAgICAgKiBDb21waWxlIHRoZSBqc3AgZmlsZSBmcm9tIHRoZSBjdXJyZW50IGVuZ2luZSBjb250ZXh0CisgICAgICovCisgICAgcHVibGljIHZvaWQgY29tcGlsZSgpCisgICAgICAgIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIEphc3BlckV4Y2VwdGlvbiwgRXhjZXB0aW9uCisgICAgeworICAgICAgICBjb21waWxlKHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbXBpbGUgdGhlIGpzcCBmaWxlIGZyb20gdGhlIGN1cnJlbnQgZW5naW5lIGNvbnRleHQuICBBcyBhbiBzaWRlLQorICAgICAqIGVmZmVjdCwgdGFnIGZpbGVzIHRoYXQgYXJlIHJlZmVyZW5jZWQgYnkgdGhpcyBwYWdlIGFyZSBhbHNvIGNvbXBpbGVkLgorICAgICAqIEBwYXJhbSBjb21waWxlQ2xhc3MgSWYgdHJ1ZSwgZ2VuZXJhdGUgYm90aCAuamF2YSBhbmQgLmNsYXNzIGZpbGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIElmIGZhbHNlLCBnZW5lcmF0ZSBvbmx5IC5qYXZhIGZpbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjb21waWxlKGJvb2xlYW4gY29tcGlsZUNsYXNzKQorICAgICAgICB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBKYXNwZXJFeGNlcHRpb24sIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgY29tcGlsZShjb21waWxlQ2xhc3MsIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21waWxlIHRoZSBqc3AgZmlsZSBmcm9tIHRoZSBjdXJyZW50IGVuZ2luZSBjb250ZXh0LiAgQXMgYW4gc2lkZS0KKyAgICAgKiBlZmZlY3QsIHRhZyBmaWxlcyB0aGF0IGFyZSByZWZlcmVuY2VkIGJ5IHRoaXMgcGFnZSBhcmUgYWxzbyBjb21waWxlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb21waWxlQ2xhc3MgSWYgdHJ1ZSwgZ2VuZXJhdGUgYm90aCAuamF2YSBhbmQgLmNsYXNzIGZpbGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIElmIGZhbHNlLCBnZW5lcmF0ZSBvbmx5IC5qYXZhIGZpbGUKKyAgICAgKiBAcGFyYW0ganNwY01vZGUgdHJ1ZSBpZiBpbnZva2VkIGZyb20gSnNwQywgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgcHVibGljIHZvaWQgY29tcGlsZShib29sZWFuIGNvbXBpbGVDbGFzcywgYm9vbGVhbiBqc3BjTW9kZSkKKyAgICAgICAgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgSmFzcGVyRXhjZXB0aW9uLCBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIGlmIChlcnJEaXNwYXRjaGVyID09IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMuZXJyRGlzcGF0Y2hlciA9IG5ldyBFcnJvckRpc3BhdGNoZXIoanNwY01vZGUpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN0cmluZ1tdIHNtYXAgPSBnZW5lcmF0ZUphdmEoKTsKKyAgICAgICAgICAgIGlmIChjb21waWxlQ2xhc3MpIHsKKyAgICAgICAgICAgICAgICBnZW5lcmF0ZUNsYXNzKHNtYXApOworICAgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKHRmcCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGZwLnJlbW92ZVByb3RvVHlwZUZpbGVzKG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZXNlIG9iamVjdCB3aGljaCBhcmUgb25seSB1c2VkIGR1cmluZyB0aGUKKyAgICAgICAgICAgIC8vIGdlbmVyYXRpb24gYW5kIGNvbXBpbGF0aW9uIG9mIHRoZSBKU1AgcGFnZSBnZXQKKyAgICAgICAgICAgIC8vIGRlcmVmZXJlbmNlZCBzbyB0aGF0IHRoZXkgY2FuIGJlIEdDJ2QgYW5kIHJlZHVjZSB0aGUKKyAgICAgICAgICAgIC8vIG1lbW9yeSBmb290cHJpbnQuCisgICAgICAgICAgICB0ZnAgPSBudWxsOworICAgICAgICAgICAgZXJyRGlzcGF0Y2hlciA9IG51bGw7CisgICAgICAgICAgICBwYWdlSW5mbyA9IG51bGw7CisgICAgICAgICAgICBwYWdlTm9kZXMgPSBudWxsOworICAgICAgICAgICAgaWYgKGN0eHQuZ2V0V3JpdGVyKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGN0eHQuZ2V0V3JpdGVyKCkuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICBjdHh0LnNldFdyaXRlcihudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgaXMgYSBwcm90ZWN0ZWQgbWV0aG9kIGludGVuZGVkIHRvIGJlIG92ZXJyaWRkZW4gYnkgCisgICAgICogc3ViY2xhc3NlcyBvZiBDb21waWxlci4gVGhpcyBpcyB1c2VkIGJ5IHRoZSBjb21waWxlIG1ldGhvZAorICAgICAqIHRvIGRvIGFsbCB0aGUgY29tcGlsYXRpb24uIAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzT3V0RGF0ZWQoKSB7CisgICAgICAgIHJldHVybiBpc091dERhdGVkKCB0cnVlICk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGV0ZXJtaW5lIGlmIGEgY29tcGlsYXRpb24gaXMgbmVjZXNzYXJ5IGJ5IGNoZWNraW5nIHRoZSB0aW1lIHN0YW1wCisgICAgICogb2YgdGhlIEpTUCBwYWdlIHdpdGggdGhhdCBvZiB0aGUgY29ycmVzcG9uZGluZyAuY2xhc3Mgb3IgLmphdmEgZmlsZS4KKyAgICAgKiBJZiB0aGUgcGFnZSBoYXMgZGVwZW5kZW5jaWVzLCB0aGUgY2hlY2sgaXMgYWxzbyBleHRlbmRlZCB0byBpdHMKKyAgICAgKiBkZXBlbmRlYW50cywgYW5kIHNvIG9uLgorICAgICAqIFRoaXMgbWV0aG9kIGNhbiBieSBvdmVyaWRkZW4gYnkgYSBzdWJjbGFzc2VzIG9mIENvbXBpbGVyLgorICAgICAqIEBwYXJhbSBjaGVja0NsYXNzIElmIHRydWUsIGNoZWNrIGFnYWluc3QgLmNsYXNzIGZpbGUsCisgICAgICogICAgICAgICAgICAgICAgICAgaWYgZmFsc2UsIGNoZWNrIGFnYWluc3QgLmphdmEgZmlsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc091dERhdGVkKGJvb2xlYW4gY2hlY2tDbGFzcykgeworCisgICAgICAgIGJvb2xlYW4gb3V0RGF0ZWQgPSBmYWxzZTsKKyAgICAgICAgU3RyaW5nIGpzcCA9IGN0eHQuZ2V0SnNwRmlsZSgpOworCisgICAgICAgIGlmICgoanN3ICE9IG51bGwpCisgICAgICAgICAgICAmJiAoY3R4dC5nZXRPcHRpb25zKCkuZ2V0TW9kaWZpY2F0aW9uVGVzdEludGVydmFsKCkgPiAwKQorICAgICAgICAgICAgJiYgKChqc3cuZ2V0TGFzdE1vZGlmaWNhdGlvblRlc3QoKQorICAgICAgICAgICAgICAgICAgICArIChjdHh0LmdldE9wdGlvbnMoKS5nZXRNb2RpZmljYXRpb25UZXN0SW50ZXJ2YWwoKSAqIDEwMDApKSAKKyAgICAgICAgICAgICAgICAgICAgPiBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgbG9uZyBqc3BSZWFsTGFzdE1vZGlmaWVkID0gMDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFVSTCBqc3BVcmwgPSBjdHh0LmdldFJlc291cmNlKGpzcCk7CisgICAgICAgICAgICBpZiAoanNwVXJsID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjdHh0LmluY3JlbWVudFJlbW92ZWQoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBVUkxDb25uZWN0aW9uIHVjID0ganNwVXJsLm9wZW5Db25uZWN0aW9uKCk7CisgICAgICAgICAgICBqc3BSZWFsTGFzdE1vZGlmaWVkID0gdWMuZ2V0TGFzdE1vZGlmaWVkKCk7CisgICAgICAgICAgICB1Yy5nZXRJbnB1dFN0cmVhbSgpLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBsb25nIHRhcmdldExhc3RNb2RpZmllZCA9IDA7CisgICAgICAgIEZpbGUgdGFyZ2V0RmlsZTsKKyAgICAgICAgCisgICAgICAgIGlmKCBjaGVja0NsYXNzICkgeworICAgICAgICAgICAgdGFyZ2V0RmlsZSA9IG5ldyBGaWxlKGN0eHQuZ2V0Q2xhc3NGaWxlTmFtZSgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRhcmdldEZpbGUgPSBuZXcgRmlsZShjdHh0LmdldFNlcnZsZXRKYXZhRmlsZU5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmICghdGFyZ2V0RmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgb3V0RGF0ZWQgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGFyZ2V0TGFzdE1vZGlmaWVkID0gdGFyZ2V0RmlsZS5sYXN0TW9kaWZpZWQoKTsKKyAgICAgICAgICAgIGlmIChjaGVja0NsYXNzICYmIGpzdyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAganN3LnNldFNlcnZsZXRDbGFzc0xhc3RNb2RpZmllZFRpbWUodGFyZ2V0TGFzdE1vZGlmaWVkKTsKKyAgICAgICAgICAgIH0gICAKKyAgICAgICAgICAgIGlmICh0YXJnZXRMYXN0TW9kaWZpZWQgPCBqc3BSZWFsTGFzdE1vZGlmaWVkKSB7CisgICAgICAgICAgICAgICAgaWYoIGxvZy5pc0RlYnVnRW5hYmxlZCgpICkgeworICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkNvbXBpbGVyOiBvdXRkYXRlZDogIiArIHRhcmdldEZpbGUgKyAiICIgKworICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TGFzdE1vZGlmaWVkICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG91dERhdGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGRldGVybWluZSBpZiBzb3VyY2UgZGVwZW5kZW50IGZpbGVzIChlLmcuIGluY2x1ZGVzIHVzaW5nIGluY2x1ZGUKKyAgICAgICAgLy8gZGlyZWN0aXZlcykgaGF2ZSBiZWVuIGNoYW5nZWQuCisgICAgICAgIGlmKCBqc3c9PW51bGwgKSB7CisgICAgICAgICAgICByZXR1cm4gb3V0RGF0ZWQ7CisgICAgICAgIH0KKyAgICAgICAganN3LnNldExhc3RNb2RpZmljYXRpb25UZXN0KFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKKyAgICAgICAgCisgICAgICAgIExpc3QgZGVwZW5kcyA9IGpzdy5nZXREZXBlbmRhbnRzKCk7CisgICAgICAgIGlmIChkZXBlbmRzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBvdXREYXRlZDsKKyAgICAgICAgfQorCisgICAgICAgIEl0ZXJhdG9yIGl0ID0gZGVwZW5kcy5pdGVyYXRvcigpOworICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBTdHJpbmcgaW5jbHVkZSA9IChTdHJpbmcpaXQubmV4dCgpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBVUkwgaW5jbHVkZVVybCA9IGN0eHQuZ2V0UmVzb3VyY2UoaW5jbHVkZSk7CisgICAgICAgICAgICAgICAgaWYgKGluY2x1ZGVVcmwgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBvdXREYXRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghb3V0RGF0ZWQpIHsKKworICAgICAgICAgICAgICAgICAgICBVUkxDb25uZWN0aW9uIGluY2x1ZGVVY29ubiA9IGluY2x1ZGVVcmwub3BlbkNvbm5lY3Rpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgbG9uZyBpbmNsdWRlTGFzdE1vZGlmaWVkID0gaW5jbHVkZVVjb25uLmdldExhc3RNb2RpZmllZCgpOworICAgICAgICAgICAgICAgICAgICBpbmNsdWRlVWNvbm4uZ2V0SW5wdXRTdHJlYW0oKS5jbG9zZSgpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChpbmNsdWRlTGFzdE1vZGlmaWVkID4gdGFyZ2V0TGFzdE1vZGlmaWVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXREYXRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG91dERhdGVkKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBhbnkgcG90ZW50aWFsIFdyYXBwZXJzIGZvciB0YWcgZmlsZXMKKyAgICAgICAgICAgICAgICAgICAgY3R4dC5nZXRSdW50aW1lQ29udGV4dCgpLnJlbW92ZVdyYXBwZXIoaW5jbHVkZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgIG91dERhdGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBvdXREYXRlZDsKKworICAgIH0KKworICAgIAorICAgIC8qKgorICAgICAqIEdldHMgdGhlIGVycm9yIGRpc3BhdGNoZXIuCisgICAgICovCisgICAgcHVibGljIEVycm9yRGlzcGF0Y2hlciBnZXRFcnJvckRpc3BhdGNoZXIoKSB7CisJcmV0dXJuIGVyckRpc3BhdGNoZXI7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBpbmZvIGFib3V0IHRoZSBwYWdlIHVuZGVyIGNvbXBpbGF0aW9uCisgICAgICovCisgICAgcHVibGljIFBhZ2VJbmZvIGdldFBhZ2VJbmZvKCkgeworCXJldHVybiBwYWdlSW5mbzsKKyAgICB9CisKKworICAgIHB1YmxpYyBKc3BDb21waWxhdGlvbkNvbnRleHQgZ2V0Q29tcGlsYXRpb25Db250ZXh0KCkgeworCXJldHVybiBjdHh0OworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGdlbmVyYXRlZCBmaWxlcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUdlbmVyYXRlZEZpbGVzKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3RyaW5nIGNsYXNzRmlsZU5hbWUgPSBjdHh0LmdldENsYXNzRmlsZU5hbWUoKTsKKyAgICAgICAgICAgIGlmIChjbGFzc0ZpbGVOYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBGaWxlIGNsYXNzRmlsZSA9IG5ldyBGaWxlKGNsYXNzRmlsZU5hbWUpOworICAgICAgICAgICAgICAgIGlmKCBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSApCisgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyggIkRlbGV0aW5nICIgKyBjbGFzc0ZpbGUgKTsKKyAgICAgICAgICAgICAgICBjbGFzc0ZpbGUuZGVsZXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBSZW1vdmUgYXMgbXVjaCBhcyBwb3NzaWJsZSwgaWdub3JlIHBvc3NpYmxlIGV4Y2VwdGlvbnMKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgU3RyaW5nIGphdmFGaWxlTmFtZSA9IGN0eHQuZ2V0U2VydmxldEphdmFGaWxlTmFtZSgpOworICAgICAgICAgICAgaWYgKGphdmFGaWxlTmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgRmlsZSBqYXZhRmlsZSA9IG5ldyBGaWxlKGphdmFGaWxlTmFtZSk7CisgICAgICAgICAgICAgICAgaWYoIGxvZy5pc0RlYnVnRW5hYmxlZCgpICkKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCAiRGVsZXRpbmcgIiArIGphdmFGaWxlICk7CisgICAgICAgICAgICAgICAgamF2YUZpbGUuZGVsZXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBSZW1vdmUgYXMgbXVjaCBhcyBwb3NzaWJsZSwgaWdub3JlIHBvc3NpYmxlIGV4Y2VwdGlvbnMKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUdlbmVyYXRlZENsYXNzRmlsZXMoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTdHJpbmcgY2xhc3NGaWxlTmFtZSA9IGN0eHQuZ2V0Q2xhc3NGaWxlTmFtZSgpOworICAgICAgICAgICAgaWYgKGNsYXNzRmlsZU5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEZpbGUgY2xhc3NGaWxlID0gbmV3IEZpbGUoY2xhc3NGaWxlTmFtZSk7CisgICAgICAgICAgICAgICAgaWYoIGxvZy5pc0RlYnVnRW5hYmxlZCgpICkKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCAiRGVsZXRpbmcgIiArIGNsYXNzRmlsZSApOworICAgICAgICAgICAgICAgIGNsYXNzRmlsZS5kZWxldGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIFJlbW92ZSBhcyBtdWNoIGFzIHBvc3NpYmxlLCBpZ25vcmUgcG9zc2libGUgZXhjZXB0aW9ucworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL2NvbXBpbGVyL0RlZmF1bHRFcnJvckhhbmRsZXIuamF2YSBiL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9EZWZhdWx0RXJyb3JIYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E5ZTQ0YwotLS0gL2Rldi9udWxsCisrKyBiL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9EZWZhdWx0RXJyb3JIYW5kbGVyLmphdmEKQEAgLTAsMCArMSwxMDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphc3Blci5jb21waWxlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLkphc3BlckV4Y2VwdGlvbjsKKworLyoqCisgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIEVycm9ySGFuZGxlciBpbnRlcmZhY2UuCisgKgorICogQGF1dGhvciBKYW4gTHVlaGUKKyAqLworY2xhc3MgRGVmYXVsdEVycm9ySGFuZGxlciBpbXBsZW1lbnRzIEVycm9ySGFuZGxlciB7CisKKyAgICAvKgorICAgICAqIFByb2Nlc3NlcyB0aGUgZ2l2ZW4gSlNQIHBhcnNlIGVycm9yLgorICAgICAqCisgICAgICogQHBhcmFtIGZuYW1lIE5hbWUgb2YgdGhlIEpTUCBmaWxlIGluIHdoaWNoIHRoZSBwYXJzZSBlcnJvciBvY2N1cnJlZAorICAgICAqIEBwYXJhbSBsaW5lIFBhcnNlIGVycm9yIGxpbmUgbnVtYmVyCisgICAgICogQHBhcmFtIGNvbHVtbiBQYXJzZSBlcnJvciBjb2x1bW4gbnVtYmVyCisgICAgICogQHBhcmFtIGVyck1zZyBQYXJzZSBlcnJvciBtZXNzYWdlCisgICAgICogQHBhcmFtIGV4Y2VwdGlvbiBQYXJzZSBleGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBqc3BFcnJvcihTdHJpbmcgZm5hbWUsIGludCBsaW5lLCBpbnQgY29sdW1uLCBTdHJpbmcgZXJyTXNnLAorCQkJIEV4Y2VwdGlvbiBleCkgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJdGhyb3cgbmV3IEphc3BlckV4Y2VwdGlvbihmbmFtZSArICIoIiArIGxpbmUgKyAiLCIgKyBjb2x1bW4gKyAiKSIKKwkJCQkgICsgIiAiICsgZXJyTXNnLCBleCk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBQcm9jZXNzZXMgdGhlIGdpdmVuIEpTUCBwYXJzZSBlcnJvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlcnJNc2cgUGFyc2UgZXJyb3IgbWVzc2FnZQorICAgICAqIEBwYXJhbSBleGNlcHRpb24gUGFyc2UgZXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQganNwRXJyb3IoU3RyaW5nIGVyck1zZywgRXhjZXB0aW9uIGV4KSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwl0aHJvdyBuZXcgSmFzcGVyRXhjZXB0aW9uKGVyck1zZywgZXgpOworICAgIH0KKworICAgIC8qCisgICAgICogUHJvY2Vzc2VzIHRoZSBnaXZlbiBqYXZhYyBjb21waWxhdGlvbiBlcnJvcnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGV0YWlscyBBcnJheSBvZiBKYXZhY0Vycm9yRGV0YWlsIGluc3RhbmNlcyBjb3JyZXNwb25kaW5nIHRvIHRoZQorICAgICAqIGNvbXBpbGF0aW9uIGVycm9ycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGphdmFjRXJyb3IoSmF2YWNFcnJvckRldGFpbFtdIGRldGFpbHMpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCisgICAgICAgIGlmIChkZXRhaWxzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisJT2JqZWN0W10gYXJncyA9IG51bGw7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgZGV0YWlscy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKGRldGFpbHNbaV0uZ2V0SnNwQmVnaW5MaW5lTnVtYmVyKCkgPj0gMCkgeworICAgICAgICAgICAgICAgIGFyZ3MgPSBuZXcgT2JqZWN0W10geworICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEludGVnZXIoZGV0YWlsc1tpXS5nZXRKc3BCZWdpbkxpbmVOdW1iZXIoKSksIAorICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsc1tpXS5nZXRKc3BGaWxlTmFtZSgpIH07CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZChMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgianNwLmVycm9yLnNpbmdsZS5saW5lLm51bWJlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzKSk7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiXG4iKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoCisgICAgICAgICAgICAgICAgTG9jYWxpemVyLmdldE1lc3NhZ2UoImpzcC5lcnJvci5jb3JyZXNwb25kaW5nLnNlcnZsZXQiKSk7CisgICAgICAgICAgICBidWYuYXBwZW5kKGRldGFpbHNbaV0uZ2V0RXJyb3JNZXNzYWdlKCkpOworICAgICAgICAgICAgYnVmLmFwcGVuZCgiXG5cbiIpOworICAgICAgICB9CisKKwl0aHJvdyBuZXcgSmFzcGVyRXhjZXB0aW9uKAorICAgICAgICAgICAgTG9jYWxpemVyLmdldE1lc3NhZ2UoImpzcC5lcnJvci51bmFibGUuY29tcGlsZSIpICsgIlxuXG4iICsgYnVmKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzZXMgdGhlIGdpdmVuIGphdmFjIGVycm9yIHJlcG9ydCBhbmQgZXhjZXB0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGVycm9yUmVwb3J0IENvbXBpbGF0aW9uIGVycm9yIHJlcG9ydAorICAgICAqIEBwYXJhbSBleGNlcHRpb24gQ29tcGlsYXRpb24gZXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgamF2YWNFcnJvcihTdHJpbmcgZXJyb3JSZXBvcnQsIEV4Y2VwdGlvbiBleGNlcHRpb24pCisgICAgICAgICAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKworIAl0aHJvdyBuZXcgSmFzcGVyRXhjZXB0aW9uKAorICAgICAgICAgICAgTG9jYWxpemVyLmdldE1lc3NhZ2UoImpzcC5lcnJvci51bmFibGUuY29tcGlsZSIpLCBleGNlcHRpb24pOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL2NvbXBpbGVyL0R1bXBlci5qYXZhIGIvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL2NvbXBpbGVyL0R1bXBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjNGFkN2YKLS0tIC9kZXYvbnVsbAorKysgYi9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvRHVtcGVyLmphdmEKQEAgLTAsMCArMSwyMDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphc3Blci5jb21waWxlcjsKKworaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIuSmFzcGVyRXhjZXB0aW9uOworCitjbGFzcyBEdW1wZXIgeworCisgICAgc3RhdGljIGNsYXNzIER1bXBWaXNpdG9yIGV4dGVuZHMgTm9kZS5WaXNpdG9yIHsKKwlwcml2YXRlIGludCBpbmRlbnQgPSAwOworCisJcHJpdmF0ZSBTdHJpbmcgZ2V0QXR0cmlidXRlcyhBdHRyaWJ1dGVzIGF0dHJzKSB7CisJICAgIGlmIChhdHRycyA9PSBudWxsKQorCQlyZXR1cm4gIiI7CisKKwkgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkgICAgZm9yIChpbnQgaT0wOyBpIDwgYXR0cnMuZ2V0TGVuZ3RoKCk7IGkrKykgeworCQlidWYuYXBwZW5kKCIgIiArIGF0dHJzLmdldFFOYW1lKGkpICsgIj1cIiIKKwkJCSAgICsgYXR0cnMuZ2V0VmFsdWUoaSkgKyAiXCIiKTsKKwkgICAgfQorCSAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHByaW50U3RyaW5nKFN0cmluZyBzdHIpIHsKKwkgICAgcHJpbnRJbmRlbnQoKTsKKwkgICAgU3lzdGVtLm91dC5wcmludChzdHIpOworCX0KKworCXByaXZhdGUgdm9pZCBwcmludFN0cmluZyhTdHJpbmcgcHJlZml4LCBjaGFyW10gY2hhcnMsIFN0cmluZyBzdWZmaXgpIHsKKwkgICAgU3RyaW5nIHN0ciA9IG51bGw7CisJICAgIGlmIChjaGFycyAhPSBudWxsKSB7CisJCXN0ciA9IG5ldyBTdHJpbmcoY2hhcnMpOworCSAgICB9CisJICAgIHByaW50U3RyaW5nKHByZWZpeCwgc3RyLCBzdWZmaXgpOworCX0KKwkgICAgIAorCXByaXZhdGUgdm9pZCBwcmludFN0cmluZyhTdHJpbmcgcHJlZml4LCBTdHJpbmcgc3RyLCBTdHJpbmcgc3VmZml4KSB7CisJICAgIHByaW50SW5kZW50KCk7CisJICAgIGlmIChzdHIgIT0gbnVsbCkgeworCQlTeXN0ZW0ub3V0LnByaW50KHByZWZpeCArIHN0ciArIHN1ZmZpeCk7CisJICAgIH0gZWxzZSB7CisJCVN5c3RlbS5vdXQucHJpbnQocHJlZml4ICsgc3VmZml4KTsKKwkgICAgfQorCX0KKworCXByaXZhdGUgdm9pZCBwcmludEF0dHJpYnV0ZXMoU3RyaW5nIHByZWZpeCwgQXR0cmlidXRlcyBhdHRycywKKwkJCQkgICAgIFN0cmluZyBzdWZmaXgpIHsKKwkgICAgcHJpbnRTdHJpbmcocHJlZml4LCBnZXRBdHRyaWJ1dGVzKGF0dHJzKSwgc3VmZml4KTsKKwl9CisKKwlwcml2YXRlIHZvaWQgZHVtcEJvZHkoTm9kZSBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwkgICAgTm9kZS5Ob2RlcyBwYWdlID0gbi5nZXRCb2R5KCk7CisJICAgIGlmIChwYWdlICE9IG51bGwpIHsKKy8vCQlpbmRlbnQrKzsKKwkJcGFnZS52aXNpdCh0aGlzKTsKKy8vCQlpbmRlbnQtLTsKKwkgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5QYWdlRGlyZWN0aXZlIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCSAgICBwcmludEF0dHJpYnV0ZXMoIjwlQCBwYWdlIiwgbi5nZXRBdHRyaWJ1dGVzKCksICIlPiIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5UYWdsaWJEaXJlY3RpdmUgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJICAgIHByaW50QXR0cmlidXRlcygiPCVAIHRhZ2xpYiIsIG4uZ2V0QXR0cmlidXRlcygpLCAiJT4iKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuSW5jbHVkZURpcmVjdGl2ZSBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwkgICAgcHJpbnRBdHRyaWJ1dGVzKCI8JUAgaW5jbHVkZSIsIG4uZ2V0QXR0cmlidXRlcygpLCAiJT4iKTsKKwkgICAgZHVtcEJvZHkobik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLkNvbW1lbnQgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJICAgIHByaW50U3RyaW5nKCI8JS0tIiwgbi5nZXRUZXh0KCksICItLSU+Iik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLkRlY2xhcmF0aW9uIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCSAgICBwcmludFN0cmluZygiPCUhIiwgbi5nZXRUZXh0KCksICIlPiIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5FeHByZXNzaW9uIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCSAgICBwcmludFN0cmluZygiPCU9Iiwgbi5nZXRUZXh0KCksICIlPiIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5TY3JpcHRsZXQgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJICAgIHByaW50U3RyaW5nKCI8JSIsIG4uZ2V0VGV4dCgpLCAiJT4iKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuSW5jbHVkZUFjdGlvbiBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwkgICAgcHJpbnRBdHRyaWJ1dGVzKCI8anNwOmluY2x1ZGUiLCBuLmdldEF0dHJpYnV0ZXMoKSwgIj4iKTsKKwkgICAgZHVtcEJvZHkobik7CisgICAgICAgICAgICBwcmludFN0cmluZygiPC9qc3A6aW5jbHVkZT4iKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuRm9yd2FyZEFjdGlvbiBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwkgICAgcHJpbnRBdHRyaWJ1dGVzKCI8anNwOmZvcndhcmQiLCBuLmdldEF0dHJpYnV0ZXMoKSwgIj4iKTsKKwkgICAgZHVtcEJvZHkobik7CisJICAgIHByaW50U3RyaW5nKCI8L2pzcDpmb3J3YXJkPiIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5HZXRQcm9wZXJ0eSBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwkgICAgcHJpbnRBdHRyaWJ1dGVzKCI8anNwOmdldFByb3BlcnR5Iiwgbi5nZXRBdHRyaWJ1dGVzKCksICIvPiIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5TZXRQcm9wZXJ0eSBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwkgICAgcHJpbnRBdHRyaWJ1dGVzKCI8anNwOnNldFByb3BlcnR5Iiwgbi5nZXRBdHRyaWJ1dGVzKCksICI+Iik7CisgICAgICAgICAgICBkdW1wQm9keShuKTsKKyAgICAgICAgICAgIHByaW50U3RyaW5nKCI8L2pzcDpzZXRQcm9wZXJ0eT4iKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuVXNlQmVhbiBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwkgICAgcHJpbnRBdHRyaWJ1dGVzKCI8anNwOnVzZUJlYW4iLCBuLmdldEF0dHJpYnV0ZXMoKSwgIj4iKTsKKwkgICAgZHVtcEJvZHkobik7CisJICAgIHByaW50U3RyaW5nKCI8L2pzcDp1c2VCZWFuPiIpOworICAgICAgICB9CisJCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuUGx1Z0luIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCSAgICBwcmludEF0dHJpYnV0ZXMoIjxqc3A6cGx1Z2luIiwgbi5nZXRBdHRyaWJ1dGVzKCksICI+Iik7CisJICAgIGR1bXBCb2R5KG4pOworCSAgICBwcmludFN0cmluZygiPC9qc3A6cGx1Z2luPiIpOworCX0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuUGFyYW1zQWN0aW9uIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCSAgICBwcmludEF0dHJpYnV0ZXMoIjxqc3A6cGFyYW1zIiwgbi5nZXRBdHRyaWJ1dGVzKCksICI+Iik7CisJICAgIGR1bXBCb2R5KG4pOworCSAgICBwcmludFN0cmluZygiPC9qc3A6cGFyYW1zPiIpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLlBhcmFtQWN0aW9uIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCSAgICBwcmludEF0dHJpYnV0ZXMoIjxqc3A6cGFyYW0iLCBuLmdldEF0dHJpYnV0ZXMoKSwgIj4iKTsKKwkgICAgZHVtcEJvZHkobik7CisJICAgIHByaW50U3RyaW5nKCI8L2pzcDpwYXJhbT4iKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5OYW1lZEF0dHJpYnV0ZSBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwkgICAgcHJpbnRBdHRyaWJ1dGVzKCI8anNwOmF0dHJpYnV0ZSIsIG4uZ2V0QXR0cmlidXRlcygpLCAiPiIpOworCSAgICBkdW1wQm9keShuKTsKKwkgICAgcHJpbnRTdHJpbmcoIjwvanNwOmF0dHJpYnV0ZT4iKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuSnNwQm9keSBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwkgICAgcHJpbnRBdHRyaWJ1dGVzKCI8anNwOmJvZHkiLCBuLmdldEF0dHJpYnV0ZXMoKSwgIj4iKTsKKwkgICAgZHVtcEJvZHkobik7CisJICAgIHByaW50U3RyaW5nKCI8L2pzcDpib2R5PiIpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLkVMRXhwcmVzc2lvbiBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwkgICAgcHJpbnRTdHJpbmcoICIkeyIgKyBuZXcgU3RyaW5nKCBuLmdldFRleHQoKSApICsgIn0iICk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLkN1c3RvbVRhZyBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwkgICAgcHJpbnRBdHRyaWJ1dGVzKCI8IiArIG4uZ2V0UU5hbWUoKSwgbi5nZXRBdHRyaWJ1dGVzKCksICI+Iik7CisJICAgIGR1bXBCb2R5KG4pOworCSAgICBwcmludFN0cmluZygiPC8iICsgbi5nZXRRTmFtZSgpICsgIj4iKTsKKyAgICAgICAgfQorCisJcHVibGljIHZvaWQgdmlzaXQoTm9kZS5VbmludGVycHJldGVkVGFnIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCSAgICBTdHJpbmcgdGFnID0gbi5nZXRRTmFtZSgpOworCSAgICBwcmludEF0dHJpYnV0ZXMoIjwiK3RhZywgbi5nZXRBdHRyaWJ1dGVzKCksICI+Iik7CisJICAgIGR1bXBCb2R5KG4pOworCSAgICBwcmludFN0cmluZygiPC8iICsgdGFnICsgIj4iKTsKKyAgICAgICAgfQorCisJcHVibGljIHZvaWQgdmlzaXQoTm9kZS5UZW1wbGF0ZVRleHQgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJICAgIHByaW50U3RyaW5nKG5ldyBTdHJpbmcobi5nZXRUZXh0KCkpKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgcHJpbnRJbmRlbnQoKSB7CisJICAgIGZvciAoaW50IGk9MDsgaSA8IGluZGVudDsgaSsrKSB7CisJCVN5c3RlbS5vdXQucHJpbnQoIiAgIik7CisJICAgIH0KKwl9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGR1bXAoTm9kZSBuKSB7CisJdHJ5IHsKKwkgICAgbi5hY2NlcHQobmV3IER1bXBWaXNpdG9yKCkpOwkKKwl9IGNhdGNoIChKYXNwZXJFeGNlcHRpb24gZSkgeworCSAgICBlLnByaW50U3RhY2tUcmFjZSgpOworCX0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZHVtcChOb2RlLk5vZGVzIHBhZ2UpIHsKKwl0cnkgeworCSAgICBwYWdlLnZpc2l0KG5ldyBEdW1wVmlzaXRvcigpKTsKKwl9IGNhdGNoIChKYXNwZXJFeGNlcHRpb24gZSkgeworCSAgICBlLnByaW50U3RhY2tUcmFjZSgpOworCX0KKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9FTEZ1bmN0aW9uTWFwcGVyLmphdmEgYi9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvRUxGdW5jdGlvbk1hcHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3M2FkYjAKLS0tIC9kZXYvbnVsbAorKysgYi9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvRUxGdW5jdGlvbk1hcHBlci5qYXZhCkBAIC0wLDAgKzEsMjgyIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYXNwZXIuY29tcGlsZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuRnVuY3Rpb25JbmZvOworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLkphc3BlckV4Y2VwdGlvbjsKKworLyoqCisgKiBUaGlzIGNsYXNzIGdlbmVyYXRlcyBmdW5jdGlvbnMgbWFwcGVycyBmb3IgdGhlIEVMIGV4cHJlc3Npb25zIGluIHRoZSBwYWdlLgorICogSW5zdGVhZCBvZiBhIGdsb2JhbCBtYXBwZXIsIGEgbWFwcGVyIGlzIHVzZWQgZm9yIGVjYWggY2FsbCB0byBFTAorICogZXZhbHVhdG9yLCB0aHVzIGF2b2lkaW5nIHRoZSBwcmVmaXggb3ZlcmxhcHBpbmcgYW5kIHJlZGVmaW5pdGlvbgorICogaXNzdWVzLgorICoKKyAqIEBhdXRob3IgS2luLW1hbiBDaHVuZworICovCisKK3B1YmxpYyBjbGFzcyBFTEZ1bmN0aW9uTWFwcGVyIHsKKyAgICBzdGF0aWMgcHJpdmF0ZSBpbnQgY3VyckZ1bmMgPSAwOworICAgIHByaXZhdGUgRXJyb3JEaXNwYXRjaGVyIGVycjsKKyAgICBTdHJpbmdCdWZmZXIgZHM7ICAvLyBDb250YWlucyBjb2RlcyB0byBpbml0aWFsaXplIHRoZSBmdW5jdGlvbnMgbWFwcGVycy4KKyAgICBTdHJpbmdCdWZmZXIgc3M7ICAvLyBDb250YWlucyBkZWNsYXJhdGlvbnMgb2YgdGhlIGZ1bmN0aW9ucyBtYXBwZXJzLgorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyB0aGUgZnVuY3Rpb25zIG1hcHBlcnMgZm9yIGFsbCBFTCBleHByZXNzaW9ucyBpbiB0aGUgSlNQIHBhZ2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29tcGlsZXIgQ3VycmVudCBjb21waWxlciwgbWFpbmx5IGZvciBhY2Nlc3NpbmcgZXJyb3IgZGlzcGF0Y2hlci4KKyAgICAgKiBAcGFyYW0gcGFnZSBUaGUgY3VycmVudCBjb21waWxhdGlvbiB1bml0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYXAoQ29tcGlsZXIgY29tcGlsZXIsIE5vZGUuTm9kZXMgcGFnZSkgCisJCXRocm93cyBKYXNwZXJFeGNlcHRpb24geworCisJY3VyckZ1bmMgPSAwOworCUVMRnVuY3Rpb25NYXBwZXIgbWFwID0gbmV3IEVMRnVuY3Rpb25NYXBwZXIoKTsKKwltYXAuZXJyID0gY29tcGlsZXIuZ2V0RXJyb3JEaXNwYXRjaGVyKCk7CisJbWFwLmRzID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCW1hcC5zcyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKworCXBhZ2UudmlzaXQobWFwLm5ldyBFTEZ1bmN0aW9uVmlzaXRvcigpKTsKKworCS8vIEFwcGVuZCB0aGUgZGVjbGFyYXRpb25zIHRvIHRoZSByb290IG5vZGUKKwlTdHJpbmcgZHMgPSBtYXAuZHMudG9TdHJpbmcoKTsKKwlpZiAoZHMubGVuZ3RoKCkgPiAwKSB7CisJICAgIE5vZGUgcm9vdCA9IHBhZ2UuZ2V0Um9vdCgpOworCSAgICBuZXcgTm9kZS5EZWNsYXJhdGlvbihtYXAuc3MudG9TdHJpbmcoKSwgbnVsbCwgcm9vdCk7CisJICAgIG5ldyBOb2RlLkRlY2xhcmF0aW9uKCJzdGF0aWMge1xuIiArIGRzICsgIn1cbiIsIG51bGwsIHJvb3QpOworCX0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIHZpc2l0b3IgZm9yIHRoZSBwYWdlLiAgVGhlIHBsYWNlcyB3aGVyZSBFTCBpcyBhbGxvd2VkIGFyZSBzY2FubmVkCisgICAgICogZm9yIGZ1bmN0aW9ucywgYW5kIGlmIGZvdW5kIGZ1bmN0aW9ucyBtYXBwZXJzIGFyZSBjcmVhdGVkLgorICAgICAqLworICAgIGNsYXNzIEVMRnVuY3Rpb25WaXNpdG9yIGV4dGVuZHMgTm9kZS5WaXNpdG9yIHsKKwkKKwkvKioKKwkgKiBVc2UgYSBnbG9iYWwgbmFtZSBtYXAgdG8gZmFjaWxpdGF0ZSByZXVzZSBvZiBmdW5jdGlvbiBtYXBzLgorCSAqIFRoZSBrZXkgdXNlZCBpcyBwcmVmaXg6ZnVuY3Rpb246dXJpLgorCSAqLworCXByaXZhdGUgSGFzaE1hcCBnTWFwID0gbmV3IEhhc2hNYXAoKTsKKworCXB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuUGFyYW1BY3Rpb24gbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJICAgIGRvTWFwKG4uZ2V0VmFsdWUoKSk7CisJICAgIHZpc2l0Qm9keShuKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB2aXNpdChOb2RlLkluY2x1ZGVBY3Rpb24gbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJICAgIGRvTWFwKG4uZ2V0UGFnZSgpKTsKKwkgICAgdmlzaXRCb2R5KG4pOworCX0KKworCXB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuRm9yd2FyZEFjdGlvbiBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwkgICAgZG9NYXAobi5nZXRQYWdlKCkpOworCSAgICB2aXNpdEJvZHkobik7CisJfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuU2V0UHJvcGVydHkgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJICAgIGRvTWFwKG4uZ2V0VmFsdWUoKSk7CisJICAgIHZpc2l0Qm9keShuKTsKKwl9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5Vc2VCZWFuIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCSAgICBkb01hcChuLmdldEJlYW5OYW1lKCkpOworCSAgICB2aXNpdEJvZHkobik7CisJfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuUGx1Z0luIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCSAgICBkb01hcChuLmdldEhlaWdodCgpKTsKKwkgICAgZG9NYXAobi5nZXRXaWR0aCgpKTsKKwkgICAgdmlzaXRCb2R5KG4pOworCX0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLkpzcEVsZW1lbnQgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisKKwkgICAgTm9kZS5Kc3BBdHRyaWJ1dGVbXSBhdHRycyA9IG4uZ2V0SnNwQXR0cmlidXRlcygpOworCSAgICBmb3IgKGludCBpID0gMDsgYXR0cnMgIT0gbnVsbCAmJiBpIDwgYXR0cnMubGVuZ3RoOyBpKyspIHsKKwkJZG9NYXAoYXR0cnNbaV0pOworCSAgICB9CisJICAgIGRvTWFwKG4uZ2V0TmFtZUF0dHJpYnV0ZSgpKTsKKwkgICAgdmlzaXRCb2R5KG4pOworCX0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLlVuaW50ZXJwcmV0ZWRUYWcgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisKKwkgICAgTm9kZS5Kc3BBdHRyaWJ1dGVbXSBhdHRycyA9IG4uZ2V0SnNwQXR0cmlidXRlcygpOworCSAgICBmb3IgKGludCBpID0gMDsgYXR0cnMgIT0gbnVsbCAmJiBpIDwgYXR0cnMubGVuZ3RoOyBpKyspIHsKKwkJZG9NYXAoYXR0cnNbaV0pOworCSAgICB9CisJICAgIHZpc2l0Qm9keShuKTsKKwl9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5DdXN0b21UYWcgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJICAgIE5vZGUuSnNwQXR0cmlidXRlW10gYXR0cnMgPSBuLmdldEpzcEF0dHJpYnV0ZXMoKTsKKwkgICAgZm9yIChpbnQgaSA9IDA7IGF0dHJzICE9IG51bGwgJiYgaSA8IGF0dHJzLmxlbmd0aDsgaSsrKSB7CisJCWRvTWFwKGF0dHJzW2ldKTsKKwkgICAgfQorCSAgICB2aXNpdEJvZHkobik7CisJfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuRUxFeHByZXNzaW9uIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCSAgICBkb01hcChuLmdldEVMKCkpOworCX0KKworCXByaXZhdGUgdm9pZCBkb01hcChOb2RlLkpzcEF0dHJpYnV0ZSBhdHRyKSAKKwkJdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJICAgIGlmIChhdHRyICE9IG51bGwpIHsKKwkJZG9NYXAoYXR0ci5nZXRFTCgpKTsKKwkgICAgfQorCX0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBmdW5jdGlvbiBtYXBwZXJzLCBpZiBuZWVkZWQsIGZyb20gRUxOb2RlcworICAgICAgICAgKi8KKwlwcml2YXRlIHZvaWQgZG9NYXAoRUxOb2RlLk5vZGVzIGVsKSAKKwkJdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisKKyAgICAgICAgICAgIC8vIE9ubHkgY2FyZSBhYm91dCBmdW5jdGlvbnMgaW4gRUxOb2RlJ3MKKwkgICAgY2xhc3MgRnZpc2l0b3IgZXh0ZW5kcyBFTE5vZGUuVmlzaXRvciB7CisJCUFycmF5TGlzdCBmdW5jcyA9IG5ldyBBcnJheUxpc3QoKTsKKwkJSGFzaE1hcCBrZXlNYXAgPSBuZXcgSGFzaE1hcCgpOworCQlwdWJsaWMgdm9pZCB2aXNpdChFTE5vZGUuRnVuY3Rpb24gbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJCSAgICBTdHJpbmcga2V5ID0gbi5nZXRQcmVmaXgoKSArICI6IiArIG4uZ2V0TmFtZSgpOworCQkgICAgaWYgKCEga2V5TWFwLmNvbnRhaW5zS2V5KGtleSkpIHsKKwkJCWtleU1hcC5wdXQoa2V5LCIiKTsKKwkJCWZ1bmNzLmFkZChuKTsKKwkJICAgIH0KKwkJfQorCSAgICB9CisKKwkgICAgaWYgKGVsID09IG51bGwpIHsKKwkJcmV0dXJuOworCSAgICB9CisKKwkgICAgLy8gRmlyc3QgbG9jYXRlIGFsbCB1bmlxdWUgZnVuY3Rpb25zIGluIHRoaXMgRUwKKwkgICAgRnZpc2l0b3IgZnYgPSBuZXcgRnZpc2l0b3IoKTsKKwkgICAgZWwudmlzaXQoZnYpOworCSAgICBBcnJheUxpc3QgZnVuY3Rpb25zID0gZnYuZnVuY3M7CisKKwkgICAgaWYgKGZ1bmN0aW9ucy5zaXplKCkgPT0gMCkgeworCQlyZXR1cm47CisJICAgIH0KKworCSAgICAvLyBSZXVzZSBhIHByZXZpb3VzIG1hcCBpZiBwb3NzaWJsZQorCSAgICBTdHJpbmcgZGVjTmFtZSA9IG1hdGNoTWFwKGZ1bmN0aW9ucyk7CisJICAgIGlmIChkZWNOYW1lICE9IG51bGwpIHsKKwkJZWwuc2V0TWFwTmFtZShkZWNOYW1lKTsKKwkJcmV0dXJuOworCSAgICB9CisJCisJICAgIC8vIEdlbmVyYXRlIGRlY2xhcmF0aW9uIGZvciB0aGUgbWFwIHN0YXRpY2FsbHkKKwkgICAgZGVjTmFtZSA9IGdldE1hcE5hbWUoKTsKKwkgICAgc3MuYXBwZW5kKCJzdGF0aWMgcHJpdmF0ZSBvcmcuYXBhY2hlLmphc3Blci5ydW50aW1lLlByb3RlY3RlZEZ1bmN0aW9uTWFwcGVyICIgKyBkZWNOYW1lICsgIjtcbiIpOworCisJICAgIGRzLmFwcGVuZCgiICAiICsgZGVjTmFtZSArICI9ICIpOworCSAgICBkcy5hcHBlbmQoIm9yZy5hcGFjaGUuamFzcGVyLnJ1bnRpbWUuUHJvdGVjdGVkRnVuY3Rpb25NYXBwZXIiKTsKKworCSAgICAvLyBTcGVjaWFsIGNhc2UgaWYgdGhlcmUgaXMgb25seSBvbmUgZnVuY3Rpb24gaW4gdGhlIG1hcAorCSAgICBTdHJpbmcgZnVuY01ldGhvZCA9IG51bGw7CisJICAgIGlmIChmdW5jdGlvbnMuc2l6ZSgpID09IDEpIHsKKwkJZnVuY01ldGhvZCA9ICIuZ2V0TWFwRm9yRnVuY3Rpb24iOworCSAgICB9IGVsc2UgeworCQlkcy5hcHBlbmQoIi5nZXRJbnN0YW5jZSgpO1xuIik7CisJCWZ1bmNNZXRob2QgPSAiICAiICsgZGVjTmFtZSArICIubWFwRnVuY3Rpb24iOworCSAgICB9CisKKyAgICAgICAgICAgIC8vIFNldHVwIGFyZ3VtZW50cyBmb3IgZWl0aGVyIGdldE1hcEZvckZ1bmN0aW9uIG9yIG1hcEZ1bmN0aW9uCisJICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnVuY3Rpb25zLnNpemUoKTsgaSsrKSB7CisJCUVMTm9kZS5GdW5jdGlvbiBmID0gKEVMTm9kZS5GdW5jdGlvbilmdW5jdGlvbnMuZ2V0KGkpOworCQlGdW5jdGlvbkluZm8gZnVuY0luZm8gPSBmLmdldEZ1bmN0aW9uSW5mbygpOworCQlTdHJpbmcga2V5ID0gZi5nZXRQcmVmaXgoKSsgIjoiICsgZi5nZXROYW1lKCk7CisJCWRzLmFwcGVuZChmdW5jTWV0aG9kICsgIihcIiIgKyBrZXkgKyAiXCIsICIgKworCQkJZnVuY0luZm8uZ2V0RnVuY3Rpb25DbGFzcygpICsgIi5jbGFzcywgIiArCisJCQknXCInICsgZi5nZXRNZXRob2ROYW1lKCkgKyAiXCIsICIgKworCQkJIm5ldyBDbGFzc1tdIHsiKTsKKwkJU3RyaW5nIHBhcmFtc1tdID0gZi5nZXRQYXJhbWV0ZXJzKCk7CisJCWZvciAoaW50IGsgPSAwOyBrIDwgcGFyYW1zLmxlbmd0aDsgaysrKSB7CisJCSAgICBpZiAoayAhPSAwKSB7CisJCQlkcy5hcHBlbmQoIiwgIik7CisJCSAgICB9CisJCSAgICBpbnQgaUFycmF5ID0gcGFyYW1zW2tdLmluZGV4T2YoJ1snKTsKKwkJICAgIGlmIChpQXJyYXkgPCAwKSB7CisJCQlkcy5hcHBlbmQocGFyYW1zW2tdICsgIi5jbGFzcyIpOworCQkgICAgfQorCQkgICAgZWxzZSB7CisJCQlTdHJpbmcgYmFzZVR5cGUgPSBwYXJhbXNba10uc3Vic3RyaW5nKDAsIGlBcnJheSk7CisJCQlkcy5hcHBlbmQoImphdmEubGFuZy5yZWZsZWN0LkFycmF5Lm5ld0luc3RhbmNlKCIpOworCQkJZHMuYXBwZW5kKGJhc2VUeXBlKTsKKwkJCWRzLmFwcGVuZCgiLmNsYXNzLCIpOworCisJCQkvLyBDb3VudCB0aGUgbnVtYmVyIG9mIGFycmF5IGRpbWVuc2lvbgorCQkJaW50IGFDb3VudCA9IDA7CisJCQlmb3IgKGludCBqaiA9IGlBcnJheTsgamogPCBwYXJhbXNba10ubGVuZ3RoKCk7IGpqKysgKSB7CisJCQkgICAgaWYgKHBhcmFtc1trXS5jaGFyQXQoamopID09ICdbJykgeworCQkJCWFDb3VudCsrOworCQkJICAgIH0KKwkJCX0KKwkJCWlmIChhQ291bnQgPT0gMSkgeworCQkJICAgIGRzLmFwcGVuZCgiMCkuZ2V0Q2xhc3MoKSIpOworCQkJfSBlbHNlIHsKKwkJCSAgICBkcy5hcHBlbmQoIm5ldyBpbnRbIiArIGFDb3VudCArICJdKS5nZXRDbGFzcygpIik7CisJCQl9CisJCSAgICB9CisJCX0KKwkJZHMuYXBwZW5kKCJ9KTtcbiIpOworCQkvLyBQdXQgdGhlIGN1cnJlbnQgbmFtZSBpbiB0aGUgZ2xvYmFsIGZ1bmN0aW9uIG1hcAorCQlnTWFwLnB1dChmLmdldFByZWZpeCgpICsgJzonICsgZi5nZXROYW1lKCkgKyAnOicgKyBmLmdldFVyaSgpLAorCQkJIGRlY05hbWUpOworCSAgICB9CisJICAgIGVsLnNldE1hcE5hbWUoZGVjTmFtZSk7CisJfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBGaW5kIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiBtYXBwZXIgZm9yIGFuIEVMLiAgUmV1c2UgYQorICAgICAgICAgKiBwcmV2aW91c2x5IGdlbmVyYXRlZCBvbmUgaWYgcG9zc2libGUuCisgICAgICAgICAqIEBwYXJhbSBmdW5jdGlvbnMgQW4gQXJyYXlMaXN0IG9mIEVMTm9kZS5GdW5jdGlvbiBpbnN0YW5jZXMgdGhhdAorICAgICAgICAgKiAgICAgICAgICAgICAgICAgIHJlcHJlc2VudHMgdGhlIGZ1bmN0aW9ucyBpbiBhbiBFTAorICAgICAgICAgKiBAcmV0dXJuIEEgcHJldmlvdXMgZ2VuZXJhdGVkIGZ1bmN0aW9uIG1hcHBlciBuYW1lIHRoYXQgY2FuIGJlIHVzZWQKKyAgICAgICAgICogICAgICAgICBieSB0aGlzIEVMOyBudWxsIGlmIG5vbmUgZm91bmQuCisgICAgICAgICAqLworCXByaXZhdGUgU3RyaW5nIG1hdGNoTWFwKEFycmF5TGlzdCBmdW5jdGlvbnMpIHsKKworCSAgICBTdHJpbmcgbWFwTmFtZSA9IG51bGw7CisJICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnVuY3Rpb25zLnNpemUoKTsgaSsrKSB7CisJCUVMTm9kZS5GdW5jdGlvbiBmID0gKEVMTm9kZS5GdW5jdGlvbilmdW5jdGlvbnMuZ2V0KGkpOworCQlTdHJpbmcgdGVtTmFtZSA9IChTdHJpbmcpIGdNYXAuZ2V0KGYuZ2V0UHJlZml4KCkgKyAnOicgKworCQkJCQlmLmdldE5hbWUoKSArICc6JyArIGYuZ2V0VXJpKCkpOworCQlpZiAodGVtTmFtZSA9PSBudWxsKSB7CisJCSAgICByZXR1cm4gbnVsbDsKKwkJfQorCQlpZiAobWFwTmFtZSA9PSBudWxsKSB7CisJCSAgICBtYXBOYW1lID0gdGVtTmFtZTsKKwkJfSBlbHNlIGlmICghdGVtTmFtZS5lcXVhbHMobWFwTmFtZSkpIHsKKwkJICAgIC8vIElmIG5vdCBhbGwgaW4gdGhlIHByZXZpb3VzIG1hdGNoLCB0aGVuIG5vIG1hdGNoLgorCQkgICAgcmV0dXJuIG51bGw7CisJCX0KKwkgICAgfQorCSAgICByZXR1cm4gbWFwTmFtZTsKKwl9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQHJldHVybiBBbiB1bmlxdWUgbmFtZSBmb3IgYSBmdW5jdGlvbiBtYXBwZXIuCisgICAgICAgICAqLworCXByaXZhdGUgU3RyaW5nIGdldE1hcE5hbWUoKSB7CisJICAgIHJldHVybiAiX2pzcHhfZm5tYXBfIiArIGN1cnJGdW5jKys7CisJfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL2NvbXBpbGVyL0VMTm9kZS5qYXZhIGIvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL2NvbXBpbGVyL0VMTm9kZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2ZjZkNmQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvRUxOb2RlLmphdmEKQEAgLTAsMCArMSwyNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphc3Blci5jb21waWxlcjsKKworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5GdW5jdGlvbkluZm87CitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIuSmFzcGVyRXhjZXB0aW9uOworCisvKioKKyAqIFRoaXMgY2xhc3MgZGVmaW5lcyBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBmb3IgYW4gRUwgRXhwcmVzc2lvbgorICoKKyAqIEl0IGN1cnJlbnRseSBvbmx5IGRlZmluZXMgZnVuY3Rpb25zLiAgSXQgY2FuIGJlIGV4cGFuZGVkIHRvIGRlZmluZQorICogYWxsIHRoZSBjb21wb25lbnRzIG9mIGFuIEVMIGV4cHJlc3Npb24sIGlmIG5lZWQgdG8uCisgKgorICogQGF1dGhvciBLaW4tbWFuIENodW5nCisgKi8KKworYWJzdHJhY3QgY2xhc3MgRUxOb2RlIHsKKworICAgIGFic3RyYWN0IHB1YmxpYyB2b2lkIGFjY2VwdChWaXNpdG9yIHYpIHRocm93cyBKYXNwZXJFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBDaGlsZCBjbGFzc2VzCisgICAgICovCisKKworICAgIC8qKgorICAgICAqIFJlcHJlc2VudHMgYW4gRUwgZXhwcmVzc2lvbjogYW55dGhpbmcgaW4gJHsgYW5kIH0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSb290IGV4dGVuZHMgRUxOb2RlIHsKKworCXByaXZhdGUgRUxOb2RlLk5vZGVzIGV4cHI7CisKKwlSb290KEVMTm9kZS5Ob2RlcyBleHByKSB7CisJICAgIHRoaXMuZXhwciA9IGV4cHI7CisJfQorCisJcHVibGljIHZvaWQgYWNjZXB0KFZpc2l0b3IgdikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJICAgIHYudmlzaXQodGhpcyk7CisJfQorCisJcHVibGljIEVMTm9kZS5Ob2RlcyBnZXRFeHByZXNzaW9uKCkgeworCSAgICByZXR1cm4gZXhwcjsKKwl9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwcmVzZW50cyB0ZXh0IG91dHNpZGUgb2YgRUwgZXhwcmVzc2lvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRleHQgZXh0ZW5kcyBFTE5vZGUgeworCisJcHJpdmF0ZSBTdHJpbmcgdGV4dDsKKworCVRleHQoU3RyaW5nIHRleHQpIHsKKwkgICAgdGhpcy50ZXh0ID0gdGV4dDsKKwl9CisKKwlwdWJsaWMgdm9pZCBhY2NlcHQoVmlzaXRvciB2KSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwkgICAgdi52aXNpdCh0aGlzKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7CisJICAgIHJldHVybiB0ZXh0OworCX0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXByZXNlbnRzIGFueXRoaW5nIGluIEVMIGV4cHJlc3Npb24sIG90aGVyIHRoYW4gZnVuY3Rpb25zLCBpbmNsdWRpbmcKKyAgICAgKiBmdW5jdGlvbiBhcmd1bWVudHMgZXRjCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBFTFRleHQgZXh0ZW5kcyBFTE5vZGUgeworCisJcHJpdmF0ZSBTdHJpbmcgdGV4dDsKKworCUVMVGV4dChTdHJpbmcgdGV4dCkgeworCSAgICB0aGlzLnRleHQgPSB0ZXh0OworCX0KKworCXB1YmxpYyB2b2lkIGFjY2VwdChWaXNpdG9yIHYpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCSAgICB2LnZpc2l0KHRoaXMpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKKwkgICAgcmV0dXJuIHRleHQ7CisJfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcHJlc2VudHMgYSBmdW5jdGlvbgorICAgICAqIEN1cnJlbnRseSBvbmx5IGluY2x1ZGUgdGhlIHByZWZpeCBhbmQgZnVuY3Rpb24gbmFtZSwgYnV0IG5vdCBpdHMKKyAgICAgKiBhcmd1bWVudHMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGdW5jdGlvbiBleHRlbmRzIEVMTm9kZSB7CisKKwlwcml2YXRlIFN0cmluZyBwcmVmaXg7CisJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKwlwcml2YXRlIFN0cmluZyB1cmk7CisJcHJpdmF0ZSBGdW5jdGlvbkluZm8gZnVuY3Rpb25JbmZvOworCXByaXZhdGUgU3RyaW5nIG1ldGhvZE5hbWU7CisJcHJpdmF0ZSBTdHJpbmdbXSBwYXJhbWV0ZXJzOworCisJRnVuY3Rpb24oU3RyaW5nIHByZWZpeCwgU3RyaW5nIG5hbWUpIHsKKwkgICAgdGhpcy5wcmVmaXggPSBwcmVmaXg7CisJICAgIHRoaXMubmFtZSA9IG5hbWU7CisJfQorCisJcHVibGljIHZvaWQgYWNjZXB0KFZpc2l0b3IgdikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJICAgIHYudmlzaXQodGhpcyk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRQcmVmaXgoKSB7CisJICAgIHJldHVybiBwcmVmaXg7CisJfQorCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCSAgICByZXR1cm4gbmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRVcmkoU3RyaW5nIHVyaSkgeworCSAgICB0aGlzLnVyaSA9IHVyaTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFVyaSgpIHsKKwkgICAgcmV0dXJuIHVyaTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRGdW5jdGlvbkluZm8oRnVuY3Rpb25JbmZvIGYpIHsKKwkgICAgdGhpcy5mdW5jdGlvbkluZm8gPSBmOworCX0KKworCXB1YmxpYyBGdW5jdGlvbkluZm8gZ2V0RnVuY3Rpb25JbmZvKCkgeworCSAgICByZXR1cm4gZnVuY3Rpb25JbmZvOworCX0KKworCXB1YmxpYyB2b2lkIHNldE1ldGhvZE5hbWUoU3RyaW5nIG1ldGhvZE5hbWUpIHsKKwkgICAgdGhpcy5tZXRob2ROYW1lID0gbWV0aG9kTmFtZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldE1ldGhvZE5hbWUoKSB7CisJICAgIHJldHVybiBtZXRob2ROYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldFBhcmFtZXRlcnMoU3RyaW5nW10gcGFyYW1ldGVycykgeworCSAgICB0aGlzLnBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzOworCX0KKworCXB1YmxpYyBTdHJpbmdbXSBnZXRQYXJhbWV0ZXJzKCkgeworCSAgICByZXR1cm4gcGFyYW1ldGVyczsKKwl9CisgICAgfQorCisgICAgLyoqCisgICAgICogQW4gb3JkZXJlZCBsaXN0IG9mIEVMTm9kZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE5vZGVzIHsKKworCS8qIE5hbWUgdXNlZCBmb3IgY3JlYXRpbmcgYSBtYXAgZm9yIHRoZSBmdW5jdGlvbnMgaW4gdGhpcworCSAgIEVMIGV4cHJlc3Npb24sIGZvciBjb21tdW5pY2F0aW9uIHRvIEdlbmVyYXRvci4KKwkgKi8KKwlTdHJpbmcgbWFwTmFtZSA9IG51bGw7CS8vIFRoZSBmdW5jdGlvbiBtYXAgYXNzb2NpYXRlZCB0aGlzIEVMCisJcHJpdmF0ZSBMaXN0IGxpc3Q7CisKKwlwdWJsaWMgTm9kZXMoKSB7CisJICAgIGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisJfQorCisJcHVibGljIHZvaWQgYWRkKEVMTm9kZSBlbikgeworCSAgICBsaXN0LmFkZChlbik7CisJfQorCisJLyoqCisJICogVmlzaXQgdGhlIG5vZGVzIGluIHRoZSBsaXN0IHdpdGggdGhlIHN1cHBsaWVkIHZpc2l0b3IKKwkgKiBAcGFyYW0gdiBUaGUgdmlzaXRvciB1c2VkCisJICovCisJcHVibGljIHZvaWQgdmlzaXQoVmlzaXRvciB2KSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwkgICAgSXRlcmF0b3IgaXRlciA9IGxpc3QuaXRlcmF0b3IoKTsKKwkgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisJCUVMTm9kZSBuID0gKEVMTm9kZSkgaXRlci5uZXh0KCk7CisJCW4uYWNjZXB0KHYpOworCSAgICB9CisJfQorCisJcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgeworCSAgICByZXR1cm4gbGlzdC5pdGVyYXRvcigpOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7CisJICAgIHJldHVybiBsaXN0LnNpemUoKSA9PSAwOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZXhwcmVzc2lvbiBjb250YWlucyBhICR7Li4ufQorCSAqLworCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zRUwoKSB7CisJICAgIEl0ZXJhdG9yIGl0ZXIgPSBsaXN0Lml0ZXJhdG9yKCk7CisJICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgeworCQlFTE5vZGUgbiA9IChFTE5vZGUpIGl0ZXIubmV4dCgpOworCQlpZiAobiBpbnN0YW5jZW9mIFJvb3QpIHsKKwkJICAgIHJldHVybiB0cnVlOworCQl9CisJICAgIH0KKwkgICAgcmV0dXJuIGZhbHNlOworCX0KKworCXB1YmxpYyB2b2lkIHNldE1hcE5hbWUoU3RyaW5nIG5hbWUpIHsKKwkgICAgdGhpcy5tYXBOYW1lID0gbmFtZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldE1hcE5hbWUoKSB7CisJICAgIHJldHVybiBtYXBOYW1lOworCX0KKyAgICB9CisKKyAgICAvKgorICAgICAqIEEgdmlzaXRvciBjbGFzcyBmb3IgdHJhdmVyc2luZyBFTE5vZGVzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBWaXNpdG9yIHsKKworCXB1YmxpYyB2b2lkIHZpc2l0KFJvb3QgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJICAgIG4uZ2V0RXhwcmVzc2lvbigpLnZpc2l0KHRoaXMpOworCX0KKworCXB1YmxpYyB2b2lkIHZpc2l0KEZ1bmN0aW9uIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCX0KKworCXB1YmxpYyB2b2lkIHZpc2l0KFRleHQgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJfQorCisJcHVibGljIHZvaWQgdmlzaXQoRUxUZXh0IG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCX0KKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9FTFBhcnNlci5qYXZhIGIvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL2NvbXBpbGVyL0VMUGFyc2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmUxMzc4NgotLS0gL2Rldi9udWxsCisrKyBiL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9FTFBhcnNlci5qYXZhCkBAIC0wLDAgKzEsMzY3IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYXNwZXIuY29tcGlsZXI7CisKKy8qKgorICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIGEgcGFyc2VyIGZvciBFTCBleHByZXNzaW9ucy4KKyAqCisgKiBJdCB0YWtlcyBzdHJpbmdzIG9mIHRoZSBmb3JtIHh4eCR7Li59eXl5JHsuLn16enogZXRjLCBhbmQgdHVybiBpdCBpbnRvCisgKiBhIEVMTm9kZS5Ob2Rlcy4KKyAqCisgKiBDdXJyZW50bHksIGl0IG9ubHkgaGFuZGxlcyB0ZXh0IG91dHNpZGUgJHsuLn0gYW5kIGZ1bmN0aW9ucyBpbiAkeyAuLn0uCisgKgorICogQGF1dGhvciBLaW4tbWFuIENodW5nCisgKi8KKworcHVibGljIGNsYXNzIEVMUGFyc2VyIHsKKworICAgIHByaXZhdGUgVG9rZW4gY3VyVG9rZW47CS8vIGN1cnJlbnQgdG9rZW4KKyAgICBwcml2YXRlIEVMTm9kZS5Ob2RlcyBleHByOworICAgIHByaXZhdGUgRUxOb2RlLk5vZGVzIEVMZXhwcjsKKyAgICBwcml2YXRlIGludCBpbmRleDsJCS8vIEN1cnJlbnQgaW5kZXggb2YgdGhlIGV4cHJlc3Npb24KKyAgICBwcml2YXRlIFN0cmluZyBleHByZXNzaW9uOwkvLyBUaGUgRUwgZXhwcmVzc2lvbgorICAgIHByaXZhdGUgYm9vbGVhbiBlc2NhcGVCUzsJLy8gaXMgJ1wnIGFuIGVzY2FwZSBjaGFyIGluIHRleHQgb3V0c2lkZSBFTD8KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyByZXNlcnZlZFdvcmRzW10gPSB7CisgICAgICAgICJhbmQiLCAiZGl2IiwgImVtcHR5IiwgImVxIiwgImZhbHNlIiwKKyAgICAgICAgImdlIiwgImd0IiwgImluc3RhbmNlb2YiLCAibGUiLCAibHQiLCAibW9kIiwKKyAgICAgICAgIm5lIiwgIm5vdCIsICJudWxsIiwgIm9yIiwgInRydWUifTsKKworICAgIHB1YmxpYyBFTFBhcnNlcihTdHJpbmcgZXhwcmVzc2lvbikgeworCWluZGV4ID0gMDsKKwl0aGlzLmV4cHJlc3Npb24gPSBleHByZXNzaW9uOworCWV4cHIgPSBuZXcgRUxOb2RlLk5vZGVzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2UgYW4gRUwgZXhwcmVzc2lvbgorICAgICAqIEBwYXJhbSBleHByZXNzaW9uIFRoZSBpbnB1dCBleHByZXNzaW9uIHN0cmluZyBvZiB0aGUgZm9ybQorICAgICAqICAgICAgICAgICAgICAgICAgIENoYXIqICgnJHsnIENoYXIqICd9JykqIENoYXIqCisgICAgICogQHJldHVybiBQYXJzZWQgRUwgZXhwcmVzc2lvbiBpbiBFTE5vZGUuTm9kZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEVMTm9kZS5Ob2RlcyBwYXJzZShTdHJpbmcgZXhwcmVzc2lvbikgeworCUVMUGFyc2VyIHBhcnNlciA9IG5ldyBFTFBhcnNlcihleHByZXNzaW9uKTsKKwl3aGlsZSAocGFyc2VyLmhhc05leHRDaGFyKCkpIHsKKwkgICAgU3RyaW5nIHRleHQgPSBwYXJzZXIuc2tpcFVudGlsRUwoKTsKKwkgICAgaWYgKHRleHQubGVuZ3RoKCkgPiAwKSB7CisJCXBhcnNlci5leHByLmFkZChuZXcgRUxOb2RlLlRleHQodGV4dCkpOworCSAgICB9CisJICAgIEVMTm9kZS5Ob2RlcyBlbGV4cHIgPSBwYXJzZXIucGFyc2VFTCgpOworCSAgICBpZiAoISBlbGV4cHIuaXNFbXB0eSgpKSB7CisJCXBhcnNlci5leHByLmFkZChuZXcgRUxOb2RlLlJvb3QoZWxleHByKSk7CisJICAgIH0KKwl9CisJcmV0dXJuIHBhcnNlci5leHByOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlIGFuIEVMIGV4cHJlc3Npb24gc3RyaW5nICckey4uLn0nCisgICAgICpAcmV0dXJuIEFuIEVMTm9kZS5Ob2RlcyByZXByZXNlbnRpbmcgdGhlIEVMIGV4cHJlc3Npb24KKyAgICAgKiBUT0RPOiBDdXJyZW50bHkgb25seSBwYXJzZWQgaW50byBmdW5jdGlvbnMgYW5kIHRleHQgc3RyaW5ncy4gIFRoaXMKKyAgICAgKiAgICAgICBzaG91bGQgYmUgcmV3cml0dGVuIGZvciBhIGZ1bGwgcGFyc2VyLgorICAgICAqLworICAgIHByaXZhdGUgRUxOb2RlLk5vZGVzIHBhcnNlRUwoKSB7CisKKwlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCUVMZXhwciA9IG5ldyBFTE5vZGUuTm9kZXMoKTsKKwl3aGlsZSAoaGFzTmV4dCgpKSB7CisJICAgIGN1clRva2VuID0gbmV4dFRva2VuKCk7CisJICAgIGlmIChjdXJUb2tlbiBpbnN0YW5jZW9mIENoYXIpIHsKKwkJaWYgKGN1clRva2VuLnRvQ2hhcigpID09ICd9JykgeworCQkgICAgYnJlYWs7CisJCX0KKwkJYnVmLmFwcGVuZChjdXJUb2tlbi50b0NoYXIoKSk7CisJICAgIH0gZWxzZSB7CisJCS8vIE91dHB1dCB3aGF0ZXZlciBpcyBpbiBidWZmZXIKKwkJaWYgKGJ1Zi5sZW5ndGgoKSA+IDApIHsKKwkJICAgIEVMZXhwci5hZGQobmV3IEVMTm9kZS5FTFRleHQoYnVmLnRvU3RyaW5nKCkpKTsKKwkJfQorCQlpZiAoIXBhcnNlRnVuY3Rpb24oKSkgeworCQkgICAgRUxleHByLmFkZChuZXcgRUxOb2RlLkVMVGV4dChjdXJUb2tlbi50b1N0cmluZygpKSk7CisJCX0KKwkgICAgfQorCX0KKwlpZiAoYnVmLmxlbmd0aCgpID4gMCkgeworCSAgICBFTGV4cHIuYWRkKG5ldyBFTE5vZGUuRUxUZXh0KGJ1Zi50b1N0cmluZygpKSk7CisJfQorCisJcmV0dXJuIEVMZXhwcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSBmb3IgYSBmdW5jdGlvbgorICAgICAqIEZ1bmN0aW9uSW52b2thdGlvbiA6Oj0gKGlkZW50aWZpZXIgJzonKT8gaWRlbnRpZmllciAnKCcKKyAgICAgKgkJCSAgICAgIChFeHByZXNzaW9uICgsRXhwcmVzc2lvbikqKT8gJyknCisgICAgICogTm90ZTogY3VycmVudGx5IHdlIGRvbid0IHBhcnNlIGFyZ3VtZW50cworICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBwYXJzZUZ1bmN0aW9uKCkgeworCWlmICghIChjdXJUb2tlbiBpbnN0YW5jZW9mIElkKSB8fCBpc0VMUmVzZXJ2ZWQoY3VyVG9rZW4udG9TdHJpbmcoKSkpIHsKKwkgICAgcmV0dXJuIGZhbHNlOworCX0KKwlTdHJpbmcgczEgPSBudWxsOyAgICAgICAgICAgICAgICAgLy8gRnVuY3Rpb24gcHJlZml4CisJU3RyaW5nIHMyID0gY3VyVG9rZW4udG9TdHJpbmcoKTsgIC8vIEZ1bmN0aW9uIG5hbWUKKwlpbnQgbWFyayA9IGdldEluZGV4KCk7CisJaWYgKGhhc05leHQoKSkgeworCSAgICBUb2tlbiB0ID0gbmV4dFRva2VuKCk7CisJICAgIGlmICh0LnRvQ2hhcigpID09ICc6JykgeworCQlpZiAoaGFzTmV4dCgpKSB7CisJCSAgICBUb2tlbiB0MiA9IG5leHRUb2tlbigpOworCQkgICAgaWYgKHQyIGluc3RhbmNlb2YgSWQpIHsKKwkJCXMxID0gczI7CisJCQlzMiA9IHQyLnRvU3RyaW5nKCk7CisJCQlpZiAoaGFzTmV4dCgpKSB7CisJCQkgICAgdCA9IG5leHRUb2tlbigpOworCQkJfQorCQkgICAgfQorCQl9CisJICAgIH0KKwkgICAgaWYgKHQudG9DaGFyKCkgPT0gJygnKSB7CisJCUVMZXhwci5hZGQobmV3IEVMTm9kZS5GdW5jdGlvbihzMSwgczIpKTsKKwkJcmV0dXJuIHRydWU7CisJICAgIH0KKwl9CisJc2V0SW5kZXgobWFyayk7CisJcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgaWYgYW4gaWQgaXMgYSByZXNlcnZlZCB3b3JkIGluIEVMCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGlzRUxSZXNlcnZlZChTdHJpbmcgaWQpIHsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICBpbnQgaiA9IHJlc2VydmVkV29yZHMubGVuZ3RoOworICAgICAgICB3aGlsZSAoaSA8IGopIHsKKyAgICAgICAgICAgIGludCBrID0gKGkraikvMjsKKyAgICAgICAgICAgIGludCByZXN1bHQgPSByZXNlcnZlZFdvcmRzW2tdLmNvbXBhcmVUbyhpZCk7CisgICAgICAgICAgICBpZiAocmVzdWx0ID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChyZXN1bHQgPCAwKSB7CisgICAgICAgICAgICAgICAgaSA9IGsrMTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaiA9IGs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNraXAgdW50aWwgYW4gRUwgZXhwcmVzc2lvbiAoJyR7JykgaXMgcmVhY2hlZCwgYWxsb3dpbmcgZXNjYXBlIHNlcXVlbmNlcworICAgICAqICdcXCcgYW5kICdcJCcuCisgICAgICogQHJldHVybiBUaGUgdGV4dCBzdHJpbmcgdXAgdG8gdGhlIEVMIGV4cHJlc3Npb24KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBza2lwVW50aWxFTCgpIHsKKwljaGFyIHByZXYgPSAwOworCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJd2hpbGUgKGhhc05leHRDaGFyKCkpIHsKKwkgICAgY2hhciBjaCA9IG5leHRDaGFyKCk7CisJICAgIGlmIChwcmV2ID09ICdcXCcpIHsKKwkJcHJldiA9IDA7CisJCWlmIChjaCA9PSAnXFwnKSB7CisJCSAgICBidWYuYXBwZW5kKCdcXCcpOworCQkgICAgaWYgKCFlc2NhcGVCUykKKwkJCXByZXYgPSAnXFwnOworCQl9IGVsc2UgaWYgKGNoID09ICckJykgeworCQkgICAgYnVmLmFwcGVuZCgnJCcpOworCQl9CisJCS8vIGVsc2UgZXJyb3IhCisJICAgIH0gZWxzZSBpZiAocHJldiA9PSAnJCcpIHsKKwkJaWYgKGNoID09ICd7JykgeworCQkgICAgcHJldiA9IDA7CisJCSAgICBicmVhazsKKwkJfSAKKwkJYnVmLmFwcGVuZCgnJCcpOworCQlidWYuYXBwZW5kKGNoKTsKKwkgICAgfSBlbHNlIGlmIChjaCA9PSAnXFwnIHx8IGNoID09ICckJykgeworCQlwcmV2ID0gY2g7CisJICAgIH0gZWxzZSB7CisJCWJ1Zi5hcHBlbmQoY2gpOworCSAgICB9CisJfQorCWlmIChwcmV2ICE9IDApIHsKKwkgICAgYnVmLmFwcGVuZChwcmV2KTsKKwl9CisJcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgIH0KKworICAgIC8qCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZXJlIGlzIHNvbWV0aGluZyBsZWZ0IGluIEVMIGV4cHJlc3Npb24gYnVmZmVyIG90aGVyCisgICAgICogICAgICAgICB0aGFuIHdoaXRlIHNwYWNlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaGFzTmV4dCgpIHsKKwlza2lwU3BhY2VzKCk7CisJcmV0dXJuIGhhc05leHRDaGFyKCk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBAcmV0dXJuIFRoZSBuZXh0IHRva2VuIGluIHRoZSBFTCBleHByZXNzaW9uIGJ1ZmZlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIFRva2VuIG5leHRUb2tlbigpIHsKKwlza2lwU3BhY2VzKCk7CisJaWYgKGhhc05leHRDaGFyKCkpIHsKKwkgICAgY2hhciBjaCA9IG5leHRDaGFyKCk7CisJICAgIGlmIChDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclN0YXJ0KGNoKSkgeworCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQlidWYuYXBwZW5kKGNoKTsKKwkJd2hpbGUgKChjaCA9IHBlZWtDaGFyKCkpICE9IC0xICYmCisJCQkJQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KGNoKSkgeworCQkgICAgYnVmLmFwcGVuZChjaCk7CisJCSAgICBuZXh0Q2hhcigpOworCQl9CisJCXJldHVybiBuZXcgSWQoYnVmLnRvU3RyaW5nKCkpOworCSAgICB9CisKKwkgICAgaWYgKGNoID09ICdcJycgfHwgY2ggPT0gJyInKSB7CisJCXJldHVybiBwYXJzZVF1b3RlZENoYXJzKGNoKTsKKwkgICAgfSBlbHNlIHsKKwkJLy8gRm9yIG5vdy4uLgorCQlyZXR1cm4gbmV3IENoYXIoY2gpOworCSAgICB9CisJfQorCXJldHVybiBudWxsOworICAgIH0KKworICAgIC8qCisgICAgICogUGFyc2UgYSBzdHJpbmcgaW4gc2luZ2xlIG9yIGRvdWJsZSBxdW90ZXMsIGFsbG93aW5nIGZvciBlc2NhcGUgc2VxdWVuY2VzCisgICAgICogJ1xcJywgYW5kICgnXCInLCBvciAiXCciKQorICAgICAqLworICAgIHByaXZhdGUgVG9rZW4gcGFyc2VRdW90ZWRDaGFycyhjaGFyIHF1b3RlKSB7CisJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwlidWYuYXBwZW5kKHF1b3RlKTsKKwl3aGlsZSAoaGFzTmV4dENoYXIoKSkgeworCSAgICBjaGFyIGNoID0gbmV4dENoYXIoKTsKKwkgICAgaWYgKGNoID09ICdcXCcpIHsKKwkJY2ggPSBuZXh0Q2hhcigpOworCQlpZiAoY2ggPT0gJ1xcJyB8fCBjaCA9PSBxdW90ZSkgeworCQkgICAgYnVmLmFwcGVuZChjaCk7CisJCX0KKwkJLy8gZWxzZSBlcnJvciEKKwkgICAgfSBlbHNlIGlmIChjaCA9PSBxdW90ZSkgeworCQlidWYuYXBwZW5kKGNoKTsKKwkJYnJlYWs7CisJICAgIH0gZWxzZSB7CisJCWJ1Zi5hcHBlbmQoY2gpOworCSAgICB9CisJfQorCXJldHVybiBuZXcgUXVvdGVkU3RyaW5nKGJ1Zi50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIEEgY29sbGVjdGlvbiBvZiBsb3cgbGV2ZWwgcGFyc2UgbWV0aG9kcyBkZWFsaW5nIHdpdGggY2hhcmFjdGVyIGluCisgICAgICogdGhlIEVMIGV4cHJlc3Npb24gYnVmZmVyLgorICAgICAqLworCisgICAgcHJpdmF0ZSB2b2lkIHNraXBTcGFjZXMoKSB7CisJd2hpbGUgKGhhc05leHRDaGFyKCkpIHsKKwkgICAgaWYgKGV4cHJlc3Npb24uY2hhckF0KGluZGV4KSA+ICcgJykKKwkJYnJlYWs7CisJICAgIGluZGV4Kys7CisJfQorICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBoYXNOZXh0Q2hhcigpIHsKKwlyZXR1cm4gaW5kZXggPCBleHByZXNzaW9uLmxlbmd0aCgpOworICAgIH0KKworICAgIHByaXZhdGUgY2hhciBuZXh0Q2hhcigpIHsKKwlpZiAoaW5kZXggPj0gZXhwcmVzc2lvbi5sZW5ndGgoKSkgeworCSAgICByZXR1cm4gKGNoYXIpLTE7CisJfQorCXJldHVybiBleHByZXNzaW9uLmNoYXJBdChpbmRleCsrKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGNoYXIgcGVla0NoYXIoKSB7CisJaWYgKGluZGV4ID49IGV4cHJlc3Npb24ubGVuZ3RoKCkpIHsKKwkgICAgcmV0dXJuIChjaGFyKS0xOworCX0KKwlyZXR1cm4gZXhwcmVzc2lvbi5jaGFyQXQoaW5kZXgpOworICAgIH0KKworICAgIHByaXZhdGUgaW50IGdldEluZGV4KCkgeworCXJldHVybiBpbmRleDsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0SW5kZXgoaW50IGkpIHsKKwlpbmRleCA9IGk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBSZXByZXNlbnRzIGEgdG9rZW4gaW4gRUwgZXhwcmVzc2lvbiBzdHJpbmcKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBUb2tlbiB7CisKKwljaGFyIHRvQ2hhcigpIHsKKwkgICAgcmV0dXJuIDA7CisJfQorCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkgICAgcmV0dXJuICIiOworCX0KKyAgICB9CisKKyAgICAvKgorICAgICAqIFJlcHJlc2VudHMgYW4gSUQgdG9rZW4gaW4gRUwKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBJZCBleHRlbmRzIFRva2VuIHsKKwlTdHJpbmcgaWQ7CisKKwlJZChTdHJpbmcgaWQpIHsKKwkgICAgdGhpcy5pZCA9IGlkOworCX0KKworCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJICAgIHJldHVybiBpZDsKKwl9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBSZXByZXNlbnRzIGEgY2hhcmFjdGVyIHRva2VuIGluIEVMCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ2hhciBleHRlbmRzIFRva2VuIHsKKworCXByaXZhdGUgY2hhciBjaDsKKworCUNoYXIoY2hhciBjaCkgeworCSAgICB0aGlzLmNoID0gY2g7CisJfQorCisJY2hhciB0b0NoYXIoKSB7CisJICAgIHJldHVybiBjaDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCSAgICByZXR1cm4gKG5ldyBDaGFyYWN0ZXIoY2gpKS50b1N0cmluZygpOworCX0KKyAgICB9CisKKyAgICAvKgorICAgICAqIFJlcHJlc2VudHMgYSBxdW90ZWQgKHNpbmdsZSBvciBkb3VibGUpIHN0cmluZyB0b2tlbiBpbiBFTAorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFF1b3RlZFN0cmluZyBleHRlbmRzIFRva2VuIHsKKworCXByaXZhdGUgU3RyaW5nIHZhbHVlOworCisJUXVvdGVkU3RyaW5nKFN0cmluZyB2KSB7CisJICAgIHRoaXMudmFsdWUgPSB2OworCX0KKworCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJICAgIHJldHVybiB2YWx1ZTsKKwl9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvRXJyb3JEaXNwYXRjaGVyLmphdmEgYi9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvRXJyb3JEaXNwYXRjaGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVlY2Y1MgotLS0gL2Rldi9udWxsCisrKyBiL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9FcnJvckRpc3BhdGNoZXIuamF2YQpAQCAtMCwwICsxLDU4MiBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmphc3Blci5jb21waWxlcjsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLkphc3BlckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CisKKy8qKgorICogQ2xhc3MgcmVzcG9uc2libGUgZm9yIGRpc3BhdGNoaW5nIEpTUCBwYXJzZSBhbmQgamF2YWMgY29tcGlsYXRpb24gZXJyb3JzCisgKiB0byB0aGUgY29uZmlndXJlZCBlcnJvciBoYW5kbGVyLgorICoKKyAqIFRoaXMgY2xhc3MgaXMgYWxzbyByZXNwb25zaWJsZSBmb3IgbG9jYWxpemluZyBhbnkgZXJyb3IgY29kZXMgYmVmb3JlIHRoZXkKKyAqIGFyZSBwYXNzZWQgb24gdG8gdGhlIGNvbmZpZ3VyZWQgZXJyb3IgaGFuZGxlci4KKyAqIAorICogSW4gdGhlIGNhc2Ugb2YgYSBKYXZhIGNvbXBpbGF0aW9uIGVycm9yLCB0aGUgY29tcGlsZXIgZXJyb3IgbWVzc2FnZSBpcworICogcGFyc2VkIGludG8gYW4gYXJyYXkgb2YgSmF2YWNFcnJvckRldGFpbCBpbnN0YW5jZXMsIHdoaWNoIGlzIHBhc3NlZCBvbiB0byAKKyAqIHRoZSBjb25maWd1cmVkIGVycm9yIGhhbmRsZXIuCisgKgorICogQGF1dGhvciBKYW4gTHVlaGUKKyAqIEBhdXRob3IgS2luLW1hbiBDaHVuZworICovCitwdWJsaWMgY2xhc3MgRXJyb3JEaXNwYXRjaGVyIHsKKworICAgIC8vIEN1c3RvbSBlcnJvciBoYW5kbGVyCisgICAgcHJpdmF0ZSBFcnJvckhhbmRsZXIgZXJySGFuZGxlcjsKKworICAgIC8vIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjb21waWxhdGlvbiB3YXMgaW5pdGlhdGVkIGJ5IEpzcFNlcnZsZXQgb3IgSnNwQworICAgIHByaXZhdGUgYm9vbGVhbiBqc3BjTW9kZSA9IGZhbHNlOworCisKKyAgICAvKgorICAgICAqIENvbnN0cnVjdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIGpzcGNNb2RlIHRydWUgaWYgY29tcGlsYXRpb24gaGFzIGJlZW4gaW5pdGlhdGVkIGJ5IEpzcEMsIGZhbHNlCisgICAgICogb3RoZXJ3aXNlCisgICAgICovCisgICAgcHVibGljIEVycm9yRGlzcGF0Y2hlcihib29sZWFuIGpzcGNNb2RlKSB7CisJLy8gWFhYIGNoZWNrIHdlYi54bWwgZm9yIGN1c3RvbSBlcnJvciBoYW5kbGVyCisJZXJySGFuZGxlciA9IG5ldyBEZWZhdWx0RXJyb3JIYW5kbGVyKCk7CisgICAgICAgIHRoaXMuanNwY01vZGUgPSBqc3BjTW9kZTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIERpc3BhdGNoZXMgdGhlIGdpdmVuIEpTUCBwYXJzZSBlcnJvciB0byB0aGUgY29uZmlndXJlZCBlcnJvciBoYW5kbGVyLgorICAgICAqCisgICAgICogVGhlIGdpdmVuIGVycm9yIGNvZGUgaXMgbG9jYWxpemVkLiBJZiBpdCBpcyBub3QgZm91bmQgaW4gdGhlCisgICAgICogcmVzb3VyY2UgYnVuZGxlIGZvciBsb2NhbGl6ZWQgZXJyb3IgbWVzc2FnZXMsIGl0IGlzIHVzZWQgYXMgdGhlIGVycm9yCisgICAgICogbWVzc2FnZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlcnJDb2RlIEVycm9yIGNvZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBqc3BFcnJvcihTdHJpbmcgZXJyQ29kZSkgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJZGlzcGF0Y2gobnVsbCwgZXJyQ29kZSwgbnVsbCwgbnVsbCk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBEaXNwYXRjaGVzIHRoZSBnaXZlbiBKU1AgcGFyc2UgZXJyb3IgdG8gdGhlIGNvbmZpZ3VyZWQgZXJyb3IgaGFuZGxlci4KKyAgICAgKgorICAgICAqIFRoZSBnaXZlbiBlcnJvciBjb2RlIGlzIGxvY2FsaXplZC4gSWYgaXQgaXMgbm90IGZvdW5kIGluIHRoZQorICAgICAqIHJlc291cmNlIGJ1bmRsZSBmb3IgbG9jYWxpemVkIGVycm9yIG1lc3NhZ2VzLCBpdCBpcyB1c2VkIGFzIHRoZSBlcnJvcgorICAgICAqIG1lc3NhZ2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gd2hlcmUgRXJyb3IgbG9jYXRpb24KKyAgICAgKiBAcGFyYW0gZXJyQ29kZSBFcnJvciBjb2RlCisgICAgICovCisgICAgcHVibGljIHZvaWQganNwRXJyb3IoTWFyayB3aGVyZSwgU3RyaW5nIGVyckNvZGUpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCWRpc3BhdGNoKHdoZXJlLCBlcnJDb2RlLCBudWxsLCBudWxsKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIERpc3BhdGNoZXMgdGhlIGdpdmVuIEpTUCBwYXJzZSBlcnJvciB0byB0aGUgY29uZmlndXJlZCBlcnJvciBoYW5kbGVyLgorICAgICAqCisgICAgICogVGhlIGdpdmVuIGVycm9yIGNvZGUgaXMgbG9jYWxpemVkLiBJZiBpdCBpcyBub3QgZm91bmQgaW4gdGhlCisgICAgICogcmVzb3VyY2UgYnVuZGxlIGZvciBsb2NhbGl6ZWQgZXJyb3IgbWVzc2FnZXMsIGl0IGlzIHVzZWQgYXMgdGhlIGVycm9yCisgICAgICogbWVzc2FnZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuIE5vZGUgdGhhdCBjYXVzZWQgdGhlIGVycm9yCisgICAgICogQHBhcmFtIGVyckNvZGUgRXJyb3IgY29kZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGpzcEVycm9yKE5vZGUgbiwgU3RyaW5nIGVyckNvZGUpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCWRpc3BhdGNoKG4uZ2V0U3RhcnQoKSwgZXJyQ29kZSwgbnVsbCwgbnVsbCk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBEaXNwYXRjaGVzIHRoZSBnaXZlbiBKU1AgcGFyc2UgZXJyb3IgdG8gdGhlIGNvbmZpZ3VyZWQgZXJyb3IgaGFuZGxlci4KKyAgICAgKgorICAgICAqIFRoZSBnaXZlbiBlcnJvciBjb2RlIGlzIGxvY2FsaXplZC4gSWYgaXQgaXMgbm90IGZvdW5kIGluIHRoZQorICAgICAqIHJlc291cmNlIGJ1bmRsZSBmb3IgbG9jYWxpemVkIGVycm9yIG1lc3NhZ2VzLCBpdCBpcyB1c2VkIGFzIHRoZSBlcnJvcgorICAgICAqIG1lc3NhZ2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXJyQ29kZSBFcnJvciBjb2RlCisgICAgICogQHBhcmFtIGFyZyBBcmd1bWVudCBmb3IgcGFyYW1ldHJpYyByZXBsYWNlbWVudAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGpzcEVycm9yKFN0cmluZyBlcnJDb2RlLCBTdHJpbmcgYXJnKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwlkaXNwYXRjaChudWxsLCBlcnJDb2RlLCBuZXcgT2JqZWN0W10ge2FyZ30sIG51bGwpOworICAgIH0KKworICAgIC8qCisgICAgICogRGlzcGF0Y2hlcyB0aGUgZ2l2ZW4gSlNQIHBhcnNlIGVycm9yIHRvIHRoZSBjb25maWd1cmVkIGVycm9yIGhhbmRsZXIuCisgICAgICoKKyAgICAgKiBUaGUgZ2l2ZW4gZXJyb3IgY29kZSBpcyBsb2NhbGl6ZWQuIElmIGl0IGlzIG5vdCBmb3VuZCBpbiB0aGUKKyAgICAgKiByZXNvdXJjZSBidW5kbGUgZm9yIGxvY2FsaXplZCBlcnJvciBtZXNzYWdlcywgaXQgaXMgdXNlZCBhcyB0aGUgZXJyb3IKKyAgICAgKiBtZXNzYWdlLgorICAgICAqCisgICAgICogQHBhcmFtIHdoZXJlIEVycm9yIGxvY2F0aW9uCisgICAgICogQHBhcmFtIGVyckNvZGUgRXJyb3IgY29kZQorICAgICAqIEBwYXJhbSBhcmcgQXJndW1lbnQgZm9yIHBhcmFtZXRyaWMgcmVwbGFjZW1lbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBqc3BFcnJvcihNYXJrIHdoZXJlLCBTdHJpbmcgZXJyQ29kZSwgU3RyaW5nIGFyZykKKwkgICAgICAgIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCWRpc3BhdGNoKHdoZXJlLCBlcnJDb2RlLCBuZXcgT2JqZWN0W10ge2FyZ30sIG51bGwpOworICAgIH0KKworICAgIC8qCisgICAgICogRGlzcGF0Y2hlcyB0aGUgZ2l2ZW4gSlNQIHBhcnNlIGVycm9yIHRvIHRoZSBjb25maWd1cmVkIGVycm9yIGhhbmRsZXIuCisgICAgICoKKyAgICAgKiBUaGUgZ2l2ZW4gZXJyb3IgY29kZSBpcyBsb2NhbGl6ZWQuIElmIGl0IGlzIG5vdCBmb3VuZCBpbiB0aGUKKyAgICAgKiByZXNvdXJjZSBidW5kbGUgZm9yIGxvY2FsaXplZCBlcnJvciBtZXNzYWdlcywgaXQgaXMgdXNlZCBhcyB0aGUgZXJyb3IKKyAgICAgKiBtZXNzYWdlLgorICAgICAqCisgICAgICogQHBhcmFtIG4gTm9kZSB0aGF0IGNhdXNlZCB0aGUgZXJyb3IKKyAgICAgKiBAcGFyYW0gZXJyQ29kZSBFcnJvciBjb2RlCisgICAgICogQHBhcmFtIGFyZyBBcmd1bWVudCBmb3IgcGFyYW1ldHJpYyByZXBsYWNlbWVudAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGpzcEVycm9yKE5vZGUgbiwgU3RyaW5nIGVyckNvZGUsIFN0cmluZyBhcmcpCisJICAgICAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwlkaXNwYXRjaChuLmdldFN0YXJ0KCksIGVyckNvZGUsIG5ldyBPYmplY3RbXSB7YXJnfSwgbnVsbCk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBEaXNwYXRjaGVzIHRoZSBnaXZlbiBKU1AgcGFyc2UgZXJyb3IgdG8gdGhlIGNvbmZpZ3VyZWQgZXJyb3IgaGFuZGxlci4KKyAgICAgKgorICAgICAqIFRoZSBnaXZlbiBlcnJvciBjb2RlIGlzIGxvY2FsaXplZC4gSWYgaXQgaXMgbm90IGZvdW5kIGluIHRoZQorICAgICAqIHJlc291cmNlIGJ1bmRsZSBmb3IgbG9jYWxpemVkIGVycm9yIG1lc3NhZ2VzLCBpdCBpcyB1c2VkIGFzIHRoZSBlcnJvcgorICAgICAqIG1lc3NhZ2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXJyQ29kZSBFcnJvciBjb2RlCisgICAgICogQHBhcmFtIGFyZzEgRmlyc3QgYXJndW1lbnQgZm9yIHBhcmFtZXRyaWMgcmVwbGFjZW1lbnQKKyAgICAgKiBAcGFyYW0gYXJnMiBTZWNvbmQgYXJndW1lbnQgZm9yIHBhcmFtZXRyaWMgcmVwbGFjZW1lbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBqc3BFcnJvcihTdHJpbmcgZXJyQ29kZSwgU3RyaW5nIGFyZzEsIFN0cmluZyBhcmcyKQorCSAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJZGlzcGF0Y2gobnVsbCwgZXJyQ29kZSwgbmV3IE9iamVjdFtdIHthcmcxLCBhcmcyfSwgbnVsbCk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBEaXNwYXRjaGVzIHRoZSBnaXZlbiBKU1AgcGFyc2UgZXJyb3IgdG8gdGhlIGNvbmZpZ3VyZWQgZXJyb3IgaGFuZGxlci4KKyAgICAgKgorICAgICAqIFRoZSBnaXZlbiBlcnJvciBjb2RlIGlzIGxvY2FsaXplZC4gSWYgaXQgaXMgbm90IGZvdW5kIGluIHRoZQorICAgICAqIHJlc291cmNlIGJ1bmRsZSBmb3IgbG9jYWxpemVkIGVycm9yIG1lc3NhZ2VzLCBpdCBpcyB1c2VkIGFzIHRoZSBlcnJvcgorICAgICAqIG1lc3NhZ2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXJyQ29kZSBFcnJvciBjb2RlCisgICAgICogQHBhcmFtIGFyZzEgRmlyc3QgYXJndW1lbnQgZm9yIHBhcmFtZXRyaWMgcmVwbGFjZW1lbnQKKyAgICAgKiBAcGFyYW0gYXJnMiBTZWNvbmQgYXJndW1lbnQgZm9yIHBhcmFtZXRyaWMgcmVwbGFjZW1lbnQKKyAgICAgKiBAcGFyYW0gYXJnMyBUaGlyZCBhcmd1bWVudCBmb3IgcGFyYW1ldHJpYyByZXBsYWNlbWVudAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGpzcEVycm9yKFN0cmluZyBlcnJDb2RlLCBTdHJpbmcgYXJnMSwgU3RyaW5nIGFyZzIsIFN0cmluZyBhcmczKQorCSAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJZGlzcGF0Y2gobnVsbCwgZXJyQ29kZSwgbmV3IE9iamVjdFtdIHthcmcxLCBhcmcyLCBhcmczfSwgbnVsbCk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBEaXNwYXRjaGVzIHRoZSBnaXZlbiBKU1AgcGFyc2UgZXJyb3IgdG8gdGhlIGNvbmZpZ3VyZWQgZXJyb3IgaGFuZGxlci4KKyAgICAgKgorICAgICAqIFRoZSBnaXZlbiBlcnJvciBjb2RlIGlzIGxvY2FsaXplZC4gSWYgaXQgaXMgbm90IGZvdW5kIGluIHRoZQorICAgICAqIHJlc291cmNlIGJ1bmRsZSBmb3IgbG9jYWxpemVkIGVycm9yIG1lc3NhZ2VzLCBpdCBpcyB1c2VkIGFzIHRoZSBlcnJvcgorICAgICAqIG1lc3NhZ2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gd2hlcmUgRXJyb3IgbG9jYXRpb24KKyAgICAgKiBAcGFyYW0gZXJyQ29kZSBFcnJvciBjb2RlCisgICAgICogQHBhcmFtIGFyZzEgRmlyc3QgYXJndW1lbnQgZm9yIHBhcmFtZXRyaWMgcmVwbGFjZW1lbnQKKyAgICAgKiBAcGFyYW0gYXJnMiBTZWNvbmQgYXJndW1lbnQgZm9yIHBhcmFtZXRyaWMgcmVwbGFjZW1lbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBqc3BFcnJvcihNYXJrIHdoZXJlLCBTdHJpbmcgZXJyQ29kZSwgU3RyaW5nIGFyZzEsIFN0cmluZyBhcmcyKQorCSAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJZGlzcGF0Y2god2hlcmUsIGVyckNvZGUsIG5ldyBPYmplY3RbXSB7YXJnMSwgYXJnMn0sIG51bGwpOworICAgIH0KKworICAgIC8qCisgICAgICogRGlzcGF0Y2hlcyB0aGUgZ2l2ZW4gSlNQIHBhcnNlIGVycm9yIHRvIHRoZSBjb25maWd1cmVkIGVycm9yIGhhbmRsZXIuCisgICAgICoKKyAgICAgKiBUaGUgZ2l2ZW4gZXJyb3IgY29kZSBpcyBsb2NhbGl6ZWQuIElmIGl0IGlzIG5vdCBmb3VuZCBpbiB0aGUKKyAgICAgKiByZXNvdXJjZSBidW5kbGUgZm9yIGxvY2FsaXplZCBlcnJvciBtZXNzYWdlcywgaXQgaXMgdXNlZCBhcyB0aGUgZXJyb3IKKyAgICAgKiBtZXNzYWdlLgorICAgICAqCisgICAgICogQHBhcmFtIHdoZXJlIEVycm9yIGxvY2F0aW9uCisgICAgICogQHBhcmFtIGVyckNvZGUgRXJyb3IgY29kZQorICAgICAqIEBwYXJhbSBhcmcxIEZpcnN0IGFyZ3VtZW50IGZvciBwYXJhbWV0cmljIHJlcGxhY2VtZW50CisgICAgICogQHBhcmFtIGFyZzIgU2Vjb25kIGFyZ3VtZW50IGZvciBwYXJhbWV0cmljIHJlcGxhY2VtZW50CisgICAgICogQHBhcmFtIGFyZzMgVGhpcmQgYXJndW1lbnQgZm9yIHBhcmFtZXRyaWMgcmVwbGFjZW1lbnQKKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIGpzcEVycm9yKE1hcmsgd2hlcmUsIFN0cmluZyBlcnJDb2RlLCBTdHJpbmcgYXJnMSwgU3RyaW5nIGFyZzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFyZzMpCisgICAgICAgICAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgIGRpc3BhdGNoKHdoZXJlLCBlcnJDb2RlLCBuZXcgT2JqZWN0W10ge2FyZzEsIGFyZzIsIGFyZzN9LCBudWxsKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIERpc3BhdGNoZXMgdGhlIGdpdmVuIEpTUCBwYXJzZSBlcnJvciB0byB0aGUgY29uZmlndXJlZCBlcnJvciBoYW5kbGVyLgorICAgICAqCisgICAgICogVGhlIGdpdmVuIGVycm9yIGNvZGUgaXMgbG9jYWxpemVkLiBJZiBpdCBpcyBub3QgZm91bmQgaW4gdGhlCisgICAgICogcmVzb3VyY2UgYnVuZGxlIGZvciBsb2NhbGl6ZWQgZXJyb3IgbWVzc2FnZXMsIGl0IGlzIHVzZWQgYXMgdGhlIGVycm9yCisgICAgICogbWVzc2FnZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuIE5vZGUgdGhhdCBjYXVzZWQgdGhlIGVycm9yCisgICAgICogQHBhcmFtIGVyckNvZGUgRXJyb3IgY29kZQorICAgICAqIEBwYXJhbSBhcmcxIEZpcnN0IGFyZ3VtZW50IGZvciBwYXJhbWV0cmljIHJlcGxhY2VtZW50CisgICAgICogQHBhcmFtIGFyZzIgU2Vjb25kIGFyZ3VtZW50IGZvciBwYXJhbWV0cmljIHJlcGxhY2VtZW50CisgICAgICovCisKKyAgICBwdWJsaWMgdm9pZCBqc3BFcnJvcihOb2RlIG4sIFN0cmluZyBlcnJDb2RlLCBTdHJpbmcgYXJnMSwgU3RyaW5nIGFyZzIpCisJICAgICAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwlkaXNwYXRjaChuLmdldFN0YXJ0KCksIGVyckNvZGUsIG5ldyBPYmplY3RbXSB7YXJnMSwgYXJnMn0sIG51bGwpOworICAgIH0KKworICAgIC8qCisgICAgICogRGlzcGF0Y2hlcyB0aGUgZ2l2ZW4gSlNQIHBhcnNlIGVycm9yIHRvIHRoZSBjb25maWd1cmVkIGVycm9yIGhhbmRsZXIuCisgICAgICoKKyAgICAgKiBUaGUgZ2l2ZW4gZXJyb3IgY29kZSBpcyBsb2NhbGl6ZWQuIElmIGl0IGlzIG5vdCBmb3VuZCBpbiB0aGUKKyAgICAgKiByZXNvdXJjZSBidW5kbGUgZm9yIGxvY2FsaXplZCBlcnJvciBtZXNzYWdlcywgaXQgaXMgdXNlZCBhcyB0aGUgZXJyb3IKKyAgICAgKiBtZXNzYWdlLgorICAgICAqCisgICAgICogQHBhcmFtIG4gTm9kZSB0aGF0IGNhdXNlZCB0aGUgZXJyb3IKKyAgICAgKiBAcGFyYW0gZXJyQ29kZSBFcnJvciBjb2RlCisgICAgICogQHBhcmFtIGFyZzEgRmlyc3QgYXJndW1lbnQgZm9yIHBhcmFtZXRyaWMgcmVwbGFjZW1lbnQKKyAgICAgKiBAcGFyYW0gYXJnMiBTZWNvbmQgYXJndW1lbnQgZm9yIHBhcmFtZXRyaWMgcmVwbGFjZW1lbnQKKyAgICAgKiBAcGFyYW0gYXJnMyBUaGlyZCBhcmd1bWVudCBmb3IgcGFyYW1ldHJpYyByZXBsYWNlbWVudAorICAgICAqLworCisgICAgcHVibGljIHZvaWQganNwRXJyb3IoTm9kZSBuLCBTdHJpbmcgZXJyQ29kZSwgU3RyaW5nIGFyZzEsIFN0cmluZyBhcmcyLAorICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhcmczKQorCSAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJZGlzcGF0Y2gobi5nZXRTdGFydCgpLCBlcnJDb2RlLCBuZXcgT2JqZWN0W10ge2FyZzEsIGFyZzIsIGFyZzN9LCBudWxsKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIERpc3BhdGNoZXMgdGhlIGdpdmVuIHBhcnNpbmcgZXhjZXB0aW9uIHRvIHRoZSBjb25maWd1cmVkIGVycm9yIGhhbmRsZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZSBQYXJzaW5nIGV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGpzcEVycm9yKEV4Y2VwdGlvbiBlKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwlkaXNwYXRjaChudWxsLCBudWxsLCBudWxsLCBlKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIERpc3BhdGNoZXMgdGhlIGdpdmVuIEpTUCBwYXJzZSBlcnJvciB0byB0aGUgY29uZmlndXJlZCBlcnJvciBoYW5kbGVyLgorICAgICAqCisgICAgICogVGhlIGdpdmVuIGVycm9yIGNvZGUgaXMgbG9jYWxpemVkLiBJZiBpdCBpcyBub3QgZm91bmQgaW4gdGhlCisgICAgICogcmVzb3VyY2UgYnVuZGxlIGZvciBsb2NhbGl6ZWQgZXJyb3IgbWVzc2FnZXMsIGl0IGlzIHVzZWQgYXMgdGhlIGVycm9yCisgICAgICogbWVzc2FnZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlcnJDb2RlIEVycm9yIGNvZGUKKyAgICAgKiBAcGFyYW0gYXJnIEFyZ3VtZW50IGZvciBwYXJhbWV0cmljIHJlcGxhY2VtZW50CisgICAgICogQHBhcmFtIGUgUGFyc2luZyBleGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBqc3BFcnJvcihTdHJpbmcgZXJyQ29kZSwgU3RyaW5nIGFyZywgRXhjZXB0aW9uIGUpCisJICAgICAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwlkaXNwYXRjaChudWxsLCBlcnJDb2RlLCBuZXcgT2JqZWN0W10ge2FyZ30sIGUpOworICAgIH0KKworICAgIC8qCisgICAgICogRGlzcGF0Y2hlcyB0aGUgZ2l2ZW4gSlNQIHBhcnNlIGVycm9yIHRvIHRoZSBjb25maWd1cmVkIGVycm9yIGhhbmRsZXIuCisgICAgICoKKyAgICAgKiBUaGUgZ2l2ZW4gZXJyb3IgY29kZSBpcyBsb2NhbGl6ZWQuIElmIGl0IGlzIG5vdCBmb3VuZCBpbiB0aGUKKyAgICAgKiByZXNvdXJjZSBidW5kbGUgZm9yIGxvY2FsaXplZCBlcnJvciBtZXNzYWdlcywgaXQgaXMgdXNlZCBhcyB0aGUgZXJyb3IKKyAgICAgKiBtZXNzYWdlLgorICAgICAqCisgICAgICogQHBhcmFtIG4gTm9kZSB0aGF0IGNhdXNlZCB0aGUgZXJyb3IKKyAgICAgKiBAcGFyYW0gZXJyQ29kZSBFcnJvciBjb2RlCisgICAgICogQHBhcmFtIGFyZyBBcmd1bWVudCBmb3IgcGFyYW1ldHJpYyByZXBsYWNlbWVudAorICAgICAqIEBwYXJhbSBlIFBhcnNpbmcgZXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQganNwRXJyb3IoTm9kZSBuLCBTdHJpbmcgZXJyQ29kZSwgU3RyaW5nIGFyZywgRXhjZXB0aW9uIGUpCisJICAgICAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwlkaXNwYXRjaChuLmdldFN0YXJ0KCksIGVyckNvZGUsIG5ldyBPYmplY3RbXSB7YXJnfSwgZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2VzIHRoZSBnaXZlbiBlcnJvciBtZXNzYWdlIGludG8gYW4gYXJyYXkgb2YgamF2YWMgY29tcGlsYXRpb24gZXJyb3IKKyAgICAgKiBtZXNzYWdlcyAob25lIHBlciBqYXZhYyBjb21waWxhdGlvbiBlcnJvciBsaW5lIG51bWJlcikuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXJyTXNnIEVycm9yIG1lc3NhZ2UKKyAgICAgKiBAcGFyYW0gZm5hbWUgTmFtZSBvZiBKYXZhIHNvdXJjZSBmaWxlIHdob3NlIGNvbXBpbGF0aW9uIGZhaWxlZAorICAgICAqIEBwYXJhbSBwYWdlIE5vZGUgcmVwcmVzZW50YXRpb24gb2YgSlNQIHBhZ2UgZnJvbSB3aGljaCB0aGUgSmF2YSBzb3VyY2UKKyAgICAgKiBmaWxlIHdhcyBnZW5lcmF0ZWQKKyAgICAgKgorICAgICAqIEByZXR1cm4gQXJyYXkgb2YgamF2YWMgY29tcGlsYXRpb24gZXJyb3JzLCBvciBudWxsIGlmIHRoZSBnaXZlbiBlcnJvcgorICAgICAqIG1lc3NhZ2UgZG9lcyBub3QgY29udGFpbiBhbnkgY29tcGlsYXRpb24gZXJyb3IgbGluZSBudW1iZXJzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBKYXZhY0Vycm9yRGV0YWlsW10gcGFyc2VKYXZhY0Vycm9ycyhTdHJpbmcgZXJyTXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9kZS5Ob2RlcyBwYWdlKQorICAgICAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCisJcmV0dXJuIHBhcnNlSmF2YWNNZXNzYWdlKGVyck1zZywgZm5hbWUsIHBhZ2UpOworICAgIH0KKworICAgIC8qCisgICAgICogRGlzcGF0Y2hlcyB0aGUgZ2l2ZW4gamF2YWMgY29tcGlsYXRpb24gZXJyb3JzIHRvIHRoZSBjb25maWd1cmVkIGVycm9yCisgICAgICogaGFuZGxlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBqYXZhY0Vycm9ycyBBcnJheSBvZiBqYXZhYyBjb21waWxhdGlvbiBlcnJvcnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBqYXZhY0Vycm9yKEphdmFjRXJyb3JEZXRhaWxbXSBqYXZhY0Vycm9ycykKKyAgICAgICAgICAgIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCisgICAgICAgIGVyckhhbmRsZXIuamF2YWNFcnJvcihqYXZhY0Vycm9ycyk7CisgICAgfQorCisKKyAgICAvKgorICAgICAqIERpc3BhdGNoZXMgdGhlIGdpdmVuIGNvbXBpbGF0aW9uIGVycm9yIHJlcG9ydCBhbmQgZXhjZXB0aW9uIHRvIHRoZQorICAgICAqIGNvbmZpZ3VyZWQgZXJyb3IgaGFuZGxlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlcnJvclJlcG9ydCBDb21waWxhdGlvbiBlcnJvciByZXBvcnQKKyAgICAgKiBAcGFyYW0gZSBDb21waWxhdGlvbiBleGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBqYXZhY0Vycm9yKFN0cmluZyBlcnJvclJlcG9ydCwgRXhjZXB0aW9uIGUpCisgICAgICAgICAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisKKyAgICAgICAgZXJySGFuZGxlci5qYXZhY0Vycm9yKGVycm9yUmVwb3J0LCBlKTsKKyAgICB9CisKKworICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgLy8gUHJpdmF0ZSB1dGlsaXR5IG1ldGhvZHMKKworICAgIC8qCisgICAgICogRGlzcGF0Y2hlcyB0aGUgZ2l2ZW4gSlNQIHBhcnNlIGVycm9yIHRvIHRoZSBjb25maWd1cmVkIGVycm9yIGhhbmRsZXIuCisgICAgICoKKyAgICAgKiBUaGUgZ2l2ZW4gZXJyb3IgY29kZSBpcyBsb2NhbGl6ZWQuIElmIGl0IGlzIG5vdCBmb3VuZCBpbiB0aGUKKyAgICAgKiByZXNvdXJjZSBidW5kbGUgZm9yIGxvY2FsaXplZCBlcnJvciBtZXNzYWdlcywgaXQgaXMgdXNlZCBhcyB0aGUgZXJyb3IKKyAgICAgKiBtZXNzYWdlLgorICAgICAqCisgICAgICogQHBhcmFtIHdoZXJlIEVycm9yIGxvY2F0aW9uCisgICAgICogQHBhcmFtIGVyckNvZGUgRXJyb3IgY29kZQorICAgICAqIEBwYXJhbSBhcmdzIEFyZ3VtZW50cyBmb3IgcGFyYW1ldHJpYyByZXBsYWNlbWVudAorICAgICAqIEBwYXJhbSBlIFBhcnNpbmcgZXhjZXB0aW9uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGRpc3BhdGNoKE1hcmsgd2hlcmUsIFN0cmluZyBlcnJDb2RlLCBPYmplY3RbXSBhcmdzLAorCQkJICBFeGNlcHRpb24gZSkgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJU3RyaW5nIGZpbGUgPSBudWxsOworCVN0cmluZyBlcnJNc2cgPSBudWxsOworCWludCBsaW5lID0gLTE7CisJaW50IGNvbHVtbiA9IC0xOworCWJvb2xlYW4gaGFzTG9jYXRpb24gPSBmYWxzZTsKKworCS8vIExvY2FsaXplCisJaWYgKGVyckNvZGUgIT0gbnVsbCkgeworCSAgICBlcnJNc2cgPSBMb2NhbGl6ZXIuZ2V0TWVzc2FnZShlcnJDb2RlLCBhcmdzKTsKKwl9IGVsc2UgaWYgKGUgIT0gbnVsbCkgeworCSAgICAvLyBnaXZlIGEgaGludCBhYm91dCB3aGF0J3Mgd3JvbmcKKwkgICAgZXJyTXNnID0gZS5nZXRNZXNzYWdlKCk7CisJfQorCisJLy8gR2V0IGVycm9yIGxvY2F0aW9uCisJaWYgKHdoZXJlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChqc3BjTW9kZSkgeworICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgZnVsbCBVUkwgb2YgdGhlIHJlc291cmNlIHRoYXQgY2F1c2VkIHRoZSBlcnJvcgorICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGZpbGUgPSB3aGVyZS5nZXRVUkwoKS50b1N0cmluZygpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBtZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBGYWxsYmFjayB0byB1c2luZyBjb250ZXh0LXJlbGF0aXZlIHBhdGgKKyAgICAgICAgICAgICAgICAgICAgZmlsZSA9IHdoZXJlLmdldEZpbGUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgY29udGV4dC1yZWxhdGl2ZSByZXNvdXJjZSBwYXRoLCBzbyBhcyB0byBub3QKKyAgICAgICAgICAgICAgICAvLyBkaXNjbG9zZSBhbnkgbG9jYWwgZmlsZXN5c3RlbSBkZXRhaWxzCisgICAgICAgICAgICAgICAgZmlsZSA9IHdoZXJlLmdldEZpbGUoKTsKKyAgICAgICAgICAgIH0KKwkgICAgbGluZSA9IHdoZXJlLmdldExpbmVOdW1iZXIoKTsKKwkgICAgY29sdW1uID0gd2hlcmUuZ2V0Q29sdW1uTnVtYmVyKCk7CisJICAgIGhhc0xvY2F0aW9uID0gdHJ1ZTsKKwl9CisKKwkvLyBHZXQgbmVzdGVkIGV4Y2VwdGlvbgorCUV4Y2VwdGlvbiBuZXN0ZWRFeCA9IGU7CisJaWYgKChlIGluc3RhbmNlb2YgU0FYRXhjZXB0aW9uKQorCSAgICAgICAgJiYgKCgoU0FYRXhjZXB0aW9uKSBlKS5nZXRFeGNlcHRpb24oKSAhPSBudWxsKSkgeworCSAgICBuZXN0ZWRFeCA9ICgoU0FYRXhjZXB0aW9uKSBlKS5nZXRFeGNlcHRpb24oKTsKKwl9CisKKwlpZiAoaGFzTG9jYXRpb24pIHsKKwkgICAgZXJySGFuZGxlci5qc3BFcnJvcihmaWxlLCBsaW5lLCBjb2x1bW4sIGVyck1zZywgbmVzdGVkRXgpOworCX0gZWxzZSB7CisJICAgIGVyckhhbmRsZXIuanNwRXJyb3IoZXJyTXNnLCBuZXN0ZWRFeCk7CisJfQorICAgIH0KKworICAgIC8qCisgICAgICogUGFyc2VzIHRoZSBnaXZlbiBKYXZhIGNvbXBpbGF0aW9uIGVycm9yIG1lc3NhZ2UsIHdoaWNoIG1heSBjb250YWluIG9uZQorICAgICAqIG9yIG1vcmUgY29tcGlsYXRpb24gZXJyb3JzLCBpbnRvIGFuIGFycmF5IG9mIEphdmFjRXJyb3JEZXRhaWwgaW5zdGFuY2VzLgorICAgICAqCisgICAgICogRWFjaCBKYXZhY0Vycm9yRGV0YWlsIGluc3RhbmNlIGNvbnRhaW5zIHRoZSBpbmZvcm1hdGlvbiBhYm91dCBhIHNpbmdsZQorICAgICAqIGNvbXBpbGF0aW9uIGVycm9yLgorICAgICAqCisgICAgICogQHBhcmFtIGVyck1zZyBDb21waWxhdGlvbiBlcnJvciBtZXNzYWdlIHRoYXQgd2FzIGdlbmVyYXRlZCBieSB0aGUKKyAgICAgKiBqYXZhYyBjb21waWxlcgorICAgICAqIEBwYXJhbSBmbmFtZSBOYW1lIG9mIEphdmEgc291cmNlIGZpbGUgd2hvc2UgY29tcGlsYXRpb24gZmFpbGVkCisgICAgICogQHBhcmFtIHBhZ2UgTm9kZSByZXByZXNlbnRhdGlvbiBvZiBKU1AgcGFnZSBmcm9tIHdoaWNoIHRoZSBKYXZhIHNvdXJjZQorICAgICAqIGZpbGUgd2FzIGdlbmVyYXRlZAorICAgICAqCisgICAgICogQHJldHVybiBBcnJheSBvZiBKYXZhY0Vycm9yRGV0YWlsIGluc3RhbmNlcyBjb3JyZXNwb25kaW5nIHRvIHRoZQorICAgICAqIGNvbXBpbGF0aW9uIGVycm9ycworICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIEphdmFjRXJyb3JEZXRhaWxbXSBwYXJzZUphdmFjTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVyck1zZywgU3RyaW5nIGZuYW1lLCBOb2RlLk5vZGVzIHBhZ2UpCisJICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEphc3BlckV4Y2VwdGlvbiB7CisKKyAgICAgICAgVmVjdG9yIGVyclZlYyA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGVyck1zZ0J1ZiA9IG51bGw7CisgICAgICAgIGludCBsaW5lTnVtID0gLTE7CisgICAgICAgIEphdmFjRXJyb3JEZXRhaWwgamF2YWNFcnJvciA9IG51bGw7CisgICAgICAgIAorICAgICAgICBCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IFN0cmluZ1JlYWRlcihlcnJNc2cpKTsKKyAgICAgICAgCisgICAgICAgIC8qCisgICAgICAgICAqIFBhcnNlIGNvbXBpbGF0aW9uIGVycm9ycy4gRWFjaCBjb21waWxhdGlvbiBlcnJvciBjb25zaXN0cyBvZiBhIGZpbGUKKyAgICAgICAgICogcGF0aCBhbmQgZXJyb3IgbGluZSBudW1iZXIsIGZvbGxvd2VkIGJ5IGEgbnVtYmVyIG9mIGxpbmVzIGRlc2NyaWJpbmcKKyAgICAgICAgICogdGhlIGVycm9yLgorICAgICAgICAgKi8KKyAgICAgICAgU3RyaW5nIGxpbmUgPSBudWxsOworICAgICAgICB3aGlsZSAoKGxpbmUgPSByZWFkZXIucmVhZExpbmUoKSkgIT0gbnVsbCkgeworICAgICAgICAgICAgCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogRXJyb3IgbGluZSBudW1iZXIgaXMgZGVsaW1pdGVkIGJ5IHNldCBvZiBjb2xvbnMuCisgICAgICAgICAgICAgKiBJZ25vcmUgY29sb24gZm9sbG93aW5nIGRyaXZlIGxldHRlciBvbiBXaW5kb3dzIChmcm9tSW5kZXggPSAyKS4KKyAgICAgICAgICAgICAqIFhYWCBIYW5kbGUgZGVwcmVjYXRpb24gd2FybmluZ3MgdGhhdCBkb24ndCBoYXZlIGxpbmUgaW5mbworICAgICAgICAgICAgICovCisgICAgICAgICAgICBpbnQgYmVnaW5Db2xvbiA9IGxpbmUuaW5kZXhPZignOicsIDIpOyAKKyAgICAgICAgICAgIGludCBlbmRDb2xvbiA9IGxpbmUuaW5kZXhPZignOicsIGJlZ2luQ29sb24gKyAxKTsKKyAgICAgICAgICAgIGlmICgoYmVnaW5Db2xvbiA+PSAwKSAmJiAoZW5kQ29sb24gPj0gMCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoamF2YWNFcnJvciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGFkZCBwcmV2aW91cyBlcnJvciB0byBlcnJvciB2ZWN0b3IKKyAgICAgICAgICAgICAgICAgICAgZXJyVmVjLmFkZChqYXZhY0Vycm9yKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgU3RyaW5nIGxpbmVOdW1TdHIgPSBsaW5lLnN1YnN0cmluZyhiZWdpbkNvbG9uICsgMSwgZW5kQ29sb24pOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGxpbmVOdW0gPSBJbnRlZ2VyLnBhcnNlSW50KGxpbmVOdW1TdHIpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFhYWAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBlcnJNc2dCdWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgamF2YWNFcnJvciA9IGNyZWF0ZUphdmFjRXJyb3IoZm5hbWUsIHBhZ2UsIGVyck1zZ0J1ZiwgbGluZU51bSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIElnbm9yZSBtZXNzYWdlcyBwcmVjZWRpbmcgZmlyc3QgZXJyb3IKKyAgICAgICAgICAgIGlmIChlcnJNc2dCdWYgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGVyck1zZ0J1Zi5hcHBlbmQobGluZSk7CisgICAgICAgICAgICAgICAgZXJyTXNnQnVmLmFwcGVuZCgiXG4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gQWRkIGxhc3QgZXJyb3IgdG8gZXJyb3IgdmVjdG9yCisgICAgICAgIGlmIChqYXZhY0Vycm9yICE9IG51bGwpIHsKKyAgICAgICAgICAgIGVyclZlYy5hZGQoamF2YWNFcnJvcik7CisgICAgICAgIH0gCisgICAgICAgIAorICAgICAgICByZWFkZXIuY2xvc2UoKTsKKyAgICAgICAgCisgICAgICAgIEphdmFjRXJyb3JEZXRhaWxbXSBlcnJEZXRhaWxzID0gbnVsbDsKKyAgICAgICAgaWYgKGVyclZlYy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBlcnJEZXRhaWxzID0gbmV3IEphdmFjRXJyb3JEZXRhaWxbZXJyVmVjLnNpemUoKV07CisgICAgICAgICAgICBlcnJWZWMuY29weUludG8oZXJyRGV0YWlscyk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiBlcnJEZXRhaWxzOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQHBhcmFtIGZuYW1lCisgICAgICogQHBhcmFtIHBhZ2UKKyAgICAgKiBAcGFyYW0gZXJyTXNnQnVmCisgICAgICogQHBhcmFtIGxpbmVOdW0KKyAgICAgKiBAcmV0dXJuIEphdmFjRXJyb3JEZXRhaWwgVGhlIGVycm9yIGRldGFpbHMKKyAgICAgKiBAdGhyb3dzIEphc3BlckV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgSmF2YWNFcnJvckRldGFpbCBjcmVhdGVKYXZhY0Vycm9yKFN0cmluZyBmbmFtZSwgTm9kZS5Ob2RlcyBwYWdlLCAKKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBlcnJNc2dCdWYsIGludCBsaW5lTnVtKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgSmF2YWNFcnJvckRldGFpbCBqYXZhY0Vycm9yOworICAgICAgICAvLyBBdHRlbXB0IHRvIG1hcCBqYXZhYyBlcnJvciBsaW5lIG51bWJlciB0byBsaW5lIGluIEpTUCBwYWdlCisgICAgICAgIEVycm9yVmlzaXRvciBlcnJWaXNpdG9yID0gbmV3IEVycm9yVmlzaXRvcihsaW5lTnVtKTsKKyAgICAgICAgcGFnZS52aXNpdChlcnJWaXNpdG9yKTsKKyAgICAgICAgTm9kZSBlcnJOb2RlID0gZXJyVmlzaXRvci5nZXRKc3BTb3VyY2VOb2RlKCk7CisgICAgICAgIGlmICgoZXJyTm9kZSAhPSBudWxsKSAmJiAoZXJyTm9kZS5nZXRTdGFydCgpICE9IG51bGwpKSB7CisgICAgICAgICAgICBqYXZhY0Vycm9yID0gbmV3IEphdmFjRXJyb3JEZXRhaWwoCisgICAgICAgICAgICAgICAgICAgIGZuYW1lLAorICAgICAgICAgICAgICAgICAgICBsaW5lTnVtLAorICAgICAgICAgICAgICAgICAgICBlcnJOb2RlLmdldFN0YXJ0KCkuZ2V0RmlsZSgpLAorICAgICAgICAgICAgICAgICAgICBlcnJOb2RlLmdldFN0YXJ0KCkuZ2V0TGluZU51bWJlcigpLAorICAgICAgICAgICAgICAgICAgICBlcnJNc2dCdWYpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIGphdmFjIGVycm9yIGxpbmUgbnVtYmVyIGNhbm5vdCBiZSBtYXBwZWQgdG8gSlNQIHBhZ2UKKyAgICAgICAgICAgICAqIGxpbmUgbnVtYmVyLiBGb3IgZXhhbXBsZSwgdGhpcyBpcyB0aGUgY2FzZSBpZiBhIAorICAgICAgICAgICAgICogc2NyaXB0bGV0IGlzIG1pc3NpbmcgYSBjbG9zaW5nIGJyYWNlLCB3aGljaCBjYXVzZXMKKyAgICAgICAgICAgICAqIGhhdm9jIHdpdGggdGhlIHRyeS1jYXRjaC1maW5hbGx5IGJsb2NrIHRoYXQgdGhlIGNvZGUKKyAgICAgICAgICAgICAqIGdlbmVyYXRvciBwbGFjZXMgYXJvdW5kIGFsbCBnZW5lcmF0ZWQgY29kZTogQXMgYSByZXN1bHQKKyAgICAgICAgICAgICAqIG9mIHRoaXMsIHRoZSBqYXZhYyBlcnJvciBsaW5lIG51bWJlcnMgd2lsbCBiZSBvdXRzaWRlCisgICAgICAgICAgICAgKiB0aGUgcmFuZ2Ugb2YgYmVnaW4gYW5kIGVuZCBqYXZhIGxpbmUgbnVtYmVycyB0aGF0IHdlcmUKKyAgICAgICAgICAgICAqIGdlbmVyYXRlZCBmb3IgdGhlIHNjcmlwdGxldCwgYW5kIHRoZXJlZm9yZSBjYW5ub3QgYmUKKyAgICAgICAgICAgICAqIG1hcHBlZCB0byB0aGUgc3RhcnQgbGluZSBudW1iZXIgb2YgdGhlIHNjcmlwdGxldCBpbiB0aGUKKyAgICAgICAgICAgICAqIEpTUCBwYWdlLgorICAgICAgICAgICAgICogSW5jbHVkZSBqdXN0IHRoZSBqYXZhYyBlcnJvciBpbmZvIGluIHRoZSBlcnJvciBkZXRhaWwuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGphdmFjRXJyb3IgPSBuZXcgSmF2YWNFcnJvckRldGFpbCgKKyAgICAgICAgICAgICAgICAgICAgZm5hbWUsCisgICAgICAgICAgICAgICAgICAgIGxpbmVOdW0sCisgICAgICAgICAgICAgICAgICAgIGVyck1zZ0J1Zik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGphdmFjRXJyb3I7CisgICAgfQorCisKKyAgICAvKgorICAgICAqIFZpc2l0b3IgcmVzcG9uc2libGUgZm9yIG1hcHBpbmcgYSBsaW5lIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNlcnZsZXQKKyAgICAgKiBzb3VyY2UgY29kZSB0byB0aGUgY29ycmVzcG9uZGluZyBKU1Agbm9kZS4KKyAgICAgKi8KKyAgICBzdGF0aWMgY2xhc3MgRXJyb3JWaXNpdG9yIGV4dGVuZHMgTm9kZS5WaXNpdG9yIHsKKworCS8vIEphdmEgc291cmNlIGxpbmUgbnVtYmVyIHRvIGJlIG1hcHBlZAorCXByaXZhdGUgaW50IGxpbmVOdW07CisKKwkvKgorCSAqIEpTUCBub2RlIHdob3NlIEphdmEgc291cmNlIGNvZGUgcmFuZ2UgaW4gdGhlIGdlbmVyYXRlZCBzZXJ2bGV0CisJICogY29udGFpbnMgdGhlIEphdmEgc291cmNlIGxpbmUgbnVtYmVyIHRvIGJlIG1hcHBlZAorCSAqLworCU5vZGUgZm91bmQ7CisKKwkvKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIGxpbmVOdW0gU291cmNlIGxpbmUgbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc2VydmxldCBjb2RlCisJICovCisJcHVibGljIEVycm9yVmlzaXRvcihpbnQgbGluZU51bSkgeworCSAgICB0aGlzLmxpbmVOdW0gPSBsaW5lTnVtOworCX0KKworCXB1YmxpYyB2b2lkIGRvVmlzaXQoTm9kZSBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwkgICAgaWYgKChsaW5lTnVtID49IG4uZ2V0QmVnaW5KYXZhTGluZSgpKQorCQkgICAgJiYgKGxpbmVOdW0gPCBuLmdldEVuZEphdmFMaW5lKCkpKSB7CisJCWZvdW5kID0gbjsKKwkgICAgfQorICAgICAgICB9CisKKwkvKgorCSAqIEdldHMgdGhlIEpTUCBub2RlIHRvIHdoaWNoIHRoZSBzb3VyY2UgbGluZSBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZAorCSAqIHNlcnZsZXQgY29kZSB3YXMgbWFwcGVkLgorCSAqCisJICogQHJldHVybiBKU1Agbm9kZSB0byB3aGljaCB0aGUgc291cmNlIGxpbmUgbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQKKwkgKiBzZXJ2bGV0IGNvZGUgd2FzIG1hcHBlZAorCSAqLworCXB1YmxpYyBOb2RlIGdldEpzcFNvdXJjZU5vZGUoKSB7CisJICAgIHJldHVybiBmb3VuZDsKKwl9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL2NvbXBpbGVyL0Vycm9ySGFuZGxlci5qYXZhIGIvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL2NvbXBpbGVyL0Vycm9ySGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMmQ0NDIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvRXJyb3JIYW5kbGVyLmphdmEKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFzcGVyLmNvbXBpbGVyOworCitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIuSmFzcGVyRXhjZXB0aW9uOworCisvKioKKyAqIEludGVyZmFjZSBmb3IgaGFuZGxpbmcgSlNQIHBhcnNlIGFuZCBqYXZhYyBjb21waWxhdGlvbiBlcnJvcnMuCisgKiAKKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgaW50ZXJmYWNlIG1heSBiZSByZWdpc3RlcmVkIHdpdGggdGhlCisgKiBFcnJvckRpc3BhdGNoZXIgYnkgc2V0dGluZyB0aGUgWFhYIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlciBpbiB0aGUgSlNQCisgKiBwYWdlIGNvbXBpbGVyIGFuZCBleGVjdXRpb24gc2VydmxldCBpbiBDYXRhbGluYSdzIHdlYi54bWwgZmlsZSB0byB0aGUKKyAqIGltcGxlbWVudGF0aW9uJ3MgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUuCisgKgorICogQGF1dGhvciBKYW4gTHVlaGUKKyAqIEBhdXRob3IgS2luLW1hbiBDaHVuZworICovCitwdWJsaWMgaW50ZXJmYWNlIEVycm9ySGFuZGxlciB7CisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzZXMgdGhlIGdpdmVuIEpTUCBwYXJzZSBlcnJvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmbmFtZSBOYW1lIG9mIHRoZSBKU1AgZmlsZSBpbiB3aGljaCB0aGUgcGFyc2UgZXJyb3Igb2NjdXJyZWQKKyAgICAgKiBAcGFyYW0gbGluZSBQYXJzZSBlcnJvciBsaW5lIG51bWJlcgorICAgICAqIEBwYXJhbSBjb2x1bW4gUGFyc2UgZXJyb3IgY29sdW1uIG51bWJlcgorICAgICAqIEBwYXJhbSBtc2cgUGFyc2UgZXJyb3IgbWVzc2FnZQorICAgICAqIEBwYXJhbSBleGNlcHRpb24gUGFyc2UgZXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQganNwRXJyb3IoU3RyaW5nIGZuYW1lLCBpbnQgbGluZSwgaW50IGNvbHVtbiwgU3RyaW5nIG1zZywKKwkJCSBFeGNlcHRpb24gZXhjZXB0aW9uKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogUHJvY2Vzc2VzIHRoZSBnaXZlbiBKU1AgcGFyc2UgZXJyb3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbXNnIFBhcnNlIGVycm9yIG1lc3NhZ2UKKyAgICAgKiBAcGFyYW0gZXhjZXB0aW9uIFBhcnNlIGV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGpzcEVycm9yKFN0cmluZyBtc2csIEV4Y2VwdGlvbiBleGNlcHRpb24pCisJdGhyb3dzIEphc3BlckV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFByb2Nlc3NlcyB0aGUgZ2l2ZW4gamF2YWMgY29tcGlsYXRpb24gZXJyb3JzLgorICAgICAqCisgICAgICogQHBhcmFtIGRldGFpbHMgQXJyYXkgb2YgSmF2YWNFcnJvckRldGFpbCBpbnN0YW5jZXMgY29ycmVzcG9uZGluZyB0byB0aGUKKyAgICAgKiBjb21waWxhdGlvbiBlcnJvcnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBqYXZhY0Vycm9yKEphdmFjRXJyb3JEZXRhaWxbXSBkZXRhaWxzKQorCXRocm93cyBKYXNwZXJFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzZXMgdGhlIGdpdmVuIGphdmFjIGVycm9yIHJlcG9ydCBhbmQgZXhjZXB0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGVycm9yUmVwb3J0IENvbXBpbGF0aW9uIGVycm9yIHJlcG9ydAorICAgICAqIEBwYXJhbSBleGNlcHRpb24gQ29tcGlsYXRpb24gZXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgamF2YWNFcnJvcihTdHJpbmcgZXJyb3JSZXBvcnQsIEV4Y2VwdGlvbiBleGNlcHRpb24pCisgICAgICAgIHRocm93cyBKYXNwZXJFeGNlcHRpb247Cit9CmRpZmYgLS1naXQgYS9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvR2VuZXJhdG9yLmphdmEgYi9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvR2VuZXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTEwZDVmZQotLS0gL2Rldi9udWxsCisrKyBiL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9HZW5lcmF0b3IuamF2YQpAQCAtMCwwICsxLDQwMDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphc3Blci5jb21waWxlcjsKKworaW1wb3J0IGphdmEuYmVhbnMuQmVhbkluZm87CitpbXBvcnQgamF2YS5iZWFucy5JbnRyb3NwZWN0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmEuYmVhbnMuSW50cm9zcGVjdG9yOworaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlEZXNjcmlwdG9yOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCitpbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZ0F0dHJpYnV0ZUluZm87CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZ0luZm87CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZ1ZhcmlhYmxlSW5mbzsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVmFyaWFibGVJbmZvOworCitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLkphc3BlckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5Kc3BDb21waWxhdGlvbkNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIucnVudGltZS5Kc3BSdW50aW1lTGlicmFyeTsKK2ltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOworCisvKioKKyAqIEdlbmVyYXRlIEphdmEgc291cmNlIGZyb20gTm9kZXMKKyAqCisgKiBAYXV0aG9yIEFuaWwgSy4gVmlqZW5kcmFuCisgKiBAYXV0aG9yIERhbm5vIEZlcnJpbgorICogQGF1dGhvciBNYW5kYXIgUmFqZQorICogQGF1dGhvciBSYWppdiBNb3JkYW5pCisgKiBAYXV0aG9yIFBpZXJyZSBEZWxpc2xlCisgKgorICogVG9tY2F0IDQuMS54IGFuZCBUb21jYXQgNToKKyAqIEBhdXRob3IgS2luLW1hbiBDaHVuZworICogQGF1dGhvciBKYW4gTHVlaGUKKyAqIEBhdXRob3IgU2hhd24gQmF5ZXJuCisgKiBAYXV0aG9yIE1hcmsgUm90aAorICogQGF1dGhvciBEZW5pcyBCZW5vaXQKKyAqLworCitjbGFzcyBHZW5lcmF0b3IgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3NbXSBPQkpFQ1RfQ0xBU1MgPSB7IE9iamVjdC5jbGFzcyB9OworICAgIHByaXZhdGUgU2VydmxldFdyaXRlciBvdXQ7CisgICAgcHJpdmF0ZSBBcnJheUxpc3QgbWV0aG9kc0J1ZmZlcmVkOworICAgIHByaXZhdGUgRnJhZ21lbnRIZWxwZXJDbGFzcyBmcmFnbWVudEhlbHBlckNsYXNzOworICAgIHByaXZhdGUgRXJyb3JEaXNwYXRjaGVyIGVycjsKKyAgICBwcml2YXRlIEJlYW5SZXBvc2l0b3J5IGJlYW5JbmZvOworICAgIHByaXZhdGUgSnNwQ29tcGlsYXRpb25Db250ZXh0IGN0eHQ7CisgICAgcHJpdmF0ZSBib29sZWFuIGlzUG9vbGluZ0VuYWJsZWQ7CisgICAgcHJpdmF0ZSBib29sZWFuIGJyZWFrQXRMRjsKKyAgICBwcml2YXRlIFBhZ2VJbmZvIHBhZ2VJbmZvOworICAgIHByaXZhdGUgVmVjdG9yIHRhZ0hhbmRsZXJQb29sTmFtZXM7CisgICAgcHJpdmF0ZSBHZW5CdWZmZXIgY2hhckFycmF5QnVmZmVyOworCisgICAgLyoqCisgICAgICogQHBhcmFtIHMgdGhlIGlucHV0IHN0cmluZworICAgICAqIEByZXR1cm4gcXVvdGVkIGFuZCBlc2NhcGVkIHN0cmluZywgcGVyIEphdmEgcnVsZQorICAgICAqLworICAgIHN0YXRpYyBTdHJpbmcgcXVvdGUoU3RyaW5nIHMpIHsKKworICAgICAgICBpZiAocyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuICJudWxsIjsKKworICAgICAgICByZXR1cm4gJyInICsgZXNjYXBlKHMpICsgJyInOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBzIHRoZSBpbnB1dCBzdHJpbmcKKyAgICAgKiBAcmV0dXJuIGVzY2FwZWQgc3RyaW5nLCBwZXIgSmF2YSBydWxlCisgICAgICovCisgICAgc3RhdGljIFN0cmluZyBlc2NhcGUoU3RyaW5nIHMpIHsKKworICAgICAgICBpZiAocyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuICIiOworCisgICAgICAgIFN0cmluZ0J1ZmZlciBiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHMubGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgY2hhciBjID0gcy5jaGFyQXQoaSk7CisgICAgICAgICAgICBpZiAoYyA9PSAnIicpCisgICAgICAgICAgICAgICAgYi5hcHBlbmQoJ1xcJykuYXBwZW5kKCciJyk7CisgICAgICAgICAgICBlbHNlIGlmIChjID09ICdcXCcpCisgICAgICAgICAgICAgICAgYi5hcHBlbmQoJ1xcJykuYXBwZW5kKCdcXCcpOworICAgICAgICAgICAgZWxzZSBpZiAoYyA9PSAnXG4nKQorICAgICAgICAgICAgICAgIGIuYXBwZW5kKCdcXCcpLmFwcGVuZCgnbicpOworICAgICAgICAgICAgZWxzZSBpZiAoYyA9PSAnXHInKQorICAgICAgICAgICAgICAgIGIuYXBwZW5kKCdcXCcpLmFwcGVuZCgncicpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGIuYXBwZW5kKGMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBiLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2luZ2xlIHF1b3RlIGFuZCBlc2NhcGUgYSBjaGFyYWN0ZXIKKyAgICAgKi8KKyAgICBzdGF0aWMgU3RyaW5nIHF1b3RlKGNoYXIgYykgeworCisgICAgICAgIFN0cmluZ0J1ZmZlciBiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBiLmFwcGVuZCgnXCcnKTsKKyAgICAgICAgaWYgKGMgPT0gJ1wnJykKKyAgICAgICAgICAgIGIuYXBwZW5kKCdcXCcpLmFwcGVuZCgnXCcnKTsKKyAgICAgICAgZWxzZSBpZiAoYyA9PSAnXFwnKQorICAgICAgICAgICAgYi5hcHBlbmQoJ1xcJykuYXBwZW5kKCdcXCcpOworICAgICAgICBlbHNlIGlmIChjID09ICdcbicpCisgICAgICAgICAgICBiLmFwcGVuZCgnXFwnKS5hcHBlbmQoJ24nKTsKKyAgICAgICAgZWxzZSBpZiAoYyA9PSAnXHInKQorICAgICAgICAgICAgYi5hcHBlbmQoJ1xcJykuYXBwZW5kKCdyJyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGIuYXBwZW5kKGMpOworICAgICAgICBiLmFwcGVuZCgnXCcnKTsKKyAgICAgICAgcmV0dXJuIGIudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZXMgZGVjbGFyYXRpb25zLiAgVGhpcyBpbmNsdWRlcyAiaW5mbyIgb2YgdGhlIHBhZ2UgZGlyZWN0aXZlLAorICAgICAqIGFuZCBzY3JpcHRsZXQgZGVjbGFyYXRpb25zLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBnZW5lcmF0ZURlY2xhcmF0aW9ucyhOb2RlLk5vZGVzIHBhZ2UpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCisgICAgICAgIGNsYXNzIERlY2xhcmF0aW9uVmlzaXRvciBleHRlbmRzIE5vZGUuVmlzaXRvciB7CisKKyAgICAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBnZXRTZXJ2bGV0SW5mb0dlbmVyYXRlZCA9IGZhbHNlOworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogR2VuZXJhdGVzIGdldFNlcnZsZXRJbmZvKCkgbWV0aG9kIHRoYXQgcmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlCisgICAgICAgICAgICAgKiBwYWdlIGRpcmVjdGl2ZSdzICdpbmZvJyBhdHRyaWJ1dGUsIGlmIHByZXNlbnQuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogVGhlIFZhbGlkYXRvciBoYXMgYWxyZWFkeSBlbnN1cmVkIHRoYXQgaWYgdGhlIHRyYW5zbGF0aW9uIHVuaXQKKyAgICAgICAgICAgICAqIGNvbnRhaW5zIG1vcmUgdGhhbiBvbmUgcGFnZSBkaXJlY3RpdmUgd2l0aCBhbiAnaW5mbycgYXR0cmlidXRlLAorICAgICAgICAgICAgICogdGhlaXIgdmFsdWVzIG1hdGNoLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLlBhZ2VEaXJlY3RpdmUgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisKKyAgICAgICAgICAgICAgICBpZiAoZ2V0U2VydmxldEluZm9HZW5lcmF0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIFN0cmluZyBpbmZvID0gbi5nZXRBdHRyaWJ1dGVWYWx1ZSgiaW5mbyIpOworICAgICAgICAgICAgICAgIGlmIChpbmZvID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgICAgIGdldFNlcnZsZXRJbmZvR2VuZXJhdGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRpbCgicHVibGljIFN0cmluZyBnZXRTZXJ2bGV0SW5mbygpIHsiKTsKKyAgICAgICAgICAgICAgICBvdXQucHVzaEluZGVudCgpOworICAgICAgICAgICAgICAgIG91dC5wcmludGluKCJyZXR1cm4gIik7CisgICAgICAgICAgICAgICAgb3V0LnByaW50KHF1b3RlKGluZm8pKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiOyIpOworICAgICAgICAgICAgICAgIG91dC5wb3BJbmRlbnQoKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRpbCgifSIpOworICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuRGVjbGFyYXRpb24gbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgbi5zZXRCZWdpbkphdmFMaW5lKG91dC5nZXRKYXZhTGluZSgpKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRNdWx0aUxuKG5ldyBTdHJpbmcobi5nZXRUZXh0KCkpKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigpOworICAgICAgICAgICAgICAgIG4uc2V0RW5kSmF2YUxpbmUob3V0LmdldEphdmFMaW5lKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBDdXN0b20gVGFncyBtYXkgY29udGFpbiBkZWNsYXJhdGlvbnMgZnJvbSB0YWcgcGx1Z2lucy4KKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuQ3VzdG9tVGFnIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgICAgIGlmIChuLnVzZVRhZ1BsdWdpbigpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChuLmdldEF0U1RhZygpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG4uZ2V0QXRTVGFnKCkudmlzaXQodGhpcyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdmlzaXRCb2R5KG4pOworICAgICAgICAgICAgICAgICAgICBpZiAobi5nZXRBdEVUYWcoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuLmdldEF0RVRhZygpLnZpc2l0KHRoaXMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdmlzaXRCb2R5KG4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG91dC5wcmludGxuKCk7CisgICAgICAgIHBhZ2UudmlzaXQobmV3IERlY2xhcmF0aW9uVmlzaXRvcigpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21waWxlcyBsaXN0IG9mIHRhZyBoYW5kbGVyIHBvb2wgbmFtZXMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGNvbXBpbGVUYWdIYW5kbGVyUG9vbExpc3QoTm9kZS5Ob2RlcyBwYWdlKQorICAgICAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKworICAgICAgICBjbGFzcyBUYWdIYW5kbGVyUG9vbFZpc2l0b3IgZXh0ZW5kcyBOb2RlLlZpc2l0b3IgeworCisgICAgICAgICAgICBwcml2YXRlIFZlY3RvciBuYW1lczsKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIENvbnN0cnVjdG9yCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogQHBhcmFtIHYgVmVjdG9yIG9mIHRhZyBoYW5kbGVyIHBvb2wgbmFtZXMgdG8gcG9wdWxhdGUKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgVGFnSGFuZGxlclBvb2xWaXNpdG9yKFZlY3RvciB2KSB7CisgICAgICAgICAgICAgICAgbmFtZXMgPSB2OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogR2V0cyB0aGUgbmFtZSBvZiB0aGUgdGFnIGhhbmRsZXIgcG9vbCBmb3IgdGhlIGdpdmVuIGN1c3RvbSB0YWcKKyAgICAgICAgICAgICAqIGFuZCBhZGRzIGl0IHRvIHRoZSBsaXN0IG9mIHRhZyBoYW5kbGVyIHBvb2wgbmFtZXMgdW5sZXNzIGl0IGlzCisgICAgICAgICAgICAgKiBhbHJlYWR5IGNvbnRhaW5lZCBpbiBpdC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5DdXN0b21UYWcgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisKKyAgICAgICAgICAgICAgICBpZiAoIW4uaW1wbGVtZW50c1NpbXBsZVRhZygpKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZVRhZ0hhbmRsZXJQb29sTmFtZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLmdldFByZWZpeCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4uZ2V0TG9jYWxOYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5nZXRBdHRyaWJ1dGVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5oYXNFbXB0eUJvZHkoKSk7CisgICAgICAgICAgICAgICAgICAgIG4uc2V0VGFnSGFuZGxlclBvb2xOYW1lKG5hbWUpOworICAgICAgICAgICAgICAgICAgICBpZiAoIW5hbWVzLmNvbnRhaW5zKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lcy5hZGQobmFtZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdmlzaXRCb2R5KG4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQ3JlYXRlcyB0aGUgbmFtZSBvZiB0aGUgdGFnIGhhbmRsZXIgcG9vbCB3aG9zZSB0YWcgaGFuZGxlcnMgbWF5CisgICAgICAgICAgICAgKiBiZSAocmUpdXNlZCB0byBzZXJ2aWNlIHRoaXMgYWN0aW9uLgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIEByZXR1cm4gVGhlIG5hbWUgb2YgdGhlIHRhZyBoYW5kbGVyIHBvb2wKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcHJpdmF0ZSBTdHJpbmcgY3JlYXRlVGFnSGFuZGxlclBvb2xOYW1lKAorICAgICAgICAgICAgICAgIFN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgU3RyaW5nIHNob3J0TmFtZSwKKyAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzIGF0dHJzLAorICAgICAgICAgICAgICAgIGJvb2xlYW4gaGFzRW1wdHlCb2R5KSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHBvb2xOYW1lID0gbnVsbDsKKworICAgICAgICAgICAgICAgIHBvb2xOYW1lID0gIl9qc3B4X3RhZ1Bvb2xfIiArIHByZWZpeCArICJfIiArIHNob3J0TmFtZTsKKyAgICAgICAgICAgICAgICBpZiAoYXR0cnMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBhdHRyTmFtZXMgPSBuZXcgU3RyaW5nW2F0dHJzLmdldExlbmd0aCgpXTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyTmFtZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJOYW1lc1tpXSA9IGF0dHJzLmdldFFOYW1lKGkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIEFycmF5cy5zb3J0KGF0dHJOYW1lcywgQ29sbGVjdGlvbnMucmV2ZXJzZU9yZGVyKCkpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHJOYW1lcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgcG9vbE5hbWUgPSBwb29sTmFtZSArICJfIiArIGF0dHJOYW1lc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaGFzRW1wdHlCb2R5KSB7CisgICAgICAgICAgICAgICAgICAgIHBvb2xOYW1lID0gcG9vbE5hbWUgKyAiX25vYm9keSI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBKc3BVdGlsLm1ha2VYbWxKYXZhSWRlbnRpZmllcihwb29sTmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwYWdlLnZpc2l0KG5ldyBUYWdIYW5kbGVyUG9vbFZpc2l0b3IodGFnSGFuZGxlclBvb2xOYW1lcykpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkZWNsYXJlVGVtcG9yYXJ5U2NyaXB0aW5nVmFycyhOb2RlLk5vZGVzIHBhZ2UpCisgICAgICAgIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCisgICAgICAgIGNsYXNzIFNjcmlwdGluZ1ZhclZpc2l0b3IgZXh0ZW5kcyBOb2RlLlZpc2l0b3IgeworCisgICAgICAgICAgICBwcml2YXRlIFZlY3RvciB2YXJzOworCisgICAgICAgICAgICBTY3JpcHRpbmdWYXJWaXNpdG9yKCkgeworICAgICAgICAgICAgICAgIHZhcnMgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuQ3VzdG9tVGFnIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCisgICAgICAgICAgICAgICAgaWYgKG4uZ2V0Q3VzdG9tTmVzdGluZ0xldmVsKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIFRhZ1ZhcmlhYmxlSW5mb1tdIHRhZ1ZhckluZm9zID0gbi5nZXRUYWdWYXJpYWJsZUluZm9zKCk7CisgICAgICAgICAgICAgICAgICAgIFZhcmlhYmxlSW5mb1tdIHZhckluZm9zID0gbi5nZXRWYXJpYWJsZUluZm9zKCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhckluZm9zLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFySW5mb3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFyTmFtZSA9IHZhckluZm9zW2ldLmdldFZhck5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdG1wVmFyTmFtZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfanNweF8iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHZhck5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIl8iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG4uZ2V0Q3VzdG9tTmVzdGluZ0xldmVsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2YXJzLmNvbnRhaW5zKHRtcFZhck5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcnMuYWRkKHRtcFZhck5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRpbih2YXJJbmZvc1tpXS5nZXRDbGFzc05hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCgiICIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQodG1wVmFyTmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCgiID0gIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludChudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIjsiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRhZ1ZhckluZm9zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZhck5hbWUgPSB0YWdWYXJJbmZvc1tpXS5nZXROYW1lR2l2ZW4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFyTmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhck5hbWUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5nZXRUYWdEYXRhKCkuZ2V0QXR0cmlidXRlU3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1ZhckluZm9zW2ldLmdldE5hbWVGcm9tQXR0cmlidXRlKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1ZhckluZm9zW2ldLmdldE5hbWVGcm9tQXR0cmlidXRlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxpYXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0bXBWYXJOYW1lID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9qc3B4XyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdmFyTmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbi5nZXRDdXN0b21OZXN0aW5nTGV2ZWwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXZhcnMuY29udGFpbnModG1wVmFyTmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFycy5hZGQodG1wVmFyTmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGluKHRhZ1ZhckluZm9zW2ldLmdldENsYXNzTmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KCIgIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCh0bXBWYXJOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KCIgPSAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KG51bGwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiOyIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZpc2l0Qm9keShuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHBhZ2UudmlzaXQobmV3IFNjcmlwdGluZ1ZhclZpc2l0b3IoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2VuZXJhdGVzIHRoZSBfanNwSW5pdCgpIG1ldGhvZCBmb3IgaW5zdGFudGlhdGluZyB0aGUgdGFnIGhhbmRsZXIgcG9vbHMuCisgICAgICogRm9yIHRhZyBmaWxlLCBfanNwSW5pdCBoYXMgdG8gYmUgaW52b2tlZCBtYW51YWxseSwgYW5kIHRoZSBTZXJ2bGV0Q29uZmlnCisgICAgICogb2JqZWN0IGV4cGxpY2l0bHkgcGFzc2VkLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBnZW5lcmF0ZUluaXQoKSB7CisKKyAgICAgICAgaWYgKGN0eHQuaXNUYWdGaWxlKCkpIHsKKyAgICAgICAgICAgIG91dC5wcmludGlsKCJwcml2YXRlIHZvaWQgX2pzcEluaXQoU2VydmxldENvbmZpZyBjb25maWcpIHsiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG91dC5wcmludGlsKCJwdWJsaWMgdm9pZCBfanNwSW5pdCgpIHsiKTsKKyAgICAgICAgfQorCisgICAgICAgIG91dC5wdXNoSW5kZW50KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGFnSGFuZGxlclBvb2xOYW1lcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgb3V0LnByaW50aW4oKFN0cmluZyl0YWdIYW5kbGVyUG9vbE5hbWVzLmVsZW1lbnRBdChpKSk7CisgICAgICAgICAgICBvdXQucHJpbnQoCisgICAgICAgICAgICAgICAgIiA9IG9yZy5hcGFjaGUuamFzcGVyLnJ1bnRpbWUuVGFnSGFuZGxlclBvb2wuZ2V0VGFnSGFuZGxlclBvb2woIik7CisgICAgICAgICAgICBpZiAoY3R4dC5pc1RhZ0ZpbGUoKSkgeworICAgICAgICAgICAgICAgIG91dC5wcmludCgiY29uZmlnIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG91dC5wcmludCgiZ2V0U2VydmxldENvbmZpZygpIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXQucHJpbnRsbigiKTsiKTsKKyAgICAgICAgfQorICAgICAgICBvdXQucG9wSW5kZW50KCk7CisgICAgICAgIG91dC5wcmludGlsKCJ9Iik7CisgICAgICAgIG91dC5wcmludGxuKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2VuZXJhdGVzIHRoZSBfanNwRGVzdHJveSgpIG1ldGhvZCB3aGljaCBpcyByZXNwb25zaWJsZSBmb3IgY2FsbGluZyB0aGUKKyAgICAgKiByZWxlYXNlKCkgbWV0aG9kIG9uIGV2ZXJ5IHRhZyBoYW5kbGVyIGluIGFueSBvZiB0aGUgdGFnIGhhbmRsZXIgcG9vbHMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGdlbmVyYXRlRGVzdHJveSgpIHsKKworICAgICAgICBvdXQucHJpbnRpbCgicHVibGljIHZvaWQgX2pzcERlc3Ryb3koKSB7Iik7CisgICAgICAgIG91dC5wdXNoSW5kZW50KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGFnSGFuZGxlclBvb2xOYW1lcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgb3V0LnByaW50aW4oKFN0cmluZyl0YWdIYW5kbGVyUG9vbE5hbWVzLmVsZW1lbnRBdChpKSk7CisgICAgICAgICAgICBvdXQucHJpbnRsbigiLnJlbGVhc2UoKTsiKTsKKyAgICAgICAgfQorICAgICAgICBvdXQucG9wSW5kZW50KCk7CisgICAgICAgIG91dC5wcmludGlsKCJ9Iik7CisgICAgICAgIG91dC5wcmludGxuKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2VuZXJhdGUgcHJlYW1ibGUgcGFja2FnZSBuYW1lCisgICAgICogKHNoYXJlZCBieSBzZXJ2bGV0IGFuZCB0YWcgaGFuZGxlciBwcmVhbWJsZSBnZW5lcmF0aW9uKQorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBnZW5QcmVhbWJsZVBhY2thZ2UoU3RyaW5nIHBhY2thZ2VOYW1lKQorICAgICAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCEiIi5lcXVhbHMocGFja2FnZU5hbWUpICYmIHBhY2thZ2VOYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgIG91dC5wcmludGlsKCJwYWNrYWdlICIgKyBwYWNrYWdlTmFtZSArICI7Iik7CisgICAgICAgICAgICBvdXQucHJpbnRsbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2VuZXJhdGUgcHJlYW1ibGUgaW1wb3J0cworICAgICAqIChzaGFyZWQgYnkgc2VydmxldCBhbmQgdGFnIGhhbmRsZXIgcHJlYW1ibGUgZ2VuZXJhdGlvbikKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZ2VuUHJlYW1ibGVJbXBvcnRzKCkgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBwYWdlSW5mby5nZXRJbXBvcnRzKCkuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBvdXQucHJpbnRpbigiaW1wb3J0ICIpOworICAgICAgICAgICAgb3V0LnByaW50KChTdHJpbmcpaXRlci5uZXh0KCkpOworICAgICAgICAgICAgb3V0LnByaW50bG4oIjsiKTsKKyAgICAgICAgfQorICAgICAgICBvdXQucHJpbnRsbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRpb24gb2Ygc3RhdGljIGluaXRpYWxpemVycyBpbiBwcmVhbWJsZS4KKyAgICAgKiBGb3IgZXhhbXBsZSwgZGVwZW5kYW50IGxpc3QsIGVsIGZ1bmN0aW9uIG1hcCwgcHJlZml4IG1hcC4KKyAgICAgKiAoc2hhcmVkIGJ5IHNlcnZsZXQgYW5kIHRhZyBoYW5kbGVyIHByZWFtYmxlIGdlbmVyYXRpb24pCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGdlblByZWFtYmxlU3RhdGljSW5pdGlhbGl6ZXJzKCkgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgIC8vIFN0YXRpYyBkYXRhIGZvciBnZXREZXBlbmRhbnRzKCkKKyAgICAgICAgb3V0LnByaW50aWwoInByaXZhdGUgc3RhdGljIGphdmEudXRpbC5WZWN0b3IgX2pzcHhfZGVwZW5kYW50czsiKTsKKyAgICAgICAgb3V0LnByaW50bG4oKTsKKyAgICAgICAgTGlzdCBkZXBlbmRhbnRzID0gcGFnZUluZm8uZ2V0RGVwZW5kYW50cygpOworICAgICAgICBJdGVyYXRvciBpdGVyID0gZGVwZW5kYW50cy5pdGVyYXRvcigpOworICAgICAgICBpZiAoIWRlcGVuZGFudHMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBvdXQucHJpbnRpbCgic3RhdGljIHsiKTsKKyAgICAgICAgICAgIG91dC5wdXNoSW5kZW50KCk7CisgICAgICAgICAgICBvdXQucHJpbnRpbigiX2pzcHhfZGVwZW5kYW50cyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCIpOworICAgICAgICAgICAgb3V0LnByaW50KCIiICsgZGVwZW5kYW50cy5zaXplKCkpOworICAgICAgICAgICAgb3V0LnByaW50bG4oIik7Iik7CisgICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRpbigiX2pzcHhfZGVwZW5kYW50cy5hZGQoXCIiKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoKFN0cmluZylpdGVyLm5leHQoKSk7CisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIlwiKTsiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dC5wb3BJbmRlbnQoKTsKKyAgICAgICAgICAgIG91dC5wcmludGlsKCJ9Iik7CisgICAgICAgICAgICBvdXQucHJpbnRsbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVjbGFyZSB0YWcgaGFuZGxlciBwb29scyAodGFncyBvZiB0aGUgc2FtZSB0eXBlIGFuZCB3aXRoIHRoZSBzYW1lCisgICAgICogYXR0cmlidXRlIHNldCBzaGFyZSB0aGUgc2FtZSB0YWcgaGFuZGxlciBwb29sKQorICAgICAqIChzaGFyZWQgYnkgc2VydmxldCBhbmQgdGFnIGhhbmRsZXIgcHJlYW1ibGUgZ2VuZXJhdGlvbikKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZ2VuUHJlYW1ibGVDbGFzc1ZhcmlhYmxlRGVjbGFyYXRpb25zKFN0cmluZyBjbGFzc05hbWUpCisgICAgICAgIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICBpZiAoaXNQb29saW5nRW5hYmxlZCAmJiAhdGFnSGFuZGxlclBvb2xOYW1lcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGFnSGFuZGxlclBvb2xOYW1lcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIG91dC5wcmludGlsKAorICAgICAgICAgICAgICAgICAgICAicHJpdmF0ZSBvcmcuYXBhY2hlLmphc3Blci5ydW50aW1lLlRhZ0hhbmRsZXJQb29sICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgdGFnSGFuZGxlclBvb2xOYW1lcy5lbGVtZW50QXQoaSkKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIjsiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dC5wcmludGxuKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWNsYXJlIGdlbmVyYWwtcHVycG9zZSBtZXRob2RzCisgICAgICogKHNoYXJlZCBieSBzZXJ2bGV0IGFuZCB0YWcgaGFuZGxlciBwcmVhbWJsZSBnZW5lcmF0aW9uKQorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBnZW5QcmVhbWJsZU1ldGhvZHMoKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gTWV0aG9kIHVzZWQgdG8gZ2V0IGNvbXBpbGUgdGltZSBmaWxlIGRlcGVuZGVuY2llcworICAgICAgICBvdXQucHJpbnRpbCgicHVibGljIGphdmEudXRpbC5MaXN0IGdldERlcGVuZGFudHMoKSB7Iik7CisgICAgICAgIG91dC5wdXNoSW5kZW50KCk7CisgICAgICAgIG91dC5wcmludGlsKCJyZXR1cm4gX2pzcHhfZGVwZW5kYW50czsiKTsKKyAgICAgICAgb3V0LnBvcEluZGVudCgpOworICAgICAgICBvdXQucHJpbnRpbCgifSIpOworICAgICAgICBvdXQucHJpbnRsbigpOworCisgICAgICAgIGlmIChpc1Bvb2xpbmdFbmFibGVkICYmICF0YWdIYW5kbGVyUG9vbE5hbWVzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgZ2VuZXJhdGVJbml0KCk7CisgICAgICAgICAgICBnZW5lcmF0ZURlc3Ryb3koKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdGF0aWMgcG9ydGlvbiBvZiB0aGUgc2VydmxldC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZ2VuZXJhdGVQcmVhbWJsZShOb2RlLk5vZGVzIHBhZ2UpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCisgICAgICAgIFN0cmluZyBzZXJ2bGV0UGFja2FnZU5hbWUgPSBjdHh0LmdldFNlcnZsZXRQYWNrYWdlTmFtZSgpOworICAgICAgICBTdHJpbmcgc2VydmxldENsYXNzTmFtZSA9IGN0eHQuZ2V0U2VydmxldENsYXNzTmFtZSgpOworICAgICAgICBTdHJpbmcgc2VydmljZU1ldGhvZE5hbWUgPSBDb25zdGFudHMuU0VSVklDRV9NRVRIT0RfTkFNRTsKKworICAgICAgICAvLyBGaXJzdCB0aGUgcGFja2FnZSBuYW1lOgorICAgICAgICBnZW5QcmVhbWJsZVBhY2thZ2Uoc2VydmxldFBhY2thZ2VOYW1lKTsKKworICAgICAgICAvLyBHZW5lcmF0ZSBpbXBvcnRzCisgICAgICAgIGdlblByZWFtYmxlSW1wb3J0cygpOworCisgICAgICAgIC8vIEdlbmVyYXRlIGNsYXNzIGRlY2xhcmF0aW9uCisgICAgICAgIG91dC5wcmludGluKCJwdWJsaWMgZmluYWwgY2xhc3MgIik7CisgICAgICAgIG91dC5wcmludChzZXJ2bGV0Q2xhc3NOYW1lKTsKKyAgICAgICAgb3V0LnByaW50KCIgZXh0ZW5kcyAiKTsKKyAgICAgICAgb3V0LnByaW50bG4ocGFnZUluZm8uZ2V0RXh0ZW5kcygpKTsKKyAgICAgICAgb3V0LnByaW50aW4oCisgICAgICAgICAgICAiICAgIGltcGxlbWVudHMgb3JnLmFwYWNoZS5qYXNwZXIucnVudGltZS5Kc3BTb3VyY2VEZXBlbmRlbnQiKTsKKyAgICAgICAgaWYgKCFwYWdlSW5mby5pc1RocmVhZFNhZmUoKSkgeworICAgICAgICAgICAgb3V0LnByaW50bG4oIiwiKTsKKyAgICAgICAgICAgIG91dC5wcmludGluKCIgICAgICAgICAgICAgICAgIFNpbmdsZVRocmVhZE1vZGVsIik7CisgICAgICAgIH0KKyAgICAgICAgb3V0LnByaW50bG4oIiB7Iik7CisgICAgICAgIG91dC5wdXNoSW5kZW50KCk7CisKKyAgICAgICAgLy8gQ2xhc3MgYm9keSBiZWdpbnMgaGVyZQorICAgICAgICBnZW5lcmF0ZURlY2xhcmF0aW9ucyhwYWdlKTsKKworICAgICAgICAvLyBTdGF0aWMgaW5pdGlhbGl6YXRpb25zIGhlcmUKKyAgICAgICAgZ2VuUHJlYW1ibGVTdGF0aWNJbml0aWFsaXplcnMoKTsKKworICAgICAgICAvLyBDbGFzcyB2YXJpYWJsZSBkZWNsYXJhdGlvbnMKKyAgICAgICAgZ2VuUHJlYW1ibGVDbGFzc1ZhcmlhYmxlRGVjbGFyYXRpb25zKHNlcnZsZXRDbGFzc05hbWUpOworCisgICAgICAgIC8vIENvbnN0cnVjdG9yCisgICAgICAgIC8vICBnZW5lcmF0ZUNvbnN0cnVjdG9yKGNsYXNzTmFtZSk7CisKKyAgICAgICAgLy8gTWV0aG9kcyBoZXJlCisgICAgICAgIGdlblByZWFtYmxlTWV0aG9kcygpOworCisgICAgICAgIC8vIE5vdyB0aGUgc2VydmljZSBtZXRob2QKKyAgICAgICAgb3V0LnByaW50aW4oInB1YmxpYyB2b2lkICIpOworICAgICAgICBvdXQucHJpbnQoc2VydmljZU1ldGhvZE5hbWUpOworICAgICAgICBvdXQucHJpbnRsbigKKyAgICAgICAgICAgICIoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIik7CisgICAgICAgIG91dC5wcmludGxuKCIgICAgICAgIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsiKTsKKworICAgICAgICBvdXQucHVzaEluZGVudCgpOworICAgICAgICBvdXQucHJpbnRsbigpOworCisgICAgICAgIC8vIExvY2FsIHZhcmlhYmxlIGRlY2xhcmF0aW9ucworICAgICAgICBvdXQucHJpbnRpbCgiSnNwRmFjdG9yeSBfanNweEZhY3RvcnkgPSBudWxsOyIpOworICAgICAgICBvdXQucHJpbnRpbCgiUGFnZUNvbnRleHQgcGFnZUNvbnRleHQgPSBudWxsOyIpOworICAgICAgICBpZiAocGFnZUluZm8uaXNTZXNzaW9uKCkpCisgICAgICAgICAgICBvdXQucHJpbnRpbCgiSHR0cFNlc3Npb24gc2Vzc2lvbiA9IG51bGw7Iik7CisKKyAgICAgICAgaWYgKHBhZ2VJbmZvLmlzRXJyb3JQYWdlKCkpIHsKKyAgICAgICAgICAgIG91dC5wcmludGlsKAorICAgICAgICAgICAgICAgICJUaHJvd2FibGUgZXhjZXB0aW9uID0gb3JnLmFwYWNoZS5qYXNwZXIucnVudGltZS5Kc3BSdW50aW1lTGlicmFyeS5nZXRUaHJvd2FibGUocmVxdWVzdCk7Iik7CisgICAgICAgICAgICBvdXQucHJpbnRpbCgiaWYgKGV4Y2VwdGlvbiAhPSBudWxsKSB7Iik7CisgICAgICAgICAgICBvdXQucHVzaEluZGVudCgpOworICAgICAgICAgICAgb3V0LnByaW50aWwoCisgICAgICAgICAgICAgICAgInJlc3BvbnNlLnNldFN0YXR1cyhIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUik7Iik7CisgICAgICAgICAgICBvdXQucG9wSW5kZW50KCk7CisgICAgICAgICAgICBvdXQucHJpbnRpbCgifSIpOworICAgICAgICB9CisKKyAgICAgICAgb3V0LnByaW50aWwoIlNlcnZsZXRDb250ZXh0IGFwcGxpY2F0aW9uID0gbnVsbDsiKTsKKyAgICAgICAgb3V0LnByaW50aWwoIlNlcnZsZXRDb25maWcgY29uZmlnID0gbnVsbDsiKTsKKyAgICAgICAgb3V0LnByaW50aWwoIkpzcFdyaXRlciBvdXQgPSBudWxsOyIpOworICAgICAgICBvdXQucHJpbnRpbCgiT2JqZWN0IHBhZ2UgPSB0aGlzOyIpOworCisgICAgICAgIG91dC5wcmludGlsKCJKc3BXcml0ZXIgX2pzcHhfb3V0ID0gbnVsbDsiKTsKKyAgICAgICAgb3V0LnByaW50aWwoIlBhZ2VDb250ZXh0IF9qc3B4X3BhZ2VfY29udGV4dCA9IG51bGw7Iik7CisgICAgICAgIG91dC5wcmludGxuKCk7CisKKyAgICAgICAgZGVjbGFyZVRlbXBvcmFyeVNjcmlwdGluZ1ZhcnMocGFnZSk7CisgICAgICAgIG91dC5wcmludGxuKCk7CisKKyAgICAgICAgb3V0LnByaW50aWwoInRyeSB7Iik7CisgICAgICAgIG91dC5wdXNoSW5kZW50KCk7CisKKyAgICAgICAgb3V0LnByaW50aWwoIl9qc3B4RmFjdG9yeSA9IEpzcEZhY3RvcnkuZ2V0RGVmYXVsdEZhY3RvcnkoKTsiKTsKKworICAgICAgICBvdXQucHJpbnRpbigicmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoIik7CisgICAgICAgIG91dC5wcmludChxdW90ZShwYWdlSW5mby5nZXRDb250ZW50VHlwZSgpKSk7CisgICAgICAgIG91dC5wcmludGxuKCIpOyIpOworCisgICAgICAgIGlmIChjdHh0LmdldE9wdGlvbnMoKS5pc1hwb3dlcmVkQnkoKSkgeworICAgICAgICAgICAgb3V0LnByaW50aWwoInJlc3BvbnNlLmFkZEhlYWRlcihcIlgtUG93ZXJlZC1CeVwiLCBcIkpTUC8yLjBcIik7Iik7CisgICAgICAgIH0KKworICAgICAgICBvdXQucHJpbnRpbCgKKyAgICAgICAgICAgICJwYWdlQ29udGV4dCA9IF9qc3B4RmFjdG9yeS5nZXRQYWdlQ29udGV4dCh0aGlzLCByZXF1ZXN0LCByZXNwb25zZSwiKTsKKyAgICAgICAgb3V0LnByaW50aW4oIlx0XHRcdCIpOworICAgICAgICBvdXQucHJpbnQocXVvdGUocGFnZUluZm8uZ2V0RXJyb3JQYWdlKCkpKTsKKyAgICAgICAgb3V0LnByaW50KCIsICIgKyBwYWdlSW5mby5pc1Nlc3Npb24oKSk7CisgICAgICAgIG91dC5wcmludCgiLCAiICsgcGFnZUluZm8uZ2V0QnVmZmVyKCkpOworICAgICAgICBvdXQucHJpbnQoIiwgIiArIHBhZ2VJbmZvLmlzQXV0b0ZsdXNoKCkpOworICAgICAgICBvdXQucHJpbnRsbigiKTsiKTsKKyAgICAgICAgb3V0LnByaW50aWwoIl9qc3B4X3BhZ2VfY29udGV4dCA9IHBhZ2VDb250ZXh0OyIpOworCisgICAgICAgIG91dC5wcmludGlsKCJhcHBsaWNhdGlvbiA9IHBhZ2VDb250ZXh0LmdldFNlcnZsZXRDb250ZXh0KCk7Iik7CisgICAgICAgIG91dC5wcmludGlsKCJjb25maWcgPSBwYWdlQ29udGV4dC5nZXRTZXJ2bGV0Q29uZmlnKCk7Iik7CisKKyAgICAgICAgaWYgKHBhZ2VJbmZvLmlzU2Vzc2lvbigpKQorICAgICAgICAgICAgb3V0LnByaW50aWwoInNlc3Npb24gPSBwYWdlQ29udGV4dC5nZXRTZXNzaW9uKCk7Iik7CisgICAgICAgIG91dC5wcmludGlsKCJvdXQgPSBwYWdlQ29udGV4dC5nZXRPdXQoKTsiKTsKKyAgICAgICAgb3V0LnByaW50aWwoIl9qc3B4X291dCA9IG91dDsiKTsKKyAgICAgICAgb3V0LnByaW50bG4oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZXMgYW4gWE1MIFByb2xvZywgd2hpY2ggaW5jbHVkZXMgYW4gWE1MIGRlY2xhcmF0aW9uIGFuZAorICAgICAqIGFuIFhNTCBkb2N0eXBlIGRlY2xhcmF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBnZW5lcmF0ZVhtbFByb2xvZyhOb2RlLk5vZGVzIHBhZ2UpIHsKKworICAgICAgICAvKgorICAgICAgICAgKiBBbiBYTUwgZGVjbGFyYXRpb24gaXMgZ2VuZXJhdGVkIHVuZGVyIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAgICAgICAgICoKKyAgICAgICAgICogLSAnb21pdC14bWwtZGVjbGFyYXRpb24nIGF0dHJpYnV0ZSBvZiA8anNwOm91dHB1dD4gYWN0aW9uIGlzIHNldCB0bworICAgICAgICAgKiAgICJubyIgb3IgImZhbHNlIgorICAgICAgICAgKiAtIEpTUCBkb2N1bWVudCB3aXRob3V0IGEgPGpzcDpyb290PgorICAgICAgICAgKi8KKyAgICAgICAgU3RyaW5nIG9taXRYbWxEZWNsID0gcGFnZUluZm8uZ2V0T21pdFhtbERlY2woKTsKKyAgICAgICAgaWYgKChvbWl0WG1sRGVjbCAhPSBudWxsICYmICFKc3BVdGlsLmJvb2xlYW5WYWx1ZShvbWl0WG1sRGVjbCkpCisgICAgICAgICAgICB8fCAob21pdFhtbERlY2wgPT0gbnVsbAorICAgICAgICAgICAgICAgICYmIHBhZ2UuZ2V0Um9vdCgpLmlzWG1sU3ludGF4KCkKKyAgICAgICAgICAgICAgICAmJiAhcGFnZUluZm8uaGFzSnNwUm9vdCgpCisgICAgICAgICAgICAgICAgJiYgIWN0eHQuaXNUYWdGaWxlKCkpKSB7CisgICAgICAgICAgICBTdHJpbmcgY1R5cGUgPSBwYWdlSW5mby5nZXRDb250ZW50VHlwZSgpOworICAgICAgICAgICAgU3RyaW5nIGNoYXJTZXQgPSBjVHlwZS5zdWJzdHJpbmcoY1R5cGUuaW5kZXhPZigiY2hhcnNldD0iKSArIDgpOworICAgICAgICAgICAgb3V0LnByaW50aWwoCisgICAgICAgICAgICAgICAgIm91dC53cml0ZShcIjw/eG1sIHZlcnNpb249XFxcIjEuMFxcXCIgZW5jb2Rpbmc9XFxcIiIKKyAgICAgICAgICAgICAgICAgICAgKyBjaGFyU2V0CisgICAgICAgICAgICAgICAgICAgICsgIlxcXCI/PlxcblwiKTsiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIE91dHB1dCBhIERPQ1RZUEUgZGVjbGFyYXRpb24gaWYgdGhlIGRvY3R5cGUtcm9vdC1lbGVtZW50IGFwcGVhcnMuCisgICAgICAgICAqIElmIGRvY3R5cGUtcHVibGljIGFwcGVhcnM6CisgICAgICAgICAqICAgICA8IURPQ1RZUEUgbmFtZSBQVUJMSUMgImRvY3R5cGVQdWJsaWMiICJkb2N0eXBlU3lzdGVtIj4KKyAgICAgICAgICogZWxzZQorICAgICAgICAgKiAgICAgPCFET0NUWVBFIG5hbWUgU1lTVEVNICJkb2N0eXBlU3lzdGVtIiA+CisgICAgICAgICAqLworCisgICAgICAgIFN0cmluZyBkb2N0eXBlTmFtZSA9IHBhZ2VJbmZvLmdldERvY3R5cGVOYW1lKCk7CisgICAgICAgIGlmIChkb2N0eXBlTmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgZG9jdHlwZVB1YmxpYyA9IHBhZ2VJbmZvLmdldERvY3R5cGVQdWJsaWMoKTsKKyAgICAgICAgICAgIFN0cmluZyBkb2N0eXBlU3lzdGVtID0gcGFnZUluZm8uZ2V0RG9jdHlwZVN5c3RlbSgpOworICAgICAgICAgICAgb3V0LnByaW50aW4oIm91dC53cml0ZShcIjwhRE9DVFlQRSAiKTsKKyAgICAgICAgICAgIG91dC5wcmludChkb2N0eXBlTmFtZSk7CisgICAgICAgICAgICBpZiAoZG9jdHlwZVB1YmxpYyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgb3V0LnByaW50KCIgU1lTVEVNIFxcXCIiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgb3V0LnByaW50KCIgUFVCTElDIFxcXCIiKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoZG9jdHlwZVB1YmxpYyk7CisgICAgICAgICAgICAgICAgb3V0LnByaW50KCJcXFwiIFxcXCIiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dC5wcmludChkb2N0eXBlU3lzdGVtKTsKKyAgICAgICAgICAgIG91dC5wcmludGxuKCJcXFwiPlxcblwiKTsiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogR2VuZXJhdGVzIHRoZSBjb25zdHJ1Y3Rvci4KKyAgICAgKiAoc2hhcmVkIGJ5IHNlcnZsZXQgYW5kIHRhZyBoYW5kbGVyIHByZWFtYmxlIGdlbmVyYXRpb24pCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGdlbmVyYXRlQ29uc3RydWN0b3IoU3RyaW5nIGNsYXNzTmFtZSkgeworICAgICAgICBvdXQucHJpbnRpbCgicHVibGljICIgKyBjbGFzc05hbWUgKyAiKCkgeyIpOworICAgICAgICBvdXQucHJpbnRpbCgifSIpOworICAgICAgICBvdXQucHJpbnRsbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgdmlzaXRvciB0aGF0IGdlbmVyYXRlcyBjb2RlcyBmb3IgdGhlIGVsZW1lbnRzIGluIHRoZSBwYWdlLgorICAgICAqLworICAgIGNsYXNzIEdlbmVyYXRlVmlzaXRvciBleHRlbmRzIE5vZGUuVmlzaXRvciB7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogSGFzaHRhYmxlIGNvbnRhaW5pbmcgaW50cm9zcGVjdGlvbiBpbmZvcm1hdGlvbiBvbiB0YWcgaGFuZGxlcnM6CisgICAgICAgICAqICAgPGtleT46IHRhZyBwcmVmaXgKKyAgICAgICAgICogICA8dmFsdWU+OiBoYXNodGFibGUgY29udGFpbmluZyBpbnRyb3NwZWN0aW9uIG9uIHRhZyBoYW5kbGVyczoKKyAgICAgICAgICogICAgICAgICAgICAgIDxrZXk+OiB0YWcgc2hvcnQgbmFtZQorICAgICAgICAgKiAgICAgICAgICAgICAgPHZhbHVlPjogaW50cm9zcGVjdGlvbiBpbmZvIG9mIHRhZyBoYW5kbGVyIGZvcgorICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgPHByZWZpeDpzaG9ydE5hbWU+IHRhZworICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBIYXNodGFibGUgaGFuZGxlckluZm9zOworCisgICAgICAgIHByaXZhdGUgSGFzaHRhYmxlIHRhZ1Zhck51bWJlcnM7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIHBhcmVudDsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzU2ltcGxlVGFnUGFyZW50OyAvLyBJcyBwYXJlbnQgYSBTaW1wbGVUYWc/CisgICAgICAgIHByaXZhdGUgU3RyaW5nIHB1c2hCb2R5Q291bnRWYXI7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIHNpbXBsZVRhZ0hhbmRsZXJWYXI7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBpc1NpbXBsZVRhZ0hhbmRsZXI7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBpc0ZyYWdtZW50OworICAgICAgICBwcml2YXRlIGJvb2xlYW4gaXNUYWdGaWxlOworICAgICAgICBwcml2YXRlIFNlcnZsZXRXcml0ZXIgb3V0OworICAgICAgICBwcml2YXRlIEFycmF5TGlzdCBtZXRob2RzQnVmZmVyZWQ7CisgICAgICAgIHByaXZhdGUgRnJhZ21lbnRIZWxwZXJDbGFzcyBmcmFnbWVudEhlbHBlckNsYXNzOworICAgICAgICBwcml2YXRlIGludCBtZXRob2ROZXN0aW5nOworICAgICAgICBwcml2YXRlIFRhZ0luZm8gdGFnSW5mbzsKKyAgICAgICAgcHJpdmF0ZSBDbGFzc0xvYWRlciBsb2FkZXI7CisgICAgICAgIHByaXZhdGUgaW50IGNoYXJBcnJheUNvdW50OworICAgICAgICBwcml2YXRlIEhhc2hNYXAgdGV4dE1hcDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ29uc3RydWN0b3IuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgR2VuZXJhdGVWaXNpdG9yKAorICAgICAgICAgICAgYm9vbGVhbiBpc1RhZ0ZpbGUsCisgICAgICAgICAgICBTZXJ2bGV0V3JpdGVyIG91dCwKKyAgICAgICAgICAgIEFycmF5TGlzdCBtZXRob2RzQnVmZmVyZWQsCisgICAgICAgICAgICBGcmFnbWVudEhlbHBlckNsYXNzIGZyYWdtZW50SGVscGVyQ2xhc3MsCisgICAgICAgICAgICBDbGFzc0xvYWRlciBsb2FkZXIsCisgICAgICAgICAgICBUYWdJbmZvIHRhZ0luZm8pIHsKKworICAgICAgICAgICAgdGhpcy5pc1RhZ0ZpbGUgPSBpc1RhZ0ZpbGU7CisgICAgICAgICAgICB0aGlzLm91dCA9IG91dDsKKyAgICAgICAgICAgIHRoaXMubWV0aG9kc0J1ZmZlcmVkID0gbWV0aG9kc0J1ZmZlcmVkOworICAgICAgICAgICAgdGhpcy5mcmFnbWVudEhlbHBlckNsYXNzID0gZnJhZ21lbnRIZWxwZXJDbGFzczsKKyAgICAgICAgICAgIHRoaXMubG9hZGVyID0gbG9hZGVyOworICAgICAgICAgICAgdGhpcy50YWdJbmZvID0gdGFnSW5mbzsKKyAgICAgICAgICAgIG1ldGhvZE5lc3RpbmcgPSAwOworICAgICAgICAgICAgaGFuZGxlckluZm9zID0gbmV3IEhhc2h0YWJsZSgpOworICAgICAgICAgICAgdGFnVmFyTnVtYmVycyA9IG5ldyBIYXNodGFibGUoKTsKKyAgICAgICAgICAgIHRleHRNYXAgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgYW4gYXR0cmlidXRlIHZhbHVlLCBvcHRpb25hbGx5IFVSTCBlbmNvZGVkLiAgSWYKKyAgICAgICAgICogdGhlIHZhbHVlIGlzIGEgcnVudGltZSBleHByZXNzaW9uLCB0aGUgcmVzdWx0IGlzIHRoZSBleHByZXNzaW9uCisgICAgICAgICAqIGl0c2VsZiwgYXMgYSBzdHJpbmcuICBJZiB0aGUgcmVzdWx0IGlzIGFuIEVMIGV4cHJlc3Npb24sIHdlIGluc2VydAorICAgICAgICAgKiBhIGNhbGwgdG8gdGhlIGludGVycHJldGVyLiAgSWYgdGhlIHJlc3VsdCBpcyBhIE5hbWVkIEF0dHJpYnV0ZQorICAgICAgICAgKiB3ZSBpbnNlcnQgdGhlIGdlbmVyYXRlZCB2YXJpYWJsZSBuYW1lLiAgT3RoZXJ3aXNlIHRoZSByZXN1bHQgaXMgYQorICAgICAgICAgKiBzdHJpbmcgbGl0ZXJhbCwgcXVvdGVkIGFuZCBlc2NhcGVkLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gYXR0ciBBbiBKc3BBdHRyaWJ1dGUgb2JqZWN0CisgICAgICAgICAqIEBwYXJhbSBlbmNvZGUgdHJ1ZSBpZiB0byBiZSBVUkwgZW5jb2RlZAorICAgICAgICAgKiBAcGFyYW0gZXhwZWN0ZWRUeXBlIHRoZSBleHBlY3RlZCB0eXBlIGZvciBhbiBFTCBldmFsdWF0aW9uCisgICAgICAgICAqICAgICAgICAoaWdub3JlZCBmb3IgYXR0cmlidXRlcyB0aGF0IGFyZW4ndCBFTCBleHByZXNzaW9ucykKKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgU3RyaW5nIGF0dHJpYnV0ZVZhbHVlKAorICAgICAgICAgICAgTm9kZS5Kc3BBdHRyaWJ1dGUgYXR0ciwKKyAgICAgICAgICAgIGJvb2xlYW4gZW5jb2RlLAorICAgICAgICAgICAgQ2xhc3MgZXhwZWN0ZWRUeXBlKSB7CisgICAgICAgICAgICBTdHJpbmcgdiA9IGF0dHIuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgIGlmICghYXR0ci5pc05hbWVkQXR0cmlidXRlKCkgJiYgKHYgPT0gbnVsbCkpCisgICAgICAgICAgICAgICAgcmV0dXJuICIiOworCisgICAgICAgICAgICBpZiAoYXR0ci5pc0V4cHJlc3Npb24oKSkgeworICAgICAgICAgICAgICAgIGlmIChlbmNvZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLmphc3Blci5ydW50aW1lLkpzcFJ1bnRpbWVMaWJyYXJ5LlVSTEVuY29kZShTdHJpbmcudmFsdWVPZigiCisgICAgICAgICAgICAgICAgICAgICAgICArIHYKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiksIHJlcXVlc3QuZ2V0Q2hhcmFjdGVyRW5jb2RpbmcoKSkiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gdjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYXR0ci5pc0VMSW50ZXJwcmV0ZXJJbnB1dCgpKSB7CisgICAgICAgICAgICAgICAgYm9vbGVhbiByZXBsYWNlRVNDID0gdi5pbmRleE9mKENvbnN0YW50cy5FU0MpID4gMDsKKyAgICAgICAgICAgICAgICB2ID0KKyAgICAgICAgICAgICAgICAgICAgSnNwVXRpbC5pbnRlcnByZXRlckNhbGwoCisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzVGFnRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHYsCisgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBhdHRyLmdldEVMKCkuZ2V0TWFwTmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICAgICAgICAgICAgICAgIC8vIFhYWCBFU0MgcmVwbGFjZW1lbnQgaGFjaworICAgICAgICAgICAgICAgIGlmIChyZXBsYWNlRVNDKSB7CisgICAgICAgICAgICAgICAgICAgIHYgPSAiKCIgKyB2ICsgIikucmVwbGFjZSgiICsgQ29uc3RhbnRzLkVTQ1N0ciArICIsICckJykiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZW5jb2RlKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAib3JnLmFwYWNoZS5qYXNwZXIucnVudGltZS5Kc3BSdW50aW1lTGlicmFyeS5VUkxFbmNvZGUoIgorICAgICAgICAgICAgICAgICAgICAgICAgKyB2CisgICAgICAgICAgICAgICAgICAgICAgICArICIsIHJlcXVlc3QuZ2V0Q2hhcmFjdGVyRW5jb2RpbmcoKSkiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gdjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYXR0ci5pc05hbWVkQXR0cmlidXRlKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXR0ci5nZXROYW1lZEF0dHJpYnV0ZU5vZGUoKS5nZXRUZW1wb3JhcnlWYXJpYWJsZU5hbWUoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGVuY29kZSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gIm9yZy5hcGFjaGUuamFzcGVyLnJ1bnRpbWUuSnNwUnVudGltZUxpYnJhcnkuVVJMRW5jb2RlKCIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgcXVvdGUodikKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgcmVxdWVzdC5nZXRDaGFyYWN0ZXJFbmNvZGluZygpKSI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBxdW90ZSh2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBQcmludHMgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBzcGVjaWZpZWQgaW4gdGhlIHBhcmFtIGFjdGlvbiwgaW4gdGhlCisgICAgICAgICAqIGZvcm0gb2YgbmFtZT12YWx1ZSBzdHJpbmcuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBuIHRoZSBwYXJlbnQgbm9kZSBmb3IgdGhlIHBhcmFtIGFjdGlvbiBub2Rlcy4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgdm9pZCBwcmludFBhcmFtcyhOb2RlIG4sIFN0cmluZyBwYWdlUGFyYW0sIGJvb2xlYW4gbGl0ZXJhbCkKKyAgICAgICAgICAgIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCisgICAgICAgICAgICBjbGFzcyBQYXJhbVZpc2l0b3IgZXh0ZW5kcyBOb2RlLlZpc2l0b3IgeworICAgICAgICAgICAgICAgIFN0cmluZyBzZXBhcmF0b3I7CisKKyAgICAgICAgICAgICAgICBQYXJhbVZpc2l0b3IoU3RyaW5nIHNlcGFyYXRvcikgeworICAgICAgICAgICAgICAgICAgICB0aGlzLnNlcGFyYXRvciA9IHNlcGFyYXRvcjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLlBhcmFtQWN0aW9uIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCgiICsgIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludChzZXBhcmF0b3IpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoIiArICIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5qYXNwZXIucnVudGltZS5Kc3BSdW50aW1lTGlicmFyeS4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiVVJMRW5jb2RlKCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHF1b3RlKG4uZ2V0VGV4dEF0dHJpYnV0ZSgibmFtZSIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgcmVxdWVzdC5nZXRDaGFyYWN0ZXJFbmNvZGluZygpKSIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoIisgXCI9XCIgKyAiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KGF0dHJpYnV0ZVZhbHVlKG4uZ2V0VmFsdWUoKSwgdHJ1ZSwgU3RyaW5nLmNsYXNzKSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHNlcGFyYXRvciBpcyAnJicgYWZ0ZXIgdGhlIHNlY29uZCB1c2UKKyAgICAgICAgICAgICAgICAgICAgc2VwYXJhdG9yID0gIlwiJlwiIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0cmluZyBzZXA7CisgICAgICAgICAgICBpZiAobGl0ZXJhbCkgeworICAgICAgICAgICAgICAgIHNlcCA9IHBhZ2VQYXJhbS5pbmRleE9mKCc/JykgPiAwID8gIlwiJlwiIiA6ICJcIj9cIiI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNlcCA9ICIoKCIgKyBwYWdlUGFyYW0gKyAiKS5pbmRleE9mKCc/Jyk+MD8gJyYnOiAnPycpIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChuLmdldEJvZHkoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbi5nZXRCb2R5KCkudmlzaXQobmV3IFBhcmFtVmlzaXRvcihzZXApKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuRXhwcmVzc2lvbiBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIG4uc2V0QmVnaW5KYXZhTGluZShvdXQuZ2V0SmF2YUxpbmUoKSk7CisgICAgICAgICAgICBvdXQucHJpbnRpbigib3V0LnByaW50KCIpOworICAgICAgICAgICAgb3V0LnByaW50TXVsdGlMbihuLmdldFRleHQoKSk7CisgICAgICAgICAgICBvdXQucHJpbnRsbigiKTsiKTsKKyAgICAgICAgICAgIG4uc2V0RW5kSmF2YUxpbmUob3V0LmdldEphdmFMaW5lKCkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5TY3JpcHRsZXQgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBuLnNldEJlZ2luSmF2YUxpbmUob3V0LmdldEphdmFMaW5lKCkpOworICAgICAgICAgICAgb3V0LnByaW50TXVsdGlMbihuLmdldFRleHQoKSk7CisgICAgICAgICAgICBvdXQucHJpbnRsbigpOworICAgICAgICAgICAgbi5zZXRFbmRKYXZhTGluZShvdXQuZ2V0SmF2YUxpbmUoKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLkVMRXhwcmVzc2lvbiBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIG4uc2V0QmVnaW5KYXZhTGluZShvdXQuZ2V0SmF2YUxpbmUoKSk7CisgICAgICAgICAgICBpZiAoIXBhZ2VJbmZvLmlzRUxJZ25vcmVkKCkpIHsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRpbCgKKyAgICAgICAgICAgICAgICAgICAgIm91dC53cml0ZSgiCisgICAgICAgICAgICAgICAgICAgICAgICArIEpzcFV0aWwuaW50ZXJwcmV0ZXJDYWxsKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNUYWdGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIkeyIgKyBuZXcgU3RyaW5nKG4uZ2V0VGV4dCgpKSArICJ9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5nZXRFTCgpLmdldE1hcE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIik7Iik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG91dC5wcmludGlsKAorICAgICAgICAgICAgICAgICAgICAib3V0LndyaXRlKCIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgcXVvdGUoIiR7IiArIG5ldyBTdHJpbmcobi5nZXRUZXh0KCkpICsgIn0iKQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiKTsiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG4uc2V0RW5kSmF2YUxpbmUob3V0LmdldEphdmFMaW5lKCkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5JbmNsdWRlQWN0aW9uIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCisgICAgICAgICAgICBTdHJpbmcgZmx1c2ggPSBuLmdldFRleHRBdHRyaWJ1dGUoImZsdXNoIik7CisgICAgICAgICAgICBOb2RlLkpzcEF0dHJpYnV0ZSBwYWdlID0gbi5nZXRQYWdlKCk7CisKKyAgICAgICAgICAgIGJvb2xlYW4gaXNGbHVzaCA9IGZhbHNlOyAvLyBkZWZhdWx0IHRvIGZhbHNlOworICAgICAgICAgICAgaWYgKCJ0cnVlIi5lcXVhbHMoZmx1c2gpKQorICAgICAgICAgICAgICAgIGlzRmx1c2ggPSB0cnVlOworCisgICAgICAgICAgICBuLnNldEJlZ2luSmF2YUxpbmUob3V0LmdldEphdmFMaW5lKCkpOworCisgICAgICAgICAgICBTdHJpbmcgcGFnZVBhcmFtOworICAgICAgICAgICAgaWYgKHBhZ2UuaXNOYW1lZEF0dHJpYnV0ZSgpKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHBhZ2UgZm9yIGpzcDppbmNsdWRlIHdhcyBzcGVjaWZpZWQgdmlhCisgICAgICAgICAgICAgICAgLy8ganNwOmF0dHJpYnV0ZSwgZmlyc3QgZ2VuZXJhdGUgY29kZSB0byBldmFsdWF0ZQorICAgICAgICAgICAgICAgIC8vIHRoYXQgYm9keS4KKyAgICAgICAgICAgICAgICBwYWdlUGFyYW0gPQorICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZU5hbWVkQXR0cmlidXRlVmFsdWUocGFnZS5nZXROYW1lZEF0dHJpYnV0ZU5vZGUoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHBhZ2VQYXJhbSA9IGF0dHJpYnV0ZVZhbHVlKHBhZ2UsIGZhbHNlLCBTdHJpbmcuY2xhc3MpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBJZiBhbnkgb2YgdGhlIHBhcmFtcyBoYXZlIHRoZWlyIHZhbHVlcyBzcGVjaWZpZWQgYnkKKyAgICAgICAgICAgIC8vIGpzcDphdHRyaWJ1dGUsIHByZXBhcmUgdGhvc2UgdmFsdWVzIGZpcnN0LgorICAgICAgICAgICAgTm9kZSBqc3BCb2R5ID0gZmluZEpzcEJvZHkobik7CisgICAgICAgICAgICBpZiAoanNwQm9keSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcHJlcGFyZVBhcmFtcyhqc3BCb2R5KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcHJlcGFyZVBhcmFtcyhuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3V0LnByaW50aW4oCisgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuamFzcGVyLnJ1bnRpbWUuSnNwUnVudGltZUxpYnJhcnkuaW5jbHVkZShyZXF1ZXN0LCByZXNwb25zZSwgIgorICAgICAgICAgICAgICAgICAgICArIHBhZ2VQYXJhbSk7CisgICAgICAgICAgICBwcmludFBhcmFtcyhuLCBwYWdlUGFyYW0sIHBhZ2UuaXNMaXRlcmFsKCkpOworICAgICAgICAgICAgb3V0LnByaW50bG4oIiwgb3V0LCAiICsgaXNGbHVzaCArICIpOyIpOworCisgICAgICAgICAgICBuLnNldEVuZEphdmFMaW5lKG91dC5nZXRKYXZhTGluZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTY2FucyB0aHJvdWdoIGFsbCBjaGlsZCBub2RlcyBvZiB0aGUgZ2l2ZW4gcGFyZW50IGZvcgorICAgICAgICAgKiA8cGFyYW0+IHN1YmVsZW1lbnRzLiAgRm9yIGVhY2ggPHBhcmFtPiBlbGVtZW50LCBpZiBpdHMgdmFsdWUKKyAgICAgICAgICogaXMgc3BlY2lmaWVkIHZpYSBhIE5hbWVkIEF0dHJpYnV0ZSAoPGpzcDphdHRyaWJ1dGU+KSwKKyAgICAgICAgICogZ2VuZXJhdGUgdGhlIGNvZGUgdG8gZXZhbHVhdGUgdGhvc2UgYm9kaWVzIGZpcnN0LgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogSWYgcGFyZW50IGlzIG51bGwsIHNpbXBseSByZXR1cm5zLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSB2b2lkIHByZXBhcmVQYXJhbXMoTm9kZSBwYXJlbnQpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgaWYgKHBhcmVudCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgTm9kZS5Ob2RlcyBzdWJlbGVtZW50cyA9IHBhcmVudC5nZXRCb2R5KCk7CisgICAgICAgICAgICBpZiAoc3ViZWxlbWVudHMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3ViZWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgTm9kZSBuID0gc3ViZWxlbWVudHMuZ2V0Tm9kZShpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG4gaW5zdGFuY2VvZiBOb2RlLlBhcmFtQWN0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBOb2RlLk5vZGVzIHBhcmFtU3ViRWxlbWVudHMgPSBuLmdldEJvZHkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYXJhbVN1YkVsZW1lbnRzICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChqIDwgcGFyYW1TdWJFbGVtZW50cy5zaXplKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vZGUgbSA9IHBhcmFtU3ViRWxlbWVudHMuZ2V0Tm9kZShqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobSBpbnN0YW5jZW9mIE5vZGUuTmFtZWRBdHRyaWJ1dGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVOYW1lZEF0dHJpYnV0ZVZhbHVlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE5vZGUuTmFtZWRBdHRyaWJ1dGUpbSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEZpbmRzIHRoZSA8anNwOmJvZHk+IHN1YmVsZW1lbnQgb2YgdGhlIGdpdmVuIHBhcmVudCBub2RlLgorICAgICAgICAgKiBJZiBub3QgZm91bmQsIG51bGwgaXMgcmV0dXJuZWQuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIE5vZGUuSnNwQm9keSBmaW5kSnNwQm9keShOb2RlIHBhcmVudCkgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBOb2RlLkpzcEJvZHkgcmVzdWx0ID0gbnVsbDsKKworICAgICAgICAgICAgTm9kZS5Ob2RlcyBzdWJlbGVtZW50cyA9IHBhcmVudC5nZXRCb2R5KCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsKKyAgICAgICAgICAgICAgICAoc3ViZWxlbWVudHMgIT0gbnVsbCkgJiYgKGkgPCBzdWJlbGVtZW50cy5zaXplKCkpOworICAgICAgICAgICAgICAgIGkrKykgeworICAgICAgICAgICAgICAgIE5vZGUgbiA9IHN1YmVsZW1lbnRzLmdldE5vZGUoaSk7CisgICAgICAgICAgICAgICAgaWYgKG4gaW5zdGFuY2VvZiBOb2RlLkpzcEJvZHkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKE5vZGUuSnNwQm9keSluOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLkZvcndhcmRBY3Rpb24gbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBOb2RlLkpzcEF0dHJpYnV0ZSBwYWdlID0gbi5nZXRQYWdlKCk7CisKKyAgICAgICAgICAgIG4uc2V0QmVnaW5KYXZhTGluZShvdXQuZ2V0SmF2YUxpbmUoKSk7CisKKyAgICAgICAgICAgIG91dC5wcmludGlsKCJpZiAodHJ1ZSkgeyIpOyAvLyBTbyB0aGF0IGphdmFjIHdvbid0IGNvbXBsYWluIGFib3V0CisgICAgICAgICAgICBvdXQucHVzaEluZGVudCgpOyAvLyBjb2RlcyBhZnRlciAicmV0dXJuIgorCisgICAgICAgICAgICBTdHJpbmcgcGFnZVBhcmFtOworICAgICAgICAgICAgaWYgKHBhZ2UuaXNOYW1lZEF0dHJpYnV0ZSgpKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHBhZ2UgZm9yIGpzcDpmb3J3YXJkIHdhcyBzcGVjaWZpZWQgdmlhCisgICAgICAgICAgICAgICAgLy8ganNwOmF0dHJpYnV0ZSwgZmlyc3QgZ2VuZXJhdGUgY29kZSB0byBldmFsdWF0ZQorICAgICAgICAgICAgICAgIC8vIHRoYXQgYm9keS4KKyAgICAgICAgICAgICAgICBwYWdlUGFyYW0gPQorICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZU5hbWVkQXR0cmlidXRlVmFsdWUocGFnZS5nZXROYW1lZEF0dHJpYnV0ZU5vZGUoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHBhZ2VQYXJhbSA9IGF0dHJpYnV0ZVZhbHVlKHBhZ2UsIGZhbHNlLCBTdHJpbmcuY2xhc3MpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBJZiBhbnkgb2YgdGhlIHBhcmFtcyBoYXZlIHRoZWlyIHZhbHVlcyBzcGVjaWZpZWQgYnkKKyAgICAgICAgICAgIC8vIGpzcDphdHRyaWJ1dGUsIHByZXBhcmUgdGhvc2UgdmFsdWVzIGZpcnN0LgorICAgICAgICAgICAgTm9kZSBqc3BCb2R5ID0gZmluZEpzcEJvZHkobik7CisgICAgICAgICAgICBpZiAoanNwQm9keSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcHJlcGFyZVBhcmFtcyhqc3BCb2R5KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcHJlcGFyZVBhcmFtcyhuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3V0LnByaW50aW4oIl9qc3B4X3BhZ2VfY29udGV4dC5mb3J3YXJkKCIpOworICAgICAgICAgICAgb3V0LnByaW50KHBhZ2VQYXJhbSk7CisgICAgICAgICAgICBwcmludFBhcmFtcyhuLCBwYWdlUGFyYW0sIHBhZ2UuaXNMaXRlcmFsKCkpOworICAgICAgICAgICAgb3V0LnByaW50bG4oIik7Iik7CisgICAgICAgICAgICBpZiAoaXNUYWdGaWxlIHx8IGlzRnJhZ21lbnQpIHsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRpbCgidGhyb3cgbmV3IFNraXBQYWdlRXhjZXB0aW9uKCk7Iik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG91dC5wcmludGlsKChtZXRob2ROZXN0aW5nID4gMCkgPyAicmV0dXJuIHRydWU7IiA6ICJyZXR1cm47Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXQucG9wSW5kZW50KCk7CisgICAgICAgICAgICBvdXQucHJpbnRpbCgifSIpOworCisgICAgICAgICAgICBuLnNldEVuZEphdmFMaW5lKG91dC5nZXRKYXZhTGluZSgpKTsKKyAgICAgICAgICAgIC8vIFhYWCBOb3Qgc3VyZSBpZiB3ZSBjYW4gZWxpbWluYXRlIGRlYWQgY29kZXMgYWZ0ZXIgdGhpcy4KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuR2V0UHJvcGVydHkgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IG4uZ2V0VGV4dEF0dHJpYnV0ZSgibmFtZSIpOworICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5ID0gbi5nZXRUZXh0QXR0cmlidXRlKCJwcm9wZXJ0eSIpOworCisgICAgICAgICAgICBuLnNldEJlZ2luSmF2YUxpbmUob3V0LmdldEphdmFMaW5lKCkpOworCisgICAgICAgICAgICBpZiAoYmVhbkluZm8uY2hlY2tWYXJpYWJsZShuYW1lKSkgeworICAgICAgICAgICAgICAgIC8vIEJlYW4gaXMgZGVmaW5lZCB1c2luZyB1c2VCZWFuLCBpbnRyb3NwZWN0IGF0IGNvbXBpbGUgdGltZQorICAgICAgICAgICAgICAgIENsYXNzIGJlYW4gPSBiZWFuSW5mby5nZXRCZWFuVHlwZShuYW1lKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgYmVhbk5hbWUgPSBKc3BVdGlsLmdldENhbm9uaWNhbE5hbWUoYmVhbik7CisgICAgICAgICAgICAgICAgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIG1ldGggPQorICAgICAgICAgICAgICAgICAgICBKc3BSdW50aW1lTGlicmFyeS5nZXRSZWFkTWV0aG9kKGJlYW4sIHByb3BlcnR5KTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbWV0aG9kTmFtZSA9IG1ldGguZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgIG91dC5wcmludGlsKAorICAgICAgICAgICAgICAgICAgICAib3V0LndyaXRlKG9yZy5hcGFjaGUuamFzcGVyLnJ1bnRpbWUuSnNwUnVudGltZUxpYnJhcnkudG9TdHJpbmcoIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiKCgoIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBiZWFuTmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiKV9qc3B4X3BhZ2VfY29udGV4dC5maW5kQXR0cmlidXRlKCIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIlwiIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICArICJcIikpLiIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgbWV0aG9kTmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiKCkpKSk7Iik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFRoZSBvYmplY3QgY291bGQgYmUgYSBjdXN0b20gYWN0aW9uIHdpdGggYW4gYXNzb2NpYXRlZAorICAgICAgICAgICAgICAgIC8vIFZhcmlhYmxlSW5mbyBlbnRyeSBmb3IgdGhpcyBuYW1lLgorICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgY2xhc3MgbmFtZSBhbmQgdGhlbiBpbnRyb3NwZWN0IGF0IHJ1bnRpbWUuCisgICAgICAgICAgICAgICAgb3V0LnByaW50aWwoCisgICAgICAgICAgICAgICAgICAgICJvdXQud3JpdGUob3JnLmFwYWNoZS5qYXNwZXIucnVudGltZS5Kc3BSdW50aW1lTGlicmFyeS50b1N0cmluZyIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIihvcmcuYXBhY2hlLmphc3Blci5ydW50aW1lLkpzcFJ1bnRpbWVMaWJyYXJ5LmhhbmRsZUdldFByb3BlcnR5IgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiKF9qc3B4X3BhZ2VfY29udGV4dC5maW5kQXR0cmlidXRlKFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICArICJcIiksIFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBwcm9wZXJ0eQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiXCIpKSk7Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG4uc2V0RW5kSmF2YUxpbmUob3V0LmdldEphdmFMaW5lKCkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5TZXRQcm9wZXJ0eSBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gbi5nZXRUZXh0QXR0cmlidXRlKCJuYW1lIik7CisgICAgICAgICAgICBTdHJpbmcgcHJvcGVydHkgPSBuLmdldFRleHRBdHRyaWJ1dGUoInByb3BlcnR5Iik7CisgICAgICAgICAgICBTdHJpbmcgcGFyYW0gPSBuLmdldFRleHRBdHRyaWJ1dGUoInBhcmFtIik7CisgICAgICAgICAgICBOb2RlLkpzcEF0dHJpYnV0ZSB2YWx1ZSA9IG4uZ2V0VmFsdWUoKTsKKworICAgICAgICAgICAgbi5zZXRCZWdpbkphdmFMaW5lKG91dC5nZXRKYXZhTGluZSgpKTsKKworICAgICAgICAgICAgaWYgKCIqIi5lcXVhbHMocHJvcGVydHkpKSB7CisgICAgICAgICAgICAgICAgb3V0LnByaW50aWwoCisgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmphc3Blci5ydW50aW1lLkpzcFJ1bnRpbWVMaWJyYXJ5LmludHJvc3BlY3QoIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiX2pzcHhfcGFnZV9jb250ZXh0LmZpbmRBdHRyaWJ1dGUoIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiXCIiCisgICAgICAgICAgICAgICAgICAgICAgICArIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIlwiKSwgcmVxdWVzdCk7Iik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAocGFyYW0gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgcGFyYW0gPSBwcm9wZXJ0eTsgLy8gZGVmYXVsdCB0byBzYW1lIGFzIHByb3BlcnR5CisgICAgICAgICAgICAgICAgb3V0LnByaW50aWwoCisgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmphc3Blci5ydW50aW1lLkpzcFJ1bnRpbWVMaWJyYXJ5LmludHJvc3BlY3RoZWxwZXIoIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiX2pzcHhfcGFnZV9jb250ZXh0LmZpbmRBdHRyaWJ1dGUoXCIiCisgICAgICAgICAgICAgICAgICAgICAgICArIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIlwiKSwgXCIiCisgICAgICAgICAgICAgICAgICAgICAgICArIHByb3BlcnR5CisgICAgICAgICAgICAgICAgICAgICAgICArICJcIiwgcmVxdWVzdC5nZXRQYXJhbWV0ZXIoXCIiCisgICAgICAgICAgICAgICAgICAgICAgICArIHBhcmFtCisgICAgICAgICAgICAgICAgICAgICAgICArICJcIiksICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgInJlcXVlc3QsIFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBwYXJhbQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiXCIsIGZhbHNlKTsiKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaXNFeHByZXNzaW9uKCkpIHsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRpbCgKKyAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuamFzcGVyLnJ1bnRpbWUuSnNwUnVudGltZUxpYnJhcnkuaGFuZGxlU2V0UHJvcGVydHkoIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiX2pzcHhfcGFnZV9jb250ZXh0LmZpbmRBdHRyaWJ1dGUoXCIiCisgICAgICAgICAgICAgICAgICAgICAgICArIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIlwiKSwgXCIiCisgICAgICAgICAgICAgICAgICAgICAgICArIHByb3BlcnR5CisgICAgICAgICAgICAgICAgICAgICAgICArICJcIiwiKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoYXR0cmlidXRlVmFsdWUodmFsdWUsIGZhbHNlLCBudWxsKSk7CisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIik7Iik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmlzRUxJbnRlcnByZXRlcklucHV0KCkpIHsKKyAgICAgICAgICAgICAgICAvLyBXZSd2ZSBnb3QgdG8gcmVzb2x2ZSB0aGUgdmVyeSBjYWxsIHRvIHRoZSBpbnRlcnByZXRlcgorICAgICAgICAgICAgICAgIC8vIGF0IHJ1bnRpbWUgc2luY2Ugd2UgZG9uJ3Qga25vdyB3aGF0IHR5cGUgdG8gZXhwZWN0CisgICAgICAgICAgICAgICAgLy8gaW4gdGhlIGdlbmVyYWwgY2FzZTsgd2UgdGh1cyBjYW4ndCBoYXJkLXdpcmUgdGhlIGNhbGwKKyAgICAgICAgICAgICAgICAvLyBpbnRvIHRoZSBnZW5lcmF0ZWQgY29kZS4gIChYWFggV2UgY291bGQsIGhvd2V2ZXIsCisgICAgICAgICAgICAgICAgLy8gb3B0aW1pemUgdGhlIGNhc2Ugd2hlcmUgdGhlIGJlYW4gaXMgZXhwb3NlZCB3aXRoCisgICAgICAgICAgICAgICAgLy8gPGpzcDp1c2VCZWFuPiwgbXVjaCBhcyB0aGUgY29kZSBoZXJlIGRvZXMgZm9yCisgICAgICAgICAgICAgICAgLy8gZ2V0UHJvcGVydHkuKQorCisgICAgICAgICAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBob2xkcyB0cnVlIGZvciB0aGUgYXJndW1lbnRzIHBhc3NlZCB0bworICAgICAgICAgICAgICAgIC8vIEpzcFJ1bnRpbWVMaWJyYXJ5LmhhbmRsZVNldFByb3BlcnR5RXhwcmVzc2lvbigpOgorICAgICAgICAgICAgICAgIC8vIC0gJ3BhZ2VDb250ZXh0JyBpcyBhIFZhcmlhYmxlUmVzb2x2ZXIuCisgICAgICAgICAgICAgICAgLy8gLSAndGhpcycgKGVpdGhlciB0aGUgZ2VuZXJhdGVkIFNlcnZsZXQgb3IgdGhlIGdlbmVyYXRlZCB0YWcKKyAgICAgICAgICAgICAgICAvLyAgIGhhbmRsZXIgZm9yIFRhZyBmaWxlcykgaXMgYSBGdW5jdGlvbk1hcHBlci4KKyAgICAgICAgICAgICAgICBvdXQucHJpbnRpbCgKKyAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuamFzcGVyLnJ1bnRpbWUuSnNwUnVudGltZUxpYnJhcnkuaGFuZGxlU2V0UHJvcGVydHlFeHByZXNzaW9uKCIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIl9qc3B4X3BhZ2VfY29udGV4dC5maW5kQXR0cmlidXRlKFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICArICJcIiksIFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBwcm9wZXJ0eQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiXCIsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgcXVvdGUodmFsdWUuZ2V0VmFsdWUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiX2pzcHhfcGFnZV9jb250ZXh0LCAiCisgICAgICAgICAgICAgICAgICAgICAgICArIHZhbHVlLmdldEVMKCkuZ2V0TWFwTmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICArICIpOyIpOworICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pc05hbWVkQXR0cmlidXRlKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBJZiB0aGUgdmFsdWUgZm9yIHNldFByb3BlcnR5IHdhcyBzcGVjaWZpZWQgdmlhCisgICAgICAgICAgICAgICAgLy8ganNwOmF0dHJpYnV0ZSwgZmlyc3QgZ2VuZXJhdGUgY29kZSB0byBldmFsdWF0ZQorICAgICAgICAgICAgICAgIC8vIHRoYXQgYm9keS4KKyAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWVWYXJOYW1lID0KKyAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVOYW1lZEF0dHJpYnV0ZVZhbHVlKHZhbHVlLmdldE5hbWVkQXR0cmlidXRlTm9kZSgpKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRpbCgKKyAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuamFzcGVyLnJ1bnRpbWUuSnNwUnVudGltZUxpYnJhcnkuaW50cm9zcGVjdGhlbHBlcigiCisgICAgICAgICAgICAgICAgICAgICAgICArICJfanNweF9wYWdlX2NvbnRleHQuZmluZEF0dHJpYnV0ZShcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiXCIpLCBcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgcHJvcGVydHkKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIlwiLCAiCisgICAgICAgICAgICAgICAgICAgICAgICArIHZhbHVlVmFyTmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBudWxsLCBudWxsLCBmYWxzZSk7Iik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG91dC5wcmludGluKAorICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5qYXNwZXIucnVudGltZS5Kc3BSdW50aW1lTGlicmFyeS5pbnRyb3NwZWN0aGVscGVyKCIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIl9qc3B4X3BhZ2VfY29udGV4dC5maW5kQXR0cmlidXRlKFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICArICJcIiksIFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBwcm9wZXJ0eQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiXCIsICIpOworICAgICAgICAgICAgICAgIG91dC5wcmludChhdHRyaWJ1dGVWYWx1ZSh2YWx1ZSwgZmFsc2UsIG51bGwpKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiLCBudWxsLCBudWxsLCBmYWxzZSk7Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG4uc2V0RW5kSmF2YUxpbmUob3V0LmdldEphdmFMaW5lKCkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5Vc2VCZWFuIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IG4uZ2V0VGV4dEF0dHJpYnV0ZSgiaWQiKTsKKyAgICAgICAgICAgIFN0cmluZyBzY29wZSA9IG4uZ2V0VGV4dEF0dHJpYnV0ZSgic2NvcGUiKTsKKyAgICAgICAgICAgIFN0cmluZyBrbGFzcyA9IG4uZ2V0VGV4dEF0dHJpYnV0ZSgiY2xhc3MiKTsKKyAgICAgICAgICAgIFN0cmluZyB0eXBlID0gbi5nZXRUZXh0QXR0cmlidXRlKCJ0eXBlIik7CisgICAgICAgICAgICBOb2RlLkpzcEF0dHJpYnV0ZSBiZWFuTmFtZSA9IG4uZ2V0QmVhbk5hbWUoKTsKKworICAgICAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkgLy8gaWYgdW5zcGVjaWZpZWQsIHVzZSBjbGFzcyBhcyB0eXBlIG9mIGJlYW4KKyAgICAgICAgICAgICAgICB0eXBlID0ga2xhc3M7CisKKyAgICAgICAgICAgIFN0cmluZyBzY29wZW5hbWUgPSAiUGFnZUNvbnRleHQuUEFHRV9TQ09QRSI7IC8vIERlZmF1bHQgdG8gcGFnZQorICAgICAgICAgICAgU3RyaW5nIGxvY2sgPSAiX2pzcHhfcGFnZV9jb250ZXh0IjsKKworICAgICAgICAgICAgaWYgKCJyZXF1ZXN0Ii5lcXVhbHMoc2NvcGUpKSB7CisgICAgICAgICAgICAgICAgc2NvcGVuYW1lID0gIlBhZ2VDb250ZXh0LlJFUVVFU1RfU0NPUEUiOworICAgICAgICAgICAgICAgIGxvY2sgPSAicmVxdWVzdCI7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCJzZXNzaW9uIi5lcXVhbHMoc2NvcGUpKSB7CisgICAgICAgICAgICAgICAgc2NvcGVuYW1lID0gIlBhZ2VDb250ZXh0LlNFU1NJT05fU0NPUEUiOworICAgICAgICAgICAgICAgIGxvY2sgPSAic2Vzc2lvbiI7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCJhcHBsaWNhdGlvbiIuZXF1YWxzKHNjb3BlKSkgeworICAgICAgICAgICAgICAgIHNjb3BlbmFtZSA9ICJQYWdlQ29udGV4dC5BUFBMSUNBVElPTl9TQ09QRSI7CisgICAgICAgICAgICAgICAgbG9jayA9ICJhcHBsaWNhdGlvbiI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG4uc2V0QmVnaW5KYXZhTGluZShvdXQuZ2V0SmF2YUxpbmUoKSk7CisKKyAgICAgICAgICAgIC8vIERlY2xhcmUgYmVhbgorICAgICAgICAgICAgb3V0LnByaW50aW4odHlwZSk7CisgICAgICAgICAgICBvdXQucHJpbnQoJyAnKTsKKyAgICAgICAgICAgIG91dC5wcmludChuYW1lKTsKKyAgICAgICAgICAgIG91dC5wcmludGxuKCIgPSBudWxsOyIpOworCisgICAgICAgICAgICAvLyBMb2NrIHdoaWxlIGdldHRpbmcgb3IgY3JlYXRpbmcgYmVhbgorICAgICAgICAgICAgb3V0LnByaW50aW4oInN5bmNocm9uaXplZCAoIik7CisgICAgICAgICAgICBvdXQucHJpbnQobG9jayk7CisgICAgICAgICAgICBvdXQucHJpbnRsbigiKSB7Iik7CisgICAgICAgICAgICBvdXQucHVzaEluZGVudCgpOworCisgICAgICAgICAgICAvLyBMb2NhdGUgYmVhbiBmcm9tIGNvbnRleHQKKyAgICAgICAgICAgIG91dC5wcmludGluKG5hbWUpOworICAgICAgICAgICAgb3V0LnByaW50KCIgPSAoIik7CisgICAgICAgICAgICBvdXQucHJpbnQodHlwZSk7CisgICAgICAgICAgICBvdXQucHJpbnQoIikgX2pzcHhfcGFnZV9jb250ZXh0LmdldEF0dHJpYnV0ZSgiKTsKKyAgICAgICAgICAgIG91dC5wcmludChxdW90ZShuYW1lKSk7CisgICAgICAgICAgICBvdXQucHJpbnQoIiwgIik7CisgICAgICAgICAgICBvdXQucHJpbnQoc2NvcGVuYW1lKTsKKyAgICAgICAgICAgIG91dC5wcmludGxuKCIpOyIpOworCisgICAgICAgICAgICAvLyBDcmVhdGUgYmVhbgorICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIENoZWNrIGlmIGJlYW4gaXMgYWxyZWR5IHRoZXJlCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIG91dC5wcmludGluKCJpZiAoIik7CisgICAgICAgICAgICBvdXQucHJpbnQobmFtZSk7CisgICAgICAgICAgICBvdXQucHJpbnRsbigiID09IG51bGwpeyIpOworICAgICAgICAgICAgb3V0LnB1c2hJbmRlbnQoKTsKKyAgICAgICAgICAgIGlmIChrbGFzcyA9PSBudWxsICYmIGJlYW5OYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIElmIGJvdGggY2xhc3MgbmFtZSBhbmQgYmVhbk5hbWUgaXMgbm90IHNwZWNpZmllZCwgdGhlIGJlYW4KKyAgICAgICAgICAgICAgICAgKiBtdXN0IGJlIGZvdW5kIGxvY2FsbHksIG90aGVyd2lzZSBpdCdzIGFuIGVycm9yCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgb3V0LnByaW50aW4oCisgICAgICAgICAgICAgICAgICAgICJ0aHJvdyBuZXcgamF2YS5sYW5nLkluc3RhbnRpYXRpb25FeGNlcHRpb24oXCJiZWFuICIpOworICAgICAgICAgICAgICAgIG91dC5wcmludChuYW1lKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiIG5vdCBmb3VuZCB3aXRoaW4gc2NvcGVcIik7Iik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogSW5zdGFudGlhdGUgdGhlIGJlYW4gaWYgaXQgaXMgbm90IGluIHRoZSBzcGVjaWZpZWQgc2NvcGUuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgYm9vbGVhbiBnZW5lcmF0ZU5ldyA9IGZhbHNlOworICAgICAgICAgICAgICAgIGlmIChiZWFuTmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyBiZWFuID0gY3R4dC5nZXRDbGFzc0xvYWRlcigpLmxvYWRDbGFzcyhrbGFzcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW9kaWZpZXJzID0gYmVhbi5nZXRNb2RpZmllcnMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghTW9kaWZpZXIuaXNQdWJsaWMobW9kaWZpZXJzKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZGlmaWVyLmlzSW50ZXJmYWNlKG1vZGlmaWVycykgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RpZmllci5pc0Fic3RyYWN0KG1vZGlmaWVycykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJJbnZhbGlkIGJlYW4gY2xhc3MgbW9kaWZpZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIHRoYXQgdGhlcmUgaXMgYSAwIGFyZyBjb25zdHJ1Y3RvcgorICAgICAgICAgICAgICAgICAgICAgICAgYmVhbi5nZXRDb25zdHJ1Y3RvcihuZXcgQ2xhc3NbXSB7fSk7CisgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZU5ldyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBDYW5ub3QgaW5zdGFudGlhdGUgdGhlIHNwZWNpZmllZCBjbGFzcworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN0eHQuZ2V0T3B0aW9ucygpLmdldEVycm9yT25Vc2VCZWFuSW52YWxpZENsYXNzQXR0cmlidXRlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIuanNwRXJyb3IobiwgImpzcC5lcnJvci5pbnZhbGlkLmJlYW4iLCBrbGFzcyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFnZW5lcmF0ZU5ldykgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lOworICAgICAgICAgICAgICAgICAgICBpZiAoYmVhbk5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJlYW5OYW1lLmlzTmFtZWRBdHRyaWJ1dGUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSB2YWx1ZSBmb3IgYmVhbk5hbWUgd2FzIHNwZWNpZmllZCB2aWEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBqc3A6YXR0cmlidXRlLCBmaXJzdCBnZW5lcmF0ZSBjb2RlIHRvIGV2YWx1YXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCBib2R5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlTmFtZWRBdHRyaWJ1dGVWYWx1ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlYW5OYW1lLmdldE5hbWVkQXR0cmlidXRlTm9kZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUoYmVhbk5hbWUsIGZhbHNlLCBTdHJpbmcuY2xhc3MpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW1wbGllcyBrbGFzcyBpcyBub3QgbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gcXVvdGUoa2xhc3MpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGlsKCJ0cnkgeyIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHVzaEluZGVudCgpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRpbihuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KCIgPSAoIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCh0eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KCIpIGphdmEuYmVhbnMuQmVhbnMuaW5zdGFudGlhdGUoIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCgidGhpcy5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCksICIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoY2xhc3NOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIik7Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wb3BJbmRlbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICogTm90ZTogQmVhbnMuaW5zdGFudGlhdGUgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgICogaWYgdGhlIGJlYW4gY2xhc3MgaXMgYWJzdHJhY3QuCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRpbCgifSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBleGMpIHsiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnB1c2hJbmRlbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50aWwoCisgICAgICAgICAgICAgICAgICAgICAgICAidGhyb3cgbmV3IEluc3RhbnRpYXRpb25FeGNlcHRpb24oZXhjLmdldE1lc3NhZ2UoKSk7Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wb3BJbmRlbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50aWwoIn0gY2F0Y2ggKEV4Y2VwdGlvbiBleGMpIHsiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnB1c2hJbmRlbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50aW4oInRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uKCIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoIlwiQ2Fubm90IGNyZWF0ZSBiZWFuIG9mIGNsYXNzIFwiICsgIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludChjbGFzc05hbWUpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiLCBleGMpOyIpOworICAgICAgICAgICAgICAgICAgICBvdXQucG9wSW5kZW50KCk7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGlsKCJ9Iik7IC8vIGNsb3NlIG9mIHRyeQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEltcGxpZXMga2xhc3MgaXMgbm90IG51bGwKKyAgICAgICAgICAgICAgICAgICAgLy8gR2VuZXJhdGUgY29kZXMgdG8gaW5zdGFudGlhdGUgdGhlIGJlYW4gY2xhc3MKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50aW4obmFtZSk7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCgiID0gbmV3ICIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoa2xhc3MpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiKCk7Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogU2V0IGF0dHJpYnV0ZSBmb3IgYmVhbiBpbiB0aGUgc3BlY2lmaWVkIHNjb3BlCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgb3V0LnByaW50aW4oIl9qc3B4X3BhZ2VfY29udGV4dC5zZXRBdHRyaWJ1dGUoIik7CisgICAgICAgICAgICAgICAgb3V0LnByaW50KHF1b3RlKG5hbWUpKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoIiwgIik7CisgICAgICAgICAgICAgICAgb3V0LnByaW50KG5hbWUpOworICAgICAgICAgICAgICAgIG91dC5wcmludCgiLCAiKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoc2NvcGVuYW1lKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiKTsiKTsKKworICAgICAgICAgICAgICAgIC8vIE9ubHkgdmlzaXQgdGhlIGJvZHkgd2hlbiBiZWFuIGlzIGluc3RhbnRpYXRlZAorICAgICAgICAgICAgICAgIHZpc2l0Qm9keShuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dC5wb3BJbmRlbnQoKTsKKyAgICAgICAgICAgIG91dC5wcmludGlsKCJ9Iik7CisKKyAgICAgICAgICAgIC8vIEVuZCBvZiBsb2NrIGJsb2NrCisgICAgICAgICAgICBvdXQucG9wSW5kZW50KCk7CisgICAgICAgICAgICBvdXQucHJpbnRpbCgifSIpOworCisgICAgICAgICAgICBuLnNldEVuZEphdmFMaW5lKG91dC5nZXRKYXZhTGluZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcmV0dXJuIGEgc3RyaW5nIGZvciB0aGUgZm9ybSAnYXR0ciA9ICJ2YWx1ZSInCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIFN0cmluZyBtYWtlQXR0cihTdHJpbmcgYXR0ciwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gIiI7CisKKyAgICAgICAgICAgIHJldHVybiAiICIgKyBhdHRyICsgIj1cIiIgKyB2YWx1ZSArICdcIic7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLlBsdWdJbiBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBBIHZpc2l0b3IgdG8gaGFuZGxlIDxqc3A6cGFyYW0+IGluIGEgcGx1Z2luCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGNsYXNzIFBhcmFtVmlzaXRvciBleHRlbmRzIE5vZGUuVmlzaXRvciB7CisKKyAgICAgICAgICAgICAgICBwcml2YXRlIGJvb2xlYW4gaWU7CisKKyAgICAgICAgICAgICAgICBQYXJhbVZpc2l0b3IoYm9vbGVhbiBpZSkgeworICAgICAgICAgICAgICAgICAgICB0aGlzLmllID0gaWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5QYXJhbUFjdGlvbiBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IG4uZ2V0VGV4dEF0dHJpYnV0ZSgibmFtZSIpOworICAgICAgICAgICAgICAgICAgICBpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJvYmplY3QiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiamF2YV9vYmplY3QiOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoInR5cGUiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiamF2YV90eXBlIjsKKworICAgICAgICAgICAgICAgICAgICBuLnNldEJlZ2luSmF2YUxpbmUob3V0LmdldEphdmFMaW5lKCkpOworICAgICAgICAgICAgICAgICAgICAvLyBYWFggLSBGaXhlZCBhIGJ1ZyBoZXJlIC0gdmFsdWUgdXNlZCB0byBiZSBvdXRwdXQKKyAgICAgICAgICAgICAgICAgICAgLy8gaW5saW5lLCB3aGljaCBpcyBvbmx5IG9rYXkgaWYgdmFsdWUgaXMgbm90IGFuIEVMCisgICAgICAgICAgICAgICAgICAgIC8vIGV4cHJlc3Npb24uICBBbHNvLCBrZXkvdmFsdWUgcGFpcnMgZm9yIHRoZQorICAgICAgICAgICAgICAgICAgICAvLyBlbWJlZCB0YWcgd2VyZSBub3QgYmVpbmcgZ2VuZXJhdGVkIGNvcnJlY3RseS4KKyAgICAgICAgICAgICAgICAgICAgLy8gRG91YmxlIGNoZWNrIHRoYXQgdGhpcyBpcyBub3cgdGhlIGNvcnJlY3QgYmVoYXZpb3IuCisgICAgICAgICAgICAgICAgICAgIGlmIChpZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2Ugd2FudCBzb21ldGhpbmcgb2YgdGhlIGZvcm0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG91dC5wcmludGxuKCAiPFBBUkFNIG5hbWU9XCJibGFoXCIKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICB2YWx1ZT1cIiIgKyAuLi4gKyAiXCI+IiApOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50aWwoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm91dC53cml0ZSggXCI8UEFSQU0gbmFtZT1cXFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGVzY2FwZShuYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJcXFwiIHZhbHVlPVxcXCJcIiArICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBhdHRyaWJ1dGVWYWx1ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4uZ2V0VmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgKyBcIlxcXCI+XCIgKTsiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGlsKCJvdXQud3JpdGUoXCJcXG5cIik7Iik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSB3YW50IHNvbWV0aGluZyBvZiB0aGUgZm9ybQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3V0LnByaW50KCAiIGJsYWg9XCIiICsgLi4uICsgIlwiIiApOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50aWwoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm91dC53cml0ZSggXCIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGVzY2FwZShuYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICI9XFxcIlwiICsgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGF0dHJpYnV0ZVZhbHVlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5nZXRWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiArIFwiXFxcIlwiICk7Iik7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBuLnNldEVuZEphdmFMaW5lKG91dC5nZXRKYXZhTGluZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0cmluZyB0eXBlID0gbi5nZXRUZXh0QXR0cmlidXRlKCJ0eXBlIik7CisgICAgICAgICAgICBTdHJpbmcgY29kZSA9IG4uZ2V0VGV4dEF0dHJpYnV0ZSgiY29kZSIpOworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBuLmdldFRleHRBdHRyaWJ1dGUoIm5hbWUiKTsKKyAgICAgICAgICAgIE5vZGUuSnNwQXR0cmlidXRlIGhlaWdodCA9IG4uZ2V0SGVpZ2h0KCk7CisgICAgICAgICAgICBOb2RlLkpzcEF0dHJpYnV0ZSB3aWR0aCA9IG4uZ2V0V2lkdGgoKTsKKyAgICAgICAgICAgIFN0cmluZyBoc3BhY2UgPSBuLmdldFRleHRBdHRyaWJ1dGUoImhzcGFjZSIpOworICAgICAgICAgICAgU3RyaW5nIHZzcGFjZSA9IG4uZ2V0VGV4dEF0dHJpYnV0ZSgidnNwYWNlIik7CisgICAgICAgICAgICBTdHJpbmcgYWxpZ24gPSBuLmdldFRleHRBdHRyaWJ1dGUoImFsaWduIik7CisgICAgICAgICAgICBTdHJpbmcgaWVwbHVnaW51cmwgPSBuLmdldFRleHRBdHRyaWJ1dGUoImllcGx1Z2ludXJsIik7CisgICAgICAgICAgICBTdHJpbmcgbnNwbHVnaW51cmwgPSBuLmdldFRleHRBdHRyaWJ1dGUoIm5zcGx1Z2ludXJsIik7CisgICAgICAgICAgICBTdHJpbmcgY29kZWJhc2UgPSBuLmdldFRleHRBdHRyaWJ1dGUoImNvZGViYXNlIik7CisgICAgICAgICAgICBTdHJpbmcgYXJjaGl2ZSA9IG4uZ2V0VGV4dEF0dHJpYnV0ZSgiYXJjaGl2ZSIpOworICAgICAgICAgICAgU3RyaW5nIGpyZXZlcnNpb24gPSBuLmdldFRleHRBdHRyaWJ1dGUoImpyZXZlcnNpb24iKTsKKworICAgICAgICAgICAgU3RyaW5nIHdpZHRoU3RyID0gbnVsbDsKKyAgICAgICAgICAgIGlmICh3aWR0aCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKHdpZHRoLmlzTmFtZWRBdHRyaWJ1dGUoKSkgeworICAgICAgICAgICAgICAgICAgICB3aWR0aFN0ciA9CisgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZU5hbWVkQXR0cmlidXRlVmFsdWUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGguZ2V0TmFtZWRBdHRyaWJ1dGVOb2RlKCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHdpZHRoU3RyID0gYXR0cmlidXRlVmFsdWUod2lkdGgsIGZhbHNlLCBTdHJpbmcuY2xhc3MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RyaW5nIGhlaWdodFN0ciA9IG51bGw7CisgICAgICAgICAgICBpZiAoaGVpZ2h0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAoaGVpZ2h0LmlzTmFtZWRBdHRyaWJ1dGUoKSkgeworICAgICAgICAgICAgICAgICAgICBoZWlnaHRTdHIgPQorICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVOYW1lZEF0dHJpYnV0ZVZhbHVlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodC5nZXROYW1lZEF0dHJpYnV0ZU5vZGUoKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaGVpZ2h0U3RyID0gYXR0cmlidXRlVmFsdWUoaGVpZ2h0LCBmYWxzZSwgU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChpZXBsdWdpbnVybCA9PSBudWxsKQorICAgICAgICAgICAgICAgIGllcGx1Z2ludXJsID0gQ29uc3RhbnRzLklFX1BMVUdJTl9VUkw7CisgICAgICAgICAgICBpZiAobnNwbHVnaW51cmwgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBuc3BsdWdpbnVybCA9IENvbnN0YW50cy5OU19QTFVHSU5fVVJMOworCisgICAgICAgICAgICBuLnNldEJlZ2luSmF2YUxpbmUob3V0LmdldEphdmFMaW5lKCkpOworCisgICAgICAgICAgICAvLyBJZiBhbnkgb2YgdGhlIHBhcmFtcyBoYXZlIHRoZWlyIHZhbHVlcyBzcGVjaWZpZWQgYnkKKyAgICAgICAgICAgIC8vIGpzcDphdHRyaWJ1dGUsIHByZXBhcmUgdGhvc2UgdmFsdWVzIGZpcnN0LgorICAgICAgICAgICAgLy8gTG9vayBmb3IgYSBwYXJhbXMgbm9kZSBhbmQgcHJlcGFyZSBpdHMgcGFyYW0gc3ViZWxlbWVudHM6CisgICAgICAgICAgICBOb2RlLkpzcEJvZHkganNwQm9keSA9IGZpbmRKc3BCb2R5KG4pOworICAgICAgICAgICAgaWYgKGpzcEJvZHkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIE5vZGUuTm9kZXMgc3ViZWxlbWVudHMgPSBqc3BCb2R5LmdldEJvZHkoKTsKKyAgICAgICAgICAgICAgICBpZiAoc3ViZWxlbWVudHMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN1YmVsZW1lbnRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBOb2RlIG0gPSBzdWJlbGVtZW50cy5nZXROb2RlKGkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG0gaW5zdGFuY2VvZiBOb2RlLlBhcmFtc0FjdGlvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXBhcmVQYXJhbXMobSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFhYWCAtIEZpeGVkIGEgYnVnIGhlcmUgLSB3aWR0aCBhbmQgaGVpZ2h0IGNhbiBiZSBzZXQKKyAgICAgICAgICAgIC8vIGR5bmFtaWNhbGx5LiAgRG91YmxlLWNoZWNrIGlmIHRoaXMgZ2VuZXJhdGlvbiBpcyBjb3JyZWN0LgorCisgICAgICAgICAgICAvLyBJRSBzdHlsZSBwbHVnaW4KKyAgICAgICAgICAgIC8vIDxPQkpFQ1QgLi4uPgorICAgICAgICAgICAgLy8gRmlyc3QgY29tcG9zZSB0aGUgcnVudGltZSBvdXRwdXQgc3RyaW5nCisgICAgICAgICAgICBTdHJpbmcgczAgPSAiPE9CSkVDVCIKKyAgICAgICAgICAgICAgICAgICAgKyBtYWtlQXR0cigiY2xhc3NpZCIsIGN0eHQuZ2V0T3B0aW9ucygpLmdldEllQ2xhc3NJZCgpKQorICAgICAgICAgICAgICAgICAgICArIG1ha2VBdHRyKCJuYW1lIiwgbmFtZSk7CisKKyAgICAgICAgICAgIFN0cmluZyBzMSA9ICIiOworICAgICAgICAgICAgaWYgKHdpZHRoICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzMSA9ICIgKyBcIiB3aWR0aD1cXFwiXCIgKyAiICsgd2lkdGhTdHIgKyAiICsgXCJcXFwiXCIiOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdHJpbmcgczIgPSAiIjsKKyAgICAgICAgICAgIGlmIChoZWlnaHQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHMyID0gIiArIFwiIGhlaWdodD1cXFwiXCIgKyAiICsgaGVpZ2h0U3RyICsgIiArIFwiXFxcIlwiIjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RyaW5nIHMzID0gbWFrZUF0dHIoImhzcGFjZSIsIGhzcGFjZSkKKyAgICAgICAgICAgICAgICAgICAgKyBtYWtlQXR0cigidnNwYWNlIiwgdnNwYWNlKQorICAgICAgICAgICAgICAgICAgICArIG1ha2VBdHRyKCJhbGlnbiIsIGFsaWduKQorICAgICAgICAgICAgICAgICAgICArIG1ha2VBdHRyKCJjb2RlYmFzZSIsIGllcGx1Z2ludXJsKQorICAgICAgICAgICAgICAgICAgICArICc+JzsKKworICAgICAgICAgICAgLy8gVGhlbiBwcmludCB0aGUgb3V0cHV0IHN0cmluZyB0byB0aGUgamF2YSBmaWxlCisgICAgICAgICAgICBvdXQucHJpbnRpbCgKKyAgICAgICAgICAgICAgICAib3V0LndyaXRlKCIgKyBxdW90ZShzMCkgKyBzMSArIHMyICsgIiArICIgKyBxdW90ZShzMykgKyAiKTsiKTsKKyAgICAgICAgICAgIG91dC5wcmludGlsKCJvdXQud3JpdGUoXCJcXG5cIik7Iik7CisKKyAgICAgICAgICAgIC8vIDxQQVJBTSA+IGZvciBqYXZhX2NvZGUKKyAgICAgICAgICAgIHMwID0gIjxQQVJBTSBuYW1lPVwiamF2YV9jb2RlXCIiICsgbWFrZUF0dHIoInZhbHVlIiwgY29kZSkgKyAnPic7CisgICAgICAgICAgICBvdXQucHJpbnRpbCgib3V0LndyaXRlKCIgKyBxdW90ZShzMCkgKyAiKTsiKTsKKyAgICAgICAgICAgIG91dC5wcmludGlsKCJvdXQud3JpdGUoXCJcXG5cIik7Iik7CisKKyAgICAgICAgICAgIC8vIDxQQVJBTSA+IGZvciBqYXZhX2NvZGViYXNlCisgICAgICAgICAgICBpZiAoY29kZWJhc2UgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHMwID0gIjxQQVJBTSBuYW1lPVwiamF2YV9jb2RlYmFzZVwiIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBtYWtlQXR0cigidmFsdWUiLCBjb2RlYmFzZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICsgJz4nOworICAgICAgICAgICAgICAgIG91dC5wcmludGlsKCJvdXQud3JpdGUoIiArIHF1b3RlKHMwKSArICIpOyIpOworICAgICAgICAgICAgICAgIG91dC5wcmludGlsKCJvdXQud3JpdGUoXCJcXG5cIik7Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIDxQQVJBTSA+IGZvciBqYXZhX2FyY2hpdmUKKyAgICAgICAgICAgIGlmIChhcmNoaXZlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzMCA9ICI8UEFSQU0gbmFtZT1cImphdmFfYXJjaGl2ZVwiIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBtYWtlQXR0cigidmFsdWUiLCBhcmNoaXZlKQorICAgICAgICAgICAgICAgICAgICAgICAgKyAnPic7CisgICAgICAgICAgICAgICAgb3V0LnByaW50aWwoIm91dC53cml0ZSgiICsgcXVvdGUoczApICsgIik7Iik7CisgICAgICAgICAgICAgICAgb3V0LnByaW50aWwoIm91dC53cml0ZShcIlxcblwiKTsiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gPFBBUkFNID4gZm9yIHR5cGUKKyAgICAgICAgICAgIHMwID0gIjxQQVJBTSBuYW1lPVwidHlwZVwiIgorICAgICAgICAgICAgICAgICAgICArIG1ha2VBdHRyKAorICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi94LWphdmEtIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKGpyZXZlcnNpb24gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAiIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJ2ZXJzaW9uPSIgKyBqcmV2ZXJzaW9uKSkKKyAgICAgICAgICAgICAgICAgICAgKyAnPic7CisgICAgICAgICAgICBvdXQucHJpbnRpbCgib3V0LndyaXRlKCIgKyBxdW90ZShzMCkgKyAiKTsiKTsKKyAgICAgICAgICAgIG91dC5wcmludGlsKCJvdXQud3JpdGUoXCJcXG5cIik7Iik7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBnZW5lcmF0ZSBhIDxQQVJBTT4gZm9yIGVhY2ggPGpzcDpwYXJhbT4gaW4gdGhlIHBsdWdpbiBib2R5CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChuLmdldEJvZHkoKSAhPSBudWxsKQorICAgICAgICAgICAgICAgIG4uZ2V0Qm9keSgpLnZpc2l0KG5ldyBQYXJhbVZpc2l0b3IodHJ1ZSkpOworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogTmV0c2NhcGUgc3R5bGUgcGx1Z2luIHBhcnQKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgb3V0LnByaW50aWwoIm91dC53cml0ZSgiICsgcXVvdGUoIjxDT01NRU5UPiIpICsgIik7Iik7CisgICAgICAgICAgICBvdXQucHJpbnRpbCgib3V0LndyaXRlKFwiXFxuXCIpOyIpOworICAgICAgICAgICAgczAgPSAiPEVNQkVEIgorICAgICAgICAgICAgICAgICAgICArIG1ha2VBdHRyKAorICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3gtamF2YS0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0eXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiOyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgoanJldmVyc2lvbiA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogInZlcnNpb249IiArIGpyZXZlcnNpb24pKQorICAgICAgICAgICAgICAgICAgICArIG1ha2VBdHRyKCJuYW1lIiwgbmFtZSk7CisKKyAgICAgICAgICAgIC8vIHMxIGFuZCBzMiBhcmUgdGhlIHNhbWUgYXMgYmVmb3JlLgorCisgICAgICAgICAgICBzMyA9IG1ha2VBdHRyKCJoc3BhY2UiLCBoc3BhY2UpCisgICAgICAgICAgICAgICAgICAgICsgbWFrZUF0dHIoInZzcGFjZSIsIHZzcGFjZSkKKyAgICAgICAgICAgICAgICAgICAgKyBtYWtlQXR0cigiYWxpZ24iLCBhbGlnbikKKyAgICAgICAgICAgICAgICAgICAgKyBtYWtlQXR0cigicGx1Z2luc3BhZ2UiLCBuc3BsdWdpbnVybCkKKyAgICAgICAgICAgICAgICAgICAgKyBtYWtlQXR0cigiamF2YV9jb2RlIiwgY29kZSkKKyAgICAgICAgICAgICAgICAgICAgKyBtYWtlQXR0cigiamF2YV9jb2RlYmFzZSIsIGNvZGViYXNlKQorICAgICAgICAgICAgICAgICAgICArIG1ha2VBdHRyKCJqYXZhX2FyY2hpdmUiLCBhcmNoaXZlKTsKKyAgICAgICAgICAgIG91dC5wcmludGlsKAorICAgICAgICAgICAgICAgICJvdXQud3JpdGUoIiArIHF1b3RlKHMwKSArIHMxICsgczIgKyAiICsgIiArIHF1b3RlKHMzKSArICIpOyIpOworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogR2VuZXJhdGUgYSAnYXR0ciA9ICJ2YWx1ZSInIGZvciBlYWNoIDxqc3A6cGFyYW0+IGluIHBsdWdpbiBib2R5CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChuLmdldEJvZHkoKSAhPSBudWxsKQorICAgICAgICAgICAgICAgIG4uZ2V0Qm9keSgpLnZpc2l0KG5ldyBQYXJhbVZpc2l0b3IoZmFsc2UpKTsKKworICAgICAgICAgICAgb3V0LnByaW50aWwoIm91dC53cml0ZSgiICsgcXVvdGUoIi8+IikgKyAiKTsiKTsKKyAgICAgICAgICAgIG91dC5wcmludGlsKCJvdXQud3JpdGUoXCJcXG5cIik7Iik7CisKKyAgICAgICAgICAgIG91dC5wcmludGlsKCJvdXQud3JpdGUoIiArIHF1b3RlKCI8Tk9FTUJFRD4iKSArICIpOyIpOworICAgICAgICAgICAgb3V0LnByaW50aWwoIm91dC53cml0ZShcIlxcblwiKTsiKTsKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIEZhbGxiYWNrCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChuLmdldEJvZHkoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdmlzaXRCb2R5KG4pOworICAgICAgICAgICAgICAgIG91dC5wcmludGlsKCJvdXQud3JpdGUoXCJcXG5cIik7Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG91dC5wcmludGlsKCJvdXQud3JpdGUoIiArIHF1b3RlKCI8L05PRU1CRUQ+IikgKyAiKTsiKTsKKyAgICAgICAgICAgIG91dC5wcmludGlsKCJvdXQud3JpdGUoXCJcXG5cIik7Iik7CisKKyAgICAgICAgICAgIG91dC5wcmludGlsKCJvdXQud3JpdGUoIiArIHF1b3RlKCI8L0NPTU1FTlQ+IikgKyAiKTsiKTsKKyAgICAgICAgICAgIG91dC5wcmludGlsKCJvdXQud3JpdGUoXCJcXG5cIik7Iik7CisKKyAgICAgICAgICAgIG91dC5wcmludGlsKCJvdXQud3JpdGUoIiArIHF1b3RlKCI8L09CSkVDVD4iKSArICIpOyIpOworICAgICAgICAgICAgb3V0LnByaW50aWwoIm91dC53cml0ZShcIlxcblwiKTsiKTsKKworICAgICAgICAgICAgbi5zZXRFbmRKYXZhTGluZShvdXQuZ2V0SmF2YUxpbmUoKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLk5hbWVkQXR0cmlidXRlIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgLy8gRG9uJ3QgdmlzaXQgYm9keSBvZiB0aGlzIHRhZyAtIHdlIGFscmVhZHkgZGlkIGVhcmxpZXIuCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLkN1c3RvbVRhZyBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKworICAgICAgICAgICAgLy8gVXNlIHBsdWdpbiB0byBnZW5lcmF0ZSBtb3JlIGVmZmljaWVudCBjb2RlIGlmIHRoZXJlIGlzIG9uZS4KKyAgICAgICAgICAgIGlmIChuLnVzZVRhZ1BsdWdpbigpKSB7CisgICAgICAgICAgICAgICAgZ2VuZXJhdGVUYWdQbHVnaW4obik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBUYWdIYW5kbGVySW5mbyBoYW5kbGVySW5mbyA9IGdldFRhZ0hhbmRsZXJJbmZvKG4pOworCisgICAgICAgICAgICAvLyBDcmVhdGUgdmFyaWFibGUgbmFtZXMKKyAgICAgICAgICAgIFN0cmluZyBiYXNlVmFyID0KKyAgICAgICAgICAgICAgICBjcmVhdGVUYWdWYXJOYW1lKG4uZ2V0UU5hbWUoKSwgbi5nZXRQcmVmaXgoKSwgbi5nZXRMb2NhbE5hbWUoKSk7CisgICAgICAgICAgICBTdHJpbmcgdGFnRXZhbFZhciA9ICJfanNweF9ldmFsXyIgKyBiYXNlVmFyOworICAgICAgICAgICAgU3RyaW5nIHRhZ0hhbmRsZXJWYXIgPSAiX2pzcHhfdGhfIiArIGJhc2VWYXI7CisgICAgICAgICAgICBTdHJpbmcgdGFnUHVzaEJvZHlDb3VudFZhciA9ICJfanNweF9wdXNoX2JvZHlfY291bnRfIiArIGJhc2VWYXI7CisKKyAgICAgICAgICAgIC8vIElmIHRoZSB0YWcgY29udGFpbnMgbm8gc2NyaXB0aW5nIGVsZW1lbnQsIGdlbmVyYXRlIGl0cyBjb2RlcworICAgICAgICAgICAgLy8gdG8gYSBtZXRob2QuCisgICAgICAgICAgICBTZXJ2bGV0V3JpdGVyIG91dFNhdmUgPSBudWxsOworICAgICAgICAgICAgTm9kZS5DaGlsZEluZm8gY2kgPSBuLmdldENoaWxkSW5mbygpOworICAgICAgICAgICAgaWYgKGNpLmlzU2NyaXB0bGVzcygpICYmICFjaS5oYXNTY3JpcHRpbmdWYXJzKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgdGFnIGhhbmRsZXIgYW5kIGl0cyBib2R5IGNvZGUgY2FuIHJlc2lkZSBpbiBhIHNlcGFyYXRlCisgICAgICAgICAgICAgICAgLy8gbWV0aG9kIGlmIGl0IGlzIHNjcmlwdGxlc3MgYW5kIGRvZXMgbm90IGhhdmUgYW55IHNjcmlwdGluZworICAgICAgICAgICAgICAgIC8vIHZhcmlhYmxlIGRlZmluZWQuCisKKyAgICAgICAgICAgICAgICBTdHJpbmcgdGFnTWV0aG9kID0gIl9qc3B4X21ldGhfIiArIGJhc2VWYXI7CisKKyAgICAgICAgICAgICAgICAvLyBHZW5lcmF0ZSBhIGNhbGwgdG8gdGhpcyBtZXRob2QKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRpbigiaWYgKCIpOworICAgICAgICAgICAgICAgIG91dC5wcmludCh0YWdNZXRob2QpOworICAgICAgICAgICAgICAgIG91dC5wcmludCgiKCIpOworICAgICAgICAgICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQocGFyZW50KTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KCIsICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoIl9qc3B4X3BhZ2VfY29udGV4dCIpOworICAgICAgICAgICAgICAgIGlmIChwdXNoQm9keUNvdW50VmFyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KCIsICIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQocHVzaEJvZHlDb3VudFZhcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCIpKSIpOworICAgICAgICAgICAgICAgIG91dC5wdXNoSW5kZW50KCk7CisgICAgICAgICAgICAgICAgb3V0LnByaW50aWwoKG1ldGhvZE5lc3RpbmcgPiAwKSA/ICJyZXR1cm4gdHJ1ZTsiIDogInJldHVybjsiKTsKKyAgICAgICAgICAgICAgICBvdXQucG9wSW5kZW50KCk7CisKKyAgICAgICAgICAgICAgICAvLyBTZXQgdXAgbmV3IGJ1ZmZlciBmb3IgdGhlIG1ldGhvZAorICAgICAgICAgICAgICAgIG91dFNhdmUgPSBvdXQ7CisgICAgICAgICAgICAgICAgLyogRm9yIGZyYWdtZW50cywgdGhlaXIgYm9kaWVzIHdpbGwgYmUgZ2VuZXJhdGVkIGluIGZyYWdtZW50CisgICAgICAgICAgICAgICAgICAgaGVscGVyIGNsYXNzZXMsIGFuZCB0aGUgSmF2YSBsaW5lIGFkanVzdG1lbnRzIHdpbGwgYmUgZG9uZQorICAgICAgICAgICAgICAgICAgIHRoZXJlLCBoZW5jZSB0aGV5IGFyZSBzZXQgdG8gbnVsbCBoZXJlIHRvIGF2b2lkIGRvdWJsZQorICAgICAgICAgICAgICAgICAgIGFkanVzdG1lbnRzLgorICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgR2VuQnVmZmVyIGdlbkJ1ZmZlciA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBHZW5CdWZmZXIobiwgbi5pbXBsZW1lbnRzU2ltcGxlVGFnKCk/IG51bGw6IG4uZ2V0Qm9keSgpKTsKKyAgICAgICAgICAgICAgICBtZXRob2RzQnVmZmVyZWQuYWRkKGdlbkJ1ZmZlcik7CisgICAgICAgICAgICAgICAgb3V0ID0gZ2VuQnVmZmVyLmdldE91dCgpOworCisgICAgICAgICAgICAgICAgbWV0aG9kTmVzdGluZysrOworICAgICAgICAgICAgICAgIC8vIEdlbmVyYXRlIGNvZGUgZm9yIG1ldGhvZCBkZWNsYXJhdGlvbgorICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCk7CisgICAgICAgICAgICAgICAgb3V0LnB1c2hJbmRlbnQoKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRpbigicHJpdmF0ZSBib29sZWFuICIpOworICAgICAgICAgICAgICAgIG91dC5wcmludCh0YWdNZXRob2QpOworICAgICAgICAgICAgICAgIG91dC5wcmludCgiKCIpOworICAgICAgICAgICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoImphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5Kc3BUYWcgIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludChwYXJlbnQpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG91dC5wcmludCgiUGFnZUNvbnRleHQgX2pzcHhfcGFnZV9jb250ZXh0Iik7CisgICAgICAgICAgICAgICAgaWYgKHB1c2hCb2R5Q291bnRWYXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoIiwgaW50W10gIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludChwdXNoQm9keUNvdW50VmFyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIikiKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRpbCgiICAgICAgICB0aHJvd3MgVGhyb3dhYmxlIHsiKTsKKyAgICAgICAgICAgICAgICBvdXQucHVzaEluZGVudCgpOworCisgICAgICAgICAgICAgICAgLy8gSW5pdGlsYWl6ZSBsb2NhbCB2YXJpYWJsZXMgdXNlZCBpbiB0aGlzIG1ldGhvZC4KKyAgICAgICAgICAgICAgICBpZiAoISBpc1RhZ0ZpbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50aWwoIlBhZ2VDb250ZXh0IHBhZ2VDb250ZXh0ID0gX2pzcHhfcGFnZV9jb250ZXh0OyIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvdXQucHJpbnRpbCgiSnNwV3JpdGVyIG91dCA9IF9qc3B4X3BhZ2VfY29udGV4dC5nZXRPdXQoKTsiKTsKKyAgICAgICAgICAgICAgICBnZW5lcmF0ZUxvY2FsVmFyaWFibGVzKG91dCwgbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChuLmltcGxlbWVudHNTaW1wbGVUYWcoKSkgeworICAgICAgICAgICAgICAgIGdlbmVyYXRlQ3VzdG9tRG9UYWcobiwgaGFuZGxlckluZm8sIHRhZ0hhbmRsZXJWYXIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIENsYXNzaWMgdGFnIGhhbmRsZXI6IEdlbmVyYXRlIGNvZGUgZm9yIHN0YXJ0IGVsZW1lbnQsIGJvZHksCisgICAgICAgICAgICAgICAgICogYW5kIGVuZCBlbGVtZW50CisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgZ2VuZXJhdGVDdXN0b21TdGFydCgKKyAgICAgICAgICAgICAgICAgICAgbiwKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlckluZm8sCisgICAgICAgICAgICAgICAgICAgIHRhZ0hhbmRsZXJWYXIsCisgICAgICAgICAgICAgICAgICAgIHRhZ0V2YWxWYXIsCisgICAgICAgICAgICAgICAgICAgIHRhZ1B1c2hCb2R5Q291bnRWYXIpOworCisgICAgICAgICAgICAgICAgLy8gdmlzaXQgYm9keQorICAgICAgICAgICAgICAgIFN0cmluZyB0bXBQYXJlbnQgPSBwYXJlbnQ7CisgICAgICAgICAgICAgICAgcGFyZW50ID0gdGFnSGFuZGxlclZhcjsKKyAgICAgICAgICAgICAgICBib29sZWFuIGlzU2ltcGxlVGFnUGFyZW50U2F2ZSA9IGlzU2ltcGxlVGFnUGFyZW50OworICAgICAgICAgICAgICAgIGlzU2ltcGxlVGFnUGFyZW50ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgU3RyaW5nIHRtcFB1c2hCb2R5Q291bnRWYXIgPSBudWxsOworICAgICAgICAgICAgICAgIGlmIChuLmltcGxlbWVudHNUcnlDYXRjaEZpbmFsbHkoKSkgeworICAgICAgICAgICAgICAgICAgICB0bXBQdXNoQm9keUNvdW50VmFyID0gcHVzaEJvZHlDb3VudFZhcjsKKyAgICAgICAgICAgICAgICAgICAgcHVzaEJvZHlDb3VudFZhciA9IHRhZ1B1c2hCb2R5Q291bnRWYXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJvb2xlYW4gdG1wSXNTaW1wbGVUYWdIYW5kbGVyID0gaXNTaW1wbGVUYWdIYW5kbGVyOworICAgICAgICAgICAgICAgIGlzU2ltcGxlVGFnSGFuZGxlciA9IGZhbHNlOworCisgICAgICAgICAgICAgICAgdmlzaXRCb2R5KG4pOworCisgICAgICAgICAgICAgICAgcGFyZW50ID0gdG1wUGFyZW50OworICAgICAgICAgICAgICAgIGlzU2ltcGxlVGFnUGFyZW50ID0gaXNTaW1wbGVUYWdQYXJlbnRTYXZlOworICAgICAgICAgICAgICAgIGlmIChuLmltcGxlbWVudHNUcnlDYXRjaEZpbmFsbHkoKSkgeworICAgICAgICAgICAgICAgICAgICBwdXNoQm9keUNvdW50VmFyID0gdG1wUHVzaEJvZHlDb3VudFZhcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaXNTaW1wbGVUYWdIYW5kbGVyID0gdG1wSXNTaW1wbGVUYWdIYW5kbGVyOworCisgICAgICAgICAgICAgICAgZ2VuZXJhdGVDdXN0b21FbmQoCisgICAgICAgICAgICAgICAgICAgIG4sCisgICAgICAgICAgICAgICAgICAgIHRhZ0hhbmRsZXJWYXIsCisgICAgICAgICAgICAgICAgICAgIHRhZ0V2YWxWYXIsCisgICAgICAgICAgICAgICAgICAgIHRhZ1B1c2hCb2R5Q291bnRWYXIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY2kuaXNTY3JpcHRsZXNzKCkgJiYgIWNpLmhhc1NjcmlwdGluZ1ZhcnMoKSkgeworICAgICAgICAgICAgICAgIC8vIEdlbmVyYXRlIGVuZCBvZiBtZXRob2QKKyAgICAgICAgICAgICAgICBpZiAobWV0aG9kTmVzdGluZyA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50aWwoInJldHVybiBmYWxzZTsiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb3V0LnBvcEluZGVudCgpOworICAgICAgICAgICAgICAgIG91dC5wcmludGlsKCJ9Iik7CisgICAgICAgICAgICAgICAgb3V0LnBvcEluZGVudCgpOworCisgICAgICAgICAgICAgICAgbWV0aG9kTmVzdGluZy0tOworCisgICAgICAgICAgICAgICAgLy8gcmVzdG9yZSBwcmV2aW91cyB3cml0ZXIKKyAgICAgICAgICAgICAgICBvdXQgPSBvdXRTYXZlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNJTkdMRV9RVU9URSA9ICInIjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERPVUJMRV9RVU9URSA9ICJcXFwiIjsKKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLlVuaW50ZXJwcmV0ZWRUYWcgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisKKyAgICAgICAgICAgIG4uc2V0QmVnaW5KYXZhTGluZShvdXQuZ2V0SmF2YUxpbmUoKSk7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBXcml0ZSBiZWdpbiB0YWcKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgb3V0LnByaW50aW4oIm91dC53cml0ZShcIjwiKTsKKyAgICAgICAgICAgIG91dC5wcmludChuLmdldFFOYW1lKCkpOworCisgICAgICAgICAgICBBdHRyaWJ1dGVzIGF0dHJzID0gbi5nZXROb25UYWdsaWJYbWxuc0F0dHJpYnV0ZXMoKTsKKyAgICAgICAgICAgIGludCBhdHRyc0xlbiA9IChhdHRycyA9PSBudWxsKSA/IDAgOiBhdHRycy5nZXRMZW5ndGgoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cnNMZW47IGkrKykgeworICAgICAgICAgICAgICAgIG91dC5wcmludCgiICIpOworICAgICAgICAgICAgICAgIG91dC5wcmludChhdHRycy5nZXRRTmFtZShpKSk7CisgICAgICAgICAgICAgICAgb3V0LnByaW50KCI9Iik7CisgICAgICAgICAgICAgICAgU3RyaW5nIHF1b3RlID0gRE9VQkxFX1FVT1RFOworICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGF0dHJzLmdldFZhbHVlKGkpOworICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5pbmRleE9mKCciJykgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgcXVvdGUgPSBTSU5HTEVfUVVPVEU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG91dC5wcmludChxdW90ZSk7CisgICAgICAgICAgICAgICAgb3V0LnByaW50KHZhbHVlKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQocXVvdGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhdHRycyA9IG4uZ2V0QXR0cmlidXRlcygpOworICAgICAgICAgICAgYXR0cnNMZW4gPSAoYXR0cnMgPT0gbnVsbCkgPyAwIDogYXR0cnMuZ2V0TGVuZ3RoKCk7CisgICAgICAgICAgICBOb2RlLkpzcEF0dHJpYnV0ZVtdIGpzcEF0dHJzID0gbi5nZXRKc3BBdHRyaWJ1dGVzKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHJzTGVuOyBpKyspIHsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoIiAiKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoYXR0cnMuZ2V0UU5hbWUoaSkpOworICAgICAgICAgICAgICAgIG91dC5wcmludCgiPSIpOworICAgICAgICAgICAgICAgIGlmIChqc3BBdHRyc1tpXS5pc0VMSW50ZXJwcmV0ZXJJbnB1dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCgiXFxcIlwiICsgIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludChhdHRyaWJ1dGVWYWx1ZShqc3BBdHRyc1tpXSwgZmFsc2UsIFN0cmluZy5jbGFzcykpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoIiArIFwiXFxcIiIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBxdW90ZSA9IERPVUJMRV9RVU9URTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gYXR0cnMuZ2V0VmFsdWUoaSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5pbmRleE9mKCciJykgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHF1b3RlID0gU0lOR0xFX1FVT1RFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludChxdW90ZSk7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCh2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludChxdW90ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobi5nZXRCb2R5KCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCI+XCIpOyIpOworCisgICAgICAgICAgICAgICAgLy8gVmlzaXQgdGFnIGJvZHkKKyAgICAgICAgICAgICAgICB2aXNpdEJvZHkobik7CisKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIFdyaXRlIGVuZCB0YWcKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBvdXQucHJpbnRpbigib3V0LndyaXRlKFwiPC8iKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQobi5nZXRRTmFtZSgpKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiPlwiKTsiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIi8+XCIpOyIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBuLnNldEVuZEphdmFMaW5lKG91dC5nZXRKYXZhTGluZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuSnNwRWxlbWVudCBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKworICAgICAgICAgICAgbi5zZXRCZWdpbkphdmFMaW5lKG91dC5nZXRKYXZhTGluZSgpKTsKKworICAgICAgICAgICAgLy8gQ29tcHV0ZSBhdHRyaWJ1dGUgdmFsdWUgc3RyaW5nIGZvciBYTUwtc3R5bGUgYW5kIG5hbWVkCisgICAgICAgICAgICAvLyBhdHRyaWJ1dGVzCisgICAgICAgICAgICBIYXNodGFibGUgbWFwID0gbmV3IEhhc2h0YWJsZSgpOworICAgICAgICAgICAgTm9kZS5Kc3BBdHRyaWJ1dGVbXSBhdHRycyA9IG4uZ2V0SnNwQXR0cmlidXRlcygpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGF0dHJzICE9IG51bGwgJiYgaSA8IGF0dHJzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGF0dHJTdHIgPSBudWxsOworICAgICAgICAgICAgICAgIGlmIChhdHRyc1tpXS5pc05hbWVkQXR0cmlidXRlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYXR0clN0ciA9CisgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZU5hbWVkQXR0cmlidXRlVmFsdWUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnNbaV0uZ2V0TmFtZWRBdHRyaWJ1dGVOb2RlKCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGF0dHJTdHIgPSBhdHRyaWJ1dGVWYWx1ZShhdHRyc1tpXSwgZmFsc2UsIE9iamVjdC5jbGFzcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFN0cmluZyBzID0KKyAgICAgICAgICAgICAgICAgICAgIiArIFwiICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgYXR0cnNbaV0uZ2V0TmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICArICI9XFxcIlwiICsgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBhdHRyU3RyCisgICAgICAgICAgICAgICAgICAgICAgICArICIgKyBcIlxcXCJcIiI7CisgICAgICAgICAgICAgICAgbWFwLnB1dChhdHRyc1tpXS5nZXROYW1lKCksIHMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBXcml0ZSBiZWdpbiB0YWcsIHVzaW5nIFhNTC1zdHlsZSAnbmFtZScgYXR0cmlidXRlIGFzIHRoZQorICAgICAgICAgICAgLy8gZWxlbWVudCBuYW1lCisgICAgICAgICAgICBTdHJpbmcgZWxlbU5hbWUgPQorICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlKG4uZ2V0TmFtZUF0dHJpYnV0ZSgpLCBmYWxzZSwgU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgICAgIG91dC5wcmludGluKCJvdXQud3JpdGUoXCI8XCIiKTsKKyAgICAgICAgICAgIG91dC5wcmludCgiICsgIiArIGVsZW1OYW1lKTsKKworICAgICAgICAgICAgLy8gV3JpdGUgcmVtYWluaW5nIGF0dHJpYnV0ZXMKKyAgICAgICAgICAgIEVudW1lcmF0aW9uIGVudW1lcmF0aW9uID0gbWFwLmtleXMoKTsKKyAgICAgICAgICAgIHdoaWxlIChlbnVtZXJhdGlvbi5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBhdHRyTmFtZSA9IChTdHJpbmcpZW51bWVyYXRpb24ubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoKFN0cmluZyltYXAuZ2V0KGF0dHJOYW1lKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIERvZXMgdGhlIDxqc3A6ZWxlbWVudD4gaGF2ZSBuZXN0ZWQgdGFncyBvdGhlciB0aGFuCisgICAgICAgICAgICAvLyA8anNwOmF0dHJpYnV0ZT4KKyAgICAgICAgICAgIGJvb2xlYW4gaGFzQm9keSA9IGZhbHNlOworICAgICAgICAgICAgTm9kZS5Ob2RlcyBzdWJlbGVtZW50cyA9IG4uZ2V0Qm9keSgpOworICAgICAgICAgICAgaWYgKHN1YmVsZW1lbnRzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN1YmVsZW1lbnRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIE5vZGUgc3ViZWxlbSA9IHN1YmVsZW1lbnRzLmdldE5vZGUoaSk7CisgICAgICAgICAgICAgICAgICAgIGlmICghKHN1YmVsZW0gaW5zdGFuY2VvZiBOb2RlLk5hbWVkQXR0cmlidXRlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaGFzQm9keSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChoYXNCb2R5KSB7CisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIiArIFwiPlwiKTsiKTsKKworICAgICAgICAgICAgICAgIC8vIFZpc2l0IHRhZyBib2R5CisgICAgICAgICAgICAgICAgdmlzaXRCb2R5KG4pOworCisgICAgICAgICAgICAgICAgLy8gV3JpdGUgZW5kIHRhZworICAgICAgICAgICAgICAgIG91dC5wcmludGluKCJvdXQud3JpdGUoXCI8L1wiIik7CisgICAgICAgICAgICAgICAgb3V0LnByaW50KCIgKyAiICsgZWxlbU5hbWUpOworICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCIgKyBcIj5cIik7Iik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCIgKyBcIi8+XCIpOyIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBuLnNldEVuZEphdmFMaW5lKG91dC5nZXRKYXZhTGluZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuVGVtcGxhdGVUZXh0IG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCisgICAgICAgICAgICBTdHJpbmcgdGV4dCA9IG4uZ2V0VGV4dCgpOworCisgICAgICAgICAgICBpbnQgdGV4dFNpemUgPSB0ZXh0Lmxlbmd0aCgpOworICAgICAgICAgICAgaWYgKHRleHRTaXplID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh0ZXh0U2l6ZSA8PSAzKSB7CisgICAgICAgICAgICAgICAvLyBTcGVjaWFsIGNhc2Ugc21hbGwgdGV4dCBzdHJpbmdzCisgICAgICAgICAgICAgICBuLnNldEJlZ2luSmF2YUxpbmUob3V0LmdldEphdmFMaW5lKCkpOworICAgICAgICAgICAgICAgaW50IGxpbmVJbmMgPSAwOworICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXh0U2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgY2hhciBjaCA9IHRleHQuY2hhckF0KGkpOworICAgICAgICAgICAgICAgICAgIG91dC5wcmludGlsKCJvdXQud3JpdGUoIiArIHF1b3RlKGNoKSArICIpOyIpOworICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICBuLmFkZFNtYXAobGluZUluYyk7CisgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnXG4nKSB7CisgICAgICAgICAgICAgICAgICAgICAgIGxpbmVJbmMrKzsKKyAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBuLnNldEVuZEphdmFMaW5lKG91dC5nZXRKYXZhTGluZSgpKTsKKyAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY3R4dC5nZXRPcHRpb25zKCkuZ2VuU3RyaW5nQXNDaGFyQXJyYXkoKSkgeworICAgICAgICAgICAgICAgLy8gR2VuZXJhdGUgU3RyaW5ncyBhcyBjaGFyIGFycmF5cywgZm9yIHBlcmZvcm1hbmNlCisgICAgICAgICAgICAgICAgU2VydmxldFdyaXRlciBjYU91dDsKKyAgICAgICAgICAgICAgICBpZiAoY2hhckFycmF5QnVmZmVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhckFycmF5QnVmZmVyID0gbmV3IEdlbkJ1ZmZlcigpOworICAgICAgICAgICAgICAgICAgICBjYU91dCA9IGNoYXJBcnJheUJ1ZmZlci5nZXRPdXQoKTsKKyAgICAgICAgICAgICAgICAgICAgY2FPdXQucHVzaEluZGVudCgpOworICAgICAgICAgICAgICAgICAgICB0ZXh0TWFwID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjYU91dCA9IGNoYXJBcnJheUJ1ZmZlci5nZXRPdXQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU3RyaW5nIGNoYXJBcnJheU5hbWUgPSAoU3RyaW5nKSB0ZXh0TWFwLmdldCh0ZXh0KTsKKyAgICAgICAgICAgICAgICBpZiAoY2hhckFycmF5TmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGNoYXJBcnJheU5hbWUgPSAiX2pzcHhfY2hhcl9hcnJheV8iICsgY2hhckFycmF5Q291bnQrKzsKKyAgICAgICAgICAgICAgICAgICAgdGV4dE1hcC5wdXQodGV4dCwgY2hhckFycmF5TmFtZSk7CisgICAgICAgICAgICAgICAgICAgIGNhT3V0LnByaW50aW4oInN0YXRpYyBjaGFyW10gIik7CisgICAgICAgICAgICAgICAgICAgIGNhT3V0LnByaW50KGNoYXJBcnJheU5hbWUpOworICAgICAgICAgICAgICAgICAgICBjYU91dC5wcmludCgiID0gIik7CisgICAgICAgICAgICAgICAgICAgIGNhT3V0LnByaW50KHF1b3RlKHRleHQpKTsKKyAgICAgICAgICAgICAgICAgICAgY2FPdXQucHJpbnRsbigiLnRvQ2hhckFycmF5KCk7Iik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbi5zZXRCZWdpbkphdmFMaW5lKG91dC5nZXRKYXZhTGluZSgpKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRpbCgib3V0LndyaXRlKCIgKyBjaGFyQXJyYXlOYW1lICsgIik7Iik7CisgICAgICAgICAgICAgICAgbi5zZXRFbmRKYXZhTGluZShvdXQuZ2V0SmF2YUxpbmUoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBuLnNldEJlZ2luSmF2YUxpbmUob3V0LmdldEphdmFMaW5lKCkpOworCisgICAgICAgICAgICBvdXQucHJpbnRpbigpOworICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigib3V0LndyaXRlKFwiIik7CisgICAgICAgICAgICBpbnQgaW5pdExlbmd0aCA9IHNiLmxlbmd0aCgpOworICAgICAgICAgICAgaW50IGNvdW50ID0gSnNwVXRpbC5DSFVOS1NJWkU7CisgICAgICAgICAgICBpbnQgc3JjTGluZSA9IDA7ICAgIC8vIHJlbGF0aXZlIHRvIHN0YXJ0aW5nIHNyb3VjZSBsaW5lCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRleHQubGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgICAgIGNoYXIgY2ggPSB0ZXh0LmNoYXJBdChpKTsKKyAgICAgICAgICAgICAgICAtLWNvdW50OworICAgICAgICAgICAgICAgIHN3aXRjaCAoY2gpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnIicgOgorICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCdcXCcpLmFwcGVuZCgnXCInKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlICdcXCcgOgorICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCdcXCcpLmFwcGVuZCgnXFwnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlICdccicgOgorICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCdcXCcpLmFwcGVuZCgncicpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1xuJyA6CisgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJ1xcJykuYXBwZW5kKCduJyk7CisgICAgICAgICAgICAgICAgICAgICAgICBzcmNMaW5lKys7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChicmVha0F0TEYgfHwgY291bnQgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2VuZXJhdGUgYW4gb3V0LndyaXRlKCkgd2hlbiBzZWUgYSAnXG4nIGluIHRlbXBsYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJcIik7Iik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oc2IudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPCB0ZXh0Lmxlbmd0aCgpIC0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRpbigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5zZXRMZW5ndGgoaW5pdExlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQgPSBKc3BVdGlsLkNIVU5LU0laRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZCBhIFNtYXAgZm9yIHRoaXMgbGluZQorICAgICAgICAgICAgICAgICAgICAgICAgbi5hZGRTbWFwKHNyY0xpbmUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1x0JyA6IC8vIE5vdCBzdXJlIHdlIG5lZWQgdGhpcworICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCdcXCcpLmFwcGVuZCgndCcpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgOgorICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGNoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzYi5sZW5ndGgoKSA+IGluaXRMZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIlwiKTsiKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihzYi50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbi5zZXRFbmRKYXZhTGluZShvdXQuZ2V0SmF2YUxpbmUoKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLkpzcEJvZHkgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAobi5nZXRCb2R5KCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChpc1NpbXBsZVRhZ0hhbmRsZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50aW4oc2ltcGxlVGFnSGFuZGxlclZhcik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCgiLnNldEpzcEJvZHkoIik7CisgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlSnNwRnJhZ21lbnQobiwgc2ltcGxlVGFnSGFuZGxlclZhcik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCIpOyIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHZpc2l0Qm9keShuKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLkludm9rZUFjdGlvbiBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKworICAgICAgICAgICAgbi5zZXRCZWdpbkphdmFMaW5lKG91dC5nZXRKYXZhTGluZSgpKTsKKworICAgICAgICAgICAgLy8gQ29weSB2aXJ0dWFsIHBhZ2Ugc2NvcGUgb2YgdGFnIGZpbGUgdG8gcGFnZSBzY29wZSBvZiBpbnZva2luZworICAgICAgICAgICAgLy8gcGFnZQorICAgICAgICAgICAgb3V0LnByaW50aWwoCisgICAgICAgICAgICAgICAgIigob3JnLmFwYWNoZS5qYXNwZXIucnVudGltZS5Kc3BDb250ZXh0V3JhcHBlcikgdGhpcy5qc3BDb250ZXh0KS5zeW5jQmVmb3JlSW52b2tlKCk7Iik7CisgICAgICAgICAgICBTdHJpbmcgdmFyUmVhZGVyQXR0ciA9IG4uZ2V0VGV4dEF0dHJpYnV0ZSgidmFyUmVhZGVyIik7CisgICAgICAgICAgICBTdHJpbmcgdmFyQXR0ciA9IG4uZ2V0VGV4dEF0dHJpYnV0ZSgidmFyIik7CisgICAgICAgICAgICBpZiAodmFyUmVhZGVyQXR0ciAhPSBudWxsIHx8IHZhckF0dHIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG91dC5wcmludGlsKCJfanNweF9zb3V0ID0gbmV3IGphdmEuaW8uU3RyaW5nV3JpdGVyKCk7Iik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG91dC5wcmludGlsKCJfanNweF9zb3V0ID0gbnVsbDsiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSW52b2tlIGZyYWdtZW50LCB1bmxlc3MgZnJhZ21lbnQgaXMgbnVsbAorICAgICAgICAgICAgb3V0LnByaW50aW4oImlmICgiKTsKKyAgICAgICAgICAgIG91dC5wcmludCh0b0dldHRlck1ldGhvZChuLmdldFRleHRBdHRyaWJ1dGUoImZyYWdtZW50IikpKTsKKyAgICAgICAgICAgIG91dC5wcmludGxuKCIgIT0gbnVsbCkgeyIpOworICAgICAgICAgICAgb3V0LnB1c2hJbmRlbnQoKTsKKyAgICAgICAgICAgIG91dC5wcmludGluKHRvR2V0dGVyTWV0aG9kKG4uZ2V0VGV4dEF0dHJpYnV0ZSgiZnJhZ21lbnQiKSkpOworICAgICAgICAgICAgb3V0LnByaW50bG4oIi5pbnZva2UoX2pzcHhfc291dCk7Iik7CisgICAgICAgICAgICBvdXQucG9wSW5kZW50KCk7CisgICAgICAgICAgICBvdXQucHJpbnRpbCgifSIpOworCisgICAgICAgICAgICAvLyBTdG9yZSB2YXJSZWFkZXIgaW4gYXBwcm9wcmlhdGUgc2NvcGUKKyAgICAgICAgICAgIGlmICh2YXJSZWFkZXJBdHRyICE9IG51bGwgfHwgdmFyQXR0ciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHNjb3BlTmFtZSA9IG4uZ2V0VGV4dEF0dHJpYnV0ZSgic2NvcGUiKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRpbigiX2pzcHhfcGFnZV9jb250ZXh0LnNldEF0dHJpYnV0ZSgiKTsKKyAgICAgICAgICAgICAgICBpZiAodmFyUmVhZGVyQXR0ciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludChxdW90ZSh2YXJSZWFkZXJBdHRyKSk7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCgKKyAgICAgICAgICAgICAgICAgICAgICAgICIsIG5ldyBqYXZhLmlvLlN0cmluZ1JlYWRlcihfanNweF9zb3V0LnRvU3RyaW5nKCkpIik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KHF1b3RlKHZhckF0dHIpKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KCIsIF9qc3B4X3NvdXQudG9TdHJpbmcoKSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoc2NvcGVOYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KCIsICIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoZ2V0U2NvcGVDb25zdGFudChzY29wZU5hbWUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIik7Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG4uc2V0RW5kSmF2YUxpbmUob3V0LmdldEphdmFMaW5lKCkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5Eb0JvZHlBY3Rpb24gbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisKKyAgICAgICAgICAgIG4uc2V0QmVnaW5KYXZhTGluZShvdXQuZ2V0SmF2YUxpbmUoKSk7CisKKyAgICAgICAgICAgIC8vIENvcHkgdmlydHVhbCBwYWdlIHNjb3BlIG9mIHRhZyBmaWxlIHRvIHBhZ2Ugc2NvcGUgb2YgaW52b2tpbmcKKyAgICAgICAgICAgIC8vIHBhZ2UKKyAgICAgICAgICAgIG91dC5wcmludGlsKAorICAgICAgICAgICAgICAgICIoKG9yZy5hcGFjaGUuamFzcGVyLnJ1bnRpbWUuSnNwQ29udGV4dFdyYXBwZXIpIHRoaXMuanNwQ29udGV4dCkuc3luY0JlZm9yZUludm9rZSgpOyIpOworCisgICAgICAgICAgICAvLyBJbnZva2UgYm9keQorICAgICAgICAgICAgU3RyaW5nIHZhclJlYWRlckF0dHIgPSBuLmdldFRleHRBdHRyaWJ1dGUoInZhclJlYWRlciIpOworICAgICAgICAgICAgU3RyaW5nIHZhckF0dHIgPSBuLmdldFRleHRBdHRyaWJ1dGUoInZhciIpOworICAgICAgICAgICAgaWYgKHZhclJlYWRlckF0dHIgIT0gbnVsbCB8fCB2YXJBdHRyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRpbCgiX2pzcHhfc291dCA9IG5ldyBqYXZhLmlvLlN0cmluZ1dyaXRlcigpOyIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRpbCgiX2pzcHhfc291dCA9IG51bGw7Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXQucHJpbnRpbCgiaWYgKGdldEpzcEJvZHkoKSAhPSBudWxsKSIpOworICAgICAgICAgICAgb3V0LnB1c2hJbmRlbnQoKTsKKyAgICAgICAgICAgIG91dC5wcmludGlsKCJnZXRKc3BCb2R5KCkuaW52b2tlKF9qc3B4X3NvdXQpOyIpOworICAgICAgICAgICAgb3V0LnBvcEluZGVudCgpOworCisgICAgICAgICAgICAvLyBTdG9yZSB2YXJSZWFkZXIgaW4gYXBwcm9wcmlhdGUgc2NvcGUKKyAgICAgICAgICAgIGlmICh2YXJSZWFkZXJBdHRyICE9IG51bGwgfHwgdmFyQXR0ciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHNjb3BlTmFtZSA9IG4uZ2V0VGV4dEF0dHJpYnV0ZSgic2NvcGUiKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRpbigiX2pzcHhfcGFnZV9jb250ZXh0LnNldEF0dHJpYnV0ZSgiKTsKKyAgICAgICAgICAgICAgICBpZiAodmFyUmVhZGVyQXR0ciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludChxdW90ZSh2YXJSZWFkZXJBdHRyKSk7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCgKKyAgICAgICAgICAgICAgICAgICAgICAgICIsIG5ldyBqYXZhLmlvLlN0cmluZ1JlYWRlcihfanNweF9zb3V0LnRvU3RyaW5nKCkpIik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KHF1b3RlKHZhckF0dHIpKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KCIsIF9qc3B4X3NvdXQudG9TdHJpbmcoKSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoc2NvcGVOYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KCIsICIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoZ2V0U2NvcGVDb25zdGFudChzY29wZU5hbWUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIik7Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG4uc2V0RW5kSmF2YUxpbmUob3V0LmdldEphdmFMaW5lKCkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5BdHRyaWJ1dGVHZW5lcmF0b3IgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBOb2RlLkN1c3RvbVRhZyB0YWcgPSBuLmdldFRhZygpOworICAgICAgICAgICAgTm9kZS5Kc3BBdHRyaWJ1dGVbXSBhdHRycyA9IHRhZy5nZXRKc3BBdHRyaWJ1dGVzKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgYXR0cnMgIT0gbnVsbCAmJiBpIDwgYXR0cnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoYXR0cnNbaV0uZ2V0TmFtZSgpLmVxdWFscyhuLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KAorICAgICAgICAgICAgICAgICAgICAgICAgZXZhbHVhdGVBdHRyaWJ1dGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VGFnSGFuZGxlckluZm8odGFnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFRhZ0hhbmRsZXJJbmZvIGdldFRhZ0hhbmRsZXJJbmZvKE5vZGUuQ3VzdG9tVGFnIG4pCisgICAgICAgICAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIEhhc2h0YWJsZSBoYW5kbGVySW5mb3NCeVNob3J0TmFtZSA9CisgICAgICAgICAgICAgICAgKEhhc2h0YWJsZSloYW5kbGVySW5mb3MuZ2V0KG4uZ2V0UHJlZml4KCkpOworICAgICAgICAgICAgaWYgKGhhbmRsZXJJbmZvc0J5U2hvcnROYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVySW5mb3NCeVNob3J0TmFtZSA9IG5ldyBIYXNodGFibGUoKTsKKyAgICAgICAgICAgICAgICBoYW5kbGVySW5mb3MucHV0KG4uZ2V0UHJlZml4KCksIGhhbmRsZXJJbmZvc0J5U2hvcnROYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFRhZ0hhbmRsZXJJbmZvIGhhbmRsZXJJbmZvID0KKyAgICAgICAgICAgICAgICAoVGFnSGFuZGxlckluZm8paGFuZGxlckluZm9zQnlTaG9ydE5hbWUuZ2V0KG4uZ2V0TG9jYWxOYW1lKCkpOworICAgICAgICAgICAgaWYgKGhhbmRsZXJJbmZvID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVySW5mbyA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBUYWdIYW5kbGVySW5mbyhuLCBuLmdldFRhZ0hhbmRsZXJDbGFzcygpLCBlcnIpOworICAgICAgICAgICAgICAgIGhhbmRsZXJJbmZvc0J5U2hvcnROYW1lLnB1dChuLmdldExvY2FsTmFtZSgpLCBoYW5kbGVySW5mbyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gaGFuZGxlckluZm87CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgZ2VuZXJhdGVUYWdQbHVnaW4oTm9kZS5DdXN0b21UYWcgbikKKyAgICAgICAgICAgIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgaWYgKG4uZ2V0QXRTVGFnKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG4uZ2V0QXRTVGFnKCkudmlzaXQodGhpcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2aXNpdEJvZHkobik7CisgICAgICAgICAgICBpZiAobi5nZXRBdEVUYWcoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbi5nZXRBdEVUYWcoKS52aXNpdCh0aGlzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBnZW5lcmF0ZUN1c3RvbVN0YXJ0KAorICAgICAgICAgICAgTm9kZS5DdXN0b21UYWcgbiwKKyAgICAgICAgICAgIFRhZ0hhbmRsZXJJbmZvIGhhbmRsZXJJbmZvLAorICAgICAgICAgICAgU3RyaW5nIHRhZ0hhbmRsZXJWYXIsCisgICAgICAgICAgICBTdHJpbmcgdGFnRXZhbFZhciwKKyAgICAgICAgICAgIFN0cmluZyB0YWdQdXNoQm9keUNvdW50VmFyKQorICAgICAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisKKyAgICAgICAgICAgIENsYXNzIHRhZ0hhbmRsZXJDbGFzcyA9IGhhbmRsZXJJbmZvLmdldFRhZ0hhbmRsZXJDbGFzcygpOworCisgICAgICAgICAgICBvdXQucHJpbnRpbigiLy8gICIpOworICAgICAgICAgICAgb3V0LnByaW50bG4obi5nZXRRTmFtZSgpKTsKKyAgICAgICAgICAgIG4uc2V0QmVnaW5KYXZhTGluZShvdXQuZ2V0SmF2YUxpbmUoKSk7CisKKyAgICAgICAgICAgIC8vIERlY2xhcmUgQVRfQkVHSU4gc2NyaXB0aW5nIHZhcmlhYmxlcworICAgICAgICAgICAgZGVjbGFyZVNjcmlwdGluZ1ZhcnMobiwgVmFyaWFibGVJbmZvLkFUX0JFR0lOKTsKKyAgICAgICAgICAgIHNhdmVTY3JpcHRpbmdWYXJzKG4sIFZhcmlhYmxlSW5mby5BVF9CRUdJTik7CisKKyAgICAgICAgICAgIFN0cmluZyB0YWdIYW5kbGVyQ2xhc3NOYW1lID0KKyAgICAgICAgICAgICAgICBKc3BVdGlsLmdldENhbm9uaWNhbE5hbWUodGFnSGFuZGxlckNsYXNzKTsKKyAgICAgICAgICAgIG91dC5wcmludGluKHRhZ0hhbmRsZXJDbGFzc05hbWUpOworICAgICAgICAgICAgb3V0LnByaW50KCIgIik7CisgICAgICAgICAgICBvdXQucHJpbnQodGFnSGFuZGxlclZhcik7CisgICAgICAgICAgICBvdXQucHJpbnQoIiA9ICIpOworICAgICAgICAgICAgaWYgKGlzUG9vbGluZ0VuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoIigiKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQodGFnSGFuZGxlckNsYXNzTmFtZSk7CisgICAgICAgICAgICAgICAgb3V0LnByaW50KCIpICIpOworICAgICAgICAgICAgICAgIG91dC5wcmludChuLmdldFRhZ0hhbmRsZXJQb29sTmFtZSgpKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoIi5nZXQoIik7CisgICAgICAgICAgICAgICAgb3V0LnByaW50KHRhZ0hhbmRsZXJDbGFzc05hbWUpOworICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCIuY2xhc3MpOyIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoIm5ldyAiKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQodGFnSGFuZGxlckNsYXNzTmFtZSk7CisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIigpOyIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBnZW5lcmF0ZVNldHRlcnMobiwgdGFnSGFuZGxlclZhciwgaGFuZGxlckluZm8sIGZhbHNlKTsKKworICAgICAgICAgICAgaWYgKG4uaW1wbGVtZW50c1RyeUNhdGNoRmluYWxseSgpKSB7CisgICAgICAgICAgICAgICAgb3V0LnByaW50aW4oImludFtdICIpOworICAgICAgICAgICAgICAgIG91dC5wcmludCh0YWdQdXNoQm9keUNvdW50VmFyKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiID0gbmV3IGludFtdIHsgMCB9OyIpOworICAgICAgICAgICAgICAgIG91dC5wcmludGlsKCJ0cnkgeyIpOworICAgICAgICAgICAgICAgIG91dC5wdXNoSW5kZW50KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXQucHJpbnRpbigiaW50ICIpOworICAgICAgICAgICAgb3V0LnByaW50KHRhZ0V2YWxWYXIpOworICAgICAgICAgICAgb3V0LnByaW50KCIgPSAiKTsKKyAgICAgICAgICAgIG91dC5wcmludCh0YWdIYW5kbGVyVmFyKTsKKyAgICAgICAgICAgIG91dC5wcmludGxuKCIuZG9TdGFydFRhZygpOyIpOworCisgICAgICAgICAgICBpZiAoIW4uaW1wbGVtZW50c0JvZHlUYWcoKSkgeworICAgICAgICAgICAgICAgIC8vIFN5bmNocm9uaXplIEFUX0JFR0lOIHNjcmlwdGluZyB2YXJpYWJsZXMKKyAgICAgICAgICAgICAgICBzeW5jU2NyaXB0aW5nVmFycyhuLCBWYXJpYWJsZUluZm8uQVRfQkVHSU4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIW4uaGFzRW1wdHlCb2R5KCkpIHsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRpbigiaWYgKCIpOworICAgICAgICAgICAgICAgIG91dC5wcmludCh0YWdFdmFsVmFyKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiICE9IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWcuU0tJUF9CT0RZKSB7Iik7CisgICAgICAgICAgICAgICAgb3V0LnB1c2hJbmRlbnQoKTsKKworICAgICAgICAgICAgICAgIC8vIERlY2xhcmUgTkVTVEVEIHNjcmlwdGluZyB2YXJpYWJsZXMKKyAgICAgICAgICAgICAgICBkZWNsYXJlU2NyaXB0aW5nVmFycyhuLCBWYXJpYWJsZUluZm8uTkVTVEVEKTsKKyAgICAgICAgICAgICAgICBzYXZlU2NyaXB0aW5nVmFycyhuLCBWYXJpYWJsZUluZm8uTkVTVEVEKTsKKworICAgICAgICAgICAgICAgIGlmIChuLmltcGxlbWVudHNCb2R5VGFnKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50aW4oImlmICgiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KHRhZ0V2YWxWYXIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigKKyAgICAgICAgICAgICAgICAgICAgICAgICIgIT0gamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZy5FVkFMX0JPRFlfSU5DTFVERSkgeyIpOworICAgICAgICAgICAgICAgICAgICAvLyBBc3N1bWUgRVZBTF9CT0RZX0JVRkZFUkVECisgICAgICAgICAgICAgICAgICAgIG91dC5wdXNoSW5kZW50KCk7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGlsKCJvdXQgPSBfanNweF9wYWdlX2NvbnRleHQucHVzaEJvZHkoKTsiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG4uaW1wbGVtZW50c1RyeUNhdGNoRmluYWxseSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRpbih0YWdQdXNoQm9keUNvdW50VmFyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCJbMF0rKzsiKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwdXNoQm9keUNvdW50VmFyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGluKHB1c2hCb2R5Q291bnRWYXIpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIlswXSsrOyIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGluKHRhZ0hhbmRsZXJWYXIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigKKyAgICAgICAgICAgICAgICAgICAgICAgICIuc2V0Qm9keUNvbnRlbnQoKGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5Cb2R5Q29udGVudCkgb3V0KTsiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50aW4odGFnSGFuZGxlclZhcik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCIuZG9Jbml0Qm9keSgpOyIpOworCisgICAgICAgICAgICAgICAgICAgIG91dC5wb3BJbmRlbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50aWwoIn0iKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBTeW5jaHJvbml6ZSBBVF9CRUdJTiBhbmQgTkVTVEVEIHNjcmlwdGluZyB2YXJpYWJsZXMKKyAgICAgICAgICAgICAgICAgICAgc3luY1NjcmlwdGluZ1ZhcnMobiwgVmFyaWFibGVJbmZvLkFUX0JFR0lOKTsKKyAgICAgICAgICAgICAgICAgICAgc3luY1NjcmlwdGluZ1ZhcnMobiwgVmFyaWFibGVJbmZvLk5FU1RFRCk7CisKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBTeW5jaHJvbml6ZSBORVNURUQgc2NyaXB0aW5nIHZhcmlhYmxlcworICAgICAgICAgICAgICAgICAgICBzeW5jU2NyaXB0aW5nVmFycyhuLCBWYXJpYWJsZUluZm8uTkVTVEVEKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobi5pbXBsZW1lbnRzSXRlcmF0aW9uVGFnKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50aWwoImRvIHsiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnB1c2hJbmRlbnQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBNYXAgdGhlIEphdmEgbGluZXMgdGhhdCBoYW5kbGVzIHN0YXJ0IG9mIGN1c3RvbSB0YWdzIHRvIHRoZQorICAgICAgICAgICAgLy8gSlNQIGxpbmUgZm9yIHRoaXMgdGFnCisgICAgICAgICAgICBuLnNldEVuZEphdmFMaW5lKG91dC5nZXRKYXZhTGluZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBnZW5lcmF0ZUN1c3RvbUVuZCgKKyAgICAgICAgICAgIE5vZGUuQ3VzdG9tVGFnIG4sCisgICAgICAgICAgICBTdHJpbmcgdGFnSGFuZGxlclZhciwKKyAgICAgICAgICAgIFN0cmluZyB0YWdFdmFsVmFyLAorICAgICAgICAgICAgU3RyaW5nIHRhZ1B1c2hCb2R5Q291bnRWYXIpIHsKKworICAgICAgICAgICAgaWYgKCFuLmhhc0VtcHR5Qm9keSgpKSB7CisgICAgICAgICAgICAgICAgaWYgKG4uaW1wbGVtZW50c0l0ZXJhdGlvblRhZygpKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGluKCJpbnQgZXZhbERvQWZ0ZXJCb2R5ID0gIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCh0YWdIYW5kbGVyVmFyKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIi5kb0FmdGVyQm9keSgpOyIpOworCisgICAgICAgICAgICAgICAgICAgIC8vIFN5bmNocm9uaXplIEFUX0JFR0lOIGFuZCBORVNURUQgc2NyaXB0aW5nIHZhcmlhYmxlcworICAgICAgICAgICAgICAgICAgICBzeW5jU2NyaXB0aW5nVmFycyhuLCBWYXJpYWJsZUluZm8uQVRfQkVHSU4pOworICAgICAgICAgICAgICAgICAgICBzeW5jU2NyaXB0aW5nVmFycyhuLCBWYXJpYWJsZUluZm8uTkVTVEVEKTsKKworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRpbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICJpZiAoZXZhbERvQWZ0ZXJCb2R5ICE9IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5Cb2R5VGFnLkVWQUxfQk9EWV9BR0FJTikiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnB1c2hJbmRlbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50aWwoImJyZWFrOyIpOworICAgICAgICAgICAgICAgICAgICBvdXQucG9wSW5kZW50KCk7CisKKyAgICAgICAgICAgICAgICAgICAgb3V0LnBvcEluZGVudCgpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRpbCgifSB3aGlsZSAodHJ1ZSk7Iik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmVzdG9yZVNjcmlwdGluZ1ZhcnMobiwgVmFyaWFibGVJbmZvLk5FU1RFRCk7CisKKyAgICAgICAgICAgICAgICBpZiAobi5pbXBsZW1lbnRzQm9keVRhZygpKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGluKCJpZiAoIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCh0YWdFdmFsVmFyKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oCisgICAgICAgICAgICAgICAgICAgICAgICAiICE9IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWcuRVZBTF9CT0RZX0lOQ0xVREUpIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wdXNoSW5kZW50KCk7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGlsKCJvdXQgPSBfanNweF9wYWdlX2NvbnRleHQucG9wQm9keSgpOyIpOworICAgICAgICAgICAgICAgICAgICBpZiAobi5pbXBsZW1lbnRzVHJ5Q2F0Y2hGaW5hbGx5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGluKHRhZ1B1c2hCb2R5Q291bnRWYXIpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIlswXS0tOyIpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHB1c2hCb2R5Q291bnRWYXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50aW4ocHVzaEJvZHlDb3VudFZhcik7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiWzBdLS07Iik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgb3V0LnBvcEluZGVudCgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG91dC5wb3BJbmRlbnQoKTsgLy8gRVZBTF9CT0RZCisgICAgICAgICAgICAgICAgb3V0LnByaW50aWwoIn0iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3V0LnByaW50aW4oImlmICgiKTsKKyAgICAgICAgICAgIG91dC5wcmludCh0YWdIYW5kbGVyVmFyKTsKKyAgICAgICAgICAgIG91dC5wcmludGxuKAorICAgICAgICAgICAgICAgICIuZG9FbmRUYWcoKSA9PSBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnLlNLSVBfUEFHRSkiKTsKKyAgICAgICAgICAgIG91dC5wdXNoSW5kZW50KCk7CisgICAgICAgICAgICBpZiAoaXNUYWdGaWxlIHx8IGlzRnJhZ21lbnQpIHsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRpbCgidGhyb3cgbmV3IFNraXBQYWdlRXhjZXB0aW9uKCk7Iik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG91dC5wcmludGlsKChtZXRob2ROZXN0aW5nID4gMCkgPyAicmV0dXJuIHRydWU7IiA6ICJyZXR1cm47Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXQucG9wSW5kZW50KCk7CisKKyAgICAgICAgICAgIC8vIFN5bmNocm9uaXplIEFUX0JFR0lOIHNjcmlwdGluZyB2YXJpYWJsZXMKKyAgICAgICAgICAgIHN5bmNTY3JpcHRpbmdWYXJzKG4sIFZhcmlhYmxlSW5mby5BVF9CRUdJTik7CisKKyAgICAgICAgICAgIC8vIFRyeUNhdGNoRmluYWxseQorICAgICAgICAgICAgaWYgKG4uaW1wbGVtZW50c1RyeUNhdGNoRmluYWxseSgpKSB7CisgICAgICAgICAgICAgICAgb3V0LnBvcEluZGVudCgpOyAvLyB0cnkKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRpbCgifSBjYXRjaCAoVGhyb3dhYmxlIF9qc3B4X2V4Y2VwdGlvbikgeyIpOworICAgICAgICAgICAgICAgIG91dC5wdXNoSW5kZW50KCk7CisKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRpbigid2hpbGUgKCIpOworICAgICAgICAgICAgICAgIG91dC5wcmludCh0YWdQdXNoQm9keUNvdW50VmFyKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiWzBdLS0gPiAwKSIpOworICAgICAgICAgICAgICAgIG91dC5wdXNoSW5kZW50KCk7CisgICAgICAgICAgICAgICAgb3V0LnByaW50aWwoIm91dCA9IF9qc3B4X3BhZ2VfY29udGV4dC5wb3BCb2R5KCk7Iik7CisgICAgICAgICAgICAgICAgb3V0LnBvcEluZGVudCgpOworCisgICAgICAgICAgICAgICAgb3V0LnByaW50aW4odGFnSGFuZGxlclZhcik7CisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIi5kb0NhdGNoKF9qc3B4X2V4Y2VwdGlvbik7Iik7CisgICAgICAgICAgICAgICAgb3V0LnBvcEluZGVudCgpOworICAgICAgICAgICAgICAgIG91dC5wcmludGlsKCJ9IGZpbmFsbHkgeyIpOworICAgICAgICAgICAgICAgIG91dC5wdXNoSW5kZW50KCk7CisgICAgICAgICAgICAgICAgb3V0LnByaW50aW4odGFnSGFuZGxlclZhcik7CisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIi5kb0ZpbmFsbHkoKTsiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGlzUG9vbGluZ0VuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRpbihuLmdldFRhZ0hhbmRsZXJQb29sTmFtZSgpKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoIi5yZXVzZSgiKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQodGFnSGFuZGxlclZhcik7CisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIik7Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChuLmltcGxlbWVudHNUcnlDYXRjaEZpbmFsbHkoKSkgeworICAgICAgICAgICAgICAgIG91dC5wb3BJbmRlbnQoKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRpbCgifSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBEZWNsYXJlIGFuZCBzeW5jaHJvbml6ZSBBVF9FTkQgc2NyaXB0aW5nIHZhcmlhYmxlcyAobXVzdCBkbyB0aGlzCisgICAgICAgICAgICAvLyBvdXRzaWRlIHRoZSB0cnkvY2F0Y2gvZmluYWxseSBibG9jaykKKyAgICAgICAgICAgIGRlY2xhcmVTY3JpcHRpbmdWYXJzKG4sIFZhcmlhYmxlSW5mby5BVF9FTkQpOworICAgICAgICAgICAgc3luY1NjcmlwdGluZ1ZhcnMobiwgVmFyaWFibGVJbmZvLkFUX0VORCk7CisKKyAgICAgICAgICAgIHJlc3RvcmVTY3JpcHRpbmdWYXJzKG4sIFZhcmlhYmxlSW5mby5BVF9CRUdJTik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgZ2VuZXJhdGVDdXN0b21Eb1RhZygKKyAgICAgICAgICAgIE5vZGUuQ3VzdG9tVGFnIG4sCisgICAgICAgICAgICBUYWdIYW5kbGVySW5mbyBoYW5kbGVySW5mbywKKyAgICAgICAgICAgIFN0cmluZyB0YWdIYW5kbGVyVmFyKQorICAgICAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisKKyAgICAgICAgICAgIENsYXNzIHRhZ0hhbmRsZXJDbGFzcyA9IGhhbmRsZXJJbmZvLmdldFRhZ0hhbmRsZXJDbGFzcygpOworCisgICAgICAgICAgICBuLnNldEJlZ2luSmF2YUxpbmUob3V0LmdldEphdmFMaW5lKCkpOworICAgICAgICAgICAgb3V0LnByaW50aW4oIi8vICAiKTsKKyAgICAgICAgICAgIG91dC5wcmludGxuKG4uZ2V0UU5hbWUoKSk7CisKKyAgICAgICAgICAgIC8vIERlY2xhcmUgQVRfQkVHSU4gc2NyaXB0aW5nIHZhcmlhYmxlcworICAgICAgICAgICAgZGVjbGFyZVNjcmlwdGluZ1ZhcnMobiwgVmFyaWFibGVJbmZvLkFUX0JFR0lOKTsKKyAgICAgICAgICAgIHNhdmVTY3JpcHRpbmdWYXJzKG4sIFZhcmlhYmxlSW5mby5BVF9CRUdJTik7CisKKyAgICAgICAgICAgIFN0cmluZyB0YWdIYW5kbGVyQ2xhc3NOYW1lID0KKyAgICAgICAgICAgICAgICBKc3BVdGlsLmdldENhbm9uaWNhbE5hbWUodGFnSGFuZGxlckNsYXNzKTsKKyAgICAgICAgICAgIG91dC5wcmludGluKHRhZ0hhbmRsZXJDbGFzc05hbWUpOworICAgICAgICAgICAgb3V0LnByaW50KCIgIik7CisgICAgICAgICAgICBvdXQucHJpbnQodGFnSGFuZGxlclZhcik7CisgICAgICAgICAgICBvdXQucHJpbnQoIiA9ICIpOworICAgICAgICAgICAgb3V0LnByaW50KCJuZXcgIik7CisgICAgICAgICAgICBvdXQucHJpbnQodGFnSGFuZGxlckNsYXNzTmFtZSk7CisgICAgICAgICAgICBvdXQucHJpbnRsbigiKCk7Iik7CisKKyAgICAgICAgICAgIGdlbmVyYXRlU2V0dGVycyhuLCB0YWdIYW5kbGVyVmFyLCBoYW5kbGVySW5mbywgdHJ1ZSk7CisKKyAgICAgICAgICAgIC8vIFNldCB0aGUgYm9keQorICAgICAgICAgICAgaWYgKGZpbmRKc3BCb2R5KG4pID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIEVuY2Fwc3VsYXRlIGJvZHkgb2YgY3VzdG9tIHRhZyBpbnZvY2F0aW9uIGluIEpzcEZyYWdtZW50CisgICAgICAgICAgICAgICAgICogYW5kIHBhc3MgaXQgdG8gdGFnIGhhbmRsZXIncyBzZXRKc3BCb2R5KCksIHVubGVzcyB0YWcgYm9keQorICAgICAgICAgICAgICAgICAqIGlzIGVtcHR5CisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYgKCFuLmhhc0VtcHR5Qm9keSgpKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGluKHRhZ0hhbmRsZXJWYXIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoIi5zZXRKc3BCb2R5KCIpOworICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZUpzcEZyYWdtZW50KG4sIHRhZ0hhbmRsZXJWYXIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiKTsiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogQm9keSBvZiB0YWcgaXMgdGhlIGJvZHkgb2YgdGhlIDxqc3A6Ym9keT4gZWxlbWVudC4KKyAgICAgICAgICAgICAgICAgKiBUaGUgdmlzaXQgbWV0aG9kIGZvciB0aGF0IGVsZW1lbnQgaXMgZ29pbmcgdG8gZW5jYXBzdWxhdGUKKyAgICAgICAgICAgICAgICAgKiB0aGF0IGVsZW1lbnQncyBib2R5IGluIGEgSnNwRnJhZ21lbnQgYW5kIHBhc3MgaXQgdG8KKyAgICAgICAgICAgICAgICAgKiB0aGUgdGFnIGhhbmRsZXIncyBzZXRKc3BCb2R5KCkKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBTdHJpbmcgdG1wVGFnSGFuZGxlclZhciA9IHNpbXBsZVRhZ0hhbmRsZXJWYXI7CisgICAgICAgICAgICAgICAgc2ltcGxlVGFnSGFuZGxlclZhciA9IHRhZ0hhbmRsZXJWYXI7CisgICAgICAgICAgICAgICAgYm9vbGVhbiB0bXBJc1NpbXBsZVRhZ0hhbmRsZXIgPSBpc1NpbXBsZVRhZ0hhbmRsZXI7CisgICAgICAgICAgICAgICAgaXNTaW1wbGVUYWdIYW5kbGVyID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB2aXNpdEJvZHkobik7CisgICAgICAgICAgICAgICAgc2ltcGxlVGFnSGFuZGxlclZhciA9IHRtcFRhZ0hhbmRsZXJWYXI7CisgICAgICAgICAgICAgICAgaXNTaW1wbGVUYWdIYW5kbGVyID0gdG1wSXNTaW1wbGVUYWdIYW5kbGVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvdXQucHJpbnRpbih0YWdIYW5kbGVyVmFyKTsKKyAgICAgICAgICAgIG91dC5wcmludGxuKCIuZG9UYWcoKTsiKTsKKworICAgICAgICAgICAgcmVzdG9yZVNjcmlwdGluZ1ZhcnMobiwgVmFyaWFibGVJbmZvLkFUX0JFR0lOKTsKKworICAgICAgICAgICAgLy8gU3luY2hyb25pemUgQVRfQkVHSU4gc2NyaXB0aW5nIHZhcmlhYmxlcworICAgICAgICAgICAgc3luY1NjcmlwdGluZ1ZhcnMobiwgVmFyaWFibGVJbmZvLkFUX0JFR0lOKTsKKworICAgICAgICAgICAgLy8gRGVjbGFyZSBhbmQgc3luY2hyb25pemUgQVRfRU5EIHNjcmlwdGluZyB2YXJpYWJsZXMKKyAgICAgICAgICAgIGRlY2xhcmVTY3JpcHRpbmdWYXJzKG4sIFZhcmlhYmxlSW5mby5BVF9FTkQpOworICAgICAgICAgICAgc3luY1NjcmlwdGluZ1ZhcnMobiwgVmFyaWFibGVJbmZvLkFUX0VORCk7CisKKyAgICAgICAgICAgIG4uc2V0RW5kSmF2YUxpbmUob3V0LmdldEphdmFMaW5lKCkpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGRlY2xhcmVTY3JpcHRpbmdWYXJzKE5vZGUuQ3VzdG9tVGFnIG4sIGludCBzY29wZSkgeworCisgICAgICAgICAgICBWZWN0b3IgdmVjID0gbi5nZXRTY3JpcHRpbmdWYXJzKHNjb3BlKTsKKyAgICAgICAgICAgIGlmICh2ZWMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmVjLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIE9iamVjdCBlbGVtID0gdmVjLmVsZW1lbnRBdChpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW0gaW5zdGFuY2VvZiBWYXJpYWJsZUluZm8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFZhcmlhYmxlSW5mbyB2YXJJbmZvID0gKFZhcmlhYmxlSW5mbyllbGVtOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhckluZm8uZ2V0RGVjbGFyZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50aW4odmFySW5mby5nZXRDbGFzc05hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KCIgIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KHZhckluZm8uZ2V0VmFyTmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiID0gbnVsbDsiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRhZ1ZhcmlhYmxlSW5mbyB0YWdWYXJJbmZvID0gKFRhZ1ZhcmlhYmxlSW5mbyllbGVtOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhZ1ZhckluZm8uZ2V0RGVjbGFyZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZhck5hbWUgPSB0YWdWYXJJbmZvLmdldE5hbWVHaXZlbigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YXJOYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyTmFtZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLmdldFRhZ0RhdGEoKS5nZXRBdHRyaWJ1dGVTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnVmFySW5mby5nZXROYW1lRnJvbUF0dHJpYnV0ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdWYXJJbmZvLmdldE5hbWVGcm9tQXR0cmlidXRlKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGlhcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50aW4odGFnVmFySW5mby5nZXRDbGFzc05hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KCIgIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KHZhck5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCIgPSBudWxsOyIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGFzIHBhcnQgb2YgdGhlIGN1c3RvbSB0YWcncyBzdGFydCBlbGVtZW50LgorICAgICAgICAgKgorICAgICAgICAgKiBJZiB0aGUgZ2l2ZW4gY3VzdG9tIHRhZyBoYXMgYSBjdXN0b20gbmVzdGluZyBsZXZlbCBncmVhdGVyIHRoYW4gMCwKKyAgICAgICAgICogc2F2ZSB0aGUgY3VycmVudCB2YWx1ZXMgb2YgaXRzIHNjcmlwdGluZyB2YXJpYWJsZXMgdG8KKyAgICAgICAgICogdGVtcG9yYXJ5IHZhcmlhYmxlcywgc28gdGhvc2UgdmFsdWVzIG1heSBiZSByZXN0b3JlZCBpbiB0aGUgdGFnJ3MKKyAgICAgICAgICogZW5kIGVsZW1lbnQuIFRoaXMgd2F5LCB0aGUgc2NyaXB0aW5nIHZhcmlhYmxlcyBtYXkgYmUgc3luY2hyb25pemVkCisgICAgICAgICAqIGJ5IHRoZSBnaXZlbiB0YWcgd2l0aG91dCBhZmZlY3RpbmcgdGhlaXIgb3JpZ2luYWwgdmFsdWVzLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSB2b2lkIHNhdmVTY3JpcHRpbmdWYXJzKE5vZGUuQ3VzdG9tVGFnIG4sIGludCBzY29wZSkgeworICAgICAgICAgICAgaWYgKG4uZ2V0Q3VzdG9tTmVzdGluZ0xldmVsKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgVGFnVmFyaWFibGVJbmZvW10gdGFnVmFySW5mb3MgPSBuLmdldFRhZ1ZhcmlhYmxlSW5mb3MoKTsKKyAgICAgICAgICAgIFZhcmlhYmxlSW5mb1tdIHZhckluZm9zID0gbi5nZXRWYXJpYWJsZUluZm9zKCk7CisgICAgICAgICAgICBpZiAoKHZhckluZm9zLmxlbmd0aCA9PSAwKSAmJiAodGFnVmFySW5mb3MubGVuZ3RoID09IDApKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodmFySW5mb3MubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFySW5mb3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhckluZm9zW2ldLmdldFNjb3BlKCkgIT0gc2NvcGUpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHNjcmlwdGluZyB2YXJpYWJsZSBoYXMgYmVlbiBkZWNsYXJlZCwgc2tpcCBjb2RlcworICAgICAgICAgICAgICAgICAgICAvLyBmb3Igc2F2aW5nIGFuZCByZXN0b3JpbmcgaXQuCisgICAgICAgICAgICAgICAgICAgIGlmIChuLmdldFNjcmlwdGluZ1ZhcnMoc2NvcGUpLmNvbnRhaW5zKHZhckluZm9zW2ldKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFyTmFtZSA9IHZhckluZm9zW2ldLmdldFZhck5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRtcFZhck5hbWUgPQorICAgICAgICAgICAgICAgICAgICAgICAgIl9qc3B4XyIgKyB2YXJOYW1lICsgIl8iICsgbi5nZXRDdXN0b21OZXN0aW5nTGV2ZWwoKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50aW4odG1wVmFyTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCgiID0gIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCh2YXJOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIjsiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGFnVmFySW5mb3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRhZ1ZhckluZm9zW2ldLmdldFNjb3BlKCkgIT0gc2NvcGUpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHNjcmlwdGluZyB2YXJpYWJsZSBoYXMgYmVlbiBkZWNsYXJlZCwgc2tpcCBjb2RlcworICAgICAgICAgICAgICAgICAgICAvLyBmb3Igc2F2aW5nIGFuZCByZXN0b3JpbmcgaXQuCisgICAgICAgICAgICAgICAgICAgIGlmIChuLmdldFNjcmlwdGluZ1ZhcnMoc2NvcGUpLmNvbnRhaW5zKHRhZ1ZhckluZm9zW2ldKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFyTmFtZSA9IHRhZ1ZhckluZm9zW2ldLmdldE5hbWVHaXZlbigpOworICAgICAgICAgICAgICAgICAgICBpZiAodmFyTmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXJOYW1lID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLmdldFRhZ0RhdGEoKS5nZXRBdHRyaWJ1dGVTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1ZhckluZm9zW2ldLmdldE5hbWVGcm9tQXR0cmlidXRlKCkpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRhZ1ZhckluZm9zW2ldLmdldE5hbWVGcm9tQXR0cmlidXRlKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxpYXMKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0bXBWYXJOYW1lID0KKyAgICAgICAgICAgICAgICAgICAgICAgICJfanNweF8iICsgdmFyTmFtZSArICJfIiArIG4uZ2V0Q3VzdG9tTmVzdGluZ0xldmVsKCk7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGluKHRtcFZhck5hbWUpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoIiA9ICIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQodmFyTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCI7Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGFzIHBhcnQgb2YgdGhlIGN1c3RvbSB0YWcncyBlbmQgZWxlbWVudC4KKyAgICAgICAgICoKKyAgICAgICAgICogSWYgdGhlIGdpdmVuIGN1c3RvbSB0YWcgaGFzIGEgY3VzdG9tIG5lc3RpbmcgbGV2ZWwgZ3JlYXRlciB0aGFuIDAsCisgICAgICAgICAqIHJlc3RvcmUgaXRzIHNjcmlwdGluZyB2YXJpYWJsZXMgdG8gdGhlaXIgb3JpZ2luYWwgdmFsdWVzIHRoYXQgd2VyZQorICAgICAgICAgKiBzYXZlZCBpbiB0aGUgdGFnJ3Mgc3RhcnQgZWxlbWVudC4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgdm9pZCByZXN0b3JlU2NyaXB0aW5nVmFycyhOb2RlLkN1c3RvbVRhZyBuLCBpbnQgc2NvcGUpIHsKKyAgICAgICAgICAgIGlmIChuLmdldEN1c3RvbU5lc3RpbmdMZXZlbCgpID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFRhZ1ZhcmlhYmxlSW5mb1tdIHRhZ1ZhckluZm9zID0gbi5nZXRUYWdWYXJpYWJsZUluZm9zKCk7CisgICAgICAgICAgICBWYXJpYWJsZUluZm9bXSB2YXJJbmZvcyA9IG4uZ2V0VmFyaWFibGVJbmZvcygpOworICAgICAgICAgICAgaWYgKCh2YXJJbmZvcy5sZW5ndGggPT0gMCkgJiYgKHRhZ1ZhckluZm9zLmxlbmd0aCA9PSAwKSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHZhckluZm9zLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhckluZm9zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh2YXJJbmZvc1tpXS5nZXRTY29wZSgpICE9IHNjb3BlKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBzY3JpcHRpbmcgdmFyaWFibGUgaGFzIGJlZW4gZGVjbGFyZWQsIHNraXAgY29kZXMKKyAgICAgICAgICAgICAgICAgICAgLy8gZm9yIHNhdmluZyBhbmQgcmVzdG9yaW5nIGl0LgorICAgICAgICAgICAgICAgICAgICBpZiAobi5nZXRTY3JpcHRpbmdWYXJzKHNjb3BlKS5jb250YWlucyh2YXJJbmZvc1tpXSkpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZhck5hbWUgPSB2YXJJbmZvc1tpXS5nZXRWYXJOYW1lKCk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0bXBWYXJOYW1lID0KKyAgICAgICAgICAgICAgICAgICAgICAgICJfanNweF8iICsgdmFyTmFtZSArICJfIiArIG4uZ2V0Q3VzdG9tTmVzdGluZ0xldmVsKCk7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGluKHZhck5hbWUpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoIiA9ICIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQodG1wVmFyTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCI7Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRhZ1ZhckluZm9zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0YWdWYXJJbmZvc1tpXS5nZXRTY29wZSgpICE9IHNjb3BlKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBzY3JpcHRpbmcgdmFyaWFibGUgaGFzIGJlZW4gZGVjbGFyZWQsIHNraXAgY29kZXMKKyAgICAgICAgICAgICAgICAgICAgLy8gZm9yIHNhdmluZyBhbmQgcmVzdG9yaW5nIGl0LgorICAgICAgICAgICAgICAgICAgICBpZiAobi5nZXRTY3JpcHRpbmdWYXJzKHNjb3BlKS5jb250YWlucyh0YWdWYXJJbmZvc1tpXSkpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZhck5hbWUgPSB0YWdWYXJJbmZvc1tpXS5nZXROYW1lR2l2ZW4oKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhck5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyTmFtZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5nZXRUYWdEYXRhKCkuZ2V0QXR0cmlidXRlU3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdWYXJJbmZvc1tpXS5nZXROYW1lRnJvbUF0dHJpYnV0ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0YWdWYXJJbmZvc1tpXS5nZXROYW1lRnJvbUF0dHJpYnV0ZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsaWFzCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdG1wVmFyTmFtZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAiX2pzcHhfIiArIHZhck5hbWUgKyAiXyIgKyBuLmdldEN1c3RvbU5lc3RpbmdMZXZlbCgpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRpbih2YXJOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KCIgPSAiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KHRtcFZhck5hbWUpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiOyIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIFN5bmNocm9uaXplcyB0aGUgc2NyaXB0aW5nIHZhcmlhYmxlcyBvZiB0aGUgZ2l2ZW4gY3VzdG9tIHRhZyBmb3IKKyAgICAgICAgICogdGhlIGdpdmVuIHNjb3BlLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSB2b2lkIHN5bmNTY3JpcHRpbmdWYXJzKE5vZGUuQ3VzdG9tVGFnIG4sIGludCBzY29wZSkgeworICAgICAgICAgICAgVGFnVmFyaWFibGVJbmZvW10gdGFnVmFySW5mb3MgPSBuLmdldFRhZ1ZhcmlhYmxlSW5mb3MoKTsKKyAgICAgICAgICAgIFZhcmlhYmxlSW5mb1tdIHZhckluZm9zID0gbi5nZXRWYXJpYWJsZUluZm9zKCk7CisKKyAgICAgICAgICAgIGlmICgodmFySW5mb3MubGVuZ3RoID09IDApICYmICh0YWdWYXJJbmZvcy5sZW5ndGggPT0gMCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh2YXJJbmZvcy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YXJJbmZvcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAodmFySW5mb3NbaV0uZ2V0U2NvcGUoKSA9PSBzY29wZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50aW4odmFySW5mb3NbaV0uZ2V0VmFyTmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCgiID0gKCIpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KHZhckluZm9zW2ldLmdldENsYXNzTmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCgiKSBfanNweF9wYWdlX2NvbnRleHQuZmluZEF0dHJpYnV0ZSgiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludChxdW90ZSh2YXJJbmZvc1tpXS5nZXRWYXJOYW1lKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCIpOyIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRhZ1ZhckluZm9zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0YWdWYXJJbmZvc1tpXS5nZXRTY29wZSgpID09IHNjb3BlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHRhZ1ZhckluZm9zW2ldLmdldE5hbWVHaXZlbigpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLmdldFRhZ0RhdGEoKS5nZXRBdHRyaWJ1dGVTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdWYXJJbmZvc1tpXS5nZXROYW1lRnJvbUF0dHJpYnV0ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnVmFySW5mb3NbaV0uZ2V0TmFtZUZyb21BdHRyaWJ1dGUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxpYXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGluKG5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KCIgPSAoIik7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQodGFnVmFySW5mb3NbaV0uZ2V0Q2xhc3NOYW1lKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KCIpIF9qc3B4X3BhZ2VfY29udGV4dC5maW5kQXR0cmlidXRlKCIpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KHF1b3RlKG5hbWUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCIpOyIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQ3JlYXRlcyBhIHRhZyB2YXJpYWJsZSBuYW1lIGJ5IGNvbmNhdGVuYXRpbmcgdGhlIGdpdmVuIHByZWZpeCBhbmQKKyAgICAgICAgICogc2hvcnROYW1lIGFuZCBlbmRjb2RlZCB0byBtYWtlIHRoZSByZXN1bHRhbnQgc3RyaW5nIGEgdmFsaWQgSmF2YQorICAgICAgICAgKiBJZGVudGlmaWVyLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgY3JlYXRlVGFnVmFyTmFtZSgKKyAgICAgICAgICAgIFN0cmluZyBmdWxsTmFtZSwKKyAgICAgICAgICAgIFN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICBTdHJpbmcgc2hvcnROYW1lKSB7CisKKyAgICAgICAgICAgIFN0cmluZyB2YXJOYW1lOworICAgICAgICAgICAgc3luY2hyb25pemVkICh0YWdWYXJOdW1iZXJzKSB7CisgICAgICAgICAgICAgICAgdmFyTmFtZSA9IHByZWZpeCArICJfIiArIHNob3J0TmFtZSArICJfIjsKKyAgICAgICAgICAgICAgICBpZiAodGFnVmFyTnVtYmVycy5nZXQoZnVsbE5hbWUpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgSW50ZWdlciBpID0gKEludGVnZXIpdGFnVmFyTnVtYmVycy5nZXQoZnVsbE5hbWUpOworICAgICAgICAgICAgICAgICAgICB2YXJOYW1lID0gdmFyTmFtZSArIGkuaW50VmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgdGFnVmFyTnVtYmVycy5wdXQoZnVsbE5hbWUsIG5ldyBJbnRlZ2VyKGkuaW50VmFsdWUoKSArIDEpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0YWdWYXJOdW1iZXJzLnB1dChmdWxsTmFtZSwgbmV3IEludGVnZXIoMSkpOworICAgICAgICAgICAgICAgICAgICB2YXJOYW1lID0gdmFyTmFtZSArICIwIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gSnNwVXRpbC5tYWtlWG1sSmF2YUlkZW50aWZpZXIodmFyTmFtZSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFN0cmluZyBldmFsdWF0ZUF0dHJpYnV0ZSgKKyAgICAgICAgICAgIFRhZ0hhbmRsZXJJbmZvIGhhbmRsZXJJbmZvLAorICAgICAgICAgICAgTm9kZS5Kc3BBdHRyaWJ1dGUgYXR0ciwKKyAgICAgICAgICAgIE5vZGUuQ3VzdG9tVGFnIG4sCisgICAgICAgICAgICBTdHJpbmcgdGFnSGFuZGxlclZhcikKKyAgICAgICAgICAgIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCisgICAgICAgICAgICBTdHJpbmcgYXR0clZhbHVlID0gYXR0ci5nZXRWYWx1ZSgpOworICAgICAgICAgICAgaWYgKGF0dHJWYWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKGF0dHIuaXNOYW1lZEF0dHJpYnV0ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChuLmNoZWNrSWZBdHRyaWJ1dGVJc0pzcEZyYWdtZW50KGF0dHIuZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gWFhYIC0gbm8gbmVlZCB0byBnZW5lcmF0ZSB0ZW1wb3JhcnkgdmFyaWFibGUgaGVyZQorICAgICAgICAgICAgICAgICAgICAgICAgYXR0clZhbHVlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZU5hbWVkQXR0cmlidXRlSnNwRnJhZ21lbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIuZ2V0TmFtZWRBdHRyaWJ1dGVOb2RlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ0hhbmRsZXJWYXIpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgYXR0clZhbHVlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZU5hbWVkQXR0cmlidXRlVmFsdWUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIuZ2V0TmFtZWRBdHRyaWJ1dGVOb2RlKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdHJpbmcgbG9jYWxOYW1lID0gYXR0ci5nZXRMb2NhbE5hbWUoKTsKKworICAgICAgICAgICAgTWV0aG9kIG0gPSBudWxsOworICAgICAgICAgICAgQ2xhc3NbXSBjID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChhdHRyLmlzRHluYW1pYygpKSB7CisgICAgICAgICAgICAgICAgYyA9IE9CSkVDVF9DTEFTUzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbSA9IGhhbmRsZXJJbmZvLmdldFNldHRlck1ldGhvZChsb2NhbE5hbWUpOworICAgICAgICAgICAgICAgIGlmIChtID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKAorICAgICAgICAgICAgICAgICAgICAgICAgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJqc3AuZXJyb3IudW5hYmxlLnRvX2ZpbmRfbWV0aG9kIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYyA9IG0uZ2V0UGFyYW1ldGVyVHlwZXMoKTsKKyAgICAgICAgICAgICAgICAvLyBYWFggYXNzZXJ0KGMubGVuZ3RoID4gMCkKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGF0dHIuaXNFeHByZXNzaW9uKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBEbyBub3RoaW5nCisgICAgICAgICAgICB9IGVsc2UgaWYgKGF0dHIuaXNOYW1lZEF0dHJpYnV0ZSgpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFuLmNoZWNrSWZBdHRyaWJ1dGVJc0pzcEZyYWdtZW50KGF0dHIuZ2V0TmFtZSgpKQorICAgICAgICAgICAgICAgICAgICAmJiAhYXR0ci5pc0R5bmFtaWMoKSkgeworICAgICAgICAgICAgICAgICAgICBhdHRyVmFsdWUgPQorICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlckluZm8uZ2V0UHJvcGVydHlFZGl0b3JDbGFzcyhsb2NhbE5hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYXR0ci5pc0VMSW50ZXJwcmV0ZXJJbnB1dCgpKSB7CisgICAgICAgICAgICAgICAgLy8gcnVuIGF0dHJWYWx1ZSB0aHJvdWdoIHRoZSBleHByZXNzaW9uIGludGVycHJldGVyCisgICAgICAgICAgICAgICAgYm9vbGVhbiByZXBsYWNlRVNDID0gYXR0clZhbHVlLmluZGV4T2YoQ29uc3RhbnRzLkVTQykgPiAwOworICAgICAgICAgICAgICAgIGF0dHJWYWx1ZSA9CisgICAgICAgICAgICAgICAgICAgIEpzcFV0aWwuaW50ZXJwcmV0ZXJDYWxsKAorICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1RhZ0ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICBhdHRyVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICBjWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgYXR0ci5nZXRFTCgpLmdldE1hcE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAvLyBYWFggaGFjazogUmVwbGFjZSBFU0Mgd2l0aCAnJCcKKyAgICAgICAgICAgICAgICBpZiAocmVwbGFjZUVTQykgeworICAgICAgICAgICAgICAgICAgICBhdHRyVmFsdWUgPQorICAgICAgICAgICAgICAgICAgICAgICAgIigiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBhdHRyVmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIpLnJlcGxhY2UoIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgQ29uc3RhbnRzLkVTQ1N0cgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgJyQnKSI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhdHRyVmFsdWUgPQorICAgICAgICAgICAgICAgICAgICBjb252ZXJ0U3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgY1swXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJJbmZvLmdldFByb3BlcnR5RWRpdG9yQ2xhc3MobG9jYWxOYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBhdHRyVmFsdWU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2VuZXJhdGUgY29kZSB0byBjcmVhdGUgYSBtYXAgZm9yIHRoZSBhbGlhcyB2YXJpYWJsZXMKKyAgICAgICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgbWFwCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIFN0cmluZyBnZW5lcmF0ZUFsaWFzTWFwKE5vZGUuQ3VzdG9tVGFnIG4sIFN0cmluZyB0YWdIYW5kbGVyVmFyKQorICAgICAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisKKyAgICAgICAgICAgIFRhZ1ZhcmlhYmxlSW5mb1tdIHRhZ1ZhcnMgPSBuLmdldFRhZ1ZhcmlhYmxlSW5mb3MoKTsKKyAgICAgICAgICAgIFN0cmluZyBhbGlhc01hcFZhciA9IG51bGw7CisKKyAgICAgICAgICAgIGJvb2xlYW4gYWxpYXNTZWVuID0gZmFsc2U7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRhZ1ZhcnMubGVuZ3RoOyBpKyspIHsKKworICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lRnJvbSA9IHRhZ1ZhcnNbaV0uZ2V0TmFtZUZyb21BdHRyaWJ1dGUoKTsKKyAgICAgICAgICAgICAgICBpZiAobmFtZUZyb20gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYWxpYXNlZE5hbWUgPSBuLmdldEF0dHJpYnV0ZVZhbHVlKG5hbWVGcm9tKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFsaWFzZWROYW1lID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIWFsaWFzU2VlbikgeworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50aW4oImphdmEudXRpbC5IYXNoTWFwICIpOworICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXNNYXBWYXIgPSB0YWdIYW5kbGVyVmFyICsgIl9hbGlhc01hcCI7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoYWxpYXNNYXBWYXIpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIiA9IG5ldyBqYXZhLnV0aWwuSGFzaE1hcCgpOyIpOworICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXNTZWVuID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRpbihhbGlhc01hcFZhcik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCgiLnB1dCgiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KHF1b3RlKHRhZ1ZhcnNbaV0uZ2V0TmFtZUdpdmVuKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KCIsICIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQocXVvdGUoYWxpYXNlZE5hbWUpKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIik7Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGFsaWFzTWFwVmFyOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGdlbmVyYXRlU2V0dGVycygKKyAgICAgICAgICAgIE5vZGUuQ3VzdG9tVGFnIG4sCisgICAgICAgICAgICBTdHJpbmcgdGFnSGFuZGxlclZhciwKKyAgICAgICAgICAgIFRhZ0hhbmRsZXJJbmZvIGhhbmRsZXJJbmZvLAorICAgICAgICAgICAgYm9vbGVhbiBzaW1wbGVUYWcpCisgICAgICAgICAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKworICAgICAgICAgICAgLy8gU2V0IGNvbnRleHQKKyAgICAgICAgICAgIGlmIChzaW1wbGVUYWcpIHsKKyAgICAgICAgICAgICAgICAvLyBHZW5lcmF0ZSBhbGlhcyBtYXAKKyAgICAgICAgICAgICAgICBTdHJpbmcgYWxpYXNNYXBWYXIgPSBudWxsOworICAgICAgICAgICAgICAgIGlmIChuLmlzVGFnRmlsZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGFsaWFzTWFwVmFyID0gZ2VuZXJhdGVBbGlhc01hcChuLCB0YWdIYW5kbGVyVmFyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb3V0LnByaW50aW4odGFnSGFuZGxlclZhcik7CisgICAgICAgICAgICAgICAgaWYgKGFsaWFzTWFwVmFyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIi5zZXRKc3BDb250ZXh0KF9qc3B4X3BhZ2VfY29udGV4dCk7Iik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KCIuc2V0SnNwQ29udGV4dChfanNweF9wYWdlX2NvbnRleHQsICIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoYWxpYXNNYXBWYXIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiKTsiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG91dC5wcmludGluKHRhZ0hhbmRsZXJWYXIpOworICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCIuc2V0UGFnZUNvbnRleHQoX2pzcHhfcGFnZV9jb250ZXh0KTsiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gU2V0IHBhcmVudAorICAgICAgICAgICAgaWYgKCFzaW1wbGVUYWcpIHsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRpbih0YWdIYW5kbGVyVmFyKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoIi5zZXRQYXJlbnQoIik7CisgICAgICAgICAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpc1NpbXBsZVRhZ1BhcmVudCkgeworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KCJuZXcgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZ0FkYXB0ZXIoIik7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoIihqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuU2ltcGxlVGFnKSAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludChwYXJlbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIikpOyIpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KCIoamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZykgIik7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQocGFyZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCIpOyIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIm51bGwpOyIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIHNldFBhcmVudCgpIG1ldGhvZCBuZWVkIG5vdCBiZSBjYWxsZWQgaWYgdGhlIHZhbHVlIGJlaW5nCisgICAgICAgICAgICAgICAgLy8gcGFzc2VkIGlzIG51bGwsIHNpbmNlIFNpbXBsZVRhZyBpbnN0YW5jZXMgYXJlIG5vdCByZXVzZWQKKyAgICAgICAgICAgICAgICBpZiAocGFyZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50aW4odGFnSGFuZGxlclZhcik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCgiLnNldFBhcmVudCgiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KHBhcmVudCk7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCIpOyIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTm9kZS5Kc3BBdHRyaWJ1dGVbXSBhdHRycyA9IG4uZ2V0SnNwQXR0cmlidXRlcygpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGF0dHJzICE9IG51bGwgJiYgaSA8IGF0dHJzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGF0dHJWYWx1ZSA9CisgICAgICAgICAgICAgICAgICAgIGV2YWx1YXRlQXR0cmlidXRlKGhhbmRsZXJJbmZvLCBhdHRyc1tpXSwgbiwgdGFnSGFuZGxlclZhcik7CisKKyAgICAgICAgICAgICAgICBpZiAoYXR0cnNbaV0uaXNEeW5hbWljKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50aW4odGFnSGFuZGxlclZhcik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCgiLiIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoInNldER5bmFtaWNBdHRyaWJ1dGUoIik7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyB1cmkgPSBhdHRyc1tpXS5nZXRVUkkoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCIiLmVxdWFscyh1cmkpIHx8ICh1cmkgPT0gbnVsbCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCgibnVsbCIpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KCJcIiIgKyBhdHRyc1tpXS5nZXRVUkkoKSArICJcIiIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCgiLCBcIiIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoYXR0cnNbaV0uZ2V0TG9jYWxOYW1lKCkpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoIlwiLCAiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KGF0dHJWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCIpOyIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGluKHRhZ0hhbmRsZXJWYXIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoIi4iKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KAorICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlckluZm8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0U2V0dGVyTWV0aG9kKGF0dHJzW2ldLmdldExvY2FsTmFtZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoIigiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KGF0dHJWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCIpOyIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIEBwYXJhbSBjIFRoZSB0YXJnZXQgY2xhc3MgdG8gd2hpY2ggdG8gY29lcmNlIHRoZSBnaXZlbiBzdHJpbmcKKyAgICAgICAgICogQHBhcmFtIHMgVGhlIHN0cmluZyB2YWx1ZQorICAgICAgICAgKiBAcGFyYW0gYXR0ck5hbWUgVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB3aG9zZSB2YWx1ZSBpcyBiZWluZworICAgICAgICAgKiBzdXBwbGllZAorICAgICAgICAgKiBAcGFyYW0gcHJvcEVkaXRvckNsYXNzIFRoZSBwcm9wZXJ0eSBlZGl0b3IgZm9yIHRoZSBnaXZlbiBhdHRyaWJ1dGUKKyAgICAgICAgICogQHBhcmFtIGlzTmFtZWRBdHRyaWJ1dGUgdHJ1ZSBpZiB0aGUgZ2l2ZW4gYXR0cmlidXRlIGlzIGEgbmFtZWQKKyAgICAgICAgICogYXR0cmlidXRlICh0aGF0IGlzLCBzcGVjaWZpZWQgdXNpbmcgdGhlIGpzcDphdHRyaWJ1dGUgc3RhbmRhcmQKKyAgICAgICAgICogYWN0aW9uKSwgYW5kIGZhbHNlIG90aGVyd2lzZQorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgY29udmVydFN0cmluZygKKyAgICAgICAgICAgIENsYXNzIGMsCisgICAgICAgICAgICBTdHJpbmcgcywKKyAgICAgICAgICAgIFN0cmluZyBhdHRyTmFtZSwKKyAgICAgICAgICAgIENsYXNzIHByb3BFZGl0b3JDbGFzcywKKyAgICAgICAgICAgIGJvb2xlYW4gaXNOYW1lZEF0dHJpYnV0ZSkKKyAgICAgICAgICAgIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCisgICAgICAgICAgICBTdHJpbmcgcXVvdGVkID0gczsKKyAgICAgICAgICAgIGlmICghaXNOYW1lZEF0dHJpYnV0ZSkgeworICAgICAgICAgICAgICAgIHF1b3RlZCA9IHF1b3RlKHMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocHJvcEVkaXRvckNsYXNzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gSnNwVXRpbC5nZXRDYW5vbmljYWxOYW1lKGMpOworICAgICAgICAgICAgICAgIHJldHVybiAiKCIKKyAgICAgICAgICAgICAgICAgICAgKyBjbGFzc05hbWUKKyAgICAgICAgICAgICAgICAgICAgKyAiKW9yZy5hcGFjaGUuamFzcGVyLnJ1bnRpbWUuSnNwUnVudGltZUxpYnJhcnkuZ2V0VmFsdWVGcm9tQmVhbkluZm9Qcm9wZXJ0eUVkaXRvcigiCisgICAgICAgICAgICAgICAgICAgICsgY2xhc3NOYW1lCisgICAgICAgICAgICAgICAgICAgICsgIi5jbGFzcywgXCIiCisgICAgICAgICAgICAgICAgICAgICsgYXR0ck5hbWUKKyAgICAgICAgICAgICAgICAgICAgKyAiXCIsICIKKyAgICAgICAgICAgICAgICAgICAgKyBxdW90ZWQKKyAgICAgICAgICAgICAgICAgICAgKyAiLCAiCisgICAgICAgICAgICAgICAgICAgICsgSnNwVXRpbC5nZXRDYW5vbmljYWxOYW1lKHByb3BFZGl0b3JDbGFzcykKKyAgICAgICAgICAgICAgICAgICAgKyAiLmNsYXNzKSI7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPT0gU3RyaW5nLmNsYXNzKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHF1b3RlZDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSBib29sZWFuLmNsYXNzKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEpzcFV0aWwuY29lcmNlVG9QcmltaXRpdmVCb29sZWFuKHMsIGlzTmFtZWRBdHRyaWJ1dGUpOworICAgICAgICAgICAgfSBlbHNlIGlmIChjID09IEJvb2xlYW4uY2xhc3MpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gSnNwVXRpbC5jb2VyY2VUb0Jvb2xlYW4ocywgaXNOYW1lZEF0dHJpYnV0ZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPT0gYnl0ZS5jbGFzcykgeworICAgICAgICAgICAgICAgIHJldHVybiBKc3BVdGlsLmNvZXJjZVRvUHJpbWl0aXZlQnl0ZShzLCBpc05hbWVkQXR0cmlidXRlKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSBCeXRlLmNsYXNzKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEpzcFV0aWwuY29lcmNlVG9CeXRlKHMsIGlzTmFtZWRBdHRyaWJ1dGUpOworICAgICAgICAgICAgfSBlbHNlIGlmIChjID09IGNoYXIuY2xhc3MpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gSnNwVXRpbC5jb2VyY2VUb0NoYXIocywgaXNOYW1lZEF0dHJpYnV0ZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPT0gQ2hhcmFjdGVyLmNsYXNzKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEpzcFV0aWwuY29lcmNlVG9DaGFyYWN0ZXIocywgaXNOYW1lZEF0dHJpYnV0ZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPT0gZG91YmxlLmNsYXNzKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEpzcFV0aWwuY29lcmNlVG9QcmltaXRpdmVEb3VibGUocywgaXNOYW1lZEF0dHJpYnV0ZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPT0gRG91YmxlLmNsYXNzKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEpzcFV0aWwuY29lcmNlVG9Eb3VibGUocywgaXNOYW1lZEF0dHJpYnV0ZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPT0gZmxvYXQuY2xhc3MpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gSnNwVXRpbC5jb2VyY2VUb1ByaW1pdGl2ZUZsb2F0KHMsIGlzTmFtZWRBdHRyaWJ1dGUpOworICAgICAgICAgICAgfSBlbHNlIGlmIChjID09IEZsb2F0LmNsYXNzKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEpzcFV0aWwuY29lcmNlVG9GbG9hdChzLCBpc05hbWVkQXR0cmlidXRlKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSBpbnQuY2xhc3MpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gSnNwVXRpbC5jb2VyY2VUb0ludChzLCBpc05hbWVkQXR0cmlidXRlKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSBJbnRlZ2VyLmNsYXNzKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEpzcFV0aWwuY29lcmNlVG9JbnRlZ2VyKHMsIGlzTmFtZWRBdHRyaWJ1dGUpOworICAgICAgICAgICAgfSBlbHNlIGlmIChjID09IHNob3J0LmNsYXNzKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEpzcFV0aWwuY29lcmNlVG9QcmltaXRpdmVTaG9ydChzLCBpc05hbWVkQXR0cmlidXRlKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSBTaG9ydC5jbGFzcykgeworICAgICAgICAgICAgICAgIHJldHVybiBKc3BVdGlsLmNvZXJjZVRvU2hvcnQocywgaXNOYW1lZEF0dHJpYnV0ZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPT0gbG9uZy5jbGFzcykgeworICAgICAgICAgICAgICAgIHJldHVybiBKc3BVdGlsLmNvZXJjZVRvUHJpbWl0aXZlTG9uZyhzLCBpc05hbWVkQXR0cmlidXRlKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSBMb25nLmNsYXNzKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEpzcFV0aWwuY29lcmNlVG9Mb25nKHMsIGlzTmFtZWRBdHRyaWJ1dGUpOworICAgICAgICAgICAgfSBlbHNlIGlmIChjID09IE9iamVjdC5jbGFzcykgeworICAgICAgICAgICAgICAgIHJldHVybiAibmV3IFN0cmluZygiICsgcXVvdGVkICsgIikiOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gSnNwVXRpbC5nZXRDYW5vbmljYWxOYW1lKGMpOworICAgICAgICAgICAgICAgIHJldHVybiAiKCIKKyAgICAgICAgICAgICAgICAgICAgKyBjbGFzc05hbWUKKyAgICAgICAgICAgICAgICAgICAgKyAiKW9yZy5hcGFjaGUuamFzcGVyLnJ1bnRpbWUuSnNwUnVudGltZUxpYnJhcnkuZ2V0VmFsdWVGcm9tUHJvcGVydHlFZGl0b3JNYW5hZ2VyKCIKKyAgICAgICAgICAgICAgICAgICAgKyBjbGFzc05hbWUKKyAgICAgICAgICAgICAgICAgICAgKyAiLmNsYXNzLCBcIiIKKyAgICAgICAgICAgICAgICAgICAgKyBhdHRyTmFtZQorICAgICAgICAgICAgICAgICAgICArICJcIiwgIgorICAgICAgICAgICAgICAgICAgICArIHF1b3RlZAorICAgICAgICAgICAgICAgICAgICArICIpIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIENvbnZlcnRzIHRoZSBzY29wZSBzdHJpbmcgcmVwcmVzZW50YXRpb24sIHdob3NlIHBvc3NpYmxlIHZhbHVlcworICAgICAgICAgKiBhcmUgInBhZ2UiLCAicmVxdWVzdCIsICJzZXNzaW9uIiwgYW5kICJhcHBsaWNhdGlvbiIsIHRvIHRoZQorICAgICAgICAgKiBjb3JyZXNwb25kaW5nIHNjb3BlIGNvbnN0YW50LgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0U2NvcGVDb25zdGFudChTdHJpbmcgc2NvcGUpIHsKKyAgICAgICAgICAgIFN0cmluZyBzY29wZU5hbWUgPSAiUGFnZUNvbnRleHQuUEFHRV9TQ09QRSI7IC8vIERlZmF1bHQgdG8gcGFnZQorCisgICAgICAgICAgICBpZiAoInJlcXVlc3QiLmVxdWFscyhzY29wZSkpIHsKKyAgICAgICAgICAgICAgICBzY29wZU5hbWUgPSAiUGFnZUNvbnRleHQuUkVRVUVTVF9TQ09QRSI7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCJzZXNzaW9uIi5lcXVhbHMoc2NvcGUpKSB7CisgICAgICAgICAgICAgICAgc2NvcGVOYW1lID0gIlBhZ2VDb250ZXh0LlNFU1NJT05fU0NPUEUiOworICAgICAgICAgICAgfSBlbHNlIGlmICgiYXBwbGljYXRpb24iLmVxdWFscyhzY29wZSkpIHsKKyAgICAgICAgICAgICAgICBzY29wZU5hbWUgPSAiUGFnZUNvbnRleHQuQVBQTElDQVRJT05fU0NPUEUiOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gc2NvcGVOYW1lOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdlbmVyYXRlcyBhbm9ueW1vdXMgSnNwRnJhZ21lbnQgaW5uZXIgY2xhc3Mgd2hpY2ggaXMgcGFzc2VkIGFzIGFuCisgICAgICAgICAqIGFyZ3VtZW50IHRvIFNpbXBsZVRhZy5zZXRKc3BCb2R5KCkuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIHZvaWQgZ2VuZXJhdGVKc3BGcmFnbWVudChOb2RlIG4sIFN0cmluZyB0YWdIYW5kbGVyVmFyKQorICAgICAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICAvLyBYWFggLSBBIHBvc3NpYmxlIG9wdGltaXphdGlvbiBoZXJlIHdvdWxkIGJlIHRvIGNoZWNrIHRvIHNlZQorICAgICAgICAgICAgLy8gaWYgdGhlIG9ubHkgY2hpbGQgb2YgdGhlIHBhcmVudCBub2RlIGlzIFRlbXBsYXRlVGV4dC4gIElmIHNvLAorICAgICAgICAgICAgLy8gd2Uga25vdyB0aGVyZSB3b24ndCBiZSBhbnkgcGFyYW1ldGVycywgZXRjLCBzbyB3ZSBjYW4KKyAgICAgICAgICAgIC8vIGdlbmVyYXRlIGEgbG93LW92ZXJoZWFkIEpzcEZyYWdtZW50IHRoYXQganVzdCBlY2hvZXMgaXRzCisgICAgICAgICAgICAvLyBib2R5LiAgVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnJhZ21lbnQgY2FuIGNvbWUgZnJvbQorICAgICAgICAgICAgLy8gdGhlIG9yZy5hcGFjaGUuamFzcGVyLnJ1bnRpbWUgcGFja2FnZSBhcyBhIHN1cHBvcnQgY2xhc3MuCisgICAgICAgICAgICBGcmFnbWVudEhlbHBlckNsYXNzLkZyYWdtZW50IGZyYWdtZW50ID0KKyAgICAgICAgICAgICAgICBmcmFnbWVudEhlbHBlckNsYXNzLm9wZW5GcmFnbWVudCgKKyAgICAgICAgICAgICAgICAgICAgbiwKKyAgICAgICAgICAgICAgICAgICAgdGFnSGFuZGxlclZhciwKKyAgICAgICAgICAgICAgICAgICAgbWV0aG9kTmVzdGluZyk7CisgICAgICAgICAgICBTZXJ2bGV0V3JpdGVyIG91dFNhdmUgPSBvdXQ7CisgICAgICAgICAgICBvdXQgPSBmcmFnbWVudC5nZXRHZW5CdWZmZXIoKS5nZXRPdXQoKTsKKyAgICAgICAgICAgIFN0cmluZyB0bXBQYXJlbnQgPSBwYXJlbnQ7CisgICAgICAgICAgICBwYXJlbnQgPSAiX2pzcHhfcGFyZW50IjsKKyAgICAgICAgICAgIGJvb2xlYW4gaXNTaW1wbGVUYWdQYXJlbnRTYXZlID0gaXNTaW1wbGVUYWdQYXJlbnQ7CisgICAgICAgICAgICBpc1NpbXBsZVRhZ1BhcmVudCA9IHRydWU7CisgICAgICAgICAgICBib29sZWFuIHRtcElzRnJhZ21lbnQgPSBpc0ZyYWdtZW50OworICAgICAgICAgICAgaXNGcmFnbWVudCA9IHRydWU7CisgICAgICAgICAgICBTdHJpbmcgcHVzaEJvZHlDb3VudFZhclNhdmUgPSBwdXNoQm9keUNvdW50VmFyOworICAgICAgICAgICAgaWYgKHB1c2hCb2R5Q291bnRWYXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIFVzZSBhIGZpeGVkIG5hbWUgZm9yIHB1c2ggYm9keSBjb3VudCwgdG8gc2ltcGxpZnkgY29kZSBnZW4KKyAgICAgICAgICAgICAgICBwdXNoQm9keUNvdW50VmFyID0gIl9qc3B4X3B1c2hfYm9keV9jb3VudCI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2aXNpdEJvZHkobik7CisgICAgICAgICAgICBvdXQgPSBvdXRTYXZlOworICAgICAgICAgICAgcGFyZW50ID0gdG1wUGFyZW50OworICAgICAgICAgICAgaXNTaW1wbGVUYWdQYXJlbnQgPSBpc1NpbXBsZVRhZ1BhcmVudFNhdmU7CisgICAgICAgICAgICBpc0ZyYWdtZW50ID0gdG1wSXNGcmFnbWVudDsKKyAgICAgICAgICAgIHB1c2hCb2R5Q291bnRWYXIgPSBwdXNoQm9keUNvdW50VmFyU2F2ZTsKKyAgICAgICAgICAgIGZyYWdtZW50SGVscGVyQ2xhc3MuY2xvc2VGcmFnbWVudChmcmFnbWVudCwgbWV0aG9kTmVzdGluZyk7CisgICAgICAgICAgICAvLyBYWFggLSBOZWVkIHRvIGNoYW5nZSBwYWdlQ29udGV4dCB0byBqc3BDb250ZXh0IGlmCisgICAgICAgICAgICAvLyB3ZSdyZSBub3QgaW4gYSBwbGFjZSB3aGVyZSBwYWdlQ29udGV4dCBpcyBkZWZpbmVkIChlLmcuCisgICAgICAgICAgICAvLyBpbiBhIGZyYWdtZW50IG9yIGluIGEgdGFnIGZpbGUuCisgICAgICAgICAgICBvdXQucHJpbnQoCisgICAgICAgICAgICAgICAgIm5ldyAiCisgICAgICAgICAgICAgICAgICAgICsgZnJhZ21lbnRIZWxwZXJDbGFzcy5nZXRDbGFzc05hbWUoKQorICAgICAgICAgICAgICAgICAgICArICIoICIKKyAgICAgICAgICAgICAgICAgICAgKyBmcmFnbWVudC5nZXRJZCgpCisgICAgICAgICAgICAgICAgICAgICsgIiwgX2pzcHhfcGFnZV9jb250ZXh0LCAiCisgICAgICAgICAgICAgICAgICAgICsgdGFnSGFuZGxlclZhcgorICAgICAgICAgICAgICAgICAgICArICIsICIKKyAgICAgICAgICAgICAgICAgICAgKyBwdXNoQm9keUNvdW50VmFyCisgICAgICAgICAgICAgICAgICAgICsgIikiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZW5lcmF0ZSB0aGUgY29kZSByZXF1aXJlZCB0byBvYnRhaW4gdGhlIHJ1bnRpbWUgdmFsdWUgb2YgdGhlCisgICAgICAgICAqIGdpdmVuIG5hbWVkIGF0dHJpYnV0ZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBUaGUgbmFtZSBvZiB0aGUgdGVtcG9yYXJ5IHZhcmlhYmxlIHRoZSByZXN1bHQgaXMgc3RvcmVkIGluLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyBnZW5lcmF0ZU5hbWVkQXR0cmlidXRlVmFsdWUoTm9kZS5OYW1lZEF0dHJpYnV0ZSBuKQorICAgICAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisKKyAgICAgICAgICAgIFN0cmluZyB2YXJOYW1lID0gbi5nZXRUZW1wb3JhcnlWYXJpYWJsZU5hbWUoKTsKKworICAgICAgICAgICAgLy8gSWYgdGhlIG9ubHkgYm9keSBlbGVtZW50IGZvciB0aGlzIG5hbWVkIGF0dHJpYnV0ZSBub2RlIGlzCisgICAgICAgICAgICAvLyB0ZW1wbGF0ZSB0ZXh0LCB3ZSBuZWVkIG5vdCBnZW5lcmF0ZSBhbiBleHRyYSBjYWxsIHRvCisgICAgICAgICAgICAvLyBwdXNoQm9keSBhbmQgcG9wQm9keS4gIE1heWJlIHdlIGNhbiBmdXJ0aGVyIG9wdGltaXplCisgICAgICAgICAgICAvLyBoZXJlIGJ5IGdldHRpbmcgcmlkIG9mIHRoZSB0ZW1wb3JhcnkgdmFyaWFibGUsIGJ1dCBpbgorICAgICAgICAgICAgLy8gcmVhbGl0eSBpdCBsb29rcyBsaWtlIGphdmFjIGRvZXMgdGhpcyBmb3IgdXMuCisgICAgICAgICAgICBOb2RlLk5vZGVzIGJvZHkgPSBuLmdldEJvZHkoKTsKKyAgICAgICAgICAgIGlmIChib2R5ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBib29sZWFuIHRlbXBsYXRlVGV4dE9wdGltaXphdGlvbiA9IGZhbHNlOworICAgICAgICAgICAgICAgIGlmIChib2R5LnNpemUoKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIE5vZGUgYm9keUVsZW1lbnQgPSBib2R5LmdldE5vZGUoMCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChib2R5RWxlbWVudCBpbnN0YW5jZW9mIE5vZGUuVGVtcGxhdGVUZXh0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVRleHRPcHRpbWl6YXRpb24gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50aWwoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN0cmluZyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdmFyTmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgPSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcXVvdGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTm9kZS5UZW1wbGF0ZVRleHQpYm9keUVsZW1lbnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRUZXh0KCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICI7Iik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBYWFggLSBBbm90aGVyIHBvc3NpYmxlIG9wdGltaXphdGlvbiB3b3VsZCBiZSBmb3IKKyAgICAgICAgICAgICAgICAvLyBsb25lIEVMIGV4cHJlc3Npb25zIChubyBuZWVkIHRvIHB1c2hCb2R5IGhlcmUgZWl0aGVyKS4KKworICAgICAgICAgICAgICAgIGlmICghdGVtcGxhdGVUZXh0T3B0aW1pemF0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGlsKCJvdXQgPSBfanNweF9wYWdlX2NvbnRleHQucHVzaEJvZHkoKTsiKTsKKyAgICAgICAgICAgICAgICAgICAgdmlzaXRCb2R5KG4pOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRpbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICJTdHJpbmcgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdmFyTmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiA9ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIoKGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5Cb2R5Q29udGVudCkiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAib3V0KS5nZXRTdHJpbmcoKTsiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50aWwoIm91dCA9IF9qc3B4X3BhZ2VfY29udGV4dC5wb3BCb2R5KCk7Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBFbXB0eSBib2R5IG11c3QgYmUgdHJlYXRlZCBhcyAiIgorICAgICAgICAgICAgICAgIG91dC5wcmludGlsKCJTdHJpbmcgIiArIHZhck5hbWUgKyAiID0gXCJcIjsiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHZhck5hbWU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2ltaWxhciB0byBnZW5lcmF0ZU5hbWVkQXR0cmlidXRlVmFsdWUsIGJ1dCBjcmVhdGUgYSBKc3BGcmFnbWVudAorICAgICAgICAgKiBpbnN0ZWFkLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbiBUaGUgcGFyZW50IG5vZGUgb2YgdGhlIG5hbWVkIGF0dHJpYnV0ZQorICAgICAgICAgKiBAcGFyYW0gdGFnSGFuZGxlclZhciBUaGUgdmFyaWFibGUgdGhlIHRhZyBoYW5kbGVyIGlzIHN0b3JlZCBpbiwKKyAgICAgICAgICogICAgIHNvIHRoZSBmcmFnbWVudCBrbm93cyBpdHMgcGFyZW50IHRhZy4KKyAgICAgICAgICogQHJldHVybiBUaGUgbmFtZSBvZiB0aGUgdGVtcG9yYXJ5IHZhcmlhYmxlIHRoZSBmcmFnbWVudAorICAgICAgICAgKiAgICAgaXMgc3RvcmVkIGluLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyBnZW5lcmF0ZU5hbWVkQXR0cmlidXRlSnNwRnJhZ21lbnQoCisgICAgICAgICAgICBOb2RlLk5hbWVkQXR0cmlidXRlIG4sCisgICAgICAgICAgICBTdHJpbmcgdGFnSGFuZGxlclZhcikKKyAgICAgICAgICAgIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgU3RyaW5nIHZhck5hbWUgPSBuLmdldFRlbXBvcmFyeVZhcmlhYmxlTmFtZSgpOworCisgICAgICAgICAgICBvdXQucHJpbnRpbigKKyAgICAgICAgICAgICAgICAiamF2YXguc2VydmxldC5qc3AudGFnZXh0LkpzcEZyYWdtZW50ICIgKyB2YXJOYW1lICsgIiA9ICIpOworICAgICAgICAgICAgZ2VuZXJhdGVKc3BGcmFnbWVudChuLCB0YWdIYW5kbGVyVmFyKTsKKyAgICAgICAgICAgIG91dC5wcmludGxuKCI7Iik7CisKKyAgICAgICAgICAgIHJldHVybiB2YXJOYW1lOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBnZW5lcmF0ZUxvY2FsVmFyaWFibGVzKFNlcnZsZXRXcml0ZXIgb3V0LCBOb2RlIG4pCisgICAgICAgIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICBOb2RlLkNoaWxkSW5mbyBjaTsKKyAgICAgICAgaWYgKG4gaW5zdGFuY2VvZiBOb2RlLkN1c3RvbVRhZykgeworICAgICAgICAgICAgY2kgPSAoKE5vZGUuQ3VzdG9tVGFnKW4pLmdldENoaWxkSW5mbygpOworICAgICAgICB9IGVsc2UgaWYgKG4gaW5zdGFuY2VvZiBOb2RlLkpzcEJvZHkpIHsKKyAgICAgICAgICAgIGNpID0gKChOb2RlLkpzcEJvZHkpbikuZ2V0Q2hpbGRJbmZvKCk7CisgICAgICAgIH0gZWxzZSBpZiAobiBpbnN0YW5jZW9mIE5vZGUuTmFtZWRBdHRyaWJ1dGUpIHsKKyAgICAgICAgICAgIGNpID0gKChOb2RlLk5hbWVkQXR0cmlidXRlKW4pLmdldENoaWxkSW5mbygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gQ2Fubm90IGFjY2VzcyBlcnIgc2luY2UgdGhpcyBtZXRob2QgaXMgc3RhdGljLCBidXQgYXQKKyAgICAgICAgICAgIC8vIGxlYXN0IGZsYWcgYW4gZXJyb3IuCisgICAgICAgICAgICB0aHJvdyBuZXcgSmFzcGVyRXhjZXB0aW9uKCJVbmV4cGVjdGVkIE5vZGUgVHlwZSIpOworICAgICAgICAgICAgLy9lcnIuZ2V0U3RyaW5nKAorICAgICAgICAgICAgLy8gICAgImpzcC5lcnJvci5pbnRlcm5hbC51bmV4cGVjdGVkX25vZGVfdHlwZSIgKSApOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNpLmhhc1VzZUJlYW4oKSkgeworICAgICAgICAgICAgb3V0LnByaW50aWwoIkh0dHBTZXNzaW9uIHNlc3Npb24gPSBfanNweF9wYWdlX2NvbnRleHQuZ2V0U2Vzc2lvbigpOyIpOworICAgICAgICAgICAgb3V0LnByaW50aWwoCisgICAgICAgICAgICAgICAgIlNlcnZsZXRDb250ZXh0IGFwcGxpY2F0aW9uID0gX2pzcHhfcGFnZV9jb250ZXh0LmdldFNlcnZsZXRDb250ZXh0KCk7Iik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNpLmhhc1VzZUJlYW4oKQorICAgICAgICAgICAgfHwgY2kuaGFzSW5jbHVkZUFjdGlvbigpCisgICAgICAgICAgICB8fCBjaS5oYXNTZXRQcm9wZXJ0eSgpCisgICAgICAgICAgICB8fCBjaS5oYXNQYXJhbUFjdGlvbigpKSB7CisgICAgICAgICAgICBvdXQucHJpbnRpbCgKKyAgICAgICAgICAgICAgICAiSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QgPSAoSHR0cFNlcnZsZXRSZXF1ZXN0KV9qc3B4X3BhZ2VfY29udGV4dC5nZXRSZXF1ZXN0KCk7Iik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNpLmhhc0luY2x1ZGVBY3Rpb24oKSkgeworICAgICAgICAgICAgb3V0LnByaW50aWwoCisgICAgICAgICAgICAgICAgIkh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UgPSAoSHR0cFNlcnZsZXRSZXNwb25zZSlfanNweF9wYWdlX2NvbnRleHQuZ2V0UmVzcG9uc2UoKTsiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENvbW1vbiBwYXJ0IG9mIHBvc3RhbWJsZSwgc2hhcmVkIGJ5IGJvdGggc2VydmxldHMgYW5kIHRhZyBmaWxlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZ2VuQ29tbW9uUG9zdGFtYmxlKCkgeworICAgICAgICAvLyBBcHBlbmQgYW55IG1ldGhvZHMgdGhhdCB3ZXJlIGdlbmVyYXRlZCBpbiB0aGUgYnVmZmVyLgorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHNCdWZmZXJlZC5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgR2VuQnVmZmVyIG1ldGhvZEJ1ZmZlciA9IChHZW5CdWZmZXIpbWV0aG9kc0J1ZmZlcmVkLmdldChpKTsKKyAgICAgICAgICAgIG1ldGhvZEJ1ZmZlci5hZGp1c3RKYXZhTGluZXMob3V0LmdldEphdmFMaW5lKCkgLSAxKTsKKyAgICAgICAgICAgIG91dC5wcmludE11bHRpTG4obWV0aG9kQnVmZmVyLnRvU3RyaW5nKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQXBwZW5kIHRoZSBoZWxwZXIgY2xhc3MKKyAgICAgICAgaWYgKGZyYWdtZW50SGVscGVyQ2xhc3MuaXNVc2VkKCkpIHsKKyAgICAgICAgICAgIGZyYWdtZW50SGVscGVyQ2xhc3MuZ2VuZXJhdGVQb3N0YW1ibGUoKTsKKyAgICAgICAgICAgIGZyYWdtZW50SGVscGVyQ2xhc3MuYWRqdXN0SmF2YUxpbmVzKG91dC5nZXRKYXZhTGluZSgpIC0gMSk7CisgICAgICAgICAgICBvdXQucHJpbnRNdWx0aUxuKGZyYWdtZW50SGVscGVyQ2xhc3MudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBBcHBlbmQgY2hhciBhcnJheSBkZWNsYXJhdGlvbnMKKyAgICAgICAgaWYgKGNoYXJBcnJheUJ1ZmZlciAhPSBudWxsKSB7CisgICAgICAgICAgICBvdXQucHJpbnRNdWx0aUxuKGNoYXJBcnJheUJ1ZmZlci50b1N0cmluZygpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENsb3NlIHRoZSBjbGFzcyBkZWZpbml0aW9uCisgICAgICAgIG91dC5wb3BJbmRlbnQoKTsKKyAgICAgICAgb3V0LnByaW50aWwoIn0iKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZXMgdGhlIGVuZGluZyBwYXJ0IG9mIHRoZSBzdGF0aWMgcG9ydGlvbiBvZiB0aGUgc2VydmxldC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZ2VuZXJhdGVQb3N0YW1ibGUoTm9kZS5Ob2RlcyBwYWdlKSB7CisgICAgICAgIG91dC5wb3BJbmRlbnQoKTsKKyAgICAgICAgb3V0LnByaW50aWwoIn0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Iik7CisgICAgICAgIG91dC5wdXNoSW5kZW50KCk7CisgICAgICAgIG91dC5wcmludGlsKAorICAgICAgICAgICAgImlmICghKHQgaW5zdGFuY2VvZiBTa2lwUGFnZUV4Y2VwdGlvbikpeyIpOworICAgICAgICBvdXQucHVzaEluZGVudCgpOworICAgICAgICBvdXQucHJpbnRpbCgib3V0ID0gX2pzcHhfb3V0OyIpOworICAgICAgICBvdXQucHJpbnRpbCgiaWYgKG91dCAhPSBudWxsICYmIG91dC5nZXRCdWZmZXJTaXplKCkgIT0gMCkiKTsKKyAgICAgICAgb3V0LnB1c2hJbmRlbnQoKTsKKyAgICAgICAgb3V0LnByaW50aWwoIm91dC5jbGVhckJ1ZmZlcigpOyIpOworICAgICAgICBvdXQucG9wSW5kZW50KCk7CisKKyAgICAgICAgb3V0LnByaW50aWwoCisgICAgICAgICAgICAiaWYgKF9qc3B4X3BhZ2VfY29udGV4dCAhPSBudWxsKSBfanNweF9wYWdlX2NvbnRleHQuaGFuZGxlUGFnZUV4Y2VwdGlvbih0KTsiKTsKKyAgICAgICAgb3V0LnBvcEluZGVudCgpOworICAgICAgICBvdXQucHJpbnRpbCgifSIpOworICAgICAgICBvdXQucG9wSW5kZW50KCk7CisgICAgICAgIG91dC5wcmludGlsKCJ9IGZpbmFsbHkgeyIpOworICAgICAgICBvdXQucHVzaEluZGVudCgpOworCisgICAgICAgIG91dC5wcmludGlsKAorICAgICAgICAgICAgImlmIChfanNweEZhY3RvcnkgIT0gbnVsbCkgX2pzcHhGYWN0b3J5LnJlbGVhc2VQYWdlQ29udGV4dChfanNweF9wYWdlX2NvbnRleHQpOyIpOworCisgICAgICAgIG91dC5wb3BJbmRlbnQoKTsKKyAgICAgICAgb3V0LnByaW50aWwoIn0iKTsKKworICAgICAgICAvLyBDbG9zZSB0aGUgc2VydmljZSBtZXRob2QKKyAgICAgICAgb3V0LnBvcEluZGVudCgpOworICAgICAgICBvdXQucHJpbnRpbCgifSIpOworCisgICAgICAgIC8vIEdlbmVyYXRlZCBtZXRob2RzLCBoZWxwZXIgY2xhc3NlcywgZXRjLgorICAgICAgICBnZW5Db21tb25Qb3N0YW1ibGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4KKyAgICAgKi8KKyAgICBHZW5lcmF0b3IoU2VydmxldFdyaXRlciBvdXQsIENvbXBpbGVyIGNvbXBpbGVyKSB7CisgICAgICAgIHRoaXMub3V0ID0gb3V0OworICAgICAgICBtZXRob2RzQnVmZmVyZWQgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIGNoYXJBcnJheUJ1ZmZlciA9IG51bGw7CisgICAgICAgIGVyciA9IGNvbXBpbGVyLmdldEVycm9yRGlzcGF0Y2hlcigpOworICAgICAgICBjdHh0ID0gY29tcGlsZXIuZ2V0Q29tcGlsYXRpb25Db250ZXh0KCk7CisgICAgICAgIGZyYWdtZW50SGVscGVyQ2xhc3MgPQorICAgICAgICAgICAgbmV3IEZyYWdtZW50SGVscGVyQ2xhc3MoY3R4dC5nZXRTZXJ2bGV0Q2xhc3NOYW1lKCkgKyAiSGVscGVyIik7CisgICAgICAgIHBhZ2VJbmZvID0gY29tcGlsZXIuZ2V0UGFnZUluZm8oKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBUZW1wb3JhcnkgaGFjay4gSWYgYSBKU1AgcGFnZSB1c2VzIHRoZSAiZXh0ZW5kcyIgYXR0cmlidXRlIG9mIHRoZQorICAgICAgICAgKiBwYWdlIGRpcmVjdGl2ZSwgdGhlIF9qc3BJbml0KCkgbWV0aG9kIG9mIHRoZSBnZW5lcmF0ZWQgc2VydmxldCBjbGFzcworICAgICAgICAgKiB3aWxsIG5vdCBiZSBjYWxsZWQgKGl0IGlzIG9ubHkgY2FsbGVkIGZvciB0aG9zZSBnZW5lcmF0ZWQgc2VydmxldHMKKyAgICAgICAgICogdGhhdCBleHRlbmQgSHR0cEpzcEJhc2UsIHRoZSBkZWZhdWx0KSwgY2F1c2luZyB0aGUgdGFnIGhhbmRsZXIgcG9vbHMKKyAgICAgICAgICogbm90IHRvIGJlIGluaXRpYWxpemVkIGFuZCByZXN1bHRpbmcgaW4gYSBOUEUuCisgICAgICAgICAqIFRoZSBKU1Agc3BlYyBuZWVkcyB0byBjbGFyaWZ5IHdoZXRoZXIgY29udGFpbmVycyBjYW4gb3ZlcnJpZGUKKyAgICAgICAgICogaW5pdCgpIGFuZCBkZXN0cm95KCkuIEZvciBub3csIHdlIGp1c3QgZGlzYWJsZSB0YWcgcG9vbGluZyBmb3IgcGFnZXMKKyAgICAgICAgICogdGhhdCB1c2UgImV4dGVuZHMiLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHBhZ2VJbmZvLmdldEV4dGVuZHMoZmFsc2UpID09IG51bGwpIHsKKyAgICAgICAgICAgIGlzUG9vbGluZ0VuYWJsZWQgPSBjdHh0LmdldE9wdGlvbnMoKS5pc1Bvb2xpbmdFbmFibGVkKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpc1Bvb2xpbmdFbmFibGVkID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgYmVhbkluZm8gPSBwYWdlSW5mby5nZXRCZWFuUmVwb3NpdG9yeSgpOworICAgICAgICBicmVha0F0TEYgPSBjdHh0LmdldE9wdGlvbnMoKS5nZXRNYXBwZWRGaWxlKCk7CisgICAgICAgIGlmIChpc1Bvb2xpbmdFbmFibGVkKSB7CisgICAgICAgICAgICB0YWdIYW5kbGVyUG9vbE5hbWVzID0gbmV3IFZlY3RvcigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIG1haW4gZW50cnkgZm9yIEdlbmVyYXRvci4KKyAgICAgKiBAcGFyYW0gb3V0IFRoZSBzZXJ2bGV0IG91dHB1dCB3cml0ZXIKKyAgICAgKiBAcGFyYW0gY29tcGlsZXIgVGhlIGNvbXBpbGVyCisgICAgICogQHBhcmFtIHBhZ2UgVGhlIGlucHV0IHBhZ2UKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZ2VuZXJhdGUoCisgICAgICAgIFNlcnZsZXRXcml0ZXIgb3V0LAorICAgICAgICBDb21waWxlciBjb21waWxlciwKKyAgICAgICAgTm9kZS5Ob2RlcyBwYWdlKQorICAgICAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKworICAgICAgICBHZW5lcmF0b3IgZ2VuID0gbmV3IEdlbmVyYXRvcihvdXQsIGNvbXBpbGVyKTsKKworICAgICAgICBpZiAoZ2VuLmlzUG9vbGluZ0VuYWJsZWQpIHsKKyAgICAgICAgICAgIGdlbi5jb21waWxlVGFnSGFuZGxlclBvb2xMaXN0KHBhZ2UpOworICAgICAgICB9CisgICAgICAgIGlmIChnZW4uY3R4dC5pc1RhZ0ZpbGUoKSkgeworICAgICAgICAgICAgSmFzcGVyVGFnSW5mbyB0YWdJbmZvID0gKEphc3BlclRhZ0luZm8pZ2VuLmN0eHQuZ2V0VGFnSW5mbygpOworICAgICAgICAgICAgZ2VuLmdlbmVyYXRlVGFnSGFuZGxlclByZWFtYmxlKHRhZ0luZm8sIHBhZ2UpOworCisgICAgICAgICAgICBpZiAoZ2VuLmN0eHQuaXNQcm90b3R5cGVNb2RlKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGdlbi5nZW5lcmF0ZVhtbFByb2xvZyhwYWdlKTsKKyAgICAgICAgICAgIGdlbi5mcmFnbWVudEhlbHBlckNsYXNzLmdlbmVyYXRlUHJlYW1ibGUoKTsKKyAgICAgICAgICAgIHBhZ2UudmlzaXQoCisgICAgICAgICAgICAgICAgZ2VuLm5ldyBHZW5lcmF0ZVZpc2l0b3IoCisgICAgICAgICAgICAgICAgICAgIGdlbi5jdHh0LmlzVGFnRmlsZSgpLAorICAgICAgICAgICAgICAgICAgICBvdXQsCisgICAgICAgICAgICAgICAgICAgIGdlbi5tZXRob2RzQnVmZmVyZWQsCisgICAgICAgICAgICAgICAgICAgIGdlbi5mcmFnbWVudEhlbHBlckNsYXNzLAorICAgICAgICAgICAgICAgICAgICBnZW4uY3R4dC5nZXRDbGFzc0xvYWRlcigpLAorICAgICAgICAgICAgICAgICAgICB0YWdJbmZvKSk7CisgICAgICAgICAgICBnZW4uZ2VuZXJhdGVUYWdIYW5kbGVyUG9zdGFtYmxlKHRhZ0luZm8pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZ2VuLmdlbmVyYXRlUHJlYW1ibGUocGFnZSk7CisgICAgICAgICAgICBnZW4uZ2VuZXJhdGVYbWxQcm9sb2cocGFnZSk7CisgICAgICAgICAgICBnZW4uZnJhZ21lbnRIZWxwZXJDbGFzcy5nZW5lcmF0ZVByZWFtYmxlKCk7CisgICAgICAgICAgICBwYWdlLnZpc2l0KAorICAgICAgICAgICAgICAgIGdlbi5uZXcgR2VuZXJhdGVWaXNpdG9yKAorICAgICAgICAgICAgICAgICAgICBnZW4uY3R4dC5pc1RhZ0ZpbGUoKSwKKyAgICAgICAgICAgICAgICAgICAgb3V0LAorICAgICAgICAgICAgICAgICAgICBnZW4ubWV0aG9kc0J1ZmZlcmVkLAorICAgICAgICAgICAgICAgICAgICBnZW4uZnJhZ21lbnRIZWxwZXJDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgZ2VuLmN0eHQuZ2V0Q2xhc3NMb2FkZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgbnVsbCkpOworICAgICAgICAgICAgZ2VuLmdlbmVyYXRlUG9zdGFtYmxlKHBhZ2UpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBHZW5lcmF0ZXMgdGFnIGhhbmRsZXIgcHJlYW1ibGUuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGdlbmVyYXRlVGFnSGFuZGxlclByZWFtYmxlKAorICAgICAgICBKYXNwZXJUYWdJbmZvIHRhZ0luZm8sCisgICAgICAgIE5vZGUuTm9kZXMgdGFnKQorICAgICAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBHZW5lcmF0ZSBwYWNrYWdlIGRlY2xhcmF0aW9uCisgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSB0YWdJbmZvLmdldFRhZ0NsYXNzTmFtZSgpOworICAgICAgICBpbnQgbGFzdEluZGV4ID0gY2xhc3NOYW1lLmxhc3RJbmRleE9mKCcuJyk7CisgICAgICAgIGlmIChsYXN0SW5kZXggIT0gLTEpIHsKKyAgICAgICAgICAgIFN0cmluZyBwa2dOYW1lID0gY2xhc3NOYW1lLnN1YnN0cmluZygwLCBsYXN0SW5kZXgpOworICAgICAgICAgICAgZ2VuUHJlYW1ibGVQYWNrYWdlKHBrZ05hbWUpOworICAgICAgICAgICAgY2xhc3NOYW1lID0gY2xhc3NOYW1lLnN1YnN0cmluZyhsYXN0SW5kZXggKyAxKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEdlbmVyYXRlIGltcG9ydHMKKyAgICAgICAgZ2VuUHJlYW1ibGVJbXBvcnRzKCk7CisKKyAgICAgICAgLy8gR2VuZXJhdGUgY2xhc3MgZGVjbGFyYXRpb24KKyAgICAgICAgb3V0LnByaW50aW4oInB1YmxpYyBmaW5hbCBjbGFzcyAiKTsKKyAgICAgICAgb3V0LnByaW50bG4oY2xhc3NOYW1lKTsKKyAgICAgICAgb3V0LnByaW50aWwoIiAgICBleHRlbmRzIGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5TaW1wbGVUYWdTdXBwb3J0Iik7CisgICAgICAgIG91dC5wcmludGluKAorICAgICAgICAgICAgIiAgICBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuamFzcGVyLnJ1bnRpbWUuSnNwU291cmNlRGVwZW5kZW50Iik7CisgICAgICAgIGlmICh0YWdJbmZvLmhhc0R5bmFtaWNBdHRyaWJ1dGVzKCkpIHsKKyAgICAgICAgICAgIG91dC5wcmludGxuKCIsIik7CisgICAgICAgICAgICBvdXQucHJpbnRpbigKKyAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgamF2YXguc2VydmxldC5qc3AudGFnZXh0LkR5bmFtaWNBdHRyaWJ1dGVzIik7CisgICAgICAgIH0KKyAgICAgICAgb3V0LnByaW50bG4oIiB7Iik7CisgICAgICAgIG91dC5wcmludGxuKCk7CisgICAgICAgIG91dC5wdXNoSW5kZW50KCk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQ2xhc3MgYm9keSBiZWdpbnMgaGVyZQorICAgICAgICAgKi8KKworICAgICAgICBnZW5lcmF0ZURlY2xhcmF0aW9ucyh0YWcpOworCisgICAgICAgIC8vIFN0YXRpYyBpbml0aWFsaXphdGlvbnMgaGVyZQorICAgICAgICBnZW5QcmVhbWJsZVN0YXRpY0luaXRpYWxpemVycygpOworCisgICAgICAgIG91dC5wcmludGlsKCJwcml2YXRlIEpzcENvbnRleHQganNwQ29udGV4dDsiKTsKKworICAgICAgICAvLyBEZWNsYXJlIHdyaXRlciB1c2VkIGZvciBzdG9yaW5nIHJlc3VsdCBvZiBmcmFnbWVudC9ib2R5IGludm9jYXRpb24KKyAgICAgICAgLy8gaWYgJ3ZhclJlYWRlcicgb3IgJ3ZhcicgYXR0cmlidXRlIGlzIHNwZWNpZmllZAorICAgICAgICBvdXQucHJpbnRpbCgicHJpdmF0ZSBqYXZhLmlvLldyaXRlciBfanNweF9zb3V0OyIpOworCisgICAgICAgIC8vIENsYXNzIHZhcmlhYmxlIGRlY2xhcmF0aW9ucworICAgICAgICBnZW5QcmVhbWJsZUNsYXNzVmFyaWFibGVEZWNsYXJhdGlvbnModGFnSW5mby5nZXRUYWdOYW1lKCkpOworCisgICAgICAgIGdlbmVyYXRlU2V0SnNwQ29udGV4dCh0YWdJbmZvKTsKKworICAgICAgICAvLyBUYWctaGFuZGxlciBzcGVjaWZpYyBkZWNsYXJhdGlvbnMKKyAgICAgICAgZ2VuZXJhdGVUYWdIYW5kbGVyQXR0cmlidXRlcyh0YWdJbmZvKTsKKyAgICAgICAgaWYgKHRhZ0luZm8uaGFzRHluYW1pY0F0dHJpYnV0ZXMoKSkKKyAgICAgICAgICAgIGdlbmVyYXRlU2V0RHluYW1pY0F0dHJpYnV0ZSgpOworCisgICAgICAgIC8vIE1ldGhvZHMgaGVyZQorICAgICAgICBnZW5QcmVhbWJsZU1ldGhvZHMoKTsKKworICAgICAgICAvLyBOb3cgdGhlIGRvVGFnKCkgbWV0aG9kCisgICAgICAgIG91dC5wcmludGlsKAorICAgICAgICAgICAgInB1YmxpYyB2b2lkIGRvVGFnKCkgdGhyb3dzIEpzcEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiB7Iik7CisKKyAgICAgICAgaWYgKGN0eHQuaXNQcm90b3R5cGVNb2RlKCkpIHsKKyAgICAgICAgICAgIG91dC5wcmludGlsKCJ9Iik7CisgICAgICAgICAgICBvdXQucG9wSW5kZW50KCk7CisgICAgICAgICAgICBvdXQucHJpbnRpbCgifSIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgb3V0LnB1c2hJbmRlbnQoKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBBY2NvcmRpbmcgdG8gdGhlIHNwZWMsICdwYWdlQ29udGV4dCcgbXVzdCBub3QgYmUgbWFkZSBhdmFpbGFibGUgYXMKKyAgICAgICAgICogYW4gaW1wbGljaXQgb2JqZWN0IGluIHRhZyBmaWxlcy4KKyAgICAgICAgICogRGVjbGFyZSBfanNweF9wYWdlX2NvbnRleHQsIHNvIHdlIGNhbiBzaGFyZSB0aGUgY29kZSBnZW5lcmF0b3Igd2l0aAorICAgICAgICAgKiBKU1BzLgorICAgICAgICAgKi8KKyAgICAgICAgb3V0LnByaW50aWwoIlBhZ2VDb250ZXh0IF9qc3B4X3BhZ2VfY29udGV4dCA9IChQYWdlQ29udGV4dClqc3BDb250ZXh0OyIpOworCisgICAgICAgIC8vIERlY2xhcmUgaW1wbGljaXQgb2JqZWN0cy4KKyAgICAgICAgb3V0LnByaW50aWwoCisgICAgICAgICAgICAiSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QgPSAiCisgICAgICAgICAgICAgICAgKyAiKEh0dHBTZXJ2bGV0UmVxdWVzdCkgX2pzcHhfcGFnZV9jb250ZXh0LmdldFJlcXVlc3QoKTsiKTsKKyAgICAgICAgb3V0LnByaW50aWwoCisgICAgICAgICAgICAiSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSA9ICIKKyAgICAgICAgICAgICAgICArICIoSHR0cFNlcnZsZXRSZXNwb25zZSkgX2pzcHhfcGFnZV9jb250ZXh0LmdldFJlc3BvbnNlKCk7Iik7CisgICAgICAgIG91dC5wcmludGlsKCJIdHRwU2Vzc2lvbiBzZXNzaW9uID0gX2pzcHhfcGFnZV9jb250ZXh0LmdldFNlc3Npb24oKTsiKTsKKyAgICAgICAgb3V0LnByaW50aWwoCisgICAgICAgICAgICAiU2VydmxldENvbnRleHQgYXBwbGljYXRpb24gPSBfanNweF9wYWdlX2NvbnRleHQuZ2V0U2VydmxldENvbnRleHQoKTsiKTsKKyAgICAgICAgb3V0LnByaW50aWwoIlNlcnZsZXRDb25maWcgY29uZmlnID0gX2pzcHhfcGFnZV9jb250ZXh0LmdldFNlcnZsZXRDb25maWcoKTsiKTsKKyAgICAgICAgb3V0LnByaW50aWwoIkpzcFdyaXRlciBvdXQgPSBqc3BDb250ZXh0LmdldE91dCgpOyIpOworICAgICAgICBpZiAoaXNQb29saW5nRW5hYmxlZCAmJiAhdGFnSGFuZGxlclBvb2xOYW1lcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIG91dC5wcmludGlsKCJfanNwSW5pdChjb25maWcpOyIpOworICAgICAgICB9CisgICAgICAgIGdlbmVyYXRlUGFnZVNjb3BlZFZhcmlhYmxlcyh0YWdJbmZvKTsKKworICAgICAgICBkZWNsYXJlVGVtcG9yYXJ5U2NyaXB0aW5nVmFycyh0YWcpOworICAgICAgICBvdXQucHJpbnRsbigpOworCisgICAgICAgIG91dC5wcmludGlsKCJ0cnkgeyIpOworICAgICAgICBvdXQucHVzaEluZGVudCgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBnZW5lcmF0ZVRhZ0hhbmRsZXJQb3N0YW1ibGUoVGFnSW5mbyB0YWdJbmZvKSB7CisgICAgICAgIG91dC5wb3BJbmRlbnQoKTsKKworICAgICAgICAvLyBIYXZlIHRvIGNhdGNoIFRocm93YWJsZSBiZWNhdXNlIGEgY2xhc3NpYyB0YWcgaGFuZGxlcgorICAgICAgICAvLyBoZWxwZXIgbWV0aG9kIGlzIGRlY2xhcmVkIHRvIHRocm93IFRocm93YWJsZS4KKyAgICAgICAgb3V0LnByaW50aWwoIn0gY2F0Y2goIFRocm93YWJsZSB0ICkgeyIpOworICAgICAgICBvdXQucHVzaEluZGVudCgpOworICAgICAgICBvdXQucHJpbnRpbCgiaWYoIHQgaW5zdGFuY2VvZiBTa2lwUGFnZUV4Y2VwdGlvbiApIik7CisgICAgICAgIG91dC5wcmludGlsKCIgICAgdGhyb3cgKFNraXBQYWdlRXhjZXB0aW9uKSB0OyIpOworICAgICAgICBvdXQucHJpbnRpbCgiaWYoIHQgaW5zdGFuY2VvZiBqYXZhLmlvLklPRXhjZXB0aW9uICkiKTsKKyAgICAgICAgb3V0LnByaW50aWwoIiAgICB0aHJvdyAoamF2YS5pby5JT0V4Y2VwdGlvbikgdDsiKTsKKyAgICAgICAgb3V0LnByaW50aWwoImlmKCB0IGluc3RhbmNlb2YgSWxsZWdhbFN0YXRlRXhjZXB0aW9uICkiKTsKKyAgICAgICAgb3V0LnByaW50aWwoIiAgICB0aHJvdyAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uKSB0OyIpOworICAgICAgICBvdXQucHJpbnRpbCgiaWYoIHQgaW5zdGFuY2VvZiBKc3BFeGNlcHRpb24gKSIpOworICAgICAgICBvdXQucHJpbnRpbCgiICAgIHRocm93IChKc3BFeGNlcHRpb24pIHQ7Iik7CisgICAgICAgIG91dC5wcmludGlsKCJ0aHJvdyBuZXcgSnNwRXhjZXB0aW9uKHQpOyIpOworICAgICAgICBvdXQucG9wSW5kZW50KCk7CisgICAgICAgIG91dC5wcmludGlsKCJ9IGZpbmFsbHkgeyIpOworICAgICAgICBvdXQucHVzaEluZGVudCgpOworICAgICAgICBvdXQucHJpbnRpbCgKKyAgICAgICAgICAgICIoKG9yZy5hcGFjaGUuamFzcGVyLnJ1bnRpbWUuSnNwQ29udGV4dFdyYXBwZXIpIGpzcENvbnRleHQpLnN5bmNFbmRUYWdGaWxlKCk7Iik7CisgICAgICAgIGlmIChpc1Bvb2xpbmdFbmFibGVkICYmICF0YWdIYW5kbGVyUG9vbE5hbWVzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgb3V0LnByaW50aWwoIl9qc3BEZXN0cm95KCk7Iik7CisgICAgICAgIH0KKyAgICAgICAgb3V0LnBvcEluZGVudCgpOworICAgICAgICBvdXQucHJpbnRpbCgifSIpOworCisgICAgICAgIC8vIENsb3NlIHRoZSBkb1RhZyBtZXRob2QKKyAgICAgICAgb3V0LnBvcEluZGVudCgpOworICAgICAgICBvdXQucHJpbnRpbCgifSIpOworCisgICAgICAgIC8vIEdlbmVyYXRlZCBtZXRob2RzLCBoZWxwZXIgY2xhc3NlcywgZXRjLgorICAgICAgICBnZW5Db21tb25Qb3N0YW1ibGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZXMgZGVjbGFyYXRpb25zIGZvciB0YWcgaGFuZGxlciBhdHRyaWJ1dGVzLCBhbmQgZGVmaW5lcyB0aGUKKyAgICAgKiBnZXR0ZXIgYW5kIHNldHRlciBtZXRob2RzIGZvciBlYWNoLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBnZW5lcmF0ZVRhZ0hhbmRsZXJBdHRyaWJ1dGVzKFRhZ0luZm8gdGFnSW5mbykKKyAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKHRhZ0luZm8uaGFzRHluYW1pY0F0dHJpYnV0ZXMoKSkgeworICAgICAgICAgICAgb3V0LnByaW50aWwoCisgICAgICAgICAgICAgICAgInByaXZhdGUgamF2YS51dGlsLkhhc2hNYXAgX2pzcHhfZHluYW1pY19hdHRycyA9IG5ldyBqYXZhLnV0aWwuSGFzaE1hcCgpOyIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gRGVjbGFyZSBhdHRyaWJ1dGVzCisgICAgICAgIFRhZ0F0dHJpYnV0ZUluZm9bXSBhdHRySW5mb3MgPSB0YWdJbmZvLmdldEF0dHJpYnV0ZXMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRySW5mb3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIG91dC5wcmludGluKCJwcml2YXRlICIpOworICAgICAgICAgICAgaWYgKGF0dHJJbmZvc1tpXS5pc0ZyYWdtZW50KCkpIHsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoImphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5Kc3BGcmFnbWVudCAiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgb3V0LnByaW50KEpzcFV0aWwudG9KYXZhU291cmNlVHlwZShhdHRySW5mb3NbaV0uZ2V0VHlwZU5hbWUoKSkpOworICAgICAgICAgICAgICAgIG91dC5wcmludCgiICIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3V0LnByaW50KGF0dHJJbmZvc1tpXS5nZXROYW1lKCkpOworICAgICAgICAgICAgb3V0LnByaW50bG4oIjsiKTsKKyAgICAgICAgfQorICAgICAgICBvdXQucHJpbnRsbigpOworCisgICAgICAgIC8vIERlZmluZSBhdHRyaWJ1dGUgZ2V0dGVyIGFuZCBzZXR0ZXIgbWV0aG9kcworICAgICAgICBpZiAoYXR0ckluZm9zICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0ckluZm9zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgLy8gZ2V0dGVyIG1ldGhvZAorICAgICAgICAgICAgICAgIG91dC5wcmludGluKCJwdWJsaWMgIik7CisgICAgICAgICAgICAgICAgaWYgKGF0dHJJbmZvc1tpXS5pc0ZyYWdtZW50KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KCJqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuSnNwRnJhZ21lbnQgIik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KEpzcFV0aWwudG9KYXZhU291cmNlVHlwZShhdHRySW5mb3NbaV0uZ2V0VHlwZU5hbWUoKSkpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoIiAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb3V0LnByaW50KHRvR2V0dGVyTWV0aG9kKGF0dHJJbmZvc1tpXS5nZXROYW1lKCkpKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiIHsiKTsKKyAgICAgICAgICAgICAgICBvdXQucHVzaEluZGVudCgpOworICAgICAgICAgICAgICAgIG91dC5wcmludGluKCJyZXR1cm4gdGhpcy4iKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoYXR0ckluZm9zW2ldLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIjsiKTsKKyAgICAgICAgICAgICAgICBvdXQucG9wSW5kZW50KCk7CisgICAgICAgICAgICAgICAgb3V0LnByaW50aWwoIn0iKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigpOworCisgICAgICAgICAgICAgICAgLy8gc2V0dGVyIG1ldGhvZAorICAgICAgICAgICAgICAgIG91dC5wcmludGluKCJwdWJsaWMgdm9pZCAiKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQodG9TZXR0ZXJNZXRob2ROYW1lKGF0dHJJbmZvc1tpXS5nZXROYW1lKCkpKTsKKyAgICAgICAgICAgICAgICBpZiAoYXR0ckluZm9zW2ldLmlzRnJhZ21lbnQoKSkgeworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoIihqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuSnNwRnJhZ21lbnQgIik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KCIoIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludChKc3BVdGlsLnRvSmF2YVNvdXJjZVR5cGUoYXR0ckluZm9zW2ldLmdldFR5cGVOYW1lKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KCIgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG91dC5wcmludChhdHRySW5mb3NbaV0uZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiKSB7Iik7CisgICAgICAgICAgICAgICAgb3V0LnB1c2hJbmRlbnQoKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRpbigidGhpcy4iKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoYXR0ckluZm9zW2ldLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgb3V0LnByaW50KCIgPSAiKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoYXR0ckluZm9zW2ldLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIjsiKTsKKyAgICAgICAgICAgICAgICBvdXQucG9wSW5kZW50KCk7CisgICAgICAgICAgICAgICAgb3V0LnByaW50aWwoIn0iKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBHZW5lcmF0ZSBzZXR0ZXIgZm9yIEpzcENvbnRleHQgc28gd2UgY2FuIGNyZWF0ZSBhIHdyYXBwZXIgYW5kCisgICAgICogc3RvcmUgYm90aCB0aGUgb3JpZ2luYWwgYW5kIHRoZSB3cmFwcGVyLiAgV2UgbmVlZCB0aGUgd3JhcHBlcgorICAgICAqIHRvIG1hc2sgdGhlIHBhZ2UgY29udGV4dCBmcm9tIHRoZSB0YWcgZmlsZSBhbmQgc2ltdWxhdGUgYQorICAgICAqIGZyZXNoIHBhZ2UgY29udGV4dC4gIFdlIG5lZWQgdGhlIG9yaWdpbmFsIHRvIGRvIHRoaW5ncyBsaWtlCisgICAgICogc3luYyBBVF9CRUdJTiBhbmQgQVRfRU5EIHNjcmlwdGluZyB2YXJpYWJsZXMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGdlbmVyYXRlU2V0SnNwQ29udGV4dChUYWdJbmZvIHRhZ0luZm8pIHsKKworICAgICAgICBib29sZWFuIG5lc3RlZFNlZW4gPSBmYWxzZTsKKyAgICAgICAgYm9vbGVhbiBhdEJlZ2luU2VlbiA9IGZhbHNlOworICAgICAgICBib29sZWFuIGF0RW5kU2VlbiA9IGZhbHNlOworCisgICAgICAgIC8vIERldGVybWluZSBpZiB0aGVyZSBhcmUgYW55IGFsaWFzZXMKKyAgICAgICAgYm9vbGVhbiBhbGlhc1NlZW4gPSBmYWxzZTsKKyAgICAgICAgVGFnVmFyaWFibGVJbmZvW10gdGFnVmFycyA9IHRhZ0luZm8uZ2V0VGFnVmFyaWFibGVJbmZvcygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRhZ1ZhcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmICh0YWdWYXJzW2ldLmdldE5hbWVGcm9tQXR0cmlidXRlKCkgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmIHRhZ1ZhcnNbaV0uZ2V0TmFtZUdpdmVuKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGFsaWFzU2VlbiA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoYWxpYXNTZWVuKSB7CisgICAgICAgICAgICBvdXQucHJpbnRpbCgKKyAgICAgICAgICAgICAgICAicHVibGljIHZvaWQgc2V0SnNwQ29udGV4dChKc3BDb250ZXh0IGN0eCwgamF2YS51dGlsLk1hcCBhbGlhc01hcCkgeyIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb3V0LnByaW50aWwoInB1YmxpYyB2b2lkIHNldEpzcENvbnRleHQoSnNwQ29udGV4dCBjdHgpIHsiKTsKKyAgICAgICAgfQorICAgICAgICBvdXQucHVzaEluZGVudCgpOworICAgICAgICBvdXQucHJpbnRpbCgic3VwZXIuc2V0SnNwQ29udGV4dChjdHgpOyIpOworICAgICAgICBvdXQucHJpbnRpbCgiamF2YS51dGlsLkFycmF5TGlzdCBfanNweF9uZXN0ZWQgPSBudWxsOyIpOworICAgICAgICBvdXQucHJpbnRpbCgiamF2YS51dGlsLkFycmF5TGlzdCBfanNweF9hdF9iZWdpbiA9IG51bGw7Iik7CisgICAgICAgIG91dC5wcmludGlsKCJqYXZhLnV0aWwuQXJyYXlMaXN0IF9qc3B4X2F0X2VuZCA9IG51bGw7Iik7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0YWdWYXJzLmxlbmd0aDsgaSsrKSB7CisKKyAgICAgICAgICAgIHN3aXRjaCAodGFnVmFyc1tpXS5nZXRTY29wZSgpKSB7CisgICAgICAgICAgICAgICAgY2FzZSBWYXJpYWJsZUluZm8uTkVTVEVEIDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFuZXN0ZWRTZWVuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRpbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX2pzcHhfbmVzdGVkID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5lc3RlZFNlZW4gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGluKCJfanNweF9uZXN0ZWQuYWRkKCIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgVmFyaWFibGVJbmZvLkFUX0JFR0lOIDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFhdEJlZ2luU2VlbikgeworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50aWwoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9qc3B4X2F0X2JlZ2luID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF0QmVnaW5TZWVuID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRpbigiX2pzcHhfYXRfYmVnaW4uYWRkKCIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgVmFyaWFibGVJbmZvLkFUX0VORCA6CisgICAgICAgICAgICAgICAgICAgIGlmICghYXRFbmRTZWVuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRpbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX2pzcHhfYXRfZW5kID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF0RW5kU2VlbiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50aW4oIl9qc3B4X2F0X2VuZC5hZGQoIik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSAvLyBzd2l0Y2gKKworICAgICAgICAgICAgb3V0LnByaW50KHF1b3RlKHRhZ1ZhcnNbaV0uZ2V0TmFtZUdpdmVuKCkpKTsKKyAgICAgICAgICAgIG91dC5wcmludGxuKCIpOyIpOworICAgICAgICB9CisgICAgICAgIGlmIChhbGlhc1NlZW4pIHsKKyAgICAgICAgICAgIG91dC5wcmludGlsKAorICAgICAgICAgICAgICAgICJ0aGlzLmpzcENvbnRleHQgPSBuZXcgb3JnLmFwYWNoZS5qYXNwZXIucnVudGltZS5Kc3BDb250ZXh0V3JhcHBlcihjdHgsIF9qc3B4X25lc3RlZCwgX2pzcHhfYXRfYmVnaW4sIF9qc3B4X2F0X2VuZCwgYWxpYXNNYXApOyIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb3V0LnByaW50aWwoCisgICAgICAgICAgICAgICAgInRoaXMuanNwQ29udGV4dCA9IG5ldyBvcmcuYXBhY2hlLmphc3Blci5ydW50aW1lLkpzcENvbnRleHRXcmFwcGVyKGN0eCwgX2pzcHhfbmVzdGVkLCBfanNweF9hdF9iZWdpbiwgX2pzcHhfYXRfZW5kLCBudWxsKTsiKTsKKyAgICAgICAgfQorICAgICAgICBvdXQucG9wSW5kZW50KCk7CisgICAgICAgIG91dC5wcmludGlsKCJ9Iik7CisgICAgICAgIG91dC5wcmludGxuKCk7CisgICAgICAgIG91dC5wcmludGlsKCJwdWJsaWMgSnNwQ29udGV4dCBnZXRKc3BDb250ZXh0KCkgeyIpOworICAgICAgICBvdXQucHVzaEluZGVudCgpOworICAgICAgICBvdXQucHJpbnRpbCgicmV0dXJuIHRoaXMuanNwQ29udGV4dDsiKTsKKyAgICAgICAgb3V0LnBvcEluZGVudCgpOworICAgICAgICBvdXQucHJpbnRpbCgifSIpOworICAgIH0KKworICAgIC8qCisgICAgICogR2VuZXJhdGVzIGltcGxlbWVudGF0aW9uIG9mCisgICAgICogamF2YXguc2VydmxldC5qc3AudGFnZXh0LkR5bmFtaWNBdHRyaWJ1dGVzLnNldER5bmFtaWNBdHRyaWJ1dGUoKSBtZXRob2QsCisgICAgICogd2hpY2ggc2F2ZXMgZWFjaCBkeW5hbWljIGF0dHJpYnV0ZSB0aGF0IGlzIHBhc3NlZCBpbiBzbyB0aGF0IGEgc2NvcGVkCisgICAgICogdmFyaWFibGUgY2FuIGxhdGVyIGJlIGNyZWF0ZWQgZm9yIGl0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGdlbmVyYXRlU2V0RHluYW1pY0F0dHJpYnV0ZSgpIHsKKyAgICAgICAgb3V0LnByaW50aWwoCisgICAgICAgICAgICAicHVibGljIHZvaWQgc2V0RHluYW1pY0F0dHJpYnV0ZShTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBPYmplY3QgdmFsdWUpIHRocm93cyBKc3BFeGNlcHRpb24geyIpOworICAgICAgICBvdXQucHVzaEluZGVudCgpOworICAgICAgICAvKgorICAgICAgICAgKiBBY2NvcmRpbmcgdG8gdGhlIHNwZWMsIG9ubHkgZHluYW1pYyBhdHRyaWJ1dGVzIHdpdGggbm8gdXJpIGFyZSB0bworICAgICAgICAgKiBiZSBwcmVzZW50IGluIHRoZSBNYXA7IGFsbCBvdGhlciBkeW5hbWljIGF0dHJpYnV0ZXMgYXJlIGlnbm9yZWQuCisgICAgICAgICAqLworICAgICAgICBvdXQucHJpbnRpbCgiaWYgKHVyaSA9PSBudWxsKSIpOworICAgICAgICBvdXQucHVzaEluZGVudCgpOworICAgICAgICBvdXQucHJpbnRpbCgiX2pzcHhfZHluYW1pY19hdHRycy5wdXQobG9jYWxOYW1lLCB2YWx1ZSk7Iik7CisgICAgICAgIG91dC5wb3BJbmRlbnQoKTsKKyAgICAgICAgb3V0LnBvcEluZGVudCgpOworICAgICAgICBvdXQucHJpbnRpbCgifSIpOworICAgIH0KKworICAgIC8qCisgICAgICogQ3JlYXRlcyBhIHBhZ2Utc2NvcGVkIHZhcmlhYmxlIGZvciBlYWNoIGRlY2xhcmVkIHRhZyBhdHRyaWJ1dGUuCisgICAgICogQWxzbywgaWYgdGhlIHRhZyBhY2NlcHRzIGR5bmFtaWMgYXR0cmlidXRlcywgYSBwYWdlLXNjb3BlZCB2YXJpYWJsZQorICAgICAqIGlzIG1hZGUgYXZhaWxhYmxlIGZvciBlYWNoIGR5bmFtaWMgYXR0cmlidXRlIHRoYXQgd2FzIHBhc3NlZCBpbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZ2VuZXJhdGVQYWdlU2NvcGVkVmFyaWFibGVzKEphc3BlclRhZ0luZm8gdGFnSW5mbykgeworCisgICAgICAgIC8vICJub3JtYWwiIGF0dHJpYnV0ZXMKKyAgICAgICAgVGFnQXR0cmlidXRlSW5mb1tdIGF0dHJJbmZvcyA9IHRhZ0luZm8uZ2V0QXR0cmlidXRlcygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHJJbmZvcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgU3RyaW5nIGF0dHJOYW1lID0gYXR0ckluZm9zW2ldLmdldE5hbWUoKTsKKyAgICAgICAgICAgIG91dC5wcmludGlsKCJpZiggIiArIHRvR2V0dGVyTWV0aG9kKGF0dHJOYW1lKSArICIgIT0gbnVsbCApICIpOworICAgICAgICAgICAgb3V0LnB1c2hJbmRlbnQoKTsKKyAgICAgICAgICAgIG91dC5wcmludGluKCJfanNweF9wYWdlX2NvbnRleHQuc2V0QXR0cmlidXRlKCIpOworICAgICAgICAgICAgb3V0LnByaW50KHF1b3RlKGF0dHJOYW1lKSk7CisgICAgICAgICAgICBvdXQucHJpbnQoIiwgIik7CisgICAgICAgICAgICBvdXQucHJpbnQodG9HZXR0ZXJNZXRob2QoYXR0ck5hbWUpKTsKKyAgICAgICAgICAgIG91dC5wcmludGxuKCIpOyIpOworICAgICAgICAgICAgb3V0LnBvcEluZGVudCgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gRXhwb3NlIHRoZSBNYXAgY29udGFpbmluZyBkeW5hbWljIGF0dHJpYnV0ZXMgYXMgYSBwYWdlLXNjb3BlZCB2YXIKKyAgICAgICAgaWYgKHRhZ0luZm8uaGFzRHluYW1pY0F0dHJpYnV0ZXMoKSkgeworICAgICAgICAgICAgb3V0LnByaW50aW4oIl9qc3B4X3BhZ2VfY29udGV4dC5zZXRBdHRyaWJ1dGUoXCIiKTsKKyAgICAgICAgICAgIG91dC5wcmludCh0YWdJbmZvLmdldER5bmFtaWNBdHRyaWJ1dGVzTWFwTmFtZSgpKTsKKyAgICAgICAgICAgIG91dC5wcmludCgiXCIsIF9qc3B4X2R5bmFtaWNfYXR0cnMpOyIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBHZW5lcmF0ZXMgdGhlIGdldHRlciBtZXRob2QgZm9yIHRoZSBnaXZlbiBhdHRyaWJ1dGUgbmFtZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyB0b0dldHRlck1ldGhvZChTdHJpbmcgYXR0ck5hbWUpIHsKKyAgICAgICAgY2hhcltdIGF0dHJDaGFycyA9IGF0dHJOYW1lLnRvQ2hhckFycmF5KCk7CisgICAgICAgIGF0dHJDaGFyc1swXSA9IENoYXJhY3Rlci50b1VwcGVyQ2FzZShhdHRyQ2hhcnNbMF0pOworICAgICAgICByZXR1cm4gImdldCIgKyBuZXcgU3RyaW5nKGF0dHJDaGFycykgKyAiKCkiOworICAgIH0KKworICAgIC8qCisgICAgICogR2VuZXJhdGVzIHRoZSBzZXR0ZXIgbWV0aG9kIG5hbWUgZm9yIHRoZSBnaXZlbiBhdHRyaWJ1dGUgbmFtZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyB0b1NldHRlck1ldGhvZE5hbWUoU3RyaW5nIGF0dHJOYW1lKSB7CisgICAgICAgIGNoYXJbXSBhdHRyQ2hhcnMgPSBhdHRyTmFtZS50b0NoYXJBcnJheSgpOworICAgICAgICBhdHRyQ2hhcnNbMF0gPSBDaGFyYWN0ZXIudG9VcHBlckNhc2UoYXR0ckNoYXJzWzBdKTsKKyAgICAgICAgcmV0dXJuICJzZXQiICsgbmV3IFN0cmluZyhhdHRyQ2hhcnMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsYXNzIHN0b3JpbmcgdGhlIHJlc3VsdCBvZiBpbnRyb3NwZWN0aW5nIGEgY3VzdG9tIHRhZyBoYW5kbGVyLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFRhZ0hhbmRsZXJJbmZvIHsKKworICAgICAgICBwcml2YXRlIEhhc2h0YWJsZSBtZXRob2RNYXBzOworICAgICAgICBwcml2YXRlIEhhc2h0YWJsZSBwcm9wZXJ0eUVkaXRvck1hcHM7CisgICAgICAgIHByaXZhdGUgQ2xhc3MgdGFnSGFuZGxlckNsYXNzOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb25zdHJ1Y3Rvci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG4gVGhlIGN1c3RvbSB0YWcgd2hvc2UgdGFnIGhhbmRsZXIgY2xhc3MgaXMgdG8gYmUKKyAgICAgICAgICogaW50cm9zcGVjdGVkCisgICAgICAgICAqIEBwYXJhbSB0YWdIYW5kbGVyQ2xhc3MgVGFnIGhhbmRsZXIgY2xhc3MKKyAgICAgICAgICogQHBhcmFtIGVyciBFcnJvciBkaXNwYXRjaGVyCisgICAgICAgICAqLworICAgICAgICBUYWdIYW5kbGVySW5mbyhOb2RlIG4sIENsYXNzIHRhZ0hhbmRsZXJDbGFzcywgRXJyb3JEaXNwYXRjaGVyIGVycikKKyAgICAgICAgICAgIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgdGhpcy50YWdIYW5kbGVyQ2xhc3MgPSB0YWdIYW5kbGVyQ2xhc3M7CisgICAgICAgICAgICB0aGlzLm1ldGhvZE1hcHMgPSBuZXcgSGFzaHRhYmxlKCk7CisgICAgICAgICAgICB0aGlzLnByb3BlcnR5RWRpdG9yTWFwcyA9IG5ldyBIYXNodGFibGUoKTsKKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBCZWFuSW5mbyB0YWdDbGFzc0luZm8gPQorICAgICAgICAgICAgICAgICAgICBJbnRyb3NwZWN0b3IuZ2V0QmVhbkluZm8odGFnSGFuZGxlckNsYXNzKTsKKyAgICAgICAgICAgICAgICBQcm9wZXJ0eURlc2NyaXB0b3JbXSBwZCA9IHRhZ0NsYXNzSW5mby5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwZC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgKiBGSVhNRTogc2hvdWxkIHByb2JhYmx5IGJlIGNoZWNraW5nIGZvciB0aGluZ3MgbGlrZQorICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgcGFnZUNvbnRleHQsIGJvZHlDb250ZW50LCBhbmQgcGFyZW50IGhlcmUgLWFrdgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKHBkW2ldLmdldFdyaXRlTWV0aG9kKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kTWFwcy5wdXQocGRbaV0uZ2V0TmFtZSgpLCBwZFtpXS5nZXRXcml0ZU1ldGhvZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAocGRbaV0uZ2V0UHJvcGVydHlFZGl0b3JDbGFzcygpICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eUVkaXRvck1hcHMucHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkW2ldLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZFtpXS5nZXRQcm9wZXJ0eUVkaXRvckNsYXNzKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKEludHJvc3BlY3Rpb25FeGNlcHRpb24gaWUpIHsKKyAgICAgICAgICAgICAgICBlcnIuanNwRXJyb3IoCisgICAgICAgICAgICAgICAgICAgIG4sCisgICAgICAgICAgICAgICAgICAgICJqc3AuZXJyb3IuaW50cm9zcGVjdC50YWdoYW5kbGVyIiwKKyAgICAgICAgICAgICAgICAgICAgdGFnSGFuZGxlckNsYXNzLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgaWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFhYWAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIE1ldGhvZCBnZXRTZXR0ZXJNZXRob2QoU3RyaW5nIGF0dHJOYW1lKSB7CisgICAgICAgICAgICByZXR1cm4gKE1ldGhvZCltZXRob2RNYXBzLmdldChhdHRyTmFtZSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogWFhYCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQ2xhc3MgZ2V0UHJvcGVydHlFZGl0b3JDbGFzcyhTdHJpbmcgYXR0ck5hbWUpIHsKKyAgICAgICAgICAgIHJldHVybiAoQ2xhc3MpcHJvcGVydHlFZGl0b3JNYXBzLmdldChhdHRyTmFtZSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogWFhYCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQ2xhc3MgZ2V0VGFnSGFuZGxlckNsYXNzKCkgeworICAgICAgICAgICAgcmV0dXJuIHRhZ0hhbmRsZXJDbGFzczsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEEgY2xhc3MgZm9yIGdlbmVyYXRpbmcgY29kZXMgdG8gYSBidWZmZXIuICBJbmNsdWRlZCBoZXJlIGFyZSBzb21lCisgICAgICogc3VwcG9ydCBmb3IgdHJhY2tpbmcgc291cmNlIHRvIEphdmEgbGluZXMgbWFwcGluZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBHZW5CdWZmZXIgeworCisgICAgICAgIC8qCisgICAgICAgICAqIEZvciBhIEN1c3RvbVRhZywgdGhlIGNvZGVzIHRoYXQgYXJlIGdlbmVyYXRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mCisgICAgICAgICAqIHRoZSB0YWcgbWF5IG5vdCBiZSBpbiB0aGUgc2FtZSBidWZmZXIgYXMgdGhvc2UgZm9yIHRoZSBib2R5IG9mIHRoZQorICAgICAgICAgKiB0YWcuICBUd28gZmllbGRzIGFyZSB1c2VkIGhlcmUgdG8ga2VlcCB0aGlzIHN0cmFpZ2h0LiAgRm9yIGNvZGVzCisgICAgICAgICAqIHRoYXQgZG8gbm90IGNvcnJlc3BvbmRzIHRvIGFueSBKU1AgbGluZXMsIHRoZXkgc2hvdWxkIGJlIG51bGwuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIE5vZGUgbm9kZTsKKyAgICAgICAgcHJpdmF0ZSBOb2RlLk5vZGVzIGJvZHk7CisgICAgICAgIHByaXZhdGUgamF2YS5pby5DaGFyQXJyYXlXcml0ZXIgY2hhcldyaXRlcjsKKyAgICAgICAgcHJvdGVjdGVkIFNlcnZsZXRXcml0ZXIgb3V0OworCisgICAgICAgIEdlbkJ1ZmZlcigpIHsKKyAgICAgICAgICAgIHRoaXMobnVsbCwgbnVsbCk7CisgICAgICAgIH0KKworICAgICAgICBHZW5CdWZmZXIoTm9kZSBuLCBOb2RlLk5vZGVzIGIpIHsKKyAgICAgICAgICAgIG5vZGUgPSBuOworICAgICAgICAgICAgYm9keSA9IGI7CisgICAgICAgICAgICBpZiAoYm9keSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYm9keS5zZXRHZW5lcmF0ZWRJbkJ1ZmZlcih0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNoYXJXcml0ZXIgPSBuZXcgamF2YS5pby5DaGFyQXJyYXlXcml0ZXIoKTsKKyAgICAgICAgICAgIG91dCA9IG5ldyBTZXJ2bGV0V3JpdGVyKG5ldyBqYXZhLmlvLlByaW50V3JpdGVyKGNoYXJXcml0ZXIpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTZXJ2bGV0V3JpdGVyIGdldE91dCgpIHsKKyAgICAgICAgICAgIHJldHVybiBvdXQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuIGNoYXJXcml0ZXIudG9TdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGp1c3QgdGhlIEphdmEgTGluZXMuICBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBKYXZhIGxpbmVzCisgICAgICAgICAqIHN0b3JlZCB3aXRoIHRoZSBub2RlcyBhcmUgcmVsYXRpdmUgdGhlIGJlZ2lubmluZyBvZiB0aGlzIGJ1ZmZlcgorICAgICAgICAgKiBhbmQgbmVlZCB0byBiZSBhZGp1c3RlZCB3aGVuIHRoaXMgYnVmZmVyIGlzIGluc2VydGVkIGludG8gdGhlCisgICAgICAgICAqIHNvdXJjZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIGFkanVzdEphdmFMaW5lcyhmaW5hbCBpbnQgb2Zmc2V0KSB7CisKKyAgICAgICAgICAgIGlmIChub2RlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBhZGp1c3RKYXZhTGluZShub2RlLCBvZmZzZXQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoYm9keSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgYm9keS52aXNpdChuZXcgTm9kZS5WaXNpdG9yKCkgeworCisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBkb1Zpc2l0KE5vZGUgbikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkanVzdEphdmFMaW5lKG4sIG9mZnNldCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuQ3VzdG9tVGFnIG4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9kZS5Ob2RlcyBiID0gbi5nZXRCb2R5KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIgIT0gbnVsbCAmJiAhYi5pc0dlbmVyYXRlZEluQnVmZmVyKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRG9uJ3QgYWRqdXN0IGxpbmVzIGZvciB0aGUgbmVzdGVkIHRhZ3MgdGhhdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcmUgYWxzbyBnZW5lcmF0ZWQgaW4gYnVmZmVycywgYmVjYXVzZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRqdXN0bWVudHMgd2lsbCBiZSBkb25lIGVsc2V3aGVyZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi52aXNpdCh0aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEphc3BlckV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYWRqdXN0SmF2YUxpbmUoTm9kZSBuLCBpbnQgb2Zmc2V0KSB7CisgICAgICAgICAgICBpZiAobi5nZXRCZWdpbkphdmFMaW5lKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgbi5zZXRCZWdpbkphdmFMaW5lKG4uZ2V0QmVnaW5KYXZhTGluZSgpICsgb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBuLnNldEVuZEphdmFMaW5lKG4uZ2V0RW5kSmF2YUxpbmUoKSArIG9mZnNldCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBLZWVwcyB0cmFjayBvZiB0aGUgZ2VuZXJhdGVkIEZyYWdtZW50IEhlbHBlciBDbGFzcworICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEZyYWdtZW50SGVscGVyQ2xhc3MgeworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEZyYWdtZW50IHsKKyAgICAgICAgICAgIHByaXZhdGUgR2VuQnVmZmVyIGdlbkJ1ZmZlcjsKKyAgICAgICAgICAgIHByaXZhdGUgaW50IGlkOworCisgICAgICAgICAgICBwdWJsaWMgRnJhZ21lbnQoaW50IGlkLCBOb2RlIG5vZGUpIHsKKyAgICAgICAgICAgICAgICB0aGlzLmlkID0gaWQ7CisgICAgICAgICAgICAgICAgZ2VuQnVmZmVyID0gbmV3IEdlbkJ1ZmZlcihudWxsLCBub2RlLmdldEJvZHkoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBHZW5CdWZmZXIgZ2V0R2VuQnVmZmVyKCkgeworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdlbkJ1ZmZlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGludCBnZXRJZCgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFRydWUgaWYgdGhlIGhlbHBlciBjbGFzcyBzaG91bGQgYmUgZ2VuZXJhdGVkLgorICAgICAgICBwcml2YXRlIGJvb2xlYW4gdXNlZCA9IGZhbHNlOworCisgICAgICAgIHByaXZhdGUgQXJyYXlMaXN0IGZyYWdtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKKworICAgICAgICBwcml2YXRlIFN0cmluZyBjbGFzc05hbWU7CisKKyAgICAgICAgLy8gQnVmZmVyIGZvciBlbnRpcmUgaGVscGVyIGNsYXNzCisgICAgICAgIHByaXZhdGUgR2VuQnVmZmVyIGNsYXNzQnVmZmVyID0gbmV3IEdlbkJ1ZmZlcigpOworCisgICAgICAgIHB1YmxpYyBGcmFnbWVudEhlbHBlckNsYXNzKFN0cmluZyBjbGFzc05hbWUpIHsKKyAgICAgICAgICAgIHRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5jbGFzc05hbWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1VzZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy51c2VkOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgZ2VuZXJhdGVQcmVhbWJsZSgpIHsKKyAgICAgICAgICAgIFNlcnZsZXRXcml0ZXIgb3V0ID0gdGhpcy5jbGFzc0J1ZmZlci5nZXRPdXQoKTsKKyAgICAgICAgICAgIG91dC5wcmludGxuKCk7CisgICAgICAgICAgICBvdXQucHVzaEluZGVudCgpOworICAgICAgICAgICAgLy8gTm90ZTogY2Fubm90IGJlIHN0YXRpYywgYXMgd2UgbmVlZCB0byByZWZlcmVuY2UgdGhpbmdzIGxpa2UKKyAgICAgICAgICAgIC8vIF9qc3B4X21ldGhfKgorICAgICAgICAgICAgb3V0LnByaW50aWwoInByaXZhdGUgY2xhc3MgIiArIGNsYXNzTmFtZSk7CisgICAgICAgICAgICBvdXQucHJpbnRpbCgKKyAgICAgICAgICAgICAgICAiICAgIGV4dGVuZHMgIiArICJvcmcuYXBhY2hlLmphc3Blci5ydW50aW1lLkpzcEZyYWdtZW50SGVscGVyIik7CisgICAgICAgICAgICBvdXQucHJpbnRpbCgieyIpOworICAgICAgICAgICAgb3V0LnB1c2hJbmRlbnQoKTsKKyAgICAgICAgICAgIG91dC5wcmludGlsKAorICAgICAgICAgICAgICAgICJwcml2YXRlIGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5Kc3BUYWcgX2pzcHhfcGFyZW50OyIpOworICAgICAgICAgICAgb3V0LnByaW50aWwoInByaXZhdGUgaW50W10gX2pzcHhfcHVzaF9ib2R5X2NvdW50OyIpOworICAgICAgICAgICAgb3V0LnByaW50bG4oKTsKKyAgICAgICAgICAgIG91dC5wcmludGlsKAorICAgICAgICAgICAgICAgICJwdWJsaWMgIgorICAgICAgICAgICAgICAgICAgICArIGNsYXNzTmFtZQorICAgICAgICAgICAgICAgICAgICArICIoIGludCBkaXNjcmltaW5hdG9yLCBKc3BDb250ZXh0IGpzcENvbnRleHQsICIKKyAgICAgICAgICAgICAgICAgICAgKyAiamF2YXguc2VydmxldC5qc3AudGFnZXh0LkpzcFRhZyBfanNweF9wYXJlbnQsICIKKyAgICAgICAgICAgICAgICAgICAgKyAiaW50W10gX2pzcHhfcHVzaF9ib2R5X2NvdW50ICkgeyIpOworICAgICAgICAgICAgb3V0LnB1c2hJbmRlbnQoKTsKKyAgICAgICAgICAgIG91dC5wcmludGlsKCJzdXBlciggZGlzY3JpbWluYXRvciwganNwQ29udGV4dCwgX2pzcHhfcGFyZW50ICk7Iik7CisgICAgICAgICAgICBvdXQucHJpbnRpbCgidGhpcy5fanNweF9wYXJlbnQgPSBfanNweF9wYXJlbnQ7Iik7CisgICAgICAgICAgICBvdXQucHJpbnRpbCgidGhpcy5fanNweF9wdXNoX2JvZHlfY291bnQgPSBfanNweF9wdXNoX2JvZHlfY291bnQ7Iik7CisgICAgICAgICAgICBvdXQucG9wSW5kZW50KCk7CisgICAgICAgICAgICBvdXQucHJpbnRpbCgifSIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEZyYWdtZW50IG9wZW5GcmFnbWVudCgKKyAgICAgICAgICAgIE5vZGUgcGFyZW50LAorICAgICAgICAgICAgU3RyaW5nIHRhZ0hhbmRsZXJWYXIsCisgICAgICAgICAgICBpbnQgbWV0aG9kTmVzdGluZykKKyAgICAgICAgICAgIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgRnJhZ21lbnQgcmVzdWx0ID0gbmV3IEZyYWdtZW50KGZyYWdtZW50cy5zaXplKCksIHBhcmVudCk7CisgICAgICAgICAgICBmcmFnbWVudHMuYWRkKHJlc3VsdCk7CisgICAgICAgICAgICB0aGlzLnVzZWQgPSB0cnVlOworICAgICAgICAgICAgcGFyZW50LnNldElubmVyQ2xhc3NOYW1lKGNsYXNzTmFtZSk7CisKKyAgICAgICAgICAgIFNlcnZsZXRXcml0ZXIgb3V0ID0gcmVzdWx0LmdldEdlbkJ1ZmZlcigpLmdldE91dCgpOworICAgICAgICAgICAgb3V0LnB1c2hJbmRlbnQoKTsKKyAgICAgICAgICAgIG91dC5wdXNoSW5kZW50KCk7CisgICAgICAgICAgICAvLyBYWFggLSBSZXR1cm5zIGJvb2xlYW4gYmVjYXVzZSBpZiBhIHRhZyBpcyBpbnZva2VkIGZyb20KKyAgICAgICAgICAgIC8vIHdpdGhpbiB0aGlzIGZyYWdtZW50LCB0aGUgR2VuZXJhdG9yIHNvbWV0aW1lcyBtaWdodAorICAgICAgICAgICAgLy8gZ2VuZXJhdGUgY29kZSBsaWtlICJyZXR1cm4gdHJ1ZSIuICBUaGlzIGlzIGlnbm9yZWQgZm9yIG5vdywKKyAgICAgICAgICAgIC8vIG1lYW5pbmcgb25seSB0aGUgZnJhZ21lbnQgaXMgc2tpcHBlZC4gIFRoZSBKU1ItMTUyCisgICAgICAgICAgICAvLyBleHBlcnQgZ3JvdXAgaXMgY3VycmVudGx5IGRpc2N1c3Npbmcgd2hhdCB0byBkbyBpbiB0aGlzIGNhc2UuCisgICAgICAgICAgICAvLyBTZWUgY29tbWVudCBpbiBjbG9zZUZyYWdtZW50KCkKKyAgICAgICAgICAgIGlmIChtZXRob2ROZXN0aW5nID4gMCkgeworICAgICAgICAgICAgICAgIG91dC5wcmludGluKCJwdWJsaWMgYm9vbGVhbiBpbnZva2UiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgb3V0LnByaW50aW4oInB1YmxpYyB2b2lkIGludm9rZSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3V0LnByaW50bG4ocmVzdWx0LmdldElkKCkgKyAiKCAiICsgIkpzcFdyaXRlciBvdXQgKSAiKTsKKyAgICAgICAgICAgIG91dC5wdXNoSW5kZW50KCk7CisgICAgICAgICAgICAvLyBOb3RlOiBUaHJvd2FibGUgcmVxdWlyZWQgYmVjYXVzZSBtZXRob2RzIGxpa2UgX2pzcHhfbWV0aF8qCisgICAgICAgICAgICAvLyB0aHJvdyBUaHJvd2FibGUuCisgICAgICAgICAgICBvdXQucHJpbnRpbCgidGhyb3dzIFRocm93YWJsZSIpOworICAgICAgICAgICAgb3V0LnBvcEluZGVudCgpOworICAgICAgICAgICAgb3V0LnByaW50aWwoInsiKTsKKyAgICAgICAgICAgIG91dC5wdXNoSW5kZW50KCk7CisgICAgICAgICAgICBnZW5lcmF0ZUxvY2FsVmFyaWFibGVzKG91dCwgcGFyZW50KTsKKworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlRnJhZ21lbnQoRnJhZ21lbnQgZnJhZ21lbnQsIGludCBtZXRob2ROZXN0aW5nKSB7CisgICAgICAgICAgICBTZXJ2bGV0V3JpdGVyIG91dCA9IGZyYWdtZW50LmdldEdlbkJ1ZmZlcigpLmdldE91dCgpOworICAgICAgICAgICAgLy8gWFhYIC0gU2VlIGNvbW1lbnQgaW4gb3BlbkZyYWdtZW50KCkKKyAgICAgICAgICAgIGlmIChtZXRob2ROZXN0aW5nID4gMCkgeworICAgICAgICAgICAgICAgIG91dC5wcmludGlsKCJyZXR1cm4gZmFsc2U7Iik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG91dC5wcmludGlsKCJyZXR1cm47Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXQucG9wSW5kZW50KCk7CisgICAgICAgICAgICBvdXQucHJpbnRpbCgifSIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgZ2VuZXJhdGVQb3N0YW1ibGUoKSB7CisgICAgICAgICAgICBTZXJ2bGV0V3JpdGVyIG91dCA9IHRoaXMuY2xhc3NCdWZmZXIuZ2V0T3V0KCk7CisgICAgICAgICAgICAvLyBHZW5lcmF0ZSBhbGwgZnJhZ21lbnQgbWV0aG9kczoKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhZ21lbnRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgRnJhZ21lbnQgZnJhZ21lbnQgPSAoRnJhZ21lbnQpZnJhZ21lbnRzLmdldChpKTsKKyAgICAgICAgICAgICAgICBmcmFnbWVudC5nZXRHZW5CdWZmZXIoKS5hZGp1c3RKYXZhTGluZXMob3V0LmdldEphdmFMaW5lKCkgLSAxKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRNdWx0aUxuKGZyYWdtZW50LmdldEdlbkJ1ZmZlcigpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBHZW5lcmF0ZSBwb3N0YW1ibGU6CisgICAgICAgICAgICBvdXQucHJpbnRpbCgicHVibGljIHZvaWQgaW52b2tlKCBqYXZhLmlvLldyaXRlciB3cml0ZXIgKSIpOworICAgICAgICAgICAgb3V0LnB1c2hJbmRlbnQoKTsKKyAgICAgICAgICAgIG91dC5wcmludGlsKCJ0aHJvd3MgSnNwRXhjZXB0aW9uIik7CisgICAgICAgICAgICBvdXQucG9wSW5kZW50KCk7CisgICAgICAgICAgICBvdXQucHJpbnRpbCgieyIpOworICAgICAgICAgICAgb3V0LnB1c2hJbmRlbnQoKTsKKyAgICAgICAgICAgIG91dC5wcmludGlsKCJKc3BXcml0ZXIgb3V0ID0gbnVsbDsiKTsKKyAgICAgICAgICAgIG91dC5wcmludGlsKCJpZiggd3JpdGVyICE9IG51bGwgKSB7Iik7CisgICAgICAgICAgICBvdXQucHVzaEluZGVudCgpOworICAgICAgICAgICAgb3V0LnByaW50aWwoIm91dCA9IHRoaXMuanNwQ29udGV4dC5wdXNoQm9keSh3cml0ZXIpOyIpOworICAgICAgICAgICAgb3V0LnBvcEluZGVudCgpOworICAgICAgICAgICAgb3V0LnByaW50aWwoIn0gZWxzZSB7Iik7CisgICAgICAgICAgICBvdXQucHVzaEluZGVudCgpOworICAgICAgICAgICAgb3V0LnByaW50aWwoIm91dCA9IHRoaXMuanNwQ29udGV4dC5nZXRPdXQoKTsiKTsKKyAgICAgICAgICAgIG91dC5wb3BJbmRlbnQoKTsKKyAgICAgICAgICAgIG91dC5wcmludGlsKCJ9Iik7CisgICAgICAgICAgICBvdXQucHJpbnRpbCgidHJ5IHsiKTsKKyAgICAgICAgICAgIG91dC5wdXNoSW5kZW50KCk7CisgICAgICAgICAgICBvdXQucHJpbnRpbCgic3dpdGNoKCB0aGlzLmRpc2NyaW1pbmF0b3IgKSB7Iik7CisgICAgICAgICAgICBvdXQucHVzaEluZGVudCgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFnbWVudHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRpbCgiY2FzZSAiICsgaSArICI6Iik7CisgICAgICAgICAgICAgICAgb3V0LnB1c2hJbmRlbnQoKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRpbCgiaW52b2tlIiArIGkgKyAiKCBvdXQgKTsiKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRpbCgiYnJlYWs7Iik7CisgICAgICAgICAgICAgICAgb3V0LnBvcEluZGVudCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3V0LnBvcEluZGVudCgpOworICAgICAgICAgICAgb3V0LnByaW50aWwoIn0iKTsgLy8gc3dpdGNoCisgICAgICAgICAgICBvdXQucG9wSW5kZW50KCk7CisgICAgICAgICAgICBvdXQucHJpbnRpbCgifSIpOyAvLyB0cnkKKyAgICAgICAgICAgIG91dC5wcmludGlsKCJjYXRjaCggVGhyb3dhYmxlIGUgKSB7Iik7CisgICAgICAgICAgICBvdXQucHVzaEluZGVudCgpOworICAgICAgICAgICAgb3V0LnByaW50aWwoCisgICAgICAgICAgICAgICAgImlmIChlIGluc3RhbmNlb2YgU2tpcFBhZ2VFeGNlcHRpb24pIik7CisgICAgICAgICAgICBvdXQucHJpbnRpbCgiICAgIHRocm93IChTa2lwUGFnZUV4Y2VwdGlvbikgZTsiKTsKKyAgICAgICAgICAgIG91dC5wcmludGlsKCJ0aHJvdyBuZXcgSnNwRXhjZXB0aW9uKCBlICk7Iik7CisgICAgICAgICAgICBvdXQucG9wSW5kZW50KCk7CisgICAgICAgICAgICBvdXQucHJpbnRpbCgifSIpOyAvLyBjYXRjaAorICAgICAgICAgICAgb3V0LnByaW50aWwoImZpbmFsbHkgeyIpOworICAgICAgICAgICAgb3V0LnB1c2hJbmRlbnQoKTsKKworICAgICAgICAgICAgb3V0LnByaW50aWwoImlmKCB3cml0ZXIgIT0gbnVsbCApIHsiKTsKKyAgICAgICAgICAgIG91dC5wdXNoSW5kZW50KCk7CisgICAgICAgICAgICBvdXQucHJpbnRpbCgidGhpcy5qc3BDb250ZXh0LnBvcEJvZHkoKTsiKTsKKyAgICAgICAgICAgIG91dC5wb3BJbmRlbnQoKTsKKyAgICAgICAgICAgIG91dC5wcmludGlsKCJ9Iik7CisKKyAgICAgICAgICAgIG91dC5wb3BJbmRlbnQoKTsKKyAgICAgICAgICAgIG91dC5wcmludGlsKCJ9Iik7IC8vIGZpbmFsbHkKKyAgICAgICAgICAgIG91dC5wb3BJbmRlbnQoKTsKKyAgICAgICAgICAgIG91dC5wcmludGlsKCJ9Iik7IC8vIGludm9rZSBtZXRob2QKKyAgICAgICAgICAgIG91dC5wb3BJbmRlbnQoKTsKKyAgICAgICAgICAgIG91dC5wcmludGlsKCJ9Iik7IC8vIGhlbHBlciBjbGFzcworICAgICAgICAgICAgb3V0LnBvcEluZGVudCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiBjbGFzc0J1ZmZlci50b1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgYWRqdXN0SmF2YUxpbmVzKGludCBvZmZzZXQpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhZ21lbnRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgRnJhZ21lbnQgZnJhZ21lbnQgPSAoRnJhZ21lbnQpZnJhZ21lbnRzLmdldChpKTsKKyAgICAgICAgICAgICAgICBmcmFnbWVudC5nZXRHZW5CdWZmZXIoKS5hZGp1c3RKYXZhTGluZXMob2Zmc2V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9JbXBsaWNpdFRhZ0xpYnJhcnlJbmZvLmphdmEgYi9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvSW1wbGljaXRUYWdMaWJyYXJ5SW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5N2U3YWEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvSW1wbGljaXRUYWdMaWJyYXJ5SW5mby5qYXZhCkBAIC0wLDAgKzEsMTQxIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYXNwZXIuY29tcGlsZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuRnVuY3Rpb25JbmZvOworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWdMaWJyYXJ5SW5mbzsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnSW5mbzsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnRmlsZUluZm87CitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIuSnNwQ29tcGlsYXRpb25Db250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLkphc3BlckV4Y2VwdGlvbjsKKworLyoqCisgKiBDbGFzcyByZXNwb25zaWJsZSBmb3IgZ2VuZXJhdGluZyBhbiBpbXBsaWNpdCB0YWcgbGlicmFyeSBjb250YWluaW5nIHRhZworICogaGFuZGxlcnMgY29ycmVzcG9uZGluZyB0byB0aGUgdGFnIGZpbGVzIGluICIvV0VCLUlORi90YWdzLyIgb3IgYSAKKyAqIHN1YmRpcmVjdG9yeSBvZiBpdC4KKyAqCisgKiBAYXV0aG9yIEphbiBMdWVoZQorICovCitjbGFzcyBJbXBsaWNpdFRhZ0xpYnJhcnlJbmZvIGV4dGVuZHMgVGFnTGlicmFyeUluZm8geworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9JTkZfVEFHUyA9ICIvV0VCLUlORi90YWdzIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0ZJTEVfU1VGRklYID0gIi50YWciOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdYX0ZJTEVfU1VGRklYID0gIi50YWd4IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHU19TSE9SVE5BTUUgPSAidGFncyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRMSUJfVkVSU0lPTiA9ICIxLjAiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfVkVSU0lPTiA9ICIyLjAiOworCisgICAgLy8gTWFwcyB0YWcgbmFtZXMgdG8gdGFnIGZpbGUgcGF0aHMKKyAgICBwcml2YXRlIEhhc2h0YWJsZSB0YWdGaWxlTWFwOworCisgICAgcHJpdmF0ZSBQYXJzZXJDb250cm9sbGVyIHBjOworICAgIHByaXZhdGUgVmVjdG9yIHZlYzsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLgorICAgICAqLworICAgIHB1YmxpYyBJbXBsaWNpdFRhZ0xpYnJhcnlJbmZvKEpzcENvbXBpbGF0aW9uQ29udGV4dCBjdHh0LAorCQkJCSAgUGFyc2VyQ29udHJvbGxlciBwYywKKwkJCQkgIFN0cmluZyBwcmVmaXgsCisJCQkJICBTdHJpbmcgdGFnZGlyLAorCQkJCSAgRXJyb3JEaXNwYXRjaGVyIGVycikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyKHByZWZpeCwgbnVsbCk7CisJdGhpcy5wYyA9IHBjOworCXRoaXMudGFnRmlsZU1hcCA9IG5ldyBIYXNodGFibGUoKTsKKwl0aGlzLnZlYyA9IG5ldyBWZWN0b3IoKTsKKworICAgICAgICAvLyBJbXBsaWNpdCB0YWcgbGlicmFyaWVzIGhhdmUgbm8gZnVuY3Rpb25zOgorICAgICAgICB0aGlzLmZ1bmN0aW9ucyA9IG5ldyBGdW5jdGlvbkluZm9bMF07CisKKwl0bGlidmVyc2lvbiA9IFRMSUJfVkVSU0lPTjsKKwlqc3B2ZXJzaW9uID0gSlNQX1ZFUlNJT047CisKKwlpZiAoIXRhZ2Rpci5zdGFydHNXaXRoKFdFQl9JTkZfVEFHUykpIHsKKwkgICAgZXJyLmpzcEVycm9yKCJqc3AuZXJyb3IuaW52YWxpZC50YWdkaXIiLCB0YWdkaXIpOworCX0KKwkKKwkvLyBEZXRlcm1pbmUgdGhlIHZhbHVlIG9mIHRoZSA8c2hvcnQtbmFtZT4gc3ViZWxlbWVudCBvZiB0aGUKKwkvLyAiaW1hZ2luYXJ5IiA8dGFnbGliPiBlbGVtZW50CisJaWYgKHRhZ2Rpci5lcXVhbHMoV0VCX0lORl9UQUdTKQorCSAgICAgICAgfHwgdGFnZGlyLmVxdWFscyggV0VCX0lORl9UQUdTICsgIi8iKSkgeworCSAgICBzaG9ydG5hbWUgPSBUQUdTX1NIT1JUTkFNRTsKKwl9IGVsc2UgeworCSAgICBzaG9ydG5hbWUgPSB0YWdkaXIuc3Vic3RyaW5nKFdFQl9JTkZfVEFHUy5sZW5ndGgoKSk7CisJICAgIHNob3J0bmFtZSA9IHNob3J0bmFtZS5yZXBsYWNlKCcvJywgJy0nKTsKKwl9CisKKwkvLyBQb3B1bGF0ZSBtYXBwaW5nIG9mIHRhZyBuYW1lcyB0byB0YWcgZmlsZSBwYXRocworCVNldCBkaXJMaXN0ID0gY3R4dC5nZXRSZXNvdXJjZVBhdGhzKHRhZ2Rpcik7CisJaWYgKGRpckxpc3QgIT0gbnVsbCkgeworCSAgICBJdGVyYXRvciBpdCA9IGRpckxpc3QuaXRlcmF0b3IoKTsKKwkgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgeworCQlTdHJpbmcgcGF0aCA9IChTdHJpbmcpIGl0Lm5leHQoKTsKKwkJaWYgKHBhdGguZW5kc1dpdGgoVEFHX0ZJTEVfU1VGRklYKQorCQkgICAgICAgIHx8IHBhdGguZW5kc1dpdGgoVEFHWF9GSUxFX1NVRkZJWCkpIHsKKwkJICAgIC8qCisJCSAgICAgKiBVc2UgdGhlIGZpbGVuYW1lIG9mIHRoZSB0YWcgZmlsZSwgd2l0aG91dCB0aGUgLnRhZyBvcgorCQkgICAgICogLnRhZ3ggZXh0ZW5zaW9uLCByZXNwZWN0aXZlbHksIGFzIHRoZSA8bmFtZT4gc3ViZWxlbWVudAorCQkgICAgICogb2YgdGhlICJpbWFnaW5hcnkiIDx0YWctZmlsZT4gZWxlbWVudAorCQkgICAgICovCisJCSAgICBTdHJpbmcgc3VmZml4ID0gcGF0aC5lbmRzV2l0aChUQUdfRklMRV9TVUZGSVgpID8KKwkJCVRBR19GSUxFX1NVRkZJWCA6IFRBR1hfRklMRV9TVUZGSVg7IAorCQkgICAgU3RyaW5nIHRhZ05hbWUgPSBwYXRoLnN1YnN0cmluZyhwYXRoLmxhc3RJbmRleE9mKCIvIikgKyAxKTsKKwkJICAgIHRhZ05hbWUgPSB0YWdOYW1lLnN1YnN0cmluZygwLAorCQkJCQkJdGFnTmFtZS5sYXN0SW5kZXhPZihzdWZmaXgpKTsKKwkJICAgIHRhZ0ZpbGVNYXAucHV0KHRhZ05hbWUsIHBhdGgpOworCQl9CisJICAgIH0KKwl9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2tzIHRvIHNlZSBpZiB0aGUgZ2l2ZW4gdGFnIG5hbWUgbWFwcyB0byBhIHRhZyBmaWxlIHBhdGgsCisgICAgICogYW5kIGlmIHNvLCBwYXJzZXMgdGhlIGNvcnJlc3BvbmRpbmcgdGFnIGZpbGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBUYWdGaWxlSW5mbyBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiB0YWcgbmFtZSwgb3IgbnVsbCBpZgorICAgICAqIHRoZSBnaXZlbiB0YWcgbmFtZSBpcyBub3QgaW1wbGVtZW50ZWQgYXMgYSB0YWcgZmlsZQorICAgICAqLworICAgIHB1YmxpYyBUYWdGaWxlSW5mbyBnZXRUYWdGaWxlKFN0cmluZyBzaG9ydE5hbWUpIHsKKworCVRhZ0ZpbGVJbmZvIHRhZ0ZpbGUgPSBzdXBlci5nZXRUYWdGaWxlKHNob3J0TmFtZSk7CisJaWYgKHRhZ0ZpbGUgPT0gbnVsbCkgeworCSAgICBTdHJpbmcgcGF0aCA9IChTdHJpbmcpIHRhZ0ZpbGVNYXAuZ2V0KHNob3J0TmFtZSk7CisJICAgIGlmIChwYXRoID09IG51bGwpIHsKKwkJcmV0dXJuIG51bGw7CisJICAgIH0KKworCSAgICBUYWdJbmZvIHRhZ0luZm8gPSBudWxsOworCSAgICB0cnkgeworCQl0YWdJbmZvID0gVGFnRmlsZVByb2Nlc3Nvci5wYXJzZVRhZ0ZpbGVEaXJlY3RpdmVzKHBjLAorCQkJCQkJCQkgIHNob3J0TmFtZSwKKwkJCQkJCQkJICBwYXRoLAorCQkJCQkJCQkgIHRoaXMpOworCSAgICB9IGNhdGNoIChKYXNwZXJFeGNlcHRpb24gamUpIHsKKwkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oamUudG9TdHJpbmcoKSk7CisJICAgIH0KKworCSAgICB0YWdGaWxlID0gbmV3IFRhZ0ZpbGVJbmZvKHNob3J0TmFtZSwgcGF0aCwgdGFnSW5mbyk7CisJICAgIHZlYy5hZGRFbGVtZW50KHRhZ0ZpbGUpOworCisJICAgIHRoaXMudGFnRmlsZXMgPSBuZXcgVGFnRmlsZUluZm9bdmVjLnNpemUoKV07CisJICAgIHZlYy5jb3B5SW50byh0aGlzLnRhZ0ZpbGVzKTsKKwl9CisKKwlyZXR1cm4gdGFnRmlsZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvSkRUQ29tcGlsZXIuamF2YSBiL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9KRFRDb21waWxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzZDk2ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvSkRUQ29tcGlsZXIuamF2YQpAQCAtMCwwICsxLDQwNiBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFzcGVyLmNvbXBpbGVyOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS5pby5SZWFkZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLkphc3BlckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JUHJvYmxlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQ2xhc3NGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5Db21waWxhdGlvblJlc3VsdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuQ29tcGlsZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLkRlZmF1bHRFcnJvckhhbmRsaW5nUG9saWNpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklDb21waWxlclJlcXVlc3RvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuSUVycm9ySGFuZGxpbmdQb2xpY3k7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLklQcm9ibGVtRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY2xhc3NmbXQuQ2xhc3NGaWxlUmVhZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5lbnYuSUNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuZW52LklOYW1lRW52aXJvbm1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmVudi5OYW1lRW52aXJvbm1lbnRBbnN3ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLmltcGwuQ29tcGlsZXJPcHRpb25zOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb21waWxlci5wcm9ibGVtLkRlZmF1bHRQcm9ibGVtRmFjdG9yeTsKKworLyoqCisgKiBKRFQgY2xhc3MgY29tcGlsZXIuIFRoaXMgY29tcGlsZXIgd2lsbCBsb2FkIHNvdXJjZSBkZXBlbmRlbmNpZXMgZnJvbSB0aGUKKyAqIGNvbnRleHQgY2xhc3Nsb2FkZXIsIHJlZHVjaW5nIGRyYW1hdGljYWxseSBkaXNrIGFjY2VzcyBkdXJpbmcgCisgKiB0aGUgY29tcGlsYXRpb24gcHJvY2Vzcy4KKyAqCisgKiBAYXV0aG9yIENvY29vbjIKKyAqIEBhdXRob3IgUmVteSBNYXVjaGVyYXQKKyAqLworcHVibGljIGNsYXNzIEpEVENvbXBpbGVyIGV4dGVuZHMgb3JnLmFwYWNoZS5qYXNwZXIuY29tcGlsZXIuQ29tcGlsZXIgeworCisgICAgCisgICAgc3RhdGljIGJvb2xlYW4gdGFyZ2V0MTQ7CisgICAgc3RhdGljIGJvb2xlYW4gc291cmNlMTQ7CisKKyAgICBzdGF0aWMgeworICAgICAgICAvLyBEZXRlY3QgSkRLIHZlcnNpb24gd2UgYXJlIHJ1bm5pbmcgdW5kZXIKKyAgICAgICAgU3RyaW5nIHZlcnNpb24gPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuc3BlY2lmaWNhdGlvbi52ZXJzaW9uIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzb3VyY2UxNCA9IHRhcmdldDE0ID0gRmxvYXQucGFyc2VGbG9hdCh2ZXJzaW9uKSA+PSAxLjQ7CisgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBzb3VyY2UxNCA9IHRhcmdldDE0ID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKiAKKyAgICAgKiBDb21waWxlIHRoZSBzZXJ2bGV0IGZyb20gLmphdmEgZmlsZSB0byAuY2xhc3MgZmlsZQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGdlbmVyYXRlQ2xhc3MoU3RyaW5nW10gc21hcCkKKyAgICAgICAgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgSmFzcGVyRXhjZXB0aW9uLCBFeGNlcHRpb24geworCisgICAgICAgIGxvbmcgdDE9U3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIAorICAgICAgICBmaW5hbCBTdHJpbmcgc291cmNlRmlsZSA9IGN0eHQuZ2V0U2VydmxldEphdmFGaWxlTmFtZSgpOworICAgICAgICBmaW5hbCBTdHJpbmcgb3V0cHV0RGlyID0gY3R4dC5nZXRPcHRpb25zKCkuZ2V0U2NyYXRjaERpcigpLmdldEFic29sdXRlUGF0aCgpOworICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBjdHh0LmdldFNlcnZsZXRQYWNrYWdlTmFtZSgpOworICAgICAgICBmaW5hbCBTdHJpbmcgdGFyZ2V0Q2xhc3NOYW1lID0gCisgICAgICAgICAgICAoKHBhY2thZ2VOYW1lLmxlbmd0aCgpICE9IDApID8gKHBhY2thZ2VOYW1lICsgIi4iKSA6ICIiKSAKKyAgICAgICAgICAgICAgICAgICAgKyBjdHh0LmdldFNlcnZsZXRDbGFzc05hbWUoKTsKKyAgICAgICAgZmluYWwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIgPSBjdHh0LmdldEpzcExvYWRlcigpOworICAgICAgICBTdHJpbmdbXSBmaWxlTmFtZXMgPSBuZXcgU3RyaW5nW10ge3NvdXJjZUZpbGV9OworICAgICAgICBTdHJpbmdbXSBjbGFzc05hbWVzID0gbmV3IFN0cmluZ1tdIHt0YXJnZXRDbGFzc05hbWV9OworICAgICAgICBmaW5hbCBBcnJheUxpc3QgcHJvYmxlbUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIAorICAgICAgICBjbGFzcyBDb21waWxhdGlvblVuaXQgaW1wbGVtZW50cyBJQ29tcGlsYXRpb25Vbml0IHsKKworICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZTsKKyAgICAgICAgICAgIFN0cmluZyBzb3VyY2VGaWxlOworCisgICAgICAgICAgICBDb21waWxhdGlvblVuaXQoU3RyaW5nIHNvdXJjZUZpbGUsIFN0cmluZyBjbGFzc05hbWUpIHsKKyAgICAgICAgICAgICAgICB0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKKyAgICAgICAgICAgICAgICB0aGlzLnNvdXJjZUZpbGUgPSBzb3VyY2VGaWxlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgY2hhcltdIGdldEZpbGVOYW1lKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBjbGFzc05hbWUudG9DaGFyQXJyYXkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgcHVibGljIGNoYXJbXSBnZXRDb250ZW50cygpIHsKKyAgICAgICAgICAgICAgICBjaGFyW10gcmVzdWx0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbVJlYWRlciBpc1JlYWRlciA9CisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSW5wdXRTdHJlYW1SZWFkZXIobmV3IEZpbGVJbnB1dFN0cmVhbShzb3VyY2VGaWxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4dC5nZXRPcHRpb25zKCkuZ2V0SmF2YUVuY29kaW5nKCkpOworICAgICAgICAgICAgICAgICAgICBSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGlzUmVhZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyW10gY2hhcnMgPSBuZXcgY2hhcls4MTkyXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQ7CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKGNvdW50ID0gcmVhZGVyLnJlYWQoY2hhcnMsIDAsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzLmxlbmd0aCkpID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoY2hhcnMsIDAsIGNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBjaGFyW2J1Zi5sZW5ndGgoKV07CisgICAgICAgICAgICAgICAgICAgICAgICBidWYuZ2V0Q2hhcnMoMCwgcmVzdWx0Lmxlbmd0aCwgcmVzdWx0LCAwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJDb21waWxhdGlvbiBlcnJvciIsIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBwdWJsaWMgY2hhcltdIGdldE1haW5UeXBlTmFtZSgpIHsKKyAgICAgICAgICAgICAgICBpbnQgZG90ID0gY2xhc3NOYW1lLmxhc3RJbmRleE9mKCcuJyk7CisgICAgICAgICAgICAgICAgaWYgKGRvdCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNsYXNzTmFtZS5zdWJzdHJpbmcoZG90ICsgMSkudG9DaGFyQXJyYXkoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGNsYXNzTmFtZS50b0NoYXJBcnJheSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBwdWJsaWMgY2hhcltdW10gZ2V0UGFja2FnZU5hbWUoKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nVG9rZW5pemVyIGl6ZXIgPSAKKyAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1Rva2VuaXplcihjbGFzc05hbWUsICIuIik7CisgICAgICAgICAgICAgICAgY2hhcltdW10gcmVzdWx0ID0gbmV3IGNoYXJbaXplci5jb3VudFRva2VucygpLTFdW107CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRvayA9IGl6ZXIubmV4dFRva2VuKCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtpXSA9IHRvay50b0NoYXJBcnJheSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZmluYWwgSU5hbWVFbnZpcm9ubWVudCBlbnYgPSBuZXcgSU5hbWVFbnZpcm9ubWVudCgpIHsKKworICAgICAgICAgICAgICAgIHB1YmxpYyBOYW1lRW52aXJvbm1lbnRBbnN3ZXIgCisgICAgICAgICAgICAgICAgICAgIGZpbmRUeXBlKGNoYXJbXVtdIGNvbXBvdW5kVHlwZU5hbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlc3VsdCA9ICIiOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2VwID0gIiI7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29tcG91bmRUeXBlTmFtZS5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IHNlcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBuZXcgU3RyaW5nKGNvbXBvdW5kVHlwZU5hbWVbaV0pOworICAgICAgICAgICAgICAgICAgICAgICAgc2VwID0gIi4iOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmaW5kVHlwZShyZXN1bHQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHB1YmxpYyBOYW1lRW52aXJvbm1lbnRBbnN3ZXIgCisgICAgICAgICAgICAgICAgICAgIGZpbmRUeXBlKGNoYXJbXSB0eXBlTmFtZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJbXVtdIHBhY2thZ2VOYW1lKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVzdWx0ID0gIiI7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2VwID0gIiI7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhY2thZ2VOYW1lLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IHNlcDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gbmV3IFN0cmluZyhwYWNrYWdlTmFtZVtpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VwID0gIi4iOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IHNlcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBuZXcgU3RyaW5nKHR5cGVOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmaW5kVHlwZShyZXN1bHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBwcml2YXRlIE5hbWVFbnZpcm9ubWVudEFuc3dlciBmaW5kVHlwZShTdHJpbmcgY2xhc3NOYW1lKSB7CisKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGFzc05hbWUuZXF1YWxzKHRhcmdldENsYXNzTmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ29tcGlsYXRpb25Vbml0KHNvdXJjZUZpbGUsIGNsYXNzTmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTmFtZUVudmlyb25tZW50QW5zd2VyKGNvbXBpbGF0aW9uVW5pdCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVzb3VyY2VOYW1lID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lLnJlcGxhY2UoJy4nLCAnLycpICsgIi5jbGFzcyI7CisgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTG9hZGVyLmdldFJlc291cmNlQXNTdHJlYW0ocmVzb3VyY2VOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGNsYXNzQnl0ZXM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzgxOTJdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oYnVmLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgoY291bnQgPSBpcy5yZWFkKGJ1ZiwgMCwgYnVmLmxlbmd0aCkpID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYW9zLndyaXRlKGJ1ZiwgMCwgY291bnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYW9zLmZsdXNoKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NCeXRlcyA9IGJhb3MudG9CeXRlQXJyYXkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyW10gZmlsZU5hbWUgPSBjbGFzc05hbWUudG9DaGFyQXJyYXkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc0ZpbGVSZWFkZXIgY2xhc3NGaWxlUmVhZGVyID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc0ZpbGVSZWFkZXIoY2xhc3NCeXRlcywgZmlsZU5hbWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5hbWVFbnZpcm9ubWVudEFuc3dlcihjbGFzc0ZpbGVSZWFkZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleGMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiQ29tcGlsYXRpb24gZXJyb3IiLCBleGMpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIuY2xhc3NmbXQuQ2xhc3NGb3JtYXRFeGNlcHRpb24gZXhjKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkNvbXBpbGF0aW9uIGVycm9yIiwgZXhjKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcml2YXRlIGJvb2xlYW4gaXNQYWNrYWdlKFN0cmluZyByZXN1bHQpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5lcXVhbHModGFyZ2V0Q2xhc3NOYW1lKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyByZXNvdXJjZU5hbWUgPSByZXN1bHQucmVwbGFjZSgnLicsICcvJykgKyAiLmNsYXNzIjsKKyAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTG9hZGVyLmdldFJlc291cmNlQXNTdHJlYW0ocmVzb3VyY2VOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzID09IG51bGw7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNQYWNrYWdlKGNoYXJbXVtdIHBhcmVudFBhY2thZ2VOYW1lLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcltdIHBhY2thZ2VOYW1lKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyByZXN1bHQgPSAiIjsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlcCA9ICIiOworICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50UGFja2FnZU5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJlbnRQYWNrYWdlTmFtZS5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBzZXA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHN0ciA9IG5ldyBTdHJpbmcocGFyZW50UGFja2FnZU5hbWVbaV0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBzdHI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VwID0gIi4iOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzdHIgPSBuZXcgU3RyaW5nKHBhY2thZ2VOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKENoYXJhY3Rlci5pc1VwcGVyQ2FzZShzdHIuY2hhckF0KDApKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1BhY2thZ2UocmVzdWx0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gc2VwOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gc3RyOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXNQYWNrYWdlKHJlc3VsdCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgY2xlYW51cCgpIHsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgZmluYWwgSUVycm9ySGFuZGxpbmdQb2xpY3kgcG9saWN5ID0gCisgICAgICAgICAgICBEZWZhdWx0RXJyb3JIYW5kbGluZ1BvbGljaWVzLnByb2NlZWRXaXRoQWxsUHJvYmxlbXMoKTsKKworICAgICAgICBmaW5hbCBNYXAgc2V0dGluZ3MgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICBzZXR0aW5ncy5wdXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9MaW5lTnVtYmVyQXR0cmlidXRlLAorICAgICAgICAgICAgICAgICAgICAgQ29tcGlsZXJPcHRpb25zLkdFTkVSQVRFKTsKKyAgICAgICAgc2V0dGluZ3MucHV0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fU291cmNlRmlsZUF0dHJpYnV0ZSwKKyAgICAgICAgICAgICAgICAgICAgIENvbXBpbGVyT3B0aW9ucy5HRU5FUkFURSk7CisgICAgICAgIHNldHRpbmdzLnB1dChDb21waWxlck9wdGlvbnMuT1BUSU9OX1JlcG9ydERlcHJlY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgQ29tcGlsZXJPcHRpb25zLklHTk9SRSk7CisgICAgICAgIGlmIChjdHh0LmdldE9wdGlvbnMoKS5nZXRKYXZhRW5jb2RpbmcoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBzZXR0aW5ncy5wdXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9FbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgY3R4dC5nZXRPcHRpb25zKCkuZ2V0SmF2YUVuY29kaW5nKCkpOworICAgICAgICB9CisgICAgICAgIGlmIChjdHh0LmdldE9wdGlvbnMoKS5nZXRDbGFzc0RlYnVnSW5mbygpKSB7CisgICAgICAgICAgICBzZXR0aW5ncy5wdXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9Mb2NhbFZhcmlhYmxlQXR0cmlidXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBpbGVyT3B0aW9ucy5HRU5FUkFURSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNvdXJjZTE0KSB7CisgICAgICAgICAgICBzZXR0aW5ncy5wdXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9Tb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcGlsZXJPcHRpb25zLlZFUlNJT05fMV80KTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFVzZSB0YXJnZXQgYXR0cmlidXRlIGZyb20gT3B0aW9ucyBpbnN0ZWFkCisgICAgICAgIGlmICh0YXJnZXQxNCkgeworICAgICAgICAgICAgc2V0dGluZ3MucHV0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fVGFyZ2V0UGxhdGZvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcGlsZXJPcHRpb25zLlZFUlNJT05fMV80KTsKKyAgICAgICAgfQorICAgICAgICAqLworICAgICAgICBpZihjdHh0LmdldE9wdGlvbnMoKS5nZXRDb21waWxlclRhcmdldFZNKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nIG9wdCA9IGN0eHQuZ2V0T3B0aW9ucygpLmdldENvbXBpbGVyVGFyZ2V0Vk0oKTsKKyAgICAgICAgICAgIGlmKG9wdC5lcXVhbHMoIjEuMSIpKSB7CisgICAgICAgICAgICAgICAgc2V0dGluZ3MucHV0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fVGFyZ2V0UGxhdGZvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBpbGVyT3B0aW9ucy5WRVJTSU9OXzFfMSk7CisgICAgICAgICAgICB9IGVsc2UgaWYob3B0LmVxdWFscygiMS4yIikpIHsKKyAgICAgICAgICAgICAgICBzZXR0aW5ncy5wdXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9UYXJnZXRQbGF0Zm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcGlsZXJPcHRpb25zLlZFUlNJT05fMV8yKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZihvcHQuZXF1YWxzKCIxLjMiKSkgeyAKKyAgICAgICAgICAgICAgICBzZXR0aW5ncy5wdXQoQ29tcGlsZXJPcHRpb25zLk9QVElPTl9UYXJnZXRQbGF0Zm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcGlsZXJPcHRpb25zLlZFUlNJT05fMV8zKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZihvcHQuZXF1YWxzKCIxLjQiKSkgeworICAgICAgICAgICAgICAgIHNldHRpbmdzLnB1dChDb21waWxlck9wdGlvbnMuT1BUSU9OX1RhcmdldFBsYXRmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21waWxlck9wdGlvbnMuVkVSU0lPTl8xXzQpOworICAgICAgICAgICAgfSBlbHNlIGlmKG9wdC5lcXVhbHMoIjEuNSIpKSB7CisgICAgICAgICAgICAgICAgc2V0dGluZ3MucHV0KENvbXBpbGVyT3B0aW9ucy5PUFRJT05fVGFyZ2V0UGxhdGZvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBpbGVyT3B0aW9ucy5WRVJTSU9OXzFfNSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGxvZy53YXJuKCJVbmtub3duIHRhcmdldCBWTSAiICsgb3B0ICsgIiBpZ25vcmVkLiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZmluYWwgSVByb2JsZW1GYWN0b3J5IHByb2JsZW1GYWN0b3J5ID0gCisgICAgICAgICAgICBuZXcgRGVmYXVsdFByb2JsZW1GYWN0b3J5KExvY2FsZS5nZXREZWZhdWx0KCkpOworICAgICAgICAKKyAgICAgICAgZmluYWwgSUNvbXBpbGVyUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBJQ29tcGlsZXJSZXF1ZXN0b3IoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgYWNjZXB0UmVzdWx0KENvbXBpbGF0aW9uUmVzdWx0IHJlc3VsdCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5oYXNQcm9ibGVtcygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVByb2JsZW1bXSBwcm9ibGVtcyA9IHJlc3VsdC5nZXRQcm9ibGVtcygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvYmxlbXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVByb2JsZW0gcHJvYmxlbSA9IHByb2JsZW1zW2ldOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvYmxlbS5pc0Vycm9yKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZyhwcm9ibGVtc1tpXS5nZXRPcmlnaW5hdGluZ0ZpbGVOYW1lKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9ibGVtTGlzdC5hZGQoRXJyb3JEaXNwYXRjaGVyLmNyZWF0ZUphdmFjRXJyb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuYW1lLCBwYWdlTm9kZXMsIG5ldyBTdHJpbmdCdWZmZXIocHJvYmxlbS5nZXRNZXNzYWdlKCkpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvYmxlbS5nZXRTb3VyY2VMaW5lTnVtYmVyKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEphc3BlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJFcnJvciB2aXNpdGluZyBub2RlIiwgZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvYmxlbUxpc3QuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NGaWxlW10gY2xhc3NGaWxlcyA9IHJlc3VsdC5nZXRDbGFzc0ZpbGVzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc0ZpbGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzRmlsZSBjbGFzc0ZpbGUgPSBjbGFzc0ZpbGVzW2ldOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyW11bXSBjb21wb3VuZE5hbWUgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzRmlsZS5nZXRDb21wb3VuZE5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9ICIiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2VwID0gIiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqIDwgY29tcG91bmROYW1lLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUgKz0gc2VwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lICs9IG5ldyBTdHJpbmcoY29tcG91bmROYW1lW2pdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcCA9ICIuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gYnl0ZXMgPSBjbGFzc0ZpbGUuZ2V0Qnl0ZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG91dEZpbGUgPSBvdXRwdXREaXIgKyAiLyIgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZS5yZXBsYWNlKCcuJywgJy8nKSArICIuY2xhc3MiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIGZvdXQgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlT3V0cHV0U3RyZWFtKG91dEZpbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJlZE91dHB1dFN0cmVhbSBib3MgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShmb3V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9zLndyaXRlKGJ5dGVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9zLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleGMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiQ29tcGlsYXRpb24gZXJyb3IiLCBleGMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKworICAgICAgICBJQ29tcGlsYXRpb25Vbml0W10gY29tcGlsYXRpb25Vbml0cyA9IAorICAgICAgICAgICAgbmV3IElDb21waWxhdGlvblVuaXRbY2xhc3NOYW1lcy5sZW5ndGhdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbXBpbGF0aW9uVW5pdHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBjbGFzc05hbWVzW2ldOworICAgICAgICAgICAgY29tcGlsYXRpb25Vbml0c1tpXSA9IG5ldyBDb21waWxhdGlvblVuaXQoZmlsZU5hbWVzW2ldLCBjbGFzc05hbWUpOworICAgICAgICB9CisgICAgICAgIENvbXBpbGVyIGNvbXBpbGVyID0gbmV3IENvbXBpbGVyKGVudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9ibGVtRmFjdG9yeSk7CisgICAgICAgIGNvbXBpbGVyLmNvbXBpbGUoY29tcGlsYXRpb25Vbml0cyk7CisKKyAgICAgICAgaWYgKCFjdHh0LmtlZXBHZW5lcmF0ZWQoKSkgeworICAgICAgICAgICAgRmlsZSBqYXZhRmlsZSA9IG5ldyBGaWxlKGN0eHQuZ2V0U2VydmxldEphdmFGaWxlTmFtZSgpKTsKKyAgICAgICAgICAgIGphdmFGaWxlLmRlbGV0ZSgpOworICAgICAgICB9CisgICAgCisgICAgICAgIGlmICghcHJvYmxlbUxpc3QuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBKYXZhY0Vycm9yRGV0YWlsW10gamVkcyA9IAorICAgICAgICAgICAgICAgIChKYXZhY0Vycm9yRGV0YWlsW10pIHByb2JsZW1MaXN0LnRvQXJyYXkobmV3IEphdmFjRXJyb3JEZXRhaWxbMF0pOworICAgICAgICAgICAgZXJyRGlzcGF0Y2hlci5qYXZhY0Vycm9yKGplZHMpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiggbG9nLmlzRGVidWdFbmFibGVkKCkgKSB7CisgICAgICAgICAgICBsb25nIHQyPVN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICAgICAgbG9nLmRlYnVnKCAiQ29tcGlsZWQgIiArIGN0eHQuZ2V0U2VydmxldEphdmFGaWxlTmFtZSgpICsgIiAiICsgKHQyLXQxKSArICJtcyIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGN0eHQuaXNQcm90b3R5cGVNb2RlKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEpTUjQ1IFN1cHBvcnQKKyAgICAgICAgaWYgKCEgb3B0aW9ucy5pc1NtYXBTdXBwcmVzc2VkKCkpIHsKKyAgICAgICAgICAgIFNtYXBVdGlsLmluc3RhbGxTbWFwKHNtYXApOworICAgICAgICB9CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAKK30KZGlmZiAtLWdpdCBhL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9KYXNwZXJUYWdJbmZvLmphdmEgYi9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvSmFzcGVyVGFnSW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhNjcxNTIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvSmFzcGVyVGFnSW5mby5qYXZhCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphc3Blci5jb21waWxlcjsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC4qOworCisvKioKKyAqIFRhZ0luZm8gZXh0ZW5zaW9uIHVzZWQgYnkgdGFnIGhhbmRsZXJzIHRoYXQgYXJlIGltcGxlbWVudGVkIHZpYSB0YWcgZmlsZXMuCisgKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgbmFtZSBvZiB0aGUgTWFwIHVzZWQgdG8gc3RvcmUgdGhlCisgKiBkeW5hbWljIGF0dHJpYnV0ZSBuYW1lcyBhbmQgdmFsdWVzIHBhc3NlZCB0byB0aGUgY3VzdG9tIGFjdGlvbiBpbnZvY2F0aW9uLgorICogVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VkIGJ5IHRoZSBjb2RlIGdlbmVyYXRvci4KKyAqLworY2xhc3MgSmFzcGVyVGFnSW5mbyBleHRlbmRzIFRhZ0luZm8geworCisgICAgcHJpdmF0ZSBTdHJpbmcgZHluYW1pY0F0dHJzTWFwTmFtZTsKKworICAgIHB1YmxpYyBKYXNwZXJUYWdJbmZvKFN0cmluZyB0YWdOYW1lLAorCQkJIFN0cmluZyB0YWdDbGFzc05hbWUsCisJCQkgU3RyaW5nIGJvZHlDb250ZW50LAorCQkJIFN0cmluZyBpbmZvU3RyaW5nLAorCQkJIFRhZ0xpYnJhcnlJbmZvIHRhZ2xpYiwKKwkJCSBUYWdFeHRyYUluZm8gdGFnRXh0cmFJbmZvLAorCQkJIFRhZ0F0dHJpYnV0ZUluZm9bXSBhdHRyaWJ1dGVJbmZvLAorCQkJIFN0cmluZyBkaXNwbGF5TmFtZSwKKwkJCSBTdHJpbmcgc21hbGxJY29uLAorCQkJIFN0cmluZyBsYXJnZUljb24sCisJCQkgVGFnVmFyaWFibGVJbmZvW10gdHZpLAorCQkJIFN0cmluZyBtYXBOYW1lKSB7CisKKwlzdXBlcih0YWdOYW1lLCB0YWdDbGFzc05hbWUsIGJvZHlDb250ZW50LCBpbmZvU3RyaW5nLCB0YWdsaWIsCisJICAgICAgdGFnRXh0cmFJbmZvLCBhdHRyaWJ1dGVJbmZvLCBkaXNwbGF5TmFtZSwgc21hbGxJY29uLCBsYXJnZUljb24sCisJICAgICAgdHZpKTsKKwl0aGlzLmR5bmFtaWNBdHRyc01hcE5hbWUgPSBtYXBOYW1lOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RHluYW1pY0F0dHJpYnV0ZXNNYXBOYW1lKCkgeworCXJldHVybiBkeW5hbWljQXR0cnNNYXBOYW1lOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGhhc0R5bmFtaWNBdHRyaWJ1dGVzKCkgeworICAgICAgICByZXR1cm4gZHluYW1pY0F0dHJzTWFwTmFtZSAhPSBudWxsOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9KYXZhY0Vycm9yRGV0YWlsLmphdmEgYi9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvSmF2YWNFcnJvckRldGFpbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjN2JlZjMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvSmF2YWNFcnJvckRldGFpbC5qYXZhCkBAIC0wLDAgKzEsMTIyIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYXNwZXIuY29tcGlsZXI7CisKKy8qKgorICogQ2xhc3MgcHJvdmlkaW5nIGRldGFpbHMgYWJvdXQgYSBqYXZhYyBjb21waWxhdGlvbiBlcnJvci4KKyAqCisgKiBAYXV0aG9yIEphbiBMdWVoZQorICogQGF1dGhvciBLaW4tbWFuIENodW5nCisgKi8KK3B1YmxpYyBjbGFzcyBKYXZhY0Vycm9yRGV0YWlsIHsKKworICAgIHByaXZhdGUgU3RyaW5nIGphdmFGaWxlTmFtZTsKKyAgICBwcml2YXRlIGludCBqYXZhTGluZU51bTsKKyAgICBwcml2YXRlIFN0cmluZyBqc3BGaWxlTmFtZTsKKyAgICBwcml2YXRlIGludCBqc3BCZWdpbkxpbmVOdW07CisgICAgcHJpdmF0ZSBTdHJpbmdCdWZmZXIgZXJyTXNnOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gamF2YUZpbGVOYW1lIFRoZSBuYW1lIG9mIHRoZSBKYXZhIGZpbGUgaW4gd2hpY2ggdGhlIAorICAgICAqIGNvbXBpbGF0aW9uIGVycm9yIG9jY3VycmVkCisgICAgICogQHBhcmFtIGphdmFMaW5lTnVtIFRoZSBjb21waWxhdGlvbiBlcnJvciBsaW5lIG51bWJlcgorICAgICAqIEBwYXJhbSBlcnJNc2cgVGhlIGNvbXBpbGF0aW9uIGVycm9yIG1lc3NhZ2UKKyAgICAgKi8KKyAgICBwdWJsaWMgSmF2YWNFcnJvckRldGFpbChTdHJpbmcgamF2YUZpbGVOYW1lLAorCQkJICAgIGludCBqYXZhTGluZU51bSwKKwkJCSAgICBTdHJpbmdCdWZmZXIgZXJyTXNnKSB7CisKKwl0aGlzLmphdmFGaWxlTmFtZSA9IGphdmFGaWxlTmFtZTsKKwl0aGlzLmphdmFMaW5lTnVtID0gamF2YUxpbmVOdW07CisJdGhpcy5lcnJNc2cgPSBlcnJNc2c7CisgICAgICAgIHRoaXMuanNwQmVnaW5MaW5lTnVtID0gLTE7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gamF2YUZpbGVOYW1lIFRoZSBuYW1lIG9mIHRoZSBKYXZhIGZpbGUgaW4gd2hpY2ggdGhlIAorICAgICAqIGNvbXBpbGF0aW9uIGVycm9yIG9jY3VycmVkCisgICAgICogQHBhcmFtIGphdmFMaW5lTnVtIFRoZSBjb21waWxhdGlvbiBlcnJvciBsaW5lIG51bWJlcgorICAgICAqIEBwYXJhbSBqc3BGaWxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgSlNQIGZpbGUgZnJvbSB3aGljaCB0aGUgSmF2YSBzb3VyY2UKKyAgICAgKiBmaWxlIHdhcyBnZW5lcmF0ZWQKKyAgICAgKiBAcGFyYW0ganNwQmVnaW5MaW5lTnVtIFRoZSBzdGFydCBsaW5lIG51bWJlciBvZiB0aGUgSlNQIGVsZW1lbnQKKyAgICAgKiByZXNwb25zaWJsZSBmb3IgdGhlIGNvbXBpbGF0aW9uIGVycm9yCisgICAgICogQHBhcmFtIGVyck1zZyBUaGUgY29tcGlsYXRpb24gZXJyb3IgbWVzc2FnZQorICAgICAqLworICAgIHB1YmxpYyBKYXZhY0Vycm9yRGV0YWlsKFN0cmluZyBqYXZhRmlsZU5hbWUsCisJCQkgICAgaW50IGphdmFMaW5lTnVtLAorCQkJICAgIFN0cmluZyBqc3BGaWxlTmFtZSwKKwkJCSAgICBpbnQganNwQmVnaW5MaW5lTnVtLAorCQkJICAgIFN0cmluZ0J1ZmZlciBlcnJNc2cpIHsKKworICAgICAgICB0aGlzKGphdmFGaWxlTmFtZSwgamF2YUxpbmVOdW0sIGVyck1zZyk7CisJdGhpcy5qc3BGaWxlTmFtZSA9IGpzcEZpbGVOYW1lOworCXRoaXMuanNwQmVnaW5MaW5lTnVtID0ganNwQmVnaW5MaW5lTnVtOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIG5hbWUgb2YgdGhlIEphdmEgc291cmNlIGZpbGUgaW4gd2hpY2ggdGhlIGNvbXBpbGF0aW9uIGVycm9yCisgICAgICogb2NjdXJyZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEphdmEgc291cmNlIGZpbGUgbmFtZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SmF2YUZpbGVOYW1lKCkgeworCXJldHVybiB0aGlzLmphdmFGaWxlTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBjb21waWxhdGlvbiBlcnJvciBsaW5lIG51bWJlci4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIENvbXBpbGF0aW9uIGVycm9yIGxpbmUgbnVtYmVyCisgICAgICovCisgICAgcHVibGljIGludCBnZXRKYXZhTGluZU51bWJlcigpIHsKKwlyZXR1cm4gdGhpcy5qYXZhTGluZU51bTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBuYW1lIG9mIHRoZSBKU1AgZmlsZSBmcm9tIHdoaWNoIHRoZSBKYXZhIHNvdXJjZSBmaWxlIHdhcworICAgICAqIGdlbmVyYXRlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gSlNQIGZpbGUgZnJvbSB3aGljaCB0aGUgSmF2YSBzb3VyY2UgZmlsZSB3YXMgZ2VuZXJhdGVkLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SnNwRmlsZU5hbWUoKSB7CisJcmV0dXJuIHRoaXMuanNwRmlsZU5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgc3RhcnQgbGluZSBudW1iZXIgKGluIHRoZSBKU1AgZmlsZSkgb2YgdGhlIEpTUCBlbGVtZW50CisgICAgICogcmVzcG9uc2libGUgZm9yIHRoZSBjb21waWxhdGlvbiBlcnJvci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gU3RhcnQgbGluZSBudW1iZXIgb2YgdGhlIEpTUCBlbGVtZW50IHJlc3BvbnNpYmxlIGZvciB0aGUKKyAgICAgKiBjb21waWxhdGlvbiBlcnJvcgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0SnNwQmVnaW5MaW5lTnVtYmVyKCkgeworCXJldHVybiB0aGlzLmpzcEJlZ2luTGluZU51bTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBjb21waWxhdGlvbiBlcnJvciBtZXNzYWdlLgorICAgICAqCisgICAgICogQHJldHVybiBDb21waWxhdGlvbiBlcnJvciBtZXNzYWdlCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKSB7CisJcmV0dXJuIHRoaXMuZXJyTXNnLnRvU3RyaW5nKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL2NvbXBpbGVyL0pzcENvbmZpZy5qYXZhIGIvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL2NvbXBpbGVyL0pzcENvbmZpZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiNDRmZjYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvSnNwQ29uZmlnLmphdmEKQEAgLTAsMCArMSw0NjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphc3Blci5jb21waWxlcjsKKworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIuSmFzcGVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLnhtbHBhcnNlci5QYXJzZXJVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci54bWxwYXJzZXIuVHJlZU5vZGU7CisKKy8qKgorICogSGFuZGxlcyB0aGUganNwLWNvbmZpZyBlbGVtZW50IGluIFdFQl9JTkYvd2ViLnhtbC4gIFRoaXMgaXMgdXNlZAorICogZm9yIHNwZWNpZnlpbmcgdGhlIEpTUCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIG9uIGEgSlNQIHBhZ2UKKyAqCisgKiBAYXV0aG9yIEtpbi1tYW4gQ2h1bmcKKyAqLworCitwdWJsaWMgY2xhc3MgSnNwQ29uZmlnIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfWE1MID0gIi9XRUItSU5GL3dlYi54bWwiOworCisgICAgLy8gTG9nZ2VyCisgICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEpzcENvbmZpZy5jbGFzcyk7CisKKyAgICBwcml2YXRlIFZlY3RvciBqc3BQcm9wZXJ0aWVzID0gbnVsbDsKKyAgICBwcml2YXRlIFNlcnZsZXRDb250ZXh0IGN0eHQ7CisgICAgcHJpdmF0ZSBib29sZWFuIGluaXRpYWxpemVkID0gZmFsc2U7CisKKyAgICBwcml2YXRlIFN0cmluZyBkZWZhdWx0SXNYbWwgPSBudWxsOwkJLy8gdW5zcGVjaWZpZWQKKyAgICBwcml2YXRlIFN0cmluZyBkZWZhdWx0SXNFTElnbm9yZWQgPSBudWxsOwkvLyB1bnNwZWNpZmllZAorICAgIHByaXZhdGUgU3RyaW5nIGRlZmF1bHRJc1NjcmlwdGluZ0ludmFsaWQgPSAiZmFsc2UiOworICAgIHByaXZhdGUgSnNwUHJvcGVydHkgZGVmYXVsdEpzcFByb3BlcnR5OworCisgICAgcHVibGljIEpzcENvbmZpZyhTZXJ2bGV0Q29udGV4dCBjdHh0KSB7CisJdGhpcy5jdHh0ID0gY3R4dDsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc1dlYkRvdFhtbChTZXJ2bGV0Q29udGV4dCBjdHh0KSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKworCUlucHV0U3RyZWFtIGlzID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgaXMgPSBjdHh0LmdldFJlc291cmNlQXNTdHJlYW0oV0VCX1hNTCk7CisJICAgIGlmIChpcyA9PSBudWxsKSB7CisJICAgICAgICAvLyBubyB3ZWIueG1sCisJICAgICAgICByZXR1cm47CisJICAgIH0KKworCSAgICBQYXJzZXJVdGlscyBwdSA9IG5ldyBQYXJzZXJVdGlscygpOworCSAgICBUcmVlTm9kZSB3ZWJBcHAgPSBwdS5wYXJzZVhNTERvY3VtZW50KFdFQl9YTUwsIGlzKTsKKwkgICAgaWYgKHdlYkFwcCA9PSBudWxsCisgICAgICAgICAgICAgICAgICAgIHx8ICEiMi40Ii5lcXVhbHMod2ViQXBwLmZpbmRBdHRyaWJ1dGUoInZlcnNpb24iKSkpIHsKKwkgICAgICAgIGRlZmF1bHRJc0VMSWdub3JlZCA9ICJ0cnVlIjsKKwkgICAgICAgIHJldHVybjsKKwkgICAgfQorCSAgICBUcmVlTm9kZSBqc3BDb25maWcgPSB3ZWJBcHAuZmluZENoaWxkKCJqc3AtY29uZmlnIik7CisJICAgIGlmIChqc3BDb25maWcgPT0gbnVsbCkgeworCSAgICAgICAgcmV0dXJuOworCSAgICB9CisKKyAgICAgICAgICAgIGpzcFByb3BlcnRpZXMgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgICAgICBJdGVyYXRvciBqc3BQcm9wZXJ0eUxpc3QgPSBqc3BDb25maWcuZmluZENoaWxkcmVuKCJqc3AtcHJvcGVydHktZ3JvdXAiKTsKKyAgICAgICAgICAgIHdoaWxlIChqc3BQcm9wZXJ0eUxpc3QuaGFzTmV4dCgpKSB7CisKKyAgICAgICAgICAgICAgICBUcmVlTm9kZSBlbGVtZW50ID0gKFRyZWVOb2RlKSBqc3BQcm9wZXJ0eUxpc3QubmV4dCgpOworICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGxpc3QgPSBlbGVtZW50LmZpbmRDaGlsZHJlbigpOworCisgICAgICAgICAgICAgICAgVmVjdG9yIHVybFBhdHRlcm5zID0gbmV3IFZlY3RvcigpOworICAgICAgICAgICAgICAgIFN0cmluZyBwYWdlRW5jb2RpbmcgPSBudWxsOworICAgICAgICAgICAgICAgIFN0cmluZyBzY3JpcHRpbmdJbnZhbGlkID0gbnVsbDsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZWxJZ25vcmVkID0gbnVsbDsKKyAgICAgICAgICAgICAgICBTdHJpbmcgaXNYbWwgPSBudWxsOworICAgICAgICAgICAgICAgIFZlY3RvciBpbmNsdWRlUHJlbHVkZSA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgICAgICAgICBWZWN0b3IgaW5jbHVkZUNvZGEgPSBuZXcgVmVjdG9yKCk7CisKKyAgICAgICAgICAgICAgICB3aGlsZSAobGlzdC5oYXNOZXh0KCkpIHsKKworICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0gKFRyZWVOb2RlKSBsaXN0Lm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRuYW1lID0gZWxlbWVudC5nZXROYW1lKCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCJ1cmwtcGF0dGVybiIuZXF1YWxzKHRuYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHVybFBhdHRlcm5zLmFkZEVsZW1lbnQoIGVsZW1lbnQuZ2V0Qm9keSgpICk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCJwYWdlLWVuY29kaW5nIi5lcXVhbHModG5hbWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgcGFnZUVuY29kaW5nID0gZWxlbWVudC5nZXRCb2R5KCk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCJpcy14bWwiLmVxdWFscyh0bmFtZSkpCisgICAgICAgICAgICAgICAgICAgICAgICBpc1htbCA9IGVsZW1lbnQuZ2V0Qm9keSgpOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgiZWwtaWdub3JlZCIuZXF1YWxzKHRuYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsSWdub3JlZCA9IGVsZW1lbnQuZ2V0Qm9keSgpOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgic2NyaXB0aW5nLWludmFsaWQiLmVxdWFscyh0bmFtZSkpCisgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRpbmdJbnZhbGlkID0gZWxlbWVudC5nZXRCb2R5KCk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCJpbmNsdWRlLXByZWx1ZGUiLmVxdWFscyh0bmFtZSkpCisgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlUHJlbHVkZS5hZGRFbGVtZW50KGVsZW1lbnQuZ2V0Qm9keSgpKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoImluY2x1ZGUtY29kYSIuZXF1YWxzKHRuYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVDb2RhLmFkZEVsZW1lbnQoZWxlbWVudC5nZXRCb2R5KCkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh1cmxQYXR0ZXJucy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgCisgICAgICAgICAgICAgICAgLy8gQWRkIG9uZSBKc3BQcm9wZXJ0eUdyb3VwIGZvciBlYWNoIFVSTCBQYXR0ZXJuLiAgVGhpcyBtYWtlcworICAgICAgICAgICAgICAgIC8vIHRoZSBtYXRjaGluZyBsb2dpYyBlYXNpZXIuCisgICAgICAgICAgICAgICAgZm9yKCBpbnQgcCA9IDA7IHAgPCB1cmxQYXR0ZXJucy5zaXplKCk7IHArKyApIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVybFBhdHRlcm4gPSAoU3RyaW5nKXVybFBhdHRlcm5zLmVsZW1lbnRBdCggcCApOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBleHRlbnNpb24gPSBudWxsOworIAorICAgICAgICAgICAgICAgICAgICBpZiAodXJsUGF0dGVybi5pbmRleE9mKCcqJykgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBFeGFjdCBtYXRjaAorICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHVybFBhdHRlcm47CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaSA9IHVybFBhdHRlcm4ubGFzdEluZGV4T2YoJy8nKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGggPSB1cmxQYXR0ZXJuLnN1YnN0cmluZygwLGkrMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSA9IHVybFBhdHRlcm4uc3Vic3RyaW5nKGkrMSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgPSB1cmxQYXR0ZXJuOworICAgICAgICAgICAgICAgICAgICAgICAgfQorIAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGF0dGVybiBtdXN0IGJlICIqIiwgb3Igb2YgdGhlIGZvcm0gIiouanNwIgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGUuZXF1YWxzKCIqIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24gPSAiKiI7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZpbGUuc3RhcnRzV2l0aCgiKi4iKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbiA9IGZpbGUuc3Vic3RyaW5nKGZpbGUuaW5kZXhPZignLicpKzEpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgdXJsIHBhdHRlcm5zIGFyZSByZWNvbnN0cnVjdGVkIGFzIHRoZSBmb2xsd29pbmc6CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXRoICE9IG51bGwsIGV4dGVuc2lvbiA9PSBudWxsOiAgLyBvciAvZm9vL2Jhci5leHQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhdGggPT0gbnVsbCwgZXh0ZW5zaW9uICE9IG51bGw6ICAqLmV4dAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGF0aCAhPSBudWxsLCBleHRlbnNpb24gPT0gIioiOiAgIC9mb28vKgorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc1N0YXIgPSAiKiIuZXF1YWxzKGV4dGVuc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHBhdGggPT0gbnVsbCAmJiAoZXh0ZW5zaW9uID09IG51bGwgfHwgaXNTdGFyKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKHBhdGggIT0gbnVsbCAmJiAhaXNTdGFyKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNXYXJuRW5hYmxlZCgpKSB7CisJCQkgICAgICAgIGxvZy53YXJuKExvY2FsaXplci5nZXRNZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImpzcC53YXJuaW5nLmJhZC51cmxwYXR0ZXJuLnByb3BlcnR5Z3JvdXAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsUGF0dGVybikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIEpzcFByb3BlcnR5IHByb3BlcnR5ID0gbmV3IEpzcFByb3BlcnR5KGlzWG1sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbElnbm9yZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdGluZ0ludmFsaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VFbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZVByZWx1ZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVDb2RhKTsKKyAgICAgICAgICAgICAgICAgICAgSnNwUHJvcGVydHlHcm91cCBwcm9wZXJ0eUdyb3VwID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBKc3BQcm9wZXJ0eUdyb3VwKHBhdGgsIGV4dGVuc2lvbiwgcHJvcGVydHkpOworCisgICAgICAgICAgICAgICAgICAgIGpzcFByb3BlcnRpZXMuYWRkRWxlbWVudChwcm9wZXJ0eUdyb3VwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoaXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGlzLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHt9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdCgpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCisJaWYgKCFpbml0aWFsaXplZCkgeworCSAgICBwcm9jZXNzV2ViRG90WG1sKGN0eHQpOworCSAgICBkZWZhdWx0SnNwUHJvcGVydHkgPSBuZXcgSnNwUHJvcGVydHkoZGVmYXVsdElzWG1sLAorCQkJCQkJIGRlZmF1bHRJc0VMSWdub3JlZCwKKwkJCQkJCSBkZWZhdWx0SXNTY3JpcHRpbmdJbnZhbGlkLAorCQkJCQkJIG51bGwsIG51bGwsIG51bGwpOworCSAgICBpbml0aWFsaXplZCA9IHRydWU7CisJfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbGVjdCB0aGUgcHJvcGVydHkgZ3JvdXAgdGhhdCBoYXMgbW9yZSByZXN0cmljdGl2ZSB1cmwtcGF0dGVybi4KKyAgICAgKiBJbiBjYXNlIG9mIHRpZSwgc2VsZWN0IHRoZSBmaXJzdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIEpzcFByb3BlcnR5R3JvdXAgc2VsZWN0UHJvcGVydHkoSnNwUHJvcGVydHlHcm91cCBwcmV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKc3BQcm9wZXJ0eUdyb3VwIGN1cnIpIHsKKyAgICAgICAgaWYgKHByZXYgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGN1cnI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHByZXYuZ2V0RXh0ZW5zaW9uKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gZXhhY3QgbWF0Y2gKKyAgICAgICAgICAgIHJldHVybiBwcmV2OworICAgICAgICB9CisgICAgICAgIGlmIChjdXJyLmdldEV4dGVuc2lvbigpID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIGV4YWN0IG1hdGNoCisgICAgICAgICAgICByZXR1cm4gY3VycjsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgcHJldlBhdGggPSBwcmV2LmdldFBhdGgoKTsKKyAgICAgICAgU3RyaW5nIGN1cnJQYXRoID0gY3Vyci5nZXRQYXRoKCk7CisgICAgICAgIGlmIChwcmV2UGF0aCA9PSBudWxsICYmIGN1cnJQYXRoID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIEJvdGggc3BlY2lmaWVzIGEgKi5leHQsIGtlZXAgdGhlIGZpcnN0IG9uZQorICAgICAgICAgICAgcmV0dXJuIHByZXY7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHByZXZQYXRoID09IG51bGwgJiYgY3VyclBhdGggIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGN1cnI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHByZXZQYXRoICE9IG51bGwgJiYgY3VyclBhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHByZXY7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHByZXZQYXRoLmxlbmd0aCgpID49IGN1cnJQYXRoLmxlbmd0aCgpKSB7CisgICAgICAgICAgICByZXR1cm4gcHJldjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycjsKKyAgICB9CisgICAgICAgICAgICAKKworICAgIC8qKgorICAgICAqIEZpbmQgYSBwcm9wZXJ0eSB0aGF0IGJlc3QgbWF0Y2hlcyB0aGUgc3VwcGxpZWQgcmVzb3VyY2UuCisgICAgICogQHBhcmFtIHVyaSB0aGUgcmVzb3VyY2Ugc3VwcGxpZWQuCisgICAgICogQHJldHVybiBhIEpzcFByb3BlcnR5IGluZGljYXRpbmcgdGhlIGJlc3QgbWF0Y2gsIG9yIHNvbWUgZGVmYXVsdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgSnNwUHJvcGVydHkgZmluZEpzcFByb3BlcnR5KFN0cmluZyB1cmkpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCisJaW5pdCgpOworCisJLy8gSlNQIENvbmZpZ3VyYXRpb24gc2V0dGluZ3MgZG8gbm90IGFwcGx5IHRvIHRhZyBmaWxlcwkgICAgCisJaWYgKGpzcFByb3BlcnRpZXMgPT0gbnVsbCB8fCB1cmkuZW5kc1dpdGgoIi50YWciKQorCSAgICAgICAgfHwgdXJpLmVuZHNXaXRoKCIudGFneCIpKSB7CisJICAgIHJldHVybiBkZWZhdWx0SnNwUHJvcGVydHk7CisJfQorCisJU3RyaW5nIHVyaVBhdGggPSBudWxsOworCWludCBpbmRleCA9IHVyaS5sYXN0SW5kZXhPZignLycpOworCWlmIChpbmRleCA+PTAgKSB7CisJICAgIHVyaVBhdGggPSB1cmkuc3Vic3RyaW5nKDAsIGluZGV4KzEpOworCX0KKwlTdHJpbmcgdXJpRXh0ZW5zaW9uID0gbnVsbDsKKwlpbmRleCA9IHVyaS5sYXN0SW5kZXhPZignLicpOworCWlmIChpbmRleCA+PTApIHsKKwkgICAgdXJpRXh0ZW5zaW9uID0gdXJpLnN1YnN0cmluZyhpbmRleCsxKTsKKwl9CisKKwlWZWN0b3IgaW5jbHVkZVByZWx1ZGVzID0gbmV3IFZlY3RvcigpOworCVZlY3RvciBpbmNsdWRlQ29kYXMgPSBuZXcgVmVjdG9yKCk7CisKKwlKc3BQcm9wZXJ0eUdyb3VwIGlzWG1sTWF0Y2ggPSBudWxsOworCUpzcFByb3BlcnR5R3JvdXAgZWxJZ25vcmVkTWF0Y2ggPSBudWxsOworCUpzcFByb3BlcnR5R3JvdXAgc2NyaXB0aW5nSW52YWxpZE1hdGNoID0gbnVsbDsKKwlKc3BQcm9wZXJ0eUdyb3VwIHBhZ2VFbmNvZGluZ01hdGNoID0gbnVsbDsKKworCUl0ZXJhdG9yIGl0ZXIgPSBqc3BQcm9wZXJ0aWVzLml0ZXJhdG9yKCk7CisJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisKKwkgICAgSnNwUHJvcGVydHlHcm91cCBqcGcgPSAoSnNwUHJvcGVydHlHcm91cCkgaXRlci5uZXh0KCk7CisJICAgIEpzcFByb3BlcnR5IGpwID0ganBnLmdldEpzcFByb3BlcnR5KCk7CisKKyAgICAgICAgICAgICAvLyAoYXJyYXlzIHdpbGwgYmUgdGhlIHNhbWUgbGVuZ3RoKQorICAgICAgICAgICAgIFN0cmluZyBleHRlbnNpb24gPSBqcGcuZ2V0RXh0ZW5zaW9uKCk7CisgICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBqcGcuZ2V0UGF0aCgpOworIAorICAgICAgICAgICAgIGlmIChleHRlbnNpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAvLyBleGFjdCBtYXRjaCBwYXR0ZXJuOiAvYS9mb28uanNwCisgICAgICAgICAgICAgICAgIGlmICghdXJpLmVxdWFscyhwYXRoKSkgeworICAgICAgICAgICAgICAgICAgICAgLy8gbm90IG1hdGNoZWQ7CisgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgIC8vIE1hdGNoaW5nIHBhdHRlcm5zICouZXh0IG9yIC9wLyoKKyAgICAgICAgICAgICAgICAgaWYgKHBhdGggIT0gbnVsbCAmJiB1cmlQYXRoICE9IG51bGwgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAhIHVyaVBhdGguc3RhcnRzV2l0aChwYXRoKSkgeworICAgICAgICAgICAgICAgICAgICAgLy8gbm90IG1hdGNoZWQKKyAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgIGlmICghZXh0ZW5zaW9uLmVxdWFscygiKiIpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZXh0ZW5zaW9uLmVxdWFscyh1cmlFeHRlbnNpb24pKSB7CisgICAgICAgICAgICAgICAgICAgICAvLyBub3QgbWF0Y2hlZAorICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICB9CisgICAgICAgICAgICAgLy8gV2UgaGF2ZSBhIG1hdGNoCisgICAgICAgICAgICAgLy8gQWRkIGluY2x1ZGUtcHJlbHVkZXMgYW5kIGluY2x1ZGUtY29kYXMKKyAgICAgICAgICAgICBpZiAoanAuZ2V0SW5jbHVkZVByZWx1ZGUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgIGluY2x1ZGVQcmVsdWRlcy5hZGRBbGwoanAuZ2V0SW5jbHVkZVByZWx1ZGUoKSk7CisgICAgICAgICAgICAgfQorICAgICAgICAgICAgIGlmIChqcC5nZXRJbmNsdWRlQ29kYSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgaW5jbHVkZUNvZGFzLmFkZEFsbChqcC5nZXRJbmNsdWRlQ29kYSgpKTsKKyAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIHByZXZpb3VzIG1hdGNoIGZvciB0aGUgc2FtZSBwcm9wZXJ0eSwgcmVtZW1iZXIKKyAgICAgICAgICAgICAvLyB0aGUgb25lIHRoYXQgaXMgbW9yZSByZXN0cmljdGl2ZS4KKyAgICAgICAgICAgICBpZiAoanAuaXNYbWwoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgIGlzWG1sTWF0Y2ggPSBzZWxlY3RQcm9wZXJ0eShpc1htbE1hdGNoLCBqcGcpOworICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICBpZiAoanAuaXNFTElnbm9yZWQoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgIGVsSWdub3JlZE1hdGNoID0gc2VsZWN0UHJvcGVydHkoZWxJZ25vcmVkTWF0Y2gsIGpwZyk7CisgICAgICAgICAgICAgfQorICAgICAgICAgICAgIGlmIChqcC5pc1NjcmlwdGluZ0ludmFsaWQoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgIHNjcmlwdGluZ0ludmFsaWRNYXRjaCA9CisgICAgICAgICAgICAgICAgICAgICBzZWxlY3RQcm9wZXJ0eShzY3JpcHRpbmdJbnZhbGlkTWF0Y2gsIGpwZyk7CisgICAgICAgICAgICAgfQorICAgICAgICAgICAgIGlmIChqcC5nZXRQYWdlRW5jb2RpbmcoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgIHBhZ2VFbmNvZGluZ01hdGNoID0gc2VsZWN0UHJvcGVydHkocGFnZUVuY29kaW5nTWF0Y2gsIGpwZyk7CisgICAgICAgICAgICAgfQorCX0KKworCisJU3RyaW5nIGlzWG1sID0gZGVmYXVsdElzWG1sOworCVN0cmluZyBpc0VMSWdub3JlZCA9IGRlZmF1bHRJc0VMSWdub3JlZDsKKwlTdHJpbmcgaXNTY3JpcHRpbmdJbnZhbGlkID0gZGVmYXVsdElzU2NyaXB0aW5nSW52YWxpZDsKKwlTdHJpbmcgcGFnZUVuY29kaW5nID0gbnVsbDsKKworCWlmIChpc1htbE1hdGNoICE9IG51bGwpIHsKKwkgICAgaXNYbWwgPSBpc1htbE1hdGNoLmdldEpzcFByb3BlcnR5KCkuaXNYbWwoKTsKKwl9CisJaWYgKGVsSWdub3JlZE1hdGNoICE9IG51bGwpIHsKKwkgICAgaXNFTElnbm9yZWQgPSBlbElnbm9yZWRNYXRjaC5nZXRKc3BQcm9wZXJ0eSgpLmlzRUxJZ25vcmVkKCk7CisJfQorCWlmIChzY3JpcHRpbmdJbnZhbGlkTWF0Y2ggIT0gbnVsbCkgeworCSAgICBpc1NjcmlwdGluZ0ludmFsaWQgPQorCQlzY3JpcHRpbmdJbnZhbGlkTWF0Y2guZ2V0SnNwUHJvcGVydHkoKS5pc1NjcmlwdGluZ0ludmFsaWQoKTsKKwl9CisJaWYgKHBhZ2VFbmNvZGluZ01hdGNoICE9IG51bGwpIHsKKwkgICAgcGFnZUVuY29kaW5nID0gcGFnZUVuY29kaW5nTWF0Y2guZ2V0SnNwUHJvcGVydHkoKS5nZXRQYWdlRW5jb2RpbmcoKTsKKwl9CisKKwlyZXR1cm4gbmV3IEpzcFByb3BlcnR5KGlzWG1sLCBpc0VMSWdub3JlZCwgaXNTY3JpcHRpbmdJbnZhbGlkLAorCQkJICAgICAgIHBhZ2VFbmNvZGluZywgaW5jbHVkZVByZWx1ZGVzLCBpbmNsdWRlQ29kYXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRvIGZpbmQgb3V0IGlmIGFuIHVyaSBtYXRjaGVzIGFuIHVybCBwYXR0ZXJuIGluIGpzcCBjb25maWcuICBJZiBzbywKKyAgICAgKiB0aGVuIHRoZSB1cmkgaXMgYSBKU1AgcGFnZS4gIFRoaXMgaXMgdXNlZCBwcmltYXJpbHkgZm9yIGpzcGMuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNKc3BQYWdlKFN0cmluZyB1cmkpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCisgICAgICAgIGluaXQoKTsKKyAgICAgICAgaWYgKGpzcFByb3BlcnRpZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIHVyaVBhdGggPSBudWxsOworICAgICAgICBpbnQgaW5kZXggPSB1cmkubGFzdEluZGV4T2YoJy8nKTsKKyAgICAgICAgaWYgKGluZGV4ID49MCApIHsKKyAgICAgICAgICAgIHVyaVBhdGggPSB1cmkuc3Vic3RyaW5nKDAsIGluZGV4KzEpOworICAgICAgICB9CisgICAgICAgIFN0cmluZyB1cmlFeHRlbnNpb24gPSBudWxsOworICAgICAgICBpbmRleCA9IHVyaS5sYXN0SW5kZXhPZignLicpOworICAgICAgICBpZiAoaW5kZXggPj0wKSB7CisgICAgICAgICAgICB1cmlFeHRlbnNpb24gPSB1cmkuc3Vic3RyaW5nKGluZGV4KzEpOworICAgICAgICB9CisKKyAgICAgICAgSXRlcmF0b3IgaXRlciA9IGpzcFByb3BlcnRpZXMuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisKKyAgICAgICAgICAgIEpzcFByb3BlcnR5R3JvdXAganBnID0gKEpzcFByb3BlcnR5R3JvdXApIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgSnNwUHJvcGVydHkganAgPSBqcGcuZ2V0SnNwUHJvcGVydHkoKTsKKworICAgICAgICAgICAgU3RyaW5nIGV4dGVuc2lvbiA9IGpwZy5nZXRFeHRlbnNpb24oKTsKKyAgICAgICAgICAgIFN0cmluZyBwYXRoID0ganBnLmdldFBhdGgoKTsKKworICAgICAgICAgICAgaWYgKGV4dGVuc2lvbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKHVyaS5lcXVhbHMocGF0aCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlcmUgaXMgYW4gZXhhY3QgbWF0Y2gKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoKHBhdGggPT0gbnVsbCB8fCBwYXRoLmVxdWFscyh1cmlQYXRoKSkgJiYKKyAgICAgICAgICAgICAgICAgICAgKGV4dGVuc2lvbi5lcXVhbHMoIioiKSB8fCBleHRlbnNpb24uZXF1YWxzKHVyaUV4dGVuc2lvbikpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIE1hdGNoZXMgKiwgKi5leHQsIC9wLyosIG9yIC9wLyouZXh0CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIEpzcFByb3BlcnR5R3JvdXAgeworCXByaXZhdGUgU3RyaW5nIHBhdGg7CisJcHJpdmF0ZSBTdHJpbmcgZXh0ZW5zaW9uOworCXByaXZhdGUgSnNwUHJvcGVydHkganNwUHJvcGVydHk7CisKKwlKc3BQcm9wZXJ0eUdyb3VwKFN0cmluZyBwYXRoLCBTdHJpbmcgZXh0ZW5zaW9uLAorCQkJIEpzcFByb3BlcnR5IGpzcFByb3BlcnR5KSB7CisJICAgIHRoaXMucGF0aCA9IHBhdGg7CisJICAgIHRoaXMuZXh0ZW5zaW9uID0gZXh0ZW5zaW9uOworCSAgICB0aGlzLmpzcFByb3BlcnR5ID0ganNwUHJvcGVydHk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRQYXRoKCkgeworCSAgICByZXR1cm4gcGF0aDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldEV4dGVuc2lvbigpIHsKKwkgICAgcmV0dXJuIGV4dGVuc2lvbjsKKwl9CisKKwlwdWJsaWMgSnNwUHJvcGVydHkgZ2V0SnNwUHJvcGVydHkoKSB7CisJICAgIHJldHVybiBqc3BQcm9wZXJ0eTsKKwl9CisgICAgfQorCisgICAgc3RhdGljIHB1YmxpYyBjbGFzcyBKc3BQcm9wZXJ0eSB7CisKKwlwcml2YXRlIFN0cmluZyBpc1htbDsKKwlwcml2YXRlIFN0cmluZyBlbElnbm9yZWQ7CisJcHJpdmF0ZSBTdHJpbmcgc2NyaXB0aW5nSW52YWxpZDsKKwlwcml2YXRlIFN0cmluZyBwYWdlRW5jb2Rpbmc7CisJcHJpdmF0ZSBWZWN0b3IgaW5jbHVkZVByZWx1ZGU7CisJcHJpdmF0ZSBWZWN0b3IgaW5jbHVkZUNvZGE7CisKKwlwdWJsaWMgSnNwUHJvcGVydHkoU3RyaW5nIGlzWG1sLCBTdHJpbmcgZWxJZ25vcmVkLAorCQkgICAgU3RyaW5nIHNjcmlwdGluZ0ludmFsaWQsIFN0cmluZyBwYWdlRW5jb2RpbmcsCisJCSAgICBWZWN0b3IgaW5jbHVkZVByZWx1ZGUsIFZlY3RvciBpbmNsdWRlQ29kYSkgeworCisJICAgIHRoaXMuaXNYbWwgPSBpc1htbDsKKwkgICAgdGhpcy5lbElnbm9yZWQgPSBlbElnbm9yZWQ7CisJICAgIHRoaXMuc2NyaXB0aW5nSW52YWxpZCA9IHNjcmlwdGluZ0ludmFsaWQ7CisJICAgIHRoaXMucGFnZUVuY29kaW5nID0gcGFnZUVuY29kaW5nOworCSAgICB0aGlzLmluY2x1ZGVQcmVsdWRlID0gaW5jbHVkZVByZWx1ZGU7CisJICAgIHRoaXMuaW5jbHVkZUNvZGEgPSBpbmNsdWRlQ29kYTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGlzWG1sKCkgeworCSAgICByZXR1cm4gaXNYbWw7CisJfQorCisJcHVibGljIFN0cmluZyBpc0VMSWdub3JlZCgpIHsKKwkgICAgcmV0dXJuIGVsSWdub3JlZDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGlzU2NyaXB0aW5nSW52YWxpZCgpIHsKKwkgICAgcmV0dXJuIHNjcmlwdGluZ0ludmFsaWQ7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRQYWdlRW5jb2RpbmcoKSB7CisJICAgIHJldHVybiBwYWdlRW5jb2Rpbmc7CisJfQorCisJcHVibGljIFZlY3RvciBnZXRJbmNsdWRlUHJlbHVkZSgpIHsKKwkgICAgcmV0dXJuIGluY2x1ZGVQcmVsdWRlOworCX0KKworCXB1YmxpYyBWZWN0b3IgZ2V0SW5jbHVkZUNvZGEoKSB7CisJICAgIHJldHVybiBpbmNsdWRlQ29kYTsKKwl9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL2NvbXBpbGVyL0pzcERvY3VtZW50UGFyc2VyLmphdmEgYi9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvSnNwRG9jdW1lbnRQYXJzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWJmZDAwCi0tLSAvZGV2L251bGwKKysrIGIvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL2NvbXBpbGVyL0pzcERvY3VtZW50UGFyc2VyLmphdmEKQEAgLTAsMCArMSwxNDE0IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuamFzcGVyLmNvbXBpbGVyOworCitpbXBvcnQgamF2YS5pby5DaGFyQXJyYXlXcml0ZXI7CitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRmlsZTsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWdGaWxlSW5mbzsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnSW5mbzsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnTGlicmFyeUluZm87CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5KYXNwZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIuSnNwQ29tcGlsYXRpb25Db250ZXh0OworaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7CitpbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7CitpbXBvcnQgb3JnLnhtbC5zYXguTG9jYXRvcjsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb247CitpbXBvcnQgb3JnLnhtbC5zYXguWE1MUmVhZGVyOworaW1wb3J0IG9yZy54bWwuc2F4LmV4dC5MZXhpY2FsSGFuZGxlcjsKK2ltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkF0dHJpYnV0ZXNJbXBsOworaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXI7CisKKy8qKgorICogQ2xhc3MgaW1wbGVtZW50aW5nIGEgcGFyc2VyIGZvciBhIEpTUCBkb2N1bWVudCwgdGhhdCBpcywgYSBKU1AgcGFnZSBpbiBYTUwKKyAqIHN5bnRheC4KKyAqCisgKiBAYXV0aG9yIEphbiBMdWVoZQorICogQGF1dGhvciBLaW4tbWFuIENodW5nCisgKi8KKworY2xhc3MgSnNwRG9jdW1lbnRQYXJzZXIKKyAgICBleHRlbmRzIERlZmF1bHRIYW5kbGVyCisgICAgaW1wbGVtZW50cyBMZXhpY2FsSGFuZGxlciwgVGFnQ29uc3RhbnRzIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfVkVSU0lPTiA9ICJ2ZXJzaW9uIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEVYSUNBTF9IQU5ETEVSX1BST1BFUlRZID0KKyAgICAgICAgImh0dHA6Ly94bWwub3JnL3NheC9wcm9wZXJ0aWVzL2xleGljYWwtaGFuZGxlciI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9VUkkgPSAiaHR0cDovL2phdmEuc3VuLmNvbS9KU1AvUGFnZSI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBFbmFibGVEVERWYWxpZGF0aW9uRXhjZXB0aW9uIEVOQUJMRV9EVERfVkFMSURBVElPTl9FWENFUFRJT04gPQorICAgICAgICBuZXcgRW5hYmxlRFREVmFsaWRhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICJqc3AuZXJyb3IuZW5hYmxlX2R0ZF92YWxpZGF0aW9uIiwKKyAgICAgICAgICAgIG51bGwpOworCisgICAgcHJpdmF0ZSBQYXJzZXJDb250cm9sbGVyIHBhcnNlckNvbnRyb2xsZXI7CisgICAgcHJpdmF0ZSBKc3BDb21waWxhdGlvbkNvbnRleHQgY3R4dDsKKyAgICBwcml2YXRlIFBhZ2VJbmZvIHBhZ2VJbmZvOworICAgIHByaXZhdGUgU3RyaW5nIHBhdGg7CisgICAgcHJpdmF0ZSBTdHJpbmdCdWZmZXIgY2hhckJ1ZmZlcjsKKworICAgIC8vIE5vZGUgcmVwcmVzZW50aW5nIHRoZSBYTUwgZWxlbWVudCBjdXJyZW50bHkgYmVpbmcgcGFyc2VkCisgICAgcHJpdmF0ZSBOb2RlIGN1cnJlbnQ7CisKKyAgICAvKgorICAgICAqIE91dGVybW9zdCAoaW4gdGhlIG5lc3RpbmcgaGllcmFyY2h5KSBub2RlIHdob3NlIGJvZHkgaXMgZGVjbGFyZWQgdG8gYmUKKyAgICAgKiBzY3JpcHRsZXNzLiBJZiBhIG5vZGUncyBib2R5IGlzIGRlY2xhcmVkIHRvIGJlIHNjcmlwdGxlc3MsIGFsbCBpdHMKKyAgICAgKiBuZXN0ZWQgbm9kZXMgbXVzdCBiZSBzY3JpcHRsZXNzLCB0b28uCisgICAgICovIAorICAgIHByaXZhdGUgTm9kZSBzY3JpcHRsZXNzQm9keU5vZGU7CisKKyAgICBwcml2YXRlIExvY2F0b3IgbG9jYXRvcjsKKworICAgIC8vTWFyayByZXByZXNlbnRpbmcgdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IGVsZW1lbnQuICBOb3RlCisgICAgLy90aGF0IGxvY2F0b3IuZ2V0TGluZU51bWJlcigpIGFuZCBsb2NhdG9yLmdldENvbHVtbk51bWJlcigpCisgICAgLy9yZXR1cm4gdGhlIGxpbmUgYW5kIGNvbHVtbiBudW1iZXJzIGZvciB0aGUgY2hhcmFjdGVyCisgICAgLy9pbW1lZGlhdGVseSBfZm9sbG93aW5nXyB0aGUgY3VycmVudCBlbGVtZW50LiAgVGhlIHVuZGVybHlpbmcKKyAgICAvL1hNbCBwYXJzZXIgZWF0cyB3aGl0ZSBzcGFjZSB0aGF0IGlzIG5vdCBwYXJ0IG9mIGNoYXJhY3RlcgorICAgIC8vZGF0YSwgc28gZm9yIE5vZGVzIHRoYXQgYXJlIG5vdCBjcmVhdGVkIGZyb20gY2hhcmFjdGVyIGRhdGEsCisgICAgLy90aGlzIGlzIHRoZSBiZXN0IHdlIGNhbiBkby4gIEJ1dCB3aGVuIHdlIHBhcnNlIGNoYXJhY3RlciBkYXRhLAorICAgIC8vd2UgZ2V0IGFuIGFjY3VyYXRlIHN0YXJ0aW5nIGxvY2F0aW9uIGJ5IHN0YXJ0aW5nIHdpdGggc3RhcnRNYXJrCisgICAgLy9hcyBzZXQgYnkgdGhlIHByZXZpb3VzIGVsZW1lbnQsIGFuZCB1cGRhdGluZyBpdCBhcyB3ZSBhZHZhbmNlCisgICAgLy90aHJvdWdoIHRoZSBjaGFyYWN0ZXJzLgorICAgIHByaXZhdGUgTWFyayBzdGFydE1hcms7CisKKyAgICAvLyBGbGFnIGluZGljYXRpbmcgd2hldGhlciB3ZSBhcmUgaW5zaWRlIERURCBkZWNsYXJhdGlvbnMKKyAgICBwcml2YXRlIGJvb2xlYW4gaW5EVEQ7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNWYWxpZGF0aW5nOworCisgICAgcHJpdmF0ZSBFcnJvckRpc3BhdGNoZXIgZXJyOworICAgIHByaXZhdGUgYm9vbGVhbiBpc1RhZ0ZpbGU7CisgICAgcHJpdmF0ZSBib29sZWFuIGRpcmVjdGl2ZXNPbmx5OworICAgIHByaXZhdGUgYm9vbGVhbiBpc1RvcDsKKworICAgIC8vIE5lc3RpbmcgbGV2ZWwgb2YgVGFnIGRlcGVuZGVudCBib2RpZXMKKyAgICBwcml2YXRlIGludCB0YWdEZXBlbmRlbnROZXN0aW5nID0gMDsKKyAgICAvLyBGbGFnIHNldCB0byBkZWxheSBpbmNybWVudGluZyB0YWdEZXBlbmRlbnROZXN0aW5nIHVudGlsIGpzcDpib2R5CisgICAgLy8gaXMgZmlyc3QgZW5jb3VudGVyZWQKKyAgICBwcml2YXRlIGJvb2xlYW4gdGFnRGVwZW5kZW50UGVuZGluZyA9IGZhbHNlOworCisgICAgLyoKKyAgICAgKiBDb25zdHJ1Y3RvcgorICAgICAqLworICAgIHB1YmxpYyBKc3BEb2N1bWVudFBhcnNlcigKKyAgICAgICAgUGFyc2VyQ29udHJvbGxlciBwYywKKyAgICAgICAgU3RyaW5nIHBhdGgsCisgICAgICAgIGJvb2xlYW4gaXNUYWdGaWxlLAorICAgICAgICBib29sZWFuIGRpcmVjdGl2ZXNPbmx5KSB7CisgICAgICAgIHRoaXMucGFyc2VyQ29udHJvbGxlciA9IHBjOworICAgICAgICB0aGlzLmN0eHQgPSBwYy5nZXRKc3BDb21waWxhdGlvbkNvbnRleHQoKTsKKyAgICAgICAgdGhpcy5wYWdlSW5mbyA9IHBjLmdldENvbXBpbGVyKCkuZ2V0UGFnZUluZm8oKTsKKyAgICAgICAgdGhpcy5lcnIgPSBwYy5nZXRDb21waWxlcigpLmdldEVycm9yRGlzcGF0Y2hlcigpOworICAgICAgICB0aGlzLnBhdGggPSBwYXRoOworICAgICAgICB0aGlzLmlzVGFnRmlsZSA9IGlzVGFnRmlsZTsKKyAgICAgICAgdGhpcy5kaXJlY3RpdmVzT25seSA9IGRpcmVjdGl2ZXNPbmx5OworICAgICAgICB0aGlzLmlzVG9wID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFBhcnNlcyBhIEpTUCBkb2N1bWVudCBieSByZXNwb25kaW5nIHRvIFNBWCBldmVudHMuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEphc3BlckV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTm9kZS5Ob2RlcyBwYXJzZSgKKyAgICAgICAgUGFyc2VyQ29udHJvbGxlciBwYywKKyAgICAgICAgU3RyaW5nIHBhdGgsCisgICAgICAgIEphckZpbGUgamFyRmlsZSwKKyAgICAgICAgTm9kZSBwYXJlbnQsCisgICAgICAgIGJvb2xlYW4gaXNUYWdGaWxlLAorICAgICAgICBib29sZWFuIGRpcmVjdGl2ZXNPbmx5LAorICAgICAgICBTdHJpbmcgcGFnZUVuYywKKyAgICAgICAgU3RyaW5nIGpzcENvbmZpZ1BhZ2VFbmMsCisgICAgICAgIGJvb2xlYW4gaXNFbmNvZGluZ1NwZWNpZmllZEluUHJvbG9nKQorICAgICAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKworICAgICAgICBKc3BEb2N1bWVudFBhcnNlciBqc3BEb2NQYXJzZXIgPQorICAgICAgICAgICAgbmV3IEpzcERvY3VtZW50UGFyc2VyKHBjLCBwYXRoLCBpc1RhZ0ZpbGUsIGRpcmVjdGl2ZXNPbmx5KTsKKyAgICAgICAgTm9kZS5Ob2RlcyBwYWdlTm9kZXMgPSBudWxsOworCisgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgIC8vIENyZWF0ZSBkdW1teSByb290IGFuZCBpbml0aWFsaXplIGl0IHdpdGggZ2l2ZW4gcGFnZSBlbmNvZGluZ3MKKyAgICAgICAgICAgIE5vZGUuUm9vdCBkdW1teVJvb3QgPSBuZXcgTm9kZS5Sb290KG51bGwsIHBhcmVudCwgdHJ1ZSk7CisgICAgICAgICAgICBkdW1teVJvb3Quc2V0UGFnZUVuY29kaW5nKHBhZ2VFbmMpOworICAgICAgICAgICAgZHVtbXlSb290LnNldEpzcENvbmZpZ1BhZ2VFbmNvZGluZyhqc3BDb25maWdQYWdlRW5jKTsKKyAgICAgICAgICAgIGR1bW15Um9vdC5zZXRJc0VuY29kaW5nU3BlY2lmaWVkSW5Qcm9sb2coCisgICAgICAgICAgICAgICAgaXNFbmNvZGluZ1NwZWNpZmllZEluUHJvbG9nKTsKKyAgICAgICAgICAgIGpzcERvY1BhcnNlci5jdXJyZW50ID0gZHVtbXlSb290OworICAgICAgICAgICAgaWYgKHBhcmVudCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAganNwRG9jUGFyc2VyLmFkZEluY2x1ZGUoCisgICAgICAgICAgICAgICAgICAgIGR1bW15Um9vdCwKKyAgICAgICAgICAgICAgICAgICAganNwRG9jUGFyc2VyLnBhZ2VJbmZvLmdldEluY2x1ZGVQcmVsdWRlKCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBqc3BEb2NQYXJzZXIuaXNUb3AgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gUGFyc2UgdGhlIGlucHV0CisgICAgICAgICAgICBTQVhQYXJzZXIgc2F4UGFyc2VyID0gZ2V0U0FYUGFyc2VyKGZhbHNlLCBqc3BEb2NQYXJzZXIpOworICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW5TdHJlYW0gPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpblN0cmVhbSA9IEpzcFV0aWwuZ2V0SW5wdXRTdHJlYW0ocGF0aCwgamFyRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganNwRG9jUGFyc2VyLmN0eHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzcERvY1BhcnNlci5lcnIpOworICAgICAgICAgICAgICAgIHNheFBhcnNlci5wYXJzZShuZXcgSW5wdXRTb3VyY2UoaW5TdHJlYW0pLCBqc3BEb2NQYXJzZXIpOworICAgICAgICAgICAgfSBjYXRjaCAoRW5hYmxlRFREVmFsaWRhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgc2F4UGFyc2VyID0gZ2V0U0FYUGFyc2VyKHRydWUsIGpzcERvY1BhcnNlcik7CisgICAgICAgICAgICAgICAganNwRG9jUGFyc2VyLmlzVmFsaWRhdGluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgaWYgKGluU3RyZWFtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluU3RyZWFtLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBhbnkpIHsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpblN0cmVhbSA9IEpzcFV0aWwuZ2V0SW5wdXRTdHJlYW0ocGF0aCwgamFyRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganNwRG9jUGFyc2VyLmN0eHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzcERvY1BhcnNlci5lcnIpOworICAgICAgICAgICAgICAgIHNheFBhcnNlci5wYXJzZShuZXcgSW5wdXRTb3VyY2UoaW5TdHJlYW0pLCBqc3BEb2NQYXJzZXIpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBpZiAoaW5TdHJlYW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5TdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGFueSkgeworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocGFyZW50ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBqc3BEb2NQYXJzZXIuYWRkSW5jbHVkZSgKKyAgICAgICAgICAgICAgICAgICAgZHVtbXlSb290LAorICAgICAgICAgICAgICAgICAgICBqc3BEb2NQYXJzZXIucGFnZUluZm8uZ2V0SW5jbHVkZUNvZGEoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIENyZWF0ZSBOb2RlLk5vZGVzIGZyb20gZHVtbXkgcm9vdAorICAgICAgICAgICAgcGFnZU5vZGVzID0gbmV3IE5vZGUuTm9kZXMoZHVtbXlSb290KTsKKworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgIGpzcERvY1BhcnNlci5lcnIuanNwRXJyb3IoImpzcC5lcnJvci5kYXRhLmZpbGUucmVhZCIsIHBhdGgsIGlvZSk7CisgICAgICAgIH0gY2F0Y2ggKFNBWFBhcnNlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGpzcERvY1BhcnNlci5lcnIuanNwRXJyb3IKKyAgICAgICAgICAgICAgICAobmV3IE1hcmsoanNwRG9jUGFyc2VyLmN0eHQsIHBhdGgsIGUuZ2V0TGluZU51bWJlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBlLmdldENvbHVtbk51bWJlcigpKSwKKyAgICAgICAgICAgICAgICAgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAganNwRG9jUGFyc2VyLmVyci5qc3BFcnJvcihlKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBwYWdlTm9kZXM7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBQcm9jZXNzZXMgdGhlIGdpdmVuIGxpc3Qgb2YgaW5jbHVkZWQgZmlsZXMuCisgICAgICoKKyAgICAgKiBUaGlzIGlzIHVzZWQgdG8gaW1wbGVtZW50IHRoZSBpbmNsdWRlLXByZWx1ZGUgYW5kIGluY2x1ZGUtY29kYQorICAgICAqIHN1YmVsZW1lbnRzIG9mIHRoZSBqc3AtY29uZmlnIGVsZW1lbnQgaW4gd2ViLnhtbAorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBhZGRJbmNsdWRlKE5vZGUgcGFyZW50LCBMaXN0IGZpbGVzKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGZpbGVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBmaWxlcy5pdGVyYXRvcigpOworICAgICAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGZpbGUgPSAoU3RyaW5nKWl0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXNJbXBsIGF0dHJzID0gbmV3IEF0dHJpYnV0ZXNJbXBsKCk7CisgICAgICAgICAgICAgICAgYXR0cnMuYWRkQXR0cmlidXRlKCIiLCAiZmlsZSIsICJmaWxlIiwgIkNEQVRBIiwgZmlsZSk7CisKKyAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBkdW1teSBJbmNsdWRlIGRpcmVjdGl2ZSBub2RlCisgICAgICAgICAgICAgICAgICAgIE5vZGUgaW5jbHVkZURpciA9CisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTm9kZS5JbmNsdWRlRGlyZWN0aXZlKGF0dHJzLCBudWxsLCAvLyBYWFgKKyAgICBwYXJlbnQpOworICAgICAgICAgICAgICAgIHByb2Nlc3NJbmNsdWRlRGlyZWN0aXZlKGZpbGUsIGluY2x1ZGVEaXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBSZWNlaXZlcyBub3RpZmljYXRpb24gb2YgdGhlIHN0YXJ0IG9mIGFuIGVsZW1lbnQuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBhc3NpZ25zIHRoZSBnaXZlbiB0YWcgYXR0cmlidXRlcyB0byBvbmUgb2YgMyBidWNrZXRzOgorICAgICAqIAorICAgICAqIC0gInhtbG5zIiBhdHRyaWJ1dGVzIHRoYXQgcmVwcmVzZW50IChzdGFuZGFyZCBvciBjdXN0b20pIHRhZyBsaWJyYXJpZXMuCisgICAgICogLSAieG1sbnMiIGF0dHJpYnV0ZXMgdGhhdCBkbyBub3QgcmVwcmVzZW50IHRhZyBsaWJyYXJpZXMuCisgICAgICogLSBhbGwgcmVtYWluaW5nIGF0dHJpYnV0ZXMuCisgICAgICoKKyAgICAgKiBGb3IgZWFjaCAieG1sbnMiIGF0dHJpYnV0ZSB0aGF0IHJlcHJlc2VudHMgYSBjdXN0b20gdGFnIGxpYnJhcnksIHRoZQorICAgICAqIGNvcnJlc3BvbmRpbmcgVGFnTGlicmFyeUluZm8gb2JqZWN0IGlzIGFkZGVkIHRvIHRoZSBzZXQgb2YgY3VzdG9tCisgICAgICogdGFnIGxpYnJhcmllcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoCisgICAgICAgIFN0cmluZyB1cmksCisgICAgICAgIFN0cmluZyBsb2NhbE5hbWUsCisgICAgICAgIFN0cmluZyBxTmFtZSwKKyAgICAgICAgQXR0cmlidXRlcyBhdHRycykKKyAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisKKyAgICAgICAgQXR0cmlidXRlc0ltcGwgdGFnbGliQXR0cnMgPSBudWxsOworICAgICAgICBBdHRyaWJ1dGVzSW1wbCBub25UYWdsaWJBdHRycyA9IG51bGw7CisgICAgICAgIEF0dHJpYnV0ZXNJbXBsIG5vblRhZ2xpYlhtbG5zQXR0cnMgPSBudWxsOworCisgICAgICAgIHByb2Nlc3NDaGFycygpOworCisgICAgICAgIGNoZWNrUHJlZml4ZXModXJpLCBxTmFtZSwgYXR0cnMpOworCisgICAgICAgIGlmIChkaXJlY3RpdmVzT25seSAmJgorICAgICAgICAgICAgIShKU1BfVVJJLmVxdWFscyh1cmkpICYmIGxvY2FsTmFtZS5zdGFydHNXaXRoKERJUkVDVElWRV9BQ1RJT04pKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8ganNwOnRleHQgbXVzdCBub3QgaGF2ZSBhbnkgc3ViZWxlbWVudHMKKyAgICAgICAgaWYgKEpTUF9VUkkuZXF1YWxzKHVyaSkgJiYgVEVYVF9BQ1RJT04uZXF1YWxzKGN1cnJlbnQuZ2V0TG9jYWxOYW1lKCkpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgU0FYUGFyc2VFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgTG9jYWxpemVyLmdldE1lc3NhZ2UoImpzcC5lcnJvci50ZXh0Lmhhc19zdWJlbGVtZW50IiksCisgICAgICAgICAgICAgICAgbG9jYXRvcik7CisgICAgICAgIH0KKworICAgICAgICBzdGFydE1hcmsgPSBuZXcgTWFyayhjdHh0LCBwYXRoLCBsb2NhdG9yLmdldExpbmVOdW1iZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRvci5nZXRDb2x1bW5OdW1iZXIoKSk7CisKKyAgICAgICAgaWYgKGF0dHJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBOb3RpY2UgdGhhdCBkdWUgdG8gYSBidWcgaW4gdGhlIHVuZGVybHlpbmcgU0FYIHBhcnNlciwgdGhlCisgICAgICAgICAgICAgKiBhdHRyaWJ1dGVzIG11c3QgYmUgZW51bWVyYXRlZCBpbiBkZXNjZW5kaW5nIG9yZGVyLiAKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgYm9vbGVhbiBpc1RhZ2xpYiA9IGZhbHNlOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IGF0dHJzLmdldExlbmd0aCgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgICAgICBpc1RhZ2xpYiA9IGZhbHNlOworICAgICAgICAgICAgICAgIFN0cmluZyBhdHRyUU5hbWUgPSBhdHRycy5nZXRRTmFtZShpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWF0dHJRTmFtZS5zdGFydHNXaXRoKCJ4bWxucyIpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChub25UYWdsaWJBdHRycyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBub25UYWdsaWJBdHRycyA9IG5ldyBBdHRyaWJ1dGVzSW1wbCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG5vblRhZ2xpYkF0dHJzLmFkZEF0dHJpYnV0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzLmdldFVSSShpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzLmdldExvY2FsTmFtZShpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzLmdldFFOYW1lKGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnMuZ2V0VHlwZShpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzLmdldFZhbHVlKGkpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoYXR0clFOYW1lLnN0YXJ0c1dpdGgoInhtbG5zOmpzcCIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpc1RhZ2xpYiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYXR0clVyaSA9IGF0dHJzLmdldFZhbHVlKGkpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGFnbGliSW5mbyBmb3IgdGhpcyB1cmkgYWxyZWFkeSBlc3RhYmxpc2hlZCBpbgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RhcnRQcmVmaXhNYXBwaW5nCisgICAgICAgICAgICAgICAgICAgICAgICBpc1RhZ2xpYiA9IHBhZ2VJbmZvLmhhc1RhZ2xpYihhdHRyVXJpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoaXNUYWdsaWIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YWdsaWJBdHRycyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnbGliQXR0cnMgPSBuZXcgQXR0cmlidXRlc0ltcGwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHRhZ2xpYkF0dHJzLmFkZEF0dHJpYnV0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRycy5nZXRVUkkoaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnMuZ2V0TG9jYWxOYW1lKGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzLmdldFFOYW1lKGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzLmdldFR5cGUoaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnMuZ2V0VmFsdWUoaSkpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vblRhZ2xpYlhtbG5zQXR0cnMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vblRhZ2xpYlhtbG5zQXR0cnMgPSBuZXcgQXR0cmlidXRlc0ltcGwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5vblRhZ2xpYlhtbG5zQXR0cnMuYWRkQXR0cmlidXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzLmdldFVSSShpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRycy5nZXRMb2NhbE5hbWUoaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnMuZ2V0UU5hbWUoaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnMuZ2V0VHlwZShpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRycy5nZXRWYWx1ZShpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBOb2RlIG5vZGUgPSBudWxsOworCisgICAgICAgIGlmICh0YWdEZXBlbmRlbnRQZW5kaW5nICYmIEpTUF9VUkkuZXF1YWxzKHVyaSkgJiYKKyAgICAgICAgICAgICAgICAgICAgIGxvY2FsTmFtZS5lcXVhbHMoQk9EWV9BQ1RJT04pKSB7CisgICAgICAgICAgICB0YWdEZXBlbmRlbnRQZW5kaW5nID0gZmFsc2U7CisgICAgICAgICAgICB0YWdEZXBlbmRlbnROZXN0aW5nKys7CisgICAgICAgICAgICBjdXJyZW50ID0KKyAgICAgICAgICAgICAgICBwYXJzZVN0YW5kYXJkQWN0aW9uKAorICAgICAgICAgICAgICAgICAgICBxTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgbG9jYWxOYW1lLAorICAgICAgICAgICAgICAgICAgICBub25UYWdsaWJBdHRycywKKyAgICAgICAgICAgICAgICAgICAgbm9uVGFnbGliWG1sbnNBdHRycywKKyAgICAgICAgICAgICAgICAgICAgdGFnbGliQXR0cnMsCisgICAgICAgICAgICAgICAgICAgIHN0YXJ0TWFyaywKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAodGFnRGVwZW5kZW50UGVuZGluZyAmJiBKU1BfVVJJLmVxdWFscyh1cmkpICYmCisgICAgICAgICAgICAgICAgICAgICBsb2NhbE5hbWUuZXF1YWxzKEFUVFJJQlVURV9BQ1RJT04pKSB7CisgICAgICAgICAgICBjdXJyZW50ID0KKyAgICAgICAgICAgICAgICBwYXJzZVN0YW5kYXJkQWN0aW9uKAorICAgICAgICAgICAgICAgICAgICBxTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgbG9jYWxOYW1lLAorICAgICAgICAgICAgICAgICAgICBub25UYWdsaWJBdHRycywKKyAgICAgICAgICAgICAgICAgICAgbm9uVGFnbGliWG1sbnNBdHRycywKKyAgICAgICAgICAgICAgICAgICAgdGFnbGliQXR0cnMsCisgICAgICAgICAgICAgICAgICAgIHN0YXJ0TWFyaywKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAodGFnRGVwZW5kZW50UGVuZGluZykgeworICAgICAgICAgICAgdGFnRGVwZW5kZW50UGVuZGluZyA9IGZhbHNlOworICAgICAgICAgICAgdGFnRGVwZW5kZW50TmVzdGluZysrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRhZ0RlcGVuZGVudE5lc3RpbmcgPiAwKSB7CisgICAgICAgICAgICBub2RlID0KKyAgICAgICAgICAgICAgICBuZXcgTm9kZS5VbmludGVycHJldGVkVGFnKAorICAgICAgICAgICAgICAgICAgICBxTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgbG9jYWxOYW1lLAorICAgICAgICAgICAgICAgICAgICBub25UYWdsaWJBdHRycywKKyAgICAgICAgICAgICAgICAgICAgbm9uVGFnbGliWG1sbnNBdHRycywKKyAgICAgICAgICAgICAgICAgICAgdGFnbGliQXR0cnMsCisgICAgICAgICAgICAgICAgICAgIHN0YXJ0TWFyaywKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudCk7CisgICAgICAgIH0gZWxzZSBpZiAoSlNQX1VSSS5lcXVhbHModXJpKSkgeworICAgICAgICAgICAgbm9kZSA9CisgICAgICAgICAgICAgICAgcGFyc2VTdGFuZGFyZEFjdGlvbigKKyAgICAgICAgICAgICAgICAgICAgcU5hbWUsCisgICAgICAgICAgICAgICAgICAgIGxvY2FsTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgbm9uVGFnbGliQXR0cnMsCisgICAgICAgICAgICAgICAgICAgIG5vblRhZ2xpYlhtbG5zQXR0cnMsCisgICAgICAgICAgICAgICAgICAgIHRhZ2xpYkF0dHJzLAorICAgICAgICAgICAgICAgICAgICBzdGFydE1hcmssCisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbm9kZSA9CisgICAgICAgICAgICAgICAgcGFyc2VDdXN0b21BY3Rpb24oCisgICAgICAgICAgICAgICAgICAgIHFOYW1lLAorICAgICAgICAgICAgICAgICAgICBsb2NhbE5hbWUsCisgICAgICAgICAgICAgICAgICAgIHVyaSwKKyAgICAgICAgICAgICAgICAgICAgbm9uVGFnbGliQXR0cnMsCisgICAgICAgICAgICAgICAgICAgIG5vblRhZ2xpYlhtbG5zQXR0cnMsCisgICAgICAgICAgICAgICAgICAgIHRhZ2xpYkF0dHJzLAorICAgICAgICAgICAgICAgICAgICBzdGFydE1hcmssCisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQpOworICAgICAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG5vZGUgPQorICAgICAgICAgICAgICAgICAgICBuZXcgTm9kZS5VbmludGVycHJldGVkVGFnKAorICAgICAgICAgICAgICAgICAgICAgICAgcU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBub25UYWdsaWJBdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vblRhZ2xpYlhtbG5zQXR0cnMsCisgICAgICAgICAgICAgICAgICAgICAgICB0YWdsaWJBdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0TWFyaywKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBjdXN0b20gYWN0aW9uCisgICAgICAgICAgICAgICAgU3RyaW5nIGJvZHlUeXBlID0gZ2V0Qm9keVR5cGUoKE5vZGUuQ3VzdG9tVGFnKSBub2RlKTsKKworICAgICAgICAgICAgICAgIGlmIChzY3JpcHRsZXNzQm9keU5vZGUgPT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgYm9keVR5cGUuZXF1YWxzSWdub3JlQ2FzZShUYWdJbmZvLkJPRFlfQ09OVEVOVF9TQ1JJUFRMRVNTKSkgeworICAgICAgICAgICAgICAgICAgICBzY3JpcHRsZXNzQm9keU5vZGUgPSBub2RlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChUYWdJbmZvLkJPRFlfQ09OVEVOVF9UQUdfREVQRU5ERU5ULmVxdWFsc0lnbm9yZUNhc2UoYm9keVR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgIHRhZ0RlcGVuZGVudFBlbmRpbmcgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGN1cnJlbnQgPSBub2RlOworICAgIH0KKworICAgIC8qCisgICAgICogUmVjZWl2ZXMgbm90aWZpY2F0aW9uIG9mIGNoYXJhY3RlciBkYXRhIGluc2lkZSBhbiBlbGVtZW50LgorICAgICAqCisgICAgICogVGhlIFNBWCBkb2VzIG5vdCBjYWxsIHRoaXMgbWV0aG9kIHdpdGggYWxsIG9mIHRoZSB0ZW1wbGF0ZSB0ZXh0LCBidXQgbWF5CisgICAgICogaW52b2tlIHRoaXMgbWV0aG9kIHdpdGggY2h1bmtzIG9mIGl0LiAgVGhpcyBpcyBhIHByb2JsZW0gd2hlbiB3ZSB0cnkKKyAgICAgKiB0byBkZXRlcm1pbmUgaWYgdGhlIHRleHQgY29udGFpbnMgb25seSB3aGl0ZXNwYWNlcywgb3Igd2hlbiB3ZSBhcmUKKyAgICAgKiBsb29raW5nIGZvciBhbiBFTCBleHByZXNzaW9uIHN0cmluZy4gIFRoZXJlZm9yZSBpdCBpcyBuZWNlc3NhcnkgdG8KKyAgICAgKiBidWZmZXIgYW5kIGNvbmNhdGVuYXRlIHRoZSBjaHVua3MgYW5kIHByb2Nlc3MgdGhlIGNvbmNhdGVuYXRlZCB0ZXh0IAorICAgICAqIGxhdGVyIChhdCBiZWdpblRhZyBhbmQgZW5kVGFnKQorICAgICAqCisgICAgICogQHBhcmFtIGJ1ZiBUaGUgY2hhcmFjdGVycworICAgICAqIEBwYXJhbSBvZmZzZXQgVGhlIHN0YXJ0IHBvc2l0aW9uIGluIHRoZSBjaGFyYWN0ZXIgYXJyYXkKKyAgICAgKiBAcGFyYW0gbGVuIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byB1c2UgZnJvbSB0aGUgY2hhcmFjdGVyIGFycmF5CisgICAgICoKKyAgICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNoYXJhY3RlcnMoY2hhcltdIGJ1ZiwgaW50IG9mZnNldCwgaW50IGxlbikgeworCisgICAgICAgIGlmIChjaGFyQnVmZmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIGNoYXJCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIH0KKyAgICAgICAgY2hhckJ1ZmZlci5hcHBlbmQoYnVmLCBvZmZzZXQsIGxlbik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NDaGFycygpIHRocm93cyBTQVhFeGNlcHRpb24geworCisgICAgICAgIGlmIChjaGFyQnVmZmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIEpTUC42LjEuMTogQWxsIHRleHR1YWwgbm9kZXMgdGhhdCBoYXZlIG9ubHkgd2hpdGUgc3BhY2UgYXJlIHRvIGJlCisgICAgICAgICAqIGRyb3BwZWQgZnJvbSB0aGUgZG9jdW1lbnQsIGV4Y2VwdCBmb3Igbm9kZXMgaW4gYSBqc3A6dGV4dCBlbGVtZW50LAorICAgICAgICAgKiBhbmQgYW55IGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlLXNwYWNlLW9ubHkgdGV4dHVhbCBub2RlcyBpbiBhCisgICAgICAgICAqIGpzcDphdHRyaWJ1dGUgd2hvc2UgJ3RyaW0nIGF0dHJpYnV0ZSBpcyBzZXQgdG8gRkFMU0UsIHdoaWNoIGFyZSB0bworICAgICAgICAgKiBiZSBrZXB0IHZlcmJhdGltLgorICAgICAgICAgKiBKU1AuNi4yLjMgZGVmaW5lcyB3aGl0ZSBzcGFjZSBjaGFyYWN0ZXJzLgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbGVhbiBpc0FsbFNwYWNlID0gdHJ1ZTsKKyAgICAgICAgaWYgKCEoY3VycmVudCBpbnN0YW5jZW9mIE5vZGUuSnNwVGV4dCkKKyAgICAgICAgICAgICYmICEoY3VycmVudCBpbnN0YW5jZW9mIE5vZGUuTmFtZWRBdHRyaWJ1dGUpKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoYXJCdWZmZXIubGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgICAgIGlmICghKGNoYXJCdWZmZXIuY2hhckF0KGkpID09ICcgJworICAgICAgICAgICAgICAgICAgICB8fCBjaGFyQnVmZmVyLmNoYXJBdChpKSA9PSAnXG4nCisgICAgICAgICAgICAgICAgICAgIHx8IGNoYXJCdWZmZXIuY2hhckF0KGkpID09ICdccicKKyAgICAgICAgICAgICAgICAgICAgfHwgY2hhckJ1ZmZlci5jaGFyQXQoaSkgPT0gJ1x0JykpIHsKKyAgICAgICAgICAgICAgICAgICAgaXNBbGxTcGFjZSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWlzQWxsU3BhY2UgJiYgdGFnRGVwZW5kZW50UGVuZGluZykgeworICAgICAgICAgICAgdGFnRGVwZW5kZW50UGVuZGluZyA9IGZhbHNlOworICAgICAgICAgICAgdGFnRGVwZW5kZW50TmVzdGluZysrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRhZ0RlcGVuZGVudE5lc3RpbmcgPiAwKSB7CisgICAgICAgICAgICBpZiAoY2hhckJ1ZmZlci5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBuZXcgTm9kZS5UZW1wbGF0ZVRleHQoY2hhckJ1ZmZlci50b1N0cmluZygpLCBzdGFydE1hcmssIGN1cnJlbnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhcnRNYXJrID0gbmV3IE1hcmsoY3R4dCwgcGF0aCwgbG9jYXRvci5nZXRMaW5lTnVtYmVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdG9yLmdldENvbHVtbk51bWJlcigpKTsKKyAgICAgICAgICAgIGNoYXJCdWZmZXIgPSBudWxsOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChjdXJyZW50IGluc3RhbmNlb2YgTm9kZS5Kc3BUZXh0KQorICAgICAgICAgICAgfHwgKGN1cnJlbnQgaW5zdGFuY2VvZiBOb2RlLk5hbWVkQXR0cmlidXRlKQorICAgICAgICAgICAgfHwgIWlzQWxsU3BhY2UpIHsKKworICAgICAgICAgICAgaW50IGxpbmUgPSBzdGFydE1hcmsuZ2V0TGluZU51bWJlcigpOworICAgICAgICAgICAgaW50IGNvbHVtbiA9IHN0YXJ0TWFyay5nZXRDb2x1bW5OdW1iZXIoKTsKKworICAgICAgICAgICAgQ2hhckFycmF5V3JpdGVyIHR0ZXh0ID0gbmV3IENoYXJBcnJheVdyaXRlcigpOworICAgICAgICAgICAgaW50IGxhc3RDaCA9IDA7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoYXJCdWZmZXIubGVuZ3RoKCk7IGkrKykgeworCisgICAgICAgICAgICAgICAgaW50IGNoID0gY2hhckJ1ZmZlci5jaGFyQXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGNoID09ICdcbicpIHsKKyAgICAgICAgICAgICAgICAgICAgY29sdW1uID0gMTsKKyAgICAgICAgICAgICAgICAgICAgbGluZSsrOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNvbHVtbisrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobGFzdENoID09ICckJyAmJiBjaCA9PSAneycpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHR0ZXh0LnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb2RlLlRlbXBsYXRlVGV4dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dGV4dC50b1N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0TWFyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHR0ZXh0ID0gbmV3IENoYXJBcnJheVdyaXRlcigpOworICAgICAgICAgICAgICAgICAgICAgICAgLy9XZSBzdWJ0cmFjdCB0d28gZnJvbSB0aGUgY29sdW1uIG51bWJlciB0bworICAgICAgICAgICAgICAgICAgICAgICAgLy9hY2NvdW50IGZvciB0aGUgJyR7JyB0aGF0IHdlJ3ZlIGFscmVhZHkgcGFyc2VkCisgICAgICAgICAgICAgICAgICAgICAgICBzdGFydE1hcmsgPSBuZXcgTWFyayhjdHh0LCBwYXRoLCBsaW5lLCBjb2x1bW4gLSAyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBmb2xsb3dpbmcgIiR7IiB0byBmaXJzdCB1bnF1b3RlZCAifSIKKyAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNpbmdsZVEgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBkb3VibGVRID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGxhc3RDaCA9IDA7CisgICAgICAgICAgICAgICAgICAgIGZvciAoOzsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA+PSBjaGFyQnVmZmVyLmxlbmd0aCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNBWFBhcnNlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJqc3AuZXJyb3IudW50ZXJtaW5hdGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIkeyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdG9yKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSBjaGFyQnVmZmVyLmNoYXJBdChpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnXG4nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lKys7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbisrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RDaCA9PSAnXFwnICYmIChzaW5nbGVRIHx8IGRvdWJsZVEpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHRleHQud3JpdGUoY2gpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RDaCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJ30nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5vZGUuRUxFeHByZXNzaW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dGV4dC50b1N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydE1hcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR0ZXh0ID0gbmV3IENoYXJBcnJheVdyaXRlcigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0TWFyayA9IG5ldyBNYXJrKGN0eHQsIHBhdGgsIGxpbmUsIGNvbHVtbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJyInKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZVEgPSAhZG91YmxlUTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNoID09ICdcJycpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luZ2xlUSA9ICFzaW5nbGVROworCisgICAgICAgICAgICAgICAgICAgICAgICB0dGV4dC53cml0ZShjaCk7CisgICAgICAgICAgICAgICAgICAgICAgICBsYXN0Q2ggPSBjaDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGFzdENoID09ICdcXCcgJiYgY2ggPT0gJyQnKSB7CisgICAgICAgICAgICAgICAgICAgIHR0ZXh0LndyaXRlKCckJyk7CisgICAgICAgICAgICAgICAgICAgIGNoID0gMDsgIC8vIE5vdCBzdGFydCBvZiBFTCBhbnltb3JlCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RDaCA9PSAnJCcgfHwgbGFzdENoID09ICdcXCcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHR0ZXh0LndyaXRlKGxhc3RDaCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoICE9ICckJyAmJiBjaCAhPSAnXFwnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0dGV4dC53cml0ZShjaCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbGFzdENoID0gY2g7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobGFzdENoID09ICckJyB8fCBsYXN0Q2ggPT0gJ1xcJykgeworICAgICAgICAgICAgICAgIHR0ZXh0LndyaXRlKGxhc3RDaCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodHRleHQuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgIG5ldyBOb2RlLlRlbXBsYXRlVGV4dCh0dGV4dC50b1N0cmluZygpLCBzdGFydE1hcmssIGN1cnJlbnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN0YXJ0TWFyayA9IG5ldyBNYXJrKGN0eHQsIHBhdGgsIGxvY2F0b3IuZ2V0TGluZU51bWJlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdG9yLmdldENvbHVtbk51bWJlcigpKTsKKworICAgICAgICBjaGFyQnVmZmVyID0gbnVsbDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFJlY2VpdmVzIG5vdGlmaWNhdGlvbiBvZiB0aGUgZW5kIG9mIGFuIGVsZW1lbnQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZW5kRWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUpCisgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24geworCisgICAgICAgIHByb2Nlc3NDaGFycygpOworCisgICAgICAgIGlmIChkaXJlY3RpdmVzT25seSAmJgorICAgICAgICAgICAgIShKU1BfVVJJLmVxdWFscyh1cmkpICYmIGxvY2FsTmFtZS5zdGFydHNXaXRoKERJUkVDVElWRV9BQ1RJT04pKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGN1cnJlbnQgaW5zdGFuY2VvZiBOb2RlLk5hbWVkQXR0cmlidXRlKSB7CisgICAgICAgICAgICBib29sZWFuIGlzVHJpbSA9ICgoTm9kZS5OYW1lZEF0dHJpYnV0ZSljdXJyZW50KS5pc1RyaW0oKTsKKyAgICAgICAgICAgIE5vZGUuTm9kZXMgc3ViRWxlbXMgPSAoKE5vZGUuTmFtZWRBdHRyaWJ1dGUpY3VycmVudCkuZ2V0Qm9keSgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IHN1YkVsZW1zICE9IG51bGwgJiYgaSA8IHN1YkVsZW1zLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgTm9kZSBzdWJFbGVtID0gc3ViRWxlbXMuZ2V0Tm9kZShpKTsKKyAgICAgICAgICAgICAgICBpZiAoIShzdWJFbGVtIGluc3RhbmNlb2YgTm9kZS5UZW1wbGF0ZVRleHQpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBJZ25vcmUgYW55IHdoaXRlc3BhY2UgKGluY2x1ZGluZyBzcGFjZXMsIGNhcnJpYWdlIHJldHVybnMsCisgICAgICAgICAgICAgICAgLy8gbGluZSBmZWVkcywgYW5kIHRhYnMsIHRoYXQgYXBwZWFyIGF0IHRoZSBiZWdpbm5pbmcgYW5kIGF0CisgICAgICAgICAgICAgICAgLy8gdGhlIGVuZCBvZiB0aGUgYm9keSBvZiB0aGUgPGpzcDphdHRyaWJ1dGU+IGFjdGlvbiwgaWYgdGhlCisgICAgICAgICAgICAgICAgLy8gYWN0aW9uJ3MgJ3RyaW0nIGF0dHJpYnV0ZSBpcyBzZXQgdG8gVFJVRSAoZGVmYXVsdCkuCisgICAgICAgICAgICAgICAgLy8gSW4gYWRkaXRpb24sIGFueSB0ZXh0dWFsIG5vZGVzIGluIHRoZSA8anNwOmF0dHJpYnV0ZT4gdGhhdAorICAgICAgICAgICAgICAgIC8vIGhhdmUgb25seSB3aGl0ZSBzcGFjZSBhcmUgZHJvcHBlZCBmcm9tIHRoZSBkb2N1bWVudCwgd2l0aAorICAgICAgICAgICAgICAgIC8vIHRoZSBleGNlcHRpb24gb2YgbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGUtc3BhY2Utb25seQorICAgICAgICAgICAgICAgIC8vIHRleHR1YWwgbm9kZXMgaW4gYSA8anNwOmF0dHJpYnV0ZT4gd2hvc2UgJ3RyaW0nIGF0dHJpYnV0ZQorICAgICAgICAgICAgICAgIC8vIGlzIHNldCB0byBGQUxTRSwgd2hpY2ggbXVzdCBiZSBrZXB0IHZlcmJhdGltLgorICAgICAgICAgICAgICAgIGlmIChpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzVHJpbSkgeworICAgICAgICAgICAgICAgICAgICAgICAgKChOb2RlLlRlbXBsYXRlVGV4dClzdWJFbGVtKS5sdHJpbSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpID09IHN1YkVsZW1zLnNpemUoKSAtIDEpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzVHJpbSkgeworICAgICAgICAgICAgICAgICAgICAgICAgKChOb2RlLlRlbXBsYXRlVGV4dClzdWJFbGVtKS5ydHJpbSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCgoTm9kZS5UZW1wbGF0ZVRleHQpc3ViRWxlbSkuaXNBbGxTcGFjZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdWJFbGVtcy5yZW1vdmUoc3ViRWxlbSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudCBpbnN0YW5jZW9mIE5vZGUuU2NyaXB0aW5nRWxlbWVudCkgeworICAgICAgICAgICAgY2hlY2tTY3JpcHRpbmdCb2R5KChOb2RlLlNjcmlwdGluZ0VsZW1lbnQpY3VycmVudCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIGlzVGFnRGVwZW5kZW50KGN1cnJlbnQpKSB7CisgICAgICAgICAgICB0YWdEZXBlbmRlbnROZXN0aW5nLS07CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2NyaXB0bGVzc0JvZHlOb2RlICE9IG51bGwKKyAgICAgICAgICAgICAgICAmJiBjdXJyZW50LmVxdWFscyhzY3JpcHRsZXNzQm9keU5vZGUpKSB7CisgICAgICAgICAgICBzY3JpcHRsZXNzQm9keU5vZGUgPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGN1cnJlbnQuZ2V0UGFyZW50KCkgIT0gbnVsbCkgeworICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQuZ2V0UGFyZW50KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIFJlY2VpdmVzIHRoZSBkb2N1bWVudCBsb2NhdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIGxvY2F0b3IgdGhlIGRvY3VtZW50IGxvY2F0b3IKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREb2N1bWVudExvY2F0b3IoTG9jYXRvciBsb2NhdG9yKSB7CisgICAgICAgIHRoaXMubG9jYXRvciA9IGxvY2F0b3I7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBTZWUgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNvbW1lbnQoY2hhcltdIGJ1ZiwgaW50IG9mZnNldCwgaW50IGxlbikgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisKKyAgICAgICAgcHJvY2Vzc0NoYXJzKCk7ICAvLyBGbHVzaCBjaGFyIGJ1ZmZlciBhbmQgcmVtb3ZlIHdoaXRlIHNwYWNlcworCisgICAgICAgIC8vIGlnbm9yZSBjb21tZW50cyBpbiB0aGUgRFRECisgICAgICAgIGlmICghaW5EVEQpIHsKKyAgICAgICAgICAgIHN0YXJ0TWFyayA9CisgICAgICAgICAgICAgICAgbmV3IE1hcmsoCisgICAgICAgICAgICAgICAgICAgIGN0eHQsCisgICAgICAgICAgICAgICAgICAgIHBhdGgsCisgICAgICAgICAgICAgICAgICAgIGxvY2F0b3IuZ2V0TGluZU51bWJlcigpLAorICAgICAgICAgICAgICAgICAgICBsb2NhdG9yLmdldENvbHVtbk51bWJlcigpKTsKKyAgICAgICAgICAgIG5ldyBOb2RlLkNvbW1lbnQobmV3IFN0cmluZyhidWYsIG9mZnNldCwgbGVuKSwgc3RhcnRNYXJrLCBjdXJyZW50KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogU2VlIG9yZy54bWwuc2F4LmV4dC5MZXhpY2FsSGFuZGxlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydENEQVRBKCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisKKyAgICAgICAgcHJvY2Vzc0NoYXJzKCk7ICAvLyBGbHVzaCBjaGFyIGJ1ZmZlciBhbmQgcmVtb3ZlIHdoaXRlIHNwYWNlcworICAgICAgICBzdGFydE1hcmsgPSBuZXcgTWFyayhjdHh0LCBwYXRoLCBsb2NhdG9yLmdldExpbmVOdW1iZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRvci5nZXRDb2x1bW5OdW1iZXIoKSk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBTZWUgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGVuZENEQVRBKCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIHByb2Nlc3NDaGFycygpOyAgLy8gRmx1c2ggY2hhciBidWZmZXIgYW5kIHJlbW92ZSB3aGl0ZSBzcGFjZXMKKyAgICB9CisKKyAgICAvKgorICAgICAqIFNlZSBvcmcueG1sLnNheC5leHQuTGV4aWNhbEhhbmRsZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnRFbnRpdHkoU3RyaW5nIG5hbWUpIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICAvLyBkbyBub3RoaW5nCisgICAgfQorCisgICAgLyoKKyAgICAgKiBTZWUgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGVuZEVudGl0eShTdHJpbmcgbmFtZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIGRvIG5vdGhpbmcKKyAgICB9CisKKyAgICAvKgorICAgICAqIFNlZSBvcmcueG1sLnNheC5leHQuTGV4aWNhbEhhbmRsZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnREVEQoU3RyaW5nIG5hbWUsIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKQorICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFpc1ZhbGlkYXRpbmcpIHsKKyAgICAgICAgICAgIGZhdGFsRXJyb3IoRU5BQkxFX0RURF9WQUxJREFUSU9OX0VYQ0VQVElPTik7CisgICAgICAgIH0KKworICAgICAgICBpbkRURCA9IHRydWU7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBTZWUgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGVuZERURCgpIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBpbkRURCA9IGZhbHNlOworICAgIH0KKworICAgIC8qCisgICAgICogUmVjZWl2ZXMgbm90aWZpY2F0aW9uIG9mIGEgbm9uLXJlY292ZXJhYmxlIGVycm9yLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGZhdGFsRXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IGU7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBSZWNlaXZlcyBub3RpZmljYXRpb24gb2YgYSByZWNvdmVyYWJsZSBlcnJvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBlcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBlKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgZTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFJlY2VpdmVzIG5vdGlmaWNhdGlvbiBvZiB0aGUgc3RhcnQgb2YgYSBOYW1lc3BhY2UgbWFwcGluZy4gCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnRQcmVmaXhNYXBwaW5nKFN0cmluZyBwcmVmaXgsIFN0cmluZyB1cmkpCisgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBUYWdMaWJyYXJ5SW5mbyB0YWdsaWJJbmZvOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdGFnbGliSW5mbyA9IGdldFRhZ2xpYkluZm8ocHJlZml4LCB1cmkpOworICAgICAgICB9IGNhdGNoIChKYXNwZXJFeGNlcHRpb24gamUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTQVhQYXJzZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICBMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgianNwLmVycm9yLmNvdWxkLm5vdC5hZGQudGFnbGlicmFyaWVzIiksCisgICAgICAgICAgICAgICAgbG9jYXRvciwKKyAgICAgICAgICAgICAgICBqZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAodGFnbGliSW5mbyAhPSBudWxsKSB7CisgICAgICAgICAgICBwYWdlSW5mby5hZGRUYWdsaWIodXJpLCB0YWdsaWJJbmZvKTsKKyAgICAgICAgICAgIHBhZ2VJbmZvLnB1c2hQcmVmaXhNYXBwaW5nKHByZWZpeCwgdXJpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBhZ2VJbmZvLnB1c2hQcmVmaXhNYXBwaW5nKHByZWZpeCwgbnVsbCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIFJlY2VpdmVzIG5vdGlmaWNhdGlvbiBvZiB0aGUgZW5kIG9mIGEgTmFtZXNwYWNlIG1hcHBpbmcuIAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGVuZFByZWZpeE1hcHBpbmcoU3RyaW5nIHByZWZpeCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIHBhZ2VJbmZvLnBvcFByZWZpeE1hcHBpbmcocHJlZml4KTsKKyAgICB9CisKKyAgICAvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIC8vIFByaXZhdGUgdXRpbGl0eSBtZXRob2RzCisKKyAgICBwcml2YXRlIE5vZGUgcGFyc2VTdGFuZGFyZEFjdGlvbigKKyAgICAgICAgU3RyaW5nIHFOYW1lLAorICAgICAgICBTdHJpbmcgbG9jYWxOYW1lLAorICAgICAgICBBdHRyaWJ1dGVzIG5vblRhZ2xpYkF0dHJzLAorICAgICAgICBBdHRyaWJ1dGVzIG5vblRhZ2xpYlhtbG5zQXR0cnMsCisgICAgICAgIEF0dHJpYnV0ZXMgdGFnbGliQXR0cnMsCisgICAgICAgIE1hcmsgc3RhcnQsCisgICAgICAgIE5vZGUgcGFyZW50KQorICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKworICAgICAgICBOb2RlIG5vZGUgPSBudWxsOworCisgICAgICAgIGlmIChsb2NhbE5hbWUuZXF1YWxzKFJPT1RfQUNUSU9OKSkgeworICAgICAgICAgICAgaWYgKCEoY3VycmVudCBpbnN0YW5jZW9mIE5vZGUuUm9vdCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU0FYUGFyc2VFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgIExvY2FsaXplci5nZXRNZXNzYWdlKCJqc3AuZXJyb3IubmVzdGVkX2pzcHJvb3QiKSwKKyAgICAgICAgICAgICAgICAgICAgbG9jYXRvcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBub2RlID0KKyAgICAgICAgICAgICAgICBuZXcgTm9kZS5Kc3BSb290KAorICAgICAgICAgICAgICAgICAgICBxTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgbm9uVGFnbGliQXR0cnMsCisgICAgICAgICAgICAgICAgICAgIG5vblRhZ2xpYlhtbG5zQXR0cnMsCisgICAgICAgICAgICAgICAgICAgIHRhZ2xpYkF0dHJzLAorICAgICAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudCk7CisgICAgICAgICAgICBpZiAoaXNUb3ApIHsKKyAgICAgICAgICAgICAgICBwYWdlSW5mby5zZXRIYXNKc3BSb290KHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGxvY2FsTmFtZS5lcXVhbHMoUEFHRV9ESVJFQ1RJVkVfQUNUSU9OKSkgeworICAgICAgICAgICAgaWYgKGlzVGFnRmlsZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBTQVhQYXJzZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgTG9jYWxpemVyLmdldE1lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAianNwLmVycm9yLmFjdGlvbi5pc3RhZ2ZpbGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxOYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgbG9jYXRvcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBub2RlID0KKyAgICAgICAgICAgICAgICBuZXcgTm9kZS5QYWdlRGlyZWN0aXZlKAorICAgICAgICAgICAgICAgICAgICBxTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgbm9uVGFnbGliQXR0cnMsCisgICAgICAgICAgICAgICAgICAgIG5vblRhZ2xpYlhtbG5zQXR0cnMsCisgICAgICAgICAgICAgICAgICAgIHRhZ2xpYkF0dHJzLAorICAgICAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudCk7CisgICAgICAgICAgICBTdHJpbmcgaW1wb3J0cyA9IG5vblRhZ2xpYkF0dHJzLmdldFZhbHVlKCJpbXBvcnQiKTsKKyAgICAgICAgICAgIC8vIFRoZXJlIGNhbiBvbmx5IGJlIG9uZSAnaW1wb3J0JyBhdHRyaWJ1dGUgcGVyIHBhZ2UgZGlyZWN0aXZlCisgICAgICAgICAgICBpZiAoaW1wb3J0cyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgKChOb2RlLlBhZ2VEaXJlY3RpdmUpbm9kZSkuYWRkSW1wb3J0KGltcG9ydHMpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGxvY2FsTmFtZS5lcXVhbHMoSU5DTFVERV9ESVJFQ1RJVkVfQUNUSU9OKSkgeworICAgICAgICAgICAgbm9kZSA9CisgICAgICAgICAgICAgICAgbmV3IE5vZGUuSW5jbHVkZURpcmVjdGl2ZSgKKyAgICAgICAgICAgICAgICAgICAgcU5hbWUsCisgICAgICAgICAgICAgICAgICAgIG5vblRhZ2xpYkF0dHJzLAorICAgICAgICAgICAgICAgICAgICBub25UYWdsaWJYbWxuc0F0dHJzLAorICAgICAgICAgICAgICAgICAgICB0YWdsaWJBdHRycywKKyAgICAgICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQpOworICAgICAgICAgICAgcHJvY2Vzc0luY2x1ZGVEaXJlY3RpdmUobm9uVGFnbGliQXR0cnMuZ2V0VmFsdWUoImZpbGUiKSwgbm9kZSk7CisgICAgICAgIH0gZWxzZSBpZiAobG9jYWxOYW1lLmVxdWFscyhERUNMQVJBVElPTl9BQ1RJT04pKSB7CisgICAgICAgICAgICBpZiAoc2NyaXB0bGVzc0JvZHlOb2RlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBXZSdyZSBuZXN0ZWQgaW5zaWRlIGEgbm9kZSB3aG9zZSBib2R5IGlzCisgICAgICAgICAgICAgICAgLy8gZGVjbGFyZWQgdG8gYmUgc2NyaXB0bGVzcworICAgICAgICAgICAgICAgIHRocm93IG5ldyBTQVhQYXJzZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgTG9jYWxpemVyLmdldE1lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAianNwLmVycm9yLm5vLnNjcmlwdGxldHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxOYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgbG9jYXRvcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBub2RlID0KKyAgICAgICAgICAgICAgICBuZXcgTm9kZS5EZWNsYXJhdGlvbigKKyAgICAgICAgICAgICAgICAgICAgcU5hbWUsCisgICAgICAgICAgICAgICAgICAgIG5vblRhZ2xpYlhtbG5zQXR0cnMsCisgICAgICAgICAgICAgICAgICAgIHRhZ2xpYkF0dHJzLAorICAgICAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudCk7CisgICAgICAgIH0gZWxzZSBpZiAobG9jYWxOYW1lLmVxdWFscyhTQ1JJUFRMRVRfQUNUSU9OKSkgeworICAgICAgICAgICAgaWYgKHNjcmlwdGxlc3NCb2R5Tm9kZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gV2UncmUgbmVzdGVkIGluc2lkZSBhIG5vZGUgd2hvc2UgYm9keSBpcworICAgICAgICAgICAgICAgIC8vIGRlY2xhcmVkIHRvIGJlIHNjcmlwdGxlc3MKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU0FYUGFyc2VFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgIExvY2FsaXplci5nZXRNZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICAgICAgImpzcC5lcnJvci5uby5zY3JpcHRsZXRzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsTmFtZSksCisgICAgICAgICAgICAgICAgICAgIGxvY2F0b3IpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbm9kZSA9CisgICAgICAgICAgICAgICAgbmV3IE5vZGUuU2NyaXB0bGV0KAorICAgICAgICAgICAgICAgICAgICBxTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgbm9uVGFnbGliWG1sbnNBdHRycywKKyAgICAgICAgICAgICAgICAgICAgdGFnbGliQXR0cnMsCisgICAgICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICBjdXJyZW50KTsKKyAgICAgICAgfSBlbHNlIGlmIChsb2NhbE5hbWUuZXF1YWxzKEVYUFJFU1NJT05fQUNUSU9OKSkgeworICAgICAgICAgICAgaWYgKHNjcmlwdGxlc3NCb2R5Tm9kZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gV2UncmUgbmVzdGVkIGluc2lkZSBhIG5vZGUgd2hvc2UgYm9keSBpcworICAgICAgICAgICAgICAgIC8vIGRlY2xhcmVkIHRvIGJlIHNjcmlwdGxlc3MKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU0FYUGFyc2VFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgIExvY2FsaXplci5nZXRNZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICAgICAgImpzcC5lcnJvci5uby5zY3JpcHRsZXRzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsTmFtZSksCisgICAgICAgICAgICAgICAgICAgIGxvY2F0b3IpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbm9kZSA9CisgICAgICAgICAgICAgICAgbmV3IE5vZGUuRXhwcmVzc2lvbigKKyAgICAgICAgICAgICAgICAgICAgcU5hbWUsCisgICAgICAgICAgICAgICAgICAgIG5vblRhZ2xpYlhtbG5zQXR0cnMsCisgICAgICAgICAgICAgICAgICAgIHRhZ2xpYkF0dHJzLAorICAgICAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudCk7CisgICAgICAgIH0gZWxzZSBpZiAobG9jYWxOYW1lLmVxdWFscyhVU0VfQkVBTl9BQ1RJT04pKSB7CisgICAgICAgICAgICBub2RlID0KKyAgICAgICAgICAgICAgICBuZXcgTm9kZS5Vc2VCZWFuKAorICAgICAgICAgICAgICAgICAgICBxTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgbm9uVGFnbGliQXR0cnMsCisgICAgICAgICAgICAgICAgICAgIG5vblRhZ2xpYlhtbG5zQXR0cnMsCisgICAgICAgICAgICAgICAgICAgIHRhZ2xpYkF0dHJzLAorICAgICAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudCk7CisgICAgICAgIH0gZWxzZSBpZiAobG9jYWxOYW1lLmVxdWFscyhTRVRfUFJPUEVSVFlfQUNUSU9OKSkgeworICAgICAgICAgICAgbm9kZSA9CisgICAgICAgICAgICAgICAgbmV3IE5vZGUuU2V0UHJvcGVydHkoCisgICAgICAgICAgICAgICAgICAgIHFOYW1lLAorICAgICAgICAgICAgICAgICAgICBub25UYWdsaWJBdHRycywKKyAgICAgICAgICAgICAgICAgICAgbm9uVGFnbGliWG1sbnNBdHRycywKKyAgICAgICAgICAgICAgICAgICAgdGFnbGliQXR0cnMsCisgICAgICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICBjdXJyZW50KTsKKyAgICAgICAgfSBlbHNlIGlmIChsb2NhbE5hbWUuZXF1YWxzKEdFVF9QUk9QRVJUWV9BQ1RJT04pKSB7CisgICAgICAgICAgICBub2RlID0KKyAgICAgICAgICAgICAgICBuZXcgTm9kZS5HZXRQcm9wZXJ0eSgKKyAgICAgICAgICAgICAgICAgICAgcU5hbWUsCisgICAgICAgICAgICAgICAgICAgIG5vblRhZ2xpYkF0dHJzLAorICAgICAgICAgICAgICAgICAgICBub25UYWdsaWJYbWxuc0F0dHJzLAorICAgICAgICAgICAgICAgICAgICB0YWdsaWJBdHRycywKKyAgICAgICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQpOworICAgICAgICB9IGVsc2UgaWYgKGxvY2FsTmFtZS5lcXVhbHMoSU5DTFVERV9BQ1RJT04pKSB7CisgICAgICAgICAgICBub2RlID0KKyAgICAgICAgICAgICAgICBuZXcgTm9kZS5JbmNsdWRlQWN0aW9uKAorICAgICAgICAgICAgICAgICAgICBxTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgbm9uVGFnbGliQXR0cnMsCisgICAgICAgICAgICAgICAgICAgIG5vblRhZ2xpYlhtbG5zQXR0cnMsCisgICAgICAgICAgICAgICAgICAgIHRhZ2xpYkF0dHJzLAorICAgICAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudCk7CisgICAgICAgIH0gZWxzZSBpZiAobG9jYWxOYW1lLmVxdWFscyhGT1JXQVJEX0FDVElPTikpIHsKKyAgICAgICAgICAgIG5vZGUgPQorICAgICAgICAgICAgICAgIG5ldyBOb2RlLkZvcndhcmRBY3Rpb24oCisgICAgICAgICAgICAgICAgICAgIHFOYW1lLAorICAgICAgICAgICAgICAgICAgICBub25UYWdsaWJBdHRycywKKyAgICAgICAgICAgICAgICAgICAgbm9uVGFnbGliWG1sbnNBdHRycywKKyAgICAgICAgICAgICAgICAgICAgdGFnbGliQXR0cnMsCisgICAgICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICBjdXJyZW50KTsKKyAgICAgICAgfSBlbHNlIGlmIChsb2NhbE5hbWUuZXF1YWxzKFBBUkFNX0FDVElPTikpIHsKKyAgICAgICAgICAgIG5vZGUgPQorICAgICAgICAgICAgICAgIG5ldyBOb2RlLlBhcmFtQWN0aW9uKAorICAgICAgICAgICAgICAgICAgICBxTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgbm9uVGFnbGliQXR0cnMsCisgICAgICAgICAgICAgICAgICAgIG5vblRhZ2xpYlhtbG5zQXR0cnMsCisgICAgICAgICAgICAgICAgICAgIHRhZ2xpYkF0dHJzLAorICAgICAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudCk7CisgICAgICAgIH0gZWxzZSBpZiAobG9jYWxOYW1lLmVxdWFscyhQQVJBTVNfQUNUSU9OKSkgeworICAgICAgICAgICAgbm9kZSA9CisgICAgICAgICAgICAgICAgbmV3IE5vZGUuUGFyYW1zQWN0aW9uKAorICAgICAgICAgICAgICAgICAgICBxTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgbm9uVGFnbGliWG1sbnNBdHRycywKKyAgICAgICAgICAgICAgICAgICAgdGFnbGliQXR0cnMsCisgICAgICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICBjdXJyZW50KTsKKyAgICAgICAgfSBlbHNlIGlmIChsb2NhbE5hbWUuZXF1YWxzKFBMVUdJTl9BQ1RJT04pKSB7CisgICAgICAgICAgICBub2RlID0KKyAgICAgICAgICAgICAgICBuZXcgTm9kZS5QbHVnSW4oCisgICAgICAgICAgICAgICAgICAgIHFOYW1lLAorICAgICAgICAgICAgICAgICAgICBub25UYWdsaWJBdHRycywKKyAgICAgICAgICAgICAgICAgICAgbm9uVGFnbGliWG1sbnNBdHRycywKKyAgICAgICAgICAgICAgICAgICAgdGFnbGliQXR0cnMsCisgICAgICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICBjdXJyZW50KTsKKyAgICAgICAgfSBlbHNlIGlmIChsb2NhbE5hbWUuZXF1YWxzKFRFWFRfQUNUSU9OKSkgeworICAgICAgICAgICAgbm9kZSA9CisgICAgICAgICAgICAgICAgbmV3IE5vZGUuSnNwVGV4dCgKKyAgICAgICAgICAgICAgICAgICAgcU5hbWUsCisgICAgICAgICAgICAgICAgICAgIG5vblRhZ2xpYlhtbG5zQXR0cnMsCisgICAgICAgICAgICAgICAgICAgIHRhZ2xpYkF0dHJzLAorICAgICAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudCk7CisgICAgICAgIH0gZWxzZSBpZiAobG9jYWxOYW1lLmVxdWFscyhCT0RZX0FDVElPTikpIHsKKyAgICAgICAgICAgIG5vZGUgPQorICAgICAgICAgICAgICAgIG5ldyBOb2RlLkpzcEJvZHkoCisgICAgICAgICAgICAgICAgICAgIHFOYW1lLAorICAgICAgICAgICAgICAgICAgICBub25UYWdsaWJYbWxuc0F0dHJzLAorICAgICAgICAgICAgICAgICAgICB0YWdsaWJBdHRycywKKyAgICAgICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQpOworICAgICAgICB9IGVsc2UgaWYgKGxvY2FsTmFtZS5lcXVhbHMoQVRUUklCVVRFX0FDVElPTikpIHsKKyAgICAgICAgICAgIG5vZGUgPQorICAgICAgICAgICAgICAgIG5ldyBOb2RlLk5hbWVkQXR0cmlidXRlKAorICAgICAgICAgICAgICAgICAgICBxTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgbm9uVGFnbGliQXR0cnMsCisgICAgICAgICAgICAgICAgICAgIG5vblRhZ2xpYlhtbG5zQXR0cnMsCisgICAgICAgICAgICAgICAgICAgIHRhZ2xpYkF0dHJzLAorICAgICAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudCk7CisgICAgICAgIH0gZWxzZSBpZiAobG9jYWxOYW1lLmVxdWFscyhPVVRQVVRfQUNUSU9OKSkgeworICAgICAgICAgICAgbm9kZSA9CisgICAgICAgICAgICAgICAgbmV3IE5vZGUuSnNwT3V0cHV0KAorICAgICAgICAgICAgICAgICAgICBxTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgbm9uVGFnbGliQXR0cnMsCisgICAgICAgICAgICAgICAgICAgIG5vblRhZ2xpYlhtbG5zQXR0cnMsCisgICAgICAgICAgICAgICAgICAgIHRhZ2xpYkF0dHJzLAorICAgICAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudCk7CisgICAgICAgIH0gZWxzZSBpZiAobG9jYWxOYW1lLmVxdWFscyhUQUdfRElSRUNUSVZFX0FDVElPTikpIHsKKyAgICAgICAgICAgIGlmICghaXNUYWdGaWxlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNBWFBhcnNlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICBMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICJqc3AuZXJyb3IuYWN0aW9uLmlzbm90dGFnZmlsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbE5hbWUpLAorICAgICAgICAgICAgICAgICAgICBsb2NhdG9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5vZGUgPQorICAgICAgICAgICAgICAgIG5ldyBOb2RlLlRhZ0RpcmVjdGl2ZSgKKyAgICAgICAgICAgICAgICAgICAgcU5hbWUsCisgICAgICAgICAgICAgICAgICAgIG5vblRhZ2xpYkF0dHJzLAorICAgICAgICAgICAgICAgICAgICBub25UYWdsaWJYbWxuc0F0dHJzLAorICAgICAgICAgICAgICAgICAgICB0YWdsaWJBdHRycywKKyAgICAgICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQpOworICAgICAgICAgICAgU3RyaW5nIGltcG9ydHMgPSBub25UYWdsaWJBdHRycy5nZXRWYWx1ZSgiaW1wb3J0Iik7CisgICAgICAgICAgICAvLyBUaGVyZSBjYW4gb25seSBiZSBvbmUgJ2ltcG9ydCcgYXR0cmlidXRlIHBlciB0YWcgZGlyZWN0aXZlCisgICAgICAgICAgICBpZiAoaW1wb3J0cyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgKChOb2RlLlRhZ0RpcmVjdGl2ZSlub2RlKS5hZGRJbXBvcnQoaW1wb3J0cyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAobG9jYWxOYW1lLmVxdWFscyhBVFRSSUJVVEVfRElSRUNUSVZFX0FDVElPTikpIHsKKyAgICAgICAgICAgIGlmICghaXNUYWdGaWxlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNBWFBhcnNlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICBMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICJqc3AuZXJyb3IuYWN0aW9uLmlzbm90dGFnZmlsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbE5hbWUpLAorICAgICAgICAgICAgICAgICAgICBsb2NhdG9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5vZGUgPQorICAgICAgICAgICAgICAgIG5ldyBOb2RlLkF0dHJpYnV0ZURpcmVjdGl2ZSgKKyAgICAgICAgICAgICAgICAgICAgcU5hbWUsCisgICAgICAgICAgICAgICAgICAgIG5vblRhZ2xpYkF0dHJzLAorICAgICAgICAgICAgICAgICAgICBub25UYWdsaWJYbWxuc0F0dHJzLAorICAgICAgICAgICAgICAgICAgICB0YWdsaWJBdHRycywKKyAgICAgICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQpOworICAgICAgICB9IGVsc2UgaWYgKGxvY2FsTmFtZS5lcXVhbHMoVkFSSUFCTEVfRElSRUNUSVZFX0FDVElPTikpIHsKKyAgICAgICAgICAgIGlmICghaXNUYWdGaWxlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNBWFBhcnNlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICBMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICJqc3AuZXJyb3IuYWN0aW9uLmlzbm90dGFnZmlsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbE5hbWUpLAorICAgICAgICAgICAgICAgICAgICBsb2NhdG9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5vZGUgPQorICAgICAgICAgICAgICAgIG5ldyBOb2RlLlZhcmlhYmxlRGlyZWN0aXZlKAorICAgICAgICAgICAgICAgICAgICBxTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgbm9uVGFnbGliQXR0cnMsCisgICAgICAgICAgICAgICAgICAgIG5vblRhZ2xpYlhtbG5zQXR0cnMsCisgICAgICAgICAgICAgICAgICAgIHRhZ2xpYkF0dHJzLAorICAgICAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudCk7CisgICAgICAgIH0gZWxzZSBpZiAobG9jYWxOYW1lLmVxdWFscyhJTlZPS0VfQUNUSU9OKSkgeworICAgICAgICAgICAgaWYgKCFpc1RhZ0ZpbGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU0FYUGFyc2VFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgIExvY2FsaXplci5nZXRNZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICAgICAgImpzcC5lcnJvci5hY3Rpb24uaXNub3R0YWdmaWxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsTmFtZSksCisgICAgICAgICAgICAgICAgICAgIGxvY2F0b3IpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbm9kZSA9CisgICAgICAgICAgICAgICAgbmV3IE5vZGUuSW52b2tlQWN0aW9uKAorICAgICAgICAgICAgICAgICAgICBxTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgbm9uVGFnbGliQXR0cnMsCisgICAgICAgICAgICAgICAgICAgIG5vblRhZ2xpYlhtbG5zQXR0cnMsCisgICAgICAgICAgICAgICAgICAgIHRhZ2xpYkF0dHJzLAorICAgICAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudCk7CisgICAgICAgIH0gZWxzZSBpZiAobG9jYWxOYW1lLmVxdWFscyhET0JPRFlfQUNUSU9OKSkgeworICAgICAgICAgICAgaWYgKCFpc1RhZ0ZpbGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU0FYUGFyc2VFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgIExvY2FsaXplci5nZXRNZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICAgICAgImpzcC5lcnJvci5hY3Rpb24uaXNub3R0YWdmaWxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsTmFtZSksCisgICAgICAgICAgICAgICAgICAgIGxvY2F0b3IpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbm9kZSA9CisgICAgICAgICAgICAgICAgbmV3IE5vZGUuRG9Cb2R5QWN0aW9uKAorICAgICAgICAgICAgICAgICAgICBxTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgbm9uVGFnbGliQXR0cnMsCisgICAgICAgICAgICAgICAgICAgIG5vblRhZ2xpYlhtbG5zQXR0cnMsCisgICAgICAgICAgICAgICAgICAgIHRhZ2xpYkF0dHJzLAorICAgICAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudCk7CisgICAgICAgIH0gZWxzZSBpZiAobG9jYWxOYW1lLmVxdWFscyhFTEVNRU5UX0FDVElPTikpIHsKKyAgICAgICAgICAgIG5vZGUgPQorICAgICAgICAgICAgICAgIG5ldyBOb2RlLkpzcEVsZW1lbnQoCisgICAgICAgICAgICAgICAgICAgIHFOYW1lLAorICAgICAgICAgICAgICAgICAgICBub25UYWdsaWJBdHRycywKKyAgICAgICAgICAgICAgICAgICAgbm9uVGFnbGliWG1sbnNBdHRycywKKyAgICAgICAgICAgICAgICAgICAgdGFnbGliQXR0cnMsCisgICAgICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICBjdXJyZW50KTsKKyAgICAgICAgfSBlbHNlIGlmIChsb2NhbE5hbWUuZXF1YWxzKEZBTExCQUNLX0FDVElPTikpIHsKKyAgICAgICAgICAgIG5vZGUgPQorICAgICAgICAgICAgICAgIG5ldyBOb2RlLkZhbGxCYWNrQWN0aW9uKAorICAgICAgICAgICAgICAgICAgICBxTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgbm9uVGFnbGliWG1sbnNBdHRycywKKyAgICAgICAgICAgICAgICAgICAgdGFnbGliQXR0cnMsCisgICAgICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICBjdXJyZW50KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTQVhQYXJzZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICBMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgImpzcC5lcnJvci54bWwuYmFkU3RhbmRhcmRBY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICBsb2NhbE5hbWUpLAorICAgICAgICAgICAgICAgIGxvY2F0b3IpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDaGVja3MgaWYgdGhlIFhNTCBlbGVtZW50IHdpdGggdGhlIGdpdmVuIHRhZyBuYW1lIGlzIGEgY3VzdG9tIGFjdGlvbiwKKyAgICAgKiBhbmQgcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBOb2RlIG9iamVjdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE5vZGUgcGFyc2VDdXN0b21BY3Rpb24oCisgICAgICAgIFN0cmluZyBxTmFtZSwKKyAgICAgICAgU3RyaW5nIGxvY2FsTmFtZSwKKyAgICAgICAgU3RyaW5nIHVyaSwKKyAgICAgICAgQXR0cmlidXRlcyBub25UYWdsaWJBdHRycywKKyAgICAgICAgQXR0cmlidXRlcyBub25UYWdsaWJYbWxuc0F0dHJzLAorICAgICAgICBBdHRyaWJ1dGVzIHRhZ2xpYkF0dHJzLAorICAgICAgICBNYXJrIHN0YXJ0LAorICAgICAgICBOb2RlIHBhcmVudCkKKyAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIHVzZXItZGVmaW5lZCAoY3VzdG9tKSB0YWcKKyAgICAgICAgVGFnTGlicmFyeUluZm8gdGFnTGliSW5mbyA9IHBhZ2VJbmZvLmdldFRhZ2xpYih1cmkpOworICAgICAgICBpZiAodGFnTGliSW5mbyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIFRhZ0luZm8gdGFnSW5mbyA9IHRhZ0xpYkluZm8uZ2V0VGFnKGxvY2FsTmFtZSk7CisgICAgICAgIFRhZ0ZpbGVJbmZvIHRhZ0ZpbGVJbmZvID0gdGFnTGliSW5mby5nZXRUYWdGaWxlKGxvY2FsTmFtZSk7CisgICAgICAgIGlmICh0YWdJbmZvID09IG51bGwgJiYgdGFnRmlsZUluZm8gPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICBMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgianNwLmVycm9yLnhtbC5iYWRfdGFnIiwgbG9jYWxOYW1lLCB1cmkpKTsKKyAgICAgICAgfQorICAgICAgICBDbGFzcyB0YWdIYW5kbGVyQ2xhc3MgPSBudWxsOworICAgICAgICBpZiAodGFnSW5mbyAhPSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgaGFuZGxlckNsYXNzTmFtZSA9IHRhZ0luZm8uZ2V0VGFnQ2xhc3NOYW1lKCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHRhZ0hhbmRsZXJDbGFzcyA9CisgICAgICAgICAgICAgICAgICAgIGN0eHQuZ2V0Q2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MoaGFuZGxlckNsYXNzTmFtZSk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBTQVhFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgIExvY2FsaXplci5nZXRNZXNzYWdlKCJqc3AuZXJyb3IubG9hZGNsYXNzLnRhZ2hhbmRsZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyQ2xhc3NOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxTmFtZSksCisgICAgICAgICAgICAgICAgICAgIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIHByZWZpeCA9ICIiOworICAgICAgICBpbnQgY29sb24gPSBxTmFtZS5pbmRleE9mKCc6Jyk7CisgICAgICAgIGlmIChjb2xvbiAhPSAtMSkgeworICAgICAgICAgICAgcHJlZml4ID0gcU5hbWUuc3Vic3RyaW5nKDAsIGNvbG9uKTsKKyAgICAgICAgfQorCisgICAgICAgIE5vZGUuQ3VzdG9tVGFnIHJldCA9IG51bGw7CisgICAgICAgIGlmICh0YWdJbmZvICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldCA9CisgICAgICAgICAgICAgICAgbmV3IE5vZGUuQ3VzdG9tVGFnKAorICAgICAgICAgICAgICAgICAgICBxTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICBsb2NhbE5hbWUsCisgICAgICAgICAgICAgICAgICAgIHVyaSwKKyAgICAgICAgICAgICAgICAgICAgbm9uVGFnbGliQXR0cnMsCisgICAgICAgICAgICAgICAgICAgIG5vblRhZ2xpYlhtbG5zQXR0cnMsCisgICAgICAgICAgICAgICAgICAgIHRhZ2xpYkF0dHJzLAorICAgICAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgcGFyZW50LAorICAgICAgICAgICAgICAgICAgICB0YWdJbmZvLAorICAgICAgICAgICAgICAgICAgICB0YWdIYW5kbGVyQ2xhc3MpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0ID0KKyAgICAgICAgICAgICAgICBuZXcgTm9kZS5DdXN0b21UYWcoCisgICAgICAgICAgICAgICAgICAgIHFOYW1lLAorICAgICAgICAgICAgICAgICAgICBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgIGxvY2FsTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgdXJpLAorICAgICAgICAgICAgICAgICAgICBub25UYWdsaWJBdHRycywKKyAgICAgICAgICAgICAgICAgICAgbm9uVGFnbGliWG1sbnNBdHRycywKKyAgICAgICAgICAgICAgICAgICAgdGFnbGliQXR0cnMsCisgICAgICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICBwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgIHRhZ0ZpbGVJbmZvKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDcmVhdGVzIHRoZSB0YWcgbGlicmFyeSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHVyaSBuYW1lc3BhY2UsIGFuZAorICAgICAqIHJldHVybnMgaXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJlZml4IFRoZSBwcmVmaXggb2YgdGhlIHhtbG5zIGF0dHJpYnV0ZQorICAgICAqIEBwYXJhbSB1cmkgVGhlIHVyaSBuYW1lc3BhY2UgKHZhbHVlIG9mIHRoZSB4bWxucyBhdHRyaWJ1dGUpCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSB0YWcgbGlicmFyeSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHVyaSBuYW1lc3BhY2UKKyAgICAgKi8KKyAgICBwcml2YXRlIFRhZ0xpYnJhcnlJbmZvIGdldFRhZ2xpYkluZm8oU3RyaW5nIHByZWZpeCwgU3RyaW5nIHVyaSkKKyAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisKKyAgICAgICAgVGFnTGlicmFyeUluZm8gcmVzdWx0ID0gbnVsbDsKKworICAgICAgICBpZiAodXJpLnN0YXJ0c1dpdGgoVVJOX0pTUFRBR0RJUikpIHsKKyAgICAgICAgICAgIC8vIHVyaSAob2YgdGhlIGZvcm0gInVybjpqc3B0YWdkaXI6cGF0aCIpIHJlZmVyZW5jZXMgdGFnIGZpbGUgZGlyCisgICAgICAgICAgICBTdHJpbmcgdGFnZGlyID0gdXJpLnN1YnN0cmluZyhVUk5fSlNQVEFHRElSLmxlbmd0aCgpKTsKKyAgICAgICAgICAgIHJlc3VsdCA9CisgICAgICAgICAgICAgICAgbmV3IEltcGxpY2l0VGFnTGlicmFyeUluZm8oCisgICAgICAgICAgICAgICAgICAgIGN0eHQsCisgICAgICAgICAgICAgICAgICAgIHBhcnNlckNvbnRyb2xsZXIsCisgICAgICAgICAgICAgICAgICAgIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgdGFnZGlyLAorICAgICAgICAgICAgICAgICAgICBlcnIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gdXJpIHJlZmVyZW5jZXMgVExEIGZpbGUKKyAgICAgICAgICAgIGJvb2xlYW4gaXNQbGFpblVyaSA9IGZhbHNlOworICAgICAgICAgICAgaWYgKHVyaS5zdGFydHNXaXRoKFVSTl9KU1BUTEQpKSB7CisgICAgICAgICAgICAgICAgLy8gdXJpIGlzIG9mIHRoZSBmb3JtICJ1cm46anNwdGxkOnBhdGgiCisgICAgICAgICAgICAgICAgdXJpID0gdXJpLnN1YnN0cmluZyhVUk5fSlNQVExELmxlbmd0aCgpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaXNQbGFpblVyaSA9IHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0cmluZ1tdIGxvY2F0aW9uID0gY3R4dC5nZXRUbGRMb2NhdGlvbih1cmkpOworICAgICAgICAgICAgaWYgKGxvY2F0aW9uICE9IG51bGwgfHwgIWlzUGxhaW5VcmkpIHsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIElmIHRoZSB1cmkgdmFsdWUgaXMgYSBwbGFpbiB1cmksIGEgdHJhbnNsYXRpb24gZXJyb3IgbXVzdAorICAgICAgICAgICAgICAgICAqIG5vdCBiZSBnZW5lcmF0ZWQgaWYgdGhlIHVyaSBpcyBub3QgZm91bmQgaW4gdGhlIHRhZ2xpYiBtYXAuCisgICAgICAgICAgICAgICAgICogSW5zdGVhZCwgYW55IGFjdGlvbnMgaW4gdGhlIG5hbWVzcGFjZSBkZWZpbmVkIGJ5IHRoZSB1cmkKKyAgICAgICAgICAgICAgICAgKiB2YWx1ZSBtdXN0IGJlIHRyZWF0ZWQgYXMgdW5pbnRlcnByZXRlZC4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICByZXN1bHQgPQorICAgICAgICAgICAgICAgICAgICBuZXcgVGFnTGlicmFyeUluZm9JbXBsKAorICAgICAgICAgICAgICAgICAgICAgICAgY3R4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlckNvbnRyb2xsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICB1cmksCisgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVycik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qCisgICAgICogRW5zdXJlcyB0aGF0IHRoZSBnaXZlbiBib2R5IG9ubHkgY29udGFpbnMgbm9kZXMgdGhhdCBhcmUgaW5zdGFuY2VzIG9mCisgICAgICogVGVtcGxhdGVUZXh0LgorICAgICAqCisgICAgICogVGhpcyBjaGVjayBpcyBwZXJmb3JtZWQgb25seSBmb3IgdGhlIGJvZHkgb2YgYSBzY3JpcHRpbmcgKHRoYXQgaXM6CisgICAgICogZGVjbGFyYXRpb24sIHNjcmlwdGxldCwgb3IgZXhwcmVzc2lvbikgZWxlbWVudCwgYWZ0ZXIgdGhlIGVuZCB0YWcgb2YgYQorICAgICAqIHNjcmlwdGluZyBlbGVtZW50IGhhcyBiZWVuIHJlYWNoZWQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrU2NyaXB0aW5nQm9keShOb2RlLlNjcmlwdGluZ0VsZW1lbnQgc2NyaXB0aW5nRWxlbSkKKyAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIE5vZGUuTm9kZXMgYm9keSA9IHNjcmlwdGluZ0VsZW0uZ2V0Qm9keSgpOworICAgICAgICBpZiAoYm9keSAhPSBudWxsKSB7CisgICAgICAgICAgICBpbnQgc2l6ZSA9IGJvZHkuc2l6ZSgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICBOb2RlIG4gPSBib2R5LmdldE5vZGUoaSk7CisgICAgICAgICAgICAgICAgaWYgKCEobiBpbnN0YW5jZW9mIE5vZGUuVGVtcGxhdGVUZXh0KSkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZWxlbVR5cGUgPSBTQ1JJUFRMRVRfQUNUSU9OOworICAgICAgICAgICAgICAgICAgICBpZiAoc2NyaXB0aW5nRWxlbSBpbnN0YW5jZW9mIE5vZGUuRGVjbGFyYXRpb24pCisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtVHlwZSA9IERFQ0xBUkFUSU9OX0FDVElPTjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNjcmlwdGluZ0VsZW0gaW5zdGFuY2VvZiBOb2RlLkV4cHJlc3Npb24pCisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtVHlwZSA9IEVYUFJFU1NJT05fQUNUSU9OOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0KKyAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsaXplci5nZXRNZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJqc3AuZXJyb3IucGFyc2UueG1sLnNjcmlwdGluZy5pbnZhbGlkLmJvZHkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1UeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbihtc2cpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogUGFyc2VzIHRoZSBnaXZlbiBmaWxlIGluY2x1ZGVkIHZpYSBhbiBpbmNsdWRlIGRpcmVjdGl2ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmbmFtZSBUaGUgcGF0aCB0byB0aGUgaW5jbHVkZWQgcmVzb3VyY2UsIGFzIHNwZWNpZmllZCBieSB0aGUKKyAgICAgKiAnZmlsZScgYXR0cmlidXRlIG9mIHRoZSBpbmNsdWRlIGRpcmVjdGl2ZQorICAgICAqIEBwYXJhbSBwYXJlbnQgVGhlIE5vZGUgcmVwcmVzZW50aW5nIHRoZSBpbmNsdWRlIGRpcmVjdGl2ZQorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzSW5jbHVkZURpcmVjdGl2ZShTdHJpbmcgZm5hbWUsIE5vZGUgcGFyZW50KQorICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAoZm5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHBhcnNlckNvbnRyb2xsZXIucGFyc2UoZm5hbWUsIHBhcmVudCwgbnVsbCk7CisgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBmbmZlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgU0FYUGFyc2VFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgTG9jYWxpemVyLmdldE1lc3NhZ2UoImpzcC5lcnJvci5maWxlLm5vdC5mb3VuZCIsIGZuYW1lKSwKKyAgICAgICAgICAgICAgICBsb2NhdG9yLAorICAgICAgICAgICAgICAgIGZuZmUpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogQ2hlY2tzIGFuIGVsZW1lbnQncyBnaXZlbiBVUkksIHFuYW1lLCBhbmQgYXR0cmlidXRlcyB0byBzZWUgaWYgYW55CisgICAgICogb2YgdGhlbSBoaWphY2sgdGhlICdqc3AnIHByZWZpeCwgdGhhdCBpcywgYmluZCBpdCB0byBhIG5hbWVzcGFjZSBvdGhlcgorICAgICAqIHRoYW4gaHR0cDovL2phdmEuc3VuLmNvbS9KU1AvUGFnZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmkgVGhlIGVsZW1lbnQncyBVUkkKKyAgICAgKiBAcGFyYW0gcU5hbWUgVGhlIGVsZW1lbnQncyBxbmFtZQorICAgICAqIEBwYXJhbSBhdHRycyBUaGUgZWxlbWVudCdzIGF0dHJpYnV0ZXMKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgY2hlY2tQcmVmaXhlcyhTdHJpbmcgdXJpLCBTdHJpbmcgcU5hbWUsIEF0dHJpYnV0ZXMgYXR0cnMpIHsKKworICAgICAgICBjaGVja1ByZWZpeCh1cmksIHFOYW1lKTsKKworICAgICAgICBpbnQgbGVuID0gYXR0cnMuZ2V0TGVuZ3RoKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgICAgIGNoZWNrUHJlZml4KGF0dHJzLmdldFVSSShpKSwgYXR0cnMuZ2V0UU5hbWUoaSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDaGVja3MgdGhlIGdpdmVuIFVSSSBhbmQgcW5hbWUgdG8gc2VlIGlmIHRoZXkgaGlqYWNrIHRoZSAnanNwJyBwcmVmaXgsCisgICAgICogd2hpY2ggd291bGQgYmUgdGhlIGNhc2UgaWYgcU5hbWUgY29udGFpbmVkIHRoZSAnanNwJyBwcmVmaXggYW5kCisgICAgICogdXJpIHdhcyBkaWZmZXJlbnQgZnJvbSBodHRwOi8vamF2YS5zdW4uY29tL0pTUC9QYWdlLgorICAgICAqCisgICAgICogQHBhcmFtIHVyaSBUaGUgVVJJIHRvIGNoZWNrCisgICAgICogQHBhcmFtIHFOYW1lIFRoZSBxbmFtZSB0byBjaGVjaworICAgICAqLworICAgIHByaXZhdGUgdm9pZCBjaGVja1ByZWZpeChTdHJpbmcgdXJpLCBTdHJpbmcgcU5hbWUpIHsKKworICAgICAgICBpbnQgaW5kZXggPSBxTmFtZS5pbmRleE9mKCc6Jyk7CisgICAgICAgIGlmIChpbmRleCAhPSAtMSkgeworICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IHFOYW1lLnN1YnN0cmluZygwLCBpbmRleCk7CisgICAgICAgICAgICBwYWdlSW5mby5hZGRQcmVmaXgocHJlZml4KTsKKyAgICAgICAgICAgIGlmICgianNwIi5lcXVhbHMocHJlZml4KSAmJiAhSlNQX1VSSS5lcXVhbHModXJpKSkgeworICAgICAgICAgICAgICAgIHBhZ2VJbmZvLnNldElzSnNwUHJlZml4SGlqYWNrZWQodHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIEdldHMgU0FYUGFyc2VyLgorICAgICAqCisgICAgICogQHBhcmFtIHZhbGlkYXRpbmcgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHJlcXVlc3RlZCBTQVhQYXJzZXIgc2hvdWxkCisgICAgICogYmUgdmFsaWRhdGluZworICAgICAqIEBwYXJhbSBqc3BEb2NQYXJzZXIgVGhlIEpTUCBkb2N1bWVudCBwYXJzZXIKKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIFNBWFBhcnNlcgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFNBWFBhcnNlciBnZXRTQVhQYXJzZXIoCisgICAgICAgIGJvb2xlYW4gdmFsaWRhdGluZywKKyAgICAgICAgSnNwRG9jdW1lbnRQYXJzZXIganNwRG9jUGFyc2VyKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBTQVhQYXJzZXJGYWN0b3J5IGZhY3RvcnkgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgICAgIGZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7CisKKyAgICAgICAgLy8gUHJlc2VydmUgeG1sbnMgYXR0cmlidXRlcworICAgICAgICBmYWN0b3J5LnNldEZlYXR1cmUoCisgICAgICAgICAgICAiaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL25hbWVzcGFjZS1wcmVmaXhlcyIsCisgICAgICAgICAgICB0cnVlKTsKKyAgICAgICAgZmFjdG9yeS5zZXRGZWF0dXJlKAorICAgICAgICAgICAgImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy92YWxpZGF0aW9uIiwKKyAgICAgICAgICAgIHZhbGlkYXRpbmcpOworCisgICAgICAgIC8vIENvbmZpZ3VyZSB0aGUgcGFyc2VyCisgICAgICAgIFNBWFBhcnNlciBzYXhQYXJzZXIgPSBmYWN0b3J5Lm5ld1NBWFBhcnNlcigpOworICAgICAgICBYTUxSZWFkZXIgeG1sUmVhZGVyID0gc2F4UGFyc2VyLmdldFhNTFJlYWRlcigpOworICAgICAgICB4bWxSZWFkZXIuc2V0UHJvcGVydHkoTEVYSUNBTF9IQU5ETEVSX1BST1BFUlRZLCBqc3BEb2NQYXJzZXIpOworICAgICAgICB4bWxSZWFkZXIuc2V0RXJyb3JIYW5kbGVyKGpzcERvY1BhcnNlcik7CisKKyAgICAgICAgcmV0dXJuIHNheFBhcnNlcjsKKyAgICB9CisKKyAgICAvKgorICAgICAqIEV4Y2VwdGlvbiBpbmRpY2F0aW5nIHRoYXQgYSBET0NUWVBFIGRlY2xhcmF0aW9uIGlzIHByZXNlbnQsIGJ1dAorICAgICAqIHZhbGlkYXRpb24gaXMgdHVybmVkIG9mZi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBFbmFibGVEVERWYWxpZGF0aW9uRXhjZXB0aW9uCisgICAgICAgIGV4dGVuZHMgU0FYUGFyc2VFeGNlcHRpb24geworCisgICAgICAgIEVuYWJsZURURFZhbGlkYXRpb25FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIExvY2F0b3IgbG9jKSB7CisgICAgICAgICAgICBzdXBlcihtZXNzYWdlLCBsb2MpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEJvZHlUeXBlKE5vZGUuQ3VzdG9tVGFnIGN1c3RvbSkgeworCisgICAgICAgIGlmIChjdXN0b20uZ2V0VGFnSW5mbygpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBjdXN0b20uZ2V0VGFnSW5mbygpLmdldEJvZHlDb250ZW50KCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gY3VzdG9tLmdldFRhZ0ZpbGVJbmZvKCkuZ2V0VGFnSW5mbygpLmdldEJvZHlDb250ZW50KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGlzVGFnRGVwZW5kZW50KE5vZGUgbikgeworCisgICAgICAgIGlmIChuIGluc3RhbmNlb2YgTm9kZS5DdXN0b21UYWcpIHsKKyAgICAgICAgICAgIFN0cmluZyBib2R5VHlwZSA9IGdldEJvZHlUeXBlKChOb2RlLkN1c3RvbVRhZykgbik7CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICBUYWdJbmZvLkJPRFlfQ09OVEVOVF9UQUdfREVQRU5ERU5ULmVxdWFsc0lnbm9yZUNhc2UoYm9keVR5cGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvSnNwUmVhZGVyLmphdmEgYi9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvSnNwUmVhZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU4ODFmMgotLS0gL2Rldi9udWxsCisrKyBiL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9Kc3BSZWFkZXIuamF2YQpAQCAtMCwwICsxLDU4NCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFzcGVyLmNvbXBpbGVyOworCitpbXBvcnQgamF2YS5pby5DaGFyQXJyYXlXcml0ZXI7CitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLmphci5KYXJGaWxlOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5KYXNwZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIuSnNwQ29tcGlsYXRpb25Db250ZXh0OworCisvKioKKyAqIEpzcFJlYWRlciBpcyBhbiBpbnB1dCBidWZmZXIgZm9yIHRoZSBKU1AgcGFyc2VyLiBJdCBzaG91bGQgYWxsb3cKKyAqIHVubGltaXRlZCBsb29rYWhlYWQgYW5kIHB1c2hiYWNrLiBJdCBhbHNvIGhhcyBhIGJ1bmNoIG9mIHBhcnNpbmcKKyAqIHV0aWxpdHkgbWV0aG9kcyBmb3IgdW5kZXJzdGFuZGluZyBodG1sZXNxdWUgdGhpbmdpZXMuCisgKgorICogQGF1dGhvciBBbmlsIEsuIFZpamVuZHJhbgorICogQGF1dGhvciBBbnNlbG0gQmFpcmQtU21pdGgKKyAqIEBhdXRob3IgSGFyaXNoIFByYWJhbmRoYW0KKyAqIEBhdXRob3IgUmFqaXYgTW9yZGFuaQorICogQGF1dGhvciBNYW5kYXIgUmFqZQorICogQGF1dGhvciBEYW5ubyBGZXJyaW4KKyAqIEBhdXRob3IgS2luLW1hbiBDaHVuZworICogQGF1dGhvciBTaGF3biBCYXllcm4KKyAqIEBhdXRob3IgTWFyayBSb3RoCisgKi8KKworY2xhc3MgSnNwUmVhZGVyIHsKKworICAgIC8vIExvZ2dlcgorICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhKc3BSZWFkZXIuY2xhc3MpOworCisgICAgcHJpdmF0ZSBNYXJrIGN1cnJlbnQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgbWFzdGVyOworICAgIHByaXZhdGUgVmVjdG9yIHNvdXJjZUZpbGVzOworICAgIHByaXZhdGUgaW50IGN1cnJGaWxlSWQ7CisgICAgcHJpdmF0ZSBpbnQgc2l6ZTsKKyAgICBwcml2YXRlIEpzcENvbXBpbGF0aW9uQ29udGV4dCBjb250ZXh0OworICAgIHByaXZhdGUgRXJyb3JEaXNwYXRjaGVyIGVycjsKKworICAgIC8qCisgICAgICogU2V0IHRvIHRydWUgd2hlbiB1c2luZyB0aGUgSnNwUmVhZGVyIG9uIGEgc2luZ2xlIGZpbGUgd2hlcmUgd2UgcmVhZCB1cAorICAgICAqIHRvIHRoZSBlbmQgYW5kIHJlc2V0IHRvIHRoZSBiZWdpbm5pbmcgbWFueSB0aW1lcy4KKyAgICAgKiAoYXMgaW4gUGFyc2VyQ29udHJvbGxlci5maWd1cmVPdXRKc3BEb2N1bWVudCgpKS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gc2luZ2xlRmlsZTsKKworICAgIC8qCisgICAgICogQ29uc3RydWN0b3IuCisgICAgICovCisgICAgcHVibGljIEpzcFJlYWRlcihKc3BDb21waWxhdGlvbkNvbnRleHQgY3R4dCwKKyAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBlbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgIEphckZpbGUgamFyRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgIEVycm9yRGlzcGF0Y2hlciBlcnIpCisgICAgICAgICAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKworICAgICAgICB0aGlzKGN0eHQsIGZuYW1lLCBlbmNvZGluZywKKyAgICAgICAgICAgICBKc3BVdGlsLmdldFJlYWRlcihmbmFtZSwgZW5jb2RpbmcsIGphckZpbGUsIGN0eHQsIGVyciksCisgICAgICAgICAgICAgZXJyKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIENvbnN0cnVjdG9yLgorICAgICAqLworICAgIHB1YmxpYyBKc3BSZWFkZXIoSnNwQ29tcGlsYXRpb25Db250ZXh0IGN0eHQsCisgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZm5hbWUsCisgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbVJlYWRlciByZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICBFcnJvckRpc3BhdGNoZXIgZXJyKQorICAgICAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKKworICAgICAgICB0aGlzLmNvbnRleHQgPSBjdHh0OworICAgICAgICB0aGlzLmVyciA9IGVycjsKKyAgICAgICAgc291cmNlRmlsZXMgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIGN1cnJGaWxlSWQgPSAwOworICAgICAgICBzaXplID0gMDsKKyAgICAgICAgc2luZ2xlRmlsZSA9IGZhbHNlOworICAgICAgICBwdXNoRmlsZShmbmFtZSwgZW5jb2RpbmcsIHJlYWRlcik7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBAcmV0dXJuIEpTUCBjb21waWxhdGlvbiBjb250ZXh0IHdpdGggd2hpY2ggdGhpcyBKc3BSZWFkZXIgaXMgCisgICAgICogYXNzb2NpYXRlZAorICAgICAqLworICAgIEpzcENvbXBpbGF0aW9uQ29udGV4dCBnZXRKc3BDb21waWxhdGlvbkNvbnRleHQoKSB7CisgICAgICAgIHJldHVybiBjb250ZXh0OworICAgIH0KKyAgICAKKyAgICBTdHJpbmcgZ2V0RmlsZShpbnQgZmlsZWlkKSB7CisgICAgICAgIHJldHVybiAoU3RyaW5nKSBzb3VyY2VGaWxlcy5lbGVtZW50QXQoZmlsZWlkKTsKKyAgICB9CisgICAgICAgIAorICAgIGJvb2xlYW4gaGFzTW9yZUlucHV0KCkgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChjdXJyZW50LmN1cnNvciA+PSBjdXJyZW50LnN0cmVhbS5sZW5ndGgpIHsKKyAgICAgICAgICAgIGlmIChzaW5nbGVGaWxlKSByZXR1cm4gZmFsc2U7IAorICAgICAgICAgICAgd2hpbGUgKHBvcEZpbGUoKSkgeworICAgICAgICAgICAgICAgIGlmIChjdXJyZW50LmN1cnNvciA8IGN1cnJlbnQuc3RyZWFtLmxlbmd0aCkgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIAorICAgIGludCBuZXh0Q2hhcigpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICBpZiAoIWhhc01vcmVJbnB1dCgpKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAKKyAgICAgICAgaW50IGNoID0gY3VycmVudC5zdHJlYW1bY3VycmVudC5jdXJzb3JdOworCisgICAgICAgIGN1cnJlbnQuY3Vyc29yKys7CisgICAgICAgIAorICAgICAgICBpZiAoY2ggPT0gJ1xuJykgeworICAgICAgICAgICAgY3VycmVudC5saW5lKys7CisgICAgICAgICAgICBjdXJyZW50LmNvbCA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjdXJyZW50LmNvbCsrOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjaDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCYWNrIHVwIHRoZSBjdXJyZW50IGN1cnNvciBieSBvbmUgY2hhciwgYXNzdW1lcyBjdXJyZW50LmN1cnNvciA+IDAsCisgICAgICogYW5kIHRoYXQgdGhlIGNoYXIgdG8gYmUgcHVzaGVkIGJhY2sgaXMgbm90ICdcbicuCisgICAgICovCisgICAgdm9pZCBwdXNoQ2hhcigpIHsKKyAgICAgICAgY3VycmVudC5jdXJzb3ItLTsKKyAgICAgICAgY3VycmVudC5jb2wtLTsKKyAgICB9CisKKyAgICBTdHJpbmcgZ2V0VGV4dChNYXJrIHN0YXJ0LCBNYXJrIHN0b3ApIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICBNYXJrIG9sZHN0YXJ0ID0gbWFyaygpOworICAgICAgICByZXNldChzdGFydCk7CisgICAgICAgIENoYXJBcnJheVdyaXRlciBjYXcgPSBuZXcgQ2hhckFycmF5V3JpdGVyKCk7CisgICAgICAgIHdoaWxlICghc3RvcC5lcXVhbHMobWFyaygpKSkKKyAgICAgICAgICAgIGNhdy53cml0ZShuZXh0Q2hhcigpKTsKKyAgICAgICAgY2F3LmNsb3NlKCk7CisgICAgICAgIHJlc2V0KG9sZHN0YXJ0KTsKKyAgICAgICAgcmV0dXJuIGNhdy50b1N0cmluZygpOworICAgIH0KKworICAgIGludCBwZWVrQ2hhcigpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICBpZiAoIWhhc01vcmVJbnB1dCgpKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICByZXR1cm4gY3VycmVudC5zdHJlYW1bY3VycmVudC5jdXJzb3JdOworICAgIH0KKworICAgIE1hcmsgbWFyaygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNYXJrKGN1cnJlbnQpOworICAgIH0KKworICAgIHZvaWQgcmVzZXQoTWFyayBtYXJrKSB7CisgICAgICAgIGN1cnJlbnQgPSBuZXcgTWFyayhtYXJrKTsKKyAgICB9CisKKyAgICBib29sZWFuIG1hdGNoZXNJZ25vcmVDYXNlKFN0cmluZyBzdHJpbmcpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICBNYXJrIG1hcmsgPSBtYXJrKCk7CisgICAgICAgIGludCBjaCA9IDA7CisgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgZG8geworICAgICAgICAgICAgY2ggPSBuZXh0Q2hhcigpOworICAgICAgICAgICAgaWYgKENoYXJhY3Rlci50b0xvd2VyQ2FzZSgoY2hhcikgY2gpICE9IHN0cmluZy5jaGFyQXQoaSsrKSkgeworICAgICAgICAgICAgICAgIHJlc2V0KG1hcmspOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAoaSA8IHN0cmluZy5sZW5ndGgoKSk7CisgICAgICAgIHJlc2V0KG1hcmspOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzZWFyY2ggdGhlIHN0cmVhbSBmb3IgYSBtYXRjaCB0byBhIHN0cmluZworICAgICAqIEBwYXJhbSBzdHJpbmcgVGhlIHN0cmluZyB0byBtYXRjaAorICAgICAqIEByZXR1cm4gPHN0cm9uZz50cnVlPC9zdHJvbmc+IGlzIG9uZSBpcyBmb3VuZCwgdGhlIGN1cnJlbnQgcG9zaXRpb24KKyAgICAgKiAgICAgICAgIGluIHN0cmVhbSBpcyBwb3NpdGlvbmVkIGFmdGVyIHRoZSBzZWFyY2ggc3RyaW5nLCA8c3Ryb25nPgorICAgICAqICAgICAgICAgICAgICAgZmFsc2U8L3N0cm9uZz4gb3RoZXJ3aXNlLCBwb3NpdGlvbiBpbiBzdHJlYW0gdW5jaGFuZ2VkLgorICAgICAqLworICAgIGJvb2xlYW4gbWF0Y2hlcyhTdHJpbmcgc3RyaW5nKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgTWFyayBtYXJrID0gbWFyaygpOworICAgICAgICBpbnQgY2ggPSAwOworICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGNoID0gbmV4dENoYXIoKTsKKyAgICAgICAgICAgIGlmICgoKGNoYXIpIGNoKSAhPSBzdHJpbmcuY2hhckF0KGkrKykpIHsKKyAgICAgICAgICAgICAgICByZXNldChtYXJrKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0gd2hpbGUgKGkgPCBzdHJpbmcubGVuZ3RoKCkpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBib29sZWFuIG1hdGNoZXNFVGFnKFN0cmluZyB0YWdOYW1lKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgTWFyayBtYXJrID0gbWFyaygpOworCisgICAgICAgIGlmICghbWF0Y2hlcygiPC8iICsgdGFnTmFtZSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHNraXBTcGFjZXMoKTsKKyAgICAgICAgaWYgKG5leHRDaGFyKCkgPT0gJz4nKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAgcmVzZXQobWFyayk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sZWFuIG1hdGNoZXNFVGFnV2l0aG91dExlc3NUaGFuKFN0cmluZyB0YWdOYW1lKQorICAgICAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uCisgICAgeworICAgICAgIE1hcmsgbWFyayA9IG1hcmsoKTsKKworICAgICAgIGlmICghbWF0Y2hlcygiLyIgKyB0YWdOYW1lKSkKKyAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgIHNraXBTcGFjZXMoKTsKKyAgICAgICBpZiAobmV4dENoYXIoKSA9PSAnPicpCisgICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgcmVzZXQobWFyayk7CisgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworCisgICAgLyoqCisgICAgICogTG9va3MgYWhlYWQgdG8gc2VlIGlmIHRoZXJlIGFyZSBvcHRpb25hbCBzcGFjZXMgZm9sbG93ZWQgYnkKKyAgICAgKiB0aGUgZ2l2ZW4gU3RyaW5nLiAgSWYgc28sIHRydWUgaXMgcmV0dXJuZWQgYW5kIHRob3NlIHNwYWNlcyBhbmQKKyAgICAgKiBjaGFyYWN0ZXJzIGFyZSBza2lwcGVkLiAgSWYgbm90LCBmYWxzZSBpcyByZXR1cm5lZCBhbmQgdGhlCisgICAgICogcG9zaXRpb24gaXMgcmVzdG9yZWQgdG8gd2hlcmUgd2Ugd2VyZSBiZWZvcmUuCisgICAgICovCisgICAgYm9vbGVhbiBtYXRjaGVzT3B0aW9uYWxTcGFjZXNGb2xsb3dlZEJ5KCBTdHJpbmcgcyApCisgICAgICAgIHRocm93cyBKYXNwZXJFeGNlcHRpb24KKyAgICB7CisgICAgICAgIE1hcmsgbWFyayA9IG1hcmsoKTsKKworICAgICAgICBza2lwU3BhY2VzKCk7CisgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gbWF0Y2hlcyggcyApOworICAgICAgICBpZiggIXJlc3VsdCApIHsKKyAgICAgICAgICAgIHJlc2V0KCBtYXJrICk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIGludCBza2lwU3BhY2VzKCkgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgd2hpbGUgKGhhc01vcmVJbnB1dCgpICYmIGlzU3BhY2UoKSkgeworICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgbmV4dENoYXIoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTa2lwIHVudGlsIHRoZSBnaXZlbiBzdHJpbmcgaXMgbWF0Y2hlZCBpbiB0aGUgc3RyZWFtLgorICAgICAqIFdoZW4gcmV0dXJuZWQsIHRoZSBjb250ZXh0IGlzIHBvc2l0aW9uZWQgcGFzdCB0aGUgZW5kIG9mIHRoZSBtYXRjaC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzIFRoZSBTdHJpbmcgdG8gbWF0Y2guCisgICAgICogQHJldHVybiBBIG5vbi1udWxsIDxjb2RlPk1hcms8L2NvZGU+IGluc3RhbmNlIChwb3NpdGlvbmVkIGltbWVkaWF0ZWx5CisgICAgICogICAgICAgICBiZWZvcmUgdGhlIHNlYXJjaCBzdHJpbmcpIGlmIGZvdW5kLCA8c3Ryb25nPm51bGw8L3N0cm9uZz4KKyAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBNYXJrIHNraXBVbnRpbChTdHJpbmcgbGltaXQpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICBNYXJrIHJldCA9IG51bGw7CisgICAgICAgIGludCBsaW1sZW4gPSBsaW1pdC5sZW5ndGgoKTsKKyAgICAgICAgaW50IGNoOworCisgICAgc2tpcDoKKyAgICAgICAgZm9yIChyZXQgPSBtYXJrKCksIGNoID0gbmV4dENoYXIoKSA7IGNoICE9IC0xIDsKKyAgICAgICAgICAgICAgICAgcmV0ID0gbWFyaygpLCBjaCA9IG5leHRDaGFyKCkpIHsKKyAgICAgICAgICAgIGlmIChjaCA9PSBsaW1pdC5jaGFyQXQoMCkpIHsKKyAgICAgICAgICAgICAgICBNYXJrIHJlc3RhcnQgPSBtYXJrKCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDEgOyBpIDwgbGltbGVuIDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwZWVrQ2hhcigpID09IGxpbWl0LmNoYXJBdChpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIG5leHRDaGFyKCk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXQocmVzdGFydCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBza2lwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2tpcCB1bnRpbCB0aGUgZ2l2ZW4gc3RyaW5nIGlzIG1hdGNoZWQgaW4gdGhlIHN0cmVhbSwgYnV0IGlnbm9yaW5nCisgICAgICogY2hhcnMgaW5pdGlhbGx5IGVzY2FwZWQgYnkgYSAnXCcuCisgICAgICogV2hlbiByZXR1cm5lZCwgdGhlIGNvbnRleHQgaXMgcG9zaXRpb25lZCBwYXN0IHRoZSBlbmQgb2YgdGhlIG1hdGNoLgorICAgICAqCisgICAgICogQHBhcmFtIHMgVGhlIFN0cmluZyB0byBtYXRjaC4KKyAgICAgKiBAcmV0dXJuIEEgbm9uLW51bGwgPGNvZGU+TWFyazwvY29kZT4gaW5zdGFuY2UgKHBvc2l0aW9uZWQgaW1tZWRpYXRlbHkKKyAgICAgKiAgICAgICAgIGJlZm9yZSB0aGUgc2VhcmNoIHN0cmluZykgaWYgZm91bmQsIDxzdHJvbmc+bnVsbDwvc3Ryb25nPgorICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgorICAgICAqLworICAgIE1hcmsgc2tpcFVudGlsSWdub3JlRXNjKFN0cmluZyBsaW1pdCkgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgIE1hcmsgcmV0ID0gbnVsbDsKKyAgICAgICAgaW50IGxpbWxlbiA9IGxpbWl0Lmxlbmd0aCgpOworICAgICAgICBpbnQgY2g7CisgICAgICAgIGludCBwcmV2ID0gJ3gnOyAgICAgICAgLy8gRG9lc24ndCBtYXR0ZXIKKyAgICAgICAgCisgICAgc2tpcDoKKyAgICAgICAgZm9yIChyZXQgPSBtYXJrKCksIGNoID0gbmV4dENoYXIoKSA7IGNoICE9IC0xIDsKKyAgICAgICAgICAgICAgICAgcmV0ID0gbWFyaygpLCBwcmV2ID0gY2gsIGNoID0gbmV4dENoYXIoKSkgeyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKGNoID09ICdcXCcgJiYgcHJldiA9PSAnXFwnKSB7CisgICAgICAgICAgICAgICAgY2ggPSAwOyAgICAgICAgICAgICAgICAvLyBEb3VibGUgXCBpcyBub3QgYW4gZXNjYXBlIGNoYXIgYW55bW9yZQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoY2ggPT0gbGltaXQuY2hhckF0KDApICYmIHByZXYgIT0gJ1xcJykgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAxIDsgaSA8IGxpbWxlbiA7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAocGVla0NoYXIoKSA9PSBsaW1pdC5jaGFyQXQoaSkpCisgICAgICAgICAgICAgICAgICAgICAgICBuZXh0Q2hhcigpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBza2lwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTa2lwIHVudGlsIHRoZSBnaXZlbiBlbmQgdGFnIGlzIG1hdGNoZWQgaW4gdGhlIHN0cmVhbS4KKyAgICAgKiBXaGVuIHJldHVybmVkLCB0aGUgY29udGV4dCBpcyBwb3NpdGlvbmVkIHBhc3QgdGhlIGVuZCBvZiB0aGUgdGFnLgorICAgICAqCisgICAgICogQHBhcmFtIHRhZyBUaGUgbmFtZSBvZiB0aGUgdGFnIHdob3NlIEVUYWcgKDwvdGFnPikgdG8gbWF0Y2guCisgICAgICogQHJldHVybiBBIG5vbi1udWxsIDxjb2RlPk1hcms8L2NvZGU+IGluc3RhbmNlIChwb3NpdGlvbmVkIGltbWVkaWF0ZWx5CisgICAgICogICAgICAgICAgICAgICBiZWZvcmUgdGhlIEVUYWcpIGlmIGZvdW5kLCA8c3Ryb25nPm51bGw8L3N0cm9uZz4gb3RoZXJ3aXNlLgorICAgICAqLworICAgIE1hcmsgc2tpcFVudGlsRVRhZyhTdHJpbmcgdGFnKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgTWFyayByZXQgPSBza2lwVW50aWwoIjwvIiArIHRhZyk7CisgICAgICAgIGlmIChyZXQgIT0gbnVsbCkgeworICAgICAgICAgICAgc2tpcFNwYWNlcygpOworICAgICAgICAgICAgaWYgKG5leHRDaGFyKCkgIT0gJz4nKQorICAgICAgICAgICAgICAgIHJldCA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBmaW5hbCBib29sZWFuIGlzU3BhY2UoKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gTm90ZTogSWYgdGhpcyBsb2dpYyBjaGFuZ2VzLCBhbHNvIHVwZGF0ZSBOb2RlLlRlbXBsYXRlVGV4dC5ydHJpbSgpCisgICAgICAgIHJldHVybiBwZWVrQ2hhcigpIDw9ICcgJzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSBhIHNwYWNlIGRlbGltaXRlZCB0b2tlbi4KKyAgICAgKiBJZiBxdW90ZWQgdGhlIHRva2VuIHdpbGwgY29uc3VtZSBhbGwgY2hhcmFjdGVycyB1cCB0byBhIG1hdGNoaW5nIHF1b3RlLAorICAgICAqIG90aGVyd2lzZSwgaXQgY29uc3VtZXMgdXAgdG8gdGhlIGZpcnN0IGRlbGltaXRlciBjaGFyYWN0ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcXVvdGVkIElmIDxzdHJvbmc+dHJ1ZTwvc3Ryb25nPiBhY2NlcHQgcXVvdGVkIHN0cmluZ3MuCisgICAgICovCisgICAgU3RyaW5nIHBhcnNlVG9rZW4oYm9vbGVhbiBxdW90ZWQpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICBTdHJpbmdCdWZmZXIgc3RyaW5nQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBza2lwU3BhY2VzKCk7CisgICAgICAgIHN0cmluZ0J1ZmZlci5zZXRMZW5ndGgoMCk7CisgICAgICAgIAorICAgICAgICBpZiAoIWhhc01vcmVJbnB1dCgpKSB7CisgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgIH0KKworICAgICAgICBpbnQgY2ggPSBwZWVrQ2hhcigpOworICAgICAgICAKKyAgICAgICAgaWYgKHF1b3RlZCkgeworICAgICAgICAgICAgaWYgKGNoID09ICciJyB8fCBjaCA9PSAnXCcnKSB7CisKKyAgICAgICAgICAgICAgICBjaGFyIGVuZFF1b3RlID0gY2ggPT0gJyInID8gJyInIDogJ1wnJzsKKyAgICAgICAgICAgICAgICAvLyBDb25zdW1lIHRoZSBvcGVuIHF1b3RlOiAKKyAgICAgICAgICAgICAgICBjaCA9IG5leHRDaGFyKCk7CisgICAgICAgICAgICAgICAgZm9yIChjaCA9IG5leHRDaGFyKCk7IGNoICE9IC0xICYmIGNoICE9IGVuZFF1b3RlOworICAgICAgICAgICAgICAgICAgICAgICAgIGNoID0gbmV4dENoYXIoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJ1xcJykgCisgICAgICAgICAgICAgICAgICAgICAgICBjaCA9IG5leHRDaGFyKCk7CisgICAgICAgICAgICAgICAgICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoKGNoYXIpIGNoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gQ2hlY2sgZW5kIG9mIHF1b3RlLCBza2lwIGNsb3NpbmcgcXVvdGU6CisgICAgICAgICAgICAgICAgaWYgKGNoID09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcihtYXJrKCksICJqc3AuZXJyb3IucXVvdGVzLnVudGVybWluYXRlZCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKG1hcmsoKSwgImpzcC5lcnJvci5hdHRyLnF1b3RlZCIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCFpc0RlbGltaXRlcigpKSB7CisgICAgICAgICAgICAgICAgLy8gUmVhZCB2YWx1ZSB1bnRpbCBkZWxpbWl0ZXIgaXMgZm91bmQ6CisgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICBjaCA9IG5leHRDaGFyKCk7CisgICAgICAgICAgICAgICAgICAgIC8vIFRha2UgY2FyZSBvZiB0aGUgcXVvdGluZyBoZXJlLgorICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJ1xcJykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBlZWtDaGFyKCkgPT0gJyInIHx8IHBlZWtDaGFyKCkgPT0gJ1wnJyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlZWtDaGFyKCkgPT0gJz4nIHx8IHBlZWtDaGFyKCkgPT0gJyUnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoID0gbmV4dENoYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKChjaGFyKSBjaCk7CisgICAgICAgICAgICAgICAgfSB3aGlsZSAoIWlzRGVsaW1pdGVyKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHN0cmluZ0J1ZmZlci50b1N0cmluZygpOworICAgIH0KKworICAgIHZvaWQgc2V0U2luZ2xlRmlsZShib29sZWFuIHZhbCkgeworICAgICAgICBzaW5nbGVGaWxlID0gdmFsOworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgVVJMIGZvciB0aGUgZ2l2ZW4gcGF0aCBuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIHBhdGggUGF0aCBuYW1lCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFVSTCBmb3IgdGhlIGdpdmVuIHBhdGggbmFtZS4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGlmIHRoZSBwYXRoIG5hbWUgaXMgbm90IGdpdmVuIGluIAorICAgICAqIHRoZSBjb3JyZWN0IGZvcm0KKyAgICAgKi8KKyAgICBVUkwgZ2V0UmVzb3VyY2UoU3RyaW5nIHBhdGgpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gY29udGV4dC5nZXRSZXNvdXJjZShwYXRoKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFBhcnNlIHV0aWxzIC0gSXMgY3VycmVudCBjaGFyYWN0ZXIgYSB0b2tlbiBkZWxpbWl0ZXIgPworICAgICAqIERlbGltaXRlcnMgYXJlIGN1cnJlbnRseSBkZWZpbmVkIHRvIGJlID0sICZndDssICZsdDssICIsIGFuZCAnIG9yIGFueQorICAgICAqIGFueSBzcGFjZSBjaGFyYWN0ZXIgYXMgZGVmaW5lZCBieSA8Y29kZT5pc1NwYWNlPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gQSBib29sZWFuLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBpc0RlbGltaXRlcigpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICBpZiAoISBpc1NwYWNlKCkpIHsKKyAgICAgICAgICAgIGludCBjaCA9IHBlZWtDaGFyKCk7CisgICAgICAgICAgICAvLyBMb29rIGZvciBhIHNpbmdsZS1jaGFyIHdvcmsgZGVsaW1pdGVyOgorICAgICAgICAgICAgaWYgKGNoID09ICc9JyB8fCBjaCA9PSAnPicgfHwgY2ggPT0gJyInIHx8IGNoID09ICdcJycKKyAgICAgICAgICAgICAgICAgICAgfHwgY2ggPT0gJy8nKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBMb29rIGZvciBhbiBlbmQtb2YtY29tbWVudCBvciBlbmQtb2YtdGFnOiAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChjaCA9PSAnLScpIHsKKyAgICAgICAgICAgICAgICBNYXJrIG1hcmsgPSBtYXJrKCk7CisgICAgICAgICAgICAgICAgaWYgKCgoY2ggPSBuZXh0Q2hhcigpKSA9PSAnPicpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKGNoID09ICctJykgJiYgKG5leHRDaGFyKCkgPT0gJz4nKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzZXQobWFyayk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJlc2V0KG1hcmspOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlciBhIG5ldyBzb3VyY2UgZmlsZS4KKyAgICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGltcGxlbWVudCBmaWxlIGluY2x1c2lvbi4gRWFjaCBpbmNsdWRlZCBmaWxlCisgICAgICogZ2V0cyBhIHVuaXF1ZSBpZGVudGlmaWVyICh3aGljaCBpcyB0aGUgaW5kZXggaW4gdGhlIGFycmF5IG9mIHNvdXJjZQorICAgICAqIGZpbGVzKS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGluZGV4IG9mIHRoZSBub3cgcmVnaXN0ZXJlZCBmaWxlLgorICAgICAqLworICAgIHByaXZhdGUgaW50IHJlZ2lzdGVyU291cmNlRmlsZShTdHJpbmcgZmlsZSkgeworICAgICAgICBpZiAoc291cmNlRmlsZXMuY29udGFpbnMoZmlsZSkpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIHNvdXJjZUZpbGVzLmFkZEVsZW1lbnQoZmlsZSk7CisgICAgICAgIHRoaXMuc2l6ZSsrOworICAgICAgICByZXR1cm4gc291cmNlRmlsZXMuc2l6ZSgpIC0gMTsKKyAgICB9CisgICAgCisKKyAgICAvKioKKyAgICAgKiBVbnJlZ2lzdGVyIHRoZSBzb3VyY2UgZmlsZS4KKyAgICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGltcGxlbWVudCBmaWxlIGluY2x1c2lvbi4gRWFjaCBpbmNsdWRlZCBmaWxlCisgICAgICogZ2V0cyBhIHVuaXEgaWRlbnRpZmllciAod2hpY2ggaXMgdGhlIGluZGV4IGluIHRoZSBhcnJheSBvZiBzb3VyY2UKKyAgICAgKiBmaWxlcykuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBpbmRleCBvZiB0aGUgbm93IHJlZ2lzdGVyZWQgZmlsZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCB1bnJlZ2lzdGVyU291cmNlRmlsZShTdHJpbmcgZmlsZSkgeworICAgICAgICBpZiAoIXNvdXJjZUZpbGVzLmNvbnRhaW5zKGZpbGUpKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBzb3VyY2VGaWxlcy5yZW1vdmVFbGVtZW50KGZpbGUpOworICAgICAgICB0aGlzLnNpemUtLTsKKyAgICAgICAgcmV0dXJuIHNvdXJjZUZpbGVzLnNpemUoKSAtIDE7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHVzaCBhIGZpbGUgKGFuZCBpdHMgYXNzb2NpYXRlZCBTdHJlYW0pIG9uIHRoZSBmaWxlIHN0YWNrLiAgVEhlCisgICAgICogY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgY3VycmVudCBmaWxlIGlzIHJlbWVtYmVyZWQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHB1c2hGaWxlKFN0cmluZyBmaWxlLCBTdHJpbmcgZW5jb2RpbmcsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW1SZWFkZXIgcmVhZGVyKSAKKyAgICAgICAgICAgICAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24geworCisgICAgICAgIC8vIFJlZ2lzdGVyIHRoZSBmaWxlCisgICAgICAgIFN0cmluZyBsb25nTmFtZSA9IGZpbGU7CisKKyAgICAgICAgaW50IGZpbGVpZCA9IHJlZ2lzdGVyU291cmNlRmlsZShsb25nTmFtZSk7CisKKyAgICAgICAgaWYgKGZpbGVpZCA9PSAtMSkgeworICAgICAgICAgICAgZXJyLmpzcEVycm9yKCJqc3AuZXJyb3IuZmlsZS5hbHJlYWR5LnJlZ2lzdGVyZWQiLCBmaWxlKTsKKyAgICAgICAgfQorCisgICAgICAgIGN1cnJGaWxlSWQgPSBmaWxlaWQ7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENoYXJBcnJheVdyaXRlciBjYXcgPSBuZXcgQ2hhckFycmF5V3JpdGVyKCk7CisgICAgICAgICAgICBjaGFyIGJ1ZltdID0gbmV3IGNoYXJbMTAyNF07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMCA7IChpID0gcmVhZGVyLnJlYWQoYnVmKSkgIT0gLTEgOykKKyAgICAgICAgICAgICAgICBjYXcud3JpdGUoYnVmLCAwLCBpKTsKKyAgICAgICAgICAgIGNhdy5jbG9zZSgpOworICAgICAgICAgICAgaWYgKGN1cnJlbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBuZXcgTWFyayh0aGlzLCBjYXcudG9DaGFyQXJyYXkoKSwgZmlsZWlkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RmlsZShmaWxlaWQpLCBtYXN0ZXIsIGVuY29kaW5nKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY3VycmVudC5wdXNoU3RyZWFtKGNhdy50b0NoYXJBcnJheSgpLCBmaWxlaWQsIGdldEZpbGUoZmlsZWlkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZ05hbWUsIGVuY29kaW5nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGV4KSB7CisgICAgICAgICAgICBsb2cuZXJyb3IoIkV4Y2VwdGlvbiBwYXJzaW5nIGZpbGUgIiwgZXgpOworICAgICAgICAgICAgLy8gUG9wIHN0YXRlIGJlaW5nIGNvbnN0cnVjdGVkOgorICAgICAgICAgICAgcG9wRmlsZSgpOworICAgICAgICAgICAgZXJyLmpzcEVycm9yKCJqc3AuZXJyb3IuZmlsZS5jYW5ub3QucmVhZCIsIGZpbGUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKHJlYWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcmVhZGVyLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGFueSkge30KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFBvcCBhIGZpbGUgZnJvbSB0aGUgZmlsZSBzdGFjay4gIFRoZSBmaWVsZCAiY3VycmVudCIgaXMgcmV0b3JlZAorICAgICAqIHRvIHRoZSB2YWx1ZSB0byBwb2ludCB0byB0aGUgcHJldmlvdXMgZmlsZXMsIGlmIGFueSwgYW5kIGlzIHNldAorICAgICAqIHRvIG51bGwgb3RoZXJ3aXNlLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpcyB0aGVyZSBpcyBhIHByZXZpb3VzIGZpbGUgb24gdGhlIHN0Y2suCisgICAgICogICAgICAgICBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHBvcEZpbGUoKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBJcyBzdGFjayBjcmVhdGVkID8gKHdpbGwgaGFwcGVuIGlmIHRoZSBKc3AgZmlsZSB3ZSdyZSBsb29raW5nIGF0IGlzCisgICAgICAgIC8vIG1pc3NpbmcuCisgICAgICAgIGlmIChjdXJyZW50ID09IG51bGwgfHwgY3VyckZpbGVJZCA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlc3RvcmUgcGFyc2VyIHN0YXRlOgorICAgICAgICBTdHJpbmcgZk5hbWUgPSBnZXRGaWxlKGN1cnJGaWxlSWQpOworICAgICAgICBjdXJyRmlsZUlkID0gdW5yZWdpc3RlclNvdXJjZUZpbGUoZk5hbWUpOworICAgICAgICBpZiAoY3VyckZpbGVJZCA8IC0xKSB7CisgICAgICAgICAgICBlcnIuanNwRXJyb3IoImpzcC5lcnJvci5maWxlLm5vdC5yZWdpc3RlcmVkIiwgZk5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgTWFyayBwcmV2aW91cyA9IGN1cnJlbnQucG9wU3RyZWFtKCk7CisgICAgICAgIGlmIChwcmV2aW91cyAhPSBudWxsKSB7CisgICAgICAgICAgICBtYXN0ZXIgPSBjdXJyZW50LmJhc2VEaXI7CisgICAgICAgICAgICBjdXJyZW50ID0gcHJldmlvdXM7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICAvLyBOb3RlIHRoYXQgYWx0aG91Z2ggdGhlIGN1cnJlbnQgZmlsZSBpcyB1bmRlZmluZWQgaGVyZSwgImN1cnJlbnQiCisgICAgICAgIC8vIGlzIG5vdCBzZXQgdG8gbnVsbCBqdXN0IGZvciBjb252aWVuY2UsIGZvciBpdCBtYXliZSB1c2VkIHRvCisgICAgICAgIC8vIHNldCB0aGUgY3VycmVudCAodW5kZWZpbmVkKSBwb3NpdGlvbi4KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL2NvbXBpbGVyL0pzcFJ1bnRpbWVDb250ZXh0LmphdmEgYi9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvSnNwUnVudGltZUNvbnRleHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmU5OTJhCi0tLSAvZGV2L251bGwKKysrIGIvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL2NvbXBpbGVyL0pzcFJ1bnRpbWVDb250ZXh0LmphdmEKQEAgLTAsMCArMSw1MjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphc3Blci5jb21waWxlcjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVQZXJtaXNzaW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkNvZGVTb3VyY2U7CitpbXBvcnQgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlBvbGljeTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGU7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC5Kc3BGYWN0b3J5OworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLkpzcENvbXBpbGF0aW9uQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5PcHRpb25zOworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLnV0aWwuU3lzdGVtTG9nSGFuZGxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5ydW50aW1lLkpzcEZhY3RvcnlJbXBsOworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLnNlY3VyaXR5LlNlY3VyaXR5Q2xhc3NMb2FkOworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLnNlcnZsZXQuSnNwU2VydmxldFdyYXBwZXI7CisKKy8qKgorICogQ2xhc3MgZm9yIHRyYWNraW5nIEpTUCBjb21waWxlIHRpbWUgZmlsZSBkZXBlbmRlbmNpZXMgd2hlbiB0aGUKKyAqICYwNjA7JUBpbmNsdWRlIGZpbGU9Ii4uLiIlJjA2MjsgZGlyZWN0aXZlIGlzIHVzZWQuCisgKgorICogQSBiYWNrZ3JvdW5kIHRocmVhZCBwZXJpb2RpY2FsbHkgY2hlY2tzIHRoZSBmaWxlcyBhIEpTUCBwYWdlCisgKiBpcyBkZXBlbmRlbnQgdXBvbi4gIElmIGEgZHBlbmRlbnQgZmlsZSBjaGFuZ2VzIHRoZSBKU1AgcGFnZQorICogd2hpY2ggaW5jbHVkZWQgaXQgaXMgcmVjb21waWxlZC4KKyAqCisgKiBPbmx5IHVzZWQgaWYgYSB3ZWIgYXBwbGljYXRpb24gY29udGV4dCBpcyBhIGRpcmVjdG9yeS4KKyAqCisgKiBAYXV0aG9yIEdsZW5uIEwuIE5pZWxzZW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEpzcFJ1bnRpbWVDb250ZXh0IGltcGxlbWVudHMgUnVubmFibGUgeworCisgICAgLy8gTG9nZ2VyCisgICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEpzcFJ1bnRpbWVDb250ZXh0LmNsYXNzKTsKKworICAgIC8qCisgICAgICogQ291bnRzIGhvdyBtYW55IHRpbWVzIHRoZSB3ZWJhcHAncyBKU1BzIGhhdmUgYmVlbiByZWxvYWRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBqc3BSZWxvYWRDb3VudDsKKworICAgIC8qKgorICAgICAqIFByZWxvYWQgY2xhc3NlcyByZXF1aXJlZCBhdCBydW50aW1lIGJ5IGEgSlNQIHNlcnZsZXQgc28gdGhhdAorICAgICAqIHdlIGRvbid0IGdldCBhIGRlZmluZUNsYXNzSW5QYWNrYWdlIHNlY3VyaXR5IGV4Y2VwdGlvbi4KKyAgICAgKi8KKyAgICBzdGF0aWMgeworICAgICAgICBKc3BGYWN0b3J5SW1wbCBmYWN0b3J5ID0gbmV3IEpzcEZhY3RvcnlJbXBsKCk7CisgICAgICAgIFNlY3VyaXR5Q2xhc3NMb2FkLnNlY3VyaXR5Q2xhc3NMb2FkKGZhY3RvcnkuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKTsKKyAgICAgICAgSnNwRmFjdG9yeS5zZXREZWZhdWx0RmFjdG9yeShmYWN0b3J5KTsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIEpzcFJ1bnRpbWVDb250ZXh0IGZvciBhIHdlYiBhcHBsaWNhdGlvbiBjb250ZXh0LgorICAgICAqCisgICAgICogTG9hZHMgaW4gYW55IHByZXZpb3VzbHkgZ2VuZXJhdGVkIGRlcGVuZGVuY2llcyBmcm9tIGZpbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBTZXJ2bGV0Q29udGV4dCBmb3Igd2ViIGFwcGxpY2F0aW9uCisgICAgICovCisgICAgcHVibGljIEpzcFJ1bnRpbWVDb250ZXh0KFNlcnZsZXRDb250ZXh0IGNvbnRleHQsIE9wdGlvbnMgb3B0aW9ucykgeworCisgICAgICAgIFN5c3RlbS5zZXRFcnIobmV3IFN5c3RlbUxvZ0hhbmRsZXIoU3lzdGVtLmVycikpOworCisgICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CisKKyAgICAgICAgLy8gR2V0IHRoZSBwYXJlbnQgY2xhc3MgbG9hZGVyCisgICAgICAgIHBhcmVudENsYXNzTG9hZGVyID0KKyAgICAgICAgICAgIChVUkxDbGFzc0xvYWRlcikgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKKyAgICAgICAgaWYgKHBhcmVudENsYXNzTG9hZGVyID09IG51bGwpIHsKKyAgICAgICAgICAgIHBhcmVudENsYXNzTG9hZGVyID0KKyAgICAgICAgICAgICAgICAoVVJMQ2xhc3NMb2FkZXIpdGhpcy5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCk7CisgICAgICAgIH0KKworCWlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworCSAgICBpZiAocGFyZW50Q2xhc3NMb2FkZXIgIT0gbnVsbCkgeworCQlsb2cuZGVidWcoTG9jYWxpemVyLmdldE1lc3NhZ2UoImpzcC5tZXNzYWdlLnBhcmVudF9jbGFzc19sb2FkZXJfaXMiLAorCQkJCQkgICAgICAgcGFyZW50Q2xhc3NMb2FkZXIudG9TdHJpbmcoKSkpOworCSAgICB9IGVsc2UgeworCQlsb2cuZGVidWcoTG9jYWxpemVyLmdldE1lc3NhZ2UoImpzcC5tZXNzYWdlLnBhcmVudF9jbGFzc19sb2FkZXJfaXMiLAorCQkJCQkgICAgICAgIjxub25lPiIpKTsKKwkgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaW5pdENsYXNzUGF0aCgpOworCisJaWYgKGNvbnRleHQgaW5zdGFuY2VvZiBvcmcuYXBhY2hlLmphc3Blci5zZXJ2bGV0LkpzcENTZXJ2bGV0Q29udGV4dCkgeworCSAgICByZXR1cm47CisJfQorCisgICAgICAgIGlmIChTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgaW5pdFNlY3VyaXR5KCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBJZiB0aGlzIHdlYiBhcHBsaWNhdGlvbiBjb250ZXh0IGlzIHJ1bm5pbmcgZnJvbSBhCisgICAgICAgIC8vIGRpcmVjdG9yeSwgc3RhcnQgdGhlIGJhY2tncm91bmQgY29tcGlsYXRpb24gdGhyZWFkCisgICAgICAgIFN0cmluZyBhcHBCYXNlID0gY29udGV4dC5nZXRSZWFsUGF0aCgiLyIpOyAgICAgICAgIAorICAgICAgICBpZiAoIW9wdGlvbnMuZ2V0RGV2ZWxvcG1lbnQoKQorICAgICAgICAgICAgICAgICYmIGFwcEJhc2UgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmIG9wdGlvbnMuZ2V0UmVsb2FkaW5nKCkgKSB7CisgICAgICAgICAgICBpZiAoYXBwQmFzZS5lbmRzV2l0aChGaWxlLnNlcGFyYXRvcikgKSB7CisgICAgICAgICAgICAgICAgYXBwQmFzZSA9IGFwcEJhc2Uuc3Vic3RyaW5nKDAsYXBwQmFzZS5sZW5ndGgoKS0xKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0cmluZyBkaXJlY3RvcnkgPQorICAgICAgICAgICAgICAgIGFwcEJhc2Uuc3Vic3RyaW5nKGFwcEJhc2UubGFzdEluZGV4T2YoRmlsZS5zZXBhcmF0b3IpKTsKKyAgICAgICAgICAgIHRocmVhZE5hbWUgPSB0aHJlYWROYW1lICsgIlsiICsgZGlyZWN0b3J5ICsgIl0iOworICAgICAgICAgICAgdGhyZWFkU3RhcnQoKTsKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKyAgICAvKioKKyAgICAgKiBUaGlzIHdlYiBhcHBsaWNhdGlvbnMgU2VydmxldENvbnRleHQKKyAgICAgKi8KKyAgICBwcml2YXRlIFNlcnZsZXRDb250ZXh0IGNvbnRleHQ7CisgICAgcHJpdmF0ZSBPcHRpb25zIG9wdGlvbnM7CisgICAgcHJpdmF0ZSBVUkxDbGFzc0xvYWRlciBwYXJlbnRDbGFzc0xvYWRlcjsKKyAgICBwcml2YXRlIFBlcm1pc3Npb25Db2xsZWN0aW9uIHBlcm1pc3Npb25Db2xsZWN0aW9uOworICAgIHByaXZhdGUgQ29kZVNvdXJjZSBjb2RlU291cmNlOyAgICAgICAgICAgICAgICAgICAgCisgICAgcHJpdmF0ZSBTdHJpbmcgY2xhc3NwYXRoOworCisgICAgLyoqCisgICAgICogTWFwcyBKU1AgcGFnZXMgdG8gdGhlaXIgSnNwU2VydmxldFdyYXBwZXIncworICAgICAqLworICAgIHByaXZhdGUgTWFwIGpzcHMgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRNYXAoIG5ldyBIYXNoTWFwKCkpOworIAorCisgICAgLyoqCisgICAgICogVGhlIGJhY2tncm91bmQgdGhyZWFkLgorICAgICAqLworICAgIHByaXZhdGUgVGhyZWFkIHRocmVhZCA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBiYWNrZ3JvdW5kIHRocmVhZCBjb21wbGV0aW9uIHNlbWFwaG9yZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gdGhyZWFkRG9uZSA9IGZhbHNlOworCisKKyAgICAvKioKKyAgICAgKiBOYW1lIHRvIHJlZ2lzdGVyIGZvciB0aGUgYmFja2dyb3VuZCB0aHJlYWQuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgdGhyZWFkTmFtZSA9ICJKc3BSdW50aW1lQ29udGV4dCI7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworICAgIC8qKgorICAgICAqIEFkZCBhIG5ldyBKc3BTZXJ2bGV0V3JhcHBlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBqc3BVcmkgSlNQIFVSSQorICAgICAqIEBwYXJhbSBqc3cgU2VydmxldCB3cmFwcGVyIGZvciBKU1AKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRXcmFwcGVyKFN0cmluZyBqc3BVcmksIEpzcFNlcnZsZXRXcmFwcGVyIGpzdykgeworICAgICAgICBqc3BzLnJlbW92ZShqc3BVcmkpOworICAgICAgICBqc3BzLnB1dChqc3BVcmksanN3KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYW4gYWxyZWFkeSBleGlzdGluZyBKc3BTZXJ2bGV0V3JhcHBlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBqc3BVcmkgSlNQIFVSSQorICAgICAqIEByZXR1cm4gSnNwU2VydmxldFdyYXBwZXIgZm9yIEpTUAorICAgICAqLworICAgIHB1YmxpYyBKc3BTZXJ2bGV0V3JhcHBlciBnZXRXcmFwcGVyKFN0cmluZyBqc3BVcmkpIHsKKyAgICAgICAgcmV0dXJuIChKc3BTZXJ2bGV0V3JhcHBlcikganNwcy5nZXQoanNwVXJpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSAgSnNwU2VydmxldFdyYXBwZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0ganNwVXJpIEpTUCBVUkkgb2YgSnNwU2VydmxldFdyYXBwZXIgdG8gcmVtb3ZlCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlV3JhcHBlcihTdHJpbmcganNwVXJpKSB7CisgICAgICAgIGpzcHMucmVtb3ZlKGpzcFVyaSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIEpTUHMgZm9yIHdoaWNoIEpzcFNlcnZsZXRXcmFwcGVycyBleGlzdCwgaS5lLiwKKyAgICAgKiB0aGUgbnVtYmVyIG9mIEpTUHMgdGhhdCBoYXZlIGJlZW4gbG9hZGVkIGludG8gdGhlIHdlYmFwcC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBKU1BzIHRoYXQgaGF2ZSBiZWVuIGxvYWRlZCBpbnRvIHRoZSB3ZWJhcHAKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEpzcENvdW50KCkgeworICAgICAgICByZXR1cm4ganNwcy5zaXplKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBTZWN1cml0eU1hbmFnZXIgUG9saWN5IENvZGVTb3VyY2UgZm9yIHRoaXMgd2ViCisgICAgICogYXBwbGljYWl0b24gY29udGV4dC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gQ29kZVNvdXJjZSBmb3IgSlNQCisgICAgICovCisgICAgcHVibGljIENvZGVTb3VyY2UgZ2V0Q29kZVNvdXJjZSgpIHsKKyAgICAgICAgcmV0dXJuIGNvZGVTb3VyY2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBwYXJlbnQgVVJMQ2xhc3NMb2FkZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFVSTENsYXNzTG9hZGVyIHBhcmVudAorICAgICAqLworICAgIHB1YmxpYyBVUkxDbGFzc0xvYWRlciBnZXRQYXJlbnRDbGFzc0xvYWRlcigpIHsKKyAgICAgICAgcmV0dXJuIHBhcmVudENsYXNzTG9hZGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgU2VjdXJpdHlNYW5hZ2VyIFBlcm1pc3Npb25Db2xsZWN0aW9uIGZvciB0aGlzCisgICAgICogd2ViIGFwcGxpY2F0aW9uIGNvbnRleHQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFBlcm1pc3Npb25Db2xsZWN0aW9uIHBlcm1pc3Npb25zCisgICAgICovCisgICAgcHVibGljIFBlcm1pc3Npb25Db2xsZWN0aW9uIGdldFBlcm1pc3Npb25Db2xsZWN0aW9uKCkgeworICAgICAgICByZXR1cm4gcGVybWlzc2lvbkNvbGxlY3Rpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJvY2VzcyBhICJkZXN0b3J5IiBldmVudCBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24gY29udGV4dC4KKyAgICAgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3koKSB7CisKKyAgICAgICAgaWYoU3lzdGVtLmVyciBpbnN0YW5jZW9mIFN5c3RlbUxvZ0hhbmRsZXIpCisgICAgICAgICAgICBTeXN0ZW0uc2V0RXJyKCgoU3lzdGVtTG9nSGFuZGxlcilTeXN0ZW0uZXJyKS5nZXRXcmFwcGVkKCkpOworCisgICAgICAgIHRocmVhZFN0b3AoKTsKKworICAgICAgICBJdGVyYXRvciBzZXJ2bGV0cyA9IGpzcHMudmFsdWVzKCkuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKHNlcnZsZXRzLmhhc05leHQoKSkgeworICAgICAgICAgICAgKChKc3BTZXJ2bGV0V3JhcHBlcikgc2VydmxldHMubmV4dCgpKS5kZXN0cm95KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmNyZW1lbnRzIHRoZSBKU1AgcmVsb2FkIGNvdW50ZXIuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGluY3JlbWVudEpzcFJlbG9hZENvdW50KCkgeworICAgICAgICBqc3BSZWxvYWRDb3VudCsrOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc2V0cyB0aGUgSlNQIHJlbG9hZCBjb3VudGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGNvdW50IFZhbHVlIHRvIHdoaWNoIHRvIHJlc2V0IHRoZSBKU1AgcmVsb2FkIGNvdW50ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0SnNwUmVsb2FkQ291bnQoaW50IGNvdW50KSB7CisgICAgICAgIHRoaXMuanNwUmVsb2FkQ291bnQgPSBjb3VudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBKU1AgcmVsb2FkIGNvdW50ZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBKU1AgcmVsb2FkIGNvdW50ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEpzcFJlbG9hZENvdW50KCkgeworICAgICAgICByZXR1cm4ganNwUmVsb2FkQ291bnQ7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcml2YXRlIE1ldGhvZHMKKworICAgIC8qKgorICAgICAqIE1ldGhvZCB1c2VkIGJ5IGJhY2tncm91bmQgdGhyZWFkIHRvIGNoZWNrIHRoZSBKU1AgZGVwZW5kZW5jaWVzCisgICAgICogcmVnaXN0ZXJlZCB3aXRoIHRoaXMgY2xhc3MgZm9yIEpTUCdzLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBjaGVja0NvbXBpbGUoKSB7CisgICAgICAgIE9iamVjdCBbXSB3cmFwcGVycyA9IGpzcHMudmFsdWVzKCkudG9BcnJheSgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHdyYXBwZXJzLmxlbmd0aDsgaSsrICkgeworICAgICAgICAgICAgSnNwU2VydmxldFdyYXBwZXIganN3ID0gKEpzcFNlcnZsZXRXcmFwcGVyKXdyYXBwZXJzW2ldOworICAgICAgICAgICAgSnNwQ29tcGlsYXRpb25Db250ZXh0IGN0eHQgPSBqc3cuZ2V0SnNwRW5naW5lQ29udGV4dCgpOworICAgICAgICAgICAgLy8gSnNwU2VydmxldFdyYXBwZXIgYWxzbyBzeW5jaHJvbml6ZXMgb24gdGhpcyB3aGVuCisgICAgICAgICAgICAvLyBpdCBkZXRlY3RzIGl0IGhhcyB0byBkbyBhIHJlbG9hZAorICAgICAgICAgICAgc3luY2hyb25pemVkKGpzdykgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGN0eHQuY29tcGlsZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICBjdHh0LmluY3JlbWVudFJlbW92ZWQoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgICAgICBqc3cuZ2V0U2VydmxldENvbnRleHQoKS5sb2coIkJhY2tncm91bmQgY29tcGlsZSBmYWlsZWQiLAorCQkJCQkJdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGNsYXNzcGF0aCB0aGF0IGlzIHBhc3NlZCBvZmYgdG8gdGhlIEphdmEgY29tcGlsZXIuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDbGFzc1BhdGgoKSB7CisgICAgICAgIHJldHVybiBjbGFzc3BhdGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWV0aG9kIHVzZWQgdG8gaW5pdGlhbGl6ZSBjbGFzc3BhdGggZm9yIGNvbXBpbGVzLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBpbml0Q2xhc3NQYXRoKCkgeworCisgICAgICAgIFVSTCBbXSB1cmxzID0gcGFyZW50Q2xhc3NMb2FkZXIuZ2V0VVJMcygpOworICAgICAgICBTdHJpbmdCdWZmZXIgY3BhdGggPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIFN0cmluZyBzZXAgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInBhdGguc2VwYXJhdG9yIik7CisKKyAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IHVybHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIC8vIFRvbWNhdCA0IGNhbiB1c2UgVVJMJ3Mgb3RoZXIgdGhhbiBmaWxlIFVSTCdzLAorICAgICAgICAgICAgLy8gYSBwcm90b2NvbCBvdGhlciB0aGFuIGZpbGU6IHdpbGwgZ2VuZXJhdGUgYQorICAgICAgICAgICAgLy8gYmFkIGZpbGUgc3lzdGVtIHBhdGgsIHNvIG9ubHkgYWRkIGZpbGU6CisgICAgICAgICAgICAvLyBwcm90b2NvbCBVUkwncyB0byB0aGUgY2xhc3NwYXRoLgorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiggdXJsc1tpXS5nZXRQcm90b2NvbCgpLmVxdWFscygiZmlsZSIpICkgeworICAgICAgICAgICAgICAgIGNwYXRoLmFwcGVuZCgoU3RyaW5nKXVybHNbaV0uZ2V0RmlsZSgpK3NlcCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gICAgCisKKwljcGF0aC5hcHBlbmQob3B0aW9ucy5nZXRTY3JhdGNoRGlyKCkgKyBzZXApOworCisgICAgICAgIFN0cmluZyBjcCA9IChTdHJpbmcpIGNvbnRleHQuZ2V0QXR0cmlidXRlKENvbnN0YW50cy5TRVJWTEVUX0NMQVNTUEFUSCk7CisgICAgICAgIGlmIChjcCA9PSBudWxsIHx8IGNwLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgIGNwID0gb3B0aW9ucy5nZXRDbGFzc1BhdGgoKTsKKyAgICAgICAgfQorCisgICAgICAgIGNsYXNzcGF0aCA9IGNwYXRoLnRvU3RyaW5nKCkgKyBjcDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNZXRob2QgdXNlZCB0byBpbml0aWFsaXplIFNlY3VyaXR5TWFuYWdlciBkYXRhLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBpbml0U2VjdXJpdHkoKSB7CisKKyAgICAgICAgLy8gU2V0dXAgdGhlIFBlcm1pc3Npb25Db2xsZWN0aW9uIGZvciB0aGlzIHdlYiBhcHAgY29udGV4dAorICAgICAgICAvLyBiYXNlZCBvbiB0aGUgcGVybWlzc2lvbnMgY29uZmlndXJlZCBmb3IgdGhlIHJvb3Qgb2YgdGhlCisgICAgICAgIC8vIHdlYiBhcHAgY29udGV4dCBkaXJlY3RvcnksIHRoZW4gYWRkIGEgZmlsZSByZWFkIHBlcm1pc3Npb24KKyAgICAgICAgLy8gZm9yIHRoYXQgZGlyZWN0b3J5LgorICAgICAgICBQb2xpY3kgcG9saWN5ID0gUG9saWN5LmdldFBvbGljeSgpOworICAgICAgICBpZiggcG9saWN5ICE9IG51bGwgKSB7CisgICAgICAgICAgICB0cnkgeyAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIHBlcm1pc3Npb25zIGZvciB0aGUgd2ViIGFwcCBjb250ZXh0CisgICAgICAgICAgICAgICAgU3RyaW5nIGRvY0Jhc2UgPSBjb250ZXh0LmdldFJlYWxQYXRoKCIvIik7CisgICAgICAgICAgICAgICAgaWYoIGRvY0Jhc2UgPT0gbnVsbCApIHsKKyAgICAgICAgICAgICAgICAgICAgZG9jQmFzZSA9IG9wdGlvbnMuZ2V0U2NyYXRjaERpcigpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFN0cmluZyBjb2RlQmFzZSA9IGRvY0Jhc2U7CisgICAgICAgICAgICAgICAgaWYgKCFjb2RlQmFzZS5lbmRzV2l0aChGaWxlLnNlcGFyYXRvcikpeworICAgICAgICAgICAgICAgICAgICBjb2RlQmFzZSA9IGNvZGVCYXNlICsgRmlsZS5zZXBhcmF0b3I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEZpbGUgY29udGV4dERpciA9IG5ldyBGaWxlKGNvZGVCYXNlKTsKKyAgICAgICAgICAgICAgICBVUkwgdXJsID0gY29udGV4dERpci5nZXRDYW5vbmljYWxGaWxlKCkudG9VUkwoKTsKKyAgICAgICAgICAgICAgICBjb2RlU291cmNlID0gbmV3IENvZGVTb3VyY2UodXJsLChDZXJ0aWZpY2F0ZVtdKW51bGwpOworICAgICAgICAgICAgICAgIHBlcm1pc3Npb25Db2xsZWN0aW9uID0gcG9saWN5LmdldFBlcm1pc3Npb25zKGNvZGVTb3VyY2UpOworCisgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgZmlsZSByZWFkIHBlcm1pc3Npb24gZm9yIHdlYiBhcHAgY29udGV4dCBkaXJlY3RvcnkKKyAgICAgICAgICAgICAgICBpZiAoIWRvY0Jhc2UuZW5kc1dpdGgoRmlsZS5zZXBhcmF0b3IpKXsKKyAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbkNvbGxlY3Rpb24uYWRkCisgICAgICAgICAgICAgICAgICAgICAgICAobmV3IEZpbGVQZXJtaXNzaW9uKGRvY0Jhc2UsInJlYWQiKSk7CisgICAgICAgICAgICAgICAgICAgIGRvY0Jhc2UgPSBkb2NCYXNlICsgRmlsZS5zZXBhcmF0b3I7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbkNvbGxlY3Rpb24uYWRkCisgICAgICAgICAgICAgICAgICAgICAgICAobmV3IEZpbGVQZXJtaXNzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRvY0Jhc2Uuc3Vic3RyaW5nKDAsZG9jQmFzZS5sZW5ndGgoKSAtIDEpLCJyZWFkIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkb2NCYXNlID0gZG9jQmFzZSArICItIjsKKyAgICAgICAgICAgICAgICBwZXJtaXNzaW9uQ29sbGVjdGlvbi5hZGQobmV3IEZpbGVQZXJtaXNzaW9uKGRvY0Jhc2UsInJlYWQiKSk7CisKKyAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBmaWxlIHJlYWQgcGVybWlzc2lvbiBmb3Igd2ViIGFwcCB0ZW1wZGlyICh3b3JrKQorICAgICAgICAgICAgICAgIC8vIGRpcmVjdG9yeQorICAgICAgICAgICAgICAgIFN0cmluZyB3b3JrRGlyID0gb3B0aW9ucy5nZXRTY3JhdGNoRGlyKCkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBpZiAoIXdvcmtEaXIuZW5kc1dpdGgoRmlsZS5zZXBhcmF0b3IpKXsKKyAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbkNvbGxlY3Rpb24uYWRkCisgICAgICAgICAgICAgICAgICAgICAgICAobmV3IEZpbGVQZXJtaXNzaW9uKHdvcmtEaXIsInJlYWQiKSk7CisgICAgICAgICAgICAgICAgICAgIHdvcmtEaXIgPSB3b3JrRGlyICsgRmlsZS5zZXBhcmF0b3I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdvcmtEaXIgPSB3b3JrRGlyICsgIi0iOworICAgICAgICAgICAgICAgIHBlcm1pc3Npb25Db2xsZWN0aW9uLmFkZChuZXcgRmlsZVBlcm1pc3Npb24od29ya0RpciwicmVhZCIpKTsKKworICAgICAgICAgICAgICAgIC8vIEFsbG93IHRoZSBKU1AgdG8gYWNjZXNzIG9yZy5hcGFjaGUuamFzcGVyLnJ1bnRpbWUuSHR0cEpzcEJhc2UKKyAgICAgICAgICAgICAgICBwZXJtaXNzaW9uQ29sbGVjdGlvbi5hZGQoIG5ldyBSdW50aW1lUGVybWlzc2lvbigKKyAgICAgICAgICAgICAgICAgICAgImFjY2Vzc0NsYXNzSW5QYWNrYWdlLm9yZy5hcGFjaGUuamFzcGVyLnJ1bnRpbWUiKSApOworCisgICAgICAgICAgICAgICAgaWYgKHBhcmVudENsYXNzTG9hZGVyIGluc3RhbmNlb2YgVVJMQ2xhc3NMb2FkZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgVVJMIFtdIHVybHMgPSBwYXJlbnRDbGFzc0xvYWRlci5nZXRVUkxzKCk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBqYXJVcmwgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgam5kaVVybCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTx1cmxzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoam5kaVVybCA9PSBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHVybHNbaV0udG9TdHJpbmcoKS5zdGFydHNXaXRoKCJqbmRpOiIpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpuZGlVcmwgPSB1cmxzW2ldLnRvU3RyaW5nKCkgKyAiLSI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoamFyVXJsID09IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgdXJsc1tpXS50b1N0cmluZygpLnN0YXJ0c1dpdGgoImphcjpqbmRpOiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphclVybCA9IHVybHNbaV0udG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXJVcmwgPSBqYXJVcmwuc3Vic3RyaW5nKDAsamFyVXJsLmxlbmd0aCgpIC0gMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgamFyVXJsID0gamFyVXJsLnN1YnN0cmluZygwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphclVybC5sYXN0SW5kZXhPZignLycpKSArICIvLSI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGphclVybCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9uQ29sbGVjdGlvbi5hZGQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlUGVybWlzc2lvbihqYXJVcmwsInJlYWQiKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9uQ29sbGVjdGlvbi5hZGQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlUGVybWlzc2lvbihqYXJVcmwuc3Vic3RyaW5nKDQpLCJyZWFkIikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChqbmRpVXJsICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9uQ29sbGVjdGlvbi5hZGQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlUGVybWlzc2lvbihqbmRpVXJsLCJyZWFkIikgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgY29udGV4dC5sb2coIlNlY3VyaXR5IEluaXQgZm9yIGNvbnRleHQgZmFpbGVkIixlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVGhyZWFkIFN1cHBvcnQKKworICAgIC8qKgorICAgICAqIFN0YXJ0IHRoZSBiYWNrZ3JvdW5kIHRocmVhZCB0aGF0IHdpbGwgcGVyaW9kaWNhbGx5IGNoZWNrIGZvcgorICAgICAqIGNoYW5nZXMgdG8gY29tcGlsZSB0aW1lIGluY2x1ZGVkIGZpbGVzIGluIGEgSlNQLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgd2Ugc2hvdWxkIG5vdCBiZSBzdGFydGluZworICAgICAqICBhIGJhY2tncm91bmQgdGhyZWFkIG5vdworICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHRocmVhZFN0YXJ0KCkgeworCisgICAgICAgIC8vIEhhcyB0aGUgYmFja2dyb3VuZCB0aHJlYWQgYWxyZWFkeSBiZWVuIHN0YXJ0ZWQ/CisgICAgICAgIGlmICh0aHJlYWQgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gU3RhcnQgdGhlIGJhY2tncm91bmQgdGhyZWFkCisgICAgICAgIHRocmVhZERvbmUgPSBmYWxzZTsKKyAgICAgICAgdGhyZWFkID0gbmV3IFRocmVhZCh0aGlzLCB0aHJlYWROYW1lKTsKKyAgICAgICAgdGhyZWFkLnNldERhZW1vbih0cnVlKTsKKyAgICAgICAgdGhyZWFkLnN0YXJ0KCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFN0b3AgdGhlIGJhY2tncm91bmQgdGhyZWFkIHRoYXQgaXMgcGVyaW9kaWNhbGx5IGNoZWNraW5nIGZvcgorICAgICAqIGNoYW5nZXMgdG8gY29tcGlsZSB0aW1lIGluY2x1ZGVkIGZpbGVzIGluIGEgSlNQLgorICAgICAqLyAKKyAgICBwcm90ZWN0ZWQgdm9pZCB0aHJlYWRTdG9wKCkgeworCisgICAgICAgIGlmICh0aHJlYWQgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgdGhyZWFkRG9uZSA9IHRydWU7CisgICAgICAgIHRocmVhZC5pbnRlcnJ1cHQoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRocmVhZC5qb2luKCk7CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgdGhyZWFkID0gbnVsbDsKKyAgICAgICAgCisgICAgfQorCisgICAgLyoqCisgICAgICogU2xlZXAgZm9yIHRoZSBkdXJhdGlvbiBzcGVjaWZpZWQgYnkgdGhlIDxjb2RlPmNoZWNrSW50ZXJ2YWw8L2NvZGU+CisgICAgICogcHJvcGVydHkuCisgICAgICovIAorICAgIHByb3RlY3RlZCB2b2lkIHRocmVhZFNsZWVwKCkgeworICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChvcHRpb25zLmdldENoZWNrSW50ZXJ2YWwoKSAqIDEwMDBMKTsKKyAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgOworICAgICAgICB9CisgICAgICAgIAorICAgIH0gICAKKyAgICAKKyAgICAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQmFja2dyb3VuZCBUaHJlYWQKKyAgICAgICAgCisgICAgICAgIAorICAgIC8qKgorICAgICAqIFRoZSBiYWNrZ3JvdW5kIHRocmVhZCB0aGF0IGNoZWNrcyBmb3IgY2hhbmdlcyB0byBmaWxlcworICAgICAqIGluY2x1ZGVkIGJ5IGEgSlNQIGFuZCBmbGFncyB0aGF0IGEgcmVjb21waWxlIGlzIHJlcXVpcmVkLgorICAgICAqLyAKKyAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgIAorICAgICAgICAvLyBMb29wIHVudGlsIHRoZSB0ZXJtaW5hdGlvbiBzZW1hcGhvcmUgaXMgc2V0CisgICAgICAgIHdoaWxlICghdGhyZWFkRG9uZSkgeworCisgICAgICAgICAgICAvLyBXYWl0IGZvciBvdXIgY2hlY2sgaW50ZXJ2YWwKKyAgICAgICAgICAgIHRocmVhZFNsZWVwKCk7CisKKyAgICAgICAgICAgIC8vIENoZWNrIGZvciBpbmNsdWRlZCBmaWxlcyB3aGljaCBhcmUgbmV3ZXIgdGhhbiB0aGUKKyAgICAgICAgICAgIC8vIEpTUCB3aGljaCB1c2VzIHRoZW0uCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNoZWNrQ29tcGlsZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICB0LnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL2NvbXBpbGVyL0pzcFV0aWwuamF2YSBiL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9Kc3BVdGlsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDlhMDk4ZQotLS0gL2Rldi9udWxsCisrKyBiL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9Kc3BVdGlsLmphdmEKQEAgLTAsMCArMSwxMTA4IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYXNwZXIuY29tcGlsZXI7CisKK2ltcG9ydCBqYXZhLmlvLkNoYXJBcnJheVdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwuamFyLkphckZpbGU7CitpbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLmVsLkVMRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLmVsLkVMUGFyc2VFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AuZWwuRnVuY3Rpb25NYXBwZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuZWwuRXhwcmVzc2lvbkV2YWx1YXRvckltcGw7CitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLkphc3BlckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5Kc3BDb21waWxhdGlvbkNvbnRleHQ7CitpbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKKworLyoqIAorICogVGhpcyBjbGFzcyBoYXMgYWxsIHRoZSB1dGlsaXR5IG1ldGhvZChzKS4KKyAqIElkZWFsbHkgc2hvdWxkIG1vdmUgYWxsIHRoZSBiZWFuIGNvbnRhaW5lcnMgaGVyZS4KKyAqCisgKiBAYXV0aG9yIE1hbmRhciBSYWplLgorICogQGF1dGhvciBSYWppdiBNb3JkYW5pLgorICogQGF1dGhvciBEYW5ubyBGZXJyaW4KKyAqIEBhdXRob3IgUGllcnJlIERlbGlzbGUKKyAqIEBhdXRob3IgU2hhd24gQmF5ZXJuCisgKiBAYXV0aG9yIE1hcmsgUm90aAorICovCitwdWJsaWMgY2xhc3MgSnNwVXRpbCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX0lORl9UQUdTID0gIi9XRUItSU5GL3RhZ3MvIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUQV9JTkZfVEFHUyA9ICIvTUVUQS1JTkYvdGFncy8iOworCisgICAgLy8gRGVsaW1pdGVycyBmb3IgcmVxdWVzdC10aW1lIGV4cHJlc3Npb25zIChKU1AgYW5kIFhNTCBzeW50YXgpCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9QRU5fRVhQUiAgPSAiPCU9IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xPU0VfRVhQUiA9ICIlPiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9QRU5fRVhQUl9YTUwgID0gIiU9IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xPU0VfRVhQUl9YTUwgPSAiJSI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgdGVtcFNlcXVlbmNlTnVtYmVyID0gMDsKKyAgICBwcml2YXRlIHN0YXRpYyBFeHByZXNzaW9uRXZhbHVhdG9ySW1wbCBleHByZXNzaW9uRXZhbHVhdG9yCisJPSBuZXcgRXhwcmVzc2lvbkV2YWx1YXRvckltcGwoKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBqYXZhS2V5d29yZHNbXSA9IHsKKyAgICAgICAgImFic3RyYWN0IiwgImFzc2VydCIsICJib29sZWFuIiwgImJyZWFrIiwgImJ5dGUiLCAiY2FzZSIsCisgICAgICAgICJjYXRjaCIsICJjaGFyIiwgImNsYXNzIiwgImNvbnN0IiwgImNvbnRpbnVlIiwKKyAgICAgICAgImRlZmF1bHQiLCAiZG8iLCAiZG91YmxlIiwgImVsc2UiLCAiZW51bSIsICJleHRlbmRzIiwKKyAgICAgICAgImZpbmFsIiwgImZpbmFsbHkiLCAiZmxvYXQiLCAiZm9yIiwgImdvdG8iLAorICAgICAgICAiaWYiLCAiaW1wbGVtZW50cyIsICJpbXBvcnQiLCAiaW5zdGFuY2VvZiIsICJpbnQiLAorICAgICAgICAiaW50ZXJmYWNlIiwgImxvbmciLCAibmF0aXZlIiwgIm5ldyIsICJwYWNrYWdlIiwKKyAgICAgICAgInByaXZhdGUiLCAicHJvdGVjdGVkIiwgInB1YmxpYyIsICJyZXR1cm4iLCAic2hvcnQiLAorICAgICAgICAic3RhdGljIiwgInN0cmljdGZwIiwgInN1cGVyIiwgInN3aXRjaCIsICJzeW5jaHJvbml6ZWQiLAorICAgICAgICAidGhpcyIsICJ0aHJvd3MiLCAidHJhbnNpZW50IiwgInRyeSIsICJ2b2lkIiwKKyAgICAgICAgInZvbGF0aWxlIiwgIndoaWxlIiB9OworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0hVTktTSVpFID0gMTAyNDsKKyAgICAgICAgCisgICAgcHVibGljIHN0YXRpYyBjaGFyW10gcmVtb3ZlUXVvdGVzKGNoYXIgW11jaGFycykgeworICAgICAgICBDaGFyQXJyYXlXcml0ZXIgY2F3ID0gbmV3IENoYXJBcnJheVdyaXRlcigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoYXJzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoY2hhcnNbaV0gPT0gJyUnICYmIGNoYXJzW2krMV0gPT0gJ1xcJyAmJgorICAgICAgICAgICAgICAgIGNoYXJzW2krMl0gPT0gJz4nKSB7CisgICAgICAgICAgICAgICAgY2F3LndyaXRlKCclJyk7CisgICAgICAgICAgICAgICAgY2F3LndyaXRlKCc+Jyk7CisgICAgICAgICAgICAgICAgaSA9IGkgKyAyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjYXcud3JpdGUoY2hhcnNbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBjYXcudG9DaGFyQXJyYXkoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNoYXJbXSBlc2NhcGVRdW90ZXMgKGNoYXIgW11jaGFycykgeworICAgICAgICAvLyBQcmVzY2FuIHRvIGNvbnZlcnQgJVw+IHRvICU+CisgICAgICAgIFN0cmluZyBzID0gbmV3IFN0cmluZyhjaGFycyk7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBpbnQgbiA9IHMuaW5kZXhPZigiJVxcPiIpOworICAgICAgICAgICAgaWYgKG4gPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihzLnN1YnN0cmluZygwLCBuKSk7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiU+Iik7CisgICAgICAgICAgICBzYi5hcHBlbmQocy5zdWJzdHJpbmcobiArIDMpKTsKKyAgICAgICAgICAgIHMgPSBzYi50b1N0cmluZygpOworICAgICAgICB9CisgICAgICAgIGNoYXJzID0gcy50b0NoYXJBcnJheSgpOworICAgICAgICByZXR1cm4gKGNoYXJzKTsKKworCisgICAgICAgIC8vIEVzY2FwZSBhbGwgYmFja3NsYXNoZXMgbm90IGluc2lkZSBhIEphdmEgc3RyaW5nIGxpdGVyYWwKKyAgICAgICAgLyoKKyAgICAgICAgQ2hhckFycmF5V3JpdGVyIGNhdyA9IG5ldyBDaGFyQXJyYXlXcml0ZXIoKTsKKyAgICAgICAgYm9vbGVhbiBpbkphdmFTdHJpbmcgPSBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGFycy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKGNoYXJzW2ldID09ICciJykgaW5KYXZhU3RyaW5nID0gIWluSmF2YVN0cmluZzsKKyAgICAgICAgICAgIC8vIGVzY2FwZSBvdXQgdGhlIGVzY2FwZSBjaGFyYWN0ZXIKKyAgICAgICAgICAgIGlmICghaW5KYXZhU3RyaW5nICYmIChjaGFyc1tpXSA9PSAnXFwnKSkgY2F3LndyaXRlKCdcXCcpOworICAgICAgICAgICAgY2F3LndyaXRlKGNoYXJzW2ldKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY2F3LnRvQ2hhckFycmF5KCk7CisgICAgICAgICovCisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2tzIGlmIHRoZSB0b2tlbiBpcyBhIHJ1bnRpbWUgZXhwcmVzc2lvbi4KKyAgICAgKiBJbiBzdGFuZGFyZCBKU1Agc3ludGF4LCBhIHJ1bnRpbWUgZXhwcmVzc2lvbiBzdGFydHMgd2l0aCAnPCUnIGFuZAorICAgICAqIGVuZHMgd2l0aCAnJT4nLiBXaGVuIHRoZSBKU1AgZG9jdW1lbnQgaXMgaW4gWE1MIHN5bnRheCwgYSBydW50aW1lCisgICAgICogZXhwcmVzc2lvbiBzdGFydHMgd2l0aCAnJT0nIGFuZCBlbmRzIHdpdGggJyUnLgorICAgICAqCisgICAgICogQHBhcmFtIHRva2VuIFRoZSB0b2tlbiB0byBiZSBjaGVja2VkCisgICAgICogcmV0dXJuIHdoZXRoZXIgdGhlIHRva2VuIGlzIGEgcnVudGltZSBleHByZXNzaW9uIG9yIG5vdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFeHByZXNzaW9uKFN0cmluZyB0b2tlbiwgYm9vbGVhbiBpc1htbCkgeworCVN0cmluZyBvcGVuRXhwcjsKKwlTdHJpbmcgY2xvc2VFeHByOworCWlmIChpc1htbCkgeworCSAgICBvcGVuRXhwciA9IE9QRU5fRVhQUl9YTUw7CisJICAgIGNsb3NlRXhwciA9IENMT1NFX0VYUFJfWE1MOworCX0gZWxzZSB7CisJICAgIG9wZW5FeHByID0gT1BFTl9FWFBSOworCSAgICBjbG9zZUV4cHIgPSBDTE9TRV9FWFBSOworCX0KKwlpZiAodG9rZW4uc3RhcnRzV2l0aChvcGVuRXhwcikgJiYgdG9rZW4uZW5kc1dpdGgoY2xvc2VFeHByKSkgeworCSAgICByZXR1cm4gdHJ1ZTsKKwl9IGVsc2UgeworCSAgICByZXR1cm4gZmFsc2U7CisJfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlICJleHByZXNzaW9uIiBwYXJ0IG9mIGEgcnVudGltZSBleHByZXNzaW9uLCAKKyAgICAgKiB0YWtpbmcgdGhlIGRlbGltaXRlcnMgb3V0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEV4cHIgKFN0cmluZyBleHByZXNzaW9uLCBib29sZWFuIGlzWG1sKSB7CisJU3RyaW5nIHJldHVyblN0cmluZzsKKwlTdHJpbmcgb3BlbkV4cHI7CisJU3RyaW5nIGNsb3NlRXhwcjsKKwlpZiAoaXNYbWwpIHsKKwkgICAgb3BlbkV4cHIgPSBPUEVOX0VYUFJfWE1MOworCSAgICBjbG9zZUV4cHIgPSBDTE9TRV9FWFBSX1hNTDsKKwl9IGVsc2UgeworCSAgICBvcGVuRXhwciA9IE9QRU5fRVhQUjsKKwkgICAgY2xvc2VFeHByID0gQ0xPU0VfRVhQUjsKKwl9CisJaW50IGxlbmd0aCA9IGV4cHJlc3Npb24ubGVuZ3RoKCk7CisJaWYgKGV4cHJlc3Npb24uc3RhcnRzV2l0aChvcGVuRXhwcikgJiYgCisgICAgICAgICAgICAgICAgZXhwcmVzc2lvbi5lbmRzV2l0aChjbG9zZUV4cHIpKSB7CisJICAgIHJldHVyblN0cmluZyA9IGV4cHJlc3Npb24uc3Vic3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5FeHByLmxlbmd0aCgpLCBsZW5ndGggLSBjbG9zZUV4cHIubGVuZ3RoKCkpOworCX0gZWxzZSB7CisJICAgIHJldHVyblN0cmluZyA9ICIiOworCX0KKwlyZXR1cm4gcmV0dXJuU3RyaW5nOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRha2VzIGEgcG90ZW50aWFsIGV4cHJlc3Npb24gYW5kIGNvbnZlcnRzIGl0IGludG8gWE1MIGZvcm0KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFeHBySW5YbWwoU3RyaW5nIGV4cHJlc3Npb24pIHsKKyAgICAgICAgU3RyaW5nIHJldHVyblN0cmluZzsKKyAgICAgICAgaW50IGxlbmd0aCA9IGV4cHJlc3Npb24ubGVuZ3RoKCk7CisKKyAgICAgICAgaWYgKGV4cHJlc3Npb24uc3RhcnRzV2l0aChPUEVOX0VYUFIpIAorICAgICAgICAgICAgICAgICYmIGV4cHJlc3Npb24uZW5kc1dpdGgoQ0xPU0VfRVhQUikpIHsKKyAgICAgICAgICAgIHJldHVyblN0cmluZyA9IGV4cHJlc3Npb24uc3Vic3RyaW5nICgxLCBsZW5ndGggLSAxKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVyblN0cmluZyA9IGV4cHJlc3Npb247CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZXNjYXBlWG1sKHJldHVyblN0cmluZy5yZXBsYWNlKENvbnN0YW50cy5FU0MsICckJykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrcyB0byBzZWUgaWYgdGhlIGdpdmVuIHNjb3BlIGlzIHZhbGlkLgorICAgICAqCisgICAgICogQHBhcmFtIHNjb3BlIFRoZSBzY29wZSB0byBiZSBjaGVja2VkCisgICAgICogQHBhcmFtIG4gVGhlIE5vZGUgY29udGFpbmluZyB0aGUgJ3Njb3BlJyBhdHRyaWJ1dGUgd2hvc2UgdmFsdWUgaXMgdG8gYmUKKyAgICAgKiBjaGVja2VkCisgICAgICogQHBhcmFtIGVyciBlcnJvciBkaXNwYXRjaGVyCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEphc3BlckV4Y2VwdGlvbiBpZiBzY29wZSBpcyBub3QgbnVsbCBhbmQgZGlmZmVyZW50IGZyb20KKyAgICAgKiAmcXVvdDtwYWdlJnF1b3Q7LCAmcXVvdDtyZXF1ZXN0JnF1b3Q7LCAmcXVvdDtzZXNzaW9uJnF1b3Q7LCBhbmQKKyAgICAgKiAmcXVvdDthcHBsaWNhdGlvbiZxdW90OworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjaGVja1Njb3BlKFN0cmluZyBzY29wZSwgTm9kZSBuLCBFcnJvckRpc3BhdGNoZXIgZXJyKQorICAgICAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJaWYgKHNjb3BlICE9IG51bGwgJiYgIXNjb3BlLmVxdWFscygicGFnZSIpICYmICFzY29wZS5lcXVhbHMoInJlcXVlc3QiKQorCQkmJiAhc2NvcGUuZXF1YWxzKCJzZXNzaW9uIikgJiYgIXNjb3BlLmVxdWFscygiYXBwbGljYXRpb24iKSkgeworCSAgICBlcnIuanNwRXJyb3IobiwgImpzcC5lcnJvci5pbnZhbGlkLnNjb3BlIiwgc2NvcGUpOworCX0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgaWYgYWxsIG1hbmRhdG9yeSBhdHRyaWJ1dGVzIGFyZSBwcmVzZW50IGFuZCBpZiBhbGwgYXR0cmlidXRlcworICAgICAqIHByZXNlbnQgaGF2ZSB2YWxpZCBuYW1lcy4gIENoZWNrcyBhdHRyaWJ1dGVzIHNwZWNpZmllZCBhcyBYTUwtc3R5bGUKKyAgICAgKiBhdHRyaWJ1dGVzIGFzIHdlbGwgYXMgYXR0cmlidXRlcyBzcGVjaWZpZWQgdXNpbmcgdGhlIGpzcDphdHRyaWJ1dGUKKyAgICAgKiBzdGFuZGFyZCBhY3Rpb24uIAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjaGVja0F0dHJpYnV0ZXMoU3RyaW5nIHR5cGVPZlRhZywKKwkJCQkgICAgICAgTm9kZSBuLAorCQkJCSAgICAgICBWYWxpZEF0dHJpYnV0ZVtdIHZhbGlkQXR0cmlidXRlcywKKwkJCQkgICAgICAgRXJyb3JEaXNwYXRjaGVyIGVycikKKwkJCQl0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgQXR0cmlidXRlcyBhdHRycyA9IG4uZ2V0QXR0cmlidXRlcygpOworICAgICAgICBNYXJrIHN0YXJ0ID0gbi5nZXRTdGFydCgpOworCWJvb2xlYW4gdmFsaWQgPSB0cnVlOworCisgICAgICAgIC8vIEF0dHJpYnV0ZXNJbXBsLnJlbW92ZUF0dHJpYnV0ZSBpcyBicm9rZW4sIHNvIHdlIGRvIHRoaXMuLi4KKyAgICAgICAgaW50IHRlbXBMZW5ndGggPSAoYXR0cnMgPT0gbnVsbCkgPyAwIDogYXR0cnMuZ2V0TGVuZ3RoKCk7CisJVmVjdG9yIHRlbXAgPSBuZXcgVmVjdG9yKHRlbXBMZW5ndGgsIDEpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRlbXBMZW5ndGg7IGkrKykgeworICAgICAgICAgICAgU3RyaW5nIHFOYW1lID0gYXR0cnMuZ2V0UU5hbWUoaSk7CisgICAgICAgICAgICBpZiAoKCFxTmFtZS5lcXVhbHMoInhtbG5zIikpICYmICghcU5hbWUuc3RhcnRzV2l0aCgieG1sbnM6IikpKQorICAgICAgICAgICAgICAgIHRlbXAuYWRkRWxlbWVudChxTmFtZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBBZGQgbmFtZXMgb2YgYXR0cmlidXRlcyBzcGVjaWZpZWQgdXNpbmcganNwOmF0dHJpYnV0ZQorICAgICAgICBOb2RlLk5vZGVzIHRhZ0JvZHkgPSBuLmdldEJvZHkoKTsKKyAgICAgICAgaWYoIHRhZ0JvZHkgIT0gbnVsbCApIHsKKyAgICAgICAgICAgIGludCBudW1TdWJFbGVtZW50cyA9IHRhZ0JvZHkuc2l6ZSgpOworICAgICAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBudW1TdWJFbGVtZW50czsgaSsrICkgeworICAgICAgICAgICAgICAgIE5vZGUgbm9kZSA9IHRhZ0JvZHkuZ2V0Tm9kZSggaSApOworICAgICAgICAgICAgICAgIGlmKCBub2RlIGluc3RhbmNlb2YgTm9kZS5OYW1lZEF0dHJpYnV0ZSApIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGF0dHJOYW1lID0gbm9kZS5nZXRBdHRyaWJ1dGVWYWx1ZSggIm5hbWUiICk7CisgICAgICAgICAgICAgICAgICAgIHRlbXAuYWRkRWxlbWVudCggYXR0ck5hbWUgKTsKKwkJICAgIC8vIENoZWNrIGlmIHRoaXMgdmFsdWUgYXBwZWFyIGluIHRoZSBhdHRyaWJ1dGUgb2YgdGhlIG5vZGUKKwkJICAgIGlmIChuLmdldEF0dHJpYnV0ZVZhbHVlKGF0dHJOYW1lKSAhPSBudWxsKSB7CisJCQllcnIuanNwRXJyb3IobiwgImpzcC5lcnJvci5kdXBsaWNhdGUubmFtZS5qc3BhdHRyaWJ1dGUiLAorCQkJCQlhdHRyTmFtZSk7CisJCSAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBOb3RoaW5nIGNhbiBjb21lIGJlZm9yZSBqc3A6YXR0cmlidXRlLCBhbmQgb25seQorICAgICAgICAgICAgICAgICAgICAvLyBqc3A6Ym9keSBjYW4gY29tZSBhZnRlciBpdC4KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKwkvKgorCSAqIEZpcnN0IGNoZWNrIHRvIHNlZSBpZiBhbGwgdGhlIG1hbmRhdG9yeSBhdHRyaWJ1dGVzIGFyZSBwcmVzZW50LgorCSAqIElmIHNvIG9ubHkgdGhlbiBwcm9jZWVkIHRvIHNlZSBpZiB0aGUgb3RoZXIgYXR0cmlidXRlcyBhcmUgdmFsaWQKKwkgKiBmb3IgdGhlIHBhcnRpY3VsYXIgdGFnLgorCSAqLworCVN0cmluZyBtaXNzaW5nQXR0cmlidXRlID0gbnVsbDsKKworCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsaWRBdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7CisJICAgIGludCBhdHRyUG9zOyAgICAKKwkgICAgaWYgKHZhbGlkQXR0cmlidXRlc1tpXS5tYW5kYXRvcnkpIHsKKyAgICAgICAgICAgICAgICBhdHRyUG9zID0gdGVtcC5pbmRleE9mKHZhbGlkQXR0cmlidXRlc1tpXS5uYW1lKTsKKwkJaWYgKGF0dHJQb3MgIT0gLTEpIHsKKwkJICAgIHRlbXAucmVtb3ZlKGF0dHJQb3MpOworCQkgICAgdmFsaWQgPSB0cnVlOworCQl9IGVsc2UgeworCQkgICAgdmFsaWQgPSBmYWxzZTsKKwkJICAgIG1pc3NpbmdBdHRyaWJ1dGUgPSB2YWxpZEF0dHJpYnV0ZXNbaV0ubmFtZTsKKwkJICAgIGJyZWFrOworCQl9CisJICAgIH0KKwl9CisKKwkvLyBJZiBtYW5kYXRvcnkgYXR0cmlidXRlIGlzIG1pc3NpbmcgdGhlbiB0aGUgZXhjZXB0aW9uIGlzIHRocm93bgorCWlmICghdmFsaWQpCisJICAgIGVyci5qc3BFcnJvcihzdGFydCwgImpzcC5lcnJvci5tYW5kYXRvcnkuYXR0cmlidXRlIiwgdHlwZU9mVGFnLAorCQkJIG1pc3NpbmdBdHRyaWJ1dGUpOworCisJLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZXJlIGFyZSBhbnkgbW9yZSBhdHRyaWJ1dGVzIGZvciB0aGUgc3BlY2lmaWVkIHRhZy4KKyAgICAgICAgaW50IGF0dHJMZWZ0TGVuZ3RoID0gdGVtcC5zaXplKCk7CisJaWYgKGF0dHJMZWZ0TGVuZ3RoID09IDApCisJICAgIHJldHVybjsKKworCS8vIE5vdyBjaGVjayB0byBzZWUgaWYgdGhlIHJlc3Qgb2YgdGhlIGF0dHJpYnV0ZXMgYXJlIHZhbGlkIHRvby4KKwlTdHJpbmcgYXR0cmlidXRlID0gbnVsbDsKKworCWZvciAoaW50IGogPSAwOyBqIDwgYXR0ckxlZnRMZW5ndGg7IGorKykgeworCSAgICB2YWxpZCA9IGZhbHNlOworCSAgICBhdHRyaWJ1dGUgPSAoU3RyaW5nKSB0ZW1wLmVsZW1lbnRBdChqKTsKKwkgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWxpZEF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHsKKwkJaWYgKGF0dHJpYnV0ZS5lcXVhbHModmFsaWRBdHRyaWJ1dGVzW2ldLm5hbWUpKSB7CisJCSAgICB2YWxpZCA9IHRydWU7CisJCSAgICBicmVhazsKKwkJfQorCSAgICB9CisJICAgIGlmICghdmFsaWQpCisJCWVyci5qc3BFcnJvcihzdGFydCwgImpzcC5lcnJvci5pbnZhbGlkLmF0dHJpYnV0ZSIsIHR5cGVPZlRhZywKKwkJCSAgICAgYXR0cmlidXRlKTsKKwl9CisJLy8gWFhYICpjb3VsZCogbW92ZSBFTC1zeW50YXggdmFsaWRhdGlvbiBoZXJlLi4uIChzYikKKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZXNjYXBlUXVlcnlTdHJpbmcoU3RyaW5nIHVuZXNjU3RyaW5nKSB7CisJaWYgKCB1bmVzY1N0cmluZyA9PSBudWxsICkKKwkgICAgcmV0dXJuIG51bGw7CisJCisJU3RyaW5nIGVzY1N0cmluZyAgICA9ICIiOworCVN0cmluZyBzaGVsbFNwQ2hhcnMgPSAiXFxcIiI7CisJCisJZm9yKGludCBpbmRleD0wOyBpbmRleDx1bmVzY1N0cmluZy5sZW5ndGgoKTsgaW5kZXgrKykgeworCSAgICBjaGFyIG5leHRDaGFyID0gdW5lc2NTdHJpbmcuY2hhckF0KGluZGV4KTsKKwkgICAgCisJICAgIGlmKCBzaGVsbFNwQ2hhcnMuaW5kZXhPZihuZXh0Q2hhcikgIT0gLTEgKQorCQllc2NTdHJpbmcgKz0gIlxcIjsKKwkgICAgCisJICAgIGVzY1N0cmluZyArPSBuZXh0Q2hhcjsKKwl9CisJcmV0dXJuIGVzY1N0cmluZzsKKyAgICB9CisgCisgICAgLyoqCisgICAgICogIEVzY2FwZSB0aGUgNSBlbnRpdGllcyBkZWZpbmVkIGJ5IFhNTC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBlc2NhcGVYbWwoU3RyaW5nIHMpIHsKKyAgICAgICAgaWYgKHMgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgZm9yKGludCBpPTA7IGk8cy5sZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICBjaGFyIGMgPSBzLmNoYXJBdChpKTsKKyAgICAgICAgICAgIGlmIChjID09ICc8JykgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiJmx0OyIpOworICAgICAgICAgICAgfSBlbHNlIGlmIChjID09ICc+JykgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiJmd0OyIpOworICAgICAgICAgICAgfSBlbHNlIGlmIChjID09ICdcJycpIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiZhcG9zOyIpOworICAgICAgICAgICAgfSBlbHNlIGlmIChjID09ICcmJykgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiJmFtcDsiKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAnIicpIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiZxdW90OyIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoYyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwbGFjZXMgYW55IG9jY3VycmVuY2VzIG9mIHRoZSBjaGFyYWN0ZXIgPHR0PnJlcGxhY2U8L3R0PiB3aXRoIHRoZQorICAgICAqIHN0cmluZyA8dHQ+d2l0aDwvdHQ+LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlcGxhY2UoU3RyaW5nIG5hbWUsIGNoYXIgcmVwbGFjZSwgU3RyaW5nIHdpdGgpIHsKKwlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCWludCBiZWdpbiA9IDA7CisJaW50IGVuZDsKKwlpbnQgbGFzdCA9IG5hbWUubGVuZ3RoKCk7CisKKwl3aGlsZSAodHJ1ZSkgeworCSAgICBlbmQgPSBuYW1lLmluZGV4T2YocmVwbGFjZSwgYmVnaW4pOworCSAgICBpZiAoZW5kIDwgMCkgeworCQllbmQgPSBsYXN0OworCSAgICB9CisJICAgIGJ1Zi5hcHBlbmQobmFtZS5zdWJzdHJpbmcoYmVnaW4sIGVuZCkpOworCSAgICBpZiAoZW5kID09IGxhc3QpIHsKKwkJYnJlYWs7CisJICAgIH0KKwkgICAgYnVmLmFwcGVuZCh3aXRoKTsKKwkgICAgYmVnaW4gPSBlbmQgKyAxOworCX0KKwkKKwlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBWYWxpZEF0dHJpYnV0ZSB7CisJU3RyaW5nIG5hbWU7CisJYm9vbGVhbiBtYW5kYXRvcnk7CisJYm9vbGVhbiBydGV4cHJ2YWx1ZTsJLy8gbm90IHVzZWQgbm93CisKKwlwdWJsaWMgVmFsaWRBdHRyaWJ1dGUgKFN0cmluZyBuYW1lLCBib29sZWFuIG1hbmRhdG9yeSwKKyAgICAgICAgICAgIGJvb2xlYW4gcnRleHBydmFsdWUgKQorICAgICAgICB7CisJICAgIHRoaXMubmFtZSA9IG5hbWU7CisJICAgIHRoaXMubWFuZGF0b3J5ID0gbWFuZGF0b3J5OworICAgICAgICAgICAgdGhpcy5ydGV4cHJ2YWx1ZSA9IHJ0ZXhwcnZhbHVlOworICAgICAgICB9CisKKyAgICAgICBwdWJsaWMgVmFsaWRBdHRyaWJ1dGUgKFN0cmluZyBuYW1lLCBib29sZWFuIG1hbmRhdG9yeSkgeworICAgICAgICAgICAgdGhpcyggbmFtZSwgbWFuZGF0b3J5LCBmYWxzZSApOworCX0KKworCXB1YmxpYyBWYWxpZEF0dHJpYnV0ZSAoU3RyaW5nIG5hbWUpIHsKKwkgICAgdGhpcyAobmFtZSwgZmFsc2UpOworCX0KKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ29udmVydCBhIFN0cmluZyB2YWx1ZSB0byAnYm9vbGVhbicuCisgICAgICogQmVzaWRlcyB0aGUgc3RhbmRhcmQgY29udmVyc2lvbnMgZG9uZSBieQorICAgICAqIEJvb2xlYW4udmFsdWVPZihzKS5ib29sZWFuVmFsdWUoKSwgdGhlIHZhbHVlICJ5ZXMiCisgICAgICogKGlnbm9yZSBjYXNlKSBpcyBhbHNvIGNvbnZlcnRlZCB0byAndHJ1ZScuIAorICAgICAqIElmICdzJyBpcyBudWxsLCB0aGVuICdmYWxzZScgaXMgcmV0dXJuZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcyB0aGUgc3RyaW5nIHRvIGJlIGNvbnZlcnRlZAorICAgICAqIEByZXR1cm4gdGhlIGJvb2xlYW4gdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdHJpbmcgcworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBib29sZWFuVmFsdWUoU3RyaW5nIHMpIHsKKwlib29sZWFuIGIgPSBmYWxzZTsKKwlpZiAocyAhPSBudWxsKSB7CisJICAgIGlmIChzLmVxdWFsc0lnbm9yZUNhc2UoInllcyIpKSB7CisJCWIgPSB0cnVlOworCSAgICB9IGVsc2UgeworCQliID0gQm9vbGVhbi52YWx1ZU9mKHMpLmJvb2xlYW5WYWx1ZSgpOworCSAgICB9CisJfQorCXJldHVybiBiOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIDx0dD5DbGFzczwvdHQ+IG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIGNsYXNzIG9yCisgICAgICogaW50ZXJmYWNlIHdpdGggdGhlIGdpdmVuIHN0cmluZyBuYW1lLgorICAgICAqCisgICAgICogPHA+IFRoZSA8dHQ+Q2xhc3M8L3R0PiBvYmplY3QgaXMgZGV0ZXJtaW5lZCBieSBwYXNzaW5nIHRoZSBnaXZlbiBzdHJpbmcKKyAgICAgKiBuYW1lIHRvIHRoZSA8dHQ+Q2xhc3MuZm9yTmFtZSgpPC90dD4gbWV0aG9kLCB1bmxlc3MgdGhlIGdpdmVuIHN0cmluZworICAgICAqIG5hbWUgcmVwcmVzZW50cyBhIHByaW1pdGl2ZSB0eXBlLCBpbiB3aGljaCBjYXNlIGl0IGlzIGNvbnZlcnRlZCB0byBhCisgICAgICogPHR0PkNsYXNzPC90dD4gb2JqZWN0IGJ5IGFwcGVuZGluZyAiLmNsYXNzIiB0byBpdCAoZS5nLiwgImludC5jbGFzcyIpLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3MgdG9DbGFzcyhTdHJpbmcgdHlwZSwgQ2xhc3NMb2FkZXIgbG9hZGVyKQorCSAgICB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisKKwlDbGFzcyBjID0gbnVsbDsKKwlpbnQgaTAgPSB0eXBlLmluZGV4T2YoJ1snKTsKKwlpbnQgZGltcyA9IDA7CisJaWYgKGkwID4gMCkgeworCSAgICAvLyBUaGlzIGlzIGFuIGFycmF5LiAgQ291bnQgdGhlIGRpbWVuc2lvbnMKKwkgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlLmxlbmd0aCgpOyBpKyspIHsKKwkJaWYgKHR5cGUuY2hhckF0KGkpID09ICdbJykKKwkJICAgIGRpbXMrKzsKKwkgICAgfQorCSAgICB0eXBlID0gdHlwZS5zdWJzdHJpbmcoMCwgaTApOworCX0KKworCWlmICgiYm9vbGVhbiIuZXF1YWxzKHR5cGUpKQorCSAgICBjID0gYm9vbGVhbi5jbGFzczsKKwllbHNlIGlmICgiY2hhciIuZXF1YWxzKHR5cGUpKQorCSAgICBjID0gY2hhci5jbGFzczsKKwllbHNlIGlmICgiYnl0ZSIuZXF1YWxzKHR5cGUpKQorCSAgICBjID0gIGJ5dGUuY2xhc3M7CisJZWxzZSBpZiAoInNob3J0Ii5lcXVhbHModHlwZSkpCisJICAgIGMgPSBzaG9ydC5jbGFzczsKKwllbHNlIGlmICgiaW50Ii5lcXVhbHModHlwZSkpCisJICAgIGMgPSBpbnQuY2xhc3M7CisJZWxzZSBpZiAoImxvbmciLmVxdWFscyh0eXBlKSkKKwkgICAgYyA9IGxvbmcuY2xhc3M7CisJZWxzZSBpZiAoImZsb2F0Ii5lcXVhbHModHlwZSkpCisJICAgIGMgPSBmbG9hdC5jbGFzczsKKwllbHNlIGlmICgiZG91YmxlIi5lcXVhbHModHlwZSkpCisJICAgIGMgPSBkb3VibGUuY2xhc3M7CisJZWxzZSBpZiAodHlwZS5pbmRleE9mKCdbJykgPCAwKQorCSAgICBjID0gbG9hZGVyLmxvYWRDbGFzcyh0eXBlKTsKKworCWlmIChkaW1zID09IDApCisJICAgIHJldHVybiBjOworCisJaWYgKGRpbXMgPT0gMSkKKwkgICAgcmV0dXJuIGphdmEubGFuZy5yZWZsZWN0LkFycmF5Lm5ld0luc3RhbmNlKGMsIDEpLmdldENsYXNzKCk7CisKKwkvLyBBcnJheSBvZiBtb3JlIHRoYW4gaSBkaW1lbnNpb24KKwlyZXR1cm4gamF2YS5sYW5nLnJlZmxlY3QuQXJyYXkubmV3SW5zdGFuY2UoYywgbmV3IGludFtkaW1zXSkuZ2V0Q2xhc3MoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcm9kdWNlcyBhIFN0cmluZyByZXByZXNlbnRpbmcgYSBjYWxsIHRvIHRoZSBFTCBpbnRlcnByZXRlci4KKyAgICAgKiBAcGFyYW0gZXhwcmVzc2lvbiBhIFN0cmluZyBjb250YWluaW5nIHplcm8gb3IgbW9yZSAiJHt9IiBleHByZXNzaW9ucworICAgICAqIEBwYXJhbSBleHBlY3RlZFR5cGUgdGhlIGV4cGVjdGVkIHR5cGUgb2YgdGhlIGludGVycHJldGVkIHJlc3VsdAorICAgICAqIEBwYXJhbSBmbm1hcHZhciBWYXJpYWJsZSBwb2ludGluZyB0byBhIGZ1bmN0aW9uIG1hcC4KKyAgICAgKiBAcGFyYW0gWG1sRXNjYXBlIFRydWUgaWYgdGhlIHJlc3VsdCBzaG91bGQgZG8gWE1MIGVzY2FwaW5nCisgICAgICogQHJldHVybiBhIFN0cmluZyByZXByZXNlbnRpbmcgYSBjYWxsIHRvIHRoZSBFTCBpbnRlcnByZXRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBpbnRlcnByZXRlckNhbGwoYm9vbGVhbiBpc1RhZ0ZpbGUsCisJCQkJCSBTdHJpbmcgZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgZXhwZWN0ZWRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZm5tYXB2YXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gWG1sRXNjYXBlICkgCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBEZXRlcm1pbmUgd2hpY2ggY29udGV4dCBvYmplY3QgdG8gdXNlLgorICAgICAgICAgKi8KKwlTdHJpbmcganNwQ3R4dCA9IG51bGw7CisJaWYgKGlzVGFnRmlsZSkKKwkgICAganNwQ3R4dCA9ICJ0aGlzLmdldEpzcENvbnRleHQoKSI7CisJZWxzZQorCSAgICBqc3BDdHh0ID0gIl9qc3B4X3BhZ2VfY29udGV4dCI7CisKKwkvKgorICAgICAgICAgKiBEZXRlcm1pbmUgd2hldGhlciB0byB1c2UgdGhlIGV4cGVjdGVkIHR5cGUncyB0ZXh0dWFsIG5hbWUKKwkgKiBvciwgaWYgaXQncyBhIHByaW1pdGl2ZSwgdGhlIG5hbWUgb2YgaXRzIGNvcnJlc3BvbmRlbnQgYm94ZWQKKwkgKiB0eXBlLgorICAgICAgICAgKi8KKwlTdHJpbmcgdGFyZ2V0VHlwZSA9IGV4cGVjdGVkVHlwZS5nZXROYW1lKCk7CisJU3RyaW5nIHByaW1pdGl2ZUNvbnZlcnRlck1ldGhvZCA9IG51bGw7CisJaWYgKGV4cGVjdGVkVHlwZS5pc1ByaW1pdGl2ZSgpKSB7CisJICAgIGlmIChleHBlY3RlZFR5cGUuZXF1YWxzKEJvb2xlYW4uVFlQRSkpIHsKKwkJdGFyZ2V0VHlwZSA9IEJvb2xlYW4uY2xhc3MuZ2V0TmFtZSgpOworCQlwcmltaXRpdmVDb252ZXJ0ZXJNZXRob2QgPSAiYm9vbGVhblZhbHVlIjsKKwkgICAgfSBlbHNlIGlmIChleHBlY3RlZFR5cGUuZXF1YWxzKEJ5dGUuVFlQRSkpIHsKKwkJdGFyZ2V0VHlwZSA9IEJ5dGUuY2xhc3MuZ2V0TmFtZSgpOworCQlwcmltaXRpdmVDb252ZXJ0ZXJNZXRob2QgPSAiYnl0ZVZhbHVlIjsKKwkgICAgfSBlbHNlIGlmIChleHBlY3RlZFR5cGUuZXF1YWxzKENoYXJhY3Rlci5UWVBFKSkgeworCQl0YXJnZXRUeXBlID0gQ2hhcmFjdGVyLmNsYXNzLmdldE5hbWUoKTsKKwkJcHJpbWl0aXZlQ29udmVydGVyTWV0aG9kID0gImNoYXJWYWx1ZSI7CisJICAgIH0gZWxzZSBpZiAoZXhwZWN0ZWRUeXBlLmVxdWFscyhTaG9ydC5UWVBFKSkgeworCQl0YXJnZXRUeXBlID0gU2hvcnQuY2xhc3MuZ2V0TmFtZSgpOworCQlwcmltaXRpdmVDb252ZXJ0ZXJNZXRob2QgPSAic2hvcnRWYWx1ZSI7CisJICAgIH0gZWxzZSBpZiAoZXhwZWN0ZWRUeXBlLmVxdWFscyhJbnRlZ2VyLlRZUEUpKSB7CisJCXRhcmdldFR5cGUgPSBJbnRlZ2VyLmNsYXNzLmdldE5hbWUoKTsKKwkJcHJpbWl0aXZlQ29udmVydGVyTWV0aG9kID0gImludFZhbHVlIjsKKwkgICAgfSBlbHNlIGlmIChleHBlY3RlZFR5cGUuZXF1YWxzKExvbmcuVFlQRSkpIHsKKwkJdGFyZ2V0VHlwZSA9IExvbmcuY2xhc3MuZ2V0TmFtZSgpOworCQlwcmltaXRpdmVDb252ZXJ0ZXJNZXRob2QgPSAibG9uZ1ZhbHVlIjsKKwkgICAgfSBlbHNlIGlmIChleHBlY3RlZFR5cGUuZXF1YWxzKEZsb2F0LlRZUEUpKSB7CisJCXRhcmdldFR5cGUgPSBGbG9hdC5jbGFzcy5nZXROYW1lKCk7CisJCXByaW1pdGl2ZUNvbnZlcnRlck1ldGhvZCA9ICJmbG9hdFZhbHVlIjsKKwkgICAgfSBlbHNlIGlmIChleHBlY3RlZFR5cGUuZXF1YWxzKERvdWJsZS5UWVBFKSkgeyAKKwkJdGFyZ2V0VHlwZSA9IERvdWJsZS5jbGFzcy5nZXROYW1lKCk7CisJCXByaW1pdGl2ZUNvbnZlcnRlck1ldGhvZCA9ICJkb3VibGVWYWx1ZSI7CisJICAgIH0KKwl9CisgCisJaWYgKHByaW1pdGl2ZUNvbnZlcnRlck1ldGhvZCAhPSBudWxsKSB7CisJICAgIFhtbEVzY2FwZSA9IGZhbHNlOworCX0KKworCS8qCisgICAgICAgICAqIEJ1aWxkIHVwIHRoZSBiYXNlIGNhbGwgdG8gdGhlIGludGVycHJldGVyLgorICAgICAgICAgKi8KKyAgICAgICAgLy8gWFhYIC0gV2UgdXNlIGEgcHJvcHJpZXRhcnkgY2FsbCB0byB0aGUgaW50ZXJwcmV0ZXIgZm9yIG5vdworICAgICAgICAvLyBhcyB0aGUgY3VycmVudCBzdGFuZGFyZCBtYWNoaW5lcnkgaXMgaW5lZmZpY2llbnQgYW5kIHJlcXVpcmVzCisgICAgICAgIC8vIGxvdHMgb2Ygd3JhcHBlcnMgYW5kIGFkYXB0ZXJzLiAgVGhpcyBzaG91bGQgYWxsIGNsZWFyIHVwIG9uY2UKKyAgICAgICAgLy8gdGhlIEVMIGludGVycHJldGVyIG1vdmVzIG91dCBvZiBKU1RMIGFuZCBpbnRvIGl0cyBvd24gcHJvamVjdC4KKyAgICAgICAgLy8gSW4gdGhlIGZ1dHVyZSwgdGhpcyBzaG91bGQgYmUgcmVwbGFjZWQgYnkgY29kZSB0aGF0IGNhbGxzCisgICAgICAgIC8vIEV4cHJlc3Npb25FdmFsdWF0b3IucGFyc2VFeHByZXNzaW9uKCkgYW5kIHRoZW4gY2FjaGUgdGhlIHJlc3VsdGluZworICAgICAgICAvLyBleHByZXNzaW9uIG9iamVjdHMuICBUaGUgaW50ZXJwcmV0ZXJDYWxsIHdvdWxkIHNpbXBseSBzZWxlY3QKKyAgICAgICAgLy8gb25lIG9mIHRoZSBwcmUtY2FjaGVkIGV4cHJlc3Npb25zIGFuZCBldmFsdWF0ZSBpdC4KKyAgICAgICAgLy8gTm90ZSB0aGF0IFBhZ2VDb250ZXh0SW1wbCBpbXBsZW1lbnRzIFZhcmlhYmxlUmVzb2x2ZXIgYW5kCisgICAgICAgIC8vIHRoZSBnZW5lcmF0ZWQgU2VydmxldC9TaW1wbGVUYWcgaW1wbGVtZW50cyBGdW5jdGlvbk1hcHBlciwgc28KKyAgICAgICAgLy8gdGhhdCBtYWNoaW5lcnkgaXMgYWxyZWFkeSBpbiBwbGFjZSAobXJvdGgpLgorCXRhcmdldFR5cGUgPSB0b0phdmFTb3VyY2VUeXBlKHRhcmdldFR5cGUpOworCVN0cmluZ0J1ZmZlciBjYWxsID0gbmV3IFN0cmluZ0J1ZmZlcigKKyAgICAgICAgICAgICAiKCIgKyB0YXJnZXRUeXBlICsgIikgIgorICAgICAgICAgICAgICAgKyAib3JnLmFwYWNoZS5qYXNwZXIucnVudGltZS5QYWdlQ29udGV4dEltcGwucHJvcHJpZXRhcnlFdmFsdWF0ZSIKKyAgICAgICAgICAgICAgICsgIigiICsgR2VuZXJhdG9yLnF1b3RlKGV4cHJlc3Npb24pICsgIiwgIgorICAgICAgICAgICAgICAgKyAgICAgICB0YXJnZXRUeXBlICsgIi5jbGFzcywgIgorCSAgICAgICArICAgICAgICIoUGFnZUNvbnRleHQpIiArIGpzcEN0eHQgCisgICAgICAgICAgICAgICArICAgICAgICIsICIgKyBmbm1hcHZhcgorCSAgICAgICArICIsICIgKyBYbWxFc2NhcGUKKyAgICAgICAgICAgICAgICsgIikiKTsKKyAKKwkvKgorICAgICAgICAgKiBBZGQgdGhlIHByaW1pdGl2ZSBjb252ZXJ0ZXIgbWV0aG9kIGlmIHdlIG5lZWQgdG8uCisgICAgICAgICAqLworCWlmIChwcmltaXRpdmVDb252ZXJ0ZXJNZXRob2QgIT0gbnVsbCkgeworCSAgICBjYWxsLmluc2VydCgwLCAiKCIpOworCSAgICBjYWxsLmFwcGVuZCgiKS4iICsgcHJpbWl0aXZlQ29udmVydGVyTWV0aG9kICsgIigpIik7CisJfQorIAorCXJldHVybiBjYWxsLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVmFsaWRhdGVzIHRoZSBzeW50YXggb2YgYWxsICR7fSBleHByZXNzaW9ucyB3aXRoaW4gdGhlIGdpdmVuIHN0cmluZy4KKyAgICAgKiBAcGFyYW0gd2hlcmUgdGhlIGFwcHJveGltYXRlIGxvY2F0aW9uIG9mIHRoZSBleHByZXNzaW9ucyBpbiB0aGUgSlNQIHBhZ2UKKyAgICAgKiBAcGFyYW0gZXhwcmVzc2lvbnMgYSBzdHJpbmcgY29udGFpbmluZyB6ZXJvIG9yIG1vcmUgIiR7fSIgZXhwcmVzc2lvbnMKKyAgICAgKiBAcGFyYW0gZXJyIGFuIGVycm9yIGRpc3BhdGNoZXIgdG8gdXNlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlRXhwcmVzc2lvbnMoTWFyayB3aGVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZXhwcmVzc2lvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgZXhwZWN0ZWRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uTWFwcGVyIGZ1bmN0aW9uTWFwcGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yRGlzcGF0Y2hlciBlcnIpCisgICAgICAgICAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgSnNwVXRpbC5leHByZXNzaW9uRXZhbHVhdG9yLnBhcnNlRXhwcmVzc2lvbiggZXhwcmVzc2lvbnMsIAorICAgICAgICAgICAgICAgIGV4cGVjdGVkVHlwZSwgbnVsbCApOworICAgICAgICB9CisgICAgICAgIGNhdGNoKCBFTFBhcnNlRXhjZXB0aW9uIGUgKSB7CisgICAgICAgICAgICBlcnIuanNwRXJyb3Iod2hlcmUsICJqc3AuZXJyb3IuaW52YWxpZC5leHByZXNzaW9uIiwgZXhwcmVzc2lvbnMsCisgICAgICAgICAgICAgICAgZS50b1N0cmluZygpICk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2goIEVMRXhjZXB0aW9uIGUgKSB7CisgICAgICAgICAgICBlcnIuanNwRXJyb3Iod2hlcmUsICJqc3AuZXJyb3IuaW52YWxpZC5leHByZXNzaW9uIiwgZXhwcmVzc2lvbnMsCisgICAgICAgICAgICAgICAgZS50b1N0cmluZygpICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXNldHMgdGhlIHRlbXBvcmFyeSB2YXJpYWJsZSBuYW1lLgorICAgICAqIChub3QgdGhyZWFkLXNhZmUpCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHJlc2V0VGVtcG9yYXJ5VmFyaWFibGVOYW1lKCkgeworICAgICAgICB0ZW1wU2VxdWVuY2VOdW1iZXIgPSAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlcyBhIG5ldyB0ZW1wb3JhcnkgdmFyaWFibGUgbmFtZS4KKyAgICAgKiAobm90IHRocmVhZC1zYWZlKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIG5leHRUZW1wb3JhcnlWYXJpYWJsZU5hbWUoKSB7CisgICAgICAgIHJldHVybiBDb25zdGFudHMuVEVNUF9WQVJJQUJMRV9OQU1FX1BSRUZJWCArICh0ZW1wU2VxdWVuY2VOdW1iZXIrKyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29lcmNlVG9QcmltaXRpdmVCb29sZWFuKFN0cmluZyBzLAorCQkJCQkJICBib29sZWFuIGlzTmFtZWRBdHRyaWJ1dGUpIHsKKwlpZiAoaXNOYW1lZEF0dHJpYnV0ZSkgeworCSAgICByZXR1cm4gIm9yZy5hcGFjaGUuamFzcGVyLnJ1bnRpbWUuSnNwUnVudGltZUxpYnJhcnkuY29lcmNlVG9Cb29sZWFuKCIgKyBzICsgIikiOworCX0gZWxzZSB7CisJICAgIGlmIChzID09IG51bGwgfHwgcy5sZW5ndGgoKSA9PSAwKQorCQlyZXR1cm4gImZhbHNlIjsKKwkgICAgZWxzZQorCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHMpLnRvU3RyaW5nKCk7CisJfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvZXJjZVRvQm9vbGVhbihTdHJpbmcgcywgYm9vbGVhbiBpc05hbWVkQXR0cmlidXRlKSB7CisJaWYgKGlzTmFtZWRBdHRyaWJ1dGUpIHsKKwkgICAgcmV0dXJuICIoQm9vbGVhbikgb3JnLmFwYWNoZS5qYXNwZXIucnVudGltZS5Kc3BSdW50aW1lTGlicmFyeS5jb2VyY2UoIiArIHMgKyAiLCBCb29sZWFuLmNsYXNzKSI7CisJfSBlbHNlIHsKKwkgICAgaWYgKHMgPT0gbnVsbCB8fCBzLmxlbmd0aCgpID09IDApIHsKKwkJcmV0dXJuICJuZXcgQm9vbGVhbihmYWxzZSkiOworCSAgICB9IGVsc2UgeworCQkvLyBEZXRlY3QgZm9ybWF0IGVycm9yIGF0IHRyYW5zbGF0aW9uIHRpbWUKKwkJcmV0dXJuICJuZXcgQm9vbGVhbigiICsgQm9vbGVhbi52YWx1ZU9mKHMpLnRvU3RyaW5nKCkgKyAiKSI7CisJICAgIH0KKwl9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29lcmNlVG9QcmltaXRpdmVCeXRlKFN0cmluZyBzLAorCQkJCQkgICAgICAgYm9vbGVhbiBpc05hbWVkQXR0cmlidXRlKSB7CisJaWYgKGlzTmFtZWRBdHRyaWJ1dGUpIHsKKwkgICAgcmV0dXJuICJvcmcuYXBhY2hlLmphc3Blci5ydW50aW1lLkpzcFJ1bnRpbWVMaWJyYXJ5LmNvZXJjZVRvQnl0ZSgiICsgcyArICIpIjsKKwl9IGVsc2UgeworCSAgICBpZiAocyA9PSBudWxsIHx8IHMubGVuZ3RoKCkgPT0gMCkKKwkJcmV0dXJuICIoYnl0ZSkgMCI7CisJICAgIGVsc2UKKwkJcmV0dXJuICIoKGJ5dGUpIiArIEJ5dGUudmFsdWVPZihzKS50b1N0cmluZygpICsgIikiOworCX0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb2VyY2VUb0J5dGUoU3RyaW5nIHMsIGJvb2xlYW4gaXNOYW1lZEF0dHJpYnV0ZSkgeworCWlmIChpc05hbWVkQXR0cmlidXRlKSB7CisJICAgIHJldHVybiAiKEJ5dGUpIG9yZy5hcGFjaGUuamFzcGVyLnJ1bnRpbWUuSnNwUnVudGltZUxpYnJhcnkuY29lcmNlKCIgKyBzICsgIiwgQnl0ZS5jbGFzcykiOworCX0gZWxzZSB7CisJICAgIGlmIChzID09IG51bGwgfHwgcy5sZW5ndGgoKSA9PSAwKSB7CisJCXJldHVybiAibmV3IEJ5dGUoKGJ5dGUpIDApIjsKKwkgICAgfSBlbHNlIHsKKwkJLy8gRGV0ZWN0IGZvcm1hdCBlcnJvciBhdCB0cmFuc2xhdGlvbiB0aW1lCisJCXJldHVybiAibmV3IEJ5dGUoKGJ5dGUpIiArIEJ5dGUudmFsdWVPZihzKS50b1N0cmluZygpICsgIikiOworCSAgICB9CisJfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvZXJjZVRvQ2hhcihTdHJpbmcgcywgYm9vbGVhbiBpc05hbWVkQXR0cmlidXRlKSB7CisJaWYgKGlzTmFtZWRBdHRyaWJ1dGUpIHsKKwkgICAgcmV0dXJuICJvcmcuYXBhY2hlLmphc3Blci5ydW50aW1lLkpzcFJ1bnRpbWVMaWJyYXJ5LmNvZXJjZVRvQ2hhcigiICsgcyArICIpIjsKKwl9IGVsc2UgeworCSAgICBpZiAocyA9PSBudWxsIHx8IHMubGVuZ3RoKCkgPT0gMCkgeworCQlyZXR1cm4gIihjaGFyKSAwIjsKKwkgICAgfSBlbHNlIHsKKwkJY2hhciBjaCA9IHMuY2hhckF0KDApOworCQkvLyB0aGlzIHRyaWNrIGF2b2lkcyBlc2NhcGluZyBpc3N1ZXMKKwkJcmV0dXJuICIoKGNoYXIpICIgKyAoaW50KSBjaCArICIpIjsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb2VyY2VUb0NoYXJhY3RlcihTdHJpbmcgcywgYm9vbGVhbiBpc05hbWVkQXR0cmlidXRlKSB7CisJaWYgKGlzTmFtZWRBdHRyaWJ1dGUpIHsKKwkgICAgcmV0dXJuICIoQ2hhcmFjdGVyKSBvcmcuYXBhY2hlLmphc3Blci5ydW50aW1lLkpzcFJ1bnRpbWVMaWJyYXJ5LmNvZXJjZSgiICsgcyArICIsIENoYXJhY3Rlci5jbGFzcykiOworCX0gZWxzZSB7CisJICAgIGlmIChzID09IG51bGwgfHwgcy5sZW5ndGgoKSA9PSAwKSB7CisJCXJldHVybiAibmV3IENoYXJhY3RlcigoY2hhcikgMCkiOworCSAgICB9IGVsc2UgeworCQljaGFyIGNoID0gcy5jaGFyQXQoMCk7CisJCS8vIHRoaXMgdHJpY2sgYXZvaWRzIGVzY2FwaW5nIGlzc3VlcworCQlyZXR1cm4gIm5ldyBDaGFyYWN0ZXIoKGNoYXIpICIgKyAoaW50KSBjaCArICIpIjsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb2VyY2VUb1ByaW1pdGl2ZURvdWJsZShTdHJpbmcgcywKKwkJCQkJCSBib29sZWFuIGlzTmFtZWRBdHRyaWJ1dGUpIHsKKwlpZiAoaXNOYW1lZEF0dHJpYnV0ZSkgeworCSAgICByZXR1cm4gIm9yZy5hcGFjaGUuamFzcGVyLnJ1bnRpbWUuSnNwUnVudGltZUxpYnJhcnkuY29lcmNlVG9Eb3VibGUoIiArIHMgKyAiKSI7CisJfSBlbHNlIHsKKwkgICAgaWYgKHMgPT0gbnVsbCB8fCBzLmxlbmd0aCgpID09IDApCisJCXJldHVybiAiKGRvdWJsZSkgMCI7CisJICAgIGVsc2UKKwkJcmV0dXJuIERvdWJsZS52YWx1ZU9mKHMpLnRvU3RyaW5nKCk7CisJfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvZXJjZVRvRG91YmxlKFN0cmluZyBzLCBib29sZWFuIGlzTmFtZWRBdHRyaWJ1dGUpIHsKKwlpZiAoaXNOYW1lZEF0dHJpYnV0ZSkgeworCSAgICByZXR1cm4gIihEb3VibGUpIG9yZy5hcGFjaGUuamFzcGVyLnJ1bnRpbWUuSnNwUnVudGltZUxpYnJhcnkuY29lcmNlKCIgKyBzICsgIiwgRG91YmxlLmNsYXNzKSI7CisJfSBlbHNlIHsKKwkgICAgaWYgKHMgPT0gbnVsbCB8fCBzLmxlbmd0aCgpID09IDApIHsKKwkJcmV0dXJuICJuZXcgRG91YmxlKDApIjsKKwkgICAgfSBlbHNlIHsKKwkJLy8gRGV0ZWN0IGZvcm1hdCBlcnJvciBhdCB0cmFuc2xhdGlvbiB0aW1lCisJCXJldHVybiAibmV3IERvdWJsZSgiICsgRG91YmxlLnZhbHVlT2YocykudG9TdHJpbmcoKSArICIpIjsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb2VyY2VUb1ByaW1pdGl2ZUZsb2F0KFN0cmluZyBzLAorCQkJCQkJYm9vbGVhbiBpc05hbWVkQXR0cmlidXRlKSB7CisJaWYgKGlzTmFtZWRBdHRyaWJ1dGUpIHsKKwkgICAgcmV0dXJuICJvcmcuYXBhY2hlLmphc3Blci5ydW50aW1lLkpzcFJ1bnRpbWVMaWJyYXJ5LmNvZXJjZVRvRmxvYXQoIiArIHMgKyAiKSI7CisJfSBlbHNlIHsKKwkgICAgaWYgKHMgPT0gbnVsbCB8fCBzLmxlbmd0aCgpID09IDApCisJCXJldHVybiAiKGZsb2F0KSAwIjsKKwkgICAgZWxzZQorCQlyZXR1cm4gRmxvYXQudmFsdWVPZihzKS50b1N0cmluZygpICsgImYiOworCX0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb2VyY2VUb0Zsb2F0KFN0cmluZyBzLCBib29sZWFuIGlzTmFtZWRBdHRyaWJ1dGUpIHsKKwlpZiAoaXNOYW1lZEF0dHJpYnV0ZSkgeworCSAgICByZXR1cm4gIihGbG9hdCkgb3JnLmFwYWNoZS5qYXNwZXIucnVudGltZS5Kc3BSdW50aW1lTGlicmFyeS5jb2VyY2UoIiArIHMgKyAiLCBGbG9hdC5jbGFzcykiOworCX0gZWxzZSB7CisJICAgIGlmIChzID09IG51bGwgfHwgcy5sZW5ndGgoKSA9PSAwKSB7CisJCXJldHVybiAibmV3IEZsb2F0KDApIjsKKwkgICAgfSBlbHNlIHsKKwkJLy8gRGV0ZWN0IGZvcm1hdCBlcnJvciBhdCB0cmFuc2xhdGlvbiB0aW1lCisJCXJldHVybiAibmV3IEZsb2F0KCIgKyBGbG9hdC52YWx1ZU9mKHMpLnRvU3RyaW5nKCkgKyAiZikiOworCSAgICB9CisJfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvZXJjZVRvSW50KFN0cmluZyBzLCBib29sZWFuIGlzTmFtZWRBdHRyaWJ1dGUpIHsKKwlpZiAoaXNOYW1lZEF0dHJpYnV0ZSkgeworCSAgICByZXR1cm4gIm9yZy5hcGFjaGUuamFzcGVyLnJ1bnRpbWUuSnNwUnVudGltZUxpYnJhcnkuY29lcmNlVG9JbnQoIiArIHMgKyAiKSI7CisJfSBlbHNlIHsKKwkgICAgaWYgKHMgPT0gbnVsbCB8fCBzLmxlbmd0aCgpID09IDApCisJCXJldHVybiAiMCI7CisJICAgIGVsc2UKKwkJcmV0dXJuIEludGVnZXIudmFsdWVPZihzKS50b1N0cmluZygpOworCX0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb2VyY2VUb0ludGVnZXIoU3RyaW5nIHMsIGJvb2xlYW4gaXNOYW1lZEF0dHJpYnV0ZSkgeworCWlmIChpc05hbWVkQXR0cmlidXRlKSB7CisJICAgIHJldHVybiAiKEludGVnZXIpIG9yZy5hcGFjaGUuamFzcGVyLnJ1bnRpbWUuSnNwUnVudGltZUxpYnJhcnkuY29lcmNlKCIgKyBzICsgIiwgSW50ZWdlci5jbGFzcykiOworCX0gZWxzZSB7CisJICAgIGlmIChzID09IG51bGwgfHwgcy5sZW5ndGgoKSA9PSAwKSB7CisJCXJldHVybiAibmV3IEludGVnZXIoMCkiOworCSAgICB9IGVsc2UgeworCQkvLyBEZXRlY3QgZm9ybWF0IGVycm9yIGF0IHRyYW5zbGF0aW9uIHRpbWUKKwkJcmV0dXJuICJuZXcgSW50ZWdlcigiICsgSW50ZWdlci52YWx1ZU9mKHMpLnRvU3RyaW5nKCkgKyAiKSI7CisJICAgIH0KKwl9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29lcmNlVG9QcmltaXRpdmVTaG9ydChTdHJpbmcgcywKKwkJCQkJCWJvb2xlYW4gaXNOYW1lZEF0dHJpYnV0ZSkgeworCWlmIChpc05hbWVkQXR0cmlidXRlKSB7CisJICAgIHJldHVybiAib3JnLmFwYWNoZS5qYXNwZXIucnVudGltZS5Kc3BSdW50aW1lTGlicmFyeS5jb2VyY2VUb1Nob3J0KCIgKyBzICsgIikiOworCX0gZWxzZSB7CisJICAgIGlmIChzID09IG51bGwgfHwgcy5sZW5ndGgoKSA9PSAwKQorCQlyZXR1cm4gIihzaG9ydCkgMCI7CisJICAgIGVsc2UKKwkJcmV0dXJuICIoKHNob3J0KSAiICsgU2hvcnQudmFsdWVPZihzKS50b1N0cmluZygpICsgIikiOworCX0KKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29lcmNlVG9TaG9ydChTdHJpbmcgcywgYm9vbGVhbiBpc05hbWVkQXR0cmlidXRlKSB7CisJaWYgKGlzTmFtZWRBdHRyaWJ1dGUpIHsKKwkgICAgcmV0dXJuICIoU2hvcnQpIG9yZy5hcGFjaGUuamFzcGVyLnJ1bnRpbWUuSnNwUnVudGltZUxpYnJhcnkuY29lcmNlKCIgKyBzICsgIiwgU2hvcnQuY2xhc3MpIjsKKwl9IGVsc2UgeworCSAgICBpZiAocyA9PSBudWxsIHx8IHMubGVuZ3RoKCkgPT0gMCkgeworCQlyZXR1cm4gIm5ldyBTaG9ydCgoc2hvcnQpIDApIjsKKwkgICAgfSBlbHNlIHsKKwkJLy8gRGV0ZWN0IGZvcm1hdCBlcnJvciBhdCB0cmFuc2xhdGlvbiB0aW1lCisJCXJldHVybiAibmV3IFNob3J0KFwiIiArIFNob3J0LnZhbHVlT2YocykudG9TdHJpbmcoKSArICJcIikiOworCSAgICB9CisJfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb2VyY2VUb1ByaW1pdGl2ZUxvbmcoU3RyaW5nIHMsCisJCQkJCSAgICAgICBib29sZWFuIGlzTmFtZWRBdHRyaWJ1dGUpIHsKKwlpZiAoaXNOYW1lZEF0dHJpYnV0ZSkgeworCSAgICByZXR1cm4gIm9yZy5hcGFjaGUuamFzcGVyLnJ1bnRpbWUuSnNwUnVudGltZUxpYnJhcnkuY29lcmNlVG9Mb25nKCIgKyBzICsgIikiOworCX0gZWxzZSB7CisJICAgIGlmIChzID09IG51bGwgfHwgcy5sZW5ndGgoKSA9PSAwKQorCQlyZXR1cm4gIihsb25nKSAwIjsKKwkgICAgZWxzZQorCQlyZXR1cm4gTG9uZy52YWx1ZU9mKHMpLnRvU3RyaW5nKCkgKyAibCI7CisJfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvZXJjZVRvTG9uZyhTdHJpbmcgcywgYm9vbGVhbiBpc05hbWVkQXR0cmlidXRlKSB7CisJaWYgKGlzTmFtZWRBdHRyaWJ1dGUpIHsKKwkgICAgcmV0dXJuICIoTG9uZykgb3JnLmFwYWNoZS5qYXNwZXIucnVudGltZS5Kc3BSdW50aW1lTGlicmFyeS5jb2VyY2UoIiArIHMgKyAiLCBMb25nLmNsYXNzKSI7CisJfSBlbHNlIHsKKwkgICAgaWYgKHMgPT0gbnVsbCB8fCBzLmxlbmd0aCgpID09IDApIHsKKwkJcmV0dXJuICJuZXcgTG9uZygwKSI7CisJICAgIH0gZWxzZSB7CisJCS8vIERldGVjdCBmb3JtYXQgZXJyb3IgYXQgdHJhbnNsYXRpb24gdGltZQorCQlyZXR1cm4gIm5ldyBMb25nKCIgKyBMb25nLnZhbHVlT2YocykudG9TdHJpbmcoKSArICJsKSI7CisJICAgIH0KKwl9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbShTdHJpbmcgZm5hbWUsIEphckZpbGUgamFyRmlsZSwKKwkJCQkJICAgICBKc3BDb21waWxhdGlvbkNvbnRleHQgY3R4dCwKKwkJCQkJICAgICBFcnJvckRpc3BhdGNoZXIgZXJyKQorCQl0aHJvd3MgSmFzcGVyRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBudWxsOworCisJaWYgKGphckZpbGUgIT0gbnVsbCkgeworCSAgICBTdHJpbmcgamFyRW50cnlOYW1lID0gZm5hbWUuc3Vic3RyaW5nKDEsIGZuYW1lLmxlbmd0aCgpKTsKKwkgICAgWmlwRW50cnkgamFyRW50cnkgPSBqYXJGaWxlLmdldEVudHJ5KGphckVudHJ5TmFtZSk7CisJICAgIGlmIChqYXJFbnRyeSA9PSBudWxsKSB7CisJCWVyci5qc3BFcnJvcigianNwLmVycm9yLmZpbGUubm90LmZvdW5kIiwgZm5hbWUpOworCSAgICB9CisJICAgIGluID0gamFyRmlsZS5nZXRJbnB1dFN0cmVhbShqYXJFbnRyeSk7CisJfSBlbHNlIHsKKwkgICAgaW4gPSBjdHh0LmdldFJlc291cmNlQXNTdHJlYW0oZm5hbWUpOworCX0KKworCWlmIChpbiA9PSBudWxsKSB7CisJICAgIGVyci5qc3BFcnJvcigianNwLmVycm9yLmZpbGUubm90LmZvdW5kIiwgZm5hbWUpOworCX0KKworCXJldHVybiBpbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBmdWxseS1xdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgdGFnIGhhbmRsZXIgY29ycmVzcG9uZGluZyB0bworICAgICAqIHRoZSBnaXZlbiB0YWcgZmlsZSBwYXRoLgorICAgICAqCisgICAgICogQHBhcmFtIHBhdGggVGFnIGZpbGUgcGF0aAorICAgICAqIEBwYXJhbSBlcnIgRXJyb3IgZGlzcGF0Y2hlcgorICAgICAqCisgICAgICogQHJldHVybiBGdWxseS1xdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgdGFnIGhhbmRsZXIgY29ycmVzcG9uZGluZyB0byAKKyAgICAgKiB0aGUgZ2l2ZW4gdGFnIGZpbGUgcGF0aAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFRhZ0hhbmRsZXJDbGFzc05hbWUoU3RyaW5nIHBhdGgsCisJCQkJCQlFcnJvckRpc3BhdGNoZXIgZXJyKQorICAgICAgICAgICAgICAgIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCisgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBudWxsOworICAgICAgICBpbnQgYmVnaW4gPSAwOworICAgICAgICBpbnQgaW5kZXg7CisgICAgICAgIAorICAgICAgICBpbmRleCA9IHBhdGgubGFzdEluZGV4T2YoIi50YWciKTsKKyAgICAgICAgaWYgKGluZGV4ID09IC0xKSB7CisgICAgICAgICAgICBlcnIuanNwRXJyb3IoImpzcC5lcnJvci50YWdmaWxlLmJhZFN1ZmZpeCIsIHBhdGgpOworICAgICAgICB9CisKKyAgICAgICAgLy9JdCdzIHRlbXB0aW5nIHRvIHJlbW92ZSB0aGUgIi50YWciIHN1ZmZpeCBoZXJlLCBidXQgd2UgY2FuJ3QuCisgICAgICAgIC8vSWYgd2UgcmVtb3ZlIGl0LCB0aGUgZnVsbHktcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhpcyB0YWcKKyAgICAgICAgLy9jb3VsZCBjb25mbGljdCB3aXRoIHRoZSBwYWNrYWdlIG5hbWUgb2Ygb3RoZXIgdGFncy4KKyAgICAgICAgLy9Gb3IgaW5zdGFuY2UsIHRoZSB0YWcgZmlsZQorICAgICAgICAvLyAgICAvV0VCLUlORi90YWdzL2Zvby50YWcKKyAgICAgICAgLy93b3VsZCBoYXZlIGZ1bGx5LXF1YWxpZmllZCBjbGFzcyBuYW1lCisgICAgICAgIC8vICAgIG9yZy5hcGFjaGUuanNwLnRhZy53ZWIuZm9vCisgICAgICAgIC8vd2hpY2ggd291bGQgY29uZmxpY3Qgd2l0aCB0aGUgcGFja2FnZSBuYW1lIG9mIHRoZSB0YWcgZmlsZQorICAgICAgICAvLyAgICAvV0VCLUlORi90YWdzL2Zvby9iYXIudGFnCisKKyAgICAgICAgaW5kZXggPSBwYXRoLmluZGV4T2YoV0VCX0lORl9UQUdTKTsKKyAgICAgICAgaWYgKGluZGV4ICE9IC0xKSB7CisgICAgICAgICAgICBjbGFzc05hbWUgPSAib3JnLmFwYWNoZS5qc3AudGFnLndlYi4iOworICAgICAgICAgICAgYmVnaW4gPSBpbmRleCArIFdFQl9JTkZfVEFHUy5sZW5ndGgoKTsKKyAgICAgICAgfSBlbHNlIHsKKwkgICAgaW5kZXggPSBwYXRoLmluZGV4T2YoTUVUQV9JTkZfVEFHUyk7CisJICAgIGlmIChpbmRleCAhPSAtMSkgeworCQljbGFzc05hbWUgPSAib3JnLmFwYWNoZS5qc3AudGFnLm1ldGEuIjsKKwkJYmVnaW4gPSBpbmRleCArIE1FVEFfSU5GX1RBR1MubGVuZ3RoKCk7CisJICAgIH0gZWxzZSB7CisJCWVyci5qc3BFcnJvcigianNwLmVycm9yLnRhZ2ZpbGUuaWxsZWdhbFBhdGgiLCBwYXRoKTsKKwkgICAgfQorCX0KKworICAgICAgICBjbGFzc05hbWUgKz0gbWFrZUphdmFQYWNrYWdlKHBhdGguc3Vic3RyaW5nKGJlZ2luKSk7CisgIAorICAgICAgIHJldHVybiBjbGFzc05hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVydHMgdGhlIGdpdmVuIHBhdGggdG8gYSBKYXZhIHBhY2thZ2Ugb3IgZnVsbHktcXVhbGlmaWVkIGNsYXNzIG5hbWUKKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXRoIFBhdGggdG8gY29udmVydAorICAgICAqCisgICAgICogQHJldHVybiBKYXZhIHBhY2thZ2UgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gcGF0aAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIG1ha2VKYXZhUGFja2FnZShTdHJpbmcgcGF0aCkgeworICAgICAgICBTdHJpbmcgY2xhc3NOYW1lQ29tcG9uZW50c1tdID0gc3BsaXQocGF0aCwiLyIpOworICAgICAgICBTdHJpbmdCdWZmZXIgbGVnYWxDbGFzc05hbWVzID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzTmFtZUNvbXBvbmVudHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGxlZ2FsQ2xhc3NOYW1lcy5hcHBlbmQobWFrZUphdmFJZGVudGlmaWVyKGNsYXNzTmFtZUNvbXBvbmVudHNbaV0pKTsKKyAgICAgICAgICAgIGlmIChpIDwgY2xhc3NOYW1lQ29tcG9uZW50cy5sZW5ndGggLSAxKSB7CisgICAgICAgICAgICAgICAgbGVnYWxDbGFzc05hbWVzLmFwcGVuZCgnLicpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBsZWdhbENsYXNzTmFtZXMudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTcGxpdHMgYSBzdHJpbmcgaW50byBpdCdzIGNvbXBvbmVudHMuCisgICAgICogQHBhcmFtIHBhdGggU3RyaW5nIHRvIHNwbGl0CisgICAgICogQHBhcmFtIHBhdCBQYXR0ZXJuIHRvIHNwbGl0IGF0CisgICAgICogQHJldHVybiB0aGUgY29tcG9uZW50cyBvZiB0aGUgcGF0aAorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBbXSBzcGxpdChTdHJpbmcgcGF0aCwgU3RyaW5nIHBhdCkgeworICAgICAgICBWZWN0b3IgY29tcHMgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIGludCBwb3MgPSBwYXRoLmluZGV4T2YocGF0KTsKKyAgICAgICAgaW50IHN0YXJ0ID0gMDsKKyAgICAgICAgd2hpbGUoIHBvcyA+PSAwICkgeworICAgICAgICAgICAgaWYocG9zID4gc3RhcnQgKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGNvbXAgPSBwYXRoLnN1YnN0cmluZyhzdGFydCxwb3MpOworICAgICAgICAgICAgICAgIGNvbXBzLmFkZChjb21wKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXJ0ID0gcG9zICsgcGF0Lmxlbmd0aCgpOworICAgICAgICAgICAgcG9zID0gcGF0aC5pbmRleE9mKHBhdCxzdGFydCk7CisgICAgICAgIH0KKyAgICAgICAgaWYoIHN0YXJ0IDwgcGF0aC5sZW5ndGgoKSkgeworICAgICAgICAgICAgY29tcHMuYWRkKHBhdGguc3Vic3RyaW5nKHN0YXJ0KSk7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIFtdIHJlc3VsdCA9IG5ldyBTdHJpbmdbY29tcHMuc2l6ZSgpXTsKKyAgICAgICAgZm9yKGludCBpPTA7IGkgPCBjb21wcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgcmVzdWx0W2ldID0gKFN0cmluZyljb21wcy5lbGVtZW50QXQoaSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgICAgICAgICAKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gaWRlbnRpZmllciB0byBhIGxlZ2FsIEphdmEgaWRlbnRpZmllcgorICAgICAqCisgICAgICogQHBhcmFtIGlkZW50aWZpZXIgSWRlbnRpZmllciB0byBjb252ZXJ0CisgICAgICoKKyAgICAgKiBAcmV0dXJuIExlZ2FsIEphdmEgaWRlbnRpZmllciBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBpZGVudGlmaWVyCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgbWFrZUphdmFJZGVudGlmaWVyKFN0cmluZyBpZGVudGlmaWVyKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBtb2RpZmllZElkZW50aWZpZXIgPSAKKyAgICAgICAgICAgIG5ldyBTdHJpbmdCdWZmZXIoaWRlbnRpZmllci5sZW5ndGgoKSk7CisgICAgICAgIGlmICghQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJTdGFydChpZGVudGlmaWVyLmNoYXJBdCgwKSkpIHsKKyAgICAgICAgICAgIG1vZGlmaWVkSWRlbnRpZmllci5hcHBlbmQoJ18nKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGlkZW50aWZpZXIubGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgY2hhciBjaCA9IGlkZW50aWZpZXIuY2hhckF0KGkpOworICAgICAgICAgICAgaWYgKENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyUGFydChjaCkgJiYgY2ggIT0gJ18nKSB7CisgICAgICAgICAgICAgICAgbW9kaWZpZWRJZGVudGlmaWVyLmFwcGVuZChjaCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICcuJykgeworICAgICAgICAgICAgICAgIG1vZGlmaWVkSWRlbnRpZmllci5hcHBlbmQoJ18nKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbW9kaWZpZWRJZGVudGlmaWVyLmFwcGVuZChtYW5nbGVDaGFyKGNoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzSmF2YUtleXdvcmQobW9kaWZpZWRJZGVudGlmaWVyLnRvU3RyaW5nKCkpKSB7CisgICAgICAgICAgICBtb2RpZmllZElkZW50aWZpZXIuYXBwZW5kKCdfJyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1vZGlmaWVkSWRlbnRpZmllci50b1N0cmluZygpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBNYW5nbGUgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgdG8gY3JlYXRlIGEgbGVnYWwgSmF2YSBjbGFzcyBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIG1hbmdsZUNoYXIoY2hhciBjaCkgeworICAgICAgICBjaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbNV07CisgICAgICAgIHJlc3VsdFswXSA9ICdfJzsKKyAgICAgICAgcmVzdWx0WzFdID0gQ2hhcmFjdGVyLmZvckRpZ2l0KChjaCA+PiAxMikgJiAweGYsIDE2KTsKKyAgICAgICAgcmVzdWx0WzJdID0gQ2hhcmFjdGVyLmZvckRpZ2l0KChjaCA+PiA4KSAmIDB4ZiwgMTYpOworICAgICAgICByZXN1bHRbM10gPSBDaGFyYWN0ZXIuZm9yRGlnaXQoKGNoID4+IDQpICYgMHhmLCAxNik7CisgICAgICAgIHJlc3VsdFs0XSA9IENoYXJhY3Rlci5mb3JEaWdpdChjaCAmIDB4ZiwgMTYpOworICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhyZXN1bHQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3Qgd2hldGhlciB0aGUgYXJndW1lbnQgaXMgYSBKYXZhIGtleXdvcmQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNKYXZhS2V5d29yZChTdHJpbmcga2V5KSB7CisgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgaW50IGogPSBqYXZhS2V5d29yZHMubGVuZ3RoOworICAgICAgICB3aGlsZSAoaSA8IGopIHsKKyAgICAgICAgICAgIGludCBrID0gKGkraikvMjsKKyAgICAgICAgICAgIGludCByZXN1bHQgPSBqYXZhS2V5d29yZHNba10uY29tcGFyZVRvKGtleSk7CisgICAgICAgICAgICBpZiAocmVzdWx0ID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChyZXN1bHQgPCAwKSB7CisgICAgICAgICAgICAgICAgaSA9IGsrMTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaiA9IGs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnRzIHRoZSBnaXZlbiBYbWwgbmFtZSB0byBhIGxlZ2FsIEphdmEgaWRlbnRpZmllci4gIFRoaXMgaXMKKyAgICAgKiBzbGlnaHRseSBtb3JlIGVmZmljaWVudCB0aGFuIG1ha2VKYXZhSWRlbnRpZmllciBpbiB0aGF0IHdlIG9ubHkgbmVlZAorICAgICAqIHRvIHdvcnJ5IGFib3V0ICcuJywgJy0nLCBhbmQgJzonIGluIHRoZSBzdHJpbmcuICBXZSBhbHNvIGFzc3VtZSB0aGF0CisgICAgICogdGhlIHJlc3VsdGFudCBzdHJpbmcgaXMgZnVydGhlciBjb25jYXRlbmF0ZWQgd2l0aCBzb21lIHByZWZpeCBzdHJpbmcKKyAgICAgKiBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgaXQgYmVpbmcgYSBKYXZhIGtleSB3b3JkLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgSWRlbnRpZmllciB0byBjb252ZXJ0CisgICAgICoKKyAgICAgKiBAcmV0dXJuIExlZ2FsIEphdmEgaWRlbnRpZmllciBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBpZGVudGlmaWVyCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgbWFrZVhtbEphdmFJZGVudGlmaWVyKFN0cmluZyBuYW1lKSB7CisgICAgICAgIGlmIChuYW1lLmluZGV4T2YoJy0nKSA+PSAwKQorICAgICAgICAgICAgbmFtZSA9IHJlcGxhY2UobmFtZSwgJy0nLCAiJDEiKTsKKyAgICAgICAgaWYgKG5hbWUuaW5kZXhPZignLicpID49IDApCisgICAgICAgICAgICBuYW1lID0gcmVwbGFjZShuYW1lLCAnLicsICIkMiIpOworICAgICAgICBpZiAobmFtZS5pbmRleE9mKCc6JykgPj0gMCkKKyAgICAgICAgICAgIG5hbWUgPSByZXBsYWNlKG5hbWUsICc6JywgIiQzIik7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIHN0YXRpYyBJbnB1dFN0cmVhbVJlYWRlciBnZXRSZWFkZXIoU3RyaW5nIGZuYW1lLCBTdHJpbmcgZW5jb2RpbmcsCisJCQkJICAgICAgIEphckZpbGUgamFyRmlsZSwKKwkJCQkgICAgICAgSnNwQ29tcGlsYXRpb25Db250ZXh0IGN0eHQsCisJCQkJICAgICAgIEVycm9yRGlzcGF0Y2hlciBlcnIpCisJCXRocm93cyBKYXNwZXJFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKworICAgICAgICBJbnB1dFN0cmVhbVJlYWRlciByZWFkZXIgPSBudWxsOworCUlucHV0U3RyZWFtIGluID0gZ2V0SW5wdXRTdHJlYW0oZm5hbWUsIGphckZpbGUsIGN0eHQsIGVycik7CisKKwl0cnkgeworICAgICAgICAgICAgcmVhZGVyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGluLCBlbmNvZGluZyk7CisJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBleCkgeworCSAgICBlcnIuanNwRXJyb3IoImpzcC5lcnJvci51bnN1cHBvcnRlZC5lbmNvZGluZyIsIGVuY29kaW5nKTsKKwl9CisKKwlyZXR1cm4gcmVhZGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsYXNzLmdldE5hbWUoKSByZXR1cm4gYXJyYXlzIGluIHRoZSBmb3JtICJbW1s8ZXQ+Iiwgd2hlcmUgZXQsCisgICAgICogdGhlIGVsZW1lbnQgdHlwZSBjYW4gYmUgb25lIG9mIFpCQ0RGSUpTIG9yIEw8Y2xhc3NuYW1lPjsKKyAgICAgKiBJdCBpcyBjb252ZXJ0ZWQgaW50byBmb3JtcyB0aGF0IGNhbiBiZSB1bmRlcnN0b29kIGJ5IGphdmFjLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvSmF2YVNvdXJjZVR5cGUoU3RyaW5nIHR5cGUpIHsKKworCWlmICh0eXBlLmNoYXJBdCgwKSAhPSAnWycpIHsKKwkgICAgcmV0dXJuIHR5cGU7CisgCX0KKworCWludCBkaW1zID0gMTsKKwlTdHJpbmcgdCA9IG51bGw7CisJZm9yIChpbnQgaSA9IDE7IGkgPCB0eXBlLmxlbmd0aCgpOyBpKyspIHsKKwkgICAgaWYgKHR5cGUuY2hhckF0KGkpID09ICdbJykgeworCQlkaW1zKys7CisJICAgIH0gZWxzZSB7CisJCXN3aXRjaCAodHlwZS5jaGFyQXQoaSkpIHsKKwkJY2FzZSAnWic6IHQgPSAiYm9vbGVhbiI7IGJyZWFrOworCQljYXNlICdCJzogdCA9ICJieXRlIjsgYnJlYWs7CisJCWNhc2UgJ0MnOiB0ID0gImNoYXIiOyBicmVhazsKKwkJY2FzZSAnRCc6IHQgPSAiZG91YmxlIjsgYnJlYWs7CisJCWNhc2UgJ0YnOiB0ID0gImZsb2F0IjsgYnJlYWs7CisJCWNhc2UgJ0knOiB0ID0gImludCI7IGJyZWFrOworCQljYXNlICdKJzogdCA9ICJsb25nIjsgYnJlYWs7CisJCWNhc2UgJ1MnOiB0ID0gInNob3J0IjsgYnJlYWs7CisJCWNhc2UgJ0wnOiB0ID0gdHlwZS5zdWJzdHJpbmcoaSsxLCB0eXBlLmluZGV4T2YoJzsnKSk7IGJyZWFrOworCQl9CisJCWJyZWFrOworCSAgICB9CisJfQorCVN0cmluZ0J1ZmZlciByZXN1bHRUeXBlID0gbmV3IFN0cmluZ0J1ZmZlcih0KTsKKwlmb3IgKDsgZGltcyA+IDA7IGRpbXMtLSkgeworCSAgICByZXN1bHRUeXBlLmFwcGVuZCgiW10iKTsKKwl9CisJcmV0dXJuIHJlc3VsdFR5cGUudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21wdXRlIHRoZSBjYW5vbmljYWwgbmFtZSBmcm9tIGEgQ2xhc3MgaW5zdGFuY2UuICBOb3RlIHRoYXQgYQorICAgICAqIHNpbXBsZSByZXBsYWNtZW50IG9mICckJyB3aXRoICcuJyBvZiBhIGJpbmFyeSBuYW1lIHdvdWxkIG5vdCB3b3JrLAorICAgICAqIGFzICckJyBpcyBhIGxlZ2FsIEphdmEgSWRlbnRpZmllciBjaGFyYWN0ZXIuCisgICAgICogQHBhcmFtIGMgQSBpbnN0YW5jZSBvZiBqYXZhLmxhbmcuQ2xhc3MKKyAgICAgKiBAcmV0dXJuICBUaGUgY2Fub25pY2FsIG5hbWUgb2YgYy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDYW5vbmljYWxOYW1lKENsYXNzIGMpIHsKKworICAgICAgICBTdHJpbmcgYmluYXJ5TmFtZSA9IGMuZ2V0TmFtZSgpOworICAgICAgICBjID0gYy5nZXREZWNsYXJpbmdDbGFzcygpOworCisgICAgICAgIGlmIChjID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBiaW5hcnlOYW1lOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoYmluYXJ5TmFtZSk7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGJ1Zi5zZXRDaGFyQXQoYy5nZXROYW1lKCkubGVuZ3RoKCksICcuJyk7CisgICAgICAgICAgICBjID0gYy5nZXREZWNsYXJpbmdDbGFzcygpOworICAgICAgICB9IHdoaWxlICggYyAhPSBudWxsKTsKKworICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvTG9jYWxpemVyLmphdmEgYi9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvTG9jYWxpemVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY0NTU2MQotLS0gL2Rldi9udWxsCisrKyBiL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9Mb2NhbGl6ZXIuamF2YQpAQCAtMCwwICsxLDE1OSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFzcGVyLmNvbXBpbGVyOworCitpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7CisKKy8qKgorICogQ2xhc3MgcmVzcG9uc2libGUgZm9yIGNvbnZlcnRpbmcgZXJyb3IgY29kZXMgdG8gY29ycmVzcG9uZGluZyBsb2NhbGl6ZWQKKyAqIGVycm9yIG1lc3NhZ2VzLgorICoKKyAqIEBhdXRob3IgSmFuIEx1ZWhlCisgKi8KK3B1YmxpYyBjbGFzcyBMb2NhbGl6ZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gbnVsbDsKKyAgICAKKyAgICBzdGF0aWMgeworICAgICAgICB0cnkgeworICAgICAgICBidW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoCisgICAgICAgICAgICAib3JnLmFwYWNoZS5qYXNwZXIucmVzb3VyY2VzLkxvY2FsU3RyaW5ncyIpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgdC5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogUmV0dXJucyB0aGUgbG9jYWxpemVkIGVycm9yIG1lc3NhZ2UgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gZXJyb3IKKyAgICAgKiBjb2RlLgorICAgICAqCisgICAgICogSWYgdGhlIGdpdmVuIGVycm9yIGNvZGUgaXMgbm90IGRlZmluZWQgaW4gdGhlIHJlc291cmNlIGJ1bmRsZSBmb3IKKyAgICAgKiBsb2NhbGl6ZWQgZXJyb3IgbWVzc2FnZXMsIGl0IGlzIHVzZWQgYXMgdGhlIGVycm9yIG1lc3NhZ2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXJyQ29kZSBFcnJvciBjb2RlIHRvIGxvY2FsaXplCisgICAgICogCisgICAgICogQHJldHVybiBMb2NhbGl6ZWQgZXJyb3IgbWVzc2FnZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGVyckNvZGUpIHsKKwlTdHJpbmcgZXJyTXNnID0gZXJyQ29kZTsKKwl0cnkgeworCSAgICBlcnJNc2cgPSBidW5kbGUuZ2V0U3RyaW5nKGVyckNvZGUpOworCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7CisJfQorCXJldHVybiBlcnJNc2c7CisgICAgfQorCisgICAgLyogCisgICAgICogUmV0dXJucyB0aGUgbG9jYWxpemVkIGVycm9yIG1lc3NhZ2UgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gZXJyb3IKKyAgICAgKiBjb2RlLgorICAgICAqCisgICAgICogSWYgdGhlIGdpdmVuIGVycm9yIGNvZGUgaXMgbm90IGRlZmluZWQgaW4gdGhlIHJlc291cmNlIGJ1bmRsZSBmb3IKKyAgICAgKiBsb2NhbGl6ZWQgZXJyb3IgbWVzc2FnZXMsIGl0IGlzIHVzZWQgYXMgdGhlIGVycm9yIG1lc3NhZ2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXJyQ29kZSBFcnJvciBjb2RlIHRvIGxvY2FsaXplCisgICAgICogQHBhcmFtIGFyZyBBcmd1bWVudCBmb3IgcGFyYW1ldHJpYyByZXBsYWNlbWVudAorICAgICAqCisgICAgICogQHJldHVybiBMb2NhbGl6ZWQgZXJyb3IgbWVzc2FnZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGVyckNvZGUsIFN0cmluZyBhcmcpIHsKKwlyZXR1cm4gZ2V0TWVzc2FnZShlcnJDb2RlLCBuZXcgT2JqZWN0W10ge2FyZ30pOworICAgIH0KKworICAgIC8qIAorICAgICAqIFJldHVybnMgdGhlIGxvY2FsaXplZCBlcnJvciBtZXNzYWdlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGVycm9yCisgICAgICogY29kZS4KKyAgICAgKgorICAgICAqIElmIHRoZSBnaXZlbiBlcnJvciBjb2RlIGlzIG5vdCBkZWZpbmVkIGluIHRoZSByZXNvdXJjZSBidW5kbGUgZm9yCisgICAgICogbG9jYWxpemVkIGVycm9yIG1lc3NhZ2VzLCBpdCBpcyB1c2VkIGFzIHRoZSBlcnJvciBtZXNzYWdlLgorICAgICAqCisgICAgICogQHBhcmFtIGVyckNvZGUgRXJyb3IgY29kZSB0byBsb2NhbGl6ZQorICAgICAqIEBwYXJhbSBhcmcxIEZpcnN0IGFyZ3VtZW50IGZvciBwYXJhbWV0cmljIHJlcGxhY2VtZW50CisgICAgICogQHBhcmFtIGFyZzIgU2Vjb25kIGFyZ3VtZW50IGZvciBwYXJhbWV0cmljIHJlcGxhY2VtZW50CisgICAgICoKKyAgICAgKiBAcmV0dXJuIExvY2FsaXplZCBlcnJvciBtZXNzYWdlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcgZXJyQ29kZSwgU3RyaW5nIGFyZzEsIFN0cmluZyBhcmcyKSB7CisJcmV0dXJuIGdldE1lc3NhZ2UoZXJyQ29kZSwgbmV3IE9iamVjdFtdIHthcmcxLCBhcmcyfSk7CisgICAgfQorICAgIAorICAgIC8qIAorICAgICAqIFJldHVybnMgdGhlIGxvY2FsaXplZCBlcnJvciBtZXNzYWdlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGVycm9yCisgICAgICogY29kZS4KKyAgICAgKgorICAgICAqIElmIHRoZSBnaXZlbiBlcnJvciBjb2RlIGlzIG5vdCBkZWZpbmVkIGluIHRoZSByZXNvdXJjZSBidW5kbGUgZm9yCisgICAgICogbG9jYWxpemVkIGVycm9yIG1lc3NhZ2VzLCBpdCBpcyB1c2VkIGFzIHRoZSBlcnJvciBtZXNzYWdlLgorICAgICAqCisgICAgICogQHBhcmFtIGVyckNvZGUgRXJyb3IgY29kZSB0byBsb2NhbGl6ZQorICAgICAqIEBwYXJhbSBhcmcxIEZpcnN0IGFyZ3VtZW50IGZvciBwYXJhbWV0cmljIHJlcGxhY2VtZW50CisgICAgICogQHBhcmFtIGFyZzIgU2Vjb25kIGFyZ3VtZW50IGZvciBwYXJhbWV0cmljIHJlcGxhY2VtZW50CisgICAgICogQHBhcmFtIGFyZzMgVGhpcmQgYXJndW1lbnQgZm9yIHBhcmFtZXRyaWMgcmVwbGFjZW1lbnQKKyAgICAgKgorICAgICAqIEByZXR1cm4gTG9jYWxpemVkIGVycm9yIG1lc3NhZ2UKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBlcnJDb2RlLCBTdHJpbmcgYXJnMSwgU3RyaW5nIGFyZzIsCisJCQkJICAgIFN0cmluZyBhcmczKSB7CisJcmV0dXJuIGdldE1lc3NhZ2UoZXJyQ29kZSwgbmV3IE9iamVjdFtdIHthcmcxLCBhcmcyLCBhcmczfSk7CisgICAgfQorCisgICAgLyogCisgICAgICogUmV0dXJucyB0aGUgbG9jYWxpemVkIGVycm9yIG1lc3NhZ2UgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gZXJyb3IKKyAgICAgKiBjb2RlLgorICAgICAqCisgICAgICogSWYgdGhlIGdpdmVuIGVycm9yIGNvZGUgaXMgbm90IGRlZmluZWQgaW4gdGhlIHJlc291cmNlIGJ1bmRsZSBmb3IKKyAgICAgKiBsb2NhbGl6ZWQgZXJyb3IgbWVzc2FnZXMsIGl0IGlzIHVzZWQgYXMgdGhlIGVycm9yIG1lc3NhZ2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXJyQ29kZSBFcnJvciBjb2RlIHRvIGxvY2FsaXplCisgICAgICogQHBhcmFtIGFyZzEgRmlyc3QgYXJndW1lbnQgZm9yIHBhcmFtZXRyaWMgcmVwbGFjZW1lbnQKKyAgICAgKiBAcGFyYW0gYXJnMiBTZWNvbmQgYXJndW1lbnQgZm9yIHBhcmFtZXRyaWMgcmVwbGFjZW1lbnQKKyAgICAgKiBAcGFyYW0gYXJnMyBUaGlyZCBhcmd1bWVudCBmb3IgcGFyYW1ldHJpYyByZXBsYWNlbWVudAorICAgICAqIEBwYXJhbSBhcmc0IEZvdXJ0aCBhcmd1bWVudCBmb3IgcGFyYW1ldHJpYyByZXBsYWNlbWVudAorICAgICAqCisgICAgICogQHJldHVybiBMb2NhbGl6ZWQgZXJyb3IgbWVzc2FnZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGVyckNvZGUsIFN0cmluZyBhcmcxLCBTdHJpbmcgYXJnMiwKKwkJCQkgICAgU3RyaW5nIGFyZzMsIFN0cmluZyBhcmc0KSB7CisJcmV0dXJuIGdldE1lc3NhZ2UoZXJyQ29kZSwgbmV3IE9iamVjdFtdIHthcmcxLCBhcmcyLCBhcmczLCBhcmc0fSk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBSZXR1cm5zIHRoZSBsb2NhbGl6ZWQgZXJyb3IgbWVzc2FnZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBlcnJvcgorICAgICAqIGNvZGUuCisgICAgICoKKyAgICAgKiBJZiB0aGUgZ2l2ZW4gZXJyb3IgY29kZSBpcyBub3QgZGVmaW5lZCBpbiB0aGUgcmVzb3VyY2UgYnVuZGxlIGZvcgorICAgICAqIGxvY2FsaXplZCBlcnJvciBtZXNzYWdlcywgaXQgaXMgdXNlZCBhcyB0aGUgZXJyb3IgbWVzc2FnZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlcnJDb2RlIEVycm9yIGNvZGUgdG8gbG9jYWxpemUKKyAgICAgKiBAcGFyYW0gYXJncyBBcmd1bWVudHMgZm9yIHBhcmFtZXRyaWMgcmVwbGFjZW1lbnQKKyAgICAgKgorICAgICAqIEByZXR1cm4gTG9jYWxpemVkIGVycm9yIG1lc3NhZ2UKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBlcnJDb2RlLCBPYmplY3RbXSBhcmdzKSB7CisJU3RyaW5nIGVyck1zZyA9IGVyckNvZGU7CisJdHJ5IHsKKwkgICAgZXJyTXNnID0gYnVuZGxlLmdldFN0cmluZyhlcnJDb2RlKTsKKwkgICAgaWYgKGFyZ3MgIT0gbnVsbCkgeworCQlNZXNzYWdlRm9ybWF0IGZvcm1hdHRlciA9IG5ldyBNZXNzYWdlRm9ybWF0KGVyck1zZyk7CisJCWVyck1zZyA9IGZvcm1hdHRlci5mb3JtYXQoYXJncyk7CisJICAgIH0KKwl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgeworCX0KKwkKKwlyZXR1cm4gZXJyTXNnOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9NYXJrLmphdmEgYi9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvTWFyay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxZWExODYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvTWFyay5qYXZhCkBAIC0wLDAgKzEsMjgxIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuamFzcGVyLmNvbXBpbGVyOworCitpbXBvcnQgamF2YS51dGlsLlN0YWNrOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIuSnNwQ29tcGlsYXRpb25Db250ZXh0OworCisvKioKKyAqIE1hcmsgcmVwcmVzZW50cyBhIHBvaW50IGluIHRoZSBKU1AgaW5wdXQuIAorICoKKyAqIEBhdXRob3IgQW5pbCBLLiBWaWplbmRyYW4KKyAqLworZmluYWwgY2xhc3MgTWFyayB7CisKKyAgICAvLyBwb3NpdGlvbiB3aXRoaW4gY3VycmVudCBzdHJlYW0KKyAgICBpbnQgY3Vyc29yLCBsaW5lLCBjb2w7CisKKyAgICAvLyBkaXJlY3Rvcnkgb2YgZmlsZSBmb3IgY3VycmVudCBzdHJlYW0KKyAgICBTdHJpbmcgYmFzZURpcjsKKworICAgIC8vIGN1cnJlbnQgc3RyZWFtCisgICAgY2hhcltdIHN0cmVhbSA9IG51bGw7CisKKyAgICAvLyBmaWxlaWQgb2YgY3VycmVudCBzdHJlYW0KKyAgICBwcml2YXRlIGludCBmaWxlSWQ7CisKKyAgICAvLyBuYW1lIG9mIHRoZSBjdXJyZW50IGZpbGUKKyAgICBwcml2YXRlIFN0cmluZyBmaWxlTmFtZTsKKworICAgIC8qCisgICAgICogc3RhY2sgb2Ygc3RyZWFtIGFuZCBzdHJlYW0gc3RhdGUgb2Ygc3RyZWFtcyB0aGF0IGhhdmUgaW5jbHVkZWQKKyAgICAgKiBjdXJyZW50IHN0cmVhbQorICAgICAqLworICAgIHByaXZhdGUgU3RhY2sgaW5jbHVkZVN0YWNrID0gbnVsbDsKKworICAgIC8vIGVuY29kaW5nIG9mIGN1cnJlbnQgZmlsZQorICAgIHByaXZhdGUgU3RyaW5nIGVuY29kaW5nID0gbnVsbDsKKworICAgIC8vIHJlYWRlciB0aGF0IG93bnMgdGhpcyBtYXJrIChzbyB3ZSBjYW4gbG9vayB1cCBmaWxlaWQncykKKyAgICBwcml2YXRlIEpzcFJlYWRlciByZWFkZXI7CisKKyAgICBwcml2YXRlIEpzcENvbXBpbGF0aW9uQ29udGV4dCBjdHh0OworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IKKyAgICAgKgorICAgICAqIEBwYXJhbSByZWFkZXIgSnNwUmVhZGVyIHRoaXMgbWFyayBiZWxvbmdzIHRvCisgICAgICogQHBhcmFtIGluU3RyZWFtIGN1cnJlbnQgc3RyZWFtIGZvciB0aGlzIG1hcmsKKyAgICAgKiBAcGFyYW0gZmlsZUlkIGlkIG9mIHJlcXVlc3RlZCBqc3AgZmlsZQorICAgICAqIEBwYXJhbSBuYW1lIEpTUCBmaWxlIG5hbWUKKyAgICAgKiBAcGFyYW0gaW5CYXNlRGlyIGJhc2UgZGlyZWN0b3J5IG9mIHJlcXVlc3RlZCBqc3AgZmlsZQorICAgICAqIEBwYXJhbSBpbkVuY29kaW5nIGVuY29kaW5nIG9mIGN1cnJlbnQgZmlsZQorICAgICAqLworICAgIE1hcmsoSnNwUmVhZGVyIHJlYWRlciwgY2hhcltdIGluU3RyZWFtLCBpbnQgZmlsZUlkLCBTdHJpbmcgbmFtZSwKKyAgICAgICAgIFN0cmluZyBpbkJhc2VEaXIsIFN0cmluZyBpbkVuY29kaW5nKSB7CisKKyAgICAgICAgdGhpcy5yZWFkZXIgPSByZWFkZXI7CisgICAgICAgIHRoaXMuY3R4dCA9IHJlYWRlci5nZXRKc3BDb21waWxhdGlvbkNvbnRleHQoKTsKKyAgICAgICAgdGhpcy5zdHJlYW0gPSBpblN0cmVhbTsKKyAgICAgICAgdGhpcy5jdXJzb3IgPSAwOworICAgICAgICB0aGlzLmxpbmUgPSAxOworICAgICAgICB0aGlzLmNvbCA9IDE7CisgICAgICAgIHRoaXMuZmlsZUlkID0gZmlsZUlkOworICAgICAgICB0aGlzLmZpbGVOYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy5iYXNlRGlyID0gaW5CYXNlRGlyOworICAgICAgICB0aGlzLmVuY29kaW5nID0gaW5FbmNvZGluZzsKKyAgICAgICAgdGhpcy5pbmNsdWRlU3RhY2sgPSBuZXcgU3RhY2soKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yCisgICAgICovCisgICAgTWFyayhNYXJrIG90aGVyKSB7CisKKyAgICAgICAgdGhpcy5yZWFkZXIgPSBvdGhlci5yZWFkZXI7CisgICAgICAgIHRoaXMuY3R4dCA9IG90aGVyLnJlYWRlci5nZXRKc3BDb21waWxhdGlvbkNvbnRleHQoKTsKKyAgICAgICAgdGhpcy5zdHJlYW0gPSBvdGhlci5zdHJlYW07CisgICAgICAgIHRoaXMuZmlsZUlkID0gb3RoZXIuZmlsZUlkOworICAgICAgICB0aGlzLmZpbGVOYW1lID0gb3RoZXIuZmlsZU5hbWU7CisgICAgICAgIHRoaXMuY3Vyc29yID0gb3RoZXIuY3Vyc29yOworICAgICAgICB0aGlzLmxpbmUgPSBvdGhlci5saW5lOworICAgICAgICB0aGlzLmNvbCA9IG90aGVyLmNvbDsKKyAgICAgICAgdGhpcy5iYXNlRGlyID0gb3RoZXIuYmFzZURpcjsKKyAgICAgICAgdGhpcy5lbmNvZGluZyA9IG90aGVyLmVuY29kaW5nOworCisgICAgICAgIC8vIGNsb25lIGluY2x1ZGVTdGFjayB3aXRob3V0IGNsb25pbmcgY29udGVudHMKKyAgICAgICAgaW5jbHVkZVN0YWNrID0gbmV3IFN0YWNrKCk7CisgICAgICAgIGZvciAoIGludCBpPTA7IGkgPCBvdGhlci5pbmNsdWRlU3RhY2suc2l6ZSgpOyBpKysgKSB7CisgICAgICAgICAgICBpbmNsdWRlU3RhY2suYWRkRWxlbWVudCggb3RoZXIuaW5jbHVkZVN0YWNrLmVsZW1lbnRBdChpKSApOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvcgorICAgICAqLyAgICAKKyAgICBNYXJrKEpzcENvbXBpbGF0aW9uQ29udGV4dCBjdHh0LCBTdHJpbmcgZmlsZW5hbWUsIGludCBsaW5lLCBpbnQgY29sKSB7CisKKyAgICAgICAgdGhpcy5yZWFkZXIgPSBudWxsOworICAgICAgICB0aGlzLmN0eHQgPSBjdHh0OworICAgICAgICB0aGlzLnN0cmVhbSA9IG51bGw7CisgICAgICAgIHRoaXMuY3Vyc29yID0gMDsKKyAgICAgICAgdGhpcy5saW5lID0gbGluZTsKKyAgICAgICAgdGhpcy5jb2wgPSBjb2w7CisgICAgICAgIHRoaXMuZmlsZUlkID0gLTE7CisgICAgICAgIHRoaXMuZmlsZU5hbWUgPSBmaWxlbmFtZTsKKyAgICAgICAgdGhpcy5iYXNlRGlyID0gImxlLWJhc2VkaXIiOworICAgICAgICB0aGlzLmVuY29kaW5nID0gImxlLWVuZG9jaW5nIjsKKyAgICAgICAgdGhpcy5pbmNsdWRlU3RhY2sgPSBudWxsOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0cyB0aGlzIG1hcmsncyBzdGF0ZSB0byBhIG5ldyBzdHJlYW0uCisgICAgICogSXQgd2lsbCBzdG9yZSB0aGUgY3VycmVudCBzdHJlYW0gaW4gaXQncyBpbmNsdWRlU3RhY2suCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5TdHJlYW0gbmV3IHN0cmVhbSBmb3IgbWFyaworICAgICAqIEBwYXJhbSBpbkZpbGVJZCBpZCBvZiBuZXcgZmlsZSBmcm9tIHdoaWNoIHN0cmVhbSBjb21lcyBmcm9tCisgICAgICogQHBhcmFtIGluQmFzZURpciBkaXJlY3Rvcnkgb2YgZmlsZQorICAgICAqIEBwYXJhbSBpbkVuY29kaW5nIGVuY29kaW5nIG9mIG5ldyBmaWxlCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHVzaFN0cmVhbShjaGFyW10gaW5TdHJlYW0sIGludCBpbkZpbGVJZCwgU3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaW5CYXNlRGlyLCBTdHJpbmcgaW5FbmNvZGluZykgCisgICAgeworICAgICAgICAvLyBzdG9yZSBjdXJyZW50IHN0YXRlIGluIHN0YWNrCisgICAgICAgIGluY2x1ZGVTdGFjay5wdXNoKG5ldyBJbmNsdWRlU3RhdGUoY3Vyc29yLCBsaW5lLCBjb2wsIGZpbGVJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZSwgYmFzZURpciwgCisJCQkJCSAgIGVuY29kaW5nLCBzdHJlYW0pICk7CisKKyAgICAgICAgLy8gc2V0IG5ldyB2YXJpYWJsZXMKKyAgICAgICAgY3Vyc29yID0gMDsKKyAgICAgICAgbGluZSA9IDE7CisgICAgICAgIGNvbCA9IDE7CisgICAgICAgIGZpbGVJZCA9IGluRmlsZUlkOworICAgICAgICBmaWxlTmFtZSA9IG5hbWU7CisgICAgICAgIGJhc2VEaXIgPSBpbkJhc2VEaXI7CisgICAgICAgIGVuY29kaW5nID0gaW5FbmNvZGluZzsKKyAgICAgICAgc3RyZWFtID0gaW5TdHJlYW07CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXN0b3JlcyB0aGlzIG1hcmsncyBzdGF0ZSB0byBhIHByZXZpb3VzbHkgc3RvcmVkIHN0cmVhbS4KKyAgICAgKiBAcmV0dXJuIFRoZSBwcmV2aW91cyBNYXJrIGluc3RhbmNlIHdoZW4gdGhlIHN0cmVhbSB3YXMgcHVzaGVkLCBvciBudWxsCisgICAgICogaWYgdGhlcmUgaXMgbm8gcHJldmlvdXMgc3RyZWFtCisgICAgICovCisgICAgcHVibGljIE1hcmsgcG9wU3RyZWFtKCkgeworICAgICAgICAvLyBtYWtlIHN1cmUgd2UgaGF2ZSBzb21ldGhpbmcgdG8gcG9wCisgICAgICAgIGlmICggaW5jbHVkZVN0YWNrLnNpemUoKSA8PSAwICkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICAvLyBnZXQgcHJldmlvdXMgc3RhdGUgaW4gc3RhY2sKKyAgICAgICAgSW5jbHVkZVN0YXRlIHN0YXRlID0gKEluY2x1ZGVTdGF0ZSkgaW5jbHVkZVN0YWNrLnBvcCggKTsKKworICAgICAgICAvLyBzZXQgbmV3IHZhcmlhYmxlcworICAgICAgICBjdXJzb3IgPSBzdGF0ZS5jdXJzb3I7CisgICAgICAgIGxpbmUgPSBzdGF0ZS5saW5lOworICAgICAgICBjb2wgPSBzdGF0ZS5jb2w7CisgICAgICAgIGZpbGVJZCA9IHN0YXRlLmZpbGVJZDsKKyAgICAgICAgZmlsZU5hbWUgPSBzdGF0ZS5maWxlTmFtZTsKKyAgICAgICAgYmFzZURpciA9IHN0YXRlLmJhc2VEaXI7CisgICAgICAgIHN0cmVhbSA9IHN0YXRlLnN0cmVhbTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLSBMb2NhdG9yIGludGVyZmFjZSAtLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgcHVibGljIGludCBnZXRMaW5lTnVtYmVyKCkgeworICAgICAgICByZXR1cm4gbGluZTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldENvbHVtbk51bWJlcigpIHsKKyAgICAgICAgcmV0dXJuIGNvbDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFN5c3RlbUlkKCkgeworICAgICAgICByZXR1cm4gZ2V0RmlsZSgpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHVibGljSWQoKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJcmV0dXJuIGdldEZpbGUoKSsiKCIrbGluZSsiLCIrY29sKyIpIjsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEZpbGUoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmZpbGVOYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIFVSTCBvZiB0aGUgcmVzb3VyY2Ugd2l0aCB3aGljaCB0aGlzIE1hcmsgaXMgYXNzb2NpYXRlZAorICAgICAqCisgICAgICogQHJldHVybiBVUkwgb2YgdGhlIHJlc291cmNlIHdpdGggd2hpY2ggdGhpcyBNYXJrIGlzIGFzc29jaWF0ZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGlmIHRoZSByZXNvdXJjZSBwYXRobmFtZSBpcyBpbmNvcnJlY3QKKyAgICAgKi8KKyAgICBwdWJsaWMgVVJMIGdldFVSTCgpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gY3R4dC5nZXRSZXNvdXJjZShnZXRGaWxlKCkpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TaG9ydFN0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICIoIitsaW5lKyIsIitjb2wrIikiOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpIHsKKwlpZiAob3RoZXIgaW5zdGFuY2VvZiBNYXJrKSB7CisJICAgIE1hcmsgbSA9IChNYXJrKSBvdGhlcjsKKwkgICAgcmV0dXJuIHRoaXMucmVhZGVyID09IG0ucmVhZGVyICYmIHRoaXMuZmlsZUlkID09IG0uZmlsZUlkIAorCQkmJiB0aGlzLmN1cnNvciA9PSBtLmN1cnNvciAmJiB0aGlzLmxpbmUgPT0gbS5saW5lIAorCQkmJiB0aGlzLmNvbCA9PSBtLmNvbDsKKwl9IAorCXJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBNYXJrIGlzIGdyZWF0aGVyIHRoYW4gdGhlIDxjb2RlPm90aGVyPC9jb2RlPgorICAgICAqIE1hcmssIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0dyZWF0ZXIoTWFyayBvdGhlcikgeworCisgICAgICAgIGJvb2xlYW4gZ3JlYXRlciA9IGZhbHNlOworCisgICAgICAgIGlmICh0aGlzLmxpbmUgPiBvdGhlci5saW5lKSB7CisgICAgICAgICAgICBncmVhdGVyID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmICh0aGlzLmxpbmUgPT0gb3RoZXIubGluZSAmJiB0aGlzLmNvbCA+IG90aGVyLmNvbCkgeworICAgICAgICAgICAgZ3JlYXRlciA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZ3JlYXRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBLZWVwIHRyYWNrIG9mIHBhcnNlciBiZWZvcmUgcGFyc2luZyBhbiBpbmNsdWRlZCBmaWxlLgorICAgICAqIFRoaXMgY2xhc3Mga2VlcHMgdHJhY2sgb2YgdGhlIHBhcnNlciBiZWZvcmUgd2Ugc3dpdGNoIHRvIHBhcnNpbmcgYW4KKyAgICAgKiBpbmNsdWRlZCBmaWxlLiBJbiBvdGhlciB3b3JkcywgaXQncyB0aGUgcGFyc2VyJ3MgY29udGludWF0aW9uIHRvIGJlCisgICAgICogcmVpbnN0YWxsZWQgYWZ0ZXIgdGhlIGluY2x1ZGVkIGZpbGUgcGFyc2luZyBpcyBkb25lLgorICAgICAqLworICAgIGNsYXNzIEluY2x1ZGVTdGF0ZSB7CisgICAgICAgIGludCBjdXJzb3IsIGxpbmUsIGNvbDsKKyAgICAgICAgaW50IGZpbGVJZDsKKyAgICAgICAgU3RyaW5nIGZpbGVOYW1lOworICAgICAgICBTdHJpbmcgYmFzZURpcjsKKyAgICAgICAgU3RyaW5nIGVuY29kaW5nOworICAgICAgICBjaGFyW10gc3RyZWFtID0gbnVsbDsKKworICAgICAgICBJbmNsdWRlU3RhdGUoaW50IGluQ3Vyc29yLCBpbnQgaW5MaW5lLCBpbnQgaW5Db2wsIGludCBpbkZpbGVJZCwgCisgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSwgU3RyaW5nIGluQmFzZURpciwgU3RyaW5nIGluRW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICBjaGFyW10gaW5TdHJlYW0pIHsKKyAgICAgICAgICAgIGN1cnNvciA9IGluQ3Vyc29yOworICAgICAgICAgICAgbGluZSA9IGluTGluZTsKKyAgICAgICAgICAgIGNvbCA9IGluQ29sOworICAgICAgICAgICAgZmlsZUlkID0gaW5GaWxlSWQ7CisgICAgICAgICAgICBmaWxlTmFtZSA9IG5hbWU7CisgICAgICAgICAgICBiYXNlRGlyID0gaW5CYXNlRGlyOworICAgICAgICAgICAgZW5jb2RpbmcgPSBpbkVuY29kaW5nOworICAgICAgICAgICAgc3RyZWFtID0gaW5TdHJlYW07CisgICAgICAgIH0KKyAgICB9CisKK30KKwpkaWZmIC0tZ2l0IGEvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL2NvbXBpbGVyL05vZGUuamF2YSBiL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9Ob2RlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc3ZWNhNAotLS0gL2Rldi9udWxsCisrKyBiL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9Ob2RlLmphdmEKQEAgLTAsMCArMSwyMzY5IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYXNwZXIuY29tcGlsZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCitpbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0LkJvZHlUYWc7CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0LkR5bmFtaWNBdHRyaWJ1dGVzOworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5JdGVyYXRpb25UYWc7CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlNpbXBsZVRhZzsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnQXR0cmlidXRlSW5mbzsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnRGF0YTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnRmlsZUluZm87CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZ0luZm87CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZ1ZhcmlhYmxlSW5mbzsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVHJ5Q2F0Y2hGaW5hbGx5OworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5WYXJpYWJsZUluZm87CisKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5KYXNwZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIuY29tcGlsZXIudGFncGx1Z2luLlRhZ1BsdWdpbkNvbnRleHQ7CitpbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKKworCisvKioKKyAqIEFuIGludGVybmFsIGRhdGEgcmVwcmVzZW50YXRpb24gb2YgYSBKU1AgcGFnZSBvciBhIEpTUCBkb2N1ZW1lbnQgKFhNTCkuCisgKiBBbHNvIGluY2x1ZGVkIGhlcmUgaXMgYSB2aXNpdG9yIGNsYXNzIGZvciB0cmFudmVyc2luZyBub2Rlcy4KKyAqCisgKiBAYXV0aG9yIEtpbi1tYW4gQ2h1bmcKKyAqIEBhdXRob3IgSmFuIEx1ZWhlCisgKiBAYXV0aG9yIFNoYXduIEJheWVybgorICogQGF1dGhvciBNYXJrIFJvdGgKKyAqLworCithYnN0cmFjdCBjbGFzcyBOb2RlIGltcGxlbWVudHMgVGFnQ29uc3RhbnRzIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFZhcmlhYmxlSW5mb1tdIFpFUk9fVkFSSUFCTEVfSU5GTyA9IHsgfTsKKyAgICAKKyAgICBwcm90ZWN0ZWQgQXR0cmlidXRlcyBhdHRyczsKKworICAgIC8vIHhtbG5zIGF0dHJpYnV0ZXMgdGhhdCByZXByZXNlbnQgdGFnIGxpYnJhcmllcyAob25seSBpbiBYTUwgc3ludGF4KQorICAgIHByb3RlY3RlZCBBdHRyaWJ1dGVzIHRhZ2xpYkF0dHJzOworCisgICAgLyoKKyAgICAgKiB4bWxucyBhdHRyaWJ1dGVzIHRoYXQgZG8gbm90IHJlcHJlc2VudCB0YWcgbGlicmFyaWVzCisgICAgICogKG9ubHkgaW4gWE1MIHN5bnRheCkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQXR0cmlidXRlcyBub25UYWdsaWJYbWxuc0F0dHJzOworCisgICAgcHJvdGVjdGVkIE5vZGVzIGJvZHk7CisgICAgcHJvdGVjdGVkIFN0cmluZyB0ZXh0OworICAgIHByb3RlY3RlZCBNYXJrIHN0YXJ0TWFyazsKKyAgICBwcm90ZWN0ZWQgaW50IGJlZ2luSmF2YUxpbmU7CisgICAgcHJvdGVjdGVkIGludCBlbmRKYXZhTGluZTsKKyAgICBwcm90ZWN0ZWQgTm9kZSBwYXJlbnQ7CisgICAgcHJvdGVjdGVkIE5vZGVzIG5hbWVkQXR0cmlidXRlTm9kZXM7IC8vIGNhY2hlZCBmb3IgcGVyZm9ybWFuY2UKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHFOYW1lOworICAgIHByb3RlY3RlZCBTdHJpbmcgbG9jYWxOYW1lOworICAgIC8qCisgICAgICogVGhlIG5hbWUgb2YgdGhlIGlubmVyIGNsYXNzIHRvIHdoaWNoIHRoZSBjb2RlcyBmb3IgdGhpcyBub2RlIGFuZAorICAgICAqIGl0cyBib2R5IGFyZSBnZW5lcmF0ZWQuICBGb3IgaW5zdGFuY2UsIGZvciA8anNwOmJvZHk+IGluIGZvby5qc3AsCisgICAgICogdGhpcyBpcyAiZm9vX2pzcEhlbHBlciIuICBUaGlzIGlzIHByaW1hcmlseSB1c2VkIGZvciBjb21tdW5pY2F0aW5nCisgICAgICogc3VjaCBpbmZvIGZyb20gR2VuZXJhdG9yIHRvIFNtYXAgZ2VuZXJhdG9yLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgaW5uZXJDbGFzc05hbWU7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNEdW1teTsKKworICAgIC8qKgorICAgICAqIFplcm8tYXJnIENvbnN0cnVjdG9yLgorICAgICAqLworICAgIHB1YmxpYyBOb2RlKCkgeworCXRoaXMuaXNEdW1teSA9IHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RhcnQgVGhlIGxvY2F0aW9uIG9mIHRoZSBqc3AgcGFnZQorICAgICAqIEBwYXJhbSBwYXJlbnQgVGhlIGVuY2xvc2luZyBub2RlCisgICAgICovCisgICAgcHVibGljIE5vZGUoTWFyayBzdGFydCwgTm9kZSBwYXJlbnQpIHsKKwl0aGlzLnN0YXJ0TWFyayA9IHN0YXJ0OworCXRoaXMuaXNEdW1teSA9IChzdGFydCA9PSBudWxsKTsKKwlhZGRUb1BhcmVudChwYXJlbnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIHFOYW1lIFRoZSBhY3Rpb24ncyBxdWFsaWZpZWQgbmFtZQorICAgICAqIEBwYXJhbSBsb2NhbE5hbWUgVGhlIGFjdGlvbidzIGxvY2FsIG5hbWUKKyAgICAgKiBAcGFyYW0gc3RhcnQgVGhlIGxvY2F0aW9uIG9mIHRoZSBqc3AgcGFnZQorICAgICAqIEBwYXJhbSBwYXJlbnQgVGhlIGVuY2xvc2luZyBub2RlCisgICAgICovCisgICAgcHVibGljIE5vZGUoU3RyaW5nIHFOYW1lLCBTdHJpbmcgbG9jYWxOYW1lLCBNYXJrIHN0YXJ0LCBOb2RlIHBhcmVudCkgeworCXRoaXMucU5hbWUgPSBxTmFtZTsKKwl0aGlzLmxvY2FsTmFtZSA9IGxvY2FsTmFtZTsKKwl0aGlzLnN0YXJ0TWFyayA9IHN0YXJ0OworCXRoaXMuaXNEdW1teSA9IChzdGFydCA9PSBudWxsKTsKKwlhZGRUb1BhcmVudChwYXJlbnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGZvciBOb2RlcyBwYXJzZWQgZnJvbSBzdGFuZGFyZCBzeW50YXguCisgICAgICoKKyAgICAgKiBAcGFyYW0gcU5hbWUgVGhlIGFjdGlvbidzIHF1YWxpZmllZCBuYW1lCisgICAgICogQHBhcmFtIGxvY2FsTmFtZSBUaGUgYWN0aW9uJ3MgbG9jYWwgbmFtZQorICAgICAqIEBwYXJhbSBhdHRycyBUaGUgYXR0cmlidXRlcyBmb3IgdGhpcyBub2RlCisgICAgICogQHBhcmFtIHN0YXJ0IFRoZSBsb2NhdGlvbiBvZiB0aGUganNwIHBhZ2UKKyAgICAgKiBAcGFyYW0gcGFyZW50IFRoZSBlbmNsb3Npbmcgbm9kZQorICAgICAqLworICAgIHB1YmxpYyBOb2RlKFN0cmluZyBxTmFtZSwgU3RyaW5nIGxvY2FsTmFtZSwgQXR0cmlidXRlcyBhdHRycywgTWFyayBzdGFydCwKKwkJTm9kZSBwYXJlbnQpIHsKKwl0aGlzLnFOYW1lID0gcU5hbWU7CisJdGhpcy5sb2NhbE5hbWUgPSBsb2NhbE5hbWU7CisJdGhpcy5hdHRycyA9IGF0dHJzOworCXRoaXMuc3RhcnRNYXJrID0gc3RhcnQ7CisJdGhpcy5pc0R1bW15ID0gKHN0YXJ0ID09IG51bGwpOworCWFkZFRvUGFyZW50KHBhcmVudCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIE5vZGVzIHBhcnNlZCBmcm9tIFhNTCBzeW50YXguCisgICAgICoKKyAgICAgKiBAcGFyYW0gcU5hbWUgVGhlIGFjdGlvbidzIHF1YWxpZmllZCBuYW1lCisgICAgICogQHBhcmFtIGxvY2FsTmFtZSBUaGUgYWN0aW9uJ3MgbG9jYWwgbmFtZQorICAgICAqIEBwYXJhbSBhdHRycyBUaGUgYWN0aW9uJ3MgYXR0cmlidXRlcyB3aG9zZSBuYW1lIGRvZXMgbm90IHN0YXJ0IHdpdGgKKyAgICAgKiB4bWxucworICAgICAqIEBwYXJhbSBub25UYWdsaWJYbWxuc0F0dHJzIFRoZSBhY3Rpb24ncyB4bWxucyBhdHRyaWJ1dGVzIHRoYXQgZG8gbm90CisgICAgICogcmVwcmVzZW50IHRhZyBsaWJyYXJpZXMKKyAgICAgKiBAcGFyYW0gdGFnbGliQXR0cnMgVGhlIGFjdGlvbidzIHhtbG5zIGF0dHJpYnV0ZXMgdGhhdCByZXByZXNlbnQgdGFnCisgICAgICogbGlicmFyaWVzCisgICAgICogQHBhcmFtIHN0YXJ0IFRoZSBsb2NhdGlvbiBvZiB0aGUganNwIHBhZ2UKKyAgICAgKiBAcGFyYW0gcGFyZW50IFRoZSBlbmNsb3Npbmcgbm9kZQorICAgICAqLworICAgIHB1YmxpYyBOb2RlKFN0cmluZyBxTmFtZSwgU3RyaW5nIGxvY2FsTmFtZSwgQXR0cmlidXRlcyBhdHRycywKKwkJQXR0cmlidXRlcyBub25UYWdsaWJYbWxuc0F0dHJzLCBBdHRyaWJ1dGVzIHRhZ2xpYkF0dHJzLAorCQlNYXJrIHN0YXJ0LCBOb2RlIHBhcmVudCkgeworCXRoaXMucU5hbWUgPSBxTmFtZTsKKwl0aGlzLmxvY2FsTmFtZSA9IGxvY2FsTmFtZTsKKwl0aGlzLmF0dHJzID0gYXR0cnM7CisJdGhpcy5ub25UYWdsaWJYbWxuc0F0dHJzID0gbm9uVGFnbGliWG1sbnNBdHRyczsKKwl0aGlzLnRhZ2xpYkF0dHJzID0gdGFnbGliQXR0cnM7CisJdGhpcy5zdGFydE1hcmsgPSBzdGFydDsKKwl0aGlzLmlzRHVtbXkgPSAoc3RhcnQgPT0gbnVsbCk7CisJYWRkVG9QYXJlbnQocGFyZW50KTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIENvbnN0cnVjdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIHFOYW1lIFRoZSBhY3Rpb24ncyBxdWFsaWZpZWQgbmFtZQorICAgICAqIEBwYXJhbSBsb2NhbE5hbWUgVGhlIGFjdGlvbidzIGxvY2FsIG5hbWUKKyAgICAgKiBAcGFyYW0gdGV4dCBUaGUgdGV4dCBhc3NvY2lhdGVkIHdpdGggdGhpcyBub2RlCisgICAgICogQHBhcmFtIHN0YXJ0IFRoZSBsb2NhdGlvbiBvZiB0aGUganNwIHBhZ2UKKyAgICAgKiBAcGFyYW0gcGFyZW50IFRoZSBlbmNsb3Npbmcgbm9kZQorICAgICAqLworICAgIHB1YmxpYyBOb2RlKFN0cmluZyBxTmFtZSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHRleHQsIE1hcmsgc3RhcnQsCisJCU5vZGUgcGFyZW50KSB7CisJdGhpcy5xTmFtZSA9IHFOYW1lOworCXRoaXMubG9jYWxOYW1lID0gbG9jYWxOYW1lOworCXRoaXMudGV4dCA9IHRleHQ7CisJdGhpcy5zdGFydE1hcmsgPSBzdGFydDsKKwl0aGlzLmlzRHVtbXkgPSAoc3RhcnQgPT0gbnVsbCk7CisJYWRkVG9QYXJlbnQocGFyZW50KTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFFOYW1lKCkgeworCXJldHVybiB0aGlzLnFOYW1lOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxOYW1lKCkgeworCXJldHVybiB0aGlzLmxvY2FsTmFtZTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIEdldHMgdGhpcyBOb2RlJ3MgYXR0cmlidXRlcy4KKyAgICAgKgorICAgICAqIEluIHRoZSBjYXNlIG9mIGEgTm9kZSBwYXJzZWQgZnJvbSBzdGFuZGFyZCBzeW50YXgsIHRoaXMgbWV0aG9kIHJldHVybnMKKyAgICAgKiBhbGwgdGhlIE5vZGUncyBhdHRyaWJ1dGVzLgorICAgICAqCisgICAgICogSW4gdGhlIGNhc2Ugb2YgYSBOb2RlIHBhcnNlZCBmcm9tIFhNTCBzeW50YXgsIHRoaXMgbWV0aG9kIHJldHVybnMgb25seQorICAgICAqIHRob3NlIGF0dHJpYnV0ZXMgd2hvc2UgbmFtZSBkb2VzIG5vdCBzdGFydCB3aXRoIHhtbG5zLgorICAgICAqLworICAgIHB1YmxpYyBBdHRyaWJ1dGVzIGdldEF0dHJpYnV0ZXMoKSB7CisJcmV0dXJuIHRoaXMuYXR0cnM7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBHZXRzIHRoaXMgTm9kZSdzIHhtbG5zIGF0dHJpYnV0ZXMgdGhhdCByZXByZXNlbnQgdGFnIGxpYnJhcmllcworICAgICAqIChvbmx5IG1lYW5pbmdmdWwgZm9yIE5vZGVzIHBhcnNlZCBmcm9tIFhNTCBzeW50YXgpCisgICAgICovCisgICAgcHVibGljIEF0dHJpYnV0ZXMgZ2V0VGFnbGliQXR0cmlidXRlcygpIHsKKwlyZXR1cm4gdGhpcy50YWdsaWJBdHRyczsKKyAgICB9CisKKyAgICAvKgorICAgICAqIEdldHMgdGhpcyBOb2RlJ3MgeG1sbnMgYXR0cmlidXRlcyB0aGF0IGRvIG5vdCByZXByZXNlbnQgdGFnIGxpYnJhcmllcworICAgICAqIChvbmx5IG1lYW5pbmdmdWwgZm9yIE5vZGVzIHBhcnNlZCBmcm9tIFhNTCBzeW50YXgpCisgICAgICovCisgICAgcHVibGljIEF0dHJpYnV0ZXMgZ2V0Tm9uVGFnbGliWG1sbnNBdHRyaWJ1dGVzKCkgeworCXJldHVybiB0aGlzLm5vblRhZ2xpYlhtbG5zQXR0cnM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlcyhBdHRyaWJ1dGVzIGF0dHJzKSB7CisJdGhpcy5hdHRycyA9IGF0dHJzOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlVmFsdWUoU3RyaW5nIG5hbWUpIHsKKwlyZXR1cm4gKGF0dHJzID09IG51bGwpID8gbnVsbCA6IGF0dHJzLmdldFZhbHVlKG5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgYXR0cmlidXRlIHRoYXQgaXMgbm9uIHJlcXVlc3QgdGltZSBleHByZXNzaW9uLCBlaXRoZXIKKyAgICAgKiBmcm9tIHRoZSBhdHRyaWJ1dGUgb2YgdGhlIG5vZGUsIG9yIGZyb20gYSBqc3A6YXR0cmJ1dGUgCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRUZXh0QXR0cmlidXRlKFN0cmluZyBuYW1lKSB7CisKKwlTdHJpbmcgYXR0ciA9IGdldEF0dHJpYnV0ZVZhbHVlKG5hbWUpOworCWlmIChhdHRyICE9IG51bGwpIHsKKwkgICAgcmV0dXJuIGF0dHI7CisJfQorCisJTmFtZWRBdHRyaWJ1dGUgbmFtZWRBdHRyaWJ1dGUgPSBnZXROYW1lZEF0dHJpYnV0ZU5vZGUobmFtZSk7CisJaWYgKG5hbWVkQXR0cmlidXRlID09IG51bGwpIHsKKwkgICAgcmV0dXJuIG51bGw7CisJfQorCisJcmV0dXJuIG5hbWVkQXR0cmlidXRlLmdldFRleHQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZWFyY2hlcyBhbGwgc3Vibm9kZXMgb2YgdGhpcyBub2RlIGZvciBqc3A6YXR0cmlidXRlIHN0YW5kYXJkCisgICAgICogYWN0aW9ucyB3aXRoIHRoZSBnaXZlbiBuYW1lLCBhbmQgcmV0dXJucyB0aGUgTmFtZWRBdHRyaWJ1dGUgbm9kZQorICAgICAqIG9mIHRoZSBtYXRjaGluZyBuYW1lZCBhdHRyaWJ1dGUsIG5vciBudWxsIGlmIG5vIHN1Y2ggbm9kZSBpcyBmb3VuZC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIHNob3VsZCBhbHdheXMgYmUgY2FsbGVkIGFuZCBvbmx5IGJlIGNhbGxlZCBmb3Igbm9kZXMgdGhhdAorICAgICAqIGFjY2VwdCBkeW5hbWljIHJ1bnRpbWUgYXR0cmlidXRlIGV4cHJlc3Npb25zLgorICAgICAqLworICAgIHB1YmxpYyBOYW1lZEF0dHJpYnV0ZSBnZXROYW1lZEF0dHJpYnV0ZU5vZGUoIFN0cmluZyBuYW1lICkgeworICAgICAgICBOYW1lZEF0dHJpYnV0ZSByZXN1bHQgPSBudWxsOworICAgICAgICAKKyAgICAgICAgLy8gTG9vayBmb3IgdGhlIGF0dHJpYnV0ZSBpbiBOYW1lZEF0dHJpYnV0ZSBjaGlsZHJlbgorICAgICAgICBOb2RlcyBub2RlcyA9IGdldE5hbWVkQXR0cmlidXRlTm9kZXMoKTsKKyAgICAgICAgaW50IG51bUNoaWxkTm9kZXMgPSBub2Rlcy5zaXplKCk7CisgICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgbnVtQ2hpbGROb2RlczsgaSsrICkgeworICAgICAgICAgICAgTmFtZWRBdHRyaWJ1dGUgbmEgPSAoTmFtZWRBdHRyaWJ1dGUpbm9kZXMuZ2V0Tm9kZSggaSApOworCSAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7CisJICAgIGludCBpbmRleCA9IG5hbWUuaW5kZXhPZignOicpOworCSAgICBpZiAoaW5kZXggIT0gLTEpIHsKKwkJLy8gcXVhbGlmaWVkIG5hbWUKKwkJZm91bmQgPSBuYS5nZXROYW1lKCkuZXF1YWxzKG5hbWUpOworCSAgICB9IGVsc2UgeworCQlmb3VuZCA9IG5hLmdldExvY2FsTmFtZSgpLmVxdWFscyhuYW1lKTsKKwkgICAgfQorCSAgICBpZiAoZm91bmQpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBuYTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZWFyY2hlcyBhbGwgc3Vibm9kZXMgb2YgdGhpcyBub2RlIGZvciBqc3A6YXR0cmlidXRlIHN0YW5kYXJkCisgICAgICogYWN0aW9ucywgYW5kIHJldHVybnMgdGhhdCBzZXQgb2Ygbm9kZXMgYXMgYSBOb2RlLk5vZGVzIG9iamVjdC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gUG9zc2libHkgZW1wdHkgTm9kZS5Ob2RlcyBvYmplY3QgY29udGFpbmluZyBhbnkganNwOmF0dHJpYnV0ZQorICAgICAqIHN1Ym5vZGVzIG9mIHRoaXMgTm9kZQorICAgICAqLworICAgIHB1YmxpYyBOb2RlLk5vZGVzIGdldE5hbWVkQXR0cmlidXRlTm9kZXMoKSB7CisKKwlpZiAobmFtZWRBdHRyaWJ1dGVOb2RlcyAhPSBudWxsKSB7CisJICAgIHJldHVybiBuYW1lZEF0dHJpYnV0ZU5vZGVzOworCX0KKworICAgICAgICBOb2RlLk5vZGVzIHJlc3VsdCA9IG5ldyBOb2RlLk5vZGVzKCk7CisgICAgICAgIAorICAgICAgICAvLyBMb29rIGZvciB0aGUgYXR0cmlidXRlIGluIE5hbWVkQXR0cmlidXRlIGNoaWxkcmVuCisgICAgICAgIE5vZGVzIG5vZGVzID0gZ2V0Qm9keSgpOworICAgICAgICBpZiggbm9kZXMgIT0gbnVsbCApIHsKKyAgICAgICAgICAgIGludCBudW1DaGlsZE5vZGVzID0gbm9kZXMuc2l6ZSgpOworICAgICAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBudW1DaGlsZE5vZGVzOyBpKysgKSB7CisgICAgICAgICAgICAgICAgTm9kZSBuID0gbm9kZXMuZ2V0Tm9kZSggaSApOworICAgICAgICAgICAgICAgIGlmKCBuIGluc3RhbmNlb2YgTmFtZWRBdHRyaWJ1dGUgKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQoIG4gKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoISAobiBpbnN0YW5jZW9mIENvbW1lbnQpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIE5vdGhpbmcgY2FuIGNvbWUgYmVmb3JlIGpzcDphdHRyaWJ1dGUsIGFuZCBvbmx5CisgICAgICAgICAgICAgICAgICAgIC8vIGpzcDpib2R5IGNhbiBjb21lIGFmdGVyIGl0LgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCW5hbWVkQXR0cmlidXRlTm9kZXMgPSByZXN1bHQ7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBOb2RlcyBnZXRCb2R5KCkgeworCXJldHVybiBib2R5OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEJvZHkoTm9kZXMgYm9keSkgeworCXRoaXMuYm9keSA9IGJvZHk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkgeworCXJldHVybiB0ZXh0OworICAgIH0KKworICAgIHB1YmxpYyBNYXJrIGdldFN0YXJ0KCkgeworCXJldHVybiBzdGFydE1hcms7CisgICAgfQorCisgICAgcHVibGljIE5vZGUgZ2V0UGFyZW50KCkgeworCXJldHVybiBwYXJlbnQ7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRCZWdpbkphdmFMaW5lKCkgeworCXJldHVybiBiZWdpbkphdmFMaW5lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEJlZ2luSmF2YUxpbmUoaW50IGJlZ2luKSB7CisJYmVnaW5KYXZhTGluZSA9IGJlZ2luOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0RW5kSmF2YUxpbmUoKSB7CisJcmV0dXJuIGVuZEphdmFMaW5lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEVuZEphdmFMaW5lKGludCBlbmQpIHsKKwllbmRKYXZhTGluZSA9IGVuZDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0R1bW15KCkgeworCXJldHVybiBpc0R1bW15OworICAgIH0KKworICAgIHB1YmxpYyBOb2RlLlJvb3QgZ2V0Um9vdCgpIHsKKwlOb2RlIG4gPSB0aGlzOworCXdoaWxlICghKG4gaW5zdGFuY2VvZiBOb2RlLlJvb3QpKSB7CisJICAgIG4gPSBuLmdldFBhcmVudCgpOworCX0KKwlyZXR1cm4gKE5vZGUuUm9vdCkgbjsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldElubmVyQ2xhc3NOYW1lKCkgeworICAgICAgICByZXR1cm4gaW5uZXJDbGFzc05hbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SW5uZXJDbGFzc05hbWUoU3RyaW5nIGljbikgeworICAgICAgICBpbm5lckNsYXNzTmFtZSA9IGljbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZWxlY3RzIGFuZCBpbnZva2VzIGEgbWV0aG9kIGluIHRoZSB2aXNpdG9yIGNsYXNzIGJhc2VkIG9uIHRoZSBub2RlCisgICAgICogdHlwZS4gIFRoaXMgaXMgYWJzdHJhY3QgYW5kIHNob3VsZCBiZSBvdmVycm9kZSBieSB0aGUgZXh0ZW5kaW5nIGNsYXNzZXMuCisgICAgICogQHBhcmFtIHYgVGhlIHZpc2l0b3IgY2xhc3MKKyAgICAgKi8KKyAgICBhYnN0cmFjdCB2b2lkIGFjY2VwdChWaXNpdG9yIHYpIHRocm93cyBKYXNwZXJFeGNlcHRpb247CisKKworICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgLy8gUHJpdmF0ZSB1dGlsaXR5IG1ldGhvZHMKKworICAgIC8qCisgICAgICogQWRkcyB0aGlzIE5vZGUgdG8gdGhlIGJvZHkgb2YgdGhlIGdpdmVuIHBhcmVudC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYWRkVG9QYXJlbnQoTm9kZSBwYXJlbnQpIHsKKwlpZiAocGFyZW50ICE9IG51bGwpIHsKKwkgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CisJICAgIE5vZGVzIHBhcmVudEJvZHkgPSBwYXJlbnQuZ2V0Qm9keSgpOworCSAgICBpZiAocGFyZW50Qm9keSA9PSBudWxsKSB7CisJCXBhcmVudEJvZHkgPSBuZXcgTm9kZXMoKTsKKwkJcGFyZW50LnNldEJvZHkocGFyZW50Qm9keSk7CisJICAgIH0KKwkgICAgcGFyZW50Qm9keS5hZGQodGhpcyk7CisJfQorICAgIH0KKworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAqIENoaWxkIGNsYXNzZXMKKyAgICAgKi8KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXByZXNlbnRzIHRoZSByb290IG9mIGEgSnNwIHBhZ2Ugb3IgSnNwIGRvY3VtZW50CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSb290IGV4dGVuZHMgTm9kZSB7CisKKwlwcml2YXRlIFJvb3QgcGFyZW50Um9vdDsKKwlwcml2YXRlIGJvb2xlYW4gaXNYbWxTeW50YXg7CisKKwkvLyBTb3VyY2UgZW5jb2Rpbmcgb2YgdGhlIHBhZ2UgY29udGFpbmluZyB0aGlzIFJvb3QKKwlwcml2YXRlIFN0cmluZyBwYWdlRW5jOworCQorCS8vIFBhZ2UgZW5jb2Rpbmcgc3BlY2lmaWVkIGluIEpTUCBjb25maWcgZWxlbWVudAorCXByaXZhdGUgU3RyaW5nIGpzcENvbmZpZ1BhZ2VFbmM7CisKKwkvKgorCSAqIEZsYWcgaW5kaWNhdGluZyBpZiB0aGUgZGVmYXVsdCBwYWdlIGVuY29kaW5nIGlzIGJlaW5nIHVzZWQgKG9ubHkKKwkgKiBhcHBsaWNhYmxlIHdpdGggc3RhbmRhcmQgc3ludGF4KS4KKwkgKgorCSAqIFRydWUgaWYgdGhlIHBhZ2UgZG9lcyBub3QgcHJvdmlkZSBhIHBhZ2UgZGlyZWN0aXZlIHdpdGggYQorCSAqICdjb250ZW50VHlwZScgYXR0cmlidXRlIChvciB0aGUgJ2NvbnRlbnRUeXBlJyBhdHRyaWJ1dGUgZG9lc24ndAorCSAqIGhhdmUgYSBDSEFSU0VUIHZhbHVlKSwgdGhlIHBhZ2UgZG9lcyBub3QgcHJvdmlkZSBhIHBhZ2UgZGlyZWN0aXZlCisJICogd2l0aCBhICdwYWdlRW5jb2RpbmcnIGF0dHJpYnV0ZSwgYW5kIHRoZXJlIGlzIG5vIEpTUCBjb25maWd1cmF0aW9uCisJICogZWxlbWVudCBwYWdlLWVuY29kaW5nIHdob3NlIFVSTCBwYXR0ZXJuIG1hdGNoZXMgdGhlIHBhZ2UuCisJICovCisJcHJpdmF0ZSBib29sZWFuIGlzRGVmYXVsdFBhZ2VFbmNvZGluZzsKKworCS8qCisJICogSW5kaWNhdGVzIHdoZXRoZXIgYW4gZW5jb2RpbmcgaGFzIGJlZW4gZXhwbGljaXRseSBzcGVjaWZpZWQgaW4gdGhlCisJICogcGFnZSdzIFhNTCBwcm9sb2cgKG9ubHkgdXNlZCBmb3IgcGFnZXMgaW4gWE1MIHN5bnRheCkuCisJICogVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VkIHRvIGRlY2lkZSB3aGV0aGVyIGEgdHJhbnNsYXRpb24gZXJyb3IgbXVzdAorCSAqIGJlIHJlcG9ydGVkIGZvciBlbmNvZGluZyBjb25mbGljdHMuCisJICovCisJcHJpdmF0ZSBib29sZWFuIGlzRW5jb2RpbmdTcGVjaWZpZWRJblByb2xvZzsKKworCS8qCisJICogQ29uc3RydWN0b3IuCisJICovCisJUm9vdChNYXJrIHN0YXJ0LCBOb2RlIHBhcmVudCwgYm9vbGVhbiBpc1htbFN5bnRheCkgeworCSAgICBzdXBlcihzdGFydCwgcGFyZW50KTsKKwkgICAgdGhpcy5pc1htbFN5bnRheCA9IGlzWG1sU3ludGF4OworCSAgICB0aGlzLnFOYW1lID0gSlNQX1JPT1RfQUNUSU9OOworCSAgICB0aGlzLmxvY2FsTmFtZSA9IFJPT1RfQUNUSU9OOworCisJICAgIC8vIEZpZ3VyZSBvdXQgYW5kIHNldCB0aGUgcGFyZW50IHJvb3QKKwkgICAgTm9kZSByID0gcGFyZW50OworCSAgICB3aGlsZSAoKHIgIT0gbnVsbCkgJiYgIShyIGluc3RhbmNlb2YgTm9kZS5Sb290KSkKKwkJciA9IHIuZ2V0UGFyZW50KCk7CisJICAgIHBhcmVudFJvb3QgPSAoTm9kZS5Sb290KSByOworCX0KKworCXB1YmxpYyB2b2lkIGFjY2VwdChWaXNpdG9yIHYpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCSAgICB2LnZpc2l0KHRoaXMpOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzWG1sU3ludGF4KCkgeworCSAgICByZXR1cm4gaXNYbWxTeW50YXg7CisJfQorCisJLyoKKwkgKiBTZXRzIHRoZSBlbmNvZGluZyBzcGVjaWZpZWQgaW4gdGhlIEpTUCBjb25maWcgZWxlbWVudCB3aG9zZSBVUkwKKwkgKiBwYXR0ZXJuIG1hdGNoZXMgdGhlIHBhZ2UgY29udGFpbmluZyB0aGlzIFJvb3QuCisJICovCisJcHVibGljIHZvaWQgc2V0SnNwQ29uZmlnUGFnZUVuY29kaW5nKFN0cmluZyBlbmMpIHsKKwkgICAganNwQ29uZmlnUGFnZUVuYyA9IGVuYzsKKwl9CisKKwkvKgorCSAqIEdldHMgdGhlIGVuY29kaW5nIHNwZWNpZmllZCBpbiB0aGUgSlNQIGNvbmZpZyBlbGVtZW50IHdob3NlIFVSTAorCSAqIHBhdHRlcm4gbWF0Y2hlcyB0aGUgcGFnZSBjb250YWluaW5nIHRoaXMgUm9vdC4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldEpzcENvbmZpZ1BhZ2VFbmNvZGluZygpIHsKKwkgICAgcmV0dXJuIGpzcENvbmZpZ1BhZ2VFbmM7CisJfQorCisJcHVibGljIHZvaWQgc2V0UGFnZUVuY29kaW5nKFN0cmluZyBlbmMpIHsKKwkgICAgcGFnZUVuYyA9IGVuYzsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFBhZ2VFbmNvZGluZygpIHsKKwkgICAgcmV0dXJuIHBhZ2VFbmM7CisJfQorCisJcHVibGljIHZvaWQgc2V0SXNEZWZhdWx0UGFnZUVuY29kaW5nKGJvb2xlYW4gaXNEZWZhdWx0KSB7CisJICAgIGlzRGVmYXVsdFBhZ2VFbmNvZGluZyA9IGlzRGVmYXVsdDsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRQYWdlRW5jb2RpbmcoKSB7CisJICAgIHJldHVybiBpc0RlZmF1bHRQYWdlRW5jb2Rpbmc7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldElzRW5jb2RpbmdTcGVjaWZpZWRJblByb2xvZyhib29sZWFuIGlzU3BlY2lmaWVkKSB7CisJICAgIGlzRW5jb2RpbmdTcGVjaWZpZWRJblByb2xvZyA9IGlzU3BlY2lmaWVkOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzRW5jb2RpbmdTcGVjaWZpZWRJblByb2xvZygpIHsKKwkgICAgcmV0dXJuIGlzRW5jb2RpbmdTcGVjaWZpZWRJblByb2xvZzsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIFRoZSBlbmNsb3Npbmcgcm9vdCB0byB0aGlzIFJvb3QuIFVzdWFsbHkgcmVwcmVzZW50cyB0aGUKKwkgKiBwYWdlIHRoYXQgaW5jbHVkZXMgdGhpcyBvbmUuCisJICovCisJcHVibGljIFJvb3QgZ2V0UGFyZW50Um9vdCgpIHsKKwkgICAgcmV0dXJuIHBhcmVudFJvb3Q7CisJfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXByZXNlbnRzIHRoZSByb290IG9mIGEgSnNwIGRvY3VtZW50IChYTUwgc3ludGF4KQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSnNwUm9vdCBleHRlbmRzIE5vZGUgeworCisJcHVibGljIEpzcFJvb3QoU3RyaW5nIHFOYW1lLCBBdHRyaWJ1dGVzIGF0dHJzLAorCQkgICAgICAgQXR0cmlidXRlcyBub25UYWdsaWJYbWxuc0F0dHJzLCBBdHRyaWJ1dGVzIHRhZ2xpYkF0dHJzLAorCQkgICAgICAgTWFyayBzdGFydCwgTm9kZSBwYXJlbnQpIHsKKwkgICAgc3VwZXIocU5hbWUsIFJPT1RfQUNUSU9OLCBhdHRycywgbm9uVGFnbGliWG1sbnNBdHRycywgdGFnbGliQXR0cnMsCisJCSAgc3RhcnQsIHBhcmVudCk7CisJfQorCisJcHVibGljIHZvaWQgYWNjZXB0KFZpc2l0b3IgdikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJICAgIHYudmlzaXQodGhpcyk7CisJfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcHJlc2VudHMgYSBwYWdlIGRpcmVjdGl2ZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUGFnZURpcmVjdGl2ZSBleHRlbmRzIE5vZGUgeworCisJcHJpdmF0ZSBWZWN0b3IgaW1wb3J0czsKKworCXB1YmxpYyBQYWdlRGlyZWN0aXZlKEF0dHJpYnV0ZXMgYXR0cnMsIE1hcmsgc3RhcnQsIE5vZGUgcGFyZW50KSB7CisJICAgIHRoaXMoSlNQX1BBR0VfRElSRUNUSVZFX0FDVElPTiwgYXR0cnMsIG51bGwsIG51bGwsIHN0YXJ0LCBwYXJlbnQpOworCX0KKworCXB1YmxpYyBQYWdlRGlyZWN0aXZlKFN0cmluZyBxTmFtZSwgQXR0cmlidXRlcyBhdHRycywKKwkJCSAgICAgQXR0cmlidXRlcyBub25UYWdsaWJYbWxuc0F0dHJzLAorCQkJICAgICBBdHRyaWJ1dGVzIHRhZ2xpYkF0dHJzLCBNYXJrIHN0YXJ0LCBOb2RlIHBhcmVudCkgeworCSAgICBzdXBlcihxTmFtZSwgUEFHRV9ESVJFQ1RJVkVfQUNUSU9OLCBhdHRycywgbm9uVGFnbGliWG1sbnNBdHRycywKKwkJICB0YWdsaWJBdHRycywgc3RhcnQsIHBhcmVudCk7CisJICAgIGltcG9ydHMgPSBuZXcgVmVjdG9yKCk7CisJfQorCisJcHVibGljIHZvaWQgYWNjZXB0KFZpc2l0b3IgdikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJICAgIHYudmlzaXQodGhpcyk7CisJfQorCisJLyoqCisJICogUGFyc2VzIHRoZSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBjbGFzcyBvciBwYWNrYWdlIG5hbWVzIGluIHRoZQorCSAqIGdpdmVuIGF0dHJpYnV0ZSB2YWx1ZSBhbmQgYWRkcyBlYWNoIGNvbXBvbmVudCB0byB0aGlzCisJICogUGFnZURpcmVjdGl2ZSdzIHZlY3RvciBvZiBpbXBvcnRlZCBjbGFzc2VzIGFuZCBwYWNrYWdlcy4KKwkgKiBAcGFyYW0gdmFsdWUgQSBjb21tYS1zZXBhcmF0ZWQgc3RyaW5nIG9mIGltcG9ydHMuCisJICovCisJcHVibGljIHZvaWQgYWRkSW1wb3J0KFN0cmluZyB2YWx1ZSkgeworCSAgICBpbnQgc3RhcnQgPSAwOworCSAgICBpbnQgaW5kZXg7CisJICAgIHdoaWxlICgoaW5kZXggPSB2YWx1ZS5pbmRleE9mKCcsJywgc3RhcnQpKSAhPSAtMSkgeworCQlpbXBvcnRzLmFkZCh2YWx1ZS5zdWJzdHJpbmcoc3RhcnQsIGluZGV4KS50cmltKCkpOworCQlzdGFydCA9IGluZGV4ICsgMTsKKwkgICAgfQorCSAgICBpZiAoc3RhcnQgPT0gMCkgeworCQkvLyBObyBjb21tYSBmb3VuZAorCQlpbXBvcnRzLmFkZCh2YWx1ZS50cmltKCkpOworCSAgICB9IGVsc2UgeworCQlpbXBvcnRzLmFkZCh2YWx1ZS5zdWJzdHJpbmcoc3RhcnQpLnRyaW0oKSk7CisJICAgIH0KKwl9CisKKwlwdWJsaWMgTGlzdCBnZXRJbXBvcnRzKCkgeworCSAgICByZXR1cm4gaW1wb3J0czsKKwl9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwcmVzZW50cyBhbiBpbmNsdWRlIGRpcmVjdGl2ZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW5jbHVkZURpcmVjdGl2ZSBleHRlbmRzIE5vZGUgeworCisJcHVibGljIEluY2x1ZGVEaXJlY3RpdmUoQXR0cmlidXRlcyBhdHRycywgTWFyayBzdGFydCwgTm9kZSBwYXJlbnQpIHsKKwkgICAgdGhpcyhKU1BfSU5DTFVERV9ESVJFQ1RJVkVfQUNUSU9OLCBhdHRycywgbnVsbCwgbnVsbCwgc3RhcnQsCisJCSBwYXJlbnQpOworCX0KKworCXB1YmxpYyBJbmNsdWRlRGlyZWN0aXZlKFN0cmluZyBxTmFtZSwgQXR0cmlidXRlcyBhdHRycywKKwkJCQlBdHRyaWJ1dGVzIG5vblRhZ2xpYlhtbG5zQXR0cnMsCisJCQkJQXR0cmlidXRlcyB0YWdsaWJBdHRycywgTWFyayBzdGFydCwKKwkJCQlOb2RlIHBhcmVudCkgeworCSAgICBzdXBlcihxTmFtZSwgSU5DTFVERV9ESVJFQ1RJVkVfQUNUSU9OLCBhdHRycywgbm9uVGFnbGliWG1sbnNBdHRycywKKwkJICB0YWdsaWJBdHRycywgc3RhcnQsIHBhcmVudCk7CisJfQorCisJcHVibGljIHZvaWQgYWNjZXB0KFZpc2l0b3IgdikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJICAgIHYudmlzaXQodGhpcyk7CisJfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcHJlc2VudHMgYSBjdXN0b20gdGFnbGliIGRpcmVjdGl2ZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGFnbGliRGlyZWN0aXZlIGV4dGVuZHMgTm9kZSB7CisKKwlwdWJsaWMgVGFnbGliRGlyZWN0aXZlKEF0dHJpYnV0ZXMgYXR0cnMsIE1hcmsgc3RhcnQsIE5vZGUgcGFyZW50KSB7CisJICAgIHN1cGVyKEpTUF9UQUdMSUJfRElSRUNUSVZFX0FDVElPTiwgVEFHTElCX0RJUkVDVElWRV9BQ1RJT04sIGF0dHJzLAorCQkgIHN0YXJ0LCBwYXJlbnQpOworCX0KKworCXB1YmxpYyB2b2lkIGFjY2VwdChWaXNpdG9yIHYpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCSAgICB2LnZpc2l0KHRoaXMpOworCX0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXByZXNlbnRzIGEgdGFnIGRpcmVjdGl2ZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGFnRGlyZWN0aXZlIGV4dGVuZHMgTm9kZSB7CisgICAgICAgIHByaXZhdGUgVmVjdG9yIGltcG9ydHM7CisKKwlwdWJsaWMgVGFnRGlyZWN0aXZlKEF0dHJpYnV0ZXMgYXR0cnMsIE1hcmsgc3RhcnQsIE5vZGUgcGFyZW50KSB7CisJICAgIHRoaXMoSlNQX1RBR19ESVJFQ1RJVkVfQUNUSU9OLCBhdHRycywgbnVsbCwgbnVsbCwgc3RhcnQsIHBhcmVudCk7CisJfQorCisJcHVibGljIFRhZ0RpcmVjdGl2ZShTdHJpbmcgcU5hbWUsIEF0dHJpYnV0ZXMgYXR0cnMsCisJCQkgICAgQXR0cmlidXRlcyBub25UYWdsaWJYbWxuc0F0dHJzLAorCQkJICAgIEF0dHJpYnV0ZXMgdGFnbGliQXR0cnMsIE1hcmsgc3RhcnQsIE5vZGUgcGFyZW50KSB7CisJICAgIHN1cGVyKHFOYW1lLCBUQUdfRElSRUNUSVZFX0FDVElPTiwgYXR0cnMsIG5vblRhZ2xpYlhtbG5zQXR0cnMsCisJCSAgdGFnbGliQXR0cnMsIHN0YXJ0LCBwYXJlbnQpOworICAgICAgICAgICAgaW1wb3J0cyA9IG5ldyBWZWN0b3IoKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBhY2NlcHQoVmlzaXRvciB2KSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwkgICAgdi52aXNpdCh0aGlzKTsKKyAgICAgICAgfQorIAorICAgICAgICAvKioKKyAgICAgICAgICogUGFyc2VzIHRoZSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBjbGFzcyBvciBwYWNrYWdlIG5hbWVzIGluIHRoZQorICAgICAgICAgKiBnaXZlbiBhdHRyaWJ1dGUgdmFsdWUgYW5kIGFkZHMgZWFjaCBjb21wb25lbnQgdG8gdGhpcworICAgICAgICAgKiBQYWdlRGlyZWN0aXZlJ3MgdmVjdG9yIG9mIGltcG9ydGVkIGNsYXNzZXMgYW5kIHBhY2thZ2VzLgorICAgICAgICAgKiBAcGFyYW0gdmFsdWUgQSBjb21tYS1zZXBhcmF0ZWQgc3RyaW5nIG9mIGltcG9ydHMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBhZGRJbXBvcnQoU3RyaW5nIHZhbHVlKSB7CisgICAgICAgICAgICBpbnQgc3RhcnQgPSAwOworICAgICAgICAgICAgaW50IGluZGV4OworICAgICAgICAgICAgd2hpbGUgKChpbmRleCA9IHZhbHVlLmluZGV4T2YoJywnLCBzdGFydCkpICE9IC0xKSB7CisgICAgICAgICAgICAgICAgaW1wb3J0cy5hZGQodmFsdWUuc3Vic3RyaW5nKHN0YXJ0LCBpbmRleCkudHJpbSgpKTsKKyAgICAgICAgICAgICAgICBzdGFydCA9IGluZGV4ICsgMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdGFydCA9PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gTm8gY29tbWEgZm91bmQKKyAgICAgICAgICAgICAgICBpbXBvcnRzLmFkZCh2YWx1ZS50cmltKCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbXBvcnRzLmFkZCh2YWx1ZS5zdWJzdHJpbmcoc3RhcnQpLnRyaW0oKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAKKyAgICAgICAgcHVibGljIExpc3QgZ2V0SW1wb3J0cygpIHsKKyAgICAgICAgICAgIHJldHVybiBpbXBvcnRzOworCX0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXByZXNlbnRzIGFuIGF0dHJpYnV0ZSBkaXJlY3RpdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEF0dHJpYnV0ZURpcmVjdGl2ZSBleHRlbmRzIE5vZGUgeworCisJcHVibGljIEF0dHJpYnV0ZURpcmVjdGl2ZShBdHRyaWJ1dGVzIGF0dHJzLCBNYXJrIHN0YXJ0LCBOb2RlIHBhcmVudCkgeworCSAgICB0aGlzKEpTUF9BVFRSSUJVVEVfRElSRUNUSVZFX0FDVElPTiwgYXR0cnMsIG51bGwsIG51bGwsIHN0YXJ0LAorCQkgcGFyZW50KTsKKwl9CisKKwlwdWJsaWMgQXR0cmlidXRlRGlyZWN0aXZlKFN0cmluZyBxTmFtZSwgQXR0cmlidXRlcyBhdHRycywKKwkJCQkgIEF0dHJpYnV0ZXMgbm9uVGFnbGliWG1sbnNBdHRycywKKwkJCQkgIEF0dHJpYnV0ZXMgdGFnbGliQXR0cnMsIE1hcmsgc3RhcnQsCisJCQkJICBOb2RlIHBhcmVudCkgeworCSAgICBzdXBlcihxTmFtZSwgQVRUUklCVVRFX0RJUkVDVElWRV9BQ1RJT04sIGF0dHJzLAorCQkgIG5vblRhZ2xpYlhtbG5zQXR0cnMsIHRhZ2xpYkF0dHJzLCBzdGFydCwgcGFyZW50KTsKKwl9CisKKwlwdWJsaWMgdm9pZCBhY2NlcHQoVmlzaXRvciB2KSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwkgICAgdi52aXNpdCh0aGlzKTsKKwl9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwcmVzZW50cyBhIHZhcmlhYmxlIGRpcmVjdGl2ZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVmFyaWFibGVEaXJlY3RpdmUgZXh0ZW5kcyBOb2RlIHsKKworCXB1YmxpYyBWYXJpYWJsZURpcmVjdGl2ZShBdHRyaWJ1dGVzIGF0dHJzLCBNYXJrIHN0YXJ0LCBOb2RlIHBhcmVudCkgeworCSAgICB0aGlzKEpTUF9WQVJJQUJMRV9ESVJFQ1RJVkVfQUNUSU9OLCBhdHRycywgbnVsbCwgbnVsbCwgc3RhcnQsCisJCSBwYXJlbnQpOworCX0KKworCXB1YmxpYyBWYXJpYWJsZURpcmVjdGl2ZShTdHJpbmcgcU5hbWUsIEF0dHJpYnV0ZXMgYXR0cnMsCisJCQkJIEF0dHJpYnV0ZXMgbm9uVGFnbGliWG1sbnNBdHRycywKKwkJCQkgQXR0cmlidXRlcyB0YWdsaWJBdHRycywKKwkJCQkgTWFyayBzdGFydCwgTm9kZSBwYXJlbnQpIHsKKwkgICAgc3VwZXIocU5hbWUsIFZBUklBQkxFX0RJUkVDVElWRV9BQ1RJT04sIGF0dHJzLCBub25UYWdsaWJYbWxuc0F0dHJzLAorCQkgIHRhZ2xpYkF0dHJzLCBzdGFydCwgcGFyZW50KTsKKwl9CisKKwlwdWJsaWMgdm9pZCBhY2NlcHQoVmlzaXRvciB2KSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwkgICAgdi52aXNpdCh0aGlzKTsKKwl9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwcmVzZW50cyBhIDxqc3A6aW52b2tlPiB0YWcgZmlsZSBhY3Rpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEludm9rZUFjdGlvbiBleHRlbmRzIE5vZGUgeworCisJcHVibGljIEludm9rZUFjdGlvbihBdHRyaWJ1dGVzIGF0dHJzLCBNYXJrIHN0YXJ0LCBOb2RlIHBhcmVudCkgeworCSAgICB0aGlzKEpTUF9JTlZPS0VfQUNUSU9OLCBhdHRycywgbnVsbCwgbnVsbCwgc3RhcnQsIHBhcmVudCk7CisJfQorCisJcHVibGljIEludm9rZUFjdGlvbihTdHJpbmcgcU5hbWUsIEF0dHJpYnV0ZXMgYXR0cnMsCisJCQkgICAgQXR0cmlidXRlcyBub25UYWdsaWJYbWxuc0F0dHJzLAorCQkJICAgIEF0dHJpYnV0ZXMgdGFnbGliQXR0cnMsIE1hcmsgc3RhcnQsIE5vZGUgcGFyZW50KSB7CisJICAgIHN1cGVyKHFOYW1lLCBJTlZPS0VfQUNUSU9OLCBhdHRycywgbm9uVGFnbGliWG1sbnNBdHRycywKKwkJICB0YWdsaWJBdHRycywgc3RhcnQsIHBhcmVudCk7CisJfQorCisJcHVibGljIHZvaWQgYWNjZXB0KFZpc2l0b3IgdikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJICAgIHYudmlzaXQodGhpcyk7CisJfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcHJlc2VudHMgYSA8anNwOmRvQm9keT4gdGFnIGZpbGUgYWN0aW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBEb0JvZHlBY3Rpb24gZXh0ZW5kcyBOb2RlIHsKKworCXB1YmxpYyBEb0JvZHlBY3Rpb24oQXR0cmlidXRlcyBhdHRycywgTWFyayBzdGFydCwgTm9kZSBwYXJlbnQpIHsKKwkgICAgdGhpcyhKU1BfRE9CT0RZX0FDVElPTiwgYXR0cnMsIG51bGwsIG51bGwsIHN0YXJ0LCBwYXJlbnQpOworCX0KKworCXB1YmxpYyBEb0JvZHlBY3Rpb24oU3RyaW5nIHFOYW1lLCBBdHRyaWJ1dGVzIGF0dHJzLAorCQkJICAgIEF0dHJpYnV0ZXMgbm9uVGFnbGliWG1sbnNBdHRycywKKwkJCSAgICBBdHRyaWJ1dGVzIHRhZ2xpYkF0dHJzLCBNYXJrIHN0YXJ0LCBOb2RlIHBhcmVudCkgeworCSAgICBzdXBlcihxTmFtZSwgRE9CT0RZX0FDVElPTiwgYXR0cnMsIG5vblRhZ2xpYlhtbG5zQXR0cnMsCisJCSAgdGFnbGliQXR0cnMsIHN0YXJ0LCBwYXJlbnQpOworCX0KKworCXB1YmxpYyB2b2lkIGFjY2VwdChWaXNpdG9yIHYpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCSAgICB2LnZpc2l0KHRoaXMpOworCX0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXByZXNlbnRzIGEgSnNwIGNvbW1lbnQKKyAgICAgKiBDb21tZW50cyBhcmUga2VwdCBmb3IgY29tcGxldGVuZXNzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ29tbWVudCBleHRlbmRzIE5vZGUgeworCisJcHVibGljIENvbW1lbnQoU3RyaW5nIHRleHQsIE1hcmsgc3RhcnQsIE5vZGUgcGFyZW50KSB7CisJICAgIHN1cGVyKG51bGwsIG51bGwsIHRleHQsIHN0YXJ0LCBwYXJlbnQpOworCX0KKworCXB1YmxpYyB2b2lkIGFjY2VwdChWaXNpdG9yIHYpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCSAgICB2LnZpc2l0KHRoaXMpOworCX0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXByZXNlbnRzIGFuIGV4cHJlc3Npb24sIGRlY2xhcmF0aW9uLCBvciBzY3JpcHRsZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIFNjcmlwdGluZ0VsZW1lbnQgZXh0ZW5kcyBOb2RlIHsKKworCXB1YmxpYyBTY3JpcHRpbmdFbGVtZW50KFN0cmluZyBxTmFtZSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHRleHQsCisJCQkJTWFyayBzdGFydCwgTm9kZSBwYXJlbnQpIHsKKwkgICAgc3VwZXIocU5hbWUsIGxvY2FsTmFtZSwgdGV4dCwgc3RhcnQsIHBhcmVudCk7CisJfQorCisJcHVibGljIFNjcmlwdGluZ0VsZW1lbnQoU3RyaW5nIHFOYW1lLCBTdHJpbmcgbG9jYWxOYW1lLAorCQkJCUF0dHJpYnV0ZXMgbm9uVGFnbGliWG1sbnNBdHRycywKKwkJCQlBdHRyaWJ1dGVzIHRhZ2xpYkF0dHJzLCBNYXJrIHN0YXJ0LAorCQkJCU5vZGUgcGFyZW50KSB7CisJICAgIHN1cGVyKHFOYW1lLCBsb2NhbE5hbWUsIG51bGwsIG5vblRhZ2xpYlhtbG5zQXR0cnMsIHRhZ2xpYkF0dHJzLAorCQkgIHN0YXJ0LCBwYXJlbnQpOworCX0KKworCS8qKgorCSAqIFdoZW4gdGhpcyBub2RlIHdhcyBjcmVhdGVkIGZyb20gYSBKU1AgcGFnZSBpbiBKU1Agc3ludGF4LCBpdHMgdGV4dAorCSAqIHdhcyBzdG9yZWQgYXMgYSBTdHJpbmcgaW4gdGhlICJ0ZXh0IiBmaWVsZCwgd2hlcmVhcyB3aGVuIHRoaXMgbm9kZQorCSAqIHdhcyBjcmVhdGVkIGZyb20gYSBKU1AgZG9jdW1lbnQsIGl0cyB0ZXh0IHdhcyBzdG9yZWQgYXMgb25lIG9yIG1vcmUKKwkgKiBUZW1wbGF0ZVRleHQgbm9kZXMgaW4gaXRzIGJvZHkuIFRoaXMgbWV0aG9kIGhhbmRsZXMgZWl0aGVyIGNhc2UuCisJICogQHJldHVybiBUaGUgdGV4dCBzdHJpbmcKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7CisJICAgIFN0cmluZyByZXQgPSB0ZXh0OworCSAgICBpZiAoKHJldCA9PSBudWxsKSAmJiAoYm9keSAhPSBudWxsKSkgeworCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQlmb3IgKGludCBpPTA7IGk8Ym9keS5zaXplKCk7IGkrKykgeworCQkgICAgYnVmLmFwcGVuZChib2R5LmdldE5vZGUoaSkuZ2V0VGV4dCgpKTsKKwkJfQorCQlyZXQgPSBidWYudG9TdHJpbmcoKTsKKwkgICAgfQorCSAgICByZXR1cm4gcmV0OworCX0KKworICAgICAgICAvKioKKyAgICAgICAgICogRm9yIHRoZSBzYW1lIHJlYXNvbiBhcyBhYm92ZSwgdGhlIHNvdXJjZSBsaW5lIGluZm9ybWF0aW9uIGluIHRoZQorICAgICAgICAgKiBjb250YWluZWQgVGVtcGxhdGVUZXh0IG5vZGUgc2hvdWxkIGJlIHVzZWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgTWFyayBnZXRTdGFydCgpIHsKKyAgICAgICAgICAgIGlmICh0ZXh0ID09IG51bGwgJiYgYm9keSAhPSBudWxsICYmIGJvZHkuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBib2R5LmdldE5vZGUoMCkuZ2V0U3RhcnQoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldFN0YXJ0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXByZXNlbnRzIGEgZGVjbGFyYXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIERlY2xhcmF0aW9uIGV4dGVuZHMgU2NyaXB0aW5nRWxlbWVudCB7CisKKwlwdWJsaWMgRGVjbGFyYXRpb24oU3RyaW5nIHRleHQsIE1hcmsgc3RhcnQsIE5vZGUgcGFyZW50KSB7CisJICAgIHN1cGVyKEpTUF9ERUNMQVJBVElPTl9BQ1RJT04sIERFQ0xBUkFUSU9OX0FDVElPTiwgdGV4dCwgc3RhcnQsCisJCSAgcGFyZW50KTsKKwl9CisKKwlwdWJsaWMgRGVjbGFyYXRpb24oU3RyaW5nIHFOYW1lLCBBdHRyaWJ1dGVzIG5vblRhZ2xpYlhtbG5zQXR0cnMsCisJCQkgICBBdHRyaWJ1dGVzIHRhZ2xpYkF0dHJzLCBNYXJrIHN0YXJ0LAorCQkJICAgTm9kZSBwYXJlbnQpIHsKKwkgICAgc3VwZXIocU5hbWUsIERFQ0xBUkFUSU9OX0FDVElPTiwgbm9uVGFnbGliWG1sbnNBdHRycywKKwkJICB0YWdsaWJBdHRycywgc3RhcnQsIHBhcmVudCk7CisJfQorCisJcHVibGljIHZvaWQgYWNjZXB0KFZpc2l0b3IgdikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJICAgIHYudmlzaXQodGhpcyk7CisJfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcHJlc2VudHMgYW4gZXhwcmVzc2lvbi4gIEV4cHJlc3Npb25zIGluIGF0dHJpYnV0ZXMgYXJlIGVtYmVkZGVkCisgICAgICogaW4gdGhlIGF0dHJpYnV0ZSBzdHJpbmcgYW5kIG5vdCBoZXJlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRXhwcmVzc2lvbiBleHRlbmRzIFNjcmlwdGluZ0VsZW1lbnQgeworCisJcHVibGljIEV4cHJlc3Npb24oU3RyaW5nIHRleHQsIE1hcmsgc3RhcnQsIE5vZGUgcGFyZW50KSB7CisJICAgIHN1cGVyKEpTUF9FWFBSRVNTSU9OX0FDVElPTiwgRVhQUkVTU0lPTl9BQ1RJT04sIHRleHQsIHN0YXJ0LAorCQkgIHBhcmVudCk7CisJfQorCisJcHVibGljIEV4cHJlc3Npb24oU3RyaW5nIHFOYW1lLCBBdHRyaWJ1dGVzIG5vblRhZ2xpYlhtbG5zQXR0cnMsCisJCQkgIEF0dHJpYnV0ZXMgdGFnbGliQXR0cnMsIE1hcmsgc3RhcnQsCisJCQkgIE5vZGUgcGFyZW50KSB7CisJICAgIHN1cGVyKHFOYW1lLCBFWFBSRVNTSU9OX0FDVElPTiwgbm9uVGFnbGliWG1sbnNBdHRycywgdGFnbGliQXR0cnMsCisJCSAgc3RhcnQsIHBhcmVudCk7CisJfQorCisJcHVibGljIHZvaWQgYWNjZXB0KFZpc2l0b3IgdikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJICAgIHYudmlzaXQodGhpcyk7CisJfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcHJlc2VudHMgYSBzY3JpcHRsZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNjcmlwdGxldCBleHRlbmRzIFNjcmlwdGluZ0VsZW1lbnQgeworCisJcHVibGljIFNjcmlwdGxldChTdHJpbmcgdGV4dCwgTWFyayBzdGFydCwgTm9kZSBwYXJlbnQpIHsKKwkgICAgc3VwZXIoSlNQX1NDUklQVExFVF9BQ1RJT04sIFNDUklQVExFVF9BQ1RJT04sIHRleHQsIHN0YXJ0LCBwYXJlbnQpOworCX0KKworCXB1YmxpYyBTY3JpcHRsZXQoU3RyaW5nIHFOYW1lLCBBdHRyaWJ1dGVzIG5vblRhZ2xpYlhtbG5zQXR0cnMsCisJCQkgQXR0cmlidXRlcyB0YWdsaWJBdHRycywgTWFyayBzdGFydCwKKwkJCSBOb2RlIHBhcmVudCkgeworCSAgICBzdXBlcihxTmFtZSwgU0NSSVBUTEVUX0FDVElPTiwgbm9uVGFnbGliWG1sbnNBdHRycywgdGFnbGliQXR0cnMsCisJCSAgc3RhcnQsIHBhcmVudCk7CisJfQorCisJcHVibGljIHZvaWQgYWNjZXB0KFZpc2l0b3IgdikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJICAgIHYudmlzaXQodGhpcyk7CisJfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcHJlc2VudHMgYW4gRUwgZXhwcmVzc2lvbi4gIEV4cHJlc3Npb25zIGluIGF0dHJpYnV0ZXMgYXJlIGVtYmVkZGVkCisgICAgICogaW4gdGhlIGF0dHJpYnV0ZSBzdHJpbmcgYW5kIG5vdCBoZXJlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRUxFeHByZXNzaW9uIGV4dGVuZHMgTm9kZSB7CisKKwlwcml2YXRlIEVMTm9kZS5Ob2RlcyBlbDsKKworICAgICAgICBwdWJsaWMgRUxFeHByZXNzaW9uKFN0cmluZyB0ZXh0LCBNYXJrIHN0YXJ0LCBOb2RlIHBhcmVudCkgeworICAgICAgICAgICAgc3VwZXIobnVsbCwgbnVsbCwgdGV4dCwgc3RhcnQsIHBhcmVudCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBhY2NlcHQoVmlzaXRvciB2KSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHYudmlzaXQodGhpcyk7CisgICAgICAgIH0KKworCXB1YmxpYyB2b2lkIHNldEVMKEVMTm9kZS5Ob2RlcyBlbCkgeworCSAgICB0aGlzLmVsID0gZWw7CisJfQorCisJcHVibGljIEVMTm9kZS5Ob2RlcyBnZXRFTCgpIHsKKwkgICAgcmV0dXJuIGVsOworCX0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXByZXNlbnRzIGEgcGFyYW0gYWN0aW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQYXJhbUFjdGlvbiBleHRlbmRzIE5vZGUgeworCisJSnNwQXR0cmlidXRlIHZhbHVlOworCisJcHVibGljIFBhcmFtQWN0aW9uKEF0dHJpYnV0ZXMgYXR0cnMsIE1hcmsgc3RhcnQsIE5vZGUgcGFyZW50KSB7CisJICAgIHRoaXMoSlNQX1BBUkFNX0FDVElPTiwgYXR0cnMsIG51bGwsIG51bGwsIHN0YXJ0LCBwYXJlbnQpOworCX0KKworCXB1YmxpYyBQYXJhbUFjdGlvbihTdHJpbmcgcU5hbWUsIEF0dHJpYnV0ZXMgYXR0cnMsCisJCQkgICBBdHRyaWJ1dGVzIG5vblRhZ2xpYlhtbG5zQXR0cnMsCisJCQkgICBBdHRyaWJ1dGVzIHRhZ2xpYkF0dHJzLCBNYXJrIHN0YXJ0LCBOb2RlIHBhcmVudCkgeworCSAgICBzdXBlcihxTmFtZSwgUEFSQU1fQUNUSU9OLCBhdHRycywgbm9uVGFnbGliWG1sbnNBdHRycywKKwkJICB0YWdsaWJBdHRycywgc3RhcnQsIHBhcmVudCk7CisJfQorCisJcHVibGljIHZvaWQgYWNjZXB0KFZpc2l0b3IgdikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJICAgIHYudmlzaXQodGhpcyk7CisJfQorCisJcHVibGljIHZvaWQgc2V0VmFsdWUoSnNwQXR0cmlidXRlIHZhbHVlKSB7CisJICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKwl9CisKKwlwdWJsaWMgSnNwQXR0cmlidXRlIGdldFZhbHVlKCkgeworCSAgICByZXR1cm4gdmFsdWU7CisJfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcHJlc2VudHMgYSBwYXJhbXMgYWN0aW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQYXJhbXNBY3Rpb24gZXh0ZW5kcyBOb2RlIHsKKworCXB1YmxpYyBQYXJhbXNBY3Rpb24oTWFyayBzdGFydCwgTm9kZSBwYXJlbnQpIHsKKwkgICAgdGhpcyhKU1BfUEFSQU1TX0FDVElPTiwgbnVsbCwgbnVsbCwgc3RhcnQsIHBhcmVudCk7CisJfQorCisJcHVibGljIFBhcmFtc0FjdGlvbihTdHJpbmcgcU5hbWUsCisJCQkgICAgQXR0cmlidXRlcyBub25UYWdsaWJYbWxuc0F0dHJzLAorCQkJICAgIEF0dHJpYnV0ZXMgdGFnbGliQXR0cnMsCisJCQkgICAgTWFyayBzdGFydCwgTm9kZSBwYXJlbnQpIHsKKwkgICAgc3VwZXIocU5hbWUsIFBBUkFNU19BQ1RJT04sIG51bGwsIG5vblRhZ2xpYlhtbG5zQXR0cnMsIHRhZ2xpYkF0dHJzLAorCQkgIHN0YXJ0LCBwYXJlbnQpOworCX0KKworCXB1YmxpYyB2b2lkIGFjY2VwdChWaXNpdG9yIHYpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCSAgICB2LnZpc2l0KHRoaXMpOworCX0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXByZXNlbnRzIGEgZmFsbGJhY2sgYWN0aW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWxsQmFja0FjdGlvbiBleHRlbmRzIE5vZGUgeworCisJcHVibGljIEZhbGxCYWNrQWN0aW9uKE1hcmsgc3RhcnQsIE5vZGUgcGFyZW50KSB7CisJICAgIHRoaXMoSlNQX0ZBTExCQUNLX0FDVElPTiwgbnVsbCwgbnVsbCwgc3RhcnQsIHBhcmVudCk7CisJfQorCisJcHVibGljIEZhbGxCYWNrQWN0aW9uKFN0cmluZyBxTmFtZSwKKwkJCSAgICAgIEF0dHJpYnV0ZXMgbm9uVGFnbGliWG1sbnNBdHRycywKKwkJCSAgICAgIEF0dHJpYnV0ZXMgdGFnbGliQXR0cnMsIE1hcmsgc3RhcnQsCisJCQkgICAgICBOb2RlIHBhcmVudCkgeworCSAgICBzdXBlcihxTmFtZSwgRkFMTEJBQ0tfQUNUSU9OLCBudWxsLCBub25UYWdsaWJYbWxuc0F0dHJzLAorCQkgIHRhZ2xpYkF0dHJzLCBzdGFydCwgcGFyZW50KTsKKwl9CisKKwlwdWJsaWMgdm9pZCBhY2NlcHQoVmlzaXRvciB2KSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwkgICAgdi52aXNpdCh0aGlzKTsKKwl9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwcmVzZW50cyBhbiBpbmNsdWRlIGFjdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW5jbHVkZUFjdGlvbiBleHRlbmRzIE5vZGUgeworCisJcHJpdmF0ZSBKc3BBdHRyaWJ1dGUgcGFnZTsKKworCXB1YmxpYyBJbmNsdWRlQWN0aW9uKEF0dHJpYnV0ZXMgYXR0cnMsIE1hcmsgc3RhcnQsIE5vZGUgcGFyZW50KSB7CisJICAgIHRoaXMoSlNQX0lOQ0xVREVfQUNUSU9OLCBhdHRycywgbnVsbCwgbnVsbCwgc3RhcnQsIHBhcmVudCk7CisJfQorCisJcHVibGljIEluY2x1ZGVBY3Rpb24oU3RyaW5nIHFOYW1lLCBBdHRyaWJ1dGVzIGF0dHJzLAorCQkJICAgICBBdHRyaWJ1dGVzIG5vblRhZ2xpYlhtbG5zQXR0cnMsCisJCQkgICAgIEF0dHJpYnV0ZXMgdGFnbGliQXR0cnMsIE1hcmsgc3RhcnQsIE5vZGUgcGFyZW50KSB7CisJICAgIHN1cGVyKHFOYW1lLCBJTkNMVURFX0FDVElPTiwgYXR0cnMsIG5vblRhZ2xpYlhtbG5zQXR0cnMsCisJCSAgdGFnbGliQXR0cnMsIHN0YXJ0LCBwYXJlbnQpOworCX0KKworCXB1YmxpYyB2b2lkIGFjY2VwdChWaXNpdG9yIHYpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCSAgICB2LnZpc2l0KHRoaXMpOworCX0KKworCXB1YmxpYyB2b2lkIHNldFBhZ2UoSnNwQXR0cmlidXRlIHBhZ2UpIHsKKwkgICAgdGhpcy5wYWdlID0gcGFnZTsKKwl9CisKKwlwdWJsaWMgSnNwQXR0cmlidXRlIGdldFBhZ2UoKSB7CisJICAgIHJldHVybiBwYWdlOworCX0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXByZXNlbnRzIGEgZm9yd2FyZCBhY3Rpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZvcndhcmRBY3Rpb24gZXh0ZW5kcyBOb2RlIHsKKworCXByaXZhdGUgSnNwQXR0cmlidXRlIHBhZ2U7CisKKwlwdWJsaWMgRm9yd2FyZEFjdGlvbihBdHRyaWJ1dGVzIGF0dHJzLCBNYXJrIHN0YXJ0LCBOb2RlIHBhcmVudCkgeworCSAgICB0aGlzKEpTUF9GT1JXQVJEX0FDVElPTiwgYXR0cnMsIG51bGwsIG51bGwsIHN0YXJ0LCBwYXJlbnQpOworCX0KKworCXB1YmxpYyBGb3J3YXJkQWN0aW9uKFN0cmluZyBxTmFtZSwgQXR0cmlidXRlcyBhdHRycywKKwkJCSAgICAgQXR0cmlidXRlcyBub25UYWdsaWJYbWxuc0F0dHJzLAorCQkJICAgICBBdHRyaWJ1dGVzIHRhZ2xpYkF0dHJzLCBNYXJrIHN0YXJ0LCBOb2RlIHBhcmVudCkgeworCSAgICBzdXBlcihxTmFtZSwgRk9SV0FSRF9BQ1RJT04sIGF0dHJzLCBub25UYWdsaWJYbWxuc0F0dHJzLAorCQkgIHRhZ2xpYkF0dHJzLCBzdGFydCwgcGFyZW50KTsKKwl9CisKKwlwdWJsaWMgdm9pZCBhY2NlcHQoVmlzaXRvciB2KSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwkgICAgdi52aXNpdCh0aGlzKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRQYWdlKEpzcEF0dHJpYnV0ZSBwYWdlKSB7CisJICAgIHRoaXMucGFnZSA9IHBhZ2U7CisJfQorCisJcHVibGljIEpzcEF0dHJpYnV0ZSBnZXRQYWdlKCkgeworCSAgICByZXR1cm4gcGFnZTsKKwl9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwcmVzZW50cyBhIGdldFByb3BlcnR5IGFjdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgR2V0UHJvcGVydHkgZXh0ZW5kcyBOb2RlIHsKKworCXB1YmxpYyBHZXRQcm9wZXJ0eShBdHRyaWJ1dGVzIGF0dHJzLCBNYXJrIHN0YXJ0LCBOb2RlIHBhcmVudCkgeworCSAgICB0aGlzKEpTUF9HRVRfUFJPUEVSVFlfQUNUSU9OLCBhdHRycywgbnVsbCwgbnVsbCwgc3RhcnQsIHBhcmVudCk7CisJfQorCisJcHVibGljIEdldFByb3BlcnR5KFN0cmluZyBxTmFtZSwgQXR0cmlidXRlcyBhdHRycywKKwkJCSAgIEF0dHJpYnV0ZXMgbm9uVGFnbGliWG1sbnNBdHRycywKKwkJCSAgIEF0dHJpYnV0ZXMgdGFnbGliQXR0cnMsIE1hcmsgc3RhcnQsIE5vZGUgcGFyZW50KSB7CisJICAgIHN1cGVyKHFOYW1lLCBHRVRfUFJPUEVSVFlfQUNUSU9OLCBhdHRycywgbm9uVGFnbGliWG1sbnNBdHRycywKKwkJICB0YWdsaWJBdHRycywgc3RhcnQsICBwYXJlbnQpOworCX0KKworCXB1YmxpYyB2b2lkIGFjY2VwdChWaXNpdG9yIHYpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCSAgICB2LnZpc2l0KHRoaXMpOworCX0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXByZXNlbnRzIGEgc2V0UHJvcGVydHkgYWN0aW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTZXRQcm9wZXJ0eSBleHRlbmRzIE5vZGUgeworCisJcHJpdmF0ZSBKc3BBdHRyaWJ1dGUgdmFsdWU7CisKKwlwdWJsaWMgU2V0UHJvcGVydHkoQXR0cmlidXRlcyBhdHRycywgTWFyayBzdGFydCwgTm9kZSBwYXJlbnQpIHsKKwkgICAgdGhpcyhKU1BfU0VUX1BST1BFUlRZX0FDVElPTiwgYXR0cnMsIG51bGwsIG51bGwsIHN0YXJ0LCBwYXJlbnQpOworCX0KKworCXB1YmxpYyBTZXRQcm9wZXJ0eShTdHJpbmcgcU5hbWUsIEF0dHJpYnV0ZXMgYXR0cnMsCisJCQkgICBBdHRyaWJ1dGVzIG5vblRhZ2xpYlhtbG5zQXR0cnMsCisJCQkgICBBdHRyaWJ1dGVzIHRhZ2xpYkF0dHJzLCBNYXJrIHN0YXJ0LCBOb2RlIHBhcmVudCkgeworCSAgICBzdXBlcihxTmFtZSwgU0VUX1BST1BFUlRZX0FDVElPTiwgYXR0cnMsIG5vblRhZ2xpYlhtbG5zQXR0cnMsCisJCSAgdGFnbGliQXR0cnMsIHN0YXJ0LCBwYXJlbnQpOworCX0KKworCXB1YmxpYyB2b2lkIGFjY2VwdChWaXNpdG9yIHYpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCSAgICB2LnZpc2l0KHRoaXMpOworCX0KKworCXB1YmxpYyB2b2lkIHNldFZhbHVlKEpzcEF0dHJpYnV0ZSB2YWx1ZSkgeworCSAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisJfQorCisJcHVibGljIEpzcEF0dHJpYnV0ZSBnZXRWYWx1ZSgpIHsKKwkgICAgcmV0dXJuIHZhbHVlOworCX0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXByZXNlbnRzIGEgdXNlQmVhbiBhY3Rpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFVzZUJlYW4gZXh0ZW5kcyBOb2RlIHsKKworCUpzcEF0dHJpYnV0ZSBiZWFuTmFtZTsKKworCXB1YmxpYyBVc2VCZWFuKEF0dHJpYnV0ZXMgYXR0cnMsIE1hcmsgc3RhcnQsIE5vZGUgcGFyZW50KSB7CisJICAgIHRoaXMoSlNQX1VTRV9CRUFOX0FDVElPTiwgYXR0cnMsIG51bGwsIG51bGwsIHN0YXJ0LCBwYXJlbnQpOworCX0KKworCXB1YmxpYyBVc2VCZWFuKFN0cmluZyBxTmFtZSwgQXR0cmlidXRlcyBhdHRycywKKwkJICAgICAgIEF0dHJpYnV0ZXMgbm9uVGFnbGliWG1sbnNBdHRycywgQXR0cmlidXRlcyB0YWdsaWJBdHRycywKKwkJICAgICAgIE1hcmsgc3RhcnQsIE5vZGUgcGFyZW50KSB7CisJICAgIHN1cGVyKHFOYW1lLCBVU0VfQkVBTl9BQ1RJT04sIGF0dHJzLCBub25UYWdsaWJYbWxuc0F0dHJzLAorCQkgIHRhZ2xpYkF0dHJzLCBzdGFydCwgcGFyZW50KTsKKwl9CisKKwlwdWJsaWMgdm9pZCBhY2NlcHQoVmlzaXRvciB2KSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwkgICAgdi52aXNpdCh0aGlzKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRCZWFuTmFtZShKc3BBdHRyaWJ1dGUgYmVhbk5hbWUpIHsKKwkgICAgdGhpcy5iZWFuTmFtZSA9IGJlYW5OYW1lOworCX0KKworCXB1YmxpYyBKc3BBdHRyaWJ1dGUgZ2V0QmVhbk5hbWUoKSB7CisJICAgIHJldHVybiBiZWFuTmFtZTsKKwl9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwcmVzZW50cyBhIHBsdWdpbiBhY3Rpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBsdWdJbiBleHRlbmRzIE5vZGUgeworCisgICAgICAgIHByaXZhdGUgSnNwQXR0cmlidXRlIHdpZHRoOworICAgICAgICBwcml2YXRlIEpzcEF0dHJpYnV0ZSBoZWlnaHQ7CisgICAgICAgIAorCXB1YmxpYyBQbHVnSW4oQXR0cmlidXRlcyBhdHRycywgTWFyayBzdGFydCwgTm9kZSBwYXJlbnQpIHsKKwkgICAgdGhpcyhKU1BfUExVR0lOX0FDVElPTiwgYXR0cnMsIG51bGwsIG51bGwsIHN0YXJ0LCBwYXJlbnQpOworCX0KKworCXB1YmxpYyBQbHVnSW4oU3RyaW5nIHFOYW1lLCBBdHRyaWJ1dGVzIGF0dHJzLAorCQkgICAgICBBdHRyaWJ1dGVzIG5vblRhZ2xpYlhtbG5zQXR0cnMsIEF0dHJpYnV0ZXMgdGFnbGliQXR0cnMsCisJCSAgICAgIE1hcmsgc3RhcnQsIE5vZGUgcGFyZW50KSB7CisJICAgIHN1cGVyKHFOYW1lLCBQTFVHSU5fQUNUSU9OLCBhdHRycywgbm9uVGFnbGliWG1sbnNBdHRycywKKwkJICB0YWdsaWJBdHRycywgc3RhcnQsIHBhcmVudCk7CisJfQorCisJcHVibGljIHZvaWQgYWNjZXB0KFZpc2l0b3IgdikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJICAgIHYudmlzaXQodGhpcyk7CisJfQorCisJcHVibGljIHZvaWQgc2V0SGVpZ2h0KEpzcEF0dHJpYnV0ZSBoZWlnaHQpIHsKKwkgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0V2lkdGgoSnNwQXR0cmlidXRlIHdpZHRoKSB7CisJICAgIHRoaXMud2lkdGggPSB3aWR0aDsKKwl9CisKKwlwdWJsaWMgSnNwQXR0cmlidXRlIGdldEhlaWdodCgpIHsKKwkgICAgcmV0dXJuIGhlaWdodDsKKwl9CisKKwlwdWJsaWMgSnNwQXR0cmlidXRlIGdldFdpZHRoKCkgeworCSAgICByZXR1cm4gd2lkdGg7CisJfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcHJlc2VudHMgYW4gdW5pbnRlcnByZXRlZCB0YWcsIGZyb20gYSBKc3AgZG9jdW1lbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFVuaW50ZXJwcmV0ZWRUYWcgZXh0ZW5kcyBOb2RlIHsKKworCXByaXZhdGUgSnNwQXR0cmlidXRlW10ganNwQXR0cnM7CisKKwlwdWJsaWMgVW5pbnRlcnByZXRlZFRhZyhTdHJpbmcgcU5hbWUsIFN0cmluZyBsb2NhbE5hbWUsCisJCQkJQXR0cmlidXRlcyBhdHRycywKKwkJCQlBdHRyaWJ1dGVzIG5vblRhZ2xpYlhtbG5zQXR0cnMsCisJCQkJQXR0cmlidXRlcyB0YWdsaWJBdHRycywKKwkJCQlNYXJrIHN0YXJ0LCBOb2RlIHBhcmVudCkgeworCSAgICBzdXBlcihxTmFtZSwgbG9jYWxOYW1lLCBhdHRycywgbm9uVGFnbGliWG1sbnNBdHRycywgdGFnbGliQXR0cnMsCisJCSAgc3RhcnQsIHBhcmVudCk7CisJfQorCisJcHVibGljIHZvaWQgYWNjZXB0KFZpc2l0b3IgdikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJICAgIHYudmlzaXQodGhpcyk7CisJfQorCisJcHVibGljIHZvaWQgc2V0SnNwQXR0cmlidXRlcyhKc3BBdHRyaWJ1dGVbXSBqc3BBdHRycykgeworCSAgICB0aGlzLmpzcEF0dHJzID0ganNwQXR0cnM7CisJfQorCisJcHVibGljIEpzcEF0dHJpYnV0ZVtdIGdldEpzcEF0dHJpYnV0ZXMoKSB7CisJICAgIHJldHVybiBqc3BBdHRyczsKKwl9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJlcHJlc2VudHMgYSA8anNwOmVsZW1lbnQ+LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSnNwRWxlbWVudCBleHRlbmRzIE5vZGUgeworCisJcHJpdmF0ZSBKc3BBdHRyaWJ1dGVbXSBqc3BBdHRyczsKKwlwcml2YXRlIEpzcEF0dHJpYnV0ZSBuYW1lQXR0cjsKKworCXB1YmxpYyBKc3BFbGVtZW50KEF0dHJpYnV0ZXMgYXR0cnMsIE1hcmsgc3RhcnQsIE5vZGUgcGFyZW50KSB7CisJICAgIHRoaXMoSlNQX0VMRU1FTlRfQUNUSU9OLCBhdHRycywgbnVsbCwgbnVsbCwgc3RhcnQsIHBhcmVudCk7CisJfQorCisJcHVibGljIEpzcEVsZW1lbnQoU3RyaW5nIHFOYW1lLCBBdHRyaWJ1dGVzIGF0dHJzLAorCQkJICBBdHRyaWJ1dGVzIG5vblRhZ2xpYlhtbG5zQXR0cnMsCisJCQkgIEF0dHJpYnV0ZXMgdGFnbGliQXR0cnMsIE1hcmsgc3RhcnQsIE5vZGUgcGFyZW50KSB7CisJICAgIHN1cGVyKHFOYW1lLCBFTEVNRU5UX0FDVElPTiwgYXR0cnMsIG5vblRhZ2xpYlhtbG5zQXR0cnMsCisJCSAgdGFnbGliQXR0cnMsIHN0YXJ0LCBwYXJlbnQpOworCX0KKworCXB1YmxpYyB2b2lkIGFjY2VwdChWaXNpdG9yIHYpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCSAgICB2LnZpc2l0KHRoaXMpOworCX0KKworCXB1YmxpYyB2b2lkIHNldEpzcEF0dHJpYnV0ZXMoSnNwQXR0cmlidXRlW10ganNwQXR0cnMpIHsKKwkgICAgdGhpcy5qc3BBdHRycyA9IGpzcEF0dHJzOworCX0KKworCXB1YmxpYyBKc3BBdHRyaWJ1dGVbXSBnZXRKc3BBdHRyaWJ1dGVzKCkgeworCSAgICByZXR1cm4ganNwQXR0cnM7CisJfQorCisJLyoKKwkgKiBTZXRzIHRoZSBYTUwtc3R5bGUgJ25hbWUnIGF0dHJpYnV0ZQorCSAqLworCXB1YmxpYyB2b2lkIHNldE5hbWVBdHRyaWJ1dGUoSnNwQXR0cmlidXRlIG5hbWVBdHRyKSB7CisJICAgIHRoaXMubmFtZUF0dHIgPSBuYW1lQXR0cjsKKwl9CisKKwkvKgorCSAqIEdldHMgdGhlIFhNTC1zdHlsZSAnbmFtZScgYXR0cmlidXRlCisJICovCisJcHVibGljIEpzcEF0dHJpYnV0ZSBnZXROYW1lQXR0cmlidXRlKCkgeworCSAgICByZXR1cm4gdGhpcy5uYW1lQXR0cjsKKwl9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwcmVzZW50cyBhIDxqc3A6b3V0cHV0Pi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEpzcE91dHB1dCBleHRlbmRzIE5vZGUgeworCisJcHVibGljIEpzcE91dHB1dChTdHJpbmcgcU5hbWUsIEF0dHJpYnV0ZXMgYXR0cnMsCisJCQkgQXR0cmlidXRlcyBub25UYWdsaWJYbWxuc0F0dHJzLAorCQkJIEF0dHJpYnV0ZXMgdGFnbGliQXR0cnMsCisJCQkgTWFyayBzdGFydCwgTm9kZSBwYXJlbnQpIHsKKwkgICAgc3VwZXIocU5hbWUsIE9VVFBVVF9BQ1RJT04sIGF0dHJzLCBub25UYWdsaWJYbWxuc0F0dHJzLAorCQkgIHRhZ2xpYkF0dHJzLCBzdGFydCwgcGFyZW50KTsKKwl9CisKKwlwdWJsaWMgdm9pZCBhY2NlcHQoVmlzaXRvciB2KSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwkgICAgdi52aXNpdCh0aGlzKTsKKwl9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29sbGVjdGVkIGluZm9ybWF0aW9uIGFib3V0IGNoaWxkIGVsZW1lbnRzLiAgVXNlZCBieSBub2RlcyBsaWtlCisgICAgICogQ3VzdG9tVGFnLCBKc3BCb2R5LCBhbmQgTmFtZWRBdHRyaWJ1dGUuICBUaGUgaW5mb3JtYXRpb24gaXMgCisgICAgICogc2V0IGluIHRoZSBDb2xsZWN0b3IuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDaGlsZEluZm8geworCXByaXZhdGUgYm9vbGVhbiBzY3JpcHRsZXNzOwkvLyB0cnVlIGlmIHRoZSB0YWcgYW5kIGl0cyBib2R5CisJCQkJCS8vIGNvbnRhaW4gbm8gc2NyaXB0aW5nIGVsZW1lbnRzLgorCXByaXZhdGUgYm9vbGVhbiBoYXNVc2VCZWFuOworCXByaXZhdGUgYm9vbGVhbiBoYXNJbmNsdWRlQWN0aW9uOworCXByaXZhdGUgYm9vbGVhbiBoYXNQYXJhbUFjdGlvbjsKKwlwcml2YXRlIGJvb2xlYW4gaGFzU2V0UHJvcGVydHk7CisJcHJpdmF0ZSBib29sZWFuIGhhc1NjcmlwdGluZ1ZhcnM7CisKKwlwdWJsaWMgdm9pZCBzZXRTY3JpcHRsZXNzKGJvb2xlYW4gcykgeworCSAgICBzY3JpcHRsZXNzID0gczsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc1NjcmlwdGxlc3MoKSB7CisJICAgIHJldHVybiBzY3JpcHRsZXNzOworCX0KKworCXB1YmxpYyB2b2lkIHNldEhhc1VzZUJlYW4oYm9vbGVhbiB1KSB7CisJICAgIGhhc1VzZUJlYW4gPSB1OworCX0KKworCXB1YmxpYyBib29sZWFuIGhhc1VzZUJlYW4oKSB7CisJICAgIHJldHVybiBoYXNVc2VCZWFuOworCX0KKworCXB1YmxpYyB2b2lkIHNldEhhc0luY2x1ZGVBY3Rpb24oYm9vbGVhbiBpKSB7CisJICAgIGhhc0luY2x1ZGVBY3Rpb24gPSBpOworCX0KKworCXB1YmxpYyBib29sZWFuIGhhc0luY2x1ZGVBY3Rpb24oKSB7CisJICAgIHJldHVybiBoYXNJbmNsdWRlQWN0aW9uOworCX0KKworCXB1YmxpYyB2b2lkIHNldEhhc1BhcmFtQWN0aW9uKGJvb2xlYW4gaSkgeworCSAgICBoYXNQYXJhbUFjdGlvbiA9IGk7CisJfQorCisJcHVibGljIGJvb2xlYW4gaGFzUGFyYW1BY3Rpb24oKSB7CisJICAgIHJldHVybiBoYXNQYXJhbUFjdGlvbjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRIYXNTZXRQcm9wZXJ0eShib29sZWFuIHMpIHsKKwkgICAgaGFzU2V0UHJvcGVydHkgPSBzOworCX0KKworCXB1YmxpYyBib29sZWFuIGhhc1NldFByb3BlcnR5KCkgeworCSAgICByZXR1cm4gaGFzU2V0UHJvcGVydHk7CisJfQorICAgICAgICAKKwlwdWJsaWMgdm9pZCBzZXRIYXNTY3JpcHRpbmdWYXJzKGJvb2xlYW4gcykgeworCSAgICBoYXNTY3JpcHRpbmdWYXJzID0gczsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBoYXNTY3JpcHRpbmdWYXJzKCkgeworCSAgICByZXR1cm4gaGFzU2NyaXB0aW5nVmFyczsKKwl9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwcmVzZW50cyBhIGN1c3RvbSB0YWcKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEN1c3RvbVRhZyBleHRlbmRzIE5vZGUgeworCisJcHJpdmF0ZSBTdHJpbmcgdXJpOworCXByaXZhdGUgU3RyaW5nIHByZWZpeDsKKwlwcml2YXRlIEpzcEF0dHJpYnV0ZVtdIGpzcEF0dHJzOworCXByaXZhdGUgVGFnRGF0YSB0YWdEYXRhOworCXByaXZhdGUgU3RyaW5nIHRhZ0hhbmRsZXJQb29sTmFtZTsKKwlwcml2YXRlIFRhZ0luZm8gdGFnSW5mbzsKKwlwcml2YXRlIFRhZ0ZpbGVJbmZvIHRhZ0ZpbGVJbmZvOworCXByaXZhdGUgQ2xhc3MgdGFnSGFuZGxlckNsYXNzOworCXByaXZhdGUgVmFyaWFibGVJbmZvW10gdmFySW5mb3M7CisJcHJpdmF0ZSBpbnQgY3VzdG9tTmVzdGluZ0xldmVsOworICAgICAgICBwcml2YXRlIENoaWxkSW5mbyBjaGlsZEluZm87CisJcHJpdmF0ZSBib29sZWFuIGltcGxlbWVudHNJdGVyYXRpb25UYWc7CisJcHJpdmF0ZSBib29sZWFuIGltcGxlbWVudHNCb2R5VGFnOworCXByaXZhdGUgYm9vbGVhbiBpbXBsZW1lbnRzVHJ5Q2F0Y2hGaW5hbGx5OworCXByaXZhdGUgYm9vbGVhbiBpbXBsZW1lbnRzU2ltcGxlVGFnOworCXByaXZhdGUgYm9vbGVhbiBpbXBsZW1lbnRzRHluYW1pY0F0dHJpYnV0ZXM7CisJcHJpdmF0ZSBWZWN0b3IgYXRCZWdpblNjcmlwdGluZ1ZhcnM7CisJcHJpdmF0ZSBWZWN0b3IgYXRFbmRTY3JpcHRpbmdWYXJzOworCXByaXZhdGUgVmVjdG9yIG5lc3RlZFNjcmlwdGluZ1ZhcnM7CisJcHJpdmF0ZSBOb2RlLkN1c3RvbVRhZyBjdXN0b21UYWdQYXJlbnQ7CisJcHJpdmF0ZSBJbnRlZ2VyIG51bUNvdW50OworCXByaXZhdGUgYm9vbGVhbiB1c2VUYWdQbHVnaW47CisJcHJpdmF0ZSBUYWdQbHVnaW5Db250ZXh0IHRhZ1BsdWdpbkNvbnRleHQ7CisKKwkvKioKKwkgKiBUaGUgZm9sbG93aW5nIHR3byBmaWVsZHMgYXJlIHVzZWQgZm9yIGhvbGRpbmcgdGhlIEphdmEKKwkgKiBzY3JpcHRsZXRzIHRoYXQgdGhlIHRhZyBwbHVnaW5zIG1heSBnZW5lcmF0ZS4gIE1lYW5pbmdmdWwKKwkgKiBvbmx5IGlmIHVzZVRhZ1BsdWdpbiBpcyB0cnVlOworCSAqIENvdWxkIG1vdmUgdGhlbSBpbnRvIFRhZ1BsdWdpbkNvbnRleHRJbXBsLCBidXQgd2UnbGwgbmVlZAorCSAqIHRvIGNhc3QgdGFnUGx1Z2luQ29udGV4dCB0byBUYWdQbHVnaW5Db250ZXh0SW1wbCBhbGwgdGhlIHRpbWUuLi4KKwkgKi8KKwlwcml2YXRlIE5vZGVzIGF0U1RhZzsKKwlwcml2YXRlIE5vZGVzIGF0RVRhZzsKKworCS8qCisJICogQ29uc3RydWN0b3IgZm9yIGN1c3RvbSBhY3Rpb24gaW1wbGVtZW50ZWQgYnkgdGFnIGhhbmRsZXIuCisJICovCisJcHVibGljIEN1c3RvbVRhZyhTdHJpbmcgcU5hbWUsIFN0cmluZyBwcmVmaXgsIFN0cmluZyBsb2NhbE5hbWUsCisJCQkgU3RyaW5nIHVyaSwgQXR0cmlidXRlcyBhdHRycywgTWFyayBzdGFydCwgTm9kZSBwYXJlbnQsCisJCQkgVGFnSW5mbyB0YWdJbmZvLCBDbGFzcyB0YWdIYW5kbGVyQ2xhc3MpIHsKKwkgICAgdGhpcyhxTmFtZSwgcHJlZml4LCBsb2NhbE5hbWUsIHVyaSwgYXR0cnMsIG51bGwsIG51bGwsIHN0YXJ0LAorCQkgcGFyZW50LCB0YWdJbmZvLCB0YWdIYW5kbGVyQ2xhc3MpOworCX0KKworCS8qCisJICogQ29uc3RydWN0b3IgZm9yIGN1c3RvbSBhY3Rpb24gaW1wbGVtZW50ZWQgYnkgdGFnIGhhbmRsZXIuCisJICovCisJcHVibGljIEN1c3RvbVRhZyhTdHJpbmcgcU5hbWUsIFN0cmluZyBwcmVmaXgsIFN0cmluZyBsb2NhbE5hbWUsCisJCQkgU3RyaW5nIHVyaSwgQXR0cmlidXRlcyBhdHRycywKKwkJCSBBdHRyaWJ1dGVzIG5vblRhZ2xpYlhtbG5zQXR0cnMsCisJCQkgQXR0cmlidXRlcyB0YWdsaWJBdHRycywKKwkJCSBNYXJrIHN0YXJ0LCBOb2RlIHBhcmVudCwgVGFnSW5mbyB0YWdJbmZvLAorCQkJIENsYXNzIHRhZ0hhbmRsZXJDbGFzcykgeworCSAgICBzdXBlcihxTmFtZSwgbG9jYWxOYW1lLCBhdHRycywgbm9uVGFnbGliWG1sbnNBdHRycywgdGFnbGliQXR0cnMsCisJCSAgc3RhcnQsIHBhcmVudCk7CisKKwkgICAgdGhpcy51cmkgPSB1cmk7CisJICAgIHRoaXMucHJlZml4ID0gcHJlZml4OworCSAgICB0aGlzLnRhZ0luZm8gPSB0YWdJbmZvOworCSAgICB0aGlzLnRhZ0hhbmRsZXJDbGFzcyA9IHRhZ0hhbmRsZXJDbGFzczsKKwkgICAgdGhpcy5jdXN0b21OZXN0aW5nTGV2ZWwgPSBtYWtlQ3VzdG9tTmVzdGluZ0xldmVsKCk7CisgICAgICAgICAgICB0aGlzLmNoaWxkSW5mbyA9IG5ldyBDaGlsZEluZm8oKTsKKworCSAgICB0aGlzLmltcGxlbWVudHNJdGVyYXRpb25UYWcgPSAKKwkJSXRlcmF0aW9uVGFnLmNsYXNzLmlzQXNzaWduYWJsZUZyb20odGFnSGFuZGxlckNsYXNzKTsKKwkgICAgdGhpcy5pbXBsZW1lbnRzQm9keVRhZyA9CisJCUJvZHlUYWcuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbSh0YWdIYW5kbGVyQ2xhc3MpOworCSAgICB0aGlzLmltcGxlbWVudHNUcnlDYXRjaEZpbmFsbHkgPSAKKwkJVHJ5Q2F0Y2hGaW5hbGx5LmNsYXNzLmlzQXNzaWduYWJsZUZyb20odGFnSGFuZGxlckNsYXNzKTsKKwkgICAgdGhpcy5pbXBsZW1lbnRzU2ltcGxlVGFnID0gCisJCVNpbXBsZVRhZy5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHRhZ0hhbmRsZXJDbGFzcyk7CisJICAgIHRoaXMuaW1wbGVtZW50c0R5bmFtaWNBdHRyaWJ1dGVzID0gCisJCUR5bmFtaWNBdHRyaWJ1dGVzLmNsYXNzLmlzQXNzaWduYWJsZUZyb20odGFnSGFuZGxlckNsYXNzKTsKKwl9CisKKwkvKgorCSAqIENvbnN0cnVjdG9yIGZvciBjdXN0b20gYWN0aW9uIGltcGxlbWVudGVkIGJ5IHRhZyBmaWxlLgorCSAqLworCXB1YmxpYyBDdXN0b21UYWcoU3RyaW5nIHFOYW1lLCBTdHJpbmcgcHJlZml4LCBTdHJpbmcgbG9jYWxOYW1lLAorCQkJIFN0cmluZyB1cmksIEF0dHJpYnV0ZXMgYXR0cnMsIE1hcmsgc3RhcnQsIE5vZGUgcGFyZW50LAorCQkJIFRhZ0ZpbGVJbmZvIHRhZ0ZpbGVJbmZvKSB7CisJICAgIHRoaXMocU5hbWUsIHByZWZpeCwgbG9jYWxOYW1lLCB1cmksIGF0dHJzLCBudWxsLCBudWxsLCBzdGFydCwKKwkJIHBhcmVudCwgdGFnRmlsZUluZm8pOworCX0KKworCS8qCisJICogQ29uc3RydWN0b3IgZm9yIGN1c3RvbSBhY3Rpb24gaW1wbGVtZW50ZWQgYnkgdGFnIGZpbGUuCisJICovCisJcHVibGljIEN1c3RvbVRhZyhTdHJpbmcgcU5hbWUsIFN0cmluZyBwcmVmaXgsIFN0cmluZyBsb2NhbE5hbWUsCisJCQkgU3RyaW5nIHVyaSwgQXR0cmlidXRlcyBhdHRycywKKwkJCSBBdHRyaWJ1dGVzIG5vblRhZ2xpYlhtbG5zQXR0cnMsCisJCQkgQXR0cmlidXRlcyB0YWdsaWJBdHRycywKKwkJCSBNYXJrIHN0YXJ0LCBOb2RlIHBhcmVudCwgVGFnRmlsZUluZm8gdGFnRmlsZUluZm8pIHsKKworCSAgICBzdXBlcihxTmFtZSwgbG9jYWxOYW1lLCBhdHRycywgbm9uVGFnbGliWG1sbnNBdHRycywgdGFnbGliQXR0cnMsCisJCSAgc3RhcnQsIHBhcmVudCk7CisKKwkgICAgdGhpcy51cmkgPSB1cmk7CisJICAgIHRoaXMucHJlZml4ID0gcHJlZml4OworCSAgICB0aGlzLnRhZ0ZpbGVJbmZvID0gdGFnRmlsZUluZm87CisJICAgIHRoaXMudGFnSW5mbyA9IHRhZ0ZpbGVJbmZvLmdldFRhZ0luZm8oKTsKKwkgICAgdGhpcy5jdXN0b21OZXN0aW5nTGV2ZWwgPSBtYWtlQ3VzdG9tTmVzdGluZ0xldmVsKCk7CisgICAgICAgICAgICB0aGlzLmNoaWxkSW5mbyA9IG5ldyBDaGlsZEluZm8oKTsKKworCSAgICB0aGlzLmltcGxlbWVudHNJdGVyYXRpb25UYWcgPSBmYWxzZTsKKwkgICAgdGhpcy5pbXBsZW1lbnRzQm9keVRhZyA9IGZhbHNlOworCSAgICB0aGlzLmltcGxlbWVudHNUcnlDYXRjaEZpbmFsbHkgPSBmYWxzZTsKKwkgICAgdGhpcy5pbXBsZW1lbnRzU2ltcGxlVGFnID0gdHJ1ZTsKKwkgICAgdGhpcy5pbXBsZW1lbnRzRHluYW1pY0F0dHJpYnV0ZXMgPSB0YWdJbmZvLmhhc0R5bmFtaWNBdHRyaWJ1dGVzKCk7CisJfQorCisJcHVibGljIHZvaWQgYWNjZXB0KFZpc2l0b3IgdikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJICAgIHYudmlzaXQodGhpcyk7CisJfQorCisJLyoqCisJICogQHJldHVybiBUaGUgVVJJIG5hbWVzcGFjZSB0aGF0IHRoaXMgY3VzdG9tIGFjdGlvbiBiZWxvbmdzIHRvCisJICovCisJcHVibGljIFN0cmluZyBnZXRVUkkoKSB7CisJICAgIHJldHVybiB0aGlzLnVyaTsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIFRoZSB0YWcgcHJlZml4CisJICovCisJcHVibGljIFN0cmluZyBnZXRQcmVmaXgoKSB7CisJICAgIHJldHVybiBwcmVmaXg7CisJfQorCisJcHVibGljIHZvaWQgc2V0SnNwQXR0cmlidXRlcyhKc3BBdHRyaWJ1dGVbXSBqc3BBdHRycykgeworCSAgICB0aGlzLmpzcEF0dHJzID0ganNwQXR0cnM7CisJfQorCisJcHVibGljIEpzcEF0dHJpYnV0ZVtdIGdldEpzcEF0dHJpYnV0ZXMoKSB7CisJICAgIHJldHVybiBqc3BBdHRyczsKKwl9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgQ2hpbGRJbmZvIGdldENoaWxkSW5mbygpIHsKKyAgICAgICAgICAgIHJldHVybiBjaGlsZEluZm87CisgICAgICAgIH0KKwkKKwlwdWJsaWMgdm9pZCBzZXRUYWdEYXRhKFRhZ0RhdGEgdGFnRGF0YSkgeworCSAgICB0aGlzLnRhZ0RhdGEgPSB0YWdEYXRhOworCSAgICB0aGlzLnZhckluZm9zID0gdGFnSW5mby5nZXRWYXJpYWJsZUluZm8odGFnRGF0YSk7CisJICAgIGlmICh0aGlzLnZhckluZm9zID09IG51bGwpIHsKKwkJdGhpcy52YXJJbmZvcyA9IFpFUk9fVkFSSUFCTEVfSU5GTzsKKwkgICAgfQorCX0KKworCXB1YmxpYyBUYWdEYXRhIGdldFRhZ0RhdGEoKSB7CisJICAgIHJldHVybiB0YWdEYXRhOworCX0KKworCXB1YmxpYyB2b2lkIHNldFRhZ0hhbmRsZXJQb29sTmFtZShTdHJpbmcgcykgeworCSAgICB0YWdIYW5kbGVyUG9vbE5hbWUgPSBzOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VGFnSGFuZGxlclBvb2xOYW1lKCkgeworCSAgICByZXR1cm4gdGFnSGFuZGxlclBvb2xOYW1lOworCX0KKworCXB1YmxpYyBUYWdJbmZvIGdldFRhZ0luZm8oKSB7CisJICAgIHJldHVybiB0YWdJbmZvOworCX0KKworCXB1YmxpYyBUYWdGaWxlSW5mbyBnZXRUYWdGaWxlSW5mbygpIHsKKwkgICAgcmV0dXJuIHRhZ0ZpbGVJbmZvOworCX0KKworCS8qCisJICogQHJldHVybiB0cnVlIGlmIHRoaXMgY3VzdG9tIGFjdGlvbiBpcyBzdXBwb3J0ZWQgYnkgYSB0YWcgZmlsZSwKKwkgKiBmYWxzZSBvdGhlcndpc2UKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1RhZ0ZpbGUoKSB7CisJICAgIHJldHVybiB0YWdGaWxlSW5mbyAhPSBudWxsOworCX0KKworCXB1YmxpYyBDbGFzcyBnZXRUYWdIYW5kbGVyQ2xhc3MoKSB7CisJICAgIHJldHVybiB0YWdIYW5kbGVyQ2xhc3M7CisJfQorCisJcHVibGljIHZvaWQgc2V0VGFnSGFuZGxlckNsYXNzKENsYXNzIGhjKSB7CisJICAgIHRhZ0hhbmRsZXJDbGFzcyA9IGhjOworCX0KKworCXB1YmxpYyBib29sZWFuIGltcGxlbWVudHNJdGVyYXRpb25UYWcoKSB7CisJICAgIHJldHVybiBpbXBsZW1lbnRzSXRlcmF0aW9uVGFnOworCX0KKworCXB1YmxpYyBib29sZWFuIGltcGxlbWVudHNCb2R5VGFnKCkgeworCSAgICByZXR1cm4gaW1wbGVtZW50c0JvZHlUYWc7CisJfQorCisJcHVibGljIGJvb2xlYW4gaW1wbGVtZW50c1RyeUNhdGNoRmluYWxseSgpIHsKKwkgICAgcmV0dXJuIGltcGxlbWVudHNUcnlDYXRjaEZpbmFsbHk7CisJfQorCisJcHVibGljIGJvb2xlYW4gaW1wbGVtZW50c1NpbXBsZVRhZygpIHsKKwkgICAgcmV0dXJuIGltcGxlbWVudHNTaW1wbGVUYWc7CisJfQorCisJcHVibGljIGJvb2xlYW4gaW1wbGVtZW50c0R5bmFtaWNBdHRyaWJ1dGVzKCkgeworCSAgICByZXR1cm4gaW1wbGVtZW50c0R5bmFtaWNBdHRyaWJ1dGVzOworCX0KKworCXB1YmxpYyBUYWdWYXJpYWJsZUluZm9bXSBnZXRUYWdWYXJpYWJsZUluZm9zKCkgeworCSAgICByZXR1cm4gdGFnSW5mby5nZXRUYWdWYXJpYWJsZUluZm9zKCk7CisgCX0KKyAKKwlwdWJsaWMgVmFyaWFibGVJbmZvW10gZ2V0VmFyaWFibGVJbmZvcygpIHsKKwkgICAgcmV0dXJuIHZhckluZm9zOworCX0KKworCXB1YmxpYyB2b2lkIHNldEN1c3RvbVRhZ1BhcmVudChOb2RlLkN1c3RvbVRhZyBuKSB7CisJICAgIHRoaXMuY3VzdG9tVGFnUGFyZW50ID0gbjsKKwl9CisKKwlwdWJsaWMgTm9kZS5DdXN0b21UYWcgZ2V0Q3VzdG9tVGFnUGFyZW50KCkgeworCSAgICByZXR1cm4gdGhpcy5jdXN0b21UYWdQYXJlbnQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0TnVtQ291bnQoSW50ZWdlciBjb3VudCkgeworCSAgICB0aGlzLm51bUNvdW50ID0gY291bnQ7CisJfQorCisJcHVibGljIEludGVnZXIgZ2V0TnVtQ291bnQoKSB7CisJICAgIHJldHVybiB0aGlzLm51bUNvdW50OworCX0KKworCXB1YmxpYyB2b2lkIHNldFNjcmlwdGluZ1ZhcnMoVmVjdG9yIHZlYywgaW50IHNjb3BlKSB7CisJICAgIHN3aXRjaCAoc2NvcGUpIHsKKwkgICAgY2FzZSBWYXJpYWJsZUluZm8uQVRfQkVHSU46CisJCXRoaXMuYXRCZWdpblNjcmlwdGluZ1ZhcnMgPSB2ZWM7CisJCWJyZWFrOworCSAgICBjYXNlIFZhcmlhYmxlSW5mby5BVF9FTkQ6CisJCXRoaXMuYXRFbmRTY3JpcHRpbmdWYXJzID0gdmVjOworCQlicmVhazsKKwkgICAgY2FzZSBWYXJpYWJsZUluZm8uTkVTVEVEOgorCQl0aGlzLm5lc3RlZFNjcmlwdGluZ1ZhcnMgPSB2ZWM7CisJCWJyZWFrOworCSAgICB9CisJfQorCisJLyoKKwkgKiBHZXRzIHRoZSBzY3JpcHRpbmcgdmFyaWFibGVzIGZvciB0aGUgZ2l2ZW4gc2NvcGUgdGhhdCBuZWVkIHRvIGJlCisJICogZGVjbGFyZWQuCisJICovCisJcHVibGljIFZlY3RvciBnZXRTY3JpcHRpbmdWYXJzKGludCBzY29wZSkgeworCSAgICBWZWN0b3IgdmVjID0gbnVsbDsKKworCSAgICBzd2l0Y2ggKHNjb3BlKSB7CisJICAgIGNhc2UgVmFyaWFibGVJbmZvLkFUX0JFR0lOOgorCQl2ZWMgPSB0aGlzLmF0QmVnaW5TY3JpcHRpbmdWYXJzOworCQlicmVhazsKKwkgICAgY2FzZSBWYXJpYWJsZUluZm8uQVRfRU5EOgorCQl2ZWMgPSB0aGlzLmF0RW5kU2NyaXB0aW5nVmFyczsKKwkJYnJlYWs7CisJICAgIGNhc2UgVmFyaWFibGVJbmZvLk5FU1RFRDoKKwkJdmVjID0gdGhpcy5uZXN0ZWRTY3JpcHRpbmdWYXJzOworCQlicmVhazsKKwkgICAgfQorCisJICAgIHJldHVybiB2ZWM7CisJfQorCisJLyoKKwkgKiBHZXRzIHRoaXMgY3VzdG9tIHRhZydzIGN1c3RvbSBuZXN0aW5nIGxldmVsLCB3aGljaCBpcyBnaXZlbiBhcworCSAqIHRoZSBudW1iZXIgb2YgdGltZXMgdGhpcyBjdXN0b20gdGFnIGlzIG5lc3RlZCBpbnNpZGUgaXRzZWxmLgorCSAqLworCXB1YmxpYyBpbnQgZ2V0Q3VzdG9tTmVzdGluZ0xldmVsKCkgeworCSAgICByZXR1cm4gY3VzdG9tTmVzdGluZ0xldmVsOworCX0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ2hlY2tzIHRvIHNlZSBpZiB0aGUgYXR0cmlidXRlIG9mIHRoZSBnaXZlbiBuYW1lIGlzIG9mIHR5cGUKKwkgKiBKc3BGcmFnbWVudC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIGNoZWNrSWZBdHRyaWJ1dGVJc0pzcEZyYWdtZW50KCBTdHJpbmcgbmFtZSApIHsKKyAgICAgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7CisKKwkgICAgVGFnQXR0cmlidXRlSW5mb1tdIGF0dHJpYnV0ZXMgPSB0YWdJbmZvLmdldEF0dHJpYnV0ZXMoKTsKKwkgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7CisJCWlmIChhdHRyaWJ1dGVzW2ldLmdldE5hbWUoKS5lcXVhbHMobmFtZSkgJiYKKwkJICAgICAgICAgICAgYXR0cmlidXRlc1tpXS5pc0ZyYWdtZW50KCkpIHsKKwkJICAgIHJlc3VsdCA9IHRydWU7CisJCSAgICBicmVhazsKKwkJfQorCSAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKworCXB1YmxpYyB2b2lkIHNldFVzZVRhZ1BsdWdpbihib29sZWFuIHVzZSkgeworCSAgICB1c2VUYWdQbHVnaW4gPSB1c2U7CisJfQorCisJcHVibGljIGJvb2xlYW4gdXNlVGFnUGx1Z2luKCkgeworCSAgICByZXR1cm4gdXNlVGFnUGx1Z2luOworCX0KKworCXB1YmxpYyB2b2lkIHNldFRhZ1BsdWdpbkNvbnRleHQoVGFnUGx1Z2luQ29udGV4dCB0YWdQbHVnaW5Db250ZXh0KSB7CisJICAgIHRoaXMudGFnUGx1Z2luQ29udGV4dCA9IHRhZ1BsdWdpbkNvbnRleHQ7CisJfQorCisJcHVibGljIFRhZ1BsdWdpbkNvbnRleHQgZ2V0VGFnUGx1Z2luQ29udGV4dCgpIHsKKwkgICAgcmV0dXJuIHRhZ1BsdWdpbkNvbnRleHQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0QXRTVGFnKE5vZGVzIHNUYWcpIHsKKwkgICAgYXRTVGFnID0gc1RhZzsKKwl9CisKKwlwdWJsaWMgTm9kZXMgZ2V0QXRTVGFnKCkgeworCSAgICByZXR1cm4gYXRTVGFnOworCX0KKyAgICAgICAgCisJcHVibGljIHZvaWQgc2V0QXRFVGFnKE5vZGVzIGVUYWcpIHsKKwkgICAgYXRFVGFnID0gZVRhZzsKKwl9CisKKwlwdWJsaWMgTm9kZXMgZ2V0QXRFVGFnKCkgeworCSAgICByZXR1cm4gYXRFVGFnOworCX0KKyAgICAgICAgCisJLyoKKwkgKiBDb21wdXRlcyB0aGlzIGN1c3RvbSB0YWcncyBjdXN0b20gbmVzdGluZyBsZXZlbCwgd2hpY2ggY29ycmVzcG9uZHMKKwkgKiB0byB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoaXMgY3VzdG9tIHRhZyBpcyBuZXN0ZWQgaW5zaWRlIGl0c2VsZi4KKwkgKgorCSAqIEV4YW1wbGU6CisJICogCisJICogIDxnOmg+CisJICogICAgPGE6Yj4gLS0gbmVzdGluZyBsZXZlbCAwCisJICogICAgICA8YzpkPgorCSAqICAgICAgICA8ZTpmPgorCSAqICAgICAgICAgIDxhOmI+IC0tIG5lc3RpbmcgbGV2ZWwgMQorCSAqICAgICAgICAgICAgPGE6Yj4gLS0gbmVzdGluZyBsZXZlbCAyCisJICogICAgICAgICAgICA8L2E6Yj4KKwkgKiAgICAgICAgICA8L2E6Yj4KKwkgKiAgICAgICAgICA8YTpiPiAtLSBuZXN0aW5nIGxldmVsIDEKKwkgKiAgICAgICAgICA8L2E6Yj4KKwkgKiAgICAgICAgPC9lOmY+CisJICogICAgICA8L2M6ZD4KKwkgKiAgICA8L2E6Yj4KKwkgKiAgPC9nOmg+CisJICogCisJICogQHJldHVybiBDdXN0b20gdGFnJ3MgbmVzdGluZyBsZXZlbAorCSAqLworCXByaXZhdGUgaW50IG1ha2VDdXN0b21OZXN0aW5nTGV2ZWwoKSB7CisJICAgIGludCBuID0gMDsKKwkgICAgTm9kZSBwID0gcGFyZW50OworCSAgICB3aGlsZSAocCAhPSBudWxsKSB7CisJCWlmICgocCBpbnN0YW5jZW9mIE5vZGUuQ3VzdG9tVGFnKQorCQkgICAgICAgICYmIHFOYW1lLmVxdWFscygoKE5vZGUuQ3VzdG9tVGFnKSBwKS5xTmFtZSkpIHsKKwkJICAgIG4rKzsKKwkJfQorCQlwID0gcC5wYXJlbnQ7CisJICAgIH0KKwkgICAgcmV0dXJuIG47CisJfQorCisJLyoqCisJICogUmV0dXJucyB0cnVlIGlmIHRoaXMgY3VzdG9tIGFjdGlvbiBoYXMgYW4gZW1wdHkgYm9keSwgYW5kIGZhbHNlCisJICogb3RoZXJ3aXNlLgorCSAqCisJICogQSBjdXN0b20gYWN0aW9uIGlzIGNvbnNpZGVyZWQgdG8gaGF2ZSBhbiBlbXB0eSBib2R5IGlmIHRoZSAKKwkgKiBmb2xsb3dpbmcgaG9sZHMgdHJ1ZToKKwkgKiAtIGdldEJvZHkoKSByZXR1cm5zIG51bGwsIG9yCisJICogLSBhbGwgaW1tZWRpYXRlIGNoaWxkcmVuIGFyZSBqc3A6YXR0cmlidXRlIGFjdGlvbnMsIG9yCisJICogLSB0aGUgYWN0aW9uJ3MganNwOmJvZHkgaXMgZW1wdHkuCisJICovCisJIHB1YmxpYyBib29sZWFuIGhhc0VtcHR5Qm9keSgpIHsKKwkgICAgIGJvb2xlYW4gaGFzRW1wdHlCb2R5ID0gdHJ1ZTsKKwkgICAgIE5vZGVzIG5vZGVzID0gZ2V0Qm9keSgpOworCSAgICAgaWYgKG5vZGVzICE9IG51bGwpIHsKKwkJIGludCBudW1DaGlsZE5vZGVzID0gbm9kZXMuc2l6ZSgpOworCQkgZm9yIChpbnQgaT0wOyBpPG51bUNoaWxkTm9kZXM7IGkrKykgeworCQkgICAgIE5vZGUgbiA9IG5vZGVzLmdldE5vZGUoaSk7CisJCSAgICAgaWYgKCEobiBpbnN0YW5jZW9mIE5hbWVkQXR0cmlidXRlKSkgeworCQkJIGlmIChuIGluc3RhbmNlb2YgSnNwQm9keSkgeworCQkJICAgICBoYXNFbXB0eUJvZHkgPSAobi5nZXRCb2R5KCkgPT0gbnVsbCk7CisJCQkgfSBlbHNlIHsKKwkJCSAgICAgaGFzRW1wdHlCb2R5ID0gZmFsc2U7CisJCQkgfQorCQkJIGJyZWFrOworCQkgICAgIH0KKwkJIH0KKwkgICAgIH0KKworCSAgICAgcmV0dXJuIGhhc0VtcHR5Qm9keTsKKwkgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFVzZWQgYXMgYSBwbGFjZWhvbGRlciBmb3IgdGhlIGV2YWx1YXRpb24gY29kZSBvZiBhIGN1c3RvbSBhY3Rpb24KKyAgICAgKiBhdHRyaWJ1dGUgKHVzZWQgYnkgdGhlIHRhZyBwbHVnaW4gbWFjaGluZXJ5IG9ubHkpLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQXR0cmlidXRlR2VuZXJhdG9yIGV4dGVuZHMgTm9kZSB7CisJU3RyaW5nIG5hbWU7CS8vIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZQorCUN1c3RvbVRhZyB0YWc7CS8vIFRoZSB0YWcgdGhpcyBhdHRyaWJ1dGUgYmVsb25ncyB0bworCisJcHVibGljIEF0dHJpYnV0ZUdlbmVyYXRvcihNYXJrIHN0YXJ0LCBTdHJpbmcgbmFtZSwgQ3VzdG9tVGFnIHRhZykgeworCSAgICBzdXBlcihzdGFydCwgbnVsbCk7CisJICAgIHRoaXMubmFtZSA9IG5hbWU7CisJICAgIHRoaXMudGFnID0gdGFnOworCX0KKworCXB1YmxpYyB2b2lkIGFjY2VwdChWaXNpdG9yIHYpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCSAgICB2LnZpc2l0KHRoaXMpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkgICAgcmV0dXJuIG5hbWU7CisJfQorCisJcHVibGljIEN1c3RvbVRhZyBnZXRUYWcoKSB7CisJICAgIHJldHVybiB0YWc7CisJfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcHJlc2VudHMgdGhlIGJvZHkgb2YgYSAmbHQ7anNwOnRleHQmZ3Q7IGVsZW1lbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEpzcFRleHQgZXh0ZW5kcyBOb2RlIHsKKworCXB1YmxpYyBKc3BUZXh0KFN0cmluZyBxTmFtZSwgQXR0cmlidXRlcyBub25UYWdsaWJYbWxuc0F0dHJzLAorCQkgICAgICAgQXR0cmlidXRlcyB0YWdsaWJBdHRycywgTWFyayBzdGFydCwgTm9kZSBwYXJlbnQpIHsKKwkgICAgc3VwZXIocU5hbWUsIFRFWFRfQUNUSU9OLCBudWxsLCBub25UYWdsaWJYbWxuc0F0dHJzLCB0YWdsaWJBdHRycywKKwkJICBzdGFydCwgcGFyZW50KTsKKwl9CisKKwlwdWJsaWMgdm9pZCBhY2NlcHQoVmlzaXRvciB2KSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwkgICAgdi52aXNpdCh0aGlzKTsKKwl9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwcmVzZW50cyBhIE5hbWVkIEF0dHJpYnV0ZSAoJmx0O2pzcDphdHRyaWJ1dGUmZ3Q7KQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTmFtZWRBdHRyaWJ1dGUgZXh0ZW5kcyBOb2RlIHsKKworICAgICAgICAvLyBBIHVuaXF1ZSB0ZW1wb3JhcnkgdmFyaWFibGUgbmFtZSBzdWl0YWJsZSBmb3IgY29kZSBnZW5lcmF0aW9uCisgICAgICAgIHByaXZhdGUgU3RyaW5nIHRlbXBvcmFyeVZhcmlhYmxlTmFtZTsKKworICAgICAgICAvLyBUcnVlIGlmIHRoaXMgbm9kZSBpcyB0byBiZSB0cmltbWVkLCBvciBmYWxzZSBvdGhlcndpc2UKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIHRyaW0gPSB0cnVlOworICAgICAgICAKKyAgICAgICAgcHJpdmF0ZSBDaGlsZEluZm8gY2hpbGRJbmZvOworCXByaXZhdGUgU3RyaW5nIG5hbWU7CisJcHJpdmF0ZSBTdHJpbmcgbG9jYWxOYW1lOworCXByaXZhdGUgU3RyaW5nIHByZWZpeDsKKworICAgICAgICBwdWJsaWMgTmFtZWRBdHRyaWJ1dGUoQXR0cmlidXRlcyBhdHRycywgTWFyayBzdGFydCwgTm9kZSBwYXJlbnQpIHsKKwkgICAgdGhpcyhKU1BfQVRUUklCVVRFX0FDVElPTiwgYXR0cnMsIG51bGwsIG51bGwsIHN0YXJ0LCBwYXJlbnQpOworCX0KKworICAgICAgICBwdWJsaWMgTmFtZWRBdHRyaWJ1dGUoU3RyaW5nIHFOYW1lLCBBdHRyaWJ1dGVzIGF0dHJzLAorCQkJICAgICAgQXR0cmlidXRlcyBub25UYWdsaWJYbWxuc0F0dHJzLAorCQkJICAgICAgQXR0cmlidXRlcyB0YWdsaWJBdHRycywKKwkJCSAgICAgIE1hcmsgc3RhcnQsIE5vZGUgcGFyZW50KSB7CisKKyAgICAgICAgICAgIHN1cGVyKHFOYW1lLCBBVFRSSUJVVEVfQUNUSU9OLCBhdHRycywgbm9uVGFnbGliWG1sbnNBdHRycywKKwkJICB0YWdsaWJBdHRycywgc3RhcnQsIHBhcmVudCk7CisgICAgICAgICAgICB0ZW1wb3JhcnlWYXJpYWJsZU5hbWUgPSBKc3BVdGlsLm5leHRUZW1wb3JhcnlWYXJpYWJsZU5hbWUoKTsKKyAgICAgICAgICAgIGlmKCAiZmFsc2UiLmVxdWFscyggdGhpcy5nZXRBdHRyaWJ1dGVWYWx1ZSggInRyaW0iICkgKSApIHsKKyAgICAgICAgICAgICAgICAvLyAoaWYgbnVsbCBvciB0cnVlLCBsZWF2ZSBkZWZhdWx0IG9mIHRydWUpCisgICAgICAgICAgICAgICAgdHJpbSA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2hpbGRJbmZvID0gbmV3IENoaWxkSW5mbygpOworCSAgICBuYW1lID0gdGhpcy5nZXRBdHRyaWJ1dGVWYWx1ZSgibmFtZSIpOworICAgICAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIE1hbmRhdGFyeSBhdHRyaWJ1dGUgIm5hbWUiIHdpbGwgYmUgY2hlY2tlZCBpbiBWYWxpZGF0b3IKKwkgICAgICAgIGxvY2FsTmFtZSA9IG5hbWU7CisJICAgICAgICBpbnQgaW5kZXggPSBuYW1lLmluZGV4T2YoJzonKTsKKwkgICAgICAgIGlmIChpbmRleCAhPSAtMSkgeworCQkgICAgcHJlZml4ID0gbmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOworCQkgICAgbG9jYWxOYW1lID0gbmFtZS5zdWJzdHJpbmcoaW5kZXgrMSk7CisgICAgICAgICAgICAgICAgfQorCSAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBhY2NlcHQoVmlzaXRvciB2KSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHYudmlzaXQodGhpcyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5uYW1lOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRMb2NhbE5hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5sb2NhbE5hbWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLnByZWZpeDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIENoaWxkSW5mbyBnZXRDaGlsZEluZm8oKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5jaGlsZEluZm87CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1RyaW0oKSB7CisgICAgICAgICAgICByZXR1cm4gdHJpbTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcmV0dXJuIEEgdW5pcXVlIHRlbXBvcmFyeSB2YXJpYWJsZSBuYW1lIHRvIHN0b3JlIHRoZSByZXN1bHQgaW4uCisgICAgICAgICAqICAgICAgKHRoaXMgcHJvYmFibHkgY291bGQgZ28gZWxzZXdoZXJlLCBidXQgaXQncyBjb252ZW5pZW50IGhlcmUpCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFRlbXBvcmFyeVZhcmlhYmxlTmFtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiB0ZW1wb3JhcnlWYXJpYWJsZU5hbWU7CisgICAgICAgIH0KKworCS8qCisJICogR2V0IHRoZSBhdHRyaWJ1dGUgdmFsdWUgZnJvbSB0aGlzIG5hbWVkIGF0dHJpYnV0ZSAoPGpzcDphdHRyaWJ1dGU+KS4KKwkgKiBTaW5jZSB0aGlzIG1ldGhvZCBpcyBvbmx5IGZvciBhdHRyaWJ1dGVzIHRoYXQgYXJlIG5vdCBydGV4cHIsCisJICogd2UgY2FuIGFzc3VtZSB0aGUgYm9keSBvZiB0aGUganNwOmF0dHJpYnV0ZSBpcyBhIHRlbXBsYXRlIHRleHQuCisJICovCisJcHVibGljIFN0cmluZyBnZXRUZXh0KCkgeworCisJICAgIGNsYXNzIEF0dHJpYnV0ZVZpc2l0b3IgZXh0ZW5kcyBWaXNpdG9yIHsKKwkJU3RyaW5nIGF0dHJWYWx1ZSA9IG51bGw7CisJCXB1YmxpYyB2b2lkIHZpc2l0KFRlbXBsYXRlVGV4dCB0eHQpIHsKKwkJICAgIGF0dHJWYWx1ZSA9IG5ldyBTdHJpbmcodHh0LmdldFRleHQoKSk7CisJCX0KKwkJCisJCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clZhbHVlKCkgeworCQkgICAgcmV0dXJuIGF0dHJWYWx1ZTsKKwkJfQorCSAgICB9CisKKwkgICAgLy8gQWNjb3JkaW5nIHRvIEpTUCAyLjAsIGlmIHRoZSBib2R5IG9mIHRoZSA8anNwOmF0dHJpYnV0ZT4KKwkgICAgLy8gYWN0aW9uIGlzIGVtcHR5LCBpdCBpcyBlcXVpdmFsZW50IG9mIHNwZWNpZnlpbmcgIiIgYXMgdGhlIHZhbHVlCisJICAgIC8vIG9mIHRoZSBhdHRyaWJ1dGUuCisJICAgIFN0cmluZyB0ZXh0ID0gIiI7CisJICAgIGlmIChnZXRCb2R5KCkgIT0gbnVsbCkgeworCQlBdHRyaWJ1dGVWaXNpdG9yIGF0dHJpYnV0ZVZpc2l0b3IgPSBuZXcgQXR0cmlidXRlVmlzaXRvcigpOworCQl0cnkgeworCQkgICAgZ2V0Qm9keSgpLnZpc2l0KGF0dHJpYnV0ZVZpc2l0b3IpOworCQl9IGNhdGNoIChKYXNwZXJFeGNlcHRpb24gZSkgeworCQl9CisJCXRleHQgPSBhdHRyaWJ1dGVWaXNpdG9yLmdldEF0dHJWYWx1ZSgpOworCSAgICB9CisJICAgIAorCSAgICByZXR1cm4gdGV4dDsKKwl9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwcmVzZW50cyBhIEpzcEJvZHkgbm9kZSAoJmx0O2pzcDpib2R5Jmd0OykKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEpzcEJvZHkgZXh0ZW5kcyBOb2RlIHsKKworICAgICAgICBwcml2YXRlIENoaWxkSW5mbyBjaGlsZEluZm87CisKKyAgICAgICAgcHVibGljIEpzcEJvZHkoTWFyayBzdGFydCwgTm9kZSBwYXJlbnQpIHsKKyAgICAgICAgICAgIHRoaXMoSlNQX0JPRFlfQUNUSU9OLCBudWxsLCBudWxsLCBzdGFydCwgcGFyZW50KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBKc3BCb2R5KFN0cmluZyBxTmFtZSwgQXR0cmlidXRlcyBub25UYWdsaWJYbWxuc0F0dHJzLAorCQkgICAgICAgQXR0cmlidXRlcyB0YWdsaWJBdHRycywgTWFyayBzdGFydCwgTm9kZSBwYXJlbnQpIHsKKyAgICAgICAgICAgIHN1cGVyKHFOYW1lLCBCT0RZX0FDVElPTiwgbnVsbCwgbm9uVGFnbGliWG1sbnNBdHRycywgdGFnbGliQXR0cnMsCisJCSAgc3RhcnQsIHBhcmVudCk7CisgICAgICAgICAgICB0aGlzLmNoaWxkSW5mbyA9IG5ldyBDaGlsZEluZm8oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGFjY2VwdChWaXNpdG9yIHYpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgdi52aXNpdCh0aGlzKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDaGlsZEluZm8gZ2V0Q2hpbGRJbmZvKCkgeworICAgICAgICAgICAgcmV0dXJuIGNoaWxkSW5mbzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcHJlc2VudHMgYSB0ZW1wbGF0ZSB0ZXh0IHN0cmluZworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVtcGxhdGVUZXh0IGV4dGVuZHMgTm9kZSB7CisKKyAgICAgICAgcHJpdmF0ZSBBcnJheUxpc3QgZXh0cmFTbWFwID0gbnVsbDsKKworCXB1YmxpYyBUZW1wbGF0ZVRleHQoU3RyaW5nIHRleHQsIE1hcmsgc3RhcnQsIE5vZGUgcGFyZW50KSB7CisJICAgIHN1cGVyKG51bGwsIG51bGwsIHRleHQsIHN0YXJ0LCBwYXJlbnQpOworCX0KKworCXB1YmxpYyB2b2lkIGFjY2VwdChWaXNpdG9yIHYpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCSAgICB2LnZpc2l0KHRoaXMpOworCX0KKworICAgICAgICAvKioKKyAgICAgICAgICogVHJpbSBhbGwgd2hpdGVzcGFjZSBmcm9tIHRoZSBsZWZ0IG9mIHRoZSB0ZW1wbGF0ZSB0ZXh0CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBsdHJpbSgpIHsKKwkgICAgaW50IGluZGV4ID0gMDsKKyAgICAgICAgICAgIHdoaWxlICgoaW5kZXggPCB0ZXh0Lmxlbmd0aCgpKSAmJiAodGV4dC5jaGFyQXQoaW5kZXgpIDw9ICcgJykpIHsKKwkJaW5kZXgrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRleHQgPSB0ZXh0LnN1YnN0cmluZyhpbmRleCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KSB7CisgICAgICAgICAgICB0aGlzLnRleHQgPSB0ZXh0OworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRyaW0gYWxsIHdoaXRlc3BhY2UgZnJvbSB0aGUgcmlnaHQgb2YgdGhlIHRlbXBsYXRlIHRleHQKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHJ0cmltKCkgeworICAgICAgICAgICAgaW50IGluZGV4ID0gdGV4dC5sZW5ndGgoKTsKKyAgICAgICAgICAgIHdoaWxlKCAoaW5kZXggPiAwKSAmJiAodGV4dC5jaGFyQXQoaW5kZXgtMSkgPD0gJyAnKSApIHsKKyAgICAgICAgICAgICAgICBpbmRleC0tOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGV4dCA9IHRleHQuc3Vic3RyaW5nKDAsIGluZGV4KTsKKyAgICAgICAgfQorCisJLyoqCisJICogUmV0dXJucyB0cnVlIGlmIHRoaXMgdGVtcGxhdGUgdGV4dCBjb250YWlucyB3aGl0ZXNwYWNlIG9ubHkuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNBbGxTcGFjZSgpIHsKKwkgICAgYm9vbGVhbiBpc0FsbFNwYWNlID0gdHJ1ZTsKKwkgICAgZm9yIChpbnQgaT0wOyBpPHRleHQubGVuZ3RoKCk7IGkrKykgeworCQlpZiAoIUNoYXJhY3Rlci5pc1doaXRlc3BhY2UodGV4dC5jaGFyQXQoaSkpKSB7CisJCSAgICBpc0FsbFNwYWNlID0gZmFsc2U7CisJCSAgICBicmVhazsKKwkJfQorCSAgICB9CisJICAgIHJldHVybiBpc0FsbFNwYWNlOworCX0KKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkIGEgc291cmNlIHRvIEphdmEgbGluZSBtYXBwaW5nCisgICAgICAgICAqIEBwYXJhbSBzcmNMaW5lIFRoZSBwb3N0aW9uIG9mIHRoZSBzb3VyY2UgbGluZSwgcmVsYXRpdmUgdG8gdGhlIGxpbmUKKyAgICAgICAgICogICAgICAgIGF0IHRoZSBzdGFydCBvZiB0aGlzIG5vZGUuICBUaGUgY29ycmVzcG9uZGluZyBqYXZhIGxpbmUgaXMKKyAgICAgICAgICogICAgICAgIGFzc3VtZWQgdG8gYmUgY29uc2VjdXRpdmUsIGkuZS4gb25lIG1vcmUgdGhhbiB0aGUgbGFzdC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIGFkZFNtYXAoaW50IHNyY0xpbmUpIHsKKyAgICAgICAgICAgIGlmIChleHRyYVNtYXAgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGV4dHJhU21hcCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGV4dHJhU21hcC5hZGQobmV3IEludGVnZXIoc3JjTGluZSkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEFycmF5TGlzdCBnZXRFeHRyYVNtYXAoKSB7CisgICAgICAgICAgICByZXR1cm4gZXh0cmFTbWFwOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAqIEF1eGlsbGFyeSBjbGFzc2VzIHVzZWQgaW4gTm9kZQorICAgICAqLworCisgICAgLyoqCisgICAgICogUmVwcmVzZW50cyBhdHRyaWJ1dGVzIHRoYXQgY2FuIGJlIHJlcXVlc3QgdGltZSBleHByZXNzaW9ucy4KKyAgICAgKgorICAgICAqIENhbiBlaXRoZXIgYmUgYSBwbGFpbiBhdHRyaWJ1dGUsIGFuIGF0dHJpYnV0ZSB0aGF0IHJlcHJlc2VudHMgYQorICAgICAqIHJlcXVlc3QgdGltZSBleHByZXNzaW9uIHZhbHVlLCBvciBhIG5hbWVkIGF0dHJpYnV0ZSAoc3BlY2lmaWVkIHVzaW5nCisgICAgICogdGhlIGpzcDphdHRyaWJ1dGUgc3RhbmRhcmQgYWN0aW9uKS4KKyAgICAgKi8KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSnNwQXR0cmlidXRlIHsKKworCXByaXZhdGUgU3RyaW5nIHFOYW1lOworCXByaXZhdGUgU3RyaW5nIHVyaTsKKwlwcml2YXRlIFN0cmluZyBsb2NhbE5hbWU7CisJcHJpdmF0ZSBTdHJpbmcgdmFsdWU7CisJcHJpdmF0ZSBib29sZWFuIGV4cHJlc3Npb247CisJcHJpdmF0ZSBib29sZWFuIGR5bmFtaWM7CisgICAgICAgIHByaXZhdGUgRUxOb2RlLk5vZGVzIGVsOworCisgICAgICAgIC8vIElmIHRydWUsIHRoaXMgSnNwQXR0cmlidXRlIHJlcHJlc2VudHMgYSA8anNwOmF0dHJpYnV0ZT4KKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG5hbWVkQXR0cmlidXRlOworICAgICAgICAvLyBUaGUgbm9kZSBpbiB0aGUgcGFyc2UgdHJlZSBmb3IgdGhlIE5hbWVkQXR0cmlidXRlCisgICAgICAgIHByaXZhdGUgTmFtZWRBdHRyaWJ1dGUgbmFtZWRBdHRyaWJ1dGVOb2RlOworCisgICAgICAgIEpzcEF0dHJpYnV0ZShTdHJpbmcgcU5hbWUsIFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyB2YWx1ZSwKKwkJICAgICBib29sZWFuIGV4cHIsIEVMTm9kZS5Ob2RlcyBlbCwgYm9vbGVhbiBkeW4gKSB7CisJICAgIHRoaXMucU5hbWUgPSBxTmFtZTsKKwkgICAgdGhpcy51cmkgPSB1cmk7CisJICAgIHRoaXMubG9jYWxOYW1lID0gbG9jYWxOYW1lOworCSAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgICAgICAgICB0aGlzLm5hbWVkQXR0cmlidXRlTm9kZSA9IG51bGw7CisJICAgIHRoaXMuZXhwcmVzc2lvbiA9IGV4cHI7CisgICAgICAgICAgICB0aGlzLmVsID0gZWw7CisJICAgIHRoaXMuZHluYW1pYyA9IGR5bjsKKyAgICAgICAgICAgIHRoaXMubmFtZWRBdHRyaWJ1dGUgPSBmYWxzZTsKKwl9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHRoZSBKc3BBdHRyaWJ1dGUgcmVwcmVzZW50cyBhCisgICAgICAgICAqIG5hbWVkIGF0dHJpYnV0ZS4gIEluIHRoaXMgY2FzZSwgd2UgaGF2ZSB0byBzdG9yZSB0aGUgbm9kZXMgb2YKKyAgICAgICAgICogdGhlIGJvZHkgb2YgdGhlIGF0dHJpYnV0ZS4KKyAgICAgICAgICovCisgICAgICAgIEpzcEF0dHJpYnV0ZShOYW1lZEF0dHJpYnV0ZSBuYSwgYm9vbGVhbiBkeW4pIHsKKyAgICAgICAgICAgIHRoaXMucU5hbWUgPSBuYS5nZXROYW1lKCk7CisJICAgIHRoaXMubG9jYWxOYW1lID0gbmEuZ2V0TG9jYWxOYW1lKCk7CisgICAgICAgICAgICB0aGlzLnZhbHVlID0gbnVsbDsKKyAgICAgICAgICAgIHRoaXMubmFtZWRBdHRyaWJ1dGVOb2RlID0gbmE7CisgICAgICAgICAgICB0aGlzLmV4cHJlc3Npb24gPSBmYWxzZTsKKyAgICAgICAgICAgIHRoaXMuZWwgPSBudWxsOworCSAgICB0aGlzLmR5bmFtaWMgPSBkeW47CisgICAgICAgICAgICB0aGlzLm5hbWVkQXR0cmlidXRlID0gdHJ1ZTsKKyAgICAgICAgfQorCisJLyoqCisgCSAqIEByZXR1cm4gVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkgICAgcmV0dXJuIHFOYW1lOworCX0KKworCS8qKgorIAkgKiBAcmV0dXJuIFRoZSBsb2NhbCBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldExvY2FsTmFtZSgpIHsKKwkgICAgcmV0dXJuIGxvY2FsTmFtZTsKKwl9CisKKwkvKioKKyAJICogQHJldHVybiBUaGUgbmFtZXNwYWNlIG9mIHRoZSBhdHRyaWJ1dGUsIG9yIG51bGwgaWYgaW4gdGhlIGRlZmF1bHQKKwkgKiBuYW1lc3BhY2UKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFVSSSgpIHsKKwkgICAgcmV0dXJuIHVyaTsKKwl9CisKKwkvKioKKyAgICAgICAgICogT25seSBtYWtlcyBzZW5zZSBpZiBuYW1lZEF0dHJpYnV0ZSBpcyBmYWxzZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiB0aGUgdmFsdWUgZm9yIHRoZSBhdHRyaWJ1dGUsIG9yIHRoZSBleHByZXNzaW9uIHN0cmluZworICAgICAgICAgKiAgICAgICAgIChzdHJpcHBlZCBvZiAiPCU9IiwgIiU+IiwgIiU9Iiwgb3IgIiUiCisgICAgICAgICAqICAgICAgICAgIGJ1dCBjb250YWluaW5nICIkeyIgYW5kICJ9IiBmb3IgRUwgZXhwcmVzc2lvbnMpCisJICovCisJcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKwkgICAgcmV0dXJuIHZhbHVlOworCX0KKworICAgICAgICAvKioKKyAgICAgICAgICogT25seSBtYWtlcyBzZW5zZSBpZiBuYW1lZEF0dHJpYnV0ZSBpcyB0cnVlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBub2RlcyB0aGF0IGV2YWx1YXRlIHRvIHRoZSBib2R5IG9mIHRoaXMgYXR0cmlidXRlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIE5hbWVkQXR0cmlidXRlIGdldE5hbWVkQXR0cmlidXRlTm9kZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuYW1lZEF0dHJpYnV0ZU5vZGU7CisgICAgICAgIH0KKworCS8qKgorICAgICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHZhbHVlIHJlcHJlc2VudHMgYSB0cmFkaXRpb25hbCBydGV4cHJ2YWx1ZQorCSAqLworCXB1YmxpYyBib29sZWFuIGlzRXhwcmVzc2lvbigpIHsKKwkgICAgcmV0dXJuIGV4cHJlc3Npb247CisJfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHZhbHVlIHJlcHJlc2VudHMgYSBOYW1lZEF0dHJpYnV0ZSB2YWx1ZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzTmFtZWRBdHRyaWJ1dGUoKSB7CisgICAgICAgICAgICByZXR1cm4gbmFtZWRBdHRyaWJ1dGU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSB2YWx1ZSByZXByZXNlbnRzIGFuIGV4cHJlc3Npb24gdGhhdCBzaG91bGQKKyAgICAgICAgICogYmUgZmVkIHRvIHRoZSBleHByZXNzaW9uIGludGVycHJldGVyCisgICAgICAgICAqIEByZXR1cm4gZmFsc2UgZm9yIHN0cmluZyBsaXRlcmFscyBvciBydGV4cHJ2YWx1ZXMgdGhhdCBzaG91bGQKKyAgICAgICAgICogbm90IGJlIGludGVycHJldGVkIG9yIHJlZXZhbHVhdGVkCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0VMSW50ZXJwcmV0ZXJJbnB1dCgpIHsKKyAgICAgICAgICAgIHJldHVybiBlbCAhPSBudWxsOworICAgICAgICB9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHZhbHVlIGlzIGEgc3RyaW5nIGxpdGVyYWwga25vd24gYXQgdHJhbnNsYXRpb24KKwkgKiB0aW1lLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzTGl0ZXJhbCgpIHsKKwkgICAgcmV0dXJuICFleHByZXNzaW9uICYmIChlbCAhPSBudWxsKSAmJiAhbmFtZWRBdHRyaWJ1dGU7CisJfQorCisJLyoqCisJICogWFhYCisJICovCisJcHVibGljIGJvb2xlYW4gaXNEeW5hbWljKCkgeworCSAgICByZXR1cm4gZHluYW1pYzsKKwl9CisKKwlwdWJsaWMgRUxOb2RlLk5vZGVzIGdldEVMKCkgeworCSAgICByZXR1cm4gZWw7CisJfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFuIG9yZGVyZWQgbGlzdCBvZiBOb2RlLCB1c2VkIHRvIHJlcHJlc2VudCB0aGUgYm9keSBvZiBhbiBlbGVtZW50LCBvcgorICAgICAqIGEganNwIHBhZ2Ugb2YganNwIGRvY3VtZW50LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTm9kZXMgeworCisJcHJpdmF0ZSBMaXN0IGxpc3Q7CisJcHJpdmF0ZSBOb2RlLlJvb3Qgcm9vdDsJCS8vIG51bGwgaWYgdGhpcyBpcyBub3QgYSBwYWdlCisJcHJpdmF0ZSBib29sZWFuIGdlbmVyYXRlZEluQnVmZmVyOworCisJcHVibGljIE5vZGVzKCkgeworCSAgICBsaXN0ID0gbmV3IFZlY3RvcigpOworCX0KKworCXB1YmxpYyBOb2RlcyhOb2RlLlJvb3Qgcm9vdCkgeworCSAgICB0aGlzLnJvb3QgPSByb290OworCSAgICBsaXN0ID0gbmV3IFZlY3RvcigpOworCSAgICBsaXN0LmFkZChyb290KTsKKwl9CisKKwkvKioKKwkgKiBBcHBlbmRzIGEgbm9kZSB0byB0aGUgbGlzdAorCSAqIEBwYXJhbSBuIFRoZSBub2RlIHRvIGFkZAorCSAqLworCXB1YmxpYyB2b2lkIGFkZChOb2RlIG4pIHsKKwkgICAgbGlzdC5hZGQobik7CisJICAgIHJvb3QgPSBudWxsOworCX0KKworCS8qKgorCSAqIFJlbW92ZXMgdGhlIGdpdmVuIG5vZGUgZnJvbSB0aGUgbGlzdC4KKwkgKiBAcGFyYW0gbiBUaGUgbm9kZSB0byBiZSByZW1vdmVkCisJICovCisJcHVibGljIHZvaWQgcmVtb3ZlKE5vZGUgbikgeworCSAgICBsaXN0LnJlbW92ZShuKTsKKwl9CisKKwkvKioKKwkgKiBWaXNpdCB0aGUgbm9kZXMgaW4gdGhlIGxpc3Qgd2l0aCB0aGUgc3VwcGxpZWQgdmlzaXRvcgorCSAqIEBwYXJhbSB2IFRoZSB2aXNpdG9yIHVzZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCB2aXNpdChWaXNpdG9yIHYpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCSAgICBJdGVyYXRvciBpdGVyID0gbGlzdC5pdGVyYXRvcigpOworCSAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKwkJTm9kZSBuID0gKE5vZGUpIGl0ZXIubmV4dCgpOworCQluLmFjY2VwdCh2KTsKKwkgICAgfQorCX0KKworCXB1YmxpYyBpbnQgc2l6ZSgpIHsKKwkgICAgcmV0dXJuIGxpc3Quc2l6ZSgpOworCX0KKworCXB1YmxpYyBOb2RlIGdldE5vZGUoaW50IGluZGV4KSB7CisJICAgIE5vZGUgbiA9IG51bGw7CisJICAgIHRyeSB7CisJCW4gPSAoTm9kZSkgbGlzdC5nZXQoaW5kZXgpOworCSAgICB9IGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCSAgICB9CisJICAgIHJldHVybiBuOworCX0KKwkKKwlwdWJsaWMgTm9kZS5Sb290IGdldFJvb3QoKSB7CisJICAgIHJldHVybiByb290OworCX0KKworCXB1YmxpYyBib29sZWFuIGlzR2VuZXJhdGVkSW5CdWZmZXIoKSB7CisJICAgIHJldHVybiBnZW5lcmF0ZWRJbkJ1ZmZlcjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZWRJbkJ1ZmZlcihib29sZWFuIGcpIHsKKwkgICAgZ2VuZXJhdGVkSW5CdWZmZXIgPSBnOworCX0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIHZpc2l0b3IgY2xhc3MgZm9yIHZpc2l0aW5nIHRoZSBub2RlLiAgVGhpcyBjbGFzcyBhbHNvIHByb3ZpZGVzIHRoZQorICAgICAqIGRlZmF1bHQgYWN0aW9uIChpLmUuIG5vcCkgZm9yIGVhY2ggb2YgdGhlIGNoaWxkIGNsYXNzIG9mIHRoZSBOb2RlLgorICAgICAqIEFuIGFjdHVhbCB2aXNpdG9yIHNob3VsZCBleHRlbmQgdGhpcyBjbGFzcyBhbmQgc3VwcGx5IHRoZSB2aXNpdAorICAgICAqIG1ldGhvZCBmb3IgdGhlIG5vZGVzIHRoYXQgaXQgY2FyZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBWaXNpdG9yIHsKKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIHByb3ZpZGVzIGEgcGxhY2UgdG8gcHV0IGFjdGlvbnMgdGhhdCBhcmUgY29tbW9uIHRvCisJICogYWxsIG5vZGVzLiBPdmVycmlkZSB0aGlzIGluIHRoZSBjaGlsZCB2aXNpdG9yIGNsYXNzIGlmIG5lZWQgdG8uCisJICovCisJcHJvdGVjdGVkIHZvaWQgZG9WaXNpdChOb2RlIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCX0KKworCS8qKgorCSAqIFZpc2l0IHRoZSBib2R5IG9mIGEgbm9kZSwgdXNpbmcgdGhlIGN1cnJlbnQgdmlzaXRvcgorCSAqLworCXByb3RlY3RlZCB2b2lkIHZpc2l0Qm9keShOb2RlIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCSAgICBpZiAobi5nZXRCb2R5KCkgIT0gbnVsbCkgeworCQluLmdldEJvZHkoKS52aXNpdCh0aGlzKTsKKwkgICAgfQorCX0KKworCXB1YmxpYyB2b2lkIHZpc2l0KFJvb3QgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJICAgIGRvVmlzaXQobik7CisJICAgIHZpc2l0Qm9keShuKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB2aXNpdChKc3BSb290IG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCSAgICBkb1Zpc2l0KG4pOworCSAgICB2aXNpdEJvZHkobik7CisJfQorCisJcHVibGljIHZvaWQgdmlzaXQoUGFnZURpcmVjdGl2ZSBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwkgICAgZG9WaXNpdChuKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB2aXNpdChUYWdEaXJlY3RpdmUgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJICAgIGRvVmlzaXQobik7CisJfQorCisJcHVibGljIHZvaWQgdmlzaXQoSW5jbHVkZURpcmVjdGl2ZSBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwkgICAgZG9WaXNpdChuKTsKKwkgICAgdmlzaXRCb2R5KG4pOworCX0KKworCXB1YmxpYyB2b2lkIHZpc2l0KFRhZ2xpYkRpcmVjdGl2ZSBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwkgICAgZG9WaXNpdChuKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB2aXNpdChBdHRyaWJ1dGVEaXJlY3RpdmUgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJICAgIGRvVmlzaXQobik7CisJfQorCisJcHVibGljIHZvaWQgdmlzaXQoVmFyaWFibGVEaXJlY3RpdmUgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJICAgIGRvVmlzaXQobik7CisJfQorCisJcHVibGljIHZvaWQgdmlzaXQoQ29tbWVudCBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwkgICAgZG9WaXNpdChuKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB2aXNpdChEZWNsYXJhdGlvbiBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwkgICAgZG9WaXNpdChuKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB2aXNpdChFeHByZXNzaW9uIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCSAgICBkb1Zpc2l0KG4pOworCX0KKworCXB1YmxpYyB2b2lkIHZpc2l0KFNjcmlwdGxldCBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwkgICAgZG9WaXNpdChuKTsKKwl9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoRUxFeHByZXNzaW9uIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgZG9WaXNpdChuKTsKKyAgICAgICAgfQorCisJcHVibGljIHZvaWQgdmlzaXQoSW5jbHVkZUFjdGlvbiBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwkgICAgZG9WaXNpdChuKTsKKwkgICAgdmlzaXRCb2R5KG4pOworCX0KKworCXB1YmxpYyB2b2lkIHZpc2l0KEZvcndhcmRBY3Rpb24gbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJICAgIGRvVmlzaXQobik7CisJICAgIHZpc2l0Qm9keShuKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB2aXNpdChHZXRQcm9wZXJ0eSBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwkgICAgZG9WaXNpdChuKTsKKwkgICAgdmlzaXRCb2R5KG4pOworCX0KKworCXB1YmxpYyB2b2lkIHZpc2l0KFNldFByb3BlcnR5IG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCSAgICBkb1Zpc2l0KG4pOworCSAgICB2aXNpdEJvZHkobik7CisJfQorCisJcHVibGljIHZvaWQgdmlzaXQoUGFyYW1BY3Rpb24gbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJICAgIGRvVmlzaXQobik7CisJICAgIHZpc2l0Qm9keShuKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB2aXNpdChQYXJhbXNBY3Rpb24gbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJICAgIGRvVmlzaXQobik7CisJICAgIHZpc2l0Qm9keShuKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB2aXNpdChGYWxsQmFja0FjdGlvbiBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwkgICAgZG9WaXNpdChuKTsKKwkgICAgdmlzaXRCb2R5KG4pOworCX0KKworCXB1YmxpYyB2b2lkIHZpc2l0KFVzZUJlYW4gbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJICAgIGRvVmlzaXQobik7CisJICAgIHZpc2l0Qm9keShuKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB2aXNpdChQbHVnSW4gbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJICAgIGRvVmlzaXQobik7CisJICAgIHZpc2l0Qm9keShuKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB2aXNpdChDdXN0b21UYWcgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJICAgIGRvVmlzaXQobik7CisJICAgIHZpc2l0Qm9keShuKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB2aXNpdChVbmludGVycHJldGVkVGFnIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCSAgICBkb1Zpc2l0KG4pOworCSAgICB2aXNpdEJvZHkobik7CisJfQorCisJcHVibGljIHZvaWQgdmlzaXQoSnNwRWxlbWVudCBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwkgICAgZG9WaXNpdChuKTsKKwkgICAgdmlzaXRCb2R5KG4pOworCX0KKworCXB1YmxpYyB2b2lkIHZpc2l0KEpzcFRleHQgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJICAgIGRvVmlzaXQobik7CisJICAgIHZpc2l0Qm9keShuKTsKKwl9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTmFtZWRBdHRyaWJ1dGUgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBkb1Zpc2l0KG4pOworICAgICAgICAgICAgdmlzaXRCb2R5KG4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoSnNwQm9keSBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGRvVmlzaXQobik7CisgICAgICAgICAgICB2aXNpdEJvZHkobik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChJbnZva2VBY3Rpb24gbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBkb1Zpc2l0KG4pOworICAgICAgICAgICAgdmlzaXRCb2R5KG4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoRG9Cb2R5QWN0aW9uIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgZG9WaXNpdChuKTsKKyAgICAgICAgICAgIHZpc2l0Qm9keShuKTsKKyAgICAgICAgfQorCisJcHVibGljIHZvaWQgdmlzaXQoVGVtcGxhdGVUZXh0IG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCSAgICBkb1Zpc2l0KG4pOworCX0KKworCXB1YmxpYyB2b2lkIHZpc2l0KEpzcE91dHB1dCBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwkgICAgZG9WaXNpdChuKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB2aXNpdChBdHRyaWJ1dGVHZW5lcmF0b3IgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJICAgIGRvVmlzaXQobik7CisJfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9QYWdlRGF0YUltcGwuamF2YSBiL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9QYWdlRGF0YUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjNmMDRkCi0tLSAvZGV2L251bGwKKysrIGIvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL2NvbXBpbGVyL1BhZ2VEYXRhSW1wbC5qYXZhCkBAIC0wLDAgKzEsNzA0IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuamFzcGVyLmNvbXBpbGVyOworCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQ2hhckFycmF5V3JpdGVyOworaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5QYWdlRGF0YTsKK2ltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOworaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuQXR0cmlidXRlc0ltcGw7CitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIuSmFzcGVyRXhjZXB0aW9uOworCisvKioKKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIDx0dD5qYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuUGFnZURhdGE8L3R0PiB3aGljaAorICogYnVpbGRzIHRoZSBYTUwgdmlldyBvZiBhIGdpdmVuIHBhZ2UuCisgKgorICogVGhlIFhNTCB2aWV3IGlzIGJ1aWx0IGluIHR3byBwYXNzZXM6CisgKgorICogRHVyaW5nIHRoZSBmaXJzdCBwYXNzLCB0aGUgRmlyc3RQYXNzVmlzaXRvciBjb2xsZWN0cyB0aGUgYXR0cmlidXRlcyBvZiB0aGUKKyAqIHRvcC1sZXZlbCBqc3A6cm9vdCBhbmQgdGhvc2Ugb2YgdGhlIGpzcDpyb290IGVsZW1lbnRzIG9mIGFueSBpbmNsdWRlZAorICogcGFnZXMsIGFuZCBhZGRzIHRoZW0gdG8gdGhlIGpzcDpyb290IGVsZW1lbnQgb2YgdGhlIFhNTCB2aWV3LgorICogSW4gYWRkaXRpb24sIGFueSB0YWdsaWIgZGlyZWN0aXZlcyBhcmUgY29udmVydGVkIGludG8geG1sbnM6IGF0dHJpYnV0ZXMgYW5kCisgKiBhZGRlZCB0byB0aGUganNwOnJvb3QgZWxlbWVudCBvZiB0aGUgWE1MIHZpZXcuCisgKiBUaGlzIHBhc3MgaWdub3JlcyBhbnkgbm9kZXMgb3RoZXIgdGhhbiBKc3BSb290IGFuZCBUYWdsaWJEaXJlY3RpdmUuCisgKgorICogRHVyaW5nIHRoZSBzZWNvbmQgcGFzcywgdGhlIFNlY29uZFBhc3NWaXNpdG9yIHByb2R1Y2VzIHRoZSBYTUwgdmlldywgdXNpbmcKKyAqIHRoZSBjb21iaW5lZCBqc3A6cm9vdCBhdHRyaWJ1dGVzIGRldGVybWluZWQgaW4gdGhlIGZpcnN0IHBhc3MgYW5kIGFueQorICogcmVtYWluaW5nIHBhZ2VzIG5vZGVzICh0aGlzIHBhc3MgaWdub3JlcyBhbnkgSnNwUm9vdCBhbmQgVGFnbGliRGlyZWN0aXZlCisgKiBub2RlcykuCisgKgorICogQGF1dGhvciBKYW4gTHVlaGUKKyAqLworY2xhc3MgUGFnZURhdGFJbXBsIGV4dGVuZHMgUGFnZURhdGEgaW1wbGVtZW50cyBUYWdDb25zdGFudHMgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9WRVJTSU9OID0gIjIuMCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENEQVRBX1NUQVJUX1NFQ1RJT04gPSAiPCFbQ0RBVEFbXG4iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDREFUQV9FTkRfU0VDVElPTiA9ICJdXT5cbiI7CisKKyAgICAvLyBzdHJpbmcgYnVmZmVyIHVzZWQgdG8gYnVpbGQgWE1MIHZpZXcKKyAgICBwcml2YXRlIFN0cmluZ0J1ZmZlciBidWY7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYWdlIHRoZSBwYWdlIG5vZGVzIGZyb20gd2hpY2ggdG8gZ2VuZXJhdGUgdGhlIFhNTCB2aWV3CisgICAgICovCisgICAgcHVibGljIFBhZ2VEYXRhSW1wbChOb2RlLk5vZGVzIHBhZ2UsIENvbXBpbGVyIGNvbXBpbGVyKQorCSAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisKKwkvLyBGaXJzdCBwYXNzCisJRmlyc3RQYXNzVmlzaXRvciBmaXJzdFBhc3MgPSBuZXcgRmlyc3RQYXNzVmlzaXRvcihwYWdlLmdldFJvb3QoKSwKKwkJCQkJCQkgIGNvbXBpbGVyLmdldFBhZ2VJbmZvKCkpOworCXBhZ2UudmlzaXQoZmlyc3RQYXNzKTsKKworCS8vIFNlY29uZCBwYXNzCisJYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCVNlY29uZFBhc3NWaXNpdG9yIHNlY29uZFBhc3MKKwkgICAgPSBuZXcgU2Vjb25kUGFzc1Zpc2l0b3IocGFnZS5nZXRSb290KCksIGJ1ZiwgY29tcGlsZXIsCisJCQkJICAgIGZpcnN0UGFzcy5nZXRKc3BJZFByZWZpeCgpKTsKKwlwYWdlLnZpc2l0KHNlY29uZFBhc3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGlucHV0IHN0cmVhbSBvZiB0aGUgWE1MIHZpZXcuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBpbnB1dCBzdHJlYW0gb2YgdGhlIFhNTCB2aWV3CisgICAgICovCisgICAgcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkgeworCS8vIFR1cm4gU3RyaW5nQnVmZmVyIGludG8gSW5wdXRTdHJlYW0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnVmLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoIlVURi04IikpOworICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHVlZSkgeworCSAgICAvLyBzaG91bGQgbmV2ZXIgaGFwcGVuCisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbih1ZWUudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIEZpcnN0LXBhc3MgVmlzaXRvciBmb3IgSnNwUm9vdCBub2RlcyAocmVwcmVzZW50aW5nIGpzcDpyb290IGVsZW1lbnRzKQorICAgICAqIGFuZCBUYWJsaWJEaXJlY3RpdmUgbm9kZXMsIGlnbm9yaW5nIGFueSBvdGhlciBub2Rlcy4KKyAgICAgKgorICAgICAqIFRoZSBwdXJwb3NlIG9mIHRoaXMgVmlzaXRvciBpcyB0byBjb2xsZWN0IHRoZSBhdHRyaWJ1dGVzIG9mIHRoZQorICAgICAqIHRvcC1sZXZlbCBqc3A6cm9vdCBhbmQgdGhvc2Ugb2YgdGhlIGpzcDpyb290IGVsZW1lbnRzIG9mIGFueSBpbmNsdWRlZAorICAgICAqIHBhZ2VzLCBhbmQgYWRkIHRoZW0gdG8gdGhlIGpzcDpyb290IGVsZW1lbnQgb2YgdGhlIFhNTCB2aWV3LgorICAgICAqIEluIGFkZGl0aW9uLCB0aGlzIFZpc2l0b3IgY29udmVydHMgYW55IHRhZ2xpYiBkaXJlY3RpdmVzIGludG8geG1sbnM6CisgICAgICogYXR0cmlidXRlcyBhbmQgYWRkcyB0aGVtIHRvIHRoZSBqc3A6cm9vdCBlbGVtZW50IG9mIHRoZSBYTUwgdmlldy4KKyAgICAgKi8KKyAgICBzdGF0aWMgY2xhc3MgRmlyc3RQYXNzVmlzaXRvcgorCSAgICAgICAgZXh0ZW5kcyBOb2RlLlZpc2l0b3IgaW1wbGVtZW50cyBUYWdDb25zdGFudHMgeworCisJcHJpdmF0ZSBOb2RlLlJvb3Qgcm9vdDsKKwlwcml2YXRlIEF0dHJpYnV0ZXNJbXBsIHJvb3RBdHRyczsKKwlwcml2YXRlIFBhZ2VJbmZvIHBhZ2VJbmZvOworCisJLy8gUHJlZml4IGZvciB0aGUgJ2lkJyBhdHRyaWJ1dGUKKwlwcml2YXRlIFN0cmluZyBqc3BJZFByZWZpeDsKKworCS8qCisJICogQ29uc3RydWN0b3IKKwkgKi8KKwlwdWJsaWMgRmlyc3RQYXNzVmlzaXRvcihOb2RlLlJvb3Qgcm9vdCwgUGFnZUluZm8gcGFnZUluZm8pIHsKKwkgICAgdGhpcy5yb290ID0gcm9vdDsKKwkgICAgdGhpcy5wYWdlSW5mbyA9IHBhZ2VJbmZvOworCSAgICB0aGlzLnJvb3RBdHRycyA9IG5ldyBBdHRyaWJ1dGVzSW1wbCgpOworCSAgICB0aGlzLnJvb3RBdHRycy5hZGRBdHRyaWJ1dGUoIiIsICIiLCAidmVyc2lvbiIsICJDREFUQSIsCisJCQkJCUpTUF9WRVJTSU9OKTsKKwkgICAgdGhpcy5qc3BJZFByZWZpeCA9ICJqc3AiOworCX0KKworCXB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuUm9vdCBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwkgICAgdmlzaXRCb2R5KG4pOworCSAgICBpZiAobiA9PSByb290KSB7CisJCS8qCisJCSAqIFRvcC1sZXZlbCBwYWdlLgorCQkgKgorCQkgKiBBZGQKKwkJICogICB4bWxuczpqc3A9Imh0dHA6Ly9qYXZhLnN1bi5jb20vSlNQL1BhZ2UiCisJCSAqIGF0dHJpYnV0ZSBvbmx5IGlmIG5vdCBhbHJlYWR5IHByZXNlbnQuCisJCSAqLworCQlpZiAoIUpTUF9VUkkuZXF1YWxzKHJvb3RBdHRycy5nZXRWYWx1ZSgieG1sbnM6anNwIikpKSB7CisJCSAgICByb290QXR0cnMuYWRkQXR0cmlidXRlKCIiLCAiIiwgInhtbG5zOmpzcCIsICJDREFUQSIsCisJCQkJCSAgIEpTUF9VUkkpOworCQl9CisKKwkJaWYgKHBhZ2VJbmZvLmlzSnNwUHJlZml4SGlqYWNrZWQoKSkgeworCQkgICAgLyoKKwkJICAgICAqICdqc3AnIHByZWZpeCBoYXMgYmVlbiBoaWphY2tlZCwgdGhhdCBpcywgYm91bmQgdG8gYQorCQkgICAgICogbmFtZXNwYWNlIG90aGVyIHRoYW4gdGhlIEpTUCBuYW1lc3BhY2UuIFRoaXMgbWVhbnMgdGhhdAorCQkgICAgICogd2hlbiBhZGRpbmcgYW4gJ2lkJyBhdHRyaWJ1dGUgdG8gZWFjaCBlbGVtZW50LCB3ZSBjYW4ndAorCQkgICAgICogdXNlIHRoZSAnanNwJyBwcmVmaXguIFRoZXJlZm9yZSwgY3JlYXRlIGEgbmV3IHByZWZpeCAKKwkJICAgICAqIChvbmUgdGhhdCBpcyB1bmlxdWUgYWNyb3NzIHRoZSB0cmFuc2xhdGlvbiB1bml0KSBmb3IgdXNlCisJCSAgICAgKiBieSB0aGUgJ2lkJyBhdHRyaWJ1dGUsIGFuZCBiaW5kIGl0IHRvIHRoZSBKU1AgbmFtZXNwYWNlCisJCSAgICAgKi8KKwkJICAgIGpzcElkUHJlZml4ICs9ICJqc3AiOworCQkgICAgd2hpbGUgKHBhZ2VJbmZvLmNvbnRhaW5zUHJlZml4KGpzcElkUHJlZml4KSkgeworCQkJanNwSWRQcmVmaXggKz0gImpzcCI7CisJCSAgICB9CisJCSAgICByb290QXR0cnMuYWRkQXR0cmlidXRlKCIiLCAiIiwgInhtbG5zOiIgKyBqc3BJZFByZWZpeCwKKwkJCQkJICAgIkNEQVRBIiwgSlNQX1VSSSk7CisJCX0KKworCQlyb290LnNldEF0dHJpYnV0ZXMocm9vdEF0dHJzKTsKKwkgICAgfQorCX0KKworCXB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuSnNwUm9vdCBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwkgICAgYWRkQXR0cmlidXRlcyhuLmdldFRhZ2xpYkF0dHJpYnV0ZXMoKSk7CisgICAgICAgICAgICBhZGRBdHRyaWJ1dGVzKG4uZ2V0Tm9uVGFnbGliWG1sbnNBdHRyaWJ1dGVzKCkpOworCSAgICBhZGRBdHRyaWJ1dGVzKG4uZ2V0QXR0cmlidXRlcygpKTsKKworCSAgICB2aXNpdEJvZHkobik7CisJfQorCisJLyoKKwkgKiBDb252ZXJ0cyB0YWdsaWIgZGlyZWN0aXZlIGludG8gInhtbG5zOi4uLiIgYXR0cmlidXRlIG9mIGpzcDpyb290CisJICogZWxlbWVudC4KKwkgKi8KKwlwdWJsaWMgdm9pZCB2aXNpdChOb2RlLlRhZ2xpYkRpcmVjdGl2ZSBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwkgICAgQXR0cmlidXRlcyBhdHRycyA9IG4uZ2V0QXR0cmlidXRlcygpOworCSAgICBpZiAoYXR0cnMgIT0gbnVsbCkgeworCQlTdHJpbmcgcU5hbWUgPSAieG1sbnM6IiArIGF0dHJzLmdldFZhbHVlKCJwcmVmaXgiKTsKKwkJLyoKKwkJICogQWNjb3JkaW5nIHRvIGphdmFkb2NzIG9mIG9yZy54bWwuc2F4LmhlbHBlcnMuQXR0cmlidXRlc0ltcGwsCisJCSAqIHRoZSBhZGRBdHRyaWJ1dGUgbWV0aG9kIGRvZXMgbm90IGNoZWNrIHRvIHNlZSBpZiB0aGUKKwkJICogc3BlY2lmaWVkIGF0dHJpYnV0ZSBpcyBhbHJlYWR5IGNvbnRhaW5lZCBpbiB0aGUgbGlzdDogVGhpcworCQkgKiBpcyB0aGUgYXBwbGljYXRpb24ncyByZXNwb25zaWJpbGl0eSEKKwkJICovCisJCWlmIChyb290QXR0cnMuZ2V0SW5kZXgocU5hbWUpID09IC0xKSB7CisJCSAgICBTdHJpbmcgbG9jYXRpb24gPSBhdHRycy5nZXRWYWx1ZSgidXJpIik7CisJCSAgICBpZiAobG9jYXRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2F0aW9uLnN0YXJ0c1dpdGgoIi8iKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uID0gVVJOX0pTUFRMRCArIGxvY2F0aW9uOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCQkJcm9vdEF0dHJzLmFkZEF0dHJpYnV0ZSgiIiwgIiIsIHFOYW1lLCAiQ0RBVEEiLAorCQkJCQkgICAgICAgbG9jYXRpb24pOworCQkgICAgfSBlbHNlIHsKKwkJCWxvY2F0aW9uID0gYXR0cnMuZ2V0VmFsdWUoInRhZ2RpciIpOworCQkJcm9vdEF0dHJzLmFkZEF0dHJpYnV0ZSgiIiwgIiIsIHFOYW1lLCAiQ0RBVEEiLAorCQkJCQkgICAgICAgVVJOX0pTUFRBR0RJUiArIGxvY2F0aW9uKTsKKwkJICAgIH0KKwkJfQorCSAgICB9CisJfQorCisJcHVibGljIFN0cmluZyBnZXRKc3BJZFByZWZpeCgpIHsKKwkgICAgcmV0dXJuIGpzcElkUHJlZml4OworCX0KKworCXByaXZhdGUgdm9pZCBhZGRBdHRyaWJ1dGVzKEF0dHJpYnV0ZXMgYXR0cnMpIHsKKwkgICAgaWYgKGF0dHJzICE9IG51bGwpIHsKKwkJaW50IGxlbiA9IGF0dHJzLmdldExlbmd0aCgpOworCQlmb3IgKGludCBpPTA7IGk8bGVuOyBpKyspIHsKKwkJICAgIGlmICgidmVyc2lvbiIuZXF1YWxzKGF0dHJzLmdldFFOYW1lKGkpKSkgeworCQkJY29udGludWU7CisJCSAgICB9CisJCSAgICByb290QXR0cnMuYWRkQXR0cmlidXRlKGF0dHJzLmdldFVSSShpKSwKKwkJCQkJICAgYXR0cnMuZ2V0TG9jYWxOYW1lKGkpLAorCQkJCQkgICBhdHRycy5nZXRRTmFtZShpKSwKKwkJCQkJICAgYXR0cnMuZ2V0VHlwZShpKSwKKwkJCQkJICAgYXR0cnMuZ2V0VmFsdWUoaSkpOworCQl9CisJICAgIH0KKwl9CisgICAgfQorCisKKyAgICAvKgorICAgICAqIFNlY29uZC1wYXNzIFZpc2l0b3IgcmVzcG9uc2libGUgZm9yIHByb2R1Y2luZyBYTUwgdmlldyBhbmQgYXNzaWduaW5nCisgICAgICogZWFjaCBlbGVtZW50IGEgdW5pcXVlIGpzcDppZCBhdHRyaWJ1dGUuCisgICAgICovCisgICAgc3RhdGljIGNsYXNzIFNlY29uZFBhc3NWaXNpdG9yIGV4dGVuZHMgTm9kZS5WaXNpdG9yCisgICAgICAgIAlpbXBsZW1lbnRzIFRhZ0NvbnN0YW50cyB7CisKKwlwcml2YXRlIE5vZGUuUm9vdCByb290OworCXByaXZhdGUgU3RyaW5nQnVmZmVyIGJ1ZjsKKwlwcml2YXRlIENvbXBpbGVyIGNvbXBpbGVyOworCXByaXZhdGUgU3RyaW5nIGpzcElkUHJlZml4OworCXByaXZhdGUgYm9vbGVhbiByZXNldERlZmF1bHROUyA9IGZhbHNlOworCisJLy8gQ3VycmVudCB2YWx1ZSBvZiBqc3A6aWQgYXR0cmlidXRlCisJcHJpdmF0ZSBpbnQganNwSWQ7CisKKwkvKgorCSAqIENvbnN0cnVjdG9yCisJICovCisJcHVibGljIFNlY29uZFBhc3NWaXNpdG9yKE5vZGUuUm9vdCByb290LCBTdHJpbmdCdWZmZXIgYnVmLAorCQkJCSBDb21waWxlciBjb21waWxlciwgU3RyaW5nIGpzcElkUHJlZml4KSB7CisJICAgIHRoaXMucm9vdCA9IHJvb3Q7CisJICAgIHRoaXMuYnVmID0gYnVmOworCSAgICB0aGlzLmNvbXBpbGVyID0gY29tcGlsZXI7CisJICAgIHRoaXMuanNwSWRQcmVmaXggPSBqc3BJZFByZWZpeDsKKwl9CisKKwkvKgorCSAqIFZpc2l0cyByb290IG5vZGUuCisJICovCisJcHVibGljIHZvaWQgdmlzaXQoTm9kZS5Sb290IG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCSAgICBpZiAobiA9PSB0aGlzLnJvb3QpIHsKKwkJLy8gdG9wLWxldmVsIHBhZ2UKKwkJYXBwZW5kWG1sUHJvbG9nKCk7CisJCWFwcGVuZFRhZyhuKTsKKwkgICAgfSBlbHNlIHsKKwkJYm9vbGVhbiByZXNldERlZmF1bHROU1NhdmUgPSByZXNldERlZmF1bHROUzsKKwkJaWYgKG4uaXNYbWxTeW50YXgoKSkgeworCQkgICAgcmVzZXREZWZhdWx0TlMgPSB0cnVlOworCQl9CisJCXZpc2l0Qm9keShuKTsKKwkJcmVzZXREZWZhdWx0TlMgPSByZXNldERlZmF1bHROU1NhdmU7CisJICAgIH0KKwl9CisKKwkvKgorCSAqIFZpc2l0cyBqc3A6cm9vdCBlbGVtZW50IG9mIEpTUCBwYWdlIGluIFhNTCBzeW50YXguCisJICoKKwkgKiBBbnkgbmVzdGVkIGpzcDpyb290IGVsZW1lbnRzIChmcm9tIHBhZ2VzIGluY2x1ZGVkIHZpYSBhbgorCSAqIGluY2x1ZGUgZGlyZWN0aXZlKSBhcmUgaWdub3JlZC4KKwkgKi8KKwlwdWJsaWMgdm9pZCB2aXNpdChOb2RlLkpzcFJvb3QgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJICAgIHZpc2l0Qm9keShuKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB2aXNpdChOb2RlLlBhZ2VEaXJlY3RpdmUgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJICAgIGFwcGVuZFBhZ2VEaXJlY3RpdmUobik7CisJfQorCisJcHVibGljIHZvaWQgdmlzaXQoTm9kZS5JbmNsdWRlRGlyZWN0aXZlIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCSAgICAvLyBleHBhbmQgaW4gcGxhY2UKKwkgICAgdmlzaXRCb2R5KG4pOworCX0KKworCXB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuQ29tbWVudCBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwkgICAgLy8gQ29tbWVudHMgYXJlIGlnbm9yZWQgaW4gWE1MIHZpZXcKKwl9CisKKwlwdWJsaWMgdm9pZCB2aXNpdChOb2RlLkRlY2xhcmF0aW9uIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCSAgICBhcHBlbmRUYWcobik7CisJfQorCisJcHVibGljIHZvaWQgdmlzaXQoTm9kZS5FeHByZXNzaW9uIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCSAgICBhcHBlbmRUYWcobik7CisJfQorCisJcHVibGljIHZvaWQgdmlzaXQoTm9kZS5TY3JpcHRsZXQgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJICAgIGFwcGVuZFRhZyhuKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB2aXNpdChOb2RlLkpzcEVsZW1lbnQgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJICAgIGFwcGVuZFRhZyhuKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB2aXNpdChOb2RlLkVMRXhwcmVzc2lvbiBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwkgICAgaWYgKCFuLmdldFJvb3QoKS5pc1htbFN5bnRheCgpKSB7CisJCWJ1Zi5hcHBlbmQoIjwiKS5hcHBlbmQoSlNQX1RFWFRfQUNUSU9OKTsKKwkJYnVmLmFwcGVuZCgiICIpOworCSAgICAgICAgYnVmLmFwcGVuZChqc3BJZFByZWZpeCk7CisJCWJ1Zi5hcHBlbmQoIjppZD1cIiIpOworCQlidWYuYXBwZW5kKGpzcElkKyspLmFwcGVuZCgiXCI+Iik7CisJICAgIH0KKwkgICAgYnVmLmFwcGVuZCgiJHsiKTsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoSnNwVXRpbC5lc2NhcGVYbWwobi5nZXRUZXh0KCkpKTsKKwkgICAgYnVmLmFwcGVuZCgifSIpOworCSAgICBpZiAoIW4uZ2V0Um9vdCgpLmlzWG1sU3ludGF4KCkpIHsKKwkJYnVmLmFwcGVuZChKU1BfVEVYVF9BQ1RJT05fRU5EKTsKKwkgICAgfQorCSAgICBidWYuYXBwZW5kKCJcbiIpOworCX0KKworCXB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuSW5jbHVkZUFjdGlvbiBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwkgICAgYXBwZW5kVGFnKG4pOworCX0KKyAgICAKKwlwdWJsaWMgdm9pZCB2aXNpdChOb2RlLkZvcndhcmRBY3Rpb24gbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJICAgIGFwcGVuZFRhZyhuKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB2aXNpdChOb2RlLkdldFByb3BlcnR5IG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCSAgICBhcHBlbmRUYWcobik7CisJfQorCisJcHVibGljIHZvaWQgdmlzaXQoTm9kZS5TZXRQcm9wZXJ0eSBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwkgICAgYXBwZW5kVGFnKG4pOworCX0KKworCXB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuUGFyYW1BY3Rpb24gbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJICAgIGFwcGVuZFRhZyhuKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB2aXNpdChOb2RlLlBhcmFtc0FjdGlvbiBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwkgICAgYXBwZW5kVGFnKG4pOworCX0KKworCXB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuRmFsbEJhY2tBY3Rpb24gbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJICAgIGFwcGVuZFRhZyhuKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB2aXNpdChOb2RlLlVzZUJlYW4gbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJICAgIGFwcGVuZFRhZyhuKTsKKwl9CisJCisJcHVibGljIHZvaWQgdmlzaXQoTm9kZS5QbHVnSW4gbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJICAgIGFwcGVuZFRhZyhuKTsKKwl9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5OYW1lZEF0dHJpYnV0ZSBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGFwcGVuZFRhZyhuKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5Kc3BCb2R5IG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgYXBwZW5kVGFnKG4pOworICAgICAgICB9CisKKwlwdWJsaWMgdm9pZCB2aXNpdChOb2RlLkN1c3RvbVRhZyBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwkgICAgYm9vbGVhbiByZXNldERlZmF1bHROU1NhdmUgPSByZXNldERlZmF1bHROUzsKKwkgICAgYXBwZW5kVGFnKG4sIHJlc2V0RGVmYXVsdE5TKTsKKwkgICAgcmVzZXREZWZhdWx0TlMgPSByZXNldERlZmF1bHROU1NhdmU7CisJfQorCisJcHVibGljIHZvaWQgdmlzaXQoTm9kZS5VbmludGVycHJldGVkVGFnIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCSAgICBib29sZWFuIHJlc2V0RGVmYXVsdE5TU2F2ZSA9IHJlc2V0RGVmYXVsdE5TOworCSAgICBhcHBlbmRUYWcobiwgcmVzZXREZWZhdWx0TlMpOworCSAgICByZXNldERlZmF1bHROUyA9IHJlc2V0RGVmYXVsdE5TU2F2ZTsKKwl9CisKKwlwdWJsaWMgdm9pZCB2aXNpdChOb2RlLkpzcFRleHQgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJICAgIGFwcGVuZFRhZyhuKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB2aXNpdChOb2RlLkRvQm9keUFjdGlvbiBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwkgICAgYXBwZW5kVGFnKG4pOworCX0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLkludm9rZUFjdGlvbiBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwkgICAgYXBwZW5kVGFnKG4pOworCX0KKworCXB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuVGFnRGlyZWN0aXZlIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCSAgICBhcHBlbmRUYWdEaXJlY3RpdmUobik7CisJfQorCisJcHVibGljIHZvaWQgdmlzaXQoTm9kZS5BdHRyaWJ1dGVEaXJlY3RpdmUgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJICAgIGFwcGVuZFRhZyhuKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB2aXNpdChOb2RlLlZhcmlhYmxlRGlyZWN0aXZlIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCSAgICBhcHBlbmRUYWcobik7CisJfQorICAgICAgICAKKwlwdWJsaWMgdm9pZCB2aXNpdChOb2RlLlRlbXBsYXRlVGV4dCBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwkgICAgLyoKKwkgICAgICogSWYgdGhlIHRlbXBsYXRlIHRleHQgY2FtZSBmcm9tIGEgSlNQIHBhZ2Ugd3JpdHRlbiBpbiBKU1Agc3ludGF4LAorCSAgICAgKiBjcmVhdGUgYSBqc3A6dGV4dCBlbGVtZW50IGZvciBpdCAoSlNQIDUuMy4yKS4KKwkgICAgICovCisJICAgIGFwcGVuZFRleHQobi5nZXRUZXh0KCksICFuLmdldFJvb3QoKS5pc1htbFN5bnRheCgpKTsKKwl9CisKKwkvKgorCSAqIEFwcGVuZHMgdGhlIGdpdmVuIHRhZywgaW5jbHVkaW5nIGl0cyBib2R5LCB0byB0aGUgWE1MIHZpZXcuCisJICovCisJcHJpdmF0ZSB2b2lkIGFwcGVuZFRhZyhOb2RlIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCSAgICBhcHBlbmRUYWcobiwgZmFsc2UpOworCX0KKworCS8qCisJICogQXBwZW5kcyB0aGUgZ2l2ZW4gdGFnLCBpbmNsdWRpbmcgaXRzIGJvZHksIHRvIHRoZSBYTUwgdmlldywKKwkgKiBhbmQgb3B0aW9uYWxseSByZXNldCBkZWZhdWx0IG5hbWVzcGFjZSB0byAiIiwgaWYgbm9uZSBzcGVjaWZpZWQuCisJICovCisJcHJpdmF0ZSB2b2lkIGFwcGVuZFRhZyhOb2RlIG4sIGJvb2xlYW4gYWRkRGVmYXVsdE5TKQorCQl0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKworCSAgICBOb2RlLk5vZGVzIGJvZHkgPSBuLmdldEJvZHkoKTsKKwkgICAgU3RyaW5nIHRleHQgPSBuLmdldFRleHQoKTsKKworCSAgICBidWYuYXBwZW5kKCI8IikuYXBwZW5kKG4uZ2V0UU5hbWUoKSk7CisJICAgIGJ1Zi5hcHBlbmQoIlxuIik7CisKKwkgICAgcHJpbnRBdHRyaWJ1dGVzKG4sIGFkZERlZmF1bHROUyk7CisJICAgIGJ1Zi5hcHBlbmQoIiAgIikuYXBwZW5kKGpzcElkUHJlZml4KS5hcHBlbmQoIjppZCIpLmFwcGVuZCgiPVwiIik7CisJICAgIGJ1Zi5hcHBlbmQoanNwSWQrKykuYXBwZW5kKCJcIlxuIik7CisKKwkgICAgaWYgKFJPT1RfQUNUSU9OLmVxdWFscyhuLmdldExvY2FsTmFtZSgpKSB8fCBib2R5ICE9IG51bGwKKwkJICAgICAgICB8fCB0ZXh0ICE9IG51bGwpIHsKKwkJYnVmLmFwcGVuZCgiPlxuIik7CisJCWlmIChST09UX0FDVElPTi5lcXVhbHMobi5nZXRMb2NhbE5hbWUoKSkpIHsKKwkJICAgIGlmIChjb21waWxlci5nZXRDb21waWxhdGlvbkNvbnRleHQoKS5pc1RhZ0ZpbGUoKSkgeworCQkJYXBwZW5kVGFnRGlyZWN0aXZlKCk7CisJCSAgICB9IGVsc2UgeworCQkJYXBwZW5kUGFnZURpcmVjdGl2ZSgpOworCQkgICAgfQorCQl9CisJCWlmIChib2R5ICE9IG51bGwpIHsKKwkJICAgIGJvZHkudmlzaXQodGhpcyk7CisJCX0gZWxzZSB7CisJCSAgICBhcHBlbmRUZXh0KHRleHQsIGZhbHNlKTsKKwkJfQorCQlidWYuYXBwZW5kKCI8LyIgKyBuLmdldFFOYW1lKCkgKyAiPlxuIik7CisJICAgIH0gZWxzZSB7CisJCWJ1Zi5hcHBlbmQoIi8+XG4iKTsKKwkgICAgfQorCX0KKworCS8qCisJICogQXBwZW5kcyB0aGUgcGFnZSBkaXJlY3RpdmUgd2l0aCB0aGUgZ2l2ZW4gYXR0cmlidXRlcyB0byB0aGUgWE1MCisJICogdmlldy4KKwkgKgorCSAqIFNpbmNlIHRoZSBpbXBvcnQgYXR0cmlidXRlIG9mIHRoZSBwYWdlIGRpcmVjdGl2ZSBpcyB0aGUgb25seSBwYWdlCisJICogYXR0cmlidXRlIHRoYXQgaXMgYWxsb3dlZCB0byBhcHBlYXIgbXVsdGlwbGUgdGltZXMgd2l0aGluIHRoZSBzYW1lCisJICogZG9jdW1lbnQsIGFuZCBzaW5jZSBYTUwgYWxsb3dzIG9ubHkgc2luZ2xlLXZhbHVlIGF0dHJpYnV0ZXMsCisJICogdGhlIHZhbHVlcyBvZiBtdWx0aXBsZSBpbXBvcnQgYXR0cmlidXRlcyBtdXN0IGJlIGNvbWJpbmVkIGludG8gb25lLAorCSAqIHNlcGFyYXRlZCBieSBjb21tYS4KKwkgKgorCSAqIElmIHRoZSBnaXZlbiBwYWdlIGRpcmVjdGl2ZSBjb250YWlucyBqdXN0ICdjb250ZW50VHlwZScgYW5kL29yCisJICogJ3BhZ2VFbmNvZGluZycgYXR0cmlidXRlcywgd2UgaWdub3JlIGl0LCBhcyB3ZSd2ZSBhbHJlYWR5IGFwcGVuZGVkCisJICogYSBwYWdlIGRpcmVjdGl2ZSBjb250YWluaW5nIGp1c3QgdGhlc2UgdHdvIGF0dHJpYnV0ZXMuCisJICovCisJcHJpdmF0ZSB2b2lkIGFwcGVuZFBhZ2VEaXJlY3RpdmUoTm9kZS5QYWdlRGlyZWN0aXZlIG4pIHsKKwkgICAgYm9vbGVhbiBhcHBlbmQgPSBmYWxzZTsKKwkgICAgQXR0cmlidXRlcyBhdHRycyA9IG4uZ2V0QXR0cmlidXRlcygpOworCSAgICBpbnQgbGVuID0gKGF0dHJzID09IG51bGwpID8gMCA6IGF0dHJzLmdldExlbmd0aCgpOworCSAgICBmb3IgKGludCBpPTA7IGk8bGVuOyBpKyspIHsKKwkJU3RyaW5nIGF0dHJOYW1lID0gYXR0cnMuZ2V0UU5hbWUoaSk7CisJCWlmICghInBhZ2VFbmNvZGluZyIuZXF1YWxzKGF0dHJOYW1lKQorCQkgICAgICAgICYmICEiY29udGVudFR5cGUiLmVxdWFscyhhdHRyTmFtZSkpIHsKKwkJICAgIGFwcGVuZCA9IHRydWU7CisJCSAgICBicmVhazsKKwkJfQorCSAgICB9CisJICAgIGlmICghYXBwZW5kKSB7CisJCXJldHVybjsKKwkgICAgfQorCisJICAgIGJ1Zi5hcHBlbmQoIjwiKS5hcHBlbmQobi5nZXRRTmFtZSgpKTsKKwkgICAgYnVmLmFwcGVuZCgiXG4iKTsKKworCSAgICAvLyBhcHBlbmQganNwOmlkCisJICAgIGJ1Zi5hcHBlbmQoIiAgIikuYXBwZW5kKGpzcElkUHJlZml4KS5hcHBlbmQoIjppZCIpLmFwcGVuZCgiPVwiIik7CisJICAgIGJ1Zi5hcHBlbmQoanNwSWQrKykuYXBwZW5kKCJcIlxuIik7CisKKwkgICAgLy8gYXBwZW5kIHJlbWFpbmluZyBhdHRyaWJ1dGVzCisJICAgIGZvciAoaW50IGk9MDsgaTxsZW47IGkrKykgeworCQlTdHJpbmcgYXR0ck5hbWUgPSBhdHRycy5nZXRRTmFtZShpKTsKKwkJaWYgKCJpbXBvcnQiLmVxdWFscyhhdHRyTmFtZSkgfHwgImNvbnRlbnRUeXBlIi5lcXVhbHMoYXR0ck5hbWUpCisJCSAgICAgICAgfHwgInBhZ2VFbmNvZGluZyIuZXF1YWxzKGF0dHJOYW1lKSkgeworCQkgICAgLyoKKwkJICAgICAqIFBhZ2UgZGlyZWN0aXZlJ3MgJ2ltcG9ydCcgYXR0cmlidXRlIGlzIGNvbnNpZGVyZWQKKwkJICAgICAqIGZ1cnRoZXIgZG93biwgYW5kIGl0cyAncGFnZUVuY29kaW5nJyBhbmQgJ2NvbnRlbnRUeXBlJworCQkgICAgICogYXR0cmlidXRlcyBhcmUgaWdub3JlZCwgc2luY2Ugd2UndmUgYWxyZWFkeSBhcHBlbmRlZAorCQkgICAgICogYSBuZXcgcGFnZSBkaXJlY3RpdmUgY29udGFpbmluZyBqdXN0IHRoZXNlIHR3bworCQkgICAgICogYXR0cmlidXRlcworCQkgICAgICovCisJCSAgICBjb250aW51ZTsKKwkJfQorCQlTdHJpbmcgdmFsdWUgPSBhdHRycy5nZXRWYWx1ZShpKTsKKwkJYnVmLmFwcGVuZCgiICAiKS5hcHBlbmQoYXR0ck5hbWUpLmFwcGVuZCgiPVwiIik7CisJCWJ1Zi5hcHBlbmQoSnNwVXRpbC5nZXRFeHBySW5YbWwodmFsdWUpKS5hcHBlbmQoIlwiXG4iKTsKKwkgICAgfQorCSAgICBpZiAobi5nZXRJbXBvcnRzKCkuc2l6ZSgpID4gMCkgeworCQkvLyBDb25jYXRlbmF0ZSBuYW1lcyBvZiBpbXBvcnRlZCBjbGFzc2VzL3BhY2thZ2VzCisJCWJvb2xlYW4gZmlyc3QgPSB0cnVlOworCQlMaXN0SXRlcmF0b3IgaXRlciA9IG4uZ2V0SW1wb3J0cygpLmxpc3RJdGVyYXRvcigpOworCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKwkJICAgIGlmIChmaXJzdCkgeworCQkJZmlyc3QgPSBmYWxzZTsKKwkJCWJ1Zi5hcHBlbmQoIiAgaW1wb3J0PVwiIik7CisJCSAgICB9IGVsc2UgeworCQkJYnVmLmFwcGVuZCgiLCIpOworCQkgICAgfQorCQkgICAgYnVmLmFwcGVuZChKc3BVdGlsLmdldEV4cHJJblhtbCgoU3RyaW5nKSBpdGVyLm5leHQoKSkpOworCQl9CisJCWJ1Zi5hcHBlbmQoIlwiXG4iKTsKKwkgICAgfQorCSAgICBidWYuYXBwZW5kKCIvPlxuIik7CisJfQorCisJLyoKKwkgKiBBcHBlbmRzIGEgcGFnZSBkaXJlY3RpdmUgd2l0aCAncGFnZUVuY29kaW5nJyBhbmQgJ2NvbnRlbnRUeXBlJworCSAqIGF0dHJpYnV0ZXMuCisJICoKKwkgKiBUaGUgdmFsdWUgb2YgdGhlICdwYWdlRW5jb2RpbmcnIGF0dHJpYnV0ZSBpcyBoYXJkLWNvZGVkCisJICogdG8gVVRGLTgsIHdoZXJlYXMgdGhlIHZhbHVlIG9mIHRoZSAnY29udGVudFR5cGUnIGF0dHJpYnV0ZSwgd2hpY2gKKwkgKiBpcyBpZGVudGljYWwgdG8gd2hhdCB0aGUgY29udGFpbmVyIHdpbGwgcGFzcyB0bworCSAqIFNlcnZsZXRSZXNwb25zZS5zZXRDb250ZW50VHlwZSgpLCBpcyBkZXJpdmVkIGZyb20gdGhlIHBhZ2VJbmZvLgorCSAqLworCXByaXZhdGUgdm9pZCBhcHBlbmRQYWdlRGlyZWN0aXZlKCkgeworCSAgICBidWYuYXBwZW5kKCI8IikuYXBwZW5kKEpTUF9QQUdFX0RJUkVDVElWRV9BQ1RJT04pOworCSAgICBidWYuYXBwZW5kKCJcbiIpOworCisJICAgIC8vIGFwcGVuZCBqc3A6aWQKKwkgICAgYnVmLmFwcGVuZCgiICAiKS5hcHBlbmQoanNwSWRQcmVmaXgpLmFwcGVuZCgiOmlkIikuYXBwZW5kKCI9XCIiKTsKKwkgICAgYnVmLmFwcGVuZChqc3BJZCsrKS5hcHBlbmQoIlwiXG4iKTsKKwkgICAgYnVmLmFwcGVuZCgiICAiKS5hcHBlbmQoInBhZ2VFbmNvZGluZyIpLmFwcGVuZCgiPVwiVVRGLThcIlxuIik7CisJICAgIGJ1Zi5hcHBlbmQoIiAgIikuYXBwZW5kKCJjb250ZW50VHlwZSIpLmFwcGVuZCgiPVwiIik7CisJICAgIGJ1Zi5hcHBlbmQoY29tcGlsZXIuZ2V0UGFnZUluZm8oKS5nZXRDb250ZW50VHlwZSgpKS5hcHBlbmQoIlwiXG4iKTsKKwkgICAgYnVmLmFwcGVuZCgiLz5cbiIpOwkgICAgCisJfQorCisJLyoKKwkgKiBBcHBlbmRzIHRoZSB0YWcgZGlyZWN0aXZlIHdpdGggdGhlIGdpdmVuIGF0dHJpYnV0ZXMgdG8gdGhlIFhNTAorCSAqIHZpZXcuCisJICoKKwkgKiBJZiB0aGUgZ2l2ZW4gdGFnIGRpcmVjdGl2ZSBjb250YWlucyBqdXN0IGEgJ3BhZ2VFbmNvZGluZycKKwkgKiBhdHRyaWJ1dGVzLCB3ZSBpZ25vcmUgaXQsIGFzIHdlJ3ZlIGFscmVhZHkgYXBwZW5kZWQKKwkgKiBhIHRhZyBkaXJlY3RpdmUgY29udGFpbmluZyBqdXN0IHRoaXMgYXR0cmlidXRlcy4KKwkgKi8KKwlwcml2YXRlIHZvaWQgYXBwZW5kVGFnRGlyZWN0aXZlKE5vZGUuVGFnRGlyZWN0aXZlIG4pCisJICAgICAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKworCSAgICBib29sZWFuIGFwcGVuZCA9IGZhbHNlOworCSAgICBBdHRyaWJ1dGVzIGF0dHJzID0gbi5nZXRBdHRyaWJ1dGVzKCk7CisJICAgIGludCBsZW4gPSAoYXR0cnMgPT0gbnVsbCkgPyAwIDogYXR0cnMuZ2V0TGVuZ3RoKCk7CisJICAgIGZvciAoaW50IGk9MDsgaTxsZW47IGkrKykgeworCQlTdHJpbmcgYXR0ck5hbWUgPSBhdHRycy5nZXRRTmFtZShpKTsKKwkJaWYgKCEicGFnZUVuY29kaW5nIi5lcXVhbHMoYXR0ck5hbWUpKSB7CisJCSAgICBhcHBlbmQgPSB0cnVlOworCQkgICAgYnJlYWs7CisJCX0KKwkgICAgfQorCSAgICBpZiAoIWFwcGVuZCkgeworCQlyZXR1cm47CisJICAgIH0KKworCSAgICBhcHBlbmRUYWcobik7CisJfQorCisJLyoKKwkgKiBBcHBlbmRzIGEgdGFnIGRpcmVjdGl2ZSBjb250YWluaW5nIGEgc2luZ2xlICdwYWdlRW5jb2RpbmcnCisJICogYXR0cmlidXRlIHdob3NlIHZhbHVlIGlzIGhhcmQtY29kZWQgdG8gVVRGLTguCisJICovCisJcHJpdmF0ZSB2b2lkIGFwcGVuZFRhZ0RpcmVjdGl2ZSgpIHsKKwkgICAgYnVmLmFwcGVuZCgiPCIpLmFwcGVuZChKU1BfVEFHX0RJUkVDVElWRV9BQ1RJT04pOworCSAgICBidWYuYXBwZW5kKCJcbiIpOworCisJICAgIC8vIGFwcGVuZCBqc3A6aWQKKwkgICAgYnVmLmFwcGVuZCgiICAiKS5hcHBlbmQoanNwSWRQcmVmaXgpLmFwcGVuZCgiOmlkIikuYXBwZW5kKCI9XCIiKTsKKwkgICAgYnVmLmFwcGVuZChqc3BJZCsrKS5hcHBlbmQoIlwiXG4iKTsKKwkgICAgYnVmLmFwcGVuZCgiICAiKS5hcHBlbmQoInBhZ2VFbmNvZGluZyIpLmFwcGVuZCgiPVwiVVRGLThcIlxuIik7CisJICAgIGJ1Zi5hcHBlbmQoIi8+XG4iKTsJICAgIAorCX0KKworCXByaXZhdGUgdm9pZCBhcHBlbmRUZXh0KFN0cmluZyB0ZXh0LCBib29sZWFuIGNyZWF0ZUpzcFRleHRFbGVtZW50KSB7CisJICAgIGlmIChjcmVhdGVKc3BUZXh0RWxlbWVudCkgeworCQlidWYuYXBwZW5kKCI8IikuYXBwZW5kKEpTUF9URVhUX0FDVElPTik7CisJCWJ1Zi5hcHBlbmQoIlxuIik7CisKKwkJLy8gYXBwZW5kIGpzcDppZAorCQlidWYuYXBwZW5kKCIgICIpLmFwcGVuZChqc3BJZFByZWZpeCkuYXBwZW5kKCI6aWQiKS5hcHBlbmQoIj1cIiIpOworCQlidWYuYXBwZW5kKGpzcElkKyspLmFwcGVuZCgiXCJcbiIpOworCQlidWYuYXBwZW5kKCI+XG4iKTsKKworCQlhcHBlbmRDREFUQSh0ZXh0KTsKKwkJYnVmLmFwcGVuZChKU1BfVEVYVF9BQ1RJT05fRU5EKTsKKwkJYnVmLmFwcGVuZCgiXG4iKTsKKwkgICAgfSBlbHNlIHsKKwkJYXBwZW5kQ0RBVEEodGV4dCk7CisJICAgIH0KKwl9CisJCisJLyoKKwkgKiBBcHBlbmRzIHRoZSBnaXZlbiB0ZXh0IGFzIGEgQ0RBVEEgc2VjdGlvbiB0byB0aGUgWE1MIHZpZXcsIHVubGVzcworCSAqIHRoZSB0ZXh0IGhhcyBhbHJlYWR5IGJlZW4gbWFya2VkIGFzIENEQVRBLgorCSAqLworCXByaXZhdGUgdm9pZCBhcHBlbmRDREFUQShTdHJpbmcgdGV4dCkgeworCSAgICBidWYuYXBwZW5kKENEQVRBX1NUQVJUX1NFQ1RJT04pOworCSAgICBidWYuYXBwZW5kKGVzY2FwZUNEQVRBKHRleHQpKTsKKwkgICAgYnVmLmFwcGVuZChDREFUQV9FTkRfU0VDVElPTik7CisJfQorCisJLyoKKwkgKiBFc2NhcGVzIGFueSBvY2N1cnJlbmNlcyBvZiAiXV0+IiAoYnkgcmVwbGFjaW5nIHRoZW0gd2l0aCAiXV0mZ3Q7IikKKwkgKiB3aXRoaW4gdGhlIGdpdmVuIHRleHQsIHNvIGl0IGNhbiBiZSBpbmNsdWRlZCBpbiBhIENEQVRBIHNlY3Rpb24uCisJICovCisJcHJpdmF0ZSBTdHJpbmcgZXNjYXBlQ0RBVEEoU3RyaW5nIHRleHQpIHsKKyAgICAgICAgICAgIGlmKCB0ZXh0PT1udWxsICkgcmV0dXJuICIiOworCSAgICBpbnQgbGVuID0gdGV4dC5sZW5ndGgoKTsKKwkgICAgQ2hhckFycmF5V3JpdGVyIHJlc3VsdCA9IG5ldyBDaGFyQXJyYXlXcml0ZXIobGVuKTsKKwkgICAgZm9yIChpbnQgaT0wOyBpPGxlbjsgaSsrKSB7CisJCWlmICgoKGkrMikgPCBsZW4pCisJCSAgICAgICAgJiYgKHRleHQuY2hhckF0KGkpID09ICddJykKKwkJICAgICAgICAmJiAodGV4dC5jaGFyQXQoaSsxKSA9PSAnXScpCisJCSAgICAgICAgJiYgKHRleHQuY2hhckF0KGkrMikgPT0gJz4nKSkgeworCQkgICAgLy8gbWF0Y2ggZm91bmQKKwkJICAgIHJlc3VsdC53cml0ZSgnXScpOworCQkgICAgcmVzdWx0LndyaXRlKCddJyk7CisJCSAgICByZXN1bHQud3JpdGUoJyYnKTsKKwkJICAgIHJlc3VsdC53cml0ZSgnZycpOworCQkgICAgcmVzdWx0LndyaXRlKCd0Jyk7CisJCSAgICByZXN1bHQud3JpdGUoJzsnKTsKKwkJICAgIGkgKz0gMjsKKwkJfSBlbHNlIHsKKwkJICAgIHJlc3VsdC53cml0ZSh0ZXh0LmNoYXJBdChpKSk7CisJCX0KKwkgICAgfQorCSAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfQorCisJLyoKKwkgKiBBcHBlbmRzIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBnaXZlbiBOb2RlIHRvIHRoZSBYTUwgdmlldy4KKwkgKi8KKwlwcml2YXRlIHZvaWQgcHJpbnRBdHRyaWJ1dGVzKE5vZGUgbiwgYm9vbGVhbiBhZGREZWZhdWx0TlMpIHsKKworCSAgICAvKgorCSAgICAgKiBBcHBlbmQgInhtbG5zIiBhdHRyaWJ1dGVzIHRoYXQgcmVwcmVzZW50IHRhZyBsaWJyYXJpZXMKKwkgICAgICovCisJICAgIEF0dHJpYnV0ZXMgYXR0cnMgPSBuLmdldFRhZ2xpYkF0dHJpYnV0ZXMoKTsKKwkgICAgaW50IGxlbiA9IChhdHRycyA9PSBudWxsKSA/IDAgOiBhdHRycy5nZXRMZW5ndGgoKTsKKwkgICAgZm9yIChpbnQgaT0wOyBpPGxlbjsgaSsrKSB7CisJCVN0cmluZyBuYW1lID0gYXR0cnMuZ2V0UU5hbWUoaSk7CisJCVN0cmluZyB2YWx1ZSA9IGF0dHJzLmdldFZhbHVlKGkpOworCQlidWYuYXBwZW5kKCIgICIpLmFwcGVuZChuYW1lKS5hcHBlbmQoIj1cIiIpLmFwcGVuZCh2YWx1ZSkuYXBwZW5kKCJcIlxuIik7CisJICAgIH0KKworCSAgICAvKgorCSAgICAgKiBBcHBlbmQgInhtbG5zIiBhdHRyaWJ1dGVzIHRoYXQgZG8gbm90IHJlcHJlc2VudCB0YWcgbGlicmFyaWVzCisJICAgICAqLworCSAgICBhdHRycyA9IG4uZ2V0Tm9uVGFnbGliWG1sbnNBdHRyaWJ1dGVzKCk7CisJICAgIGxlbiA9IChhdHRycyA9PSBudWxsKSA/IDAgOiBhdHRycy5nZXRMZW5ndGgoKTsKKwkgICAgYm9vbGVhbiBkZWZhdWx0TlNTZWVuID0gZmFsc2U7CisJICAgIGZvciAoaW50IGk9MDsgaTxsZW47IGkrKykgeworCQlTdHJpbmcgbmFtZSA9IGF0dHJzLmdldFFOYW1lKGkpOworCQlTdHJpbmcgdmFsdWUgPSBhdHRycy5nZXRWYWx1ZShpKTsKKwkJYnVmLmFwcGVuZCgiICAiKS5hcHBlbmQobmFtZSkuYXBwZW5kKCI9XCIiKS5hcHBlbmQodmFsdWUpLmFwcGVuZCgiXCJcbiIpOworCQlkZWZhdWx0TlNTZWVuIHw9ICJ4bWxucyIuZXF1YWxzKG5hbWUpOworCSAgICB9CisJICAgIGlmIChhZGREZWZhdWx0TlMgJiYgIWRlZmF1bHROU1NlZW4pIHsKKwkJYnVmLmFwcGVuZCgiICB4bWxucz1cIlwiXG4iKTsKKwkgICAgfQorCSAgICByZXNldERlZmF1bHROUyA9IGZhbHNlOworCisJICAgIC8qCisJICAgICAqIEFwcGVuZCBhbGwgb3RoZXIgYXR0cmlidXRlcworCSAgICAgKi8KKwkgICAgYXR0cnMgPSBuLmdldEF0dHJpYnV0ZXMoKTsKKwkgICAgbGVuID0gKGF0dHJzID09IG51bGwpID8gMCA6IGF0dHJzLmdldExlbmd0aCgpOworCSAgICBmb3IgKGludCBpPTA7IGk8bGVuOyBpKyspIHsKKwkJU3RyaW5nIG5hbWUgPSBhdHRycy5nZXRRTmFtZShpKTsKKwkJU3RyaW5nIHZhbHVlID0gYXR0cnMuZ2V0VmFsdWUoaSk7CisJCWJ1Zi5hcHBlbmQoIiAgIikuYXBwZW5kKG5hbWUpLmFwcGVuZCgiPVwiIik7CisJCWJ1Zi5hcHBlbmQoSnNwVXRpbC5nZXRFeHBySW5YbWwodmFsdWUpKS5hcHBlbmQoIlwiXG4iKTsKKwkgICAgfQorCX0KKworCS8qCisJICogQXBwZW5kcyBYTUwgcHJvbG9nIHdpdGggZW5jb2RpbmcgZGVjbGFyYXRpb24uCisJICovCisJcHJpdmF0ZSB2b2lkIGFwcGVuZFhtbFByb2xvZygpIHsKKwkgICAgYnVmLmFwcGVuZCgiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIiA/PlxuIik7CisJfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL2NvbXBpbGVyL1BhZ2VJbmZvLmphdmEgYi9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvUGFnZUluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjNlZmUyCi0tLSAvZGV2L251bGwKKysrIGIvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL2NvbXBpbGVyL1BhZ2VJbmZvLmphdmEKQEAgLTAsMCArMSw2MjggQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYXNwZXIuY29tcGlsZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLkphc3BlckV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnTGlicmFyeUluZm87CisKKy8qKgorICogQSByZXBvc2l0b3J5IGZvciB2YXJpb3VzIGluZm8gYWJvdXQgdGhlIHRyYW5zbGF0aW9uIHVuaXQgdW5kZXIgY29tcGlsYXRpb24uCisgKgorICogQGF1dGhvciBLaW4tbWFuIENodW5nCisgKi8KKworY2xhc3MgUGFnZUluZm8geworCisgICAgcHJpdmF0ZSBWZWN0b3IgaW1wb3J0czsKKyAgICBwcml2YXRlIFZlY3RvciBkZXBlbmRhbnRzOworCisgICAgcHJpdmF0ZSBCZWFuUmVwb3NpdG9yeSBiZWFuUmVwb3NpdG9yeTsKKyAgICBwcml2YXRlIEhhc2hNYXAgdGFnbGlic01hcDsKKyAgICBwcml2YXRlIEhhc2hNYXAganNwUHJlZml4TWFwcGVyOworICAgIHByaXZhdGUgSGFzaE1hcCB4bWxQcmVmaXhNYXBwZXI7CisgICAgcHJpdmF0ZSBIYXNoTWFwIG5vbkN1c3RvbVRhZ1ByZWZpeE1hcDsKKyAgICBwcml2YXRlIFN0cmluZyBqc3BGaWxlOworICAgIHByaXZhdGUgU3RyaW5nIGRlZmF1bHRMYW5ndWFnZSA9ICJqYXZhIjsKKyAgICBwcml2YXRlIFN0cmluZyBsYW5ndWFnZTsKKyAgICBwcml2YXRlIFN0cmluZyBkZWZhdWx0RXh0ZW5kcyA9IENvbnN0YW50cy5KU1BfU0VSVkxFVF9CQVNFOworICAgIHByaXZhdGUgU3RyaW5nIHh0ZW5kczsKKyAgICBwcml2YXRlIFN0cmluZyBjb250ZW50VHlwZSA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgc2Vzc2lvbjsKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNTZXNzaW9uID0gdHJ1ZTsKKyAgICBwcml2YXRlIFN0cmluZyBidWZmZXJWYWx1ZTsKKyAgICBwcml2YXRlIGludCBidWZmZXIgPSA4KjEwMjQ7ICAgIC8vIFhYWCBjb25maXJtCisgICAgcHJpdmF0ZSBTdHJpbmcgYXV0b0ZsdXNoOworICAgIHByaXZhdGUgYm9vbGVhbiBpc0F1dG9GbHVzaCA9IHRydWU7CisgICAgcHJpdmF0ZSBTdHJpbmcgaXNUaHJlYWRTYWZlVmFsdWU7CisgICAgcHJpdmF0ZSBib29sZWFuIGlzVGhyZWFkU2FmZSA9IHRydWU7CisgICAgcHJpdmF0ZSBTdHJpbmcgaXNFcnJvclBhZ2VWYWx1ZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNFcnJvclBhZ2UgPSBmYWxzZTsKKyAgICBwcml2YXRlIFN0cmluZyBlcnJvclBhZ2UgPSBudWxsOworICAgIHByaXZhdGUgU3RyaW5nIGluZm87CisKKyAgICBwcml2YXRlIGJvb2xlYW4gc2NyaXB0bGVzcyA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBzY3JpcHRpbmdJbnZhbGlkID0gZmFsc2U7CisgICAgcHJpdmF0ZSBTdHJpbmcgaXNFTElnbm9yZWRWYWx1ZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNFTElnbm9yZWQgPSBmYWxzZTsKKyAgICBwcml2YXRlIFN0cmluZyBvbWl0WG1sRGVjbCA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgZG9jdHlwZU5hbWUgPSBudWxsOworICAgIHByaXZhdGUgU3RyaW5nIGRvY3R5cGVQdWJsaWMgPSBudWxsOworICAgIHByaXZhdGUgU3RyaW5nIGRvY3R5cGVTeXN0ZW0gPSBudWxsOworCisgICAgcHJpdmF0ZSBib29sZWFuIGlzSnNwUHJlZml4SGlqYWNrZWQ7CisKKyAgICAvLyBTZXQgb2YgYWxsIGVsZW1lbnQgYW5kIGF0dHJpYnV0ZSBwcmVmaXhlcyB1c2VkIGluIHRoaXMgdHJhbnNsYXRpb24gdW5pdAorICAgIHByaXZhdGUgSGFzaFNldCBwcmVmaXhlczsKKworICAgIHByaXZhdGUgYm9vbGVhbiBoYXNKc3BSb290ID0gZmFsc2U7CisgICAgcHJpdmF0ZSBWZWN0b3IgaW5jbHVkZVByZWx1ZGU7CisgICAgcHJpdmF0ZSBWZWN0b3IgaW5jbHVkZUNvZGE7CisgICAgcHJpdmF0ZSBWZWN0b3IgcGx1Z2luRGNsczsgICAgICAvLyBJZCdzIGZvciB0YWdwbHVnaW4gZGVjbGFyYXRpb25zCisKKworICAgIFBhZ2VJbmZvKEJlYW5SZXBvc2l0b3J5IGJlYW5SZXBvc2l0b3J5LCBTdHJpbmcganNwRmlsZSkgeworCisgICAgICAgIHRoaXMuanNwRmlsZSA9IGpzcEZpbGU7CisgICAgICAgIHRoaXMuYmVhblJlcG9zaXRvcnkgPSBiZWFuUmVwb3NpdG9yeTsKKyAgICAgICAgdGhpcy50YWdsaWJzTWFwID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgdGhpcy5qc3BQcmVmaXhNYXBwZXIgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICB0aGlzLnhtbFByZWZpeE1hcHBlciA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgIHRoaXMubm9uQ3VzdG9tVGFnUHJlZml4TWFwID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgdGhpcy5pbXBvcnRzID0gbmV3IFZlY3RvcigpOworICAgICAgICB0aGlzLmRlcGVuZGFudHMgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIHRoaXMuaW5jbHVkZVByZWx1ZGUgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIHRoaXMuaW5jbHVkZUNvZGEgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIHRoaXMucGx1Z2luRGNscyA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgdGhpcy5wcmVmaXhlcyA9IG5ldyBIYXNoU2V0KCk7CisKKyAgICAgICAgLy8gRW50ZXIgc3RhbmRhcmQgaW1wb3J0cworICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgQ29uc3RhbnRzLlNUQU5EQVJEX0lNUE9SVFMubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBpbXBvcnRzLmFkZChDb25zdGFudHMuU1RBTkRBUkRfSU1QT1JUU1tpXSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgaWYgdGhlIHBsdWdpbiBJRCBoYXMgYmVlbiBwcmV2aW91c2x5IGRlY2xhcmVkLiAgTWFrZSBhIG5vdAorICAgICAqIHRoYXQgdGhpcyBJZCBpcyBub3cgZGVjbGFyZWQuCisgICAgICogQHJldHVybiB0cnVlIGlmIElkIGhhcyBiZWVuIGRlY2xhcmVkLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzUGx1Z2luRGVjbGFyZWQoU3RyaW5nIGlkKSB7CisgICAgICAgIGlmIChwbHVnaW5EY2xzLmNvbnRhaW5zKGlkKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBwbHVnaW5EY2xzLmFkZChpZCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRJbXBvcnRzKExpc3QgaW1wb3J0cykgeworICAgICAgICB0aGlzLmltcG9ydHMuYWRkQWxsKGltcG9ydHMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZEltcG9ydChTdHJpbmcgaW1wKSB7CisgICAgICAgIHRoaXMuaW1wb3J0cy5hZGQoaW1wKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdCBnZXRJbXBvcnRzKCkgeworICAgICAgICByZXR1cm4gaW1wb3J0czsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEpzcEZpbGUoKSB7CisgICAgICAgIHJldHVybiBqc3BGaWxlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZERlcGVuZGFudChTdHJpbmcgZCkgeworICAgICAgICBpZiAoIWRlcGVuZGFudHMuY29udGFpbnMoZCkgJiYgIWpzcEZpbGUuZXF1YWxzKGQpKQorICAgICAgICAgICAgICAgIGRlcGVuZGFudHMuYWRkKGQpOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0IGdldERlcGVuZGFudHMoKSB7CisgICAgICAgIHJldHVybiBkZXBlbmRhbnRzOworICAgIH0KKworICAgIHB1YmxpYyBCZWFuUmVwb3NpdG9yeSBnZXRCZWFuUmVwb3NpdG9yeSgpIHsKKyAgICAgICAgcmV0dXJuIGJlYW5SZXBvc2l0b3J5OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFNjcmlwdGxlc3MoYm9vbGVhbiBzKSB7CisgICAgICAgIHNjcmlwdGxlc3MgPSBzOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzU2NyaXB0bGVzcygpIHsKKyAgICAgICAgcmV0dXJuIHNjcmlwdGxlc3M7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U2NyaXB0aW5nSW52YWxpZChib29sZWFuIHMpIHsKKyAgICAgICAgc2NyaXB0aW5nSW52YWxpZCA9IHM7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNTY3JpcHRpbmdJbnZhbGlkKCkgeworICAgICAgICByZXR1cm4gc2NyaXB0aW5nSW52YWxpZDsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdCBnZXRJbmNsdWRlUHJlbHVkZSgpIHsKKyAgICAgICAgcmV0dXJuIGluY2x1ZGVQcmVsdWRlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEluY2x1ZGVQcmVsdWRlKFZlY3RvciBwcmVsdWRlKSB7CisgICAgICAgIGluY2x1ZGVQcmVsdWRlID0gcHJlbHVkZTsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdCBnZXRJbmNsdWRlQ29kYSgpIHsKKyAgICAgICAgcmV0dXJuIGluY2x1ZGVDb2RhOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEluY2x1ZGVDb2RhKFZlY3RvciBjb2RhKSB7CisgICAgICAgIGluY2x1ZGVDb2RhID0gY29kYTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRIYXNKc3BSb290KGJvb2xlYW4gcykgeworICAgICAgICBoYXNKc3BSb290ID0gczsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNKc3BSb290KCkgeworICAgICAgICByZXR1cm4gaGFzSnNwUm9vdDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE9taXRYbWxEZWNsKCkgeworICAgICAgICByZXR1cm4gb21pdFhtbERlY2w7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0T21pdFhtbERlY2woU3RyaW5nIG9taXQpIHsKKyAgICAgICAgb21pdFhtbERlY2wgPSBvbWl0OworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RG9jdHlwZU5hbWUoKSB7CisgICAgICAgIHJldHVybiBkb2N0eXBlTmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREb2N0eXBlTmFtZShTdHJpbmcgZG9jdHlwZU5hbWUpIHsKKyAgICAgICAgdGhpcy5kb2N0eXBlTmFtZSA9IGRvY3R5cGVOYW1lOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RG9jdHlwZVN5c3RlbSgpIHsKKyAgICAgICAgcmV0dXJuIGRvY3R5cGVTeXN0ZW07CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RG9jdHlwZVN5c3RlbShTdHJpbmcgZG9jdHlwZVN5c3RlbSkgeworICAgICAgICB0aGlzLmRvY3R5cGVTeXN0ZW0gPSBkb2N0eXBlU3lzdGVtOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RG9jdHlwZVB1YmxpYygpIHsKKyAgICAgICAgcmV0dXJuIGRvY3R5cGVQdWJsaWM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RG9jdHlwZVB1YmxpYyhTdHJpbmcgZG9jdHlwZVB1YmxpYykgeworICAgICAgICB0aGlzLmRvY3R5cGVQdWJsaWMgPSBkb2N0eXBlUHVibGljOworICAgIH0KKworICAgIC8qIFRhZyBsaWJyYXJ5IGFuZCBYTUwgbmFtZXNwYWNlIG1hbmFnZW1lbnQgbWV0aG9kcyAqLworCisgICAgcHVibGljIHZvaWQgc2V0SXNKc3BQcmVmaXhIaWphY2tlZChib29sZWFuIGlzSGlqYWNrZWQpIHsKKyAgICAgICAgaXNKc3BQcmVmaXhIaWphY2tlZCA9IGlzSGlqYWNrZWQ7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNKc3BQcmVmaXhIaWphY2tlZCgpIHsKKyAgICAgICAgcmV0dXJuIGlzSnNwUHJlZml4SGlqYWNrZWQ7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBBZGRzIHRoZSBnaXZlbiBwcmVmaXggdG8gdGhlIHNldCBvZiBwcmVmaXhlcyBvZiB0aGlzIHRyYW5zbGF0aW9uIHVuaXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJlZml4IFRoZSBwcmVmaXggdG8gYWRkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkUHJlZml4KFN0cmluZyBwcmVmaXgpIHsKKyAgICAgICAgcHJlZml4ZXMuYWRkKHByZWZpeCk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDaGVja3MgdG8gc2VlIGlmIHRoaXMgdHJhbnNsYXRpb24gdW5pdCBjb250YWlucyB0aGUgZ2l2ZW4gcHJlZml4LgorICAgICAqCisgICAgICogQHBhcmFtIHByZWZpeCBUaGUgcHJlZml4IHRvIGNoZWNrCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyB0cmFuc2xhdGlvbiB1bml0IGNvbnRhaW5zIHRoZSBnaXZlbiBwcmVmaXgsIGZhbHNlCisgICAgICogb3RoZXJ3aXNlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNQcmVmaXgoU3RyaW5nIHByZWZpeCkgeworICAgICAgICByZXR1cm4gcHJlZml4ZXMuY29udGFpbnMocHJlZml4KTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIE1hcHMgdGhlIGdpdmVuIFVSSSB0byB0aGUgZ2l2ZW4gdGFnIGxpYnJhcnkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJpIFRoZSBVUkkgdG8gbWFwCisgICAgICogQHBhcmFtIGluZm8gVGhlIHRhZyBsaWJyYXJ5IHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gVVJJCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkVGFnbGliKFN0cmluZyB1cmksIFRhZ0xpYnJhcnlJbmZvIGluZm8pIHsKKyAgICAgICAgdGFnbGlic01hcC5wdXQodXJpLCBpbmZvKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIEdldHMgdGhlIHRhZyBsaWJyYXJ5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIFVSSS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGFnIGxpYnJhcnkgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gVVJJCisgICAgICovCisgICAgcHVibGljIFRhZ0xpYnJhcnlJbmZvIGdldFRhZ2xpYihTdHJpbmcgdXJpKSB7CisgICAgICAgIHJldHVybiAoVGFnTGlicmFyeUluZm8pIHRhZ2xpYnNNYXAuZ2V0KHVyaSk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBHZXRzIHRoZSBjb2xsZWN0aW9uIG9mIHRhZyBsaWJyYXJpZXMgdGhhdCBhcmUgYXNzb2NpYXRlZCB3aXRoIGEgVVJJCisgICAgICoKKyAgICAgKiBAcmV0dXJuIENvbGxlY3Rpb24gb2YgdGFnIGxpYnJhcmllcyB0aGF0IGFyZSBhc3NvY2lhdGVkIHdpdGggYSBVUkkKKyAgICAgKi8KKyAgICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRUYWdsaWJzKCkgeworICAgICAgICByZXR1cm4gdGFnbGlic01hcC52YWx1ZXMoKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIENoZWNrcyB0byBzZWUgaWYgdGhlIGdpdmVuIFVSSSBpcyBtYXBwZWQgdG8gYSB0YWcgbGlicmFyeS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmkgVGhlIFVSSSB0byBtYXAKKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gVVJJIGlzIG1hcHBlZCB0byBhIHRhZyBsaWJyYXJ5LCBmYWxzZQorICAgICAqIG90aGVyd2lzZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc1RhZ2xpYihTdHJpbmcgdXJpKSB7CisgICAgICAgIHJldHVybiB0YWdsaWJzTWFwLmNvbnRhaW5zS2V5KHVyaSk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBNYXBzIHRoZSBnaXZlbiBwcmVmaXggdG8gdGhlIGdpdmVuIFVSSS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcmVmaXggVGhlIHByZWZpeCB0byBtYXAKKyAgICAgKiBAcGFyYW0gdXJpIFRoZSBVUkkgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBwcmVmaXgKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRQcmVmaXhNYXBwaW5nKFN0cmluZyBwcmVmaXgsIFN0cmluZyB1cmkpIHsKKyAgICAgICAganNwUHJlZml4TWFwcGVyLnB1dChwcmVmaXgsIHVyaSk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBQdXNoZXMgdGhlIGdpdmVuIFVSSSBvbnRvIHRoZSBzdGFjayBvZiBVUklzIHRvIHdoaWNoIHRoZSBnaXZlbiBwcmVmaXgKKyAgICAgKiBpcyBtYXBwZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJlZml4IFRoZSBwcmVmaXggd2hvc2Ugc3RhY2sgb2YgVVJJcyBpcyB0byBiZSBwdXNoZWQKKyAgICAgKiBAcGFyYW0gdXJpIFRoZSBVUkkgdG8gYmUgcHVzaGVkIG9udG8gdGhlIHN0YWNrCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHVzaFByZWZpeE1hcHBpbmcoU3RyaW5nIHByZWZpeCwgU3RyaW5nIHVyaSkgeworICAgICAgICBMaW5rZWRMaXN0IHN0YWNrID0gKExpbmtlZExpc3QpIHhtbFByZWZpeE1hcHBlci5nZXQocHJlZml4KTsKKyAgICAgICAgaWYgKHN0YWNrID09IG51bGwpIHsKKyAgICAgICAgICAgIHN0YWNrID0gbmV3IExpbmtlZExpc3QoKTsKKyAgICAgICAgICAgIHhtbFByZWZpeE1hcHBlci5wdXQocHJlZml4LCBzdGFjayk7CisgICAgICAgIH0KKyAgICAgICAgc3RhY2suYWRkRmlyc3QodXJpKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFJlbW92ZXMgdGhlIFVSSSBhdCB0aGUgdG9wIG9mIHRoZSBzdGFjayBvZiBVUklzIHRvIHdoaWNoIHRoZSBnaXZlbgorICAgICAqIHByZWZpeCBpcyBtYXBwZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJlZml4IFRoZSBwcmVmaXggd2hvc2Ugc3RhY2sgb2YgVVJJcyBpcyB0byBiZSBwb3BwZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwb3BQcmVmaXhNYXBwaW5nKFN0cmluZyBwcmVmaXgpIHsKKyAgICAgICAgTGlua2VkTGlzdCBzdGFjayA9IChMaW5rZWRMaXN0KSB4bWxQcmVmaXhNYXBwZXIuZ2V0KHByZWZpeCk7CisgICAgICAgIGlmIChzdGFjayA9PSBudWxsIHx8IHN0YWNrLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAvLyBYWFggdGhyb3cgbmV3IEV4Y2VwdGlvbigiWFhYIik7CisgICAgICAgIH0KKyAgICAgICAgc3RhY2sucmVtb3ZlRmlyc3QoKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFJldHVybnMgdGhlIFVSSSB0byB3aGljaCB0aGUgZ2l2ZW4gcHJlZml4IG1hcHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJlZml4IFRoZSBwcmVmaXggd2hvc2UgVVJJIGlzIHNvdWdodAorICAgICAqCisgICAgICogQHJldHVybiBUaGUgVVJJIHRvIHdoaWNoIHRoZSBnaXZlbiBwcmVmaXggbWFwcworICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VVJJKFN0cmluZyBwcmVmaXgpIHsKKworICAgICAgICBTdHJpbmcgdXJpID0gbnVsbDsKKworICAgICAgICBMaW5rZWRMaXN0IHN0YWNrID0gKExpbmtlZExpc3QpIHhtbFByZWZpeE1hcHBlci5nZXQocHJlZml4KTsKKyAgICAgICAgaWYgKHN0YWNrID09IG51bGwgfHwgc3RhY2suc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIHVyaSA9IChTdHJpbmcpIGpzcFByZWZpeE1hcHBlci5nZXQocHJlZml4KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHVyaSA9IChTdHJpbmcpIHN0YWNrLmdldEZpcnN0KCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdXJpOworICAgIH0KKworCisgICAgLyogUGFnZS9UYWcgZGlyZWN0aXZlIGF0dHJpYnV0ZXMgKi8KKworICAgIC8qCisgICAgICogbGFuZ3VhZ2UKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMYW5ndWFnZShTdHJpbmcgdmFsdWUsIE5vZGUgbiwgRXJyb3JEaXNwYXRjaGVyIGVyciwKKyAgICAgICAgICAgICAgICBib29sZWFuIHBhZ2VkaXIpCisgICAgICAgIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCisgICAgICAgIGlmICghImphdmEiLmVxdWFsc0lnbm9yZUNhc2UodmFsdWUpKSB7CisgICAgICAgICAgICBpZiAocGFnZWRpcikKKyAgICAgICAgICAgICAgICBlcnIuanNwRXJyb3IobiwgImpzcC5lcnJvci5wYWdlLmxhbmd1YWdlLm5vbmphdmEiKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBlcnIuanNwRXJyb3IobiwgImpzcC5lcnJvci50YWcubGFuZ3VhZ2Uubm9uamF2YSIpOworICAgICAgICB9CisKKyAgICAgICAgbGFuZ3VhZ2UgPSB2YWx1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldExhbmd1YWdlKGJvb2xlYW4gdXNlRGVmYXVsdCkgeworICAgICAgICByZXR1cm4gKGxhbmd1YWdlID09IG51bGwgJiYgdXNlRGVmYXVsdCA/IGRlZmF1bHRMYW5ndWFnZSA6IGxhbmd1YWdlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldExhbmd1YWdlKCkgeworICAgICAgICByZXR1cm4gZ2V0TGFuZ3VhZ2UodHJ1ZSk7CisgICAgfQorCisKKyAgICAvKgorICAgICAqIGV4dGVuZHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFeHRlbmRzKFN0cmluZyB2YWx1ZSwgTm9kZS5QYWdlRGlyZWN0aXZlIG4pIHsKKworICAgICAgICB4dGVuZHMgPSB2YWx1ZTsKKworICAgICAgICAvKgorICAgICAgICAgKiBJZiBwYWdlIHN1cGVyY2xhc3MgaXMgdG9wIGxldmVsIGNsYXNzIChpLmUuIG5vdCBpbiBhIHBhY2thZ2UpCisgICAgICAgICAqIGV4cGxpY2l0bHkgaW1wb3J0IGl0LiBJZiB0aGlzIGlzIG5vdCBkb25lLCB0aGUgY29tcGlsZXIgd2lsbCBhc3N1bWUKKyAgICAgICAgICogdGhlIGV4dGVuZGVkIGNsYXNzIGlzIGluIHRoZSBzYW1lIHBrZyBhcyB0aGUgZ2VuZXJhdGVkIHNlcnZsZXQuCisgICAgICAgICAqLworICAgICAgICBpZiAodmFsdWUuaW5kZXhPZignLicpIDwgMCkKKyAgICAgICAgICAgIG4uYWRkSW1wb3J0KHZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ2V4dGVuZHMnIHBhZ2UgZGlyZWN0aXZlIGF0dHJpYnV0ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1c2VEZWZhdWx0IFRSVUUgaWYgdGhlIGRlZmF1bHQKKyAgICAgKiAob3JnLmFwYWNoZS5qYXNwZXIucnVudGltZS5IdHRwSnNwQmFzZSkgc2hvdWxkIGJlIHJldHVybmVkIGlmIHRoaXMKKyAgICAgKiBhdHRyaWJ1dGUgaGFzIG5vdCBiZWVuIHNldCwgRkFMU0Ugb3RoZXJ3aXNlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgJ2V4dGVuZHMnIHBhZ2UgZGlyZWN0aXZlIGF0dHJpYnV0ZSwgb3IgdGhlCisgICAgICogZGVmYXVsdCAob3JnLmFwYWNoZS5qYXNwZXIucnVudGltZS5IdHRwSnNwQmFzZSkgaWYgdGhpcyBhdHRyaWJ1dGUgaGFzCisgICAgICogbm90IGJlZW4gc2V0IGFuZCB1c2VEZWZhdWx0IGlzIFRSVUUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEV4dGVuZHMoYm9vbGVhbiB1c2VEZWZhdWx0KSB7CisgICAgICAgIHJldHVybiAoeHRlbmRzID09IG51bGwgJiYgdXNlRGVmYXVsdCA/IGRlZmF1bHRFeHRlbmRzIDogeHRlbmRzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ2V4dGVuZHMnIHBhZ2UgZGlyZWN0aXZlIGF0dHJpYnV0ZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSAnZXh0ZW5kcycgcGFnZSBkaXJlY3RpdmUgYXR0cmlidXRlLCBvciB0aGUKKyAgICAgKiBkZWZhdWx0IChvcmcuYXBhY2hlLmphc3Blci5ydW50aW1lLkh0dHBKc3BCYXNlKSBpZiB0aGlzIGF0dHJpYnV0ZSBoYXMKKyAgICAgKiBub3QgYmVlbiBzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEV4dGVuZHMoKSB7CisgICAgICAgIHJldHVybiBnZXRFeHRlbmRzKHRydWUpOworICAgIH0KKworCisgICAgLyoKKyAgICAgKiBjb250ZW50VHlwZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbnRlbnRUeXBlKFN0cmluZyB2YWx1ZSkgeworICAgICAgICBjb250ZW50VHlwZSA9IHZhbHVlOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGUoKSB7CisgICAgICAgIHJldHVybiBjb250ZW50VHlwZTsKKyAgICB9CisKKworICAgIC8qCisgICAgICogYnVmZmVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QnVmZmVyVmFsdWUoU3RyaW5nIHZhbHVlLCBOb2RlIG4sIEVycm9yRGlzcGF0Y2hlciBlcnIpCisgICAgICAgIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCisgICAgICAgIGlmICgibm9uZSIuZXF1YWxzSWdub3JlQ2FzZSh2YWx1ZSkpCisgICAgICAgICAgICBidWZmZXIgPSAwOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsIHx8ICF2YWx1ZS5lbmRzV2l0aCgia2IiKSkKKyAgICAgICAgICAgICAgICBlcnIuanNwRXJyb3IobiwgImpzcC5lcnJvci5wYWdlLmludmFsaWQuYnVmZmVyIik7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIEludGVnZXIgayA9IG5ldyBJbnRlZ2VyKHZhbHVlLnN1YnN0cmluZygwLCB2YWx1ZS5sZW5ndGgoKS0yKSk7CisgICAgICAgICAgICAgICAgYnVmZmVyID0gay5pbnRWYWx1ZSgpICogMTAyNDsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKG4sICJqc3AuZXJyb3IucGFnZS5pbnZhbGlkLmJ1ZmZlciIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgYnVmZmVyVmFsdWUgPSB2YWx1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEJ1ZmZlclZhbHVlKCkgeworICAgICAgICByZXR1cm4gYnVmZmVyVmFsdWU7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRCdWZmZXIoKSB7CisgICAgICAgIHJldHVybiBidWZmZXI7CisgICAgfQorCisKKyAgICAvKgorICAgICAqIHNlc3Npb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTZXNzaW9uKFN0cmluZyB2YWx1ZSwgTm9kZSBuLCBFcnJvckRpc3BhdGNoZXIgZXJyKQorICAgICAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAoInRydWUiLmVxdWFsc0lnbm9yZUNhc2UodmFsdWUpKQorICAgICAgICAgICAgaXNTZXNzaW9uID0gdHJ1ZTsKKyAgICAgICAgZWxzZSBpZiAoImZhbHNlIi5lcXVhbHNJZ25vcmVDYXNlKHZhbHVlKSkKKyAgICAgICAgICAgIGlzU2Vzc2lvbiA9IGZhbHNlOworICAgICAgICBlbHNlCisgICAgICAgICAgICBlcnIuanNwRXJyb3IobiwgImpzcC5lcnJvci5wYWdlLmludmFsaWQuc2Vzc2lvbiIpOworCisgICAgICAgIHNlc3Npb24gPSB2YWx1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFNlc3Npb24oKSB7CisgICAgICAgIHJldHVybiBzZXNzaW9uOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzU2Vzc2lvbigpIHsKKyAgICAgICAgcmV0dXJuIGlzU2Vzc2lvbjsKKyAgICB9CisKKworICAgIC8qCisgICAgICogYXV0b0ZsdXNoCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QXV0b0ZsdXNoKFN0cmluZyB2YWx1ZSwgTm9kZSBuLCBFcnJvckRpc3BhdGNoZXIgZXJyKQorICAgICAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAoInRydWUiLmVxdWFsc0lnbm9yZUNhc2UodmFsdWUpKQorICAgICAgICAgICAgaXNBdXRvRmx1c2ggPSB0cnVlOworICAgICAgICBlbHNlIGlmICgiZmFsc2UiLmVxdWFsc0lnbm9yZUNhc2UodmFsdWUpKQorICAgICAgICAgICAgaXNBdXRvRmx1c2ggPSBmYWxzZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZXJyLmpzcEVycm9yKG4sICJqc3AuZXJyb3IuYXV0b0ZsdXNoLmludmFsaWQiKTsKKworICAgICAgICBhdXRvRmx1c2ggPSB2YWx1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEF1dG9GbHVzaCgpIHsKKyAgICAgICAgcmV0dXJuIGF1dG9GbHVzaDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0F1dG9GbHVzaCgpIHsKKyAgICAgICAgcmV0dXJuIGlzQXV0b0ZsdXNoOworICAgIH0KKworCisgICAgLyoKKyAgICAgKiBpc1RocmVhZFNhZmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJc1RocmVhZFNhZmUoU3RyaW5nIHZhbHVlLCBOb2RlIG4sIEVycm9yRGlzcGF0Y2hlciBlcnIpCisgICAgICAgIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCisgICAgICAgIGlmICgidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZSh2YWx1ZSkpCisgICAgICAgICAgICBpc1RocmVhZFNhZmUgPSB0cnVlOworICAgICAgICBlbHNlIGlmICgiZmFsc2UiLmVxdWFsc0lnbm9yZUNhc2UodmFsdWUpKQorICAgICAgICAgICAgaXNUaHJlYWRTYWZlID0gZmFsc2U7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVyci5qc3BFcnJvcihuLCAianNwLmVycm9yLnBhZ2UuaW52YWxpZC5pc3RocmVhZHNhZmUiKTsKKworICAgICAgICBpc1RocmVhZFNhZmVWYWx1ZSA9IHZhbHVlOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SXNUaHJlYWRTYWZlKCkgeworICAgICAgICByZXR1cm4gaXNUaHJlYWRTYWZlVmFsdWU7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNUaHJlYWRTYWZlKCkgeworICAgICAgICByZXR1cm4gaXNUaHJlYWRTYWZlOworICAgIH0KKworCisgICAgLyoKKyAgICAgKiBpbmZvCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SW5mbyhTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgaW5mbyA9IHZhbHVlOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5mbygpIHsKKyAgICAgICAgcmV0dXJuIGluZm87CisgICAgfQorCisKKyAgICAvKgorICAgICAqIGVycm9yUGFnZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEVycm9yUGFnZShTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgZXJyb3JQYWdlID0gdmFsdWU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRFcnJvclBhZ2UoKSB7CisgICAgICAgIHJldHVybiBlcnJvclBhZ2U7CisgICAgfQorCisKKyAgICAvKgorICAgICAqIGlzRXJyb3JQYWdlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SXNFcnJvclBhZ2UoU3RyaW5nIHZhbHVlLCBOb2RlIG4sIEVycm9yRGlzcGF0Y2hlciBlcnIpCisgICAgICAgIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCisgICAgICAgIGlmICgidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZSh2YWx1ZSkpCisgICAgICAgICAgICBpc0Vycm9yUGFnZSA9IHRydWU7CisgICAgICAgIGVsc2UgaWYgKCJmYWxzZSIuZXF1YWxzSWdub3JlQ2FzZSh2YWx1ZSkpCisgICAgICAgICAgICBpc0Vycm9yUGFnZSA9IGZhbHNlOworICAgICAgICBlbHNlCisgICAgICAgICAgICBlcnIuanNwRXJyb3IobiwgImpzcC5lcnJvci5wYWdlLmludmFsaWQuaXNlcnJvcnBhZ2UiKTsKKworICAgICAgICBpc0Vycm9yUGFnZVZhbHVlID0gdmFsdWU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRJc0Vycm9yUGFnZSgpIHsKKyAgICAgICAgcmV0dXJuIGlzRXJyb3JQYWdlVmFsdWU7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNFcnJvclBhZ2UoKSB7CisgICAgICAgIHJldHVybiBpc0Vycm9yUGFnZTsKKyAgICB9CisKKworICAgIC8qCisgICAgICogaXNFTElnbm9yZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJc0VMSWdub3JlZChTdHJpbmcgdmFsdWUsIE5vZGUgbiwgRXJyb3JEaXNwYXRjaGVyIGVyciwKKyAgICAgICAgICAgICAgICAgICBib29sZWFuIHBhZ2VkaXIpCisgICAgICAgIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCisgICAgICAgIGlmICgidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZSh2YWx1ZSkpCisgICAgICAgICAgICBpc0VMSWdub3JlZCA9IHRydWU7CisgICAgICAgIGVsc2UgaWYgKCJmYWxzZSIuZXF1YWxzSWdub3JlQ2FzZSh2YWx1ZSkpCisgICAgICAgICAgICBpc0VMSWdub3JlZCA9IGZhbHNlOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmIChwYWdlZGlyKQorICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcihuLCAianNwLmVycm9yLnBhZ2UuaW52YWxpZC5pc2VsaWdub3JlZCIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcihuLCAianNwLmVycm9yLnRhZy5pbnZhbGlkLmlzZWxpZ25vcmVkIik7CisgICAgICAgIH0KKworICAgICAgICBpc0VMSWdub3JlZFZhbHVlID0gdmFsdWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RUxJZ25vcmVkKGJvb2xlYW4gcykgeworICAgICAgICBpc0VMSWdub3JlZCA9IHM7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRJc0VMSWdub3JlZCgpIHsKKyAgICAgICAgcmV0dXJuIGlzRUxJZ25vcmVkVmFsdWU7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNFTElnbm9yZWQoKSB7CisgICAgICAgIHJldHVybiBpc0VMSWdub3JlZDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwdXROb25DdXN0b21UYWdQcmVmaXgoU3RyaW5nIHByZWZpeCwgTWFyayB3aGVyZSkgeworICAgICAgICBub25DdXN0b21UYWdQcmVmaXhNYXAucHV0KHByZWZpeCwgd2hlcmUpOworICAgIH0KKworICAgIHB1YmxpYyBNYXJrIGdldE5vbkN1c3RvbVRhZ1ByZWZpeChTdHJpbmcgcHJlZml4KSB7CisgICAgICAgIHJldHVybiAoTWFyaykgbm9uQ3VzdG9tVGFnUHJlZml4TWFwLmdldChwcmVmaXgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9QYXJzZXIuamF2YSBiL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9QYXJzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjcwYjEwCi0tLSAvZGV2L251bGwKKysrIGIvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL2NvbXBpbGVyL1BhcnNlci5qYXZhCkBAIC0wLDAgKzEsMTkxOSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmphc3Blci5jb21waWxlcjsKKworaW1wb3J0IGphdmEuaW8uQ2hhckFycmF5V3JpdGVyOworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnQXR0cmlidXRlSW5mbzsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnRmlsZUluZm87CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZ0luZm87CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZ0xpYnJhcnlJbmZvOworCitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLkphc3BlckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5Kc3BDb21waWxhdGlvbkNvbnRleHQ7CitpbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKK2ltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkF0dHJpYnV0ZXNJbXBsOworCisvKioKKyAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBhIHBhcnNlciBmb3IgYSBKU1AgcGFnZSAobm9uLXhtbCB2aWV3KS4KKyAqIEpTUCBwYWdlIGdyYW1tYXIgaXMgaW5jbHVkZWQgaGVyZSBmb3IgcmVmZXJlbmNlLiAgVGhlIHRva2VuICcjJworICogdGhhdCBhcHBlYXJzIGluIHRoZSBwcm9kdWN0aW9uIGluZGljYXRlcyB0aGUgY3VycmVudCBpbnB1dCB0b2tlbgorICogbG9jYXRpb24gaW4gdGhlIHByb2R1Y3Rpb24uCisgKiAKKyAqIEBhdXRob3IgS2luLW1hbiBDaHVuZworICogQGF1dGhvciBTaGF3biBCYXllcm4KKyAqIEBhdXRob3IgTWFyayBSb3RoCisgKi8KKworY2xhc3MgUGFyc2VyIGltcGxlbWVudHMgVGFnQ29uc3RhbnRzIHsKKworICAgIHByaXZhdGUgUGFyc2VyQ29udHJvbGxlciBwYXJzZXJDb250cm9sbGVyOworICAgIHByaXZhdGUgSnNwQ29tcGlsYXRpb25Db250ZXh0IGN0eHQ7CisgICAgcHJpdmF0ZSBKc3BSZWFkZXIgcmVhZGVyOworICAgIHByaXZhdGUgU3RyaW5nIGN1cnJlbnRGaWxlOworICAgIHByaXZhdGUgTWFyayBzdGFydDsKKyAgICBwcml2YXRlIEVycm9yRGlzcGF0Y2hlciBlcnI7CisgICAgcHJpdmF0ZSBpbnQgc2NyaXB0bGVzc0NvdW50OworICAgIHByaXZhdGUgYm9vbGVhbiBpc1RhZ0ZpbGU7CisgICAgcHJpdmF0ZSBib29sZWFuIGRpcmVjdGl2ZXNPbmx5OworICAgIHByaXZhdGUgVVJMIGphckZpbGVVcmw7CisgICAgcHJpdmF0ZSBQYWdlSW5mbyBwYWdlSW5mbzsKKworICAgIC8vIFZpcnR1YWwgYm9keSBjb250ZW50IHR5cGVzLCB0byBtYWtlIHBhcnNpbmcgYSBsaXR0bGUgZWFzaWVyLgorICAgIC8vIFRoZXNlIGFyZSBub3QgYWNjZXNzaWJsZSBmcm9tIG91dHNpZGUgdGhlIHBhcnNlci4KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQVhfQk9EWV9DT05URU5UX1BBUkFNID0gCisgICAgICAgICJKQVZBWF9CT0RZX0NPTlRFTlRfUEFSQU0iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBWF9CT0RZX0NPTlRFTlRfUExVR0lOID0gCisgICAgICAgICJKQVZBWF9CT0RZX0NPTlRFTlRfUExVR0lOIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQVhfQk9EWV9DT05URU5UX1RFTVBMQVRFX1RFWFQgPSAKKyAgICAgICAgIkpBVkFYX0JPRFlfQ09OVEVOVF9URU1QTEFURV9URVhUIjsKKworICAgIC8qKgorICAgICAqIFRoZSBjb25zdHJ1Y3RvcgorICAgICAqLworICAgIHByaXZhdGUgUGFyc2VyKFBhcnNlckNvbnRyb2xsZXIgcGMsIEpzcFJlYWRlciByZWFkZXIsIGJvb2xlYW4gaXNUYWdGaWxlLAorCQkgICBib29sZWFuIGRpcmVjdGl2ZXNPbmx5LCBVUkwgamFyRmlsZVVybCkgeworCXRoaXMucGFyc2VyQ29udHJvbGxlciA9IHBjOworCXRoaXMuY3R4dCA9IHBjLmdldEpzcENvbXBpbGF0aW9uQ29udGV4dCgpOworCXRoaXMucGFnZUluZm8gPSBwYy5nZXRDb21waWxlcigpLmdldFBhZ2VJbmZvKCk7CisJdGhpcy5lcnIgPSBwYy5nZXRDb21waWxlcigpLmdldEVycm9yRGlzcGF0Y2hlcigpOworCXRoaXMucmVhZGVyID0gcmVhZGVyOworCXRoaXMuY3VycmVudEZpbGUgPSByZWFkZXIubWFyaygpLmdldEZpbGUoKTsKKyAgICAgICAgdGhpcy5zY3JpcHRsZXNzQ291bnQgPSAwOworCXRoaXMuaXNUYWdGaWxlID0gaXNUYWdGaWxlOworCXRoaXMuZGlyZWN0aXZlc09ubHkgPSBkaXJlY3RpdmVzT25seTsKKwl0aGlzLmphckZpbGVVcmwgPSBqYXJGaWxlVXJsOworICAgICAgICBzdGFydCA9IHJlYWRlci5tYXJrKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIG1haW4gZW50cnkgZm9yIFBhcnNlcgorICAgICAqIAorICAgICAqIEBwYXJhbSBwYyBUaGUgUGFyc2VDb250cm9sbGVyLCB1c2UgZm9yIGdldHRpbmcgb3RoZXIgb2JqZWN0cyBpbiBjb21waWxlcgorICAgICAqCQkgYW5kIGZvciBwYXJzaW5nIGluY2x1ZGVkIHBhZ2VzCisgICAgICogQHBhcmFtIHJlYWRlciBUbyByZWFkIHRoZSBwYWdlCisgICAgICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IG5vZGUgdG8gdGhpcyBwYWdlLCBudWxsIGZvciB0b3AgbGV2ZWwgcGFnZQorICAgICAqIEByZXR1cm4gbGlzdCBvZiBub2RlcyByZXByZXNlbnRpbmcgdGhlIHBhcnNlZCBwYWdlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBOb2RlLk5vZGVzIHBhcnNlKFBhcnNlckNvbnRyb2xsZXIgcGMsCisJCQkJICAgSnNwUmVhZGVyIHJlYWRlciwKKwkJCQkgICBOb2RlIHBhcmVudCwKKwkJCQkgICBib29sZWFuIGlzVGFnRmlsZSwKKwkJCQkgICBib29sZWFuIGRpcmVjdGl2ZXNPbmx5LAorCQkJCSAgIFVSTCBqYXJGaWxlVXJsLAorCQkJCSAgIFN0cmluZyBwYWdlRW5jLAorCQkJCSAgIFN0cmluZyBqc3BDb25maWdQYWdlRW5jLAorCQkJCSAgIGJvb2xlYW4gaXNEZWZhdWx0UGFnZUVuY29kaW5nKQorCQl0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKworCVBhcnNlciBwYXJzZXIgPSBuZXcgUGFyc2VyKHBjLCByZWFkZXIsIGlzVGFnRmlsZSwgZGlyZWN0aXZlc09ubHksCisJCQkJICAgamFyRmlsZVVybCk7CisKKwlOb2RlLlJvb3Qgcm9vdCA9IG5ldyBOb2RlLlJvb3QocmVhZGVyLm1hcmsoKSwgcGFyZW50LCBmYWxzZSk7CisJcm9vdC5zZXRQYWdlRW5jb2RpbmcocGFnZUVuYyk7CisJcm9vdC5zZXRKc3BDb25maWdQYWdlRW5jb2RpbmcoanNwQ29uZmlnUGFnZUVuYyk7CisJcm9vdC5zZXRJc0RlZmF1bHRQYWdlRW5jb2RpbmcoaXNEZWZhdWx0UGFnZUVuY29kaW5nKTsKKworCWlmIChkaXJlY3RpdmVzT25seSkgeworCSAgICBwYXJzZXIucGFyc2VUYWdGaWxlRGlyZWN0aXZlcyhyb290KTsKKwkgICAgcmV0dXJuIG5ldyBOb2RlLk5vZGVzKHJvb3QpOworCX0KKworCS8vIEZvciB0aGUgVG9wIGxldmVsIHBhZ2UsIGFkZCBpbmxjdWRlLXByZWx1ZGUgYW5kIGluY2x1ZGUtY29kYQorCVBhZ2VJbmZvIHBhZ2VJbmZvID0gcGMuZ2V0Q29tcGlsZXIoKS5nZXRQYWdlSW5mbygpOworCWlmIChwYXJlbnQgPT0gbnVsbCkgeworCSAgICBwYXJzZXIuYWRkSW5jbHVkZShyb290LCBwYWdlSW5mby5nZXRJbmNsdWRlUHJlbHVkZSgpKTsKKwl9CisJd2hpbGUgKHJlYWRlci5oYXNNb3JlSW5wdXQoKSkgeworCSAgICBwYXJzZXIucGFyc2VFbGVtZW50cyhyb290KTsKKwl9CisJaWYgKHBhcmVudCA9PSBudWxsKSB7CisJICAgIHBhcnNlci5hZGRJbmNsdWRlKHJvb3QsIHBhZ2VJbmZvLmdldEluY2x1ZGVDb2RhKCkpOworCX0KKworCU5vZGUuTm9kZXMgcGFnZSA9IG5ldyBOb2RlLk5vZGVzKHJvb3QpOworCXJldHVybiBwYWdlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEF0dHJpYnV0ZXMgOjo9IChTIEF0dHJpYnV0ZSkqIFM/CisgICAgICovCisgICAgQXR0cmlidXRlcyBwYXJzZUF0dHJpYnV0ZXMoKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwlBdHRyaWJ1dGVzSW1wbCBhdHRycyA9IG5ldyBBdHRyaWJ1dGVzSW1wbCgpOworCisJcmVhZGVyLnNraXBTcGFjZXMoKTsKKwl3aGlsZSAocGFyc2VBdHRyaWJ1dGUoYXR0cnMpKQorCSAgICByZWFkZXIuc2tpcFNwYWNlcygpOworCisJcmV0dXJuIGF0dHJzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlIEF0dHJpYnV0ZXMgZm9yIGEgcmVhZGVyLCBwcm92aWRlZCBmb3IgZXh0ZXJuYWwgdXNlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBBdHRyaWJ1dGVzIHBhcnNlQXR0cmlidXRlcyhQYXJzZXJDb250cm9sbGVyIHBjLAorCQkJCQkgICAgIEpzcFJlYWRlciByZWFkZXIpCisJCXRocm93cyBKYXNwZXJFeGNlcHRpb24geworCVBhcnNlciB0bXBQYXJzZXIgPSBuZXcgUGFyc2VyKHBjLCByZWFkZXIsIGZhbHNlLCBmYWxzZSwgbnVsbCk7CisJcmV0dXJuIHRtcFBhcnNlci5wYXJzZUF0dHJpYnV0ZXMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBdHRyaWJ1dGUgOjo9IE5hbWUgUz8gRXEgUz8KKyAgICAgKiAgICAgICAgICAgICAgICggICAnIjwlPScgUlRBdHRyaWJ1dGVWYWx1ZURvdWJsZQorICAgICAqICAgICAgICAgICAgICAgICB8ICciJyBBdHRyaWJ1dGVWYWx1ZURvdWJsZQorICAgICAqICAgICAgICAgICAgICAgICB8ICInPCU9IiBSVEF0dHJpYnV0ZVZhbHVlU2luZ2xlCisgICAgICogICAgICAgICAgICAgICAgIHwgIiciIEF0dHJpYnV0ZVZhbHVlU2luZ2xlCisgICAgICogICAgICAgICAgICAgICB9CisgICAgICogTm90ZTogSlNQIGFuZCBYTUwgc3BlYyBkb2VzIG5vdCBhbGxvdyB3aGlsZSBzcGFjZXMgYXJvdW5kIEVxLiAgSXQgaXMKKyAgICAgKiBhZGRlZCB0byBiZSBiYWNrd2FyZCBjb21wYXRpYmxlIHdpdGggVG9tY2F0LCBhbmQgd2l0aCBvdGhlciB4bWwgcGFyc2Vycy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gcGFyc2VBdHRyaWJ1dGUoQXR0cmlidXRlc0ltcGwgYXR0cnMpCisJICAgICAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKworCS8vIEdldCB0aGUgcXVhbGlmaWVkIG5hbWUKKwlTdHJpbmcgcU5hbWUgPSBwYXJzZU5hbWUoKTsKKwlpZiAocU5hbWUgPT0gbnVsbCkKKwkgICAgcmV0dXJuIGZhbHNlOworCisJLy8gRGV0ZXJtaW5lIHByZWZpeCBhbmQgbG9jYWwgbmFtZSBjb21wb25lbnRzCisJU3RyaW5nIGxvY2FsTmFtZSA9IHFOYW1lOworCVN0cmluZyB1cmkgPSAiIjsKKwlpbnQgaW5kZXggPSBxTmFtZS5pbmRleE9mKCc6Jyk7CisJaWYgKGluZGV4ICE9IC0xKSB7CisJICAgIFN0cmluZyBwcmVmaXggPSBxTmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOworCSAgICB1cmkgPSBwYWdlSW5mby5nZXRVUkkocHJlZml4KTsKKwkgICAgaWYgKHVyaSA9PSBudWxsKSB7CisJCWVyci5qc3BFcnJvcihyZWFkZXIubWFyaygpLAorCQkJICAgICAianNwLmVycm9yLmF0dHJpYnV0ZS5pbnZhbGlkUHJlZml4IiwgcHJlZml4KTsKKwkgICAgfQorCSAgICBsb2NhbE5hbWUgPSBxTmFtZS5zdWJzdHJpbmcoaW5kZXgrMSk7CisJfQorCisgCXJlYWRlci5za2lwU3BhY2VzKCk7CisJaWYgKCFyZWFkZXIubWF0Y2hlcygiPSIpKQorCSAgICBlcnIuanNwRXJyb3IocmVhZGVyLm1hcmsoKSwgImpzcC5lcnJvci5hdHRyaWJ1dGUubm9lcXVhbCIpOworCisgCXJlYWRlci5za2lwU3BhY2VzKCk7CisJY2hhciBxdW90ZSA9IChjaGFyKSByZWFkZXIubmV4dENoYXIoKTsKKwlpZiAocXVvdGUgIT0gJ1wnJyAmJiBxdW90ZSAhPSAnIicpCisJICAgIGVyci5qc3BFcnJvcihyZWFkZXIubWFyaygpLCAianNwLmVycm9yLmF0dHJpYnV0ZS5ub3F1b3RlIik7CisKKyAJU3RyaW5nIHdhdGNoU3RyaW5nID0gIiI7CisJaWYgKHJlYWRlci5tYXRjaGVzKCI8JT0iKSkKKwkgICAgd2F0Y2hTdHJpbmcgPSAiJT4iOworCXdhdGNoU3RyaW5nID0gd2F0Y2hTdHJpbmcgKyBxdW90ZTsKKwkKKwlTdHJpbmcgYXR0clZhbHVlID0gcGFyc2VBdHRyaWJ1dGVWYWx1ZSh3YXRjaFN0cmluZyk7CisJYXR0cnMuYWRkQXR0cmlidXRlKHVyaSwgbG9jYWxOYW1lLCBxTmFtZSwgIkNEQVRBIiwgYXR0clZhbHVlKTsKKwlyZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBOYW1lIDo6PSAoTGV0dGVyIHwgJ18nIHwgJzonKSAoTGV0dGVyIHwgRGlnaXQgfCAnLicgfCAnXycgfCAnLScgfCAnOicpKgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHBhcnNlTmFtZSgpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCWNoYXIgY2ggPSAoY2hhcilyZWFkZXIucGVla0NoYXIoKTsKKwlpZiAoQ2hhcmFjdGVyLmlzTGV0dGVyKGNoKSB8fCBjaCA9PSAnXycgfHwgY2ggPT0gJzonKSB7CisJICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJICAgIGJ1Zi5hcHBlbmQoY2gpOworCSAgICByZWFkZXIubmV4dENoYXIoKTsKKwkgICAgY2ggPSAoY2hhcilyZWFkZXIucGVla0NoYXIoKTsKKwkgICAgd2hpbGUgKENoYXJhY3Rlci5pc0xldHRlcihjaCkgfHwgQ2hhcmFjdGVyLmlzRGlnaXQoY2gpIHx8CisJCQljaCA9PSAnLicgfHwgY2ggPT0gJ18nIHx8IGNoID09ICctJyB8fCBjaCA9PSAnOicpIHsKKwkJYnVmLmFwcGVuZChjaCk7CisJCXJlYWRlci5uZXh0Q2hhcigpOworCQljaCA9IChjaGFyKSByZWFkZXIucGVla0NoYXIoKTsKKwkgICAgfQorCSAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisJfQorCXJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEF0dHJpYnV0ZVZhbHVlRG91YmxlIDo6PSAoUXVvdGVkQ2hhciAtICciJykqCisgICAgICoJCQkJKCciJyB8IDxUUkFOU0xBVElPTl9FUlJPUj4pCisgICAgICogUlRBdHRyaWJ1dGVWYWx1ZURvdWJsZSA6Oj0gKChRdW90ZWRDaGFyIC0gJyInKSogLSAoKFF1b3RlZENoYXItJyInKSclPiInKQorICAgICAqCQkJCSAgKCclPiInIHwgVFJBTlNMQVRJT05fRVJST1IpCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcGFyc2VBdHRyaWJ1dGVWYWx1ZShTdHJpbmcgd2F0Y2gpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCU1hcmsgc3RhcnQgPSByZWFkZXIubWFyaygpOworCU1hcmsgc3RvcCA9IHJlYWRlci5za2lwVW50aWxJZ25vcmVFc2Mod2F0Y2gpOworCWlmIChzdG9wID09IG51bGwpIHsKKwkgICAgZXJyLmpzcEVycm9yKHN0YXJ0LCAianNwLmVycm9yLmF0dHJpYnV0ZS51bnRlcm1pbmF0ZWQiLCB3YXRjaCk7CisJfQorCisJU3RyaW5nIHJldCA9IHBhcnNlUXVvdGVkKHJlYWRlci5nZXRUZXh0KHN0YXJ0LCBzdG9wKSk7CisJaWYgKHdhdGNoLmxlbmd0aCgpID09IDEpCS8vIHF1b3RlCisJICAgIHJldHVybiByZXQ7CisKKwkvLyBwdXRiYWNrIGRlbGltaXRlciAnPCU9JyBhbmQgJyU+Jywgc2luY2UgdGhleSBhcmUgbmVlZGVkIGlmIHRoZQorCS8vIGF0dHJpYnV0ZSBkb2VzIG5vdCBhbGxvdyBSVGV4cHJlc3Npb24uCisJcmV0dXJuICI8JT0iICsgcmV0ICsgIiU+IjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBRdW90ZWRDaGFyIDo6PSAgICcmYXBvczsnCisgICAgICoJICAgICAgICAgICAgICB8ICcmcXVvdDsnCisgICAgICogICAgICAgICAgICAgICAgfCAnXFwnCisgICAgICogICAgICAgICAgICAgICAgfCAnXCInCisgICAgICogICAgICAgICAgICAgICAgfCAiXCciCisgICAgICogICAgICAgICAgICAgICAgfCAnXD4nCisgICAgICogICAgICAgICAgICAgICAgfCAnXCQnCisgICAgICogICAgICAgICAgICAgICAgfCBDaGFyCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcGFyc2VRdW90ZWQoU3RyaW5nIHR4KSB7CisJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwlpbnQgc2l6ZSA9IHR4Lmxlbmd0aCgpOworCWludCBpID0gMDsKKwl3aGlsZSAoaSA8IHNpemUpIHsKKwkgICAgY2hhciBjaCA9IHR4LmNoYXJBdChpKTsKKwkgICAgaWYgKGNoID09ICcmJykgeworCQlpZiAoaSs1IDwgc2l6ZSAmJiB0eC5jaGFyQXQoaSsxKSA9PSAnYScKKwkJICAgICAgICAmJiB0eC5jaGFyQXQoaSsyKSA9PSAncCcgJiYgdHguY2hhckF0KGkrMykgPT0gJ28nCisJCSAgICAgICAgJiYgdHguY2hhckF0KGkrNCkgPT0gJ3MnICYmIHR4LmNoYXJBdChpKzUpID09ICc7JykgeworCQkgICAgYnVmLmFwcGVuZCgnXCcnKTsKKwkJICAgIGkgKz0gNjsKKwkJfSBlbHNlIGlmIChpKzUgPCBzaXplICYmIHR4LmNoYXJBdChpKzEpID09ICdxJworCQkJICAgJiYgdHguY2hhckF0KGkrMikgPT0gJ3UnICYmIHR4LmNoYXJBdChpKzMpID09ICdvJworCQkJICAgJiYgdHguY2hhckF0KGkrNCkgPT0gJ3QnICYmIHR4LmNoYXJBdChpKzUpID09ICc7JykgeworCQkgICAgYnVmLmFwcGVuZCgnIicpOworCQkgICAgaSArPSA2OworCQl9IGVsc2UgeworCQkgICAgYnVmLmFwcGVuZChjaCk7CisJCSAgICArK2k7CisJCX0KKwkgICAgfSBlbHNlIGlmIChjaCA9PSAnXFwnICYmIGkrMSA8IHNpemUpIHsKKwkJY2ggPSB0eC5jaGFyQXQoaSsxKTsKKwkJaWYgKGNoID09ICdcXCcgfHwgY2ggPT0gJ1wiJyB8fCBjaCA9PSAnXCcnIHx8IGNoID09ICc+JykgeworCQkgICAgYnVmLmFwcGVuZChjaCk7CisJCSAgICBpICs9IDI7CisJCX0gZWxzZSBpZiAoY2ggPT0gJyQnKSB7CisJCSAgICAvLyBSZXBsYWNlICJcJCIgd2l0aCBzb21lIHNwZWNpYWwgY2hhci4gIFhYWCBoYWNrIQorCQkgICAgYnVmLmFwcGVuZChDb25zdGFudHMuRVNDKTsKKwkJICAgIGkgKz0gMjsKKwkJfSBlbHNlIHsKKwkJICAgIGJ1Zi5hcHBlbmQoJ1xcJyk7CisJCSAgICArK2k7CisJCX0KKwkgICAgfSBlbHNlIHsKKwkJYnVmLmFwcGVuZChjaCk7CisJCSsraTsKKwkgICAgfQorCX0KKwlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgcGFyc2VTY3JpcHRUZXh0KFN0cmluZyB0eCkgeworCUNoYXJBcnJheVdyaXRlciBjdyA9IG5ldyBDaGFyQXJyYXlXcml0ZXIoKTsKKwlpbnQgc2l6ZSA9IHR4Lmxlbmd0aCgpOworCWludCBpID0gMDsKKwl3aGlsZSAoaSA8IHNpemUpIHsKKwkgICAgY2hhciBjaCA9IHR4LmNoYXJBdChpKTsKKwkgICAgaWYgKGkrMiA8IHNpemUgJiYgY2ggPT0gJyUnICYmIHR4LmNoYXJBdChpKzEpID09ICdcXCcKKwkJICAgICYmIHR4LmNoYXJBdChpKzIpID09ICc+JykgeworCQljdy53cml0ZSgnJScpOworCQljdy53cml0ZSgnPicpOworCQlpICs9IDM7CisJICAgIH0gZWxzZSB7CisJCWN3LndyaXRlKGNoKTsKKwkJKytpOworCSAgICB9CisJfQorCWN3LmNsb3NlKCk7CisJcmV0dXJuIGN3LnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBJbnZva2VzIHBhcnNlckNvbnRyb2xsZXIgdG8gcGFyc2UgdGhlIGluY2x1ZGVkIHBhZ2UKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0luY2x1ZGVEaXJlY3RpdmUoU3RyaW5nIGZpbGUsIE5vZGUgcGFyZW50KSAKKwkJdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJaWYgKGZpbGUgPT0gbnVsbCkgeworCSAgICByZXR1cm47CisJfQorCisJdHJ5IHsKKwkgICAgcGFyc2VyQ29udHJvbGxlci5wYXJzZShmaWxlLCBwYXJlbnQsIGphckZpbGVVcmwpOworCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBleCkgeworCSAgICBlcnIuanNwRXJyb3Ioc3RhcnQsICJqc3AuZXJyb3IuZmlsZS5ub3QuZm91bmQiLCBmaWxlKTsKKwl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKwkgICAgZXJyLmpzcEVycm9yKHN0YXJ0LCBleC5nZXRNZXNzYWdlKCkpOworCX0KKyAgICB9CisKKyAgICAvKgorICAgICAqIFBhcnNlcyBhIHBhZ2UgZGlyZWN0aXZlIHdpdGggdGhlIGZvbGxvd2luZyBzeW50YXg6CisgICAgICogICBQYWdlRGlyZWN0aXZlIDo6PSAoIFMgQXR0cmlidXRlKSoKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcGFyc2VQYWdlRGlyZWN0aXZlKE5vZGUgcGFyZW50KSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwlBdHRyaWJ1dGVzIGF0dHJzID0gcGFyc2VBdHRyaWJ1dGVzKCk7CisJTm9kZS5QYWdlRGlyZWN0aXZlIG4gPSBuZXcgTm9kZS5QYWdlRGlyZWN0aXZlKGF0dHJzLCBzdGFydCwgcGFyZW50KTsKKworCS8qCisJICogQSBwYWdlIGRpcmVjdGl2ZSBtYXkgY29udGFpbiBtdWx0aXBsZSAnaW1wb3J0JyBhdHRyaWJ1dGVzLCBlYWNoIG9mCisJICogd2hpY2ggY29uc2lzdHMgb2YgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBwYWNrYWdlIG5hbWVzLgorCSAqIFN0b3JlIGVhY2ggbGlzdCB3aXRoIHRoZSBub2RlLCB3aGVyZSBpdCBpcyBwYXJzZWQuCisJICovCisJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRycy5nZXRMZW5ndGgoKTsgaSsrKSB7CisJICAgIGlmICgiaW1wb3J0Ii5lcXVhbHMoYXR0cnMuZ2V0UU5hbWUoaSkpKSB7CisJCW4uYWRkSW1wb3J0KGF0dHJzLmdldFZhbHVlKGkpKTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgICAvKgorICAgICAqIFBhcnNlcyBhbiBpbmNsdWRlIGRpcmVjdGl2ZSB3aXRoIHRoZSBmb2xsb3dpbmcgc3ludGF4OgorICAgICAqICAgSW5jbHVkZURpcmVjdGl2ZSA6Oj0gKCBTIEF0dHJpYnV0ZSkqCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHBhcnNlSW5jbHVkZURpcmVjdGl2ZShOb2RlIHBhcmVudCkgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJQXR0cmlidXRlcyBhdHRycyA9IHBhcnNlQXR0cmlidXRlcygpOworCisJLy8gSW5jbHVkZWQgZmlsZSBleHBhbmRlZCBoZXJlCisJTm9kZSBpbmNsdWRlTm9kZSA9IG5ldyBOb2RlLkluY2x1ZGVEaXJlY3RpdmUoYXR0cnMsIHN0YXJ0LCBwYXJlbnQpOworCXByb2Nlc3NJbmNsdWRlRGlyZWN0aXZlKGF0dHJzLmdldFZhbHVlKCJmaWxlIiksIGluY2x1ZGVOb2RlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBsaXN0IG9mIGZpbGVzLiAgVGhpcyBpcyB1c2VkIGZvciBpbXBsZW1lbnRpbmcgaW5jbHVkZS1wcmVsdWRlCisgICAgICogYW5kIGluY2x1ZGUtY29kYSBvZiBqc3AtY29uZmlnIGVsZW1lbnQgaW4gd2ViLnhtbAorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBhZGRJbmNsdWRlKE5vZGUgcGFyZW50LCBMaXN0IGZpbGVzKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgaWYoIGZpbGVzICE9IG51bGwgKSB7CisgICAgICAgICAgICBJdGVyYXRvciBpdGVyID0gZmlsZXMuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlID0gKFN0cmluZykgaXRlci5uZXh0KCk7CisgICAgICAgICAgICAgICAgQXR0cmlidXRlc0ltcGwgYXR0cnMgPSBuZXcgQXR0cmlidXRlc0ltcGwoKTsKKyAgICAgICAgICAgICAgICBhdHRycy5hZGRBdHRyaWJ1dGUoIiIsICJmaWxlIiwgImZpbGUiLCAiQ0RBVEEiLCBmaWxlKTsKKworICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIGR1bW15IEluY2x1ZGUgZGlyZWN0aXZlIG5vZGUKKyAgICAgICAgICAgICAgICBOb2RlIGluY2x1ZGVOb2RlID0gbmV3IE5vZGUuSW5jbHVkZURpcmVjdGl2ZShhdHRycywgCisgICAgICAgICAgICAgICAgICAgIHJlYWRlci5tYXJrKCksIHBhcmVudCk7CisgICAgICAgICAgICAgICAgcHJvY2Vzc0luY2x1ZGVEaXJlY3RpdmUoZmlsZSwgaW5jbHVkZU5vZGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBQYXJzZXMgYSB0YWdsaWIgZGlyZWN0aXZlIHdpdGggdGhlIGZvbGxvd2luZyBzeW50YXg6CisgICAgICogICBEaXJlY3RpdmUgOjo9ICggUyBBdHRyaWJ1dGUpKgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwYXJzZVRhZ2xpYkRpcmVjdGl2ZShOb2RlIHBhcmVudCkgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisKKwlBdHRyaWJ1dGVzIGF0dHJzID0gcGFyc2VBdHRyaWJ1dGVzKCk7CisJU3RyaW5nIHVyaSA9IGF0dHJzLmdldFZhbHVlKCJ1cmkiKTsKKwlTdHJpbmcgcHJlZml4ID0gYXR0cnMuZ2V0VmFsdWUoInByZWZpeCIpOworCWlmIChwcmVmaXggIT0gbnVsbCkgeworICAgICAgICAgICAgTWFyayBwcmV2TWFyayA9IHBhZ2VJbmZvLmdldE5vbkN1c3RvbVRhZ1ByZWZpeChwcmVmaXgpOworICAgICAgICAgICAgaWYgKHByZXZNYXJrICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBlcnIuanNwRXJyb3IocmVhZGVyLm1hcmsoKSwgImpzcC5lcnJvci5wcmVmaXgudXNlX2JlZm9yZV9kY2wiLAorICAgICAgICAgICAgICAgICAgICBwcmVmaXgsIHByZXZNYXJrLmdldEZpbGUoKSwgIiIgKyBwcmV2TWFyay5nZXRMaW5lTnVtYmVyKCkpOworICAgICAgICAgICAgfQorCSAgICBpZiAodXJpICE9IG51bGwpIHsKKwkJU3RyaW5nIHVyaVByZXYgPSBwYWdlSW5mby5nZXRVUkkocHJlZml4KTsKKwkJaWYgKHVyaVByZXYgIT0gbnVsbCAmJiAhdXJpUHJldi5lcXVhbHModXJpKSkgeworCQkgICAgZXJyLmpzcEVycm9yKHJlYWRlci5tYXJrKCksICJqc3AuZXJyb3IucHJlZml4LnJlZmluZWQiLAorCQkJcHJlZml4LCB1cmksIHVyaVByZXYpOworCQl9CisJCWlmIChwYWdlSW5mby5nZXRUYWdsaWIodXJpKSA9PSBudWxsKSB7CisJCSAgICBTdHJpbmdbXSBsb2NhdGlvbiA9IGN0eHQuZ2V0VGxkTG9jYXRpb24odXJpKTsKKwkJICAgIHBhZ2VJbmZvLmFkZFRhZ2xpYih1cmksCisJCQkJICAgICAgIG5ldyBUYWdMaWJyYXJ5SW5mb0ltcGwoY3R4dCwKKwkJCQkJCQkgICAgICBwYXJzZXJDb250cm9sbGVyLAorCQkJCQkJCSAgICAgIHByZWZpeCwKKwkJCQkJCQkgICAgICB1cmksCisJCQkJCQkJICAgICAgbG9jYXRpb24sCisJCQkJCQkJICAgICAgZXJyKSk7CisJCX0KKwkJcGFnZUluZm8uYWRkUHJlZml4TWFwcGluZyhwcmVmaXgsIHVyaSk7CisJICAgIH0gZWxzZSB7CisJCVN0cmluZyB0YWdkaXIgPSBhdHRycy5nZXRWYWx1ZSgidGFnZGlyIik7CisJCWlmICh0YWdkaXIgIT0gbnVsbCkgeworCQkgICAgU3RyaW5nIHVyblRhZ2RpciA9IFVSTl9KU1BUQUdESVIgKyB0YWdkaXI7CisJCSAgICBpZiAocGFnZUluZm8uZ2V0VGFnbGliKHVyblRhZ2RpcikgPT0gbnVsbCkgeworCQkJcGFnZUluZm8uYWRkVGFnbGliKHVyblRhZ2RpciwKKwkJCQkJICAgbmV3IEltcGxpY2l0VGFnTGlicmFyeUluZm8oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHh0LAorCQkJCQkJICAgcGFyc2VyQ29udHJvbGxlciwKKwkJCQkJCSAgIHByZWZpeCwgCisJCQkJCQkgICB0YWdkaXIsCisJCQkJCQkgICBlcnIpKTsKKwkJICAgIH0KKwkJICAgIHBhZ2VJbmZvLmFkZFByZWZpeE1hcHBpbmcocHJlZml4LCB1cm5UYWdkaXIpOworCQl9CisJICAgIH0KKwl9CisKKwluZXcgTm9kZS5UYWdsaWJEaXJlY3RpdmUoYXR0cnMsIHN0YXJ0LCBwYXJlbnQpOworICAgIH0KKworICAgIC8qCisgICAgICogUGFyc2VzIGEgZGlyZWN0aXZlIHdpdGggdGhlIGZvbGxvd2luZyBzeW50YXg6CisgICAgICogICBEaXJlY3RpdmUgOjo9IFM/ICggICAncGFnZScgUGFnZURpcmVjdGl2ZQorICAgICAqCQkJICAgIHwgJ2luY2x1ZGUnIEluY2x1ZGVEaXJlY3RpdmUKKyAgICAgKgkJCSAgICB8ICd0YWdsaWInIFRhZ0xpYkRpcmVjdGl2ZSkKKyAgICAgKgkJICAgICAgIFM/ICclPicKKyAgICAgKgorICAgICAqICAgVGFnRGlyZWN0aXZlIDo6PSBTPyAoJ3RhZycgUGFnZURpcmVjdGl2ZQorICAgICAqCQkJICAgIHwgJ2luY2x1ZGUnIEluY2x1ZGVEaXJlY3RpdmUKKyAgICAgKgkJCSAgICB8ICd0YWdsaWInIFRhZ0xpYkRpcmVjdGl2ZSkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB8ICdhdHRyaWJ1dGUgQXR0cmlidXRlRGlyZWN0aXZlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgfCAndmFyaWFibGUgVmFyaWFibGVEaXJlY3RpdmUKKyAgICAgKgkJICAgICAgIFM/ICclPicKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcGFyc2VEaXJlY3RpdmUoTm9kZSBwYXJlbnQpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCXJlYWRlci5za2lwU3BhY2VzKCk7CisKKwlTdHJpbmcgZGlyZWN0aXZlID0gbnVsbDsKKwlpZiAocmVhZGVyLm1hdGNoZXMoInBhZ2UiKSkgeworCSAgICBkaXJlY3RpdmUgPSAiJmx0OyVAIHBhZ2UiOworCSAgICBpZiAoaXNUYWdGaWxlKSB7CisJCWVyci5qc3BFcnJvcihyZWFkZXIubWFyaygpLCAianNwLmVycm9yLmRpcmVjdGl2ZS5pc3RhZ2ZpbGUiLAorCQkJCQkgICAgZGlyZWN0aXZlKTsKKwkgICAgfQorCSAgICBwYXJzZVBhZ2VEaXJlY3RpdmUocGFyZW50KTsKKwl9IGVsc2UgaWYgKHJlYWRlci5tYXRjaGVzKCJpbmNsdWRlIikpIHsKKwkgICAgZGlyZWN0aXZlID0gIiZsdDslQCBpbmNsdWRlIjsKKwkgICAgcGFyc2VJbmNsdWRlRGlyZWN0aXZlKHBhcmVudCk7CisJfSBlbHNlIGlmIChyZWFkZXIubWF0Y2hlcygidGFnbGliIikpIHsKKwkgICAgaWYgKGRpcmVjdGl2ZXNPbmx5KSB7CisJICAgICAgICAvLyBObyBuZWVkIHRvIGdldCB0aGUgdGFnTGliSW5mbyBvYmplY3RzLiAgVGhpcyBhbG9zIHN1cHByZXNzZXMKKwkgICAgICAgIC8vIHBhcnNpbmcgb2YgYW55IHRhZyBmaWxlcyB1c2VkIGluIHRoaXMgdGFnIGZpbGUuCisJICAgICAgICByZXR1cm47CisJICAgIH0KKwkgICAgZGlyZWN0aXZlID0gIiZsdDslQCB0YWdsaWIiOworCSAgICBwYXJzZVRhZ2xpYkRpcmVjdGl2ZShwYXJlbnQpOworCX0gZWxzZSBpZiAocmVhZGVyLm1hdGNoZXMoInRhZyIpKSB7CisJICAgIGRpcmVjdGl2ZSA9ICImbHQ7JUAgdGFnIjsKKwkgICAgaWYgKCFpc1RhZ0ZpbGUpIHsKKwkJZXJyLmpzcEVycm9yKHJlYWRlci5tYXJrKCksICJqc3AuZXJyb3IuZGlyZWN0aXZlLmlzbm90dGFnZmlsZSIsCisJCQkJCSAgICBkaXJlY3RpdmUpOworCSAgICB9CisJICAgIHBhcnNlVGFnRGlyZWN0aXZlKHBhcmVudCk7CisJfSBlbHNlIGlmIChyZWFkZXIubWF0Y2hlcygiYXR0cmlidXRlIikpIHsKKwkgICAgZGlyZWN0aXZlID0gIiZsdDslQCBhdHRyaWJ1dGUiOworCSAgICBpZiAoIWlzVGFnRmlsZSkgeworCQllcnIuanNwRXJyb3IocmVhZGVyLm1hcmsoKSwgImpzcC5lcnJvci5kaXJlY3RpdmUuaXNub3R0YWdmaWxlIiwKKwkJCQkJICAgIGRpcmVjdGl2ZSk7CisJICAgIH0KKwkgICAgcGFyc2VBdHRyaWJ1dGVEaXJlY3RpdmUocGFyZW50KTsKKwl9IGVsc2UgaWYgKHJlYWRlci5tYXRjaGVzKCJ2YXJpYWJsZSIpKSB7CisJICAgIGRpcmVjdGl2ZSA9ICImbHQ7JUAgdmFyaWFibGUiOworCSAgICBpZiAoIWlzVGFnRmlsZSkgeworCQllcnIuanNwRXJyb3IocmVhZGVyLm1hcmsoKSwgImpzcC5lcnJvci5kaXJlY3RpdmUuaXNub3R0YWdmaWxlIiwKKwkJCQkJICAgIGRpcmVjdGl2ZSk7CisJICAgIH0KKwkgICAgcGFyc2VWYXJpYWJsZURpcmVjdGl2ZShwYXJlbnQpOworCX0gZWxzZSB7CisJICAgIGVyci5qc3BFcnJvcihyZWFkZXIubWFyaygpLCAianNwLmVycm9yLmludmFsaWQuZGlyZWN0aXZlIik7CisJfQorCisJcmVhZGVyLnNraXBTcGFjZXMoKTsKKwlpZiAoIXJlYWRlci5tYXRjaGVzKCIlPiIpKSB7CisJICAgIGVyci5qc3BFcnJvcihzdGFydCwgImpzcC5lcnJvci51bnRlcm1pbmF0ZWQiLCBkaXJlY3RpdmUpOworCX0KKyAgICB9CisJCisgICAgLyoKKyAgICAgKiBQYXJzZXMgYSBkaXJlY3RpdmUgd2l0aCB0aGUgZm9sbG93aW5nIHN5bnRheDoKKyAgICAgKgorICAgICAqICAgWE1MSlNQRGlyZWN0aXZlQm9keSA6Oj0gUz8gKCAgICggJ3BhZ2UnIFBhZ2VEaXJlY3RpdmVBdHRyTGlzdAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUz8gKCAnLz4nIHwgKCAnPicgUz8gRVRhZyApICkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICggJ2luY2x1ZGUnIEluY2x1ZGVEaXJlY3RpdmVBdHRyTGlzdAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUz8gKCAnLz4nIHwgKCAnPicgUz8gRVRhZyApICkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgPFRSQU5TTEFUSU9OX0VSUk9SPgorICAgICAqCisgICAgICogICBYTUxUYWdEZWZEaXJlY3RpdmVCb2R5IDo6PSAoICAgKCAndGFnJyBUYWdEaXJlY3RpdmVBdHRyTGlzdAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUz8gKCAnLz4nIHwgKCAnPicgUz8gRVRhZyApICkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoICdpbmNsdWRlJyBJbmNsdWRlRGlyZWN0aXZlQXR0ckxpc3QKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFM/ICggJy8+JyB8ICggJz4nIFM/IEVUYWcgKSApCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKCAnYXR0cmlidXRlJyBBdHRyaWJ1dGVEaXJlY3RpdmVBdHRyTGlzdAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUz8gKCAnLz4nIHwgKCAnPicgUz8gRVRhZyApICkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoICd2YXJpYWJsZScgVmFyaWFibGVEaXJlY3RpdmVBdHRyTGlzdAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUz8gKCAnLz4nIHwgKCAnPicgUz8gRVRhZyApICkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDxUUkFOU0xBVElPTl9FUlJPUj4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcGFyc2VYTUxEaXJlY3RpdmUoTm9kZSBwYXJlbnQpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgIHJlYWRlci5za2lwU3BhY2VzKCk7CisKKyAgICAgICAgU3RyaW5nIGVUYWcgPSBudWxsOworICAgICAgIGlmIChyZWFkZXIubWF0Y2hlcygicGFnZSIpKSB7CisgICAgICAgICAgICBlVGFnID0gImpzcDpkaXJlY3RpdmUucGFnZSI7CisgICAgICAgICAgIGlmIChpc1RhZ0ZpbGUpIHsKKyAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcihyZWFkZXIubWFyaygpLCAianNwLmVycm9yLmRpcmVjdGl2ZS5pc3RhZ2ZpbGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICImbHQ7IiArIGVUYWcpOworICAgICAgICAgICB9CisgICAgICAgICAgIHBhcnNlUGFnZURpcmVjdGl2ZShwYXJlbnQpOworICAgICAgIH0gZWxzZSBpZiAocmVhZGVyLm1hdGNoZXMoImluY2x1ZGUiKSkgeworICAgICAgICAgICAgZVRhZyA9ICJqc3A6ZGlyZWN0aXZlLmluY2x1ZGUiOworICAgICAgICAgICBwYXJzZUluY2x1ZGVEaXJlY3RpdmUocGFyZW50KTsKKyAgICAgICB9IGVsc2UgaWYgKHJlYWRlci5tYXRjaGVzKCJ0YWciKSkgeworICAgICAgICAgICAgZVRhZyA9ICJqc3A6ZGlyZWN0aXZlLnRhZyI7CisgICAgICAgICAgIGlmICghaXNUYWdGaWxlKSB7CisgICAgICAgICAgICAgICBlcnIuanNwRXJyb3IocmVhZGVyLm1hcmsoKSwgImpzcC5lcnJvci5kaXJlY3RpdmUuaXNub3R0YWdmaWxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJmx0OyIgKyBlVGFnKTsKKyAgICAgICAgICAgfQorICAgICAgICAgICBwYXJzZVRhZ0RpcmVjdGl2ZShwYXJlbnQpOworICAgICAgIH0gZWxzZSBpZiAocmVhZGVyLm1hdGNoZXMoImF0dHJpYnV0ZSIpKSB7CisgICAgICAgICAgICBlVGFnID0gImpzcDpkaXJlY3RpdmUuYXR0cmlidXRlIjsKKyAgICAgICAgICAgaWYgKCFpc1RhZ0ZpbGUpIHsKKyAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcihyZWFkZXIubWFyaygpLCAianNwLmVycm9yLmRpcmVjdGl2ZS5pc25vdHRhZ2ZpbGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICImbHQ7IiArIGVUYWcpOworICAgICAgICAgICB9CisgICAgICAgICAgIHBhcnNlQXR0cmlidXRlRGlyZWN0aXZlKHBhcmVudCk7CisgICAgICAgfSBlbHNlIGlmIChyZWFkZXIubWF0Y2hlcygidmFyaWFibGUiKSkgeworICAgICAgICAgICAgZVRhZyA9ICJqc3A6ZGlyZWN0aXZlLnZhcmlhYmxlIjsKKyAgICAgICAgICAgaWYgKCFpc1RhZ0ZpbGUpIHsKKyAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcihyZWFkZXIubWFyaygpLCAianNwLmVycm9yLmRpcmVjdGl2ZS5pc25vdHRhZ2ZpbGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICImbHQ7IiArIGVUYWcpOworICAgICAgICAgICB9CisgICAgICAgICAgIHBhcnNlVmFyaWFibGVEaXJlY3RpdmUocGFyZW50KTsKKyAgICAgICB9IGVsc2UgeworICAgICAgICAgICBlcnIuanNwRXJyb3IocmVhZGVyLm1hcmsoKSwgImpzcC5lcnJvci5pbnZhbGlkLmRpcmVjdGl2ZSIpOworICAgICAgIH0KKworICAgICAgIHJlYWRlci5za2lwU3BhY2VzKCk7CisgICAgICAgIGlmKCByZWFkZXIubWF0Y2hlcyggIj4iICkgKSB7CisgICAgICAgICAgICByZWFkZXIuc2tpcFNwYWNlcygpOworICAgICAgICAgICAgaWYoICFyZWFkZXIubWF0Y2hlc0VUYWcoIGVUYWcgKSApIHsKKyAgICAgICAgICAgICAgICBlcnIuanNwRXJyb3Ioc3RhcnQsICJqc3AuZXJyb3IudW50ZXJtaW5hdGVkIiwgIiZsdDsiICsgZVRhZyApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoICFyZWFkZXIubWF0Y2hlcyggIi8+IiApICkgeworICAgICAgICAgICAgZXJyLmpzcEVycm9yKHN0YXJ0LCAianNwLmVycm9yLnVudGVybWluYXRlZCIsICImbHQ7IiArIGVUYWcgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogUGFyc2VzIGEgdGFnIGRpcmVjdGl2ZSB3aXRoIHRoZSBmb2xsb3dpbmcgc3ludGF4OgorICAgICAqICAgUGFnZURpcmVjdGl2ZSA6Oj0gKCBTIEF0dHJpYnV0ZSkqCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHBhcnNlVGFnRGlyZWN0aXZlKE5vZGUgcGFyZW50KSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwlBdHRyaWJ1dGVzIGF0dHJzID0gcGFyc2VBdHRyaWJ1dGVzKCk7CisJTm9kZS5UYWdEaXJlY3RpdmUgbiA9IG5ldyBOb2RlLlRhZ0RpcmVjdGl2ZShhdHRycywgc3RhcnQsIHBhcmVudCk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQSBwYWdlIGRpcmVjdGl2ZSBtYXkgY29udGFpbiBtdWx0aXBsZSAnaW1wb3J0JyBhdHRyaWJ1dGVzLCBlYWNoIG9mCisgICAgICAgICAqIHdoaWNoIGNvbnNpc3RzIG9mIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcGFja2FnZSBuYW1lcy4KKyAgICAgICAgICogU3RvcmUgZWFjaCBsaXN0IHdpdGggdGhlIG5vZGUsIHdoZXJlIGl0IGlzIHBhcnNlZC4KKyAgICAgICAgICovCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cnMuZ2V0TGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKCJpbXBvcnQiLmVxdWFscyhhdHRycy5nZXRRTmFtZShpKSkpIHsKKyAgICAgICAgICAgICAgICBuLmFkZEltcG9ydChhdHRycy5nZXRWYWx1ZShpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIFBhcnNlcyBhIGF0dHJpYnV0ZSBkaXJlY3RpdmUgd2l0aCB0aGUgZm9sbG93aW5nIHN5bnRheDoKKyAgICAgKiAgIEF0dHJpYnV0ZURpcmVjdGl2ZSA6Oj0gKCBTIEF0dHJpYnV0ZSkqCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHBhcnNlQXR0cmlidXRlRGlyZWN0aXZlKE5vZGUgcGFyZW50KSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwlBdHRyaWJ1dGVzIGF0dHJzID0gcGFyc2VBdHRyaWJ1dGVzKCk7CisJTm9kZS5BdHRyaWJ1dGVEaXJlY3RpdmUgbiA9CisJCW5ldyBOb2RlLkF0dHJpYnV0ZURpcmVjdGl2ZShhdHRycywgc3RhcnQsIHBhcmVudCk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBQYXJzZXMgYSB2YXJpYWJsZSBkaXJlY3RpdmUgd2l0aCB0aGUgZm9sbG93aW5nIHN5bnRheDoKKyAgICAgKiAgIFBhZ2VEaXJlY3RpdmUgOjo9ICggUyBBdHRyaWJ1dGUpKgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwYXJzZVZhcmlhYmxlRGlyZWN0aXZlKE5vZGUgcGFyZW50KSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwlBdHRyaWJ1dGVzIGF0dHJzID0gcGFyc2VBdHRyaWJ1dGVzKCk7CisJTm9kZS5WYXJpYWJsZURpcmVjdGl2ZSBuID0KKwkJbmV3IE5vZGUuVmFyaWFibGVEaXJlY3RpdmUoYXR0cnMsIHN0YXJ0LCBwYXJlbnQpOworICAgIH0KKworICAgIC8qCisgICAgICogSlNQQ29tbWVudEJvZHkgOjo9IChDaGFyKiAtIChDaGFyKiAnLS0lPicpKSAnLS0lPicKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcGFyc2VDb21tZW50KE5vZGUgcGFyZW50KSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsJCisJc3RhcnQgPSByZWFkZXIubWFyaygpOworCU1hcmsgc3RvcCA9IHJlYWRlci5za2lwVW50aWwoIi0tJT4iKTsKKwlpZiAoc3RvcCA9PSBudWxsKSB7CisJICAgIGVyci5qc3BFcnJvcihzdGFydCwgImpzcC5lcnJvci51bnRlcm1pbmF0ZWQiLCAiJmx0OyUtLSIpOworCX0KKworCW5ldyBOb2RlLkNvbW1lbnQocmVhZGVyLmdldFRleHQoc3RhcnQsIHN0b3ApLCBzdGFydCwgcGFyZW50KTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIERlY2xhcmF0aW9uQm9keSA6Oj0gKENoYXIqIC0gKGNoYXIqICclPicpKSAnJT4nCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHBhcnNlRGVjbGFyYXRpb24oTm9kZSBwYXJlbnQpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCXN0YXJ0ID0gcmVhZGVyLm1hcmsoKTsKKwlNYXJrIHN0b3AgPSByZWFkZXIuc2tpcFVudGlsKCIlPiIpOworCWlmIChzdG9wID09IG51bGwpIHsKKwkgICAgZXJyLmpzcEVycm9yKHN0YXJ0LCAianNwLmVycm9yLnVudGVybWluYXRlZCIsICImbHQ7JSEiKTsKKwl9CisKKwluZXcgTm9kZS5EZWNsYXJhdGlvbihwYXJzZVNjcmlwdFRleHQocmVhZGVyLmdldFRleHQoc3RhcnQsIHN0b3ApKSwKKwkJCSAgICAgc3RhcnQsIHBhcmVudCk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBYTUxEZWNsYXJhdGlvbkJvZHkgOjo9ICAgKCBTPyAnLz4nICkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIHwgKCBTPyAnPicgKENoYXIqIC0gKGNoYXIqICc8JykpIENEU2VjdD8pKiBFVGFnCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICB8IDxUUkFOU0xBVElPTl9FUlJPUj4KKyAgICAgKiBDRFNlY3QgOjo9IENEU3RhcnQgQ0RhdGEgQ0RFbmQKKyAgICAgKiBDRFN0YXJ0IDo6PSAnPCFbQ0RBVEFbJworICAgICAqIENEYXRhIDo6PSAoQ2hhciogLSAoQ2hhciogJ11dPicgQ2hhciopKQorICAgICAqIENERW5kIDo6PSAnXV0+JworICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwYXJzZVhNTERlY2xhcmF0aW9uKE5vZGUgcGFyZW50KSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgcmVhZGVyLnNraXBTcGFjZXMoKTsKKyAgICAgICAgaWYoICFyZWFkZXIubWF0Y2hlcyggIi8+IiApICkgeworICAgICAgICAgICAgaWYoICFyZWFkZXIubWF0Y2hlcyggIj4iICkgKSB7CisgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKHN0YXJ0LCAianNwLmVycm9yLnVudGVybWluYXRlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiJmx0O2pzcDpkZWNsYXJhdGlvbiZndDsiKTsKKyAgICAgICAgICAgIH0KKwkgICAgTWFyayBzdG9wOworICAgICAgICAgICAgU3RyaW5nIHRleHQ7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgIHN0YXJ0ID0gcmVhZGVyLm1hcmsoKTsKKyAgICAgICAgICAgICAgICBzdG9wID0gcmVhZGVyLnNraXBVbnRpbCgiPCIpOworICAgICAgICAgICAgICAgIGlmIChzdG9wID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKHN0YXJ0LCAianNwLmVycm9yLnVudGVybWluYXRlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiJmx0O2pzcDpkZWNsYXJhdGlvbiZndDsiKTsKKyAgICAgICAgICAgICAgICB9CisJCXRleHQgPSBwYXJzZVNjcmlwdFRleHQocmVhZGVyLmdldFRleHQoc3RhcnQsIHN0b3ApKTsKKyAgICAgICAgICAgICAgICBuZXcgTm9kZS5EZWNsYXJhdGlvbih0ZXh0LCBzdGFydCwgcGFyZW50KTsKKyAgICAgICAgICAgICAgICBpZiAocmVhZGVyLm1hdGNoZXMoIiFbQ0RBVEFbIikpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSByZWFkZXIubWFyaygpOworICAgICAgICAgICAgICAgICAgICBzdG9wID0gcmVhZGVyLnNraXBVbnRpbCgiXV0+Iik7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdG9wID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcihzdGFydCwgImpzcC5lcnJvci51bnRlcm1pbmF0ZWQiLCAiQ0RBVEEiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCQkgICAgdGV4dCA9IHBhcnNlU2NyaXB0VGV4dChyZWFkZXIuZ2V0VGV4dChzdGFydCwgc3RvcCkpOworICAgICAgICAgICAgICAgICAgICBuZXcgTm9kZS5EZWNsYXJhdGlvbih0ZXh0LCBzdGFydCwgcGFyZW50KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKwkgICAgfQorCQkKKyAgICAgICAgICAgIGlmICghcmVhZGVyLm1hdGNoZXNFVGFnV2l0aG91dExlc3NUaGFuKCAianNwOmRlY2xhcmF0aW9uIiApICkgeworICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcihzdGFydCwgImpzcC5lcnJvci51bnRlcm1pbmF0ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIiZsdDtqc3A6ZGVjbGFyYXRpb24mZ3Q7Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIEV4cHJlc3Npb25Cb2R5IDo6PSAoQ2hhciogLSAoY2hhciogJyU+JykpICclPicKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcGFyc2VFeHByZXNzaW9uKE5vZGUgcGFyZW50KSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwlzdGFydCA9IHJlYWRlci5tYXJrKCk7CisJTWFyayBzdG9wID0gcmVhZGVyLnNraXBVbnRpbCgiJT4iKTsKKwlpZiAoc3RvcCA9PSBudWxsKSB7CisJICAgIGVyci5qc3BFcnJvcihzdGFydCwgImpzcC5lcnJvci51bnRlcm1pbmF0ZWQiLCAiJmx0OyU9Iik7CisJfQorCisJbmV3IE5vZGUuRXhwcmVzc2lvbihwYXJzZVNjcmlwdFRleHQocmVhZGVyLmdldFRleHQoc3RhcnQsIHN0b3ApKSwKKwkJCSAgICBzdGFydCwgcGFyZW50KTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFhNTEV4cHJlc3Npb25Cb2R5IDo6PSAgICggUz8gJy8+JyApCisgICAgICogICAgICAgICAgICAgICAgICAgICAgIHwgKCBTPyAnPicgKENoYXIqIC0gKGNoYXIqICc8JykpIENEU2VjdD8pKiBFVGFnICkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgfCA8VFJBTlNMQVRJT05fRVJST1I+CisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHBhcnNlWE1MRXhwcmVzc2lvbihOb2RlIHBhcmVudCkgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgIHJlYWRlci5za2lwU3BhY2VzKCk7CisgICAgICAgIGlmKCAhcmVhZGVyLm1hdGNoZXMoICIvPiIgKSApIHsKKyAgICAgICAgICAgIGlmKCAhcmVhZGVyLm1hdGNoZXMoICI+IiApICkgeworICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcihzdGFydCwgImpzcC5lcnJvci51bnRlcm1pbmF0ZWQiLAorICAgICAgICAgICAgICAgICAgICAiJmx0O2pzcDpleHByZXNzaW9uJmd0OyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTWFyayBzdG9wOworICAgICAgICAgICAgU3RyaW5nIHRleHQ7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgIHN0YXJ0ID0gcmVhZGVyLm1hcmsoKTsKKyAgICAgICAgICAgICAgICBzdG9wID0gcmVhZGVyLnNraXBVbnRpbCgiPCIpOworICAgICAgICAgICAgICAgIGlmIChzdG9wID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKHN0YXJ0LCAianNwLmVycm9yLnVudGVybWluYXRlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiJmx0O2pzcDpleHByZXNzaW9uJmd0OyIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0ZXh0ID0gcGFyc2VTY3JpcHRUZXh0KHJlYWRlci5nZXRUZXh0KHN0YXJ0LCBzdG9wKSk7CisgICAgICAgICAgICAgICAgbmV3IE5vZGUuRXhwcmVzc2lvbih0ZXh0LCBzdGFydCwgcGFyZW50KTsKKyAgICAgICAgICAgICAgICBpZiAocmVhZGVyLm1hdGNoZXMoIiFbQ0RBVEFbIikpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSByZWFkZXIubWFyaygpOworICAgICAgICAgICAgICAgICAgICBzdG9wID0gcmVhZGVyLnNraXBVbnRpbCgiXV0+Iik7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdG9wID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcihzdGFydCwgImpzcC5lcnJvci51bnRlcm1pbmF0ZWQiLCAiQ0RBVEEiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gcGFyc2VTY3JpcHRUZXh0KHJlYWRlci5nZXRUZXh0KHN0YXJ0LCBzdG9wKSk7CisgICAgICAgICAgICAgICAgICAgIG5ldyBOb2RlLkV4cHJlc3Npb24odGV4dCwgc3RhcnQsIHBhcmVudCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIXJlYWRlci5tYXRjaGVzRVRhZ1dpdGhvdXRMZXNzVGhhbiggImpzcDpleHByZXNzaW9uIiApKSB7CisgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKHN0YXJ0LCAianNwLmVycm9yLnVudGVybWluYXRlZCIsCisgICAgICAgICAgICAgICAgICAgICImbHQ7anNwOmV4cHJlc3Npb24mZ3Q7Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIEVMRXhwcmVzc2lvbkJvZHkKKyAgICAgKiAoZm9sbG93aW5nICIkeyIgdG8gZmlyc3QgdW5xdW90ZWQgIn0iKQorICAgICAqIC8vIFhYWCBhZGQgZm9ybWFsIHByb2R1Y3Rpb24gYW5kIGNvbmZpcm0gaW1wbGVtZW50YXRpb24gYWdhaW5zdCBpdCwKKyAgICAgKiAvLyAgICAgb25jZSBpdCdzIGRlY2lkZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcGFyc2VFTEV4cHJlc3Npb24oTm9kZSBwYXJlbnQpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICBzdGFydCA9IHJlYWRlci5tYXJrKCk7CisgICAgICAgIE1hcmsgbGFzdCA9IG51bGw7CisgICAgICAgIGJvb2xlYW4gc2luZ2xlUXVvdGVkID0gZmFsc2UsIGRvdWJsZVF1b3RlZCA9IGZhbHNlOworICAgICAgICBpbnQgY3VycmVudENoYXI7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIC8vIFhYWCBjb3VsZCBtb3ZlIHRoaXMgbG9naWMgdG8gSnNwUmVhZGVyCisgICAgICAgICAgICBsYXN0ID0gcmVhZGVyLm1hcmsoKTsgICAgICAgICAgICAgICAvLyBYWFggc29tZXdoYXQgd2FzdGVmdWwKKyAgICAgICAgICAgIGN1cnJlbnRDaGFyID0gcmVhZGVyLm5leHRDaGFyKCk7CisgICAgICAgICAgICBpZiAoY3VycmVudENoYXIgPT0gJ1xcJyAmJiAoc2luZ2xlUXVvdGVkIHx8IGRvdWJsZVF1b3RlZCkpIHsKKyAgICAgICAgICAgICAgICAvLyBza2lwIGNoYXJhY3RlciBmb2xsb3dpbmcgJ1wnIHdpdGhpbiBxdW90ZXMKKyAgICAgICAgICAgICAgICByZWFkZXIubmV4dENoYXIoKTsKKyAgICAgICAgICAgICAgICBjdXJyZW50Q2hhciA9IHJlYWRlci5uZXh0Q2hhcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGN1cnJlbnRDaGFyID09IC0xKQorICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcihzdGFydCwgImpzcC5lcnJvci51bnRlcm1pbmF0ZWQiLCAiJHsiKTsKKyAgICAgICAgICAgIGlmIChjdXJyZW50Q2hhciA9PSAnIicpCisgICAgICAgICAgICAgICAgZG91YmxlUXVvdGVkID0gIWRvdWJsZVF1b3RlZDsKKyAgICAgICAgICAgIGlmIChjdXJyZW50Q2hhciA9PSAnXCcnKQorICAgICAgICAgICAgICAgIHNpbmdsZVF1b3RlZCA9ICFzaW5nbGVRdW90ZWQ7CisgICAgICAgIH0gd2hpbGUgKGN1cnJlbnRDaGFyICE9ICd9JyB8fCAoc2luZ2xlUXVvdGVkIHx8IGRvdWJsZVF1b3RlZCkpOworCisgICAgICAgIG5ldyBOb2RlLkVMRXhwcmVzc2lvbihyZWFkZXIuZ2V0VGV4dChzdGFydCwgbGFzdCksIHN0YXJ0LCBwYXJlbnQpOworICAgIH0KKworICAgIC8qCisgICAgICogU2NyaXB0bGV0Qm9keSA6Oj0gKENoYXIqIC0gKGNoYXIqICclPicpKSAnJT4nCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHBhcnNlU2NyaXB0bGV0KE5vZGUgcGFyZW50KSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwlzdGFydCA9IHJlYWRlci5tYXJrKCk7CisJTWFyayBzdG9wID0gcmVhZGVyLnNraXBVbnRpbCgiJT4iKTsKKwlpZiAoc3RvcCA9PSBudWxsKSB7CisJICAgIGVyci5qc3BFcnJvcihzdGFydCwgImpzcC5lcnJvci51bnRlcm1pbmF0ZWQiLCAiJmx0OyUiKTsKKwl9CisKKwluZXcgTm9kZS5TY3JpcHRsZXQocGFyc2VTY3JpcHRUZXh0KHJlYWRlci5nZXRUZXh0KHN0YXJ0LCBzdG9wKSksCisJCQkgICBzdGFydCwgcGFyZW50KTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFhNTFNjcmlwdGxldEJvZHkgOjo9ICAgKCBTPyAnLz4nICkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB8ICggUz8gJz4nIChDaGFyKiAtIChjaGFyKiAnPCcpKSBDRFNlY3Q/KSogRVRhZyApCisgICAgICogICAgICAgICAgICAgICAgICAgICAgfCA8VFJBTlNMQVRJT05fRVJST1I+CisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHBhcnNlWE1MU2NyaXB0bGV0KE5vZGUgcGFyZW50KSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgcmVhZGVyLnNraXBTcGFjZXMoKTsKKyAgICAgICAgaWYoICFyZWFkZXIubWF0Y2hlcyggIi8+IiApICkgeworICAgICAgICAgICAgaWYoICFyZWFkZXIubWF0Y2hlcyggIj4iICkgKSB7CisgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKHN0YXJ0LCAianNwLmVycm9yLnVudGVybWluYXRlZCIsCisgICAgICAgICAgICAgICAgICAgICImbHQ7anNwOnNjcmlwdGxldCZndDsiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE1hcmsgc3RvcDsKKyAgICAgICAgICAgIFN0cmluZyB0ZXh0OworICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICBzdGFydCA9IHJlYWRlci5tYXJrKCk7CisgICAgICAgICAgICAgICAgc3RvcCA9IHJlYWRlci5za2lwVW50aWwoIjwiKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RvcCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcihzdGFydCwgImpzcC5lcnJvci51bnRlcm1pbmF0ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIiZsdDtqc3A6c2NyaXB0bGV0Jmd0OyIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0ZXh0ID0gcGFyc2VTY3JpcHRUZXh0KHJlYWRlci5nZXRUZXh0KHN0YXJ0LCBzdG9wKSk7CisgICAgICAgICAgICAgICAgbmV3IE5vZGUuU2NyaXB0bGV0KHRleHQsIHN0YXJ0LCBwYXJlbnQpOworICAgICAgICAgICAgICAgIGlmIChyZWFkZXIubWF0Y2hlcygiIVtDREFUQVsiKSkgeworICAgICAgICAgICAgICAgICAgICBzdGFydCA9IHJlYWRlci5tYXJrKCk7CisgICAgICAgICAgICAgICAgICAgIHN0b3AgPSByZWFkZXIuc2tpcFVudGlsKCJdXT4iKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0b3AgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKHN0YXJ0LCAianNwLmVycm9yLnVudGVybWluYXRlZCIsICJDREFUQSIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHRleHQgPSBwYXJzZVNjcmlwdFRleHQocmVhZGVyLmdldFRleHQoc3RhcnQsIHN0b3ApKTsKKyAgICAgICAgICAgICAgICAgICAgbmV3IE5vZGUuU2NyaXB0bGV0KHRleHQsIHN0YXJ0LCBwYXJlbnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIXJlYWRlci5tYXRjaGVzRVRhZ1dpdGhvdXRMZXNzVGhhbiggImpzcDpzY3JpcHRsZXQiICkpIHsKKyAgICAgICAgICAgICAgICBlcnIuanNwRXJyb3Ioc3RhcnQsICJqc3AuZXJyb3IudW50ZXJtaW5hdGVkIiwKKyAgICAgICAgICAgICAgICAgICAgIiZsdDtqc3A6c2NyaXB0bGV0Jmd0OyIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCQorICAgIC8qKgorICAgICAqIFBhcmFtIDo6PSAnPGpzcDpwYXJhbScgUyBBdHRyaWJ1dGVzIFM/IEVtcHR5Qm9keSBTPworICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwYXJzZVBhcmFtKE5vZGUgcGFyZW50KSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwlpZiAoIXJlYWRlci5tYXRjaGVzKCI8anNwOnBhcmFtIikpIHsKKwkgICAgZXJyLmpzcEVycm9yKHJlYWRlci5tYXJrKCksICJqc3AuZXJyb3IucGFyYW1leHBlY3RlZCIpOworCX0KKwlBdHRyaWJ1dGVzIGF0dHJzID0gcGFyc2VBdHRyaWJ1dGVzKCk7CisJcmVhZGVyLnNraXBTcGFjZXMoKTsKKyAgICAgICAgCisgICAgICAgIE5vZGUgcGFyYW1BY3Rpb25Ob2RlID0gbmV3IE5vZGUuUGFyYW1BY3Rpb24oIGF0dHJzLCBzdGFydCwgcGFyZW50ICk7CisgICAgICAgIAorICAgICAgICBwYXJzZUVtcHR5Qm9keSggcGFyYW1BY3Rpb25Ob2RlLCAianNwOnBhcmFtIiApOworICAgICAgICAKKyAgICAgICAgcmVhZGVyLnNraXBTcGFjZXMoKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIEZvciBJbmNsdWRlOgorICAgICAqIFN0ZEFjdGlvbkNvbnRlbnQgOjo9IEF0dHJpYnV0ZXMgUGFyYW1Cb2R5CisgICAgICoKKyAgICAgKiBQYXJhbUJvZHkgOjo9ICAgRW1wdHlCb2R5CisgICAgICogICAgICAgICAgICAgICB8ICggJz4nIFM/ICggJzxqc3A6YXR0cmlidXRlJyBOYW1lZEF0dHJpYnV0ZXMgKT8KKyAgICAgKiAgICAgICAgICAgICAgICAgICAnPGpzcDpib2R5JworICAgICAqICAgICAgICAgICAgICAgICAgIChKc3BCb2R5UGFyYW0gfCA8VFJBTlNMQVRJT05fRVJST1I+ICkKKyAgICAgKiAgICAgICAgICAgICAgICAgICBTPyBFVGFnCisgICAgICogICAgICAgICAgICAgICAgICkKKyAgICAgKiAgICAgICAgICAgICAgIHwgKCAnPicgUz8gUGFyYW0qIEVUYWcgKQorICAgICAqCisgICAgICogRW1wdHlCb2R5IDo6PSAgICcvPicKKyAgICAgKiAgICAgICAgICAgICAgIHwgKCAnPicgRVRhZyApCisgICAgICogICAgICAgICAgICAgICB8ICggJz4nIFM/ICc8anNwOmF0dHJpYnV0ZScgTmFtZWRBdHRyaWJ1dGVzIEVUYWcgKQorICAgICAqCisgICAgICogSnNwQm9keVBhcmFtIDo6PSBTPyAnPicgUGFyYW0qICc8L2pzcDpib2R5PicKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcGFyc2VJbmNsdWRlKE5vZGUgcGFyZW50KSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwlBdHRyaWJ1dGVzIGF0dHJzID0gcGFyc2VBdHRyaWJ1dGVzKCk7CisJcmVhZGVyLnNraXBTcGFjZXMoKTsKKworICAgICAgICBOb2RlIGluY2x1ZGVOb2RlID0gbmV3IE5vZGUuSW5jbHVkZUFjdGlvbiggYXR0cnMsIHN0YXJ0LCBwYXJlbnQgKTsKKyAgICAgICAgCisgICAgICAgIHBhcnNlT3B0aW9uYWxCb2R5KGluY2x1ZGVOb2RlLCAianNwOmluY2x1ZGUiLCAKKwkJCSAgSkFWQVhfQk9EWV9DT05URU5UX1BBUkFNKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIEZvciBGb3J3YXJkOgorICAgICAqIFN0ZEFjdGlvbkNvbnRlbnQgOjo9IEF0dHJpYnV0ZXMgUGFyYW1Cb2R5CisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHBhcnNlRm9yd2FyZChOb2RlIHBhcmVudCkgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJQXR0cmlidXRlcyBhdHRycyA9IHBhcnNlQXR0cmlidXRlcygpOworCXJlYWRlci5za2lwU3BhY2VzKCk7CisKKyAgICAgICAgTm9kZSBmb3J3YXJkTm9kZSA9IG5ldyBOb2RlLkZvcndhcmRBY3Rpb24oIGF0dHJzLCBzdGFydCwgcGFyZW50ICk7CisgICAgICAgIAorICAgICAgICBwYXJzZU9wdGlvbmFsQm9keShmb3J3YXJkTm9kZSwgImpzcDpmb3J3YXJkIiwKKwkJCSAgSkFWQVhfQk9EWV9DT05URU5UX1BBUkFNKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcGFyc2VJbnZva2UoTm9kZSBwYXJlbnQpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCUF0dHJpYnV0ZXMgYXR0cnMgPSBwYXJzZUF0dHJpYnV0ZXMoKTsKKwlyZWFkZXIuc2tpcFNwYWNlcygpOworCisgICAgICAgIE5vZGUgaW52b2tlTm9kZSA9IG5ldyBOb2RlLkludm9rZUFjdGlvbihhdHRycywgc3RhcnQsIHBhcmVudCk7CisgICAgICAgIAorICAgICAgICBwYXJzZUVtcHR5Qm9keShpbnZva2VOb2RlLCAianNwOmludm9rZSIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwYXJzZURvQm9keShOb2RlIHBhcmVudCkgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJQXR0cmlidXRlcyBhdHRycyA9IHBhcnNlQXR0cmlidXRlcygpOworCXJlYWRlci5za2lwU3BhY2VzKCk7CisKKyAgICAgICAgTm9kZSBkb0JvZHlOb2RlID0gbmV3IE5vZGUuRG9Cb2R5QWN0aW9uKGF0dHJzLCBzdGFydCwgcGFyZW50KTsKKyAgICAgICAgCisgICAgICAgIHBhcnNlRW1wdHlCb2R5KGRvQm9keU5vZGUsICJqc3A6ZG9Cb2R5Iik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHBhcnNlRWxlbWVudChOb2RlIHBhcmVudCkgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJQXR0cmlidXRlcyBhdHRycyA9IHBhcnNlQXR0cmlidXRlcygpOworCXJlYWRlci5za2lwU3BhY2VzKCk7CisKKyAgICAgICAgTm9kZSBlbGVtZW50Tm9kZSA9IG5ldyBOb2RlLkpzcEVsZW1lbnQoYXR0cnMsIHN0YXJ0LCBwYXJlbnQpOworICAgICAgICAKKyAgICAgICAgcGFyc2VPcHRpb25hbEJvZHkoIGVsZW1lbnROb2RlLCAianNwOmVsZW1lbnQiLCAKKyAgICAgICAgICAgIFRhZ0luZm8uQk9EWV9DT05URU5UX0pTUCApOworICAgIH0KKworICAgIC8qCisgICAgICogRm9yIEdldFByb3BlcnR5OgorICAgICAqIFN0ZEFjdGlvbkNvbnRlbnQgOjo9IEF0dHJpYnV0ZXMgRW1wdHlCb2R5CisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHBhcnNlR2V0UHJvcGVydHkoTm9kZSBwYXJlbnQpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCUF0dHJpYnV0ZXMgYXR0cnMgPSBwYXJzZUF0dHJpYnV0ZXMoKTsKKwlyZWFkZXIuc2tpcFNwYWNlcygpOworCisgICAgICAgIE5vZGUgZ2V0UHJvcGVydHlOb2RlID0gbmV3IE5vZGUuR2V0UHJvcGVydHkoIGF0dHJzLCBzdGFydCwgcGFyZW50ICk7CisgICAgICAgIAorICAgICAgICBwYXJzZU9wdGlvbmFsQm9keShnZXRQcm9wZXJ0eU5vZGUsICJqc3A6Z2V0UHJvcGVydHkiLAorCQkJICBUYWdJbmZvLkJPRFlfQ09OVEVOVF9FTVBUWSk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBGb3IgU2V0UHJvcGVydHk6CisgICAgICogU3RkQWN0aW9uQ29udGVudCA6Oj0gQXR0cmlidXRlcyBFbXB0eUJvZHkKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcGFyc2VTZXRQcm9wZXJ0eShOb2RlIHBhcmVudCkgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJQXR0cmlidXRlcyBhdHRycyA9IHBhcnNlQXR0cmlidXRlcygpOworCXJlYWRlci5za2lwU3BhY2VzKCk7CisKKyAgICAgICAgTm9kZSBzZXRQcm9wZXJ0eU5vZGUgPSBuZXcgTm9kZS5TZXRQcm9wZXJ0eSggYXR0cnMsIHN0YXJ0LCBwYXJlbnQgKTsKKyAgICAgICAgCisgICAgICAgIHBhcnNlT3B0aW9uYWxCb2R5KHNldFByb3BlcnR5Tm9kZSwgImpzcDpzZXRQcm9wZXJ0eSIsCisJCQkgIFRhZ0luZm8uQk9EWV9DT05URU5UX0VNUFRZKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIEVtcHR5Qm9keSA6Oj0gICAnLz4nCisgICAgICogICAgICAgICAgICAgICB8ICggJz4nIEVUYWcgKQorICAgICAqICAgICAgICAgICAgICAgfCAoICc+JyBTPyAnPGpzcDphdHRyaWJ1dGUnIE5hbWVkQXR0cmlidXRlcyBFVGFnICkKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcGFyc2VFbXB0eUJvZHkoIE5vZGUgcGFyZW50LCBTdHJpbmcgdGFnICkgCisgICAgICAgIHRocm93cyBKYXNwZXJFeGNlcHRpb24KKyAgICB7CisJaWYoIHJlYWRlci5tYXRjaGVzKCIvPiIpICkgeworICAgICAgICAgICAgLy8gRG9uZQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoIHJlYWRlci5tYXRjaGVzKCAiPiIgKSApIHsKKyAgICAgICAgICAgIGlmKCByZWFkZXIubWF0Y2hlc0VUYWcoIHRhZyApICkgeworICAgICAgICAgICAgICAgIC8vIERvbmUKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoIHJlYWRlci5tYXRjaGVzT3B0aW9uYWxTcGFjZXNGb2xsb3dlZEJ5KAorICAgICAgICAgICAgICAgICI8anNwOmF0dHJpYnV0ZSIgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gUGFyc2UgdGhlIG9uZSBvciBtb3JlIG5hbWVkIGF0dHJpYnV0ZSBub2RlcworICAgICAgICAgICAgICAgIHBhcnNlTmFtZWRBdHRyaWJ1dGVzKCBwYXJlbnQgKTsKKyAgICAgICAgICAgICAgICBpZiggIXJlYWRlci5tYXRjaGVzRVRhZyggdGFnICkgKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEJvZHkgbm90IGFsbG93ZWQKKyAgICAgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKHJlYWRlci5tYXJrKCksCisgICAgICAgICAgICAgICAgICAgICAgICAianNwLmVycm9yLmpzcGJvZHkuZW1wdHlib2R5Lm9ubHkiLAorICAgICAgICAgICAgICAgICAgICAgICAgIiZsdDsiICsgdGFnICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKHJlYWRlci5tYXJrKCksICJqc3AuZXJyb3IuanNwYm9keS5lbXB0eWJvZHkub25seSIsCisgICAgICAgICAgICAgICAgICAgICImbHQ7IiArIHRhZyApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworCSAgICBlcnIuanNwRXJyb3IocmVhZGVyLm1hcmsoKSwgImpzcC5lcnJvci51bnRlcm1pbmF0ZWQiLAorICAgICAgICAgICAgICAgICImbHQ7IiArIHRhZyApOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBGb3IgVXNlQmVhbjoKKyAgICAgKiBTdGRBY3Rpb25Db250ZW50IDo6PSBBdHRyaWJ1dGVzIE9wdGlvbmFsQm9keQorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwYXJzZVVzZUJlYW4oTm9kZSBwYXJlbnQpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCUF0dHJpYnV0ZXMgYXR0cnMgPSBwYXJzZUF0dHJpYnV0ZXMoKTsKKwlyZWFkZXIuc2tpcFNwYWNlcygpOworICAgICAgICAKKyAgICAgICAgTm9kZSB1c2VCZWFuTm9kZSA9IG5ldyBOb2RlLlVzZUJlYW4oIGF0dHJzLCBzdGFydCwgcGFyZW50ICk7CisgICAgICAgIAorICAgICAgICBwYXJzZU9wdGlvbmFsQm9keSggdXNlQmVhbk5vZGUsICJqc3A6dXNlQmVhbiIsIAorICAgICAgICAgICAgVGFnSW5mby5CT0RZX0NPTlRFTlRfSlNQICk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBQYXJzZXMgT3B0aW9uYWxCb2R5LCBidXQgYWxzbyByZXVzZWQgdG8gcGFyc2UgYm9kaWVzIGZvciBwbHVnaW4KKyAgICAgKiBhbmQgcGFyYW0gc2luY2UgdGhlIHN5bnRheCBpcyBpZGVudGljYWwgKHRoZSBvbmx5IHRoaW5nIHRoYXQKKyAgICAgKiBkaWZmZXJzIHN1YnN0YW50aWFsbHkgaXMgaG93IHRvIHByb2Nlc3MgdGhlIGJvZHksIGFuZCB0aHVzCisgICAgICogd2UgYWNjZXB0IHRoZSBib2R5IHR5cGUgYXMgYSBwYXJhbWV0ZXIpLgorICAgICAqCisgICAgICogT3B0aW9uYWxCb2R5IDo6PSBFbXB0eUJvZHkgfCBBY3Rpb25Cb2R5CisgICAgICoKKyAgICAgKiBTY3JpcHRsZXNzT3B0aW9uYWxCb2R5IDo6PSBFbXB0eUJvZHkgfCBTY3JpcHRsZXNzQWN0aW9uQm9keQorICAgICAqCisgICAgICogVGFnRGVwZW5kZW50T3B0aW9uYWxCb2R5IDo6PSBFbXB0eUJvZHkgfCBUYWdEZXBlbmRlbnRBY3Rpb25Cb2R5CisgICAgICoKKyAgICAgKiBFbXB0eUJvZHkgOjo9ICAgJy8+JworICAgICAqICAgICAgICAgICAgICAgfCAoICc+JyBFVGFnICkKKyAgICAgKiAgICAgICAgICAgICAgIHwgKCAnPicgUz8gJzxqc3A6YXR0cmlidXRlJyBOYW1lZEF0dHJpYnV0ZXMgRVRhZyApCisgICAgICoKKyAgICAgKiBBY3Rpb25Cb2R5IDo6PSAgIEpzcEF0dHJpYnV0ZUFuZEJvZHkKKyAgICAgKiAgICAgICAgICAgICAgICB8ICggJz4nIEJvZHkgRVRhZyApCisgICAgICoKKyAgICAgKiBTY3JpcHRsZXNzQWN0aW9uQm9keSA6Oj0gICBKc3BBdHRyaWJ1dGVBbmRCb2R5IAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICB8ICggJz4nIFNjcmlwdGxlc3NCb2R5IEVUYWcgKQorICAgICAqIAorICAgICAqIFRhZ0RlcGVuZGVudEFjdGlvbkJvZHkgOjo9ICAgSnNwQXR0cmlidXRlQW5kQm9keQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKCAnPicgVGFnRGVwZW5kZW50Qm9keSBFVGFnICkKKyAgICAgKgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwYXJzZU9wdGlvbmFsQm9keSggTm9kZSBwYXJlbnQsIFN0cmluZyB0YWcsIFN0cmluZyBib2R5VHlwZSApIAorICAgICAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIAorICAgIHsKKwlpZiAocmVhZGVyLm1hdGNoZXMoIi8+IikpIHsKKwkgICAgLy8gRW1wdHlCb2R5CisJICAgIHJldHVybjsKKwl9CisKKwlpZiAoIXJlYWRlci5tYXRjaGVzKCI+IikpIHsKKwkgICAgZXJyLmpzcEVycm9yKHJlYWRlci5tYXJrKCksICJqc3AuZXJyb3IudW50ZXJtaW5hdGVkIiwKKwkJCSAiJmx0OyIgKyB0YWcgKTsKKwl9CisgICAgICAgIAorICAgICAgICBpZiggcmVhZGVyLm1hdGNoZXNFVGFnKCB0YWcgKSApIHsKKyAgICAgICAgICAgIC8vIEVtcHR5Qm9keQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiggIXBhcnNlSnNwQXR0cmlidXRlQW5kQm9keSggcGFyZW50LCB0YWcsIGJvZHlUeXBlICkgKSB7CisgICAgICAgICAgICAvLyBNdXN0IGJlICggJz4nICMgQm9keSBFVGFnICkKKyAgICAgICAgICAgIHBhcnNlQm9keShwYXJlbnQsIHRhZywgYm9keVR5cGUgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBBdHRlbXB0cyB0byBwYXJzZSAnSnNwQXR0cmlidXRlQW5kQm9keScgcHJvZHVjdGlvbi4gIFJldHVybnMgdHJ1ZSBpZgorICAgICAqIGl0IG1hdGNoZWQsIG9yIGZhbHNlIGlmIG5vdC4gIEFzc3VtZXMgRW1wdHlCb2R5IGlzIG9rYXkgYXMgd2VsbC4KKyAgICAgKgorICAgICAqIEpzcEF0dHJpYnV0ZUFuZEJvZHkgOjo9CisgICAgICogICAgICAgICAgICAgICAgICAoICc+JyAjIFM/ICggJzxqc3A6YXR0cmlidXRlJyBOYW1lZEF0dHJpYnV0ZXMgKT8KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgJzxqc3A6Ym9keScKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgKCBKc3BCb2R5Qm9keSB8IDxUUkFOU0xBVElPTl9FUlJPUj4gKQorICAgICAqICAgICAgICAgICAgICAgICAgICBTPyBFVGFnCisgICAgICogICAgICAgICAgICAgICAgICApCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHBhcnNlSnNwQXR0cmlidXRlQW5kQm9keSggTm9kZSBwYXJlbnQsIFN0cmluZyB0YWcsIAorICAgICAgICBTdHJpbmcgYm9keVR5cGUgKSAKKyAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKKyAgICAgICAgCisgICAgICAgIGlmKCByZWFkZXIubWF0Y2hlc09wdGlvbmFsU3BhY2VzRm9sbG93ZWRCeSggIjxqc3A6YXR0cmlidXRlIiApICkgeworICAgICAgICAgICAgLy8gTWF5IGJlIGFuIEVtcHR5Qm9keSwgZGVwZW5kaW5nIG9uIHdoZXRoZXIKKyAgICAgICAgICAgIC8vIFRoZXJlJ3MgYSAiPGpzcDpib2R5IiBiZWZvcmUgdGhlIEVUYWcKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gRmlyc3QsIHBhcnNlIDxqc3A6YXR0cmlidXRlPiBlbGVtZW50czoKKyAgICAgICAgICAgIHBhcnNlTmFtZWRBdHRyaWJ1dGVzKCBwYXJlbnQgKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYoIHJlYWRlci5tYXRjaGVzT3B0aW9uYWxTcGFjZXNGb2xsb3dlZEJ5KCAiPGpzcDpib2R5IiApICkgeworICAgICAgICAgICAgLy8gQWN0aW9uQm9keQorICAgICAgICAgICAgcGFyc2VKc3BCb2R5KCBwYXJlbnQsIGJvZHlUeXBlICk7CisgICAgICAgICAgICByZWFkZXIuc2tpcFNwYWNlcygpOworICAgICAgICAgICAgaWYoICFyZWFkZXIubWF0Y2hlc0VUYWcoIHRhZyApICkgeworICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcihyZWFkZXIubWFyaygpLCAianNwLmVycm9yLnVudGVybWluYXRlZCIsIAorICAgICAgICAgICAgICAgICAgICAiJmx0OyIgKyB0YWcgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKCByZXN1bHQgJiYgIXJlYWRlci5tYXRjaGVzRVRhZyggdGFnICkgKSB7CisgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIDxqc3A6YXR0cmlidXRlPiBidXQgc29tZXRoaW5nIG90aGVyIHRoYW4KKyAgICAgICAgICAgIC8vIDxqc3A6Ym9keT4gb3IgdGhlIGVuZCB0YWcsIHRyYW5zbGF0aW9uIGVycm9yLgorICAgICAgICAgICAgZXJyLmpzcEVycm9yKHJlYWRlci5tYXJrKCksICJqc3AuZXJyb3IuanNwYm9keS5yZXF1aXJlZCIsIAorICAgICAgICAgICAgICAgICImbHQ7IiArIHRhZyApOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qCisgICAgICogUGFyYW1zIDo6PSAgYD4nIFM/CisgICAgICogICAgICAgICAgICAgICggICAoIGA8anNwOmJvZHk+JworICAgICAqICAgICAgICAgICAgICAgICAgICAoICggUz8gUGFyYW0rIFM/IGA8L2pzcDpib2R5PicgKQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHwgPFRSQU5TTEFUSU9OX0VSUk9SPgorICAgICAqICAgICAgICAgICAgICAgICAgICApCisgICAgICogICAgICAgICAgICAgICAgICApCisgICAgICogICAgICAgICAgICAgICAgfCBQYXJhbSsKKyAgICAgKiAgICAgICAgICAgICAgKQorICAgICAqICAgICAgICAgICAgICAnPC9qc3A6cGFyYW1zPicKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcGFyc2VKc3BQYXJhbXMoTm9kZSBwYXJlbnQpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCU5vZGUganNwUGFyYW1zTm9kZSA9IG5ldyBOb2RlLlBhcmFtc0FjdGlvbihzdGFydCwgcGFyZW50KTsKKwlwYXJzZU9wdGlvbmFsQm9keShqc3BQYXJhbXNOb2RlLCAianNwOnBhcmFtcyIsCisJCQkgIEpBVkFYX0JPRFlfQ09OVEVOVF9QQVJBTSApOworICAgIH0KKworICAgIC8qCisgICAgICogRmFsbGJhY2sgOjo9ICAgJy8+JworICAgICAqICAgICAgICAgICAgICAgfCAoIGA+JyBTPyBgPGpzcDpib2R5PicKKyAgICAgKiAgICAgICAgICAgICAgICAgICAoICAgKCBTPworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICggQ2hhciogLSAoIENoYXIqIGA8L2pzcDpib2R5PicgKSApCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgYDwvanNwOmJvZHk+JyBTPworICAgICAqICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICogICAgICAgICAgICAgICAgICAgICB8IDxUUkFOU0xBVElPTl9FUlJPUj4KKyAgICAgKiAgICAgICAgICAgICAgICAgICApCisgICAgICogICAgICAgICAgICAgICAgICAgYDwvanNwOmZhbGxiYWNrPicKKyAgICAgKiAgICAgICAgICAgICAgICAgKQorICAgICAqICAgICAgICAgICAgICAgfCAoICc+JworICAgICAqICAgICAgICAgICAgICAgICAgICggQ2hhciogLSAoIENoYXIqICc8L2pzcDpmYWxsYmFjaz4nICkgKQorICAgICAqICAgICAgICAgICAgICAgICAgICc8L2pzcDpmYWxsYmFjaz4nCisgICAgICogICAgICAgICAgICAgICAgICkKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcGFyc2VGYWxsQmFjayhOb2RlIHBhcmVudCkgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJTm9kZSBmYWxsQmFja05vZGUgPSBuZXcgTm9kZS5GYWxsQmFja0FjdGlvbihzdGFydCwgcGFyZW50KTsKKwlwYXJzZU9wdGlvbmFsQm9keShmYWxsQmFja05vZGUsICJqc3A6ZmFsbGJhY2siLCAKKwkJCSAgSkFWQVhfQk9EWV9DT05URU5UX1RFTVBMQVRFX1RFWFQpOworICAgIH0KKworICAgIC8qCisgICAgICogRm9yIFBsdWdpbjoKKyAgICAgKiBTdGRBY3Rpb25Db250ZW50IDo6PSBBdHRyaWJ1dGVzIFBsdWdpbkJvZHkKKyAgICAgKgorICAgICAqIFBsdWdpbkJvZHkgOjo9ICAgRW1wdHlCb2R5IAorICAgICAqICAgICAgICAgICAgICAgIHwgKCAnPicgUz8gKCAnPGpzcDphdHRyaWJ1dGUnIE5hbWVkQXR0cmlidXRlcyApPworICAgICAqICAgICAgICAgICAgICAgICAgICAnPGpzcDpib2R5JworICAgICAqICAgICAgICAgICAgICAgICAgICAoIEpzcEJvZHlQbHVnaW5UYWdzIHwgPFRSQU5TTEFUSU9OX0VSUk9SPiApCisgICAgICogICAgICAgICAgICAgICAgICAgIFM/IEVUYWcKKyAgICAgKiAgICAgICAgICAgICAgICAgICkKKyAgICAgKiAgICAgICAgICAgICAgICB8ICggJz4nIFM/IFBsdWdpblRhZ3MgRVRhZyApCisgICAgICoKKyAgICAgKiBFbXB0eUJvZHkgOjo9ICAgJy8+JworICAgICAqICAgICAgICAgICAgICAgfCAoICc+JyBFVGFnICkKKyAgICAgKiAgICAgICAgICAgICAgIHwgKCAnPicgUz8gJzxqc3A6YXR0cmlidXRlJyBOYW1lZEF0dHJpYnV0ZXMgRVRhZyApCisgICAgICoKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcGFyc2VQbHVnaW4oTm9kZSBwYXJlbnQpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCUF0dHJpYnV0ZXMgYXR0cnMgPSBwYXJzZUF0dHJpYnV0ZXMoKTsKKwlyZWFkZXIuc2tpcFNwYWNlcygpOworICAgICAgICAKKwlOb2RlIHBsdWdpbk5vZGUgPSBuZXcgTm9kZS5QbHVnSW4oYXR0cnMsIHN0YXJ0LCBwYXJlbnQpOworICAgICAgICAKKyAgICAgICAgcGFyc2VPcHRpb25hbEJvZHkoIHBsdWdpbk5vZGUsICJqc3A6cGx1Z2luIiwgCisgICAgICAgICAgICBKQVZBWF9CT0RZX0NPTlRFTlRfUExVR0lOICk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBQbHVnaW5UYWdzIDo6PSAoICc8anNwOnBhcmFtcycgUGFyYW1zIFM/ICk/CisgICAgICogICAgICAgICAgICAgICAgKCAnPGpzcDpmYWxsYmFjaycgRmFsbGJhY2s/IFM/ICk/CisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHBhcnNlUGx1Z2luVGFncyggTm9kZSBwYXJlbnQgKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgcmVhZGVyLnNraXBTcGFjZXMoKTsKKyAgICAgICAgCisgICAgICAgIGlmKCByZWFkZXIubWF0Y2hlcyggIjxqc3A6cGFyYW1zIiApICkgeworICAgICAgICAgICAgcGFyc2VKc3BQYXJhbXMoIHBhcmVudCApOworICAgICAgICAgICAgcmVhZGVyLnNraXBTcGFjZXMoKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYoIHJlYWRlci5tYXRjaGVzKCAiPGpzcDpmYWxsYmFjayIgKSApIHsKKyAgICAgICAgICAgIHBhcnNlRmFsbEJhY2soIHBhcmVudCApOworICAgICAgICAgICAgcmVhZGVyLnNraXBTcGFjZXMoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAgICAgCisgICAgLyoKKyAgICAgKiBTdGFuZGFyZEFjdGlvbiA6Oj0gICAnaW5jbHVkZScgICAgICAgU3RkQWN0aW9uQ29udGVudAorICAgICAqICAgICAgICAgICAgICAgICAgICB8ICdmb3J3YXJkJyAgICAgICBTdGRBY3Rpb25Db250ZW50CisgICAgICogICAgICAgICAgICAgICAgICAgIHwgJ2ludm9rZScgICAgICAgIFN0ZEFjdGlvbkNvbnRlbnQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgfCAnZG9Cb2R5JyAgICAgICAgU3RkQWN0aW9uQ29udGVudAorICAgICAqICAgICAgICAgICAgICAgICAgICB8ICdnZXRQcm9wZXJ0eScgICBTdGRBY3Rpb25Db250ZW50CisgICAgICogICAgICAgICAgICAgICAgICAgIHwgJ3NldFByb3BlcnR5JyAgIFN0ZEFjdGlvbkNvbnRlbnQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgfCAndXNlQmVhbicgICAgICAgU3RkQWN0aW9uQ29udGVudAorICAgICAqICAgICAgICAgICAgICAgICAgICB8ICdwbHVnaW4nICAgICAgICBTdGRBY3Rpb25Db250ZW50CisgICAgICogICAgICAgICAgICAgICAgICAgIHwgJ2VsZW1lbnQnICAgICAgIFN0ZEFjdGlvbkNvbnRlbnQKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcGFyc2VTdGFuZGFyZEFjdGlvbihOb2RlIHBhcmVudCkgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJTWFyayBzdGFydCA9IHJlYWRlci5tYXJrKCk7CisKKwlpZiAocmVhZGVyLm1hdGNoZXMoSU5DTFVERV9BQ1RJT04pKSB7CisJICAgIHBhcnNlSW5jbHVkZShwYXJlbnQpOworCX0gZWxzZSBpZiAocmVhZGVyLm1hdGNoZXMoRk9SV0FSRF9BQ1RJT04pKSB7CisJICAgIHBhcnNlRm9yd2FyZChwYXJlbnQpOworCX0gZWxzZSBpZiAocmVhZGVyLm1hdGNoZXMoSU5WT0tFX0FDVElPTikpIHsKKwkgICAgaWYgKCFpc1RhZ0ZpbGUpIHsKKwkJZXJyLmpzcEVycm9yKHJlYWRlci5tYXJrKCksICJqc3AuZXJyb3IuYWN0aW9uLmlzbm90dGFnZmlsZSIsCisJCQkgICAgICImbHQ7anNwOmludm9rZSIpOworCSAgICB9CisJICAgIHBhcnNlSW52b2tlKHBhcmVudCk7CisJfSBlbHNlIGlmIChyZWFkZXIubWF0Y2hlcyhET0JPRFlfQUNUSU9OKSkgeworCSAgICBpZiAoIWlzVGFnRmlsZSkgeworCQllcnIuanNwRXJyb3IocmVhZGVyLm1hcmsoKSwgImpzcC5lcnJvci5hY3Rpb24uaXNub3R0YWdmaWxlIiwKKwkJCSAgICAgIiZsdDtqc3A6ZG9Cb2R5Iik7CisJICAgIH0KKwkgICAgcGFyc2VEb0JvZHkocGFyZW50KTsKKwl9IGVsc2UgaWYgKHJlYWRlci5tYXRjaGVzKEdFVF9QUk9QRVJUWV9BQ1RJT04pKSB7CisJICAgIHBhcnNlR2V0UHJvcGVydHkocGFyZW50KTsKKwl9IGVsc2UgaWYgKHJlYWRlci5tYXRjaGVzKFNFVF9QUk9QRVJUWV9BQ1RJT04pKSB7CisJICAgIHBhcnNlU2V0UHJvcGVydHkocGFyZW50KTsKKwl9IGVsc2UgaWYgKHJlYWRlci5tYXRjaGVzKFVTRV9CRUFOX0FDVElPTikpIHsKKwkgICAgcGFyc2VVc2VCZWFuKHBhcmVudCk7CisJfSBlbHNlIGlmIChyZWFkZXIubWF0Y2hlcyhQTFVHSU5fQUNUSU9OKSkgeworCSAgICBwYXJzZVBsdWdpbihwYXJlbnQpOworCX0gZWxzZSBpZiAocmVhZGVyLm1hdGNoZXMoRUxFTUVOVF9BQ1RJT04pKSB7CisJICAgIHBhcnNlRWxlbWVudChwYXJlbnQpOworCX0gZWxzZSBpZiAocmVhZGVyLm1hdGNoZXMoQVRUUklCVVRFX0FDVElPTikpIHsKKwkgICAgZXJyLmpzcEVycm9yKHN0YXJ0LCAianNwLmVycm9yLm5hbWVkQXR0cmlidXRlLmludmFsaWRVc2UiKTsKKwl9IGVsc2UgaWYgKHJlYWRlci5tYXRjaGVzKEJPRFlfQUNUSU9OKSkgeworCSAgICBlcnIuanNwRXJyb3Ioc3RhcnQsICJqc3AuZXJyb3IuanNwYm9keS5pbnZhbGlkVXNlIik7CisJfSBlbHNlIGlmIChyZWFkZXIubWF0Y2hlcyhGQUxMQkFDS19BQ1RJT04pKSB7CisJICAgIGVyci5qc3BFcnJvcihzdGFydCwgImpzcC5lcnJvci5mYWxsYmFjay5pbnZhbGlkVXNlIik7CisJfSBlbHNlIGlmIChyZWFkZXIubWF0Y2hlcyhQQVJBTVNfQUNUSU9OKSkgeworCSAgICBlcnIuanNwRXJyb3Ioc3RhcnQsICJqc3AuZXJyb3IucGFyYW1zLmludmFsaWRVc2UiKTsKKwl9IGVsc2UgaWYgKHJlYWRlci5tYXRjaGVzKFBBUkFNX0FDVElPTikpIHsKKwkgICAgZXJyLmpzcEVycm9yKHN0YXJ0LCAianNwLmVycm9yLnBhcmFtLmludmFsaWRVc2UiKTsKKwl9IGVsc2UgaWYgKHJlYWRlci5tYXRjaGVzKE9VVFBVVF9BQ1RJT04pKSB7CisJICAgIGVyci5qc3BFcnJvcihzdGFydCwgImpzcC5lcnJvci5qc3BvdXRwdXQuaW52YWxpZFVzZSIpOworCX0gZWxzZSB7CisJICAgIGVyci5qc3BFcnJvcihzdGFydCwgImpzcC5lcnJvci5iYWRTdGFuZGFyZEFjdGlvbiIpOworCX0KKyAgICB9CisKKyAgICAvKgorICAgICAqICMgJzwnIEN1c3RvbUFjdGlvbiBDdXN0b21BY3Rpb25Cb2R5CisgICAgICoKKyAgICAgKiBDdXN0b21BY3Rpb24gOjo9IFRhZ1ByZWZpeCAnOicgQ3VzdG9tQWN0aW9uTmFtZQorICAgICAqCisgICAgICogVGFnUHJlZml4IDo6PSBOYW1lCisgICAgICoKKyAgICAgKiBDdXN0b21BY3Rpb25OYW1lIDo6PSBOYW1lCisgICAgICoKKyAgICAgKiBDdXN0b21BY3Rpb25Cb2R5IDo6PSAgICggQXR0cmlidXRlcyBDdXN0b21BY3Rpb25FbmQgKQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHwgPFRSQU5TTEFUSU9OX0VSUk9SPgorICAgICAqCisgICAgICogQXR0cmlidXRlcyA6Oj0gKCBTIEF0dHJpYnV0ZSApKiBTPworICAgICAqCisgICAgICogQ3VzdG9tQWN0aW9uRW5kIDo6PSAgIEN1c3RvbUFjdGlvblRhZ0RlcGVuZGVudAorICAgICAqICAgICAgICAgICAgICAgICAgICAgfCBDdXN0b21BY3Rpb25KU1BDb250ZW50CisgICAgICogICAgICAgICAgICAgICAgICAgICB8IEN1c3RvbUFjdGlvblNjcmlwdGxlc3NDb250ZW50CisgICAgICoKKyAgICAgKiBDdXN0b21BY3Rpb25UYWdEZXBlbmRlbnQgOjo9IFRhZ0RlcGVuZGVudE9wdGlvbmFsQm9keQorICAgICAqCisgICAgICogQ3VzdG9tQWN0aW9uSlNQQ29udGVudCA6Oj0gT3B0aW9uYWxCb2R5CisgICAgICoKKyAgICAgKiBDdXN0b21BY3Rpb25TY3JpcHRsZXNzQ29udGVudCA6Oj0gU2NyaXB0bGVzc09wdGlvbmFsQm9keQorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBwYXJzZUN1c3RvbVRhZyhOb2RlIHBhcmVudCkgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisKKwlpZiAocmVhZGVyLnBlZWtDaGFyKCkgIT0gJzwnKSB7CisJICAgIHJldHVybiBmYWxzZTsKKwl9CisKKyAgICAgICAgLy8gUGFyc2UgJ0N1c3RvbUFjdGlvbicgcHJvZHVjdGlvbiAodGFnIHByZWZpeCBhbmQgY3VzdG9tIGFjdGlvbiBuYW1lKQorCXJlYWRlci5uZXh0Q2hhcigpOwkvLyBza2lwICc8JworCVN0cmluZyB0YWdOYW1lID0gcmVhZGVyLnBhcnNlVG9rZW4oZmFsc2UpOworCWludCBpID0gdGFnTmFtZS5pbmRleE9mKCc6Jyk7CisJaWYgKGkgPT0gLTEpIHsKKwkgICAgcmVhZGVyLnJlc2V0KHN0YXJ0KTsKKwkgICAgcmV0dXJuIGZhbHNlOworCX0KKworCVN0cmluZyBwcmVmaXggPSB0YWdOYW1lLnN1YnN0cmluZygwLCBpKTsKKwlTdHJpbmcgc2hvcnRUYWdOYW1lID0gdGFnTmFtZS5zdWJzdHJpbmcoaSsxKTsKKworCS8vIENoZWNrIGlmIHRoaXMgaXMgYSB1c2VyLWRlZmluZWQgdGFnLgorCVN0cmluZyB1cmkgPSBwYWdlSW5mby5nZXRVUkkocHJlZml4KTsKKyAgICAgICAgaWYgKHVyaSA9PSBudWxsKSB7CisJICAgIHJlYWRlci5yZXNldChzdGFydCk7CisgICAgICAgICAgICAvLyBSZW1lbWJlciB0aGUgcHJlZml4IGZvciBsYXRlciBlcnJvciBjaGVja2luZworICAgICAgICAgICAgcGFnZUluZm8ucHV0Tm9uQ3VzdG9tVGFnUHJlZml4KHByZWZpeCwgcmVhZGVyLm1hcmsoKSk7CisJICAgIHJldHVybiBmYWxzZTsKKwl9CisKKyAgICAgICAgVGFnTGlicmFyeUluZm8gdGFnTGliSW5mbyA9IHBhZ2VJbmZvLmdldFRhZ2xpYih1cmkpOworCVRhZ0luZm8gdGFnSW5mbyA9IHRhZ0xpYkluZm8uZ2V0VGFnKHNob3J0VGFnTmFtZSk7CisJVGFnRmlsZUluZm8gdGFnRmlsZUluZm8gPSB0YWdMaWJJbmZvLmdldFRhZ0ZpbGUoc2hvcnRUYWdOYW1lKTsKKwlpZiAodGFnSW5mbyA9PSBudWxsICYmIHRhZ0ZpbGVJbmZvID09IG51bGwpIHsKKwkgICAgZXJyLmpzcEVycm9yKHN0YXJ0LCAianNwLmVycm9yLmJhZF90YWciLCBzaG9ydFRhZ05hbWUsIHByZWZpeCk7CisJfQorCUNsYXNzIHRhZ0hhbmRsZXJDbGFzcyA9IG51bGw7CisJaWYgKHRhZ0luZm8gIT0gbnVsbCkgeworCSAgICAvLyBNdXN0IGJlIGEgY2xhc3NpYyB0YWcsIGxvYWQgaXQgaGVyZS4KKwkgICAgLy8gdGFnIGZpbGVzIHdpbGwgYmUgbG9hZGVkIGxhdGVyLCBpbiBUYWdGaWxlUHJvY2Vzc29yCisJICAgIFN0cmluZyBoYW5kbGVyQ2xhc3NOYW1lID0gdGFnSW5mby5nZXRUYWdDbGFzc05hbWUoKTsKKwkgICAgdHJ5IHsKKwkgICAgICAgIHRhZ0hhbmRsZXJDbGFzcyA9IGN0eHQuZ2V0Q2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MoaGFuZGxlckNsYXNzTmFtZSk7CisJICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJICAgICAgICBlcnIuanNwRXJyb3Ioc3RhcnQsICJqc3AuZXJyb3IubG9hZGNsYXNzLnRhZ2hhbmRsZXIiLAorCQkJICAgICBoYW5kbGVyQ2xhc3NOYW1lLCB0YWdOYW1lKTsKKwkgICAgfQorCX0KKworICAgICAgICAvLyBQYXJzZSAnQ3VzdG9tQWN0aW9uQm9keScgcHJvZHVjdGlvbjoKKyAgICAgICAgLy8gQXQgdGhpcyBwb2ludCB3ZSBhcmUgY29tbWl0dGVkIC0gaWYgYW55dGhpbmcgZmFpbHMsIHdlIHByb2R1Y2UKKyAgICAgICAgLy8gYSB0cmFuc2xhdGlvbiBlcnJvci4KKworICAgICAgICAvLyBQYXJzZSAnQXR0cmlidXRlcycgcHJvZHVjdGlvbjoKKwlBdHRyaWJ1dGVzIGF0dHJzID0gcGFyc2VBdHRyaWJ1dGVzKCk7CisJcmVhZGVyLnNraXBTcGFjZXMoKTsKKwkKKyAgICAgICAgLy8gUGFyc2UgJ0N1c3RvbUFjdGlvbkVuZCcgcHJvZHVjdGlvbjoKKwlpZiAocmVhZGVyLm1hdGNoZXMoIi8+IikpIHsKKwkgICAgaWYgKHRhZ0luZm8gIT0gbnVsbCkgeworCQluZXcgTm9kZS5DdXN0b21UYWcodGFnTmFtZSwgcHJlZml4LCBzaG9ydFRhZ05hbWUsIHVyaSwgYXR0cnMsCisJCQkJICAgc3RhcnQsIHBhcmVudCwgdGFnSW5mbywgdGFnSGFuZGxlckNsYXNzKTsKKwkgICAgfSBlbHNlIHsKKwkJbmV3IE5vZGUuQ3VzdG9tVGFnKHRhZ05hbWUsIHByZWZpeCwgc2hvcnRUYWdOYW1lLCB1cmksIGF0dHJzLAorCQkJCSAgIHN0YXJ0LCBwYXJlbnQsIHRhZ0ZpbGVJbmZvKTsKKwkgICAgfQorCSAgICByZXR1cm4gdHJ1ZTsKKwl9CisJCisgICAgICAgIC8vIE5vdyB3ZSBwYXJzZSBvbmUgb2YgJ0N1c3RvbUFjdGlvblRhZ0RlcGVuZGVudCcsIAorICAgICAgICAvLyAnQ3VzdG9tQWN0aW9uSlNQQ29udGVudCcsIG9yICdDdXN0b21BY3Rpb25TY3JpcHRsZXNzQ29udGVudCcuCisgICAgICAgIC8vIGRlcGVuZGluZyBvbiBib2R5LWNvbnRlbnQgaW4gVExELgorCisJLy8gTG9va2luZyBmb3IgYSBib2R5LCBpdCBzdGlsbCBjYW4gYmUgZW1wdHk7IGJ1dCBpZiB0aGVyZSBpcyBhCisJLy8gYSB0YWcgYm9keSwgaXRzIHN5bnRheCB3b3VsZCBiZSBkZXBlbmRlbnQgb24gdGhlIHR5cGUgb2YKKwkvLyBib2R5IGNvbnRlbnQgZGVjbGFyZWQgaW4gdGhlIFRMRC4KKwlTdHJpbmcgYmM7CisJaWYgKHRhZ0luZm8gIT0gbnVsbCkgeworCSAgICBiYyA9IHRhZ0luZm8uZ2V0Qm9keUNvbnRlbnQoKTsKKwl9IGVsc2UgeworCSAgICBiYyA9IHRhZ0ZpbGVJbmZvLmdldFRhZ0luZm8oKS5nZXRCb2R5Q29udGVudCgpOworCX0KKworCU5vZGUgdGFnTm9kZSA9IG51bGw7CisJaWYgKHRhZ0luZm8gIT0gbnVsbCkgeworCSAgICB0YWdOb2RlID0gbmV3IE5vZGUuQ3VzdG9tVGFnKHRhZ05hbWUsIHByZWZpeCwgc2hvcnRUYWdOYW1lLCB1cmksCisJCQkJCSBhdHRycywgc3RhcnQsIHBhcmVudCwgdGFnSW5mbywKKwkJCQkJIHRhZ0hhbmRsZXJDbGFzcyk7CisJfSBlbHNlIHsKKwkgICAgdGFnTm9kZSA9IG5ldyBOb2RlLkN1c3RvbVRhZyh0YWdOYW1lLCBwcmVmaXgsIHNob3J0VGFnTmFtZSwgdXJpLAorCQkJCQkgYXR0cnMsIHN0YXJ0LCBwYXJlbnQsIHRhZ0ZpbGVJbmZvKTsKKwl9CisKKwlwYXJzZU9wdGlvbmFsQm9keSggdGFnTm9kZSwgdGFnTmFtZSwgYmMgKTsKKworCXJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qCisgICAgICogUGFyc2UgZm9yIGEgdGVtcGxhdGUgdGV4dCBzdHJpbmcgdW50aWwgJzwnIG9yICIkeyIgaXMgZW5jb3VudGVyZWQsIAorICAgICAqIHJlY29nbml6aW5nIGVzY2FwZSBzZXF1ZW5jZXMgIlwlIiBhbmQgIlwkIi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcGFyc2VUZW1wbGF0ZVRleHQoTm9kZSBwYXJlbnQpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCisJaWYgKCFyZWFkZXIuaGFzTW9yZUlucHV0KCkpCisJICAgIHJldHVybjsKKworCUNoYXJBcnJheVdyaXRlciB0dGV4dCA9IG5ldyBDaGFyQXJyYXlXcml0ZXIoKTsKKwkvLyBPdXRwdXQgdGhlIGZpcnN0IGNoYXJhY3RlcgorCWludCBjaCA9IHJlYWRlci5uZXh0Q2hhcigpOworCXR0ZXh0LndyaXRlKGNoKTsKKworCXdoaWxlIChyZWFkZXIuaGFzTW9yZUlucHV0KCkpIHsKKwkgICAgY2ggPSByZWFkZXIubmV4dENoYXIoKTsKKwkgICAgaWYgKGNoID09ICc8JykgeworICAgICAgICAgICAgICAgIHJlYWRlci5wdXNoQ2hhcigpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCSAgICBlbHNlIGlmKCBjaCA9PSAnJCcgKSB7CisJCWlmICghcmVhZGVyLmhhc01vcmVJbnB1dCgpKSB7CisJCSAgICB0dGV4dC53cml0ZSgnJCcpOworCQkgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCQljaCA9IHJlYWRlci5uZXh0Q2hhcigpOworCQlpZiAoY2ggPT0gJ3snKSB7CisJCSAgICByZWFkZXIucHVzaENoYXIoKTsKKwkJICAgIHJlYWRlci5wdXNoQ2hhcigpOworCQkgICAgYnJlYWs7CisJCX0KKwkJdHRleHQud3JpdGUoJyQnKTsKKwkJcmVhZGVyLnB1c2hDaGFyKCk7CisJCWNvbnRpbnVlOworCSAgICB9CisJICAgIGVsc2UgaWYgKGNoID09ICdcXCcpIHsKKwkJaWYgKCFyZWFkZXIuaGFzTW9yZUlucHV0KCkpIHsKKwkJICAgIHR0ZXh0LndyaXRlKCdcXCcpOworCQkgICAgYnJlYWs7CisJCX0KKyAgICAgICAgICAgICAgICBjaGFyIG5leHQgPSAoY2hhcilyZWFkZXIucGVla0NoYXIoKTsKKyAgICAgICAgICAgICAgICAvLyBMb29raW5nIGZvciBcJSBvciBcJAorICAgICAgICAgICAgICAgIC8vIFRPRE86IG9ubHkgcmVjb2duaXplIFwkIGlmIGlzRUxJZ25vcmVkIGlzIGZhbHNlLCBidXQgc2luY2UKKyAgICAgICAgICAgICAgICAvLyBpdCBjYW4gYmUgc2V0IGluIGEgcGFnZSBkaXJlY3RpdmUsIGl0IGNhbm5vdCBiZSBkZXRlcm1pbmVkCisgICAgICAgICAgICAgICAgLy8gaGVyZS4gIEFyZ2ghCisgICAgICAgICAgICAgICAgaWYgKG5leHQgPT0gJyUnIHx8IG5leHQgPT0gJyQnKSB7CisgICAgICAgICAgICAgICAgICAgIGNoID0gcmVhZGVyLm5leHRDaGFyKCk7CisgICAgICAgICAgICAgICAgfQorCSAgICB9CisJICAgIHR0ZXh0LndyaXRlKGNoKTsKKwl9CisJbmV3IE5vZGUuVGVtcGxhdGVUZXh0KHR0ZXh0LnRvU3RyaW5nKCksIHN0YXJ0LCBwYXJlbnQpOworICAgIH0KKyAgICAKKyAgICAvKgorICAgICAqIFhNTFRlbXBsYXRlVGV4dCA6Oj0gICAoIFM/ICcvPicgKQorICAgICAqICAgICAgICAgICAgICAgICAgICAgfCAoIFM/ICc+JworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICggKCBDaGFyKiAtICggQ2hhciogKCAnPCcgfCAnJHsnICkgKSApCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAoICckeycgRUxFeHByZXNzaW9uQm9keSApPworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0RTZWN0PworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICkqIEVUYWcKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAqICAgICAgICAgICAgICAgICAgICAgfCA8VFJBTlNMQVRJT05fRVJST1I+CisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHBhcnNlWE1MVGVtcGxhdGVUZXh0KE5vZGUgcGFyZW50KSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgcmVhZGVyLnNraXBTcGFjZXMoKTsKKyAgICAgICAgaWYoICFyZWFkZXIubWF0Y2hlcyggIi8+IiApICkgeworICAgICAgICAgICAgaWYoICFyZWFkZXIubWF0Y2hlcyggIj4iICkgKSB7CisgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKHN0YXJ0LCAianNwLmVycm9yLnVudGVybWluYXRlZCIsCisgICAgICAgICAgICAgICAgICAgICImbHQ7anNwOnRleHQmZ3Q7IiApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ2hhckFycmF5V3JpdGVyIHR0ZXh0ID0gbmV3IENoYXJBcnJheVdyaXRlcigpOworICAgICAgICAgICAgd2hpbGUgKHJlYWRlci5oYXNNb3JlSW5wdXQoKSkgeworICAgICAgICAJaW50IGNoID0gcmVhZGVyLm5leHRDaGFyKCk7CisgICAgICAgICAgICAgICAgaWYoIGNoID09ICc8JyApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIDwhW0NEQVRBWworICAgICAgICAgICAgICAgICAgICBpZiAoIXJlYWRlci5tYXRjaGVzKCIhW0NEQVRBWyIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzdGFydCA9IHJlYWRlci5tYXJrKCk7CisgICAgICAgICAgICAgICAgICAgIE1hcmsgc3RvcCA9IHJlYWRlci5za2lwVW50aWwoIl1dPiIpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RvcCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlcnIuanNwRXJyb3Ioc3RhcnQsICJqc3AuZXJyb3IudW50ZXJtaW5hdGVkIiwgIkNEQVRBIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRleHQgPSByZWFkZXIuZ2V0VGV4dChzdGFydCwgc3RvcCk7CisgICAgICAgICAgICAgICAgICAgIHR0ZXh0LndyaXRlKHRleHQsIDAsIHRleHQubGVuZ3RoKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmKCBjaCA9PSAnXFwnKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghcmVhZGVyLmhhc01vcmVJbnB1dCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0dGV4dC53cml0ZSgnXFwnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCQkgICAgfQorICAgICAgICAgICAgICAgICAgICBjaCA9IHJlYWRlci5uZXh0Q2hhcigpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2ggIT0gJyQnICkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHRleHQud3JpdGUoJ1xcJyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdHRleHQud3JpdGUoY2gpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmKCBjaCA9PSAnJCcgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghcmVhZGVyLmhhc01vcmVJbnB1dCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0dGV4dC53cml0ZSgnJCcpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2ggPSByZWFkZXIubmV4dENoYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoICE9ICd7JykgeworICAgICAgICAgICAgICAgICAgICAgICAgdHRleHQud3JpdGUoJyQnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5wdXNoQ2hhcigpOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgdGVtcGxhdGUgdGV4dCBub2RlCisgICAgICAgICAgICAgICAgICAgIG5ldyBOb2RlLlRlbXBsYXRlVGV4dCggdHRleHQudG9TdHJpbmcoKSwgc3RhcnQsIHBhcmVudCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gTWFyayBhbmQgcGFyc2UgdGhlIEVMIGV4cHJlc3Npb24gYW5kIGNyZWF0ZSBpdHMgbm9kZToKKyAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSByZWFkZXIubWFyaygpOworICAgICAgICAgICAgICAgICAgICBwYXJzZUVMRXhwcmVzc2lvbihwYXJlbnQpOworCisgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gcmVhZGVyLm1hcmsoKTsKKyAgICAgICAgICAgICAgICAgICAgdHRleHQgPSBuZXcgQ2hhckFycmF5V3JpdGVyKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0dGV4dC53cml0ZSggY2ggKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG5ldyBOb2RlLlRlbXBsYXRlVGV4dCggdHRleHQudG9TdHJpbmcoKSwgc3RhcnQsIHBhcmVudCApOworCisJICAgIGlmICghIHJlYWRlci5oYXNNb3JlSW5wdXQoKSkgeworICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvciggc3RhcnQsICJqc3AuZXJyb3IudW50ZXJtaW5hdGVkIiwKKyAgICAgICAgICAgICAgICAgICAgIiZsdDtqc3A6dGV4dCZndDsiICk7CisJICAgIH0gZWxzZSBpZiggIXJlYWRlci5tYXRjaGVzRVRhZ1dpdGhvdXRMZXNzVGhhbiggImpzcDp0ZXh0IiApICkgeworICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvciggc3RhcnQsICJqc3AuZXJyb3IuanNwdGV4dC5iYWRjb250ZW50Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIEFsbEJvZHkgOjo9ICAgICAgICggJzwlLS0nICAgICAgICAgICAgICBKU1BDb21tZW50Qm9keSAgICAgKQorICAgICAqICAgICAgICAgICAgICAgICB8ICggJzwlQCcgICAgICAgICAgICAgICBEaXJlY3RpdmVCb2R5ICAgICAgKQorICAgICAqICAgICAgICAgICAgICAgICB8ICggJzxqc3A6ZGlyZWN0aXZlLicgICBYTUxEaXJlY3RpdmVCb2R5ICAgKQorICAgICAqICAgICAgICAgICAgICAgICB8ICggJzwlIScgICAgICAgICAgICAgICBEZWNsYXJhdGlvbkJvZHkgICAgKQorICAgICAqICAgICAgICAgICAgICAgICB8ICggJzxqc3A6ZGVjbGFyYXRpb24nICBYTUxEZWNsYXJhdGlvbkJvZHkgKQorICAgICAqICAgICAgICAgICAgICAgICB8ICggJzwlPScgICAgICAgICAgICAgICBFeHByZXNzaW9uQm9keSAgICAgKQorICAgICAqICAgICAgICAgICAgICAgICB8ICggJzxqc3A6ZXhwcmVzc2lvbicgICBYTUxFeHByZXNzaW9uQm9keSAgKQorICAgICAqICAgICAgICAgICAgICAgICB8ICggJyR7JyAgICAgICAgICAgICAgICBFTEV4cHJlc3Npb25Cb2R5ICAgKQorICAgICAqICAgICAgICAgICAgICAgICB8ICggJzwlJyAgICAgICAgICAgICAgICBTY3JpcHRsZXRCb2R5ICAgICAgKQorICAgICAqICAgICAgICAgICAgICAgICB8ICggJzxqc3A6c2NyaXB0bGV0JyAgICBYTUxTY3JpcHRsZXRCb2R5ICAgKQorICAgICAqICAgICAgICAgICAgICAgICB8ICggJzxqc3A6dGV4dCcgICAgICAgICBYTUxUZW1wbGF0ZVRleHQgICAgKQorICAgICAqICAgICAgICAgICAgICAgICB8ICggJzxqc3A6JyAgICAgICAgICAgICBTdGFuZGFyZEFjdGlvbiAgICAgKQorICAgICAqICAgICAgICAgICAgICAgICB8ICggJzwnICAgICAgICAgICAgICAgICBDdXN0b21BY3Rpb24KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tQWN0aW9uQm9keSAgICkKKyAgICAgKgkgICAgICAgICAgICAgICB8IFRlbXBsYXRlVGV4dAorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwYXJzZUVsZW1lbnRzKE5vZGUgcGFyZW50KSAKKyAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiAKKyAgICB7CisgICAgICAgIGlmKCBzY3JpcHRsZXNzQ291bnQgPiAwICkgeworICAgICAgICAgICAgLy8gdmM6IFNjcmlwdGxlc3NCb2R5CisgICAgICAgICAgICAvLyBXZSBtdXN0IGZvbGxvdyB0aGUgU2NyaXB0bGVzc0JvZHkgcHJvZHVjdGlvbiBpZiBvbmUgb2YKKyAgICAgICAgICAgIC8vIG91ciBwYXJlbnRzIGlzIFNjcmlwdGxlc3NCb2R5LgorICAgICAgICAgICAgcGFyc2VFbGVtZW50c1NjcmlwdGxlc3MoIHBhcmVudCApOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIAorCXN0YXJ0ID0gcmVhZGVyLm1hcmsoKTsKKwlpZiAocmVhZGVyLm1hdGNoZXMoIjwlLS0iKSkgeworCSAgICBwYXJzZUNvbW1lbnQocGFyZW50KTsKKwl9IGVsc2UgaWYgKHJlYWRlci5tYXRjaGVzKCI8JUAiKSkgeworCSAgICBwYXJzZURpcmVjdGl2ZShwYXJlbnQpOworICAgICAgICB9IGVsc2UgaWYgKHJlYWRlci5tYXRjaGVzKCI8anNwOmRpcmVjdGl2ZS4iKSkgeworICAgICAgICAgICAgcGFyc2VYTUxEaXJlY3RpdmUocGFyZW50KTsKKwl9IGVsc2UgaWYgKHJlYWRlci5tYXRjaGVzKCI8JSEiKSkgeworCSAgICBwYXJzZURlY2xhcmF0aW9uKHBhcmVudCk7CisgICAgICAgIH0gZWxzZSBpZiAocmVhZGVyLm1hdGNoZXMoIjxqc3A6ZGVjbGFyYXRpb24iKSkgeworICAgICAgICAgICAgcGFyc2VYTUxEZWNsYXJhdGlvbihwYXJlbnQpOworICAgICAgICB9IGVsc2UgaWYgKHJlYWRlci5tYXRjaGVzKCI8JT0iKSkgeworICAgICAgICAgICAgcGFyc2VFeHByZXNzaW9uKHBhcmVudCk7CisgICAgICAgIH0gZWxzZSBpZiAocmVhZGVyLm1hdGNoZXMoIjxqc3A6ZXhwcmVzc2lvbiIpKSB7CisgICAgICAgICAgICBwYXJzZVhNTEV4cHJlc3Npb24ocGFyZW50KTsKKwl9IGVsc2UgaWYgKHJlYWRlci5tYXRjaGVzKCI8JSIpKSB7CisJICAgIHBhcnNlU2NyaXB0bGV0KHBhcmVudCk7CisgICAgICAgIH0gZWxzZSBpZiAocmVhZGVyLm1hdGNoZXMoIjxqc3A6c2NyaXB0bGV0IikpIHsKKyAgICAgICAgICAgIHBhcnNlWE1MU2NyaXB0bGV0KHBhcmVudCk7CisgICAgICAgIH0gZWxzZSBpZiAocmVhZGVyLm1hdGNoZXMoIjxqc3A6dGV4dCIpKSB7CisgICAgICAgICAgICBwYXJzZVhNTFRlbXBsYXRlVGV4dChwYXJlbnQpOworICAgICAgICB9IGVsc2UgaWYgKHJlYWRlci5tYXRjaGVzKCIkeyIpKSB7CisgICAgICAgICAgICBwYXJzZUVMRXhwcmVzc2lvbihwYXJlbnQpOworCX0gZWxzZSBpZiAocmVhZGVyLm1hdGNoZXMoIjxqc3A6IikpIHsKKwkgICAgcGFyc2VTdGFuZGFyZEFjdGlvbihwYXJlbnQpOworCX0gZWxzZSBpZiAoIXBhcnNlQ3VzdG9tVGFnKHBhcmVudCkpIHsKKyAgICAgICAgICAgIGNoZWNrVW5iYWxhbmNlZEVuZFRhZygpOworICAgICAgICAgICAgcGFyc2VUZW1wbGF0ZVRleHQocGFyZW50KTsKKwl9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBTY3JpcHRsZXNzQm9keSA6Oj0gICggJzwlLS0nICAgICAgICAgICAgICBKU1BDb21tZW50Qm9keSAgICAgICkKKyAgICAgKiAgICAgICAgICAgICAgICAgICB8ICggJzwlQCcgICAgICAgICAgICAgICBEaXJlY3RpdmVCb2R5ICAgICAgICkKKyAgICAgKiAgICAgICAgICAgICAgICAgICB8ICggJzxqc3A6ZGlyZWN0aXZlLicgICBYTUxEaXJlY3RpdmVCb2R5ICAgICkKKyAgICAgKiAgICAgICAgICAgICAgICAgICB8ICggJzwlIScgICAgICAgICAgICAgICA8VFJBTlNMQVRJT05fRVJST1I+ICkKKyAgICAgKiAgICAgICAgICAgICAgICAgICB8ICggJzxqc3A6ZGVjbGFyYXRpb24nICA8VFJBTlNMQVRJT05fRVJST1I+ICkKKyAgICAgKiAgICAgICAgICAgICAgICAgICB8ICggJzwlPScgICAgICAgICAgICAgICA8VFJBTlNMQVRJT05fRVJST1I+ICkKKyAgICAgKiAgICAgICAgICAgICAgICAgICB8ICggJzxqc3A6ZXhwcmVzc2lvbicgICA8VFJBTlNMQVRJT05fRVJST1I+ICkKKyAgICAgKiAgICAgICAgICAgICAgICAgICB8ICggJzwlJyAgICAgICAgICAgICAgICA8VFJBTlNMQVRJT05fRVJST1I+ICkKKyAgICAgKiAgICAgICAgICAgICAgICAgICB8ICggJzxqc3A6c2NyaXB0bGV0JyAgICA8VFJBTlNMQVRJT05fRVJST1I+ICkKKyAgICAgKiAgICAgICAgICAgICAgICAgICB8ICggJzxqc3A6dGV4dCcgICAgICAgICBYTUxUZW1wbGF0ZVRleHQgICAgICkKKyAgICAgKiAgICAgICAgICAgICAgICAgICB8ICggJyR7JyAgICAgICAgICAgICAgICBFTEV4cHJlc3Npb25Cb2R5ICAgICkKKyAgICAgKiAgICAgICAgICAgICAgICAgICB8ICggJzxqc3A6JyAgICAgICAgICAgICBTdGFuZGFyZEFjdGlvbiAgICAgICkKKyAgICAgKiAgICAgICAgICAgICAgICAgICB8ICggJzwnICAgICAgICAgICAgICAgICBDdXN0b21BY3Rpb24KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21BY3Rpb25Cb2R5ICAgICkKKyAgICAgKiAgICAgICAgICAgICAgICAgICB8IFRlbXBsYXRlVGV4dAorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwYXJzZUVsZW1lbnRzU2NyaXB0bGVzcyhOb2RlIHBhcmVudCkgCisgICAgICAgIHRocm93cyBKYXNwZXJFeGNlcHRpb24gCisgICAgeworICAgICAgICAvLyBLZWVwIHRyYWNrIG9mIGhvdyBtYW55IHNjcmlwdGxlc3Mgbm9kZXMgd2UndmUgZW5jb3VudGVyZWQKKyAgICAgICAgLy8gc28gd2Uga25vdyB3aGV0aGVyIG91ciBjaGlsZCBub2RlcyBhcmUgZm9yY2VkIHNjcmlwdGxlc3MKKyAgICAgICAgc2NyaXB0bGVzc0NvdW50Kys7CisgICAgICAgIAorCXN0YXJ0ID0gcmVhZGVyLm1hcmsoKTsKKwlpZiAocmVhZGVyLm1hdGNoZXMoIjwlLS0iKSkgeworCSAgICBwYXJzZUNvbW1lbnQocGFyZW50KTsKKwl9IGVsc2UgaWYgKHJlYWRlci5tYXRjaGVzKCI8JUAiKSkgeworCSAgICBwYXJzZURpcmVjdGl2ZShwYXJlbnQpOworICAgICAgICB9IGVsc2UgaWYgKHJlYWRlci5tYXRjaGVzKCI8anNwOmRpcmVjdGl2ZS4iKSkgeworICAgICAgICAgICAgcGFyc2VYTUxEaXJlY3RpdmUocGFyZW50KTsKKwl9IGVsc2UgaWYgKHJlYWRlci5tYXRjaGVzKCI8JSEiKSkgeworCSAgICBlcnIuanNwRXJyb3IoIHJlYWRlci5tYXJrKCksICJqc3AuZXJyb3Iubm8uc2NyaXB0bGV0cyIgKTsKKyAgICAgICAgfSBlbHNlIGlmIChyZWFkZXIubWF0Y2hlcygiPGpzcDpkZWNsYXJhdGlvbiIpKSB7CisgICAgICAgICAgICBlcnIuanNwRXJyb3IoIHJlYWRlci5tYXJrKCksICJqc3AuZXJyb3Iubm8uc2NyaXB0bGV0cyIgKTsKKwl9IGVsc2UgaWYgKHJlYWRlci5tYXRjaGVzKCI8JT0iKSkgeworCSAgICBlcnIuanNwRXJyb3IoIHJlYWRlci5tYXJrKCksICJqc3AuZXJyb3Iubm8uc2NyaXB0bGV0cyIgKTsKKyAgICAgICAgfSBlbHNlIGlmIChyZWFkZXIubWF0Y2hlcygiPGpzcDpleHByZXNzaW9uIikpIHsKKyAgICAgICAgICAgIGVyci5qc3BFcnJvciggcmVhZGVyLm1hcmsoKSwgImpzcC5lcnJvci5uby5zY3JpcHRsZXRzIiApOworCX0gZWxzZSBpZiAocmVhZGVyLm1hdGNoZXMoIjwlIikpIHsKKwkgICAgZXJyLmpzcEVycm9yKCByZWFkZXIubWFyaygpLCAianNwLmVycm9yLm5vLnNjcmlwdGxldHMiICk7CisgICAgICAgIH0gZWxzZSBpZiAocmVhZGVyLm1hdGNoZXMoIjxqc3A6c2NyaXB0bGV0IikpIHsKKyAgICAgICAgICAgIGVyci5qc3BFcnJvciggcmVhZGVyLm1hcmsoKSwgImpzcC5lcnJvci5uby5zY3JpcHRsZXRzIiApOworICAgICAgICB9IGVsc2UgaWYgKHJlYWRlci5tYXRjaGVzKCI8anNwOnRleHQiKSkgeworICAgICAgICAgICAgcGFyc2VYTUxUZW1wbGF0ZVRleHQocGFyZW50KTsKKwl9IGVsc2UgaWYgKHJlYWRlci5tYXRjaGVzKCIkeyIpKSB7CisJICAgIHBhcnNlRUxFeHByZXNzaW9uKHBhcmVudCk7CisJfSBlbHNlIGlmIChyZWFkZXIubWF0Y2hlcygiPGpzcDoiKSkgeworCSAgICBwYXJzZVN0YW5kYXJkQWN0aW9uKHBhcmVudCk7CisJfSBlbHNlIGlmICghcGFyc2VDdXN0b21UYWcocGFyZW50KSkgeworICAgICAgICAgICAgY2hlY2tVbmJhbGFuY2VkRW5kVGFnKCk7CisgICAgICAgICAgICBwYXJzZVRlbXBsYXRlVGV4dChwYXJlbnQpOworCX0KKyAgICAgICAgCisgICAgICAgIHNjcmlwdGxlc3NDb3VudC0tOworICAgIH0KKyAgICAKKyAgICAvKgorICAgICAqIFRlbXBsYXRlVGV4dEJvZHkgOjo9ICAgKCAnPCUtLScgICAgICAgICAgICAgIEpTUENvbW1lbnRCb2R5ICAgICAgKQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHwgKCAnPCVAJyAgICAgICAgICAgICAgIERpcmVjdGl2ZUJvZHkgICAgICAgKQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHwgKCAnPGpzcDpkaXJlY3RpdmUuJyAgIFhNTERpcmVjdGl2ZUJvZHkgICAgKQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHwgKCAnPCUhJyAgICAgICAgICAgICAgIDxUUkFOU0xBVElPTl9FUlJPUj4gKQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHwgKCAnPGpzcDpkZWNsYXJhdGlvbicgIDxUUkFOU0xBVElPTl9FUlJPUj4gKQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHwgKCAnPCU9JyAgICAgICAgICAgICAgIDxUUkFOU0xBVElPTl9FUlJPUj4gKQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHwgKCAnPGpzcDpleHByZXNzaW9uJyAgIDxUUkFOU0xBVElPTl9FUlJPUj4gKQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHwgKCAnPCUnICAgICAgICAgICAgICAgIDxUUkFOU0xBVElPTl9FUlJPUj4gKQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHwgKCAnPGpzcDpzY3JpcHRsZXQnICAgIDxUUkFOU0xBVElPTl9FUlJPUj4gKQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHwgKCAnPGpzcDp0ZXh0JyAgICAgICAgIDxUUkFOU0xBVElPTl9FUlJPUj4gKQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHwgKCAnJHsnICAgICAgICAgICAgICAgIDxUUkFOU0xBVElPTl9FUlJPUj4gKQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHwgKCAnPGpzcDonICAgICAgICAgICAgIDxUUkFOU0xBVElPTl9FUlJPUj4gKQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHwgVGVtcGxhdGVUZXh0CisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHBhcnNlRWxlbWVudHNUZW1wbGF0ZVRleHQoTm9kZSBwYXJlbnQpCisgICAgICAgIHRocm93cyBKYXNwZXJFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHN0YXJ0ID0gcmVhZGVyLm1hcmsoKTsKKyAgICAgICAgaWYgKHJlYWRlci5tYXRjaGVzKCI8JS0tIikpIHsKKyAgICAgICAgICAgIHBhcnNlQ29tbWVudChwYXJlbnQpOworICAgICAgICB9IGVsc2UgaWYgKHJlYWRlci5tYXRjaGVzKCI8JUAiKSkgeworICAgICAgICAgICAgcGFyc2VEaXJlY3RpdmUocGFyZW50KTsKKyAgICAgICAgfSBlbHNlIGlmIChyZWFkZXIubWF0Y2hlcygiPGpzcDpkaXJlY3RpdmUuIikpIHsKKyAgICAgICAgICAgIHBhcnNlWE1MRGlyZWN0aXZlKHBhcmVudCk7CisgICAgICAgIH0gZWxzZSBpZiAocmVhZGVyLm1hdGNoZXMoIjwlISIpKSB7CisgICAgICAgICAgICBlcnIuanNwRXJyb3IoIHJlYWRlci5tYXJrKCksICJqc3AuZXJyb3Iubm90LmluLnRlbXBsYXRlIiwKKwkJIkRlY2xhcmF0aW9ucyIgKTsKKyAgICAgICAgfSBlbHNlIGlmIChyZWFkZXIubWF0Y2hlcygiPGpzcDpkZWNsYXJhdGlvbiIpKSB7CisgICAgICAgICAgICBlcnIuanNwRXJyb3IoIHJlYWRlci5tYXJrKCksICJqc3AuZXJyb3Iubm90LmluLnRlbXBsYXRlIiwKKwkJIkRlY2xhcmF0aW9ucyIgKTsKKyAgICAgICAgfSBlbHNlIGlmIChyZWFkZXIubWF0Y2hlcygiPCU9IikpIHsKKyAgICAgICAgICAgIGVyci5qc3BFcnJvciggcmVhZGVyLm1hcmsoKSwgImpzcC5lcnJvci5ub3QuaW4udGVtcGxhdGUiLAorCQkiRXhwcmVzc2lvbnMiICk7CisgICAgICAgIH0gZWxzZSBpZiAocmVhZGVyLm1hdGNoZXMoIjxqc3A6ZXhwcmVzc2lvbiIpKSB7CisgICAgICAgICAgICBlcnIuanNwRXJyb3IoIHJlYWRlci5tYXJrKCksICJqc3AuZXJyb3Iubm90LmluLnRlbXBsYXRlIiwKKwkJIkV4cHJlc3Npb25zIiApOworICAgICAgICB9IGVsc2UgaWYgKHJlYWRlci5tYXRjaGVzKCI8JSIpKSB7CisgICAgICAgICAgICBlcnIuanNwRXJyb3IoIHJlYWRlci5tYXJrKCksICJqc3AuZXJyb3Iubm90LmluLnRlbXBsYXRlIiwKKwkJIlNjcmlwdGxldHMiICk7CisgICAgICAgIH0gZWxzZSBpZiAocmVhZGVyLm1hdGNoZXMoIjxqc3A6c2NyaXB0bGV0IikpIHsKKyAgICAgICAgICAgIGVyci5qc3BFcnJvciggcmVhZGVyLm1hcmsoKSwgImpzcC5lcnJvci5ub3QuaW4udGVtcGxhdGUiLAorCQkiU2NyaXB0bGV0cyIgKTsKKyAgICAgICAgfSBlbHNlIGlmIChyZWFkZXIubWF0Y2hlcygiPGpzcDp0ZXh0IikpIHsKKyAgICAgICAgICAgIGVyci5qc3BFcnJvciggcmVhZGVyLm1hcmsoKSwgImpzcC5lcnJvci5ub3QuaW4udGVtcGxhdGUiLAorCQkiJmx0O2pzcDp0ZXh0IiApOworICAgICAgICB9IGVsc2UgaWYgKHJlYWRlci5tYXRjaGVzKCIkeyIpKSB7CisgICAgICAgICAgICBlcnIuanNwRXJyb3IoIHJlYWRlci5tYXJrKCksICJqc3AuZXJyb3Iubm90LmluLnRlbXBsYXRlIiwKKwkJIkV4cHJlc3Npb24gbGFuZ3VhZ2UiICk7CisgICAgICAgIH0gZWxzZSBpZiAocmVhZGVyLm1hdGNoZXMoIjxqc3A6IikpIHsKKyAgICAgICAgICAgIGVyci5qc3BFcnJvciggcmVhZGVyLm1hcmsoKSwgImpzcC5lcnJvci5ub3QuaW4udGVtcGxhdGUiLAorCQkiU3RhbmRhcmQgYWN0aW9ucyIgKTsKKwl9IGVsc2UgaWYgKHBhcnNlQ3VzdG9tVGFnKHBhcmVudCkpIHsKKyAgICAgICAgICAgIGVyci5qc3BFcnJvciggcmVhZGVyLm1hcmsoKSwgImpzcC5lcnJvci5ub3QuaW4udGVtcGxhdGUiLAorCQkiQ3VzdG9tIGFjdGlvbnMiICk7CisJfSBlbHNlIHsKKyAgICAgICAgICAgIGNoZWNrVW5iYWxhbmNlZEVuZFRhZygpOworICAgICAgICAgICAgcGFyc2VUZW1wbGF0ZVRleHQocGFyZW50KTsKKwl9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBGbGFnIGFzIGVycm9yIGlmIGFuIHVuYmFsYW5jZWQgZW5kIHRhZyBhcHBlYXJzIGJ5IGl0c2VsZi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgY2hlY2tVbmJhbGFuY2VkRW5kVGFnKCkgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKCFyZWFkZXIubWF0Y2hlcygiPC8iKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2hlY2sgZm9yIHVuYmFsYW5jZWQgc3RhbmRhcmQgYWN0aW9ucworICAgICAgICBpZiAocmVhZGVyLm1hdGNoZXMoImpzcDoiKSkgeworICAgICAgICAgICAgZXJyLmpzcEVycm9yKHN0YXJ0LCAianNwLmVycm9yLnVuYmFsYW5jZWQuZW5kdGFnIiwgImpzcDoiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENoZWNrIGZvciB1bmJhbGFuY2VkIGN1c3RvbSBhY3Rpb25zCisgICAgICAgIFN0cmluZyB0YWdOYW1lID0gcmVhZGVyLnBhcnNlVG9rZW4oZmFsc2UpOworICAgICAgICBpbnQgaSA9IHRhZ05hbWUuaW5kZXhPZignOicpOworICAgICAgICBpZiAoaSA9PSAtMSB8fCBwYWdlSW5mby5nZXRVUkkodGFnTmFtZS5zdWJzdHJpbmcoMCwgaSkpID09IG51bGwpIHsKKyAgICAgICAgICAgIHJlYWRlci5yZXNldChzdGFydCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBlcnIuanNwRXJyb3Ioc3RhcnQsICJqc3AuZXJyb3IudW5iYWxhbmNlZC5lbmR0YWciLCB0YWdOYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUYWdEZXBlbmRlbnRCb2R5IDo9IAorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwYXJzZVRhZ0RlcGVuZGVudEJvZHkoTm9kZSBwYXJlbnQsIFN0cmluZyB0YWcpCisJCXRocm93cyBKYXNwZXJFeGNlcHRpb257CisJTWFyayBib2R5U3RhcnQgPSByZWFkZXIubWFyaygpOworCU1hcmsgYm9keUVuZCA9IHJlYWRlci5za2lwVW50aWxFVGFnKHRhZyk7CisJaWYgKGJvZHlFbmQgPT0gbnVsbCkgeworCSAgICBlcnIuanNwRXJyb3Ioc3RhcnQsICJqc3AuZXJyb3IudW50ZXJtaW5hdGVkIiwgIiZsdDsiK3RhZyApOworCX0KKwluZXcgTm9kZS5UZW1wbGF0ZVRleHQocmVhZGVyLmdldFRleHQoYm9keVN0YXJ0LCBib2R5RW5kKSwgYm9keVN0YXJ0LAorCQkJICAgICAgcGFyZW50KTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFBhcnNlcyBqc3A6Ym9keSBhY3Rpb24uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHBhcnNlSnNwQm9keShOb2RlIHBhcmVudCwgU3RyaW5nIGJvZHlUeXBlKSAKKyAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiAKKyAgICB7CisgICAgICAgIE1hcmsgc3RhcnQgPSByZWFkZXIubWFyaygpOworCU5vZGUgYm9keU5vZGUgPSBuZXcgTm9kZS5Kc3BCb2R5KHN0YXJ0LCBwYXJlbnQpOworCisJcmVhZGVyLnNraXBTcGFjZXMoKTsKKwlpZiAoIXJlYWRlci5tYXRjaGVzKCIvPiIpKSB7CisJICAgIGlmICghcmVhZGVyLm1hdGNoZXMoIj4iKSkgeworCQllcnIuanNwRXJyb3Ioc3RhcnQsICJqc3AuZXJyb3IudW50ZXJtaW5hdGVkIiwKKwkJCSAgICAgIiZsdDtqc3A6Ym9keSIpOworCSAgICB9CisJICAgIHBhcnNlQm9keSggYm9keU5vZGUsICJqc3A6Ym9keSIsIGJvZHlUeXBlICk7CisJfQorICAgIH0KKworICAgIC8qCisgICAgICogUGFyc2UgdGhlIGJvZHkgYXMgSlNQIGNvbnRlbnQuCisgICAgICogQHBhcmFtIHRhZyBUaGUgbmFtZSBvZiB0aGUgdGFnIHdob3NlIGVuZCB0YWcgd291bGQgdGVybWluYXRlIHRoZSBib2R5CisgICAgICogQHBhcmFtIGJvZHlUeXBlIE9uZSBvZiB0aGUgVGFnSW5mbyBib2R5IHR5cGVzCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHBhcnNlQm9keShOb2RlIHBhcmVudCwgU3RyaW5nIHRhZywgU3RyaW5nIGJvZHlUeXBlKSAKKyAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiAKKyAgICB7CisgICAgICAgIGlmKCBib2R5VHlwZS5lcXVhbHNJZ25vcmVDYXNlKCBUYWdJbmZvLkJPRFlfQ09OVEVOVF9UQUdfREVQRU5ERU5UICkgKSB7CisgICAgICAgICAgICBwYXJzZVRhZ0RlcGVuZGVudEJvZHkoIHBhcmVudCwgdGFnICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiggYm9keVR5cGUuZXF1YWxzSWdub3JlQ2FzZSggVGFnSW5mby5CT0RZX0NPTlRFTlRfRU1QVFkgKSApIHsKKyAgICAgICAgICAgIGlmKCAhcmVhZGVyLm1hdGNoZXNFVGFnKCB0YWcgKSApIHsKKwkJZXJyLmpzcEVycm9yKHN0YXJ0LCAiamFzcGVyLmVycm9yLmVtcHR5Ym9keWNvbnRlbnQubm9uZW1wdHkiLAorCQkJICAgICB0YWcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoIGJvZHlUeXBlID09IEpBVkFYX0JPRFlfQ09OVEVOVF9QTFVHSU4gKSB7CisgICAgICAgICAgICAvLyAobm90ZSB0aGUgPT0gc2luY2Ugd2Ugd29uJ3QgcmVjb2duaXplIEpBVkFYXyogCisgICAgICAgICAgICAvLyBmcm9tIG91dHNpZGUgdGhpcyBtb2R1bGUpLgorICAgICAgICAgICAgcGFyc2VQbHVnaW5UYWdzKHBhcmVudCk7CisgICAgICAgICAgICBpZiggIXJlYWRlci5tYXRjaGVzRVRhZyggdGFnICkgKSB7CisgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKCByZWFkZXIubWFyaygpLCAianNwLmVycm9yLnVudGVybWluYXRlZCIsCisgICAgICAgICAgICAgICAgICAgICImbHQ7IiArIHRhZyAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKCBib2R5VHlwZS5lcXVhbHNJZ25vcmVDYXNlKCBUYWdJbmZvLkJPRFlfQ09OVEVOVF9KU1AgKSB8fAorICAgICAgICAgICAgYm9keVR5cGUuZXF1YWxzSWdub3JlQ2FzZSggVGFnSW5mby5CT0RZX0NPTlRFTlRfU0NSSVBUTEVTUyApIHx8CisgICAgICAgICAgICAoYm9keVR5cGUgPT0gSkFWQVhfQk9EWV9DT05URU5UX1BBUkFNKSB8fAorICAgICAgICAgICAgKGJvZHlUeXBlID09IEpBVkFYX0JPRFlfQ09OVEVOVF9URU1QTEFURV9URVhUKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHdoaWxlIChyZWFkZXIuaGFzTW9yZUlucHV0KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAocmVhZGVyLm1hdGNoZXNFVGFnKHRhZykpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgbmVzdGVkIGpzcDpib2R5IG9yIGpzcDphdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICBpZiAodGFnLmVxdWFscygianNwOmJvZHkiKSB8fCB0YWcuZXF1YWxzKCJqc3A6YXR0cmlidXRlIikpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5tYXRjaGVzKCI8anNwOmF0dHJpYnV0ZSIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlcnIuanNwRXJyb3IocmVhZGVyLm1hcmsoKSwgImpzcC5lcnJvci5uZXN0ZWQuanNwYXR0cmlidXRlIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocmVhZGVyLm1hdGNoZXMoIjxqc3A6Ym9keSIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlcnIuanNwRXJyb3IocmVhZGVyLm1hcmsoKSwgImpzcC5lcnJvci5uZXN0ZWQuanNwYm9keSIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYoIGJvZHlUeXBlLmVxdWFsc0lnbm9yZUNhc2UoIFRhZ0luZm8uQk9EWV9DT05URU5UX0pTUCApICkgeworICAgICAgICAgICAgICAgICAgICBwYXJzZUVsZW1lbnRzKCBwYXJlbnQgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiggYm9keVR5cGUuZXF1YWxzSWdub3JlQ2FzZSggCisgICAgICAgICAgICAgICAgICAgIFRhZ0luZm8uQk9EWV9DT05URU5UX1NDUklQVExFU1MgKSApIAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcGFyc2VFbGVtZW50c1NjcmlwdGxlc3MoIHBhcmVudCApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmKCBib2R5VHlwZSA9PSBKQVZBWF9CT0RZX0NPTlRFTlRfUEFSQU0gKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIChub3RlIHRoZSA9PSBzaW5jZSB3ZSB3b24ndCByZWNvZ25pemUgSkFWQVhfKiAKKyAgICAgICAgICAgICAgICAgICAgLy8gZnJvbSBvdXRzaWRlIHRoaXMgbW9kdWxlKS4KKyAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBTcGFjZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgcGFyc2VQYXJhbSggcGFyZW50ICk7CisgICAgICAgICAgICAgICAgfQorCQllbHNlIGlmIChib2R5VHlwZSA9PSBKQVZBWF9CT0RZX0NPTlRFTlRfVEVNUExBVEVfVEVYVCkgeworCQkgICAgcGFyc2VFbGVtZW50c1RlbXBsYXRlVGV4dChwYXJlbnQpOworCQl9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlcnIuanNwRXJyb3Ioc3RhcnQsICJqc3AuZXJyb3IudW50ZXJtaW5hdGVkIiwgIiZsdDsiK3RhZyApOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworCSAgICBlcnIuanNwRXJyb3Ioc3RhcnQsICJqYXNwZXIuZXJyb3IuYmFkLmJvZHljb250ZW50LnR5cGUiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogUGFyc2VzIG5hbWVkIGF0dHJpYnV0ZXMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHBhcnNlTmFtZWRBdHRyaWJ1dGVzKE5vZGUgcGFyZW50KSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgZG8geworICAgICAgICAgICAgTWFyayBzdGFydCA9IHJlYWRlci5tYXJrKCk7CisgICAgICAgICAgICBBdHRyaWJ1dGVzIGF0dHJzID0gcGFyc2VBdHRyaWJ1dGVzKCk7CisgICAgICAgICAgICBOb2RlLk5hbWVkQXR0cmlidXRlIG5hbWVkQXR0cmlidXRlTm9kZSA9CisgICAgICAgICAgICAgICAgbmV3IE5vZGUuTmFtZWRBdHRyaWJ1dGUoIGF0dHJzLCBzdGFydCwgcGFyZW50ICk7CisKKyAgICAgICAgICAgIHJlYWRlci5za2lwU3BhY2VzKCk7CisJICAgIGlmICghcmVhZGVyLm1hdGNoZXMoIi8+IikpIHsKKwkJaWYgKCFyZWFkZXIubWF0Y2hlcygiPiIpKSB7CisJCSAgICBlcnIuanNwRXJyb3Ioc3RhcnQsICJqc3AuZXJyb3IudW50ZXJtaW5hdGVkIiwKKwkJCQkgIiZsdDtqc3A6YXR0cmlidXRlIik7CisJCX0KKyAgICAgICAgICAgICAgICBpZiAobmFtZWRBdHRyaWJ1dGVOb2RlLmlzVHJpbSgpKSB7CisgICAgICAgICAgICAgICAgICAgIHJlYWRlci5za2lwU3BhY2VzKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBhcnNlQm9keShuYW1lZEF0dHJpYnV0ZU5vZGUsICJqc3A6YXR0cmlidXRlIiwgCisJCQkgIGdldEF0dHJpYnV0ZUJvZHlUeXBlKHBhcmVudCwKKwkJCQkJICAgICAgIGF0dHJzLmdldFZhbHVlKCJuYW1lIikpKTsKKyAgICAgICAgICAgICAgICBpZiAobmFtZWRBdHRyaWJ1dGVOb2RlLmlzVHJpbSgpKSB7CisgICAgICAgICAgICAgICAgICAgIE5vZGUuTm9kZXMgc3ViRWxlbXMgPSBuYW1lZEF0dHJpYnV0ZU5vZGUuZ2V0Qm9keSgpOworCQkgICAgaWYgKHN1YkVsZW1zICE9IG51bGwpIHsKKwkJCU5vZGUgbGFzdE5vZGUgPSBzdWJFbGVtcy5nZXROb2RlKHN1YkVsZW1zLnNpemUoKSAtIDEpOworCQkJaWYgKGxhc3ROb2RlIGluc3RhbmNlb2YgTm9kZS5UZW1wbGF0ZVRleHQpIHsKKwkJCSAgICAoKE5vZGUuVGVtcGxhdGVUZXh0KWxhc3ROb2RlKS5ydHJpbSgpOworCQkJfQorCQkgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlYWRlci5za2lwU3BhY2VzKCk7CisgICAgICAgIH0gd2hpbGUoIHJlYWRlci5tYXRjaGVzKCAiPGpzcDphdHRyaWJ1dGUiICkgKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZXRlcm1pbmUgdGhlIGJvZHkgdHlwZSBvZiA8anNwOmF0dHJpYnV0ZT4gZnJvbSB0aGUgZW5jbG9zaW5nIG5vZGUKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBnZXRBdHRyaWJ1dGVCb2R5VHlwZShOb2RlIG4sIFN0cmluZyBuYW1lKSB7CisKKwlpZiAobiBpbnN0YW5jZW9mIE5vZGUuQ3VzdG9tVGFnKSB7CisJICAgIFRhZ0luZm8gdGFnSW5mbyA9ICgoTm9kZS5DdXN0b21UYWcpbikuZ2V0VGFnSW5mbygpOworCSAgICBUYWdBdHRyaWJ1dGVJbmZvW10gdGxkQXR0cnMgPSB0YWdJbmZvLmdldEF0dHJpYnV0ZXMoKTsKKwkgICAgZm9yIChpbnQgaT0wOyBpPHRsZEF0dHJzLmxlbmd0aDsgaSsrKSB7CisJCWlmIChuYW1lLmVxdWFscyh0bGRBdHRyc1tpXS5nZXROYW1lKCkpKSB7CisJCSAgICBpZiAodGxkQXR0cnNbaV0uaXNGcmFnbWVudCgpKSB7CisJCSAgICAgICAgcmV0dXJuIFRhZ0luZm8uQk9EWV9DT05URU5UX1NDUklQVExFU1M7CisJCSAgICB9CisJCSAgICBpZiAodGxkQXR0cnNbaV0uY2FuQmVSZXF1ZXN0VGltZSgpKSB7CisJCSAgICAgICAgcmV0dXJuIFRhZ0luZm8uQk9EWV9DT05URU5UX0pTUDsKKwkJICAgIH0KKwkJfQorCSAgICB9CisJICAgIGlmICh0YWdJbmZvLmhhc0R5bmFtaWNBdHRyaWJ1dGVzKCkpIHsKKwkJcmV0dXJuIFRhZ0luZm8uQk9EWV9DT05URU5UX0pTUDsKKwkgICAgfQorCX0gZWxzZSBpZiAobiBpbnN0YW5jZW9mIE5vZGUuSW5jbHVkZUFjdGlvbikgeworCSAgICBpZiAoInBhZ2UiLmVxdWFscyhuYW1lKSkgeworCQlyZXR1cm4gVGFnSW5mby5CT0RZX0NPTlRFTlRfSlNQOworCSAgICB9CisJfSBlbHNlIGlmIChuIGluc3RhbmNlb2YgTm9kZS5Gb3J3YXJkQWN0aW9uKSB7CisJICAgIGlmICgicGFnZSIuZXF1YWxzKG5hbWUpKSB7CisJCXJldHVybiBUYWdJbmZvLkJPRFlfQ09OVEVOVF9KU1A7CisJICAgIH0KKwl9IGVsc2UgaWYgKG4gaW5zdGFuY2VvZiBOb2RlLlNldFByb3BlcnR5KSB7CisJICAgIGlmICgidmFsdWUiLmVxdWFscyhuYW1lKSkgeworCQlyZXR1cm4gVGFnSW5mby5CT0RZX0NPTlRFTlRfSlNQOworCSAgICB9CisJfSBlbHNlIGlmIChuIGluc3RhbmNlb2YgTm9kZS5Vc2VCZWFuKSB7CisJICAgIGlmICgiYmVhbk5hbWUiLmVxdWFscyhuYW1lKSkgeworCQlyZXR1cm4gVGFnSW5mby5CT0RZX0NPTlRFTlRfSlNQOworCSAgICB9CisJfSBlbHNlIGlmIChuIGluc3RhbmNlb2YgTm9kZS5QbHVnSW4pIHsKKwkgICAgaWYgKCJ3aWR0aCIuZXF1YWxzKG5hbWUpIHx8ICJoZWlnaHQiLmVxdWFscyhuYW1lKSkgeworCQlyZXR1cm4gVGFnSW5mby5CT0RZX0NPTlRFTlRfSlNQOworCSAgICB9CisJfSBlbHNlIGlmIChuIGluc3RhbmNlb2YgTm9kZS5QYXJhbUFjdGlvbikgeworCSAgICBpZiAoInZhbHVlIi5lcXVhbHMobmFtZSkpIHsKKwkJcmV0dXJuIFRhZ0luZm8uQk9EWV9DT05URU5UX0pTUDsKKwkgICAgfQorCX0gZWxzZSBpZiAobiBpbnN0YW5jZW9mIE5vZGUuSnNwRWxlbWVudCkgeworCSAgICByZXR1cm4gVGFnSW5mby5CT0RZX0NPTlRFTlRfSlNQOworCX0KKworCXJldHVybiBKQVZBWF9CT0RZX0NPTlRFTlRfVEVNUExBVEVfVEVYVDsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcGFyc2VUYWdGaWxlRGlyZWN0aXZlcyhOb2RlIHBhcmVudCkKKyAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbgorICAgIHsKKwlyZWFkZXIuc2V0U2luZ2xlRmlsZSh0cnVlKTsKKwlyZWFkZXIuc2tpcFVudGlsKCI8Iik7CisgICAgICAgIHdoaWxlIChyZWFkZXIuaGFzTW9yZUlucHV0KCkpIHsKKyAgICAgICAgICAgIHN0YXJ0ID0gcmVhZGVyLm1hcmsoKTsKKyAgICAgICAgICAgIGlmIChyZWFkZXIubWF0Y2hlcygiJS0tIikpIHsKKyAgICAgICAgICAgICAgICBwYXJzZUNvbW1lbnQocGFyZW50KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocmVhZGVyLm1hdGNoZXMoIiVAIikpIHsKKyAgICAgICAgICAgICAgICBwYXJzZURpcmVjdGl2ZShwYXJlbnQpOworICAgICAgICAgICAgfSBlbHNlIGlmIChyZWFkZXIubWF0Y2hlcygianNwOmRpcmVjdGl2ZS4iKSkgeworICAgICAgICAgICAgICAgIHBhcnNlWE1MRGlyZWN0aXZlKHBhcmVudCk7CisgICAgICAgICAgICB9CisJICAgIHJlYWRlci5za2lwVW50aWwoIjwiKTsKKwl9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvUGFyc2VyQ29udHJvbGxlci5qYXZhIGIvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL2NvbXBpbGVyL1BhcnNlckNvbnRyb2xsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmVkODdkCi0tLSAvZGV2L251bGwKKysrIGIvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL2NvbXBpbGVyL1BhcnNlckNvbnRyb2xsZXIuamF2YQpAQCAtMCwwICsxLDYxNSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFzcGVyLmNvbXBpbGVyOworCitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEubmV0LkphclVSTENvbm5lY3Rpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5TdGFjazsKK2ltcG9ydCBqYXZhLnV0aWwuamFyLkphckZpbGU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5KYXNwZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIuSnNwQ29tcGlsYXRpb25Db250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLnhtbHBhcnNlci5YTUxFbmNvZGluZ0RldGVjdG9yOworaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7CisKKy8qKgorICogQ29udHJvbGxlciBmb3IgdGhlIHBhcnNpbmcgb2YgYSBKU1AgcGFnZS4KKyAqIDxwPgorICogVGhlIHNhbWUgUGFyc2VyQ29udHJvbGxlciBpbnN0YW5jZSBpcyB1c2VkIGZvciBhIEpTUCBwYWdlIGFuZCBhbnkgSlNQCisgKiBzZWdtZW50cyBpbmNsdWRlZCBieSBpdCAodmlhIGFuIGluY2x1ZGUgZGlyZWN0aXZlKSwgd2hlcmUgZWFjaCBzZWdtZW50IG1heQorICogYmUgcHJvdmlkZWQgaW4gc3RhbmRhcmQgb3IgWE1MIHN5bnRheC4gVGhpcyBjbGFzcyBzZWxlY3RzIGFuZCBpbnZva2VzIHRoZQorICogYXBwcm9wcmlhdGUgcGFyc2VyIGZvciB0aGUgSlNQIHBhZ2UgYW5kIGl0cyBpbmNsdWRlZCBzZWdtZW50cy4KKyAqCisgKiBAYXV0aG9yIFBpZXJyZSBEZWxpc2xlCisgKiBAYXV0aG9yIEphbiBMdWVoZQorICovCitjbGFzcyBQYXJzZXJDb250cm9sbGVyIGltcGxlbWVudHMgVGFnQ29uc3RhbnRzIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDSEFSU0VUID0gImNoYXJzZXQ9IjsKKworICAgIHByaXZhdGUgSnNwQ29tcGlsYXRpb25Db250ZXh0IGN0eHQ7CisgICAgcHJpdmF0ZSBDb21waWxlciBjb21waWxlcjsKKyAgICBwcml2YXRlIEVycm9yRGlzcGF0Y2hlciBlcnI7CisKKyAgICAvKgorICAgICAqIEluZGljYXRlcyB0aGUgc3ludGF4IChYTUwgb3Igc3RhbmRhcmQpIG9mIHRoZSBmaWxlIGJlaW5nIHByb2Nlc3NlZAorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBpc1htbDsKKworICAgIC8qCisgICAgICogQSBzdGFjayB0byBrZWVwIHRyYWNrIG9mIHRoZSAnY3VycmVudCBiYXNlIGRpcmVjdG9yeScKKyAgICAgKiBmb3IgaW5jbHVkZSBkaXJlY3RpdmVzIHRoYXQgcmVmZXIgdG8gcmVsYXRpdmUgcGF0aHMuCisgICAgICovCisgICAgcHJpdmF0ZSBTdGFjayBiYXNlRGlyU3RhY2sgPSBuZXcgU3RhY2soKTsKKyAgICAKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNFbmNvZGluZ1NwZWNpZmllZEluUHJvbG9nOworCisgICAgcHJpdmF0ZSBTdHJpbmcgc291cmNlRW5jOworCisgICAgcHJpdmF0ZSBib29sZWFuIGlzRGVmYXVsdFBhZ2VFbmNvZGluZzsKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNUYWdGaWxlOworICAgIHByaXZhdGUgYm9vbGVhbiBkaXJlY3RpdmVPbmx5OworCisgICAgLyoKKyAgICAgKiBDb25zdHJ1Y3RvcgorICAgICAqLworICAgIHB1YmxpYyBQYXJzZXJDb250cm9sbGVyKEpzcENvbXBpbGF0aW9uQ29udGV4dCBjdHh0LCBDb21waWxlciBjb21waWxlcikgeworICAgICAgICB0aGlzLmN0eHQgPSBjdHh0OyAKKwl0aGlzLmNvbXBpbGVyID0gY29tcGlsZXI7CisJdGhpcy5lcnIgPSBjb21waWxlci5nZXRFcnJvckRpc3BhdGNoZXIoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSnNwQ29tcGlsYXRpb25Db250ZXh0IGdldEpzcENvbXBpbGF0aW9uQ29udGV4dCAoKSB7CisJcmV0dXJuIGN0eHQ7CisgICAgfQorCisgICAgcHVibGljIENvbXBpbGVyIGdldENvbXBpbGVyICgpIHsKKwlyZXR1cm4gY29tcGlsZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2VzIGEgSlNQIHBhZ2Ugb3IgdGFnIGZpbGUuIFRoaXMgaXMgaW52b2tlZCBieSB0aGUgY29tcGlsZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5GaWxlTmFtZSBUaGUgcGF0aCB0byB0aGUgSlNQIHBhZ2Ugb3IgdGFnIGZpbGUgdG8gYmUgcGFyc2VkLgorICAgICAqLworICAgIHB1YmxpYyBOb2RlLk5vZGVzIHBhcnNlKFN0cmluZyBpbkZpbGVOYW1lKQorCSAgICAgICAgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgSmFzcGVyRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisJLy8gSWYgd2UncmUgcGFyc2luZyBhIHBhY2thZ2VkIHRhZyBmaWxlIG9yIGEgcmVzb3VyY2UgaW5jbHVkZWQgYnkgaXQKKwkvLyAodXNpbmcgYW4gaW5jbHVkZSBkaXJlY3RpdmUpLCBjdHh0LmdldFRhZ0ZpbGVKYXIoKSByZXR1cm5zIHRoZSAKKwkvLyBKQVIgZmlsZSBmcm9tIHdoaWNoIHRvIHJlYWQgdGhlIHRhZyBmaWxlIG9yIGluY2x1ZGVkIHJlc291cmNlLAorCS8vIHJlc3BlY3RpdmVseS4KKyAgICAgICAgaXNUYWdGaWxlID0gY3R4dC5pc1RhZ0ZpbGUoKTsKKyAgICAgICAgZGlyZWN0aXZlT25seSA9IGZhbHNlOworICAgICAgICByZXR1cm4gZG9QYXJzZShpbkZpbGVOYW1lLCBudWxsLCBjdHh0LmdldFRhZ0ZpbGVKYXJVcmwoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJvY2Vzc2VzIGFuIGluY2x1ZGUgZGlyZWN0aXZlIHdpdGggdGhlIGdpdmVuIHBhdGguCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5GaWxlTmFtZSBUaGUgcGF0aCB0byB0aGUgcmVzb3VyY2UgdG8gYmUgaW5jbHVkZWQuCisgICAgICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IG5vZGUgb2YgdGhlIGluY2x1ZGUgZGlyZWN0aXZlLgorICAgICAqIEBwYXJhbSBqYXJGaWxlIFRoZSBKQVIgZmlsZSBmcm9tIHdoaWNoIHRvIHJlYWQgdGhlIGluY2x1ZGVkIHJlc291cmNlLAorICAgICAqIG9yIG51bGwgb2YgdGhlIGluY2x1ZGVkIHJlc291cmNlIGlzIHRvIGJlIHJlYWQgZnJvbSB0aGUgZmlsZXN5c3RlbQorICAgICAqLworICAgIHB1YmxpYyBOb2RlLk5vZGVzIHBhcnNlKFN0cmluZyBpbkZpbGVOYW1lLCBOb2RlIHBhcmVudCwKKwkJCSAgICBVUkwgamFyRmlsZVVybCkKKwkgICAgICAgIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIEphc3BlckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICAvLyBGb3IgZmlsZXMgdGhhdCBhcmUgc3RhdGljYWxseSBpbmNsdWRlZCwgaXNUYWdmaWxlIGFuZCBkaXJlY3RpdmVPbmx5CisgICAgICAgIC8vIHJlbWFpbiB1bmNoYW5nZWQuCisgICAgICAgIHJldHVybiBkb1BhcnNlKGluRmlsZU5hbWUsIHBhcmVudCwgamFyRmlsZVVybCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXh0cmFjdHMgdGFnIGZpbGUgZGlyZWN0aXZlIGluZm9ybWF0aW9uIGZyb20gdGhlIHRhZyBmaWxlIHdpdGggdGhlCisgICAgICogZ2l2ZW4gbmFtZS4KKyAgICAgKgorICAgICAqIFRoaXMgaXMgaW52b2tlZCBieSB0aGUgY29tcGlsZXIgCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5GaWxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgdGFnIGZpbGUgdG8gYmUgcGFyc2VkLgorICAgICAqLworICAgIHB1YmxpYyBOb2RlLk5vZGVzIHBhcnNlVGFnRmlsZURpcmVjdGl2ZXMoU3RyaW5nIGluRmlsZU5hbWUpCisJICAgICAgICB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBKYXNwZXJFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgYm9vbGVhbiBpc1RhZ0ZpbGVTYXZlID0gaXNUYWdGaWxlOworICAgICAgICBib29sZWFuIGRpcmVjdGl2ZU9ubHlTYXZlID0gZGlyZWN0aXZlT25seTsKKyAgICAgICAgaXNUYWdGaWxlID0gdHJ1ZTsKKyAgICAgICAgZGlyZWN0aXZlT25seSA9IHRydWU7CisgICAgICAgIE5vZGUuTm9kZXMgcGFnZSA9IGRvUGFyc2UoaW5GaWxlTmFtZSwgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFVSTCkgY3R4dC5nZXRUYWdGaWxlSmFyVXJscygpLmdldChpbkZpbGVOYW1lKSk7CisgICAgICAgIGRpcmVjdGl2ZU9ubHkgPSBkaXJlY3RpdmVPbmx5U2F2ZTsKKyAgICAgICAgaXNUYWdGaWxlID0gaXNUYWdGaWxlU2F2ZTsKKyAgICAgICAgcmV0dXJuIHBhZ2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2VzIHRoZSBKU1AgcGFnZSBvciB0YWcgZmlsZSB3aXRoIHRoZSBnaXZlbiBwYXRoIG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5GaWxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgSlNQIHBhZ2Ugb3IgdGFnIGZpbGUgdG8gYmUgcGFyc2VkLgorICAgICAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBub2RlIChub24tbnVsbCB3aGVuIHByb2Nlc3NpbmcgYW4gaW5jbHVkZQorICAgICAqIGRpcmVjdGl2ZSkKKyAgICAgKiBAcGFyYW0gaXNUYWdGaWxlIHRydWUgaWYgZmlsZSB0byBiZSBwYXJzZWQgaXMgdGFnIGZpbGUsIGFuZCBmYWxzZSBpZiBpdAorICAgICAqIGlzIGEgcmVndWxhciBKU1AgcGFnZQorICAgICAqIEBwYXJhbSBkaXJlY3RpdmVzT25seSB0cnVlIGlmIHRoZSBmaWxlIHRvIGJlIHBhcnNlZCBpcyBhIHRhZyBmaWxlIGFuZAorICAgICAqIHdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gdGhlIGRpcmVjdGl2ZXMgbmVlZGVkIGZvciBjb25zdHJ1Y3RpbmcgYQorICAgICAqIFRhZ0ZpbGVJbmZvLgorICAgICAqIEBwYXJhbSBqYXJGaWxlIFRoZSBKQVIgZmlsZSBmcm9tIHdoaWNoIHRvIHJlYWQgdGhlIEpTUCBwYWdlIG9yIHRhZyBmaWxlLAorICAgICAqIG9yIG51bGwgaWYgdGhlIEpTUCBwYWdlIG9yIHRhZyBmaWxlIGlzIHRvIGJlIHJlYWQgZnJvbSB0aGUgZmlsZXN5c3RlbQorICAgICAqLworICAgIHByaXZhdGUgTm9kZS5Ob2RlcyBkb1BhcnNlKFN0cmluZyBpbkZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vZGUgcGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTCBqYXJGaWxlVXJsKQorCSAgICAgICAgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgSmFzcGVyRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisKKwlOb2RlLk5vZGVzIHBhcnNlZFBhZ2UgPSBudWxsOworCWlzRW5jb2RpbmdTcGVjaWZpZWRJblByb2xvZyA9IGZhbHNlOworCWlzRGVmYXVsdFBhZ2VFbmNvZGluZyA9IGZhbHNlOworCisJSmFyRmlsZSBqYXJGaWxlID0gZ2V0SmFyRmlsZShqYXJGaWxlVXJsKTsKKwlTdHJpbmcgYWJzRmlsZU5hbWUgPSByZXNvbHZlRmlsZU5hbWUoaW5GaWxlTmFtZSk7CisJU3RyaW5nIGpzcENvbmZpZ1BhZ2VFbmMgPSBnZXRKc3BDb25maWdQYWdlRW5jb2RpbmcoYWJzRmlsZU5hbWUpOworCisJLy8gRmlndXJlIG91dCB3aGF0IHR5cGUgb2YgSlNQIGRvY3VtZW50IGFuZCBlbmNvZGluZyB0eXBlIHdlIGFyZQorCS8vIGRlYWxpbmcgd2l0aAorCWRldGVybWluZVN5bnRheEFuZEVuY29kaW5nKGFic0ZpbGVOYW1lLCBqYXJGaWxlLCBqc3BDb25maWdQYWdlRW5jKTsKKworCWlmIChwYXJlbnQgIT0gbnVsbCkgeworCSAgICAvLyBJbmNsdWRlZCByZXNvdXJjZSwgYWRkIHRvIGRlcGVuZGVudCBsaXN0CisJICAgIGNvbXBpbGVyLmdldFBhZ2VJbmZvKCkuYWRkRGVwZW5kYW50KGFic0ZpbGVOYW1lKTsKKwl9CisKKwlpZiAoaXNYbWwgJiYgaXNFbmNvZGluZ1NwZWNpZmllZEluUHJvbG9nKSB7CisJICAgIC8qCisJICAgICAqIE1ha2Ugc3VyZSB0aGUgZW5jb2RpbmcgZXhwbGljaXRseSBzcGVjaWZpZWQgaW4gdGhlIFhNTAorCSAgICAgKiBwcm9sb2cgKGlmIGFueSkgbWF0Y2hlcyB0aGF0IGluIHRoZSBKU1AgY29uZmlnIGVsZW1lbnQKKwkgICAgICogKGlmIGFueSksIHRyZWF0aW5nICJVVEYtMTYiLCAiVVRGLTE2QkUiLCBhbmQgIlVURi0xNkxFIiBhcworCSAgICAgKiBpZGVudGljYWwuCisJICAgICAqLworCSAgICBpZiAoanNwQ29uZmlnUGFnZUVuYyAhPSBudWxsICYmICFqc3BDb25maWdQYWdlRW5jLmVxdWFscyhzb3VyY2VFbmMpCisJCSAgICAgICAgJiYgKCFqc3BDb25maWdQYWdlRW5jLnN0YXJ0c1dpdGgoIlVURi0xNiIpCisJCQkgICAgfHwgIXNvdXJjZUVuYy5zdGFydHNXaXRoKCJVVEYtMTYiKSkpIHsKKwkJZXJyLmpzcEVycm9yKCJqc3AuZXJyb3IucHJvbG9nX2NvbmZpZ19lbmNvZGluZ19taXNtYXRjaCIsCisJCQkgICAgIHNvdXJjZUVuYywganNwQ29uZmlnUGFnZUVuYyk7CisJICAgIH0KKwl9CisKKwkvLyBEaXNwYXRjaCB0byB0aGUgYXBwcm9wcmlhdGUgcGFyc2VyCisJaWYgKGlzWG1sKSB7CisJICAgIC8vIEpTUCBkb2N1bWVudCAoWE1MIHN5bnRheCkKKyAgICAgICAgICAgIC8vIElucHV0U3RyZWFtIGZvciBqc3B4IHBhZ2UgaXMgY3JlYXRlZCBhbmQgcHJvcGVybHkgY2xvc2VkIGluCisgICAgICAgICAgICAvLyBKc3BEb2N1bWVudFBhcnNlci4KKyAgICAgICAgICAgIHBhcnNlZFBhZ2UgPSBKc3BEb2N1bWVudFBhcnNlci5wYXJzZSh0aGlzLCBhYnNGaWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXJGaWxlLCBwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNUYWdGaWxlLCBkaXJlY3RpdmVPbmx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc3BDb25maWdQYWdlRW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRW5jb2RpbmdTcGVjaWZpZWRJblByb2xvZyk7CisJfSBlbHNlIHsKKwkgICAgLy8gU3RhbmRhcmQgc3ludGF4CisJICAgIElucHV0U3RyZWFtUmVhZGVyIGluU3RyZWFtUmVhZGVyID0gbnVsbDsKKwkgICAgdHJ5IHsKKwkJaW5TdHJlYW1SZWFkZXIgPSBKc3BVdGlsLmdldFJlYWRlcihhYnNGaWxlTmFtZSwgc291cmNlRW5jLAorCQkJCQkJICAgamFyRmlsZSwgY3R4dCwgZXJyKTsKKwkJSnNwUmVhZGVyIGpzcFJlYWRlciA9IG5ldyBKc3BSZWFkZXIoY3R4dCwgYWJzRmlsZU5hbWUsCisJCQkJCQkgICAgc291cmNlRW5jLCBpblN0cmVhbVJlYWRlciwKKwkJCQkJCSAgICBlcnIpOworICAgICAgICAgICAgICAgIHBhcnNlZFBhZ2UgPSBQYXJzZXIucGFyc2UodGhpcywganNwUmVhZGVyLCBwYXJlbnQsIGlzVGFnRmlsZSwKKwkJCQkJICBkaXJlY3RpdmVPbmx5LCBqYXJGaWxlVXJsLAorCQkJCQkgIHNvdXJjZUVuYywganNwQ29uZmlnUGFnZUVuYywKKwkJCQkJICBpc0RlZmF1bHRQYWdlRW5jb2RpbmcpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKwkJaWYgKGluU3RyZWFtUmVhZGVyICE9IG51bGwpIHsKKwkJICAgIHRyeSB7CisJCQlpblN0cmVhbVJlYWRlci5jbG9zZSgpOworCQkgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGFueSkgeworCQkgICAgfQorCQl9CisJICAgIH0KKwl9CisKKwlpZiAoamFyRmlsZSAhPSBudWxsKSB7CisJICAgIHRyeSB7CisJCWphckZpbGUuY2xvc2UoKTsKKwkgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHt9CisJfQorCisJYmFzZURpclN0YWNrLnBvcCgpOworCisJcmV0dXJuIHBhcnNlZFBhZ2U7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDaGVja3MgdG8gc2VlIGlmIHRoZSBnaXZlbiBVUkkgaXMgbWF0Y2hlZCBieSBhIFVSTCBwYXR0ZXJuIHNwZWNpZmllZCBpbgorICAgICAqIGEganNwLXByb3BlcnR5LWdyb3VwIGluIHdlYi54bWwsIGFuZCBpZiBzbywgcmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlCisgICAgICogPHBhZ2UtZW5jb2Rpbmc+IGVsZW1lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWJzRmlsZU5hbWUgVGhlIFVSSSB0byBtYXRjaAorICAgICAqCisgICAgICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIDxwYWdlLWVuY29kaW5nPiBhdHRyaWJ1dGUgb2YgdGhlIAorICAgICAqIGpzcC1wcm9wZXJ0eS1ncm91cCB3aXRoIG1hdGNoaW5nIFVSTCBwYXR0ZXJuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0SnNwQ29uZmlnUGFnZUVuY29kaW5nKFN0cmluZyBhYnNGaWxlTmFtZSkKKyAgICAgICAgICAgIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCisJSnNwQ29uZmlnIGpzcENvbmZpZyA9IGN0eHQuZ2V0T3B0aW9ucygpLmdldEpzcENvbmZpZygpOworCUpzcENvbmZpZy5Kc3BQcm9wZXJ0eSBqc3BQcm9wZXJ0eQorCSAgICA9IGpzcENvbmZpZy5maW5kSnNwUHJvcGVydHkoYWJzRmlsZU5hbWUpOworCXJldHVybiBqc3BQcm9wZXJ0eS5nZXRQYWdlRW5jb2RpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZXRlcm1pbmVzIHRoZSBzeW50YXggKHN0YW5kYXJkIG9yIFhNTCkgYW5kIHBhZ2UgZW5jb2RpbmcgcHJvcGVydGllcworICAgICAqIGZvciB0aGUgZ2l2ZW4gZmlsZSwgYW5kIHN0b3JlcyB0aGVtIGluIHRoZSAnaXNYbWwnIGFuZCAnc291cmNlRW5jJworICAgICAqIGluc3RhbmNlIHZhcmlhYmxlcywgcmVzcGVjdGl2ZWx5LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBkZXRlcm1pbmVTeW50YXhBbmRFbmNvZGluZyhTdHJpbmcgYWJzRmlsZU5hbWUsCisJCQkJCSAgICBKYXJGaWxlIGphckZpbGUsCisJCQkJCSAgICBTdHJpbmcganNwQ29uZmlnUGFnZUVuYykKKwkgICAgICAgIHRocm93cyBKYXNwZXJFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKworCWlzWG1sID0gZmFsc2U7CisKKwkvKgorCSAqICd0cnVlJyBpZiB0aGUgc3ludGF4IChYTUwgb3Igc3RhbmRhcmQpIG9mIHRoZSBmaWxlIGlzIGdpdmVuCisJICogZnJvbSBleHRlcm5hbCBpbmZvcm1hdGlvbjogZWl0aGVyIHZpYSBhIEpTUCBjb25maWd1cmF0aW9uIGVsZW1lbnQsCisJICogdGhlICIuanNweCIgc3VmZml4LCBvciB0aGUgZW5jbG9zaW5nIGZpbGUgKGZvciBpbmNsdWRlZCByZXNvdXJjZXMpCisJICovCisJYm9vbGVhbiBpc0V4dGVybmFsID0gZmFsc2U7CisKKwkvKgorCSAqIEluZGljYXRlcyB3aGV0aGVyIHdlIG5lZWQgdG8gcmV2ZXJ0IGZyb20gdGVtcG9yYXJ5IHVzYWdlIG9mCisJICogIklTTy04ODU5LTEiIGJhY2sgdG8gIlVURi04IgorCSAqLworCWJvb2xlYW4gcmV2ZXJ0ID0gZmFsc2U7CisKKyAgICAgICAgSnNwQ29uZmlnIGpzcENvbmZpZyA9IGN0eHQuZ2V0T3B0aW9ucygpLmdldEpzcENvbmZpZygpOworICAgICAgICBKc3BDb25maWcuSnNwUHJvcGVydHkganNwUHJvcGVydHkgPSBqc3BDb25maWcuZmluZEpzcFByb3BlcnR5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFic0ZpbGVOYW1lKTsKKyAgICAgICAgaWYgKGpzcFByb3BlcnR5LmlzWG1sKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gSWYgPGlzLXhtbD4gaXMgc3BlY2lmaWVkIGluIGEgPGpzcC1wcm9wZXJ0eS1ncm91cD4sIGl0IGlzIHVzZWQuCisgICAgICAgICAgICBpc1htbCA9IEpzcFV0aWwuYm9vbGVhblZhbHVlKGpzcFByb3BlcnR5LmlzWG1sKCkpOworCSAgICBpc0V4dGVybmFsID0gdHJ1ZTsKKwl9IGVsc2UgaWYgKGFic0ZpbGVOYW1lLmVuZHNXaXRoKCIuanNweCIpCisJCSAgIHx8IGFic0ZpbGVOYW1lLmVuZHNXaXRoKCIudGFneCIpKSB7CisJICAgIGlzWG1sID0gdHJ1ZTsKKwkgICAgaXNFeHRlcm5hbCA9IHRydWU7CisJfQorCQorCWlmIChpc0V4dGVybmFsICYmICFpc1htbCkgeworCSAgICAvLyBKU1AgKHN0YW5kYXJkKSBzeW50YXguIFVzZSBlbmNvZGluZyBzcGVjaWZpZWQgaW4ganNwLWNvbmZpZworCSAgICAvLyBpZiBwcm92aWRlZC4KKwkgICAgc291cmNlRW5jID0ganNwQ29uZmlnUGFnZUVuYzsKKwkgICAgaWYgKHNvdXJjZUVuYyAhPSBudWxsKSB7CisJCXJldHVybjsKKwkgICAgfQorCSAgICAvLyBXZSBkb24ndCBrbm93IHRoZSBlbmNvZGluZworCSAgICBzb3VyY2VFbmMgPSAiSVNPLTg4NTktMSI7CisJfSBlbHNlIHsKKwkgICAgLy8gWE1MIHN5bnRheCBvciB1bmtub3duLCAoYXV0bylkZXRlY3QgZW5jb2RpbmcgLi4uCisJICAgIE9iamVjdFtdIHJldCA9IFhNTEVuY29kaW5nRGV0ZWN0b3IuZ2V0RW5jb2RpbmcoYWJzRmlsZU5hbWUsCisJCQkJCQkJICAgamFyRmlsZSwgY3R4dCwgZXJyKTsKKwkgICAgc291cmNlRW5jID0gKFN0cmluZykgcmV0WzBdOworCSAgICBpZiAoKChCb29sZWFuKSByZXRbMV0pLmJvb2xlYW5WYWx1ZSgpKSB7CisJCWlzRW5jb2RpbmdTcGVjaWZpZWRJblByb2xvZyA9IHRydWU7CisJICAgIH0KKworCSAgICBpZiAoIWlzWG1sICYmIHNvdXJjZUVuYy5lcXVhbHMoIlVURi04IikpIHsKKwkJLyoKKwkJICogV2UgZG9uJ3Qga25vdyBpZiB3ZSdyZSBkZWFsaW5nIHdpdGggWE1MIG9yIHN0YW5kYXJkIHN5bnRheC4KKwkJICogVGhlcmVmb3JlLCB3ZSBuZWVkIHRvIGNoZWNrIHRvIHNlZSBpZiB0aGUgcGFnZSBjb250YWlucworCQkgKiBhIDxqc3A6cm9vdD4gZWxlbWVudC4KKwkJICoKKwkJICogV2UgbmVlZCB0byBiZSBjYXJlZnVsLCBiZWNhdXNlIHRoZSBwYWdlIG1heSBiZSBlbmNvZGVkIGluCisJCSAqIElTTy04ODU5LTEgKG9yIHNvbWV0aGluZyBlbnRpcmVseSBkaWZmZXJlbnQpLCBhbmQgbWF5CisJCSAqIGNvbnRhaW4gYnl0ZSBzZXF1ZW5jZXMgdGhhdCB3aWxsIGNhdXNlIGEgVVRGLTggY29udmVydGVyIHRvCisJCSAqIHRocm93IGV4Y2VwdGlvbnMuIAorCQkgKgorCQkgKiBJdCBpcyBzYWZlIHRvIHVzZSBhIHNvdXJjZSBlbmNvZGluZyBvZiBJU08tODg1OS0xIGluIHRoaXMKKwkJICogY2FzZSwgYXMgdGhlcmUgYXJlIG5vIGludmFsaWQgYnl0ZSBzZXF1ZW5jZXMgaW4gSVNPLTg4NTktMSwKKwkJICogYW5kIHRoZSBieXRlL2NoYXJhY3RlciBzZXF1ZW5jZXMgd2UncmUgbG9va2luZyBmb3IgKGkuZS4sCisJCSAqIDxqc3A6cm9vdD4pIGFyZSBpZGVudGljYWwgaW4gZWl0aGVyIGVuY29kaW5nIChib3RoIFVURi04CisJCSAqIGFuZCBJU08tODg1OS0xIGFyZSBleHRlbnNpb25zIG9mIEFTQ0lJKS4KKwkJICovCisJCXNvdXJjZUVuYyA9ICJJU08tODg1OS0xIjsKKwkJcmV2ZXJ0ID0gdHJ1ZTsKKwkgICAgfQorCX0KKworCWlmIChpc1htbCkgeworCSAgICAvLyAoVGhpcyBpbXBsaWVzICdpc0V4dGVybmFsJyBpcyBUUlVFLikKKwkgICAgLy8gV2Uga25vdyB3ZSdyZSBkZWFsaW5nIHdpdGggYSBKU1AgZG9jdW1lbnQgKHZpYSBKU1AgY29uZmlnIG9yCisJICAgIC8vICIuanNweCIgc3VmZml4KSwgc28gd2UncmUgZG9uZS4KKwkgICAgcmV0dXJuOworCX0KKworCS8qCisJICogQXQgdGhpcyBwb2ludCwgJ2lzRXh0ZXJuYWwnIG9yICdpc1htbCcgaXMgRkFMU0UuCisJICogU2VhcmNoIGZvciBqc3A6cm9vdCBhY3Rpb24sIGluIG9yZGVyIHRvIGRldGVybWluZSBpZiB3ZSdyZSBkZWFsaW5nIAorCSAqIHdpdGggWE1MIG9yIHN0YW5kYXJkIHN5bnRheCAodW5sZXNzIHdlIGFscmVhZHkga25vdyB3aGF0IHdlJ3JlIAorCSAqIGRlYWxpbmcgd2l0aCwgaS5lLiwgd2hlbiAnaXNFeHRlcm5hbCcgaXMgVFJVRSBhbmQgJ2lzWG1sJyBpcyBGQUxTRSkuCisJICogTm8gY2hlY2sgZm9yIFhNTCBwcm9sb2csIHNpbmNlIG5vdGhpbmcgcHJldmVudHMgYSBwYWdlIGZyb20KKwkgKiBvdXRwdXR0aW5nIFhNTCBhbmQgc3RpbGwgdXNpbmcgSlNQIHN5bnRheCAoaW4gdGhpcyBjYXNlLCB0aGUgCisJICogWE1MIHByb2xvZyBpcyB0cmVhdGVkIGFzIHRlbXBsYXRlIHRleHQpLgorCSAqLworCUpzcFJlYWRlciBqc3BSZWFkZXIgPSBudWxsOworCXRyeSB7CisJICAgIGpzcFJlYWRlciA9IG5ldyBKc3BSZWFkZXIoY3R4dCwgYWJzRmlsZU5hbWUsIHNvdXJjZUVuYywgamFyRmlsZSwKKwkJCQkgICAgICBlcnIpOworCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBleCkgeworCSAgICB0aHJvdyBuZXcgSmFzcGVyRXhjZXB0aW9uKGV4KTsKKwl9CisgICAgICAgIGpzcFJlYWRlci5zZXRTaW5nbGVGaWxlKHRydWUpOworICAgICAgICBNYXJrIHN0YXJ0TWFyayA9IGpzcFJlYWRlci5tYXJrKCk7CisJaWYgKCFpc0V4dGVybmFsKSB7CisJICAgIGpzcFJlYWRlci5yZXNldChzdGFydE1hcmspOworCSAgICBpZiAoaGFzSnNwUm9vdChqc3BSZWFkZXIpKSB7CisJICAgICAgICBpc1htbCA9IHRydWU7CisJCWlmIChyZXZlcnQpIHNvdXJjZUVuYyA9ICJVVEYtOCI7CisJCXJldHVybjsKKwkgICAgfSBlbHNlIHsKKwkgICAgICAgIGlzWG1sID0gZmFsc2U7CisJICAgIH0KKwl9CisKKwkvKgorCSAqIEF0IHRoaXMgcG9pbnQsIHdlIGtub3cgd2UncmUgZGVhbGluZyB3aXRoIEpTUCBzeW50YXguCisJICogSWYgYW4gWE1MIHByb2xvZyBpcyBwcm92aWRlZCwgaXQncyB0cmVhdGVkIGFzIHRlbXBsYXRlIHRleHQuCisJICogRGV0ZXJtaW5lIHRoZSBwYWdlIGVuY29kaW5nIGZyb20gdGhlIHBhZ2UgZGlyZWN0aXZlLCB1bmxlc3MgaXQncworCSAqIHNwZWNpZmllZCB2aWEgSlNQIGNvbmZpZy4KKwkgKi8KKwlzb3VyY2VFbmMgPSBqc3BDb25maWdQYWdlRW5jOworCWlmIChzb3VyY2VFbmMgPT0gbnVsbCkgeworCSAgICBzb3VyY2VFbmMgPSBnZXRQYWdlRW5jb2RpbmdGb3JKc3BTeW50YXgoanNwUmVhZGVyLCBzdGFydE1hcmspOworCSAgICBpZiAoc291cmNlRW5jID09IG51bGwpIHsKKwkJLy8gRGVmYXVsdCB0byAiSVNPLTg4NTktMSIgcGVyIEpTUCBzcGVjCisJCXNvdXJjZUVuYyA9ICJJU08tODg1OS0xIjsKKwkJaXNEZWZhdWx0UGFnZUVuY29kaW5nID0gdHJ1ZTsKKwkgICAgfQorCX0KKyAgICB9CisgICAgCisgICAgLyoKKyAgICAgKiBEZXRlcm1pbmVzIHBhZ2Ugc291cmNlIGVuY29kaW5nIGZvciBwYWdlIG9yIHRhZyBmaWxlIGluIEpTUCBzeW50YXgsCisgICAgICogYnkgcmVhZGluZyAoaW4gdGhpcyBvcmRlcikgdGhlIHZhbHVlIG9mIHRoZSAncGFnZUVuY29kaW5nJyBwYWdlCisgICAgICogZGlyZWN0aXZlIGF0dHJpYnV0ZSwgb3IgdGhlIGNoYXJzZXQgdmFsdWUgb2YgdGhlICdjb250ZW50VHlwZScgcGFnZQorICAgICAqIGRpcmVjdGl2ZSBhdHRyaWJ1dGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBwYWdlIGVuY29kaW5nLCBvciBudWxsIGlmIG5vdCBmb3VuZAorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGdldFBhZ2VFbmNvZGluZ0ZvckpzcFN5bnRheChKc3BSZWFkZXIganNwUmVhZGVyLAorCQkJCQkgICAgICAgTWFyayBzdGFydE1hcmspCisJICAgICAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKworCVN0cmluZyBlbmNvZGluZyA9IG51bGw7CisgICAgICAgIFN0cmluZyBzYXZlRW5jb2RpbmcgPSBudWxsOworCisgICAgICAgIGpzcFJlYWRlci5yZXNldChzdGFydE1hcmspOworCisJLyoKKwkgKiBEZXRlcm1pbmUgcGFnZSBlbmNvZGluZyBmcm9tIGRpcmVjdGl2ZSBvZiB0aGUgZm9ybSA8JUAgcGFnZSAlPiBvcgorCSAqIDwlQCB0YWcgJT4KKwkgKi8KKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIE1hcmsgY3VycmVudCA9IGpzcFJlYWRlci5tYXJrKCk7CisKKyAgICAgICAgICAgIE1hcmsgYmVnaW5EaXJlY3RpdmUgPSBqc3BSZWFkZXIuc2tpcFVudGlsKCI8JUAiKTsKKyAgICAgICAgICAgIGlmIChiZWdpbkRpcmVjdGl2ZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBNb3ZlIHBhc3QgdGhlICc8JUAnIGRlbGltaXRlcgorICAgICAgICAgICAgTWFyayBiZWdpbkRpcmVjdGl2ZUJvZHkgPSBqc3BSZWFkZXIubWFyaygpOworCisgICAgICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgZGlyZWN0aXZlIGlzIG5lc3RlZCBpbnNpZGUgY29tbWVudAorICAgICAgICAgICAganNwUmVhZGVyLnJlc2V0KGN1cnJlbnQpOworICAgICAgICAgICAgTWFyayBiZWdpbkNvbW1lbnQgPSBqc3BSZWFkZXIuc2tpcFVudGlsKCI8JS0tIik7CisgICAgICAgICAgICBpZiAoYmVnaW5Db21tZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBNYXJrIGVuZENvbW1lbnQgPSBqc3BSZWFkZXIuc2tpcFVudGlsKCItLSU+Iik7CisgICAgICAgICAgICAgICAgaWYgKGVuZENvbW1lbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBlcnIuanNwRXJyb3IoYmVnaW5Db21tZW50LCAianNwLmVycm9yLnVudGVybWluYXRlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJmx0OyUtLSIpOworICAgICAgICAgICAgICAgIH0KKyAgCisgICAgICAgICAgICAgICAgaWYgKGJlZ2luRGlyZWN0aXZlLmlzR3JlYXRlcihiZWdpbkNvbW1lbnQpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBlbmRDb21tZW50LmlzR3JlYXRlcihiZWdpbkRpcmVjdGl2ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRGlyZWN0aXZlIGlzIG5lc3RlZCBpbnNpZGUgY29tbWVudCwgc2tpcCB1bnRpbCBlbmQgb2YgCisgICAgICAgICAgICAgICAgICAgIC8vIGNvbW1lbnQKKyAgICAgICAgICAgICAgICAgICAganNwUmVhZGVyLnJlc2V0KGVuZENvbW1lbnQpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGpzcFJlYWRlci5yZXNldChiZWdpbkRpcmVjdGl2ZUJvZHkpOworCSAgICBqc3BSZWFkZXIuc2tpcFNwYWNlcygpOworCisJICAgIC8vIGNvbXBhcmUgZm9yICJ0YWcgIiwgc28gd2UgZG9uJ3QgbWF0Y2ggInRhZ2xpYiIKKwkgICAgaWYgKGpzcFJlYWRlci5tYXRjaGVzKCJ0YWcgIikgfHwganNwUmVhZGVyLm1hdGNoZXMoInBhZ2UiKSkgeworCisJCWpzcFJlYWRlci5za2lwU3BhY2VzKCk7CisgICAgICAgICAgICAgICAgQXR0cmlidXRlcyBhdHRycyA9IFBhcnNlci5wYXJzZUF0dHJpYnV0ZXModGhpcywganNwUmVhZGVyKTsKKwkJZW5jb2RpbmcgPSBnZXRQYWdlRW5jb2RpbmdGcm9tRGlyZWN0aXZlKGF0dHJzLCAicGFnZUVuY29kaW5nIik7CisgICAgICAgICAgICAgICAgaWYgKGVuY29kaW5nICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCQllbmNvZGluZyA9IGdldFBhZ2VFbmNvZGluZ0Zyb21EaXJlY3RpdmUoYXR0cnMsICJjb250ZW50VHlwZSIpOworICAgICAgICAgICAgICAgIGlmIChlbmNvZGluZyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHNhdmVFbmNvZGluZyA9IGVuY29kaW5nOworICAgICAgICAgICAgICAgIH0KKwkgICAgfQorCX0KKworICAgICAgICBpZiAoZW5jb2RpbmcgPT0gbnVsbCkgeworICAgICAgICAgICAgZW5jb2RpbmcgPSBzYXZlRW5jb2Rpbmc7CisgICAgICAgIH0KKworCWlmIChlbmNvZGluZyA9PSBudWxsKSB7CisJICAgIC8qCisJICAgICAqIERldGVybWluZSBwYWdlIGVuY29kaW5nIGZyb20gcGFnZSBkaXJlY3RpdmUgb2YgdGhlIGZvcm0KKwkgICAgICogPGpzcDpkaXJlY3RpdmUucGFnZT4KKwkgICAgICovCisJICAgIGpzcFJlYWRlci5yZXNldChzdGFydE1hcmspOworCSAgICB3aGlsZSAoanNwUmVhZGVyLnNraXBVbnRpbCgiPGpzcDpkaXJlY3RpdmUucGFnZSIpICE9IG51bGwpIHsKKwkJanNwUmVhZGVyLnNraXBTcGFjZXMoKTsKKyAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzIGF0dHJzID0gUGFyc2VyLnBhcnNlQXR0cmlidXRlcyh0aGlzLCBqc3BSZWFkZXIpOworCisJCWVuY29kaW5nID0gZ2V0UGFnZUVuY29kaW5nRnJvbURpcmVjdGl2ZShhdHRycywgInBhZ2VFbmNvZGluZyIpOworICAgICAgICAgICAgICAgIGlmIChlbmNvZGluZyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKwkJZW5jb2RpbmcgPSBnZXRQYWdlRW5jb2RpbmdGcm9tRGlyZWN0aXZlKGF0dHJzLCAiY29udGVudFR5cGUiKTsKKyAgICAgICAgICAgICAgICBpZiAoZW5jb2RpbmcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBzYXZlRW5jb2RpbmcgPSBlbmNvZGluZzsKKyAgICAgICAgICAgICAgICB9CisJICAgIH0KKyAgICAgICAgICAgIGlmIChlbmNvZGluZyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgZW5jb2RpbmcgPSBzYXZlRW5jb2Rpbmc7CisgICAgICAgICAgICB9CisJfQorCisJcmV0dXJuIGVuY29kaW5nOworICAgIH0KKworICAgIC8qCisgICAgICogU2NhbnMgdGhlIGdpdmVuIGF0dHJpYnV0ZXMgZm9yIHRoZSBhdHRyaWJ1dGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZSwKKyAgICAgKiB3aGljaCBpcyBlaXRoZXIgJ3BhZ2VFbmNvZGluZycgb3IgJ2NvbnRlbnRUeXBlJywgYW5kIHJldHVybnMgdGhlCisgICAgICogc3BlY2lmaWVkIHBhZ2UgZW5jb2RpbmcuCisgICAgICoKKyAgICAgKiBJbiB0aGUgY2FzZSBvZiAnY29udGVudFR5cGUnLCB0aGUgcGFnZSBlbmNvZGluZyBpcyB0YWtlbiBmcm9tIHRoZQorICAgICAqIGNvbnRlbnQgdHlwZSdzICdjaGFyc2V0JyBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXR0cnMgVGhlIHBhZ2UgZGlyZWN0aXZlIGF0dHJpYnV0ZXMKKyAgICAgKiBAcGFyYW0gYXR0ck5hbWUgVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0byBzZWFyY2ggZm9yIChlaXRoZXIKKyAgICAgKiAncGFnZUVuY29kaW5nJyBvciAnY29udGVudFR5cGUnKQorICAgICAqCisgICAgICogQHJldHVybiBUaGUgcGFnZSBlbmNvZGluZywgb3IgbnVsbAorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGdldFBhZ2VFbmNvZGluZ0Zyb21EaXJlY3RpdmUoQXR0cmlidXRlcyBhdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhdHRyTmFtZSkgeworCVN0cmluZyB2YWx1ZSA9IGF0dHJzLmdldFZhbHVlKGF0dHJOYW1lKTsKKyAgICAgICAgaWYgKGF0dHJOYW1lLmVxdWFscygicGFnZUVuY29kaW5nIikpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGF0dHJOYW1lID0gY29udGVudFR5cGUKKyAgICAgICAgU3RyaW5nIGNvbnRlbnRUeXBlID0gdmFsdWU7CisgICAgICAgIFN0cmluZyBlbmNvZGluZyA9IG51bGw7CisgICAgICAgIGlmIChjb250ZW50VHlwZSAhPSBudWxsKSB7CisJICAgIGludCBsb2MgPSBjb250ZW50VHlwZS5pbmRleE9mKENIQVJTRVQpOworCSAgICBpZiAobG9jICE9IC0xKSB7CisJCWVuY29kaW5nID0gY29udGVudFR5cGUuc3Vic3RyaW5nKGxvYyArIENIQVJTRVQubGVuZ3RoKCkpOworCSAgICB9CisJfQorCisJcmV0dXJuIGVuY29kaW5nOworICAgIH0KKworICAgIC8qCisgICAgICogUmVzb2x2ZSB0aGUgbmFtZSBvZiB0aGUgZmlsZSBhbmQgdXBkYXRlIGJhc2VEaXJTdGFjaygpIHRvIGtlZXAgdHJhY2sgb2YKKyAgICAgKiB0aGUgY3VycmVudCBiYXNlIGRpcmVjdG9yeSBmb3IgZWFjaCBpbmNsdWRlZCBmaWxlLgorICAgICAqIFRoZSAncm9vdCcgZmlsZSBpcyBhbHdheXMgYW4gJ2Fic29sdXRlJyBwYXRoLCBzbyBubyBuZWVkIHRvIHB1dCBhbgorICAgICAqIGluaXRpYWwgdmFsdWUgaW4gdGhlIGJhc2VEaXJTdGFjay4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyByZXNvbHZlRmlsZU5hbWUoU3RyaW5nIGluRmlsZU5hbWUpIHsKKyAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gaW5GaWxlTmFtZS5yZXBsYWNlKCdcXCcsICcvJyk7CisgICAgICAgIGJvb2xlYW4gaXNBYnNvbHV0ZSA9IGZpbGVOYW1lLnN0YXJ0c1dpdGgoIi8iKTsKKwlmaWxlTmFtZSA9IGlzQWJzb2x1dGUgPyBmaWxlTmFtZSAKKyAgICAgICAgICAgIDogKFN0cmluZykgYmFzZURpclN0YWNrLnBlZWsoKSArIGZpbGVOYW1lOworCVN0cmluZyBiYXNlRGlyID0gCisJICAgIGZpbGVOYW1lLnN1YnN0cmluZygwLCBmaWxlTmFtZS5sYXN0SW5kZXhPZigiLyIpICsgMSk7CisJYmFzZURpclN0YWNrLnB1c2goYmFzZURpcik7CisJcmV0dXJuIGZpbGVOYW1lOworICAgIH0KKworICAgIC8qCisgICAgICogQ2hlY2tzIHRvIHNlZSBpZiB0aGUgZ2l2ZW4gcGFnZSBjb250YWlucywgYXMgaXRzIGZpcnN0IGVsZW1lbnQsIGEgPHJvb3Q+CisgICAgICogZWxlbWVudCB3aG9zZSBwcmVmaXggaXMgYm91bmQgdG8gdGhlIEpTUCBuYW1lc3BhY2UsIGFzIGluOgorICAgICAqCisgICAgICogPHdvbWJhdDpyb290IHhtbG5zOndvbWJhdD0iaHR0cDovL2phdmEuc3VuLmNvbS9KU1AvUGFnZSIgdmVyc2lvbj0iMS4yIj4KKyAgICAgKiAgIC4uLgorICAgICAqIDwvd29tYmF0OnJvb3Q+CisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVhZGVyIFRoZSByZWFkZXIgZm9yIHRoaXMgcGFnZQorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgcGFnZSBjb250YWlucyBhIHJvb3QgZWxlbWVudCB3aG9zZSBwcmVmaXggaXMgYm91bmQKKyAgICAgKiB0byB0aGUgSlNQIG5hbWVzcGFjZSwgYW5kIGZhbHNlIG90aGVyd2lzZQorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBoYXNKc3BSb290KEpzcFJlYWRlciByZWFkZXIpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCisJLy8gPHByZWZpeD46cm9vdCBtdXN0IGJlIHRoZSBmaXJzdCBlbGVtZW50CisJTWFyayBzdGFydCA9IG51bGw7CisJd2hpbGUgKChzdGFydCA9IHJlYWRlci5za2lwVW50aWwoIjwiKSkgIT0gbnVsbCkgeworCSAgICBpbnQgYyA9IHJlYWRlci5uZXh0Q2hhcigpOworCSAgICBpZiAoYyAhPSAnIScgJiYgYyAhPSAnPycpIGJyZWFrOworCX0KKwlpZiAoc3RhcnQgPT0gbnVsbCkgeworCSAgICByZXR1cm4gZmFsc2U7CisJfQorCU1hcmsgc3RvcCA9IHJlYWRlci5za2lwVW50aWwoIjpyb290Iik7CisJaWYgKHN0b3AgPT0gbnVsbCkgeworCSAgICByZXR1cm4gZmFsc2U7CisJfQorCS8vIGNhbGwgc3Vic3RyaW5nIHRvIGdldCByaWQgb2YgbGVhZGluZyAnPCcKKwlTdHJpbmcgcHJlZml4ID0gcmVhZGVyLmdldFRleHQoc3RhcnQsIHN0b3ApLnN1YnN0cmluZygxKTsKKworCXN0YXJ0ID0gc3RvcDsKKwlzdG9wID0gcmVhZGVyLnNraXBVbnRpbCgiPiIpOworCWlmIChzdG9wID09IG51bGwpIHsKKwkgICAgcmV0dXJuIGZhbHNlOworCX0KKworCS8vIERldGVybWluZSBuYW1lc3BhY2UgYXNzb2NpYXRlZCB3aXRoIDxyb290PiBlbGVtZW50J3MgcHJlZml4CisJU3RyaW5nIHJvb3QgPSByZWFkZXIuZ2V0VGV4dChzdGFydCwgc3RvcCk7CisJU3RyaW5nIHhtbG5zRGVjbCA9ICJ4bWxuczoiICsgcHJlZml4OworCWludCBpbmRleCA9IHJvb3QuaW5kZXhPZih4bWxuc0RlY2wpOworCWlmIChpbmRleCA9PSAtMSkgeworCSAgICByZXR1cm4gZmFsc2U7CisJfQorCWluZGV4ICs9IHhtbG5zRGVjbC5sZW5ndGgoKTsKKwl3aGlsZSAoaW5kZXggPCByb290Lmxlbmd0aCgpCisJICAgICAgICAgICAmJiBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKHJvb3QuY2hhckF0KGluZGV4KSkpIHsKKwkgICAgaW5kZXgrKzsKKwl9CisJaWYgKGluZGV4IDwgcm9vdC5sZW5ndGgoKSAmJiByb290LmNoYXJBdChpbmRleCkgPT0gJz0nKSB7CisJICAgIGluZGV4Kys7CisJICAgIHdoaWxlIChpbmRleCA8IHJvb3QubGVuZ3RoKCkKKwkJICAgICAgICYmIENoYXJhY3Rlci5pc1doaXRlc3BhY2Uocm9vdC5jaGFyQXQoaW5kZXgpKSkgeworCQlpbmRleCsrOworCSAgICB9CisJICAgIGlmIChpbmRleCA8IHJvb3QubGVuZ3RoKCkgJiYgcm9vdC5jaGFyQXQoaW5kZXgrKykgPT0gJyInCisJCSAgICAmJiByb290LnJlZ2lvbk1hdGNoZXMoaW5kZXgsIEpTUF9VUkksIDAsCisJCQkJCSAgSlNQX1VSSS5sZW5ndGgoKSkpIHsKKwkJcmV0dXJuIHRydWU7CisJICAgIH0KKwl9CisKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBKYXJGaWxlIGdldEphckZpbGUoVVJMIGphckZpbGVVcmwpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJSmFyRmlsZSBqYXJGaWxlID0gbnVsbDsKKworCWlmIChqYXJGaWxlVXJsICE9IG51bGwpIHsKKwkgICAgSmFyVVJMQ29ubmVjdGlvbiBjb25uID0gKEphclVSTENvbm5lY3Rpb24pIGphckZpbGVVcmwub3BlbkNvbm5lY3Rpb24oKTsKKwkgICAgY29ubi5zZXRVc2VDYWNoZXMoZmFsc2UpOworCSAgICBjb25uLmNvbm5lY3QoKTsKKwkgICAgamFyRmlsZSA9IGNvbm4uZ2V0SmFyRmlsZSgpOworCX0KKworCXJldHVybiBqYXJGaWxlOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL2NvbXBpbGVyL1NjcmlwdGluZ1ZhcmlhYmxlci5qYXZhIGIvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL2NvbXBpbGVyL1NjcmlwdGluZ1ZhcmlhYmxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjOTFkYmYKLS0tIC9kZXYvbnVsbAorKysgYi9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvU2NyaXB0aW5nVmFyaWFibGVyLmphdmEKQEAgLTAsMCArMSwxNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphc3Blci5jb21waWxlcjsKKworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC4qOworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLkphc3BlckV4Y2VwdGlvbjsKKworLyoqCisgKiBDbGFzcyByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIHNjcmlwdGluZyB2YXJpYWJsZXMgdGhhdCBldmVyeQorICogY3VzdG9tIGFjdGlvbiBuZWVkcyB0byBkZWNsYXJlLgorICoKKyAqIEBhdXRob3IgSmFuIEx1ZWhlCisgKi8KK2NsYXNzIFNjcmlwdGluZ1ZhcmlhYmxlciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIE1BWF9TQ09QRSA9IG5ldyBJbnRlZ2VyKEludGVnZXIuTUFYX1ZBTFVFKTsKKworICAgIC8qCisgICAgICogQXNzaWducyBhbiBpZGVudGlmaWVyIChvZiB0eXBlIGludGVnZXIpIHRvIGV2ZXJ5IGN1c3RvbSB0YWcsIGluIG9yZGVyCisgICAgICogdG8gaGVscCBpZGVudGlmeSwgZm9yIGV2ZXJ5IGN1c3RvbSB0YWcsIHRoZSBzY3JpcHRpbmcgdmFyaWFibGVzIHRoYXQgaXQKKyAgICAgKiBuZWVkcyB0byBkZWNsYXJlLgorICAgICAqLworICAgIHN0YXRpYyBjbGFzcyBDdXN0b21UYWdDb3VudGVyIGV4dGVuZHMgTm9kZS5WaXNpdG9yIHsKKworCXByaXZhdGUgaW50IGNvdW50OworCXByaXZhdGUgTm9kZS5DdXN0b21UYWcgcGFyZW50OworCisJcHVibGljIHZvaWQgdmlzaXQoTm9kZS5DdXN0b21UYWcgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJICAgIG4uc2V0Q3VzdG9tVGFnUGFyZW50KHBhcmVudCk7CisJICAgIE5vZGUuQ3VzdG9tVGFnIHRtcFBhcmVudCA9IHBhcmVudDsKKwkgICAgcGFyZW50ID0gbjsKKwkgICAgdmlzaXRCb2R5KG4pOworCSAgICBwYXJlbnQgPSB0bXBQYXJlbnQ7CisJICAgIG4uc2V0TnVtQ291bnQobmV3IEludGVnZXIoY291bnQrKykpOworCX0KKyAgICB9CisKKyAgICAvKgorICAgICAqIEZvciBldmVyeSBjdXN0b20gdGFnLCBkZXRlcm1pbmVzIHRoZSBzY3JpcHRpbmcgdmFyaWFibGVzIGl0IG5lZWRzIHRvCisgICAgICogZGVjbGFyZS4gCisgICAgICovCisgICAgc3RhdGljIGNsYXNzIFNjcmlwdGluZ1ZhcmlhYmxlVmlzaXRvciBleHRlbmRzIE5vZGUuVmlzaXRvciB7CisKKwlwcml2YXRlIEVycm9yRGlzcGF0Y2hlciBlcnI7CisJcHJpdmF0ZSBIYXNodGFibGUgc2NyaXB0VmFyczsKKwkKKwlwdWJsaWMgU2NyaXB0aW5nVmFyaWFibGVWaXNpdG9yKEVycm9yRGlzcGF0Y2hlciBlcnIpIHsKKwkgICAgdGhpcy5lcnIgPSBlcnI7CisJICAgIHNjcmlwdFZhcnMgPSBuZXcgSGFzaHRhYmxlKCk7CisJfQorCisJcHVibGljIHZvaWQgdmlzaXQoTm9kZS5DdXN0b21UYWcgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJICAgIHNldFNjcmlwdGluZ1ZhcnMobiwgVmFyaWFibGVJbmZvLkFUX0JFR0lOKTsKKwkgICAgc2V0U2NyaXB0aW5nVmFycyhuLCBWYXJpYWJsZUluZm8uTkVTVEVEKTsKKwkgICAgdmlzaXRCb2R5KG4pOworCSAgICBzZXRTY3JpcHRpbmdWYXJzKG4sIFZhcmlhYmxlSW5mby5BVF9FTkQpOworCX0KKworCXByaXZhdGUgdm9pZCBzZXRTY3JpcHRpbmdWYXJzKE5vZGUuQ3VzdG9tVGFnIG4sIGludCBzY29wZSkKKwkgICAgICAgIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCisJICAgIFRhZ1ZhcmlhYmxlSW5mb1tdIHRhZ1ZhckluZm9zID0gbi5nZXRUYWdWYXJpYWJsZUluZm9zKCk7CisJICAgIFZhcmlhYmxlSW5mb1tdIHZhckluZm9zID0gbi5nZXRWYXJpYWJsZUluZm9zKCk7CisJICAgIGlmICh0YWdWYXJJbmZvcy5sZW5ndGggPT0gMCAmJiB2YXJJbmZvcy5sZW5ndGggPT0gMCkgeworCQlyZXR1cm47CisJICAgIH0KKworCSAgICBWZWN0b3IgdmVjID0gbmV3IFZlY3RvcigpOworCisJICAgIEludGVnZXIgb3duUmFuZ2UgPSBudWxsOworCSAgICBpZiAoc2NvcGUgPT0gVmFyaWFibGVJbmZvLkFUX0JFR0lOCisJCSAgICB8fCBzY29wZSA9PSBWYXJpYWJsZUluZm8uQVRfRU5EKSB7CisJCU5vZGUuQ3VzdG9tVGFnIHBhcmVudCA9IG4uZ2V0Q3VzdG9tVGFnUGFyZW50KCk7CisJCWlmIChwYXJlbnQgPT0gbnVsbCkKKwkJICAgIG93blJhbmdlID0gTUFYX1NDT1BFOworCQllbHNlCisJCSAgICBvd25SYW5nZSA9IHBhcmVudC5nZXROdW1Db3VudCgpOworCSAgICB9IGVsc2UgeworCQkvLyBORVNURUQKKwkJb3duUmFuZ2UgPSBuLmdldE51bUNvdW50KCk7CisJICAgIH0KKworCSAgICBpZiAodmFySW5mb3MubGVuZ3RoID4gMCkgeworCQlmb3IgKGludCBpPTA7IGk8dmFySW5mb3MubGVuZ3RoOyBpKyspIHsKKwkJICAgIGlmICh2YXJJbmZvc1tpXS5nZXRTY29wZSgpICE9IHNjb3BlCisJCQkgICAgfHwgIXZhckluZm9zW2ldLmdldERlY2xhcmUoKSkgeworCQkJY29udGludWU7CisJCSAgICB9CisJCSAgICBTdHJpbmcgdmFyTmFtZSA9IHZhckluZm9zW2ldLmdldFZhck5hbWUoKTsKKwkJICAgIAorCQkgICAgSW50ZWdlciBjdXJyZW50UmFuZ2UgPSAoSW50ZWdlcikgc2NyaXB0VmFycy5nZXQodmFyTmFtZSk7CisJCSAgICBpZiAoY3VycmVudFJhbmdlID09IG51bGwKKwkJCSAgICB8fCBvd25SYW5nZS5jb21wYXJlVG8oY3VycmVudFJhbmdlKSA+IDApIHsKKwkJCXNjcmlwdFZhcnMucHV0KHZhck5hbWUsIG93blJhbmdlKTsKKwkJCXZlYy5hZGQodmFySW5mb3NbaV0pOworCQkgICAgfQorCQl9CisJICAgIH0gZWxzZSB7CisJCWZvciAoaW50IGk9MDsgaTx0YWdWYXJJbmZvcy5sZW5ndGg7IGkrKykgeworCQkgICAgaWYgKHRhZ1ZhckluZm9zW2ldLmdldFNjb3BlKCkgIT0gc2NvcGUKKwkJCSAgICB8fCAhdGFnVmFySW5mb3NbaV0uZ2V0RGVjbGFyZSgpKSB7CisJCQljb250aW51ZTsKKwkJICAgIH0KKwkJICAgIFN0cmluZyB2YXJOYW1lID0gdGFnVmFySW5mb3NbaV0uZ2V0TmFtZUdpdmVuKCk7CisJCSAgICBpZiAodmFyTmFtZSA9PSBudWxsKSB7CisJCQl2YXJOYW1lID0gbi5nZXRUYWdEYXRhKCkuZ2V0QXR0cmlidXRlU3RyaW5nKAorCQkgICAgICAgICAgICAgICAgICAgICAgICB0YWdWYXJJbmZvc1tpXS5nZXROYW1lRnJvbUF0dHJpYnV0ZSgpKTsKKwkJCWlmICh2YXJOYW1lID09IG51bGwpIHsKKwkJCSAgICBlcnIuanNwRXJyb3IobiwgImpzcC5lcnJvci5zY3JpcHRpbmcudmFyaWFibGUubWlzc2luZ19uYW1lIiwKKwkJCQkJIHRhZ1ZhckluZm9zW2ldLmdldE5hbWVGcm9tQXR0cmlidXRlKCkpOworCQkJfQorCQkgICAgfQorCisJCSAgICBJbnRlZ2VyIGN1cnJlbnRSYW5nZSA9IChJbnRlZ2VyKSBzY3JpcHRWYXJzLmdldCh2YXJOYW1lKTsKKwkJICAgIGlmIChjdXJyZW50UmFuZ2UgPT0gbnVsbAorCQkJICAgIHx8IG93blJhbmdlLmNvbXBhcmVUbyhjdXJyZW50UmFuZ2UpID4gMCkgeworCQkJc2NyaXB0VmFycy5wdXQodmFyTmFtZSwgb3duUmFuZ2UpOworCQkJdmVjLmFkZCh0YWdWYXJJbmZvc1tpXSk7CisJCSAgICB9CisJCX0KKwkgICAgfQorCisJICAgIG4uc2V0U2NyaXB0aW5nVmFycyh2ZWMsIHNjb3BlKTsKKwl9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldChOb2RlLk5vZGVzIHBhZ2UsIEVycm9yRGlzcGF0Y2hlciBlcnIpCisJICAgIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCXBhZ2UudmlzaXQobmV3IEN1c3RvbVRhZ0NvdW50ZXIoKSk7CisJcGFnZS52aXNpdChuZXcgU2NyaXB0aW5nVmFyaWFibGVWaXNpdG9yKGVycikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9TZXJ2bGV0V3JpdGVyLmphdmEgYi9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvU2VydmxldFdyaXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlMzdkYmEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvU2VydmxldFdyaXRlci5qYXZhCkBAIC0wLDAgKzEsMTc1IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuamFzcGVyLmNvbXBpbGVyOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworCisvKioKKyAqIFRoaXMgaXMgd2hhdCBpcyB1c2VkIHRvIGdlbmVyYXRlIHNlcnZsZXRzLiAKKyAqCisgKiBAYXV0aG9yIEFuaWwgSy4gVmlqZW5kcmFuCisgKiBAYXV0aG9yIEtpbi1tYW4gQ2h1bmcKKyAqLworcHVibGljIGNsYXNzIFNlcnZsZXRXcml0ZXIgeworICAgIHB1YmxpYyBzdGF0aWMgaW50IFRBQl9XSURUSCA9IDI7CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgU1BBQ0VTID0gIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI7CisKKyAgICAvLyBDdXJyZW50IGluZGVudCBsZXZlbDoKKyAgICBwcml2YXRlIGludCBpbmRlbnQgPSAwOworICAgIHByaXZhdGUgaW50IHZpcnR1YWxfaW5kZW50ID0gMDsKKworICAgIC8vIFRoZSBzaW5rIHdyaXRlcjoKKyAgICBQcmludFdyaXRlciB3cml0ZXI7CisgICAgCisgICAgLy8gc2VydmxldCBsaW5lIG51bWJlcnMgc3RhcnQgZnJvbSAxCisgICAgcHJpdmF0ZSBpbnQgamF2YUxpbmUgPSAxOworCisKKyAgICBwdWJsaWMgU2VydmxldFdyaXRlcihQcmludFdyaXRlciB3cml0ZXIpIHsKKwl0aGlzLndyaXRlciA9IHdyaXRlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJd3JpdGVyLmNsb3NlKCk7CisgICAgfQorCisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0gQWNjZXNzIGluZm9ybWF0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgcHVibGljIGludCBnZXRKYXZhTGluZSgpIHsKKyAgICAgICAgcmV0dXJuIGphdmFMaW5lOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0gRm9ybWF0dGluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgcHVibGljIHZvaWQgcHVzaEluZGVudCgpIHsKKwl2aXJ0dWFsX2luZGVudCArPSBUQUJfV0lEVEg7CisJaWYgKHZpcnR1YWxfaW5kZW50ID49IDAgJiYgdmlydHVhbF9pbmRlbnQgPD0gU1BBQ0VTLmxlbmd0aCgpKQorCSAgICBpbmRlbnQgPSB2aXJ0dWFsX2luZGVudDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwb3BJbmRlbnQoKSB7CisJdmlydHVhbF9pbmRlbnQgLT0gVEFCX1dJRFRIOworCWlmICh2aXJ0dWFsX2luZGVudCA+PSAwICYmIHZpcnR1YWxfaW5kZW50IDw9IFNQQUNFUy5sZW5ndGgoKSkKKwkgICAgaW5kZW50ID0gdmlydHVhbF9pbmRlbnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJpbnQgYSBzdGFuZGFyZCBjb21tZW50IGZvciBlY2hvIG91dHB1dGVkIGNodW5rLgorICAgICAqIEBwYXJhbSBzdGFydCBUaGUgc3RhcnRpbmcgcG9zaXRpb24gb2YgdGhlIEpTUCBjaHVuayBiZWluZyBwcm9jZXNzZWQuIAorICAgICAqIEBwYXJhbSBzdG9wICBUaGUgZW5kaW5nIHBvc2l0aW9uIG9mIHRoZSBKU1AgY2h1bmsgYmVpbmcgcHJvY2Vzc2VkLiAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwcmludENvbW1lbnQoTWFyayBzdGFydCwgTWFyayBzdG9wLCBjaGFyW10gY2hhcnMpIHsKKyAgICAgICAgaWYgKHN0YXJ0ICE9IG51bGwgJiYgc3RvcCAhPSBudWxsKSB7CisgICAgICAgICAgICBwcmludGxuKCIvLyBmcm9tPSIrc3RhcnQpOworICAgICAgICAgICAgcHJpbnRsbigiLy8gICB0bz0iK3N0b3ApOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoY2hhcnMgIT0gbnVsbCkKKyAgICAgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBjaGFycy5sZW5ndGg7KSB7CisgICAgICAgICAgICAgICAgcHJpbnRpbigpOworICAgICAgICAgICAgICAgIHByaW50KCIvLyAiKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoY2hhcnNbaV0gIT0gJ1xuJyAmJiBpIDwgY2hhcnMubGVuZ3RoKQorICAgICAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQoY2hhcnNbaSsrXSk7CisgICAgICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJpbnRzIHRoZSBnaXZlbiBzdHJpbmcgZm9sbG93ZWQgYnkgJ1xuJworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHByaW50bG4oU3RyaW5nIHMpIHsKKyAgICAgICAgamF2YUxpbmUrKzsKKwl3cml0ZXIucHJpbnRsbihzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcmludHMgYSAnXG4nCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHJpbnRsbigpIHsKKyAgICAgICAgamF2YUxpbmUrKzsKKwl3cml0ZXIucHJpbnRsbigiIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJpbnRzIHRoZSBjdXJyZW50IGluZGVudGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHByaW50aW4oKSB7CisJd3JpdGVyLnByaW50KFNQQUNFUy5zdWJzdHJpbmcoMCwgaW5kZW50KSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJpbnRzIHRoZSBjdXJyZW50IGluZGVudGlvbiwgZm9sbG93ZWQgYnkgdGhlIGdpdmVuIHN0cmluZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHByaW50aW4oU3RyaW5nIHMpIHsKKwl3cml0ZXIucHJpbnQoU1BBQ0VTLnN1YnN0cmluZygwLCBpbmRlbnQpKTsKKwl3cml0ZXIucHJpbnQocyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJpbnRzIHRoZSBjdXJyZW50IGluZGVudGlvbiwgYW5kIHRoZW4gdGhlIHN0cmluZywgYW5kIGEgJ1xuJy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwcmludGlsKFN0cmluZyBzKSB7CisgICAgICAgIGphdmFMaW5lKys7CisJd3JpdGVyLnByaW50KFNQQUNFUy5zdWJzdHJpbmcoMCwgaW5kZW50KSk7CisJd3JpdGVyLnByaW50bG4ocyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJpbnRzIHRoZSBnaXZlbiBjaGFyLgorICAgICAqCisgICAgICogVXNlIHByaW50bG4oKSB0byBwcmludCBhICdcbicuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHJpbnQoY2hhciBjKSB7CisJd3JpdGVyLnByaW50KGMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByaW50cyB0aGUgZ2l2ZW4gaW50LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHByaW50KGludCBpKSB7CisJd3JpdGVyLnByaW50KGkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByaW50cyB0aGUgZ2l2ZW4gc3RyaW5nLgorICAgICAqCisgICAgICogVGhlIHN0cmluZyBtdXN0IG5vdCBjb250YWluIGFueSAnXG4nLCBvdGhlcndpc2UgdGhlIGxpbmUgY291bnQgd2lsbCBiZQorICAgICAqIG9mZi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwcmludChTdHJpbmcgcykgeworCXdyaXRlci5wcmludChzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcmludHMgdGhlIGdpdmVuIHN0cmluZy4KKyAgICAgKgorICAgICAqIElmIHRoZSBzdHJpbmcgc3BhbnMgbXVsdGlwbGUgbGluZXMsIHRoZSBsaW5lIGNvdW50IHdpbGwgYmUgYWRqdXN0ZWQKKyAgICAgKiBhY2NvcmRpbmdseS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwcmludE11bHRpTG4oU3RyaW5nIHMpIHsKKyAgICAgICAgaW50IGluZGV4ID0gMDsKKworICAgICAgICAvLyBsb29rIGZvciBoaWRkZW4gbmV3bGluZXMgaW5zaWRlIHN0cmluZ3MKKyAgICAgICAgd2hpbGUgKChpbmRleD1zLmluZGV4T2YoJ1xuJyxpbmRleCkpID4gLTEgKSB7CisgICAgICAgICAgICBqYXZhTGluZSsrOworICAgICAgICAgICAgaW5kZXgrKzsKKyAgICAgICAgfQorCisJd3JpdGVyLnByaW50KHMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9TbWFwR2VuZXJhdG9yLmphdmEgYi9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvU21hcEdlbmVyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxN2I2N2UKLS0tIC9kZXYvbnVsbAorKysgYi9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvU21hcEdlbmVyYXRvci5qYXZhCkBAIC0wLDAgKzEsMTcwIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYXNwZXIuY29tcGlsZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCisvKioKKyAqIFJlcHJlc2VudHMgYSBzb3VyY2UgbWFwIChTTUFQKSwgd2hpY2ggc2VydmVzIHRvIGFzc29jaWF0ZSBsaW5lcworICogb2YgdGhlIGlucHV0IEpTUCBmaWxlKHMpIHRvIGxpbmVzIGluIHRoZSBnZW5lcmF0ZWQgc2VydmxldCBpbiB0aGUKKyAqIGZpbmFsIC5jbGFzcyBmaWxlLCBhY2NvcmRpbmcgdG8gdGhlIEpTUi0wNDUgc3BlYy4KKyAqIAorICogQGF1dGhvciBTaGF3biBCYXllcm4KKyAqLworcHVibGljIGNsYXNzIFNtYXBHZW5lcmF0b3IgeworCisgICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAvLyBPdmVydmlldworCisgICAgLyoKKyAgICAgKiBUaGUgU01BUCBzeW50YXggaXMgcmVhc29uYWJseSBzdHJhaWdodGZvcndhcmQuICBUaGUgcHVycG9zZSBvZiB0aGlzCisgICAgICogY2xhc3MgaXMgY3VycmVudGx5IHR3b2ZvbGQ6CisgICAgICogIC0gdG8gcHJvdmlkZSBhIHNpbXBsZSBidXQgbG93LWxldmVsIEphdmEgaW50ZXJmYWNlIHRvIGJ1aWxkCisgICAgICogICAgYSBsb2dpY2FsIFNNQVAKKyAgICAgKiAgLSB0byBzZXJpYWxpemUgdGhpcyBsb2dpY2FsIFNNQVAgZm9yIGV2ZW50dWFsIGluY2x1c2lvbiBkaXJlY3RseQorICAgICAqICAgIGludG8gYSAuY2xhc3MgZmlsZS4KKyAgICAgKi8KKworCisgICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAvLyBQcml2YXRlIHN0YXRlCisKKyAgICBwcml2YXRlIFN0cmluZyBvdXRwdXRGaWxlTmFtZTsKKyAgICBwcml2YXRlIFN0cmluZyBkZWZhdWx0U3RyYXR1bSA9ICJKYXZhIjsKKyAgICBwcml2YXRlIExpc3Qgc3RyYXRhID0gbmV3IEFycmF5TGlzdCgpOworICAgIHByaXZhdGUgTGlzdCBlbWJlZGRlZCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICBwcml2YXRlIGJvb2xlYW4gZG9FbWJlZGRlZCA9IHRydWU7CisKKyAgICAvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIC8vIE1ldGhvZHMgZm9yIGFkZGluZyBtYXBwaW5nIGRhdGEKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGZpbGVuYW1lICh3aXRob3V0IHBhdGggaW5mb3JtYXRpb24pIGZvciB0aGUgZ2VuZXJhdGVkCisgICAgICogc291cmNlIGZpbGUuICBFLmcuLCAiZm9vJGpzcC5qYXZhIi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0T3V0cHV0RmlsZU5hbWUoU3RyaW5nIHgpIHsKKwlvdXRwdXRGaWxlTmFtZSA9IHg7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyB0aGUgZ2l2ZW4gU21hcFN0cmF0dW0gb2JqZWN0LCByZXByZXNlbnRpbmcgYSBTdHJhdHVtIHdpdGgKKyAgICAgKiBsb2dpY2FsbHkgYXNzb2NpYXRlZCBGaWxlU2VjdGlvbiBhbmQgTGluZVNlY3Rpb24gYmxvY2tzLCB0bworICAgICAqIHRoZSBjdXJyZW50IFNtYXBHZW5lcmF0b3IuICBJZiA8dHQ+ZGVmYXVsdDwvdHQ+IGlzIHRydWUsIHRoaXMKKyAgICAgKiBzdHJhdHVtIGlzIG1hZGUgdGhlIGRlZmF1bHQgc3RyYXR1bSwgb3ZlcnJpZGluZyBhbnkgcHJldmlvdXNseQorICAgICAqIHNldCBkZWZhdWx0LgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmF0dW0gdGhlIFNtYXBTdHJhdHVtIG9iamVjdCB0byBhZGQKKyAgICAgKiBAcGFyYW0gZGVmYXVsdFN0cmF0dW0gaWYgPHR0PnRydWU8L3R0PiwgdGhpcyBTbWFwU3RyYXR1bSBpcyBjb25zaWRlcmVkCisgICAgICogICAgICAgICAgICAgICAgdG8gcmVwcmVzZW50IHRoZSBkZWZhdWx0IFNNQVAgc3RyYXR1bSB1bmxlc3MKKyAgICAgKiAgICAgICAgICAgICAgICBvdmVyd3JpdHRlbgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRTdHJhdHVtKFNtYXBTdHJhdHVtIHN0cmF0dW0sCisJCQkJCWJvb2xlYW4gZGVmYXVsdFN0cmF0dW0pIHsKKwlzdHJhdGEuYWRkKHN0cmF0dW0pOworCWlmIChkZWZhdWx0U3RyYXR1bSkKKwkgICAgdGhpcy5kZWZhdWx0U3RyYXR1bSA9IHN0cmF0dW0uZ2V0U3RyYXR1bU5hbWUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIHRoZSBnaXZlbiBzdHJpbmcgYXMgYW4gZW1iZWRkZWQgU01BUCB3aXRoIHRoZSBnaXZlbiBzdHJhdHVtIG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc21hcCB0aGUgU01BUCB0byBlbWJlZAorICAgICAqIEBwYXJhbSBzdHJhdHVtTmFtZSB0aGUgbmFtZSBvZiB0aGUgc3RyYXR1bSBvdXRwdXQgYnkgdGhlIGNvbXBpbGF0aW9uCisgICAgICogICAgICAgICAgICAgICAgICAgIHRoYXQgcHJvZHVjZWQgdGhlIDx0dD5zbWFwPC90dD4gdG8gYmUgZW1iZWRkZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkU21hcChTdHJpbmcgc21hcCwgU3RyaW5nIHN0cmF0dW1OYW1lKSB7CisJZW1iZWRkZWQuYWRkKCIqTyAiICsgc3RyYXR1bU5hbWUgKyAiXG4iCisJCSAgICsgc21hcAorCQkgICArICIqQyAiICsgc3RyYXR1bU5hbWUgKyAiXG4iKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnN0cnVjdHMgdGhlIFNtYXBHZW5lcmF0b3Igd2hldGhlciB0byBhY3R1YWxseSBwcmludCBhbnkgZW1iZWRkZWQKKyAgICAgKiBTTUFQcyBvciBub3QuICBJbnRlbmRlZCBmb3Igc2l0dWF0aW9ucyB3aXRob3V0IGFuIFNNQVAgcmVzb2x2ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RhdHVzIElmIDx0dD5mYWxzZTwvdHQ+LCBpZ25vcmUgYW55IGVtYmVkZGVkIFNNQVBzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERvRW1iZWRkZWQoYm9vbGVhbiBzdGF0dXMpIHsKKwlkb0VtYmVkZGVkID0gc3RhdHVzOworICAgIH0KKworICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgLy8gTWV0aG9kcyBmb3Igc2VyaWFsaXppbmcgdGhlIGxvZ2ljYWwgU01BUAorCisgICAgcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgZ2V0U3RyaW5nKCkgeworCS8vIGNoZWNrIHN0YXRlIGFuZCBpbml0aWFsaXplIGJ1ZmZlcgorCWlmIChvdXRwdXRGaWxlTmFtZSA9PSBudWxsKQorCSAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgICAgICAgIFN0cmluZ0J1ZmZlciBvdXQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisKKwkvLyBzdGFydCB0aGUgU01BUAorCW91dC5hcHBlbmQoIlNNQVBcbiIpOworCW91dC5hcHBlbmQob3V0cHV0RmlsZU5hbWUgKyAnXG4nKTsKKwlvdXQuYXBwZW5kKGRlZmF1bHRTdHJhdHVtICsgJ1xuJyk7CisKKwkvLyBpbmNsdWRlIGVtYmVkZGVkIFNNQVBzCisJaWYgKGRvRW1iZWRkZWQpIHsKKwkgICAgaW50IG5FbWJlZGRlZCA9IGVtYmVkZGVkLnNpemUoKTsKKwkgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuRW1iZWRkZWQ7IGkrKykgeworCSAgICAgICAgb3V0LmFwcGVuZChlbWJlZGRlZC5nZXQoaSkpOworCSAgICB9CisJfQorCisJLy8gcHJpbnQgb3VyIFN0cmF0dW1TZWN0aW9ucywgRmlsZVNlY3Rpb25zLCBhbmQgTGluZVNlY3Rpb25zCisJaW50IG5TdHJhdGEgPSBzdHJhdGEuc2l6ZSgpOworCWZvciAoaW50IGkgPSAwOyBpIDwgblN0cmF0YTsgaSsrKSB7CisJICAgIFNtYXBTdHJhdHVtIHMgPSAoU21hcFN0cmF0dW0pIHN0cmF0YS5nZXQoaSk7CisJICAgIG91dC5hcHBlbmQocy5nZXRTdHJpbmcoKSk7CisJfQorCisJLy8gZW5kIHRoZSBTTUFQCisJb3V0LmFwcGVuZCgiKkVcbiIpOworCisJcmV0dXJuIG91dC50b1N0cmluZygpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7IHJldHVybiBnZXRTdHJpbmcoKTsgfQorCisgICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAvLyBGb3IgdGVzdGluZyAoYW5kIGFzIGFuIGV4YW1wbGUgb2YgdXNlKS4uLgorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NbXSkgeworCVNtYXBHZW5lcmF0b3IgZyA9IG5ldyBTbWFwR2VuZXJhdG9yKCk7CisJZy5zZXRPdXRwdXRGaWxlTmFtZSgiZm9vLmphdmEiKTsKKwlTbWFwU3RyYXR1bSBzID0gbmV3IFNtYXBTdHJhdHVtKCJKU1AiKTsKKwlzLmFkZEZpbGUoImZvby5qc3AiKTsKKwlzLmFkZEZpbGUoImJhci5qc3AiLCAiL2Zvby9mb28vYmFyLmpzcCIpOworCXMuYWRkTGluZURhdGEoMSwgImZvby5qc3AiLCAxLCAxLCAxKTsKKwlzLmFkZExpbmVEYXRhKDIsICJmb28uanNwIiwgMSwgNiwgMSk7CisJcy5hZGRMaW5lRGF0YSgzLCAiZm9vLmpzcCIsIDIsIDEwLCA1KTsKKwlzLmFkZExpbmVEYXRhKDIwLCAiYmFyLmpzcCIsIDEsIDMwLCAxKTsKKwlnLmFkZFN0cmF0dW0ocywgdHJ1ZSk7CisJU3lzdGVtLm91dC5wcmludChnKTsKKworCVN5c3RlbS5vdXQucHJpbnRsbigiLS0tIik7CisKKwlTbWFwR2VuZXJhdG9yIGVtYmVkZGVkID0gbmV3IFNtYXBHZW5lcmF0b3IoKTsKKwllbWJlZGRlZC5zZXRPdXRwdXRGaWxlTmFtZSgiYmxhcmdoLnRpZXIyIik7CisJcyA9IG5ldyBTbWFwU3RyYXR1bSgiVGllcjIiKTsKKwlzLmFkZEZpbGUoIjEudGllcjIiKTsKKwlzLmFkZExpbmVEYXRhKDEsICIxLnRpZXIyIiwgMSwgMSwgMSk7CisJZW1iZWRkZWQuYWRkU3RyYXR1bShzLCB0cnVlKTsKKwlnLmFkZFNtYXAoZW1iZWRkZWQudG9TdHJpbmcoKSwgIkpTUCIpOworCVN5c3RlbS5vdXQucHJpbnRsbihnKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvU21hcFN0cmF0dW0uamF2YSBiL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9TbWFwU3RyYXR1bS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxZjlkMzMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvU21hcFN0cmF0dW0uamF2YQpAQCAtMCwwICsxLDMzNSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFzcGVyLmNvbXBpbGVyOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworLyoqCisgKiBSZXByZXNlbnRzIHRoZSBsaW5lIGFuZCBmaWxlIG1hcHBpbmdzIGFzc29jaWF0ZWQgd2l0aCBhIEpTUi0wNDUKKyAqICJzdHJhdHVtIi4KKyAqCisgKiBAYXV0aG9yIEpheXNvbiBGYWxrbmVyCisgKiBAYXV0aG9yIFNoYXduIEJheWVybgorICovCitwdWJsaWMgY2xhc3MgU21hcFN0cmF0dW0geworCisgICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAvLyBDbGFzcyBmb3Igc3RvcmluZyBMaW5lSW5mbyBkYXRhCisKKyAgICAvKioKKyAgICAgKiBSZXByZXNlbnRzIGEgc2luZ2xlIExpbmVTZWN0aW9uIGluIGFuIFNNQVAsIGFzc29jaWF0ZWQgd2l0aAorICAgICAqIGEgcGFydGljdWxhciBzdHJhdHVtLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTGluZUluZm8geworICAgICAgICBwcml2YXRlIGludCBpbnB1dFN0YXJ0TGluZSA9IC0xOworICAgICAgICBwcml2YXRlIGludCBvdXRwdXRTdGFydExpbmUgPSAtMTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbGluZUZpbGVJRCA9IDA7CisgICAgICAgIHByaXZhdGUgaW50IGlucHV0TGluZUNvdW50ID0gMTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgb3V0cHV0TGluZUluY3JlbWVudCA9IDE7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBsaW5lRmlsZUlEU2V0ID0gZmFsc2U7CisKKyAgICAgICAgLyoqIFNldHMgSW5wdXRTdGFydExpbmUuICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldElucHV0U3RhcnRMaW5lKGludCBpbnB1dFN0YXJ0TGluZSkgeworICAgICAgICAgICAgaWYgKGlucHV0U3RhcnRMaW5lIDwgMCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCIiICsgaW5wdXRTdGFydExpbmUpOworICAgICAgICAgICAgdGhpcy5pbnB1dFN0YXJ0TGluZSA9IGlucHV0U3RhcnRMaW5lOworICAgICAgICB9CisKKyAgICAgICAgLyoqIFNldHMgT3V0cHV0U3RhcnRMaW5lLiAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZXRPdXRwdXRTdGFydExpbmUoaW50IG91dHB1dFN0YXJ0TGluZSkgeworICAgICAgICAgICAgaWYgKG91dHB1dFN0YXJ0TGluZSA8IDApCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiIiArIG91dHB1dFN0YXJ0TGluZSk7CisgICAgICAgICAgICB0aGlzLm91dHB1dFN0YXJ0TGluZSA9IG91dHB1dFN0YXJ0TGluZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgICAgICogU2V0cyBsaW5lRmlsZUlELiAgU2hvdWxkIGJlIGNhbGxlZCBvbmx5IHdoZW4gZGlmZmVyZW50IGZyb20KKyAgICAgICAgICAgICAqIHRoYXQgb2YgcHJpb3IgTGluZUluZm8gb2JqZWN0IChpbiBhbnkgZ2l2ZW4gY29udGV4dCkgb3IgMAorICAgICAgICAgICAgICogaWYgdGhlIGN1cnJlbnQgTGluZUluZm8gaGFzIG5vIChsb2dpY2FsKSBwcmVkZWNlc3Nvci4KKyAgICAgICAgICAgICAqIDx0dD5MaW5lSW5mbzwvdHQ+IHdpbGwgcHJpbnQgdGhpcyBmaWxlIG51bWJlciBubyBtYXR0ZXIgd2hhdC4KKyAgICAgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZXRMaW5lRmlsZUlEKGludCBsaW5lRmlsZUlEKSB7CisgICAgICAgICAgICBpZiAobGluZUZpbGVJRCA8IDApCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiIiArIGxpbmVGaWxlSUQpOworICAgICAgICAgICAgdGhpcy5saW5lRmlsZUlEID0gbGluZUZpbGVJRDsKKyAgICAgICAgICAgIHRoaXMubGluZUZpbGVJRFNldCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICAvKiogU2V0cyBJbnB1dExpbmVDb3VudC4gKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0SW5wdXRMaW5lQ291bnQoaW50IGlucHV0TGluZUNvdW50KSB7CisgICAgICAgICAgICBpZiAoaW5wdXRMaW5lQ291bnQgPCAwKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIiIgKyBpbnB1dExpbmVDb3VudCk7CisgICAgICAgICAgICB0aGlzLmlucHV0TGluZUNvdW50ID0gaW5wdXRMaW5lQ291bnQ7CisgICAgICAgIH0KKworICAgICAgICAvKiogU2V0cyBPdXRwdXRMaW5lSW5jcmVtZW50LiAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZXRPdXRwdXRMaW5lSW5jcmVtZW50KGludCBvdXRwdXRMaW5lSW5jcmVtZW50KSB7CisgICAgICAgICAgICBpZiAob3V0cHV0TGluZUluY3JlbWVudCA8IDApCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiIiArIG91dHB1dExpbmVJbmNyZW1lbnQpOworICAgICAgICAgICAgdGhpcy5vdXRwdXRMaW5lSW5jcmVtZW50ID0gb3V0cHV0TGluZUluY3JlbWVudDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXRyaWV2ZXMgdGhlIGN1cnJlbnQgTGluZUluZm8gYXMgYSBTdHJpbmcsIHByaW50IGFsbCB2YWx1ZXMKKyAgICAgICAgICogb25seSB3aGVuIGFwcHJvcHJpYXRlIChidXQgTGluZUluZm9JRCBpZiBhbmQgb25seSBpZiBpdCdzIGJlZW4KKyAgICAgICAgICogc3BlY2lmaWVkLCBhcyBpdHMgbmVjZXNzaXR5IGlzIHNlbnNpdGl2ZSB0byBjb250ZXh0KS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKCkgeworICAgICAgICAgICAgaWYgKGlucHV0U3RhcnRMaW5lID09IC0xIHx8IG91dHB1dFN0YXJ0TGluZSA9PSAtMSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgICAgICAgICAgICBTdHJpbmdCdWZmZXIgb3V0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICAgICAgb3V0LmFwcGVuZChpbnB1dFN0YXJ0TGluZSk7CisgICAgICAgICAgICBpZiAobGluZUZpbGVJRFNldCkKKyAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKCIjIiArIGxpbmVGaWxlSUQpOworICAgICAgICAgICAgaWYgKGlucHV0TGluZUNvdW50ICE9IDEpCisgICAgICAgICAgICAgICAgb3V0LmFwcGVuZCgiLCIgKyBpbnB1dExpbmVDb3VudCk7CisgICAgICAgICAgICBvdXQuYXBwZW5kKCI6IiArIG91dHB1dFN0YXJ0TGluZSk7CisgICAgICAgICAgICBpZiAob3V0cHV0TGluZUluY3JlbWVudCAhPSAxKQorICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoIiwiICsgb3V0cHV0TGluZUluY3JlbWVudCk7CisgICAgICAgICAgICBvdXQuYXBwZW5kKCdcbicpOworICAgICAgICAgICAgcmV0dXJuIG91dC50b1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRTdHJpbmcoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgLy8gUHJpdmF0ZSBzdGF0ZQorCisgICAgcHJpdmF0ZSBTdHJpbmcgc3RyYXR1bU5hbWU7CisgICAgcHJpdmF0ZSBMaXN0IGZpbGVOYW1lTGlzdDsKKyAgICBwcml2YXRlIExpc3QgZmlsZVBhdGhMaXN0OworICAgIHByaXZhdGUgTGlzdCBsaW5lRGF0YTsKKyAgICBwcml2YXRlIGludCBsYXN0RmlsZUlEOworCisgICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAvLyBDb25zdHJ1Y3RvcgorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBTbWFwU3RyYXR1bSBvYmplY3QgZm9yIHRoZSBnaXZlbiBzdHJhdHVtIG5hbWUKKyAgICAgKiAoZS5nLiwgSlNQKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJhdHVtTmFtZSB0aGUgbmFtZSBvZiB0aGUgc3RyYXR1bSAoZS5nLiwgSlNQKQorICAgICAqLworICAgIHB1YmxpYyBTbWFwU3RyYXR1bShTdHJpbmcgc3RyYXR1bU5hbWUpIHsKKyAgICAgICAgdGhpcy5zdHJhdHVtTmFtZSA9IHN0cmF0dW1OYW1lOworICAgICAgICBmaWxlTmFtZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIGZpbGVQYXRoTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgbGluZURhdGEgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIGxhc3RGaWxlSUQgPSAwOworICAgIH0KKworICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgLy8gTWV0aG9kcyB0byBhZGQgbWFwcGluZyBpbmZvcm1hdGlvbgorCisgICAgLyoqCisgICAgICogQWRkcyByZWNvcmQgb2YgYSBuZXcgZmlsZSwgYnkgZmlsZW5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZW5hbWUgdGhlIGZpbGVuYW1lIHRvIGFkZCwgdW5xdWFsaWZpZWQgYnkgcGF0aC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRGaWxlKFN0cmluZyBmaWxlbmFtZSkgeworICAgICAgICBhZGRGaWxlKGZpbGVuYW1lLCBmaWxlbmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyByZWNvcmQgb2YgYSBuZXcgZmlsZSwgYnkgZmlsZW5hbWUgYW5kIHBhdGguICBUaGUgcGF0aAorICAgICAqIG1heSBiZSByZWxhdGl2ZSB0byBhIHNvdXJjZSBjb21waWxhdGlvbiBwYXRoLgorICAgICAqCisgICAgICogQHBhcmFtIGZpbGVuYW1lIHRoZSBmaWxlbmFtZSB0byBhZGQsIHVucXVhbGlmaWVkIGJ5IHBhdGgKKyAgICAgKiBAcGFyYW0gZmlsZVBhdGggdGhlIHBhdGggZm9yIHRoZSBmaWxlbmFtZSwgcG90ZW50aWFsbHkgcmVsYXRpdmUKKyAgICAgKiAgICAgICAgICAgICAgICAgdG8gYSBzb3VyY2UgY29tcGlsYXRpb24gcGF0aAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEZpbGUoU3RyaW5nIGZpbGVuYW1lLCBTdHJpbmcgZmlsZVBhdGgpIHsKKyAgICAgICAgaW50IHBhdGhJbmRleCA9IGZpbGVQYXRoTGlzdC5pbmRleE9mKGZpbGVQYXRoKTsKKyAgICAgICAgaWYgKHBhdGhJbmRleCA9PSAtMSkgeworICAgICAgICAgICAgZmlsZU5hbWVMaXN0LmFkZChmaWxlbmFtZSk7CisgICAgICAgICAgICBmaWxlUGF0aExpc3QuYWRkKGZpbGVQYXRoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENvbWJpbmVzIGNvbnNlY3V0aXZlIExpbmVJbmZvcyB3aGVyZXZlciBwb3NzaWJsZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9wdGltaXplTGluZVNlY3Rpb24oKSB7CisKKy8qIFNvbWUgZGVidWdnaW5nIGNvZGUKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaW5lRGF0YS5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgTGluZUluZm8gbGkgPSAoTGluZUluZm8pbGluZURhdGEuZ2V0KGkpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludChsaS50b1N0cmluZygpKTsKKyAgICAgICAgfQorKi8KKyAgICAgICAgLy9JbmNvcnBvcmF0ZSBlYWNoIExpbmVJbmZvIGludG8gdGhlIHByZXZpb3VzIExpbmVJbmZvJ3MgCisgICAgICAgIC8vb3V0cHV0TGluZUluY3JlbWVudCwgaWYgcG9zc2libGUKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICB3aGlsZSAoaSA8IGxpbmVEYXRhLnNpemUoKSAtIDEpIHsKKyAgICAgICAgICAgIExpbmVJbmZvIGxpID0gKExpbmVJbmZvKWxpbmVEYXRhLmdldChpKTsKKyAgICAgICAgICAgIExpbmVJbmZvIGxpTmV4dCA9IChMaW5lSW5mbylsaW5lRGF0YS5nZXQoaSArIDEpOworICAgICAgICAgICAgaWYgKCFsaU5leHQubGluZUZpbGVJRFNldAorICAgICAgICAgICAgICAgICYmIGxpTmV4dC5pbnB1dFN0YXJ0TGluZSA9PSBsaS5pbnB1dFN0YXJ0TGluZQorICAgICAgICAgICAgICAgICYmIGxpTmV4dC5pbnB1dExpbmVDb3VudCA9PSAxCisgICAgICAgICAgICAgICAgJiYgbGkuaW5wdXRMaW5lQ291bnQgPT0gMQorICAgICAgICAgICAgICAgICYmIGxpTmV4dC5vdXRwdXRTdGFydExpbmUKKyAgICAgICAgICAgICAgICAgICAgPT0gbGkub3V0cHV0U3RhcnRMaW5lCisgICAgICAgICAgICAgICAgICAgICAgICArIGxpLmlucHV0TGluZUNvdW50ICogbGkub3V0cHV0TGluZUluY3JlbWVudCkgeworICAgICAgICAgICAgICAgIGxpLnNldE91dHB1dExpbmVJbmNyZW1lbnQoCisgICAgICAgICAgICAgICAgICAgIGxpTmV4dC5vdXRwdXRTdGFydExpbmUKKyAgICAgICAgICAgICAgICAgICAgICAgIC0gbGkub3V0cHV0U3RhcnRMaW5lCisgICAgICAgICAgICAgICAgICAgICAgICArIGxpTmV4dC5vdXRwdXRMaW5lSW5jcmVtZW50KTsKKyAgICAgICAgICAgICAgICBsaW5lRGF0YS5yZW1vdmUoaSArIDEpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvL0luY29ycG9yYXRlIGVhY2ggTGluZUluZm8gaW50byB0aGUgcHJldmlvdXMgTGluZUluZm8ncworICAgICAgICAvL2lucHV0TGluZUNvdW50LCBpZiBwb3NzaWJsZQorICAgICAgICBpID0gMDsKKyAgICAgICAgd2hpbGUgKGkgPCBsaW5lRGF0YS5zaXplKCkgLSAxKSB7CisgICAgICAgICAgICBMaW5lSW5mbyBsaSA9IChMaW5lSW5mbylsaW5lRGF0YS5nZXQoaSk7CisgICAgICAgICAgICBMaW5lSW5mbyBsaU5leHQgPSAoTGluZUluZm8pbGluZURhdGEuZ2V0KGkgKyAxKTsKKyAgICAgICAgICAgIGlmICghbGlOZXh0LmxpbmVGaWxlSURTZXQKKyAgICAgICAgICAgICAgICAmJiBsaU5leHQuaW5wdXRTdGFydExpbmUgPT0gbGkuaW5wdXRTdGFydExpbmUgKyBsaS5pbnB1dExpbmVDb3VudAorICAgICAgICAgICAgICAgICYmIGxpTmV4dC5vdXRwdXRMaW5lSW5jcmVtZW50ID09IGxpLm91dHB1dExpbmVJbmNyZW1lbnQKKyAgICAgICAgICAgICAgICAmJiBsaU5leHQub3V0cHV0U3RhcnRMaW5lCisgICAgICAgICAgICAgICAgICAgID09IGxpLm91dHB1dFN0YXJ0TGluZQorICAgICAgICAgICAgICAgICAgICAgICAgKyBsaS5pbnB1dExpbmVDb3VudCAqIGxpLm91dHB1dExpbmVJbmNyZW1lbnQpIHsKKyAgICAgICAgICAgICAgICBsaS5zZXRJbnB1dExpbmVDb3VudChsaS5pbnB1dExpbmVDb3VudCArIGxpTmV4dC5pbnB1dExpbmVDb3VudCk7CisgICAgICAgICAgICAgICAgbGluZURhdGEucmVtb3ZlKGkgKyAxKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBjb21wbGV0ZSBpbmZvcm1hdGlvbiBhYm91dCBhIHNpbXBsZSBsaW5lIG1hcHBpbmcuICBTcGVjaWZ5CisgICAgICogYWxsIHRoZSBmaWVsZHMgaW4gdGhpcyBtZXRob2Q7IHRoZSBiYWNrLWVuZCBtYWNoaW5lcnkgdGFrZXMgY2FyZQorICAgICAqIG9mIHByaW50aW5nIG9ubHkgdGhvc2UgdGhhdCBhcmUgbmVjZXNzYXJ5IGluIHRoZSBmaW5hbCBTTUFQLgorICAgICAqIChNeSB2aWV3IGlzIHRoYXQgZmllbGRzIGFyZSBvcHRpb25hbCBwcmltYXJpbHkgZm9yIHNwYXRpYWwgZWZmaWNpZW5jeSwKKyAgICAgKiBub3QgZm9yIHByb2dyYW1tZXIgY29udmVuaWVuY2UuICBDb3VsZCBhbHdheXMgYWRkIHV0aWxpdHkgbWV0aG9kcworICAgICAqIGxhdGVyLikKKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnB1dFN0YXJ0TGluZSBzdGFydGluZyBsaW5lIGluIHRoZSBzb3VyY2UgZmlsZQorICAgICAqICAgICAgICAoU01BUCA8dHQ+SW5wdXRTdGFydExpbmU8L3R0PikKKyAgICAgKiBAcGFyYW0gaW5wdXRGaWxlTmFtZSB0aGUgZmlsZXBhdGggKG9yIG5hbWUpIGZyb20gd2hpY2ggdGhlIGlucHV0IGNvbWVzCisgICAgICogICAgICAgICh5aWVsZHMgU01BUCA8dHQ+TGluZUZpbGVJRDwvdHQ+KSAgVXNlIHVucXVhbGlmaWVkIG5hbWVzCisgICAgICogICAgICAgIGNhcmVmdWxseSwgYW5kIG9ubHkgd2hlbiB0aGV5IHVuaXF1ZWx5IGlkZW50aWZ5IGEgZmlsZS4KKyAgICAgKiBAcGFyYW0gaW5wdXRMaW5lQ291bnQgdGhlIG51bWJlciBvZiBsaW5lcyBpbiB0aGUgaW5wdXQgdG8gbWFwCisgICAgICogICAgICAgIChTTUFQIDx0dD5MaW5lRmlsZUNvdW50PC90dD4pCisgICAgICogQHBhcmFtIG91dHB1dFN0YXJ0TGluZSBzdGFydGluZyBsaW5lIGluIHRoZSBvdXRwdXQgZmlsZSAKKyAgICAgKiAgICAgICAgKFNNQVAgPHR0Pk91dHB1dFN0YXJ0TGluZTwvdHQ+KQorICAgICAqIEBwYXJhbSBvdXRwdXRMaW5lSW5jcmVtZW50IG51bWJlciBvZiBvdXRwdXQgbGluZXMgdG8gbWFwIHRvIGVhY2gKKyAgICAgKiAgICAgICAgaW5wdXQgbGluZSAoU01BUCA8dHQ+T3V0cHV0TGluZUluY3JlbWVudDwvdHQ+KS4gIDxpPkdpdmVuIHRoZQorICAgICAqICAgICAgICBmYWN0IHRoYXQgdGhlIG5hbWUgc3RhcnRzIHdpdGggIm91dHB1dCIsIEkgY29udGludW91c2x5IGhhdmUKKyAgICAgKiAgICAgICAgdGhlIHN1YmNvbnNjaW91cyB1cmdlIHRvIGNhbGwgdGhpcyBmaWVsZAorICAgICAqICAgICAgICA8dHQ+T3V0cHV0TGluZUV4Y3JlbWVudDwvdHQ+LjwvaT4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRMaW5lRGF0YSgKKyAgICAgICAgaW50IGlucHV0U3RhcnRMaW5lLAorICAgICAgICBTdHJpbmcgaW5wdXRGaWxlTmFtZSwKKyAgICAgICAgaW50IGlucHV0TGluZUNvdW50LAorICAgICAgICBpbnQgb3V0cHV0U3RhcnRMaW5lLAorICAgICAgICBpbnQgb3V0cHV0TGluZUluY3JlbWVudCkgeworICAgICAgICAvLyBjaGVjayB0aGUgaW5wdXQgLSB3aGF0IGFyZSB5b3UgZG9pbmcgaGVyZT8/CisgICAgICAgIGludCBmaWxlSW5kZXggPSBmaWxlUGF0aExpc3QuaW5kZXhPZihpbnB1dEZpbGVOYW1lKTsKKyAgICAgICAgaWYgKGZpbGVJbmRleCA9PSAtMSkgLy8gc3RpbGwKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgImlucHV0RmlsZU5hbWU6ICIgKyBpbnB1dEZpbGVOYW1lKTsKKworICAgICAgICAvL0phc3BlciBpbmNvcnJlY3RseSBTTUFQcyBjZXJ0YWluIE5vZGVzLCBnaXZpbmcgdGhlbSBhbiAKKyAgICAgICAgLy9vdXRwdXRTdGFydExpbmUgb2YgMC4gIFRoaXMgY2FuIGNhdXNlIGEgZmF0YWwgZXJyb3IgaW4KKyAgICAgICAgLy9vcHRpbWl6ZUxpbmVTZWN0aW9uLCBtYWtpbmcgaXQgaW1wb3NzaWJsZSBmb3IgSmFzcGVyIHRvCisgICAgICAgIC8vY29tcGlsZSB0aGUgSlNQLiAgVW50aWwgd2UgY2FuIGZpeCB0aGUgdW5kZXJseWluZworICAgICAgICAvL1NNQVBwaW5nIHByb2JsZW0sIHdlIHNpbXBseSBpZ25vcmUgdGhlIGZsYXdlZCBTTUFQIGVudHJpZXMuCisgICAgICAgIGlmIChvdXRwdXRTdGFydExpbmUgPT0gMCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvLyBidWlsZCB0aGUgTGluZUluZm8KKyAgICAgICAgTGluZUluZm8gbGkgPSBuZXcgTGluZUluZm8oKTsKKyAgICAgICAgbGkuc2V0SW5wdXRTdGFydExpbmUoaW5wdXRTdGFydExpbmUpOworICAgICAgICBsaS5zZXRJbnB1dExpbmVDb3VudChpbnB1dExpbmVDb3VudCk7CisgICAgICAgIGxpLnNldE91dHB1dFN0YXJ0TGluZShvdXRwdXRTdGFydExpbmUpOworICAgICAgICBsaS5zZXRPdXRwdXRMaW5lSW5jcmVtZW50KG91dHB1dExpbmVJbmNyZW1lbnQpOworICAgICAgICBpZiAoZmlsZUluZGV4ICE9IGxhc3RGaWxlSUQpCisgICAgICAgICAgICBsaS5zZXRMaW5lRmlsZUlEKGZpbGVJbmRleCk7CisgICAgICAgIGxhc3RGaWxlSUQgPSBmaWxlSW5kZXg7CisKKyAgICAgICAgLy8gc2F2ZSBpdAorICAgICAgICBsaW5lRGF0YS5hZGQobGkpOworICAgIH0KKworICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgLy8gTWV0aG9kcyB0byByZXRyaWV2ZSBpbmZvcm1hdGlvbgorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgc3RyYXR1bS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmF0dW1OYW1lKCkgeworICAgICAgICByZXR1cm4gc3RyYXR1bU5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gc3RyYXR1bSBhcyBhIFN0cmluZzogIGEgU3RyYXR1bVNlY3Rpb24sCisgICAgICogZm9sbG93ZWQgYnkgYXQgbGVhc3Qgb25lIEZpbGVTZWN0aW9uIGFuZCBhdCBsZWFzdCBvbmUgTGluZVNlY3Rpb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoKSB7CisgICAgICAgIC8vIGNoZWNrIHN0YXRlIGFuZCBpbml0aWFsaXplIGJ1ZmZlcgorICAgICAgICBpZiAoZmlsZU5hbWVMaXN0LnNpemUoKSA9PSAwIHx8IGxpbmVEYXRhLnNpemUoKSA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIG91dCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKworICAgICAgICAvLyBwcmludCBTdHJhdHVtU2VjdGlvbgorICAgICAgICBvdXQuYXBwZW5kKCIqUyAiICsgc3RyYXR1bU5hbWUgKyAiXG4iKTsKKworICAgICAgICAvLyBwcmludCBGaWxlU2VjdGlvbgorICAgICAgICBvdXQuYXBwZW5kKCIqRlxuIik7CisgICAgICAgIGludCBib3VuZCA9IGZpbGVOYW1lTGlzdC5zaXplKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYm91bmQ7IGkrKykgeworICAgICAgICAgICAgaWYgKGZpbGVQYXRoTGlzdC5nZXQoaSkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoIisgIiArIGkgKyAiICIgKyBmaWxlTmFtZUxpc3QuZ2V0KGkpICsgIlxuIik7CisgICAgICAgICAgICAgICAgLy8gU291cmNlIHBhdGhzIG11c3QgYmUgcmVsYXRpdmUsIG5vdCBhYnNvbHV0ZSwgc28gd2UKKyAgICAgICAgICAgICAgICAvLyByZW1vdmUgdGhlIGxlYWRpbmcgIi8iLCBpZiBvbmUgZXhpc3RzLgorICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlUGF0aCA9IChTdHJpbmcpZmlsZVBhdGhMaXN0LmdldChpKTsKKyAgICAgICAgICAgICAgICBpZiAoZmlsZVBhdGguc3RhcnRzV2l0aCgiLyIpKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbGVQYXRoID0gZmlsZVBhdGguc3Vic3RyaW5nKDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKGZpbGVQYXRoICsgIlxuIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoaSArICIgIiArIGZpbGVOYW1lTGlzdC5nZXQoaSkgKyAiXG4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIHByaW50IExpbmVTZWN0aW9uCisgICAgICAgIG91dC5hcHBlbmQoIipMXG4iKTsKKyAgICAgICAgYm91bmQgPSBsaW5lRGF0YS5zaXplKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYm91bmQ7IGkrKykgeworICAgICAgICAgICAgTGluZUluZm8gbGkgPSAoTGluZUluZm8pbGluZURhdGEuZ2V0KGkpOworICAgICAgICAgICAgb3V0LmFwcGVuZChsaS5nZXRTdHJpbmcoKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gb3V0LnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIGdldFN0cmluZygpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL2NvbXBpbGVyL1NtYXBVdGlsLmphdmEgYi9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvU21hcFV0aWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjhkMjIxCi0tLSAvZGV2L251bGwKKysrIGIvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL2NvbXBpbGVyL1NtYXBVdGlsLmphdmEKQEAgLTAsMCArMSw3MjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphc3Blci5jb21waWxlcjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLkphc3BlckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5Kc3BDb21waWxhdGlvbkNvbnRleHQ7CisKKy8qKgorICogQ29udGFpbnMgc3RhdGljIHV0aWxpdGllcyBmb3IgZ2VuZXJhdGluZyBTTUFQIGRhdGEgYmFzZWQgb24gdGhlCisgKiBjdXJyZW50IHZlcnNpb24gb2YgSmFzcGVyLgorICogCisgKiBAYXV0aG9yIEpheXNvbiBGYWxrbmVyCisgKiBAYXV0aG9yIFNoYXduIEJheWVybgorICogQGF1dGhvciBSb2JlcnQgRmllbGQgKGlubmVyIFNERUluc3RhbGxlciBjbGFzcykKKyAqIEBhdXRob3IgTWFyayBSb3RoCisgKiBAYXV0aG9yIEtpbi1tYW4gQ2h1bmcKKyAqLworcHVibGljIGNsYXNzIFNtYXBVdGlsIHsKKworICAgIHByaXZhdGUgc3RhdGljIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZyBsb2c9CisgICAgICAgIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3RvcnkuZ2V0TG9nKCBTbWFwVXRpbC5jbGFzcyApOworCisgICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAvLyBDb25zdGFudHMKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNNQVBfRU5DT0RJTkcgPSAiVVRGLTgiOworCisgICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAvLyBQdWJsaWMgZW50cnkgcG9pbnRzCisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZXMgYW4gYXBwcm9wcmlhdGUgU01BUCByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgY29tcGlsYXRpb24KKyAgICAgKiBjb250ZXh0LiAgKEpTUi0wNDUuKQorICAgICAqCisgICAgICogQHBhcmFtIGN0eHQgQ3VycmVudCBjb21waWxhdGlvbiBjb250ZXh0CisgICAgICogQHBhcmFtIHBhZ2VOb2RlcyBUaGUgY3VycmVudCBKU1AgcGFnZQorICAgICAqIEByZXR1cm4gYSBTTUFQIGZvciB0aGUgcGFnZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2VuZXJhdGVTbWFwKAorICAgICAgICBKc3BDb21waWxhdGlvbkNvbnRleHQgY3R4dCwKKyAgICAgICAgTm9kZS5Ob2RlcyBwYWdlTm9kZXMpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gU2NhbiB0aGUgbm9kZXMgZm9yIHByZXNlbmNlIG9mIEphc3BlciBnZW5lcmF0ZWQgaW5uZXIgY2xhc3NlcworICAgICAgICBQcmVTY2FuVmlzaXRvciBwc1Zpc2l0b3IgPSBuZXcgUHJlU2NhblZpc2l0b3IoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHBhZ2VOb2Rlcy52aXNpdChwc1Zpc2l0b3IpOworICAgICAgICB9IGNhdGNoIChKYXNwZXJFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgfQorICAgICAgICBIYXNoTWFwIG1hcCA9IHBzVmlzaXRvci5nZXRNYXAoKTsKKworICAgICAgICAvLyBzZXQgdXAgb3VyIFNNQVAgZ2VuZXJhdG9yCisgICAgICAgIFNtYXBHZW5lcmF0b3IgZyA9IG5ldyBTbWFwR2VuZXJhdG9yKCk7CisgICAgICAgIAorICAgICAgICAvKiogRGlzYWJsZSByZWFkaW5nIG9mIGlucHV0IFNNQVAgYmVjYXVzZToKKyAgICAgICAgICAgIDEuIFRoZXJlIGlzIGEgYnVnIGhlcmU6IGdldFJlYWxQYXRoKCkgaXMgbnVsbCBpZiAuanNwIGlzIGluIGEgamFyCisgICAgICAgIAlCdWd6aWxsYSAxNDY2MC4KKyAgICAgICAgICAgIDIuIE1hcHBpbmdzIGZyb20gb3RoZXIgc291cmNlcyBpbnRvIC5qc3AgZmlsZXMgYXJlIG5vdCBzdXBwb3J0ZWQuCisgICAgICAgICAgICBUT0RPOiBmaXggMS4gaWYgMi4gaXMgbm90IHRydWUuCisgICAgICAgIC8vIGRldGVybWluZSBpZiB3ZSBoYXZlIGFuIGlucHV0IFNNQVAKKyAgICAgICAgU3RyaW5nIHNtYXBQYXRoID0gaW5wdXRTbWFwUGF0aChjdHh0LmdldFJlYWxQYXRoKGN0eHQuZ2V0SnNwRmlsZSgpKSk7CisgICAgICAgICAgICBGaWxlIGlucHV0U21hcCA9IG5ldyBGaWxlKHNtYXBQYXRoKTsKKyAgICAgICAgICAgIGlmIChpbnB1dFNtYXAuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICBieXRlW10gZW1iZWRkZWRTbWFwID0gbnVsbDsKKyAgICAgICAgICAgIGJ5dGVbXSBzdWJTbWFwID0gU0RFSW5zdGFsbGVyLnJlYWRXaG9sZShpbnB1dFNtYXApOworICAgICAgICAgICAgU3RyaW5nIHN1YlNtYXBTdHJpbmcgPSBuZXcgU3RyaW5nKHN1YlNtYXAsIFNNQVBfRU5DT0RJTkcpOworICAgICAgICAgICAgZy5hZGRTbWFwKHN1YlNtYXBTdHJpbmcsICJKU1AiKTsKKyAgICAgICAgfQorICAgICAgICAqKi8KKworICAgICAgICAvLyBub3csIGFzc2VtYmxlIGluZm8gYWJvdXQgb3VyIG93biBzdHJhdHVtIChKU1ApIHVzaW5nIEpzcExpbmVNYXAKKyAgICAgICAgU21hcFN0cmF0dW0gcyA9IG5ldyBTbWFwU3RyYXR1bSgiSlNQIik7CisKKyAgICAgICAgZy5zZXRPdXRwdXRGaWxlTmFtZSh1bnF1YWxpZnkoY3R4dC5nZXRTZXJ2bGV0SmF2YUZpbGVOYW1lKCkpKTsKKworICAgICAgICAvLyBNYXAgb3V0IE5vZGUuTm9kZXMKKyAgICAgICAgZXZhbHVhdGVOb2RlcyhwYWdlTm9kZXMsIHMsIG1hcCwgY3R4dC5nZXRPcHRpb25zKCkuZ2V0TWFwcGVkRmlsZSgpKTsKKyAgICAgICAgcy5vcHRpbWl6ZUxpbmVTZWN0aW9uKCk7CisgICAgICAgIGcuYWRkU3RyYXR1bShzLCB0cnVlKTsKKworICAgICAgICBpZiAoY3R4dC5nZXRPcHRpb25zKCkuaXNTbWFwRHVtcGVkKCkpIHsKKyAgICAgICAgICAgIEZpbGUgb3V0U21hcCA9IG5ldyBGaWxlKGN0eHQuZ2V0Q2xhc3NGaWxlTmFtZSgpICsgIi5zbWFwIik7CisgICAgICAgICAgICBQcmludFdyaXRlciBzbyA9CisgICAgICAgICAgICAgICAgbmV3IFByaW50V3JpdGVyKAorICAgICAgICAgICAgICAgICAgICBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGVPdXRwdXRTdHJlYW0ob3V0U21hcCksCisgICAgICAgICAgICAgICAgICAgICAgICBTTUFQX0VOQ09ESU5HKSk7CisgICAgICAgICAgICBzby5wcmludChnLmdldFN0cmluZygpKTsKKyAgICAgICAgICAgIHNvLmNsb3NlKCk7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgY2xhc3NGaWxlTmFtZSA9IGN0eHQuZ2V0Q2xhc3NGaWxlTmFtZSgpOworICAgICAgICBpbnQgaW5uZXJDbGFzc0NvdW50ID0gbWFwLnNpemUoKTsKKyAgICAgICAgU3RyaW5nIFtdIHNtYXBJbmZvID0gbmV3IFN0cmluZ1syICsgaW5uZXJDbGFzc0NvdW50KjJdOworICAgICAgICBzbWFwSW5mb1swXSA9IGNsYXNzRmlsZU5hbWU7CisgICAgICAgIHNtYXBJbmZvWzFdID0gZy5nZXRTdHJpbmcoKTsKKworICAgICAgICBpbnQgY291bnQgPSAyOworICAgICAgICBJdGVyYXRvciBpdGVyID0gbWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIFN0cmluZyBpbm5lckNsYXNzID0gKFN0cmluZykgZW50cnkuZ2V0S2V5KCk7CisgICAgICAgICAgICBzID0gKFNtYXBTdHJhdHVtKSBlbnRyeS5nZXRWYWx1ZSgpOworICAgICAgICAgICAgcy5vcHRpbWl6ZUxpbmVTZWN0aW9uKCk7CisgICAgICAgICAgICBnID0gbmV3IFNtYXBHZW5lcmF0b3IoKTsKKyAgICAgICAgICAgIGcuc2V0T3V0cHV0RmlsZU5hbWUodW5xdWFsaWZ5KGN0eHQuZ2V0U2VydmxldEphdmFGaWxlTmFtZSgpKSk7CisgICAgICAgICAgICBnLmFkZFN0cmF0dW0ocywgdHJ1ZSk7CisKKyAgICAgICAgICAgIFN0cmluZyBpbm5lckNsYXNzRmlsZU5hbWUgPQorICAgICAgICAgICAgICAgIGNsYXNzRmlsZU5hbWUuc3Vic3RyaW5nKDAsIGNsYXNzRmlsZU5hbWUuaW5kZXhPZigiLmNsYXNzIikpICsKKyAgICAgICAgICAgICAgICAnJCcgKyBpbm5lckNsYXNzICsgIi5jbGFzcyI7CisgICAgICAgICAgICBpZiAoY3R4dC5nZXRPcHRpb25zKCkuaXNTbWFwRHVtcGVkKCkpIHsKKyAgICAgICAgICAgICAgICBGaWxlIG91dFNtYXAgPSBuZXcgRmlsZShpbm5lckNsYXNzRmlsZU5hbWUgKyAiLnNtYXAiKTsKKyAgICAgICAgICAgICAgICBQcmludFdyaXRlciBzbyA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBQcmludFdyaXRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGVPdXRwdXRTdHJlYW0ob3V0U21hcCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU01BUF9FTkNPRElORykpOworICAgICAgICAgICAgICAgIHNvLnByaW50KGcuZ2V0U3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHNvLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzbWFwSW5mb1tjb3VudF0gPSBpbm5lckNsYXNzRmlsZU5hbWU7CisgICAgICAgICAgICBzbWFwSW5mb1tjb3VudCsxXSA9IGcuZ2V0U3RyaW5nKCk7CisgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHNtYXBJbmZvOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBpbnN0YWxsU21hcChTdHJpbmdbXSBzbWFwKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoc21hcCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNtYXAubGVuZ3RoOyBpICs9IDIpIHsKKyAgICAgICAgICAgIEZpbGUgb3V0U2VydmxldCA9IG5ldyBGaWxlKHNtYXBbaV0pOworICAgICAgICAgICAgU0RFSW5zdGFsbGVyLmluc3RhbGwob3V0U2VydmxldCwgc21hcFtpKzFdLmdldEJ5dGVzKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAvLyBQcml2YXRlIHV0aWxpdGllcworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhbiB1bnF1YWxpZmllZCB2ZXJzaW9uIG9mIHRoZSBnaXZlbiBmaWxlIHBhdGguCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHVucXVhbGlmeShTdHJpbmcgcGF0aCkgeworICAgICAgICBwYXRoID0gcGF0aC5yZXBsYWNlKCdcXCcsICcvJyk7CisgICAgICAgIHJldHVybiBwYXRoLnN1YnN0cmluZyhwYXRoLmxhc3RJbmRleE9mKCcvJykgKyAxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgZmlsZSBwYXRoIGNvcnJlc3BvbmRpbmcgdG8gYSBwb3RlbnRpYWwgU01BUCBpbnB1dAorICAgICAqIGZvciB0aGUgZ2l2ZW4gY29tcGlsYXRpb24gaW5wdXQgKEpTUCBmaWxlKS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgaW5wdXRTbWFwUGF0aChTdHJpbmcgcGF0aCkgeworICAgICAgICByZXR1cm4gcGF0aC5zdWJzdHJpbmcoMCwgcGF0aC5sYXN0SW5kZXhPZignLicpICsgMSkgKyAic21hcCI7CisgICAgfQorCisgICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAvLyBJbnN0YWxsYXRpb24gbG9naWMgKGZyb20gUm9iZXJ0IEZpZWxkLCBKU1ItMDQ1IHNwZWMgbGVhZCkKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTREVJbnN0YWxsZXIgeworCisgICAgICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgbmFtZVNERSA9ICJTb3VyY2VEZWJ1Z0V4dGVuc2lvbiI7CisKKyAgICAgICAgYnl0ZVtdIG9yaWc7CisgICAgICAgIGJ5dGVbXSBzZGVBdHRyOworICAgICAgICBieXRlW10gZ2VuOworCisgICAgICAgIGludCBvcmlnUG9zID0gMDsKKyAgICAgICAgaW50IGdlblBvcyA9IDA7CisKKyAgICAgICAgaW50IHNkZUluZGV4OworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPT0gMikgeworICAgICAgICAgICAgICAgIGluc3RhbGwobmV3IEZpbGUoYXJnc1swXSksIG5ldyBGaWxlKGFyZ3NbMV0pKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJncy5sZW5ndGggPT0gMykgeworICAgICAgICAgICAgICAgIGluc3RhbGwoCisgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKGFyZ3NbMF0pLAorICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZShhcmdzWzFdKSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGUoYXJnc1syXSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oCisgICAgICAgICAgICAgICAgICAgICJVc2FnZTogPGNvbW1hbmQ+IDxpbnB1dCBjbGFzcyBmaWxlPiAiCisgICAgICAgICAgICAgICAgICAgICAgICArICI8YXR0cmlidXRlIGZpbGU+IDxvdXRwdXQgY2xhc3MgZmlsZSBuYW1lPlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiPGNvbW1hbmQ+IDxpbnB1dC9vdXRwdXQgY2xhc3MgZmlsZT4gPGF0dHJpYnV0ZSBmaWxlPiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIHZvaWQgaW5zdGFsbChGaWxlIGluQ2xhc3NGaWxlLCBGaWxlIGF0dHJGaWxlLCBGaWxlIG91dENsYXNzRmlsZSkKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBuZXcgU0RFSW5zdGFsbGVyKGluQ2xhc3NGaWxlLCBhdHRyRmlsZSwgb3V0Q2xhc3NGaWxlKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyB2b2lkIGluc3RhbGwoRmlsZSBpbk91dENsYXNzRmlsZSwgRmlsZSBhdHRyRmlsZSkKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBGaWxlIHRtcEZpbGUgPSBuZXcgRmlsZShpbk91dENsYXNzRmlsZS5nZXRQYXRoKCkgKyAidG1wIik7CisgICAgICAgICAgICBuZXcgU0RFSW5zdGFsbGVyKGluT3V0Q2xhc3NGaWxlLCBhdHRyRmlsZSwgdG1wRmlsZSk7CisgICAgICAgICAgICBpZiAoIWluT3V0Q2xhc3NGaWxlLmRlbGV0ZSgpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJpbk91dENsYXNzRmlsZS5kZWxldGUoKSBmYWlsZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghdG1wRmlsZS5yZW5hbWVUbyhpbk91dENsYXNzRmlsZSkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oInRtcEZpbGUucmVuYW1lVG8oaW5PdXRDbGFzc0ZpbGUpIGZhaWxlZCIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIHZvaWQgaW5zdGFsbChGaWxlIGNsYXNzRmlsZSwgYnl0ZVtdIHNtYXApIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBGaWxlIHRtcEZpbGUgPSBuZXcgRmlsZShjbGFzc0ZpbGUuZ2V0UGF0aCgpICsgInRtcCIpOworICAgICAgICAgICAgbmV3IFNERUluc3RhbGxlcihjbGFzc0ZpbGUsIHNtYXAsIHRtcEZpbGUpOworICAgICAgICAgICAgaWYgKCFjbGFzc0ZpbGUuZGVsZXRlKCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oImNsYXNzRmlsZS5kZWxldGUoKSBmYWlsZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghdG1wRmlsZS5yZW5hbWVUbyhjbGFzc0ZpbGUpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJ0bXBGaWxlLnJlbmFtZVRvKGNsYXNzRmlsZSkgZmFpbGVkIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBTREVJbnN0YWxsZXIoRmlsZSBpbkNsYXNzRmlsZSwgYnl0ZVtdIHNkZUF0dHIsIEZpbGUgb3V0Q2xhc3NGaWxlKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmICghaW5DbGFzc0ZpbGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCJubyBzdWNoIGZpbGU6ICIgKyBpbkNsYXNzRmlsZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRoaXMuc2RlQXR0ciA9IHNkZUF0dHI7CisgICAgICAgICAgICAvLyBnZXQgdGhlIGJ5dGVzCisgICAgICAgICAgICBvcmlnID0gcmVhZFdob2xlKGluQ2xhc3NGaWxlKTsKKyAgICAgICAgICAgIGdlbiA9IG5ldyBieXRlW29yaWcubGVuZ3RoICsgc2RlQXR0ci5sZW5ndGggKyAxMDBdOworCisgICAgICAgICAgICAvLyBkbyBpdAorICAgICAgICAgICAgYWRkU0RFKCk7CisKKyAgICAgICAgICAgIC8vIHdyaXRlIHJlc3VsdAorICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBvdXRTdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbShvdXRDbGFzc0ZpbGUpOworICAgICAgICAgICAgb3V0U3RyZWFtLndyaXRlKGdlbiwgMCwgZ2VuUG9zKTsKKyAgICAgICAgICAgIG91dFN0cmVhbS5jbG9zZSgpOworICAgICAgICB9CisKKyAgICAgICAgU0RFSW5zdGFsbGVyKEZpbGUgaW5DbGFzc0ZpbGUsIEZpbGUgYXR0ckZpbGUsIEZpbGUgb3V0Q2xhc3NGaWxlKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHRoaXMoaW5DbGFzc0ZpbGUsIHJlYWRXaG9sZShhdHRyRmlsZSksIG91dENsYXNzRmlsZSk7CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgYnl0ZVtdIHJlYWRXaG9sZShGaWxlIGlucHV0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIGluU3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShpbnB1dCk7CisgICAgICAgICAgICBpbnQgbGVuID0gKGludClpbnB1dC5sZW5ndGgoKTsKKyAgICAgICAgICAgIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW2xlbl07CisgICAgICAgICAgICBpZiAoaW5TdHJlYW0ucmVhZChieXRlcywgMCwgbGVuKSAhPSBsZW4pIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oImV4cGVjdGVkIHNpemU6ICIgKyBsZW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5TdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgICAgIHJldHVybiBieXRlczsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgYWRkU0RFKCkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgY29weSg0ICsgMiArIDIpOyAvLyBtYWdpYyBtaW4vbWFqIHZlcnNpb24KKyAgICAgICAgICAgIGludCBjb25zdGFudFBvb2xDb3VudFBvcyA9IGdlblBvczsKKyAgICAgICAgICAgIGludCBjb25zdGFudFBvb2xDb3VudCA9IHJlYWRVMigpOworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiY29uc3RhbnQgcG9vbCBjb3VudDogIiArIGNvbnN0YW50UG9vbENvdW50KTsKKyAgICAgICAgICAgIHdyaXRlVTIoY29uc3RhbnRQb29sQ291bnQpOworCisgICAgICAgICAgICAvLyBjb3B5IG9sZCBjb25zdGFudCBwb29sIHJldHVybiBpbmRleCBvZiBTREUgc3ltYm9sLCBpZiBmb3VuZAorICAgICAgICAgICAgc2RlSW5kZXggPSBjb3B5Q29uc3RhbnRQb29sKGNvbnN0YW50UG9vbENvdW50KTsKKyAgICAgICAgICAgIGlmIChzZGVJbmRleCA8IDApIHsKKyAgICAgICAgICAgICAgICAvLyBpZiAiU291cmNlRGVidWdFeHRlbnNpb24iIHN5bWJvbCBub3QgdGhlcmUgYWRkIGl0CisgICAgICAgICAgICAgICAgd3JpdGVVdGY4Rm9yU0RFKCk7CisKKyAgICAgICAgICAgICAgICAvLyBpbmNyZW1lbnQgdGhlIGNvdW50YW50UG9vbENvdW50CisgICAgICAgICAgICAgICAgc2RlSW5kZXggPSBjb25zdGFudFBvb2xDb3VudDsKKyAgICAgICAgICAgICAgICArK2NvbnN0YW50UG9vbENvdW50OworICAgICAgICAgICAgICAgIHJhbmRvbUFjY2Vzc1dyaXRlVTIoY29uc3RhbnRQb29sQ291bnRQb3MsIGNvbnN0YW50UG9vbENvdW50KTsKKworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJTb3VyY2VEZWJ1Z0V4dGVuc2lvbiBub3QgZm91bmQsIGluc3RhbGxlZCBhdDogIiArIHNkZUluZGV4KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlNvdXJjZURlYnVnRXh0ZW5zaW9uIGZvdW5kIGF0OiAiICsgc2RlSW5kZXgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29weSgyICsgMiArIDIpOyAvLyBhY2Nlc3MsIHRoaXMsIHN1cGVyCisgICAgICAgICAgICBpbnQgaW50ZXJmYWNlQ291bnQgPSByZWFkVTIoKTsKKyAgICAgICAgICAgIHdyaXRlVTIoaW50ZXJmYWNlQ291bnQpOworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiaW50ZXJmYWNlQ291bnQ6ICIgKyBpbnRlcmZhY2VDb3VudCk7CisgICAgICAgICAgICBjb3B5KGludGVyZmFjZUNvdW50ICogMik7CisgICAgICAgICAgICBjb3B5TWVtYmVycygpOyAvLyBmaWVsZHMKKyAgICAgICAgICAgIGNvcHlNZW1iZXJzKCk7IC8vIG1ldGhvZHMKKyAgICAgICAgICAgIGludCBhdHRyQ291bnRQb3MgPSBnZW5Qb3M7CisgICAgICAgICAgICBpbnQgYXR0ckNvdW50ID0gcmVhZFUyKCk7CisgICAgICAgICAgICB3cml0ZVUyKGF0dHJDb3VudCk7CisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJjbGFzcyBhdHRyQ291bnQ6ICIgKyBhdHRyQ291bnQpOworICAgICAgICAgICAgLy8gY29weSB0aGUgY2xhc3MgYXR0cmlidXRlcywgcmV0dXJuIHRydWUgaWYgU0RFIGF0dHIgZm91bmQgKG5vdCBjb3BpZWQpCisgICAgICAgICAgICBpZiAoIWNvcHlBdHRycyhhdHRyQ291bnQpKSB7CisgICAgICAgICAgICAgICAgLy8gd2Ugd2lsbCBiZSBhZGRpbmcgU0RFIGFuZCBpdCBpc24ndCBhbHJlYWR5IGNvdW50ZWQKKyAgICAgICAgICAgICAgICArK2F0dHJDb3VudDsKKyAgICAgICAgICAgICAgICByYW5kb21BY2Nlc3NXcml0ZVUyKGF0dHJDb3VudFBvcywgYXR0ckNvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiY2xhc3MgYXR0ckNvdW50IGluY3JlbWVudGVkIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3cml0ZUF0dHJGb3JTREUoc2RlSW5kZXgpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBjb3B5TWVtYmVycygpIHsKKyAgICAgICAgICAgIGludCBjb3VudCA9IHJlYWRVMigpOworICAgICAgICAgICAgd3JpdGVVMihjb3VudCk7CisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJtZW1iZXJzIGNvdW50OiAiICsgY291bnQpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisgICAgICAgICAgICAgICAgY29weSg2KTsgLy8gYWNjZXNzLCBuYW1lLCBkZXNjcmlwdG9yCisgICAgICAgICAgICAgICAgaW50IGF0dHJDb3VudCA9IHJlYWRVMigpOworICAgICAgICAgICAgICAgIHdyaXRlVTIoYXR0ckNvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygibWVtYmVyIGF0dHIgY291bnQ6ICIgKyBhdHRyQ291bnQpOworICAgICAgICAgICAgICAgIGNvcHlBdHRycyhhdHRyQ291bnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiBjb3B5QXR0cnMoaW50IGF0dHJDb3VudCkgeworICAgICAgICAgICAgYm9vbGVhbiBzZGVGb3VuZCA9IGZhbHNlOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyQ291bnQ7ICsraSkgeworICAgICAgICAgICAgICAgIGludCBuYW1lSW5kZXggPSByZWFkVTIoKTsKKyAgICAgICAgICAgICAgICAvLyBkb24ndCB3cml0ZSBvbGQgU0RFCisgICAgICAgICAgICAgICAgaWYgKG5hbWVJbmRleCA9PSBzZGVJbmRleCkgeworICAgICAgICAgICAgICAgICAgICBzZGVGb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiU0RFIGF0dHIgZm91bmQiKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB3cml0ZVUyKG5hbWVJbmRleCk7IC8vIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgaW50IGxlbiA9IHJlYWRVNCgpOworICAgICAgICAgICAgICAgICAgICB3cml0ZVU0KGxlbik7CisgICAgICAgICAgICAgICAgICAgIGNvcHkobGVuKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJhdHRyIGxlbjogIiArIGxlbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHNkZUZvdW5kOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCB3cml0ZUF0dHJGb3JTREUoaW50IGluZGV4KSB7CisgICAgICAgICAgICB3cml0ZVUyKGluZGV4KTsKKyAgICAgICAgICAgIHdyaXRlVTQoc2RlQXR0ci5sZW5ndGgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZGVBdHRyLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICAgICAgd3JpdGVVMShzZGVBdHRyW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgcmFuZG9tQWNjZXNzV3JpdGVVMihpbnQgcG9zLCBpbnQgdmFsKSB7CisgICAgICAgICAgICBpbnQgc2F2ZVBvcyA9IGdlblBvczsKKyAgICAgICAgICAgIGdlblBvcyA9IHBvczsKKyAgICAgICAgICAgIHdyaXRlVTIodmFsKTsKKyAgICAgICAgICAgIGdlblBvcyA9IHNhdmVQb3M7CisgICAgICAgIH0KKworICAgICAgICBpbnQgcmVhZFUxKCkgeworICAgICAgICAgICAgcmV0dXJuICgoaW50KW9yaWdbb3JpZ1BvcysrXSkgJiAweEZGOworICAgICAgICB9CisKKyAgICAgICAgaW50IHJlYWRVMigpIHsKKyAgICAgICAgICAgIGludCByZXMgPSByZWFkVTEoKTsKKyAgICAgICAgICAgIHJldHVybiAocmVzIDw8IDgpICsgcmVhZFUxKCk7CisgICAgICAgIH0KKworICAgICAgICBpbnQgcmVhZFU0KCkgeworICAgICAgICAgICAgaW50IHJlcyA9IHJlYWRVMigpOworICAgICAgICAgICAgcmV0dXJuIChyZXMgPDwgMTYpICsgcmVhZFUyKCk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHdyaXRlVTEoaW50IHZhbCkgeworICAgICAgICAgICAgZ2VuW2dlblBvcysrXSA9IChieXRlKXZhbDsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgd3JpdGVVMihpbnQgdmFsKSB7CisgICAgICAgICAgICB3cml0ZVUxKHZhbCA+PiA4KTsKKyAgICAgICAgICAgIHdyaXRlVTEodmFsICYgMHhGRik7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHdyaXRlVTQoaW50IHZhbCkgeworICAgICAgICAgICAgd3JpdGVVMih2YWwgPj4gMTYpOworICAgICAgICAgICAgd3JpdGVVMih2YWwgJiAweEZGRkYpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBjb3B5KGludCBjb3VudCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisgICAgICAgICAgICAgICAgZ2VuW2dlblBvcysrXSA9IG9yaWdbb3JpZ1BvcysrXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGJ5dGVbXSByZWFkQnl0ZXMoaW50IGNvdW50KSB7CisgICAgICAgICAgICBieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVtjb3VudF07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKKyAgICAgICAgICAgICAgICBieXRlc1tpXSA9IG9yaWdbb3JpZ1BvcysrXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBieXRlczsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgd3JpdGVCeXRlcyhieXRlW10gYnl0ZXMpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgICAgICBnZW5bZ2VuUG9zKytdID0gYnl0ZXNbaV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpbnQgY29weUNvbnN0YW50UG9vbChpbnQgY29uc3RhbnRQb29sQ291bnQpCisgICAgICAgICAgICB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICAgICAgaW50IHNkZUluZGV4ID0gLTE7CisgICAgICAgICAgICAvLyBjb3B5IGNvbnN0IHBvb2wgaW5kZXggemVybyBub3QgaW4gY2xhc3MgZmlsZQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBjb25zdGFudFBvb2xDb3VudDsgKytpKSB7CisgICAgICAgICAgICAgICAgaW50IHRhZyA9IHJlYWRVMSgpOworICAgICAgICAgICAgICAgIHdyaXRlVTEodGFnKTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHRhZykgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDcgOiAvLyBDbGFzcworICAgICAgICAgICAgICAgICAgICBjYXNlIDggOiAvLyBTdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoaSArICIgY29weWluZyAyIGJ5dGVzIik7CisgICAgICAgICAgICAgICAgICAgICAgICBjb3B5KDIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgOSA6IC8vIEZpZWxkCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTAgOiAvLyBNZXRob2QKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxMSA6IC8vIEludGVyZmFjZU1ldGhvZAorICAgICAgICAgICAgICAgICAgICBjYXNlIDMgOiAvLyBJbnRlZ2VyCisgICAgICAgICAgICAgICAgICAgIGNhc2UgNCA6IC8vIEZsb2F0CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTIgOiAvLyBOYW1lQW5kVHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhpICsgIiBjb3B5aW5nIDQgYnl0ZXMiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvcHkoNCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1IDogLy8gTG9uZworICAgICAgICAgICAgICAgICAgICBjYXNlIDYgOiAvLyBEb3VibGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoaSArICIgY29weWluZyA4IGJ5dGVzIik7CisgICAgICAgICAgICAgICAgICAgICAgICBjb3B5KDgpOworICAgICAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMSA6IC8vIFV0ZjgKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4gPSByZWFkVTIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlVTIobGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSB1dGY4ID0gcmVhZEJ5dGVzKGxlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc3RyID0gbmV3IFN0cmluZyh1dGY4LCAiVVRGLTgiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoaSArICIgcmVhZCBjbGFzcyBhdHRyIC0tICciICsgc3RyICsgIiciKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHIuZXF1YWxzKG5hbWVTREUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2RlSW5kZXggPSBpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVCeXRlcyh1dGY4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigidW5leHBlY3RlZCB0YWc6ICIgKyB0YWcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzZGVJbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgd3JpdGVVdGY4Rm9yU0RFKCkgeworICAgICAgICAgICAgaW50IGxlbiA9IG5hbWVTREUubGVuZ3RoKCk7CisgICAgICAgICAgICB3cml0ZVUxKDEpOyAvLyBVdGY4IHRhZworICAgICAgICAgICAgd3JpdGVVMihsZW4pOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47ICsraSkgeworICAgICAgICAgICAgICAgIHdyaXRlVTEobmFtZVNERS5jaGFyQXQoaSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGV2YWx1YXRlTm9kZXMoCisgICAgICAgIE5vZGUuTm9kZXMgbm9kZXMsCisgICAgICAgIFNtYXBTdHJhdHVtIHMsCisgICAgICAgIEhhc2hNYXAgaW5uZXJDbGFzc01hcCwKKyAgICAgICAgYm9vbGVhbiBicmVha0F0TEYpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5vZGVzLnZpc2l0KG5ldyBTbWFwR2VuVmlzaXRvcihzLCBicmVha0F0TEYsIGlubmVyQ2xhc3NNYXApKTsKKyAgICAgICAgfSBjYXRjaCAoSmFzcGVyRXhjZXB0aW9uIGV4KSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgU21hcEdlblZpc2l0b3IgZXh0ZW5kcyBOb2RlLlZpc2l0b3IgeworCisgICAgICAgIHByaXZhdGUgU21hcFN0cmF0dW0gc21hcDsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGJyZWFrQXRMRjsKKyAgICAgICAgcHJpdmF0ZSBIYXNoTWFwIGlubmVyQ2xhc3NNYXA7CisKKyAgICAgICAgU21hcEdlblZpc2l0b3IoU21hcFN0cmF0dW0gcywgYm9vbGVhbiBicmVha0F0TEYsIEhhc2hNYXAgbWFwKSB7CisgICAgICAgICAgICB0aGlzLnNtYXAgPSBzOworICAgICAgICAgICAgdGhpcy5icmVha0F0TEYgPSBicmVha0F0TEY7CisgICAgICAgICAgICB0aGlzLmlubmVyQ2xhc3NNYXAgPSBtYXA7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdEJvZHkoTm9kZSBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIFNtYXBTdHJhdHVtIHNtYXBTYXZlID0gc21hcDsKKyAgICAgICAgICAgIFN0cmluZyBpbm5lckNsYXNzID0gbi5nZXRJbm5lckNsYXNzTmFtZSgpOworICAgICAgICAgICAgaWYgKGlubmVyQ2xhc3MgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRoaXMuc21hcCA9IChTbWFwU3RyYXR1bSkgaW5uZXJDbGFzc01hcC5nZXQoaW5uZXJDbGFzcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdXBlci52aXNpdEJvZHkobik7CisgICAgICAgICAgICBzbWFwID0gc21hcFNhdmU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLkRlY2xhcmF0aW9uIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgZG9TbWFwVGV4dChuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuRXhwcmVzc2lvbiBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGRvU21hcFRleHQobik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLlNjcmlwdGxldCBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGRvU21hcFRleHQobik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLkluY2x1ZGVBY3Rpb24gbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBkb1NtYXAobik7CisgICAgICAgICAgICB2aXNpdEJvZHkobik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLkZvcndhcmRBY3Rpb24gbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBkb1NtYXAobik7CisgICAgICAgICAgICB2aXNpdEJvZHkobik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLkdldFByb3BlcnR5IG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgZG9TbWFwKG4pOworICAgICAgICAgICAgdmlzaXRCb2R5KG4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5TZXRQcm9wZXJ0eSBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGRvU21hcChuKTsKKyAgICAgICAgICAgIHZpc2l0Qm9keShuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuVXNlQmVhbiBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGRvU21hcChuKTsKKyAgICAgICAgICAgIHZpc2l0Qm9keShuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuUGx1Z0luIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgZG9TbWFwKG4pOworICAgICAgICAgICAgdmlzaXRCb2R5KG4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5DdXN0b21UYWcgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBkb1NtYXAobik7CisgICAgICAgICAgICB2aXNpdEJvZHkobik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLlVuaW50ZXJwcmV0ZWRUYWcgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBkb1NtYXAobik7CisgICAgICAgICAgICB2aXNpdEJvZHkobik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLkpzcEVsZW1lbnQgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBkb1NtYXAobik7CisgICAgICAgICAgICB2aXNpdEJvZHkobik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLkpzcFRleHQgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBkb1NtYXAobik7CisgICAgICAgICAgICB2aXNpdEJvZHkobik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLk5hbWVkQXR0cmlidXRlIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgdmlzaXRCb2R5KG4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5Kc3BCb2R5IG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgZG9TbWFwKG4pOworICAgICAgICAgICAgdmlzaXRCb2R5KG4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5JbnZva2VBY3Rpb24gbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBkb1NtYXAobik7CisgICAgICAgICAgICB2aXNpdEJvZHkobik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLkRvQm9keUFjdGlvbiBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGRvU21hcChuKTsKKyAgICAgICAgICAgIHZpc2l0Qm9keShuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuRUxFeHByZXNzaW9uIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgZG9TbWFwKG4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5UZW1wbGF0ZVRleHQgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBNYXJrIG1hcmsgPSBuLmdldFN0YXJ0KCk7CisgICAgICAgICAgICBpZiAobWFyayA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvL0FkZCB0aGUgZmlsZSBpbmZvcm1hdGlvbgorICAgICAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gbWFyay5nZXRGaWxlKCk7CisgICAgICAgICAgICBzbWFwLmFkZEZpbGUodW5xdWFsaWZ5KGZpbGVOYW1lKSwgZmlsZU5hbWUpOworCisgICAgICAgICAgICAvL0FkZCBhIExpbmVJbmZvIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGlzIG5vZGUKKyAgICAgICAgICAgIGludCBpSW5wdXRTdGFydExpbmUgPSBtYXJrLmdldExpbmVOdW1iZXIoKTsKKyAgICAgICAgICAgIGludCBpT3V0cHV0U3RhcnRMaW5lID0gbi5nZXRCZWdpbkphdmFMaW5lKCk7CisgICAgICAgICAgICBpbnQgaU91dHB1dExpbmVJbmNyZW1lbnQgPSBicmVha0F0TEY/IDE6IDA7CisgICAgICAgICAgICBzbWFwLmFkZExpbmVEYXRhKGlJbnB1dFN0YXJ0TGluZSwgZmlsZU5hbWUsIDEsIGlPdXRwdXRTdGFydExpbmUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpT3V0cHV0TGluZUluY3JlbWVudCk7CisKKyAgICAgICAgICAgIC8vIE91dHB1dCBhZGRpdGlvbmFsIG1hcHBpbmdzIGluIHRoZSB0ZXh0CisgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGV4dHJhU21hcCA9IG4uZ2V0RXh0cmFTbWFwKCk7CisKKyAgICAgICAgICAgIGlmIChleHRyYVNtYXAgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0cmFTbWFwLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlPdXRwdXRTdGFydExpbmUgKz0gaU91dHB1dExpbmVJbmNyZW1lbnQ7CisgICAgICAgICAgICAgICAgICAgIHNtYXAuYWRkTGluZURhdGEoCisgICAgICAgICAgICAgICAgICAgICAgICBpSW5wdXRTdGFydExpbmUrKChJbnRlZ2VyKWV4dHJhU21hcC5nZXQoaSkpLmludFZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgICAgICAgICBpT3V0cHV0U3RhcnRMaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgaU91dHB1dExpbmVJbmNyZW1lbnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBkb1NtYXAoCisgICAgICAgICAgICBOb2RlIG4sCisgICAgICAgICAgICBpbnQgaW5MaW5lQ291bnQsCisgICAgICAgICAgICBpbnQgb3V0SW5jcmVtZW50LAorICAgICAgICAgICAgaW50IHNraXBwZWRMaW5lcykgeworICAgICAgICAgICAgTWFyayBtYXJrID0gbi5nZXRTdGFydCgpOworICAgICAgICAgICAgaWYgKG1hcmsgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RyaW5nIHVucXVhbGlmaWVkTmFtZSA9IHVucXVhbGlmeShtYXJrLmdldEZpbGUoKSk7CisgICAgICAgICAgICBzbWFwLmFkZEZpbGUodW5xdWFsaWZpZWROYW1lLCBtYXJrLmdldEZpbGUoKSk7CisgICAgICAgICAgICBzbWFwLmFkZExpbmVEYXRhKAorICAgICAgICAgICAgICAgIG1hcmsuZ2V0TGluZU51bWJlcigpICsgc2tpcHBlZExpbmVzLAorICAgICAgICAgICAgICAgIG1hcmsuZ2V0RmlsZSgpLAorICAgICAgICAgICAgICAgIGluTGluZUNvdW50IC0gc2tpcHBlZExpbmVzLAorICAgICAgICAgICAgICAgIG4uZ2V0QmVnaW5KYXZhTGluZSgpICsgc2tpcHBlZExpbmVzLAorICAgICAgICAgICAgICAgIG91dEluY3JlbWVudCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgZG9TbWFwKE5vZGUgbikgeworICAgICAgICAgICAgZG9TbWFwKG4sIDEsIG4uZ2V0RW5kSmF2YUxpbmUoKSAtIG4uZ2V0QmVnaW5KYXZhTGluZSgpLCAwKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBkb1NtYXBUZXh0KE5vZGUgbikgeworICAgICAgICAgICAgU3RyaW5nIHRleHQgPSBuLmdldFRleHQoKTsKKyAgICAgICAgICAgIGludCBpbmRleCA9IDA7CisgICAgICAgICAgICBpbnQgbmV4dCA9IDA7CisgICAgICAgICAgICBpbnQgbGluZUNvdW50ID0gMTsKKyAgICAgICAgICAgIGludCBza2lwcGVkTGluZXMgPSAwOworICAgICAgICAgICAgYm9vbGVhbiBzbGFzaFN0YXJTZWVuID0gZmFsc2U7CisgICAgICAgICAgICBib29sZWFuIGJlZ2lubmluZyA9IHRydWU7CisKKyAgICAgICAgICAgIC8vIENvdW50IGxpbmVzIGluc2lkZSB0ZXh0LCBidXQgc2tpcHBpbmcgY29tbWVudCBsaW5lcyBhdCB0aGUKKyAgICAgICAgICAgIC8vIGJlZ2lubmluZyBvZiB0aGUgdGV4dC4KKyAgICAgICAgICAgIHdoaWxlICgobmV4dCA9IHRleHQuaW5kZXhPZignXG4nLCBpbmRleCkpID4gLTEpIHsKKyAgICAgICAgICAgICAgICBpZiAoYmVnaW5uaW5nKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsaW5lID0gdGV4dC5zdWJzdHJpbmcoaW5kZXgsIG5leHQpLnRyaW0oKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFzbGFzaFN0YXJTZWVuICYmIGxpbmUuc3RhcnRzV2l0aCgiLyoiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2xhc2hTdGFyU2VlbiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHNsYXNoU3RhclNlZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXBwZWRMaW5lcysrOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVuZEluZGV4ID0gbGluZS5pbmRleE9mKCIqLyIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVuZEluZGV4ID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFbmQgb2YgLyogKi8gY29tbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsYXNoU3RhclNlZW4gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW5kSW5kZXggPCBsaW5lLmxlbmd0aCgpIC0gMikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTb21lIGV4ZWN1dGFibGUgY29kZSBhZnRlciBjb21tZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXBwZWRMaW5lcy0tOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWdpbm5pbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGluZS5sZW5ndGgoKSA9PSAwIHx8IGxpbmUuc3RhcnRzV2l0aCgiLy8iKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2tpcHBlZExpbmVzKys7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBiZWdpbm5pbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsaW5lQ291bnQrKzsKKyAgICAgICAgICAgICAgICBpbmRleCA9IG5leHQgKyAxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkb1NtYXAobiwgbGluZUNvdW50LCAxLCBza2lwcGVkTGluZXMpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUHJlU2NhblZpc2l0b3IgZXh0ZW5kcyBOb2RlLlZpc2l0b3IgeworCisgICAgICAgIEhhc2hNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKKworICAgICAgICBwdWJsaWMgdm9pZCBkb1Zpc2l0KE5vZGUgbikgeworICAgICAgICAgICAgU3RyaW5nIGlubmVyID0gbi5nZXRJbm5lckNsYXNzTmFtZSgpOworICAgICAgICAgICAgaWYgKGlubmVyICE9IG51bGwgJiYgIW1hcC5jb250YWluc0tleShpbm5lcikpIHsKKyAgICAgICAgICAgICAgICBtYXAucHV0KGlubmVyLCBuZXcgU21hcFN0cmF0dW0oIkpTUCIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEhhc2hNYXAgZ2V0TWFwKCkgeworICAgICAgICAgICAgcmV0dXJuIG1hcDsKKyAgICAgICAgfQorICAgIH0KKyAgICAKK30KZGlmZiAtLWdpdCBhL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9UYWdDb25zdGFudHMuamF2YSBiL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9UYWdDb25zdGFudHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTExOGFmCi0tLSAvZGV2L251bGwKKysrIGIvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL2NvbXBpbGVyL1RhZ0NvbnN0YW50cy5qYXZhCkBAIC0wLDAgKzEsMTE1IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYXNwZXIuY29tcGlsZXI7CisKK3B1YmxpYyBpbnRlcmZhY2UgVGFnQ29uc3RhbnRzIHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9VUkkgPSAiaHR0cDovL2phdmEuc3VuLmNvbS9KU1AvUGFnZSI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVJFQ1RJVkVfQUNUSU9OID0gImRpcmVjdGl2ZS4iOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9PVF9BQ1RJT04gPSAicm9vdCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX1JPT1RfQUNUSU9OID0gImpzcDpyb290IjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfRElSRUNUSVZFX0FDVElPTiA9ICJkaXJlY3RpdmUucGFnZSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX1BBR0VfRElSRUNUSVZFX0FDVElPTiA9ICJqc3A6ZGlyZWN0aXZlLnBhZ2UiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5DTFVERV9ESVJFQ1RJVkVfQUNUSU9OID0gImRpcmVjdGl2ZS5pbmNsdWRlIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfSU5DTFVERV9ESVJFQ1RJVkVfQUNUSU9OID0gImpzcDpkaXJlY3RpdmUuaW5jbHVkZSI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUNMQVJBVElPTl9BQ1RJT04gPSAiZGVjbGFyYXRpb24iOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9ERUNMQVJBVElPTl9BQ1RJT04gPSAianNwOmRlY2xhcmF0aW9uIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNDUklQVExFVF9BQ1RJT04gPSAic2NyaXB0bGV0IjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfU0NSSVBUTEVUX0FDVElPTiA9ICJqc3A6c2NyaXB0bGV0IjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYUFJFU1NJT05fQUNUSU9OID0gImV4cHJlc3Npb24iOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9FWFBSRVNTSU9OX0FDVElPTiA9ICJqc3A6ZXhwcmVzc2lvbiI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VfQkVBTl9BQ1RJT04gPSAidXNlQmVhbiI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX1VTRV9CRUFOX0FDVElPTiA9ICJqc3A6dXNlQmVhbiI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVRfUFJPUEVSVFlfQUNUSU9OID0gInNldFByb3BlcnR5IjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfU0VUX1BST1BFUlRZX0FDVElPTiA9ICJqc3A6c2V0UHJvcGVydHkiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VUX1BST1BFUlRZX0FDVElPTiA9ICJnZXRQcm9wZXJ0eSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0dFVF9QUk9QRVJUWV9BQ1RJT04gPSAianNwOmdldFByb3BlcnR5IjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOQ0xVREVfQUNUSU9OID0gImluY2x1ZGUiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9JTkNMVURFX0FDVElPTiA9ICJqc3A6aW5jbHVkZSI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JXQVJEX0FDVElPTiA9ICJmb3J3YXJkIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfRk9SV0FSRF9BQ1RJT04gPSAianNwOmZvcndhcmQiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fQUNUSU9OID0gInBhcmFtIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfUEFSQU1fQUNUSU9OID0gImpzcDpwYXJhbSI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTVNfQUNUSU9OID0gInBhcmFtcyI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX1BBUkFNU19BQ1RJT04gPSAianNwOnBhcmFtcyI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fQUNUSU9OID0gInBsdWdpbiI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX1BMVUdJTl9BQ1RJT04gPSAianNwOnBsdWdpbiI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQUxMQkFDS19BQ1RJT04gPSAiZmFsbGJhY2siOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9GQUxMQkFDS19BQ1RJT04gPSAianNwOmZhbGxiYWNrIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfQUNUSU9OID0gInRleHQiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9URVhUX0FDVElPTiA9ICJqc3A6dGV4dCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX1RFWFRfQUNUSU9OX0VORCA9ICI8L2pzcDp0ZXh0PiI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfQUNUSU9OID0gImF0dHJpYnV0ZSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0FUVFJJQlVURV9BQ1RJT04gPSAianNwOmF0dHJpYnV0ZSI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCT0RZX0FDVElPTiA9ICJib2R5IjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfQk9EWV9BQ1RJT04gPSAianNwOmJvZHkiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9BQ1RJT04gPSAiZWxlbWVudCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0VMRU1FTlRfQUNUSU9OID0gImpzcDplbGVtZW50IjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9VVFBVVF9BQ1RJT04gPSAib3V0cHV0IjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfT1VUUFVUX0FDVElPTiA9ICJqc3A6b3V0cHV0IjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR0xJQl9ESVJFQ1RJVkVfQUNUSU9OID0gInRhZ2xpYiI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX1RBR0xJQl9ESVJFQ1RJVkVfQUNUSU9OID0gImpzcDp0YWdsaWIiOworCisgICAgLyoKKyAgICAgKiBUYWcgRmlsZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlZPS0VfQUNUSU9OID0gImludm9rZSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0lOVk9LRV9BQ1RJT04gPSAianNwOmludm9rZSI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET0JPRFlfQUNUSU9OID0gImRvQm9keSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0RPQk9EWV9BQ1RJT04gPSAianNwOmRvQm9keSI7CisKKyAgICAvKgorICAgICAqIFRhZyBGaWxlIERpcmVjdGl2ZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfRElSRUNUSVZFX0FDVElPTiA9ICJkaXJlY3RpdmUudGFnIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfVEFHX0RJUkVDVElWRV9BQ1RJT04gPSAianNwOmRpcmVjdGl2ZS50YWciOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX0RJUkVDVElWRV9BQ1RJT04gPSAiZGlyZWN0aXZlLmF0dHJpYnV0ZSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0FUVFJJQlVURV9ESVJFQ1RJVkVfQUNUSU9OID0gImpzcDpkaXJlY3RpdmUuYXR0cmlidXRlIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBUklBQkxFX0RJUkVDVElWRV9BQ1RJT04gPSAiZGlyZWN0aXZlLnZhcmlhYmxlIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfVkFSSUFCTEVfRElSRUNUSVZFX0FDVElPTiA9ICJqc3A6ZGlyZWN0aXZlLnZhcmlhYmxlIjsKKworICAgIC8qCisgICAgICogRGlyZWN0aXZlIGF0dHJpYnV0ZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUk5fSlNQVEFHRElSID0gInVybjpqc3B0YWdkaXI6IjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUk5fSlNQVExEID0gInVybjpqc3B0bGQ6IjsKK30KZGlmZiAtLWdpdCBhL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9UYWdGaWxlUHJvY2Vzc29yLmphdmEgYi9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvVGFnRmlsZVByb2Nlc3Nvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MzUxOWQKLS0tIC9kZXYvbnVsbAorKysgYi9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvVGFnRmlsZVByb2Nlc3Nvci5qYXZhCkBAIC0wLDAgKzEsNjA3IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYXNwZXIuY29tcGlsZXI7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWdBdHRyaWJ1dGVJbmZvOworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWdFeHRyYUluZm87CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZ0ZpbGVJbmZvOworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWdJbmZvOworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWdMaWJyYXJ5SW5mbzsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnVmFyaWFibGVJbmZvOworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5WYXJpYWJsZUluZm87CisKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5KYXNwZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIuSnNwQ29tcGlsYXRpb25Db250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLnNlcnZsZXQuSnNwU2VydmxldFdyYXBwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIucnVudGltZS5Kc3BTb3VyY2VEZXBlbmRlbnQ7CisKKy8qKgorICogMS4gUHJvY2Vzc2VzIGFuZCBleHRyYWN0cyB0aGUgZGlyZWN0aXZlIGluZm8gaW4gYSB0YWcgZmlsZS4KKyAqIDIuIENvbXBpbGVzIGFuZCBsb2FkcyB0YWcgZmlsZXMgdXNlZCBpbiBhIEpTUCBmaWxlLgorICoKKyAqIEBhdXRob3IgS2luLW1hbiBDaHVuZworICovCisKK2NsYXNzIFRhZ0ZpbGVQcm9jZXNzb3IgeworCisgICAgcHJpdmF0ZSBWZWN0b3IgdGVtcFZlY3RvcjsKKworICAgIC8qKgorICAgICAqIEEgdmlzaXRvciB0aGUgdGFnIGZpbGUKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBUYWdGaWxlRGlyZWN0aXZlVmlzaXRvciBleHRlbmRzIE5vZGUuVmlzaXRvciB7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnNwVXRpbC5WYWxpZEF0dHJpYnV0ZVtdIHRhZ0RpcmVjdGl2ZUF0dHJzID0geworICAgICAgICAgICAgbmV3IEpzcFV0aWwuVmFsaWRBdHRyaWJ1dGUoImRpc3BsYXktbmFtZSIpLAorICAgICAgICAgICAgbmV3IEpzcFV0aWwuVmFsaWRBdHRyaWJ1dGUoImJvZHktY29udGVudCIpLAorICAgICAgICAgICAgbmV3IEpzcFV0aWwuVmFsaWRBdHRyaWJ1dGUoImR5bmFtaWMtYXR0cmlidXRlcyIpLAorICAgICAgICAgICAgbmV3IEpzcFV0aWwuVmFsaWRBdHRyaWJ1dGUoInNtYWxsLWljb24iKSwKKyAgICAgICAgICAgIG5ldyBKc3BVdGlsLlZhbGlkQXR0cmlidXRlKCJsYXJnZS1pY29uIiksCisgICAgICAgICAgICBuZXcgSnNwVXRpbC5WYWxpZEF0dHJpYnV0ZSgiZGVzY3JpcHRpb24iKSwKKyAgICAgICAgICAgIG5ldyBKc3BVdGlsLlZhbGlkQXR0cmlidXRlKCJleGFtcGxlIiksCisgICAgICAgICAgICBuZXcgSnNwVXRpbC5WYWxpZEF0dHJpYnV0ZSgicGFnZUVuY29kaW5nIiksCisgICAgICAgICAgICBuZXcgSnNwVXRpbC5WYWxpZEF0dHJpYnV0ZSgibGFuZ3VhZ2UiKSwKKyAgICAgICAgICAgIG5ldyBKc3BVdGlsLlZhbGlkQXR0cmlidXRlKCJpbXBvcnQiKSwKKyAgICAgICAgICAgIG5ldyBKc3BVdGlsLlZhbGlkQXR0cmlidXRlKCJpc0VMSWdub3JlZCIpIH07CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnNwVXRpbC5WYWxpZEF0dHJpYnV0ZVtdIGF0dHJpYnV0ZURpcmVjdGl2ZUF0dHJzID0geworICAgICAgICAgICAgbmV3IEpzcFV0aWwuVmFsaWRBdHRyaWJ1dGUoIm5hbWUiLCB0cnVlKSwKKyAgICAgICAgICAgIG5ldyBKc3BVdGlsLlZhbGlkQXR0cmlidXRlKCJyZXF1aXJlZCIpLAorICAgICAgICAgICAgbmV3IEpzcFV0aWwuVmFsaWRBdHRyaWJ1dGUoImZyYWdtZW50IiksCisgICAgICAgICAgICBuZXcgSnNwVXRpbC5WYWxpZEF0dHJpYnV0ZSgicnRleHBydmFsdWUiKSwKKyAgICAgICAgICAgIG5ldyBKc3BVdGlsLlZhbGlkQXR0cmlidXRlKCJ0eXBlIiksCisgICAgICAgICAgICBuZXcgSnNwVXRpbC5WYWxpZEF0dHJpYnV0ZSgiZGVzY3JpcHRpb24iKQorICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEpzcFV0aWwuVmFsaWRBdHRyaWJ1dGVbXSB2YXJpYWJsZURpcmVjdGl2ZUF0dHJzID0geworICAgICAgICAgICAgbmV3IEpzcFV0aWwuVmFsaWRBdHRyaWJ1dGUoIm5hbWUtZ2l2ZW4iKSwKKyAgICAgICAgICAgIG5ldyBKc3BVdGlsLlZhbGlkQXR0cmlidXRlKCJuYW1lLWZyb20tYXR0cmlidXRlIiksCisgICAgICAgICAgICBuZXcgSnNwVXRpbC5WYWxpZEF0dHJpYnV0ZSgiYWxpYXMiKSwKKyAgICAgICAgICAgIG5ldyBKc3BVdGlsLlZhbGlkQXR0cmlidXRlKCJ2YXJpYWJsZS1jbGFzcyIpLAorICAgICAgICAgICAgbmV3IEpzcFV0aWwuVmFsaWRBdHRyaWJ1dGUoInNjb3BlIiksCisgICAgICAgICAgICBuZXcgSnNwVXRpbC5WYWxpZEF0dHJpYnV0ZSgiZGVjbGFyZSIpLAorICAgICAgICAgICAgbmV3IEpzcFV0aWwuVmFsaWRBdHRyaWJ1dGUoImRlc2NyaXB0aW9uIikKKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIEVycm9yRGlzcGF0Y2hlciBlcnI7CisgICAgICAgIHByaXZhdGUgVGFnTGlicmFyeUluZm8gdGFnTGliSW5mbzsKKworICAgICAgICBwcml2YXRlIFN0cmluZyBuYW1lID0gbnVsbDsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgcGF0aCA9IG51bGw7CisgICAgICAgIHByaXZhdGUgVGFnRXh0cmFJbmZvIHRlaSA9IG51bGw7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIGJvZHljb250ZW50ID0gbnVsbDsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb24gPSBudWxsOworICAgICAgICBwcml2YXRlIFN0cmluZyBkaXNwbGF5TmFtZSA9IG51bGw7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIHNtYWxsSWNvbiA9IG51bGw7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIGxhcmdlSWNvbiA9IG51bGw7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIGR5bmFtaWNBdHRyc01hcE5hbWU7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIGV4YW1wbGUgPSBudWxsOworICAgICAgICAKKyAgICAgICAgcHJpdmF0ZSBWZWN0b3IgYXR0cmlidXRlVmVjdG9yOworICAgICAgICBwcml2YXRlIFZlY3RvciB2YXJpYWJsZVZlY3RvcjsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FID0KKyAgICAgICAgICAgICJ0aGUgbmFtZSBhdHRyaWJ1dGUgb2YgdGhlIGF0dHJpYnV0ZSBkaXJlY3RpdmUiOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFSX05BTUVfR0lWRU4gPQorICAgICAgICAgICAgInRoZSBuYW1lLWdpdmVuIGF0dHJpYnV0ZSBvZiB0aGUgdmFyaWFibGUgZGlyZWN0aXZlIjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBUl9OQU1FX0ZST00gPQorICAgICAgICAgICAgInRoZSBuYW1lLWZyb20tYXR0cmlidXRlIGF0dHJpYnV0ZSBvZiB0aGUgdmFyaWFibGUgZGlyZWN0aXZlIjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBUl9BTElBUyA9CisgICAgICAgICAgICAidGhlIGFsaWFzIGF0dHJpYnV0ZSBvZiB0aGUgdmFyaWFibGUgZGlyZWN0aXZlIjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19EWU5BTUlDID0KKyAgICAgICAgICAgICJ0aGUgZHluYW1pYy1hdHRyaWJ1dGVzIGF0dHJpYnV0ZSBvZiB0aGUgdGFnIGRpcmVjdGl2ZSI7CisgICAgICAgIHByaXZhdGUgSGFzaE1hcCBuYW1lVGFibGUgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICBwcml2YXRlIEhhc2hNYXAgbmFtZUZyb21UYWJsZSA9IG5ldyBIYXNoTWFwKCk7CisKKyAgICAgICAgcHVibGljIFRhZ0ZpbGVEaXJlY3RpdmVWaXNpdG9yKENvbXBpbGVyIGNvbXBpbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFnTGlicmFyeUluZm8gdGFnTGliSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgICAgIGVyciA9IGNvbXBpbGVyLmdldEVycm9yRGlzcGF0Y2hlcigpOworICAgICAgICAgICAgdGhpcy50YWdMaWJJbmZvID0gdGFnTGliSW5mbzsKKyAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgICAgICB0aGlzLnBhdGggPSBwYXRoOworICAgICAgICAgICAgYXR0cmlidXRlVmVjdG9yID0gbmV3IFZlY3RvcigpOworICAgICAgICAgICAgdmFyaWFibGVWZWN0b3IgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLlRhZ0RpcmVjdGl2ZSBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKworICAgICAgICAgICAgSnNwVXRpbC5jaGVja0F0dHJpYnV0ZXMoIlRhZyBkaXJlY3RpdmUiLCBuLCB0YWdEaXJlY3RpdmVBdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7CisKKyAgICAgICAgICAgIGJvZHljb250ZW50ID0gY2hlY2tDb25mbGljdChuLCBib2R5Y29udGVudCwgImJvZHktY29udGVudCIpOworICAgICAgICAgICAgaWYgKGJvZHljb250ZW50ICE9IG51bGwgJiYKKyAgICAgICAgICAgICAgICAgICAgIWJvZHljb250ZW50LmVxdWFsc0lnbm9yZUNhc2UoVGFnSW5mby5CT0RZX0NPTlRFTlRfRU1QVFkpICYmCisgICAgICAgICAgICAgICAgICAgICFib2R5Y29udGVudC5lcXVhbHNJZ25vcmVDYXNlKFRhZ0luZm8uQk9EWV9DT05URU5UX1RBR19ERVBFTkRFTlQpICYmCisgICAgICAgICAgICAgICAgICAgICFib2R5Y29udGVudC5lcXVhbHNJZ25vcmVDYXNlKFRhZ0luZm8uQk9EWV9DT05URU5UX1NDUklQVExFU1MpKSB7CisgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKG4sICJqc3AuZXJyb3IudGFnZGlyZWN0aXZlLmJhZGJvZHljb250ZW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9keWNvbnRlbnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZHluYW1pY0F0dHJzTWFwTmFtZSA9IGNoZWNrQ29uZmxpY3QobiwgZHluYW1pY0F0dHJzTWFwTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkeW5hbWljLWF0dHJpYnV0ZXMiKTsKKyAgICAgICAgICAgIGlmIChkeW5hbWljQXR0cnNNYXBOYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjaGVja1VuaXF1ZU5hbWUoZHluYW1pY0F0dHJzTWFwTmFtZSwgVEFHX0RZTkFNSUMsIG4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc21hbGxJY29uID0gY2hlY2tDb25mbGljdChuLCBzbWFsbEljb24sICJzbWFsbC1pY29uIik7CisgICAgICAgICAgICBsYXJnZUljb24gPSBjaGVja0NvbmZsaWN0KG4sIGxhcmdlSWNvbiwgImxhcmdlLWljb24iKTsKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gY2hlY2tDb25mbGljdChuLCBkZXNjcmlwdGlvbiwgImRlc2NyaXB0aW9uIik7CisgICAgICAgICAgICBkaXNwbGF5TmFtZSA9IGNoZWNrQ29uZmxpY3QobiwgZGlzcGxheU5hbWUsICJkaXNwbGF5LW5hbWUiKTsKKyAgICAgICAgICAgIGV4YW1wbGUgPSBjaGVja0NvbmZsaWN0KG4sIGV4YW1wbGUsICJleGFtcGxlIik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFN0cmluZyBjaGVja0NvbmZsaWN0KE5vZGUgbiwgU3RyaW5nIG9sZEF0dHJWYWx1ZSwgU3RyaW5nIGF0dHIpCisgICAgICAgICAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisKKyAgICAgICAgICAgIFN0cmluZyByZXN1bHQgPSBvbGRBdHRyVmFsdWU7CisgICAgICAgICAgICBTdHJpbmcgYXR0clZhbHVlID0gbi5nZXRBdHRyaWJ1dGVWYWx1ZShhdHRyKTsKKyAgICAgICAgICAgIGlmIChhdHRyVmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChvbGRBdHRyVmFsdWUgIT0gbnVsbCAmJiAhb2xkQXR0clZhbHVlLmVxdWFscyhhdHRyVmFsdWUpKSB7CisgICAgICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcihuLCAianNwLmVycm9yLnRhZy5jb25mbGljdC5hdHRyIiwgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZEF0dHJWYWx1ZSwgYXR0clZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gYXR0clZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICAgICAgCisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5BdHRyaWJ1dGVEaXJlY3RpdmUgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisKKyAgICAgICAgICAgIEpzcFV0aWwuY2hlY2tBdHRyaWJ1dGVzKCJBdHRyaWJ1dGUgZGlyZWN0aXZlIiwgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZURpcmVjdGl2ZUF0dHJzLCBlcnIpOworCisgICAgICAgICAgICBTdHJpbmcgYXR0ck5hbWUgPSBuLmdldEF0dHJpYnV0ZVZhbHVlKCJuYW1lIik7CisgICAgICAgICAgICBib29sZWFuIHJlcXVpcmVkID0gSnNwVXRpbC5ib29sZWFuVmFsdWUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5nZXRBdHRyaWJ1dGVWYWx1ZSgicmVxdWlyZWQiKSk7CisgICAgICAgICAgICBib29sZWFuIHJ0ZXhwcnZhbHVlID0gdHJ1ZTsKKyAgICAgICAgICAgIFN0cmluZyBydGV4cHJ2YWx1ZVN0cmluZyA9IG4uZ2V0QXR0cmlidXRlVmFsdWUoInJ0ZXhwcnZhbHVlIik7CisgICAgICAgICAgICBpZiAocnRleHBydmFsdWVTdHJpbmcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJ0ZXhwcnZhbHVlID0gSnNwVXRpbC5ib29sZWFuVmFsdWUoIHJ0ZXhwcnZhbHVlU3RyaW5nICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBib29sZWFuIGZyYWdtZW50ID0gSnNwVXRpbC5ib29sZWFuVmFsdWUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5nZXRBdHRyaWJ1dGVWYWx1ZSgiZnJhZ21lbnQiKSk7CisgICAgICAgICAgICBTdHJpbmcgdHlwZSA9IG4uZ2V0QXR0cmlidXRlVmFsdWUoInR5cGUiKTsKKyAgICAgICAgICAgIGlmIChmcmFnbWVudCkgeworICAgICAgICAgICAgICAgIC8vIHR5cGUgaXMgZml4ZWQgdG8gIkpzcEZyYWdtZW50IiBhbmQgYSB0cmFuc2xhdGlvbiBlcnJvcgorICAgICAgICAgICAgICAgIC8vIG11c3Qgb2NjdXIgaWYgc3BlY2lmaWVkLgorICAgICAgICAgICAgICAgIGlmICh0eXBlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKG4sICJqc3AuZXJyb3IuZnJhZ21lbnR3aXRodHlwZSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBydGV4cHJ2YWx1ZSBpcyBmaXhlZCB0byAidHJ1ZSIgYW5kIGEgdHJhbnNsYXRpb24gZXJyb3IKKyAgICAgICAgICAgICAgICAvLyBtdXN0IG9jY3VyIGlmIHNwZWNpZmllZC4KKyAgICAgICAgICAgICAgICBydGV4cHJ2YWx1ZSA9IHRydWU7CisgICAgICAgICAgICAgICAgaWYoIHJ0ZXhwcnZhbHVlU3RyaW5nICE9IG51bGwgKSB7CisgICAgICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcihuLCAianNwLmVycm9yLmZyZ21lbnR3aXRocnRleHBydmFsdWUiICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICB0eXBlID0gImphdmEubGFuZy5TdHJpbmciOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBUYWdBdHRyaWJ1dGVJbmZvIHRhZ0F0dHJpYnV0ZUluZm8gPQorICAgICAgICAgICAgICAgICAgICBuZXcgVGFnQXR0cmlidXRlSW5mbyhhdHRyTmFtZSwgcmVxdWlyZWQsIHR5cGUsIHJ0ZXhwcnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFnbWVudCk7CisgICAgICAgICAgICBhdHRyaWJ1dGVWZWN0b3IuYWRkRWxlbWVudCh0YWdBdHRyaWJ1dGVJbmZvKTsKKyAgICAgICAgICAgIGNoZWNrVW5pcXVlTmFtZShhdHRyTmFtZSwgQVRUUl9OQU1FLCBuLCB0YWdBdHRyaWJ1dGVJbmZvKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuVmFyaWFibGVEaXJlY3RpdmUgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisKKyAgICAgICAgICAgIEpzcFV0aWwuY2hlY2tBdHRyaWJ1dGVzKCJWYXJpYWJsZSBkaXJlY3RpdmUiLCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVEaXJlY3RpdmVBdHRycywgZXJyKTsKKworICAgICAgICAgICAgU3RyaW5nIG5hbWVHaXZlbiA9IG4uZ2V0QXR0cmlidXRlVmFsdWUoIm5hbWUtZ2l2ZW4iKTsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lRnJvbUF0dHJpYnV0ZSA9IG4uZ2V0QXR0cmlidXRlVmFsdWUoIm5hbWUtZnJvbS1hdHRyaWJ1dGUiKTsKKyAgICAgICAgICAgIGlmIChuYW1lR2l2ZW4gPT0gbnVsbCAmJiBuYW1lRnJvbUF0dHJpYnV0ZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKCJqc3AuZXJyb3IudmFyaWFibGUuZWl0aGVyLm5hbWUiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG5hbWVHaXZlbiAhPSBudWxsICYmIG5hbWVGcm9tQXR0cmlidXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBlcnIuanNwRXJyb3IoImpzcC5lcnJvci52YXJpYWJsZS5ib3RoLm5hbWUiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RyaW5nIGFsaWFzID0gbi5nZXRBdHRyaWJ1dGVWYWx1ZSgiYWxpYXMiKTsKKyAgICAgICAgICAgIGlmIChuYW1lRnJvbUF0dHJpYnV0ZSAhPSBudWxsICYmIGFsaWFzID09IG51bGwgfHwKKyAgICAgICAgICAgICAgICBuYW1lRnJvbUF0dHJpYnV0ZSA9PSBudWxsICYmIGFsaWFzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBlcnIuanNwRXJyb3IoImpzcC5lcnJvci52YXJpYWJsZS5hbGlhcyIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gbi5nZXRBdHRyaWJ1dGVWYWx1ZSgidmFyaWFibGUtY2xhc3MiKTsKKyAgICAgICAgICAgIGlmIChjbGFzc05hbWUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSAiamF2YS5sYW5nLlN0cmluZyI7CisKKyAgICAgICAgICAgIFN0cmluZyBkZWNsYXJlU3RyID0gbi5nZXRBdHRyaWJ1dGVWYWx1ZSgiZGVjbGFyZSIpOworICAgICAgICAgICAgYm9vbGVhbiBkZWNsYXJlID0gdHJ1ZTsKKyAgICAgICAgICAgIGlmIChkZWNsYXJlU3RyICE9IG51bGwpCisgICAgICAgICAgICAgICAgZGVjbGFyZSA9IEpzcFV0aWwuYm9vbGVhblZhbHVlKGRlY2xhcmVTdHIpOworCisgICAgICAgICAgICBpbnQgc2NvcGUgPSBWYXJpYWJsZUluZm8uTkVTVEVEOworICAgICAgICAgICAgU3RyaW5nIHNjb3BlU3RyID0gbi5nZXRBdHRyaWJ1dGVWYWx1ZSgic2NvcGUiKTsKKyAgICAgICAgICAgIGlmIChzY29wZVN0ciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKCJORVNURUQiLmVxdWFscyhzY29wZVN0cikpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQWxyZWFkeSB0aGUgZGVmYXVsdAorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIkFUX0JFR0lOIi5lcXVhbHMoc2NvcGVTdHIpKSB7CisgICAgICAgICAgICAgICAgICAgIHNjb3BlID0gVmFyaWFibGVJbmZvLkFUX0JFR0lOOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIkFUX0VORCIuZXF1YWxzKHNjb3BlU3RyKSkgeworICAgICAgICAgICAgICAgICAgICBzY29wZSA9IFZhcmlhYmxlSW5mby5BVF9FTkQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobmFtZUZyb21BdHRyaWJ1dGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8qCisJCSAqIEFuIGFsaWFzIGhhcyBiZWVuIHNwZWNpZmllZC4gV2UgdXNlICduYW1lR2l2ZW4nIHRvIGhvbGQgdGhlCisJCSAqIHZhbHVlIG9mIHRoZSBhbGlhcywgYW5kICduYW1lRnJvbUF0dHJpYnV0ZScgdG8gaG9sZCB0aGUgCisJCSAqIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB3aG9zZSB2YWx1ZSAoYXQgaW52b2NhdGlvbi10aW1lKQorCQkgKiBkZW5vdGVzIHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSB0aGF0IGlzIGJlaW5nIGFsaWFzZWQKKwkJICovCisgICAgICAgICAgICAgICAgbmFtZUdpdmVuID0gYWxpYXM7CisgICAgICAgICAgICAgICAgY2hlY2tVbmlxdWVOYW1lKG5hbWVGcm9tQXR0cmlidXRlLCBWQVJfTkFNRV9GUk9NLCBuKTsKKyAgICAgICAgICAgICAgICBjaGVja1VuaXF1ZU5hbWUoYWxpYXMsIFZBUl9BTElBUywgbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBuYW1lLWdpdmVuIHNwZWNpZmllZAorICAgICAgICAgICAgICAgIGNoZWNrVW5pcXVlTmFtZShuYW1lR2l2ZW4sIFZBUl9OQU1FX0dJVkVOLCBuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIHZhcmlhYmxlVmVjdG9yLmFkZEVsZW1lbnQobmV3IFRhZ1ZhcmlhYmxlSW5mbygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVHaXZlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVGcm9tQXR0cmlidXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjbGFyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlKSk7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSB2ZWN0b3Igb2YgYXR0cmlidXRlcyBjb3JyZXNwb25kaW5nIHRvIGF0dHJpYnV0ZQorICAgICAgICAgKiBkaXJlY3RpdmVzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFZlY3RvciBnZXRBdHRyaWJ1dGVzVmVjdG9yKCkgeworICAgICAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZVZlY3RvcjsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIFJldHVybnMgdGhlIHZlY3RvciBvZiB2YXJpYWJsZXMgY29ycmVzcG9uZGluZyB0byB2YXJpYWJsZQorICAgICAgICAgKiBkaXJlY3RpdmVzLgorICAgICAgICAgKi8gICAgICAgIAorICAgICAgICBwdWJsaWMgVmVjdG9yIGdldFZhcmlhYmxlc1ZlY3RvcigpIHsKKyAgICAgICAgICAgIHJldHVybiB2YXJpYWJsZVZlY3RvcjsKKyAgICAgICAgfQorCisJLyoKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgZHluYW1pYy1hdHRyaWJ1dGVzIHRhZyBkaXJlY3RpdmUKKwkgKiBhdHRyaWJ1dGUuCisJICovCisJcHVibGljIFN0cmluZyBnZXREeW5hbWljQXR0cmlidXRlc01hcE5hbWUoKSB7CisJICAgIHJldHVybiBkeW5hbWljQXR0cnNNYXBOYW1lOworCX0KKworICAgICAgICBwdWJsaWMgVGFnSW5mbyBnZXRUYWdJbmZvKCkgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisKKyAgICAgICAgICAgIGlmIChuYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBYWFggR2V0IGl0IGZyb20gdGFnIGZpbGUgbmFtZQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoYm9keWNvbnRlbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGJvZHljb250ZW50ID0gVGFnSW5mby5CT0RZX0NPTlRFTlRfU0NSSVBUTEVTUzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RyaW5nIHRhZ0NsYXNzTmFtZSA9IEpzcFV0aWwuZ2V0VGFnSGFuZGxlckNsYXNzTmFtZShwYXRoLCBlcnIpOworCisgICAgICAgICAgICBUYWdWYXJpYWJsZUluZm9bXSB0YWdWYXJpYWJsZUluZm9zCisgICAgICAgICAgICAgICAgPSBuZXcgVGFnVmFyaWFibGVJbmZvW3ZhcmlhYmxlVmVjdG9yLnNpemUoKV07CisgICAgICAgICAgICB2YXJpYWJsZVZlY3Rvci5jb3B5SW50byh0YWdWYXJpYWJsZUluZm9zKTsKKworICAgICAgICAgICAgVGFnQXR0cmlidXRlSW5mb1tdIHRhZ0F0dHJpYnV0ZUluZm8KKyAgICAgICAgICAgICAgICA9IG5ldyBUYWdBdHRyaWJ1dGVJbmZvW2F0dHJpYnV0ZVZlY3Rvci5zaXplKCldOworICAgICAgICAgICAgYXR0cmlidXRlVmVjdG9yLmNvcHlJbnRvKHRhZ0F0dHJpYnV0ZUluZm8pOworCisgICAgICAgICAgICByZXR1cm4gbmV3IEphc3BlclRhZ0luZm8obmFtZSwKKwkJCSAgICAgICB0YWdDbGFzc05hbWUsCisJCQkgICAgICAgYm9keWNvbnRlbnQsCisJCQkgICAgICAgZGVzY3JpcHRpb24sCisJCQkgICAgICAgdGFnTGliSW5mbywKKwkJCSAgICAgICB0ZWksCisJCQkgICAgICAgdGFnQXR0cmlidXRlSW5mbywKKwkJCSAgICAgICBkaXNwbGF5TmFtZSwKKwkJCSAgICAgICBzbWFsbEljb24sCisJCQkgICAgICAgbGFyZ2VJY29uLAorCQkJICAgICAgIHRhZ1ZhcmlhYmxlSW5mb3MsCisJCQkgICAgICAgZHluYW1pY0F0dHJzTWFwTmFtZSk7CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgY2xhc3MgTmFtZUVudHJ5IHsKKyAgICAgICAgICAgIHByaXZhdGUgU3RyaW5nIHR5cGU7CisgICAgICAgICAgICBwcml2YXRlIE5vZGUgbm9kZTsKKyAgICAgICAgICAgIHByaXZhdGUgVGFnQXR0cmlidXRlSW5mbyBhdHRyOworCisgICAgICAgICAgICBOYW1lRW50cnkoU3RyaW5nIHR5cGUsIE5vZGUgbm9kZSwgVGFnQXR0cmlidXRlSW5mbyBhdHRyKSB7CisgICAgICAgICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBub2RlOworICAgICAgICAgICAgICAgIHRoaXMuYXR0ciA9IGF0dHI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0cmluZyBnZXRUeXBlKCkgeyByZXR1cm4gdHlwZTt9CisgICAgICAgICAgICBOb2RlIGdldE5vZGUoKSB7IHJldHVybiBub2RlOyB9CisgICAgICAgICAgICBUYWdBdHRyaWJ1dGVJbmZvIGdldFRhZ0F0dHJpYnV0ZUluZm8oKSB7IHJldHVybiBhdHRyOyB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmVwb3J0cyBhIHRyYW5zbGF0aW9uIGVycm9yIGlmIG5hbWVzIHNwZWNpZmllZCBpbiBhdHRyaWJ1dGVzIG9mCisgICAgICAgICAqIGRpcmVjdGl2ZXMgYXJlIG5vdCB1bmlxdWUgaW4gdGhpcyB0cmFuc2xhdGlvbiB1bml0LgorICAgICAgICAgKgorICAgICAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIG11c3QgYmUgdW5pcXVlLgorICAgICAgICAgKiAgIDEuICduYW1lJyBhdHRyaWJ1dGUgb2YgYW4gYXR0cmlidXRlIGRpcmVjdGl2ZQorICAgICAgICAgKiAgIDIuICduYW1lLWdpdmVuJyBhdHRyaWJ1dGUgb2YgYSB2YXJpYWJsZSBkaXJlY3RpdmUKKyAgICAgICAgICogICAzLiAnYWxpYXMnIGF0dHJpYnV0ZSBvZiB2YXJpYWJsZSBkaXJlY3RpdmUKKyAgICAgICAgICogICA0LiAnZHluYW1pYy1hdHRyaWJ1dGVzJyBvZiBhIHRhZyBkaXJlY3RpdmUKKyAgICAgICAgICogZXhjZXB0IHRoYXQgJ2R5bmFtaWMtYXR0cmlidXRlcycgY2FuIChhbmQgbXVzdCkgaGF2ZSB0aGUgc2FtZQorICAgICAgICAgKiB2YWx1ZSB3aGVuIGl0IGFwcGVhcnMgaW4gbXVsdGlwbGUgdGFnIGRpcmVjdGl2ZXMuCisgICAgICAgICAqCisgICAgICAgICAqIEFsc28sICduYW1lLWZyb20nIGF0dHJpYnV0ZSBvZiBhIHZhcmlhYmxlIGRpcmVjdGl2ZSBjYW5ub3QgaGF2ZQorICAgICAgICAgKiB0aGUgc2FtZSB2YWx1ZSBhcyB0aGF0IGZyb20gYW5vdGhlciB2YXJpYWJsZSBkaXJlY3RpdmUuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIHZvaWQgY2hlY2tVbmlxdWVOYW1lKFN0cmluZyBuYW1lLCBTdHJpbmcgdHlwZSwgTm9kZSBuKQorICAgICAgICAgICAgICAgIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgY2hlY2tVbmlxdWVOYW1lKG5hbWUsIHR5cGUsIG4sIG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGNoZWNrVW5pcXVlTmFtZShTdHJpbmcgbmFtZSwgU3RyaW5nIHR5cGUsIE5vZGUgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWdBdHRyaWJ1dGVJbmZvIGF0dHIpCisgICAgICAgICAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisKKyAgICAgICAgICAgIEhhc2hNYXAgdGFibGUgPSAodHlwZSA9PSBWQVJfTkFNRV9GUk9NKT8gbmFtZUZyb21UYWJsZTogbmFtZVRhYmxlOworICAgICAgICAgICAgTmFtZUVudHJ5IG5hbWVFbnRyeSA9IChOYW1lRW50cnkpIHRhYmxlLmdldChuYW1lKTsKKyAgICAgICAgICAgIGlmIChuYW1lRW50cnkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmICh0eXBlICE9IFRBR19EWU5BTUlDIHx8IG5hbWVFbnRyeS5nZXRUeXBlKCkgIT0gVEFHX0RZTkFNSUMpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGxpbmUgPSBuYW1lRW50cnkuZ2V0Tm9kZSgpLmdldFN0YXJ0KCkuZ2V0TGluZU51bWJlcigpOworICAgICAgICAgICAgICAgICAgICBlcnIuanNwRXJyb3IobiwgImpzcC5lcnJvci50YWdmaWxlLm5hbWVOb3RVbmlxdWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsIG5hbWVFbnRyeS5nZXRUeXBlKCksIEludGVnZXIudG9TdHJpbmcobGluZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGFibGUucHV0KG5hbWUsIG5ldyBOYW1lRW50cnkodHlwZSwgbiwgYXR0cikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFBlcmZvcm0gbWlzY2VsbGVhbiBjaGVja3MgYWZ0ZXIgdGhlIG5vZGVzIGFyZSB2aXNpdGVkLgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBwb3N0Q2hlY2soKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIC8vIENoZWNrIHRoYXQgdmFyLm5hbWUtZnJvbS1hdHRyaWJ1dGVzIGhhcyB2YWxpZCB2YWx1ZXMuCisJICAgIEl0ZXJhdG9yIGl0ZXIgPSBuYW1lRnJvbVRhYmxlLmtleVNldCgpLml0ZXJhdG9yKCk7CisgICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZUZyb20gPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgICAgICBOYW1lRW50cnkgbmFtZUVudHJ5ID0gKE5hbWVFbnRyeSkgbmFtZVRhYmxlLmdldChuYW1lRnJvbSk7CisgICAgICAgICAgICAgICAgTmFtZUVudHJ5IG5hbWVGcm9tRW50cnkgPQorICAgICAgICAgICAgICAgICAgICAoTmFtZUVudHJ5KSBuYW1lRnJvbVRhYmxlLmdldChuYW1lRnJvbSk7CisgICAgICAgICAgICAgICAgTm9kZSBuYW1lRnJvbU5vZGUgPSBuYW1lRnJvbUVudHJ5LmdldE5vZGUoKTsKKyAgICAgICAgICAgICAgICBpZiAobmFtZUVudHJ5ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKG5hbWVGcm9tTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJqc3AuZXJyb3IudGFnZmlsZS5uYW1lRnJvbS5ub0F0dHJpYnV0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lRnJvbSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgTm9kZSBub2RlID0gbmFtZUVudHJ5LmdldE5vZGUoKTsKKyAgICAgICAgICAgICAgICAgICAgVGFnQXR0cmlidXRlSW5mbyB0YWdBdHRyID0gbmFtZUVudHJ5LmdldFRhZ0F0dHJpYnV0ZUluZm8oKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCEgImphdmEubGFuZy5TdHJpbmciLmVxdWFscyh0YWdBdHRyLmdldFR5cGVOYW1lKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgISB0YWdBdHRyLmlzUmVxdWlyZWQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHRhZ0F0dHIuY2FuQmVSZXF1ZXN0VGltZSgpKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcihuYW1lRnJvbU5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImpzcC5lcnJvci50YWdmaWxlLm5hbWVGcm9tLmJhZEF0dHJpYnV0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZUZyb20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhub2RlLmdldFN0YXJ0KCkuZ2V0TGluZU51bWJlcigpKSk7CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2VzIHRoZSB0YWcgZmlsZSwgYW5kIGNvbGxlY3RzIGluZm9ybWF0aW9uIG9uIHRoZSBkaXJlY3RpdmVzIGluY2x1ZGVkCisgICAgICogaW4gaXQuICBUaGUgbWV0aG9kIGlzIHVzZWQgdG8gb2J0YWluIHRoZSBpbmZvIG9uIHRoZSB0YWcgZmlsZSwgd2hlbiB0aGUgCisgICAgICogaGFuZGxlciB0aGF0IGl0IHJlcHJlc2VudHMgaXMgcmVmZXJlbmNlZC4gIFRoZSB0YWcgZmlsZSBpcyBub3QgY29tcGlsZWQKKyAgICAgKiBoZXJlLgorICAgICAqCisgICAgICogQHBhcmFtIHBjIHRoZSBjdXJyZW50IFBhcnNlckNvbnRyb2xsZXIgdXNlZCBpbiB0aGlzIGNvbXBpbGF0aW9uCisgICAgICogQHBhcmFtIG5hbWUgdGhlIHRhZyBuYW1lIGFzIHNwZWNpZmllZCBpbiB0aGUgVExECisgICAgICogQHBhcmFtIHRhZ2ZpbGUgdGhlIHBhdGggZm9yIHRoZSB0YWdmaWxlCisgICAgICogQHBhcmFtIHRhZ0xpYkluZm8gdGhlIFRhZ0xpYnJhcnlJbmZvIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBUYWdJbmZvCisgICAgICogQHJldHVybiBhIFRhZ0luZm8gb2JqZWN0IGFzc2VtYmxlZCBmcm9tIHRoZSBkaXJlY3RpdmVzIGluIHRoZSB0YWcgZmlsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFRhZ0luZm8gcGFyc2VUYWdGaWxlRGlyZWN0aXZlcyhQYXJzZXJDb250cm9sbGVyIHBjLAorCQkJCQkJIFN0cmluZyBuYW1lLAorCQkJCQkJIFN0cmluZyBwYXRoLAorCQkJCQkJIFRhZ0xpYnJhcnlJbmZvIHRhZ0xpYkluZm8pCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKworICAgICAgICBFcnJvckRpc3BhdGNoZXIgZXJyID0gcGMuZ2V0Q29tcGlsZXIoKS5nZXRFcnJvckRpc3BhdGNoZXIoKTsKKworICAgICAgICBOb2RlLk5vZGVzIHBhZ2UgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcGFnZSA9IHBjLnBhcnNlVGFnRmlsZURpcmVjdGl2ZXMocGF0aCk7CisgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlcnIuanNwRXJyb3IoImpzcC5lcnJvci5maWxlLm5vdC5mb3VuZCIsIHBhdGgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlcnIuanNwRXJyb3IoImpzcC5lcnJvci5maWxlLm5vdC5mb3VuZCIsIHBhdGgpOworICAgICAgICB9CisKKyAgICAgICAgVGFnRmlsZURpcmVjdGl2ZVZpc2l0b3IgdGFnRmlsZVZpc2l0b3IKKyAgICAgICAgICAgID0gbmV3IFRhZ0ZpbGVEaXJlY3RpdmVWaXNpdG9yKHBjLmdldENvbXBpbGVyKCksIHRhZ0xpYkluZm8sIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoKTsKKyAgICAgICAgcGFnZS52aXNpdCh0YWdGaWxlVmlzaXRvcik7CisgICAgICAgIHRhZ0ZpbGVWaXNpdG9yLnBvc3RDaGVjaygpOworCisgICAgICAgIHJldHVybiB0YWdGaWxlVmlzaXRvci5nZXRUYWdJbmZvKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tcGlsZXMgYW5kIGxvYWRzIGEgdGFnZmlsZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIENsYXNzIGxvYWRUYWdGaWxlKENvbXBpbGVyIGNvbXBpbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRhZ0ZpbGVQYXRoLCBUYWdJbmZvIHRhZ0luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWdlSW5mbyBwYXJlbnRQYWdlSW5mbykKKyAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisKKyAgICAgICAgSnNwQ29tcGlsYXRpb25Db250ZXh0IGN0eHQgPSBjb21waWxlci5nZXRDb21waWxhdGlvbkNvbnRleHQoKTsKKyAgICAgICAgSnNwUnVudGltZUNvbnRleHQgcmN0eHQgPSBjdHh0LmdldFJ1bnRpbWVDb250ZXh0KCk7CisgICAgICAgIEpzcFNlcnZsZXRXcmFwcGVyIHdyYXBwZXIgPQorICAgICAgICAgICAgICAgIChKc3BTZXJ2bGV0V3JhcHBlcikgcmN0eHQuZ2V0V3JhcHBlcih0YWdGaWxlUGF0aCk7CisKKyAgICAgICAgc3luY2hyb25pemVkKHJjdHh0KSB7CisgICAgICAgICAgICBpZiAod3JhcHBlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgd3JhcHBlciA9IG5ldyBKc3BTZXJ2bGV0V3JhcHBlcihjdHh0LmdldFNlcnZsZXRDb250ZXh0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHh0LmdldE9wdGlvbnMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ0ZpbGVQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eHQuZ2V0UnVudGltZUNvbnRleHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChVUkwpIGN0eHQuZ2V0VGFnRmlsZUphclVybHMoKS5nZXQodGFnRmlsZVBhdGgpKTsKKyAgICAgICAgICAgICAgICAgICAgcmN0eHQuYWRkV3JhcHBlcih0YWdGaWxlUGF0aCx3cmFwcGVyKTsKKworCQkvLyBVc2Ugc2FtZSBjbGFzc2xvYWRlciBhbmQgY2xhc3NwYXRoIGZvciBjb21waWxpbmcgdGFnIGZpbGVzCisJCXdyYXBwZXIuZ2V0SnNwRW5naW5lQ29udGV4dCgpLnNldENsYXNzTG9hZGVyKAorCQkJCShVUkxDbGFzc0xvYWRlcikgY3R4dC5nZXRDbGFzc0xvYWRlcigpKTsKKwkJd3JhcHBlci5nZXRKc3BFbmdpbmVDb250ZXh0KCkuc2V0Q2xhc3NQYXRoKGN0eHQuZ2V0Q2xhc3NQYXRoKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgSnNwQ29tcGlsYXRpb25Db250ZXh0IGdldHMgdGhlIGxhdGVzdCBUYWdJbmZvCisgICAgICAgICAgICAgICAgLy8gZm9yIHRoZSB0YWcgZmlsZS4gIFRhZ0luZm8gaW5zdGFuY2Ugd2FzIGNyZWF0ZWQgdGhlIGxhc3QKKyAgICAgICAgICAgICAgICAvLyB0aW1lIHRoZSB0YWcgZmlsZSB3YXMgc2Nhbm5lZCBmb3IgZGlyZWN0aXZlcywgYW5kIHRoZSB0YWcKKyAgICAgICAgICAgICAgICAvLyBmaWxlIG1heSBoYXZlIGJlZW4gbW9kaWZpZWQgc2luY2UgdGhlbi4KKyAgICAgICAgICAgICAgICB3cmFwcGVyLmdldEpzcEVuZ2luZUNvbnRleHQoKS5zZXRUYWdJbmZvKHRhZ0luZm8pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDbGFzcyB0YWdDbGF6ejsKKyAgICAgICAgICAgIGludCB0cmlwQ291bnQgPSB3cmFwcGVyLmluY1RyaXBDb3VudCgpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAodHJpcENvdW50ID4gMCkgeworICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIHRyaXBDb3VudCBpcyBncmVhdGVyIHRoYW4gemVybywgYSBjaXJjdWxhcgorICAgICAgICAgICAgICAgICAgICAvLyBkZXBlbmRlbmN5IGV4aXN0cy4gIFRoZSBjaXJjdWxhcmlseSBkZXBlbmRhbnQgdGFnCisgICAgICAgICAgICAgICAgICAgIC8vIGZpbGUgaXMgY29tcGlsZWQgaW4gcHJvdG90eXBlIG1vZGUsIHRvIGF2b2lkIGluZmluaXRlCisgICAgICAgICAgICAgICAgICAgIC8vIHJlY3Vyc2lvbi4KKworICAgICAgICAgICAgICAgICAgICBKc3BTZXJ2bGV0V3JhcHBlciB0ZW1wV3JhcHBlcgorICAgICAgICAgICAgICAgICAgICAgICAgPSBuZXcgSnNwU2VydmxldFdyYXBwZXIoY3R4dC5nZXRTZXJ2bGV0Q29udGV4dCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4dC5nZXRPcHRpb25zKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdGaWxlUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ0luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHh0LmdldFJ1bnRpbWVDb250ZXh0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVVJMKSBjdHh0LmdldFRhZ0ZpbGVKYXJVcmxzKCkuZ2V0KHRhZ0ZpbGVQYXRoKSk7CisgICAgICAgICAgICAgICAgICAgIHRhZ0NsYXp6ID0gdGVtcFdyYXBwZXIubG9hZFRhZ0ZpbGVQcm90b3R5cGUoKTsKKyAgICAgICAgICAgICAgICAgICAgdGVtcFZlY3Rvci5hZGQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcFdyYXBwZXIuZ2V0SnNwRW5naW5lQ29udGV4dCgpLmdldENvbXBpbGVyKCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRhZ0NsYXp6ID0gd3JhcHBlci5sb2FkVGFnRmlsZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgd3JhcHBlci5kZWNUcmlwQ291bnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgICAgICAvLyBBZGQgdGhlIGRlcGVuZGFudHMgZm9yIHRoaXMgdGFnIGZpbGUgdG8gaXRzIHBhcmVudCdzCisgICAgICAgICAgICAvLyBkZXBlbmRhbnQgbGlzdC4gIFRoZSBvbmx5IHJlbGlhYmxlIGRlcGVuZGVuY3kgaW5mb3JtYXRpb24KKyAgICAgICAgICAgIC8vIGNhbiBvbmx5IGJlIG9idGFpbmVkIGZyb20gdGhlIHRhZyBpbnN0YW5jZS4KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgT2JqZWN0IHRhZ0lucyA9IHRhZ0NsYXp6Lm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICAgICAgaWYgKHRhZ0lucyBpbnN0YW5jZW9mIEpzcFNvdXJjZURlcGVuZGVudCkgeworICAgICAgICAgICAgICAgICAgICBJdGVyYXRvciBpdGVyID0gCisgICAgICAgICAgICAgICAgICAgICAgICAoKEpzcFNvdXJjZURlcGVuZGVudCl0YWdJbnMpLmdldERlcGVuZGFudHMoKS5pdGVyYXRvcigpOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudFBhZ2VJbmZvLmFkZERlcGVuZGFudCgoU3RyaW5nKWl0ZXIubmV4dCgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gaWdub3JlIGVycm9ycworICAgICAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgICAgIHJldHVybiB0YWdDbGF6ejsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoKKyAgICAgKiBWaXNpdG9yIHdoaWNoIHNjYW5zIHRoZSBwYWdlIGFuZCBsb29rcyBmb3IgdGFnIGhhbmRsZXJzIHRoYXQgYXJlIHRhZworICAgICAqIGZpbGVzLCBjb21waWxpbmcgKGlmIG5lY2Vzc2FyeSkgYW5kIGxvYWRpbmcgdGhlbS4KKyAgICAgKi8gCisgICAgcHJpdmF0ZSBjbGFzcyBUYWdGaWxlTG9hZGVyVmlzaXRvciBleHRlbmRzIE5vZGUuVmlzaXRvciB7CisKKyAgICAgICAgcHJpdmF0ZSBDb21waWxlciBjb21waWxlcjsKKyAgICAgICAgcHJpdmF0ZSBQYWdlSW5mbyBwYWdlSW5mbzsKKworICAgICAgICBUYWdGaWxlTG9hZGVyVmlzaXRvcihDb21waWxlciBjb21waWxlcikgeworICAgICAgICAgICAgCisgICAgICAgICAgICB0aGlzLmNvbXBpbGVyID0gY29tcGlsZXI7CisgICAgICAgICAgICB0aGlzLnBhZ2VJbmZvID0gY29tcGlsZXIuZ2V0UGFnZUluZm8oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuQ3VzdG9tVGFnIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgVGFnRmlsZUluZm8gdGFnRmlsZUluZm8gPSBuLmdldFRhZ0ZpbGVJbmZvKCk7CisgICAgICAgICAgICBpZiAodGFnRmlsZUluZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFN0cmluZyB0YWdGaWxlUGF0aCA9IHRhZ0ZpbGVJbmZvLmdldFBhdGgoKTsKKwkJSnNwQ29tcGlsYXRpb25Db250ZXh0IGN0eHQgPSBjb21waWxlci5nZXRDb21waWxhdGlvbkNvbnRleHQoKTsKKwkJaWYgKGN0eHQuZ2V0VGFnRmlsZUphclVybHMoKS5nZXQodGFnRmlsZVBhdGgpID09IG51bGwpIHsKKwkJICAgIC8vIE9taXQgdGFnIGZpbGUgZGVwZW5kZW5jeSBpbmZvIG9uIGphciBmaWxlcyBmb3Igbm93LgorICAgICAgICAgICAgICAgICAgICBwYWdlSW5mby5hZGREZXBlbmRhbnQodGFnRmlsZVBhdGgpOworCQl9CisgICAgICAgICAgICAgICAgQ2xhc3MgYyA9IGxvYWRUYWdGaWxlKGNvbXBpbGVyLCB0YWdGaWxlUGF0aCwgbi5nZXRUYWdJbmZvKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VJbmZvKTsKKyAgICAgICAgICAgICAgICBuLnNldFRhZ0hhbmRsZXJDbGFzcyhjKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpc2l0Qm9keShuKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEltcGxlbWVudHMgYSBwaGFzZSBvZiB0aGUgdHJhbnNsYXRpb24gdGhhdCBjb21waWxlcyAoaWYgbmVjZXNzYXJ5KQorICAgICAqIHRoZSB0YWcgZmlsZXMgdXNlZCBpbiBhIEpTUCBmaWxlcy4gIFRoZSBkaXJlY3RpdmVzIGluIHRoZSB0YWcgZmlsZXMKKyAgICAgKiBhcmUgYXNzdW1lZCB0byBoYXZlIGJlZW4gcHJvY2Nlc3NlZCBhbmQgZW5jYXBzdWxhdGVkIGFzIFRhZ0ZpbGVJbmZvCisgICAgICogaW4gdGhlIEN1c3RvbVRhZyBub2Rlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBsb2FkVGFnRmlsZXMoQ29tcGlsZXIgY29tcGlsZXIsIE5vZGUuTm9kZXMgcGFnZSkKKyAgICAgICAgICAgICAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKworICAgICAgICB0ZW1wVmVjdG9yID0gbmV3IFZlY3RvcigpOworICAgICAgICBwYWdlLnZpc2l0KG5ldyBUYWdGaWxlTG9hZGVyVmlzaXRvcihjb21waWxlcikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZWQgdGhlIGphdmEgYW5kIGNsYXNzIGZpbGVzIGZvciB0aGUgdGFnIHByb3RvdHlwZSAKKyAgICAgKiBnZW5lcmF0ZWQgZnJvbSB0aGUgY3VycmVudCBjb21waWxhdGlvbi4KKyAgICAgKiBAcGFyYW0gY2xhc3NGaWxlTmFtZSBJZiBub24tbnVsbCwgcmVtb3ZlIG9ubHkgdGhlIGNsYXNzIGZpbGUgd2l0aAorICAgICAqICAgICAgICB3aXRoIHRoaXMgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVQcm90b1R5cGVGaWxlcyhTdHJpbmcgY2xhc3NGaWxlTmFtZSkgeworICAgICAgICBJdGVyYXRvciBpdGVyID0gdGVtcFZlY3Rvci5pdGVyYXRvcigpOworICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIENvbXBpbGVyIGMgPSAoQ29tcGlsZXIpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgaWYgKGNsYXNzRmlsZU5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGMucmVtb3ZlR2VuZXJhdGVkQ2xhc3NGaWxlcygpOworICAgICAgICAgICAgfSBlbHNlIGlmIChjbGFzc0ZpbGVOYW1lLmVxdWFscygKKyAgICAgICAgICAgICAgICAgICAgICAgIGMuZ2V0Q29tcGlsYXRpb25Db250ZXh0KCkuZ2V0Q2xhc3NGaWxlTmFtZSgpKSkgeworICAgICAgICAgICAgICAgIGMucmVtb3ZlR2VuZXJhdGVkQ2xhc3NGaWxlcygpOworICAgICAgICAgICAgICAgIHRlbXBWZWN0b3IucmVtb3ZlKGMpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL2NvbXBpbGVyL1RhZ0xpYnJhcnlJbmZvSW1wbC5qYXZhIGIvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL2NvbXBpbGVyL1RhZ0xpYnJhcnlJbmZvSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMjNhNzgKLS0tIC9kZXYvbnVsbAorKysgYi9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvVGFnTGlicmFyeUluZm9JbXBsLmphdmEKQEAgLTAsMCArMSw3NTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphc3Blci5jb21waWxlcjsKKworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKK2ltcG9ydCBqYXZhLm5ldC5KYXJVUkxDb25uZWN0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OworCitpbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0LkZ1bmN0aW9uSW5mbzsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuUGFnZURhdGE7CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZ0F0dHJpYnV0ZUluZm87CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZ0V4dHJhSW5mbzsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnRmlsZUluZm87CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZ0luZm87CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZ0xpYnJhcnlJbmZvOworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWdMaWJyYXJ5VmFsaWRhdG9yOworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWdWYXJpYWJsZUluZm87CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlZhbGlkYXRpb25NZXNzYWdlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5WYXJpYWJsZUluZm87CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5KYXNwZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIuSnNwQ29tcGlsYXRpb25Db250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLnhtbHBhcnNlci5QYXJzZXJVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci54bWxwYXJzZXIuVHJlZU5vZGU7CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgdGhlIFRhZ0xpYnJhcnlJbmZvIGNsYXNzIGZyb20gdGhlIEpTUCBzcGVjLiAKKyAqCisgKiBAYXV0aG9yIEFuaWwgSy4gVmlqZW5kcmFuCisgKiBAYXV0aG9yIE1hbmRhciBSYWplCisgKiBAYXV0aG9yIFBpZXJyZSBEZWxpc2xlCisgKiBAYXV0aG9yIEtpbi1tYW4gQ2h1bmcKKyAqIEBhdXRob3IgSmFuIEx1ZWhlCisgKi8KK2NsYXNzIFRhZ0xpYnJhcnlJbmZvSW1wbCBleHRlbmRzIFRhZ0xpYnJhcnlJbmZvIGltcGxlbWVudHMgVGFnQ29uc3RhbnRzIHsKKworICAgIC8vIExvZ2dlcgorICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhUYWdMaWJyYXJ5SW5mb0ltcGwuY2xhc3MpOworCisgICAgcHJpdmF0ZSBIYXNodGFibGUgamFyRW50cmllczsKKyAgICBwcml2YXRlIEpzcENvbXBpbGF0aW9uQ29udGV4dCBjdHh0OworICAgIHByaXZhdGUgRXJyb3JEaXNwYXRjaGVyIGVycjsKKyAgICBwcml2YXRlIFBhcnNlckNvbnRyb2xsZXIgcGFyc2VyQ29udHJvbGxlcjsKKworICAgIHByaXZhdGUgZmluYWwgdm9pZCBwcmludChTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlLCBQcmludFdyaXRlciB3KSB7CisgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICB3LnByaW50KG5hbWUrIiA9IHtcblx0Iik7CisgICAgICAgICAgICB3LnByaW50KHZhbHVlKTsKKyAgICAgICAgICAgIHcucHJpbnQoIlxufVxuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIFByaW50V3JpdGVyIG91dCA9IG5ldyBQcmludFdyaXRlcihzdyk7CisgICAgICAgIHByaW50KCJ0bGlidmVyc2lvbiIsIHRsaWJ2ZXJzaW9uLCBvdXQpOworICAgICAgICBwcmludCgianNwdmVyc2lvbiIsIGpzcHZlcnNpb24sIG91dCk7CisgICAgICAgIHByaW50KCJzaG9ydG5hbWUiLCBzaG9ydG5hbWUsIG91dCk7CisgICAgICAgIHByaW50KCJ1cm4iLCB1cm4sIG91dCk7CisgICAgICAgIHByaW50KCJpbmZvIiwgaW5mbywgb3V0KTsKKyAgICAgICAgcHJpbnQoInVyaSIsIHVyaSwgb3V0KTsKKyAgICAgICAgcHJpbnQoInRhZ0xpYnJhcnlWYWxpZGF0b3IiLCB0YWdMaWJyYXJ5VmFsaWRhdG9yLnRvU3RyaW5nKCksIG91dCk7CisKKyAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IHRhZ3MubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBvdXQucHJpbnRsbih0YWdzW2ldLnRvU3RyaW5nKCkpOworICAgICAgICAKKyAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IHRhZ0ZpbGVzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgb3V0LnByaW50bG4odGFnRmlsZXNbaV0udG9TdHJpbmcoKSk7CisgICAgICAgIAorICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgZnVuY3Rpb25zLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgb3V0LnByaW50bG4oZnVuY3Rpb25zW2ldLnRvU3RyaW5nKCkpOworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHN3LnRvU3RyaW5nKCk7CisgICAgfQorICAgIAorICAgIC8vIFhYWCBGSVhNRQorICAgIC8vIHJlc29sdmVSZWxhdGl2ZVVyaSBhbmQvb3IgZ2V0UmVzb3VyY2VBc1N0cmVhbSBkb24ndCBzZWVtIHRvIHByb3Blcmx5CisgICAgLy8gaGFuZGxlIHJlbGF0aXZlIHBhdGhzIHdoZW4gZGVhbGluZyB3aGVuIGhvbWUgYW5kIGdldERvY0Jhc2UgYXJlIHNldAorICAgIC8vIHRoZSBmb2xsb3dpbmcgaXMgYSB3b3JrYXJvdW5kIHVudGlsIHRoZXNlIHByb2JsZW1zIGFyZSByZXNvbHZlZC4KKyAgICBwcml2YXRlIElucHV0U3RyZWFtIGdldFJlc291cmNlQXNTdHJlYW0oU3RyaW5nIHVyaSkgCisgICAgICAgIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gCisgICAgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gc2VlIGlmIGZpbGUgZXhpc3RzIG9uIHRoZSBmaWxlc3lzdGVtIGZpcnN0CisgICAgICAgICAgICBTdHJpbmcgcmVhbCA9IGN0eHQuZ2V0UmVhbFBhdGgodXJpKTsKKyAgICAgICAgICAgIGlmIChyZWFsID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY3R4dC5nZXRSZXNvdXJjZUFzU3RyZWFtKHVyaSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRmlsZUlucHV0U3RyZWFtKHJlYWwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIC8vIGlmIGZpbGUgbm90IGZvdW5kIG9uIGZpbGVzeXN0ZW0sIGdldCB0aGUgcmVzb3VyY2UgdGhyb3VnaAorICAgICAgICAgICAgLy8gdGhlIGNvbnRleHQKKyAgICAgICAgICAgIHJldHVybiBjdHh0LmdldFJlc291cmNlQXNTdHJlYW0odXJpKTsKKyAgICAgICAgfQorICAgICAgIAorICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLgorICAgICAqLworICAgIHB1YmxpYyBUYWdMaWJyYXJ5SW5mb0ltcGwoSnNwQ29tcGlsYXRpb25Db250ZXh0IGN0eHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZXJDb250cm9sbGVyIHBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByZWZpeCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdXJpSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBsb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yRGlzcGF0Y2hlciBlcnIpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICBzdXBlcihwcmVmaXgsIHVyaUluKTsKKworICAgICAgICB0aGlzLmN0eHQgPSBjdHh0OworICAgICAgICB0aGlzLnBhcnNlckNvbnRyb2xsZXIgPSBwYzsKKyAgICAgICAgdGhpcy5lcnIgPSBlcnI7CisgICAgICAgIElucHV0U3RyZWFtIGluID0gbnVsbDsKKyAgICAgICAgSmFyRmlsZSBqYXJGaWxlID0gbnVsbDsKKworICAgICAgICBpZiAobG9jYXRpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gVGhlIFVSSSBwb2ludHMgdG8gdGhlIFRMRCBpdHNlbGYgb3IgdG8gYSBKQVIgZmlsZSBpbiB3aGljaCB0aGUKKyAgICAgICAgICAgIC8vIFRMRCBpcyBzdG9yZWQKKyAgICAgICAgICAgIGxvY2F0aW9uID0gZ2VuZXJhdGVUTERMb2NhdGlvbih1cmksIGN0eHQpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICghbG9jYXRpb25bMF0uZW5kc1dpdGgoImphciIpKSB7CisgICAgICAgICAgICAgICAgLy8gTG9jYXRpb24gcG9pbnRzIHRvIFRMRCBmaWxlCisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgaW4gPSBnZXRSZXNvdXJjZUFzU3RyZWFtKGxvY2F0aW9uWzBdKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGluID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24obG9jYXRpb25bMF0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcigianNwLmVycm9yLmZpbGUubm90LmZvdW5kIiwgbG9jYXRpb25bMF0pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHBhcnNlVExEKGN0eHQsIGxvY2F0aW9uWzBdLCBpbiwgbnVsbCk7CisgICAgICAgICAgICAgICAgLy8gQWRkIFRMRCB0byBkZXBlbmRlbmN5IGxpc3QKKyAgICAgICAgICAgICAgICBQYWdlSW5mbyBwYWdlSW5mbyA9IGN0eHQuY3JlYXRlQ29tcGlsZXIoKS5nZXRQYWdlSW5mbygpOworICAgICAgICAgICAgICAgIGlmIChwYWdlSW5mbyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHBhZ2VJbmZvLmFkZERlcGVuZGFudChsb2NhdGlvblswXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBUYWcgbGlicmFyeSBpcyBwYWNrYWdlZCBpbiBKQVIgZmlsZQorICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIFVSTCBqYXJGaWxlVXJsID0gbmV3IFVSTCgiamFyOiIgKyBsb2NhdGlvblswXSArICIhLyIpOworICAgICAgICAgICAgICAgICAgICBKYXJVUkxDb25uZWN0aW9uIGNvbm4gPQorICAgICAgICAgICAgICAgICAgICAgICAgKEphclVSTENvbm5lY3Rpb24pIGphckZpbGVVcmwub3BlbkNvbm5lY3Rpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgY29ubi5zZXRVc2VDYWNoZXMoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBjb25uLmNvbm5lY3QoKTsKKyAgICAgICAgICAgICAgICAgICAgamFyRmlsZSA9IGNvbm4uZ2V0SmFyRmlsZSgpOworICAgICAgICAgICAgICAgICAgICBaaXBFbnRyeSBqYXJFbnRyeSA9IGphckZpbGUuZ2V0RW50cnkobG9jYXRpb25bMV0pOworICAgICAgICAgICAgICAgICAgICBpbiA9IGphckZpbGUuZ2V0SW5wdXRTdHJlYW0oamFyRW50cnkpOworICAgICAgICAgICAgICAgICAgICBwYXJzZVRMRChjdHh0LCBsb2NhdGlvblswXSwgaW4sIGphckZpbGVVcmwpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICBlcnIuanNwRXJyb3IoImpzcC5lcnJvci50bGQudW5hYmxlX3RvX3JlYWQiLCBsb2NhdGlvblswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uWzFdLCBleC50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoaW4gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGluLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHt9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoamFyRmlsZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgamFyRmlsZS5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7fQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisgICAgCisgICAgLyoKKyAgICAgKiBAcGFyYW0gY3R4dCBUaGUgSlNQIGNvbXBpbGF0aW9uIGNvbnRleHQKKyAgICAgKiBAcGFyYW0gdXJpIFRoZSBUTEQncyB1cmkKKyAgICAgKiBAcGFyYW0gaW4gVGhlIFRMRCdzIGlucHV0IHN0cmVhbQorICAgICAqIEBwYXJhbSBqYXJGaWxlVXJsIFRoZSBKQVIgZmlsZSBjb250YWluaW5nIHRoZSBUTEQsIG9yIG51bGwgaWYgdGhlIHRhZworICAgICAqIGxpYnJhcnkgaXMgbm90IHBhY2thZ2VkIGluIGEgSkFSCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHBhcnNlVExEKEpzcENvbXBpbGF0aW9uQ29udGV4dCBjdHh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdXJpLCBJbnB1dFN0cmVhbSBpbiwgVVJMIGphckZpbGVVcmwpIAorICAgICAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uCisgICAgeworICAgICAgICBWZWN0b3IgdGFnVmVjdG9yID0gbmV3IFZlY3RvcigpOworICAgICAgICBWZWN0b3IgdGFnRmlsZVZlY3RvciA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgSGFzaHRhYmxlIGZ1bmN0aW9uVGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7CisKKyAgICAgICAgLy8gQ3JlYXRlIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIGNoaWxkIGVsZW1lbnRzIG9mIG91ciA8dGFnbGliPiBlbGVtZW50CisgICAgICAgIFBhcnNlclV0aWxzIHB1ID0gbmV3IFBhcnNlclV0aWxzKCk7CisgICAgICAgIFRyZWVOb2RlIHRsZCA9IHB1LnBhcnNlWE1MRG9jdW1lbnQodXJpLCBpbik7CisKKyAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSA8dGFnbGliPiByb290IGVsZW1lbnQgY29udGFpbnMgYSAndmVyc2lvbicKKyAgICAgICAgLy8gYXR0cmlidXRlLCB3aGljaCB3YXMgYWRkZWQgaW4gSlNQIDIuMCB0byByZXBsYWNlIHRoZSA8anNwLXZlcnNpb24+CisgICAgICAgIC8vIHN1YmVsZW1lbnQKKyAgICAgICAgdGhpcy5qc3B2ZXJzaW9uID0gdGxkLmZpbmRBdHRyaWJ1dGUoInZlcnNpb24iKTsKKworICAgICAgICAvLyBQcm9jZXNzIGVhY2ggY2hpbGQgZWxlbWVudCBvZiBvdXIgPHRhZ2xpYj4gZWxlbWVudAorICAgICAgICBJdGVyYXRvciBsaXN0ID0gdGxkLmZpbmRDaGlsZHJlbigpOworCisgICAgICAgIHdoaWxlIChsaXN0Lmhhc05leHQoKSkgeworICAgICAgICAgICAgVHJlZU5vZGUgZWxlbWVudCA9IChUcmVlTm9kZSkgbGlzdC5uZXh0KCk7CisgICAgICAgICAgICBTdHJpbmcgdG5hbWUgPSBlbGVtZW50LmdldE5hbWUoKTsKKworICAgICAgICAgICAgaWYgKCJ0bGlidmVyc2lvbiIuZXF1YWxzKHRuYW1lKSAgICAgICAgICAgICAgICAgICAgLy8gSlNQIDEuMQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgInRsaWItdmVyc2lvbiIuZXF1YWxzKHRuYW1lKSkgeyAgICAgLy8gSlNQIDEuMgorICAgICAgICAgICAgICAgIHRoaXMudGxpYnZlcnNpb24gPSBlbGVtZW50LmdldEJvZHkoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoImpzcHZlcnNpb24iLmVxdWFscyh0bmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8ICJqc3AtdmVyc2lvbiIuZXF1YWxzKHRuYW1lKSkgeworICAgICAgICAgICAgICAgIHRoaXMuanNwdmVyc2lvbiA9IGVsZW1lbnQuZ2V0Qm9keSgpOworICAgICAgICAgICAgfSBlbHNlIGlmICgic2hvcnRuYW1lIi5lcXVhbHModG5hbWUpIHx8CisgICAgICAgICAgICAgICAgICAgICAic2hvcnQtbmFtZSIuZXF1YWxzKHRuYW1lKSkKKyAgICAgICAgICAgICAgICB0aGlzLnNob3J0bmFtZSA9IGVsZW1lbnQuZ2V0Qm9keSgpOworICAgICAgICAgICAgZWxzZSBpZiAoInVyaSIuZXF1YWxzKHRuYW1lKSkKKyAgICAgICAgICAgICAgICB0aGlzLnVybiA9IGVsZW1lbnQuZ2V0Qm9keSgpOworICAgICAgICAgICAgZWxzZSBpZiAoImluZm8iLmVxdWFscyh0bmFtZSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiIuZXF1YWxzKHRuYW1lKSkKKyAgICAgICAgICAgICAgICB0aGlzLmluZm8gPSBlbGVtZW50LmdldEJvZHkoKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCJ2YWxpZGF0b3IiLmVxdWFscyh0bmFtZSkpCisgICAgICAgICAgICAgICAgdGhpcy50YWdMaWJyYXJ5VmFsaWRhdG9yID0gY3JlYXRlVmFsaWRhdG9yKGVsZW1lbnQpOworICAgICAgICAgICAgZWxzZSBpZiAoInRhZyIuZXF1YWxzKHRuYW1lKSkKKyAgICAgICAgICAgICAgICB0YWdWZWN0b3IuYWRkRWxlbWVudChjcmVhdGVUYWdJbmZvKGVsZW1lbnQsIGpzcHZlcnNpb24pKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCJ0YWctZmlsZSIuZXF1YWxzKHRuYW1lKSkgeworICAgICAgICAgICAgICAgIFRhZ0ZpbGVJbmZvIHRhZ0ZpbGVJbmZvID0gY3JlYXRlVGFnRmlsZUluZm8oZWxlbWVudCwgdXJpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamFyRmlsZVVybCk7CisgICAgICAgICAgICAgICAgdGFnRmlsZVZlY3Rvci5hZGRFbGVtZW50KHRhZ0ZpbGVJbmZvKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoImZ1bmN0aW9uIi5lcXVhbHModG5hbWUpKSB7ICAgICAgICAgLy8gSlNQMi4wCisgICAgICAgICAgICAgICAgRnVuY3Rpb25JbmZvIGZ1bmNJbmZvID0gY3JlYXRlRnVuY3Rpb25JbmZvKGVsZW1lbnQpOworICAgICAgICAgICAgICAgIFN0cmluZyBmdW5jTmFtZSA9IGZ1bmNJbmZvLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICBpZiAoZnVuY3Rpb25UYWJsZS5jb250YWluc0tleShmdW5jTmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKCJqc3AuZXJyb3IudGxkLmZuLmR1cGxpY2F0ZS5uYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNOYW1lLCB1cmkpOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZ1bmN0aW9uVGFibGUucHV0KGZ1bmNOYW1lLCBmdW5jSW5mbyk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCJkaXNwbGF5LW5hbWUiLmVxdWFscyh0bmFtZSkgfHwgICAgLy8gSWdub3JlZCBlbGVtZW50cworICAgICAgICAgICAgICAgICAgICAgInNtYWxsLWljb24iLmVxdWFscyh0bmFtZSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICJsYXJnZS1pY29uIi5lcXVhbHModG5hbWUpIHx8CisgICAgICAgICAgICAgICAgICAgICAibGlzdGVuZXIiLmVxdWFscyh0bmFtZSkpIHsKKyAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCJ0YWdsaWItZXh0ZW5zaW9uIi5lcXVhbHModG5hbWUpKSB7CisgICAgICAgICAgICAgICAgLy8gUmVjb2duaXplZCBidXQgaWdub3JlZAorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzV2FybkVuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBsb2cud2FybihMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAianNwLndhcm5pbmcudW5rbm93bi5lbGVtZW50LmluLnRhZ2xpYiIsIHRuYW1lKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICBpZiAodGxpYnZlcnNpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgZXJyLmpzcEVycm9yKCJqc3AuZXJyb3IudGxkLm1hbmRhdG9yeS5lbGVtZW50Lm1pc3NpbmciLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAidGxpYi12ZXJzaW9uIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGpzcHZlcnNpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgZXJyLmpzcEVycm9yKCJqc3AuZXJyb3IudGxkLm1hbmRhdG9yeS5lbGVtZW50Lm1pc3NpbmciLAorICAgICAgICAgICAgICAgICAgICAgICAgICJqc3AtdmVyc2lvbiIpOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy50YWdzID0gbmV3IFRhZ0luZm9bdGFnVmVjdG9yLnNpemUoKV07CisgICAgICAgIHRhZ1ZlY3Rvci5jb3B5SW50byAodGhpcy50YWdzKTsKKworICAgICAgICB0aGlzLnRhZ0ZpbGVzID0gbmV3IFRhZ0ZpbGVJbmZvW3RhZ0ZpbGVWZWN0b3Iuc2l6ZSgpXTsKKyAgICAgICAgdGFnRmlsZVZlY3Rvci5jb3B5SW50byAodGhpcy50YWdGaWxlcyk7CisKKyAgICAgICAgdGhpcy5mdW5jdGlvbnMgPSBuZXcgRnVuY3Rpb25JbmZvW2Z1bmN0aW9uVGFibGUuc2l6ZSgpXTsKKyAgICAgICAgaW50IGk9MDsKKyAgICAgICAgRW51bWVyYXRpb24gZW51bWVyYXRpb24gPSBmdW5jdGlvblRhYmxlLmVsZW1lbnRzKCk7CisgICAgICAgIHdoaWxlIChlbnVtZXJhdGlvbi5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgdGhpcy5mdW5jdGlvbnNbaSsrXSA9IChGdW5jdGlvbkluZm8pIGVudW1lcmF0aW9uLm5leHRFbGVtZW50KCk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyoKKyAgICAgKiBAcGFyYW0gdXJpIFRoZSB1cmkgb2YgdGhlIFRMRAorICAgICAqIEBwYXJhbSBjdHh0IFRoZSBjb21waWxhdGlvbiBjb250ZXh0CisgICAgICoKKyAgICAgKiBAcmV0dXJuIFN0cmluZyBhcnJheSB3aG9zZSBmaXJzdCBlbGVtZW50IGRlbm90ZXMgdGhlIHBhdGggdG8gdGhlIFRMRC4KKyAgICAgKiBJZiB0aGUgcGF0aCB0byB0aGUgVExEIHBvaW50cyB0byBhIGphciBmaWxlLCB0aGVuIHRoZSBzZWNvbmQgZWxlbWVudAorICAgICAqIGRlbm90ZXMgdGhlIG5hbWUgb2YgdGhlIFRMRCBlbnRyeSBpbiB0aGUgamFyIGZpbGUsIHdoaWNoIGlzIGhhcmRjb2RlZAorICAgICAqIHRvIE1FVEEtSU5GL3RhZ2xpYi50bGQuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmdbXSBnZW5lcmF0ZVRMRExvY2F0aW9uKFN0cmluZyB1cmksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpzcENvbXBpbGF0aW9uQ29udGV4dCBjdHh0KQorICAgICAgICAgICAgICAgIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCisgICAgICAgIGludCB1cmlUeXBlID0gVGxkTG9jYXRpb25zQ2FjaGUudXJpVHlwZSh1cmkpOworICAgICAgICBpZiAodXJpVHlwZSA9PSBUbGRMb2NhdGlvbnNDYWNoZS5BQlNfVVJJKSB7CisgICAgICAgICAgICBlcnIuanNwRXJyb3IoImpzcC5lcnJvci50YWdsaWJEaXJlY3RpdmUuYWJzVXJpQ2Fubm90QmVSZXNvbHZlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdXJpKTsKKyAgICAgICAgfSBlbHNlIGlmICh1cmlUeXBlID09IFRsZExvY2F0aW9uc0NhY2hlLk5PUk9PVF9SRUxfVVJJKSB7CisgICAgICAgICAgICB1cmkgPSBjdHh0LnJlc29sdmVSZWxhdGl2ZVVyaSh1cmkpOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nW10gbG9jYXRpb24gPSBuZXcgU3RyaW5nWzJdOworICAgICAgICBsb2NhdGlvblswXSA9IHVyaTsKKyAgICAgICAgaWYgKGxvY2F0aW9uWzBdLmVuZHNXaXRoKCJqYXIiKSkgeworICAgICAgICAgICAgVVJMIHVybCA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHVybCA9IGN0eHQuZ2V0UmVzb3VyY2UobG9jYXRpb25bMF0pOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKCJqc3AuZXJyb3IudGxkLnVuYWJsZV90b19nZXRfamFyIiwgbG9jYXRpb25bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4LnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHVybCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKCJqc3AuZXJyb3IudGxkLm1pc3NpbmdfamFyIiwgbG9jYXRpb25bMF0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9jYXRpb25bMF0gPSB1cmwudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIGxvY2F0aW9uWzFdID0gIk1FVEEtSU5GL3RhZ2xpYi50bGQiOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGxvY2F0aW9uOworICAgIH0KKworICAgIHByaXZhdGUgVGFnSW5mbyBjcmVhdGVUYWdJbmZvKFRyZWVOb2RlIGVsZW0sIFN0cmluZyBqc3BWZXJzaW9uKQorICAgICAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisKKyAgICAgICAgU3RyaW5nIHRhZ05hbWUgPSBudWxsOworICAgICAgICBTdHJpbmcgdGFnQ2xhc3NOYW1lID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIHRlaUNsYXNzTmFtZSA9IG51bGw7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogRGVmYXVsdCBib2R5IGNvbnRlbnQgZm9yIEpTUCAxLjIgdGFnIGhhbmRsZXJzICg8Ym9keS1jb250ZW50PiBoYXMKKyAgICAgICAgICogYmVjb21lIG1hbmRhdG9yeSBpbiBKU1AgMi4wLCBiZWNhdXNlIHRoZSBkZWZhdWx0IHdvdWxkIGJlIGludmFsaWQKKyAgICAgICAgICogZm9yIHNpbXBsZSB0YWcgaGFuZGxlcnMpCisgICAgICAgICAqLworICAgICAgICBTdHJpbmcgYm9keWNvbnRlbnQgPSAiSlNQIjsKKworICAgICAgICBTdHJpbmcgaW5mbyA9IG51bGw7CisgICAgICAgIFN0cmluZyBkaXNwbGF5TmFtZSA9IG51bGw7CisgICAgICAgIFN0cmluZyBzbWFsbEljb24gPSBudWxsOworICAgICAgICBTdHJpbmcgbGFyZ2VJY29uID0gbnVsbDsKKyAgICAgICAgYm9vbGVhbiBkeW5hbWljQXR0cmlidXRlcyA9IGZhbHNlOworICAgICAgICAKKyAgICAgICAgVmVjdG9yIGF0dHJpYnV0ZVZlY3RvciA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgVmVjdG9yIHZhcmlhYmxlVmVjdG9yID0gbmV3IFZlY3RvcigpOworICAgICAgICBJdGVyYXRvciBsaXN0ID0gZWxlbS5maW5kQ2hpbGRyZW4oKTsKKyAgICAgICAgd2hpbGUgKGxpc3QuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBUcmVlTm9kZSBlbGVtZW50ID0gKFRyZWVOb2RlKSBsaXN0Lm5leHQoKTsKKyAgICAgICAgICAgIFN0cmluZyB0bmFtZSA9IGVsZW1lbnQuZ2V0TmFtZSgpOworCisgICAgICAgICAgICBpZiAoIm5hbWUiLmVxdWFscyh0bmFtZSkpIHsKKyAgICAgICAgICAgICAgICB0YWdOYW1lID0gZWxlbWVudC5nZXRCb2R5KCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCJ0YWdjbGFzcyIuZXF1YWxzKHRuYW1lKSB8fAorICAgICAgICAgICAgICAgICAgICAgInRhZy1jbGFzcyIuZXF1YWxzKHRuYW1lKSkgeworICAgICAgICAgICAgICAgIHRhZ0NsYXNzTmFtZSA9IGVsZW1lbnQuZ2V0Qm9keSgpOworICAgICAgICAgICAgfSBlbHNlIGlmICgidGVpY2xhc3MiLmVxdWFscyh0bmFtZSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICJ0ZWktY2xhc3MiLmVxdWFscyh0bmFtZSkpIHsKKyAgICAgICAgICAgICAgICB0ZWlDbGFzc05hbWUgPSBlbGVtZW50LmdldEJvZHkoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoImJvZHljb250ZW50Ii5lcXVhbHModG5hbWUpIHx8CisgICAgICAgICAgICAgICAgICAgICAiYm9keS1jb250ZW50Ii5lcXVhbHModG5hbWUpKSB7CisgICAgICAgICAgICAgICAgYm9keWNvbnRlbnQgPSBlbGVtZW50LmdldEJvZHkoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoImRpc3BsYXktbmFtZSIuZXF1YWxzKHRuYW1lKSkgeworICAgICAgICAgICAgICAgIGRpc3BsYXlOYW1lID0gZWxlbWVudC5nZXRCb2R5KCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCJzbWFsbC1pY29uIi5lcXVhbHModG5hbWUpKSB7CisgICAgICAgICAgICAgICAgc21hbGxJY29uID0gZWxlbWVudC5nZXRCb2R5KCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCJsYXJnZS1pY29uIi5lcXVhbHModG5hbWUpKSB7CisgICAgICAgICAgICAgICAgbGFyZ2VJY29uID0gZWxlbWVudC5nZXRCb2R5KCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCJpY29uIi5lcXVhbHModG5hbWUpKSB7CisgICAgICAgICAgICAgICAgVHJlZU5vZGUgaWNvbiA9IGVsZW1lbnQuZmluZENoaWxkKCJzbWFsbC1pY29uIik7CisgICAgICAgICAgICAgICAgaWYgKGljb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBzbWFsbEljb24gPSBpY29uLmdldEJvZHkoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWNvbiA9IGVsZW1lbnQuZmluZENoaWxkKCJsYXJnZS1pY29uIik7CisgICAgICAgICAgICAgICAgaWYgKGljb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBsYXJnZUljb24gPSBpY29uLmdldEJvZHkoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKCJpbmZvIi5lcXVhbHModG5hbWUpIHx8CisgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iLmVxdWFscyh0bmFtZSkpIHsKKyAgICAgICAgICAgICAgICBpbmZvID0gZWxlbWVudC5nZXRCb2R5KCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCJ2YXJpYWJsZSIuZXF1YWxzKHRuYW1lKSkgeworICAgICAgICAgICAgICAgIHZhcmlhYmxlVmVjdG9yLmFkZEVsZW1lbnQoY3JlYXRlVmFyaWFibGUoZWxlbWVudCkpOworICAgICAgICAgICAgfSBlbHNlIGlmICgiYXR0cmlidXRlIi5lcXVhbHModG5hbWUpKSB7CisgICAgICAgICAgICAgICAgYXR0cmlidXRlVmVjdG9yLmFkZEVsZW1lbnQoY3JlYXRlQXR0cmlidXRlKGVsZW1lbnQsIGpzcFZlcnNpb24pKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoImR5bmFtaWMtYXR0cmlidXRlcyIuZXF1YWxzKHRuYW1lKSkgeworICAgICAgICAgICAgICAgIGR5bmFtaWNBdHRyaWJ1dGVzID0gSnNwVXRpbC5ib29sZWFuVmFsdWUoZWxlbWVudC5nZXRCb2R5KCkpOworICAgICAgICAgICAgfSBlbHNlIGlmICgiZXhhbXBsZSIuZXF1YWxzKHRuYW1lKSkgeworICAgICAgICAgICAgICAgIC8vIElnbm9yZWQgZWxlbWVudHMKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoInRhZy1leHRlbnNpb24iLmVxdWFscyh0bmFtZSkpIHsKKyAgICAgICAgICAgICAgICAvLyBJZ25vcmVkCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNXYXJuRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKExvY2FsaXplci5nZXRNZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJqc3Aud2FybmluZy51bmtub3duLmVsZW1lbnQuaW4udGFnIiwgdG5hbWUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBUYWdFeHRyYUluZm8gdGVpID0gbnVsbDsKKyAgICAgICAgaWYgKHRlaUNsYXNzTmFtZSAhPSBudWxsICYmICF0ZWlDbGFzc05hbWUuZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBDbGFzcyB0ZWlDbGFzcyA9IGN0eHQuZ2V0Q2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3ModGVpQ2xhc3NOYW1lKTsKKyAgICAgICAgICAgICAgICB0ZWkgPSAoVGFnRXh0cmFJbmZvKSB0ZWlDbGFzcy5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBlcnIuanNwRXJyb3IoImpzcC5lcnJvci50ZWljbGFzcy5pbnN0YW50aWF0aW9uIiwgdGVpQ2xhc3NOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFRhZ0F0dHJpYnV0ZUluZm9bXSB0YWdBdHRyaWJ1dGVJbmZvCisgICAgICAgICAgICA9IG5ldyBUYWdBdHRyaWJ1dGVJbmZvW2F0dHJpYnV0ZVZlY3Rvci5zaXplKCldOworICAgICAgICBhdHRyaWJ1dGVWZWN0b3IuY29weUludG8odGFnQXR0cmlidXRlSW5mbyk7CisKKyAgICAgICAgVGFnVmFyaWFibGVJbmZvW10gdGFnVmFyaWFibGVJbmZvcworICAgICAgICAgICAgPSBuZXcgVGFnVmFyaWFibGVJbmZvW3ZhcmlhYmxlVmVjdG9yLnNpemUoKV07CisgICAgICAgIHZhcmlhYmxlVmVjdG9yLmNvcHlJbnRvKHRhZ1ZhcmlhYmxlSW5mb3MpOworCisgICAgICAgIFRhZ0luZm8gdGFnaW5mbyA9IG5ldyBUYWdJbmZvKHRhZ05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ0NsYXNzTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9keWNvbnRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ0F0dHJpYnV0ZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWFsbEljb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcmdlSWNvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnVmFyaWFibGVJbmZvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHluYW1pY0F0dHJpYnV0ZXMpOworICAgICAgICByZXR1cm4gdGFnaW5mbzsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFBhcnNlcyB0aGUgdGFnIGZpbGUgZGlyZWN0aXZlcyBvZiB0aGUgZ2l2ZW4gVGFnRmlsZSBhbmQgdHVybnMgdGhlbSBpbnRvCisgICAgICogYSBUYWdJbmZvLgorICAgICAqCisgICAgICogQHBhcmFtIGVsZW0gVGhlIDx0YWctZmlsZT4gZWxlbWVudCBpbiB0aGUgVExECisgICAgICogQHBhcmFtIHVyaSBUaGUgbG9jYXRpb24gb2YgdGhlIFRMRCwgaW4gY2FzZSB0aGUgdGFnIGZpbGUgaXMgc3BlY2lmaWVkCisgICAgICogcmVsYXRpdmUgdG8gaXQKKyAgICAgKiBAcGFyYW0gamFyRmlsZSBUaGUgSkFSIGZpbGUsIGluIGNhc2UgdGhlIHRhZyBmaWxlIGlzIHBhY2thZ2VkIGluIGEgSkFSCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRhZ0luZm8gY29ycmVzcG9kaW5nIHRvIHRhZyBmaWxlIGRpcmVjdGl2ZXMKKyAgICAgKi8KKyAgICBwcml2YXRlIFRhZ0ZpbGVJbmZvIGNyZWF0ZVRhZ0ZpbGVJbmZvKFRyZWVOb2RlIGVsZW0sIFN0cmluZyB1cmksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkwgamFyRmlsZVVybCkKKyAgICAgICAgICAgICAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKworICAgICAgICBTdHJpbmcgbmFtZSA9IG51bGw7CisgICAgICAgIFN0cmluZyBwYXRoID0gbnVsbDsKKworICAgICAgICBJdGVyYXRvciBsaXN0ID0gZWxlbS5maW5kQ2hpbGRyZW4oKTsKKyAgICAgICAgd2hpbGUgKGxpc3QuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBUcmVlTm9kZSBjaGlsZCA9IChUcmVlTm9kZSkgbGlzdC5uZXh0KCk7CisgICAgICAgICAgICBTdHJpbmcgdG5hbWUgPSBjaGlsZC5nZXROYW1lKCk7CisgICAgICAgICAgICBpZiAoIm5hbWUiLmVxdWFscyh0bmFtZSkpIHsKKyAgICAgICAgICAgICAgICBuYW1lID0gY2hpbGQuZ2V0Qm9keSgpOworICAgICAgICAgICAgfSBlbHNlIGlmICgicGF0aCIuZXF1YWxzKHRuYW1lKSkgeworICAgICAgICAgICAgICAgIHBhdGggPSBjaGlsZC5nZXRCb2R5KCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChsb2cuaXNXYXJuRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKExvY2FsaXplci5nZXRNZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJqc3Aud2FybmluZy51bmtub3duLmVsZW1lbnQuaW4uYXR0cmlidXRlIiwgdG5hbWUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAocGF0aC5zdGFydHNXaXRoKCIvTUVUQS1JTkYvdGFncyIpKSB7CisgICAgICAgICAgICAvLyBUYWcgZmlsZSBwYWNrYWdlZCBpbiBKQVIKKyAgICAgICAgICAgIGN0eHQuZ2V0VGFnRmlsZUphclVybHMoKS5wdXQocGF0aCwgamFyRmlsZVVybCk7CisgICAgICAgIH0gZWxzZSBpZiAoIXBhdGguc3RhcnRzV2l0aCgiL1dFQi1JTkYvdGFncyIpKSB7CisgICAgICAgICAgICBlcnIuanNwRXJyb3IoImpzcC5lcnJvci50YWdmaWxlLmlsbGVnYWxQYXRoIiwgcGF0aCk7CisgICAgICAgIH0KKworICAgICAgICBUYWdJbmZvIHRhZ0luZm8KKyAgICAgICAgICAgID0gVGFnRmlsZVByb2Nlc3Nvci5wYXJzZVRhZ0ZpbGVEaXJlY3RpdmVzKHBhcnNlckNvbnRyb2xsZXIsIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLCB0aGlzKTsKKyAgICAgICAgcmV0dXJuIG5ldyBUYWdGaWxlSW5mbyhuYW1lLCBwYXRoLCB0YWdJbmZvKTsKKyAgICB9CisKKyAgICBUYWdBdHRyaWJ1dGVJbmZvIGNyZWF0ZUF0dHJpYnV0ZShUcmVlTm9kZSBlbGVtLCBTdHJpbmcganNwVmVyc2lvbikgeworICAgICAgICBTdHJpbmcgbmFtZSA9IG51bGw7CisgICAgICAgIFN0cmluZyB0eXBlID0gbnVsbDsKKyAgICAgICAgYm9vbGVhbiByZXF1aXJlZCA9IGZhbHNlLCBydGV4cHJ2YWx1ZSA9IGZhbHNlLCByZXFUaW1lID0gZmFsc2UsCisgICAgICAgICAgICBpc0ZyYWdtZW50ID0gZmFsc2U7CisgICAgICAgIAorICAgICAgICBJdGVyYXRvciBsaXN0ID0gZWxlbS5maW5kQ2hpbGRyZW4oKTsKKyAgICAgICAgd2hpbGUgKGxpc3QuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBUcmVlTm9kZSBlbGVtZW50ID0gKFRyZWVOb2RlKSBsaXN0Lm5leHQoKTsKKyAgICAgICAgICAgIFN0cmluZyB0bmFtZSA9IGVsZW1lbnQuZ2V0TmFtZSgpOworCisgICAgICAgICAgICBpZiAoIm5hbWUiLmVxdWFscyh0bmFtZSkpIHsKKyAgICAgICAgICAgICAgICBuYW1lID0gZWxlbWVudC5nZXRCb2R5KCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCJyZXF1aXJlZCIuZXF1YWxzKHRuYW1lKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBzID0gZWxlbWVudC5nZXRCb2R5KCk7CisgICAgICAgICAgICAgICAgaWYgKHMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQgPSBKc3BVdGlsLmJvb2xlYW5WYWx1ZShzKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoInJ0ZXhwcnZhbHVlIi5lcXVhbHModG5hbWUpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHMgPSBlbGVtZW50LmdldEJvZHkoKTsKKyAgICAgICAgICAgICAgICBpZiAocyAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBydGV4cHJ2YWx1ZSA9IEpzcFV0aWwuYm9vbGVhblZhbHVlKHMpOworICAgICAgICAgICAgfSBlbHNlIGlmICgidHlwZSIuZXF1YWxzKHRuYW1lKSkgeworICAgICAgICAgICAgICAgIHR5cGUgPSBlbGVtZW50LmdldEJvZHkoKTsKKyAgICAgICAgICAgICAgICBpZiAoIjEuMiIuZXF1YWxzKGpzcFZlcnNpb24pCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAodHlwZS5lcXVhbHMoIkJvb2xlYW4iKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHR5cGUuZXF1YWxzKCJCeXRlIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB0eXBlLmVxdWFscygiQ2hhcmFjdGVyIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB0eXBlLmVxdWFscygiRG91YmxlIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB0eXBlLmVxdWFscygiRmxvYXQiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHR5cGUuZXF1YWxzKCJJbnRlZ2VyIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB0eXBlLmVxdWFscygiTG9uZyIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgdHlwZS5lcXVhbHMoIk9iamVjdCIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgdHlwZS5lcXVhbHMoIlNob3J0IikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB0eXBlLmVxdWFscygiU3RyaW5nIikpKSB7CisgICAgICAgICAgICAgICAgICAgIHR5cGUgPSAiamF2YS5sYW5nLiIgKyB0eXBlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoImZyYWdtZW50Ii5lcXVhbHModG5hbWUpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHMgPSBlbGVtZW50LmdldEJvZHkoKTsKKyAgICAgICAgICAgICAgICBpZiAocyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlzRnJhZ21lbnQgPSBKc3BVdGlsLmJvb2xlYW5WYWx1ZShzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKCJkZXNjcmlwdGlvbiIuZXF1YWxzKHRuYW1lKSB8fCAgICAvLyBJZ25vcmVkIGVsZW1lbnRzCisgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKSB7CisgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzV2FybkVuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBsb2cud2FybihMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAianNwLndhcm5pbmcudW5rbm93bi5lbGVtZW50LmluLmF0dHJpYnV0ZSIsIHRuYW1lKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGlzRnJhZ21lbnQpIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBBY2NvcmRpbmcgdG8gSlNQLkMtMyAoIlRMRCBTY2hlbWEgRWxlbWVudCBTdHJ1Y3R1cmUgLSB0YWciKSwgCisgICAgICAgICAgICAgKiAndHlwZScgYW5kICdydGV4cHJ2YWx1ZScgbXVzdCBub3QgYmUgc3BlY2lmaWVkIGlmICdmcmFnbWVudCcKKyAgICAgICAgICAgICAqIGhhcyBiZWVuIHNwZWNpZmllZCAodGhpcyB3aWxsIGJlIGVuZm9yY2VkIGJ5IHZhbGlkYXRpbmcgcGFyc2VyKS4KKyAgICAgICAgICAgICAqIEFsc28sIGlmICdmcmFnbWVudCcgaXMgVFJVRSwgJ3R5cGUnIGlzIGZpeGVkIGF0CisgICAgICAgICAgICAgKiBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuSnNwRnJhZ21lbnQsIGFuZCAncnRleHBydmFsdWUnIGlzCisgICAgICAgICAgICAgKiBmaXhlZCBhdCB0cnVlLiBTZWUgYWxzbyBKU1AuOC41LjIuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHR5cGUgPSAiamF2YXguc2VydmxldC5qc3AudGFnZXh0LkpzcEZyYWdtZW50IjsKKyAgICAgICAgICAgIHJ0ZXhwcnZhbHVlID0gdHJ1ZTsgICAgICAgICAgICAKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKCFydGV4cHJ2YWx1ZSkgeworICAgICAgICAgICAgLy8gQWNjb3JkaW5nIHRvIEpTUCBzcGVjLCBmb3Igc3RhdGljIHZhbHVlcyAodGhvc2UgZGV0ZXJtaW5lZCBhdAorICAgICAgICAgICAgLy8gdHJhbnNsYXRpb24gdGltZSkgdGhlIHR5cGUgaXMgZml4ZWQgYXQgamF2YS5sYW5nLlN0cmluZy4KKyAgICAgICAgICAgIHR5cGUgPSAiamF2YS5sYW5nLlN0cmluZyI7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbmV3IFRhZ0F0dHJpYnV0ZUluZm8obmFtZSwgcmVxdWlyZWQsIHR5cGUsIHJ0ZXhwcnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNGcmFnbWVudCk7CisgICAgfQorCisgICAgVGFnVmFyaWFibGVJbmZvIGNyZWF0ZVZhcmlhYmxlKFRyZWVOb2RlIGVsZW0pIHsKKyAgICAgICAgU3RyaW5nIG5hbWVHaXZlbiA9IG51bGw7CisgICAgICAgIFN0cmluZyBuYW1lRnJvbUF0dHJpYnV0ZSA9IG51bGw7CisgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSAiamF2YS5sYW5nLlN0cmluZyI7CisgICAgICAgIGJvb2xlYW4gZGVjbGFyZSA9IHRydWU7CisgICAgICAgIGludCBzY29wZSA9IFZhcmlhYmxlSW5mby5ORVNURUQ7CisKKyAgICAgICAgSXRlcmF0b3IgbGlzdCA9IGVsZW0uZmluZENoaWxkcmVuKCk7CisgICAgICAgIHdoaWxlIChsaXN0Lmhhc05leHQoKSkgeworICAgICAgICAgICAgVHJlZU5vZGUgZWxlbWVudCA9IChUcmVlTm9kZSkgbGlzdC5uZXh0KCk7CisgICAgICAgICAgICBTdHJpbmcgdG5hbWUgPSBlbGVtZW50LmdldE5hbWUoKTsKKyAgICAgICAgICAgIGlmICgibmFtZS1naXZlbiIuZXF1YWxzKHRuYW1lKSkKKyAgICAgICAgICAgICAgICBuYW1lR2l2ZW4gPSBlbGVtZW50LmdldEJvZHkoKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCJuYW1lLWZyb20tYXR0cmlidXRlIi5lcXVhbHModG5hbWUpKQorICAgICAgICAgICAgICAgIG5hbWVGcm9tQXR0cmlidXRlID0gZWxlbWVudC5nZXRCb2R5KCk7CisgICAgICAgICAgICBlbHNlIGlmICgidmFyaWFibGUtY2xhc3MiLmVxdWFscyh0bmFtZSkpCisgICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gZWxlbWVudC5nZXRCb2R5KCk7CisgICAgICAgICAgICBlbHNlIGlmICgiZGVjbGFyZSIuZXF1YWxzKHRuYW1lKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBzID0gZWxlbWVudC5nZXRCb2R5KCk7CisgICAgICAgICAgICAgICAgaWYgKHMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgZGVjbGFyZSA9IEpzcFV0aWwuYm9vbGVhblZhbHVlKHMpOworICAgICAgICAgICAgfSBlbHNlIGlmICgic2NvcGUiLmVxdWFscyh0bmFtZSkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcyA9IGVsZW1lbnQuZ2V0Qm9keSgpOworICAgICAgICAgICAgICAgIGlmIChzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCJORVNURUQiLmVxdWFscyhzKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGUgPSBWYXJpYWJsZUluZm8uTkVTVEVEOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJBVF9CRUdJTiIuZXF1YWxzKHMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzY29wZSA9IFZhcmlhYmxlSW5mby5BVF9CRUdJTjsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgiQVRfRU5EIi5lcXVhbHMocykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlID0gVmFyaWFibGVJbmZvLkFUX0VORDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoImRlc2NyaXB0aW9uIi5lcXVhbHModG5hbWUpIHx8ICAgIC8vIElnbm9yZWQgZWxlbWVudHMKKyAgICAgICAgICAgICAgICAgICAgIGZhbHNlICkgeworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzV2FybkVuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBsb2cud2FybihMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAianNwLndhcm5pbmcudW5rbm93bi5lbGVtZW50LmluLnZhcmlhYmxlIiwgdG5hbWUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBUYWdWYXJpYWJsZUluZm8obmFtZUdpdmVuLCBuYW1lRnJvbUF0dHJpYnV0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lLCBkZWNsYXJlLCBzY29wZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBUYWdMaWJyYXJ5VmFsaWRhdG9yIGNyZWF0ZVZhbGlkYXRvcihUcmVlTm9kZSBlbGVtKQorICAgICAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisKKyAgICAgICAgU3RyaW5nIHZhbGlkYXRvckNsYXNzID0gbnVsbDsKKyAgICAgICAgTWFwIGluaXRQYXJhbXMgPSBuZXcgSGFzaHRhYmxlKCk7CisKKyAgICAgICAgSXRlcmF0b3IgbGlzdCA9IGVsZW0uZmluZENoaWxkcmVuKCk7CisgICAgICAgIHdoaWxlIChsaXN0Lmhhc05leHQoKSkgeworICAgICAgICAgICAgVHJlZU5vZGUgZWxlbWVudCA9IChUcmVlTm9kZSkgbGlzdC5uZXh0KCk7CisgICAgICAgICAgICBTdHJpbmcgdG5hbWUgPSBlbGVtZW50LmdldE5hbWUoKTsKKyAgICAgICAgICAgIGlmICgidmFsaWRhdG9yLWNsYXNzIi5lcXVhbHModG5hbWUpKQorICAgICAgICAgICAgICAgIHZhbGlkYXRvckNsYXNzID0gZWxlbWVudC5nZXRCb2R5KCk7CisgICAgICAgICAgICBlbHNlIGlmICgiaW5pdC1wYXJhbSIuZXF1YWxzKHRuYW1lKSkgeworICAgICAgICAgICAgICAgIFN0cmluZ1tdIGluaXRQYXJhbSA9IGNyZWF0ZUluaXRQYXJhbShlbGVtZW50KTsKKyAgICAgICAgICAgICAgICBpbml0UGFyYW1zLnB1dChpbml0UGFyYW1bMF0sIGluaXRQYXJhbVsxXSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCJkZXNjcmlwdGlvbiIuZXF1YWxzKHRuYW1lKSB8fCAgICAvLyBJZ25vcmVkIGVsZW1lbnRzCisgICAgICAgICAgICAgICAgICAgICBmYWxzZSApIHsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc1dhcm5FbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oTG9jYWxpemVyLmdldE1lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImpzcC53YXJuaW5nLnVua25vd24uZWxlbWVudC5pbi52YWxpZGF0b3IiLCB0bmFtZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFRhZ0xpYnJhcnlWYWxpZGF0b3IgdGx2ID0gbnVsbDsKKyAgICAgICAgaWYgKHZhbGlkYXRvckNsYXNzICE9IG51bGwgJiYgIXZhbGlkYXRvckNsYXNzLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgQ2xhc3MgdGx2Q2xhc3MgPSAKKyAgICAgICAgICAgICAgICAgICAgY3R4dC5nZXRDbGFzc0xvYWRlcigpLmxvYWRDbGFzcyh2YWxpZGF0b3JDbGFzcyk7CisgICAgICAgICAgICAgICAgdGx2ID0gKFRhZ0xpYnJhcnlWYWxpZGF0b3IpdGx2Q2xhc3MubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKCJqc3AuZXJyb3IudGx2Y2xhc3MuaW5zdGFudGlhdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvckNsYXNzLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAodGx2ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRsdi5zZXRJbml0UGFyYW1ldGVycyhpbml0UGFyYW1zKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGx2OworICAgIH0KKworICAgIFN0cmluZ1tdIGNyZWF0ZUluaXRQYXJhbShUcmVlTm9kZSBlbGVtKSB7CisgICAgICAgIFN0cmluZ1tdIGluaXRQYXJhbSA9IG5ldyBTdHJpbmdbMl07CisgICAgICAgIAorICAgICAgICBJdGVyYXRvciBsaXN0ID0gZWxlbS5maW5kQ2hpbGRyZW4oKTsKKyAgICAgICAgd2hpbGUgKGxpc3QuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBUcmVlTm9kZSBlbGVtZW50ID0gKFRyZWVOb2RlKSBsaXN0Lm5leHQoKTsKKyAgICAgICAgICAgIFN0cmluZyB0bmFtZSA9IGVsZW1lbnQuZ2V0TmFtZSgpOworICAgICAgICAgICAgaWYgKCJwYXJhbS1uYW1lIi5lcXVhbHModG5hbWUpKSB7CisgICAgICAgICAgICAgICAgaW5pdFBhcmFtWzBdID0gZWxlbWVudC5nZXRCb2R5KCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCJwYXJhbS12YWx1ZSIuZXF1YWxzKHRuYW1lKSkgeworICAgICAgICAgICAgICAgIGluaXRQYXJhbVsxXSA9IGVsZW1lbnQuZ2V0Qm9keSgpOworICAgICAgICAgICAgfSBlbHNlIGlmICgiZGVzY3JpcHRpb24iLmVxdWFscyh0bmFtZSkpIHsKKyAgICAgICAgICAgICAgICA7IC8vIERvIG5vdGhpbmcKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGxvZy5pc1dhcm5FbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oTG9jYWxpemVyLmdldE1lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImpzcC53YXJuaW5nLnVua25vd24uZWxlbWVudC5pbi5pbml0UGFyYW0iLCB0bmFtZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaW5pdFBhcmFtOworICAgIH0KKworICAgIEZ1bmN0aW9uSW5mbyBjcmVhdGVGdW5jdGlvbkluZm8oVHJlZU5vZGUgZWxlbSkgeworCisgICAgICAgIFN0cmluZyBuYW1lID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIGtsYXNzID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIHNpZ25hdHVyZSA9IG51bGw7CisKKyAgICAgICAgSXRlcmF0b3IgbGlzdCA9IGVsZW0uZmluZENoaWxkcmVuKCk7CisgICAgICAgIHdoaWxlIChsaXN0Lmhhc05leHQoKSkgeworICAgICAgICAgICAgVHJlZU5vZGUgZWxlbWVudCA9IChUcmVlTm9kZSkgbGlzdC5uZXh0KCk7CisgICAgICAgICAgICBTdHJpbmcgdG5hbWUgPSBlbGVtZW50LmdldE5hbWUoKTsKKworICAgICAgICAgICAgaWYgKCJuYW1lIi5lcXVhbHModG5hbWUpKSB7CisgICAgICAgICAgICAgICAgbmFtZSA9IGVsZW1lbnQuZ2V0Qm9keSgpOworICAgICAgICAgICAgfSBlbHNlIGlmICgiZnVuY3Rpb24tY2xhc3MiLmVxdWFscyh0bmFtZSkpIHsKKyAgICAgICAgICAgICAgICBrbGFzcyA9IGVsZW1lbnQuZ2V0Qm9keSgpOworICAgICAgICAgICAgfSBlbHNlIGlmICgiZnVuY3Rpb24tc2lnbmF0dXJlIi5lcXVhbHModG5hbWUpKSB7CisgICAgICAgICAgICAgICAgc2lnbmF0dXJlID0gZWxlbWVudC5nZXRCb2R5KCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCJkaXNwbGF5LW5hbWUiLmVxdWFscyh0bmFtZSkgfHwgICAgLy8gSWdub3JlZCBlbGVtZW50cworICAgICAgICAgICAgICAgICAgICAgInNtYWxsLWljb24iLmVxdWFscyh0bmFtZSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICJsYXJnZS1pY29uIi5lcXVhbHModG5hbWUpIHx8CisgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iLmVxdWFscyh0bmFtZSkgfHwgCisgICAgICAgICAgICAgICAgICAgICAiZXhhbXBsZSIuZXF1YWxzKHRuYW1lKSkgeworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzV2FybkVuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBsb2cud2FybihMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICJqc3Aud2FybmluZy51bmtub3duLmVsZW1lbnQuaW4uZnVuY3Rpb24iLCB0bmFtZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBuZXcgRnVuY3Rpb25JbmZvKG5hbWUsIGtsYXNzLCBzaWduYXR1cmUpOworICAgIH0KKworCisgICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAvLyBVbnRpbCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnTGlicmFyeUluZm8gaXMgZml4ZWQKKworICAgIC8qKgorICAgICAqIFRoZSBpbnN0YW5jZSAoaWYgYW55KSBmb3IgdGhlIFRhZ0xpYnJhcnlWYWxpZGF0b3IgY2xhc3MuCisgICAgICogCisgICAgICogQHJldHVybiBUaGUgVGFnTGlicmFyeVZhbGlkYXRvciBpbnN0YW5jZSwgaWYgYW55LgorICAgICAqLworICAgIHB1YmxpYyBUYWdMaWJyYXJ5VmFsaWRhdG9yIGdldFRhZ0xpYnJhcnlWYWxpZGF0b3IoKSB7CisgICAgICAgIHJldHVybiB0YWdMaWJyYXJ5VmFsaWRhdG9yOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRyYW5zbGF0aW9uLXRpbWUgdmFsaWRhdGlvbiBvZiB0aGUgWE1MIGRvY3VtZW50CisgICAgICogYXNzb2NpYXRlZCB3aXRoIHRoZSBKU1AgcGFnZS4KKyAgICAgKiBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIG9uIHRoZSBhc3NvY2lhdGVkIAorICAgICAqIFRhZ0xpYnJhcnlWYWxpZGF0b3IgY2xhc3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGhlUGFnZSBUaGUgSlNQIHBhZ2Ugb2JqZWN0CisgICAgICogQHJldHVybiBBIHN0cmluZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHBhZ2UgaXMgdmFsaWQgb3Igbm90LgorICAgICAqLworICAgIHB1YmxpYyBWYWxpZGF0aW9uTWVzc2FnZVtdIHZhbGlkYXRlKFBhZ2VEYXRhIHRoZVBhZ2UpIHsKKyAgICAgICAgVGFnTGlicmFyeVZhbGlkYXRvciB0bHYgPSBnZXRUYWdMaWJyYXJ5VmFsaWRhdG9yKCk7CisgICAgICAgIGlmICh0bHYgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisKKyAgICAgICAgU3RyaW5nIHVyaSA9IGdldFVSSSgpOworICAgICAgICBpZiAodXJpLnN0YXJ0c1dpdGgoIi8iKSkgeworICAgICAgICAgICAgdXJpID0gVVJOX0pTUFRMRCArIHVyaTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0bHYudmFsaWRhdGUoZ2V0UHJlZml4U3RyaW5nKCksIHVyaSwgdGhlUGFnZSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFRhZ0xpYnJhcnlWYWxpZGF0b3IgdGFnTGlicmFyeVZhbGlkYXRvcjsgCit9CmRpZmYgLS1naXQgYS9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvVGFnUGx1Z2luTWFuYWdlci5qYXZhIGIvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL2NvbXBpbGVyL1RhZ1BsdWdpbk1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTE4ZjAwCi0tLSAvZGV2L251bGwKKysrIGIvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL2NvbXBpbGVyL1RhZ1BsdWdpbk1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDIzOSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFzcGVyLmNvbXBpbGVyOworCitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5KYXNwZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIueG1scGFyc2VyLlBhcnNlclV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLnhtbHBhcnNlci5UcmVlTm9kZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5jb21waWxlci50YWdwbHVnaW4uVGFnUGx1Z2luOworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLmNvbXBpbGVyLnRhZ3BsdWdpbi5UYWdQbHVnaW5Db250ZXh0OworCisvKioKKyAqIE1hbmFnZXMgdGFnIHBsdWdpbiBvcHRpbWl6YXRpb25zLgorICogQGF1dGhvciBLaW4tbWFuIENodW5nCisgKi8KKworcHVibGljIGNsYXNzIFRhZ1BsdWdpbk1hbmFnZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19QTFVHSU5TX1hNTCA9ICIvV0VCLUlORi90YWdQbHVnaW5zLnhtbCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19QTFVHSU5TX1JPT1RfRUxFTSA9ICJ0YWctcGx1Z2lucyI7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICBwcml2YXRlIEhhc2hNYXAgdGFnUGx1Z2lucyA9IG51bGw7CisgICAgcHJpdmF0ZSBTZXJ2bGV0Q29udGV4dCBjdHh0OworICAgIHByaXZhdGUgUGFnZUluZm8gcGFnZUluZm87CisKKyAgICBwdWJsaWMgVGFnUGx1Z2luTWFuYWdlcihTZXJ2bGV0Q29udGV4dCBjdHh0KSB7CisJdGhpcy5jdHh0ID0gY3R4dDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhcHBseShOb2RlLk5vZGVzIHBhZ2UsIEVycm9yRGlzcGF0Y2hlciBlcnIsIFBhZ2VJbmZvIHBhZ2VJbmZvKQorCSAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKworCWluaXQoZXJyKTsKKwlpZiAodGFnUGx1Z2lucyA9PSBudWxsIHx8IHRhZ1BsdWdpbnMuc2l6ZSgpID09IDApIHsKKwkgICAgcmV0dXJuOworCX0KKworCXRoaXMucGFnZUluZm8gPSBwYWdlSW5mbzsKKworICAgICAgICBwYWdlLnZpc2l0KG5ldyBOb2RlLlZpc2l0b3IoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLkN1c3RvbVRhZyBuKQorICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICBpbnZva2VQbHVnaW4obik7CisgICAgICAgICAgICAgICAgdmlzaXRCb2R5KG4pOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgIH0KKyAKKyAgICBwcml2YXRlIHZvaWQgaW5pdChFcnJvckRpc3BhdGNoZXIgZXJyKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwlpZiAoaW5pdGlhbGl6ZWQpCisJICAgIHJldHVybjsKKworCUlucHV0U3RyZWFtIGlzID0gY3R4dC5nZXRSZXNvdXJjZUFzU3RyZWFtKFRBR19QTFVHSU5TX1hNTCk7CisJaWYgKGlzID09IG51bGwpCisJICAgIHJldHVybjsKKworCVRyZWVOb2RlIHJvb3QgPSAobmV3IFBhcnNlclV0aWxzKCkpLnBhcnNlWE1MRG9jdW1lbnQoVEFHX1BMVUdJTlNfWE1MLAorCQkJCQkJCSAgICAgaXMpOworCWlmIChyb290ID09IG51bGwpIHsKKwkgICAgcmV0dXJuOworCX0KKworCWlmICghVEFHX1BMVUdJTlNfUk9PVF9FTEVNLmVxdWFscyhyb290LmdldE5hbWUoKSkpIHsKKwkgICAgZXJyLmpzcEVycm9yKCJqc3AuZXJyb3IucGx1Z2luLndyb25nUm9vdEVsZW1lbnQiLCBUQUdfUExVR0lOU19YTUwsCisJCQkgVEFHX1BMVUdJTlNfUk9PVF9FTEVNKTsKKwl9CisKKwl0YWdQbHVnaW5zID0gbmV3IEhhc2hNYXAoKTsKKwlJdGVyYXRvciBwbHVnaW5MaXN0ID0gcm9vdC5maW5kQ2hpbGRyZW4oInRhZy1wbHVnaW4iKTsKKwl3aGlsZSAocGx1Z2luTGlzdC5oYXNOZXh0KCkpIHsKKwkgICAgVHJlZU5vZGUgcGx1Z2luTm9kZSA9IChUcmVlTm9kZSkgcGx1Z2luTGlzdC5uZXh0KCk7CisgICAgICAgICAgICBUcmVlTm9kZSB0YWdDbGFzc05vZGUgPSBwbHVnaW5Ob2RlLmZpbmRDaGlsZCgidGFnLWNsYXNzIik7CisJICAgIGlmICh0YWdDbGFzc05vZGUgPT0gbnVsbCkgeworCQkvLyBFcnJvcgorCQlyZXR1cm47CisJICAgIH0KKwkgICAgU3RyaW5nIHRhZ0NsYXNzID0gdGFnQ2xhc3NOb2RlLmdldEJvZHkoKS50cmltKCk7CisJICAgIFRyZWVOb2RlIHBsdWdpbkNsYXNzTm9kZSA9IHBsdWdpbk5vZGUuZmluZENoaWxkKCJwbHVnaW4tY2xhc3MiKTsKKwkgICAgaWYgKHBsdWdpbkNsYXNzTm9kZSA9PSBudWxsKSB7CisJCS8vIEVycm9yCisJCXJldHVybjsKKwkgICAgfQorCisJICAgIFN0cmluZyBwbHVnaW5DbGFzc1N0ciA9IHBsdWdpbkNsYXNzTm9kZS5nZXRCb2R5KCk7CisJICAgIFRhZ1BsdWdpbiB0YWdQbHVnaW4gPSBudWxsOworCSAgICB0cnkgeworCQlDbGFzcyBwbHVnaW5DbGFzcyA9IENsYXNzLmZvck5hbWUocGx1Z2luQ2xhc3NTdHIpOworCQl0YWdQbHVnaW4gPSAoVGFnUGx1Z2luKSBwbHVnaW5DbGFzcy5uZXdJbnN0YW5jZSgpOworCSAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQl0aHJvdyBuZXcgSmFzcGVyRXhjZXB0aW9uKGUpOworCSAgICB9CisJICAgIGlmICh0YWdQbHVnaW4gPT0gbnVsbCkgeworCQlyZXR1cm47CisJICAgIH0KKwkgICAgdGFnUGx1Z2lucy5wdXQodGFnQ2xhc3MsIHRhZ1BsdWdpbik7CisJfQorCWluaXRpYWxpemVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnZva2UgdGFnIHBsdWdpbiBmb3IgdGhlIGdpdmVuIGN1c3RvbSB0YWcsIGlmIGEgcGx1Z2luIGV4aXN0cyBmb3IgCisgICAgICogdGhlIGN1c3RvbSB0YWcncyB0YWcgaGFuZGxlci4KKyAgICAgKgorICAgICAqIFRoZSBnaXZlbiBjdXN0b20gdGFnIG5vZGUgd2lsbCBiZSBtYW5pcHVsYXRlZCBieSB0aGUgcGx1Z2luLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBpbnZva2VQbHVnaW4oTm9kZS5DdXN0b21UYWcgbikgeworCVRhZ1BsdWdpbiB0YWdQbHVnaW4gPSAoVGFnUGx1Z2luKQorCQl0YWdQbHVnaW5zLmdldChuLmdldFRhZ0hhbmRsZXJDbGFzcygpLmdldE5hbWUoKSk7CisJaWYgKHRhZ1BsdWdpbiA9PSBudWxsKSB7CisJICAgIHJldHVybjsKKwl9CisKKwlUYWdQbHVnaW5Db250ZXh0IHRhZ1BsdWdpbkNvbnRleHQgPSBuZXcgVGFnUGx1Z2luQ29udGV4dEltcGwobiwgcGFnZUluZm8pOworCW4uc2V0VGFnUGx1Z2luQ29udGV4dCh0YWdQbHVnaW5Db250ZXh0KTsKKwl0YWdQbHVnaW4uZG9UYWcodGFnUGx1Z2luQ29udGV4dCk7CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIFRhZ1BsdWdpbkNvbnRleHRJbXBsIGltcGxlbWVudHMgVGFnUGx1Z2luQ29udGV4dCB7CisJcHJpdmF0ZSBOb2RlLkN1c3RvbVRhZyBub2RlOworCXByaXZhdGUgTm9kZS5Ob2RlcyBjdXJOb2RlczsKKwlwcml2YXRlIFBhZ2VJbmZvIHBhZ2VJbmZvOworCXByaXZhdGUgSGFzaE1hcCBwbHVnaW5BdHRyaWJ1dGVzOworCisJVGFnUGx1Z2luQ29udGV4dEltcGwoTm9kZS5DdXN0b21UYWcgbiwgUGFnZUluZm8gcGFnZUluZm8pIHsKKwkgICAgdGhpcy5ub2RlID0gbjsKKwkgICAgdGhpcy5wYWdlSW5mbyA9IHBhZ2VJbmZvOworCSAgICBjdXJOb2RlcyA9IG5ldyBOb2RlLk5vZGVzKCk7CisJICAgIG4uc2V0QXRFVGFnKGN1ck5vZGVzKTsKKwkgICAgY3VyTm9kZXMgPSBuZXcgTm9kZS5Ob2RlcygpOworCSAgICBuLnNldEF0U1RhZyhjdXJOb2Rlcyk7CisJICAgIG4uc2V0VXNlVGFnUGx1Z2luKHRydWUpOworCSAgICBwbHVnaW5BdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXAoKTsKKwl9CisKKwlwdWJsaWMgVGFnUGx1Z2luQ29udGV4dCBnZXRQYXJlbnRDb250ZXh0KCkgeworCSAgICBOb2RlIHBhcmVudCA9IG5vZGUuZ2V0UGFyZW50KCk7CisJICAgIGlmICghIChwYXJlbnQgaW5zdGFuY2VvZiBOb2RlLkN1c3RvbVRhZykpIHsKKwkJcmV0dXJuIG51bGw7CisJICAgIH0KKwkgICAgcmV0dXJuICgoTm9kZS5DdXN0b21UYWcpIHBhcmVudCkuZ2V0VGFnUGx1Z2luQ29udGV4dCgpOworCX0KKworCXB1YmxpYyB2b2lkIHNldFBsdWdpbkF0dHJpYnV0ZShTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpIHsKKwkgICAgcGx1Z2luQXR0cmlidXRlcy5wdXQoa2V5LCB2YWx1ZSk7CisJfQorCisJcHVibGljIE9iamVjdCBnZXRQbHVnaW5BdHRyaWJ1dGUoU3RyaW5nIGtleSkgeworCSAgICByZXR1cm4gcGx1Z2luQXR0cmlidXRlcy5nZXQoa2V5KTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc1NjcmlwdGxlc3MoKSB7CisJICAgIHJldHVybiBub2RlLmdldENoaWxkSW5mbygpLmlzU2NyaXB0bGVzcygpOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzQ29uc3RhbnRBdHRyaWJ1dGUoU3RyaW5nIGF0dHJpYnV0ZSkgeworCSAgICBOb2RlLkpzcEF0dHJpYnV0ZSBhdHRyID0gZ2V0Tm9kZUF0dHJpYnV0ZShhdHRyaWJ1dGUpOworCSAgICBpZiAoYXR0ciA9PSBudWxsKQorCQlyZXR1cm4gZmFsc2U7CisJICAgIHJldHVybiBhdHRyLmlzTGl0ZXJhbCgpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0Q29uc3RhbnRBdHRyaWJ1dGUoU3RyaW5nIGF0dHJpYnV0ZSkgeworCSAgICBOb2RlLkpzcEF0dHJpYnV0ZSBhdHRyID0gZ2V0Tm9kZUF0dHJpYnV0ZShhdHRyaWJ1dGUpOworICAgICAgICAgICAgaWYgKGF0dHIgPT0gbnVsbCkKKwkJcmV0dXJuIG51bGw7CisJICAgIHJldHVybiBhdHRyLmdldFZhbHVlKCk7CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNBdHRyaWJ1dGVTcGVjaWZpZWQoU3RyaW5nIGF0dHJpYnV0ZSkgeworCSAgICByZXR1cm4gZ2V0Tm9kZUF0dHJpYnV0ZShhdHRyaWJ1dGUpICE9IG51bGw7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRUZW1wb3JhcnlWYXJpYWJsZU5hbWUoKSB7CisJICAgIHJldHVybiBKc3BVdGlsLm5leHRUZW1wb3JhcnlWYXJpYWJsZU5hbWUoKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBnZW5lcmF0ZUltcG9ydChTdHJpbmcgaW1wKSB7CisJICAgIHBhZ2VJbmZvLmFkZEltcG9ydChpbXApOworCX0KKworCXB1YmxpYyB2b2lkIGdlbmVyYXRlRGVjbGFyYXRpb24oU3RyaW5nIGlkLCBTdHJpbmcgdGV4dCkgeworCSAgICBpZiAocGFnZUluZm8uaXNQbHVnaW5EZWNsYXJlZChpZCkpIHsKKwkJcmV0dXJuOworCSAgICB9CisJICAgIGN1ck5vZGVzLmFkZChuZXcgTm9kZS5EZWNsYXJhdGlvbih0ZXh0LCBub2RlLmdldFN0YXJ0KCksIG51bGwpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBnZW5lcmF0ZUphdmFTb3VyY2UoU3RyaW5nIHNvdXJjZUNvZGUpIHsKKwkgICAgY3VyTm9kZXMuYWRkKG5ldyBOb2RlLlNjcmlwdGxldChzb3VyY2VDb2RlLCBub2RlLmdldFN0YXJ0KCksCisJCQkJCSAgICBudWxsKSk7CisJfQorCisJcHVibGljIHZvaWQgZ2VuZXJhdGVBdHRyaWJ1dGUoU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKKwkgICAgY3VyTm9kZXMuYWRkKG5ldyBOb2RlLkF0dHJpYnV0ZUdlbmVyYXRvcihub2RlLmdldFN0YXJ0KCksCisJCQkJCQkgICAgIGF0dHJpYnV0ZU5hbWUsCisJCQkJCQkgICAgIG5vZGUpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBkb250VXNlVGFnUGx1Z2luKCkgeworCSAgICBub2RlLnNldFVzZVRhZ1BsdWdpbihmYWxzZSk7CisJfQorCisJcHVibGljIHZvaWQgZ2VuZXJhdGVCb2R5KCkgeworCSAgICAvLyBTaW5jZSB3ZSdsbCBnZW5lcmF0ZSB0aGUgYm9keSBhbnl3YXksIHRoaXMgaXMgcmVhbGx5IGEgbm9wLCAKKwkgICAgLy8gZXhjZXB0IGZvciB0aGUgZmFjdCB0aGF0IGl0IGxldHMgdXMgcHV0IHRoZSBKYXZhIHNvdXJjZXMgdGhlCisJICAgIC8vIHBsdWdpbnMgcHJvZHVjZSBpbiB0aGUgY29ycmVjdCBvcmRlciAody5yLnQgdGhlIGJvZHkpLgorCSAgICBjdXJOb2RlcyA9IG5vZGUuZ2V0QXRFVGFnKCk7CisJfQorCisJcHJpdmF0ZSBOb2RlLkpzcEF0dHJpYnV0ZSBnZXROb2RlQXR0cmlidXRlKFN0cmluZyBhdHRyaWJ1dGUpIHsKKwkgICAgTm9kZS5Kc3BBdHRyaWJ1dGVbXSBhdHRycyA9IG5vZGUuZ2V0SnNwQXR0cmlidXRlcygpOworCSAgICBmb3IgKGludCBpPTA7IGF0dHJzICE9IG51bGwgJiYgaSA8IGF0dHJzLmxlbmd0aDsgaSsrKSB7CisJCWlmIChhdHRyc1tpXS5nZXROYW1lKCkuZXF1YWxzKGF0dHJpYnV0ZSkpIHsKKwkJICAgIHJldHVybiBhdHRyc1tpXTsKKwkJfQorCSAgICB9CisJICAgIHJldHVybiBudWxsOworCX0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvVGV4dE9wdGltaXplci5qYXZhIGIvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL2NvbXBpbGVyL1RleHRPcHRpbWl6ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGYyMDljCi0tLSAvZGV2L251bGwKKysrIGIvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL2NvbXBpbGVyL1RleHRPcHRpbWl6ZXIuamF2YQpAQCAtMCwwICsxLDExMiBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmphc3Blci5jb21waWxlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLkphc3BlckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5PcHRpb25zOworCisvKioKKyAqLworcHVibGljIGNsYXNzIFRleHRPcHRpbWl6ZXIgeworCisgICAgLyoqCisgICAgICogQSB2aXNpdG9yIHRvIGNvbmNhdGVuYXRlIGNvbnRpZ3VvdXMgdGVtcGxhdGUgdGV4dHMuCisgICAgICovCisgICAgc3RhdGljIGNsYXNzIFRleHRDYXRWaXNpdG9yIGV4dGVuZHMgTm9kZS5WaXNpdG9yIHsKKworICAgICAgICBwcml2YXRlIE9wdGlvbnMgb3B0aW9uczsKKyAgICAgICAgcHJpdmF0ZSBpbnQgdGV4dE5vZGVDb3VudCA9IDA7CisgICAgICAgIHByaXZhdGUgTm9kZS5UZW1wbGF0ZVRleHQgZmlyc3RUZXh0Tm9kZSA9IG51bGw7CisgICAgICAgIHByaXZhdGUgU3RyaW5nQnVmZmVyIHRleHRCdWZmZXI7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGVtcHR5VGV4dCA9IG5ldyBTdHJpbmcoIiIpOworCisgICAgICAgIHB1YmxpYyBUZXh0Q2F0VmlzaXRvcihDb21waWxlciBjb21waWxlcikgeworICAgICAgICAgICAgb3B0aW9ucyA9IGNvbXBpbGVyLmdldENvbXBpbGF0aW9uQ29udGV4dCgpLmdldE9wdGlvbnMoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGRvVmlzaXQoTm9kZSBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGNvbGxlY3RUZXh0KCk7CisgICAgICAgIH0KKworCS8qCisgICAgICAgICAqIFRoZSBmb2xsb3dpbmcgZGlyZWN0aXMgYXJlIGlnbm9yZWQgaW4gdGV4dCBjb25jYXRlbmF0aW9uCisgICAgICAgICAqLworCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuUGFnZURpcmVjdGl2ZSBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuVGFnRGlyZWN0aXZlIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTm9kZS5UYWdsaWJEaXJlY3RpdmUgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChOb2RlLkF0dHJpYnV0ZURpcmVjdGl2ZSBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuVmFyaWFibGVEaXJlY3RpdmUgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBEb24ndCBjb25jYXRlbmF0ZSB0ZXh0IGFjcm9zcyBib2R5IGJvdW5kYXJpZXMKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0Qm9keShOb2RlIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgc3VwZXIudmlzaXRCb2R5KG4pOworICAgICAgICAgICAgY29sbGVjdFRleHQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuVGVtcGxhdGVUZXh0IG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCisgICAgICAgICAgICBpZiAob3B0aW9ucy5nZXRUcmltU3BhY2VzKCkgJiYgbi5pc0FsbFNwYWNlKCkpIHsKKyAgICAgICAgICAgICAgICBuLnNldFRleHQoZW1wdHlUZXh0KTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh0ZXh0Tm9kZUNvdW50KysgPT0gMCkgeworICAgICAgICAgICAgICAgIGZpcnN0VGV4dE5vZGUgPSBuOworICAgICAgICAgICAgICAgIHRleHRCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKG4uZ2V0VGV4dCgpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gQXBwZW5kIHRleHQgdG8gdGV4dCBidWZmZXIKKyAgICAgICAgICAgICAgICB0ZXh0QnVmZmVyLmFwcGVuZChuLmdldFRleHQoKSk7CisgICAgICAgICAgICAgICAgbi5zZXRUZXh0KGVtcHR5VGV4dCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyBtZXRob2QgYnJlYWtzIGNvbmNhdGVuYXRpb24gbW9kZS4gIEFzIGEgc2lkZSBlZmZlY3QgaXQgY29waWVzCisgICAgICAgICAqIHRoZSBjb25jYXRlbmF0ZWQgc3RyaW5nIHRvIHRoZSBmaXJzdCB0ZXh0IG5vZGUgCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIHZvaWQgY29sbGVjdFRleHQoKSB7CisKKyAgICAgICAgICAgIGlmICh0ZXh0Tm9kZUNvdW50ID4gMSkgeworICAgICAgICAgICAgICAgIC8vIENvcHkgdGhlIHRleHQgaW4gYnVmZmVyIGludG8gdGhlIGZpcnN0IHRlbXBsYXRlIHRleHQgbm9kZS4KKyAgICAgICAgICAgICAgICBmaXJzdFRleHROb2RlLnNldFRleHQodGV4dEJ1ZmZlci50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRleHROb2RlQ291bnQgPSAwOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgY29uY2F0ZW5hdGUoQ29tcGlsZXIgY29tcGlsZXIsIE5vZGUuTm9kZXMgcGFnZSkKKyAgICAgICAgICAgIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCisgICAgICAgIFRleHRDYXRWaXNpdG9yIHYgPSBuZXcgVGV4dENhdFZpc2l0b3IoY29tcGlsZXIpOworICAgICAgICBwYWdlLnZpc2l0KHYpOworCisJLy8gQ2xlYW51cCwgaW4gY2FzZSB0aGUgcGFnZSBlbmRzIHdpdGggYSB0ZW1wbGF0ZSB0ZXh0CisgICAgICAgIHYuY29sbGVjdFRleHQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvVGxkTG9jYXRpb25zQ2FjaGUuamF2YSBiL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci9UbGRMb2NhdGlvbnNDYWNoZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzM2NjNDUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvVGxkTG9jYXRpb25zQ2FjaGUuamF2YQpAQCAtMCwwICsxLDUyNSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFzcGVyLmNvbXBpbGVyOworCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5ldC5KYXJVUkxDb25uZWN0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlcjsKK2ltcG9ydCBqYXZhLm5ldC5VUkxDb25uZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CitpbXBvcnQgamF2YS51dGlsLmphci5KYXJFbnRyeTsKK2ltcG9ydCBqYXZhLnV0aWwuamFyLkphckZpbGU7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIuSmFzcGVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLnhtbHBhcnNlci5QYXJzZXJVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci54bWxwYXJzZXIuVHJlZU5vZGU7CisKKy8qKgorICogQSBjb250YWluZXIgZm9yIGFsbCB0YWcgbGlicmFyaWVzIHRoYXQgYXJlIGRlZmluZWQgImdsb2JhbGx5IgorICogZm9yIHRoZSB3ZWIgYXBwbGljYXRpb24uCisgKiAKKyAqIFRhZyBMaWJyYXJpZXMgY2FuIGJlIGRlZmluZWQgZ2xvYmFsbHkgaW4gb25lIG9mIHR3byB3YXlzOgorICogICAxLiBWaWEgPHRhZ2xpYj4gZWxlbWVudHMgaW4gd2ViLnhtbDoKKyAqICAgICAgdGhlIHVyaSBhbmQgbG9jYXRpb24gb2YgdGhlIHRhZy1saWJyYXJ5IGFyZSBzcGVjaWZpZWQgaW4KKyAqICAgICAgdGhlIDx0YWdsaWI+IGVsZW1lbnQuCisgKiAgIDIuIFZpYSBwYWNrYWdlZCBqYXIgZmlsZXMgdGhhdCBjb250YWluIC50bGQgZmlsZXMKKyAqICAgICAgd2l0aGluIHRoZSBNRVRBLUlORiBkaXJlY3RvcnksIG9yIHNvbWUgc3ViZGlyZWN0b3J5CisgKiAgICAgIG9mIGl0LiBUaGUgdGFnbGliIGlzICdnbG9iYWwnIGlmIGl0IGhhcyB0aGUgPHVyaT4KKyAqICAgICAgZWxlbWVudCBkZWZpbmVkLgorICoKKyAqIEEgbWFwcGluZyBiZXR3ZWVuIHRoZSB0YWdsaWIgVVJJIGFuZCBpdHMgYXNzb2NpYXRlZCBUYWdsaWJyYXJ5SW5mb0ltcGwKKyAqIGlzIG1haW50YWluZWQgaW4gdGhpcyBjb250YWluZXIuCisgKiBBY3R1YWxseSwgdGhhdCdzIHdoYXQgd2UnZCBsaWtlIHRvIGRvLiBIb3dldmVyLCBiZWNhdXNlIG9mIHRoZQorICogd2F5IHRoZSBjbGFzc2VzIFRhZ0xpYnJhcnlJbmZvIGFuZCBUYWdJbmZvIGhhdmUgYmVlbiBkZWZpbmVkLAorICogaXQgaXMgbm90IGN1cnJlbnRseSBwb3NzaWJsZSB0byBzaGFyZSBhbiBpbnN0YW5jZSBvZiBUYWdMaWJyYXJ5SW5mbworICogYWNyb3NzIHBhZ2UgaW52b2NhdGlvbnMuIEEgYnVnIGhhcyBiZWVuIHN1Ym1pdHRlZCB0byB0aGUgc3BlYyBsZWFkLgorICogSW4gdGhlIG1lYW4gdGltZSwgYWxsIHdlIGRvIGlzIHNhdmUgdGhlICdsb2NhdGlvbicgd2hlcmUgdGhlCisgKiBUTEQgYXNzb2NpYXRlZCB3aXRoIGEgdGFnbGliIFVSSSBjYW4gYmUgZm91bmQuCisgKgorICogV2hlbiBhIEpTUCBwYWdlIGhhcyBhIHRhZ2xpYiBkaXJlY3RpdmUsIHRoZSBtYXBwaW5ncyBpbiB0aGlzIGNvbnRhaW5lcgorICogYXJlIGZpcnN0IHNlYXJjaGVkIChzZWUgbWV0aG9kIGdldExvY2F0aW9uKCkpLgorICogSWYgYSBtYXBwaW5nIGlzIGZvdW5kLCB0aGVuIHRoZSBsb2NhdGlvbiBvZiB0aGUgVExEIGlzIHJldHVybmVkLgorICogSWYgbm8gbWFwcGluZyBpcyBmb3VuZCwgdGhlbiB0aGUgdXJpIHNwZWNpZmllZAorICogaW4gdGhlIHRhZ2xpYiBkaXJlY3RpdmUgaXMgdG8gYmUgaW50ZXJwcmV0ZWQgYXMgdGhlIGxvY2F0aW9uIGZvcgorICogdGhlIFRMRCBvZiB0aGlzIHRhZyBsaWJyYXJ5LgorICoKKyAqIEBhdXRob3IgUGllcnJlIERlbGlzbGUKKyAqIEBhdXRob3IgSmFuIEx1ZWhlCisgKi8KKworcHVibGljIGNsYXNzIFRsZExvY2F0aW9uc0NhY2hlIHsKKworICAgIC8vIExvZ2dlcgorICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhUbGRMb2NhdGlvbnNDYWNoZS5jbGFzcyk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZXMgb2YgVVJJIG9uZSBtYXkgc3BlY2lmeSBmb3IgYSB0YWcgbGlicmFyeQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU19VUkkgPSAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJPT1RfUkVMX1VSSSA9IDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9ST09UX1JFTF9VUkkgPSAyOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9YTUwgPSAiL1dFQi1JTkYvd2ViLnhtbCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfUFJPVE9DT0wgPSAiZmlsZToiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVJfRklMRV9TVUZGSVggPSAiLmphciI7CisKKyAgICAvLyBOYW1lcyBvZiBKQVJzIHRoYXQgYXJlIGtub3duIG5vdCB0byBjb250YWluIGFueSBUTERzCisgICAgcHJpdmF0ZSBzdGF0aWMgSGFzaFNldCBub1RsZEphcnM7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbWFwcGluZyBvZiB0aGUgJ2dsb2JhbCcgdGFnIGxpYnJhcnkgVVJJIHRvIHRoZSBsb2NhdGlvbiAocmVzb3VyY2UKKyAgICAgKiBwYXRoKSBvZiB0aGUgVExEIGFzc29jaWF0ZWQgd2l0aCB0aGF0IHRhZyBsaWJyYXJ5LiBUaGUgbG9jYXRpb24gaXMKKyAgICAgKiByZXR1cm5lZCBhcyBhIFN0cmluZyBhcnJheToKKyAgICAgKiAgICBbMF0gVGhlIGxvY2F0aW9uCisgICAgICogICAgWzFdIElmIHRoZSBsb2NhdGlvbiBpcyBhIGphciBmaWxlLCB0aGlzIGlzIHRoZSBsb2NhdGlvbiBvZiB0aGUgdGxkLgorICAgICAqLworICAgIHByaXZhdGUgSGFzaHRhYmxlIG1hcHBpbmdzOworCisgICAgcHJpdmF0ZSBib29sZWFuIGluaXRpYWxpemVkOworICAgIHByaXZhdGUgU2VydmxldENvbnRleHQgY3R4dDsKKyAgICBwcml2YXRlIGJvb2xlYW4gcmVkZXBsb3lNb2RlOworCisgICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAvLyBDb25zdHJ1Y3RvciBhbmQgSW5pdGlsaXphdGlvbnMKKworICAgIC8qCisgICAgICogSW5pdGlhbGl6ZXMgdGhlIHNldCBvZiBKQVJzIHRoYXQgYXJlIGtub3duIG5vdCB0byBjb250YWluIGFueSBUTERzCisgICAgICovCisgICAgc3RhdGljIHsKKyAgICAgICAgbm9UbGRKYXJzID0gbmV3IEhhc2hTZXQoKTsKKyAgICAgICAgbm9UbGRKYXJzLmFkZCgiYW50LmphciIpOworICAgICAgICBub1RsZEphcnMuYWRkKCJjYXRhbGluYS5qYXIiKTsKKyAgICAgICAgbm9UbGRKYXJzLmFkZCgiY2F0YWxpbmEtYW50LmphciIpOworICAgICAgICBub1RsZEphcnMuYWRkKCJjYXRhbGluYS1jbHVzdGVyLmphciIpOworICAgICAgICBub1RsZEphcnMuYWRkKCJjYXRhbGluYS1vcHRpb25hbC5qYXIiKTsKKyAgICAgICAgbm9UbGRKYXJzLmFkZCgiY2F0YWxpbmEtaTE4bi1mci5qYXIiKTsKKyAgICAgICAgbm9UbGRKYXJzLmFkZCgiY2F0YWxpbmEtaTE4bi1qYS5qYXIiKTsKKyAgICAgICAgbm9UbGRKYXJzLmFkZCgiY2F0YWxpbmEtaTE4bi1lcy5qYXIiKTsKKyAgICAgICAgbm9UbGRKYXJzLmFkZCgiY29tbW9ucy1kYmNwLmphciIpOworICAgICAgICBub1RsZEphcnMuYWRkKCJjb21tb25zLW1vZGVsZXIuamFyIik7CisgICAgICAgIG5vVGxkSmFycy5hZGQoImNvbW1vbnMtbG9nZ2luZy1hcGkuamFyIik7CisgICAgICAgIG5vVGxkSmFycy5hZGQoImNvbW1vbnMtYmVhbnV0aWxzLmphciIpOworICAgICAgICBub1RsZEphcnMuYWRkKCJjb21tb25zLWZpbGV1cGxvYWQtMS4wLmphciIpOworICAgICAgICBub1RsZEphcnMuYWRkKCJjb21tb25zLXBvb2wuamFyIik7CisgICAgICAgIG5vVGxkSmFycy5hZGQoImNvbW1vbnMtZGlnZXN0ZXIuamFyIik7CisgICAgICAgIG5vVGxkSmFycy5hZGQoImNvbW1vbnMtbG9nZ2luZy5qYXIiKTsKKyAgICAgICAgbm9UbGRKYXJzLmFkZCgiY29tbW9ucy1jb2xsZWN0aW9ucy5qYXIiKTsKKyAgICAgICAgbm9UbGRKYXJzLmFkZCgiY29tbW9ucy1lbC5qYXIiKTsKKyAgICAgICAgbm9UbGRKYXJzLmFkZCgiamFrYXJ0YS1yZWdleHAtMS4yLmphciIpOworICAgICAgICBub1RsZEphcnMuYWRkKCJqYXNwZXItY29tcGlsZXIuamFyIik7CisgICAgICAgIG5vVGxkSmFycy5hZGQoImphc3Blci1ydW50aW1lLmphciIpOworICAgICAgICBub1RsZEphcnMuYWRkKCJqbXguamFyIik7CisgICAgICAgIG5vVGxkSmFycy5hZGQoImpteC10b29scy5qYXIiKTsKKyAgICAgICAgbm9UbGRKYXJzLmFkZCgianNwLWFwaS5qYXIiKTsKKyAgICAgICAgbm9UbGRKYXJzLmFkZCgiamtzaG0uamFyIik7CisgICAgICAgIG5vVGxkSmFycy5hZGQoImprY29uZmlnLmphciIpOworICAgICAgICBub1RsZEphcnMuYWRkKCJuYW1pbmctY29tbW9uLmphciIpOworICAgICAgICBub1RsZEphcnMuYWRkKCJuYW1pbmctcmVzb3VyY2VzLmphciIpOworICAgICAgICBub1RsZEphcnMuYWRkKCJuYW1pbmctZmFjdG9yeS5qYXIiKTsKKyAgICAgICAgbm9UbGRKYXJzLmFkZCgibmFtaW5nLWphdmEuamFyIik7CisgICAgICAgIG5vVGxkSmFycy5hZGQoInNlcnZsZXQtYXBpLmphciIpOworICAgICAgICBub1RsZEphcnMuYWRkKCJzZXJ2bGV0cy1kZWZhdWx0LmphciIpOworICAgICAgICBub1RsZEphcnMuYWRkKCJzZXJ2bGV0cy1pbnZva2VyLmphciIpOworICAgICAgICBub1RsZEphcnMuYWRkKCJzZXJ2bGV0cy1jb21tb24uamFyIik7CisgICAgICAgIG5vVGxkSmFycy5hZGQoInNlcnZsZXRzLXdlYmRhdi5qYXIiKTsKKyAgICAgICAgbm9UbGRKYXJzLmFkZCgidG9tY2F0LXV0aWwuamFyIik7CisgICAgICAgIG5vVGxkSmFycy5hZGQoInRvbWNhdC1odHRwMTEuamFyIik7CisgICAgICAgIG5vVGxkSmFycy5hZGQoInRvbWNhdC1qbmkuamFyIik7CisgICAgICAgIG5vVGxkSmFycy5hZGQoInRvbWNhdC1qay5qYXIiKTsKKyAgICAgICAgbm9UbGRKYXJzLmFkZCgidG9tY2F0LWprMi5qYXIiKTsKKyAgICAgICAgbm9UbGRKYXJzLmFkZCgidG9tY2F0LWNveW90ZS5qYXIiKTsKKyAgICAgICAgbm9UbGRKYXJzLmFkZCgieGVyY2VzSW1wbC5qYXIiKTsKKyAgICAgICAgbm9UbGRKYXJzLmFkZCgieG1sUGFyc2VyQVBJcy5qYXIiKTsKKyAgICAgICAgbm9UbGRKYXJzLmFkZCgieG1sLWFwaXMuamFyIik7CisgICAgICAgIC8vIEpBUnMgZnJvbSBKMlNFIHJ1bnRpbWUKKyAgICAgICAgbm9UbGRKYXJzLmFkZCgic3VuamNlX3Byb3ZpZGVyLmphciIpOworICAgICAgICBub1RsZEphcnMuYWRkKCJsZGFwc2VjLmphciIpOworICAgICAgICBub1RsZEphcnMuYWRkKCJsb2NhbGVkYXRhLmphciIpOworICAgICAgICBub1RsZEphcnMuYWRkKCJkbnNucy5qYXIiKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIFRsZExvY2F0aW9uc0NhY2hlKFNlcnZsZXRDb250ZXh0IGN0eHQpIHsKKyAgICAgICAgdGhpcyhjdHh0LCB0cnVlKTsKKyAgICB9CisKKyAgICAvKiogQ29uc3RydWN0b3IuIAorICAgICAqCisgICAgICogQHBhcmFtIGN0eHQgdGhlIHNlcnZsZXQgY29udGV4dCBvZiB0aGUgd2ViIGFwcGxpY2F0aW9uIGluIHdoaWNoIEphc3BlciAKKyAgICAgKiBpcyBydW5uaW5nCisgICAgICogQHBhcmFtIHJlZGVwbG95TW9kZSBpZiB0cnVlLCB0aGVuIHRoZSBjb21waWxlciB3aWxsIGFsbG93IHJlZGVwbG95aW5nIAorICAgICAqIGEgdGFnIGxpYnJhcnkgZnJvbSB0aGUgc2FtZSBqYXIsIGF0IHRoZSBleHBlbnNlIG9mIHNsb3dpbmcgZG93biB0aGUKKyAgICAgKiBzZXJ2ZXIgYSBiaXQuIE5vdGUgdGhhdCB0aGlzIG1heSBvbmx5IHdvcmsgb24gSkRLIDEuMy4xXzAxYSBhbmQgbGF0ZXIsCisgICAgICogYmVjYXVzZSBvZiBKREsgYnVnIDQyMTE4MTcgZml4ZWQgaW4gdGhpcyByZWxlYXNlLgorICAgICAqIElmIHJlZGVwbG95TW9kZSBpcyBmYWxzZSwgYSBmYXN0ZXIgYnV0IGxlc3MgY2FwYWJsZSBtb2RlIHdpbGwgYmUgdXNlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgVGxkTG9jYXRpb25zQ2FjaGUoU2VydmxldENvbnRleHQgY3R4dCwgYm9vbGVhbiByZWRlcGxveU1vZGUpIHsKKyAgICAgICAgdGhpcy5jdHh0ID0gY3R4dDsKKyAgICAgICAgdGhpcy5yZWRlcGxveU1vZGUgPSByZWRlcGxveU1vZGU7CisgICAgICAgIG1hcHBpbmdzID0gbmV3IEhhc2h0YWJsZSgpOworICAgICAgICBpbml0aWFsaXplZCA9IGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGxpc3Qgb2YgSkFScyB0aGF0IGFyZSBrbm93biBub3QgdG8gY29udGFpbiBhbnkgVExEcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBqYXJOYW1lcyBMaXN0IG9mIGNvbW1hLXNlcGFyYXRlZCBuYW1lcyBvZiBKQVIgZmlsZXMgdGhhdCBhcmUgCisgICAgICoga25vd24gbm90IHRvIGNvbnRhaW4gYW55IFRMRHMgCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldE5vVGxkSmFycyhTdHJpbmcgamFyTmFtZXMpIHsKKyAgICAgICAgaWYgKGphck5hbWVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIG5vVGxkSmFycy5jbGVhcigpOworICAgICAgICAgICAgU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoamFyTmFtZXMsICIsIik7CisgICAgICAgICAgICB3aGlsZSAodG9rZW5pemVyLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgbm9UbGRKYXJzLmFkZCh0b2tlbml6ZXIubmV4dFRva2VuKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgJ2xvY2F0aW9uJyBvZiB0aGUgVExEIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gdGFnbGliICd1cmknLgorICAgICAqCisgICAgICogUmV0dXJucyBudWxsIGlmIHRoZSB1cmkgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCBhbnkgdGFnIGxpYnJhcnkgJ2V4cG9zZWQnCisgICAgICogaW4gdGhlIHdlYiBhcHBsaWNhdGlvbi4gQSB0YWcgbGlicmFyeSBpcyAnZXhwb3NlZCcgZWl0aGVyIGV4cGxpY2l0bHkgaW4KKyAgICAgKiB3ZWIueG1sIG9yIGltcGxpY2l0bHkgdmlhIHRoZSB1cmkgdGFnIGluIHRoZSBUTEQgb2YgYSB0YWdsaWIgZGVwbG95ZWQKKyAgICAgKiBpbiBhIGphciBmaWxlIChXRUItSU5GL2xpYikuCisgICAgICogCisgICAgICogQHBhcmFtIHVyaSBUaGUgdGFnbGliIHVyaQorICAgICAqCisgICAgICogQHJldHVybiBBbiBhcnJheSBvZiB0d28gU3RyaW5nczogVGhlIGZpcnN0IGVsZW1lbnQgZGVub3RlcyB0aGUgcmVhbAorICAgICAqIHBhdGggdG8gdGhlIFRMRC4gSWYgdGhlIHBhdGggdG8gdGhlIFRMRCBwb2ludHMgdG8gYSBqYXIgZmlsZSwgdGhlbiB0aGUKKyAgICAgKiBzZWNvbmQgZWxlbWVudCBkZW5vdGVzIHRoZSBuYW1lIG9mIHRoZSBUTEQgZW50cnkgaW4gdGhlIGphciBmaWxlLgorICAgICAqIFJldHVybnMgbnVsbCBpZiB0aGUgdXJpIGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggYW55IHRhZyBsaWJyYXJ5ICdleHBvc2VkJworICAgICAqIGluIHRoZSB3ZWIgYXBwbGljYXRpb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGdldExvY2F0aW9uKFN0cmluZyB1cmkpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICBpZiAoIWluaXRpYWxpemVkKSB7CisgICAgICAgICAgICBpbml0KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChTdHJpbmdbXSkgbWFwcGluZ3MuZ2V0KHVyaSk7CisgICAgfQorCisgICAgLyoqIAorICAgICAqIFJldHVybnMgdGhlIHR5cGUgb2YgYSBVUkk6CisgICAgICogICAgIEFCU19VUkkKKyAgICAgKiAgICAgUk9PVF9SRUxfVVJJCisgICAgICogICAgIE5PUk9PVF9SRUxfVVJJCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnQgdXJpVHlwZShTdHJpbmcgdXJpKSB7CisgICAgICAgIGlmICh1cmkuaW5kZXhPZignOicpICE9IC0xKSB7CisgICAgICAgICAgICByZXR1cm4gQUJTX1VSSTsKKyAgICAgICAgfSBlbHNlIGlmICh1cmkuc3RhcnRzV2l0aCgiLyIpKSB7CisgICAgICAgICAgICByZXR1cm4gUk9PVF9SRUxfVVJJOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIE5PUk9PVF9SRUxfVVJJOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXQoKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGluaXRpYWxpemVkKSByZXR1cm47CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwcm9jZXNzV2ViRG90WG1sKCk7CisgICAgICAgICAgICBzY2FuSmFycygpOworICAgICAgICAgICAgcHJvY2Vzc1RsZHNJbkZpbGVTeXN0ZW0oIi9XRUItSU5GLyIpOworICAgICAgICAgICAgaW5pdGlhbGl6ZWQgPSB0cnVlOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBKYXNwZXJFeGNlcHRpb24oTG9jYWxpemVyLmdldE1lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgICJqc3AuZXJyb3IuaW50ZXJuYWwudGxkaW5pdCIsIGV4LmdldE1lc3NhZ2UoKSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBQb3B1bGF0ZXMgdGFnbGliIG1hcCBkZXNjcmliZWQgaW4gd2ViLnhtbC4KKyAgICAgKi8gICAgCisgICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NXZWJEb3RYbWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIEFjcXVpcmUgaW5wdXQgc3RyZWFtIHRvIHdlYiBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IKKyAgICAgICAgICAgIGlzID0gY3R4dC5nZXRSZXNvdXJjZUFzU3RyZWFtKFdFQl9YTUwpOworICAgICAgICAgICAgaWYgKGlzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAobG9nLmlzV2FybkVuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBsb2cud2FybihMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImpzcC5lcnJvci5pbnRlcm5hbC5maWxlbm90Zm91bmQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXRUJfWE1MKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gUGFyc2UgdGhlIHdlYiBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IKKyAgICAgICAgICAgIFRyZWVOb2RlIHdlYnRsZCA9IG5ldyBQYXJzZXJVdGlscygpLnBhcnNlWE1MRG9jdW1lbnQoV0VCX1hNTCwgaXMpOworCisgICAgICAgICAgICAvLyBBbGxvdyB0YWdsaWIgdG8gYmUgYW4gZWxlbWVudCBvZiB0aGUgcm9vdCBvciBqc3AtY29uZmlnIChKU1AyLjApCisgICAgICAgICAgICBUcmVlTm9kZSBqc3BDb25maWcgPSB3ZWJ0bGQuZmluZENoaWxkKCJqc3AtY29uZmlnIik7CisgICAgICAgICAgICBpZiAoanNwQ29uZmlnICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB3ZWJ0bGQgPSBqc3BDb25maWc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBJdGVyYXRvciB0YWdsaWJzID0gd2VidGxkLmZpbmRDaGlsZHJlbigidGFnbGliIik7CisgICAgICAgICAgICB3aGlsZSAodGFnbGlicy5oYXNOZXh0KCkpIHsKKworICAgICAgICAgICAgICAgIC8vIFBhcnNlIHRoZSBuZXh0IDx0YWdsaWI+IGVsZW1lbnQKKyAgICAgICAgICAgICAgICBUcmVlTm9kZSB0YWdsaWIgPSAoVHJlZU5vZGUpIHRhZ2xpYnMubmV4dCgpOworICAgICAgICAgICAgICAgIFN0cmluZyB0YWdVcmkgPSBudWxsOworICAgICAgICAgICAgICAgIFN0cmluZyB0YWdMb2MgPSBudWxsOworICAgICAgICAgICAgICAgIFRyZWVOb2RlIGNoaWxkID0gdGFnbGliLmZpbmRDaGlsZCgidGFnbGliLXVyaSIpOworICAgICAgICAgICAgICAgIGlmIChjaGlsZCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB0YWdVcmkgPSBjaGlsZC5nZXRCb2R5KCk7CisgICAgICAgICAgICAgICAgY2hpbGQgPSB0YWdsaWIuZmluZENoaWxkKCJ0YWdsaWItbG9jYXRpb24iKTsKKyAgICAgICAgICAgICAgICBpZiAoY2hpbGQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgdGFnTG9jID0gY2hpbGQuZ2V0Qm9keSgpOworCisgICAgICAgICAgICAgICAgLy8gU2F2ZSB0aGlzIGxvY2F0aW9uIGlmIGFwcHJvcHJpYXRlCisgICAgICAgICAgICAgICAgaWYgKHRhZ0xvYyA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBpZiAodXJpVHlwZSh0YWdMb2MpID09IE5PUk9PVF9SRUxfVVJJKQorICAgICAgICAgICAgICAgICAgICB0YWdMb2MgPSAiL1dFQi1JTkYvIiArIHRhZ0xvYzsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdGFnTG9jMiA9IG51bGw7CisgICAgICAgICAgICAgICAgaWYgKHRhZ0xvYy5lbmRzV2l0aChKQVJfRklMRV9TVUZGSVgpKSB7CisgICAgICAgICAgICAgICAgICAgIHRhZ0xvYyA9IGN0eHQuZ2V0UmVzb3VyY2UodGFnTG9jKS50b1N0cmluZygpOworICAgICAgICAgICAgICAgICAgICB0YWdMb2MyID0gIk1FVEEtSU5GL3RhZ2xpYi50bGQiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtYXBwaW5ncy5wdXQodGFnVXJpLCBuZXcgU3RyaW5nW10geyB0YWdMb2MsIHRhZ0xvYzIgfSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoaXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGlzLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHt9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTY2FucyB0aGUgZ2l2ZW4gSmFyVVJMQ29ubmVjdGlvbiBmb3IgVExEIGZpbGVzIGxvY2F0ZWQgaW4gTUVUQS1JTkYKKyAgICAgKiAob3IgYSBzdWJkaXJlY3Rvcnkgb2YgaXQpLCBhZGRpbmcgYW4gaW1wbGljaXQgbWFwIGVudHJ5IHRvIHRoZSB0YWdsaWIKKyAgICAgKiBtYXAgZm9yIGFueSBUTEQgdGhhdCBoYXMgYSA8dXJpPiBlbGVtZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm4gVGhlIEphclVSTENvbm5lY3Rpb24gdG8gdGhlIEpBUiBmaWxlIHRvIHNjYW4KKyAgICAgKiBAcGFyYW0gaWdub3JlIHRydWUgaWYgYW55IGV4Y2VwdGlvbnMgcmFpc2VkIHdoZW4gcHJvY2Vzc2luZyB0aGUgZ2l2ZW4KKyAgICAgKiBKQVIgc2hvdWxkIGJlIGlnbm9yZWQsIGZhbHNlIG90aGVyd2lzZQorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzY2FuSmFyKEphclVSTENvbm5lY3Rpb24gY29ubiwgYm9vbGVhbiBpZ25vcmUpCisgICAgICAgICAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisKKyAgICAgICAgSmFyRmlsZSBqYXJGaWxlID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIHJlc291cmNlUGF0aCA9IGNvbm4uZ2V0SmFyRmlsZVVSTCgpLnRvU3RyaW5nKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAocmVkZXBsb3lNb2RlKSB7CisgICAgICAgICAgICAgICAgY29ubi5zZXRVc2VDYWNoZXMoZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgamFyRmlsZSA9IGNvbm4uZ2V0SmFyRmlsZSgpOworICAgICAgICAgICAgRW51bWVyYXRpb24gZW50cmllcyA9IGphckZpbGUuZW50cmllcygpOworICAgICAgICAgICAgd2hpbGUgKGVudHJpZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICBKYXJFbnRyeSBlbnRyeSA9IChKYXJFbnRyeSkgZW50cmllcy5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gZW50cnkuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgIGlmICghbmFtZS5zdGFydHNXaXRoKCJNRVRBLUlORi8iKSkgY29udGludWU7CisgICAgICAgICAgICAgICAgaWYgKCFuYW1lLmVuZHNXaXRoKCIudGxkIikpIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIHN0cmVhbSA9IGphckZpbGUuZ2V0SW5wdXRTdHJlYW0oZW50cnkpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyB1cmkgPSBnZXRVcmlGcm9tVGxkKHJlc291cmNlUGF0aCwgc3RyZWFtKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gQWRkIGltcGxpY2l0IG1hcCBlbnRyeSBvbmx5IGlmIGl0cyB1cmkgaXMgbm90IGFscmVhZHkKKyAgICAgICAgICAgICAgICAgICAgLy8gcHJlc2VudCBpbiB0aGUgbWFwCisgICAgICAgICAgICAgICAgICAgIGlmICh1cmkgIT0gbnVsbCAmJiBtYXBwaW5ncy5nZXQodXJpKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5ncy5wdXQodXJpLCBuZXcgU3RyaW5nW117IHJlc291cmNlUGF0aCwgbmFtZSB9KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG8gbm90aGluZworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIGlmICghcmVkZXBsb3lNb2RlKSB7CisgICAgICAgICAgICAgICAgLy8gaWYgbm90IGluIHJlZGVwbG95IG1vZGUsIGNsb3NlIHRoZSBqYXIgaW4gY2FzZSBvZiBhbiBlcnJvcgorICAgICAgICAgICAgICAgIGlmIChqYXJGaWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGphckZpbGUuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFpZ25vcmUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSmFzcGVyRXhjZXB0aW9uKGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChyZWRlcGxveU1vZGUpIHsKKyAgICAgICAgICAgICAgICAvLyBpZiBpbiByZWRlcGxveSBtb2RlLCBhbHdheXMgY2xvc2UgdGhlIGphcgorICAgICAgICAgICAgICAgIGlmIChqYXJGaWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGphckZpbGUuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBTZWFyY2hlcyB0aGUgZmlsZXN5c3RlbSB1bmRlciAvV0VCLUlORiBmb3IgYW55IFRMRCBmaWxlcywgYW5kIGFkZHMKKyAgICAgKiBhbiBpbXBsaWNpdCBtYXAgZW50cnkgdG8gdGhlIHRhZ2xpYiBtYXAgZm9yIGFueSBUTEQgdGhhdCBoYXMgYSA8dXJpPgorICAgICAqIGVsZW1lbnQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NUbGRzSW5GaWxlU3lzdGVtKFN0cmluZyBzdGFydFBhdGgpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBTZXQgZGlyTGlzdCA9IGN0eHQuZ2V0UmVzb3VyY2VQYXRocyhzdGFydFBhdGgpOworICAgICAgICBpZiAoZGlyTGlzdCAhPSBudWxsKSB7CisgICAgICAgICAgICBJdGVyYXRvciBpdCA9IGRpckxpc3QuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IChTdHJpbmcpIGl0Lm5leHQoKTsKKyAgICAgICAgICAgICAgICBpZiAocGF0aC5lbmRzV2l0aCgiLyIpKSB7CisgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NUbGRzSW5GaWxlU3lzdGVtKHBhdGgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIXBhdGguZW5kc1dpdGgoIi50bGQiKSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtID0gY3R4dC5nZXRSZXNvdXJjZUFzU3RyZWFtKHBhdGgpOworICAgICAgICAgICAgICAgIFN0cmluZyB1cmkgPSBudWxsOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHVyaSA9IGdldFVyaUZyb21UbGQocGF0aCwgc3RyZWFtKTsKKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBBZGQgaW1wbGljaXQgbWFwIGVudHJ5IG9ubHkgaWYgaXRzIHVyaSBpcyBub3QgYWxyZWFkeQorICAgICAgICAgICAgICAgIC8vIHByZXNlbnQgaW4gdGhlIG1hcAorICAgICAgICAgICAgICAgIGlmICh1cmkgIT0gbnVsbCAmJiBtYXBwaW5ncy5nZXQodXJpKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1hcHBpbmdzLnB1dCh1cmksIG5ldyBTdHJpbmdbXSB7IHBhdGgsIG51bGwgfSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgdXJpIGVsZW1lbnQgb2YgdGhlIGdpdmVuIFRMRCwgb3IgbnVsbCBpZiB0aGUKKyAgICAgKiBnaXZlbiBUTEQgZG9lcyBub3QgY29udGFpbiBhbnkgc3VjaCBlbGVtZW50LgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGdldFVyaUZyb21UbGQoU3RyaW5nIHJlc291cmNlUGF0aCwgSW5wdXRTdHJlYW0gaW4pIAorICAgICAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uCisgICAgeworICAgICAgICAvLyBQYXJzZSB0aGUgdGFnIGxpYnJhcnkgZGVzY3JpcHRvciBhdCB0aGUgc3BlY2lmaWVkIHJlc291cmNlIHBhdGgKKyAgICAgICAgVHJlZU5vZGUgdGxkID0gbmV3IFBhcnNlclV0aWxzKCkucGFyc2VYTUxEb2N1bWVudChyZXNvdXJjZVBhdGgsIGluKTsKKyAgICAgICAgVHJlZU5vZGUgdXJpID0gdGxkLmZpbmRDaGlsZCgidXJpIik7CisgICAgICAgIGlmICh1cmkgIT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nIGJvZHkgPSB1cmkuZ2V0Qm9keSgpOworICAgICAgICAgICAgaWYgKGJvZHkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gYm9keTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qCisgICAgICogU2NhbnMgYWxsIEpBUnMgYWNjZXNzaWJsZSB0byB0aGUgd2ViYXBwJ3MgY2xhc3Nsb2FkZXIgYW5kIGl0cworICAgICAqIHBhcmVudCBjbGFzc2xvYWRlcnMgZm9yIFRMRHMuCisgICAgICogCisgICAgICogVGhlIGxpc3Qgb2YgSkFScyBhbHdheXMgaW5jbHVkZXMgdGhlIEpBUnMgdW5kZXIgV0VCLUlORi9saWIsIGFzIHdlbGwgYXMKKyAgICAgKiBhbGwgc2hhcmVkIEpBUnMgaW4gdGhlIGNsYXNzbG9hZGVyIGRlbGVnYXRpb24gY2hhaW4gb2YgdGhlIHdlYmFwcCdzCisgICAgICogY2xhc3Nsb2FkZXIuCisgICAgICoKKyAgICAgKiBDb25zaWRlcmluZyBKQVJzIGluIHRoZSBjbGFzc2xvYWRlciBkZWxlZ2F0aW9uIGNoYWluIGNvbnN0aXR1dGVzIGEKKyAgICAgKiBUb21jYXQtc3BlY2lmaWMgZXh0ZW5zaW9uIHRvIHRoZSBUTEQgc2VhcmNoCisgICAgICogb3JkZXIgZGVmaW5lZCBpbiB0aGUgSlNQIHNwZWMuIEl0IGFsbG93cyB0YWcgbGlicmFyaWVzIHBhY2thZ2VkIGFzIEpBUgorICAgICAqIGZpbGVzIHRvIGJlIHNoYXJlZCBieSB3ZWIgYXBwbGljYXRpb25zIGJ5IHNpbXBseSBkcm9wcGluZyB0aGVtIGluIGEgCisgICAgICogbG9jYXRpb24gdGhhdCBhbGwgd2ViIGFwcGxpY2F0aW9ucyBoYXZlIGFjY2VzcyB0byAoZS5nLiwKKyAgICAgKiA8Q0FUQUxJTkFfSE9NRT4vY29tbW9uL2xpYikuCisgICAgICoKKyAgICAgKiBUaGUgc2V0IG9mIHNoYXJlZCBKQVJzIHRvIGJlIHNjYW5uZWQgZm9yIFRMRHMgaXMgbmFycm93ZWQgZG93biBieQorICAgICAqIHRoZSA8dHQ+bm9UbGRKYXJzPC90dD4gY2xhc3MgdmFyaWFibGUsIHdoaWNoIGNvbnRhaW5zIHRoZSBuYW1lcyBvZiBKQVJzCisgICAgICogdGhhdCBhcmUga25vd24gbm90IHRvIGNvbnRhaW4gYW55IFRMRHMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNjYW5KYXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgQ2xhc3NMb2FkZXIgd2ViYXBwTG9hZGVyCisgICAgICAgICAgICA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7CisgICAgICAgIENsYXNzTG9hZGVyIGxvYWRlciA9IHdlYmFwcExvYWRlcjsKKworICAgICAgICB3aGlsZSAobG9hZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChsb2FkZXIgaW5zdGFuY2VvZiBVUkxDbGFzc0xvYWRlcikgeworICAgICAgICAgICAgICAgIFVSTFtdIHVybHMgPSAoKFVSTENsYXNzTG9hZGVyKSBsb2FkZXIpLmdldFVSTHMoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8dXJscy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBVUkxDb25uZWN0aW9uIGNvbm4gPSB1cmxzW2ldLm9wZW5Db25uZWN0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb25uIGluc3RhbmNlb2YgSmFyVVJMQ29ubmVjdGlvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5lZWRTY2FuSmFyKGxvYWRlciwgd2ViYXBwTG9hZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSmFyVVJMQ29ubmVjdGlvbikgY29ubikuZ2V0SmFyRmlsZSgpLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FuSmFyKChKYXJVUkxDb25uZWN0aW9uKSBjb25uLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB1cmxTdHIgPSB1cmxzW2ldLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXJsU3RyLnN0YXJ0c1dpdGgoRklMRV9QUk9UT0NPTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgdXJsU3RyLmVuZHNXaXRoKEpBUl9GSUxFX1NVRkZJWCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbmVlZFNjYW5KYXIobG9hZGVyLCB3ZWJhcHBMb2FkZXIsIHVybFN0cikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkwgamFyVVJMID0gbmV3IFVSTCgiamFyOiIgKyB1cmxTdHIgKyAiIS8iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FuSmFyKChKYXJVUkxDb25uZWN0aW9uKSBqYXJVUkwub3BlbkNvbm5lY3Rpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsb2FkZXIgPSBsb2FkZXIuZ2V0UGFyZW50KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIERldGVybWluZXMgaWYgdGhlIEpBUiBmaWxlIHdpdGggdGhlIGdpdmVuIDx0dD5qYXJQYXRoPC90dD4gbmVlZHMgdG8gYmUKKyAgICAgKiBzY2FubmVkIGZvciBUTERzLgorICAgICAqCisgICAgICogQHBhcmFtIGxvYWRlciBUaGUgY3VycmVudCBjbGFzc2xvYWRlciBpbiB0aGUgcGFyZW50IGNoYWluCisgICAgICogQHBhcmFtIHdlYmFwcExvYWRlciBUaGUgd2ViYXBwIGNsYXNzbG9hZGVyCisgICAgICogQHBhcmFtIGphclBhdGggVGhlIEpBUiBmaWxlIHBhdGgKKyAgICAgKgorICAgICAqIEByZXR1cm4gVFJVRSBpZiB0aGUgSkFSIGZpbGUgaWRlbnRpZmllZCBieSA8dHQ+amFyUGF0aDwvdHQ+IG5lZWRzIHRvIGJlCisgICAgICogc2Nhbm5lZCBmb3IgVExEcywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIG5lZWRTY2FuSmFyKENsYXNzTG9hZGVyIGxvYWRlciwgQ2xhc3NMb2FkZXIgd2ViYXBwTG9hZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgamFyUGF0aCkgeworICAgICAgICBpZiAobG9hZGVyID09IHdlYmFwcExvYWRlcikgeworICAgICAgICAgICAgLy8gSkFScyB1bmRlciBXRUItSU5GL2xpYiBtdXN0IGJlIHNjYW5uZWQgdW5jb25kaXRpb25hbGx5IGFjY29yZGluZworICAgICAgICAgICAgLy8gdG8gdGhlIHNwZWMuCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFN0cmluZyBqYXJOYW1lID0gamFyUGF0aDsKKyAgICAgICAgICAgIGludCBzbGFzaCA9IGphclBhdGgubGFzdEluZGV4T2YoJy8nKTsKKyAgICAgICAgICAgIGlmIChzbGFzaCA+PSAwKSB7CisgICAgICAgICAgICAgICAgamFyTmFtZSA9IGphclBhdGguc3Vic3RyaW5nKHNsYXNoICsgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gKCFub1RsZEphcnMuY29udGFpbnMoamFyTmFtZSkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL2NvbXBpbGVyL1ZhbGlkYXRvci5qYXZhIGIvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL2NvbXBpbGVyL1ZhbGlkYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0NjJiNjMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvVmFsaWRhdG9yLmphdmEKQEAgLTAsMCArMSwxNTUzIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYXNwZXIuY29tcGlsZXI7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLmVsLkZ1bmN0aW9uTWFwcGVyOworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5GdW5jdGlvbkluZm87CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0LkpzcEZyYWdtZW50OworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5QYWdlRGF0YTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnQXR0cmlidXRlSW5mbzsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnRGF0YTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnRXh0cmFJbmZvOworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWdJbmZvOworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWdMaWJyYXJ5SW5mbzsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVmFsaWRhdGlvbk1lc3NhZ2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5Db25zdGFudHM7CitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIuSmFzcGVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLkpzcENvbXBpbGF0aW9uQ29udGV4dDsKK2ltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOworCisvKioKKyAqIFBlcmZvcm1zIHZhbGlkYXRpb24gb24gdGhlIHBhZ2UgZWxlbWVudHMuICBBdHRyaWJ1dGVzIGFyZSBjaGVja2VkIGZvcgorICogbWFuZGF0b3J5IHByZXNlbmNlLCBlbnRyeSB2YWx1ZSB2YWxpZGl0eSwgYW5kIGNvbnNpc3RlbmN5LiAgQXMgYQorICogc2lkZSBlZmZlY3QsIHNvbWUgcGFnZSBnbG9iYWwgdmFsdWUgKHN1Y2ggYXMgdGhvc2UgZnJvbSBwYWdlIGRpcmVjaXR2ZXMpCisgKiBhcmUgc3RvcmVkLCBmb3IgbGF0ZXIgdXNlLgorICoKKyAqIEBhdXRob3IgS2luLW1hbiBDaHVuZworICogQGF1dGhvciBKYW4gTHVlaGUKKyAqIEBhdXRob3IgU2hhd24gQmF5ZXJuCisgKiBAYXV0aG9yIE1hcmsgUm90aAorICovCitjbGFzcyBWYWxpZGF0b3IgeworCisgICAgLyoqCisgICAgICogQSB2aXNpdG9yIHRvIHZhbGlkYXRlIGFuZCBleHRyYWN0IHBhZ2UgZGlyZWN0aXZlIGluZm8KKyAgICAgKi8KKyAgICBzdGF0aWMgY2xhc3MgRGlyZWN0aXZlVmlzaXRvciBleHRlbmRzIE5vZGUuVmlzaXRvciB7CisKKwlwcml2YXRlIFBhZ2VJbmZvIHBhZ2VJbmZvOworCXByaXZhdGUgRXJyb3JEaXNwYXRjaGVyIGVycjsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIEpzcFV0aWwuVmFsaWRBdHRyaWJ1dGVbXSBwYWdlRGlyZWN0aXZlQXR0cnMgPSB7CisJICAgIG5ldyBKc3BVdGlsLlZhbGlkQXR0cmlidXRlKCJsYW5ndWFnZSIpLAorCSAgICBuZXcgSnNwVXRpbC5WYWxpZEF0dHJpYnV0ZSgiZXh0ZW5kcyIpLAorCSAgICBuZXcgSnNwVXRpbC5WYWxpZEF0dHJpYnV0ZSgiaW1wb3J0IiksCisJICAgIG5ldyBKc3BVdGlsLlZhbGlkQXR0cmlidXRlKCJzZXNzaW9uIiksCisJICAgIG5ldyBKc3BVdGlsLlZhbGlkQXR0cmlidXRlKCJidWZmZXIiKSwKKwkgICAgbmV3IEpzcFV0aWwuVmFsaWRBdHRyaWJ1dGUoImF1dG9GbHVzaCIpLAorCSAgICBuZXcgSnNwVXRpbC5WYWxpZEF0dHJpYnV0ZSgiaXNUaHJlYWRTYWZlIiksCisJICAgIG5ldyBKc3BVdGlsLlZhbGlkQXR0cmlidXRlKCJpbmZvIiksCisJICAgIG5ldyBKc3BVdGlsLlZhbGlkQXR0cmlidXRlKCJlcnJvclBhZ2UiKSwKKwkgICAgbmV3IEpzcFV0aWwuVmFsaWRBdHRyaWJ1dGUoImlzRXJyb3JQYWdlIiksCisJICAgIG5ldyBKc3BVdGlsLlZhbGlkQXR0cmlidXRlKCJjb250ZW50VHlwZSIpLAorCSAgICBuZXcgSnNwVXRpbC5WYWxpZEF0dHJpYnV0ZSgicGFnZUVuY29kaW5nIiksCisJICAgIG5ldyBKc3BVdGlsLlZhbGlkQXR0cmlidXRlKCJpc0VMSWdub3JlZCIpCisJfTsKKworCXByaXZhdGUgYm9vbGVhbiBwYWdlRW5jb2RpbmdTZWVuID0gZmFsc2U7CisKKwkvKgorCSAqIENvbnN0cnVjdG9yCisJICovCisJRGlyZWN0aXZlVmlzaXRvcihDb21waWxlciBjb21waWxlcikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJICAgIHRoaXMucGFnZUluZm8gPSBjb21waWxlci5nZXRQYWdlSW5mbygpOworCSAgICB0aGlzLmVyciA9IGNvbXBpbGVyLmdldEVycm9yRGlzcGF0Y2hlcigpOworCSAgICBKc3BDb21waWxhdGlvbkNvbnRleHQgY3R4dCA9IGNvbXBpbGVyLmdldENvbXBpbGF0aW9uQ29udGV4dCgpOworCX0KKworCXB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuSW5jbHVkZURpcmVjdGl2ZSBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIC8vIFNpbmNlIHBhZ2VEaXJlY3RpdmVTZWVuIGZsYWcgb25seSBhcHBsaWVzIHRvIHRoZSBDdXJyZW50IHBhZ2UKKyAgICAgICAgICAgIC8vIHNhdmUgaXQgaGVyZSBhbmQgcmVzdG9yZSBpdCBhZnRlciB0aGUgZmlsZSBpcyBpbmNsdWRlZC4KKyAgICAgICAgICAgIGJvb2xlYW4gcGFnZUVuY29kaW5nU2VlblNhdmUgPSBwYWdlRW5jb2RpbmdTZWVuOworICAgICAgICAgICAgcGFnZUVuY29kaW5nU2VlbiA9IGZhbHNlOworICAgICAgICAgICAgdmlzaXRCb2R5KG4pOworICAgICAgICAgICAgcGFnZUVuY29kaW5nU2VlbiA9IHBhZ2VFbmNvZGluZ1NlZW5TYXZlOworICAgICAgICB9CisKKwlwdWJsaWMgdm9pZCB2aXNpdChOb2RlLlBhZ2VEaXJlY3RpdmUgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7ICAgIAorCisgICAgICAgICAgICBKc3BVdGlsLmNoZWNrQXR0cmlidXRlcygiUGFnZSBkaXJlY3RpdmUiLCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZURpcmVjdGl2ZUF0dHJzLCBlcnIpOworCisJICAgIC8vIEpTUC4yLjEwLjEKKwkgICAgQXR0cmlidXRlcyBhdHRycyA9IG4uZ2V0QXR0cmlidXRlcygpOworCSAgICBmb3IgKGludCBpID0gMDsgYXR0cnMgIT0gbnVsbCAmJiBpIDwgYXR0cnMuZ2V0TGVuZ3RoKCk7IGkrKykgeworCQlTdHJpbmcgYXR0ciA9IGF0dHJzLmdldFFOYW1lKGkpOworCQlTdHJpbmcgdmFsdWUgPSBhdHRycy5nZXRWYWx1ZShpKTsKKworCQlpZiAoImxhbmd1YWdlIi5lcXVhbHMoYXR0cikpIHsKKwkJICAgIGlmIChwYWdlSW5mby5nZXRMYW5ndWFnZShmYWxzZSkgPT0gbnVsbCkgeworCQkJcGFnZUluZm8uc2V0TGFuZ3VhZ2UodmFsdWUsIG4sIGVyciwgdHJ1ZSk7CisJCSAgICB9IGVsc2UgaWYgKCFwYWdlSW5mby5nZXRMYW5ndWFnZShmYWxzZSkuZXF1YWxzKHZhbHVlKSkgeworCQkJZXJyLmpzcEVycm9yKG4sICJqc3AuZXJyb3IucGFnZS5jb25mbGljdC5sYW5ndWFnZSIsCisJCQkJICAgICBwYWdlSW5mby5nZXRMYW5ndWFnZShmYWxzZSksIHZhbHVlKTsKKwkJICAgIH0KKwkJfSBlbHNlIGlmICgiZXh0ZW5kcyIuZXF1YWxzKGF0dHIpKSB7CisJCSAgICBpZiAocGFnZUluZm8uZ2V0RXh0ZW5kcyhmYWxzZSkgPT0gbnVsbCkgeworCQkJcGFnZUluZm8uc2V0RXh0ZW5kcyh2YWx1ZSwgbik7CisJCSAgICB9IGVsc2UgaWYgKCFwYWdlSW5mby5nZXRFeHRlbmRzKGZhbHNlKS5lcXVhbHModmFsdWUpKSB7CisJCQllcnIuanNwRXJyb3IobiwgImpzcC5lcnJvci5wYWdlLmNvbmZsaWN0LmV4dGVuZHMiLAorCQkJCSAgICAgcGFnZUluZm8uZ2V0RXh0ZW5kcyhmYWxzZSksIHZhbHVlKTsKKwkJICAgIH0KKwkJfSBlbHNlIGlmICgiY29udGVudFR5cGUiLmVxdWFscyhhdHRyKSkgeworCQkgICAgaWYgKHBhZ2VJbmZvLmdldENvbnRlbnRUeXBlKCkgPT0gbnVsbCkgeworCQkJcGFnZUluZm8uc2V0Q29udGVudFR5cGUodmFsdWUpOworCQkgICAgfSBlbHNlIGlmICghcGFnZUluZm8uZ2V0Q29udGVudFR5cGUoKS5lcXVhbHModmFsdWUpKSB7CisJCQllcnIuanNwRXJyb3IobiwgImpzcC5lcnJvci5wYWdlLmNvbmZsaWN0LmNvbnRlbnR0eXBlIiwKKwkJCQkgICAgIHBhZ2VJbmZvLmdldENvbnRlbnRUeXBlKCksIHZhbHVlKTsKKwkJICAgIH0KKwkJfSBlbHNlIGlmICgic2Vzc2lvbiIuZXF1YWxzKGF0dHIpKSB7CisJCSAgICBpZiAocGFnZUluZm8uZ2V0U2Vzc2lvbigpID09IG51bGwpIHsKKwkJCXBhZ2VJbmZvLnNldFNlc3Npb24odmFsdWUsIG4sIGVycik7CisJCSAgICB9IGVsc2UgaWYgKCFwYWdlSW5mby5nZXRTZXNzaW9uKCkuZXF1YWxzKHZhbHVlKSkgeworCQkJZXJyLmpzcEVycm9yKG4sICJqc3AuZXJyb3IucGFnZS5jb25mbGljdC5zZXNzaW9uIiwKKwkJCQkgICAgIHBhZ2VJbmZvLmdldFNlc3Npb24oKSwgdmFsdWUpOworCQkgICAgfQorCQl9IGVsc2UgaWYgKCJidWZmZXIiLmVxdWFscyhhdHRyKSkgeworCQkgICAgaWYgKHBhZ2VJbmZvLmdldEJ1ZmZlclZhbHVlKCkgPT0gbnVsbCkgeworCQkJcGFnZUluZm8uc2V0QnVmZmVyVmFsdWUodmFsdWUsIG4sIGVycik7CisJCSAgICB9IGVsc2UgaWYgKCFwYWdlSW5mby5nZXRCdWZmZXJWYWx1ZSgpLmVxdWFscyh2YWx1ZSkpIHsKKwkJCWVyci5qc3BFcnJvcihuLCAianNwLmVycm9yLnBhZ2UuY29uZmxpY3QuYnVmZmVyIiwKKwkJCQkgICAgIHBhZ2VJbmZvLmdldEJ1ZmZlclZhbHVlKCksIHZhbHVlKTsKKwkJICAgIH0KKwkJfSBlbHNlIGlmICgiYXV0b0ZsdXNoIi5lcXVhbHMoYXR0cikpIHsKKwkJICAgIGlmIChwYWdlSW5mby5nZXRBdXRvRmx1c2goKSA9PSBudWxsKSB7CisJCQlwYWdlSW5mby5zZXRBdXRvRmx1c2godmFsdWUsIG4sIGVycik7CisJCSAgICB9IGVsc2UgaWYgKCFwYWdlSW5mby5nZXRBdXRvRmx1c2goKS5lcXVhbHModmFsdWUpKSB7CisJCQllcnIuanNwRXJyb3IobiwgImpzcC5lcnJvci5wYWdlLmNvbmZsaWN0LmF1dG9mbHVzaCIsCisJCQkJICAgICBwYWdlSW5mby5nZXRBdXRvRmx1c2goKSwgdmFsdWUpOworCQkgICAgfQorCQl9IGVsc2UgaWYgKCJpc1RocmVhZFNhZmUiLmVxdWFscyhhdHRyKSkgeworCQkgICAgaWYgKHBhZ2VJbmZvLmdldElzVGhyZWFkU2FmZSgpID09IG51bGwpIHsKKwkJCXBhZ2VJbmZvLnNldElzVGhyZWFkU2FmZSh2YWx1ZSwgbiwgZXJyKTsKKwkJICAgIH0gZWxzZSBpZiAoIXBhZ2VJbmZvLmdldElzVGhyZWFkU2FmZSgpLmVxdWFscyh2YWx1ZSkpIHsKKwkJCWVyci5qc3BFcnJvcihuLCAianNwLmVycm9yLnBhZ2UuY29uZmxpY3QuaXN0aHJlYWRzYWZlIiwKKwkJCQkgICAgIHBhZ2VJbmZvLmdldElzVGhyZWFkU2FmZSgpLCB2YWx1ZSk7CisJCSAgICB9CisJCX0gZWxzZSBpZiAoImlzRUxJZ25vcmVkIi5lcXVhbHMoYXR0cikpIHsKKwkJICAgIGlmIChwYWdlSW5mby5nZXRJc0VMSWdub3JlZCgpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VJbmZvLnNldElzRUxJZ25vcmVkKHZhbHVlLCBuLCBlcnIsIHRydWUpOworCQkgICAgfSBlbHNlIGlmICghcGFnZUluZm8uZ2V0SXNFTElnbm9yZWQoKS5lcXVhbHModmFsdWUpKSB7CisJCQllcnIuanNwRXJyb3IobiwgImpzcC5lcnJvci5wYWdlLmNvbmZsaWN0LmlzZWxpZ25vcmVkIiwKKwkJCQkgICAgIHBhZ2VJbmZvLmdldElzRUxJZ25vcmVkKCksIHZhbHVlKTsKKwkJICAgIH0KKwkJfSBlbHNlIGlmICgiaXNFcnJvclBhZ2UiLmVxdWFscyhhdHRyKSkgeworCQkgICAgaWYgKHBhZ2VJbmZvLmdldElzRXJyb3JQYWdlKCkgPT0gbnVsbCkgeworCQkJcGFnZUluZm8uc2V0SXNFcnJvclBhZ2UodmFsdWUsIG4sIGVycik7CisJCSAgICB9IGVsc2UgaWYgKCFwYWdlSW5mby5nZXRJc0Vycm9yUGFnZSgpLmVxdWFscyh2YWx1ZSkpIHsKKwkJCWVyci5qc3BFcnJvcihuLCAianNwLmVycm9yLnBhZ2UuY29uZmxpY3QuaXNlcnJvcnBhZ2UiLAorCQkJCSAgICAgcGFnZUluZm8uZ2V0SXNFcnJvclBhZ2UoKSwgdmFsdWUpOworCQkgICAgfQorCQl9IGVsc2UgaWYgKCJlcnJvclBhZ2UiLmVxdWFscyhhdHRyKSkgeworCQkgICAgaWYgKHBhZ2VJbmZvLmdldEVycm9yUGFnZSgpID09IG51bGwpIHsKKwkJCXBhZ2VJbmZvLnNldEVycm9yUGFnZSh2YWx1ZSk7CisJCSAgICB9IGVsc2UgaWYgKCFwYWdlSW5mby5nZXRFcnJvclBhZ2UoKS5lcXVhbHModmFsdWUpKSB7CisJCQllcnIuanNwRXJyb3IobiwgImpzcC5lcnJvci5wYWdlLmNvbmZsaWN0LmVycm9ycGFnZSIsCisJCQkJICAgICBwYWdlSW5mby5nZXRFcnJvclBhZ2UoKSwgdmFsdWUpOworCQkgICAgfQorCQl9IGVsc2UgaWYgKCJpbmZvIi5lcXVhbHMoYXR0cikpIHsKKwkJICAgIGlmIChwYWdlSW5mby5nZXRJbmZvKCkgPT0gbnVsbCkgeworCQkJcGFnZUluZm8uc2V0SW5mbyh2YWx1ZSk7CisJCSAgICB9IGVsc2UgaWYgKCFwYWdlSW5mby5nZXRJbmZvKCkuZXF1YWxzKHZhbHVlKSkgeworCQkJZXJyLmpzcEVycm9yKG4sICJqc3AuZXJyb3IucGFnZS5jb25mbGljdC5pbmZvIiwKKwkJCQkgICAgIHBhZ2VJbmZvLmdldEluZm8oKSwgdmFsdWUpOworCQkgICAgfQorCQl9IGVsc2UgaWYgKCJwYWdlRW5jb2RpbmciLmVxdWFscyhhdHRyKSkgeworCQkgICAgaWYgKHBhZ2VFbmNvZGluZ1NlZW4pIAorCQkJZXJyLmpzcEVycm9yKG4sICJqc3AuZXJyb3IucGFnZS5tdWx0aS5wYWdlZW5jb2RpbmciKTsKKwkJICAgIC8vICdwYWdlRW5jb2RpbmcnIGNhbiBvY2N1ciBhdCBtb3N0IG9uY2UgcGVyIGZpbGUKKwkJICAgIHBhZ2VFbmNvZGluZ1NlZW4gPSB0cnVlOworCQkgICAgY29tcGFyZVBhZ2VFbmNvZGluZ3ModmFsdWUsIG4pOworCQl9CisJICAgIH0KKworCSAgICAvLyBDaGVjayBmb3IgYmFkIGNvbWJpbmF0aW9ucworCSAgICBpZiAocGFnZUluZm8uZ2V0QnVmZmVyKCkgPT0gMCAmJiAhcGFnZUluZm8uaXNBdXRvRmx1c2goKSkKKwkJZXJyLmpzcEVycm9yKG4sICJqc3AuZXJyb3IucGFnZS5iYWRDb21ibyIpOworCisJICAgIC8vIEF0dHJpYnV0ZXMgZm9yIGltcG9ydHMgZm9yIHRoaXMgbm9kZSBoYXZlIGJlZW4gcHJvY2Vzc2VkIGJ5CisJICAgIC8vIHRoZSBwYXJzZXJzLCBqdXN0IGFkZCB0aGVtIHRvIHBhZ2VJbmZvLgorCSAgICBwYWdlSW5mby5hZGRJbXBvcnRzKG4uZ2V0SW1wb3J0cygpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB2aXNpdChOb2RlLlRhZ0RpcmVjdGl2ZSBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIC8vIE5vdGU6IE1vc3Qgb2YgdGhlIHZhbGlkYXRpb24gaXMgZG9uZSBpbiBUYWdGaWxlUHJvY2Vzc29yCisgICAgICAgICAgICAvLyB3aGVuIGl0IGNyZWF0ZWQgYSBUYWdJbmZvIG9iamVjdCBmcm9tIHRoZQorICAgICAgICAgICAgLy8gdGFnIGZpbGUgaW4gd2hpY2ggdGhlIGRpcmVjdGl2ZSBhcHBlYXJlZC4KKyAgICAgICAgCisgICAgICAgICAgICAvLyBUaGlzIG1ldGhvZCBkb2VzIGFkZGl0aW9uYWwgcHJvY2Vzc2luZyB0byBjb2xsZWN0IHBhZ2UgaW5mbworICAgICAgICAgICAgCisJICAgIEF0dHJpYnV0ZXMgYXR0cnMgPSBuLmdldEF0dHJpYnV0ZXMoKTsKKwkgICAgZm9yIChpbnQgaSA9IDA7IGF0dHJzICE9IG51bGwgJiYgaSA8IGF0dHJzLmdldExlbmd0aCgpOyBpKyspIHsKKwkJU3RyaW5nIGF0dHIgPSBhdHRycy5nZXRRTmFtZShpKTsKKwkJU3RyaW5nIHZhbHVlID0gYXR0cnMuZ2V0VmFsdWUoaSk7CisKKwkJaWYgKCJsYW5ndWFnZSIuZXF1YWxzKGF0dHIpKSB7CisJCSAgICBpZiAocGFnZUluZm8uZ2V0TGFuZ3VhZ2UoZmFsc2UpID09IG51bGwpIHsKKwkJCXBhZ2VJbmZvLnNldExhbmd1YWdlKHZhbHVlLCBuLCBlcnIsIGZhbHNlKTsKKwkJICAgIH0gZWxzZSBpZiAoIXBhZ2VJbmZvLmdldExhbmd1YWdlKGZhbHNlKS5lcXVhbHModmFsdWUpKSB7CisJCQllcnIuanNwRXJyb3IobiwgImpzcC5lcnJvci50YWcuY29uZmxpY3QubGFuZ3VhZ2UiLAorCQkJCSAgICAgcGFnZUluZm8uZ2V0TGFuZ3VhZ2UoZmFsc2UpLCB2YWx1ZSk7CisJCSAgICB9CisJCX0gZWxzZSBpZiAoImlzRUxJZ25vcmVkIi5lcXVhbHMoYXR0cikpIHsKKwkJICAgIGlmIChwYWdlSW5mby5nZXRJc0VMSWdub3JlZCgpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VJbmZvLnNldElzRUxJZ25vcmVkKHZhbHVlLCBuLCBlcnIsIGZhbHNlKTsKKwkJICAgIH0gZWxzZSBpZiAoIXBhZ2VJbmZvLmdldElzRUxJZ25vcmVkKCkuZXF1YWxzKHZhbHVlKSkgeworCQkJZXJyLmpzcEVycm9yKG4sICJqc3AuZXJyb3IudGFnLmNvbmZsaWN0LmlzZWxpZ25vcmVkIiwKKwkJCQkgICAgIHBhZ2VJbmZvLmdldElzRUxJZ25vcmVkKCksIHZhbHVlKTsKKwkJICAgIH0KKwkJfSBlbHNlIGlmICgicGFnZUVuY29kaW5nIi5lcXVhbHMoYXR0cikpIHsKKwkJICAgIGlmIChwYWdlRW5jb2RpbmdTZWVuKSAKKwkJCWVyci5qc3BFcnJvcihuLCAianNwLmVycm9yLnRhZy5tdWx0aS5wYWdlZW5jb2RpbmciKTsKKwkJICAgIHBhZ2VFbmNvZGluZ1NlZW4gPSB0cnVlOworCQkgICAgbi5nZXRSb290KCkuc2V0UGFnZUVuY29kaW5nKHZhbHVlKTsKKwkJfQorCSAgICB9CisKKwkgICAgLy8gQXR0cmlidXRlcyBmb3IgaW1wb3J0cyBmb3IgdGhpcyBub2RlIGhhdmUgYmVlbiBwcm9jZXNzZWQgYnkKKwkgICAgLy8gdGhlIHBhcnNlcnMsIGp1c3QgYWRkIHRoZW0gdG8gcGFnZUluZm8uCisJICAgIHBhZ2VJbmZvLmFkZEltcG9ydHMobi5nZXRJbXBvcnRzKCkpOworCX0KKworCXB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuQXR0cmlidXRlRGlyZWN0aXZlIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCSAgICAvLyBEbyBub3RoaW5nLCBzaW5jZSB0aGlzIGF0dHJpYnV0ZSBkaXJlY3RpdmUgaGFzIGFscmVhZHkgYmVlbgorCSAgICAvLyB2YWxpZGF0ZWQgYnkgVGFnRmlsZVByb2Nlc3NvciB3aGVuIGl0IGNyZWF0ZWQgYSBUYWdJbmZvIG9iamVjdAorCSAgICAvLyBmcm9tIHRoZSB0YWcgZmlsZSBpbiB3aGljaCB0aGUgZGlyZWN0aXZlIGFwcGVhcmVkCisJfQorCisJcHVibGljIHZvaWQgdmlzaXQoTm9kZS5WYXJpYWJsZURpcmVjdGl2ZSBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwkgICAgLy8gRG8gbm90aGluZywgc2luY2UgdGhpcyB2YXJpYWJsZSBkaXJlY3RpdmUgaGFzIGFscmVhZHkgYmVlbgorCSAgICAvLyB2YWxpZGF0ZWQgYnkgVGFnRmlsZVByb2Nlc3NvciB3aGVuIGl0IGNyZWF0ZWQgYSBUYWdJbmZvIG9iamVjdAorCSAgICAvLyBmcm9tIHRoZSB0YWcgZmlsZSBpbiB3aGljaCB0aGUgZGlyZWN0aXZlIGFwcGVhcmVkCisJfQorCisgICAgICAgIC8qCisgICAgICAgICAqIENvbXBhcmVzIHBhZ2UgZW5jb2RpbmdzIHNwZWNpZmllZCBpbiB2YXJpb3VzIHBsYWNlcywgYW5kIHRocm93cworICAgICAgICAgKiBleGNlcHRpb24gaW4gY2FzZSBvZiBwYWdlIGVuY29kaW5nIG1pc21hdGNoLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcGFnZURpckVuYyBUaGUgdmFsdWUgb2YgdGhlIHBhZ2VFbmNvZGluZyBhdHRyaWJ1dGUgb2YgdGhlCisgICAgICAgICAqIHBhZ2UgZGlyZWN0aXZlCisgICAgICAgICAqIEBwYXJhbSBwYWdlRGlyIFRoZSBwYWdlIGRpcmVjdGl2ZSBub2RlCisgICAgICAgICAqCisgICAgICAgICAqIEB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIGluIGNhc2Ugb2YgcGFnZSBlbmNvZGluZyBtaXNtYXRjaAorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSB2b2lkIGNvbXBhcmVQYWdlRW5jb2RpbmdzKFN0cmluZyBwYWdlRGlyRW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9kZS5QYWdlRGlyZWN0aXZlIHBhZ2VEaXIpCisgICAgICAgICAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisKKyAgICAgICAgICAgIE5vZGUuUm9vdCByb290ID0gcGFnZURpci5nZXRSb290KCk7CisgICAgICAgICAgICBTdHJpbmcgY29uZmlnRW5jID0gcm9vdC5nZXRKc3BDb25maWdQYWdlRW5jb2RpbmcoKTsKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIENvbXBhcmUgdGhlICdwYWdlRW5jb2RpbmcnIGF0dHJpYnV0ZSBvZiB0aGUgcGFnZSBkaXJlY3RpdmUgd2l0aAorICAgICAgICAgICAgICogdGhlIGVuY29kaW5nIHNwZWNpZmllZCBpbiB0aGUgSlNQIGNvbmZpZyBlbGVtZW50IHdob3NlIFVSTAorICAgICAgICAgICAgICogcGF0dGVybiBtYXRjaGVzIHRoaXMgcGFnZS4KKyAgICAgICAgICAgICAqIFRyZWF0ICJVVEYtMTYiLCAiVVRGLTE2QkUiLCBhbmQgIlVURi0xNkxFIiBhcyBpZGVudGljYWwuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChjb25maWdFbmMgIT0gbnVsbCAmJiAhcGFnZURpckVuYy5lcXVhbHMoY29uZmlnRW5jKSAKKyAgICAgICAgICAgICAgICAgICAgJiYgKCFwYWdlRGlyRW5jLnN0YXJ0c1dpdGgoIlVURi0xNiIpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCAhY29uZmlnRW5jLnN0YXJ0c1dpdGgoIlVURi0xNiIpKSkgeworICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcihwYWdlRGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAianNwLmVycm9yLmNvbmZpZ19wYWdlZGlyX2VuY29kaW5nX21pc21hdGNoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnRW5jLCBwYWdlRGlyRW5jKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIENvbXBhcmUgdGhlICdwYWdlRW5jb2RpbmcnIGF0dHJpYnV0ZSBvZiB0aGUgcGFnZSBkaXJlY3RpdmUgd2l0aAorICAgICAgICAgICAgICogdGhlIGVuY29kaW5nIHNwZWNpZmllZCBpbiB0aGUgWE1MIHByb2xvZyAob25seSBmb3IgWE1MIHN5bnRheCwKKyAgICAgICAgICAgICAqIGFuZCBvbmx5IGlmIEpTUCBkb2N1bWVudCBjb250YWlucyBYTUwgcHJvbG9nIHdpdGggZW5jb2RpbmcKKyAgICAgICAgICAgICAqIGRlY2xhcmF0aW9uKS4KKyAgICAgICAgICAgICAqIFRyZWF0ICJVVEYtMTYiLCAiVVRGLTE2QkUiLCBhbmQgIlVURi0xNkxFIiBhcyBpZGVudGljYWwuCisgICAgICAgICAgICAgKi8KKwkgICAgaWYgKHJvb3QuaXNYbWxTeW50YXgoKSAmJiByb290LmlzRW5jb2RpbmdTcGVjaWZpZWRJblByb2xvZygpKSB7CisJCVN0cmluZyBwYWdlRW5jID0gcm9vdC5nZXRQYWdlRW5jb2RpbmcoKTsKKyAgICAgICAgICAgICAgICBpZiAoIXBhZ2VEaXJFbmMuZXF1YWxzKHBhZ2VFbmMpIAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKCFwYWdlRGlyRW5jLnN0YXJ0c1dpdGgoIlVURi0xNiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgIXBhZ2VFbmMuc3RhcnRzV2l0aCgiVVRGLTE2IikpKSB7CisgICAgICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcihwYWdlRGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImpzcC5lcnJvci5wcm9sb2dfcGFnZWRpcl9lbmNvZGluZ19taXNtYXRjaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlRW5jLCBwYWdlRGlyRW5jKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIHZpc2l0b3IgZm9yIHZhbGlkYXRpbmcgbm9kZXMgb3RoZXIgdGhhbiBwYWdlIGRpcmVjdGl2ZXMKKyAgICAgKi8KKyAgICBzdGF0aWMgY2xhc3MgVmFsaWRhdGVWaXNpdG9yIGV4dGVuZHMgTm9kZS5WaXNpdG9yIHsKKworCXByaXZhdGUgUGFnZUluZm8gcGFnZUluZm87CisJcHJpdmF0ZSBFcnJvckRpc3BhdGNoZXIgZXJyOworCXByaXZhdGUgVGFnSW5mbyB0YWdJbmZvOworICAgICAgICBwcml2YXRlIENsYXNzTG9hZGVyIGxvYWRlcjsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIEpzcFV0aWwuVmFsaWRBdHRyaWJ1dGVbXSBqc3BSb290QXR0cnMgPSB7CisgICAgICAgICAgICBuZXcgSnNwVXRpbC5WYWxpZEF0dHJpYnV0ZSgieHNpOnNjaGVtYUxvY2F0aW9uIiksCisJICAgIG5ldyBKc3BVdGlsLlZhbGlkQXR0cmlidXRlKCJ2ZXJzaW9uIiwgdHJ1ZSkgfTsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIEpzcFV0aWwuVmFsaWRBdHRyaWJ1dGVbXSBpbmNsdWRlRGlyZWN0aXZlQXR0cnMgPSB7CisJICAgIG5ldyBKc3BVdGlsLlZhbGlkQXR0cmlidXRlKCJmaWxlIiwgdHJ1ZSkgfTsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIEpzcFV0aWwuVmFsaWRBdHRyaWJ1dGVbXSB0YWdsaWJEaXJlY3RpdmVBdHRycyA9IHsKKwkgICAgbmV3IEpzcFV0aWwuVmFsaWRBdHRyaWJ1dGUoInVyaSIpLAorCSAgICBuZXcgSnNwVXRpbC5WYWxpZEF0dHJpYnV0ZSgidGFnZGlyIiksCisJICAgIG5ldyBKc3BVdGlsLlZhbGlkQXR0cmlidXRlKCJwcmVmaXgiLCB0cnVlKSB9OworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnNwVXRpbC5WYWxpZEF0dHJpYnV0ZVtdIGluY2x1ZGVBY3Rpb25BdHRycyA9IHsKKwkgICAgbmV3IEpzcFV0aWwuVmFsaWRBdHRyaWJ1dGUoInBhZ2UiLCB0cnVlLCB0cnVlKSwKKwkgICAgbmV3IEpzcFV0aWwuVmFsaWRBdHRyaWJ1dGUoImZsdXNoIikgfTsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIEpzcFV0aWwuVmFsaWRBdHRyaWJ1dGVbXSBwYXJhbUFjdGlvbkF0dHJzID0geworCSAgICBuZXcgSnNwVXRpbC5WYWxpZEF0dHJpYnV0ZSgibmFtZSIsIHRydWUpLAorCSAgICBuZXcgSnNwVXRpbC5WYWxpZEF0dHJpYnV0ZSgidmFsdWUiLCB0cnVlLCB0cnVlKSB9OworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnNwVXRpbC5WYWxpZEF0dHJpYnV0ZVtdIGZvcndhcmRBY3Rpb25BdHRycyA9IHsKKwkgICAgbmV3IEpzcFV0aWwuVmFsaWRBdHRyaWJ1dGUoInBhZ2UiLCB0cnVlLCB0cnVlKSB9OworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnNwVXRpbC5WYWxpZEF0dHJpYnV0ZVtdIGdldFByb3BlcnR5QXR0cnMgPSB7CisJICAgIG5ldyBKc3BVdGlsLlZhbGlkQXR0cmlidXRlKCJuYW1lIiwgdHJ1ZSksCisJICAgIG5ldyBKc3BVdGlsLlZhbGlkQXR0cmlidXRlKCJwcm9wZXJ0eSIsIHRydWUpIH07CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBKc3BVdGlsLlZhbGlkQXR0cmlidXRlW10gc2V0UHJvcGVydHlBdHRycyA9IHsKKwkgICAgbmV3IEpzcFV0aWwuVmFsaWRBdHRyaWJ1dGUoIm5hbWUiLCB0cnVlKSwKKwkgICAgbmV3IEpzcFV0aWwuVmFsaWRBdHRyaWJ1dGUoInByb3BlcnR5IiwgdHJ1ZSksCisJICAgIG5ldyBKc3BVdGlsLlZhbGlkQXR0cmlidXRlKCJ2YWx1ZSIsIGZhbHNlLCB0cnVlKSwKKwkgICAgbmV3IEpzcFV0aWwuVmFsaWRBdHRyaWJ1dGUoInBhcmFtIikgfTsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIEpzcFV0aWwuVmFsaWRBdHRyaWJ1dGVbXSB1c2VCZWFuQXR0cnMgPSB7CisJICAgIG5ldyBKc3BVdGlsLlZhbGlkQXR0cmlidXRlKCJpZCIsIHRydWUpLAorCSAgICBuZXcgSnNwVXRpbC5WYWxpZEF0dHJpYnV0ZSgic2NvcGUiKSwKKwkgICAgbmV3IEpzcFV0aWwuVmFsaWRBdHRyaWJ1dGUoImNsYXNzIiksCisJICAgIG5ldyBKc3BVdGlsLlZhbGlkQXR0cmlidXRlKCJ0eXBlIiksCisJICAgIG5ldyBKc3BVdGlsLlZhbGlkQXR0cmlidXRlKCJiZWFuTmFtZSIsIGZhbHNlLCB0cnVlKSB9OworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnNwVXRpbC5WYWxpZEF0dHJpYnV0ZVtdIHBsdWdJbkF0dHJzID0geworCSAgICBuZXcgSnNwVXRpbC5WYWxpZEF0dHJpYnV0ZSgidHlwZSIsdHJ1ZSksCisJICAgIG5ldyBKc3BVdGlsLlZhbGlkQXR0cmlidXRlKCJjb2RlIiwgdHJ1ZSksCisJICAgIG5ldyBKc3BVdGlsLlZhbGlkQXR0cmlidXRlKCJjb2RlYmFzZSIpLAorCSAgICBuZXcgSnNwVXRpbC5WYWxpZEF0dHJpYnV0ZSgiYWxpZ24iKSwKKwkgICAgbmV3IEpzcFV0aWwuVmFsaWRBdHRyaWJ1dGUoImFyY2hpdmUiKSwKKwkgICAgbmV3IEpzcFV0aWwuVmFsaWRBdHRyaWJ1dGUoImhlaWdodCIsIGZhbHNlLCB0cnVlKSwKKwkgICAgbmV3IEpzcFV0aWwuVmFsaWRBdHRyaWJ1dGUoImhzcGFjZSIpLAorCSAgICBuZXcgSnNwVXRpbC5WYWxpZEF0dHJpYnV0ZSgianJldmVyc2lvbiIpLAorCSAgICBuZXcgSnNwVXRpbC5WYWxpZEF0dHJpYnV0ZSgibmFtZSIpLAorCSAgICBuZXcgSnNwVXRpbC5WYWxpZEF0dHJpYnV0ZSgidnNwYWNlIiksCisJICAgIG5ldyBKc3BVdGlsLlZhbGlkQXR0cmlidXRlKCJ3aWR0aCIsIGZhbHNlLCB0cnVlKSwKKwkgICAgbmV3IEpzcFV0aWwuVmFsaWRBdHRyaWJ1dGUoIm5zcGx1Z2ludXJsIiksCisJICAgIG5ldyBKc3BVdGlsLlZhbGlkQXR0cmlidXRlKCJpZXBsdWdpbnVybCIpIH07CisgICAgICAgICAgICAKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnNwVXRpbC5WYWxpZEF0dHJpYnV0ZVtdIGF0dHJpYnV0ZUF0dHJzID0geworICAgICAgICAgICAgbmV3IEpzcFV0aWwuVmFsaWRBdHRyaWJ1dGUoIm5hbWUiLCB0cnVlKSwKKyAgICAgICAgICAgIG5ldyBKc3BVdGlsLlZhbGlkQXR0cmlidXRlKCJ0cmltIikgfTsKKyAgICAgICAgICAgIAorICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBKc3BVdGlsLlZhbGlkQXR0cmlidXRlW10gaW52b2tlQXR0cnMgPSB7CisgICAgICAgICAgICBuZXcgSnNwVXRpbC5WYWxpZEF0dHJpYnV0ZSgiZnJhZ21lbnQiLCB0cnVlKSwKKwkgICAgbmV3IEpzcFV0aWwuVmFsaWRBdHRyaWJ1dGUoInZhciIpLAorCSAgICBuZXcgSnNwVXRpbC5WYWxpZEF0dHJpYnV0ZSgidmFyUmVhZGVyIiksCisJICAgIG5ldyBKc3BVdGlsLlZhbGlkQXR0cmlidXRlKCJzY29wZSIpIH07CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnNwVXRpbC5WYWxpZEF0dHJpYnV0ZVtdIGRvQm9keUF0dHJzID0geworICAgICAgICAgICAgbmV3IEpzcFV0aWwuVmFsaWRBdHRyaWJ1dGUoInZhciIpLAorCSAgICBuZXcgSnNwVXRpbC5WYWxpZEF0dHJpYnV0ZSgidmFyUmVhZGVyIiksCisJICAgIG5ldyBKc3BVdGlsLlZhbGlkQXR0cmlidXRlKCJzY29wZSIpIH07CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBKc3BVdGlsLlZhbGlkQXR0cmlidXRlW10ganNwT3V0cHV0QXR0cnMgPSB7CisJICAgIG5ldyBKc3BVdGlsLlZhbGlkQXR0cmlidXRlKCJvbWl0LXhtbC1kZWNsYXJhdGlvbiIpLAorCSAgICBuZXcgSnNwVXRpbC5WYWxpZEF0dHJpYnV0ZSgiZG9jdHlwZS1yb290LWVsZW1lbnQiKSwKKwkgICAgbmV3IEpzcFV0aWwuVmFsaWRBdHRyaWJ1dGUoImRvY3R5cGUtcHVibGljIiksCisJICAgIG5ldyBKc3BVdGlsLlZhbGlkQXR0cmlidXRlKCJkb2N0eXBlLXN5c3RlbSIpIH07CisKKwkvKgorCSAqIENvbnN0cnVjdG9yCisJICovCisJVmFsaWRhdGVWaXNpdG9yKENvbXBpbGVyIGNvbXBpbGVyKSB7CisJICAgIHRoaXMucGFnZUluZm8gPSBjb21waWxlci5nZXRQYWdlSW5mbygpOworCSAgICB0aGlzLmVyciA9IGNvbXBpbGVyLmdldEVycm9yRGlzcGF0Y2hlcigpOworCSAgICB0aGlzLnRhZ0luZm8gPSBjb21waWxlci5nZXRDb21waWxhdGlvbkNvbnRleHQoKS5nZXRUYWdJbmZvKCk7CisJICAgIHRoaXMubG9hZGVyID0gY29tcGlsZXIuZ2V0Q29tcGlsYXRpb25Db250ZXh0KCkuZ2V0Q2xhc3NMb2FkZXIoKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB2aXNpdChOb2RlLkpzcFJvb3QgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJICAgIEpzcFV0aWwuY2hlY2tBdHRyaWJ1dGVzKCJKc3A6cm9vdCIsIG4sCisJCQkJICAgIGpzcFJvb3RBdHRycywgZXJyKTsKKwkgICAgU3RyaW5nIHZlcnNpb24gPSBuLmdldFRleHRBdHRyaWJ1dGUoInZlcnNpb24iKTsKKwkgICAgaWYgKCF2ZXJzaW9uLmVxdWFscygiMS4yIikgJiYgIXZlcnNpb24uZXF1YWxzKCIyLjAiKSkgeworCQllcnIuanNwRXJyb3IobiwgImpzcC5lcnJvci5qc3Byb290LnZlcnNpb24uaW52YWxpZCIsIHZlcnNpb24pOworCSAgICB9CisJICAgIHZpc2l0Qm9keShuKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB2aXNpdChOb2RlLkluY2x1ZGVEaXJlY3RpdmUgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBKc3BVdGlsLmNoZWNrQXR0cmlidXRlcygiSW5jbHVkZSBkaXJlY3RpdmUiLCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZURpcmVjdGl2ZUF0dHJzLCBlcnIpOworCSAgICB2aXNpdEJvZHkobik7CisJfQorCisJcHVibGljIHZvaWQgdmlzaXQoTm9kZS5UYWdsaWJEaXJlY3RpdmUgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBKc3BVdGlsLmNoZWNrQXR0cmlidXRlcygiVGFnbGliIGRpcmVjdGl2ZSIsIG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdsaWJEaXJlY3RpdmVBdHRycywgZXJyKTsKKwkgICAgLy8gRWl0aGVyICd1cmknIG9yICd0YWdkaXInIGF0dHJpYnV0ZSBtdXN0IGJlIHNwZWNpZmllZAorCSAgICBTdHJpbmcgdXJpID0gbi5nZXRBdHRyaWJ1dGVWYWx1ZSgidXJpIik7CisJICAgIFN0cmluZyB0YWdkaXIgPSBuLmdldEF0dHJpYnV0ZVZhbHVlKCJ0YWdkaXIiKTsKKwkgICAgaWYgKHVyaSA9PSBudWxsICYmIHRhZ2RpciA9PSBudWxsKSB7CisJCWVyci5qc3BFcnJvcihuLCAianNwLmVycm9yLnRhZ2xpYkRpcmVjdGl2ZS5taXNzaW5nLmxvY2F0aW9uIik7CisJICAgIH0KKwkgICAgaWYgKHVyaSAhPSBudWxsICYmIHRhZ2RpciAhPSBudWxsKSB7CisJCWVyci5qc3BFcnJvcihuLCAianNwLmVycm9yLnRhZ2xpYkRpcmVjdGl2ZS5ib3RoX3VyaV9hbmRfdGFnZGlyIik7CisJICAgIH0KKwl9CisKKwlwdWJsaWMgdm9pZCB2aXNpdChOb2RlLlBhcmFtQWN0aW9uIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgSnNwVXRpbC5jaGVja0F0dHJpYnV0ZXMoIlBhcmFtIGFjdGlvbiIsIG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbUFjdGlvbkF0dHJzLCBlcnIpOworCSAgICAvLyBtYWtlIHN1cmUgdGhlIHZhbHVlIG9mIHRoZSAnbmFtZScgYXR0cmlidXRlIGlzIG5vdCBhCisJICAgIC8vIHJlcXVlc3QtdGltZSBleHByZXNzaW9uCisJICAgIHRocm93RXJyb3JJZkV4cHJlc3Npb24obiwgIm5hbWUiLCAianNwOnBhcmFtIik7CisJICAgIG4uc2V0VmFsdWUoZ2V0SnNwQXR0cmlidXRlKCJ2YWx1ZSIsIG51bGwsIG51bGwsCisJCQkJICAgICAgIG4uZ2V0QXR0cmlidXRlVmFsdWUoInZhbHVlIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLAorCQkJCSAgICAgICBuLCBmYWxzZSkpOworICAgICAgICAgICAgdmlzaXRCb2R5KG4pOworCX0KKworCXB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuUGFyYW1zQWN0aW9uIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCSAgICAvLyBNYWtlIHN1cmUgd2UndmUgZ290IGF0IGxlYXN0IG9uZSBuZXN0ZWQganNwOnBhcmFtCisgICAgICAgICAgICBOb2RlLk5vZGVzIHN1YkVsZW1zID0gbi5nZXRCb2R5KCk7CisgICAgICAgICAgICBpZiAoc3ViRWxlbXMgPT0gbnVsbCkgeworCQllcnIuanNwRXJyb3IobiwgImpzcC5lcnJvci5wYXJhbXMuZW1wdHlCb2R5Iik7CisJICAgIH0KKyAgICAgICAgICAgIHZpc2l0Qm9keShuKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB2aXNpdChOb2RlLkluY2x1ZGVBY3Rpb24gbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBKc3BVdGlsLmNoZWNrQXR0cmlidXRlcygiSW5jbHVkZSBhY3Rpb24iLCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZUFjdGlvbkF0dHJzLCBlcnIpOworCSAgICBuLnNldFBhZ2UoZ2V0SnNwQXR0cmlidXRlKCJwYWdlIiwgbnVsbCwgbnVsbCwKKwkJCQkgICAgICBuLmdldEF0dHJpYnV0ZVZhbHVlKCJwYWdlIiksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBuLCBmYWxzZSkpOworCSAgICB2aXNpdEJvZHkobik7CisgICAgICAgIH07CisKKwlwdWJsaWMgdm9pZCB2aXNpdChOb2RlLkZvcndhcmRBY3Rpb24gbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBKc3BVdGlsLmNoZWNrQXR0cmlidXRlcygiRm9yd2FyZCIsIG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3J3YXJkQWN0aW9uQXR0cnMsIGVycik7CisJICAgIG4uc2V0UGFnZShnZXRKc3BBdHRyaWJ1dGUoInBhZ2UiLCBudWxsLCBudWxsLAorCQkJCSAgICAgIG4uZ2V0QXR0cmlidXRlVmFsdWUoInBhZ2UiKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcuY2xhc3MsIG4sIGZhbHNlKSk7CisJICAgIHZpc2l0Qm9keShuKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB2aXNpdChOb2RlLkdldFByb3BlcnR5IG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgSnNwVXRpbC5jaGVja0F0dHJpYnV0ZXMoIkdldFByb3BlcnR5IiwgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFByb3BlcnR5QXR0cnMsIGVycik7CisJfQorCisJcHVibGljIHZvaWQgdmlzaXQoTm9kZS5TZXRQcm9wZXJ0eSBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIEpzcFV0aWwuY2hlY2tBdHRyaWJ1dGVzKCJTZXRQcm9wZXJ0eSIsIG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRQcm9wZXJ0eUF0dHJzLCBlcnIpOworCSAgICBTdHJpbmcgbmFtZSA9IG4uZ2V0VGV4dEF0dHJpYnV0ZSgibmFtZSIpOworCSAgICBTdHJpbmcgcHJvcGVydHkgPSBuLmdldFRleHRBdHRyaWJ1dGUoInByb3BlcnR5Iik7CisJICAgIFN0cmluZyBwYXJhbSA9IG4uZ2V0VGV4dEF0dHJpYnV0ZSgicGFyYW0iKTsKKwkgICAgU3RyaW5nIHZhbHVlID0gbi5nZXRBdHRyaWJ1dGVWYWx1ZSgidmFsdWUiKTsKKworICAgICAgICAgICAgbi5zZXRWYWx1ZShnZXRKc3BBdHRyaWJ1dGUoInZhbHVlIiwgbnVsbCwgbnVsbCwgdmFsdWUsIAorICAgICAgICAgICAgICAgIGphdmEubGFuZy5PYmplY3QuY2xhc3MsIG4sIGZhbHNlKSk7CisKKyAgICAgICAgICAgIGJvb2xlYW4gdmFsdWVTcGVjaWZpZWQgPSBuLmdldFZhbHVlKCkgIT0gbnVsbDsKKworCSAgICBpZiAoIioiLmVxdWFscyhwcm9wZXJ0eSkpIHsgCisgICAgICAgICAgICAgICAgaWYgKHBhcmFtICE9IG51bGwgfHwgdmFsdWVTcGVjaWZpZWQpCisJCSAgICBlcnIuanNwRXJyb3IobiwgImpzcC5lcnJvci5zZXRQcm9wZXJ0eS5pbnZhbGlkIik7CisJCQorICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbSAhPSBudWxsICYmIHZhbHVlU3BlY2lmaWVkKSB7CisJCWVyci5qc3BFcnJvcihuLCAianNwLmVycm9yLnNldFByb3BlcnR5LmludmFsaWQiKTsKKwkgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICB2aXNpdEJvZHkobik7CisJfQorCisJcHVibGljIHZvaWQgdmlzaXQoTm9kZS5Vc2VCZWFuIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgSnNwVXRpbC5jaGVja0F0dHJpYnV0ZXMoIlVzZUJlYW4iLCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlQmVhbkF0dHJzLCBlcnIpOworCisJICAgIFN0cmluZyBuYW1lID0gbi5nZXRUZXh0QXR0cmlidXRlICgiaWQiKTsKKwkgICAgU3RyaW5nIHNjb3BlID0gbi5nZXRUZXh0QXR0cmlidXRlICgic2NvcGUiKTsKKwkgICAgSnNwVXRpbC5jaGVja1Njb3BlKHNjb3BlLCBuLCBlcnIpOworCSAgICBTdHJpbmcgY2xhc3NOYW1lID0gbi5nZXRUZXh0QXR0cmlidXRlICgiY2xhc3MiKTsKKwkgICAgU3RyaW5nIHR5cGUgPSBuLmdldFRleHRBdHRyaWJ1dGUgKCJ0eXBlIik7CisJICAgIEJlYW5SZXBvc2l0b3J5IGJlYW5JbmZvID0gcGFnZUluZm8uZ2V0QmVhblJlcG9zaXRvcnkoKTsKKworCSAgICBpZiAoY2xhc3NOYW1lID09IG51bGwgJiYgdHlwZSA9PSBudWxsKQorCQllcnIuanNwRXJyb3IobiwgImpzcC5lcnJvci51c2VCZWFuLm1pc3NpbmdUeXBlIik7CisKKwkgICAgaWYgKGJlYW5JbmZvLmNoZWNrVmFyaWFibGUobmFtZSkpCisJCWVyci5qc3BFcnJvcihuLCAianNwLmVycm9yLnVzZUJlYW4uZHVwbGljYXRlIik7CisKKwkgICAgaWYgKCJzZXNzaW9uIi5lcXVhbHMoc2NvcGUpICYmICFwYWdlSW5mby5pc1Nlc3Npb24oKSkKKwkJZXJyLmpzcEVycm9yKG4sICJqc3AuZXJyb3IudXNlQmVhbi5ub1Nlc3Npb24iKTsKKworCSAgICBOb2RlLkpzcEF0dHJpYnV0ZSBqYXR0cgorCQk9IGdldEpzcEF0dHJpYnV0ZSgiYmVhbk5hbWUiLCBudWxsLCBudWxsLAorCQkJCSAgbi5nZXRBdHRyaWJ1dGVWYWx1ZSgiYmVhbk5hbWUiKSwKKwkJCQkgIGphdmEubGFuZy5TdHJpbmcuY2xhc3MsIG4sIGZhbHNlKTsKKwkgICAgbi5zZXRCZWFuTmFtZShqYXR0cik7CisJICAgIGlmIChjbGFzc05hbWUgIT0gbnVsbCAmJiBqYXR0ciAhPSBudWxsKQorCQllcnIuanNwRXJyb3IobiwgImpzcC5lcnJvci51c2VCZWFuLm5vdEJvdGgiKTsKKworCSAgICBpZiAoY2xhc3NOYW1lID09IG51bGwpCisJCWNsYXNzTmFtZSA9IHR5cGU7CisKKwkgICAgYmVhbkluZm8uYWRkQmVhbihuLCBuYW1lLCBjbGFzc05hbWUsIHNjb3BlKTsKKworCSAgICB2aXNpdEJvZHkobik7CisJfQorCisJcHVibGljIHZvaWQgdmlzaXQoTm9kZS5QbHVnSW4gbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBKc3BVdGlsLmNoZWNrQXR0cmlidXRlcygiUGx1Z2luIiwgbiwgcGx1Z0luQXR0cnMsIGVycik7CisKKwkgICAgdGhyb3dFcnJvcklmRXhwcmVzc2lvbihuLCAidHlwZSIsICJqc3A6cGx1Z2luIik7CisJICAgIHRocm93RXJyb3JJZkV4cHJlc3Npb24obiwgImNvZGUiLCAianNwOnBsdWdpbiIpOworCSAgICB0aHJvd0Vycm9ySWZFeHByZXNzaW9uKG4sICJjb2RlYmFzZSIsICJqc3A6cGx1Z2luIik7CisJICAgIHRocm93RXJyb3JJZkV4cHJlc3Npb24obiwgImFsaWduIiwgImpzcDpwbHVnaW4iKTsKKwkgICAgdGhyb3dFcnJvcklmRXhwcmVzc2lvbihuLCAiYXJjaGl2ZSIsICJqc3A6cGx1Z2luIik7CisJICAgIHRocm93RXJyb3JJZkV4cHJlc3Npb24obiwgImhzcGFjZSIsICJqc3A6cGx1Z2luIik7CisJICAgIHRocm93RXJyb3JJZkV4cHJlc3Npb24obiwgImpyZXZlcnNpb24iLCAianNwOnBsdWdpbiIpOworCSAgICB0aHJvd0Vycm9ySWZFeHByZXNzaW9uKG4sICJuYW1lIiwgImpzcDpwbHVnaW4iKTsKKwkgICAgdGhyb3dFcnJvcklmRXhwcmVzc2lvbihuLCAidnNwYWNlIiwgImpzcDpwbHVnaW4iKTsKKwkgICAgdGhyb3dFcnJvcklmRXhwcmVzc2lvbihuLCAibnNwbHVnaW51cmwiLCAianNwOnBsdWdpbiIpOworCSAgICB0aHJvd0Vycm9ySWZFeHByZXNzaW9uKG4sICJpZXBsdWdpbnVybCIsICJqc3A6cGx1Z2luIik7CisKKwkgICAgU3RyaW5nIHR5cGUgPSBuLmdldFRleHRBdHRyaWJ1dGUoInR5cGUiKTsKKwkgICAgaWYgKHR5cGUgPT0gbnVsbCkKKwkJZXJyLmpzcEVycm9yKG4sICJqc3AuZXJyb3IucGx1Z2luLm5vdHlwZSIpOworCSAgICBpZiAoIXR5cGUuZXF1YWxzKCJiZWFuIikgJiYgIXR5cGUuZXF1YWxzKCJhcHBsZXQiKSkKKwkJZXJyLmpzcEVycm9yKG4sICJqc3AuZXJyb3IucGx1Z2luLmJhZHR5cGUiKTsKKwkgICAgaWYgKG4uZ2V0VGV4dEF0dHJpYnV0ZSgiY29kZSIpID09IG51bGwpCisJCWVyci5qc3BFcnJvcihuLCAianNwLmVycm9yLnBsdWdpbi5ub2NvZGUiKTsKKyAgICAgICAgICAgIAorCSAgICBOb2RlLkpzcEF0dHJpYnV0ZSB3aWR0aAorCQk9IGdldEpzcEF0dHJpYnV0ZSgid2lkdGgiLCBudWxsLCBudWxsLAorCQkJCSAgbi5nZXRBdHRyaWJ1dGVWYWx1ZSgid2lkdGgiKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZy5jbGFzcywgbiwgZmFsc2UpOworCSAgICBuLnNldFdpZHRoKCB3aWR0aCApOworICAgICAgICAgICAgCisJICAgIE5vZGUuSnNwQXR0cmlidXRlIGhlaWdodAorCQk9IGdldEpzcEF0dHJpYnV0ZSgiaGVpZ2h0IiwgbnVsbCwgbnVsbCwKKwkJCQkgIG4uZ2V0QXR0cmlidXRlVmFsdWUoImhlaWdodCIpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBuLCBmYWxzZSk7CisJICAgIG4uc2V0SGVpZ2h0KCBoZWlnaHQgKTsKKworCSAgICB2aXNpdEJvZHkobik7CisJfQorCisJcHVibGljIHZvaWQgdmlzaXQoTm9kZS5OYW1lZEF0dHJpYnV0ZSBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwkgICAgSnNwVXRpbC5jaGVja0F0dHJpYnV0ZXMoIkF0dHJpYnV0ZSIsIG4sCisJCQkJICAgIGF0dHJpYnV0ZUF0dHJzLCBlcnIpOworICAgICAgICAgICAgdmlzaXRCb2R5KG4pOworCX0KKyAgICAgICAgCisJcHVibGljIHZvaWQgdmlzaXQoTm9kZS5Kc3BCb2R5IG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworICAgICAgICAgICAgdmlzaXRCb2R5KG4pOworCX0KKyAgICAgICAgCisJcHVibGljIHZvaWQgdmlzaXQoTm9kZS5EZWNsYXJhdGlvbiBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwkgICAgaWYgKHBhZ2VJbmZvLmlzU2NyaXB0aW5nSW52YWxpZCgpKSB7CisJCWVyci5qc3BFcnJvcihuLmdldFN0YXJ0KCksICJqc3AuZXJyb3Iubm8uc2NyaXB0bGV0cyIpOworCSAgICB9CisJfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuRXhwcmVzc2lvbiBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwkgICAgaWYgKHBhZ2VJbmZvLmlzU2NyaXB0aW5nSW52YWxpZCgpKSB7CisJCWVyci5qc3BFcnJvcihuLmdldFN0YXJ0KCksICJqc3AuZXJyb3Iubm8uc2NyaXB0bGV0cyIpOworCSAgICB9CisJfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuU2NyaXB0bGV0IG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCSAgICBpZiAocGFnZUluZm8uaXNTY3JpcHRpbmdJbnZhbGlkKCkpIHsKKwkJZXJyLmpzcEVycm9yKG4uZ2V0U3RhcnQoKSwgImpzcC5lcnJvci5uby5zY3JpcHRsZXRzIik7CisJICAgIH0KKwl9CisKKwlwdWJsaWMgdm9pZCB2aXNpdChOb2RlLkVMRXhwcmVzc2lvbiBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmICggIXBhZ2VJbmZvLmlzRUxJZ25vcmVkKCkgKSB7CisJCVN0cmluZyBleHByZXNzaW9ucyA9ICIkeyIgKyBuZXcgU3RyaW5nKG4uZ2V0VGV4dCgpKSArICJ9IjsKKwkJRUxOb2RlLk5vZGVzIGVsID0gRUxQYXJzZXIucGFyc2UoZXhwcmVzc2lvbnMpOworCQl2YWxpZGF0ZUZ1bmN0aW9ucyhlbCwgbik7CisgICAgICAgICAgICAgICAgSnNwVXRpbC52YWxpZGF0ZUV4cHJlc3Npb25zKAorICAgICAgICAgICAgICAgICAgICBuLmdldFN0YXJ0KCksCisJCSAgICBleHByZXNzaW9ucywKKyAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZy5jbGFzcywgLy8gWFhYIC0gU2hvdWxkIHRlbXBsYXRlIHRleHQgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsd2F5cyBldmFsdWF0ZSB0byBTdHJpbmc/CisgICAgICAgICAgICAgICAgICAgIGdldEZ1bmN0aW9uTWFwcGVyKGVsKSwKKyAgICAgICAgICAgICAgICAgICAgZXJyKTsKKwkJbi5zZXRFTChlbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCXB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuVW5pbnRlcnByZXRlZFRhZyBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChuLmdldE5hbWVkQXR0cmlidXRlTm9kZXMoKS5zaXplKCkgIT0gMCkgeworCQllcnIuanNwRXJyb3IobiwgImpzcC5lcnJvci5uYW1lZEF0dHJpYnV0ZS5pbnZhbGlkVXNlIik7CisgICAgICAgICAgICB9CisKKwkgICAgQXR0cmlidXRlcyBhdHRycyA9IG4uZ2V0QXR0cmlidXRlcygpOworCSAgICBpZiAoYXR0cnMgIT0gbnVsbCkgeworCQlpbnQgYXR0clNpemUgPSBhdHRycy5nZXRMZW5ndGgoKTsKKwkJTm9kZS5Kc3BBdHRyaWJ1dGVbXSBqc3BBdHRycyA9IG5ldyBOb2RlLkpzcEF0dHJpYnV0ZVthdHRyU2l6ZV07CisJCWZvciAoaW50IGk9MDsgaSA8IGF0dHJTaXplOyBpKyspIHsKKwkJICAgIGpzcEF0dHJzW2ldID0gZ2V0SnNwQXR0cmlidXRlKGF0dHJzLmdldFFOYW1lKGkpLAorCQkJCQkJICBhdHRycy5nZXRVUkkoaSksCisJCQkJCQkgIGF0dHJzLmdldExvY2FsTmFtZShpKSwKKwkJCQkJCSAgYXR0cnMuZ2V0VmFsdWUoaSksCisJCQkJCQkgIGphdmEubGFuZy5PYmplY3QuY2xhc3MsCisJCQkJCQkgIG4sCisJCQkJCQkgIGZhbHNlKTsKKwkJfQorCQluLnNldEpzcEF0dHJpYnV0ZXMoanNwQXR0cnMpOworCSAgICB9CisKKwkgICAgdmlzaXRCb2R5KG4pOworICAgICAgICB9CisKKwlwdWJsaWMgdm9pZCB2aXNpdChOb2RlLkN1c3RvbVRhZyBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKworCSAgICBUYWdJbmZvIHRhZ0luZm8gPSBuLmdldFRhZ0luZm8oKTsKKwkgICAgaWYgKHRhZ0luZm8gPT0gbnVsbCkgeworCQllcnIuanNwRXJyb3IobiwgImpzcC5lcnJvci5taXNzaW5nLnRhZ0luZm8iLCBuLmdldFFOYW1lKCkpOworCSAgICB9CisKKwkgICAgLyoKKwkgICAgICogVGhlIGJvZHljb25ldCBvZiBhIFNpbXBsZVRhZyBjYW5ub3QgYmUgSlNQLgorCSAgICAgKi8KKwkgICAgaWYgKG4uaW1wbGVtZW50c1NpbXBsZVRhZygpICYmCisgICAgICAgICAgICAgICAgdGFnSW5mby5nZXRCb2R5Q29udGVudCgpLmVxdWFsc0lnbm9yZUNhc2UoVGFnSW5mby5CT0RZX0NPTlRFTlRfSlNQKSkgeworICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcihuLCAianNwLmVycm9yLnNpbXBsZXRhZy5iYWRib2R5Y29udGVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICB0YWdJbmZvLmdldFRhZ0NsYXNzTmFtZSgpKTsKKwkgICAgfQorCisJICAgIC8qCisJICAgICAqIElmIHRoZSB0YWcgaGFuZGxlciBkZWNsYXJlcyBpbiB0aGUgVExEIHRoYXQgaXQgc3VwcG9ydHMgZHluYW1pYworCSAgICAgKiBhdHRyaWJ1dGVzLCBpdCBhbHNvIG11c3QgaW1wbGVtZW50IHRoZSBEeW5hbWljQXR0cmlidXRlcworCSAgICAgKiBpbnRlcmZhY2UuCisJICAgICAqLworCSAgICBpZiAodGFnSW5mby5oYXNEeW5hbWljQXR0cmlidXRlcygpCisJCSAgICAmJiAhbi5pbXBsZW1lbnRzRHluYW1pY0F0dHJpYnV0ZXMoKSkgeworCQllcnIuanNwRXJyb3IobiwgImpzcC5lcnJvci5keW5hbWljLmF0dHJpYnV0ZXMubm90LmltcGxlbWVudGVkIiwKKwkJCSAgICAgbi5nZXRRTmFtZSgpKTsKKwkgICAgfQorCisJICAgIC8qCisJICAgICAqIE1ha2Ugc3VyZSBhbGwgcmVxdWlyZWQgYXR0cmlidXRlcyBhcmUgcHJlc2VudCwgZWl0aGVyIGFzCisgICAgICAgICAgICAgKiBhdHRyaWJ1dGVzIG9yIG5hbWVkIGF0dHJpYnV0ZXMgKDxqc3A6YXR0cmlidXRlPikuCisgCSAgICAgKiBBbHNvIG1ha2Ugc3VyZSB0aGF0IHRoZSBzYW1lIGF0dHJpYnV0ZSBpcyBub3Qgc3BlY2lmaWVkIGluCisJICAgICAqIGJvdGggYXR0cmlidXRlcyBvciBuYW1lZCBhdHRyaWJ1dGVzLgorCSAgICAgKi8KKwkgICAgVGFnQXR0cmlidXRlSW5mb1tdIHRsZEF0dHJzID0gdGFnSW5mby5nZXRBdHRyaWJ1dGVzKCk7CisJICAgIFN0cmluZyBjdXN0b21BY3Rpb25VcmkgPSBuLmdldFVSSSgpOworCSAgICBBdHRyaWJ1dGVzIGF0dHJzID0gbi5nZXRBdHRyaWJ1dGVzKCk7CisJICAgIGludCBhdHRyc1NpemUgPSAoYXR0cnMgPT0gbnVsbCkgPyAwIDogYXR0cnMuZ2V0TGVuZ3RoKCk7CisJICAgIGZvciAoaW50IGk9MDsgaTx0bGRBdHRycy5sZW5ndGg7IGkrKykgeworCQlTdHJpbmcgYXR0ciA9IG51bGw7CisJCWlmIChhdHRycyAhPSBudWxsKSB7CisJCSAgICBhdHRyID0gYXR0cnMuZ2V0VmFsdWUodGxkQXR0cnNbaV0uZ2V0TmFtZSgpKTsKKwkJICAgIGlmIChhdHRyID09IG51bGwpIHsKKwkJCWF0dHIgPSBhdHRycy5nZXRWYWx1ZShjdXN0b21BY3Rpb25VcmksCisJCQkJCSAgICAgIHRsZEF0dHJzW2ldLmdldE5hbWUoKSk7CisJCSAgICB9CisJCX0KKwkJTm9kZS5OYW1lZEF0dHJpYnV0ZSBuYSA9CisJCQluLmdldE5hbWVkQXR0cmlidXRlTm9kZSh0bGRBdHRyc1tpXS5nZXROYW1lKCkpOworCQkKKwkJaWYgKHRsZEF0dHJzW2ldLmlzUmVxdWlyZWQoKSAmJiBhdHRyID09IG51bGwgJiYgbmEgPT0gbnVsbCkgeworCQkgICAgZXJyLmpzcEVycm9yKG4sICJqc3AuZXJyb3IubWlzc2luZ19hdHRyaWJ1dGUiLAorCQkJCSB0bGRBdHRyc1tpXS5nZXROYW1lKCksIG4uZ2V0TG9jYWxOYW1lKCkpOworCQl9CisJCWlmIChhdHRyICE9IG51bGwgJiYgbmEgIT0gbnVsbCkgeworCQkgICAgZXJyLmpzcEVycm9yKG4sICJqc3AuZXJyb3IuZHVwbGljYXRlLm5hbWUuanNwYXR0cmlidXRlIiwKKwkJCXRsZEF0dHJzW2ldLmdldE5hbWUoKSk7CisJCX0KKwkgICAgfQorCisgICAgICAgICAgICBOb2RlLk5vZGVzIG5hTm9kZXMgPSBuLmdldE5hbWVkQXR0cmlidXRlTm9kZXMoKTsKKwkgICAgaW50IGpzcEF0dHJzU2l6ZSA9IG5hTm9kZXMuc2l6ZSgpICsgYXR0cnNTaXplOworCSAgICBOb2RlLkpzcEF0dHJpYnV0ZVtdIGpzcEF0dHJzID0gbnVsbDsKKwkgICAgaWYgKGpzcEF0dHJzU2l6ZSA+IDApIHsKKwkJanNwQXR0cnMgPSBuZXcgTm9kZS5Kc3BBdHRyaWJ1dGVbanNwQXR0cnNTaXplXTsKKwkgICAgfQorCSAgICBIYXNodGFibGUgdGFnRGF0YUF0dHJzID0gbmV3IEhhc2h0YWJsZShhdHRyc1NpemUpOworCisJICAgIGNoZWNrWG1sQXR0cmlidXRlcyhuLCBqc3BBdHRycywgdGFnRGF0YUF0dHJzKTsKKyAgICAgICAgICAgIGNoZWNrTmFtZWRBdHRyaWJ1dGVzKG4sIGpzcEF0dHJzLCBhdHRyc1NpemUsIHRhZ0RhdGFBdHRycyk7CisKKwkgICAgVGFnRGF0YSB0YWdEYXRhID0gbmV3IFRhZ0RhdGEodGFnRGF0YUF0dHJzKTsKKworCSAgICAvLyBKU1AuQzE6IEl0IGlzIGEgKHRyYW5zbGF0aW9uIHRpbWUpIGVycm9yIGZvciBhbiBhY3Rpb24gdGhhdAorCSAgICAvLyBoYXMgb25lIG9yIG1vcmUgdmFyaWFibGUgc3ViZWxlbWVudHMgdG8gaGF2ZSBhIFRhZ0V4dHJhSW5mbworCSAgICAvLyBjbGFzcyB0aGF0IHJldHVybnMgYSBub24tbnVsbCBvYmplY3QuCisJICAgIFRhZ0V4dHJhSW5mbyB0ZWkgPSB0YWdJbmZvLmdldFRhZ0V4dHJhSW5mbygpOworCSAgICBpZiAodGVpICE9IG51bGwKKwkJICAgICYmIHRlaS5nZXRWYXJpYWJsZUluZm8odGFnRGF0YSkgIT0gbnVsbAorCQkgICAgJiYgdGVpLmdldFZhcmlhYmxlSW5mbyh0YWdEYXRhKS5sZW5ndGggPiAwCisJCSAgICAmJiB0YWdJbmZvLmdldFRhZ1ZhcmlhYmxlSW5mb3MoKS5sZW5ndGggPiAwKSB7CisJCWVyci5qc3BFcnJvcigianNwLmVycm9yLm5vbl9udWxsX3RlaV9hbmRfdmFyX3N1YmVsZW1zIiwKKwkJCSAgICAgbi5nZXRRTmFtZSgpKTsKKwkgICAgfQorCisJICAgIG4uc2V0VGFnRGF0YSh0YWdEYXRhKTsKKwkgICAgbi5zZXRKc3BBdHRyaWJ1dGVzKGpzcEF0dHJzKTsKKworCSAgICB2aXNpdEJvZHkobik7CisJfQorCisJcHVibGljIHZvaWQgdmlzaXQoTm9kZS5Kc3BFbGVtZW50IG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCisJICAgIEF0dHJpYnV0ZXMgYXR0cnMgPSBuLmdldEF0dHJpYnV0ZXMoKTsKKwkgICAgaWYgKGF0dHJzID09IG51bGwpIHsKKwkJZXJyLmpzcEVycm9yKG4sICJqc3AuZXJyb3IuanNwZWxlbWVudC5taXNzaW5nLm5hbWUiKTsKKwkgICAgfQorCSAgICBpbnQgeG1sQXR0ckxlbiA9IGF0dHJzLmdldExlbmd0aCgpOworCisgICAgICAgICAgICBOb2RlLk5vZGVzIG5hbWVkQXR0cnMgPSBuLmdldE5hbWVkQXR0cmlidXRlTm9kZXMoKTsKKworCSAgICAvLyBYTUwtc3R5bGUgJ25hbWUnIGF0dHJpYnV0ZSwgd2hpY2ggaXMgbWFuZGF0b3J5LCBtdXN0IG5vdCBiZQorCSAgICAvLyBpbmNsdWRlZCBpbiBKc3BBdHRyaWJ1dGUgYXJyYXkKKwkgICAgaW50IGpzcEF0dHJTaXplID0geG1sQXR0ckxlbi0xICsgbmFtZWRBdHRycy5zaXplKCk7CisKKwkgICAgTm9kZS5Kc3BBdHRyaWJ1dGVbXSBqc3BBdHRycyA9IG5ldyBOb2RlLkpzcEF0dHJpYnV0ZVtqc3BBdHRyU2l6ZV07CisJICAgIGludCBqc3BBdHRySW5kZXggPSAwOworCisJICAgIC8vIFByb2Nlc3MgWE1MLXN0eWxlIGF0dHJpYnV0ZXMKKwkgICAgZm9yIChpbnQgaT0wOyBpPHhtbEF0dHJMZW47IGkrKykgeworCQlpZiAoIm5hbWUiLmVxdWFscyhhdHRycy5nZXRMb2NhbE5hbWUoaSkpKSB7CisJCSAgICBuLnNldE5hbWVBdHRyaWJ1dGUoZ2V0SnNwQXR0cmlidXRlKGF0dHJzLmdldFFOYW1lKGkpLAorCQkJCQkJICAgICAgIGF0dHJzLmdldFVSSShpKSwKKwkJCQkJCSAgICAgICBhdHRycy5nZXRMb2NhbE5hbWUoaSksCisJCQkJCQkgICAgICAgYXR0cnMuZ2V0VmFsdWUoaSksCisJCQkJCQkgICAgICAgamF2YS5sYW5nLlN0cmluZy5jbGFzcywKKwkJCQkJCSAgICAgICBuLAorCQkJCQkJICAgICAgIGZhbHNlKSk7CisJCX0gZWxzZSB7CisJCSAgICBpZiAoanNwQXR0ckluZGV4PGpzcEF0dHJTaXplKSB7CisJCQlqc3BBdHRyc1tqc3BBdHRySW5kZXgrK10KKwkJCSAgICA9IGdldEpzcEF0dHJpYnV0ZShhdHRycy5nZXRRTmFtZShpKSwKKwkJCQkJICAgICAgYXR0cnMuZ2V0VVJJKGkpLAorCQkJCQkgICAgICBhdHRycy5nZXRMb2NhbE5hbWUoaSksCisJCQkJCSAgICAgIGF0dHJzLmdldFZhbHVlKGkpLAorCQkJCQkgICAgICBqYXZhLmxhbmcuT2JqZWN0LmNsYXNzLAorCQkJCQkgICAgICBuLAorCQkJCQkgICAgICBmYWxzZSk7CisJCSAgICB9CisJCX0KKwkgICAgfQorCSAgICBpZiAobi5nZXROYW1lQXR0cmlidXRlKCkgPT0gbnVsbCkgeworCQllcnIuanNwRXJyb3IobiwgImpzcC5lcnJvci5qc3BlbGVtZW50Lm1pc3NpbmcubmFtZSIpOworCSAgICB9CisKKwkgICAgLy8gUHJvY2VzcyBuYW1lZCBhdHRyaWJ1dGVzCisJICAgIGZvciAoaW50IGk9MDsgaTxuYW1lZEF0dHJzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgTm9kZS5OYW1lZEF0dHJpYnV0ZSBuYSA9IChOb2RlLk5hbWVkQXR0cmlidXRlKSBuYW1lZEF0dHJzLmdldE5vZGUoaSk7CisJCWpzcEF0dHJzW2pzcEF0dHJJbmRleCsrXSA9IG5ldyBOb2RlLkpzcEF0dHJpYnV0ZShuYSwgZmFsc2UpOworCSAgICB9CisKKwkgICAgbi5zZXRKc3BBdHRyaWJ1dGVzKGpzcEF0dHJzKTsKKworCSAgICB2aXNpdEJvZHkobik7CisJfQorCisJcHVibGljIHZvaWQgdmlzaXQoTm9kZS5Kc3BPdXRwdXQgbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBKc3BVdGlsLmNoZWNrQXR0cmlidXRlcygianNwOm91dHB1dCIsIG4sIGpzcE91dHB1dEF0dHJzLCBlcnIpOworCisJICAgIGlmIChuLmdldEJvZHkoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKG4sICJqc3AuZXJyb3IuanNwb3V0cHV0Lm5vbmVtcHR5Ym9keSIpOworCSAgICB9CisKKwkgICAgU3RyaW5nIG9taXRYbWxEZWNsID0gbi5nZXRBdHRyaWJ1dGVWYWx1ZSgib21pdC14bWwtZGVjbGFyYXRpb24iKTsKKwkgICAgU3RyaW5nIGRvY3R5cGVOYW1lID0gbi5nZXRBdHRyaWJ1dGVWYWx1ZSgiZG9jdHlwZS1yb290LWVsZW1lbnQiKTsKKwkgICAgU3RyaW5nIGRvY3R5cGVQdWJsaWMgPSBuLmdldEF0dHJpYnV0ZVZhbHVlKCJkb2N0eXBlLXB1YmxpYyIpOworCSAgICBTdHJpbmcgZG9jdHlwZVN5c3RlbSA9IG4uZ2V0QXR0cmlidXRlVmFsdWUoImRvY3R5cGUtc3lzdGVtIik7CisKKwkgICAgU3RyaW5nIG9taXRYbWxEZWNsT2xkID0gcGFnZUluZm8uZ2V0T21pdFhtbERlY2woKTsKKwkgICAgU3RyaW5nIGRvY3R5cGVOYW1lT2xkID0gcGFnZUluZm8uZ2V0RG9jdHlwZU5hbWUoKTsKKwkgICAgU3RyaW5nIGRvY3R5cGVQdWJsaWNPbGQgPSBwYWdlSW5mby5nZXREb2N0eXBlUHVibGljKCk7CisJICAgIFN0cmluZyBkb2N0eXBlU3lzdGVtT2xkID0gcGFnZUluZm8uZ2V0RG9jdHlwZVN5c3RlbSgpOworCisJICAgIGlmIChvbWl0WG1sRGVjbCAhPSBudWxsICYmIG9taXRYbWxEZWNsT2xkICE9IG51bGwgJiYKKwkJCSFvbWl0WG1sRGVjbC5lcXVhbHMob21pdFhtbERlY2xPbGQpICkgeworICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcihuLCAianNwLmVycm9yLmpzcG91dHB1dC5jb25mbGljdCIsCisJCQkib21pdC14bWwtZGVjbGFyYXRpb24iLCBvbWl0WG1sRGVjbE9sZCwgb21pdFhtbERlY2wpOworCSAgICB9CisKKwkgICAgaWYgKGRvY3R5cGVOYW1lICE9IG51bGwgJiYgZG9jdHlwZU5hbWVPbGQgIT0gbnVsbCAmJgorCQkJIWRvY3R5cGVOYW1lLmVxdWFscyhkb2N0eXBlTmFtZU9sZCkgKSB7CisgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKG4sICJqc3AuZXJyb3IuanNwb3V0cHV0LmNvbmZsaWN0IiwKKwkJCSJkb2N0eXBlLXJvb3QtZWxlbWVudCIsIGRvY3R5cGVOYW1lT2xkLCBkb2N0eXBlTmFtZSk7CisJICAgIH0KKworCSAgICBpZiAoZG9jdHlwZVB1YmxpYyAhPSBudWxsICYmIGRvY3R5cGVQdWJsaWNPbGQgIT0gbnVsbCAmJgorCQkJIWRvY3R5cGVQdWJsaWMuZXF1YWxzKGRvY3R5cGVQdWJsaWNPbGQpICkgeworICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcihuLCAianNwLmVycm9yLmpzcG91dHB1dC5jb25mbGljdCIsCisJCQkiZG9jdHlwZS1wdWJsaWMiLCBkb2N0eXBlUHVibGljT2xkLCBkb2N0eXBlUHVibGljKTsKKwkgICAgfQorCisJICAgIGlmIChkb2N0eXBlU3lzdGVtICE9IG51bGwgJiYgZG9jdHlwZVN5c3RlbU9sZCAhPSBudWxsICYmCisJCQkhZG9jdHlwZVN5c3RlbS5lcXVhbHMoZG9jdHlwZVN5c3RlbU9sZCkgKSB7CisgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKG4sICJqc3AuZXJyb3IuanNwb3V0cHV0LmNvbmZsaWN0IiwKKwkJCSJkb2N0eXBlLXN5c3RlbSIsIGRvY3R5cGVTeXN0ZW1PbGQsIGRvY3R5cGVTeXN0ZW0pOworCSAgICB9CisKKwkgICAgaWYgKGRvY3R5cGVOYW1lID09IG51bGwgJiYgZG9jdHlwZVN5c3RlbSAhPSBudWxsIHx8CisJCWRvY3R5cGVOYW1lICE9IG51bGwgJiYgZG9jdHlwZVN5c3RlbSA9PSBudWxsKSB7CisJCWVyci5qc3BFcnJvcihuLCAianNwLmVycm9yLmpzcG91dHB1dC5kb2N0eXBlbmFtZXN5c3RlbSIpOworCSAgICB9CisKKwkgICAgaWYgKGRvY3R5cGVQdWJsaWMgIT0gbnVsbCAmJiBkb2N0eXBlU3lzdGVtID09IG51bGwpIHsKKwkJZXJyLmpzcEVycm9yKG4sICJqc3AuZXJyb3IuanNwb3V0cHV0LmRvY3R5cGVwdWxpY3N5c3RlbSIpOworCSAgICB9CisKKwkgICAgaWYgKG9taXRYbWxEZWNsICE9IG51bGwpIHsKKwkJcGFnZUluZm8uc2V0T21pdFhtbERlY2wob21pdFhtbERlY2wpOworCSAgICB9CisJICAgIGlmIChkb2N0eXBlTmFtZSAhPSBudWxsKSB7CisJCXBhZ2VJbmZvLnNldERvY3R5cGVOYW1lKGRvY3R5cGVOYW1lKTsKKwkgICAgfQorCSAgICBpZiAoZG9jdHlwZVN5c3RlbSAhPSBudWxsKSB7CisJCXBhZ2VJbmZvLnNldERvY3R5cGVTeXN0ZW0oZG9jdHlwZVN5c3RlbSk7CisJICAgIH0KKwkgICAgaWYgKGRvY3R5cGVQdWJsaWMgIT0gbnVsbCkgeworCQlwYWdlSW5mby5zZXREb2N0eXBlUHVibGljKGRvY3R5cGVQdWJsaWMpOworCSAgICB9CisJfQorCisJcHVibGljIHZvaWQgdmlzaXQoTm9kZS5JbnZva2VBY3Rpb24gbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisKKyAgICAgICAgICAgIEpzcFV0aWwuY2hlY2tBdHRyaWJ1dGVzKCJJbnZva2UiLCBuLCBpbnZva2VBdHRycywgZXJyKTsKKworCSAgICBTdHJpbmcgc2NvcGUgPSBuLmdldFRleHRBdHRyaWJ1dGUgKCJzY29wZSIpOworCSAgICBKc3BVdGlsLmNoZWNrU2NvcGUoc2NvcGUsIG4sIGVycik7CisKKwkgICAgU3RyaW5nIHZhciA9IG4uZ2V0VGV4dEF0dHJpYnV0ZSgidmFyIik7CisJICAgIFN0cmluZyB2YXJSZWFkZXIgPSBuLmdldFRleHRBdHRyaWJ1dGUoInZhclJlYWRlciIpOworCSAgICBpZiAoc2NvcGUgIT0gbnVsbCAmJiB2YXIgPT0gbnVsbCAmJiB2YXJSZWFkZXIgPT0gbnVsbCkgeworCQllcnIuanNwRXJyb3IobiwgImpzcC5lcnJvci5taXNzaW5nX3Zhcl9vcl92YXJSZWFkZXIiKTsKKwkgICAgfQorCSAgICBpZiAodmFyICE9IG51bGwgJiYgdmFyUmVhZGVyICE9IG51bGwpIHsKKwkJZXJyLmpzcEVycm9yKG4sICJqc3AuZXJyb3IudmFyX2FuZF92YXJSZWFkZXIiKTsKKwkgICAgfQorCX0KKworCXB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuRG9Cb2R5QWN0aW9uIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCisgICAgICAgICAgICBKc3BVdGlsLmNoZWNrQXR0cmlidXRlcygiRG9Cb2R5IiwgbiwgZG9Cb2R5QXR0cnMsIGVycik7CisKKwkgICAgU3RyaW5nIHNjb3BlID0gbi5nZXRUZXh0QXR0cmlidXRlICgic2NvcGUiKTsKKwkgICAgSnNwVXRpbC5jaGVja1Njb3BlKHNjb3BlLCBuLCBlcnIpOworCisJICAgIFN0cmluZyB2YXIgPSBuLmdldFRleHRBdHRyaWJ1dGUoInZhciIpOworCSAgICBTdHJpbmcgdmFyUmVhZGVyID0gbi5nZXRUZXh0QXR0cmlidXRlKCJ2YXJSZWFkZXIiKTsKKwkgICAgaWYgKHNjb3BlICE9IG51bGwgJiYgdmFyID09IG51bGwgJiYgdmFyUmVhZGVyID09IG51bGwpIHsKKwkJZXJyLmpzcEVycm9yKG4sICJqc3AuZXJyb3IubWlzc2luZ192YXJfb3JfdmFyUmVhZGVyIik7CisJICAgIH0KKwkgICAgaWYgKHZhciAhPSBudWxsICYmIHZhclJlYWRlciAhPSBudWxsKSB7CisJCWVyci5qc3BFcnJvcihuLCAianNwLmVycm9yLnZhcl9hbmRfdmFyUmVhZGVyIik7CisJICAgIH0KKwl9CisKKwkvKgorCSAqIE1ha2Ugc3VyZSB0aGUgZ2l2ZW4gY3VzdG9tIGFjdGlvbiBkb2VzIG5vdCBoYXZlIGFueSBpbnZhbGlkCisJICogYXR0cmlidXRlcy4KKwkgKgorCSAqIEEgY3VzdG9tIGFjdGlvbiBhbmQgaXRzIGRlY2xhcmVkIGF0dHJpYnV0ZXMgYWx3YXlzIGJlbG9uZyB0byB0aGUKKwkgKiBzYW1lIG5hbWVzcGFjZSwgd2hpY2ggaXMgaWRlbnRpZmllZCBieSB0aGUgcHJlZml4IG5hbWUgb2YgdGhlCisJICogY3VzdG9tIHRhZyBpbnZvY2F0aW9uLiBGb3IgZXhhbXBsZSwgaW4gdGhpcyBpbnZvY2F0aW9uOgorCSAqCisJICogICAgIDxteTp0ZXN0IGE9IjEiIGI9IjIiIGM9IjMiLz4sIHRoZSBhY3Rpb24KKwkgKgorCSAqICJ0ZXN0IiBhbmQgaXRzIGF0dHJpYnV0ZXMgImEiLCAiYiIsIGFuZCAiYyIgYWxsIGJlbG9uZyB0byB0aGUKKwkgKiBuYW1lc3BhY2UgaWRlbnRpZmllZCBieSB0aGUgcHJlZml4ICJteSIuIFRoZSBhYm92ZSBpbnZvY2F0aW9uIHdvdWxkCisJICogYmUgZXF1aXZhbGVudCB0bzoKKwkgKgorCSAqICAgICA8bXk6dGVzdCBteTphPSIxIiBteTpiPSIyIiBteTpjPSIzIi8+CisJICoKKwkgKiBBbiBhY3Rpb24gYXR0cmlidXRlIG1heSBoYXZlIGEgcHJlZml4IGRpZmZlcmVudCBmcm9tIHRoYXQgb2YgdGhlCisJICogYWN0aW9uIGludm9jYXRpb24gb25seSBpZiB0aGUgdW5kZXJseWluZyB0YWcgaGFuZGxlciBzdXBwb3J0cworCSAqIGR5bmFtaWMgYXR0cmlidXRlcywgaW4gd2hpY2ggY2FzZSB0aGUgYXR0cmlidXRlIHdpdGggdGhlIGRpZmZlcmVudAorCSAqIHByZWZpeCBpcyBjb25zaWRlcmVkIGEgZHluYW1pYyBhdHRyaWJ1dGUuCisJICovCisJcHJpdmF0ZSB2b2lkIGNoZWNrWG1sQXR0cmlidXRlcyhOb2RlLkN1c3RvbVRhZyBuLAorCQkJCQlOb2RlLkpzcEF0dHJpYnV0ZVtdIGpzcEF0dHJzLAorCQkJCQlIYXNodGFibGUgdGFnRGF0YUF0dHJzKQorCSAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisKKwkgICAgVGFnSW5mbyB0YWdJbmZvID0gbi5nZXRUYWdJbmZvKCk7CisJICAgIGlmICh0YWdJbmZvID09IG51bGwpIHsKKwkJZXJyLmpzcEVycm9yKG4sICJqc3AuZXJyb3IubWlzc2luZy50YWdJbmZvIiwgbi5nZXRRTmFtZSgpKTsKKwkgICAgfQorCSAgICBUYWdBdHRyaWJ1dGVJbmZvW10gdGxkQXR0cnMgPSB0YWdJbmZvLmdldEF0dHJpYnV0ZXMoKTsKKwkgICAgQXR0cmlidXRlcyBhdHRycyA9IG4uZ2V0QXR0cmlidXRlcygpOworCisJICAgIGZvciAoaW50IGk9MDsgYXR0cnMgIT0gbnVsbCAmJiBpPGF0dHJzLmdldExlbmd0aCgpOyBpKyspIHsKKwkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOworCQlmb3IgKGludCBqPTA7IHRsZEF0dHJzICE9IG51bGwgJiYgajx0bGRBdHRycy5sZW5ndGg7IGorKykgeworCQkgICAgaWYgKGF0dHJzLmdldExvY2FsTmFtZShpKS5lcXVhbHModGxkQXR0cnNbal0uZ2V0TmFtZSgpKQorCQkJICAgICYmIChhdHRycy5nZXRVUkkoaSkgPT0gbnVsbAorCQkJCXx8IGF0dHJzLmdldFVSSShpKS5sZW5ndGgoKSA9PSAwCisJCQkJfHwgYXR0cnMuZ2V0VVJJKGkpLmVxdWFscyhuLmdldFVSSSgpKSkpIHsKKwkJCWlmICh0bGRBdHRyc1tqXS5jYW5CZVJlcXVlc3RUaW1lKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyBleHBlY3RlZFR5cGUgPSBTdHJpbmcuY2xhc3M7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHR5cGVTdHIgPSB0bGRBdHRyc1tqXS5nZXRUeXBlTmFtZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggdGxkQXR0cnNbal0uaXNGcmFnbWVudCgpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRUeXBlID0gSnNwRnJhZ21lbnQuY2xhc3M7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggdHlwZVN0ciAhPSBudWxsICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRUeXBlID0gSnNwVXRpbC50b0NsYXNzKHR5cGVTdHIsCisJCQkJCQkJCSAgIGxvYWRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganNwQXR0cnNbaV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gZ2V0SnNwQXR0cmlidXRlKGF0dHJzLmdldFFOYW1lKGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnMuZ2V0VVJJKGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnMuZ2V0TG9jYWxOYW1lKGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnMuZ2V0VmFsdWUoaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIuanNwRXJyb3IobiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAianNwLmVycm9yLnVua25vd25fYXR0cmlidXRlX3R5cGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGxkQXR0cnNbal0uZ2V0TmFtZSgpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRsZEF0dHJzW2pdLmdldFR5cGVOYW1lKCkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisJCQl9IGVsc2UgeworCQkJICAgIC8vIEF0dHJpYnV0ZSBkb2VzIG5vdCBhY2NlcHQgYW55IGV4cHJlc3Npb25zLgorCQkJICAgIC8vIE1ha2Ugc3VyZSBpdHMgdmFsdWUgZG9lcyBub3QgY29udGFpbiBhbnkuCisJCQkgICAgaWYgKGlzRXhwcmVzc2lvbihuLCBhdHRycy5nZXRWYWx1ZShpKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKG4sCisJCQkJICAgICAgICAianNwLmVycm9yLmF0dHJpYnV0ZS5jdXN0b20ubm9uX3J0X3dpdGhfZXhwciIsCisJCQkJCSAgICAgdGxkQXR0cnNbal0uZ2V0TmFtZSgpKTsKKwkJCSAgICB9CisJCQkgICAganNwQXR0cnNbaV0KKwkJCQk9IG5ldyBOb2RlLkpzcEF0dHJpYnV0ZShhdHRycy5nZXRRTmFtZShpKSwKKwkJCQkJCQlhdHRycy5nZXRVUkkoaSksCisJCQkJCQkJYXR0cnMuZ2V0TG9jYWxOYW1lKGkpLAorCQkJCQkJCWF0dHJzLmdldFZhbHVlKGkpLAorCQkJCQkJCWZhbHNlLAorCQkJCQkJCW51bGwsCisJCQkJCQkJZmFsc2UpOworCQkJfQorCQkJaWYgKGpzcEF0dHJzW2ldLmlzRXhwcmVzc2lvbigpKSB7CisJCQkgICAgdGFnRGF0YUF0dHJzLnB1dChhdHRycy5nZXRRTmFtZShpKSwKKwkJCQkJICAgICBUYWdEYXRhLlJFUVVFU1RfVElNRV9WQUxVRSk7CisJCQl9IGVsc2UgeworCQkJICAgIHRhZ0RhdGFBdHRycy5wdXQoYXR0cnMuZ2V0UU5hbWUoaSksCisJCQkJCSAgICAgYXR0cnMuZ2V0VmFsdWUoaSkpOworCQkJfQorCQkJZm91bmQgPSB0cnVlOworCQkJYnJlYWs7CisJCSAgICB9CisJCX0KKwkJaWYgKCFmb3VuZCkgeworCQkgICAgaWYgKHRhZ0luZm8uaGFzRHluYW1pY0F0dHJpYnV0ZXMoKSkgeworCQkJanNwQXR0cnNbaV0gPSBnZXRKc3BBdHRyaWJ1dGUoYXR0cnMuZ2V0UU5hbWUoaSksCisJCQkJCQkgICAgICBhdHRycy5nZXRVUkkoaSksCisJCQkJCQkgICAgICBhdHRycy5nZXRMb2NhbE5hbWUoaSksCisJCQkJCQkgICAgICBhdHRycy5nZXRWYWx1ZShpKSwKKwkJCQkJCSAgICAgIGphdmEubGFuZy5PYmplY3QuY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLAorCQkJCQkJICAgICAgdHJ1ZSk7CisJCSAgICB9IGVsc2UgeworCQkJZXJyLmpzcEVycm9yKG4sICJqc3AuZXJyb3IuYmFkX2F0dHJpYnV0ZSIsCisJCQkJICAgICBhdHRycy5nZXRRTmFtZShpKSwgbi5nZXRMb2NhbE5hbWUoKSk7CisJCSAgICB9CisJCX0KKwkgICAgfQorCX0KKworCS8qCisJICogTWFrZSBzdXJlIHRoZSBnaXZlbiBjdXN0b20gYWN0aW9uIGRvZXMgbm90IGhhdmUgYW55IGludmFsaWQgbmFtZWQKKwkgKiBhdHRyaWJ1dGVzCisJICovCisJcHJpdmF0ZSB2b2lkIGNoZWNrTmFtZWRBdHRyaWJ1dGVzKE5vZGUuQ3VzdG9tVGFnIG4sCisJCQkJCSAgTm9kZS5Kc3BBdHRyaWJ1dGVbXSBqc3BBdHRycywKKwkJCQkJICBpbnQgc3RhcnQsCisJCQkJCSAgSGFzaHRhYmxlIHRhZ0RhdGFBdHRycykKKwkgICAgICAgIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCisJICAgIFRhZ0luZm8gdGFnSW5mbyA9IG4uZ2V0VGFnSW5mbygpOworCSAgICBpZiAodGFnSW5mbyA9PSBudWxsKSB7CisJCWVyci5qc3BFcnJvcihuLCAianNwLmVycm9yLm1pc3NpbmcudGFnSW5mbyIsIG4uZ2V0UU5hbWUoKSk7CisJICAgIH0KKwkgICAgVGFnQXR0cmlidXRlSW5mb1tdIHRsZEF0dHJzID0gdGFnSW5mby5nZXRBdHRyaWJ1dGVzKCk7CisgICAgICAgICAgICBOb2RlLk5vZGVzIG5hTm9kZXMgPSBuLmdldE5hbWVkQXR0cmlidXRlTm9kZXMoKTsKKworCSAgICBmb3IgKGludCBpPTA7IGk8bmFOb2Rlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIE5vZGUuTmFtZWRBdHRyaWJ1dGUgbmEgPSAoTm9kZS5OYW1lZEF0dHJpYnV0ZSkKKwkJICAgIG5hTm9kZXMuZ2V0Tm9kZShpKTsKKwkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOworCQlmb3IgKGludCBqPTA7IGo8dGxkQXR0cnMubGVuZ3RoOyBqKyspIHsKKwkJICAgIC8qCisJCSAgICAgKiBTZWUgYWJvdmUgY29tbWVudCBhYm91dCBuYW1lc3BhY2UgbWF0Y2hlcy4gRm9yIG5hbWVkCisJCSAgICAgKiBhdHRyaWJ1dGVzLCB3ZSB1c2UgdGhlIHByZWZpeCBpbnN0ZWFkIG9mIFVSSSBhcyB0aGUKKwkJICAgICAqIG1hdGNoIGNyaXRlcmlvbiwgYmVjYXVzZSBpbiB0aGUgY2FzZSBvZiBhIEpTUCBkb2N1bWVudCwKKwkJICAgICAqIHdlJ2QgaGF2ZSB0byBrZWVwIHRyYWNrIG9mIHdoaWNoIG5hbWVzcGFjZXMgYXJlIGluIHNjb3BlCisJCSAgICAgKiB3aGVuIHBhcnNpbmcgYSBuYW1lZCBhdHRyaWJ1dGUsIGluIG9yZGVyIHRvIGRldGVybWluZQorCQkgICAgICogdGhlIFVSSSB0aGF0IHRoZSBwcmVmaXggb2YgdGhlIG5hbWVkIGF0dHJpYnV0ZSdzIG5hbWUKKwkJICAgICAqIG1hdGNoZXMgdG8uCisJCSAgICAgKi8KKwkJICAgIFN0cmluZyBhdHRyUHJlZml4ID0gbmEuZ2V0UHJlZml4KCk7CisJCSAgICBpZiAobmEuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKHRsZEF0dHJzW2pdLmdldE5hbWUoKSkKKwkJCSAgICAmJiAoYXR0clByZWZpeCA9PSBudWxsIHx8IGF0dHJQcmVmaXgubGVuZ3RoKCkgPT0gMAorCQkJCXx8IGF0dHJQcmVmaXguZXF1YWxzKG4uZ2V0UHJlZml4KCkpKSkgeworCQkJanNwQXR0cnNbc3RhcnQgKyBpXSA9IG5ldyBOb2RlLkpzcEF0dHJpYnV0ZShuYSwgZmFsc2UpOworCQkJTmFtZWRBdHRyaWJ1dGVWaXNpdG9yIG5hdiA9IG51bGw7CisJCQlpZiAobmEuZ2V0Qm9keSgpICE9IG51bGwpIHsKKwkJCSAgICBuYXYgPSBuZXcgTmFtZWRBdHRyaWJ1dGVWaXNpdG9yKCk7CisJCQkgICAgbmEuZ2V0Qm9keSgpLnZpc2l0KG5hdik7CisJCQl9CisJCQlpZiAobmF2ICE9IG51bGwgJiYgbmF2Lmhhc0R5bmFtaWNDb250ZW50KCkpIHsKKwkJCSAgICB0YWdEYXRhQXR0cnMucHV0KG5hLmdldE5hbWUoKSwKKwkJCQkJICAgICBUYWdEYXRhLlJFUVVFU1RfVElNRV9WQUxVRSk7CisJCQl9IGVsc2UgeworCQkJICAgIHRhZ0RhdGFBdHRycy5wdXQobmEuZ2V0TmFtZSgpLCBuYS5nZXRUZXh0KCkpOyAgICAKKwkJCX0KKwkJCWZvdW5kID0gdHJ1ZTsKKwkJCWJyZWFrOworCQkgICAgfQorCQl9CisJCWlmICghZm91bmQpIHsKKwkJICAgIGlmICh0YWdJbmZvLmhhc0R5bmFtaWNBdHRyaWJ1dGVzKCkpIHsKKwkJCWpzcEF0dHJzW3N0YXJ0ICsgaV0gPSBuZXcgTm9kZS5Kc3BBdHRyaWJ1dGUobmEsIHRydWUpOworCQkgICAgfSBlbHNlIHsKKwkJCWVyci5qc3BFcnJvcihuLCAianNwLmVycm9yLmJhZF9hdHRyaWJ1dGUiLAorCQkJCSAgICAgbmEuZ2V0TmFtZSgpLCBuLmdldExvY2FsTmFtZSgpKTsKKwkJICAgIH0KKwkJfQorCSAgICB9CisJfQorCisJLyoqCisJICogUHJlcHJvY2VzcyBhdHRyaWJ1dGVzIHRoYXQgY2FuIGJlIGV4cHJlc3Npb25zLiAgRXhwcmVzc2lvbgorCSAqIGRlbGltaXRlcnMgYXJlIHN0cmlwcGVkLgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogSWYgdmFsdWUgaXMgbnVsbCwgY2hlY2tzIGlmIHRoZXJlIGFyZSBhbnkKKyAgICAgICAgICogTmFtZWRBdHRyaWJ1dGUgc3ViZWxlbWVudHMgaW4gdGhlIHRyZWUgbm9kZSwgYW5kIGlmIHNvLAorICAgICAgICAgKiBjb25zdHJ1Y3RzIGEgSnNwQXR0cmlidXRlIG91dCBvZiBhIGNoaWxkIE5hbWVkQXR0cmlidXRlIG5vZGUuCisJICovCisJcHJpdmF0ZSBOb2RlLkpzcEF0dHJpYnV0ZSBnZXRKc3BBdHRyaWJ1dGUoU3RyaW5nIHFOYW1lLAorCQkJCQkJICBTdHJpbmcgdXJpLAorCQkJCQkJICBTdHJpbmcgbG9jYWxOYW1lLAorCQkJCQkJICBTdHJpbmcgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzIGV4cGVjdGVkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9kZSBuLAorCQkJCQkJICBib29sZWFuIGR5bmFtaWMpCisgICAgICAgICAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisKKyAgICAgICAgICAgIE5vZGUuSnNwQXR0cmlidXRlIHJlc3VsdCA9IG51bGw7CisKKwkgICAgLy8gWFhYIElzIGl0IGFuIGVycm9yIHRvIHNlZSAiJT1mb28lIiBpbiBub24tWG1sIHBhZ2U/CisJICAgIC8vIChXZSB3b24ndCBzZWUgIjwlPWZvbyU+IGluIHhtbCBwYWdlIGJlY2F1c2UgJzwnIGlzIG5vdCBhCisJICAgIC8vIHZhbGlkIGF0dHJpYnV0ZSB2YWx1ZSBpbiB4bWwpLgorCisgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChuLmdldFJvb3QoKS5pc1htbFN5bnRheCgpICYmIHZhbHVlLnN0YXJ0c1dpdGgoIiU9IikpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IE5vZGUuSnNwQXR0cmlidXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFOYW1lLAorCQkJCQl1cmksCisJCQkJCWxvY2FsTmFtZSwKKwkJCQkJdmFsdWUuc3Vic3RyaW5nKDIsIHZhbHVlLmxlbmd0aCgpLTEpLAorCQkJCQl0cnVlLAorCQkJCQludWxsLAorCQkJCQlkeW5hbWljKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZighbi5nZXRSb290KCkuaXNYbWxTeW50YXgoKSAmJiB2YWx1ZS5zdGFydHNXaXRoKCI8JT0iKSkgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgTm9kZS5Kc3BBdHRyaWJ1dGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcU5hbWUsCisJCQkJCXVyaSwKKwkJCQkJbG9jYWxOYW1lLAorCQkJCQl2YWx1ZS5zdWJzdHJpbmcoMywgdmFsdWUubGVuZ3RoKCktMiksCisJCQkJCXRydWUsCisJCQkJCW51bGwsCisJCQkJCWR5bmFtaWMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGF0dHJpYnV0ZSBjYW4gY29udGFpbiBleHByZXNzaW9ucyBidXQgaXMgbm90IGEKKyAgICAgICAgICAgICAgICAgICAgLy8gc2NyaXB0bGV0IGV4cHJlc3Npb247IHRodXMsIHdlIHdhbnQgdG8gcnVuIGl0IHRocm91Z2ggCisgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBleHByZXNzaW9uIGludGVycHJldGVyCisKKyAgICAgICAgICAgICAgICAgICAgLy8gdmFsaWRhdGUgZXhwcmVzc2lvbiBzeW50YXggaWYgc3RyaW5nIGNvbnRhaW5zCisgICAgICAgICAgICAgICAgICAgIC8vIGV4cHJlc3Npb24ocykKKyAgICAgICAgICAgICAgICAgICAgRUxOb2RlLk5vZGVzIGVsID0gRUxQYXJzZXIucGFyc2UodmFsdWUpOworICAgICAgICAgICAgICAgICAgICBpZiAoZWwuY29udGFpbnNFTCgpICYmICFwYWdlSW5mby5pc0VMSWdub3JlZCgpKSB7CisJICAgICAgICAgICAgICAgIHZhbGlkYXRlRnVuY3Rpb25zKGVsLCBuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEpzcFV0aWwudmFsaWRhdGVFeHByZXNzaW9ucygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLmdldFN0YXJ0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkVHlwZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RnVuY3Rpb25NYXBwZXIoZWwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXJyKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgTm9kZS5Kc3BBdHRyaWJ1dGUocU5hbWUsIHVyaSwgbG9jYWxOYW1lLAorCQkJCQkJICAgICAgIHZhbHVlLCBmYWxzZSwgZWwsCisJCQkJCQkgICAgICAgZHluYW1pYyk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisJCQl2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoQ29uc3RhbnRzLkVTQywgJyQnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBOb2RlLkpzcEF0dHJpYnV0ZShxTmFtZSwgdXJpLCBsb2NhbE5hbWUsCisJCQkJCQkgICAgICAgdmFsdWUsIGZhbHNlLCBudWxsLAorCQkJCQkJICAgICAgIGR5bmFtaWMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gVmFsdWUgaXMgbnVsbC4gIENoZWNrIGZvciBhbnkgTmFtZWRBdHRyaWJ1dGUgc3Vibm9kZXMKKyAgICAgICAgICAgICAgICAvLyB0aGF0IG1pZ2h0IGNvbnRhaW4gdGhlIHZhbHVlIGZvciB0aGlzIGF0dHJpYnV0ZS4KKyAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIHRoZSBhdHRyaWJ1dGUgd2Fzbid0IGZvdW5kIHNvIHdlIHJldHVybiBudWxsLgorCisgICAgICAgICAgICAgICAgTm9kZS5OYW1lZEF0dHJpYnV0ZSBuYW1lZEF0dHJpYnV0ZU5vZGUgPQorICAgICAgICAgICAgICAgICAgICBuLmdldE5hbWVkQXR0cmlidXRlTm9kZSggcU5hbWUgKTsKKyAgICAgICAgICAgICAgICBpZiggbmFtZWRBdHRyaWJ1dGVOb2RlICE9IG51bGwgKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBOb2RlLkpzcEF0dHJpYnV0ZShuYW1lZEF0dHJpYnV0ZU5vZGUsCisJCQkJCQkgICBkeW5hbWljKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKworCS8qCisJICogQ2hlY2tzIHRvIHNlZSBpZiB0aGUgZ2l2ZW4gYXR0cmlidXRlIHZhbHVlIHJlcHJlc2VudHMgYSBydW50aW1lIG9yCisJICogRUwgZXhwcmVzc2lvbi4KKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gaXNFeHByZXNzaW9uKE5vZGUgbiwgU3RyaW5nIHZhbHVlKSB7CisJICAgIGlmICgobi5nZXRSb290KCkuaXNYbWxTeW50YXgoKSAmJiB2YWx1ZS5zdGFydHNXaXRoKCIlPSIpKQorCQkgICAgfHwgKCFuLmdldFJvb3QoKS5pc1htbFN5bnRheCgpICYmIHZhbHVlLnN0YXJ0c1dpdGgoIjwlPSIpKQorICAgCQkgICAgfHwgKHZhbHVlLmluZGV4T2YoIiR7IikgIT0gLTEgJiYgIXBhZ2VJbmZvLmlzRUxJZ25vcmVkKCkpKQorCQlyZXR1cm4gdHJ1ZTsKKwkgICAgZWxzZQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoKKwkgKiBUaHJvd3MgZXhjZXB0aW9uIGlmIHRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlIHdpdGggdGhlIGdpdmVuCisJICogbmFtZSBpbiB0aGUgZ2l2ZW4gbm9kZSBpcyBnaXZlbiBhcyBhbiBSVCBvciBFTCBleHByZXNzaW9uLCBidXQgdGhlCisJICogc3BlYyByZXF1aXJlcyBhIHN0YXRpYyB2YWx1ZS4KKwkgKi8KKwlwcml2YXRlIHZvaWQgdGhyb3dFcnJvcklmRXhwcmVzc2lvbihOb2RlIG4sIFN0cmluZyBhdHRyTmFtZSwKKwkJCQkJICAgIFN0cmluZyBhY3Rpb25OYW1lKQorCSAgICAgICAgICAgIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCSAgICBpZiAobi5nZXRBdHRyaWJ1dGVzKCkgIT0gbnVsbAorCQkgICAgJiYgbi5nZXRBdHRyaWJ1dGVzKCkuZ2V0VmFsdWUoYXR0ck5hbWUpICE9IG51bGwKKwkJICAgICYmIGlzRXhwcmVzc2lvbihuLCBuLmdldEF0dHJpYnV0ZXMoKS5nZXRWYWx1ZShhdHRyTmFtZSkpKSB7CisJCWVyci5qc3BFcnJvcihuLAorCQkJICAgICAianNwLmVycm9yLmF0dHJpYnV0ZS5zdGFuZGFyZC5ub25fcnRfd2l0aF9leHByIiwKKwkJCSAgICAgYXR0ck5hbWUsIGFjdGlvbk5hbWUpOworCSAgICB9CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTmFtZWRBdHRyaWJ1dGVWaXNpdG9yIGV4dGVuZHMgTm9kZS5WaXNpdG9yIHsKKwkgICAgcHJpdmF0ZSBib29sZWFuIGhhc0R5bmFtaWNDb250ZW50OworCisJICAgIHB1YmxpYyB2b2lkIGRvVmlzaXQoTm9kZSBuKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwkJaWYgKCEobiBpbnN0YW5jZW9mIE5vZGUuSnNwVGV4dCkKKwkJICAgICAgICAmJiAhKG4gaW5zdGFuY2VvZiBOb2RlLlRlbXBsYXRlVGV4dCkpIHsKKwkJICAgIGhhc0R5bmFtaWNDb250ZW50ID0gdHJ1ZTsKKwkJfQorCQl2aXNpdEJvZHkobik7CisJICAgIH0KKwkgICAgCisJICAgIHB1YmxpYyBib29sZWFuIGhhc0R5bmFtaWNDb250ZW50KCkgeworCQlyZXR1cm4gaGFzRHluYW1pY0NvbnRlbnQ7CisJICAgIH0KKwl9CisKKwlwcml2YXRlIFN0cmluZyBmaW5kVXJpKFN0cmluZyBwcmVmaXgsIE5vZGUgbikgeworCisJICAgIGZvciAoTm9kZSBwID0gbjsgcCAhPSBudWxsOyBwID0gcC5nZXRQYXJlbnQoKSkgeworCQlBdHRyaWJ1dGVzIGF0dHJzID0gcC5nZXRUYWdsaWJBdHRyaWJ1dGVzKCk7CisJCWlmIChhdHRycyA9PSBudWxsKSB7CisJCSAgICBjb250aW51ZTsKKwkJfQorCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJzLmdldExlbmd0aCgpOyBpKyspIHsKKwkJICAgIFN0cmluZyBuYW1lID0gYXR0cnMuZ2V0UU5hbWUoaSk7CisJCSAgICBpbnQgayA9IG5hbWUuaW5kZXhPZignOicpOworCQkgICAgaWYgKHByZWZpeCA9PSBudWxsICYmIGsgPCAwKSB7CisJCQkvLyBwcmVmaXggbm90IHNwZWNpZmllZCBhbmQgYSBkZWZhdWx0IG5zIGZvdW5kCisJCQlyZXR1cm4gYXR0cnMuZ2V0VmFsdWUoaSk7CisJCSAgICB9ICAgCisJCSAgICBpZiAocHJlZml4ICE9IG51bGwgJiYgayA+PSAwICYmCisJCQkJcHJlZml4LmVxdWFscyhuYW1lLnN1YnN0cmluZyhrKzEpKSkgeworCQkJcmV0dXJuIGF0dHJzLmdldFZhbHVlKGkpOworCQkgICAgfQorCQl9CisJICAgIH0KKwkgICAgcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogVmFsaWRhdGUgZnVuY3Rpb25zIGluIEVMIGV4cHJlc3Npb25zCisJICovCisJcHJpdmF0ZSB2b2lkIHZhbGlkYXRlRnVuY3Rpb25zKEVMTm9kZS5Ob2RlcyBlbCwgTm9kZSBuKSAKKwkJdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisKKwkgICAgY2xhc3MgRlZWaXNpdG9yIGV4dGVuZHMgRUxOb2RlLlZpc2l0b3IgeworCisJCU5vZGUgbjsKKworCQlGVlZpc2l0b3IoTm9kZSBuKSB7CisJCSAgICB0aGlzLm4gPSBuOworCQl9CisKKwkJcHVibGljIHZvaWQgdmlzaXQoRUxOb2RlLkZ1bmN0aW9uIGZ1bmMpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCQkgICAgU3RyaW5nIHByZWZpeCA9IGZ1bmMuZ2V0UHJlZml4KCk7CisJCSAgICBTdHJpbmcgZnVuY3Rpb24gPSBmdW5jLmdldE5hbWUoKTsKKwkJICAgIFN0cmluZyB1cmkgPSBudWxsOworCisJCSAgICBpZiAobi5nZXRSb290KCkuaXNYbWxTeW50YXgoKSkgeworCQkgICAgICAgIHVyaSA9IGZpbmRVcmkocHJlZml4LCBuKTsKKwkJICAgIH0gZWxzZSBpZiAocHJlZml4ICE9IG51bGwpIHsKKwkJCXVyaSA9IHBhZ2VJbmZvLmdldFVSSShwcmVmaXgpOworCQkgICAgfQorCisJCSAgICBpZiAodXJpID09IG51bGwpIHsKKwkJCWlmIChwcmVmaXggPT0gbnVsbCkgeworCQkJICAgIGVyci5qc3BFcnJvcihuLCAianNwLmVycm9yLm5vRnVuY3Rpb25QcmVmaXgiLAorCQkJCWZ1bmN0aW9uKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJICAgIGVyci5qc3BFcnJvcihuLAorCQkJCSJqc3AuZXJyb3IuYXR0cmlidXRlLmludmFsaWRQcmVmaXgiLCBwcmVmaXgpOworCQkJfQorCQkgICAgfQorCQkgICAgVGFnTGlicmFyeUluZm8gdGFnbGliID0gcGFnZUluZm8uZ2V0VGFnbGliKHVyaSk7CisJCSAgICBGdW5jdGlvbkluZm8gZnVuY0luZm8gPSBudWxsOworCQkgICAgaWYgKHRhZ2xpYiAhPSBudWxsKSB7CisJCQlmdW5jSW5mbyA9IHRhZ2xpYi5nZXRGdW5jdGlvbihmdW5jdGlvbik7CisJCSAgICB9CisJCSAgICBpZiAoZnVuY0luZm8gPT0gbnVsbCkgeworCQkJZXJyLmpzcEVycm9yKG4sICJqc3AuZXJyb3Iubm9GdW5jdGlvbiIsIGZ1bmN0aW9uKTsKKwkJICAgIH0KKwkJICAgIC8vIFNraXAgVExEIGZ1bmN0aW9uIHVuaXF1ZW5lc3MgY2hlY2suICBEb25lIGJ5IFNjaGVtYSA/CisJCSAgICBmdW5jLnNldFVyaSh1cmkpOworCQkgICAgZnVuYy5zZXRGdW5jdGlvbkluZm8oZnVuY0luZm8pOworCQkgICAgcHJvY2Vzc1NpZ25hdHVyZShmdW5jKTsKKwkJfQorCSAgICB9CisKKwkgICAgZWwudmlzaXQobmV3IEZWVmlzaXRvcihuKSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHByb2Nlc3NTaWduYXR1cmUoRUxOb2RlLkZ1bmN0aW9uIGZ1bmMpCisJCXRocm93cyBKYXNwZXJFeGNlcHRpb24geworCSAgICBmdW5jLnNldE1ldGhvZE5hbWUoZ2V0TWV0aG9kKGZ1bmMpKTsKKwkgICAgZnVuYy5zZXRQYXJhbWV0ZXJzKGdldFBhcmFtZXRlcnMoZnVuYykpOworCX0KKworCS8qKgorCSAqIEdldCB0aGUgbWV0aG9kIG5hbWUgZnJvbSB0aGUgc2lnbmF0dXJlLgorCSAqLworCXByaXZhdGUgU3RyaW5nIGdldE1ldGhvZChFTE5vZGUuRnVuY3Rpb24gZnVuYykKKwkJdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisJICAgIEZ1bmN0aW9uSW5mbyBmdW5jSW5mbyA9IGZ1bmMuZ2V0RnVuY3Rpb25JbmZvKCk7CisJICAgIFN0cmluZyBzaWduYXR1cmUgPSBmdW5jSW5mby5nZXRGdW5jdGlvblNpZ25hdHVyZSgpOworCSAgICAKKwkgICAgaW50IHN0YXJ0ID0gc2lnbmF0dXJlLmluZGV4T2YoJyAnKTsKKwkgICAgaWYgKHN0YXJ0IDwgMCkgeworCQllcnIuanNwRXJyb3IoImpzcC5lcnJvci50bGQuZm4uaW52YWxpZC5zaWduYXR1cmUiLAorCQkJICAgICBmdW5jLmdldFByZWZpeCgpLCBmdW5jLmdldE5hbWUoKSk7CisJICAgIH0KKwkgICAgaW50IGVuZCA9IHNpZ25hdHVyZS5pbmRleE9mKCcoJyk7CisJICAgIGlmIChlbmQgPCAwKSB7CisJCWVyci5qc3BFcnJvcigianNwLmVycm9yLnRsZC5mbi5pbnZhbGlkLnNpZ25hdHVyZS5wYXJlbmV4cGVjdGVkIiwKKwkJCSAgICAgZnVuYy5nZXRQcmVmaXgoKSwgZnVuYy5nZXROYW1lKCkpOworCSAgICB9CisJICAgIHJldHVybiBzaWduYXR1cmUuc3Vic3RyaW5nKHN0YXJ0KzEsIGVuZCkudHJpbSgpOworCX0KKworCS8qKgorCSAqIEdldCB0aGUgcGFyYW1ldGVycyB0eXBlcyBmcm9tIHRoZSBmdW5jdGlvbiBzaWduYXR1cmUuCisJICogQHJldHVybiBBbiBhcnJheSBvZiBwYXJhbWV0ZXIgY2xhc3MgbmFtZXMKKwkgKi8KKwlwcml2YXRlIFN0cmluZ1tdIGdldFBhcmFtZXRlcnMoRUxOb2RlLkZ1bmN0aW9uIGZ1bmMpIAorCQl0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwkgICAgRnVuY3Rpb25JbmZvIGZ1bmNJbmZvID0gZnVuYy5nZXRGdW5jdGlvbkluZm8oKTsKKwkgICAgU3RyaW5nIHNpZ25hdHVyZSA9IGZ1bmNJbmZvLmdldEZ1bmN0aW9uU2lnbmF0dXJlKCk7CisJICAgIEFycmF5TGlzdCBwYXJhbXMgPSBuZXcgQXJyYXlMaXN0KCk7CisJICAgIC8vIFNpZ25hdHVyZSBpcyBvZiB0aGUgZm9ybQorCSAgICAvLyA8cmV0dXJuLXR5cGU+IFMgPG1ldGhvZC1uYW1lIFM/ICcoJworCSAgICAvLyA8IDxhcmctdHlwZT4gKCAnLCcgPGFyZy10eXBlPiApKiApPyAnKScKKwkgICAgaW50IHN0YXJ0ID0gc2lnbmF0dXJlLmluZGV4T2YoJygnKSArIDE7CisJICAgIGJvb2xlYW4gbGFzdEFyZyA9IGZhbHNlOworCSAgICB3aGlsZSAodHJ1ZSkgeworCQlpbnQgcCA9IHNpZ25hdHVyZS5pbmRleE9mKCcsJywgc3RhcnQpOworCQlpZiAocCA8IDApIHsKKwkJICAgIHAgPSBzaWduYXR1cmUuaW5kZXhPZignKScsIHN0YXJ0KTsKKwkJICAgIGlmIChwIDwgMCkgeworCQkJZXJyLmpzcEVycm9yKCJqc3AuZXJyb3IudGxkLmZuLmludmFsaWQuc2lnbmF0dXJlIiwKKwkJCQkgICAgIGZ1bmMuZ2V0UHJlZml4KCksIGZ1bmMuZ2V0TmFtZSgpKTsKKwkJICAgIH0KKwkJICAgIGxhc3RBcmcgPSB0cnVlOworCQl9CisgICAgICAgICAgICAgICAgU3RyaW5nIGFyZyA9IHNpZ25hdHVyZS5zdWJzdHJpbmcoc3RhcnQsIHApLnRyaW0oKTsKKyAgICAgICAgICAgICAgICBpZiAoISIiLmVxdWFscyhhcmcpKSB7CisgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5hZGQoYXJnKTsKKyAgICAgICAgICAgICAgICB9CisJCWlmIChsYXN0QXJnKSB7CisJCSAgICBicmVhazsKKwkJfQorCQlzdGFydCA9IHArMTsKKwkgICAgfQorCSAgICByZXR1cm4gKFN0cmluZ1tdKSBwYXJhbXMudG9BcnJheShuZXcgU3RyaW5nW3BhcmFtcy5zaXplKCldKTsKKwl9CisKKwlwcml2YXRlIEZ1bmN0aW9uTWFwcGVyIGdldEZ1bmN0aW9uTWFwcGVyKEVMTm9kZS5Ob2RlcyBlbCkKKwkJdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisKKwkgICAgY2xhc3MgVmFsaWRhdGVGdW5jdGlvbk1hcHBlciBpbXBsZW1lbnRzIEZ1bmN0aW9uTWFwcGVyIHsKKworCQlwcml2YXRlIEhhc2hNYXAgZm5tYXAgPSBuZXcgamF2YS51dGlsLkhhc2hNYXAoKTsKKwkJcHVibGljIHZvaWQgbWFwRnVuY3Rpb24oU3RyaW5nIGZuUU5hbWUsIE1ldGhvZCBtZXRob2QpIHsKKwkJICAgIGZubWFwLnB1dChmblFOYW1lLCBtZXRob2QpOworCQl9CisKKwkJcHVibGljIE1ldGhvZCByZXNvbHZlRnVuY3Rpb24oU3RyaW5nIHByZWZpeCwKKwkJCQkJICAgICAgU3RyaW5nIGxvY2FsTmFtZSkgeworCQkgICAgcmV0dXJuIChNZXRob2QpIHRoaXMuZm5tYXAuZ2V0KHByZWZpeCArICI6IiArIGxvY2FsTmFtZSk7CisJCX0KKwkgICAgfQorCisJICAgIGNsYXNzIE1hcHBlckVMVmlzaXRvciBleHRlbmRzIEVMTm9kZS5WaXNpdG9yIHsKKwkJVmFsaWRhdGVGdW5jdGlvbk1hcHBlciBmbWFwcGVyOworCisJCU1hcHBlckVMVmlzaXRvcihWYWxpZGF0ZUZ1bmN0aW9uTWFwcGVyIGZtYXBwZXIpIHsKKwkJICAgIHRoaXMuZm1hcHBlciA9IGZtYXBwZXI7CisJCX0KKworCQlwdWJsaWMgdm9pZCB2aXNpdChFTE5vZGUuRnVuY3Rpb24gbikgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisKKwkJICAgIENsYXNzIGMgPSBudWxsOworCQkgICAgTWV0aG9kIG1ldGhvZCA9IG51bGw7CisJCSAgICB0cnkgeworCQkJYyA9IGxvYWRlci5sb2FkQ2xhc3MoCisJCQkJbi5nZXRGdW5jdGlvbkluZm8oKS5nZXRGdW5jdGlvbkNsYXNzKCkpOworCQkgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisJCQllcnIuanNwRXJyb3IoImpzcC5lcnJvci5mdW5jdGlvbi5jbGFzc25vdGZvdW5kIiwKKwkJCQkgICAgIG4uZ2V0RnVuY3Rpb25JbmZvKCkuZ2V0RnVuY3Rpb25DbGFzcygpLAorCQkJCSAgICAgbi5nZXRQcmVmaXgoKSArICc6JyArIG4uZ2V0TmFtZSgpLAorCQkJCSAgICAgZS5nZXRNZXNzYWdlKCkpOworCQkgICAgfQorCQkgICAgU3RyaW5nIHBhcmFtVHlwZXNbXSA9IG4uZ2V0UGFyYW1ldGVycygpOworCQkgICAgaW50IHNpemUgPSBwYXJhbVR5cGVzLmxlbmd0aDsKKwkJICAgIENsYXNzIHBhcmFtc1tdID0gbmV3IENsYXNzW3NpemVdOworCQkgICAgaW50IGkgPSAwOworCQkgICAgdHJ5IHsKKwkJCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCSAgICBwYXJhbXNbaV0gPSBKc3BVdGlsLnRvQ2xhc3MocGFyYW1UeXBlc1tpXSwgbG9hZGVyKTsKKwkJCX0KKwkJCW1ldGhvZCA9IGMuZ2V0RGVjbGFyZWRNZXRob2Qobi5nZXRNZXRob2ROYW1lKCksCisJCQkJCQkgICAgIHBhcmFtcyk7CisJCSAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKwkJCWVyci5qc3BFcnJvcigianNwLmVycm9yLnNpZ25hdHVyZS5jbGFzc25vdGZvdW5kIiwKKwkJCQkgICAgIHBhcmFtVHlwZXNbaV0sCisJCQkJICAgICBuLmdldFByZWZpeCgpICsgJzonICsgbi5nZXROYW1lKCksCisJCQkJICAgICBlLmdldE1lc3NhZ2UoKSk7CisJCSAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSApIHsKKwkJCWVyci5qc3BFcnJvcigianNwLmVycm9yLm5vRnVuY3Rpb25NZXRob2QiLAorCQkJCSAgICAgbi5nZXRNZXRob2ROYW1lKCksIG4uZ2V0TmFtZSgpLAorCQkJCSAgICAgYy5nZXROYW1lKCkpOworCQkgICAgfQorCQkgICAgZm1hcHBlci5tYXBGdW5jdGlvbihuLmdldFByZWZpeCgpICsgJzonICsgbi5nZXROYW1lKCksCisJCQkJCW1ldGhvZCk7CisJCX0KKwkgICAgfQorCisJICAgIFZhbGlkYXRlRnVuY3Rpb25NYXBwZXIgZm1hcHBlciA9IG5ldyBWYWxpZGF0ZUZ1bmN0aW9uTWFwcGVyKCk7CisJICAgIGVsLnZpc2l0KG5ldyBNYXBwZXJFTFZpc2l0b3IoZm1hcHBlcikpOworCSAgICByZXR1cm4gZm1hcHBlcjsKKwl9CisgICAgfSAvLyBFbmQgb2YgVmFsaWRhdGVWaXNpdG9yCisKKyAgICAvKioKKyAgICAgKiBBIHZpc2l0b3IgZm9yIHZhbGlkYXRpbmcgVGFnRXh0cmFJbmZvIGNsYXNzZXMgb2YgYWxsIHRhZ3MKKyAgICAgKi8KKyAgICBzdGF0aWMgY2xhc3MgVGFnRXh0cmFJbmZvVmlzaXRvciBleHRlbmRzIE5vZGUuVmlzaXRvciB7CisKKwlwcml2YXRlIFBhZ2VJbmZvIHBhZ2VJbmZvOworCXByaXZhdGUgRXJyb3JEaXNwYXRjaGVyIGVycjsKKworCS8qCisJICogQ29uc3RydWN0b3IKKwkgKi8KKwlUYWdFeHRyYUluZm9WaXNpdG9yKENvbXBpbGVyIGNvbXBpbGVyKSB7CisJICAgIHRoaXMucGFnZUluZm8gPSBjb21waWxlci5nZXRQYWdlSW5mbygpOworCSAgICB0aGlzLmVyciA9IGNvbXBpbGVyLmdldEVycm9yRGlzcGF0Y2hlcigpOworCX0KKworCXB1YmxpYyB2b2lkIHZpc2l0KE5vZGUuQ3VzdG9tVGFnIG4pIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCSAgICBUYWdJbmZvIHRhZ0luZm8gPSBuLmdldFRhZ0luZm8oKTsKKwkgICAgaWYgKHRhZ0luZm8gPT0gbnVsbCkgeworCQllcnIuanNwRXJyb3IobiwgImpzcC5lcnJvci5taXNzaW5nLnRhZ0luZm8iLCBuLmdldFFOYW1lKCkpOworCSAgICB9CisKKwkgICAgVmFsaWRhdGlvbk1lc3NhZ2VbXSBlcnJvcnMgPSB0YWdJbmZvLnZhbGlkYXRlKG4uZ2V0VGFnRGF0YSgpKTsKKyAgICAgICAgICAgIGlmIChlcnJvcnMgIT0gbnVsbCAmJiBlcnJvcnMubGVuZ3RoICE9IDApIHsKKwkJU3RyaW5nQnVmZmVyIGVyck1zZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgICAgICAgICBlcnJNc2cuYXBwZW5kKCI8aDM+Iik7CisgICAgICAgICAgICAgICAgZXJyTXNnLmFwcGVuZChMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgianNwLmVycm9yLnRlaS5pbnZhbGlkLmF0dHJpYnV0ZXMiLAorCQkJCQkJICAgbi5nZXRRTmFtZSgpKSk7CisgICAgICAgICAgICAgICAgZXJyTXNnLmFwcGVuZCgiPC9oMz4iKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8ZXJyb3JzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGVyck1zZy5hcHBlbmQoIjxwPiIpOworCQkgICAgaWYgKGVycm9yc1tpXS5nZXRJZCgpICE9IG51bGwpIHsKKwkJCWVyck1zZy5hcHBlbmQoZXJyb3JzW2ldLmdldElkKCkpOworCQkJZXJyTXNnLmFwcGVuZCgiOiAiKTsKKwkJICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZXJyTXNnLmFwcGVuZChlcnJvcnNbaV0uZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgZXJyTXNnLmFwcGVuZCgiPC9wPiIpOworICAgICAgICAgICAgICAgIH0KKworCQllcnIuanNwRXJyb3IobiwgZXJyTXNnLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorCisJICAgIHZpc2l0Qm9keShuKTsKKwl9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlKENvbXBpbGVyIGNvbXBpbGVyLAorCQkJCU5vZGUuTm9kZXMgcGFnZSkgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisKKwkvKgorCSAqIFZpc2l0IHRoZSBwYWdlL3RhZyBkaXJlY3RpdmVzIGZpcnN0LCBhcyB0aGV5IGFyZSBnbG9iYWwgdG8gdGhlIHBhZ2UKKwkgKiBhbmQgYXJlIHBvc2l0aW9uIGluZGVwZW5kZW50LgorCSAqLworCXBhZ2UudmlzaXQobmV3IERpcmVjdGl2ZVZpc2l0b3IoY29tcGlsZXIpKTsKKworCS8vIERldGVybWluZSB0aGUgZGVmYXVsdCBvdXRwdXQgY29udGVudCB0eXBlCisJUGFnZUluZm8gcGFnZUluZm8gPSBjb21waWxlci5nZXRQYWdlSW5mbygpOworCVN0cmluZyBjb250ZW50VHlwZSA9IHBhZ2VJbmZvLmdldENvbnRlbnRUeXBlKCk7CisKKwlpZiAoY29udGVudFR5cGUgPT0gbnVsbCB8fCBjb250ZW50VHlwZS5pbmRleE9mKCJjaGFyc2V0PSIpIDwgMCkgeworCSAgICBib29sZWFuIGlzWG1sID0gcGFnZS5nZXRSb290KCkuaXNYbWxTeW50YXgoKTsKKwkgICAgU3RyaW5nIGRlZmF1bHRUeXBlOworCSAgICBpZiAoY29udGVudFR5cGUgPT0gbnVsbCkgeworCQlkZWZhdWx0VHlwZSA9IGlzWG1sPyAidGV4dC94bWwiOiAidGV4dC9odG1sIjsKKwkgICAgfSBlbHNlIHsKKwkJZGVmYXVsdFR5cGUgPSBjb250ZW50VHlwZTsKKwkgICAgfQorCisJICAgIFN0cmluZyBjaGFyc2V0ID0gbnVsbDsKKwkgICAgaWYgKGlzWG1sKSB7CisJCWNoYXJzZXQgPSAiVVRGLTgiOworCSAgICB9IGVsc2UgeworCQlpZiAoIXBhZ2UuZ2V0Um9vdCgpLmlzRGVmYXVsdFBhZ2VFbmNvZGluZygpKSB7CisJCSAgICBjaGFyc2V0ID0gcGFnZS5nZXRSb290KCkuZ2V0UGFnZUVuY29kaW5nKCk7CisJCX0KKwkgICAgfQorCisJICAgIGlmIChjaGFyc2V0ICE9IG51bGwpIHsKKwkJcGFnZUluZm8uc2V0Q29udGVudFR5cGUoZGVmYXVsdFR5cGUgKyAiO2NoYXJzZXQ9IiArIGNoYXJzZXQpOworCSAgICB9IGVsc2UgeworCQlwYWdlSW5mby5zZXRDb250ZW50VHlwZShkZWZhdWx0VHlwZSk7CisJICAgIH0KKwl9CisKKwkvKgorCSAqIFZhbGlkYXRlIGFsbCBvdGhlciBub2Rlcy4KKwkgKiBUaGlzIHZhbGlkYXRpb24gc3RlcCBpbmNsdWRlcyBjaGVja2luZyBhIGN1c3RvbSB0YWcncyBtYW5kYXRvcnkgYW5kCisJICogb3B0aW9uYWwgYXR0cmlidXRlcyBhZ2FpbnN0IGluZm9ybWF0aW9uIGluIHRoZSBUTEQgKGZpcnN0IHZhbGlkYXRpb24KKwkgKiBzdGVwIGZvciBjdXN0b20gdGFncyBhY2NvcmRpbmcgdG8gSlNQLjEwLjUpLgorCSAqLworCXBhZ2UudmlzaXQobmV3IFZhbGlkYXRlVmlzaXRvcihjb21waWxlcikpOworCisJLyoKKwkgKiBJbnZva2UgVGFnTGlicmFyeVZhbGlkYXRvciBjbGFzc2VzIG9mIGFsbCBpbXBvcnRlZCB0YWdzCisJICogKHNlY29uZCB2YWxpZGF0aW9uIHN0ZXAgZm9yIGN1c3RvbSB0YWdzIGFjY29yZGluZyB0byBKU1AuMTAuNSkuCisJICovCisJdmFsaWRhdGVYbWxWaWV3KG5ldyBQYWdlRGF0YUltcGwocGFnZSwgY29tcGlsZXIpLCBjb21waWxlcik7CisKKwkvKgorCSAqIEludm9rZSBUYWdFeHRyYUluZm8gbWV0aG9kIGlzVmFsaWQoKSBmb3IgYWxsIGltcG9ydGVkIHRhZ3MgCisJICogKHRoaXJkIHZhbGlkYXRpb24gc3RlcCBmb3IgY3VzdG9tIHRhZ3MgYWNjb3JkaW5nIHRvIEpTUC4xMC41KS4KKwkgKi8KKwlwYWdlLnZpc2l0KG5ldyBUYWdFeHRyYUluZm9WaXNpdG9yKGNvbXBpbGVyKSk7CisKKyAgICB9CisKKworICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgLy8gUHJpdmF0ZSAodXRpbGl0eSkgbWV0aG9kcworCisgICAgLyoqCisgICAgICogVmFsaWRhdGUgWE1MIHZpZXcgYWdhaW5zdCB0aGUgVGFnTGlicmFyeVZhbGlkYXRvciBjbGFzc2VzIG9mIGFsbAorICAgICAqIGltcG9ydGVkIHRhZyBsaWJyYXJpZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB2YWxpZGF0ZVhtbFZpZXcoUGFnZURhdGEgeG1sVmlldywgQ29tcGlsZXIgY29tcGlsZXIpCisJICAgICAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKworCVN0cmluZ0J1ZmZlciBlcnJNc2cgPSBudWxsOworCUVycm9yRGlzcGF0Y2hlciBlcnJEaXNwID0gY29tcGlsZXIuZ2V0RXJyb3JEaXNwYXRjaGVyKCk7CisKKwlmb3IgKEl0ZXJhdG9yIGl0ZXI9Y29tcGlsZXIuZ2V0UGFnZUluZm8oKS5nZXRUYWdsaWJzKCkuaXRlcmF0b3IoKTsKKwkgICAgICAgICBpdGVyLmhhc05leHQoKTsgKSB7CisKKwkgICAgT2JqZWN0IG8gPSBpdGVyLm5leHQoKTsKKwkgICAgaWYgKCEobyBpbnN0YW5jZW9mIFRhZ0xpYnJhcnlJbmZvSW1wbCkpCisJCWNvbnRpbnVlOworCSAgICBUYWdMaWJyYXJ5SW5mb0ltcGwgdGxpID0gKFRhZ0xpYnJhcnlJbmZvSW1wbCkgbzsKKworCSAgICBWYWxpZGF0aW9uTWVzc2FnZVtdIGVycm9ycyA9IHRsaS52YWxpZGF0ZSh4bWxWaWV3KTsKKyAgICAgICAgICAgIGlmICgoZXJyb3JzICE9IG51bGwpICYmIChlcnJvcnMubGVuZ3RoICE9IDApKSB7CisgICAgICAgICAgICAgICAgaWYgKGVyck1zZyA9PSBudWxsKSB7CisJCSAgICBlcnJNc2cgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJCX0KKyAgICAgICAgICAgICAgICBlcnJNc2cuYXBwZW5kKCI8aDM+Iik7CisgICAgICAgICAgICAgICAgZXJyTXNnLmFwcGVuZChMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgianNwLmVycm9yLnRsdi5pbnZhbGlkLnBhZ2UiLAorCQkJCQkJICAgdGxpLmdldFNob3J0TmFtZSgpKSk7CisgICAgICAgICAgICAgICAgZXJyTXNnLmFwcGVuZCgiPC9oMz4iKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8ZXJyb3JzLmxlbmd0aDsgaSsrKSB7CisJCSAgICBpZiAoZXJyb3JzW2ldICE9IG51bGwpIHsKKwkJCWVyck1zZy5hcHBlbmQoIjxwPiIpOworCQkJZXJyTXNnLmFwcGVuZChlcnJvcnNbaV0uZ2V0SWQoKSk7CisJCQllcnJNc2cuYXBwZW5kKCI6ICIpOworCQkJZXJyTXNnLmFwcGVuZChlcnJvcnNbaV0uZ2V0TWVzc2FnZSgpKTsKKwkJCWVyck1zZy5hcHBlbmQoIjwvcD4iKTsKKwkJICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCWlmIChlcnJNc2cgIT0gbnVsbCkgeworICAgICAgICAgICAgZXJyRGlzcC5qc3BFcnJvcihlcnJNc2cudG9TdHJpbmcoKSk7CisJfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL2NvbXBpbGVyL3RhZ3BsdWdpbi9UYWdQbHVnaW4uamF2YSBiL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci90YWdwbHVnaW4vVGFnUGx1Z2luLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRhZjY3NwotLS0gL2Rldi9udWxsCisrKyBiL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9jb21waWxlci90YWdwbHVnaW4vVGFnUGx1Z2luLmphdmEKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFzcGVyLmNvbXBpbGVyLnRhZ3BsdWdpbjsKKworLyoqCisgKiBUaGlzIGludGVyZmFjZSBpcyB0byBiZSBpbXBsZW1lbnRlZCBieSB0aGUgcGx1Z2luIGF1dGhvciwgdG8gc3VwcGx5CisgKiBhbiBhbHRlcm5hdGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHRhZyBoYW5kbGVycy4gIEl0IGNhbiBiZSB1c2VkIHRvCisgKiBzcGVjaWZ5IHRoZSBKYXZhIGNvZGVzIHRvIGJlIGdlbmVyYXRlZCB3aGVuIGEgdGFnIGlzIGludm9rZWQuCisgKgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhpcyBpbnRlcmZhY2UgbXVzdCBiZSByZWdpc3RlcmVkIGluIGEgZmlsZQorICogbmFtZWQgInRhZ1BsdWdpbnMueG1sIiB1bmRlciBXRUItSU5GLgorICovCisKK3B1YmxpYyBpbnRlcmZhY2UgVGFnUGx1Z2luIHsKKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlIGNvZGVzIGZvciBhIGN1c3RvbSB0YWcuCisgICAgICogQHBhcmFtIGN0eHQgYSBUYWdQbHVnaW5Db250ZXh0IGZvciBhY2Nlc3NpbmcgSmFzcGVyIGZ1bmN0aW9ucworICAgICAqLworICAgIHZvaWQgZG9UYWcoVGFnUGx1Z2luQ29udGV4dCBjdHh0KTsKK30KKwpkaWZmIC0tZ2l0IGEvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL2NvbXBpbGVyL3RhZ3BsdWdpbi9UYWdQbHVnaW5Db250ZXh0LmphdmEgYi9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvY29tcGlsZXIvdGFncGx1Z2luL1RhZ1BsdWdpbkNvbnRleHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjFjNDFjCi0tLSAvZGV2L251bGwKKysrIGIvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL2NvbXBpbGVyL3RhZ3BsdWdpbi9UYWdQbHVnaW5Db250ZXh0LmphdmEKQEAgLTAsMCArMSwxMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphc3Blci5jb21waWxlci50YWdwbHVnaW47CisKKworLyoqCisgKiBUaGlzIGludGVyZmFjZSBhbGxvd3MgdGhlIHBsdWdpbiBhdXRob3IgdG8gbWFrZSBpbnF1ZXJpZXMgYWJvdXQgdGhlCisgKiBwcm9wZXJ0aWVzIG9mIHRoZSBjdXJyZW50IHRhZywgYW5kIHRvIHVzZSBKYXNwZXIgcmVzb3VyY2VzIHRvIGdlbmVyYXRlCisgKiBkaXJlY3QgSmF2YSBjb2RlcyBpbiBwbGFjZSBvZiB0YWcgaGFuZGxlciBpbnZvY2F0aW9ucy4KKyAqLworCitwdWJsaWMgaW50ZXJmYWNlIFRhZ1BsdWdpbkNvbnRleHQgeworICAgIC8qKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgYm9keSBvZiB0aGUgdGFnIGlzIHNjcmlwdGxlc3MuCisgICAgICovCisgICAgYm9vbGVhbiBpc1NjcmlwdGxlc3MoKTsKKworICAgIC8qKgorICAgICAqIEBwYXJhbSBhdHRyaWJ1dGUgTmFtZSBvZiB0aGUgYXR0cmlidXRlCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBhdHRyaWJ1dGUgaXMgc3BlY2lmaWVkIGluIHRoZSB0YWcKKyAgICAgKi8KKyAgICBib29sZWFuIGlzQXR0cmlidXRlU3BlY2lmaWVkKFN0cmluZyBhdHRyaWJ1dGUpOworCisgICAgLyoqCisgICAgICogQHJldHVybiBBbiB1bmlxdWUgdGVtcG9yYXJ5IHZhcmlhYmxlIG5hbWUgdGhhdCB0aGUgcGx1Z2luIGNhbiB1c2UuCisgICAgICovCisgICAgU3RyaW5nIGdldFRlbXBvcmFyeVZhcmlhYmxlTmFtZSgpOworCisgICAgLyoqCisgICAgICogR2VuZXJhdGUgYW4gaW1wb3J0IHN0YXRlbWVudAorICAgICAqIEBwYXJhbSBzIE5hbWUgb2YgdGhlIGltcG9ydCBjbGFzcywgJyonIGFsbG93ZWQuCisgICAgICovCisgICAgdm9pZCBnZW5lcmF0ZUltcG9ydChTdHJpbmcgcyk7CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZSBhIGRlY2xhcmF0aW9uIGluIHRoZSBvZiB0aGUgZ2VuZXJhdGVkIGNsYXNzLiAgVGhpcyBjYW4gYmUKKyAgICAgKiB1c2VkIHRvIGRlY2xhcmUgYW4gaW5udGVyIGNsYXNzLCBhIG1ldGhvZCwgb3IgYSBjbGFzcyB2YXJpYWJsZS4KKyAgICAgKiBAcGFyYW0gaWQgQW4gdW5pcXVlIElEIGlkZW50aWZ5aW5nIHRoZSBkZWNsYXJhdGlvbi4gIEl0IGlzIG5vdAorICAgICAqICAgICAgICAgICBwYXJ0IG9mIHRoZSBkZWNsYXJhdGlvbiwgYW5kIGlzIHVzZWQgdG8gZW5zdXJlIHRoYXQgdGhlCisgICAgICogICAgICAgICAgIGRlY2xhcmF0aW9uIHdpbGwgb25seSBhcHBlYXIgb25jZS4gIElmIHRoaXMgbWV0aG9kIGlzCisgICAgICogICAgICAgICAgIGludm9rZWQgd2l0aCB0aGUgc2FtZSBpZCBtb3JlIHRoYW4gb25jZSBpbiB0aGUgdHJhbnNsYXRpb24KKyAgICAgKiAgICAgICAgICAgdW5pdCwgb25seSB0aGUgZmlyc3QgZGVjbGFyYXRpb24gd2lsbCBiZSB0YWtlbi4KKyAgICAgKiBAcGFyYW0gdGV4dCBUaGUgdGV4dCBvZiB0aGUgZGVjbGFyYXRpb24uCisgICAgICoqLworICAgIHZvaWQgZ2VuZXJhdGVEZWNsYXJhdGlvbihTdHJpbmcgaWQsIFN0cmluZyB0ZXh0KTsKKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlIEphdmEgc291cmNlIGNvZGVzCisgICAgICovCisgICAgdm9pZCBnZW5lcmF0ZUphdmFTb3VyY2UoU3RyaW5nIHMpOworCisgICAgLyoqCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBhdHRyaWJ1dGUgaXMgc3BlY2lmaWVkIGFuZCBpdHMgdmFsdWUgaXMgYQorICAgICAqICAgICAgICAgdHJhbnNsYXRpb24tdGltZSBjb25zdGFudC4KKyAgICAgKi8KKyAgICBib29sZWFuIGlzQ29uc3RhbnRBdHRyaWJ1dGUoU3RyaW5nIGF0dHJpYnV0ZSk7CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIEEgc3RyaW5nIHRoYXQgaXMgdGhlIHZhbHVlIG9mIGEgY29uc3RhbnQgYXR0cmlidXRlLiAgVW5kZWZpbmVkCisgICAgICogICAgICAgICBpZiB0aGUgYXR0cmlidXRlIGlzIG5vdCBhICh0cmFuc2xhdGlvbi10aW1lKSBjb25zdGFudC4KKyAgICAgKiAgICAgICAgIG51bGwgaWYgdGhlIGF0dHJpYnV0ZSBpcyBub3Qgc3BlY2lmaWVkLgorICAgICAqLworICAgIFN0cmluZyBnZXRDb25zdGFudEF0dHJpYnV0ZShTdHJpbmcgYXR0cmlidXRlKTsKKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlIGNvZGVzdG8gZXZhbHVhdGUgdmFsdWUgb2YgYSBhdHRyaWJ1dGUgaW4gdGhlIGN1c3RvbSB0YWcKKyAgICAgKiBUaGUgY29kZXMgaXMgYSBKYXZhIGV4cHJlc3Npb24uCisgICAgICogTk9URTogQ3VycmVudGx5IGNhbm5vdCBoYW5kbGUgYXR0cmlidXRlcyB0aGF0IGFyZSBmcmFnbWVudHMuCisgICAgICogQHBhcmFtIGF0dHJpYnV0ZSBUaGUgc3BlY2lmaWVkIGF0dHJpYnV0ZQorICAgICAqLworICAgIHZvaWQgZ2VuZXJhdGVBdHRyaWJ1dGUoU3RyaW5nIGF0dHJpYnV0ZSk7CisKKyAgICAvKgorICAgICAqIEdlbmVyYXRlIGNvZGVzIGZvciB0aGUgYm9keSBvZiB0aGUgY3VzdG9tIHRhZworICAgICAqLworICAgIHZvaWQgZ2VuZXJhdGVCb2R5KCk7CisKKyAgICAvKioKKyAgICAgKiBBYmFuZG9uIG9wdGltaXphdGlvbiBmb3IgdGhpcyB0YWcgaGFuZGxlciwgYW5kIGluc3RydWN0CisgICAgICogSmFzcGVyIHRvIGdlbmVyYXRlIHRoZSB0YWcgaGFuZGxlciBjYWxscywgYXMgdXN1YWwuCisgICAgICogU2hvdWxkIGJlIGludm9rZWQgaWYgZXJyb3JzIGFyZSBkZXRlY3RlZCwgb3Igd2hlbiB0aGUgdGFnIGJvZHkKKyAgICAgKiBpcyBkZWVtZWQgdG9vIGNvbXBpbGljYXRlZCBmb3Igb3B0aW1pemF0aW9uLgorICAgICAqLworICAgIHZvaWQgZG9udFVzZVRhZ1BsdWdpbigpOworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBQbHVnaW5Db250ZXh0IGZvciB0aGUgcGFyZW50IG9mIHRoaXMgY3VzdG9tIHRhZy4gIE5PVEU6CisgICAgICogVGhlIG9wZXJhdGlvbnMgYXZhaWxhYmxlIGZvciBQbHVnaW5Db250ZXh0IHNvIG9idGFpbmVkIGlzIGxpbWl0ZWQKKyAgICAgKiB0byBnZXRQbHVnaW5BdHRyaWJ1dGUgYW5kIHNldFBsdWdpbkF0dHJpYnV0ZSwgYW5kIHF1ZXJpZXMgKGUuZy4KKyAgICAgKiBpc1NjcmlwdGxlc3MoKS4gIFRoZXJlIHNob3VsZCBiZSBubyBjYWxscyB0byBnZW5lcmF0ZSooKS4KKyAgICAgKiBAcmV0dXJuIFRoZSBwbHVnaW5Db250ZXh0IGZvciB0aGUgcGFyZW50IG5vZGUuCisgICAgICogICAgICAgICBudWxsIGlmIHRoZSBwYXJlbnQgaXMgbm90IGEgY3VzdG9tIHRhZywgb3IgaWYgdGhlIHBsdWdpbkNvbnh0CisgICAgICogICAgICAgICBpZiBub3QgYXZhaWxhYmxlIChiZWNhdXNlIHVzZVRhZ1BsdWdpbiBpcyBmYWxzZSwgZS5nKS4KKyAgICAgKi8KKyAgICBUYWdQbHVnaW5Db250ZXh0IGdldFBhcmVudENvbnRleHQoKTsKKworICAgIC8qKgorICAgICAqIEFzc29jaWF0ZSB0aGUgYXR0cmlidXRlIHdpdGggYSB2YWx1ZSBpbiB0aGUgY3VycmVudCB0YWdwbHVnaW4gY29udGV4dC4KKyAgICAgKiBUaGUgcGx1Z2luIGF0dHJpYnV0ZXMgY2FuIGJlIHVzZWQgZm9yIGNvbW11bmljYXRpb24gYW1vbmcgdGFncyB0aGF0CisgICAgICogbXVzdCB3b3JrIHRvZ2V0aGVyIGFzIGEgZ3JvdXAuICBTZWUgPGM6d2hlbj4gZm9yIGFuIGV4YW1wbGUuCisgICAgICovCisgICAgdm9pZCBzZXRQbHVnaW5BdHRyaWJ1dGUoU3RyaW5nIGF0dHIsIE9iamVjdCB2YWx1ZSk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHZhbHVlIG9mIGFuIGF0dHJpYnV0ZSBpbiB0aGUgY3VycmVudCB0YWdwbHVnaW4gY29udGV4dC4KKyAgICAgKi8KKyAgICBPYmplY3QgZ2V0UGx1Z2luQXR0cmlidXRlKFN0cmluZyBhdHRyKTsKK30KKwpkaWZmIC0tZ2l0IGEvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3Jlc291cmNlcy9Mb2NhbFN0cmluZ3MucHJvcGVydGllcyBiL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9yZXNvdXJjZXMvTG9jYWxTdHJpbmdzLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVhYjRiZgotLS0gL2Rldi9udWxsCisrKyBiL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9yZXNvdXJjZXMvTG9jYWxTdHJpbmdzLnByb3BlcnRpZXMKQEAgLTAsMCArMSw0MDUgQEAKKyMgJElkJAorIworIyBEZWZhdWx0IGxvY2FsaXplZCBzdHJpbmcgaW5mb3JtYXRpb24KKyMgTG9jYWxpemVkIHRoaXMgdGhlIERlZmF1bHQgTG9jYWxlIGFzIGlzIGVuX1VTCisKK2pzcC5lcnJvci5iYWQuc2VydmxldC5lbmdpbmU9SW5jb3JyZWN0IHNlcnZsZXQgZW5naW5lIHZlcnNpb24hCitqc3AuZXJyb3Iubm8uc2NyYXRjaC5kaXI9VGhlIEpTUCBlbmdpbmUgaXMgbm90IGNvbmZpZ3VyZWQgd2l0aCBhIHNjcmF0Y2ggZGlyLlwKK1xuIFBsZWFzZSBhZGQgXCJqc3AuaW5pdHBhcmFtcz1zY3JhdGNoZGlyPTxkaXItbmFtZT5cIiBcCitcbiBpbiB0aGUgc2VydmxldHMucHJvcGVydGllcyBmaWxlIGZvciB0aGlzIGNvbnRleHQuCitqc3AuZXJyb3IuYmFkLnNjcmF0Y2guZGlyPVRoZSBzY3JhdGNoRGlyIHlvdSBzcGVjaWZpZWQ6IHswfSBpcyB1bnVzYWJsZS4KK2pzcC5tZXNzYWdlLnNjcmF0Y2guZGlyLmlzPVNjcmF0Y2ggZGlyIGZvciB0aGUgSlNQIGVuZ2luZSBpczogezB9Citqc3AubWVzc2FnZS5wYXJlbnRfY2xhc3NfbG9hZGVyX2lzPVBhcmVudCBjbGFzcyBsb2FkZXIgaXM6IHswfQoranNwLm1lc3NhZ2UuZG9udC5tb2RpZnkuc2VydmxldHM9SU1QT1JUQU5UOiBEbyBub3QgbW9kaWZ5IHRoZSBnZW5lcmF0ZWQgc2VydmxldHMKK2pzcC5lcnJvci5ub3QuaW1wbC5jb21tZW50cz1JbnRlcm5hbCBlcnJvcjogQ29tbWVudHMgbm90IGltcGxlbWVudGVkCitqc3AuZXJyb3Iubm90LmltcGwuZGlyZWN0aXZlcz1JbnRlcm5hbCBlcnJvcjogRGlyZWN0aXZlcyBub3QgaW1wbGVtZW50ZWQKK2pzcC5lcnJvci5ub3QuaW1wbC5kZWNsYXJhdGlvbnM9SW50ZXJuYWwgZXJyb3I6IERlY2xhcmF0aW9ucyBub3QgaW1wbGVtZW50ZWQKK2pzcC5lcnJvci5ub3QuaW1wbC5leHByZXNzaW9ucz1JbnRlcm5hbCBlcnJvcjogRXhwcmVzc2lvbnMgbm90IGltcGxlbWVudGVkCitqc3AuZXJyb3Iubm90LmltcGwuc2NyaXB0bGV0cz1JbnRlcm5hbCBlcnJvcjogU2NyaXB0bGV0cyBub3QgaW1wbGVtZW50ZWQKK2pzcC5lcnJvci5ub3QuaW1wbC51c2ViZWFuPUludGVybmFsIGVycm9yOiB1c2VCZWFuIG5vdCBpbXBsZW1lbnRlZAoranNwLmVycm9yLm5vdC5pbXBsLmdldHA9SW50ZXJuYWwgZXJyb3I6IGdldFByb3BlcnR5IG5vdCBpbXBsZW1lbnRlZAoranNwLmVycm9yLm5vdC5pbXBsLnNldHA9SW50ZXJuYWwgZXJyb3I6IHNldFByb3BlcnR5IG5vdCBpbXBsZW1lbnRlZAoranNwLmVycm9yLm5vdC5pbXBsLnBsdWdpbj1JbnRlcm5hbCBlcnJvcjogcGx1Z2luIG5vdCBpbXBsZW1lbnRlZAoranNwLmVycm9yLm5vdC5pbXBsLmZvcndhcmQ9SW50ZXJuYWwgZXJyb3I6IGZvcndhcmQgbm90IGltcGxlbWVudGVkCitqc3AuZXJyb3Iubm90LmltcGwuaW5jbHVkZT1JbnRlcm5hbCBlcnJvcjogaW5jbHVkZSBub3QgaW1wbGVtZW50ZWQKK2pzcC5lcnJvci51bmF2YWlsYWJsZT1KU1AgaGFzIGJlZW4gbWFya2VkIHVuYXZhaWxhYmxlCitqc3AuZXJyb3IudXNlYmVhbi5taXNzaW5nLmF0dHJpYnV0ZT11c2VCZWFuOiBpZCBhdHRyaWJ1dGUgbWlzc2luZyBvciBtaXNzcGVsbGVkCitqc3AuZXJyb3IudXNlYmVhbi5taXNzaW5nLnR5cGU9dXNlQmVhbiAoezB9KTogRWl0aGVyIGNsYXNzIG9yIHR5cGUgYXR0cmlidXRlIG11c3QgYmUgXAorc3BlY2lmaWVkOiAKK2pzcC5lcnJvci51c2ViZWFuLmR1cGxpY2F0ZT11c2VCZWFuOiBEdXBsaWNhdGUgYmVhbiBuYW1lOiB7MH0KK2pzcC5lcnJvci51c2ViZWFuLnByb2hpYml0ZWQuYXMuc2Vzc2lvbj1DYW4ndCB1c2UgYXMgc2Vzc2lvbiBiZWFuIHswfSBzaW5jZSBpdCBpcyBwcm9oaWJpdGVkIFwKK2J5IGpzcCBkaXJlY3RpdmUgZGVmaW5lZCBlYXJsaWVyOiAKK2pzcC5lcnJvci51c2ViZWFuLm5vdC5ib3RoPXVzZUJlYW46IENhbid0IHNwZWNpZnkgYm90aCBjbGFzcyBhbmQgYmVhbk5hbWUgYXR0cmlidXRlOiAKK2pzcC5lcnJvci51c2ViZWFuLmJhZC50eXBlLmNhc3Q9dXNlQmVhbiAoezB9KTogVHlwZSAoezF9KSBpcyBub3QgYXNzaWduYWJsZSBmcm9tIGNsYXNzICh7Mn0pIAoranNwLmVycm9yLmludmFsaWQuc2NvcGU9SWxsZWdhbCB2YWx1ZSBvZiBcJ3Njb3BlXCcgYXR0cmlidXRlOiB7MH0gKG11c3QgYmUgb25lIG9mIFwicGFnZVwiLCBcInJlcXVlc3RcIiwgXCJzZXNzaW9uXCIsIG9yIFwiYXBwbGljYXRpb25cIikKK2pzcC5lcnJvci5jbGFzc25hbWU9Q2FuJ3QgZGV0ZXJtaW5lIGNsYXNzbmFtZSBmcm9tIC5jbGFzcyBmaWxlCitqc3Aud2FybmluZy5iYWQudHlwZT1XYXJuaW5nOiBiYWQgdHlwZSBpbiAuY2xhc3MgZmlsZQoranNwLmVycm9yLmRhdGEuZmlsZS53cml0ZT1FcnJvciB3aGlsZSB3cml0aW5nIGRhdGEgZmlsZQoranNwLmVycm9yLnBhZ2UuaW52YWxpZC5idWZmZXI9UGFnZSBkaXJlY3RpdmU6IGludmFsaWQgYnVmZmVyIHNpemUKK2pzcC5lcnJvci5wYWdlLmNvbmZsaWN0LmNvbnRlbnR0eXBlPVBhZ2UgZGlyZWN0aXZlOiBpbGxlZ2FsIHRvIGhhdmUgbXVsdGlwbGUgb2NjdXJyZW5jZXMgb2YgJ2NvbnRlbnRUeXBlJyB3aXRoIGRpZmZlcmVudCB2YWx1ZXMgKG9sZDogezB9LCBuZXc6IHsxfSkKK2pzcC5lcnJvci5wYWdlLmludmFsaWQuY29udGVudHR5cGU9UGFnZSBkaXJlY3RpdmU6IGludmFsaWQgdmFsdWUgZm9yIGNvbnRlbnRUeXBlCitqc3AuZXJyb3IucGFnZS5jb25mbGljdC5zZXNzaW9uPVBhZ2UgZGlyZWN0aXZlOiBpbGxlZ2FsIHRvIGhhdmUgbXVsdGlwbGUgb2NjdXJyZW5jZXMgb2YgJ3Nlc3Npb24nIHdpdGggZGlmZmVyZW50IHZhbHVlcyAob2xkOiB7MH0sIG5ldzogezF9KQoranNwLmVycm9yLnBhZ2UuaW52YWxpZC5zZXNzaW9uPVBhZ2UgZGlyZWN0aXZlOiBpbnZhbGlkIHZhbHVlIGZvciBzZXNzaW9uCitqc3AuZXJyb3IucGFnZS5jb25mbGljdC5idWZmZXI9UGFnZSBkaXJlY3RpdmU6IGlsbGVnYWwgdG8gaGF2ZSBtdWx0aXBsZSBvY2N1cnJlbmNlcyBvZiAnYnVmZmVyJyB3aXRoIGRpZmZlcmVudCB2YWx1ZXMgKG9sZDogezB9LCBuZXc6IHsxfSkKK2pzcC5lcnJvci5wYWdlLmludmFsaWQuYnVmZmVyPVBhZ2UgZGlyZWN0aXZlOiBpbnZhbGlkIHZhbHVlIGZvciBidWZmZXIKK2pzcC5lcnJvci5wYWdlLmNvbmZsaWN0LmF1dG9mbHVzaD1QYWdlIGRpcmVjdGl2ZTogaWxsZWdhbCB0byBoYXZlIG11bHRpcGxlIG9jY3VycmVuY2VzIG9mICdhdXRvRmx1c2gnIHdpdGggZGlmZmVyZW50IHZhbHVlcyAob2xkOiB7MH0sIG5ldzogezF9KQoranNwLmVycm9yLnBhZ2UuaW52YWxpZC5hdXRvZmx1c2g9UGFnZSBkaXJlY3RpdmU6IGludmFsaWQgdmFsdWUgZm9yIGF1dG9GbHVzaAoranNwLmVycm9yLnBhZ2UuY29uZmxpY3QuaXN0aHJlYWRzYWZlPVBhZ2UgZGlyZWN0aXZlOiBpbGxlZ2FsIHRvIGhhdmUgbXVsdGlwbGUgb2NjdXJyZW5jZXMgb2YgJ2lzVGhyZWFkU2FmZScgd2l0aCBkaWZmZXJlbnQgdmFsdWVzIChvbGQ6IHswfSwgbmV3OiB7MX0pCitqc3AuZXJyb3IucGFnZS5pbnZhbGlkLmlzdGhyZWFkc2FmZT1QYWdlIGRpcmVjdGl2ZTogaW52YWxpZCB2YWx1ZSBmb3IgaXNUaHJlYWRTYWZlCitqc3AuZXJyb3IucGFnZS5jb25mbGljdC5pbmZvPVBhZ2UgZGlyZWN0aXZlOiBpbGxlZ2FsIHRvIGhhdmUgbXVsdGlwbGUgb2NjdXJyZW5jZXMgb2YgJ2luZm8nIHdpdGggZGlmZmVyZW50IHZhbHVlcyAob2xkOiB7MH0sIG5ldzogezF9KQoranNwLmVycm9yLnBhZ2UuaW52YWxpZC5pbmZvPVBhZ2UgZGlyZWN0aXZlOiBpbnZhbGlkIHZhbHVlIGZvciBpbmZvCitqc3AuZXJyb3IucGFnZS5jb25mbGljdC5pc2Vycm9ycGFnZT1QYWdlIGRpcmVjdGl2ZTogaWxsZWdhbCB0byBoYXZlIG11bHRpcGxlIG9jY3VycmVuY2VzIG9mICdpc0Vycm9yUGFnZScgd2l0aCBkaWZmZXJlbnQgdmFsdWVzIChvbGQ6IHswfSwgbmV3OiB7MX0pCitqc3AuZXJyb3IucGFnZS5pbnZhbGlkLmlzZXJyb3JwYWdlPVBhZ2UgZGlyZWN0aXZlOiBpbnZhbGlkIHZhbHVlIGZvciBpc0Vycm9yUGFnZQoranNwLmVycm9yLnBhZ2UuY29uZmxpY3QuZXJyb3JwYWdlPVBhZ2UgZGlyZWN0aXZlOiBpbGxlZ2FsIHRvIGhhdmUgbXVsdGlwbGUgb2NjdXJyZW5jZXMgb2YgJ2Vycm9yUGFnZScgd2l0aCBkaWZmZXJlbnQgdmFsdWVzIChvbGQ6IHswfSwgbmV3OiB7MX0pCitqc3AuZXJyb3IucGFnZS5jb25mbGljdC5sYW5ndWFnZT1QYWdlIGRpcmVjdGl2ZTogaWxsZWdhbCB0byBoYXZlIG11bHRpcGxlIG9jY3VycmVuY2VzIG9mICdsYW5ndWFnZScgd2l0aCBkaWZmZXJlbnQgdmFsdWVzIChvbGQ6IHswfSwgbmV3OiB7MX0pCitqc3AuZXJyb3IudGFnLmNvbmZsaWN0Lmxhbmd1YWdlPVRhZyBkaXJlY3RpdmU6IGlsbGVnYWwgdG8gaGF2ZSBtdWx0aXBsZSBvY2N1cnJlbmNlcyBvZiAnbGFuZ3VhZ2UnIHdpdGggZGlmZmVyZW50IHZhbHVlcyAob2xkOiB7MH0sIG5ldzogezF9KQoranNwLmVycm9yLnBhZ2UubGFuZ3VhZ2Uubm9uamF2YT1QYWdlIGRpcmVjdGl2ZTogaW52YWxpZCBsYW5ndWFnZSBhdHRyaWJ1dGUKK2pzcC5lcnJvci50YWcubGFuZ3VhZ2Uubm9uamF2YT1UYWcgZGlyZWN0aXZlOiBpbnZhbGlkIGxhbmd1YWdlIGF0dHJpYnV0ZQoranNwLmVycm9yLnBhZ2UuZGVmYWZ0ZXJ1c2UubGFuZ3VhZ2U9UGFnZSBkaXJlY3RpdmU6IGNhbid0IGRlZmluZSBsYW5ndWFnZSBhZnRlciBhIHNjcmlwdGxldCAKK2pzcC5lcnJvci5wYWdlLm5vbWFwcGluZy5sYW5ndWFnZT1QYWdlIGRpcmVjdGl2ZTogTm8gbWFwcGluZyBmb3IgbGFuZ3VhZ2U6IAoranNwLmVycm9yLnBhZ2UuY29uZmxpY3QuZXh0ZW5kcz1QYWdlIGRpcmVjdGl2ZTogaWxsZWdhbCB0byBoYXZlIG11bHRpcGxlIG9jY3VycmVuY2VzIG9mICdleHRlbmRzJyB3aXRoIGRpZmZlcmVudCB2YWx1ZXMgKG9sZDogezB9LCBuZXc6IHsxfSkKK2pzcC5lcnJvci5wYWdlLmNvbmZsaWN0LmlzZWxpZ25vcmVkPVBhZ2UgZGlyZWN0aXZlOiBpbGxlZ2FsIHRvIGhhdmUgbXVsdGlwbGUgb2NjdXJyZW5jZXMgb2YgJ2lzRUxJZ25vcmVkJyB3aXRoIGRpZmZlcmVudCB2YWx1ZXMgKG9sZDogezB9LCBuZXc6IHsxfSkKK2pzcC5lcnJvci50YWcuY29uZmxpY3QuaXNlbGlnbm9yZWQ9VGFnIGRpcmVjdGl2ZTogaWxsZWdhbCB0byBoYXZlIG11bHRpcGxlIG9jY3VycmVuY2VzIG9mICdpc0VMSWdub3JlZCcgd2l0aCBkaWZmZXJlbnQgdmFsdWVzIChvbGQ6IHswfSwgbmV3OiB7MX0pCitqc3AuZXJyb3IucGFnZS5pbnZhbGlkLmlzZWxpZ25vcmVkPVBhZ2UgZGlyZWN0aXZlOiBpbnZhbGlkIHZhbHVlIGZvciBpc0VMSWdub3JlZAoranNwLmVycm9yLnRhZy5pbnZhbGlkLmlzZWxpZ25vcmVkPVRhZyBkaXJlY3RpdmU6IGludmFsaWQgdmFsdWUgZm9yIGlzRUxJZ25vcmVkCitqc3AuZXJyb3IucGFnZS5tdWx0aS5wYWdlZW5jb2Rpbmc9UGFnZSBkaXJlY3RpdmUgbXVzdCBub3QgaGF2ZSBtdWx0aXBsZSBvY2N1cnJlbmNlcyBvZiBwYWdlZW5jb2RpbmcKK2pzcC5lcnJvci50YWcuY29uZmxpY3QuYXR0cj1UYWcgZGlyZWN0aXZlOiBpbGxlZ2FsIHRvIGhhdmUgbXVsdGlwbGUgb2NjdXJyZW5jZXMgb2YgdGhlIGF0dHJpYnV0ZSBcInswfVwiIHdpdGggZGlmZmVyZW50IHZhbHVlcyAob2xkOiB7MX0sIG5ldzogezJ9KQoranNwLmVycm9yLnRhZy5tdWx0aS5wYWdlZW5jb2Rpbmc9VGFnIGRpcmVjdGl2ZSBtdXN0IG5vdCBoYXZlIG11bHRpcGxlIG9jY3VycmVuY2VzIG9mIHBhZ2VlbmNvZGluZworanNwLmVycm9yLnBhZ2UuYmFkX2JfYW5kX2FfY29tYm89UGFnZSBkaXJlY3RpdmU6IElsbGVnYWwgY29tYmluYXRpb24gb2YgYnVmZmVyPVwibm9uZVwiICYmIGF1dG9GbHVzaD1cImZhbHNlXCIKK2pzcC5lcnJvci5ub3QuaW1wbC50YWdsaWI9SW50ZXJuYWwgZXJyb3I6IFRhZyBleHRlbnNpb25zIG5vdCBpbXBsZW1lbnRlZAoranNwLmVycm9yLmluY2x1ZGUubWlzc2luZy5maWxlPU1pc3NpbmcgZmlsZSBhcmd1bWVudCB0byBpbmNsdWRlCitqc3AuZXJyb3IuaW5jbHVkZS5iYWQuZmlsZT1CYWQgZmlsZSBhcmd1bWVudCB0byBpbmNsdWRlIAoranNwLmVycm9yLmluY2x1ZGUuZXhjZXB0aW9uPVVuYWJsZSB0byBpbmNsdWRlIHswfQoranNwLmVycm9yLnN0cmVhbS5jbG9zZWQ9U3RyZWFtIGNsb3NlZAoranNwLmVycm9yLmludmFsaWQuZm9yd2FyZD1JbnZhbGlkIGZvcndhcmQgdGFnCitqc3AuZXJyb3IudW5rbm93bkV4Y2VwdGlvbj1VbmhhbmRsZWQgZXJyb3IhIFlvdSBtaWdodCB3YW50IHRvIGNvbnNpZGVyIGhhdmluZyBhbiBlcnJvciBwYWdlIFwKK3RvIHJlcG9ydCBzdWNoIGVycm9ycyBtb3JlIGdyYWNlZnVsbHkKK2pzcC5lcnJvci5pbnZhbGlkLmRpcmVjdGl2ZT1JbnZhbGlkIGRpcmVjdGl2ZQoranNwLmVycm9yLmRpcmVjdGl2ZS5pc3RhZ2ZpbGU9ezB9IGRpcmVjdGl2ZSBjYW5ub3QgYmUgdXNlZCBpbiBhIHRhZyBmaWxlCitqc3AuZXJyb3IuZGlyZWN0aXZlLmlzbm90dGFnZmlsZT17MH0gZGlyZWN0aXZlIGNhbiBvbmx5IGJlIHVzZWQgaW4gYSB0YWcgZmlsZQoranNwLmVycm9yLnRhZ2ZpbGUudGxkLm5hbWU9VGhlIFwibmFtZVwiIGF0dHJpYnV0ZSBvZiB0aGUgdGFnIGRpcmVjdGl2ZSBoYXMgYSB2YWx1ZSB7MH0gd2hpbGUgdGhlIFwibmFtZVwiIHRhZyBvZiB0aGUgXCJ0YWctZmlsZVwiIGVsZW1lbnQgaW4gdGhlIFRMRCBpcyB7MX0KK2pzcC5lcnJvci5hY3Rpb24uaXN0YWdmaWxlPXswfSBhY3Rpb24gY2Fubm90IGJlIHVzZWQgaW4gYSB0YWcgZmlsZQoranNwLmVycm9yLmFjdGlvbi5pc25vdHRhZ2ZpbGU9ezB9IGFjdGlvbiBjYW4gYmUgdXNlZCBpbiB0YWcgZmlsZXMgb25seQoranNwLmVycm9yLnVudGVybWluYXRlZD1VbnRlcm1pbmF0ZWQgezB9IHRhZworanNwLmVycm9yLnVzZWJlYW4ubm90aW5zYW1lZmlsZT11c2VCZWFuIHRhZyBtdXN0IGJlZ2luIGFuZCBlbmQgaW4gdGhlIHNhbWUgcGh5c2ljYWwgZmlsZQoranNwLmVycm9yLmxvYWRjbGFzcy50YWdoYW5kbGVyPVVuYWJsZSB0byBsb2FkIHRhZyBoYW5kbGVyIGNsYXNzIFwiezB9XCIgZm9yIHRhZyBcInsxfVwiCitqc3AuZXJyb3IudW5hYmxlLmNvbXBpbGU9VW5hYmxlIHRvIGNvbXBpbGUgY2xhc3MgZm9yIEpTUAoranNwLmVycm9yLnVuYWJsZS5sb2FkPVVuYWJsZSB0byBsb2FkIGNsYXNzIGZvciBKU1AKK2pzcC5lcnJvci51bmFibGUucmVuYW1lPVVuYWJsZSB0byByZW5hbWUgY2xhc3MgZmlsZSB7MH0gdG8gezF9Citqc3AuZXJyb3IubWFuZGF0b3J5LmF0dHJpYnV0ZT17MH06IE1hbmRhdG9yeSBhdHRyaWJ1dGUgezF9IG1pc3NpbmcKK2pzcC5lbmdpbmUuaW5mbz1KYXNwZXIgSlNQIDIuMCBFbmdpbmUKK2pzcC5lcnJvci5pbnZhbGlkLmV4cHJlc3Npb249InswfSIgY29udGFpbnMgaW52YWxpZCBleHByZXNzaW9uKHMpOiB7MX0KK2pzcC5lcnJvci5pbnZhbGlkLmF0dHJpYnV0ZT17MH0gaGFzIGludmFsaWQgYXR0cmlidXRlOiB7MX0KK2pzcC5lcnJvci51c2ViZWFuLmNsYXNzLm5vdGZvdW5kPUNsYXNzOiB7MH0gbm90IGZvdW5kCitqc3AuZXJyb3IuZmlsZS5jYW5ub3QucmVhZD1DYW5ub3QgcmVhZCBmaWxlOiB7MH0KK2pzcC5lcnJvci5maWxlLmFscmVhZHkucmVnaXN0ZXJlZD1SZWN1cnNpdmUgaW5jbHVkZSBvZiBmaWxlIHswfQoranNwLmVycm9yLmZpbGUubm90LnJlZ2lzdGVyZWQ9ZmlsZSB7MH0gbm90IHNlZW4gaW4gaW5jbHVkZQoranNwLmVycm9yLnF1b3Rlcy51bnRlcm1pbmF0ZWQ9VW50ZXJtaW5hdGVkIHF1b3RlcworanNwLmVycm9yLmF0dHIucXVvdGVkPUF0dHJpYnV0ZSB2YWx1ZSBzaG91bGQgYmUgcXVvdGVkCitqc3AuZXJyb3IuYXR0ci5ub3ZhbHVlPUF0dHJpYnV0ZSB7MH0gaGFzIG5vIHZhbHVlCitqc3AuZXJyb3IudGFnLmF0dHIudW50ZXJtaW5hdGVkPVVudGVybWluYXRlZCB0YWcgYXR0cmlidXRlIGxpc3QKK2pzcC5lcnJvci5wYXJhbS5ub25hbWU9Tm8gbmFtZSBpbiBQQVJBTSB0YWcKK2pzcC5lcnJvci5wYXJhbS5ub3ZhbHVlPU5vIHZhbHVlIGluIFBBUkFNIHRhZworanNwLmVycm9yLmJlYW5zLm51bGxiZWFuPUF0dGVtcHRlZCBhIGJlYW4gb3BlcmF0aW9uIG9uIGEgbnVsbCBvYmplY3QuCitqc3AuZXJyb3IuYmVhbnMubm9iZWFuaW5mbz1ObyBCZWFuSW5mbyBmb3IgdGhlIGJlYW4gb2YgdHlwZSAnJ3swfScnIGNvdWxkIGJlIGZvdW5kLCB0aGUgY2xhc3MgbGlrZWx5IGRvZXMgbm90IGV4aXN0LgoranNwLmVycm9yLmJlYW5zLmludHJvc3BlY3Rpb249QW4gZXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIGludHJvc3BlY3RpbmcgdGhlIHJlYWQgbWV0aG9kIG9mIHByb3BlcnR5ICcnezB9JycgaW4gYSBiZWFuIG9mIHR5cGUgJyd7MX0nJzpcbnsyfQoranNwLmVycm9yLmJlYW5zLm5vbWV0aG9kPUNhbm5vdCBmaW5kIGEgbWV0aG9kIHRvIHJlYWQgcHJvcGVydHkgJyd7MH0nJyBpbiBhIGJlYW4gb2YgdHlwZSAnJ3sxfScnCitqc3AuZXJyb3IuYmVhbnMubm9tZXRob2Quc2V0cHJvcGVydHk9Q2FuJyd0IGZpbmQgYSBtZXRob2QgdG8gd3JpdGUgcHJvcGVydHkgJyd7MH0nJyBvZiB0eXBlICcnezF9JycgaW4gYSBiZWFuIG9mIHR5cGUgJyd7Mn0nJworanNwLmVycm9yLmJlYW5zLm5vcHJvcGVydHk9Q2Fubm90IGZpbmQgYW55IGluZm9ybWF0aW9uIG9uIHByb3BlcnR5ICcnezB9JycgaW4gYSBiZWFuIG9mIHR5cGUgJyd7MX0nJworanNwLmVycm9yLmJlYW5zLnNldHByb3BlcnR5Lm5vaW5kZXhzZXQ9Q2Fubm90IHNldCBpbmRleGVkIHByb3BlcnR5Citqc3AuZXJyb3IuaW5jbHVkZS50YWc9SW52YWxpZCBqc3A6aW5jbHVkZSB0YWcKK2pzcC5lcnJvci5pbmNsdWRlLm5vZmx1c2g9anNwOmluY2x1ZGUgbmVlZHMgdG8gaGF2ZSBcImZsdXNoPXRydWVcIgoranNwLmVycm9yLmluY2x1ZGUuYmFkZmx1c2g9anNwOmluY2x1ZGUgcGFnZT1cIi4uLlwiIGZsdXNoPVwidHJ1ZVwiIGlzIHRoZSBvbmx5IHZhbGlkIGNvbWJpbmF0aW9uIGluIEpTUCAxLjAKK2pzcC5lcnJvci5hdHRlbXB0X3RvX2NsZWFyX2ZsdXNoZWRfYnVmZmVyPUVycm9yOiBBdHRlbXB0IHRvIGNsZWFyIGEgYnVmZmVyIHRoYXQncyBhbHJlYWR5IGJlZW4gZmx1c2hlZAoranNwLmVycm9yLm92ZXJmbG93PUVycm9yOiBKU1AgQnVmZmVyIG92ZXJmbG93Citqc3AuZXJyb3IucGFyYW1leHBlY3RlZD1FeHBlY3RpbmcgXCJqc3A6cGFyYW1cIiBzdGFuZGFyZCBhY3Rpb24gd2l0aCBcIm5hbWVcIiBhbmQgXCJ2YWx1ZVwiIGF0dHJpYnV0ZXMKK2pzcC5lcnJvci5wYXJhbS5pbnZhbGlkVXNlPVRoZSBqc3A6cGFyYW0gYWN0aW9uIG11c3Qgbm90IGJlIHVzZWQgb3V0c2lkZSB0aGUganNwOmluY2x1ZGUsIGpzcDpmb3J3YXJkLCBvciBqc3A6cGFyYW1zIGVsZW1lbnRzCitqc3AuZXJyb3IucGFyYW1zLmludmFsaWRVc2U9anNwOnBhcmFtcyBtdXN0IGJlIGEgZGlyZWN0IGNoaWxkIG9mIGpzcDpwbHVnaW4KK2pzcC5lcnJvci5mYWxsYmFjay5pbnZhbGlkVXNlPWpzcDpmYWxsYmFjayBtdXN0IGJlIGEgZGlyZWN0IGNoaWxkIG9mIGpzcDpwbHVnaW4KK2pzcC5lcnJvci5uYW1lZEF0dHJpYnV0ZS5pbnZhbGlkVXNlPWpzcDphdHRyaWJ1dGUgbXVzdCBiZSB0aGUgc3ViZWxlbWVudCBvZiBhIHN0YW5kYXJkIG9yIGN1c3RvbSBhY3Rpb24KK2pzcC5lcnJvci5qc3Bib2R5LmludmFsaWRVc2U9anNwOmJvZHkgbXVzdCBiZSB0aGUgc3ViZWxlbWVudCBvZiBhIHN0YW5kYXJkIG9yIGN1c3RvbSBhY3Rpb24KK2pzcC5lcnJvci5jbG9zZWluZGl2aWR1YWxwYXJhbT1wYXJhbSB0YWcgbmVlZHMgdG8gYmUgY2xvc2VkIHdpdGggXCIvPlwiCitqc3AuZXJyb3IuY2xvc2VwYXJhbXM9cGFyYW0gdGFnIG5lZWRzIHRvIGJlIGNsb3NlZCB3aXRoIC9wYXJhbXMKK2pzcC5lcnJvci5wYXJhbXMuZW1wdHlCb2R5PWpzcDpwYXJhbXMgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBuZXN0ZWQganNwOnBhcmFtCitqc3AuZXJyb3IucGFyYW1zLmlsbGVnYWxDaGlsZD1qc3A6cGFyYW1zIG11c3Qgbm90IGhhdmUgYW55IG5lc3RlZCBlbGVtZW50cyBvdGhlciB0aGFuIGpzcDpwYXJhbQoranNwLmVycm9yLnBsdWdpbi5ub3R5cGU9dHlwZSBub3QgZGVjbGFyZWQgaW4ganNwOnBsdWdpbgoranNwLmVycm9yLnBsdWdpbi5iYWR0eXBlPUlsbGVnYWwgdmFsdWUgZm9yICd0eXBlJyBhdHRyaWJ1dGUgaW4ganNwOnBsdWdpbjogbXVzdCBiZSAnYmVhbicgb3IgJ2FwcGxldCcKK2pzcC5lcnJvci5wbHVnaW4ubm9jb2RlPWNvZGUgbm90IGRlY2xhcmVkIGluIGpzcDpwbHVnaW4KK2pzcC5lcnJvci5pc2Vfb25fY2xlYXI9SWxsZWdhbCB0byBjbGVhcigpIHdoZW4gYnVmZmVyIHNpemUgPT0gMAoranNwLmVycm9yLnNldHByb3BlcnR5LmJlYW5Ob3RGb3VuZD1zZXRQcm9wZXJ0eTogQmVhbiB7MH0gbm90IGZvdW5kCitqc3AuZXJyb3IuZ2V0cHJvcGVydHkuYmVhbk5vdEZvdW5kPWdldFByb3BlcnR5OiBCZWFuIHswfSBub3QgZm91bmQKK2pzcC5lcnJvci5zZXRwcm9wZXJ0eS5DbGFzc05vdEZvdW5kPXNldFByb3BlcnR5OiBDbGFzcyB7MH0gbm90IGZvdW5kCisjIHR5cG8gPworI2pzcC5lcnJvci5zZXRwcm9wZXJ0eS5pbnZhbGlkU2F5bnRheD1zZXRQcm9wZXJ0eTogY2FuJ3QgaGF2ZSBub24tbnVsbCB2YWx1ZSB3aGVuIHByb3BlcnR5PSoKK2pzcC5lcnJvci5zZXRwcm9wZXJ0eS5pbnZhbGlkU3ludGF4PXNldFByb3BlcnR5OiBjYW4ndCBoYXZlIG5vbi1udWxsIHZhbHVlIHdoZW4gcHJvcGVydHk9KgoranNwLmVycm9yLnNldHByb3BlcnR5LmJlYW5JbmZvTm90Rm91bmQ9c2V0cHJvcGVydHk6IGJlYW5JbmZvIGZvciBiZWFuIHswfSBub3QgZm91bmQKK2pzcC5lcnJvci5zZXRwcm9wZXJ0eS5wYXJhbU9yVmFsdWU9c2V0UHJvcGVydHk6IGVpdGhlciBwYXJhbSBvciB2YWx1ZSBjYW4gYmUgcHJlc2VudAoranNwLmVycm9yLnNldHByb3BlcnR5LmFycmF5VmFsPXNldFByb3BlcnR5OiBjYW4ndCBzZXQgYXJyYXkgcHJvcGVydHkgezB9IHRocm91Z2ggYSBzdHJpbmcgY29uc3RhbnQgdmFsdWUKK2pzcC53YXJuaW5nLmtlZXBnZW49V2FybmluZzogSW52YWxpZCB2YWx1ZSBmb3IgdGhlIGluaXRQYXJhbSBrZWVwZ2VuZXJhdGVkLiBXaWxsIHVzZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBcImZhbHNlXCIKK2pzcC53YXJuaW5nLnhwb3dlcmVkQnk9V2FybmluZzogSW52YWxpZCB2YWx1ZSBmb3IgdGhlIGluaXRQYXJhbSB4cG93ZXJlZEJ5LiBXaWxsIHVzZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBcImZhbHNlXCIKK2pzcC53YXJuaW5nLmVuYWJsZVBvb2xpbmc9V2FybmluZzogSW52YWxpZCB2YWx1ZSBmb3IgdGhlIGluaXRQYXJhbSBlbmFibGVQb29saW5nLiBXaWxsIHVzZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBcInRydWVcIgoranNwLndhcm5pbmcuaW52YWxpZFRhZ1Bvb2xTaXplPVdhcm5pbmc6IEludmFsaWQgdmFsdWUgZm9yIHRoZSBpbml0IHBhcmFtZXRlciBuYW1lZCB0YWdQb29sU2l6ZS4gV2lsbCB1c2UgZGVmYXVsdCBzaXplIG9mIHswfQoranNwLndhcm5pbmcubWFwcGVkRmlsZT1XYXJuaW5nOiBJbnZhbGlkIHZhbHVlIGZvciB0aGUgaW5pdFBhcmFtIG1hcHBlZEZpbGUuIFdpbGwgdXNlIHRoZSBkZWZhdWx0IHZhbHVlIG9mIFwiZmFsc2VcIgoranNwLndhcm5pbmcuc2VuZEVyclRvQ2xpZW50PVdhcm5pbmc6IEludmFsaWQgdmFsdWUgZm9yIHRoZSBpbml0UGFyYW0gc2VuZEVyclRvQ2xpZW50LiBXaWxsIHVzZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBcImZhbHNlXCIKK2pzcC53YXJuaW5nLmNsYXNzRGVidWdJbmZvPVdhcm5pbmc6IEludmFsaWQgdmFsdWUgZm9yIHRoZSBpbml0UGFyYW0gY2xhc3NkZWJ1Z2luZm8uIFdpbGwgdXNlIHRoZSBkZWZhdWx0IHZhbHVlIG9mIFwiZmFsc2VcIgoranNwLndhcm5pbmcuY2hlY2tJbnRlcnZhbD1XYXJuaW5nOiBJbnZhbGlkIHZhbHVlIGZvciB0aGUgaW5pdFBhcmFtIGNoZWNrSW50ZXJ2YWwuIFdpbGwgdXNlIHRoZSBkZWZhdWx0IHZhbHVlIG9mIFwiMzAwXCIgc2Vjb25kcworanNwLndhcm5pbmcubW9kaWZpY2F0aW9uVGVzdEludGVydmFsPVdhcm5pbmc6IEludmFsaWQgdmFsdWUgZm9yIHRoZSBpbml0UGFyYW0gbW9kaWZpY2F0aW9uVGVzdEludGVydmFsLiBXaWxsIHVzZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBcIjRcIiBzZWNvbmRzCitqc3Aud2FybmluZy5kZXZlbG9wbWVudD1XYXJuaW5nOiBJbnZhbGlkIHZhbHVlIGZvciB0aGUgaW5pdFBhcmFtIGRldmVsb3BtZW50LiBXaWxsIHVzZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBcInRydWVcIgoranNwLndhcm5pbmcuZm9yaz1XYXJuaW5nOiBJbnZhbGlkIHZhbHVlIGZvciB0aGUgaW5pdFBhcmFtIGZvcmsuIFdpbGwgdXNlIHRoZSBkZWZhdWx0IHZhbHVlIG9mIFwidHJ1ZVwiCitqc3Aud2FybmluZy5yZWxvYWRpbmc9V2FybmluZzogSW52YWxpZCB2YWx1ZSBmb3IgdGhlIGluaXRQYXJhbSByZWxvYWRpbmcuIFdpbGwgdXNlIHRoZSBkZWZhdWx0IHZhbHVlIG9mIFwidHJ1ZVwiCitqc3Aud2FybmluZy5kdW1wU21hcD1XYXJuaW5nOiBJbnZhbGlkIHZhbHVlIGZvciB0aGUgaW5pdFBhcmFtIGR1bXBTbWFwLiBXaWxsIHVzZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBcImZhbHNlXCIKK2pzcC53YXJuaW5nLmdlbmNoYXJhcnJheT1XYXJuaW5nOiBJbnZhbGlkIHZhbHVlIGZvciB0aGUgaW5pdFBhcmFtIGdlblN0ckFzQ2hhckFycmF5LiBXaWxsIHVzZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBcImZhbHNlXCIKK2pzcC53YXJuaW5nLnN1cHByZXNzU21hcD1XYXJuaW5nOiBJbnZhbGlkIHZhbHVlIGZvciB0aGUgaW5pdFBhcmFtIHN1cHByZXNzU21hcC4gV2lsbCB1c2UgdGhlIGRlZmF1bHQgdmFsdWUgb2YgXCJmYWxzZVwiCitqc3AuZXJyb3IuYmFkdGFnbGliPVVuYWJsZSB0byBvcGVuIHRhZ2xpYnJhcnkgezB9IDogezF9Citqc3AuZXJyb3IuYmFkR2V0UmVhZGVyPUNhbm5vdCBjcmVhdGUgYSByZWFkZXIgd2hlbiB0aGUgc3RyZWFtIGlzIG5vdCBidWZmZXJlZAoranNwLndhcm5pbmcudW5rbm93bi5lbGVtZW50LmluLnRhZ2xpYj1Vbmtub3duIGVsZW1lbnQgKHswfSkgaW4gdGFnbGliCitqc3Aud2FybmluZy51bmtub3duLmVsZW1lbnQuaW4udGFnPVVua25vd24gZWxlbWVudCAoezB9KSBpbiB0YWcKK2pzcC53YXJuaW5nLnVua25vd24uZWxlbWVudC5pbi5hdHRyaWJ1dGU9VW5rbm93biBlbGVtZW50ICh7MH0pIGluIGF0dHJpYnV0ZQoranNwLndhcm5pbmcudW5rbm93bi5lbGVtZW50LmluLnZhcmlhYmxlPVVua25vd24gZWxlbWVudCAoezB9KSBpbiB2YXJpYWJsZQoranNwLndhcm5pbmcudW5rbm93bi5lbGVtZW50LmluLnZhbGlkYXRvcj1Vbmtub3duIGVsZW1lbnQgKHswfSkgaW4gdmFsaWRhdG9yCitqc3Aud2FybmluZy51bmtub3duLmVsZW1lbnQuaW4uaW5pdFBhcmFtPVVua25vd24gZWxlbWVudCAoezB9KSBpbiB2YWxpZGF0b3IncyBpbml0LXBhcmFtCitqc3Aud2FybmluZy51bmtub3duLmVsZW1lbnQuaW4uZnVuY3Rpb249VW5rbm93biBlbGVtZW50ICh7MH0pIGluIGZ1bmN0aW9uCitqc3AuZXJyb3IubW9yZS50aGFuLm9uZS50YWdsaWI9TW9yZSB0aGFuIG9uZSB0YWdsaWIgaW4gdGhlIFRMRDogezB9Citqc3AuZXJyb3IudGVpY2xhc3MuaW5zdGFudGlhdGlvbj1GYWlsZWQgdG8gbG9hZCBvciBpbnN0YW50aWF0ZSBUYWdFeHRyYUluZm8gY2xhc3M6IHswfQoranNwLmVycm9yLm5vbl9udWxsX3RlaV9hbmRfdmFyX3N1YmVsZW1zPVRhZyB7MH0gaGFzIG9uZSBvciBtb3JlIHZhcmlhYmxlIHN1YmVsZW1lbnRzIGFuZCBhIFRhZ0V4dHJhSW5mbyBjbGFzcyB0aGF0IHJldHVybnMgb25lIG9yIG1vcmUgVmFyaWFibGVJbmZvCitqc3AuZXJyb3IucGFyc2UuZXJyb3IuaW4uVExEPVBhcnNlIEVycm9yIGluIHRoZSB0YWcgbGlicmFyeSBkZXNjcmlwdG9yOiB7MH0KK2pzcC5lcnJvci51bmFibGUudG8ub3Blbi5UTEQ9VW5hYmxlIHRvIG9wZW4gdGhlIHRhZyBsaWJyYXJ5IGRlc2NyaXB0b3I6IHswfQoranNwLmJ1ZmZlci5zaXplLnplcm89QnVmZmVyIHNpemUgPD0gMAoranNwLmVycm9yLmZpbGUubm90LmZvdW5kPUZpbGUgXCJ7MH1cIiBub3QgZm91bmQKK2pzcC5tZXNzYWdlLmNvcHlpbmd1cmk9Q29weWluZyB7MH0gaW50byB7MX0KK2pzcC5tZXNzYWdlLmh0bWxjb21tZW50PVxuU3RyaXBwaW5nIENvbW1lbnQ6IFx0ezB9Citqc3AubWVzc2FnZS5oYW5kbGluZ19kaXJlY3RpdmU9XG5IYW5kbGluZyBEaXJlY3RpdmU6IHswfVx0ezF9Citqc3AubWVzc2FnZS5oYW5kbGluZ19wbHVnaW49XG5QbHVnaW46IHswfQoranNwLm1lc3NhZ2UucGFja2FnZV9uYW1lX2lzPVBhY2thZ2UgbmFtZSBpczogezB9Citqc3AubWVzc2FnZS5jbGFzc19uYW1lX2lzPUNsYXNzIG5hbWUgaXM6IHswfQoranNwLm1lc3NhZ2UuamF2YV9maWxlX25hbWVfaXM9SmF2YSBmaWxlIG5hbWUgaXM6IHswfQoranNwLm1lc3NhZ2UuY2xhc3NfZmlsZV9uYW1lX2lzPUNsYXNzIGZpbGUgbmFtZSBpczogezB9Citqc3AubWVzc2FnZS5hY2NlcHRlZD1BY2NlcHRlZCB7MH0gYXQgezF9Citqc3AubWVzc2FnZS5hZGRpbmdfamFyPUFkZGluZyBqYXIgezB9IHRvIG15IGNsYXNzcGF0aAoranNwLm1lc3NhZ2UuY29tcGlsaW5nX3dpdGg9Q29tcGlsaW5nIHdpdGg6IHswfQoranNwLm1lc3NhZ2UudGVtcGxhdGVfdGV4dD10ZW1wbGF0ZSB0ZXh0Citqc3AuZXJyb3IubWlzc2luZ19hdHRyaWJ1dGU9QWNjb3JkaW5nIHRvIHRoZSBUTEQgb3IgdGhlIHRhZyBmaWxlLCBhdHRyaWJ1dGUgezB9IGlzIG1hbmRhdG9yeSBmb3IgdGFnIHsxfQoranNwLmVycm9yLmJhZF9hdHRyaWJ1dGU9QXR0cmlidXRlIHswfSBpbnZhbGlkIGZvciB0YWcgezF9IGFjY29yZGluZyB0byBUTEQKK2pzcC5lcnJvci50bGQudW5hYmxlX3RvX3JlYWQ9VW5hYmxlIHRvIHJlYWQgVExEIFwiezF9XCIgZnJvbSBKQVIgZmlsZSBcInswfVwiOiB7Mn0KK2pzcC5lcnJvci50bGQudW5hYmxlX3RvX2dldF9qYXI9VW5hYmxlIHRvIGdldCBKQVIgcmVzb3VyY2UgXCJ7MH1cIiBjb250YWluaW5nIFRMRDogezF9Citqc3AuZXJyb3IudGxkLm1pc3NpbmdfamFyPU1pc3NpbmcgSkFSIHJlc291cmNlIFwiezB9XCIgY29udGFpbmluZyBUTEQKK2pzcC5lcnJvci53ZWJ4bWxfbm90X2ZvdW5kPUNvdWxkIG5vdCBsb2NhdGUgd2ViLnhtbAoranNwLmNtZF9saW5lLnVzYWdlPVVzYWdlOiBqc3B0b3NlcnZsZXQgWy1kZCA8cGF0aC90by9vdXRwdXREaXJlY3Rvcnk+XSBbLWtlZXBnZW5lcmF0ZWRdIFwKKzwuanNwIGZpbGVzPgoranNwLm1lc3NhZ2UuY3BfaXM9Q2xhc3NwYXRoIHswfSBpczogezF9Citqc3AuZXJyb3IudW5hYmxlLnRvX2xvYWRfdGFnaGFuZGxlcl9jbGFzcz1VbmFibGUgdG8gbG9hZCB0YWcgaGFuZGxlciBjbGFzcyB7MH0gYmVjYXVzZSBvZiB7MX0KK2pzcC5lcnJvci51bmFibGUudG9fZmluZF9tZXRob2Q9VW5hYmxlIHRvIGZpbmQgc2V0dGVyIG1ldGhvZCBmb3IgYXR0cmlidXRlOiB7MH0KK2pzcC5lcnJvci51bmFibGUudG9fY29udmVydF9zdHJpbmc9VW5hYmxlIHRvIGNvbnZlcnQgYSBTdHJpbmcgdG8gezB9IGZvciBhdHRyaWJ1dGUgezF9Citqc3AuZXJyb3IudW5hYmxlLnRvX2ludHJvc3BlY3Q9VW5hYmxlIHRvIGludHJvc3BlY3Qgb24gdGFnIGhhbmRsZXIgY2xhc3M6IHswfSBiZWNhdXNlIG9mIHsxfQoranNwLmVycm9yLmJhZF90YWc9Tm8gdGFnIFwiezB9XCIgZGVmaW5lZCBpbiB0YWcgbGlicmFyeSBpbXBvcnRlZCB3aXRoIHByZWZpeCBcInsxfVwiCitqc3AuZXJyb3IueG1sLmJhZF90YWc9Tm8gdGFnIFwiezB9XCIgZGVmaW5lZCBpbiB0YWcgbGlicmFyeSBhc3NvY2lhdGVkIHdpdGggdXJpIFwiezF9XCIKK2pzcC5lcnJvci5iYWRfc3RyaW5nX0NoYXJhY3Rlcj1DYW5ub3QgZXh0cmFjdCBhIENoYXJhY3RlciBmcm9tIGEgemVybyBsZW5ndGggYXJyYXkKK2pzcC5lcnJvci5iYWRfc3RyaW5nX2NoYXI9Q2Fubm90IGV4dHJhY3QgYSBjaGFyIGZyb20gYSB6ZXJvIGxlbmd0aCBhcnJheQoranNwLndhcm5pbmcuY29tcGlsZXIuY2xhc3MuY2FudGNyZWF0ZT1DYW4ndCBjcmVhdGUgYW4gaW5zdGFuY2Ugb2Ygc3BlY2lmaWVkIGNvbXBpbGVyIHBsdWdpbiBjbGFzcyB7MH0gZHVlIHRvIHsxfS4gV2lsbCBkZWZhdWx0IHRvIFN1biBKYXZhIENvbXBpbGVyLgoranNwLndhcm5pbmcuY29tcGlsZXIuY2xhc3Mubm90Zm91bmQ9U3BlY2lmaWVkIGNvbXBpbGVyIHBsdWdpbiBjbGFzcyB7MH0gbm90IGZvdW5kLiBXaWxsIGRlZmF1bHQgdG8gU3VuIEphdmEgQ29tcGlsZXIuCitqc3Aud2FybmluZy5jb21waWxlci5wYXRoLm5vdGZvdW5kPVNwZWNpZmllZCBjb21waWxlciBwYXRoIHswfSBub3QgZm91bmQuIFdpbGwgZGVmYXVsdCB0byBzeXN0ZW0gUEFUSC4KK2pzcC5lcnJvci5qc3BjLnVyaXJvb3Rfbm90X2Rpcj1UaGUgLXVyaXJvb3Qgb3B0aW9uIG11c3Qgc3BlY2lmeSBhIHByZS1leGlzdGluZyBkaXJlY3RvcnkKK2pzcC5lcnJvci5qc3BjLm1pc3NpbmdUYXJnZXQ9TWlzc2luZyB0YXJnZXQ6IE11c3Qgc3BlY2lmeSAtd2ViYXBwIG9yIC11cmlyb290LCBvciBvbmUgb3IgbW9yZSBKU1AgcGFnZXMKK2pzcC5lcnJvci5qc3BjLm5vX3VyaXJvb3Q9VGhlIHVyaXJvb3QgaXMgbm90IHNwZWNpZmllZCBhbmQgY2Fubm90IGJlIGxvY2F0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIEpTUCBmaWxlKHMpCitqc3BjLmltcGxpY2l0LnVyaVJvb3Q9dXJpUm9vdCBpbXBsaWNpdGx5IHNldCB0byAiezB9IgoranNwYy51c2FnZT1Vc2FnZToganNwYyA8b3B0aW9ucz4gWy0tXSA8anNwIGZpbGVzPlxuXAord2hlcmUganNwIGZpbGVzIGlzXG5cCitcICAgIC13ZWJhcHAgPGRpcj4gICAgICBBIGRpcmVjdG9yeSBjb250YWluaW5nIGEgd2ViLWFwcCwgd2hvc2UgSlNQIHBhZ2VzXG5cCitcICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHByb2Nlc3NlZCByZWN1cnNpdmVseVxuXAorb3IgYW55IG51bWJlciBvZlxuXAorXCAgICA8ZmlsZT4gICAgICAgICAgICAgQSBmaWxlIHRvIGJlIHBhcnNlZCBhcyBhIEpTUCBwYWdlXG5cCit3aGVyZSBvcHRpb25zIGluY2x1ZGU6XG5cCitcICAgIC1oZWxwICAgICAgICAgICAgICBQcmludCB0aGlzIGhlbHAgbWVzc2FnZVxuXAorXCAgICAtdiAgICAgICAgICAgICAgICAgVmVyYm9zZSBtb2RlXG5cCitcICAgIC1kIDxkaXI+ICAgICAgICAgICBPdXRwdXQgRGlyZWN0b3J5IChkZWZhdWx0IC1EamF2YS5pby50bXBkaXIpXG5cCitcICAgIC1sICAgICAgICAgICAgICAgICBPdXRwdXRzIHRoZSBuYW1lIG9mIHRoZSBKU1AgcGFnZSB1cG9uIGZhaWx1cmVcblwKK1wgICAgLXMgICAgICAgICAgICAgICAgIE91dHB1dHMgdGhlIG5hbWUgb2YgdGhlIEpTUCBwYWdlIHVwb24gc3VjY2Vzc1xuXAorXCAgICAtcCA8bmFtZT4gICAgICAgICAgTmFtZSBvZiB0YXJnZXQgcGFja2FnZSAoZGVmYXVsdCBvcmcuYXBhY2hlLmpzcClcblwKK1wgICAgLWMgPG5hbWU+ICAgICAgICAgIE5hbWUgb2YgdGFyZ2V0IGNsYXNzIG5hbWUgKG9ubHkgYXBwbGllcyB0byBmaXJzdCBKU1AgcGFnZSlcblwKK1wgICAgLW1hcHBlZCAgICAgICAgICAgIEdlbmVyYXRlcyBzZXBhcmF0ZSB3cml0ZSgpIGNhbGxzIGZvciBlYWNoIEhUTUwgbGluZSBpbiB0aGUgSlNQXG5cCitcICAgIC1kaWVbI10gICAgICAgICAgICBHZW5lcmF0ZXMgYW4gZXJyb3IgcmV0dXJuIGNvZGUgKCMpIG9uIGZhdGFsIGVycm9ycyAoZGVmYXVsdCAxKVxuXAorXCAgICAtdXJpYmFzZSA8ZGlyPiAgICAgVGhlIHVyaSBkaXJlY3RvcnkgY29tcGlsYXRpb25zIHNob3VsZCBiZSByZWxhdGl2ZSB0b1xuXAorXCAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQgIi8iKVxuXAorXCAgICAtdXJpcm9vdCA8ZGlyPiAgICAgU2FtZSBhcyAtd2ViYXBwXG5cCitcICAgIC1jb21waWxlICAgICAgICAgICBDb21waWxlcyBnZW5lcmF0ZWQgc2VydmxldHNcblwKK1wgICAgLXdlYmluYyA8ZmlsZT4gICAgIENyZWF0ZXMgYSBwYXJ0aWFsIHNlcnZsZXQgbWFwcGluZ3MgaW4gdGhlIGZpbGVcblwKK1wgICAgLXdlYnhtbCA8ZmlsZT4gICAgIENyZWF0ZXMgYSBjb21wbGV0ZSB3ZWIueG1sIGluIHRoZSBmaWxlXG5cCitcICAgIC1pZXBsdWdpbiA8Y2xzaWQ+ICBKYXZhIFBsdWdpbiBjbGFzc2lkIGZvciBJbnRlcm5ldCBFeHBsb3JlclxuXAorXCAgICAtY2xhc3NwYXRoIDxwYXRoPiAgT3ZlcnJpZGVzIGphdmEuY2xhc3MucGF0aCBzeXN0ZW0gcHJvcGVydHlcblwKK1wgICAgLXhwb3dlcmVkQnkgICAgICAgIEFkZCBYLVBvd2VyZWQtQnkgcmVzcG9uc2UgaGVhZGVyXG5cCitcICAgIC10cmltU3BhY2VzICAgICAgICBUcmltIHNwYWNlcyBpbiB0ZW1wbGF0ZSB0ZXh0IGJldHdlZW4gYWN0aW9ucywgZGlyZWN0aXZlc1xuXAorCitqc3BjLndlYnhtbC5oZWFkZXI9PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PlxuXAorXG5cCis8IURPQ1RZUEUgd2ViLWFwcFxuXAorXCAgICBQVUJMSUMgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBXZWIgQXBwbGljYXRpb24gMi4zLy9FTiJcblwKK1wgICAgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL3dlYi1hcHBfMl8zLmR0ZCI+XG5cCis8IS0tXG5cCitBdXRvbWF0aWNhbGx5IGNyZWF0ZWQgYnkgVG9tY2F0IEpzcEMuXG5cCistLT5cblwKKzx3ZWItYXBwPlxuXAorXG4KK2pzcGMud2VieG1sLmZvb3Rlcj1cblwKKzwvd2ViLWFwcD5cblwKK1xuCitqc3BjLndlYmluYy5oZWFkZXI9XG5cCis8IS0tXG5cCitBdXRvbWF0aWNhbGx5IGNyZWF0ZWQgYnkgVG9tY2F0IEpzcEMuXG5cCitQbGFjZSB0aGlzIGZyYWdtZW50IGluIHRoZSB3ZWIueG1sIGJlZm9yZSBhbGwgaWNvbiwgZGlzcGxheS1uYW1lLFxuXAorZGVzY3JpcHRpb24sIGRpc3RyaWJ1dGFibGUsIGFuZCBjb250ZXh0LXBhcmFtIGVsZW1lbnRzLlxuXAorLS0+XG4KK2pzcGMud2ViaW5jLmZvb3Rlcj1cblwKKzwhLS1cblwKK0FsbCBzZXNzaW9uLWNvbmZpZywgbWltZS1tYXBwaW5nLCB3ZWxjb21lLWZpbGUtbGlzdCwgZXJyb3ItcGFnZSwgdGFnbGliLFxuXAorcmVzb3VyY2UtcmVmLCBzZWN1cml0eS1jb25zdHJhaW50LCBsb2dpbi1jb25maWcsIHNlY3VyaXR5LXJvbGUsXG5cCitlbnYtZW50cnksIGFuZCBlamItcmVmIGVsZW1lbnRzIHNob3VsZCBmb2xsb3cgdGhpcyBmcmFnbWVudC5cblwKKy0tPlxuCitqc3BjLndlYmluYy5pbnNlcnRFbmQ9PCEtLSBKU1BDIHNlcnZsZXQgbWFwcGluZ3MgZW5kIC0tPgoranNwYy53ZWJpbmMuaW5zZXJ0U3RhcnQ9PCEtLSBKU1BDIHNlcnZsZXQgbWFwcGluZ3Mgc3RhcnQgLS0+Citqc3BjLmVycm9yLmphc3BlckV4Y2VwdGlvbj1lcnJvci10aGUgZmlsZSAnJ3swfScnIGdlbmVyYXRlZCB0aGUgZm9sbG93aW5nIHBhcnNlIGV4Y2VwdGlvbjogezF9Citqc3BjLmVycm9yLmdlbmVyYWxFeGNlcHRpb249RVJST1ItdGhlIGZpbGUgJyd7MH0nJyBnZW5lcmF0ZWQgdGhlIGZvbGxvd2luZyBnZW5lcmFsIGV4Y2VwdGlvbjoKK2pzcGMuZXJyb3IuZmlsZURvZXNOb3RFeGlzdD1UaGUgZmlsZSBhcmd1bWVudCAnJ3swfScnIGRvZXMgbm90IGV4aXN0Citqc3BjLmVycm9yLmVtcHR5V2ViQXBwPS13ZWJhcHAgcmVxdWlyZXMgYSB0cmFpbGluZyBmaWxlIGFyZ3VtZW50Citqc3AuZXJyb3IubGlicmFyeS5pbnZhbGlkPUpTUCBwYWdlIGlzIGludmFsaWQgYWNjb3JkaW5nIHRvIGxpYnJhcnkgezB9OiB7MX0KK2pzcC5lcnJvci50bHZjbGFzcy5pbnN0YW50aWF0aW9uPUZhaWxlZCB0byBsb2FkIG9yIGluc3RhbnRpYXRlIFRhZ0xpYnJhcnlWYWxpZGF0b3IgY2xhc3M6IHswfQoranNwLmVycm9yLnRsdi5pbnZhbGlkLnBhZ2U9VmFsaWRhdGlvbiBlcnJvciBtZXNzYWdlcyBmcm9tIFRhZ0xpYnJhcnlWYWxpZGF0b3IgZm9yIHswfQoranNwLmVycm9yLnRlaS5pbnZhbGlkLmF0dHJpYnV0ZXM9VmFsaWRhdGlvbiBlcnJvciBtZXNzYWdlcyBmcm9tIFRhZ0V4dHJhSW5mbyBmb3IgezB9Citqc3AucGFyc2VyLnNheC5wcm9wZXJ0eW5vdHN1cHBvcnRlZD1TQVggcHJvcGVydHkgbm90IHN1cHBvcnRlZDogezB9Citqc3AucGFyc2VyLnNheC5wcm9wZXJ0eW5vdHJlY29nbml6ZWQ9U0FYIHByb3BlcnR5IG5vdCByZWNvZ25pemVkOiB7MH0KK2pzcC5wYXJzZXIuc2F4LmZlYXR1cmVub3RzdXBwb3J0ZWQ9U0FYIGZlYXR1cmUgbm90IHN1cHBvcnRlZDogezB9Citqc3AucGFyc2VyLnNheC5mZWF0dXJlbm90cmVjb2duaXplZD1TQVggZmVhdHVyZSBub3QgcmVjb2duaXplZDogezB9Citqc3AuZXJyb3Iubm8ubW9yZS5jb250ZW50PUVuZCBvZiBjb250ZW50IHJlYWNoZWQgd2hpbGUgbW9yZSBwYXJzaW5nIHJlcXVpcmVkOiB0YWcgbmVzdGluZyBlcnJvcj8KK2pzcC5lcnJvci5wYXJzZS54bWw9WE1MIHBhcnNpbmcgZXJyb3Igb24gZmlsZSB7MH0KK2pzcC5lcnJvci5wYXJzZS54bWwubGluZT1YTUwgcGFyc2luZyBlcnJvciBvbiBmaWxlIHswfTogKGxpbmUgezF9LCBjb2wgezJ9KQoranNwLmVycm9yLnBhcnNlLnhtbC5zY3JpcHRpbmcuaW52YWxpZC5ib2R5PUJvZHkgb2YgezB9IGVsZW1lbnQgbXVzdCBub3QgY29udGFpbiBhbnkgWE1MIGVsZW1lbnRzCitqc3AuZXJyb3IuaW50ZXJuYWwudGxkaW5pdD1VbmFibGUgdG8gaW5pdGlhbGl6ZSBUbGRMb2NhdGlvbnNDYWNoZTogezB9Citqc3AuZXJyb3IuaW50ZXJuYWwuZmlsZW5vdGZvdW5kPUludGVybmFsIEVycm9yOiBGaWxlIHswfSBub3QgZm91bmQKK2pzcC5lcnJvci5pbnRlcm5hbC5ldmFsdWF0b3Jfbm90X2ZvdW5kPUludGVybmFsIGVycm9yOiB1bmFibGUgdG8gbG9hZCBleHByZXNzaW9uIGV2YWx1YXRvcgoranNwLmVycm9yLnBhcnNlLnhtbC5pbnZhbGlkUHVibGljSWQ9SW52YWxpZCBQVUJMSUMgSUQ6IHswfQoranNwLmVycm9yLmluY2x1ZGUuZmx1c2guaW52YWxpZC52YWx1ZT1JbnZhbGlkIHZhbHVlIGZvciB0aGUgZmx1c2ggYXR0cmlidXRlOiB7MH0KK2pzcC5lcnJvci51bnN1cHBvcnRlZC5lbmNvZGluZz1VbnN1cHBvcnRlZCBlbmNvZGluZzogezB9Cit0bGQuZXJyb3IudmFyaWFibGVOb3RBbGxvd2VkPUl0IGlzIGFuIGVycm9yIGZvciBhIHRhZyB0aGF0IGhhcyBvbmUgb3IgbW9yZSB2YXJpYWJsZSBzdWJlbGVtZW50cyB0byBoYXZlIGEgVGFnRXh0cmFJbmZvIGNsYXNzIHRoYXQgcmV0dXJucyBhIG5vbi1udWxsIG9iamVjdC4KK2pzcC5lcnJvci50bGRJbldlYkRvdFhtbE5vdEZvdW5kPUNvdWxkIG5vdCBsb2NhdGUgVExEIHsxfSBmb3IgVVJJIHswfSBzcGVjaWZpZWQgaW4gd2ViLnhtbAoranNwLmVycm9yLnRhZ2xpYkRpcmVjdGl2ZS5hYnNVcmlDYW5ub3RCZVJlc29sdmVkPVRoZSBhYnNvbHV0ZSB1cmk6IHswfSBjYW5ub3QgYmUgcmVzb2x2ZWQgaW4gZWl0aGVyIHdlYi54bWwgb3IgdGhlIGphciBmaWxlcyBkZXBsb3llZCB3aXRoIHRoaXMgYXBwbGljYXRpb24KK2pzcC5lcnJvci50YWdsaWJEaXJlY3RpdmUubWlzc2luZy5sb2NhdGlvbj1OZWl0aGVyIFwndXJpXCcgbm9yIFwndGFnZGlyXCcgYXR0cmlidXRlIHNwZWNpZmllZAoranNwLmVycm9yLnRhZ2xpYkRpcmVjdGl2ZS5ib3RoX3VyaV9hbmRfdGFnZGlyPUJvdGggXCd1cmlcJyBhbmQgXCd0YWdkaXJcJyBhdHRyaWJ1dGVzIHNwZWNpZmllZAoranNwLmVycm9yLmludmFsaWQudGFnZGlyPVRhZyBmaWxlIGRpcmVjdG9yeSB7MH0gZG9lcyBub3Qgc3RhcnQgd2l0aCBcIi9XRUItSU5GL3RhZ3NcIgoranNwLmVycm9yLnVudGVybWluYXRlZC51c2VyLnRhZz1VbnRlcm1pbmF0ZWQgdXNlci1kZWZpbmVkIHRhZzogZW5kaW5nIHRhZyB7MH0gbm90IGZvdW5kIG9yIGluY29ycmVjdGx5IG5lc3RlZAorI2pzcHguZXJyb3IudGVtcGxhdGVEYXRhTm90SW5Kc3BDZGF0YT1WYWxpZGF0aW9uIEVycm9yOiBFbGVtZW50ICZsdDt7MH0mZ3Q7IGNhbm5vdCBoYXZlIHRlbXBsYXRlIGRhdGEuIFRlbXBsYXRlIGRhdGEgbXVzdCBiZSBlbmNhcHN1bGF0ZWQgd2l0aGluIGEgJmx0O2pzcDpjZGF0YSZndDsgZWxlbWVudC4gW0pTUDEuMiBQRkQgc2VjdGlvbiA1LjEuOV1cblRlbXBsYXRlIGRhdGEgaW4gZXJyb3I6IHsxfQoranNweC5lcnJvci50ZW1wbGF0ZURhdGFOb3RJbkpzcENkYXRhPVZhbGlkYXRpb24gRXJyb3I6IEVsZW1lbnQgJmx0O3swfSZndDsgY2Fubm90IGhhdmUgdGVtcGxhdGUgZGF0YS4gVGVtcGxhdGUgZGF0YSBtdXN0IGJlIGVuY2Fwc3VsYXRlZCB3aXRoaW4gYSAmbHQ7anNwOnRleHQmZ3Q7IGVsZW1lbnQuIFtKU1AxLjIgUEZEIHNlY3Rpb24gNS4xLjldXG5UZW1wbGF0ZSBkYXRhIGluIGVycm9yOiB7MX0KKyNFcnJvciB3aGlsZSBwcm9jZXNzaW5nIHRhZ2xpYiBqYXIgZmlsZSB7MH06IHsxfQoranNwLmVycm9yLnRhZ2xpYi5yZXNlcnZlZC5wcmVmaXg9VGhlIHRhZ2xpYiBwcmVmaXggezB9IGlzIHJlc2VydmVkCitqc3AuZXJyb3IuaW52YWxpZC5qYXZhRW5jb2Rpbmc9SW52YWxpZCBqYXZhIGVuY29kaW5ncy4gVHJpZWQgezB9IGFuZCB0aGVuIHsxfS4gQm90aCBmYWlsZWQuCitqc3AuZXJyb3IubmVlZEFsdGVybmF0ZUphdmFFbmNvZGluZz1EZWZhdWx0IGphdmEgZW5jb2RpbmcgezB9IGlzIGludmFsaWQgb24geW91ciBqYXZhIHBsYXRmb3JtLiBBbiBhbHRlcm5hdGUgY2FuIGJlIHNwZWNpZmllZCB2aWEgdGhlICdqYXZhRW5jb2RpbmcnIHBhcmFtZXRlciBvZiBKc3BTZXJ2bGV0LgorI0Vycm9yIHdoZW4gY29tcGlsaW5nLCB1c2VkIGZvciBqc3AgbGluZSBudW1iZXIgZXJyb3IgbWVzc2FnZXMKK2pzcC5lcnJvci5zaW5nbGUubGluZS5udW1iZXI9QW4gZXJyb3Igb2NjdXJyZWQgYXQgbGluZTogezB9IGluIHRoZSBqc3AgZmlsZTogezF9Citqc3AuZXJyb3IubXVsdGlwbGUubGluZS5udW1iZXI9XG5cbkFuIGVycm9yIG9jY3VycmVkIGJldHdlZW4gbGluZXM6IHswfSBhbmQgezF9IGluIHRoZSBqc3AgZmlsZTogezJ9XG5cbgoranNwLmVycm9yLmNvcnJlc3BvbmRpbmcuc2VydmxldD1HZW5lcmF0ZWQgc2VydmxldCBlcnJvcjpcbgoranNwLmVycm9yLmVtcHR5LmJvZHkubm90LmFsbG93ZWQ9RW1wdHkgYm9keSBub3QgYWxsb3dlZCBmb3IgezB9Citqc3AuZXJyb3IuanNwYm9keS5yZXF1aXJlZD1NdXN0IHVzZSBqc3A6Ym9keSB0byBzcGVjaWZ5IHRhZyBib2R5IGZvciB7MH0gaWYganNwOmF0dHJpYnV0ZSBpcyB1c2VkLgoranNwLmVycm9yLmpzcGJvZHkuZW1wdHlib2R5Lm9ubHk9VGhlIHswfSB0YWcgY2FuIG9ubHkgaGF2ZSBqc3A6YXR0cmlidXRlIGluIGl0cyBib2R5LgoranNwLmVycm9yLm5vLnNjcmlwdGxldHM9U2NyaXB0aW5nIGVsZW1lbnRzICggJmx0OyUhLCAmbHQ7anNwOmRlY2xhcmF0aW9uLCAmbHQ7JT0sICZsdDtqc3A6ZXhwcmVzc2lvbiwgJmx0OyUsICZsdDtqc3A6c2NyaXB0bGV0ICkgYXJlIGRpc2FsbG93ZWQgaGVyZS4KK2pzcC5lcnJvci5pbnRlcm5hbC51bmV4cGVjdGVkX25vZGVfdHlwZT1JbnRlcm5hbCBFcnJvcjogVW5leHBlY3RlZCBub2RlIHR5cGUgZW5jb3VudGVyZWQKK2pzcC5lcnJvci50bGQuZm4uaW52YWxpZC5zaWduYXR1cmU9SW52YWxpZCBzeW50YXggZm9yIGZ1bmN0aW9uIHNpZ25hdHVyZSBpbiBUTEQuICBUYWcgTGlicmFyeTogezB9LCBGdW5jdGlvbjogezF9Citqc3AuZXJyb3IudGxkLmZuLmR1cGxpY2F0ZS5uYW1lPUR1cGxpY2F0ZSBmdW5jdGlvbiBuYW1lIHswfSBpbiB0YWcgbGlicmFyeSB7MX0KK2pzcC5lcnJvci50bGQuZm4uaW52YWxpZC5zaWduYXR1cmUuY29tbWFleHBlY3RlZD1JbnZhbGlkIHN5bnRheCBmb3IgZnVuY3Rpb24gc2lnbmF0dXJlIGluIFRMRC4gIENvbW1hICcsJyBleHBlY3RlZC4gIFRhZyBMaWJyYXJ5OiB7MH0sIEZ1bmN0aW9uOiB7MX0uCitqc3AuZXJyb3IudGxkLmZuLmludmFsaWQuc2lnbmF0dXJlLnBhcmVuZXhwZWN0ZWQ9SW52YWxpZCBzeW50YXggZm9yIGZ1bmN0aW9uIHNpZ25hdHVyZSBpbiBUTEQuICBQYXJlbnRoZXNpcyAnKCcgZXhwZWN0ZWQuICBUYWcgTGlicmFyeTogezB9LCBGdW5jdGlvbjogezF9LgoranNwLmVycm9yLnRsZC5tYW5kYXRvcnkuZWxlbWVudC5taXNzaW5nPU1hbmRhdG9yeSBUTEQgZWxlbWVudCBtaXNzaW5nIG9yIGVtcHR5OiB7MH0KK2pzcC5lcnJvci5keW5hbWljLmF0dHJpYnV0ZXMubm90LmltcGxlbWVudGVkPVRoZSB7MH0gdGFnIGRlY2xhcmVzIHRoYXQgaXQgYWNjZXB0cyBkeW5hbWljIGF0dHJpYnV0ZXMgYnV0IGRvZXMgbm90IGltcGxlbWVudCB0aGUgcmVxdWlyZWQgaW50ZXJmYWNlCitqc3AuZXJyb3Iubm9tYXRjaGluZy5mcmFnbWVudD1DYW5ub3QgZmluZCBhbiBhdHRyaWJ1dGUgZGlyZWN0aXZlICh3aXRoIG5hbWU9ezB9IGFuZCBmcmFnbWVudD10cnVlKSBwcmlvciB0byB0aGUgZnJhZ21lbnQgZGlyZWN0aXZlLgoranNwLmVycm9yLmF0dHJpYnV0ZS5ub2VxdWFsPWVxdWFsIHN5bWJvbCBleHBlY3RlZAoranNwLmVycm9yLmF0dHJpYnV0ZS5ub3F1b3RlPXF1b3RlIHN5bWJvbCBleHBlY3RlZAoranNwLmVycm9yLmF0dHJpYnV0ZS51bnRlcm1pbmF0ZWQ9YXR0cmlidXRlIGZvciB7MH0gaXMgbm90IHByb3Blcmx5IHRlcm1pbmF0ZWQKK2pzcC5lcnJvci5taXNzaW5nLnRhZ0luZm89VGFnSW5mbyBvYmplY3QgZm9yIHswfSBpcyBtaXNzaW5nIGZyb20gVExECitqc3AuZXJyb3IuZnJhZ21lbnR3aXRodHlwZT1DYW5ub3Qgc3BlY2lmeSBib3RoICdmcmFnbWVudCcgYW5kICd0eXBlJyBhdHRyaWJ1dGVzLiAgSWYgJ2ZyYWdtZW50JyBpcyBwcmVzZW50LCAndHlwZScgaXMgZml4ZWQgYXMgJ2phdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5Kc3BGcmFnbWVudCcKK2pzcC5lcnJvci5mcmFnbWVudHdpdGhydGV4cHJ2YWx1ZT1DYW5ub3Qgc3BlY2lmeSBib3RoICdmcmFnbWVudCcgYW5kICdydGV4cHJ2YWx1ZScgYXR0cmlidXRlcy4gIElmICdmcmFnbWVudCcgaXMgcHJlc2VudCwgJ3J0ZXhwcnZhbHVlJyBpcyBmaXhlZCBhcyAndHJ1ZScKK2pzcC5lcnJvci5mcmFnbWVudFdpdGhEZWNsYXJlT3JTY29wZT1Cb3RoICdmcmFnbWVudCcgYW5kICdkZWNsYXJlJyBvciAnc2NvcGUnIGF0dHJpYnV0ZXMgc3BlY2lmaWVkIGluIHZhcmlhYmxlIGRpcmVjdGl2ZQoranNwLmVycm9yLnZhcl9hbmRfdmFyUmVhZGVyPU9ubHkgb25lIG9mIFwndmFyXCcgb3IgXCd2YXJSZWFkZXJcJyBtYXkgYmUgc3BlY2lmaWVkCitqc3AuZXJyb3IubWlzc2luZ192YXJfb3JfdmFyUmVhZGVyPU1pc3NpbmcgXCd2YXJcJyBvciBcJ3ZhclJlYWRlclwnIGF0dHJpYnV0ZQoranNwLndhcm5pbmcuYmFkLnVybHBhdHRlcm4ucHJvcGVydHlncm91cD1CYWQgdmFsdWUgezB9IGluIHRoZSB1cmwtcGF0dGVybiBzdWJlbGVtZW50IGluIHdlYi54bWwKK2pzcC5lcnJvci51bmtub3duX2F0dHJpYnV0ZV90eXBlPVVua25vd24gYXR0cmlidXRlIHR5cGUgKHsxfSkgZm9yIGF0dHJpYnV0ZSB7MH0uCitqc3AuZXJyb3IuanNwZWxlbWVudC5taXNzaW5nLm5hbWU9TWFuZGF0b3J5IFhNTC1zdHlsZSBcJ25hbWVcJyBhdHRyaWJ1dGUgbWlzc2luZworanNwLmVycm9yLnhtbG5zLnJlZGVmaW5pdGlvbi5ub3RpbXBsZW1lbnRlZD1JbnRlcm5hbCBlcnJvcjogQXR0ZW1wdCB0byByZWRlZmluZSB4bWxuczp7MH0uICBSZWRlZmluaXRpb24gb2YgbmFtZXNwYWNlcyBpcyBub3QgaW1wbGVtZW50ZWQuCitqc3AuZXJyb3IuY291bGQubm90LmFkZC50YWdsaWJyYXJpZXM9Q291bGQgbm90IGFkZCBvbmUgb3IgbW9yZSB0YWcgbGlicmFyaWVzLgoranNwLmVycm9yLmR1cGxpY2F0ZS5uYW1lLmpzcGF0dHJpYnV0ZT1UaGUgYXR0cmlidXRlIHswfSBzcGVjaWZpZWQgaW4gdGhlIHN0YW5kYXJkIG9yIGN1c3RvbSBhY3Rpb24gYWxzbyBhcHBlYXJzIGFzIHRoZSB2YWx1ZSBvZiB0aGUgbmFtZSBhdHRyaWJ1dGUgaW4gdGhlIGVuY2xvc2VkIGpzcDphdHRyaWJ1dGUKK2pzcC5lcnJvci5ub3QuaW4udGVtcGxhdGU9ezB9IG5vdCBhbGxvd2VkIGluIGEgdGVtcGxhdGUgdGV4dCBib2R5LgoranNwLmVycm9yLmJhZFN0YW5kYXJkQWN0aW9uPUludmFsaWQgc3RhbmRhcmQgYWN0aW9uCitqc3AuZXJyb3IueG1sLmJhZFN0YW5kYXJkQWN0aW9uPUludmFsaWQgc3RhbmRhcmQgYWN0aW9uOiB7MH0KK2pzcC5lcnJvci50YWdkaXJlY3RpdmUuYmFkYm9keWNvbnRlbnQ9SW52YWxpZCBib2R5LWNvbnRlbnQgKHswfSkgaW4gdGFnIGRpcmVjdGl2ZQoranNwLmVycm9yLnNpbXBsZXRhZy5iYWRib2R5Y29udGVudD1UaGUgVExEIGZvciB0aGUgY2xhc3MgezB9IHNwZWNpZmllcyBhbiBpbnZhbGlkIGJvZHktY29udGVudCAoSlNQKSBmb3IgYSBTaW1wbGVUYWcuCitqc3AuZXJyb3IuY29uZmlnX3BhZ2VkaXJfZW5jb2RpbmdfbWlzbWF0Y2g9UGFnZS1lbmNvZGluZyBzcGVjaWZpZWQgaW4ganNwLXByb3BlcnR5LWdyb3VwICh7MH0pIGlzIGRpZmZlcmVudCBmcm9tIHRoYXQgc3BlY2lmaWVkIGluIHBhZ2UgZGlyZWN0aXZlICh7MX0pCitqc3AuZXJyb3IucHJvbG9nX3BhZ2VkaXJfZW5jb2RpbmdfbWlzbWF0Y2g9UGFnZS1lbmNvZGluZyBzcGVjaWZpZWQgaW4gWE1MIHByb2xvZyAoezB9KSBpcyBkaWZmZXJlbnQgZnJvbSB0aGF0IHNwZWNpZmllZCBpbiBwYWdlIGRpcmVjdGl2ZSAoezF9KQoranNwLmVycm9yLnByb2xvZ19jb25maWdfZW5jb2RpbmdfbWlzbWF0Y2g9UGFnZS1lbmNvZGluZyBzcGVjaWZpZWQgaW4gWE1MIHByb2xvZyAoezB9KSBpcyBkaWZmZXJlbnQgZnJvbSB0aGF0IHNwZWNpZmllZCBpbiBqc3AtcHJvcGVydHktZ3JvdXAgKHsxfSkKK2pzcC5lcnJvci5hdHRyaWJ1dGUuY3VzdG9tLm5vbl9ydF93aXRoX2V4cHI9QWNjb3JkaW5nIHRvIFRMRCBvciBhdHRyaWJ1dGUgZGlyZWN0aXZlIGluIHRhZyBmaWxlLCBhdHRyaWJ1dGUgezB9IGRvZXMgbm90IGFjY2VwdCBhbnkgZXhwcmVzc2lvbnMKK2pzcC5lcnJvci5hdHRyaWJ1dGUuc3RhbmRhcmQubm9uX3J0X3dpdGhfZXhwcj1UaGUgezB9IGF0dHJpYnV0ZSBvZiB0aGUgezF9IHN0YW5kYXJkIGFjdGlvbiBkb2VzIG5vdCBhY2NlcHQgYW55IGV4cHJlc3Npb25zCitqc3AuZXJyb3Iuc2NyaXB0aW5nLnZhcmlhYmxlLm1pc3NpbmdfbmFtZT1VbmFibGUgdG8gZGV0ZXJtaW5lIHNjcmlwdGluZyB2YXJpYWJsZSBuYW1lIGZyb20gYXR0cmlidXRlIHswfQoramFzcGVyLmVycm9yLmVtcHR5Ym9keWNvbnRlbnQubm9uZW1wdHk9QWNjb3JkaW5nIHRvIFRMRCwgdGFnIHswfSBtdXN0IGJlIGVtcHR5LCBidXQgaXMgbm90Citqc3AuZXJyb3IudGFnZmlsZS5uYW1lTm90VW5pcXVlPVRoZSB2YWx1ZSBvZiB7MH0gYW5kIHRoZSB2YWx1ZSBvZiB7MX0gaW4gbGluZSB7Mn0gYXJlIHRoZSBzYW1lLgoranNwLmVycm9yLnRhZ2ZpbGUubmFtZUZyb20ubm9BdHRyaWJ1dGU9Q2Fubm90IGZpbmQgYW4gYXR0cmlidXRlIGRpcmVjdGl2ZSB3aXRoIGEgbmFtZSBhdHRyaWJ1dGUgd2l0aCBhIHZhbHVlIFwiezB9XCIsIHRoZSB2YWx1ZSBvZiB0aGlzIG5hbWUtZnJvbS1hdHRyaWJ1dGUgYXR0cmlidXRlLgoranNwLmVycm9yLnRhZ2ZpbGUubmFtZUZyb20uYmFkQXR0cmlidXRlPVRoZSBhdHRyaWJ1dGUgZGlyZWN0aXZlIChkZWNsYXJlZCBpbiBsaW5lIHsxfSBhbmQgd2hvc2UgbmFtZSBhdHRyaWJ1dGUgaXMgXCJ7MH1cIiwgdGhlIHZhbHVlIG9mIHRoaXMgbmFtZS1mcm9tLWF0dHJpYnV0ZSBhdHRyaWJ1dGUpIG11c3QgYmUgb2YgdHlwZSBqYXZhLmxhbmcuU3RyaW5nLCBpcyBcInJlcXVpcmVkXCIgYW5kIG5vdCBhIFwicnRleHBydmFsdWVcIi4KK2pzcC5lcnJvci5wYWdlLm5vU2Vzc2lvbj1DYW5ub3QgYWNjZXNzIHNlc3Npb24gc2NvcGUgaW4gcGFnZSB0aGF0IGRvZXMgbm90IHBhcnRpY2lwYXRlIGluIGFueSBzZXNzaW9uCitqc3AuZXJyb3IudXNlQmVhbi5ub1Nlc3Npb249SWxsZWdhbCBmb3IgdXNlQmVhbiB0byB1c2Ugc2Vzc2lvbiBzY29wZSB3aGVuIEpTUCBwYWdlIGRlY2xhcmVzICh2aWEgcGFnZSBkaXJlY3RpdmUpIHRoYXQgaXQgZG9lcyBub3QgcGFydGljaXBhdGUgaW4gc2Vzc2lvbnMKK2pzcC5lcnJvci54bWwuZW5jb2RpbmdCeXRlT3JkZXJVbnN1cHBvcnRlZCA9IEdpdmVuIGJ5dGUgb3JkZXIgZm9yIGVuY29kaW5nIFwiezB9XCIgaXMgbm90IHN1cHBvcnRlZC4KK2pzcC5lcnJvci54bWwuZW5jb2RpbmdEZWNsSW52YWxpZCA9IEludmFsaWQgZW5jb2RpbmcgbmFtZSBcInswfVwiLgoranNwLmVycm9yLnhtbC5lbmNvZGluZ0RlY2xSZXF1aXJlZCA9IFRoZSBlbmNvZGluZyBkZWNsYXJhdGlvbiBpcyByZXF1aXJlZCBpbiB0aGUgdGV4dCBkZWNsYXJhdGlvbi4KK2pzcC5lcnJvci54bWwubW9yZVBzZXVkb0F0dHJpYnV0ZXMgPSBtb3JlIHBzZXVkbyBhdHRyaWJ1dGVzIGlzIGV4cGVjdGVkLgoranNwLmVycm9yLnhtbC5ub01vcmVQc2V1ZG9BdHRyaWJ1dGVzID0gbm8gbW9yZSBwc2V1ZG8gYXR0cmlidXRlcyBpcyBhbGxvd2VkLgoranNwLmVycm9yLnhtbC52ZXJzaW9uSW5mb1JlcXVpcmVkID0gVGhlIHZlcnNpb24gaXMgcmVxdWlyZWQgaW4gdGhlIFhNTCBkZWNsYXJhdGlvbi4KK2pzcC5lcnJvci54bWwueG1sRGVjbFVudGVybWluYXRlZCA9IFRoZSBYTUwgZGVjbGFyYXRpb24gbXVzdCBlbmQgd2l0aCBcIj8+XCIuCitqc3AuZXJyb3IueG1sLnJlc2VydmVkUElUYXJnZXQgPSBUaGUgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiB0YXJnZXQgbWF0Y2hpbmcgXCJbeFhdW21NXVtsTF1cIiBpcyBub3QgYWxsb3dlZC4KK2pzcC5lcnJvci54bWwuc3BhY2VSZXF1aXJlZEluUEkgPSBXaGl0ZSBzcGFjZSBpcyByZXF1aXJlZCBiZXR3ZWVuIHRoZSBwcm9jZXNzaW5nIGluc3RydWN0aW9uIHRhcmdldCBhbmQgZGF0YS4KK2pzcC5lcnJvci54bWwuaW52YWxpZENoYXJJbkNvbnRlbnQgPSBBbiBpbnZhbGlkIFhNTCBjaGFyYWN0ZXIgKFVuaWNvZGU6IDB4ezB9KSB3YXMgZm91bmQgaW4gdGhlIGVsZW1lbnQgY29udGVudCBvZiB0aGUgZG9jdW1lbnQuCitqc3AuZXJyb3IueG1sLnNwYWNlUmVxdWlyZWRCZWZvcmVTdGFuZGFsb25lID0gV2hpdGUgc3BhY2UgaXMgcmVxdWlyZWQgYmVmb3JlIHRoZSBlbmNvZGluZyBwc2V1ZG8gYXR0cmlidXRlIGluIHRoZSBYTUwgZGVjbGFyYXRpb24uCitqc3AuZXJyb3IueG1sLnNkRGVjbEludmFsaWQgPSBUaGUgc3RhbmRhbG9uZSBkb2N1bWVudCBkZWNsYXJhdGlvbiB2YWx1ZSBtdXN0IGJlIFwieWVzXCIgb3IgXCJub1wiLCBub3QgXCJ7MH1cIi4KK2pzcC5lcnJvci54bWwuaW52YWxpZENoYXJJblBJID0gQW4gaW52YWxpZCBYTUwgY2hhcmFjdGVyIChVbmljb2RlOiAweHswfSkgd2FzIGZvdW5kIGluIHRoZSBwcm9jZXNzaW5nIGluc3RydWN0aW9uLgoranNwLmVycm9yLnhtbC52ZXJzaW9uTm90U3VwcG9ydGVkID0gWE1MIHZlcnNpb24gXCJ7MH1cIiBpcyBub3Qgc3VwcG9ydGVkLCBvbmx5IFhNTCAxLjAgaXMgc3VwcG9ydGVkLgoranNwLmVycm9yLnhtbC5wc2V1ZG9BdHRyTmFtZUV4cGVjdGVkID0gYSBwc2V1ZG8gYXR0cmlidXRlIG5hbWUgaXMgZXhwZWN0ZWQuCitqc3AuZXJyb3IueG1sLmV4cGVjdGVkQnl0ZSA9IEV4cGVjdGVkIGJ5dGUgezB9IG9mIHsxfS1ieXRlIFVURi04IHNlcXVlbmNlLgoranNwLmVycm9yLnhtbC5pbnZhbGlkQnl0ZSA9IEludmFsaWQgYnl0ZSB7MH0gb2YgezF9LWJ5dGUgVVRGLTggc2VxdWVuY2UuCitqc3AuZXJyb3IueG1sLm9wZXJhdGlvbk5vdFN1cHBvcnRlZCA9IE9wZXJhdGlvbiBcInswfVwiIG5vdCBzdXBwb3J0ZWQgYnkgezF9IHJlYWRlci4KK2pzcC5lcnJvci54bWwuaW52YWxpZEhpZ2hTdXJyb2dhdGUgPSBIaWdoIHN1cnJvZ2F0ZSBiaXRzIGluIFVURi04IHNlcXVlbmNlIG11c3Qgbm90IGV4Y2VlZCAweDEwIGJ1dCBmb3VuZCAweHswfS4KK2pzcC5lcnJvci54bWwuaW52YWxpZEFTQ0lJID0gQnl0ZSBcInswfVwiIG5vdCA3LWJpdCBBU0NJSS4KK2pzcC5lcnJvci54bWwuc3BhY2VSZXF1aXJlZEJlZm9yZUVuY29kaW5nSW5YTUxEZWNsID0gV2hpdGUgc3BhY2UgaXMgcmVxdWlyZWQgYmVmb3JlIHRoZSBlbmNvZGluZyBwc2V1ZG8gYXR0cmlidXRlIGluIHRoZSBYTUwgZGVjbGFyYXRpb24uCitqc3AuZXJyb3IueG1sLnNwYWNlUmVxdWlyZWRCZWZvcmVFbmNvZGluZ0luVGV4dERlY2wgPSBXaGl0ZSBzcGFjZSBpcyByZXF1aXJlZCBiZWZvcmUgdGhlIGVuY29kaW5nIHBzZXVkbyBhdHRyaWJ1dGUgaW4gdGhlIHRleHQgZGVjbGFyYXRpb24uCitqc3AuZXJyb3IueG1sLnNwYWNlUmVxdWlyZWRCZWZvcmVWZXJzaW9uSW5UZXh0RGVjbCA9IFdoaXRlIHNwYWNlIGlzIHJlcXVpcmVkIGJlZm9yZSB0aGUgdmVyc2lvbiBwc2V1ZG8gYXR0cmlidXRlIGluIHRoZSB0ZXh0IGRlY2xhcmF0aW9uLgoranNwLmVycm9yLnhtbC5zcGFjZVJlcXVpcmVkQmVmb3JlVmVyc2lvbkluWE1MRGVjbCA9IFdoaXRlIHNwYWNlIGlzIHJlcXVpcmVkIGJlZm9yZSB0aGUgdmVyc2lvbiBwc2V1ZG8gYXR0cmlidXRlIGluIHRoZSBYTUwgZGVjbGFyYXRpb24uCitqc3AuZXJyb3IueG1sLmVxUmVxdWlyZWRJblhNTERlY2wgPSBUaGUgJycgPSAnJyBjaGFyYWN0ZXIgbXVzdCBmb2xsb3cgXCJ7MH1cIiBpbiB0aGUgWE1MIGRlY2xhcmF0aW9uLgoranNwLmVycm9yLnhtbC5lcVJlcXVpcmVkSW5UZXh0RGVjbCA9IFRoZSAnJyA9ICcnIGNoYXJhY3RlciBtdXN0IGZvbGxvdyBcInswfVwiIGluIHRoZSB0ZXh0IGRlY2xhcmF0aW9uLgoranNwLmVycm9yLnhtbC5xdW90ZVJlcXVpcmVkSW5UZXh0RGVjbCA9IFRoZSB2YWx1ZSBmb2xsb3dpbmcgXCJ7MH1cIiBpbiB0aGUgdGV4dCBkZWNsYXJhdGlvbiBtdXN0IGJlIGEgcXVvdGVkIHN0cmluZy4KK2pzcC5lcnJvci54bWwucXVvdGVSZXF1aXJlZEluWE1MRGVjbCA9IFRoZSB2YWx1ZSBmb2xsb3dpbmcgXCJ7MH1cIiBpbiB0aGUgWE1MIGRlY2xhcmF0aW9uIG11c3QgYmUgYSBxdW90ZWQgc3RyaW5nLgoranNwLmVycm9yLnhtbC5pbnZhbGlkQ2hhckluVGV4dERlY2wgPSBBbiBpbnZhbGlkIFhNTCBjaGFyYWN0ZXIgKFVuaWNvZGU6IDB4ezB9KSB3YXMgZm91bmQgaW4gdGhlIHRleHQgZGVjbGFyYXRpb24uCitqc3AuZXJyb3IueG1sLmludmFsaWRDaGFySW5YTUxEZWNsID0gQW4gaW52YWxpZCBYTUwgY2hhcmFjdGVyIChVbmljb2RlOiAweHswfSkgd2FzIGZvdW5kIGluIHRoZSBYTUwgZGVjbGFyYXRpb24uCitqc3AuZXJyb3IueG1sLmNsb3NlUXVvdGVNaXNzaW5nSW5UZXh0RGVjbCA9IGNsb3NpbmcgcXVvdGUgaW4gdGhlIHZhbHVlIGZvbGxvd2luZyBcInswfVwiIGluIHRoZSB0ZXh0IGRlY2xhcmF0aW9uIGlzIG1pc3NpbmcuCitqc3AuZXJyb3IueG1sLmNsb3NlUXVvdGVNaXNzaW5nSW5YTUxEZWNsID0gY2xvc2luZyBxdW90ZSBpbiB0aGUgdmFsdWUgZm9sbG93aW5nIFwiezB9XCIgaW4gdGhlIFhNTCBkZWNsYXJhdGlvbiBpcyBtaXNzaW5nLgoranNwLmVycm9yLnhtbC5pbnZhbGlkSGlnaFN1cnJvZ2F0ZSA9IEhpZ2ggc3Vycm9nYXRlIGJpdHMgaW4gVVRGLTggc2VxdWVuY2UgbXVzdCBub3QgZXhjZWVkIDB4MTAgYnV0IGZvdW5kIDB4ezB9LgoranNwLmVycm9yLm11bHRpcGxlLmpzcCA9IENhbm5vdCBoYXZlIG11bHRpcGxlIHNwZWNpZmljYXRpb25zIG9mIAoranNwLmVycm9yLmpzcG91dHB1dC5jb25mbGljdD0mbHQ7anNwOm91dHB1dCZndDs6IGlsbGVnYWwgdG8gaGF2ZSBtdWx0aXBsZSBvY2N1cnJlbmNlcyBvZiBcInswfVwiIHdpdGggZGlmZmVyZW50IHZhbHVlcyAob2xkOiB7MX0sIG5ldzogezJ9KQoranNwLmVycm9yLmpzcG91dHB1dC5kb2N0eXBlbmFtZXN5c3RlbT0mbHQ7anNwOm91dHB1dCZndDs6ICdkb2N0eXBlLXJvb3QtZWxlbWVudCcgYW5kICdkb2N0eXBlLXN5c3RlbScgYXR0cmlidXRlcyBtdXN0IGFwcGVhciB0b2dldGhlcgoranNwLmVycm9yLmpzcG91dHB1dC5kb2N0eXBlcHVsaWNzeXN0ZW09Jmx0O2pzcDpvdXRwdXQmZ3Q7OiAnZG9jdHlwZS1zeXN0ZW0nIGF0dHJpYnV0ZSBtdXN0IGFwcGVhciBpZiAnZG9jdHlwZS1wdWJsaWMnIGF0dHJpYnV0ZSBhcHBlYXJzCitqc3AuZXJyb3IuanNwb3V0cHV0Lm5vbmVtcHR5Ym9keT0mbHQ7anNwOm91dHB1dCZndDsgbXVzdCBub3QgaGF2ZSBhIGJvZHkKK2pzcC5lcnJvci5qc3BvdXRwdXQuaW52YWxpZFVzZT0mbHQ7anNwOm91dHB1dCZndDsgbXVzdCBub3QgYmUgdXNlZCBpbiBzdGFuZGFyZCBzeW50YXgKK2pzcC5lcnJvci5hdHRyaWJ1dGVzLm5vdC5hbGxvd2VkID0gezB9IG11c3Qgbm90IGhhdmUgYW55IGF0dHJpYnV0ZXMKK2pzcC5lcnJvci50YWdmaWxlLmJhZFN1ZmZpeD1NaXNzaW5nIFwiLnRhZ1wiIHN1ZmZpeCBpbiB0YWcgZmlsZSBwYXRoIHswfQoranNwLmVycm9yLnRhZ2ZpbGUuaWxsZWdhbFBhdGg9SWxsZWdhbCB0YWcgZmlsZSBwYXRoOiB7MH0sIG11c3Qgc3RhcnQgd2l0aCBcIi9XRUItSU5GL3RhZ3NcIiBvciBcIi9NRVRBLUlORi90YWdzXCIKK2pzcC5lcnJvci5wbHVnaW4ud3JvbmdSb290RWxlbWVudD1OYW1lIG9mIHJvb3QgZWxlbWVudCBpbiB7MH0gZGlmZmVyZW50IGZyb20gezF9Citqc3AuZXJyb3IuYXR0cmlidXRlLmludmFsaWRQcmVmaXg9VGhlIGF0dHJpYnV0ZSBwcmVmaXggezB9IGRvZXMgbm90IGNvcnJlc3BvbmQgdG8gYW55IGltcG9ydGVkIHRhZyBsaWJyYXJ5Citqc3AuZXJyb3IubmVzdGVkLmpzcGF0dHJpYnV0ZT1BIGpzcDphdHRyaWJ1dGUgc3RhbmRhcmQgYWN0aW9uIGNhbm5vdCBiZSBuZXN0ZWQgd2l0aGluIGFub3RoZXIganNwOmF0dHJpYnV0ZSBzdGFuZGFyZCBhY3Rpb24KK2pzcC5lcnJvci5uZXN0ZWQuanNwYm9keT1BIGpzcDpib2R5IHN0YW5kYXJkIGFjdGlvbiBjYW5ub3QgYmUgbmVzdGVkIHdpdGhpbiBhbm90aGVyIGpzcDpib2R5IG9yIGpzcDphdHRyaWJ1dGUgc3RhbmRhcmQgYWN0aW9uCitqc3AuZXJyb3IudmFyaWFibGUuZWl0aGVyLm5hbWU9RWl0aGVyIG5hbWUtZ2l2ZW4gb3IgbmFtZS1mcm9tLWF0dHJpYnV0ZSBhdHRyaWJ1dGUgbXVzdCBiZSBzcGVjaWZpZWQgaW4gYSB2YXJpYWJsZSBkaXJlY3RpdmUKK2pzcC5lcnJvci52YXJpYWJsZS5ib3RoLm5hbWU9Q2Fubm90IHNwZWNpZnkgYm90aCBuYW1lLWdpdmVuIG9yIG5hbWUtZnJvbS1hdHRyaWJ1dGUgYXR0cmlidXRlcyBpbiBhIHZhcmlhYmxlIGRpcmVjdGl2ZQoranNwLmVycm9yLnZhcmlhYmxlLmFsaWFzPUJvdGggb3Igbm9uZSBvZiB0aGUgbmFtZS1mcm9tLWF0dHJpYnV0ZSBhbmQgYWxpYXMgYXR0cmlidXRlcyBtdXN0IGJlIHNwZWNpZmllZCBpbiBhIHZhcmlhYmxlIGRpcmVjdGl2ZQoranNwLmVycm9yLmF0dHJpYnV0ZS5udWxsX25hbWU9TnVsbCBhdHRyaWJ1dGUgbmFtZQoranNwLmVycm9yLmpzcHRleHQuYmFkY29udGVudD1cJyZsdDtcJywgd2hlbiBhcHBlYXJzIGluIHRoZSBib2R5IG9mICZsdDtqc3A6dGV4dCZndDssIG11c3QgYmUgZW5jYXBzdWxhdGVkIHdpdGhpbiBhIENEQVRBCitqc3AuZXJyb3IuanNwcm9vdC52ZXJzaW9uLmludmFsaWQ9SW52YWxpZCB2ZXJzaW9uIG51bWJlcjogXCJ7MH1cIiwgbXVzdCBiZSBcIjEuMlwiIG9yIFwiMi4wXCIKK2pzcC5lcnJvci5ub0Z1bmN0aW9uUHJlZml4PVRoZSBmdW5jdGlvbiB7MH0gbXVzdCBiZSB1c2VkIHdpdGggYSBwcmVmaXggd2hlbiBhIGRlZmF1bHQgbmFtZXNwYWNlIGlzIG5vdCBzcGVjaWZpZWQKK2pzcC5lcnJvci5ub0Z1bmN0aW9uPVRoZSBmdW5jdGlvbiB7MH0gY2Fubm90IGJlIGxvY2F0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIHByZWZpeAoranNwLmVycm9yLm5vRnVuY3Rpb25NZXRob2Q9TWV0aG9kIFwiezB9XCIgZm9yIGZ1bmN0aW9uIFwiezF9XCIgbm90IGZvdW5kIGluIGNsYXNzIFwiezJ9XCIKK2pzcC5lcnJvci5mdW5jdGlvbi5jbGFzc25vdGZvdW5kPVRoZSBjbGFzcyB7MH0gc3BlY2lmaWVkIGluIFRMRCBmb3IgdGhlIGZ1bmN0aW9uIHsxfSBjYW5ub3QgYmUgZm91bmQ6IHsyfQoranNwLmVycm9yLnNpZ25hdHVyZS5jbGFzc25vdGZvdW5kPVRoZSBjbGFzcyB7MH0gc3BlY2lmaWVkIGluIHRoZSBtZXRob2Qgc2lnbmF0dXJlIGluIFRMRCBmb3IgdGhlIGZ1bmN0aW9uIHsxfSBjYW5ub3QgYmUgZm91bmQuIHsyfQoranNwLmVycm9yLnRleHQuaGFzX3N1YmVsZW1lbnQ9Jmx0O2pzcDp0ZXh0Jmd0OyBtdXN0IG5vdCBoYXZlIGFueSBzdWJlbGVtZW50cworanNwLmVycm9yLmRhdGEuZmlsZS5yZWFkPUVycm9yIHJlYWRpbmcgZmlsZSBcInswfVwiCitqc3AuZXJyb3IucHJlZml4LnJlZmluZWQ9QXR0ZW1wdCB0byByZWRlZmluZSB0aGUgcHJlZml4IHswfSB0byB7MX0sIHdoZW4gaXQgd2FzIGFscmVhZHkgZGVmaW5lZCBhcyB7Mn0gaW4gdGhlIGN1cnJlbnQgc2NvcGUuCitqc3AuZXJyb3IubmVzdGVkX2pzcHJvb3Q9TmVzdGVkICZsdDtqc3A6cm9vdCZndDsKK2pzcC5lcnJvci51bmJhbGFuY2VkLmVuZHRhZz1UaGUgZW5kIHRhZyBcIiZsdDsvezB9XCIgaXMgdW5iYWxhbmNlZAoranNwLmVycm9yLmludmFsaWQuYmVhbj1UaGUgdmFsdWUgZm9yIHRoZSB1c2VCZWFuIGNsYXNzIGF0dHJpYnV0ZSB7MH0gaXMgaW52YWxpZC4KK2pzcC5lcnJvci5wcmVmaXgudXNlX2JlZm9yZV9kY2w9VGhlIHByZWZpeCB7MH0gc3BlY2lmaWVkIGluIHRoaXMgdGFnIGRpcmVjdGl2ZSBoYXMgYmVlbiBwcmV2aW91c2x5IHVzZWQgYnkgYW4gYWN0aW9uIGluIGZpbGUgezF9IGxpbmUgezJ9LgpkaWZmIC0tZ2l0IGEvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3Jlc291cmNlcy9Mb2NhbFN0cmluZ3NfZXMucHJvcGVydGllcyBiL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9yZXNvdXJjZXMvTG9jYWxTdHJpbmdzX2VzLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZlODc3ZAotLS0gL2Rldi9udWxsCisrKyBiL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9yZXNvdXJjZXMvTG9jYWxTdHJpbmdzX2VzLnByb3BlcnRpZXMKQEAgLTAsMCArMSw0MDMgQEAKKyMgJElkJAorIworIyBEZWZhdWx0IGxvY2FsaXplZCBzdHJpbmcgaW5mb3JtYXRpb24KKyMgTG9jYWxpemVkIHBhcmEgTG9jYWxlIGVzX0VTCisKK2pzcC5lcnJvci5iYWQuc2VydmxldC5lbmdpbmU9oVZlcnNp824gaW5jb3JyZWN0YSBkZWwgbW90b3Igc2VydmxldCEKK2pzcC5lcnJvci5uby5zY3JhdGNoLmRpcj1FbCBtb3RvciBKU1Agbm8gdGllbmUgY29uZmlndXJhZG8gdW4gZGlyZWN0b3JpbyBkZSB0cmFiYWpvLlwKK1xuIEHxYWRhIFwianNwLmluaXRwYXJhbXM9c2NyYXRjaGRpcj08ZGlyLW5hbWU+XCIgXAorXG4gZW4gZWwgZmljaGVybyBzZXJ2bGV0cy5wcm9wZXJ0aWVzIHBhcmEgZXN0ZSBjb250ZXh0by4KK2pzcC5lcnJvci5iYWQuc2NyYXRjaC5kaXI9RWwgZGlyZWN0b3JpbyBkZSB0cmFiYWpvIGVzcGVjaWZpY2FkbzogezB9IG5vIGVzIHV0aWxpemFibGUuCitqc3AubWVzc2FnZS5zY3JhdGNoLmRpci5pcz1FbCBkaXJlY3RvcmlvIGRlIHRyYWJham8gcGFyYSBlbCBtb3RvciBKU1AgZXM6IHswfQoranNwLm1lc3NhZ2UucGFyZW50X2NsYXNzX2xvYWRlcl9pcz1FbCBjYXJnYWRvciBkZSBjbGFzZXMgZXM6IHswfQoranNwLm1lc3NhZ2UuZG9udC5tb2RpZnkuc2VydmxldHM9SU1QT1JUQU5URTogTm8gbW9kaWZpcXVlIGxvcyBzZXJ2bGV0cyBnZW5lcmFkb3MKK2pzcC5lcnJvci5ub3QuaW1wbC5jb21tZW50cz1FcnJvciBJbnRlcm5vOiBDb21tZW50cyBubyBpbXBsZW1lbnRhZG8KK2pzcC5lcnJvci5ub3QuaW1wbC5kaXJlY3RpdmVzPUVycm9yIEludGVybm86IERpcmVjdGl2ZXMgbm8gaW1wbGVtZW50YWRvCitqc3AuZXJyb3Iubm90LmltcGwuZGVjbGFyYXRpb25zPUVycm9yIEludGVybm86IERlY2xhcmF0aW9ucyBubyBpbXBsZW1lbnRhZG8KK2pzcC5lcnJvci5ub3QuaW1wbC5leHByZXNzaW9ucz1FcnJvciBJbnRlcm5vOiBFeHByZXNzaW9ucyBubyBpbXBsZW1lbnRhZG8KK2pzcC5lcnJvci5ub3QuaW1wbC5zY3JpcHRsZXRzPUVycm9yIEludGVybm86IFNjcmlwdGxldHMgbm8gaW1wbGVtZW50YWRvCitqc3AuZXJyb3Iubm90LmltcGwudXNlQmVhbj1FcnJvciBJbnRlcm5vOiB1c2VCZWFuIG5vIGltcGxlbWVudGFkbworanNwLmVycm9yLm5vdC5pbXBsLmdldHA9RXJyb3IgSW50ZXJubzogZ2V0UHJvcGVydHkgbm8gaW1wbGVtZW50YWRvCitqc3AuZXJyb3Iubm90LmltcGwuc2V0cD1FcnJvciBJbnRlcm5vOiBzZXRQcm9wZXJ0eSBubyBpbXBsZW1lbnRhZG8KK2pzcC5lcnJvci5ub3QuaW1wbC5wbHVnaW49RXJyb3IgSW50ZXJubzogcGx1Z2luIG5vIGltcGxlbWVudGFkbworanNwLmVycm9yLm5vdC5pbXBsLmZvcndhcmQ9RXJyb3IgSW50ZXJubzogZm9yd2FyZCBubyBpbXBsZW1lbnRhZG8KK2pzcC5lcnJvci5ub3QuaW1wbC5pbmNsdWRlPUVycm9yIEludGVybm86IGluY2x1ZGUgbm8gaW1wbGVtZW50YWRvCitqc3AuZXJyb3IudW5hdmFpbGFibGU9SlNQIGhhIHNpZG8gbWFyY2FkbyBjb21vIG5vIGRpc3BvbmlibGUKK2pzcC5lcnJvci51c2ViZWFuLm1pc3NpbmcuYXR0cmlidXRlPXVzZUJlYW46IGZhbHRhIGF0cmlidXRvIGlkIG8gZXN04SBtYWwgZGlnaXRhZG8KK2pzcC5lcnJvci51c2ViZWFuLm1pc3NpbmcudHlwZT11c2VCZWFuICh7MH0pOiBTZSBkZWJlIGRlIGVzcGVjaWZpY2FyIGF0cmlidXRvIGNsYXNzIG8gdHlwZToKK2pzcC5lcnJvci51c2ViZWFuLmR1cGxpY2F0ZT11c2VCZWFuOiBOb21icmUgZGUgYmVhbiBkdXBsaWNhZG86IHswfQoranNwLmVycm9yLnVzZWJlYW4ucHJvaGliaXRlZC5hcy5zZXNzaW9uPU5vIHB1ZWRvIHVzYXIgY29tbyBiZWFuIGRlIHNlc2nzbiB7MH0geWEgcXVlIGVzdOEgcHJvaGliaWRvIFwKK3BvciBkaXJlY3RpdmEganNwIGRlZmluaWRhIHByZXZpYW1lbnRlOiAKK2pzcC5lcnJvci51c2ViZWFuLm5vdC5ib3RoPXVzZUJlYW46IE5vIHB1ZWRlIGVzcGVjaWZpY2FyIGFtYm9zIGF0cmlidXRvcyBjbGFzcyB5IGJlYW5OYW1lOiAKK2pzcC5lcnJvci51c2ViZWFuLmJhZC50eXBlLmNhc3Q9dXNlQmVhbiAoezB9KTogVGlwbyAoezF9KSBubyBlcyBhc2lnbmFibGUgZGVzZGUgY2xhc2UgKHsyfSkgCitqc3AuZXJyb3IuaW52YWxpZC5zY29wZT1WYWxvciBpbGVnYWwgZGUgYXRyaWJ1dG8gXCdzY29wZVwnOiB7MH0gKGRlYmUgZGUgc2VyIHVubyBkZSBcInBhZ2VcIiwgXCJyZXF1ZXN0XCIsIFwic2Vzc2lvblwiLCBvIFwiYXBwbGljYXRpb25cIikKK2pzcC5lcnJvci5jbGFzc25hbWU9Tm8gcHVkZSBkZXRlcm1pbmFyIGVsIG5vbWJyZSBkZSBjbGFzZSBkZXNkZSBlbCBmaWNoZXJvIC5jbGFzcworanNwLndhcm5pbmcuYmFkLnR5cGU9QXZpc286IHRpcG8gaW5jb3JyZWN0byBlbiBhcmNoaXZvIC5jbGFzcworanNwLmVycm9yLmRhdGEuZmlsZS53cml0ZT1FcnJvciBtaWVudHJhcyBlc2NyaWLtYSBlbCBhcmNoaXZvIGRlIGRhdG9zCitqc3AuZXJyb3IucGFnZS5pbnZhbGlkLmJ1ZmZlcj1EaXJlY3RpdmEgUGFnZTogbWVkaWRhIGRlIGJ1ZmZlciBpbnbhbGlkYQoranNwLmVycm9yLnBhZ2UuY29uZmxpY3QuY29udGVudHR5cGU9RGlyZWN0aXZhIFBhZ2U6IGVzIGlsZWdhbCB0ZW5lciBt+mx0aXBsZXMgb2N1cnJlbmNpYXMgZGUgJ2NvbnRlbnRUeXBlJyBjb24gdmFsb3JlcyBkaXN0aW50b3MgKHZpZWpvOiB7MH0sIG51ZXZvOiB7MX0pCitqc3AuZXJyb3IucGFnZS5pbnZhbGlkLmNvbnRlbnR0eXBlPURpcmVjdGl2YSBQYWdlOiB2YWxvciBpbmNvcnJlY3RvIHBhcmEgY29udGVudFR5cGUKK2pzcC5lcnJvci5wYWdlLmNvbmZsaWN0LnNlc3Npb249RGlyZWN0aXZhIFBhZ2U6IGVzIGlsZWdhbCB0ZW5lciBt+mx0aXBsZXMgb2N1cnJlbmNpYXMgZGUgJ3Nlc3Npb24nIGNvbiB2YWxvcmVzIGRpc3RpbnRvcyAodmllam86IHswfSwgbnVldm86IHsxfSkKK2pzcC5lcnJvci5wYWdlLmludmFsaWQuc2Vzc2lvbj1EaXJlY3RpdmEgUGFnZTogdmFsb3IgaW5jb3JyZWN0byBwYXJhIHNlc3Npb24KK2pzcC5lcnJvci5wYWdlLmNvbmZsaWN0LmJ1ZmZlcj1EaXJlY3RpdmEgUGFnZTogZXMgaWxlZ2FsIHRlbmVyIG36bHRpcGxlcyBvY3VycmVuY2lhcyBkZSAnYnVmZmVyJ2NvbiB2YWxvcmVzIGRpc3RpbnRvcyAodmllam86IHswfSwgbnVldm86IHsxfSkKK2pzcC5lcnJvci5wYWdlLmludmFsaWQuYnVmZmVyPURpcmVjdGl2YSBQYWdlOiB2YWxvciBpbmNvcnJlY3RvIHBhcmEgYnVmZmVyCitqc3AuZXJyb3IucGFnZS5jb25mbGljdC5hdXRvZmx1c2g9RGlyZWN0aXZhIFBhZ2U6IGVzIGlsZWdhbCB0ZW5lciBt+mx0aXBsZXMgb2N1cnJlbmNpYXMgZGUgJ2F1dG9GbHVzaCcgY29uIHZhbG9yZXMgZGlzdGludG9zICh2aWVqbzogezB9LCBudWV2bzogezF9KQoranNwLmVycm9yLnBhZ2UuaW52YWxpZC5hdXRvZmx1c2g9PURpcmVjdGl2YSBQYWdlOiB2YWxvciBpbmNvcnJlY3RvIHBhcmEgYXV0b0ZsdXNoCitqc3AuZXJyb3IucGFnZS5jb25mbGljdC5pc3RocmVhZHNhZmU9RGlyZWN0aXZhIFBhZ2U6IGVzIGlsZWdhbCB0ZW5lciBt+mx0aXBsZXMgb2N1cnJlbmNpYXMgZGUgJ2lzVGhyZWFkU2FmZScgY29uIHZhbG9yZXMgZGlzdGludG9zICh2aWVqbzogezB9LCBudWV2bzogezF9KQoranNwLmVycm9yLnBhZ2UuaW52YWxpZC5pc3RocmVhZHNhZmU9PURpcmVjdGl2YSBQYWdlOiB2YWxvciBpbmNvcnJlY3RvIHBhcmEgaXNUaHJlYWRTYWZlCitqc3AuZXJyb3IucGFnZS5jb25mbGljdC5pbmZvPURpcmVjdGl2YSBQYWdlOiBlcyBpbGVnYWwgdGVuZXIgbfpsdGlwbGVzIG9jdXJyZW5jaWFzIGRlICdpbmZvJyBjb24gdmFsb3JlcyBkaXN0aW50b3MgKHZpZWpvOiB7MH0sIG51ZXZvOiB7MX0pCitqc3AuZXJyb3IucGFnZS5pbnZhbGlkLmluZm89PURpcmVjdGl2YSBQYWdlOiB2YWxvciBpbmNvcnJlY3RvIHBhcmEgaW5mbworanNwLmVycm9yLnBhZ2UuY29uZmxpY3QuaXNlcnJvcnBhZ2U9RGlyZWN0aXZhIFBhZ2U6IGVzIGlsZWdhbCB0ZW5lciBt+mx0aXBsZXMgb2N1cnJlbmNpYXMgZGUgJ2lzRXJyb3JQYWdlJyBjb24gdmFsb3JlcyBkaXN0aW50b3MgKHZpZWpvOiB7MH0sIG51ZXZvOiB7MX0pCitqc3AuZXJyb3IucGFnZS5pbnZhbGlkLmlzZXJyb3JwYWdlPT1EaXJlY3RpdmEgUGFnZTogdmFsb3IgaW5jb3JyZWN0byBwYXJhIGlzRXJyb3JQYWdlCitqc3AuZXJyb3IucGFnZS5jb25mbGljdC5lcnJvcnBhZ2U9RGlyZWN0aXZhIFBhZ2U6IGVzIGlsZWdhbCB0ZW5lciBt+mx0aXBsZXMgb2N1cnJlbmNpYXMgZGUgJ2Vycm9yUGFnZScgY29uIHZhbG9yZXMgZGlzdGludG9zICh2aWVqbzogezB9LCBudWV2bzogezF9KQoranNwLmVycm9yLnBhZ2UuY29uZmxpY3QubGFuZ3VhZ2U9RGlyZWN0aXZhIFBhZ2U6IGVzIGlsZWdhbCB0ZW5lciBt+mx0aXBsZXMgb2N1cnJlbmNpYXMgZGUgJ2xhbmd1YWdlJyBjb24gdmFsb3JlcyBkaXN0aW50b3MgKHZpZWpvOiB7MH0sIG51ZXZvOiB7MX0pCitqc3AuZXJyb3IudGFnLmNvbmZsaWN0Lmxhbmd1YWdlPURpcmVjdGl2YSBUYWc6IGVzIGlsZWdhbCB0ZW5lciBt+mx0aXBsZXMgb2N1cnJlbmNpYXMgZGUgJ2xhbmd1YWdlJyBjb24gdmFsb3JlcyBkaXN0aW50b3MgKHZpZWpvOiB7MH0sIG51ZXZvOiB7MX0pCitqc3AuZXJyb3IucGFnZS5sYW5ndWFnZS5ub25qYXZhPURpcmVjdGl2YSBQYWdlOiBhdHJpYnV0byBsYW5ndWFnZSBpbmNvcnJlY3RvCitqc3AuZXJyb3IudGFnLmxhbmd1YWdlLm5vbmphdmE9RGlyZWN0aXZhIFRhZzogYXRyaWJ1dG8gbGFuZ3VhZ2UgaW5jb3JyZWN0bworanNwLmVycm9yLnBhZ2UuZGVmYWZ0ZXJ1c2FyLmxhbmd1YWdlPURpcmVjdGl2YSBQYWdlOiBObyBwdWVkZSBkZWZpbmlyIGxhbmd1YWdlIHRyYXMgdW4gc2NyaXB0bGV0IAoranNwLmVycm9yLnBhZ2Uubm9tYXBwaW5nLmxhbmd1YWdlPURpcmVjdGl2YSBQYWdlOiBObyBoYXkgbWFwZWFkbyBwYXJhIGxhbmd1YWdlOiAKK2pzcC5lcnJvci5wYWdlLmNvbmZsaWN0LmV4dGVuZHM9RGlyZWN0aXZhIFBhZ2U6IGVzIGlsZWdhbCB0ZW5lciBt+mx0aXBsZXMgb2N1cnJlbmNpYXMgZGUgJ2V4dGVuZHMnIGNvbiB2YWxvcmVzIGRpc3RpbnRvcyAodmllam86IHswfSwgbnVldm86IHsxfSkKK2pzcC5lcnJvci5wYWdlLmNvbmZsaWN0LmlzZWxpZ25vcmVkPURpcmVjdGl2YSBQYWdlOiBlcyBpbGVnYWwgdGVuZXIgbfpsdGlwbGVzIG9jdXJyZW5jaWFzIGRlICdpc0VMSWdub3JlZCcgY29uIHZhbG9yZXMgZGlzdGludG9zICh2aWVqbzogezB9LCBudWV2bzogezF9KQoranNwLmVycm9yLnRhZy5jb25mbGljdC5pc2VsaWdub3JlZD1EaXJlY3RpdmEgVGFnOiBlcyBpbGVnYWwgdGVuZXIgbfpsdGlwbGVzIG9jdXJyZW5jaWFzIGRlICdpc0VMSWdub3JlZCcgY29uIHZhbG9yZXMgZGlzdGludG9zICh2aWVqbzogezB9LCBudWV2bzogezF9KQoranNwLmVycm9yLnBhZ2UuaW52YWxpZC5pc2VsaWdub3JlZD1EaXJlY3RpdmEgUGFnZTogdmFsb3IgaW524WxpZG8gcGFyYSBpc0VMSWdub3JlZAoranNwLmVycm9yLnRhZy5pbnZhbGlkLmlzZWxpZ25vcmVkPURpcmVjdGl2YSBUYWc6IHZhbG9yIGluY29ycmVjdG8gcGFyYSBpc0VMSWdub3JlZAoranNwLmVycm9yLnBhZ2UubXVsdGkucGFnZWVuY29kaW5nPUxhIGRpcmVjdGl2YSBQYWdlIG5vIGRlYmUgZGUgdGVuZXIgbfpsdGlwbGVzIG9jdXJyZW5jaWFzIGRlIHBhZ2VlbmNvZGluZworanNwLmVycm9yLnRhZy5jb25mbGljdC5hdHRyPURpcmVjdGl2YSBUYWc6IGVzIGlsZWdhbCB0ZW5lciBt+mx0aXBsZXMgb2N1cnJlbmNpYXMgZGVsIGF0cmlidXRvIFwiezB9XCIgY29uIHZhbG9yZXMgZGlzdGludG9zICh2aWVqbzogezF9LCBudWV2bzogezJ9KQoranNwLmVycm9yLnRhZy5tdWx0aS5wYWdlZW5jb2Rpbmc9TGEgZGlyZWN0aXZhIFRhZyBubyBkZWJlIGRlIHRlbmVyIG36bHRpcGxlcyBvY3VycmVuY2lhcyBkZSBwYWdlZW5jb2RpbmcKK2pzcC5lcnJvci5wYWdlLmJhZF9iX2FuZF9hX2NvbWJvPURpcmVjdGl2YSBQYWdlOiBDb21iaW5hY2nzbiBpbGVnYWwgZGUgYnVmZmVyPVwibm9uZVwiIHkgYXV0b0ZsdXNoPVwiZmFsc2VcIgoranNwLmVycm9yLm5vdC5pbXBsLnRhZ2xpYj1FcnJvciBJbnRlcm5vOiBUYWcgZXh0ZW5zaW9ucyBubyBpbXBsZW1lbnRhZG8KK2pzcC5lcnJvci5pbmNsdWRlLm1pc3NpbmcuZmlsZT1ObyB0aWVuZSBhcmd1bWVudG8gZGUgbm9tYnJlIGRlIGZpY2hlcm8gCitqc3AuZXJyb3IuaW5jbHVkZS5iYWQuZmlsZT1Bcmd1bWVudG8gZGUgbm9tYnJlIGRlIGZpY2hlcm8gbm8gduFsaWRvCitqc3AuZXJyb3IuaW5jbHVkZS5leGNlcHRpb249Tm8gc2UgcHVlZGUgaW5jbHVpciB7MH0KK2pzcC5lcnJvci5zdHJlYW0uY2xvc2VkPVN0cmVhbSBjZXJyYWRvCitqc3AuZXJyb3IuaW52YWxpZC5mb3J3YXJkPVRhZyBmb3J3YXJkIG5vIHbhbGlkbworanNwLmVycm9yLnVua25vd25FeGNlcHRpb249oUVycm9yIG5vIGNhdHVyYWRvIS4gRGViZXLtYXMgZGUgY29uc2lkZXJhciBlbCBwb25lciB1bmEgcOFnaW5hIGRlIGVycm9yIHBhcmEgYXZpc2FyIGRlIGxvcyBlcnJvcmVzIG3hcyBlbGVnYW50ZW1lbnRlCitqc3AuZXJyb3IuaW52YWxpZC5kaXJlY3RpdmU9RGlyZWN0aXZhIG5vIHbhbGlkYQoranNwLmVycm9yLmRpcmVjdGl2ZS5pc3RhZ2ZpbGU9TGEgRGlyZWN0aXZhIHswfSBubyBwdWVkZSB1c2Fyc2UgZW4gYXJjaGl2byBkZSB0YWcKK2pzcC5lcnJvci5kaXJlY3RpdmUuaXNub3R0YWdmaWxlPUxhIERpcmVjdGl2YSB7MH0gc/NsbyBzZSBwdWVkZSB1c2FyIGVuIHVuIGFyY2hpdm8gZGUgdGFnCitqc3AuZXJyb3IudGFnZmlsZS50bGQubmFtZT1FbCBhdHJpYnV0byBcIm5hbWVcIiBkZSBsYSBkaXJlY3RpdmEgdGFnIHRpZW5lIHVuIHZhbG9yIHswfSBtaWVudHJhcyBxdWUgZWwgdGFnIFwibmFtZVwiIGRlbCBlbGVtZW50byBcInRhZy1maWxlXCIgZW4gZWwgVExEIGVzIHsxfQoranNwLmVycm9yLmFjdGlvbi5pc3RhZ2ZpbGU9TGEgYWNjafNuIHswfSBubyBzZSBwdWVkZSB1c2FyIGVuIHVuIGFyY2hpdm8gdGFnCitqc3AuZXJyb3IuYWN0aW9uLmlzbm90dGFnZmlsZT1MYSBhY2Np824gezB9IHPzbG8gc2UgcHVlZGUgdXNhciBlbiBhcmNoaXZvcyB0YWcKK2pzcC5lcnJvci51bnRlcm1pbmF0ZWQ9VGFnIHswfSBubyB0ZXJtaW5hZG8KK2pzcC5lcnJvci51c2ViZWFuLm5vdGluc2FtZWZpbGU9RWwgVGFnIHVzZUJlYW4gZGViZSBkZSBlbXBlemFyIHkgdGVybWluYXIgZW4gZWwgbWlzbW8gYXJjaGl2byBm7XNpY28KK2pzcC5lcnJvci5sb2FkY2xhc3MudGFnaGFuZGxlcj1ObyBzZSBwdWVkZSBjYXJnYXIgbGEgY2xhc2UgezB9Citqc3AuZXJyb3IudW5hYmxlLmNvbXBpbGU9Tm8gc2UgcHVlZGUgY29tcGlsYXIgbGEgY2xhc2UgcGFyYSBKU1AKK2pzcC5lcnJvci51bmFibGUubG9hZD1ObyBzZSBwdWVkZSBjYXJnYXIgbGEgY2xhc2UgcGFyYSBKU1AKK2pzcC5lcnJvci51bmFibGUucmVuYW1lPU5vIHNlIHB1ZWRlIHJlbm9tYnJhciBlbCBhcmNoaXZvIGRlIGNsYXNlIHswfSBhIHsxfQoranNwLmVycm9yLm1hbmRhdG9yeS5hdHJpYnV0bz17MH06IGF0cmlidXRvIG9ibGlnYXRvcmlvIHsxfSBwZXJkaWRvCitqc3AuZW5naW5lLmluZm89TW90b3IgSmFzcGVyIEpTUCAyLjAKK2pzcC5lcnJvci5pbnZhbGlkLmV4cHJlc3Npb249InswfSIgY29udGllbmUgZXhwcmVzaW9uZXMgaW5jb3JyZWN0YXM6IHsxfQoranNwLmVycm9yLmludmFsaWQuYXR0cmlidXRlPXswfTogQXRyaWJ1dG8gaW5jb3JyZWN0bywgezF9Citqc3AuZXJyb3IudXNlYmVhbi5jbGFzcy5ub3Rmb3VuZD1DbGFzZTogezB9IG5vIGhhbGxhZGEKK2pzcC5lcnJvci5maWxlLmNhbm5vdC5yZWFkPU5vIHNlIHB1ZWRlIGxlZXIgZWwgYXJjaGl2bzogezB9Citqc3AuZXJyb3IuZmlsZS5hbHJlYWR5LnJlZ2lzdGVyZWQ9RWwgYXJjaGl2byB7MH0geWEgc2UgaGEgdmlzdG8sIL9wb2Ry7WEgc2VyIHVuIGluY2x1ZGUgcmVjdXJzaXZvPworanNwLmVycm9yLmZpbGUubm90LnJlZ2lzdGVyZWQ9QXJjaGl2byB7MH0gbm90IHZpc3RvIGVuIGluY2x1ZGUKK2pzcC5lcnJvci5xdW90ZXMudW50ZXJtaW5hdGVkPUNvbWlsbGFzIG5vIHRlcm1pbmFkYXMKK2pzcC5lcnJvci5hdHRyLnF1b3RlZD1FbCB2YWxvciBkZWwgYXRyaWJ1dG8gZGViZXLtYSBpciBlbnRyZSBjb21pbGxhcworanNwLmVycm9yLmF0dHIubm92YWx1ZT1BdHJpYnV0byB7MH0gbm8gdGllbmUgdmFsb3IKK2pzcC5lcnJvci50YWcuYXR0ci51bnRlcm1pbmF0ZWQ9TGlzdGEgZGUgYXRyaWJ1dG9zIGRlbCB0YWcgbm8gdGVybWluYWRhCitqc3AuZXJyb3IucGFyYW0ubm9uYW1lPU5vIGhheSBub21icmUgZW4gZWwgdGFnIFBBUkFNCitqc3AuZXJyb3IucGFyYW0ubm92YWx1ZT1ObyBoYXkgdmFsb3IgZW4gZWwgdGFnIFBBUkFNCitqc3AuZXJyb3IuYmVhbnMubnVsbGJlYW49U2UgaGEgaW50ZW50YWRvIHVuYSBvcGVyYWNp824gZGUgYmVhbiBlbiB1biBvYmpldG8gbnVsbworanNwLmVycm9yLmJlYW5zLm5vYmVhbmluZm89Tm8gc2UgcHVlZGUgZW5jb250cmFyIEJlYW5JbmZvIHBhcmEgZWwgYmVhbiAgJyd7MH0nJyBzZWd1cmFtZW50ZSBsYSBjbGFzZSBubyBleGlzdGUKK2pzcC5lcnJvci5iZWFucy5pbnRyb3NwZWN0aW9uPVVuYSBleGNlcGNp824gaGEgdGVuaWRvIGx1Z2FyIG1pZW50cmFzIHNlIGxl7WEgZWwgbel0b2RvIGRlIGxlY3R1cmEgZGUgbGEgcHJvcGllZGFkICcnezB9JycgZW4gdW4gYmVhbiBkZWwgdGlwbyAnJ3sxfScnOlxuezJ9Citqc3AuZXJyb3IuYmVhbnMubm9tZXRob2Q9Tm8gcHVlZG8gZW5jb250cmFyIHVuIG3pdG9kbyBwYXJhIGxlZXIgbGEgcHJvcGllZGFkICcnezB9JycgZW4gdW4gYmVhbiBkZWwgdGlwbyAnJ3sxfScnCitqc3AuZXJyb3IuYmVhbnMubm9tZXRob2Quc2V0cHJvcGVydHk9Tm8gcHVlZG8gZW5jb250cmFyIHVuIG3pdG9kbyBwYXJhIGVzY3JpYmlyIGxhIHByb3BpZWRhZCAnJ3swfScnIGVuIHVuIGJlYW4gZGVsIHRpcG8gJyd7Mn0nJworanNwLmVycm9yLmJlYW5zLm5vcHJvcGVydHk9Tm8gcHVlZG8gZW5jb250cmFyIGluZm9ybWFjafNuIGRlIGxhIHByb3BpZWRhZCAnJ3swfScnIGVuIHVuIGJlYW4gZGVsIHRpcG8gJyd7MX0nJworanNwLmVycm9yLmJlYW5zLnNldHByb3BlcnR5Lm5vaW5kZXhzZXQ9Tm8gcHVlZG8gcG9uZXIgbGEgcHJvcGllZGFkIGluZGV4YWRhCitqc3AuZXJyb3IuaW5jbHVkZS50YWc9VGFnIGpzcDppbmNsdWRlIG5vIHbhbGlkbworanNwLmVycm9yLmluY2x1ZGUubm9mbHVzaD1qc3A6aW5jbHVkZSBuZWNlc2l0YSB0ZW5lciBcImZsdXNoPXRydWVcIgoranNwLmVycm9yLmluY2x1ZGUuYmFkZmx1c2g9anNwOmluY2x1ZGUgcGFnZT1cIi4uLlwiIGZsdXNoPVwidHJ1ZVwiIGVzIGxhIPpuaWNhIGNvbWJpbmFjafNuIHbhbGlkYSBlbiBKU1AgMS4wCitqc3AuZXJyb3IuYXR0ZW1wdF90b19jbGVhcl9mbHVzaGVkX2J1ZmZlcj1FcnJvcjogU2UgaGEgaW50ZW50YWRvIGxpbXBpYXIgdW4gYnVmZmVyIHF1ZSB5YSBoYWLtYSBzaWRvIGVzY3JpdG8KK2pzcC5lcnJvci5vdmVyZmxvdz1FcnJvcjpCdWZmZXIgZGUgSlNQIGRlc2JvcmRhZG8KK2pzcC5lcnJvci5wYXJhbWV4cGVjdGVkPUVsIHRhZyBcInBhcmFtXCIgZXJhIGVzcGVyYWRvIGNvbiBsb3MgYXRyaWJ1dG9zIFwibmFtZVwiIHkgXCJ2YWx1ZVwiIGRlc3B16XMgZGVsIHRhZyBcInBhcmFtc1wiLgoranNwLmVycm9yLnBhcmFtLmludmFsaWRVc2U9TGEgYWNjafNuIGpzcDpwYXJhbSBubyBkZWJlIGRlIHNlciB1c2FkYSBmdWVyYSBkZSBsb3MgZWxlbWVudG9zIGpzcDppbmNsdWRlLCBqc3A6Zm9yd2FyZCBvIGpzcDpwYXJhbXMKK2pzcC5lcnJvci5wYXJhbXMuaW52YWxpZFVzZT1qc3A6cGFyYW1zIGRlYmUgZGUgc2VyIHVuIGhpam8gZGlyZWN0byBkZSBqc3A6cGx1Z2luCitqc3AuZXJyb3IuZmFsbGJhY2suaW52YWxpZFVzZT1qc3A6ZmFsbGJhY2sgZGViZSBkZSBzZXIgdW4gaGlqbyBkaXJlY3RvIGRlIGpzcDpwbHVnaW4KK2pzcC5lcnJvci5uYW1lZEF0dHJpYnV0ZS5pbnZhbGlkVXNlPWpzcDphdHRyaWJ1dGUgZGViZSBkZSBzZXIgZWwgc3ViZWxlbWVudG8gZGUgdW5hIGFjY2nzbiBlc3ThbmRhciBvIGRlIGNsaWVudGUKK2pzcC5lcnJvci5qc3Bib2R5LmludmFsaWRVc2U9anNwOmJvZHkgZGViZSBkZSBzZXIgZWwgc3ViZWxlbWVudG8gZGUgdW5hIGFjY2nzbiBlc3ThbmRhciBvIGRlIGNsaWVudGUKK2pzcC5lcnJvci5jbG9zZWluZGl2aWR1YWxwYXJhbT1FbCB0YWcgcGFyYW0gbmVjZXNpdGEgc2VyIGNlcnJhZG8gY29uIFwiLz5cIgoranNwLmVycm9yLmNsb3NlcGFyYW1zPUVsIHRhZyBwYXJhbSBuZWNlc2l0YSBzZXIgY2VycmFkbyBjb24gL3BhcmFtcworanNwLmVycm9yLnBhcmFtcy5lbXB0eUJvZHk9anNwOnBhcmFtcyBkZWJlIGRlIGNvbnRlbmVyIGFsIG1lbm9zIHVuIGpzcDpwYXJhbSBhbmlkYWRvCitqc3AuZXJyb3IucGFyYW1zLmlsbGVnYWxDaGlsZD1qc3A6cGFyYW1zIG5vIGRlYmUgZGUgY29udGVuZXIgZWxlbWVudG9zIGFuaWRhZG9zIHF1ZSBubyBzZWFuIGpzcDpwYXJhbQoranNwLmVycm9yLnBsdWdpbi5ub3R5cGU9VGlwbyBubyBkZWNsYXJhZG8gZW4ganNwOnBsdWdpbgoranNwLmVycm9yLnBsdWdpbi5iYWR0eXBlPVZhbG9yIGlsZWdhbCBwYXJhIGF0cmlidXRvICd0eXBlJyBlbiBqc3A6cGx1Z2luOiBkZWJlIGRlIHNlciAnYmVhbicgbyAnYXBwbGV0JworanNwLmVycm9yLnBsdWdpbi5ub2NvZGU9Q/NkaWdvIG5vIGRlY2xhcmFkbyBlbiBqc3A6cGx1Z2luCitqc3AuZXJyb3IuaXNlX29uX2NsZWFyPUVzIGlsZWdhbCB1c2FyIGNsZWFyKCkgY3VhbmRvIGVsIHRhbWHxbyBkZWwgYnVmZmVyIGVzIGNlcm8KK2pzcC5lcnJvci5zZXRwcm9wZXJ0eS5iZWFuTm90Rm91bmQ9c2V0UHJvcGVydHk6IEJlYW4gezB9IG5vIGVuY29udHJhZG8KK2pzcC5lcnJvci5nZXRwcm9wZXJ0eS5iZWFuTm90Rm91bmQ9Z2V0UHJvcGVydHk6IEJlYW4gezB9IG5vIGVuY29udHJhZG8KK2pzcC5lcnJvci5zZXRwcm9wZXJ0eS5DbGFzc05vdEZvdW5kPXNldFByb3BlcnR5OiBjbGFzZSB7MH0gbm8gZW5jb250cmFkYQorIyB0eXBvID8KKyNqc3AuZXJyb3Iuc2V0cHJvcGVydHkuaW52YWxpZFNheW50YXg9c2V0UHJvcGVydHk6IGNhbid0IGhhdmUgbm9uLW51bGwgdmFsdWUgd2hlbiBwcm9wZXJ0eT0qCitqc3AuZXJyb3Iuc2V0cHJvcGVydHkuaW52YWxpZFN5YW50YXg9c2V0UHJvcGVydHk6IE5vIHB1ZWRlIGhhYmVyIHVuIHZhbG9yIG5vIG51bG8gY3VhbmRvIHNlIGhhIGVzcGVjaWZpY2FkbyBwcm9wZXJ0eT0qCitqc3AuZXJyb3Iuc2V0cHJvcGVydHkuYmVhbkluZm9Ob3RGb3VuZD1zZXRwcm9wZXJ0eTogYmVhbkluZm8gcGFyYSBiZWFuIHswfSBubyBlbmNvbnRyYWRvCitqc3AuZXJyb3Iuc2V0cHJvcGVydHkucGFyYW1PclZhbHVlPXNldFByb3BlcnR5OiBPIHBhcmFtIG8gdmFsdWUgcHVlZGVuIGVzdGFyIHByZXNlbnRlcworanNwLmVycm9yLnNldHByb3BlcnR5LmFycmF5VmFsPXNldFByb3BlcnR5OiBObyBwdWVkZSBlc2NyaWJpciBlbiBsYSBwcm9waWVkYWQgZGUgYXJyYXkgezB9IGEgdHJhdulzIGRlIHVuYSB2YWxvciBkZSBjYWRlbmEgbGl0ZXJhbAoranNwLndhcm5pbmcua2VlcGdlbj1BdmlzbzogdmFsb3IgaW5jb3JyZWN0byBwYXJhIGVsIGluaXRQYXJhbSBrZWVwZ2VuLiBTZSB1c2Fy4SBlbCB2YWxvciBwb3IgZGVmZWN0byBkZSBcImZhbHNlXCIKK2pzcC53YXJuaW5nLnhwb3dlcmVkQnk9QXZpc286IHZhbG9yIGluY29ycmVjdG8gcGFyYSBlbCBpbml0UGFyYW0geHBvd2VyZWRCeS4gU2UgdXNhcuEgZWwgdmFsb3IgcG9yIGRlZmVjdG8gZGUgXCJmYWxzZVwiCitqc3Aud2FybmluZy5lbmFibGVQb29saW5nPUF2aXNvOiB2YWxvciBpbmNvcnJlY3RvIHBhcmEgZWwgaW5pdFBhcmFtIGVuYWJsZVBvb2xpbmcuIFNlIHVzYXLhIGVsIHZhbG9yIHBvciBkZWZlY3RvIGRlIFwidHJ1ZVwiCitqc3Aud2FybmluZy5pbnZhbGlkVGFnUG9vbFNpemU9QXZpc286IHZhbG9yIGluY29ycmVjdG8gcGFyYSBlbCBwYXLhbWV0cm8gaW5pdCBsbGFtYWRvIHRhZ1Bvb2xTaXplLiBTZSB1c2Fy4SBsYSBtZWRpZGEgcG9yIGRlZmVjdG8gZGUgezB9Citqc3Aud2FybmluZy5tYXBwZWRGaWxlPUF2aXNvOiB2YWxvciBpbmNvcnJlY3RvIHBhcmEgZWwgaW5pdFBhcmFtIG1hcHBlZEZpbGUuIFNlIHVzYXLhIGVsIHZhbG9yIHBvciBkZWZlY3RvIGRlIFwiZmFsc2VcIgoranNwLndhcm5pbmcuc2VuZEVyclRvQ2xpZW50PUF2aXNvOiB2YWxvciBpbmNvcnJlY3RvIHBhcmEgZWwgaW5pdFBhcmFtIHNlbmRFcnJUb0NsaWVudC4gU2UgdXNhcuEgZWwgdmFsb3IgcG9yIGRlZmVjdG8gZGUgXCJmYWxzZVwiCitqc3Aud2FybmluZy5jbGFzc0RlYnVnSW5mbz1BdmlzbzogdmFsb3IgaW5jb3JyZWN0byBwYXJhIGVsIGluaXRQYXJhbSBjbGFzc2RlYnVnaW5mby4gU2UgdXNhcuEgZWwgdmFsb3IgcG9yIGRlZmVjdG8gZGUgXCJmYWxzZVwiCitqc3Aud2FybmluZy5jaGVja0ludGVydmFsPUF2aXNvOiB2YWxvciBpbmNvcnJlY3RvIHBhcmEgZWwgaW5pdFBhcmFtIGNoZWNrSW50ZXJ2YWwuIFNlIHVzYXLhIGVsIHZhbG9yIHBvciBkZWZlY3RvIGRlIFwiMzAwXCIgc2VndW5kb3MKK2pzcC53YXJuaW5nLmRldmVsb3BtZW50PUF2aXNvOiB2YWxvciBpbmNvcnJlY3RvIHBhcmEgZWwgaW5pdFBhcmFtIGRldmVsb3BtZW50LiBTZSB1c2Fy4SBlbCB2YWxvciBwb3IgZGVmZWN0byBkZSBcInRydWVcIgoranNwLndhcm5pbmcuZm9yaz1BdmlzbzogdmFsb3IgaW5jb3JyZWN0byBwYXJhIGVsIGluaXRQYXJhbSBmb3JrLiBTZSB1c2Fy4SBlbCB2YWxvciBwb3IgZGVmZWN0byBkZSBcInRydWVcIgoranNwLndhcm5pbmcucmVsb2FkaW5nPUF2aXNvOiB2YWxvciBpbmNvcnJlY3RvIHBhcmEgZWwgaW5pdFBhcmFtIHJlbG9hZGluZy4gU2UgdXNhcuEgZWwgdmFsb3IgcG9yIGRlZmVjdG8gZGUgXCJ0cnVlXCIKK2pzcC53YXJuaW5nLmR1bXBTbWFwPUF2aXNvOiB2YWxvciBpbmNvcnJlY3RvIHBhcmEgZWwgaW5pdFBhcmFtIGR1bXBTbWFwLiBTZSB1c2Fy4SBlbCB2YWxvciBwb3IgZGVmZWN0byBkZSBcImZhbHNlXCIKK2pzcC53YXJuaW5nLmdlbmNoYXJhcnJheT1BdmlzbzogdmFsb3IgaW5jb3JyZWN0byBwYXJhIGVsIGluaXRQYXJhbSBnZW5TdHJBc0NoYXJBcnJheS4gU2UgdXNhcuEgZWwgdmFsb3IgcG9yIGRlZmVjdG8gZGUgXCJmYWxzZVwiCitqc3Aud2FybmluZy5zdXBwcmVzc1NtYXA9QXZpc286IHZhbG9yIGluY29ycmVjdG8gcGFyYSBlbCBpbml0UGFyYW0gc3VwcHJlc3NTbWFwLiBTZSB1c2Fy4SBlbCB2YWxvciBwb3IgZGVmZWN0byBkZSBcImZhbHNlXCIKK2pzcC5lcnJvci5iYWR0YWdsaWI9Tm8gc2UgcHVlZGUgYWJyaXIgbGEgYmlibGlvdGVjYSBkZSB0YWdzIHswfTogezF9Citqc3AuZXJyb3IuYmFkR2V0UmVhZGVyPU5vIHNlIHB1ZWRlIGNyZWFyIHVuIHJlYWRlciBjdWFuZG8gZWwgc3RyZWFtIG5vIHRpZW5lIGJ1ZmZlcgoranNwLndhcm5pbmcudW5rbm93bi5lbGVtZW50LmluLnRhZ2xpYj1FbGVtZW50byBkZXNjb25vY2lkbyAoezB9KSBlbiB0YWdsaWIKK2pzcC53YXJuaW5nLnVua25vd24uZWxlbWVudC5pbi50YWc9RWxlbWVudG8gZGVzY29ub2NpZG8gKHswfSkgZW4gdGFnCitqc3Aud2FybmluZy51bmtub3duLmVsZW1lbnQuaW4uYXR0cmlidXRlPUVsZW1lbnRvIGRlc2Nvbm9jaWRvICh7MH0pIGVuIGF0dHJpYnV0ZQoranNwLndhcm5pbmcudW5rbm93bi5lbGVtZW50LmluLnZhcmlhYmxlPUVsZW1lbnRvIGRlc2Nvbm9jaWRvICh7MH0pIGVuIHZhcmlhYmxlCitqc3Aud2FybmluZy51bmtub3duLmVsZW1lbnQuaW4udmFsaWRhdG9yPUVsZW1lbnRvIGRlc2Nvbm9jaWRvICh7MH0pIGVuIHZhbGlkYXRvcgoranNwLndhcm5pbmcudW5rbm93bi5lbGVtZW50LmluLmluaXRQYXJhbT1FbGVtZW50byBkZXNjb25vY2lkbyAoezB9KSBlbiBpbml0LXBhcmFtIGRlIHZhbGlkYXRvcgoranNwLndhcm5pbmcudW5rbm93bi5lbGVtZW50LmluLmZ1bmN0aW9uPUVsZW1lbnRvIGRlc2Nvbm9jaWRvICh7MH0pIGVuIGZ1bmN0aW9uCitqc3AuZXJyb3IubW9yZS50aGFuLm9uZS50YWdsaWI9TeFzIGRlIHVuYSBiaWJsaW90ZWNhIGRlIHRhZ3MgZW4gZWwgVExEOiB7MH0KK2pzcC5lcnJvci50ZWljbGFzcy5pbnN0YW50aWF0aW9uPU5vIHNlIHB1ZWRlIGNhcmdhciBsYSBjbGFzZSBUYWdFeHRyYUluZm8gbGxhbWFkYTogezB9Citqc3AuZXJyb3Iubm9uX251bGxfdGVpX2FuZF92YXJfc3ViZWxlbXM9VGFnIHswfSB0aWVuZSB1bm8gbyBt4XMgc3ViZWxlbWVudG9zIHZhcmlhYmxlIHkgdW5hIGNsYXNlIFRhZ0V4dHJhSW5mbyBxdWUgZGV2dWVsdmUgdW5hIG8gbeFzIFZhcmlhYmxlSW5mbworanNwLmVycm9yLnBhcnNlLmVycm9yLmluLlRMRD1FcnJvciBkZSBhbuFsaXNpcyBlbiBlbCBkZXNjcmlwdG9yIGRlIGJpYmxpb3RlY2EgZGUgdGFnczogezB9Citqc3AuZXJyb3IudW5hYmxlLnRvLm9wZW4uVExEPU5vIHNlIHB1ZWRlIGFicmlyIGVsIGRlc2NyaXB0b3IgZGUgYmlibGlvdGVjYSBkZSB0YWdzOiB7MH0KK2pzcC5idWZmZXIuc2l6ZS56ZXJvPVRhbWHxbyBkZSBidWZmZXIgPD0gMAoranNwLmVycm9yLmZpbGUubm90LmZvdW5kPUFyY2hpdm8gSlNQIFwiezB9XCIgbm8gZW5jb250cmFkbworanNwLm1lc3NhZ2UuY29weWluZ3VyaT1Db3BpYW5kbyB7MH0gZW4gezF9Citqc3AubWVzc2FnZS5odG1sY29tbWVudD1cblF1aXRhbmRvIGNvbWVudGFyaW86IFx0ezB9Citqc3AubWVzc2FnZS5oYW5kbGluZ19kaXJlY3RpdmU9XG5SZXNvbHZpZW5kbyBkaXJlY3RpdmE6IHswfVx0ezF9Citqc3AubWVzc2FnZS5oYW5kbGluZ19wbHVnaW49XG5QbHVnaW46IHswfQoranNwLm1lc3NhZ2UucGFja2FnZV9uYW1lX2lzPUVsIE5vbWJyZSBkZWwgUGFja2FnZSBlczogezB9Citqc3AubWVzc2FnZS5jbGFzc19uYW1lX2lzPUVsIE5vbWJyZSBkZSBsYSBjbGFzZSBlczogezB9Citqc3AubWVzc2FnZS5qYXZhX2ZpbGVfbmFtZV9pcz1FbCBOb21icmUgZGVsIEFyY2hpdm8gSmF2YSBlczogezB9Citqc3AubWVzc2FnZS5jbGFzc19maWxlX25hbWVfaXM9RWwgTm9tYnJlIGRlbCBBcmNoaXZvIGRlIGNsYXNlIGVzOiB7MH0KK2pzcC5tZXNzYWdlLmFjY2VwdGVkPUFjZXB08yB7MH0gZW4gezF9Citqc3AubWVzc2FnZS5hZGRpbmdfamFyPUHxYWRpZW5kbyBqYXIgezB9IGEgbWkgY2xhc3NwYXRoCitqc3AubWVzc2FnZS5jb21waWxpbmdfd2l0aD1Db21waWxhZG8gY29uOiB7MH0KK2pzcC5tZXNzYWdlLnRlbXBsYXRlX3RleHQ9dGV4dG8gcGxhbnRpbGxhCitqc3AuZXJyb3IubWlzc2luZ19hdHRyaWJ1dGU9RGUgYWN1ZXJkbyBjb24gZWwgVExEIGVsIGF0cmlidXRvIHswfSBlcyBvYmxpZ2F0b3JpbyBwYXJhIGVsIHRhZyB7MX0KK2pzcC5lcnJvci5iYWRfYXR0cmlidXRlPUVsIGF0cmlidXRvIHswfSBubyBlcyB24WxpZG8gc2Vn+m4gZWwgVExEIGVzcGVjaWZpY2FkbworanNwLmVycm9yLnRsZC51bmFibGVfdG9fcmVhZD1JbXBvc2libGUgZGUgbGVlciBUTEQgXCJ7MX1cIiBkZXNkZSBhcmNoaXZvIEpBUiBcInswfVwiOiB7Mn0KK2pzcC5lcnJvci50bGQudW5hYmxlX3RvX2dldF9qYXI9SW1wb3NpYmxlIG9idGVuZXIgcmVjdXJzbyBKQVIgXCJ7MH1cIiBjb250ZW5pZW5kbyBUTEQ6IHsxfQoranNwLmVycm9yLnRsZC5taXNzaW5nX2phcj1GYWx0YSByZWN1cnNvIEpBUiBcInswfVwiIGNvbnRlbmllbmRvIFRMRAoranNwLmVycm9yLndlYnhtbF9ub3RfZm91bmQ9Tm8gcHVlZG8gbG9jYWxpemFyIHdlYi54bWwKK2pzcC5jbWRfbGluZS51c2FnZT1Vc286IGpzcHRvc2VydmxldCBbLWRkIDxydXRhL2EvRGlyZWN0b3Jpb1NhbGlkYT5dIFsta2VlcGdlbmVyYXRlZF0gPEFyY2hpdm9zIC5qc3A+Citqc3AubWVzc2FnZS5jcF9pcz1DbGFzc3BhdGggezB9IGVzOiB7MX0KK2pzcC5lcnJvci51bmFibGUudG9fbG9hZF90YWdoYW5kbGVyX2NsYXNzPU5vIHNlIHB1ZWRlIGNhcmdhciBjbGFzZSBtYW5lamFkb3JhIHswfSBkZWwgdGFnIGEgY2F1c2EgZGUgezF9Citqc3AuZXJyb3IudW5hYmxlLnRvX2ZpbmRfbWV0aG9kPU5vIHNlIHB1ZWRlIGVuY29udHJhciBlbCBt6XRvZG8gZGUgZXNjcml0dXJhIHBhcmEgZWwgYXRyaWJ1dG86IHswfQoranNwLmVycm9yLnVuYWJsZS50b19jb252ZXJ0X3N0cmluZz1ObyBwdWRlIGNvbnZlcnRpciB1biBTdHJpbmcgYSB7MH0gcGFyYSBhdHJpYnV0byB7MX0KK2pzcC5lcnJvci51bmFibGUudG9faW50cm9zcGVjdD1ObyBzZSBwdWVkZSBoYWNlciBpbnRyb3NwZWNjafNuIGVuIG1hbmVqYWRvciBkZSB0YWcgY2xhc2U6IHswfSBhIGNhdXNhIGRlIHsxfQoranNwLmVycm9yLmJhZF90YWc9Tm8gZXhpc3RlIGVsIHRhZyB7MH0gZW4gbGEgYmlibGlvdGVjYSBpbXBvcnRhZGEgY29uIHByZWZpam8gezF9Citqc3AuZXJyb3IueG1sLmJhZF90YWc9Tm8gc2UgaGEgZGVmaW5pZG8gZWwgdGFnIFwiezB9XCIgZW4gbGEgYmlibGlvdGVjYSB0YWcgYXNvY2lhZGEgY29uIHVyaSBcInsxfVwiCitqc3AuZXJyb3IuYmFkX3N0cmluZ19DaGFyYWN0ZXI9Tm8gcHVlZGUgZXh0cmFlciB1biBDaGFyYWN0ZXIgZGVzZGUgdW4gYXJyYXkgZGUgdGFtYfFvIGNlcm8KK2pzcC5lcnJvci5iYWRfc3RyaW5nX2NoYXI9Tm8gcHVlZGUgZXh0cmFlciB1biBjaGFyIGRlc2RlIHVuIGFycmF5IGRlIHRhbWHxbyBjZXJvCitqc3Aud2FybmluZy5jb21waWxlci5jbGFzcy5jYW50Y3JlYXRlPU5vIHB1ZWRvIGNyZWFyIHVuYSBpbnN0YW5jaWEgZGUgbGEgY2xhc2UgZXNwZWNpZmljYWRhIHswfSBkZSBwbHVnaW4gZGVsIGNvbXBpbGFkb3IgZGViaWRvIGEgezF9LiBTZSB1c2Fy4SBlbCBjb21waWxhZG9yIEphdmEgZGUgU3VuLgoranNwLndhcm5pbmcuY29tcGlsZXIuY2xhc3Mubm90Zm91bmQ9Tm8gcHVlZG8gZW5jb250cmFyIHVuYSBpbnN0YW5jaWEgZGUgbGEgY2xhc2UgezB9IGRlIHBsdWdpbiBkZSBjb21waWxhZG9yLiBTZSB1c2Fy4SBlbCBjb21waWxhZG9yIGRlbCBKYXZhIGRlIFN1bi4KK2pzcC53YXJuaW5nLmNvbXBpbGVyLnBhdGgubm90Zm91bmQ9VHJheWVjdG9yaWEgZGVsIGNvbXBpbGFkb3IgZXNwZWNpZmljYWRvIHswfSBubyBlbmNvbnRyYWRhLiBTZSB1c2Fy4SBlbCBQQVRIIGRlbCBzaXN0ZW1hLgoranNwLmVycm9yLmpzcGMudXJpcm9vdF9ub3RfZGlyPUxhIG9wY2nzbiAtdXJpcm9vdCBkZWJlIGRlIGVzcGVjaWZpY2FyIHVuIGRpcmVjdG9yaW8geWEgZXhpc3RlbnRlCitqc3AuZXJyb3IuanNwYy5taXNzaW5nVGFyZ2V0PUZhbHRhIHRhcmdldDogRGViZSBkZSBlc3BlY2lmaWNhciAtd2ViYXBwIG8gLXVyaXJvb3QgbyB1bmEgbyBt4XMgcOFnaW5hcyBKU1AKK2pzcC5lcnJvci5qc3BjLm5vX3VyaXJvb3Q9Tm8gc2UgaGEgZXNwZWNpZmljYWRvIHVyaXJvb3QgeSBubyBwdWVkZSBzZXIgbG9jYWxpemFkbyBlbiBsb3MgYXJjaGl2b3MgSlNQIGVzcGVjaWZpY2Fkb3MKK2pzcGMuaW1wbGljaXQudXJpUm9vdD11cmlSb290IGltcGxpY2l0YW1lbnRlIHB1ZXN0byBhICJ7MH0iCitqc3BjLnVzYWdlPVVzbzoganNwYyA8b3BjaW9uZXM+IFstLV0gPEFyY2hpdm9zIEpTUD5cblwKK2RvbmRlIDxBcmNoaXZvcyBKU1A+IHNvbjpcblwKK1wgICAgLXdlYmFwcCA8ZGlyPiAgICAgIFVuIGRpcmVjdG9yaW8gY29udGVuaWVuZG8gdW5hIHdlYi1hcHAuIFRvZGFzIGxhc1xuXAorXCAgICAgICAgICAgICAgICAgICAgICAgcOFnaW5hcyBqc3Agc2Vy4W4gY29tcGlsYWRhcyByZWN1cnNpdmFtZW50ZVxuXAorbyBjdWFscXVpZXIgbvptZXJvIGRlXG5cCitcICAgIDxBcmNoaXZvPiAgICAgICAgICBVbiBBcmNoaXZvIHBhcmEgc2VyIGludGVycHJldGFkbyBjb21vIHVuYSBw4WdpbmEganNwXG5cCit5IGRvbmRlIDxvcGNpb25lcz4gaW5jbHV5ZW46XG5cCitcICAgIC1oZWxwICAgICAgICAgICAgICBNdWVzdHJhIGVzdGUgbWVuc2FqZSBkZSBheXVkYVxuXAorXCAgICAtdiAgICAgICAgICAgICAgICAgTW9kbyBkZXRhbGxhZG9cblwKK1wgICAgLWQgPGRpcj4gICAgICAgICAgIERpcmVjdG9yaW8gZGUgc2FsaWRhXG5cCitcICAgIC1sICAgICAgICAgICAgICAgICBNdWVzdHJhIGVsIG5vbWJyZSBkZSBsYSBw4WdpbmEgSlNQIGFsIG9jdXJyaXIgdW4gZmFsbG9cblwKK1wgICAgLXMgICAgICAgICAgICAgICAgIE11ZXN0cmEgZWwgbm9tYnJlIGRlIGxhIHDhZ2luYSBKU1AgYWwgdGVuZXIg6XhpdG9cblwKK1wgICAgLXAgPG5hbWU+ICAgICAgICAgIE5vbWJyZSBkZWwgcGFja2FnZSBvYmpldGl2b1xuXAorXCAgICAgICAgICAgICAgICAgICAgICAgKHBvciBkZWZlY3RvIG9yZy5hcGFjaGUuanNwKVxuXAorXCAgICAtYyA8bmFtZT4gICAgICAgICAgTm9tYnJlIGRlIGxhIGNsYXNlIG9iamV0aXZvXG5cCitcICAgICAgICAgICAgICAgICAgICAgICAoc/NsbyBzZSBhcGxpY2EgYSBsYSBwcmltZXJhIHDhZ2luYSBKU1ApXG5cCitcICAgIC1tYXBwZWQgICAgICAgICAgICBHZW5lcmEgbGxhbWFkYXMgc2VwYXJhZGFzIGEgd3JpdGUoKSBwYXJhIGNhZGEgbO1uZWEgZGVcblwKK1wgICAgICAgICAgICAgICAgICAgICAgIEhUTUwgZW4gZWwgSlNQXG5cCitcICAgIC1kaWVbI10gICAgICAgICAgICBHZW5lcmEgdW4gY/NkaWdvIGRlIHJldG9ybm8gZGUgZXJyb3IgKCMpIGVuIGVycm9yZXNcblwKK1wgICAgICAgICAgICAgICAgICAgICAgIGZhdGFsZXMuIChwb3IgZGVmZWN0byAxKS5cblwKK1wgICAgLXVyaWJhc2UgPGRpcj4gICAgIEVsIGRpcmVjdG9yaW8gdXJpIGRlIGRvbmRlIGRlYmVuIGRlIHBhcnRpciBsYXNcblwKK1wgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGFjaW9uZXMuIChwb3IgZGVmZWN0byAiLyIpXG5cCitcICAgIC11cmlyb290IDxkaXI+ICAgICBJZ3VhbCBxdWUgLXdlYmFwcFxuXAorXCAgICAtY29tcGlsZSAgICAgICAgICAgQ29tcGlsYSBsb3Mgc2VydmxldHMgZ2VuZXJhZG9zXG5cCitcICAgIC13ZWJpbmMgPGZpbGU+ICAgICBDcmVhIHVub3MgbWFwZW9zIHBhcmNpYWxlcyBkZSBzZXJ2bGV0IGVuIGVsIGFyY2hpdm9cblwKK1wgICAgLXdlYnhtbCA8ZmlsZT4gICAgIENyZWEgdW4gd2ViLnhtbCBjb21wbGV0byBlbiBlbCBhcmNoaXZvLlxuXAorXCAgICAtaWVwbHVnaW4gPGNsc2lkPiAgSmF2YSBQbHVnaW4gY2xhc3NpZCBwYXJhIEludGVybmV0IEV4cGxvcmVyXG5cCitcICAgIC1jbGFzc3BhdGggPHBhdGg+ICBQYXNhIHBvciBhbHRvIGxhIHByb3BpZWRhZCBkZSBzaXN0ZW1hIGphdmEuY2xhc3MucGF0aFxuXAorXCAgICAteHBvd2VyZWRCeSAgICAgICAgQfFhZGUgY2FiZWNlcmEgZGUgcmVzcHVlc3RhICBYLVBvd2VyZWQtQnlcblwKKworanNwYy53ZWJ4bWwuaGVhZGVyPTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz5cblwKK1xuXAorPCFET0NUWVBFIHdlYi1hcHBcblwKK1wgICAgUFVCTElDICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgV2ViIEFwcGxpY2F0aW9uIDIuMy8vRU4iXG5cCitcICAgICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC93ZWItYXBwXzJfMy5kdGQiPlxuXAorPCEtLVxuXAorQ3JlYWRvIGF1dG9tYXRpY2FtZW50ZSBtZWRpYW50ZSBUb21jYXQgSnNwQy5cblwKKy0tPlxuXAorPHdlYi1hcHA+XG5cCitcbgoranNwYy53ZWJ4bWwuZm9vdGVyPVxuXAorPC93ZWItYXBwPlxuXAorXG4KK2pzcGMud2ViaW5jLmhlYWRlcj1cblwKKzwhLS1cblwKK0NyZWFkbyBhdXRvbWF0aWNhbWVudGUgbWVkaWFudGUgVG9tY2F0IEpzcEMuXG5cCitDb2xvcXVlIGVzdGUgZnJhZ21lbnRvIGVuIGVsIGZpY2hlcm8gd2ViLnhtbCBhbnRlcyBkZSBcblwKK3RvZG9zIGxvcyBlbGVtZW50b3M6IGljb24sIGRpc3BsYXktbmFtZSwgZGVzY3JpcHRpb24sIFxuXAorZGlzdHJpYnV0YWJsZSB5IGNvbnRleHQtcGFyYW0gLlxuXAorLS0+XG4KK2pzcGMud2ViaW5jLmZvb3Rlcj1cblwKKzwhLS1cblwKK0xvcyBFbGVtZW50b3M6IHNlc3Npb24tY29uZmlnLCBtaW1lLW1hcHBpbmcsIHdlbGNvbWUtZmlsZS1saXN0LCBlcnJvci1wYWdlLCB0YWdsaWIsXG5cCityZXNvdXJjZS1yZWYsIHNlY3VyaXR5LWNvbnN0cmFpbnQsIGxvZ2luLWNvbmZpZywgc2VjdXJpdHktcm9sZSxcblwKK2Vudi1lbnRyeSB5IGVqYi1yZWYgZGViZXLhbiBkZSBpciBkZXNwdelzIGRlIGVzdGUgZnJhZ21lbnRvIC5cblwKKy0tPlxuCitqc3BjLndlYmluYy5pbnNlcnRFbmQ9PCEtLSBGaW4gZGUgbWFwZW9zIGRlIHNlcnZsZXQgSlNQQyAtLT4KK2pzcGMud2ViaW5jLmluc2VydFN0YXJ0PTwhLS0gSW5pY2lvIGRlIG1hcGVvcyBkZSBzZXJ2bGV0IEpTUEMgLS0+Citqc3BjLmVycm9yLmphc3BlckV4Y2VwdGlvbj1lcnJvci1lbCBhcmNoaXZvICcnezB9JycgaGEgZ2VuZXJhZG8gbGEgZXhjZXBjafNuIGRlIHNpbnTheGlzIHNpZ3VpZW50ZTogezF9Citqc3BjLmVycm9yLmdlbmVyYWxFeGNlcHRpb249RVJST1ItZWwgYXJjaGl2byAnJ3swfScnIGhhIGdlbmVyYWRvIGxhIGV4Y2VwY2nzbiBnZW5lcmFsIHNpZ3VpZW50ZToKK2pzcGMuZXJyb3IuZmlsZURvZXNOb3RFeGlzdD1FbCBhcmNoaXZvICcnezB9JycgdXRpbGl6YWRvIGNvbW8gYXJndW1lbnRvIG5vIGV4aXN0ZS4KK2pzcGMuZXJyb3IuZW1wdHlXZWJBcHA9LXdlYmFwcCBuZWNlc2l0YSB1biBhcmd1bWVudG8gZGUgYXJjaGl2bworanNwLmVycm9yLmxpYnJhcnkuaW52YWxpZD1MYSBw4WdpbmEgSlNQIGVzIGluY29ycmVjdGEgZGUgYWN1ZXJkbyBhIGxhIGJpYmxpb3RlY2EgezB9OiB7MX0KK2pzcC5lcnJvci50bHZjbGFzcy5pbnN0YW50aWF0aW9uPU5vIHB1ZGUgY2FyZ2FyIG8gaW5zdGFuY2lhciBjbGFzZSBUYWdMaWJyYXJ5VmFsaWRhdG9yOiB7MH0KK2pzcC5lcnJvci50bHYuaW52YWxpZC5wYWdlPU1lbnNhamVzIGRlIGVycm9yIGRlIHZhbGlkYWNp824gZGVzZGUgVGFnTGlicmFyeVZhbGlkYXRvciBwYXJhIHswfQoranNwLmVycm9yLnRlaS5pbnZhbGlkLmF0dHJpYnV0ZXM9TWVuc2FqZXMgZGUgZXJyb3IgZGUgdmFsaWRhY2nzbiBkZXNkZSBUYWdFeHRyYUluZm8gcGFyYSB7MH0KK2pzcC5wYXJzZXIuc2F4LnByb3BlcnR5bm90c3VwcG9ydGVkPVByb3BpZWRhZCBTQVggbm8gc29wb3J0YWRhOiB7MH0KK2pzcC5wYXJzZXIuc2F4LnByb3BlcnR5bm90cmVjb2duaXplZD1Qcm9waWVkYWQgU0FYIG5vIHJlY29ub2NpZGE6IHswfQoranNwLnBhcnNlci5zYXguZmVhdHVyZW5vdHN1cHBvcnRlZD1DYXJhY3Rlcu1zdGljYSBTQVggbm8gc29wb3J0YWRhOiB7MH0KK2pzcC5wYXJzZXIuc2F4LmZlYXR1cmVub3RyZWNvZ25pemVkPUNhcmFjdGVy7XN0aWNhIFNBWCBubyByZWNvbm9jaWRhOiB7MH0KK2pzcC5lcnJvci5uby5tb3JlLmNvbnRlbnQ9QWxjYW56YWRvIGZpbiBkZSBjb250ZW5pZG8gbWlldHJhcyBzZSByZXF1ZXLtYSBt4XMgYW7hbGlzaXM6IL9lcnJvciBkZSBhbmlkYW1pZW50byBkZSB0YWc/Citqc3AuZXJyb3IucGFyc2UueG1sPUVycm9yIGRlIGFu4Wxpc2lzIFhNTCBlbiBhcmNoaXZvIHswfQoranNwLmVycm9yLnBhcnNlLnhtbC5saW5lPUVycm9yIGRlIGFu4Wxpc2lzIFhNTCBlbiBhcmNoaXZvIHswfTogKGztbmVhIHsxfSwgY29sIHsyfSkKK2pzcC5lcnJvci5wYXJzZS54bWwuc2NyaXB0aW5nLmludmFsaWQuYm9keT1FbCBjdWVycG8gZGUgZWxlbWVudG8gezB9IG5vIGRlYmUgZGUgY29udGVuZXIgZWxlbWVudG9zIFhNTAoranNwLmVycm9yLmludGVybmFsLnRsZGluaXQ9Tm8gcHVkZSBpbmljaWFsaXphciBUbGRMb2NhdGlvbnNDYWNoZTogezB9Citqc3AuZXJyb3IuaW50ZXJuYWwuZmlsZW5vdGZvdW5kPUVycm9yIEludGVybm86IEFyY2hpdm8gezB9IG5vIGhhbGxhZG8KK2pzcC5lcnJvci5pbnRlcm5hbC5ldmFsdWF0b3Jfbm90X2ZvdW5kPUVycm9yIGludGVybm86IG5vIHB1ZGUgY2FyZ2FyIGV2YWx1YWRvciBkZSBleHByZXNpb25lcworanNwLmVycm9yLnBhcnNlLnhtbC5pbnZhbGlkUHVibGljSWQ9UFVCTElDIElEIGluY29ycmVjdGE6IHswfQoranNwLmVycm9yLmluY2x1ZGUuZmx1c2guaW52YWxpZC52YWx1ZT1WYWxvciBpbmNvcnJlY3RvIHBhcmEgYXRyaWJ1dG8gZmx1c2g6IHswfQoranNwLmVycm9yLnVuc3VwcG9ydGVkLmVuY29kaW5nPUNvZGlmaWNhY2nzbiBubyBzb3BvcnRhZGE6IHswfQordGxkLmVycm9yLnZhcmlhYmxlTm90QWxsb3dlZD1FcyB1biBlcnJvciBwYXJhIHVuIHRhZywgcXVlIHRpZW5lIHVubyBvIG3hcyBzdWJlbGVtZW50b3MgdmFyaWFibGVzLCBlbCB0ZW5lciB1bmEgY2xhc2UgVGFnRXh0cmFJbmZvIHF1ZSBkZXZ1ZWx2ZSB1biBvYmpldG8gbm8gbnVsby4KK2pzcC5lcnJvci50bGRJbldlYkRvdFhtbE5vdEZvdW5kPU5vIHB1ZGUgbG9jYWxpemFyIFRMRCB7MX0gcGFyYSBVUkkgezB9IGVzcGVjaWZpY2FkbyBlbiB3ZWIueG1sCitqc3AuZXJyb3IudGFnbGliRGlyZWN0aXZlLmFic1VyaUNhbm5vdEJlUmVzb2x2ZWQ9TGEgdXJpIGFic29sdXRhOiB7MH0gbm8gcHVlZGUgcmVzb2x2ZXJzZSBvIGVuIHdlYi54bWwgbyBlbCBsb3MgYXJjaGl2b3MgamFyIGRlc3BsZWdhZG9zIGNvbiBlc3RhIGFwbGljYWNp824KK2pzcC5lcnJvci50YWdsaWJEaXJlY3RpdmUubWlzc2luZy5sb2NhdGlvbj1ObyBzZSBoYSBlc3BlY2lmaWNhZG8gbmkgZWwgYXRyaWJ1dG8gXCd1cmlcJyBuaSBlbCBcJ3RhZ2RpclwnCitqc3AuZXJyb3IudGFnbGliRGlyZWN0aXZlLmJvdGhfdXJpX2FuZF90YWdkaXI9U2UgaGFuIGVzcGVjaWZpY2FkbyBhbWJvcyBhdHJpYnV0b3MgXCd1cmlcJyB5IFwndGFnZGlyXCcKK2pzcC5lcnJvci5pbnZhbGlkLnRhZ2Rpcj1FbCBkaXJlY3RvcmlvIGRlIGFyY2hpdm8gVGFnIHswfSBubyBjb21pZW56YSBjb24gXCIvV0VCLUlORi90YWdzXCIKK2pzcC5lcnJvci51bnRlcm1pbmF0ZWQudXNlci50YWc9VGFnIGRlZmluaWRvIHBvciB1c3VhcmlvIG5vIHRlcm1pbmFkbzogdGFnIGZpbmFsIHswfSBubyBoYWxsYWRvIG8gYW5pZGFkbyBpbmNvcnJlY3RhbWVudGUKKyNqc3B4LmVycm9yLnRlbXBsYXRlRGF0YU5vdEluSnNwQ2RhdGE9VmFsaWRhdGlvbiBFcnJvcjogRWxlbWVudCAmbHQ7ezB9Jmd0OyBjYW5ub3QgaGF2ZSB0ZW1wbGF0ZSBkYXRhLiBUZW1wbGF0ZSBkYXRhIG11c3QgYmUgZW5jYXBzdWxhdGVkIHdpdGhpbiBhICZsdDtqc3A6Y2RhdGEmZ3Q7IGVsZW1lbnQuIFtKU1AxLjIgUEZEIHNlY3Rpb24gNS4xLjldXG5UZW1wbGF0ZSBkYXRhIGluIGVycm9yOiB7MX0KK2pzcHguZXJyb3IudGVtcGxhdGVEYXRhTm90SW5Kc3BDZGF0YT1FcnJvciBkZSBWYWxpZGFjafNuOiBFbCBFbGVtZW50byAmbHQ7ezB9Jmd0OyBubyBwdWVkZSB0ZW5lciBkYXRvcyBwbGFudGlsbGEuIExvcyBkYXRvcyBwbGFudGlsbGEgZGViZW4gZGUgZXN0YXIgZW5jYXBzdWxhZG9zIGRlbnRybyBkZSB1biBlbGVtZW50byAmbHQ7anNwOnRleHQmZ3Q7LiBbSlNQMS4yIFBGRCBzZWNjafNuIDUuMS45XVxuRGF0b3MgZGUgUGxhbnRpbGxhIGVuIGVycm9yOiB7MX0KKyNFcnJvciB3aGlsZSBwcm9jZXNzaW5nIHRhZ2xpYiBqYXIgZmlsZSB7MH06IHsxfQoranNwLmVycm9yLnRhZ2xpYi5yZXNlcnZlZC5wcmVmaXg9RWwgcHJlZmlqbyB0YWdsaWIgezB9IGVzdOEgcmVzZXJ2YWRvCitqc3AuZXJyb3IuaW52YWxpZC5qYXZhRW5jb2Rpbmc9Q29kaWZpY2FjaW9uZXMgamF2YSBpbmNvcnJlY3Rhcy4gSW50ZW506SB7MH0geSBsdWVnbyB7MX0uIEFtYmFzIGZhbGxhcm9uLgoranNwLmVycm9yLm5lZWRBbHRlcm5hdGVKYXZhRW5jb2Rpbmc9TGEgY29kaWZpY2FjafNuIGphdmEgcG9yIGRlZmVjdG8gezB9IGVzIGluY29ycmVjdGEgZW4gdHUgcGxhdGFmb3JtYSBqYXZhLiBTZSBwdWVkZSBlc3BlY2lmaWNhciB1bmEgYWx0ZXJuYXRpdmEgdu1hIHBhcuFtZXRybyAnamF2YUVuY29kaW5nJyBkZSBKc3BTZXJ2bGV0LgorI0Vycm9yIHdoZW4gY29tcGlsaW5nLCB1c2VkIGZvciBqc3AgbGluZSBudW1iZXIgZXJyb3IgbWVzc2FnZXMKK2pzcC5lcnJvci5zaW5nbGUubGluZS5udW1iZXI9SGEgdGVuaWRvIGx1Z2FyIHVuIGVycm9yIGVuIGxhIGztbmVhOiB7MH0gZW4gZWwgYXJjaGl2byBqc3A6IHsxfQoranNwLmVycm9yLm11bHRpcGxlLmxpbmUubnVtYmVyPVxuXG5IYSB0ZW5pZG8gbHVnYXIgdW4gZXJyb3IgZW50cmUgbGFzIGztbmVhczogezB9IHkgezF9IGVuIGVsIGFyY2hpdm8ganNwOiB7Mn1cblxuCitqc3AuZXJyb3IuY29ycmVzcG9uZGluZy5zZXJ2bGV0PUVycm9yIGRlIHNlcnZsZXQgZ2VuZXJhZG86XG4KK2pzcC5lcnJvci5lbXB0eS5ib2R5Lm5vdC5hbGxvd2VkPUN1ZXJwbyB2YWPtbyBubyBwZXJtaXRpZG8gcGFyYSB7MH0KK2pzcC5lcnJvci5qc3Bib2R5LnJlcXVpcmVkPVNlIGRlYmUgZGUgdXNhciBqc3A6Ym9keSBwYXJhIGVzcGVjaWZpY2FyIGN1ZXJwbyB0YWcgcGFyYSB7MH0gc2kgc2UgdXNhIGpzcDphdHRyaWJ1dGUuCitqc3AuZXJyb3IuanNwYm9keS5lbXB0eWJvZHkub25seT1FbCB0YWcgezB9IHPzbG8gcHVlZGUgdGVuZXIganNwOmF0dHJpYnV0ZSBlbiBzdSBjdWVycG8uCitqc3AuZXJyb3Iubm8uc2NyaXB0bGV0cz1Mb3MgZWxlbWVudG9zIGRlIFNjcmlwdGluZyAoJmx0OyUhLCAmbHQ7anNwOmRlY2xhcmF0aW9uLCAmbHQ7JT0sICZsdDtqc3A6ZXhwcmVzc2lvbiwgJmx0OyUsICZsdDtqc3A6c2NyaXB0bGV0ICkgbm8gZXN04W4gcGVybWl0aWRvcyBhcXXtLgoranNwLmVycm9yLmludGVybmFsLnVuZXhwZWN0ZWRfbm9kZV90eXBlPUVycm9yIEludGVybm86IEVuY29udHJhZG8gdGlwbyBkZSBub2RvIGluZXNwZXJhZG8KK2pzcC5lcnJvci50bGQuZm4uaW52YWxpZC5zaWduYXR1cmU9U2ludOF4aXMgaW5jb3JyZWN0YSBwYXJhIGZpcm1hIGRlIGZ1bmNp824gZW4gVExELiBCaWJsaW90ZWNhIGRlIFRhZzogezB9LCBGdW5jafNuOiB7MX0KK2pzcC5lcnJvci50bGQuZm4uZHVwbGljYXRlLm5hbWU9Tm9tYnJlIGR1cGxpY2FkbyBkZSBmdW5jafNuIHswfSBlbiBiaWJsaW90ZWNhIGRlIHRhZyB7MX0KK2pzcC5lcnJvci50bGQuZm4uaW52YWxpZC5zaWduYXR1cmUuY29tbWFleHBlY3RlZD1TaW504XhpcyBpbmNvcnJlY3RhIHBhcmEgZmlybWEgZGUgZnVuY2nzbiBlbiBUTEQuIFNlIGVzcGVyYWJhIENvbWEgJywnLiBCaWJsaW90ZWNhIGRlIFRhZzogezB9LCBGdW5jafNuOiB7MX0uCitqc3AuZXJyb3IudGxkLmZuLmludmFsaWQuc2lnbmF0dXJlLnBhcmVuZXhwZWN0ZWQ9U2ludOF4aXMgaW5jb3JyZWN0YSBwYXJhIGZpcm1hIGRlIGZ1bmNp824gZW4gVExELiBTZSBlc3BlcmFiYSBQYXLpbnRlc2lzICcoJy4gQmlibGlvdGVjYSBkZSBUYWc6IHswfSwgRnVuY2nzbjogezF9LgoranNwLmVycm9yLnRsZC5tYW5kYXRvcnkuZWxlbWVudC5taXNzaW5nPUZhbHRhIG8gZXN04SB2YWPtbyBlbGVtZW50byBUTEQgb2JsaWdhdG9yaW86IHswfQoranNwLmVycm9yLmR5bmFtaWMuYXR0cmlidXRlcy5ub3QuaW1wbGVtZW50ZWQ9RWwgdGFnIHswfSBkZWNsYXJhIHF1ZSBhY2VwdGEgYXRyaWJ1dG9zIGRpbuFtaWNvcyBwZXJvIG5vIGltcGxlbWVudGEgbGEgaW50ZXJmYXogcmVxdWVyaWRhCitqc3AuZXJyb3Iubm9tYXRjaGluZy5mcmFnbWVudD1ObyBwdWVkbyBoYWxsYXIgdW5hIGRpcmVjdGl2YSBkZSBhdHJpYnV0byAoY29uIG5hbWU9ezB9IHkgZnJhZ21lbnQ9dHJ1ZSkgYW50ZXMgZGUgbGEgZGlyZWN0aXZhIGRlIGZyYWdtZW50LgoranNwLmVycm9yLmF0dHJpYnV0ZS5ub2VxdWFsPXNlIGVzcGVyYWJhIHPtbWJvbG8gaWd1YWwKK2pzcC5lcnJvci5hdHRyaWJ1dGUubm9xdW90ZT1zZSBlc3BlcmFiYSBz7W1ib2xvIGNvbWlsbGFzCitqc3AuZXJyb3IuYXR0cmlidXRlLnVudGVybWluYXRlZD1lbCBhdHJpYnV0byBwYXJhIHswfSBubyBlc3ThIHRlcm1pbmFkbyBjb3JyZWN0YW1lbnRlCitqc3AuZXJyb3IubWlzc2luZy50YWdJbmZvPUVsIG9iamV0byBUYWdJbmZvIHBhcmEgezB9IGZhbHRhIGRlbCBUTEQKK2pzcC5lcnJvci5mcmFnbWVudHdpdGh0eXBlPU5vIHB1ZWRlIGVzcGVjaWZpY2FyIGFtYm9zIGF0cmlidXRvcyAnZnJhZ21lbnQnIHkgJ3R5cGUnLiBTaSBlc3ThIHByZXNlbnRlICdmcmFnbWVudCcsICd0eXBlJyBzZSBwb25lIGNvbW8gJ2phdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5Kc3BGcmFnbWVudCcKK2pzcC5lcnJvci5mcmFnbWVudHdpdGhydGV4cHJ2YWx1ZT1ObyBwdWVkZSBlc3BlY2lmaWNhciBhbWJvcyBhdHJpYnV0b3MgJ2ZyYWdtZW50JyB5ICdydGV4cHJ2YWx1ZScuICBTaSBlc3ThIHByZXNlbnRlICdmcmFnbWVudCcsICdydGV4cHJ2YWx1ZScgc2UgcG9uZSBjb21vICd0cnVlJworanNwLmVycm9yLmZyYWdtZW50V2l0aERlY2xhcmVPclNjb3BlPUFtYm9zIGF0cmlidXRvcyAnZnJhZ21lbnQnIHkgJ2RlY2xhcmUnIG8gJ3Njb3BlJyBzZSBoYW4gZXNwZWNpZmljYWRvIGVuIGxhIGRpcmVjdGl2YSB2YXJpYWJsZQoranNwLmVycm9yLnZhcl9hbmRfdmFyUmVhZGVyPVPzbG8gc2UgcHVlZGUgZXNwZWNpZmljYXIgdW5vIGRlIFwndmFyXCcgbyBcJ3ZhclJlYWRlclwnCitqc3AuZXJyb3IubWlzc2luZ192YXJfb3JfdmFyUmVhZGVyPUZhbHRhIGF0cmlidXRvIFwndmFyXCcgbyBcJ3ZhclJlYWRlclwnCitqc3Aud2FybmluZy5iYWQudXJscGF0dGVybi5wcm9wZXJ0eWdyb3VwPVZhbG9yIG1hbG8gezB9IGVuIGVsIHN1YmVsZW1lbnRvIHVybC1wYXR0ZXJuIGVuIHdlYi54bWwKK2pzcC5lcnJvci51bmtub3duX2F0dHJpYnV0ZV90eXBlPVRpcG8gZGUgYXRyaWJ1dG8gZGVzY29ub2NpZG8gKHsxfSkgcGFyYSBhdHJpYnV0byB7MH0uCitqc3AuZXJyb3IuanNwZWxlbWVudC5taXNzaW5nLm5hbWU9RmFsdGEgYXRyaWJ1dG8gb2JsaWdhdG9yaW8gWE1MLXN0eWxlIFwnbmFtZVwnCitqc3AuZXJyb3IueG1sbnMucmVkZWZpbml0aW9uLm5vdGltcGxlbWVudGVkPUVycm9yIGludGVybm86IEludGVudG8gZGUgcmVkZWZpbmlyIHhtbG5zOnswfS4gTGEgcmVkZWZpbmljafNuIGRlIGVzcGFjaW9zIGRlIG5vbWJyZSBubyBlc3ThIGltcGxlbWVudGFkYS4KK2pzcC5lcnJvci5jb3VsZC5ub3QuYWRkLnRhZ2xpYnJhcmllcz1ObyBwdWRlIGHxYWRpciB1bmEgbyBt4XMgYmlibGlvdGVjYXMuCitqc3AuZXJyb3IuZHVwbGljYXRlLm5hbWUuanNwYXR0cmlidXRlPUVsIGF0cmlidXRvIHswfSBlc3BlY2lmaWNhZG8gZW4gbGEgYWNjafNuIHN0YW5kYXJkIG8gY3VzdG9tIHRhbWJp6W4gYXBhcmVjZSBjb21vIGVsIHZhbG9yIGRlbCBhdHJpYnV0byBuYW1lIGVuIGpzcDphdHRyaWJ1dGUKK2pzcC5lcnJvci5ub3QuaW4udGVtcGxhdGU9ezB9IG5vIHBlcm1pdGlkbyBlbiB1bmEgcGxhbnRpbGxhIGN1ZXJwbyBkZSB0ZXh0by4KK2pzcC5lcnJvci5iYWRTdGFuZGFyZEFjdGlvbj1BY2Np824gZXN04W5kYXIgaW5jb3JyZWN0YQoranNwLmVycm9yLnhtbC5iYWRTdGFuZGFyZEFjdGlvbj1BY2Np824gZXN04W5kYXIgaW5jb3JyZWN0YTogezB9Citqc3AuZXJyb3IudGFnZGlyZWN0aXZlLmJhZGJvZHljb250ZW50PWJvZHktY29udGVudCBpbmNvcnJlY3RvICh7MH0pIGVuIGRpcmVjdGl2YSB0YWcKK2pzcC5lcnJvci5zaW1wbGV0YWcuYmFkYm9keWNvbnRlbnQ9RWwgVExEIHBhcmEgbGEgY2xhc2UgezB9IGVzcGVjaWZpY2EgdW4gYm9keS1jb250ZW50IGVzIGluY29ycmVjdG8gKEpTUCkgcGFyYSB1biBTaW1wbGVUYWcuCitqc3AuZXJyb3IuY29uZmlnX3BhZ2VkaXJfZW5jb2RpbmdfbWlzbWF0Y2g9RWwgUGFnZS1lbmNvZGluZyBlc3BlY2lmaWNhZG8gZW4ganNwLXByb3BlcnR5LWdyb3VwICh7MH0pIGVzIGRpZmVyZW50ZSBkZWwgZXNwZWNpZmljYWRvIGVuIGxhIGRpZWN0aXZhIHBhZ2UgKHsxfSkKK2pzcC5lcnJvci5wcm9sb2dfcGFnZWRpcl9lbmNvZGluZ19taXNtYXRjaD1FbCBQYWdlLWVuY29kaW5nIGVzcGVjaWZpY2FkbyBlbiBYTUwgcHJvbG9nICh7MH0pIGRpZmllcmUgZGVsIGVzcGVjaWZpY2FkbyBlbiBsYSBkaXJlY3RpdmEgcGFnZSAoezF9KQoranNwLmVycm9yLnByb2xvZ19jb25maWdfZW5jb2RpbmdfbWlzbWF0Y2g9RWwgUGFnZS1lbmNvZGluZyBlc3BlY2lmaWNhZG8gZW4gWE1MIHByb2xvZyAoezB9KSBkaWZpZXJlIGRlbCBlc3BlY2lmaWNhZG8gZW4ganNwLXByb3BlcnR5LWdyb3VwICh7MX0pCitqc3AuZXJyb3IuYXR0cmlidXRlLmN1c3RvbS5ub25fcnRfd2l0aF9leHByPVNlZ/puIGVsIFRMRCBvIGxhIGRpcmVjdGl2YSBhdHRyaWJ1dGUgZGVsIGFyY2hpdm8gdGFnLCBlbCBhdHJpYnV0byB7MH0gbm8gYWNlcHRhIGV4cHJlc2lvbmVzCitqc3AuZXJyb3IuYXR0cmlidXRlLnN0YW5kYXJkLm5vbl9ydF93aXRoX2V4cHI9RWwgYXRyaWJ1dG8gezB9IGRlIGxhIGFjY2nzbiBlc3ThbmRhciB7MX0gbm8gYWNlcHRhIGV4cHJlc2lvbmVzCitqc3AuZXJyb3Iuc2NyaXB0aW5nLnZhcmlhYmxlLm1pc3NpbmdfbmFtZT1JbXBvc2libGUgZGV0ZXJtaW5hciBub21icmUgZGUgdmFyaWFibGUgZGUgc2NyaXB0aW5nIGRlc2RlIGF0cmlidXRvIHswfQoramFzcGVyLmVycm9yLmVtcHR5Ym9keWNvbnRlbnQubm9uZW1wdHk9U2Vn+m4gZWwgVExELCBlbCB0YWcgezB9IGRlYmUgZGUgZXN0YXIgdmFj7W8sIHBlcm8gbm8gbG8gZXN04QoranNwLmVycm9yLnRhZ2ZpbGUubmFtZU5vdFVuaXF1ZT1FbCB2YWxvciBkZSB7MH0geSBlbCB2YWxvciBkZSB7MX0gZW4gbGEgbO1uZWEgezJ9IHNvbiBlbCBtaXNtby4KK2pzcC5lcnJvci50YWdmaWxlLm5hbWVGcm9tLm5vQXR0cmlidXRlPU5vIHB1ZWRvIGhhbGxhciB1bmEgZGlyZWN0aXZhIGF0dHJpYnV0ZSBjb24gdW4gYXRyaWJ1dG8gbmFtZSBjb24gdW4gdmFsb3IgXCJ7MH1cIiwgZWwgdmFsb3IgZGUgZXN0ZSBhdHJpYnV0byBuYW1lLWZyb20tYXR0cmlidXRlLgoranNwLmVycm9yLnRhZ2ZpbGUubmFtZUZyb20uYmFkQXR0cmlidXRlPUxhIGRpcmVjdGl2YSBhdHRyaWJ1dGUgKGRlY2xhcmFkYSBlbiBsYSBs7W5lYSB7MX0geSBjdXlvIGF0cmlidXRvIG5hbWUgZXMgXCJ7MH1cIiwgZWwgdmFsb3IgZGUgZXN0ZSBhdHJpYnV0byBuYW1lLWZyb20tYXR0cmlidXRlIGF0dHJpYnV0ZSkgZGViZSBkZSBzZXIgZGVsIHRpcG8gamF2YS5sYW5nLlN0cmluZywgZXMgXCJyZXF1aXJlZFwiIHkgbm8gdW4gXCJydGV4cHJ2YWx1ZVwiLgoranNwLmVycm9yLnBhZ2Uubm9TZXNzaW9uPU5vIHB1ZWRvIGFjY2VkZXIgYWwg4W1iaXRvIGRlIHNlc2nzbiBlbiB1bmEgcOFnaW5hIHF1ZSBubyBwYXJ0aWNpcGEgZW4gdW5hIHNlc2nzbgoranNwLmVycm9yLnVzZUJlYW4ubm9TZXNzaW9uPUVzIGlsZWdhbCBwYXJhIHVzZUJlYW4gdXNhciB1biDhbWJpdG8gZGUgc2VzafNuIGN1YW5kbyBsYSBw4WdpbmEgSlNQIGRlY2xhcmEgKHbtYSBkaXJlY3RpdmEgcGFnZSkgcXVlIG5vIHBhcnRpY2lwYSBlbiBzZXNpb25lcworanNwLmVycm9yLnhtbC5lbmNvZGluZ0J5dGVPcmRlclVuc3VwcG9ydGVkPUVsIG9yZGVuIGRlIGJ5dGUgZGFkbyBwYXJhIGVuY29kaW5nIFwiezB9XCIgbm8gZXN04SBzb3BvcnRhZG8KK2pzcC5lcnJvci54bWwuZW5jb2RpbmdEZWNsSW52YWxpZD1Ob21icmUgZGUgY29kaWZpY2FjafNuIFwiezB9XCIgaW5jb3JyZWN0by4KK2pzcC5lcnJvci54bWwuZW5jb2RpbmdEZWNsUmVxdWlyZWQ9U2UgbmVjZXNpdGEgbGEgZGVjbGFyYWNp824gZW5jb2RpbmcgZW4gbGEgZGVjbGFyYWNp824gZGUgdGV4dG8KK2pzcC5lcnJvci54bWwubW9yZVBzZXVkb0F0dHJpYnV0ZXM9c2UgZXNwZXJhbiBt4XMgcHNldWRvLWF0cmlidXRvcworanNwLmVycm9yLnhtbC5ub01vcmVQc2V1ZG9BdHRyaWJ1dGVzPW5vIHNlIHBlcm1pdGVuIG3hcyBwc2V1ZG8tYXRyaWJ1dG9zLgoranNwLmVycm9yLnhtbC52ZXJzaW9uSW5mb1JlcXVpcmVkPVNlIHJlcXVpZXJlIGxhIHZlcnNp824gZW4gbGEgZGVjbGFyYWNp824gWE1MLgoranNwLmVycm9yLnhtbC54bWxEZWNsVW50ZXJtaW5hdGVkPUxhIGRlY2xhcmFjafNuIFhNTCBkZWJlIGRlIHRlcm1pbmFyIGNvbiBcIj8+XCIuCitqc3AuZXJyb3IueG1sLnJlc2VydmVkUElUYXJnZXQ9TGEgaW5zdHJ1Y2Np824gZGUgcHJvY2VzYW1pZW50byBxdWUgY29pbmNpZGUgY29uIFwiW3hYXVttTV1bbExdXCIgbm8gZXN04SBwZXJtaXRpZGEuCitqc3AuZXJyb3IueG1sLnNwYWNlUmVxdWlyZWRJblBJPVNlIG5lY2VzaXRhIHVuIGVzcGFjaW8gZW4gYmxhbmNvIGVudHJlIGxhIGluc3RydWNjafNuIGRlIHByb2Nlc2FtaWVudG8geSBsb3MgZGF0b3MuCitqc3AuZXJyb3IueG1sLmludmFsaWRDaGFySW5Db250ZW50PVVuIGNhcuFjdGVyIFhNTCBpbmNvcnJlY3RvIChVbmljb2RlOiAweHswfSkgc2UgaGFsbPMgZW4gZWwgY29udGVuaWRvIGRlbCBlbGVtZW50byBkZWwgZG9jdW1lbnRvLgoranNwLmVycm9yLnhtbC5zcGFjZVJlcXVpcmVkQmVmb3JlU3RhbmRhbG9uZT1TZSBuZWNlc2l0YSB1biBlc3BhY2lvIGVuIGJsYW5jbyBhbnRlcyBkZWwgcHNldWRvLWF0cmlidXRvIGVuY29kaW5nIGVuIGxhIGRlY2xhcmFjafNuIFhNTC4KK2pzcC5lcnJvci54bWwuc2REZWNsSW52YWxpZD1FbCB2YWxvciBkZSBkZWNsYXJhY2nzbiBkZSBkb2N1bWVudG8gc3RhbmRhbG9uZSBkZWJlIGRlIHNlciBcInllc1wiIG8gXCJub1wiLCBubyBcInswfVwiLgoranNwLmVycm9yLnhtbC5pbnZhbGlkQ2hhckluUEk9U2UgaGFsbPMgdW4gY2Fy4WN0ZXIgWE1MIGluY29ycmVjdG8gKFVuaWNvZGU6IDB4ezB9KSBlbiBsYSBpbnN0cnVjY2nzbiBkZSBwcm9jZXNhbWllbnRvCitqc3AuZXJyb3IueG1sLnZlcnNpb25Ob3RTdXBwb3J0ZWQ9Tm8gc2Ugc29wb3J0YSBsYSB2ZXJzafNuIFhNTCBcInswfVwiLCBz82xvIHNlIHNvcG9ydGEgWE1MIDEuMAoranNwLmVycm9yLnhtbC5wc2V1ZG9BdHRyTmFtZUV4cGVjdGVkPXNlIGVzcGVyYWJhIHVuIHBzZXVkby1hdHJpYnV0byBuYW1lLgoranNwLmVycm9yLnhtbC5leHBlY3RlZEJ5dGU9U2UgZXNwZXJhYmEgYnl0ZSB7MH0gZGUgezF9LWJ5dGUgZGUgc2VjdWVuY2lhIFVURi04LgoranNwLmVycm9yLnhtbC5pbnZhbGlkQnl0ZT1JbmNvcnJlY3RvIGJ5dGUgezB9IGRlIHsxfS1ieXRlIGRlIHNlY3VlbmNpYSBVVEYtOC4KK2pzcC5lcnJvci54bWwub3BlcmF0aW9uTm90U3VwcG9ydGVkPUxhIG9wZXJhY2nzbiBcInswfVwiIG5vIGVzdOEgc29wb3J0YWRhIHBvciBsZWN0b3IgezF9LgoranNwLmVycm9yLnhtbC5pbnZhbGlkSGlnaFN1cnJvZ2F0ZT1TdXJyb2dhY2nzbiBBbHRhIGRlIGJpdHMgZW4gc2VjdWVuY2lhIFVURi04IG5vIGRlYmUgZGUgZXhjZWRlciAweDEwLCBwZXJvIHNlIGhhbGzzIDB4ezB9LgoranNwLmVycm9yLnhtbC5pbnZhbGlkQVNDSUk9RWwgQnl0ZSBcInswfVwiIG5vIGVzIEFTQ0lJIGRlIDctYml0LgoranNwLmVycm9yLnhtbC5zcGFjZVJlcXVpcmVkQmVmb3JlRW5jb2RpbmdJblhNTERlY2w9U2UgbmVjZXNpdGEgZXNwYWNpbyBlbiBibGFuY28gYW50ZXMgZGVsIHBzZXVkby1hdHJpYnV0byBlbmNvZGluZyBlbiBsYSBkZWNsYXJhY2nzbiBYTUwuCitqc3AuZXJyb3IueG1sLnNwYWNlUmVxdWlyZWRCZWZvcmVFbmNvZGluZ0luVGV4dERlY2w9U2UgbmVjZXNpdGEgZXNwYWNpbyBlbiBibGFuY28gYW50ZXMgZGVsIHBzZXVkby1hdHJpYnV0byBlbmNvZGluZyBlbiBsYSBkZWNsYXJhY2nzbiB0ZXh0LgoranNwLmVycm9yLnhtbC5zcGFjZVJlcXVpcmVkQmVmb3JlVmVyc2lvbkluVGV4dERlY2w9U2UgbmVjZXNpdGEgZXNwYWNpbyBlbiBibGFuY28gYW50ZXMgZGVsIHBzZXVkby1hdHJpYnV0byB2ZXJzaW9uIGVuIGxhIGRlY2xhcmFjafNuIHRleHQuCitqc3AuZXJyb3IueG1sLnNwYWNlUmVxdWlyZWRCZWZvcmVWZXJzaW9uSW5YTUxEZWNsPVNlIG5lY2VzaXRhIGVzcGFjaW8gZW4gYmxhbmNvIGFudGVzIGRlbCBwc2V1ZG8tYXRyaWJ1dG8gdmVyc2lvbiBlbiBsYSBkZWNsYXJhY2nzbiBYTUwuCitqc3AuZXJyb3IueG1sLmVxUmVxdWlyZWRJblhNTERlY2w9RWwgY2Fy4WN0ZXIgJycgPSAnJyBkZWJlIGRlIHNlcmd1aXIgYSBcInswfVwiIGVuIGxhIGRlY2xhcmFjafNuIFhNTC4KK2pzcC5lcnJvci54bWwuZXFSZXF1aXJlZEluVGV4dERlY2w9RWwgY2Fy4WN0ZXIgJycgPSAnJyBkZWJlIGRlIHNlcmd1aXIgYSBcInswfVwiIGVuIGxhIGRlY2xhcmFjafNuIHRleHQuCitqc3AuZXJyb3IueG1sLnF1b3RlUmVxdWlyZWRJblRleHREZWNsPUVsIHZhbG9yIHF1ZSBzaWd1ZSBhIFwiezB9XCIgZW4gbGEgZGVjbGFyYWNp824gdGV4dCBkZWJlIGRlIHNlciB1bmEgY2FkZW5hIGVudHJlIGNvbWlsbGFzLgoranNwLmVycm9yLnhtbC5xdW90ZVJlcXVpcmVkSW5YTUxEZWNsPUVsIHZhbG9yIHF1ZSBzaWd1ZSBhIFwiezB9XCIgZW4gbGEgZGVjbGFyYWNp824gWE1MIGRlYmUgZGUgc2VyIHVuIGNhZGVuYSBlbnRyZSBjb21pbGxhcy4KK2pzcC5lcnJvci54bWwuaW52YWxpZENoYXJJblRleHREZWNsPVVuIGNhcuFjdGVyIFhNTCBpbmNvcnJlY3RvIChVbmljb2RlOiAweHswfSkgc2UgaGFsbPMgZW4gbGEgZGVjbGFyYWNp824gdGV4dAoranNwLmVycm9yLnhtbC5pbnZhbGlkQ2hhckluWE1MRGVjbD1VbiBjYXLhY3RlciBYTUwgaW5jb3JyZWN0byAoVW5pY29kZTogMHh7MH0pIHNlIGhhbGzzIGVuIGxhIGRlY2xhcmFjafNuIFhNTAoranNwLmVycm9yLnhtbC5jbG9zZVF1b3RlTWlzc2luZ0luVGV4dERlY2w9RmFsdGFuIGxhcyBjb21pbGxhcyBkZSBjaWVycmUgZW4gZWwgdmFsb3IgcXVlIHNpZ3VlIGEgXCJ7MH1cIiBlbiBsYSBkZWNsYXJhY2nzbiB0ZXh0LgoranNwLmVycm9yLnhtbC5jbG9zZVF1b3RlTWlzc2luZ0luWE1MRGVjbD1GYWx0YW4gbGFzIGNvbWlsbGFzIGRlIGNpZXJyZSBlbiBlbCB2YWxvciBxdWUgc2lndWUgYSAgXCJ7MH1cIiBlbiBsYSBkZWNsYXJhY2nzbiBYTUwuCitqc3AuZXJyb3IubXVsdGlwbGUuanNwPU5vIHB1ZWRvIHRlbmVyIG36bHRpcGxlcyBlc3BlY2lmaWNhY2lvbmVzIGRlCitqc3AuZXJyb3IuanNwb3V0cHV0LmNvbmZsaWN0PSZsdDtqc3A6b3V0cHV0Jmd0OzogaWxlZ2FsIHRlbmVyIG9jdXJyZW5jaWFzIG36bHRpcGxlcyBkZSBcInswfVwiIGNvbiBkaWZlcmVudGVzIHZhbG9yZXMgKHZpZWpvOiB7MX0sIG51ZXZvOiB7Mn0pCitqc3AuZXJyb3IuanNwb3V0cHV0LmRvY3R5cGVuYW1lc3lzdGVtPSZsdDtqc3A6b3V0cHV0Jmd0OzogYXRyaWJ1dG9zICdkb2N0eXBlLXJvb3QtZWxlbWVudCcgeSAnZG9jdHlwZS1zeXN0ZW0nIGRlYmVuIGRlIGFwYXJlY2VyIGp1bnRvcworanNwLmVycm9yLmpzcG91dHB1dC5kb2N0eXBlcHVsaWNzeXN0ZW09Jmx0O2pzcDpvdXRwdXQmZ3Q7OiBhdHJpYnV0byAnZG9jdHlwZS1zeXN0ZW0nIGRlYmUgZGUgYXBhcmVjZXIgc2kgYXBhcmVjZSBhdHJpYnV0byAnZG9jdHlwZS1wdWJsaWMnCitqc3AuZXJyb3IuanNwb3V0cHV0Lm5vbmVtcHR5Ym9keT0mbHQ7anNwOm91dHB1dCZndDsgbm8gZGViZSBkZSB0ZW5lciB1biBjdWVycG8KK2pzcC5lcnJvci5qc3BvdXRwdXQuaW52YWxpZFVzZT0mbHQ7anNwOm91dHB1dCZndDsgbm8gc2UgZGViZSBkZSB1c2FyIGVuIHNpbnTheGlzIGVzdOFuZGFyCitqc3AuZXJyb3IuYXR0cmlidXRlcy5ub3QuYWxsb3dlZCA9IHswfSBubyBkZWJlIGRlIHRlbmVyIGF0cmlidXRvcworanNwLmVycm9yLnRhZ2ZpbGUuYmFkU3VmZml4PUZhbHRhIHN1ZmlqbyBcIi50YWdcIiBlbiB0cmF5ZWN0b3JpYSBkZSBhcmNoaXZvIGRlIHRhZyB7MH0KK2pzcC5lcnJvci50YWdmaWxlLmlsbGVnYWxQYXRoPVRyYXllY3RvcmlhIGRlIGFyY2hpdm8gZGUgdGFnOiB7MH0sIGRlYmUgZGUgY29tZW56YXIgY29uIFwiL1dFQi1JTkYvdGFnc1wiIG8gXCIvTUVUQS1JTkYvdGFnc1wiCitqc3AuZXJyb3IucGx1Z2luLndyb25nUm9vdEVsZW1lbnQ9RWwgbm9tYnJlIGRlbCBlbGVtZW50byByYe16IGVuIHswfSBkaWZpZXJlIGRlIHsxfQoranNwLmVycm9yLmF0dHJpYnV0ZS5pbnZhbGlkUHJlZml4PUVsIHByZWZpam8gZGUgYXRyaWJ1dG8gezB9IG5vIHNlIGNvcnJlcG9uZGUgY29uIG5pbmd1bmEgYmlibGlvdGVjYSBpbXBvcnRhZGEKK2pzcC5lcnJvci5uZXN0ZWQuanNwYXR0cmlidXRlPVVuYSBhY2Np824gZXN04W5kYXIganNwOmF0dHJpYnV0ZSBubyBwdWVkZSBlc3RhciBhbmlkYWRhIGRlbnRybyBkZSBvdHJhIGFjY2nzbiBlc3ThbmRhciBqc3A6YXR0cmlidXRlCitqc3AuZXJyb3IubmVzdGVkLmpzcGJvZHk9VW5hIGFjY2nzbiBlc3ThbmRhciBqc3A6Ym9keSBubyBwdWVkZSBlc3RhciBhbmlkYWRhIGRlbnRybyBkZSBvdHJhIGFjY2nzbiBlc3ThbmRhciBqc3A6Ym9keSBvIGpzcDphdHRyaWJ1dGUKK2pzcC5lcnJvci52YXJpYWJsZS5laXRoZXIubmFtZT1PIGVsIGF0cmlidXRvIG5hbWUtZ2l2ZW4gbyBuYW1lLWZyb20tYXR0cmlidXRlIGRlYmVuIGRlIHNlciBlc3BlY2lmaWNhZG9zIGVuIHVuYSBkaXJlY3RpdmEgdmFyaWFibGUKK2pzcC5lcnJvci52YXJpYWJsZS5ib3RoLm5hbWU9Tm8gc2UgcHVlZGUgZXNwZWNpZmljYXIgYW1ib3MgYXRyaWJ1dG9zIG5hbWUtZ2l2ZW4gbyBuYW1lLWZyb20tYXR0cmlidXRlIGVuIHVuYSBkaXJlY3RpdmEgdmFyaWFibGUKK2pzcC5lcnJvci52YXJpYWJsZS5hbGlhcz1BbWJvcyBhdHJpYnV0b3MgbyBuaW5ndW5vIGRlIG5hbWUtZnJvbS1hdHRyaWJ1dGUgeSBhbGlhcyBwdWVkZW4gc2VyIGVzcGVjaWZpY2Fkb3MgZW4gdW5hIGRpcmVjdGl2YSB2YXJpYWJsZQoranNwLmVycm9yLmF0dHJpYnV0ZS5udWxsX25hbWU9Tm9tYnJlIGRlIGF0cmlidXRvIG51bG8KK2pzcC5lcnJvci5qc3B0ZXh0LmJhZGNvbnRlbnQ9XCcmbHQ7XCcsIGN1YW5kbyBhcGFyZWNlIGVuIGVsIGN1ZXJwbyBkZSAmbHQ7anNwOnRleHQmZ3Q7LCBkZWJlIGRlIGVzdGFyIGVuY2Fwc3VsYWRvIGRlbnRybyBkZSB1biBDREFUQQoranNwLmVycm9yLmpzcHJvb3QudmVyc2lvbi5pbnZhbGlkPU76bWVybyBpbmNvcnJlY3RvIGRlIHZlcnNp8246IFwiezB9XCIsIGRlYmUgZGUgc2VyIFwiMS4yXCIgbyBcIjIuMFwiCitqc3AuZXJyb3Iubm9GdW5jdGlvblByZWZpeD1MYSBmdW5jafNuIHswfSBkZWJlIGRlIHVzYXJzZSBjb24gdW4gcHJlZmlqbyBjdWFuZG8gbm8gc2UgZXNwZWNpZmljYSB1biBlc3BhY2lvIGRlIG5vbWJyZXMgcG9yIGRlZmVjdG8KK2pzcC5lcnJvci5ub0Z1bmN0aW9uPUxhIGZ1bmNp824gezB9IG5vIHB1ZWRlIHNlciBsb2NhbGl6YWRhIG1lZGlhbnRlIGVsIHByZWZpam8gZXNwZWNpZmljYWRvCitqc3AuZXJyb3Iubm9GdW5jdGlvbk1ldGhvZD1FbCBt6XRvZG8gXCJ7MH1cIiBwYXJhIGxhIGZ1bmNp824gXCJ7MX1cIiBubyBzZSBwdWRvIGhhbGxhciBlbiBsYSBjbGFzZSBcInsyfVwiCitqc3AuZXJyb3IuZnVuY3Rpb24uY2xhc3Nub3Rmb3VuZD1MYSBjbGFzZSB7MH0gZXNwZWNpZmljYWRhIGVuIGVsIFRMRCBwYXJhIGxhIGZ1bmNp824gezF9IG5vIHNlIHB1ZWRlIGhhbGxhcjogezJ9Citqc3AuZXJyb3Iuc2lnbmF0dXJlLmNsYXNzbm90Zm91bmQ9TGEgY2xhc2UgezB9IGVzcGVjaWZpY2FkYSBlbiBsYSBmaXJtYSBkZWwgbel0b2RvIGVuIGVsIFRMRCBwYXJhIGxhIGZ1bmNp824gezF9IG5vIHNlIHB1ZWRlIGhhbGxhci4gezJ9Citqc3AuZXJyb3IudGV4dC5oYXNfc3ViZWxlbWVudD0mbHQ7anNwOnRleHQmZ3Q7IG5vIGRlYmUgZGUgdGVuZXIgc3ViZWxlbWVudG9zCitqc3AuZXJyb3IuZGF0YS5maWxlLnJlYWQ9RXJyb3IgbGV5ZW5kbyBhcmNoaXZvIFwiezB9XCIKK2pzcC5lcnJvci5wcmVmaXgucmVmaW5lZD1JbnRlbnRvIGRlIHJlZGVmaW5pciBlbCBwcmVmaWpvIHswfSBwb3IgezF9LCBjdWFuZG8geWEgZXN0YWJhIGRlZmluaWRvIGNvbW8gezJ9IGVuIGVsIOFtYml0byBlbiBjdXJzby4KK2pzcC5lcnJvci5uZXN0ZWRfanNwcm9vdD0mbHQ7anNwOnJvb3QmZ3Q7IGFuaWRhZG8KK2pzcC5lcnJvci51bmJhbGFuY2VkLmVuZHRhZz1FbCB0Z2FnIGZpbmFsIFwiJmx0Oy97MH1cIiBlc3ThIGRlc2VxdWlsaWJyYWRvCitqc3AuZXJyb3IuaW52YWxpZC5iZWFuPQpkaWZmIC0tZ2l0IGEvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3Jlc291cmNlcy9Mb2NhbFN0cmluZ3NfZnIucHJvcGVydGllcyBiL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9yZXNvdXJjZXMvTG9jYWxTdHJpbmdzX2ZyLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk4NWQ4ZQotLS0gL2Rldi9udWxsCisrKyBiL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9yZXNvdXJjZXMvTG9jYWxTdHJpbmdzX2ZyLnByb3BlcnRpZXMKQEAgLTAsMCArMSwzMDAgQEAKKyMgJElkJAorIworIyBEZWZhdWx0IGxvY2FsaXplZCBzdHJpbmcgaW5mb3JtYXRpb24KKyMgTG9jYWxpemVkIHRoaXMgdGhlIERlZmF1bHQgTG9jYWxlIGFzIGlzIGZyX0ZSCisKK2pzcC5lcnJvci5iYWQuc2VydmxldC5lbmdpbmU9VmVyc2lvbiBkZSBtb3RldXIgZGUgc2VydmxldCBpbmNvcnJlY3RlIQoranNwLmVycm9yLm5vLnNjcmF0Y2guZGlyPUxlIG1vdGV1ciBkZSBKU1AgZW5naW5lIG4nJ2VzdCBwYXMgY29uZmlndXLpIGF2ZWMgdW4gculwZXJ0b2lyZSBkZSB0cmF2YWlsLlwKK1xuIE1lcmNpIGQnJ2Fqb3V0ZXIgXCJqc3AuaW5pdHBhcmFtcz1zY3JhdGNoZGlyPTxkaXItbmFtZT5cIiBcCitcbiBkYW5zIGxlIGZpY2hpZXIgInNlcnZsZXRzLnByb3BlcnRpZXMiIGRlIGNlIGNvbnRleHRlLgoranNwLmVycm9yLmJhZC5zY3JhdGNoLmRpcj1MZSBwYXJhbep0cmUgInNjcmF0Y2hEaXIiIHF1ZSB2b3VzIGF2ZXogc3DpY2lmaek6IHswfSBlc3QgaW51dGlsaXNhYmxlLgoranNwLm1lc3NhZ2Uuc2NyYXRjaC5kaXIuaXM9TGUgculwZXJ0b2lyZSBkZSB0cmF2YWlsIChzY3JhdGNoIGRpcikgcG91ciBsZSBtb3RldXIgZGUgSlNQIGVzdDogezB9Citqc3AubWVzc2FnZS5wYXJlbnRfY2xhc3NfbG9hZGVyX2lzPUxlIGNoYXJnZXVyIGRlIGNsYXNzZSBwYXJlbnQgKGNsYXNzIGxvYWRlcikgZXN0OiB7MH0KK2pzcC5tZXNzYWdlLmRvbnQubW9kaWZ5LnNlcnZsZXRzPUlNUE9SVEFOVDogTmUgcGFzIG1vZGlmaWVyIGxlcyBzZXJ2bGV0cyBn6W7pcullcworanNwLmVycm9yLm5vdC5pbXBsLmNvbW1lbnRzPUVycmV1ciBpbnRlcm5lOiBDb21tZW50YWlyZXMgbm9uIGltcGzpbWVudOlzCitqc3AuZXJyb3Iubm90LmltcGwuZGlyZWN0aXZlcz1FcnJldXIgaW50ZXJuZTogRGlyZWN0aXZlcyBub24gaW1wbOltZW506WVzCitqc3AuZXJyb3Iubm90LmltcGwuZGVjbGFyYXRpb25zPUVycmV1ciBpbnRlcm5lOiBEZWNsYXJhdGlvbnMgbm9uIGltcGzpbWVudOllcworanNwLmVycm9yLm5vdC5pbXBsLmV4cHJlc3Npb25zPUVycmV1ciBpbnRlcm5lOiBFeHByZXNzaW9ucyBub24gaW1wbOltZW506WVzCitqc3AuZXJyb3Iubm90LmltcGwuc2NyaXB0bGV0cz1FcnJldXIgaW50ZXJuZTogU2NyaXB0bGV0cyBub24gaW1wbOltZW506XMKK2pzcC5lcnJvci5ub3QuaW1wbC51c2ViZWFuPUVycmV1ciBpbnRlcm5lOiB1c2VCZWFuIG5vbiBpbXBs6W1lbnTpCitqc3AuZXJyb3Iubm90LmltcGwuZ2V0cD1FcnJldXIgaW50ZXJuZTogZ2V0UHJvcGVydHkgbm9uIGltcGzpbWVudOkKK2pzcC5lcnJvci5ub3QuaW1wbC5zZXRwPUVycmV1ciBpbnRlcm5lOiBzZXRQcm9wZXJ0eSBub24gaW1wbOltZW506QoranNwLmVycm9yLm5vdC5pbXBsLnBsdWdpbj1FcnJldXIgaW50ZXJuZTogcGx1Z2luIG5vbiBpbXBs6W1lbnTpCitqc3AuZXJyb3Iubm90LmltcGwuZm9yd2FyZD1FcnJldXIgaW50ZXJuZTogZm9yd2FyZCBub24gaW1wbOltZW506QoranNwLmVycm9yLm5vdC5pbXBsLmluY2x1ZGU9RXJyZXVyIGludGVybmU6IGluY2x1ZGUgbm9uIGltcGzpbWVudOkKK2pzcC5lcnJvci51bmF2YWlsYWJsZT1MYSBKU1AgYSDpdOkgbWFycXXpZSBjb21tZSBub24gZGlzcG9uaWJsZQoranNwLmVycm9yLnVzZWJlYW4ubWlzc2luZy5hdHRyaWJ1dGU9dXNlQmVhbjogbCcnaWRlbnRpZmljYXRldXIgZCcnYXR0cmlidXQgKGlkIGF0dHJpYnV0ZSkgZXN0IG1hbnF1YW50IG91IG1hbCBvcnRob2dyYXBoaekKK2pzcC5lcnJvci51c2ViZWFuLm1pc3NpbmcudHlwZT11c2VCZWFuICh7MH0pOiBMYSBjbGFzc2Ugb3UgbGUgdHlwZSBkJydhdHRyaWJ1dCBkb2l0IOp0cmVcCitzcOljaWZp6TogCitqc3AuZXJyb3IudXNlYmVhbi5kdXBsaWNhdGU9dXNlQmVhbjogTm9tIGRlIGJlYW4gZHVwbGlxdek6IHswfQoranNwLmVycm9yLnVzZWJlYW4ucHJvaGliaXRlZC5hcy5zZXNzaW9uPUltcG9zc2libGUgZCcndXRpbGlzZXIgY29tbWUgYmVhbiBkZSBzZXNzaW9uIHswfSBjYXIgYycnZXN0IGludGVyZGl0XAorcGFyIGxhIGRpcmVjdGl2ZSBqc3AgZOlmaW5pZSBwculj6WRlbW1lbnQ6IAoranNwLmVycm9yLnVzZWJlYW4ubm90LmJvdGg9dXNlQmVhbjogSW1wb3NzaWJsZSBkZSBzcOljaWZpZXIg4CBsYSBmb2lzIGxhIGNsYXNzZSBldCBsJydhdHRyaWJ1dCBiZWFuTmFtZTogCitqc3AuZXJyb3IudXNlYmVhbi5iYWQudHlwZS5jYXN0PXVzZUJlYW4gKHswfSk6IExlIHR5cGUgKHsxfSkgbicnZXN0IHBhcyBhc3NpZ25hYmxlIGRlcHVpcyBsYSBjbGFzc2UgKHsyfSkgCitqc3AuZXJyb3IuY2xhc3NuYW1lPUltcG9zc2libGUgZGUgZOl0ZXJtaW5lciBsZSBub20gZGUgY2xhc3NlIGQnJ2FwcuhzIGxlIGZpY2hpZXIgLmNsYXNzCitqc3Aud2FybmluZy5iYWQudHlwZT1BdHRlbnRpb246IG1hdXZhaXMgdHlwZSBkYW5zIGxlIGZpY2hpZXIgLmNsYXNzCitqc3AuZXJyb3IuZGF0YS5maWxlLndyaXRlPUVycmV1ciBsb3JzIGRlIGwnJ+ljcml0dXJlIGR1IGZpY2hpZXIgZGUgZG9ubullcworI0RpcmVjdGl2ZSBkZSBQYWdlOiB2YWxldXIgaW5jb3JyZWN0ZSBwb3VyIHBhZ2VFbmNvZGluZworanNwLmVycm9yLnBhZ2UuaW52YWxpZC5jb250ZW50dHlwZT1EaXJlY3RpdmUgZGUgUGFnZTogdmFsZXVyIGluY29ycmVjdGUgcG91ciBjb250ZW50VHlwZQoranNwLmVycm9yLnBhZ2UuaW52YWxpZC5zZXNzaW9uPURpcmVjdGl2ZSBkZSBQYWdlOiB2YWxldXIgaW5jb3JyZWN0ZSBwb3VyIHNlc3Npb24KK2pzcC5lcnJvci5wYWdlLmludmFsaWQuYnVmZmVyPURpcmVjdGl2ZSBkZSBQYWdlOiB2YWxldXIgaW5jb3JyZWN0ZSBwb3VyICJidWZmZXIiCitqc3AuZXJyb3IucGFnZS5pbnZhbGlkLmF1dG9mbHVzaD1EaXJlY3RpdmUgZGUgUGFnZTogdmFsZXVyIGluY29ycmVjdGUgcG91ciBhdXRvRmx1c2gKK2pzcC5lcnJvci5wYWdlLmludmFsaWQuaXN0aHJlYWRzYWZlPURpcmVjdGl2ZSBkZSBQYWdlOiB2YWxldXIgaW5jb3JyZWN0ZSBwb3VyIGlzVGhyZWFkU2FmZQoranNwLmVycm9yLnBhZ2UuaW52YWxpZC5pbmZvPURpcmVjdGl2ZSBkZSBQYWdlOiB2YWxldXIgaW5jb3JyZWN0ZSBwb3VyIGluZm8KK2pzcC5lcnJvci5wYWdlLmludmFsaWQuaXNlcnJvcnBhZ2U9RGlyZWN0aXZlIGRlIFBhZ2U6IHZhbGV1ciBpbmNvcnJlY3RlIHBvdXIgaXNFcnJvclBhZ2UKK2pzcC5lcnJvci5wYWdlLmRlZmFmdGVydXNlLmxhbmd1YWdlPURpcmVjdGl2ZSBkZSBQYWdlOiBvbiBuZSBwZXV0IGTpZmluaXIgbGFuZ3VhZ2UgYXBy6HMgdW4gc2NyaXB0bGV0IAoranNwLmVycm9yLnBhZ2Uubm9tYXBwaW5nLmxhbmd1YWdlPURpcmVjdGl2ZSBkZSBQYWdlOiBQYXMgZGUgY29ycmVzcG9uZGFuY2UgcG91ciBsYW5ndWFnZTogCitqc3AuZXJyb3IucGFnZS5iYWRfYl9hbmRfYV9jb21ibz1EaXJlY3RpdmUgZGUgUGFnZTogY29tYmluYWlzb24gaWxs6WdhbGUgZGUgYnVmZmVyPVwibm9uZVwiICYmIGF1dG9GbHVzaD1cImZhbHNlXCIKK2pzcC5lcnJvci5ub3QuaW1wbC50YWdsaWI9SW50ZXJuYWwgZXJyb3I6IFRhZyBleHRlbnNpb25zIG5vbiBpbXBs6W1lbnTpcworanNwLmVycm9yLmluY2x1ZGUubWlzc2luZy5maWxlPWwnJ2FyZ3VtZW50IGZpY2hpZXIgKGZpbGUpIHBvdXIgbCcnaW5jbHVzaW9uIChpbmNsdWRlKSBlc3QgYWJzZW50Citqc3AuZXJyb3IuaW5jbHVkZS5iYWQuZmlsZT1NYXV2YWlzIGFyZ3VtZW50IGZpY2hpZXIgKGZpbGUpIHBvdXIgbCcnaW5jbHVzaW9uIChpbmNsdWRlKQoranNwLmVycm9yLmluY2x1ZGUuZXhjZXB0aW9uPUltcG9zc2libGUgZCcnaW5jbHVyZSAoaW5jbHVkZSkgezB9Citqc3AuZXJyb3Iuc3RyZWFtLmNsb3NlZD1GbHV4IGZlcm3pCitqc3AuZXJyb3IuaW52YWxpZC5mb3J3YXJkPVRhZyBmb3J3YXJkIGluY29ycmVjdAoranNwLmVycm9yLnVua25vd25FeGNlcHRpb249RXJyZXVyIG5vbiB0cmFpdOllISBWb3VzIGRldnJpZXogcGVuc2VyIOAgdXRpbGlzZXIgdW5lIHBhZ2UgZCcnZXJyZXVyIFwKK3BvdXIgcmFwcG9ydGVyIGNlIHR5cGUgZCcnZXJyZXVyIHBsdXMg6WzpZ2FtbWVudAoranNwLmVycm9yLmludmFsaWQuZGlyZWN0aXZlPURpcmVjdGl2ZSBpbmNvcnJlY3RlCitqc3AuZXJyb3IuZGlyZWN0aXZlLmlzdGFnZmlsZT1MYSBkaXJlY3RpdmUgezB9IG5lIHBldXQg6nRyZSB1dGlsaXPpZSBkYW5zIHVuIGZpY2hpZXIgdGFnCitqc3AuZXJyb3IuZGlyZWN0aXZlLmlzbm90dGFnZmlsZT1MYSBkaXJlY3RpdmUgezB9IG5lIHBldXQg6nRyZSB1dGlsaXPpZSBxdWUgZGFucyB1biBmaWNoaWVyIHRhZworanNwLmVycm9yLnRhZ2ZpbGUudGxkLm5hbWU9TCcnYXR0cmlidXQgXCJuYW1lXCIgZGUgbGEgZGlyZWN0aXZlIHRhZyBjb250aWVudCBsYSB2YWxldXIgezB9IGFsb3JzIHF1ZSBsZSB0YWcgXCJuYW1lXCIgZGUgbCcn6WzpbWVudCBcInRhZy1maWxlXCIgZGFucyBsZSBUTEQgZXN0IHsxfQoranNwLmVycm9yLmFjdGlvbi5pc3RhZ2ZpbGU9TCcnYWN0aW9uIHswfSBuZSBwZXV0IOp0cmUgdXRpbGlz6WUgZGFucyB1biBmaWNoaWVyIHRhZworanNwLmVycm9yLmFjdGlvbi5pc25vdHRhZ2ZpbGU9TCcnYWN0aW9uIHswfSBuZSBwZXV0IOp0cmUgdXRpbGlz6WUgcXVlIGRhbnMgdW4gZmljaGllciB0YWcKK2pzcC5lcnJvci51bnRlcm1pbmF0ZWQ9VGFnIHswfSBub24gdGVybWlu6QoranNwLmVycm9yLnVzZWJlYW4ubm90aW5zYW1lZmlsZT1sZSB0YWcgdXNlQmVhbiBkb2l0IGNvbW1lbmPpIGV0IGZpbmlyIGRhbnMgbGUgbeptZSBmaWNoaWVyIHBoeXNpcXVlCitqc3AuZXJyb3IubG9hZGNsYXNzLnRhZ2hhbmRsZXI9SW1wb3NzaWJsZSBkZSBjaGFyZ2VyIGxhIGNsYXNzZSB7MH0KK2pzcC5lcnJvci51bmFibGUuY29tcGlsZT1JbXBvc3NpYmxlIGRlIGNvbXBpbGVyIGxhIGNsYXNzZSBwb3VyIGxhIEpTUAoranNwLmVycm9yLnVuYWJsZS5sb2FkPUltcG9zc2libGUgZGUgY2hhcmdlciBsYSBjbGFzc2UgcG91ciBsYSBKU1AKK2pzcC5lcnJvci51bmFibGUucmVuYW1lPUltcG9zc2libGUgZGUgcmVub21tZXIgbGUgZmljaGllciBjbGFzc2UgZGUgezB9IHZlcnMgezF9Citqc3AuZXJyb3IubWFuZGF0b3J5LmF0dHJpYnV0ZT17MH06IEwnJ2F0dHJpYnV0IG9ibGlnYXRvaXJlIHsxfSBlc3QgbWFucXVhbnQKK2pzcC5lbmdpbmUuaW5mbz1Nb3RldXIgSmFzcGVyIEpTUCAyLjAKK2pzcC5lcnJvci5pbnZhbGlkLmV4cHJlc3Npb249InswfSIgY29udGllbnQgZCcnaW5jb3JyZWN0ZShzKSBleHByZXNzaW9uKHMpOiB7MX0KK2pzcC5lcnJvci5pbnZhbGlkLmF0dHJpYnV0ZT17MH06IEF0dHJpYnV0IGluY29ycmVjdDogezF9Citqc3AuZXJyb3IudXNlYmVhbi5jbGFzcy5ub3Rmb3VuZD1DbGFzc2U6IHswfSBub24gdHJvdXbpZQoranNwLmVycm9yLmZpbGUuY2Fubm90LnJlYWQ9SW1wb3NzaWJsZSBkZSBsaXJlIGxlIGZpY2hpZXI6IHswfQoranNwLmVycm9yLmZpbGUuYWxyZWFkeS5yZWdpc3RlcmVkPUluY2x1c2lvbiBy6WN1cnNpdmUgZHUgZmljaGllciB7MH0KK2pzcC5lcnJvci5maWxlLm5vdC5yZWdpc3RlcmVkPUxlIGZpY2hpZXIgezB9IG4nJ2FwcGFyYe50IHBhcyBkYW5zIGwnJ2luY2x1c2lvbiAoaW5jbHVkZSkKK2pzcC5lcnJvci5xdW90ZXMudW50ZXJtaW5hdGVkPWd1aWxsZW1ldHMgbm9uIHRlcm1pbulzCitqc3AuZXJyb3IuYXR0ci5xdW90ZWQ9TGEgdmFsZXVyIGRlIGwnJ2F0dHJpYnV0ZSBkb2l0IOp0cmUgZW50cmUgZ3VpbGxlbWV0cyAKK2pzcC5lcnJvci5hdHRyLm5vdmFsdWU9TCcnYXR0cmlidXRlIHswfSBuJydhIHBhcyBkZSB2YWxldXIKK2pzcC5lcnJvci50YWcuYXR0ci51bnRlcm1pbmF0ZWQ9TGlzdGUgZGUgdGFnIGQnJ2F0dHJpYnV0IG5vbiB0ZXJtaW7pZQoranNwLmVycm9yLnBhcmFtLm5vbmFtZT1QYXMgZGUgbm9tIGRhbnMgbGUgdGFnIFBBUkFNCitqc3AuZXJyb3IucGFyYW0ubm92YWx1ZT1QYXMgZGUgdmFsZXVyIGRhbnMgbGUgdGFnIFBBUkFNCitqc3AuZXJyb3IuYmVhbnMubnVsbGJlYW49VGVudGF0aXZlIGQnJ29w6XJhdGlvbiBiZWFuIHN1ciB1biBvYmpldCBudWwuCitqc3AuZXJyb3IuYmVhbnMubm9iZWFuaW5mbz1QYXMgZCcnaW5mb3JtYXRpb24gYmVhbiAoQmVhbkluZm8pIHBvdXIgbGUgYmVhbiBkZSB0eXBlICcnezB9JycgbicnYSBwdSDqdHJlIHRyb3V26WUsIGxhIGNsYXNzZSBuJydleGlzdGUgcHJvYmFibGVtZW50IHBhcy4KK2pzcC5lcnJvci5iZWFucy5pbnRyb3NwZWN0aW9uPVVuZSBleGNlcHRpb24gcycnZXN0IHByb2R1aXRlIGxvcnMgZGUgbCcnaW50cm9zcGVjdGlvbiBkZSBsYSBt6XRob2RlIHJlYWQgZGUgbGEgcHJvcHJp6XTpICcnezB9JycgZGFucyBsZSBiZWFuIGRlIHR5cGUgJyd7MX0nJzpcbnsyfQoranNwLmVycm9yLmJlYW5zLm5vbWV0aG9kPUltcG9zc2libGUgZGUgdHJvdXZlciB1bmUgbel0aG9kZSBwb3VyIGxpcmUgbGEgcHJvcHJp6XTpICcnezB9JycgZGFucyBsZSBiZWFuIGRlIHR5cGUgJyd7MX0nJworanNwLmVycm9yLmJlYW5zLm5vbWV0aG9kLnNldHByb3BlcnR5PUltcG9zc2libGUgZGUgdHJvdXZlciB1bmUgbel0aG9kZSBwb3VyIG1ldHRyZSDgIGpvdXIgbGEgcHJvcHJp6XTpICcnezB9JycgZGUgdHlwZSAnJ3sxfScnZGFucyBsZSBiZWFuIGRlIHR5cGUgJyd7Mn0nJworanNwLmVycm9yLmJlYW5zLm5vcHJvcGVydHk9PUltcG9zc2libGUgZGUgdHJvdXZlciBkZSBsJydpbmZvcm1hdGlvbiBzdXIgbGEgcHJvcHJp6XTpICcnezB9JycgZGFucyBsZSBiZWFuIGRlIHR5cGUgJyd7MX0nJworanNwLmVycm9yLmJlYW5zLnNldHByb3BlcnR5Lm5vaW5kZXhzZXQ9SW1wb3NzaWJsZSBkZSByZW5zZWlnbmVyIGxhIHByb3Byael06SBpbmTpeOllCitqc3AuZXJyb3IuaW5jbHVkZS50YWc9VGFnIGpzcDppbmNsdWRlIGluY29ycmVjdAoranNwLmVycm9yLmluY2x1ZGUubm9mbHVzaD1qc3A6aW5jbHVkZSBkb2l0IGF2b2lyIFwiZmx1c2g9dHJ1ZVwiCitqc3AuZXJyb3IuaW5jbHVkZS5iYWRmbHVzaD1qc3A6aW5jbHVkZSBwYWdlPVwiLi4uXCIgZmx1c2g9XCJ0cnVlXCIgZXN0IGxhIHNldWxlIGNvbWJpbmFpc29uIHZhbGlkZSBkYW5zIEpTUCAxLjAKK2pzcC5lcnJvci5hdHRlbXB0X3RvX2NsZWFyX2ZsdXNoZWRfYnVmZmVyPUVycmV1cjogVGVudGF0aXZlIGQnJ2VmZmFjZW1lbnQgZCcndW4gdGFtcG9uIHF1aSBhIGTpauAg6XTpIHZpZGFuZ+kgKGZsdXNoKQoranNwLmVycm9yLm92ZXJmbG93PUVycmV1cjogROlwYXNzZW1lbnQgZGUgY2FwYWNpdOkgZHUgdGFtcG9uIEpTUAoranNwLmVycm9yLnBhcmFtZXhwZWN0ZWQ9TGUgdGFnIFwicGFyYW1cIiBlc3QgYXR0ZW5kdSBhdmVjIGxlcyBhdHRyaWJ1dHMgXCJuYW1lXCIgZXQgXCJ2YWx1ZVwiIGFwcuhzIGxlIHRhZyBcInBhcmFtc1wiLgoranNwLmVycm9yLmNsb3NlaW5kaXZpZHVhbHBhcmFtPUxlIHRhZyBwYXJhbSBkb2l0IOp0cmUgZmVybekgYXZlYyBcIi8+XCIKK2pzcC5lcnJvci5jbG9zZXBhcmFtcz1MZSB0YWcgcGFyYW0gdGFnIGRvaXQg6nRyZSBmZXJt6SBhdmVjICAvcGFyYW1zCitqc3AuZXJyb3IucGx1Z2luLm5vdHlwZT10eXBlIG5vbiBk6WNsYXLpIGRhbnMganNwOnBsdWdpbgoranNwLmVycm9yLnBsdWdpbi5ub2NvZGU9Y29kZSBub24gZOljbGFy6SBkYW5zIGpzcDpwbHVnaW4KK2pzcC5lcnJvci5pc2Vfb25fY2xlYXI9SWwgZXN0IGludGVyZGl0IGQnJ3V0aWxpc2VyIGNsZWFyKCkgcXVhbmQgbGEgdGFpbGxlIGRlIHRhbXBvbj09IDAKK2pzcC5lcnJvci5zZXRwcm9wZXJ0eS5iZWFuTm90Rm91bmQ9c2V0UHJvcGVydHk6IGxlIEJlYW4gezB9IGVzdCBpbnRyb3V2YWJsZQoranNwLmVycm9yLmdldHByb3BlcnR5LmJlYW5Ob3RGb3VuZD1nZXRQcm9wZXJ0eTogbGUgQmVhbiB7MH0gZXN0IGludHJvdXZhYmxlCitqc3AuZXJyb3Iuc2V0cHJvcGVydHkuQ2xhc3NOb3RGb3VuZD1zZXRQcm9wZXJ0eTogbGEgQ2xhc3NlIHswfSBlc3QgaW50cm91dmFibGUKK2pzcC5lcnJvci5zZXRwcm9wZXJ0eS5pbnZhbGlkU3ludGF4PXNldFByb3BlcnR5OiBPbiBuZSBwZXV0IGF2b2lyIGRlIHZhbGV1ciBub24gbnVsbGUgcXVhbmQgcHJvcGVydHk9KgoranNwLmVycm9yLnNldHByb3BlcnR5LmJlYW5JbmZvTm90Rm91bmQ9c2V0cHJvcGVydHk6IGJlYW5JbmZvIHBvdXIgbGUgYmVhbiB7MH0gZXN0IGludHJvdXZhYmxlCitqc3AuZXJyb3Iuc2V0cHJvcGVydHkucGFyYW1PclZhbHVlPXNldFByb3BlcnR5OiBwYXJhbSBvdSB2YWx1ZSBkb2l0IOp0cmUgcHLpc2VudAoranNwLmVycm9yLnNldHByb3BlcnR5LmFycmF5VmFsPXNldFByb3BlcnR5OiBvbiBuZSBwZXV0IHJlbnNlaWduZXIgbGVzIGFycmF5IHByb3BlcnR5IHswfSBhdSB0cmF2ZXJzIGQnJ3VuZSB2YWxldXIgY2hh7m5lIGNvbnN0YW50ZSAoc3RyaW5nIGNvbnN0YW50IHZhbHVlKQoranNwLndhcm5pbmcua2VlcGdlbj1BdHRlbnRpb246IFZhbGV1ciBpbmNvcnJlY3RlIHBvdXIgbGUgaW5pdFBhcmFtIGtlZXBnZW5lcmF0ZWQuIFV0aWxpc2F0aW9uIGRlIGxhIHZhbGV1ciBwYXIgZOlmYXV0IFwiZmFsc2VcIgoranNwLndhcm5pbmcuZW5hYmxlUG9vbGluZz1BdHRlbnRpb246IFZhbGV1ciBpbmNvcnJlY3RlIHBvdXIgbGUgaW5pdFBhcmFtIGVuYWJsZVBvb2xpbmcuIFV0aWxpc2F0aW9uIGRlIGxhIHZhbGV1ciBwYXIgZOlmYXV0IFwidHJ1ZVwiCitqc3Aud2FybmluZy5tYXBwZWRGaWxlPUF0dGVudGlvbjogVmFsZXVyIGluY29ycmVjdGUgcG91ciBsZSBpbml0UGFyYW0gbWFwcGVkRmlsZS4gVXRpbGlzYXRpb24gZGUgbGEgdmFsZXVyIHBhciBk6WZhdXQgXCJmYWxzZVwiCitqc3Aud2FybmluZy5zZW5kRXJyVG9DbGllbnQ9QXR0ZW50aW9uOiBWYWxldXIgaW5jb3JyZWN0ZSBwb3VyIGxlICBpbml0UGFyYW0gc2VuZEVyclRvQ2xpZW50LiBVdGlsaXNhdGlvbiBkZSBsYSB2YWxldXIgcGFyIGTpZmF1dCBcImZhbHNlXCIKK2pzcC53YXJuaW5nLmNsYXNzRGVidWdJbmZvPUF0dGVudGlvbjogVmFsZXVyIGluY29ycmVjdGUgcG91ciBsZSBpbml0UGFyYW0gY2xhc3NkZWJ1Z2luZm8uIFV0aWxpc2F0aW9uIGRlIGxhIHZhbGV1ciBwYXIgZOlmYXV0IFwiZmFsc2VcIgoranNwLndhcm5pbmcuY2hlY2tJbnRlcnZhbD1BdHRlbnRpb246IFZhbGV1ciBpbmNvcnJlY3RlIHBvdXIgbGUgaW5pdFBhcmFtIGNoZWNrSW50ZXJ2YWwuIFV0aWxpc2F0aW9uIGRlIGxhIHZhbGV1ciBwYXIgZOlmYXV0IFwiMzAwXCIgc2Vjb25kZXMKK2pzcC53YXJuaW5nLmRldmVsb3BtZW50PUF0dGVudGlvbjogVmFsZXVyIGluY29ycmVjdGUgcG91ciBsZSBpbml0UGFyYW0gZGV2ZWxvcG1lbnQuIFV0aWxpc2F0aW9uIGRlIGxhIHZhbGV1ciBwYXIgZOlmYXV0IFwidHJ1ZVwiCitqc3Aud2FybmluZy5yZWxvYWRpbmc9QXR0ZW50aW9uOiBWYWxldXIgaW5jb3JyZWN0ZSBwb3VyIGxlIGluaXRQYXJhbSByZWxvYWRpbmcuIFV0aWxpc2F0aW9uIGRlIGxhIHZhbGV1ciBwYXIgZOlmYXV0IFwidHJ1ZVwiCitqc3Aud2FybmluZy5yZWxvYWRpbmc9Citqc3AuZXJyb3IuYmFkdGFnbGliPUltcG9zc2libGUgZCcnb3V2cmlyIGxlIHRhZ2xpYnJhcnkgezB9IDogezF9Citqc3AuZXJyb3IuYmFkR2V0UmVhZGVyPUltcG9zc2libGUgZGUgY3LpZXIgdW4gbGVjdGV1ciAocmVhZGVyKSBxdWFuZCBsZSBmbHV4IG4nJ3V0aWxzZSBwYXMgZGVzIHRhbXBvbnMgKG5vdCBidWZmZXJlZCkKK2pzcC53YXJuaW5nLnVua25vd24uZWxlbWVudC5pbi5UTEQ9QXR0ZW50aW9uOiBFbOltZW50IGluY29ubnUgezB9IGRhbnMgbGUgVExECitqc3Aud2FybmluZy51bmtub3duLmVsZW1lbnQuaW4udGFnPUF0dGVudGlvbjogRWzpbWVudCBpbmNvbm51IHswfSBkYW5zIGxlIHRhZworanNwLndhcm5pbmcudW5rbm93bi5lbGVtZW50LmluLmF0dHJpYnV0ZT1BdHRlbnRpb246IEVs6W1lbnQgaW5jb25udSB7MH0gZGFucyBsJydhdHRyaWJ1dGUKK2pzcC5lcnJvci5tb3JlLnRoYW4ub25lLnRhZ2xpYj1wbHVzIGQnJ3VuIHRhZ2xpYiBkYW5zIGxlIFRMRDogezB9Citqc3AuZXJyb3IudGVpY2xhc3MuaW5zdGFudGlhdGlvbj1JbXBvc3NpYmxlIGRlIGNoYXJnZXIgb3UgZCcnaW5zdGFuY2llciBsYSBjbGFzc2UgVGFnRXh0cmFJbmZvOiB7MH0KK2pzcC5lcnJvci5ub25fbnVsbF90ZWlfYW5kX3Zhcl9zdWJlbGVtcz1MZSB0YWcgezB9IHBvc3PoZGUgdW5lIG91IHBsdXNpZXVycyB2YXJpYWJsZXMgc3ViZWxlbWVudHMgZXQgdW5lIGNsYXNzZSBUYWdFeHRyYUluZm8gcXVpIHJldG91cm5lIHVuZSBvdSBwbHVzaWV1cnMgVmFyaWFibGVJbmZvCitqc3AuZXJyb3IucGFyc2UuZXJyb3IuaW4uVExEPUVycmV1ciBkJyfpdmFsdWF0aW9uIChwYXJzZSkgZGFucyBsZSBkZXNjcmlwdGV1ciBkZSBsaWJyYWlyaWUgZGUgdGFnIChUTEQpOiB7MH0KK2pzcC5lcnJvci51bmFibGUudG8ub3Blbi5UTEQ9SW1wb3NzaWJsZSBkJydvdXZyaXIgbGUgZGVzY3JpcHRldXIgZGUgbGlicmFpcmllIGRlIHRhZyAoVExEKTogezB9Citqc3AuYnVmZmVyLnNpemUuemVybz1UYWlsbGUgZHUgdGFtcG9uIDw9IDAKK2pzcC5lcnJvci5maWxlLm5vdC5mb3VuZD1MZSBmaWNoaWVyIFwiezB9XCIgbicnYSBwYXMg6XTpIHRyb3V26QoranNwLm1lc3NhZ2UuY29weWluZ3VyaT1Db3BpZSBkZSB7MH0gZGFucyB7MX0KK2pzcC5tZXNzYWdlLmh0bWxjb21tZW50PVxuRWZmYWNlbWVudCBkZXMgY29tbWVudGFpcmVzOiBcdHswfQoranNwLm1lc3NhZ2UuaGFuZGxpbmdfZGlyZWN0aXZlPVxuRGlyZWN0aXZlIGRlIGdlc3Rpb24gKGhhbmRsaW5nKTogezB9XHR7MX0KK2pzcC5tZXNzYWdlLmhhbmRsaW5nX3BsdWdpbj1cblBsdWdpbjogezB9Citqc3AubWVzc2FnZS5wYWNrYWdlX25hbWVfaXM9TGUgbm9tIGRlIHBhY2thZ2UgZXN0OiB7MH0KK2pzcC5tZXNzYWdlLmNsYXNzX25hbWVfaXM9TGUgbm9tIGRlIGNsYXNzZSBlc3Q6IHswfQoranNwLm1lc3NhZ2UuamF2YV9maWxlX25hbWVfaXM9TGUgbm9tIGRlIGZpY2hpZXIgSmF2YSBlc3Q6IHswfQoranNwLm1lc3NhZ2UuY2xhc3NfZmlsZV9uYW1lX2lzPUxlIG5vbSBkZSBmaWNoaWVyIENsYXNzIGVzdDogezB9Citqc3AubWVzc2FnZS5hY2NlcHRlZD1BY2NlcHTpIHswfSDgIHsxfQoranNwLm1lc3NhZ2UuYWRkaW5nX2phcj1Bam91dCBkdSBqYXIgezB9IOAgbW9uIGNsYXNzcGF0aAoranNwLm1lc3NhZ2UuY29tcGlsaW5nX3dpdGg9Q29tcGlsYXRpb24gYXZlYzogezB9Citqc3AubWVzc2FnZS50ZW1wbGF0ZV90ZXh0PXRleHRlIHRlbXBsYXRlCitqc3AuZXJyb3IubWlzc2luZ19hdHRyaWJ1dGU9RCcnYXBy6HMgbGUgVExEIGwnJ2F0dHJpYnV0IHswfSBlc3Qgb2JsaWdhdG9pcmUgcG91ciBsZSB0YWcgezF9Citqc3AuZXJyb3IuYmFkX2F0dHJpYnV0ZT1MJydhdHRyaWJ1dCB7MH0gZXN0IGluY29ycmVjdCBwb3VyIGxlIHRhZyB7MX0gZCcnYXBy6HMgbGEgVExEIGluZGlxdellCitqc3AuZXJyb3Iud2VieG1sX25vdF9mb3VuZD1JbXBvc3NpYmxlIGRlIGxvY2FsaXNlciBsZSBmaWNoaWVyIHdlYi54bWwKK2pzcC5jbWRfbGluZS51c2FnZT1Vc2FnZToganNwdG9zZXJ2bGV0IFstZGQgPHBhdGgvdG8vb3V0cHV0RGlyZWN0b3J5Pl0gWy1rZWVwZ2VuZXJhdGVkXSBcCis8LmpzcCBmaWxlcz4KK2pzcC5tZXNzYWdlLmNwX2lzPUxlIENsYXNzcGF0aCB7MH0gZXN0OiB7MX0KK2pzcC5lcnJvci51bmFibGUudG9fbG9hZF90YWdoYW5kbGVyX2NsYXNzPUltcG9zc2libGUgZGUgY2hhcmdlciBsYSBjbGFzc2UgZ2VzdGlvbm5haXJlIGRlIHRhZyB7MH0gY2FyIHsxfQoranNwLmVycm9yLnVuYWJsZS50b19maW5kX21ldGhvZD1JbXBvc3NpYmxlIGRlIHRyb3V2ZXIgdW5lIG3pdGhvZGUgZGUgbWlzZSDgIGpvdXIgcG91ciBsJydhdHRyaWJ1dDogezB9Citqc3AuZXJyb3IudW5hYmxlLnRvX2NvbnZlcnRfc3RyaW5nPUltcG9zc2libGUgZGUgY29udmVydGlyIHVuZSBjaGHubmUgdmVycyB7MH0gcG91ciBsJydhdHRyaWJ1dCB7MX0KK2pzcC5lcnJvci51bmFibGUudG9faW50cm9zcGVjdD1JbXBvc3NpYmxlIGQnJ2ludHJvc3BlY3RlciBsYSBjbGFzc2UgZ2VzdGlvbm5haXJlIGRlIHRhZyA6IHswfSBjYXIgezF9Citqc3AuZXJyb3IuYmFkX3RhZz1BdWN1biB0YWcgezB9IGRhbnMgbGEgbGlicmFpcmllIGRlIHRhZyBpbXBvcnTpZSBhdmVjIGxlIHBy6WZpeGUgezF9Citqc3AuZXJyb3IuYmFkX3N0cmluZ19DaGFyYWN0ZXI9SW1wb3NzaWJsZSBkJydleHRyYWlyZSB1biBjYXJhY3TocmUgZGVwdWlzIHVuIHRhYmxlYXUgdmlkZQoranNwLmVycm9yLmJhZF9zdHJpbmdfY2hhcj1JbXBvc3NpYmxlIGQnJ2V4dHJhaXJlIHVuIGNhcmFjdOhyZSBkZXB1aXMgdW4gdGFibGVhdSB2aWRlCitqc3Aud2FybmluZy5jb21waWxlci5jbGFzcy5jYW50Y3JlYXRlPUltcG9zc2libGUgZGUgY3LpZXIgdW5lIGluc3RhbmNlIGRlIGNsYXNzZSBwbHVnaW4gcG91ciBsZSBjb21waWxhdGV1ciBpbmRpcXXpIHswfSBkdWUgdG8gezF9LiBVdGlsaXNhdGlvbiBwYXIgZOlmYXV0IGR1IENvbXBpbGF0ZXVyIEphdmEgU3VuLgoranNwLndhcm5pbmcuY29tcGlsZXIuY2xhc3Mubm90Zm91bmQ9TGEgY2xhc3NlIHBsdWdpbiBkZSBjb21waWxhdGV1ciB7MH0gZXN0IGludHJvdXZhYmxlLiBVdGlsaXNhdGlvbiBwYXIgZOlmYXV0IGR1IENvbXBpbGF0ZXVyIEphdmEgU3VuLgoranNwLndhcm5pbmcuY29tcGlsZXIucGF0aC5ub3Rmb3VuZD1sZSBjaGVtaW4gZGUgY29tcGlsYXRldXIgaW5kaXF16SB7MH0gZXN0IGludHJvdXZhYmxlLiBVdGlsaXNhdGlvbiBwYXIgZOlmYXV0IGR1IGNoZW1pbiBzeXN06G1lIChzeXN0ZW0gUEFUSCkuCitqc3AuZXJyb3IuanNwYy51cmlyb290X25vdF9kaXI9TCcnb3B0aW9uIC11cmlyb290IGRvaXQgaW5kaXF16SB1biBy6XBlcnRvaXJlIGTpauAgZXhpc3RhbnQKK2pzcGMuaW1wbGljaXQudXJpUm9vdD11cmlSb290IHLpZ2zpIGltcGxpY2l0ZW1lbnQg4CAiezB9IgoranNwYy51c2FnZT1Vc2FnZToganNwYyA8b3B0aW9ucz4gWy0tXSA8ZmljaGllcnMganNwPlxuXAorb/kgbGVzIGZpY2hpZXJzIGpzcCBzb250IG4nJ2ltcG9ydGUgcXVlbCBub21icmUgZGU6XG5cCitcICAgIDxmaWxlPiAgICAgICAgIFVuIGZpY2hpZXIg4CDpdmFsdWVyIChwYXJzZXIpIGNvbW1lIHBhZ2UganNwXG5cCitcICAgIC13ZWJhcHAgPGRpcj4gIFVuIHLpcGVydG9pcmUgY29udGVuYW50IHVuZSBhcHBsaWNhdGlvbiB3ZWIsIHRvdXRlcyBsZXMgcGFnZXMganNwXG5cCitcICAgICAgICAgICAgICAgICAgIHNlcm9udCBy6WN1cnNpdmVtZW50IOl2YWx16WVzXG5cCitv+SBsZXMgb3B0aW9ucyBjb21wcmVubmV0OlxuXAorXCAgICAtcSAgICAgICAgICBNb2RlIHNpbGVuY2lldXggKGlkZW50aXF1ZSDgIC12MClcblwKK1wgICAgLXZbI10gICAgICAgTW9kZSBiYXZhcmQgKExlIG5vbWJyZSBvcHRpb25uZWwgaW5kaXF1ZSBsZSBuaXZlYXUsIDIgcGFyIGTpZmF1dClcblwKK1wgICAgLWQgPGRpcj4gICAgRG9zc2llciBkZSBzb3J0aWVcblwKK1wgICAgLWRkIDxkaXI+ICAgRG9zc2llciBkZSBzb3J0aWUgbGl0ZXJhbC4gIChMZXMgZG9zc2llcnMgZGUgcGFxdWV0cyBuZSBzZXJvbnQgcGFzIGNvbnN0cnVpdHMpXG5cCitcICAgIC1sICAgICAgICAgIFNvcnRpZSBkdSBub20gbGEgcGFnZSBKU1AgZW4gY2FzIGQnJ+ljaGVjXG5cCitcICAgIC1zICAgICAgICAgIFNvcnRpZSBkdSBub20gbGEgcGFnZSBKU1AgZW4gY2FzIGRlIHN1Y2Poc1xuXAorXCAgICAtcCA8bmFtZT4gICBOb20gZHUgcGFxdWV0IGNpYmxlXG5cCitcICAgIC1jIDxuYW1lPiAgIE5vbSBkJ3VuIG5vbSBkZSBjbGFzc2UgY2libGVcblwKK1wgICAgICAgICAgICAgICAgKHMnJ2FwcGxpcXVlIHNldWxlbWVudCDgIGxhIHByZW1p6HJlIHBhZ2UgSlNQKVxuXAorXCAgICAtbWFwcGVkICAgICBH6W7ocmUgZGVzIGFwcGVscyDgIHdyaXRlKCkgc+lwYXLpcyBwb3VyIGNoYXF1ZSBsaWduZSBIVE1MIGRhbnMgbGEgSlNQXG5cCitcICAgIC1kaWVbI10gICAgIEfpbuhyZSB1biBjb2RlIGQnJ2VycmV1ciBkZSByZXRvdXIgKCMpIGVuIGNhcyBkJydlcnJldXJzIGZhdGFsZXMuXG5cCitcICAgICAgICAgICAgICAgIFNpIGxlIG5vbWJyZSBlc3QgYWJzZW50IG91IG5vbiBudW3pcmlxdWUsIGxlIGTpZmF1dCBlc3QgMS5cblwKK1wgICAgLXVyaWJhc2UgPGRpcj4gIExlIHLpcGVydG9pcmUgdXJpIGRlIGNvbXBpbGF0aW9ucyByZWxhdGlmXG5cCitcICAgICAgICAgICAgICAgICAgICAoUGFyIGTpZmF1dCAiLyIpXG5cCitcICAgIC11cmlyb290IDxkaXI+ICBUaGUgculwZXJ0b2lyZSByYWNpbmUgY29udHJlIGxlcXVlbCBsZXMgZmljaGllcnMgc2Vyb250IHLpc29sdXNcblwKK1wgICAgICAgICAgICAgICAgICAgICwgKFBhciBk6WZhdXQgbGUgculwZXJ0b2lyZSBkZXB1aXMgbGVxdWVsIGpzcGMgZXN0IGFwcGVs6SlcblwKK1wgICAgLXdlYmluYyA8ZmlsZT4gIENy6WF0aW9uIGQnJ2Fzc29jaWF0aW9uIHBhcnRpZWxsZSBkZSBzZXJ2bGV0IHBvdXIgbCcnb3B0aW9uIC13ZWJhcHAuXG5cCitcICAgIC13ZWJ4bWwgPGZpbGU+ICBDculhdGlvbiBkJyd1biBmaWNoaWVyIHdlYi54bWwgY29tcGxldCBwb3VyIGwnJ29wdGlvbiAtd2ViYXBwLlxuXAorXCAgICAtaWVwbHVnaW4gPGNsc2lkPiAgTGUgY2xhc3NpZCBkdSBQbHVnaW4gSmF2YSBQbHVnaW4gcG91ciBJbnRlcm5ldCBFeHBsb3JlclxuXAorXCAgICAtc2F4MiA8ZHJpdmVyY2xhc3NuYW1lPiAgTGUgbm9tIGRlIGNsYXNzZSBkdSBEcml2ZXIgU0FYIDIuMCDgIHV0aWxpc2VyXG5cCisKK2pzcGMud2VieG1sLmhlYWRlcj08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+XG5cCitcblwKKzwhRE9DVFlQRSB3ZWItYXBwXG5cCitcICAgIFBVQkxJQyAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIFdlYiBBcHBsaWNhdGlvbiAyLjMvL0VOIlxuXAorXCAgICAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvd2ViLWFwcF8yXzMuZHRkIj5cblwKKzwhLS1cblwKK0Ny6WVyIGF1dG9tYXRpcXVlbWVudCBwYXIgbGUgSnNwQyBUb21jYXQuXG5cCistLT5cblwKKzx3ZWItYXBwPlxuXAorXG4KK2pzcGMud2VieG1sLmZvb3Rlcj1cblwKKzwvd2ViLWFwcD5cblwKK1xuCitqc3BjLndlYmluYy5oZWFkZXI9XG5cCis8IS0tXG5cCitDcullciBhdXRvbWF0aXF1ZW1lbnQgcGFyIGxlIEpzcEMgVG9tY2F0LlxuXAorUGxhY2V6IGNlIGZyYWdtZW50IGRhbnMgbGUgZmljaGllciB3ZWIueG1sIGF2YW50IGFsbCBpY29uLCBkaXNwbGF5LW5hbWUsXG5cCitkZXNjcmlwdGlvbiwgZGlzdHJpYnV0YWJsZSwgYW5kIGNvbnRleHQtcGFyYW0gZWxlbWVudHMuXG5cCistLT5cbgoranNwYy53ZWJpbmMuZm9vdGVyPVxuXAorPCEtLVxuXAorQWxsIHNlc3Npb24tY29uZmlnLCBtaW1lLW1hcHBpbmcsIHdlbGNvbWUtZmlsZS1saXN0LCBlcnJvci1wYWdlLCB0YWdsaWIsXG5cCityZXNvdXJjZS1yZWYsIHNlY3VyaXR5LWNvbnN0cmFpbnQsIGxvZ2luLWNvbmZpZywgc2VjdXJpdHktcm9sZSxcblwKK2Vudi1lbnRyeSwgYW5kIGVqYi1yZWYgZWxlbWVudHMgc2hvdWxkIGZvbGxvdyB0aGlzIGZyYWdtZW50LlxuXAorLS0+XG4KK2pzcGMuZXJyb3IuamFzcGVyRXhjZXB0aW9uPWVycmV1ci1sZSBmaWNoaWVyICcnezB9JycgYSBn6W7pcukgbCcnZXhjZXB0aW9uIGQnJ+l2YWx1YXRpb24gc3VpdmFudGU6IHsxfQoranNwYy5lcnJvci5nZW5lcmFsRXhjZXB0aW9uPUVSUkVVUi1sZSBmaWNoaWVyICcnezB9JycgYSBn6W7pcukgbCcnZXhjZXB0aW9uIGfpbulyYWxlIHN1aXZhbnRlOgoranNwYy5lcnJvci5maWxlRG9lc05vdEV4aXN0PUwnJ2FyZ3VtZW50IGZpY2hpZXIgJyd7MH0nJyBuJydleGlzdGUgcGFzCitqc3BjLmVycm9yLmVtcHR5V2ViQXBwPS13ZWJhcHAgbuljZXNzaXRlIOAgc2Egc3VpdGUgdW4gYXJndW1lbnQgZmljaGllcgoranNwLmVycm9yLmxpYnJhcnkuaW52YWxpZD1MYSBwYWdlIEpTUCBwYWdlIGVzdCBpbmNvcnJlY3RlIGQnJ2FwcuhzIGxhIGxpYnJhaXJpZSB7MH06IHsxfQoranNwLmVycm9yLnRsdmNsYXNzLmluc3RhbnRpYXRpb249SW1wb3NzaWJsZSBkZSBjaGFyZ2VyIG91IGQnJ2luc3RhbmNpZXIgbGEgY2xhc3NlIFRhZ0xpYnJhcnlWYWxpZGF0b3I6IHswfQoranNwLmVycm9yLnRsdi5pbnZhbGlkLnBhZ2U9TWVzc2FnZSBkJydlcnJldXJzIGRlIHZhbGlkYXRpb24gcHJvdmVuYW50IGR1IFRhZ0xpYnJhcnlWYWxpZGF0b3IgcG91ciB7MH0KK2pzcC5lcnJvci50ZWkuaW52YWxpZC5hdHRyaWJ1dGVzPU1lc3NhZ2UgZCcnZXJyZXVycyBkZSB2YWxpZGF0aW9uIHByb3ZlbmFudCBkdSBUYWdFeHRyYUluZm8gcG91ciB7MH0KK2pzcC5wYXJzZXIuc2F4LnByb3BlcnR5bm90c3VwcG9ydGVkPVByb3Byael06SBTQVggbm9uIHN1cHBvcnTpZTogezB9Citqc3AucGFyc2VyLnNheC5wcm9wZXJ0eW5vdHJlY29nbml6ZWQ9UHJvcHJp6XTpIFNBWCBub24gcmVjb25udWU6IHswfQoranNwLnBhcnNlci5zYXguZmVhdHVyZW5vdHN1cHBvcnRlZD1Gb25jdGlvbm5hbGl06SBTQVggbm9uIHN1cHBvcnTpZTogezB9Citqc3AucGFyc2VyLnNheC5mZWF0dXJlbm90cmVjb2duaXplZD1Gb25jdGlvbm5hbGl06SBTQVggbm9uIHJlY29ubnVlOiB7MH0KK2pzcC5lcnJvci5uby5tb3JlLmNvbnRlbnQ9RmluIGRlIGNvbnRlbnUgYWxvcnMgcXVlIGwnJ+l2YWx1dGlvbiBuJyfpdGFpdCBwYXMgdGVybWlu6WU6IGVycmV1ciBkZSB0YWdzIGltYnJpcXXpcz8KK2pzcC5lcnJvci5wYXJzZS54bWw9RXJyZXVyIGQnJ+l2YWx1YXRpb24gWE1MIHN1ciBsZSBmaWNoaWVyIHswfQoranNwLmVycm9yLnBhcnNlLnhtbC5saW5lPUVycmV1ciBkJyfpdmFsdWF0aW9uIFhNTCBzdXIgbGUgZmljaGllciAgezB9OiAobGlnbmUgezF9LCBjb2wgezJ9KQoranNwLmVycm9yLnBhcnNlLnhtbC5zY3JpcHRpbmcuaW52YWxpZC5ib2R5PUxlIGNvcnBzIGRlIGwnJ+ls6W1lbnQgezB9IG5lIGRvaXQgY29udGVuaXIgYXVjdW4g6WzpbWVudHMgWE1MCitqc3AuZXJyb3IuaW50ZXJuYWwudGxkaW5pdD1FeGNlcHRpb24gbG9ycyBkZSBsJ2luaXRpYWxpc2F0aW9uIGRlIFRsZExvY2F0aW9uc0NhY2hlOiB7MH0KK2pzcC5lcnJvci5pbnRlcm5hbC5maWxlbm90Zm91bmQ9RXJyZXVyIGludGVybmU6IEZpY2hpZXIgezB9IGludHJvdXZhYmxlCitqc3AuZXJyb3IuaW50ZXJuYWwuZXZhbHVhdG9yX25vdF9mb3VuZD1FcnJldXIgaW50ZXJuZTogSW1wb3NzaWJsZSBkZSBjaGFyZ2VyIGwnJ+l2YWx1YXRldXIgZCcnZXhwcmVzc2lvbgoranNwLmVycm9yLnBhcnNlLnhtbC5pbnZhbGlkUHVibGljSWQ9UFVCTElDIElEIGludmFsaWRlOiB7MH0KK2pzcC5lcnJvci5pbmNsdWRlLmZsdXNoLmludmFsaWQudmFsdWU9VmFsZXVyIGluY29ycmVjdGUgcG91ciBsJydhdHRyaWJ1dCBmbHVzaDogezB9Citqc3AuZXJyb3IudW5zdXBwb3J0ZWQuZW5jb2Rpbmc9RW5jb2RhZ2Ugbm9uIHN1cHBvcnTpOiB7MH0KK2pzcC53YXJuaW5nLnVua25vd24uZWxlbWVudC5pbi52YXJpYWJsZT1BdHRlbnRpb246IEVsZW1lbnQgaW5jb25udSB7MH0gZGFucyBsYSB2YXJpYWJsZQordGxkLmVycm9yLnZhcmlhYmxlTm90QWxsb3dlZD1DZWNpIGVzdCB1bmUgZXJyZXVyIHBvdXIgbGUgdGFnIHF1aSBwb3Nz6GRlIHVuZSBvdSBwbHVzaWV1cnMgdmFyaWFibGVzIHN1YmVsZW1lbnRzIHBvdXIgYXZvaXIgdW5lIGNsYXNzZSBUYWdFeHRyYUluZm8gcXVpIHJldG91cm5lIHVuIG9iamV0IG5vbi1udWwuCitqc3AuZXJyb3IudGxkSW5XZWJEb3RYbWxOb3RGb3VuZD1OZSBwZXV0IHRyb3V2ZXIgbGUgVExEIHsxfSBwb3VyIGwnJ1VSSSB7MH0gaW5kaXF16WUgZGFucyBsZSBmaWNoaWVyIHdlYi54bWwKK2pzcC5lcnJvci50YWdsaWJEaXJlY3RpdmUuYWJzVXJpQ2Fubm90QmVSZXNvbHZlZD1MJyd1cmkgYWJzb2x1ZTogezB9IG5lIHBldXQg6nRyZSBy6XNvbHUgZGFucyBsZSBmaWNoaWVyIHdlYi54bWwgb3UgZGFucyBsZXMgZmljaGllcnMgamFyIGTpcGxveelzIGF2ZWMgY2V0dGUgYXBwbGljYXRpb24KK2pzcC5lcnJvci50YWdsaWJEaXJlY3RpdmUubWlzc2luZy5sb2NhdGlvbj1OaSBsJyd1cmknIG5pIGwnJ2F0dHJpYnV0ICd0YWdkaXInIG4nJ29udCDpdOkgaW5kaXF16XMgZGFucyBsYSBkaXJlY3RpdmUgdGFnbGliCitqc3AuZXJyb3IuaW52YWxpZC50YWdkaXI9TGUgculwZXJ0b2lyZSBkdSBmaWNoaWVyIFRhZyB7MH0gbmUgY29tbWVuY2UgcGFzIHBhciBcIi9XRUItSU5GL3RhZ3NcIgoranNwLmVycm9yLnVudGVybWluYXRlZC51c2VyLnRhZz1UYWcgdXNlci1kZWZpbmVkIG5vbiB0ZXJtaW7pOiBMZSB0YWcgZGUgZmVybWV0dXJlIHswfSBlc3QgaW50cm91dmFibGUgZm91bmQgb3UgaW5jb3JyZWN0ZW1lbnQgaW1icmlxdekKKyNqc3B4LmVycm9yLnRlbXBsYXRlRGF0YU5vdEluSnNwQ2RhdGE9RXJyZXVyIGRlIHZhbGlkYXRpb246IGwnJ+ls6W1lbnQgJmx0O3swfSZndDsgbmUgcGV1dCBhdm9pciBkZSBkb25u6WVzIHRlbXBsYXRlLiBMZXMgZG9ubullcyBUZW1wbGF0ZSBkb2l2ZW50IOp0cmUgZW5jYXBzdWzpZXMg4CBsJydpbnTpcmlldXIgZCcndW4g6WzpbWVudCAmbHQ7anNwOmNkYXRhJmd0Oy4gW0pTUDEuMiBQRkQgc2VjdGlvbiA1LjEuOV1cbkRvbm7pZSBUZW1wbGF0ZSBlbiBlcnJldXI6IHsxfQoranNweC5lcnJvci50ZW1wbGF0ZURhdGFOb3RJbkpzcENkYXRhPUVycmV1ciBkZSB2YWxpZGF0aW9uOiBsJyfpbOltZW50ICZsdDt7MH0mZ3Q7IG5lIHBldXQgYXZvaXIgZGUgZG9ubullcyB0ZW1wbGF0ZS4gTGVzIGRvbm7pZXMgVGVtcGxhdGUgZG9pdmVudCDqdHJlIGVuY2Fwc3Vs6WVzIOAgbCcnaW506XJpZXVyIGQnJ3VuIOls6W1lbnQgJmx0O2pzcDp0ZXh0Jmd0Oy4gW0pTUDEuMiBQRkQgc2VjdGlvbiA1LjEuOV1cbkRvbm7pZSBUZW1wbGF0ZSBlbiBlcnJldXI6IHsxfQorI0VycmV1ciBsb3JzIGR1IHRyYWl0ZW1lbnQgZHUgZmljaGllciBqYXIgZGUgbGEgdGFnbGliIHswfTogezF9Citqc3AuZXJyb3IudGFnbGliLnJlc2VydmVkLnByZWZpeD1MZSBwculmaXhlIHRhZ2xpYiB7MH0gZXN0IHLpc2VydukKK2pzcC5lcnJvci5pbnZhbGlkLmphdmFFbmNvZGluZz1FbmNvZGFnZSBqYXZhIGluY29ycmVjdC4gRXNzYWkgZGUgezB9IHB1aXMgZGUgezF9LiBMZXMgZGV1eCBvbnQg6WNob3XpLgoranNwLmVycm9yLm5lZWRBbHRlcm5hdGVKYXZhRW5jb2Rpbmc9TCcnZW5jb2RhZ2UgamF2YSBwYXIgZOlmYXV0IHswfSBlc3QgaW5jb3JyZWN0IHN1ciB2b3RyZSBlbnZpcm9ubmVtZW50IGphdmEuIFVuZSBhbHRlcm5hdGl2ZSBwZXV0IOp0cmUgaW5kaXF16WUgdmlhIGxlIHBhcmFt6nRyZSAnamF2YUVuY29kaW5nJyBkZSBsYSBKc3BTZXJ2bGV0LgorI0VycmV1ciBsb3JzIGRlIGxhIGNvbXBpbGF0aW9uLCB1dGlsaXPpIHBvdXIgbGEgbGlnbmUganNwIGRlcyBtZXNzYWdlcyBkJydlcnJldXIKK2pzcC5lcnJvci5zaW5nbGUubGluZS5udW1iZXI9VW5lIGVycmV1ciBzJydlc3QgcHJvZHVpdGUg4CBsYSBsaWduZTogezB9IGRhbnMgbGUgZmljaGllciBqc3A6IHsxfQoranNwLmVycm9yLm11bHRpcGxlLmxpbmUubnVtYmVyPVxuXG5VbmUgZXJyZXVyIHMnJ2VzdCBwcm9kdWl0ZSBlbnRyZSBsZXMgbGlnbmVzOiB7MH0gZXQgezF9IGRhbnMgbGUgZmljaGllciBqc3A6IHsyfVxuXG4KK2pzcC5lcnJvci5jb3JyZXNwb25kaW5nLnNlcnZsZXQ9RXJyZXVyIGRlIHNlcnZsZXQgZ+lu6XLpZTpcbgoranNwLmVycm9yLmVtcHR5LmJvZHkubm90LmFsbG93ZWQ9VW4gY29ycHMgdmlkZSBuJ2VzdCBwYXMgYXV0b3Jpc+kgcG91ciB7MH0KK2pzcC5lcnJvci5qc3Bib2R5LnJlcXVpcmVkPURvaXQgdXRpbGlzZXIganNwOmJvZHkgcG91ciBpbmRpcXXpIGxlIGNvcnBzIGRlIHRhZyBib2R5IGRlIHswfSBzaSBqc3A6YXR0cmlidXRlIGVzdCB1dGlsaXPpLgoranNwLmVycm9yLmpzcGJvZHkuZW1wdHlib2R5Lm9ubHk9TGUgdGFnIHswfSBuZSBwZXV0IGF2b2lyIHF1ZSBqc3A6YXR0cmlidXRlIGRhbnMgc29uIGNvcnBzLgoranNwLmVycm9yLm5vLnNjcmlwdGxldHM9TGVzIOls6W1lbnRzIGRlIFNjcmlwdGluZyAoIDwlISwgPGpzcDpkZWNsYXJhdGlvbiwgPCU9LCA8anNwOmV4cHJlc3Npb24sIDwlLCA8anNwOnNjcmlwdGxldCApIG5lIHNvbnQgcGFzIGF1dG9yaXPpcyBpY2kuCitqc3AuZXJyb3IuaW50ZXJuYWwudW5leHBlY3RlZF9ub2RlX3R5cGU9RXJyZXVyIEludGVybmU6IFR5cGUgZGUgbm9kZSBpbmF0dGVuZHUgcmVuY29udHLpCitqc3AuZXJyb3IudGxkLmZuLmludmFsaWQuc2lnbmF0dXJlPVN5bnRoYXhlIGludmFsaWRlIHBvdXIgbGEgc2lnbmF0dXJlIGRlIGZvbmN0aW9uIGRhbnMgbGEgVExELiAgTGlicmFpcmllIGRlIFRhZyA6IHswfSwgRm9uY3Rpb246IHsxfQoranNwLmVycm9yLnRsZC5mbi5pbnZhbGlkLnNpZ25hdHVyZS5jbGFzc25vdGZvdW5kPVN5bnRoYXhlIGludmFsaWRlIHBvdXIgbGEgc2lnbmF0dXJlIGRlIGZvbmN0aW9uIGRhbnMgbGEgVExELiAgQ2xhc3NlIGludHJvdXZhYmxlOiAkezB9LiAgTGlicmFpcmllIGRlIFRhZzogezF9LCBGb25jdGlvbjogezJ9LgoranNwLmVycm9yLnRsZC5mbi5pbnZhbGlkLnNpZ25hdHVyZS5jb21tYWV4cGVjdGVkPVN5bnRoYXhlIGludmFsaWRlIHBvdXIgbGEgc2lnbmF0dXJlIGRlIGZvbmN0aW9uIGRhbnMgbGEgVExELiAgVmlyZ3VsZSAnLCcgYXR0ZW5kdWUuICBMaWJyYWlyaWUgZGUgVGFnOiB7MH0sIEZvbmN0aW9uOiB7MX0uCitqc3AuZXJyb3IudGxkLmZuLmludmFsaWQuc2lnbmF0dXJlLnBhcmVuZXhwZWN0ZWQ9U3ludGhheGUgaW52YWxpZGUgcG91ciBsYSBzaWduYXR1cmUgZGUgZm9uY3Rpb24gZGFucyBsYSBUTEQuICBQYXJlbnRo6HNlICcoJyBhdHRlbmR1ZS4gIExpYnJhaXJpZSBkZSBUYWc6IHswfSwgRm9uY3Rpb246IHsxfS4KK2pzcC5lcnJvci5keW5hbWljLmF0dHJpYnV0ZXMubm90LmltcGxlbWVudGVkPUxlIHRhZyB7MH0gaW5kaXF1ZSBxdScnaWwgYWNjZXB0ZSBkZXMgYXR0cmlidXRzIGR5bmFtaWNzIG1haXMgbicnaW1wbOltZW50ZSBwYXMgbCcnaW50ZXJmYWNlIHJlcXVpc2UKK2pzcC5lcnJvci5ub21hdGNoaW5nLmZyYWdtZW50PU5lIHBldXQgdHJvdXZlciB1bmUgZGlyZWN0aXZlIGF0dHJpYnV0IChhdmVjIHBvdXIgbm9tPXswfSBldCBmcmFnbWVudD10cnVlKSBhdmFudCBsYSBkaXJlY3RpdmUgZnJhZ21lbnQuCitqc3AuZXJyb3IuYXR0cmlidXRlLm5vZXF1YWw9U3ltYm9sZSDpZ2FsIChlcXVhbCkgYXR0ZW5kdQoranNwLmVycm9yLmF0dHJpYnV0ZS5ub3F1b3RlPVN5bWJvbGUgZ3VpbGxlbWV0IChxdW90ZSkgYXR0ZW5kdQoranNwLmVycm9yLmF0dHJpYnV0ZS51bnRlcm1pbmF0ZWQ9TCcnYXR0cmlidXQgcG91ciB7MH0gbicnZXN0IHBhcyBjb3JyZWN0ZW1lbnQgdGVybWlu6QoranNwLmVycm9yLm1pc3NpbmcudGFnSW5mbz1MJydvYmpldCBUYWdJbmZvIGRlIHswfSBlc3QgYWJzZW50IGRlIGxhIFRMRAoranNwLmVycm9yLmZyYWdtZW50d2l0aHR5cGU9T24gbmUgcGV1dCBpbmRpcXVlciDgIGxhIGZvaXMgbGVzIGF0dHJpYnV0cyAnZnJhZ21lbnQnIGV0ICd0eXBlJy4gIFNpICdmcmFnbWVudCcgZXN0IHBy6XNlbnQsICd0eXBlJyBlc3QgZml46SBjb21tZSAnamF2YXguc2VydmxldC5qc3AudGFnZXh0LkpzcEZyYWdtZW50JworanNwLmVycm9yLmZyYWdtZW50d2l0aHJ0ZXhwcnZhbHVlPU9uIG5lIHBldXQgaW5kaXF1ZXIg4CBsYSBmb2lzIGxlcyBhdHRyaWJ1dHMgJ2ZyYWdtZW50JyBldCAncnRleHBydmFsdWUnLiAgU2kgJ2ZyYWdtZW50JyBlc3QgcHLpc2VudCwgJ3J0ZXhwcnZhbHVlJyBlc3QgZml46SDgICd0cnVlJworanNwLmVycm9yLmZyYWdtZW50V2l0aERlY2xhcmVPclNjb3BlPUxlcyBhdHRyaWJ1dHMgJ2ZyYWdtZW50JyBldCAnZGVjbGFyZScgb3UgJ3Njb3BlJyBzb250IGluZGlxdelzIGRhbnMgbGEgZGlyZWN0aXZlIHZhcmlhYmxlCitqc3AuZXJyb3IudmFyX2FuZF92YXJSZWFkZXI9QSBsYSBmb2lzICd2YXInIGV0ICd2YXJSZWFkZXInIHNvbnQgaW5kaXF16XMKK2pzcC53YXJuaW5nLmJhZC51cmxwYXR0ZXJuLnByb3BlcnR5Z3JvdXA9TWF1dmFpc2UgdmFsZXVyIHswfSBkYW5zIGxlIHNvdXMt6WzpbWVudCAoc3ViZWxlbWVudCkgdXJsLXBhdHRlcm4gZHUgZmljaGllciB3ZWIueG1sCitqc3AuZXJyb3IudW5rbm93bl9hdHRyaWJ1dGVfdHlwZT1UeXBlIGQnJ2F0dHJpYnV0IGluY29ubnUgKHsxfSkgcG91ciBsJydhdHRyaWJ1dCB7MH0uCitqc3AuZXJyb3IuanNwZWxlbWVudC5taXNzaW5nLm5hbWU9TCcnYXR0cmlidXQgb2JsaWdhdG9pcmUgJ25hbWUnIGVzdCBhYnNlbnQgZGUganNwOmVsZW1lbnQKK2pzcC5lcnJvci54bWxucy5yZWRlZmluaXRpb24ubm90aW1wbGVtZW50ZWQ9RXJyZXVyIEludGVybmU6IFRlbnRhdGl2ZSBkZSByZWTpZmluaXRpb24gZGUgeG1sbnM6ezB9LiAgTGEgcmVk6WZpbml0aW9uIGRlcyBkb21haW5lcyBkZSBub21zIChuYW1lc3BhY2VzKSBuJydlc3QgcGFzIGltcGzpbWVudOllLgoranNwLmVycm9yLmNvdWxkLm5vdC5hZGQudGFnbGlicmFyaWVzPUltcG9zc2libGUgZCcnYWpvdXRlciB1bmUgb3UgcGx1c2lldXJzIGxpYnJhaXJpZXMgZGUgdGFnLgoranNwLmVycm9yLmR1cGxpY2F0ZS5uYW1lLmpzcGF0dHJpYnV0ZT1MJydhdHRyaWJ1dCB7MH0gaW5kaXF16SBkYW5zIGwnJ2FjdGlvbiBzdGFuZGFyZCBvdSBzcOljaWZpcXVlIChjdXN0b20pIGFwcGFyYWl0IGF1c3NpIGNvbW1lIHZhbGV1ciBkZSBsJydhdHRyaWJ1dCBkZSBub20gZGFucyBsZSBqc3A6YXR0cmlidXRlIGluY2x1cworanNwLmVycm9yLm5vdC5pbi50ZW1wbGF0ZT17MH0gbicnZXN0IHBhcyBhdXRvcmlz6SBkYW5zIGxlIGNvcnBzIGRlIHRleHRlIGRlIHRlbXBsYXRlLgoranNwLmVycm9yLmJhZFN0YW5kYXJkQWN0aW9uPUwnJ2FjdGlvbiBuJydlc3QgcGFzIHJlY29ubnVlIGNvbW1lIHVuZSBhY3Rpb24gc3RhbmRhcmQuCitqc3AuZXJyb3IudGFnZGlyZWN0aXZlLmJhZGJvZHljb250ZW50PUNvbnRlbnUgZGUgY29ycHMgKGJvZHktY29udGVudCkgKHswfSkgaW52YWxpZGUgZGFucyBsYSBkaXJlY3RpdmUgdGFnCitqc3AuZXJyb3IuY29uZmlnX3BhZ2VkaXJfZW5jb2RpbmdfbWlzbWF0Y2g9TCcnZW5jb2RlIGRlIHBhZ2UgKFBhZ2UtZW5jb2RpbmcpIGluZGlxdekgZGFucyBsZSBqc3AtcHJvcGVydHktZ3JvdXAgKHswfSkgZXN0IGRpZmbpcmVudCBkZSBjZWx1aSBpbmRpcXXpIGRhbnMgbGEgZGlyZWN0aXZlIGRlIHBhZ2UgKHsxfSkKK2pzcC5lcnJvci5wcm9sb2dfcGFnZWRpcl9lbmNvZGluZ19taXNtYXRjaD0KK2pzcC5lcnJvci5wcm9sb2dfY29uZmlnX2VuY29kaW5nX21pc21hdGNoPQoranNwLmVycm9yLmF0dHJpYnV0ZS5jdXN0b20ubm9uX3J0X3dpdGhfZXhwcj1EJydhcHLocyBsYSBUTEQsIGwnJ2F0dHJpYnV0IHswfSBuJydhY2NlcHRlIGF1Y3VuZSBleHByZXNzaW9uCitqc3AuZXJyb3Iuc2NyaXB0aW5nLnZhcmlhYmxlLm1pc3NpbmdfbmFtZT1JbmNhcGFibGUgZGUgZOl0ZXJtaW5lciBsZSBub20gZGUgdmFyaWFibGUgc2NyaXB0aW5nIGQnJ2FwcuhzIGwnJ2F0dHJpYnV0IHswfQoramFzcGVyLmVycm9yLmVtcHR5Ym9keWNvbnRlbnQubm9uZW1wdHk9RCcnYXBy6HMgbGEgVExELCBsZSB0YWcgezB9IGRvaXQg6nRyZSB2aWRlLCBtYWlzIG5lIGwnJ2VzdCBwYXMKK2pzcC5lcnJvci50YWdmaWxlLm5hbWVOb3RVbmlxdWU9Citqc3AuZXJyb3IudGFnZmlsZS5uYW1lRnJvbS5ub0F0dHJpYnV0ZT0KK2pzcC5lcnJvci50YWdmaWxlLm5hbWVGcm9tLmJhZEF0dHJpYnV0ZT0KK2pzcC5lcnJvci51c2VCZWFuLm5vU2Vzc2lvbj1JbCBlc3QgaWxs6WdhbCBwb3VyIHVzZUJlYW4gZCcndXRpbGlzZXIgdW5lIHBvcnTpZSBkZSBzZXNzaW9uIChzZXNzaW9uIHNjb3BlKSBxdWFuZCBsYSBwYWdlIEpTUCBpbmRpcXVlICh2aWEgbGEgZGlyZWN0aXZlIGRlIHBhZ2UpIHF1JydlbGxlIG5lIHBhcnRpY2lwZSBwYXMgYXV4IHNlc3Npb25zCitqc3AuZXJyb3IuYXR0cmlidXRlcy5ub3QuYWxsb3dlZCA9IHswfSBuZSBkb2l0IGF2b2lyIGF1Y3VuIGF0dHJpYnV0Citqc3AuZXJyb3IubmVzdGVkLmpzcGF0dHJpYnV0ZT0KK2pzcC5lcnJvci5uZXN0ZWQuanNwYm9keT0KK2pzcC5lcnJvci52YXJpYWJsZS5laXRoZXIubmFtZT0KK2pzcC5lcnJvci52YXJpYWJsZS5ib3RoLm5hbWU9Citqc3AuZXJyb3IudmFyaWFibGUuYWxpYXM9Citqc3AuZXJyb3IuanNwdGV4dC5iYWRjb250ZW50PQoranNwLmVycm9yLnByZWZpeC5yZWZpbmVkPQoranNwLmVycm9yLmpzcG91dHB1dC5jb25mbGljdD0KK2pzcC5lcnJvci5qc3BvdXRwdXQuZG9jdHlwZW5hbWVzeXN0ZW09Citqc3AuZXJyb3IuanNwb3V0cHV0LmRvY3R5cGVwdWxpY3N5c3RlbT0KK2pzcC5lcnJvci5qc3BvdXRwdXQubm9uZW1wdHlib2R5PQoranNwLmVycm9yLmpzcG91dHB1dC5pbnZhbGlkVXNlPQoranNwLmVycm9yLmludmFsaWQuYmVhbj0KZGlmZiAtLWdpdCBhL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9yZXNvdXJjZXMvTG9jYWxTdHJpbmdzX2phLnByb3BlcnRpZXMgYi9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvcmVzb3VyY2VzL0xvY2FsU3RyaW5nc19qYS5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmN2I5NjIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvcmVzb3VyY2VzL0xvY2FsU3RyaW5nc19qYS5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNDAyIEBACisjICRJZCQKKyMKKyMgRGVmYXVsdCBsb2NhbGl6ZWQgc3RyaW5nIGluZm9ybWF0aW9uCisjIExvY2FsaXplZCB0aGlzIHRoZSBEZWZhdWx0IExvY2FsZSBhcyBpcyBqYV9KUAorCitqc3AuZXJyb3IuYmFkLnNlcnZsZXQuZW5naW5lPVx1MzBiNVx1MzBmY1x1MzBkNlx1MzBlY1x1MzBjM1x1MzBjOFx1MzBhOFx1MzBmM1x1MzBiOFx1MzBmM1x1MzA2ZVx1MzBkMFx1MzBmY1x1MzBiOFx1MzBlN1x1MzBmM1x1MzA0Y1x1NmI2M1x1MzA1N1x1MzA0Zlx1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLm5vLnNjcmF0Y2guZGlyPUpTUFx1MzBhOFx1MzBmM1x1MzBiOFx1MzBmM1x1MzA2Ylx1MzBjN1x1MzBkNVx1MzBhOVx1MzBlYlx1MzBjOFx1MzA2ZXNjcmF0Y2hEaXJcdTMwNGNcdThhMmRcdTViOWFcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDJcCitcbiBcdTMwNTNcdTMwNmVcdTMwYjNcdTMwZjNcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzhcdTMwNmVzZXJ2bGV0cy5wcm9wZXJ0aWVzXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMDZiXHUzMDAxXAorXG4gXCJqc3AuaW5pdHBhcmFtcz1zY3JhdGNoZGlyPTxkaXItbmFtZT5cIiBcdTMwOTJcdThmZmRcdTUyYTBcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDIKK2pzcC5lcnJvci5iYWQuc2NyYXRjaC5kaXI9XHUzMDQyXHUzMDZhXHUzMDVmXHUzMDRjXHU2MzA3XHU1YjlhXHUzMDU3XHUzMDVmc2NyYXRjaERpclx1MzA2Zlx1NGY3Zlx1NzUyOFx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLm1lc3NhZ2Uuc2NyYXRjaC5kaXIuaXM9SlNQXHUzMGE4XHUzMGYzXHUzMGI4XHUzMGYzXHUzMDZlU2NyYXRjaGRpcjogezB9Citqc3AubWVzc2FnZS5wYXJlbnRfY2xhc3NfbG9hZGVyX2lzPVx1ODlhYVx1MzBhZlx1MzBlOVx1MzBiOVx1MzBlZFx1MzBmY1x1MzBjMDogezB9Citqc3AubWVzc2FnZS5kb250Lm1vZGlmeS5zZXJ2bGV0cz1cdTkxY2RcdTg5ODE6IFx1NzUxZlx1NjIxMFx1MzA1NVx1MzA4Y1x1MzA1Zlx1MzBiNVx1MzBmY1x1MzBkNlx1MzBlY1x1MzBjM1x1MzBjOFx1MzA5Mlx1NTkwOVx1NjZmNFx1MzA1N1x1MzA2Nlx1MzA2Zlx1MzA0NFx1MzA1MVx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLm5vdC5pbXBsLmNvbW1lbnRzPVx1NTE4NVx1OTBlOFx1MzBhOFx1MzBlOVx1MzBmYzogQ29tbWVudHNcdTMwNmZcdTViOWZcdTg4YzVcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC5lcnJvci5ub3QuaW1wbC5kaXJlY3RpdmVzPVx1NTE4NVx1OTBlOFx1MzBhOFx1MzBlOVx1MzBmYzogRGlyZWN0aXZlc1x1MzA2Zlx1NWI5Zlx1ODhjNVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLm5vdC5pbXBsLmRlY2xhcmF0aW9ucz1cdTUxODVcdTkwZThcdTMwYThcdTMwZTlcdTMwZmM6IERlY2xhcmF0aW9uc1x1MzA2Zlx1NWI5Zlx1ODhjNVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLm5vdC5pbXBsLmV4cHJlc3Npb25zPVx1NTE4NVx1OTBlOFx1MzBhOFx1MzBlOVx1MzBmYzogRXhwcmVzc2lvbnNcdTMwNmZcdTViOWZcdTg4YzVcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC5lcnJvci5ub3QuaW1wbC5zY3JpcHRsZXRzPVx1NTE4NVx1OTBlOFx1MzBhOFx1MzBlOVx1MzBmYzogU2NyaXB0bGV0c1x1MzA2Zlx1NWI5Zlx1ODhjNVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLm5vdC5pbXBsLnVzZWJlYW49XHU1MTg1XHU5MGU4XHUzMGE4XHUzMGU5XHUzMGZjOiB1c2VCZWFuXHUzMDZmXHU1YjlmXHU4OGM1XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3Iubm90LmltcGwuZ2V0cD1cdTUxODVcdTkwZThcdTMwYThcdTMwZTlcdTMwZmM6IGdldFByb3BlcnR5XHUzMDZmXHU1YjlmXHU4OGM1XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3Iubm90LmltcGwuc2V0cD1cdTUxODVcdTkwZThcdTMwYThcdTMwZTlcdTMwZmM6IHNldFByb3BlcnR5XHUzMDZmXHU1YjlmXHU4OGM1XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3Iubm90LmltcGwucGx1Z2luPVx1NTE4NVx1OTBlOFx1MzBhOFx1MzBlOVx1MzBmYzogcGx1Z2luXHUzMDZmXHU1YjlmXHU4OGM1XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3Iubm90LmltcGwuZm9yd2FyZD1cdTUxODVcdTkwZThcdTMwYThcdTMwZTlcdTMwZmM6IGZvcndhcmRcdTMwNmZcdTViOWZcdTg4YzVcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC5lcnJvci5ub3QuaW1wbC5pbmNsdWRlPVx1NTE4NVx1OTBlOFx1MzBhOFx1MzBlOVx1MzBmYzogaW5jbHVkZVx1MzA2Zlx1NWI5Zlx1ODhjNVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLnVuYXZhaWxhYmxlPUpTUFx1MzA2Zlx1NTIyOVx1NzUyOFx1NGUwZFx1NTNlZlx1MzA2OFx1MzBkZVx1MzBmY1x1MzBhZlx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OQoranNwLmVycm9yLnVzZWJlYW4ubWlzc2luZy5hdHRyaWJ1dGU9dXNlQmVhbjogaWRcdTVjNWVcdTYwMjdcdTMwNGNcdTViNThcdTU3MjhcdTMwNTdcdTMwNmFcdTMwNDRcdTMwNGJcdTMwMDFcdTMwYjlcdTMwZGFcdTMwZWJcdTMwZGZcdTMwYjlcdTMwNjdcdTMwNTkKK2pzcC5lcnJvci51c2ViZWFuLm1pc3NpbmcudHlwZT11c2VCZWFuICh7MH0pOiBjbGFzc1x1NWM1ZVx1NjAyN1x1MzA0YnR5cGVcdTVjNWVcdTYwMjdcdTMwOTJcdTYzMDdcdTViOWFcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDQ6Citqc3AuZXJyb3IudXNlYmVhbi5kdXBsaWNhdGU9dXNlQmVhbjogYmVhbk5hbWVcdTVjNWVcdTYwMjdcdTMwNGNcdTkxY2RcdTg5MDdcdTMwNTdcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTk6IHswfQoranNwLmVycm9yLnVzZWJlYW4ucHJvaGliaXRlZC5hcy5zZXNzaW9uPVx1NGVlNVx1NTI0ZFx1MzA2Ylx1NWI5YVx1N2ZhOVx1MzA1N1x1MzA1ZkpTUFx1NjMwN1x1NzkzYVx1NWI1MFx1MzA2Ylx1MzA4OFx1MzA2M1x1MzA2Nlx1Nzk4MVx1NmI2Mlx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA4Ylx1MzA1Zlx1MzA4MVx1MzA2Ylx1MzAwMXNlc3Npb24gYmVhbiB7MH0gXHUzMDY4XHUzMDU3XHUzMDY2XHU0ZjdmXHU3NTI4XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzOgoranNwLmVycm9yLnVzZWJlYW4ubm90LmJvdGg9dXNlQmVhbjogY2xhc3NcdTVjNWVcdTYwMjdcdTMwNjhiZWFuTmFtZVx1NWM1ZVx1NjAyN1x1MzA2ZVx1NGUyMVx1NjViOVx1MzA5Mlx1NTQwY1x1NjY0Mlx1MzA2Ylx1NjMwN1x1NWI5YVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5MzoKK2pzcC5lcnJvci51c2ViZWFuLmJhZC50eXBlLmNhc3Q9dXNlQmVhbiAoezB9KTogdHlwZSAoezF9KSBcdTMwNmZjbGFzcyAoezJ9KSBcdTMwNGJcdTMwODlcdTUyNzJcdTMwOGFcdTVmNTNcdTMwNjZcdTMwODlcdTMwOGNcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC5lcnJvci5pbnZhbGlkLnNjb3BlPSdzY29wZSdcdTVjNWVcdTYwMjdcdTMwNmVcdTUwMjRcdTMwNGNcdTcxMjFcdTUyYjlcdTMwNjdcdTMwNTk6IHswfSAoXCJwYWdlXCJcdTMwMDFcInJlcXVlc3RcIlx1MzAwMVwic2Vzc2lvblwiXHU1M2M4XHUzMDZmXCJhcHBsaWNhdGlvblwiXHUzMDZlXHUzMDY5XHUzMDhjXHUzMDRiXHUzMDY3XHUzMDZhXHUzMDUxXHUzMDhjXHUzMDcwXHUzMDQ0XHUzMDUxXHUzMDdlXHUzMDViXHUzMDkzKQoranNwLmVycm9yLmNsYXNzbmFtZT0uY2xhc3NcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTMwNGJcdTMwODlcdTMwYWZcdTMwZTlcdTMwYjlcdTU0MGRcdTMwOTJcdTZjN2FcdTViOWFcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC53YXJuaW5nLmJhZC50eXBlPVx1OGI2Nlx1NTQ0YTogLmNsYXNzXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHU0ZTJkXHUzMDZlXHU1NzhiXHUzMDRjXHU5MDU1XHUzMDQ0XHUzMDdlXHUzMDU5Citqc3AuZXJyb3IuZGF0YS5maWxlLndyaXRlPVx1MzBjN1x1MzBmY1x1MzBiZlx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA5Mlx1NjZmOFx1MzA0ZFx1OGZiY1x1MzA3Zlx1NGUyZFx1MzA2ZVx1MzBhOFx1MzBlOVx1MzBmY1x1MzA2N1x1MzA1OQoranNwLmVycm9yLnBhZ2UuaW52YWxpZC5idWZmZXI9cGFnZVx1NjMwN1x1NzkzYVx1NWI1MDogXHU3MTIxXHU1MmI5XHUzMDZhXHUzMGQwXHUzMGMzXHUzMGQ1XHUzMGExXHUzMGI1XHUzMGE0XHUzMGJhXHUzMDY3XHUzMDU5Citqc3AuZXJyb3IucGFnZS5jb25mbGljdC5jb250ZW50dHlwZT1wYWdlXHU2MzA3XHU3OTNhXHU1YjUwOiAnY29udGVudFR5cGUnXHUzMDkyXHU3NTcwXHUzMDZhXHUzMDhiXHU1MDI0XHUzMDY3XHU4OTA3XHU2NTcwXHU1NmRlXHU2MzA3XHU1YjlhXHUzMDU5XHUzMDhiXHUzMDZlXHUzMDZmXHU3MTIxXHU1MmI5XHUzMDY3XHUzMDU5IChcdTY1ZTc6IHswfSwgXHU2NWIwOiB7MX0pCitqc3AuZXJyb3IucGFnZS5pbnZhbGlkLmNvbnRlbnR0eXBlPXBhZ2VcdTYzMDdcdTc5M2FcdTViNTA6IGNvbnRlbnRUeXBlXHU1YzVlXHU2MDI3XHUzMDZlXHU1MDI0XHUzMDRjXHU3MTIxXHU1MmI5XHUzMDY3XHUzMDU5Citqc3AuZXJyb3IucGFnZS5jb25mbGljdC5zZXNzaW9uPXBhZ2VcdTYzMDdcdTc5M2FcdTViNTA6ICdzZXNzaW9uJ1x1MzA5Mlx1NzU3MFx1MzA2YVx1MzA4Ylx1NTAyNFx1MzA2N1x1ODkwN1x1NjU3MFx1NTZkZVx1NjMwN1x1NWI5YVx1MzA1OVx1MzA4Ylx1MzA2ZVx1MzA2Zlx1NzEyMVx1NTJiOVx1MzA2N1x1MzA1OSAoXHU2NWU3OiB7MH0sIFx1NjViMDogezF9KQoranNwLmVycm9yLnBhZ2UuaW52YWxpZC5zZXNzaW9uPXBhZ2VcdTYzMDdcdTc5M2FcdTViNTA6IHNlc3Npb25cdTVjNWVcdTYwMjdcdTMwNmVcdTUwMjRcdTMwNGNcdTcxMjFcdTUyYjlcdTMwNjdcdTMwNTkKK2pzcC5lcnJvci5wYWdlLmNvbmZsaWN0LmJ1ZmZlcj1wYWdlXHU2MzA3XHU3OTNhXHU1YjUwOiAnYnVmZmVyJ1x1MzA5Mlx1NzU3MFx1MzA2YVx1MzA4Ylx1NTAyNFx1MzA2N1x1ODkwN1x1NjU3MFx1NTZkZVx1NjMwN1x1NWI5YVx1MzA1OVx1MzA4Ylx1MzA2ZVx1MzA2Zlx1NzEyMVx1NTJiOVx1MzA2N1x1MzA1OSAoXHU2NWU3OiB7MH0sIFx1NjViMDogezF9KQoranNwLmVycm9yLnBhZ2UuaW52YWxpZC5idWZmZXI9cGFnZVx1NjMwN1x1NzkzYVx1NWI1MDogYnVmZmVyXHU1YzVlXHU2MDI3XHUzMDZlXHU1MDI0XHUzMDRjXHU3MTIxXHU1MmI5XHUzMDY3XHUzMDU5Citqc3AuZXJyb3IucGFnZS5jb25mbGljdC5hdXRvZmx1c2g9cGFnZVx1NjMwN1x1NzkzYVx1NWI1MDogJ2F1dG9GbHVzaCdcdTMwOTJcdTc1NzBcdTMwNmFcdTMwOGJcdTUwMjRcdTMwNjdcdTg5MDdcdTY1NzBcdTU2ZGVcdTYzMDdcdTViOWFcdTMwNTlcdTMwOGJcdTMwNmVcdTMwNmZcdTcxMjFcdTUyYjlcdTMwNjdcdTMwNTkgKFx1NjVlNzogezB9LCBcdTY1YjA6IHsxfSkKK2pzcC5lcnJvci5wYWdlLmludmFsaWQuYXV0b2ZsdXNoPXBhZ2VcdTYzMDdcdTc5M2FcdTViNTA6IGF1dG9GbHVzaFx1NWM1ZVx1NjAyN1x1MzA2ZVx1NTAyNFx1MzA0Y1x1NzEyMVx1NTJiOVx1MzA2N1x1MzA1OQoranNwLmVycm9yLnBhZ2UuY29uZmxpY3QuaXN0aHJlYWRzYWZlPXBhZ2VcdTYzMDdcdTc5M2FcdTViNTA6ICdpc1RocmVhZFNhZmUnXHUzMDkyXHU3NTcwXHUzMDZhXHUzMDhiXHU1MDI0XHUzMDY3XHU4OTA3XHU2NTcwXHU1NmRlXHU2MzA3XHU1YjlhXHUzMDU5XHUzMDhiXHUzMDZlXHUzMDZmXHU3MTIxXHU1MmI5XHUzMDY3XHUzMDU5IChcdTY1ZTc6IHswfSwgXHU2NWIwOiB7MX0pCitqc3AuZXJyb3IucGFnZS5pbnZhbGlkLmlzdGhyZWFkc2FmZT1wYWdlXHU2MzA3XHU3OTNhXHU1YjUwOiBpc1RocmVhZFNhZmVcdTMwNmVcdTUwMjRcdTMwNGNcdTcxMjFcdTUyYjlcdTMwNjdcdTMwNTkKK2pzcC5lcnJvci5wYWdlLmNvbmZsaWN0LmluZm89cGFnZVx1NjMwN1x1NzkzYVx1NWI1MDogJ2luZm8nXHUzMDkyXHU3NTcwXHUzMDZhXHUzMDhiXHU1MDI0XHUzMDY3XHU4OTA3XHU2NTcwXHU1NmRlXHU2MzA3XHU1YjlhXHUzMDU5XHUzMDhiXHUzMDZlXHUzMDZmXHU3MTIxXHU1MmI5XHUzMDY3XHUzMDU5IChcdTY1ZTc6IHswfSwgXHU2NWIwOiB7MX0pCitqc3AuZXJyb3IucGFnZS5pbnZhbGlkLmluZm89cGFnZVx1NjMwN1x1NzkzYVx1NWI1MDogaW5mb1x1NWM1ZVx1NjAyN1x1MzA2ZVx1NTAyNFx1MzA0Y1x1NzEyMVx1NTJiOVx1MzA2N1x1MzA1OQoranNwLmVycm9yLnBhZ2UuY29uZmxpY3QuaXNlcnJvcnBhZ2U9cGFnZVx1NjMwN1x1NzkzYVx1NWI1MDogJ2lzRXJyb3JQYWdlJ1x1MzA5Mlx1NzU3MFx1MzA2YVx1MzA4Ylx1NTAyNFx1MzA2N1x1ODkwN1x1NjU3MFx1NTZkZVx1NjMwN1x1NWI5YVx1MzA1OVx1MzA4Ylx1MzA2ZVx1MzA2Zlx1NzEyMVx1NTJiOVx1MzA2N1x1MzA1OSAoXHU2NWU3OiB7MH0sIFx1NjViMDogezF9KQoranNwLmVycm9yLnBhZ2UuaW52YWxpZC5pc2Vycm9ycGFnZT1wYWdlXHU2MzA3XHU3OTNhXHU1YjUwOiBpc0Vycm9yUGFnZVx1NWM1ZVx1NjAyN1x1MzA2ZVx1NTAyNFx1MzA0Y1x1NzEyMVx1NTJiOVx1MzA2N1x1MzA1OQoranNwLmVycm9yLnBhZ2UuY29uZmxpY3QuZXJyb3JwYWdlPXBhZ2VcdTYzMDdcdTc5M2FcdTViNTA6ICdlcnJvclBhZ2UnXHUzMDkyXHU3NTcwXHUzMDZhXHUzMDhiXHU1MDI0XHUzMDY3XHU4OTA3XHU2NTcwXHU1NmRlXHU2MzA3XHU1YjlhXHUzMDU5XHUzMDhiXHUzMDZlXHUzMDZmXHU3MTIxXHU1MmI5XHUzMDY3XHUzMDU5IChcdTY1ZTc6IHswfSwgXHU2NWIwOiB7MX0pCitqc3AuZXJyb3IucGFnZS5jb25mbGljdC5sYW5ndWFnZT1wYWdlXHU2MzA3XHU3OTNhXHU1YjUwOiAnbGFuZ3VhZ2UnXHUzMDkyXHU3NTcwXHUzMDZhXHUzMDhiXHU1MDI0XHUzMDY3XHU4OTA3XHU2NTcwXHU1NmRlXHU2MzA3XHU1YjlhXHUzMDU5XHUzMDhiXHUzMDZlXHUzMDZmXHU3MTIxXHU1MmI5XHUzMDY3XHUzMDU5IChcdTY1ZTc6IHswfSwgXHU2NWIwOiB7MX0pCitqc3AuZXJyb3IudGFnLmNvbmZsaWN0Lmxhbmd1YWdlPXRhZ1x1NjMwN1x1NzkzYVx1NWI1MDogJ2xhbmd1YWdlJ1x1MzA5Mlx1NzU3MFx1MzA2YVx1MzA4Ylx1NTAyNFx1MzA2N1x1ODkwN1x1NjU3MFx1NTZkZVx1NjMwN1x1NWI5YVx1MzA1OVx1MzA4Ylx1MzA2ZVx1MzA2Zlx1NzEyMVx1NTJiOVx1MzA2N1x1MzA1OSAoXHU2NWU3OiB7MH0sIFx1NjViMDogezF9KQoranNwLmVycm9yLnBhZ2UubGFuZ3VhZ2Uubm9uamF2YT1wYWdlXHU2MzA3XHU3OTNhXHU1YjUwOiBcdTcxMjFcdTUyYjlcdTMwNmFsYW5ndWFnZVx1NWM1ZVx1NjAyN1x1MzA2N1x1MzA1OQoranNwLmVycm9yLnRhZy5sYW5ndWFnZS5ub25qYXZhPXRhZ1x1NjMwN1x1NzkzYVx1NWI1MDogXHU3MTIxXHU1MmI5XHUzMDZhbGFuZ3VhZ2VcdTVjNWVcdTYwMjdcdTMwNjdcdTMwNTkKK2pzcC5lcnJvci5wYWdlLmRlZmFmdGVydXNlLmxhbmd1YWdlPXBhZ2VcdTYzMDdcdTc5M2FcdTViNTA6IHNjcmlwdGxldFx1MzA2ZVx1NWY4Y1x1MzA2N2xhbmd1YWdlXHU1YzVlXHU2MDI3XHUzMDkyXHU2MzA3XHU1YjlhXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3IucGFnZS5ub21hcHBpbmcubGFuZ3VhZ2U9cGFnZVx1NjMwN1x1NzkzYVx1NWI1MCBsYW5ndWFnZVx1NWM1ZVx1NjAyN1x1MzA2ZVx1MzBkZVx1MzBjM1x1MzBkNFx1MzBmM1x1MzBiMFx1MzA0Y1x1NWI1OFx1NTcyOFx1MzA1N1x1MzA3ZVx1MzA1Ylx1MzA5MzoKK2pzcC5lcnJvci5wYWdlLmNvbmZsaWN0LmV4dGVuZHM9cGFnZVx1NjMwN1x1NzkzYVx1NWI1MDogJ2V4dGVuZHMnXHUzMDkyXHU3NTcwXHUzMDZhXHUzMDhiXHU1MDI0XHUzMDY3XHU4OTA3XHU2NTcwXHU1NmRlXHU2MzA3XHU1YjlhXHUzMDU5XHUzMDhiXHUzMDZlXHUzMDZmXHU3MTIxXHU1MmI5XHUzMDY3XHUzMDU5IChcdTY1ZTc6IHswfSwgXHU2NWIwOiB7MX0pCitqc3AuZXJyb3IucGFnZS5jb25mbGljdC5pc2VsaWdub3JlZD1wYWdlXHU2MzA3XHU3OTNhXHU1YjUwOiAnaXNFTElnbm9yZWQnXHUzMDkyXHU3NTcwXHUzMDZhXHUzMDhiXHU1MDI0XHUzMDY3XHU4OTA3XHU2NTcwXHU1NmRlXHU2MzA3XHU1YjlhXHUzMDU5XHUzMDhiXHUzMDZlXHUzMDZmXHU3MTIxXHU1MmI5XHUzMDY3XHUzMDU5IChcdTY1ZTc6IHswfSwgXHU2NWIwOiB7MX0pCitqc3AuZXJyb3IudGFnLmNvbmZsaWN0LmlzZWxpZ25vcmVkPXRhZ1x1NjMwN1x1NzkzYVx1NWI1MDogJ2lzRUxJZ25vcmVkJ1x1MzA5Mlx1NzU3MFx1MzA2YVx1MzA4Ylx1NTAyNFx1MzA2N1x1ODkwN1x1NjU3MFx1NTZkZVx1NjMwN1x1NWI5YVx1MzA1OVx1MzA4Ylx1MzA2ZVx1MzA2Zlx1NzEyMVx1NTJiOVx1MzA2N1x1MzA1OSAoXHU2NWU3OiB7MH0sIFx1NjViMDogezF9KQoranNwLmVycm9yLnBhZ2UuaW52YWxpZC5pc2VsaWdub3JlZD1wYWdlXHU2MzA3XHU3OTNhXHU1YjUwOiBpc0VMSWdub3JlZFx1MzA2Ylx1NzEyMVx1NTJiOVx1MzA2YVx1NTAyNFx1MzA0Y1x1NjMwN1x1NWI5YVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OQoranNwLmVycm9yLnRhZy5pbnZhbGlkLmlzZWxpZ25vcmVkPXRhZ1x1NjMwN1x1NzkzYVx1NWI1MDogaXNFTElnbm9yZWRcdTMwNmJcdTcxMjFcdTUyYjlcdTMwNmFcdTUwMjRcdTMwNGNcdTYzMDdcdTViOWFcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkKK2pzcC5lcnJvci5wYWdlLm11bHRpLnBhZ2VlbmNvZGluZz1wYWdlXHU2MzA3XHU3OTNhXHU1YjUwXHUzMDZmXHU4OTA3XHU2NTcwXHUzMDZlcGFnZWVuY29kaW5nXHUzMDkyXHU2MzAxXHUzMDY0XHUzMDUzXHUzMDY4XHUzMDZmXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3IudGFnLmNvbmZsaWN0LmF0dHI9VGFnXHU2MzA3XHU3OTNhXHU1YjUwOiBcdTVjNWVcdTYwMjdcInswfVwiXHUzMDkyXHU3NTcwXHUzMDZhXHUzMDhiXHU1MDI0XHUzMDY3XHU4OTA3XHU2NTcwXHU1NmRlXHU2MzA3XHU1YjlhXHUzMDU5XHUzMDhiXHUzMDZlXHUzMDZmXHU0ZTBkXHU2YjYzXHUzMDY3XHUzMDU5IChcdTY1ZTc6IHsxfSwgXHU2NWIwOiB7Mn0pCitqc3AuZXJyb3IudGFnLm11bHRpLnBhZ2VlbmNvZGluZz10YWdcdTYzMDdcdTc5M2FcdTViNTBcdTMwNmZcdTg5MDdcdTY1NzBcdTMwNmVwYWdlZW5jb2RpbmdcdTMwOTJcdTYzMDFcdTMwNjRcdTMwNTNcdTMwNjhcdTMwNmZcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC5lcnJvci5wYWdlLmJhZF9iX2FuZF9hX2NvbWJvPXBhZ2VcdTYzMDdcdTc5M2FcdTViNTA6IGJ1ZmZlcj1cIm5vbmVcIlx1MzA2OGF1dG9GbHVzaD1cImZhbHNlXCJcdTMwOTJcdTU0MGNcdTY2NDJcdTMwNmJcdTRmN2ZcdTc1MjhcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC5lcnJvci5ub3QuaW1wbC50YWdsaWI9XHU1MTg1XHU5MGU4XHUzMGE4XHUzMGU5XHUzMGZjOiBcdTMwYmZcdTMwYjBcdTYyZTFcdTVmMzVcdTViNTBcdTMwNmZcdTViOWZcdTg4YzVcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC5lcnJvci5pbmNsdWRlLm1pc3NpbmcuZmlsZT1cdTUzZDZcdTMwOGFcdThmYmNcdTMwODBcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTVmMTVcdTY1NzBcdTMwNGNcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC5lcnJvci5pbmNsdWRlLmJhZC5maWxlPWluY2x1ZGVcdTVjNWVcdTYwMjdcdTMwNmVcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTVmMTVcdTY1NzBcdTMwNGNcdTk1OTNcdTkwNTVcdTMwNjNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkKK2pzcC5lcnJvci5pbmNsdWRlLmV4Y2VwdGlvbj17MH0gXHUzMDkyXHU1M2Q2XHUzMDhhXHU4ZmJjXHUzMDgxXHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3Iuc3RyZWFtLmNsb3NlZD1cdTMwYjlcdTMwYzhcdTMwZWFcdTMwZmNcdTMwZTBcdTMwNGNcdTMwYWZcdTMwZWRcdTMwZmNcdTMwYmFcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkKK2pzcC5lcnJvci5pbnZhbGlkLmZvcndhcmQ9XHU3MTIxXHU1MmI5XHUzMDZhZm9yd2FyZFx1MzBiZlx1MzBiMFx1MzA2N1x1MzA1OQoranNwLmVycm9yLnVua25vd25FeGNlcHRpb249XHU1MWU2XHU3NDA2XHU0ZTBkXHU1M2VmXHU4MGZkXHUzMDZhXHUzMGE4XHUzMGU5XHUzMGZjXHUzMDY3XHUzMDU5ISBcdTMwNTNcdTMwNmVcdTMwODhcdTMwNDZcdTMwNmFcdTMwYThcdTMwZTlcdTMwZmNcdTMwOTJcdTMwODhcdTMwOGFcdThhNzNcdTdkMzBcdTMwNmJcdTU4MzFcdTU0NGFcdTMwNTlcdTMwOGJcdTMwYThcdTMwZTlcdTMwZmNcdTMwZGFcdTMwZmNcdTMwYjhcdTMwOTJcdTYzMDFcdTMwNjNcdTMwNWZcdTY1YjlcdTMwNGNcdTMwODhcdTMwNDRcdTMwNGJcdTMwODJcdTMwNTdcdTMwOGNcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC5lcnJvci5pbnZhbGlkLmRpcmVjdGl2ZT1cdTcxMjFcdTUyYjlcdTMwNmFcdTYzMDdcdTc5M2FcdTViNTBcdTMwNjdcdTMwNTkKK2pzcC5lcnJvci5kaXJlY3RpdmUuaXN0YWdmaWxlPXswfSBcdTYzMDdcdTc5M2FcdTViNTBcdTMwNmZcdTMwYmZcdTMwYjBcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTRlMmRcdTMwNjdcdTMwNmZcdTRmN2ZcdTc1MjhcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC5lcnJvci5kaXJlY3RpdmUuaXNub3R0YWdmaWxlPXswfSBcdTYzMDdcdTc5M2FcdTViNTBcdTMwNmZcdTMwYmZcdTMwYjBcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTRlMmRcdTMwNjdcdTMwNTdcdTMwNGJcdTRmN2ZcdTc1MjhcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC5lcnJvci50YWdmaWxlLnRsZC5uYW1lPVRMRFx1NGUyZFx1MzA2ZVx1MzBiZlx1MzBiMFx1NjMwN1x1NzkzYVx1NWI1MFx1MzA2ZVwidGFnLWZpbGVcIlx1ODk4MVx1N2QyMFx1MzA2ZVwibmFtZVwiXHUzMGJmXHUzMGIwXHUzMDZmIHsxfSBcdTMwNjdcdTMwNTlcdTMwNGNcdWZmMGNcIm5hbWVcIlx1NWM1ZVx1NjAyN1x1MzA2Zlx1NTAyNCB7MH0gXHUzMDkyXHU2MzAxXHUzMDYzXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5Citqc3AuZXJyb3IuYWN0aW9uLmlzdGFnZmlsZT17MH0gXHUzMGEyXHUzMGFmXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDZmXHUzMGJmXHUzMGIwXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHU0ZTJkXHUzMDY3XHU0ZjdmXHU3NTI4XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3IuYWN0aW9uLmlzbm90dGFnZmlsZT17MH0gXHUzMGEyXHUzMGFmXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDZmXHUzMGJmXHUzMGIwXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHU0ZTJkXHUzMDY3XHUzMDZlXHUzMDdmXHU0ZjdmXHU3NTI4XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3IudW50ZXJtaW5hdGVkPXswfSBcdTMwYmZcdTMwYjBcdTMwNGNcdTdkNDJcdTRlODZcdTMwNTdcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC5lcnJvci51c2ViZWFuLm5vdGluc2FtZWZpbGU9dXNlQmVhblx1MzBiZlx1MzBiMFx1MzA2Zlx1MzAwMVx1NTQwY1x1NGUwMFx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1NGUyZFx1MzA2N1x1OTU4Ylx1NTljYlx1MzA1N1x1MzAwMVx1N2Q0Mlx1NGU4Nlx1MzA1N1x1MzA2YVx1MzA1MVx1MzA4Y1x1MzA3MFx1MzA0NFx1MzA1MVx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLmxvYWRjbGFzcy50YWdoYW5kbGVyPVx1MzBiZlx1MzBiMCBcInsxfVwiIFx1MzA2Ylx1MzBiZlx1MzBiMFx1MzBjZlx1MzBmM1x1MzBjOVx1MzBlOVx1MzBhZlx1MzBlOVx1MzBiOSBcInswfVwiIFx1MzA5Mlx1MzBlZFx1MzBmY1x1MzBjOVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLnVuYWJsZS5jb21waWxlPUpTUFx1MzA2ZVx1MzBhZlx1MzBlOVx1MzBiOVx1MzA5Mlx1MzBiM1x1MzBmM1x1MzBkMVx1MzBhNFx1MzBlYlx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLnVuYWJsZS5sb2FkPUpTUFx1MzA2ZVx1MzBhZlx1MzBlOVx1MzBiOVx1MzA5Mlx1MzBlZFx1MzBmY1x1MzBjOVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLnVuYWJsZS5yZW5hbWU9XHUzMGFmXHUzMGU5XHUzMGI5XHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViIHswfSBcdTMwOTIgezF9IFx1MzA2Ylx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1NTQwZFx1MzA5Mlx1NTkwOVx1NjZmNFx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLm1hbmRhdG9yeS5hdHRyaWJ1dGU9ezB9OiBcdTVmYzVcdTk4MDhcdTVjNWVcdTYwMjcgezF9IFx1MzA0Y1x1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVuZ2luZS5pbmZvPUphc3BlciBKU1AgMi4wXHUzMGE4XHUzMGYzXHUzMGI4XHUzMGYzCitqc3AuZXJyb3IuaW52YWxpZC5leHByZXNzaW9uPSJ7MH0iIFx1MzA2Zlx1NzEyMVx1NTJiOVx1MzA2YVx1NWYwZlx1MzA5Mlx1NTQyYlx1MzA5M1x1MzA2N1x1MzA0NFx1MzA3ZVx1MzA1OTogezF9Citqc3AuZXJyb3IuaW52YWxpZC5hdHRyaWJ1dGU9ezB9XHUzMDZmXHU3MTIxXHU1MmI5XHUzMDZhXHU1YzVlXHU2MDI3XHUzMDkyXHU2MzAxXHUzMDYzXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5OiB7MX0KK2pzcC5lcnJvci51c2ViZWFuLmNsYXNzLm5vdGZvdW5kPVx1MzBhZlx1MzBlOVx1MzBiOTogezB9IFx1MzA0Y1x1ODk4Ylx1MzA2NFx1MzA0Ylx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLmZpbGUuY2Fubm90LnJlYWQ9XHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMDRjXHU4YWFkXHUzMDgxXHUzMDdlXHUzMDViXHUzMDkzOiB7MH0KK2pzcC5lcnJvci5maWxlLmFscmVhZHkucmVnaXN0ZXJlZD1cdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWIgezB9IFx1MzA2ZVx1NTE4ZFx1NWUzMFx1NzY4NFx1MzA2YVx1NTNkNlx1MzA4YVx1OGZiY1x1MzA3Zlx1MzA2N1x1MzA1OQoranNwLmVycm9yLmZpbGUubm90LnJlZ2lzdGVyZWQ9aW5jbHVkZVx1NWM1ZVx1NjAyN1x1NGUyZFx1MzA2ZVx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYiB7MH0gXHUzMDRjXHU1YjU4XHU1NzI4XHUzMDU3XHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3IucXVvdGVzLnVudGVybWluYXRlZD1cdTVmMTVcdTc1MjhcdTdiMjZcdTMwNGNcdTdkNDJcdTRlODZcdTMwNTdcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC5lcnJvci5hdHRyLnF1b3RlZD1cdTVjNWVcdTYwMjdcdTUwMjRcdTMwNmZcdTVmMTVcdTc1MjhcdTdiMjZcdTMwNjdcdTU2ZjJcdTMwOGZcdTMwNmFcdTMwNTFcdTMwOGNcdTMwNzBcdTMwNDRcdTMwNTFcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC5lcnJvci5hdHRyLm5vdmFsdWU9XHU1YzVlXHU2MDI3IHswfSBcdTMwNmJcdTMwNmZcdTUwMjRcdTMwNGNcdTYzMDdcdTViOWFcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC5lcnJvci50YWcuYXR0ci51bnRlcm1pbmF0ZWQ9XHUzMGJmXHUzMGIwXHUzMDZlXHU1YzVlXHU2MDI3XHUzMGVhXHUzMGI5XHUzMGM4XHUzMDRjXHU3ZDQyXHU0ZTg2XHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3IucGFyYW0ubm9uYW1lPVBBUkFNXHUzMGJmXHUzMGIwXHUzMDZibmFtZVx1NWM1ZVx1NjAyN1x1MzA0Y1x1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLnBhcmFtLm5vdmFsdWU9UEFSQU1cdTMwYmZcdTMwYjBcdTMwNmJ2YWx1ZVx1NWM1ZVx1NjAyN1x1MzA0Y1x1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLmJlYW5zLm51bGxiZWFuPW51bGxcdTMwYWFcdTMwZDZcdTMwYjhcdTMwYTdcdTMwYWZcdTMwYzhcdTMwNmJCZWFuXHU2NGNkXHU0ZjVjXHUzMDkyXHUzMDRhXHUzMDUzXHUzMDZhXHUzMDRhXHUzMDQ2XHUzMDY4XHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmCitqc3AuZXJyb3IuYmVhbnMubm9iZWFuaW5mbz1cdTMwYmZcdTMwYTRcdTMwZDcgJyd7MH0nJyBcdTMwNmVCZWFuXHUzMDZiQmVhbkluZm9cdTMwNGNcdTMwNmFcdTMwNDRcdTMwNmVcdTMwOTJcdTY5MWNcdTUxZmFcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWYsIFx1MzBhZlx1MzBlOVx1MzBiOVx1MzA0Y1x1NWI1OFx1NTcyOFx1MzA1N1x1MzA2YVx1MzA0NFx1MzA0Ylx1MzA4Mlx1MzA1N1x1MzA4Y1x1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLmJlYW5zLmludHJvc3BlY3Rpb249XHUzMGJmXHUzMGE0XHUzMGQ3ICcnezF9JycgXHUzMDZlQmVhblx1NGUyZFx1MzA2ZVx1NWM1ZVx1NjAyNyAnJ3swfScnIFx1MzA2ZXJlYWRcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwOTJcdTUxODVcdTc3MDFcdTRlMmRcdTMwNmJcdTRmOGJcdTU5MTZcdTMwNGNcdTc2N2FcdTc1MWZcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWY6XG57Mn0KK2pzcC5lcnJvci5iZWFucy5ub21ldGhvZD1cdTMwYmZcdTMwYTRcdTMwZDcgJyd7MX0nJyBcdTMwNmVCZWFuXHU0ZTJkXHUzMDZlXHU1YzVlXHU2MDI3ICcnezB9JycgXHUzMDkyXHU4YWFkXHUzMDdmXHU4ZmJjXHUzMDgwXHUzMGUxXHUzMGJkXHUzMGMzXHUzMGM5XHUzMDkyXHU3NjdhXHU4OThiXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDY3XHUzMDU3XHUzMDVmCitqc3AuZXJyb3IuYmVhbnMubm9tZXRob2Quc2V0cHJvcGVydHk9XHUzMGJmXHUzMGE0XHUzMGQ3Jyd7Mn0nJ1x1MzA2ZUJlYW5cdTMwNmVcdTMwYmZcdTMwYTRcdTMwZDcgJyd7MX0nJyBcdTMwNmVcdTVjNWVcdTYwMjcgJyd7MH0nJyBcdTMwOTJcdTY2ZjhcdTMwNGRcdThmYmNcdTMwODBcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwOTJcdTc2N2FcdTg5OGJcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwNjdcdTMwNTdcdTMwNWYKK2pzcC5lcnJvci5iZWFucy5ub3Byb3BlcnR5PVx1MzBiZlx1MzBhNFx1MzBkNyAnJ3sxfScnIFx1MzA2ZWJlYW5cdTRlMmRcdTMwNmVcdTVjNWVcdTYwMjcgJyd7MH0nJyBcdTMwNmVcdTYwYzVcdTU4MzFcdTMwOTJcdTc2N2FcdTg5OGJcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwNjdcdTMwNTdcdTMwNWYKK2pzcC5lcnJvci5iZWFucy5zZXRwcm9wZXJ0eS5ub2luZGV4c2V0PVx1MzBhNFx1MzBmM1x1MzBjN1x1MzBjM1x1MzBhZlx1MzBiOVx1NGVkOFx1MzA0ZFx1MzA2ZVx1NWM1ZVx1NjAyN1x1MzA5Mlx1NjMwN1x1NWI5YVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLmluY2x1ZGUudGFnPVx1NzEyMVx1NTJiOVx1MzA2YWpzcDppbmNsdWRlXHUzMGJmXHUzMGIwXHUzMDY3XHUzMDU5Citqc3AuZXJyb3IuaW5jbHVkZS5ub2ZsdXNoPWpzcDppbmNsdWRlXHUzMGJmXHUzMGIwXHUzMDZiIFwiZmx1c2g9dHJ1ZVwiIFx1MzA5Mlx1NWI5YVx1N2ZhOVx1MzA1N1x1MzA2YVx1MzA1MVx1MzA4Y1x1MzA3MFx1MzA0NFx1MzA1MVx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLmluY2x1ZGUuYmFkZmx1c2g9anNwOmluY2x1ZGUgcGFnZT1cIi4uLlwiIGZsdXNoPVwidHJ1ZVwiIFx1MzA2Zlx1MzAwMUpTUCAxLjBcdTMwNjdcdTMwNmVcdTMwN2ZcdTY3MDlcdTUyYjlcdTMwNmFcdTdkNDRcdTMwN2ZcdTU0MDhcdTMwOGZcdTMwNWJcdTMwNjdcdTMwNTkKK2pzcC5lcnJvci5hdHRlbXB0X3RvX2NsZWFyX2ZsdXNoZWRfYnVmZmVyPVx1MzBhOFx1MzBlOVx1MzBmYzogXHU2NWUyXHUzMDZiXHUzMGQ1XHUzMGU5XHUzMGMzXHUzMGI3XHUzMGU1XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDhiXHUzMGQwXHUzMGMzXHUzMGQ1XHUzMGExXHUzMDkyXHUzMGFmXHUzMGVhXHUzMGEyXHUzMDU3XHUzMDg4XHUzMDQ2XHUzMDY4XHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmCitqc3AuZXJyb3Iub3ZlcmZsb3c9XHUzMGE4XHUzMGU5XHUzMGZjOiBKU1BcdTMwZDBcdTMwYzNcdTMwZDVcdTMwYTFcdTMwNGNcdTMwYWFcdTMwZmNcdTMwZDBcdTMwZmNcdTMwZDVcdTMwZWRcdTMwZmNcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWYKK2pzcC5lcnJvci5wYXJhbWV4cGVjdGVkPVwibmFtZVwiXHU1YzVlXHU2MDI3IFx1MzA2OCBcInZhbHVlXCIgXHU1YzVlXHU2MDI3XHUzMDkyXHU2MzAxXHUzMDY0IFwianNwOnBhcmFtXCIgXHU2YTE5XHU2ZTk2XHUzMGEyXHUzMGFmXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDRjXHU1ZmM1XHU4OTgxXHUzMDY3XHUzMDU5Citqc3AuZXJyb3IucGFyYW0uaW52YWxpZFVzZT1qc3A6aW5jbHVkZVx1MzAwMWpzcDpmb3J3YXJkXHUzMDAxXHU1M2M4XHUzMDZmanNwOnBhcmFtc1x1ODk4MVx1N2QyMFx1MzA2ZVx1NTkxNlx1MzA2N2pzcDpwYXJhbVx1MzBhMlx1MzBhZlx1MzBiN1x1MzBlN1x1MzBmM1x1MzA5Mlx1NGY3Zlx1NzUyOFx1MzA1N1x1MzA2Nlx1MzA2Zlx1MzA0NFx1MzA1MVx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLnBhcmFtcy5pbnZhbGlkVXNlPWpzcDpwYXJhbXNcdTMwNmZqc3A6cGx1Z2luXHUzMDZlXHU3NmY0XHU2M2E1XHUzMDZlXHU1YjUwXHU0ZjliXHUzMDY3XHUzMDZhXHUzMDUxXHUzMDhjXHUzMDcwXHUzMDQ0XHUzMDUxXHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3IuZmFsbGJhY2suaW52YWxpZFVzZT1qc3A6ZmFsbGJhY2tcdTMwNmZqc3A6cGx1Z2luXHUzMDZlXHU3NmY0XHU2M2E1XHUzMDZlXHU1YjUwXHU0ZjliXHUzMDY3XHUzMDZhXHUzMDUxXHUzMDhjXHUzMDcwXHUzMDQ0XHUzMDUxXHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3IubmFtZWRBdHRyaWJ1dGUuaW52YWxpZFVzZT1qc3A6YXR0cmlidXRlXHUzMDZmXHU2YTE5XHU2ZTk2XHU1M2M4XHUzMDZmXHUzMGFiXHUzMGI5XHUzMGJmXHUzMGUwXHUzMGEyXHUzMGFmXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDZlXHU1MjZmXHU4OTgxXHU3ZDIwXHUzMDY3XHUzMDZhXHUzMDUxXHUzMDhjXHUzMDcwXHUzMDQ0XHUzMDUxXHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3IuanNwYm9keS5pbnZhbGlkVXNlPWpzcDpib2R5XHUzMDZmXHU2YTE5XHU2ZTk2XHU1M2M4XHUzMDZmXHUzMGFiXHUzMGI5XHUzMGJmXHUzMGUwXHUzMGEyXHUzMGFmXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDZlXHU1MjZmXHU4OTgxXHU3ZDIwXHUzMDY3XHUzMDZhXHUzMDUxXHUzMDhjXHUzMDcwXHUzMDQ0XHUzMDUxXHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3IuY2xvc2VpbmRpdmlkdWFscGFyYW09cGFyYW1cdTMwYmZcdTMwYjBcdTMwNmYgXCIvPlwiIFx1MzA2N1x1OTU4OVx1MzA1OFx1MzA2YVx1MzA1MVx1MzA4Y1x1MzA3MFx1MzA0NFx1MzA1MVx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLmNsb3NlcGFyYW1zPXBhcmFtXHUzMGJmXHUzMGIwXHUzMDZmL3BhcmFtc1x1MzA2N1x1OTU4OVx1MzA1OFx1MzA2YVx1MzA1MVx1MzA4Y1x1MzA3MFx1MzA0NFx1MzA1MVx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLnBhcmFtcy5lbXB0eUJvZHk9anNwOnBhcmFtc1x1MzA2Zlx1NWMxMVx1MzA2YVx1MzA0Zlx1MzA2OFx1MzA4Mlx1NGUwMFx1MzA2NFx1MzA2ZVx1MzBjZFx1MzBiOVx1MzBjOFx1MzA1N1x1MzA1ZmpzcDpwYXJhbVx1MzA5Mlx1NTQyYlx1MzA3ZVx1MzA2ZFx1MzA3MFx1MzA0NFx1MzA1MVx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLnBhcmFtcy5pbGxlZ2FsQ2hpbGQ9anNwOnBhcmFtc1x1MzA2ZmpzcDpwYXJhbVx1NGVlNVx1NTkxNlx1MzA2ZVx1MzBjZFx1MzBiOVx1MzBjOFx1MzA1N1x1MzA1Zlx1ODk4MVx1N2QyMFx1MzA5Mlx1NTQyYlx1MzA5M1x1MzA2N1x1MzA2Zlx1MzA0NFx1MzA1MVx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLnBsdWdpbi5ub3R5cGU9anNwOnBsdWdpblx1MzA2N3R5cGVcdTVjNWVcdTYwMjdcdTMwNGNcdTViYTNcdThhMDBcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC5lcnJvci5wbHVnaW4uYmFkdHlwZT1qc3A6cGx1Z2luXHUzMDZlICd0eXBlJ1x1NWM1ZVx1NjAyN1x1MzA2ZVx1NTAyNFx1MzA0Y1x1NzEyMVx1NTJiOVx1MzA2N1x1MzA1OTogJ2JlYW4nXHU1M2M4XHUzMDZmJ2FwcGxldCdcdTMwNjdcdTMwNmFcdTMwNTFcdTMwOGNcdTMwNzBcdTMwNDRcdTMwNTFcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC5lcnJvci5wbHVnaW4ubm9jb2RlPWpzcDpwbHVnaW5cdTMwNjdjb2RlXHU1YzVlXHU2MDI3XHUzMDRjXHU1YmEzXHU4YTAwXHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3IuaXNlX29uX2NsZWFyPVx1MzBkMFx1MzBjM1x1MzBkNVx1MzBhMVx1MzBiNVx1MzBhNFx1MzBiYVx1MzA0YzBcdTMwNmVcdTY2NDJcdTMwNmJjbGVhcigpXHUzMDkyXHU1YjlmXHU4ODRjXHUzMDU3XHUzMDY2XHUzMDgyXHU3MTIxXHU1MmI5XHUzMDY3XHUzMDU5Citqc3AuZXJyb3Iuc2V0cHJvcGVydHkuYmVhbk5vdEZvdW5kPXNldFByb3BlcnR5OiBCZWFuIHswfSBcdTMwNGNcdTg5OGJcdTMwNjRcdTMwNGJcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC5lcnJvci5nZXRwcm9wZXJ0eS5iZWFuTm90Rm91bmQ9Z2V0UHJvcGVydHk6IEJlYW4gezB9IFx1MzA0Y1x1ODk4Ylx1MzA2NFx1MzA0Ylx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLnNldHByb3BlcnR5LkNsYXNzTm90Rm91bmQ9c2V0UHJvcGVydHk6IFx1MzBhZlx1MzBlOVx1MzBiOSB7MH0gXHUzMDRjXHU4OThiXHUzMDY0XHUzMDRiXHUzMDhhXHUzMDdlXHUzMDViXHUzMDkzCisjIHR5cG8gPworI2pzcC5lcnJvci5zZXRwcm9wZXJ0eS5pbnZhbGlkU2F5bnRheD1zZXRQcm9wZXJ0eTogcHJvcGVydHk9Klx1MzA2ZVx1NTgzNFx1NTQwOFx1MzA2Zm51bGxcdTMwNjdcdTMwNmFcdTMwNDRcdTUwMjRcdTMwOTJcdTYzMDdcdTViOWFcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC5lcnJvci5zZXRwcm9wZXJ0eS5pbnZhbGlkU3ludGF4PXNldFByb3BlcnR5OiBwcm9wZXJ0eT0qXHUzMDZlXHU1ODM0XHU1NDA4XHUzMDZmbnVsbFx1MzA2N1x1MzA2YVx1MzA0NFx1NTAyNFx1MzA5Mlx1NjMwN1x1NWI5YVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLnNldHByb3BlcnR5LmJlYW5JbmZvTm90Rm91bmQ9c2V0cHJvcGVydHk6IEJlYW4gezB9IFx1MzA2ZWJlYW5JbmZvXHUzMDRjXHU4OThiXHUzMDY0XHUzMDRiXHUzMDhhXHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3Iuc2V0cHJvcGVydHkucGFyYW1PclZhbHVlPXNldFByb3BlcnR5OiBwYXJhbVx1NWM1ZVx1NjAyN1x1MzA0YnZhbHVlXHU1YzVlXHU2MDI3XHUzMDZlXHUzMDY5XHUzMDYxXHUzMDg5XHUzMDRiXHU0ZTAwXHUzMDY0XHUzMDYwXHUzMDUxXHUzMDkyXHU2MzA3XHU1YjlhXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDU5Citqc3AuZXJyb3Iuc2V0cHJvcGVydHkuYXJyYXlWYWw9c2V0UHJvcGVydHk6IFx1NWM1ZVx1NjAyN1x1OTE0ZFx1NTIxNyB7MH0gXHUzMDkyXHU2NTg3XHU1YjU3XHU1MjE3XHU1YjlhXHU2NTcwXHU1MDI0XHUzMDY3XHU2MzA3XHU1YjlhXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzCitqc3Aud2FybmluZy5rZWVwZ2VuPVx1OGI2Nlx1NTQ0YTogaW5pdFBhcmFtIGtlZXBnZW5lcmF0ZWRcdTMwNmVcdTUwMjRcdTMwNGNcdTcxMjFcdTUyYjlcdTMwNjdcdTMwNTlcdTMwMDIgXHUzMGM3XHUzMGQ1XHUzMGE5XHUzMGViXHUzMGM4XHU1MDI0IFwiZmFsc2VcIiBcdTMwOTJcdTRmN2ZcdTc1MjhcdTMwNTdcdTMwN2VcdTMwNTkKK2pzcC53YXJuaW5nLnhwb3dlcmVkQnk9XHU4YjY2XHU1NDRhOiBJbnZhbGlkIHZhbHVlIGZvciB0aGUgaW5pdFBhcmFtIHhwb3dlcmVkQnlcdTMwNmVcdTUwMjRcdTMwNGNcdTcxMjFcdTUyYjlcdTMwNjdcdTMwNTlcdTMwMDJcdTMwYzdcdTMwZDVcdTMwYTlcdTMwZWJcdTMwYzhcdTUwMjQgXCJmYWxzZVwiIFx1MzA5Mlx1NGY3Zlx1NzUyOFx1MzA1N1x1MzA3ZVx1MzA1OQoranNwLndhcm5pbmcuZW5hYmxlUG9vbGluZz1cdThiNjZcdTU0NGE6IGluaXRQYXJhbSBlbmFibGVQb29saW5nXHUzMDRjXHU3MTIxXHU1MmI5XHUzMDZhXHU1MDI0XHUzMDY3XHUzMDU5XHUzMDAyXCJ0cnVlXCJcdTMwNmVcdTMwYzdcdTMwZDVcdTMwYTlcdTMwZWJcdTMwYzhcdTUwMjRcdTMwOTJcdTRmN2ZcdTc1MjhcdTMwNTdcdTMwN2VcdTMwNTkKK2pzcC53YXJuaW5nLmludmFsaWRUYWdQb29sU2l6ZT1cdThiNjZcdTU0NGE6IHRhZ1Bvb2xTaXplXHUzMDZlXHU1MjFkXHU2NzFmXHUzMGQxXHUzMGU5XHUzMGUxXHUzMGZjXHUzMGJmXHUzMDRjXHU3MTIxXHU1MmI5XHUzMDZhXHU1MDI0XHUzMDY3XHUzMDU5XHUzMDAyezB9XHUzMDZlXHUzMGM3XHUzMGQ1XHUzMGE5XHUzMGViXHUzMGM4XHUzMGI1XHUzMGE0XHUzMGJhXHUzMDkyXHU0ZjdmXHU3NTI4XHUzMDU3XHUzMDdlXHUzMDU5Citqc3Aud2FybmluZy5tYXBwZWRGaWxlPVx1OGI2Nlx1NTQ0YTogaW5pdFBhcmFtIG1hcHBlZEZpbGVcdTMwNmVcdTUwMjRcdTMwNGNcdTcxMjFcdTUyYjlcdTMwNjdcdTMwNTlcdTMwMDJcdTMwYzdcdTMwZDVcdTMwYTlcdTMwZWJcdTMwYzhcdTUwMjQgXCJmYWxzZVwiIFx1MzA5Mlx1NGY3Zlx1NzUyOFx1MzA1N1x1MzA3ZVx1MzA1OQoranNwLndhcm5pbmcuc2VuZEVyclRvQ2xpZW50PVx1OGI2Nlx1NTQ0YTogaW5pdFBhcmFtIHNlbmRFcnJUb0NsaWVudFx1MzA2ZVx1NTAyNFx1MzA0Y1x1NzEyMVx1NTJiOVx1MzA2N1x1MzA1OVx1MzAwMlx1MzBjN1x1MzBkNVx1MzBhOVx1MzBlYlx1MzBjOFx1NTAyNCBcImZhbHNlXCIgXHUzMDkyXHU0ZjdmXHU3NTI4XHUzMDU3XHUzMDdlXHUzMDU5Citqc3Aud2FybmluZy5jbGFzc0RlYnVnSW5mbz1cdThiNjZcdTU0NGE6IGluaXRQYXJhbSBjbGFzc0RlYnVnSW5mb1x1MzA2ZVx1NTAyNFx1MzA0Y1x1NzEyMVx1NTJiOVx1MzA2N1x1MzA1OVx1MzAwMlx1MzBjN1x1MzBkNVx1MzBhOVx1MzBlYlx1MzBjOFx1NTAyNCBcImZhbHNlXCJcdTMwOTJcdTRmN2ZcdTc1MjhcdTMwNTdcdTMwN2VcdTMwNTkKK2pzcC53YXJuaW5nLmNoZWNrSW50ZXJ2YWw9XHU4YjY2XHU1NDRhOiBpbml0UGFyYW0gY2hlY2tJbnRlcnZhbFx1MzA2ZVx1NTAyNFx1MzA0Y1x1NzEyMVx1NTJiOVx1MzA2N1x1MzA1OVx1MzAwMlwiMzAwXCJcdTc5ZDJcdTMwNmVcdTMwYzdcdTMwZDVcdTMwYTlcdTMwZWJcdTMwYzhcdTUwMjRcdTMwOTJcdTRmN2ZcdTc1MjhcdTMwNTdcdTMwN2VcdTMwNTkKK2pzcC53YXJuaW5nLmRldmVsb3BtZW50PVx1OGI2Nlx1NTQ0YTogaW5pdFBhcmFtIGRldmVsb3BtZW50XHUzMDZlXHU1MDI0XHUzMDRjXHU3MTIxXHU1MmI5XHUzMDY3XHUzMDU5XHUzMDAyXCJ0cnVlXCJcdTMwNmVcdTMwYzdcdTMwZDVcdTMwYTlcdTMwZWJcdTMwYzhcdTUwMjRcdTMwOTJcdTRmN2ZcdTc1MjhcdTMwNTdcdTMwN2VcdTMwNTkKK2pzcC53YXJuaW5nLmZvcms9XHU4YjY2XHU1NDRhOiBpbml0UGFyYW0gZm9ya1x1MzA2ZVx1NTAyNFx1MzA0Y1x1NzEyMVx1NTJiOVx1MzA2N1x1MzA1OVx1MzAwMlwidHJ1ZVwiXHUzMDZlXHUzMGM3XHUzMGQ1XHUzMGE5XHUzMGViXHUzMGM4XHU1MDI0XHUzMDkyXHU0ZjdmXHU3NTI4XHUzMDU3XHUzMDdlXHUzMDU5Citqc3Aud2FybmluZy5yZWxvYWRpbmc9XHU4YjY2XHU1NDRhOiBpbml0UGFyYW0gcmVsb2FkaW5nXHUzMDZlXHU1MDI0XHUzMDRjXHU3MTIxXHU1MmI5XHUzMDY3XHUzMDU5XHUzMDAyXCJ0cnVlXCJcdTMwNmVcdTMwYzdcdTMwZDVcdTMwYTlcdTMwZWJcdTMwYzhcdTUwMjRcdTMwOTJcdTRmN2ZcdTc1MjhcdTMwNTdcdTMwN2VcdTMwNTkKK2pzcC53YXJuaW5nLmR1bXBTbWFwPVx1OGI2Nlx1NTQ0YTogaW5pdFBhcmFtIGR1bXBTbWFwXHUzMDZlXHU1MDI0XHUzMDRjXHU3MTIxXHU1MmI5XHUzMDY3XHUzMDU5XHUzMDAyXCJmYWxzZVwiXHUzMDZlXHUzMGM3XHUzMGQ1XHUzMGE5XHUzMGViXHUzMGM4XHU1MDI0XHUzMDkyXHU0ZjdmXHU3NTI4XHUzMDU3XHUzMDdlXHUzMDU5Citqc3Aud2FybmluZy5nZW5jaGFyYXJyYXk9XHU4YjY2XHU1NDRhOiBpbml0UGFyYW0gZ2VuU3RyQXNDaGFyQXJyYXlcdTMwNmVcdTUwMjRcdTMwNGNcdTcxMjFcdTUyYjlcdTMwNjdcdTMwNTlcdTMwMDJcImZhbHNlXCJcdTMwNmVcdTMwYzdcdTMwZDVcdTMwYTlcdTMwZWJcdTMwYzhcdTUwMjRcdTMwOTJcdTRmN2ZcdTc1MjhcdTMwNTdcdTMwN2VcdTMwNTkKK2pzcC53YXJuaW5nLnN1cHByZXNzU21hcD1cdThiNjZcdTU0NGE6IGluaXRQYXJhbSBzdXBwcmVzc1NtYXBcdTMwNmVcdTUwMjRcdTMwNGNcdTcxMjFcdTUyYjlcdTMwNjdcdTMwNTlcdTMwMDJcdTMwYzdcdTMwZDVcdTMwYTlcdTMwZWJcdTMwYzhcdTUwMjQgXCJmYWxzZVwiIFx1MzA5Mlx1NGY3Zlx1NzUyOFx1MzA1N1x1MzA3ZVx1MzA1OQoranNwLmVycm9yLmJhZHRhZ2xpYj1cdTMwYmZcdTMwYjBcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWEgezB9IFx1MzA5Mlx1MzBhYVx1MzBmY1x1MzBkN1x1MzBmM1x1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5MzogezF9Citqc3AuZXJyb3IuYmFkR2V0UmVhZGVyPVx1MzBiOVx1MzBjOFx1MzBlYVx1MzBmY1x1MzBlMFx1MzA0Y1x1MzBkMFx1MzBjM1x1MzBkNVx1MzBhMVx1MzBlYVx1MzBmM1x1MzBiMFx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA2YVx1MzA0NFx1NTgzNFx1NTQwOFx1MzA2Ylx1MzA2Zlx1MzAwMVJlYWRlclx1MzA5Mlx1NGY1Y1x1NjIxMFx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLndhcm5pbmcudW5rbm93bi5lbGVtZW50LmluLnRhZ2xpYj10YWdsaWJcdTRlMmRcdTMwNmJcdTY3MmFcdTc3ZTVcdTMwNmVcdTg5ODFcdTdkMjAgKHswfSkgXHUzMDRjXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDU5Citqc3Aud2FybmluZy51bmtub3duLmVsZW1lbnQuaW4udGFnPXRhZ1x1NGUyZFx1MzA2Ylx1NjcyYVx1NzdlNVx1MzA2ZVx1ODk4MVx1N2QyMCAoezB9KSBcdTMwNGNcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNTkKK2pzcC53YXJuaW5nLnVua25vd24uZWxlbWVudC5pbi5hdHRyaWJ1dGU9YXR0cmlidXRlXHU0ZTJkXHUzMDZiXHU2NzJhXHU3N2U1XHUzMDZlXHU4OTgxXHU3ZDIwICh7MH0pIFx1MzA0Y1x1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1OQoranNwLndhcm5pbmcudW5rbm93bi5lbGVtZW50LmluLnZhcmlhYmxlPXZhcmlhYmxlXHU0ZTJkXHUzMDZiXHU2NzJhXHU3N2U1XHUzMDZlXHU4OTgxXHU3ZDIwICh7MH0pIFx1MzA0Y1x1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1OQoranNwLndhcm5pbmcudW5rbm93bi5lbGVtZW50LmluLnZhbGlkYXRvcj12YWxpZGF0b3JcdTRlMmRcdTMwNmJcdTY3MmFcdTc3ZTVcdTMwNmVcdTg5ODFcdTdkMjAgKHswfSkgXHUzMDRjXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDU5Citqc3Aud2FybmluZy51bmtub3duLmVsZW1lbnQuaW4uaW5pdFBhcmFtPXZhbGlkYXRvclx1MzA2ZWluaXQtcGFyYW1cdTRlMmRcdTMwNmJcdTY3MmFcdTc3ZTVcdTMwNmVcdTg5ODFcdTdkMjAgKHswfSkgXHUzMDRjXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDU5Citqc3Aud2FybmluZy51bmtub3duLmVsZW1lbnQuaW4uZnVuY3Rpb249ZnVuY3Rpb25cdTRlMmRcdTMwNmJcdTY3MmFcdTc3ZTVcdTMwNmVcdTg5ODFcdTdkMjAgKHswfSkgXHUzMDRjXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDU5Citqc3AuZXJyb3IubW9yZS50aGFuLm9uZS50YWdsaWI9VExEXHUzMDZlXHU0ZTJkXHUzMDZiXHU4OTA3XHU2NTcwXHUzMDZldGFnbGliXHUzMDRjXHU1YjU4XHU1NzI4XHUzMDU3XHUzMDdlXHUzMDU5OiB7MH0KK2pzcC5lcnJvci50ZWljbGFzcy5pbnN0YW50aWF0aW9uPVRhZ0V4dHJhSW5mbyBjbGFzc1x1MzA2ZVx1MzBlZFx1MzBmY1x1MzBjOVx1NTNjOFx1MzA2Zlx1MzBhNFx1MzBmM1x1MzBiOVx1MzBiZlx1MzBmM1x1MzBiOVx1NTMxNlx1MzA2Ylx1NTkzMVx1NjU1N1x1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1ZjogezB9Citqc3AuZXJyb3Iubm9uX251bGxfdGVpX2FuZF92YXJfc3ViZWxlbXM9XHUzMGJmXHUzMGIwIHswfSBcdTMwNmZcdTRlMDBcdTMwNjRcdTRlZTVcdTRlMGFcdTMwNmV2YXJpYWJsZVx1NTI2Zlx1ODk4MVx1N2QyMFx1MzA2OFx1NGUwMFx1MzA2NFx1NGVlNVx1NGUwYVx1MzA2ZVZhcmlhYmxlSW5mb1x1MzA5Mlx1OGZkNFx1MzA1OVRhZ0V4dHJhSW5mb1x1MzBhZlx1MzBlOVx1MzBiOVx1MzA5Mlx1NjMwMVx1MzA2M1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OQoranNwLmVycm9yLnBhcnNlLmVycm9yLmluLlRMRD1cdTMwYmZcdTMwYjBcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdThhMThcdThmZjBcdTViNTAgezB9IFx1NGUyZFx1MzA2ZVx1ODllM1x1Njc5MFx1MzBhOFx1MzBlOVx1MzBmY1x1MzA2N1x1MzA1OQoranNwLmVycm9yLnVuYWJsZS50by5vcGVuLlRMRD1cdTMwYmZcdTMwYjBcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdThhMThcdThmZjBcdTViNTAgezB9IFx1MzA5Mlx1MzBhYVx1MzBmY1x1MzBkN1x1MzBmM1x1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmJ1ZmZlci5zaXplLnplcm89XHUzMGQwXHUzMGMzXHUzMGQ1XHUzMGExXHUzMGI1XHUzMGE0XHUzMGJhXHUzMDRjMFx1NGVlNVx1NGUwYlx1MzA2N1x1MzA1OQoranNwLmVycm9yLmZpbGUubm90LmZvdW5kPUpTUCBcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWIgXCJ7MH1cIiBcdTMwNGNcdTg5OGJcdTMwNjRcdTMwNGJcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC5tZXNzYWdlLmNvcHlpbmd1cmk9ezB9IFx1MzA5MiB7MX0gXHUzMDZiXHUzMGIzXHUzMGQ0XHUzMGZjXHUzMDU3XHUzMDdlXHUzMDU5Citqc3AubWVzc2FnZS5odG1sY29tbWVudD1cblx1NTI0YVx1OTY2NFx1MzA1OVx1MzA4Ylx1MzBiM1x1MzBlMVx1MzBmM1x1MzBjODogXHR7MH0KK2pzcC5tZXNzYWdlLmhhbmRsaW5nX2RpcmVjdGl2ZT1cblx1NTFlNlx1NzQwNlx1MzA1OVx1MzA4Ylx1NjMwN1x1NzkzYVx1NWI1MDogezB9XHR7MX0KK2pzcC5tZXNzYWdlLmhhbmRsaW5nX3BsdWdpbj1cblBsdWdpbjogezB9Citqc3AubWVzc2FnZS5wYWNrYWdlX25hbWVfaXM9XHUzMGQxXHUzMGMzXHUzMGIxXHUzMGZjXHUzMGI4XHU1NDBkOiB7MH0KK2pzcC5tZXNzYWdlLmNsYXNzX25hbWVfaXM9XHUzMGFmXHUzMGU5XHUzMGI5XHU1NDBkOiB7MH0KK2pzcC5tZXNzYWdlLmphdmFfZmlsZV9uYW1lX2lzPUphdmFcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTU0MGQ6IHswfQoranNwLm1lc3NhZ2UuY2xhc3NfZmlsZV9uYW1lX2lzPVx1MzBhZlx1MzBlOVx1MzBiOVx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1NTQwZDogezB9Citqc3AubWVzc2FnZS5hY2NlcHRlZD17MX0gXHUzMDY3IHswfSBcdTMwOTJcdTUzZDdcdTMwNTFcdTUxNjVcdTMwOGNcdTMwN2VcdTMwNTkKK2pzcC5tZXNzYWdlLmFkZGluZ19qYXI9amFyIHswfSBcdTMwOTJcdTMwYWZcdTMwZTlcdTMwYjlcdTMwZDFcdTMwYjlcdTMwNmJcdThmZmRcdTUyYTBcdTMwNTdcdTMwN2VcdTMwNTkKK2pzcC5tZXNzYWdlLmNvbXBpbGluZ193aXRoPXswfSBcdTMwOTJcdTMwYjNcdTMwZjNcdTMwZDFcdTMwYTRcdTMwZWJcdTRlMmRcdTMwNjdcdTMwNTkKK2pzcC5tZXNzYWdlLnRlbXBsYXRlX3RleHQ9XHUzMGM2XHUzMGYzXHUzMGQ3XHUzMGVjXHUzMGZjXHUzMGM4XHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4Citqc3AuZXJyb3IubWlzc2luZ19hdHRyaWJ1dGU9VExEXHU1M2M4XHUzMDZmXHUzMGJmXHUzMGIwXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMDZiXHUzMDg4XHUzMDhiXHUzMDY4XHUzMDAxXHU1YzVlXHU2MDI3IHswfSBcdTMwNmZcdTMwYmZcdTMwYjAgezF9IFx1MzA2Ylx1MzA2Zlx1NWZjNVx1OTgwOFx1MzA2N1x1MzA1OQoranNwLmVycm9yLmJhZF9hdHRyaWJ1dGU9VExEXHUzMDZiXHUzMDg4XHUzMDhiXHUzMDY4XHUzMDAxXHUzMGJmXHUzMGIwIHsxfSBcdTMwNmVcdTVjNWVcdTYwMjcgezB9IFx1MzA2Zlx1NzEyMVx1NTJiOVx1MzA2N1x1MzA1OQoranNwLmVycm9yLnRsZC51bmFibGVfdG9fcmVhZD1KQVJcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWIgXCJ7MH1cIiBcdTMwNGJcdTMwODlUTEQgXCJ7MX1cIiBcdTMwOTJcdThhYWRcdTMwN2ZcdThmYmNcdTMwODFcdTMwN2VcdTMwNWJcdTMwOTM6IHsyfQoranNwLmVycm9yLnRsZC51bmFibGVfdG9fZ2V0X2phcj1UTERcdTMwOTJcdTU0MmJcdTMwODBKQVJcdTMwZWFcdTMwYmRcdTMwZmNcdTMwYjkgXCJ7MH1cIiBcdTMwOTJcdTUzZDZcdTVmOTdcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMgOiB7MX0KK2pzcC5lcnJvci50bGQubWlzc2luZ19qYXI9VExEXHUzMDkyXHU1NDJiXHUzMDgwSkFSXHUzMGVhXHUzMGJkXHUzMGZjXHUzMGI5IFwiezB9XCIgXHUzMDRjXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3Iud2VieG1sX25vdF9mb3VuZD13ZWIueG1sXHUzMDRjXHU4OThiXHUzMDY0XHUzMDRiXHUzMDhhXHUzMDdlXHUzMDViXHUzMDkzCitqc3AuY21kX2xpbmUudXNhZ2U9XHU0ZjdmXHU3NTI4XHU2Y2Q1OiAgWy1kZCA8XHU1MWZhXHU1MjliXHUzMGM3XHUzMGEzXHUzMGVjXHUzMGFmXHUzMGM4XHUzMGVhXHUzMDZlXHUzMGQxXHUzMGI5Pl0gWy1rZWVwZ2VuZXJhdGVkXSBcCis8LmpzcFx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1N2ZhND4KK2pzcC5tZXNzYWdlLmNwX2lzPVx1MzBhZlx1MzBlOVx1MzBiOVx1MzBkMVx1MzBiOSB7MH0gXHUzMDZmIHsxfSBcdTMwNjdcdTMwNTkKK2pzcC5lcnJvci51bmFibGUudG9fbG9hZF90YWdoYW5kbGVyX2NsYXNzPVx1MzBiZlx1MzBiMFx1MzBjZlx1MzBmM1x1MzBjOVx1MzBlOVx1MzBhZlx1MzBlOVx1MzBiOSB7MH0gXHUzMDkyIHsxfSBcdTMwNmVcdTMwNWZcdTMwODFcdTMwNmJcdTMwZWRcdTMwZmNcdTMwYzlcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC5lcnJvci51bmFibGUudG9fZmluZF9tZXRob2Q9XHU1YzVlXHU2MDI3IHswfSBcdTMwNmVzZXR0ZXJcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwNGNcdTg5OGJcdTMwNjRcdTMwNGJcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC5lcnJvci51bmFibGUudG9fY29udmVydF9zdHJpbmc9XHU1YzVlXHU2MDI3IHsxfVx1MzA2ZVx1NjU4N1x1NWI1N1x1NTIxN1x1MzA5MiB7MH1cdTMwNmJcdTU5MDlcdTYzZGJcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC5lcnJvci51bmFibGUudG9faW50cm9zcGVjdD1cdTMwYmZcdTMwYjBcdTMwY2ZcdTMwZjNcdTMwYzlcdTMwZTlcdTMwYWZcdTMwZTlcdTMwYjkgezB9IFx1MzA5MiB7MX0gXHUzMDZlXHUzMDVmXHUzMDgxXHUzMDZiXHU1MTg1XHU3NzAxXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3IuYmFkX3RhZz1cdTMwZDdcdTMwZWNcdTMwZDVcdTMwYTNcdTMwYzNcdTMwYWZcdTMwYjkgezF9XHUzMDY3XHUzMGE0XHUzMGYzXHUzMGRkXHUzMGZjXHUzMGM4XHUzMDU1XHUzMDhjXHUzMDVmXHUzMGJmXHUzMGIwXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhXHUzMDZiXHUzMDZmXHUzMDAxXHUzMGJmXHUzMGIwIHswfSBcdTMwNmZcdTViNThcdTU3MjhcdTMwNTdcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC5lcnJvci54bWwuYmFkX3RhZz1VUkkgXCJ7MX1cIiBcdTMwNmJcdTk1YTJcdTkwMjNcdTMwNjVcdTMwNTFcdTMwODlcdTMwOGNcdTMwNWZcdTMwYmZcdTMwYjBcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwNmVcdTRlMmRcdTMwNmJcdTMwNmZcdTMwYmZcdTMwYjAgXCJ7MH1cIiBcdTMwNmZcdTViOWFcdTdmYTlcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC5lcnJvci5iYWRfc3RyaW5nX0NoYXJhY3Rlcj1cdTk1NzdcdTMwNTUwXHUzMDZlXHU5MTRkXHU1MjE3XHUzMDRiXHUzMDg5XHUzMDZmXHU2NTg3XHU1YjU3XHUzMDkyXHU1M2Q2XHU1Zjk3XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3IuYmFkX3N0cmluZ19jaGFyPVx1OTU3N1x1MzA1NTBcdTMwNmVcdTkxNGRcdTUyMTdcdTMwNGJcdTMwODlcdTMwNmZcdTY1ODdcdTViNTdcdTMwOTJcdTUzZDZcdTVmOTdcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC53YXJuaW5nLmNvbXBpbGVyLmNsYXNzLmNhbnRjcmVhdGU9XHU2MzA3XHU1YjlhXHUzMDU1XHUzMDhjXHUzMDVmXHUzMGIzXHUzMGYzXHUzMGQxXHUzMGE0XHUzMGU5XHUzMGQ3XHUzMGU5XHUzMGIwXHUzMGE0XHUzMGYzXHUzMGFmXHUzMGU5XHUzMGI5IHswfSBcdTMwNmVcdTMwYTRcdTMwZjNcdTMwYjlcdTMwYmZcdTMwZjNcdTMwYjlcdTMwOTIgezF9IFx1MzA2ZVx1MzA1Zlx1MzA4MVx1MzA2Ylx1NGY1Y1x1NjIxMFx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMlx1MzBjN1x1MzBkNVx1MzBhOVx1MzBlYlx1MzBjOFx1MzA5MlN1blx1MzA2ZUphdmFcdTMwYjNcdTMwZjNcdTMwZDFcdTMwYTRcdTMwZTlcdTMwNmJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDIKK2pzcC53YXJuaW5nLmNvbXBpbGVyLmNsYXNzLm5vdGZvdW5kPVx1NjMwN1x1NWI5YVx1MzA1NVx1MzA4Y1x1MzA1Zlx1MzBiM1x1MzBmM1x1MzBkMVx1MzBhNFx1MzBlOVx1MzBkN1x1MzBlOVx1MzBiMFx1MzBhNFx1MzBmM1x1MzBhZlx1MzBlOVx1MzBiOSB7MH0gXHUzMDRjXHU4OThiXHUzMDY0XHUzMDRiXHUzMDhhXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAybm90IGZvdW5kLiBcdTMwYzdcdTMwZDVcdTMwYTlcdTMwZWJcdTMwYzhcdTMwOTJTdW5cdTMwNmVKYXZhXHUzMGIzXHUzMGYzXHUzMGQxXHUzMGE0XHUzMGU5XHUzMDZiXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyCitqc3Aud2FybmluZy5jb21waWxlci5wYXRoLm5vdGZvdW5kPVx1NjMwN1x1NWI5YVx1MzA1NVx1MzA4Y1x1MzA1Zlx1MzBiM1x1MzBmM1x1MzBkMVx1MzBhNFx1MzBlOVx1MzBkMVx1MzBiOSB7MH0gXHUzMDRjXHU4OThiXHUzMDY0XHUzMDRiXHUzMDhhXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyXHUzMGI3XHUzMGI5XHUzMGM2XHUzMGUwXHUzMDZlUEFUSFx1MzA5Mlx1MzBjN1x1MzBkNVx1MzBhOVx1MzBlYlx1MzBjOFx1MzA2Ylx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMgoranNwLmVycm9yLmpzcGMudXJpcm9vdF9ub3RfZGlyPS11cmlyb290IFx1MzBhYVx1MzBkN1x1MzBiN1x1MzBlN1x1MzBmM1x1MzA2Zlx1MzAwMVx1NjVlMlx1MzA2Ylx1NWI1OFx1NTcyOFx1MzA1OVx1MzA4Ylx1MzBjN1x1MzBhM1x1MzBlY1x1MzBhZlx1MzBjOFx1MzBlYVx1MzA5Mlx1NjMwN1x1NWI5YVx1MzA1N1x1MzA2YVx1MzA1MVx1MzA4Y1x1MzA3MFx1MzA0NFx1MzA1MVx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLmpzcGMubWlzc2luZ1RhcmdldD1cdTMwYmZcdTMwZmNcdTMwYjJcdTMwYzNcdTMwYzhcdTMwNGNcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTM6IC13ZWJhcHBcdTUzYzhcdTMwNmYtdXJpcm9vdFx1ZmYwY1x1NTNjOFx1MzA2Zlx1NGUwMFx1MzA2NFx1NGVlNVx1NGUwYVx1MzA2ZUpTUFx1MzBkYVx1MzBmY1x1MzBiOFx1MzA5Mlx1NjMwN1x1NWI5YVx1MzA1N1x1MzA2YVx1MzA1MVx1MzA4Y1x1MzA3MFx1MzA0NFx1MzA1MVx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLmpzcGMubm9fdXJpcm9vdD11cmlyb290XHUzMDRjXHU2MzA3XHU1YjlhXHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDZhXHUzMDQ0XHUzMDZlXHUzMDY3XHUzMDAxXHU2MzA3XHU1YjlhXHUzMDU1XHUzMDhjXHUzMDVmSlNQXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViKFx1N2ZhNClcdTMwOTJcdTkxNGRcdTdmNmVcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcGMuaW1wbGljaXQudXJpUm9vdD11cmlSb290XHUzMDZmXHUzMGM3XHUzMGQ1XHUzMGE5XHUzMGViXHUzMGM4InswfSJcdTMwNmJcdThhMmRcdTViOWFcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNTkKK2pzcGMudXNhZ2U9XHU0ZjdmXHU3NTI4XHU2Y2Q1OiBqc3BjIDxvcHRpb25zPiBbLS1dIDxqc3AgZmlsZXM+XG5cCitKU1BcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTMwNmVcdTU4MzRcdTYyNDBcdTMwNmZcdTZiMjFcdTMwNmVcdTMwYWFcdTMwZDdcdTMwYjdcdTMwZTdcdTMwZjNcdTMwNjdcdTYzMDdcdTViOWFcdTMwNTlcdTMwOGJcdTMwNGJcdTMwMDFcblwKK1wgICAgLXdlYmFwcCA8ZGlyPiAgIHdlYi1hcHBcdTMwOTJcdTU0MmJcdTMwODBcdTMwYzdcdTMwYTNcdTMwZWNcdTMwYWZcdTMwYzhcdTMwZWFcdTMwMDJcdTMwNTlcdTMwNzlcdTMwNjZcdTMwNmVKU1BcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTMwNmZcblwKK1wgICAgICAgICAgICAgICAgICAgIFx1NTE4ZFx1NWUzMFx1NzY4NFx1MzA2Ylx1ODllM1x1Njc5MFx1MzA1NVx1MzA4Y1x1MzA4YlxuXAorXHU1M2M4XHUzMDZmXHU2YjIxXHUzMDZlXHU0ZWZiXHU2MTBmXHUzMDZlXHU2NTcwXHUzMDZlXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMDY3XHU2MzA3XHU1YjlhXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyXG5cCitcICAgIDxmaWxlPiAgICAgICAgICBKU1BcdTMwNjhcdTMwNTdcdTMwNjZcdTg5ZTNcdTY3OTBcdTMwNTVcdTMwOGNcdTMwOGJcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcblwKK1x1MzBhYVx1MzBkN1x1MzBiN1x1MzBlN1x1MzBmM1x1MzA2Zlx1NGVlNVx1NGUwYlx1MzA2ZVx1OTAxYVx1MzA4YVx1MzA2N1x1MzA1OVxuXAorXCAgICAtaGVscCAgICAgICAgICAgXHUzMDUzXHUzMDZlXHUzMGQ4XHUzMGViXHUzMGQ3XHUzMGUxXHUzMGMzXHUzMGJiXHUzMGZjXHUzMGI4XHUzMDZlXHU4ODY4XHU3OTNhXG5cCitcICAgIC12ICAgICAgICAgICAgICBWZXJib3NlXHUzMGUyXHUzMGZjXHUzMGM5XG5cCitcICAgIC1kIDxkaXI+ICAgICAgICBcdTUxZmFcdTUyOWJcdTMwYzdcdTMwYTNcdTMwZWNcdTMwYWZcdTMwYzhcdTMwZWFcblwKK1wgICAgLWwgICAgICAgICAgICAgIFx1NTkzMVx1NjU1N1x1MzA1N1x1MzA1ZkpTUFx1MzBkYVx1MzBmY1x1MzBiOFx1MzA2ZVx1NTQwZFx1NTI0ZFx1MzA2ZVx1NTFmYVx1NTI5YlxuXAorXCAgICAtcyAgICAgICAgICAgICAgXHU2MjEwXHU1MjlmXHUzMDU3XHUzMDVmSlNQXHUzMGRhXHUzMGZjXHUzMGI4XHUzMDZlXHU1NDBkXHU1MjRkXHUzMDZlXHU1MWZhXHU1MjliXG5cCitcICAgIC1wIDxuYW1lPiAgICAgICBcdTMwYmZcdTMwZmNcdTMwYjJcdTMwYzNcdTMwYzhcdTMwZDFcdTMwYzNcdTMwYjFcdTMwZmNcdTMwYjhcdTMwNmVcdTU0MGRcdTUyNGQgIChcdTMwYzdcdTMwZDVcdTMwYTlcdTMwZWJcdTMwYzhcdTMwNmZvcmcuYXBhY2hlLmpzcClcblwKK1wgICAgLWMgPG5hbWU+ICAgICAgIFx1MzBiZlx1MzBmY1x1MzBiMlx1MzBjM1x1MzBjOFx1MzBhZlx1MzBlOVx1MzBiOVx1MzA2ZVx1NTQwZFx1NTI0ZCAoXHU2NzAwXHU1MjFkXHUzMDZlSlNQXHUzMGRhXHUzMGZjXHUzMGI4XHUzMDYwXHUzMDUxXHUzMDZiXHU5MDY5XHU3NTI4XHUzMDU1XHUzMDhjXHUzMDhiKVxuXAorXCAgICAtbWFwcGVkICAgICAgICAgSlNQXHUzMDZlXHU1NDA0SFRNTFx1ODg0Y1x1MzA1NFx1MzA2OFx1MzA2YndyaXRlKClcdTMwYjNcdTMwZmNcdTMwZWJcdTMwOTJcdTc1MWZcdTYyMTBcblwKK1wgICAgLWRpZVsjXSAgICAgICAgIFx1ODFmNFx1NTQ3ZFx1NzY4NFx1MzBhOFx1MzBlOVx1MzBmY1x1MzA2Ylx1MzBhOFx1MzBlOVx1MzBmY1x1MzBlYVx1MzBiZlx1MzBmY1x1MzBmM1x1MzBiM1x1MzBmY1x1MzBjOSgjKVx1MzA5Mlx1NzUxZlx1NjIxMCAoXHUzMGM3XHUzMGQ1XHUzMGE5XHUzMGViXHUzMGM4XHUzMDZmMSlcblwKK1wgICAgLXVyaWJhc2UgPGRpcj4gIFx1MzBiM1x1MzBmM1x1MzBkMVx1MzBhNFx1MzBlYlx1MzA0Y1x1NzZmOFx1NWJmZVx1NzY4NFx1MzA2Ylx1MzA0YVx1MzA1M1x1MzA2YVx1MzA4Zlx1MzA4Y1x1MzA4YnVyaVx1MzBjN1x1MzBhM1x1MzBlY1x1MzBhZlx1MzBjOFx1MzBlYVxuXAorXCAgICAgICAgICAgICAgICAgICAgKFx1MzBjN1x1MzBkNVx1MzBhOVx1MzBlYlx1MzBjOFx1MzA2ZiIvIilcblwKK1wgICAgLXVyaXJvb3QgPGRpcj4gIC13ZWJhcHBcdTMwNjhcdTU0MGNcdTMwNThcblwKK1wgICAgLWNvbXBpbGUgICAgICAgIFx1NzUxZlx1NjIxMFx1MzA1N1x1MzA1Zlx1MzBiNVx1MzBmY1x1MzBkNlx1MzBlY1x1MzBjM1x1MzBjOFx1MzA2ZVx1MzBiM1x1MzBmM1x1MzBkMVx1MzBhNFx1MzBlYlxuXAorXCAgICAtd2ViaW5jIDxmaWxlPiAgXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMDZiXHU5MGU4XHU1MjA2XHU3Njg0XHUzMDZhXHUzMGI1XHUzMGZjXHUzMGQ2XHUzMGVjXHUzMGMzXHUzMGM4XHUzMGRlXHUzMGMzXHUzMGQ0XHUzMGYzXHUzMGIwXHUzMDkyXHU0ZjVjXHU2MjEwXG5cCitcICAgIC13ZWJ4bWwgPGZpbGU+ICBcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTMwNmJcdTViOGNcdTUxNjhcdTMwNmF3ZWIueG1sXHUzMDkyXHU0ZjVjXHU2MjEwXG5cCitcICAgIC1pZXBsdWdpbiA8Y2xzaWQ+ICBJbnRlcm5ldCBFeHBsb3Jlclx1MzA2ZUphdmEgUGx1Z2luXHUzMDZlY2xhc3NpZFxuXAorXCAgICAtY2xhc3NwYXRoIDxwYXRoPiAgamF2YS5jbGFzcy5wYXRoXHUzMGI3XHUzMGI5XHUzMGM2XHUzMGUwXHUzMGQ3XHUzMGVkXHUzMGQxXHUzMGM2XHUzMGEzXHUzMDZlXHU0ZTBhXHU2NmY4XHUzMDRkXG5cCitcICAgIC14cG93ZXJlZEJ5ICAgICAgICBYLVBvd2VyZWQtQnlcdTMwZWNcdTMwYjlcdTMwZGRcdTMwZjNcdTMwYjlcdTMwZDhcdTMwYzNcdTMwYzBcdTMwNmVcdThmZmRcdTUyYTBcblwKK1wgICAgLXRyaW1TcGFjZXMgICAgICAgIFx1MzBhMlx1MzBhZlx1MzBiN1x1MzBlN1x1MzBmM1x1MzA4NFx1NjMwN1x1NzkzYVx1NWI1MFx1MzA2ZVx1OTU5M1x1MzA2ZVx1MzBjNlx1MzBmM1x1MzBkN1x1MzBlY1x1MzBmY1x1MzBjOFx1MzBjNlx1MzBhZFx1MzBiOVx1MzBjOFx1NGUyZFx1MzA2ZVx1MzBiOVx1MzBkYVx1MzBmY1x1MzBiOVx1MzA5Mlx1NTI0YVx1OTY2NFxuXAorCitqc3BjLndlYnhtbC5oZWFkZXI9PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PlxuXAorXG5cCis8IURPQ1RZUEUgd2ViLWFwcFxuXAorXCAgICBQVUJMSUMgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBXZWIgQXBwbGljYXRpb24gMi4zLy9FTiJcblwKK1wgICAgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL3dlYi1hcHBfMl8zLmR0ZCI+XG5cCis8IS0tXG5cCitBdXRvbWF0aWNhbGx5IGNyZWF0ZWQgYnkgVG9tY2F0IEpzcEMuXG5cCistLT5cblwKKzx3ZWItYXBwPlxuXAorXG4KK2pzcGMud2VieG1sLmZvb3Rlcj1cblwKKzwvd2ViLWFwcD5cblwKK1xuCitqc3BjLndlYmluYy5oZWFkZXI9XG5cCis8IS0tXG5cCitBdXRvbWF0aWNhbGx5IGNyZWF0ZWQgYnkgVG9tY2F0IEpzcEMuXG5cCitQbGFjZSB0aGlzIGZyYWdtZW50IGluIHRoZSB3ZWIueG1sIGJlZm9yZSBhbGwgaWNvbiwgZGlzcGxheS1uYW1lLFxuXAorZGVzY3JpcHRpb24sIGRpc3RyaWJ1dGFibGUsIGFuZCBjb250ZXh0LXBhcmFtIGVsZW1lbnRzLlxuXAorLS0+XG4KK2pzcGMud2ViaW5jLmZvb3Rlcj1cblwKKzwhLS1cblwKK0FsbCBzZXNzaW9uLWNvbmZpZywgbWltZS1tYXBwaW5nLCB3ZWxjb21lLWZpbGUtbGlzdCwgZXJyb3ItcGFnZSwgdGFnbGliLFxuXAorcmVzb3VyY2UtcmVmLCBzZWN1cml0eS1jb25zdHJhaW50LCBsb2dpbi1jb25maWcsIHNlY3VyaXR5LXJvbGUsXG5cCitlbnYtZW50cnksIGFuZCBlamItcmVmIGVsZW1lbnRzIHNob3VsZCBmb2xsb3cgdGhpcyBmcmFnbWVudC5cblwKKy0tPlxuCitqc3BjLndlYmluYy5pbnNlcnRFbmQ9PCEtLSBKU1BDIHNlcnZsZXQgbWFwcGluZ3MgZW5kIC0tPgoranNwYy53ZWJpbmMuaW5zZXJ0U3RhcnQ9PCEtLSBKU1BDIHNlcnZsZXQgbWFwcGluZ3Mgc3RhcnQgLS0+Citqc3BjLmVycm9yLmphc3BlckV4Y2VwdGlvbj1cdTMwYThcdTMwZTlcdTMwZmM6IFx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYiAnJ3swfScnIFx1MzA2Zlx1NmIyMVx1MzA2ZVx1NGY4Ylx1NTkxNlx1MzA5Mlx1NzY3YVx1NzUxZlx1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1ZjogezF9Citqc3BjLmVycm9yLmdlbmVyYWxFeGNlcHRpb249XHUzMGE4XHUzMGU5XHUzMGZjOiBcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWIgJyd7MH0nJyBcdTMwNmZcdTZiMjFcdTMwNmVcdTRmOGJcdTU5MTZcdTMwOTJcdTc2N2FcdTc1MWZcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWY6Citqc3BjLmVycm9yLmZpbGVEb2VzTm90RXhpc3Q9XHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHU1ZjE1XHU2NTcwICcnezB9JycgXHUzMDZmXHU1YjU4XHU1NzI4XHUzMDU3XHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyCitqc3BjLmVycm9yLmVtcHR5V2ViQXBwPS13ZWJhcHBcdTMwYWFcdTMwZDdcdTMwYjdcdTMwZTdcdTMwZjNcdTMwNmJcdTMwNmZcdTMwMDFcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTVmMTVcdTY1NzBcdTMwNGNcdTVmYzVcdTg5ODFcdTMwNjdcdTMwNTkKK2pzcC5lcnJvci5saWJyYXJ5LmludmFsaWQ9XHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhezB9XHUzMDZiXHU1ZjkzXHUzMDQ2XHUzMDY4SlNQXHUzMGRhXHUzMGZjXHUzMGI4XHUzMDZmXHU3MTIxXHU1MmI5XHUzMDY3XHUzMDU5OiB7MX0KK2pzcC5lcnJvci50bHZjbGFzcy5pbnN0YW50aWF0aW9uPVRhZ0xpYnJhcnlWYWxpZGF0b3JcdTMwYWZcdTMwZTlcdTMwYjlcdTMwNmVcdTMwZWRcdTMwZmNcdTMwYzlcdTUzYzhcdTMwNmZcdTMwYTRcdTMwZjNcdTMwYjlcdTMwYmZcdTMwZjNcdTMwYjlcdTUzMTZcdTMwNmJcdTU5MzFcdTY1NTdcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWY6IHswfQoranNwLmVycm9yLnRsdi5pbnZhbGlkLnBhZ2U9ezB9IFx1MzA2Ylx1NWJmZVx1MzA1OVx1MzA4YlRhZ0xpYnJhcnlWYWxpZGF0b3JcdTMwNmVcdTY5MWNcdThhM2NcdTMwYThcdTMwZTlcdTMwZmNcdTMwZTFcdTMwYzNcdTMwYmJcdTMwZmNcdTMwYjhcdTMwNjdcdTMwNTkKK2pzcC5lcnJvci50ZWkuaW52YWxpZC5hdHRyaWJ1dGVzPXswfSBcdTMwNmJcdTViZmVcdTMwNTlcdTMwOGJUYWdFeHRyYUluZm9cdTMwNGJcdTMwODlcdTMwNmVcdTY5MWNcdThhM2NcdTMwYThcdTMwZTlcdTMwZmNcdTMwZTFcdTMwYzNcdTMwYmJcdTMwZmNcdTMwYjhcdTMwNjdcdTMwNTkKK2pzcC5wYXJzZXIuc2F4LnByb3BlcnR5bm90c3VwcG9ydGVkPVNBWFx1MzBkN1x1MzBlZFx1MzBkMVx1MzBjNlx1MzBhM1x1MzA0Y1x1MzBiNVx1MzBkZFx1MzBmY1x1MzBjOFx1MzA1NVx1MzA4Y1x1MzA3ZVx1MzA1Ylx1MzA5MzogezB9Citqc3AucGFyc2VyLnNheC5wcm9wZXJ0eW5vdHJlY29nbml6ZWQ9U0FYXHUzMGQ3XHUzMGVkXHUzMGQxXHUzMGM2XHUzMGEzXHUzMDRjXHU4YThkXHU4YjU4XHUzMDU1XHUzMDhjXHUzMDdlXHUzMDViXHUzMDkzOiB7MH0KK2pzcC5wYXJzZXIuc2F4LmZlYXR1cmVub3RzdXBwb3J0ZWQ9U0FYXHUzMGQ1XHUzMGEzXHUzMGZjXHUzMGMxXHUzMGUzXHUzMDRjXHUzMGI1XHUzMGRkXHUzMGZjXHUzMGM4XHUzMDU1XHUzMDhjXHUzMDdlXHUzMDViXHUzMDkzOiB7MH0KK2pzcC5wYXJzZXIuc2F4LmZlYXR1cmVub3RyZWNvZ25pemVkPVNBWFx1MzBkNVx1MzBhM1x1MzBmY1x1MzBjMVx1MzBlM1x1MzA0Y1x1OGE4ZFx1OGI1OFx1MzA1NVx1MzA4Y1x1MzA3ZVx1MzA1Ylx1MzA5MzogezB9Citqc3AuZXJyb3Iubm8ubW9yZS5jb250ZW50PVx1NWZjNVx1ODk4MVx1MzA2YVx1ODllM1x1Njc5MFx1NGUyZFx1MzA2Ylx1NTE4NVx1NWJiOVx1MzA2ZVx1NjcwMFx1NWY4Y1x1MzA3ZVx1MzA2N1x1OTA1NFx1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1ZjogXHUzMGJmXHUzMGIwXHUzMDZlXHUzMGNkXHUzMGI5XHUzMGM4XHUzMDZlXHUzMGE4XHUzMGU5XHUzMGZjXHUzMDRiXHUzMDgyXHUzMDU3XHUzMDhjXHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3IucGFyc2UueG1sPVx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYnswfVx1MzA2ZVhNTFx1ODllM1x1Njc5MFx1MzBhOFx1MzBlOVx1MzBmYworanNwLmVycm9yLnBhcnNlLnhtbC5saW5lPVx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYnswfVx1MzA2ZVhNTFx1ODllM1x1Njc5MFx1MzBhOFx1MzBlOVx1MzBmYzogKFx1ODg0YyB7MX0sIFx1NTIxNyB7Mn0pCitqc3AuZXJyb3IucGFyc2UueG1sLnNjcmlwdGluZy5pbnZhbGlkLmJvZHk9ezB9IFx1ODk4MVx1N2QyMFx1MzA2ZVx1MzBkY1x1MzBjN1x1MzBhM1x1MzA2ZlhNTFx1ODk4MVx1N2QyMFx1MzA5Mlx1NTQyYlx1MzA5M1x1MzA2N1x1MzA2Zlx1MzA0NFx1MzA1MVx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLmludGVybmFsLnRsZGluaXQ9VGxkTG9jYXRpb25zQ2FjaGVcdTMwOTJcdTUyMWRcdTY3MWZcdTUzMTZcdTRlMmRcdTMwNmVcdTRmOGJcdTU5MTZcdTMwNjdcdTMwNTk6IHswfQoranNwLmVycm9yLmludGVybmFsLmZpbGVub3Rmb3VuZD1cdTUxODVcdTkwZThcdTMwYThcdTMwZTlcdTMwZmM6IFx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYiB7MH0gXHUzMDRjXHU4OThiXHUzMDY0XHUzMDRiXHUzMDhhXHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3IuaW50ZXJuYWwuZXZhbHVhdG9yX25vdF9mb3VuZD1cdTUxODVcdTkwZThcdTMwYThcdTMwZTlcdTMwZmM6IFx1NWYwZlx1NjkxY1x1OGEzY1x1NTY2OFx1MzA5Mlx1MzBlZFx1MzBmY1x1MzBjOVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLnBhcnNlLnhtbC5pbnZhbGlkUHVibGljSWQ9XHU3MTIxXHU1MmI5XHUzMDZhUFVCTElDIElEOiB7MH0KK2pzcC5lcnJvci5pbmNsdWRlLmZsdXNoLmludmFsaWQudmFsdWU9Zmx1c2hcdTVjNWVcdTYwMjdcdTMwNmJcdTcxMjFcdTUyYjlcdTMwNmFcdTUwMjRcdTMwNGNcdTYzMDdcdTViOWFcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTk6IHswfQoranNwLmVycm9yLnVuc3VwcG9ydGVkLmVuY29kaW5nPVx1MzBiNVx1MzBkZFx1MzBmY1x1MzBjOFx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA2YVx1MzA0NFx1MzBhOFx1MzBmM1x1MzBiM1x1MzBmY1x1MzBjN1x1MzBhM1x1MzBmM1x1MzBiMFx1MzA2N1x1MzA1OTogezB9Cit0bGQuZXJyb3IudmFyaWFibGVOb3RBbGxvd2VkPW51bGxcdTMwNjdcdTMwNmFcdTMwNDRcdTMwYWFcdTMwZDZcdTMwYjhcdTMwYTdcdTMwYWZcdTMwYzhcdTMwOTJcdThmZDRcdTMwNTlUYWdFeHRyYUluZm9cdTMwOTJcdTYzMDFcdTMwNjRcdTRlMDBcdTMwNjRcdTRlZTVcdTRlMGFcdTMwNmVcdTU5MDlcdTY1NzBcdTUyNmZcdTg5ODFcdTdkMjBcdTMwOTJcdTYzMDFcdTMwNjRcdTMwYmZcdTMwYjBcdTMwNmZcdTMwYThcdTMwZTlcdTMwZmNcdTMwNjdcdTMwNTlcdTMwMDIKK2pzcC5lcnJvci50bGRJbldlYkRvdFhtbE5vdEZvdW5kPXdlYi54bWxcdTMwNjdcdTYzMDdcdTViOWFcdTMwNTVcdTMwOGNcdTMwNWZVUkkgezB9IFx1MzA2YlRMRFx1MzA5Mlx1OTE0ZFx1N2Y2ZVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLnRhZ2xpYkRpcmVjdGl2ZS5hYnNVcmlDYW5ub3RCZVJlc29sdmVkPVx1N2Q3Nlx1NWJmZVVSSTogIHswfSBcdTMwNmZ3ZWIueG1sXHUzMDY4XHUzMDUzXHUzMDZlXHUzMGEyXHUzMGQ3XHUzMGVhXHUzMGIxXHUzMGZjXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDkyXHU5MTRkXHU1MDk5XHUzMDU3XHUzMDVmSkFSXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMDZlXHUzMDY5XHUzMDYxXHUzMDg5XHUzMDRiXHUzMDY3XHUzMDgyXHU4OWUzXHU2YzdhXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3IudGFnbGliRGlyZWN0aXZlLm1pc3NpbmcubG9jYXRpb249dGFnbGliXHU2MzA3XHU3OTNhXHU1YjUwXHUzMDZlXHU0ZTJkXHUzMDZiJ3VyaSdcdTVjNWVcdTYwMjdcdTMwNjgndGFnZGlyJ1x1NWM1ZVx1NjAyN1x1MzA2ZVx1MzA2OVx1MzA2MVx1MzA4OVx1MzA4Mlx1NjMwN1x1NWI5YVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLnRhZ2xpYkRpcmVjdGl2ZS5ib3RoX3VyaV9hbmRfdGFnZGlyPVwndXJpXCdcdTVjNWVcdTYwMjcgXHUzMDY4IFwndGFnZGlyXCdcdTVjNWVcdTYwMjdcdTMwNmVcdTRlMjFcdTY1YjlcdTMwNGNcdTYzMDdcdTViOWFcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkKK2pzcC5lcnJvci5pbnZhbGlkLnRhZ2Rpcj1cdTMwYmZcdTMwYjBcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTMwYzdcdTMwYTNcdTMwZWNcdTMwYWZcdTMwYzhcdTMwZWEgezB9IFx1MzA0Y1wiL1dFQi1JTkYvdGFnc1wiXHUzMDY3XHU1OWNiXHUzMDdlXHUzMDhhXHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3IudW50ZXJtaW5hdGVkLnVzZXIudGFnPVx1NjcyYVx1N2Q0Mlx1NGU4Nlx1MzA2ZVx1MzBlNlx1MzBmY1x1MzBiNlx1NWI5YVx1N2ZhOVx1MzBiZlx1MzBiMDogXHU3ZDQyXHU0ZTg2XHUzMGJmXHUzMGIwIHswfSBcdTMwNGNcdTg5OGJcdTMwNjRcdTMwNGJcdTMwODlcdTMwNmFcdTMwNDRcdTMwNGJcdTMwMDFcdTMwY2RcdTMwYjlcdTMwYzhcdTMwNGNcdTk1OTNcdTkwNTVcdTMwNjNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkKKyNqc3B4LmVycm9yLnRlbXBsYXRlRGF0YU5vdEluSnNwQ2RhdGE9VmFsaWRhdGlvbiBFcnJvcjogRWxlbWVudCAmbHQ7ezB9Jmd0OyBjYW5ub3QgaGF2ZSB0ZW1wbGF0ZSBkYXRhLiBUZW1wbGF0ZSBkYXRhIG11c3QgYmUgZW5jYXBzdWxhdGVkIHdpdGhpbiBhICZsdDtqc3A6Y2RhdGEmZ3Q7IGVsZW1lbnQuIFtKU1AxLjIgUEZEIHNlY3Rpb24gNS4xLjldXG5UZW1wbGF0ZSBkYXRhIGluIGVycm9yOiB7MX0KK2pzcHguZXJyb3IudGVtcGxhdGVEYXRhTm90SW5Kc3BDZGF0YT1cdThhM2NcdTY2MGVcdTMwYThcdTMwZTlcdTMwZmM6IFx1ODk4MVx1N2QyMCZsdDt7MH0mZ3Q7XHUzMDZmXHUzMGM2XHUzMGYzXHUzMGQ3XHUzMGVjXHUzMGZjXHUzMGM4XHUzMGM3XHUzMGZjXHUzMGJmXHUzMDkyXHU2MzAxXHUzMDY0XHUzMDUzXHUzMDY4XHUzMDZmXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyXHUzMGM2XHUzMGYzXHUzMGQ3XHUzMGVjXHUzMGZjXHUzMGM4XHUzMGM3XHUzMGZjXHUzMGJmXHUzMDZmXHUzMDAxJmx0O2pzcDp0ZXh0Jmd0O1x1ODk4MVx1N2QyMFx1MzA2ZVx1NGUyZFx1MzA2N1x1OTZhMFx1ODUzZFx1MzA1NVx1MzA4Y1x1MzA2YVx1MzA1MVx1MzA4Y1x1MzA3MFx1MzA0NFx1MzA1MVx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMltKU1AxLjIgUEZEIDUuMS45XVxuXHUzMGM2XHUzMGYzXHUzMGQ3XHUzMGVjXHUzMGZjXHUzMGM4XHUzMGM3XHUzMGZjXHUzMGJmXHUzMDZlXHUzMGE4XHUzMGU5XHUzMGZjXHUzMDY3XHUzMDU5OiB7MX0KKyNFcnJvciB3aGlsZSBwcm9jZXNzaW5nIHRhZ2xpYiBqYXIgZmlsZSB7MH06IHsxfQoranNwLmVycm9yLnRhZ2xpYi5yZXNlcnZlZC5wcmVmaXg9dGFnbGliXHUzMGQ3XHUzMGVhXHUzMGQ1XHUzMGEzXHUzMGFmXHUzMGI5IHswfSBcdTMwNmZcdTRlODhcdTdkMDRcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkKK2pzcC5lcnJvci5pbnZhbGlkLmphdmFFbmNvZGluZz1cdTcxMjFcdTUyYjlcdTMwNmFKYXZhXHUzMGE4XHUzMGYzXHUzMGIzXHUzMGZjXHUzMGM3XHUzMGEzXHUzMGYzXHUzMGIwXHUzMDY3XHUzMDU5XHUzMDAyezB9XHUzMDkyXHU4YTY2XHUzMDU3XHUzMDY2XHUzMDAxXHUzMDVkXHUzMDhjXHUzMDRiXHUzMDg5ezF9XHUzMDkyXHU4YTY2XHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmXHUzMDRjXHUzMDAxXHU0ZTIxXHU2NWI5XHUzMDRjXHU1OTMxXHU2NTU3XHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmCitqc3AuZXJyb3IubmVlZEFsdGVybmF0ZUphdmFFbmNvZGluZz1cdTMwYzdcdTMwZDVcdTMwYTlcdTMwZWJcdTMwYzhcdTMwNmVKYXZhXHUzMGE4XHUzMGYzXHUzMGIzXHUzMGZjXHUzMGM3XHUzMGEzXHUzMGYzXHUzMGIwIHswfSBcdTMwNmZcdTMwNDJcdTMwNmFcdTMwNWZcdTMwNmVcdTMwZDdcdTMwZTlcdTMwYzNcdTMwYzhcdTMwZDVcdTMwYTlcdTMwZmNcdTMwZTBcdTMwNjdcdTMwNmZcdTcxMjFcdTUyYjlcdTMwNjdcdTMwNTlcdTMwMDJKc3BTZXJ2bGV0XHUzMDZlICdqYXZhRW5jb2RpbmcnIFx1MzBkMVx1MzBlOVx1MzBlMVx1MzBiZlx1MzA2N1x1MzAwMVx1NTIyNVx1MzA2ZVx1NTAyNFx1MzA5Mlx1NjMwN1x1NWI5YVx1MzA1OVx1MzA4Ylx1MzA1M1x1MzA2OFx1MzA0Y1x1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1OVx1MzAwMgorI0Vycm9yIHdoZW4gY29tcGlsaW5nLCB1c2VkIGZvciBqc3AgbGluZSBudW1iZXIgZXJyb3IgbWVzc2FnZXMKK2pzcC5lcnJvci5zaW5nbGUubGluZS5udW1iZXI9SlNQXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViOiB7MX0gXHUzMDZlXHU0ZTJkXHUzMDZlezB9XHU4ODRjXHU3NmVlXHUzMDY3XHUzMGE4XHUzMGU5XHUzMGZjXHUzMDRjXHU3NjdhXHU3NTFmXHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmCitqc3AuZXJyb3IubXVsdGlwbGUubGluZS5udW1iZXI9XG5cbkpQU1x1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYjogezJ9XHUzMDZlXHU0ZTJkXHUzMDZlezB9XHU4ODRjXHU3NmVlXHUzMDY4ezF9XHU4ODRjXHU3NmVlXHUzMDZlXHU5NTkzXHUzMDY3XHUzMGE4XHUzMGU5XHUzMGZjXHUzMDRjXHU3NjdhXHU3NTFmXHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmXG5cbgoranNwLmVycm9yLmNvcnJlc3BvbmRpbmcuc2VydmxldD1cdTc1MWZcdTYyMTBcdTMwNTVcdTMwOGNcdTMwNWZcdTMwYjVcdTMwZmNcdTMwZDZcdTMwZWNcdTMwYzNcdTMwYzhcdTMwNmVcdTMwYThcdTMwZTlcdTMwZmNcdTMwNjdcdTMwNTk6XG4KK2pzcC5lcnJvci5lbXB0eS5ib2R5Lm5vdC5hbGxvd2VkPXswfSBcdTMwNmJcdTViZmVcdTMwNTdcdTMwNjZcdTdhN2FcdTMwNmVcdTMwZGNcdTMwYzdcdTMwYTNcdTMwNmZcdThhMzFcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC5lcnJvci5qc3Bib2R5LnJlcXVpcmVkPWpzcDphdHRyaWJ1dGVcdTMwNGNcdTRmN2ZcdTc1MjhcdTMwNTVcdTMwOGNcdTMwNWZcdTU4MzRcdTU0MDhcdTMwNmJcdTMwNmZcdTMwMDF7MH1cdTMwNmJcdTMwYmZcdTMwYjBcdTMwZGNcdTMwYzdcdTMwYTNcdTMwOTJcdTYzMDdcdTViOWFcdTMwNTlcdTMwOGJcdTMwNWZcdTMwODFcdTMwNmJqc3A6Ym9keVx1MzA5Mlx1NGY3Zlx1NzUyOFx1MzA1N1x1MzA2YVx1MzA1MVx1MzA4Y1x1MzA3MFx1MzA0NFx1MzA1MVx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLmpzcGJvZHkuZW1wdHlib2R5Lm9ubHk9ezB9IFx1MzBiZlx1MzBiMFx1MzA2Zlx1MzAwMVx1MzA1ZFx1MzA2ZVx1MzBkY1x1MzBjN1x1MzBhM1x1NGUyZFx1MzA2YmpzcDphdHRyaWJ1dGVcdTMwNjBcdTMwNTFcdTMwOTJcdTYzMDFcdTMwNjRcdTMwNTNcdTMwNjhcdTMwNGNcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNTkKK2pzcC5lcnJvci5uby5zY3JpcHRsZXRzPVx1MzBiOVx1MzBhZlx1MzBlYVx1MzBkN1x1MzBjNlx1MzBhM1x1MzBmM1x1MzBiMFx1ODk4MVx1N2QyMCAoICZsdDslIVx1MzAwMSZsdDtqc3A6ZGVjbGFyYXRpb25cdTMwMDEmbHQ7JT1cdTMwMDEmbHQ7anNwOmV4cHJlc3Npb25cdTMwMDEmbHQ7JVx1MzAwMSZsdDtqc3A6c2NyaXB0bGV0ICkgXHUzMDZmXHUzMDUzXHUzMDUzXHUzMDY3XHUzMDZmXHU4YTMxXHUzMDU1XHUzMDhjXHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3IuaW50ZXJuYWwudW5leHBlY3RlZF9ub2RlX3R5cGU9XHU1MTg1XHU5MGU4XHUzMGE4XHUzMGU5XHUzMGZjOiBcdTY3MmFcdTc3ZTVcdTMwNmVcdTMwY2VcdTMwZmNcdTMwYzlcdTMwYmZcdTMwYTRcdTMwZDdcdTMwNGNcdTg4NjhcdTMwOGNcdTMwN2VcdTMwNTdcdTMwNWYKK2pzcC5lcnJvci50bGQuZm4uaW52YWxpZC5zaWduYXR1cmU9VExEXHUzMDZlXHU0ZTJkXHUzMDZlXHU5NWEyXHU2NTcwXHUzMGI3XHUzMGIwXHUzMGNkXHUzMGMxXHUzMGUzXHUzMDZiXHU1YmZlXHUzMDU5XHUzMDhiXHU3MTIxXHU1MmI5XHUzMDZhXHU2OWNiXHU2NTg3XHUzMDY3XHUzMDU5XHUzMDAyXHUzMGJmXHUzMGIwXHUzMGU5XHUzMGE0XHUzMGQ2XHUzMGU5XHUzMGVhOiB7MH1cdTMwMDFcdTk1YTJcdTY1NzA6IHsxfQoranNwLmVycm9yLnRsZC5mbi5kdXBsaWNhdGUubmFtZT1cdTMwYmZcdTMwYjBcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWEgezF9IFx1MzA2ZVx1NGUyZFx1MzA2ZVx1OTVhMlx1NjU3MFx1NTQwZCB7MH0gXHUzMDRjXHU5MWNkXHU4OTA3XHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5Citqc3AuZXJyb3IudGxkLmZuLmludmFsaWQuc2lnbmF0dXJlLmNvbW1hZXhwZWN0ZWQ9VExEXHUzMDZlXHU0ZTJkXHUzMDZlXHU5NWEyXHU2NTcwXHUzMGI3XHUzMGIwXHUzMGNkXHUzMGMxXHUzMGUzXHUzMDZiXHU1YmZlXHUzMDU5XHUzMDhiXHU3MTIxXHU1MmI5XHUzMDZhXHU2OWNiXHU2NTg3XHUzMDY3XHUzMDU5XHUzMDAyXHUzMGIzXHUzMGYzXHUzMGRlICcsJyBcdTMwNGNcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDJcdTMwYmZcdTMwYjBcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWE6IHswfVx1MzAwMVx1OTVhMlx1NjU3MDogezF9XHUzMDAyCitqc3AuZXJyb3IudGxkLmZuLmludmFsaWQuc2lnbmF0dXJlLnBhcmVuZXhwZWN0ZWQ9VExEXHUzMDZlXHU0ZTJkXHUzMDZlXHU5NWEyXHU2NTcwXHUzMGI3XHUzMGIwXHUzMGNkXHUzMGMxXHUzMGUzXHUzMDZiXHU1YmZlXHUzMDU5XHUzMDhiXHU3MTIxXHU1MmI5XHUzMDZhXHU2OWNiXHU2NTg3XHUzMDY3XHUzMDU5XHUzMDAyXHU2MmVjXHU1ZjI3ICcoJyBcdTMwNGNcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDJcdTMwYmZcdTMwYjBcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWE6IHswfVx1MzAwMVx1OTVhMlx1NjU3MDogezF9XHUzMDAyCitqc3AuZXJyb3IudGxkLm1hbmRhdG9yeS5lbGVtZW50Lm1pc3Npbmc9XHU1ZmM1XHU5ODA4VExEXHU4OTgxXHU3ZDIwXHUzMDRjXHUzMDZhXHUzMDQ0XHUzMDAxXHU1M2M4XHUzMDZmXHU3YTdhXHUzMDY3XHUzMDU5OiB7MH0KK2pzcC5lcnJvci5keW5hbWljLmF0dHJpYnV0ZXMubm90LmltcGxlbWVudGVkPXswfSBcdTMwYmZcdTMwYjBcdTMwNmZcdTMwNWRcdTMwOGNcdTMwNGNkeW5hbWljXHU1YzVlXHU2MDI3XHUzMDkyXHU1M2Q3XHUzMDUxXHU0ZWQ4XHUzMDUxXHUzMDhiXHUzMDY4XHU1YmEzXHU4YTAwXHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5XHUzMDRjXHUzMDAxXHUzMDVkXHUzMDhjXHUzMDZiXHU1ZmM1XHU4OTgxXHUzMDZhXHUzMGE0XHUzMGYzXHUzMGJmXHUzMGQ1XHUzMGE3XHUzMGZjXHUzMGI5XHUzMDkyXHU1YjlmXHU4OGM1XHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3Iubm9tYXRjaGluZy5mcmFnbWVudD1hdHRyaWJ1dGVcdTYzMDdcdTc5M2FcdTViNTAgKG5hbWU9ezB9XHUzMDRhXHUzMDg4XHUzMDczZnJhZ21lbnQ9dHJ1ZVx1MzA5Mlx1NjMwMVx1MzA2NCkgXHUzMDRjZnJhZ21lbnRcdTYzMDdcdTc5M2FcdTViNTBcdTMwODhcdTMwOGFcdTUyNGRcdTMwNmJcdTg5OGJcdTMwNjRcdTMwNGJcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC5lcnJvci5hdHRyaWJ1dGUubm9lcXVhbD1cdTdiNDlcdTUzZjdcdThhMThcdTUzZjdcdTMwNGNcdTVmYzVcdTg5ODFcdTMwNjdcdTMwNTkKK2pzcC5lcnJvci5hdHRyaWJ1dGUubm9xdW90ZT1cdTVmMTVcdTc1MjhcdTdiMjZcdTMwNGNcdTVmYzVcdTg5ODFcdTMwNjdcdTMwNTkKK2pzcC5lcnJvci5hdHRyaWJ1dGUudW50ZXJtaW5hdGVkPXswfSBcdTMwNmVcdTVjNWVcdTYwMjdcdTMwNGNcdTZiNjNcdTMwNTdcdTMwNGZcdTdkNDJcdTRlODZcdTMwNTdcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC5lcnJvci5taXNzaW5nLnRhZ0luZm89ezB9IFx1MzA2Ylx1NWJmZVx1MzA1OVx1MzA4YlRhZ0luZm9cdTMwYWFcdTMwZDZcdTMwYjhcdTMwYTdcdTMwYWZcdTMwYzhcdTMwNGNUTERcdTMwNGJcdTMwODlcdTU5MzFcdTMwOGZcdTMwOGNcdTMwN2VcdTMwNTdcdTMwNWYKK2pzcC5lcnJvci5mcmFnbWVudHdpdGh0eXBlPSdmcmFnbWVudCdcdTVjNWVcdTYwMjdcdTMwNjgndHlwZSdcdTVjNWVcdTYwMjdcdTMwOTJcdTRlMjFcdTY1YjlcdTYzMDdcdTViOWFcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDInZnJhZ21lbnQnXHUzMDRjXHU1YjU4XHU1NzI4XHUzMDU5XHUzMDhiXHU1ODM0XHU1NDA4XHUzMDZiXHUzMDZmJ3R5cGUnXHUzMDZmJ2phdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5Kc3BGcmFnbWVudCdcdTMwNmJcdTU2ZmFcdTViOWFcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNTkKK2pzcC5lcnJvci5mcmFnbWVudHdpdGhydGV4cHJ2YWx1ZT0nZnJhZ21lbnQnXHU1YzVlXHU2MDI3XHUzMDY4J3J0ZXhwcnZhbHVlJ1x1NWM1ZVx1NjAyN1x1MzA5Mlx1NGUyMVx1NjViOVx1NjMwN1x1NWI5YVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMidmcmFnbWVudCdcdTMwNGNcdTViNThcdTU3MjhcdTMwNTlcdTMwOGJcdTU4MzRcdTU0MDhcdTMwNmJcdTMwNmYncnRleHBydmFsdWUnXHUzMDZmJ3RydWUnXHUzMDZiXHU1NmZhXHU1YjlhXHUzMDU1XHUzMDhjXHUzMDdlXHUzMDU5Citqc3AuZXJyb3IuZnJhZ21lbnRXaXRoRGVjbGFyZU9yU2NvcGU9J2ZyYWdtZW50J1x1NWM1ZVx1NjAyN1x1MzA2OCdkZWNsYXJlJ1x1NWM1ZVx1NjAyN1x1MzA2ZVx1NGUyMVx1NjViOVx1NTNjOFx1MzA2ZidzY29wZSdcdTVjNWVcdTYwMjdcdTMwNGN2YXJpYWJsZVx1NjMwN1x1NzkzYVx1NWI1MFx1NGUyZFx1MzA2N1x1NjMwN1x1NWI5YVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OQoranNwLmVycm9yLnZhcl9hbmRfdmFyUmVhZGVyPVwndmFyXCdcdTUzYzhcdTMwNmZcJ3ZhclJlYWRlclwnXHUzMDZlXHUzMDY5XHUzMDYxXHUzMDg5XHUzMDRiXHU0ZTAwXHUzMDY0XHUzMDkyXHU2MzA3XHU1YjlhXHUzMDU5XHUzMDhiXHUzMDUzXHUzMDY4XHUzMDRjXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDU5Citqc3AuZXJyb3IubWlzc2luZ192YXJfb3JfdmFyUmVhZGVyPVwndmFyXCdcdTUzYzhcdTMwNmZcJ3ZhclJlYWRlclwnXHU1YzVlXHU2MDI3XHUzMDRjXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDViXHUzMDkzCitqc3Aud2FybmluZy5iYWQudXJscGF0dGVybi5wcm9wZXJ0eWdyb3VwPXdlYi54bWxcdTRlMmRcdTMwNmV1cmwtcGF0dGVyblx1NTI2Zlx1ODk4MVx1N2QyMFx1NGUyZFx1MzA2Ylx1OGFhNFx1MzA2M1x1MzA1Zlx1NTAyNCB7MH0gXHUzMDRjXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDU5Citqc3AuZXJyb3IudW5rbm93bl9hdHRyaWJ1dGVfdHlwZT1cdTVjNWVcdTYwMjcgezB9IFx1MzA2Ylx1NWJmZVx1MzA1OVx1MzA4Ylx1NjcyYVx1NzdlNVx1MzA2ZVx1NWM1ZVx1NjAyN1x1MzBiZlx1MzBhNFx1MzBkN1x1MzA2N1x1MzA1OQoranNwLmVycm9yLmpzcGVsZW1lbnQubWlzc2luZy5uYW1lPVx1NWZjNVx1OTgwOFx1MzA2ZVhNTFx1MzBiOVx1MzBiZlx1MzBhNFx1MzBlYlx1MzA2ZSduYW1lJ1x1NWM1ZVx1NjAyN1x1MzA0Y2pzcDplbGVtZW50XHU0ZTJkXHUzMDZiXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3IueG1sbnMucmVkZWZpbml0aW9uLm5vdGltcGxlbWVudGVkPVx1NTE4NVx1OTBlOFx1MzBhOFx1MzBlOVx1MzBmYzogeG1sbnM6ezB9XHUzMDkyXHU1MThkXHU1YjlhXHU3ZmE5XHUzMDU3XHUzMDg4XHUzMDQ2XHUzMDY4XHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmXHUzMDAyXHU1NDBkXHU1MjRkXHU3YTdhXHU5NTkzXHUzMDZlXHU1MThkXHU1YjlhXHU3ZmE5XHUzMDZmXHU1YjlmXHU4OGM1XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyCitqc3AuZXJyb3IuY291bGQubm90LmFkZC50YWdsaWJyYXJpZXM9MVx1MzA2NFx1NGVlNVx1NGUwYVx1MzA2ZVx1MzBiZlx1MzBiMFx1MzBlOVx1MzBhNFx1MzBkNlx1MzBlOVx1MzBlYVx1MzA5Mlx1OGZmZFx1NTJhMFx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLmR1cGxpY2F0ZS5uYW1lLmpzcGF0dHJpYnV0ZT1cdTZhMTlcdTZlOTZcdTUzYzhcdTMwNmZcdTMwYWJcdTMwYjlcdTMwYmZcdTMwZTBcdTMwYTJcdTMwYWZcdTMwYjdcdTMwZTdcdTMwZjNcdTRlMmRcdTMwNjdcdTYzMDdcdTViOWFcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwOGJcdTVjNWVcdTYwMjcgezB9IFx1MzA2Zlx1MzA1ZFx1MzA4Y1x1MzA2Ylx1NTZmMlx1MzA3ZVx1MzA4Y1x1MzA1ZmpzcDphdHRyaWJ1dGVcdTRlMmRcdTMwNmVuYW1lXHU1YzVlXHU2MDI3XHUzMDZlXHU1MDI0XHUzMDY4XHUzMDU3XHUzMDY2XHUzMDgyXHU4ODY4XHUzMDhjXHUzMDdlXHUzMDU5Citqc3AuZXJyb3Iubm90LmluLnRlbXBsYXRlPVx1MzBjNlx1MzBmM1x1MzBkN1x1MzBlY1x1MzBmY1x1MzBjOFx1MzBjNlx1MzBhZFx1MzBiOVx1MzBjOFx1MzBkY1x1MzBjN1x1MzBhM1x1NGUyZFx1MzA2N1x1MzA2ZiB7MH0gXHUzMDZmXHU4YTMxXHUzMDU1XHUzMDhjXHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3IuYmFkU3RhbmRhcmRBY3Rpb249XHU3MTIxXHU1MmI5XHUzMDZhXHU2YTE5XHU2ZTk2XHUzMGEyXHUzMGFmXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDY3XHUzMDU5Citqc3AuZXJyb3IueG1sLmJhZFN0YW5kYXJkQWN0aW9uPVx1NzEyMVx1NTJiOVx1MzA2YVx1NmExOVx1NmU5Nlx1MzBhMlx1MzBhZlx1MzBiN1x1MzBlN1x1MzBmM1x1MzA2N1x1MzA1OTogezB9Citqc3AuZXJyb3IudGFnZGlyZWN0aXZlLmJhZGJvZHljb250ZW50PXRhZ1x1NjMwN1x1NzkzYVx1NWI1MFx1NGUyZFx1MzA2ZVx1NzEyMVx1NTJiOVx1MzA2YWJvZHktY29udGVudCAoezB9KVx1MzA2N1x1MzA1OQoranNwLmVycm9yLnNpbXBsZXRhZy5iYWRib2R5Y29udGVudD1cdTMwYWZcdTMwZTlcdTMwYjkgezB9IFx1MzA2ZVRMRFx1MzA2ZlNpbXBsZVRhZ1x1MzA2Ylx1NzEyMVx1NTJiOVx1MzA2YWJvZHktY29udGVudCAoSlNQKVx1MzA5Mlx1NjMwN1x1NWI5YVx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OQoranNwLmVycm9yLmNvbmZpZ19wYWdlZGlyX2VuY29kaW5nX21pc21hdGNoPWpzcC1wcm9wZXJ0eS1ncm91cFx1NGUyZFx1MzA2Ylx1NjMwN1x1NWI5YVx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA4YlBhZ2UtZW5jb2RpbmcgKHswfSkgXHUzMDRjcGFnZVx1NjMwN1x1NzkzYVx1NWI1MFx1NGUyZFx1MzA2ZVx1NjMwN1x1NWI5YSAoezF9KSBcdTMwNjhcdTkwNTVcdTMwNDRcdTMwN2VcdTMwNTkKK2pzcC5lcnJvci5wcm9sb2dfcGFnZWRpcl9lbmNvZGluZ19taXNtYXRjaD1YTUxcdTVjMGVcdTUxNjVcdTkwZThcdTMwNjdcdTYzMDdcdTViOWFcdTMwNTVcdTMwOGNcdTMwNWZwYWdlLWVuY29kaW5nICh7MH0pIFx1MzA0Y3BhZ2VcdTYzMDdcdTc5M2FcdTViNTBcdTRlMmRcdTMwNmVcdTYzMDdcdTViOWEgKHsxfSkgXHUzMDY4XHU5MDU1XHUzMDQ0XHUzMDdlXHUzMDU5Citqc3AuZXJyb3IucHJvbG9nX2NvbmZpZ19lbmNvZGluZ19taXNtYXRjaD1YTUxcdTVjMGVcdTUxNjVcdTkwZThcdTMwNjdcdTYzMDdcdTViOWFcdTMwNTVcdTMwOGNcdTMwNWZwYWdlLWVuY29kaW5nICh7MH0pIFx1MzA0Y2pzcC1wcm9wZXJ0eS1ncm91cFx1NGUyZFx1MzA2ZVx1NjMwN1x1NWI5YVx1MzA2OFx1OTA1NVx1MzA0NFx1MzA3ZVx1MzA1OSAoezF9KQoranNwLmVycm9yLmF0dHJpYnV0ZS5jdXN0b20ubm9uX3J0X3dpdGhfZXhwcj1UTERcdTUzYzhcdTMwNmZcdTMwYmZcdTMwYjBcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTRlMmRcdTMwNmVhdHRyaWJ1dGVcdTYzMDdcdTc5M2FcdTViNTBcdTMwNmJcdTVmOTNcdTMwNjNcdTMwNjZcdTVjNWVcdTYwMjd7MH1cdTMwNmZcdTMwNjlcdTMwOTNcdTMwNmFcdTVmMGZcdTMwODJcdTUzZDdcdTMwNTFcdTRlZDhcdTMwNTFcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC5lcnJvci5hdHRyaWJ1dGUuc3RhbmRhcmQubm9uX3J0X3dpdGhfZXhwcj17MX0gXHU2YTE5XHU2ZTk2XHUzMGEyXHUzMGFmXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDZlIHswfSBcdTVjNWVcdTYwMjdcdTMwNmZcdTMwNjlcdTMwOTNcdTMwNmFcdTVmMGZcdTMwODJcdTUzZDdcdTMwNTFcdTRlZDhcdTMwNTFcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC5lcnJvci5zY3JpcHRpbmcudmFyaWFibGUubWlzc2luZ19uYW1lPVx1NWM1ZVx1NjAyNyB7MH0gXHUzMDRiXHUzMDg5XHUzMGI5XHUzMGFmXHUzMGVhXHUzMGQ3XHUzMGM4XHU1OTA5XHU2NTcwXHU1NDBkXHUzMDkyXHU2YzdhXHU1YjlhXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzCitqYXNwZXIuZXJyb3IuZW1wdHlib2R5Y29udGVudC5ub25lbXB0eT1UTERcdTMwNmJcdTVmOTNcdTMwNjNcdTMwNjZcdTMwYmZcdTMwYjAgezB9IFx1MzA2Zlx1N2E3YVx1MzA2N1x1MzA2YVx1MzA1MVx1MzA4Y1x1MzA3MFx1MzA0NFx1MzA1MVx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzA0Y1x1MzAwMVx1MzA1ZFx1MzA0Nlx1MzA2N1x1MzA2Zlx1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLnRhZ2ZpbGUubmFtZU5vdFVuaXF1ZT17Mn1cdTg4NGNcdTc2ZWVcdTMwNmUgezB9IFx1MzA2ZVx1NTAyNFx1MzA2OCB7MX0gXHUzMDZlXHU1MDI0XHUzMDZmXHU1NDBjXHUzMDU4XHUzMDY3XHUzMDU5Citqc3AuZXJyb3IudGFnZmlsZS5uYW1lRnJvbS5ub0F0dHJpYnV0ZT1cdTMwNTNcdTMwNmVuYW1lLWZyb20tYXR0cmlidXRlXHU1YzVlXHU2MDI3XHUzMDZlXHU1MDI0XHUzMDY3XHUzMDQyXHUzMDhiXHU1MDI0IFwiezB9XCIgXHUzMDZlbmFtZVx1NWM1ZVx1NjAyN1x1MzA5Mlx1NjMwMVx1MzA2NGF0dHJpYnV0ZVx1NjMwN1x1NzkzYVx1NWI1MFx1MzA0Y1x1ODk4Ylx1MzA2NFx1MzA0Ylx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLnRhZ2ZpbGUubmFtZUZyb20uYmFkQXR0cmlidXRlPWF0dHJpYnV0ZVx1NjMwN1x1NzkzYVx1NWI1MCAoezF9XHU4ODRjXHU3NmVlXHUzMDY3XHU1YmEzXHU4YTAwXHUzMDU1XHUzMDhjXHUzMDAxXHUzMDVkXHUzMDZlbmFtZVx1NWM1ZVx1NjAyN1x1MzA0Y1wiezB9XCJcdTMwMDFcdTMwNTNcdTMwNmVuYW1lLWZyb20tYXR0cmlidXRlXHU1YzVlXHU2MDI3XHUzMDZlXHU1MDI0KSBcdTMwNmZqYXZhLmxhbmcuU3RyaW5nXHU1NzhiXHUzMDZlXCJyZXF1aXJlZFwiIFx1MzA2NyBcInJ0ZXhwcnZhbHVlXCIuXHUzMDY3XHUzMDQyXHUzMDYzXHUzMDY2XHUzMDZmXHUzMDQ0XHUzMDUxXHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3IucGFnZS5ub1Nlc3Npb249XHUzMGJiXHUzMGMzXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDZiXHU1MmEwXHUzMDhmXHUzMDYzXHUzMDY2XHUzMDQ0XHUzMDZhXHUzMDQ0XHUzMGRhXHUzMGZjXHUzMGI4XHUzMDZlXHU0ZTJkXHUzMDY3XHUzMDZmXHUzMGJiXHUzMGMzXHUzMGI3XHUzMGU3XHUzMGYzXHUzMGI5XHUzMGIzXHUzMGZjXHUzMGQ3XHUzMDZiXHUzMGEyXHUzMGFmXHUzMGJiXHUzMGI5XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3IudXNlQmVhbi5ub1Nlc3Npb249SlNQXHUzMGRhXHUzMGZjXHUzMGI4XHUzMDRjKHBhZ2VcdTYzMDdcdTc5M2FcdTViNTBcdTMwNmJcdTMwODhcdTMwOGEpXHUzMGJiXHUzMGMzXHUzMGI3XHUzMGU3XHUzMGYzXHU0ZTJkXHUzMDY3XHU1MzU0XHU4YWJmXHUzMDU3XHUzMDZhXHUzMDQ0XHUzMDUzXHUzMDY4XHUzMDkyXHU1YmEzXHU4YTAwXHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDhiXHU2NjQyXHUzMDAxXHUzMGJiXHUzMGMzXHUzMGI3XHUzMGU3XHUzMGYzXHUzMGI5XHUzMGIzXHUzMGZjXHUzMGQ3XHUzMDkyXHU0ZjdmXHU3NTI4XHUzMDU5XHUzMDhiXHUzMDVmXHUzMDgxXHUzMDZldXNlQmVhblx1MzA0Y1x1NGUwZFx1NmI2M1x1MzA2N1x1MzA1OQoranNwLmVycm9yLnhtbC5lbmNvZGluZ0J5dGVPcmRlclVuc3VwcG9ydGVkID0gXHUzMGE4XHUzMGYzXHUzMGIzXHUzMGZjXHUzMGM3XHUzMGEzXHUzMGYzXHUzMGIwIFwiezB9XCIgXHUzMDZiXHU2MzA3XHU1YjlhXHUzMDU1XHUzMDhjXHUzMDVmXHUzMGQwXHUzMGE0XHUzMGM4XHUzMGFhXHUzMGZjXHUzMGMwXHUzMDZmXHUzMGI1XHUzMGRkXHUzMGZjXHUzMGM4XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3IueG1sLmVuY29kaW5nRGVjbEludmFsaWQgPSBcdTcxMjFcdTUyYjlcdTMwNmFcdTMwYThcdTMwZjNcdTMwYjNcdTMwZmNcdTMwYzdcdTMwYTNcdTMwZjNcdTMwYjBcdTU0MGQgXCJ7MH1cIiBcdTMwNjdcdTMwNTkKK2pzcC5lcnJvci54bWwuZW5jb2RpbmdEZWNsUmVxdWlyZWQgPSBcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzhcdTViYTNcdThhMDBcdTRlMmRcdTMwNmJcdTMwYThcdTMwZjNcdTMwYjNcdTMwZmNcdTMwYzdcdTMwYTNcdTMwZjNcdTMwYjBcdTViYTNcdThhMDBcdTMwNGNcdTVmYzVcdTg5ODFcdTMwNjdcdTMwNTkKK2pzcC5lcnJvci54bWwubW9yZVBzZXVkb0F0dHJpYnV0ZXMgPSBcdTMwODhcdTMwOGFcdTU5MWFcdTMwNGZcdTMwNmVcdTc1OTFcdTRmM2NcdTVjNWVcdTYwMjdcdTMwNGNcdTVmYzVcdTg5ODFcdTMwNjdcdTMwNTkKK2pzcC5lcnJvci54bWwubm9Nb3JlUHNldWRvQXR0cmlidXRlcyA9IFx1MzA1M1x1MzA4Y1x1NGVlNVx1NGUwYVx1MzA2ZVx1NzU5MVx1NGYzY1x1NWM1ZVx1NjAyN1x1MzA2Zlx1OGEzMVx1MzA1NVx1MzA4Y1x1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLnhtbC52ZXJzaW9uSW5mb1JlcXVpcmVkID0gWE1MXHU1YmEzXHU4YTAwXHUzMDZlXHU0ZTJkXHUzMDZiXHUzMGQwXHUzMGZjXHUzMGI4XHUzMGU3XHUzMGYzXHUzMDRjXHU1ZmM1XHU4OTgxXHUzMDY3XHUzMDU5Citqc3AuZXJyb3IueG1sLnhtbERlY2xVbnRlcm1pbmF0ZWQgPSBYTUxcdTViYTNcdThhMDBcdTMwNmZcIj8+XCJcdTMwNjdcdTdkNDJcdTMwODlcdTMwNmFcdTMwNTFcdTMwOGNcdTMwNzBcdTMwNDRcdTMwNTFcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC5lcnJvci54bWwucmVzZXJ2ZWRQSVRhcmdldCA9IFwiW3hYXVttTV1bbExdXCJcdTMwNmJcdTRlMDBcdTgxZjRcdTMwNTlcdTMwOGJcdTUxZTZcdTc0MDZcdTU0N2RcdTRlZTRcdTMwYmZcdTMwZmNcdTMwYjJcdTMwYzNcdTMwYzhcdTMwNmZcdThhMzFcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC5lcnJvci54bWwuc3BhY2VSZXF1aXJlZEluUEkgPSBcdTdhN2FcdTc2N2RcdTMwNGNcdTUxZTZcdTc0MDZcdTU0N2RcdTRlZTRcdTMwYmZcdTMwZmNcdTMwYjJcdTMwYzNcdTMwYzhcdTMwNjhcdTMwYzdcdTMwZmNcdTMwYmZcdTMwNmVcdTk1OTNcdTMwNmJcdTVmYzVcdTg5ODFcdTMwNjdcdTMwNTkKK2pzcC5lcnJvci54bWwuaW52YWxpZENoYXJJbkNvbnRlbnQgPSBcdTMwYzlcdTMwYWRcdTMwZTVcdTMwZTFcdTMwZjNcdTMwYzhcdTMwNmVcdTcxMjFcdTUyYjlcdTMwNmFYTUxcdTY1ODdcdTViNTcgKFVuaWNvZGU6IDB4ezB9KSBcdTMwNGNcdTMwYzlcdTMwYWRcdTMwZTVcdTMwZTFcdTMwZjNcdTMwYzhcdTMwNmVcdTg5ODFcdTdkMjBcdTUxODVcdTViYjlcdTMwNmVcdTRlMmRcdTMwNmJcdTg5OGJcdTMwNjRcdTMwNGJcdTMwOGFcdTMwN2VcdTMwNTdcdTMwNWYKK2pzcC5lcnJvci54bWwuc3BhY2VSZXF1aXJlZEJlZm9yZVN0YW5kYWxvbmUgPSBYTUxcdTViYTNcdThhMDBcdTMwNmVlbmNvZGluZ1x1NzU5MVx1NGYzY1x1NWM1ZVx1NjAyN1x1MzA2ZVx1NTI0ZFx1MzA2Ylx1N2E3YVx1NzY3ZFx1MzA0Y1x1NWZjNVx1ODk4MVx1MzA2N1x1MzA1OQoranNwLmVycm9yLnhtbC5zZERlY2xJbnZhbGlkID0gXHUzMGI5XHUzMGJmXHUzMGYzXHUzMGM5XHUzMGEyXHUzMGVkXHUzMGYzXHU2NTg3XHU2NmY4XHU1YmEzXHU4YTAwXHU1MDI0XHUzMDZmXCJ5ZXNcIlx1NTNjOFx1MzA2Zlwibm9cIlx1MzA2ZVx1MzA2OVx1MzA2MVx1MzA4OVx1MzA0Ylx1MzA2N1x1MzA0Mlx1MzA4YVx1MzAwMVwiezB9XCJcdTMwNjdcdTMwNmZcdTMwNDRcdTMwNTFcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC5lcnJvci54bWwuaW52YWxpZENoYXJJblBJID0gXHU3MTIxXHU1MmI5XHUzMDZhWE1MXHU2NTg3XHU1YjU3IChVbmljb2RlOiAweHswfSkgXHUzMDRjXHU1NDdkXHU0ZWU0XHU1MWU2XHU3NDA2XHU0ZTJkXHUzMDZiXHU4OThiXHUzMDY0XHUzMDRiXHUzMDhhXHUzMDdlXHUzMDU3XHUzMDVmCitqc3AuZXJyb3IueG1sLnZlcnNpb25Ob3RTdXBwb3J0ZWQgPSBYTUxcdTMwZDBcdTMwZmNcdTMwYjhcdTMwZTdcdTMwZjMgXCJ7MH1cIiBcdTMwNmZcdTMwYjVcdTMwZGRcdTMwZmNcdTMwYzhcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDFYTUwgMS4wXHUzMDYwXHUzMDUxXHUzMDkyXHUzMGI1XHUzMGRkXHUzMGZjXHUzMGM4XHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5Citqc3AuZXJyb3IueG1sLnBzZXVkb0F0dHJOYW1lRXhwZWN0ZWQgPSBcdTc1OTFcdTRmM2NcdTVjNWVcdTYwMjdcdTU0MGRcdTMwNGNcdTVmYzVcdTg5ODFcdTMwNjdcdTMwNTkKK2pzcC5lcnJvci54bWwuZXhwZWN0ZWRCeXRlID17MX1cdTMwZDBcdTMwYTRcdTMwYzhVVEYtOFx1MzBiN1x1MzBmY1x1MzBiMVx1MzBmM1x1MzBiOVx1MzA2ZVx1MzBkMFx1MzBhNFx1MzBjOCB7MH0gXHUzMDRjXHU1ZmM1XHU4OTgxXHUzMDY3XHUzMDU5Citqc3AuZXJyb3IueG1sLmludmFsaWRCeXRlID0gezF9XHUzMGQwXHUzMGE0XHUzMGM4VVRGLThcdTMwYjdcdTMwZmNcdTMwYjFcdTMwZjNcdTMwYjlcdTMwNmVcdTcxMjFcdTUyYjlcdTMwNmFcdTMwZDBcdTMwYTRcdTMwYzggezB9IFx1MzA2N1x1MzA1OQoranNwLmVycm9yLnhtbC5vcGVyYXRpb25Ob3RTdXBwb3J0ZWQgPSB7MX0gcmVhZGVyXHUzMDZmXHU2NGNkXHU0ZjVjIFwiezB9XCIgXHUzMDkyXHUzMGI1XHUzMGRkXHUzMGZjXHUzMGM4XHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3IueG1sLmludmFsaWRIaWdoU3Vycm9nYXRlID0gVVRGLThcdTMwYjdcdTMwZmNcdTMwYjFcdTMwZjNcdTMwYjlcdTMwNmVcdTMwY2ZcdTMwYTRcdTMwYjVcdTMwZWRcdTMwYjJcdTMwZmNcdTMwYzhcdTMwZDNcdTMwYzNcdTMwYzhcdTMwNmYweDEwXHUzMDkyXHU4ZDhhXHUzMDQ4XHUzMDY2XHUzMDZmXHUzMDQ0XHUzMDUxXHUzMDdlXHUzMDViXHUzMDkzXHUzMDRjXHUzMDAxMHh7MH1cdTMwNGNcdTg5OGJcdTMwNjRcdTMwNGJcdTMwOGFcdTMwN2VcdTMwNTdcdTMwNWYKK2pzcC5lcnJvci54bWwuaW52YWxpZEFTQ0lJID0gXHUzMGQwXHUzMGE0XHUzMGM4IFwiezB9XCIgXHUzMDZmN1x1MzBkM1x1MzBjM1x1MzBjOEFTQ0lJXHUzMDY3XHUzMDZmXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3IueG1sLnNwYWNlUmVxdWlyZWRCZWZvcmVFbmNvZGluZ0luWE1MRGVjbCA9IFhNTFx1NWJhM1x1OGEwMFx1MzA2ZWVuY29kaW5nXHU3NTkxXHU0ZjNjXHU1YzVlXHU2MDI3XHUzMDZlXHU1MjRkXHUzMDZiXHU3YTdhXHU3NjdkXHUzMDRjXHU1ZmM1XHU4OTgxXHUzMDY3XHUzMDU5Citqc3AuZXJyb3IueG1sLnNwYWNlUmVxdWlyZWRCZWZvcmVFbmNvZGluZ0luVGV4dERlY2wgPSBcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzhcdTViYTNcdThhMDBcdTMwNmVlbmNvZGluZ1x1NzU5MVx1NGYzY1x1NWM1ZVx1NjAyN1x1MzA2ZVx1NTI0ZFx1MzA2Ylx1N2E3YVx1NzY3ZFx1MzA0Y1x1NWZjNVx1ODk4MVx1MzA2N1x1MzA1OQoranNwLmVycm9yLnhtbC5zcGFjZVJlcXVpcmVkQmVmb3JlVmVyc2lvbkluVGV4dERlY2wgPSBcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzhcdTViYTNcdThhMDBcdTMwNmV2ZXJzaW9uXHU3NTkxXHU0ZjNjXHU1YzVlXHU2MDI3XHUzMDZlXHU1MjRkXHUzMDZiXHU3YTdhXHU3NjdkXHUzMDRjXHU1ZmM1XHU4OTgxXHUzMDY3XHUzMDU5Citqc3AuZXJyb3IueG1sLnNwYWNlUmVxdWlyZWRCZWZvcmVWZXJzaW9uSW5YTUxEZWNsID0gWE1MXHU1YmEzXHU4YTAwXHUzMDZldmVyc2lvblx1NzU5MVx1NGYzY1x1NWM1ZVx1NjAyN1x1MzA2ZVx1NTI0ZFx1MzA2Ylx1N2E3YVx1NzY3ZFx1MzA0Y1x1NWZjNVx1ODk4MVx1MzA2N1x1MzA1OQoranNwLmVycm9yLnhtbC5lcVJlcXVpcmVkSW5YTUxEZWNsID0gWE1MXHU1YmEzXHU4YTAwXHU0ZTJkXHUzMDY3XCJ7MH1cIlx1MzA2ZVx1NmIyMVx1MzA2YicnID0gJycgXHU2NTg3XHU1YjU3XHUzMDRjXHU3ZDlhXHUzMDRiXHUzMDZhXHUzMDUxXHUzMDhjXHUzMDcwXHUzMDQ0XHUzMDUxXHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3IueG1sLmVxUmVxdWlyZWRJblRleHREZWNsID0gXHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4XHU1YmEzXHU4YTAwXHU0ZTJkXHUzMDY3XCJ7MH1cIlx1MzA2ZVx1NmIyMVx1MzA2YicnID0gJydcdTY1ODdcdTViNTdcdTMwNGNcdTdkOWFcdTMwNGJcdTMwNmFcdTMwNTFcdTMwOGNcdTMwNzBcdTMwNDRcdTMwNTFcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC5lcnJvci54bWwucXVvdGVSZXF1aXJlZEluVGV4dERlY2wgPSBcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzhcdTViYTNcdThhMDBcdTRlMmRcdTMwNmVcInswfVwiXHUzMDZiXHU3ZDlhXHUzMDRmXHU1MDI0XHUzMDZmXHUzMGFmXHUzMGFhXHUzMGZjXHUzMGM4XHUzMDY3XHU1NmYyXHUzMDdlXHUzMDhjXHUzMDVmXHU2NTg3XHU1YjU3XHU1MjE3XHUzMDY3XHUzMDZhXHUzMDUxXHUzMDhjXHUzMDcwXHUzMDQ0XHUzMDUxXHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3IueG1sLnF1b3RlUmVxdWlyZWRJblhNTERlY2wgPSBYTUxcdTViYTNcdThhMDBcdTRlMmRcdTMwNmVcInswfVwiXHUzMDZiXHU3ZDlhXHUzMDRmXHU1MDI0XHUzMDZmXHUzMGFmXHUzMGFhXHUzMGZjXHUzMGM4XHUzMDY3XHU1NmYyXHUzMDdlXHUzMDhjXHUzMDVmXHU2NTg3XHU1YjU3XHU1MjE3XHUzMDY3XHUzMDZhXHUzMDUxXHUzMDhjXHUzMDcwXHUzMDQ0XHUzMDUxXHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3IueG1sLmludmFsaWRDaGFySW5UZXh0RGVjbCA9IFx1MzBjNlx1MzBhZFx1MzBiOVx1MzBjOFx1NWJhM1x1OGEwMFx1MzA2ZVx1NGUyZFx1MzA2Ylx1NzEyMVx1NTJiOVx1MzA2YVhNTFx1NjU4N1x1NWI1NyAoVW5pY29kZTogMHh7MH0pIFx1MzA0Y1x1ODk4Ylx1MzA2NFx1MzA0Ylx1MzA4YVx1MzA3ZVx1MzA1N1x1MzA1ZgoranNwLmVycm9yLnhtbC5pbnZhbGlkQ2hhckluWE1MRGVjbCA9IFhNTFx1NWJhM1x1OGEwMFx1MzA2ZVx1NGUyZFx1MzA2Ylx1NzEyMVx1NTJiOVx1MzA2YVhNTFx1NjU4N1x1NWI1NyAoVW5pY29kZTogMHh7MH0pIFx1MzA0Y1x1ODk4Ylx1MzA2NFx1MzA0Ylx1MzA4YVx1MzA3ZVx1MzA1N1x1MzA1ZgoranNwLmVycm9yLnhtbC5jbG9zZVF1b3RlTWlzc2luZ0luVGV4dERlY2wgPSBcdTMwYzZcdTMwYWRcdTMwYjlcdTMwYzhcdTViYTNcdThhMDBcdTRlMmRcdTMwNmVcInswfVwiXHUzMDZiXHU3ZDlhXHUzMDRmXHU1MDI0XHUzMDZlXHU0ZTJkXHUzMDZlXHU2NzAwXHU1ZjhjXHUzMDZlXHUzMGFmXHUzMGFhXHUzMGZjXHUzMGM4XHUzMDRjXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3IueG1sLmNsb3NlUXVvdGVNaXNzaW5nSW5YTUxEZWNsID0gWE1MXHU1YmEzXHU4YTAwXHU0ZTJkXHUzMDZlXCJ7MH1cIlx1MzA2Ylx1N2Q5YVx1MzA0Zlx1NTAyNFx1MzA2ZVx1NGUyZFx1MzA2ZVx1NjcwMFx1NWY4Y1x1MzA2ZVx1MzBhZlx1MzBhYVx1MzBmY1x1MzBjOFx1MzA0Y1x1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLnhtbC5pbnZhbGlkSGlnaFN1cnJvZ2F0ZSA9IFVURi04XHUzMGI3XHUzMGZjXHUzMGIxXHUzMGYzXHUzMGI5XHUzMDZlXHUzMGNmXHUzMGE0XHUzMGI1XHUzMGVkXHUzMGIyXHUzMGZjXHUzMGM4XHUzMGQzXHUzMGMzXHUzMGM4XHUzMDZmMHgxMFx1MzA5Mlx1OGQ4YVx1MzA0OFx1MzA2Nlx1MzA2Zlx1MzA0NFx1MzA1MVx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzA0Y1x1MzAwMTB4ezB9XHUzMDRjXHU4OThiXHUzMDY0XHUzMDRiXHUzMDhhXHUzMDdlXHUzMDU3XHUzMDVmCitqc3AuZXJyb3IubXVsdGlwbGUuanNwID0gXHU4OTA3XHU2NTcwXHUzMDZlXHU0ZWQ1XHU2OWQ4XHUzMDkyXHU2ZTgwXHUzMDVmXHUzMDU5XHUzMDUzXHUzMDY4XHUzMDZmXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3IuanNwb3V0cHV0LmNvbmZsaWN0PSZsdDtqc3A6b3V0cHV0Jmd0OzogXCJ7MH1cIlx1MzA2Ylx1NzU3MFx1MzA2YVx1MzA4Ylx1NTAyNFx1MzA5Mlx1ODkwN1x1NjU3MFx1NTZkZVx1NjMwN1x1NWI5YVx1MzA1OVx1MzA4Ylx1MzA2ZVx1MzA2Zlx1NzEyMVx1NTJiOVx1MzA2N1x1MzA1OSAoXHU2NWU3OiB7MX0sIFx1NjViMDogezJ9KQoranNwLmVycm9yLmpzcG91dHB1dC5kb2N0eXBlbmFtZXN5c3RlbT0mbHQ7anNwOm91dHB1dCZndDs6ICdkb2N0eXBlLXJvb3QtZWxlbWVudCcgXHU1M2NhXHUzMDczICdkb2N0eXBlLXN5c3RlbScgXHU1YzVlXHU2MDI3XHUzMDZmXHU1NDBjXHU2NjQyXHUzMDZiXHU2MzA3XHU1YjlhXHUzMDU3XHUzMDZhXHUzMDUxXHUzMDhjXHUzMDcwXHUzMDQ0XHUzMDUxXHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3IuanNwb3V0cHV0LmRvY3R5cGVwdWxpY3N5c3RlbT0mbHQ7anNwOm91dHB1dCZndDs6ICdkb2N0eXBlLXB1YmxpYydcdTVjNWVcdTYwMjdcdTMwOTJcdTYzMDdcdTViOWFcdTMwNTlcdTMwOGJcdTU4MzRcdTU0MDhcdTMwNmZcdTMwMDEnZG9jdHlwZS1zeXN0ZW0nIFx1NWM1ZVx1NjAyN1x1MzA4Mlx1NjMwN1x1NWI5YVx1MzA1N1x1MzA2YVx1MzA1MVx1MzA4Y1x1MzA3MFx1MzA0NFx1MzA1MVx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLmpzcG91dHB1dC5ub25lbXB0eWJvZHk9Jmx0O2pzcDpvdXRwdXQmZ3Q7IFx1MzBkY1x1MzBjN1x1MzBhM1x1MzA5Mlx1NjMwMVx1MzA2M1x1MzA2Nlx1MzA2Zlx1MzA0NFx1MzA1MVx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLmpzcG91dHB1dC5pbnZhbGlkVXNlPSZsdDtqc3A6b3V0cHV0Jmd0OyBcdTZhMTlcdTZlOTZcdTY5Y2JcdTY1ODdcdTMwNmVcdTRlMmRcdTMwNjdcdTRmN2ZcdTc1MjhcdTMwNTdcdTMwNjZcdTMwNmZcdTMwNDRcdTMwNTFcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC5lcnJvci5hdHRyaWJ1dGVzLm5vdC5hbGxvd2VkID0gezB9IFx1MzA2Zlx1NWM1ZVx1NjAyN1x1MzA5Mlx1NjMwMVx1MzA2NFx1MzA1M1x1MzA2OFx1MzA2Zlx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLnRhZ2ZpbGUuYmFkU3VmZml4PVx1MzBiZlx1MzBiMFx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzBkMVx1MzBiOSB7MH0gXHUzMDZlXHU0ZTJkXHUzMDZiXCIudGFnXCIgXHU2MmUxXHU1ZjM1XHU1YjUwXHUzMDRjXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3IudGFnZmlsZS5pbGxlZ2FsUGF0aD1cdTRlMGRcdTZiNjNcdTMwNmFcdTMwYmZcdTMwYjBcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTMwZDFcdTMwYjlcdTMwNjdcdTMwNTk6IHswfVx1MzAwMVx1MzA1M1x1MzA4Y1x1MzA2ZlwiL1dFQi1JTkYvdGFnc1wiXHU1M2M4XHUzMDZmXCIvTUVUQS1JTkYvdGFnc1wiXHUzMDY3XHU1OWNiXHUzMDdlXHUzMDg5XHUzMDZhXHUzMDUxXHUzMDhjXHUzMDcwXHUzMDQ0XHUzMDUxXHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3IucGx1Z2luLndyb25nUm9vdEVsZW1lbnQ9ezB9IFx1MzA2ZVx1NGUyZFx1MzA2ZVx1MzBlYlx1MzBmY1x1MzBjOFx1ODk4MVx1N2QyMFx1MzA2ZVx1NTQwZFx1NTI0ZFx1MzA2ZiB7MX0gXHUzMDY3XHUzMDZmXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3IuYXR0cmlidXRlLmludmFsaWRQcmVmaXg9XHU1YzVlXHU2MDI3XHUzMDZlXHUzMGQ3XHUzMGVjXHUzMGQ1XHUzMGEzXHUzMGMzXHUzMGFmXHUzMGI5IHswfSBcdTMwNmZcdTMwNjlcdTMwNmVcdTUzZDZcdTMwOGFcdThmYmNcdTMwN2VcdTMwOGNcdTMwNWZcdTMwYmZcdTMwYjBcdTMwZTlcdTMwYTRcdTMwZDZcdTMwZTlcdTMwZWFcdTMwNmJcdTMwODJcdTViZmVcdTVmZGNcdTMwNTdcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC5lcnJvci5uZXN0ZWQuanNwYXR0cmlidXRlPWpzcDphdHRyaWJ1dGVcdTZhMTlcdTZlOTZcdTMwYTJcdTMwYWZcdTMwYjdcdTMwZTdcdTMwZjNcdTMwNmZcdTUyMjVcdTMwNmVqc3A6YXR0cmlidXRlXHU2YTE5XHU2ZTk2XHUzMGEyXHUzMGFmXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDZlXHU3YmM0XHU1NmYyXHU1MTg1XHUzMDY3XHUzMGNkXHUzMGI5XHUzMGM4XHUzMDU5XHUzMDhiXHUzMDUzXHUzMDY4XHUzMDZmXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3IubmVzdGVkLmpzcGJvZHk9anNwOmJvZHlcdTZhMTlcdTZlOTZcdTMwYTJcdTMwYWZcdTMwYjdcdTMwZTdcdTMwZjNcdTMwNmZcdTUyMjVcdTMwNmVqc3A6Ym9keVx1NTNjOFx1MzA2ZmpzcDphdHRyaWJ1dGVcdTZhMTlcdTZlOTZcdTMwYTJcdTMwYWZcdTMwYjdcdTMwZTdcdTMwZjNcdTMwNmVcdTdiYzRcdTU2ZjJcdTUxODVcdTMwNjdcdTMwY2RcdTMwYjlcdTMwYzhcdTMwNTlcdTMwOGJcdTMwNTNcdTMwNjhcdTMwNmZcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC5lcnJvci52YXJpYWJsZS5laXRoZXIubmFtZT1uYW1lLWdpdmVuXHU1M2M4XHUzMDZmbmFtZS1mcm9tLWF0dHJpYnV0ZVx1NWM1ZVx1NjAyN1x1MzA2ZVx1MzA2OVx1MzA2MVx1MzA4OVx1MzA0Ylx1MzA5MnZhcmlhYmxlXHU2MzA3XHU3OTNhXHU1YjUwXHUzMDZlXHU0ZTJkXHUzMDY3XHU2MzA3XHU1YjlhXHUzMDU1XHUzMDhjXHUzMDZhXHUzMDUxXHUzMDhjXHUzMDcwXHUzMDQ0XHUzMDUxXHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3IudmFyaWFibGUuYm90aC5uYW1lPXZhcmlhYmxlXHU2MzA3XHU3OTNhXHU1YjUwXHU0ZTJkXHUzMDY3bmFtZS1naXZlblx1MzA2OG5hbWUtZnJvbS1hdHRyaWJ1dGVcdTVjNWVcdTYwMjdcdTMwNmVcdTRlMjFcdTY1YjlcdTMwOTJcdTYzMDdcdTViOWFcdTMwNTlcdTMwOGJcdTMwNTNcdTMwNjhcdTMwNmZcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC5lcnJvci52YXJpYWJsZS5hbGlhcz1uYW1lLWZyb20tYXR0cmlidXRlXHUzMDRhXHUzMDg4XHUzMDczYWxpYXNcdTVjNWVcdTYwMjdcdTMwNmVcdTRlMjFcdTY1YjlcdTMwOTJ2YXJpYWJsZVx1NjMwN1x1NzkzYVx1NWI1MFx1NGUyZFx1MzA2Ylx1NjMwN1x1NWI5YVx1MzA1OVx1MzA4Ylx1MzAwMVx1NTNjOFx1MzA2Zlx1MzA2OVx1MzA2MVx1MzA4OVx1MzA4Mlx1NjMwN1x1NWI5YVx1MzA1N1x1MzA2YVx1MzA0NFx1MzA1M1x1MzA2OFx1MzA0Y1x1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1OQoranNwLmVycm9yLmF0dHJpYnV0ZS5udWxsX25hbWU9XHU3YTdhXHUzMDZlXHU1YzVlXHU2MDI3XHU1NDBkXHUzMDY3XHUzMDU5Citqc3AuZXJyb3IuanNwdGV4dC5iYWRjb250ZW50PVwnJmx0O1wnXHUzMDRjJmx0O2pzcDp0ZXh0Jmd0O1x1MzA2ZVx1MzBkY1x1MzBjN1x1MzBhM1x1MzA2ZVx1NGUyZFx1MzA2Ylx1NzNmZVx1MzA4Y1x1MzA4Ylx1NjY0Mlx1MzA2Zlx1MzAwMUNEQVRBXHUzMDZlXHU0ZTJkXHUzMDZiXHU5NmEwXHU4NTNkXHUzMDU3XHUzMDZhXHUzMDUxXHUzMDhjXHUzMDcwXHUzMDQ0XHUzMDUxXHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3IuanNwcm9vdC52ZXJzaW9uLmludmFsaWQ9XHU3MTIxXHU1MmI5XHUzMDZhXHUzMGQwXHUzMGZjXHUzMGI4XHUzMGU3XHUzMGYzXHU3NTZhXHU1M2Y3XHUzMDY3XHUzMDU5OiBcInswfVwiXHUzMDAxXCIxLjJcIiBcdTUzYzhcdTMwNmYgXCIyLjBcIlx1MzAwMFx1MzA2N1x1MzA2YVx1MzA1MVx1MzA4Y1x1MzA3MFx1MzA0NFx1MzA1MVx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLm5vRnVuY3Rpb25QcmVmaXg9XHUzMGM3XHUzMGQ1XHUzMGE5XHUzMGViXHUzMGM4XHUzMDZlXHU1NDBkXHU1MjRkXHU3YTdhXHU5NTkzXHUzMDRjXHU2MzA3XHU1YjlhXHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDZhXHUzMDQ0XHU2NjQyXHUzMDZiXHUzMDZmXHUzMDAxXHU5NWEyXHU2NTcwIHswfSBcdTMwNmZcdTMwZDdcdTMwZWFcdTMwZDVcdTMwYTNcdTMwYWZcdTMwYjlcdTRlZDhcdTMwNGRcdTMwNjdcdTRmN2ZcdTc1MjhcdTMwNTdcdTMwNmFcdTMwNTFcdTMwOGNcdTMwNzBcdTMwNDRcdTMwNTFcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC5lcnJvci5ub0Z1bmN0aW9uPVx1OTVhMlx1NjU3MCB7MH0gXHUzMDkyXHU2MzA3XHU1YjlhXHUzMDU1XHUzMDhjXHUzMDVmXHUzMGQ3XHUzMGVhXHUzMGQ1XHUzMGEzXHUzMGFmXHUzMGI5XHUzMDY3XHU5MTRkXHU3ZjZlXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3Iubm9GdW5jdGlvbk1ldGhvZD1cdTk1YTJcdTY1NzAgXCJ7MX1cIiBcdTMwNmVcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzkgXCJ7MH1cIiBcdTMwNGMgXCJ7Mn1cIiBcdTRlMmRcdTMwNjdcdTg5OGJcdTMwNjRcdTMwNGJcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTMKK2pzcC5lcnJvci5mdW5jdGlvbi5jbGFzc25vdGZvdW5kPVRMRFx1MzA2ZVx1NGUyZFx1MzA2N1x1OTVhMlx1NjU3MCB7MX0gXHUzMDZiXHU2MzA3XHU1YjlhXHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDhiXHUzMGFmXHUzMGU5XHUzMGI5IHswfSBcdTMwNGNcdTg5OGJcdTMwNjRcdTMwNGJcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTM6IHsyfQoranNwLmVycm9yLnNpZ25hdHVyZS5jbGFzc25vdGZvdW5kPVRMRFx1MzA2ZVx1NGUyZFx1MzA2ZVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzBiN1x1MzBiMFx1MzBjZFx1MzBjMVx1MzBlM1x1MzA2N1x1OTVhMlx1NjU3MCB7MX0gXHUzMDZiXHU2MzA3XHU1YjlhXHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDhiXHUzMGFmXHUzMGU5XHUzMGI5IHswfSBcdTMwNGNcdTg5OGJcdTMwNjRcdTMwNGJcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDIgezJ9Citqc3AuZXJyb3IudGV4dC5oYXNfc3ViZWxlbWVudD0mbHQ7anNwOnRleHQmZ3Q7IFx1MzA2Zlx1NTI2Zlx1ODk4MVx1N2QyMFx1MzA5Mlx1NjMwMVx1MzA2M1x1MzA2Nlx1MzA2Zlx1MzA0NFx1MzA1MVx1MzA3ZVx1MzA1Ylx1MzA5MworanNwLmVycm9yLmRhdGEuZmlsZS5yZWFkPVx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYiBcInswfVwiIFx1MzA5Mlx1OGFhZFx1MzA3Zlx1OGZiY1x1MzA3Zlx1NGUyZFx1MzA2Ylx1MzBhOFx1MzBlOVx1MzBmY1x1MzA0Y1x1NzY3YVx1NzUxZlx1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1ZgoranNwLmVycm9yLnByZWZpeC5yZWZpbmVkPVx1MzBkN1x1MzBlYVx1MzBkNVx1MzBhM1x1MzBjM1x1MzBhZlx1MzBiOSB7MH0gXHUzMDRjXHU3M2ZlXHU1NzI4XHUzMDZlXHUzMGI5XHUzMGIzXHUzMGZjXHUzMGQ3XHU0ZTJkXHUzMDY3XHU2NWUyXHUzMDZiIHsyfSBcdTMwNjhcdTViOWFcdTdmYTlcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwOGJcdTMwNmVcdTMwNjcgezF9IFx1MzA2Ylx1NTE4ZFx1NWI5YVx1N2ZhOVx1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1ZgoranNwLmVycm9yLm5lc3RlZF9qc3Byb290PVx1NTE2NVx1MzA4Y1x1NWI1MFx1MzA2Ylx1MzA2YVx1MzA2M1x1MzA1ZiAmbHQ7anNwOnJvb3QmZ3Q7IFx1MzA2N1x1MzA1OQoranNwLmVycm9yLnVuYmFsYW5jZWQuZW5kdGFnPVx1N2Q0Mlx1NGU4Nlx1MzBiZlx1MzBiMCBcIiZsdDsvezB9XCIgXHUzMDZlXHU1YmZlXHU1ZmRjXHUzMDRjXHU1M2Q2XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzCitqc3AuZXJyb3IuaW52YWxpZC5iZWFuPXVzZUJlYW5cdTMwNmVcdTMwYWZcdTMwZTlcdTMwYjlcdTVjNWVcdTYwMjcgezB9IFx1MzA2ZVx1NTAyNFx1MzA0Y1x1NzEyMVx1NTJiOVx1MzA2N1x1MzA1OQoranNwLmVycm9yLnByZWZpeC51c2VfYmVmb3JlX2RjbD1cdTMwNTNcdTMwNmVcdTMwYmZcdTMwYjBcdTYzMDdcdTc5M2FcdTViNTBcdTMwNjdcdTYzMDdcdTViOWFcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwOGJcdTMwZDdcdTMwZWFcdTMwZDVcdTMwYTNcdTMwYzNcdTMwYWZcdTMwYjkgezB9IFx1MzA2Zlx1MzAwMVx1MzA1OVx1MzA2N1x1MzA2Ylx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYiB7MX0gXHUzMDZlIHsyfSBcdTg4NGNcdTc2ZWVcdTMwNmVcdTMwYTJcdTMwYWZcdTMwYjdcdTMwZTdcdTMwZjNcdTMwNjdcdTRmN2ZcdTc1MjhcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkKKwpkaWZmIC0tZ2l0IGEvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3J1bnRpbWUvQm9keUNvbnRlbnRJbXBsLmphdmEgYi9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvcnVudGltZS9Cb2R5Q29udGVudEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzg0NmI3Ci0tLSAvZGV2L251bGwKKysrIGIvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3J1bnRpbWUvQm9keUNvbnRlbnRJbXBsLmphdmEKQEAgLTAsMCArMSw2MDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphc3Blci5ydW50aW1lOworCitpbXBvcnQgamF2YS5pby5DaGFyQXJyYXlSZWFkZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLldyaXRlcjsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLkpzcFdyaXRlcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuQm9keUNvbnRlbnQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5Db25zdGFudHM7CisKKy8qKgorICogV3JpdGUgdGV4dCB0byBhIGNoYXJhY3Rlci1vdXRwdXQgc3RyZWFtLCBidWZmZXJpbmcgY2hhcmFjdGVycyBzbyBhcworICogdG8gcHJvdmlkZSBmb3IgdGhlIGVmZmljaWVudCB3cml0aW5nIG9mIHNpbmdsZSBjaGFyYWN0ZXJzLCBhcnJheXMsCisgKiBhbmQgc3RyaW5ncy4gCisgKgorICogUHJvdmlkZSBzdXBwb3J0IGZvciBkaXNjYXJkaW5nIGZvciB0aGUgb3V0cHV0IHRoYXQgaGFzIGJlZW4gYnVmZmVyZWQuIAorICoKKyAqIEBhdXRob3IgUmFqaXYgTW9yZGFuaQorICogQGF1dGhvciBKYW4gTHVlaGUKKyAqLworcHVibGljIGNsYXNzIEJvZHlDb250ZW50SW1wbCBleHRlbmRzIEJvZHlDb250ZW50IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5FX1NFUEFSQVRPUiA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGluZS5zZXBhcmF0b3IiKTsKKworICAgIHByaXZhdGUgY2hhcltdIGNiOworICAgIHByaXZhdGUgaW50IG5leHRDaGFyOworICAgIHByaXZhdGUgYm9vbGVhbiBjbG9zZWQ7CisKKyAgICAvLyBFbmNsb3NlZCB3cml0ZXIgdG8gd2hpY2ggYW55IG91dHB1dCBpcyB3cml0dGVuCisgICAgcHJpdmF0ZSBXcml0ZXIgd3JpdGVyOworCisgICAgLy8gU2VlIGNvbW1lbnQgaW4gc2V0V3JpdGVyKCkKKyAgICBwcml2YXRlIGludCBidWZmZXJTaXplU2F2ZTsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLgorICAgICAqLworICAgIHB1YmxpYyBCb2R5Q29udGVudEltcGwoSnNwV3JpdGVyIGVuY2xvc2luZ1dyaXRlcikgeworICAgICAgICBzdXBlcihlbmNsb3NpbmdXcml0ZXIpOworCWJ1ZmZlclNpemUgPSBDb25zdGFudHMuREVGQVVMVF9UQUdfQlVGRkVSX1NJWkU7CisJY2IgPSBuZXcgY2hhcltidWZmZXJTaXplXTsKKwluZXh0Q2hhciA9IDA7CisJY2xvc2VkID0gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGUgYSBzaW5nbGUgY2hhcmFjdGVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHdyaXRlKGludCBjKSB0aHJvd3MgSU9FeGNlcHRpb24geworCWlmICh3cml0ZXIgIT0gbnVsbCkgeworCSAgICB3cml0ZXIud3JpdGUoYyk7CisJfSBlbHNlIHsKKwkgICAgZW5zdXJlT3BlbigpOworCSAgICBpZiAobmV4dENoYXIgPj0gYnVmZmVyU2l6ZSkgeworCQlyZUFsbG9jQnVmZiAoMSk7CisJICAgIH0KKwkgICAgY2JbbmV4dENoYXIrK10gPSAoY2hhcikgYzsKKwl9CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGUgYSBwb3J0aW9uIG9mIGFuIGFycmF5IG9mIGNoYXJhY3RlcnMuCisgICAgICoKKyAgICAgKiA8cD4gT3JkaW5hcmlseSB0aGlzIG1ldGhvZCBzdG9yZXMgY2hhcmFjdGVycyBmcm9tIHRoZSBnaXZlbiBhcnJheSBpbnRvCisgICAgICogdGhpcyBzdHJlYW0ncyBidWZmZXIsIGZsdXNoaW5nIHRoZSBidWZmZXIgdG8gdGhlIHVuZGVybHlpbmcgc3RyZWFtIGFzCisgICAgICogbmVlZGVkLiAgSWYgdGhlIHJlcXVlc3RlZCBsZW5ndGggaXMgYXQgbGVhc3QgYXMgbGFyZ2UgYXMgdGhlIGJ1ZmZlciwKKyAgICAgKiBob3dldmVyLCB0aGVuIHRoaXMgbWV0aG9kIHdpbGwgZmx1c2ggdGhlIGJ1ZmZlciBhbmQgd3JpdGUgdGhlIGNoYXJhY3RlcnMKKyAgICAgKiBkaXJlY3RseSB0byB0aGUgdW5kZXJseWluZyBzdHJlYW0uICBUaHVzIHJlZHVuZGFudAorICAgICAqIDxjb2RlPkRpc2NhcmRhYmxlQnVmZmVyZWRXcml0ZXI8L2NvZGU+cyB3aWxsIG5vdCBjb3B5IGRhdGEKKyAgICAgKiB1bm5lY2Vzc2FyaWx5LgorICAgICAqCisgICAgICogQHBhcmFtIGNidWYgQSBjaGFyYWN0ZXIgYXJyYXkKKyAgICAgKiBAcGFyYW0gb2ZmIE9mZnNldCBmcm9tIHdoaWNoIHRvIHN0YXJ0IHJlYWRpbmcgY2hhcmFjdGVycworICAgICAqIEBwYXJhbSBsZW4gTnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gd3JpdGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3cml0ZShjaGFyW10gY2J1ZiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlpZiAod3JpdGVyICE9IG51bGwpIHsKKwkgICAgd3JpdGVyLndyaXRlKGNidWYsIG9mZiwgbGVuKTsKKwl9IGVsc2UgeworCSAgICBlbnN1cmVPcGVuKCk7CisKKwkgICAgaWYgKChvZmYgPCAwKSB8fCAob2ZmID4gY2J1Zi5sZW5ndGgpIHx8IChsZW4gPCAwKSB8fAorCQkoKG9mZiArIGxlbikgPiBjYnVmLmxlbmd0aCkgfHwgKChvZmYgKyBsZW4pIDwgMCkpIHsKKwkJdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKKwkgICAgfSBlbHNlIGlmIChsZW4gPT0gMCkgeworCQlyZXR1cm47CisJICAgIH0gCisJICAgIAorCSAgICBpZiAobGVuID49IGJ1ZmZlclNpemUgLSBuZXh0Q2hhcikKKwkJcmVBbGxvY0J1ZmYgKGxlbik7CisJICAgIAorCSAgICBTeXN0ZW0uYXJyYXljb3B5KGNidWYsIG9mZiwgY2IsIG5leHRDaGFyLCBsZW4pOworCSAgICBuZXh0Q2hhcis9bGVuOworCX0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZSBhbiBhcnJheSBvZiBjaGFyYWN0ZXJzLiAgVGhpcyBtZXRob2QgY2Fubm90IGJlIGluaGVyaXRlZCBmcm9tIHRoZQorICAgICAqIFdyaXRlciBjbGFzcyBiZWNhdXNlIGl0IG11c3Qgc3VwcHJlc3MgSS9PIGV4Y2VwdGlvbnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgd3JpdGUoY2hhcltdIGJ1ZikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlpZiAod3JpdGVyICE9IG51bGwpIHsKKwkgICAgd3JpdGVyLndyaXRlKGJ1Zik7CisJfSBlbHNlIHsKKwkgICAgd3JpdGUoYnVmLCAwLCBidWYubGVuZ3RoKTsKKwl9CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGUgYSBwb3J0aW9uIG9mIGEgU3RyaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIHMgU3RyaW5nIHRvIGJlIHdyaXR0ZW4KKyAgICAgKiBAcGFyYW0gb2ZmIE9mZnNldCBmcm9tIHdoaWNoIHRvIHN0YXJ0IHJlYWRpbmcgY2hhcmFjdGVycworICAgICAqIEBwYXJhbSBsZW4gTnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gYmUgd3JpdHRlbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHdyaXRlKFN0cmluZyBzLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24geworCWlmICh3cml0ZXIgIT0gbnVsbCkgeworCSAgICB3cml0ZXIud3JpdGUocywgb2ZmLCBsZW4pOworCX0gZWxzZSB7CisJICAgIGVuc3VyZU9wZW4oKTsKKwkgICAgaWYgKGxlbiA+PSBidWZmZXJTaXplIC0gbmV4dENoYXIpCisJCXJlQWxsb2NCdWZmKGxlbik7CisKKwkgICAgcy5nZXRDaGFycyhvZmYsIG9mZiArIGxlbiwgY2IsIG5leHRDaGFyKTsKKwkgICAgbmV4dENoYXIgKz0gbGVuOworCX0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZSBhIHN0cmluZy4gIFRoaXMgbWV0aG9kIGNhbm5vdCBiZSBpbmhlcml0ZWQgZnJvbSB0aGUgV3JpdGVyIGNsYXNzCisgICAgICogYmVjYXVzZSBpdCBtdXN0IHN1cHByZXNzIEkvTyBleGNlcHRpb25zLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHdyaXRlKFN0cmluZyBzKSB0aHJvd3MgSU9FeGNlcHRpb24geworCWlmICh3cml0ZXIgIT0gbnVsbCkgeworCSAgICB3cml0ZXIud3JpdGUocyk7CisJfSBlbHNlIHsKKwkgICAgd3JpdGUocywgMCwgcy5sZW5ndGgoKSk7CisJfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlIGEgbGluZSBzZXBhcmF0b3IuICBUaGUgbGluZSBzZXBhcmF0b3Igc3RyaW5nIGlzIGRlZmluZWQgYnkgdGhlCisgICAgICogc3lzdGVtIHByb3BlcnR5IDx0dD5saW5lLnNlcGFyYXRvcjwvdHQ+LCBhbmQgaXMgbm90IG5lY2Vzc2FyaWx5IGEgc2luZ2xlCisgICAgICogbmV3bGluZSAoJ1xuJykgY2hhcmFjdGVyLgorICAgICAqCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBJZiBhbiBJL08gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgbmV3TGluZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJaWYgKHdyaXRlciAhPSBudWxsKSB7CisJICAgIHdyaXRlci53cml0ZShMSU5FX1NFUEFSQVRPUik7CisJfSBlbHNlIHsKKwkgICAgd3JpdGUoTElORV9TRVBBUkFUT1IpOworCX0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcmludCBhIGJvb2xlYW4gdmFsdWUuICBUaGUgc3RyaW5nIHByb2R1Y2VkIGJ5IDxjb2RlPntAbGluaworICAgICAqIGphdmEubGFuZy5TdHJpbmcjdmFsdWVPZihib29sZWFuKX08L2NvZGU+IGlzIHRyYW5zbGF0ZWQgaW50byBieXRlcworICAgICAqIGFjY29yZGluZyB0byB0aGUgcGxhdGZvcm0ncyBkZWZhdWx0IGNoYXJhY3RlciBlbmNvZGluZywgYW5kIHRoZXNlIGJ5dGVzCisgICAgICogYXJlIHdyaXR0ZW4gaW4gZXhhY3RseSB0aGUgbWFubmVyIG9mIHRoZSA8Y29kZT57QGxpbmsKKyAgICAgKiAjd3JpdGUoaW50KX08L2NvZGU+IG1ldGhvZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiIFRoZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB0byBiZSBwcmludGVkCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHByaW50KGJvb2xlYW4gYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlpZiAod3JpdGVyICE9IG51bGwpIHsKKwkgICAgd3JpdGVyLndyaXRlKGIgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKwl9IGVsc2UgeworCSAgICB3cml0ZShiID8gInRydWUiIDogImZhbHNlIik7CisJfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFByaW50IGEgY2hhcmFjdGVyLiAgVGhlIGNoYXJhY3RlciBpcyB0cmFuc2xhdGVkIGludG8gb25lIG9yIG1vcmUgYnl0ZXMKKyAgICAgKiBhY2NvcmRpbmcgdG8gdGhlIHBsYXRmb3JtJ3MgZGVmYXVsdCBjaGFyYWN0ZXIgZW5jb2RpbmcsIGFuZCB0aGVzZSBieXRlcworICAgICAqIGFyZSB3cml0dGVuIGluIGV4YWN0bHkgdGhlIG1hbm5lciBvZiB0aGUgPGNvZGU+e0BsaW5rCisgICAgICogI3dyaXRlKGludCl9PC9jb2RlPiBtZXRob2QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYyBUaGUgPGNvZGU+Y2hhcjwvY29kZT4gdG8gYmUgcHJpbnRlZAorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwcmludChjaGFyIGMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJaWYgKHdyaXRlciAhPSBudWxsKSB7CisJICAgIHdyaXRlci53cml0ZShTdHJpbmcudmFsdWVPZihjKSk7CisJfSBlbHNlIHsKKwkgICAgd3JpdGUoU3RyaW5nLnZhbHVlT2YoYykpOworCX0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcmludCBhbiBpbnRlZ2VyLiAgVGhlIHN0cmluZyBwcm9kdWNlZCBieSA8Y29kZT57QGxpbmsKKyAgICAgKiBqYXZhLmxhbmcuU3RyaW5nI3ZhbHVlT2YoaW50KX08L2NvZGU+IGlzIHRyYW5zbGF0ZWQgaW50byBieXRlcyBhY2NvcmRpbmcKKyAgICAgKiB0byB0aGUgcGxhdGZvcm0ncyBkZWZhdWx0IGNoYXJhY3RlciBlbmNvZGluZywgYW5kIHRoZXNlIGJ5dGVzIGFyZQorICAgICAqIHdyaXR0ZW4gaW4gZXhhY3RseSB0aGUgbWFubmVyIG9mIHRoZSA8Y29kZT57QGxpbmsgI3dyaXRlKGludCl9PC9jb2RlPgorICAgICAqIG1ldGhvZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpIFRoZSA8Y29kZT5pbnQ8L2NvZGU+IHRvIGJlIHByaW50ZWQKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHJpbnQoaW50IGkpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJaWYgKHdyaXRlciAhPSBudWxsKSB7CisJICAgIHdyaXRlci53cml0ZShTdHJpbmcudmFsdWVPZihpKSk7CisJfSBlbHNlIHsKKwkgICAgd3JpdGUoU3RyaW5nLnZhbHVlT2YoaSkpOworCX0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcmludCBhIGxvbmcgaW50ZWdlci4gIFRoZSBzdHJpbmcgcHJvZHVjZWQgYnkgPGNvZGU+e0BsaW5rCisgICAgICogamF2YS5sYW5nLlN0cmluZyN2YWx1ZU9mKGxvbmcpfTwvY29kZT4gaXMgdHJhbnNsYXRlZCBpbnRvIGJ5dGVzCisgICAgICogYWNjb3JkaW5nIHRvIHRoZSBwbGF0Zm9ybSdzIGRlZmF1bHQgY2hhcmFjdGVyIGVuY29kaW5nLCBhbmQgdGhlc2UgYnl0ZXMKKyAgICAgKiBhcmUgd3JpdHRlbiBpbiBleGFjdGx5IHRoZSBtYW5uZXIgb2YgdGhlCisgICAgICogPGNvZGU+e0BsaW5rICN3cml0ZShpbnQpfTwvY29kZT4gbWV0aG9kLgorICAgICAqCisgICAgICogQHBhcmFtIGwgVGhlIDxjb2RlPmxvbmc8L2NvZGU+IHRvIGJlIHByaW50ZWQKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHJpbnQobG9uZyBsKSB0aHJvd3MgSU9FeGNlcHRpb24geworCWlmICh3cml0ZXIgIT0gbnVsbCkgeworCSAgICB3cml0ZXIud3JpdGUoU3RyaW5nLnZhbHVlT2YobCkpOworCX0gZWxzZSB7CisJICAgIHdyaXRlKFN0cmluZy52YWx1ZU9mKGwpKTsKKwl9CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJpbnQgYSBmbG9hdGluZy1wb2ludCBudW1iZXIuICBUaGUgc3RyaW5nIHByb2R1Y2VkIGJ5IDxjb2RlPntAbGluaworICAgICAqIGphdmEubGFuZy5TdHJpbmcjdmFsdWVPZihmbG9hdCl9PC9jb2RlPiBpcyB0cmFuc2xhdGVkIGludG8gYnl0ZXMKKyAgICAgKiBhY2NvcmRpbmcgdG8gdGhlIHBsYXRmb3JtJ3MgZGVmYXVsdCBjaGFyYWN0ZXIgZW5jb2RpbmcsIGFuZCB0aGVzZSBieXRlcworICAgICAqIGFyZSB3cml0dGVuIGluIGV4YWN0bHkgdGhlIG1hbm5lciBvZiB0aGUKKyAgICAgKiA8Y29kZT57QGxpbmsgI3dyaXRlKGludCl9PC9jb2RlPiBtZXRob2QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZiBUaGUgPGNvZGU+ZmxvYXQ8L2NvZGU+IHRvIGJlIHByaW50ZWQKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHJpbnQoZmxvYXQgZikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlpZiAod3JpdGVyICE9IG51bGwpIHsKKwkgICAgd3JpdGVyLndyaXRlKFN0cmluZy52YWx1ZU9mKGYpKTsKKwl9IGVsc2UgeworCSAgICB3cml0ZShTdHJpbmcudmFsdWVPZihmKSk7CisJfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFByaW50IGEgZG91YmxlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCBudW1iZXIuICBUaGUgc3RyaW5nIHByb2R1Y2VkIGJ5CisgICAgICogPGNvZGU+e0BsaW5rIGphdmEubGFuZy5TdHJpbmcjdmFsdWVPZihkb3VibGUpfTwvY29kZT4gaXMgdHJhbnNsYXRlZCBpbnRvCisgICAgICogYnl0ZXMgYWNjb3JkaW5nIHRvIHRoZSBwbGF0Zm9ybSdzIGRlZmF1bHQgY2hhcmFjdGVyIGVuY29kaW5nLCBhbmQgdGhlc2UKKyAgICAgKiBieXRlcyBhcmUgd3JpdHRlbiBpbiBleGFjdGx5IHRoZSBtYW5uZXIgb2YgdGhlIDxjb2RlPntAbGluaworICAgICAqICN3cml0ZShpbnQpfTwvY29kZT4gbWV0aG9kLgorICAgICAqCisgICAgICogQHBhcmFtIGQgVGhlIDxjb2RlPmRvdWJsZTwvY29kZT4gdG8gYmUgcHJpbnRlZAorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwcmludChkb3VibGUgZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlpZiAod3JpdGVyICE9IG51bGwpIHsKKwkgICAgd3JpdGVyLndyaXRlKFN0cmluZy52YWx1ZU9mKGQpKTsKKwl9IGVsc2UgeworCSAgICB3cml0ZShTdHJpbmcudmFsdWVPZihkKSk7CisJfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFByaW50IGFuIGFycmF5IG9mIGNoYXJhY3RlcnMuICBUaGUgY2hhcmFjdGVycyBhcmUgY29udmVydGVkIGludG8gYnl0ZXMKKyAgICAgKiBhY2NvcmRpbmcgdG8gdGhlIHBsYXRmb3JtJ3MgZGVmYXVsdCBjaGFyYWN0ZXIgZW5jb2RpbmcsIGFuZCB0aGVzZSBieXRlcworICAgICAqIGFyZSB3cml0dGVuIGluIGV4YWN0bHkgdGhlIG1hbm5lciBvZiB0aGUKKyAgICAgKiA8Y29kZT57QGxpbmsgI3dyaXRlKGludCl9PC9jb2RlPiBtZXRob2QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcyBUaGUgYXJyYXkgb2YgY2hhcnMgdG8gYmUgcHJpbnRlZAorICAgICAqCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBJZiA8Y29kZT5zPC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwcmludChjaGFyW10gcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlpZiAod3JpdGVyICE9IG51bGwpIHsKKwkgICAgd3JpdGVyLndyaXRlKHMpOworCX0gZWxzZSB7CisJICAgIHdyaXRlKHMpOworCX0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcmludCBhIHN0cmluZy4gIElmIHRoZSBhcmd1bWVudCBpcyA8Y29kZT5udWxsPC9jb2RlPiB0aGVuIHRoZSBzdHJpbmcKKyAgICAgKiA8Y29kZT4ibnVsbCI8L2NvZGU+IGlzIHByaW50ZWQuICBPdGhlcndpc2UsIHRoZSBzdHJpbmcncyBjaGFyYWN0ZXJzIGFyZQorICAgICAqIGNvbnZlcnRlZCBpbnRvIGJ5dGVzIGFjY29yZGluZyB0byB0aGUgcGxhdGZvcm0ncyBkZWZhdWx0IGNoYXJhY3RlcgorICAgICAqIGVuY29kaW5nLCBhbmQgdGhlc2UgYnl0ZXMgYXJlIHdyaXR0ZW4gaW4gZXhhY3RseSB0aGUgbWFubmVyIG9mIHRoZQorICAgICAqIDxjb2RlPntAbGluayAjd3JpdGUoaW50KX08L2NvZGU+IG1ldGhvZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzIFRoZSA8Y29kZT5TdHJpbmc8L2NvZGU+IHRvIGJlIHByaW50ZWQKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHJpbnQoU3RyaW5nIHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJaWYgKHMgPT0gbnVsbCkgcyA9ICJudWxsIjsKKwlpZiAod3JpdGVyICE9IG51bGwpIHsKKwkgICAgd3JpdGVyLndyaXRlKHMpOworCX0gZWxzZSB7CisJICAgIHdyaXRlKHMpOworCX0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcmludCBhbiBvYmplY3QuICBUaGUgc3RyaW5nIHByb2R1Y2VkIGJ5IHRoZSA8Y29kZT57QGxpbmsKKyAgICAgKiBqYXZhLmxhbmcuU3RyaW5nI3ZhbHVlT2YoT2JqZWN0KX08L2NvZGU+IG1ldGhvZCBpcyB0cmFuc2xhdGVkIGludG8gYnl0ZXMKKyAgICAgKiBhY2NvcmRpbmcgdG8gdGhlIHBsYXRmb3JtJ3MgZGVmYXVsdCBjaGFyYWN0ZXIgZW5jb2RpbmcsIGFuZCB0aGVzZSBieXRlcworICAgICAqIGFyZSB3cml0dGVuIGluIGV4YWN0bHkgdGhlIG1hbm5lciBvZiB0aGUKKyAgICAgKiA8Y29kZT57QGxpbmsgI3dyaXRlKGludCl9PC9jb2RlPiBtZXRob2QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb2JqIFRoZSA8Y29kZT5PYmplY3Q8L2NvZGU+IHRvIGJlIHByaW50ZWQKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHJpbnQoT2JqZWN0IG9iaikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlpZiAod3JpdGVyICE9IG51bGwpIHsKKwkgICAgd3JpdGVyLndyaXRlKFN0cmluZy52YWx1ZU9mKG9iaikpOworCX0gZWxzZSB7CisJICAgIHdyaXRlKFN0cmluZy52YWx1ZU9mKG9iaikpOworCX0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXJtaW5hdGUgdGhlIGN1cnJlbnQgbGluZSBieSB3cml0aW5nIHRoZSBsaW5lIHNlcGFyYXRvciBzdHJpbmcuICBUaGUKKyAgICAgKiBsaW5lIHNlcGFyYXRvciBzdHJpbmcgaXMgZGVmaW5lZCBieSB0aGUgc3lzdGVtIHByb3BlcnR5CisgICAgICogPGNvZGU+bGluZS5zZXBhcmF0b3I8L2NvZGU+LCBhbmQgaXMgbm90IG5lY2Vzc2FyaWx5IGEgc2luZ2xlIG5ld2xpbmUKKyAgICAgKiBjaGFyYWN0ZXIgKDxjb2RlPidcbic8L2NvZGU+KS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwcmludGxuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwluZXdMaW5lKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJpbnQgYSBib29sZWFuIHZhbHVlIGFuZCB0aGVuIHRlcm1pbmF0ZSB0aGUgbGluZS4gIFRoaXMgbWV0aG9kIGJlaGF2ZXMKKyAgICAgKiBhcyB0aG91Z2ggaXQgaW52b2tlcyA8Y29kZT57QGxpbmsgI3ByaW50KGJvb2xlYW4pfTwvY29kZT4gYW5kIHRoZW4KKyAgICAgKiA8Y29kZT57QGxpbmsgI3ByaW50bG4oKX08L2NvZGU+LgorICAgICAqCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHByaW50bG4oYm9vbGVhbiB4KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBwcmludCh4KTsKKyAgICAgICAgcHJpbnRsbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByaW50IGEgY2hhcmFjdGVyIGFuZCB0aGVuIHRlcm1pbmF0ZSB0aGUgbGluZS4gIFRoaXMgbWV0aG9kIGJlaGF2ZXMgYXMKKyAgICAgKiB0aG91Z2ggaXQgaW52b2tlcyA8Y29kZT57QGxpbmsgI3ByaW50KGNoYXIpfTwvY29kZT4gYW5kIHRoZW4KKyAgICAgKiA8Y29kZT57QGxpbmsgI3ByaW50bG4oKX08L2NvZGU+LgorICAgICAqCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHByaW50bG4oY2hhciB4KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBwcmludCh4KTsKKyAgICAgICAgcHJpbnRsbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByaW50IGFuIGludGVnZXIgYW5kIHRoZW4gdGVybWluYXRlIHRoZSBsaW5lLiAgVGhpcyBtZXRob2QgYmVoYXZlcyBhcworICAgICAqIHRob3VnaCBpdCBpbnZva2VzIDxjb2RlPntAbGluayAjcHJpbnQoaW50KX08L2NvZGU+IGFuZCB0aGVuCisgICAgICogPGNvZGU+e0BsaW5rICNwcmludGxuKCl9PC9jb2RlPi4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwcmludGxuKGludCB4KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBwcmludCh4KTsKKyAgICAgICAgcHJpbnRsbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByaW50IGEgbG9uZyBpbnRlZ2VyIGFuZCB0aGVuIHRlcm1pbmF0ZSB0aGUgbGluZS4gIFRoaXMgbWV0aG9kIGJlaGF2ZXMKKyAgICAgKiBhcyB0aG91Z2ggaXQgaW52b2tlcyA8Y29kZT57QGxpbmsgI3ByaW50KGxvbmcpfTwvY29kZT4gYW5kIHRoZW4KKyAgICAgKiA8Y29kZT57QGxpbmsgI3ByaW50bG4oKX08L2NvZGU+LgorICAgICAqCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHByaW50bG4obG9uZyB4KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBwcmludCh4KTsKKyAgICAgICAgcHJpbnRsbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByaW50IGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyIGFuZCB0aGVuIHRlcm1pbmF0ZSB0aGUgbGluZS4gIFRoaXMgbWV0aG9kCisgICAgICogYmVoYXZlcyBhcyB0aG91Z2ggaXQgaW52b2tlcyA8Y29kZT57QGxpbmsgI3ByaW50KGZsb2F0KX08L2NvZGU+IGFuZCB0aGVuCisgICAgICogPGNvZGU+e0BsaW5rICNwcmludGxuKCl9PC9jb2RlPi4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwcmludGxuKGZsb2F0IHgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHByaW50KHgpOworICAgICAgICBwcmludGxuKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJpbnQgYSBkb3VibGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IG51bWJlciBhbmQgdGhlbiB0ZXJtaW5hdGUgdGhlCisgICAgICogbGluZS4gIFRoaXMgbWV0aG9kIGJlaGF2ZXMgYXMgdGhvdWdoIGl0IGludm9rZXMgPGNvZGU+e0BsaW5rCisgICAgICogI3ByaW50KGRvdWJsZSl9PC9jb2RlPiBhbmQgdGhlbiA8Y29kZT57QGxpbmsgI3ByaW50bG4oKX08L2NvZGU+LgorICAgICAqCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHByaW50bG4oZG91YmxlIHgpIHRocm93cyBJT0V4Y2VwdGlvbnsKKyAgICAgICAgcHJpbnQoeCk7CisgICAgICAgIHByaW50bG4oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcmludCBhbiBhcnJheSBvZiBjaGFyYWN0ZXJzIGFuZCB0aGVuIHRlcm1pbmF0ZSB0aGUgbGluZS4gIFRoaXMgbWV0aG9kCisgICAgICogYmVoYXZlcyBhcyB0aG91Z2ggaXQgaW52b2tlcyA8Y29kZT57QGxpbmsgI3ByaW50KGNoYXJbXSl9PC9jb2RlPiBhbmQKKyAgICAgKiB0aGVuIDxjb2RlPntAbGluayAjcHJpbnRsbigpfTwvY29kZT4uCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHJpbnRsbihjaGFyIHhbXSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcHJpbnQoeCk7CisgICAgICAgIHByaW50bG4oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcmludCBhIFN0cmluZyBhbmQgdGhlbiB0ZXJtaW5hdGUgdGhlIGxpbmUuICBUaGlzIG1ldGhvZCBiZWhhdmVzIGFzCisgICAgICogdGhvdWdoIGl0IGludm9rZXMgPGNvZGU+e0BsaW5rICNwcmludChTdHJpbmcpfTwvY29kZT4gYW5kIHRoZW4KKyAgICAgKiA8Y29kZT57QGxpbmsgI3ByaW50bG4oKX08L2NvZGU+LgorICAgICAqCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHByaW50bG4oU3RyaW5nIHgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHByaW50KHgpOworICAgICAgICBwcmludGxuKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJpbnQgYW4gT2JqZWN0IGFuZCB0aGVuIHRlcm1pbmF0ZSB0aGUgbGluZS4gIFRoaXMgbWV0aG9kIGJlaGF2ZXMgYXMKKyAgICAgKiB0aG91Z2ggaXQgaW52b2tlcyA8Y29kZT57QGxpbmsgI3ByaW50KE9iamVjdCl9PC9jb2RlPiBhbmQgdGhlbgorICAgICAqIDxjb2RlPntAbGluayAjcHJpbnRsbigpfTwvY29kZT4uCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHJpbnRsbihPYmplY3QgeCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcHJpbnQoeCk7CisgICAgICAgIHByaW50bG4oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbGVhciB0aGUgY29udGVudHMgb2YgdGhlIGJ1ZmZlci4gSWYgdGhlIGJ1ZmZlciBoYXMgYmVlbiBhbHJlYWR5CisgICAgICogYmVlbiBmbHVzaGVkIHRoZW4gdGhlIGNsZWFyIG9wZXJhdGlvbiBzaGFsbCB0aHJvdyBhbiBJT0V4Y2VwdGlvbgorICAgICAqIHRvIHNpZ25hbCB0aGUgZmFjdCB0aGF0IHNvbWUgZGF0YSBoYXMgYWxyZWFkeSBiZWVuIGlycmV2b2NhYmx5IAorICAgICAqIHdyaXR0ZW4gdG8gdGhlIGNsaWVudCByZXNwb25zZSBzdHJlYW0uCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIElmIGFuIEkvTyBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJaWYgKHdyaXRlciAhPSBudWxsKSB7CisJICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigpOworCX0gZWxzZSB7CisJICAgIG5leHRDaGFyID0gMDsKKwl9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xlYXJzIHRoZSBjdXJyZW50IGNvbnRlbnRzIG9mIHRoZSBidWZmZXIuIFVubGlrZSBjbGVhcigpLCB0aGlzCisgICAgICogbWVodG9kIHdpbGwgbm90IHRocm93IGFuIElPRXhjZXB0aW9uIGlmIHRoZSBidWZmZXIgaGFzIGFscmVhZHkgYmVlbgorICAgICAqIGZsdXNoZWQuIEl0IG1lcmVseSBjbGVhcnMgdGhlIGN1cnJlbnQgY29udGVudCBvZiB0aGUgYnVmZmVyIGFuZAorICAgICAqIHJldHVybnMuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIElmIGFuIEkvTyBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbGVhckJ1ZmZlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmICh3cml0ZXIgPT0gbnVsbCkgeworCSAgICB0aGlzLmNsZWFyKCk7CisJfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENsb3NlIHRoZSBzdHJlYW0sIGZsdXNoaW5nIGl0IGZpcnN0LiAgT25jZSBhIHN0cmVhbSBoYXMgYmVlbiBjbG9zZWQsCisgICAgICogZnVydGhlciB3cml0ZSgpIG9yIGZsdXNoKCkgaW52b2NhdGlvbnMgd2lsbCBjYXVzZSBhbiBJT0V4Y2VwdGlvbiB0byBiZQorICAgICAqIHRocm93bi4gIENsb3NpbmcgYSBwcmV2aW91c2x5LWNsb3NlZCBzdHJlYW0sIGhvd2V2ZXIsIGhhcyBubyBlZmZlY3QuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIElmIGFuIEkvTyBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJaWYgKHdyaXRlciAhPSBudWxsKSB7CisJICAgIHdyaXRlci5jbG9zZSgpOworCX0gZWxzZSB7CisJICAgIGNiID0gbnVsbDsJCisJICAgIGNsb3NlZCA9IHRydWU7CisJfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyB1bnVzZWQgaW4gdGhlIGJ1ZmZlcgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UmVtYWluaW5nKCkgeworCXJldHVybiAod3JpdGVyID09IG51bGwpID8gYnVmZmVyU2l6ZS1uZXh0Q2hhciA6IDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGlzIEJvZHlKc3BXcml0ZXIgYXMgYSBSZWFkZXIuCisgICAgICogTm90ZTogdGhpcyBpcyBhZnRlciBldmFsdWF0aW9uISEgIFRoZXJlIGFyZSBubyBzY3JpcHRsZXRzLAorICAgICAqIGV0YyBpbiB0aGlzIHN0cmVhbS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoaXMgQm9keUpzcFdyaXRlciBhcyBhIFJlYWRlcgorICAgICAqLworICAgIHB1YmxpYyBSZWFkZXIgZ2V0UmVhZGVyKCkgeworCXJldHVybiAod3JpdGVyID09IG51bGwpID8gbmV3IENoYXJBcnJheVJlYWRlciAoY2IsIDAsIG5leHRDaGFyKSA6IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgQm9keUpzcFdyaXRlciBhcyBhIFN0cmluZy4KKyAgICAgKiBOb3RlOiB0aGlzIGlzIGFmdGVyIGV2YWx1YXRpb24hISAgVGhlcmUgYXJlIG5vIHNjcmlwdGxldHMsCisgICAgICogZXRjIGluIHRoaXMgc3RyZWFtLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIEJvZHlKc3BXcml0ZXIgYXMgYSBTdHJpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZygpIHsKKwlyZXR1cm4gKHdyaXRlciA9PSBudWxsKSA/IG5ldyBTdHJpbmcoY2IsIDAsIG5leHRDaGFyKSA6IG51bGw7CisgICAgfQorCQorICAgIC8qKgorICAgICAqIFdyaXRlIHRoZSBjb250ZW50cyBvZiB0aGlzIEJvZHlKc3BXcml0ZXIgaW50byBhIFdyaXRlci4KKyAgICAgKiBTdWJjbGFzc2VzIGFyZSBsaWtlbHkgdG8gZG8gaW50ZXJlc3RpbmcgdGhpbmdzIHdpdGggdGhlCisgICAgICogaW1wbGVtZW50YXRpb24gc28gc29tZSB0aGluZ3MgYXJlIGV4dHJhIGVmZmljaWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvdXQgVGhlIHdyaXRlciBpbnRvIHdoaWNoIHRvIHBsYWNlIHRoZSBjb250ZW50cyBvZiB0aGlzIGJvZHkKKyAgICAgKiBldmFsdWF0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgd3JpdGVPdXQoV3JpdGVyIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlpZiAod3JpdGVyID09IG51bGwpIHsKKwkgICAgb3V0LndyaXRlKGNiLCAwLCBuZXh0Q2hhcik7CisJICAgIC8vIEZsdXNoIG5vdCBjYWxsZWQgYXMgdGhlIHdyaXRlciBwYXNzZWQgY291bGQgYmUgYSBCb2R5Q29udGVudCBhbmQKKwkgICAgLy8gaXQgZG9lc24ndCBhbGxvdyB0byBmbHVzaC4KKwl9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgd3JpdGVyIHRvIHdoaWNoIGFsbCBvdXRwdXQgaXMgd3JpdHRlbi4KKyAgICAgKi8KKyAgICB2b2lkIHNldFdyaXRlcihXcml0ZXIgd3JpdGVyKSB7CisJdGhpcy53cml0ZXIgPSB3cml0ZXI7CisJaWYgKHdyaXRlciAhPSBudWxsKSB7CisJICAgIC8vIEFjY29yZGluZyB0byB0aGUgc3BlYywgdGhlIEpzcFdyaXRlciByZXR1cm5lZCBieSAKKwkgICAgLy8gSnNwQ29udGV4dC5wdXNoQm9keShqYXZhLmlvLldyaXRlciB3cml0ZXIpIG11c3QgYmVoYXZlIGFzCisJICAgIC8vIHRob3VnaCBpdCB3ZXJlIHVuYnVmZmVyZWQuIFRoaXMgbWVhbnMgdGhhdCBpdHMgZ2V0QnVmZmVyU2l6ZSgpCisJICAgIC8vIG11c3QgYWx3YXlzIHJldHVybiAwLiBUaGUgaW1wbGVtZW50YXRpb24gb2YKKwkgICAgLy8gSnNwV3JpdGVyLmdldEJ1ZmZlclNpemUoKSByZXR1cm5zIHRoZSB2YWx1ZSBvZiBKc3BXcml0ZXIncworCSAgICAvLyAnYnVmZmVyU2l6ZScgZmllbGQsIHdoaWNoIGlzIGluaGVyaXRlZCBieSB0aGlzIGNsYXNzLiAKKwkgICAgLy8gVGhlcmVmb3JlLCB3ZSBzaW1wbHkgc2F2ZSB0aGUgY3VycmVudCAnYnVmZmVyU2l6ZScgKHNvIHdlIGNhbiAKKwkgICAgLy8gbGF0ZXIgcmVzdG9yZSBpdCBzaG91bGQgdGhpcyBCb2R5Q29udGVudEltcGwgZXZlciBiZSByZXVzZWQgYnkKKwkgICAgLy8gYSBjYWxsIHRvIFBhZ2VDb250ZXh0LnB1c2hCb2R5KCkpIGJlZm9yZSBzZXR0aW5nIGl0IHRvIDAuCisJICAgIGlmIChidWZmZXJTaXplICE9IDApIHsKKwkJYnVmZmVyU2l6ZVNhdmUgPSBidWZmZXJTaXplOworCQlidWZmZXJTaXplID0gMDsKKwkgICAgfQorCX0gZWxzZSB7CisJICAgIGJ1ZmZlclNpemUgPSBidWZmZXJTaXplU2F2ZTsKKwkgICAgY2xlYXJCb2R5KCk7CisJfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBlbnN1cmVPcGVuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlpZiAoY2xvc2VkKSB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlN0cmVhbSBjbG9zZWQiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFsbG9jYXRlcyBidWZmZXIgc2luY2UgdGhlIHNwZWMgcmVxdWlyZXMgaXQgdG8gYmUgdW5ib3VuZGVkLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCByZUFsbG9jQnVmZihpbnQgbGVuKSB7CisKKyAgICAgICAgaWYgKGJ1ZmZlclNpemUgKyBsZW4gPD0gY2IubGVuZ3RoKSB7CisgICAgICAgICAgICBidWZmZXJTaXplID0gY2IubGVuZ3RoOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGxlbiA8IGNiLmxlbmd0aCkgeworICAgICAgICAgICAgbGVuID0gY2IubGVuZ3RoOworICAgICAgICB9CisKKyAgICAgICAgYnVmZmVyU2l6ZSA9IGNiLmxlbmd0aCArIGxlbjsKKyAgICAgICAgY2hhcltdIHRtcCA9IG5ldyBjaGFyW2J1ZmZlclNpemVdOworCisJU3lzdGVtLmFycmF5Y29weShjYiwgMCwgdG1wLCAwLCBjYi5sZW5ndGgpOworCWNiID0gdG1wOworCXRtcCA9IG51bGw7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3J1bnRpbWUvSHR0cEpzcEJhc2UuamF2YSBiL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9ydW50aW1lL0h0dHBKc3BCYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDYzNDNmNwotLS0gL2Rldi9udWxsCisrKyBiL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9ydW50aW1lL0h0dHBKc3BCYXNlLmphdmEKQEAgLTAsMCArMSwxMTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphc3Blci5ydW50aW1lOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbmZpZzsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AuSHR0cEpzcFBhZ2U7CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AuSnNwRmFjdG9yeTsKKworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLmNvbXBpbGVyLkxvY2FsaXplcjsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBzdXBlciBjbGFzcyBvZiBhbGwgSlNQLWdlbmVyYXRlZCBzZXJ2bGV0cy4KKyAqCisgKiBAYXV0aG9yIEFuaWwgSy4gVmlqZW5kcmFuCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBIdHRwSnNwQmFzZSAKKyAgICBleHRlbmRzIEh0dHBTZXJ2bGV0IAorICAgIGltcGxlbWVudHMgSHR0cEpzcFBhZ2UgCisgICAgICAgIAorICAgIAoreworICAgIAorICAgIHByaXZhdGUgc3RhdGljIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZyBsb2c9CisgICAgICAgIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3RvcnkuZ2V0TG9nKCBIdHRwSnNwQmFzZS5jbGFzcyApOworICAgIAorICAgIHN0YXRpYyB7CisgICAgICAgIGlmKCBKc3BGYWN0b3J5LmdldERlZmF1bHRGYWN0b3J5KCkgPT0gbnVsbCApIHsKKyAgICAgICAgICAgIEpzcEZhY3RvcnlJbXBsIGZhY3RvcnkgPSBuZXcgSnNwRmFjdG9yeUltcGwoKTsKKyAgICAgICAgICAgIGlmKCBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCkgIT0gbnVsbCApIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgYmFzZVBhY2thZ2UgPSAib3JnLmFwYWNoZS5qYXNwZXIuIjsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBmYWN0b3J5LmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MoIGJhc2VQYWNrYWdlICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicnVudGltZS5Kc3BGYWN0b3J5SW1wbCRQcml2aWxlZ2VkR2V0UGFnZUNvbnRleHQiKTsKKyAgICAgICAgICAgICAgICAgICAgZmFjdG9yeS5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkubG9hZENsYXNzKCBiYXNlUGFja2FnZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJ1bnRpbWUuSnNwRmFjdG9yeUltcGwkUHJpdmlsZWdlZFJlbGVhc2VQYWdlQ29udGV4dCIpOworICAgICAgICAgICAgICAgICAgICBmYWN0b3J5LmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MoIGJhc2VQYWNrYWdlICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicnVudGltZS5Kc3BSdW50aW1lTGlicmFyeSIpOworICAgICAgICAgICAgICAgICAgICBmYWN0b3J5LmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MoIGJhc2VQYWNrYWdlICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicnVudGltZS5Kc3BSdW50aW1lTGlicmFyeSRQcml2aWxlZ2VkSW50cm9zcGVjdEhlbHBlciIpOworICAgICAgICAgICAgICAgICAgICBmYWN0b3J5LmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MoIGJhc2VQYWNrYWdlICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicnVudGltZS5TZXJ2bGV0UmVzcG9uc2VXcmFwcGVySW5jbHVkZSIpOworICAgICAgICAgICAgICAgICAgICBmYWN0b3J5LmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MoIGJhc2VQYWNrYWdlICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2VydmxldC5Kc3BTZXJ2bGV0V3JhcHBlciIpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJKYXNwZXIgSnNwUnVudGltZUNvbnRleHQgcHJlbG9hZCBvZiBjbGFzcyBmYWlsZWQ6ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXguZ2V0TWVzc2FnZSgpLCBleCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgSnNwRmFjdG9yeS5zZXREZWZhdWx0RmFjdG9yeShmYWN0b3J5KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBIdHRwSnNwQmFzZSgpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBpbml0KFNlcnZsZXRDb25maWcgY29uZmlnKSAKKwl0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiAKKyAgICB7CisgICAgICAgIHN1cGVyLmluaXQoY29uZmlnKTsKKwlqc3BJbml0KCk7CisgICAgICAgIF9qc3BJbml0KCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmxldEluZm8oKSB7CisJcmV0dXJuIExvY2FsaXplci5nZXRNZXNzYWdlKCJqc3AuZW5naW5lLmluZm8iKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBkZXN0cm95KCkgeworCWpzcERlc3Ryb3koKTsKKwlfanNwRGVzdHJveSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVudHJ5IHBvaW50IGludG8gc2VydmljZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXJ2aWNlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSAKKwl0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gCisgICAgeworICAgICAgICBfanNwU2VydmljZShyZXF1ZXN0LCByZXNwb25zZSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIGpzcEluaXQoKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgX2pzcEluaXQoKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQganNwRGVzdHJveSgpIHsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBfanNwRGVzdHJveSgpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBfanNwU2VydmljZShIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgCisJCQkJICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSAKKwl0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb247Cit9CmRpZmYgLS1naXQgYS9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvcnVudGltZS9Kc3BDb250ZXh0V3JhcHBlci5qYXZhIGIvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3J1bnRpbWUvSnNwQ29udGV4dFdyYXBwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWI1MzNlCi0tLSAvZGV2L251bGwKKysrIGIvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3J1bnRpbWUvSnNwQ29udGV4dFdyYXBwZXIuamF2YQpAQCAtMCwwICsxLDQ1NCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFzcGVyLnJ1bnRpbWU7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uV3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXQ7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29uZmlnOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLkpzcENvbnRleHQ7CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AuSnNwV3JpdGVyOworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLlBhZ2VDb250ZXh0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLmVsLkVMRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLmVsLkV4cHJlc3Npb25FdmFsdWF0b3I7CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AuZWwuVmFyaWFibGVSZXNvbHZlcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuQm9keUNvbnRlbnQ7CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlZhcmlhYmxlSW5mbzsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5lbC5WYXJpYWJsZVJlc29sdmVySW1wbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5jb21waWxlci5Mb2NhbGl6ZXI7CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgYSBKU1AgQ29udGV4dCBXcmFwcGVyLgorICoKKyAqIFRoZSBKU1AgQ29udGV4dCBXcmFwcGVyIGlzIGEgSnNwQ29udGV4dCBjcmVhdGVkIGFuZCBtYWludGFpbmVkIGJ5IGEgdGFnCisgKiBoYW5kbGVyIGltcGxlbWVudGF0aW9uLiBJdCB3cmFwcyB0aGUgSW52b2tpbmcgSlNQIENvbnRleHQsIHRoYXQgaXMsIHRoZQorICogSnNwQ29udGV4dCBpbnN0YW5jZSBwYXNzZWQgdG8gdGhlIHRhZyBoYW5kbGVyIGJ5IHRoZSBpbnZva2luZyBwYWdlIHZpYQorICogc2V0SnNwQ29udGV4dCgpLgorICoKKyAqIEBhdXRob3IgS2luLW1hbiBDaHVuZworICogQGF1dGhvciBKYW4gTHVlaGUKKyAqLworcHVibGljIGNsYXNzIEpzcENvbnRleHRXcmFwcGVyCisgICAgICAgICAgICBleHRlbmRzIFBhZ2VDb250ZXh0IGltcGxlbWVudHMgVmFyaWFibGVSZXNvbHZlciB7CisKKyAgICAvLyBJbnZva2luZyBKU1AgY29udGV4dAorICAgIHByaXZhdGUgUGFnZUNvbnRleHQgaW52b2tpbmdKc3BDdHh0OworCisgICAgcHJpdmF0ZSB0cmFuc2llbnQgSGFzaHRhYmxlCXBhZ2VBdHRyaWJ1dGVzOworCisgICAgLy8gQXJyYXlMaXN0IG9mIE5FU1RFRCBzY3JpcHRpbmcgdmFyaWFibGVzCisgICAgcHJpdmF0ZSBBcnJheUxpc3QgbmVzdGVkVmFyczsKKworICAgIC8vIEFycmF5TGlzdCBvZiBBVF9CRUdJTiBzY3JpcHRpbmcgdmFyaWFibGVzCisgICAgcHJpdmF0ZSBBcnJheUxpc3QgYXRCZWdpblZhcnM7CisKKyAgICAvLyBBcnJheUxpc3Qgb2YgQVRfRU5EIHNjcmlwdGluZyB2YXJpYWJsZXMKKyAgICBwcml2YXRlIEFycmF5TGlzdCBhdEVuZFZhcnM7CisKKyAgICBwcml2YXRlIE1hcCBhbGlhc2VzOworCisgICAgcHJpdmF0ZSBIYXNodGFibGUgb3JpZ2luYWxOZXN0ZWRWYXJzOworCisgICAgLyoqCisgICAgICogVGhlIHZhcmlhYmxlIHJlc29sdmVyLCBmb3IgZXZhbHVhdGluZyBFTCBleHByZXNzaW9ucy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFZhcmlhYmxlUmVzb2x2ZXJJbXBsIHZhcmlhYmxlUmVzb2x2ZXIKKyAgICAgICAgPSBuZXcgVmFyaWFibGVSZXNvbHZlckltcGwodGhpcyk7CisKKyAgICBwdWJsaWMgSnNwQ29udGV4dFdyYXBwZXIoSnNwQ29udGV4dCBqc3BDb250ZXh0LCBBcnJheUxpc3QgbmVzdGVkVmFycywKKwkJCSAgICAgQXJyYXlMaXN0IGF0QmVnaW5WYXJzLCBBcnJheUxpc3QgYXRFbmRWYXJzLAorCQkJICAgICBNYXAgYWxpYXNlcykgeworICAgICAgICB0aGlzLmludm9raW5nSnNwQ3R4dCA9IChQYWdlQ29udGV4dCkganNwQ29udGV4dDsKKwl0aGlzLm5lc3RlZFZhcnMgPSBuZXN0ZWRWYXJzOworCXRoaXMuYXRCZWdpblZhcnMgPSBhdEJlZ2luVmFyczsKKwl0aGlzLmF0RW5kVmFycyA9IGF0RW5kVmFyczsKKwl0aGlzLnBhZ2VBdHRyaWJ1dGVzID0gbmV3IEhhc2h0YWJsZSgxNik7CisJdGhpcy5hbGlhc2VzID0gYWxpYXNlczsKKworCWlmIChuZXN0ZWRWYXJzICE9IG51bGwpIHsKKwkgICAgdGhpcy5vcmlnaW5hbE5lc3RlZFZhcnMgPSBuZXcgSGFzaHRhYmxlKG5lc3RlZFZhcnMuc2l6ZSgpKTsKKwl9CisJc3luY0JlZ2luVGFnRmlsZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoU2VydmxldCBzZXJ2bGV0LCBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLCBTdHJpbmcgZXJyb3JQYWdlVVJMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBuZWVkc1Nlc3Npb24sIGludCBidWZmZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBhdXRvRmx1c2gpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICB7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBPYmplY3QgZ2V0QXR0cmlidXRlKFN0cmluZyBuYW1lKSB7CisKKwlpZiAobmFtZSA9PSBudWxsKSB7CisJICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigKKwkgICAgICAgICAgICBMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgianNwLmVycm9yLmF0dHJpYnV0ZS5udWxsX25hbWUiKSk7CisJfQorCisJcmV0dXJuIHBhZ2VBdHRyaWJ1dGVzLmdldChuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgaW50IHNjb3BlKSB7CisKKwlpZiAobmFtZSA9PSBudWxsKSB7CisJICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigKKwkgICAgICAgICAgICBMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgianNwLmVycm9yLmF0dHJpYnV0ZS5udWxsX25hbWUiKSk7CisJfQorCisJaWYgKHNjb3BlID09IFBBR0VfU0NPUEUpIHsKKwkgICAgcmV0dXJuIHBhZ2VBdHRyaWJ1dGVzLmdldChuYW1lKTsKKwl9CisKKwlyZXR1cm4gaW52b2tpbmdKc3BDdHh0LmdldEF0dHJpYnV0ZShuYW1lLCBzY29wZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsKKworCWlmIChuYW1lID09IG51bGwpIHsKKwkgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKAorCSAgICAgICAgICAgIExvY2FsaXplci5nZXRNZXNzYWdlKCJqc3AuZXJyb3IuYXR0cmlidXRlLm51bGxfbmFtZSIpKTsKKwl9CisKKwlpZiAodmFsdWUgIT0gbnVsbCkgeworCSAgICBwYWdlQXR0cmlidXRlcy5wdXQobmFtZSwgdmFsdWUpOworCX0gZWxzZSB7CisJICAgIHJlbW92ZUF0dHJpYnV0ZShuYW1lLCBQQUdFX1NDT1BFKTsKKwl9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUsIGludCBzY29wZSkgeworCisJaWYgKG5hbWUgPT0gbnVsbCkgeworCSAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oCisJICAgICAgICAgICAgTG9jYWxpemVyLmdldE1lc3NhZ2UoImpzcC5lcnJvci5hdHRyaWJ1dGUubnVsbF9uYW1lIikpOworCX0KKworCWlmIChzY29wZSA9PSBQQUdFX1NDT1BFKSB7CisJICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CisJCXBhZ2VBdHRyaWJ1dGVzLnB1dChuYW1lLCB2YWx1ZSk7CisJICAgIH0gZWxzZSB7CisJCXJlbW92ZUF0dHJpYnV0ZShuYW1lLCBQQUdFX1NDT1BFKTsKKwkgICAgfQorCX0gZWxzZSB7CisJICAgIGludm9raW5nSnNwQ3R4dC5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUsIHNjb3BlKTsKKwl9CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBmaW5kQXR0cmlidXRlKFN0cmluZyBuYW1lKSB7CisKKwlpZiAobmFtZSA9PSBudWxsKSB7CisJICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigKKwkgICAgICAgICAgICBMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgianNwLmVycm9yLmF0dHJpYnV0ZS5udWxsX25hbWUiKSk7CisJfQorCisgICAgICAgIE9iamVjdCBvID0gcGFnZUF0dHJpYnV0ZXMuZ2V0KG5hbWUpOworICAgICAgICBpZiAobyA9PSBudWxsKSB7CisJICAgIG8gPSBpbnZva2luZ0pzcEN0eHQuZ2V0QXR0cmlidXRlKG5hbWUsIFJFUVVFU1RfU0NPUEUpOworCSAgICBpZiAobyA9PSBudWxsKSB7CisJCWlmIChnZXRTZXNzaW9uKCkgIT0gbnVsbCkgeworCQkgICAgbyA9IGludm9raW5nSnNwQ3R4dC5nZXRBdHRyaWJ1dGUobmFtZSwgU0VTU0lPTl9TQ09QRSk7CisJCX0KKwkJaWYgKG8gPT0gbnVsbCkgeworCQkgICAgbyA9IGludm9raW5nSnNwQ3R4dC5nZXRBdHRyaWJ1dGUobmFtZSwgQVBQTElDQVRJT05fU0NPUEUpOworCQl9IAorCSAgICB9CisJfQorCisJcmV0dXJuIG87CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVtb3ZlQXR0cmlidXRlKFN0cmluZyBuYW1lKSB7CisKKwlpZiAobmFtZSA9PSBudWxsKSB7CisJICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigKKwkgICAgICAgICAgICBMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgianNwLmVycm9yLmF0dHJpYnV0ZS5udWxsX25hbWUiKSk7CisJfQorCisJcGFnZUF0dHJpYnV0ZXMucmVtb3ZlKG5hbWUpOworCWludm9raW5nSnNwQ3R4dC5yZW1vdmVBdHRyaWJ1dGUobmFtZSwgUkVRVUVTVF9TQ09QRSk7CisJaWYgKGdldFNlc3Npb24oKSAhPSBudWxsKSB7CisJICAgIGludm9raW5nSnNwQ3R4dC5yZW1vdmVBdHRyaWJ1dGUobmFtZSwgU0VTU0lPTl9TQ09QRSk7CisJfQorCWludm9raW5nSnNwQ3R4dC5yZW1vdmVBdHRyaWJ1dGUobmFtZSwgQVBQTElDQVRJT05fU0NPUEUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgaW50IHNjb3BlKSB7CisKKwlpZiAobmFtZSA9PSBudWxsKSB7CisJICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigKKwkgICAgICAgICAgICBMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgianNwLmVycm9yLmF0dHJpYnV0ZS5udWxsX25hbWUiKSk7CisJfQorCisJaWYgKHNjb3BlID09IFBBR0VfU0NPUEUpeworCSAgICBwYWdlQXR0cmlidXRlcy5yZW1vdmUobmFtZSk7CisJfSBlbHNlIHsKKwkgICAgaW52b2tpbmdKc3BDdHh0LnJlbW92ZUF0dHJpYnV0ZShuYW1lLCBzY29wZSk7CisJfQorICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0QXR0cmlidXRlc1Njb3BlKFN0cmluZyBuYW1lKSB7CisKKwlpZiAobmFtZSA9PSBudWxsKSB7CisJICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigKKwkgICAgICAgICAgICBMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgianNwLmVycm9yLmF0dHJpYnV0ZS5udWxsX25hbWUiKSk7CisJfQorCisJaWYgKHBhZ2VBdHRyaWJ1dGVzLmdldChuYW1lKSAhPSBudWxsKSB7CisJICAgIHJldHVybiBQQUdFX1NDT1BFOworCX0gZWxzZSB7CisJICAgIHJldHVybiBpbnZva2luZ0pzcEN0eHQuZ2V0QXR0cmlidXRlc1Njb3BlKG5hbWUpOworCX0KKyAgICB9CisKKyAgICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0QXR0cmlidXRlTmFtZXNJblNjb3BlKGludCBzY29wZSkgeworICAgICAgICBpZiAoc2NvcGUgPT0gUEFHRV9TQ09QRSkgeworICAgICAgICAgICAgcmV0dXJuIHBhZ2VBdHRyaWJ1dGVzLmtleXMoKTsKKwl9CisKKwlyZXR1cm4gaW52b2tpbmdKc3BDdHh0LmdldEF0dHJpYnV0ZU5hbWVzSW5TY29wZShzY29wZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKKwlpbnZva2luZ0pzcEN0eHQucmVsZWFzZSgpOworICAgIH0KKworICAgIHB1YmxpYyBKc3BXcml0ZXIgZ2V0T3V0KCkgeworCXJldHVybiBpbnZva2luZ0pzcEN0eHQuZ2V0T3V0KCk7CisgICAgfQorCisgICAgcHVibGljIEh0dHBTZXNzaW9uIGdldFNlc3Npb24oKSB7CisJcmV0dXJuIGludm9raW5nSnNwQ3R4dC5nZXRTZXNzaW9uKCk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRQYWdlKCkgeworCXJldHVybiBpbnZva2luZ0pzcEN0eHQuZ2V0UGFnZSgpOworICAgIH0KKworICAgIHB1YmxpYyBTZXJ2bGV0UmVxdWVzdCBnZXRSZXF1ZXN0KCkgeworCXJldHVybiBpbnZva2luZ0pzcEN0eHQuZ2V0UmVxdWVzdCgpOworICAgIH0KKworICAgIHB1YmxpYyBTZXJ2bGV0UmVzcG9uc2UgZ2V0UmVzcG9uc2UoKSB7CisJcmV0dXJuIGludm9raW5nSnNwQ3R4dC5nZXRSZXNwb25zZSgpOworICAgIH0KKworICAgIHB1YmxpYyBFeGNlcHRpb24gZ2V0RXhjZXB0aW9uKCkgeworCXJldHVybiBpbnZva2luZ0pzcEN0eHQuZ2V0RXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIFNlcnZsZXRDb25maWcgZ2V0U2VydmxldENvbmZpZygpIHsKKwlyZXR1cm4gaW52b2tpbmdKc3BDdHh0LmdldFNlcnZsZXRDb25maWcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU2VydmxldENvbnRleHQgZ2V0U2VydmxldENvbnRleHQoKSB7CisJcmV0dXJuIGludm9raW5nSnNwQ3R4dC5nZXRTZXJ2bGV0Q29udGV4dCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGZvcndhcmQoU3RyaW5nIHJlbGF0aXZlVXJsUGF0aCkKKyAgICAgICAgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uCisgICAgeworCWludm9raW5nSnNwQ3R4dC5mb3J3YXJkKHJlbGF0aXZlVXJsUGF0aCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW5jbHVkZShTdHJpbmcgcmVsYXRpdmVVcmxQYXRoKQorCXRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgorICAgIHsKKwlpbnZva2luZ0pzcEN0eHQuaW5jbHVkZShyZWxhdGl2ZVVybFBhdGgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGluY2x1ZGUoU3RyaW5nIHJlbGF0aXZlVXJsUGF0aCwgYm9vbGVhbiBmbHVzaCkgCisJICAgIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisJaW5jbHVkZShyZWxhdGl2ZVVybFBhdGgsIGZhbHNlKTsgLy8gWFhYCisgICAgfQorCisgICAgcHVibGljIFZhcmlhYmxlUmVzb2x2ZXIgZ2V0VmFyaWFibGVSZXNvbHZlcigpIHsKKwlyZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgQm9keUNvbnRlbnQgcHVzaEJvZHkoKSB7CisJcmV0dXJuIGludm9raW5nSnNwQ3R4dC5wdXNoQm9keSgpOworICAgIH0KKworICAgIHB1YmxpYyBKc3BXcml0ZXIgcHVzaEJvZHkoV3JpdGVyIHdyaXRlcikgeworCXJldHVybiBpbnZva2luZ0pzcEN0eHQucHVzaEJvZHkod3JpdGVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSnNwV3JpdGVyIHBvcEJvZHkoKSB7CisgICAgICAgIHJldHVybiBpbnZva2luZ0pzcEN0eHQucG9wQm9keSgpOworICAgIH0KKworICAgIHB1YmxpYyBFeHByZXNzaW9uRXZhbHVhdG9yIGdldEV4cHJlc3Npb25FdmFsdWF0b3IoKSB7CisJcmV0dXJuIGludm9raW5nSnNwQ3R4dC5nZXRFeHByZXNzaW9uRXZhbHVhdG9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaGFuZGxlUGFnZUV4Y2VwdGlvbihFeGNlcHRpb24gZXgpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiAKKyAgICB7CisJLy8gU2hvdWxkIG5ldmVyIGJlIGNhbGxlZCBzaW5jZSBoYW5kbGVFeGNlcHRpb24oKSBjYWxsZWQgd2l0aCBhCisJLy8gVGhyb3dhYmxlIGluIHRoZSBnZW5lcmF0ZWQgc2VydmxldC4KKwloYW5kbGVQYWdlRXhjZXB0aW9uKChUaHJvd2FibGUpIGV4KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBoYW5kbGVQYWdlRXhjZXB0aW9uKFRocm93YWJsZSB0KQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24gCisgICAgeworCWludm9raW5nSnNwQ3R4dC5oYW5kbGVQYWdlRXhjZXB0aW9uKHQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFZhcmlhYmxlUmVzb2x2ZXIgaW50ZXJmYWNlCisgICAgICovCisgICAgcHVibGljIE9iamVjdCByZXNvbHZlVmFyaWFibGUoIFN0cmluZyBwTmFtZSApIHRocm93cyBFTEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuIHZhcmlhYmxlUmVzb2x2ZXIucmVzb2x2ZVZhcmlhYmxlKHBOYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTeW5jaHJvbml6ZSB2YXJpYWJsZXMgYXQgYmVnaW4gb2YgdGFnIGZpbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzeW5jQmVnaW5UYWdGaWxlKCkgeworCXNhdmVOZXN0ZWRWYXJpYWJsZXMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTeW5jaHJvbml6ZSB2YXJpYWJsZXMgYmVmb3JlIGZyYWdtZW50IGludm9rYXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzeW5jQmVmb3JlSW52b2tlKCkgeworCWNvcHlUYWdUb1BhZ2VTY29wZShWYXJpYWJsZUluZm8uTkVTVEVEKTsKKwljb3B5VGFnVG9QYWdlU2NvcGUoVmFyaWFibGVJbmZvLkFUX0JFR0lOKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTeW5jaHJvbml6ZSB2YXJpYWJsZXMgYXQgZW5kIG9mIHRhZyBmaWxlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3luY0VuZFRhZ0ZpbGUoKSB7CisJY29weVRhZ1RvUGFnZVNjb3BlKFZhcmlhYmxlSW5mby5BVF9CRUdJTik7CisJY29weVRhZ1RvUGFnZVNjb3BlKFZhcmlhYmxlSW5mby5BVF9FTkQpOworCXJlc3RvcmVOZXN0ZWRWYXJpYWJsZXMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb3BpZXMgdGhlIHZhcmlhYmxlcyBvZiB0aGUgZ2l2ZW4gc2NvcGUgZnJvbSB0aGUgdmlydHVhbCBwYWdlIHNjb3BlIG9mCisgICAgICogdGhpcyBKU1AgY29udGV4dCB3cmFwcGVyIHRvIHRoZSBwYWdlIHNjb3BlIG9mIHRoZSBpbnZva2luZyBKU1AgY29udGV4dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzY29wZSB2YXJpYWJsZSBzY29wZSAob25lIG9mIE5FU1RFRCwgQVRfQkVHSU4sIG9yIEFUX0VORCkKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgY29weVRhZ1RvUGFnZVNjb3BlKGludCBzY29wZSkgeworCUl0ZXJhdG9yIGl0ZXIgPSBudWxsOworCisJc3dpdGNoIChzY29wZSkgeworCWNhc2UgVmFyaWFibGVJbmZvLk5FU1RFRDoKKwkgICAgaWYgKG5lc3RlZFZhcnMgIT0gbnVsbCkgeworCQlpdGVyID0gbmVzdGVkVmFycy5pdGVyYXRvcigpOworCSAgICB9CisJICAgIGJyZWFrOworCWNhc2UgVmFyaWFibGVJbmZvLkFUX0JFR0lOOgorCSAgICBpZiAoYXRCZWdpblZhcnMgIT0gbnVsbCkgeworCQlpdGVyID0gYXRCZWdpblZhcnMuaXRlcmF0b3IoKTsKKwkgICAgfQorCSAgICBicmVhazsKKwljYXNlIFZhcmlhYmxlSW5mby5BVF9FTkQ6CisJICAgIGlmIChhdEVuZFZhcnMgIT0gbnVsbCkgeworCQlpdGVyID0gYXRFbmRWYXJzLml0ZXJhdG9yKCk7CisJICAgIH0KKwkgICAgYnJlYWs7CisJfQorCisJd2hpbGUgKChpdGVyICE9IG51bGwpICYmIGl0ZXIuaGFzTmV4dCgpKSB7CisJICAgIFN0cmluZyB2YXJOYW1lID0gKFN0cmluZykgaXRlci5uZXh0KCk7CisJICAgIE9iamVjdCBvYmogPSBnZXRBdHRyaWJ1dGUodmFyTmFtZSk7CisJICAgIHZhck5hbWUgPSBmaW5kQWxpYXModmFyTmFtZSk7CisJICAgIGlmIChvYmogIT0gbnVsbCkgeworCQlpbnZva2luZ0pzcEN0eHQuc2V0QXR0cmlidXRlKHZhck5hbWUsIG9iaik7CisJICAgIH0gZWxzZSB7CisJCWludm9raW5nSnNwQ3R4dC5yZW1vdmVBdHRyaWJ1dGUodmFyTmFtZSwgUEFHRV9TQ09QRSk7CisJICAgIH0KKwl9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2F2ZXMgdGhlIHZhbHVlcyBvZiBhbnkgTkVTVEVEIHZhcmlhYmxlcyB0aGF0IGFyZSBwcmVzZW50IGluCisgICAgICogdGhlIGludm9raW5nIEpTUCBjb250ZXh0LCBzbyB0aGV5IGNhbiBsYXRlciBiZSByZXN0b3JlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2F2ZU5lc3RlZFZhcmlhYmxlcygpIHsKKwlpZiAobmVzdGVkVmFycyAhPSBudWxsKSB7CisJICAgIEl0ZXJhdG9yIGl0ZXIgPSBuZXN0ZWRWYXJzLml0ZXJhdG9yKCk7CisJICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgeworCQlTdHJpbmcgdmFyTmFtZSA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOworCQl2YXJOYW1lID0gZmluZEFsaWFzKHZhck5hbWUpOworCQlPYmplY3Qgb2JqID0gaW52b2tpbmdKc3BDdHh0LmdldEF0dHJpYnV0ZSh2YXJOYW1lKTsKKwkJaWYgKG9iaiAhPSBudWxsKSB7CisJCSAgICBvcmlnaW5hbE5lc3RlZFZhcnMucHV0KHZhck5hbWUsIG9iaik7CisJCX0KKwkgICAgfQorCX0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXN0b3JlcyB0aGUgdmFsdWVzIG9mIGFueSBORVNURUQgdmFyaWFibGVzIGluIHRoZSBpbnZva2luZyBKU1AKKyAgICAgKiBjb250ZXh0LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCByZXN0b3JlTmVzdGVkVmFyaWFibGVzKCkgeworCWlmIChuZXN0ZWRWYXJzICE9IG51bGwpIHsKKwkgICAgSXRlcmF0b3IgaXRlciA9IG5lc3RlZFZhcnMuaXRlcmF0b3IoKTsKKwkgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisJCVN0cmluZyB2YXJOYW1lID0gKFN0cmluZykgaXRlci5uZXh0KCk7CisJCXZhck5hbWUgPSBmaW5kQWxpYXModmFyTmFtZSk7CisJCU9iamVjdCBvYmogPSBvcmlnaW5hbE5lc3RlZFZhcnMuZ2V0KHZhck5hbWUpOworCQlpZiAob2JqICE9IG51bGwpIHsKKwkJICAgIGludm9raW5nSnNwQ3R4dC5zZXRBdHRyaWJ1dGUodmFyTmFtZSwgb2JqKTsKKwkJfSBlbHNlIHsKKwkJICAgIGludm9raW5nSnNwQ3R4dC5yZW1vdmVBdHRyaWJ1dGUodmFyTmFtZSwgUEFHRV9TQ09QRSk7CisJCX0KKwkgICAgfQorCX0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgdG8gc2VlIGlmIHRoZSBnaXZlbiB2YXJpYWJsZSBuYW1lIGlzIHVzZWQgYXMgYW4gYWxpYXMsIGFuZCBpZiBzbywKKyAgICAgKiByZXR1cm5zIHRoZSB2YXJpYWJsZSBuYW1lIGZvciB3aGljaCBpdCBpcyB1c2VkIGFzIGFuIGFsaWFzLgorICAgICAqCisgICAgICogQHBhcmFtIHZhck5hbWUgVGhlIHZhcmlhYmxlIG5hbWUgdG8gY2hlY2sKKyAgICAgKiBAcmV0dXJuIFRoZSB2YXJpYWJsZSBuYW1lIGZvciB3aGljaCB2YXJOYW1lIGlzIHVzZWQgYXMgYW4gYWxpYXMsIG9yCisgICAgICogdmFyTmFtZSBpZiBpdCBpcyBub3QgYmVpbmcgdXNlZCBhcyBhbiBhbGlhcworICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGZpbmRBbGlhcyhTdHJpbmcgdmFyTmFtZSkgeworCisJaWYgKGFsaWFzZXMgPT0gbnVsbCkKKwkgICAgcmV0dXJuIHZhck5hbWU7CisKKwlTdHJpbmcgYWxpYXMgPSAoU3RyaW5nKSBhbGlhc2VzLmdldCh2YXJOYW1lKTsKKwlpZiAoYWxpYXMgPT0gbnVsbCkgeworCSAgICByZXR1cm4gdmFyTmFtZTsKKwl9CisJcmV0dXJuIGFsaWFzOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3J1bnRpbWUvSnNwRmFjdG9yeUltcGwuamF2YSBiL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9ydW50aW1lL0pzcEZhY3RvcnlJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM3ZWZhYQotLS0gL2Rldi9udWxsCisrKyBiL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9ydW50aW1lL0pzcEZhY3RvcnlJbXBsLmphdmEKQEAgLTAsMCArMSwxNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYXNwZXIucnVudGltZTsKKworaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb247CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXQ7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC5Kc3BGYWN0b3J5OworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLkpzcEVuZ2luZUluZm87CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AuUGFnZUNvbnRleHQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci51dGlsLlNpbXBsZVBvb2w7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgSnNwRmFjdG9yeS4KKyAqCisgKiBAYXV0aG9yIEFuaWwgSy4gVmlqZW5kcmFuCisgKi8KK3B1YmxpYyBjbGFzcyBKc3BGYWN0b3J5SW1wbCBleHRlbmRzIEpzcEZhY3RvcnkgeworCisgICAgLy8gTG9nZ2VyCisgICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEpzcEZhY3RvcnlJbXBsLmNsYXNzKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTUEVDX1ZFUlNJT04gPSAiMi4wIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIFVTRV9QT09MID0gdHJ1ZTsKKworICAgIHByaXZhdGUgU2ltcGxlUG9vbCBwb29sID0gbmV3IFNpbXBsZVBvb2woIDEwMCApOworICAgIAorICAgIHB1YmxpYyBQYWdlQ29udGV4dCBnZXRQYWdlQ29udGV4dChTZXJ2bGV0IHNlcnZsZXQsCisJCQkJICAgICAgU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZXJyb3JQYWdlVVJMLCAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gbmVlZHNTZXNzaW9uLAorCQkJCSAgICAgIGludCBidWZmZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGF1dG9mbHVzaCkgeworCisJaWYoIFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSAhPSBudWxsICkgeworCSAgICBQcml2aWxlZ2VkR2V0UGFnZUNvbnRleHQgZHAgPSBuZXcgUHJpdmlsZWdlZEdldFBhZ2VDb250ZXh0KAorCQkoSnNwRmFjdG9yeUltcGwpdGhpcywgc2VydmxldCwgcmVxdWVzdCwgcmVzcG9uc2UsIGVycm9yUGFnZVVSTCwKKyAgICAgICAgICAgICAgICBuZWVkc1Nlc3Npb24sIGJ1ZmZlclNpemUsIGF1dG9mbHVzaCk7CisJICAgIHJldHVybiAoUGFnZUNvbnRleHQpQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoZHApOworCX0gZWxzZSB7CisJICAgIHJldHVybiBpbnRlcm5hbEdldFBhZ2VDb250ZXh0KHNlcnZsZXQsIHJlcXVlc3QsIHJlc3BvbnNlLAorCQkJCQkgIGVycm9yUGFnZVVSTCwgbmVlZHNTZXNzaW9uLAorCQkJCQkgIGJ1ZmZlclNpemUsIGF1dG9mbHVzaCk7CisJfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbGVhc2VQYWdlQ29udGV4dChQYWdlQ29udGV4dCBwYykgeworCWlmKCBwYyA9PSBudWxsICkKKwkgICAgcmV0dXJuOworICAgICAgICBpZiggU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpICE9IG51bGwgKSB7CisgICAgICAgICAgICBQcml2aWxlZ2VkUmVsZWFzZVBhZ2VDb250ZXh0IGRwID0gbmV3IFByaXZpbGVnZWRSZWxlYXNlUGFnZUNvbnRleHQoCisgICAgICAgICAgICAgICAgKEpzcEZhY3RvcnlJbXBsKXRoaXMscGMpOworICAgICAgICAgICAgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoZHApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50ZXJuYWxSZWxlYXNlUGFnZUNvbnRleHQocGMpOworCX0KKyAgICB9CisKKyAgICBwdWJsaWMgSnNwRW5naW5lSW5mbyBnZXRFbmdpbmVJbmZvKCkgeworICAgICAgICByZXR1cm4gbmV3IEpzcEVuZ2luZUluZm8oKSB7CisJCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWNhdGlvblZlcnNpb24oKSB7CisJCSAgICByZXR1cm4gU1BFQ19WRVJTSU9OOworCQl9CisJICAgIH07CisgICAgfQorCisgICAgcHJpdmF0ZSBQYWdlQ29udGV4dCBpbnRlcm5hbEdldFBhZ2VDb250ZXh0KFNlcnZsZXQgc2VydmxldCwKKwkJCQkJICAgICAgIFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisJCQkJCSAgICAgICBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UsIAorCQkJCQkgICAgICAgU3RyaW5nIGVycm9yUGFnZVVSTCwgCisJCQkJCSAgICAgICBib29sZWFuIG5lZWRzU2Vzc2lvbiwKKwkJCQkJICAgICAgIGludCBidWZmZXJTaXplLCAKKwkJCQkJICAgICAgIGJvb2xlYW4gYXV0b2ZsdXNoKSB7CisgICAgICAgIHRyeSB7CisJICAgIFBhZ2VDb250ZXh0IHBjOworCSAgICBpZiggVVNFX1BPT0wgKSB7CisgICAgICAgICAgICAgICAgcGMgPSAoUGFnZUNvbnRleHQpIHBvb2wuZ2V0KCk7CisJCWlmKCBwYyA9PSBudWxsICkgeworCQkgICAgcGM9IG5ldyBQYWdlQ29udGV4dEltcGwodGhpcyk7CisJCX0KKwkgICAgfSBlbHNlIHsKKwkJcGMgPSBuZXcgUGFnZUNvbnRleHRJbXBsKHRoaXMpOworCSAgICB9CisJICAgIHBjLmluaXRpYWxpemUoc2VydmxldCwgcmVxdWVzdCwgcmVzcG9uc2UsIGVycm9yUGFnZVVSTCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRzU2Vzc2lvbiwgYnVmZmVyU2l6ZSwgYXV0b2ZsdXNoKTsKKyAgICAgICAgICAgIHJldHVybiBwYzsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGV4KSB7CisgICAgICAgICAgICAvKiBGSVhNRTogbmVlZCB0byBkbyBzb21ldGhpbmcgcmVhc29uYWJsZSBoZXJlISEgKi8KKyAgICAgICAgICAgIGxvZy5mYXRhbCgiRXhjZXB0aW9uIGluaXRpYWxpemluZyBwYWdlIGNvbnRleHQiLCBleCk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbnRlcm5hbFJlbGVhc2VQYWdlQ29udGV4dChQYWdlQ29udGV4dCBwYykgeworICAgICAgICBwYy5yZWxlYXNlKCk7CisJaWYgKFVTRV9QT09MICYmIChwYyBpbnN0YW5jZW9mIFBhZ2VDb250ZXh0SW1wbCkpIHsKKwkgICAgcG9vbC5wdXQoIHBjICk7CisJfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgUHJpdmlsZWdlZEdldFBhZ2VDb250ZXh0IGltcGxlbWVudHMgUHJpdmlsZWdlZEFjdGlvbiB7CisKKwlwcml2YXRlIEpzcEZhY3RvcnlJbXBsIGZhY3Rvcnk7CisJcHJpdmF0ZSBTZXJ2bGV0IHNlcnZsZXQ7CisJcHJpdmF0ZSBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0OworCXByaXZhdGUgU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlOworCXByaXZhdGUgU3RyaW5nIGVycm9yUGFnZVVSTDsKKwlwcml2YXRlIGJvb2xlYW4gbmVlZHNTZXNzaW9uOworCXByaXZhdGUgaW50IGJ1ZmZlclNpemU7CisJcHJpdmF0ZSBib29sZWFuIGF1dG9mbHVzaDsKKworCVByaXZpbGVnZWRHZXRQYWdlQ29udGV4dChKc3BGYWN0b3J5SW1wbCBmYWN0b3J5LAorCQkJCSBTZXJ2bGV0IHNlcnZsZXQsCisJCQkJIFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisJCQkJIFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSwKKwkJCQkgU3RyaW5nIGVycm9yUGFnZVVSTCwKKwkJCQkgYm9vbGVhbiBuZWVkc1Nlc3Npb24sCisJCQkJIGludCBidWZmZXJTaXplLAorCQkJCSBib29sZWFuIGF1dG9mbHVzaCkgeworCSAgICB0aGlzLmZhY3RvcnkgPSBmYWN0b3J5OworCSAgICB0aGlzLnNlcnZsZXQgPSBzZXJ2bGV0OworCSAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0OworCSAgICB0aGlzLnJlc3BvbnNlID0gcmVzcG9uc2U7CisJICAgIHRoaXMuZXJyb3JQYWdlVVJMID0gZXJyb3JQYWdlVVJMOworCSAgICB0aGlzLm5lZWRzU2Vzc2lvbiA9IG5lZWRzU2Vzc2lvbjsKKwkgICAgdGhpcy5idWZmZXJTaXplID0gYnVmZmVyU2l6ZTsKKwkgICAgdGhpcy5hdXRvZmx1c2ggPSBhdXRvZmx1c2g7CisJfQorIAorCXB1YmxpYyBPYmplY3QgcnVuKCkgeworCSAgICByZXR1cm4gZmFjdG9yeS5pbnRlcm5hbEdldFBhZ2VDb250ZXh0KHNlcnZsZXQsCisJCQkJCQkgIHJlcXVlc3QsCisJCQkJCQkgIHJlc3BvbnNlLAorCQkJCQkJICBlcnJvclBhZ2VVUkwsCisJCQkJCQkgIG5lZWRzU2Vzc2lvbiwKKwkJCQkJCSAgYnVmZmVyU2l6ZSwKKwkJCQkJCSAgYXV0b2ZsdXNoKTsKKwl9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBQcml2aWxlZ2VkUmVsZWFzZVBhZ2VDb250ZXh0IGltcGxlbWVudHMgUHJpdmlsZWdlZEFjdGlvbiB7CisKKyAgICAgICAgcHJpdmF0ZSBKc3BGYWN0b3J5SW1wbCBmYWN0b3J5OworCXByaXZhdGUgUGFnZUNvbnRleHQgcGFnZUNvbnRleHQ7CisKKyAgICAgICAgUHJpdmlsZWdlZFJlbGVhc2VQYWdlQ29udGV4dChKc3BGYWN0b3J5SW1wbCBmYWN0b3J5LAorCQkJCSAgICAgUGFnZUNvbnRleHQgcGFnZUNvbnRleHQpIHsKKyAgICAgICAgICAgIHRoaXMuZmFjdG9yeSA9IGZhY3Rvcnk7CisgICAgICAgICAgICB0aGlzLnBhZ2VDb250ZXh0ID0gcGFnZUNvbnRleHQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKKyAgICAgICAgICAgIGZhY3RvcnkuaW50ZXJuYWxSZWxlYXNlUGFnZUNvbnRleHQocGFnZUNvbnRleHQpOworCSAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9ydW50aW1lL0pzcEZyYWdtZW50SGVscGVyLmphdmEgYi9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvcnVudGltZS9Kc3BGcmFnbWVudEhlbHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlNzNmNTIKLS0tIC9kZXYvbnVsbAorKysgYi9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvcnVudGltZS9Kc3BGcmFnbWVudEhlbHBlci5qYXZhCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphc3Blci5ydW50aW1lOworCitpbXBvcnQgamF2YXguc2VydmxldC5qc3AuSnNwQ29udGV4dDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC5QYWdlQ29udGV4dDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuSnNwRnJhZ21lbnQ7CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0LkpzcFRhZzsKKworLyoqCisgKiBIZWxwZXIgY2xhc3MgZnJvbSB3aGljaCBhbGwgSnNwIEZyYWdtZW50IGhlbHBlciBjbGFzc2VzIGV4dGVuZC4KKyAqIFRoaXMgY2xhc3MgYWxsb3dzIGZvciB0aGUgZW11bGF0aW9uIG9mIG51bWVyb3VzIGZyYWdtZW50cyB3aXRoaW4KKyAqIGEgc2luZ2xlIGNsYXNzLCB3aGljaCBpbiB0dXJuIHJlZHVjZXMgdGhlIGxvYWQgb24gdGhlIGNsYXNzIGxvYWRlcgorICogc2luY2UgdGhlcmUgYXJlIHBvdGVudGlhbGx5IG1hbnkgSnNwRnJhZ21lbnRzIGluIGEgc2luZ2xlIHBhZ2UuCisgKiA8cD4KKyAqIFRoZSBjbGFzcyBhbHNvIHByb3ZpZGVzIHZhcmlvdXMgdXRpbGl0eSBtZXRob2RzIGZvciBKc3BGcmFnbWVudAorICogaW1wbGVtZW50YXRpb25zLgorICoKKyAqIEBhdXRob3IgTWFyayBSb3RoCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBKc3BGcmFnbWVudEhlbHBlciAKKyAgICBleHRlbmRzIEpzcEZyYWdtZW50IAoreworICAgIAorICAgIHByb3RlY3RlZCBpbnQgZGlzY3JpbWluYXRvcjsKKyAgICBwcm90ZWN0ZWQgSnNwQ29udGV4dCBqc3BDb250ZXh0OworICAgIHByb3RlY3RlZCBQYWdlQ29udGV4dCBfanNweF9wYWdlX2NvbnRleHQ7CisgICAgcHJvdGVjdGVkIEpzcFRhZyBwYXJlbnRUYWc7CisKKyAgICBwdWJsaWMgSnNwRnJhZ21lbnRIZWxwZXIoIGludCBkaXNjcmltaW5hdG9yLCBKc3BDb250ZXh0IGpzcENvbnRleHQsIAorICAgICAgICBKc3BUYWcgcGFyZW50VGFnICkgCisgICAgeworICAgICAgICB0aGlzLmRpc2NyaW1pbmF0b3IgPSBkaXNjcmltaW5hdG9yOworICAgICAgICB0aGlzLmpzcENvbnRleHQgPSBqc3BDb250ZXh0OworICAgICAgICB0aGlzLl9qc3B4X3BhZ2VfY29udGV4dCA9IG51bGw7CisgICAgICAgIGlmKCBqc3BDb250ZXh0IGluc3RhbmNlb2YgUGFnZUNvbnRleHQgKSB7CisgICAgICAgICAgICBfanNweF9wYWdlX2NvbnRleHQgPSAoUGFnZUNvbnRleHQpanNwQ29udGV4dDsKKyAgICAgICAgfQorICAgICAgICB0aGlzLnBhcmVudFRhZyA9IHBhcmVudFRhZzsKKyAgICB9CisgICAgCisgICAgcHVibGljIEpzcENvbnRleHQgZ2V0SnNwQ29udGV4dCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuanNwQ29udGV4dDsKKyAgICB9CisgICAgCisgICAgcHVibGljIEpzcFRhZyBnZXRQYXJlbnRUYWcoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnBhcmVudFRhZzsKKyAgICB9CisgICAgCit9CmRpZmYgLS1naXQgYS9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvcnVudGltZS9Kc3BSdW50aW1lTGlicmFyeS5qYXZhIGIvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3J1bnRpbWUvSnNwUnVudGltZUxpYnJhcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzBkMTQyCi0tLSAvZGV2L251bGwKKysrIGIvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3J1bnRpbWUvSnNwUnVudGltZUxpYnJhcnkuamF2YQpAQCAtMCwwICsxLDEwNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphc3Blci5ydW50aW1lOworCitpbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUVkaXRvcjsKK2ltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5RWRpdG9yTWFuYWdlcjsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlJlcXVlc3REaXNwYXRjaGVyOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldFJlc3BvbnNlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AuSnNwV3JpdGVyOworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLlBhZ2VDb250ZXh0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5Cb2R5Q29udGVudDsKKworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLkphc3BlckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5jb21waWxlci5Mb2NhbGl6ZXI7CisKKy8qKgorICogQnVuY2ggb2YgdXRpbCBtZXRob2RzIHRoYXQgYXJlIHVzZWQgYnkgY29kZSBnZW5lcmF0ZWQgZm9yIHVzZUJlYW4sCisgKiBnZXRQcm9wZXJ0eSBhbmQgc2V0UHJvcGVydHkuICAKKyAqCisgKiBUaGUgX19iZWdpbiwgX19lbmQgc3R1ZmYgaXMgdGhlcmUgc28gdGhhdCB0aGUgSlNQIGVuZ2luZSBjYW4KKyAqIGFjdHVhbGx5IHBhcnNlIHRoaXMgZmlsZSBhbmQgaW5saW5lIHRoZW0gaWYgcGVvcGxlIGRvbid0IHdhbnQKKyAqIHJ1bnRpbWUgZGVwZW5kZW5jaWVzIG9uIHRoaXMgY2xhc3MuIEhvd2V2ZXIsIEknbSBub3Qgc3VyZSBpZiB0aGF0CisgKiB3b3JrcyBzbyB3ZWxsIHJpZ2h0IG5vdy4gSXQgZ290IGZvcmdvdHRlbiBhdCBzb21lIHBvaW50LiAtYWt2CisgKgorICogQGF1dGhvciBNYW5kYXIgUmFqZQorICogQGF1dGhvciBTaGF3biBCYXllcm4KKyAqLworcHVibGljIGNsYXNzIEpzcFJ1bnRpbWVMaWJyYXJ5IHsKKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVkxFVF9FWENFUFRJT04KKwk9ICJqYXZheC5zZXJ2bGV0LmVycm9yLmV4Y2VwdGlvbiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9FWENFUFRJT04KKwk9ICJqYXZheC5zZXJ2bGV0LmpzcC5qc3BFeGNlcHRpb24iOworCisgICAgcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBQcml2aWxlZ2VkSW50cm9zcGVjdEhlbHBlcgorCWltcGxlbWVudHMgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbiB7CisKKwlwcml2YXRlIE9iamVjdCBiZWFuOworCXByaXZhdGUgU3RyaW5nIHByb3A7CisJcHJpdmF0ZSBTdHJpbmcgdmFsdWU7CisJcHJpdmF0ZSBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0OworCXByaXZhdGUgU3RyaW5nIHBhcmFtOworCXByaXZhdGUgYm9vbGVhbiBpZ25vcmVNZXRob2RORjsKKworICAgICAgICBQcml2aWxlZ2VkSW50cm9zcGVjdEhlbHBlcihPYmplY3QgYmVhbiwgU3RyaW5nIHByb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSwgU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhcmFtLCBib29sZWFuIGlnbm9yZU1ldGhvZE5GKQorICAgICAgICB7CisJICAgIHRoaXMuYmVhbiA9IGJlYW47CisJICAgIHRoaXMucHJvcCA9IHByb3A7CisJICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7CisJICAgIHRoaXMucGFyYW0gPSBwYXJhbTsKKwkgICAgdGhpcy5pZ25vcmVNZXRob2RORiA9IGlnbm9yZU1ldGhvZE5GOworICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwkgICAgaW50ZXJuYWxJbnRyb3NwZWN0aGVscGVyKAorICAgICAgICAgICAgICAgIGJlYW4scHJvcCx2YWx1ZSxyZXF1ZXN0LHBhcmFtLGlnbm9yZU1ldGhvZE5GKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGphdmF4LnNlcnZsZXQuZXJyb3IuZXhjZXB0aW9uIHJlcXVlc3QKKyAgICAgKiBhdHRyaWJ1dGUgdmFsdWUsIGlmIHByZXNlbnQsIG90aGVyd2lzZSB0aGUgdmFsdWUgb2YgdGhlCisgICAgICogamF2YXguc2VydmxldC5qc3AuanNwRXhjZXB0aW9uIHJlcXVlc3QgYXR0cmlidXRlIHZhbHVlLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGdlbmVyYXRlZCBzZXJ2bGV0IGNvZGUKKyAgICAgKiBmb3IgYSBKU1AgZXJyb3IgcGFnZSwgd2hlbiB0aGUgImV4Y2VwdGlvbiIgaW1wbGljaXQgc2NyaXB0aW5nIGxhbmd1YWdlCisgICAgICogdmFyaWFibGUgaXMgaW5pdGlhbGl6ZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBUaHJvd2FibGUgZ2V0VGhyb3dhYmxlKFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKwlUaHJvd2FibGUgZXJyb3IgPSAoVGhyb3dhYmxlKSByZXF1ZXN0LmdldEF0dHJpYnV0ZShTRVJWTEVUX0VYQ0VQVElPTik7CisJaWYgKGVycm9yID09IG51bGwpIHsKKwkgICAgZXJyb3IgPSAoVGhyb3dhYmxlKSByZXF1ZXN0LmdldEF0dHJpYnV0ZShKU1BfRVhDRVBUSU9OKTsKKwkgICAgaWYgKGVycm9yICE9IG51bGwpIHsKKwkJLyoKKwkJICogVGhlIG9ubHkgcGxhY2UgdGhhdCBzZXRzIEpTUF9FWENFUFRJT04gaXMKKwkJICogUGFnZUNvbnRleHRJbXBsLmhhbmRsZVBhZ2VFeGNlcHRpb24oKS4gSXQgcmVhbGx5IHNob3VsZCBzZXQKKwkJICogU0VSVkxFVF9FWENFUFRJT04sIGJ1dCB0aGF0IHdvdWxkIGludGVyZmVyZSB3aXRoIHRoZSAKKwkJICogRXJyb3JSZXBvcnRWYWx2ZS4gVGhlcmVmb3JlLCBpZiBKU1BfRVhDRVBUSU9OIGlzIHNldCwgd2UKKwkJICogbmVlZCB0byBzZXQgU0VSVkxFVF9FWENFUFRJT04uCisJCSAqLworCQlyZXF1ZXN0LnNldEF0dHJpYnV0ZShTRVJWTEVUX0VYQ0VQVElPTiwgZXJyb3IpOworCSAgICB9CisJfQorCisJcmV0dXJuIGVycm9yOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb2VyY2VUb0Jvb2xlYW4oU3RyaW5nIHMpIHsKKwlpZiAocyA9PSBudWxsIHx8IHMubGVuZ3RoKCkgPT0gMCkKKwkgICAgcmV0dXJuIGZhbHNlOworCWVsc2UKKwkgICAgcmV0dXJuIEJvb2xlYW4udmFsdWVPZihzKS5ib29sZWFuVmFsdWUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJ5dGUgY29lcmNlVG9CeXRlKFN0cmluZyBzKSB7CisJaWYgKHMgPT0gbnVsbCB8fCBzLmxlbmd0aCgpID09IDApCisJICAgIHJldHVybiAoYnl0ZSkgMDsKKwllbHNlCisJICAgIHJldHVybiBCeXRlLnZhbHVlT2YocykuYnl0ZVZhbHVlKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjaGFyIGNvZXJjZVRvQ2hhcihTdHJpbmcgcykgeworCWlmIChzID09IG51bGwgfHwgcy5sZW5ndGgoKSA9PSAwKSB7CisJICAgIHJldHVybiAoY2hhcikgMDsKKwl9IGVsc2UgeworCSAgICAvLyB0aGlzIHRyaWNrIGF2b2lkcyBlc2NhcGluZyBpc3N1ZXMKKwkgICAgcmV0dXJuIChjaGFyKShpbnQpIHMuY2hhckF0KDApOworCX0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGRvdWJsZSBjb2VyY2VUb0RvdWJsZShTdHJpbmcgcykgeworCWlmIChzID09IG51bGwgfHwgcy5sZW5ndGgoKSA9PSAwKQorCSAgICByZXR1cm4gKGRvdWJsZSkgMDsKKwllbHNlCisJICAgIHJldHVybiBEb3VibGUudmFsdWVPZihzKS5kb3VibGVWYWx1ZSgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZmxvYXQgY29lcmNlVG9GbG9hdChTdHJpbmcgcykgeworCWlmIChzID09IG51bGwgfHwgcy5sZW5ndGgoKSA9PSAwKQorCSAgICByZXR1cm4gKGZsb2F0KSAwOworCWVsc2UKKwkgICAgcmV0dXJuIEZsb2F0LnZhbHVlT2YocykuZmxvYXRWYWx1ZSgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgaW50IGNvZXJjZVRvSW50KFN0cmluZyBzKSB7CisJaWYgKHMgPT0gbnVsbCB8fCBzLmxlbmd0aCgpID09IDApCisJICAgIHJldHVybiAwOworCWVsc2UKKwkgICAgcmV0dXJuIEludGVnZXIudmFsdWVPZihzKS5pbnRWYWx1ZSgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgc2hvcnQgY29lcmNlVG9TaG9ydChTdHJpbmcgcykgeworCWlmIChzID09IG51bGwgfHwgcy5sZW5ndGgoKSA9PSAwKQorCSAgICByZXR1cm4gKHNob3J0KSAwOworCWVsc2UKKwkgICAgcmV0dXJuIFNob3J0LnZhbHVlT2Yocykuc2hvcnRWYWx1ZSgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBjb2VyY2VUb0xvbmcoU3RyaW5nIHMpIHsKKwlpZiAocyA9PSBudWxsIHx8IHMubGVuZ3RoKCkgPT0gMCkKKwkgICAgcmV0dXJuIChsb25nKSAwOworCWVsc2UKKwkgICAgcmV0dXJuIExvbmcudmFsdWVPZihzKS5sb25nVmFsdWUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBjb2VyY2UoU3RyaW5nIHMsIENsYXNzIHRhcmdldCkgeworCisJYm9vbGVhbiBpc051bGxPckVtcHR5ID0gKHMgPT0gbnVsbCB8fCBzLmxlbmd0aCgpID09IDApOworCisJaWYgKHRhcmdldCA9PSBCb29sZWFuLmNsYXNzKSB7CisJICAgIGlmIChpc051bGxPckVtcHR5KSB7CisJCXMgPSAiZmFsc2UiOworCSAgICB9CisJICAgIHJldHVybiBuZXcgQm9vbGVhbihzKTsKKwl9IGVsc2UgaWYgKHRhcmdldCA9PSBCeXRlLmNsYXNzKSB7CisJICAgIGlmIChpc051bGxPckVtcHR5KQorCQlyZXR1cm4gbmV3IEJ5dGUoKGJ5dGUpIDApOworCSAgICBlbHNlCisJCXJldHVybiBuZXcgQnl0ZShzKTsKKwl9IGVsc2UgaWYgKHRhcmdldCA9PSBDaGFyYWN0ZXIuY2xhc3MpIHsKKwkgICAgaWYgKGlzTnVsbE9yRW1wdHkpCisJCXJldHVybiBuZXcgQ2hhcmFjdGVyKChjaGFyKSAwKTsKKwkgICAgZWxzZSAKKwkJcmV0dXJuIG5ldyBDaGFyYWN0ZXIocy5jaGFyQXQoMCkpOworCX0gZWxzZSBpZiAodGFyZ2V0ID09IERvdWJsZS5jbGFzcykgeworCSAgICBpZiAoaXNOdWxsT3JFbXB0eSkKKwkJcmV0dXJuIG5ldyBEb3VibGUoMCk7CisJICAgIGVsc2UKKwkJcmV0dXJuIG5ldyBEb3VibGUocyk7CisJfSBlbHNlIGlmICh0YXJnZXQgPT0gRmxvYXQuY2xhc3MpIHsKKwkgICAgaWYgKGlzTnVsbE9yRW1wdHkpCisJCXJldHVybiBuZXcgRmxvYXQoMCk7CisJICAgIGVsc2UKKwkJcmV0dXJuIG5ldyBGbG9hdChzKTsKKwl9IGVsc2UgaWYgKHRhcmdldCA9PSBJbnRlZ2VyLmNsYXNzKSB7CisJICAgIGlmIChpc051bGxPckVtcHR5KQorCQlyZXR1cm4gbmV3IEludGVnZXIoMCk7CisJICAgIGVsc2UKKwkJcmV0dXJuIG5ldyBJbnRlZ2VyKHMpOworCX0gZWxzZSBpZiAodGFyZ2V0ID09IFNob3J0LmNsYXNzKSB7CisJICAgIGlmIChpc051bGxPckVtcHR5KQorCQlyZXR1cm4gbmV3IFNob3J0KChzaG9ydCkgMCk7CisJICAgIGVsc2UKKwkJcmV0dXJuIG5ldyBTaG9ydChzKTsKKwl9IGVsc2UgaWYgKHRhcmdldCA9PSBMb25nLmNsYXNzKSB7CisJICAgIGlmIChpc051bGxPckVtcHR5KQorCQlyZXR1cm4gbmV3IExvbmcoMCk7CisJICAgIGVsc2UKKwkJcmV0dXJuIG5ldyBMb25nKHMpOworCX0gZWxzZSB7CisJICAgIHJldHVybiBudWxsOworCX0KKyAgICB9CisKKyAgIC8vIF9fYmVnaW4gY29udmVydE1ldGhvZAorICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGNvbnZlcnQoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIHMsIENsYXNzIHQsCisJCQkJIENsYXNzIHByb3BlcnR5RWRpdG9yQ2xhc3MpIAorICAgICAgIHRocm93cyBKYXNwZXJFeGNlcHRpb24gCisgICAgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKHMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmICh0LmVxdWFscyhCb29sZWFuLmNsYXNzKSB8fCB0LmVxdWFscyhCb29sZWFuLlRZUEUpKQorICAgICAgICAgICAgICAgICAgICBzID0gImZhbHNlIjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCSAgICBpZiAocHJvcGVydHlFZGl0b3JDbGFzcyAhPSBudWxsKSB7CisJCXJldHVybiBnZXRWYWx1ZUZyb21CZWFuSW5mb1Byb3BlcnR5RWRpdG9yKAorCQkJCSAgICB0LCBwcm9wZXJ0eU5hbWUsIHMsIHByb3BlcnR5RWRpdG9yQ2xhc3MpOworCSAgICB9IGVsc2UgaWYgKCB0LmVxdWFscyhCb29sZWFuLmNsYXNzKSB8fCB0LmVxdWFscyhCb29sZWFuLlRZUEUpICkgeworICAgICAgICAgICAgICAgIGlmIChzLmVxdWFsc0lnbm9yZUNhc2UoIm9uIikgfHwgcy5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikpCisgICAgICAgICAgICAgICAgICAgIHMgPSAidHJ1ZSI7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBzID0gImZhbHNlIjsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEJvb2xlYW4ocyk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCB0LmVxdWFscyhCeXRlLmNsYXNzKSB8fCB0LmVxdWFscyhCeXRlLlRZUEUpICkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQnl0ZShzKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodC5lcXVhbHMoQ2hhcmFjdGVyLmNsYXNzKSB8fCB0LmVxdWFscyhDaGFyYWN0ZXIuVFlQRSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcy5sZW5ndGgoKSA+IDAgPyBuZXcgQ2hhcmFjdGVyKHMuY2hhckF0KDApKSA6IG51bGw7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCB0LmVxdWFscyhTaG9ydC5jbGFzcykgfHwgdC5lcXVhbHMoU2hvcnQuVFlQRSkgKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTaG9ydChzKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIHQuZXF1YWxzKEludGVnZXIuY2xhc3MpIHx8IHQuZXF1YWxzKEludGVnZXIuVFlQRSkgKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnRlZ2VyKHMpOworICAgICAgICAgICAgfSBlbHNlIGlmICggdC5lcXVhbHMoRmxvYXQuY2xhc3MpIHx8IHQuZXF1YWxzKEZsb2F0LlRZUEUpICkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRmxvYXQocyk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCB0LmVxdWFscyhMb25nLmNsYXNzKSB8fCB0LmVxdWFscyhMb25nLlRZUEUpICkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTG9uZyhzKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIHQuZXF1YWxzKERvdWJsZS5jbGFzcykgfHwgdC5lcXVhbHMoRG91YmxlLlRZUEUpICkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRG91YmxlKHMpOworICAgICAgICAgICAgfSBlbHNlIGlmICggdC5lcXVhbHMoU3RyaW5nLmNsYXNzKSApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gczsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIHQuZXF1YWxzKGphdmEuaW8uRmlsZS5jbGFzcykgKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBqYXZhLmlvLkZpbGUocyk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHQuZ2V0TmFtZSgpLmVxdWFscygiamF2YS5sYW5nLk9iamVjdCIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RbXSB7c307CisJICAgIH0gZWxzZSB7CisJCXJldHVybiBnZXRWYWx1ZUZyb21Qcm9wZXJ0eUVkaXRvck1hbmFnZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQsIHByb3BlcnR5TmFtZSwgcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEphc3BlckV4Y2VwdGlvbihleCk7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gX19lbmQgY29udmVydE1ldGhvZAorCisgICAgLy8gX19iZWdpbiBpbnRyb3NwZWN0TWV0aG9kCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGludHJvc3BlY3QoT2JqZWN0IGJlYW4sIFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbgorICAgIHsKKwlFbnVtZXJhdGlvbiBlID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXJOYW1lcygpOworCXdoaWxlICggZS5oYXNNb3JlRWxlbWVudHMoKSApIHsKKwkgICAgU3RyaW5nIG5hbWUgID0gKFN0cmluZykgZS5uZXh0RWxlbWVudCgpOworCSAgICBTdHJpbmcgdmFsdWUgPSByZXF1ZXN0LmdldFBhcmFtZXRlcihuYW1lKTsKKwkgICAgaW50cm9zcGVjdGhlbHBlcihiZWFuLCBuYW1lLCB2YWx1ZSwgcmVxdWVzdCwgbmFtZSwgdHJ1ZSk7CisJfQorICAgIH0KKyAgICAvLyBfX2VuZCBpbnRyb3NwZWN0TWV0aG9kCisgICAgCisgICAgLy8gX19iZWdpbiBpbnRyb3NwZWN0aGVscGVyTWV0aG9kCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGludHJvc3BlY3RoZWxwZXIoT2JqZWN0IGJlYW4sIFN0cmluZyBwcm9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSwgU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFyYW0sIGJvb2xlYW4gaWdub3JlTWV0aG9kTkYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaWYoIFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSAhPSBudWxsICkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBQcml2aWxlZ2VkSW50cm9zcGVjdEhlbHBlciBkcCA9CisJCSAgICBuZXcgUHJpdmlsZWdlZEludHJvc3BlY3RIZWxwZXIoCisJCQliZWFuLHByb3AsdmFsdWUscmVxdWVzdCxwYXJhbSxpZ25vcmVNZXRob2RORik7CisgICAgICAgICAgICAgICAgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoZHApOworICAgICAgICAgICAgfSBjYXRjaCggUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBwZSkgeworICAgICAgICAgICAgICAgIEV4Y2VwdGlvbiBlID0gcGUuZ2V0RXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgdGhyb3cgKEphc3BlckV4Y2VwdGlvbillOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50ZXJuYWxJbnRyb3NwZWN0aGVscGVyKAorCQliZWFuLHByb3AsdmFsdWUscmVxdWVzdCxwYXJhbSxpZ25vcmVNZXRob2RORik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGludGVybmFsSW50cm9zcGVjdGhlbHBlcihPYmplY3QgYmVhbiwgU3RyaW5nIHByb3AsCisJCQkJCVN0cmluZyB2YWx1ZSwgU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKwkJCQkJU3RyaW5nIHBhcmFtLCBib29sZWFuIGlnbm9yZU1ldGhvZE5GKSAKKwkJCQkJdGhyb3dzIEphc3BlckV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgTWV0aG9kIG1ldGhvZCA9IG51bGw7CisgICAgICAgIENsYXNzIHR5cGUgPSBudWxsOworICAgICAgICBDbGFzcyBwcm9wZXJ0eUVkaXRvckNsYXNzID0gbnVsbDsKKwl0cnkgeworCSAgICBqYXZhLmJlYW5zLkJlYW5JbmZvIGluZm8KKwkJPSBqYXZhLmJlYW5zLkludHJvc3BlY3Rvci5nZXRCZWFuSW5mbyhiZWFuLmdldENsYXNzKCkpOworCSAgICBpZiAoIGluZm8gIT0gbnVsbCApIHsKKwkJamF2YS5iZWFucy5Qcm9wZXJ0eURlc2NyaXB0b3IgcGRbXQorCQkgICAgPSBpbmZvLmdldFByb3BlcnR5RGVzY3JpcHRvcnMoKTsKKwkJZm9yIChpbnQgaSA9IDAgOyBpIDwgcGQubGVuZ3RoIDsgaSsrKSB7CisJCSAgICBpZiAoIHBkW2ldLmdldE5hbWUoKS5lcXVhbHMocHJvcCkgKSB7CisJCQltZXRob2QgPSBwZFtpXS5nZXRXcml0ZU1ldGhvZCgpOworCQkJdHlwZSAgID0gcGRbaV0uZ2V0UHJvcGVydHlUeXBlKCk7CisJCQlwcm9wZXJ0eUVkaXRvckNsYXNzID0gcGRbaV0uZ2V0UHJvcGVydHlFZGl0b3JDbGFzcygpOworCQkJYnJlYWs7CisJCSAgICB9CisJCX0KKwkgICAgfQorCSAgICBpZiAoIG1ldGhvZCAhPSBudWxsICkgeworCQlpZiAodHlwZS5pc0FycmF5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVlc3QgPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IEphc3BlckV4Y2VwdGlvbigKKwkJICAgICAgICAgICAgTG9jYWxpemVyLmdldE1lc3NhZ2UoImpzcC5lcnJvci5iZWFucy5zZXRwcm9wZXJ0eS5ub2luZGV4c2V0IikpOworICAgICAgICAgICAgICAgICAgICB9CisJCSAgICBDbGFzcyB0ID0gdHlwZS5nZXRDb21wb25lbnRUeXBlKCk7CisJCSAgICBTdHJpbmdbXSB2YWx1ZXMgPSByZXF1ZXN0LmdldFBhcmFtZXRlclZhbHVlcyhwYXJhbSk7CisJCSAgICAvL1hYWCBQbGVhc2UgY2hlY2suCisJCSAgICBpZih2YWx1ZXMgPT0gbnVsbCkgcmV0dXJuOworCQkgICAgaWYodC5lcXVhbHMoU3RyaW5nLmNsYXNzKSkgeworCQkJbWV0aG9kLmludm9rZShiZWFuLCBuZXcgT2JqZWN0W10geyB2YWx1ZXMgfSk7CisJCSAgICB9IGVsc2UgeworCQkJT2JqZWN0IHRtcHZhbCA9IG51bGw7CisJCQljcmVhdGVUeXBlZEFycmF5IChwcm9wLCBiZWFuLCBtZXRob2QsIHZhbHVlcywgdCwKKwkJCQkJICBwcm9wZXJ0eUVkaXRvckNsYXNzKTsgCisJCSAgICB9CisJCX0gZWxzZSB7CisJCSAgICBpZih2YWx1ZSA9PSBudWxsIHx8IChwYXJhbSAhPSBudWxsICYmIHZhbHVlLmVxdWFscygiIikpKSByZXR1cm47CisJCSAgICBPYmplY3Qgb3ZhbCA9IGNvbnZlcnQocHJvcCwgdmFsdWUsIHR5cGUsIHByb3BlcnR5RWRpdG9yQ2xhc3MpOworCQkgICAgaWYgKCBvdmFsICE9IG51bGwgKQorCQkJbWV0aG9kLmludm9rZShiZWFuLCBuZXcgT2JqZWN0W10geyBvdmFsIH0pOworCQl9CisJICAgIH0KKwl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKwkgICAgdGhyb3cgbmV3IEphc3BlckV4Y2VwdGlvbihleCk7CisJfQorICAgICAgICBpZiAoIWlnbm9yZU1ldGhvZE5GICYmIChtZXRob2QgPT0gbnVsbCkpIHsKKyAgICAgICAgICAgIGlmICh0eXBlID09IG51bGwpIHsKKwkJdGhyb3cgbmV3IEphc3BlckV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgTG9jYWxpemVyLmdldE1lc3NhZ2UoImpzcC5lcnJvci5iZWFucy5ub3Byb3BlcnR5IiwKKwkJCQkJIHByb3AsCisJCQkJCSBiZWFuLmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7CisgICAgICAgICAgICB9IGVsc2UgeworCQl0aHJvdyBuZXcgSmFzcGVyRXhjZXB0aW9uKAorCSAgICAgICAgICAgIExvY2FsaXplci5nZXRNZXNzYWdlKCJqc3AuZXJyb3IuYmVhbnMubm9tZXRob2Quc2V0cHJvcGVydHkiLAorCQkJCQkgcHJvcCwKKwkJCQkJIHR5cGUuZ2V0TmFtZSgpLAorCQkJCQkgYmVhbi5nZXRDbGFzcygpLmdldE5hbWUoKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIC8vIF9fZW5kIGludHJvc3BlY3RoZWxwZXJNZXRob2QKKyAgICAKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBmdW5jdGlvbnMgdG8gY29udmVydCBidWlsdGluIEphdmEgZGF0YSB0eXBlcyB0byBzdHJpbmcuCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gX19iZWdpbiB0b1N0cmluZ01ldGhvZAorICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvU3RyaW5nKE9iamVjdCBvKSB7CisgICAgICAgIHJldHVybiBTdHJpbmcudmFsdWVPZihvKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0b1N0cmluZyhieXRlIGIpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBCeXRlKGIpLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmcoYm9vbGVhbiBiKSB7CisgICAgICAgIHJldHVybiBuZXcgQm9vbGVhbihiKS50b1N0cmluZygpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvU3RyaW5nKHNob3J0IHMpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTaG9ydChzKS50b1N0cmluZygpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvU3RyaW5nKGludCBpKSB7CisgICAgICAgIHJldHVybiBuZXcgSW50ZWdlcihpKS50b1N0cmluZygpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvU3RyaW5nKGZsb2F0IGYpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBGbG9hdChmKS50b1N0cmluZygpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvU3RyaW5nKGxvbmcgbCkgeworICAgICAgICByZXR1cm4gbmV3IExvbmcobCkudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0b1N0cmluZyhkb3VibGUgZCkgeworICAgICAgICByZXR1cm4gbmV3IERvdWJsZShkKS50b1N0cmluZygpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvU3RyaW5nKGNoYXIgYykgeworICAgICAgICByZXR1cm4gbmV3IENoYXJhY3RlcihjKS50b1N0cmluZygpOworICAgIH0KKyAgICAvLyBfX2VuZCB0b1N0cmluZ01ldGhvZAorCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSB0eXBlZCBhcnJheS4KKyAgICAgKiBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlIHdoZXJlIHBhcmFtcyBhcmUgcGFzc2VkIHRocm91Z2gKKyAgICAgKiB0aGUgcmVxdWVzdCBhbmQgdGhlIHByb3BlcnR5IGlzIGluZGV4ZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZVR5cGVkQXJyYXkoU3RyaW5nIHByb3BlcnR5TmFtZSwKKwkJCQkJT2JqZWN0IGJlYW4sCisJCQkJCU1ldGhvZCBtZXRob2QsCisJCQkJCVN0cmluZ1tdIHZhbHVlcywKKwkJCQkJQ2xhc3MgdCwKKwkJCQkJQ2xhc3MgcHJvcGVydHlFZGl0b3JDbGFzcykKKwkgICAgICAgIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCisJdHJ5IHsKKwkgICAgaWYgKHByb3BlcnR5RWRpdG9yQ2xhc3MgIT0gbnVsbCkgeworCQlPYmplY3RbXSB0bXB2YWwgPSBuZXcgSW50ZWdlclt2YWx1ZXMubGVuZ3RoXTsKKwkJZm9yIChpbnQgaT0wOyBpPHZhbHVlcy5sZW5ndGg7IGkrKykgeworCQkgICAgdG1wdmFsW2ldID0gZ2V0VmFsdWVGcm9tQmVhbkluZm9Qcm9wZXJ0eUVkaXRvcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LCBwcm9wZXJ0eU5hbWUsIHZhbHVlc1tpXSwgcHJvcGVydHlFZGl0b3JDbGFzcyk7CisJCX0KKwkJbWV0aG9kLmludm9rZSAoYmVhbiwgbmV3IE9iamVjdFtdIHt0bXB2YWx9KTsKKwkgICAgfSBlbHNlIGlmICh0LmVxdWFscyhJbnRlZ2VyLmNsYXNzKSkgeworCQlJbnRlZ2VyIFtddG1wdmFsID0gbmV3IEludGVnZXJbdmFsdWVzLmxlbmd0aF07CisJCWZvciAoaW50IGkgPSAwIDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykKKwkJICAgIHRtcHZhbFtpXSA9ICBuZXcgSW50ZWdlciAodmFsdWVzW2ldKTsKKwkJbWV0aG9kLmludm9rZSAoYmVhbiwgbmV3IE9iamVjdFtdIHt0bXB2YWx9KTsKKwkgICAgfSBlbHNlIGlmICh0LmVxdWFscyhCeXRlLmNsYXNzKSkgeworCQlCeXRlW10gdG1wdmFsID0gbmV3IEJ5dGVbdmFsdWVzLmxlbmd0aF07CisJCWZvciAoaW50IGkgPSAwIDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykKKwkJICAgIHRtcHZhbFtpXSA9IG5ldyBCeXRlICh2YWx1ZXNbaV0pOworCQltZXRob2QuaW52b2tlIChiZWFuLCBuZXcgT2JqZWN0W10ge3RtcHZhbH0pOworCSAgICB9IGVsc2UgaWYgKHQuZXF1YWxzKEJvb2xlYW4uY2xhc3MpKSB7CisJCUJvb2xlYW5bXSB0bXB2YWwgPSBuZXcgQm9vbGVhblt2YWx1ZXMubGVuZ3RoXTsKKwkJZm9yIChpbnQgaSA9IDAgOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKQorCQkgICAgdG1wdmFsW2ldID0gbmV3IEJvb2xlYW4gKHZhbHVlc1tpXSk7CisJCW1ldGhvZC5pbnZva2UgKGJlYW4sIG5ldyBPYmplY3RbXSB7dG1wdmFsfSk7CisJICAgIH0gZWxzZSBpZiAodC5lcXVhbHMoU2hvcnQuY2xhc3MpKSB7CisJCVNob3J0W10gdG1wdmFsID0gbmV3IFNob3J0W3ZhbHVlcy5sZW5ndGhdOworCQlmb3IgKGludCBpID0gMCA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspCisJCSAgICB0bXB2YWxbaV0gPSBuZXcgU2hvcnQgKHZhbHVlc1tpXSk7CisJCW1ldGhvZC5pbnZva2UgKGJlYW4sIG5ldyBPYmplY3RbXSB7dG1wdmFsfSk7CisJICAgIH0gZWxzZSBpZiAodC5lcXVhbHMoTG9uZy5jbGFzcykpIHsKKwkJTG9uZ1tdIHRtcHZhbCA9IG5ldyBMb25nW3ZhbHVlcy5sZW5ndGhdOworCQlmb3IgKGludCBpID0gMCA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspCisJCSAgICB0bXB2YWxbaV0gPSBuZXcgTG9uZyAodmFsdWVzW2ldKTsKKwkJbWV0aG9kLmludm9rZSAoYmVhbiwgbmV3IE9iamVjdFtdIHt0bXB2YWx9KTsKKwkgICAgfSBlbHNlIGlmICh0LmVxdWFscyhEb3VibGUuY2xhc3MpKSB7CisJCURvdWJsZVtdIHRtcHZhbCA9IG5ldyBEb3VibGVbdmFsdWVzLmxlbmd0aF07CisJCWZvciAoaW50IGkgPSAwIDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykKKwkJICAgIHRtcHZhbFtpXSA9IG5ldyBEb3VibGUgKHZhbHVlc1tpXSk7CisJCW1ldGhvZC5pbnZva2UgKGJlYW4sIG5ldyBPYmplY3RbXSB7dG1wdmFsfSk7CisJICAgIH0gZWxzZSBpZiAodC5lcXVhbHMoRmxvYXQuY2xhc3MpKSB7CisJCUZsb2F0W10gdG1wdmFsID0gbmV3IEZsb2F0W3ZhbHVlcy5sZW5ndGhdOworCQlmb3IgKGludCBpID0gMCA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspCisJCSAgICB0bXB2YWxbaV0gPSBuZXcgRmxvYXQgKHZhbHVlc1tpXSk7CisJCW1ldGhvZC5pbnZva2UgKGJlYW4sIG5ldyBPYmplY3RbXSB7dG1wdmFsfSk7CisJICAgIH0gZWxzZSBpZiAodC5lcXVhbHMoQ2hhcmFjdGVyLmNsYXNzKSkgeworCQlDaGFyYWN0ZXJbXSB0bXB2YWwgPSBuZXcgQ2hhcmFjdGVyW3ZhbHVlcy5sZW5ndGhdOworCQlmb3IgKGludCBpID0gMCA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspCisJCSAgICB0bXB2YWxbaV0gPSBuZXcgQ2hhcmFjdGVyKHZhbHVlc1tpXS5jaGFyQXQoMCkpOworCQltZXRob2QuaW52b2tlIChiZWFuLCBuZXcgT2JqZWN0W10ge3RtcHZhbH0pOworCSAgICB9IGVsc2UgaWYgKHQuZXF1YWxzKGludC5jbGFzcykpIHsKKwkJaW50IFtddG1wdmFsID0gbmV3IGludFt2YWx1ZXMubGVuZ3RoXTsKKwkJZm9yIChpbnQgaSA9IDAgOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKQorCQkgICAgdG1wdmFsW2ldID0gSW50ZWdlci5wYXJzZUludCAodmFsdWVzW2ldKTsKKwkJbWV0aG9kLmludm9rZSAoYmVhbiwgbmV3IE9iamVjdFtdIHt0bXB2YWx9KTsKKwkgICAgfSBlbHNlIGlmICh0LmVxdWFscyhieXRlLmNsYXNzKSkgeworCQlieXRlW10gdG1wdmFsID0gbmV3IGJ5dGVbdmFsdWVzLmxlbmd0aF07CisJCWZvciAoaW50IGkgPSAwIDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykKKwkJICAgIHRtcHZhbFtpXSA9IEJ5dGUucGFyc2VCeXRlICh2YWx1ZXNbaV0pOworCQltZXRob2QuaW52b2tlIChiZWFuLCBuZXcgT2JqZWN0W10ge3RtcHZhbH0pOworCSAgICB9IGVsc2UgaWYgKHQuZXF1YWxzKGJvb2xlYW4uY2xhc3MpKSB7CisJCWJvb2xlYW5bXSB0bXB2YWwgPSBuZXcgYm9vbGVhblt2YWx1ZXMubGVuZ3RoXTsKKwkJZm9yIChpbnQgaSA9IDAgOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKQorCQkgICAgdG1wdmFsW2ldID0gKEJvb2xlYW4udmFsdWVPZih2YWx1ZXNbaV0pKS5ib29sZWFuVmFsdWUoKTsKKwkJbWV0aG9kLmludm9rZSAoYmVhbiwgbmV3IE9iamVjdFtdIHt0bXB2YWx9KTsKKwkgICAgfSBlbHNlIGlmICh0LmVxdWFscyhzaG9ydC5jbGFzcykpIHsKKwkJc2hvcnRbXSB0bXB2YWwgPSBuZXcgc2hvcnRbdmFsdWVzLmxlbmd0aF07CisJCWZvciAoaW50IGkgPSAwIDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykKKwkJICAgIHRtcHZhbFtpXSA9IFNob3J0LnBhcnNlU2hvcnQgKHZhbHVlc1tpXSk7CisJCW1ldGhvZC5pbnZva2UgKGJlYW4sIG5ldyBPYmplY3RbXSB7dG1wdmFsfSk7CisJICAgIH0gZWxzZSBpZiAodC5lcXVhbHMobG9uZy5jbGFzcykpIHsKKwkJbG9uZ1tdIHRtcHZhbCA9IG5ldyBsb25nW3ZhbHVlcy5sZW5ndGhdOworCQlmb3IgKGludCBpID0gMCA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspCisJCSAgICB0bXB2YWxbaV0gPSBMb25nLnBhcnNlTG9uZyAodmFsdWVzW2ldKTsKKwkJbWV0aG9kLmludm9rZSAoYmVhbiwgbmV3IE9iamVjdFtdIHt0bXB2YWx9KTsKKwkgICAgfSBlbHNlIGlmICh0LmVxdWFscyhkb3VibGUuY2xhc3MpKSB7CisJCWRvdWJsZVtdIHRtcHZhbCA9IG5ldyBkb3VibGVbdmFsdWVzLmxlbmd0aF07CisJCWZvciAoaW50IGkgPSAwIDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykKKwkJICAgIHRtcHZhbFtpXSA9IERvdWJsZS52YWx1ZU9mKHZhbHVlc1tpXSkuZG91YmxlVmFsdWUoKTsKKwkJbWV0aG9kLmludm9rZSAoYmVhbiwgbmV3IE9iamVjdFtdIHt0bXB2YWx9KTsKKwkgICAgfSBlbHNlIGlmICh0LmVxdWFscyhmbG9hdC5jbGFzcykpIHsKKwkJZmxvYXRbXSB0bXB2YWwgPSBuZXcgZmxvYXRbdmFsdWVzLmxlbmd0aF07CisJCWZvciAoaW50IGkgPSAwIDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykKKwkJICAgIHRtcHZhbFtpXSA9IEZsb2F0LnZhbHVlT2YodmFsdWVzW2ldKS5mbG9hdFZhbHVlKCk7CisJCW1ldGhvZC5pbnZva2UgKGJlYW4sIG5ldyBPYmplY3RbXSB7dG1wdmFsfSk7CisJICAgIH0gZWxzZSBpZiAodC5lcXVhbHMoY2hhci5jbGFzcykpIHsKKwkJY2hhcltdIHRtcHZhbCA9IG5ldyBjaGFyW3ZhbHVlcy5sZW5ndGhdOworCQlmb3IgKGludCBpID0gMCA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspCisJCSAgICB0bXB2YWxbaV0gPSB2YWx1ZXNbaV0uY2hhckF0KDApOworCQltZXRob2QuaW52b2tlIChiZWFuLCBuZXcgT2JqZWN0W10ge3RtcHZhbH0pOworCSAgICB9IGVsc2UgeworCQlPYmplY3RbXSB0bXB2YWwgPSBuZXcgSW50ZWdlclt2YWx1ZXMubGVuZ3RoXTsKKwkJZm9yIChpbnQgaT0wOyBpPHZhbHVlcy5sZW5ndGg7IGkrKykgeworCQkgICAgdG1wdmFsW2ldID0gIAorCQkJZ2V0VmFsdWVGcm9tUHJvcGVydHlFZGl0b3JNYW5hZ2VyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LCBwcm9wZXJ0eU5hbWUsIHZhbHVlc1tpXSk7CisJCX0KKwkJbWV0aG9kLmludm9rZSAoYmVhbiwgbmV3IE9iamVjdFtdIHt0bXB2YWx9KTsKKwkgICAgfQorCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEphc3BlckV4Y2VwdGlvbiAoImVycm9yIGluIGludm9raW5nIG1ldGhvZCIsIGV4KTsKKwl9CisgICAgfQorCisgICAgLyoqCisgICAgICogRXNjYXBlIHNwZWNpYWwgc2hlbGwgY2hhcmFjdGVycy4KKyAgICAgKiBAcGFyYW0gdW5lc2NTdHJpbmcgVGhlIHN0cmluZyB0byBzaGVsbC1lc2NhcGUKKyAgICAgKiBAcmV0dXJuIFRoZSBlc2NhcGVkIHNoZWxsIHN0cmluZy4KKyAgICAgKi8KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGVzY2FwZVF1ZXJ5U3RyaW5nKFN0cmluZyB1bmVzY1N0cmluZykgeworICAgIGlmICggdW5lc2NTdHJpbmcgPT0gbnVsbCApCisgICAgICAgIHJldHVybiBudWxsOworICAgCisgICAgU3RyaW5nIGVzY1N0cmluZyAgICA9ICIiOworICAgIFN0cmluZyBzaGVsbFNwQ2hhcnMgPSAiJjtgJ1wifCo/fjw+XigpW117fSRcXFxuIjsKKyAgIAorICAgIGZvcihpbnQgaW5kZXg9MDsgaW5kZXg8dW5lc2NTdHJpbmcubGVuZ3RoKCk7IGluZGV4KyspIHsKKyAgICAgICAgY2hhciBuZXh0Q2hhciA9IHVuZXNjU3RyaW5nLmNoYXJBdChpbmRleCk7CisKKyAgICAgICAgaWYoIHNoZWxsU3BDaGFycy5pbmRleE9mKG5leHRDaGFyKSAhPSAtMSApCisgICAgICAgIGVzY1N0cmluZyArPSAiXFwiOworCisgICAgICAgIGVzY1N0cmluZyArPSBuZXh0Q2hhcjsKKyAgICB9CisgICAgcmV0dXJuIGVzY1N0cmluZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWNvZGUgYW4gVVJMIGZvcm1hdHRlZCBzdHJpbmcuCisgICAgICogQHBhcmFtIGVuY29kZWQgVGhlIHN0cmluZyB0byBkZWNvZGUuCisgICAgICogQHJldHVybiBUaGUgZGVjb2RlZCBzdHJpbmcuCisgICAgICovCisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBkZWNvZGUoU3RyaW5nIGVuY29kZWQpIHsKKyAgICAgICAgLy8gc3BlZWRpbHkgbGVhdmUgaWYgd2UncmUgbm90IG5lZWRlZAorICAgIGlmIChlbmNvZGVkID09IG51bGwpIHJldHVybiBudWxsOworICAgICAgICBpZiAoZW5jb2RlZC5pbmRleE9mKCclJykgPT0gLTEgJiYgZW5jb2RlZC5pbmRleE9mKCcrJykgPT0gLTEpCisgICAgICAgIHJldHVybiBlbmNvZGVkOworCisgICAgLy9hbGxvY2F0ZSB0aGUgYnVmZmVyIC0gdXNlIGJ5dGVbXSB0byBhdm9pZCBjYWxscyB0byBuZXcuCisgICAgICAgIGJ5dGUgaG9sZGJ1ZmZlcltdID0gbmV3IGJ5dGVbZW5jb2RlZC5sZW5ndGgoKV07CisKKyAgICAgICAgY2hhciBob2xkY2hhcjsKKyAgICAgICAgaW50IGJ1ZmNvdW50ID0gMDsKKworICAgICAgICBmb3IgKGludCBjb3VudCA9IDA7IGNvdW50IDwgZW5jb2RlZC5sZW5ndGgoKTsgY291bnQrKykgeworICAgICAgICBjaGFyIGN1ciA9IGVuY29kZWQuY2hhckF0KGNvdW50KTsKKyAgICAgICAgICAgIGlmIChjdXIgPT0gJyUnKSB7CisgICAgICAgICAgICBob2xkYnVmZmVyW2J1ZmNvdW50KytdID0KKyAgICAgICAgICAoYnl0ZSlJbnRlZ2VyLnBhcnNlSW50KGVuY29kZWQuc3Vic3RyaW5nKGNvdW50KzEsY291bnQrMyksMTYpOworICAgICAgICAgICAgICAgIGlmIChjb3VudCArIDIgPj0gZW5jb2RlZC5sZW5ndGgoKSkKKyAgICAgICAgICAgICAgICAgICAgY291bnQgPSBlbmNvZGVkLmxlbmd0aCgpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VyID09ICcrJykgeworICAgICAgICBob2xkYnVmZmVyW2J1ZmNvdW50KytdID0gKGJ5dGUpICcgJzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGhvbGRidWZmZXJbYnVmY291bnQrK10gPSAoYnl0ZSkgY3VyOworICAgICAgICAgICAgfQorICAgICAgICB9CisJLy8gUkVWSVNJVCAtLSByZW1lZHkgZm9yIERlcHJlY2F0ZWQgd2FybmluZy4KKyAgICAvL3JldHVybiBuZXcgU3RyaW5nKGhvbGRidWZmZXIsMCwwLGJ1ZmNvdW50KTsKKyAgICByZXR1cm4gbmV3IFN0cmluZyhob2xkYnVmZmVyLDAsYnVmY291bnQpOworICAgIH0KKworICAgIC8vIF9fYmVnaW4gbG9va3VwUmVhZE1ldGhvZE1ldGhvZAorICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGhhbmRsZUdldFByb3BlcnR5KE9iamVjdCBvLCBTdHJpbmcgcHJvcCkKKyAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG8gPT0gbnVsbCkgeworCSAgICB0aHJvdyBuZXcgSmFzcGVyRXhjZXB0aW9uKAorCSAgICAgICAgICAgIExvY2FsaXplci5nZXRNZXNzYWdlKCJqc3AuZXJyb3IuYmVhbnMubnVsbGJlYW4iKSk7CisgICAgICAgIH0KKwlPYmplY3QgdmFsdWUgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgTWV0aG9kIG1ldGhvZCA9IGdldFJlYWRNZXRob2Qoby5nZXRDbGFzcygpLCBwcm9wKTsKKwkgICAgdmFsdWUgPSBtZXRob2QuaW52b2tlKG8sIG51bGwpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKwkgICAgdGhyb3cgbmV3IEphc3BlckV4Y2VwdGlvbiAoZXgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisgICAgLy8gX19lbmQgbG9va3VwUmVhZE1ldGhvZE1ldGhvZAorCisgICAgLy8gaGFuZGxlcyA8anNwOnNldFByb3BlcnR5PiB3aXRoIEVMIGV4cHJlc3Npb24gZm9yICd2YWx1ZScgYXR0cmlidXRlCisvKiogVXNlIHByb3ByaWV0YXJ5RXZhbHVhdGUKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgaGFuZGxlU2V0UHJvcGVydHlFeHByZXNzaW9uKE9iamVjdCBiZWFuLAorICAgICAgICBTdHJpbmcgcHJvcCwgU3RyaW5nIGV4cHJlc3Npb24sIFBhZ2VDb250ZXh0IHBhZ2VDb250ZXh0LAorICAgICAgICBWYXJpYWJsZVJlc29sdmVyIHZhcmlhYmxlUmVzb2x2ZXIsIEZ1bmN0aW9uTWFwcGVyIGZ1bmN0aW9uTWFwcGVyICkKKwl0aHJvd3MgSmFzcGVyRXhjZXB0aW9uCisgICAgeworCXRyeSB7CisgICAgICAgICAgICBNZXRob2QgbWV0aG9kID0gZ2V0V3JpdGVNZXRob2QoYmVhbi5nZXRDbGFzcygpLCBwcm9wKTsKKwkgICAgbWV0aG9kLmludm9rZShiZWFuLCBuZXcgT2JqZWN0W10geyAKKwkJcGFnZUNvbnRleHQuZ2V0RXhwcmVzc2lvbkV2YWx1YXRvcigpLmV2YWx1YXRlKAorCQkgICAgZXhwcmVzc2lvbiwKKwkJICAgIG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpWzBdLAorICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZVJlc29sdmVyLAorICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbk1hcHBlciwKKyAgICAgICAgICAgICAgICAgICAgbnVsbCApCisJICAgIH0pOworCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworCSAgICB0aHJvdyBuZXcgSmFzcGVyRXhjZXB0aW9uKGV4KTsKKwl9CisgICAgfQorKiovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGhhbmRsZVNldFByb3BlcnR5RXhwcmVzc2lvbihPYmplY3QgYmVhbiwKKyAgICAgICAgU3RyaW5nIHByb3AsIFN0cmluZyBleHByZXNzaW9uLCBQYWdlQ29udGV4dCBwYWdlQ29udGV4dCwKKwlQcm90ZWN0ZWRGdW5jdGlvbk1hcHBlciBmdW5jdGlvbk1hcHBlciApCisgICAgICAgIHRocm93cyBKYXNwZXJFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBNZXRob2QgbWV0aG9kID0gZ2V0V3JpdGVNZXRob2QoYmVhbi5nZXRDbGFzcygpLCBwcm9wKTsKKyAgICAgICAgICAgIG1ldGhvZC5pbnZva2UoYmVhbiwgbmV3IE9iamVjdFtdIHsKKyAgICAgICAgICAgICAgICBQYWdlQ29udGV4dEltcGwucHJvcHJpZXRhcnlFdmFsdWF0ZSgKKyAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKClbMF0sCisJCSAgICBwYWdlQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25NYXBwZXIsCisgICAgICAgICAgICAgICAgICAgIGZhbHNlICkKKyAgICAgICAgICAgIH0pOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBKYXNwZXJFeGNlcHRpb24oZXgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGhhbmRsZVNldFByb3BlcnR5KE9iamVjdCBiZWFuLCBTdHJpbmcgcHJvcCwKKwkJCQkJIE9iamVjdCB2YWx1ZSkKKwl0aHJvd3MgSmFzcGVyRXhjZXB0aW9uCisgICAgeworCXRyeSB7CisgICAgICAgICAgICBNZXRob2QgbWV0aG9kID0gZ2V0V3JpdGVNZXRob2QoYmVhbi5nZXRDbGFzcygpLCBwcm9wKTsKKwkgICAgbWV0aG9kLmludm9rZShiZWFuLCBuZXcgT2JqZWN0W10geyB2YWx1ZSB9KTsKKwl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKwkgICAgdGhyb3cgbmV3IEphc3BlckV4Y2VwdGlvbihleCk7CisJfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgaGFuZGxlU2V0UHJvcGVydHkoT2JqZWN0IGJlYW4sIFN0cmluZyBwcm9wLAorCQkJCQkgaW50IHZhbHVlKQorCXRocm93cyBKYXNwZXJFeGNlcHRpb24KKyAgICB7CisJdHJ5IHsKKyAgICAgICAgICAgIE1ldGhvZCBtZXRob2QgPSBnZXRXcml0ZU1ldGhvZChiZWFuLmdldENsYXNzKCksIHByb3ApOworCSAgICBtZXRob2QuaW52b2tlKGJlYW4sIG5ldyBPYmplY3RbXSB7IG5ldyBJbnRlZ2VyKHZhbHVlKSB9KTsKKwl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKwkgICAgdGhyb3cgbmV3IEphc3BlckV4Y2VwdGlvbihleCk7CisJfQkKKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGhhbmRsZVNldFByb3BlcnR5KE9iamVjdCBiZWFuLCBTdHJpbmcgcHJvcCwKKwkJCQkJIHNob3J0IHZhbHVlKQorCXRocm93cyBKYXNwZXJFeGNlcHRpb24KKyAgICB7CisJdHJ5IHsKKyAgICAgICAgICAgIE1ldGhvZCBtZXRob2QgPSBnZXRXcml0ZU1ldGhvZChiZWFuLmdldENsYXNzKCksIHByb3ApOworCSAgICBtZXRob2QuaW52b2tlKGJlYW4sIG5ldyBPYmplY3RbXSB7IG5ldyBTaG9ydCh2YWx1ZSkgfSk7CisJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisJICAgIHRocm93IG5ldyBKYXNwZXJFeGNlcHRpb24oZXgpOworCX0JCisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBoYW5kbGVTZXRQcm9wZXJ0eShPYmplY3QgYmVhbiwgU3RyaW5nIHByb3AsCisJCQkJCSBsb25nIHZhbHVlKQorCXRocm93cyBKYXNwZXJFeGNlcHRpb24KKyAgICB7CisJdHJ5IHsKKyAgICAgICAgICAgIE1ldGhvZCBtZXRob2QgPSBnZXRXcml0ZU1ldGhvZChiZWFuLmdldENsYXNzKCksIHByb3ApOworCSAgICBtZXRob2QuaW52b2tlKGJlYW4sIG5ldyBPYmplY3RbXSB7IG5ldyBMb25nKHZhbHVlKSB9KTsKKwl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKwkgICAgdGhyb3cgbmV3IEphc3BlckV4Y2VwdGlvbihleCk7CisJfQkKKyAgICB9IAorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBoYW5kbGVTZXRQcm9wZXJ0eShPYmplY3QgYmVhbiwgU3RyaW5nIHByb3AsCisJCQkJCSBkb3VibGUgdmFsdWUpCisJdGhyb3dzIEphc3BlckV4Y2VwdGlvbgorICAgIHsKKwl0cnkgeworICAgICAgICAgICAgTWV0aG9kIG1ldGhvZCA9IGdldFdyaXRlTWV0aG9kKGJlYW4uZ2V0Q2xhc3MoKSwgcHJvcCk7CisJICAgIG1ldGhvZC5pbnZva2UoYmVhbiwgbmV3IE9iamVjdFtdIHsgbmV3IERvdWJsZSh2YWx1ZSkgfSk7CisJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisJICAgIHRocm93IG5ldyBKYXNwZXJFeGNlcHRpb24oZXgpOworCX0JCisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBoYW5kbGVTZXRQcm9wZXJ0eShPYmplY3QgYmVhbiwgU3RyaW5nIHByb3AsCisJCQkJCSBmbG9hdCB2YWx1ZSkKKwl0aHJvd3MgSmFzcGVyRXhjZXB0aW9uCisgICAgeworCXRyeSB7CisgICAgICAgICAgICBNZXRob2QgbWV0aG9kID0gZ2V0V3JpdGVNZXRob2QoYmVhbi5nZXRDbGFzcygpLCBwcm9wKTsKKwkgICAgbWV0aG9kLmludm9rZShiZWFuLCBuZXcgT2JqZWN0W10geyBuZXcgRmxvYXQodmFsdWUpIH0pOworCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworCSAgICB0aHJvdyBuZXcgSmFzcGVyRXhjZXB0aW9uKGV4KTsKKwl9CQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgaGFuZGxlU2V0UHJvcGVydHkoT2JqZWN0IGJlYW4sIFN0cmluZyBwcm9wLAorCQkJCQkgY2hhciB2YWx1ZSkKKwl0aHJvd3MgSmFzcGVyRXhjZXB0aW9uCisgICAgeworCXRyeSB7CisgICAgICAgICAgICBNZXRob2QgbWV0aG9kID0gZ2V0V3JpdGVNZXRob2QoYmVhbi5nZXRDbGFzcygpLCBwcm9wKTsKKwkgICAgbWV0aG9kLmludm9rZShiZWFuLCBuZXcgT2JqZWN0W10geyBuZXcgQ2hhcmFjdGVyKHZhbHVlKSB9KTsKKwl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKwkgICAgdGhyb3cgbmV3IEphc3BlckV4Y2VwdGlvbihleCk7CisJfQkKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgaGFuZGxlU2V0UHJvcGVydHkoT2JqZWN0IGJlYW4sIFN0cmluZyBwcm9wLAorCQkJCQkgYnl0ZSB2YWx1ZSkKKwl0aHJvd3MgSmFzcGVyRXhjZXB0aW9uCisgICAgeworCXRyeSB7CisgICAgICAgICAgICBNZXRob2QgbWV0aG9kID0gZ2V0V3JpdGVNZXRob2QoYmVhbi5nZXRDbGFzcygpLCBwcm9wKTsKKwkgICAgbWV0aG9kLmludm9rZShiZWFuLCBuZXcgT2JqZWN0W10geyBuZXcgQnl0ZSh2YWx1ZSkgfSk7CisJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisJICAgIHRocm93IG5ldyBKYXNwZXJFeGNlcHRpb24oZXgpOworCX0JCisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBoYW5kbGVTZXRQcm9wZXJ0eShPYmplY3QgYmVhbiwgU3RyaW5nIHByb3AsCisJCQkJCSBib29sZWFuIHZhbHVlKQorCXRocm93cyBKYXNwZXJFeGNlcHRpb24KKyAgICB7CisJdHJ5IHsKKyAgICAgICAgICAgIE1ldGhvZCBtZXRob2QgPSBnZXRXcml0ZU1ldGhvZChiZWFuLmdldENsYXNzKCksIHByb3ApOworCSAgICBtZXRob2QuaW52b2tlKGJlYW4sIG5ldyBPYmplY3RbXSB7IG5ldyBCb29sZWFuKHZhbHVlKSB9KTsKKwl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKwkgICAgdGhyb3cgbmV3IEphc3BlckV4Y2VwdGlvbihleCk7CisJfQkKKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyBNZXRob2QgZ2V0V3JpdGVNZXRob2QoQ2xhc3MgYmVhbkNsYXNzLCBTdHJpbmcgcHJvcCkKKyAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKwlNZXRob2QgbWV0aG9kID0gbnVsbDsJCisgICAgICAgIENsYXNzIHR5cGUgPSBudWxsOworCXRyeSB7CisJICAgIGphdmEuYmVhbnMuQmVhbkluZm8gaW5mbworICAgICAgICAgICAgICAgID0gamF2YS5iZWFucy5JbnRyb3NwZWN0b3IuZ2V0QmVhbkluZm8oYmVhbkNsYXNzKTsKKwkgICAgaWYgKCBpbmZvICE9IG51bGwgKSB7CisJCWphdmEuYmVhbnMuUHJvcGVydHlEZXNjcmlwdG9yIHBkW10KKwkJICAgID0gaW5mby5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKCk7CisJCWZvciAoaW50IGkgPSAwIDsgaSA8IHBkLmxlbmd0aCA7IGkrKykgeworCQkgICAgaWYgKCBwZFtpXS5nZXROYW1lKCkuZXF1YWxzKHByb3ApICkgeworCQkJbWV0aG9kID0gcGRbaV0uZ2V0V3JpdGVNZXRob2QoKTsKKwkJCXR5cGUgICA9IHBkW2ldLmdldFByb3BlcnR5VHlwZSgpOworCQkJYnJlYWs7CisJCSAgICB9CisJCX0KKyAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBqdXN0IGluIGNhc2UgaW50cm9zcGVjdGlvbiBzaWxlbnRseSBmYWlscy4KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSmFzcGVyRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICBMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgianNwLmVycm9yLmJlYW5zLm5vYmVhbmluZm8iLAorCQkJCQkgYmVhbkNsYXNzLmdldE5hbWUoKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBKYXNwZXJFeGNlcHRpb24gKGV4KTsKKyAgICAgICAgfQorICAgICAgICBpZiAobWV0aG9kID09IG51bGwpIHsKKyAgICAgICAgICAgIGlmICh0eXBlID09IG51bGwpIHsKKwkJdGhyb3cgbmV3IEphc3BlckV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsaXplci5nZXRNZXNzYWdlKCJqc3AuZXJyb3IuYmVhbnMubm9wcm9wZXJ0eSIsCisJCQkJCSAgICAgcHJvcCwKKwkJCQkJICAgICBiZWFuQ2xhc3MuZ2V0TmFtZSgpKSk7CisgICAgICAgICAgICB9IGVsc2UgeworCQl0aHJvdyBuZXcgSmFzcGVyRXhjZXB0aW9uKAorCQkgICAgTG9jYWxpemVyLmdldE1lc3NhZ2UoImpzcC5lcnJvci5iZWFucy5ub21ldGhvZC5zZXRwcm9wZXJ0eSIsCisJCQkJCSBwcm9wLAorCQkJCQkgdHlwZS5nZXROYW1lKCksCisJCQkJCSBiZWFuQ2xhc3MuZ2V0TmFtZSgpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1ldGhvZDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE1ldGhvZCBnZXRSZWFkTWV0aG9kKENsYXNzIGJlYW5DbGFzcywgU3RyaW5nIHByb3ApCisJICAgIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCisgICAgICAgIE1ldGhvZCBtZXRob2QgPSBudWxsOyAgICAgICAgCisgICAgICAgIENsYXNzIHR5cGUgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgamF2YS5iZWFucy5CZWFuSW5mbyBpbmZvCisgICAgICAgICAgICAgICAgPSBqYXZhLmJlYW5zLkludHJvc3BlY3Rvci5nZXRCZWFuSW5mbyhiZWFuQ2xhc3MpOworICAgICAgICAgICAgaWYgKCBpbmZvICE9IG51bGwgKSB7CisgICAgICAgICAgICAgICAgamF2YS5iZWFucy5Qcm9wZXJ0eURlc2NyaXB0b3IgcGRbXQorICAgICAgICAgICAgICAgICAgICA9IGluZm8uZ2V0UHJvcGVydHlEZXNjcmlwdG9ycygpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IHBkLmxlbmd0aCA7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoIHBkW2ldLmdldE5hbWUoKS5lcXVhbHMocHJvcCkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSBwZFtpXS5nZXRSZWFkTWV0aG9kKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0eXBlICAgPSBwZFtpXS5nZXRQcm9wZXJ0eVR5cGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIGp1c3QgaW4gY2FzZSBpbnRyb3NwZWN0aW9uIHNpbGVudGx5IGZhaWxzLgorCQl0aHJvdyBuZXcgSmFzcGVyRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICBMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgianNwLmVycm9yLmJlYW5zLm5vYmVhbmluZm8iLAorCQkJCQkgYmVhbkNsYXNzLmdldE5hbWUoKSkpOworCSAgICB9CisJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisJICAgIHRocm93IG5ldyBKYXNwZXJFeGNlcHRpb24gKGV4KTsKKwl9CisgICAgICAgIGlmIChtZXRob2QgPT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkgeworCQl0aHJvdyBuZXcgSmFzcGVyRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICBMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgianNwLmVycm9yLmJlYW5zLm5vcHJvcGVydHkiLCBwcm9wLAorCQkJCQkgYmVhbkNsYXNzLmdldE5hbWUoKSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKwkJdGhyb3cgbmV3IEphc3BlckV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgTG9jYWxpemVyLmdldE1lc3NhZ2UoImpzcC5lcnJvci5iZWFucy5ub21ldGhvZCIsIHByb3AsCisJCQkJCSBiZWFuQ2xhc3MuZ2V0TmFtZSgpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCXJldHVybiBtZXRob2Q7CisgICAgfQorCisgICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAvLyBQcm9wZXJ0eUVkaXRvciBTdXBwb3J0CisKKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRWYWx1ZUZyb21CZWFuSW5mb1Byb3BlcnR5RWRpdG9yKAorCQkgICAgICAgICAgIENsYXNzIGF0dHJDbGFzcywgU3RyaW5nIGF0dHJOYW1lLCBTdHJpbmcgYXR0clZhbHVlLAorCQkJICAgQ2xhc3MgcHJvcGVydHlFZGl0b3JDbGFzcykgCisJdGhyb3dzIEphc3BlckV4Y2VwdGlvbiAKKyAgICB7CisJdHJ5IHsKKwkgICAgUHJvcGVydHlFZGl0b3IgcGUgPSAoUHJvcGVydHlFZGl0b3IpcHJvcGVydHlFZGl0b3JDbGFzcy5uZXdJbnN0YW5jZSgpOworCSAgICBwZS5zZXRBc1RleHQoYXR0clZhbHVlKTsKKwkgICAgcmV0dXJuIHBlLmdldFZhbHVlKCk7CisJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisJICAgIHRocm93IG5ldyBKYXNwZXJFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgTG9jYWxpemVyLmdldE1lc3NhZ2UoImpzcC5lcnJvci5iZWFucy5wcm9wZXJ0eS5jb252ZXJzaW9uIiwKKwkJCQkgICAgIGF0dHJWYWx1ZSwgYXR0ckNsYXNzLmdldE5hbWUoKSwgYXR0ck5hbWUsCisJCQkJICAgICBleC5nZXRNZXNzYWdlKCkpKTsKKwl9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0VmFsdWVGcm9tUHJvcGVydHlFZGl0b3JNYW5hZ2VyKAorCSAgICAgICAgICAgICBDbGFzcyBhdHRyQ2xhc3MsIFN0cmluZyBhdHRyTmFtZSwgU3RyaW5nIGF0dHJWYWx1ZSkgCisJdGhyb3dzIEphc3BlckV4Y2VwdGlvbiAKKyAgICB7CisJdHJ5IHsKKwkgICAgUHJvcGVydHlFZGl0b3IgcHJvcEVkaXRvciA9IAorCQlQcm9wZXJ0eUVkaXRvck1hbmFnZXIuZmluZEVkaXRvcihhdHRyQ2xhc3MpOworCSAgICBpZiAocHJvcEVkaXRvciAhPSBudWxsKSB7CisJCXByb3BFZGl0b3Iuc2V0QXNUZXh0KGF0dHJWYWx1ZSk7CisJCXJldHVybiBwcm9wRWRpdG9yLmdldFZhbHVlKCk7CisJICAgIH0gZWxzZSB7CisJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgIExvY2FsaXplci5nZXRNZXNzYWdlKCJqc3AuZXJyb3IuYmVhbnMucHJvcGVydHllZGl0b3Iubm90cmVnaXN0ZXJlZCIpKTsKKwkgICAgfQorCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgeworCSAgICB0aHJvdyBuZXcgSmFzcGVyRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgIExvY2FsaXplci5nZXRNZXNzYWdlKCJqc3AuZXJyb3IuYmVhbnMucHJvcGVydHkuY29udmVyc2lvbiIsCisJCQkJICAgICBhdHRyVmFsdWUsIGF0dHJDbGFzcy5nZXROYW1lKCksIGF0dHJOYW1lLAorCQkJCSAgICAgZXguZ2V0TWVzc2FnZSgpKSk7CisJfQorICAgIH0KKworCisgICAgLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgLy8gR2VuZXJhbCBQdXJwb3NlIFJ1bnRpbWUgTWV0aG9kcworICAgIC8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IGEgcG9zc2libHkgcmVsYXRpdmUgcmVzb3VyY2UgcGF0aCBpbnRvIGEgY29udGV4dC1yZWxhdGl2ZQorICAgICAqIHJlc291cmNlIHBhdGggdGhhdCBzdGFydHMgd2l0aCBhICcvJy4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVsYXRpdmVQYXRoIFRoZSBwb3NzaWJseSByZWxhdGl2ZSByZXNvdXJjZSBwYXRoCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q29udGV4dFJlbGF0aXZlUGF0aChTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlbGF0aXZlUGF0aCkgeworCisgICAgICAgIGlmIChyZWxhdGl2ZVBhdGguc3RhcnRzV2l0aCgiLyIpKQorICAgICAgICAgICAgcmV0dXJuIChyZWxhdGl2ZVBhdGgpOworICAgICAgICBpZiAoIShyZXF1ZXN0IGluc3RhbmNlb2YgSHR0cFNlcnZsZXRSZXF1ZXN0KSkKKyAgICAgICAgICAgIHJldHVybiAocmVsYXRpdmVQYXRoKTsKKyAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IGhyZXF1ZXN0ID0gKEh0dHBTZXJ2bGV0UmVxdWVzdCkgcmVxdWVzdDsKKyAgICAgICAgU3RyaW5nIHVyaSA9IChTdHJpbmcpCisgICAgICAgICAgICByZXF1ZXN0LmdldEF0dHJpYnV0ZSgiamF2YXguc2VydmxldC5pbmNsdWRlLnNlcnZsZXRfcGF0aCIpOworICAgICAgICBpZiAodXJpICE9IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZyBwYXRoSW5mbyA9IChTdHJpbmcpCisgICAgICAgICAgICAgICAgcmVxdWVzdC5nZXRBdHRyaWJ1dGUoImphdmF4LnNlcnZsZXQuaW5jbHVkZS5wYXRoX2luZm8iKTsKKyAgICAgICAgICAgIGlmIChwYXRoSW5mbyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKHVyaS5sYXN0SW5kZXhPZignLycpID49IDApIAorICAgICAgICAgICAgICAgICAgICB1cmkgPSB1cmkuc3Vic3RyaW5nKDAsIHVyaS5sYXN0SW5kZXhPZignLycpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHVyaSA9IGhyZXF1ZXN0LmdldFNlcnZsZXRQYXRoKCk7CisgICAgICAgICAgICBpZiAodXJpLmxhc3RJbmRleE9mKCcvJykgPj0gMCkgCisgICAgICAgICAgICAgICAgdXJpID0gdXJpLnN1YnN0cmluZygwLCB1cmkubGFzdEluZGV4T2YoJy8nKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHVyaSArICcvJyArIHJlbGF0aXZlUGF0aDsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUGVyZm9ybSBhIFJlcXVlc3REaXNwYXRjaGVyLmluY2x1ZGUoKSBvcGVyYXRpb24sIHdpdGggb3B0aW9uYWwgZmx1c2hpbmcKKyAgICAgKiBvZiB0aGUgcmVzcG9uc2UgYmVmb3JlaGFuZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIHNlcnZsZXQgcmVzcG9uc2Ugd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVsYXRpdmVQYXRoIFRoZSByZWxhdGl2ZSBwYXRoIG9mIHRoZSByZXNvdXJjZSB0byBiZSBpbmNsdWRlZAorICAgICAqIEBwYXJhbSBvdXQgVGhlIFdyaXRlciB0byB3aG9tIHdlIGFyZSBjdXJyZW50bHkgd3JpdGluZworICAgICAqIEBwYXJhbSBmbHVzaCBTaG91bGQgd2UgZmx1c2ggYmVmb3JlIHRoZSBpbmNsdWRlIGlzIHByb2Nlc3NlZD8KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgdGhyb3duIGJ5IHRoZSBpbmNsdWRlZCBzZXJ2bGV0CisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIHRocm93biBieSB0aGUgaW5jbHVkZWQgc2VydmxldAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBpbmNsdWRlKFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyByZWxhdGl2ZVBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSnNwV3JpdGVyIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGZsdXNoKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIGlmIChmbHVzaCAmJiAhKG91dCBpbnN0YW5jZW9mIEJvZHlDb250ZW50KSkKKyAgICAgICAgICAgIG91dC5mbHVzaCgpOworCisgICAgICAgIC8vIEZJWE1FIC0gSXQgaXMgdGVtcHRpbmcgdG8gdXNlIHJlcXVlc3QuZ2V0UmVxdWVzdERpc3BhdGNoZXIoKSB0bworICAgICAgICAvLyByZXNvbHZlIGEgcmVsYXRpdmUgcGF0aCBkaXJlY3RseSwgYnV0IENhdGFsaW5hIGN1cnJlbnRseSBkb2VzIG5vdAorICAgICAgICAvLyB0YWtlIGludG8gYWNjb3VudCB3aGV0aGVyIHRoZSBjYWxsZXIgaXMgaW5zaWRlIGEgUmVxdWVzdERpc3BhdGNoZXIKKyAgICAgICAgLy8gaW5jbHVkZSBvciBub3QuICBXaGV0aGVyIENhdGFsaW5hICpzaG91bGQqIHRha2UgdGhhdCBpbnRvIGFjY291bnQKKyAgICAgICAgLy8gaXMgYSBzcGVjIGlzc3VlIGN1cnJlbnRseSB1bmRlciByZXZpZXcuICBJbiB0aGUgbWVhbiB0aW1lLAorICAgICAgICAvLyByZXBsaWNhdGUgSmFzcGVyJ3MgcHJldmlvdXMgYmVoYXZpb3IKKworICAgICAgICBTdHJpbmcgcmVzb3VyY2VQYXRoID0gZ2V0Q29udGV4dFJlbGF0aXZlUGF0aChyZXF1ZXN0LCByZWxhdGl2ZVBhdGgpOworICAgICAgICBSZXF1ZXN0RGlzcGF0Y2hlciByZCA9IHJlcXVlc3QuZ2V0UmVxdWVzdERpc3BhdGNoZXIocmVzb3VyY2VQYXRoKTsKKworICAgICAgICByZC5pbmNsdWRlKHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgbmV3IFNlcnZsZXRSZXNwb25zZVdyYXBwZXJJbmNsdWRlKHJlc3BvbnNlLCBvdXQpKTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFVSTCBlbmNvZGVzIGEgc3RyaW5nLCBiYXNlZCBvbiB0aGUgc3VwcGxpZWQgY2hhcmFjdGVyIGVuY29kaW5nLgorICAgICAqIFRoaXMgcGVyZm9ybXMgdGhlIHNhbWUgZnVuY3Rpb24gYXMgamF2YS5uZXh0LlVSTEVuY29kZS5lbmNvZGUKKyAgICAgKiBpbiBKMlNESzEuNCwgYW5kIHNob3VsZCBiZSByZW1vdmVkIGlmIHRoZSBvbmx5IHBsYXRmb3JtIHN1cHBvcnRlZAorICAgICAqIGlzIDEuNCBvciBoaWdoZXIuCisgICAgICogQHBhcmFtIHMgVGhlIFN0cmluZyB0byBiZSBVUkwgZW5jb2RlZC4KKyAgICAgKiBAcGFyYW0gZW5jIFRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcgCisgICAgICogQHJldHVybiBUaGUgVVJMIGVuY29kZWQgU3RyaW5nCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgVVJMRW5jb2RlKFN0cmluZyBzLCBTdHJpbmcgZW5jKSB7CisKKwlpZiAocyA9PSBudWxsKSB7CisJICAgIHJldHVybiAibnVsbCI7CisJfQorCisJaWYgKGVuYyA9PSBudWxsKSB7CisJICAgIGVuYyA9ICJJU08tODg1OS0xIjsJLy8gVGhlIGRlZmF1bHQgcmVxdWVzdCBlbmNvZGluZyAKKwl9CisKKwlTdHJpbmdCdWZmZXIgb3V0ID0gbmV3IFN0cmluZ0J1ZmZlcihzLmxlbmd0aCgpKTsKKwlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnVmID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworCU91dHB1dFN0cmVhbVdyaXRlciB3cml0ZXIgPSBudWxsOworCXRyeSB7CisJICAgIHdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoYnVmLCBlbmMpOworCX0gY2F0Y2ggKGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBleCkgeworCSAgICAvLyBVc2UgdGhlIGRlZmF1bHQgZW5jb2Rpbmc/CisJICAgIHdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoYnVmKTsKKwl9CisJCisJZm9yIChpbnQgaSA9IDA7IGkgPCBzLmxlbmd0aCgpOyBpKyspIHsKKwkgICAgaW50IGMgPSBzLmNoYXJBdChpKTsKKwkgICAgaWYgKGMgPT0gJyAnKSB7CisJCW91dC5hcHBlbmQoJysnKTsKKwkgICAgfSBlbHNlIGlmIChpc1NhZmVDaGFyKGMpKSB7CisJCW91dC5hcHBlbmQoKGNoYXIpYyk7CisJICAgIH0gZWxzZSB7CisJCS8vIGNvbnZlcnQgdG8gZXh0ZXJuYWwgZW5jb2RpbmcgYmVmb3JlIGhleCBjb252ZXJzaW9uCisJCXRyeSB7CisJCSAgICB3cml0ZXIud3JpdGUoYyk7CisJCSAgICB3cml0ZXIuZmx1c2goKTsKKwkJfSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7CisJCSAgICBidWYucmVzZXQoKTsKKwkJICAgIGNvbnRpbnVlOworCQl9CisJCWJ5dGVbXSBiYSA9IGJ1Zi50b0J5dGVBcnJheSgpOworCQlmb3IgKGludCBqID0gMDsgaiA8IGJhLmxlbmd0aDsgaisrKSB7CisJCSAgICBvdXQuYXBwZW5kKCclJyk7CisJCSAgICAvLyBDb252ZXJ0aW5nIGVhY2ggYnl0ZSBpbiB0aGUgYnVmZmVyCisJCSAgICBvdXQuYXBwZW5kKENoYXJhY3Rlci5mb3JEaWdpdCgoYmFbal0+PjQpICYgMHhmLCAxNikpOworCQkgICAgb3V0LmFwcGVuZChDaGFyYWN0ZXIuZm9yRGlnaXQoYmFbal0gJiAweGYsIDE2KSk7CisJCX0KKwkJYnVmLnJlc2V0KCk7CisJICAgIH0KKwl9CisJcmV0dXJuIG91dC50b1N0cmluZygpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNTYWZlQ2hhcihpbnQgYykgeworCWlmIChjID49ICdhJyAmJiBjIDw9ICd6JykgeworCSAgICByZXR1cm4gdHJ1ZTsKKwl9CisJaWYgKGMgPj0gJ0EnICYmIGMgPD0gJ1onKSB7CisJICAgIHJldHVybiB0cnVlOworCX0KKwlpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpIHsKKwkgICAgcmV0dXJuIHRydWU7CisJfQorCWlmIChjID09ICctJyB8fCBjID09ICdfJyB8fCBjID09ICcuJyB8fCBjID09ICchJyB8fAorCSAgICBjID09ICd+JyB8fCBjID09ICcqJyB8fCBjID09ICdcJycgfHwgYyA9PSAnKCcgfHwgYyA9PSAnKScpIHsKKwkgICAgcmV0dXJuIHRydWU7CisJfQorCXJldHVybiBmYWxzZTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9ydW50aW1lL0pzcFNvdXJjZURlcGVuZGVudC5qYXZhIGIvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3J1bnRpbWUvSnNwU291cmNlRGVwZW5kZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY2NzEzYgotLS0gL2Rldi9udWxsCisrKyBiL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9ydW50aW1lL0pzcFNvdXJjZURlcGVuZGVudC5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphc3Blci5ydW50aW1lOworCisvKioKKyAqIEludGVyZmFjZSBmb3IgdHJhY2tpbmcgdGhlIHNvdXJjZSBmaWxlcyBkZXBlbmRlbmNpZXMsIGZvciB0aGUgcHVycG9zZQorICogb2YgY29tcGlsaW5nIG91dCBvZiBkYXRlIHBhZ2VzLiAgVGhpcyBpcyB1c2VkIGZvcgorICogMSkgZmlsZXMgdGhhdCBhcmUgaW5jbHVkZWQgYnkgcGFnZSBkaXJlY3RpdmVzCisgKiAyKSBmaWxlcyB0aGF0IGFyZSBpbmNsdWRlZCBieSBpbmNsdWRlLXByZWx1ZGUgYW5kIGluY2x1ZGUtY29kYSBpbiBqc3A6Y29uZmlnCisgKiAzKSBmaWxlcyB0aGF0IGFyZSB0YWcgZmlsZXMgYW5kIHJlZmVyZW5jZWQKKyAqIDQpIFRMRHMgcmVmZXJlbmNlZAorICovCisKK3B1YmxpYyBpbnRlcmZhY2UgSnNwU291cmNlRGVwZW5kZW50IHsKKworICAgLyoqCisgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBmaWxlcyBuYW1lcyB0aGF0IHRoZSBjdXJyZW50IHBhZ2UgaGFzIGEgc291cmNlCisgICAgKiBkZXBlbmRlbmN5IG9uLgorICAgICovCisgICAgcHVibGljIGphdmEudXRpbC5MaXN0IGdldERlcGVuZGFudHMoKTsKKworfQpkaWZmIC0tZ2l0IGEvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3J1bnRpbWUvSnNwV3JpdGVySW1wbC5qYXZhIGIvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3J1bnRpbWUvSnNwV3JpdGVySW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiZTkxZTkKLS0tIC9kZXYvbnVsbAorKysgYi9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvcnVudGltZS9Kc3BXcml0ZXJJbXBsLmphdmEKQEAgLTAsMCArMSw1ODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphc3Blci5ydW50aW1lOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLldyaXRlcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOworCitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AuSnNwV3JpdGVyOworCitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLmNvbXBpbGVyLkxvY2FsaXplcjsKKworLyoqCisgKiBXcml0ZSB0ZXh0IHRvIGEgY2hhcmFjdGVyLW91dHB1dCBzdHJlYW0sIGJ1ZmZlcmluZyBjaGFyYWN0ZXJzIHNvIGFzCisgKiB0byBwcm92aWRlIGZvciB0aGUgZWZmaWNpZW50IHdyaXRpbmcgb2Ygc2luZ2xlIGNoYXJhY3RlcnMsIGFycmF5cywKKyAqIGFuZCBzdHJpbmdzLiAKKyAqCisgKiBQcm92aWRlIHN1cHBvcnQgZm9yIGRpc2NhcmRpbmcgZm9yIHRoZSBvdXRwdXQgdGhhdCBoYXMgYmVlbiAKKyAqIGJ1ZmZlcmVkLiAKKyAqIAorICogVGhpcyBuZWVkcyByZXZpc2l0aW5nIHdoZW4gdGhlIGJ1ZmZlcmluZyBwcm9ibGVtcyBpbiB0aGUgSlNQIHNwZWMKKyAqIGFyZSBmaXhlZCAtYWt2IAorICoKKyAqIEBhdXRob3IgQW5pbCBLLiBWaWplbmRyYW4KKyAqLworcHVibGljIGNsYXNzIEpzcFdyaXRlckltcGwgZXh0ZW5kcyBKc3BXcml0ZXIgeworCisgICAgcHJpdmF0ZSBXcml0ZXIgb3V0OworICAgIHByaXZhdGUgU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlOyAgICAKKyAgICBwcml2YXRlIGNoYXIgY2JbXTsKKyAgICBwcml2YXRlIGludCBuZXh0Q2hhcjsKKyAgICBwcml2YXRlIGJvb2xlYW4gZmx1c2hlZCA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBjbG9zZWQgPSBmYWxzZTsKKyAgICAKKyAgICBwdWJsaWMgSnNwV3JpdGVySW1wbCgpIHsKKwlzdXBlciggQ29uc3RhbnRzLkRFRkFVTFRfQlVGRkVSX1NJWkUsIHRydWUgKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBidWZmZXJlZCBjaGFyYWN0ZXItb3V0cHV0IHN0cmVhbSB0aGF0IHVzZXMgYSBkZWZhdWx0LXNpemVkCisgICAgICogb3V0cHV0IGJ1ZmZlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgcmVzcG9uc2UgIEEgU2VydmxldCBSZXNwb25zZQorICAgICAqLworICAgIHB1YmxpYyBKc3BXcml0ZXJJbXBsKFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgeworICAgICAgICB0aGlzKHJlc3BvbnNlLCBDb25zdGFudHMuREVGQVVMVF9CVUZGRVJfU0laRSwgdHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IGJ1ZmZlcmVkIGNoYXJhY3Rlci1vdXRwdXQgc3RyZWFtIHRoYXQgdXNlcyBhbiBvdXRwdXQKKyAgICAgKiBidWZmZXIgb2YgdGhlIGdpdmVuIHNpemUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gIHJlc3BvbnNlIEEgU2VydmxldCBSZXNwb25zZQorICAgICAqIEBwYXJhbSAgc3ogICAJT3V0cHV0LWJ1ZmZlciBzaXplLCBhIHBvc2l0aXZlIGludGVnZXIKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiAgSWYgc3ogaXMgPD0gMAorICAgICAqLworICAgIHB1YmxpYyBKc3BXcml0ZXJJbXBsKFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSwgaW50IHN6LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGF1dG9GbHVzaCkgeworICAgICAgICBzdXBlcihzeiwgYXV0b0ZsdXNoKTsKKyAgICAgICAgaWYgKHN6IDwgMCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkJ1ZmZlciBzaXplIDw9IDAiKTsKKwl0aGlzLnJlc3BvbnNlID0gcmVzcG9uc2U7CisgICAgICAgIGNiID0gc3ogPT0gMCA/IG51bGwgOiBuZXcgY2hhcltzel07CisJbmV4dENoYXIgPSAwOworICAgIH0KKworICAgIHZvaWQgaW5pdCggU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLCBpbnQgc3osIGJvb2xlYW4gYXV0b0ZsdXNoICkgeworCXRoaXMucmVzcG9uc2U9IHJlc3BvbnNlOworCWlmKCBzeiA+IDAgJiYgKCBjYiA9PSBudWxsIHx8IHN6ID4gY2IubGVuZ3RoICkgKQorCSAgICBjYj1uZXcgY2hhcltzel07CisJbmV4dENoYXIgPSAwOworCXRoaXMuYXV0b0ZsdXNoPWF1dG9GbHVzaDsKKwl0aGlzLmJ1ZmZlclNpemU9c3o7CisgICAgfQorCisgICAgLyoqIFBhY2thZ2UtbGV2ZWwgYWNjZXNzCisgICAgICovCisgICAgdm9pZCByZWN5Y2xlKCkgeworCWZsdXNoZWQgPSBmYWxzZTsKKyAgICAgICAgY2xvc2VkID0gZmFsc2U7CisgICAgICAgIG91dCA9IG51bGw7CisJbmV4dENoYXIgPSAwOworICAgICAgICByZXNwb25zZSA9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmx1c2ggdGhlIG91dHB1dCBidWZmZXIgdG8gdGhlIHVuZGVybHlpbmcgY2hhcmFjdGVyIHN0cmVhbSwgd2l0aG91dAorICAgICAqIGZsdXNoaW5nIHRoZSBzdHJlYW0gaXRzZWxmLiAgVGhpcyBtZXRob2QgaXMgbm9uLXByaXZhdGUgb25seSBzbyB0aGF0IGl0CisgICAgICogbWF5IGJlIGludm9rZWQgYnkgUHJpbnRTdHJlYW0uCisgICAgICovCisgICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmx1c2hCdWZmZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoYnVmZmVyU2l6ZSA9PSAwKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBmbHVzaGVkID0gdHJ1ZTsKKyAgICAgICAgZW5zdXJlT3BlbigpOworICAgICAgICBpZiAobmV4dENoYXIgPT0gMCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaW5pdE91dCgpOworICAgICAgICBvdXQud3JpdGUoY2IsIDAsIG5leHRDaGFyKTsKKyAgICAgICAgbmV4dENoYXIgPSAwOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0T3V0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG91dCA9PSBudWxsKSB7CisgICAgICAgICAgICBvdXQgPSByZXNwb25zZS5nZXRXcml0ZXIoKTsKKwl9CisgICAgfQorCQorICAgIHByaXZhdGUgU3RyaW5nIGdldExvY2FsaXplTWVzc2FnZShmaW5hbCBTdHJpbmcgbWVzc2FnZSl7CisgICAgICAgIGlmIChTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCkgIT0gbnVsbCl7CisgICAgICAgICAgIHJldHVybiAoU3RyaW5nKUFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkQWN0aW9uKCl7CisgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKXsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIExvY2FsaXplci5nZXRNZXNzYWdlKG1lc3NhZ2UpOyAKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgIH0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIExvY2FsaXplci5nZXRNZXNzYWdlKG1lc3NhZ2UpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRGlzY2FyZCB0aGUgb3V0cHV0IGJ1ZmZlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgdm9pZCBjbGVhcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmICgoYnVmZmVyU2l6ZSA9PSAwKSAmJiAob3V0ICE9IG51bGwpKQorICAgICAgICAgICAgLy8gY2xlYXIoKSBpcyBpbGxlZ2FsIGFmdGVyIGFueSB1bmJ1ZmZlcmVkIG91dHB1dCAoSlNQLjUuNSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgIGdldExvY2FsaXplTWVzc2FnZSgianNwLmVycm9yLmlzZV9vbl9jbGVhciIpKTsKKyAgICAgICAgaWYgKGZsdXNoZWQpCisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgIGdldExvY2FsaXplTWVzc2FnZSgianNwLmVycm9yLmF0dGVtcHRfdG9fY2xlYXJfZmx1c2hlZF9idWZmZXIiKSk7CisgICAgICAgIGVuc3VyZU9wZW4oKTsKKyAgICAgICAgbmV4dENoYXIgPSAwOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsZWFyQnVmZmVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGJ1ZmZlclNpemUgPT0gMCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgIGdldExvY2FsaXplTWVzc2FnZSgianNwLmVycm9yLmlzZV9vbl9jbGVhciIpKTsKKyAgICAgICAgZW5zdXJlT3BlbigpOworICAgICAgICBuZXh0Q2hhciA9IDA7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCB2b2lkIGJ1ZmZlck92ZXJmbG93KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKGdldExvY2FsaXplTWVzc2FnZSgianNwLmVycm9yLm92ZXJmbG93IikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZsdXNoIHRoZSBzdHJlYW0uCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBmbHVzaCgpICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmbHVzaEJ1ZmZlcigpOworICAgICAgICBpZiAob3V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG91dC5mbHVzaCgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvc2UgdGhlIHN0cmVhbS4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHJlc3BvbnNlID09IG51bGwgfHwgY2xvc2VkKQorICAgICAgICAgICAgLy8gbXVsdGlwbGUgY2FsbHMgdG8gY2xvc2UgaXMgT0sKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgZmx1c2goKTsKKyAgICAgICAgaWYgKG91dCAhPSBudWxsKQorICAgICAgICAgICAgb3V0LmNsb3NlKCk7CisgICAgICAgIG91dCA9IG51bGw7CisgICAgICAgIGNsb3NlZCA9IHRydWU7CisgICAgICAgIC8vICAgICAgICAgICAgY2IgPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyB1bnVzZWQgaW4gdGhlIGJ1ZmZlcgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UmVtYWluaW5nKCkgeworICAgICAgICByZXR1cm4gYnVmZmVyU2l6ZSAtIG5leHRDaGFyOworICAgIH0KKworICAgIC8qKiBjaGVjayB0byBtYWtlIHN1cmUgdGhhdCB0aGUgc3RyZWFtIGhhcyBub3QgYmVlbiBjbG9zZWQgKi8KKyAgICBwcml2YXRlIHZvaWQgZW5zdXJlT3BlbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJaWYgKHJlc3BvbnNlID09IG51bGwgfHwgY2xvc2VkKQorCSAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlN0cmVhbSBjbG9zZWQiKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFdyaXRlIGEgc2luZ2xlIGNoYXJhY3Rlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3cml0ZShpbnQgYykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZW5zdXJlT3BlbigpOworICAgICAgICBpZiAoYnVmZmVyU2l6ZSA9PSAwKSB7CisgICAgICAgICAgICBpbml0T3V0KCk7CisgICAgICAgICAgICBvdXQud3JpdGUoYyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAobmV4dENoYXIgPj0gYnVmZmVyU2l6ZSkKKyAgICAgICAgICAgICAgICBpZiAoYXV0b0ZsdXNoKQorICAgICAgICAgICAgICAgICAgICBmbHVzaEJ1ZmZlcigpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyT3ZlcmZsb3coKTsKKyAgICAgICAgICAgIGNiW25leHRDaGFyKytdID0gKGNoYXIpIGM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPdXIgb3duIGxpdHRsZSBtaW4gbWV0aG9kLCB0byBhdm9pZCBsb2FkaW5nIGphdmEubGFuZy5NYXRoIGlmIHdlJ3ZlIHJ1bgorICAgICAqIG91dCBvZiBmaWxlIGRlc2NyaXB0b3JzIGFuZCB3ZSdyZSB0cnlpbmcgdG8gcHJpbnQgYSBzdGFjayB0cmFjZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBtaW4oaW50IGEsIGludCBiKSB7CisJaWYgKGEgPCBiKSByZXR1cm4gYTsKKwlyZXR1cm4gYjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZSBhIHBvcnRpb24gb2YgYW4gYXJyYXkgb2YgY2hhcmFjdGVycy4KKyAgICAgKgorICAgICAqIDxwPiBPcmRpbmFyaWx5IHRoaXMgbWV0aG9kIHN0b3JlcyBjaGFyYWN0ZXJzIGZyb20gdGhlIGdpdmVuIGFycmF5IGludG8KKyAgICAgKiB0aGlzIHN0cmVhbSdzIGJ1ZmZlciwgZmx1c2hpbmcgdGhlIGJ1ZmZlciB0byB0aGUgdW5kZXJseWluZyBzdHJlYW0gYXMKKyAgICAgKiBuZWVkZWQuICBJZiB0aGUgcmVxdWVzdGVkIGxlbmd0aCBpcyBhdCBsZWFzdCBhcyBsYXJnZSBhcyB0aGUgYnVmZmVyLAorICAgICAqIGhvd2V2ZXIsIHRoZW4gdGhpcyBtZXRob2Qgd2lsbCBmbHVzaCB0aGUgYnVmZmVyIGFuZCB3cml0ZSB0aGUgY2hhcmFjdGVycworICAgICAqIGRpcmVjdGx5IHRvIHRoZSB1bmRlcmx5aW5nIHN0cmVhbS4gIFRodXMgcmVkdW5kYW50CisgICAgICogPGNvZGU+RGlzY2FyZGFibGVCdWZmZXJlZFdyaXRlcjwvY29kZT5zIHdpbGwgbm90IGNvcHkgZGF0YSB1bm5lY2Vzc2FyaWx5LgorICAgICAqCisgICAgICogQHBhcmFtICBjYnVmICBBIGNoYXJhY3RlciBhcnJheQorICAgICAqIEBwYXJhbSAgb2ZmICAgT2Zmc2V0IGZyb20gd2hpY2ggdG8gc3RhcnQgcmVhZGluZyBjaGFyYWN0ZXJzCisgICAgICogQHBhcmFtICBsZW4gICBOdW1iZXIgb2YgY2hhcmFjdGVycyB0byB3cml0ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHdyaXRlKGNoYXIgY2J1ZltdLCBpbnQgb2ZmLCBpbnQgbGVuKSAKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIAorICAgIHsKKyAgICAgICAgZW5zdXJlT3BlbigpOworCisgICAgICAgIGlmIChidWZmZXJTaXplID09IDApIHsKKyAgICAgICAgICAgIGluaXRPdXQoKTsKKyAgICAgICAgICAgIG91dC53cml0ZShjYnVmLCBvZmYsIGxlbik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoKG9mZiA8IDApIHx8IChvZmYgPiBjYnVmLmxlbmd0aCkgfHwgKGxlbiA8IDApIHx8CisgICAgICAgICAgICAoKG9mZiArIGxlbikgPiBjYnVmLmxlbmd0aCkgfHwgKChvZmYgKyBsZW4pIDwgMCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisgICAgICAgIH0gZWxzZSBpZiAobGVuID09IDApIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSAKKworICAgICAgICBpZiAobGVuID49IGJ1ZmZlclNpemUpIHsKKyAgICAgICAgICAgIC8qIElmIHRoZSByZXF1ZXN0IGxlbmd0aCBleGNlZWRzIHRoZSBzaXplIG9mIHRoZSBvdXRwdXQgYnVmZmVyLAorICAgICAgICAgICAgICAgZmx1c2ggdGhlIGJ1ZmZlciBhbmQgdGhlbiB3cml0ZSB0aGUgZGF0YSBkaXJlY3RseS4gIEluIHRoaXMKKyAgICAgICAgICAgICAgIHdheSBidWZmZXJlZCBzdHJlYW1zIHdpbGwgY2FzY2FkZSBoYXJtbGVzc2x5LiAqLworICAgICAgICAgICAgaWYgKGF1dG9GbHVzaCkKKyAgICAgICAgICAgICAgICBmbHVzaEJ1ZmZlcigpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGJ1ZmZlck92ZXJmbG93KCk7CisgICAgICAgICAgICBpbml0T3V0KCk7CisgICAgICAgICAgICBvdXQud3JpdGUoY2J1Ziwgb2ZmLCBsZW4pOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaW50IGIgPSBvZmYsIHQgPSBvZmYgKyBsZW47CisgICAgICAgIHdoaWxlIChiIDwgdCkgeworICAgICAgICAgICAgaW50IGQgPSBtaW4oYnVmZmVyU2l6ZSAtIG5leHRDaGFyLCB0IC0gYik7CisgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGNidWYsIGIsIGNiLCBuZXh0Q2hhciwgZCk7CisgICAgICAgICAgICBiICs9IGQ7CisgICAgICAgICAgICBuZXh0Q2hhciArPSBkOworICAgICAgICAgICAgaWYgKG5leHRDaGFyID49IGJ1ZmZlclNpemUpIAorICAgICAgICAgICAgICAgIGlmIChhdXRvRmx1c2gpCisgICAgICAgICAgICAgICAgICAgIGZsdXNoQnVmZmVyKCk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBidWZmZXJPdmVyZmxvdygpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZSBhbiBhcnJheSBvZiBjaGFyYWN0ZXJzLiAgVGhpcyBtZXRob2QgY2Fubm90IGJlIGluaGVyaXRlZCBmcm9tIHRoZQorICAgICAqIFdyaXRlciBjbGFzcyBiZWNhdXNlIGl0IG11c3Qgc3VwcHJlc3MgSS9PIGV4Y2VwdGlvbnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgd3JpdGUoY2hhciBidWZbXSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwl3cml0ZShidWYsIDAsIGJ1Zi5sZW5ndGgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlIGEgcG9ydGlvbiBvZiBhIFN0cmluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgcyAgICAgU3RyaW5nIHRvIGJlIHdyaXR0ZW4KKyAgICAgKiBAcGFyYW0gIG9mZiAgIE9mZnNldCBmcm9tIHdoaWNoIHRvIHN0YXJ0IHJlYWRpbmcgY2hhcmFjdGVycworICAgICAqIEBwYXJhbSAgbGVuICAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gYmUgd3JpdHRlbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHdyaXRlKFN0cmluZyBzLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBlbnN1cmVPcGVuKCk7CisgICAgICAgIGlmIChidWZmZXJTaXplID09IDApIHsKKyAgICAgICAgICAgIGluaXRPdXQoKTsKKyAgICAgICAgICAgIG91dC53cml0ZShzLCBvZmYsIGxlbik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaW50IGIgPSBvZmYsIHQgPSBvZmYgKyBsZW47CisgICAgICAgIHdoaWxlIChiIDwgdCkgeworICAgICAgICAgICAgaW50IGQgPSBtaW4oYnVmZmVyU2l6ZSAtIG5leHRDaGFyLCB0IC0gYik7CisgICAgICAgICAgICBzLmdldENoYXJzKGIsIGIgKyBkLCBjYiwgbmV4dENoYXIpOworICAgICAgICAgICAgYiArPSBkOworICAgICAgICAgICAgbmV4dENoYXIgKz0gZDsKKyAgICAgICAgICAgIGlmIChuZXh0Q2hhciA+PSBidWZmZXJTaXplKSAKKyAgICAgICAgICAgICAgICBpZiAoYXV0b0ZsdXNoKQorICAgICAgICAgICAgICAgICAgICBmbHVzaEJ1ZmZlcigpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyT3ZlcmZsb3coKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlIGEgc3RyaW5nLiAgVGhpcyBtZXRob2QgY2Fubm90IGJlIGluaGVyaXRlZCBmcm9tIHRoZSBXcml0ZXIgY2xhc3MKKyAgICAgKiBiZWNhdXNlIGl0IG11c3Qgc3VwcHJlc3MgSS9PIGV4Y2VwdGlvbnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgd3JpdGUoU3RyaW5nIHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJd3JpdGUocywgMCwgcy5sZW5ndGgoKSk7CisgICAgfQorCisKKyAgICBzdGF0aWMgU3RyaW5nIGxpbmVTZXBhcmF0b3IgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7CisKKyAgICAvKioKKyAgICAgKiBXcml0ZSBhIGxpbmUgc2VwYXJhdG9yLiAgVGhlIGxpbmUgc2VwYXJhdG9yIHN0cmluZyBpcyBkZWZpbmVkIGJ5IHRoZQorICAgICAqIHN5c3RlbSBwcm9wZXJ0eSA8dHQ+bGluZS5zZXBhcmF0b3I8L3R0PiwgYW5kIGlzIG5vdCBuZWNlc3NhcmlseSBhIHNpbmdsZQorICAgICAqIG5ld2xpbmUgKCdcbicpIGNoYXJhY3Rlci4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gIElPRXhjZXB0aW9uICBJZiBhbiBJL08gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgCisgICAgcHVibGljIHZvaWQgbmV3TGluZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHdyaXRlKGxpbmVTZXBhcmF0b3IpOworICAgIH0KKworCisgICAgLyogTWV0aG9kcyB0aGF0IGRvIG5vdCB0ZXJtaW5hdGUgbGluZXMgKi8KKworICAgIC8qKgorICAgICAqIFByaW50IGEgYm9vbGVhbiB2YWx1ZS4gIFRoZSBzdHJpbmcgcHJvZHVjZWQgYnkgPGNvZGU+e0BsaW5rCisgICAgICogamF2YS5sYW5nLlN0cmluZyN2YWx1ZU9mKGJvb2xlYW4pfTwvY29kZT4gaXMgdHJhbnNsYXRlZCBpbnRvIGJ5dGVzCisgICAgICogYWNjb3JkaW5nIHRvIHRoZSBwbGF0Zm9ybSdzIGRlZmF1bHQgY2hhcmFjdGVyIGVuY29kaW5nLCBhbmQgdGhlc2UgYnl0ZXMKKyAgICAgKiBhcmUgd3JpdHRlbiBpbiBleGFjdGx5IHRoZSBtYW5uZXIgb2YgdGhlIDxjb2RlPntAbGluaworICAgICAqICN3cml0ZShpbnQpfTwvY29kZT4gbWV0aG9kLgorICAgICAqCisgICAgICogQHBhcmFtICAgICAgYiAgIFRoZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB0byBiZSBwcmludGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHJpbnQoYm9vbGVhbiBiKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXdyaXRlKGIgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcmludCBhIGNoYXJhY3Rlci4gIFRoZSBjaGFyYWN0ZXIgaXMgdHJhbnNsYXRlZCBpbnRvIG9uZSBvciBtb3JlIGJ5dGVzCisgICAgICogYWNjb3JkaW5nIHRvIHRoZSBwbGF0Zm9ybSdzIGRlZmF1bHQgY2hhcmFjdGVyIGVuY29kaW5nLCBhbmQgdGhlc2UgYnl0ZXMKKyAgICAgKiBhcmUgd3JpdHRlbiBpbiBleGFjdGx5IHRoZSBtYW5uZXIgb2YgdGhlIDxjb2RlPntAbGluaworICAgICAqICN3cml0ZShpbnQpfTwvY29kZT4gbWV0aG9kLgorICAgICAqCisgICAgICogQHBhcmFtICAgICAgYyAgIFRoZSA8Y29kZT5jaGFyPC9jb2RlPiB0byBiZSBwcmludGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHJpbnQoY2hhciBjKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXdyaXRlKFN0cmluZy52YWx1ZU9mKGMpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcmludCBhbiBpbnRlZ2VyLiAgVGhlIHN0cmluZyBwcm9kdWNlZCBieSA8Y29kZT57QGxpbmsKKyAgICAgKiBqYXZhLmxhbmcuU3RyaW5nI3ZhbHVlT2YoaW50KX08L2NvZGU+IGlzIHRyYW5zbGF0ZWQgaW50byBieXRlcyBhY2NvcmRpbmcKKyAgICAgKiB0byB0aGUgcGxhdGZvcm0ncyBkZWZhdWx0IGNoYXJhY3RlciBlbmNvZGluZywgYW5kIHRoZXNlIGJ5dGVzIGFyZQorICAgICAqIHdyaXR0ZW4gaW4gZXhhY3RseSB0aGUgbWFubmVyIG9mIHRoZSA8Y29kZT57QGxpbmsgI3dyaXRlKGludCl9PC9jb2RlPgorICAgICAqIG1ldGhvZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgICAgIGkgICBUaGUgPGNvZGU+aW50PC9jb2RlPiB0byBiZSBwcmludGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHJpbnQoaW50IGkpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJd3JpdGUoU3RyaW5nLnZhbHVlT2YoaSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByaW50IGEgbG9uZyBpbnRlZ2VyLiAgVGhlIHN0cmluZyBwcm9kdWNlZCBieSA8Y29kZT57QGxpbmsKKyAgICAgKiBqYXZhLmxhbmcuU3RyaW5nI3ZhbHVlT2YobG9uZyl9PC9jb2RlPiBpcyB0cmFuc2xhdGVkIGludG8gYnl0ZXMKKyAgICAgKiBhY2NvcmRpbmcgdG8gdGhlIHBsYXRmb3JtJ3MgZGVmYXVsdCBjaGFyYWN0ZXIgZW5jb2RpbmcsIGFuZCB0aGVzZSBieXRlcworICAgICAqIGFyZSB3cml0dGVuIGluIGV4YWN0bHkgdGhlIG1hbm5lciBvZiB0aGUgPGNvZGU+e0BsaW5rICN3cml0ZShpbnQpfTwvY29kZT4KKyAgICAgKiBtZXRob2QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gICAgICBsICAgVGhlIDxjb2RlPmxvbmc8L2NvZGU+IHRvIGJlIHByaW50ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwcmludChsb25nIGwpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJd3JpdGUoU3RyaW5nLnZhbHVlT2YobCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByaW50IGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyLiAgVGhlIHN0cmluZyBwcm9kdWNlZCBieSA8Y29kZT57QGxpbmsKKyAgICAgKiBqYXZhLmxhbmcuU3RyaW5nI3ZhbHVlT2YoZmxvYXQpfTwvY29kZT4gaXMgdHJhbnNsYXRlZCBpbnRvIGJ5dGVzCisgICAgICogYWNjb3JkaW5nIHRvIHRoZSBwbGF0Zm9ybSdzIGRlZmF1bHQgY2hhcmFjdGVyIGVuY29kaW5nLCBhbmQgdGhlc2UgYnl0ZXMKKyAgICAgKiBhcmUgd3JpdHRlbiBpbiBleGFjdGx5IHRoZSBtYW5uZXIgb2YgdGhlIDxjb2RlPntAbGluayAjd3JpdGUoaW50KX08L2NvZGU+CisgICAgICogbWV0aG9kLgorICAgICAqCisgICAgICogQHBhcmFtICAgICAgZiAgIFRoZSA8Y29kZT5mbG9hdDwvY29kZT4gdG8gYmUgcHJpbnRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHByaW50KGZsb2F0IGYpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJd3JpdGUoU3RyaW5nLnZhbHVlT2YoZikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByaW50IGEgZG91YmxlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCBudW1iZXIuICBUaGUgc3RyaW5nIHByb2R1Y2VkIGJ5CisgICAgICogPGNvZGU+e0BsaW5rIGphdmEubGFuZy5TdHJpbmcjdmFsdWVPZihkb3VibGUpfTwvY29kZT4gaXMgdHJhbnNsYXRlZCBpbnRvCisgICAgICogYnl0ZXMgYWNjb3JkaW5nIHRvIHRoZSBwbGF0Zm9ybSdzIGRlZmF1bHQgY2hhcmFjdGVyIGVuY29kaW5nLCBhbmQgdGhlc2UKKyAgICAgKiBieXRlcyBhcmUgd3JpdHRlbiBpbiBleGFjdGx5IHRoZSBtYW5uZXIgb2YgdGhlIDxjb2RlPntAbGluaworICAgICAqICN3cml0ZShpbnQpfTwvY29kZT4gbWV0aG9kLgorICAgICAqCisgICAgICogQHBhcmFtICAgICAgZCAgIFRoZSA8Y29kZT5kb3VibGU8L2NvZGU+IHRvIGJlIHByaW50ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwcmludChkb3VibGUgZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwl3cml0ZShTdHJpbmcudmFsdWVPZihkKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJpbnQgYW4gYXJyYXkgb2YgY2hhcmFjdGVycy4gIFRoZSBjaGFyYWN0ZXJzIGFyZSBjb252ZXJ0ZWQgaW50byBieXRlcworICAgICAqIGFjY29yZGluZyB0byB0aGUgcGxhdGZvcm0ncyBkZWZhdWx0IGNoYXJhY3RlciBlbmNvZGluZywgYW5kIHRoZXNlIGJ5dGVzCisgICAgICogYXJlIHdyaXR0ZW4gaW4gZXhhY3RseSB0aGUgbWFubmVyIG9mIHRoZSA8Y29kZT57QGxpbmsgI3dyaXRlKGludCl9PC9jb2RlPgorICAgICAqIG1ldGhvZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgICAgIHMgICBUaGUgYXJyYXkgb2YgY2hhcnMgdG8gYmUgcHJpbnRlZAorICAgICAqCisgICAgICogQHRocm93cyAgTnVsbFBvaW50ZXJFeGNlcHRpb24gIElmIDxjb2RlPnM8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+CisgICAgICovCisgICAgcHVibGljIHZvaWQgcHJpbnQoY2hhciBzW10pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJd3JpdGUocyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJpbnQgYSBzdHJpbmcuICBJZiB0aGUgYXJndW1lbnQgaXMgPGNvZGU+bnVsbDwvY29kZT4gdGhlbiB0aGUgc3RyaW5nCisgICAgICogPGNvZGU+Im51bGwiPC9jb2RlPiBpcyBwcmludGVkLiAgT3RoZXJ3aXNlLCB0aGUgc3RyaW5nJ3MgY2hhcmFjdGVycyBhcmUKKyAgICAgKiBjb252ZXJ0ZWQgaW50byBieXRlcyBhY2NvcmRpbmcgdG8gdGhlIHBsYXRmb3JtJ3MgZGVmYXVsdCBjaGFyYWN0ZXIKKyAgICAgKiBlbmNvZGluZywgYW5kIHRoZXNlIGJ5dGVzIGFyZSB3cml0dGVuIGluIGV4YWN0bHkgdGhlIG1hbm5lciBvZiB0aGUKKyAgICAgKiA8Y29kZT57QGxpbmsgI3dyaXRlKGludCl9PC9jb2RlPiBtZXRob2QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gICAgICBzICAgVGhlIDxjb2RlPlN0cmluZzwvY29kZT4gdG8gYmUgcHJpbnRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHByaW50KFN0cmluZyBzKSB0aHJvd3MgSU9FeGNlcHRpb24geworCWlmIChzID09IG51bGwpIHsKKwkgICAgcyA9ICJudWxsIjsKKwl9CisJd3JpdGUocyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJpbnQgYW4gb2JqZWN0LiAgVGhlIHN0cmluZyBwcm9kdWNlZCBieSB0aGUgPGNvZGU+e0BsaW5rCisgICAgICogamF2YS5sYW5nLlN0cmluZyN2YWx1ZU9mKE9iamVjdCl9PC9jb2RlPiBtZXRob2QgaXMgdHJhbnNsYXRlZCBpbnRvIGJ5dGVzCisgICAgICogYWNjb3JkaW5nIHRvIHRoZSBwbGF0Zm9ybSdzIGRlZmF1bHQgY2hhcmFjdGVyIGVuY29kaW5nLCBhbmQgdGhlc2UgYnl0ZXMKKyAgICAgKiBhcmUgd3JpdHRlbiBpbiBleGFjdGx5IHRoZSBtYW5uZXIgb2YgdGhlIDxjb2RlPntAbGluayAjd3JpdGUoaW50KX08L2NvZGU+CisgICAgICogbWV0aG9kLgorICAgICAqCisgICAgICogQHBhcmFtICAgICAgb2JqICAgVGhlIDxjb2RlPk9iamVjdDwvY29kZT4gdG8gYmUgcHJpbnRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHByaW50KE9iamVjdCBvYmopIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJd3JpdGUoU3RyaW5nLnZhbHVlT2Yob2JqKSk7CisgICAgfQorCisgICAgLyogTWV0aG9kcyB0aGF0IGRvIHRlcm1pbmF0ZSBsaW5lcyAqLworCisgICAgLyoqCisgICAgICogVGVybWluYXRlIHRoZSBjdXJyZW50IGxpbmUgYnkgd3JpdGluZyB0aGUgbGluZSBzZXBhcmF0b3Igc3RyaW5nLiAgVGhlCisgICAgICogbGluZSBzZXBhcmF0b3Igc3RyaW5nIGlzIGRlZmluZWQgYnkgdGhlIHN5c3RlbSBwcm9wZXJ0eQorICAgICAqIDxjb2RlPmxpbmUuc2VwYXJhdG9yPC9jb2RlPiwgYW5kIGlzIG5vdCBuZWNlc3NhcmlseSBhIHNpbmdsZSBuZXdsaW5lCisgICAgICogY2hhcmFjdGVyICg8Y29kZT4nXG4nPC9jb2RlPikuCisgICAgICoKKyAgICAgKiBOZWVkIHRvIGNoYW5nZSB0aGlzIGZyb20gUHJpbnRXcml0ZXIgYmVjYXVzZSB0aGUgZGVmYXVsdAorICAgICAqIHByaW50bG4oKSB3cml0ZXMgIHRvIHRoZSBzaW5rIGRpcmVjdGx5IGluc3RlYWQgb2YgdGhyb3VnaCB0aGUKKyAgICAgKiB3cml0ZSBtZXRob2QuLi4gIAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHByaW50bG4oKSB0aHJvd3MgSU9FeGNlcHRpb24geworCW5ld0xpbmUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcmludCBhIGJvb2xlYW4gdmFsdWUgYW5kIHRoZW4gdGVybWluYXRlIHRoZSBsaW5lLiAgVGhpcyBtZXRob2QgYmVoYXZlcworICAgICAqIGFzIHRob3VnaCBpdCBpbnZva2VzIDxjb2RlPntAbGluayAjcHJpbnQoYm9vbGVhbil9PC9jb2RlPiBhbmQgdGhlbgorICAgICAqIDxjb2RlPntAbGluayAjcHJpbnRsbigpfTwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHJpbnRsbihib29sZWFuIHgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHByaW50KHgpOworICAgICAgICBwcmludGxuKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJpbnQgYSBjaGFyYWN0ZXIgYW5kIHRoZW4gdGVybWluYXRlIHRoZSBsaW5lLiAgVGhpcyBtZXRob2QgYmVoYXZlcyBhcworICAgICAqIHRob3VnaCBpdCBpbnZva2VzIDxjb2RlPntAbGluayAjcHJpbnQoY2hhcil9PC9jb2RlPiBhbmQgdGhlbiA8Y29kZT57QGxpbmsKKyAgICAgKiAjcHJpbnRsbigpfTwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHJpbnRsbihjaGFyIHgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHByaW50KHgpOworICAgICAgICBwcmludGxuKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJpbnQgYW4gaW50ZWdlciBhbmQgdGhlbiB0ZXJtaW5hdGUgdGhlIGxpbmUuICBUaGlzIG1ldGhvZCBiZWhhdmVzIGFzCisgICAgICogdGhvdWdoIGl0IGludm9rZXMgPGNvZGU+e0BsaW5rICNwcmludChpbnQpfTwvY29kZT4gYW5kIHRoZW4gPGNvZGU+e0BsaW5rCisgICAgICogI3ByaW50bG4oKX08L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHByaW50bG4oaW50IHgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHByaW50KHgpOworICAgICAgICBwcmludGxuKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJpbnQgYSBsb25nIGludGVnZXIgYW5kIHRoZW4gdGVybWluYXRlIHRoZSBsaW5lLiAgVGhpcyBtZXRob2QgYmVoYXZlcworICAgICAqIGFzIHRob3VnaCBpdCBpbnZva2VzIDxjb2RlPntAbGluayAjcHJpbnQobG9uZyl9PC9jb2RlPiBhbmQgdGhlbgorICAgICAqIDxjb2RlPntAbGluayAjcHJpbnRsbigpfTwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHJpbnRsbihsb25nIHgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHByaW50KHgpOworICAgICAgICBwcmludGxuKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJpbnQgYSBmbG9hdGluZy1wb2ludCBudW1iZXIgYW5kIHRoZW4gdGVybWluYXRlIHRoZSBsaW5lLiAgVGhpcyBtZXRob2QKKyAgICAgKiBiZWhhdmVzIGFzIHRob3VnaCBpdCBpbnZva2VzIDxjb2RlPntAbGluayAjcHJpbnQoZmxvYXQpfTwvY29kZT4gYW5kIHRoZW4KKyAgICAgKiA8Y29kZT57QGxpbmsgI3ByaW50bG4oKX08L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHByaW50bG4oZmxvYXQgeCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcHJpbnQoeCk7CisgICAgICAgIHByaW50bG4oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcmludCBhIGRvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgbnVtYmVyIGFuZCB0aGVuIHRlcm1pbmF0ZSB0aGUKKyAgICAgKiBsaW5lLiAgVGhpcyBtZXRob2QgYmVoYXZlcyBhcyB0aG91Z2ggaXQgaW52b2tlcyA8Y29kZT57QGxpbmsKKyAgICAgKiAjcHJpbnQoZG91YmxlKX08L2NvZGU+IGFuZCB0aGVuIDxjb2RlPntAbGluayAjcHJpbnRsbigpfTwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHJpbnRsbihkb3VibGUgeCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcHJpbnQoeCk7CisgICAgICAgIHByaW50bG4oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcmludCBhbiBhcnJheSBvZiBjaGFyYWN0ZXJzIGFuZCB0aGVuIHRlcm1pbmF0ZSB0aGUgbGluZS4gIFRoaXMgbWV0aG9kCisgICAgICogYmVoYXZlcyBhcyB0aG91Z2ggaXQgaW52b2tlcyA8Y29kZT57QGxpbmsgI3ByaW50KGNoYXJbXSl9PC9jb2RlPiBhbmQgdGhlbgorICAgICAqIDxjb2RlPntAbGluayAjcHJpbnRsbigpfTwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHJpbnRsbihjaGFyIHhbXSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcHJpbnQoeCk7CisgICAgICAgIHByaW50bG4oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcmludCBhIFN0cmluZyBhbmQgdGhlbiB0ZXJtaW5hdGUgdGhlIGxpbmUuICBUaGlzIG1ldGhvZCBiZWhhdmVzIGFzCisgICAgICogdGhvdWdoIGl0IGludm9rZXMgPGNvZGU+e0BsaW5rICNwcmludChTdHJpbmcpfTwvY29kZT4gYW5kIHRoZW4KKyAgICAgKiA8Y29kZT57QGxpbmsgI3ByaW50bG4oKX08L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHByaW50bG4oU3RyaW5nIHgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHByaW50KHgpOworICAgICAgICBwcmludGxuKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJpbnQgYW4gT2JqZWN0IGFuZCB0aGVuIHRlcm1pbmF0ZSB0aGUgbGluZS4gIFRoaXMgbWV0aG9kIGJlaGF2ZXMgYXMKKyAgICAgKiB0aG91Z2ggaXQgaW52b2tlcyA8Y29kZT57QGxpbmsgI3ByaW50KE9iamVjdCl9PC9jb2RlPiBhbmQgdGhlbgorICAgICAqIDxjb2RlPntAbGluayAjcHJpbnRsbigpfTwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHJpbnRsbihPYmplY3QgeCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcHJpbnQoeCk7CisgICAgICAgIHByaW50bG4oKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9ydW50aW1lL1BhZ2VDb250ZXh0SW1wbC5qYXZhIGIvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3J1bnRpbWUvUGFnZUNvbnRleHRJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBiODY5NwotLS0gL2Rldi9udWxsCisrKyBiL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9ydW50aW1lL1BhZ2VDb250ZXh0SW1wbC5qYXZhCkBAIC0wLDAgKzEsOTMxIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYXNwZXIucnVudGltZTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworCitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbmZpZzsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldFJlc3BvbnNlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLkpzcEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC5Kc3BGYWN0b3J5OworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLkpzcFdyaXRlcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC5QYWdlQ29udGV4dDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC5lbC5FTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC5lbC5FeHByZXNzaW9uRXZhbHVhdG9yOworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLmVsLlZhcmlhYmxlUmVzb2x2ZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0LkJvZHlDb250ZW50OworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmVsLkV4cHJlc3Npb25FdmFsdWF0b3JJbXBsOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5lbC5WYXJpYWJsZVJlc29sdmVySW1wbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5Db25zdGFudHM7CitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIuY29tcGlsZXIuTG9jYWxpemVyOworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBQYWdlQ29udGV4dCBjbGFzcyBmcm9tIHRoZSBKU1Agc3BlYy4KKyAqIEFsc28gZG91YmxlcyBhcyBhIFZhcmlhYmxlUmVzb2x2ZXIgZm9yIHRoZSBFTC4KKyAqCisgKiBAYXV0aG9yIEFuaWwgSy4gVmlqZW5kcmFuCisgKiBAYXV0aG9yIExhcnJ5IENhYmxlCisgKiBAYXV0aG9yIEhhbnMgQmVyZ3N0ZW4KKyAqIEBhdXRob3IgUGllcnJlIERlbGlzbGUKKyAqIEBhdXRob3IgTWFyayBSb3RoCisgKiBAYXV0aG9yIEphbiBMdWVoZQorICovCitwdWJsaWMgY2xhc3MgUGFnZUNvbnRleHRJbXBsIGV4dGVuZHMgUGFnZUNvbnRleHQgaW1wbGVtZW50cyBWYXJpYWJsZVJlc29sdmVyIHsKKworICAgIC8vIExvZ2dlcgorICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhQYWdlQ29udGV4dEltcGwuY2xhc3MpOworCisgICAgLy8gVGhlIGV4cHJlc3Npb24gZXZhbHVhdG9yLCBmb3IgZXZhbHVhdGluZyBFTCBleHByZXNzaW9ucy4KKyAgICBwcml2YXRlIHN0YXRpYyBFeHByZXNzaW9uRXZhbHVhdG9ySW1wbCBlbEV4cHJFdmFsCisJPSBuZXcgRXhwcmVzc2lvbkV2YWx1YXRvckltcGwoZmFsc2UpOworCisgICAgLy8gVGhlIHZhcmlhYmxlIHJlc29sdmVyLCBmb3IgZXZhbHVhdGluZyBFTCBleHByZXNzaW9ucy4KKyAgICBwcml2YXRlIFZhcmlhYmxlUmVzb2x2ZXJJbXBsIHZhcmlhYmxlUmVzb2x2ZXI7CisKKyAgICBwcml2YXRlIEJvZHlDb250ZW50SW1wbFtdIG91dHM7CisgICAgcHJpdmF0ZSBpbnQgZGVwdGg7CisKKyAgICAvLyBwZXItc2VydmxldCBzdGF0ZQorICAgIHByaXZhdGUgU2VydmxldCBzZXJ2bGV0OworICAgIHByaXZhdGUgU2VydmxldENvbmZpZyBjb25maWc7CisgICAgcHJpdmF0ZSBTZXJ2bGV0Q29udGV4dCBjb250ZXh0OworICAgIHByaXZhdGUgSnNwRmFjdG9yeSBmYWN0b3J5OworICAgIHByaXZhdGUgYm9vbGVhbiBuZWVkc1Nlc3Npb247CisgICAgcHJpdmF0ZSBTdHJpbmcgZXJyb3JQYWdlVVJMOworICAgIHByaXZhdGUgYm9vbGVhbiBhdXRvRmx1c2g7CisgICAgcHJpdmF0ZSBpbnQJYnVmZmVyU2l6ZTsKKworICAgIC8vIHBhZ2Utc2NvcGUgYXR0cmlidXRlcworICAgIHByaXZhdGUgdHJhbnNpZW50IEhhc2h0YWJsZQlhdHRyaWJ1dGVzOworCisgICAgLy8gcGVyLXJlcXVlc3Qgc3RhdGUKKyAgICBwcml2YXRlIHRyYW5zaWVudCBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0OworICAgIHByaXZhdGUgdHJhbnNpZW50IFNlcnZsZXRSZXNwb25zZSByZXNwb25zZTsKKyAgICBwcml2YXRlIHRyYW5zaWVudCBPYmplY3QgcGFnZTsKKyAgICBwcml2YXRlIHRyYW5zaWVudCBIdHRwU2Vzc2lvbiBzZXNzaW9uOworICAgIHByaXZhdGUgYm9vbGVhbiBpc0luY2x1ZGVkOworCisgICAgLy8gaW5pdGlhbCBvdXRwdXQgc3RyZWFtCisgICAgcHJpdmF0ZSB0cmFuc2llbnQgSnNwV3JpdGVyIG91dDsKKyAgICBwcml2YXRlIHRyYW5zaWVudCBKc3BXcml0ZXJJbXBsIGJhc2VPdXQ7CisKKyAgICAvKgorICAgICAqIENvbnN0cnVjdG9yLgorICAgICAqLworICAgIFBhZ2VDb250ZXh0SW1wbChKc3BGYWN0b3J5IGZhY3RvcnkpIHsKKyAgICAgICAgdGhpcy5mYWN0b3J5ID0gZmFjdG9yeTsKKwl0aGlzLnZhcmlhYmxlUmVzb2x2ZXIgPSBuZXcgVmFyaWFibGVSZXNvbHZlckltcGwodGhpcyk7CisJdGhpcy5vdXRzID0gbmV3IEJvZHlDb250ZW50SW1wbFswXTsKKwl0aGlzLmF0dHJpYnV0ZXMgPSBuZXcgSGFzaHRhYmxlKDE2KTsKKwl0aGlzLmRlcHRoID0gLTE7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShTZXJ2bGV0IHNlcnZsZXQsCisJCQkgICBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLAorCQkJICAgU3RyaW5nIGVycm9yUGFnZVVSTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gbmVlZHNTZXNzaW9uLAorCQkJICAgaW50IGJ1ZmZlclNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGF1dG9GbHVzaCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworCV9pbml0aWFsaXplKHNlcnZsZXQsIHJlcXVlc3QsIHJlc3BvbnNlLCBlcnJvclBhZ2VVUkwsIG5lZWRzU2Vzc2lvbiwKKwkJICAgIGJ1ZmZlclNpemUsIGF1dG9GbHVzaCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIF9pbml0aWFsaXplKFNlcnZsZXQgc2VydmxldCwKKwkJCSAgICAgU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKwkJCSAgICAgU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLAorCQkJICAgICBTdHJpbmcgZXJyb3JQYWdlVVJMLAorCQkJICAgICBib29sZWFuIG5lZWRzU2Vzc2lvbiwKKwkJCSAgICAgaW50IGJ1ZmZlclNpemUsCisJCQkgICAgIGJvb2xlYW4gYXV0b0ZsdXNoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisJLy8gaW5pdGlhbGl6ZSBzdGF0ZQorCXRoaXMuc2VydmxldCA9IHNlcnZsZXQ7CisJdGhpcy5jb25maWcgPSBzZXJ2bGV0LmdldFNlcnZsZXRDb25maWcoKTsKKwl0aGlzLmNvbnRleHQgPSBjb25maWcuZ2V0U2VydmxldENvbnRleHQoKTsKKwl0aGlzLm5lZWRzU2Vzc2lvbiA9IG5lZWRzU2Vzc2lvbjsKKwl0aGlzLmVycm9yUGFnZVVSTCA9IGVycm9yUGFnZVVSTDsKKwl0aGlzLmJ1ZmZlclNpemUgPSBidWZmZXJTaXplOworCXRoaXMuYXV0b0ZsdXNoID0gYXV0b0ZsdXNoOworCXRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7CisgCXRoaXMucmVzcG9uc2UgPSByZXNwb25zZTsKKworCS8vIFNldHVwIHNlc3Npb24gKGlmIHJlcXVpcmVkKQorCWlmIChyZXF1ZXN0IGluc3RhbmNlb2YgSHR0cFNlcnZsZXRSZXF1ZXN0ICYmIG5lZWRzU2Vzc2lvbikKKwkgICAgdGhpcy5zZXNzaW9uID0gKChIdHRwU2VydmxldFJlcXVlc3QpcmVxdWVzdCkuZ2V0U2Vzc2lvbigpOworCWlmIChuZWVkc1Nlc3Npb24gJiYgc2Vzc2lvbiA9PSBudWxsKQorCSAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKCJQYWdlIG5lZWRzIGEgc2Vzc2lvbiBhbmQgbm9uZSBpcyBhdmFpbGFibGUiKTsKKworICAgICAgICAvLyBpbml0aWFsaXplIHRoZSBpbml0aWFsIG91dCAuLi4KKyAgICAgICAgZGVwdGggPSAtMTsKKyAgICAgICAgaWYgKHRoaXMuYmFzZU91dCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aGlzLmJhc2VPdXQgPSBuZXcgSnNwV3JpdGVySW1wbChyZXNwb25zZSwgYnVmZmVyU2l6ZSwgYXV0b0ZsdXNoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRoaXMuYmFzZU91dC5pbml0KHJlc3BvbnNlLCBidWZmZXJTaXplLCBhdXRvRmx1c2gpOworICAgICAgICB9CisgICAgICAgIHRoaXMub3V0ID0gYmFzZU91dDsKKworCS8vIHJlZ2lzdGVyIG5hbWVzL3ZhbHVlcyBhcyBwZXIgc3BlYworCXNldEF0dHJpYnV0ZShPVVQsIHRoaXMub3V0KTsKKwlzZXRBdHRyaWJ1dGUoUkVRVUVTVCwgcmVxdWVzdCk7CisJc2V0QXR0cmlidXRlKFJFU1BPTlNFLCByZXNwb25zZSk7CisKKwlpZiAoc2Vzc2lvbiAhPSBudWxsKQorCSAgICBzZXRBdHRyaWJ1dGUoU0VTU0lPTiwgc2Vzc2lvbik7CisKKwlzZXRBdHRyaWJ1dGUoUEFHRSwgc2VydmxldCk7CisJc2V0QXR0cmlidXRlKENPTkZJRywgY29uZmlnKTsKKwlzZXRBdHRyaWJ1dGUoUEFHRUNPTlRFWFQsIHRoaXMpOworCXNldEF0dHJpYnV0ZShBUFBMSUNBVElPTiwgY29udGV4dCk7CisKKwlpc0luY2x1ZGVkID0gcmVxdWVzdC5nZXRBdHRyaWJ1dGUoCisJICAgICJqYXZheC5zZXJ2bGV0LmluY2x1ZGUuc2VydmxldF9wYXRoIikgIT0gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZWxlYXNlKCkgeworICAgICAgICBvdXQgPSBiYXNlT3V0OworCXRyeSB7CisJICAgIGlmIChpc0luY2x1ZGVkKSB7CisJCSgoSnNwV3JpdGVySW1wbClvdXQpLmZsdXNoQnVmZmVyKCk7CisgICAgICAgICAgICAgICAgLy8gcHVzaCBpdCBpbnRvIHRoZSBpbmNsdWRpbmcganNwV3JpdGVyCisJICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gT2xkIGNvZGU6CisgICAgICAgICAgICAgICAgLy9vdXQuZmx1c2goKTsKKyAgICAgICAgICAgICAgICAvLyBEbyBub3QgZmx1c2ggdGhlIGJ1ZmZlciBldmVuIGlmIHdlJ3JlIG5vdCBpbmNsdWRlZCAoaS5lLgorICAgICAgICAgICAgICAgIC8vIHdlIGFyZSB0aGUgbWFpbiBwYWdlLiBUaGUgc2VydmxldCB3aWxsIGZsdXNoIGl0IGFuZCBjbG9zZQorICAgICAgICAgICAgICAgIC8vIHRoZSBzdHJlYW0uCisgICAgICAgICAgICAgICAgKChKc3BXcml0ZXJJbXBsKW91dCkuZmx1c2hCdWZmZXIoKTsKKyAgICAgICAgICAgIH0KKwl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworCSAgICBsb2cud2FybigiSW50ZXJuYWwgZXJyb3IgZmx1c2hpbmcgdGhlIGJ1ZmZlciBpbiByZWxlYXNlKCkiKTsKKwl9CisKKwlzZXJ2bGV0ID0gbnVsbDsKKwljb25maWcgPSBudWxsOworCWNvbnRleHQgPSBudWxsOworCW5lZWRzU2Vzc2lvbiA9IGZhbHNlOworCWVycm9yUGFnZVVSTCA9IG51bGw7CisJYnVmZmVyU2l6ZSA9IEpzcFdyaXRlci5ERUZBVUxUX0JVRkZFUjsKKwlhdXRvRmx1c2ggPSB0cnVlOworCXJlcXVlc3QgPSBudWxsOworCXJlc3BvbnNlID0gbnVsbDsKKyAgICAgICAgZGVwdGggPSAtMTsKKwliYXNlT3V0LnJlY3ljbGUoKTsKKwlzZXNzaW9uID0gbnVsbDsKKworCWF0dHJpYnV0ZXMuY2xlYXIoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldEF0dHJpYnV0ZShmaW5hbCBTdHJpbmcgbmFtZSkgeworCisgICAgICAgIGlmIChuYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgTG9jYWxpemVyLmdldE1lc3NhZ2UoImpzcC5lcnJvci5hdHRyaWJ1dGUubnVsbF9uYW1lIikpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSAhPSBudWxsKXsKKyAgICAgICAgICAgIHJldHVybiBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbigpeworICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCl7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBkb0dldEF0dHJpYnV0ZShuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBkb0dldEF0dHJpYnV0ZShuYW1lKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHJpdmF0ZSBPYmplY3QgZG9HZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpeworICAgICAgICByZXR1cm4gYXR0cmlidXRlcy5nZXQobmFtZSk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRBdHRyaWJ1dGUoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIGludCBzY29wZSkgeworCisgICAgICAgIGlmIChuYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgTG9jYWxpemVyLmdldE1lc3NhZ2UoImpzcC5lcnJvci5hdHRyaWJ1dGUubnVsbF9uYW1lIikpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSAhPSBudWxsKXsKKyAgICAgICAgICAgIHJldHVybiBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbigpeworICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCl7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBkb0dldEF0dHJpYnV0ZShuYW1lLCBzY29wZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZG9HZXRBdHRyaWJ1dGUobmFtZSwgc2NvcGUpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwcml2YXRlIE9iamVjdCBkb0dldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgaW50IHNjb3BlKXsKKyAgICAgICAgc3dpdGNoIChzY29wZSkgeworICAgICAgICAgICAgY2FzZSBQQUdFX1NDT1BFOgorICAgICAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZXMuZ2V0KG5hbWUpOworCisgICAgICAgICAgICBjYXNlIFJFUVVFU1RfU0NPUEU6CisgICAgICAgICAgICByZXR1cm4gcmVxdWVzdC5nZXRBdHRyaWJ1dGUobmFtZSk7CisKKyAgICAgICAgICAgIGNhc2UgU0VTU0lPTl9TQ09QRToKKyAgICAgICAgICAgIGlmIChzZXNzaW9uID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxpemVyLmdldE1lc3NhZ2UoImpzcC5lcnJvci5wYWdlLm5vU2Vzc2lvbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzZXNzaW9uLmdldEF0dHJpYnV0ZShuYW1lKTsKKworICAgICAgICAgICAgY2FzZSBBUFBMSUNBVElPTl9TQ09QRToKKyAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmdldEF0dHJpYnV0ZShuYW1lKTsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgc2NvcGUiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgT2JqZWN0IGF0dHJpYnV0ZSkgeworCisgICAgICAgIGlmIChuYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgTG9jYWxpemVyLmdldE1lc3NhZ2UoImpzcC5lcnJvci5hdHRyaWJ1dGUubnVsbF9uYW1lIikpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSAhPSBudWxsKXsKKyAgICAgICAgICAgIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkQWN0aW9uKCl7CisgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKXsKKyAgICAgICAgICAgICAgICAgICAgZG9TZXRBdHRyaWJ1dGUobmFtZSwgYXR0cmlidXRlKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkb1NldEF0dHJpYnV0ZShuYW1lLCBhdHRyaWJ1dGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRvU2V0QXR0cmlidXRlKFN0cmluZyBuYW1lLCBPYmplY3QgYXR0cmlidXRlKXsKKyAgICAgICAgaWYgKGF0dHJpYnV0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBhdHRyaWJ1dGVzLnB1dChuYW1lLCBhdHRyaWJ1dGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVtb3ZlQXR0cmlidXRlKG5hbWUsIFBBR0VfU0NPUEUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBPYmplY3QgbywgZmluYWwgaW50IHNjb3BlKSB7CisKKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICBMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgianNwLmVycm9yLmF0dHJpYnV0ZS5udWxsX25hbWUiKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpICE9IG51bGwpeworICAgICAgICAgICAgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRBY3Rpb24oKXsKKyAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpeworICAgICAgICAgICAgICAgICAgICBkb1NldEF0dHJpYnV0ZShuYW1lLCBvLCBzY29wZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZG9TZXRBdHRyaWJ1dGUobmFtZSwgbywgc2NvcGUpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZG9TZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIE9iamVjdCBvLCBpbnQgc2NvcGUgKXsKKyAgICAgICAgaWYgKG8gIT0gbnVsbCkgeworICAgICAgICAgICAgc3dpdGNoIChzY29wZSkgeworICAgICAgICAgICAgY2FzZSBQQUdFX1NDT1BFOgorICAgICAgICAgICAgYXR0cmlidXRlcy5wdXQobmFtZSwgbyk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBSRVFVRVNUX1NDT1BFOgorICAgICAgICAgICAgcmVxdWVzdC5zZXRBdHRyaWJ1dGUobmFtZSwgbyk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBTRVNTSU9OX1NDT1BFOgorICAgICAgICAgICAgaWYgKHNlc3Npb24gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgianNwLmVycm9yLnBhZ2Uubm9TZXNzaW9uIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2Vzc2lvbi5zZXRBdHRyaWJ1dGUobmFtZSwgbyk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBBUFBMSUNBVElPTl9TQ09QRToKKyAgICAgICAgICAgIGNvbnRleHQuc2V0QXR0cmlidXRlKG5hbWUsIG8pOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIHNjb3BlIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZW1vdmVBdHRyaWJ1dGUobmFtZSwgc2NvcGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVtb3ZlQXR0cmlidXRlKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBpbnQgc2NvcGUpIHsKKworICAgICAgICBpZiAobmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgIExvY2FsaXplci5nZXRNZXNzYWdlKCJqc3AuZXJyb3IuYXR0cmlidXRlLm51bGxfbmFtZSIpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpICE9IG51bGwpeworICAgICAgICAgICAgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRBY3Rpb24oKXsKKyAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpeworICAgICAgICAgICAgICAgICAgICBkb1JlbW92ZUF0dHJpYnV0ZShuYW1lLCBzY29wZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZG9SZW1vdmVBdHRyaWJ1dGUobmFtZSwgc2NvcGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRvUmVtb3ZlQXR0cmlidXRlKFN0cmluZyBuYW1lLCBpbnQgc2NvcGUpeworICAgICAgICBzd2l0Y2ggKHNjb3BlKSB7CisgICAgICAgIGNhc2UgUEFHRV9TQ09QRToKKyAgICAgICAgICAgIGF0dHJpYnV0ZXMucmVtb3ZlKG5hbWUpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBSRVFVRVNUX1NDT1BFOgorICAgICAgICAgICAgcmVxdWVzdC5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFNFU1NJT05fU0NPUEU6CisgICAgICAgICAgICBpZiAoc2Vzc2lvbiA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxpemVyLmdldE1lc3NhZ2UoImpzcC5lcnJvci5wYWdlLm5vU2Vzc2lvbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNlc3Npb24ucmVtb3ZlQXR0cmlidXRlKG5hbWUpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBBUFBMSUNBVElPTl9TQ09QRToKKyAgICAgICAgICAgIGNvbnRleHQucmVtb3ZlQXR0cmlidXRlKG5hbWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgc2NvcGUiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0QXR0cmlidXRlc1Njb3BlKGZpbmFsIFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICBMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgianNwLmVycm9yLmF0dHJpYnV0ZS5udWxsX25hbWUiKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpICE9IG51bGwpeworICAgICAgICAgICAgcmV0dXJuICgoSW50ZWdlcilBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbigpeworICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCl7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSW50ZWdlcihkb0dldEF0dHJpYnV0ZVNjb3BlKG5hbWUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KSkuaW50VmFsdWUoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBkb0dldEF0dHJpYnV0ZVNjb3BlKG5hbWUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgZG9HZXRBdHRyaWJ1dGVTY29wZShTdHJpbmcgbmFtZSl7CisgICAgICAgIGlmIChhdHRyaWJ1dGVzLmdldChuYW1lKSAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIFBBR0VfU0NPUEU7CisKKyAgICAgICAgaWYgKHJlcXVlc3QuZ2V0QXR0cmlidXRlKG5hbWUpICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gUkVRVUVTVF9TQ09QRTsKKworICAgICAgICBpZiAoc2Vzc2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoc2Vzc2lvbi5nZXRBdHRyaWJ1dGUobmFtZSkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gU0VTU0lPTl9TQ09QRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb250ZXh0LmdldEF0dHJpYnV0ZShuYW1lKSAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIEFQUExJQ0FUSU9OX1NDT1BFOworCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZmluZEF0dHJpYnV0ZShmaW5hbCBTdHJpbmcgbmFtZSkgeworICAgICAgICBpZiAoU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpICE9IG51bGwpeworICAgICAgICAgICAgcmV0dXJuIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkQWN0aW9uKCl7CisgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKXsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgianNwLmVycm9yLmF0dHJpYnV0ZS5udWxsX25hbWUiKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZG9GaW5kQXR0cmlidXRlKG5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsaXplci5nZXRNZXNzYWdlKCJqc3AuZXJyb3IuYXR0cmlidXRlLm51bGxfbmFtZSIpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGRvRmluZEF0dHJpYnV0ZShuYW1lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgT2JqZWN0IGRvRmluZEF0dHJpYnV0ZShTdHJpbmcgbmFtZSl7CisKKyAgICAgICAgT2JqZWN0IG8gPSBhdHRyaWJ1dGVzLmdldChuYW1lKTsKKyAgICAgICAgaWYgKG8gIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBvOworCisgICAgICAgIG8gPSByZXF1ZXN0LmdldEF0dHJpYnV0ZShuYW1lKTsKKyAgICAgICAgaWYgKG8gIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBvOworCisgICAgICAgIGlmIChzZXNzaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIG8gPSBzZXNzaW9uLmdldEF0dHJpYnV0ZShuYW1lKTsKKyAgICAgICAgICAgIGlmIChvICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIG87CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gY29udGV4dC5nZXRBdHRyaWJ1dGUobmFtZSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0QXR0cmlidXRlTmFtZXNJblNjb3BlKGZpbmFsIGludCBzY29wZSkgeworICAgICAgICBpZiAoU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpICE9IG51bGwpeworICAgICAgICAgICAgcmV0dXJuIChFbnVtZXJhdGlvbikKKyAgICAgICAgICAgICAgICAgICAgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRBY3Rpb24oKXsKKyAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZG9HZXRBdHRyaWJ1dGVOYW1lc0luU2NvcGUoc2NvcGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGRvR2V0QXR0cmlidXRlTmFtZXNJblNjb3BlKHNjb3BlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgRW51bWVyYXRpb24gZG9HZXRBdHRyaWJ1dGVOYW1lc0luU2NvcGUoaW50IHNjb3BlKXsKKyAgICAgICAgc3dpdGNoIChzY29wZSkgeworICAgICAgICBjYXNlIFBBR0VfU0NPUEU6CisgICAgICAgICAgICByZXR1cm4gYXR0cmlidXRlcy5rZXlzKCk7CisgICAgICAgICAgICAKKyAgICAgICAgY2FzZSBSRVFVRVNUX1NDT1BFOgorICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3QuZ2V0QXR0cmlidXRlTmFtZXMoKTsKKworICAgICAgICBjYXNlIFNFU1NJT05fU0NPUEU6CisgICAgICAgICAgICBpZiAoc2Vzc2lvbiA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxpemVyLmdldE1lc3NhZ2UoImpzcC5lcnJvci5wYWdlLm5vU2Vzc2lvbiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzZXNzaW9uLmdldEF0dHJpYnV0ZU5hbWVzKCk7CisKKyAgICAgICAgY2FzZSBBUFBMSUNBVElPTl9TQ09QRToKKyAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmdldEF0dHJpYnV0ZU5hbWVzKCk7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgc2NvcGUiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUF0dHJpYnV0ZShmaW5hbCBTdHJpbmcgbmFtZSkgeworCisgICAgICAgIGlmIChuYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgTG9jYWxpemVyLmdldE1lc3NhZ2UoImpzcC5lcnJvci5hdHRyaWJ1dGUubnVsbF9uYW1lIikpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSAhPSBudWxsKXsKKyAgICAgICAgICAgIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkQWN0aW9uKCl7CisgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKXsKKyAgICAgICAgICAgICAgICAgICAgZG9SZW1vdmVBdHRyaWJ1dGUobmFtZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZG9SZW1vdmVBdHRyaWJ1dGUobmFtZSk7CisgICAgICAgIH0KKwl9CisKKworICAgIHByaXZhdGUgdm9pZCBkb1JlbW92ZUF0dHJpYnV0ZShTdHJpbmcgbmFtZSl7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZW1vdmVBdHRyaWJ1dGUobmFtZSwgUEFHRV9TQ09QRSk7CisgICAgICAgICAgICByZW1vdmVBdHRyaWJ1dGUobmFtZSwgUkVRVUVTVF9TQ09QRSk7CisgICAgICAgICAgICBpZiggc2Vzc2lvbiAhPSBudWxsICkgeworICAgICAgICAgICAgICAgICAgICByZW1vdmVBdHRyaWJ1dGUobmFtZSwgU0VTU0lPTl9TQ09QRSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlbW92ZUF0dHJpYnV0ZShuYW1lLCBBUFBMSUNBVElPTl9TQ09QRSk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIC8vIHdlIHJlbW92ZSBhcyBtdWNoIGFzIHdlIGNhbiwgYW5kCisgICAgICAgICAgICAvLyBzaW1wbHkgaWdub3JlIHBvc3NpYmxlIGV4Y2VwdGlvbnMKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBKc3BXcml0ZXIgZ2V0T3V0KCkgeworCXJldHVybiBvdXQ7CisgICAgfQorCisgICAgcHVibGljIEh0dHBTZXNzaW9uIGdldFNlc3Npb24oKSB7IHJldHVybiBzZXNzaW9uOyB9CisgICAgcHVibGljIFNlcnZsZXQgZ2V0U2VydmxldCgpIHsgcmV0dXJuIHNlcnZsZXQ7IH0KKyAgICBwdWJsaWMgU2VydmxldENvbmZpZyBnZXRTZXJ2bGV0Q29uZmlnKCkgeyByZXR1cm4gY29uZmlnOyB9CisgICAgcHVibGljIFNlcnZsZXRDb250ZXh0IGdldFNlcnZsZXRDb250ZXh0KCkgeworCXJldHVybiBjb25maWcuZ2V0U2VydmxldENvbnRleHQoKTsKKyAgICB9CisgICAgcHVibGljIFNlcnZsZXRSZXF1ZXN0IGdldFJlcXVlc3QoKSB7IHJldHVybiByZXF1ZXN0OyB9CisgICAgcHVibGljIFNlcnZsZXRSZXNwb25zZSBnZXRSZXNwb25zZSgpIHsgcmV0dXJuIHJlc3BvbnNlOyB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBleGNlcHRpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgcGFnZQorICAgICAqIGNvbnRleHQsIGlmIGFueS4KKyAgICAgKiA8cC8+CisgICAgICogQWRkZWQgd3JhcHBpbmcgZm9yIFRocm93YWJsZXMgdG8gYXZvaWQgQ2xhc3NDYXNlRXhjZXB0aW9uOgorICAgICAqIHNlZSBCdWd6aWxsYSAzMTE3MSBmb3IgZGV0YWlscy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIEV4Y2VwdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBwYWdlIGNvbnRleHQsIGlmIGFueS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRXhjZXB0aW9uIGdldEV4Y2VwdGlvbigpIHsKKyAgICAgICAgVGhyb3dhYmxlIGV4YyA9IChUaHJvd2FibGUpIHJlcXVlc3QuZ2V0QXR0cmlidXRlKEVYQ0VQVElPTik7CisKKyAgICAgICAgLy8gT25seSB3cmFwIGlmIG5lZWRlZAorICAgICAgICBpZigoZXhjICE9IG51bGwpICYmICghIChleGMgaW5zdGFuY2VvZiBFeGNlcHRpb24pKSkgeworICAgICAgICAgICAgZXhjID0gbmV3IEpzcEV4Y2VwdGlvbihleGMpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIChFeGNlcHRpb24pIGV4YzsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldFBhZ2UoKSB7IHJldHVybiBzZXJ2bGV0OyB9CisKKworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGdldEFic29sdXRlUGF0aFJlbGF0aXZlVG9Db250ZXh0KFN0cmluZyByZWxhdGl2ZVVybFBhdGgpIHsKKyAgICAgICAgU3RyaW5nIHBhdGggPSByZWxhdGl2ZVVybFBhdGg7CisKKyAgICAgICAgaWYgKCFwYXRoLnN0YXJ0c1dpdGgoIi8iKSkgeworCSAgICBTdHJpbmcgdXJpID0gKFN0cmluZykKKwkJcmVxdWVzdC5nZXRBdHRyaWJ1dGUoImphdmF4LnNlcnZsZXQuaW5jbHVkZS5zZXJ2bGV0X3BhdGgiKTsKKwkgICAgaWYgKHVyaSA9PSBudWxsKQorCQl1cmkgPSAoKEh0dHBTZXJ2bGV0UmVxdWVzdCkgcmVxdWVzdCkuZ2V0U2VydmxldFBhdGgoKTsKKyAgICAgICAgICAgIFN0cmluZyBiYXNlVVJJID0gdXJpLnN1YnN0cmluZygwLCB1cmkubGFzdEluZGV4T2YoJy8nKSk7CisgICAgICAgICAgICBwYXRoID0gYmFzZVVSSSsnLycrcGF0aDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBwYXRoOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGluY2x1ZGUoU3RyaW5nIHJlbGF0aXZlVXJsUGF0aCkKKwkgICAgICAgIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEpzcFJ1bnRpbWVMaWJyYXJ5LmluY2x1ZGUocmVxdWVzdCwgcmVzcG9uc2UsIHJlbGF0aXZlVXJsUGF0aCwgb3V0LAorCQkJCSAgdHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW5jbHVkZShmaW5hbCBTdHJpbmcgcmVsYXRpdmVVcmxQYXRoLCBmaW5hbCBib29sZWFuIGZsdXNoKQorCSAgICAgICAgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSAhPSBudWxsKXsKKyAgICAgICAgICAgIHRyeXsKKyAgICAgICAgICAgICAgICBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigpeworICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHRocm93cyBFeGNlcHRpb257CisgICAgICAgICAgICAgICAgICAgICAgICBkb0luY2x1ZGUocmVsYXRpdmVVcmxQYXRoLCBmbHVzaCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfSBjYXRjaCAoUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgICAgICBFeGNlcHRpb24gZXggPSAgZS5nZXRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBJT0V4Y2VwdGlvbil7CisgICAgICAgICAgICAgICAgICAgIHRocm93IChJT0V4Y2VwdGlvbilleDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyAoU2VydmxldEV4Y2VwdGlvbilleDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkb0luY2x1ZGUocmVsYXRpdmVVcmxQYXRoLCBmbHVzaCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZG9JbmNsdWRlKFN0cmluZyByZWxhdGl2ZVVybFBhdGgsIGJvb2xlYW4gZmx1c2gpCisJICAgICAgICB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICBKc3BSdW50aW1lTGlicmFyeS5pbmNsdWRlKHJlcXVlc3QsIHJlc3BvbnNlLCByZWxhdGl2ZVVybFBhdGgsIG91dCwKKwkJCQkgIGZsdXNoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVmFyaWFibGVSZXNvbHZlciBnZXRWYXJpYWJsZVJlc29sdmVyKCkgeworCXJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGZvcndhcmQoZmluYWwgU3RyaW5nIHJlbGF0aXZlVXJsUGF0aCkKKyAgICAgICAgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSAhPSBudWxsKXsKKyAgICAgICAgICAgIHRyeXsKKyAgICAgICAgICAgICAgICBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigpeworICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHRocm93cyBFeGNlcHRpb257CisgICAgICAgICAgICAgICAgICAgICAgICBkb0ZvcndhcmQocmVsYXRpdmVVcmxQYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9IGNhdGNoIChQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgICAgIEV4Y2VwdGlvbiBleCA9ICBlLmdldEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgIGlmIChleCBpbnN0YW5jZW9mIElPRXhjZXB0aW9uKXsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgKElPRXhjZXB0aW9uKWV4OworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IChTZXJ2bGV0RXhjZXB0aW9uKWV4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRvRm9yd2FyZChyZWxhdGl2ZVVybFBhdGgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRvRm9yd2FyZChTdHJpbmcgcmVsYXRpdmVVcmxQYXRoKQorICAgICAgICB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb257CisKKyAgICAgICAgLy8gSlNQLjQuNSBJZiB0aGUgYnVmZmVyIHdhcyBmbHVzaGVkLCB0aHJvdyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG91dC5jbGVhcigpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlzZSA9CisgICAgICAgICAgICAgICAgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAianNwLmVycm9yLmF0dGVtcHRfdG9fY2xlYXJfZmx1c2hlZF9idWZmZXIiKSk7CisgICAgICAgICAgICBpc2UuaW5pdENhdXNlKGV4KTsKKyAgICAgICAgICAgIHRocm93IGlzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSByZXNwb25zZSBvYmplY3QgaXMgbm90IHRoZSB3cmFwcGVyIGZvciBpbmNsdWRlCisgICAgICAgIHdoaWxlIChyZXNwb25zZSBpbnN0YW5jZW9mIFNlcnZsZXRSZXNwb25zZVdyYXBwZXJJbmNsdWRlKSB7CisgICAgICAgICAgICByZXNwb25zZSA9ICgoU2VydmxldFJlc3BvbnNlV3JhcHBlckluY2x1ZGUpcmVzcG9uc2UpLmdldFJlc3BvbnNlKCk7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBTdHJpbmcgcGF0aCA9IGdldEFic29sdXRlUGF0aFJlbGF0aXZlVG9Db250ZXh0KHJlbGF0aXZlVXJsUGF0aCk7CisgICAgICAgIFN0cmluZyBpbmNsdWRlVXJpCisgICAgICAgICAgICA9IChTdHJpbmcpIHJlcXVlc3QuZ2V0QXR0cmlidXRlKENvbnN0YW50cy5JTkNfU0VSVkxFVF9QQVRIKTsKKyAgICAgICAgICAgIAorICAgICAgICBmaW5hbCBTZXJ2bGV0UmVzcG9uc2UgZnJlc3BvbnNlID0gcmVzcG9uc2U7CisgICAgICAgIGZpbmFsIFNlcnZsZXRSZXF1ZXN0IGZyZXF1ZXN0ID0gcmVxdWVzdDsKKyAgICAgICAgICAgIAorICAgICAgICBpZiAoaW5jbHVkZVVyaSAhPSBudWxsKQorICAgICAgICAgICAgcmVxdWVzdC5yZW1vdmVBdHRyaWJ1dGUoQ29uc3RhbnRzLklOQ19TRVJWTEVUX1BBVEgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgY29udGV4dC5nZXRSZXF1ZXN0RGlzcGF0Y2hlcihwYXRoKS5mb3J3YXJkKHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChpbmNsdWRlVXJpICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVxdWVzdC5zZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLklOQ19TRVJWTEVUX1BBVEgsIGluY2x1ZGVVcmkpOworICAgICAgICAgICAgcmVxdWVzdC5zZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLkZPUldBUkRfU0VFTiwgInRydWUiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBCb2R5Q29udGVudCBwdXNoQm9keSgpIHsKKwlyZXR1cm4gKEJvZHlDb250ZW50KSBwdXNoQm9keShudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSnNwV3JpdGVyIHB1c2hCb2R5KFdyaXRlciB3cml0ZXIpIHsKKyAgICAgICAgZGVwdGgrKzsKKyAgICAgICAgaWYgKGRlcHRoID49IG91dHMubGVuZ3RoKSB7CisgICAgICAgICAgICBCb2R5Q29udGVudEltcGxbXSBuZXdPdXRzID0gbmV3IEJvZHlDb250ZW50SW1wbFtkZXB0aCArIDFdOworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPG91dHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBuZXdPdXRzW2ldID0gb3V0c1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5ld091dHNbZGVwdGhdID0gbmV3IEJvZHlDb250ZW50SW1wbChvdXQpOworICAgICAgICAgICAgb3V0cyA9IG5ld091dHM7CisgICAgICAgIH0KKworCW91dHNbZGVwdGhdLnNldFdyaXRlcih3cml0ZXIpOworICAgICAgICBvdXQgPSBvdXRzW2RlcHRoXTsKKworCS8vIFVwZGF0ZSB0aGUgdmFsdWUgb2YgdGhlICJvdXQiIGF0dHJpYnV0ZSBpbiB0aGUgcGFnZSBzY29wZQorCS8vIGF0dHJpYnV0ZSBuYW1lc3BhY2Ugb2YgdGhpcyBQYWdlQ29udGV4dAorCXNldEF0dHJpYnV0ZShPVVQsIG91dCk7CisKKyAgICAgICAgcmV0dXJuIG91dHNbZGVwdGhdOworICAgIH0KKworICAgIHB1YmxpYyBKc3BXcml0ZXIgcG9wQm9keSgpIHsKKyAgICAgICAgZGVwdGgtLTsKKyAgICAgICAgaWYgKGRlcHRoID49IDApIHsKKyAgICAgICAgICAgIG91dCA9IG91dHNbZGVwdGhdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb3V0ID0gYmFzZU91dDsKKyAgICAgICAgfQorCisJLy8gVXBkYXRlIHRoZSB2YWx1ZSBvZiB0aGUgIm91dCIgYXR0cmlidXRlIGluIHRoZSBwYWdlIHNjb3BlCisJLy8gYXR0cmlidXRlIG5hbWVzcGFjZSBvZiB0aGlzIFBhZ2VDb250ZXh0CisJc2V0QXR0cmlidXRlKE9VVCwgb3V0KTsKKworICAgICAgICByZXR1cm4gb3V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb3ZpZGVzIHByb2dyYW1tYXRpYyBhY2Nlc3MgdG8gdGhlIEV4cHJlc3Npb25FdmFsdWF0b3IuCisgICAgICogVGhlIEpTUCBDb250YWluZXIgbXVzdCByZXR1cm4gYSB2YWxpZCBpbnN0YW5jZSBvZiBhbgorICAgICAqIEV4cHJlc3Npb25FdmFsdWF0b3IgdGhhdCBjYW4gcGFyc2UgRUwgZXhwcmVzc2lvbnMuCisgICAgICovCisgICAgcHVibGljIEV4cHJlc3Npb25FdmFsdWF0b3IgZ2V0RXhwcmVzc2lvbkV2YWx1YXRvcigpIHsKKyAgICAgICAgcmV0dXJuIGVsRXhwckV2YWw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaGFuZGxlUGFnZUV4Y2VwdGlvbihFeGNlcHRpb24gZXgpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgLy8gU2hvdWxkIG5ldmVyIGJlIGNhbGxlZCBzaW5jZSBoYW5kbGVFeGNlcHRpb24oKSBjYWxsZWQgd2l0aCBhCisgICAgICAgIC8vIFRocm93YWJsZSBpbiB0aGUgZ2VuZXJhdGVkIHNlcnZsZXQuCisgICAgICAgIGhhbmRsZVBhZ2VFeGNlcHRpb24oKFRocm93YWJsZSkgZXgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGhhbmRsZVBhZ2VFeGNlcHRpb24oZmluYWwgVGhyb3dhYmxlIHQpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaWYgKHQgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigibnVsbCBUaHJvd2FibGUiKTsKKworICAgICAgICBpZiAoU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpICE9IG51bGwpeworICAgICAgICAgICAgdHJ5eworICAgICAgICAgICAgICAgIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKCl7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbnsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvSGFuZGxlUGFnZUV4Y2VwdGlvbih0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9IGNhdGNoIChQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgICAgIEV4Y2VwdGlvbiBleCA9ICBlLmdldEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgIGlmIChleCBpbnN0YW5jZW9mIElPRXhjZXB0aW9uKXsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgKElPRXhjZXB0aW9uKWV4OworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IChTZXJ2bGV0RXhjZXB0aW9uKWV4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRvSGFuZGxlUGFnZUV4Y2VwdGlvbih0KTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRvSGFuZGxlUGFnZUV4Y2VwdGlvbihUaHJvd2FibGUgdCkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICBpZiAoZXJyb3JQYWdlVVJMICE9IG51bGwgJiYgIWVycm9yUGFnZVVSTC5lcXVhbHMoIiIpKSB7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBTZXQgcmVxdWVzdCBhdHRyaWJ1dGVzLgorICAgICAgICAgICAgICogRG8gbm90IHNldCB0aGUgamF2YXguc2VydmxldC5lcnJvci5leGNlcHRpb24gYXR0cmlidXRlIGhlcmUKKyAgICAgICAgICAgICAqIChpbnN0ZWFkLCBzZXQgaW4gdGhlIGdlbmVyYXRlZCBzZXJ2bGV0IGNvZGUgZm9yIHRoZSBlcnJvciBwYWdlKQorICAgICAgICAgICAgICogaW4gb3JkZXIgdG8gcHJldmVudCB0aGUgRXJyb3JSZXBvcnRWYWx2ZSwgd2hpY2ggaXMgaW52b2tlZCBhcworICAgICAgICAgICAgICogcGFydCBvZiBmb3J3YXJkaW5nIHRoZSByZXF1ZXN0IHRvIHRoZSBlcnJvciBwYWdlLCBmcm9tCisgICAgICAgICAgICAgKiB0aHJvd2luZyBpdCBpZiB0aGUgcmVzcG9uc2UgaGFzIG5vdCBiZWVuIGNvbW1pdHRlZCAodGhlIHJlc3BvbnNlCisgICAgICAgICAgICAgKiB3aWxsIGhhdmUgYmVlbiBjb21taXR0ZWQgaWYgdGhlIGVycm9yIHBhZ2UgaXMgYSBKU1AgcGFnZSkuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHJlcXVlc3Quc2V0QXR0cmlidXRlKCJqYXZheC5zZXJ2bGV0LmpzcC5qc3BFeGNlcHRpb24iLCB0KTsKKyAgICAgICAgICAgIHJlcXVlc3Quc2V0QXR0cmlidXRlKCJqYXZheC5zZXJ2bGV0LmVycm9yLnN0YXR1c19jb2RlIiwKKyAgICAgICAgICAgICAgICBuZXcgSW50ZWdlcihIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUikpOworICAgICAgICAgICAgcmVxdWVzdC5zZXRBdHRyaWJ1dGUoImphdmF4LnNlcnZsZXQuZXJyb3IucmVxdWVzdF91cmkiLAorICAgICAgICAgICAgKChIdHRwU2VydmxldFJlcXVlc3QpIHJlcXVlc3QpLmdldFJlcXVlc3RVUkkoKSk7CisgICAgICAgICAgICByZXF1ZXN0LnNldEF0dHJpYnV0ZSgiamF2YXguc2VydmxldC5lcnJvci5zZXJ2bGV0X25hbWUiLAorICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmdldFNlcnZsZXROYW1lKCkpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGZvcndhcmQoZXJyb3JQYWdlVVJMKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaXNlKSB7CisgICAgICAgICAgICAgICAgICAgIGluY2x1ZGUoZXJyb3JQYWdlVVJMKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBUaGUgZXJyb3IgcGFnZSBjb3VsZCBiZSBpbnNpZGUgYW4gaW5jbHVkZS4KKworICAgICAgICAgICAgICAgIE9iamVjdCBuZXdFeGNlcHRpb24gPSByZXF1ZXN0LmdldEF0dHJpYnV0ZSgiamF2YXguc2VydmxldC5lcnJvci5leGNlcHRpb24iKTsKKworICAgICAgICAgICAgICAgIC8vIHQ9PW51bGwgbWVhbnMgdGhlIGF0dHJpYnV0ZSB3YXMgbm90IHNldC4KKyAgICAgICAgICAgICAgICBpZiggKG5ld0V4Y2VwdGlvbiE9IG51bGwpICYmIChuZXdFeGNlcHRpb249PXQpICkgeworICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LnJlbW92ZUF0dHJpYnV0ZSgiamF2YXguc2VydmxldC5lcnJvci5leGNlcHRpb24iKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBub3cgY2xlYXIgdGhlIGVycm9yIGNvZGUgLSB0byBwcmV2ZW50IGRvdWJsZSBoYW5kbGluZy4KKyAgICAgICAgICAgICAgICByZXF1ZXN0LnJlbW92ZUF0dHJpYnV0ZSgiamF2YXguc2VydmxldC5lcnJvci5zdGF0dXNfY29kZSIpOworICAgICAgICAgICAgICAgIHJlcXVlc3QucmVtb3ZlQXR0cmlidXRlKCJqYXZheC5zZXJ2bGV0LmVycm9yLnJlcXVlc3RfdXJpIik7CisgICAgICAgICAgICAgICAgcmVxdWVzdC5yZW1vdmVBdHRyaWJ1dGUoImphdmF4LnNlcnZsZXQuZXJyb3Iuc3RhdHVzX2NvZGUiKTsKKyAgICAgICAgICAgICAgICByZXF1ZXN0LnJlbW92ZUF0dHJpYnV0ZSgiamF2YXguc2VydmxldC5qc3AuanNwRXhjZXB0aW9uIik7CisKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIE90aGVyd2lzZSB0aHJvdyB0aGUgZXhjZXB0aW9uIHdyYXBwZWQgaW5zaWRlIGEgU2VydmxldEV4Y2VwdGlvbi4KKyAgICAgICAgICAgIC8vIFNldCB0aGUgZXhjZXB0aW9uIGFzIHRoZSByb290IGNhdXNlIGluIHRoZSBTZXJ2bGV0RXhjZXB0aW9uCisgICAgICAgICAgICAvLyB0byBnZXQgYSBzdGFjayB0cmFjZSBmb3IgdGhlIHJlYWwgcHJvYmxlbQorICAgICAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBJT0V4Y2VwdGlvbikgdGhyb3cgKElPRXhjZXB0aW9uKXQ7CisgICAgICAgICAgICBpZiAodCBpbnN0YW5jZW9mIFNlcnZsZXRFeGNlcHRpb24pIHRocm93IChTZXJ2bGV0RXhjZXB0aW9uKXQ7CisgICAgICAgICAgICBpZiAodCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHRocm93IChSdW50aW1lRXhjZXB0aW9uKXQ7CisKKyAgICAgICAgICAgIFRocm93YWJsZSByb290Q2F1c2UgPSBudWxsOworICAgICAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBKc3BFeGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICByb290Q2F1c2UgPSAoKEpzcEV4Y2VwdGlvbikgdCkuZ2V0Um9vdENhdXNlKCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHQgaW5zdGFuY2VvZiBFTEV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgIHJvb3RDYXVzZSA9ICgoRUxFeGNlcHRpb24pIHQpLmdldFJvb3RDYXVzZSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocm9vdENhdXNlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbih0LmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIjogIiArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuZ2V0TWVzc2FnZSgpLCByb290Q2F1c2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uKHQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVmFyaWFibGVSZXNvbHZlciBpbnRlcmZhY2UKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IHJlc29sdmVWYXJpYWJsZShTdHJpbmcgcE5hbWUpIHRocm93cyBFTEV4Y2VwdGlvbiB7CisJcmV0dXJuIHZhcmlhYmxlUmVzb2x2ZXIucmVzb2x2ZVZhcmlhYmxlKHBOYW1lKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgWG1sRXNjYXBlKFN0cmluZyBzKSB7CisgICAgICAgIGlmIChzID09IG51bGwpIHJldHVybiBudWxsOworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBzLmxlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgIGNoYXIgYyA9IHMuY2hhckF0KGkpOworICAgICAgICAgICAgaWYgKGMgPT0gJzwnKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCImbHQ7Iik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPT0gJz4nKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCImZ3Q7Iik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPT0gJ1wnJykgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiJiMwMzk7Iik7CS8vICZhcG9zOworICAgICAgICAgICAgfSBlbHNlIGlmIChjID09ICcmJykgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiJmFtcDsiKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAnIicpIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiYjMDM0OyIpOwkvLyAmcXVvdDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb3ByaWV0YXJ5IG1ldGhvZCB0byBldmFsdWF0ZSBFTCBleHByZXNzaW9ucy4KKyAgICAgKiBYWFggLSBUaGlzIG1ldGhvZCBzaG91bGQgZ28gYXdheSBvbmNlIHRoZSBFTCBpbnRlcnByZXRlciBtb3ZlcworICAgICAqIG91dCBvZiBKU1RMIGFuZCBpbnRvIGl0cyBvd24gcHJvamVjdC4gIEZvciBub3csIHRoaXMgaXMgbmVjZXNzYXJ5CisgICAgICogYmVjYXVzZSB0aGUgc3RhbmRhcmQgbWFjaGluZXJ5IGlzIHRvbyBzbG93LgorICAgICAqCisgICAgICogQHBhcmFtIGV4cHJlc3Npb24gVGhlIGV4cHJlc3Npb24gdG8gYmUgZXZhbHVhdGVkCisgICAgICogQHBhcmFtIGV4cGVjdGVkVHlwZSBUaGUgZXhwZWN0ZWQgcmVzdWx0aW5nIHR5cGUKKyAgICAgKiBAcGFyYW0gcGFnZUNvbnRleHQgVGhlIHBhZ2UgY29udGV4dAorICAgICAqIEBwYXJhbSBmdW5jdGlvbk1hcCBNYXBzIHByZWZpeCBhbmQgbmFtZSB0byBNZXRob2QKKyAgICAgKiBAcmV0dXJuIFRoZSByZXN1bHQgb2YgdGhlIGV2YWx1YXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBwcm9wcmlldGFyeUV2YWx1YXRlKGZpbmFsIFN0cmluZyBleHByZXNzaW9uLCAKKwkJCQkJICAgICBmaW5hbCBDbGFzcyBleHBlY3RlZFR5cGUsCisJCQkJCSAgICAgZmluYWwgUGFnZUNvbnRleHQgcGFnZUNvbnRleHQsCisJCQkJCSAgICAgZmluYWwgUHJvdGVjdGVkRnVuY3Rpb25NYXBwZXIgZnVuY3Rpb25NYXAsCisJCQkJCSAgICAgZmluYWwgYm9vbGVhbiBlc2NhcGUpCisJdGhyb3dzIEVMRXhjZXB0aW9uCisgICAgeworCU9iamVjdCByZXRWYWx1ZTsKKyAgICAgICAgaWYgKFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSAhPSBudWxsKXsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0VmFsdWUgPSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKKwkJCW5ldyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKCl7CisKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgRXhjZXB0aW9ueworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsRXhwckV2YWwuZXZhbHVhdGUoZXhwcmVzc2lvbiwKKwkJCQkJCSAgIGV4cGVjdGVkVHlwZSwKKwkJCQkJCSAgIHBhZ2VDb250ZXh0LmdldFZhcmlhYmxlUmVzb2x2ZXIoKSwKKwkJCQkJCSAgIGZ1bmN0aW9uTWFwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfSBjYXRjaCAoUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIEV4Y2VwdGlvbiByZWFsRXggPSBleC5nZXRFeGNlcHRpb24oKTsKKwkJaWYgKHJlYWxFeCBpbnN0YW5jZW9mIEVMRXhjZXB0aW9uKSB7CisJCSAgICB0aHJvdyAoRUxFeGNlcHRpb24pIHJlYWxFeDsKKwkJfSBlbHNlIHsKKwkJICAgIHRocm93IG5ldyBFTEV4Y2VwdGlvbihyZWFsRXgpOworCQl9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisJICAgIHJldFZhbHVlID0gZWxFeHByRXZhbC5ldmFsdWF0ZShleHByZXNzaW9uLAorCQkJCQkgICBleHBlY3RlZFR5cGUsCisJCQkJCSAgIHBhZ2VDb250ZXh0LmdldFZhcmlhYmxlUmVzb2x2ZXIoKSwKKwkJCQkJICAgZnVuY3Rpb25NYXApOworICAgICAgICB9CisJaWYgKGVzY2FwZSkgeworCSAgICByZXRWYWx1ZSA9IFhtbEVzY2FwZShyZXRWYWx1ZS50b1N0cmluZygpKTsKKwl9CisKKwlyZXR1cm4gcmV0VmFsdWU7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvcnVudGltZS9QZXJUaHJlYWRUYWdIYW5kbGVyUG9vbC5qYXZhIGIvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3J1bnRpbWUvUGVyVGhyZWFkVGFnSGFuZGxlclBvb2wuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGI3YTVjCi0tLSAvZGV2L251bGwKKysrIGIvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3J1bnRpbWUvUGVyVGhyZWFkVGFnSGFuZGxlclBvb2wuamF2YQpAQCAtMCwwICsxLDEzMyBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFzcGVyLnJ1bnRpbWU7CisKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbmZpZzsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC5Kc3BFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZzsKKworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLkNvbnN0YW50czsKKworLyoqCisgKiBUaHJlYWQtbG9jYWwgYmFzZWQgcG9vbCBvZiB0YWcgaGFuZGxlcnMgdGhhdCBjYW4gYmUgcmV1c2VkLgorICoKKyAqIEBhdXRob3IgSmFuIEx1ZWhlCisgKiBAYXV0aG9yIENvc3RpbiBNYW5vbGFjaGUKKyAqLworcHVibGljIGNsYXNzIFBlclRocmVhZFRhZ0hhbmRsZXJQb29sIGV4dGVuZHMgVGFnSGFuZGxlclBvb2wgeworCisgICAgcHJpdmF0ZSBpbnQgbWF4U2l6ZTsKKworICAgIC8vIEZvciBjbGVhbnVwCisgICAgcHJpdmF0ZSBWZWN0b3IgcGVyVGhyZWFkRGF0YVZlY3RvcjsKKworICAgIHByaXZhdGUgVGhyZWFkTG9jYWwgcGVyVGhyZWFkOworCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUGVyVGhyZWFkRGF0YSB7CisgICAgICAgIFRhZyBoYW5kbGVyc1tdOworICAgICAgICBpbnQgY3VycmVudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgdGFnIGhhbmRsZXIgcG9vbCB3aXRoIHRoZSBkZWZhdWx0IGNhcGFjaXR5LgorICAgICAqLworICAgIHB1YmxpYyBQZXJUaHJlYWRUYWdIYW5kbGVyUG9vbCgpIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgcGVyVGhyZWFkRGF0YVZlY3RvciA9IG5ldyBWZWN0b3IoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KFNlcnZsZXRDb25maWcgY29uZmlnKSB7CisgICAgICAgIG1heFNpemUgPSBDb25zdGFudHMuTUFYX1BPT0xfU0laRTsKKyAgICAgICAgU3RyaW5nIG1heFNpemVTID0gZ2V0T3B0aW9uKGNvbmZpZywgT1BUSU9OX01BWFNJWkUsIG51bGwpOworICAgICAgICBpZiAobWF4U2l6ZVMgIT0gbnVsbCkgeworICAgICAgICAgICAgbWF4U2l6ZSA9IEludGVnZXIucGFyc2VJbnQobWF4U2l6ZVMpOworICAgICAgICAgICAgaWYgKG1heFNpemUgPCAwKSB7CisgICAgICAgICAgICAgICAgbWF4U2l6ZSA9IENvbnN0YW50cy5NQVhfUE9PTF9TSVpFOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcGVyVGhyZWFkID0gbmV3IFRocmVhZExvY2FsKCkgeworICAgICAgICAgICAgcHJvdGVjdGVkIE9iamVjdCBpbml0aWFsVmFsdWUoKSB7CisgICAgICAgICAgICAgICAgUGVyVGhyZWFkRGF0YSBwdGQgPSBuZXcgUGVyVGhyZWFkRGF0YSgpOworICAgICAgICAgICAgICAgIHB0ZC5oYW5kbGVycyA9IG5ldyBUYWdbbWF4U2l6ZV07CisgICAgICAgICAgICAgICAgcHRkLmN1cnJlbnQgPSAtMTsKKyAgICAgICAgICAgICAgICBwZXJUaHJlYWREYXRhVmVjdG9yLmFkZEVsZW1lbnQocHRkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcHRkOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIG5leHQgYXZhaWxhYmxlIHRhZyBoYW5kbGVyIGZyb20gdGhpcyB0YWcgaGFuZGxlciBwb29sLAorICAgICAqIGluc3RhbnRpYXRpbmcgb25lIGlmIHRoaXMgdGFnIGhhbmRsZXIgcG9vbCBpcyBlbXB0eS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBoYW5kbGVyQ2xhc3MgVGFnIGhhbmRsZXIgY2xhc3MKKyAgICAgKgorICAgICAqIEByZXR1cm4gUmV1c2VkIG9yIG5ld2x5IGluc3RhbnRpYXRlZCB0YWcgaGFuZGxlcgorICAgICAqCisgICAgICogQHRocm93cyBKc3BFeGNlcHRpb24gaWYgYSB0YWcgaGFuZGxlciBjYW5ub3QgYmUgaW5zdGFudGlhdGVkCisgICAgICovCisgICAgcHVibGljIFRhZyBnZXQoQ2xhc3MgaGFuZGxlckNsYXNzKSB0aHJvd3MgSnNwRXhjZXB0aW9uIHsKKyAgICAgICAgUGVyVGhyZWFkRGF0YSBwdGQgPSAoUGVyVGhyZWFkRGF0YSlwZXJUaHJlYWQuZ2V0KCk7CisgICAgICAgIGlmKHB0ZC5jdXJyZW50ID49MCApIHsKKyAgICAgICAgICAgIHJldHVybiBwdGQuaGFuZGxlcnNbcHRkLmN1cnJlbnQtLV07CisgICAgICAgIH0gZWxzZSB7CisJICAgIHRyeSB7CisJCXJldHVybiAoVGFnKSBoYW5kbGVyQ2xhc3MubmV3SW5zdGFuY2UoKTsKKwkgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJdGhyb3cgbmV3IEpzcEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7CisJICAgIH0KKwl9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyB0aGUgZ2l2ZW4gdGFnIGhhbmRsZXIgdG8gdGhpcyB0YWcgaGFuZGxlciBwb29sLCB1bmxlc3MgdGhpcyB0YWcKKyAgICAgKiBoYW5kbGVyIHBvb2wgaGFzIGFscmVhZHkgcmVhY2hlZCBpdHMgY2FwYWNpdHksIGluIHdoaWNoIGNhc2UgdGhlIHRhZworICAgICAqIGhhbmRsZXIncyByZWxlYXNlKCkgbWV0aG9kIGlzIGNhbGxlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBoYW5kbGVyIFRhZyBoYW5kbGVyIHRvIGFkZCB0byB0aGlzIHRhZyBoYW5kbGVyIHBvb2wKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZXVzZShUYWcgaGFuZGxlcikgeworICAgICAgICBQZXJUaHJlYWREYXRhIHB0ZD0oUGVyVGhyZWFkRGF0YSlwZXJUaHJlYWQuZ2V0KCk7CisJaWYgKHB0ZC5jdXJyZW50IDwgKHB0ZC5oYW5kbGVycy5sZW5ndGggLSAxKSkgeworCSAgICBwdGQuaGFuZGxlcnNbKytwdGQuY3VycmVudF0gPSBoYW5kbGVyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaGFuZGxlci5yZWxlYXNlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxscyB0aGUgcmVsZWFzZSgpIG1ldGhvZCBvZiBhbGwgdGFnIGhhbmRsZXJzIGluIHRoaXMgdGFnIGhhbmRsZXIgcG9vbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWxlYXNlKCkgeyAgICAgICAgCisgICAgICAgIEVudW1lcmF0aW9uIGVudW1lcmF0aW9uID0gcGVyVGhyZWFkRGF0YVZlY3Rvci5lbGVtZW50cygpOworICAgICAgICB3aGlsZSAoZW51bWVyYXRpb24uaGFzTW9yZUVsZW1lbnRzKCkpIHsKKwkgICAgUGVyVGhyZWFkRGF0YSBwdGQgPSAoUGVyVGhyZWFkRGF0YSllbnVtZXJhdGlvbi5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgaWYgKHB0ZC5oYW5kbGVycyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaT1wdGQuY3VycmVudDsgaT49MDsgaS0tKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwdGQuaGFuZGxlcnNbaV0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHRkLmhhbmRsZXJzW2ldLnJlbGVhc2UoKTsKKwkJICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9ydW50aW1lL1Byb3RlY3RlZEZ1bmN0aW9uTWFwcGVyLmphdmEgYi9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvcnVudGltZS9Qcm90ZWN0ZWRGdW5jdGlvbk1hcHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwOTVjNjgKLS0tIC9kZXYvbnVsbAorKysgYi9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvcnVudGltZS9Qcm90ZWN0ZWRGdW5jdGlvbk1hcHBlci5qYXZhCkBAIC0wLDAgKzEsMTg2IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYXNwZXIucnVudGltZTsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AuZWwuRnVuY3Rpb25NYXBwZXI7CisKKy8qKgorICogTWFwcyBFTCBmdW5jdGlvbnMgdG8gdGhlaXIgSmF2YSBtZXRob2QgY291bnRlcnBhcnRzLiAgS2VlcHMgdGhlCisgKiBhY3R1YWwgTWV0aG9kIG9iamVjdHMgcHJvdGVjdGVkIHNvIHRoYXQgSlNQIHBhZ2VzIGNhbid0IGluZGlyZWN0bHkKKyAqIGRvIHJlZmxlY3Rpb24uCisgKgorICogQGF1dGhvciBNYXJrIFJvdGgKKyAqIEBhdXRob3IgS2luLW1hbiBDaHVuZworICovCitwdWJsaWMgZmluYWwgY2xhc3MgUHJvdGVjdGVkRnVuY3Rpb25NYXBwZXIgaW1wbGVtZW50cyBGdW5jdGlvbk1hcHBlciB7CisKKyAgICAvKiogCisgICAgICogTWFwcyAicHJlZml4Om5hbWUiIHRvIGphdmEubGFuZy5NZXRob2Qgb2JqZWN0cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIEhhc2hNYXAgZm5tYXAgPSBudWxsOworCisgICAgLyoqCisgICAgICogSWYgdGhlcmUgaXMgb25seSBvbmUgZnVuY3Rpb24gaW4gdGhlIG1hcCwgdGhpcyBpcyB0aGUgTWV0aG9kIGZvciBpdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1ldGhvZCB0aGVNZXRob2QgPSBudWxsOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgaGFzIHByb3RlY3RlZCBhY2Nlc3MuCisgICAgICovCisgICAgcHJpdmF0ZSBQcm90ZWN0ZWRGdW5jdGlvbk1hcHBlcigpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZWQgU2VydmxldCBhbmQgVGFnIEhhbmRsZXIgaW1wbGVtZW50YXRpb25zIGNhbGwgdGhpcworICAgICAqIG1ldGhvZCB0byByZXRyaWV2ZSBhbiBpbnN0YW5jZSBvZiB0aGUgUHJvdGVjdGVkRnVuY3Rpb25NYXBwZXIuCisgICAgICogVGhpcyBpcyBuZWNlc3Nhcnkgc2luY2UgZ2VuZXJhdGVkIGNvZGUgZG9lcyBub3QgaGF2ZSBhY2Nlc3MgdG8KKyAgICAgKiBjcmVhdGUgaW5zdGFuY2VzIG9mIGNsYXNzZXMgaW4gdGhpcyBwYWNrYWdlLgorICAgICAqCisgICAgICogQHJldHVybiBBIG5ldyBwcm90ZWN0ZWQgZnVuY3Rpb24gbWFwcGVyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgUHJvdGVjdGVkRnVuY3Rpb25NYXBwZXIgZ2V0SW5zdGFuY2UoKSB7CisgICAgICAgIFByb3RlY3RlZEZ1bmN0aW9uTWFwcGVyIGZ1bmNNYXBwZXI7CisJaWYgKFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSAhPSBudWxsKSB7CisJICAgIGZ1bmNNYXBwZXIgPSAoUHJvdGVjdGVkRnVuY3Rpb25NYXBwZXIpQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCisJCW5ldyBQcml2aWxlZ2VkQWN0aW9uKCkgeworCQlwdWJsaWMgT2JqZWN0IHJ1bigpIHsKKwkJICAgIHJldHVybiBuZXcgUHJvdGVjdGVkRnVuY3Rpb25NYXBwZXIoKTsKKwkJfQorCSAgICB9ICk7CisJfSBlbHNlIHsKKwkgICAgZnVuY01hcHBlciA9IG5ldyBQcm90ZWN0ZWRGdW5jdGlvbk1hcHBlcigpOworCX0KKwlmdW5jTWFwcGVyLmZubWFwID0gbmV3IGphdmEudXRpbC5IYXNoTWFwKCk7CisJcmV0dXJuIGZ1bmNNYXBwZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RvcmVzIGEgbWFwcGluZyBmcm9tIHRoZSBnaXZlbiBFTCBmdW5jdGlvbiBwcmVmaXggYW5kIG5hbWUgdG8gCisgICAgICogdGhlIGdpdmVuIEphdmEgbWV0aG9kLgorICAgICAqCisgICAgICogQHBhcmFtIGZuUU5hbWUgVGhlIEVMIGZ1bmN0aW9uIHF1YWxpZmllZCBuYW1lIChpbmNsdWRpbmcgcHJlZml4KQorICAgICAqIEBwYXJhbSBjIFRoZSBjbGFzcyBjb250YWluaW5nIHRoZSBKYXZhIG1ldGhvZAorICAgICAqIEBwYXJhbSBtZXRob2ROYW1lIFRoZSBuYW1lIG9mIHRoZSBKYXZhIG1ldGhvZAorICAgICAqIEBwYXJhbSBhcmdzIFRoZSBhcmd1bWVudHMgb2YgdGhlIEphdmEgbWV0aG9kCisgICAgICogQHRocm93cyBSdW50aW1lRXhjZXB0aW9uIGlmIG5vIG1ldGhvZCB3aXRoIHRoZSBnaXZlbiBzaWduYXR1cmUKKyAgICAgKiAgICAgY291bGQgYmUgZm91bmQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgbWFwRnVuY3Rpb24oU3RyaW5nIGZuUU5hbWUsIGZpbmFsIENsYXNzIGMsCisJCQkgICAgZmluYWwgU3RyaW5nIG1ldGhvZE5hbWUsIGZpbmFsIENsYXNzW10gYXJncyApIAorICAgIHsKKwlqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgbWV0aG9kOworICAgICAgICBpZiAoU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpICE9IG51bGwpeworICAgICAgICAgICAgdHJ5eworICAgICAgICAgICAgICAgIG1ldGhvZCA9IChqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QpQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oKXsKKworICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHRocm93cyBFeGNlcHRpb257CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYy5nZXREZWNsYXJlZE1ldGhvZChtZXRob2ROYW1lLCBhcmdzKTsKKyAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB9KTsgICAgICAKKyAgICAgICAgICAgIH0gY2F0Y2ggKFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24gZXgpeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBmdW5jdGlvbiBtYXBwaW5nIC0gbm8gc3VjaCBtZXRob2Q6ICIKKwkJICAgICsgZXguZ2V0RXhjZXB0aW9uKCkuZ2V0TWVzc2FnZSgpKTsgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1ldGhvZCA9IGMuZ2V0RGVjbGFyZWRNZXRob2QobWV0aG9kTmFtZSwgYXJncyk7CisgICAgICAgICAgICB9IGNhdGNoKCBOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSApIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgZnVuY3Rpb24gbWFwcGluZyAtIG5vIHN1Y2ggbWV0aG9kOiAiCisJCSAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisJdGhpcy5mbm1hcC5wdXQoZm5RTmFtZSwgbWV0aG9kICk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBmb3IgdGhpcyBjbGFzcywgYW5kIHN0b3JlcyB0aGUgTWV0aG9kIGZvcgorICAgICAqIHRoZSBnaXZlbiBFTCBmdW5jdGlvbiBwcmVmaXggYW5kIG5hbWUuIFRoaXMgbWV0aG9kIGlzIHVzZWQgZm9yCisgICAgICogdGhlIGNhc2Ugd2hlbiB0aGVyZSBpcyBvbmx5IG9uZSBmdW5jdGlvbiBpbiB0aGUgRUwgZXhwcmVzc2lvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmblFOYW1lIFRoZSBFTCBmdW5jdGlvbiBxdWFsaWZpZWQgbmFtZSAoaW5jbHVkaW5nIHByZWZpeCkKKyAgICAgKiBAcGFyYW0gYyBUaGUgY2xhc3MgY29udGFpbmluZyB0aGUgSmF2YSBtZXRob2QKKyAgICAgKiBAcGFyYW0gbWV0aG9kTmFtZSBUaGUgbmFtZSBvZiB0aGUgSmF2YSBtZXRob2QKKyAgICAgKiBAcGFyYW0gYXJncyBUaGUgYXJndW1lbnRzIG9mIHRoZSBKYXZhIG1ldGhvZAorICAgICAqIEB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiBpZiBubyBtZXRob2Qgd2l0aCB0aGUgZ2l2ZW4gc2lnbmF0dXJlCisgICAgICogICAgIGNvdWxkIGJlIGZvdW5kLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgUHJvdGVjdGVkRnVuY3Rpb25NYXBwZXIgZ2V0TWFwRm9yRnVuY3Rpb24oCisJCVN0cmluZyBmblFOYW1lLCBmaW5hbCBDbGFzcyBjLAorICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtZXRob2ROYW1lLCBmaW5hbCBDbGFzc1tdIGFyZ3MgKQorICAgIHsKKyAgICAgICAgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIG1ldGhvZDsKKyAgICAgICAgUHJvdGVjdGVkRnVuY3Rpb25NYXBwZXIgZnVuY01hcHBlcjsKKyAgICAgICAgaWYgKFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSAhPSBudWxsKXsKKyAgICAgICAgICAgIGZ1bmNNYXBwZXIgPSAoUHJvdGVjdGVkRnVuY3Rpb25NYXBwZXIpQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCisgICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRBY3Rpb24oKXsKKyAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm90ZWN0ZWRGdW5jdGlvbk1hcHBlcigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICB0cnl7CisgICAgICAgICAgICAgICAgbWV0aG9kID0gKGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZClBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZAorKG5ldyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKCl7CisKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgRXhjZXB0aW9ueworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGMuZ2V0RGVjbGFyZWRNZXRob2QobWV0aG9kTmFtZSwgYXJncyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24gZXgpeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBmdW5jdGlvbiBtYXBwaW5nIC0gbm8gc3VjaCBtZXRob2Q6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBleC5nZXRFeGNlcHRpb24oKS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworCSAgICBmdW5jTWFwcGVyID0gbmV3IFByb3RlY3RlZEZ1bmN0aW9uTWFwcGVyKCk7CisgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtZXRob2QgPSBjLmdldERlY2xhcmVkTWV0aG9kKG1ldGhvZE5hbWUsIGFyZ3MpOworICAgICAgICAgICAgfSBjYXRjaCggTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUgKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGZ1bmN0aW9uIG1hcHBpbmcgLSBubyBzdWNoIG1ldGhvZDogIgorICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmdW5jTWFwcGVyLnRoZU1ldGhvZCA9IG1ldGhvZDsKKwlyZXR1cm4gZnVuY01hcHBlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXNvbHZlcyB0aGUgc3BlY2lmaWVkIGxvY2FsIG5hbWUgYW5kIHByZWZpeCBpbnRvIGEgSmF2YS5sYW5nLk1ldGhvZC4KKyAgICAgKiBSZXR1cm5zIG51bGwgaWYgdGhlIHByZWZpeCBhbmQgbG9jYWwgbmFtZSBhcmUgbm90IGZvdW5kLgorICAgICAqIAorICAgICAqIEBwYXJhbSBwcmVmaXggdGhlIHByZWZpeCBvZiB0aGUgZnVuY3Rpb24KKyAgICAgKiBAcGFyYW0gbG9jYWxOYW1lIHRoZSBzaG9ydCBuYW1lIG9mIHRoZSBmdW5jdGlvbgorICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgbWV0aG9kIG1hcHBpbmcuICBOdWxsIG1lYW5zIG5vIGVudHJ5IGZvdW5kLgorICAgICAqKi8KKyAgICBwdWJsaWMgTWV0aG9kIHJlc29sdmVGdW5jdGlvbihTdHJpbmcgcHJlZml4LCBTdHJpbmcgbG9jYWxOYW1lKSB7CisgICAgICAgIGlmICh0aGlzLmZubWFwICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiAoTWV0aG9kKSB0aGlzLmZubWFwLmdldChwcmVmaXggKyAiOiIgKyBsb2NhbE5hbWUpOworICAgICAgICB9CisJcmV0dXJuIHRoZU1ldGhvZDsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9ydW50aW1lL1NlcnZsZXRSZXNwb25zZVdyYXBwZXJJbmNsdWRlLmphdmEgYi9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvcnVudGltZS9TZXJ2bGV0UmVzcG9uc2VXcmFwcGVySW5jbHVkZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1YWQzY2UKLS0tIC9kZXYvbnVsbAorKysgYi9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvcnVudGltZS9TZXJ2bGV0UmVzcG9uc2VXcmFwcGVySW5jbHVkZS5qYXZhCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphc3Blci5ydW50aW1lOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworCitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldFJlc3BvbnNlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlV3JhcHBlcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC5Kc3BXcml0ZXI7CisKKy8qKgorICogU2VydmxldFJlc3BvbnNlV3JhcHBlciB1c2VkIGJ5IHRoZSBKU1AgJ2luY2x1ZGUnIGFjdGlvbi4KKyAqCisgKiBUaGlzIHdyYXBwZXIgcmVzcG9uc2Ugb2JqZWN0IGlzIHBhc3NlZCB0byBSZXF1ZXN0RGlzcGF0Y2hlci5pbmNsdWRlKCksIHNvCisgKiB0aGF0IHRoZSBvdXRwdXQgb2YgdGhlIGluY2x1ZGVkIHJlc291cmNlIGlzIGFwcGVuZGVkIHRvIHRoYXQgb2YgdGhlCisgKiBpbmNsdWRpbmcgcGFnZS4KKyAqCisgKiBAYXV0aG9yIFBpZXJyZSBEZWxpc2xlCisgKi8KKworcHVibGljIGNsYXNzIFNlcnZsZXRSZXNwb25zZVdyYXBwZXJJbmNsdWRlIGV4dGVuZHMgSHR0cFNlcnZsZXRSZXNwb25zZVdyYXBwZXIgeworCisgICAgLyoqCisgICAgICogUHJpbnRXcml0ZXIgd2hpY2ggYXBwZW5kcyB0byB0aGUgSnNwV3JpdGVyIG9mIHRoZSBpbmNsdWRpbmcgcGFnZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFByaW50V3JpdGVyIHByaW50V3JpdGVyOworCisgICAgcHJpdmF0ZSBKc3BXcml0ZXIganNwV3JpdGVyOworCisgICAgcHVibGljIFNlcnZsZXRSZXNwb25zZVdyYXBwZXJJbmNsdWRlKFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSwgCisJCQkJCSBKc3BXcml0ZXIganNwV3JpdGVyKSB7CisJc3VwZXIoKEh0dHBTZXJ2bGV0UmVzcG9uc2UpcmVzcG9uc2UpOworCXRoaXMucHJpbnRXcml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIoanNwV3JpdGVyKTsKKwl0aGlzLmpzcFdyaXRlciA9IGpzcFdyaXRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgd3JhcHBlciBhcm91bmQgdGhlIEpzcFdyaXRlciBvZiB0aGUgaW5jbHVkaW5nIHBhZ2UuCisgICAgICovCisgICAgcHVibGljIFByaW50V3JpdGVyIGdldFdyaXRlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcmV0dXJuIHByaW50V3JpdGVyOworICAgIH0KKworICAgIHB1YmxpYyBTZXJ2bGV0T3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsZWFycyB0aGUgb3V0cHV0IGJ1ZmZlciBvZiB0aGUgSnNwV3JpdGVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW5jbHVkaW5nCisgICAgICogcGFnZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZXNldEJ1ZmZlcigpIHsKKwl0cnkgeworCSAgICBqc3BXcml0ZXIuY2xlYXJCdWZmZXIoKTsKKwl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKwl9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3J1bnRpbWUvVGFnSGFuZGxlclBvb2wuamF2YSBiL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9ydW50aW1lL1RhZ0hhbmRsZXJQb29sLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJhOWUzMAotLS0gL2Rldi9udWxsCisrKyBiL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9ydW50aW1lL1RhZ0hhbmRsZXJQb29sLmphdmEKQEAgLTAsMCArMSwxNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphc3Blci5ydW50aW1lOworCitpbXBvcnQgamF2YXguc2VydmxldC5qc3AuSnNwRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWc7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29uZmlnOworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLkNvbnN0YW50czsKKworLyoqCisgKiBQb29sIG9mIHRhZyBoYW5kbGVycyB0aGF0IGNhbiBiZSByZXVzZWQuCisgKgorICogQGF1dGhvciBKYW4gTHVlaGUKKyAqLworcHVibGljIGNsYXNzIFRhZ0hhbmRsZXJQb29sIHsKKworICAgIHByaXZhdGUgVGFnW10gaGFuZGxlcnM7CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBPUFRJT05fVEFHUE9PTD0idGFncG9vbENsYXNzTmFtZSI7CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgT1BUSU9OX01BWFNJWkU9InRhZ3Bvb2xNYXhTaXplIjsKKworICAgIC8vIGluZGV4IG9mIG5leHQgYXZhaWxhYmxlIHRhZyBoYW5kbGVyCisgICAgcHJpdmF0ZSBpbnQgY3VycmVudDsKKworICAgIHB1YmxpYyBzdGF0aWMgVGFnSGFuZGxlclBvb2wgZ2V0VGFnSGFuZGxlclBvb2woIFNlcnZsZXRDb25maWcgY29uZmlnKSB7CisgICAgICAgIFRhZ0hhbmRsZXJQb29sIHJlc3VsdD1udWxsOworCisgICAgICAgIFN0cmluZyB0cENsYXNzTmFtZT1nZXRPcHRpb24oIGNvbmZpZywgT1BUSU9OX1RBR1BPT0wsIG51bGwpOworICAgICAgICBpZiggdHBDbGFzc05hbWUgIT0gbnVsbCApIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgQ2xhc3MgYz1DbGFzcy5mb3JOYW1lKCB0cENsYXNzTmFtZSApOworICAgICAgICAgICAgICAgIHJlc3VsdD0oVGFnSGFuZGxlclBvb2wpYy5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgIHJlc3VsdD1udWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmKCByZXN1bHQ9PW51bGwgKSByZXN1bHQ9bmV3IFRhZ0hhbmRsZXJQb29sKCk7CisgICAgICAgIHJlc3VsdC5pbml0KGNvbmZpZyk7CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KCBTZXJ2bGV0Q29uZmlnIGNvbmZpZyApIHsKKyAgICAgICAgaW50IG1heFNpemU9LTE7CisgICAgICAgIFN0cmluZyBtYXhTaXplUz1nZXRPcHRpb24oY29uZmlnLCBPUFRJT05fTUFYU0laRSwgbnVsbCk7CisgICAgICAgIGlmKCBtYXhTaXplUyAhPSBudWxsICkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtYXhTaXplPUludGVnZXIucGFyc2VJbnQobWF4U2l6ZVMpOworICAgICAgICAgICAgfSBjYXRjaCggRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgbWF4U2l6ZT0tMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiggbWF4U2l6ZSA8MCAgKSB7CisgICAgICAgICAgICBtYXhTaXplPUNvbnN0YW50cy5NQVhfUE9PTF9TSVpFOworICAgICAgICB9CisgICAgICAgIHRoaXMuaGFuZGxlcnMgPSBuZXcgVGFnW21heFNpemVdOworICAgICAgICB0aGlzLmN1cnJlbnQgPSAtMTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgdGFnIGhhbmRsZXIgcG9vbCB3aXRoIHRoZSBkZWZhdWx0IGNhcGFjaXR5LgorICAgICAqLworICAgIHB1YmxpYyBUYWdIYW5kbGVyUG9vbCgpIHsKKwkvLyBOb3RoaW5nIC0gamFzcGVyIGdlbmVyYXRlZCBzZXJ2bGV0cyBjYWxsIHRoZSBvdGhlciBjb25zdHJ1Y3RvciwKKyAgICAgICAgLy8gdGhpcyBzaG91bGQgYmUgdXNlZCBpbiBmdXR1cmUgKyBpbml0IC4KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgdGFnIGhhbmRsZXIgcG9vbCB3aXRoIHRoZSBnaXZlbiBjYXBhY2l0eS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjYXBhY2l0eSBUYWcgaGFuZGxlciBwb29sIGNhcGFjaXR5CisgICAgICogQGRlcHJlY2F0ZWQgVXNlIHN0YXRpYyBnZXRUYWdIYW5kbGVyUG9vbAorICAgICAqLworICAgIHB1YmxpYyBUYWdIYW5kbGVyUG9vbChpbnQgY2FwYWNpdHkpIHsKKwl0aGlzLmhhbmRsZXJzID0gbmV3IFRhZ1tjYXBhY2l0eV07CisJdGhpcy5jdXJyZW50ID0gLTE7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbmV4dCBhdmFpbGFibGUgdGFnIGhhbmRsZXIgZnJvbSB0aGlzIHRhZyBoYW5kbGVyIHBvb2wsCisgICAgICogaW5zdGFudGlhdGluZyBvbmUgaWYgdGhpcyB0YWcgaGFuZGxlciBwb29sIGlzIGVtcHR5LgorICAgICAqCisgICAgICogQHBhcmFtIGhhbmRsZXJDbGFzcyBUYWcgaGFuZGxlciBjbGFzcworICAgICAqCisgICAgICogQHJldHVybiBSZXVzZWQgb3IgbmV3bHkgaW5zdGFudGlhdGVkIHRhZyBoYW5kbGVyCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEpzcEV4Y2VwdGlvbiBpZiBhIHRhZyBoYW5kbGVyIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgVGFnIGdldChDbGFzcyBoYW5kbGVyQ2xhc3MpIHRocm93cyBKc3BFeGNlcHRpb24geworCVRhZyBoYW5kbGVyID0gbnVsbDsKKyAgICAgICAgc3luY2hyb25pemVkKCB0aGlzICkgeworICAgICAgICAgICAgaWYgKGN1cnJlbnQgPj0gMCkgeworICAgICAgICAgICAgICAgIGhhbmRsZXIgPSBoYW5kbGVyc1tjdXJyZW50LS1dOworICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGVyOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gT3V0IG9mIHN5bmMgYmxvY2sgLSB0aGVyZSBpcyBubyBuZWVkIGZvciBvdGhlciB0aHJlYWRzIHRvCisgICAgICAgIC8vIHdhaXQgZm9yIHVzIHRvIGNvbnN0cnVjdCBhIHRhZyBmb3IgdGhpcyB0aHJlYWQuCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gKFRhZykgaGFuZGxlckNsYXNzLm5ld0luc3RhbmNlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSnNwRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgdGhlIGdpdmVuIHRhZyBoYW5kbGVyIHRvIHRoaXMgdGFnIGhhbmRsZXIgcG9vbCwgdW5sZXNzIHRoaXMgdGFnCisgICAgICogaGFuZGxlciBwb29sIGhhcyBhbHJlYWR5IHJlYWNoZWQgaXRzIGNhcGFjaXR5LCBpbiB3aGljaCBjYXNlIHRoZSB0YWcKKyAgICAgKiBoYW5kbGVyJ3MgcmVsZWFzZSgpIG1ldGhvZCBpcyBjYWxsZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaGFuZGxlciBUYWcgaGFuZGxlciB0byBhZGQgdG8gdGhpcyB0YWcgaGFuZGxlciBwb29sCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmV1c2UoVGFnIGhhbmRsZXIpIHsKKyAgICAgICAgc3luY2hyb25pemVkKCB0aGlzICkgeworICAgICAgICAgICAgaWYgKGN1cnJlbnQgPCAoaGFuZGxlcnMubGVuZ3RoIC0gMSkpIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVyc1srK2N1cnJlbnRdID0gaGFuZGxlcjsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCBmb3Igb3RoZXIgdGhyZWFkcyB0byB3YWl0IGZvciB1cyB0byByZWxlYXNlCisgICAgICAgIGhhbmRsZXIucmVsZWFzZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxzIHRoZSByZWxlYXNlKCkgbWV0aG9kIG9mIGFsbCBhdmFpbGFibGUgdGFnIGhhbmRsZXJzIGluIHRoaXMgdGFnCisgICAgICogaGFuZGxlciBwb29sLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZWxlYXNlKCkgeworCWZvciAoaW50IGk9Y3VycmVudDsgaT49MDsgaS0tKSB7CisJICAgIGhhbmRsZXJzW2ldLnJlbGVhc2UoKTsKKwl9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0T3B0aW9uKCBTZXJ2bGV0Q29uZmlnIGNvbmZpZywgU3RyaW5nIG5hbWUsIFN0cmluZyBkZWZhdWx0VikgeworICAgICAgICBpZiggY29uZmlnID09IG51bGwgKSByZXR1cm4gZGVmYXVsdFY7CisKKyAgICAgICAgU3RyaW5nIHZhbHVlPWNvbmZpZy5nZXRJbml0UGFyYW1ldGVyKG5hbWUpOworICAgICAgICBpZiggdmFsdWUgIT0gbnVsbCApIHJldHVybiB2YWx1ZTsKKyAgICAgICAgaWYoIGNvbmZpZy5nZXRTZXJ2bGV0Q29udGV4dCgpID09bnVsbCApCisgICAgICAgICAgICByZXR1cm4gZGVmYXVsdFY7CisgICAgICAgIHZhbHVlPWNvbmZpZy5nZXRTZXJ2bGV0Q29udGV4dCgpLmdldEluaXRQYXJhbWV0ZXIobmFtZSk7CisgICAgICAgIGlmKCB2YWx1ZSE9bnVsbCApIHJldHVybiB2YWx1ZTsKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRWOworICAgIH0KKworfQorCmRpZmYgLS1naXQgYS9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvc2VjdXJpdHkvU2VjdXJpdHlDbGFzc0xvYWQuamF2YSBiL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9zZWN1cml0eS9TZWN1cml0eUNsYXNzTG9hZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiNDhkZjUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvc2VjdXJpdHkvU2VjdXJpdHlDbGFzc0xvYWQuamF2YQpAQCAtMCwwICsxLDExMCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYXNwZXIuc2VjdXJpdHk7CisKKy8qKgorICogU3RhdGljIGNsYXNzIHVzZWQgdG8gcHJlbG9hZCBqYXZhIGNsYXNzZXMgd2hlbiB1c2luZyB0aGUKKyAqIEphdmEgU2VjdXJpdHlNYW5hZ2VyIHNvIHRoYXQgdGhlIGRlZmluZUNsYXNzSW5QYWNrYWdlCisgKiBSdW50aW1lUGVybWlzc2lvbiBkb2VzIG5vdCB0cmlnZ2VyIGFuIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24uCisgKgorICogQGF1dGhvciBKZWFuLUZyYW5jb2lzIEFyY2FuZAorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBTZWN1cml0eUNsYXNzTG9hZCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2cgbG9nPQorICAgICAgICBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5LmdldExvZyggU2VjdXJpdHlDbGFzc0xvYWQuY2xhc3MgKTsKKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZWN1cml0eUNsYXNzTG9hZChDbGFzc0xvYWRlciBsb2FkZXIpeworCisgICAgICAgIGlmKCBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCkgPT0gbnVsbCApeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIGJhc2VQYWNrYWdlID0gIm9yZy5hcGFjaGUuamFzcGVyLiI7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBsb2FkZXIubG9hZENsYXNzKCBiYXNlUGFja2FnZSArCisgICAgICAgICAgICAgICAgInJ1bnRpbWUuSnNwRmFjdG9yeUltcGwkUHJpdmlsZWdlZEdldFBhZ2VDb250ZXh0Iik7CisgICAgICAgICAgICBsb2FkZXIubG9hZENsYXNzKCBiYXNlUGFja2FnZSArCisgICAgICAgICAgICAgICAgInJ1bnRpbWUuSnNwRmFjdG9yeUltcGwkUHJpdmlsZWdlZFJlbGVhc2VQYWdlQ29udGV4dCIpOworCisgICAgICAgICAgICBsb2FkZXIubG9hZENsYXNzKCBiYXNlUGFja2FnZSArCisgICAgICAgICAgICAgICAgInJ1bnRpbWUuSnNwUnVudGltZUxpYnJhcnkiKTsKKyAgICAgICAgICAgIGxvYWRlci5sb2FkQ2xhc3MoIGJhc2VQYWNrYWdlICsKKyAgICAgICAgICAgICAgICAicnVudGltZS5Kc3BSdW50aW1lTGlicmFyeSRQcml2aWxlZ2VkSW50cm9zcGVjdEhlbHBlciIpOworICAgICAgICAgICAgCisgICAgICAgICAgICBsb2FkZXIubG9hZENsYXNzKCBiYXNlUGFja2FnZSArCisgICAgICAgICAgICAgICAgInJ1bnRpbWUuU2VydmxldFJlc3BvbnNlV3JhcHBlckluY2x1ZGUiKTsKKyAgICAgICAgICAgIGxvYWRlci5sb2FkQ2xhc3MoIGJhc2VQYWNrYWdlICsKKyAgICAgICAgICAgICAgICAicnVudGltZS5UYWdIYW5kbGVyUG9vbCIpOworICAgICAgICAgICAgbG9hZGVyLmxvYWRDbGFzcyggYmFzZVBhY2thZ2UgKworICAgICAgICAgICAgICAgICJydW50aW1lLkpzcEZyYWdtZW50SGVscGVyIik7CisKKyAgICAgICAgICAgIGxvYWRlci5sb2FkQ2xhc3MoIGJhc2VQYWNrYWdlICsKKyAgICAgICAgICAgICAgICAicnVudGltZS5Qcm90ZWN0ZWRGdW5jdGlvbk1hcHBlciIpOworICAgICAgICAgICAgbG9hZGVyLmxvYWRDbGFzcyggYmFzZVBhY2thZ2UgKworICAgICAgICAgICAgICAgICJydW50aW1lLlByb3RlY3RlZEZ1bmN0aW9uTWFwcGVyJDEiKTsKKyAgICAgICAgICAgIGxvYWRlci5sb2FkQ2xhc3MoIGJhc2VQYWNrYWdlICsKKyAgICAgICAgICAgICAgICAicnVudGltZS5Qcm90ZWN0ZWRGdW5jdGlvbk1hcHBlciQyIik7IAorICAgICAgICAgICAgbG9hZGVyLmxvYWRDbGFzcyggYmFzZVBhY2thZ2UgKworICAgICAgICAgICAgICAgICJydW50aW1lLlByb3RlY3RlZEZ1bmN0aW9uTWFwcGVyJDMiKTsKKyAgICAgICAgICAgIGxvYWRlci5sb2FkQ2xhc3MoIGJhc2VQYWNrYWdlICsKKyAgICAgICAgICAgICAgICAicnVudGltZS5Qcm90ZWN0ZWRGdW5jdGlvbk1hcHBlciQ0Iik7IAorCisgICAgICAgICAgICBsb2FkZXIubG9hZENsYXNzKCBiYXNlUGFja2FnZSArCisgICAgICAgICAgICAgICAgInJ1bnRpbWUuUGFnZUNvbnRleHRJbXBsIik7ICAgICAgCisgICAgICAgICAgICBsb2FkZXIubG9hZENsYXNzKCBiYXNlUGFja2FnZSArCisgICAgICAgICAgICAgICAgInJ1bnRpbWUuUGFnZUNvbnRleHRJbXBsJDEiKTsgICAgICAKKyAgICAgICAgICAgIGxvYWRlci5sb2FkQ2xhc3MoIGJhc2VQYWNrYWdlICsKKyAgICAgICAgICAgICAgICAicnVudGltZS5QYWdlQ29udGV4dEltcGwkMiIpOyAgICAgIAorICAgICAgICAgICAgbG9hZGVyLmxvYWRDbGFzcyggYmFzZVBhY2thZ2UgKworICAgICAgICAgICAgICAgICJydW50aW1lLlBhZ2VDb250ZXh0SW1wbCQzIik7ICAgICAgCisgICAgICAgICAgICBsb2FkZXIubG9hZENsYXNzKCBiYXNlUGFja2FnZSArCisgICAgICAgICAgICAgICAgInJ1bnRpbWUuUGFnZUNvbnRleHRJbXBsJDQiKTsgICAgICAKKyAgICAgICAgICAgIGxvYWRlci5sb2FkQ2xhc3MoIGJhc2VQYWNrYWdlICsKKyAgICAgICAgICAgICAgICAicnVudGltZS5QYWdlQ29udGV4dEltcGwkNSIpOyAgICAgIAorICAgICAgICAgICAgbG9hZGVyLmxvYWRDbGFzcyggYmFzZVBhY2thZ2UgKworICAgICAgICAgICAgICAgICJydW50aW1lLlBhZ2VDb250ZXh0SW1wbCQ2Iik7ICAgICAgCisgICAgICAgICAgICBsb2FkZXIubG9hZENsYXNzKCBiYXNlUGFja2FnZSArCisgICAgICAgICAgICAgICAgInJ1bnRpbWUuUGFnZUNvbnRleHRJbXBsJDciKTsgICAgICAKKyAgICAgICAgICAgIGxvYWRlci5sb2FkQ2xhc3MoIGJhc2VQYWNrYWdlICsKKyAgICAgICAgICAgICAgICAicnVudGltZS5QYWdlQ29udGV4dEltcGwkOCIpOyAgICAgIAorICAgICAgICAgICAgbG9hZGVyLmxvYWRDbGFzcyggYmFzZVBhY2thZ2UgKworICAgICAgICAgICAgICAgICJydW50aW1lLlBhZ2VDb250ZXh0SW1wbCQ5Iik7ICAgICAgCisgICAgICAgICAgICBsb2FkZXIubG9hZENsYXNzKCBiYXNlUGFja2FnZSArCisgICAgICAgICAgICAgICAgInJ1bnRpbWUuUGFnZUNvbnRleHRJbXBsJDEwIik7ICAgICAgCisgICAgICAgICAgICBsb2FkZXIubG9hZENsYXNzKCBiYXNlUGFja2FnZSArCisgICAgICAgICAgICAgICAgInJ1bnRpbWUuUGFnZUNvbnRleHRJbXBsJDExIik7ICAgICAgCisgICAgICAgICAgICBsb2FkZXIubG9hZENsYXNzKCBiYXNlUGFja2FnZSArCisgICAgICAgICAgICAgICAgInJ1bnRpbWUuUGFnZUNvbnRleHRJbXBsJDEyIik7ICAgICAgCisgICAgICAgICAgICBsb2FkZXIubG9hZENsYXNzKCBiYXNlUGFja2FnZSArCisgICAgICAgICAgICAgICAgInJ1bnRpbWUuUGFnZUNvbnRleHRJbXBsJDEzIik7ICAgICAgCisKKyAgICAgICAgICAgIGxvYWRlci5sb2FkQ2xhc3MoIGJhc2VQYWNrYWdlICsKKyAgICAgICAgICAgICAgICAicnVudGltZS5Kc3BDb250ZXh0V3JhcHBlciIpOyAgIAorCisgICAgICAgICAgICBsb2FkZXIubG9hZENsYXNzKCBiYXNlUGFja2FnZSArCisgICAgICAgICAgICAgICAgInNlcnZsZXQuSnNwU2VydmxldFdyYXBwZXIiKTsKKworICAgICAgICAgICAgbG9hZGVyLmxvYWRDbGFzcyggYmFzZVBhY2thZ2UgKworICAgICAgICAgICAgICAgICJydW50aW1lLkpzcFdyaXRlckltcGwkMSIpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBsb2cuZXJyb3IoIlNlY3VyaXR5Q2xhc3NMb2FkIiwgZXgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3NlcnZsZXQvSmFzcGVyTG9hZGVyLmphdmEgYi9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvc2VydmxldC9KYXNwZXJMb2FkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjE3ODU3Ci0tLSAvZGV2L251bGwKKysrIGIvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3NlcnZsZXQvSmFzcGVyTG9hZGVyLmphdmEKQEAgLTAsMCArMSwxNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphc3Blci5zZXJ2bGV0OworCitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEubmV0LlVSTENsYXNzTG9hZGVyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkNvZGVTb3VyY2U7CitpbXBvcnQgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLkNvbnN0YW50czsKKworLyoqCisgKiBDbGFzcyBsb2FkZXIgZm9yIGxvYWRpbmcgc2VydmxldCBjbGFzcyBmaWxlcyAoY29ycmVzcG9uZGluZyB0byBKU1AgZmlsZXMpIAorICogYW5kIHRhZyBoYW5kbGVyIGNsYXNzIGZpbGVzIChjb3JyZXNwb25kaW5nIHRvIHRhZyBmaWxlcykuCisgKgorICogQGF1dGhvciBBbmlsIEsuIFZpamVuZHJhbgorICogQGF1dGhvciBIYXJpc2ggUHJhYmFuZGhhbQorICogQGF1dGhvciBKZWFuLUZyYW5jb2lzIEFyY2FuZAorICovCitwdWJsaWMgY2xhc3MgSmFzcGVyTG9hZGVyIGV4dGVuZHMgVVJMQ2xhc3NMb2FkZXIgeworCisgICAgcHJpdmF0ZSBQZXJtaXNzaW9uQ29sbGVjdGlvbiBwZXJtaXNzaW9uQ29sbGVjdGlvbjsKKyAgICBwcml2YXRlIENvZGVTb3VyY2UgY29kZVNvdXJjZTsKKyAgICBwcml2YXRlIFN0cmluZyBjbGFzc05hbWU7CisgICAgcHJpdmF0ZSBDbGFzc0xvYWRlciBwYXJlbnQ7CisgICAgcHJpdmF0ZSBTZWN1cml0eU1hbmFnZXIgc2VjdXJpdHlNYW5hZ2VyOworICAgIHByaXZhdGUgUHJpdmlsZWdlZExvYWRDbGFzcyBwcml2TG9hZENsYXNzOworCisgICAgcHVibGljIEphc3BlckxvYWRlcihVUkxbXSB1cmxzLCBDbGFzc0xvYWRlciBwYXJlbnQsCisJCQlQZXJtaXNzaW9uQ29sbGVjdGlvbiBwZXJtaXNzaW9uQ29sbGVjdGlvbiwKKwkJCUNvZGVTb3VyY2UgY29kZVNvdXJjZSkgeworCXN1cGVyKHVybHMsIHBhcmVudCk7CisJdGhpcy5wZXJtaXNzaW9uQ29sbGVjdGlvbiA9IHBlcm1pc3Npb25Db2xsZWN0aW9uOworCXRoaXMuY29kZVNvdXJjZSA9IGNvZGVTb3VyY2U7CisJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CisgICAgICAgIHRoaXMucHJpdkxvYWRDbGFzcyA9IG5ldyBQcml2aWxlZ2VkTG9hZENsYXNzKCk7CisJdGhpcy5zZWN1cml0eU1hbmFnZXIgPSBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9hZCB0aGUgY2xhc3Mgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuICBUaGlzIG1ldGhvZCBzZWFyY2hlcyBmb3IKKyAgICAgKiBjbGFzc2VzIGluIHRoZSBzYW1lIG1hbm5lciBhcyA8Y29kZT5sb2FkQ2xhc3MoU3RyaW5nLCBib29sZWFuKTwvY29kZT4KKyAgICAgKiB3aXRoIDxjb2RlPmZhbHNlPC9jb2RlPiBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgY2xhc3MgdG8gYmUgbG9hZGVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIENsYXNzTm90Rm91bmRFeGNlcHRpb24gaWYgdGhlIGNsYXNzIHdhcyBub3QgZm91bmQKKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3MgbG9hZENsYXNzKFN0cmluZyBuYW1lKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisKKyAgICAgICAgcmV0dXJuIChsb2FkQ2xhc3MobmFtZSwgZmFsc2UpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2FkIHRoZSBjbGFzcyB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSwgc2VhcmNoaW5nIHVzaW5nIHRoZSBmb2xsb3dpbmcKKyAgICAgKiBhbGdvcml0aG0gdW50aWwgaXQgZmluZHMgYW5kIHJldHVybnMgdGhlIGNsYXNzLiAgSWYgdGhlIGNsYXNzIGNhbm5vdAorICAgICAqIGJlIGZvdW5kLCByZXR1cm5zIDxjb2RlPkNsYXNzTm90Rm91bmRFeGNlcHRpb248L2NvZGU+LgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+Q2FsbCA8Y29kZT5maW5kTG9hZGVkQ2xhc3MoU3RyaW5nKTwvY29kZT4gdG8gY2hlY2sgaWYgdGhlCisgICAgICogICAgIGNsYXNzIGhhcyBhbHJlYWR5IGJlZW4gbG9hZGVkLiAgSWYgaXQgaGFzLCB0aGUgc2FtZQorICAgICAqICAgICA8Y29kZT5DbGFzczwvY29kZT4gb2JqZWN0IGlzIHJldHVybmVkLjwvbGk+CisgICAgICogPGxpPklmIHRoZSA8Y29kZT5kZWxlZ2F0ZTwvY29kZT4gcHJvcGVydHkgaXMgc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+LAorICAgICAqICAgICBjYWxsIHRoZSA8Y29kZT5sb2FkQ2xhc3MoKTwvY29kZT4gbWV0aG9kIG9mIHRoZSBwYXJlbnQgY2xhc3MKKyAgICAgKiAgICAgbG9hZGVyLCBpZiBhbnkuPC9saT4gICAgICAgICAgICAKKyAgICAgKiA8bGk+Q2FsbCA8Y29kZT5maW5kQ2xhc3MoKTwvY29kZT4gdG8gZmluZCB0aGlzIGNsYXNzIGluIG91ciBsb2NhbGx5CisgICAgICogICAgIGRlZmluZWQgcmVwb3NpdG9yaWVzLjwvbGk+ICAgICAgCisgICAgICogPGxpPkNhbGwgdGhlIDxjb2RlPmxvYWRDbGFzcygpPC9jb2RlPiBtZXRob2Qgb2Ygb3VyIHBhcmVudAorICAgICAqICAgICBjbGFzcyBsb2FkZXIsIGlmIGFueS48L2xpPiAgICAgIAorICAgICAqIDwvdWw+CisgICAgICogSWYgdGhlIGNsYXNzIHdhcyBmb3VuZCB1c2luZyB0aGUgYWJvdmUgc3RlcHMsIGFuZCB0aGUKKyAgICAgKiA8Y29kZT5yZXNvbHZlPC9jb2RlPiBmbGFnIGlzIDxjb2RlPnRydWU8L2NvZGU+LCB0aGlzIG1ldGhvZCB3aWxsIHRoZW4KKyAgICAgKiBjYWxsIDxjb2RlPnJlc29sdmVDbGFzcyhDbGFzcyk8L2NvZGU+IG9uIHRoZSByZXN1bHRpbmcgQ2xhc3Mgb2JqZWN0LgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIGNsYXNzIHRvIGJlIGxvYWRlZAorICAgICAqIEBwYXJhbSByZXNvbHZlIElmIDxjb2RlPnRydWU8L2NvZGU+IHRoZW4gcmVzb2x2ZSB0aGUgY2xhc3MKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgKiBAZXhjZXB0aW9uIENsYXNzTm90Rm91bmRFeGNlcHRpb24gaWYgdGhlIGNsYXNzIHdhcyBub3QgZm91bmQKKyAgICAgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBwdWJsaWMgQ2xhc3MgbG9hZENsYXNzKGZpbmFsIFN0cmluZyBuYW1lLCBib29sZWFuIHJlc29sdmUpCisgICAgICAgIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKworICAgICAgICBDbGFzcyBjbGF6eiA9IG51bGw7ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAvLyAoMCkgQ2hlY2sgb3VyIHByZXZpb3VzbHkgbG9hZGVkIGNsYXNzIGNhY2hlCisgICAgICAgIGNsYXp6ID0gZmluZExvYWRlZENsYXNzKG5hbWUpOyAgICAgCisgICAgICAgIGlmIChjbGF6eiAhPSBudWxsKSB7ICAgICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAocmVzb2x2ZSkgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgcmVzb2x2ZUNsYXNzKGNsYXp6KTsgICAgICAgCisgICAgICAgICAgICByZXR1cm4gKGNsYXp6KTsgICAgICAgIAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIC8vICguNSkgUGVybWlzc2lvbiB0byBhY2Nlc3MgdGhpcyBjbGFzcyB3aGVuIHVzaW5nIGEgU2VjdXJpdHlNYW5hZ2VyCisgICAgICAgIGlmIChzZWN1cml0eU1hbmFnZXIgIT0gbnVsbCkgeyAgICAgCisgICAgICAgICAgICBpbnQgZG90ID0gbmFtZS5sYXN0SW5kZXhPZignLicpOworICAgICAgICAgICAgaWYgKGRvdCA+PSAwKSB7ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHRyeSB7ICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgLy8gRG8gbm90IGNhbGwgdGhlIHNlY3VyaXR5IG1hbmFnZXIgc2luY2UgYnkgZGVmYXVsdCwgd2UgZ3JhbnQgdGhhdCBwYWNrYWdlLgorICAgICAgICAgICAgICAgICAgICBpZiAoISJvcmcuYXBhY2hlLmphc3Blci5ydW50aW1lIi5lcXVhbHNJZ25vcmVDYXNlKG5hbWUuc3Vic3RyaW5nKDAsZG90KSkpeworICAgICAgICAgICAgICAgICAgICAgICAgc2VjdXJpdHlNYW5hZ2VyLmNoZWNrUGFja2FnZUFjY2VzcyhuYW1lLnN1YnN0cmluZygwLGRvdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVycm9yID0gIlNlY3VyaXR5IFZpb2xhdGlvbiwgYXR0ZW1wdCB0byB1c2UgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAiUmVzdHJpY3RlZCBDbGFzczogIiArIG5hbWU7CisgICAgICAgICAgICAgICAgICAgIHNlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbihlcnJvcik7CisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIH0KKworCS8vIENsYXNzIGlzIGluIGEgcGFja2FnZSwgZGVsZWdhdGUgdG8gdGhyZWFkIGNvbnRleHQgY2xhc3MgbG9hZGVyCisJaWYoICFuYW1lLnN0YXJ0c1dpdGgoQ29uc3RhbnRzLkpTUF9QQUNLQUdFX05BTUUpICkgeworCSAgICBpZiAoc2VjdXJpdHlNYW5hZ2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlciA9IChDbGFzc0xvYWRlcilBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChwcml2TG9hZENsYXNzKTsKKyAgICAgICAgICAgICAgICB0cnl7CisgICAgICAgICAgICAgICAgICAgIGNsYXp6ID0gKENsYXNzKUFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKCl7CisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHRocm93cyBFeGNlcHRpb257CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNsYXNzTG9hZGVyLmxvYWRDbGFzcyhuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaChQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIGV4KXsKKyAgICAgICAgICAgICAgICAgICAgRXhjZXB0aW9uIHJvb3RDYXVzZSA9IGV4LmdldEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgICAgICBpZiAocm9vdENhdXNlIGluc3RhbmNlb2YgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgKENsYXNzTm90Rm91bmRFeGNlcHRpb24pIHJvb3RDYXVzZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKCJKYXNwZXJMb2FkZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdENhdXNlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY2xhenogPSBwYXJlbnQubG9hZENsYXNzKG5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisJICAgIGlmKCByZXNvbHZlICkKKwkJcmVzb2x2ZUNsYXNzKGNsYXp6KTsKKwkgICAgcmV0dXJuIGNsYXp6OworCX0KKworCXJldHVybiBmaW5kQ2xhc3MobmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBQZXJtaXNzaW9ucyBmb3IgYSBDb2RlU291cmNlLgorICAgICAqCisgICAgICogU2luY2UgdGhpcyBDbGFzc0xvYWRlciBpcyBvbmx5IHVzZWQgZm9yIGEgSlNQIHBhZ2UgaW4KKyAgICAgKiBhIHdlYiBhcHBsaWNhdGlvbiBjb250ZXh0LCB3ZSBqdXN0IHJldHVybiBvdXIgcHJlc2V0CisgICAgICogUGVybWlzc2lvbkNvbGxlY3Rpb24gZm9yIHRoZSB3ZWIgYXBwIGNvbnRleHQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29kZVNvdXJjZSBDb2RlIHNvdXJjZSB3aGVyZSB0aGUgY29kZSB3YXMgbG9hZGVkIGZyb20KKyAgICAgKiBAcmV0dXJuIFBlcm1pc3Npb25Db2xsZWN0aW9uIGZvciBDb2RlU291cmNlCisgICAgICovCisgICAgcHVibGljIGZpbmFsIFBlcm1pc3Npb25Db2xsZWN0aW9uIGdldFBlcm1pc3Npb25zKENvZGVTb3VyY2UgY29kZVNvdXJjZSkgeworICAgICAgICByZXR1cm4gcGVybWlzc2lvbkNvbGxlY3Rpb247CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBQcml2aWxlZ2VkTG9hZENsYXNzIGltcGxlbWVudHMgUHJpdmlsZWdlZEFjdGlvbiB7CisKKyAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7CisgICAgICAgICAgICByZXR1cm4gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9zZXJ2bGV0L0pzcENTZXJ2bGV0Q29udGV4dC5qYXZhIGIvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3NlcnZsZXQvSnNwQ1NlcnZsZXRDb250ZXh0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFhZGM3ZgotLS0gL2Rldi9udWxsCisrKyBiL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9zZXJ2bGV0L0pzcENTZXJ2bGV0Q29udGV4dC5qYXZhCkBAIC0wLDAgKzEsNDE1IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYXNwZXIuc2VydmxldDsKKworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuUmVxdWVzdERpc3BhdGNoZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworCisKKy8qKgorICogU2ltcGxlIDxjb2RlPlNlcnZsZXRDb250ZXh0PC9jb2RlPiBpbXBsZW1lbnRhdGlvbiB3aXRob3V0CisgKiBIVFRQLXNwZWNpZmljIG1ldGhvZHMuCisgKgorICogQGF1dGhvciBQZXRlciBSb3NzYmFjaCAocHJAd2ViYXBwLmRlKQorICovCisKK3B1YmxpYyBjbGFzcyBKc3BDU2VydmxldENvbnRleHQgaW1wbGVtZW50cyBTZXJ2bGV0Q29udGV4dCB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBTZXJ2bGV0IGNvbnRleHQgYXR0cmlidXRlcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgSGFzaHRhYmxlIG15QXR0cmlidXRlczsKKworCisgICAgLyoqCisgICAgICogVGhlIGxvZyB3cml0ZXIgd2Ugd2lsbCB3cml0ZSBsb2cgbWVzc2FnZXMgdG8uCisgICAgICovCisgICAgcHJvdGVjdGVkIFByaW50V3JpdGVyIG15TG9nV3JpdGVyOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgYmFzZSBVUkwgKGRvY3VtZW50IHJvb3QpIGZvciB0aGlzIGNvbnRleHQuCisgICAgICovCisgICAgcHJvdGVjdGVkIFVSTCBteVJlc291cmNlQmFzZVVSTDsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIFNlcnZsZXRDb250ZXh0IGltcGxlbWVudGF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGFMb2dXcml0ZXIgUHJpbnRXcml0ZXIgd2hpY2ggaXMgdXNlZCBmb3IgPGNvZGU+bG9nKCk8L2NvZGU+IGNhbGxzCisgICAgICogQHBhcmFtIGFSZXNvdXJjZUJhc2VVUkwgUmVzb3VyY2UgYmFzZSBVUkwKKyAgICAgKi8KKyAgICBwdWJsaWMgSnNwQ1NlcnZsZXRDb250ZXh0KFByaW50V3JpdGVyIGFMb2dXcml0ZXIsIFVSTCBhUmVzb3VyY2VCYXNlVVJMKSB7CisKKyAgICAgICAgbXlBdHRyaWJ1dGVzID0gbmV3IEhhc2h0YWJsZSgpOworICAgICAgICBteUxvZ1dyaXRlciA9IGFMb2dXcml0ZXI7CisgICAgICAgIG15UmVzb3VyY2VCYXNlVVJMID0gYVJlc291cmNlQmFzZVVSTDsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc3BlY2lmaWVkIGNvbnRleHQgYXR0cmlidXRlLCBpZiBhbnkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSByZXF1ZXN0ZWQgYXR0cmlidXRlCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHsKKworICAgICAgICByZXR1cm4gKG15QXR0cmlidXRlcy5nZXQobmFtZSkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYW4gZW51bWVyYXRpb24gb2YgY29udGV4dCBhdHRyaWJ1dGUgbmFtZXMuCisgICAgICovCisgICAgcHVibGljIEVudW1lcmF0aW9uIGdldEF0dHJpYnV0ZU5hbWVzKCkgeworCisgICAgICAgIHJldHVybiAobXlBdHRyaWJ1dGVzLmtleXMoKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2VydmxldCBjb250ZXh0IGZvciB0aGUgc3BlY2lmaWVkIHBhdGguCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJpcGF0aCBTZXJ2ZXItcmVsYXRpdmUgcGF0aCBzdGFydGluZyB3aXRoICcvJworICAgICAqLworICAgIHB1YmxpYyBTZXJ2bGV0Q29udGV4dCBnZXRDb250ZXh0KFN0cmluZyB1cmlwYXRoKSB7CisKKyAgICAgICAgcmV0dXJuIChudWxsKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgY29udGV4dCBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSByZXF1ZXN0ZWQgcGFyYW1ldGVyCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJbml0UGFyYW1ldGVyKFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgcmV0dXJuIChudWxsKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGFuIGVudW1lcmF0aW9uIG9mIHRoZSBuYW1lcyBvZiBjb250ZXh0IGluaXRpYWxpemF0aW9uCisgICAgICogcGFyYW1ldGVycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0SW5pdFBhcmFtZXRlck5hbWVzKCkgeworCisgICAgICAgIHJldHVybiAobmV3IFZlY3RvcigpLmVsZW1lbnRzKCkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIFNlcnZsZXQgQVBJIG1ham9yIHZlcnNpb24gbnVtYmVyLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0TWFqb3JWZXJzaW9uKCkgeworCisgICAgICAgIHJldHVybiAoMik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgTUlNRSB0eXBlIGZvciB0aGUgc3BlY2lmaWVkIGZpbGVuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIGZpbGUgRmlsZW5hbWUgd2hvc2UgTUlNRSB0eXBlIGlzIHJlcXVlc3RlZAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWltZVR5cGUoU3RyaW5nIGZpbGUpIHsKKworICAgICAgICByZXR1cm4gKG51bGwpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIFNlcnZsZXQgQVBJIG1pbm9yIHZlcnNpb24gbnVtYmVyLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0TWlub3JWZXJzaW9uKCkgeworCisgICAgICAgIHJldHVybiAoMyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIHJlcXVlc3QgZGlzcGF0Y2hlciBmb3IgdGhlIHNwZWNpZmllZCBzZXJ2bGV0IG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSByZXF1ZXN0ZWQgc2VydmxldAorICAgICAqLworICAgIHB1YmxpYyBSZXF1ZXN0RGlzcGF0Y2hlciBnZXROYW1lZERpc3BhdGNoZXIoU3RyaW5nIG5hbWUpIHsKKworICAgICAgICByZXR1cm4gKG51bGwpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHJlYWwgcGF0aCBmb3IgdGhlIHNwZWNpZmllZCBjb250ZXh0LXJlbGF0aXZlCisgICAgICogdmlydHVhbCBwYXRoLgorICAgICAqCisgICAgICogQHBhcmFtIHBhdGggVGhlIGNvbnRleHQtcmVsYXRpdmUgdmlydHVhbCBwYXRoIHRvIHJlc29sdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlYWxQYXRoKFN0cmluZyBwYXRoKSB7CisKKyAgICAgICAgaWYgKCFteVJlc291cmNlQmFzZVVSTC5nZXRQcm90b2NvbCgpLmVxdWFscygiZmlsZSIpKQorICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgaWYgKCFwYXRoLnN0YXJ0c1dpdGgoIi8iKSkKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICAoZ2V0UmVzb3VyY2UocGF0aCkuZ2V0RmlsZSgpLnJlcGxhY2UoJy8nLCBGaWxlLnNlcGFyYXRvckNoYXIpKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIH0KKworICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgcmVxdWVzdCBkaXNwYXRjaGVyIGZvciB0aGUgc3BlY2lmaWVkIGNvbnRleHQtcmVsYXRpdmUgcGF0aC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXRoIENvbnRleHQtcmVsYXRpdmUgcGF0aCBmb3Igd2hpY2ggdG8gYWNxdWlyZSBhIGRpc3BhdGNoZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgUmVxdWVzdERpc3BhdGNoZXIgZ2V0UmVxdWVzdERpc3BhdGNoZXIoU3RyaW5nIHBhdGgpIHsKKworICAgICAgICByZXR1cm4gKG51bGwpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBVUkwgb2JqZWN0IG9mIGEgcmVzb3VyY2UgdGhhdCBpcyBtYXBwZWQgdG8gdGhlCisgICAgICogc3BlY2lmaWVkIGNvbnRleHQtcmVsYXRpdmUgcGF0aC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXRoIENvbnRleHQtcmVsYXRpdmUgcGF0aCBvZiB0aGUgZGVzaXJlZCByZXNvdXJjZQorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBNYWxmb3JtZWRVUkxFeGNlcHRpb24gaWYgdGhlIHJlc291cmNlIHBhdGggaXMKKyAgICAgKiAgbm90IHByb3Blcmx5IGZvcm1lZAorICAgICAqLworICAgIHB1YmxpYyBVUkwgZ2V0UmVzb3VyY2UoU3RyaW5nIHBhdGgpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24geworCisgICAgICAgIGlmICghcGF0aC5zdGFydHNXaXRoKCIvIikpCisgICAgICAgICAgICB0aHJvdyBuZXcgTWFsZm9ybWVkVVJMRXhjZXB0aW9uKCJQYXRoICciICsgcGF0aCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICInIGRvZXMgbm90IHN0YXJ0IHdpdGggJy8nIik7CisgICAgICAgIHJldHVybiAobmV3IFVSTChteVJlc291cmNlQmFzZVVSTCwgcGF0aC5zdWJzdHJpbmcoMSkpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGFuIElucHV0U3RyZWFtIGFsbG93aW5nIGFjY2VzcyB0byB0aGUgcmVzb3VyY2UgYXQgdGhlCisgICAgICogc3BlY2lmaWVkIGNvbnRleHQtcmVsYXRpdmUgcGF0aC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXRoIENvbnRleHQtcmVsYXRpdmUgcGF0aCBvZiB0aGUgZGVzaXJlZCByZXNvdXJjZQorICAgICAqLworICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRSZXNvdXJjZUFzU3RyZWFtKFN0cmluZyBwYXRoKSB7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiAoZ2V0UmVzb3VyY2UocGF0aCkub3BlblN0cmVhbSgpKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXQgb2YgcmVzb3VyY2UgcGF0aHMgZm9yIHRoZSAiZGlyZWN0b3J5IiBhdCB0aGUKKyAgICAgKiBzcGVjaWZpZWQgY29udGV4dCBwYXRoLgorICAgICAqCisgICAgICogQHBhcmFtIHBhdGggQ29udGV4dC1yZWxhdGl2ZSBiYXNlIHBhdGgKKyAgICAgKi8KKyAgICBwdWJsaWMgU2V0IGdldFJlc291cmNlUGF0aHMoU3RyaW5nIHBhdGgpIHsKKworICAgICAgICBTZXQgdGhlUGF0aHMgPSBuZXcgSGFzaFNldCgpOworICAgICAgICBpZiAoIXBhdGguZW5kc1dpdGgoIi8iKSkKKyAgICAgICAgICAgIHBhdGggKz0gIi8iOworICAgICAgICBTdHJpbmcgYmFzZVBhdGggPSBnZXRSZWFsUGF0aChwYXRoKTsKKyAgICAgICAgaWYgKGJhc2VQYXRoID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKHRoZVBhdGhzKTsKKyAgICAgICAgRmlsZSB0aGVCYXNlRGlyID0gbmV3IEZpbGUoYmFzZVBhdGgpOworICAgICAgICBpZiAoIXRoZUJhc2VEaXIuZXhpc3RzKCkgfHwgIXRoZUJhc2VEaXIuaXNEaXJlY3RvcnkoKSkKKyAgICAgICAgICAgIHJldHVybiAodGhlUGF0aHMpOworICAgICAgICBTdHJpbmcgdGhlRmlsZXNbXSA9IHRoZUJhc2VEaXIubGlzdCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRoZUZpbGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBGaWxlIHRlc3RGaWxlID0gbmV3IEZpbGUoYmFzZVBhdGggKyBGaWxlLnNlcGFyYXRvciArIHRoZUZpbGVzW2ldKTsKKyAgICAgICAgICAgIGlmICh0ZXN0RmlsZS5pc0ZpbGUoKSkKKyAgICAgICAgICAgICAgICB0aGVQYXRocy5hZGQocGF0aCArIHRoZUZpbGVzW2ldKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHRlc3RGaWxlLmlzRGlyZWN0b3J5KCkpCisgICAgICAgICAgICAgICAgdGhlUGF0aHMuYWRkKHBhdGggKyB0aGVGaWxlc1tpXSArICIvIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICh0aGVQYXRocyk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHNlcnZlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFNlcnZlckluZm8oKSB7CisKKyAgICAgICAgcmV0dXJuICgiSnNwQ1NlcnZsZXRDb250ZXh0LzEuMCIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBudWxsIHJlZmVyZW5jZSBmb3IgdGhlIHNwZWNpZmllZCBzZXJ2bGV0IG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSByZXF1ZXN0ZWQgc2VydmxldAorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQgVGhpcyBtZXRob2QgaGFzIGJlZW4gZGVwcmVjYXRlZCB3aXRoIG5vIHJlcGxhY2VtZW50CisgICAgICovCisgICAgcHVibGljIFNlcnZsZXQgZ2V0U2VydmxldChTdHJpbmcgbmFtZSkgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIHJldHVybiAobnVsbCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGlzIHNlcnZsZXQgY29udGV4dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFNlcnZsZXRDb250ZXh0TmFtZSgpIHsKKworICAgICAgICByZXR1cm4gKGdldFNlcnZlckluZm8oKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhbiBlbXB0eSBlbnVtZXJhdGlvbiBvZiBzZXJ2bGV0IG5hbWVzLgorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQgVGhpcyBtZXRob2QgaGFzIGJlZW4gZGVwcmVjYXRlZCB3aXRoIG5vIHJlcGxhY2VtZW50CisgICAgICovCisgICAgcHVibGljIEVudW1lcmF0aW9uIGdldFNlcnZsZXROYW1lcygpIHsKKworICAgICAgICByZXR1cm4gKG5ldyBWZWN0b3IoKS5lbGVtZW50cygpKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGFuIGVtcHR5IGVudW1lcmF0aW9uIG9mIHNlcnZsZXRzLgorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQgVGhpcyBtZXRob2QgaGFzIGJlZW4gZGVwcmVjYXRlZCB3aXRoIG5vIHJlcGxhY2VtZW50CisgICAgICovCisgICAgcHVibGljIEVudW1lcmF0aW9uIGdldFNlcnZsZXRzKCkgeworCisgICAgICAgIHJldHVybiAobmV3IFZlY3RvcigpLmVsZW1lbnRzKCkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBMb2cgdGhlIHNwZWNpZmllZCBtZXNzYWdlLgorICAgICAqCisgICAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkCisgICAgICovCisgICAgcHVibGljIHZvaWQgbG9nKFN0cmluZyBtZXNzYWdlKSB7CisKKyAgICAgICAgbXlMb2dXcml0ZXIucHJpbnRsbihtZXNzYWdlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogTG9nIHRoZSBzcGVjaWZpZWQgbWVzc2FnZSBhbmQgZXhjZXB0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGV4Y2VwdGlvbiBUaGUgZXhjZXB0aW9uIHRvIGJlIGxvZ2dlZAorICAgICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZAorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQgVXNlIGxvZyhTdHJpbmcsVGhyb3dhYmxlKSBpbnN0ZWFkCisgICAgICovCisgICAgcHVibGljIHZvaWQgbG9nKEV4Y2VwdGlvbiBleGNlcHRpb24sIFN0cmluZyBtZXNzYWdlKSB7CisKKyAgICAgICAgbG9nKG1lc3NhZ2UsIGV4Y2VwdGlvbik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIExvZyB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UgYW5kIGV4Y2VwdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZAorICAgICAqIEBwYXJhbSBleGNlcHRpb24gVGhlIGV4Y2VwdGlvbiB0byBiZSBsb2dnZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBsb2coU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKKworICAgICAgICBteUxvZ1dyaXRlci5wcmludGxuKG1lc3NhZ2UpOworICAgICAgICBleGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKG15TG9nV3JpdGVyKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgY29udGV4dCBhdHRyaWJ1dGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdG8gcmVtb3ZlCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlQXR0cmlidXRlKFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgbXlBdHRyaWJ1dGVzLnJlbW92ZShuYW1lKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IG9yIHJlcGxhY2UgdGhlIHNwZWNpZmllZCBjb250ZXh0IGF0dHJpYnV0ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIGNvbnRleHQgYXR0cmlidXRlIHRvIHNldAorICAgICAqIEBwYXJhbSB2YWx1ZSBDb3JyZXNwb25kaW5nIGF0dHJpYnV0ZSB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKSB7CisKKyAgICAgICAgbXlBdHRyaWJ1dGVzLnB1dChuYW1lLCB2YWx1ZSk7CisKKyAgICB9CisKKworCit9CmRpZmYgLS1naXQgYS9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvc2VydmxldC9Kc3BTZXJ2bGV0LmphdmEgYi9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvc2VydmxldC9Kc3BTZXJ2bGV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBiNGYxZQotLS0gL2Rldi9udWxsCisrKyBiL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9zZXJ2bGV0L0pzcFNlcnZsZXQuamF2YQpAQCAtMCwwICsxLDI5OSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFzcGVyLnNlcnZsZXQ7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbmZpZzsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXQ7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OworCitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLkVtYmVkZGVkU2VydmxldE9wdGlvbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIuT3B0aW9uczsKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5jb21waWxlci5Kc3BSdW50aW1lQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5jb21waWxlci5Mb2NhbGl6ZXI7CisKKy8qKgorICogVGhlIEpTUCBlbmdpbmUgKGEuay5hIEphc3BlcikuCisgKgorICogVGhlIHNlcnZsZXQgY29udGFpbmVyIGlzIHJlc3BvbnNpYmxlIGZvciBwcm92aWRpbmcgYQorICogVVJMQ2xhc3NMb2FkZXIgZm9yIHRoZSB3ZWIgYXBwbGljYXRpb24gY29udGV4dCBKYXNwZXIKKyAqIGlzIGJlaW5nIHVzZWQgaW4uIEphc3BlciB3aWxsIHRyeSBnZXQgdGhlIFRvbWNhdAorICogU2VydmxldENvbnRleHQgYXR0cmlidXRlIGZvciBpdHMgU2VydmxldENvbnRleHQgY2xhc3MKKyAqIGxvYWRlciwgaWYgdGhhdCBmYWlscywgaXQgdXNlcyB0aGUgcGFyZW50IGNsYXNzIGxvYWRlci4KKyAqIEluIGVpdGhlciBjYXNlLCBpdCBtdXN0IGJlIGEgVVJMQ2xhc3NMb2FkZXIuCisgKgorICogQGF1dGhvciBBbmlsIEsuIFZpamVuZHJhbgorICogQGF1dGhvciBIYXJpc2ggUHJhYmFuZGhhbQorICogQGF1dGhvciBSZW15IE1hdWNoZXJhdAorICogQGF1dGhvciBLaW4tbWFuIENodW5nCisgKiBAYXV0aG9yIEdsZW5uIE5pZWxzZW4KKyAqLworcHVibGljIGNsYXNzIEpzcFNlcnZsZXQgZXh0ZW5kcyBIdHRwU2VydmxldCB7CisKKyAgICAvLyBMb2dnZXIKKyAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coSnNwU2VydmxldC5jbGFzcyk7CisKKyAgICBwcml2YXRlIFNlcnZsZXRDb250ZXh0IGNvbnRleHQ7CisgICAgcHJpdmF0ZSBTZXJ2bGV0Q29uZmlnIGNvbmZpZzsKKyAgICBwcml2YXRlIE9wdGlvbnMgb3B0aW9uczsKKyAgICBwcml2YXRlIEpzcFJ1bnRpbWVDb250ZXh0IHJjdHh0OworCisKKyAgICAvKgorICAgICAqIEluaXRpYWxpemVzIHRoaXMgSnNwU2VydmxldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbml0KFNlcnZsZXRDb25maWcgY29uZmlnKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7CisKKwlzdXBlci5pbml0KGNvbmZpZyk7CisJdGhpcy5jb25maWcgPSBjb25maWc7CisJdGhpcy5jb250ZXh0ID0gY29uZmlnLmdldFNlcnZsZXRDb250ZXh0KCk7CisKKyAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgSlNQIFJ1bnRpbWUgQ29udGV4dAorICAgICAgICBvcHRpb25zID0gbmV3IEVtYmVkZGVkU2VydmxldE9wdGlvbnMoY29uZmlnLCBjb250ZXh0KTsKKyAgICAgICAgcmN0eHQgPSBuZXcgSnNwUnVudGltZUNvbnRleHQoY29udGV4dCxvcHRpb25zKTsKKworCWlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworCSAgICBsb2cuZGVidWcoTG9jYWxpemVyLmdldE1lc3NhZ2UoImpzcC5tZXNzYWdlLnNjcmF0Y2guZGlyLmlzIiwKKwkJCQkJICAgb3B0aW9ucy5nZXRTY3JhdGNoRGlyKCkudG9TdHJpbmcoKSkpOworCSAgICBsb2cuZGVidWcoTG9jYWxpemVyLmdldE1lc3NhZ2UoImpzcC5tZXNzYWdlLmRvbnQubW9kaWZ5LnNlcnZsZXRzIikpOworCX0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBKU1BzIGZvciB3aGljaCBKc3BTZXJ2bGV0V3JhcHBlcnMgZXhpc3QsIGkuZS4sCisgICAgICogdGhlIG51bWJlciBvZiBKU1BzIHRoYXQgaGF2ZSBiZWVuIGxvYWRlZCBpbnRvIHRoZSB3ZWJhcHAgd2l0aCB3aGljaAorICAgICAqIHRoaXMgSnNwU2VydmxldCBpcyBhc3NvY2lhdGVkLgorICAgICAqCisgICAgICogPHA+VGhpcyBpbmZvIG1heSBiZSB1c2VkIGZvciBtb25pdG9yaW5nIHB1cnBvc2VzLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIEpTUHMgdGhhdCBoYXZlIGJlZW4gbG9hZGVkIGludG8gdGhlIHdlYmFwcCB3aXRoCisgICAgICogd2hpY2ggdGhpcyBKc3BTZXJ2bGV0IGlzIGFzc29jaWF0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEpzcENvdW50KCkgeworICAgICAgICByZXR1cm4gdGhpcy5yY3R4dC5nZXRKc3BDb3VudCgpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVzZXRzIHRoZSBKU1AgcmVsb2FkIGNvdW50ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY291bnQgVmFsdWUgdG8gd2hpY2ggdG8gcmVzZXQgdGhlIEpTUCByZWxvYWQgY291bnRlcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEpzcFJlbG9hZENvdW50KGludCBjb3VudCkgeworICAgICAgICB0aGlzLnJjdHh0LnNldEpzcFJlbG9hZENvdW50KGNvdW50KTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIG51bWJlciBvZiBKU1BzIHRoYXQgaGF2ZSBiZWVuIHJlbG9hZGVkLgorICAgICAqCisgICAgICogPHA+VGhpcyBpbmZvIG1heSBiZSB1c2VkIGZvciBtb25pdG9yaW5nIHB1cnBvc2VzLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIEpTUHMgKGluIHRoZSB3ZWJhcHAgd2l0aCB3aGljaCB0aGlzIEpzcFNlcnZsZXQgaXMKKyAgICAgKiBhc3NvY2lhdGVkKSB0aGF0IGhhdmUgYmVlbiByZWxvYWRlZAorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0SnNwUmVsb2FkQ291bnQoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnJjdHh0LmdldEpzcFJlbG9hZENvdW50KCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiA8cD5Mb29rIGZvciBhIDxlbT5wcmVjb21waWxhdGlvbiByZXF1ZXN0PC9lbT4gYXMgZGVzY3JpYmVkIGluCisgICAgICogU2VjdGlvbiA4LjQuMiBvZiB0aGUgSlNQIDEuMiBTcGVjaWZpY2F0aW9uLiAgPHN0cm9uZz5XQVJOSU5HPC9zdHJvbmc+IC0KKyAgICAgKiB3ZSBjYW5ub3QgdXNlIDxjb2RlPnJlcXVlc3QuZ2V0UGFyYW1ldGVyKCk8L2NvZGU+IGZvciB0aGlzLCBiZWNhdXNlCisgICAgICogdGhhdCB3aWxsIHRyaWdnZXIgcGFyc2luZyBhbGwgb2YgdGhlIHJlcXVlc3QgcGFyYW1ldGVycywgYW5kIG5vdCBnaXZlCisgICAgICogYSBzZXJ2bGV0IHRoZSBvcHBvcnR1bml0eSB0byBjYWxsCisgICAgICogPGNvZGU+cmVxdWVzdC5zZXRDaGFyYWN0ZXJFbmNvZGluZygpPC9jb2RlPiBmaXJzdC48L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1c2V0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYW4gaW52YWxpZCBwYXJhbWV0ZXIgdmFsdWUgZm9yIHRoZQorICAgICAqICA8Y29kZT5qc3BfcHJlY29tcGlsZTwvY29kZT4gcGFyYW1ldGVyIG5hbWUgaXMgc3BlY2lmaWVkCisgICAgICovCisgICAgYm9vbGVhbiBwcmVDb21waWxlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgU3RyaW5nIHF1ZXJ5U3RyaW5nID0gcmVxdWVzdC5nZXRRdWVyeVN0cmluZygpOworICAgICAgICBpZiAocXVlcnlTdHJpbmcgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIChmYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgaW50IHN0YXJ0ID0gcXVlcnlTdHJpbmcuaW5kZXhPZihDb25zdGFudHMuUFJFQ09NUElMRSk7CisgICAgICAgIGlmIChzdGFydCA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiAoZmFsc2UpOworICAgICAgICB9CisgICAgICAgIHF1ZXJ5U3RyaW5nID0KKyAgICAgICAgICAgIHF1ZXJ5U3RyaW5nLnN1YnN0cmluZyhzdGFydCArIENvbnN0YW50cy5QUkVDT01QSUxFLmxlbmd0aCgpKTsKKyAgICAgICAgaWYgKHF1ZXJ5U3RyaW5nLmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiAodHJ1ZSk7ICAgICAgICAgICAgIC8vID9qc3BfcHJlY29tcGlsZQorICAgICAgICB9CisgICAgICAgIGlmIChxdWVyeVN0cmluZy5zdGFydHNXaXRoKCImIikpIHsKKyAgICAgICAgICAgIHJldHVybiAodHJ1ZSk7ICAgICAgICAgICAgIC8vID9qc3BfcHJlY29tcGlsZSZmb289YmFyLi4uCisgICAgICAgIH0KKyAgICAgICAgaWYgKCFxdWVyeVN0cmluZy5zdGFydHNXaXRoKCI9IikpIHsKKyAgICAgICAgICAgIHJldHVybiAoZmFsc2UpOyAgICAgICAgICAgIC8vIHBhcnQgb2Ygc29tZSBvdGhlciBuYW1lIG9yIHZhbHVlCisgICAgICAgIH0KKyAgICAgICAgaW50IGxpbWl0ID0gcXVlcnlTdHJpbmcubGVuZ3RoKCk7CisgICAgICAgIGludCBhbXBlcnNhbmQgPSBxdWVyeVN0cmluZy5pbmRleE9mKCImIik7CisgICAgICAgIGlmIChhbXBlcnNhbmQgPiAwKSB7CisgICAgICAgICAgICBsaW1pdCA9IGFtcGVyc2FuZDsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgdmFsdWUgPSBxdWVyeVN0cmluZy5zdWJzdHJpbmcoMSwgbGltaXQpOworICAgICAgICBpZiAodmFsdWUuZXF1YWxzKCJ0cnVlIikpIHsKKyAgICAgICAgICAgIHJldHVybiAodHJ1ZSk7ICAgICAgICAgICAgIC8vID9qc3BfcHJlY29tcGlsZT10cnVlCisgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuZXF1YWxzKCJmYWxzZSIpKSB7CisJICAgIC8vIFNwZWMgc2F5cyBpZiBqc3BfcHJlY29tcGlsZT1mYWxzZSwgdGhlIHJlcXVlc3Qgc2hvdWxkIG5vdAorCSAgICAvLyBiZSBkZWxpdmVyZWQgdG8gdGhlIEpTUCBwYWdlOyB0aGUgZWFzaWVzdCB3YXkgdG8gaW1wbGVtZW50CisJICAgIC8vIHRoaXMgaXMgdG8gc2V0IHRoZSBmbGFnIHRvIHRydWUsIGFuZCBwcmVjb21waWxlIHRoZSBwYWdlIGFueXdheS4KKwkgICAgLy8gVGhpcyBzdGlsbCBjb25mb3JtcyB0byB0aGUgc3BlYywgc2luY2UgaXQgc2F5cyB0aGUKKwkgICAgLy8gcHJlY29tcGlsYXRpb24gcmVxdWVzdCBjYW4gYmUgaWdub3JlZC4KKyAgICAgICAgICAgIHJldHVybiAodHJ1ZSk7ICAgICAgICAgICAgIC8vID9qc3BfcHJlY29tcGlsZT1mYWxzZQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24oIkNhbm5vdCBoYXZlIHJlcXVlc3QgcGFyYW1ldGVyICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLlBSRUNPTVBJTEUgKyAiIHNldCB0byAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlKTsKKyAgICAgICAgfQorCisgICAgfQorICAgIAorCisgICAgcHVibGljIHZvaWQgc2VydmljZSAoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIAorICAgIAkJCSBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorCXRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN0cmluZyBpbmNsdWRlVXJpIAorICAgICAgICAgICAgICAgID0gKFN0cmluZykgcmVxdWVzdC5nZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLklOQ19TRVJWTEVUX1BBVEgpOworICAgICAgICAgICAgU3RyaW5nIHJlcXVlc3RVcmkgCisgICAgICAgICAgICAgICAgPSAoU3RyaW5nKSByZXF1ZXN0LmdldEF0dHJpYnV0ZShDb25zdGFudHMuSU5DX1JFUVVFU1RfVVJJKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgU3RyaW5nIGpzcFVyaTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gV2hlbiBqc3AtcHJvcGVydHktZ3JvdXAvdXJsLW1hdGNoaW5nIGlzIHVzZWQsIGFuZCB3aGVuIHRoZSAKKyAgICAgICAgICAgIC8vIGpzcCBpcyBub3QgZGVmaW5lZCB3aXRoIDxzZXJ2bGV0LW5hbWU+LCB0aGUgdXJsCisgICAgICAgICAgICAvLyBhcyB0byBiZSBwYXNzZWQgYXMgaXQgaXMgdG8gdGhlIEpTUCBjb250YWluZXIgKHNpbmNlIAorICAgICAgICAgICAgLy8gQ2F0YWxpbmEgZG9lc24ndCBrbm93IGFueXRoaW5nIGFib3V0IHRoZSByZXF1ZXN0ZWQgSlNQIAorICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBUaGUgZmlyc3Qgc2NlbmFyaW8gb2NjdXJzIHdoZW4gdGhlIGpzcCBpcyBub3QgZGlyZWN0bHkgdW5kZXIgLworICAgICAgICAgICAgLy8gZXhhbXBsZTogL3V0ZjE2L2Zvby5qc3AKKyAgICAgICAgICAgIGlmIChyZXF1ZXN0VXJpICE9IG51bGwpeworICAgICAgICAgICAgICAgIFN0cmluZyBjdXJyZW50SW5jbHVkZWRVcmkgCisgICAgICAgICAgICAgICAgICAgID0gcmVxdWVzdFVyaS5zdWJzdHJpbmcocmVxdWVzdFVyaS5pbmRleE9mKGluY2x1ZGVVcmkpKTsKKworICAgICAgICAgICAgICAgIGlmICggIWluY2x1ZGVVcmkuZXF1YWxzKGN1cnJlbnRJbmNsdWRlZFVyaSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVVcmkgPSBjdXJyZW50SW5jbHVkZWRVcmk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBUaGUgc2Vjb25kIHNjZW5hcmlvIGlzIHdoZW4gdGhlIGluY2x1ZGVVcmkgaXMgbnVsbCBidXQgaXQgCisgICAgICAgICAgICAvLyBpcyBzdGlsbCBwb3NzaWJsZSB0byByZWNyZWF0ZSB0aGUgcmVxdWVzdC4KKyAgICAgICAgICAgIGlmIChpbmNsdWRlVXJpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBqc3BVcmkgPSByZXF1ZXN0LmdldFNlcnZsZXRQYXRoKCk7CisgICAgICAgICAgICAgICAgaWYgKHJlcXVlc3QuZ2V0UGF0aEluZm8oKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGpzcFVyaSA9IHJlcXVlc3QuZ2V0U2VydmxldFBhdGgoKSArIHJlcXVlc3QuZ2V0UGF0aEluZm8oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGpzcFVyaSA9IGluY2x1ZGVVcmk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgU3RyaW5nIGpzcEZpbGUgPSAoU3RyaW5nKSByZXF1ZXN0LmdldEF0dHJpYnV0ZShDb25zdGFudHMuSlNQX0ZJTEUpOworICAgICAgICAgICAgaWYgKGpzcEZpbGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGpzcFVyaSA9IGpzcEZpbGU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJvb2xlYW4gcHJlY29tcGlsZSA9IHByZUNvbXBpbGUocmVxdWVzdCk7CisKKyAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewkgICAgCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJKc3BFbmdpbmUgLS0+ICIgKyBqc3BVcmkpOworICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiXHQgICAgIFNlcnZsZXRQYXRoOiAiICsgcmVxdWVzdC5nZXRTZXJ2bGV0UGF0aCgpKTsKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlx0ICAgICAgICBQYXRoSW5mbzogIiArIHJlcXVlc3QuZ2V0UGF0aEluZm8oKSk7CisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJcdCAgICAgICAgUmVhbFBhdGg6ICIgKyBjb250ZXh0LmdldFJlYWxQYXRoKGpzcFVyaSkpOworICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiXHQgICAgICBSZXF1ZXN0VVJJOiAiICsgcmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCkpOworICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiXHQgICAgIFF1ZXJ5U3RyaW5nOiAiICsgcmVxdWVzdC5nZXRRdWVyeVN0cmluZygpKTsKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlx0ICBSZXF1ZXN0IFBhcmFtczogIik7CisgICAgICAgICAgICAgICAgRW51bWVyYXRpb24gZSA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyTmFtZXMoKTsKKworICAgICAgICAgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZykgZS5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlx0XHQgIiArIG5hbWUgKyAiID0gIiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcmVxdWVzdC5nZXRQYXJhbWV0ZXIobmFtZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2VydmljZUpzcEZpbGUocmVxdWVzdCwgcmVzcG9uc2UsIGpzcFVyaSwgbnVsbCwgcHJlY29tcGlsZSk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgfSBjYXRjaCAoU2VydmxldEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3koKSB7CisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgbG9nLmRlYnVnKCJKc3BTZXJ2bGV0LmRlc3Ryb3koKSIpOworICAgICAgICB9CisKKyAgICAgICAgcmN0eHQuZGVzdHJveSgpOworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJpdmF0ZSBNZXRob2RzCisKKyAgICBwcml2YXRlIHZvaWQgc2VydmljZUpzcEZpbGUoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UsIFN0cmluZyBqc3BVcmksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocm93YWJsZSBleGNlcHRpb24sIGJvb2xlYW4gcHJlY29tcGlsZSkKKyAgICAgICAgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKworICAgICAgICBKc3BTZXJ2bGV0V3JhcHBlciB3cmFwcGVyID0KKyAgICAgICAgICAgIChKc3BTZXJ2bGV0V3JhcHBlcikgcmN0eHQuZ2V0V3JhcHBlcihqc3BVcmkpOworICAgICAgICBpZiAod3JhcHBlciA9PSBudWxsKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQodGhpcykgeworICAgICAgICAgICAgICAgIHdyYXBwZXIgPSAoSnNwU2VydmxldFdyYXBwZXIpIHJjdHh0LmdldFdyYXBwZXIoanNwVXJpKTsKKyAgICAgICAgICAgICAgICBpZiAod3JhcHBlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSByZXF1ZXN0ZWQgSlNQIHBhZ2UgZXhpc3RzLCB0byBhdm9pZAorICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGluZyB1bm5lY2Vzc2FyeSBkaXJlY3RvcmllcyBhbmQgZmlsZXMuCisgICAgICAgICAgICAgICAgICAgIGlmIChudWxsID09IGNvbnRleHQuZ2V0UmVzb3VyY2UoanNwVXJpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfTk9UX0ZPVU5ELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzcFVyaSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0Vycm9yUGFnZSA9IGV4Y2VwdGlvbiAhPSBudWxsOworICAgICAgICAgICAgICAgICAgICB3cmFwcGVyID0gbmV3IEpzcFNlcnZsZXRXcmFwcGVyKGNvbmZpZywgb3B0aW9ucywganNwVXJpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRXJyb3JQYWdlLCByY3R4dCk7CisgICAgICAgICAgICAgICAgICAgIHJjdHh0LmFkZFdyYXBwZXIoanNwVXJpLHdyYXBwZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHdyYXBwZXIuc2VydmljZShyZXF1ZXN0LCByZXNwb25zZSwgcHJlY29tcGlsZSk7CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9zZXJ2bGV0L0pzcFNlcnZsZXRXcmFwcGVyLmphdmEgYi9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvc2VydmxldC9Kc3BTZXJ2bGV0V3JhcHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyNTA0YjgKLS0tIC9kZXYvbnVsbAorKysgYi9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvc2VydmxldC9Kc3BTZXJ2bGV0V3JhcHBlci5qYXZhCkBAIC0wLDAgKzEsMzk2IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYXNwZXIuc2VydmxldDsKKworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworCitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbmZpZzsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNpbmdsZVRocmVhZE1vZGVsOworaW1wb3J0IGphdmF4LnNlcnZsZXQuVW5hdmFpbGFibGVFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnSW5mbzsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLkphc3BlckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5Kc3BDb21waWxhdGlvbkNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIuT3B0aW9uczsKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5jb21waWxlci5Kc3BSdW50aW1lQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5jb21waWxlci5Mb2NhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIucnVudGltZS5Kc3BTb3VyY2VEZXBlbmRlbnQ7CisKKy8qKgorICogVGhlIEpTUCBlbmdpbmUgKGEuay5hIEphc3BlcikuCisgKgorICogVGhlIHNlcnZsZXQgY29udGFpbmVyIGlzIHJlc3BvbnNpYmxlIGZvciBwcm92aWRpbmcgYQorICogVVJMQ2xhc3NMb2FkZXIgZm9yIHRoZSB3ZWIgYXBwbGljYXRpb24gY29udGV4dCBKYXNwZXIKKyAqIGlzIGJlaW5nIHVzZWQgaW4uIEphc3BlciB3aWxsIHRyeSBnZXQgdGhlIFRvbWNhdAorICogU2VydmxldENvbnRleHQgYXR0cmlidXRlIGZvciBpdHMgU2VydmxldENvbnRleHQgY2xhc3MKKyAqIGxvYWRlciwgaWYgdGhhdCBmYWlscywgaXQgdXNlcyB0aGUgcGFyZW50IGNsYXNzIGxvYWRlci4KKyAqIEluIGVpdGhlciBjYXNlLCBpdCBtdXN0IGJlIGEgVVJMQ2xhc3NMb2FkZXIuCisgKgorICogQGF1dGhvciBBbmlsIEsuIFZpamVuZHJhbgorICogQGF1dGhvciBIYXJpc2ggUHJhYmFuZGhhbQorICogQGF1dGhvciBSZW15IE1hdWNoZXJhdAorICogQGF1dGhvciBLaW4tbWFuIENodW5nCisgKiBAYXV0aG9yIEdsZW5uIE5pZWxzZW4KKyAqLworCitwdWJsaWMgY2xhc3MgSnNwU2VydmxldFdyYXBwZXIgeworCisgICAgLy8gTG9nZ2VyCisgICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEpzcFNlcnZsZXRXcmFwcGVyLmNsYXNzKTsKKworICAgIHByaXZhdGUgU2VydmxldCB0aGVTZXJ2bGV0OworICAgIHByaXZhdGUgU3RyaW5nIGpzcFVyaTsKKyAgICBwcml2YXRlIENsYXNzIHNlcnZsZXRDbGFzczsKKyAgICBwcml2YXRlIENsYXNzIHRhZ0hhbmRsZXJDbGFzczsKKyAgICBwcml2YXRlIEpzcENvbXBpbGF0aW9uQ29udGV4dCBjdHh0OworICAgIHByaXZhdGUgbG9uZyBhdmFpbGFibGUgPSAwTDsKKyAgICBwcml2YXRlIFNlcnZsZXRDb25maWcgY29uZmlnOworICAgIHByaXZhdGUgT3B0aW9ucyBvcHRpb25zOworICAgIHByaXZhdGUgYm9vbGVhbiBmaXJzdFRpbWUgPSB0cnVlOworICAgIHByaXZhdGUgYm9vbGVhbiByZWxvYWQgPSB0cnVlOworICAgIHByaXZhdGUgYm9vbGVhbiBpc1RhZ0ZpbGU7CisgICAgcHJpdmF0ZSBpbnQgdHJpcENvdW50OworICAgIHByaXZhdGUgSmFzcGVyRXhjZXB0aW9uIGNvbXBpbGVFeGNlcHRpb247CisgICAgcHJpdmF0ZSBsb25nIHNlcnZsZXRDbGFzc0xhc3RNb2RpZmllZFRpbWU7CisgICAgcHJpdmF0ZSBsb25nIGxhc3RNb2RpZmljYXRpb25UZXN0ID0gMEw7CisKKyAgICAvKgorICAgICAqIEpzcFNlcnZsZXRXcmFwcGVyIGZvciBKU1AgcGFnZXMuCisgICAgICovCisgICAgSnNwU2VydmxldFdyYXBwZXIoU2VydmxldENvbmZpZyBjb25maWcsIE9wdGlvbnMgb3B0aW9ucywgU3RyaW5nIGpzcFVyaSwKKyAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzRXJyb3JQYWdlLCBKc3BSdW50aW1lQ29udGV4dCByY3R4dCkKKyAgICAgICAgICAgIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCisJdGhpcy5pc1RhZ0ZpbGUgPSBmYWxzZTsKKyAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7CisgICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CisgICAgICAgIHRoaXMuanNwVXJpID0ganNwVXJpOworICAgICAgICBjdHh0ID0gbmV3IEpzcENvbXBpbGF0aW9uQ29udGV4dChqc3BVcmksIGlzRXJyb3JQYWdlLCBvcHRpb25zLAorCQkJCQkgY29uZmlnLmdldFNlcnZsZXRDb250ZXh0KCksCisJCQkJCSB0aGlzLCByY3R4dCk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBKc3BTZXJ2bGV0V3JhcHBlciBmb3IgdGFnIGZpbGVzLgorICAgICAqLworICAgIHB1YmxpYyBKc3BTZXJ2bGV0V3JhcHBlcihTZXJ2bGV0Q29udGV4dCBzZXJ2bGV0Q29udGV4dCwKKwkJCSAgICAgT3B0aW9ucyBvcHRpb25zLAorCQkJICAgICBTdHJpbmcgdGFnRmlsZVBhdGgsCisJCQkgICAgIFRhZ0luZm8gdGFnSW5mbywKKwkJCSAgICAgSnNwUnVudGltZUNvbnRleHQgcmN0eHQsCisJCQkgICAgIFVSTCB0YWdGaWxlSmFyVXJsKQorCSAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKworCXRoaXMuaXNUYWdGaWxlID0gdHJ1ZTsKKyAgICAgICAgdGhpcy5jb25maWcgPSBudWxsOwkvLyBub3QgdXNlZAorICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOworCXRoaXMuanNwVXJpID0gdGFnRmlsZVBhdGg7CisJdGhpcy50cmlwQ291bnQgPSAwOworICAgICAgICBjdHh0ID0gbmV3IEpzcENvbXBpbGF0aW9uQ29udGV4dChqc3BVcmksIHRhZ0luZm8sIG9wdGlvbnMsCisJCQkJCSBzZXJ2bGV0Q29udGV4dCwgdGhpcywgcmN0eHQsCisJCQkJCSB0YWdGaWxlSmFyVXJsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSnNwQ29tcGlsYXRpb25Db250ZXh0IGdldEpzcEVuZ2luZUNvbnRleHQoKSB7CisgICAgICAgIHJldHVybiBjdHh0OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFJlbG9hZChib29sZWFuIHJlbG9hZCkgeworICAgICAgICB0aGlzLnJlbG9hZCA9IHJlbG9hZDsKKyAgICB9CisKKyAgICBwdWJsaWMgU2VydmxldCBnZXRTZXJ2bGV0KCkKKyAgICAgICAgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIGlmIChyZWxvYWQpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgICAgIC8vIFN5bmNocm9uaXppbmcgb24ganN3IGVuYWJsZXMgc2ltdWx0YW5lb3VzIGxvYWRpbmcKKyAgICAgICAgICAgICAgICAvLyBvZiBkaWZmZXJlbnQgcGFnZXMsIGJ1dCBub3QgdGhlIHNhbWUgcGFnZS4KKyAgICAgICAgICAgICAgICBpZiAocmVsb2FkKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgdG8gbWFpbnRhaW4gdGhlIG9yaWdpbmFsIHByb3RvY29sLgorICAgICAgICAgICAgICAgICAgICBkZXN0cm95KCk7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2VydmxldENsYXNzID0gY3R4dC5sb2FkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGVTZXJ2bGV0ID0gKFNlcnZsZXQpIHNlcnZsZXRDbGFzcy5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoKCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGV4MSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBKYXNwZXJFeGNlcHRpb24oIGV4MSApOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoKCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGV4ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEphc3BlckV4Y2VwdGlvbiggZXggKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgdGhlU2VydmxldC5pbml0KGNvbmZpZyk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmaXJzdFRpbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN0eHQuZ2V0UnVudGltZUNvbnRleHQoKS5pbmNyZW1lbnRKc3BSZWxvYWRDb3VudCgpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcmVsb2FkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSAgICAKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGhlU2VydmxldDsKKyAgICB9CisKKyAgICBwdWJsaWMgU2VydmxldENvbnRleHQgZ2V0U2VydmxldENvbnRleHQoKSB7CisgICAgICAgIHJldHVybiBjb25maWcuZ2V0U2VydmxldENvbnRleHQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBjb21waWxhdGlvbiBleGNlcHRpb24gZm9yIHRoaXMgSnNwU2VydmxldFdyYXBwZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gamUgVGhlIGNvbXBpbGF0aW9uIGV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbXBpbGF0aW9uRXhjZXB0aW9uKEphc3BlckV4Y2VwdGlvbiBqZSkgeworICAgICAgICB0aGlzLmNvbXBpbGVFeGNlcHRpb24gPSBqZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBsYXN0LW1vZGlmaWVkIHRpbWUgb2YgdGhlIHNlcnZsZXQgY2xhc3MgZmlsZSBhc3NvY2lhdGVkIHdpdGgKKyAgICAgKiB0aGlzIEpzcFNlcnZsZXRXcmFwcGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGxhc3RNb2RpZmllZCBMYXN0LW1vZGlmaWVkIHRpbWUgb2Ygc2VydmxldCBjbGFzcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNlcnZsZXRDbGFzc0xhc3RNb2RpZmllZFRpbWUobG9uZyBsYXN0TW9kaWZpZWQpIHsKKyAgICAgICAgaWYgKHRoaXMuc2VydmxldENsYXNzTGFzdE1vZGlmaWVkVGltZSA8IGxhc3RNb2RpZmllZCkgeworICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VydmxldENsYXNzTGFzdE1vZGlmaWVkVGltZSA8IGxhc3RNb2RpZmllZCkgeworICAgICAgICAgICAgICAgICAgICB0aGlzLnNlcnZsZXRDbGFzc0xhc3RNb2RpZmllZFRpbWUgPSBsYXN0TW9kaWZpZWQ7CisgICAgICAgICAgICAgICAgICAgIHJlbG9hZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tcGlsZSAoaWYgbmVlZGVkKSBhbmQgbG9hZCBhIHRhZyBmaWxlCisgICAgICovCisgICAgcHVibGljIENsYXNzIGxvYWRUYWdGaWxlKCkgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChjdHh0LmlzUmVtb3ZlZCgpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbihqc3BVcmkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG9wdGlvbnMuZ2V0RGV2ZWxvcG1lbnQoKSB8fCBmaXJzdFRpbWUgKSB7CisgICAgICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdFRpbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0VGltZSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGN0eHQuY29tcGlsZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGNvbXBpbGVFeGNlcHRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBjb21waWxlRXhjZXB0aW9uOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHJlbG9hZCkgeworICAgICAgICAgICAgICAgIHRhZ0hhbmRsZXJDbGFzcyA9IGN0eHQubG9hZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBKYXNwZXJFeGNlcHRpb24oZXgpOworCX0KKworCXJldHVybiB0YWdIYW5kbGVyQ2xhc3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tcGlsZSBhbmQgbG9hZCBhIHByb3RvdHlwZSBmb3IgdGhlIFRhZyBmaWxlLiAgVGhpcyBpcyBuZWVkZWQKKyAgICAgKiB3aGVuIGNvbXBpbGluZyB0YWcgZmlsZXMgd2l0aCBjaXJjdWxhciBkZXBlbmRlbmNpZXMuICBBIHByb3RvdHBlCisgICAgICogKHNrZWxldG9uKSB3aXRoIG5vIGRlcGVuZGVuY2llcyBvbiBvdGhlciBvdGhlciB0YWcgZmlsZXMgaXMKKyAgICAgKiBnZW5lcmF0ZWQgYW5kIGNvbXBpbGVkLgorICAgICAqLworICAgIHB1YmxpYyBDbGFzcyBsb2FkVGFnRmlsZVByb3RvdHlwZSgpIHRocm93cyBKYXNwZXJFeGNlcHRpb24geworCisJY3R4dC5zZXRQcm90b3R5cGVNb2RlKHRydWUpOworCXRyeSB7CisJICAgIHJldHVybiBsb2FkVGFnRmlsZSgpOworCX0gZmluYWxseSB7CisJICAgIGN0eHQuc2V0UHJvdG90eXBlTW9kZShmYWxzZSk7CisJfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhIGxpc3Qgb2YgZmlsZXMgdGhhdCB0aGUgY3VycmVudCBwYWdlIGhhcyBzb3VyY2UgZGVwZW5kZW5jeSBvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0RGVwZW5kYW50cygpIHsKKwl0cnkgeworCSAgICBPYmplY3QgdGFyZ2V0OworCSAgICBpZiAoaXNUYWdGaWxlKSB7CisgICAgICAgICAgICAgICAgaWYgKHJlbG9hZCkgeworICAgICAgICAgICAgICAgICAgICB0YWdIYW5kbGVyQ2xhc3MgPSBjdHh0LmxvYWQoKTsKKyAgICAgICAgICAgICAgICB9CisJCXRhcmdldCA9IHRhZ0hhbmRsZXJDbGFzcy5uZXdJbnN0YW5jZSgpOworCSAgICB9IGVsc2UgeworCQl0YXJnZXQgPSBnZXRTZXJ2bGV0KCk7CisJICAgIH0KKwkgICAgaWYgKHRhcmdldCAhPSBudWxsICYmIHRhcmdldCBpbnN0YW5jZW9mIEpzcFNvdXJjZURlcGVuZGVudCkgeworCQlyZXR1cm4gKChKc3BTb3VyY2VEZXBlbmRlbnQpIHRhcmdldCkuZ2V0RGVwZW5kYW50cygpOworCSAgICB9CisJfSBjYXRjaCAoVGhyb3dhYmxlIGV4KSB7CisJfQorCXJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzVGFnRmlsZSgpIHsKKwlyZXR1cm4gdGhpcy5pc1RhZ0ZpbGU7CisgICAgfQorCisgICAgcHVibGljIGludCBpbmNUcmlwQ291bnQoKSB7CisJcmV0dXJuIHRyaXBDb3VudCsrOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZGVjVHJpcENvdW50KCkgeworCXJldHVybiB0cmlwQ291bnQtLTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXJ2aWNlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHByZWNvbXBpbGUpCisJICAgIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgaWYgKGN0eHQuaXNSZW1vdmVkKCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKGpzcFVyaSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgoYXZhaWxhYmxlID4gMEwpICYmIChhdmFpbGFibGUgPCBMb25nLk1BWF9WQUxVRSkpIHsKKyAgICAgICAgICAgICAgICByZXNwb25zZS5zZXREYXRlSGVhZGVyKCJSZXRyeS1BZnRlciIsIGF2YWlsYWJsZSk7CisgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yCisgICAgICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlLlNDX1NFUlZJQ0VfVU5BVkFJTEFCTEUsCisgICAgICAgICAgICAgICAgICAgICBMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgianNwLmVycm9yLnVuYXZhaWxhYmxlIikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogKDEpIENvbXBpbGUKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKG9wdGlvbnMuZ2V0RGV2ZWxvcG1lbnQoKSB8fCBmaXJzdFRpbWUgKSB7CisgICAgICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdFRpbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0VGltZSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgc2V0cyByZWxvYWQgdG8gdHJ1ZSwgaWYgbmVjZXNzYXJ5CisgICAgICAgICAgICAgICAgICAgIGN0eHQuY29tcGlsZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGNvbXBpbGVFeGNlcHRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAvLyBUaHJvdyBjYWNoZWQgY29tcGlsYXRpb24gZXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgIHRocm93IGNvbXBpbGVFeGNlcHRpb247CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogKDIpIChSZSlsb2FkIHNlcnZsZXQgY2xhc3MgZmlsZQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBnZXRTZXJ2bGV0KCk7CisKKyAgICAgICAgICAgIC8vIElmIGEgcGFnZSBpcyB0byBiZSBwcmVjb21waWxlZCBvbmx5LCByZXR1cm4uCisgICAgICAgICAgICBpZiAocHJlY29tcGlsZSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqICgzKSBTZXJ2aWNlIHJlcXVlc3QKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKHRoZVNlcnZsZXQgaW5zdGFuY2VvZiBTaW5nbGVUaHJlYWRNb2RlbCkgeworICAgICAgICAgICAgICAgLy8gc3luYyBvbiB0aGUgd3JhcHBlciBzbyB0aGF0IHRoZSBmcmVzaG5lc3MKKyAgICAgICAgICAgICAgIC8vIG9mIHRoZSBwYWdlIGlzIGRldGVybWluZWQgcmlnaHQgYmVmb3JlIHNlcnZpY2luZworICAgICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICAgICAgICAgdGhlU2VydmxldC5zZXJ2aWNlKHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRoZVNlcnZsZXQuc2VydmljZShyZXF1ZXN0LCByZXNwb25zZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBjYXRjaCAoVW5hdmFpbGFibGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIFN0cmluZyBpbmNsdWRlUmVxdWVzdFVyaSA9IChTdHJpbmcpCisgICAgICAgICAgICAgICAgcmVxdWVzdC5nZXRBdHRyaWJ1dGUoImphdmF4LnNlcnZsZXQuaW5jbHVkZS5yZXF1ZXN0X3VyaSIpOworICAgICAgICAgICAgaWYgKGluY2x1ZGVSZXF1ZXN0VXJpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGlzIGZpbGUgd2FzIGluY2x1ZGVkLiBUaHJvdyBhbiBleGNlcHRpb24gYXMKKyAgICAgICAgICAgICAgICAvLyBhIHJlc3BvbnNlLnNlbmRFcnJvcigpIHdpbGwgYmUgaWdub3JlZCBieSB0aGUKKyAgICAgICAgICAgICAgICAvLyBzZXJ2bGV0IGVuZ2luZS4KKyAgICAgICAgICAgICAgICB0aHJvdyBleDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW50IHVuYXZhaWxhYmxlU2Vjb25kcyA9IGV4LmdldFVuYXZhaWxhYmxlU2Vjb25kcygpOworICAgICAgICAgICAgICAgIGlmICh1bmF2YWlsYWJsZVNlY29uZHMgPD0gMCkgeworICAgICAgICAgICAgICAgICAgICB1bmF2YWlsYWJsZVNlY29uZHMgPSA2MDsgICAgICAgIC8vIEFyYml0cmFyeSBkZWZhdWx0CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGF2YWlsYWJsZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsKKyAgICAgICAgICAgICAgICAgICAgKHVuYXZhaWxhYmxlU2Vjb25kcyAqIDEwMDBMKTsKKyAgICAgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IKKyAgICAgICAgICAgICAgICAgICAgKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfU0VSVklDRV9VTkFWQUlMQUJMRSwgCisgICAgICAgICAgICAgICAgICAgICBleC5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIGN0eHQuaW5jcmVtZW50UmVtb3ZlZCgpOworICAgICAgICAgICAgU3RyaW5nIGluY2x1ZGVSZXF1ZXN0VXJpID0gKFN0cmluZykKKyAgICAgICAgICAgICAgICByZXF1ZXN0LmdldEF0dHJpYnV0ZSgiamF2YXguc2VydmxldC5pbmNsdWRlLnJlcXVlc3RfdXJpIik7CisgICAgICAgICAgICBpZiAoaW5jbHVkZVJlcXVlc3RVcmkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIFRoaXMgZmlsZSB3YXMgaW5jbHVkZWQuIFRocm93IGFuIGV4Y2VwdGlvbiBhcworICAgICAgICAgICAgICAgIC8vIGEgcmVzcG9uc2Uuc2VuZEVycm9yKCkgd2lsbCBiZSBpZ25vcmVkIGJ5IHRoZQorICAgICAgICAgICAgICAgIC8vIHNlcnZsZXQgZW5naW5lLgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uKGV4KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfTk9UX0ZPVU5ELCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXguZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaXNlKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcihMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgianNwLmVycm9yLmZpbGUubm90LmZvdW5kIiwKKwkJCQkJCSAgIGV4LmdldE1lc3NhZ2UoKSksCisJCQkgICAgICBleCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChTZXJ2bGV0RXhjZXB0aW9uIGV4KSB7CisJICAgIHRocm93IGV4OworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgZXg7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgZXg7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEphc3BlckV4Y2VwdGlvbihleCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkZXN0cm95KCkgeworICAgICAgICBpZiAodGhlU2VydmxldCAhPSBudWxsKSB7CisgICAgICAgICAgICB0aGVTZXJ2bGV0LmRlc3Ryb3koKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbGFzdE1vZGlmaWNhdGlvblRlc3QuCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0TGFzdE1vZGlmaWNhdGlvblRlc3QoKSB7CisgICAgICAgIHJldHVybiBsYXN0TW9kaWZpY2F0aW9uVGVzdDsKKyAgICB9CisgICAgLyoqCisgICAgICogQHBhcmFtIGxhc3RNb2RpZmljYXRpb25UZXN0IFRoZSBsYXN0TW9kaWZpY2F0aW9uVGVzdCB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TGFzdE1vZGlmaWNhdGlvblRlc3QobG9uZyBsYXN0TW9kaWZpY2F0aW9uVGVzdCkgeworICAgICAgICB0aGlzLmxhc3RNb2RpZmljYXRpb25UZXN0ID0gbGFzdE1vZGlmaWNhdGlvblRlc3Q7CisgICAgfQorICAgIAorfQpkaWZmIC0tZ2l0IGEvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3NlcnZsZXQvbWJlYW5zLWRlc2NyaXB0b3JzLnhtbCBiL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9zZXJ2bGV0L21iZWFucy1kZXNjcmlwdG9ycy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDkwYTgzMgotLS0gL2Rldi9udWxsCisrKyBiL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9zZXJ2bGV0L21iZWFucy1kZXNjcmlwdG9ycy54bWwKQEAgLTAsMCArMSwyMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8bWJlYW5zLWRlc2NyaXB0b3JzPgorCisgIDxtYmVhbiAgICAgICAgIG5hbWU9IkpzcE1vbml0b3IiCisgICAgICAgICAgZGVzY3JpcHRpb249IkpTUCBNb25pdG9yaW5nIgorICAgICAgICAgICAgICAgZG9tYWluPSJDYXRhbGluYSIKKyAgICAgICAgICAgICAgICBncm91cD0iTW9uaXRvcmluZyIKKyAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmFwYWNoZS5qYXNwZXIuc2VydmxldC5Kc3BTZXJ2bGV0Ij4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJqc3BDb3VudCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiBKU1BzIHRoYXQgaGF2ZSBiZWVuIGxvYWRlZCBpbnRvIGEgd2ViYXBwIgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiLz4KKworICAgIDxhdHRyaWJ1dGUgICBuYW1lPSJqc3BSZWxvYWRDb3VudCIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIG51bWJlciBvZiBKU1BzIHRoYXQgaGF2ZSBiZWVuIHJlbG9hZGVkIgorICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiLz4KKworICA8L21iZWFuPgorCis8L21iZWFucy1kZXNjcmlwdG9ycz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvdGFncGx1Z2lucy9qc3RsL0Nob29zZS5qYXZhIGIvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3RhZ3BsdWdpbnMvanN0bC9DaG9vc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGYzNTMyCi0tLSAvZGV2L251bGwKKysrIGIvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3RhZ3BsdWdpbnMvanN0bC9DaG9vc2UuamF2YQpAQCAtMCwwICsxLDMyIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYXNwZXIudGFncGx1Z2lucy5qc3RsOworCitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIuY29tcGlsZXIudGFncGx1Z2luLio7CisKK3B1YmxpYyBmaW5hbCBjbGFzcyBDaG9vc2UgaW1wbGVtZW50cyBUYWdQbHVnaW4geworCisgICAgcHVibGljIHZvaWQgZG9UYWcoVGFnUGx1Z2luQ29udGV4dCBjdHh0KSB7CisKKwkvLyBOb3QgbXVjaCB0byBkbyBoZXJlLCBtdWNoIG9mIHRoZSB3b3JrIHdpbGwgYmUgZG9uZSBpbiB0aGUKKwkvLyBjb250YWluaW5nIHRhZ3MsIDxjOndoZW4+IGFuZCA8YzpvdGhlcndpc2U+LgorCisJY3R4dC5nZW5lcmF0ZUJvZHkoKTsKKwkvLyBTZWUgY29tbWVudHMgaW4gV2hlbi5qYXZhIGZvciB0aGUgcmVhc29uICJ9IiBpcyBnZW5lcmF0ZWQgaGVyZS4KKwljdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgifSIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci90YWdwbHVnaW5zL2pzdGwvRm9yRWFjaC5qYXZhIGIvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3RhZ3BsdWdpbnMvanN0bC9Gb3JFYWNoLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI0Y2NjZQotLS0gL2Rldi9udWxsCisrKyBiL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci90YWdwbHVnaW5zL2pzdGwvRm9yRWFjaC5qYXZhCkBAIC0wLDAgKzEsMzQyIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYXNwZXIudGFncGx1Z2lucy5qc3RsOworCitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIuY29tcGlsZXIudGFncGx1Z2luLio7CisKK3B1YmxpYyBmaW5hbCBjbGFzcyBGb3JFYWNoIGltcGxlbWVudHMgVGFnUGx1Z2luIHsKKworICAgIHByaXZhdGUgYm9vbGVhbiBoYXNWYXIsIGhhc0JlZ2luLCBoYXNFbmQsIGhhc1N0ZXA7CisKKyAgICBwdWJsaWMgdm9pZCBkb1RhZyhUYWdQbHVnaW5Db250ZXh0IGN0eHQpIHsKKworCVN0cmluZyBpbmRleCA9IG51bGw7CisKKwlib29sZWFuIGhhc1ZhclN0YXR1cyA9IGN0eHQuaXNBdHRyaWJ1dGVTcGVjaWZpZWQoInZhclN0YXR1cyIpOworCWlmIChoYXNWYXJTdGF0dXMpIHsKKwkgICAgY3R4dC5kb250VXNlVGFnUGx1Z2luKCk7CisJICAgIHJldHVybjsKKwl9CisKKwloYXNWYXIgPSBjdHh0LmlzQXR0cmlidXRlU3BlY2lmaWVkKCJ2YXIiKTsKKwloYXNCZWdpbiA9IGN0eHQuaXNBdHRyaWJ1dGVTcGVjaWZpZWQoImJlZ2luIik7CisJaGFzRW5kID0gY3R4dC5pc0F0dHJpYnV0ZVNwZWNpZmllZCgiZW5kIik7CisJaGFzU3RlcCA9IGN0eHQuaXNBdHRyaWJ1dGVTcGVjaWZpZWQoInN0ZXAiKTsKKworCWJvb2xlYW4gaGFzSXRlbXMgPSBjdHh0LmlzQXR0cmlidXRlU3BlY2lmaWVkKCJpdGVtcyIpOworCWlmIChoYXNJdGVtcykgeworCSAgICBkb0NvbGxlY3Rpb24oY3R4dCk7CisJICAgIHJldHVybjsKKwl9CisKKwkvLyBXZSBtdXN0IGhhdmUgYSBiZWdpbiBhbmQgZW5kIGF0dHJpYnV0ZXMKKwlpbmRleCA9IGN0eHQuZ2V0VGVtcG9yYXJ5VmFyaWFibGVOYW1lKCk7CisJY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoImZvciAoaW50ICIgKyBpbmRleCArICIgPSAiKTsKKwljdHh0LmdlbmVyYXRlQXR0cmlidXRlKCJiZWdpbiIpOworCWN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCI7ICIgKyBpbmRleCArICIgPD0gIik7CisJY3R4dC5nZW5lcmF0ZUF0dHJpYnV0ZSgiZW5kIik7CisJaWYgKGhhc1N0ZXApIHsKKwkgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIjsgIiArIGluZGV4ICsgIis9Iik7CisJICAgIGN0eHQuZ2VuZXJhdGVBdHRyaWJ1dGUoInN0ZXAiKTsKKwkgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIikgeyIpOworCX0KKwllbHNlIHsKKwkgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIjsgIiArIGluZGV4ICsgIisrKSB7Iik7CisJfQorCisJLy8gSWYgdmFyIGlzIHNwZWNpZmllZCBhbmQgdGhlIGJvZHkgY29udGFpbnMgYW4gRUwsIHRoZW4gc3ljbgorCS8vIHRoZSB2YXIgYXR0cmlidXRlCisJaWYgKGhhc1ZhciAvKiAmJiBjdHh0Lmhhc0VMKCkgKi8pIHsKKwkgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIl9qc3B4X3BhZ2VfY29udGV4dC5zZXRBdHRyaWJ1dGUoIik7CisJICAgIGN0eHQuZ2VuZXJhdGVBdHRyaWJ1dGUoInZhciIpOworCSAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiLCBTdHJpbmcudmFsdWVPZigiICsgaW5kZXggKyAiKSk7Iik7CisJfQorCWN0eHQuZ2VuZXJhdGVCb2R5KCk7CisJY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIn0iKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZSBjb2RlcyBmb3IgQ29sbGVjdGlvbnMKKyAgICAgKiBUaGUgcHNldWRvIGNvZGUgaXM6CisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGRvQ29sbGVjdGlvbihUYWdQbHVnaW5Db250ZXh0IGN0eHQpIHsKKworCWN0eHQuZ2VuZXJhdGVJbXBvcnQoImphdmEudXRpbC4qIik7CisJZ2VuZXJhdGVJdGVyYXRvcnMoY3R4dCk7CisKKyAgICAgICAgU3RyaW5nIGl0ZW1zViA9IGN0eHQuZ2V0VGVtcG9yYXJ5VmFyaWFibGVOYW1lKCk7CisgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCJPYmplY3QgIiArIGl0ZW1zViArICI9ICIpOworICAgICAgICBjdHh0LmdlbmVyYXRlQXR0cmlidXRlKCJpdGVtcyIpOworICAgICAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiOyIpOworCQorCVN0cmluZyBpbmRleFY9bnVsbCwgYmVnaW5WPW51bGwsIGVuZFY9bnVsbCwgc3RlcFY9bnVsbDsKKwlpZiAoaGFzQmVnaW4pIHsKKwkgICAgYmVnaW5WID0gY3R4dC5nZXRUZW1wb3JhcnlWYXJpYWJsZU5hbWUoKTsKKwkgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoImludCAiICsgYmVnaW5WICsgIiA9ICIpOworCSAgICBjdHh0LmdlbmVyYXRlQXR0cmlidXRlKCJiZWdpbiIpOworCSAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiOyIpOworCX0KKwlpZiAoaGFzRW5kKSB7CisJICAgIGluZGV4ViA9IGN0eHQuZ2V0VGVtcG9yYXJ5VmFyaWFibGVOYW1lKCk7CisJICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCJpbnQgIiArIGluZGV4ViArICIgPSAwOyIpOworCSAgICBlbmRWID0gY3R4dC5nZXRUZW1wb3JhcnlWYXJpYWJsZU5hbWUoKTsKKwkgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoImludCAiICsgZW5kViArICIgPSAiKTsKKwkgICAgY3R4dC5nZW5lcmF0ZUF0dHJpYnV0ZSgiZW5kIik7CisJICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCI7Iik7CisJfQorCWlmIChoYXNTdGVwKSB7CisJICAgIHN0ZXBWID0gY3R4dC5nZXRUZW1wb3JhcnlWYXJpYWJsZU5hbWUoKTsKKwkgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoImludCAiICsgc3RlcFYgKyAiID0gIik7CisJICAgIGN0eHQuZ2VuZXJhdGVBdHRyaWJ1dGUoInN0ZXAiKTsKKwkgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIjsiKTsKKwl9CisKKyAgICAgICAgU3RyaW5nIGl0ZXJWID0gY3R4dC5nZXRUZW1wb3JhcnlWYXJpYWJsZU5hbWUoKTsKKyAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIkl0ZXJhdG9yICIgKyBpdGVyViArICIgPSBudWxsOyIpOworCS8vIE9iamVjdFtdCisJY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoImlmICgiICsgaXRlbXNWICsgIiBpbnN0YW5jZW9mIE9iamVjdFtdKSIpOworCWN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKGl0ZXJWICsgIj10b0l0ZXJhdG9yKChPYmplY3RbXSkiICsgaXRlbXNWICsgIik7Iik7CisJLy8gYm9vbGVhbltdCisJY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoImVsc2UgaWYgKCIgKyBpdGVtc1YgKyAiIGluc3RhbmNlb2YgYm9vbGVhbltdKSIpOworCWN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKGl0ZXJWICsgIj10b0l0ZXJhdG9yKChib29sZWFuW10pIiArIGl0ZW1zViArICIpOyIpOworCS8vIGJ5dGVbXQorCWN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCJlbHNlIGlmICgiICsgaXRlbXNWICsgIiBpbnN0YW5jZW9mIGJ5dGVbXSkiKTsKKwljdHh0LmdlbmVyYXRlSmF2YVNvdXJjZShpdGVyViArICI9dG9JdGVyYXRvcigoYnl0ZVtdKSIgKyBpdGVtc1YgKyAiKTsiKTsKKwkvLyBjaGFyW10KKwljdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiZWxzZSBpZiAoIiArIGl0ZW1zViArICIgaW5zdGFuY2VvZiBjaGFyW10pIik7CisJY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoaXRlclYgKyAiPXRvSXRlcmF0b3IoKGNoYXJbXSkiICsgaXRlbXNWICsgIik7Iik7CisJLy8gc2hvcnRbXQorCWN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCJlbHNlIGlmICgiICsgaXRlbXNWICsgIiBpbnN0YW5jZW9mIHNob3J0W10pIik7CisJY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoaXRlclYgKyAiPXRvSXRlcmF0b3IoKHNob3J0W10pIiArIGl0ZW1zViArICIpOyIpOworCS8vIGludFtdCisJY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoImVsc2UgaWYgKCIgKyBpdGVtc1YgKyAiIGluc3RhbmNlb2YgaW50W10pIik7CisJY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoaXRlclYgKyAiPXRvSXRlcmF0b3IoKGludFtdKSIgKyBpdGVtc1YgKyAiKTsiKTsKKwkvLyBsb25nW10KKwljdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiZWxzZSBpZiAoIiArIGl0ZW1zViArICIgaW5zdGFuY2VvZiBsb25nW10pIik7CisJY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoaXRlclYgKyAiPXRvSXRlcmF0b3IoKGxvbmdbXSkiICsgaXRlbXNWICsgIik7Iik7CisJLy8gZmxvYXRbXQorCWN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCJlbHNlIGlmICgiICsgaXRlbXNWICsgIiBpbnN0YW5jZW9mIGZsb2F0W10pIik7CisJY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoaXRlclYgKyAiPXRvSXRlcmF0b3IoKGZsb2F0W10pIiArIGl0ZW1zViArICIpOyIpOworCS8vIGRvdWJsZVtdCisJY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoImVsc2UgaWYgKCIgKyBpdGVtc1YgKyAiIGluc3RhbmNlb2YgZG91YmxlW10pIik7CisJY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoaXRlclYgKyAiPXRvSXRlcmF0b3IoKGRvdWJsZVtdKSIgKyBpdGVtc1YgKyAiKTsiKTsKKworICAgICAgICAvLyBDb2xsZWN0aW9uCisgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCJlbHNlIGlmICgiICsgaXRlbXNWICsgIiBpbnN0YW5jZW9mIENvbGxlY3Rpb24pIik7CisgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKGl0ZXJWICsgIj0oKENvbGxlY3Rpb24pIiArIGl0ZW1zViArICIpLml0ZXJhdG9yKCk7Iik7CisKKyAgICAgICAgLy8gSXRlcmF0b3IKKyAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoImVsc2UgaWYgKCIgKyBpdGVtc1YgKyAiIGluc3RhbmNlb2YgSXRlcmF0b3IpIik7CisgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKGl0ZXJWICsgIj0oSXRlcmF0b3IpIiArIGl0ZW1zViArICI7Iik7CisKKwkvLyBFbnVtZXJhdGlvbgorCWN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCJlbHNlIGlmICgiICsgaXRlbXNWICsgIiBpbnN0YW5jZW9mIEVudW1lcmF0aW9uKSIpOworCWN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKGl0ZXJWICsgIj10b0l0ZXJhdG9yKChFbnVtZXJhdGlvbikiICsgaXRlbXNWICsgIik7Iik7CisKKyAgICAgICAgLy8gTWFwCisgICAgICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCJlbHNlIGlmICgiICsgaXRlbXNWICsgIiBpbnN0YW5jZW9mIE1hcCkiKTsKKyAgICAgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoaXRlclYgKyAiPSgoTWFwKSIgKyBpdGVtc1YgKyAiKS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Iik7CisKKwlpZiAoaGFzQmVnaW4pIHsKKyAgICAgICAgICAgIFN0cmluZyB0ViA9IGN0eHQuZ2V0VGVtcG9yYXJ5VmFyaWFibGVOYW1lKCk7CisJICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCJmb3IgKGludCAiICsgdFYgKyAiPSIgKyBiZWdpblYgKyAiOyIgKworCQkJdFYgKyAiPjAgJiYgIiArIGl0ZXJWICsgIi5oYXNOZXh0KCk7ICIgKworCQkJdFYgKyAiLS0pIik7CisJICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKGl0ZXJWICsgIi5uZXh0KCk7Iik7CisJfQorCisJY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIndoaWxlICgiICsgaXRlclYgKyAiLmhhc05leHQoKSl7Iik7CisJaWYgKGhhc1ZhcikgeworCSAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiX2pzcHhfcGFnZV9jb250ZXh0LnNldEF0dHJpYnV0ZSgiKTsKKwkgICAgY3R4dC5nZW5lcmF0ZUF0dHJpYnV0ZSgidmFyIik7CisJICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCIsICIgKyBpdGVyViArICIubmV4dCgpKTsiKTsKKwl9CisKKwljdHh0LmdlbmVyYXRlQm9keSgpOworCisJaWYgKGhhc1N0ZXApIHsKKwkgICAgU3RyaW5nIHRWID0gY3R4dC5nZXRUZW1wb3JhcnlWYXJpYWJsZU5hbWUoKTsKKwkgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoImZvciAoaW50ICIgKyB0ViArICI9IiArIHN0ZXBWICsgIi0xOyIgKworCQkJdFYgKyAiPjAgJiYgIiArIGl0ZXJWICsgIi5oYXNOZXh0KCk7ICIgKworCQkJdFYgKyAiLS0pIik7CisJICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKGl0ZXJWICsgIi5uZXh0KCk7Iik7CisJfQorCWlmIChoYXNFbmQpIHsKKwkgICAgaWYgKGhhc1N0ZXApIHsKKwkJY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoaW5kZXhWICsgIis9IiArIHN0ZXBWICsgIjsiKTsKKwkgICAgfQorCSAgICBlbHNlIHsKKwkJY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoaW5kZXhWICsgIisrOyIpOworCSAgICB9CisJICAgIGlmIChoYXNCZWdpbikgeworCQljdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiaWYoIiArIGJlZ2luViArICIrIiArIGluZGV4ViArCisJCQkiPiIrIGVuZFYgKyAiKSIpOworCSAgICB9CisJICAgIGVsc2UgeworCQljdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiaWYoIiArIGluZGV4ViArICI+IiArIGVuZFYgKyAiKSIpOworCSAgICB9CisJICAgIGN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCJicmVhazsiKTsKKwl9CisJY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIn0iKTsJLy8gd2hpbGUKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZSBpdGVyYXRvcnMgZm9yIGRhdGEgdHlwZXMgc3VwcG9ydGVkIGluIGl0ZW1zCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGdlbmVyYXRlSXRlcmF0b3JzKFRhZ1BsdWdpbkNvbnRleHQgY3R4dCkgeworCisJLy8gT2JqZWN0W10KKwljdHh0LmdlbmVyYXRlRGVjbGFyYXRpb24oIk9iamVjdEFycmF5SXRlcmF0b3IiLCAKKwkgICAgInByaXZhdGUgSXRlcmF0b3IgdG9JdGVyYXRvcihmaW5hbCBPYmplY3RbXSBhKXtcbiIgKworCSAgICAiICByZXR1cm4gKG5ldyBJdGVyYXRvcigpIHtcbiIgKworCSAgICAiICAgIGludCBpbmRleD0wO1xuIiArCisJICAgICIgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHtcbiIgKworCSAgICAiICAgICAgcmV0dXJuIGluZGV4IDwgYS5sZW5ndGg7fVxuIiArCisJICAgICIgICAgcHVibGljIE9iamVjdCBuZXh0KCkge1xuIiArCisJICAgICIgICAgICByZXR1cm4gYVtpbmRleCsrXTt9XG4iICsKKwkgICAgIiAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7fVxuIiArCisJICAgICIgIH0pO1xuIiArCisJICAgICJ9IgorCSk7CisKKwkvLyBib29sZWFuW10KKwljdHh0LmdlbmVyYXRlRGVjbGFyYXRpb24oImJvb2xlYW5BcnJheUl0ZXJhdG9yIiwgCisJICAgICJwcml2YXRlIEl0ZXJhdG9yIHRvSXRlcmF0b3IoZmluYWwgYm9vbGVhbltdIGEpe1xuIiArCisJICAgICIgIHJldHVybiAobmV3IEl0ZXJhdG9yKCkge1xuIiArCisJICAgICIgICAgaW50IGluZGV4PTA7XG4iICsKKwkgICAgIiAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkge1xuIiArCisJICAgICIgICAgICByZXR1cm4gaW5kZXggPCBhLmxlbmd0aDt9XG4iICsKKwkgICAgIiAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSB7XG4iICsKKwkgICAgIiAgICAgIHJldHVybiBuZXcgQm9vbGVhbihhW2luZGV4KytdKTt9XG4iICsKKwkgICAgIiAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7fVxuIiArCisJICAgICIgIH0pO1xuIiArCisJICAgICJ9IgorCSk7CisKKwkvLyBieXRlW10KKwljdHh0LmdlbmVyYXRlRGVjbGFyYXRpb24oImJ5dGVBcnJheUl0ZXJhdG9yIiwgCisJICAgICJwcml2YXRlIEl0ZXJhdG9yIHRvSXRlcmF0b3IoZmluYWwgYnl0ZVtdIGEpe1xuIiArCisJICAgICIgIHJldHVybiAobmV3IEl0ZXJhdG9yKCkge1xuIiArCisJICAgICIgICAgaW50IGluZGV4PTA7XG4iICsKKwkgICAgIiAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkge1xuIiArCisJICAgICIgICAgICByZXR1cm4gaW5kZXggPCBhLmxlbmd0aDt9XG4iICsKKwkgICAgIiAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSB7XG4iICsKKwkgICAgIiAgICAgIHJldHVybiBuZXcgQnl0ZShhW2luZGV4KytdKTt9XG4iICsKKwkgICAgIiAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7fVxuIiArCisJICAgICIgIH0pO1xuIiArCisJICAgICJ9IgorCSk7CisKKwkvLyBjaGFyW10KKwljdHh0LmdlbmVyYXRlRGVjbGFyYXRpb24oImNoYXJBcnJheUl0ZXJhdG9yIiwgCisJICAgICJwcml2YXRlIEl0ZXJhdG9yIHRvSXRlcmF0b3IoZmluYWwgY2hhcltdIGEpe1xuIiArCisJICAgICIgIHJldHVybiAobmV3IEl0ZXJhdG9yKCkge1xuIiArCisJICAgICIgICAgaW50IGluZGV4PTA7XG4iICsKKwkgICAgIiAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkge1xuIiArCisJICAgICIgICAgICByZXR1cm4gaW5kZXggPCBhLmxlbmd0aDt9XG4iICsKKwkgICAgIiAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSB7XG4iICsKKwkgICAgIiAgICAgIHJldHVybiBuZXcgQ2hhcmFjdGVyKGFbaW5kZXgrK10pO31cbiIgKworCSAgICAiICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHt9XG4iICsKKwkgICAgIiAgfSk7XG4iICsKKwkgICAgIn0iCisJKTsKKworCS8vIHNob3J0W10KKwljdHh0LmdlbmVyYXRlRGVjbGFyYXRpb24oInNob3J0QXJyYXlJdGVyYXRvciIsIAorCSAgICAicHJpdmF0ZSBJdGVyYXRvciB0b0l0ZXJhdG9yKGZpbmFsIHNob3J0W10gYSl7XG4iICsKKwkgICAgIiAgcmV0dXJuIChuZXcgSXRlcmF0b3IoKSB7XG4iICsKKwkgICAgIiAgICBpbnQgaW5kZXg9MDtcbiIgKworCSAgICAiICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7XG4iICsKKwkgICAgIiAgICAgIHJldHVybiBpbmRleCA8IGEubGVuZ3RoO31cbiIgKworCSAgICAiICAgIHB1YmxpYyBPYmplY3QgbmV4dCgpIHtcbiIgKworCSAgICAiICAgICAgcmV0dXJuIG5ldyBTaG9ydChhW2luZGV4KytdKTt9XG4iICsKKwkgICAgIiAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7fVxuIiArCisJICAgICIgIH0pO1xuIiArCisJICAgICJ9IgorCSk7CisKKwkvLyBpbnRbXQorCWN0eHQuZ2VuZXJhdGVEZWNsYXJhdGlvbigiaW50QXJyYXlJdGVyYXRvciIsIAorCSAgICAicHJpdmF0ZSBJdGVyYXRvciB0b0l0ZXJhdG9yKGZpbmFsIGludFtdIGEpe1xuIiArCisJICAgICIgIHJldHVybiAobmV3IEl0ZXJhdG9yKCkge1xuIiArCisJICAgICIgICAgaW50IGluZGV4PTA7XG4iICsKKwkgICAgIiAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkge1xuIiArCisJICAgICIgICAgICByZXR1cm4gaW5kZXggPCBhLmxlbmd0aDt9XG4iICsKKwkgICAgIiAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSB7XG4iICsKKwkgICAgIiAgICAgIHJldHVybiBuZXcgSW50ZWdlcihhW2luZGV4KytdKTt9XG4iICsKKwkgICAgIiAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7fVxuIiArCisJICAgICIgIH0pO1xuIiArCisJICAgICJ9IgorCSk7CisKKwkvLyBsb25nW10KKwljdHh0LmdlbmVyYXRlRGVjbGFyYXRpb24oImxvbmdBcnJheUl0ZXJhdG9yIiwgCisJICAgICJwcml2YXRlIEl0ZXJhdG9yIHRvSXRlcmF0b3IoZmluYWwgbG9uZ1tdIGEpe1xuIiArCisJICAgICIgIHJldHVybiAobmV3IEl0ZXJhdG9yKCkge1xuIiArCisJICAgICIgICAgaW50IGluZGV4PTA7XG4iICsKKwkgICAgIiAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkge1xuIiArCisJICAgICIgICAgICByZXR1cm4gaW5kZXggPCBhLmxlbmd0aDt9XG4iICsKKwkgICAgIiAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSB7XG4iICsKKwkgICAgIiAgICAgIHJldHVybiBuZXcgTG9uZyhhW2luZGV4KytdKTt9XG4iICsKKwkgICAgIiAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7fVxuIiArCisJICAgICIgIH0pO1xuIiArCisJICAgICJ9IgorCSk7CisKKwkvLyBmbG9hdFtdCisJY3R4dC5nZW5lcmF0ZURlY2xhcmF0aW9uKCJmbG9hdEFycmF5SXRlcmF0b3IiLAorCSAgICAicHJpdmF0ZSBJdGVyYXRvciB0b0l0ZXJhdG9yKGZpbmFsIGZsb2F0W10gYSl7XG4iICsKKwkgICAgIiAgcmV0dXJuIChuZXcgSXRlcmF0b3IoKSB7XG4iICsKKwkgICAgIiAgICBpbnQgaW5kZXg9MDtcbiIgKworCSAgICAiICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7XG4iICsKKwkgICAgIiAgICAgIHJldHVybiBpbmRleCA8IGEubGVuZ3RoO31cbiIgKworCSAgICAiICAgIHB1YmxpYyBPYmplY3QgbmV4dCgpIHtcbiIgKworCSAgICAiICAgICAgcmV0dXJuIG5ldyBGbG9hdChhW2luZGV4KytdKTt9XG4iICsKKwkgICAgIiAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7fVxuIiArCisJICAgICIgIH0pO1xuIiArCisJICAgICJ9IgorCSk7CisKKwkvLyBkb3VibGVbXQorCWN0eHQuZ2VuZXJhdGVEZWNsYXJhdGlvbigiZG91YmxlQXJyYXlJdGVyYXRvciIsCisJICAgICJwcml2YXRlIEl0ZXJhdG9yIHRvSXRlcmF0b3IoZmluYWwgZG91YmxlW10gYSl7XG4iICsKKwkgICAgIiAgcmV0dXJuIChuZXcgSXRlcmF0b3IoKSB7XG4iICsKKwkgICAgIiAgICBpbnQgaW5kZXg9MDtcbiIgKworCSAgICAiICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7XG4iICsKKwkgICAgIiAgICAgIHJldHVybiBpbmRleCA8IGEubGVuZ3RoO31cbiIgKworCSAgICAiICAgIHB1YmxpYyBPYmplY3QgbmV4dCgpIHtcbiIgKworCSAgICAiICAgICAgcmV0dXJuIG5ldyBEb3VibGUoYVtpbmRleCsrXSk7fVxuIiArCisJICAgICIgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkge31cbiIgKworCSAgICAiICB9KTtcbiIgKworCSAgICAifSIKKwkpOworCisJLy8gRW51bWVyYXRpb24KKwljdHh0LmdlbmVyYXRlRGVjbGFyYXRpb24oImVudW1JdGVyYXRvciIsCisJICAgICJwcml2YXRlIEl0ZXJhdG9yIHRvSXRlcmF0b3IoZmluYWwgRW51bWVyYXRpb24gZSl7XG4iICsKKwkgICAgIiAgcmV0dXJuIChuZXcgSXRlcmF0b3IoKSB7XG4iICsKKwkgICAgIiAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkge1xuIiArCisJICAgICIgICAgICByZXR1cm4gZS5oYXNNb3JlRWxlbWVudHMoKTt9XG4iICsKKwkgICAgIiAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSB7XG4iICsKKwkgICAgIiAgICAgIHJldHVybiBlLm5leHRFbGVtZW50KCk7fVxuIiArCisJICAgICIgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkge31cbiIgKworCSAgICAiICB9KTtcbiIgKworCSAgICAifSIKKwkpOworCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3RhZ3BsdWdpbnMvanN0bC9JZi5qYXZhIGIvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3RhZ3BsdWdpbnMvanN0bC9JZi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ODI3OGMKLS0tIC9kZXYvbnVsbAorKysgYi9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvdGFncGx1Z2lucy9qc3RsL0lmLmphdmEKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFzcGVyLnRhZ3BsdWdpbnMuanN0bDsKKworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLmNvbXBpbGVyLnRhZ3BsdWdpbi4qOworCitwdWJsaWMgZmluYWwgY2xhc3MgSWYgaW1wbGVtZW50cyBUYWdQbHVnaW4geworCisgICAgcHVibGljIHZvaWQgZG9UYWcoVGFnUGx1Z2luQ29udGV4dCBjdHh0KSB7CisJU3RyaW5nIGNvbmRWID0gY3R4dC5nZXRUZW1wb3JhcnlWYXJpYWJsZU5hbWUoKTsKKwljdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiYm9vbGVhbiAiICsgY29uZFYgKyAiPSIpOworCWN0eHQuZ2VuZXJhdGVBdHRyaWJ1dGUoInRlc3QiKTsKKwljdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiOyIpOworCWlmIChjdHh0LmlzQXR0cmlidXRlU3BlY2lmaWVkKCJ2YXIiKSkgeworCSAgICBTdHJpbmcgc2NvcGUgPSAiUGFnZUNvbnRleHQuUEFHRV9TQ09QRSI7CisJICAgIGlmIChjdHh0LmlzQXR0cmlidXRlU3BlY2lmaWVkKCJzY29wZSIpKSB7CisJCVN0cmluZyBzY29wZVN0ciA9IGN0eHQuZ2V0Q29uc3RhbnRBdHRyaWJ1dGUoInNjb3BlIik7CisJCWlmICgicmVxdWVzdCIuZXF1YWxzKHNjb3BlU3RyKSkgeworCQkgICAgc2NvcGUgPSAiUGFnZUNvbnRleHQuUkVRVUVTVF9TQ09QRSI7CisJCX0gZWxzZSBpZiAoInNlc3Npb24iLmVxdWFscyhzY29wZVN0cikpIHsKKwkJICAgIHNjb3BlID0gIlBhZ2VDb250ZXh0LlNFU1NJT05fU0NPUEUiOworCQl9IGVsc2UgaWYgKCJhcHBsaWNhdGlvbiIuZXF1YWxzKHNjb3BlU3RyKSkgeworCQkgICAgc2NvcGUgPSAiUGFnZUNvbnRleHQuQVBQTElDQVRJT05fU0NPUEUiOworCQl9CisJICAgIH0KKwkgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIl9qc3B4X3BhZ2VfY29udGV4dC5zZXRBdHRyaWJ1dGUoIik7CisJICAgIGN0eHQuZ2VuZXJhdGVBdHRyaWJ1dGUoInZhciIpOworCSAgICBjdHh0LmdlbmVyYXRlSmF2YVNvdXJjZSgiLCBuZXcgQm9vbGVhbigiICsgY29uZFYgKyAiKSwiICsgc2NvcGUgKyAiKTsiKTsKKwl9CisJY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoImlmICgiICsgY29uZFYgKyAiKXsiKTsKKwljdHh0LmdlbmVyYXRlQm9keSgpOworCWN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCJ9Iik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3RhZ3BsdWdpbnMvanN0bC9PdGhlcndpc2UuamF2YSBiL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci90YWdwbHVnaW5zL2pzdGwvT3RoZXJ3aXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IwNzFkMwotLS0gL2Rldi9udWxsCisrKyBiL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci90YWdwbHVnaW5zL2pzdGwvT3RoZXJ3aXNlLmphdmEKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFzcGVyLnRhZ3BsdWdpbnMuanN0bDsKKworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLmNvbXBpbGVyLnRhZ3BsdWdpbi4qOworCitwdWJsaWMgZmluYWwgY2xhc3MgT3RoZXJ3aXNlIGltcGxlbWVudHMgVGFnUGx1Z2luIHsKKworICAgIHB1YmxpYyB2b2lkIGRvVGFnKFRhZ1BsdWdpbkNvbnRleHQgY3R4dCkgeworCisJLy8gU2VlIFdoZW4uamF2YSBmb3IgdGhlIHJlYXNvbiB3aGV5ICJ9IiBpcyBuZWVkIGF0IHRoZSBiZWdpbm5nIGFuZAorCS8vIG5vdCBhdCB0aGUgZW5kLgorCWN0eHQuZ2VuZXJhdGVKYXZhU291cmNlKCJ9IGVsc2UgeyIpOworCWN0eHQuZ2VuZXJhdGVCb2R5KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3RhZ3BsdWdpbnMvanN0bC9XaGVuLmphdmEgYi9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvdGFncGx1Z2lucy9qc3RsL1doZW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmUzZDk0Ci0tLSAvZGV2L251bGwKKysrIGIvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3RhZ3BsdWdpbnMvanN0bC9XaGVuLmphdmEKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFzcGVyLnRhZ3BsdWdpbnMuanN0bDsKKworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLmNvbXBpbGVyLnRhZ3BsdWdpbi4qOworCitwdWJsaWMgZmluYWwgY2xhc3MgV2hlbiBpbXBsZW1lbnRzIFRhZ1BsdWdpbiB7CisKKyAgICBwdWJsaWMgdm9pZCBkb1RhZyhUYWdQbHVnaW5Db250ZXh0IGN0eHQpIHsKKwkvLyBHZXQgdGhlIHBhcmVudCBjb250ZXh0IHRvIGRldGVybWluZSBpZiB0aGlzIGlzIHRoZSBmaXJzdCA8Yzp3aGVuPgorCVRhZ1BsdWdpbkNvbnRleHQgcGFyZW50Q29udGV4dCA9IGN0eHQuZ2V0UGFyZW50Q29udGV4dCgpOworCWlmIChwYXJlbnRDb250ZXh0ID09IG51bGwpIHsKKwkgICAgY3R4dC5kb250VXNlVGFnUGx1Z2luKCk7CisJICAgIHJldHVybjsKKwl9CisKKwlpZiAoInRydWUiLmVxdWFscyhwYXJlbnRDb250ZXh0LmdldFBsdWdpbkF0dHJpYnV0ZSgiaGFzQmVlbkhlcmUiKSkpIHsKKwkgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIn0gZWxzZSBpZigiKTsKKwkgICAgLy8gU2VlIGNvbW1lbnQgYmVsb3cgZm9yIHRoZSByZWFzb24gd2UgZ2VuZXJhdGUgdGhlIGV4dHJhICJ9IiBoZXJlLgorCX0KKwllbHNlIHsKKwkgICAgY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoImlmKCIpOworCSAgICBwYXJlbnRDb250ZXh0LnNldFBsdWdpbkF0dHJpYnV0ZSgiaGFzQmVlbkhlcmUiLCAidHJ1ZSIpOworCX0KKwljdHh0LmdlbmVyYXRlQXR0cmlidXRlKCJ0ZXN0Iik7CisJY3R4dC5nZW5lcmF0ZUphdmFTb3VyY2UoIil7Iik7CisJY3R4dC5nZW5lcmF0ZUJvZHkoKTsKKworCS8vIFdlIGRvbid0IGdlbmVyYXRlIHRoZSBjbG9zaW5nICJ9IiBmb3IgdGhlICJpZiIgaGVyZSBiZWNhdXNlIHRoZXJlCisJLy8gbWF5IGJlIHdoaXRlc3BhY2VzIGluIGJldHdlZW4gPGM6d2hlbj4ncy4gIEluc3RlYWQgd2UgZGVsYXkKKwkvLyBnZW5lcmF0aW5nIGl0IHVudGlsIHRoZSBuZXh0IDxjOndoZW4+IG9yIDxjOm90aGVyd2lzZT4gb3IKKwkvLyA8YzpjaG9vc2U+CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3RhZ3BsdWdpbnMvanN0bC90YWdQbHVnaW5zLnhtbCBiL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci90YWdwbHVnaW5zL2pzdGwvdGFnUGx1Z2lucy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU3NmM2NwotLS0gL2Rldi9udWxsCisrKyBiL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci90YWdwbHVnaW5zL2pzdGwvdGFnUGx1Z2lucy54bWwKQEAgLTAsMCArMSwyMiBAQAorPHRhZy1wbHVnaW5zPgorICA8dGFnLXBsdWdpbj4KKyAgICA8dGFnLWNsYXNzPm9yZy5hcGFjaGUudGFnbGlicy5zdGFuZGFyZC50YWcucnQuY29yZS5JZlRhZzwvdGFnLWNsYXNzPgorICAgIDxwbHVnaW4tY2xhc3M+b3JnLmFwYWNoZS5qYXNwZXIudGFncGx1Z2lucy5qc3RsLklmPC9wbHVnaW4tY2xhc3M+CisgIDwvdGFnLXBsdWdpbj4KKyAgPHRhZy1wbHVnaW4+CisgICAgPHRhZy1jbGFzcz5vcmcuYXBhY2hlLnRhZ2xpYnMuc3RhbmRhcmQudGFnLmNvbW1vbi5jb3JlLkNob29zZVRhZzwvdGFnLWNsYXNzPgorICAgIDxwbHVnaW4tY2xhc3M+b3JnLmFwYWNoZS5qYXNwZXIudGFncGx1Z2lucy5qc3RsLkNob29zZTwvcGx1Z2luLWNsYXNzPgorICA8L3RhZy1wbHVnaW4+CisgIDx0YWctcGx1Z2luPgorICAgIDx0YWctY2xhc3M+b3JnLmFwYWNoZS50YWdsaWJzLnN0YW5kYXJkLnRhZy5ydC5jb3JlLldoZW5UYWc8L3RhZy1jbGFzcz4KKyAgICA8cGx1Z2luLWNsYXNzPm9yZy5hcGFjaGUuamFzcGVyLnRhZ3BsdWdpbnMuanN0bC5XaGVuPC9wbHVnaW4tY2xhc3M+CisgIDwvdGFnLXBsdWdpbj4KKyAgPHRhZy1wbHVnaW4+CisgICAgPHRhZy1jbGFzcz5vcmcuYXBhY2hlLnRhZ2xpYnMuc3RhbmRhcmQudGFnLmNvbW1vbi5jb3JlLk90aGVyd2lzZVRhZzwvdGFnLWNsYXNzPgorICAgIDxwbHVnaW4tY2xhc3M+b3JnLmFwYWNoZS5qYXNwZXIudGFncGx1Z2lucy5qc3RsLk90aGVyd2lzZTwvcGx1Z2luLWNsYXNzPgorICA8L3RhZy1wbHVnaW4+CisgIDx0YWctcGx1Z2luPgorICAgIDx0YWctY2xhc3M+b3JnLmFwYWNoZS50YWdsaWJzLnN0YW5kYXJkLnRhZy5ydC5jb3JlLkZvckVhY2hUYWc8L3RhZy1jbGFzcz4KKyAgICA8cGx1Z2luLWNsYXNzPm9yZy5hcGFjaGUuamFzcGVyLnRhZ3BsdWdpbnMuanN0bC5Gb3JFYWNoPC9wbHVnaW4tY2xhc3M+CisgIDwvdGFnLXBsdWdpbj4KKzwvdGFnLXBsdWdpbnM+CmRpZmYgLS1naXQgYS9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvdXRpbC9GYXN0RGF0ZUZvcm1hdC5qYXZhIGIvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3V0aWwvRmFzdERhdGVGb3JtYXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWQxZjJmCi0tLSAvZGV2L251bGwKKysrIGIvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3V0aWwvRmFzdERhdGVGb3JtYXQuamF2YQpAQCAtMCwwICsxLDEzMyBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFzcGVyLnV0aWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKKworaW1wb3J0IGphdmEudGV4dC5EYXRlRm9ybWF0OworaW1wb3J0IGphdmEudGV4dC5GaWVsZFBvc2l0aW9uOworaW1wb3J0IGphdmEudGV4dC5QYXJzZVBvc2l0aW9uOworaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OworCisvKioKKyAqIEZhc3QgZGF0ZSBmb3JtYXR0ZXIgdGhhdCBjYWNoZXMgcmVjZW50bHkgZm9ybWF0dGVkIGRhdGUgaW5mb3JtYXRpb24KKyAqIGFuZCB1c2VzIGl0IHRvIGF2b2lkIHRvby1mcmVxdWVudCBjYWxscyB0byB0aGUgdW5kZXJseWluZworICogZm9ybWF0dGVyLiAgTm90ZTogYnJlYWtzIGZpZWxkUG9zaXRpb24gcGFyYW0gb2YgZm9ybWF0KERhdGUsCisgKiBTdHJpbmdCdWZmZXIsIEZpZWxkUG9zaXRpb24pLiAgSWYgeW91IGNhcmUgYWJvdXQgdGhlIGZpZWxkCisgKiBwb3NpdGlvbiwgY2FsbCB0aGUgdW5kZXJseWluZyBEYXRlRm9ybWF0IGRpcmVjdGx5LgorICoKKyAqIEBhdXRob3IgU3RhbiBCYWlsZXMKKyAqIEBhdXRob3IgQWxleCBDaGFmZmVlCisgKi8KK3B1YmxpYyBjbGFzcyBGYXN0RGF0ZUZvcm1hdCBleHRlbmRzIERhdGVGb3JtYXQgeworCisgICAgcHJpdmF0ZSBEYXRlRm9ybWF0IGRmOworICAgIHByaXZhdGUgbG9uZyBsYXN0U2VjID0gLTE7CisgICAgcHJpdmF0ZSBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgcHJpdmF0ZSBGaWVsZFBvc2l0aW9uIGZwID0gbmV3IEZpZWxkUG9zaXRpb24oRGF0ZUZvcm1hdC5NSUxMSVNFQ09ORF9GSUVMRCk7CisgICAgCisgICAgcHVibGljIEZhc3REYXRlRm9ybWF0KERhdGVGb3JtYXQgZGYpIHsKKyAgICAgICAgdGhpcy5kZiA9IGRmOworICAgIH0KKworICAgIHB1YmxpYyBEYXRlIHBhcnNlKFN0cmluZyB0ZXh0LCBQYXJzZVBvc2l0aW9uIHBvcykgeworCXJldHVybiBkZi5wYXJzZSh0ZXh0LCBwb3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE5vdGU6IGJyZWFrcyBmdW5jdGlvbmFsaXR5IG9mIGZpZWxkUG9zaXRpb24gcGFyYW0uIEFsc286CisgICAgICogdGhlcmUncyBhIGJ1ZyBpbiBTaW1wbGVEYXRlRm9ybWF0IHdpdGggIlMiIGFuZCAiU1MiLCB1c2UgIlNTUyIKKyAgICAgKiBpbnN0ZWFkIGlmIHlvdSB3YW50IGEgbXNlYyBmaWVsZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nQnVmZmVyIGZvcm1hdChEYXRlIGRhdGUsIFN0cmluZ0J1ZmZlciB0b0FwcGVuZFRvLAorCQkJICAgICAgIEZpZWxkUG9zaXRpb24gZmllbGRQb3NpdGlvbikgeworICAgICAgICBsb25nIGR0ID0gZGF0ZS5nZXRUaW1lKCk7CisgICAgICAgIGxvbmcgZHMgPSBkdCAvIDEwMDA7CisgICAgICAgIGlmIChkcyAhPSBsYXN0U2VjKSB7CisgICAgICAgICAgICBzYi5zZXRMZW5ndGgoMCk7CisgICAgICAgICAgICBkZi5mb3JtYXQoZGF0ZSwgc2IsIGZwKTsKKyAgICAgICAgICAgIGxhc3RTZWMgPSBkczsKKyAgICAgICAgfSBlbHNlIHsKKwkgICAgLy8gbXVuZ2UgY3VycmVudCBtc2VjIGludG8gZXhpc3Rpbmcgc3RyaW5nCisgICAgICAgICAgICBpbnQgbXMgPSAoaW50KShkdCAlIDEwMDApOworICAgICAgICAgICAgaW50IHBvcyA9IGZwLmdldEVuZEluZGV4KCk7CisJICAgIGludCBiZWdpbiA9IGZwLmdldEJlZ2luSW5kZXgoKTsKKwkgICAgaWYgKHBvcyA+IDApIHsKKwkJaWYgKHBvcyA+IGJlZ2luKQorCQkgICAgc2Iuc2V0Q2hhckF0KC0tcG9zLCBDaGFyYWN0ZXIuZm9yRGlnaXQobXMgJSAxMCwgMTApKTsKKwkJbXMgLz0gMTA7CisJCWlmIChwb3MgPiBiZWdpbikKKwkJICAgIHNiLnNldENoYXJBdCgtLXBvcywgQ2hhcmFjdGVyLmZvckRpZ2l0KG1zICUgMTAsIDEwKSk7CisJCW1zIC89IDEwOworCQlpZiAocG9zID4gYmVnaW4pCisJCSAgICBzYi5zZXRDaGFyQXQoLS1wb3MsIENoYXJhY3Rlci5mb3JEaWdpdChtcyAlIDEwLCAxMCkpOworCSAgICB9CisgICAgICAgIH0KKwl0b0FwcGVuZFRvLmFwcGVuZChzYi50b1N0cmluZygpKTsKKwlyZXR1cm4gdG9BcHBlbmRUbzsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisJU3RyaW5nIGZvcm1hdCA9ICJ5eXl5LU1NLWRkIEhIOm1tOnNzLlNTUyI7CisJaWYgKGFyZ3MubGVuZ3RoID4gMCkKKwkgICAgZm9ybWF0ID0gYXJnc1swXTsKKyAgICAgICAgU2ltcGxlRGF0ZUZvcm1hdCBzZGYgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdChmb3JtYXQpOworICAgICAgICBGYXN0RGF0ZUZvcm1hdCBmZGYgPSBuZXcgRmFzdERhdGVGb3JtYXQoc2RmKTsKKyAgICAgICAgRGF0ZSBkID0gbmV3IERhdGUoKTsKKworCWQuc2V0VGltZSgxKTsKKwlTeXN0ZW0ub3V0LnByaW50bG4oZmRmLmZvcm1hdChkKSArICJcdCIgKyBzZGYuZm9ybWF0KGQpKTsKKwlkLnNldFRpbWUoMjApOworCVN5c3RlbS5vdXQucHJpbnRsbihmZGYuZm9ybWF0KGQpICsgIlx0IiArIHNkZi5mb3JtYXQoZCkpOworCWQuc2V0VGltZSg1MDApOworCVN5c3RlbS5vdXQucHJpbnRsbihmZGYuZm9ybWF0KGQpICsgIlx0IiArIHNkZi5mb3JtYXQoZCkpOworCWQuc2V0VGltZSg1NDMpOworCVN5c3RlbS5vdXQucHJpbnRsbihmZGYuZm9ybWF0KGQpICsgIlx0IiArIHNkZi5mb3JtYXQoZCkpOworCWQuc2V0VGltZSg5OTkpOworCVN5c3RlbS5vdXQucHJpbnRsbihmZGYuZm9ybWF0KGQpICsgIlx0IiArIHNkZi5mb3JtYXQoZCkpOworCWQuc2V0VGltZSgxMDUwKTsKKwlTeXN0ZW0ub3V0LnByaW50bG4oZmRmLmZvcm1hdChkKSArICJcdCIgKyBzZGYuZm9ybWF0KGQpKTsKKwlkLnNldFRpbWUoMjU0Myk7CisJU3lzdGVtLm91dC5wcmludGxuKGZkZi5mb3JtYXQoZCkgKyAiXHQiICsgc2RmLmZvcm1hdChkKSk7CisJZC5zZXRUaW1lKDEyMzQ1KTsKKwlTeXN0ZW0ub3V0LnByaW50bG4oZmRmLmZvcm1hdChkKSArICJcdCIgKyBzZGYuZm9ybWF0KGQpKTsKKwlkLnNldFRpbWUoMTIzNDApOworCVN5c3RlbS5vdXQucHJpbnRsbihmZGYuZm9ybWF0KGQpICsgIlx0IiArIHNkZi5mb3JtYXQoZCkpOworCQorICAgICAgICBmaW5hbCBpbnQgcmVwcyA9IDEwMDAwMDsKKyAgICAgICAgeworICAgICAgICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBkLnNldFRpbWUoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworICAgICAgICAgICAgICAgIGZkZi5mb3JtYXQoZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb25nIGVsYXAgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0OworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJmYXN0OiAiICsgZWxhcCArICIgZWxhcHNlZCIpOworCSAgICBTeXN0ZW0ub3V0LnByaW50bG4oZmRmLmZvcm1hdChkKSk7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBkLnNldFRpbWUoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworICAgICAgICAgICAgICAgIHNkZi5mb3JtYXQoZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb25nIGVsYXAgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0OwkgICAgCisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInNsb3c6ICIgKyBlbGFwICsgIiBlbGFwc2VkIik7CisJICAgIFN5c3RlbS5vdXQucHJpbnRsbihzZGYuZm9ybWF0KGQpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci91dGlsL1F1ZXVlLmphdmEgYi9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvdXRpbC9RdWV1ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxN2JjODEKLS0tIC9kZXYvbnVsbAorKysgYi9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvdXRpbC9RdWV1ZS5qYXZhCkBAIC0wLDAgKzEsODggQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphc3Blci51dGlsOworCitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworLyoqCisgKiBBIHNpbXBsZSBGSUZPIHF1ZXVlIGNsYXNzIHdoaWNoIGNhdXNlcyB0aGUgY2FsbGluZyB0aHJlYWQgdG8gd2FpdAorICogaWYgdGhlIHF1ZXVlIGlzIGVtcHR5IGFuZCBub3RpZmllcyB0aHJlYWRzIHRoYXQgYXJlIHdhaXRpbmcgd2hlbiBpdAorICogaXMgbm90IGVtcHR5LgorICoKKyAqIEBhdXRob3IgQW5pbCBWIChha3ZAZW5nLnN1bi5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBRdWV1ZSB7CisgICAgcHJpdmF0ZSBWZWN0b3IgdmVjdG9yID0gbmV3IFZlY3RvcigpOworCisgICAgLyoqIAorICAgICAqIFB1dCB0aGUgb2JqZWN0IGludG8gdGhlIHF1ZXVlLgorICAgICAqIAorICAgICAqIEBwYXJhbQlvYmplY3QJCXRoZSBvYmplY3QgdG8gYmUgYXBwZW5kZWQgdG8gdGhlCisgICAgICogCQkJCXF1ZXVlLiAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcHV0KE9iamVjdCBvYmplY3QpIHsKKwl2ZWN0b3IuYWRkRWxlbWVudChvYmplY3QpOworCW5vdGlmeSgpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBQdWxsIHRoZSBmaXJzdCBvYmplY3Qgb3V0IG9mIHRoZSBxdWV1ZS4gV2FpdCBpZiB0aGUgcXVldWUgaXMKKyAgICAgKiBlbXB0eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIE9iamVjdCBwdWxsKCkgeworCXdoaWxlIChpc0VtcHR5KCkpCisJICAgIHRyeSB7CisJCXdhaXQoKTsKKwkgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKKwkgICAgfQorCXJldHVybiBnZXQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGZpcnN0IG9iamVjdCBvdXQgb2YgdGhlIHF1ZXVlLiBSZXR1cm4gbnVsbCBpZiB0aGUgcXVldWUKKyAgICAgKiBpcyBlbXB0eS4gCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBPYmplY3QgZ2V0KCkgeworCU9iamVjdCBvYmplY3QgPSBwZWVrKCk7CisJaWYgKG9iamVjdCAhPSBudWxsKQorCSAgICB2ZWN0b3IucmVtb3ZlRWxlbWVudEF0KDApOworCXJldHVybiBvYmplY3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGVlayB0byBzZWUgaWYgc29tZXRoaW5nIGlzIGF2YWlsYWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IHBlZWsoKSB7CisJaWYgKGlzRW1wdHkoKSkKKwkgICAgcmV0dXJuIG51bGw7CisJcmV0dXJuIHZlY3Rvci5lbGVtZW50QXQoMCk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIElzIHRoZSBxdWV1ZSBlbXB0eT8KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgeworCXJldHVybiB2ZWN0b3IuaXNFbXB0eSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEhvdyBtYW55IGVsZW1lbnRzIGFyZSB0aGVyZSBpbiB0aGlzIHF1ZXVlPworICAgICAqLworICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKKwlyZXR1cm4gdmVjdG9yLnNpemUoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvdXRpbC9TaW1wbGVQb29sLmphdmEgYi9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvdXRpbC9TaW1wbGVQb29sLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJjZDE0ZgotLS0gL2Rldi9udWxsCisrKyBiL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci91dGlsL1NpbXBsZVBvb2wuamF2YQpAQCAtMCwwICsxLDg1IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYXNwZXIudXRpbDsKKworLyoqCisgKiBTaW1wbGUgb2JqZWN0IHBvb2wuIEJhc2VkIG9uIFRocmVhZFBvb2wgYW5kIGZldyBvdGhlciBjbGFzc2VzCisgKgorICogVGhlIHBvb2wgd2lsbCBpZ25vcmUgb3ZlcmZsb3cgYW5kIHJldHVybiBudWxsIGlmIGVtcHR5LgorICoKKyAqIEBhdXRob3IgR2FsIFNoYWNob3IKKyAqIEBhdXRob3IgQ29zdGluCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBTaW1wbGVQb29sICB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9TSVpFPTE2OworCisgICAgLyoKKyAgICAgKiBXaGVyZSB0aGUgdGhyZWFkcyBhcmUgaGVsZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE9iamVjdCBwb29sW107CisKKyAgICBwcml2YXRlIGludCBtYXg7CisgICAgcHJpdmF0ZSBpbnQgY3VycmVudD0tMTsKKworICAgIHByaXZhdGUgT2JqZWN0IGxvY2s7CisgICAgCisgICAgcHVibGljIFNpbXBsZVBvb2woKSB7CisJdGhpcy5tYXg9REVGQVVMVF9TSVpFOworCXRoaXMucG9vbD1uZXcgT2JqZWN0W21heF07CisJdGhpcy5sb2NrPW5ldyBPYmplY3QoKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIFNpbXBsZVBvb2woaW50IG1heCkgeworCXRoaXMubWF4PW1heDsKKwl0aGlzLnBvb2w9bmV3IE9iamVjdFttYXhdOworCXRoaXMubG9jaz1uZXcgT2JqZWN0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyB0aGUgZ2l2ZW4gb2JqZWN0IHRvIHRoZSBwb29sLCBhbmQgZG9lcyBub3RoaW5nIGlmIHRoZSBwb29sIGlzIGZ1bGwKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwdXQoT2JqZWN0IG8pIHsKKwlzeW5jaHJvbml6ZWQoIGxvY2sgKSB7CisJICAgIGlmKCBjdXJyZW50IDwgKG1heC0xKSApIHsKKwkJY3VycmVudCArPSAxOworCQlwb29sW2N1cnJlbnRdID0gbzsKKyAgICAgICAgICAgIH0KKwl9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGFuIG9iamVjdCBmcm9tIHRoZSBwb29sLCBudWxsIGlmIHRoZSBwb29sIGlzIGVtcHR5LgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0KCkgeworCU9iamVjdCBpdGVtID0gbnVsbDsKKwlzeW5jaHJvbml6ZWQoIGxvY2sgKSB7CisJICAgIGlmKCBjdXJyZW50ID49IDAgKSB7CisJCWl0ZW0gPSBwb29sW2N1cnJlbnRdOworCQljdXJyZW50IC09IDE7CisJICAgIH0KKwl9CisJcmV0dXJuIGl0ZW07CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBwb29sCisgICAgICovCisgICAgcHVibGljIGludCBnZXRNYXgoKSB7CisJcmV0dXJuIG1heDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvdXRpbC9TeXN0ZW1Mb2dIYW5kbGVyLmphdmEgYi9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIvdXRpbC9TeXN0ZW1Mb2dIYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWIxZDA1YwotLS0gL2Rldi9udWxsCisrKyBiL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci91dGlsL1N5c3RlbUxvZ0hhbmRsZXIuamF2YQpAQCAtMCwwICsxLDIyMyBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFzcGVyLnV0aWw7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKKworCisvKioKKyAqIFRoaXMgaGVscGVyIGNsYXNzIG1heSBiZSB1c2VkIHRvIGRvIHNvcGhpc3RpY2F0ZWQgcmVkaXJlY3Rpb24gb2YgCisgKiBTeXN0ZW0ub3V0IGFuZCBTeXN0ZW0uZXJyLgorICogCisgKiBAYXV0aG9yIFJlbXkgTWF1Y2hlcmF0CisgKi8KK3B1YmxpYyBjbGFzcyBTeXN0ZW1Mb2dIYW5kbGVyIGV4dGVuZHMgUHJpbnRTdHJlYW0geworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IHRoZSBoYW5kbGVyIHRvIGNhcHR1cmUgdGhlIG91dHB1dCBvZiB0aGUgZ2l2ZW4gc3RlYW0uCisgICAgICovCisgICAgcHVibGljIFN5c3RlbUxvZ0hhbmRsZXIoUHJpbnRTdHJlYW0gd3JhcHBlZCkgeworICAgICAgICBzdXBlcih3cmFwcGVkKTsKKyAgICAgICAgdGhpcy53cmFwcGVkID0gd3JhcHBlZDsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBXcmFwcGVkIFByaW50U3RyZWFtLgorICAgICAqLworICAgIHByb3RlY3RlZCBQcmludFN0cmVhbSB3cmFwcGVkID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhyZWFkIDwtPiBQcmludFN0cmVhbSBhc3NvY2lhdGlvbnMuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBIYXNodGFibGUgc3RyZWFtcyA9IG5ldyBIYXNodGFibGUoKTsKKworCisgICAgLyoqCisgICAgICogVGhyZWFkIDwtPiBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYXNzb2NpYXRpb25zLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgSGFzaHRhYmxlIGRhdGEgPSBuZXcgSGFzaHRhYmxlKCk7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICBwdWJsaWMgUHJpbnRTdHJlYW0gZ2V0V3JhcHBlZCgpIHsKKyAgICAgIHJldHVybiB3cmFwcGVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0IGNhcHR1cmluZyB0aHJlYWQncyBvdXRwdXQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFRocmVhZCgpIHsKKyAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIFByaW50U3RyZWFtIHBzID0gbmV3IFByaW50U3RyZWFtKGJhb3MpOworICAgICAgICBkYXRhLnB1dChUaHJlYWQuY3VycmVudFRocmVhZCgpLCBiYW9zKTsKKyAgICAgICAgc3RyZWFtcy5wdXQoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSwgcHMpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU3RvcCBjYXB0dXJpbmcgdGhyZWFkJ3Mgb3V0cHV0IGFuZCByZXR1cm4gY2FwdHVyZWQgZGF0YSBhcyBhIFN0cmluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB1bnNldFRocmVhZCgpIHsKKyAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSAKKyAgICAgICAgICAgIChCeXRlQXJyYXlPdXRwdXRTdHJlYW0pIGRhdGEuZ2V0KFRocmVhZC5jdXJyZW50VGhyZWFkKCkpOworICAgICAgICBpZiAoYmFvcyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBzdHJlYW1zLnJlbW92ZShUaHJlYWQuY3VycmVudFRocmVhZCgpKTsKKyAgICAgICAgZGF0YS5yZW1vdmUoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSk7CisgICAgICAgIHJldHVybiBiYW9zLnRvU3RyaW5nKCk7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvdGVjdGVkIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogRmluZCBQcmludFN0cmVhbSB0byB3aGljaCB0aGUgb3V0cHV0IG11c3QgYmUgd3JpdHRlbiB0by4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUHJpbnRTdHJlYW0gZmluZFN0cmVhbSgpIHsKKyAgICAgICAgUHJpbnRTdHJlYW0gcHMgPSAoUHJpbnRTdHJlYW0pIHN0cmVhbXMuZ2V0KFRocmVhZC5jdXJyZW50VGhyZWFkKCkpOworICAgICAgICBpZiAocHMgPT0gbnVsbCkgeworICAgICAgICAgICAgcHMgPSB3cmFwcGVkOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwczsKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJpbnRTdHJlYW0gTWV0aG9kcworCisKKyAgICBwdWJsaWMgdm9pZCBmbHVzaCgpIHsKKyAgICAgICAgZmluZFN0cmVhbSgpLmZsdXNoKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisgICAgICAgIGZpbmRTdHJlYW0oKS5jbG9zZSgpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGNoZWNrRXJyb3IoKSB7CisgICAgICAgIHJldHVybiBmaW5kU3RyZWFtKCkuY2hlY2tFcnJvcigpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHNldEVycm9yKCkgeworICAgICAgICAvL2ZpbmRTdHJlYW0oKS5zZXRFcnJvcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlKGludCBiKSB7CisgICAgICAgIGZpbmRTdHJlYW0oKS53cml0ZShiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYikKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZmluZFN0cmVhbSgpLndyaXRlKGIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pIHsKKyAgICAgICAgZmluZFN0cmVhbSgpLndyaXRlKGJ1Ziwgb2ZmLCBsZW4pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHByaW50KGJvb2xlYW4gYikgeworICAgICAgICBmaW5kU3RyZWFtKCkucHJpbnQoYik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHJpbnQoY2hhciBjKSB7CisgICAgICAgIGZpbmRTdHJlYW0oKS5wcmludChjKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwcmludChpbnQgaSkgeworICAgICAgICBmaW5kU3RyZWFtKCkucHJpbnQoaSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHJpbnQobG9uZyBsKSB7CisgICAgICAgIGZpbmRTdHJlYW0oKS5wcmludChsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwcmludChmbG9hdCBmKSB7CisgICAgICAgIGZpbmRTdHJlYW0oKS5wcmludChmKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwcmludChkb3VibGUgZCkgeworICAgICAgICBmaW5kU3RyZWFtKCkucHJpbnQoZCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHJpbnQoY2hhcltdIHMpIHsKKyAgICAgICAgZmluZFN0cmVhbSgpLnByaW50KHMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHByaW50KFN0cmluZyBzKSB7CisgICAgICAgIGZpbmRTdHJlYW0oKS5wcmludChzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwcmludChPYmplY3Qgb2JqKSB7CisgICAgICAgIGZpbmRTdHJlYW0oKS5wcmludChvYmopOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHByaW50bG4oKSB7CisgICAgICAgIGZpbmRTdHJlYW0oKS5wcmludGxuKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHJpbnRsbihib29sZWFuIHgpIHsKKyAgICAgICAgZmluZFN0cmVhbSgpLnByaW50bG4oeCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHJpbnRsbihjaGFyIHgpIHsKKyAgICAgICAgZmluZFN0cmVhbSgpLnByaW50bG4oeCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHJpbnRsbihpbnQgeCkgeworICAgICAgICBmaW5kU3RyZWFtKCkucHJpbnRsbih4KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwcmludGxuKGxvbmcgeCkgeworICAgICAgICBmaW5kU3RyZWFtKCkucHJpbnRsbih4KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwcmludGxuKGZsb2F0IHgpIHsKKyAgICAgICAgZmluZFN0cmVhbSgpLnByaW50bG4oeCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHJpbnRsbihkb3VibGUgeCkgeworICAgICAgICBmaW5kU3RyZWFtKCkucHJpbnRsbih4KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwcmludGxuKGNoYXJbXSB4KSB7CisgICAgICAgIGZpbmRTdHJlYW0oKS5wcmludGxuKHgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHByaW50bG4oU3RyaW5nIHgpIHsKKyAgICAgICAgZmluZFN0cmVhbSgpLnByaW50bG4oeCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHJpbnRsbihPYmplY3QgeCkgeworICAgICAgICBmaW5kU3RyZWFtKCkucHJpbnRsbih4KTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci94bWxwYXJzZXIvQVNDSUlSZWFkZXIuamF2YSBiL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci94bWxwYXJzZXIvQVNDSUlSZWFkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Zjc4MDVhCi0tLSAvZGV2L251bGwKKysrIGIvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3htbHBhcnNlci9BU0NJSVJlYWRlci5qYXZhCkBAIC0wLDAgKzEsMjAzIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYXNwZXIueG1scGFyc2VyOworCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUmVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLmNvbXBpbGVyLkxvY2FsaXplcjsKKworLyoqCisgKiBBIHNpbXBsZSBBU0NJSSBieXRlIHJlYWRlci4gVGhpcyBpcyBhbiBvcHRpbWl6ZWQgcmVhZGVyIGZvciByZWFkaW5nCisgKiBieXRlIHN0cmVhbXMgdGhhdCBvbmx5IGNvbnRhaW4gNy1iaXQgQVNDSUkgY2hhcmFjdGVycy4KKyAqCisgKiBAYXV0aG9yIEFuZHkgQ2xhcmssIElCTQorICoKKyAqIEB2ZXJzaW9uICRJZCQKKyAqLworcHVibGljIGNsYXNzIEFTQ0lJUmVhZGVyCisgICAgZXh0ZW5kcyBSZWFkZXIgeworCisgICAgLy8KKyAgICAvLyBDb25zdGFudHMKKyAgICAvLworCisgICAgLyoqIERlZmF1bHQgYnl0ZSBidWZmZXIgc2l6ZSAoMjA0OCkuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9CVUZGRVJfU0laRSA9IDIwNDg7CisKKyAgICAvLworICAgIC8vIERhdGEKKyAgICAvLworCisgICAgLyoqIElucHV0IHN0cmVhbS4gKi8KKyAgICBwcm90ZWN0ZWQgSW5wdXRTdHJlYW0gZklucHV0U3RyZWFtOworCisgICAgLyoqIEJ5dGUgYnVmZmVyLiAqLworICAgIHByb3RlY3RlZCBieXRlW10gZkJ1ZmZlcjsKKworICAgIC8vCisgICAgLy8gQ29uc3RydWN0b3JzCisgICAgLy8KKworICAgIC8qKiAKKyAgICAgKiBDb25zdHJ1Y3RzIGFuIEFTQ0lJIHJlYWRlciBmcm9tIHRoZSBzcGVjaWZpZWQgaW5wdXQgc3RyZWFtIAorICAgICAqIGFuZCBidWZmZXIgc2l6ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnB1dFN0cmVhbSBUaGUgaW5wdXQgc3RyZWFtLgorICAgICAqIEBwYXJhbSBzaXplICAgICAgICBUaGUgaW5pdGlhbCBidWZmZXIgc2l6ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQVNDSUlSZWFkZXIoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIGludCBzaXplKSB7CisgICAgICAgIGZJbnB1dFN0cmVhbSA9IGlucHV0U3RyZWFtOworICAgICAgICBmQnVmZmVyID0gbmV3IGJ5dGVbc2l6ZV07CisgICAgfQorCisgICAgLy8KKyAgICAvLyBSZWFkZXIgbWV0aG9kcworICAgIC8vCisKKyAgICAvKioKKyAgICAgKiBSZWFkIGEgc2luZ2xlIGNoYXJhY3Rlci4gIFRoaXMgbWV0aG9kIHdpbGwgYmxvY2sgdW50aWwgYSBjaGFyYWN0ZXIgaXMKKyAgICAgKiBhdmFpbGFibGUsIGFuIEkvTyBlcnJvciBvY2N1cnMsIG9yIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSBpcyByZWFjaGVkLgorICAgICAqCisgICAgICogPHA+IFN1YmNsYXNzZXMgdGhhdCBpbnRlbmQgdG8gc3VwcG9ydCBlZmZpY2llbnQgc2luZ2xlLWNoYXJhY3RlciBpbnB1dAorICAgICAqIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gICAgIFRoZSBjaGFyYWN0ZXIgcmVhZCwgYXMgYW4gaW50ZWdlciBpbiB0aGUgcmFuZ2UgMCB0byAxMjcKKyAgICAgKiAgICAgICAgICAgICAoPHR0PjB4MDAtMHg3ZjwvdHQ+KSwgb3IgLTEgaWYgdGhlIGVuZCBvZiB0aGUgc3RyZWFtIGhhcworICAgICAqICAgICAgICAgICAgIGJlZW4gcmVhY2hlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiAgSU9FeGNlcHRpb24gIElmIGFuIEkvTyBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpbnQgYjAgPSBmSW5wdXRTdHJlYW0ucmVhZCgpOworICAgICAgICBpZiAoYjAgPiAweDgwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oTG9jYWxpemVyLmdldE1lc3NhZ2UoImpzcC5lcnJvci54bWwuaW52YWxpZEFTQ0lJIiwKKwkJCQkJCSAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKGIwKSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBiMDsKKyAgICB9IC8vIHJlYWQoKTppbnQKKworICAgIC8qKgorICAgICAqIFJlYWQgY2hhcmFjdGVycyBpbnRvIGEgcG9ydGlvbiBvZiBhbiBhcnJheS4gIFRoaXMgbWV0aG9kIHdpbGwgYmxvY2sKKyAgICAgKiB1bnRpbCBzb21lIGlucHV0IGlzIGF2YWlsYWJsZSwgYW4gSS9PIGVycm9yIG9jY3Vycywgb3IgdGhlIGVuZCBvZiB0aGUKKyAgICAgKiBzdHJlYW0gaXMgcmVhY2hlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgICAgIGNoICAgICBEZXN0aW5hdGlvbiBidWZmZXIKKyAgICAgKiBAcGFyYW0gICAgICBvZmZzZXQgT2Zmc2V0IGF0IHdoaWNoIHRvIHN0YXJ0IHN0b3JpbmcgY2hhcmFjdGVycworICAgICAqIEBwYXJhbSAgICAgIGxlbmd0aCBNYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHJlYWQKKyAgICAgKgorICAgICAqIEByZXR1cm4gICAgIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyByZWFkLCBvciAtMSBpZiB0aGUgZW5kIG9mIHRoZQorICAgICAqICAgICAgICAgICAgIHN0cmVhbSBoYXMgYmVlbiByZWFjaGVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uICBJT0V4Y2VwdGlvbiAgSWYgYW4gSS9PIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBpbnQgcmVhZChjaGFyIGNoW10sIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChsZW5ndGggPiBmQnVmZmVyLmxlbmd0aCkgeworICAgICAgICAgICAgbGVuZ3RoID0gZkJ1ZmZlci5sZW5ndGg7CisgICAgICAgIH0KKyAgICAgICAgaW50IGNvdW50ID0gZklucHV0U3RyZWFtLnJlYWQoZkJ1ZmZlciwgMCwgbGVuZ3RoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBpbnQgYjAgPSBmQnVmZmVyW2ldOworICAgICAgICAgICAgaWYgKGIwID4gMHg4MCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgianNwLmVycm9yLnhtbC5pbnZhbGlkQVNDSUkiLAorCQkJCQkJCSAgIEludGVnZXIudG9TdHJpbmcoYjApKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjaFtvZmZzZXQgKyBpXSA9IChjaGFyKWIwOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjb3VudDsKKyAgICB9IC8vIHJlYWQoY2hhcltdLGludCxpbnQpCisKKyAgICAvKioKKyAgICAgKiBTa2lwIGNoYXJhY3RlcnMuICBUaGlzIG1ldGhvZCB3aWxsIGJsb2NrIHVudGlsIHNvbWUgY2hhcmFjdGVycyBhcmUKKyAgICAgKiBhdmFpbGFibGUsIGFuIEkvTyBlcnJvciBvY2N1cnMsIG9yIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSBpcyByZWFjaGVkLgorICAgICAqCisgICAgICogQHBhcmFtICBuICBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gc2tpcAorICAgICAqCisgICAgICogQHJldHVybiAgICBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgYWN0dWFsbHkgc2tpcHBlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiAgSU9FeGNlcHRpb24gIElmIGFuIEkvTyBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBza2lwKGxvbmcgbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGZJbnB1dFN0cmVhbS5za2lwKG4pOworICAgIH0gLy8gc2tpcChsb25nKTpsb25nCisKKyAgICAvKioKKyAgICAgKiBUZWxsIHdoZXRoZXIgdGhpcyBzdHJlYW0gaXMgcmVhZHkgdG8gYmUgcmVhZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgbmV4dCByZWFkKCkgaXMgZ3VhcmFudGVlZCBub3QgdG8gYmxvY2sgZm9yIGlucHV0LAorICAgICAqIGZhbHNlIG90aGVyd2lzZS4gIE5vdGUgdGhhdCByZXR1cm5pbmcgZmFsc2UgZG9lcyBub3QgZ3VhcmFudGVlIHRoYXQgdGhlCisgICAgICogbmV4dCByZWFkIHdpbGwgYmxvY2suCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uICBJT0V4Y2VwdGlvbiAgSWYgYW4gSS9PIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHJlYWR5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlyZXR1cm4gZmFsc2U7CisgICAgfSAvLyByZWFkeSgpCisKKyAgICAvKioKKyAgICAgKiBUZWxsIHdoZXRoZXIgdGhpcyBzdHJlYW0gc3VwcG9ydHMgdGhlIG1hcmsoKSBvcGVyYXRpb24uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gbWFya1N1cHBvcnRlZCgpIHsKKwlyZXR1cm4gZklucHV0U3RyZWFtLm1hcmtTdXBwb3J0ZWQoKTsKKyAgICB9IC8vIG1hcmtTdXBwb3J0ZWQoKQorCisgICAgLyoqCisgICAgICogTWFyayB0aGUgcHJlc2VudCBwb3NpdGlvbiBpbiB0aGUgc3RyZWFtLiAgU3Vic2VxdWVudCBjYWxscyB0byByZXNldCgpCisgICAgICogd2lsbCBhdHRlbXB0IHRvIHJlcG9zaXRpb24gdGhlIHN0cmVhbSB0byB0aGlzIHBvaW50LiAgTm90IGFsbAorICAgICAqIGNoYXJhY3Rlci1pbnB1dCBzdHJlYW1zIHN1cHBvcnQgdGhlIG1hcmsoKSBvcGVyYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gIHJlYWRBaGVhZExpbWl0ICBMaW1pdCBvbiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdGhhdCBtYXkgYmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICByZWFkIHdoaWxlIHN0aWxsIHByZXNlcnZpbmcgdGhlIG1hcmsuICBBZnRlcgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRpbmcgdGhpcyBtYW55IGNoYXJhY3RlcnMsIGF0dGVtcHRpbmcgdG8KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICByZXNldCB0aGUgc3RyZWFtIG1heSBmYWlsLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiAgSU9FeGNlcHRpb24gIElmIHRoZSBzdHJlYW0gZG9lcyBub3Qgc3VwcG9ydCBtYXJrKCksCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGlmIHNvbWUgb3RoZXIgSS9PIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIG1hcmsoaW50IHJlYWRBaGVhZExpbWl0KSB0aHJvd3MgSU9FeGNlcHRpb24geworCWZJbnB1dFN0cmVhbS5tYXJrKHJlYWRBaGVhZExpbWl0KTsKKyAgICB9IC8vIG1hcmsoaW50KQorCisgICAgLyoqCisgICAgICogUmVzZXQgdGhlIHN0cmVhbS4gIElmIHRoZSBzdHJlYW0gaGFzIGJlZW4gbWFya2VkLCB0aGVuIGF0dGVtcHQgdG8KKyAgICAgKiByZXBvc2l0aW9uIGl0IGF0IHRoZSBtYXJrLiAgSWYgdGhlIHN0cmVhbSBoYXMgbm90IGJlZW4gbWFya2VkLCB0aGVuCisgICAgICogYXR0ZW1wdCB0byByZXNldCBpdCBpbiBzb21lIHdheSBhcHByb3ByaWF0ZSB0byB0aGUgcGFydGljdWxhciBzdHJlYW0sCisgICAgICogZm9yIGV4YW1wbGUgYnkgcmVwb3NpdGlvbmluZyBpdCB0byBpdHMgc3RhcnRpbmcgcG9pbnQuICBOb3QgYWxsCisgICAgICogY2hhcmFjdGVyLWlucHV0IHN0cmVhbXMgc3VwcG9ydCB0aGUgcmVzZXQoKSBvcGVyYXRpb24sIGFuZCBzb21lIHN1cHBvcnQKKyAgICAgKiByZXNldCgpIHdpdGhvdXQgc3VwcG9ydGluZyBtYXJrKCkuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uICBJT0V4Y2VwdGlvbiAgSWYgdGhlIHN0cmVhbSBoYXMgbm90IGJlZW4gbWFya2VkLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBvciBpZiB0aGUgbWFyayBoYXMgYmVlbiBpbnZhbGlkYXRlZCwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgaWYgdGhlIHN0cmVhbSBkb2VzIG5vdCBzdXBwb3J0IHJlc2V0KCksCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGlmIHNvbWUgb3RoZXIgSS9PIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZklucHV0U3RyZWFtLnJlc2V0KCk7CisgICAgfSAvLyByZXNldCgpCisKKyAgICAvKioKKyAgICAgKiBDbG9zZSB0aGUgc3RyZWFtLiAgT25jZSBhIHN0cmVhbSBoYXMgYmVlbiBjbG9zZWQsIGZ1cnRoZXIgcmVhZCgpLAorICAgICAqIHJlYWR5KCksIG1hcmsoKSwgb3IgcmVzZXQoKSBpbnZvY2F0aW9ucyB3aWxsIHRocm93IGFuIElPRXhjZXB0aW9uLgorICAgICAqIENsb3NpbmcgYSBwcmV2aW91c2x5LWNsb3NlZCBzdHJlYW0sIGhvd2V2ZXIsIGhhcyBubyBlZmZlY3QuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uICBJT0V4Y2VwdGlvbiAgSWYgYW4gSS9PIGVycm9yIG9jY3VycworICAgICAqLworICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICBmSW5wdXRTdHJlYW0uY2xvc2UoKTsKKyAgICAgfSAvLyBjbG9zZSgpCisKK30gLy8gY2xhc3MgQVNDSUlSZWFkZXIKZGlmZiAtLWdpdCBhL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci94bWxwYXJzZXIvRW5jb2RpbmdNYXAuamF2YSBiL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci94bWxwYXJzZXIvRW5jb2RpbmdNYXAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGNmNWFlCi0tLSAvZGV2L251bGwKKysrIGIvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3htbHBhcnNlci9FbmNvZGluZ01hcC5qYXZhCkBAIC0wLDAgKzEsMTAxOSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKKyAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcworICogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDE5OTksIEludGVybmF0aW9uYWwKKyAqIEJ1c2luZXNzIE1hY2hpbmVzLCBJbmMuLCBodHRwOi8vd3d3LmFwYWNoZS5vcmcuICBGb3IgbW9yZQorICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCisgKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphc3Blci54bWxwYXJzZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworCisvKioKKyAqIEVuY29kaW5nTWFwIGlzIGEgY29udmVuaWVuY2UgY2xhc3Mgd2hpY2ggaGFuZGxlcyBjb252ZXJzaW9ucyBiZXR3ZWVuIAorICogSUFOQSBlbmNvZGluZyBuYW1lcyBhbmQgSmF2YSBlbmNvZGluZyBuYW1lcywgYW5kIHZpY2UgdmVyc2EuIFRoZQorICogZW5jb2RpbmcgbmFtZXMgdXNlZCBpbiBYTUwgaW5zdGFuY2UgZG9jdW1lbnRzIDxzdHJvbmc+bXVzdDwvc3Ryb25nPgorICogYmUgdGhlIElBTkEgZW5jb2RpbmcgbmFtZXMgc3BlY2lmaWVkIG9yIG9uZSBvZiB0aGUgYWxpYXNlcyBmb3IgdGhvc2UgbmFtZXMKKyAqIHdoaWNoIElBTkEgZGVmaW5lcy4KKyAqIDxwPgorICogPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiPgorICogIDxUUj4KKyAqICAgICAgPFREIFdJRFRIPSIzMyUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+PEI+Q29tbW9uIE5hbWU8L0I+CisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTUlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPjxCPlVzZSB0aGlzIG5hbWUgaW4gWE1MIGZpbGVzPC9CPgorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjEyJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj48Qj5OYW1lIFR5cGU8L0I+CisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMzElIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPjxCPlhlcmNlcyBjb252ZXJ0cyB0byB0aGlzIEphdmEgRW5jb2RlciBOYW1lPC9CPgorICogICAgICA8L1REPgorICogIDwvVFI+CisgKiAgPFRSPgorICogICAgICA8VEQgV0lEVEg9IjMzJSI+OCBiaXQgVW5pY29kZTwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTUlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPlVURi04CisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTIlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPklBTkEKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIzMSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+VVRGOAorICogICAgICA8L1REPgorICogIDwvVFI+CisgKiAgPFRSPgorICogICAgICA8VEQgV0lEVEg9IjMzJSI+SVNPIExhdGluIDE8L1REPgorICogICAgICA8VEQgV0lEVEg9IjE1JSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5JU08tODg1OS0xCisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTIlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPk1JTUUKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIzMSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+SVNPLTg4NTktMQorICogICAgICA8L1REPgorICogIDwvVFI+CisgKiAgPFRSPgorICogICAgICA8VEQgV0lEVEg9IjMzJSI+SVNPIExhdGluIDI8L1REPgorICogICAgICA8VEQgV0lEVEg9IjE1JSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5JU08tODg1OS0yCisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTIlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPk1JTUUKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIzMSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+SVNPLTg4NTktMgorICogICAgICA8L1REPgorICogIDwvVFI+CisgKiAgPFRSPgorICogICAgICA8VEQgV0lEVEg9IjMzJSI+SVNPIExhdGluIDM8L1REPgorICogICAgICA8VEQgV0lEVEg9IjE1JSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5JU08tODg1OS0zCisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTIlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPk1JTUUKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIzMSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+SVNPLTg4NTktMworICogICAgICA8L1REPgorICogIDwvVFI+CisgKiAgPFRSPgorICogICAgICA8VEQgV0lEVEg9IjMzJSI+SVNPIExhdGluIDQ8L1REPgorICogICAgICA8VEQgV0lEVEg9IjE1JSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5JU08tODg1OS00CisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTIlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPk1JTUUKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIzMSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+SVNPLTg4NTktNAorICogICAgICA8L1REPgorICogIDwvVFI+CisgKiAgPFRSPgorICogICAgICA8VEQgV0lEVEg9IjMzJSI+SVNPIExhdGluIEN5cmlsbGljPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxNSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+SVNPLTg4NTktNQorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjEyJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5NSU1FCisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMzElIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPklTTy04ODU5LTUKKyAqICAgICAgPC9URD4KKyAqICA8L1RSPgorICogIDxUUj4KKyAqICAgICAgPFREIFdJRFRIPSIzMyUiPklTTyBMYXRpbiBBcmFiaWM8L1REPgorICogICAgICA8VEQgV0lEVEg9IjE1JSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5JU08tODg1OS02CisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTIlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPk1JTUUKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIzMSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+SVNPLTg4NTktNgorICogICAgICA8L1REPgorICogIDwvVFI+CisgKiAgPFRSPgorICogICAgICA8VEQgV0lEVEg9IjMzJSI+SVNPIExhdGluIEdyZWVrPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxNSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+SVNPLTg4NTktNworICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjEyJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5NSU1FCisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMzElIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPklTTy04ODU5LTcKKyAqICAgICAgPC9URD4KKyAqICA8L1RSPgorICogIDxUUj4KKyAqICAgICAgPFREIFdJRFRIPSIzMyUiPklTTyBMYXRpbiBIZWJyZXc8L1REPgorICogICAgICA8VEQgV0lEVEg9IjE1JSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5JU08tODg1OS04CisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTIlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPk1JTUUKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIzMSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+SVNPLTg4NTktOAorICogICAgICA8L1REPgorICogIDwvVFI+CisgKiAgPFRSPgorICogICAgICA8VEQgV0lEVEg9IjMzJSI+SVNPIExhdGluIDU8L1REPgorICogICAgICA8VEQgV0lEVEg9IjE1JSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5JU08tODg1OS05CisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTIlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPk1JTUUKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIzMSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+SVNPLTg4NTktOQorICogICAgICA8L1REPgorICogIDwvVFI+CisgKiAgPFRSPgorICogICAgICA8VEQgV0lEVEg9IjMzJSI+RUJDRElDOiBVUzwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTUlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPmViY2RpYy1jcC11cworICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjEyJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5JQU5BCisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMzElIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPmNwMDM3CisgKiAgICAgIDwvVEQ+CisgKiAgPC9UUj4KKyAqICA8VFI+CisgKiAgICAgIDxURCBXSURUSD0iMzMlIj5FQkNESUM6IENhbmFkYTwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTUlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPmViY2RpYy1jcC1jYQorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjEyJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5JQU5BCisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMzElIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPmNwMDM3CisgKiAgICAgIDwvVEQ+CisgKiAgPC9UUj4KKyAqICA8VFI+CisgKiAgICAgIDxURCBXSURUSD0iMzMlIj5FQkNESUM6IE5ldGhlcmxhbmRzPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxNSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+ZWJjZGljLWNwLW5sCisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTIlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPklBTkEKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIzMSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+Y3AwMzcKKyAqICAgICAgPC9URD4KKyAqICA8L1RSPgorICogIDxUUj4KKyAqICAgICAgPFREIFdJRFRIPSIzMyUiPkVCQ0RJQzogRGVubWFyazwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTUlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPmViY2RpYy1jcC1kaworICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjEyJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5JQU5BCisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMzElIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPmNwMjc3CisgKiAgICAgIDwvVEQ+CisgKiAgPC9UUj4KKyAqICA8VFI+CisgKiAgICAgIDxURCBXSURUSD0iMzMlIj5FQkNESUM6IE5vcndheTwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTUlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPmViY2RpYy1jcC1ubworICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjEyJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5JQU5BCisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMzElIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPmNwMjc3CisgKiAgICAgIDwvVEQ+CisgKiAgPC9UUj4KKyAqICA8VFI+CisgKiAgICAgIDxURCBXSURUSD0iMzMlIj5FQkNESUM6IEZpbmxhbmQ8L1REPgorICogICAgICA8VEQgV0lEVEg9IjE1JSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5lYmNkaWMtY3AtZmkKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxMiUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+SUFOQQorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjMxJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5jcDI3OAorICogICAgICA8L1REPgorICogIDwvVFI+CisgKiAgPFRSPgorICogICAgICA8VEQgV0lEVEg9IjMzJSI+RUJDRElDOiBTd2VkZW48L1REPgorICogICAgICA8VEQgV0lEVEg9IjE1JSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5lYmNkaWMtY3Atc2UKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxMiUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+SUFOQQorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjMxJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5jcDI3OAorICogICAgICA8L1REPgorICogIDwvVFI+CisgKiAgPFRSPgorICogICAgICA8VEQgV0lEVEg9IjMzJSI+RUJDRElDOiBJdGFseTwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTUlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPmViY2RpYy1jcC1pdAorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjEyJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5JQU5BCisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMzElIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPmNwMjgwCisgKiAgICAgIDwvVEQ+CisgKiAgPC9UUj4KKyAqICA8VFI+CisgKiAgICAgIDxURCBXSURUSD0iMzMlIj5FQkNESUM6IFNwYWluLCBMYXRpbiBBbWVyaWNhPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxNSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+ZWJjZGljLWNwLWVzCisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTIlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPklBTkEKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIzMSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+Y3AyODQKKyAqICAgICAgPC9URD4KKyAqICA8L1RSPgorICogIDxUUj4KKyAqICAgICAgPFREIFdJRFRIPSIzMyUiPkVCQ0RJQzogR3JlYXQgQnJpdGFpbjwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTUlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPmViY2RpYy1jcC1nYgorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjEyJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5JQU5BCisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMzElIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPmNwMjg1CisgKiAgICAgIDwvVEQ+CisgKiAgPC9UUj4KKyAqICA8VFI+CisgKiAgICAgIDxURCBXSURUSD0iMzMlIj5FQkNESUM6IEZyYW5jZTwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTUlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPmViY2RpYy1jcC1mcgorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjEyJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5JQU5BCisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMzElIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPmNwMjk3CisgKiAgICAgIDwvVEQ+CisgKiAgPC9UUj4KKyAqICA8VFI+CisgKiAgICAgIDxURCBXSURUSD0iMzMlIj5FQkNESUM6IEFyYWJpYzwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTUlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPmViY2RpYy1jcC1hcjEKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxMiUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+SUFOQQorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjMxJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5jcDQyMAorICogICAgICA8L1REPgorICogIDwvVFI+CisgKiAgPFRSPgorICogICAgICA8VEQgV0lEVEg9IjMzJSI+RUJDRElDOiBIZWJyZXc8L1REPgorICogICAgICA8VEQgV0lEVEg9IjE1JSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5lYmNkaWMtY3AtaGUKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxMiUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+SUFOQQorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjMxJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5jcDQyNAorICogICAgICA8L1REPgorICogIDwvVFI+CisgKiAgPFRSPgorICogICAgICA8VEQgV0lEVEg9IjMzJSI+RUJDRElDOiBTd2l0emVybGFuZDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTUlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPmViY2RpYy1jcC1jaAorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjEyJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5JQU5BCisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMzElIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPmNwNTAwCisgKiAgICAgIDwvVEQ+CisgKiAgPC9UUj4KKyAqICA8VFI+CisgKiAgICAgIDxURCBXSURUSD0iMzMlIj5FQkNESUM6IFJvZWNlPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxNSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+ZWJjZGljLWNwLXJvZWNlCisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTIlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPklBTkEKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIzMSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+Y3A4NzAKKyAqICAgICAgPC9URD4KKyAqICA8L1RSPgorICogIDxUUj4KKyAqICAgICAgPFREIFdJRFRIPSIzMyUiPkVCQ0RJQzogWXVnb3NsYXZpYTwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTUlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPmViY2RpYy1jcC15dQorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjEyJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5JQU5BCisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMzElIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPmNwODcwCisgKiAgICAgIDwvVEQ+CisgKiAgPC9UUj4KKyAqICA8VFI+CisgKiAgICAgIDxURCBXSURUSD0iMzMlIj5FQkNESUM6IEljZWxhbmQ8L1REPgorICogICAgICA8VEQgV0lEVEg9IjE1JSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5lYmNkaWMtY3AtaXMKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxMiUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+SUFOQQorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjMxJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5jcDg3MQorICogICAgICA8L1REPgorICogIDwvVFI+CisgKiAgPFRSPgorICogICAgICA8VEQgV0lEVEg9IjMzJSI+RUJDRElDOiBVcmR1PC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxNSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+ZWJjZGljLWNwLWFyMgorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjEyJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5JQU5BCisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMzElIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPmNwOTE4CisgKiAgICAgIDwvVEQ+CisgKiAgPC9UUj4KKyAqICA8VFI+CisgKiAgICAgIDxURCBXSURUSD0iMzMlIj5DaGluZXNlIGZvciBQUkMsIG1peGVkIDEvMiBieXRlPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxNSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+Z2IyMzEyCisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTIlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPk1JTUUKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIzMSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+R0IyMzEyCisgKiAgICAgIDwvVEQ+CisgKiAgPC9UUj4KKyAqICA8VFI+CisgKiAgICAgIDxURCBXSURUSD0iMzMlIj5FeHRlbmRlZCBVbml4IENvZGUsIHBhY2tlZCBmb3IgSmFwYW5lc2U8L1REPgorICogICAgICA8VEQgV0lEVEg9IjE1JSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5ldWMtanAKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxMiUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+TUlNRQorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjMxJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5ldWNqaXMKKyAqICAgICAgPC9URD4KKyAqICA8L1RSPgorICogIDxUUj4KKyAqICAgICAgPFREIFdJRFRIPSIzMyUiPkphcGFuZXNlOiBpc28tMjAyMi1qcDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTUlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPmlzby0yMDIwLWpwCisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTIlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPk1JTUUKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIzMSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+SklTCisgKiAgICAgIDwvVEQ+CisgKiAgPC9UUj4KKyAqICA8VFI+CisgKiAgICAgIDxURCBXSURUSD0iMzMlIj5KYXBhbmVzZTogU2hpZnQgSklTPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxNSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+U2hpZnRfSklTCisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTIlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPk1JTUUKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIzMSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+U0pJUworICogICAgICA8L1REPgorICogIDwvVFI+CisgKiAgPFRSPgorICogICAgICA8VEQgV0lEVEg9IjMzJSI+Q2hpbmVzZTogQmlnNTwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTUlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPkJpZzUKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxMiUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+TUlNRQorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjMxJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5CaWc1CisgKiAgICAgIDwvVEQ+CisgKiAgPC9UUj4KKyAqICA8VFI+CisgKiAgICAgIDxURCBXSURUSD0iMzMlIj5FeHRlbmRlZCBVbml4IENvZGUsIHBhY2tlZCBmb3IgS29yZWFuPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIxNSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+ZXVjLWtyCisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTIlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPk1JTUUKKyAqICAgICAgPC9URD4KKyAqICAgICAgPFREIFdJRFRIPSIzMSUiPgorICogICAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+aXNvMjAyMmtyCisgKiAgICAgIDwvVEQ+CisgKiAgPC9UUj4KKyAqICA8VFI+CisgKiAgICAgIDxURCBXSURUSD0iMzMlIj5DeXJpbGxpYzwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMTUlIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPmtvaTgtcgorICogICAgICA8L1REPgorICogICAgICA8VEQgV0lEVEg9IjEyJSI+CisgKiAgICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5NSU1FCisgKiAgICAgIDwvVEQ+CisgKiAgICAgIDxURCBXSURUSD0iMzElIj4KKyAqICAgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPmtvaTgtcgorICogICAgICA8L1REPgorICogIDwvVFI+CisgKiA8L1RBQkxFPgorICogCisgKiBAYXV0aG9yIFRBTVVSQSBLZW50LCBJQk0KKyAqIEBhdXRob3IgQW5keSBDbGFyaywgSUJNCisgKgorICogQHZlcnNpb24gJElkJAorICovCitwdWJsaWMgY2xhc3MgRW5jb2RpbmdNYXAgeworCisgICAgLy8KKyAgICAvLyBEYXRhCisgICAgLy8KKworICAgIC8qKiBmSUFOQTJKYXZhTWFwICovCisgICAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBIYXNodGFibGUgZklBTkEySmF2YU1hcCA9IG5ldyBIYXNodGFibGUoKTsKKworICAgIC8qKiBmSmF2YTJJQU5BTWFwICovCisgICAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBIYXNodGFibGUgZkphdmEySUFOQU1hcCA9IG5ldyBIYXNodGFibGUoKTsKKworICAgIC8vCisgICAgLy8gU3RhdGljIGluaXRpYWxpemF0aW9uCisgICAgLy8KKworICAgIHN0YXRpYyB7CisKKyAgICAgICAgLy8gYWRkIElBTkEgdG8gSmF2YSBlbmNvZGluZyBtYXBwaW5ncy4KKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkJJRzUiLCAgICAgICAgICAgICJCaWc1Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDU0JJRzUiLCAgICAgICAgICAgICJCaWc1Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDUDAzNyIsICAgICJDUDAzNyIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSUJNMDM3IiwgICAgIkNQMDM3Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDU0lCTTAzNyIsICAgICJDUDAzNyIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiRUJDRElDLUNQLVVTIiwgICAgIkNQMDM3Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJFQkNESUMtQ1AtQ0EiLCAgICAiQ1AwMzciKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkVCQ0RJQy1DUC1OTCIsICAgICJDUDAzNyIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiRUJDRElDLUNQLVdUIiwgICAgIkNQMDM3Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJJQk0yNzMiLCAgICAiQ1AyNzMiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkNQMjczIiwgICAgIkNQMjczIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDU0lCTTI3MyIsICAgICJDUDI3MyIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSUJNMjc3IiwgICAgIkNQMjc3Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDUDI3NyIsICAgICJDUDI3NyIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiQ1NJQk0yNzciLCAgICAiQ1AyNzciKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkVCQ0RJQy1DUC1ESyIsICAgICJDUDI3NyIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiRUJDRElDLUNQLU5PIiwgICAgIkNQMjc3Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJJQk0yNzgiLCAgICAiQ1AyNzgiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkNQMjc4IiwgICAgIkNQMjc4Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDU0lCTTI3OCIsICAgICJDUDI3OCIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiRUJDRElDLUNQLUZJIiwgICAgIkNQMjc4Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJFQkNESUMtQ1AtU0UiLCAgICAiQ1AyNzgiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklCTTI4MCIsICAgICJDUDI4MCIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiQ1AyODAiLCAgICAiQ1AyODAiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkNTSUJNMjgwIiwgICAgIkNQMjgwIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJFQkNESUMtQ1AtSVQiLCAgICAiQ1AyODAiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklCTTI4NCIsICAgICJDUDI4NCIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiQ1AyODQiLCAgICAiQ1AyODQiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkNTSUJNMjg0IiwgICAgIkNQMjg0Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJFQkNESUMtQ1AtRVMiLCAgICAiQ1AyODQiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkVCQ0RJQy1DUC1HQiIsICAgICJDUDI4NSIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSUJNMjg1IiwgICAgIkNQMjg1Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDUDI4NSIsICAgICJDUDI4NSIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiQ1NJQk0yODUiLCAgICAiQ1AyODUiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkVCQ0RJQy1KUC1LQU5BIiwgICAgIkNQMjkwIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJJQk0yOTAiLCAgICAiQ1AyOTAiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkNQMjkwIiwgICAgIkNQMjkwIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDU0lCTTI5MCIsICAgICJDUDI5MCIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiRUJDRElDLUNQLUZSIiwgICAgIkNQMjk3Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJJQk0yOTciLCAgICAiQ1AyOTciKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkNQMjk3IiwgICAgIkNQMjk3Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDU0lCTTI5NyIsICAgICJDUDI5NyIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiRUJDRElDLUNQLUFSMSIsICAgIkNQNDIwIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJJQk00MjAiLCAgICAiQ1A0MjAiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkNQNDIwIiwgICAgIkNQNDIwIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDU0lCTTQyMCIsICAgICJDUDQyMCIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiRUJDRElDLUNQLUhFIiwgICAgIkNQNDI0Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJJQk00MjQiLCAgICAiQ1A0MjQiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkNQNDI0IiwgICAgIkNQNDI0Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDU0lCTTQyNCIsICAgICJDUDQyNCIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSUJNNDM3IiwgICAgIkNQNDM3Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCI0MzciLCAgICAiQ1A0MzciKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkNQNDM3IiwgICAgIkNQNDM3Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDU1BDOENPREVQQUdFNDM3IiwgICAgIkNQNDM3Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJFQkNESUMtQ1AtQ0giLCAgICAiQ1A1MDAiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklCTTUwMCIsICAgICJDUDUwMCIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiQ1A1MDAiLCAgICAiQ1A1MDAiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkNTSUJNNTAwIiwgICAgIkNQNTAwIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJFQkNESUMtQ1AtQ0giLCAgICAiQ1A1MDAiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkVCQ0RJQy1DUC1CRSIsICAgICJDUDUwMCIpOyAKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklCTTc3NSIsICAgICJDUDc3NSIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiQ1A3NzUiLCAgICAiQ1A3NzUiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkNTUEM3NzVCQUxUSUMiLCAgICAiQ1A3NzUiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklCTTg1MCIsICAgICJDUDg1MCIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiODUwIiwgICAgIkNQODUwIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDUDg1MCIsICAgICJDUDg1MCIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiQ1NQQzg1ME1VTFRJTElOR1VBTCIsICAgICJDUDg1MCIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSUJNODUyIiwgICAgIkNQODUyIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCI4NTIiLCAgICAiQ1A4NTIiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkNQODUyIiwgICAgIkNQODUyIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDU1BDUDg1MiIsICAgICJDUDg1MiIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSUJNODU1IiwgICAgIkNQODU1Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCI4NTUiLCAgICAiQ1A4NTUiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkNQODU1IiwgICAgIkNQODU1Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDU0lCTTg1NSIsICAgICJDUDg1NSIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSUJNODU3IiwgICAgIkNQODU3Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCI4NTciLCAgICAiQ1A4NTciKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkNQODU3IiwgICAgIkNQODU3Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDU0lCTTg1NyIsICAgICJDUDg1NyIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSUJNMDA4NTgiLCAgICAiQ1A4NTgiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkNQMDA4NTgiLCAgICAiQ1A4NTgiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkNDU0lEMDA4NTgiLCAgICAiQ1A4NTgiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklCTTg2MCIsICAgICJDUDg2MCIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiODYwIiwgICAgIkNQODYwIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDUDg2MCIsICAgICJDUDg2MCIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiQ1NJQk04NjAiLCAgICAiQ1A4NjAiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklCTTg2MSIsICAgICJDUDg2MSIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiODYxIiwgICAgIkNQODYxIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDUDg2MSIsICAgICJDUDg2MSIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiQ1AtSVMiLCAgICAiQ1A4NjEiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkNTSUJNODYxIiwgICAgIkNQODYxIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJJQk04NjIiLCAgICAiQ1A4NjIiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIjg2MiIsICAgICJDUDg2MiIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiQ1A4NjIiLCAgICAiQ1A4NjIiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkNTUEM4NjJMQVRJTkhFQlJFVyIsICAgICJDUDg2MiIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSUJNODYzIiwgICAgIkNQODYzIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCI4NjMiLCAgICAiQ1A4NjMiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkNQODYzIiwgICAgIkNQODYzIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDU0lCTTg2MyIsICAgICJDUDg2MyIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSUJNODY0IiwgICAgIkNQODY0Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDUDg2NCIsICAgICJDUDg2NCIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiQ1NJQk04NjQiLCAgICAiQ1A4NjQiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklCTTg2NSIsICAgICJDUDg2NSIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiODY1IiwgICAgIkNQODY1Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDUDg2NSIsICAgICJDUDg2NSIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiQ1NJQk04NjUiLCAgICAiQ1A4NjUiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklCTTg2NiIsICAgICJDUDg2NiIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiODY2IiwgICAgIkNQODY2Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDUDg2NiIsICAgICJDUDg2NiIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiQ1NJQk04NjYiLCAgICAiQ1A4NjYiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklCTTg2OCIsICAgICJDUDg2OCIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiQ1A4NjgiLCAgICAiQ1A4NjgiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkNTSUJNODY4IiwgICAgIkNQODY4Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDUC1BUiIsICAgICAgICAiQ1A4NjgiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklCTTg2OSIsICAgICJDUDg2OSIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiQ1A4NjkiLCAgICAiQ1A4NjkiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkNTSUJNODY5IiwgICAgIkNQODY5Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDUC1HUiIsICAgICAgICAiQ1A4NjkiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklCTTg3MCIsICAgICJDUDg3MCIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiQ1A4NzAiLCAgICAiQ1A4NzAiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkNTSUJNODcwIiwgICAgIkNQODcwIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJFQkNESUMtQ1AtUk9FQ0UiLCAiQ1A4NzAiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkVCQ0RJQy1DUC1ZVSIsICAgICJDUDg3MCIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSUJNODcxIiwgICAgIkNQODcxIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDUDg3MSIsICAgICJDUDg3MSIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiQ1NJQk04NzEiLCAgICAiQ1A4NzEiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkVCQ0RJQy1DUC1JUyIsICAgICJDUDg3MSIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSUJNOTE4IiwgICAgIkNQOTE4Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDUDkxOCIsICAgICJDUDkxOCIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiQ1NJQk05MTgiLCAgICAiQ1A5MTgiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkVCQ0RJQy1DUC1BUjIiLCAgICJDUDkxOCIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSUJNMDA5MjQiLCAgICAiQ1A5MjQiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkNQMDA5MjQiLCAgICAiQ1A5MjQiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkNDU0lEMDA5MjQiLCAgICAiQ1A5MjQiKTsKKyAgICAgICAgLy8gaXMgdGhpcyBhbiBlcnJvcj8/PworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiRUJDRElDLUxBVElOOS0tRVVSTyIsICAgICJDUDkyNCIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSUJNMTAyNiIsICAgICJDUDEwMjYiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkNQMTAyNiIsICAgICJDUDEwMjYiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkNTSUJNMTAyNiIsICAgICJDUDEwMjYiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklCTTAxMTQwIiwgICAgIkNwMTE0MCIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiQ1AwMTE0MCIsICAgICJDcDExNDAiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkNDU0lEMDExNDAiLCAgICAiQ3AxMTQwIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJJQk0wMTE0MSIsICAgICJDcDExNDEiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkNQMDExNDEiLCAgICAiQ3AxMTQxIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDQ1NJRDAxMTQxIiwgICAgIkNwMTE0MSIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSUJNMDExNDIiLCAgICAiQ3AxMTQyIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDUDAxMTQyIiwgICAgIkNwMTE0MiIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiQ0NTSUQwMTE0MiIsICAgICJDcDExNDIiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklCTTAxMTQzIiwgICAgIkNwMTE0MyIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiQ1AwMTE0MyIsICAgICJDcDExNDMiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkNDU0lEMDExNDMiLCAgICAiQ3AxMTQzIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJJQk0wMTE0NCIsICAgICJDcDExNDQiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkNQMDExNDQiLCAgICAiQ3AxMTQ0Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDQ1NJRDAxMTQ0IiwgICAgIkNwMTE0NCIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSUJNMDExNDUiLCAgICAiQ3AxMTQ1Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDUDAxMTQ1IiwgICAgIkNwMTE0NSIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiQ0NTSUQwMTE0NSIsICAgICJDcDExNDUiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklCTTAxMTQ2IiwgICAgIkNwMTE0NiIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiQ1AwMTE0NiIsICAgICJDcDExNDYiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkNDU0lEMDExNDYiLCAgICAiQ3AxMTQ2Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJJQk0wMTE0NyIsICAgICJDcDExNDciKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkNQMDExNDciLCAgICAiQ3AxMTQ3Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDQ1NJRDAxMTQ3IiwgICAgIkNwMTE0NyIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSUJNMDExNDgiLCAgICAiQ3AxMTQ4Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDUDAxMTQ4IiwgICAgIkNwMTE0OCIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiQ0NTSUQwMTE0OCIsICAgICJDcDExNDgiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklCTTAxMTQ5IiwgICAgIkNwMTE0OSIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiQ1AwMTE0OSIsICAgICJDcDExNDkiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkNDU0lEMDExNDkiLCAgICAiQ3AxMTQ5Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJFVUMtSlAiLCAgICAgICAgICAiRVVDSklTIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDU0VVQ1BLREZNVEpBUEFORVNFIiwgICAgICAgICAgIkVVQ0pJUyIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiRVhURU5ERURfVU5JWF9DT0RFX1BBQ0tFRF9GT1JNQVRfRk9SX0pBUEFORVNFIiwgICAgICAgICAgIkVVQ0pJUyIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiRVVDLUtSIiwgICAgICAgICAgIktTQzU2MDEiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkNTRVVDS1IiLCAgICAgICAgICAiS1NDNTYwMSIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiS1NfQ181NjAxLTE5ODciLCAgICAgICAgICAiS1NfQ181NjAxLTE5ODciKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklTTy1JUi0xNDkiLCAgICAgICAgICAiS1NfQ181NjAxLTE5ODciKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIktTX0NfNTYwMS0xOTg5IiwgICAgICAgICAgIktTX0NfNTYwMS0xOTg3Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJLU0NfNTYwMSIsICAgICAgICAgICJLU19DXzU2MDEtMTk4NyIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiS09SRUFOIiwgICAgICAgICAgIktTX0NfNTYwMS0xOTg3Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDU0tTQzU2MDExOTg3IiwgICAgICAgICAgIktTX0NfNTYwMS0xOTg3Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJHQjIzMTIiLCAgICAgICAgICAiR0IyMzEyIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDU0dCMjMxMiIsICAgICAgICAgICJHQjIzMTIiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklTTy0yMDIyLUpQIiwgICAgICJKSVMiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkNTSVNPMjAyMkpQIiwgICAgICJKSVMiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklTTy0yMDIyLUtSIiwgICAgICJJU08yMDIyS1IiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkNTSVNPMjAyMktSIiwgICAgICJJU08yMDIyS1IiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklTTy0yMDIyLUNOIiwgICAgICJJU08yMDIyQ04iKTsKKworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiWDAyMDEiLCAgIkpJUzAyMDEiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkNTSVNPMTNKSVNDNjIyMEpQIiwgIkpJUzAyMDEiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIlgwMjA4IiwgICJKSVMwMjA4Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJJU08tSVItODciLCAgIkpJUzAyMDgiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIlgwMjA4ZGJpSklTX1gwMjA4LTE5ODMiLCAgIkpJUzAyMDgiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkNTSVNPODdKSVNYMDIwOCIsICAiSklTMDIwOCIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiWDAyMTIiLCAgIkpJUzAyMTIiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklTTy1JUi0xNTkiLCAgIkpJUzAyMTIiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkNTSVNPMTU5SklTWDAyMTIxOTkwIiwgICJKSVMwMjEyIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJHQjE4MDMwIiwgICAgICAgIkdCMTgwMzAiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkdCSyIsICAgICAgICJHQksiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkNQOTM2IiwgICAgICAgIkdCSyIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiTVM5MzYiLCAgICAgICAiR0JLIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJXSU5ET1dTLTkzNiIsICAgICAgICJHQksiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIlNISUZUX0pJUyIsICAgICAgICJTSklTIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDU1NISUZUSklTIiwgICAgICAgIlNKSVMiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIk1TX0tBTkpJIiwgICAgICAgIlNKSVMiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIldJTkRPV1MtMzFKIiwgICAgICAgIk1TOTMyIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDU1dJTkRPV1MzMUoiLCAgICAgICAiTVM5MzIiKTsKKworCSAgICAvLyBBZGQgc3VwcG9ydCBmb3IgQ3AxMjUyIGFuZCBpdHMgZnJpZW5kcworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiV0lORE9XUy0xMjUwIiwgICAiQ3AxMjUwIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJXSU5ET1dTLTEyNTEiLCAgICJDcDEyNTEiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIldJTkRPV1MtMTI1MiIsICAgIkNwMTI1MiIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiV0lORE9XUy0xMjUzIiwgICAiQ3AxMjUzIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJXSU5ET1dTLTEyNTQiLCAgICJDcDEyNTQiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIldJTkRPV1MtMTI1NSIsICAgIkNwMTI1NSIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiV0lORE9XUy0xMjU2IiwgICAiQ3AxMjU2Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJXSU5ET1dTLTEyNTciLCAgICJDcDEyNTciKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIldJTkRPV1MtMTI1OCIsICAgIkNwMTI1OCIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiVElTLTYyMCIsICAgIlRJUzYyMCIpOworCisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJJU08tODg1OS0xIiwgICAgICAiSVNPODg1OV8xIik7IAorICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSVNPLUlSLTEwMCIsICAgICAgIklTTzg4NTlfMSIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSVNPXzg4NTktMSIsICAgICAgIklTTzg4NTlfMSIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiTEFUSU4xIiwgICAgICAiSVNPODg1OV8xIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDU0lTT0xBVElOMSIsICAgICAgIklTTzg4NTlfMSIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiTDEiLCAgICAgICJJU084ODU5XzEiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklCTTgxOSIsICAgICAgIklTTzg4NTlfMSIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiQ1A4MTkiLCAgICAgICJJU084ODU5XzEiKTsKKworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSVNPLTg4NTktMiIsICAgICAgIklTTzg4NTlfMiIpOyAKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklTTy1JUi0xMDEiLCAgICAgICJJU084ODU5XzIiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklTT184ODU5LTIiLCAgICAgICJJU084ODU5XzIiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkxBVElOMiIsICAgICAgIklTTzg4NTlfMiIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiQ1NJU09MQVRJTjIiLCAgICAgICJJU084ODU5XzIiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkwyIiwgICAgICAiSVNPODg1OV8yIik7CisKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklTTy04ODU5LTMiLCAgICAgICJJU084ODU5XzMiKTsgCisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJJU08tSVItMTA5IiwgICAgICAiSVNPODg1OV8zIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJJU09fODg1OS0zIiwgICAgICAiSVNPODg1OV8zIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJMQVRJTjMiLCAgICAgICJJU084ODU5XzMiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkNTSVNPTEFUSU4zIiwgICAgICAiSVNPODg1OV8zIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJMMyIsICAgICAgIklTTzg4NTlfMyIpOworCisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJJU08tODg1OS00IiwgICAgICAiSVNPODg1OV80Iik7IAorICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSVNPLUlSLTExMCIsICAgICAgIklTTzg4NTlfNCIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSVNPXzg4NTktNCIsICAgICAgIklTTzg4NTlfNCIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiTEFUSU40IiwgICAgICAiSVNPODg1OV80Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDU0lTT0xBVElONCIsICAgICAgIklTTzg4NTlfNCIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiTDQiLCAgICAgICJJU084ODU5XzQiKTsKKworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSVNPLTg4NTktNSIsICAgICAgIklTTzg4NTlfNSIpOyAKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklTTy1JUi0xNDQiLCAgICAgICJJU084ODU5XzUiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklTT184ODU5LTUiLCAgICAgICJJU084ODU5XzUiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkNZUklMTElDIiwgICAgICAiSVNPODg1OV81Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDU0lTT0xBVElOQ1lSSUxMSUMiLCAgICAgICJJU084ODU5XzUiKTsKKworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSVNPLTg4NTktNiIsICAgICAgIklTTzg4NTlfNiIpOyAKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklTTy1JUi0xMjciLCAgICAgICJJU084ODU5XzYiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklTT184ODU5LTYiLCAgICAgICJJU084ODU5XzYiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkVDTUEtMTE0IiwgICAgICAiSVNPODg1OV82Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJBU01PLTcwOCIsICAgICAgIklTTzg4NTlfNiIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiQVJBQklDIiwgICAgICAiSVNPODg1OV82Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDU0lTT0xBVElOQVJBQklDIiwgICAgICAiSVNPODg1OV82Iik7CisKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklTTy04ODU5LTciLCAgICAgICJJU084ODU5XzciKTsgCisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJJU08tSVItMTI2IiwgICAgICAiSVNPODg1OV83Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJJU09fODg1OS03IiwgICAgICAiSVNPODg1OV83Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJFTE9UXzkyOCIsICAgICAgIklTTzg4NTlfNyIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiRUNNQS0xMTgiLCAgICAgICJJU084ODU5XzciKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkdSRUVLIiwgICAgICAiSVNPODg1OV83Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJDU0lTT0xBVElOR1JFRUsiLCAgICAgICJJU084ODU5XzciKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkdSRUVLOCIsICAgICAgIklTTzg4NTlfNyIpOworCisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJJU08tODg1OS04IiwgICAgICAiSVNPODg1OV84Iik7IAorICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSVNPLTg4NTktOC1JIiwgICAgICAiSVNPODg1OV84Iik7IC8vIGFkZGVkIHNpbmNlIHRoaXMgZW5jb2Rpbmcgb25seSBkaWZmZXJzIHcuci50LiBwcmVzZW50YXRpb24gCisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJJU08tSVItMTM4IiwgICAgICAiSVNPODg1OV84Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJJU09fODg1OS04IiwgICAgICAiSVNPODg1OV84Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJIRUJSRVciLCAgICAgICJJU084ODU5XzgiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkNTSVNPTEFUSU5IRUJSRVciLCAgICAgICJJU084ODU5XzgiKTsKKworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSVNPLTg4NTktOSIsICAgICAgIklTTzg4NTlfOSIpOyAKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklTTy1JUi0xNDgiLCAgICAgICJJU084ODU5XzkiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklTT184ODU5LTkiLCAgICAgICJJU084ODU5XzkiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkxBVElONSIsICAgICAgIklTTzg4NTlfOSIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiQ1NJU09MQVRJTjUiLCAgICAgICJJU084ODU5XzkiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkw1IiwgICAgICAiSVNPODg1OV85Iik7CisKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklTTy04ODU5LTEzIiwgICAgICAiSVNPODg1OV8xMyIpOyAKKyAgICAgICAgCisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJJU08tODg1OS0xNSIsICAgICAgIklTTzg4NTlfMTVfRkRJUyIpOyAKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklTT184ODU5LTE1IiwgICAgICAiSVNPODg1OV8xNV9GRElTIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJMQVRJTi05IiwgICAgICAgICAgIklTTzg4NTlfMTVfRkRJUyIpOyAKKworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiS09JOC1SIiwgICAgICAgICAgIktPSThfUiIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiQ1NLT0k4UiIsICAgICAgICAgICJLT0k4X1IiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIlVTLUFTQ0lJIiwgICAgICAgICJBU0NJSSIpOyAKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklTTy1JUi02IiwgICAgICAgICJBU0NJSSIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiQU5TSV9YMy40LTE5NjgiLCAgICAgICAgIkFTQ0lJIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJBTlNJX1gzLjQtMTk4NiIsICAgICAgICAiQVNDSUkiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklTT182NDYuSVJWOjE5OTEiLCAgICAgICAgIkFTQ0lJIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJBU0NJSSIsICAgICAgICAiQVNDSUkiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkNTQVNDSUkiLCAgICAgICAgIkFTQ0lJIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJJU082NDYtVVMiLCAgICAgICAgIkFTQ0lJIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJVUyIsICAgICAgICAiQVNDSUkiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklCTTM2NyIsICAgICAgICAiQVNDSUkiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIkNQMzY3IiwgICAgICAgICJBU0NJSSIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiVVRGLTgiLCAgICAgICAgICAgIlVURjgiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIlVURi0xNiIsICAgICAgICAgICAiVVRGLTE2Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJVVEYtMTZCRSIsICAgICAgICAgICAiVW5pY29kZUJpZyIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiVVRGLTE2TEUiLCAgICAgICAgICAgIlVuaWNvZGVMaXR0bGUiKTsKKworICAgICAgICAvLyBzdXBwb3J0IGZvciAxMDQ3LCBhcyBwcm9wb3NlZCB0byBiZSBhZGRlZCB0byB0aGUgCisgICAgICAgIC8vIElBTkEgcmVnaXN0cnkgaW4gCisgICAgICAgIC8vIGh0dHA6Ly9saXN0cy53My5vcmcvQXJjaGl2ZXMvUHVibGljL2lldGYtY2hhcnNldC8yMDAySnVsU2VwLzAwNDkuaHRtbAorICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSUJNLTEwNDciLCAgICAiQ3AxMDQ3Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJJQk0xMDQ3IiwgICAgIkNwMTA0NyIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiQ1AxMDQ3IiwgICAgIkNwMTA0NyIpOworCisgICAgICAgIC8vIEFkZGluZyBuZXcgYWxpYXNlcyBhcyBwcm9wb3NlZCBpbgorICAgICAgICAvLyBodHRwOi8vbGlzdHMudzMub3JnL0FyY2hpdmVzL1B1YmxpYy9pZXRmLWNoYXJzZXQvMjAwMkp1bFNlcC8wMDU4Lmh0bWwKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklCTS0zNyIsICAgICJDUDAzNyIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSUJNLTI3MyIsICAgICJDUDI3MyIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSUJNLTI3NyIsICAgICJDUDI3NyIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSUJNLTI3OCIsICAgICJDUDI3OCIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSUJNLTI4MCIsICAgICJDUDI4MCIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSUJNLTI4NCIsICAgICJDUDI4NCIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSUJNLTI4NSIsICAgICJDUDI4NSIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSUJNLTI5MCIsICAgICJDUDI5MCIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSUJNLTI5NyIsICAgICJDUDI5NyIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSUJNLTQyMCIsICAgICJDUDQyMCIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSUJNLTQyNCIsICAgICJDUDQyNCIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSUJNLTQzNyIsICAgICJDUDQzNyIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSUJNLTUwMCIsICAgICJDUDUwMCIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSUJNLTc3NSIsICAgICJDUDc3NSIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSUJNLTg1MCIsICAgICJDUDg1MCIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSUJNLTg1MiIsICAgICJDUDg1MiIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSUJNLTg1NSIsICAgICJDUDg1NSIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSUJNLTg1NyIsICAgICJDUDg1NyIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSUJNLTg1OCIsICAgICJDUDg1OCIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSUJNLTg2MCIsICAgICJDUDg2MCIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSUJNLTg2MSIsICAgICJDUDg2MSIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSUJNLTg2MiIsICAgICJDUDg2MiIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSUJNLTg2MyIsICAgICJDUDg2MyIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSUJNLTg2NCIsICAgICJDUDg2NCIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSUJNLTg2NSIsICAgICJDUDg2NSIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSUJNLTg2NiIsICAgICJDUDg2NiIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSUJNLTg2OCIsICAgICJDUDg2OCIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSUJNLTg2OSIsICAgICJDUDg2OSIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSUJNLTg3MCIsICAgICJDUDg3MCIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSUJNLTg3MSIsICAgICJDUDg3MSIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSUJNLTkxOCIsICAgICJDUDkxOCIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSUJNLTkyNCIsICAgICJDUDkyNCIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSUJNLTEwMjYiLCAgICAiQ1AxMDI2Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJJQk0tMTE0MCIsICAgICJDcDExNDAiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklCTS0xMTQxIiwgICAgIkNwMTE0MSIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSUJNLTExNDIiLCAgICAiQ3AxMTQyIik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJJQk0tMTE0MyIsICAgICJDcDExNDMiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklCTS0xMTQ0IiwgICAgIkNwMTE0NCIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSUJNLTExNDUiLCAgICAiQ3AxMTQ1Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJJQk0tMTE0NiIsICAgICJDcDExNDYiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklCTS0xMTQ3IiwgICAgIkNwMTE0NyIpOworICAgICAgICBmSUFOQTJKYXZhTWFwLnB1dCgiSUJNLTExNDgiLCAgICAiQ3AxMTQ4Iik7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KCJJQk0tMTE0OSIsICAgICJDcDExNDkiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklCTS04MTkiLCAgICAgICJJU084ODU5XzEiKTsKKyAgICAgICAgZklBTkEySmF2YU1hcC5wdXQoIklCTS0zNjciLCAgICAgICAgIkFTQ0lJIik7CisKKyAgICAgICAgLy8gUkVWSVNJVDoKKyAgICAgICAgLy8gICBqOkNOUzExNjQzIC0+IEVVQy1UVz8KKyAgICAgICAgLy8gICBJU08tMjAyMi1DTj8gSVNPLTIwMjItQ04tRVhUPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIC8vIGFkZCBKYXZhIHRvIElBTkEgZW5jb2RpbmcgbWFwcGluZ3MKKyAgICAgICAgLy9mSmF2YTJJQU5BTWFwLnB1dCgiODg1OV8xIiwgICAgIlVTLUFTQ0lJIik7IC8vID8KKyAgICAgICAgZkphdmEySUFOQU1hcC5wdXQoIklTTzg4NTlfMSIsICAgICJJU08tODg1OS0xIik7CisgICAgICAgIGZKYXZhMklBTkFNYXAucHV0KCJJU084ODU5XzIiLCAgICAiSVNPLTg4NTktMiIpOworICAgICAgICBmSmF2YTJJQU5BTWFwLnB1dCgiSVNPODg1OV8zIiwgICAgIklTTy04ODU5LTMiKTsKKyAgICAgICAgZkphdmEySUFOQU1hcC5wdXQoIklTTzg4NTlfNCIsICAgICJJU08tODg1OS00Iik7CisgICAgICAgIGZKYXZhMklBTkFNYXAucHV0KCJJU084ODU5XzUiLCAgICAiSVNPLTg4NTktNSIpOworICAgICAgICBmSmF2YTJJQU5BTWFwLnB1dCgiSVNPODg1OV82IiwgICAgIklTTy04ODU5LTYiKTsKKyAgICAgICAgZkphdmEySUFOQU1hcC5wdXQoIklTTzg4NTlfNyIsICAgICJJU08tODg1OS03Iik7CisgICAgICAgIGZKYXZhMklBTkFNYXAucHV0KCJJU084ODU5XzgiLCAgICAiSVNPLTg4NTktOCIpOworICAgICAgICBmSmF2YTJJQU5BTWFwLnB1dCgiSVNPODg1OV85IiwgICAgIklTTy04ODU5LTkiKTsKKyAgICAgICAgZkphdmEySUFOQU1hcC5wdXQoIklTTzg4NTlfMTMiLCAgICAiSVNPLTg4NTktMTMiKTsKKyAgICAgICAgZkphdmEySUFOQU1hcC5wdXQoIklTTzg4NTlfMTUiLCAgICAiSVNPLTg4NTktMTUiKTsKKyAgICAgICAgZkphdmEySUFOQU1hcC5wdXQoIklTTzg4NTlfMTVfRkRJUyIsICAgICJJU08tODg1OS0xNSIpOworICAgICAgICBmSmF2YTJJQU5BTWFwLnB1dCgiQmlnNSIsICAgICAgIkJJRzUiKTsKKyAgICAgICAgZkphdmEySUFOQU1hcC5wdXQoIkNQMDM3IiwgICAgICJFQkNESUMtQ1AtVVMiKTsKKyAgICAgICAgZkphdmEySUFOQU1hcC5wdXQoIkNQMjczIiwgICAgICJJQk0yNzMiKTsKKyAgICAgICAgZkphdmEySUFOQU1hcC5wdXQoIkNQMjc3IiwgICAgICJFQkNESUMtQ1AtREsiKTsKKyAgICAgICAgZkphdmEySUFOQU1hcC5wdXQoIkNQMjc4IiwgICAgICJFQkNESUMtQ1AtRkkiKTsKKyAgICAgICAgZkphdmEySUFOQU1hcC5wdXQoIkNQMjgwIiwgICAgICJFQkNESUMtQ1AtSVQiKTsKKyAgICAgICAgZkphdmEySUFOQU1hcC5wdXQoIkNQMjg0IiwgICAgICJFQkNESUMtQ1AtRVMiKTsKKyAgICAgICAgZkphdmEySUFOQU1hcC5wdXQoIkNQMjg1IiwgICAgICJFQkNESUMtQ1AtR0IiKTsKKyAgICAgICAgZkphdmEySUFOQU1hcC5wdXQoIkNQMjkwIiwgICAgICJFQkNESUMtSlAtS0FOQSIpOworICAgICAgICBmSmF2YTJJQU5BTWFwLnB1dCgiQ1AyOTciLCAgICAgIkVCQ0RJQy1DUC1GUiIpOworICAgICAgICBmSmF2YTJJQU5BTWFwLnB1dCgiQ1A0MjAiLCAgICAgIkVCQ0RJQy1DUC1BUjEiKTsKKyAgICAgICAgZkphdmEySUFOQU1hcC5wdXQoIkNQNDI0IiwgICAgICJFQkNESUMtQ1AtSEUiKTsKKyAgICAgICAgZkphdmEySUFOQU1hcC5wdXQoIkNQNDM3IiwgICAgICJJQk00MzciKTsKKyAgICAgICAgZkphdmEySUFOQU1hcC5wdXQoIkNQNTAwIiwgICAgICJFQkNESUMtQ1AtQ0giKTsKKyAgICAgICAgZkphdmEySUFOQU1hcC5wdXQoIkNQNzc1IiwgICAgICJJQk03NzUiKTsKKyAgICAgICAgZkphdmEySUFOQU1hcC5wdXQoIkNQODUwIiwgICAgICJJQk04NTAiKTsKKyAgICAgICAgZkphdmEySUFOQU1hcC5wdXQoIkNQODUyIiwgICAgICJJQk04NTIiKTsKKyAgICAgICAgZkphdmEySUFOQU1hcC5wdXQoIkNQODU1IiwgICAgICJJQk04NTUiKTsKKyAgICAgICAgZkphdmEySUFOQU1hcC5wdXQoIkNQODU3IiwgICAgICJJQk04NTciKTsKKyAgICAgICAgZkphdmEySUFOQU1hcC5wdXQoIkNQODU4IiwgICAgICJJQk0wMDg1OCIpOworICAgICAgICBmSmF2YTJJQU5BTWFwLnB1dCgiQ1A4NjAiLCAgICAgIklCTTg2MCIpOworICAgICAgICBmSmF2YTJJQU5BTWFwLnB1dCgiQ1A4NjEiLCAgICAgIklCTTg2MSIpOworICAgICAgICBmSmF2YTJJQU5BTWFwLnB1dCgiQ1A4NjIiLCAgICAgIklCTTg2MiIpOworICAgICAgICBmSmF2YTJJQU5BTWFwLnB1dCgiQ1A4NjMiLCAgICAgIklCTTg2MyIpOworICAgICAgICBmSmF2YTJJQU5BTWFwLnB1dCgiQ1A4NjQiLCAgICAgIklCTTg2NCIpOworICAgICAgICBmSmF2YTJJQU5BTWFwLnB1dCgiQ1A4NjUiLCAgICAgIklCTTg2NSIpOworICAgICAgICBmSmF2YTJJQU5BTWFwLnB1dCgiQ1A4NjYiLCAgICAgIklCTTg2NiIpOworICAgICAgICBmSmF2YTJJQU5BTWFwLnB1dCgiQ1A4NjgiLCAgICAgIklCTTg2OCIpOworICAgICAgICBmSmF2YTJJQU5BTWFwLnB1dCgiQ1A4NjkiLCAgICAgIklCTTg2OSIpOworICAgICAgICBmSmF2YTJJQU5BTWFwLnB1dCgiQ1A4NzAiLCAgICAgIkVCQ0RJQy1DUC1ST0VDRSIpOworICAgICAgICBmSmF2YTJJQU5BTWFwLnB1dCgiQ1A4NzEiLCAgICAgIkVCQ0RJQy1DUC1JUyIpOworICAgICAgICBmSmF2YTJJQU5BTWFwLnB1dCgiQ1A5MTgiLCAgICAgIkVCQ0RJQy1DUC1BUjIiKTsKKyAgICAgICAgZkphdmEySUFOQU1hcC5wdXQoIkNQOTI0IiwgICAgICJJQk0wMDkyNCIpOworICAgICAgICBmSmF2YTJJQU5BTWFwLnB1dCgiQ1AxMDI2IiwgICAgICJJQk0xMDI2Iik7CisgICAgICAgIGZKYXZhMklBTkFNYXAucHV0KCJDcDAxMTQwIiwgICAgICJJQk0wMTE0MCIpOworICAgICAgICBmSmF2YTJJQU5BTWFwLnB1dCgiQ3AwMTE0MSIsICAgICAiSUJNMDExNDEiKTsKKyAgICAgICAgZkphdmEySUFOQU1hcC5wdXQoIkNwMDExNDIiLCAgICAgIklCTTAxMTQyIik7CisgICAgICAgIGZKYXZhMklBTkFNYXAucHV0KCJDcDAxMTQzIiwgICAgICJJQk0wMTE0MyIpOworICAgICAgICBmSmF2YTJJQU5BTWFwLnB1dCgiQ3AwMTE0NCIsICAgICAiSUJNMDExNDQiKTsKKyAgICAgICAgZkphdmEySUFOQU1hcC5wdXQoIkNwMDExNDUiLCAgICAgIklCTTAxMTQ1Iik7CisgICAgICAgIGZKYXZhMklBTkFNYXAucHV0KCJDcDAxMTQ2IiwgICAgICJJQk0wMTE0NiIpOworICAgICAgICBmSmF2YTJJQU5BTWFwLnB1dCgiQ3AwMTE0NyIsICAgICAiSUJNMDExNDciKTsKKyAgICAgICAgZkphdmEySUFOQU1hcC5wdXQoIkNwMDExNDgiLCAgICAgIklCTTAxMTQ4Iik7CisgICAgICAgIGZKYXZhMklBTkFNYXAucHV0KCJDcDAxMTQ5IiwgICAgICJJQk0wMTE0OSIpOworICAgICAgICBmSmF2YTJJQU5BTWFwLnB1dCgiRVVDSklTIiwgICAgIkVVQy1KUCIpOworICAgICAgICBmSmF2YTJJQU5BTWFwLnB1dCgiS1NfQ181NjAxLTE5ODciLCAgICAgICAgICAiS1NfQ181NjAxLTE5ODciKTsKKyAgICAgICAgZkphdmEySUFOQU1hcC5wdXQoIkdCMjMxMiIsICAgICJHQjIzMTIiKTsKKyAgICAgICAgZkphdmEySUFOQU1hcC5wdXQoIklTTzIwMjJLUiIsICJJU08tMjAyMi1LUiIpOworICAgICAgICBmSmF2YTJJQU5BTWFwLnB1dCgiSVNPMjAyMkNOIiwgIklTTy0yMDIyLUNOIik7CisgICAgICAgIGZKYXZhMklBTkFNYXAucHV0KCJKSVMiLCAgICAgICAiSVNPLTIwMjItSlAiKTsKKyAgICAgICAgZkphdmEySUFOQU1hcC5wdXQoIktPSThfUiIsICAgICJLT0k4LVIiKTsKKyAgICAgICAgZkphdmEySUFOQU1hcC5wdXQoIktTQzU2MDEiLCAgICJFVUMtS1IiKTsKKyAgICAgICAgZkphdmEySUFOQU1hcC5wdXQoIkdCMTgwMzAiLCAgICAgICJHQjE4MDMwIik7CisgICAgICAgIGZKYXZhMklBTkFNYXAucHV0KCJHQksiLCAgICAgICAiR0JLIik7CisgICAgICAgIGZKYXZhMklBTkFNYXAucHV0KCJTSklTIiwgICAgICAiU0hJRlRfSklTIik7CisgICAgICAgIGZKYXZhMklBTkFNYXAucHV0KCJNUzkzMiIsICAgICAgIldJTkRPV1MtMzFKIik7CisgICAgICAgIGZKYXZhMklBTkFNYXAucHV0KCJVVEY4IiwgICAgICAiVVRGLTgiKTsKKyAgICAgICAgZkphdmEySUFOQU1hcC5wdXQoIlVuaWNvZGUiLCAgICJVVEYtMTYiKTsKKyAgICAgICAgZkphdmEySUFOQU1hcC5wdXQoIlVuaWNvZGVCaWciLCAgICJVVEYtMTZCRSIpOworICAgICAgICBmSmF2YTJJQU5BTWFwLnB1dCgiVW5pY29kZUxpdHRsZSIsICAgIlVURi0xNkxFIik7CisgICAgICAgIGZKYXZhMklBTkFNYXAucHV0KCJKSVMwMjAxIiwgICJYMDIwMSIpOworICAgICAgICBmSmF2YTJJQU5BTWFwLnB1dCgiSklTMDIwOCIsICAiWDAyMDgiKTsKKyAgICAgICAgZkphdmEySUFOQU1hcC5wdXQoIkpJUzAyMTIiLCAgIklTTy1JUi0xNTkiKTsKKworICAgICAgICAvLyBwcm9wb3NlZCBhZGRpdGlvbiAoc2VlIGFib3ZlIGZvciBkZXRhaWxzKToKKyAgICAgICAgZkphdmEySUFOQU1hcC5wdXQoIkNQMTA0NyIsICAgICJJQk0xMDQ3Iik7CisKKyAgICB9IC8vIDxjbGluaXQ+KCkKKworICAgIC8vCisgICAgLy8gQ29uc3RydWN0b3JzCisgICAgLy8KKworICAgIC8qKiBEZWZhdWx0IGNvbnN0cnVjdG9yLiAqLworICAgIHB1YmxpYyBFbmNvZGluZ01hcCgpIHt9CisKKyAgICAvLworICAgIC8vIFB1YmxpYyBzdGF0aWMgbWV0aG9kcworICAgIC8vCisKKyAgICAvKioKKyAgICAgKiBBZGRzIGFuIElBTkEgdG8gSmF2YSBlbmNvZGluZyBuYW1lIG1hcHBpbmcuCisgICAgICogCisgICAgICogQHBhcmFtIGlhbmFFbmNvZGluZyBUaGUgSUFOQSBlbmNvZGluZyBuYW1lLgorICAgICAqIEBwYXJhbSBqYXZhRW5jb2RpbmcgVGhlIEphdmEgZW5jb2RpbmcgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHV0SUFOQTJKYXZhTWFwcGluZyhTdHJpbmcgaWFuYUVuY29kaW5nLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgamF2YUVuY29kaW5nKSB7CisgICAgICAgIGZJQU5BMkphdmFNYXAucHV0KGlhbmFFbmNvZGluZywgamF2YUVuY29kaW5nKTsKKyAgICB9IC8vIHB1dElBTkEySmF2YU1hcHBpbmcoU3RyaW5nLFN0cmluZykKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIEphdmEgZW5jb2RpbmcgbmFtZSBmb3IgdGhlIHNwZWNpZmllZCBJQU5BIGVuY29kaW5nIG5hbWUuCisgICAgICogCisgICAgICogQHBhcmFtIGlhbmFFbmNvZGluZyBUaGUgSUFOQSBlbmNvZGluZyBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldElBTkEySmF2YU1hcHBpbmcoU3RyaW5nIGlhbmFFbmNvZGluZykgeworICAgICAgICByZXR1cm4gKFN0cmluZylmSUFOQTJKYXZhTWFwLmdldChpYW5hRW5jb2RpbmcpOworICAgIH0gLy8gZ2V0SUFOQTJKYXZhTWFwcGluZyhTdHJpbmcpOlN0cmluZworCisgICAgLyoqCisgICAgICogUmVtb3ZlcyBhbiBJQU5BIHRvIEphdmEgZW5jb2RpbmcgbmFtZSBtYXBwaW5nLgorICAgICAqIAorICAgICAqIEBwYXJhbSBpYW5hRW5jb2RpbmcgVGhlIElBTkEgZW5jb2RpbmcgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyByZW1vdmVJQU5BMkphdmFNYXBwaW5nKFN0cmluZyBpYW5hRW5jb2RpbmcpIHsKKyAgICAgICAgcmV0dXJuIChTdHJpbmcpZklBTkEySmF2YU1hcC5yZW1vdmUoaWFuYUVuY29kaW5nKTsKKyAgICB9IC8vIHJlbW92ZUlBTkEySmF2YU1hcHBpbmcoU3RyaW5nKTpTdHJpbmcKKworICAgIC8qKgorICAgICAqIEFkZHMgYSBKYXZhIHRvIElBTkEgZW5jb2RpbmcgbmFtZSBtYXBwaW5nLgorICAgICAqIAorICAgICAqIEBwYXJhbSBqYXZhRW5jb2RpbmcgVGhlIEphdmEgZW5jb2RpbmcgbmFtZS4KKyAgICAgKiBAcGFyYW0gaWFuYUVuY29kaW5nIFRoZSBJQU5BIGVuY29kaW5nIG5hbWUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHB1dEphdmEySUFOQU1hcHBpbmcoU3RyaW5nIGphdmFFbmNvZGluZywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGlhbmFFbmNvZGluZykgeworICAgICAgICBmSmF2YTJJQU5BTWFwLnB1dChqYXZhRW5jb2RpbmcsIGlhbmFFbmNvZGluZyk7CisgICAgfSAvLyBwdXRKYXZhMklBTkFNYXBwaW5nKFN0cmluZyxTdHJpbmcpCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBJQU5BIGVuY29kaW5nIG5hbWUgZm9yIHRoZSBzcGVjaWZpZWQgSmF2YSBlbmNvZGluZyBuYW1lLgorICAgICAqIAorICAgICAqIEBwYXJhbSBqYXZhRW5jb2RpbmcgVGhlIEphdmEgZW5jb2RpbmcgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRKYXZhMklBTkFNYXBwaW5nKFN0cmluZyBqYXZhRW5jb2RpbmcpIHsKKyAgICAgICAgcmV0dXJuIChTdHJpbmcpZkphdmEySUFOQU1hcC5nZXQoamF2YUVuY29kaW5nKTsKKyAgICB9IC8vIGdldEphdmEySUFOQU1hcHBpbmcoU3RyaW5nKTpTdHJpbmcKKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgYSBKYXZhIHRvIElBTkEgZW5jb2RpbmcgbmFtZSBtYXBwaW5nLgorICAgICAqIAorICAgICAqIEBwYXJhbSBqYXZhRW5jb2RpbmcgVGhlIEphdmEgZW5jb2RpbmcgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyByZW1vdmVKYXZhMklBTkFNYXBwaW5nKFN0cmluZyBqYXZhRW5jb2RpbmcpIHsKKyAgICAgICAgcmV0dXJuIChTdHJpbmcpZkphdmEySUFOQU1hcC5yZW1vdmUoamF2YUVuY29kaW5nKTsKKyAgICB9IC8vIHJlbW92ZUphdmEySUFOQU1hcHBpbmcKKworfSAvLyBjbGFzcyBFbmNvZGluZ01hcApkaWZmIC0tZ2l0IGEvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3htbHBhcnNlci9QYXJzZXJVdGlscy5qYXZhIGIvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3htbHBhcnNlci9QYXJzZXJVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjViOTIxOGUKLS0tIC9kZXYvbnVsbAorKysgYi9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIveG1scGFyc2VyL1BhcnNlclV0aWxzLmphdmEKQEAgLTAsMCArMSwyMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphc3Blci54bWxwYXJzZXI7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CisKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLkphc3BlckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5jb21waWxlci5Mb2NhbGl6ZXI7CitpbXBvcnQgb3JnLnczYy5kb20uQ29tbWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKK2ltcG9ydCBvcmcudzNjLmRvbS5UZXh0OworaW1wb3J0IG9yZy54bWwuc2F4LkVudGl0eVJlc29sdmVyOworaW1wb3J0IG9yZy54bWwuc2F4LkVycm9ySGFuZGxlcjsKK2ltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb247CisKKworLyoqCisgKiBYTUwgcGFyc2luZyB1dGlsaXRpZXMgZm9yIHByb2Nlc3Npbmcgd2ViIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQKKyAqIGRlc2NyaXB0b3IgYW5kIHRhZyBsaWJyYXJ5IGRlc2NyaXB0b3IgZmlsZXMuICBGSVhNRSAtIG1ha2UgdGhlc2UKKyAqIHVzZSBhIHNlcGFyYXRlIGNsYXNzIGxvYWRlciBmb3IgdGhlIHBhcnNlciB0byBiZSB1c2VkLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgUGFyc2VyVXRpbHMgeworCisgICAgLy8gTG9nZ2VyCisgICAgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhQYXJzZXJVdGlscy5jbGFzcyk7CisKKyAgICAvKioKKyAgICAgKiBBbiBlcnJvciBoYW5kbGVyIGZvciB1c2Ugd2hlbiBwYXJzaW5nIFhNTCBkb2N1bWVudHMuCisgICAgICovCisgICAgc3RhdGljIEVycm9ySGFuZGxlciBlcnJvckhhbmRsZXIgPSBuZXcgTXlFcnJvckhhbmRsZXIoKTsKKworICAgIC8qKgorICAgICAqIEFuIGVudGl0eSByZXNvbHZlciBmb3IgdXNlIHdoZW4gcGFyc2luZyBYTUwgZG9jdW1lbnRzLgorICAgICAqLworICAgIHN0YXRpYyBFbnRpdHlSZXNvbHZlciBlbnRpdHlSZXNvbHZlciA9IG5ldyBNeUVudGl0eVJlc29sdmVyKCk7CisKKyAgICAvLyBUdXJuIG9mZiBmb3IgSlNQIDIuMCB1bnRpbCBzd2l0Y2ggb3ZlciB0byB1c2luZyB4c2NoZW1hLgorICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2YWxpZGF0aW5nID0gZmFsc2U7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisgICAgLyoqCisgICAgICogUGFyc2UgdGhlIHNwZWNpZmllZCBYTUwgZG9jdW1lbnQsIGFuZCByZXR1cm4gYSA8Y29kZT5UcmVlTm9kZTwvY29kZT4KKyAgICAgKiB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSByb290IG5vZGUgb2YgdGhlIGRvY3VtZW50IHRyZWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJpIFVSSSBvZiB0aGUgWE1MIGRvY3VtZW50IGJlaW5nIHBhcnNlZAorICAgICAqIEBwYXJhbSBpcyBJbnB1dCBzdHJlYW0gY29udGFpbmluZyB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEphc3BlckV4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBKYXNwZXJFeGNlcHRpb24gaWYgYSBwYXJzaW5nIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBUcmVlTm9kZSBwYXJzZVhNTERvY3VtZW50KFN0cmluZyB1cmksIElucHV0U3RyZWFtIGlzKQorICAgICAgICB0aHJvd3MgSmFzcGVyRXhjZXB0aW9uIHsKKworICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7CisKKyAgICAgICAgLy8gUGVyZm9ybSBhbiBYTUwgcGFyc2Ugb2YgdGhpcyBkb2N1bWVudCwgdmlhIEpBWFAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZmFjdG9yeSA9CisgICAgICAgICAgICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgZmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKKyAgICAgICAgICAgIGZhY3Rvcnkuc2V0VmFsaWRhdGluZyh2YWxpZGF0aW5nKTsKKyAgICAgICAgICAgIERvY3VtZW50QnVpbGRlciBidWlsZGVyID0gZmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RW50aXR5UmVzb2x2ZXIoZW50aXR5UmVzb2x2ZXIpOworICAgICAgICAgICAgYnVpbGRlci5zZXRFcnJvckhhbmRsZXIoZXJyb3JIYW5kbGVyKTsKKyAgICAgICAgICAgIGRvY3VtZW50ID0gYnVpbGRlci5wYXJzZShpcyk7CisJfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEphc3BlckV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgianNwLmVycm9yLnBhcnNlLnhtbCIsIHVyaSksIGV4KTsKKwl9IGNhdGNoIChTQVhQYXJzZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEphc3BlckV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIChMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgianNwLmVycm9yLnBhcnNlLnhtbC5saW5lIiwKKwkJCQkgICAgICB1cmksCisJCQkJICAgICAgSW50ZWdlci50b1N0cmluZyhleC5nZXRMaW5lTnVtYmVyKCkpLAorCQkJCSAgICAgIEludGVnZXIudG9TdHJpbmcoZXguZ2V0Q29sdW1uTnVtYmVyKCkpKSwKKwkJIGV4KTsKKwl9IGNhdGNoIChTQVhFeGNlcHRpb24gc3gpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBKYXNwZXJFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAoTG9jYWxpemVyLmdldE1lc3NhZ2UoImpzcC5lcnJvci5wYXJzZS54bWwiLCB1cmkpLCBzeCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSmFzcGVyRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKExvY2FsaXplci5nZXRNZXNzYWdlKCJqc3AuZXJyb3IucGFyc2UueG1sIiwgdXJpKSwgaW8pOworCX0KKworICAgICAgICAvLyBDb252ZXJ0IHRoZSByZXN1bHRpbmcgZG9jdW1lbnQgdG8gYSBncmFwaCBvZiBUcmVlTm9kZXMKKyAgICAgICAgcmV0dXJuIChjb252ZXJ0KG51bGwsIGRvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpKSk7CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvdGVjdGVkIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuZCByZXR1cm4gYSBUcmVlTm9kZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBzcGVjaWZpZWQgTm9kZSwKKyAgICAgKiBpbmNsdWRpbmcgcHJvY2Vzc2luZyBhbGwgb2YgdGhlIGF0dHJpYnV0ZXMgYW5kIGNoaWxkcmVuIG5vZGVzLgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IFRyZWVOb2RlIChpZiBhbnkpIGZvciB0aGUgbmV3IFRyZWVOb2RlCisgICAgICogQHBhcmFtIG5vZGUgVGhlIFhNTCBkb2N1bWVudCBOb2RlIHRvIGJlIGNvbnZlcnRlZAorICAgICAqLworICAgIHByb3RlY3RlZCBUcmVlTm9kZSBjb252ZXJ0KFRyZWVOb2RlIHBhcmVudCwgTm9kZSBub2RlKSB7CisKKyAgICAgICAgLy8gQ29uc3RydWN0IGEgbmV3IFRyZWVOb2RlIGZvciB0aGlzIG5vZGUKKyAgICAgICAgVHJlZU5vZGUgdHJlZU5vZGUgPSBuZXcgVHJlZU5vZGUobm9kZS5nZXROb2RlTmFtZSgpLCBwYXJlbnQpOworCisgICAgICAgIC8vIENvbnZlcnQgYWxsIGF0dHJpYnV0ZXMgb2YgdGhpcyBub2RlCisgICAgICAgIE5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gbm9kZS5nZXRBdHRyaWJ1dGVzKCk7CisgICAgICAgIGlmIChhdHRyaWJ1dGVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGludCBuID0gYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgTm9kZSBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLml0ZW0oaSk7CisgICAgICAgICAgICAgICAgdHJlZU5vZGUuYWRkQXR0cmlidXRlKGF0dHJpYnV0ZS5nZXROb2RlTmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUuZ2V0Tm9kZVZhbHVlKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gQ3JlYXRlIGFuZCBhdHRhY2ggYWxsIGNoaWxkcmVuIG9mIHRoaXMgbm9kZQorICAgICAgICBOb2RlTGlzdCBjaGlsZHJlbiA9IG5vZGUuZ2V0Q2hpbGROb2RlcygpOworICAgICAgICBpZiAoY2hpbGRyZW4gIT0gbnVsbCkgeworICAgICAgICAgICAgaW50IG4gPSBjaGlsZHJlbi5nZXRMZW5ndGgoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgTm9kZSBjaGlsZCA9IGNoaWxkcmVuLml0ZW0oaSk7CisgICAgICAgICAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgQ29tbWVudCkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgVGV4dCkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYm9keSA9ICgoVGV4dCkgY2hpbGQpLmdldERhdGEoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJvZHkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYm9keSA9IGJvZHkudHJpbSgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJvZHkubGVuZ3RoKCkgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyZWVOb2RlLnNldEJvZHkoYm9keSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBUcmVlTm9kZSB0cmVlQ2hpbGQgPSBjb252ZXJ0KHRyZWVOb2RlLCBjaGlsZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBSZXR1cm4gdGhlIGNvbXBsZXRlZCBUcmVlTm9kZSBncmFwaAorICAgICAgICByZXR1cm4gKHRyZWVOb2RlKTsKKyAgICB9Cit9CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByaXZhdGUgQ2xhc3NlcworCitjbGFzcyBNeUVudGl0eVJlc29sdmVyIGltcGxlbWVudHMgRW50aXR5UmVzb2x2ZXIgeworICAgIAorICAgIHB1YmxpYyBJbnB1dFNvdXJjZSByZXNvbHZlRW50aXR5KFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKQorCXRocm93cyBTQVhFeGNlcHRpb24KKyAgICB7CisJZm9yIChpbnQgaT0wOyBpPENvbnN0YW50cy5DQUNIRURfRFREX1BVQkxJQ19JRFMubGVuZ3RoOyBpKyspIHsKKwkgICAgU3RyaW5nIGNhY2hlZER0ZFB1YmxpY0lkID0gQ29uc3RhbnRzLkNBQ0hFRF9EVERfUFVCTElDX0lEU1tpXTsKKwkgICAgaWYgKGNhY2hlZER0ZFB1YmxpY0lkLmVxdWFscyhwdWJsaWNJZCkpIHsKKwkJU3RyaW5nIHJlc291cmNlUGF0aCA9IENvbnN0YW50cy5DQUNIRURfRFREX1JFU09VUkNFX1BBVEhTW2ldOworCQlJbnB1dFN0cmVhbSBpbnB1dCA9CisJCSAgICB0aGlzLmdldENsYXNzKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbShyZXNvdXJjZVBhdGgpOworCQlpZiAoaW5wdXQgPT0gbnVsbCkgeworCQkgICAgdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsaXplci5nZXRNZXNzYWdlKCJqc3AuZXJyb3IuaW50ZXJuYWwuZmlsZW5vdGZvdW5kIiwKKwkJCQkJICAgICByZXNvdXJjZVBhdGgpKTsKKwkJfQorCQlJbnB1dFNvdXJjZSBpc3JjID0gbmV3IElucHV0U291cmNlKGlucHV0KTsKKwkJcmV0dXJuIGlzcmM7CisJICAgIH0KKwl9CisgICAgICAgIGlmIChQYXJzZXJVdGlscy5sb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgICAgIFBhcnNlclV0aWxzLmxvZy5kZWJ1ZygiUmVzb2x2ZSBlbnRpdHkgZmFpbGVkIiAgKyBwdWJsaWNJZCArICIgIgorCQkJICAgKyBzeXN0ZW1JZCApOworCVBhcnNlclV0aWxzLmxvZy5lcnJvcihMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgianNwLmVycm9yLnBhcnNlLnhtbC5pbnZhbGlkUHVibGljSWQiLAorCQkJCQkJICAgcHVibGljSWQpKTsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorfQorCitjbGFzcyBNeUVycm9ySGFuZGxlciBpbXBsZW1lbnRzIEVycm9ySGFuZGxlciB7CisgICAgcHVibGljIHZvaWQgd2FybmluZyhTQVhQYXJzZUV4Y2VwdGlvbiBleCkKKwl0aHJvd3MgU0FYRXhjZXB0aW9uCisgICAgeworICAgICAgICBpZiAoUGFyc2VyVXRpbHMubG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICBQYXJzZXJVdGlscy5sb2cuZGVidWcoIlBhcnNlclV0aWxzOiB3YXJuaW5nICIsIGV4ICk7CisJLy8gV2UgaWdub3JlIHdhcm5pbmdzCisgICAgfQorCisgICAgcHVibGljIHZvaWQgZXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZXgpCisJdGhyb3dzIFNBWEV4Y2VwdGlvbgorICAgIHsKKwl0aHJvdyBleDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBmYXRhbEVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGV4KQorCXRocm93cyBTQVhFeGNlcHRpb24KKyAgICB7CisJdGhyb3cgZXg7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3htbHBhcnNlci9TeW1ib2xUYWJsZS5qYXZhIGIvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3htbHBhcnNlci9TeW1ib2xUYWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxYzhiZjkKLS0tIC9kZXYvbnVsbAorKysgYi9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIveG1scGFyc2VyL1N5bWJvbFRhYmxlLmphdmEKQEAgLTAsMCArMSwzMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55CisgKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKKyAqIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAxOTk5LCBJbnRlcm5hdGlvbmFsCisgKiBCdXNpbmVzcyBNYWNoaW5lcywgSW5jLiwgaHR0cDovL3d3dy5hcGFjaGUub3JnLiAgRm9yIG1vcmUKKyAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQorICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYXNwZXIueG1scGFyc2VyOworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgYSBzeW1ib2wgdGFibGUgaW1wbGVtZW50YXRpb24gdGhhdCBndWFyYW50ZWVzIHRoYXQKKyAqIHN0cmluZ3MgdXNlZCBhcyBpZGVudGlmaWVycyBhcmUgdW5pcXVlIHJlZmVyZW5jZXMuIE11bHRpcGxlIGNhbGxzCisgKiB0byA8Y29kZT5hZGRTeW1ib2w8L2NvZGU+IHdpbGwgYWx3YXlzIHJldHVybiB0aGUgc2FtZSBzdHJpbmcKKyAqIHJlZmVyZW5jZS4KKyAqIDxwPgorICogVGhlIHN5bWJvbCB0YWJsZSBwZXJmb3JtcyB0aGUgc2FtZSB0YXNrIGFzIDxjb2RlPlN0cmluZy5pbnRlcm4oKTwvY29kZT4KKyAqIHdpdGggdGhlIGZvbGxvd2luZyBkaWZmZXJlbmNlczoKKyAqIDx1bD4KKyAqICA8bGk+CisgKiAgIEEgbmV3IHN0cmluZyBvYmplY3QgZG9lcyBub3QgbmVlZCB0byBiZSBjcmVhdGVkIGluIG9yZGVyIHRvCisgKiAgIHJldHJpZXZlIGEgdW5pcXVlIHJlZmVyZW5jZS4gU3ltYm9scyBjYW4gYmUgYWRkZWQgYnkgdXNpbmcKKyAqICAgYSBzZXJpZXMgb2YgY2hhcmFjdGVycyBpbiBhIGNoYXJhY3RlciBhcnJheS4KKyAqICA8L2xpPgorICogIDxsaT4KKyAqICAgVXNlcnMgb2YgdGhlIHN5bWJvbCB0YWJsZSBjYW4gcHJvdmlkZSB0aGVpciBvd24gc3ltYm9sIGhhc2hpbmcKKyAqICAgaW1wbGVtZW50YXRpb24uIEZvciBleGFtcGxlLCBhIHNpbXBsZSBzdHJpbmcgaGFzaGluZyBhbGdvcml0aG0KKyAqICAgbWF5IGZhaWwgdG8gcHJvZHVjZSBhIGJhbGFuY2VkIHNldCBvZiBoYXNoY29kZXMgZm9yIHN5bWJvbHMKKyAqICAgdGhhdCBhcmUgPGVtPm1vc3RseTwvZW0+IHVuaXF1ZS4gU3RyaW5ncyB3aXRoIHNpbWlsYXIgbGVhZGluZworICogICBjaGFyYWN0ZXJzIGFyZSBlc3BlY2lhbGx5IHByb25lIHRvIHRoaXMgcG9vciBoYXNoaW5nIGJlaGF2aW9yLgorICogIDwvbGk+CisgKiA8L3VsPgorICoKKyAqIEBzZWUgU3ltYm9sSGFzaAorICoKKyAqIEBhdXRob3IgQW5keSBDbGFyaworICoKKyAqIEB2ZXJzaW9uICRJZCQKKyAqLworcHVibGljIGNsYXNzIFN5bWJvbFRhYmxlIHsKKworICAgIC8vCisgICAgLy8gQ29uc3RhbnRzCisgICAgLy8KKworICAgIC8qKiBEZWZhdWx0IHRhYmxlIHNpemUuICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgVEFCTEVfU0laRSA9IDEwMTsKKworICAgIC8vCisgICAgLy8gRGF0YQorICAgIC8vCisKKyAgICAvKiogQnVja2V0cy4gKi8KKyAgICBwcm90ZWN0ZWQgRW50cnlbXSBmQnVja2V0cyA9IG51bGw7CisKKyAgICAvLyBhY3R1YWwgdGFibGUgc2l6ZQorICAgIHByb3RlY3RlZCBpbnQgZlRhYmxlU2l6ZTsKKworICAgIC8vCisgICAgLy8gQ29uc3RydWN0b3JzCisgICAgLy8KKworICAgIC8qKiBDb25zdHJ1Y3RzIGEgc3ltYm9sIHRhYmxlIHdpdGggYSBkZWZhdWx0IG51bWJlciBvZiBidWNrZXRzLiAqLworICAgIHB1YmxpYyBTeW1ib2xUYWJsZSgpIHsKKyAgICAgICAgdGhpcyhUQUJMRV9TSVpFKTsKKyAgICB9CisKKyAgICAvKiogQ29uc3RydWN0cyBhIHN5bWJvbCB0YWJsZSB3aXRoIGEgc3BlY2lmaWVkIG51bWJlciBvZiBidWNrZXRzLiAqLworICAgIHB1YmxpYyBTeW1ib2xUYWJsZShpbnQgdGFibGVTaXplKSB7CisgICAgICAgIGZUYWJsZVNpemUgPSB0YWJsZVNpemU7CisgICAgICAgIGZCdWNrZXRzID0gbmV3IEVudHJ5W2ZUYWJsZVNpemVdOworICAgIH0KKworICAgIC8vCisgICAgLy8gUHVibGljIG1ldGhvZHMKKyAgICAvLworCisgICAgLyoqCisgICAgICogQWRkcyB0aGUgc3BlY2lmaWVkIHN5bWJvbCB0byB0aGUgc3ltYm9sIHRhYmxlIGFuZCByZXR1cm5zIGEKKyAgICAgKiByZWZlcmVuY2UgdG8gdGhlIHVuaXF1ZSBzeW1ib2wuIElmIHRoZSBzeW1ib2wgYWxyZWFkeSBleGlzdHMsCisgICAgICogdGhlIHByZXZpb3VzIHN5bWJvbCByZWZlcmVuY2UgaXMgcmV0dXJuZWQgaW5zdGVhZCwgaW4gb3JkZXIKKyAgICAgKiBndWFyYW50ZWUgdGhhdCBzeW1ib2wgcmVmZXJlbmNlcyByZW1haW4gdW5pcXVlLgorICAgICAqCisgICAgICogQHBhcmFtIHN5bWJvbCBUaGUgbmV3IHN5bWJvbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGFkZFN5bWJvbChTdHJpbmcgc3ltYm9sKSB7CisKKyAgICAgICAgLy8gc2VhcmNoIGZvciBpZGVudGljYWwgc3ltYm9sCisgICAgICAgIGludCBidWNrZXQgPSBoYXNoKHN5bWJvbCkgJSBmVGFibGVTaXplOworICAgICAgICBpbnQgbGVuZ3RoID0gc3ltYm9sLmxlbmd0aCgpOworICAgICAgICBPVVRFUjogZm9yIChFbnRyeSBlbnRyeSA9IGZCdWNrZXRzW2J1Y2tldF07IGVudHJ5ICE9IG51bGw7IGVudHJ5ID0gZW50cnkubmV4dCkgeworICAgICAgICAgICAgaWYgKGxlbmd0aCA9PSBlbnRyeS5jaGFyYWN0ZXJzLmxlbmd0aCkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN5bWJvbC5jaGFyQXQoaSkgIT0gZW50cnkuY2hhcmFjdGVyc1tpXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUgT1VURVI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5LnN5bWJvbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGNyZWF0ZSBuZXcgZW50cnkKKyAgICAgICAgRW50cnkgZW50cnkgPSBuZXcgRW50cnkoc3ltYm9sLCBmQnVja2V0c1tidWNrZXRdKTsKKyAgICAgICAgZkJ1Y2tldHNbYnVja2V0XSA9IGVudHJ5OworICAgICAgICByZXR1cm4gZW50cnkuc3ltYm9sOworCisgICAgfSAvLyBhZGRTeW1ib2woU3RyaW5nKTpTdHJpbmcKKworICAgIC8qKgorICAgICAqIEFkZHMgdGhlIHNwZWNpZmllZCBzeW1ib2wgdG8gdGhlIHN5bWJvbCB0YWJsZSBhbmQgcmV0dXJucyBhCisgICAgICogcmVmZXJlbmNlIHRvIHRoZSB1bmlxdWUgc3ltYm9sLiBJZiB0aGUgc3ltYm9sIGFscmVhZHkgZXhpc3RzLAorICAgICAqIHRoZSBwcmV2aW91cyBzeW1ib2wgcmVmZXJlbmNlIGlzIHJldHVybmVkIGluc3RlYWQsIGluIG9yZGVyCisgICAgICogZ3VhcmFudGVlIHRoYXQgc3ltYm9sIHJlZmVyZW5jZXMgcmVtYWluIHVuaXF1ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBidWZmZXIgVGhlIGJ1ZmZlciBjb250YWluaW5nIHRoZSBuZXcgc3ltYm9sLgorICAgICAqIEBwYXJhbSBvZmZzZXQgVGhlIG9mZnNldCBpbnRvIHRoZSBidWZmZXIgb2YgdGhlIG5ldyBzeW1ib2wuCisgICAgICogQHBhcmFtIGxlbmd0aCBUaGUgbGVuZ3RoIG9mIHRoZSBuZXcgc3ltYm9sIGluIHRoZSBidWZmZXIuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBhZGRTeW1ib2woY2hhcltdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgeworCisgICAgICAgIC8vIHNlYXJjaCBmb3IgaWRlbnRpY2FsIHN5bWJvbAorICAgICAgICBpbnQgYnVja2V0ID0gaGFzaChidWZmZXIsIG9mZnNldCwgbGVuZ3RoKSAlIGZUYWJsZVNpemU7CisgICAgICAgIE9VVEVSOiBmb3IgKEVudHJ5IGVudHJ5ID0gZkJ1Y2tldHNbYnVja2V0XTsgZW50cnkgIT0gbnVsbDsgZW50cnkgPSBlbnRyeS5uZXh0KSB7CisgICAgICAgICAgICBpZiAobGVuZ3RoID09IGVudHJ5LmNoYXJhY3RlcnMubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoYnVmZmVyW29mZnNldCArIGldICE9IGVudHJ5LmNoYXJhY3RlcnNbaV0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIE9VVEVSOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBlbnRyeS5zeW1ib2w7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBhZGQgbmV3IGVudHJ5CisgICAgICAgIEVudHJ5IGVudHJ5ID0gbmV3IEVudHJ5KGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIGZCdWNrZXRzW2J1Y2tldF0pOworICAgICAgICBmQnVja2V0c1tidWNrZXRdID0gZW50cnk7CisgICAgICAgIHJldHVybiBlbnRyeS5zeW1ib2w7CisKKyAgICB9IC8vIGFkZFN5bWJvbChjaGFyW10saW50LGludCk6U3RyaW5nCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgaGFzaGNvZGUgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgc3ltYm9sLiBUaGUgdmFsdWUKKyAgICAgKiByZXR1cm5lZCBieSB0aGlzIG1ldGhvZCBtdXN0IGJlIGlkZW50aWNhbCB0byB0aGUgdmFsdWUgcmV0dXJuZWQKKyAgICAgKiBieSB0aGUgPGNvZGU+aGFzaChjaGFyW10saW50LGludCk8L2NvZGU+IG1ldGhvZCB3aGVuIGNhbGxlZAorICAgICAqIHdpdGggdGhlIGNoYXJhY3RlciBhcnJheSB0aGF0IGNvbXByaXNlcyB0aGUgc3ltYm9sIHN0cmluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzeW1ib2wgVGhlIHN5bWJvbCB0byBoYXNoLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgaGFzaChTdHJpbmcgc3ltYm9sKSB7CisKKyAgICAgICAgaW50IGNvZGUgPSAwOworICAgICAgICBpbnQgbGVuZ3RoID0gc3ltYm9sLmxlbmd0aCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBjb2RlID0gY29kZSAqIDM3ICsgc3ltYm9sLmNoYXJBdChpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29kZSAmIDB4N0ZGRkZGRjsKKworICAgIH0gLy8gaGFzaChTdHJpbmcpOmludAorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIGhhc2hjb2RlIHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIHN5bWJvbCBpbmZvcm1hdGlvbi4KKyAgICAgKiBUaGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhpcyBtZXRob2QgbXVzdCBiZSBpZGVudGljYWwgdG8gdGhlIHZhbHVlCisgICAgICogcmV0dXJuZWQgYnkgdGhlIDxjb2RlPmhhc2goU3RyaW5nKTwvY29kZT4gbWV0aG9kIHdoZW4gY2FsbGVkCisgICAgICogd2l0aCB0aGUgc3RyaW5nIG9iamVjdCBjcmVhdGVkIGZyb20gdGhlIHN5bWJvbCBpbmZvcm1hdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBidWZmZXIgVGhlIGNoYXJhY3RlciBidWZmZXIgY29udGFpbmluZyB0aGUgc3ltYm9sLgorICAgICAqIEBwYXJhbSBvZmZzZXQgVGhlIG9mZnNldCBpbnRvIHRoZSBjaGFyYWN0ZXIgYnVmZmVyIG9mIHRoZSBzdGFydAorICAgICAqICAgICAgICAgICAgICAgb2YgdGhlIHN5bWJvbC4KKyAgICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSBsZW5ndGggb2YgdGhlIHN5bWJvbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGhhc2goY2hhcltdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgeworCisgICAgICAgIGludCBjb2RlID0gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgICAgICAgY29kZSA9IGNvZGUgKiAzNyArIGJ1ZmZlcltvZmZzZXQgKyBpXTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29kZSAmIDB4N0ZGRkZGRjsKKworICAgIH0gLy8gaGFzaChjaGFyW10saW50LGludCk6aW50CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHN5bWJvbCB0YWJsZSBhbHJlYWR5IGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBzeW1ib2wuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3ltYm9sIFRoZSBzeW1ib2wgdG8gbG9vayBmb3IuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNTeW1ib2woU3RyaW5nIHN5bWJvbCkgeworCisgICAgICAgIC8vIHNlYXJjaCBmb3IgaWRlbnRpY2FsIHN5bWJvbAorICAgICAgICBpbnQgYnVja2V0ID0gaGFzaChzeW1ib2wpICUgZlRhYmxlU2l6ZTsKKyAgICAgICAgaW50IGxlbmd0aCA9IHN5bWJvbC5sZW5ndGgoKTsKKyAgICAgICAgT1VURVI6IGZvciAoRW50cnkgZW50cnkgPSBmQnVja2V0c1tidWNrZXRdOyBlbnRyeSAhPSBudWxsOyBlbnRyeSA9IGVudHJ5Lm5leHQpIHsKKyAgICAgICAgICAgIGlmIChsZW5ndGggPT0gZW50cnkuY2hhcmFjdGVycy5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzeW1ib2wuY2hhckF0KGkpICE9IGVudHJ5LmNoYXJhY3RlcnNbaV0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIE9VVEVSOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgfSAvLyBjb250YWluc1N5bWJvbChTdHJpbmcpOmJvb2xlYW4KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3ltYm9sIHRhYmxlIGFscmVhZHkgY29udGFpbnMgdGhlIHNwZWNpZmllZAorICAgICAqIHN5bWJvbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBidWZmZXIgVGhlIGJ1ZmZlciBjb250YWluaW5nIHRoZSBzeW1ib2wgdG8gbG9vayBmb3IuCisgICAgICogQHBhcmFtIG9mZnNldCBUaGUgb2Zmc2V0IGludG8gdGhlIGJ1ZmZlci4KKyAgICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSBsZW5ndGggb2YgdGhlIHN5bWJvbCBpbiB0aGUgYnVmZmVyLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zU3ltYm9sKGNoYXJbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKKworICAgICAgICAvLyBzZWFyY2ggZm9yIGlkZW50aWNhbCBzeW1ib2wKKyAgICAgICAgaW50IGJ1Y2tldCA9IGhhc2goYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCkgJSBmVGFibGVTaXplOworICAgICAgICBPVVRFUjogZm9yIChFbnRyeSBlbnRyeSA9IGZCdWNrZXRzW2J1Y2tldF07IGVudHJ5ICE9IG51bGw7IGVudHJ5ID0gZW50cnkubmV4dCkgeworICAgICAgICAgICAgaWYgKGxlbmd0aCA9PSBlbnRyeS5jaGFyYWN0ZXJzLmxlbmd0aCkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlcltvZmZzZXQgKyBpXSAhPSBlbnRyeS5jaGFyYWN0ZXJzW2ldKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBPVVRFUjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIH0gLy8gY29udGFpbnNTeW1ib2woY2hhcltdLGludCxpbnQpOmJvb2xlYW4KKworICAgIC8vCisgICAgLy8gQ2xhc3NlcworICAgIC8vCisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNsYXNzIGlzIGEgc3ltYm9sIHRhYmxlIGVudHJ5LiBFYWNoIGVudHJ5IGFjdHMgYXMgYSBub2RlCisgICAgICogaW4gYSBsaW5rZWQgbGlzdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGNsYXNzIEVudHJ5IHsKKworICAgICAgICAvLworICAgICAgICAvLyBEYXRhCisgICAgICAgIC8vCisKKyAgICAgICAgLyoqIFN5bWJvbC4gKi8KKyAgICAgICAgcHVibGljIFN0cmluZyBzeW1ib2w7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFN5bWJvbCBjaGFyYWN0ZXJzLiBUaGlzIGluZm9ybWF0aW9uIGlzIGR1cGxpY2F0ZWQgaGVyZSBmb3IKKyAgICAgICAgICogY29tcGFyaXNvbiBwZXJmb3JtYW5jZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBjaGFyW10gY2hhcmFjdGVyczsKKworICAgICAgICAvKiogVGhlIG5leHQgZW50cnkuICovCisgICAgICAgIHB1YmxpYyBFbnRyeSBuZXh0OworCisgICAgICAgIC8vCisgICAgICAgIC8vIENvbnN0cnVjdG9ycworICAgICAgICAvLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGVudHJ5IGZyb20gdGhlIHNwZWNpZmllZCBzeW1ib2wgYW5kIG5leHQgZW50cnkKKyAgICAgICAgICogcmVmZXJlbmNlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEVudHJ5KFN0cmluZyBzeW1ib2wsIEVudHJ5IG5leHQpIHsKKyAgICAgICAgICAgIHRoaXMuc3ltYm9sID0gc3ltYm9sLmludGVybigpOworICAgICAgICAgICAgY2hhcmFjdGVycyA9IG5ldyBjaGFyW3N5bWJvbC5sZW5ndGgoKV07CisgICAgICAgICAgICBzeW1ib2wuZ2V0Q2hhcnMoMCwgY2hhcmFjdGVycy5sZW5ndGgsIGNoYXJhY3RlcnMsIDApOworICAgICAgICAgICAgdGhpcy5uZXh0ID0gbmV4dDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGVudHJ5IGZyb20gdGhlIHNwZWNpZmllZCBzeW1ib2wgaW5mb3JtYXRpb24gYW5kCisgICAgICAgICAqIG5leHQgZW50cnkgcmVmZXJlbmNlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEVudHJ5KGNoYXJbXSBjaCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwgRW50cnkgbmV4dCkgeworICAgICAgICAgICAgY2hhcmFjdGVycyA9IG5ldyBjaGFyW2xlbmd0aF07CisgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGNoLCBvZmZzZXQsIGNoYXJhY3RlcnMsIDAsIGxlbmd0aCk7CisgICAgICAgICAgICBzeW1ib2wgPSBuZXcgU3RyaW5nKGNoYXJhY3RlcnMpLmludGVybigpOworICAgICAgICAgICAgdGhpcy5uZXh0ID0gbmV4dDsKKyAgICAgICAgfQorCisgICAgfSAvLyBjbGFzcyBFbnRyeQorCit9IC8vIGNsYXNzIFN5bWJvbFRhYmxlCmRpZmYgLS1naXQgYS9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIveG1scGFyc2VyL1RyZWVOb2RlLmphdmEgYi9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIveG1scGFyc2VyL1RyZWVOb2RlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg1ZTc2MgotLS0gL2Rldi9udWxsCisrKyBiL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci94bWxwYXJzZXIvVHJlZU5vZGUuamF2YQpAQCAtMCwwICsxLDM1OSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFzcGVyLnhtbHBhcnNlcjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworCisvKioKKyAqIFNpbXBsaWZpZWQgaW1wbGVtZW50YXRpb24gb2YgYSBOb2RlIGZyb20gYSBEb2N1bWVudCBPYmplY3QgTW9kZWwgKERPTSkKKyAqIHBhcnNlIG9mIGFuIFhNTCBkb2N1bWVudC4gIFRoaXMgY2xhc3MgaXMgdXNlZCB0byByZXByZXNlbnQgYSBET00gdHJlZQorICogc28gdGhhdCB0aGUgWE1MIHBhcnNlcidzIGltcGxlbWVudGF0aW9uIG9mIDxjb2RlPm9yZy53M2MuZG9tPC9jb2RlPiBuZWVkCisgKiBub3QgYmUgdmlzaWJsZSB0byB0aGUgcmVtYWluZGVyIG9mIEphc3Blci4KKyAqIDxwPgorICogPHN0cm9uZz5XQVJOSU5HPC9zdHJvbmc+IC0gQ29uc3RydWN0aW9uIG9mIGEgbmV3IHRyZWUsIG9yIG1vZGlmaWNhdGlvbnMKKyAqIHRvIGFuIGV4aXN0aW5nIG9uZSwgYXJlIG5vdCB0aHJlYWQtc2FmZSBhbmQgc3VjaCBhY2Nlc3NlcyBtdXN0IGJlCisgKiBzeW5jaHJvbml6ZWQuCisgKgorICogQGF1dGhvciBDcmFpZyBSLiBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBUcmVlTm9kZSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgbm9kZSB3aXRoIG5vIHBhcmVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoaXMgbm9kZQorICAgICAqLworICAgIHB1YmxpYyBUcmVlTm9kZShTdHJpbmcgbmFtZSkgeworCisgICAgICAgIHRoaXMobmFtZSwgbnVsbCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBub2RlIHdpdGggdGhlIHNwZWNpZmllZCBwYXJlbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGlzIG5vZGUKKyAgICAgKiBAcGFyYW0gcGFyZW50IFRoZSBub2RlIHRoYXQgaXMgdGhlIHBhcmVudCBvZiB0aGlzIG5vZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgVHJlZU5vZGUoU3RyaW5nIG5hbWUsIFRyZWVOb2RlIHBhcmVudCkgeworCisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OworICAgICAgICBpZiAodGhpcy5wYXJlbnQgIT0gbnVsbCkKKyAgICAgICAgICAgIHRoaXMucGFyZW50LmFkZENoaWxkKHRoaXMpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIGF0dHJpYnV0ZXMgb2YgdGhpcyBub2RlLCBrZXllZCBieSBhdHRyaWJ1dGUgbmFtZSwKKyAgICAgKiBJbnN0YW50aWF0ZWQgb25seSBpZiByZXF1aXJlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgSGFzaE1hcCBhdHRyaWJ1dGVzID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIGJvZHkgdGV4dCBhc3NvY2lhdGVkIHdpdGggdGhpcyBub2RlIChpZiBhbnkpLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgYm9keSA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUsIGluc3RhbnRpYXRlZCBvbmx5IGlmIHJlcXVpcmVkLgorICAgICAqLworICAgIHByb3RlY3RlZCBBcnJheUxpc3QgY2hpbGRyZW4gPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgbmFtZSBvZiB0aGlzIG5vZGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIHBhcmVudCBub2RlIG9mIHRoaXMgbm9kZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgVHJlZU5vZGUgcGFyZW50ID0gbnVsbDsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIEFkZCBhbiBhdHRyaWJ1dGUgdG8gdGhpcyBub2RlLCByZXBsYWNpbmcgYW55IGV4aXN0aW5nIGF0dHJpYnV0ZQorICAgICAqIHdpdGggdGhlIHNhbWUgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIFRoZSBhdHRyaWJ1dGUgbmFtZSB0byBhZGQKKyAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyBhdHRyaWJ1dGUgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgeworCisgICAgICAgIGlmIChhdHRyaWJ1dGVzID09IG51bGwpCisgICAgICAgICAgICBhdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgYXR0cmlidXRlcy5wdXQobmFtZSwgdmFsdWUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBuZXcgY2hpbGQgbm9kZSB0byB0aGlzIG5vZGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbm9kZSBUaGUgbmV3IGNoaWxkIG5vZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRDaGlsZChUcmVlTm9kZSBub2RlKSB7CisKKyAgICAgICAgaWYgKGNoaWxkcmVuID09IG51bGwpCisgICAgICAgICAgICBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgY2hpbGRyZW4uYWRkKG5vZGUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgbm9kZSBhdHRyaWJ1dGUgaWYgaXQgZXhpc3RzLCBvcgorICAgICAqIDxjb2RlPm51bGw8L2NvZGU+IG90aGVyd2lzZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIHJlcXVlc3RlZCBhdHRyaWJ1dGUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGZpbmRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHsKKworICAgICAgICBpZiAoYXR0cmlidXRlcyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChudWxsKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuICgoU3RyaW5nKSBhdHRyaWJ1dGVzLmdldChuYW1lKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhbiBJdGVyYXRvciBvZiB0aGUgYXR0cmlidXRlIG5hbWVzIG9mIHRoaXMgbm9kZS4gIElmIHRoZXJlIGFyZQorICAgICAqIG5vIGF0dHJpYnV0ZXMsIGFuIGVtcHR5IEl0ZXJhdG9yIGlzIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBJdGVyYXRvciBmaW5kQXR0cmlidXRlcygpIHsKKworICAgICAgICBpZiAoYXR0cmlidXRlcyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChDb2xsZWN0aW9ucy5FTVBUWV9MSVNULml0ZXJhdG9yKCkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gKGF0dHJpYnV0ZXMua2V5U2V0KCkuaXRlcmF0b3IoKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgZmlyc3QgY2hpbGQgbm9kZSBvZiB0aGlzIG5vZGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUsCisgICAgICogaWYgdGhlcmUgaXMgb25lOyBvdGhlcndpc2UsIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIGRlc2lyZWQgY2hpbGQgZWxlbWVudAorICAgICAqLworICAgIHB1YmxpYyBUcmVlTm9kZSBmaW5kQ2hpbGQoU3RyaW5nIG5hbWUpIHsKKworICAgICAgICBpZiAoY2hpbGRyZW4gPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisgICAgICAgIEl0ZXJhdG9yIGl0ZW1zID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKGl0ZW1zLmhhc05leHQoKSkgeworICAgICAgICAgICAgVHJlZU5vZGUgaXRlbSA9IChUcmVlTm9kZSkgaXRlbXMubmV4dCgpOworICAgICAgICAgICAgaWYgKG5hbWUuZXF1YWxzKGl0ZW0uZ2V0TmFtZSgpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKGl0ZW0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiAobnVsbCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhbiBJdGVyYXRvciBvZiBhbGwgY2hpbGRyZW4gb2YgdGhpcyBub2RlLiAgSWYgdGhlcmUgYXJlIG5vCisgICAgICogY2hpbGRyZW4sIGFuIGVtcHR5IEl0ZXJhdG9yIGlzIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBJdGVyYXRvciBmaW5kQ2hpbGRyZW4oKSB7CisKKyAgICAgICAgaWYgKGNoaWxkcmVuID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKENvbGxlY3Rpb25zLkVNUFRZX0xJU1QuaXRlcmF0b3IoKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiAoY2hpbGRyZW4uaXRlcmF0b3IoKSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiBhbiBJdGVyYXRvciBvdmVyIGFsbCBjaGlsZHJlbiBvZiB0aGlzIG5vZGUgdGhhdCBoYXZlIHRoZQorICAgICAqIHNwZWNpZmllZCBuYW1lLiAgSWYgdGhlcmUgYXJlIG5vIHN1Y2ggY2hpbGRyZW4sIGFuIGVtcHR5IEl0ZXJhdG9yCisgICAgICogaXMgcmV0dXJuZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIHVzZWQgdG8gc2VsZWN0IGNoaWxkcmVuCisgICAgICovCisgICAgcHVibGljIEl0ZXJhdG9yIGZpbmRDaGlsZHJlbihTdHJpbmcgbmFtZSkgeworCisgICAgICAgIGlmIChjaGlsZHJlbiA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIChDb2xsZWN0aW9ucy5FTVBUWV9MSVNULml0ZXJhdG9yKCkpOworCisgICAgICAgIEFycmF5TGlzdCByZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBJdGVyYXRvciBpdGVtcyA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChpdGVtcy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIFRyZWVOb2RlIGl0ZW0gPSAoVHJlZU5vZGUpIGl0ZW1zLm5leHQoKTsKKyAgICAgICAgICAgIGlmIChuYW1lLmVxdWFscyhpdGVtLmdldE5hbWUoKSkpCisgICAgICAgICAgICAgICAgcmVzdWx0cy5hZGQoaXRlbSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChyZXN1bHRzLml0ZXJhdG9yKCkpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGJvZHkgdGV4dCBhc3NvY2lhdGVkIHdpdGggdGhpcyBub2RlIChpZiBhbnkpLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Qm9keSgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMuYm9keSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGlzIG5vZGUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5uYW1lKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGFueSBleGlzdGluZyB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIFRoZSBhdHRyaWJ1dGUgbmFtZSB0byByZW1vdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHsKKworICAgICAgICBpZiAoYXR0cmlidXRlcyAhPSBudWxsKQorICAgICAgICAgICAgYXR0cmlidXRlcy5yZW1vdmUobmFtZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhIGNoaWxkIG5vZGUgZnJvbSB0aGlzIG5vZGUsIGlmIGl0IGlzIG9uZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBub2RlIFRoZSBjaGlsZCBub2RlIHRvIHJlbW92ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZU5vZGUoVHJlZU5vZGUgbm9kZSkgeworCisgICAgICAgIGlmIChjaGlsZHJlbiAhPSBudWxsKQorICAgICAgICAgICAgY2hpbGRyZW4ucmVtb3ZlKG5vZGUpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGJvZHkgdGV4dCBhc3NvY2lhdGVkIHdpdGggdGhpcyBub2RlIChpZiBhbnkpLgorICAgICAqCisgICAgICogQHBhcmFtIGJvZHkgVGhlIGJvZHkgdGV4dCAoaWYgYW55KQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEJvZHkoU3RyaW5nIGJvZHkpIHsKKworICAgICAgICB0aGlzLmJvZHkgPSBib2R5OworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBUcmVlTm9kZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgdG9TdHJpbmcoc2IsIDAsIHRoaXMpOworICAgICAgICByZXR1cm4gKHNiLnRvU3RyaW5nKCkpOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvdGVjdGVkIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogQXBwZW5kIHRvIHRoZSBzcGVjaWZpZWQgU3RyaW5nQnVmZmVyIGEgY2hhcmFjdGVyIHJlcHJlc2VudGF0aW9uIG9mCisgICAgICogdGhpcyBub2RlLCB3aXRoIHRoZSBzcGVjaWZpZWQgYW1vdW50IG9mIGluZGVudGF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHNiIFRoZSBTdHJpbmdCdWZmZXIgdG8gYXBwZW5kIHRvCisgICAgICogQHBhcmFtIGluZGVudCBOdW1iZXIgb2YgY2hhcmFjdGVycyBvZiBpbmRlbnRhdGlvbgorICAgICAqIEBwYXJhbSBub2RlIFRoZSBUcmVlTm9kZSB0byBiZSBwcmludGVkCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVmZmVyIHNiLCBpbnQgaW5kZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyZWVOb2RlIG5vZGUpIHsKKworICAgICAgICBpbnQgaW5kZW50MiA9IGluZGVudCArIDI7CisKKyAgICAgICAgLy8gUmVjb25zdHJ1Y3QgYW4gb3BlbmluZyBub2RlCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5kZW50OyBpKyspCisgICAgICAgICAgICBzYi5hcHBlbmQoJyAnKTsKKyAgICAgICAgc2IuYXBwZW5kKCc8Jyk7CisgICAgICAgIHNiLmFwcGVuZChub2RlLmdldE5hbWUoKSk7CisgICAgICAgIEl0ZXJhdG9yIG5hbWVzID0gbm9kZS5maW5kQXR0cmlidXRlcygpOworICAgICAgICB3aGlsZSAobmFtZXMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoJyAnKTsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZykgbmFtZXMubmV4dCgpOworICAgICAgICAgICAgc2IuYXBwZW5kKG5hbWUpOworICAgICAgICAgICAgc2IuYXBwZW5kKCI9XCIiKTsKKyAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IG5vZGUuZmluZEF0dHJpYnV0ZShuYW1lKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCh2YWx1ZSk7CisgICAgICAgICAgICBzYi5hcHBlbmQoIlwiIik7CisgICAgICAgIH0KKyAgICAgICAgc2IuYXBwZW5kKCI+XG4iKTsKKworICAgICAgICAvLyBSZWNvbnN0cnVjdCB0aGUgYm9keSB0ZXh0IG9mIHRoaXMgbm9kZSAoaWYgYW55KQorICAgICAgICBTdHJpbmcgYm9keSA9IG5vZGUuZ2V0Qm9keSgpOworICAgICAgICBpZiAoKGJvZHkgIT0gbnVsbCkgJiYgKGJvZHkubGVuZ3RoKCkgPiAwKSkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRlbnQyOyBpKyspCisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCcgJyk7CisgICAgICAgICAgICBzYi5hcHBlbmQoYm9keSk7CisgICAgICAgICAgICBzYi5hcHBlbmQoIlxuIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZWNvbnN0cnVjdCBjaGlsZCBub2RlcyB3aXRoIGV4dHJhIGluZGVudGF0aW9uCisgICAgICAgIEl0ZXJhdG9yIGNoaWxkcmVuID0gbm9kZS5maW5kQ2hpbGRyZW4oKTsKKyAgICAgICAgd2hpbGUgKGNoaWxkcmVuLmhhc05leHQoKSkgeworICAgICAgICAgICAgVHJlZU5vZGUgY2hpbGQgPSAoVHJlZU5vZGUpIGNoaWxkcmVuLm5leHQoKTsKKyAgICAgICAgICAgIHRvU3RyaW5nKHNiLCBpbmRlbnQyLCBjaGlsZCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZWNvbnN0cnVjdCBhIGNsb3Npbmcgbm9kZSBtYXJrZXIKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRlbnQ7IGkrKykKKyAgICAgICAgICAgIHNiLmFwcGVuZCgnICcpOworICAgICAgICBzYi5hcHBlbmQoIjwvIik7CisgICAgICAgIHNiLmFwcGVuZChub2RlLmdldE5hbWUoKSk7CisgICAgICAgIHNiLmFwcGVuZCgiPlxuIik7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3htbHBhcnNlci9VQ1NSZWFkZXIuamF2YSBiL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci94bWxwYXJzZXIvVUNTUmVhZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjlmYTQyMQotLS0gL2Rldi9udWxsCisrKyBiL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci94bWxwYXJzZXIvVUNTUmVhZGVyLmphdmEKQEAgLTAsMCArMSwzMDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OSwyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIAorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIAorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphc3Blci54bWxwYXJzZXI7CisKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5SZWFkZXI7CisKKy8qKiAKKyAqIFJlYWRlciBmb3IgVUNTLTIgYW5kIFVDUy00IGVuY29kaW5ncy4KKyAqIChpLmUuLCBlbmNvZGluZ3MgZnJvbSBJU08tMTA2NDYtVUNTLSgyfDQpKS4KKyAqCisgKiBAYXV0aG9yIE5laWwgR3JhaGFtLCBJQk0KKyAqCisgKiBAdmVyc2lvbiAkSWQkCisgKi8KK3B1YmxpYyBjbGFzcyBVQ1NSZWFkZXIgZXh0ZW5kcyBSZWFkZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGxvZz0KKyAgICAgICAgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeS5nZXRMb2coIFVDU1JlYWRlci5jbGFzcyApOworICAgIAorICAgIC8vCisgICAgLy8gQ29uc3RhbnRzCisgICAgLy8KKworICAgIC8qKiBEZWZhdWx0IGJ5dGUgYnVmZmVyIHNpemUgKDgxOTIsIGxhcmdlciB0aGFuIHRoYXQgb2YgQVNDSUlSZWFkZXIKKyAgICAgKiBzaW5jZSBpdCdzIHJlYXNvbmFibGUgdG8gc3VybWlzZSB0aGF0IHRoZSBhdmVyYWdlIFVDUy00LWVuY29kZWQKKyAgICAgKiBmaWxlIHNob3VsZCBiZSA0IHRpbWVzIGFzIGxhcmdlIGFzIHRoZSBhdmVyYWdlIEFTQ0lJLWVuY29kZWQgZmlsZSkuIAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfQlVGRkVSX1NJWkUgPSA4MTkyOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBVQ1MyTEUgPSAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgVUNTMkJFID0gMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IFVDUzRMRSA9IDQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBVQ1M0QkUgPSA4OworCisgICAgLy8KKyAgICAvLyBEYXRhCisgICAgLy8KKworICAgIC8qKiBJbnB1dCBzdHJlYW0uICovCisgICAgcHJvdGVjdGVkIElucHV0U3RyZWFtIGZJbnB1dFN0cmVhbTsKKworICAgIC8qKiBCeXRlIGJ1ZmZlci4gKi8KKyAgICBwcm90ZWN0ZWQgYnl0ZVtdIGZCdWZmZXI7CisKKyAgICAvLyB3aGF0IGtpbmQgb2YgZGF0YSB3ZSdyZSBkZWFsaW5nIHdpdGgKKyAgICBwcm90ZWN0ZWQgc2hvcnQgZkVuY29kaW5nOworCisgICAgLy8KKyAgICAvLyBDb25zdHJ1Y3RvcnMKKyAgICAvLworCisgICAgLyoqIAorICAgICAqIENvbnN0cnVjdHMgYW4gQVNDSUkgcmVhZGVyIGZyb20gdGhlIHNwZWNpZmllZCBpbnB1dCBzdHJlYW0gCisgICAgICogdXNpbmcgdGhlIGRlZmF1bHQgYnVmZmVyIHNpemUuICBUaGUgRW5kaWFuLW5lc3MgYW5kIHdoZXRoZXIgdGhpcyBpcworICAgICAqIFVDUy0yIG9yIFVDUy00IG5lZWRzIGFsc28gdG8gYmUga25vd24gaW4gYWR2YW5jZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnB1dFN0cmVhbSBUaGUgaW5wdXQgc3RyZWFtLgorICAgICAqIEBwYXJhbSBlbmNvZGluZyBPbmUgb2YgVUNTMkxFLCBVQ1MyQkUsIFVDUzRMRSBvciBVQ1M0QkUuCisgICAgICovCisgICAgcHVibGljIFVDU1JlYWRlcihJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgc2hvcnQgZW5jb2RpbmcpIHsKKyAgICAgICAgdGhpcyhpbnB1dFN0cmVhbSwgREVGQVVMVF9CVUZGRVJfU0laRSwgZW5jb2RpbmcpOworICAgIH0gLy8gPGluaXQ+KElucHV0U3RyZWFtLCBzaG9ydCkKKworICAgIC8qKiAKKyAgICAgKiBDb25zdHJ1Y3RzIGFuIEFTQ0lJIHJlYWRlciBmcm9tIHRoZSBzcGVjaWZpZWQgaW5wdXQgc3RyZWFtIAorICAgICAqIGFuZCBidWZmZXIgc2l6ZS4gIFRoZSBFbmRpYW4tbmVzcyBhbmQgd2hldGhlciB0aGlzIGlzCisgICAgICogVUNTLTIgb3IgVUNTLTQgbmVlZHMgYWxzbyB0byBiZSBrbm93biBpbiBhZHZhbmNlLgorICAgICAqCisgICAgICogQHBhcmFtIGlucHV0U3RyZWFtIFRoZSBpbnB1dCBzdHJlYW0uCisgICAgICogQHBhcmFtIHNpemUgICAgICAgIFRoZSBpbml0aWFsIGJ1ZmZlciBzaXplLgorICAgICAqIEBwYXJhbSBlbmNvZGluZyBPbmUgb2YgVUNTMkxFLCBVQ1MyQkUsIFVDUzRMRSBvciBVQ1M0QkUuCisgICAgICovCisgICAgcHVibGljIFVDU1JlYWRlcihJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgaW50IHNpemUsIHNob3J0IGVuY29kaW5nKSB7CisgICAgICAgIGZJbnB1dFN0cmVhbSA9IGlucHV0U3RyZWFtOworICAgICAgICBmQnVmZmVyID0gbmV3IGJ5dGVbc2l6ZV07CisgICAgICAgIGZFbmNvZGluZyA9IGVuY29kaW5nOworICAgIH0gLy8gPGluaXQ+KElucHV0U3RyZWFtLGludCxzaG9ydCkKKworICAgIC8vCisgICAgLy8gUmVhZGVyIG1ldGhvZHMKKyAgICAvLworCisgICAgLyoqCisgICAgICogUmVhZCBhIHNpbmdsZSBjaGFyYWN0ZXIuICBUaGlzIG1ldGhvZCB3aWxsIGJsb2NrIHVudGlsIGEgY2hhcmFjdGVyIGlzCisgICAgICogYXZhaWxhYmxlLCBhbiBJL08gZXJyb3Igb2NjdXJzLCBvciB0aGUgZW5kIG9mIHRoZSBzdHJlYW0gaXMgcmVhY2hlZC4KKyAgICAgKgorICAgICAqIDxwPiBTdWJjbGFzc2VzIHRoYXQgaW50ZW5kIHRvIHN1cHBvcnQgZWZmaWNpZW50IHNpbmdsZS1jaGFyYWN0ZXIgaW5wdXQKKyAgICAgKiBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuICAgICBUaGUgY2hhcmFjdGVyIHJlYWQsIGFzIGFuIGludGVnZXIgaW4gdGhlIHJhbmdlIDAgdG8gMTI3CisgICAgICogICAgICAgICAgICAgKDx0dD4weDAwLTB4N2Y8L3R0PiksIG9yIC0xIGlmIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSBoYXMKKyAgICAgKiAgICAgICAgICAgICBiZWVuIHJlYWNoZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gIElPRXhjZXB0aW9uICBJZiBhbiBJL08gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsgCisgICAgICAgIGludCBiMCA9IGZJbnB1dFN0cmVhbS5yZWFkKCkgJiAweGZmOworICAgICAgICBpZiAoYjAgPT0gMHhmZikKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaW50IGIxID0gZklucHV0U3RyZWFtLnJlYWQoKSAmIDB4ZmY7CisgICAgICAgIGlmIChiMSA9PSAweGZmKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBpZihmRW5jb2RpbmcgPj00KSB7CisgICAgICAgICAgICBpbnQgYjIgPSBmSW5wdXRTdHJlYW0ucmVhZCgpICYgMHhmZjsKKyAgICAgICAgICAgIGlmIChiMiA9PSAweGZmKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIGludCBiMyA9IGZJbnB1dFN0cmVhbS5yZWFkKCkgJiAweGZmOworICAgICAgICAgICAgaWYgKGIzID09IDB4ZmYpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiYjAgaXMgIiArIChiMCAmIDB4ZmYpICsgIiBiMSAiICsgKGIxICYgMHhmZikgKyAiIGIyICIgKyAoYjIgJiAweGZmKSArICIgYjMgIiArIChiMyAmIDB4ZmYpKTsKKyAgICAgICAgICAgIGlmIChmRW5jb2RpbmcgPT0gVUNTNEJFKQorICAgICAgICAgICAgICAgIHJldHVybiAoYjA8PDI0KSsoYjE8PDE2KSsoYjI8PDgpK2IzOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiAoYjM8PDI0KSsoYjI8PDE2KSsoYjE8PDgpK2IwOworICAgICAgICB9IGVsc2UgeyAvLyBVQ1MtMgorICAgICAgICAgICAgaWYgKGZFbmNvZGluZyA9PSBVQ1MyQkUpCisgICAgICAgICAgICAgICAgcmV0dXJuIChiMDw8OCkrYjE7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIChiMTw8OCkrYjA7CisgICAgICAgIH0KKyAgICB9IC8vIHJlYWQoKTppbnQKKworICAgIC8qKgorICAgICAqIFJlYWQgY2hhcmFjdGVycyBpbnRvIGEgcG9ydGlvbiBvZiBhbiBhcnJheS4gIFRoaXMgbWV0aG9kIHdpbGwgYmxvY2sKKyAgICAgKiB1bnRpbCBzb21lIGlucHV0IGlzIGF2YWlsYWJsZSwgYW4gSS9PIGVycm9yIG9jY3Vycywgb3IgdGhlIGVuZCBvZiB0aGUKKyAgICAgKiBzdHJlYW0gaXMgcmVhY2hlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgICAgIGNoICAgICBEZXN0aW5hdGlvbiBidWZmZXIKKyAgICAgKiBAcGFyYW0gICAgICBvZmZzZXQgT2Zmc2V0IGF0IHdoaWNoIHRvIHN0YXJ0IHN0b3JpbmcgY2hhcmFjdGVycworICAgICAqIEBwYXJhbSAgICAgIGxlbmd0aCBNYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHJlYWQKKyAgICAgKgorICAgICAqIEByZXR1cm4gICAgIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyByZWFkLCBvciAtMSBpZiB0aGUgZW5kIG9mIHRoZQorICAgICAqICAgICAgICAgICAgIHN0cmVhbSBoYXMgYmVlbiByZWFjaGVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uICBJT0V4Y2VwdGlvbiAgSWYgYW4gSS9PIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBpbnQgcmVhZChjaGFyIGNoW10sIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGludCBieXRlTGVuZ3RoID0gbGVuZ3RoIDw8ICgoZkVuY29kaW5nID49IDQpPzI6MSk7CisgICAgICAgIGlmIChieXRlTGVuZ3RoID4gZkJ1ZmZlci5sZW5ndGgpIHsKKyAgICAgICAgICAgIGJ5dGVMZW5ndGggPSBmQnVmZmVyLmxlbmd0aDsKKyAgICAgICAgfQorICAgICAgICBpbnQgY291bnQgPSBmSW5wdXRTdHJlYW0ucmVhZChmQnVmZmVyLCAwLCBieXRlTGVuZ3RoKTsKKyAgICAgICAgaWYoY291bnQgPT0gLTEpIHJldHVybiAtMTsKKyAgICAgICAgLy8gdHJ5IGFuZCBtYWtlIGNvdW50IGJlIGEgbXVsdGlwbGUgb2YgdGhlIG51bWJlciBvZiBieXRlcyB3ZSdyZSBsb29raW5nIGZvcgorICAgICAgICBpZihmRW5jb2RpbmcgPj0gNCkgeyAvLyBCaWdFbmRpYW4KKyAgICAgICAgICAgIC8vIHRoaXMgbG9va3MgdWdseSwgYnV0IGl0IGF2b2lkcyBhbiBpZiBhdCBhbnkgcmF0ZS4uLgorICAgICAgICAgICAgaW50IG51bVRvUmVhZCA9ICg0IC0gKGNvdW50ICYgMykgJiAzKTsKKyAgICAgICAgICAgIGZvcihpbnQgaT0wOyBpPG51bVRvUmVhZDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaW50IGNoYXJSZWFkID0gZklucHV0U3RyZWFtLnJlYWQoKTsKKyAgICAgICAgICAgICAgICBpZihjaGFyUmVhZCA9PSAtMSkgeyAvLyBlbmQgb2YgaW5wdXQ7IHNvbWV0aGluZyBsaWtlbHkgd2VudCB3cm9uZyFBICBQYWQgYnVmZmVyIHdpdGggbnVsbHMuCisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSBpO2o8bnVtVG9SZWFkOyBqKyspCisgICAgICAgICAgICAgICAgICAgICAgICBmQnVmZmVyW2NvdW50K2pdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZkJ1ZmZlcltjb3VudCtpXSA9IChieXRlKWNoYXJSZWFkOyAKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb3VudCArPSBudW1Ub1JlYWQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQgbnVtVG9SZWFkID0gY291bnQgJiAxOworICAgICAgICAgICAgaWYobnVtVG9SZWFkICE9IDApIHsKKyAgICAgICAgICAgICAgICBjb3VudCsrOworICAgICAgICAgICAgICAgIGludCBjaGFyUmVhZCA9IGZJbnB1dFN0cmVhbS5yZWFkKCk7CisgICAgICAgICAgICAgICAgaWYoY2hhclJlYWQgPT0gLTEpIHsgLy8gZW5kIG9mIGlucHV0OyBzb21ldGhpbmcgbGlrZWx5IHdlbnQgd3JvbmchQSAgUGFkIGJ1ZmZlciB3aXRoIG51bGxzLgorICAgICAgICAgICAgICAgICAgICBmQnVmZmVyW2NvdW50XSA9IDA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZkJ1ZmZlcltjb3VudF0gPSAoYnl0ZSljaGFyUmVhZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBub3cgY291bnQgaXMgYSBtdWx0aXBsZSBvZiB0aGUgcmlnaHQgbnVtYmVyIG9mIGJ5dGVzCisgICAgICAgIGludCBudW1DaGFycyA9IGNvdW50ID4+ICgoZkVuY29kaW5nID49IDQpPzI6MSk7CisgICAgICAgIGludCBjdXJQb3MgPSAwOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUNoYXJzOyBpKyspIHsKKyAgICAgICAgICAgIGludCBiMCA9IGZCdWZmZXJbY3VyUG9zKytdICYgMHhmZjsKKyAgICAgICAgICAgIGludCBiMSA9IGZCdWZmZXJbY3VyUG9zKytdICYgMHhmZjsKKyAgICAgICAgICAgIGlmKGZFbmNvZGluZyA+PTQpIHsKKyAgICAgICAgICAgICAgICBpbnQgYjIgPSBmQnVmZmVyW2N1clBvcysrXSAmIDB4ZmY7CisgICAgICAgICAgICAgICAgaW50IGIzID0gZkJ1ZmZlcltjdXJQb3MrK10gJiAweGZmOworICAgICAgICAgICAgICAgIGlmIChmRW5jb2RpbmcgPT0gVUNTNEJFKQorICAgICAgICAgICAgICAgICAgICBjaFtvZmZzZXQraV0gPSAoY2hhcikoKGIwPDwyNCkrKGIxPDwxNikrKGIyPDw4KStiMyk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBjaFtvZmZzZXQraV0gPSAoY2hhcikoKGIzPDwyNCkrKGIyPDwxNikrKGIxPDw4KStiMCk7CisgICAgICAgICAgICB9IGVsc2UgeyAvLyBVQ1MtMgorICAgICAgICAgICAgICAgIGlmIChmRW5jb2RpbmcgPT0gVUNTMkJFKQorICAgICAgICAgICAgICAgICAgICBjaFtvZmZzZXQraV0gPSAoY2hhcikoKGIwPDw4KStiMSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBjaFtvZmZzZXQraV0gPSAoY2hhcikoKGIxPDw4KStiMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bUNoYXJzOworICAgIH0gLy8gcmVhZChjaGFyW10saW50LGludCkKKworICAgIC8qKgorICAgICAqIFNraXAgY2hhcmFjdGVycy4gIFRoaXMgbWV0aG9kIHdpbGwgYmxvY2sgdW50aWwgc29tZSBjaGFyYWN0ZXJzIGFyZQorICAgICAqIGF2YWlsYWJsZSwgYW4gSS9PIGVycm9yIG9jY3Vycywgb3IgdGhlIGVuZCBvZiB0aGUgc3RyZWFtIGlzIHJlYWNoZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gIG4gIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBza2lwCisgICAgICoKKyAgICAgKiBAcmV0dXJuICAgIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBhY3R1YWxseSBza2lwcGVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uICBJT0V4Y2VwdGlvbiAgSWYgYW4gSS9PIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBsb25nIHNraXAobG9uZyBuKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLyBjaGFyV2lkdGggd2lsbCByZXByZXNlbnQgdGhlIG51bWJlciBvZiBiaXRzIHRvIG1vdmUKKyAgICAgICAgLy8gbiBsZWZ0d2FyZCB0byBnZXQgbnVtIG9mIGJ5dGVzIHRvIHNraXAsIGFuZCB0aGVuIG1vdmUgdGhlIHJlc3VsdCByaWdodHdhcmQKKyAgICAgICAgLy8gdG8gZ2V0IG51bSBvZiBjaGFycyBlZmZlY3RpdmVseSBza2lwcGVkLgorICAgICAgICAvLyBUaGUgdHJpY2sgd2l0aCAmJ2luZywgYXMgd2l0aCBlbHNld2hlcmUgaW4gdGhpcyBkY29kZSwgaXMKKyAgICAgICAgLy8gaW50ZW5kZWQgdG8gYXZvaWQgYW4gZXhwZW5zaXZlIHVzZSBvZiAvIHRoYXQgbWlnaHQgbm90IGJlIG9wdGltaXplZAorICAgICAgICAvLyBhd2F5LgorICAgICAgICBpbnQgY2hhcldpZHRoID0gKGZFbmNvZGluZyA+PTQpPzI6MTsKKyAgICAgICAgbG9uZyBieXRlc1NraXBwZWQgPSBmSW5wdXRTdHJlYW0uc2tpcChuPDxjaGFyV2lkdGgpOworICAgICAgICBpZigoYnl0ZXNTa2lwcGVkICYgKGNoYXJXaWR0aCB8IDEpKSA9PSAwKSByZXR1cm4gYnl0ZXNTa2lwcGVkID4+IGNoYXJXaWR0aDsKKyAgICAgICAgcmV0dXJuIChieXRlc1NraXBwZWQgPj4gY2hhcldpZHRoKSArIDE7CisgICAgfSAvLyBza2lwKGxvbmcpOmxvbmcKKworICAgIC8qKgorICAgICAqIFRlbGwgd2hldGhlciB0aGlzIHN0cmVhbSBpcyByZWFkeSB0byBiZSByZWFkLgorICAgICAqCisgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBuZXh0IHJlYWQoKSBpcyBndWFyYW50ZWVkIG5vdCB0byBibG9jayBmb3IgaW5wdXQsCisgICAgICogZmFsc2Ugb3RoZXJ3aXNlLiAgTm90ZSB0aGF0IHJldHVybmluZyBmYWxzZSBkb2VzIG5vdCBndWFyYW50ZWUgdGhhdCB0aGUKKyAgICAgKiBuZXh0IHJlYWQgd2lsbCBibG9jay4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gIElPRXhjZXB0aW9uICBJZiBhbiBJL08gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gcmVhZHkoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXJldHVybiBmYWxzZTsKKyAgICB9IC8vIHJlYWR5KCkKKworICAgIC8qKgorICAgICAqIFRlbGwgd2hldGhlciB0aGlzIHN0cmVhbSBzdXBwb3J0cyB0aGUgbWFyaygpIG9wZXJhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBtYXJrU3VwcG9ydGVkKCkgeworCXJldHVybiBmSW5wdXRTdHJlYW0ubWFya1N1cHBvcnRlZCgpOworICAgIH0gLy8gbWFya1N1cHBvcnRlZCgpCisKKyAgICAvKioKKyAgICAgKiBNYXJrIHRoZSBwcmVzZW50IHBvc2l0aW9uIGluIHRoZSBzdHJlYW0uICBTdWJzZXF1ZW50IGNhbGxzIHRvIHJlc2V0KCkKKyAgICAgKiB3aWxsIGF0dGVtcHQgdG8gcmVwb3NpdGlvbiB0aGUgc3RyZWFtIHRvIHRoaXMgcG9pbnQuICBOb3QgYWxsCisgICAgICogY2hhcmFjdGVyLWlucHV0IHN0cmVhbXMgc3VwcG9ydCB0aGUgbWFyaygpIG9wZXJhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgcmVhZEFoZWFkTGltaXQgIExpbWl0IG9uIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0aGF0IG1heSBiZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWQgd2hpbGUgc3RpbGwgcHJlc2VydmluZyB0aGUgbWFyay4gIEFmdGVyCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGluZyB0aGlzIG1hbnkgY2hhcmFjdGVycywgYXR0ZW1wdGluZyB0bworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2V0IHRoZSBzdHJlYW0gbWF5IGZhaWwuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uICBJT0V4Y2VwdGlvbiAgSWYgdGhlIHN0cmVhbSBkb2VzIG5vdCBzdXBwb3J0IG1hcmsoKSwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgaWYgc29tZSBvdGhlciBJL08gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgbWFyayhpbnQgcmVhZEFoZWFkTGltaXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJZklucHV0U3RyZWFtLm1hcmsocmVhZEFoZWFkTGltaXQpOworICAgIH0gLy8gbWFyayhpbnQpCisKKyAgICAvKioKKyAgICAgKiBSZXNldCB0aGUgc3RyZWFtLiAgSWYgdGhlIHN0cmVhbSBoYXMgYmVlbiBtYXJrZWQsIHRoZW4gYXR0ZW1wdCB0bworICAgICAqIHJlcG9zaXRpb24gaXQgYXQgdGhlIG1hcmsuICBJZiB0aGUgc3RyZWFtIGhhcyBub3QgYmVlbiBtYXJrZWQsIHRoZW4KKyAgICAgKiBhdHRlbXB0IHRvIHJlc2V0IGl0IGluIHNvbWUgd2F5IGFwcHJvcHJpYXRlIHRvIHRoZSBwYXJ0aWN1bGFyIHN0cmVhbSwKKyAgICAgKiBmb3IgZXhhbXBsZSBieSByZXBvc2l0aW9uaW5nIGl0IHRvIGl0cyBzdGFydGluZyBwb2ludC4gIE5vdCBhbGwKKyAgICAgKiBjaGFyYWN0ZXItaW5wdXQgc3RyZWFtcyBzdXBwb3J0IHRoZSByZXNldCgpIG9wZXJhdGlvbiwgYW5kIHNvbWUgc3VwcG9ydAorICAgICAqIHJlc2V0KCkgd2l0aG91dCBzdXBwb3J0aW5nIG1hcmsoKS4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gIElPRXhjZXB0aW9uICBJZiB0aGUgc3RyZWFtIGhhcyBub3QgYmVlbiBtYXJrZWQsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGlmIHRoZSBtYXJrIGhhcyBiZWVuIGludmFsaWRhdGVkLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBvciBpZiB0aGUgc3RyZWFtIGRvZXMgbm90IHN1cHBvcnQgcmVzZXQoKSwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgaWYgc29tZSBvdGhlciBJL08gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVzZXQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmSW5wdXRTdHJlYW0ucmVzZXQoKTsKKyAgICB9IC8vIHJlc2V0KCkKKworICAgIC8qKgorICAgICAqIENsb3NlIHRoZSBzdHJlYW0uICBPbmNlIGEgc3RyZWFtIGhhcyBiZWVuIGNsb3NlZCwgZnVydGhlciByZWFkKCksCisgICAgICogcmVhZHkoKSwgbWFyaygpLCBvciByZXNldCgpIGludm9jYXRpb25zIHdpbGwgdGhyb3cgYW4gSU9FeGNlcHRpb24uCisgICAgICogQ2xvc2luZyBhIHByZXZpb3VzbHktY2xvc2VkIHN0cmVhbSwgaG93ZXZlciwgaGFzIG5vIGVmZmVjdC4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gIElPRXhjZXB0aW9uICBJZiBhbiBJL08gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgIGZJbnB1dFN0cmVhbS5jbG9zZSgpOworICAgICB9IC8vIGNsb3NlKCkKKworfSAvLyBjbGFzcyBVQ1NSZWFkZXIKZGlmZiAtLWdpdCBhL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci94bWxwYXJzZXIvVVRGOFJlYWRlci5qYXZhIGIvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3htbHBhcnNlci9VVEY4UmVhZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdjZGY0ZgotLS0gL2Rldi9udWxsCisrKyBiL2phc3Blci9qYXNwZXIyL3NyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci94bWxwYXJzZXIvVVRGOFJlYWRlci5qYXZhCkBAIC0wLDAgKzEsNjM0IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYXNwZXIueG1scGFyc2VyOworCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUmVhZGVyOworaW1wb3J0IGphdmEuaW8uVVRGRGF0YUZvcm1hdEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5jb21waWxlci5Mb2NhbGl6ZXI7CisKKy8qKgorICogQGF1dGhvciBBbmR5IENsYXJrLCBJQk0KKyAqCisgKiBAdmVyc2lvbiAkSWQkCisgKi8KK3B1YmxpYyBjbGFzcyBVVEY4UmVhZGVyCisgICAgZXh0ZW5kcyBSZWFkZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nIGxvZz0KKyAgICAgICAgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeS5nZXRMb2coIFVURjhSZWFkZXIuY2xhc3MgKTsKKyAgICAKKyAgICAvLworICAgIC8vIENvbnN0YW50cworICAgIC8vCisKKyAgICAvKiogRGVmYXVsdCBieXRlIGJ1ZmZlciBzaXplICgyMDQ4KS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0JVRkZFUl9TSVpFID0gMjA0ODsKKworICAgIC8vIGRlYnVnZ2luZworCisgICAgLyoqIERlYnVnIHJlYWQuICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19SRUFEID0gZmFsc2U7CisKKyAgICAvLworICAgIC8vIERhdGEKKyAgICAvLworCisgICAgLyoqIElucHV0IHN0cmVhbS4gKi8KKyAgICBwcm90ZWN0ZWQgSW5wdXRTdHJlYW0gZklucHV0U3RyZWFtOworCisgICAgLyoqIEJ5dGUgYnVmZmVyLiAqLworICAgIHByb3RlY3RlZCBieXRlW10gZkJ1ZmZlcjsKKworICAgIC8qKiBPZmZzZXQgaW50byBidWZmZXIuICovCisgICAgcHJvdGVjdGVkIGludCBmT2Zmc2V0OworCisgICAgLyoqIFN1cnJvZ2F0ZSBjaGFyYWN0ZXIuICovCisgICAgcHJpdmF0ZSBpbnQgZlN1cnJvZ2F0ZSA9IC0xOworCisgICAgLy8KKyAgICAvLyBDb25zdHJ1Y3RvcnMKKyAgICAvLworCisgICAgLyoqIAorICAgICAqIENvbnN0cnVjdHMgYSBVVEYtOCByZWFkZXIgZnJvbSB0aGUgc3BlY2lmaWVkIGlucHV0IHN0cmVhbSwgCisgICAgICogYnVmZmVyIHNpemUgYW5kIE1lc3NhZ2VGb3JtYXR0ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5wdXRTdHJlYW0gVGhlIGlucHV0IHN0cmVhbS4KKyAgICAgKiBAcGFyYW0gc2l6ZSAgICAgICAgVGhlIGluaXRpYWwgYnVmZmVyIHNpemUuCisgICAgICovCisgICAgcHVibGljIFVURjhSZWFkZXIoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIGludCBzaXplKSB7CisgICAgICAgIGZJbnB1dFN0cmVhbSA9IGlucHV0U3RyZWFtOworICAgICAgICBmQnVmZmVyID0gbmV3IGJ5dGVbc2l6ZV07CisgICAgfQorCisgICAgLy8KKyAgICAvLyBSZWFkZXIgbWV0aG9kcworICAgIC8vCisKKyAgICAvKioKKyAgICAgKiBSZWFkIGEgc2luZ2xlIGNoYXJhY3Rlci4gIFRoaXMgbWV0aG9kIHdpbGwgYmxvY2sgdW50aWwgYSBjaGFyYWN0ZXIgaXMKKyAgICAgKiBhdmFpbGFibGUsIGFuIEkvTyBlcnJvciBvY2N1cnMsIG9yIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSBpcyByZWFjaGVkLgorICAgICAqCisgICAgICogPHA+IFN1YmNsYXNzZXMgdGhhdCBpbnRlbmQgdG8gc3VwcG9ydCBlZmZpY2llbnQgc2luZ2xlLWNoYXJhY3RlciBpbnB1dAorICAgICAqIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gICAgIFRoZSBjaGFyYWN0ZXIgcmVhZCwgYXMgYW4gaW50ZWdlciBpbiB0aGUgcmFuZ2UgMCB0byAxNjM4MworICAgICAqICAgICAgICAgICAgICg8dHQ+MHgwMC0weGZmZmY8L3R0PiksIG9yIC0xIGlmIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSBoYXMKKyAgICAgKiAgICAgICAgICAgICBiZWVuIHJlYWNoZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gIElPRXhjZXB0aW9uICBJZiBhbiBJL08gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBkZWNvZGUgY2hhcmFjdGVyCisgICAgICAgIGludCBjID0gZlN1cnJvZ2F0ZTsKKyAgICAgICAgaWYgKGZTdXJyb2dhdGUgPT0gLTEpIHsKKyAgICAgICAgICAgIC8vIE5PVEU6IFdlIHVzZSB0aGUgaW5kZXggaW50byB0aGUgYnVmZmVyIGlmIHRoZXJlIGFyZSByZW1haW5pbmcKKyAgICAgICAgICAgIC8vICAgICAgIGJ5dGVzIGZyb20gdGhlIGxhc3QgYmxvY2sgcmVhZC4gLUFjCisgICAgICAgICAgICBpbnQgaW5kZXggPSAwOworCisgICAgICAgICAgICAvLyBnZXQgZmlyc3QgYnl0ZQorICAgICAgICAgICAgaW50IGIwID0gaW5kZXggPT0gZk9mZnNldCAKKyAgICAgICAgICAgICAgICAgICA/IGZJbnB1dFN0cmVhbS5yZWFkKCkgOiBmQnVmZmVyW2luZGV4KytdICYgMHgwMEZGOworICAgICAgICAgICAgaWYgKGIwID09IC0xKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBVVEYtODogICBbMHh4eCB4eHh4XQorICAgICAgICAgICAgLy8gVW5pY29kZTogWzAwMDAgMDAwMF0gWzB4eHggeHh4eF0KKyAgICAgICAgICAgIGlmIChiMCA8IDB4ODApIHsKKyAgICAgICAgICAgICAgICBjID0gKGNoYXIpYjA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFVURi04OiAgIFsxMTB5IHl5eXldIFsxMHh4IHh4eHhdCisgICAgICAgICAgICAvLyBVbmljb2RlOiBbMDAwMCAweXl5XSBbeXl4eCB4eHh4XQorICAgICAgICAgICAgZWxzZSBpZiAoKGIwICYgMHhFMCkgPT0gMHhDMCkgeworICAgICAgICAgICAgICAgIGludCBiMSA9IGluZGV4ID09IGZPZmZzZXQgCisgICAgICAgICAgICAgICAgICAgICAgID8gZklucHV0U3RyZWFtLnJlYWQoKSA6IGZCdWZmZXJbaW5kZXgrK10gJiAweDAwRkY7CisgICAgICAgICAgICAgICAgaWYgKGIxID09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkQnl0ZSgyLCAyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKChiMSAmIDB4QzApICE9IDB4ODApIHsKKyAgICAgICAgICAgICAgICAgICAgaW52YWxpZEJ5dGUoMiwgMiwgYjEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjID0gKChiMCA8PCA2KSAmIDB4MDdDMCkgfCAoYjEgJiAweDAwM0YpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBVVEYtODogICBbMTExMCB6enp6XSBbMTB5eSB5eXl5XSBbMTB4eCB4eHh4XQorICAgICAgICAgICAgLy8gVW5pY29kZTogW3p6enogeXl5eV0gW3l5eHggeHh4eF0KKyAgICAgICAgICAgIGVsc2UgaWYgKChiMCAmIDB4RjApID09IDB4RTApIHsKKyAgICAgICAgICAgICAgICBpbnQgYjEgPSBpbmRleCA9PSBmT2Zmc2V0CisgICAgICAgICAgICAgICAgICAgICAgID8gZklucHV0U3RyZWFtLnJlYWQoKSA6IGZCdWZmZXJbaW5kZXgrK10gJiAweDAwRkY7CisgICAgICAgICAgICAgICAgaWYgKGIxID09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkQnl0ZSgyLCAzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKChiMSAmIDB4QzApICE9IDB4ODApIHsKKyAgICAgICAgICAgICAgICAgICAgaW52YWxpZEJ5dGUoMiwgMywgYjEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnQgYjIgPSBpbmRleCA9PSBmT2Zmc2V0IAorICAgICAgICAgICAgICAgICAgICAgICA/IGZJbnB1dFN0cmVhbS5yZWFkKCkgOiBmQnVmZmVyW2luZGV4KytdICYgMHgwMEZGOworICAgICAgICAgICAgICAgIGlmIChiMiA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICBleHBlY3RlZEJ5dGUoMywgMyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgoYjIgJiAweEMwKSAhPSAweDgwKSB7CisgICAgICAgICAgICAgICAgICAgIGludmFsaWRCeXRlKDMsIDMsIGIyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYyA9ICgoYjAgPDwgMTIpICYgMHhGMDAwKSB8ICgoYjEgPDwgNikgJiAweDBGQzApIHwKKyAgICAgICAgICAgICAgICAgICAgKGIyICYgMHgwMDNGKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVVRGLTg6ICAgWzExMTEgMHV1dV0gWzEwdXUgenp6el0gWzEweXkgeXl5eV0gWzEweHggeHh4eF0qCisgICAgICAgICAgICAvLyBVbmljb2RlOiBbMTEwMSAxMHd3XSBbd3d6eiB6enl5XSAoaGlnaCBzdXJyb2dhdGUpCisgICAgICAgICAgICAvLyAgICAgICAgICBbMTEwMSAxMXl5XSBbeXl4eCB4eHh4XSAobG93IHN1cnJvZ2F0ZSkKKyAgICAgICAgICAgIC8vICAgICAgICAgICogdXV1dXUgPSB3d3d3ICsgMQorICAgICAgICAgICAgZWxzZSBpZiAoKGIwICYgMHhGOCkgPT0gMHhGMCkgeworICAgICAgICAgICAgICAgIGludCBiMSA9IGluZGV4ID09IGZPZmZzZXQgCisgICAgICAgICAgICAgICAgICAgICAgID8gZklucHV0U3RyZWFtLnJlYWQoKSA6IGZCdWZmZXJbaW5kZXgrK10gJiAweDAwRkY7CisgICAgICAgICAgICAgICAgaWYgKGIxID09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkQnl0ZSgyLCA0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKChiMSAmIDB4QzApICE9IDB4ODApIHsKKyAgICAgICAgICAgICAgICAgICAgaW52YWxpZEJ5dGUoMiwgMywgYjEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnQgYjIgPSBpbmRleCA9PSBmT2Zmc2V0IAorICAgICAgICAgICAgICAgICAgICAgICA/IGZJbnB1dFN0cmVhbS5yZWFkKCkgOiBmQnVmZmVyW2luZGV4KytdICYgMHgwMEZGOworICAgICAgICAgICAgICAgIGlmIChiMiA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICBleHBlY3RlZEJ5dGUoMywgNCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgoYjIgJiAweEMwKSAhPSAweDgwKSB7CisgICAgICAgICAgICAgICAgICAgIGludmFsaWRCeXRlKDMsIDMsIGIyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW50IGIzID0gaW5kZXggPT0gZk9mZnNldCAKKyAgICAgICAgICAgICAgICAgICAgICAgPyBmSW5wdXRTdHJlYW0ucmVhZCgpIDogZkJ1ZmZlcltpbmRleCsrXSAmIDB4MDBGRjsKKyAgICAgICAgICAgICAgICBpZiAoYjMgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRCeXRlKDQsIDQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoKGIzICYgMHhDMCkgIT0gMHg4MCkgeworICAgICAgICAgICAgICAgICAgICBpbnZhbGlkQnl0ZSg0LCA0LCBiMyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGludCB1dXV1dSA9ICgoYjAgPDwgMikgJiAweDAwMUMpIHwgKChiMSA+PiA0KSAmIDB4MDAwMyk7CisgICAgICAgICAgICAgICAgaWYgKHV1dXV1ID4gMHgxMCkgeworICAgICAgICAgICAgICAgICAgICBpbnZhbGlkU3Vycm9nYXRlKHV1dXV1KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW50IHd3d3cgPSB1dXV1dSAtIDE7CisgICAgICAgICAgICAgICAgaW50IGhzID0gMHhEODAwIHwgCisgICAgICAgICAgICAgICAgICAgICAgICAgKCh3d3d3IDw8IDYpICYgMHgwM0MwKSB8ICgoYjEgPDwgMikgJiAweDAwM0MpIHwgCisgICAgICAgICAgICAgICAgICAgICAgICAgKChiMiA+PiA0KSAmIDB4MDAwMyk7CisgICAgICAgICAgICAgICAgaW50IGxzID0gMHhEQzAwIHwgKChiMiA8PCA2KSAmIDB4MDNDMCkgfCAoYjMgJiAweDAwM0YpOworICAgICAgICAgICAgICAgIGMgPSBoczsKKyAgICAgICAgICAgICAgICBmU3Vycm9nYXRlID0gbHM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGVycm9yCisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnZhbGlkQnl0ZSgxLCAxLCBiMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyB1c2Ugc3Vycm9nYXRlCisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgZlN1cnJvZ2F0ZSA9IC0xOworICAgICAgICB9CisKKyAgICAgICAgLy8gcmV0dXJuIGNoYXJhY3RlcgorICAgICAgICBpZiAoREVCVUdfUkVBRCkgeworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygicmVhZCgpOiAweCIrSW50ZWdlci50b0hleFN0cmluZyhjKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGM7CisKKyAgICB9IC8vIHJlYWQoKTppbnQKKworICAgIC8qKgorICAgICAqIFJlYWQgY2hhcmFjdGVycyBpbnRvIGEgcG9ydGlvbiBvZiBhbiBhcnJheS4gIFRoaXMgbWV0aG9kIHdpbGwgYmxvY2sKKyAgICAgKiB1bnRpbCBzb21lIGlucHV0IGlzIGF2YWlsYWJsZSwgYW4gSS9PIGVycm9yIG9jY3Vycywgb3IgdGhlIGVuZCBvZiB0aGUKKyAgICAgKiBzdHJlYW0gaXMgcmVhY2hlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgICAgIGNoICAgICBEZXN0aW5hdGlvbiBidWZmZXIKKyAgICAgKiBAcGFyYW0gICAgICBvZmZzZXQgT2Zmc2V0IGF0IHdoaWNoIHRvIHN0YXJ0IHN0b3JpbmcgY2hhcmFjdGVycworICAgICAqIEBwYXJhbSAgICAgIGxlbmd0aCBNYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHJlYWQKKyAgICAgKgorICAgICAqIEByZXR1cm4gICAgIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyByZWFkLCBvciAtMSBpZiB0aGUgZW5kIG9mIHRoZQorICAgICAqICAgICAgICAgICAgIHN0cmVhbSBoYXMgYmVlbiByZWFjaGVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uICBJT0V4Y2VwdGlvbiAgSWYgYW4gSS9PIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBpbnQgcmVhZChjaGFyIGNoW10sIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gaGFuZGxlIHN1cnJvZ2F0ZQorICAgICAgICBpbnQgb3V0ID0gb2Zmc2V0OworICAgICAgICBpZiAoZlN1cnJvZ2F0ZSAhPSAtMSkgeworICAgICAgICAgICAgY2hbb2Zmc2V0ICsgMV0gPSAoY2hhcilmU3Vycm9nYXRlOworICAgICAgICAgICAgZlN1cnJvZ2F0ZSA9IC0xOworICAgICAgICAgICAgbGVuZ3RoLS07CisgICAgICAgICAgICBvdXQrKzsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHJlYWQgYnl0ZXMKKyAgICAgICAgaW50IGNvdW50ID0gMDsKKyAgICAgICAgaWYgKGZPZmZzZXQgPT0gMCkgeworICAgICAgICAgICAgLy8gYWRqdXN0IGxlbmd0aCB0byByZWFkCisgICAgICAgICAgICBpZiAobGVuZ3RoID4gZkJ1ZmZlci5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBsZW5ndGggPSBmQnVmZmVyLmxlbmd0aDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gcGVyZm9ybSByZWFkIG9wZXJhdGlvbgorICAgICAgICAgICAgY291bnQgPSBmSW5wdXRTdHJlYW0ucmVhZChmQnVmZmVyLCAwLCBsZW5ndGgpOworICAgICAgICAgICAgaWYgKGNvdW50ID09IC0xKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY291bnQgKz0gb3V0IC0gb2Zmc2V0OworICAgICAgICB9CisKKyAgICAgICAgLy8gc2tpcCByZWFkOyBsYXN0IGNoYXJhY3RlciB3YXMgaW4gZXJyb3IKKyAgICAgICAgLy8gTk9URTogSGF2aW5nIGFuIG9mZnNldCB2YWx1ZSBvdGhlciB0aGFuIHplcm8gbWVhbnMgdGhhdCB0aGVyZSB3YXMKKyAgICAgICAgLy8gICAgICAgYW4gZXJyb3IgaW4gdGhlIGxhc3QgY2hhcmFjdGVyIHJlYWQuIEluIHRoaXMgY2FzZSwgd2UgaGF2ZQorICAgICAgICAvLyAgICAgICBza2lwcGVkIHRoZSByZWFkIHNvIHdlIGRvbid0IGNvbnN1bWUgYW55IGJ5dGVzIHBhc3QgdGhlIAorICAgICAgICAvLyAgICAgICBlcnJvci4gQnkgc2lnbmFsbGluZyB0aGUgZXJyb3Igb24gdGhlIG5leHQgYmxvY2sgcmVhZCB3ZQorICAgICAgICAvLyAgICAgICBhbGxvdyB0aGUgbWV0aG9kIHRvIHJldHVybiB0aGUgbW9zdCB2YWxpZCBjaGFyYWN0ZXJzIHRoYXQKKyAgICAgICAgLy8gICAgICAgaXQgY2FuIG9uIHRoZSBwcmV2aW91cyBibG9jayByZWFkLiAtQWMKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBjb3VudCA9IGZPZmZzZXQ7CisgICAgICAgICAgICBmT2Zmc2V0ID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNvbnZlcnQgYnl0ZXMgdG8gY2hhcmFjdGVycworICAgICAgICBmaW5hbCBpbnQgdG90YWwgPSBjb3VudDsKKyAgICAgICAgZm9yIChpbnQgaW4gPSAwOyBpbiA8IHRvdGFsOyBpbisrKSB7CisgICAgICAgICAgICBpbnQgYjAgPSBmQnVmZmVyW2luXSAmIDB4MDBGRjsKKworICAgICAgICAgICAgLy8gVVRGLTg6ICAgWzB4eHggeHh4eF0KKyAgICAgICAgICAgIC8vIFVuaWNvZGU6IFswMDAwIDAwMDBdIFsweHh4IHh4eHhdCisgICAgICAgICAgICBpZiAoYjAgPCAweDgwKSB7CisgICAgICAgICAgICAgICAgY2hbb3V0KytdID0gKGNoYXIpYjA7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFVURi04OiAgIFsxMTB5IHl5eXldIFsxMHh4IHh4eHhdCisgICAgICAgICAgICAvLyBVbmljb2RlOiBbMDAwMCAweXl5XSBbeXl4eCB4eHh4XQorICAgICAgICAgICAgaWYgKChiMCAmIDB4RTApID09IDB4QzApIHsKKyAgICAgICAgICAgICAgICBpbnQgYjEgPSAtMTsKKyAgICAgICAgICAgICAgICBpZiAoKytpbiA8IHRvdGFsKSB7IAorICAgICAgICAgICAgICAgICAgICBiMSA9IGZCdWZmZXJbaW5dICYgMHgwMEZGOyAKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGIxID0gZklucHV0U3RyZWFtLnJlYWQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGIxID09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3V0ID4gb2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZkJ1ZmZlclswXSA9IChieXRlKWIwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZPZmZzZXQgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvdXQgLSBvZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZEJ5dGUoMiwgMik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKChiMSAmIDB4QzApICE9IDB4ODApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG91dCA+IG9mZnNldCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZkJ1ZmZlclswXSA9IChieXRlKWIwOworICAgICAgICAgICAgICAgICAgICAgICAgZkJ1ZmZlclsxXSA9IChieXRlKWIxOworICAgICAgICAgICAgICAgICAgICAgICAgZk9mZnNldCA9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3V0IC0gb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGludmFsaWRCeXRlKDIsIDIsIGIxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW50IGMgPSAoKGIwIDw8IDYpICYgMHgwN0MwKSB8IChiMSAmIDB4MDAzRik7CisgICAgICAgICAgICAgICAgY2hbb3V0KytdID0gKGNoYXIpYzsKKyAgICAgICAgICAgICAgICBjb3VudCAtPSAxOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBVVEYtODogICBbMTExMCB6enp6XSBbMTB5eSB5eXl5XSBbMTB4eCB4eHh4XQorICAgICAgICAgICAgLy8gVW5pY29kZTogW3p6enogeXl5eV0gW3l5eHggeHh4eF0KKyAgICAgICAgICAgIGlmICgoYjAgJiAweEYwKSA9PSAweEUwKSB7CisgICAgICAgICAgICAgICAgaW50IGIxID0gLTE7CisgICAgICAgICAgICAgICAgaWYgKCsraW4gPCB0b3RhbCkgeyAKKyAgICAgICAgICAgICAgICAgICAgYjEgPSBmQnVmZmVyW2luXSAmIDB4MDBGRjsgCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBiMSA9IGZJbnB1dFN0cmVhbS5yZWFkKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChiMSA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG91dCA+IG9mZnNldCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZCdWZmZXJbMF0gPSAoYnl0ZSliMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmT2Zmc2V0ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3V0IC0gb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRCeXRlKDIsIDMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgoYjEgJiAweEMwKSAhPSAweDgwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChvdXQgPiBvZmZzZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZCdWZmZXJbMF0gPSAoYnl0ZSliMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZCdWZmZXJbMV0gPSAoYnl0ZSliMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZPZmZzZXQgPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG91dCAtIG9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpbnZhbGlkQnl0ZSgyLCAzLCBiMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGludCBiMiA9IC0xOworICAgICAgICAgICAgICAgIGlmICgrK2luIDwgdG90YWwpIHsgCisgICAgICAgICAgICAgICAgICAgIGIyID0gZkJ1ZmZlcltpbl0gJiAweDAwRkY7IAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYjIgPSBmSW5wdXRTdHJlYW0ucmVhZCgpOworICAgICAgICAgICAgICAgICAgICBpZiAoYjIgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvdXQgPiBvZmZzZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmQnVmZmVyWzBdID0gKGJ5dGUpYjA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZkJ1ZmZlclsxXSA9IChieXRlKWIxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZPZmZzZXQgPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvdXQgLSBvZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZEJ5dGUoMywgMyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKChiMiAmIDB4QzApICE9IDB4ODApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG91dCA+IG9mZnNldCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZkJ1ZmZlclswXSA9IChieXRlKWIwOworICAgICAgICAgICAgICAgICAgICAgICAgZkJ1ZmZlclsxXSA9IChieXRlKWIxOworICAgICAgICAgICAgICAgICAgICAgICAgZkJ1ZmZlclsyXSA9IChieXRlKWIyOworICAgICAgICAgICAgICAgICAgICAgICAgZk9mZnNldCA9IDM7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3V0IC0gb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGludmFsaWRCeXRlKDMsIDMsIGIyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW50IGMgPSAoKGIwIDw8IDEyKSAmIDB4RjAwMCkgfCAoKGIxIDw8IDYpICYgMHgwRkMwKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAoYjIgJiAweDAwM0YpOworICAgICAgICAgICAgICAgIGNoW291dCsrXSA9IChjaGFyKWM7CisgICAgICAgICAgICAgICAgY291bnQgLT0gMjsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVVRGLTg6ICAgWzExMTEgMHV1dV0gWzEwdXUgenp6el0gWzEweXkgeXl5eV0gWzEweHggeHh4eF0qCisgICAgICAgICAgICAvLyBVbmljb2RlOiBbMTEwMSAxMHd3XSBbd3d6eiB6enl5XSAoaGlnaCBzdXJyb2dhdGUpCisgICAgICAgICAgICAvLyAgICAgICAgICBbMTEwMSAxMXl5XSBbeXl4eCB4eHh4XSAobG93IHN1cnJvZ2F0ZSkKKyAgICAgICAgICAgIC8vICAgICAgICAgICogdXV1dXUgPSB3d3d3ICsgMQorICAgICAgICAgICAgaWYgKChiMCAmIDB4RjgpID09IDB4RjApIHsKKyAgICAgICAgICAgICAgICBpbnQgYjEgPSAtMTsKKyAgICAgICAgICAgICAgICBpZiAoKytpbiA8IHRvdGFsKSB7IAorICAgICAgICAgICAgICAgICAgICBiMSA9IGZCdWZmZXJbaW5dICYgMHgwMEZGOyAKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGIxID0gZklucHV0U3RyZWFtLnJlYWQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGIxID09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3V0ID4gb2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZkJ1ZmZlclswXSA9IChieXRlKWIwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZPZmZzZXQgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvdXQgLSBvZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZEJ5dGUoMiwgNCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKChiMSAmIDB4QzApICE9IDB4ODApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG91dCA+IG9mZnNldCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZkJ1ZmZlclswXSA9IChieXRlKWIwOworICAgICAgICAgICAgICAgICAgICAgICAgZkJ1ZmZlclsxXSA9IChieXRlKWIxOworICAgICAgICAgICAgICAgICAgICAgICAgZk9mZnNldCA9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3V0IC0gb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGludmFsaWRCeXRlKDIsIDQsIGIxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW50IGIyID0gLTE7CisgICAgICAgICAgICAgICAgaWYgKCsraW4gPCB0b3RhbCkgeyAKKyAgICAgICAgICAgICAgICAgICAgYjIgPSBmQnVmZmVyW2luXSAmIDB4MDBGRjsgCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBiMiA9IGZJbnB1dFN0cmVhbS5yZWFkKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChiMiA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG91dCA+IG9mZnNldCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZCdWZmZXJbMF0gPSAoYnl0ZSliMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmQnVmZmVyWzFdID0gKGJ5dGUpYjE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZk9mZnNldCA9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG91dCAtIG9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkQnl0ZSgzLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjb3VudCsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoKGIyICYgMHhDMCkgIT0gMHg4MCkgeworICAgICAgICAgICAgICAgICAgICBpZiAob3V0ID4gb2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmQnVmZmVyWzBdID0gKGJ5dGUpYjA7CisgICAgICAgICAgICAgICAgICAgICAgICBmQnVmZmVyWzFdID0gKGJ5dGUpYjE7CisgICAgICAgICAgICAgICAgICAgICAgICBmQnVmZmVyWzJdID0gKGJ5dGUpYjI7CisgICAgICAgICAgICAgICAgICAgICAgICBmT2Zmc2V0ID0gMzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvdXQgLSBvZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaW52YWxpZEJ5dGUoMywgNCwgYjIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnQgYjMgPSAtMTsKKyAgICAgICAgICAgICAgICBpZiAoKytpbiA8IHRvdGFsKSB7IAorICAgICAgICAgICAgICAgICAgICBiMyA9IGZCdWZmZXJbaW5dICYgMHgwMEZGOyAKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGIzID0gZklucHV0U3RyZWFtLnJlYWQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGIzID09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3V0ID4gb2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZkJ1ZmZlclswXSA9IChieXRlKWIwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZCdWZmZXJbMV0gPSAoYnl0ZSliMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmQnVmZmVyWzJdID0gKGJ5dGUpYjI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZk9mZnNldCA9IDM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG91dCAtIG9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkQnl0ZSg0LCA0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjb3VudCsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoKGIzICYgMHhDMCkgIT0gMHg4MCkgeworICAgICAgICAgICAgICAgICAgICBpZiAob3V0ID4gb2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmQnVmZmVyWzBdID0gKGJ5dGUpYjA7CisgICAgICAgICAgICAgICAgICAgICAgICBmQnVmZmVyWzFdID0gKGJ5dGUpYjE7CisgICAgICAgICAgICAgICAgICAgICAgICBmQnVmZmVyWzJdID0gKGJ5dGUpYjI7CisgICAgICAgICAgICAgICAgICAgICAgICBmQnVmZmVyWzNdID0gKGJ5dGUpYjM7CisgICAgICAgICAgICAgICAgICAgICAgICBmT2Zmc2V0ID0gNDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvdXQgLSBvZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaW52YWxpZEJ5dGUoNCwgNCwgYjIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIGRlY29kZSBieXRlcyBpbnRvIHN1cnJvZ2F0ZSBjaGFyYWN0ZXJzCisgICAgICAgICAgICAgICAgaW50IHV1dXV1ID0gKChiMCA8PCAyKSAmIDB4MDAxQykgfCAoKGIxID4+IDQpICYgMHgwMDAzKTsKKyAgICAgICAgICAgICAgICBpZiAodXV1dXUgPiAweDEwKSB7CisgICAgICAgICAgICAgICAgICAgIGludmFsaWRTdXJyb2dhdGUodXV1dXUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnQgd3d3dyA9IHV1dXV1IC0gMTsKKyAgICAgICAgICAgICAgICBpbnQgenp6eiA9IGIxICYgMHgwMDBGOworICAgICAgICAgICAgICAgIGludCB5eXl5eXkgPSBiMiAmIDB4MDAzRjsKKyAgICAgICAgICAgICAgICBpbnQgeHh4eHh4ID0gYjMgJiAweDAwM0Y7CisgICAgICAgICAgICAgICAgaW50IGhzID0gMHhEODAwIHwgKCh3d3d3IDw8IDYpICYgMHgwM0MwKSB8ICh6enp6IDw8IDIpIHwgKHl5eXl5eSA+PiA0KTsKKyAgICAgICAgICAgICAgICBpbnQgbHMgPSAweERDMDAgfCAoKHl5eXl5eSA8PCA2KSAmIDB4MDNDMCkgfCB4eHh4eHg7CisKKyAgICAgICAgICAgICAgICAvLyBzZXQgY2hhcmFjdGVycworICAgICAgICAgICAgICAgIGNoW291dCsrXSA9IChjaGFyKWhzOworICAgICAgICAgICAgICAgIGNoW291dCsrXSA9IChjaGFyKWxzOworICAgICAgICAgICAgICAgIGNvdW50IC09IDI7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGVycm9yCisgICAgICAgICAgICBpZiAob3V0ID4gb2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgZkJ1ZmZlclswXSA9IChieXRlKWIwOworICAgICAgICAgICAgICAgIGZPZmZzZXQgPSAxOworICAgICAgICAgICAgICAgIHJldHVybiBvdXQgLSBvZmZzZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnZhbGlkQnl0ZSgxLCAxLCBiMCk7CisgICAgICAgIH0KKworICAgICAgICAvLyByZXR1cm4gbnVtYmVyIG9mIGNoYXJhY3RlcnMgY29udmVydGVkCisgICAgICAgIGlmIChERUJVR19SRUFEKSB7CisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJyZWFkKGNoYXJbXSwiK29mZnNldCsnLCcrbGVuZ3RoKyIpOiBjb3VudD0iK2NvdW50KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY291bnQ7CisKKyAgICB9IC8vIHJlYWQoY2hhcltdLGludCxpbnQpCisKKyAgICAvKioKKyAgICAgKiBTa2lwIGNoYXJhY3RlcnMuICBUaGlzIG1ldGhvZCB3aWxsIGJsb2NrIHVudGlsIHNvbWUgY2hhcmFjdGVycyBhcmUKKyAgICAgKiBhdmFpbGFibGUsIGFuIEkvTyBlcnJvciBvY2N1cnMsIG9yIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSBpcyByZWFjaGVkLgorICAgICAqCisgICAgICogQHBhcmFtICBuICBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gc2tpcAorICAgICAqCisgICAgICogQHJldHVybiAgICBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgYWN0dWFsbHkgc2tpcHBlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiAgSU9FeGNlcHRpb24gIElmIGFuIEkvTyBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBza2lwKGxvbmcgbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICBsb25nIHJlbWFpbmluZyA9IG47CisgICAgICAgIGZpbmFsIGNoYXJbXSBjaCA9IG5ldyBjaGFyW2ZCdWZmZXIubGVuZ3RoXTsKKyAgICAgICAgZG8geworICAgICAgICAgICAgaW50IGxlbmd0aCA9IGNoLmxlbmd0aCA8IHJlbWFpbmluZyA/IGNoLmxlbmd0aCA6IChpbnQpcmVtYWluaW5nOworICAgICAgICAgICAgaW50IGNvdW50ID0gcmVhZChjaCwgMCwgbGVuZ3RoKTsKKyAgICAgICAgICAgIGlmIChjb3VudCA+IDApIHsKKyAgICAgICAgICAgICAgICByZW1haW5pbmcgLT0gY291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAocmVtYWluaW5nID4gMCk7CisKKyAgICAgICAgbG9uZyBza2lwcGVkID0gbiAtIHJlbWFpbmluZzsKKyAgICAgICAgcmV0dXJuIHNraXBwZWQ7CisKKyAgICB9IC8vIHNraXAobG9uZyk6bG9uZworCisgICAgLyoqCisgICAgICogVGVsbCB3aGV0aGVyIHRoaXMgc3RyZWFtIGlzIHJlYWR5IHRvIGJlIHJlYWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIG5leHQgcmVhZCgpIGlzIGd1YXJhbnRlZWQgbm90IHRvIGJsb2NrIGZvciBpbnB1dCwKKyAgICAgKiBmYWxzZSBvdGhlcndpc2UuICBOb3RlIHRoYXQgcmV0dXJuaW5nIGZhbHNlIGRvZXMgbm90IGd1YXJhbnRlZSB0aGF0IHRoZQorICAgICAqIG5leHQgcmVhZCB3aWxsIGJsb2NrLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiAgSU9FeGNlcHRpb24gIElmIGFuIEkvTyBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiByZWFkeSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJICAgIHJldHVybiBmYWxzZTsKKyAgICB9IC8vIHJlYWR5KCkKKworICAgIC8qKgorICAgICAqIFRlbGwgd2hldGhlciB0aGlzIHN0cmVhbSBzdXBwb3J0cyB0aGUgbWFyaygpIG9wZXJhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBtYXJrU3VwcG9ydGVkKCkgeworCSAgICByZXR1cm4gZmFsc2U7CisgICAgfSAvLyBtYXJrU3VwcG9ydGVkKCkKKworICAgIC8qKgorICAgICAqIE1hcmsgdGhlIHByZXNlbnQgcG9zaXRpb24gaW4gdGhlIHN0cmVhbS4gIFN1YnNlcXVlbnQgY2FsbHMgdG8gcmVzZXQoKQorICAgICAqIHdpbGwgYXR0ZW1wdCB0byByZXBvc2l0aW9uIHRoZSBzdHJlYW0gdG8gdGhpcyBwb2ludC4gIE5vdCBhbGwKKyAgICAgKiBjaGFyYWN0ZXItaW5wdXQgc3RyZWFtcyBzdXBwb3J0IHRoZSBtYXJrKCkgb3BlcmF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtICByZWFkQWhlYWRMaW1pdCAgTGltaXQgb24gdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRoYXQgbWF5IGJlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgcmVhZCB3aGlsZSBzdGlsbCBwcmVzZXJ2aW5nIHRoZSBtYXJrLiAgQWZ0ZXIKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICByZWFkaW5nIHRoaXMgbWFueSBjaGFyYWN0ZXJzLCBhdHRlbXB0aW5nIHRvCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXQgdGhlIHN0cmVhbSBtYXkgZmFpbC4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gIElPRXhjZXB0aW9uICBJZiB0aGUgc3RyZWFtIGRvZXMgbm90IHN1cHBvcnQgbWFyaygpLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBvciBpZiBzb21lIG90aGVyIEkvTyBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBtYXJrKGludCByZWFkQWhlYWRMaW1pdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwl0aHJvdyBuZXcgSU9FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgTG9jYWxpemVyLmdldE1lc3NhZ2UoImpzcC5lcnJvci54bWwub3BlcmF0aW9uTm90U3VwcG9ydGVkIiwKKwkJCQkgICAgICJtYXJrKCkiLCAiVVRGLTgiKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzZXQgdGhlIHN0cmVhbS4gIElmIHRoZSBzdHJlYW0gaGFzIGJlZW4gbWFya2VkLCB0aGVuIGF0dGVtcHQgdG8KKyAgICAgKiByZXBvc2l0aW9uIGl0IGF0IHRoZSBtYXJrLiAgSWYgdGhlIHN0cmVhbSBoYXMgbm90IGJlZW4gbWFya2VkLCB0aGVuCisgICAgICogYXR0ZW1wdCB0byByZXNldCBpdCBpbiBzb21lIHdheSBhcHByb3ByaWF0ZSB0byB0aGUgcGFydGljdWxhciBzdHJlYW0sCisgICAgICogZm9yIGV4YW1wbGUgYnkgcmVwb3NpdGlvbmluZyBpdCB0byBpdHMgc3RhcnRpbmcgcG9pbnQuICBOb3QgYWxsCisgICAgICogY2hhcmFjdGVyLWlucHV0IHN0cmVhbXMgc3VwcG9ydCB0aGUgcmVzZXQoKSBvcGVyYXRpb24sIGFuZCBzb21lIHN1cHBvcnQKKyAgICAgKiByZXNldCgpIHdpdGhvdXQgc3VwcG9ydGluZyBtYXJrKCkuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uICBJT0V4Y2VwdGlvbiAgSWYgdGhlIHN0cmVhbSBoYXMgbm90IGJlZW4gbWFya2VkLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBvciBpZiB0aGUgbWFyayBoYXMgYmVlbiBpbnZhbGlkYXRlZCwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgaWYgdGhlIHN0cmVhbSBkb2VzIG5vdCBzdXBwb3J0IHJlc2V0KCksCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGlmIHNvbWUgb3RoZXIgSS9PIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZk9mZnNldCA9IDA7CisgICAgICAgIGZTdXJyb2dhdGUgPSAtMTsKKyAgICB9IC8vIHJlc2V0KCkKKworICAgIC8qKgorICAgICAqIENsb3NlIHRoZSBzdHJlYW0uICBPbmNlIGEgc3RyZWFtIGhhcyBiZWVuIGNsb3NlZCwgZnVydGhlciByZWFkKCksCisgICAgICogcmVhZHkoKSwgbWFyaygpLCBvciByZXNldCgpIGludm9jYXRpb25zIHdpbGwgdGhyb3cgYW4gSU9FeGNlcHRpb24uCisgICAgICogQ2xvc2luZyBhIHByZXZpb3VzbHktY2xvc2VkIHN0cmVhbSwgaG93ZXZlciwgaGFzIG5vIGVmZmVjdC4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gIElPRXhjZXB0aW9uICBJZiBhbiBJL08gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmSW5wdXRTdHJlYW0uY2xvc2UoKTsKKyAgICB9IC8vIGNsb3NlKCkKKworICAgIC8vCisgICAgLy8gUHJpdmF0ZSBtZXRob2RzCisgICAgLy8KKworICAgIC8qKiBUaHJvd3MgYW4gZXhjZXB0aW9uIGZvciBleHBlY3RlZCBieXRlLiAqLworICAgIHByaXZhdGUgdm9pZCBleHBlY3RlZEJ5dGUoaW50IHBvc2l0aW9uLCBpbnQgY291bnQpCisgICAgICAgIHRocm93cyBVVEZEYXRhRm9ybWF0RXhjZXB0aW9uIHsKKworICAgICAgICB0aHJvdyBuZXcgVVRGRGF0YUZvcm1hdEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICBMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgianNwLmVycm9yLnhtbC5leHBlY3RlZEJ5dGUiLAorCQkJCSAgICAgSW50ZWdlci50b1N0cmluZyhwb3NpdGlvbiksCisJCQkJICAgICBJbnRlZ2VyLnRvU3RyaW5nKGNvdW50KSkpOworCisgICAgfSAvLyBleHBlY3RlZEJ5dGUoaW50LGludCxpbnQpCisKKyAgICAvKiogVGhyb3dzIGFuIGV4Y2VwdGlvbiBmb3IgaW52YWxpZCBieXRlLiAqLworICAgIHByaXZhdGUgdm9pZCBpbnZhbGlkQnl0ZShpbnQgcG9zaXRpb24sIGludCBjb3VudCwgaW50IGMpIAorICAgICAgICB0aHJvd3MgVVRGRGF0YUZvcm1hdEV4Y2VwdGlvbiB7CisKKyAgICAgICAgdGhyb3cgbmV3IFVURkRhdGFGb3JtYXRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgTG9jYWxpemVyLmdldE1lc3NhZ2UoImpzcC5lcnJvci54bWwuaW52YWxpZEJ5dGUiLAorCQkJCSAgICAgSW50ZWdlci50b1N0cmluZyhwb3NpdGlvbiksCisJCQkJICAgICBJbnRlZ2VyLnRvU3RyaW5nKGNvdW50KSkpOworICAgIH0gLy8gaW52YWxpZEJ5dGUoaW50LGludCxpbnQsaW50KQorCisgICAgLyoqIFRocm93cyBhbiBleGNlcHRpb24gZm9yIGludmFsaWQgc3Vycm9nYXRlIGJpdHMuICovCisgICAgcHJpdmF0ZSB2b2lkIGludmFsaWRTdXJyb2dhdGUoaW50IHV1dXV1KSB0aHJvd3MgVVRGRGF0YUZvcm1hdEV4Y2VwdGlvbiB7CisgICAgICAgIAorICAgICAgICB0aHJvdyBuZXcgVVRGRGF0YUZvcm1hdEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICBMb2NhbGl6ZXIuZ2V0TWVzc2FnZSgianNwLmVycm9yLnhtbC5pbnZhbGlkSGlnaFN1cnJvZ2F0ZSIsCisJCQkJICAgICBJbnRlZ2VyLnRvSGV4U3RyaW5nKHV1dXV1KSkpOworICAgIH0gLy8gaW52YWxpZFN1cnJvZ2F0ZShpbnQpCisKK30gLy8gY2xhc3MgVVRGOFJlYWRlcgpkaWZmIC0tZ2l0IGEvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3htbHBhcnNlci9YTUxDaGFyLmphdmEgYi9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIveG1scGFyc2VyL1hNTENoYXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzhlNjc0Ci0tLSAvZGV2L251bGwKKysrIGIvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3htbHBhcnNlci9YTUxDaGFyLmphdmEKQEAgLTAsMCArMSwxMDMwIEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQorICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCisgKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMTk5OSwgSW50ZXJuYXRpb25hbAorICogQnVzaW5lc3MgTWFjaGluZXMsIEluYy4sIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy4gIEZvciBtb3JlCisgKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKKyAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFzcGVyLnhtbHBhcnNlcjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKKy8qKgorICogVGhpcyBjbGFzcyBkZWZpbmVzIHRoZSBiYXNpYyBYTUwgY2hhcmFjdGVyIHByb3BlcnRpZXMuIFRoZSBkYXRhCisgKiBpbiB0aGlzIGNsYXNzIGNhbiBiZSB1c2VkIHRvIHZlcmlmeSB0aGF0IGEgY2hhcmFjdGVyIGlzIGEgdmFsaWQKKyAqIFhNTCBjaGFyYWN0ZXIgb3IgaWYgdGhlIGNoYXJhY3RlciBpcyBhIHNwYWNlLCBuYW1lIHN0YXJ0LCBvciBuYW1lCisgKiBjaGFyYWN0ZXIuCisgKiA8cD4KKyAqIEEgc2VyaWVzIG9mIGNvbnZlbmllbmNlIG1ldGhvZHMgYXJlIHN1cHBsaWVkIHRvIGVhc2UgdGhlIGJ1cmRlbgorICogb2YgdGhlIGRldmVsb3Blci4gQmVjYXVzZSBpbmxpbmluZyB0aGUgY2hlY2tzIGNhbiBpbXByb3ZlIHBlcgorICogY2hhcmFjdGVyIHBlcmZvcm1hbmNlLCB0aGUgdGFibGVzIG9mIGNoYXJhY3RlciBwcm9wZXJ0aWVzIGFyZQorICogcHVibGljLiBVc2luZyB0aGUgY2hhcmFjdGVyIGFzIGFuIGluZGV4IGludG8gdGhlIDxjb2RlPkNIQVJTPC9jb2RlPgorICogYXJyYXkgYW5kIGFwcGx5aW5nIHRoZSBhcHByb3ByaWF0ZSBtYXNrIGZsYWcgKGUuZy4KKyAqIDxjb2RlPk1BU0tfVkFMSUQ8L2NvZGU+KSwgeWllbGRzIHRoZSBzYW1lIHJlc3VsdHMgYXMgY2FsbGluZyB0aGUKKyAqIGNvbnZlbmllbmNlIG1ldGhvZHMuIFRoZXJlIGlzIG9uZSBleGNlcHRpb246IGNoZWNrIHRoZSBjb21tZW50cworICogZm9yIHRoZSA8Y29kZT5pc1ZhbGlkPC9jb2RlPiBtZXRob2QgZm9yIGRldGFpbHMuCisgKgorICogQGF1dGhvciBHbGVubiBNYXJjeSwgSUJNCisgKiBAYXV0aG9yIEFuZHkgQ2xhcmssIElCTQorICogQGF1dGhvciBFcmljIFllLCBJQk0KKyAqIEBhdXRob3IgQXJuYXVkICBMZSBIb3JzLCBJQk0KKyAqIEBhdXRob3IgTWljaGFlbCBHbGF2YXNzZXZpY2gsIElCTQorICogQGF1dGhvciBSYWh1bCBTcml2YXN0YXZhLCBTdW4gTWljcm9zeXN0ZW1zIEluYy4KKyAqCisgKiBAdmVyc2lvbiAkSWQkCisgKi8KK3B1YmxpYyBjbGFzcyBYTUxDaGFyIHsKKworICAgIC8vCisgICAgLy8gQ29uc3RhbnRzCisgICAgLy8KKworICAgIC8qKiBDaGFyYWN0ZXIgZmxhZ3MuICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIENIQVJTID0gbmV3IGJ5dGVbMSA8PCAxNl07CisKKyAgICAvKiogVmFsaWQgY2hhcmFjdGVyIG1hc2suICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFTS19WQUxJRCA9IDB4MDE7CisKKyAgICAvKiogU3BhY2UgY2hhcmFjdGVyIG1hc2suICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFTS19TUEFDRSA9IDB4MDI7CisKKyAgICAvKiogTmFtZSBzdGFydCBjaGFyYWN0ZXIgbWFzay4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVNLX05BTUVfU1RBUlQgPSAweDA0OworCisgICAgLyoqIE5hbWUgY2hhcmFjdGVyIG1hc2suICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFTS19OQU1FID0gMHgwODsKKworICAgIC8qKiBQdWJpZCBjaGFyYWN0ZXIgbWFzay4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVNLX1BVQklEID0gMHgxMDsKKyAgICAKKyAgICAvKiogCisgICAgICogQ29udGVudCBjaGFyYWN0ZXIgbWFzay4gU3BlY2lhbCBjaGFyYWN0ZXJzIGFyZSB0aG9zZSB0aGF0IGNhbgorICAgICAqIGJlIGNvbnNpZGVyZWQgdGhlIHN0YXJ0IG9mIG1hcmt1cCwgc3VjaCBhcyAnJmx0OycgYW5kICcmYW1wOycuIAorICAgICAqIFRoZSB2YXJpb3VzIG5ld2xpbmUgY2hhcmFjdGVycyBhcmUgY29uc2lkZXJlZCBzcGVjaWFsIGFzIHdlbGwuCisgICAgICogQWxsIG90aGVyIHZhbGlkIFhNTCBjaGFyYWN0ZXJzIGNhbiBiZSBjb25zaWRlcmVkIGNvbnRlbnQuCisgICAgICogPHA+CisgICAgICogVGhpcyBpcyBhbiBvcHRpbWl6YXRpb24gZm9yIHRoZSBpbm5lciBsb29wIG9mIGNoYXJhY3RlciBzY2FubmluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVNLX0NPTlRFTlQgPSAweDIwOworCisgICAgLyoqIE5DTmFtZSBzdGFydCBjaGFyYWN0ZXIgbWFzay4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVNLX05DTkFNRV9TVEFSVCA9IDB4NDA7CisKKyAgICAvKiogTkNOYW1lIGNoYXJhY3RlciBtYXNrLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BU0tfTkNOQU1FID0gMHg4MDsKKworICAgIC8vCisgICAgLy8gU3RhdGljIGluaXRpYWxpemF0aW9uCisgICAgLy8KKworICAgIHN0YXRpYyB7CisgICAgICAgIAorICAgICAgICAvLyBJbml0aWFsaXppbmcgdGhlIENoYXJhY3RlciBGbGFnIEFycmF5CisgICAgICAgIC8vIENvZGUgZ2VuZXJhdGVkIGJ5OiBYTUxDaGFyR2VuZXJhdG9yLgorICAgICAgICAKKyAgICAgICAgQ0hBUlNbOV0gPSAzNTsKKyAgICAgICAgQ0hBUlNbMTBdID0gMTk7CisgICAgICAgIENIQVJTWzEzXSA9IDE5OworICAgICAgICBDSEFSU1szMl0gPSA1MTsKKyAgICAgICAgQ0hBUlNbMzNdID0gNDk7CisgICAgICAgIENIQVJTWzM0XSA9IDMzOworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMzUsIDM4LCAoYnl0ZSkgNDkgKTsgLy8gRmlsbCAzIG9mIHZhbHVlIChieXRlKSA0OQorICAgICAgICBDSEFSU1szOF0gPSAxOworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMzksIDQ1LCAoYnl0ZSkgNDkgKTsgLy8gRmlsbCA2IG9mIHZhbHVlIChieXRlKSA0OQorICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgNDUsIDQ3LCAoYnl0ZSkgLTcxICk7IC8vIEZpbGwgMiBvZiB2YWx1ZSAoYnl0ZSkgLTcxCisgICAgICAgIENIQVJTWzQ3XSA9IDQ5OworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgNDgsIDU4LCAoYnl0ZSkgLTcxICk7IC8vIEZpbGwgMTAgb2YgdmFsdWUgKGJ5dGUpIC03MQorICAgICAgICBDSEFSU1s1OF0gPSA2MTsKKyAgICAgICAgQ0hBUlNbNTldID0gNDk7CisgICAgICAgIENIQVJTWzYwXSA9IDE7CisgICAgICAgIENIQVJTWzYxXSA9IDQ5OworICAgICAgICBDSEFSU1s2Ml0gPSAzMzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDYzLCA2NSwgKGJ5dGUpIDQ5ICk7IC8vIEZpbGwgMiBvZiB2YWx1ZSAoYnl0ZSkgNDkKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDY1LCA5MSwgKGJ5dGUpIC0zICk7IC8vIEZpbGwgMjYgb2YgdmFsdWUgKGJ5dGUpIC0zCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCA5MSwgOTMsIChieXRlKSAzMyApOyAvLyBGaWxsIDIgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIENIQVJTWzkzXSA9IDE7CisgICAgICAgIENIQVJTWzk0XSA9IDMzOworICAgICAgICBDSEFSU1s5NV0gPSAtMzsKKyAgICAgICAgQ0hBUlNbOTZdID0gMzM7CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCA5NywgMTIzLCAoYnl0ZSkgLTMgKTsgLy8gRmlsbCAyNiBvZiB2YWx1ZSAoYnl0ZSkgLTMKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDEyMywgMTgzLCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCA2MCBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQ0hBUlNbMTgzXSA9IC04NzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDE4NCwgMTkyLCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCA4IG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMTkyLCAyMTUsIChieXRlKSAtMTkgKTsgLy8gRmlsbCAyMyBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIENIQVJTWzIxNV0gPSAzMzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDIxNiwgMjQ3LCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgMzEgb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBDSEFSU1syNDddID0gMzM7CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyNDgsIDMwNiwgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDU4IG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDMwNiwgMzA4LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCAyIG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMzA4LCAzMTksIChieXRlKSAtMTkgKTsgLy8gRmlsbCAxMSBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAzMTksIDMyMSwgKGJ5dGUpIDMzICk7IC8vIEZpbGwgMiBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDMyMSwgMzI5LCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgOCBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIENIQVJTWzMyOV0gPSAzMzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDMzMCwgMzgzLCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgNTMgb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBDSEFSU1szODNdID0gMzM7CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAzODQsIDQ1MiwgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDY4IG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDQ1MiwgNDYxLCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCA5IG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgNDYxLCA0OTcsIChieXRlKSAtMTkgKTsgLy8gRmlsbCAzNiBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCA0OTcsIDUwMCwgKGJ5dGUpIDMzICk7IC8vIEZpbGwgMyBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDUwMCwgNTAyLCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgMiBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCA1MDIsIDUwNiwgKGJ5dGUpIDMzICk7IC8vIEZpbGwgNCBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDUwNiwgNTM2LCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgMzAgb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgNTM2LCA1OTIsIChieXRlKSAzMyApOyAvLyBGaWxsIDU2IG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgNTkyLCA2ODEsIChieXRlKSAtMTkgKTsgLy8gRmlsbCA4OSBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCA2ODEsIDY5OSwgKGJ5dGUpIDMzICk7IC8vIEZpbGwgMTggb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCA2OTksIDcwNiwgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDcgb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgNzA2LCA3MjAsIChieXRlKSAzMyApOyAvLyBGaWxsIDE0IG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgNzIwLCA3MjIsIChieXRlKSAtODcgKTsgLy8gRmlsbCAyIG9mIHZhbHVlIChieXRlKSAtODcKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDcyMiwgNzY4LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCA0NiBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDc2OCwgODM4LCAoYnl0ZSkgLTg3ICk7IC8vIEZpbGwgNzAgb2YgdmFsdWUgKGJ5dGUpIC04NworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgODM4LCA4NjQsIChieXRlKSAzMyApOyAvLyBGaWxsIDI2IG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgODY0LCA4NjYsIChieXRlKSAtODcgKTsgLy8gRmlsbCAyIG9mIHZhbHVlIChieXRlKSAtODcKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDg2NiwgOTAyLCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCAzNiBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQ0hBUlNbOTAyXSA9IC0xOTsKKyAgICAgICAgQ0hBUlNbOTAzXSA9IC04NzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDkwNCwgOTA3LCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgMyBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIENIQVJTWzkwN10gPSAzMzsKKyAgICAgICAgQ0hBUlNbOTA4XSA9IC0xOTsKKyAgICAgICAgQ0hBUlNbOTA5XSA9IDMzOworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgOTEwLCA5MzAsIChieXRlKSAtMTkgKTsgLy8gRmlsbCAyMCBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIENIQVJTWzkzMF0gPSAzMzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDkzMSwgOTc1LCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgNDQgb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBDSEFSU1s5NzVdID0gMzM7CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCA5NzYsIDk4MywgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDcgb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgOTgzLCA5ODYsIChieXRlKSAzMyApOyAvLyBGaWxsIDMgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIENIQVJTWzk4Nl0gPSAtMTk7CisgICAgICAgIENIQVJTWzk4N10gPSAzMzsKKyAgICAgICAgQ0hBUlNbOTg4XSA9IC0xOTsKKyAgICAgICAgQ0hBUlNbOTg5XSA9IDMzOworICAgICAgICBDSEFSU1s5OTBdID0gLTE5OworICAgICAgICBDSEFSU1s5OTFdID0gMzM7CisgICAgICAgIENIQVJTWzk5Ml0gPSAtMTk7CisgICAgICAgIENIQVJTWzk5M10gPSAzMzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDk5NCwgMTAxMiwgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDE4IG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDEwMTIsIDEwMjUsIChieXRlKSAzMyApOyAvLyBGaWxsIDEzIG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMTAyNSwgMTAzNywgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDEyIG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQ0hBUlNbMTAzN10gPSAzMzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDEwMzgsIDExMDQsIChieXRlKSAtMTkgKTsgLy8gRmlsbCA2NiBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIENIQVJTWzExMDRdID0gMzM7CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAxMTA1LCAxMTE3LCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgMTIgb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBDSEFSU1sxMTE3XSA9IDMzOworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMTExOCwgMTE1NCwgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDM2IG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQ0hBUlNbMTE1NF0gPSAzMzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDExNTUsIDExNTksIChieXRlKSAtODcgKTsgLy8gRmlsbCA0IG9mIHZhbHVlIChieXRlKSAtODcKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDExNTksIDExNjgsIChieXRlKSAzMyApOyAvLyBGaWxsIDkgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAxMTY4LCAxMjIxLCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgNTMgb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMTIyMSwgMTIyMywgKGJ5dGUpIDMzICk7IC8vIEZpbGwgMiBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDEyMjMsIDEyMjUsIChieXRlKSAtMTkgKTsgLy8gRmlsbCAyIG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDEyMjUsIDEyMjcsIChieXRlKSAzMyApOyAvLyBGaWxsIDIgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAxMjI3LCAxMjI5LCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgMiBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAxMjI5LCAxMjMyLCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCAzIG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMTIzMiwgMTI2MCwgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDI4IG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDEyNjAsIDEyNjIsIChieXRlKSAzMyApOyAvLyBGaWxsIDIgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAxMjYyLCAxMjcwLCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgOCBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAxMjcwLCAxMjcyLCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCAyIG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMTI3MiwgMTI3NCwgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDIgb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMTI3NCwgMTMyOSwgKGJ5dGUpIDMzICk7IC8vIEZpbGwgNTUgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAxMzI5LCAxMzY3LCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgMzggb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMTM2NywgMTM2OSwgKGJ5dGUpIDMzICk7IC8vIEZpbGwgMiBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQ0hBUlNbMTM2OV0gPSAtMTk7CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAxMzcwLCAxMzc3LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCA3IG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMTM3NywgMTQxNSwgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDM4IG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDE0MTUsIDE0MjUsIChieXRlKSAzMyApOyAvLyBGaWxsIDEwIG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMTQyNSwgMTQ0MiwgKGJ5dGUpIC04NyApOyAvLyBGaWxsIDE3IG9mIHZhbHVlIChieXRlKSAtODcKKyAgICAgICAgQ0hBUlNbMTQ0Ml0gPSAzMzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDE0NDMsIDE0NjYsIChieXRlKSAtODcgKTsgLy8gRmlsbCAyMyBvZiB2YWx1ZSAoYnl0ZSkgLTg3CisgICAgICAgIENIQVJTWzE0NjZdID0gMzM7CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAxNDY3LCAxNDcwLCAoYnl0ZSkgLTg3ICk7IC8vIEZpbGwgMyBvZiB2YWx1ZSAoYnl0ZSkgLTg3CisgICAgICAgIENIQVJTWzE0NzBdID0gMzM7CisgICAgICAgIENIQVJTWzE0NzFdID0gLTg3OworICAgICAgICBDSEFSU1sxNDcyXSA9IDMzOworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMTQ3MywgMTQ3NSwgKGJ5dGUpIC04NyApOyAvLyBGaWxsIDIgb2YgdmFsdWUgKGJ5dGUpIC04NworICAgICAgICBDSEFSU1sxNDc1XSA9IDMzOworICAgICAgICBDSEFSU1sxNDc2XSA9IC04NzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDE0NzcsIDE0ODgsIChieXRlKSAzMyApOyAvLyBGaWxsIDExIG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMTQ4OCwgMTUxNSwgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDI3IG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDE1MTUsIDE1MjAsIChieXRlKSAzMyApOyAvLyBGaWxsIDUgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAxNTIwLCAxNTIzLCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgMyBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAxNTIzLCAxNTY5LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCA0NiBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDE1NjksIDE1OTUsIChieXRlKSAtMTkgKTsgLy8gRmlsbCAyNiBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAxNTk1LCAxNjAwLCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCA1IG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBDSEFSU1sxNjAwXSA9IC04NzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDE2MDEsIDE2MTEsIChieXRlKSAtMTkgKTsgLy8gRmlsbCAxMCBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAxNjExLCAxNjE5LCAoYnl0ZSkgLTg3ICk7IC8vIEZpbGwgOCBvZiB2YWx1ZSAoYnl0ZSkgLTg3CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAxNjE5LCAxNjMyLCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCAxMyBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDE2MzIsIDE2NDIsIChieXRlKSAtODcgKTsgLy8gRmlsbCAxMCBvZiB2YWx1ZSAoYnl0ZSkgLTg3CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAxNjQyLCAxNjQ4LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCA2IG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBDSEFSU1sxNjQ4XSA9IC04NzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDE2NDksIDE3MjAsIChieXRlKSAtMTkgKTsgLy8gRmlsbCA3MSBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAxNzIwLCAxNzIyLCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCAyIG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMTcyMiwgMTcyNywgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDUgb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBDSEFSU1sxNzI3XSA9IDMzOworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMTcyOCwgMTc0MywgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDE1IG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQ0hBUlNbMTc0M10gPSAzMzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDE3NDQsIDE3NDgsIChieXRlKSAtMTkgKTsgLy8gRmlsbCA0IG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQ0hBUlNbMTc0OF0gPSAzMzsKKyAgICAgICAgQ0hBUlNbMTc0OV0gPSAtMTk7CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAxNzUwLCAxNzY1LCAoYnl0ZSkgLTg3ICk7IC8vIEZpbGwgMTUgb2YgdmFsdWUgKGJ5dGUpIC04NworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMTc2NSwgMTc2NywgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDIgb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMTc2NywgMTc2OSwgKGJ5dGUpIC04NyApOyAvLyBGaWxsIDIgb2YgdmFsdWUgKGJ5dGUpIC04NworICAgICAgICBDSEFSU1sxNzY5XSA9IDMzOworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMTc3MCwgMTc3NCwgKGJ5dGUpIC04NyApOyAvLyBGaWxsIDQgb2YgdmFsdWUgKGJ5dGUpIC04NworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMTc3NCwgMTc3NiwgKGJ5dGUpIDMzICk7IC8vIEZpbGwgMiBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDE3NzYsIDE3ODYsIChieXRlKSAtODcgKTsgLy8gRmlsbCAxMCBvZiB2YWx1ZSAoYnl0ZSkgLTg3CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAxNzg2LCAyMzA1LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCA1MTkgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyMzA1LCAyMzA4LCAoYnl0ZSkgLTg3ICk7IC8vIEZpbGwgMyBvZiB2YWx1ZSAoYnl0ZSkgLTg3CisgICAgICAgIENIQVJTWzIzMDhdID0gMzM7CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyMzA5LCAyMzYyLCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgNTMgb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMjM2MiwgMjM2NCwgKGJ5dGUpIDMzICk7IC8vIEZpbGwgMiBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQ0hBUlNbMjM2NF0gPSAtODc7CisgICAgICAgIENIQVJTWzIzNjVdID0gLTE5OworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMjM2NiwgMjM4MiwgKGJ5dGUpIC04NyApOyAvLyBGaWxsIDE2IG9mIHZhbHVlIChieXRlKSAtODcKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDIzODIsIDIzODUsIChieXRlKSAzMyApOyAvLyBGaWxsIDMgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyMzg1LCAyMzg5LCAoYnl0ZSkgLTg3ICk7IC8vIEZpbGwgNCBvZiB2YWx1ZSAoYnl0ZSkgLTg3CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyMzg5LCAyMzkyLCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCAzIG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMjM5MiwgMjQwMiwgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDEwIG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDI0MDIsIDI0MDQsIChieXRlKSAtODcgKTsgLy8gRmlsbCAyIG9mIHZhbHVlIChieXRlKSAtODcKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDI0MDQsIDI0MDYsIChieXRlKSAzMyApOyAvLyBGaWxsIDIgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyNDA2LCAyNDE2LCAoYnl0ZSkgLTg3ICk7IC8vIEZpbGwgMTAgb2YgdmFsdWUgKGJ5dGUpIC04NworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMjQxNiwgMjQzMywgKGJ5dGUpIDMzICk7IC8vIEZpbGwgMTcgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyNDMzLCAyNDM2LCAoYnl0ZSkgLTg3ICk7IC8vIEZpbGwgMyBvZiB2YWx1ZSAoYnl0ZSkgLTg3CisgICAgICAgIENIQVJTWzI0MzZdID0gMzM7CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyNDM3LCAyNDQ1LCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgOCBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyNDQ1LCAyNDQ3LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCAyIG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMjQ0NywgMjQ0OSwgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDIgb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMjQ0OSwgMjQ1MSwgKGJ5dGUpIDMzICk7IC8vIEZpbGwgMiBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDI0NTEsIDI0NzMsIChieXRlKSAtMTkgKTsgLy8gRmlsbCAyMiBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIENIQVJTWzI0NzNdID0gMzM7CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyNDc0LCAyNDgxLCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgNyBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIENIQVJTWzI0ODFdID0gMzM7CisgICAgICAgIENIQVJTWzI0ODJdID0gLTE5OworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMjQ4MywgMjQ4NiwgKGJ5dGUpIDMzICk7IC8vIEZpbGwgMyBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDI0ODYsIDI0OTAsIChieXRlKSAtMTkgKTsgLy8gRmlsbCA0IG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDI0OTAsIDI0OTIsIChieXRlKSAzMyApOyAvLyBGaWxsIDIgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIENIQVJTWzI0OTJdID0gLTg3OworICAgICAgICBDSEFSU1syNDkzXSA9IDMzOworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMjQ5NCwgMjUwMSwgKGJ5dGUpIC04NyApOyAvLyBGaWxsIDcgb2YgdmFsdWUgKGJ5dGUpIC04NworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMjUwMSwgMjUwMywgKGJ5dGUpIDMzICk7IC8vIEZpbGwgMiBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDI1MDMsIDI1MDUsIChieXRlKSAtODcgKTsgLy8gRmlsbCAyIG9mIHZhbHVlIChieXRlKSAtODcKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDI1MDUsIDI1MDcsIChieXRlKSAzMyApOyAvLyBGaWxsIDIgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyNTA3LCAyNTEwLCAoYnl0ZSkgLTg3ICk7IC8vIEZpbGwgMyBvZiB2YWx1ZSAoYnl0ZSkgLTg3CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyNTEwLCAyNTE5LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCA5IG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBDSEFSU1syNTE5XSA9IC04NzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDI1MjAsIDI1MjQsIChieXRlKSAzMyApOyAvLyBGaWxsIDQgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyNTI0LCAyNTI2LCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgMiBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIENIQVJTWzI1MjZdID0gMzM7CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyNTI3LCAyNTMwLCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgMyBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyNTMwLCAyNTMyLCAoYnl0ZSkgLTg3ICk7IC8vIEZpbGwgMiBvZiB2YWx1ZSAoYnl0ZSkgLTg3CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyNTMyLCAyNTM0LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCAyIG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMjUzNCwgMjU0NCwgKGJ5dGUpIC04NyApOyAvLyBGaWxsIDEwIG9mIHZhbHVlIChieXRlKSAtODcKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDI1NDQsIDI1NDYsIChieXRlKSAtMTkgKTsgLy8gRmlsbCAyIG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDI1NDYsIDI1NjIsIChieXRlKSAzMyApOyAvLyBGaWxsIDE2IG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBDSEFSU1syNTYyXSA9IC04NzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDI1NjMsIDI1NjUsIChieXRlKSAzMyApOyAvLyBGaWxsIDIgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyNTY1LCAyNTcxLCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgNiBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyNTcxLCAyNTc1LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCA0IG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMjU3NSwgMjU3NywgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDIgb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMjU3NywgMjU3OSwgKGJ5dGUpIDMzICk7IC8vIEZpbGwgMiBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDI1NzksIDI2MDEsIChieXRlKSAtMTkgKTsgLy8gRmlsbCAyMiBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIENIQVJTWzI2MDFdID0gMzM7CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyNjAyLCAyNjA5LCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgNyBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIENIQVJTWzI2MDldID0gMzM7CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyNjEwLCAyNjEyLCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgMiBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIENIQVJTWzI2MTJdID0gMzM7CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyNjEzLCAyNjE1LCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgMiBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIENIQVJTWzI2MTVdID0gMzM7CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyNjE2LCAyNjE4LCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgMiBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyNjE4LCAyNjIwLCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCAyIG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBDSEFSU1syNjIwXSA9IC04NzsKKyAgICAgICAgQ0hBUlNbMjYyMV0gPSAzMzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDI2MjIsIDI2MjcsIChieXRlKSAtODcgKTsgLy8gRmlsbCA1IG9mIHZhbHVlIChieXRlKSAtODcKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDI2MjcsIDI2MzEsIChieXRlKSAzMyApOyAvLyBGaWxsIDQgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyNjMxLCAyNjMzLCAoYnl0ZSkgLTg3ICk7IC8vIEZpbGwgMiBvZiB2YWx1ZSAoYnl0ZSkgLTg3CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyNjMzLCAyNjM1LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCAyIG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMjYzNSwgMjYzOCwgKGJ5dGUpIC04NyApOyAvLyBGaWxsIDMgb2YgdmFsdWUgKGJ5dGUpIC04NworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMjYzOCwgMjY0OSwgKGJ5dGUpIDMzICk7IC8vIEZpbGwgMTEgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyNjQ5LCAyNjUzLCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgNCBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIENIQVJTWzI2NTNdID0gMzM7CisgICAgICAgIENIQVJTWzI2NTRdID0gLTE5OworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMjY1NSwgMjY2MiwgKGJ5dGUpIDMzICk7IC8vIEZpbGwgNyBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDI2NjIsIDI2NzQsIChieXRlKSAtODcgKTsgLy8gRmlsbCAxMiBvZiB2YWx1ZSAoYnl0ZSkgLTg3CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyNjc0LCAyNjc3LCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgMyBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyNjc3LCAyNjg5LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCAxMiBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDI2ODksIDI2OTIsIChieXRlKSAtODcgKTsgLy8gRmlsbCAzIG9mIHZhbHVlIChieXRlKSAtODcKKyAgICAgICAgQ0hBUlNbMjY5Ml0gPSAzMzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDI2OTMsIDI3MDAsIChieXRlKSAtMTkgKTsgLy8gRmlsbCA3IG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQ0hBUlNbMjcwMF0gPSAzMzsKKyAgICAgICAgQ0hBUlNbMjcwMV0gPSAtMTk7CisgICAgICAgIENIQVJTWzI3MDJdID0gMzM7CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyNzAzLCAyNzA2LCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgMyBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIENIQVJTWzI3MDZdID0gMzM7CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyNzA3LCAyNzI5LCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgMjIgb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBDSEFSU1syNzI5XSA9IDMzOworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMjczMCwgMjczNywgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDcgb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBDSEFSU1syNzM3XSA9IDMzOworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMjczOCwgMjc0MCwgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDIgb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBDSEFSU1syNzQwXSA9IDMzOworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMjc0MSwgMjc0NiwgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDUgb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMjc0NiwgMjc0OCwgKGJ5dGUpIDMzICk7IC8vIEZpbGwgMiBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQ0hBUlNbMjc0OF0gPSAtODc7CisgICAgICAgIENIQVJTWzI3NDldID0gLTE5OworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMjc1MCwgMjc1OCwgKGJ5dGUpIC04NyApOyAvLyBGaWxsIDggb2YgdmFsdWUgKGJ5dGUpIC04NworICAgICAgICBDSEFSU1syNzU4XSA9IDMzOworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMjc1OSwgMjc2MiwgKGJ5dGUpIC04NyApOyAvLyBGaWxsIDMgb2YgdmFsdWUgKGJ5dGUpIC04NworICAgICAgICBDSEFSU1syNzYyXSA9IDMzOworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMjc2MywgMjc2NiwgKGJ5dGUpIC04NyApOyAvLyBGaWxsIDMgb2YgdmFsdWUgKGJ5dGUpIC04NworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMjc2NiwgMjc4NCwgKGJ5dGUpIDMzICk7IC8vIEZpbGwgMTggb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIENIQVJTWzI3ODRdID0gLTE5OworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMjc4NSwgMjc5MCwgKGJ5dGUpIDMzICk7IC8vIEZpbGwgNSBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDI3OTAsIDI4MDAsIChieXRlKSAtODcgKTsgLy8gRmlsbCAxMCBvZiB2YWx1ZSAoYnl0ZSkgLTg3CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyODAwLCAyODE3LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCAxNyBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDI4MTcsIDI4MjAsIChieXRlKSAtODcgKTsgLy8gRmlsbCAzIG9mIHZhbHVlIChieXRlKSAtODcKKyAgICAgICAgQ0hBUlNbMjgyMF0gPSAzMzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDI4MjEsIDI4MjksIChieXRlKSAtMTkgKTsgLy8gRmlsbCA4IG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDI4MjksIDI4MzEsIChieXRlKSAzMyApOyAvLyBGaWxsIDIgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyODMxLCAyODMzLCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgMiBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyODMzLCAyODM1LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCAyIG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMjgzNSwgMjg1NywgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDIyIG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQ0hBUlNbMjg1N10gPSAzMzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDI4NTgsIDI4NjUsIChieXRlKSAtMTkgKTsgLy8gRmlsbCA3IG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQ0hBUlNbMjg2NV0gPSAzMzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDI4NjYsIDI4NjgsIChieXRlKSAtMTkgKTsgLy8gRmlsbCAyIG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDI4NjgsIDI4NzAsIChieXRlKSAzMyApOyAvLyBGaWxsIDIgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyODcwLCAyODc0LCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgNCBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyODc0LCAyODc2LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCAyIG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBDSEFSU1syODc2XSA9IC04NzsKKyAgICAgICAgQ0hBUlNbMjg3N10gPSAtMTk7CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyODc4LCAyODg0LCAoYnl0ZSkgLTg3ICk7IC8vIEZpbGwgNiBvZiB2YWx1ZSAoYnl0ZSkgLTg3CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyODg0LCAyODg3LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCAzIG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMjg4NywgMjg4OSwgKGJ5dGUpIC04NyApOyAvLyBGaWxsIDIgb2YgdmFsdWUgKGJ5dGUpIC04NworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMjg4OSwgMjg5MSwgKGJ5dGUpIDMzICk7IC8vIEZpbGwgMiBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDI4OTEsIDI4OTQsIChieXRlKSAtODcgKTsgLy8gRmlsbCAzIG9mIHZhbHVlIChieXRlKSAtODcKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDI4OTQsIDI5MDIsIChieXRlKSAzMyApOyAvLyBGaWxsIDggb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyOTAyLCAyOTA0LCAoYnl0ZSkgLTg3ICk7IC8vIEZpbGwgMiBvZiB2YWx1ZSAoYnl0ZSkgLTg3CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyOTA0LCAyOTA4LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCA0IG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMjkwOCwgMjkxMCwgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDIgb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBDSEFSU1syOTEwXSA9IDMzOworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMjkxMSwgMjkxNCwgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDMgb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMjkxNCwgMjkxOCwgKGJ5dGUpIDMzICk7IC8vIEZpbGwgNCBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDI5MTgsIDI5MjgsIChieXRlKSAtODcgKTsgLy8gRmlsbCAxMCBvZiB2YWx1ZSAoYnl0ZSkgLTg3CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyOTI4LCAyOTQ2LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCAxOCBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDI5NDYsIDI5NDgsIChieXRlKSAtODcgKTsgLy8gRmlsbCAyIG9mIHZhbHVlIChieXRlKSAtODcKKyAgICAgICAgQ0hBUlNbMjk0OF0gPSAzMzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDI5NDksIDI5NTUsIChieXRlKSAtMTkgKTsgLy8gRmlsbCA2IG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDI5NTUsIDI5NTgsIChieXRlKSAzMyApOyAvLyBGaWxsIDMgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyOTU4LCAyOTYxLCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgMyBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIENIQVJTWzI5NjFdID0gMzM7CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyOTYyLCAyOTY2LCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgNCBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyOTY2LCAyOTY5LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCAzIG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMjk2OSwgMjk3MSwgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDIgb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBDSEFSU1syOTcxXSA9IDMzOworICAgICAgICBDSEFSU1syOTcyXSA9IC0xOTsKKyAgICAgICAgQ0hBUlNbMjk3M10gPSAzMzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDI5NzQsIDI5NzYsIChieXRlKSAtMTkgKTsgLy8gRmlsbCAyIG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDI5NzYsIDI5NzksIChieXRlKSAzMyApOyAvLyBGaWxsIDMgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyOTc5LCAyOTgxLCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgMiBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAyOTgxLCAyOTg0LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCAzIG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMjk4NCwgMjk4NywgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDMgb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMjk4NywgMjk5MCwgKGJ5dGUpIDMzICk7IC8vIEZpbGwgMyBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDI5OTAsIDI5OTgsIChieXRlKSAtMTkgKTsgLy8gRmlsbCA4IG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQ0hBUlNbMjk5OF0gPSAzMzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDI5OTksIDMwMDIsIChieXRlKSAtMTkgKTsgLy8gRmlsbCAzIG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDMwMDIsIDMwMDYsIChieXRlKSAzMyApOyAvLyBGaWxsIDQgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAzMDA2LCAzMDExLCAoYnl0ZSkgLTg3ICk7IC8vIEZpbGwgNSBvZiB2YWx1ZSAoYnl0ZSkgLTg3CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAzMDExLCAzMDE0LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCAzIG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMzAxNCwgMzAxNywgKGJ5dGUpIC04NyApOyAvLyBGaWxsIDMgb2YgdmFsdWUgKGJ5dGUpIC04NworICAgICAgICBDSEFSU1szMDE3XSA9IDMzOworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMzAxOCwgMzAyMiwgKGJ5dGUpIC04NyApOyAvLyBGaWxsIDQgb2YgdmFsdWUgKGJ5dGUpIC04NworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMzAyMiwgMzAzMSwgKGJ5dGUpIDMzICk7IC8vIEZpbGwgOSBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQ0hBUlNbMzAzMV0gPSAtODc7CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAzMDMyLCAzMDQ3LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCAxNSBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDMwNDcsIDMwNTYsIChieXRlKSAtODcgKTsgLy8gRmlsbCA5IG9mIHZhbHVlIChieXRlKSAtODcKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDMwNTYsIDMwNzMsIChieXRlKSAzMyApOyAvLyBGaWxsIDE3IG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMzA3MywgMzA3NiwgKGJ5dGUpIC04NyApOyAvLyBGaWxsIDMgb2YgdmFsdWUgKGJ5dGUpIC04NworICAgICAgICBDSEFSU1szMDc2XSA9IDMzOworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMzA3NywgMzA4NSwgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDggb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBDSEFSU1szMDg1XSA9IDMzOworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMzA4NiwgMzA4OSwgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDMgb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBDSEFSU1szMDg5XSA9IDMzOworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMzA5MCwgMzExMywgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDIzIG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQ0hBUlNbMzExM10gPSAzMzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDMxMTQsIDMxMjQsIChieXRlKSAtMTkgKTsgLy8gRmlsbCAxMCBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIENIQVJTWzMxMjRdID0gMzM7CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAzMTI1LCAzMTMwLCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgNSBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAzMTMwLCAzMTM0LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCA0IG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMzEzNCwgMzE0MSwgKGJ5dGUpIC04NyApOyAvLyBGaWxsIDcgb2YgdmFsdWUgKGJ5dGUpIC04NworICAgICAgICBDSEFSU1szMTQxXSA9IDMzOworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMzE0MiwgMzE0NSwgKGJ5dGUpIC04NyApOyAvLyBGaWxsIDMgb2YgdmFsdWUgKGJ5dGUpIC04NworICAgICAgICBDSEFSU1szMTQ1XSA9IDMzOworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMzE0NiwgMzE1MCwgKGJ5dGUpIC04NyApOyAvLyBGaWxsIDQgb2YgdmFsdWUgKGJ5dGUpIC04NworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMzE1MCwgMzE1NywgKGJ5dGUpIDMzICk7IC8vIEZpbGwgNyBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDMxNTcsIDMxNTksIChieXRlKSAtODcgKTsgLy8gRmlsbCAyIG9mIHZhbHVlIChieXRlKSAtODcKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDMxNTksIDMxNjgsIChieXRlKSAzMyApOyAvLyBGaWxsIDkgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAzMTY4LCAzMTcwLCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgMiBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAzMTcwLCAzMTc0LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCA0IG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMzE3NCwgMzE4NCwgKGJ5dGUpIC04NyApOyAvLyBGaWxsIDEwIG9mIHZhbHVlIChieXRlKSAtODcKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDMxODQsIDMyMDIsIChieXRlKSAzMyApOyAvLyBGaWxsIDE4IG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMzIwMiwgMzIwNCwgKGJ5dGUpIC04NyApOyAvLyBGaWxsIDIgb2YgdmFsdWUgKGJ5dGUpIC04NworICAgICAgICBDSEFSU1szMjA0XSA9IDMzOworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMzIwNSwgMzIxMywgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDggb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBDSEFSU1szMjEzXSA9IDMzOworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMzIxNCwgMzIxNywgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDMgb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBDSEFSU1szMjE3XSA9IDMzOworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMzIxOCwgMzI0MSwgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDIzIG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQ0hBUlNbMzI0MV0gPSAzMzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDMyNDIsIDMyNTIsIChieXRlKSAtMTkgKTsgLy8gRmlsbCAxMCBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIENIQVJTWzMyNTJdID0gMzM7CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAzMjUzLCAzMjU4LCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgNSBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAzMjU4LCAzMjYyLCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCA0IG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMzI2MiwgMzI2OSwgKGJ5dGUpIC04NyApOyAvLyBGaWxsIDcgb2YgdmFsdWUgKGJ5dGUpIC04NworICAgICAgICBDSEFSU1szMjY5XSA9IDMzOworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMzI3MCwgMzI3MywgKGJ5dGUpIC04NyApOyAvLyBGaWxsIDMgb2YgdmFsdWUgKGJ5dGUpIC04NworICAgICAgICBDSEFSU1szMjczXSA9IDMzOworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMzI3NCwgMzI3OCwgKGJ5dGUpIC04NyApOyAvLyBGaWxsIDQgb2YgdmFsdWUgKGJ5dGUpIC04NworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMzI3OCwgMzI4NSwgKGJ5dGUpIDMzICk7IC8vIEZpbGwgNyBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDMyODUsIDMyODcsIChieXRlKSAtODcgKTsgLy8gRmlsbCAyIG9mIHZhbHVlIChieXRlKSAtODcKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDMyODcsIDMyOTQsIChieXRlKSAzMyApOyAvLyBGaWxsIDcgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIENIQVJTWzMyOTRdID0gLTE5OworICAgICAgICBDSEFSU1szMjk1XSA9IDMzOworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMzI5NiwgMzI5OCwgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDIgb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMzI5OCwgMzMwMiwgKGJ5dGUpIDMzICk7IC8vIEZpbGwgNCBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDMzMDIsIDMzMTIsIChieXRlKSAtODcgKTsgLy8gRmlsbCAxMCBvZiB2YWx1ZSAoYnl0ZSkgLTg3CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAzMzEyLCAzMzMwLCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCAxOCBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDMzMzAsIDMzMzIsIChieXRlKSAtODcgKTsgLy8gRmlsbCAyIG9mIHZhbHVlIChieXRlKSAtODcKKyAgICAgICAgQ0hBUlNbMzMzMl0gPSAzMzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDMzMzMsIDMzNDEsIChieXRlKSAtMTkgKTsgLy8gRmlsbCA4IG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQ0hBUlNbMzM0MV0gPSAzMzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDMzNDIsIDMzNDUsIChieXRlKSAtMTkgKTsgLy8gRmlsbCAzIG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQ0hBUlNbMzM0NV0gPSAzMzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDMzNDYsIDMzNjksIChieXRlKSAtMTkgKTsgLy8gRmlsbCAyMyBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIENIQVJTWzMzNjldID0gMzM7CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAzMzcwLCAzMzg2LCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgMTYgb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMzM4NiwgMzM5MCwgKGJ5dGUpIDMzICk7IC8vIEZpbGwgNCBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDMzOTAsIDMzOTYsIChieXRlKSAtODcgKTsgLy8gRmlsbCA2IG9mIHZhbHVlIChieXRlKSAtODcKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDMzOTYsIDMzOTgsIChieXRlKSAzMyApOyAvLyBGaWxsIDIgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAzMzk4LCAzNDAxLCAoYnl0ZSkgLTg3ICk7IC8vIEZpbGwgMyBvZiB2YWx1ZSAoYnl0ZSkgLTg3CisgICAgICAgIENIQVJTWzM0MDFdID0gMzM7CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAzNDAyLCAzNDA2LCAoYnl0ZSkgLTg3ICk7IC8vIEZpbGwgNCBvZiB2YWx1ZSAoYnl0ZSkgLTg3CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAzNDA2LCAzNDE1LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCA5IG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBDSEFSU1szNDE1XSA9IC04NzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDM0MTYsIDM0MjQsIChieXRlKSAzMyApOyAvLyBGaWxsIDggb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAzNDI0LCAzNDI2LCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgMiBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAzNDI2LCAzNDMwLCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCA0IG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMzQzMCwgMzQ0MCwgKGJ5dGUpIC04NyApOyAvLyBGaWxsIDEwIG9mIHZhbHVlIChieXRlKSAtODcKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDM0NDAsIDM1ODUsIChieXRlKSAzMyApOyAvLyBGaWxsIDE0NSBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDM1ODUsIDM2MzEsIChieXRlKSAtMTkgKTsgLy8gRmlsbCA0NiBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIENIQVJTWzM2MzFdID0gMzM7CisgICAgICAgIENIQVJTWzM2MzJdID0gLTE5OworICAgICAgICBDSEFSU1szNjMzXSA9IC04NzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDM2MzQsIDM2MzYsIChieXRlKSAtMTkgKTsgLy8gRmlsbCAyIG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDM2MzYsIDM2NDMsIChieXRlKSAtODcgKTsgLy8gRmlsbCA3IG9mIHZhbHVlIChieXRlKSAtODcKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDM2NDMsIDM2NDgsIChieXRlKSAzMyApOyAvLyBGaWxsIDUgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAzNjQ4LCAzNjU0LCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgNiBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAzNjU0LCAzNjYzLCAoYnl0ZSkgLTg3ICk7IC8vIEZpbGwgOSBvZiB2YWx1ZSAoYnl0ZSkgLTg3CisgICAgICAgIENIQVJTWzM2NjNdID0gMzM7CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAzNjY0LCAzNjc0LCAoYnl0ZSkgLTg3ICk7IC8vIEZpbGwgMTAgb2YgdmFsdWUgKGJ5dGUpIC04NworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMzY3NCwgMzcxMywgKGJ5dGUpIDMzICk7IC8vIEZpbGwgMzkgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAzNzEzLCAzNzE1LCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgMiBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIENIQVJTWzM3MTVdID0gMzM7CisgICAgICAgIENIQVJTWzM3MTZdID0gLTE5OworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMzcxNywgMzcxOSwgKGJ5dGUpIDMzICk7IC8vIEZpbGwgMiBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDM3MTksIDM3MjEsIChieXRlKSAtMTkgKTsgLy8gRmlsbCAyIG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQ0hBUlNbMzcyMV0gPSAzMzsKKyAgICAgICAgQ0hBUlNbMzcyMl0gPSAtMTk7CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAzNzIzLCAzNzI1LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCAyIG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBDSEFSU1szNzI1XSA9IC0xOTsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDM3MjYsIDM3MzIsIChieXRlKSAzMyApOyAvLyBGaWxsIDYgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAzNzMyLCAzNzM2LCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgNCBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIENIQVJTWzM3MzZdID0gMzM7CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAzNzM3LCAzNzQ0LCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgNyBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIENIQVJTWzM3NDRdID0gMzM7CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAzNzQ1LCAzNzQ4LCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgMyBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIENIQVJTWzM3NDhdID0gMzM7CisgICAgICAgIENIQVJTWzM3NDldID0gLTE5OworICAgICAgICBDSEFSU1szNzUwXSA9IDMzOworICAgICAgICBDSEFSU1szNzUxXSA9IC0xOTsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDM3NTIsIDM3NTQsIChieXRlKSAzMyApOyAvLyBGaWxsIDIgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAzNzU0LCAzNzU2LCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgMiBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIENIQVJTWzM3NTZdID0gMzM7CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAzNzU3LCAzNzU5LCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgMiBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIENIQVJTWzM3NTldID0gMzM7CisgICAgICAgIENIQVJTWzM3NjBdID0gLTE5OworICAgICAgICBDSEFSU1szNzYxXSA9IC04NzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDM3NjIsIDM3NjQsIChieXRlKSAtMTkgKTsgLy8gRmlsbCAyIG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDM3NjQsIDM3NzAsIChieXRlKSAtODcgKTsgLy8gRmlsbCA2IG9mIHZhbHVlIChieXRlKSAtODcKKyAgICAgICAgQ0hBUlNbMzc3MF0gPSAzMzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDM3NzEsIDM3NzMsIChieXRlKSAtODcgKTsgLy8gRmlsbCAyIG9mIHZhbHVlIChieXRlKSAtODcKKyAgICAgICAgQ0hBUlNbMzc3M10gPSAtMTk7CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAzNzc0LCAzNzc2LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCAyIG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMzc3NiwgMzc4MSwgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDUgb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBDSEFSU1szNzgxXSA9IDMzOworICAgICAgICBDSEFSU1szNzgyXSA9IC04NzsKKyAgICAgICAgQ0hBUlNbMzc4M10gPSAzMzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDM3ODQsIDM3OTAsIChieXRlKSAtODcgKTsgLy8gRmlsbCA2IG9mIHZhbHVlIChieXRlKSAtODcKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDM3OTAsIDM3OTIsIChieXRlKSAzMyApOyAvLyBGaWxsIDIgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAzNzkyLCAzODAyLCAoYnl0ZSkgLTg3ICk7IC8vIEZpbGwgMTAgb2YgdmFsdWUgKGJ5dGUpIC04NworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMzgwMiwgMzg2NCwgKGJ5dGUpIDMzICk7IC8vIEZpbGwgNjIgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAzODY0LCAzODY2LCAoYnl0ZSkgLTg3ICk7IC8vIEZpbGwgMiBvZiB2YWx1ZSAoYnl0ZSkgLTg3CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAzODY2LCAzODcyLCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCA2IG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMzg3MiwgMzg4MiwgKGJ5dGUpIC04NyApOyAvLyBGaWxsIDEwIG9mIHZhbHVlIChieXRlKSAtODcKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDM4ODIsIDM4OTMsIChieXRlKSAzMyApOyAvLyBGaWxsIDExIG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBDSEFSU1szODkzXSA9IC04NzsKKyAgICAgICAgQ0hBUlNbMzg5NF0gPSAzMzsKKyAgICAgICAgQ0hBUlNbMzg5NV0gPSAtODc7CisgICAgICAgIENIQVJTWzM4OTZdID0gMzM7CisgICAgICAgIENIQVJTWzM4OTddID0gLTg3OworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMzg5OCwgMzkwMiwgKGJ5dGUpIDMzICk7IC8vIEZpbGwgNCBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDM5MDIsIDM5MDQsIChieXRlKSAtODcgKTsgLy8gRmlsbCAyIG9mIHZhbHVlIChieXRlKSAtODcKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDM5MDQsIDM5MTIsIChieXRlKSAtMTkgKTsgLy8gRmlsbCA4IG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQ0hBUlNbMzkxMl0gPSAzMzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDM5MTMsIDM5NDYsIChieXRlKSAtMTkgKTsgLy8gRmlsbCAzMyBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAzOTQ2LCAzOTUzLCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCA3IG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMzk1MywgMzk3MywgKGJ5dGUpIC04NyApOyAvLyBGaWxsIDIwIG9mIHZhbHVlIChieXRlKSAtODcKKyAgICAgICAgQ0hBUlNbMzk3M10gPSAzMzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDM5NzQsIDM5ODAsIChieXRlKSAtODcgKTsgLy8gRmlsbCA2IG9mIHZhbHVlIChieXRlKSAtODcKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDM5ODAsIDM5ODQsIChieXRlKSAzMyApOyAvLyBGaWxsIDQgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAzOTg0LCAzOTkwLCAoYnl0ZSkgLTg3ICk7IC8vIEZpbGwgNiBvZiB2YWx1ZSAoYnl0ZSkgLTg3CisgICAgICAgIENIQVJTWzM5OTBdID0gMzM7CisgICAgICAgIENIQVJTWzM5OTFdID0gLTg3OworICAgICAgICBDSEFSU1szOTkyXSA9IDMzOworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMzk5MywgNDAxNCwgKGJ5dGUpIC04NyApOyAvLyBGaWxsIDIxIG9mIHZhbHVlIChieXRlKSAtODcKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDQwMTQsIDQwMTcsIChieXRlKSAzMyApOyAvLyBGaWxsIDMgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCA0MDE3LCA0MDI0LCAoYnl0ZSkgLTg3ICk7IC8vIEZpbGwgNyBvZiB2YWx1ZSAoYnl0ZSkgLTg3CisgICAgICAgIENIQVJTWzQwMjRdID0gMzM7CisgICAgICAgIENIQVJTWzQwMjVdID0gLTg3OworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgNDAyNiwgNDI1NiwgKGJ5dGUpIDMzICk7IC8vIEZpbGwgMjMwIG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgNDI1NiwgNDI5NCwgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDM4IG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDQyOTQsIDQzMDQsIChieXRlKSAzMyApOyAvLyBGaWxsIDEwIG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgNDMwNCwgNDM0MywgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDM5IG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDQzNDMsIDQzNTIsIChieXRlKSAzMyApOyAvLyBGaWxsIDkgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIENIQVJTWzQzNTJdID0gLTE5OworICAgICAgICBDSEFSU1s0MzUzXSA9IDMzOworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgNDM1NCwgNDM1NiwgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDIgb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBDSEFSU1s0MzU2XSA9IDMzOworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgNDM1NywgNDM2MCwgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDMgb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBDSEFSU1s0MzYwXSA9IDMzOworICAgICAgICBDSEFSU1s0MzYxXSA9IC0xOTsKKyAgICAgICAgQ0hBUlNbNDM2Ml0gPSAzMzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDQzNjMsIDQzNjUsIChieXRlKSAtMTkgKTsgLy8gRmlsbCAyIG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQ0hBUlNbNDM2NV0gPSAzMzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDQzNjYsIDQzNzEsIChieXRlKSAtMTkgKTsgLy8gRmlsbCA1IG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDQzNzEsIDQ0MTIsIChieXRlKSAzMyApOyAvLyBGaWxsIDQxIG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBDSEFSU1s0NDEyXSA9IC0xOTsKKyAgICAgICAgQ0hBUlNbNDQxM10gPSAzMzsKKyAgICAgICAgQ0hBUlNbNDQxNF0gPSAtMTk7CisgICAgICAgIENIQVJTWzQ0MTVdID0gMzM7CisgICAgICAgIENIQVJTWzQ0MTZdID0gLTE5OworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgNDQxNywgNDQyOCwgKGJ5dGUpIDMzICk7IC8vIEZpbGwgMTEgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIENIQVJTWzQ0MjhdID0gLTE5OworICAgICAgICBDSEFSU1s0NDI5XSA9IDMzOworICAgICAgICBDSEFSU1s0NDMwXSA9IC0xOTsKKyAgICAgICAgQ0hBUlNbNDQzMV0gPSAzMzsKKyAgICAgICAgQ0hBUlNbNDQzMl0gPSAtMTk7CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCA0NDMzLCA0NDM2LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCAzIG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgNDQzNiwgNDQzOCwgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDIgb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgNDQzOCwgNDQ0MSwgKGJ5dGUpIDMzICk7IC8vIEZpbGwgMyBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQ0hBUlNbNDQ0MV0gPSAtMTk7CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCA0NDQyLCA0NDQ3LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCA1IG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgNDQ0NywgNDQ1MCwgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDMgb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBDSEFSU1s0NDUwXSA9IDMzOworICAgICAgICBDSEFSU1s0NDUxXSA9IC0xOTsKKyAgICAgICAgQ0hBUlNbNDQ1Ml0gPSAzMzsKKyAgICAgICAgQ0hBUlNbNDQ1M10gPSAtMTk7CisgICAgICAgIENIQVJTWzQ0NTRdID0gMzM7CisgICAgICAgIENIQVJTWzQ0NTVdID0gLTE5OworICAgICAgICBDSEFSU1s0NDU2XSA9IDMzOworICAgICAgICBDSEFSU1s0NDU3XSA9IC0xOTsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDQ0NTgsIDQ0NjEsIChieXRlKSAzMyApOyAvLyBGaWxsIDMgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCA0NDYxLCA0NDYzLCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgMiBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCA0NDYzLCA0NDY2LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCAzIG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgNDQ2NiwgNDQ2OCwgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDIgb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBDSEFSU1s0NDY4XSA9IDMzOworICAgICAgICBDSEFSU1s0NDY5XSA9IC0xOTsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDQ0NzAsIDQ1MTAsIChieXRlKSAzMyApOyAvLyBGaWxsIDQwIG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBDSEFSU1s0NTEwXSA9IC0xOTsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDQ1MTEsIDQ1MjAsIChieXRlKSAzMyApOyAvLyBGaWxsIDkgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIENIQVJTWzQ1MjBdID0gLTE5OworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgNDUyMSwgNDUyMywgKGJ5dGUpIDMzICk7IC8vIEZpbGwgMiBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQ0hBUlNbNDUyM10gPSAtMTk7CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCA0NTI0LCA0NTI2LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCAyIG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgNDUyNiwgNDUyOCwgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDIgb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgNDUyOCwgNDUzNSwgKGJ5dGUpIDMzICk7IC8vIEZpbGwgNyBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDQ1MzUsIDQ1MzcsIChieXRlKSAtMTkgKTsgLy8gRmlsbCAyIG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQ0hBUlNbNDUzN10gPSAzMzsKKyAgICAgICAgQ0hBUlNbNDUzOF0gPSAtMTk7CisgICAgICAgIENIQVJTWzQ1MzldID0gMzM7CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCA0NTQwLCA0NTQ3LCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgNyBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCA0NTQ3LCA0NTg3LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCA0MCBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQ0hBUlNbNDU4N10gPSAtMTk7CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCA0NTg4LCA0NTkyLCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCA0IG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBDSEFSU1s0NTkyXSA9IC0xOTsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDQ1OTMsIDQ2MDEsIChieXRlKSAzMyApOyAvLyBGaWxsIDggb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIENIQVJTWzQ2MDFdID0gLTE5OworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgNDYwMiwgNzY4MCwgKGJ5dGUpIDMzICk7IC8vIEZpbGwgMzA3OCBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDc2ODAsIDc4MzYsIChieXRlKSAtMTkgKTsgLy8gRmlsbCAxNTYgb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgNzgzNiwgNzg0MCwgKGJ5dGUpIDMzICk7IC8vIEZpbGwgNCBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDc4NDAsIDc5MzAsIChieXRlKSAtMTkgKTsgLy8gRmlsbCA5MCBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCA3OTMwLCA3OTM2LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCA2IG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgNzkzNiwgNzk1OCwgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDIyIG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDc5NTgsIDc5NjAsIChieXRlKSAzMyApOyAvLyBGaWxsIDIgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCA3OTYwLCA3OTY2LCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgNiBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCA3OTY2LCA3OTY4LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCAyIG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgNzk2OCwgODAwNiwgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDM4IG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDgwMDYsIDgwMDgsIChieXRlKSAzMyApOyAvLyBGaWxsIDIgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCA4MDA4LCA4MDE0LCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgNiBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCA4MDE0LCA4MDE2LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCAyIG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgODAxNiwgODAyNCwgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDggb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBDSEFSU1s4MDI0XSA9IDMzOworICAgICAgICBDSEFSU1s4MDI1XSA9IC0xOTsKKyAgICAgICAgQ0hBUlNbODAyNl0gPSAzMzsKKyAgICAgICAgQ0hBUlNbODAyN10gPSAtMTk7CisgICAgICAgIENIQVJTWzgwMjhdID0gMzM7CisgICAgICAgIENIQVJTWzgwMjldID0gLTE5OworICAgICAgICBDSEFSU1s4MDMwXSA9IDMzOworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgODAzMSwgODA2MiwgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDMxIG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDgwNjIsIDgwNjQsIChieXRlKSAzMyApOyAvLyBGaWxsIDIgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCA4MDY0LCA4MTE3LCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgNTMgb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBDSEFSU1s4MTE3XSA9IDMzOworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgODExOCwgODEyNSwgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDcgb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBDSEFSU1s4MTI1XSA9IDMzOworICAgICAgICBDSEFSU1s4MTI2XSA9IC0xOTsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDgxMjcsIDgxMzAsIChieXRlKSAzMyApOyAvLyBGaWxsIDMgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCA4MTMwLCA4MTMzLCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgMyBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIENIQVJTWzgxMzNdID0gMzM7CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCA4MTM0LCA4MTQxLCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgNyBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCA4MTQxLCA4MTQ0LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCAzIG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgODE0NCwgODE0OCwgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDQgb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgODE0OCwgODE1MCwgKGJ5dGUpIDMzICk7IC8vIEZpbGwgMiBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDgxNTAsIDgxNTYsIChieXRlKSAtMTkgKTsgLy8gRmlsbCA2IG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDgxNTYsIDgxNjAsIChieXRlKSAzMyApOyAvLyBGaWxsIDQgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCA4MTYwLCA4MTczLCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgMTMgb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgODE3MywgODE3OCwgKGJ5dGUpIDMzICk7IC8vIEZpbGwgNSBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDgxNzgsIDgxODEsIChieXRlKSAtMTkgKTsgLy8gRmlsbCAzIG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQ0hBUlNbODE4MV0gPSAzMzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDgxODIsIDgxODksIChieXRlKSAtMTkgKTsgLy8gRmlsbCA3IG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDgxODksIDg0MDAsIChieXRlKSAzMyApOyAvLyBGaWxsIDIxMSBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDg0MDAsIDg0MTMsIChieXRlKSAtODcgKTsgLy8gRmlsbCAxMyBvZiB2YWx1ZSAoYnl0ZSkgLTg3CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCA4NDEzLCA4NDE3LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCA0IG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBDSEFSU1s4NDE3XSA9IC04NzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDg0MTgsIDg0ODYsIChieXRlKSAzMyApOyAvLyBGaWxsIDY4IG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBDSEFSU1s4NDg2XSA9IC0xOTsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDg0ODcsIDg0OTAsIChieXRlKSAzMyApOyAvLyBGaWxsIDMgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCA4NDkwLCA4NDkyLCAoYnl0ZSkgLTE5ICk7IC8vIEZpbGwgMiBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCA4NDkyLCA4NDk0LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCAyIG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBDSEFSU1s4NDk0XSA9IC0xOTsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDg0OTUsIDg1NzYsIChieXRlKSAzMyApOyAvLyBGaWxsIDgxIG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgODU3NiwgODU3OSwgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDMgb2YgdmFsdWUgKGJ5dGUpIC0xOQorICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgODU3OSwgMTIyOTMsIChieXRlKSAzMyApOyAvLyBGaWxsIDM3MTQgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIENIQVJTWzEyMjkzXSA9IC04NzsKKyAgICAgICAgQ0hBUlNbMTIyOTRdID0gMzM7CisgICAgICAgIENIQVJTWzEyMjk1XSA9IC0xOTsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDEyMjk2LCAxMjMyMSwgKGJ5dGUpIDMzICk7IC8vIEZpbGwgMjUgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAxMjMyMSwgMTIzMzAsIChieXRlKSAtMTkgKTsgLy8gRmlsbCA5IG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDEyMzMwLCAxMjMzNiwgKGJ5dGUpIC04NyApOyAvLyBGaWxsIDYgb2YgdmFsdWUgKGJ5dGUpIC04NworICAgICAgICBDSEFSU1sxMjMzNl0gPSAzMzsKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDEyMzM3LCAxMjM0MiwgKGJ5dGUpIC04NyApOyAvLyBGaWxsIDUgb2YgdmFsdWUgKGJ5dGUpIC04NworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMTIzNDIsIDEyMzUzLCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCAxMSBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDEyMzUzLCAxMjQzNywgKGJ5dGUpIC0xOSApOyAvLyBGaWxsIDg0IG9mIHZhbHVlIChieXRlKSAtMTkKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDEyNDM3LCAxMjQ0MSwgKGJ5dGUpIDMzICk7IC8vIEZpbGwgNCBvZiB2YWx1ZSAoYnl0ZSkgMzMKKyAgICAgICAgQXJyYXlzLmZpbGwoQ0hBUlMsIDEyNDQxLCAxMjQ0MywgKGJ5dGUpIC04NyApOyAvLyBGaWxsIDIgb2YgdmFsdWUgKGJ5dGUpIC04NworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMTI0NDMsIDEyNDQ1LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCAyIG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMTI0NDUsIDEyNDQ3LCAoYnl0ZSkgLTg3ICk7IC8vIEZpbGwgMiBvZiB2YWx1ZSAoYnl0ZSkgLTg3CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAxMjQ0NywgMTI0NDksIChieXRlKSAzMyApOyAvLyBGaWxsIDIgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAxMjQ0OSwgMTI1MzksIChieXRlKSAtMTkgKTsgLy8gRmlsbCA5MCBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIENIQVJTWzEyNTM5XSA9IDMzOworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgMTI1NDAsIDEyNTQzLCAoYnl0ZSkgLTg3ICk7IC8vIEZpbGwgMyBvZiB2YWx1ZSAoYnl0ZSkgLTg3CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAxMjU0MywgMTI1NDksIChieXRlKSAzMyApOyAvLyBGaWxsIDYgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAxMjU0OSwgMTI1ODksIChieXRlKSAtMTkgKTsgLy8gRmlsbCA0MCBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAxMjU4OSwgMTk5NjgsIChieXRlKSAzMyApOyAvLyBGaWxsIDczNzkgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCAxOTk2OCwgNDA4NzAsIChieXRlKSAtMTkgKTsgLy8gRmlsbCAyMDkwMiBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCA0MDg3MCwgNDQwMzIsIChieXRlKSAzMyApOyAvLyBGaWxsIDMxNjIgb2YgdmFsdWUgKGJ5dGUpIDMzCisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCA0NDAzMiwgNTUyMDQsIChieXRlKSAtMTkgKTsgLy8gRmlsbCAxMTE3MiBvZiB2YWx1ZSAoYnl0ZSkgLTE5CisgICAgICAgIEFycmF5cy5maWxsKENIQVJTLCA1NTIwNCwgNTUyOTYsIChieXRlKSAzMyApOyAvLyBGaWxsIDkyIG9mIHZhbHVlIChieXRlKSAzMworICAgICAgICBBcnJheXMuZmlsbChDSEFSUywgNTczNDQsIDY1NTM0LCAoYnl0ZSkgMzMgKTsgLy8gRmlsbCA4MTkwIG9mIHZhbHVlIChieXRlKSAzMworCisgICAgfSAvLyA8Y2xpbml0PigpCisKKyAgICAvLworICAgIC8vIFB1YmxpYyBzdGF0aWMgbWV0aG9kcworICAgIC8vCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgaXMgYSBzdXBwbGVtZW50YWwgY2hhcmFjdGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGMgVGhlIGNoYXJhY3RlciB0byBjaGVjay4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTdXBwbGVtZW50YWwoaW50IGMpIHsKKyAgICAgICAgcmV0dXJuIChjID49IDB4MTAwMDAgJiYgYyA8PSAweDEwRkZGRik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIHRoZSBzdXBwbGVtZW50YWwgY2hhcmFjdGVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuCisgICAgICogc3Vycm9nYXRlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBoIFRoZSBoaWdoIHN1cnJvZ2F0ZS4KKyAgICAgKiBAcGFyYW0gbCBUaGUgbG93IHN1cnJvZ2F0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCBzdXBwbGVtZW50YWwoY2hhciBoLCBjaGFyIGwpIHsKKyAgICAgICAgcmV0dXJuIChoIC0gMHhEODAwKSAqIDB4NDAwICsgKGwgLSAweERDMDApICsgMHgxMDAwMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBoaWdoIHN1cnJvZ2F0ZSBvZiBhIHN1cHBsZW1lbnRhbCBjaGFyYWN0ZXIKKyAgICAgKgorICAgICAqIEBwYXJhbSBjIFRoZSBzdXBwbGVtZW50YWwgY2hhcmFjdGVyIHRvICJzcGxpdCIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjaGFyIGhpZ2hTdXJyb2dhdGUoaW50IGMpIHsKKyAgICAgICAgcmV0dXJuIChjaGFyKSAoKChjIC0gMHgwMDAxMDAwMCkgPj4gMTApICsgMHhEODAwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBsb3cgc3Vycm9nYXRlIG9mIGEgc3VwcGxlbWVudGFsIGNoYXJhY3RlcgorICAgICAqCisgICAgICogQHBhcmFtIGMgVGhlIHN1cHBsZW1lbnRhbCBjaGFyYWN0ZXIgdG8gInNwbGl0Ii4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNoYXIgbG93U3Vycm9nYXRlKGludCBjKSB7CisgICAgICAgIHJldHVybiAoY2hhcikgKCgoYyAtIDB4MDAwMTAwMDApICYgMHgzRkYpICsgMHhEQzAwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIGNoYXJhY3RlciBpcyBhIGhpZ2ggc3Vycm9nYXRlCisgICAgICoKKyAgICAgKiBAcGFyYW0gYyBUaGUgY2hhcmFjdGVyIHRvIGNoZWNrLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0hpZ2hTdXJyb2dhdGUoaW50IGMpIHsKKyAgICAgICAgcmV0dXJuICgweEQ4MDAgPD0gYyAmJiBjIDw9IDB4REJGRik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBjaGFyYWN0ZXIgaXMgYSBsb3cgc3Vycm9nYXRlCisgICAgICoKKyAgICAgKiBAcGFyYW0gYyBUaGUgY2hhcmFjdGVyIHRvIGNoZWNrLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0xvd1N1cnJvZ2F0ZShpbnQgYykgeworICAgICAgICByZXR1cm4gKDB4REMwMCA8PSBjICYmIGMgPD0gMHhERkZGKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBpcyB2YWxpZC4gVGhpcyBtZXRob2QKKyAgICAgKiBhbHNvIGNoZWNrcyB0aGUgc3Vycm9nYXRlIGNoYXJhY3RlciByYW5nZSBmcm9tIDB4MTAwMDAgdG8gMHgxMEZGRkYuCisgICAgICogPHA+CisgICAgICogSWYgdGhlIHByb2dyYW0gY2hvb3NlcyB0byBhcHBseSB0aGUgbWFzayBkaXJlY3RseSB0byB0aGUKKyAgICAgKiA8Y29kZT5DSEFSUzwvY29kZT4gYXJyYXksIHRoZW4gdGhleSBhcmUgcmVzcG9uc2libGUgZm9yIGNoZWNraW5nCisgICAgICogdGhlIHN1cnJvZ2F0ZSBjaGFyYWN0ZXIgcmFuZ2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYyBUaGUgY2hhcmFjdGVyIHRvIGNoZWNrLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkKGludCBjKSB7CisgICAgICAgIHJldHVybiAoYyA8IDB4MTAwMDAgJiYgKENIQVJTW2NdICYgTUFTS19WQUxJRCkgIT0gMCkgfHwKKyAgICAgICAgICAgICAgICgweDEwMDAwIDw9IGMgJiYgYyA8PSAweDEwRkZGRik7CisgICAgfSAvLyBpc1ZhbGlkKGludCk6Ym9vbGVhbgorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIGlzIGludmFsaWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYyBUaGUgY2hhcmFjdGVyIHRvIGNoZWNrLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0ludmFsaWQoaW50IGMpIHsKKyAgICAgICAgcmV0dXJuICFpc1ZhbGlkKGMpOworICAgIH0gLy8gaXNJbnZhbGlkKGludCk6Ym9vbGVhbgorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIGNhbiBiZSBjb25zaWRlcmVkIGNvbnRlbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYyBUaGUgY2hhcmFjdGVyIHRvIGNoZWNrLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0NvbnRlbnQoaW50IGMpIHsKKyAgICAgICAgcmV0dXJuIChjIDwgMHgxMDAwMCAmJiAoQ0hBUlNbY10gJiBNQVNLX0NPTlRFTlQpICE9IDApIHx8CisgICAgICAgICAgICAgICAoMHgxMDAwMCA8PSBjICYmIGMgPD0gMHgxMEZGRkYpOworICAgIH0gLy8gaXNDb250ZW50KGludCk6Ym9vbGVhbgorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIGNhbiBiZSBjb25zaWRlcmVkIG1hcmt1cC4KKyAgICAgKiBNYXJrdXAgY2hhcmFjdGVycyBpbmNsdWRlICcmbHQ7JywgJyZhbXA7JywgYW5kICclJy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjIFRoZSBjaGFyYWN0ZXIgdG8gY2hlY2suCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzTWFya3VwKGludCBjKSB7CisgICAgICAgIHJldHVybiBjID09ICc8JyB8fCBjID09ICcmJyB8fCBjID09ICclJzsKKyAgICB9IC8vIGlzTWFya3VwKGludCk6Ym9vbGVhbgorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIGlzIGEgc3BhY2UgY2hhcmFjdGVyCisgICAgICogYXMgZGVmaW5lZCBieSBwcm9kdWN0aW9uIFszXSBpbiB0aGUgWE1MIDEuMCBzcGVjaWZpY2F0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGMgVGhlIGNoYXJhY3RlciB0byBjaGVjay4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTcGFjZShpbnQgYykgeworICAgICAgICByZXR1cm4gYyA8PSAweDIwICYmIChDSEFSU1tjXSAmIE1BU0tfU1BBQ0UpICE9IDA7CisgICAgfSAvLyBpc1NwYWNlKGludCk6Ym9vbGVhbgorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIGlzIGEgdmFsaWQgbmFtZSBzdGFydAorICAgICAqIGNoYXJhY3RlciBhcyBkZWZpbmVkIGJ5IHByb2R1Y3Rpb24gWzVdIGluIHRoZSBYTUwgMS4wCisgICAgICogc3BlY2lmaWNhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjIFRoZSBjaGFyYWN0ZXIgdG8gY2hlY2suCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzTmFtZVN0YXJ0KGludCBjKSB7CisgICAgICAgIHJldHVybiBjIDwgMHgxMDAwMCAmJiAoQ0hBUlNbY10gJiBNQVNLX05BTUVfU1RBUlQpICE9IDA7CisgICAgfSAvLyBpc05hbWVTdGFydChpbnQpOmJvb2xlYW4KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBpcyBhIHZhbGlkIG5hbWUKKyAgICAgKiBjaGFyYWN0ZXIgYXMgZGVmaW5lZCBieSBwcm9kdWN0aW9uIFs0XSBpbiB0aGUgWE1MIDEuMAorICAgICAqIHNwZWNpZmljYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYyBUaGUgY2hhcmFjdGVyIHRvIGNoZWNrLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc05hbWUoaW50IGMpIHsKKyAgICAgICAgcmV0dXJuIGMgPCAweDEwMDAwICYmIChDSEFSU1tjXSAmIE1BU0tfTkFNRSkgIT0gMDsKKyAgICB9IC8vIGlzTmFtZShpbnQpOmJvb2xlYW4KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBpcyBhIHZhbGlkIE5DTmFtZSBzdGFydAorICAgICAqIGNoYXJhY3RlciBhcyBkZWZpbmVkIGJ5IHByb2R1Y3Rpb24gWzRdIGluIE5hbWVzcGFjZXMgaW4gWE1MCisgICAgICogcmVjb21tZW5kYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYyBUaGUgY2hhcmFjdGVyIHRvIGNoZWNrLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc05DTmFtZVN0YXJ0KGludCBjKSB7CisgICAgICAgIHJldHVybiBjIDwgMHgxMDAwMCAmJiAoQ0hBUlNbY10gJiBNQVNLX05DTkFNRV9TVEFSVCkgIT0gMDsKKyAgICB9IC8vIGlzTkNOYW1lU3RhcnQoaW50KTpib29sZWFuCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgaXMgYSB2YWxpZCBOQ05hbWUKKyAgICAgKiBjaGFyYWN0ZXIgYXMgZGVmaW5lZCBieSBwcm9kdWN0aW9uIFs1XSBpbiBOYW1lc3BhY2VzIGluIFhNTAorICAgICAqIHJlY29tbWVuZGF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGMgVGhlIGNoYXJhY3RlciB0byBjaGVjay4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNOQ05hbWUoaW50IGMpIHsKKyAgICAgICAgcmV0dXJuIGMgPCAweDEwMDAwICYmIChDSEFSU1tjXSAmIE1BU0tfTkNOQU1FKSAhPSAwOworICAgIH0gLy8gaXNOQ05hbWUoaW50KTpib29sZWFuCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgaXMgYSB2YWxpZCBQdWJpZAorICAgICAqIGNoYXJhY3RlciBhcyBkZWZpbmVkIGJ5IHByb2R1Y3Rpb24gWzEzXSBpbiB0aGUgWE1MIDEuMAorICAgICAqIHNwZWNpZmljYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYyBUaGUgY2hhcmFjdGVyIHRvIGNoZWNrLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1B1YmlkKGludCBjKSB7CisgICAgICAgIHJldHVybiBjIDwgMHgxMDAwMCAmJiAoQ0hBUlNbY10gJiBNQVNLX1BVQklEKSAhPSAwOworICAgIH0gLy8gaXNQdWJpZChpbnQpOmJvb2xlYW4KKworICAgIC8qCisgICAgICogWzVdIE5hbWUgOjo9IChMZXR0ZXIgfCAnXycgfCAnOicpIChOYW1lQ2hhcikqCisgICAgICovCisgICAgLyoqCisgICAgICogQ2hlY2sgdG8gc2VlIGlmIGEgc3RyaW5nIGlzIGEgdmFsaWQgTmFtZSBhY2NvcmRpbmcgdG8gWzVdCisgICAgICogaW4gdGhlIFhNTCAxLjAgUmVjb21tZW5kYXRpb24KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIHN0cmluZyB0byBjaGVjaworICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBuYW1lIGlzIGEgdmFsaWQgTmFtZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkTmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICBpZiAobmFtZS5sZW5ndGgoKSA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBjaGFyIGNoID0gbmFtZS5jaGFyQXQoMCk7CisgICAgICAgIGlmKCBpc05hbWVTdGFydChjaCkgPT0gZmFsc2UpCisgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBuYW1lLmxlbmd0aCgpOyBpKysgKSB7CisgICAgICAgICAgIGNoID0gbmFtZS5jaGFyQXQoaSk7CisgICAgICAgICAgIGlmKCBpc05hbWUoIGNoICkgPT0gZmFsc2UgKXsKKyAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfSAvLyBpc1ZhbGlkTmFtZShTdHJpbmcpOmJvb2xlYW4KKyAgICAKKworICAgIC8qCisgICAgICogZnJvbSB0aGUgbmFtZXNwYWNlIHJlYworICAgICAqIFs0XSBOQ05hbWUgOjo9IChMZXR0ZXIgfCAnXycpIChOQ05hbWVDaGFyKSoKKyAgICAgKi8KKyAgICAvKioKKyAgICAgKiBDaGVjayB0byBzZWUgaWYgYSBzdHJpbmcgaXMgYSB2YWxpZCBOQ05hbWUgYWNjb3JkaW5nIHRvIFs0XQorICAgICAqIGZyb20gdGhlIFhNTCBOYW1lc3BhY2VzIDEuMCBSZWNvbW1lbmRhdGlvbgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgc3RyaW5nIHRvIGNoZWNrCisgICAgICogQHJldHVybiB0cnVlIGlmIG5hbWUgaXMgYSB2YWxpZCBOQ05hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZE5DTmFtZShTdHJpbmcgbmNOYW1lKSB7CisgICAgICAgIGlmIChuY05hbWUubGVuZ3RoKCkgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgY2hhciBjaCA9IG5jTmFtZS5jaGFyQXQoMCk7CisgICAgICAgIGlmKCBpc05DTmFtZVN0YXJ0KGNoKSA9PSBmYWxzZSkKKyAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IG5jTmFtZS5sZW5ndGgoKTsgaSsrICkgeworICAgICAgICAgICBjaCA9IG5jTmFtZS5jaGFyQXQoaSk7CisgICAgICAgICAgIGlmKCBpc05DTmFtZSggY2ggKSA9PSBmYWxzZSApeworICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IC8vIGlzVmFsaWROQ05hbWUoU3RyaW5nKTpib29sZWFuCisKKyAgICAvKgorICAgICAqIFs3XSBObXRva2VuIDo6PSAoTmFtZUNoYXIpKworICAgICAqLworICAgIC8qKgorICAgICAqIENoZWNrIHRvIHNlZSBpZiBhIHN0cmluZyBpcyBhIHZhbGlkIE5tdG9rZW4gYWNjb3JkaW5nIHRvIFs3XQorICAgICAqIGluIHRoZSBYTUwgMS4wIFJlY29tbWVuZGF0aW9uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbm10b2tlbiBzdHJpbmcgdG8gY2hlY2sKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgbm10b2tlbiBpcyBhIHZhbGlkIE5tdG9rZW4gCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRObXRva2VuKFN0cmluZyBubXRva2VuKSB7CisgICAgICAgIGlmIChubXRva2VuLmxlbmd0aCgpID09IDApCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm10b2tlbi5sZW5ndGgoKTsgaSsrICkgeworICAgICAgICAgICBjaGFyIGNoID0gbm10b2tlbi5jaGFyQXQoaSk7CisgICAgICAgICAgIGlmKCAgISBpc05hbWUoIGNoICkgKXsKKyAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfSAvLyBpc1ZhbGlkTmFtZShTdHJpbmcpOmJvb2xlYW4KKworCisKKworCisgICAgLy8gZW5jb2RpbmdzCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGVuY29kaW5nIG5hbWUgaXMgYSB2YWxpZCBJQU5BIGVuY29kaW5nLgorICAgICAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IHZlcmlmeSB0aGF0IHRoZXJlIGlzIGEgZGVjb2RlciBhdmFpbGFibGUKKyAgICAgKiBmb3IgdGhpcyBlbmNvZGluZywgb25seSB0aGF0IHRoZSBjaGFyYWN0ZXJzIGFyZSB2YWxpZCBmb3IgYW4KKyAgICAgKiBJQU5BIGVuY29kaW5nIG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaWFuYUVuY29kaW5nIFRoZSBJQU5BIGVuY29kaW5nIG5hbWUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRJQU5BRW5jb2RpbmcoU3RyaW5nIGlhbmFFbmNvZGluZykgeworICAgICAgICBpZiAoaWFuYUVuY29kaW5nICE9IG51bGwpIHsKKyAgICAgICAgICAgIGludCBsZW5ndGggPSBpYW5hRW5jb2RpbmcubGVuZ3RoKCk7CisgICAgICAgICAgICBpZiAobGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgIGNoYXIgYyA9IGlhbmFFbmNvZGluZy5jaGFyQXQoMCk7CisgICAgICAgICAgICAgICAgaWYgKChjID49ICdBJyAmJiBjIDw9ICdaJykgfHwgKGMgPj0gJ2EnICYmIGMgPD0gJ3onKSkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gaWFuYUVuY29kaW5nLmNoYXJBdChpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoYyA8ICdBJyB8fCBjID4gJ1onKSAmJiAoYyA8ICdhJyB8fCBjID4gJ3onKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjIDwgJzAnIHx8IGMgPiAnOScpICYmIGMgIT0gJy4nICYmIGMgIT0gJ18nICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyAhPSAnLScpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9IC8vIGlzVmFsaWRJQU5BRW5jb2RpbmcoU3RyaW5nKTpib29sZWFuCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGVuY29kaW5nIG5hbWUgaXMgYSB2YWxpZCBKYXZhIGVuY29kaW5nLgorICAgICAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IHZlcmlmeSB0aGF0IHRoZXJlIGlzIGEgZGVjb2RlciBhdmFpbGFibGUKKyAgICAgKiBmb3IgdGhpcyBlbmNvZGluZywgb25seSB0aGF0IHRoZSBjaGFyYWN0ZXJzIGFyZSB2YWxpZCBmb3IgYW4KKyAgICAgKiBKYXZhIGVuY29kaW5nIG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gamF2YUVuY29kaW5nIFRoZSBKYXZhIGVuY29kaW5nIG5hbWUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRKYXZhRW5jb2RpbmcoU3RyaW5nIGphdmFFbmNvZGluZykgeworICAgICAgICBpZiAoamF2YUVuY29kaW5nICE9IG51bGwpIHsKKyAgICAgICAgICAgIGludCBsZW5ndGggPSBqYXZhRW5jb2RpbmcubGVuZ3RoKCk7CisgICAgICAgICAgICBpZiAobGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhciBjID0gamF2YUVuY29kaW5nLmNoYXJBdChpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChjIDwgJ0EnIHx8IGMgPiAnWicpICYmIChjIDwgJ2EnIHx8IGMgPiAneicpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAoYyA8ICcwJyB8fCBjID4gJzknKSAmJiBjICE9ICcuJyAmJiBjICE9ICdfJyAmJgorICAgICAgICAgICAgICAgICAgICAgICAgYyAhPSAnLScpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfSAvLyBpc1ZhbGlkSUFOQUVuY29kaW5nKFN0cmluZyk6Ym9vbGVhbgorCisKK30gLy8gY2xhc3MgWE1MQ2hhcgpkaWZmIC0tZ2l0IGEvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3htbHBhcnNlci9YTUxFbmNvZGluZ0RldGVjdG9yLmphdmEgYi9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIveG1scGFyc2VyL1hNTEVuY29kaW5nRGV0ZWN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGYwNTBjCi0tLSAvZGV2L251bGwKKysrIGIvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3htbHBhcnNlci9YTUxFbmNvZGluZ0RldGVjdG9yLmphdmEKQEAgLTAsMCArMSwxNjI0IEBACisvKgorICogQ29weXJpZ2h0IDE5OTksMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQorICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCisgKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMTk5OSwgSW50ZXJuYXRpb25hbAorICogQnVzaW5lc3MgTWFjaGluZXMsIEluYy4sIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy4gIEZvciBtb3JlCisgKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKKyAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFzcGVyLnhtbHBhcnNlcjsKKworaW1wb3J0IGphdmEuaW8uRU9GRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUmVhZGVyOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLmphci5KYXJGaWxlOworCitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIuSmFzcGVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuamFzcGVyLkpzcENvbXBpbGF0aW9uQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmphc3Blci5jb21waWxlci5FcnJvckRpc3BhdGNoZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5qYXNwZXIuY29tcGlsZXIuSnNwVXRpbDsKKworcHVibGljIGNsYXNzIFhNTEVuY29kaW5nRGV0ZWN0b3IgeworICAgIAorICAgIHByaXZhdGUgSW5wdXRTdHJlYW0gc3RyZWFtOworICAgIHByaXZhdGUgU3RyaW5nIGVuY29kaW5nOworICAgIHByaXZhdGUgYm9vbGVhbiBpc0VuY29kaW5nU2V0SW5Qcm9sb2c7CisgICAgcHJpdmF0ZSBCb29sZWFuIGlzQmlnRW5kaWFuOworICAgIHByaXZhdGUgUmVhZGVyIHJlYWRlcjsKKyAgICAKKyAgICAvLyBvcmcuYXBhY2hlLnhlcmNlcy5pbXBsLlhNTEVudGl0eU1hbmFnZXIgZmllbGRzCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9CVUZGRVJfU0laRSA9IDIwNDg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9YTUxERUNMX0JVRkZFUl9TSVpFID0gNjQ7CisgICAgcHJpdmF0ZSBib29sZWFuIGZBbGxvd0phdmFFbmNvZGluZ3M7CisgICAgcHJpdmF0ZSBTeW1ib2xUYWJsZSBmU3ltYm9sVGFibGU7CisgICAgcHJpdmF0ZSBYTUxFbmNvZGluZ0RldGVjdG9yIGZDdXJyZW50RW50aXR5OworICAgIHByaXZhdGUgaW50IGZCdWZmZXJTaXplID0gREVGQVVMVF9CVUZGRVJfU0laRTsKKyAgICAKKyAgICAvLyBvcmcuYXBhY2hlLnhlcmNlcy5pbXBsLlhNTEVudGl0eU1hbmFnZXIuU2Nhbm5lZEVudGl0eSBmaWVsZHMKKyAgICBwcml2YXRlIGludCBsaW5lTnVtYmVyID0gMTsKKyAgICBwcml2YXRlIGludCBjb2x1bW5OdW1iZXIgPSAxOworICAgIHByaXZhdGUgYm9vbGVhbiBsaXRlcmFsOworICAgIHByaXZhdGUgY2hhcltdIGNoID0gbmV3IGNoYXJbREVGQVVMVF9CVUZGRVJfU0laRV07CisgICAgcHJpdmF0ZSBpbnQgcG9zaXRpb247CisgICAgcHJpdmF0ZSBpbnQgY291bnQ7CisgICAgcHJpdmF0ZSBib29sZWFuIG1heVJlYWRDaHVua3MgPSBmYWxzZTsKKyAgICAKKyAgICAvLyBvcmcuYXBhY2hlLnhlcmNlcy5pbXBsLlhNTFNjYW5uZXIgZmllbGRzCisgICAgcHJpdmF0ZSBYTUxTdHJpbmcgZlN0cmluZyA9IG5ldyBYTUxTdHJpbmcoKTsgICAgCisgICAgcHJpdmF0ZSBYTUxTdHJpbmdCdWZmZXIgZlN0cmluZ0J1ZmZlciA9IG5ldyBYTUxTdHJpbmdCdWZmZXIoKTsKKyAgICBwcml2YXRlIFhNTFN0cmluZ0J1ZmZlciBmU3RyaW5nQnVmZmVyMiA9IG5ldyBYTUxTdHJpbmdCdWZmZXIoKTsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgZlZlcnNpb25TeW1ib2wgPSAidmVyc2lvbiI7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIGZFbmNvZGluZ1N5bWJvbCA9ICJlbmNvZGluZyI7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIGZTdGFuZGFsb25lU3ltYm9sID0gInN0YW5kYWxvbmUiOworICAgIAorICAgIC8vIG9yZy5hcGFjaGUueGVyY2VzLmltcGwuWE1MRG9jdW1lbnRGcmFnbWVudFNjYW5uZXJJbXBsIGZpZWxkcworICAgIHByaXZhdGUgaW50IGZNYXJrdXBEZXB0aCA9IDA7CisgICAgcHJpdmF0ZSBTdHJpbmdbXSBmU3RyaW5ncyA9IG5ldyBTdHJpbmdbM107CisKKyAgICBwcml2YXRlIEVycm9yRGlzcGF0Y2hlciBlcnI7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvcgorICAgICAqLworICAgIHB1YmxpYyBYTUxFbmNvZGluZ0RldGVjdG9yKCkgeworICAgICAgICBmU3ltYm9sVGFibGUgPSBuZXcgU3ltYm9sVGFibGUoKTsKKyAgICAgICAgZkN1cnJlbnRFbnRpdHkgPSB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEF1dG9kZXRlY3RzIHRoZSBlbmNvZGluZyBvZiB0aGUgWE1MIGRvY3VtZW50IHN1cHBsaWVkIGJ5IHRoZSBnaXZlbgorICAgICAqIGlucHV0IHN0cmVhbS4KKyAgICAgKgorICAgICAqIEVuY29kaW5nIGF1dG9kZXRlY3Rpb24gaXMgZG9uZSBhY2NvcmRpbmcgdG8gdGhlIFhNTCAxLjAgc3BlY2lmaWNhdGlvbiwKKyAgICAgKiBBcHBlbmRpeCBGLjE6IERldGVjdGlvbiBXaXRob3V0IEV4dGVybmFsIEVuY29kaW5nIEluZm9ybWF0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBUd28tZWxlbWVudCBhcnJheSwgd2hlcmUgdGhlIGZpcnN0IGVsZW1lbnQgKG9mIHR5cGUKKyAgICAgKiBqYXZhLmxhbmcuU3RyaW5nKSBjb250YWlucyB0aGUgbmFtZSBvZiB0aGUgKGF1dG8pZGV0ZWN0ZWQgZW5jb2RpbmcsIGFuZAorICAgICAqIHRoZSBzZWNvbmQgZWxlbWVudCAob2YgdHlwZSBqYXZhLmxhbmcuQm9vbGVhbikgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIAorICAgICAqIGVuY29kaW5nIHdhcyBzcGVjaWZpZWQgdXNpbmcgdGhlICdlbmNvZGluZycgYXR0cmlidXRlIG9mIGFuIFhNTCBwcm9sb2cKKyAgICAgKiAoVFJVRSkgb3IgYXV0b2RldGVjdGVkIChGQUxTRSkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBPYmplY3RbXSBnZXRFbmNvZGluZyhTdHJpbmcgZm5hbWUsIEphckZpbGUgamFyRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpzcENvbXBpbGF0aW9uQ29udGV4dCBjdHh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3JEaXNwYXRjaGVyIGVycikKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBKYXNwZXJFeGNlcHRpb24KKyAgICB7CisgICAgICAgIElucHV0U3RyZWFtIGluU3RyZWFtID0gSnNwVXRpbC5nZXRJbnB1dFN0cmVhbShmbmFtZSwgamFyRmlsZSwgY3R4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7CisgICAgICAgIFhNTEVuY29kaW5nRGV0ZWN0b3IgZGV0ZWN0b3IgPSBuZXcgWE1MRW5jb2RpbmdEZXRlY3RvcigpOworICAgICAgICBPYmplY3RbXSByZXQgPSBkZXRlY3Rvci5nZXRFbmNvZGluZyhpblN0cmVhbSwgZXJyKTsKKyAgICAgICAgaW5TdHJlYW0uY2xvc2UoKTsKKworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHByaXZhdGUgT2JqZWN0W10gZ2V0RW5jb2RpbmcoSW5wdXRTdHJlYW0gaW4sIEVycm9yRGlzcGF0Y2hlciBlcnIpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgSmFzcGVyRXhjZXB0aW9uCisgICAgeworICAgICAgICB0aGlzLnN0cmVhbSA9IGluOworICAgICAgICB0aGlzLmVycj1lcnI7CisgICAgICAgIGNyZWF0ZUluaXRpYWxSZWFkZXIoKTsKKyAgICAgICAgc2NhblhNTERlY2woKTsKKwkKKyAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RbXSB7IHRoaXMuZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQm9vbGVhbih0aGlzLmlzRW5jb2RpbmdTZXRJblByb2xvZykgfTsKKyAgICB9CisgICAgCisgICAgLy8gc3R1YiBtZXRob2QKKyAgICB2b2lkIGVuZEVudGl0eSgpIHsKKyAgICB9CisgICAgCisgICAgLy8gQWRhcHRlZCBmcm9tOgorICAgIC8vIG9yZy5hcGFjaGUueGVyY2VzLmltcGwuWE1MRW50aXR5TWFuYWdlci5zdGFydEVudGl0eSgpCisgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUluaXRpYWxSZWFkZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEphc3BlckV4Y2VwdGlvbiB7CisKKwkvLyB3cmFwIHRoaXMgc3RyZWFtIGluIFJld2luZGFibGVJbnB1dFN0cmVhbQorCXN0cmVhbSA9IG5ldyBSZXdpbmRhYmxlSW5wdXRTdHJlYW0oc3RyZWFtKTsKKworCS8vIHBlcmZvcm0gYXV0by1kZXRlY3Qgb2YgZW5jb2RpbmcgaWYgbmVjZXNzYXJ5CisJaWYgKGVuY29kaW5nID09IG51bGwpIHsKKwkgICAgLy8gcmVhZCBmaXJzdCBmb3VyIGJ5dGVzIGFuZCBkZXRlcm1pbmUgZW5jb2RpbmcKKwkgICAgZmluYWwgYnl0ZVtdIGI0ID0gbmV3IGJ5dGVbNF07CisJICAgIGludCBjb3VudCA9IDA7CisJICAgIGZvciAoOyBjb3VudDw0OyBjb3VudCsrICkgeworCQliNFtjb3VudF0gPSAoYnl0ZSlzdHJlYW0ucmVhZCgpOworCSAgICB9CisJICAgIGlmIChjb3VudCA9PSA0KSB7CisJCU9iamVjdCBbXSBlbmNvZGluZ0Rlc2MgPSBnZXRFbmNvZGluZ05hbWUoYjQsIGNvdW50KTsKKwkJZW5jb2RpbmcgPSAoU3RyaW5nKShlbmNvZGluZ0Rlc2NbMF0pOworCQlpc0JpZ0VuZGlhbiA9IChCb29sZWFuKShlbmNvZGluZ0Rlc2NbMV0pOworCisJCXN0cmVhbS5yZXNldCgpOworCQkvLyBTcGVjaWFsIGNhc2UgVVRGLTggZmlsZXMgd2l0aCBCT00gY3JlYXRlZCBieSBNaWNyb3NvZnQKKwkJLy8gdG9vbHMuIEl0J3MgbW9yZSBlZmZpY2llbnQgdG8gY29uc3VtZSB0aGUgQk9NIHRoYW4gbWFrZQorCQkvLyB0aGUgcmVhZGVyIHBlcmZvcm0gZXh0cmEgY2hlY2tzLiAtQWMKKwkJaWYgKGNvdW50ID4gMiAmJiBlbmNvZGluZy5lcXVhbHMoIlVURi04IikpIHsKKwkJICAgIGludCBiMCA9IGI0WzBdICYgMHhGRjsKKwkJICAgIGludCBiMSA9IGI0WzFdICYgMHhGRjsKKwkJICAgIGludCBiMiA9IGI0WzJdICYgMHhGRjsKKwkJICAgIGlmIChiMCA9PSAweEVGICYmIGIxID09IDB4QkIgJiYgYjIgPT0gMHhCRikgeworCQkJLy8gaWdub3JlIGZpcnN0IHRocmVlIGJ5dGVzLi4uCisJCQlzdHJlYW0uc2tpcCgzKTsKKwkJICAgIH0KKwkJfQorCQlyZWFkZXIgPSBjcmVhdGVSZWFkZXIoc3RyZWFtLCBlbmNvZGluZywgaXNCaWdFbmRpYW4pOworCSAgICB9IGVsc2UgeworCQlyZWFkZXIgPSBjcmVhdGVSZWFkZXIoc3RyZWFtLCBlbmNvZGluZywgaXNCaWdFbmRpYW4pOworCSAgICB9CisJfQorICAgIH0KKworICAgIC8vIEFkYXB0ZWQgZnJvbToKKyAgICAvLyBvcmcuYXBhY2hlLnhlcmNlcy5pbXBsLlhNTEVudGl0eU1hbmFnZXIuY3JlYXRlUmVhZGVyCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIHJlYWRlciBjYXBhYmxlIG9mIHJlYWRpbmcgdGhlIGdpdmVuIGlucHV0IHN0cmVhbSBpbgorICAgICAqIHRoZSBzcGVjaWZpZWQgZW5jb2RpbmcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5wdXRTdHJlYW0gIFRoZSBpbnB1dCBzdHJlYW0uCisgICAgICogQHBhcmFtIGVuY29kaW5nICAgICBUaGUgZW5jb2RpbmcgbmFtZSB0aGF0IHRoZSBpbnB1dCBzdHJlYW0gaXMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIGVuY29kZWQgdXNpbmcuIElmIHRoZSB1c2VyIGhhcyBzcGVjaWZpZWQgdGhhdAorICAgICAqICAgICAgICAgICAgICAgICAgICAgSmF2YSBlbmNvZGluZyBuYW1lcyBhcmUgYWxsb3dlZCwgdGhlbiB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nIG5hbWUgbWF5IGJlIGEgSmF2YSBlbmNvZGluZyBuYW1lOworICAgICAqICAgICAgICAgICAgICAgICAgICAgb3RoZXJ3aXNlLCBpdCBpcyBhbiBpYW5hRW5jb2RpbmcgbmFtZS4KKyAgICAgKiBAcGFyYW0gaXNCaWdFbmRpYW4gICBGb3IgZW5jb2RpbmdzIChsaWtlIHVDUy00KSwgd2hvc2UgbmFtZXMgY2Fubm90CisgICAgICogICAgICAgICAgICAgICAgICAgICAgc3BlY2lmeSBhIGJ5dGUgb3JkZXIsIHRoaXMgdGVsbHMgd2hldGhlciB0aGUgb3JkZXIKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBpcyBiaWdFbmRpYW4uIG51bGwgbWVhbnMgdW5rbm93biBvciBub3QgcmVsZXZhbnQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgYSByZWFkZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBSZWFkZXIgY3JlYXRlUmVhZGVyKElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBTdHJpbmcgZW5jb2RpbmcsCisJCQkJQm9vbGVhbiBpc0JpZ0VuZGlhbikKKyAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEphc3BlckV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gbm9ybWFsaXplIGVuY29kaW5nIG5hbWUKKyAgICAgICAgaWYgKGVuY29kaW5nID09IG51bGwpIHsKKyAgICAgICAgICAgIGVuY29kaW5nID0gIlVURi04IjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRyeSB0byB1c2UgYW4gb3B0aW1pemVkIHJlYWRlcgorICAgICAgICBTdHJpbmcgRU5DT0RJTkcgPSBlbmNvZGluZy50b1VwcGVyQ2FzZShMb2NhbGUuRU5HTElTSCk7CisgICAgICAgIGlmIChFTkNPRElORy5lcXVhbHMoIlVURi04IikpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVVRGOFJlYWRlcihpbnB1dFN0cmVhbSwgZkJ1ZmZlclNpemUpOworICAgICAgICB9CisgICAgICAgIGlmIChFTkNPRElORy5lcXVhbHMoIlVTLUFTQ0lJIikpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQVNDSUlSZWFkZXIoaW5wdXRTdHJlYW0sIGZCdWZmZXJTaXplKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoRU5DT0RJTkcuZXF1YWxzKCJJU08tMTA2NDYtVUNTLTQiKSkgeworICAgICAgICAgICAgaWYgKGlzQmlnRW5kaWFuICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBib29sZWFuIGlzQkUgPSBpc0JpZ0VuZGlhbi5ib29sZWFuVmFsdWUoKTsKKyAgICAgICAgICAgICAgICBpZiAoaXNCRSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVDU1JlYWRlcihpbnB1dFN0cmVhbSwgVUNTUmVhZGVyLlVDUzRCRSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVQ1NSZWFkZXIoaW5wdXRTdHJlYW0sIFVDU1JlYWRlci5VQ1M0TEUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKCJqc3AuZXJyb3IueG1sLmVuY29kaW5nQnl0ZU9yZGVyVW5zdXBwb3J0ZWQiLAorCQkJICAgICBlbmNvZGluZyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKEVOQ09ESU5HLmVxdWFscygiSVNPLTEwNjQ2LVVDUy0yIikpIHsKKyAgICAgICAgICAgIGlmIChpc0JpZ0VuZGlhbiAhPSBudWxsKSB7IC8vIHNvdWxkIG5ldmVyIGhhcHBlbiB3aXRoIHRoaXMgZW5jb2RpbmcuLi4KKyAgICAgICAgICAgICAgICBib29sZWFuIGlzQkUgPSBpc0JpZ0VuZGlhbi5ib29sZWFuVmFsdWUoKTsKKyAgICAgICAgICAgICAgICBpZiAoaXNCRSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVDU1JlYWRlcihpbnB1dFN0cmVhbSwgVUNTUmVhZGVyLlVDUzJCRSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVQ1NSZWFkZXIoaW5wdXRTdHJlYW0sIFVDU1JlYWRlci5VQ1MyTEUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKCJqc3AuZXJyb3IueG1sLmVuY29kaW5nQnl0ZU9yZGVyVW5zdXBwb3J0ZWQiLAorCQkJICAgICBlbmNvZGluZyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBjaGVjayBmb3IgdmFsaWQgbmFtZQorICAgICAgICBib29sZWFuIHZhbGlkSUFOQSA9IFhNTENoYXIuaXNWYWxpZElBTkFFbmNvZGluZyhlbmNvZGluZyk7CisgICAgICAgIGJvb2xlYW4gdmFsaWRKYXZhID0gWE1MQ2hhci5pc1ZhbGlkSmF2YUVuY29kaW5nKGVuY29kaW5nKTsKKyAgICAgICAgaWYgKCF2YWxpZElBTkEgfHwgKGZBbGxvd0phdmFFbmNvZGluZ3MgJiYgIXZhbGlkSmF2YSkpIHsKKyAgICAgICAgICAgIGVyci5qc3BFcnJvcigianNwLmVycm9yLnhtbC5lbmNvZGluZ0RlY2xJbnZhbGlkIiwgZW5jb2RpbmcpOworICAgICAgICAgICAgLy8gTk9URTogQW5keUggc3VnZ2VzdGVkIHRoYXQsIG9uIGZhaWx1cmUsIHdlIHVzZSBJU08gTGF0aW4gMQorICAgICAgICAgICAgLy8gICAgICAgYmVjYXVzZSBldmVyeSBieXRlIGlzIGEgdmFsaWQgSVNPIExhdGluIDEgY2hhcmFjdGVyLgorICAgICAgICAgICAgLy8gICAgICAgSXQgbWF5IG5vdCB0cmFuc2xhdGUgY29ycmVjdGx5IGJ1dCBpZiB3ZSBmYWlsZWQgb24KKyAgICAgICAgICAgIC8vICAgICAgIHRoZSBlbmNvZGluZyBhbnl3YXksIHRoZW4gd2UncmUgZXhwZWN0aW5nIHRoZSBjb250ZW50CisgICAgICAgICAgICAvLyAgICAgICBvZiB0aGUgZG9jdW1lbnQgdG8gYmUgYmFkLiBUaGlzIHdpbGwganVzdCBwcmV2ZW50IGFuCisgICAgICAgICAgICAvLyAgICAgICBpbnZhbGlkIFVURi04IHNlcXVlbmNlIHRvIGJlIGRldGVjdGVkLiBUaGlzIGlzIG9ubHkKKyAgICAgICAgICAgIC8vICAgICAgIGltcG9ydGFudCB3aGVuIGNvbnRpbnVlLWFmdGVyLWZhdGFsLWVycm9yIGlzIHR1cm5lZAorICAgICAgICAgICAgLy8gICAgICAgb24uIC1BYworICAgICAgICAgICAgZW5jb2RpbmcgPSAiSVNPLTg4NTktMSI7CisgICAgICAgIH0KKworICAgICAgICAvLyB0cnkgdG8gdXNlIGEgSmF2YSByZWFkZXIKKyAgICAgICAgU3RyaW5nIGphdmFFbmNvZGluZyA9IEVuY29kaW5nTWFwLmdldElBTkEySmF2YU1hcHBpbmcoRU5DT0RJTkcpOworICAgICAgICBpZiAoamF2YUVuY29kaW5nID09IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChmQWxsb3dKYXZhRW5jb2RpbmdzKSB7CisJCWphdmFFbmNvZGluZyA9IGVuY29kaW5nOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBlcnIuanNwRXJyb3IoImpzcC5lcnJvci54bWwuZW5jb2RpbmdEZWNsSW52YWxpZCIsIGVuY29kaW5nKTsKKyAgICAgICAgICAgICAgICAvLyBzZWUgY29tbWVudCBhYm92ZS4KKyAgICAgICAgICAgICAgICBqYXZhRW5jb2RpbmcgPSAiSVNPODg1OV8xIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IElucHV0U3RyZWFtUmVhZGVyKGlucHV0U3RyZWFtLCBqYXZhRW5jb2RpbmcpOworCisgICAgfSAvLyBjcmVhdGVSZWFkZXIoSW5wdXRTdHJlYW0sU3RyaW5nLCBCb29sZWFuKTogUmVhZGVyCisKKyAgICAvLyBBZGFwdGVkIGZyb206CisgICAgLy8gb3JnLmFwYWNoZS54ZXJjZXMuaW1wbC5YTUxFbnRpdHlNYW5hZ2VyLmdldEVuY29kaW5nTmFtZQorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIElBTkEgZW5jb2RpbmcgbmFtZSB0aGF0IGlzIGF1dG8tZGV0ZWN0ZWQgZnJvbQorICAgICAqIHRoZSBieXRlcyBzcGVjaWZpZWQsIHdpdGggdGhlIGVuZGlhbi1uZXNzIG9mIHRoYXQgZW5jb2Rpbmcgd2hlcmUKKyAgICAgKiBhcHByb3ByaWF0ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiNCAgICBUaGUgZmlyc3QgZm91ciBieXRlcyBvZiB0aGUgaW5wdXQuCisgICAgICogQHBhcmFtIGNvdW50IFRoZSBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgcmVhZC4KKyAgICAgKiBAcmV0dXJuIGEgMi1lbGVtZW50IGFycmF5OiAgdGhlIGZpcnN0IGVsZW1lbnQsIGFuIElBTkEtZW5jb2Rpbmcgc3RyaW5nLAorICAgICAqICB0aGUgc2Vjb25kIGVsZW1lbnQgYSBCb29sZWFuIHdoaWNoIGlzIHRydWUgaWZmIHRoZSBkb2N1bWVudCBpcyBiaWcKKyAgICAgKiAgZW5kaWFuLCBmYWxzZSBpZiBpdCdzIGxpdHRsZS1lbmRpYW4sIGFuZCBudWxsIGlmIHRoZSBkaXN0aW5jdGlvbiBpc24ndAorICAgICAqICByZWxldmFudC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE9iamVjdFtdIGdldEVuY29kaW5nTmFtZShieXRlW10gYjQsIGludCBjb3VudCkgeworCisgICAgICAgIGlmIChjb3VudCA8IDIpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgT2JqZWN0W117IlVURi04IiwgbnVsbH07CisgICAgICAgIH0KKworICAgICAgICAvLyBVVEYtMTYsIHdpdGggQk9NCisgICAgICAgIGludCBiMCA9IGI0WzBdICYgMHhGRjsKKyAgICAgICAgaW50IGIxID0gYjRbMV0gJiAweEZGOworICAgICAgICBpZiAoYjAgPT0gMHhGRSAmJiBiMSA9PSAweEZGKSB7CisgICAgICAgICAgICAvLyBVVEYtMTYsIGJpZy1lbmRpYW4KKyAgICAgICAgICAgIHJldHVybiBuZXcgT2JqZWN0IFtdIHsiVVRGLTE2QkUiLCBuZXcgQm9vbGVhbih0cnVlKX07CisgICAgICAgIH0KKyAgICAgICAgaWYgKGIwID09IDB4RkYgJiYgYjEgPT0gMHhGRSkgeworICAgICAgICAgICAgLy8gVVRGLTE2LCBsaXR0bGUtZW5kaWFuCisgICAgICAgICAgICByZXR1cm4gbmV3IE9iamVjdCBbXSB7IlVURi0xNkxFIiwgbmV3IEJvb2xlYW4oZmFsc2UpfTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGRlZmF1bHQgdG8gVVRGLTggaWYgd2UgZG9uJ3QgaGF2ZSBlbm91Z2ggYnl0ZXMgdG8gbWFrZSBhCisgICAgICAgIC8vIGdvb2QgZGV0ZXJtaW5hdGlvbiBvZiB0aGUgZW5jb2RpbmcKKyAgICAgICAgaWYgKGNvdW50IDwgMykgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBPYmplY3QgW10geyJVVEYtOCIsIG51bGx9OworICAgICAgICB9CisKKyAgICAgICAgLy8gVVRGLTggd2l0aCBhIEJPTQorICAgICAgICBpbnQgYjIgPSBiNFsyXSAmIDB4RkY7CisgICAgICAgIGlmIChiMCA9PSAweEVGICYmIGIxID09IDB4QkIgJiYgYjIgPT0gMHhCRikgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBPYmplY3QgW10geyJVVEYtOCIsIG51bGx9OworICAgICAgICB9CisKKyAgICAgICAgLy8gZGVmYXVsdCB0byBVVEYtOCBpZiB3ZSBkb24ndCBoYXZlIGVub3VnaCBieXRlcyB0byBtYWtlIGEKKyAgICAgICAgLy8gZ29vZCBkZXRlcm1pbmF0aW9uIG9mIHRoZSBlbmNvZGluZworICAgICAgICBpZiAoY291bnQgPCA0KSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IE9iamVjdCBbXSB7IlVURi04IiwgbnVsbH07CisgICAgICAgIH0KKworICAgICAgICAvLyBvdGhlciBlbmNvZGluZ3MKKyAgICAgICAgaW50IGIzID0gYjRbM10gJiAweEZGOworICAgICAgICBpZiAoYjAgPT0gMHgwMCAmJiBiMSA9PSAweDAwICYmIGIyID09IDB4MDAgJiYgYjMgPT0gMHgzQykgeworICAgICAgICAgICAgLy8gVUNTLTQsIGJpZyBlbmRpYW4gKDEyMzQpCisgICAgICAgICAgICByZXR1cm4gbmV3IE9iamVjdCBbXSB7IklTTy0xMDY0Ni1VQ1MtNCIsIG5ldyBCb29sZWFuKHRydWUpfTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYjAgPT0gMHgzQyAmJiBiMSA9PSAweDAwICYmIGIyID09IDB4MDAgJiYgYjMgPT0gMHgwMCkgeworICAgICAgICAgICAgLy8gVUNTLTQsIGxpdHRsZSBlbmRpYW4gKDQzMjEpCisgICAgICAgICAgICByZXR1cm4gbmV3IE9iamVjdCBbXSB7IklTTy0xMDY0Ni1VQ1MtNCIsIG5ldyBCb29sZWFuKGZhbHNlKX07CisgICAgICAgIH0KKyAgICAgICAgaWYgKGIwID09IDB4MDAgJiYgYjEgPT0gMHgwMCAmJiBiMiA9PSAweDNDICYmIGIzID09IDB4MDApIHsKKyAgICAgICAgICAgIC8vIFVDUy00LCB1bnVzdWFsIG9jdGV0IG9yZGVyICgyMTQzKQorICAgICAgICAgICAgLy8gUkVWSVNJVDogV2hhdCBzaG91bGQgdGhpcyBiZT8KKyAgICAgICAgICAgIHJldHVybiBuZXcgT2JqZWN0IFtdIHsiSVNPLTEwNjQ2LVVDUy00IiwgbnVsbH07CisgICAgICAgIH0KKyAgICAgICAgaWYgKGIwID09IDB4MDAgJiYgYjEgPT0gMHgzQyAmJiBiMiA9PSAweDAwICYmIGIzID09IDB4MDApIHsKKyAgICAgICAgICAgIC8vIFVDUy00LCB1bnVzdWFsIG9jdGVjdCBvcmRlciAoMzQxMikKKyAgICAgICAgICAgIC8vIFJFVklTSVQ6IFdoYXQgc2hvdWxkIHRoaXMgYmU/CisgICAgICAgICAgICByZXR1cm4gbmV3IE9iamVjdCBbXSB7IklTTy0xMDY0Ni1VQ1MtNCIsIG51bGx9OworICAgICAgICB9CisgICAgICAgIGlmIChiMCA9PSAweDAwICYmIGIxID09IDB4M0MgJiYgYjIgPT0gMHgwMCAmJiBiMyA9PSAweDNGKSB7CisgICAgICAgICAgICAvLyBVVEYtMTYsIGJpZy1lbmRpYW4sIG5vIEJPTQorICAgICAgICAgICAgLy8gKG9yIGNvdWxkIHR1cm4gb3V0IHRvIGJlIFVDUy0yLi4uCisgICAgICAgICAgICAvLyBSRVZJU0lUOiBXaGF0IHNob3VsZCB0aGlzIGJlPworICAgICAgICAgICAgcmV0dXJuIG5ldyBPYmplY3QgW10geyJVVEYtMTZCRSIsIG5ldyBCb29sZWFuKHRydWUpfTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYjAgPT0gMHgzQyAmJiBiMSA9PSAweDAwICYmIGIyID09IDB4M0YgJiYgYjMgPT0gMHgwMCkgeworICAgICAgICAgICAgLy8gVVRGLTE2LCBsaXR0bGUtZW5kaWFuLCBubyBCT00KKyAgICAgICAgICAgIC8vIChvciBjb3VsZCB0dXJuIG91dCB0byBiZSBVQ1MtMi4uLgorICAgICAgICAgICAgcmV0dXJuIG5ldyBPYmplY3QgW10geyJVVEYtMTZMRSIsIG5ldyBCb29sZWFuKGZhbHNlKX07CisgICAgICAgIH0KKyAgICAgICAgaWYgKGIwID09IDB4NEMgJiYgYjEgPT0gMHg2RiAmJiBiMiA9PSAweEE3ICYmIGIzID09IDB4OTQpIHsKKyAgICAgICAgICAgIC8vIEVCQ0RJQworICAgICAgICAgICAgLy8gYSBsYSB4ZXJjZXMxLCByZXR1cm4gQ1AwMzcgaW5zdGVhZCBvZiBFQkNESUMgaGVyZQorICAgICAgICAgICAgcmV0dXJuIG5ldyBPYmplY3QgW10geyJDUDAzNyIsIG51bGx9OworICAgICAgICB9CisKKyAgICAgICAgLy8gZGVmYXVsdCBlbmNvZGluZworICAgICAgICByZXR1cm4gbmV3IE9iamVjdCBbXSB7IlVURi04IiwgbnVsbH07CisKKyAgICB9CisKKyAgICAvLyBBZGFwdGVkIGZyb206CisgICAgLy8gb3JnLmFwYWNoZS54ZXJjZXMuaW1wbC5YTUxFbnRpdHlNYW5hZ2VyLkVudGl0eVNjYW5uZXIuaXNFeHRlcm5hbAorICAgIC8qKiBSZXR1cm5zIHRydWUgaWYgdGhlIGN1cnJlbnQgZW50aXR5IGJlaW5nIHNjYW5uZWQgaXMgZXh0ZXJuYWwuICovCisgICAgcHVibGljIGJvb2xlYW4gaXNFeHRlcm5hbCgpIHsKKwlyZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBBZGFwdGVkIGZyb206CisgICAgLy8gb3JnLmFwYWNoZS54ZXJjZXMuaW1wbC5YTUxFbnRpdHlNYW5hZ2VyLkVudGl0eVNjYW5uZXIucGVla0NoYXIKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IGNoYXJhY3RlciBvbiB0aGUgaW5wdXQuCisgICAgICogPHA+CisgICAgICogPHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBUaGUgY2hhcmFjdGVyIGlzIDxlbT5ub3Q8L2VtPiBjb25zdW1lZC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gIFRocm93biBpZiBpL28gZXJyb3Igb2NjdXJzLgorICAgICAqIEB0aHJvd3MgRU9GRXhjZXB0aW9uIFRocm93biBvbiBlbmQgb2YgZmlsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHBlZWtDaGFyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkKKwkvLyBsb2FkIG1vcmUgY2hhcmFjdGVycywgaWYgbmVlZGVkCisJaWYgKGZDdXJyZW50RW50aXR5LnBvc2l0aW9uID09IGZDdXJyZW50RW50aXR5LmNvdW50KSB7CisJICAgIGxvYWQoMCwgdHJ1ZSk7CisJfQorCQorCS8vIHBlZWsgYXQgY2hhcmFjdGVyCisJaW50IGMgPSBmQ3VycmVudEVudGl0eS5jaFtmQ3VycmVudEVudGl0eS5wb3NpdGlvbl07CisKKwkvLyByZXR1cm4gcGVla2VkIGNoYXJhY3RlcgorCWlmIChmQ3VycmVudEVudGl0eS5pc0V4dGVybmFsKCkpIHsKKwkgICAgcmV0dXJuIGMgIT0gJ1xyJyA/IGMgOiAnXG4nOworCX0KKwllbHNlIHsKKwkgICAgcmV0dXJuIGM7CisJfQorCQorICAgIH0gLy8gcGVla0NoYXIoKTppbnQKKyAgICAKKyAgICAvLyBBZGFwdGVkIGZyb206CisgICAgLy8gb3JnLmFwYWNoZS54ZXJjZXMuaW1wbC5YTUxFbnRpdHlNYW5hZ2VyLkVudGl0eVNjYW5uZXIuc2NhbkNoYXIKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IGNoYXJhY3RlciBvbiB0aGUgaW5wdXQuCisgICAgICogPHA+CisgICAgICogPHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBUaGUgY2hhcmFjdGVyIGlzIGNvbnN1bWVkLgorICAgICAqCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiAgVGhyb3duIGlmIGkvbyBlcnJvciBvY2N1cnMuCisgICAgICogQHRocm93cyBFT0ZFeGNlcHRpb24gVGhyb3duIG9uIGVuZCBvZiBmaWxlLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgc2NhbkNoYXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisJLy8gbG9hZCBtb3JlIGNoYXJhY3RlcnMsIGlmIG5lZWRlZAorCWlmIChmQ3VycmVudEVudGl0eS5wb3NpdGlvbiA9PSBmQ3VycmVudEVudGl0eS5jb3VudCkgeworCSAgICBsb2FkKDAsIHRydWUpOworCX0KKworCS8vIHNjYW4gY2hhcmFjdGVyCisJaW50IGMgPSBmQ3VycmVudEVudGl0eS5jaFtmQ3VycmVudEVudGl0eS5wb3NpdGlvbisrXTsKKwlib29sZWFuIGV4dGVybmFsID0gZmFsc2U7CisJaWYgKGMgPT0gJ1xuJyB8fAorCSAgICAoYyA9PSAnXHInICYmIChleHRlcm5hbCA9IGZDdXJyZW50RW50aXR5LmlzRXh0ZXJuYWwoKSkpKSB7CisJICAgIGZDdXJyZW50RW50aXR5LmxpbmVOdW1iZXIrKzsKKwkgICAgZkN1cnJlbnRFbnRpdHkuY29sdW1uTnVtYmVyID0gMTsKKwkgICAgaWYgKGZDdXJyZW50RW50aXR5LnBvc2l0aW9uID09IGZDdXJyZW50RW50aXR5LmNvdW50KSB7CisJCWZDdXJyZW50RW50aXR5LmNoWzBdID0gKGNoYXIpYzsKKwkJbG9hZCgxLCBmYWxzZSk7CisJICAgIH0KKwkgICAgaWYgKGMgPT0gJ1xyJyAmJiBleHRlcm5hbCkgeworCQlpZiAoZkN1cnJlbnRFbnRpdHkuY2hbZkN1cnJlbnRFbnRpdHkucG9zaXRpb24rK10gIT0gJ1xuJykgeworCQkgICAgZkN1cnJlbnRFbnRpdHkucG9zaXRpb24tLTsKKwkJfQorCQljID0gJ1xuJzsKKwkgICAgfQorCX0KKworCS8vIHJldHVybiBjaGFyYWN0ZXIgdGhhdCB3YXMgc2Nhbm5lZAorCWZDdXJyZW50RW50aXR5LmNvbHVtbk51bWJlcisrOworCXJldHVybiBjOworCQorICAgIH0KKworICAgIC8vIEFkYXB0ZWQgZnJvbToKKyAgICAvLyBvcmcuYXBhY2hlLnhlcmNlcy5pbXBsLlhNTEVudGl0eU1hbmFnZXIuRW50aXR5U2Nhbm5lci5zY2FuTmFtZQorICAgIC8qKgorICAgICAqIFJldHVybnMgYSBzdHJpbmcgbWF0Y2hpbmcgdGhlIE5hbWUgcHJvZHVjdGlvbiBhcHBlYXJpbmcgaW1tZWRpYXRlbHkKKyAgICAgKiBvbiB0aGUgaW5wdXQgYXMgYSBzeW1ib2wsIG9yIG51bGwgaWYgbm8gTmFtZSBzdHJpbmcgaXMgcHJlc2VudC4KKyAgICAgKiA8cD4KKyAgICAgKiA8c3Ryb25nPk5vdGU6PC9zdHJvbmc+IFRoZSBOYW1lIGNoYXJhY3RlcnMgYXJlIGNvbnN1bWVkLgorICAgICAqIDxwPgorICAgICAqIDxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gVGhlIHN0cmluZyByZXR1cm5lZCBtdXN0IGJlIGEgc3ltYm9sLiBUaGUKKyAgICAgKiBTeW1ib2xUYWJsZSBjYW4gYmUgdXNlZCBmb3IgdGhpcyBwdXJwb3NlLgorICAgICAqCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiAgVGhyb3duIGlmIGkvbyBlcnJvciBvY2N1cnMuCisgICAgICogQHRocm93cyBFT0ZFeGNlcHRpb24gVGhyb3duIG9uIGVuZCBvZiBmaWxlLgorICAgICAqCisgICAgICogQHNlZSBTeW1ib2xUYWJsZQorICAgICAqIEBzZWUgWE1MQ2hhciNpc05hbWUKKyAgICAgKiBAc2VlIFhNTENoYXIjaXNOYW1lU3RhcnQKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHNjYW5OYW1lKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkKKwkvLyBsb2FkIG1vcmUgY2hhcmFjdGVycywgaWYgbmVlZGVkCisJaWYgKGZDdXJyZW50RW50aXR5LnBvc2l0aW9uID09IGZDdXJyZW50RW50aXR5LmNvdW50KSB7CisJICAgIGxvYWQoMCwgdHJ1ZSk7CisJfQorCQorCS8vIHNjYW4gbmFtZQorCWludCBvZmZzZXQgPSBmQ3VycmVudEVudGl0eS5wb3NpdGlvbjsKKwlpZiAoWE1MQ2hhci5pc05hbWVTdGFydChmQ3VycmVudEVudGl0eS5jaFtvZmZzZXRdKSkgeworCSAgICBpZiAoKytmQ3VycmVudEVudGl0eS5wb3NpdGlvbiA9PSBmQ3VycmVudEVudGl0eS5jb3VudCkgeworCQlmQ3VycmVudEVudGl0eS5jaFswXSA9IGZDdXJyZW50RW50aXR5LmNoW29mZnNldF07CisJCW9mZnNldCA9IDA7CisJCWlmIChsb2FkKDEsIGZhbHNlKSkgeworCQkgICAgZkN1cnJlbnRFbnRpdHkuY29sdW1uTnVtYmVyKys7CisJCSAgICBTdHJpbmcgc3ltYm9sID0gZlN5bWJvbFRhYmxlLmFkZFN5bWJvbChmQ3VycmVudEVudGl0eS5jaCwKKwkJCQkJCQkgICAwLCAxKTsKKwkJICAgIHJldHVybiBzeW1ib2w7CisJCX0KKwkgICAgfQorCSAgICB3aGlsZSAoWE1MQ2hhci5pc05hbWUoZkN1cnJlbnRFbnRpdHkuY2hbZkN1cnJlbnRFbnRpdHkucG9zaXRpb25dKSkgeworCQlpZiAoKytmQ3VycmVudEVudGl0eS5wb3NpdGlvbiA9PSBmQ3VycmVudEVudGl0eS5jb3VudCkgeworCQkgICAgaW50IGxlbmd0aCA9IGZDdXJyZW50RW50aXR5LnBvc2l0aW9uIC0gb2Zmc2V0OworCQkgICAgaWYgKGxlbmd0aCA9PSBmQnVmZmVyU2l6ZSkgeworCQkJLy8gYmFkIGx1Y2sgd2UgaGF2ZSB0byByZXNpemUgb3VyIGJ1ZmZlcgorCQkJY2hhcltdIHRtcCA9IG5ldyBjaGFyW2ZCdWZmZXJTaXplICogMl07CisJCQlTeXN0ZW0uYXJyYXljb3B5KGZDdXJyZW50RW50aXR5LmNoLCBvZmZzZXQsCisJCQkJCSB0bXAsIDAsIGxlbmd0aCk7CisJCQlmQ3VycmVudEVudGl0eS5jaCA9IHRtcDsKKwkJCWZCdWZmZXJTaXplICo9IDI7CisJCSAgICB9IGVsc2UgeworCQkJU3lzdGVtLmFycmF5Y29weShmQ3VycmVudEVudGl0eS5jaCwgb2Zmc2V0LAorCQkJCQkgZkN1cnJlbnRFbnRpdHkuY2gsIDAsIGxlbmd0aCk7CisJCSAgICB9CisJCSAgICBvZmZzZXQgPSAwOworCQkgICAgaWYgKGxvYWQobGVuZ3RoLCBmYWxzZSkpIHsKKwkJCWJyZWFrOworCQkgICAgfQorCQl9CisJICAgIH0KKwl9CisJaW50IGxlbmd0aCA9IGZDdXJyZW50RW50aXR5LnBvc2l0aW9uIC0gb2Zmc2V0OworCWZDdXJyZW50RW50aXR5LmNvbHVtbk51bWJlciArPSBsZW5ndGg7CisKKwkvLyByZXR1cm4gbmFtZQorCVN0cmluZyBzeW1ib2wgPSBudWxsOworCWlmIChsZW5ndGggPiAwKSB7CisJICAgIHN5bWJvbCA9IGZTeW1ib2xUYWJsZS5hZGRTeW1ib2woZkN1cnJlbnRFbnRpdHkuY2gsIG9mZnNldCwgbGVuZ3RoKTsKKwl9CisJcmV0dXJuIHN5bWJvbDsKKwkKKyAgICB9CisKKyAgICAvLyBBZGFwdGVkIGZyb206CisgICAgLy8gb3JnLmFwYWNoZS54ZXJjZXMuaW1wbC5YTUxFbnRpdHlNYW5hZ2VyLkVudGl0eVNjYW5uZXIuc2NhbkxpdGVyYWwKKyAgICAvKioKKyAgICAgKiBTY2FucyBhIHJhbmdlIG9mIGF0dHJpYnV0ZSB2YWx1ZSBkYXRhLCBzZXR0aW5nIHRoZSBmaWVsZHMgb2YgdGhlCisgICAgICogWE1MU3RyaW5nIHN0cnVjdHVyZSwgYXBwcm9wcmlhdGVseS4KKyAgICAgKiA8cD4KKyAgICAgKiA8c3Ryb25nPk5vdGU6PC9zdHJvbmc+IFRoZSBjaGFyYWN0ZXJzIGFyZSBjb25zdW1lZC4KKyAgICAgKiA8cD4KKyAgICAgKiA8c3Ryb25nPk5vdGU6PC9zdHJvbmc+IFRoaXMgbWV0aG9kIGRvZXMgbm90IGd1YXJhbnRlZSB0byByZXR1cm4KKyAgICAgKiB0aGUgbG9uZ2VzdCBydW4gb2YgYXR0cmlidXRlIHZhbHVlIGRhdGEuIFRoaXMgbWV0aG9kIG1heSByZXR1cm4KKyAgICAgKiBiZWZvcmUgdGhlIHF1b3RlIGNoYXJhY3RlciBkdWUgdG8gcmVhY2hpbmcgdGhlIGVuZCBvZiB0aGUgaW5wdXQKKyAgICAgKiBidWZmZXIgb3IgYW55IG90aGVyIHJlYXNvbi4KKyAgICAgKiA8cD4KKyAgICAgKiA8c3Ryb25nPk5vdGU6PC9zdHJvbmc+IFRoZSBmaWVsZHMgY29udGFpbmVkIGluIHRoZSBYTUxTdHJpbmcKKyAgICAgKiBzdHJ1Y3R1cmUgYXJlIG5vdCBndWFyYW50ZWVkIHRvIHJlbWFpbiB2YWxpZCB1cG9uIHN1YnNlcXVlbnQgY2FsbHMKKyAgICAgKiB0byB0aGUgZW50aXR5IHNjYW5uZXIuIFRoZXJlZm9yZSwgdGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IKKyAgICAgKiBpbW1lZGlhdGVseSB1c2luZyB0aGUgcmV0dXJuZWQgY2hhcmFjdGVyIGRhdGEgb3IgbWFraW5nIGEgY29weSBvZgorICAgICAqIHRoZSBjaGFyYWN0ZXIgZGF0YS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBxdW90ZSAgIFRoZSBxdW90ZSBjaGFyYWN0ZXIgdGhhdCBzaWduaWZpZXMgdGhlIGVuZCBvZiB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgdmFsdWUgZGF0YS4KKyAgICAgKiBAcGFyYW0gY29udGVudCBUaGUgY29udGVudCBzdHJ1Y3R1cmUgdG8gZmlsbC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbmV4dCBjaGFyYWN0ZXIgb24gdGhlIGlucHV0LCBpZiBrbm93bi4gVGhpcworICAgICAqICAgICAgICAgdmFsdWUgbWF5IGJlIC0xIGJ1dCB0aGlzIGRvZXMgPGVtPm5vdGU8L2VtPiBkZXNpZ25hdGUKKyAgICAgKiAgICAgICAgIGVuZCBvZiBmaWxlLgorICAgICAqCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiAgVGhyb3duIGlmIGkvbyBlcnJvciBvY2N1cnMuCisgICAgICogQHRocm93cyBFT0ZFeGNlcHRpb24gVGhyb3duIG9uIGVuZCBvZiBmaWxlLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgc2NhbkxpdGVyYWwoaW50IHF1b3RlLCBYTUxTdHJpbmcgY29udGVudCkKKwl0aHJvd3MgSU9FeGNlcHRpb24geworCisJLy8gbG9hZCBtb3JlIGNoYXJhY3RlcnMsIGlmIG5lZWRlZAorCWlmIChmQ3VycmVudEVudGl0eS5wb3NpdGlvbiA9PSBmQ3VycmVudEVudGl0eS5jb3VudCkgeworCSAgICBsb2FkKDAsIHRydWUpOworCX0gZWxzZSBpZiAoZkN1cnJlbnRFbnRpdHkucG9zaXRpb24gPT0gZkN1cnJlbnRFbnRpdHkuY291bnQgLSAxKSB7CisJICAgIGZDdXJyZW50RW50aXR5LmNoWzBdID0gZkN1cnJlbnRFbnRpdHkuY2hbZkN1cnJlbnRFbnRpdHkuY291bnQgLSAxXTsKKwkgICAgbG9hZCgxLCBmYWxzZSk7CisJICAgIGZDdXJyZW50RW50aXR5LnBvc2l0aW9uID0gMDsKKwl9CisKKwkvLyBub3JtYWxpemUgbmV3bGluZXMKKwlpbnQgb2Zmc2V0ID0gZkN1cnJlbnRFbnRpdHkucG9zaXRpb247CisJaW50IGMgPSBmQ3VycmVudEVudGl0eS5jaFtvZmZzZXRdOworCWludCBuZXdsaW5lcyA9IDA7CisJYm9vbGVhbiBleHRlcm5hbCA9IGZDdXJyZW50RW50aXR5LmlzRXh0ZXJuYWwoKTsKKwlpZiAoYyA9PSAnXG4nIHx8IChjID09ICdccicgJiYgZXh0ZXJuYWwpKSB7CisJICAgIGRvIHsKKwkJYyA9IGZDdXJyZW50RW50aXR5LmNoW2ZDdXJyZW50RW50aXR5LnBvc2l0aW9uKytdOworCQlpZiAoYyA9PSAnXHInICYmIGV4dGVybmFsKSB7CisJCSAgICBuZXdsaW5lcysrOworCQkgICAgZkN1cnJlbnRFbnRpdHkubGluZU51bWJlcisrOworCQkgICAgZkN1cnJlbnRFbnRpdHkuY29sdW1uTnVtYmVyID0gMTsKKwkJICAgIGlmIChmQ3VycmVudEVudGl0eS5wb3NpdGlvbiA9PSBmQ3VycmVudEVudGl0eS5jb3VudCkgeworCQkJb2Zmc2V0ID0gMDsKKwkJCWZDdXJyZW50RW50aXR5LnBvc2l0aW9uID0gbmV3bGluZXM7CisJCQlpZiAobG9hZChuZXdsaW5lcywgZmFsc2UpKSB7CisJCQkgICAgYnJlYWs7CisJCQl9CisJCSAgICB9CisJCSAgICBpZiAoZkN1cnJlbnRFbnRpdHkuY2hbZkN1cnJlbnRFbnRpdHkucG9zaXRpb25dID09ICdcbicpIHsKKwkJCWZDdXJyZW50RW50aXR5LnBvc2l0aW9uKys7CisJCQlvZmZzZXQrKzsKKwkJICAgIH0KKwkJICAgIC8qKiogTkVXTElORSBOT1JNQUxJWkFUSU9OICoqKi8KKwkJICAgIGVsc2UgeworCQkJbmV3bGluZXMrKzsKKwkJICAgIH0KKwkJICAgIC8qKiovCisJCX0KKwkJZWxzZSBpZiAoYyA9PSAnXG4nKSB7CisJCSAgICBuZXdsaW5lcysrOworCQkgICAgZkN1cnJlbnRFbnRpdHkubGluZU51bWJlcisrOworCQkgICAgZkN1cnJlbnRFbnRpdHkuY29sdW1uTnVtYmVyID0gMTsKKwkJICAgIGlmIChmQ3VycmVudEVudGl0eS5wb3NpdGlvbiA9PSBmQ3VycmVudEVudGl0eS5jb3VudCkgeworCQkJb2Zmc2V0ID0gMDsKKwkJCWZDdXJyZW50RW50aXR5LnBvc2l0aW9uID0gbmV3bGluZXM7CisJCQlpZiAobG9hZChuZXdsaW5lcywgZmFsc2UpKSB7CisJCQkgICAgYnJlYWs7CisJCQl9CisJCSAgICB9CisJCSAgICAvKioqIE5FV0xJTkUgTk9STUFMSVpBVElPTiAqKioKKwkJCSBpZiAoZkN1cnJlbnRFbnRpdHkuY2hbZkN1cnJlbnRFbnRpdHkucG9zaXRpb25dID09ICdccicKKwkJCSAmJiBleHRlcm5hbCkgeworCQkJIGZDdXJyZW50RW50aXR5LnBvc2l0aW9uKys7CisJCQkgb2Zmc2V0Kys7CisJCQkgfQorCQkJIC8qKiovCisJCX0KKwkJZWxzZSB7CisJCSAgICBmQ3VycmVudEVudGl0eS5wb3NpdGlvbi0tOworCQkgICAgYnJlYWs7CisJCX0KKwkgICAgfSB3aGlsZSAoZkN1cnJlbnRFbnRpdHkucG9zaXRpb24gPCBmQ3VycmVudEVudGl0eS5jb3VudCAtIDEpOworCSAgICBmb3IgKGludCBpID0gb2Zmc2V0OyBpIDwgZkN1cnJlbnRFbnRpdHkucG9zaXRpb247IGkrKykgeworCQlmQ3VycmVudEVudGl0eS5jaFtpXSA9ICdcbic7CisJICAgIH0KKwkgICAgaW50IGxlbmd0aCA9IGZDdXJyZW50RW50aXR5LnBvc2l0aW9uIC0gb2Zmc2V0OworCSAgICBpZiAoZkN1cnJlbnRFbnRpdHkucG9zaXRpb24gPT0gZkN1cnJlbnRFbnRpdHkuY291bnQgLSAxKSB7CisJCWNvbnRlbnQuc2V0VmFsdWVzKGZDdXJyZW50RW50aXR5LmNoLCBvZmZzZXQsIGxlbmd0aCk7CisJCXJldHVybiAtMTsKKwkgICAgfQorCX0KKworCS8vIHNjYW4gbGl0ZXJhbCB2YWx1ZQorCXdoaWxlIChmQ3VycmVudEVudGl0eS5wb3NpdGlvbiA8IGZDdXJyZW50RW50aXR5LmNvdW50KSB7CisJICAgIGMgPSBmQ3VycmVudEVudGl0eS5jaFtmQ3VycmVudEVudGl0eS5wb3NpdGlvbisrXTsKKwkgICAgaWYgKChjID09IHF1b3RlICYmCisJCSAoIWZDdXJyZW50RW50aXR5LmxpdGVyYWwgfHwgZXh0ZXJuYWwpKQorCQl8fCBjID09ICclJyB8fCAhWE1MQ2hhci5pc0NvbnRlbnQoYykpIHsKKwkJZkN1cnJlbnRFbnRpdHkucG9zaXRpb24tLTsKKwkJYnJlYWs7CisJICAgIH0KKwl9CisJaW50IGxlbmd0aCA9IGZDdXJyZW50RW50aXR5LnBvc2l0aW9uIC0gb2Zmc2V0OworCWZDdXJyZW50RW50aXR5LmNvbHVtbk51bWJlciArPSBsZW5ndGggLSBuZXdsaW5lczsKKwljb250ZW50LnNldFZhbHVlcyhmQ3VycmVudEVudGl0eS5jaCwgb2Zmc2V0LCBsZW5ndGgpOworCisJLy8gcmV0dXJuIG5leHQgY2hhcmFjdGVyCisJaWYgKGZDdXJyZW50RW50aXR5LnBvc2l0aW9uICE9IGZDdXJyZW50RW50aXR5LmNvdW50KSB7CisJICAgIGMgPSBmQ3VycmVudEVudGl0eS5jaFtmQ3VycmVudEVudGl0eS5wb3NpdGlvbl07CisJICAgIC8vIE5PVEU6IFdlIGRvbid0IHdhbnQgdG8gYWNjaWRlbnRhbGx5IHNpZ25hbCB0aGUKKwkgICAgLy8gICAgICAgZW5kIG9mIHRoZSBsaXRlcmFsIGlmIHdlJ3JlIGV4cGFuZGluZyBhbgorCSAgICAvLyAgICAgICBlbnRpdHkgYXBwZWFyaW5nIGluIHRoZSBsaXRlcmFsLiAtQWMKKwkgICAgaWYgKGMgPT0gcXVvdGUgJiYgZkN1cnJlbnRFbnRpdHkubGl0ZXJhbCkgeworCQljID0gLTE7CisJICAgIH0KKwl9CisJZWxzZSB7CisJICAgIGMgPSAtMTsKKwl9CisJcmV0dXJuIGM7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTY2FucyBhIHJhbmdlIG9mIGNoYXJhY3RlciBkYXRhIHVwIHRvIHRoZSBzcGVjaWZpZWQgZGVsaW1pdGVyLAorICAgICAqIHNldHRpbmcgdGhlIGZpZWxkcyBvZiB0aGUgWE1MU3RyaW5nIHN0cnVjdHVyZSwgYXBwcm9wcmlhdGVseS4KKyAgICAgKiA8cD4KKyAgICAgKiA8c3Ryb25nPk5vdGU6PC9zdHJvbmc+IFRoZSBjaGFyYWN0ZXJzIGFyZSBjb25zdW1lZC4KKyAgICAgKiA8cD4KKyAgICAgKiA8c3Ryb25nPk5vdGU6PC9zdHJvbmc+IFRoaXMgYXNzdW1lcyB0aGF0IHRoZSBpbnRlcm5hbCBidWZmZXIgaXMKKyAgICAgKiBhdCBsZWFzdCB0aGUgc2FtZSBzaXplLCBvciBiaWdnZXIsIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGUgZGVsaW1pdGVyCisgICAgICogYW5kIHRoYXQgdGhlIGRlbGltaXRlciBjb250YWlucyBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyLgorICAgICAqIDxwPgorICAgICAqIDxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gVGhpcyBtZXRob2QgZG9lcyBub3QgZ3VhcmFudGVlIHRvIHJldHVybgorICAgICAqIHRoZSBsb25nZXN0IHJ1biBvZiBjaGFyYWN0ZXIgZGF0YS4gVGhpcyBtZXRob2QgbWF5IHJldHVybiBiZWZvcmUKKyAgICAgKiB0aGUgZGVsaW1pdGVyIGR1ZSB0byByZWFjaGluZyB0aGUgZW5kIG9mIHRoZSBpbnB1dCBidWZmZXIgb3IgYW55CisgICAgICogb3RoZXIgcmVhc29uLgorICAgICAqIDxwPgorICAgICAqIDxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gVGhlIGZpZWxkcyBjb250YWluZWQgaW4gdGhlIFhNTFN0cmluZworICAgICAqIHN0cnVjdHVyZSBhcmUgbm90IGd1YXJhbnRlZWQgdG8gcmVtYWluIHZhbGlkIHVwb24gc3Vic2VxdWVudCBjYWxscworICAgICAqIHRvIHRoZSBlbnRpdHkgc2Nhbm5lci4gVGhlcmVmb3JlLCB0aGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvcgorICAgICAqIGltbWVkaWF0ZWx5IHVzaW5nIHRoZSByZXR1cm5lZCBjaGFyYWN0ZXIgZGF0YSBvciBtYWtpbmcgYSBjb3B5IG9mCisgICAgICogdGhlIGNoYXJhY3RlciBkYXRhLgorICAgICAqCisgICAgICogQHBhcmFtIGRlbGltaXRlciBUaGUgc3RyaW5nIHRoYXQgc2lnbmlmaWVzIHRoZSBlbmQgb2YgdGhlIGNoYXJhY3RlcgorICAgICAqICAgICAgICAgICAgICAgICAgZGF0YSB0byBiZSBzY2FubmVkLgorICAgICAqIEBwYXJhbSBidWZmZXIgICAgVGhlIGRhdGEgc3RydWN0dXJlIHRvIGZpbGwuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBpcyBtb3JlIGRhdGEgdG8gc2NhbiwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiAgVGhyb3duIGlmIGkvbyBlcnJvciBvY2N1cnMuCisgICAgICogQHRocm93cyBFT0ZFeGNlcHRpb24gVGhyb3duIG9uIGVuZCBvZiBmaWxlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHNjYW5EYXRhKFN0cmluZyBkZWxpbWl0ZXIsIFhNTFN0cmluZ0J1ZmZlciBidWZmZXIpCisJdGhyb3dzIElPRXhjZXB0aW9uIHsKKworCWJvb2xlYW4gZG9uZSA9IGZhbHNlOworCWludCBkZWxpbUxlbiA9IGRlbGltaXRlci5sZW5ndGgoKTsKKwljaGFyIGNoYXJBdDAgPSBkZWxpbWl0ZXIuY2hhckF0KDApOworCWJvb2xlYW4gZXh0ZXJuYWwgPSBmQ3VycmVudEVudGl0eS5pc0V4dGVybmFsKCk7CisJZG8geworICAgIAorCSAgICAvLyBsb2FkIG1vcmUgY2hhcmFjdGVycywgaWYgbmVlZGVkCisgICAgCisJICAgIGlmIChmQ3VycmVudEVudGl0eS5wb3NpdGlvbiA9PSBmQ3VycmVudEVudGl0eS5jb3VudCkgeworCQlsb2FkKDAsIHRydWUpOworCSAgICB9CisJICAgIGVsc2UgaWYgKGZDdXJyZW50RW50aXR5LnBvc2l0aW9uID49IGZDdXJyZW50RW50aXR5LmNvdW50IC0gZGVsaW1MZW4pIHsKKwkJU3lzdGVtLmFycmF5Y29weShmQ3VycmVudEVudGl0eS5jaCwgZkN1cnJlbnRFbnRpdHkucG9zaXRpb24sCisJCQkJIGZDdXJyZW50RW50aXR5LmNoLCAwLCBmQ3VycmVudEVudGl0eS5jb3VudCAtIGZDdXJyZW50RW50aXR5LnBvc2l0aW9uKTsKKwkJbG9hZChmQ3VycmVudEVudGl0eS5jb3VudCAtIGZDdXJyZW50RW50aXR5LnBvc2l0aW9uLCBmYWxzZSk7CisJCWZDdXJyZW50RW50aXR5LnBvc2l0aW9uID0gMDsKKwkgICAgfSAKKwkgICAgaWYgKGZDdXJyZW50RW50aXR5LnBvc2l0aW9uID49IGZDdXJyZW50RW50aXR5LmNvdW50IC0gZGVsaW1MZW4pIHsKKwkJLy8gc29tZXRoaW5nIG11c3QgYmUgd3Jvbmcgd2l0aCB0aGUgaW5wdXQ6IGUuZy4sIGZpbGUgZW5kcyBhbgorCQkvLyB1bnRlcm1pbmF0ZWQgY29tbWVudAorCQlpbnQgbGVuZ3RoID0gZkN1cnJlbnRFbnRpdHkuY291bnQgLSBmQ3VycmVudEVudGl0eS5wb3NpdGlvbjsKKwkJYnVmZmVyLmFwcGVuZCAoZkN1cnJlbnRFbnRpdHkuY2gsIGZDdXJyZW50RW50aXR5LnBvc2l0aW9uLAorCQkJICAgICAgIGxlbmd0aCk7IAorCQlmQ3VycmVudEVudGl0eS5jb2x1bW5OdW1iZXIgKz0gZkN1cnJlbnRFbnRpdHkuY291bnQ7CisJCWZDdXJyZW50RW50aXR5LnBvc2l0aW9uID0gZkN1cnJlbnRFbnRpdHkuY291bnQ7CisJCWxvYWQoMCx0cnVlKTsKKwkJcmV0dXJuIGZhbHNlOworCSAgICB9CisgICAgCisJICAgIC8vIG5vcm1hbGl6ZSBuZXdsaW5lcworCSAgICBpbnQgb2Zmc2V0ID0gZkN1cnJlbnRFbnRpdHkucG9zaXRpb247CisJICAgIGludCBjID0gZkN1cnJlbnRFbnRpdHkuY2hbb2Zmc2V0XTsKKwkgICAgaW50IG5ld2xpbmVzID0gMDsKKwkgICAgaWYgKGMgPT0gJ1xuJyB8fCAoYyA9PSAnXHInICYmIGV4dGVybmFsKSkgeworCQlkbyB7CisJCSAgICBjID0gZkN1cnJlbnRFbnRpdHkuY2hbZkN1cnJlbnRFbnRpdHkucG9zaXRpb24rK107CisJCSAgICBpZiAoYyA9PSAnXHInICYmIGV4dGVybmFsKSB7CisJCQluZXdsaW5lcysrOworCQkJZkN1cnJlbnRFbnRpdHkubGluZU51bWJlcisrOworCQkJZkN1cnJlbnRFbnRpdHkuY29sdW1uTnVtYmVyID0gMTsKKwkJCWlmIChmQ3VycmVudEVudGl0eS5wb3NpdGlvbiA9PSBmQ3VycmVudEVudGl0eS5jb3VudCkgeworCQkJICAgIG9mZnNldCA9IDA7CisJCQkgICAgZkN1cnJlbnRFbnRpdHkucG9zaXRpb24gPSBuZXdsaW5lczsKKwkJCSAgICBpZiAobG9hZChuZXdsaW5lcywgZmFsc2UpKSB7CisJCQkJYnJlYWs7CisJCQkgICAgfQorCQkJfQorCQkJaWYgKGZDdXJyZW50RW50aXR5LmNoW2ZDdXJyZW50RW50aXR5LnBvc2l0aW9uXSA9PSAnXG4nKSB7CisJCQkgICAgZkN1cnJlbnRFbnRpdHkucG9zaXRpb24rKzsKKwkJCSAgICBvZmZzZXQrKzsKKwkJCX0KKwkJCS8qKiogTkVXTElORSBOT1JNQUxJWkFUSU9OICoqKi8KKwkJCWVsc2UgeworCQkJICAgIG5ld2xpbmVzKys7CisJCQl9CisJCSAgICB9CisJCSAgICBlbHNlIGlmIChjID09ICdcbicpIHsKKwkJCW5ld2xpbmVzKys7CisJCQlmQ3VycmVudEVudGl0eS5saW5lTnVtYmVyKys7CisJCQlmQ3VycmVudEVudGl0eS5jb2x1bW5OdW1iZXIgPSAxOworCQkJaWYgKGZDdXJyZW50RW50aXR5LnBvc2l0aW9uID09IGZDdXJyZW50RW50aXR5LmNvdW50KSB7CisJCQkgICAgb2Zmc2V0ID0gMDsKKwkJCSAgICBmQ3VycmVudEVudGl0eS5wb3NpdGlvbiA9IG5ld2xpbmVzOworCQkJICAgIGZDdXJyZW50RW50aXR5LmNvdW50ID0gbmV3bGluZXM7CisJCQkgICAgaWYgKGxvYWQobmV3bGluZXMsIGZhbHNlKSkgeworCQkJCWJyZWFrOworCQkJICAgIH0KKwkJCX0KKwkJICAgIH0KKwkJICAgIGVsc2UgeworCQkJZkN1cnJlbnRFbnRpdHkucG9zaXRpb24tLTsKKwkJCWJyZWFrOworCQkgICAgfQorCQl9IHdoaWxlIChmQ3VycmVudEVudGl0eS5wb3NpdGlvbiA8IGZDdXJyZW50RW50aXR5LmNvdW50IC0gMSk7CisJCWZvciAoaW50IGkgPSBvZmZzZXQ7IGkgPCBmQ3VycmVudEVudGl0eS5wb3NpdGlvbjsgaSsrKSB7CisJCSAgICBmQ3VycmVudEVudGl0eS5jaFtpXSA9ICdcbic7CisJCX0KKwkJaW50IGxlbmd0aCA9IGZDdXJyZW50RW50aXR5LnBvc2l0aW9uIC0gb2Zmc2V0OworCQlpZiAoZkN1cnJlbnRFbnRpdHkucG9zaXRpb24gPT0gZkN1cnJlbnRFbnRpdHkuY291bnQgLSAxKSB7CisJCSAgICBidWZmZXIuYXBwZW5kKGZDdXJyZW50RW50aXR5LmNoLCBvZmZzZXQsIGxlbmd0aCk7CisJCSAgICByZXR1cm4gdHJ1ZTsKKwkJfQorCSAgICB9CisgICAgCisJICAgIC8vIGl0ZXJhdGUgb3ZlciBidWZmZXIgbG9va2luZyBmb3IgZGVsaW1pdGVyCisJT1VURVI6IHdoaWxlIChmQ3VycmVudEVudGl0eS5wb3NpdGlvbiA8IGZDdXJyZW50RW50aXR5LmNvdW50KSB7CisJICAgIGMgPSBmQ3VycmVudEVudGl0eS5jaFtmQ3VycmVudEVudGl0eS5wb3NpdGlvbisrXTsKKwkgICAgaWYgKGMgPT0gY2hhckF0MCkgeworCQkvLyBsb29rcyBsaWtlIHdlIGp1c3QgaGl0IHRoZSBkZWxpbWl0ZXIKKwkJaW50IGRlbGltT2Zmc2V0ID0gZkN1cnJlbnRFbnRpdHkucG9zaXRpb24gLSAxOworCQlmb3IgKGludCBpID0gMTsgaSA8IGRlbGltTGVuOyBpKyspIHsKKwkJICAgIGlmIChmQ3VycmVudEVudGl0eS5wb3NpdGlvbiA9PSBmQ3VycmVudEVudGl0eS5jb3VudCkgeworCQkJZkN1cnJlbnRFbnRpdHkucG9zaXRpb24gLT0gaTsKKwkJCWJyZWFrIE9VVEVSOworCQkgICAgfQorCQkgICAgYyA9IGZDdXJyZW50RW50aXR5LmNoW2ZDdXJyZW50RW50aXR5LnBvc2l0aW9uKytdOworCQkgICAgaWYgKGRlbGltaXRlci5jaGFyQXQoaSkgIT0gYykgeworCQkJZkN1cnJlbnRFbnRpdHkucG9zaXRpb24tLTsKKwkJCWJyZWFrOworCQkgICAgfQorCQl9CisJCWlmIChmQ3VycmVudEVudGl0eS5wb3NpdGlvbiA9PSBkZWxpbU9mZnNldCArIGRlbGltTGVuKSB7CisJCSAgICBkb25lID0gdHJ1ZTsKKwkJICAgIGJyZWFrOworCQl9CisJICAgIH0KKwkgICAgZWxzZSBpZiAoYyA9PSAnXG4nIHx8IChleHRlcm5hbCAmJiBjID09ICdccicpKSB7CisJCWZDdXJyZW50RW50aXR5LnBvc2l0aW9uLS07CisJCWJyZWFrOworCSAgICB9CisJICAgIGVsc2UgaWYgKFhNTENoYXIuaXNJbnZhbGlkKGMpKSB7CisJCWZDdXJyZW50RW50aXR5LnBvc2l0aW9uLS07CisJCWludCBsZW5ndGggPSBmQ3VycmVudEVudGl0eS5wb3NpdGlvbiAtIG9mZnNldDsKKwkJZkN1cnJlbnRFbnRpdHkuY29sdW1uTnVtYmVyICs9IGxlbmd0aCAtIG5ld2xpbmVzOworCQlidWZmZXIuYXBwZW5kKGZDdXJyZW50RW50aXR5LmNoLCBvZmZzZXQsIGxlbmd0aCk7IAorCQlyZXR1cm4gdHJ1ZTsKKwkgICAgfQorCX0KKwkgICAgaW50IGxlbmd0aCA9IGZDdXJyZW50RW50aXR5LnBvc2l0aW9uIC0gb2Zmc2V0OworCSAgICBmQ3VycmVudEVudGl0eS5jb2x1bW5OdW1iZXIgKz0gbGVuZ3RoIC0gbmV3bGluZXM7CisJICAgIGlmIChkb25lKSB7CisJCWxlbmd0aCAtPSBkZWxpbUxlbjsKKwkgICAgfQorCSAgICBidWZmZXIuYXBwZW5kIChmQ3VycmVudEVudGl0eS5jaCwgb2Zmc2V0LCBsZW5ndGgpOworICAgIAorCSAgICAvLyByZXR1cm4gdHJ1ZSBpZiBzdHJpbmcgd2FzIHNraXBwZWQKKwl9IHdoaWxlICghZG9uZSk7CisJcmV0dXJuICFkb25lOworCisgICAgfQorCisgICAgLy8gQWRhcHRlZCBmcm9tOgorICAgIC8vIG9yZy5hcGFjaGUueGVyY2VzLmltcGwuWE1MRW50aXR5TWFuYWdlci5FbnRpdHlTY2FubmVyLnNraXBDaGFyCisgICAgLyoqCisgICAgICogU2tpcHMgYSBjaGFyYWN0ZXIgYXBwZWFyaW5nIGltbWVkaWF0ZWx5IG9uIHRoZSBpbnB1dC4KKyAgICAgKiA8cD4KKyAgICAgKiA8c3Ryb25nPk5vdGU6PC9zdHJvbmc+IFRoZSBjaGFyYWN0ZXIgaXMgY29uc3VtZWQgb25seSBpZiBpdCBtYXRjaGVzCisgICAgICogdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYyBUaGUgY2hhcmFjdGVyIHRvIHNraXAuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdHJ1ZSBpZiB0aGUgY2hhcmFjdGVyIHdhcyBza2lwcGVkLgorICAgICAqCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiAgVGhyb3duIGlmIGkvbyBlcnJvciBvY2N1cnMuCisgICAgICogQHRocm93cyBFT0ZFeGNlcHRpb24gVGhyb3duIG9uIGVuZCBvZiBmaWxlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHNraXBDaGFyKGludCBjKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisJLy8gbG9hZCBtb3JlIGNoYXJhY3RlcnMsIGlmIG5lZWRlZAorCWlmIChmQ3VycmVudEVudGl0eS5wb3NpdGlvbiA9PSBmQ3VycmVudEVudGl0eS5jb3VudCkgeworCSAgICBsb2FkKDAsIHRydWUpOworCX0KKworCS8vIHNraXAgY2hhcmFjdGVyCisJaW50IGNjID0gZkN1cnJlbnRFbnRpdHkuY2hbZkN1cnJlbnRFbnRpdHkucG9zaXRpb25dOworCWlmIChjYyA9PSBjKSB7CisJICAgIGZDdXJyZW50RW50aXR5LnBvc2l0aW9uKys7CisJICAgIGlmIChjID09ICdcbicpIHsKKwkJZkN1cnJlbnRFbnRpdHkubGluZU51bWJlcisrOworCQlmQ3VycmVudEVudGl0eS5jb2x1bW5OdW1iZXIgPSAxOworCSAgICB9CisJICAgIGVsc2UgeworCQlmQ3VycmVudEVudGl0eS5jb2x1bW5OdW1iZXIrKzsKKwkgICAgfQorCSAgICByZXR1cm4gdHJ1ZTsKKwl9IGVsc2UgaWYgKGMgPT0gJ1xuJyAmJiBjYyA9PSAnXHInICYmIGZDdXJyZW50RW50aXR5LmlzRXh0ZXJuYWwoKSkgeworCSAgICAvLyBoYW5kbGUgbmV3bGluZXMKKwkgICAgaWYgKGZDdXJyZW50RW50aXR5LnBvc2l0aW9uID09IGZDdXJyZW50RW50aXR5LmNvdW50KSB7CisJCWZDdXJyZW50RW50aXR5LmNoWzBdID0gKGNoYXIpY2M7CisJCWxvYWQoMSwgZmFsc2UpOworCSAgICB9CisJICAgIGZDdXJyZW50RW50aXR5LnBvc2l0aW9uKys7CisJICAgIGlmIChmQ3VycmVudEVudGl0eS5jaFtmQ3VycmVudEVudGl0eS5wb3NpdGlvbl0gPT0gJ1xuJykgeworCQlmQ3VycmVudEVudGl0eS5wb3NpdGlvbisrOworCSAgICB9CisJICAgIGZDdXJyZW50RW50aXR5LmxpbmVOdW1iZXIrKzsKKwkgICAgZkN1cnJlbnRFbnRpdHkuY29sdW1uTnVtYmVyID0gMTsKKwkgICAgcmV0dXJuIHRydWU7CisJfQorCisJLy8gY2hhcmFjdGVyIHdhcyBub3Qgc2tpcHBlZAorCXJldHVybiBmYWxzZTsKKworICAgIH0KKworICAgIC8vIEFkYXB0ZWQgZnJvbToKKyAgICAvLyBvcmcuYXBhY2hlLnhlcmNlcy5pbXBsLlhNTEVudGl0eU1hbmFnZXIuRW50aXR5U2Nhbm5lci5za2lwU3BhY2VzCisgICAgLyoqCisgICAgICogU2tpcHMgc3BhY2UgY2hhcmFjdGVycyBhcHBlYXJpbmcgaW1tZWRpYXRlbHkgb24gdGhlIGlucHV0LgorICAgICAqIDxwPgorICAgICAqIDxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gVGhlIGNoYXJhY3RlcnMgYXJlIGNvbnN1bWVkIG9ubHkgaWYgdGhleSBhcmUKKyAgICAgKiBzcGFjZSBjaGFyYWN0ZXJzLgorICAgICAqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRydWUgaWYgYXQgbGVhc3Qgb25lIHNwYWNlIGNoYXJhY3RlciB3YXMgc2tpcHBlZC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gIFRocm93biBpZiBpL28gZXJyb3Igb2NjdXJzLgorICAgICAqIEB0aHJvd3MgRU9GRXhjZXB0aW9uIFRocm93biBvbiBlbmQgb2YgZmlsZS4KKyAgICAgKgorICAgICAqIEBzZWUgWE1MQ2hhciNpc1NwYWNlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gc2tpcFNwYWNlcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKwkvLyBsb2FkIG1vcmUgY2hhcmFjdGVycywgaWYgbmVlZGVkCisJaWYgKGZDdXJyZW50RW50aXR5LnBvc2l0aW9uID09IGZDdXJyZW50RW50aXR5LmNvdW50KSB7CisJICAgIGxvYWQoMCwgdHJ1ZSk7CisJfQorCisJLy8gc2tpcCBzcGFjZXMKKwlpbnQgYyA9IGZDdXJyZW50RW50aXR5LmNoW2ZDdXJyZW50RW50aXR5LnBvc2l0aW9uXTsKKwlpZiAoWE1MQ2hhci5pc1NwYWNlKGMpKSB7CisJICAgIGJvb2xlYW4gZXh0ZXJuYWwgPSBmQ3VycmVudEVudGl0eS5pc0V4dGVybmFsKCk7CisJICAgIGRvIHsKKwkJYm9vbGVhbiBlbnRpdHlDaGFuZ2VkID0gZmFsc2U7CisJCS8vIGhhbmRsZSBuZXdsaW5lcworCQlpZiAoYyA9PSAnXG4nIHx8IChleHRlcm5hbCAmJiBjID09ICdccicpKSB7CisJCSAgICBmQ3VycmVudEVudGl0eS5saW5lTnVtYmVyKys7CisJCSAgICBmQ3VycmVudEVudGl0eS5jb2x1bW5OdW1iZXIgPSAxOworCQkgICAgaWYgKGZDdXJyZW50RW50aXR5LnBvc2l0aW9uID09IGZDdXJyZW50RW50aXR5LmNvdW50IC0gMSkgeworCQkJZkN1cnJlbnRFbnRpdHkuY2hbMF0gPSAoY2hhciljOworCQkJZW50aXR5Q2hhbmdlZCA9IGxvYWQoMSwgdHJ1ZSk7CisJCQlpZiAoIWVudGl0eUNoYW5nZWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBsb2FkIGNoYW5nZSB0aGUgcG9zaXRpb24gdG8gYmUgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmVlZCB0byByZXN0b3JlIGl0IHdoZW4gZW50aXR5IG5vdCBjaGFuZ2VkCisJCQkgICAgZkN1cnJlbnRFbnRpdHkucG9zaXRpb24gPSAwOworCQkgICAgfQorCQkgICAgaWYgKGMgPT0gJ1xyJyAmJiBleHRlcm5hbCkgeworCQkJLy8gUkVWSVNJVDogRG9lcyB0aGlzIG5lZWQgdG8gYmUgdXBkYXRlZCB0byBmaXggdGhlCisJCQkvLyAgICAgICAgICAjeDBEIF4jeDBBIG5ld2xpbmUgbm9ybWFsaXphdGlvbiBwcm9ibGVtPyAtQWMKKwkJCWlmIChmQ3VycmVudEVudGl0eS5jaFsrK2ZDdXJyZW50RW50aXR5LnBvc2l0aW9uXSAhPSAnXG4nKSB7CisJCQkgICAgZkN1cnJlbnRFbnRpdHkucG9zaXRpb24tLTsKKwkJCX0KKwkJICAgIH0KKwkJICAgIC8qKiogTkVXTElORSBOT1JNQUxJWkFUSU9OICoqKgorCQkJIGVsc2UgeworCQkJIGlmIChmQ3VycmVudEVudGl0eS5jaFtmQ3VycmVudEVudGl0eS5wb3NpdGlvbiArIDFdID09ICdccicKKwkJCSAmJiBleHRlcm5hbCkgeworCQkJIGZDdXJyZW50RW50aXR5LnBvc2l0aW9uKys7CisJCQkgfQorCQkJIH0KKwkJCSAvKioqLworCQl9CisJCWVsc2UgeworCQkgICAgZkN1cnJlbnRFbnRpdHkuY29sdW1uTnVtYmVyKys7CisJCX0KKwkJLy8gbG9hZCBtb3JlIGNoYXJhY3RlcnMsIGlmIG5lZWRlZAorCQlpZiAoIWVudGl0eUNoYW5nZWQpCisJCSAgICBmQ3VycmVudEVudGl0eS5wb3NpdGlvbisrOworCQlpZiAoZkN1cnJlbnRFbnRpdHkucG9zaXRpb24gPT0gZkN1cnJlbnRFbnRpdHkuY291bnQpIHsKKwkJICAgIGxvYWQoMCwgdHJ1ZSk7CisJCX0KKwkgICAgfSB3aGlsZSAoWE1MQ2hhci5pc1NwYWNlKGMgPSBmQ3VycmVudEVudGl0eS5jaFtmQ3VycmVudEVudGl0eS5wb3NpdGlvbl0pKTsKKwkgICAgcmV0dXJuIHRydWU7CisJfQorCisJLy8gbm8gc3BhY2VzIHdlcmUgZm91bmQKKwlyZXR1cm4gZmFsc2U7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTa2lwcyB0aGUgc3BlY2lmaWVkIHN0cmluZyBhcHBlYXJpbmcgaW1tZWRpYXRlbHkgb24gdGhlIGlucHV0LgorICAgICAqIDxwPgorICAgICAqIDxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gVGhlIGNoYXJhY3RlcnMgYXJlIGNvbnN1bWVkIG9ubHkgaWYgdGhleSBhcmUKKyAgICAgKiBzcGFjZSBjaGFyYWN0ZXJzLgorICAgICAqCisgICAgICogQHBhcmFtIHMgVGhlIHN0cmluZyB0byBza2lwLgorICAgICAqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRydWUgaWYgdGhlIHN0cmluZyB3YXMgc2tpcHBlZC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gIFRocm93biBpZiBpL28gZXJyb3Igb2NjdXJzLgorICAgICAqIEB0aHJvd3MgRU9GRXhjZXB0aW9uIFRocm93biBvbiBlbmQgb2YgZmlsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBza2lwU3RyaW5nKFN0cmluZyBzKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisJLy8gbG9hZCBtb3JlIGNoYXJhY3RlcnMsIGlmIG5lZWRlZAorCWlmIChmQ3VycmVudEVudGl0eS5wb3NpdGlvbiA9PSBmQ3VycmVudEVudGl0eS5jb3VudCkgeworCSAgICBsb2FkKDAsIHRydWUpOworCX0KKworCS8vIHNraXAgc3RyaW5nCisJZmluYWwgaW50IGxlbmd0aCA9IHMubGVuZ3RoKCk7CisJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCSAgICBjaGFyIGMgPSBmQ3VycmVudEVudGl0eS5jaFtmQ3VycmVudEVudGl0eS5wb3NpdGlvbisrXTsKKwkgICAgaWYgKGMgIT0gcy5jaGFyQXQoaSkpIHsKKwkJZkN1cnJlbnRFbnRpdHkucG9zaXRpb24gLT0gaSArIDE7CisJCXJldHVybiBmYWxzZTsKKwkgICAgfQorCSAgICBpZiAoaSA8IGxlbmd0aCAtIDEgJiYgZkN1cnJlbnRFbnRpdHkucG9zaXRpb24gPT0gZkN1cnJlbnRFbnRpdHkuY291bnQpIHsKKwkJU3lzdGVtLmFycmF5Y29weShmQ3VycmVudEVudGl0eS5jaCwgZkN1cnJlbnRFbnRpdHkuY291bnQgLSBpIC0gMSwgZkN1cnJlbnRFbnRpdHkuY2gsIDAsIGkgKyAxKTsKKwkJLy8gUkVWSVNJVDogQ2FuIGEgc3RyaW5nIHRvIGJlIHNraXBwZWQgY3Jvc3MgYW4KKwkJLy8gICAgICAgICAgZW50aXR5IGJvdW5kYXJ5PyAtQWMKKwkJaWYgKGxvYWQoaSArIDEsIGZhbHNlKSkgeworCQkgICAgZkN1cnJlbnRFbnRpdHkucG9zaXRpb24gLT0gaSArIDE7CisJCSAgICByZXR1cm4gZmFsc2U7CisJCX0KKwkgICAgfQorCX0KKwlmQ3VycmVudEVudGl0eS5jb2x1bW5OdW1iZXIgKz0gbGVuZ3RoOworCXJldHVybiB0cnVlOworCisgICAgfQorCisgICAgLy8gQWRhcHRlZCBmcm9tOgorICAgIC8vIG9yZy5hcGFjaGUueGVyY2VzLmltcGwuWE1MRW50aXR5TWFuYWdlci5FbnRpdHlTY2FubmVyLmxvYWQKKyAgICAvKioKKyAgICAgKiBMb2FkcyBhIGNodW5rIG9mIHRleHQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb2Zmc2V0ICAgICAgIFRoZSBvZmZzZXQgaW50byB0aGUgY2hhcmFjdGVyIGJ1ZmZlciB0bworICAgICAqICAgICAgICAgICAgICAgICAgICAgcmVhZCB0aGUgbmV4dCBiYXRjaCBvZiBjaGFyYWN0ZXJzLgorICAgICAqIEBwYXJhbSBjaGFuZ2VFbnRpdHkgVHJ1ZSBpZiB0aGUgbG9hZCBzaG91bGQgY2hhbmdlIGVudGl0aWVzCisgICAgICogICAgICAgICAgICAgICAgICAgICBhdCB0aGUgZW5kIG9mIHRoZSBlbnRpdHksIG90aGVyd2lzZSBsZWF2ZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgdGhlIGN1cnJlbnQgZW50aXR5IGluIHBsYWNlIGFuZCB0aGUgZW50aXR5CisgICAgICogICAgICAgICAgICAgICAgICAgICBib3VuZGFyeSB3aWxsIGJlIHNpZ25hbGVkIGJ5IHRoZSByZXR1cm4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIHZhbHVlLgorICAgICAqCisgICAgICogQHJldHVybnMgUmV0dXJucyB0cnVlIGlmIHRoZSBlbnRpdHkgY2hhbmdlZCBhcyBhIHJlc3VsdCBvZiB0aGlzCisgICAgICogICAgICAgICAgbG9hZCBvcGVyYXRpb24uCisgICAgICovCisgICAgZmluYWwgYm9vbGVhbiBsb2FkKGludCBvZmZzZXQsIGJvb2xlYW4gY2hhbmdlRW50aXR5KQorCXRocm93cyBJT0V4Y2VwdGlvbiB7CisKKwkvLyByZWFkIGNoYXJhY3RlcnMKKwlpbnQgbGVuZ3RoID0gZkN1cnJlbnRFbnRpdHkubWF5UmVhZENodW5rcz8KKwkgICAgKGZDdXJyZW50RW50aXR5LmNoLmxlbmd0aCAtIG9mZnNldCk6CisJICAgIChERUZBVUxUX1hNTERFQ0xfQlVGRkVSX1NJWkUpOworCWludCBjb3VudCA9IGZDdXJyZW50RW50aXR5LnJlYWRlci5yZWFkKGZDdXJyZW50RW50aXR5LmNoLCBvZmZzZXQsCisJCQkJCSAgICAgICBsZW5ndGgpOworCisJLy8gcmVzZXQgY291bnQgYW5kIHBvc2l0aW9uCisJYm9vbGVhbiBlbnRpdHlDaGFuZ2VkID0gZmFsc2U7CisJaWYgKGNvdW50ICE9IC0xKSB7CisJICAgIGlmIChjb3VudCAhPSAwKSB7CisJCWZDdXJyZW50RW50aXR5LmNvdW50ID0gY291bnQgKyBvZmZzZXQ7CisJCWZDdXJyZW50RW50aXR5LnBvc2l0aW9uID0gb2Zmc2V0OworCSAgICB9CisJfQorCisJLy8gZW5kIG9mIHRoaXMgZW50aXR5CisJZWxzZSB7CisJICAgIGZDdXJyZW50RW50aXR5LmNvdW50ID0gb2Zmc2V0OworCSAgICBmQ3VycmVudEVudGl0eS5wb3NpdGlvbiA9IG9mZnNldDsKKwkgICAgZW50aXR5Q2hhbmdlZCA9IHRydWU7CisJICAgIGlmIChjaGFuZ2VFbnRpdHkpIHsKKwkJZW5kRW50aXR5KCk7CisJCWlmIChmQ3VycmVudEVudGl0eSA9PSBudWxsKSB7CisJCSAgICB0aHJvdyBuZXcgRU9GRXhjZXB0aW9uKCk7CisJCX0KKwkJLy8gaGFuZGxlIHRoZSB0cmFpbGluZyBlZGdlcworCQlpZiAoZkN1cnJlbnRFbnRpdHkucG9zaXRpb24gPT0gZkN1cnJlbnRFbnRpdHkuY291bnQpIHsKKwkJICAgIGxvYWQoMCwgZmFsc2UpOworCQl9CisJICAgIH0KKwl9CisKKwlyZXR1cm4gZW50aXR5Q2hhbmdlZDsKKworICAgIH0KKworICAgIC8vIEFkYXB0ZWQgZnJvbToKKyAgICAvLyBvcmcuYXBhY2hlLnhlcmNlcy5pbXBsLlhNTEVudGl0eU1hbmFnZXIuUmV3aW5kYWJsZUlucHV0U3RyZWFtCisgICAgLyoqCisgICAgICogVGhpcyBjbGFzcyB3cmFwcyB0aGUgYnl0ZSBpbnB1dHN0cmVhbXMgd2UncmUgcHJlc2VudGVkIHdpdGguCisgICAgICogV2UgbmVlZCBpdCBiZWNhdXNlIGphdmEuaW8uSW5wdXRTdHJlYW1zIGRvbid0IHByb3ZpZGUKKyAgICAgKiBmdW5jdGlvbmFsaXR5IHRvIHJlcmVhZCBwcm9jZXNzZWQgYnl0ZXMsIGFuZCB0aGV5IGhhdmUgYSBoYWJpdAorICAgICAqIG9mIHJlYWRpbmcgbW9yZSB0aGFuIG9uZSBjaGFyYWN0ZXIgd2hlbiB5b3UgY2FsbCB0aGVpciByZWFkKCkKKyAgICAgKiBtZXRob2RzLiAgVGhpcyBtZWFucyB0aGF0LCBvbmNlIHdlIGRpc2NvdmVyIHRoZSB0cnVlIChkZWNsYXJlZCkKKyAgICAgKiBlbmNvZGluZyBvZiBhIGRvY3VtZW50LCB3ZSBjYW4gbmVpdGhlciBiYWNrdHJhY2sgdG8gcmVhZCB0aGUKKyAgICAgKiB3aG9sZSBkb2MgYWdhaW4gbm9yIHN0YXJ0IHJlYWRpbmcgd2hlcmUgd2UgYXJlIHdpdGggYSBuZXcKKyAgICAgKiByZWFkZXIuCisgICAgICoKKyAgICAgKiBUaGlzIGNsYXNzIGFsbG93cyByZXdpbmRpbmcgYW4gaW5wdXRTdHJlYW0gYnkgYWxsb3dpbmcgYSBtYXJrCisgICAgICogdG8gYmUgc2V0LCBhbmQgdGhlIHN0cmVhbSByZXNldCB0byB0aGF0IHBvc2l0aW9uLiAgPHN0cm9uZz5UaGUKKyAgICAgKiBjbGFzcyBhc3N1bWVzIHRoYXQgaXQgbmVlZHMgdG8gcmVhZCBvbmUgY2hhcmFjdGVyIHBlcgorICAgICAqIGludm9jYXRpb24gd2hlbiBpdCdzIHJlYWQoKSBtZXRob2QgaXMgaW5vdmtlZCwgYnV0IHVzZXMgdGhlCisgICAgICogdW5kZXJseWluZyBJbnB1dFN0cmVhbSdzIHJlYWQoY2hhcltdLCBvZmZzZXQgbGVuZ3RoKSBtZXRob2QtLWl0CisgICAgICogd29uJ3QgYnVmZmVyIGRhdGEgcmVhZCB0aGlzIHdheSE8L3N0cm9uZz4KKyAgICAgKgorICAgICAqIEBhdXRob3IgTmVpbCBHcmFoYW0sIElCTQorICAgICAqIEBhdXRob3IgR2xlbm4gTWFyY3ksIElCTQorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgY2xhc3MgUmV3aW5kYWJsZUlucHV0U3RyZWFtIGV4dGVuZHMgSW5wdXRTdHJlYW0geworCisgICAgICAgIHByaXZhdGUgSW5wdXRTdHJlYW0gZklucHV0U3RyZWFtOworICAgICAgICBwcml2YXRlIGJ5dGVbXSBmRGF0YTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgZlN0YXJ0T2Zmc2V0OworICAgICAgICBwcml2YXRlIGludCBmRW5kT2Zmc2V0OworICAgICAgICBwcml2YXRlIGludCBmT2Zmc2V0OworICAgICAgICBwcml2YXRlIGludCBmTGVuZ3RoOworICAgICAgICBwcml2YXRlIGludCBmTWFyazsKKworICAgICAgICBwdWJsaWMgUmV3aW5kYWJsZUlucHV0U3RyZWFtKElucHV0U3RyZWFtIGlzKSB7CisgICAgICAgICAgICBmRGF0YSA9IG5ldyBieXRlW0RFRkFVTFRfWE1MREVDTF9CVUZGRVJfU0laRV07CisgICAgICAgICAgICBmSW5wdXRTdHJlYW0gPSBpczsKKyAgICAgICAgICAgIGZTdGFydE9mZnNldCA9IDA7CisgICAgICAgICAgICBmRW5kT2Zmc2V0ID0gLTE7CisgICAgICAgICAgICBmT2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIGZMZW5ndGggPSAwOworICAgICAgICAgICAgZk1hcmsgPSAwOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0U3RhcnRPZmZzZXQoaW50IG9mZnNldCkgeworICAgICAgICAgICAgZlN0YXJ0T2Zmc2V0ID0gb2Zmc2V0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcmV3aW5kKCkgeworICAgICAgICAgICAgZk9mZnNldCA9IGZTdGFydE9mZnNldDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBpbnQgYiA9IDA7CisgICAgICAgICAgICBpZiAoZk9mZnNldCA8IGZMZW5ndGgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZkRhdGFbZk9mZnNldCsrXSAmIDB4ZmY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZk9mZnNldCA9PSBmRW5kT2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGZPZmZzZXQgPT0gZkRhdGEubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgYnl0ZVtdIG5ld0RhdGEgPSBuZXcgYnl0ZVtmT2Zmc2V0IDw8IDFdOworICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoZkRhdGEsIDAsIG5ld0RhdGEsIDAsIGZPZmZzZXQpOworICAgICAgICAgICAgICAgIGZEYXRhID0gbmV3RGF0YTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGIgPSBmSW5wdXRTdHJlYW0ucmVhZCgpOworICAgICAgICAgICAgaWYgKGIgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBmRW5kT2Zmc2V0ID0gZk9mZnNldDsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmRGF0YVtmTGVuZ3RoKytdID0gKGJ5dGUpYjsKKyAgICAgICAgICAgIGZPZmZzZXQrKzsKKyAgICAgICAgICAgIHJldHVybiBiICYgMHhmZjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgcmVhZChieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGludCBieXRlc0xlZnQgPSBmTGVuZ3RoIC0gZk9mZnNldDsKKyAgICAgICAgICAgIGlmIChieXRlc0xlZnQgPT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChmT2Zmc2V0ID09IGZFbmRPZmZzZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBiZXR0ZXIgZ2V0IHNvbWUgbW9yZSBmb3IgdGhlIHZvcmFjaW91cyByZWFkZXIuLi4KKyAgICAgICAgICAgICAgICBpZiAoZkN1cnJlbnRFbnRpdHkubWF5UmVhZENodW5rcykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZklucHV0U3RyZWFtLnJlYWQoYiwgb2ZmLCBsZW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnQgcmV0dXJuZWRWYWwgPSByZWFkKCk7CisgICAgICAgICAgICAgICAgaWYgKHJldHVybmVkVmFsID09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIGZFbmRPZmZzZXQgPSBmT2Zmc2V0OworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJbb2ZmXSA9IChieXRlKXJldHVybmVkVmFsOworICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGxlbiA8IGJ5dGVzTGVmdCkgeworICAgICAgICAgICAgICAgIGlmIChsZW4gPD0gMCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBsZW4gPSBieXRlc0xlZnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShmRGF0YSwgZk9mZnNldCwgYiwgb2ZmLCBsZW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZk9mZnNldCArPSBsZW47CisgICAgICAgICAgICByZXR1cm4gbGVuOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGxvbmcgc2tpcChsb25nIG4pCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgaW50IGJ5dGVzTGVmdDsKKyAgICAgICAgICAgIGlmIChuIDw9IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ5dGVzTGVmdCA9IGZMZW5ndGggLSBmT2Zmc2V0OworICAgICAgICAgICAgaWYgKGJ5dGVzTGVmdCA9PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGZPZmZzZXQgPT0gZkVuZE9mZnNldCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGZJbnB1dFN0cmVhbS5za2lwKG4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG4gPD0gYnl0ZXNMZWZ0KSB7CisgICAgICAgICAgICAgICAgZk9mZnNldCArPSBuOworICAgICAgICAgICAgICAgIHJldHVybiBuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZk9mZnNldCArPSBieXRlc0xlZnQ7CisgICAgICAgICAgICBpZiAoZk9mZnNldCA9PSBmRW5kT2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGJ5dGVzTGVmdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG4gLT0gYnl0ZXNMZWZ0OworCSAgICAvKgorCSAgICAgKiBJbiBhIG1hbm5lciBvZiBzcGVha2luZywgd2hlbiB0aGlzIGNsYXNzIGlzbid0IHBlcm1pdHRpbmcgbW9yZQorCSAgICAgKiB0aGFuIG9uZSBieXRlIGF0IGEgdGltZSB0byBiZSByZWFkLCBpdCBpcyAiYmxvY2tpbmciLiAgVGhlCisJICAgICAqIGF2YWlsYWJsZSgpIG1ldGhvZCBzaG91bGQgaW5kaWNhdGUgaG93IG11Y2ggY2FuIGJlIHJlYWQgd2l0aG91dAorCSAgICAgKiBibG9ja2luZywgc28gd2hpbGUgd2UncmUgaW4gdGhpcyBtb2RlLCBpdCBzaG91bGQgb25seSBpbmRpY2F0ZQorCSAgICAgKiB0aGF0IGJ5dGVzIGluIGl0cyBidWZmZXIgYXJlIGF2YWlsYWJsZTsgb3RoZXJ3aXNlLCB0aGUgcmVzdWx0IG9mCisJICAgICAqIGF2YWlsYWJsZSgpIG9uIHRoZSB1bmRlcmx5aW5nIElucHV0U3RyZWFtIGlzIGFwcHJvcHJpYXRlLgorCSAgICAgKi8KKyAgICAgICAgICAgIHJldHVybiBmSW5wdXRTdHJlYW0uc2tpcChuKSArIGJ5dGVzTGVmdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgYXZhaWxhYmxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGludCBieXRlc0xlZnQgPSBmTGVuZ3RoIC0gZk9mZnNldDsKKyAgICAgICAgICAgIGlmIChieXRlc0xlZnQgPT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChmT2Zmc2V0ID09IGZFbmRPZmZzZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gZkN1cnJlbnRFbnRpdHkubWF5UmVhZENodW5rcyA/IGZJbnB1dFN0cmVhbS5hdmFpbGFibGUoKQorCQkgICAgOiAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGJ5dGVzTGVmdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG1hcmsoaW50IGhvd011Y2gpIHsKKyAgICAgICAgICAgIGZNYXJrID0gZk9mZnNldDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgeworICAgICAgICAgICAgZk9mZnNldCA9IGZNYXJrOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gbWFya1N1cHBvcnRlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgaWYgKGZJbnB1dFN0cmVhbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZklucHV0U3RyZWFtLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgZklucHV0U3RyZWFtID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gLy8gZW5kIG9mIFJld2luZGFibGVJbnB1dFN0cmVhbSBjbGFzcworCisgICAgLy8gQWRhcHRlZCBmcm9tOgorICAgIC8vIG9yZy5hcGFjaGUueGVyY2VzLmltcGwuWE1MRG9jdW1lbnRTY2FubmVySW1wbC5kaXNwYXRjaAorICAgIHByaXZhdGUgdm9pZCBzY2FuWE1MRGVjbCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgSmFzcGVyRXhjZXB0aW9uIHsKKworCWlmIChza2lwU3RyaW5nKCI8P3htbCIpKSB7CisJICAgIGZNYXJrdXBEZXB0aCsrOworCSAgICAvLyBOT1RFOiBzcGVjaWFsIGNhc2Ugd2hlcmUgZG9jdW1lbnQgc3RhcnRzIHdpdGggYSBQSQorCSAgICAvLyAgICAgICB3aG9zZSBuYW1lIHN0YXJ0cyB3aXRoICJ4bWwiIChlLmcuICJ4bWxmb28iKQorCSAgICBpZiAoWE1MQ2hhci5pc05hbWUocGVla0NoYXIoKSkpIHsKKwkJZlN0cmluZ0J1ZmZlci5jbGVhcigpOworCQlmU3RyaW5nQnVmZmVyLmFwcGVuZCgieG1sIik7CisJCXdoaWxlIChYTUxDaGFyLmlzTmFtZShwZWVrQ2hhcigpKSkgeworCQkgICAgZlN0cmluZ0J1ZmZlci5hcHBlbmQoKGNoYXIpc2NhbkNoYXIoKSk7CisJCX0KKwkJU3RyaW5nIHRhcmdldCA9IGZTeW1ib2xUYWJsZS5hZGRTeW1ib2woZlN0cmluZ0J1ZmZlci5jaCwKKwkJCQkJCSAgICAgICBmU3RyaW5nQnVmZmVyLm9mZnNldCwKKwkJCQkJCSAgICAgICBmU3RyaW5nQnVmZmVyLmxlbmd0aCk7CisJCXNjYW5QSURhdGEodGFyZ2V0LCBmU3RyaW5nKTsKKwkgICAgfQorCisJICAgIC8vIHN0YW5kYXJkIFhNTCBkZWNsYXJhdGlvbgorCSAgICBlbHNlIHsKKwkJc2NhblhNTERlY2xPclRleHREZWNsKGZhbHNlKTsKKwkgICAgfQorCX0KKyAgICB9CisgICAgCisgICAgLy8gQWRhcHRlZCBmcm9tOgorICAgIC8vIG9yZy5hcGFjaGUueGVyY2VzLmltcGwuWE1MRG9jdW1lbnRGcmFnbWVudFNjYW5uZXJJbXBsLnNjYW5YTUxEZWNsT3JUZXh0RGVjbAorICAgIC8qKgorICAgICAqIFNjYW5zIGFuIFhNTCBvciB0ZXh0IGRlY2xhcmF0aW9uLgorICAgICAqIDxwPgorICAgICAqIDxwcmU+CisgICAgICogWzIzXSBYTUxEZWNsIDo6PSAnJmx0Oz94bWwnIFZlcnNpb25JbmZvIEVuY29kaW5nRGVjbD8gU0REZWNsPyBTPyAnPz4nCisgICAgICogWzI0XSBWZXJzaW9uSW5mbyA6Oj0gUyAndmVyc2lvbicgRXEgKCcgVmVyc2lvbk51bSAnIHwgIiBWZXJzaW9uTnVtICIpCisgICAgICogWzgwXSBFbmNvZGluZ0RlY2wgOjo9IFMgJ2VuY29kaW5nJyBFcSAoJyInIEVuY05hbWUgJyInIHwgICInIiBFbmNOYW1lICInIiApCisgICAgICogWzgxXSBFbmNOYW1lIDo6PSBbQS1aYS16XSAoW0EtWmEtejAtOS5fXSB8ICctJykqCisgICAgICogWzMyXSBTRERlY2wgOjo9IFMgJ3N0YW5kYWxvbmUnIEVxICgoIiciICgneWVzJyB8ICdubycpICInIikKKyAgICAgKiAgICAgICAgICAgICAgICAgfCAoJyInICgneWVzJyB8ICdubycpICciJykpCisgICAgICoKKyAgICAgKiBbNzddIFRleHREZWNsIDo6PSAnJmx0Oz94bWwnIFZlcnNpb25JbmZvPyBFbmNvZGluZ0RlY2wgUz8gJz8+JworICAgICAqIDwvcHJlPgorICAgICAqCisgICAgICogQHBhcmFtIHNjYW5uaW5nVGV4dERlY2wgVHJ1ZSBpZiBhIHRleHQgZGVjbGFyYXRpb24gaXMgdG8KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBiZSBzY2FubmVkIGluc3RlYWQgb2YgYW4gWE1MCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgZGVjbGFyYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNjYW5YTUxEZWNsT3JUZXh0RGVjbChib29sZWFuIHNjYW5uaW5nVGV4dERlY2wpIAorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEphc3BlckV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gc2NhbiBkZWNsCisgICAgICAgIHNjYW5YTUxEZWNsT3JUZXh0RGVjbChzY2FubmluZ1RleHREZWNsLCBmU3RyaW5ncyk7CisgICAgICAgIGZNYXJrdXBEZXB0aC0tOworCisgICAgICAgIC8vIHBzZXVkby1hdHRyaWJ1dGUgdmFsdWVzCisgICAgICAgIFN0cmluZyBlbmNvZGluZ1BzZXVkb0F0dHIgPSBmU3RyaW5nc1sxXTsKKworICAgICAgICAvLyBzZXQgZW5jb2Rpbmcgb24gcmVhZGVyCisgICAgICAgIGlmIChlbmNvZGluZ1BzZXVkb0F0dHIgIT0gbnVsbCkgeworICAgICAgICAgICAgaXNFbmNvZGluZ1NldEluUHJvbG9nID0gdHJ1ZTsKKwkgICAgZW5jb2RpbmcgPSBlbmNvZGluZ1BzZXVkb0F0dHI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBBZGFwdGVkIGZyb206CisgICAgLy8gb3JnLmFwYWNoZS54ZXJjZXMuaW1wbC5YTUxTY2FubmVyLnNjYW5YTUxEZWNsT3JUZXh0RGVjbAorICAgIC8qKgorICAgICAqIFNjYW5zIGFuIFhNTCBvciB0ZXh0IGRlY2xhcmF0aW9uLgorICAgICAqIDxwPgorICAgICAqIDxwcmU+CisgICAgICogWzIzXSBYTUxEZWNsIDo6PSAnPD94bWwnIFZlcnNpb25JbmZvIEVuY29kaW5nRGVjbD8gU0REZWNsPyBTPyAnPz4nCisgICAgICogWzI0XSBWZXJzaW9uSW5mbyA6Oj0gUyAndmVyc2lvbicgRXEgKCcgVmVyc2lvbk51bSAnIHwgIiBWZXJzaW9uTnVtICIpCisgICAgICogWzgwXSBFbmNvZGluZ0RlY2wgOjo9IFMgJ2VuY29kaW5nJyBFcSAoJyInIEVuY05hbWUgJyInIHwgICInIiBFbmNOYW1lICInIiApCisgICAgICogWzgxXSBFbmNOYW1lIDo6PSBbQS1aYS16XSAoW0EtWmEtejAtOS5fXSB8ICctJykqCisgICAgICogWzMyXSBTRERlY2wgOjo9IFMgJ3N0YW5kYWxvbmUnIEVxICgoIiciICgneWVzJyB8ICdubycpICInIikKKyAgICAgKiAgICAgICAgICAgICAgICAgfCAoJyInICgneWVzJyB8ICdubycpICciJykpCisgICAgICoKKyAgICAgKiBbNzddIFRleHREZWNsIDo6PSAnPD94bWwnIFZlcnNpb25JbmZvPyBFbmNvZGluZ0RlY2wgUz8gJz8+JworICAgICAqIDwvcHJlPgorICAgICAqCisgICAgICogQHBhcmFtIHNjYW5uaW5nVGV4dERlY2wgVHJ1ZSBpZiBhIHRleHQgZGVjbGFyYXRpb24gaXMgdG8KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBiZSBzY2FubmVkIGluc3RlYWQgb2YgYW4gWE1MCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgZGVjbGFyYXRpb24uCisgICAgICogQHBhcmFtIHBzZXVkb0F0dHJpYnV0ZVZhbHVlcyBBbiBhcnJheSBvZiBzaXplIDMgdG8gcmV0dXJuIHRoZSB2ZXJzaW9uLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nIGFuZCBzdGFuZGFsb25lIHBzZXVkbyBhdHRyaWJ1dGUgdmFsdWVzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgKGluIHRoYXQgb3JkZXIpLgorICAgICAqCisgICAgICogPHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBUaGlzIG1ldGhvZCB1c2VzIGZTdHJpbmcsIGFueXRoaW5nIGluIGl0CisgICAgICogYXQgdGhlIHRpbWUgb2YgY2FsbGluZyBpcyBsb3N0LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzY2FuWE1MRGVjbE9yVGV4dERlY2woYm9vbGVhbiBzY2FubmluZ1RleHREZWNsLAorCQkJCSAgICAgICBTdHJpbmdbXSBwc2V1ZG9BdHRyaWJ1dGVWYWx1ZXMpIAorICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgSmFzcGVyRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBwc2V1ZG8tYXR0cmlidXRlIHZhbHVlcworICAgICAgICBTdHJpbmcgdmVyc2lvbiA9IG51bGw7CisgICAgICAgIFN0cmluZyBlbmNvZGluZyA9IG51bGw7CisgICAgICAgIFN0cmluZyBzdGFuZGFsb25lID0gbnVsbDsKKworICAgICAgICAvLyBzY2FuIHBzZXVkby1hdHRyaWJ1dGVzCisgICAgICAgIGZpbmFsIGludCBTVEFURV9WRVJTSU9OID0gMDsKKyAgICAgICAgZmluYWwgaW50IFNUQVRFX0VOQ09ESU5HID0gMTsKKyAgICAgICAgZmluYWwgaW50IFNUQVRFX1NUQU5EQUxPTkUgPSAyOworICAgICAgICBmaW5hbCBpbnQgU1RBVEVfRE9ORSA9IDM7CisgICAgICAgIGludCBzdGF0ZSA9IFNUQVRFX1ZFUlNJT047CisKKyAgICAgICAgYm9vbGVhbiBkYXRhRm91bmRGb3JUYXJnZXQgPSBmYWxzZTsKKyAgICAgICAgYm9vbGVhbiBzYXdTcGFjZSA9IHNraXBTcGFjZXMoKTsKKyAgICAgICAgd2hpbGUgKHBlZWtDaGFyKCkgIT0gJz8nKSB7CisgICAgICAgICAgICBkYXRhRm91bmRGb3JUYXJnZXQgPSB0cnVlOworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBzY2FuUHNldWRvQXR0cmlidXRlKHNjYW5uaW5nVGV4dERlY2wsIGZTdHJpbmcpOworICAgICAgICAgICAgc3dpdGNoIChzdGF0ZSkgeworICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVfVkVSU0lPTjogeworICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSA9PSBmVmVyc2lvblN5bWJvbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzYXdTcGFjZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydEZhdGFsRXJyb3Ioc2Nhbm5pbmdUZXh0RGVjbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAianNwLmVycm9yLnhtbC5zcGFjZVJlcXVpcmVkQmVmb3JlVmVyc2lvbkluVGV4dERlY2wiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJqc3AuZXJyb3IueG1sLnNwYWNlUmVxdWlyZWRCZWZvcmVWZXJzaW9uSW5YTUxEZWNsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbiA9IGZTdHJpbmcudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gU1RBVEVfRU5DT0RJTkc7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXZlcnNpb24uZXF1YWxzKCIxLjAiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJFVklTSVQ6IFhNTCBSRUMgc2F5cyB3ZSBzaG91bGQgdGhyb3cgYW4gZXJyb3IKKwkJCSAgICAvLyBpbiBzdWNoIGNhc2VzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvbWUgbWF5IG9iamVjdCB0aGUgdGhyb3dpbmcgb2YgZmF0YWxFcnJvci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIuanNwRXJyb3IoImpzcC5lcnJvci54bWwudmVyc2lvbk5vdFN1cHBvcnRlZCIsCisJCQkJCSB2ZXJzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lID09IGZFbmNvZGluZ1N5bWJvbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzY2FubmluZ1RleHREZWNsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKCJqc3AuZXJyb3IueG1sLnZlcnNpb25JbmZvUmVxdWlyZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2F3U3BhY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRGYXRhbEVycm9yKHNjYW5uaW5nVGV4dERlY2wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAianNwLmVycm9yLnhtbC5zcGFjZVJlcXVpcmVkQmVmb3JlRW5jb2RpbmdJblRleHREZWNsIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJqc3AuZXJyb3IueG1sLnNwYWNlUmVxdWlyZWRCZWZvcmVFbmNvZGluZ0luWE1MRGVjbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nID0gZlN0cmluZy50b1N0cmluZygpOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBzY2FubmluZ1RleHREZWNsID8gU1RBVEVfRE9ORSA6IFNUQVRFX1NUQU5EQUxPTkU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2Nhbm5pbmdUZXh0RGVjbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcigianNwLmVycm9yLnhtbC5lbmNvZGluZ0RlY2xSZXF1aXJlZCIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKCJqc3AuZXJyb3IueG1sLnZlcnNpb25JbmZvUmVxdWlyZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBTVEFURV9FTkNPRElORzogeworICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSA9PSBmRW5jb2RpbmdTeW1ib2wpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2F3U3BhY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRGYXRhbEVycm9yKHNjYW5uaW5nVGV4dERlY2wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAianNwLmVycm9yLnhtbC5zcGFjZVJlcXVpcmVkQmVmb3JlRW5jb2RpbmdJblRleHREZWNsIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJqc3AuZXJyb3IueG1sLnNwYWNlUmVxdWlyZWRCZWZvcmVFbmNvZGluZ0luWE1MRGVjbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nID0gZlN0cmluZy50b1N0cmluZygpOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBzY2FubmluZ1RleHREZWNsID8gU1RBVEVfRE9ORSA6IFNUQVRFX1NUQU5EQUxPTkU7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBjaGVjayBlbmNvZGluZyBuYW1lOyBzZXQgZW5jb2Rpbmcgb24KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgIGVudGl0eSBzY2FubmVyCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXNjYW5uaW5nVGV4dERlY2wgJiYgbmFtZSA9PSBmU3RhbmRhbG9uZVN5bWJvbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzYXdTcGFjZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcigianNwLmVycm9yLnhtbC5zcGFjZVJlcXVpcmVkQmVmb3JlU3RhbmRhbG9uZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhbmRhbG9uZSA9IGZTdHJpbmcudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gU1RBVEVfRE9ORTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RhbmRhbG9uZS5lcXVhbHMoInllcyIpICYmICFzdGFuZGFsb25lLmVxdWFscygibm8iKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcigianNwLmVycm9yLnhtbC5zZERlY2xJbnZhbGlkIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlcnIuanNwRXJyb3IoImpzcC5lcnJvci54bWwuZW5jb2RpbmdEZWNsUmVxdWlyZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBTVEFURV9TVEFOREFMT05FOiB7CisgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lID09IGZTdGFuZGFsb25lU3ltYm9sKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNhd1NwYWNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKCJqc3AuZXJyb3IueG1sLnNwYWNlUmVxdWlyZWRCZWZvcmVTdGFuZGFsb25lIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBzdGFuZGFsb25lID0gZlN0cmluZy50b1N0cmluZygpOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBTVEFURV9ET05FOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGFuZGFsb25lLmVxdWFscygieWVzIikgJiYgIXN0YW5kYWxvbmUuZXF1YWxzKCJubyIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKCJqc3AuZXJyb3IueG1sLnNkRGVjbEludmFsaWQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKwkJCWVyci5qc3BFcnJvcigianNwLmVycm9yLnhtbC5lbmNvZGluZ0RlY2xSZXF1aXJlZCIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcigianNwLmVycm9yLnhtbC5ub01vcmVQc2V1ZG9BdHRyaWJ1dGVzIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc2F3U3BhY2UgPSBza2lwU3BhY2VzKCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gUkVWSVNJVDogc2hvdWxkIHdlIHJlbW92ZSB0aGlzIGVycm9yIHJlcG9ydGluZz8KKyAgICAgICAgaWYgKHNjYW5uaW5nVGV4dERlY2wgJiYgc3RhdGUgIT0gU1RBVEVfRE9ORSkgeworICAgICAgICAgICAgZXJyLmpzcEVycm9yKCJqc3AuZXJyb3IueG1sLm1vcmVQc2V1ZG9BdHRyaWJ1dGVzIik7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIElmIHRoZXJlIGlzIG5vIGRhdGEgaW4gdGhlIHhtbCBvciB0ZXh0IGRlY2wgdGhlbiB3ZSBmYWlsIHRvIHJlcG9ydAorCS8vIGVycm9yIGZvciB2ZXJzaW9uIG9yIGVuY29kaW5nIGluZm8gYWJvdmUuCisgICAgICAgIGlmIChzY2FubmluZ1RleHREZWNsKSB7CisgICAgICAgICAgICBpZiAoIWRhdGFGb3VuZEZvclRhcmdldCAmJiBlbmNvZGluZyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgZXJyLmpzcEVycm9yKCJqc3AuZXJyb3IueG1sLmVuY29kaW5nRGVjbFJlcXVpcmVkIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIWRhdGFGb3VuZEZvclRhcmdldCAmJiB2ZXJzaW9uID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBlcnIuanNwRXJyb3IoImpzcC5lcnJvci54bWwudmVyc2lvbkluZm9SZXF1aXJlZCIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gZW5kCisgICAgICAgIGlmICghc2tpcENoYXIoJz8nKSkgeworICAgICAgICAgICAgZXJyLmpzcEVycm9yKCJqc3AuZXJyb3IueG1sLnhtbERlY2xVbnRlcm1pbmF0ZWQiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXNraXBDaGFyKCc+JykpIHsKKyAgICAgICAgICAgIGVyci5qc3BFcnJvcigianNwLmVycm9yLnhtbC54bWxEZWNsVW50ZXJtaW5hdGVkIik7CisKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gZmlsbCBpbiByZXR1cm4gYXJyYXkKKyAgICAgICAgcHNldWRvQXR0cmlidXRlVmFsdWVzWzBdID0gdmVyc2lvbjsKKyAgICAgICAgcHNldWRvQXR0cmlidXRlVmFsdWVzWzFdID0gZW5jb2Rpbmc7CisgICAgICAgIHBzZXVkb0F0dHJpYnV0ZVZhbHVlc1syXSA9IHN0YW5kYWxvbmU7CisgICAgfQorCisgICAgLy8gQWRhcHRlZCBmcm9tOgorICAgIC8vIG9yZy5hcGFjaGUueGVyY2VzLmltcGwuWE1MU2Nhbm5lci5zY2FuUHNldWRvQXR0cmlidXRlCisgICAgLyoqCisgICAgICogU2NhbnMgYSBwc2V1ZG8gYXR0cmlidXRlLgorICAgICAqCisgICAgICogQHBhcmFtIHNjYW5uaW5nVGV4dERlY2wgVHJ1ZSBpZiBzY2FubmluZyB0aGlzIHBzZXVkby1hdHRyaWJ1dGUgZm9yIGEKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0RGVjbDsgZmFsc2UgaWYgc2Nhbm5pbmcgWE1MRGVjbC4gVGhpcyAKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnIGlzIG5lZWRlZCB0byByZXBvcnQgdGhlIGNvcnJlY3QgdHlwZSBvZgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLgorICAgICAqIEBwYXJhbSB2YWx1ZSAgICAgICAgICAgIFRoZSBzdHJpbmcgdG8gZmlsbCBpbiB3aXRoIHRoZSBhdHRyaWJ1dGUgCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUKKyAgICAgKgorICAgICAqIDxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gVGhpcyBtZXRob2QgdXNlcyBmU3RyaW5nQnVmZmVyMiwgYW55dGhpbmcgaW4gaXQKKyAgICAgKiBhdCB0aGUgdGltZSBvZiBjYWxsaW5nIGlzIGxvc3QuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBzY2FuUHNldWRvQXR0cmlidXRlKGJvb2xlYW4gc2Nhbm5pbmdUZXh0RGVjbCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFN0cmluZyB2YWx1ZSkgCisgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBKYXNwZXJFeGNlcHRpb24geworCisgICAgICAgIFN0cmluZyBuYW1lID0gc2Nhbk5hbWUoKTsKKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgZXJyLmpzcEVycm9yKCJqc3AuZXJyb3IueG1sLnBzZXVkb0F0dHJOYW1lRXhwZWN0ZWQiKTsKKyAgICAgICAgfQorICAgICAgICBza2lwU3BhY2VzKCk7CisgICAgICAgIGlmICghc2tpcENoYXIoJz0nKSkgeworICAgICAgICAgICAgcmVwb3J0RmF0YWxFcnJvcihzY2FubmluZ1RleHREZWNsID8KKwkJCSAgICAgImpzcC5lcnJvci54bWwuZXFSZXF1aXJlZEluVGV4dERlY2wiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogImpzcC5lcnJvci54bWwuZXFSZXF1aXJlZEluWE1MRGVjbCIsCisJCQkgICAgIG5hbWUpOworICAgICAgICB9CisgICAgICAgIHNraXBTcGFjZXMoKTsKKyAgICAgICAgaW50IHF1b3RlID0gcGVla0NoYXIoKTsKKyAgICAgICAgaWYgKHF1b3RlICE9ICdcJycgJiYgcXVvdGUgIT0gJyInKSB7CisgICAgICAgICAgICByZXBvcnRGYXRhbEVycm9yKHNjYW5uaW5nVGV4dERlY2wgPworCQkJICAgICAianNwLmVycm9yLnhtbC5xdW90ZVJlcXVpcmVkSW5UZXh0RGVjbCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAianNwLmVycm9yLnhtbC5xdW90ZVJlcXVpcmVkSW5YTUxEZWNsIiAsCisJCQkgICAgIG5hbWUpOworICAgICAgICB9CisgICAgICAgIHNjYW5DaGFyKCk7CisgICAgICAgIGludCBjID0gc2NhbkxpdGVyYWwocXVvdGUsIHZhbHVlKTsKKyAgICAgICAgaWYgKGMgIT0gcXVvdGUpIHsKKyAgICAgICAgICAgIGZTdHJpbmdCdWZmZXIyLmNsZWFyKCk7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgZlN0cmluZ0J1ZmZlcjIuYXBwZW5kKHZhbHVlKTsKKyAgICAgICAgICAgICAgICBpZiAoYyAhPSAtMSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PSAnJicgfHwgYyA9PSAnJScgfHwgYyA9PSAnPCcgfHwgYyA9PSAnXScpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZTdHJpbmdCdWZmZXIyLmFwcGVuZCgoY2hhcilzY2FuQ2hhcigpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChYTUxDaGFyLmlzSGlnaFN1cnJvZ2F0ZShjKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2NhblN1cnJvZ2F0ZXMoZlN0cmluZ0J1ZmZlcjIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKFhNTENoYXIuaXNJbnZhbGlkKGMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gc2Nhbm5pbmdUZXh0RGVjbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gImpzcC5lcnJvci54bWwuaW52YWxpZENoYXJJblRleHREZWNsIgorCQkJICAgIDogImpzcC5lcnJvci54bWwuaW52YWxpZENoYXJJblhNTERlY2wiOworICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0RmF0YWxFcnJvcihrZXksIEludGVnZXIudG9TdHJpbmcoYywgMTYpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5DaGFyKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYyA9IHNjYW5MaXRlcmFsKHF1b3RlLCB2YWx1ZSk7CisgICAgICAgICAgICB9IHdoaWxlIChjICE9IHF1b3RlKTsKKyAgICAgICAgICAgIGZTdHJpbmdCdWZmZXIyLmFwcGVuZCh2YWx1ZSk7CisgICAgICAgICAgICB2YWx1ZS5zZXRWYWx1ZXMoZlN0cmluZ0J1ZmZlcjIpOworICAgICAgICB9CisgICAgICAgIGlmICghc2tpcENoYXIocXVvdGUpKSB7CisgICAgICAgICAgICByZXBvcnRGYXRhbEVycm9yKHNjYW5uaW5nVGV4dERlY2wgPworCQkJICAgICAianNwLmVycm9yLnhtbC5jbG9zZVF1b3RlTWlzc2luZ0luVGV4dERlY2wiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogImpzcC5lcnJvci54bWwuY2xvc2VRdW90ZU1pc3NpbmdJblhNTERlY2wiLAorCQkJICAgICBuYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHJldHVybgorICAgICAgICByZXR1cm4gbmFtZTsKKworICAgIH0KKyAgICAKKyAgICAvLyBBZGFwdGVkIGZyb206CisgICAgLy8gb3JnLmFwYWNoZS54ZXJjZXMuaW1wbC5YTUxTY2FubmVyLnNjYW5QSURhdGEKKyAgICAvKioKKyAgICAgKiBTY2FucyBhIHByb2Nlc3NpbmcgZGF0YS4gVGhpcyBpcyBuZWVkZWQgdG8gaGFuZGxlIHRoZSBzaXR1YXRpb24KKyAgICAgKiB3aGVyZSBhIGRvY3VtZW50IHN0YXJ0cyB3aXRoIGEgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiB3aG9zZSAKKyAgICAgKiB0YXJnZXQgbmFtZSA8ZW0+c3RhcnRzIHdpdGg8L2VtPiAieG1sIi4gKGUuZy4geG1sZm9vKQorICAgICAqCisgICAgICogPHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBUaGlzIG1ldGhvZCB1c2VzIGZTdHJpbmdCdWZmZXIsIGFueXRoaW5nIGluIGl0CisgICAgICogYXQgdGhlIHRpbWUgb2YgY2FsbGluZyBpcyBsb3N0LgorICAgICAqCisgICAgICogQHBhcmFtIHRhcmdldCBUaGUgUEkgdGFyZ2V0CisgICAgICogQHBhcmFtIGRhdGEgVGhlIHN0cmluZyB0byBmaWxsIGluIHdpdGggdGhlIGRhdGEKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2NhblBJRGF0YShTdHJpbmcgdGFyZ2V0LCBYTUxTdHJpbmcgZGF0YSkgCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgSmFzcGVyRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBjaGVjayB0YXJnZXQKKyAgICAgICAgaWYgKHRhcmdldC5sZW5ndGgoKSA9PSAzKSB7CisgICAgICAgICAgICBjaGFyIGMwID0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHRhcmdldC5jaGFyQXQoMCkpOworICAgICAgICAgICAgY2hhciBjMSA9IENoYXJhY3Rlci50b0xvd2VyQ2FzZSh0YXJnZXQuY2hhckF0KDEpKTsKKyAgICAgICAgICAgIGNoYXIgYzIgPSBDaGFyYWN0ZXIudG9Mb3dlckNhc2UodGFyZ2V0LmNoYXJBdCgyKSk7CisgICAgICAgICAgICBpZiAoYzAgPT0gJ3gnICYmIGMxID09ICdtJyAmJiBjMiA9PSAnbCcpIHsKKyAgICAgICAgICAgICAgICBlcnIuanNwRXJyb3IoImpzcC5lcnJvci54bWwucmVzZXJ2ZWRQSVRhcmdldCIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gc3BhY2VzCisgICAgICAgIGlmICghc2tpcFNwYWNlcygpKSB7CisgICAgICAgICAgICBpZiAoc2tpcFN0cmluZygiPz4iKSkgeworICAgICAgICAgICAgICAgIC8vIHdlIGZvdW5kIHRoZSBlbmQsIHRoZXJlIGlzIG5vIGRhdGEKKyAgICAgICAgICAgICAgICBkYXRhLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gaWYgdGhlcmUgaXMgZGF0YSB0aGVyZSBzaG91bGQgYmUgc29tZSBzcGFjZQorICAgICAgICAgICAgICAgIGVyci5qc3BFcnJvcigianNwLmVycm9yLnhtbC5zcGFjZVJlcXVpcmVkSW5QSSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZlN0cmluZ0J1ZmZlci5jbGVhcigpOworICAgICAgICAvLyBkYXRhCisgICAgICAgIGlmIChzY2FuRGF0YSgiPz4iLCBmU3RyaW5nQnVmZmVyKSkgeworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGludCBjID0gcGVla0NoYXIoKTsKKyAgICAgICAgICAgICAgICBpZiAoYyAhPSAtMSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoWE1MQ2hhci5pc0hpZ2hTdXJyb2dhdGUoYykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5TdXJyb2dhdGVzKGZTdHJpbmdCdWZmZXIpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFhNTENoYXIuaXNJbnZhbGlkKGMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlcnIuanNwRXJyb3IoImpzcC5lcnJvci54bWwuaW52YWxpZENoYXJJblBJIiwKKwkJCQkgICAgIEludGVnZXIudG9IZXhTdHJpbmcoYykpOworICAgICAgICAgICAgICAgICAgICAgICAgc2NhbkNoYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUgKHNjYW5EYXRhKCI/PiIsIGZTdHJpbmdCdWZmZXIpKTsKKyAgICAgICAgfQorICAgICAgICBkYXRhLnNldFZhbHVlcyhmU3RyaW5nQnVmZmVyKTsKKworICAgIH0KKworICAgIC8vIEFkYXB0ZWQgZnJvbToKKyAgICAvLyBvcmcuYXBhY2hlLnhlcmNlcy5pbXBsLlhNTFNjYW5uZXIuc2NhblN1cnJvZ2F0ZXMKKyAgICAvKioKKyAgICAgKiBTY2FucyBzdXJyb2dhdGVzIGFuZCBhcHBlbmQgdGhlbSB0byB0aGUgc3BlY2lmaWVkIGJ1ZmZlci4KKyAgICAgKiA8cD4KKyAgICAgKiA8c3Ryb25nPk5vdGU6PC9zdHJvbmc+IFRoaXMgYXNzdW1lcyB0aGUgY3VycmVudCBjaGFyIGhhcyBhbHJlYWR5IGJlZW4KKyAgICAgKiBpZGVudGlmaWVkIGFzIGEgaGlnaCBzdXJyb2dhdGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYnVmIFRoZSBTdHJpbmdCdWZmZXIgdG8gYXBwZW5kIHRoZSByZWFkIHN1cnJvZ2F0ZXMgdG8uCisgICAgICogQHJldHVybnMgVHJ1ZSBpZiBpdCBzdWNjZWVkZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHNjYW5TdXJyb2dhdGVzKFhNTFN0cmluZ0J1ZmZlciBidWYpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgSmFzcGVyRXhjZXB0aW9uIHsKKworICAgICAgICBpbnQgaGlnaCA9IHNjYW5DaGFyKCk7CisgICAgICAgIGludCBsb3cgPSBwZWVrQ2hhcigpOworICAgICAgICBpZiAoIVhNTENoYXIuaXNMb3dTdXJyb2dhdGUobG93KSkgeworICAgICAgICAgICAgZXJyLmpzcEVycm9yKCJqc3AuZXJyb3IueG1sLmludmFsaWRDaGFySW5Db250ZW50IiwKKwkJCSBJbnRlZ2VyLnRvU3RyaW5nKGhpZ2gsIDE2KSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgc2NhbkNoYXIoKTsKKworICAgICAgICAvLyBjb252ZXJ0IHN1cnJvZ2F0ZXMgdG8gc3VwcGxlbWVudGFsIGNoYXJhY3RlcgorICAgICAgICBpbnQgYyA9IFhNTENoYXIuc3VwcGxlbWVudGFsKChjaGFyKWhpZ2gsIChjaGFyKWxvdyk7CisKKyAgICAgICAgLy8gc3VwcGxlbWVudGFsIGNoYXJhY3RlciBtdXN0IGJlIGEgdmFsaWQgWE1MIGNoYXJhY3RlcgorICAgICAgICBpZiAoIVhNTENoYXIuaXNWYWxpZChjKSkgeworICAgICAgICAgICAgZXJyLmpzcEVycm9yKCJqc3AuZXJyb3IueG1sLmludmFsaWRDaGFySW5Db250ZW50IiwKKwkJCSBJbnRlZ2VyLnRvU3RyaW5nKGMsIDE2KSk7IAorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gZmlsbCBpbiB0aGUgYnVmZmVyCisgICAgICAgIGJ1Zi5hcHBlbmQoKGNoYXIpaGlnaCk7CisgICAgICAgIGJ1Zi5hcHBlbmQoKGNoYXIpbG93KTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIH0KKworICAgIC8vIEFkYXB0ZWQgZnJvbToKKyAgICAvLyBvcmcuYXBhY2hlLnhlcmNlcy5pbXBsLlhNTFNjYW5uZXIucmVwb3J0RmF0YWxFcnJvcgorICAgIC8qKgorICAgICAqIENvbnZlbmllbmNlIGZ1bmN0aW9uIHVzZWQgaW4gYWxsIFhNTCBzY2FubmVycy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcmVwb3J0RmF0YWxFcnJvcihTdHJpbmcgbXNnSWQsIFN0cmluZyBhcmcpCisgICAgICAgICAgICAgICAgdGhyb3dzIEphc3BlckV4Y2VwdGlvbiB7CisgICAgICAgIGVyci5qc3BFcnJvcihtc2dJZCwgYXJnKTsKKyAgICB9CisKK30KKworCmRpZmYgLS1naXQgYS9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIveG1scGFyc2VyL1hNTFN0cmluZy5qYXZhIGIvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3htbHBhcnNlci9YTUxTdHJpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGE3Y2JiCi0tLSAvZGV2L251bGwKKysrIGIvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3htbHBhcnNlci9YTUxTdHJpbmcuamF2YQpAQCAtMCwwICsxLDE5NiBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKKyAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcworICogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDE5OTksIEludGVybmF0aW9uYWwKKyAqIEJ1c2luZXNzIE1hY2hpbmVzLCBJbmMuLCBodHRwOi8vd3d3LmFwYWNoZS5vcmcuICBGb3IgbW9yZQorICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCisgKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphc3Blci54bWxwYXJzZXI7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyB1c2VkIGFzIGEgc3RydWN0dXJlIHRvIHBhc3MgdGV4dCBjb250YWluZWQgaW4gdGhlIHVuZGVybHlpbmcKKyAqIGNoYXJhY3RlciBidWZmZXIgb2YgdGhlIHNjYW5uZXIuIFRoZSBvZmZzZXQgYW5kIGxlbmd0aCBmaWVsZHMgYWxsb3cgdGhlCisgKiBidWZmZXIgdG8gYmUgcmUtdXNlZCB3aXRob3V0IGNyZWF0aW5nIG5ldyBjaGFyYWN0ZXIgYXJyYXlzLgorICogPHA+CisgKiA8c3Ryb25nPk5vdGU6PC9zdHJvbmc+IE1ldGhvZHMgdGhhdCBhcmUgcGFzc2VkIGFuIFhNTFN0cmluZyBzdHJ1Y3R1cmUKKyAqIHNob3VsZCBjb25zaWRlciB0aGUgY29udGVudHMgcmVhZC1vbmx5IGFuZCBub3QgbWFrZSBhbnkgbW9kaWZpY2F0aW9ucworICogdG8gdGhlIGNvbnRlbnRzIG9mIHRoZSBidWZmZXIuIFRoZSBtZXRob2QgcmVjZWl2aW5nIHRoaXMgc3RydWN0dXJlCisgKiBzaG91bGQgYWxzbyBub3QgbW9kaWZ5IHRoZSBvZmZzZXQgYW5kIGxlbmd0aCBpZiB0aGlzIHN0cnVjdHVyZSAob3IKKyAqIHRoZSB2YWx1ZXMgb2YgdGhpcyBzdHJ1Y3R1cmUpIGFyZSBwYXNzZWQgdG8gYW5vdGhlciBtZXRob2QuCisgKiA8cD4KKyAqIDxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gTWV0aG9kcyB0aGF0IGFyZSBwYXNzZWQgYW4gWE1MU3RyaW5nIHN0cnVjdHVyZQorICogYXJlIHJlcXVpcmVkIHRvIGNvcHkgdGhlIGluZm9ybWF0aW9uIG91dCBvZiB0aGUgYnVmZmVyIGlmIGl0IGlzIHRvIGJlCisgKiBzYXZlZCBmb3IgdXNlIGJleW9uZCB0aGUgc2NvcGUgb2YgdGhlIG1ldGhvZC4gVGhlIGNvbnRlbnRzIG9mIHRoZSAKKyAqIHN0cnVjdHVyZSBhcmUgdm9sYXRpbGUgYW5kIHRoZSBjb250ZW50cyBvZiB0aGUgY2hhcmFjdGVyIGJ1ZmZlciBjYW5ub3QKKyAqIGJlIGFzc3VyZWQgb25jZSB0aGUgbWV0aG9kIHRoYXQgaXMgcGFzc2VkIHRoaXMgc3RydWN0dXJlIHJldHVybnMuCisgKiBUaGVyZWZvcmUsIG1ldGhvZHMgcGFzc2VkIHRoaXMgc3RydWN0dXJlIHNob3VsZCBub3Qgc2F2ZSBhbnkgcmVmZXJlbmNlCisgKiB0byB0aGUgc3RydWN0dXJlIG9yIHRoZSBjaGFyYWN0ZXIgYXJyYXkgY29udGFpbmVkIGluIHRoZSBzdHJ1Y3R1cmUuCisgKgorICogQGF1dGhvciBFcmljIFllLCBJQk0KKyAqIEBhdXRob3IgQW5keSBDbGFyaywgSUJNCisgKgorICogQHZlcnNpb24gJElkJAorICovCitwdWJsaWMgY2xhc3MgWE1MU3RyaW5nIHsKKworICAgIC8vCisgICAgLy8gRGF0YQorICAgIC8vCisKKyAgICAvKiogVGhlIGNoYXJhY3RlciBhcnJheS4gKi8KKyAgICBwdWJsaWMgY2hhcltdIGNoOworCisgICAgLyoqIFRoZSBvZmZzZXQgaW50byB0aGUgY2hhcmFjdGVyIGFycmF5LiAqLworICAgIHB1YmxpYyBpbnQgb2Zmc2V0OworCisgICAgLyoqIFRoZSBsZW5ndGggb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBvZmZzZXQuICovCisgICAgcHVibGljIGludCBsZW5ndGg7CisKKyAgICAvLworICAgIC8vIENvbnN0cnVjdG9ycworICAgIC8vCisKKyAgICAvKiogRGVmYXVsdCBjb25zdHJ1Y3Rvci4gKi8KKyAgICBwdWJsaWMgWE1MU3RyaW5nKCkgeworICAgIH0gLy8gPGluaXQ+KCkKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYW4gWE1MU3RyaW5nIHN0cnVjdHVyZSBwcmVzZXQgd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgICogdmFsdWVzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBjaCAgICAgVGhlIGNoYXJhY3RlciBhcnJheS4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0IFRoZSBvZmZzZXQgaW50byB0aGUgY2hhcmFjdGVyIGFycmF5LgorICAgICAqIEBwYXJhbSBsZW5ndGggVGhlIGxlbmd0aCBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIG9mZnNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgWE1MU3RyaW5nKGNoYXJbXSBjaCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgeworICAgICAgICBzZXRWYWx1ZXMoY2gsIG9mZnNldCwgbGVuZ3RoKTsKKyAgICB9IC8vIDxpbml0PihjaGFyW10saW50LGludCkKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYW4gWE1MU3RyaW5nIHN0cnVjdHVyZSB3aXRoIGNvcGllcyBvZiB0aGUgdmFsdWVzIGluCisgICAgICogdGhlIGdpdmVuIHN0cnVjdHVyZS4KKyAgICAgKiA8cD4KKyAgICAgKiA8c3Ryb25nPk5vdGU6PC9zdHJvbmc+IFRoaXMgZG9lcyBub3QgY29weSB0aGUgY2hhcmFjdGVyIGFycmF5OworICAgICAqIG9ubHkgdGhlIHJlZmVyZW5jZSB0byB0aGUgYXJyYXkgaXMgY29waWVkLgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyBUaGUgWE1MU3RyaW5nIHRvIGNvcHkuCisgICAgICovCisgICAgcHVibGljIFhNTFN0cmluZyhYTUxTdHJpbmcgc3RyaW5nKSB7CisgICAgICAgIHNldFZhbHVlcyhzdHJpbmcpOworICAgIH0gLy8gPGluaXQ+KFhNTFN0cmluZykKKworICAgIC8vCisgICAgLy8gUHVibGljIG1ldGhvZHMKKyAgICAvLworCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBYTUxTdHJpbmcgc3RydWN0dXJlIHdpdGggdGhlCisgICAgICogc3BlY2lmaWVkIHZhbHVlcy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY2ggICAgIFRoZSBjaGFyYWN0ZXIgYXJyYXkuCisgICAgICogQHBhcmFtIG9mZnNldCBUaGUgb2Zmc2V0IGludG8gdGhlIGNoYXJhY3RlciBhcnJheS4KKyAgICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSBsZW5ndGggb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBvZmZzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VmFsdWVzKGNoYXJbXSBjaCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgeworICAgICAgICB0aGlzLmNoID0gY2g7CisgICAgICAgIHRoaXMub2Zmc2V0ID0gb2Zmc2V0OworICAgICAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDsKKyAgICB9IC8vIHNldFZhbHVlcyhjaGFyW10saW50LGludCkKKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemVzIHRoZSBjb250ZW50cyBvZiB0aGUgWE1MU3RyaW5nIHN0cnVjdHVyZSB3aXRoIGNvcGllcworICAgICAqIG9mIHRoZSBnaXZlbiBzdHJpbmcgc3RydWN0dXJlLgorICAgICAqIDxwPgorICAgICAqIDxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gVGhpcyBkb2VzIG5vdCBjb3B5IHRoZSBjaGFyYWN0ZXIgYXJyYXk7CisgICAgICogb25seSB0aGUgcmVmZXJlbmNlIHRvIHRoZSBhcnJheSBpcyBjb3BpZWQuCisgICAgICogCisgICAgICogQHBhcmFtIHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZXMoWE1MU3RyaW5nIHMpIHsKKyAgICAgICAgc2V0VmFsdWVzKHMuY2gsIHMub2Zmc2V0LCBzLmxlbmd0aCk7CisgICAgfSAvLyBzZXRWYWx1ZXMoWE1MU3RyaW5nKQorCisgICAgLyoqIFJlc2V0cyBhbGwgb2YgdGhlIHZhbHVlcyB0byB0aGVpciBkZWZhdWx0cy4gKi8KKyAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgdGhpcy5jaCA9IG51bGw7CisgICAgICAgIHRoaXMub2Zmc2V0ID0gMDsKKyAgICAgICAgdGhpcy5sZW5ndGggPSAtMTsKKyAgICB9IC8vIGNsZWFyKCkKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY29udGVudHMgb2YgdGhpcyBYTUxTdHJpbmcgc3RydWN0dXJlIGFuZAorICAgICAqIHRoZSBzcGVjaWZpZWQgYXJyYXkgYXJlIGVxdWFsLgorICAgICAqIAorICAgICAqIEBwYXJhbSBjaCAgICAgVGhlIGNoYXJhY3RlciBhcnJheS4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0IFRoZSBvZmZzZXQgaW50byB0aGUgY2hhcmFjdGVyIGFycmF5LgorICAgICAqIEBwYXJhbSBsZW5ndGggVGhlIGxlbmd0aCBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIG9mZnNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoY2hhcltdIGNoLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7CisgICAgICAgIGlmIChjaCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRoaXMubGVuZ3RoICE9IGxlbmd0aCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPGxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAodGhpcy5jaFt0aGlzLm9mZnNldCtpXSAhPSBjaFtvZmZzZXQraV0gKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0gLy8gZXF1YWxzKGNoYXJbXSxpbnQsaW50KTpib29sZWFuCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGNvbnRlbnRzIG9mIHRoaXMgWE1MU3RyaW5nIHN0cnVjdHVyZSBhbmQKKyAgICAgKiB0aGUgc3BlY2lmaWVkIHN0cmluZyBhcmUgZXF1YWwuCisgICAgICogCisgICAgICogQHBhcmFtIHMgVGhlIHN0cmluZyB0byBjb21wYXJlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhTdHJpbmcgcykgeworICAgICAgICBpZiAocyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBsZW5ndGggIT0gcy5sZW5ndGgoKSApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGlzIHRoaXMgZmFzdGVyIHRoYW4gY2FsbCBzLnRvQ2hhckFycmF5IGZpcnN0IGFuZCBjb21wYXJlIHRoZSAKKyAgICAgICAgLy8gdHdvIGFycmF5cyBkaXJlY3RseSwgd2hpY2ggd2lsbCBwb3NzaWJseSBpbnZvbHZlIGNyZWF0aW5nIGEKKyAgICAgICAgLy8gbmV3IGNoYXIgYXJyYXkgb2JqZWN0LgorICAgICAgICBmb3IgKGludCBpPTA7IGk8bGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChjaFtvZmZzZXQraV0gIT0gcy5jaGFyQXQoaSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IC8vIGVxdWFscyhTdHJpbmcpOmJvb2xlYW4KKworICAgIC8vCisgICAgLy8gT2JqZWN0IG1ldGhvZHMKKyAgICAvLworCisgICAgLyoqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIGxlbmd0aCA+IDAgPyBuZXcgU3RyaW5nKGNoLCBvZmZzZXQsIGxlbmd0aCkgOiAiIjsKKyAgICB9IC8vIHRvU3RyaW5nKCk6U3RyaW5nCisKK30gLy8gY2xhc3MgWE1MU3RyaW5nCmRpZmYgLS1naXQgYS9qYXNwZXIvamFzcGVyMi9zcmMvc2hhcmUvb3JnL2FwYWNoZS9qYXNwZXIveG1scGFyc2VyL1hNTFN0cmluZ0J1ZmZlci5qYXZhIGIvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3htbHBhcnNlci9YTUxTdHJpbmdCdWZmZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTU0MjYzCi0tLSAvZGV2L251bGwKKysrIGIvamFzcGVyL2phc3BlcjIvc3JjL3NoYXJlL29yZy9hcGFjaGUvamFzcGVyL3htbHBhcnNlci9YTUxTdHJpbmdCdWZmZXIuamF2YQpAQCAtMCwwICsxLDE3NSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5LDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKKyAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcworICogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDE5OTksIEludGVybmF0aW9uYWwKKyAqIEJ1c2luZXNzIE1hY2hpbmVzLCBJbmMuLCBodHRwOi8vd3d3LmFwYWNoZS5vcmcuICBGb3IgbW9yZQorICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCisgKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphc3Blci54bWxwYXJzZXI7CisKKy8qKgorICogWE1MU3RyaW5nIGlzIGEgc3RydWN0dXJlIHVzZWQgdG8gcGFzcyBjaGFyYWN0ZXIgYXJyYXlzLiBIb3dldmVyLAorICogWE1MU3RyaW5nQnVmZmVyIGlzIGEgYnVmZmVyIGluIHdoaWNoIGNoYXJhY3RlcnMgY2FuIGJlIGFwcGVuZGVkCisgKiBhbmQgZXh0ZW5kcyBYTUxTdHJpbmcgc28gdGhhdCBpdCBjYW4gYmUgcGFzc2VkIHRvIG1ldGhvZHMKKyAqIGV4cGVjdGluZyBhbiBYTUxTdHJpbmcgb2JqZWN0LiBUaGlzIGlzIGEgc2FmZSBvcGVyYXRpb24gYmVjYXVzZQorICogaXQgaXMgYXNzdW1lZCB0aGF0IGFueSBjYWxsZWUgd2lsbCA8c3Ryb25nPm5vdDwvc3Ryb25nPiBtb2RpZnkKKyAqIHRoZSBjb250ZW50cyBvZiB0aGUgWE1MU3RyaW5nIHN0cnVjdHVyZS4KKyAqIDxwPiAKKyAqIFRoZSBjb250ZW50cyBvZiB0aGUgc3RyaW5nIGFyZSBtYW5hZ2VkIGJ5IHRoZSBzdHJpbmcgYnVmZmVyLiBBcworICogY2hhcmFjdGVycyBhcmUgYXBwZW5kZWQsIHRoZSBzdHJpbmcgYnVmZmVyIHdpbGwgZ3JvdyBhcyBuZWVkZWQuCisgKiA8cD4KKyAqIDxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gTmV2ZXIgc2V0IHRoZSA8Y29kZT5jaDwvY29kZT4sIAorICogPGNvZGU+b2Zmc2V0PC9jb2RlPiwgYW5kIDxjb2RlPmxlbmd0aDwvY29kZT4gZmllbGRzIGRpcmVjdGx5LgorICogVGhlc2UgZmllbGRzIGFyZSBtYW5hZ2VkIGJ5IHRoZSBzdHJpbmcgYnVmZmVyLiBJbiBvcmRlciB0byByZXNldAorICogdGhlIGJ1ZmZlciwgY2FsbCA8Y29kZT5jbGVhcigpPC9jb2RlPi4KKyAqIAorICogQGF1dGhvciBBbmR5IENsYXJrLCBJQk0KKyAqIEBhdXRob3IgRXJpYyBZZSwgSUJNCisgKgorICogQHZlcnNpb24gJElkJAorICovCitwdWJsaWMgY2xhc3MgWE1MU3RyaW5nQnVmZmVyCisgICAgZXh0ZW5kcyBYTUxTdHJpbmcgeworCisgICAgLy8KKyAgICAvLyBDb25zdGFudHMKKyAgICAvLworCisgICAgLyoqIERlZmF1bHQgYnVmZmVyIHNpemUgKDMyKS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1NJWkUgPSAzMjsKKworICAgIC8vCisgICAgLy8gQ29uc3RydWN0b3JzCisgICAgLy8KKworICAgIC8qKgorICAgICAqIAorICAgICAqLworICAgIHB1YmxpYyBYTUxTdHJpbmdCdWZmZXIoKSB7CisgICAgICAgIHRoaXMoREVGQVVMVF9TSVpFKTsKKyAgICB9IC8vIDxpbml0PigpCisKKyAgICAvKioKKyAgICAgKiAKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc2l6ZSAKKyAgICAgKi8KKyAgICBwdWJsaWMgWE1MU3RyaW5nQnVmZmVyKGludCBzaXplKSB7CisgICAgICAgIGNoID0gbmV3IGNoYXJbc2l6ZV07CisgICAgfSAvLyA8aW5pdD4oaW50KQorCisgICAgLyoqIENvbnN0cnVjdHMgYSBzdHJpbmcgYnVmZmVyIGZyb20gYSBjaGFyLiAqLworICAgIHB1YmxpYyBYTUxTdHJpbmdCdWZmZXIoY2hhciBjKSB7CisgICAgICAgIHRoaXMoMSk7CisgICAgICAgIGFwcGVuZChjKTsKKyAgICB9IC8vIDxpbml0PihjaGFyKQorCisgICAgLyoqIENvbnN0cnVjdHMgYSBzdHJpbmcgYnVmZmVyIGZyb20gYSBTdHJpbmcuICovCisgICAgcHVibGljIFhNTFN0cmluZ0J1ZmZlcihTdHJpbmcgcykgeworICAgICAgICB0aGlzKHMubGVuZ3RoKCkpOworICAgICAgICBhcHBlbmQocyk7CisgICAgfSAvLyA8aW5pdD4oU3RyaW5nKQorCisgICAgLyoqIENvbnN0cnVjdHMgYSBzdHJpbmcgYnVmZmVyIGZyb20gdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXJyYXkuICovCisgICAgcHVibGljIFhNTFN0cmluZ0J1ZmZlcihjaGFyW10gY2gsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKKyAgICAgICAgdGhpcyhsZW5ndGgpOworICAgICAgICBhcHBlbmQoY2gsIG9mZnNldCwgbGVuZ3RoKTsKKyAgICB9IC8vIDxpbml0PihjaGFyW10saW50LGludCkKKworICAgIC8qKiBDb25zdHJ1Y3RzIGEgc3RyaW5nIGJ1ZmZlciBmcm9tIHRoZSBzcGVjaWZpZWQgWE1MU3RyaW5nLiAqLworICAgIHB1YmxpYyBYTUxTdHJpbmdCdWZmZXIoWE1MU3RyaW5nIHMpIHsKKyAgICAgICAgdGhpcyhzLmxlbmd0aCk7CisgICAgICAgIGFwcGVuZChzKTsKKyAgICB9IC8vIDxpbml0PihYTUxTdHJpbmcpCisKKyAgICAvLworICAgIC8vIFB1YmxpYyBtZXRob2RzCisgICAgLy8KKworICAgIC8qKiBDbGVhcnMgdGhlIHN0cmluZyBidWZmZXIuICovCisgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgICAgIG9mZnNldCA9IDA7CisgICAgICAgIGxlbmd0aCA9IDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogYXBwZW5kCisgICAgICogCisgICAgICogQHBhcmFtIGMgCisgICAgICovCisgICAgcHVibGljIHZvaWQgYXBwZW5kKGNoYXIgYykgeworICAgICAgICBpZiAodGhpcy5sZW5ndGggKyAxID4gdGhpcy5jaC5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IG5ld0xlbmd0aCA9IHRoaXMuY2gubGVuZ3RoKjI7CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXdMZW5ndGggPCB0aGlzLmNoLmxlbmd0aCArIERFRkFVTFRfU0laRSkKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0xlbmd0aCA9IHRoaXMuY2gubGVuZ3RoICsgREVGQVVMVF9TSVpFOworICAgICAgICAgICAgICAgICAgICBjaGFyW10gbmV3Y2ggPSBuZXcgY2hhcltuZXdMZW5ndGhdOworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHRoaXMuY2gsIDAsIG5ld2NoLCAwLCB0aGlzLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuY2ggPSBuZXdjaDsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmNoW3RoaXMubGVuZ3RoXSA9IGM7CisgICAgICAgIHRoaXMubGVuZ3RoKys7CisgICAgfSAvLyBhcHBlbmQoY2hhcikKKworICAgIC8qKgorICAgICAqIGFwcGVuZAorICAgICAqIAorICAgICAqIEBwYXJhbSBzIAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFwcGVuZChTdHJpbmcgcykgeworICAgICAgICBpbnQgbGVuZ3RoID0gcy5sZW5ndGgoKTsKKyAgICAgICAgaWYgKHRoaXMubGVuZ3RoICsgbGVuZ3RoID4gdGhpcy5jaC5sZW5ndGgpIHsKKyAgICAgICAgICAgIGludCBuZXdMZW5ndGggPSB0aGlzLmNoLmxlbmd0aCoyOworICAgICAgICAgICAgaWYgKG5ld0xlbmd0aCA8IHRoaXMubGVuZ3RoICsgbGVuZ3RoICsgREVGQVVMVF9TSVpFKQorICAgICAgICAgICAgICAgIG5ld0xlbmd0aCA9IHRoaXMuY2gubGVuZ3RoICsgbGVuZ3RoICsgREVGQVVMVF9TSVpFOworICAgICAgICAgICAgY2hhcltdIG5ld2NoID0gbmV3IGNoYXJbbmV3TGVuZ3RoXTsgICAgICAgICAgICAKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkodGhpcy5jaCwgMCwgbmV3Y2gsIDAsIHRoaXMubGVuZ3RoKTsKKyAgICAgICAgICAgIHRoaXMuY2ggPSBuZXdjaDsKKyAgICAgICAgfQorICAgICAgICBzLmdldENoYXJzKDAsIGxlbmd0aCwgdGhpcy5jaCwgdGhpcy5sZW5ndGgpOworICAgICAgICB0aGlzLmxlbmd0aCArPSBsZW5ndGg7CisgICAgfSAvLyBhcHBlbmQoU3RyaW5nKQorCisgICAgLyoqCisgICAgICogYXBwZW5kCisgICAgICogCisgICAgICogQHBhcmFtIGNoIAorICAgICAqIEBwYXJhbSBvZmZzZXQgCisgICAgICogQHBhcmFtIGxlbmd0aCAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhcHBlbmQoY2hhcltdIGNoLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7CisgICAgICAgIGlmICh0aGlzLmxlbmd0aCArIGxlbmd0aCA+IHRoaXMuY2gubGVuZ3RoKSB7CisgICAgICAgICAgICBjaGFyW10gbmV3Y2ggPSBuZXcgY2hhclt0aGlzLmNoLmxlbmd0aCArIGxlbmd0aCArIERFRkFVTFRfU0laRV07CisgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHRoaXMuY2gsIDAsIG5ld2NoLCAwLCB0aGlzLmxlbmd0aCk7CisgICAgICAgICAgICB0aGlzLmNoID0gbmV3Y2g7CisgICAgICAgIH0KKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShjaCwgb2Zmc2V0LCB0aGlzLmNoLCB0aGlzLmxlbmd0aCwgbGVuZ3RoKTsKKyAgICAgICAgdGhpcy5sZW5ndGggKz0gbGVuZ3RoOworICAgIH0gLy8gYXBwZW5kKGNoYXJbXSxpbnQsaW50KQorCisgICAgLyoqCisgICAgICogYXBwZW5kCisgICAgICogCisgICAgICogQHBhcmFtIHMgCisgICAgICovCisgICAgcHVibGljIHZvaWQgYXBwZW5kKFhNTFN0cmluZyBzKSB7CisgICAgICAgIGFwcGVuZChzLmNoLCBzLm9mZnNldCwgcy5sZW5ndGgpOworICAgIH0gLy8gYXBwZW5kKFhNTFN0cmluZykKKworfSAvLyBjbGFzcyBYTUxTdHJpbmdCdWZmZXIKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyLy5jdnNpZ25vcmUgYi9zZXJ2bGV0YXBpL2pzcjE1Mi8uY3ZzaWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiYzE1NzQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi8uY3ZzaWdub3JlCkBAIC0wLDAgKzEsNCBAQAorYnVpbGQKK2J1aWxkLnByb3BlcnRpZXMuc2FtcGxlCitkaXN0CitsaWIKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL0JVSUxESU5HLnR4dCBiL3NlcnZsZXRhcGkvanNyMTUyL0JVSUxESU5HLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDQ2YzU5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvQlVJTERJTkcudHh0CkBAIC0wLDAgKzEsMTM0IEBACiskSWQkCisKKworICAgICAgICAgICAgICAgQnVpbGRpbmcgVGhlIEphdmEgU2VydmxldCBhbmQgSlNQIEFQSSBDbGFzc2VzCisgICAgICAgICAgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhpcyBzdWJwcm9qZWN0IGNvbnRhaW5zIHRoZSBzb3VyY2UgY29kZSBmb3IgdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzZXMgb2YgdGhlCitKYXZhIFNlcnZsZXQgYW5kIEpTUCBBUElzIChwYWNrYWdlcyBqYXZheC5zZXJ2bGV0LCBqYXZheC5zZXJ2bGV0Lmh0dHAsCitqYXZheC5zZXJ2bGV0LmpzcCwgYW5kIGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dCkuICBJbiBvcmRlciB0byBidWlsZCB0aGVzZQorc291cmNlcyBzdWNjZXNzZnVsbHksIHlvdSBtdXN0IGRvIHRoZSBmb2xsb3dpbmc6CisKKworKDEpIERvd25sb2FkIGFuZCBJbnN0YWxsIHRoZSBBbnQgQmluYXJ5IERpc3RyaWJ1dGlvbgorCitOT1RFOiAgVGhlc2UgaW5zdHJ1Y3Rpb25zIGFzc3VtZSB0aGF0IHlvdSBhcmUgdXNpbmcgdGhlIEFudCAxLjMgcmVsZWFzZS4KK1Byb2NlZHVyZXMgZm9yIEFudCAxLjQgYW5kIGxhdGVyIHZlcnNpb25zIHNob3VsZCBiZSBzaW1pbGFyLCBidXQgaGF2ZSBub3QKK2JlZW4gdGVzdGVkLgorCisqIERvd25sb2FkIGEgYmluYXJ5IGRpc3RyaWJ1dGlvbiBvZiBBbnQgMS4zIGZyb206CisKKyAgICBodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2J1aWxkcy9qYWthcnRhLWFudC9yZWxlYXNlL3YxLjMvYmluLworCisgIE9uIGEgV2luZG93cyBwbGF0Zm9ybSwgeW91IHdpbGwgbmVlZDoKKyAgICBqYWthcnRhLWFudC0xLjMtYmluLnppcAorICAgIGpha2FydGEtYW50LTEuMy1vcHRpb25hbC5qYXIKKworICBPbiBhIFVuaXggcGxhdGZvcm0sIHlvdSB3aWxsIG5lZWQ6CisgICAgamFrYXJ0YS1hbnQtMS4zLWJpbi50YXIuZ3oKKyAgICBqYWthcnRhLWFudC0xLjMtb3B0aW9uYWwuamFyCisKKyogVW5wYWNrIHRoZSBiaW5hcnkgZGlzdHJpYnV0aW9uIGludG8gYSBjb252ZW5pZW50IGxvY2F0aW9uIHNvIHRoYXQgdGhlCisgIEFudCByZWxlYXNlIHJlc2lkZXMgaW4gaXRzIG93biBkaXJlY3RvcnkgKGNvbnZlbnRpb25hbGx5IG5hbWVkCisgICJqYWthcnRhLWFudC0xLjMiKS4gIEZvciB0aGUgcHVycG9zZXMgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGlzIGRvY3VtZW50LAorICB0aGUgc3ltYm9saWMgbmFtZSAiJHthbnQuaG9tZX0iIGlzIHVzZWQgdG8gcmVmZXIgdG8gdGhlIGZ1bGwgcGF0aG5hbWUgb2YKKyAgdGhlIHJlbGVhc2UgZGlyZWN0b3J5LgorCisqIENvcHkgdGhlIGZpbGUgImpha2FydGEtYW50LTEuMy1vcHRpb25hbC5qYXIiLCBkb3dubG9hZGVkIGFib3ZlLCBpbnRvCisgIHRoZSBkaXJlY3RvcnkgIiR7YW50LmhvbWV9L2xpYiIuICBUaGlzIG1ha2VzIGF2YWlsYWJsZSBzZXZlcmFsIEFudAorICBleHRlbnNpb24gY29tbWFuZHMgdGhhdCBhcmUgY29tbW9ubHkgcmVxdWlyZWQgd2hlbiBidWlsZGluZyBKYWthcnRhCisgIGJhc2VkIHByb2plY3RzLgorCisqIE1vZGlmeSB0aGUgUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBpbmNsdWRlIGRpcmVjdG9yeQorICAiJHthbnQuaG9tZX0vYmluIiBpbiBpdHMgbGlzdC4gIFRoaXMgbWFrZXMgdGhlICJhbnQiIGNvbW1hbmQgbGluZSBzY3JpcHQKKyAgYXZhaWxhYmxlLCB3aGljaCB3aWxsIGJlIHVzZWQgdG8gYWN0dWFsbHkgcGVyZm9ybSB0aGUgYnVpbGQuCisKKworKDIpIERvd25sb2FkIGFuZCBJbnN0YWxsIHRoZSBKQVhQLzEuMSBSZWZlcmVuY2UgSW1wbGVtZW50YXRpb24gKE9QVElPTkFMKQorCitOT1RFOiAgQWx0aG91Z2ggdGhpcyBzdGVwIGlzIG5vdCByZXF1aXJlZCB0byBidWlsZCB0aGlzIHBhcnRpY3VsYXIgc3VicHJvamVjdCwKK2l0IGlzIGNvbW1vbmx5IHJlcXVpcmVkIHRvIGJ1aWxkIG90aGVyIEpha2FydGEgcHJvamVjdHMuICBIZW5jZSwgdGhlIHN0ZXBzCityZXF1aXJlZCBhcmUgZG9jdW1lbnRlZCBoZXJlLgorCisqIERvd25sb2FkIGEgYmluYXJ5IGRpc3RyaWJ1dGlvbiBvZiBKQVhQIDEuMSAoRmluYWwgVmVyc2lvbikgZnJvbToKKworICAgIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2Rvd25sb2FkLmh0bWwKKworKiBVbnBhY2sgdGhlIGJpbmFyeSBkaXN0cmlidXRpb24gaW50byBhIGNvbnZlbmllbnQgbG9jYXRpb24gc28gdGhhdCB0aGUKKyAgSkFYUC8xLjEgcmVsZWFzZSByZXNpZGVzIGluIGl0cyBvd24gZGlyZWN0b3J5IChjb252ZW50aW9uYWxseSBuYW1lZAorICAiamF4cC0xLjEiLiAgRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGUgcmVtYWluZGVyIG9mIHRoaXMgZG9jdW1lbnQsIHRoZQorICBzeW1ib2xpYyBuYW1lICIke2pheHAuaG9tZX0iIGlzIHVzZWQgdG8gcmVmZXIgdG8gdGhlIGZ1bGwgcGF0aG5hbWUgb2YKKyAgdGhlIHJlbGVhc2UgZGlyZWN0b3J5LgorCisqIE1ha2UgdGhlIEpBUiBmaWxlcyBvZiB0aGlzIGRpc3RyaWJ1dGlvbiAoImNyaW1zb24uamFyIiwgImpheHAuamFyIiwgYW5kCisgICJ4YWxhbi5qYXIiKSBhdmFpbGFibGUgZm9yIHVzZSBieSBwZXJmb3JtaW5nIE9ORSBvZiB0aGUgZm9sbG93aW5nIG9wdGlvbnM6CisKKyAgLSBSZW1vdmUgdGhlIGV4aXN0aW5nICJqYXhwLmphciIgYW5kICJwYXJzZXIuamFyIiBmaWxlcyBmb3VuZCBpbiB0aGUKKyAgICAiJHthbnQuaG9tZX0vbGliIiBkaXJlY3RvcnksIGFuZCBjb3B5IHRoZXNlIEpBUiBmaWxlcyBpbnRvIHRoZQorICAgICIke2FudC5ob21lfS9saWIiIGRpcmVjdG9yeSAocHJlZmVyZWQgb3B0aW9uKS4KKworICAtIEFkZCB0aGVzZSBmaWxlcyB0byB5b3VyIENMQVNTUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKworCisoMykgRG93bmxvYWQgYW5kIEluc3RhbGwgU3VicHJvamVjdCBTb3VyY2UgQ29kZQorCisqIFVzZSBBbm9ueW1vdXMgQ1ZTIChhcyBkZXNjcmliZWQgb24gdGhlIEpha2FydGEgd2ViIHNpdGUgYXQKKyAgPGh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvc2l0ZS9jdnNpbmRleC5odG1sPiwgb3IKKyAgZG93bmxvYWQgYSBzb3VyY2UgZGlzdHJpYnV0aW9uIGZyb206CisKKyAgICBodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2J1aWxkcy9qYWthcnRhLXNlcnZsZXRhcGktNC9uaWdodGx5L3NyYy8KKworICBPbiBhIFdpbmRvd3MgcGxhdGZvcm0sIHlvdSB3aWxsIG5lZWQ6CisgICAgamFrYXJ0YS1zZXJ2bGV0YXBpLTQtc3JjLVlZWVlNTURELnppcAorCisgIE9uIGEgVW5peCBwbGF0Zm9ybSwgeW91IHdpbGwgbmVlZDoKKyAgICBqYWthcnRhLXNlcnZsZXRhcGktNC1zcmMtWVlZWU1NREQuemlwCisKKyAgKEFsdGVybmF0aXZlbHksIHlvdSBjYW4gZG93bmxvYWQgdGhlIFNlcnZsZXQgQVBJIHNvdXJjZSBkaXN0cmlidXRpb24KKyAgZnJvbSB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgeW91IGZpbmQgYSByZWxlYXNlZCB2ZXJzaW9uIG9mIFRvbWNhdCA0LgorICBTdWNoIGRpc3RyaWJ1dGlvbnMgd2lsbCBjb250YWluIGV4YWN0bHkgdGhlIFNlcnZsZXQgQVBJIGNsYXNzZXMgdXNlZAorICB0byBidWlsZCB0aGUgInNlcnZsZXQuamFyIiBmaWxlIGluc2lkZSB0aGF0IFRvbWNhdCBkaXN0cmlidXRpb24uKQorCisqIFVucGFjayB0aGUgc291cmNlIGRpc3RyaWJ1dGlvbiBpbnRvIGEgY29udmVuaWVudCBsb2NhdGlvbiBzbyB0aGF0IHRoZQorICBkaXN0cmlidXRpb24gcmVzaWRlcyBpbiBpdHMgb3duIGRpcmVjdG9yeSAoY29udmVudGlvbmFsbHkgbmFtZWQKKyAgImpha2FydGEtc2VydmxldGFwaS00IikuICBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoZSByZW1haW5kZXIgb2YgdGhpcyBkb2N1bWVudCwKKyAgdGhlIHN5bWJvbGljIG5hbWUgIiR7c2VydmxldGFwaS5zb3VyY2V9IiBpcyB1c2VkIHRvIHJlZmVyIHRvIHRoZSBmdWxsCisgIHBhdGhuYW1lIG9mIHRoZSByZWxlYXNlIGRpcmVjdG9yeS4KKworCisoNCkgQ3VzdG9taXplIEJ1aWxkIFByb3BlcnRpZXMgRm9yIFRoaXMgU3VicHJvamVjdAorCitNb3N0IEpha2FydGEgc3VicHJvamVjdHMgYWxsb3cgeW91IHRvIGN1c3RvbWl6ZSBBbnQgcHJvcGVydGllcyAod2l0aCBkZWZhdWx0Cit2YWx1ZXMgZGVmaW5lZCBpbiB0aGUgImJ1aWxkLnhtbCIgZmlsZS4gIFRoaXMgaXMgZG9uZSBieSBjcmVhdGluZyBhIHRleHQgZmlsZQorbmFtZWQgImJ1aWxkLnByb3BlcnRpZXMiIGluIHRoZSBzb3VyY2UgZGlzdHJpYnV0aW9uIGRpcmVjdG9yeSAoZm9yIHByb3BlcnR5CitkZWZpbml0aW9ucyBsb2NhbCB0byB0aGlzIHN1YnByb2plY3QpIGFuZC9vciB5b3VyIHVzZXIgaG9tZSBkaXJlY3RvcnkgKGZvcgorcHJvcGVydHkgZGVmaW5pdGlvbnMgc2hhcmVkIGFjcm9zcyBzdWJwcm9qZWN0cykuCisKK1RoZSAiamFrYXJ0YS1zZXJ2bGV0YXBpLTQiIHN1YnByb2plY3QgZG9lcyBub3QgZGVmaW5lIGFueSBjdXN0b21pemFibGUKK2J1aWxkIHByb3BlcnRpZXMuCisKKworKDUpIEJ1aWxkIEEgQmluYXJ5IERpc3RyaWJ1dGlvbgorCitPcGVuIGEgY29tbWFuZCBsaW5lIHNoZWxsLCBhbmQgaXNzdWUgdGhlIGZvbGxvd2luZyBjb21tYW5kczoKKworICBjZCAke3NlcnZsZXRhcGkuc291cmNlfQorICBhbnQgLXByb2plY3RoZWxwCisKK0lmIGV2ZXJ5dGhpbmcgaXMgaW5zdGFsbGVkIGNvcnJlY3RseSwgeW91IHNob3VsZCBzZWUgYSBsaXN0IG9mIHRoZSBBbnQKKyJ0YXJnZXRzIiB0aGF0IHJlcHJlc2VudCBkaWZmZXJlbnQgY29tbWFuZHMgeW91IG1pZ2h0IHdpc2ggdG8gYnVpbGQuICBCeQorY29udmVudGlvbiwgdGhlICJkaXN0IiB0YXJnZXQgY3JlYXRlcyBhIGNvbXBsZXRlIGJpbmFyeSBkaXN0cmlidXRpb24uICBUbworZXhlY3V0ZSBpdCwgdHlwZSB0aGUgZm9sbG93aW5nIGNvbW1hbmRzOgorCisgIGNkICR7c2VydmxldGFwaS5zb3VyY2V9CisgIGFudCBkaXN0CisKK1RoaXMgd2lsbCBjcmVhdGUgYSBjb21wbGV0ZSBiaW5hcnkgZGlzdHJpYnV0aW9uIG9mIHRoZSBzdWJwcm9qZWN0IChlcXVpdmFsZW50CitpbiBzdHJ1Y3R1cmUgdG8gdGhlIGNvcnJlc3BvbmRpbmcgYmluYXJ5IGRpc3RyaWJ1dGlvbiBkb3dubG9hZGFibGUgZnJvbSB0aGUKK0pha2FydGEgd2ViIHNpdGUpLCBpbiB0aGUgIiR7c2VydmxldGFwaS5zb3VyY2V9L2Rpc3QiIGRpcmVjdG9yeS4gIEl0IHdpbGwgaGF2ZQordGhlIGNvbnRlbnRzIGRlc2NyaWJlZCBpbiB0aGUgY29ycmVzcG9uZGluZyAiUkVBRE1FLnR4dCIgZmlsZS4KKworVGhlIGZpbGUgbW9zdCBjb21tb25seSByZXF1aXJlZCBieSBvdGhlciBwcm9qZWN0cyB3aWxsIGJlIHRoZSAic2VydmxldC5qYXIiCitmaWxlLCBmb3VuZCBpbiAiJHtzZXJ2bGV0YXBpLnNvdXJjZX0vbGliL3NlcnZsZXQuamFyIi4gIE1ha2UgYSBub3RlIG9mIHRoZQorZnVsbCBwYXRobmFtZSB0byB0aGlzIGZpbGUsIGJlY2F1c2UgeW91IHdpbGwgbmVlZCBpdCB3aGVuIGN1c3RvbWl6aW5nIGJ1aWxkCitwcm9wZXJ0aWVzIGZvciBvdGhlciBKYWthcnRhIHN1YnByb2plY3RzIHRoYXQgZGVwZW5kIG9uIHRoZXNlIGNsYXNzZXMuCmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9MSUNFTlNFIGIvc2VydmxldGFwaS9qc3IxNTIvTElDRU5TRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjQ1Njk1Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvTElDRU5TRQpAQCAtMCwwICsxLDIwMiBAQAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAorICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLworCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KKworICAgMS4gRGVmaW5pdGlvbnMuCisKKyAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCisgICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KKworICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KKworICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAorICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgorICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKKyAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQorICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKKyAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQorICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KKworICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KKworICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCisgICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCisgICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgorCisgICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAorICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAorICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAorICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgorCisgICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgorICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQorICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCisgICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgorCisgICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0CisgICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCisgICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCisgICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcworICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCisgICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCisgICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgorCisgICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZworICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucworICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5CisgICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCisgICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgorICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAorICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KKyAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCisgICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQorICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0CisgICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQorICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCisKKyAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKKyAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgorCisgICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKKyAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQorICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KKworICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCisgICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKKyAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCisgICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgorICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQorICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKKyAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCisgICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCisgICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAorICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcworICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCisgICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCisKKyAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCisgICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKKyAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91CisgICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKKyAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAorCisgICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCisKKyAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcworICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKKyAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAorICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKKyAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCisKKyAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cworICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKKyAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKKyAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKKyAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKKyAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAorICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKKyAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKKyAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCisgICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCisgICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAorICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCisgICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKKyAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKKyAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKKyAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAorICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgorICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCisgICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKKyAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCisKKyAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKKyAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaworICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgorICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQorICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKKyAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KKworICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQorICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAorICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCisgICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KKworICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCisgICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCisgICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKKyAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKKyAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQorICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CisgICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCisKKyAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAorICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCisgICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQorICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKKyAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKKyAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQorICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQorICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAorICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKKyAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKKyAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKworICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZworICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKKyAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCisgICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcworICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKKyAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCisgICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCisgICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKKyAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KKyAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgorCisgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKworICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgorCisgICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZworICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgorICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKKyAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCisgICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKKyAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKKyAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgorICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgorCisgICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KKworICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL1JFQURNRS50eHQgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9SRUFETUUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0YjgzMjgKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9SRUFETUUudHh0CkBAIC0wLDAgKzEsMjggQEAKKyRJZCQKKworICAgICAgICAgICAgICAgICAgICAgIEphdmEgU2VydmxldCBhbmQgSlNQIEFQSSBDbGFzc2VzCisgICAgICAgICAgICAgICAgICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhpcyBzdWJwcm9qZWN0IGNvbnRhaW5zIHRoZSBjb21waWxlZCBjb2RlIGZvciB0aGUgaW1wbGVtZW50YXRpb24gY2xhc3NlcyBvZgordGhlIEphdmEgU2VydmxldCBhbmQgSlNQIEFQSXMgKHBhY2thZ2VzIGphdmF4LnNlcnZsZXQsIGphdmF4LnNlcnZsZXQuaHR0cCwKK2phdmF4LnNlcnZsZXQuanNwLCBhbmQgamF2YXguc2VydmxldC5qc3AudGFnZXh0KS4gIEl0IGluY2x1ZGVzIHRoZSBmb2xsb3dpbmcKK2NvbnRlbnRzOgorCisKKyAgQlVJTERJTkcudHh0ICAgICAgICAgICAgICAgIEluc3RydWN0aW9ucyBmb3IgYnVpbGRpbmcgZnJvbSBzb3VyY2VzCisgIExJQ0VOU0UgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSBmb3IgdGhpcyByZWxlYXNlCisgIFJFQURNRS50eHQgICAgICAgICAgICAgICAgICBUaGlzIGRvY3VtZW50CisgIGRvY3MvICAgICAgICAgICAgICAgICAgICAgICBEb2N1bWVudGF0aW9uIGZvciB0aGlzIHJlbGVhc2UKKyAgICAgIGFwaS8gICAgICAgICAgICAgICAgICAgIEphdmFkb2NzIGZvciBTZXJ2bGV0IGFuZCBKU1AgQVBJIGNsYXNzZXMKKyAgbGliLyAgICAgICAgICAgICAgICAgICAgICAgIEJpbmFyeSBKQVIgZmlsZXMgZm9yIHRoaXMgcmVsZWFzZQorICAgICAgc2VydmxldC5qYXIgICAgICAgICAgICAgQmluYXJ5IFNlcnZsZXQgYW5kIEpTUCBBUEkgY2xhc3NlcworICBzcmMvICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlcyBmb3IgU2VydmxldCBhbmQgSlNQIEFQSSBjbGFzc2VzCisKK0luIGdlbmVyYWwsIHlvdSB3aWxsIG5lZWQgdG8gYWRkIHRoZSAic2VydmxldC5qYXIiIGZpbGUgKGZvdW5kIGluIHRoZSAibGliIgorc3ViZGlyZWN0b3J5IG9mIHRoaXMgcmVsZWFzZSkgaW50byB0aGUgY29tcGlsYXRpb24gY2xhc3MgcGF0aCBmb3IgeW91cgorcHJvamVjdHMgdGhhdCBkZXBlbmQgb24gdGhlc2UgQVBJcy4KKworVGhlIGNvbXBpbGVkICJzZXJ2bGV0LmphciIgZmlsZSBpbmNsdWRlZCBpbiB0aGlzIHN1YnByb2plY3QgaXMgYXV0b21hdGljYWxseQoraW5jbHVkZWQgaW4gYmluYXJ5IGRpc3RyaWJ1dGlvbnMgb2YgVG9tY2F0IDQuMCwgc28geW91IG5lZWQgbm90IGRvd25sb2FkIHRoaXMKK3N1YnByb2plY3Qgc2VwYXJhdGVseSB1bmxlc3MgeW91IHdpc2ggdG8gdXRpbGl6ZSB0aGUgSmF2YWRvY3MsIG9yIHBlcnVzZSB0aGUKK3NvdXJjZSBjb2RlIHRvIHNlZSBob3cgdGhlIEFQSSBjbGFzc2VzIGFyZSBpbXBsZW1lbnRlZC4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2J1aWxkLnhtbCBiL3NlcnZsZXRhcGkvanNyMTUyL2J1aWxkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODA0MGIxCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvYnVpbGQueG1sCkBAIC0wLDAgKzEsMjc3IEBACis8cHJvamVjdCBuYW1lPSJKU1AgQVBJIENsYXNzZXMiIGRlZmF1bHQ9ImNvbXBpbGUiIGJhc2VkaXI9Ii4iPgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09IEVudmlyb25tZW50YWwgUHJvcGVydGllcyA9PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworICA8IS0tIExvYWQgdXNlciBwcm9wZXJ0eSBkZWZpbml0aW9uIG92ZXJyaWRlcyAtLT4KKyAgPHByb3BlcnR5IGZpbGU9ImJ1aWxkLnByb3BlcnRpZXMiLz4KKyAgPHByb3BlcnR5IGZpbGU9IiR7dXNlci5ob21lfS9idWlsZC5wcm9wZXJ0aWVzIi8+CisKKyAgPCEtLSBFc3RhYmxpc2ggcHJvcGVydHkgZGVmaW5pdGlvbiBkZWZhdWx0cyAtLT4KKyAgPHByb3BlcnR5IG5hbWU9ImNvbXBpbGUuZGVidWciICAgICAgIHZhbHVlPSJ0cnVlIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJjb21waWxlLmRlcHJlY2F0aW9uIiB2YWx1ZT0iZmFsc2UiLz4KKyAgPHByb3BlcnR5IG5hbWU9ImNvbXBpbGUub3B0aW1pemUiICAgIHZhbHVlPSJ0cnVlIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJpbXBsZW1lbnRhdGlvbi5yZXZpc2lvbiIgdmFsdWU9InB1YmxpY19kcmFmdCIvPgorICA8cHJvcGVydHkgbmFtZT0ianNwLWFwaS5idWlsZCIgICAgdmFsdWU9ImJ1aWxkIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJqc3AtYXBpLmRpc3QiICAgICB2YWx1ZT0iZGlzdCIvPgorICA8cHJvcGVydHkgbmFtZT0ic2VydmxldC1hcGkuamFyIiAgdmFsdWU9Ii4uL2pzcjE1NC9kaXN0L2xpYi9zZXJ2bGV0LWFwaS5qYXIiLz4KKyAgPHByb3BlcnR5IG5hbWU9ImpzcC1hcGkuamFyIiB2YWx1ZT0iJHtqc3AtYXBpLmRpc3R9L2xpYi9qc3AtYXBpLmphciIvPgorCisgIDxwYXRoIGlkPSJleGFtcGxlcy5jbGFzc3BhdGgiPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtqc3AtYXBpLmJ1aWxkfS9jbGFzc2VzIi8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3NlcnZsZXQtYXBpLmphcn0iLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7bWFpbC5qYXJ9Ii8+CisgIDwvcGF0aD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09IFByZXBhcmUgRGlyZWN0b3JpZXMgPT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJwcmVwYXJlIj4KKworICAgIDwhLS0gIkJ1aWxkIiBIaWVyYXJjaHkgLS0+CisgICAgPG1rZGlyIGRpcj0iJHtqc3AtYXBpLmJ1aWxkfSIvPgorICAgIDxta2RpciBkaXI9IiR7anNwLWFwaS5idWlsZH0vY2xhc3NlcyIvPgorICAgIDxta2RpciBkaXI9IiR7anNwLWFwaS5idWlsZH0vZG9jcyIvPgorICAgIDxta2RpciBkaXI9IiR7anNwLWFwaS5idWlsZH0vZG9jcy9hcGkiLz4KKyAgICA8bWtkaXIgZGlyPSIke2pzcC1hcGkuYnVpbGR9L2V4YW1wbGVzIi8+CisgICAgPG1rZGlyIGRpcj0iJHtqc3AtYXBpLmJ1aWxkfS9hbnQiLz4KKworICAgIDwhLS0gIkRpc3QiIEhpZXJhcmNoeSAtLT4KKyAgICA8bWtkaXIgZGlyPSIke2pzcC1hcGkuZGlzdH0iLz4KKyAgICA8bWtkaXIgZGlyPSIke2pzcC1hcGkuZGlzdH0vZG9jcyIvPgorICAgIDxta2RpciBkaXI9IiR7anNwLWFwaS5kaXN0fS9kb2NzL2FwaSIvPgorICAgIDxta2RpciBkaXI9IiR7anNwLWFwaS5kaXN0fS9saWIiLz4KKyAgICA8bWtkaXIgZGlyPSIke2pzcC1hcGkuZGlzdH0vc3JjIi8+CisgICAgPG1rZGlyIGRpcj0iJHtqc3AtYXBpLmRpc3R9L2V4YW1wbGVzIi8+CisKKyAgICA8dXB0b2RhdGUgcHJvcGVydHk9ImRvY3MudXB0b2RhdGUiIHRhcmdldGZpbGU9IiR7anNwLWFwaS5idWlsZH0vZG9jcy9hcGkvaW5kZXguaHRtbCI+CisgICAgICA8c3JjZmlsZXMgZGlyPSJzcmMvc2hhcmUiIGluY2x1ZGVzPSIqKi8qLmphdmEiIC8+CisgICAgPC91cHRvZGF0ZT4KKyAgPC90YXJnZXQ+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09IFN0YXRpYyBGaWxlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0ic3RhdGljIiBkZXBlbmRzPSJwcmVwYXJlIj4KKworICAgIDwhLS0gIkRpc3QiIEhpZXJhcmNoeSAtLT4KKyAgICA8Y29weSB0b2Rpcj0iJHtqc3AtYXBpLmRpc3R9Ij4KKyAgICAgIDxmaWxlc2V0IGRpcj0iLiIgaW5jbHVkZXM9IkJVSUxESU5HLnR4dCIvPgorICAgICAgPGZpbGVzZXQgZGlyPSIuIiBpbmNsdWRlcz0iTElDRU5TRSIvPgorICAgICAgPGZpbGVzZXQgZGlyPSIuIiBpbmNsdWRlcz0iUkVBRE1FLnR4dCIvPgorICAgIDwvY29weT4KKworICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09IENvbXBpbGUgQ2xhc3NlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJjb21waWxlIiBkZXBlbmRzPSJzdGF0aWMiCisgICBkZXNjcmlwdGlvbj0iQ29tcGlsZSBBUEkgY2xhc3NlcyAoRGVmYXVsdCkiPgorCisgICAgPCEtLSBKYXZhIGNsYXNzZXMgLS0+CisgICAgPGphdmFjIHNyY2Rpcj0ic3JjL3NoYXJlIiBkZXN0ZGlyPSIke2pzcC1hcGkuYnVpbGR9L2NsYXNzZXMiCisgICAgICAgICAgIGRlYnVnPSIke2NvbXBpbGUuZGVidWd9IiBkZXByZWNhdGlvbj0iJHtjb21waWxlLmRlcHJlY2F0aW9ufSIKKyAgICAgICAgb3B0aW1pemU9IiR7Y29tcGlsZS5vcHRpbWl6ZX0iCisgICAgICAgY2xhc3NwYXRoPSIke3NlcnZsZXQtYXBpLmphcn0iIC8+CisKKyAgICA8IS0tIEFzc29jaWF0ZWQgcHJvcGVydHkgZmlsZXMgLS0+CisgICAgPGNvcHkgdG9kaXI9IiR7anNwLWFwaS5idWlsZH0vY2xhc3NlcyI+CisgICAgICAgIDxmaWxlc2V0IGRpcj0ic3JjL3NoYXJlIj4KKyAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnByb3BlcnRpZXMiLz4KKyAgICAgICAgPC9maWxlc2V0PgorICAgIDwvY29weT4KKworICAgIDwhLS0gSlNQIHJlc291cmNlcyAtLT4KKyAgICA8Y29weSB0b2Rpcj0iJHtqc3AtYXBpLmJ1aWxkfS9jbGFzc2VzL2phdmF4L3NlcnZsZXQvanNwL3Jlc291cmNlcyI+CisgICAgICAgIDxmaWxlc2V0IGRpcj0ic3JjL3NoYXJlL2R0ZCI+CisgICAgICAgICAgPGluY2x1ZGUgbmFtZT0ianNwKi5kdGQiLz4KKyAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJqc3AqLnhzZCIvPgorICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IndlYi1qc3AqLmR0ZCIvPgorICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IndlYi1qc3AqLnhzZCIvPgorICAgICAgICA8L2ZpbGVzZXQ+CisgICAgPC9jb3B5PgorCisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT0gQnVpbGQgSmF2YURvYyA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iamF2YWRvYyIgZGVwZW5kcz0icHJlcGFyZSIgdW5sZXNzPSJkb2NzLnVwdG9kYXRlIj4KKworICAgIDxqYXZhZG9jIHBhY2thZ2VuYW1lcz0iamF2YXguc2VydmxldC5qc3AuKiIKKyAgICAgICAgICAgICBzb3VyY2VwYXRoPSIke2Jhc2VkaXJ9L3NyYy9zaGFyZSIKKyAgICAgICAgICAgICBjbGFzc3BhdGg9IiR7c2VydmxldC1hcGkuamFyfSIKKyAgICAgICAgICAgICBkZXN0ZGlyPSIke2pzcC1hcGkuYnVpbGR9L2RvY3MvYXBpIgorICAgICAgICAgICAgIHVzZT0idHJ1ZSIKKyAgICAgICAgICAgICB3aW5kb3d0aXRsZT0iSmF2YVNlcnZlciBQYWdlcyBBUEkgRG9jdW1lbnRhdGlvbiIKKyAgICAgICAgICAgICBkb2N0aXRsZT0iSmF2YVNlcnZlciBQYWdlcyBBUEkgRG9jdW1lbnRhdGlvbiIKKyAgICAgICAgICAgICBib3R0b209IkNvcHlyaWdodCAmYW1wO2NvcHk7IDE5OTktMjAwMiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgUmlnaHRzIFJlc2VydmVkLiIvPgorCisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT0gQnVpbGQgRXhhbXBsZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImFudCIgZGVwZW5kcz0icHJlcGFyZSI+CisgICAgPGphdmFjICBzcmNkaXI9InNyYy9hbnQiIGRlc3RkaXI9IiR7anNwLWFwaS5idWlsZH0vYW50IgorICAgICAgICAgICAgZGVidWc9IiR7Y29tcGlsZS5kZWJ1Z30iIGRlcHJlY2F0aW9uPSIke2NvbXBpbGUuZGVwcmVjYXRpb259IgorICAgICAgICAgICAgb3B0aW1pemU9IiR7Y29tcGlsZS5vcHRpbWl6ZX0iIAorICAgICAgICAgICAgY2xhc3NwYXRoPSIke2FudC5ob21lfS9saWIvYW50LmphciIgLz4KKyAgICA8dGFza2RlZiAgICBuYW1lPSJ0eHQyaHRtbCIgY2xhc3NuYW1lPSJ0YXNrLlR4dDJIdG1sIgorICAgICAgICAgICAgICAgIGNsYXNzcGF0aD0iJHtqc3AtYXBpLmJ1aWxkfS9hbnQiIC8+CisgIDwvdGFyZ2V0PgorICAKKyAgPHRhcmdldCBuYW1lPSJleGFtcGxlcyIgZGVwZW5kcz0icHJlcGFyZSxhbnQiPgorCisgICAgPGNvcHkgdG9kaXI9IiR7anNwLWFwaS5idWlsZH0vZXhhbXBsZXMiPgorICAgICAgPGZpbGVzZXQgZGlyPSJleGFtcGxlcyI+CisgICAgICAgIDxleGNsdWRlIG5hbWU9ImJ1aWxkLioiLz4KKyAgICAgIDwvZmlsZXNldD4KKyAgICA8L2NvcHk+CisKKyAgICA8dHh0Mmh0bWwgdG9kaXI9IiR7anNwLWFwaS5idWlsZH0vZXhhbXBsZXMvanNwMi9zaW1wbGV0YWciPgorICAgICAgPGZpbGVzZXQgZGlyPSJleGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvanNwMi9leGFtcGxlcyI+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9IkJvb2tCZWFuLmphdmEiLz4KKyAgICAgIDwvZmlsZXNldD4KKyAgICAgIDxmaWxlc2V0IGRpcj0iZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2pzcDIvZXhhbXBsZXMvc2ltcGxldGFnIj4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iRmluZEJvb2tTaW1wbGVUYWcuamF2YSIvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJSZXBlYXRTaW1wbGVUYWcuamF2YSIvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJIZWxsb1dvcmxkU2ltcGxlVGFnLmphdmEiLz4KKyAgICAgIDwvZmlsZXNldD4KKyAgICAgIDxmaWxlc2V0IGRpcj0iZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2pzcDIvZXhhbXBsZXMvZWwiPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJGdW5jdGlvbnMuamF2YSIvPgorICAgICAgPC9maWxlc2V0PgorICAgIDwvdHh0Mmh0bWw+CisKKyAgICA8dHh0Mmh0bWwgdG9kaXI9IiR7anNwLWFwaS5idWlsZH0vZXhhbXBsZXMvanNwMi9qc3BhdHRyaWJ1dGUiPgorICAgICAgPGZpbGVzZXQgZGlyPSJleGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvanNwMi9leGFtcGxlcyI+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9IkZvb0JlYW4uamF2YSIvPgorICAgICAgPC9maWxlc2V0PgorICAgICAgPGZpbGVzZXQgZGlyPSJleGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvanNwMi9leGFtcGxlcy9zaW1wbGV0YWciPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJTaHVmZmxlU2ltcGxlVGFnLmphdmEiLz4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iVGlsZVNpbXBsZVRhZy5qYXZhIi8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9IkhlbGxvV29ybGRTaW1wbGVUYWcuamF2YSIvPgorICAgICAgPC9maWxlc2V0PgorICAgIDwvdHh0Mmh0bWw+CisKKyAgICA8dHh0Mmh0bWwgdG9kaXI9IiR7anNwLWFwaS5idWlsZH0vZXhhbXBsZXMvY2FsIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2NhbCI+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9IkVudHJpZXMuamF2YSIvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJFbnRyeS5qYXZhIi8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9IkpzcENhbGVuZGFyLmphdmEiLz4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iVGFibGVCZWFuLmphdmEiLz4KKyAgICAgIDwvZmlsZXNldD4KKyAgICA8L3R4dDJodG1sPgorCisgICAgPHR4dDJodG1sIHRvZGlyPSIke2pzcC1hcGkuYnVpbGR9L2V4YW1wbGVzL2pzcHRvc2VydiI+CisgICAgICA8ZmlsZXNldCBkaXI9ImV4YW1wbGVzL1dFQi1JTkYvY2xhc3NlcyI+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9InNlcnZsZXRUb0pzcC5qYXZhIi8+CisgICAgICA8L2ZpbGVzZXQ+CisgICAgPC90eHQyaHRtbD4KKworICAgIDx0eHQyaHRtbCB0b2Rpcj0iJHtqc3AtYXBpLmJ1aWxkfS9leGFtcGxlcy9qc3AyL2VsIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2pzcDIvZXhhbXBsZXMvZWwiPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJGdW5jdGlvbnMuamF2YSIvPgorICAgICAgPC9maWxlc2V0PgorICAgIDwvdHh0Mmh0bWw+CisKKyAgICA8dHh0Mmh0bWwgdG9kaXI9IiR7anNwLWFwaS5idWlsZH0vZXhhbXBsZXMvanNwMi9taXNjIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2pzcDIvZXhhbXBsZXMvc2ltcGxldGFnIj4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iRWNob0F0dHJpYnV0ZXNUYWcuamF2YSIvPgorICAgICAgPC9maWxlc2V0PgorICAgIDwvdHh0Mmh0bWw+CisKKyAgICA8dHh0Mmh0bWwgdG9kaXI9IiR7anNwLWFwaS5idWlsZH0vZXhhbXBsZXMvanNwMi90YWdmaWxlcyI+CisgICAgICA8ZmlsZXNldCBkaXI9ImV4YW1wbGVzL1dFQi1JTkYvdGFncyI+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoudGFnIiAvPgorICAgICAgPC9maWxlc2V0PgorICAgIDwvdHh0Mmh0bWw+CisKKyAgICA8dHh0Mmh0bWwgdG9kaXI9IiR7anNwLWFwaS5idWlsZH0vZXhhbXBsZXMiPgorICAgICAgPGZpbGVzZXQgZGlyPSJleGFtcGxlcyI+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouanNwIiAvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmpzcHgiIC8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouanNwZiIgLz4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iZXJyb3IvZXJyb3JwZ2UuanNwIi8+CisgICAgICAgIDxleGNsdWRlIG5hbWU9ImZvcndhcmQvb25lLmpzcCIvPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSJpbmNsdWRlL2Zvby5qc3AiLz4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ianNwdG9zZXJ2L2hlbGxvLmpzcCIvPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSJzZWN1cml0eS9wcm90ZWN0ZWQvZXJyb3IuanNwIi8+CisgICAgICAgIDxleGNsdWRlIG5hbWU9InNlY3VyaXR5L3Byb3RlY3RlZC9pbmRleC5qc3AiLz4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ic2VjdXJpdHkvcHJvdGVjdGVkL2xvZ2luLmpzcCIvPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSJzb3VyY2UuanNwIi8+CisgICAgICA8L2ZpbGVzZXQ+CisgICAgPC90eHQyaHRtbD4KKworICAgIDxqYXZhYyAgIHNyY2Rpcj0iZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzIiAKKyAgICAgICAgICAgICBkZXN0ZGlyPSIke2pzcC1hcGkuYnVpbGR9L2V4YW1wbGVzL1dFQi1JTkYvY2xhc3NlcyIKKyAgICAgICAgICAgICBkZWJ1Zz0iJHtjb21waWxlLmRlYnVnfSIgZGVwcmVjYXRpb249IiR7Y29tcGlsZS5kZXByZWNhdGlvbn0iCisgICAgICAgICAgICAgb3B0aW1pemU9IiR7Y29tcGlsZS5vcHRpbWl6ZX0iCisgICAgICAgICAgICAgZXhjbHVkZXM9IioqL0NWUy8qKiI+CisgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJleGFtcGxlcy5jbGFzc3BhdGgiIC8+CisgICAgPC9qYXZhYz4KKworICAgIDxqYXZhYyAgIHNyY2Rpcj0iZXhhbXBsZXMvcGx1Z2luL2FwcGxldCIgCisgICAgICAgICAgICAgZGVzdGRpcj0iJHtqc3AtYXBpLmJ1aWxkfS9leGFtcGxlcy9wbHVnaW4vYXBwbGV0IgorICAgICAgICAgICAgIGRlYnVnPSIke2NvbXBpbGUuZGVidWd9IiBkZXByZWNhdGlvbj0iJHtjb21waWxlLmRlcHJlY2F0aW9ufSIKKyAgICAgICAgICAgICBvcHRpbWl6ZT0iJHtjb21waWxlLm9wdGltaXplfSIKKyAgICAgICAgICAgICBleGNsdWRlcz0iKiovQ1ZTLyoqIj4KKyAgICAgIDxjbGFzc3BhdGggcmVmaWQ9ImV4YW1wbGVzLmNsYXNzcGF0aCIgLz4KKyAgICA8L2phdmFjPgorCisgICAgPGphciAgIGphcmZpbGU9IiR7anNwLWFwaS5kaXN0fS9leGFtcGxlcy9leGFtcGxlcy53YXIiCisgICAgICAgICAgIGJhc2VkaXI9IiR7anNwLWFwaS5idWlsZH0vZXhhbXBsZXMiIGluY2x1ZGVzPSIqKiIvPgorCisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT0gRGlzdHJpYnV0aW9uIEZpbGVzID09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iamFyIiBkZXBlbmRzPSJjb21waWxlIgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgamFyIj4KKworICAgIDwhLS0gUHJlcGFyZSBNYW5pZmVzdCAtLT4KKyAgICA8Y29weSB0b2ZpbGU9IiR7anNwLWFwaS5idWlsZH0vbWFuaWZlc3QiCisgICAgICAgICAgICBmaWxlPSJzcmMvZXRjL21hbmlmZXN0IiBvdmVyd3JpdGU9InllcyI+CisgICAgICA8ZmlsdGVyc2V0PgorICAgICAgICA8ZmlsdGVyIHRva2VuPSJpbXBsZW1lbnRhdGlvbi5yZXZpc2lvbiIKKyAgICAgICAgICAgICAgICB2YWx1ZT0iJHtpbXBsZW1lbnRhdGlvbi5yZXZpc2lvbn0iLz4KKyAgICAgIDwvZmlsdGVyc2V0PgorICAgIDwvY29weT4KKworICAgIDwhLS0gQ3JlYXRlIEpBUiBmaWxlIC0tPgorICAgIDxqYXIgamFyZmlsZT0iJHtqc3AtYXBpLmphcn0iCisgICAgICAgICBiYXNlZGlyPSIke2pzcC1hcGkuYnVpbGR9L2NsYXNzZXMiCisgICAgICAgICBtYW5pZmVzdD0iJHtqc3AtYXBpLmJ1aWxkfS9tYW5pZmVzdCI+CisgICAgICA8aW5jbHVkZSBuYW1lPSJqYXZheC9zZXJ2bGV0L2pzcC8qKiIgLz4KKyAgICA8L2phcj4KKworICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImRpc3QiIGRlcGVuZHM9ImNvbXBpbGUsZXhhbXBsZXMsamF2YWRvYyxqYXIiCisgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIGJpbmFyeSBkaXN0cmlidXRpb24iPgorCisgICAgPCEtLSBDb3B5IEphdmFkb2NzIC0tPgorICAgIDxjb3B5IHRvZGlyPSIke2pzcC1hcGkuZGlzdH0vZG9jcy9hcGkiPgorICAgICAgICA8ZmlsZXNldCBkaXI9IiR7anNwLWFwaS5idWlsZH0vZG9jcy9hcGkiLz4KKyAgICA8L2NvcHk+CisKKyAgICA8IS0tIENvcHkgQVBJIHNvdXJjZSBmaWxlcyAtLT4KKyAgICA8Y29weSB0b2Rpcj0iJHtqc3AtYXBpLmRpc3R9L3NyYyI+CisgICAgICAgIDxmaWxlc2V0IGRpcj0ic3JjL3NoYXJlIi8+CisgICAgPC9jb3B5PgorCisgIDwvdGFyZ2V0PgorCisKKyAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09IENsZWFuIEdlbmVyYXRlZCBGaWxlcyA9PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0iY2xlYW4iCisgICBkZXNjcmlwdGlvbj0iQ2xlYW4gcHJldmlvdXMgYnVpbGQgcmVzdWx0cyI+CisKKyAgICA8ZGVsZXRlIGRpcj0iJHtqc3AtYXBpLmJ1aWxkfSIvPgorICAgIDxkZWxldGUgZGlyPSIke2pzcC1hcGkuZGlzdH0iLz4KKworICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PSBBbGwgSW4gT25lIEJ1aWxkID09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImFsbCIgZGVwZW5kcz0iY2xlYW4sZGlzdCIKKyAgIGRlc2NyaXB0aW9uPSJDbGVhbiwgY29tcGlsZSwgYW5kIGRpc3QiLz4KKworCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvY2FsL0VudHJpZXMuamF2YSBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9jYWwvRW50cmllcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3NjI1OTAKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvY2FsL0VudHJpZXMuamF2YQpAQCAtMCwwICsxLDcyIEBACisvKgorKiBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCitwYWNrYWdlIGNhbDsKKworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCitwdWJsaWMgY2xhc3MgRW50cmllcyB7CisKKyAgcHJpdmF0ZSBIYXNodGFibGUgZW50cmllczsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gdGltZSA9IHsiOGFtIiwgIjlhbSIsICIxMGFtIiwgIjExYW0iLCAiMTJwbSIsIAorCQkJCQkiMXBtIiwgIjJwbSIsICIzcG0iLCAiNHBtIiwgIjVwbSIsICI2cG0iLAorCQkJCQkiN3BtIiwgIjhwbSIgfTsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcm93cyA9IDEyOworCisgIHB1YmxpYyBFbnRyaWVzICgpIHsgICAKKyAgIGVudHJpZXMgPSBuZXcgSGFzaHRhYmxlIChyb3dzKTsKKyAgIGZvciAoaW50IGk9MDsgaSA8IHJvd3M7IGkrKykgeworICAgICBlbnRyaWVzLnB1dCAodGltZVtpXSwgbmV3IEVudHJ5KHRpbWVbaV0pKTsKKyAgIH0KKyAgfQorCisgIHB1YmxpYyBpbnQgZ2V0Um93cyAoKSB7CisgICAgcmV0dXJuIHJvd3M7CisgIH0KKworICBwdWJsaWMgRW50cnkgZ2V0RW50cnkgKGludCBpbmRleCkgeworICAgIHJldHVybiAoRW50cnkpdGhpcy5lbnRyaWVzLmdldCh0aW1lW2luZGV4XSk7CisgIH0KKworICBwdWJsaWMgaW50IGdldEluZGV4IChTdHJpbmcgdG0pIHsKKyAgICBmb3IgKGludCBpPTA7IGk8cm93czsgaSsrKQorICAgICAgaWYodG0uZXF1YWxzKHRpbWVbaV0pKSByZXR1cm4gaTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBwdWJsaWMgdm9pZCBwcm9jZXNzUmVxdWVzdCAoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIFN0cmluZyB0bSkgeworICAgIGludCBpbmRleCA9IGdldEluZGV4ICh0bSk7CisgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgIFN0cmluZyBkZXNjciA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyICgiZGVzY3JpcHRpb24iKTsKKyAgICAgICgoRW50cnkpZW50cmllcy5nZXQodGltZVtpbmRleF0pKS5zZXREZXNjcmlwdGlvbiAoZGVzY3IpOworICAgIH0KKyAgfQorCit9CisKKworCisKKworCisKKworCisKKworCisKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9jYWwvRW50cnkuamF2YSBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9jYWwvRW50cnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzVlZGEwCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2NhbC9FbnRyeS5qYXZhCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisqIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworcGFja2FnZSBjYWw7CisKK3B1YmxpYyBjbGFzcyBFbnRyeSB7CisKKyAgU3RyaW5nIGhvdXI7CisgIFN0cmluZyBkZXNjcmlwdGlvbjsKKyAgU3RyaW5nIGNvbG9yOworCisgIHB1YmxpYyBFbnRyeSAoU3RyaW5nIGhvdXIpIHsKKyAgICB0aGlzLmhvdXIgPSBob3VyOworICAgIHRoaXMuZGVzY3JpcHRpb24gPSAiIjsKKworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRIb3VyICgpIHsKKyAgICByZXR1cm4gdGhpcy5ob3VyOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRDb2xvciAoKSB7CisgICAgaWYgKGRlc2NyaXB0aW9uLmVxdWFscygiIikpIHJldHVybiAibGlnaHRibHVlIjsKKyAgICBlbHNlIHJldHVybiAicmVkIjsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24gKCkgeworICAgIGlmIChkZXNjcmlwdGlvbi5lcXVhbHMoIiIpKSByZXR1cm4gIk5vbmUiOworICAgIGVsc2UgcmV0dXJuIHRoaXMuZGVzY3JpcHRpb247CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbiAoU3RyaW5nIGRlc2NyKSB7CisgICAgZGVzY3JpcHRpb24gPSBkZXNjcjsKKyAgfQorIAorfQorCisKKworCisKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9jYWwvSnNwQ2FsZW5kYXIuamF2YSBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9jYWwvSnNwQ2FsZW5kYXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDA2M2ZkCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2NhbC9Kc3BDYWxlbmRhci5qYXZhCkBAIC0wLDAgKzEsMTU0IEBACisvKgorKiBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK3BhY2thZ2UgY2FsOworCitpbXBvcnQgamF2YS50ZXh0LkRhdGVGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLio7CisKK3B1YmxpYyBjbGFzcyBKc3BDYWxlbmRhciB7CisgICAgQ2FsZW5kYXIgIGNhbGVuZGFyID0gbnVsbDsKKyAgICBEYXRlIGN1cnJlbnREYXRlOworCisgICAgcHVibGljIEpzcENhbGVuZGFyKCkgeworCWNhbGVuZGFyID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsKKwlEYXRlIHRyaWFsVGltZSA9IG5ldyBEYXRlKCk7CisJY2FsZW5kYXIuc2V0VGltZSh0cmlhbFRpbWUpOworICAgIH0KKworCisgICAgcHVibGljIGludCBnZXRZZWFyKCkgeworCXJldHVybiBjYWxlbmRhci5nZXQoQ2FsZW5kYXIuWUVBUik7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TW9udGgoKSB7CisJaW50IG0gPSBnZXRNb250aEludCgpOworCVN0cmluZ1tdIG1vbnRocyA9IG5ldyBTdHJpbmcgW10geyAiSmFudWFyeSIsICJGZWJydWFyeSIsICJNYXJjaCIsCisJCQkJCSJBcHJpbCIsICJNYXkiLCAiSnVuZSIsCisJCQkJCSJKdWx5IiwgIkF1Z3VzdCIsICJTZXB0ZW1iZXIiLAorCQkJCQkiT2N0b2JlciIsICJOb3ZlbWJlciIsICJEZWNlbWJlciIgfTsKKwlpZiAobSA+IDEyKQorCSAgICByZXR1cm4gIlVua25vd24gdG8gTWFuIjsKKwkKKwlyZXR1cm4gbW9udGhzW20gLSAxXTsKKworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGF5KCkgeworCWludCB4ID0gZ2V0RGF5T2ZXZWVrKCk7CisJU3RyaW5nW10gZGF5cyA9IG5ldyBTdHJpbmdbXSB7IlN1bmRheSIsICJNb25kYXkiLCAiVHVlc2RheSIsICJXZWRuZXNkYXkiLCAKKwkJCQkgICAgICAiVGh1cnNkYXkiLCAiRnJpZGF5IiwgIlNhdHVyZGF5In07CisKKwlpZiAoeCA+IDcpCisJICAgIHJldHVybiAiVW5rbm93biB0byBNYW4iOworCisJcmV0dXJuIGRheXNbeCAtIDFdOworCisgICAgfQorICAgIAorICAgIHB1YmxpYyBpbnQgZ2V0TW9udGhJbnQoKSB7CisJcmV0dXJuIDEgKyBjYWxlbmRhci5nZXQoQ2FsZW5kYXIuTU9OVEgpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGF0ZSgpIHsKKwlyZXR1cm4gZ2V0TW9udGhJbnQoKSArICIvIiArIGdldERheU9mTW9udGgoKSArICIvIiArICBnZXRZZWFyKCk7CQorICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q3VycmVudERhdGUoKSB7CisgICAgICAgIERhdGUgZHQgPSBuZXcgRGF0ZSAoKTsKKwljYWxlbmRhci5zZXRUaW1lIChkdCk7CisJcmV0dXJuIGdldE1vbnRoSW50KCkgKyAiLyIgKyBnZXREYXlPZk1vbnRoKCkgKyAiLyIgKyAgZ2V0WWVhcigpOworCisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXROZXh0RGF0ZSgpIHsKKyAgICAgICAgY2FsZW5kYXIuc2V0IChDYWxlbmRhci5EQVlfT0ZfTU9OVEgsIGdldERheU9mTW9udGgoKSArIDEpOworCXJldHVybiBnZXREYXRlICgpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJldkRhdGUoKSB7CisgICAgICAgIGNhbGVuZGFyLnNldCAoQ2FsZW5kYXIuREFZX09GX01PTlRILCBnZXREYXlPZk1vbnRoKCkgLSAxKTsKKwlyZXR1cm4gZ2V0RGF0ZSAoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFRpbWUoKSB7CisJcmV0dXJuIGdldEhvdXIoKSArICI6IiArIGdldE1pbnV0ZSgpICsgIjoiICsgZ2V0U2Vjb25kKCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXREYXlPZk1vbnRoKCkgeworCXJldHVybiBjYWxlbmRhci5nZXQoQ2FsZW5kYXIuREFZX09GX01PTlRIKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldERheU9mWWVhcigpIHsKKwlyZXR1cm4gY2FsZW5kYXIuZ2V0KENhbGVuZGFyLkRBWV9PRl9ZRUFSKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFdlZWtPZlllYXIoKSB7CisJcmV0dXJuIGNhbGVuZGFyLmdldChDYWxlbmRhci5XRUVLX09GX1lFQVIpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0V2Vla09mTW9udGgoKSB7CisJcmV0dXJuIGNhbGVuZGFyLmdldChDYWxlbmRhci5XRUVLX09GX01PTlRIKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldERheU9mV2VlaygpIHsKKwlyZXR1cm4gY2FsZW5kYXIuZ2V0KENhbGVuZGFyLkRBWV9PRl9XRUVLKTsKKyAgICB9CisgICAgIAorICAgIHB1YmxpYyBpbnQgZ2V0SG91cigpIHsKKwlyZXR1cm4gY2FsZW5kYXIuZ2V0KENhbGVuZGFyLkhPVVJfT0ZfREFZKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIGludCBnZXRNaW51dGUoKSB7CisJcmV0dXJuIGNhbGVuZGFyLmdldChDYWxlbmRhci5NSU5VVEUpOworICAgIH0KKworCisgICAgcHVibGljIGludCBnZXRTZWNvbmQoKSB7CisJcmV0dXJuIGNhbGVuZGFyLmdldChDYWxlbmRhci5TRUNPTkQpOworICAgIH0KKworICAKKyAgICBwdWJsaWMgaW50IGdldEVyYSgpIHsKKwlyZXR1cm4gY2FsZW5kYXIuZ2V0KENhbGVuZGFyLkVSQSk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRVU1RpbWVab25lKCkgeworCVN0cmluZ1tdIHpvbmVzID0gbmV3IFN0cmluZ1tdIHsiSGF3YWlpIiwgIkFsYXNrYW4iLCAiUGFjaWZpYyIsCisJCQkJICAgICAgICJNb3VudGFpbiIsICJDZW50cmFsIiwgIkVhc3Rlcm4ifTsKKwkKKwlyZXR1cm4gem9uZXNbMTAgKyBnZXRab25lT2Zmc2V0KCldOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0Wm9uZU9mZnNldCgpIHsKKwlyZXR1cm4gY2FsZW5kYXIuZ2V0KENhbGVuZGFyLlpPTkVfT0ZGU0VUKS8oNjAqNjAqMTAwMCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgaW50IGdldERTVE9mZnNldCgpIHsKKwlyZXR1cm4gY2FsZW5kYXIuZ2V0KENhbGVuZGFyLkRTVF9PRkZTRVQpLyg2MCo2MCoxMDAwKTsKKyAgICB9CisKKyAgICAKKyAgICBwdWJsaWMgaW50IGdldEFNUE0oKSB7CisJcmV0dXJuIGNhbGVuZGFyLmdldChDYWxlbmRhci5BTV9QTSk7CisgICAgfQorfQorCisKKworCisKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9jYWwvVGFibGVCZWFuLmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvY2FsL1RhYmxlQmVhbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1Y2Q1OTkKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvY2FsL1RhYmxlQmVhbi5qYXZhCkBAIC0wLDAgKzEsMTAxIEBACisvKgorKiBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCitwYWNrYWdlIGNhbDsKKworaW1wb3J0IGphdmEuYmVhbnMuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lio7CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKKworcHVibGljIGNsYXNzIFRhYmxlQmVhbiB7CisKKyAgSGFzaHRhYmxlIHRhYmxlOworICBKc3BDYWxlbmRhciBKc3BDYWw7CisgIEVudHJpZXMgZW50cmllczsKKyAgU3RyaW5nIGRhdGU7CisgIFN0cmluZyBuYW1lID0gbnVsbDsKKyAgU3RyaW5nIGVtYWlsID0gbnVsbDsKKyAgYm9vbGVhbiBwcm9jZXNzRXJyb3IgPSBmYWxzZTsKKworICBwdWJsaWMgVGFibGVCZWFuICgpIHsKKyAgICB0aGlzLnRhYmxlID0gbmV3IEhhc2h0YWJsZSAoMTApOworICAgIHRoaXMuSnNwQ2FsID0gbmV3IEpzcENhbGVuZGFyICgpOworICAgIHRoaXMuZGF0ZSA9IEpzcENhbC5nZXRDdXJyZW50RGF0ZSAoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldE5hbWUgKFN0cmluZyBubSkgeworICAgIHRoaXMubmFtZSA9IG5tOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXROYW1lICgpIHsKKyAgICByZXR1cm4gdGhpcy5uYW1lOworICB9CisgIAorICBwdWJsaWMgdm9pZCBzZXRFbWFpbCAoU3RyaW5nIG1haWwpIHsKKyAgICB0aGlzLmVtYWlsID0gbWFpbDsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgZ2V0RW1haWwgKCkgeworICAgIHJldHVybiB0aGlzLmVtYWlsOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXREYXRlICgpIHsKKyAgICByZXR1cm4gdGhpcy5kYXRlOworICB9CisKKyAgcHVibGljIEVudHJpZXMgZ2V0RW50cmllcyAoKSB7CisgICAgcmV0dXJuIHRoaXMuZW50cmllczsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHByb2Nlc3NSZXF1ZXN0IChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworCisgICAgLy8gR2V0IHRoZSBuYW1lIGFuZCBlLW1haWwuCisgICAgdGhpcy5wcm9jZXNzRXJyb3IgPSBmYWxzZTsKKyAgICBpZiAobmFtZSA9PSBudWxsIHx8IG5hbWUuZXF1YWxzKCIiKSkgc2V0TmFtZShyZXF1ZXN0LmdldFBhcmFtZXRlciAoIm5hbWUiKSk7ICAKKyAgICBpZiAoZW1haWwgPT0gbnVsbCB8fCBlbWFpbC5lcXVhbHMoIiIpKSBzZXRFbWFpbChyZXF1ZXN0LmdldFBhcmFtZXRlciAoImVtYWlsIikpOworICAgIGlmIChuYW1lID09IG51bGwgfHwgZW1haWwgPT0gbnVsbCB8fAorCQluYW1lLmVxdWFscygiIikgfHwgZW1haWwuZXF1YWxzKCIiKSkgeworICAgICAgdGhpcy5wcm9jZXNzRXJyb3IgPSB0cnVlOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIEdldCB0aGUgZGF0ZS4KKyAgICBTdHJpbmcgZGF0ZVIgPSByZXF1ZXN0LmdldFBhcmFtZXRlciAoImRhdGUiKTsKKyAgICBpZiAoZGF0ZVIgPT0gbnVsbCkgZGF0ZSA9IEpzcENhbC5nZXRDdXJyZW50RGF0ZSAoKTsKKyAgICBlbHNlIGlmIChkYXRlUi5lcXVhbHNJZ25vcmVDYXNlKCJuZXh0IikpIGRhdGUgPSBKc3BDYWwuZ2V0TmV4dERhdGUgKCk7CisgICAgZWxzZSBpZiAoZGF0ZVIuZXF1YWxzSWdub3JlQ2FzZSgicHJldiIpKSBkYXRlID0gSnNwQ2FsLmdldFByZXZEYXRlICgpOworCisgICAgZW50cmllcyA9IChFbnRyaWVzKSB0YWJsZS5nZXQgKGRhdGUpOworICAgIGlmIChlbnRyaWVzID09IG51bGwpIHsKKyAgICAgIGVudHJpZXMgPSBuZXcgRW50cmllcyAoKTsKKyAgICAgIHRhYmxlLnB1dCAoZGF0ZSwgZW50cmllcyk7CisgICAgfQorCisgICAgLy8gSWYgdGltZSBpcyBwcm92aWRlZCBhZGQgdGhlIGV2ZW50LgorCVN0cmluZyB0aW1lID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoInRpbWUiKTsKKyAgICBpZiAodGltZSAhPSBudWxsKSBlbnRyaWVzLnByb2Nlc3NSZXF1ZXN0IChyZXF1ZXN0LCB0aW1lKTsKKyAgfQorCisgIHB1YmxpYyBib29sZWFuIGdldFByb2Nlc3NFcnJvciAoKSB7CisgICAgcmV0dXJuIHRoaXMucHJvY2Vzc0Vycm9yOworICB9Cit9CisKKworCisKKworCmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvY2hlY2tib3gvQ2hlY2tUZXN0LmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvY2hlY2tib3gvQ2hlY2tUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ2ZDJlZAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9jaGVja2JveC9DaGVja1Rlc3QuamF2YQpAQCAtMCwwICsxLDMwIEBACisvKgorKiBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK3BhY2thZ2UgY2hlY2tib3g7CisKK3B1YmxpYyBjbGFzcyBDaGVja1Rlc3QgeworCisgICAgU3RyaW5nIGJbXSA9IG5ldyBTdHJpbmdbXSB7ICIxIiwgIjIiLCAiMyIsICI0IiB9OworCisgICAgcHVibGljIFN0cmluZ1tdIGdldEZydWl0KCkgeworCXJldHVybiBiOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEZydWl0KFN0cmluZyBbXSBiKSB7CisJdGhpcy5iID0gYjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvY29sb3JzL0NvbG9yR2FtZUJlYW4uamF2YSBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9jb2xvcnMvQ29sb3JHYW1lQmVhbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyMzViOTgKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvY29sb3JzL0NvbG9yR2FtZUJlYW4uamF2YQpAQCAtMCwwICsxLDExNCBAQAorLyoKKyogQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworcGFja2FnZSBjb2xvcnM7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworcHVibGljIGNsYXNzIENvbG9yR2FtZUJlYW4geworCisgICAgcHJpdmF0ZSBTdHJpbmcgYmFja2dyb3VuZCA9ICJ5ZWxsb3ciOworICAgIHByaXZhdGUgU3RyaW5nIGZvcmVncm91bmQgPSAicmVkIjsKKyAgICBwcml2YXRlIFN0cmluZyBjb2xvcjEgPSBmb3JlZ3JvdW5kOworICAgIHByaXZhdGUgU3RyaW5nIGNvbG9yMiA9IGJhY2tncm91bmQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgaGludCA9ICJubyI7CisgICAgcHJpdmF0ZSBpbnQgYXR0ZW1wdHMgPSAwOworCXByaXZhdGUgaW50IGludHZhbCA9IDA7CisgICAgcHJpdmF0ZSBib29sZWFuIHRvb2tIaW50cyA9IGZhbHNlOworCisgICAgcHVibGljIHZvaWQgcHJvY2Vzc1JlcXVlc3QoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKworCS8vIGJhY2tncm91bmQgPSAieWVsbG93IjsKKwkvLyBmb3JlZ3JvdW5kID0gInJlZCI7CisKKwlpZiAoISBjb2xvcjEuZXF1YWxzKGZvcmVncm91bmQpKSB7CisJICAgIGlmIChjb2xvcjEuZXF1YWxzSWdub3JlQ2FzZSgiYmxhY2siKSB8fAorCQkJY29sb3IxLmVxdWFsc0lnbm9yZUNhc2UoImN5YW4iKSkgeworCQkJYmFja2dyb3VuZCA9IGNvbG9yMTsKKwkJfQorCX0KKworCWlmICghIGNvbG9yMi5lcXVhbHMoYmFja2dyb3VuZCkpIHsKKwkgICAgaWYgKGNvbG9yMi5lcXVhbHNJZ25vcmVDYXNlKCJibGFjayIpIHx8CisJCQljb2xvcjIuZXF1YWxzSWdub3JlQ2FzZSgiY3lhbiIpKSB7CisJCQlmb3JlZ3JvdW5kID0gY29sb3IyOworCSAgICB9CisJfQorCisJYXR0ZW1wdHMrKzsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDb2xvcjIoU3RyaW5nIHgpIHsKKwljb2xvcjIgPSB4OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENvbG9yMShTdHJpbmcgeCkgeworCWNvbG9yMSA9IHg7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QWN0aW9uKFN0cmluZyB4KSB7CisJaWYgKCF0b29rSGludHMpCisJICAgIHRvb2tIaW50cyA9IHguZXF1YWxzSWdub3JlQ2FzZSgiSGludCIpOworCWhpbnQgPSB4OworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29sb3IyKCkgeworCSByZXR1cm4gYmFja2dyb3VuZDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbG9yMSgpIHsKKwkgcmV0dXJuIGZvcmVncm91bmQ7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRBdHRlbXB0cygpIHsKKwlyZXR1cm4gYXR0ZW1wdHM7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZ2V0SGludCgpIHsKKwlyZXR1cm4gaGludC5lcXVhbHNJZ25vcmVDYXNlKCJIaW50Iik7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZ2V0U3VjY2VzcygpIHsKKwlpZiAoYmFja2dyb3VuZC5lcXVhbHNJZ25vcmVDYXNlKCJibGFjayIpIHx8CisJICAgIGJhY2tncm91bmQuZXF1YWxzSWdub3JlQ2FzZSgiY3lhbiIpKSB7CisJCisJICAgIGlmIChmb3JlZ3JvdW5kLmVxdWFsc0lnbm9yZUNhc2UoImJsYWNrIikgfHwKKwkJZm9yZWdyb3VuZC5lcXVhbHNJZ25vcmVDYXNlKCJjeWFuIikpCisJCXJldHVybiB0cnVlOworCSAgICBlbHNlCisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlyZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZ2V0SGludFRha2VuKCkgeworCXJldHVybiB0b29rSGludHM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVzZXQoKSB7CisJZm9yZWdyb3VuZCA9ICJyZWQiOworCWJhY2tncm91bmQgPSAieWVsbG93IjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJbnR2YWwoaW50IHZhbHVlKSB7CisJaW50dmFsID0gdmFsdWU7CisJfQorCisgICAgcHVibGljIGludCBnZXRJbnR2YWwoKSB7CisJcmV0dXJuIGludHZhbDsKKwl9Cit9CisKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9jb21wcmVzc2lvbkZpbHRlcnMvQ29tcHJlc3Npb25GaWx0ZXIuamF2YSBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9jb21wcmVzc2lvbkZpbHRlcnMvQ29tcHJlc3Npb25GaWx0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjdlMWZmCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2NvbXByZXNzaW9uRmlsdGVycy9Db21wcmVzc2lvbkZpbHRlci5qYXZhCkBAIC0wLDAgKzEsMjE5IEBACisvKgorKiBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKworcGFja2FnZSBjb21wcmVzc2lvbkZpbHRlcnM7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LkZpbHRlcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LkZpbHRlckNoYWluOworaW1wb3J0IGphdmF4LnNlcnZsZXQuRmlsdGVyQ29uZmlnOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldFJlc3BvbnNlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CisKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiA8Y29kZT5qYXZheC5zZXJ2bGV0LkZpbHRlcjwvY29kZT4gdXNlZCB0byBjb21wcmVzcworICogdGhlIFNlcnZsZXRSZXNwb25zZSBpZiBpdCBpcyBiaWdnZXIgdGhhbiBhIHRocmVzaG9sZC4KKyAqCisgKiBAYXV0aG9yIEFteSBSb2gKKyAqIEBhdXRob3IgRG1pdHJpIFZhbGRpbgorICogQHZlcnNpb24gJFJldmlzaW9uJCwgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIENvbXByZXNzaW9uRmlsdGVyIGltcGxlbWVudHMgRmlsdGVyeworCisgICAgLyoqCisgICAgICogVGhlIGZpbHRlciBjb25maWd1cmF0aW9uIG9iamVjdCB3ZSBhcmUgYXNzb2NpYXRlZCB3aXRoLiAgSWYgdGhpcyB2YWx1ZQorICAgICAqIGlzIG51bGwsIHRoaXMgZmlsdGVyIGluc3RhbmNlIGlzIG5vdCBjdXJyZW50bHkgY29uZmlndXJlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIEZpbHRlckNvbmZpZyBjb25maWcgPSBudWxsOworCisgICAgLyoqCisgICAgICogTWluaW1hbCByZWFzb25hYmxlIHRocmVzaG9sZAorICAgICAqLworICAgIHByaXZhdGUgaW50IG1pblRocmVzaG9sZCA9IDEyODsKKworCisgICAgLyoqCisgICAgICogVGhlIHRocmVzaG9sZCBudW1iZXIgdG8gY29tcHJlc3MKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IGNvbXByZXNzaW9uVGhyZXNob2xkOworCisgICAgLyoqCisgICAgICogRGVidWcgbGV2ZWwgZm9yIHRoaXMgZmlsdGVyCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgZGVidWcgPSAwOworCisgICAgLyoqCisgICAgICogUGxhY2UgdGhpcyBmaWx0ZXIgaW50byBzZXJ2aWNlLgorICAgICAqCisgICAgICogQHBhcmFtIGZpbHRlckNvbmZpZyBUaGUgZmlsdGVyIGNvbmZpZ3VyYXRpb24gb2JqZWN0CisgICAgICovCisKKyAgICBwdWJsaWMgdm9pZCBpbml0KEZpbHRlckNvbmZpZyBmaWx0ZXJDb25maWcpIHsKKworICAgICAgICBjb25maWcgPSBmaWx0ZXJDb25maWc7CisgICAgICAgIGlmIChmaWx0ZXJDb25maWcgIT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gZmlsdGVyQ29uZmlnLmdldEluaXRQYXJhbWV0ZXIoImRlYnVnIik7CisgICAgICAgICAgICBpZiAodmFsdWUhPW51bGwpIHsKKyAgICAgICAgICAgICAgICBkZWJ1ZyA9IEludGVnZXIucGFyc2VJbnQodmFsdWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkZWJ1ZyA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJpbmcgc3RyID0gZmlsdGVyQ29uZmlnLmdldEluaXRQYXJhbWV0ZXIoImNvbXByZXNzaW9uVGhyZXNob2xkIik7CisgICAgICAgICAgICBpZiAoc3RyIT1udWxsKSB7CisgICAgICAgICAgICAgICAgY29tcHJlc3Npb25UaHJlc2hvbGQgPSBJbnRlZ2VyLnBhcnNlSW50KHN0cik7CisgICAgICAgICAgICAgICAgaWYgKGNvbXByZXNzaW9uVGhyZXNob2xkICE9IDAgJiYgY29tcHJlc3Npb25UaHJlc2hvbGQgPCBtaW5UaHJlc2hvbGQpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRlYnVnID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJjb21wcmVzc2lvblRocmVzaG9sZCBzaG91bGQgYmUgZWl0aGVyIDAgLSBubyBjb21wcmVzc2lvbiBvciA+PSAiICsgbWluVGhyZXNob2xkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY29tcHJlc3Npb25UaHJlc2hvbGQgc2V0IHRvICIgKyBtaW5UaHJlc2hvbGQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uVGhyZXNob2xkID0gbWluVGhyZXNob2xkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY29tcHJlc3Npb25UaHJlc2hvbGQgPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb21wcmVzc2lvblRocmVzaG9sZCA9IDA7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qKgorICAgICogVGFrZSB0aGlzIGZpbHRlciBvdXQgb2Ygc2VydmljZS4KKyAgICAqLworICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3koKSB7CisKKyAgICAgICAgdGhpcy5jb25maWcgPSBudWxsOworCisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIDxjb2RlPmRvRmlsdGVyPC9jb2RlPiBtZXRob2Qgb2YgdGhlIEZpbHRlciBpcyBjYWxsZWQgYnkgdGhlIGNvbnRhaW5lcgorICAgICAqIGVhY2ggdGltZSBhIHJlcXVlc3QvcmVzcG9uc2UgcGFpciBpcyBwYXNzZWQgdGhyb3VnaCB0aGUgY2hhaW4gZHVlCisgICAgICogdG8gYSBjbGllbnQgcmVxdWVzdCBmb3IgYSByZXNvdXJjZSBhdCB0aGUgZW5kIG9mIHRoZSBjaGFpbi4KKyAgICAgKiBUaGUgRmlsdGVyQ2hhaW4gcGFzc2VkIGludG8gdGhpcyBtZXRob2QgYWxsb3dzIHRoZSBGaWx0ZXIgdG8gcGFzcyBvbiB0aGUKKyAgICAgKiByZXF1ZXN0IGFuZCByZXNwb25zZSB0byB0aGUgbmV4dCBlbnRpdHkgaW4gdGhlIGNoYWluLjxwPgorICAgICAqIFRoaXMgbWV0aG9kIGZpcnN0IGV4YW1pbmVzIHRoZSByZXF1ZXN0IHRvIGNoZWNrIHdoZXRoZXIgdGhlIGNsaWVudCBzdXBwb3J0CisgICAgICogY29tcHJlc3Npb24uIDxicj4KKyAgICAgKiBJdCBzaW1wbHkganVzdCBwYXNzIHRoZSByZXF1ZXN0IGFuZCByZXNwb25zZSBpZiB0aGVyZSBpcyBubyBzdXBwb3J0IGZvcgorICAgICAqIGNvbXByZXNzaW9uLjxicj4KKyAgICAgKiBJZiB0aGUgY29tcHJlc3Npb24gc3VwcG9ydCBpcyBhdmFpbGFibGUsIGl0IGNyZWF0ZXMgYQorICAgICAqIENvbXByZXNzaW9uU2VydmxldFJlc3BvbnNlV3JhcHBlciBvYmplY3Qgd2hpY2ggY29tcHJlc3NlcyB0aGUgY29udGVudCBhbmQKKyAgICAgKiBtb2RpZmllcyB0aGUgaGVhZGVyIGlmIHRoZSBjb250ZW50IGxlbmd0aCBpcyBiaWcgZW5vdWdoLgorICAgICAqIEl0IHRoZW4gaW52b2tlcyB0aGUgbmV4dCBlbnRpdHkgaW4gdGhlIGNoYWluIHVzaW5nIHRoZSBGaWx0ZXJDaGFpbiBvYmplY3QKKyAgICAgKiAoPGNvZGU+Y2hhaW4uZG9GaWx0ZXIoKTwvY29kZT4pLCA8YnI+CisgICAgICoqLworCisgICAgcHVibGljIHZvaWQgZG9GaWx0ZXIgKCBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBGaWx0ZXJDaGFpbiBjaGFpbiApIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKGRlYnVnID4gMCkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJAZG9GaWx0ZXIiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb21wcmVzc2lvblRocmVzaG9sZCA9PSAwKSB7CisgICAgICAgICAgICBpZiAoZGVidWcgPiAwKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJkb0ZpbHRlciBnZXRzIGNhbGxlZCwgYnV0IGNvbXByZXNzaW9uVHJlc2hvbGQgaXMgc2V0IHRvIDAgLSBubyBjb21wcmVzc2lvbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2hhaW4uZG9GaWx0ZXIocmVxdWVzdCwgcmVzcG9uc2UpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiBzdXBwb3J0Q29tcHJlc3Npb24gPSBmYWxzZTsKKyAgICAgICAgaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBIdHRwU2VydmxldFJlcXVlc3QpIHsKKyAgICAgICAgICAgIGlmIChkZWJ1ZyA+IDEpIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInJlcXVlc3RVUkkgPSAiICsgKChIdHRwU2VydmxldFJlcXVlc3QpcmVxdWVzdCkuZ2V0UmVxdWVzdFVSSSgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQXJlIHdlIGFsbG93ZWQgdG8gY29tcHJlc3MgPworICAgICAgICAgICAgU3RyaW5nIHMgPSAoU3RyaW5nKSAoKEh0dHBTZXJ2bGV0UmVxdWVzdClyZXF1ZXN0KS5nZXRQYXJhbWV0ZXIoImd6aXAiKTsKKyAgICAgICAgICAgIGlmICgiZmFsc2UiLmVxdWFscyhzKSkgeworICAgICAgICAgICAgICAgIGlmIChkZWJ1ZyA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJnb3QgcGFyYW1ldGVyIGd6aXA9ZmFsc2UgLS0+IGRvbid0IGNvbXByZXNzLCBqdXN0IGNoYWluIGZpbHRlciIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjaGFpbi5kb0ZpbHRlcihyZXF1ZXN0LCByZXNwb25zZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBFbnVtZXJhdGlvbiBlID0KKyAgICAgICAgICAgICAgICAoKEh0dHBTZXJ2bGV0UmVxdWVzdClyZXF1ZXN0KS5nZXRIZWFkZXJzKCJBY2NlcHQtRW5jb2RpbmciKTsKKyAgICAgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKWUubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICBpZiAobmFtZS5pbmRleE9mKCJnemlwIikgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRlYnVnID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJzdXBwb3J0cyBjb21wcmVzc2lvbiIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRDb21wcmVzc2lvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRlYnVnID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJubyBzdXBwb3J0IGZvciBjb21wcmVzaW9uIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXN1cHBvcnRDb21wcmVzc2lvbikgeworICAgICAgICAgICAgaWYgKGRlYnVnID4gMCkgeworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZG9GaWx0ZXIgZ2V0cyBjYWxsZWQgd28gY29tcHJlc3Npb24iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNoYWluLmRvRmlsdGVyKHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChyZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBTZXJ2bGV0UmVzcG9uc2UpIHsKKyAgICAgICAgICAgICAgICBDb21wcmVzc2lvblNlcnZsZXRSZXNwb25zZVdyYXBwZXIgd3JhcHBlZFJlc3BvbnNlID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IENvbXByZXNzaW9uU2VydmxldFJlc3BvbnNlV3JhcHBlcigoSHR0cFNlcnZsZXRSZXNwb25zZSlyZXNwb25zZSk7CisgICAgICAgICAgICAgICAgd3JhcHBlZFJlc3BvbnNlLnNldERlYnVnTGV2ZWwoZGVidWcpOworICAgICAgICAgICAgICAgIHdyYXBwZWRSZXNwb25zZS5zZXRDb21wcmVzc2lvblRocmVzaG9sZChjb21wcmVzc2lvblRocmVzaG9sZCk7CisgICAgICAgICAgICAgICAgaWYgKGRlYnVnID4gMCkgeworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImRvRmlsdGVyIGdldHMgY2FsbGVkIHdpdGggY29tcHJlc3Npb24iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgY2hhaW4uZG9GaWx0ZXIocmVxdWVzdCwgd3JhcHBlZFJlc3BvbnNlKTsKKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICB3cmFwcGVkUmVzcG9uc2UuZmluaXNoUmVzcG9uc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IGZpbHRlciBjb25maWcKKyAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gaW5pdC4gUmVxdWlyZWQgYnkgV2VibG9naWMgNi4xCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsdGVyQ29uZmlnIFRoZSBmaWx0ZXIgY29uZmlndXJhdGlvbiBvYmplY3QKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGaWx0ZXJDb25maWcoRmlsdGVyQ29uZmlnIGZpbHRlckNvbmZpZykgeworICAgICAgICBpbml0KGZpbHRlckNvbmZpZyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGZpbHRlciBjb25maWcKKyAgICAgKiBSZXF1aXJlZCBieSBXZWJsb2dpYyA2LjEKKyAgICAgKi8KKyAgICBwdWJsaWMgRmlsdGVyQ29uZmlnIGdldEZpbHRlckNvbmZpZygpIHsKKyAgICAgICAgcmV0dXJuIGNvbmZpZzsKKyAgICB9CisKK30KKwpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2NvbXByZXNzaW9uRmlsdGVycy9Db21wcmVzc2lvbkZpbHRlclRlc3RTZXJ2bGV0LmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvY29tcHJlc3Npb25GaWx0ZXJzL0NvbXByZXNzaW9uRmlsdGVyVGVzdFNlcnZsZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2UyYjY3Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2NvbXByZXNzaW9uRmlsdGVycy9Db21wcmVzc2lvbkZpbHRlclRlc3RTZXJ2bGV0LmphdmEKQEAgLTAsMCArMSw1NyBAQAorLyoKKyogQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitwYWNrYWdlIGNvbXByZXNzaW9uRmlsdGVyczsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisvKioKKyAqIFZlcnkgU2ltcGxlIHRlc3Qgc2VydmxldCB0byB0ZXN0IGNvbXByZXNzaW9uIGZpbHRlcgorICogQGF1dGhvciBBbXkgUm9oCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kLCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgQ29tcHJlc3Npb25GaWx0ZXJUZXN0U2VydmxldCBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCisgICAgICAgIFNlcnZsZXRPdXRwdXRTdHJlYW0gb3V0ID0gcmVzcG9uc2UuZ2V0T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7CisKKyAgICAgICAgRW51bWVyYXRpb24gZSA9ICgoSHR0cFNlcnZsZXRSZXF1ZXN0KXJlcXVlc3QpLmdldEhlYWRlcnMoIkFjY2VwdC1FbmNvZGluZyIpOworICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKWUubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgIG91dC5wcmludGxuKG5hbWUpOworICAgICAgICAgICAgaWYgKG5hbWUuaW5kZXhPZigiZ3ppcCIpICE9IC0xKSB7CisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oImd6aXAgc3VwcG9ydGVkIC0tIGFibGUgdG8gY29tcHJlc3MiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCJnemlwIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgICAgb3V0LnByaW50bG4oIkNvbXByZXNzaW9uIEZpbHRlciBUZXN0IFNlcnZsZXQiKTsKKyAgICAgICAgb3V0LmNsb3NlKCk7CisgICAgfQorCit9CisKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9jb21wcmVzc2lvbkZpbHRlcnMvQ29tcHJlc3Npb25SZXNwb25zZVN0cmVhbS5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2NvbXByZXNzaW9uRmlsdGVycy9Db21wcmVzc2lvblJlc3BvbnNlU3RyZWFtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM3ZmIxOAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9jb21wcmVzc2lvbkZpbHRlcnMvQ29tcHJlc3Npb25SZXNwb25zZVN0cmVhbS5qYXZhCkBAIC0wLDAgKzEsMzE4IEBACisvKgorKiBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK3BhY2thZ2UgY29tcHJlc3Npb25GaWx0ZXJzOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLkdaSVBPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworCisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgPGI+U2VydmxldE91dHB1dFN0cmVhbTwvYj4gdGhhdCB3b3JrcyB3aXRoCisgKiB0aGUgQ29tcHJlc3Npb25TZXJ2bGV0UmVzcG9uc2VXcmFwcGVyIGltcGxlbWVudGF0aW9uLgorICoKKyAqIEBhdXRob3IgQW15IFJvaAorICogQGF1dGhvciBEbWl0cmkgVmFsZGluCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kLCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgQ29tcHJlc3Npb25SZXNwb25zZVN0cmVhbQorICAgIGV4dGVuZHMgU2VydmxldE91dHB1dFN0cmVhbSB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9ycworCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBzZXJ2bGV0IG91dHB1dCBzdHJlYW0gYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgUmVzcG9uc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIGFzc29jaWF0ZWQgcmVzcG9uc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgQ29tcHJlc3Npb25SZXNwb25zZVN0cmVhbShIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgSU9FeGNlcHRpb257CisKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgY2xvc2VkID0gZmFsc2U7CisgICAgICAgIHRoaXMucmVzcG9uc2UgPSByZXNwb25zZTsKKyAgICAgICAgdGhpcy5vdXRwdXQgPSByZXNwb25zZS5nZXRPdXRwdXRTdHJlYW0oKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSB0aHJlc2hvbGQgbnVtYmVyIHdoaWNoIGRlY2lkZXMgdG8gY29tcHJlc3Mgb3Igbm90LgorICAgICAqIFVzZXJzIGNhbiBjb25maWd1cmUgaW4gd2ViLnhtbCB0byBzZXQgaXQgdG8gZml0IHRoZWlyIG5lZWRzLgorICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgY29tcHJlc3Npb25UaHJlc2hvbGQgPSAwOworCisgICAgLyoqCisgICAgICogRGVidWcgbGV2ZWwKKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBkZWJ1ZyA9IDA7CisKKyAgICAvKioKKyAgICAgKiBUaGUgYnVmZmVyIHRocm91Z2ggd2hpY2ggYWxsIG9mIG91ciBvdXRwdXQgYnl0ZXMgYXJlIHBhc3NlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYnl0ZVtdIGJ1ZmZlciA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbnVtYmVyIG9mIGRhdGEgYnl0ZXMgY3VycmVudGx5IGluIHRoZSBidWZmZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIGludCBidWZmZXJDb3VudCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdW5kZXJseWluZyBnemlwIG91dHB1dCBzdHJlYW0gdG8gd2hpY2ggd2Ugc2hvdWxkIHdyaXRlIGRhdGEuCisgICAgICovCisgICAgcHJvdGVjdGVkIEdaSVBPdXRwdXRTdHJlYW0gZ3ppcHN0cmVhbSA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBIYXMgdGhpcyBzdHJlYW0gYmVlbiBjbG9zZWQ/CisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gY2xvc2VkID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY29udGVudCBsZW5ndGggcGFzdCB3aGljaCB3ZSB3aWxsIG5vdCB3cml0ZSwgb3IgLTEgaWYgdGhlcmUgaXMKKyAgICAgKiBubyBkZWZpbmVkIGNvbnRlbnQgbGVuZ3RoLgorICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgbGVuZ3RoID0gLTE7CisKKyAgICAvKioKKyAgICAgKiBUaGUgcmVzcG9uc2Ugd2l0aCB3aGljaCB0aGlzIHNlcnZsZXQgb3V0cHV0IHN0cmVhbSBpcyBhc3NvY2lhdGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFRoZSB1bmRlcmx5aW5nIHNlcnZrZXQgb3V0cHV0IHN0cmVhbSB0byB3aGljaCB3ZSBzaG91bGQgd3JpdGUgZGF0YS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU2VydmxldE91dHB1dFN0cmVhbSBvdXRwdXQgPSBudWxsOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworICAgIC8qKgorICAgICAqIFNldCBkZWJ1ZyBsZXZlbAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERlYnVnTGV2ZWwoaW50IGRlYnVnKSB7CisgICAgICAgIHRoaXMuZGVidWcgPSBkZWJ1ZzsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY29tcHJlc3Npb25UaHJlc2hvbGQgbnVtYmVyIGFuZCBjcmVhdGUgYnVmZmVyIGZvciB0aGlzIHNpemUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRCdWZmZXIoaW50IHRocmVzaG9sZCkgeworICAgICAgICBjb21wcmVzc2lvblRocmVzaG9sZCA9IHRocmVzaG9sZDsKKyAgICAgICAgYnVmZmVyID0gbmV3IGJ5dGVbY29tcHJlc3Npb25UaHJlc2hvbGRdOworICAgICAgICBpZiAoZGVidWcgPiAxKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImJ1ZmZlciBpcyBzZXQgdG8gIitjb21wcmVzc2lvblRocmVzaG9sZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbG9zZSB0aGlzIG91dHB1dCBzdHJlYW0sIGNhdXNpbmcgYW55IGJ1ZmZlcmVkIGRhdGEgdG8gYmUgZmx1c2hlZCBhbmQKKyAgICAgKiBhbnkgZnVydGhlciBvdXRwdXQgZGF0YSB0byB0aHJvdyBhbiBJT0V4Y2VwdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKGRlYnVnID4gMSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJjbG9zZSgpIEAgQ29tcHJlc3Npb25SZXNwb25zZVN0cmVhbSIpOworICAgICAgICB9CisgICAgICAgIGlmIChjbG9zZWQpCisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlRoaXMgb3V0cHV0IHN0cmVhbSBoYXMgYWxyZWFkeSBiZWVuIGNsb3NlZCIpOworCisgICAgICAgIGlmIChnemlwc3RyZWFtICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZsdXNoVG9HWmlwKCk7CisgICAgICAgICAgICBnemlwc3RyZWFtLmNsb3NlKCk7CisgICAgICAgICAgICBnemlwc3RyZWFtID0gbnVsbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChidWZmZXJDb3VudCA+IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoZGVidWcgPiAyKSB7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIm91dHB1dC53cml0ZSgiKTsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC53cml0ZShidWZmZXIsIDAsIGJ1ZmZlckNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIpIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG91dHB1dC53cml0ZShidWZmZXIsIDAsIGJ1ZmZlckNvdW50KTsKKyAgICAgICAgICAgICAgICBidWZmZXJDb3VudCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBvdXRwdXQuY2xvc2UoKTsKKyAgICAgICAgY2xvc2VkID0gdHJ1ZTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogRmx1c2ggYW55IGJ1ZmZlcmVkIGRhdGEgZm9yIHRoaXMgb3V0cHV0IHN0cmVhbSwgd2hpY2ggYWxzbyBjYXVzZXMgdGhlCisgICAgICogcmVzcG9uc2UgdG8gYmUgY29tbWl0dGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGZsdXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAoZGVidWcgPiAxKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImZsdXNoKCkgQCBDb21wcmVzc2lvblJlc3BvbnNlU3RyZWFtIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNsb3NlZCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJDYW5ub3QgZmx1c2ggYSBjbG9zZWQgb3V0cHV0IHN0cmVhbSIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGd6aXBzdHJlYW0gIT0gbnVsbCkgeworICAgICAgICAgICAgZ3ppcHN0cmVhbS5mbHVzaCgpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBmbHVzaFRvR1ppcCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKGRlYnVnID4gMSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJmbHVzaFRvR1ppcCgpIEAgQ29tcHJlc3Npb25SZXNwb25zZVN0cmVhbSIpOworICAgICAgICB9CisgICAgICAgIGlmIChidWZmZXJDb3VudCA+IDApIHsKKyAgICAgICAgICAgIGlmIChkZWJ1ZyA+IDEpIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImZsdXNoaW5nIG91dCB0byBHWmlwU3RyZWFtLCBidWZmZXJDb3VudCA9ICIgKyBidWZmZXJDb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3cml0ZVRvR1ppcChidWZmZXIsIDAsIGJ1ZmZlckNvdW50KTsKKyAgICAgICAgICAgIGJ1ZmZlckNvdW50ID0gMDsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGUgdGhlIHNwZWNpZmllZCBieXRlIHRvIG91ciBvdXRwdXQgc3RyZWFtLgorICAgICAqCisgICAgICogQHBhcmFtIGIgVGhlIGJ5dGUgdG8gYmUgd3JpdHRlbgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgd3JpdGUoaW50IGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKGRlYnVnID4gMSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ3cml0ZSAiK2IrIiBpbiBDb21wcmVzc2lvblJlc3BvbnNlU3RyZWFtICIpOworICAgICAgICB9CisgICAgICAgIGlmIChjbG9zZWQpCisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkNhbm5vdCB3cml0ZSB0byBhIGNsb3NlZCBvdXRwdXQgc3RyZWFtIik7CisKKyAgICAgICAgaWYgKGJ1ZmZlckNvdW50ID49IGJ1ZmZlci5sZW5ndGgpIHsKKyAgICAgICAgICAgIGZsdXNoVG9HWmlwKCk7CisgICAgICAgIH0KKworICAgICAgICBidWZmZXJbYnVmZmVyQ291bnQrK10gPSAoYnl0ZSkgYjsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogV3JpdGUgPGNvZGU+Yi5sZW5ndGg8L2NvZGU+IGJ5dGVzIGZyb20gdGhlIHNwZWNpZmllZCBieXRlIGFycmF5CisgICAgICogdG8gb3VyIG91dHB1dCBzdHJlYW0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYiBUaGUgYnl0ZSBhcnJheSB0byBiZSB3cml0dGVuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3cml0ZShieXRlIGJbXSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICB3cml0ZShiLCAwLCBiLmxlbmd0aCk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFdyaXRlIDxjb2RlPmxlbjwvY29kZT4gYnl0ZXMgZnJvbSB0aGUgc3BlY2lmaWVkIGJ5dGUgYXJyYXksIHN0YXJ0aW5nCisgICAgICogYXQgdGhlIHNwZWNpZmllZCBvZmZzZXQsIHRvIG91ciBvdXRwdXQgc3RyZWFtLgorICAgICAqCisgICAgICogQHBhcmFtIGIgVGhlIGJ5dGUgYXJyYXkgY29udGFpbmluZyB0aGUgYnl0ZXMgdG8gYmUgd3JpdHRlbgorICAgICAqIEBwYXJhbSBvZmYgWmVyby1yZWxhdGl2ZSBzdGFydGluZyBvZmZzZXQgb2YgdGhlIGJ5dGVzIHRvIGJlIHdyaXR0ZW4KKyAgICAgKiBAcGFyYW0gbGVuIFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgd3JpdHRlbgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZSBiW10sIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKGRlYnVnID4gMSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ3cml0ZSwgYnVmZmVyQ291bnQgPSAiICsgYnVmZmVyQ291bnQgKyAiIGxlbiA9ICIgKyBsZW4gKyAiIG9mZiA9ICIgKyBvZmYpOworICAgICAgICB9CisgICAgICAgIGlmIChkZWJ1ZyA+IDIpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIndyaXRlKCIpOworICAgICAgICAgICAgU3lzdGVtLm91dC53cml0ZShiLCBvZmYsIGxlbik7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIikiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjbG9zZWQpCisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkNhbm5vdCB3cml0ZSB0byBhIGNsb3NlZCBvdXRwdXQgc3RyZWFtIik7CisKKyAgICAgICAgaWYgKGxlbiA9PSAwKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8vIENhbiB3ZSB3cml0ZSBpbnRvIGJ1ZmZlciA/CisgICAgICAgIGlmIChsZW4gPD0gKGJ1ZmZlci5sZW5ndGggLSBidWZmZXJDb3VudCkpIHsKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYiwgb2ZmLCBidWZmZXIsIGJ1ZmZlckNvdW50LCBsZW4pOworICAgICAgICAgICAgYnVmZmVyQ291bnQgKz0gbGVuOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gVGhlcmUgaXMgbm90IGVub3VnaCBzcGFjZSBpbiBidWZmZXIuIEZsdXNoIGl0IC4uLgorICAgICAgICBmbHVzaFRvR1ppcCgpOworCisgICAgICAgIC8vIC4uLiBhbmQgdHJ5IGFnYWluLiBOb3RlLCB0aGF0IGJ1ZmZlckNvdW50ID0gMCBoZXJlICEKKyAgICAgICAgaWYgKGxlbiA8PSAoYnVmZmVyLmxlbmd0aCAtIGJ1ZmZlckNvdW50KSkgeworICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShiLCBvZmYsIGJ1ZmZlciwgYnVmZmVyQ291bnQsIGxlbik7CisgICAgICAgICAgICBidWZmZXJDb3VudCArPSBsZW47CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyB3cml0ZSBkaXJlY3QgdG8gZ3ppcAorICAgICAgICB3cml0ZVRvR1ppcChiLCBvZmYsIGxlbik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVUb0daaXAoYnl0ZSBiW10sIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKGRlYnVnID4gMSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ3cml0ZVRvR1ppcCwgbGVuID0gIiArIGxlbik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRlYnVnID4gMikgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgid3JpdGVUb0daaXAoIik7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LndyaXRlKGIsIG9mZiwgbGVuKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKSIpOworICAgICAgICB9CisgICAgICAgIGlmIChnemlwc3RyZWFtID09IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChkZWJ1ZyA+IDEpIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIm5ldyBHWklQT3V0cHV0U3RyZWFtIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXNwb25zZS5hZGRIZWFkZXIoIkNvbnRlbnQtRW5jb2RpbmciLCAiZ3ppcCIpOworICAgICAgICAgICAgZ3ppcHN0cmVhbSA9IG5ldyBHWklQT3V0cHV0U3RyZWFtKG91dHB1dCk7CisgICAgICAgIH0KKyAgICAgICAgZ3ppcHN0cmVhbS53cml0ZShiLCBvZmYsIGxlbik7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBhY2thZ2UgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBIYXMgdGhpcyByZXNwb25zZSBzdHJlYW0gYmVlbiBjbG9zZWQ/CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gY2xvc2VkKCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5jbG9zZWQpOworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvY29tcHJlc3Npb25GaWx0ZXJzL0NvbXByZXNzaW9uU2VydmxldFJlc3BvbnNlV3JhcHBlci5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2NvbXByZXNzaW9uRmlsdGVycy9Db21wcmVzc2lvblNlcnZsZXRSZXNwb25zZVdyYXBwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGFjYTY1Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2NvbXByZXNzaW9uRmlsdGVycy9Db21wcmVzc2lvblNlcnZsZXRSZXNwb25zZVdyYXBwZXIuamF2YQpAQCAtMCwwICsxLDI3NyBAQAorLyoKKyogQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitwYWNrYWdlIGNvbXByZXNzaW9uRmlsdGVyczsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldE91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXNwb25zZVdyYXBwZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyOworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIDxiPkh0dHBTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyPC9iPiB0aGF0IHdvcmtzIHdpdGgKKyAqIHRoZSBDb21wcmVzc2lvblNlcnZsZXRSZXNwb25zZVN0cmVhbSBpbXBsZW1lbnRhdGlvbi4uCisgKgorICogQGF1dGhvciBBbXkgUm9oCisgKiBAYXV0aG9yIERtaXRyaSBWYWxkaW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQsICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBDb21wcmVzc2lvblNlcnZsZXRSZXNwb25zZVdyYXBwZXIgZXh0ZW5kcyBIdHRwU2VydmxldFJlc3BvbnNlV3JhcHBlciB7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcgorCisgICAgLyoqCisgICAgICogQ2FsbHMgdGhlIHBhcmVudCBjb25zdHJ1Y3RvciB3aGljaCBjcmVhdGVzIGEgU2VydmxldFJlc3BvbnNlIGFkYXB0b3IKKyAgICAgKiB3cmFwcGluZyB0aGUgZ2l2ZW4gcmVzcG9uc2Ugb2JqZWN0LgorICAgICAqLworCisgICAgcHVibGljIENvbXByZXNzaW9uU2VydmxldFJlc3BvbnNlV3JhcHBlcihIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB7CisgICAgICAgIHN1cGVyKHJlc3BvbnNlKTsKKyAgICAgICAgb3JpZ1Jlc3BvbnNlID0gcmVzcG9uc2U7CisgICAgICAgIGlmIChkZWJ1ZyA+IDEpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ29tcHJlc3Npb25TZXJ2bGV0UmVzcG9uc2VXcmFwcGVyIGNvbnN0cnVjdG9yIGdldHMgY2FsbGVkIik7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisgICAgLyoqCisgICAgICogT3JpZ2luYWwgcmVzcG9uc2UKKyAgICAgKi8KKworICAgIHByb3RlY3RlZCBIdHRwU2VydmxldFJlc3BvbnNlIG9yaWdSZXNwb25zZSA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBEZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIFJlc3BvbnNlIGltcGxlbWVudGF0aW9uLgorICAgICAqLworCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgaW5mbyA9ICJDb21wcmVzc2lvblNlcnZsZXRSZXNwb25zZVdyYXBwZXIiOworCisgICAgLyoqCisgICAgICogVGhlIFNlcnZsZXRPdXRwdXRTdHJlYW0gdGhhdCBoYXMgYmVlbiByZXR1cm5lZCBieQorICAgICAqIDxjb2RlPmdldE91dHB1dFN0cmVhbSgpPC9jb2RlPiwgaWYgYW55LgorICAgICAqLworCisgICAgcHJvdGVjdGVkIFNlcnZsZXRPdXRwdXRTdHJlYW0gc3RyZWFtID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIFByaW50V3JpdGVyIHRoYXQgaGFzIGJlZW4gcmV0dXJuZWQgYnkKKyAgICAgKiA8Y29kZT5nZXRXcml0ZXIoKTwvY29kZT4sIGlmIGFueS4KKyAgICAgKi8KKworICAgIHByb3RlY3RlZCBQcmludFdyaXRlciB3cml0ZXIgPSBudWxsOworCisgICAgLyoqCisgICAgICogVGhlIHRocmVzaG9sZCBudW1iZXIgdG8gY29tcHJlc3MKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IHRocmVzaG9sZCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBEZWJ1ZyBsZXZlbAorICAgICAqLworICAgIHByaXZhdGUgaW50IGRlYnVnID0gMDsKKworICAgIC8qKgorICAgICAqIENvbnRlbnQgdHlwZQorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgY29udGVudFR5cGUgPSBudWxsOworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFNldCBjb250ZW50IHR5cGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb250ZW50VHlwZShTdHJpbmcgY29udGVudFR5cGUpIHsKKyAgICAgICAgaWYgKGRlYnVnID4gMSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJzZXRDb250ZW50VHlwZSB0byAiK2NvbnRlbnRUeXBlKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmNvbnRlbnRUeXBlID0gY29udGVudFR5cGU7CisgICAgICAgIG9yaWdSZXNwb25zZS5zZXRDb250ZW50VHlwZShjb250ZW50VHlwZSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhyZXNob2xkIG51bWJlcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbXByZXNzaW9uVGhyZXNob2xkKGludCB0aHJlc2hvbGQpIHsKKyAgICAgICAgaWYgKGRlYnVnID4gMSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJzZXRDb21wcmVzc2lvblRocmVzaG9sZCB0byAiICsgdGhyZXNob2xkKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLnRocmVzaG9sZCA9IHRocmVzaG9sZDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCBkZWJ1ZyBsZXZlbAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERlYnVnTGV2ZWwoaW50IGRlYnVnKSB7CisgICAgICAgIHRoaXMuZGVidWcgPSBkZWJ1ZzsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhbmQgcmV0dXJuIGEgU2VydmxldE91dHB1dFN0cmVhbSB0byB3cml0ZSB0aGUgY29udGVudAorICAgICAqIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFJlc3BvbnNlLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIFNlcnZsZXRPdXRwdXRTdHJlYW0gY3JlYXRlT3V0cHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGRlYnVnID4gMSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJjcmVhdGVPdXRwdXRTdHJlYW0gZ2V0cyBjYWxsZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIENvbXByZXNzaW9uUmVzcG9uc2VTdHJlYW0gc3RyZWFtID0gbmV3IENvbXByZXNzaW9uUmVzcG9uc2VTdHJlYW0ob3JpZ1Jlc3BvbnNlKTsKKyAgICAgICAgc3RyZWFtLnNldERlYnVnTGV2ZWwoZGVidWcpOworICAgICAgICBzdHJlYW0uc2V0QnVmZmVyKHRocmVzaG9sZCk7CisKKyAgICAgICAgcmV0dXJuIHN0cmVhbTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogRmluaXNoIGEgcmVzcG9uc2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZmluaXNoUmVzcG9uc2UoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAod3JpdGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB3cml0ZXIuY2xvc2UoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHN0cmVhbSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBzdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU2VydmxldFJlc3BvbnNlIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogRmx1c2ggdGhlIGJ1ZmZlciBhbmQgY29tbWl0IHRoaXMgcmVzcG9uc2UuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBmbHVzaEJ1ZmZlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChkZWJ1ZyA+IDEpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZmx1c2ggYnVmZmVyIEAgQ29tcHJlc3Npb25TZXJ2bGV0UmVzcG9uc2VXcmFwcGVyIik7CisgICAgICAgIH0KKyAgICAgICAgKChDb21wcmVzc2lvblJlc3BvbnNlU3RyZWFtKXN0cmVhbSkuZmx1c2goKTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2VydmxldCBvdXRwdXQgc3RyZWFtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFJlc3BvbnNlLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgPGNvZGU+Z2V0V3JpdGVyPC9jb2RlPiBoYXMKKyAgICAgKiAgYWxyZWFkeSBiZWVuIGNhbGxlZCBmb3IgdGhpcyByZXNwb25zZQorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBTZXJ2bGV0T3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKHdyaXRlciAhPSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZ2V0V3JpdGVyKCkgaGFzIGFscmVhZHkgYmVlbiBjYWxsZWQgZm9yIHRoaXMgcmVzcG9uc2UiKTsKKworICAgICAgICBpZiAoc3RyZWFtID09IG51bGwpCisgICAgICAgICAgICBzdHJlYW0gPSBjcmVhdGVPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgaWYgKGRlYnVnID4gMSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJzdHJlYW0gaXMgc2V0IHRvICIrc3RyZWFtKyIgaW4gZ2V0T3V0cHV0U3RyZWFtIik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKHN0cmVhbSk7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHdyaXRlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBSZXNwb25zZS4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIDxjb2RlPmdldE91dHB1dFN0cmVhbTwvY29kZT4gaGFzCisgICAgICogIGFscmVhZHkgYmVlbiBjYWxsZWQgZm9yIHRoaXMgcmVzcG9uc2UKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgUHJpbnRXcml0ZXIgZ2V0V3JpdGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAod3JpdGVyICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKHdyaXRlcik7CisKKyAgICAgICAgaWYgKHN0cmVhbSAhPSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZ2V0T3V0cHV0U3RyZWFtKCkgaGFzIGFscmVhZHkgYmVlbiBjYWxsZWQgZm9yIHRoaXMgcmVzcG9uc2UiKTsKKworICAgICAgICBzdHJlYW0gPSBjcmVhdGVPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgaWYgKGRlYnVnID4gMSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJzdHJlYW0gaXMgc2V0IHRvICIrc3RyZWFtKyIgaW4gZ2V0V3JpdGVyIik7CisgICAgICAgIH0KKyAgICAgICAgLy9TdHJpbmcgY2hhcnNldCA9IGdldENoYXJzZXRGcm9tQ29udGVudFR5cGUoY29udGVudFR5cGUpOworICAgICAgICBTdHJpbmcgY2hhckVuYyA9IG9yaWdSZXNwb25zZS5nZXRDaGFyYWN0ZXJFbmNvZGluZygpOworICAgICAgICBpZiAoZGVidWcgPiAxKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImNoYXJhY3RlciBlbmNvZGluZyBpcyAiICsgY2hhckVuYyk7CisgICAgICAgIH0KKyAgICAgICAgLy8gSHR0cFNlcnZsZXRSZXNwb25zZS5nZXRDaGFyYWN0ZXJFbmNvZGluZygpIHNob3VsZG4ndCByZXR1cm4gbnVsbAorICAgICAgICAvLyBhY2NvcmRpbmcgdGhlIHNwZWMsIHNvIGZlZWwgZnJlZSB0byByZW1vdmUgdGhhdCAiaWYiCisgICAgICAgIGlmIChjaGFyRW5jICE9IG51bGwpIHsKKyAgICAgICAgICAgIHdyaXRlciA9IG5ldyBQcmludFdyaXRlcihuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKHN0cmVhbSwgY2hhckVuYykpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgd3JpdGVyID0gbmV3IFByaW50V3JpdGVyKHN0cmVhbSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiAod3JpdGVyKTsKKworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgc2V0Q29udGVudExlbmd0aChpbnQgbGVuZ3RoKSB7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGNoYXJhY3RlciBmcm9tIGNvbnRlbnQgdHlwZS4gVGhpcyBtZXRob2Qgd2FzIHRha2VuIGZyb20gdG9tY2F0LgorICAgICAqIEBhdXRob3IgcmFqbworICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRDaGFyc2V0RnJvbUNvbnRlbnRUeXBlKFN0cmluZyB0eXBlKSB7CisKKyAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgaW50IHNlbWkgPSB0eXBlLmluZGV4T2YoIjsiKTsKKyAgICAgICAgaWYgKHNlbWkgPT0gLTEpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBhZnRlclNlbWkgPSB0eXBlLnN1YnN0cmluZyhzZW1pICsgMSk7CisgICAgICAgIGludCBjaGFyc2V0TG9jYXRpb24gPSBhZnRlclNlbWkuaW5kZXhPZigiY2hhcnNldD0iKTsKKyAgICAgICAgaWYoY2hhcnNldExvY2F0aW9uID09IC0xKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFN0cmluZyBhZnRlckNoYXJzZXQgPSBhZnRlclNlbWkuc3Vic3RyaW5nKGNoYXJzZXRMb2NhdGlvbiArIDgpOworICAgICAgICAgICAgU3RyaW5nIGVuY29kaW5nID0gYWZ0ZXJDaGFyc2V0LnRyaW0oKTsKKyAgICAgICAgICAgIHJldHVybiBlbmNvZGluZzsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2RhdGVzL0pzcENhbGVuZGFyLmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvZGF0ZXMvSnNwQ2FsZW5kYXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDE5NDc1Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2RhdGVzL0pzcENhbGVuZGFyLmphdmEKQEAgLTAsMCArMSwxNTIgQEAKKy8qCisqIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KK3BhY2thZ2UgZGF0ZXM7CisKK2ltcG9ydCBqYXZhLnRleHQuRGF0ZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworcHVibGljIGNsYXNzIEpzcENhbGVuZGFyIHsKKyAgICBDYWxlbmRhciAgY2FsZW5kYXIgPSBudWxsOworCisgICAgcHVibGljIEpzcENhbGVuZGFyKCkgeworCWNhbGVuZGFyID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsKKwlEYXRlIHRyaWFsVGltZSA9IG5ldyBEYXRlKCk7CisJY2FsZW5kYXIuc2V0VGltZSh0cmlhbFRpbWUpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0WWVhcigpIHsKKwlyZXR1cm4gY2FsZW5kYXIuZ2V0KENhbGVuZGFyLllFQVIpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgU3RyaW5nIGdldE1vbnRoKCkgeworCWludCBtID0gZ2V0TW9udGhJbnQoKTsKKwlTdHJpbmdbXSBtb250aHMgPSBuZXcgU3RyaW5nIFtdIHsgIkphbnVhcnkiLCAiRmVicnVhcnkiLCAiTWFyY2giLAorCQkJCQkiQXByaWwiLCAiTWF5IiwgIkp1bmUiLAorCQkJCQkiSnVseSIsICJBdWd1c3QiLCAiU2VwdGVtYmVyIiwKKwkJCQkJIk9jdG9iZXIiLCAiTm92ZW1iZXIiLCAiRGVjZW1iZXIiIH07CisJaWYgKG0gPiAxMikKKwkgICAgcmV0dXJuICJVbmtub3duIHRvIE1hbiI7CisJCisJcmV0dXJuIG1vbnRoc1ttIC0gMV07CisKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldERheSgpIHsKKwlpbnQgeCA9IGdldERheU9mV2VlaygpOworCVN0cmluZ1tdIGRheXMgPSBuZXcgU3RyaW5nW10geyJTdW5kYXkiLCAiTW9uZGF5IiwgIlR1ZXNkYXkiLCAiV2VkbmVzZGF5IiwgCisJCQkJICAgICAgIlRodXJzZGF5IiwgIkZyaWRheSIsICJTYXR1cmRheSJ9OworCisJaWYgKHggPiA3KQorCSAgICByZXR1cm4gIlVua25vd24gdG8gTWFuIjsKKworCXJldHVybiBkYXlzW3ggLSAxXTsKKworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgaW50IGdldE1vbnRoSW50KCkgeworCXJldHVybiAxICsgY2FsZW5kYXIuZ2V0KENhbGVuZGFyLk1PTlRIKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldERhdGUoKSB7CisJcmV0dXJuIGdldE1vbnRoSW50KCkgKyAiLyIgKyBnZXREYXlPZk1vbnRoKCkgKyAiLyIgKyAgZ2V0WWVhcigpOworCisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRUaW1lKCkgeworCXJldHVybiBnZXRIb3VyKCkgKyAiOiIgKyBnZXRNaW51dGUoKSArICI6IiArIGdldFNlY29uZCgpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0RGF5T2ZNb250aCgpIHsKKwlyZXR1cm4gY2FsZW5kYXIuZ2V0KENhbGVuZGFyLkRBWV9PRl9NT05USCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXREYXlPZlllYXIoKSB7CisJcmV0dXJuIGNhbGVuZGFyLmdldChDYWxlbmRhci5EQVlfT0ZfWUVBUik7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRXZWVrT2ZZZWFyKCkgeworCXJldHVybiBjYWxlbmRhci5nZXQoQ2FsZW5kYXIuV0VFS19PRl9ZRUFSKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFdlZWtPZk1vbnRoKCkgeworCXJldHVybiBjYWxlbmRhci5nZXQoQ2FsZW5kYXIuV0VFS19PRl9NT05USCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXREYXlPZldlZWsoKSB7CisJcmV0dXJuIGNhbGVuZGFyLmdldChDYWxlbmRhci5EQVlfT0ZfV0VFSyk7CisgICAgfQorICAgICAKKyAgICBwdWJsaWMgaW50IGdldEhvdXIoKSB7CisJcmV0dXJuIGNhbGVuZGFyLmdldChDYWxlbmRhci5IT1VSX09GX0RBWSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBpbnQgZ2V0TWludXRlKCkgeworCXJldHVybiBjYWxlbmRhci5nZXQoQ2FsZW5kYXIuTUlOVVRFKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBpbnQgZ2V0U2Vjb25kKCkgeworCXJldHVybiBjYWxlbmRhci5nZXQoQ2FsZW5kYXIuU0VDT05EKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB7CisJSnNwQ2FsZW5kYXIgZGIgPSBuZXcgSnNwQ2FsZW5kYXIoKTsKKwlwKCJkYXRlOiAiICsgZGIuZ2V0RGF5T2ZNb250aCgpKTsKKwlwKCJ5ZWFyOiAiICsgZGIuZ2V0WWVhcigpKTsKKwlwKCJtb250aDogIiArIGRiLmdldE1vbnRoKCkpOworCXAoInRpbWU6ICIgKyBkYi5nZXRUaW1lKCkpOworCXAoImRhdGU6ICIgKyBkYi5nZXREYXRlKCkpOworCXAoIkRheTogIiArIGRiLmdldERheSgpKTsKKwlwKCJEYXlPZlllYXI6ICIgKyBkYi5nZXREYXlPZlllYXIoKSk7CisJcCgiV2Vla09mWWVhcjogIiArIGRiLmdldFdlZWtPZlllYXIoKSk7CisJcCgiZXJhOiAiICsgZGIuZ2V0RXJhKCkpOworCXAoImFtcG06ICIgKyBkYi5nZXRBTVBNKCkpOworCXAoIkRTVDogIiArIGRiLmdldERTVE9mZnNldCgpKTsKKwlwKCJaT05FIE9mZnNldDogIiArIGRiLmdldFpvbmVPZmZzZXQoKSk7CisJcCgiVElNRVpPTkU6ICIgKyBkYi5nZXRVU1RpbWVab25lKCkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcChTdHJpbmcgeCkgeworCVN5c3RlbS5vdXQucHJpbnRsbih4KTsKKyAgICB9CisKKworICAgIHB1YmxpYyBpbnQgZ2V0RXJhKCkgeworCXJldHVybiBjYWxlbmRhci5nZXQoQ2FsZW5kYXIuRVJBKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFVTVGltZVpvbmUoKSB7CisJU3RyaW5nW10gem9uZXMgPSBuZXcgU3RyaW5nW10geyJIYXdhaWkiLCAiQWxhc2thbiIsICJQYWNpZmljIiwKKwkJCQkgICAgICAgIk1vdW50YWluIiwgIkNlbnRyYWwiLCAiRWFzdGVybiJ9OworCQorCXJldHVybiB6b25lc1sxMCArIGdldFpvbmVPZmZzZXQoKV07CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRab25lT2Zmc2V0KCkgeworCXJldHVybiBjYWxlbmRhci5nZXQoQ2FsZW5kYXIuWk9ORV9PRkZTRVQpLyg2MCo2MCoxMDAwKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBpbnQgZ2V0RFNUT2Zmc2V0KCkgeworCXJldHVybiBjYWxlbmRhci5nZXQoQ2FsZW5kYXIuRFNUX09GRlNFVCkvKDYwKjYwKjEwMDApOworICAgIH0KKworICAgIAorICAgIHB1YmxpYyBpbnQgZ2V0QU1QTSgpIHsKKwlyZXR1cm4gY2FsZW5kYXIuZ2V0KENhbGVuZGFyLkFNX1BNKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9lcnJvci9TbWFydC5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2Vycm9yL1NtYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTUxNThlNwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9lcnJvci9TbWFydC5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisqIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworCitwYWNrYWdlIGVycm9yOworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEubGFuZy4qOworCitwdWJsaWMgY2xhc3MgU21hcnQgeworCisgIFN0cmluZyBuYW1lID0gIkpTUCI7CisKKyAgcHVibGljIFN0cmluZyBnZXROYW1lICgpIHsKKwlyZXR1cm4gbmFtZTsKKyAgfQkKKworICBwdWJsaWMgdm9pZCBzZXROYW1lIChTdHJpbmcgbmFtZSkgeworCXRoaXMubmFtZSA9IG5hbWU7CisgIH0JCit9CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvZXhhbXBsZXMvRXhhbXBsZVRhZ0Jhc2UuamF2YSBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9leGFtcGxlcy9FeGFtcGxlVGFnQmFzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiNjRlOTUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvZXhhbXBsZXMvRXhhbXBsZVRhZ0Jhc2UuamF2YQpAQCAtMCwwICsxLDY2IEBACisvKgorKiBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCitwYWNrYWdlIGV4YW1wbGVzOworCitpbXBvcnQgamF2YXguc2VydmxldC5qc3AuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuKjsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIEV4YW1wbGVUYWdCYXNlIGV4dGVuZHMgQm9keVRhZ1N1cHBvcnQgeworCisgICAgcHVibGljIHZvaWQgc2V0UGFyZW50KFRhZyBwYXJlbnQpIHsKKyAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Qm9keUNvbnRlbnQoQm9keUNvbnRlbnQgYm9keU91dCkgeworICAgICAgICB0aGlzLmJvZHlPdXQgPSBib2R5T3V0OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBhZ2VDb250ZXh0KFBhZ2VDb250ZXh0IHBhZ2VDb250ZXh0KSB7CisgICAgICAgIHRoaXMucGFnZUNvbnRleHQgPSBwYWdlQ29udGV4dDsKKyAgICB9CisKKyAgICBwdWJsaWMgVGFnIGdldFBhcmVudCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50OworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgaW50IGRvU3RhcnRUYWcoKSB0aHJvd3MgSnNwRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIFNLSVBfQk9EWTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGRvRW5kVGFnKCkgdGhyb3dzIEpzcEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBFVkFMX1BBR0U7CisgICAgfQorICAgIAorCisgICAgLy8gRGVmYXVsdCBpbXBsZW1lbnRhdGlvbnMgZm9yIEJvZHlUYWcgbWV0aG9kcyBhcyB3ZWxsCisgICAgLy8ganVzdCBpbiBjYXNlIGEgdGFnIGRlY2lkZXMgdG8gaW1wbGVtZW50IEJvZHlUYWcuCisgICAgcHVibGljIHZvaWQgZG9Jbml0Qm9keSgpIHRocm93cyBKc3BFeGNlcHRpb24geworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZG9BZnRlckJvZHkoKSB0aHJvd3MgSnNwRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIFNLSVBfQk9EWTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZWxlYXNlKCkgeworICAgICAgICBib2R5T3V0ID0gbnVsbDsKKyAgICAgICAgcGFnZUNvbnRleHQgPSBudWxsOworICAgICAgICBwYXJlbnQgPSBudWxsOworICAgIH0KKyAgICAKKyAgICBwcm90ZWN0ZWQgQm9keUNvbnRlbnQgYm9keU91dDsKKyAgICBwcm90ZWN0ZWQgUGFnZUNvbnRleHQgcGFnZUNvbnRleHQ7CisgICAgcHJvdGVjdGVkIFRhZyBwYXJlbnQ7Cit9CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvZXhhbXBsZXMvRm9vVGFnLmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvZXhhbXBsZXMvRm9vVGFnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTAzZGMxOQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9leGFtcGxlcy9Gb29UYWcuamF2YQpAQCAtMCwwICsxLDgyIEBACisvKgorKiBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCitwYWNrYWdlIGV4YW1wbGVzOworCitpbXBvcnQgamF2YXguc2VydmxldC5qc3AuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuKjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmEuaW8uV3JpdGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKy8qKgorICogRXhhbXBsZTE6IHRoZSBzaW1wbGVzdCB0YWcKKyAqIENvbGxlY3QgYXR0cmlidXRlcyBhbmQgY2FsbCBpbnRvIHNvbWUgYWN0aW9ucworICoKKyAqIDxmb28gYXR0MT0iLi4uIiBhdHQyPSIuLi4uIiBhdHQzPSIuLi4uIiAvPgorICovCisKK3B1YmxpYyBjbGFzcyBGb29UYWcgCisgICAgZXh0ZW5kcyBFeGFtcGxlVGFnQmFzZSAKK3sKKyAgICBwcml2YXRlIFN0cmluZyBhdHRzW10gPSBuZXcgU3RyaW5nWzNdOworICAgIGludCBpID0gMDsKKyAgICAKKyAgICBwcml2YXRlIGZpbmFsIHZvaWQgc2V0QXR0KGludCBpbmRleCwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIGF0dHNbaW5kZXhdID0gdmFsdWU7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNldEF0dDEoU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIHNldEF0dCgwLCB2YWx1ZSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNldEF0dDIoU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIHNldEF0dCgxLCB2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QXR0MyhTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgc2V0QXR0KDIsIHZhbHVlKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUHJvY2VzcyBzdGFydCB0YWcKKyAgICAgKgorICAgICAqIEByZXR1cm4gRVZBTF9CT0RZX0lOQ0xVREUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGRvU3RhcnRUYWcoKSB0aHJvd3MgSnNwRXhjZXB0aW9uIHsKKyAgICAgICAgaSA9IDA7CisJcmV0dXJuIEVWQUxfQk9EWV9UQUc7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZG9Jbml0Qm9keSgpIHRocm93cyBKc3BFeGNlcHRpb24geworICAgICAgICBwYWdlQ29udGV4dC5zZXRBdHRyaWJ1dGUoIm1lbWJlciIsIGF0dHNbaV0pOworICAgICAgICBpKys7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBpbnQgZG9BZnRlckJvZHkoKSB0aHJvd3MgSnNwRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChpID09IDMpIHsKKyAgICAgICAgICAgICAgICBib2R5T3V0LndyaXRlT3V0KGJvZHlPdXQuZ2V0RW5jbG9zaW5nV3JpdGVyKCkpOworICAgICAgICAgICAgICAgIHJldHVybiBTS0lQX0JPRFk7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBwYWdlQ29udGV4dC5zZXRBdHRyaWJ1dGUoIm1lbWJlciIsIGF0dHNbaV0pOworICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgcmV0dXJuIEVWQUxfQk9EWV9UQUc7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSnNwVGFnRXhjZXB0aW9uKGV4LnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvZXhhbXBsZXMvRm9vVGFnRXh0cmFJbmZvLmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvZXhhbXBsZXMvRm9vVGFnRXh0cmFJbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzMyYzI4ZAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9leGFtcGxlcy9Gb29UYWdFeHRyYUluZm8uamF2YQpAQCAtMCwwICsxLDMyIEBACisvKgorKiBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCitwYWNrYWdlIGV4YW1wbGVzOworCitpbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0Lio7CisKK3B1YmxpYyBjbGFzcyBGb29UYWdFeHRyYUluZm8gZXh0ZW5kcyBUYWdFeHRyYUluZm8geworICAgIHB1YmxpYyBWYXJpYWJsZUluZm9bXSBnZXRWYXJpYWJsZUluZm8oVGFnRGF0YSBkYXRhKSB7CisgICAgICAgIHJldHVybiBuZXcgVmFyaWFibGVJbmZvW10gCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmV3IFZhcmlhYmxlSW5mbygibWVtYmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTdHJpbmciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhcmlhYmxlSW5mby5ORVNURUQpCisgICAgICAgICAgICB9OworICAgIH0KK30KKworICAgICAgICAKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9leGFtcGxlcy9Mb2dUYWcuamF2YSBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9leGFtcGxlcy9Mb2dUYWcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTJhM2Q1Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2V4YW1wbGVzL0xvZ1RhZy5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisqIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KK3BhY2thZ2UgZXhhbXBsZXM7CisKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLio7CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0Lio7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCisvKioKKyAqIExvZyB0aGUgY29udGVudHMgb2YgdGhlIGJvZHkuIENvdWxkIGJlIHVzZWQgdG8gaGFuZGxlIGVycm9ycyBldGMuIAorICovCitwdWJsaWMgY2xhc3MgTG9nVGFnIAorICAgIGV4dGVuZHMgRXhhbXBsZVRhZ0Jhc2UKK3sKKyAgICBib29sZWFuIHRvQnJvd3NlciA9IGZhbHNlOworICAgIAorICAgIHB1YmxpYyB2b2lkIHNldFRvQnJvd3NlcihTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCisgICAgICAgICAgICB0b0Jyb3dzZXIgPSBmYWxzZTsKKyAgICAgICAgZWxzZSBpZiAodmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpKQorICAgICAgICAgICAgdG9Ccm93c2VyID0gdHJ1ZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdG9Ccm93c2VyID0gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIGludCBkb1N0YXJ0VGFnKCkgdGhyb3dzIEpzcEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBFVkFMX0JPRFlfVEFHOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgaW50IGRvQWZ0ZXJCb2R5KCkgdGhyb3dzIEpzcEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTdHJpbmcgcyA9IGJvZHlPdXQuZ2V0U3RyaW5nKCk7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4ocyk7CisgICAgICAgICAgICBpZiAodG9Ccm93c2VyKQorICAgICAgICAgICAgICAgIGJvZHlPdXQud3JpdGVPdXQoYm9keU91dC5nZXRFbmNsb3NpbmdXcml0ZXIoKSk7CisgICAgICAgICAgICByZXR1cm4gU0tJUF9CT0RZOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEpzcFRhZ0V4Y2VwdGlvbihleC50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgIH0KK30KKworICAgIAorICAgICAgICAKKyAgICAKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9leGFtcGxlcy9TaG93U291cmNlLmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvZXhhbXBsZXMvU2hvd1NvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkYWYwY2YKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvZXhhbXBsZXMvU2hvd1NvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisqIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KK3BhY2thZ2UgZXhhbXBsZXM7CisKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC4qOworCitpbXBvcnQgamF2YS5pby4qOworCisvKioKKyAqIERpc3BsYXkgdGhlIHNvdXJjZXMgb2YgdGhlIEpTUCBmaWxlLgorICovCitwdWJsaWMgY2xhc3MgU2hvd1NvdXJjZQorICAgIGV4dGVuZHMgVGFnU3VwcG9ydAoreworICAgIFN0cmluZyBqc3BGaWxlOworICAgIAorICAgIHB1YmxpYyB2b2lkIHNldEpzcEZpbGUoU3RyaW5nIGpzcEZpbGUpIHsKKyAgICAgICAgdGhpcy5qc3BGaWxlID0ganNwRmlsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGRvRW5kVGFnKCkgdGhyb3dzIEpzcEV4Y2VwdGlvbiB7CisJaWYgKChqc3BGaWxlLmluZGV4T2YoICIuLiIgKSA+PSAwKSB8fAorICAgICAgICAgICAgKGpzcEZpbGUudG9VcHBlckNhc2UoKS5pbmRleE9mKCIvV0VCLUlORi8iKSAhPSAwKSB8fAorICAgICAgICAgICAgKGpzcEZpbGUudG9VcHBlckNhc2UoKS5pbmRleE9mKCIvTUVUQS1JTkYvIikgIT0gMCkpCisJICAgIHRocm93IG5ldyBKc3BUYWdFeGNlcHRpb24oIkludmFsaWQgSlNQIGZpbGUgIiArIGpzcEZpbGUpOworCisgICAgICAgIElucHV0U3RyZWFtIGluCisgICAgICAgICAgICA9IHBhZ2VDb250ZXh0LmdldFNlcnZsZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VBc1N0cmVhbShqc3BGaWxlKTsKKworICAgICAgICBpZiAoaW4gPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBKc3BUYWdFeGNlcHRpb24oIlVuYWJsZSB0byBmaW5kIEpTUCBmaWxlOiAiK2pzcEZpbGUpOworCisgICAgICAgIElucHV0U3RyZWFtUmVhZGVyIHJlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpbik7CisJSnNwV3JpdGVyIG91dCA9IHBhZ2VDb250ZXh0LmdldE91dCgpOworCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG91dC5wcmludGxuKCI8Ym9keT4iKTsKKyAgICAgICAgICAgIG91dC5wcmludGxuKCI8cHJlPiIpOworICAgICAgICAgICAgZm9yKGludCBjaCA9IGluLnJlYWQoKTsgY2ggIT0gLTE7IGNoID0gaW4ucmVhZCgpKQorICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnPCcpCisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCgiJmx0OyIpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KChjaGFyKSBjaCk7CisgICAgICAgICAgICBvdXQucHJpbnRsbigiPC9wcmU+Iik7CisgICAgICAgICAgICBvdXQucHJpbnRsbigiPC9ib2R5PiIpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEpzcFRhZ0V4Y2VwdGlvbigiSU9FeGNlcHRpb246ICIrZXgudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLmRvRW5kVGFnKCk7CisgICAgfQorfQorCisgICAgCisgICAgICAgIAorICAgIApkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2ZpbHRlcnMvRXhhbXBsZUZpbHRlci5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2ZpbHRlcnMvRXhhbXBsZUZpbHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzNzg0YTgKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvZmlsdGVycy9FeGFtcGxlRmlsdGVyLmphdmEKQEAgLTAsMCArMSwxNDAgQEAKKy8qCisqIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworCitwYWNrYWdlIGZpbHRlcnM7CisKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5GaWx0ZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5GaWx0ZXJDaGFpbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LkZpbHRlckNvbmZpZzsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldFJlc3BvbnNlOworCisKKy8qKgorICogRXhhbXBsZSBmaWx0ZXIgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gZWl0aGVyIGFuIGluZGl2aWR1YWwgc2VydmxldAorICogb3IgdG8gYSBVUkwgcGF0dGVybi4gIFRoaXMgZmlsdGVyIHBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zOgorICogPHVsPgorICogPGxpPkF0dGFjaGVzIGl0c2VsZiBhcyBhIHJlcXVlc3QgYXR0cmlidXRlLCB1bmRlciB0aGUgYXR0cmlidXRlIG5hbWUKKyAqICAgICBkZWZpbmVkIGJ5IHRoZSB2YWx1ZSBvZiB0aGUgPGNvZGU+YXR0cmlidXRlPC9jb2RlPiBpbml0aWFsaXphdGlvbgorICogICAgIHBhcmFtZXRlci48L2xpPgorICogPGxpPkNhbGN1bGF0ZXMgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgcmVxdWlyZWQgdG8gcGVyZm9ybSB0aGUKKyAqICAgICBzZXJ2bGV0IHByb2Nlc3NpbmcgcmVxdWlyZWQgYnkgdGhpcyByZXF1ZXN0LCBpbmNsdWRpbmcgYW55CisgKiAgICAgc3Vic2VxdWVudGx5IGRlZmluZWQgZmlsdGVycywgYW5kIGxvZ3MgdGhlIHJlc3VsdCB0byB0aGUgc2VydmxldAorICogICAgIGNvbnRleHQgbG9nIGZvciB0aGlzIGFwcGxpY2F0aW9uLgorICogPC91bD4KKyAqCisgKiBAYXV0aG9yIENyYWlnIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIEV4YW1wbGVGaWx0ZXIgaW1wbGVtZW50cyBGaWx0ZXIgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIHJlcXVlc3QgYXR0cmlidXRlIG5hbWUgdW5kZXIgd2hpY2ggd2Ugc3RvcmUgYSByZWZlcmVuY2UgdG8gb3Vyc2VsZi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBhdHRyaWJ1dGUgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZmlsdGVyIGNvbmZpZ3VyYXRpb24gb2JqZWN0IHdlIGFyZSBhc3NvY2lhdGVkIHdpdGguICBJZiB0aGlzIHZhbHVlCisgICAgICogaXMgbnVsbCwgdGhpcyBmaWx0ZXIgaW5zdGFuY2UgaXMgbm90IGN1cnJlbnRseSBjb25maWd1cmVkLgorICAgICAqLworICAgIHByaXZhdGUgRmlsdGVyQ29uZmlnIGZpbHRlckNvbmZpZyA9IG51bGw7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBUYWtlIHRoaXMgZmlsdGVyIG91dCBvZiBzZXJ2aWNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3koKSB7CisKKyAgICAgICAgdGhpcy5hdHRyaWJ1dGUgPSBudWxsOworICAgICAgICB0aGlzLmZpbHRlckNvbmZpZyA9IG51bGw7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRpbWUgdGhlIHByb2Nlc3NpbmcgdGhhdCBpcyBwZXJmb3JtZWQgYnkgYWxsIHN1YnNlcXVlbnQgZmlsdGVycyBpbiB0aGUKKyAgICAgKiBjdXJyZW50IGZpbHRlciBzdGFjaywgaW5jbHVkaW5nIHRoZSB1bHRpbWF0ZWx5IGludm9rZWQgc2VydmxldC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzdWx0IFRoZSBzZXJ2bGV0IHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqIEBwYXJhbSBjaGFpbiBUaGUgZmlsdGVyIGNoYWluIHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0IGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRvRmlsdGVyKFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGaWx0ZXJDaGFpbiBjaGFpbikKKwl0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisJLy8gU3RvcmUgb3Vyc2VsdmVzIGFzIGEgcmVxdWVzdCBhdHRyaWJ1dGUgKGlmIHJlcXVlc3RlZCkKKwlpZiAoYXR0cmlidXRlICE9IG51bGwpCisJICAgIHJlcXVlc3Quc2V0QXR0cmlidXRlKGF0dHJpYnV0ZSwgdGhpcyk7CisKKwkvLyBUaW1lIGFuZCBsb2cgdGhlIHN1YnNlcXVlbnQgcHJvY2Vzc2luZworCWxvbmcgc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIGNoYWluLmRvRmlsdGVyKHJlcXVlc3QsIHJlc3BvbnNlKTsKKwlsb25nIHN0b3BUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisJZmlsdGVyQ29uZmlnLmdldFNlcnZsZXRDb250ZXh0KCkubG9nCisJICAgICh0aGlzLnRvU3RyaW5nKCkgKyAiOiAiICsgKHN0b3BUaW1lIC0gc3RhcnRUaW1lKSArCisJICAgICAiIG1pbGxpc2Vjb25kcyIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBQbGFjZSB0aGlzIGZpbHRlciBpbnRvIHNlcnZpY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsdGVyQ29uZmlnIFRoZSBmaWx0ZXIgY29uZmlndXJhdGlvbiBvYmplY3QKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbml0KEZpbHRlckNvbmZpZyBmaWx0ZXJDb25maWcpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKKworCXRoaXMuZmlsdGVyQ29uZmlnID0gZmlsdGVyQ29uZmlnOworICAgICAgICB0aGlzLmF0dHJpYnV0ZSA9IGZpbHRlckNvbmZpZy5nZXRJbml0UGFyYW1ldGVyKCJhdHRyaWJ1dGUiKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisKKwlpZiAoZmlsdGVyQ29uZmlnID09IG51bGwpCisJICAgIHJldHVybiAoIkludm9rZXJGaWx0ZXIoKSIpOworCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIkludm9rZXJGaWx0ZXIoIik7CisJc2IuYXBwZW5kKGZpbHRlckNvbmZpZyk7CisJc2IuYXBwZW5kKCIpIik7CisJcmV0dXJuIChzYi50b1N0cmluZygpKTsKKworICAgIH0KKworCit9CisKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9maWx0ZXJzL1JlcXVlc3REdW1wZXJGaWx0ZXIuamF2YSBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9maWx0ZXJzL1JlcXVlc3REdW1wZXJGaWx0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODY0MmYzCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2ZpbHRlcnMvUmVxdWVzdER1bXBlckZpbHRlci5qYXZhCkBAIC0wLDAgKzEsMjAxIEBACisvKgorKiBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKworCitwYWNrYWdlIGZpbHRlcnM7CisKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKK2ltcG9ydCBqYXZhLnNxbC5UaW1lc3RhbXA7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YXguc2VydmxldC5GaWx0ZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5GaWx0ZXJDaGFpbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LkZpbHRlckNvbmZpZzsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldFJlc3BvbnNlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5Db29raWU7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKKworCisvKioKKyAqIEV4YW1wbGUgZmlsdGVyIHRoYXQgZHVtcHMgaW50ZXJlc3Rpbmcgc3RhdGUgaW5mb3JtYXRpb24gYWJvdXQgYSByZXF1ZXN0CisgKiB0byB0aGUgYXNzb2NpYXRlZCBzZXJ2bGV0IGNvbnRleHQgbG9nIGZpbGUsIGJlZm9yZSBhbGxvd2luZyB0aGUgc2VydmxldAorICogdG8gcHJvY2VzcyB0aGUgcmVxdWVzdCBpbiB0aGUgdXN1YWwgd2F5LiAgVGhpcyBjYW4gYmUgaW5zdGFsbGVkIGFzIG5lZWRlZAorICogdG8gYXNzaXN0IGluIGRlYnVnZ2luZyBwcm9ibGVtcy4KKyAqCisgKiBAYXV0aG9yIENyYWlnIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIFJlcXVlc3REdW1wZXJGaWx0ZXIgaW1wbGVtZW50cyBGaWx0ZXIgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIGZpbHRlciBjb25maWd1cmF0aW9uIG9iamVjdCB3ZSBhcmUgYXNzb2NpYXRlZCB3aXRoLiAgSWYgdGhpcyB2YWx1ZQorICAgICAqIGlzIG51bGwsIHRoaXMgZmlsdGVyIGluc3RhbmNlIGlzIG5vdCBjdXJyZW50bHkgY29uZmlndXJlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIEZpbHRlckNvbmZpZyBmaWx0ZXJDb25maWcgPSBudWxsOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogVGFrZSB0aGlzIGZpbHRlciBvdXQgb2Ygc2VydmljZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkZXN0cm95KCkgeworCisgICAgICAgIHRoaXMuZmlsdGVyQ29uZmlnID0gbnVsbDsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGltZSB0aGUgcHJvY2Vzc2luZyB0aGF0IGlzIHBlcmZvcm1lZCBieSBhbGwgc3Vic2VxdWVudCBmaWx0ZXJzIGluIHRoZQorICAgICAqIGN1cnJlbnQgZmlsdGVyIHN0YWNrLCBpbmNsdWRpbmcgdGhlIHVsdGltYXRlbHkgaW52b2tlZCBzZXJ2bGV0LgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXN1bHQgVGhlIHNlcnZsZXQgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICogQHBhcmFtIGNoYWluIFRoZSBmaWx0ZXIgY2hhaW4gd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgZG9GaWx0ZXIoU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZpbHRlckNoYWluIGNoYWluKQorCXRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKGZpbHRlckNvbmZpZyA9PSBudWxsKQorCSAgICByZXR1cm47CisKKwkvLyBSZW5kZXIgdGhlIGdlbmVyaWMgc2VydmxldCByZXF1ZXN0IHByb3BlcnRpZXMKKwlTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisJUHJpbnRXcml0ZXIgd3JpdGVyID0gbmV3IFByaW50V3JpdGVyKHN3KTsKKwl3cml0ZXIucHJpbnRsbigiUmVxdWVzdCBSZWNlaXZlZCBhdCAiICsKKwkJICAgICAgIChuZXcgVGltZXN0YW1wKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKSkpOworCXdyaXRlci5wcmludGxuKCIgY2hhcmFjdGVyRW5jb2Rpbmc9IiArIHJlcXVlc3QuZ2V0Q2hhcmFjdGVyRW5jb2RpbmcoKSk7CisJd3JpdGVyLnByaW50bG4oIiAgICAgY29udGVudExlbmd0aD0iICsgcmVxdWVzdC5nZXRDb250ZW50TGVuZ3RoKCkpOworCXdyaXRlci5wcmludGxuKCIgICAgICAgY29udGVudFR5cGU9IiArIHJlcXVlc3QuZ2V0Q29udGVudFR5cGUoKSk7CisJd3JpdGVyLnByaW50bG4oIiAgICAgICAgICAgIGxvY2FsZT0iICsgcmVxdWVzdC5nZXRMb2NhbGUoKSk7CisJd3JpdGVyLnByaW50KCIgICAgICAgICAgIGxvY2FsZXM9Iik7CisJRW51bWVyYXRpb24gbG9jYWxlcyA9IHJlcXVlc3QuZ2V0TG9jYWxlcygpOworCWJvb2xlYW4gZmlyc3QgPSB0cnVlOworCXdoaWxlIChsb2NhbGVzLmhhc01vcmVFbGVtZW50cygpKSB7CisJICAgIExvY2FsZSBsb2NhbGUgPSAoTG9jYWxlKSBsb2NhbGVzLm5leHRFbGVtZW50KCk7CisJICAgIGlmIChmaXJzdCkKKwkgICAgICAgIGZpcnN0ID0gZmFsc2U7CisJICAgIGVsc2UKKwkgICAgICAgIHdyaXRlci5wcmludCgiLCAiKTsKKwkgICAgd3JpdGVyLnByaW50KGxvY2FsZS50b1N0cmluZygpKTsKKwl9CisJd3JpdGVyLnByaW50bG4oKTsKKwlFbnVtZXJhdGlvbiBuYW1lcyA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyTmFtZXMoKTsKKwl3aGlsZSAobmFtZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKwkgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBuYW1lcy5uZXh0RWxlbWVudCgpOworCSAgICB3cml0ZXIucHJpbnQoIiAgICAgICAgIHBhcmFtZXRlcj0iICsgbmFtZSArICI9Iik7CisJICAgIFN0cmluZyB2YWx1ZXNbXSA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyVmFsdWVzKG5hbWUpOworCSAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgeworCSAgICAgICAgaWYgKGkgPiAwKQorCQkgICAgd3JpdGVyLnByaW50KCIsICIpOworCQl3cml0ZXIucHJpbnQodmFsdWVzW2ldKTsKKwkgICAgfQorCSAgICB3cml0ZXIucHJpbnRsbigpOworCX0KKwl3cml0ZXIucHJpbnRsbigiICAgICAgICAgIHByb3RvY29sPSIgKyByZXF1ZXN0LmdldFByb3RvY29sKCkpOworCXdyaXRlci5wcmludGxuKCIgICAgICAgIHJlbW90ZUFkZHI9IiArIHJlcXVlc3QuZ2V0UmVtb3RlQWRkcigpKTsKKwl3cml0ZXIucHJpbnRsbigiICAgICAgICByZW1vdGVIb3N0PSIgKyByZXF1ZXN0LmdldFJlbW90ZUhvc3QoKSk7CisJd3JpdGVyLnByaW50bG4oIiAgICAgICAgICAgIHNjaGVtZT0iICsgcmVxdWVzdC5nZXRTY2hlbWUoKSk7CisJd3JpdGVyLnByaW50bG4oIiAgICAgICAgc2VydmVyTmFtZT0iICsgcmVxdWVzdC5nZXRTZXJ2ZXJOYW1lKCkpOworCXdyaXRlci5wcmludGxuKCIgICAgICAgIHNlcnZlclBvcnQ9IiArIHJlcXVlc3QuZ2V0U2VydmVyUG9ydCgpKTsKKwl3cml0ZXIucHJpbnRsbigiICAgICAgICAgIGlzU2VjdXJlPSIgKyByZXF1ZXN0LmlzU2VjdXJlKCkpOworCisJLy8gUmVuZGVyIHRoZSBIVFRQIHNlcnZsZXQgcmVxdWVzdCBwcm9wZXJ0aWVzCisJaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBIdHRwU2VydmxldFJlcXVlc3QpIHsKKwkgICAgd3JpdGVyLnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOworCSAgICBIdHRwU2VydmxldFJlcXVlc3QgaHJlcXVlc3QgPSAoSHR0cFNlcnZsZXRSZXF1ZXN0KSByZXF1ZXN0OworCSAgICB3cml0ZXIucHJpbnRsbigiICAgICAgIGNvbnRleHRQYXRoPSIgKyBocmVxdWVzdC5nZXRDb250ZXh0UGF0aCgpKTsKKwkgICAgQ29va2llIGNvb2tpZXNbXSA9IGhyZXF1ZXN0LmdldENvb2tpZXMoKTsKKyAgICAgICAgICAgIGlmIChjb29raWVzID09IG51bGwpCisgICAgICAgICAgICAgICAgY29va2llcyA9IG5ldyBDb29raWVbMF07CisJICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29va2llcy5sZW5ndGg7IGkrKykgeworCSAgICAgICAgd3JpdGVyLnByaW50bG4oIiAgICAgICAgICAgIGNvb2tpZT0iICsgY29va2llc1tpXS5nZXROYW1lKCkgKworCQkJICAgICAgICI9IiArIGNvb2tpZXNbaV0uZ2V0VmFsdWUoKSk7CisJICAgIH0KKwkgICAgbmFtZXMgPSBocmVxdWVzdC5nZXRIZWFkZXJOYW1lcygpOworCSAgICB3aGlsZSAobmFtZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKwkgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZykgbmFtZXMubmV4dEVsZW1lbnQoKTsKKwkJU3RyaW5nIHZhbHVlID0gaHJlcXVlc3QuZ2V0SGVhZGVyKG5hbWUpOworCSAgICAgICAgd3JpdGVyLnByaW50bG4oIiAgICAgICAgICAgIGhlYWRlcj0iICsgbmFtZSArICI9IiArIHZhbHVlKTsKKwkgICAgfQorCSAgICB3cml0ZXIucHJpbnRsbigiICAgICAgICAgICAgbWV0aG9kPSIgKyBocmVxdWVzdC5nZXRNZXRob2QoKSk7CisJICAgIHdyaXRlci5wcmludGxuKCIgICAgICAgICAgcGF0aEluZm89IiArIGhyZXF1ZXN0LmdldFBhdGhJbmZvKCkpOworCSAgICB3cml0ZXIucHJpbnRsbigiICAgICAgIHF1ZXJ5U3RyaW5nPSIgKyBocmVxdWVzdC5nZXRRdWVyeVN0cmluZygpKTsKKwkgICAgd3JpdGVyLnByaW50bG4oIiAgICAgICAgcmVtb3RlVXNlcj0iICsgaHJlcXVlc3QuZ2V0UmVtb3RlVXNlcigpKTsKKwkgICAgd3JpdGVyLnByaW50bG4oInJlcXVlc3RlZFNlc3Npb25JZD0iICsKKwkJCSAgIGhyZXF1ZXN0LmdldFJlcXVlc3RlZFNlc3Npb25JZCgpKTsKKwkgICAgd3JpdGVyLnByaW50bG4oIiAgICAgICAgcmVxdWVzdFVSST0iICsgaHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpKTsKKwkgICAgd3JpdGVyLnByaW50bG4oIiAgICAgICBzZXJ2bGV0UGF0aD0iICsgaHJlcXVlc3QuZ2V0U2VydmxldFBhdGgoKSk7CisJfQorCXdyaXRlci5wcmludGxuKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsKKworCS8vIExvZyB0aGUgcmVzdWx0aW5nIHN0cmluZworCXdyaXRlci5mbHVzaCgpOworCWZpbHRlckNvbmZpZy5nZXRTZXJ2bGV0Q29udGV4dCgpLmxvZyhzdy5nZXRCdWZmZXIoKS50b1N0cmluZygpKTsKKworCS8vIFBhc3MgY29udHJvbCBvbiB0byB0aGUgbmV4dCBmaWx0ZXIKKyAgICAgICAgY2hhaW4uZG9GaWx0ZXIocmVxdWVzdCwgcmVzcG9uc2UpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBQbGFjZSB0aGlzIGZpbHRlciBpbnRvIHNlcnZpY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsdGVyQ29uZmlnIFRoZSBmaWx0ZXIgY29uZmlndXJhdGlvbiBvYmplY3QKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbml0KEZpbHRlckNvbmZpZyBmaWx0ZXJDb25maWcpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKKworCXRoaXMuZmlsdGVyQ29uZmlnID0gZmlsdGVyQ29uZmlnOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKworCWlmIChmaWx0ZXJDb25maWcgPT0gbnVsbCkKKwkgICAgcmV0dXJuICgiUmVxdWVzdER1bXBlckZpbHRlcigpIik7CisJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiUmVxdWVzdER1bXBlckZpbHRlcigiKTsKKwlzYi5hcHBlbmQoZmlsdGVyQ29uZmlnKTsKKwlzYi5hcHBlbmQoIikiKTsKKwlyZXR1cm4gKHNiLnRvU3RyaW5nKCkpOworCisgICAgfQorCisKK30KKwpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2ZpbHRlcnMvU2V0Q2hhcmFjdGVyRW5jb2RpbmdGaWx0ZXIuamF2YSBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9maWx0ZXJzL1NldENoYXJhY3RlckVuY29kaW5nRmlsdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU3NjViNQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9maWx0ZXJzL1NldENoYXJhY3RlckVuY29kaW5nRmlsdGVyLmphdmEKQEAgLTAsMCArMSwxNzIgQEAKKy8qCisqIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworCitwYWNrYWdlIGZpbHRlcnM7CisKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5GaWx0ZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5GaWx0ZXJDaGFpbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LkZpbHRlckNvbmZpZzsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlVuYXZhaWxhYmxlRXhjZXB0aW9uOworCisKKy8qKgorICogPHA+RXhhbXBsZSBmaWx0ZXIgdGhhdCBzZXRzIHRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcgdG8gYmUgdXNlZCBpbiBwYXJzaW5nIHRoZQorICogaW5jb21pbmcgcmVxdWVzdCwgZWl0aGVyIHVuY29uZGl0aW9uYWxseSBvciBvbmx5IGlmIHRoZSBjbGllbnQgZGlkIG5vdAorICogc3BlY2lmeSBhIGNoYXJhY3RlciBlbmNvZGluZy4gIENvbmZpZ3VyYXRpb24gb2YgdGhpcyBmaWx0ZXIgaXMgYmFzZWQgb24KKyAqIHRoZSBmb2xsb3dpbmcgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyczo8L3A+CisgKiA8dWw+CisgKiA8bGk+PHN0cm9uZz5lbmNvZGluZzwvc3Ryb25nPiAtIFRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcgdG8gYmUgY29uZmlndXJlZAorICogICAgIGZvciB0aGlzIHJlcXVlc3QsIGVpdGhlciBjb25kaXRpb25hbGx5IG9yIHVuY29uZGl0aW9uYWxseSBiYXNlZCBvbgorICogICAgIHRoZSA8Y29kZT5pZ25vcmU8L2NvZGU+IGluaXRpYWxpemF0aW9uIHBhcmFtZXRlci4gIFRoaXMgcGFyYW1ldGVyCisgKiAgICAgaXMgcmVxdWlyZWQsIHNvIHRoZXJlIGlzIG5vIGRlZmF1bHQuPC9saT4KKyAqIDxsaT48c3Ryb25nPmlnbm9yZTwvc3Ryb25nPiAtIElmIHNldCB0byAidHJ1ZSIsIGFueSBjaGFyYWN0ZXIgZW5jb2RpbmcKKyAqICAgICBzcGVjaWZpZWQgYnkgdGhlIGNsaWVudCBpcyBpZ25vcmVkLCBhbmQgdGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZQorICogICAgIDxjb2RlPnNlbGVjdEVuY29kaW5nKCk8L2NvZGU+IG1ldGhvZCBpcyBzZXQuICBJZiBzZXQgdG8gImZhbHNlLAorICogICAgIDxjb2RlPnNlbGVjdEVuY29kaW5nKCk8L2NvZGU+IGlzIGNhbGxlZCA8c3Ryb25nPm9ubHk8L3N0cm9uZz4gaWYgdGhlCisgKiAgICAgY2xpZW50IGhhcyBub3QgYWxyZWFkeSBzcGVjaWZpZWQgYW4gZW5jb2RpbmcuICBCeSBkZWZhdWx0LCB0aGlzCisgKiAgICAgcGFyYW1ldGVyIGlzIHNldCB0byAidHJ1ZSIuPC9saT4KKyAqIDwvdWw+CisgKgorICogPHA+QWx0aG91Z2ggdGhpcyBmaWx0ZXIgY2FuIGJlIHVzZWQgdW5jaGFuZ2VkLCBpdCBpcyBhbHNvIGVhc3kgdG8KKyAqIHN1YmNsYXNzIGl0IGFuZCBtYWtlIHRoZSA8Y29kZT5zZWxlY3RFbmNvZGluZygpPC9jb2RlPiBtZXRob2QgbW9yZQorICogaW50ZWxsaWdlbnQgYWJvdXQgd2hhdCBlbmNvZGluZyB0byBjaG9vc2UsIGJhc2VkIG9uIGNoYXJhY3RlcmlzdGljcyBvZgorICogdGhlIGluY29taW5nIHJlcXVlc3QgKHN1Y2ggYXMgdGhlIHZhbHVlcyBvZiB0aGUgPGNvZGU+QWNjZXB0LUxhbmd1YWdlPC9jb2RlPgorICogYW5kIDxjb2RlPlVzZXItQWdlbnQ8L2NvZGU+IGhlYWRlcnMsIG9yIGEgdmFsdWUgc3Rhc2hlZCBpbiB0aGUgY3VycmVudAorICogdXNlcidzIHNlc3Npb24uPC9wPgorICoKKyAqIEBhdXRob3IgQ3JhaWcgTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgU2V0Q2hhcmFjdGVyRW5jb2RpbmdGaWx0ZXIgaW1wbGVtZW50cyBGaWx0ZXIgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIGRlZmF1bHQgY2hhcmFjdGVyIGVuY29kaW5nIHRvIHNldCBmb3IgcmVxdWVzdHMgdGhhdCBwYXNzIHRocm91Z2gKKyAgICAgKiB0aGlzIGZpbHRlci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGVuY29kaW5nID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogVGhlIGZpbHRlciBjb25maWd1cmF0aW9uIG9iamVjdCB3ZSBhcmUgYXNzb2NpYXRlZCB3aXRoLiAgSWYgdGhpcyB2YWx1ZQorICAgICAqIGlzIG51bGwsIHRoaXMgZmlsdGVyIGluc3RhbmNlIGlzIG5vdCBjdXJyZW50bHkgY29uZmlndXJlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRmlsdGVyQ29uZmlnIGZpbHRlckNvbmZpZyA9IG51bGw7CisKKworICAgIC8qKgorICAgICAqIFNob3VsZCBhIGNoYXJhY3RlciBlbmNvZGluZyBzcGVjaWZpZWQgYnkgdGhlIGNsaWVudCBiZSBpZ25vcmVkPworICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGlnbm9yZSA9IHRydWU7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBUYWtlIHRoaXMgZmlsdGVyIG91dCBvZiBzZXJ2aWNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3koKSB7CisKKyAgICAgICAgdGhpcy5lbmNvZGluZyA9IG51bGw7CisgICAgICAgIHRoaXMuZmlsdGVyQ29uZmlnID0gbnVsbDsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2VsZWN0IGFuZCBzZXQgKGlmIHNwZWNpZmllZCkgdGhlIGNoYXJhY3RlciBlbmNvZGluZyB0byBiZSB1c2VkIHRvCisgICAgICogaW50ZXJwcmV0IHJlcXVlc3QgcGFyYW1ldGVycyBmb3IgdGhpcyByZXF1ZXN0LgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqIEBwYXJhbSByZXN1bHQgVGhlIHNlcnZsZXQgcmVzcG9uc2Ugd2UgYXJlIGNyZWF0aW5nCisgICAgICogQHBhcmFtIGNoYWluIFRoZSBmaWx0ZXIgY2hhaW4gd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgZG9GaWx0ZXIoU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZpbHRlckNoYWluIGNoYWluKQorCXRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gQ29uZGl0aW9uYWxseSBzZWxlY3QgYW5kIHNldCB0aGUgY2hhcmFjdGVyIGVuY29kaW5nIHRvIGJlIHVzZWQKKyAgICAgICAgaWYgKGlnbm9yZSB8fCAocmVxdWVzdC5nZXRDaGFyYWN0ZXJFbmNvZGluZygpID09IG51bGwpKSB7CisgICAgICAgICAgICBTdHJpbmcgZW5jb2RpbmcgPSBzZWxlY3RFbmNvZGluZyhyZXF1ZXN0KTsKKyAgICAgICAgICAgIGlmIChlbmNvZGluZyAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlcXVlc3Quc2V0Q2hhcmFjdGVyRW5jb2RpbmcoZW5jb2RpbmcpOworICAgICAgICB9CisKKwkvLyBQYXNzIGNvbnRyb2wgb24gdG8gdGhlIG5leHQgZmlsdGVyCisgICAgICAgIGNoYWluLmRvRmlsdGVyKHJlcXVlc3QsIHJlc3BvbnNlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUGxhY2UgdGhpcyBmaWx0ZXIgaW50byBzZXJ2aWNlLgorICAgICAqCisgICAgICogQHBhcmFtIGZpbHRlckNvbmZpZyBUaGUgZmlsdGVyIGNvbmZpZ3VyYXRpb24gb2JqZWN0CisgICAgICovCisgICAgcHVibGljIHZvaWQgaW5pdChGaWx0ZXJDb25maWcgZmlsdGVyQ29uZmlnKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7CisKKwl0aGlzLmZpbHRlckNvbmZpZyA9IGZpbHRlckNvbmZpZzsKKyAgICAgICAgdGhpcy5lbmNvZGluZyA9IGZpbHRlckNvbmZpZy5nZXRJbml0UGFyYW1ldGVyKCJlbmNvZGluZyIpOworICAgICAgICBTdHJpbmcgdmFsdWUgPSBmaWx0ZXJDb25maWcuZ2V0SW5pdFBhcmFtZXRlcigiaWdub3JlIik7CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQorICAgICAgICAgICAgdGhpcy5pZ25vcmUgPSB0cnVlOworICAgICAgICBlbHNlIGlmICh2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikpCisgICAgICAgICAgICB0aGlzLmlnbm9yZSA9IHRydWU7CisgICAgICAgIGVsc2UgaWYgKHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInllcyIpKQorICAgICAgICAgICAgdGhpcy5pZ25vcmUgPSB0cnVlOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0aGlzLmlnbm9yZSA9IGZhbHNlOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvdGVjdGVkIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogU2VsZWN0IGFuIGFwcHJvcHJpYXRlIGNoYXJhY3RlciBlbmNvZGluZyB0byBiZSB1c2VkLCBiYXNlZCBvbiB0aGUKKyAgICAgKiBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIGN1cnJlbnQgcmVxdWVzdCBhbmQvb3IgZmlsdGVyIGluaXRpYWxpemF0aW9uCisgICAgICogcGFyYW1ldGVycy4gIElmIG5vIGNoYXJhY3RlciBlbmNvZGluZyBzaG91bGQgYmUgc2V0LCByZXR1cm4KKyAgICAgKiA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB1bmNvbmRpdGlvbmFsbHkgcmV0dXJucyB0aGUgdmFsdWUgY29uZmlndXJlZAorICAgICAqIGJ5IHRoZSA8c3Ryb25nPmVuY29kaW5nPC9zdHJvbmc+IGluaXRpYWxpemF0aW9uIHBhcmFtZXRlciBmb3IgdGhpcworICAgICAqIGZpbHRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHNlbGVjdEVuY29kaW5nKFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMuZW5jb2RpbmcpOworCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9qc3AyL2V4YW1wbGVzL0Jvb2tCZWFuLmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvanNwMi9leGFtcGxlcy9Cb29rQmVhbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlMmYxOGQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvanNwMi9leGFtcGxlcy9Cb29rQmVhbi5qYXZhCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisqIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworCitwYWNrYWdlIGpzcDIuZXhhbXBsZXM7CisKK3B1YmxpYyBjbGFzcyBCb29rQmVhbiB7CisgICAgcHJpdmF0ZSBTdHJpbmcgdGl0bGU7CisgICAgcHJpdmF0ZSBTdHJpbmcgYXV0aG9yOworICAgIHByaXZhdGUgU3RyaW5nIGlzYm47CisgICAgCisgICAgcHVibGljIEJvb2tCZWFuKCBTdHJpbmcgdGl0bGUsIFN0cmluZyBhdXRob3IsIFN0cmluZyBpc2JuICkgeworICAgICAgICB0aGlzLnRpdGxlID0gdGl0bGU7CisgICAgICAgIHRoaXMuYXV0aG9yID0gYXV0aG9yOworICAgICAgICB0aGlzLmlzYm4gPSBpc2JuOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGl0bGUoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnRpdGxlOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgU3RyaW5nIGdldEF1dGhvcigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuYXV0aG9yOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgU3RyaW5nIGdldElzYm4oKSB7CisgICAgICAgIHJldHVybiB0aGlzLmlzYm47CisgICAgfQorICAgIAorfQpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2pzcDIvZXhhbXBsZXMvRm9vQmVhbi5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2pzcDIvZXhhbXBsZXMvRm9vQmVhbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwYmQxMDcKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvanNwMi9leGFtcGxlcy9Gb29CZWFuLmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyoKKyogQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisKK3BhY2thZ2UganNwMi5leGFtcGxlczsKKworcHVibGljIGNsYXNzIEZvb0JlYW4geworICAgIHByaXZhdGUgU3RyaW5nIGJhcjsKKyAgICAKKyAgICBwdWJsaWMgRm9vQmVhbigpIHsKKyAgICAgICAgYmFyID0gIkluaXRpYWwgdmFsdWUiOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgU3RyaW5nIGdldEJhcigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuYmFyOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRCYXIoU3RyaW5nIGJhcikgeworICAgICAgICB0aGlzLmJhciA9IGJhcjsKKyAgICB9CisgICAgCit9CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvanNwMi9leGFtcGxlcy9lbC9GdW5jdGlvbnMuamF2YSBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9qc3AyL2V4YW1wbGVzL2VsL0Z1bmN0aW9ucy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0NzMyZTIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvanNwMi9leGFtcGxlcy9lbC9GdW5jdGlvbnMuamF2YQpAQCAtMCwwICsxLDQ0IEBACisvKgorKiBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCitwYWNrYWdlIGpzcDIuZXhhbXBsZXMuZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworLyoqCisgKiBEZWZpbmVzIHRoZSBmdW5jdGlvbnMgZm9yIHRoZSBqc3AyIGV4YW1wbGUgdGFnIGxpYnJhcnkuCisgKiAKKyAqIDxwPkVhY2ggZnVuY3Rpb24gaXMgZGVmaW5lZCBhcyBhIHN0YXRpYyBtZXRob2QuPC9wPgorICovCitwdWJsaWMgY2xhc3MgRnVuY3Rpb25zIHsKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyByZXZlcnNlKCBTdHJpbmcgdGV4dCApIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdCdWZmZXIoIHRleHQgKS5yZXZlcnNlKCkudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGludCBudW1Wb3dlbHMoIFN0cmluZyB0ZXh0ICkgeworICAgICAgICBTdHJpbmcgdm93ZWxzID0gImFlaW91QUVJT1UiOworCWludCByZXN1bHQgPSAwOworICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IHRleHQubGVuZ3RoKCk7IGkrKyApIHsKKwkgICAgaWYoIHZvd2Vscy5pbmRleE9mKCB0ZXh0LmNoYXJBdCggaSApICkgIT0gLTEgKSB7CisJICAgICAgICByZXN1bHQrKzsKKwkgICAgfQorCX0KKwlyZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNhcHMoIFN0cmluZyB0ZXh0ICkgeworICAgICAgICByZXR1cm4gdGV4dC50b1VwcGVyQ2FzZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9qc3AyL2V4YW1wbGVzL3NpbXBsZXRhZy9FY2hvQXR0cmlidXRlc1RhZy5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2pzcDIvZXhhbXBsZXMvc2ltcGxldGFnL0VjaG9BdHRyaWJ1dGVzVGFnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM1NWRiOQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9qc3AyL2V4YW1wbGVzL3NpbXBsZXRhZy9FY2hvQXR0cmlidXRlc1RhZy5qYXZhCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisqIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworCitwYWNrYWdlIGpzcDIuZXhhbXBsZXMuc2ltcGxldGFnOworCitpbXBvcnQgamF2YXguc2VydmxldC5qc3AuSnNwRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLkpzcFdyaXRlcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuU2ltcGxlVGFnU3VwcG9ydDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuRHluYW1pY0F0dHJpYnV0ZXM7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworLyoqCisgKiBTaW1wbGVUYWcgaGFuZGxlciB0aGF0IGVjaG9lcyBhbGwgaXRzIGF0dHJpYnV0ZXMgCisgKi8KK3B1YmxpYyBjbGFzcyBFY2hvQXR0cmlidXRlc1RhZyAKKyAgICBleHRlbmRzIFNpbXBsZVRhZ1N1cHBvcnQKKyAgICBpbXBsZW1lbnRzIER5bmFtaWNBdHRyaWJ1dGVzCit7CisgICAgcHJpdmF0ZSBBcnJheUxpc3Qga2V5cyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICBwcml2YXRlIEFycmF5TGlzdCB2YWx1ZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisKKyAgICBwdWJsaWMgdm9pZCBkb1RhZygpIHRocm93cyBKc3BFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKwlKc3BXcml0ZXIgb3V0ID0gZ2V0SnNwQ29udGV4dCgpLmdldE91dCgpOworCWZvciggaW50IGkgPSAwOyBpIDwga2V5cy5zaXplKCk7IGkrKyApIHsKKwkgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpa2V5cy5nZXQoIGkgKTsKKwkgICAgT2JqZWN0IHZhbHVlID0gdmFsdWVzLmdldCggaSApOworCSAgICBvdXQucHJpbnRsbiggIjxsaT4iICsga2V5ICsgIiA9ICIgKyB2YWx1ZSArICI8L2xpPiIgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldER5bmFtaWNBdHRyaWJ1dGUoIFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIAorCU9iamVjdCB2YWx1ZSApIAorCXRocm93cyBKc3BFeGNlcHRpb24KKyAgICB7CisJa2V5cy5hZGQoIGxvY2FsTmFtZSApOworCXZhbHVlcy5hZGQoIHZhbHVlICk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2pzcDIvZXhhbXBsZXMvc2ltcGxldGFnL0ZpbmRCb29rU2ltcGxlVGFnLmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvanNwMi9leGFtcGxlcy9zaW1wbGV0YWcvRmluZEJvb2tTaW1wbGVUYWcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmE1ZTE1Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2pzcDIvZXhhbXBsZXMvc2ltcGxldGFnL0ZpbmRCb29rU2ltcGxlVGFnLmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyoKKyogQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisKK3BhY2thZ2UganNwMi5leGFtcGxlcy5zaW1wbGV0YWc7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC5Kc3BFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlNpbXBsZVRhZ1N1cHBvcnQ7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQganNwMi5leGFtcGxlcy5Cb29rQmVhbjsKKworLyoqCisgKiBTaW1wbGVUYWcgaGFuZGxlciB0aGF0IHByZXRlbmRzIHRvIHNlYXJjaCBmb3IgYSBib29rLCBhbmQgc3RvcmVzCisgKiB0aGUgcmVzdWx0IGluIGEgc2NvcGVkIHZhcmlhYmxlLgorICovCitwdWJsaWMgY2xhc3MgRmluZEJvb2tTaW1wbGVUYWcgZXh0ZW5kcyBTaW1wbGVUYWdTdXBwb3J0IHsKKyAgICBwcml2YXRlIFN0cmluZyB2YXI7CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJPT0tfVElUTEUgPSAiVGhlIExvcmQgb2YgdGhlIFJpbmdzIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQk9PS19BVVRIT1IgPSAiSi4gUi4gUi4gVG9sa2VpbiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJPT0tfSVNCTiA9ICIwNjE4MDAyMjUxIjsKKworICAgIHB1YmxpYyB2b2lkIGRvVGFnKCkgdGhyb3dzIEpzcEV4Y2VwdGlvbiB7CisgICAgICAgIEJvb2tCZWFuIGJvb2sgPSBuZXcgQm9va0JlYW4oIEJPT0tfVElUTEUsIEJPT0tfQVVUSE9SLCBCT09LX0lTQk4gKTsKKyAgICAgICAgZ2V0SnNwQ29udGV4dCgpLnNldEF0dHJpYnV0ZSggdGhpcy52YXIsIGJvb2sgKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRWYXIoIFN0cmluZyB2YXIgKSB7CisJdGhpcy52YXIgPSB2YXI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2pzcDIvZXhhbXBsZXMvc2ltcGxldGFnL0hlbGxvV29ybGRTaW1wbGVUYWcuamF2YSBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9qc3AyL2V4YW1wbGVzL3NpbXBsZXRhZy9IZWxsb1dvcmxkU2ltcGxlVGFnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E0MTk2YwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9qc3AyL2V4YW1wbGVzL3NpbXBsZXRhZy9IZWxsb1dvcmxkU2ltcGxlVGFnLmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoKKyogQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisKK3BhY2thZ2UganNwMi5leGFtcGxlcy5zaW1wbGV0YWc7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC5Kc3BFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlNpbXBsZVRhZ1N1cHBvcnQ7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworLyoqCisgKiBTaW1wbGVUYWcgaGFuZGxlciB0aGF0IHByaW50cyAiSGVsbG8sIHdvcmxkISIKKyAqLworcHVibGljIGNsYXNzIEhlbGxvV29ybGRTaW1wbGVUYWcgZXh0ZW5kcyBTaW1wbGVUYWdTdXBwb3J0IHsKKyAgICBwdWJsaWMgdm9pZCBkb1RhZygpIHRocm93cyBKc3BFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKwlnZXRKc3BDb250ZXh0KCkuZ2V0T3V0KCkud3JpdGUoICJIZWxsbywgd29ybGQhIiApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9qc3AyL2V4YW1wbGVzL3NpbXBsZXRhZy9SZXBlYXRTaW1wbGVUYWcuamF2YSBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9qc3AyL2V4YW1wbGVzL3NpbXBsZXRhZy9SZXBlYXRTaW1wbGVUYWcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjRiMWU1Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2pzcDIvZXhhbXBsZXMvc2ltcGxldGFnL1JlcGVhdFNpbXBsZVRhZy5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisqIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworCitwYWNrYWdlIGpzcDIuZXhhbXBsZXMuc2ltcGxldGFnOworCitpbXBvcnQgamF2YXguc2VydmxldC5qc3AuSnNwRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5TaW1wbGVUYWdTdXBwb3J0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKy8qKgorICogU2ltcGxlVGFnIGhhbmRsZXIgdGhhdCBhY2NlcHRzIGEgbnVtIGF0dHJpYnV0ZSBhbmQgCisgKiBpbnZva2VzIGl0cyBib2R5ICdudW0nIHRpbWVzLgorICovCitwdWJsaWMgY2xhc3MgUmVwZWF0U2ltcGxlVGFnIGV4dGVuZHMgU2ltcGxlVGFnU3VwcG9ydCB7CisgICAgcHJpdmF0ZSBpbnQgbnVtOworCisgICAgcHVibGljIHZvaWQgZG9UYWcoKSB0aHJvd3MgSnNwRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZvciAoaW50IGk9MDsgaTxudW07IGkrKykgeworICAgICAgICAgICAgZ2V0SnNwQ29udGV4dCgpLnNldEF0dHJpYnV0ZSgiY291bnQiLCBTdHJpbmcudmFsdWVPZiggaSArIDEgKSApOworCSAgICBnZXRKc3BCb2R5KCkuaW52b2tlKG51bGwpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TnVtKGludCBudW0pIHsKKwl0aGlzLm51bSA9IG51bTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvanNwMi9leGFtcGxlcy9zaW1wbGV0YWcvU2h1ZmZsZVNpbXBsZVRhZy5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2pzcDIvZXhhbXBsZXMvc2ltcGxldGFnL1NodWZmbGVTaW1wbGVUYWcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzEyMDk5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2pzcDIvZXhhbXBsZXMvc2ltcGxldGFnL1NodWZmbGVTaW1wbGVUYWcuamF2YQpAQCAtMCwwICsxLDgxIEBACisvKgorKiBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKworcGFja2FnZSBqc3AyLmV4YW1wbGVzLnNpbXBsZXRhZzsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLkpzcEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuSnNwRnJhZ21lbnQ7CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlNpbXBsZVRhZ1N1cHBvcnQ7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworLyoqCisgKiBTaW1wbGVUYWcgaGFuZGxlciB0aGF0IGFjY2VwdHMgdGFrZXMgdGhyZWUgYXR0cmlidXRlcyBvZiB0eXBlCisgKiBKc3BGcmFnbWVudCBhbmQgaW52b2tlcyB0aGVuIGluIGEgcmFuZG9tIG9yZGVyLgorICovCitwdWJsaWMgY2xhc3MgU2h1ZmZsZVNpbXBsZVRhZyBleHRlbmRzIFNpbXBsZVRhZ1N1cHBvcnQgeworICAgIHByaXZhdGUgSnNwRnJhZ21lbnQgZnJhZ21lbnQxOworICAgIHByaXZhdGUgSnNwRnJhZ21lbnQgZnJhZ21lbnQyOworICAgIHByaXZhdGUgSnNwRnJhZ21lbnQgZnJhZ21lbnQzOworCisgICAgcHVibGljIHZvaWQgZG9UYWcoKSB0aHJvd3MgSnNwRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHN3aXRjaCggKGludCkoTWF0aC5yYW5kb20oKSAqIDYpICkgeworICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIGZyYWdtZW50MS5pbnZva2UoIG51bGwgKTsKKyAgICAgICAgICAgICAgICBmcmFnbWVudDIuaW52b2tlKCBudWxsICk7CisgICAgICAgICAgICAgICAgZnJhZ21lbnQzLmludm9rZSggbnVsbCApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgIGZyYWdtZW50MS5pbnZva2UoIG51bGwgKTsKKyAgICAgICAgICAgICAgICBmcmFnbWVudDMuaW52b2tlKCBudWxsICk7CisgICAgICAgICAgICAgICAgZnJhZ21lbnQyLmludm9rZSggbnVsbCApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgIGZyYWdtZW50Mi5pbnZva2UoIG51bGwgKTsKKyAgICAgICAgICAgICAgICBmcmFnbWVudDEuaW52b2tlKCBudWxsICk7CisgICAgICAgICAgICAgICAgZnJhZ21lbnQzLmludm9rZSggbnVsbCApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgIGZyYWdtZW50Mi5pbnZva2UoIG51bGwgKTsKKyAgICAgICAgICAgICAgICBmcmFnbWVudDMuaW52b2tlKCBudWxsICk7CisgICAgICAgICAgICAgICAgZnJhZ21lbnQxLmludm9rZSggbnVsbCApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgIGZyYWdtZW50My5pbnZva2UoIG51bGwgKTsKKyAgICAgICAgICAgICAgICBmcmFnbWVudDEuaW52b2tlKCBudWxsICk7CisgICAgICAgICAgICAgICAgZnJhZ21lbnQyLmludm9rZSggbnVsbCApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgIGZyYWdtZW50My5pbnZva2UoIG51bGwgKTsKKyAgICAgICAgICAgICAgICBmcmFnbWVudDIuaW52b2tlKCBudWxsICk7CisgICAgICAgICAgICAgICAgZnJhZ21lbnQxLmludm9rZSggbnVsbCApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RnJhZ21lbnQxKCBKc3BGcmFnbWVudCBmcmFnbWVudDEgKSB7CisgICAgICAgIHRoaXMuZnJhZ21lbnQxID0gZnJhZ21lbnQxOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRGcmFnbWVudDIoIEpzcEZyYWdtZW50IGZyYWdtZW50MiApIHsKKyAgICAgICAgdGhpcy5mcmFnbWVudDIgPSBmcmFnbWVudDI7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNldEZyYWdtZW50MyggSnNwRnJhZ21lbnQgZnJhZ21lbnQzICkgeworICAgICAgICB0aGlzLmZyYWdtZW50MyA9IGZyYWdtZW50MzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvanNwMi9leGFtcGxlcy9zaW1wbGV0YWcvVGlsZVNpbXBsZVRhZy5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2pzcDIvZXhhbXBsZXMvc2ltcGxldGFnL1RpbGVTaW1wbGVUYWcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjMzNDgwCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2pzcDIvZXhhbXBsZXMvc2ltcGxldGFnL1RpbGVTaW1wbGVUYWcuamF2YQpAQCAtMCwwICsxLDQ2IEBACisvKgorKiBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKworcGFja2FnZSBqc3AyLmV4YW1wbGVzLnNpbXBsZXRhZzsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLkpzcEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuU2ltcGxlVGFnU3VwcG9ydDsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworCisvKioKKyAqIERpc3BsYXlzIGEgdGlsZSBhcyBhIHNpbmdsZSBjZWxsIGluIGEgdGFibGUuCisgKi8KK3B1YmxpYyBjbGFzcyBUaWxlU2ltcGxlVGFnIGV4dGVuZHMgU2ltcGxlVGFnU3VwcG9ydCB7CisgICAgcHJpdmF0ZSBTdHJpbmcgY29sb3I7CisgICAgcHJpdmF0ZSBTdHJpbmcgbGFiZWw7CisKKyAgICBwdWJsaWMgdm9pZCBkb1RhZygpIHRocm93cyBKc3BFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKwlnZXRKc3BDb250ZXh0KCkuZ2V0T3V0KCkud3JpdGUoIAorCSAgICAiPHRkIHdpZHRoPVwiMzJcIiBoZWlnaHQ9XCIzMlwiIGJnY29sb3I9XCIiICsgdGhpcy5jb2xvciArIAorCSAgICAiXCI+PGZvbnQgY29sb3I9XCIjZmZmZmZmXCI+PGNlbnRlcj4iICsgdGhpcy5sYWJlbCArIAorICAgICAgICAgICAgICAgICI8L2NlbnRlcj48L2ZvbnQ+PC90ZD4iICk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q29sb3IoIFN0cmluZyBjb2xvciApIHsKKyAgICAgICAgdGhpcy5jb2xvciA9IGNvbG9yOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRMYWJlbCggU3RyaW5nIGxhYmVsICkgeworICAgICAgICB0aGlzLmxhYmVsID0gbGFiZWw7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2xpc3RlbmVycy9Db250ZXh0TGlzdGVuZXIuamF2YSBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9saXN0ZW5lcnMvQ29udGV4dExpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk5OWY1YgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9saXN0ZW5lcnMvQ29udGV4dExpc3RlbmVyLmphdmEKQEAgLTAsMCArMSwxNTYgQEAKKy8qCisqIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworCitwYWNrYWdlIGxpc3RlbmVyczsKKworCitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0QXR0cmlidXRlRXZlbnQ7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dEF0dHJpYnV0ZUxpc3RlbmVyOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHRFdmVudDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0TGlzdGVuZXI7CisKKworLyoqCisgKiBFeGFtcGxlIGxpc3RlbmVyIGZvciBjb250ZXh0LXJlbGF0ZWQgYXBwbGljYXRpb24gZXZlbnRzLCB3aGljaCB3ZXJlCisgKiBpbnRyb2R1Y2VkIGluIHRoZSAyLjMgdmVyc2lvbiBvZiB0aGUgU2VydmxldCBBUEkuICBUaGlzIGxpc3RlbmVyCisgKiBtZXJlbHkgZG9jdW1lbnRzIHRoZSBvY2N1cnJlbmNlIG9mIHN1Y2ggZXZlbnRzIGluIHRoZSBhcHBsaWNhdGlvbiBsb2cKKyAqIGFzc29jaWF0ZWQgd2l0aCBvdXIgc2VydmxldCBjb250ZXh0LgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgQ29udGV4dExpc3RlbmVyCisgICAgaW1wbGVtZW50cyBTZXJ2bGV0Q29udGV4dEF0dHJpYnV0ZUxpc3RlbmVyLCBTZXJ2bGV0Q29udGV4dExpc3RlbmVyIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBzZXJ2bGV0IGNvbnRleHQgd2l0aCB3aGljaCB3ZSBhcmUgYXNzb2NpYXRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFNlcnZsZXRDb250ZXh0IGNvbnRleHQgPSBudWxsOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmVjb3JkIHRoZSBmYWN0IHRoYXQgYSBzZXJ2bGV0IGNvbnRleHQgYXR0cmlidXRlIHdhcyBhZGRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudCBUaGUgc2VydmxldCBjb250ZXh0IGF0dHJpYnV0ZSBldmVudAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGF0dHJpYnV0ZUFkZGVkKFNlcnZsZXRDb250ZXh0QXR0cmlidXRlRXZlbnQgZXZlbnQpIHsKKworCWxvZygiYXR0cmlidXRlQWRkZWQoJyIgKyBldmVudC5nZXROYW1lKCkgKyAiJywgJyIgKworCSAgICBldmVudC5nZXRWYWx1ZSgpICsgIicpIik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlY29yZCB0aGUgZmFjdCB0aGF0IGEgc2VydmxldCBjb250ZXh0IGF0dHJpYnV0ZSB3YXMgcmVtb3ZlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudCBUaGUgc2VydmxldCBjb250ZXh0IGF0dHJpYnV0ZSBldmVudAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGF0dHJpYnV0ZVJlbW92ZWQoU2VydmxldENvbnRleHRBdHRyaWJ1dGVFdmVudCBldmVudCkgeworCisJbG9nKCJhdHRyaWJ1dGVSZW1vdmVkKCciICsgZXZlbnQuZ2V0TmFtZSgpICsgIicsICciICsKKwkgICAgZXZlbnQuZ2V0VmFsdWUoKSArICInKSIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZWNvcmQgdGhlIGZhY3QgdGhhdCBhIHNlcnZsZXQgY29udGV4dCBhdHRyaWJ1dGUgd2FzIHJlcGxhY2VkLgorICAgICAqCisgICAgICogQHBhcmFtIGV2ZW50IFRoZSBzZXJ2bGV0IGNvbnRleHQgYXR0cmlidXRlIGV2ZW50CisgICAgICovCisgICAgcHVibGljIHZvaWQgYXR0cmlidXRlUmVwbGFjZWQoU2VydmxldENvbnRleHRBdHRyaWJ1dGVFdmVudCBldmVudCkgeworCisJbG9nKCJhdHRyaWJ1dGVSZXBsYWNlZCgnIiArIGV2ZW50LmdldE5hbWUoKSArICInLCAnIiArCisJICAgIGV2ZW50LmdldFZhbHVlKCkgKyAiJykiKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVjb3JkIHRoZSBmYWN0IHRoYXQgdGhpcyB3ZWIgYXBwbGljYXRpb24gaGFzIGJlZW4gZGVzdHJveWVkLgorICAgICAqCisgICAgICogQHBhcmFtIGV2ZW50IFRoZSBzZXJ2bGV0IGNvbnRleHQgZXZlbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjb250ZXh0RGVzdHJveWVkKFNlcnZsZXRDb250ZXh0RXZlbnQgZXZlbnQpIHsKKworCWxvZygiY29udGV4dERlc3Ryb3llZCgpIik7CisJdGhpcy5jb250ZXh0ID0gbnVsbDsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVjb3JkIHRoZSBmYWN0IHRoYXQgdGhpcyB3ZWIgYXBwbGljYXRpb24gaGFzIGJlZW4gaW5pdGlhbGl6ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnQgVGhlIHNlcnZsZXQgY29udGV4dCBldmVudAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNvbnRleHRJbml0aWFsaXplZChTZXJ2bGV0Q29udGV4dEV2ZW50IGV2ZW50KSB7CisKKwl0aGlzLmNvbnRleHQgPSBldmVudC5nZXRTZXJ2bGV0Q29udGV4dCgpOworCWxvZygiY29udGV4dEluaXRpYWxpemVkKCkiKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJpdmF0ZSBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIExvZyBhIG1lc3NhZ2UgdG8gdGhlIHNlcnZsZXQgY29udGV4dCBhcHBsaWNhdGlvbiBsb2cuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVzc2FnZSBNZXNzYWdlIHRvIGJlIGxvZ2dlZAorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBsb2coU3RyaW5nIG1lc3NhZ2UpIHsKKworCWlmIChjb250ZXh0ICE9IG51bGwpCisJICAgIGNvbnRleHQubG9nKCJDb250ZXh0TGlzdGVuZXI6ICIgKyBtZXNzYWdlKTsKKwllbHNlCisJICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ29udGV4dExpc3RlbmVyOiAiICsgbWVzc2FnZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIExvZyBhIG1lc3NhZ2UgYW5kIGFzc29jaWF0ZWQgZXhjZXB0aW9uIHRvIHRoZSBzZXJ2bGV0IGNvbnRleHQKKyAgICAgKiBhcHBsaWNhdGlvbiBsb2cuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVzc2FnZSBNZXNzYWdlIHRvIGJlIGxvZ2dlZAorICAgICAqIEBwYXJhbSB0aHJvd2FibGUgRXhjZXB0aW9uIHRvIGJlIGxvZ2dlZAorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBsb2coU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSB0aHJvd2FibGUpIHsKKworCWlmIChjb250ZXh0ICE9IG51bGwpCisJICAgIGNvbnRleHQubG9nKCJDb250ZXh0TGlzdGVuZXI6ICIgKyBtZXNzYWdlLCB0aHJvd2FibGUpOworCWVsc2UgeworCSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNvbnRleHRMaXN0ZW5lcjogIiArIG1lc3NhZ2UpOworCSAgICB0aHJvd2FibGUucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5vdXQpOworCX0KKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvbGlzdGVuZXJzL1Nlc3Npb25MaXN0ZW5lci5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2xpc3RlbmVycy9TZXNzaW9uTGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWExMDU3Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2xpc3RlbmVycy9TZXNzaW9uTGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDE4MyBAQAorLyoKKyogQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisKK3BhY2thZ2UgbGlzdGVuZXJzOworCisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHRFdmVudDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0TGlzdGVuZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uQXR0cmlidXRlTGlzdGVuZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uQmluZGluZ0V2ZW50OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbkV2ZW50OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbkxpc3RlbmVyOworCisKKy8qKgorICogRXhhbXBsZSBsaXN0ZW5lciBmb3IgY29udGV4dC1yZWxhdGVkIGFwcGxpY2F0aW9uIGV2ZW50cywgd2hpY2ggd2VyZQorICogaW50cm9kdWNlZCBpbiB0aGUgMi4zIHZlcnNpb24gb2YgdGhlIFNlcnZsZXQgQVBJLiAgVGhpcyBsaXN0ZW5lcgorICogbWVyZWx5IGRvY3VtZW50cyB0aGUgb2NjdXJyZW5jZSBvZiBzdWNoIGV2ZW50cyBpbiB0aGUgYXBwbGljYXRpb24gbG9nCisgKiBhc3NvY2lhdGVkIHdpdGggb3VyIHNlcnZsZXQgY29udGV4dC4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIFNlc3Npb25MaXN0ZW5lcgorICAgIGltcGxlbWVudHMgU2VydmxldENvbnRleHRMaXN0ZW5lciwKKwkgICAgICAgSHR0cFNlc3Npb25BdHRyaWJ1dGVMaXN0ZW5lciwgSHR0cFNlc3Npb25MaXN0ZW5lciB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc2VydmxldCBjb250ZXh0IHdpdGggd2hpY2ggd2UgYXJlIGFzc29jaWF0ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBTZXJ2bGV0Q29udGV4dCBjb250ZXh0ID0gbnVsbDsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJlY29yZCB0aGUgZmFjdCB0aGF0IGEgc2VydmxldCBjb250ZXh0IGF0dHJpYnV0ZSB3YXMgYWRkZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnQgVGhlIHNlc3Npb24gYXR0cmlidXRlIGV2ZW50CisgICAgICovCisgICAgcHVibGljIHZvaWQgYXR0cmlidXRlQWRkZWQoSHR0cFNlc3Npb25CaW5kaW5nRXZlbnQgZXZlbnQpIHsKKworCWxvZygiYXR0cmlidXRlQWRkZWQoJyIgKyBldmVudC5nZXRTZXNzaW9uKCkuZ2V0SWQoKSArICInLCAnIiArCisJICAgIGV2ZW50LmdldE5hbWUoKSArICInLCAnIiArIGV2ZW50LmdldFZhbHVlKCkgKyAiJykiKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVjb3JkIHRoZSBmYWN0IHRoYXQgYSBzZXJ2bGV0IGNvbnRleHQgYXR0cmlidXRlIHdhcyByZW1vdmVkLgorICAgICAqCisgICAgICogQHBhcmFtIGV2ZW50IFRoZSBzZXNzaW9uIGF0dHJpYnV0ZSBldmVudAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGF0dHJpYnV0ZVJlbW92ZWQoSHR0cFNlc3Npb25CaW5kaW5nRXZlbnQgZXZlbnQpIHsKKworCWxvZygiYXR0cmlidXRlUmVtb3ZlZCgnIiArIGV2ZW50LmdldFNlc3Npb24oKS5nZXRJZCgpICsgIicsICciICsKKwkgICAgZXZlbnQuZ2V0TmFtZSgpICsgIicsICciICsgZXZlbnQuZ2V0VmFsdWUoKSArICInKSIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZWNvcmQgdGhlIGZhY3QgdGhhdCBhIHNlcnZsZXQgY29udGV4dCBhdHRyaWJ1dGUgd2FzIHJlcGxhY2VkLgorICAgICAqCisgICAgICogQHBhcmFtIGV2ZW50IFRoZSBzZXNzaW9uIGF0dHJpYnV0ZSBldmVudAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGF0dHJpYnV0ZVJlcGxhY2VkKEh0dHBTZXNzaW9uQmluZGluZ0V2ZW50IGV2ZW50KSB7CisKKwlsb2coImF0dHJpYnV0ZVJlcGxhY2VkKCciICsgZXZlbnQuZ2V0U2Vzc2lvbigpLmdldElkKCkgKyAiJywgJyIgKworCSAgICBldmVudC5nZXROYW1lKCkgKyAiJywgJyIgKyBldmVudC5nZXRWYWx1ZSgpICsgIicpIik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlY29yZCB0aGUgZmFjdCB0aGF0IHRoaXMgd2ViIGFwcGxpY2F0aW9uIGhhcyBiZWVuIGRlc3Ryb3llZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudCBUaGUgc2VydmxldCBjb250ZXh0IGV2ZW50CisgICAgICovCisgICAgcHVibGljIHZvaWQgY29udGV4dERlc3Ryb3llZChTZXJ2bGV0Q29udGV4dEV2ZW50IGV2ZW50KSB7CisKKwlsb2coImNvbnRleHREZXN0cm95ZWQoKSIpOworCXRoaXMuY29udGV4dCA9IG51bGw7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlY29yZCB0aGUgZmFjdCB0aGF0IHRoaXMgd2ViIGFwcGxpY2F0aW9uIGhhcyBiZWVuIGluaXRpYWxpemVkLgorICAgICAqCisgICAgICogQHBhcmFtIGV2ZW50IFRoZSBzZXJ2bGV0IGNvbnRleHQgZXZlbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjb250ZXh0SW5pdGlhbGl6ZWQoU2VydmxldENvbnRleHRFdmVudCBldmVudCkgeworCisJdGhpcy5jb250ZXh0ID0gZXZlbnQuZ2V0U2VydmxldENvbnRleHQoKTsKKwlsb2coImNvbnRleHRJbml0aWFsaXplZCgpIik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlY29yZCB0aGUgZmFjdCB0aGF0IGEgc2Vzc2lvbiBoYXMgYmVlbiBjcmVhdGVkLgorICAgICAqCisgICAgICogQHBhcmFtIGV2ZW50IFRoZSBzZXNzaW9uIGV2ZW50CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2Vzc2lvbkNyZWF0ZWQoSHR0cFNlc3Npb25FdmVudCBldmVudCkgeworCisJbG9nKCJzZXNzaW9uQ3JlYXRlZCgnIiArIGV2ZW50LmdldFNlc3Npb24oKS5nZXRJZCgpICsgIicpIik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlY29yZCB0aGUgZmFjdCB0aGF0IGEgc2Vzc2lvbiBoYXMgYmVlbiBkZXN0cm95ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnQgVGhlIHNlc3Npb24gZXZlbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXNzaW9uRGVzdHJveWVkKEh0dHBTZXNzaW9uRXZlbnQgZXZlbnQpIHsKKworCWxvZygic2Vzc2lvbkRlc3Ryb3llZCgnIiArIGV2ZW50LmdldFNlc3Npb24oKS5nZXRJZCgpICsgIicpIik7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByaXZhdGUgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBMb2cgYSBtZXNzYWdlIHRvIHRoZSBzZXJ2bGV0IGNvbnRleHQgYXBwbGljYXRpb24gbG9nLgorICAgICAqCisgICAgICogQHBhcmFtIG1lc3NhZ2UgTWVzc2FnZSB0byBiZSBsb2dnZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgbG9nKFN0cmluZyBtZXNzYWdlKSB7CisKKwlpZiAoY29udGV4dCAhPSBudWxsKQorCSAgICBjb250ZXh0LmxvZygiU2Vzc2lvbkxpc3RlbmVyOiAiICsgbWVzc2FnZSk7CisJZWxzZQorCSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNlc3Npb25MaXN0ZW5lcjogIiArIG1lc3NhZ2UpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBMb2cgYSBtZXNzYWdlIGFuZCBhc3NvY2lhdGVkIGV4Y2VwdGlvbiB0byB0aGUgc2VydmxldCBjb250ZXh0CisgICAgICogYXBwbGljYXRpb24gbG9nLgorICAgICAqCisgICAgICogQHBhcmFtIG1lc3NhZ2UgTWVzc2FnZSB0byBiZSBsb2dnZWQKKyAgICAgKiBAcGFyYW0gdGhyb3dhYmxlIEV4Y2VwdGlvbiB0byBiZSBsb2dnZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgbG9nKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgdGhyb3dhYmxlKSB7CisKKwlpZiAoY29udGV4dCAhPSBudWxsKQorCSAgICBjb250ZXh0LmxvZygiU2Vzc2lvbkxpc3RlbmVyOiAiICsgbWVzc2FnZSwgdGhyb3dhYmxlKTsKKwllbHNlIHsKKwkgICAgU3lzdGVtLm91dC5wcmludGxuKCJTZXNzaW9uTGlzdGVuZXI6ICIgKyBtZXNzYWdlKTsKKwkgICAgdGhyb3dhYmxlLnByaW50U3RhY2tUcmFjZShTeXN0ZW0ub3V0KTsKKwl9CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL251bS9OdW1iZXJHdWVzc0JlYW4uamF2YSBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9udW0vTnVtYmVyR3Vlc3NCZWFuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVhZmVhYgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9udW0vTnVtYmVyR3Vlc3NCZWFuLmphdmEKQEAgLTAsMCArMSw3OCBAQAorLyoKKyogQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisvKgorICogT3JpZ2luYWxseSB3cml0dGVuIGJ5IEphc29uIEh1bnRlciwgaHR0cDovL3d3dy5zZXJ2bGV0cy5jb20uCisgKi8KKworcGFja2FnZSBudW07CisKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworcHVibGljIGNsYXNzIE51bWJlckd1ZXNzQmVhbiB7CisKKyAgaW50IGFuc3dlcjsKKyAgYm9vbGVhbiBzdWNjZXNzOworICBTdHJpbmcgaGludDsKKyAgaW50IG51bUd1ZXNzZXM7CisKKyAgcHVibGljIE51bWJlckd1ZXNzQmVhbigpIHsKKyAgICByZXNldCgpOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0R3Vlc3MoU3RyaW5nIGd1ZXNzKSB7CisgICAgbnVtR3Vlc3NlcysrOworCisgICAgaW50IGc7CisgICAgdHJ5IHsKKyAgICAgIGcgPSBJbnRlZ2VyLnBhcnNlSW50KGd1ZXNzKTsKKyAgICB9CisgICAgY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICBnID0gLTE7CisgICAgfQorCisgICAgaWYgKGcgPT0gYW5zd2VyKSB7CisgICAgICBzdWNjZXNzID0gdHJ1ZTsKKyAgICB9CisgICAgZWxzZSBpZiAoZyA9PSAtMSkgeworICAgICAgaGludCA9ICJhIG51bWJlciBuZXh0IHRpbWUiOworICAgIH0KKyAgICBlbHNlIGlmIChnIDwgYW5zd2VyKSB7CisgICAgICBoaW50ID0gImhpZ2hlciI7CisgICAgfQorICAgIGVsc2UgaWYgKGcgPiBhbnN3ZXIpIHsKKyAgICAgIGhpbnQgPSAibG93ZXIiOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBib29sZWFuIGdldFN1Y2Nlc3MoKSB7CisgICAgcmV0dXJuIHN1Y2Nlc3M7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIGdldEhpbnQoKSB7CisgICAgcmV0dXJuICIiICsgaGludDsKKyAgfQorCisgIHB1YmxpYyBpbnQgZ2V0TnVtR3Vlc3NlcygpIHsKKyAgICByZXR1cm4gbnVtR3Vlc3NlczsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHJlc2V0KCkgeworICAgIGFuc3dlciA9IE1hdGguYWJzKG5ldyBSYW5kb20oKS5uZXh0SW50KCkgJSAxMDApICsgMTsKKyAgICBzdWNjZXNzID0gZmFsc2U7CisgICAgbnVtR3Vlc3NlcyA9IDA7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9zZXJ2bGV0VG9Kc3AuamF2YSBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9zZXJ2bGV0VG9Kc3AuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGEyYzcyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL3NlcnZsZXRUb0pzcC5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisqIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lio7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7CisKK3B1YmxpYyBjbGFzcyBzZXJ2bGV0VG9Kc3AgZXh0ZW5kcyBIdHRwU2VydmxldCB7CisKKyAgICBwdWJsaWMgdm9pZCBkb0dldCAoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisJCSAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB7CisKKwl0cnkgeworCSAgICAvLyBTZXQgdGhlIGF0dHJpYnV0ZSBhbmQgRm9yd2FyZCB0byBoZWxsby5qc3AKKwkgICAgcmVxdWVzdC5zZXRBdHRyaWJ1dGUgKCJzZXJ2bGV0TmFtZSIsICJzZXJ2bGV0VG9Kc3AiKTsKKwkgICAgZ2V0U2VydmxldENvbmZpZygpLmdldFNlcnZsZXRDb250ZXh0KCkuZ2V0UmVxdWVzdERpc3BhdGNoZXIoIi9qc3B0b3NlcnYvaGVsbG8uanNwIikuZm9yd2FyZChyZXF1ZXN0LCByZXNwb25zZSk7CisJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisJICAgIGV4LnByaW50U3RhY2tUcmFjZSAoKTsKKwl9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL3Nlc3Npb25zL0R1bW15Q2FydC5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL3Nlc3Npb25zL0R1bW15Q2FydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3Y2NkODAKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvc2Vzc2lvbnMvRHVtbXlDYXJ0LmphdmEKQEAgLTAsMCArMSw2OSBAQAorLyoKKyogQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworcGFja2FnZSBzZXNzaW9uczsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworCitwdWJsaWMgY2xhc3MgRHVtbXlDYXJ0IHsKKyAgICBWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsKKyAgICBTdHJpbmcgc3VibWl0ID0gbnVsbDsKKyAgICBTdHJpbmcgaXRlbSA9IG51bGw7CisgICAgCisgICAgcHJpdmF0ZSB2b2lkIGFkZEl0ZW0oU3RyaW5nIG5hbWUpIHsKKwl2LmFkZEVsZW1lbnQobmFtZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlbW92ZUl0ZW0oU3RyaW5nIG5hbWUpIHsKKwl2LnJlbW92ZUVsZW1lbnQobmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SXRlbShTdHJpbmcgbmFtZSkgeworCWl0ZW0gPSBuYW1lOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRTdWJtaXQoU3RyaW5nIHMpIHsKKwlzdWJtaXQgPSBzOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRJdGVtcygpIHsKKwlTdHJpbmdbXSBzID0gbmV3IFN0cmluZ1t2LnNpemUoKV07CisJdi5jb3B5SW50byhzKTsKKwlyZXR1cm4gczsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgcHJvY2Vzc1JlcXVlc3QoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKwkvLyBudWxsIHZhbHVlIGZvciBzdWJtaXQgLSB1c2VyIGhpdCBlbnRlciBpbnN0ZWFkIG9mIGNsaWNraW5nIG9uIAorCS8vICJhZGQiIG9yICJyZW1vdmUiCisJaWYgKHN1Ym1pdCA9PSBudWxsKSAKKwkgICAgYWRkSXRlbShpdGVtKTsKKworCWlmIChzdWJtaXQuZXF1YWxzKCJhZGQiKSkKKwkgICAgYWRkSXRlbShpdGVtKTsKKwllbHNlIGlmIChzdWJtaXQuZXF1YWxzKCJyZW1vdmUiKSkgCisJICAgIHJlbW92ZUl0ZW0oaXRlbSk7CisJCisJLy8gcmVzZXQgYXQgdGhlIGVuZCBvZiB0aGUgcmVxdWVzdAorCXJlc2V0KCk7CisgICAgfQorCisgICAgLy8gcmVzZXQKKyAgICBwcml2YXRlIHZvaWQgcmVzZXQoKSB7CisJc3VibWl0ID0gbnVsbDsKKwlpdGVtID0gbnVsbDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvdXRpbC9IVE1MRmlsdGVyLmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvdXRpbC9IVE1MRmlsdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU1NmE1ZgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy91dGlsL0hUTUxGaWx0ZXIuamF2YQpAQCAtMCwwICsxLDY5IEBACisvKgorKiBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK3BhY2thZ2UgdXRpbDsKKworLyoqCisgKiBIVE1MIGZpbHRlciB1dGlsaXR5LgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQGF1dGhvciBUaW0gVHllCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBIVE1MRmlsdGVyIHsKKworCisgICAgLyoqCisgICAgICogRmlsdGVyIHRoZSBzcGVjaWZpZWQgbWVzc2FnZSBzdHJpbmcgZm9yIGNoYXJhY3RlcnMgdGhhdCBhcmUgc2Vuc2l0aXZlCisgICAgICogaW4gSFRNTC4gIFRoaXMgYXZvaWRzIHBvdGVudGlhbCBhdHRhY2tzIGNhdXNlZCBieSBpbmNsdWRpbmcgSmF2YVNjcmlwdAorICAgICAqIGNvZGVzIGluIHRoZSByZXF1ZXN0IFVSTCB0aGF0IGlzIG9mdGVuIHJlcG9ydGVkIGluIGVycm9yIG1lc3NhZ2VzLgorICAgICAqCisgICAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2Ugc3RyaW5nIHRvIGJlIGZpbHRlcmVkCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZmlsdGVyKFN0cmluZyBtZXNzYWdlKSB7CisKKyAgICAgICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAobnVsbCk7CisKKyAgICAgICAgY2hhciBjb250ZW50W10gPSBuZXcgY2hhclttZXNzYWdlLmxlbmd0aCgpXTsKKyAgICAgICAgbWVzc2FnZS5nZXRDaGFycygwLCBtZXNzYWdlLmxlbmd0aCgpLCBjb250ZW50LCAwKTsKKyAgICAgICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoY29udGVudC5sZW5ndGggKyA1MCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29udGVudC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgc3dpdGNoIChjb250ZW50W2ldKSB7CisgICAgICAgICAgICBjYXNlICc8JzoKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCImbHQ7Iik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICc+JzoKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCImZ3Q7Iik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICcmJzoKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCImYW1wOyIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnIic6CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiJnF1b3Q7Iik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoY29udGVudFtpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChyZXN1bHQudG9TdHJpbmcoKSk7CisKKyAgICB9CisKKworfQorCmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvdmFsaWRhdG9ycy9EZWJ1Z1ZhbGlkYXRvci5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL3ZhbGlkYXRvcnMvRGVidWdWYWxpZGF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTMwNWU4Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL3ZhbGlkYXRvcnMvRGVidWdWYWxpZGF0b3IuamF2YQpAQCAtMCwwICsxLDgzIEBACisvKgorKiBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKworcGFja2FnZSB2YWxpZGF0b3JzOworCisKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlBhZ2VEYXRhOworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWdMaWJyYXJ5VmFsaWRhdG9yOworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5WYWxpZGF0aW9uTWVzc2FnZTsKKworCisvKioKKyAqIEV4YW1wbGUgdGFnIGxpYnJhcnkgdmFsaWRhdG9yIHRoYXQgc2ltcGx5IGR1bXBzIHRoZSBYTUwgdmVyc2lvbiBvZiBlYWNoCisgKiBwYWdlIHRvIHN0YW5kYXJkIG91dHB1dCAod2hpY2ggd2lsbCB0eXBpY2FsbHkgYmUgc2VudCB0byB0aGUgZmlsZQorICogPGNvZGU+JENBVEFMSU5BX0hPTUUvbG9ncy9jYXRhbGluYS5vdXQ8L2NvZGU+KS4gIFRvIHV0aWxpemUgaXQsIHNpbXBseQorICogaW5jbHVkZSBhIDxjb2RlPnRhZ2xpYjwvY29kZT4gZGlyZWN0aXZlIGZvciB0aGlzIHRhZyBsaWJyYXJ5IGF0IHRoZSB0b3AKKyAqIG9mIHlvdXIgSlNQIHBhZ2UuCisgKgorICogQGF1dGhvciBDcmFpZyBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBEZWJ1Z1ZhbGlkYXRvciBleHRlbmRzIFRhZ0xpYnJhcnlWYWxpZGF0b3IgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFZhbGlkYXRlIGEgSlNQIHBhZ2UuICBUaGlzIHdpbGwgZ2V0IGludm9rZWQgb25jZSBwZXIgZGlyZWN0aXZlIGluIHRoZQorICAgICAqIEpTUCBwYWdlLiAgVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHBhZ2UgaXMKKyAgICAgKiB2YWxpZDsgb3RoZXJ3aXNlIHRoZSBtZXRob2Qgc2hvdWxkIHJldHVybiBhbiBhcnJheSBvZgorICAgICAqIDxjb2RlPlZhbGlkYXRpb25NZXNzYWdlPC9jb2RlPiBvYmplY3RzLiAgQW4gYXJyYXkgb2YgbGVuZ3RoIHplcm8gaXMKKyAgICAgKiBhbHNvIGludGVycHJldGVkIGFzIG5vIGVycm9ycy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcmVmaXggVGhlIHZhbHVlIG9mIHRoZSBwcmVmaXggYXJndW1lbnQgaW4gdGhpcyBkaXJlY3RpdmUKKyAgICAgKiBAcGFyYW0gdXJpIFRoZSB2YWx1ZSBvZiB0aGUgVVJJIGFyZ3VtZW50IGluIHRoaXMgZGlyZWN0aXZlCisgICAgICogQHBhcmFtIHBhZ2UgVGhlIHBhZ2UgZGF0YSBmb3IgdGhpcyBwYWdlCisgICAgICovCisgICAgcHVibGljIFZhbGlkYXRpb25NZXNzYWdlW10gdmFsaWRhdGUoU3RyaW5nIHByZWZpeCwgU3RyaW5nIHVyaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWdlRGF0YSBwYWdlKSB7CisKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tIFByZWZpeD0iICsgcHJlZml4ICsgIiBVUkk9IiArIHVyaSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiLS0tLS0tLS0tLSIpOworCisgICAgICAgIElucHV0U3RyZWFtIGlzID0gcGFnZS5nZXRJbnB1dFN0cmVhbSgpOworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpbnQgY2ggPSBpcy5yZWFkKCk7CisgICAgICAgICAgICAgICAgaWYgKGNoIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgoY2hhcikgY2gpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7CisgICAgICAgIHJldHVybiAobnVsbCk7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9qc3AvYXBwbGV0L0Nsb2NrMi5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9qc3AvYXBwbGV0L0Nsb2NrMi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkYmYyOTIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2pzcC9hcHBsZXQvQ2xvY2syLmphdmEKQEAgLTAsMCArMSwyMTEgQEAKKy8qCisqIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLmF3dC4qOworaW1wb3J0IGphdmEuYXBwbGV0Lio7CitpbXBvcnQgamF2YS50ZXh0Lio7CisKKy8qKgorICogVGltZSEKKyAqCisgKiBAYXV0aG9yIFJhY2hlbCBHb2xsdWIKKyAqLworCitwdWJsaWMgY2xhc3MgQ2xvY2syIGV4dGVuZHMgQXBwbGV0IGltcGxlbWVudHMgUnVubmFibGUgeworICAgIFRocmVhZCB0aW1lcjsgICAgICAgICAgICAgICAgLy8gVGhlIHRocmVhZCB0aGF0IGRpc3BsYXlzIGNsb2NrCisgICAgaW50IGxhc3R4cywgbGFzdHlzLCBsYXN0eG0sCisgICAgICAgIGxhc3R5bSwgbGFzdHhoLCBsYXN0eWg7ICAvLyBEaW1lbnNpb25zIHVzZWQgdG8gZHJhdyBoYW5kcyAKKyAgICBTaW1wbGVEYXRlRm9ybWF0IGZvcm1hdHRlcjsgIC8vIEZvcm1hdHMgdGhlIGRhdGUgZGlzcGxheWVkCisgICAgU3RyaW5nIGxhc3RkYXRlOyAgICAgICAgICAgICAvLyBTdHJpbmcgdG8gaG9sZCBkYXRlIGRpc3BsYXllZAorICAgIEZvbnQgY2xvY2tGYWNlRm9udDsgICAgICAgICAgLy8gRm9udCBmb3IgbnVtYmVyIGRpc3BsYXkgb24gY2xvY2sKKyAgICBEYXRlIGN1cnJlbnREYXRlOyAgICAgICAgICAgIC8vIFVzZWQgdG8gZ2V0IGRhdGUgdG8gZGlzcGxheQorICAgIENvbG9yIGhhbmRDb2xvcjsgICAgICAgICAgICAgLy8gQ29sb3Igb2YgbWFpbiBoYW5kcyBhbmQgZGlhbAorICAgIENvbG9yIG51bWJlckNvbG9yOyAgICAgICAgICAgLy8gQ29sb3Igb2Ygc2Vjb25kIGhhbmQgYW5kIG51bWJlcnMKKworICAgIHB1YmxpYyB2b2lkIGluaXQoKSB7CisgICAgICAgIGludCB4LHk7CisgICAgICAgIGxhc3R4cyA9IGxhc3R5cyA9IGxhc3R4bSA9IGxhc3R5bSA9IGxhc3R4aCA9IGxhc3R5aCA9IDA7CisgICAgICAgIGZvcm1hdHRlciA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0ICgiRUVFIE1NTSBkZCBoaDptbTpzcyB5eXl5IiwgTG9jYWxlLmdldERlZmF1bHQoKSk7CisgICAgICAgIGN1cnJlbnREYXRlID0gbmV3IERhdGUoKTsKKyAgICAgICAgbGFzdGRhdGUgPSBmb3JtYXR0ZXIuZm9ybWF0KGN1cnJlbnREYXRlKTsKKyAgICAgICAgY2xvY2tGYWNlRm9udCA9IG5ldyBGb250KCJTZXJpZiIsIEZvbnQuUExBSU4sIDE0KTsKKyAgICAgICAgaGFuZENvbG9yID0gQ29sb3IuYmx1ZTsKKyAgICAgICAgbnVtYmVyQ29sb3IgPSBDb2xvci5kYXJrR3JheTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgc2V0QmFja2dyb3VuZChuZXcgQ29sb3IoSW50ZWdlci5wYXJzZUludChnZXRQYXJhbWV0ZXIoImJnY29sb3IiKSwxNikpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIEUpIHsgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgaGFuZENvbG9yID0gbmV3IENvbG9yKEludGVnZXIucGFyc2VJbnQoZ2V0UGFyYW1ldGVyKCJmZ2NvbG9yMSIpLDE2KSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBFKSB7IH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG51bWJlckNvbG9yID0gbmV3IENvbG9yKEludGVnZXIucGFyc2VJbnQoZ2V0UGFyYW1ldGVyKCJmZ2NvbG9yMiIpLDE2KSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBFKSB7IH0KKyAgICAgICAgcmVzaXplKDMwMCwzMDApOyAgICAgICAgICAgICAgLy8gU2V0IGNsb2NrIHdpbmRvdyBzaXplCisgICAgfQorCisgICAgLy8gUGxvdHBvaW50cyBhbGxvd3MgY2FsY3VsYXRpb24gdG8gb25seSBjb3ZlciA0NSBkZWdyZWVzIG9mIHRoZSBjaXJjbGUsCisgICAgLy8gYW5kIHRoZW4gbWlycm9yCisgICAgcHVibGljIHZvaWQgcGxvdHBvaW50cyhpbnQgeDAsIGludCB5MCwgaW50IHgsIGludCB5LCBHcmFwaGljcyBnKSB7CisgICAgICAgIGcuZHJhd0xpbmUoeDAreCx5MCt5LHgwK3gseTAreSk7CisgICAgICAgIGcuZHJhd0xpbmUoeDAreSx5MCt4LHgwK3kseTAreCk7CisgICAgICAgIGcuZHJhd0xpbmUoeDAreSx5MC14LHgwK3kseTAteCk7CisgICAgICAgIGcuZHJhd0xpbmUoeDAreCx5MC15LHgwK3gseTAteSk7CisgICAgICAgIGcuZHJhd0xpbmUoeDAteCx5MC15LHgwLXgseTAteSk7CisgICAgICAgIGcuZHJhd0xpbmUoeDAteSx5MC14LHgwLXkseTAteCk7CisgICAgICAgIGcuZHJhd0xpbmUoeDAteSx5MCt4LHgwLXkseTAreCk7CisgICAgICAgIGcuZHJhd0xpbmUoeDAteCx5MCt5LHgwLXgseTAreSk7CisgICAgfQorCisgICAgLy8gQ2lyY2xlIGlzIGp1c3QgQnJlc2VuaGFtJ3MgYWxnb3JpdGhtIGZvciBhIHNjYW4gY29udmVydGVkIGNpcmNsZQorICAgIHB1YmxpYyB2b2lkIGNpcmNsZShpbnQgeDAsIGludCB5MCwgaW50IHIsIEdyYXBoaWNzIGcpIHsKKyAgICAgICAgaW50IHgseTsKKyAgICAgICAgZmxvYXQgZDsKKyAgICAgICAgeD0wOworICAgICAgICB5PXI7CisgICAgICAgIGQ9NS80LXI7CisgICAgICAgIHBsb3Rwb2ludHMoeDAseTAseCx5LGcpOworCisgICAgICAgIHdoaWxlICh5PngpeworICAgICAgICAgICAgaWYgKGQ8MCkgeworICAgICAgICAgICAgICAgIGQ9ZCsyKngrMzsKKyAgICAgICAgICAgICAgICB4Kys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBkPWQrMiooeC15KSs1OworICAgICAgICAgICAgICAgIHgrKzsKKyAgICAgICAgICAgICAgICB5LS07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwbG90cG9pbnRzKHgwLHkwLHgseSxnKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFBhaW50IGlzIHRoZSBtYWluIHBhcnQgb2YgdGhlIHByb2dyYW0KKyAgICBwdWJsaWMgdm9pZCBwYWludChHcmFwaGljcyBnKSB7CisgICAgICAgIGludCB4aCwgeWgsIHhtLCB5bSwgeHMsIHlzLCBzID0gMCwgbSA9IDEwLCBoID0gMTAsIHhjZW50ZXIsIHljZW50ZXI7CisgICAgICAgIFN0cmluZyB0b2RheTsKKworICAgICAgICBjdXJyZW50RGF0ZSA9IG5ldyBEYXRlKCk7CisgICAgICAgIFNpbXBsZURhdGVGb3JtYXQgZm9ybWF0dGVyID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoInMiLExvY2FsZS5nZXREZWZhdWx0KCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcyA9IEludGVnZXIucGFyc2VJbnQoZm9ybWF0dGVyLmZvcm1hdChjdXJyZW50RGF0ZSkpOworICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbikgeworICAgICAgICAgICAgcyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZm9ybWF0dGVyLmFwcGx5UGF0dGVybigibSIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbSA9IEludGVnZXIucGFyc2VJbnQoZm9ybWF0dGVyLmZvcm1hdChjdXJyZW50RGF0ZSkpOworICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbikgeworICAgICAgICAgICAgbSA9IDEwOworICAgICAgICB9ICAgIAorICAgICAgICBmb3JtYXR0ZXIuYXBwbHlQYXR0ZXJuKCJoIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBoID0gSW50ZWdlci5wYXJzZUludChmb3JtYXR0ZXIuZm9ybWF0KGN1cnJlbnREYXRlKSk7CisgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuKSB7CisgICAgICAgICAgICBoID0gMTA7CisgICAgICAgIH0KKyAgICAgICAgZm9ybWF0dGVyLmFwcGx5UGF0dGVybigiRUVFIE1NTSBkZCBISDptbTpzcyB5eXl5Iik7CisgICAgICAgIHRvZGF5ID0gZm9ybWF0dGVyLmZvcm1hdChjdXJyZW50RGF0ZSk7CisgICAgICAgIHhjZW50ZXI9ODA7CisgICAgICAgIHljZW50ZXI9NTU7CisgICAgCisgICAgLy8gYT0gcyogcGkvMiAtIHBpLzIgKHRvIHN3aXRjaCAwLDAgZnJvbSAzOjAwIHRvIDEyOjAwKQorICAgIC8vIHggPSByKGNvcyBhKSArIHhjZW50ZXIsIHkgPSByKHNpbiBhKSArIHljZW50ZXIKKyAgICAKKyAgICAgICAgeHMgPSAoaW50KShNYXRoLmNvcyhzICogMy4xNGYvMzAgLSAzLjE0Zi8yKSAqIDQ1ICsgeGNlbnRlcik7CisgICAgICAgIHlzID0gKGludCkoTWF0aC5zaW4ocyAqIDMuMTRmLzMwIC0gMy4xNGYvMikgKiA0NSArIHljZW50ZXIpOworICAgICAgICB4bSA9IChpbnQpKE1hdGguY29zKG0gKiAzLjE0Zi8zMCAtIDMuMTRmLzIpICogNDAgKyB4Y2VudGVyKTsKKyAgICAgICAgeW0gPSAoaW50KShNYXRoLnNpbihtICogMy4xNGYvMzAgLSAzLjE0Zi8yKSAqIDQwICsgeWNlbnRlcik7CisgICAgICAgIHhoID0gKGludCkoTWF0aC5jb3MoKGgqMzAgKyBtLzIpICogMy4xNGYvMTgwIC0gMy4xNGYvMikgKiAzMCArIHhjZW50ZXIpOworICAgICAgICB5aCA9IChpbnQpKE1hdGguc2luKChoKjMwICsgbS8yKSAqIDMuMTRmLzE4MCAtIDMuMTRmLzIpICogMzAgKyB5Y2VudGVyKTsKKyAgICAKKyAgICAvLyBEcmF3IHRoZSBjaXJjbGUgYW5kIG51bWJlcnMKKyAgICAKKyAgICAgICAgZy5zZXRGb250KGNsb2NrRmFjZUZvbnQpOworICAgICAgICBnLnNldENvbG9yKGhhbmRDb2xvcik7CisgICAgICAgIGNpcmNsZSh4Y2VudGVyLHljZW50ZXIsNTAsZyk7CisgICAgICAgIGcuc2V0Q29sb3IobnVtYmVyQ29sb3IpOworICAgICAgICBnLmRyYXdTdHJpbmcoIjkiLHhjZW50ZXItNDUseWNlbnRlciszKTsgCisgICAgICAgIGcuZHJhd1N0cmluZygiMyIseGNlbnRlcis0MCx5Y2VudGVyKzMpOworICAgICAgICBnLmRyYXdTdHJpbmcoIjEyIix4Y2VudGVyLTUseWNlbnRlci0zNyk7CisgICAgICAgIGcuZHJhd1N0cmluZygiNiIseGNlbnRlci0zLHljZW50ZXIrNDUpOworCisgICAgLy8gRXJhc2UgaWYgbmVjZXNzYXJ5LCBhbmQgcmVkcmF3CisgICAgCisgICAgICAgIGcuc2V0Q29sb3IoZ2V0QmFja2dyb3VuZCgpKTsKKyAgICAgICAgaWYgKHhzICE9IGxhc3R4cyB8fCB5cyAhPSBsYXN0eXMpIHsKKyAgICAgICAgICAgIGcuZHJhd0xpbmUoeGNlbnRlciwgeWNlbnRlciwgbGFzdHhzLCBsYXN0eXMpOworICAgICAgICAgICAgZy5kcmF3U3RyaW5nKGxhc3RkYXRlLCA1LCAxMjUpOworICAgICAgICB9CisgICAgICAgIGlmICh4bSAhPSBsYXN0eG0gfHwgeW0gIT0gbGFzdHltKSB7CisgICAgICAgICAgICBnLmRyYXdMaW5lKHhjZW50ZXIsIHljZW50ZXItMSwgbGFzdHhtLCBsYXN0eW0pOworICAgICAgICAgICAgZy5kcmF3TGluZSh4Y2VudGVyLTEsIHljZW50ZXIsIGxhc3R4bSwgbGFzdHltKTsgfQorICAgICAgICBpZiAoeGggIT0gbGFzdHhoIHx8IHloICE9IGxhc3R5aCkgeworICAgICAgICAgICAgZy5kcmF3TGluZSh4Y2VudGVyLCB5Y2VudGVyLTEsIGxhc3R4aCwgbGFzdHloKTsKKyAgICAgICAgICAgIGcuZHJhd0xpbmUoeGNlbnRlci0xLCB5Y2VudGVyLCBsYXN0eGgsIGxhc3R5aCk7IH0KKyAgICAgICAgZy5zZXRDb2xvcihudW1iZXJDb2xvcik7CisgICAgICAgIGcuZHJhd1N0cmluZygiIiwgNSwgMTI1KTsKKyAgICAgICAgZy5kcmF3U3RyaW5nKHRvZGF5LCA1LCAxMjUpOyAgICAKKyAgICAgICAgZy5kcmF3TGluZSh4Y2VudGVyLCB5Y2VudGVyLCB4cywgeXMpOworICAgICAgICBnLnNldENvbG9yKGhhbmRDb2xvcik7CisgICAgICAgIGcuZHJhd0xpbmUoeGNlbnRlciwgeWNlbnRlci0xLCB4bSwgeW0pOworICAgICAgICBnLmRyYXdMaW5lKHhjZW50ZXItMSwgeWNlbnRlciwgeG0sIHltKTsKKyAgICAgICAgZy5kcmF3TGluZSh4Y2VudGVyLCB5Y2VudGVyLTEsIHhoLCB5aCk7CisgICAgICAgIGcuZHJhd0xpbmUoeGNlbnRlci0xLCB5Y2VudGVyLCB4aCwgeWgpOworICAgICAgICBsYXN0eHM9eHM7IGxhc3R5cz15czsKKyAgICAgICAgbGFzdHhtPXhtOyBsYXN0eW09eW07CisgICAgICAgIGxhc3R4aD14aDsgbGFzdHloPXloOworICAgICAgICBsYXN0ZGF0ZSA9IHRvZGF5OworICAgICAgICBjdXJyZW50RGF0ZT1udWxsOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgeworICAgICAgICB0aW1lciA9IG5ldyBUaHJlYWQodGhpcyk7CisgICAgICAgIHRpbWVyLnN0YXJ0KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RvcCgpIHsKKyAgICAgICAgdGltZXIgPSBudWxsOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgVGhyZWFkIG1lID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKTsKKyAgICAgICAgd2hpbGUgKHRpbWVyID09IG1lKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2xlZXAoMTAwKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcGFpbnQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZShHcmFwaGljcyBnKSB7CisgICAgICAgIHBhaW50KGcpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXBwbGV0SW5mbygpIHsKKyAgICAgICAgcmV0dXJuICJUaXRsZTogQSBDbG9jayBcbkF1dGhvcjogUmFjaGVsIEdvbGx1YiwgMTk5NSBcbkFuIGFuYWxvZyBjbG9jay4iOworICAgIH0KKyAgCisgICAgcHVibGljIFN0cmluZ1tdW10gZ2V0UGFyYW1ldGVySW5mbygpIHsKKyAgICAgICAgU3RyaW5nW11bXSBpbmZvID0geworICAgICAgICAgICAgeyJiZ2NvbG9yIiwgImhleGFkZWNpbWFsIFJHQiBudW1iZXIiLCAiVGhlIGJhY2tncm91bmQgY29sb3IuIERlZmF1bHQgaXMgdGhlIGNvbG9yIG9mIHlvdXIgYnJvd3Nlci4ifSwKKyAgICAgICAgICAgIHsiZmdjb2xvcjEiLCAiaGV4YWRlY2ltYWwgUkdCIG51bWJlciIsICJUaGUgY29sb3Igb2YgdGhlIGhhbmRzIGFuZCBkaWFsLiBEZWZhdWx0IGlzIGJsdWUuIn0sCisgICAgICAgICAgICB7ImZnY29sb3IyIiwgImhleGFkZWNpbWFsIFJHQiBudW1iZXIiLCAiVGhlIGNvbG9yIG9mIHRoZSBzZWNvbmRzIGhhbmQgYW5kIG51bWJlcnMuIERlZmF1bHQgaXMgZGFyayBncmF5LiJ9CisgICAgICAgIH07CisgICAgICAgIHJldHVybiBpbmZvOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvanNwL2RlYnVnLXRhZ2xpYi50bGQgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2pzcC9kZWJ1Zy10YWdsaWIudGxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiZjM5YjAKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2pzcC9kZWJ1Zy10YWdsaWIudGxkCkBAIC0wLDAgKzEsNTMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiID8+Cis8IS0tCisgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8IURPQ1RZUEUgdGFnbGliCisgICAgICAgIFBVQkxJQyAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEpTUCBUYWcgTGlicmFyeSAxLjIvL0VOIgorCSJodHRwOi8vamF2YS5zdW4uY29tL2oyZWUvZHRkL3dlYi1qc3B0YWdsaWJyYXJ5XzFfMi5kdGQiPgorCis8IS0tIGEgdGFnIGxpYnJhcnkgZGVzY3JpcHRvciAtLT4KKworPHRhZ2xpYj4KKyAgPHRsaWItdmVyc2lvbj4xLjA8L3RsaWItdmVyc2lvbj4KKyAgPGpzcC12ZXJzaW9uPjEuMjwvanNwLXZlcnNpb24+CisgIDxzaG9ydC1uYW1lPmRlYnVnPC9zaG9ydC1uYW1lPgorICA8dXJpPmh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvdG9tY2F0L2RlYnVnLXRhZ2xpYjwvdXJpPgorICA8ZGVzY3JpcHRpb24+CisgICAgVGhpcyB0YWcgbGlicmFyeSBkZWZpbmVzIG5vIHRhZ3MuICBJbnN0ZWFkLCBpdHMgcHVycG9zZSBpcyBlbmNhcHN1bGF0ZWQKKyAgICBpbiB0aGUgVGFnTGlicmFyeVZhbGlkYXRvciBpbXBsZW1lbnRhdGlvbiB0aGF0IHNpbXBseSBvdXRwdXRzIHRoZSBYTUwKKyAgICB2ZXJzaW9uIG9mIGEgSlNQIHBhZ2UgdG8gc3RhbmRhcmQgb3V0cHV0LCB3aGVuZXZlciB0aGlzIHRhZyBsaWJyYXJ5IGlzCisgICAgcmVmZXJlbmNlZCBpbiBhICJ0YWdsaWIiIGRpcmVjdGl2ZSBpbiBhIEpTUCBwYWdlLgorICA8L2Rlc2NyaXB0aW9uPgorICA8dmFsaWRhdG9yPgorICAgIDx2YWxpZGF0b3ItY2xhc3M+dmFsaWRhdG9ycy5EZWJ1Z1ZhbGlkYXRvcjwvdmFsaWRhdG9yLWNsYXNzPgorICA8L3ZhbGlkYXRvcj4KKworICA8IS0tIFRoaXMgaXMgYSBkdW1teSB0YWcgc29sZWx5IHRvIHNhdGlzZnkgRFREIHJlcXVpcmVtZW50cyAtLT4gIAorICA8dGFnPgorICAgIDxuYW1lPmxvZzwvbmFtZT4KKyAgICA8dGFnLWNsYXNzPmV4YW1wbGVzLkxvZ1RhZzwvdGFnLWNsYXNzPgorICAgIDxib2R5LWNvbnRlbnQ+VEFHREVQRU5ERU5UPC9ib2R5LWNvbnRlbnQ+CisgICAgPGRlc2NyaXB0aW9uPgorCVBlcmZvcm0gYSBzZXJ2ZXIgc2lkZSBhY3Rpb247IExvZyB0aGUgbWVzc2FnZS4KKyAgICA8L2Rlc2NyaXB0aW9uPgorICAgIDxhdHRyaWJ1dGU+CisJPG5hbWU+dG9Ccm93c2VyPC9uYW1lPgorCTxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+CisgICAgPC9hdHRyaWJ1dGU+CisgIDwvdGFnPgorICAKKworPC90YWdsaWI+CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2pzcC9leGFtcGxlLXRhZ2xpYi50bGQgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2pzcC9leGFtcGxlLXRhZ2xpYi50bGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMwZTMwYgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvanNwL2V4YW1wbGUtdGFnbGliLnRsZApAQCAtMCwwICsxLDgyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/PgorPCEtLQorICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPCFET0NUWVBFIHRhZ2xpYgorICAgICAgICBQVUJMSUMgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBKU1AgVGFnIExpYnJhcnkgMS4yLy9FTiIKKwkiaHR0cDovL2phdmEuc3VuLmNvbS9qMmVlL2R0ZC93ZWItanNwdGFnbGlicmFyeV8xXzIuZHRkIj4KKworPHRhZ2xpYj4KKworICA8dGxpYi12ZXJzaW9uPjEuMDwvdGxpYi12ZXJzaW9uPgorICA8anNwLXZlcnNpb24+MS4yPC9qc3AtdmVyc2lvbj4KKyAgPHNob3J0LW5hbWU+c2ltcGxlPC9zaG9ydC1uYW1lPgorICA8dXJpPmh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvdG9tY2F0L2V4YW1wbGUtdGFnbGliPC91cmk+CisgIDxkZXNjcmlwdGlvbj4KKwlBIHNpbXBsZSB0YWIgbGlicmFyeSBmb3IgdGhlIGV4YW1wbGVzCisgIDwvZGVzY3JpcHRpb24+CisKKyAgPHRhZz4KKyAgICA8bmFtZT5TaG93U291cmNlPC9uYW1lPgorICAgIDx0YWctY2xhc3M+ZXhhbXBsZXMuU2hvd1NvdXJjZTwvdGFnLWNsYXNzPgorICAgIDxkZXNjcmlwdGlvbj4gRGlzcGxheSBKU1Agc291cmNlcyA8L2Rlc2NyaXB0aW9uPgorICAgIDxhdHRyaWJ1dGU+CisgICAgICAgPG5hbWU+anNwRmlsZTwvbmFtZT4KKyAgICAgICA8cmVxdWlyZWQ+dHJ1ZTwvcmVxdWlyZWQ+CisgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgorICAgIDwvYXR0cmlidXRlPgorICA8L3RhZz4gICAgICAgCisKKyAgPCEtLSBBIHNpbXBsZSBUYWcgLS0+CisgIDwhLS0gZm9vIHRhZyAtLT4KKyAgPHRhZz4KKyAgICA8bmFtZT5mb288L25hbWU+CisgICAgPHRhZy1jbGFzcz5leGFtcGxlcy5Gb29UYWc8L3RhZy1jbGFzcz4KKyAgICA8dGVpLWNsYXNzPmV4YW1wbGVzLkZvb1RhZ0V4dHJhSW5mbzwvdGVpLWNsYXNzPgorICAgIDxib2R5LWNvbnRlbnQ+SlNQPC9ib2R5LWNvbnRlbnQ+CisgICAgPGRlc2NyaXB0aW9uPgorCVBlcmZvcm0gYSBzZXJ2ZXIgc2lkZSBhY3Rpb247IHVzZXMgMyBtYW5kYXRvcnkgYXR0cmlidXRlcworICAgIDwvZGVzY3JpcHRpb24+CisKKyAgICA8YXR0cmlidXRlPgorICAgICAgPG5hbWU+YXR0MTwvbmFtZT4KKyAgICAgIDxyZXF1aXJlZD50cnVlPC9yZXF1aXJlZD4KKyAgICA8L2F0dHJpYnV0ZT4KKyAgICA8YXR0cmlidXRlPgorICAgICAgPG5hbWU+YXR0MjwvbmFtZT4KKyAgICAgIDxyZXF1aXJlZD50cnVlPC9yZXF1aXJlZD4KKyAgICA8L2F0dHJpYnV0ZT4KKyAgICA8YXR0cmlidXRlPgorICAgICAgPG5hbWU+YXR0MzwvbmFtZT4KKyAgICAgIDxyZXF1aXJlZD50cnVlPC9yZXF1aXJlZD4KKyAgICA8L2F0dHJpYnV0ZT4KKyAgPC90YWc+CisKKyAgPCEtLSBBbm90aGVyIHNpbXBsZSB0YWcgLS0+CisgIDwhLS0gbG9nIHRhZyAtLT4KKyAgPHRhZz4KKyAgICA8bmFtZT5sb2c8L25hbWU+CisgICAgPHRhZy1jbGFzcz5leGFtcGxlcy5Mb2dUYWc8L3RhZy1jbGFzcz4KKyAgICA8Ym9keS1jb250ZW50PlRBR0RFUEVOREVOVDwvYm9keS1jb250ZW50PgorICAgIDxkZXNjcmlwdGlvbj4KKwlQZXJmb3JtIGEgc2VydmVyIHNpZGUgYWN0aW9uOyBMb2cgdGhlIG1lc3NhZ2UuCisgICAgPC9kZXNjcmlwdGlvbj4KKyAgICA8YXR0cmlidXRlPgorCTxuYW1lPnRvQnJvd3NlcjwvbmFtZT4KKwk8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgorICAgIDwvYXR0cmlidXRlPgorICA8L3RhZz4KKyAgCis8L3RhZ2xpYj4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvanNwMi9qc3AyLWV4YW1wbGUtdGFnbGliLnRsZCBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvanNwMi9qc3AyLWV4YW1wbGUtdGFnbGliLnRsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjJjZDllCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi9qc3AyL2pzcDItZXhhbXBsZS10YWdsaWIudGxkCkBAIC0wLDAgKzEsMTIzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4KKzwhLS0KKyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHRhZ2xpYiB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKKyAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL3dlYi1qc3B0YWdsaWJyYXJ5XzJfMC54c2QiCisgICAgdmVyc2lvbj0iMi4wIj4KKyAgICA8ZGVzY3JpcHRpb24+QSB0YWcgbGlicmFyeSBleGVyY2lzaW5nIFNpbXBsZVRhZyBoYW5kbGVycy48L2Rlc2NyaXB0aW9uPgorICAgIDx0bGliLXZlcnNpb24+MS4wPC90bGliLXZlcnNpb24+CisgICAgPHNob3J0LW5hbWU+U2ltcGxlVGFnTGlicmFyeTwvc2hvcnQtbmFtZT4KKyAgICA8dXJpPi9TaW1wbGVUYWdMaWJyYXJ5PC91cmk+CisgICAgPHRhZz4KKwk8ZGVzY3JpcHRpb24+T3V0cHV0cyBIZWxsbywgV29ybGQ8L2Rlc2NyaXB0aW9uPgorICAgICAgICA8bmFtZT5oZWxsb1dvcmxkPC9uYW1lPgorCTx0YWctY2xhc3M+anNwMi5leGFtcGxlcy5zaW1wbGV0YWcuSGVsbG9Xb3JsZFNpbXBsZVRhZzwvdGFnLWNsYXNzPgorCTxib2R5LWNvbnRlbnQ+ZW1wdHk8L2JvZHktY29udGVudD4KKyAgICA8L3RhZz4KKyAgICA8dGFnPgorICAgICAgICA8ZGVzY3JpcHRpb24+UmVwZWF0cyB0aGUgYm9keSBvZiB0aGUgdGFnICdudW0nIHRpbWVzPC9kZXNjcmlwdGlvbj4KKyAgICAgICAgPG5hbWU+cmVwZWF0PC9uYW1lPgorICAgICAgICA8dGFnLWNsYXNzPmpzcDIuZXhhbXBsZXMuc2ltcGxldGFnLlJlcGVhdFNpbXBsZVRhZzwvdGFnLWNsYXNzPgorICAgICAgICA8Ym9keS1jb250ZW50PnNjcmlwdGxlc3M8L2JvZHktY29udGVudD4KKyAgICAgICAgPHZhcmlhYmxlPgorICAgICAgICAgICAgPGRlc2NyaXB0aW9uPkN1cnJlbnQgaW52b2NhdGlvbiBjb3VudCAoMSB0byBudW0pPC9kZXNjcmlwdGlvbj4KKyAgICAgICAgICAgIDxuYW1lLWdpdmVuPmNvdW50PC9uYW1lLWdpdmVuPgorICAgICAgICA8L3ZhcmlhYmxlPgorICAgICAgICA8YXR0cmlidXRlPgorICAgICAgICAgICAgPG5hbWU+bnVtPC9uYW1lPgorICAgICAgICAgICAgPHJlcXVpcmVkPnRydWU8L3JlcXVpcmVkPgorICAgICAgICAgICAgPHJ0ZXhwcnZhbHVlPnRydWU8L3J0ZXhwcnZhbHVlPgorICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICA8L3RhZz4KKyAgICA8dGFnPgorCTxkZXNjcmlwdGlvbj5Qb3B1bGF0ZXMgdGhlIHBhZ2UgY29udGV4dCB3aXRoIGEgQm9va0JlYW48L2Rlc2NyaXB0aW9uPgorICAgICAgICA8bmFtZT5maW5kQm9vazwvbmFtZT4KKwk8dGFnLWNsYXNzPmpzcDIuZXhhbXBsZXMuc2ltcGxldGFnLkZpbmRCb29rU2ltcGxlVGFnPC90YWctY2xhc3M+CisJPGJvZHktY29udGVudD5lbXB0eTwvYm9keS1jb250ZW50PgorCTxhdHRyaWJ1dGU+CisJICAgIDxuYW1lPnZhcjwvbmFtZT4KKwkgICAgPHJlcXVpcmVkPnRydWU8L3JlcXVpcmVkPgorCSAgICA8cnRleHBydmFsdWU+dHJ1ZTwvcnRleHBydmFsdWU+CisJPC9hdHRyaWJ1dGU+CisgICAgPC90YWc+CisgICAgPHRhZz4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgICAgVGFrZXMgMyBmcmFnbWVudHMgYW5kIGludm9rZXMgdGhlbSBpbiBhIHJhbmRvbSBvcmRlcgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgICA8bmFtZT5zaHVmZmxlPC9uYW1lPgorICAgICAgICA8dGFnLWNsYXNzPmpzcDIuZXhhbXBsZXMuc2ltcGxldGFnLlNodWZmbGVTaW1wbGVUYWc8L3RhZy1jbGFzcz4KKyAgICAgICAgPGJvZHktY29udGVudD5lbXB0eTwvYm9keS1jb250ZW50PgorICAgICAgICA8YXR0cmlidXRlPgorICAgICAgICAgICAgPG5hbWU+ZnJhZ21lbnQxPC9uYW1lPgorICAgICAgICAgICAgPHJlcXVpcmVkPnRydWU8L3JlcXVpcmVkPgorCSAgICA8ZnJhZ21lbnQ+dHJ1ZTwvZnJhZ21lbnQ+CisgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICA8YXR0cmlidXRlPgorICAgICAgICAgICAgPG5hbWU+ZnJhZ21lbnQyPC9uYW1lPgorICAgICAgICAgICAgPHJlcXVpcmVkPnRydWU8L3JlcXVpcmVkPgorCSAgICA8ZnJhZ21lbnQ+dHJ1ZTwvZnJhZ21lbnQ+CisgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICA8YXR0cmlidXRlPgorICAgICAgICAgICAgPG5hbWU+ZnJhZ21lbnQzPC9uYW1lPgorICAgICAgICAgICAgPHJlcXVpcmVkPnRydWU8L3JlcXVpcmVkPgorCSAgICA8ZnJhZ21lbnQ+dHJ1ZTwvZnJhZ21lbnQ+CisgICAgICAgIDwvYXR0cmlidXRlPgorICAgIDwvdGFnPgorICAgIDx0YWc+CisgICAgICAgIDxkZXNjcmlwdGlvbj5PdXRwdXRzIGEgY29sb3JlZCB0aWxlPC9kZXNjcmlwdGlvbj4KKyAgICAgICAgPG5hbWU+dGlsZTwvbmFtZT4KKyAgICAgICAgPHRhZy1jbGFzcz5qc3AyLmV4YW1wbGVzLnNpbXBsZXRhZy5UaWxlU2ltcGxlVGFnPC90YWctY2xhc3M+CisgICAgICAgIDxib2R5LWNvbnRlbnQ+ZW1wdHk8L2JvZHktY29udGVudD4KKyAgICAgICAgPGF0dHJpYnV0ZT4KKyAgICAgICAgICAgIDxuYW1lPmNvbG9yPC9uYW1lPgorICAgICAgICAgICAgPHJlcXVpcmVkPnRydWU8L3JlcXVpcmVkPgorICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgICAgPGF0dHJpYnV0ZT4KKyAgICAgICAgICAgIDxuYW1lPmxhYmVsPC9uYW1lPgorICAgICAgICAgICAgPHJlcXVpcmVkPnRydWU8L3JlcXVpcmVkPgorICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICA8L3RhZz4KKyAgICA8dGFnPgorCTxkZXNjcmlwdGlvbj4KKwkgIFRhZyB0aGF0IGVjaG9lcyBhbGwgaXRzIGF0dHJpYnV0ZXMgYW5kIGJvZHkgY29udGVudAorCTwvZGVzY3JpcHRpb24+CisJPG5hbWU+ZWNob0F0dHJpYnV0ZXM8L25hbWU+CisJPHRhZy1jbGFzcz5qc3AyLmV4YW1wbGVzLnNpbXBsZXRhZy5FY2hvQXR0cmlidXRlc1RhZzwvdGFnLWNsYXNzPgorCTxib2R5LWNvbnRlbnQ+ZW1wdHk8L2JvZHktY29udGVudD4KKwk8ZHluYW1pYy1hdHRyaWJ1dGVzPnRydWU8L2R5bmFtaWMtYXR0cmlidXRlcz4KKyAgICA8L3RhZz4KKyAgICA8ZnVuY3Rpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj5SZXZlcnNlcyB0aGUgY2hhcmFjdGVycyBpbiB0aGUgZ2l2ZW4gU3RyaW5nPC9kZXNjcmlwdGlvbj4KKyAgICAgICAgPG5hbWU+cmV2ZXJzZTwvbmFtZT4KKwk8ZnVuY3Rpb24tY2xhc3M+anNwMi5leGFtcGxlcy5lbC5GdW5jdGlvbnM8L2Z1bmN0aW9uLWNsYXNzPgorCTxmdW5jdGlvbi1zaWduYXR1cmU+amF2YS5sYW5nLlN0cmluZyByZXZlcnNlKCBqYXZhLmxhbmcuU3RyaW5nICk8L2Z1bmN0aW9uLXNpZ25hdHVyZT4KKyAgICA8L2Z1bmN0aW9uPgorICAgIDxmdW5jdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPkNvdW50cyB0aGUgbnVtYmVyIG9mIHZvd2VscyAoYSxlLGksbyx1KSBpbiB0aGUgZ2l2ZW4gU3RyaW5nPC9kZXNjcmlwdGlvbj4KKyAgICAgICAgPG5hbWU+Y291bnRWb3dlbHM8L25hbWU+CisJPGZ1bmN0aW9uLWNsYXNzPmpzcDIuZXhhbXBsZXMuZWwuRnVuY3Rpb25zPC9mdW5jdGlvbi1jbGFzcz4KKwk8ZnVuY3Rpb24tc2lnbmF0dXJlPmphdmEubGFuZy5TdHJpbmcgbnVtVm93ZWxzKCBqYXZhLmxhbmcuU3RyaW5nICk8L2Z1bmN0aW9uLXNpZ25hdHVyZT4KKyAgICA8L2Z1bmN0aW9uPgorICAgIDxmdW5jdGlvbj4KKwk8ZGVzY3JpcHRpb24+Q29udmVydHMgdGhlIHN0cmluZyB0byBhbGwgY2FwczwvZGVzY3JpcHRpb24+CisgICAgICAgIDxuYW1lPmNhcHM8L25hbWU+CisJPGZ1bmN0aW9uLWNsYXNzPmpzcDIuZXhhbXBsZXMuZWwuRnVuY3Rpb25zPC9mdW5jdGlvbi1jbGFzcz4KKwk8ZnVuY3Rpb24tc2lnbmF0dXJlPmphdmEubGFuZy5TdHJpbmcgY2FwcyggamF2YS5sYW5nLlN0cmluZyApPC9mdW5jdGlvbi1zaWduYXR1cmU+CisgICAgPC9mdW5jdGlvbj4KKzwvdGFnbGliPgorCmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2xpYi9qc3RsLmphciBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvbGliL2pzdGwuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiNDEzNTgKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2xpYi9qc3RsLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2xpYi9zdGFuZGFyZC5qYXIgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL2xpYi9zdGFuZGFyZC5qYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU4ZGFhZQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvbGliL3N0YW5kYXJkLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL3RhZ1BsdWdpbnMueG1sIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi90YWdQbHVnaW5zLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTc2YzY3Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi90YWdQbHVnaW5zLnhtbApAQCAtMCwwICsxLDIyIEBACis8dGFnLXBsdWdpbnM+CisgIDx0YWctcGx1Z2luPgorICAgIDx0YWctY2xhc3M+b3JnLmFwYWNoZS50YWdsaWJzLnN0YW5kYXJkLnRhZy5ydC5jb3JlLklmVGFnPC90YWctY2xhc3M+CisgICAgPHBsdWdpbi1jbGFzcz5vcmcuYXBhY2hlLmphc3Blci50YWdwbHVnaW5zLmpzdGwuSWY8L3BsdWdpbi1jbGFzcz4KKyAgPC90YWctcGx1Z2luPgorICA8dGFnLXBsdWdpbj4KKyAgICA8dGFnLWNsYXNzPm9yZy5hcGFjaGUudGFnbGlicy5zdGFuZGFyZC50YWcuY29tbW9uLmNvcmUuQ2hvb3NlVGFnPC90YWctY2xhc3M+CisgICAgPHBsdWdpbi1jbGFzcz5vcmcuYXBhY2hlLmphc3Blci50YWdwbHVnaW5zLmpzdGwuQ2hvb3NlPC9wbHVnaW4tY2xhc3M+CisgIDwvdGFnLXBsdWdpbj4KKyAgPHRhZy1wbHVnaW4+CisgICAgPHRhZy1jbGFzcz5vcmcuYXBhY2hlLnRhZ2xpYnMuc3RhbmRhcmQudGFnLnJ0LmNvcmUuV2hlblRhZzwvdGFnLWNsYXNzPgorICAgIDxwbHVnaW4tY2xhc3M+b3JnLmFwYWNoZS5qYXNwZXIudGFncGx1Z2lucy5qc3RsLldoZW48L3BsdWdpbi1jbGFzcz4KKyAgPC90YWctcGx1Z2luPgorICA8dGFnLXBsdWdpbj4KKyAgICA8dGFnLWNsYXNzPm9yZy5hcGFjaGUudGFnbGlicy5zdGFuZGFyZC50YWcuY29tbW9uLmNvcmUuT3RoZXJ3aXNlVGFnPC90YWctY2xhc3M+CisgICAgPHBsdWdpbi1jbGFzcz5vcmcuYXBhY2hlLmphc3Blci50YWdwbHVnaW5zLmpzdGwuT3RoZXJ3aXNlPC9wbHVnaW4tY2xhc3M+CisgIDwvdGFnLXBsdWdpbj4KKyAgPHRhZy1wbHVnaW4+CisgICAgPHRhZy1jbGFzcz5vcmcuYXBhY2hlLnRhZ2xpYnMuc3RhbmRhcmQudGFnLnJ0LmNvcmUuRm9yRWFjaFRhZzwvdGFnLWNsYXNzPgorICAgIDxwbHVnaW4tY2xhc3M+b3JnLmFwYWNoZS5qYXNwZXIudGFncGx1Z2lucy5qc3RsLkZvckVhY2g8L3BsdWdpbi1jbGFzcz4KKyAgPC90YWctcGx1Z2luPgorPC90YWctcGx1Z2lucz4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvdGFncy9kaXNwbGF5UHJvZHVjdHMudGFnIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi90YWdzL2Rpc3BsYXlQcm9kdWN0cy50YWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGYxNmM4YQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvdGFncy9kaXNwbGF5UHJvZHVjdHMudGFnCkBAIC0wLDAgKzEsNTQgQEAKKzwhLS0KKyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzwlQCB0YWdsaWIgcHJlZml4PSJjIiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNwL2pzdGwvY29yZSIgJT4KKzwlQCBhdHRyaWJ1dGUgbmFtZT0ibm9ybWFsUHJpY2UiIGZyYWdtZW50PSJ0cnVlIiAlPgorPCVAIGF0dHJpYnV0ZSBuYW1lPSJvblNhbGUiIGZyYWdtZW50PSJ0cnVlIiAlPgorPCVAIHZhcmlhYmxlIG5hbWUtZ2l2ZW49Im5hbWUiICU+Cis8JUAgdmFyaWFibGUgbmFtZS1naXZlbj0icHJpY2UiICU+Cis8JUAgdmFyaWFibGUgbmFtZS1naXZlbj0ib3JpZ1ByaWNlIiAlPgorPCVAIHZhcmlhYmxlIG5hbWUtZ2l2ZW49InNhbGVQcmljZSIgJT4KKworPHRhYmxlIGJvcmRlcj0iMSI+CisgIDx0cj4KKyAgICA8dGQ+IAorICAgICAgPGM6c2V0IHZhcj0ibmFtZSIgdmFsdWU9IkhhbmQtaGVsZCBDb2xvciBQREEiLz4KKyAgICAgIDxjOnNldCB2YXI9InByaWNlIiB2YWx1ZT0iJDI5OC44NiIvPgorICAgICAgPGpzcDppbnZva2UgZnJhZ21lbnQ9Im5vcm1hbFByaWNlIi8+CisgICAgPC90ZD4KKyAgICA8dGQ+IAorICAgICAgPGM6c2V0IHZhcj0ibmFtZSIgdmFsdWU9IjQtUGFjayAxNTAgV2F0dCBMaWdodCBCdWxicyIvPgorICAgICAgPGM6c2V0IHZhcj0ib3JpZ1ByaWNlIiB2YWx1ZT0iJDIuOTgiLz4KKyAgICAgIDxjOnNldCB2YXI9InNhbGVQcmljZSIgdmFsdWU9IiQyLjMyIi8+CisgICAgICA8anNwOmludm9rZSBmcmFnbWVudD0ib25TYWxlIi8+CisgICAgPC90ZD4KKyAgICA8dGQ+IAorICAgICAgPGM6c2V0IHZhcj0ibmFtZSIgdmFsdWU9IkRpZ2l0YWwgQ2VsbHVsYXIgUGhvbmUiLz4KKyAgICAgIDxjOnNldCB2YXI9InByaWNlIiB2YWx1ZT0iJDY4Ljc0Ii8+CisgICAgICA8anNwOmludm9rZSBmcmFnbWVudD0ibm9ybWFsUHJpY2UiLz4KKyAgICA8L3RkPgorICAgIDx0ZD4gCisgICAgICA8YzpzZXQgdmFyPSJuYW1lIiB2YWx1ZT0iQmFieSBHcmFuZCBQaWFubyIvPgorICAgICAgPGM6c2V0IHZhcj0icHJpY2UiIHZhbHVlPSIkMTAsODAwLjAwIi8+CisgICAgICA8anNwOmludm9rZSBmcmFnbWVudD0ibm9ybWFsUHJpY2UiLz4KKyAgICA8L3RkPgorICAgIDx0ZD4gCisgICAgICA8YzpzZXQgdmFyPSJuYW1lIiB2YWx1ZT0iTHV4dXJ5IENhciB3LyBMZWF0aGVyIFNlYXRzIi8+CisgICAgICA8YzpzZXQgdmFyPSJvcmlnUHJpY2UiIHZhbHVlPSIkMjMsOTgwLjAwIi8+CisgICAgICA8YzpzZXQgdmFyPSJzYWxlUHJpY2UiIHZhbHVlPSIkMjEsMDcwLjAwIi8+CisgICAgICA8anNwOmludm9rZSBmcmFnbWVudD0ib25TYWxlIi8+CisgICAgPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL3RhZ3MvaGVsbG9Xb3JsZC50YWcgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL3RhZ3MvaGVsbG9Xb3JsZC50YWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmMyMDIxNAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvdGFncy9oZWxsb1dvcmxkLnRhZwpAQCAtMCwwICsxLDE2IEBACis8IS0tCisgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CitIZWxsbywgd29ybGQhCmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL3RhZ3MvcGFuZWwudGFnIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi90YWdzL3BhbmVsLnRhZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzYyNzk1Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi90YWdzL3BhbmVsLnRhZwpAQCAtMCwwICsxLDI4IEBACis8IS0tCisgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8JUAgYXR0cmlidXRlIG5hbWU9ImNvbG9yIiAlPgorPCVAIGF0dHJpYnV0ZSBuYW1lPSJiZ2NvbG9yIiAlPgorPCVAIGF0dHJpYnV0ZSBuYW1lPSJ0aXRsZSIgJT4KKzx0YWJsZSBib3JkZXI9IjEiIGJnY29sb3I9IiR7Y29sb3J9Ij4KKyAgPHRyPgorICAgIDx0ZD48Yj4ke3RpdGxlfTwvYj48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIGJnY29sb3I9IiR7Ymdjb2xvcn0iPgorICAgICAgPGpzcDpkb0JvZHkvPgorICAgIDwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi90YWdzL3hodG1sYmFzaWMudGFnIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi90YWdzL3hodG1sYmFzaWMudGFnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzOGQxMGMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9XRUItSU5GL3RhZ3MveGh0bWxiYXNpYy50YWcKQEAgLTAsMCArMSwyMCBAQAorPCEtLQorICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCBCYXNpYyAxLjAvL0VOIgorImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLWJhc2ljL3hodG1sLWJhc2ljMTAuZHRkIj4KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KKzxqc3A6ZG9Cb2R5Lz4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvd2ViLnhtbCBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL1dFQi1JTkYvd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTQzNzlhCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsMjU4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Cis8IS0tCisgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzx3ZWItYXBwIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgorICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvd2ViLWFwcF8yXzQueHNkIgorICAgIHZlcnNpb249IjIuNCI+CisKKyAgICA8ZGVzY3JpcHRpb24+CisgICAgICBKU1AgMi4wIEV4YW1wbGVzLgorICAgIDwvZGVzY3JpcHRpb24+CisgICAgPGRpc3BsYXktbmFtZT5KU1AgMi4wIEV4YW1wbGVzPC9kaXNwbGF5LW5hbWU+CisKKworICAgIDwhLS0gRGVmaW5lIHNlcnZsZXQtbWFwcGVkIGFuZCBwYXRoLW1hcHBlZCBleGFtcGxlIGZpbHRlcnMgLS0+CisgICAgPGZpbHRlcj4KKyAgICAgICAgPGZpbHRlci1uYW1lPlNlcnZsZXQgTWFwcGVkIEZpbHRlcjwvZmlsdGVyLW5hbWU+CisgICAgICAgIDxmaWx0ZXItY2xhc3M+ZmlsdGVycy5FeGFtcGxlRmlsdGVyPC9maWx0ZXItY2xhc3M+CisJPGluaXQtcGFyYW0+CisJICAgIDxwYXJhbS1uYW1lPmF0dHJpYnV0ZTwvcGFyYW0tbmFtZT4KKwkgICAgPHBhcmFtLXZhbHVlPmZpbHRlcnMuRXhhbXBsZUZpbHRlci5TRVJWTEVUX01BUFBFRDwvcGFyYW0tdmFsdWU+CisJPC9pbml0LXBhcmFtPgorICAgIDwvZmlsdGVyPgorICAgIDxmaWx0ZXI+CisgICAgICAgIDxmaWx0ZXItbmFtZT5QYXRoIE1hcHBlZCBGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8ZmlsdGVyLWNsYXNzPmZpbHRlcnMuRXhhbXBsZUZpbHRlcjwvZmlsdGVyLWNsYXNzPgorCTxpbml0LXBhcmFtPgorCSAgICA8cGFyYW0tbmFtZT5hdHRyaWJ1dGU8L3BhcmFtLW5hbWU+CisJICAgIDxwYXJhbS12YWx1ZT5maWx0ZXJzLkV4YW1wbGVGaWx0ZXIuUEFUSF9NQVBQRUQ8L3BhcmFtLXZhbHVlPgorCTwvaW5pdC1wYXJhbT4KKyAgICA8L2ZpbHRlcj4KKyAgICA8ZmlsdGVyPgorICAgICAgICA8ZmlsdGVyLW5hbWU+UmVxdWVzdCBEdW1wZXIgRmlsdGVyPC9maWx0ZXItbmFtZT4KKyAgICAgICAgPGZpbHRlci1jbGFzcz5maWx0ZXJzLlJlcXVlc3REdW1wZXJGaWx0ZXI8L2ZpbHRlci1jbGFzcz4KKyAgICA8L2ZpbHRlcj4KKworICAgIDwhLS0gRXhhbXBsZSBmaWx0ZXIgdG8gc2V0IGNoYXJhY3RlciBlbmNvZGluZyBvbiBlYWNoIHJlcXVlc3QgLS0+CisgICAgPGZpbHRlcj4KKyAgICAgICAgPGZpbHRlci1uYW1lPlNldCBDaGFyYWN0ZXIgRW5jb2Rpbmc8L2ZpbHRlci1uYW1lPgorICAgICAgICA8ZmlsdGVyLWNsYXNzPmZpbHRlcnMuU2V0Q2hhcmFjdGVyRW5jb2RpbmdGaWx0ZXI8L2ZpbHRlci1jbGFzcz4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5lbmNvZGluZzwvcGFyYW0tbmFtZT4KKyAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5FVUNfSlA8L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgPC9maWx0ZXI+CisKKyAgICA8ZmlsdGVyPgorICAgICAgICA8ZmlsdGVyLW5hbWU+Q29tcHJlc3Npb24gRmlsdGVyPC9maWx0ZXItbmFtZT4KKyAgICAgICAgPGZpbHRlci1jbGFzcz5jb21wcmVzc2lvbkZpbHRlcnMuQ29tcHJlc3Npb25GaWx0ZXI8L2ZpbHRlci1jbGFzcz4KKworICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICA8cGFyYW0tbmFtZT5jb21wcmVzc2lvblRocmVzaG9sZDwvcGFyYW0tbmFtZT4KKyAgICAgICAgICA8cGFyYW0tdmFsdWU+MTA8L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgIDxwYXJhbS1uYW1lPmRlYnVnPC9wYXJhbS1uYW1lPgorICAgICAgICAgIDxwYXJhbS12YWx1ZT4wPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgIDwvZmlsdGVyPgorCis8IS0tIEV4YW1wbGUgZmlsdGVyIG1hcHBpbmcgdG8gYXBwbHkgdGhlICJTZXQgQ2hhcmFjdGVyIEVuY29kaW5nIiBmaWx0ZXIKKyAgICAgdG8gKmFsbCogcmVxdWVzdHMgcHJvY2Vzc2VkIGJ5IHRoaXMgd2ViIGFwcGxpY2F0aW9uIC0tPgorPCEtLQorICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPlNldCBDaGFyYWN0ZXIgRW5jb2Rpbmc8L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+Lyo8L3VybC1wYXR0ZXJuPgorICAgIDwvZmlsdGVyLW1hcHBpbmc+CistLT4KKworPCEtLQorICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgIDxmaWx0ZXItbmFtZT5Db21wcmVzc2lvbiBGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgICAgPHVybC1wYXR0ZXJuPi9Db21wcmVzc2lvblRlc3Q8L3VybC1wYXR0ZXJuPgorICAgIDwvZmlsdGVyLW1hcHBpbmc+CistLT4KKworPCEtLQorICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPlJlcXVlc3QgRHVtcGVyIEZpbHRlcjwvZmlsdGVyLW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vKjwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKy0tPgorCisgICAgPCEtLSBEZWZpbmUgZXhhbXBsZSBhcHBsaWNhdGlvbiBldmVudHMgbGlzdGVuZXJzIC0tPgorICAgIDxsaXN0ZW5lcj4KKyAgICAgICAgPGxpc3RlbmVyLWNsYXNzPmxpc3RlbmVycy5Db250ZXh0TGlzdGVuZXI8L2xpc3RlbmVyLWNsYXNzPgorICAgIDwvbGlzdGVuZXI+CisgICAgPGxpc3RlbmVyPgorICAgICAgICA8bGlzdGVuZXItY2xhc3M+bGlzdGVuZXJzLlNlc3Npb25MaXN0ZW5lcjwvbGlzdGVuZXItY2xhc3M+CisgICAgPC9saXN0ZW5lcj4KKworICAgIDwhLS0gRGVmaW5lIHNlcnZsZXRzIHRoYXQgYXJlIGluY2x1ZGVkIGluIHRoZSBleGFtcGxlIGFwcGxpY2F0aW9uIC0tPgorCisgICAgPHNlcnZsZXQ+CisgICAgICA8c2VydmxldC1uYW1lPgorICAgICAgICAgIHNlcnZsZXRUb0pzcAorICAgICAgPC9zZXJ2bGV0LW5hbWU+CisgICAgICA8c2VydmxldC1jbGFzcz4KKyAgICAgICAgICBzZXJ2bGV0VG9Kc3AKKyAgICAgIDwvc2VydmxldC1jbGFzcz4KKyAgICA8L3NlcnZsZXQ+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT4KKyAgICAgICAgICAgIENvbXByZXNzaW9uRmlsdGVyVGVzdFNlcnZsZXQKKyAgICAgICAgPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPgorICAgICAgICAgICAgY29tcHJlc3Npb25GaWx0ZXJzLkNvbXByZXNzaW9uRmlsdGVyVGVzdFNlcnZsZXQKKyAgICAgICAgPC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+CisgICAgICAgICAgICBDb21wcmVzc2lvbkZpbHRlclRlc3RTZXJ2bGV0CisgICAgICAgIDwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+CisgICAgICAgICAgICAvQ29tcHJlc3Npb25UZXN0CisgICAgICAgIDwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPgorICAgICAgICAgICAgc2VydmxldFRvSnNwCisgICAgICAgIDwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+CisgICAgICAgICAgICAvc2VydmxldFRvSnNwCisgICAgICAgIDwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8anNwLWNvbmZpZz4KKyAgICAgICAgPHRhZ2xpYj4KKwkgICAgPHRhZ2xpYi11cmk+CisJICAgICAgIGh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvdG9tY2F0L2RlYnVnLXRhZ2xpYgorCSAgICA8L3RhZ2xpYi11cmk+CisJICAgIDx0YWdsaWItbG9jYXRpb24+CisJICAgICAgIC9XRUItSU5GL2pzcC9kZWJ1Zy10YWdsaWIudGxkCisJICAgIDwvdGFnbGliLWxvY2F0aW9uPgorCTwvdGFnbGliPgorCisJPHRhZ2xpYj4KKwkgICAgPHRhZ2xpYi11cmk+CisJICAgICAgIGh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvdG9tY2F0L2V4YW1wbGVzLXRhZ2xpYgorCSAgICA8L3RhZ2xpYi11cmk+CisJICAgIDx0YWdsaWItbG9jYXRpb24+CisJICAgICAgIC9XRUItSU5GL2pzcC9leGFtcGxlLXRhZ2xpYi50bGQKKwkgICAgPC90YWdsaWItbG9jYXRpb24+CisJPC90YWdsaWI+CisKKwk8dGFnbGliPgorCSAgICA8dGFnbGliLXVyaT4KKwkgICAgICAgaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy90b21jYXQvanNwMi1leGFtcGxlLXRhZ2xpYgorCSAgICA8L3RhZ2xpYi11cmk+CisJICAgIDx0YWdsaWItbG9jYXRpb24+CisJICAgICAgIC9XRUItSU5GL2pzcDIvanNwMi1leGFtcGxlLXRhZ2xpYi50bGQKKwkgICAgPC90YWdsaWItbG9jYXRpb24+CisJPC90YWdsaWI+CisKKwk8anNwLXByb3BlcnR5LWdyb3VwPgorCSAgICA8ZGVzY3JpcHRpb24+CisJCVNwZWNpYWwgcHJvcGVydHkgZ3JvdXAgZm9yIEpTUCBDb25maWd1cmF0aW9uIEpTUCBleGFtcGxlLgorCSAgICA8L2Rlc2NyaXB0aW9uPgorCSAgICA8ZGlzcGxheS1uYW1lPkpTUENvbmZpZ3VyYXRpb248L2Rpc3BsYXktbmFtZT4KKwkgICAgPHVybC1wYXR0ZXJuPi9qc3AyL21pc2MvY29uZmlnLmpzcDwvdXJsLXBhdHRlcm4+CisJICAgIDxlbC1pZ25vcmVkPnRydWU8L2VsLWlnbm9yZWQ+CisJICAgIDxwYWdlLWVuY29kaW5nPklTTy04ODU5LTE8L3BhZ2UtZW5jb2Rpbmc+CisJICAgIDxzY3JpcHRpbmctaW52YWxpZD50cnVlPC9zY3JpcHRpbmctaW52YWxpZD4KKwkgICAgPGluY2x1ZGUtcHJlbHVkZT4vanNwMi9taXNjL3ByZWx1ZGUuanNwZjwvaW5jbHVkZS1wcmVsdWRlPgorCSAgICA8aW5jbHVkZS1jb2RhPi9qc3AyL21pc2MvY29kYS5qc3BmPC9pbmNsdWRlLWNvZGE+CisJPC9qc3AtcHJvcGVydHktZ3JvdXA+CisgICAgPC9qc3AtY29uZmlnPgorICAgIAorICAgPHNlY3VyaXR5LWNvbnN0cmFpbnQ+CisgICAgICA8ZGlzcGxheS1uYW1lPkV4YW1wbGUgU2VjdXJpdHkgQ29uc3RyYWludDwvZGlzcGxheS1uYW1lPgorICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgorICAgICAgICAgPHdlYi1yZXNvdXJjZS1uYW1lPlByb3RlY3RlZCBBcmVhPC93ZWItcmVzb3VyY2UtbmFtZT4KKwkgPCEtLSBEZWZpbmUgdGhlIGNvbnRleHQtcmVsYXRpdmUgVVJMKHMpIHRvIGJlIHByb3RlY3RlZCAtLT4KKyAgICAgICAgIDx1cmwtcGF0dGVybj4vc2VjdXJpdHkvcHJvdGVjdGVkLyo8L3VybC1wYXR0ZXJuPgorCSA8IS0tIElmIHlvdSBsaXN0IGh0dHAgbWV0aG9kcywgb25seSB0aG9zZSBtZXRob2RzIGFyZSBwcm90ZWN0ZWQgLS0+CisJIDxodHRwLW1ldGhvZD5ERUxFVEU8L2h0dHAtbWV0aG9kPgorICAgICAgICAgPGh0dHAtbWV0aG9kPkdFVDwvaHR0cC1tZXRob2Q+CisgICAgICAgICA8aHR0cC1tZXRob2Q+UE9TVDwvaHR0cC1tZXRob2Q+CisJIDxodHRwLW1ldGhvZD5QVVQ8L2h0dHAtbWV0aG9kPgorICAgICAgPC93ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KKyAgICAgIDxhdXRoLWNvbnN0cmFpbnQ+CisgICAgICAgICA8IS0tIEFueW9uZSB3aXRoIG9uZSBvZiB0aGUgbGlzdGVkIHJvbGVzIG1heSBhY2Nlc3MgdGhpcyBhcmVhIC0tPgorICAgICAgICAgPHJvbGUtbmFtZT50b21jYXQ8L3JvbGUtbmFtZT4KKwkgPHJvbGUtbmFtZT5yb2xlMTwvcm9sZS1uYW1lPgorICAgICAgPC9hdXRoLWNvbnN0cmFpbnQ+CisgICAgPC9zZWN1cml0eS1jb25zdHJhaW50PgorCisgICAgPCEtLSBEZWZhdWx0IGxvZ2luIGNvbmZpZ3VyYXRpb24gdXNlcyBmb3JtLWJhc2VkIGF1dGhlbnRpY2F0aW9uIC0tPgorICAgIDxsb2dpbi1jb25maWc+CisgICAgICA8YXV0aC1tZXRob2Q+Rk9STTwvYXV0aC1tZXRob2Q+CisgICAgICA8cmVhbG0tbmFtZT5FeGFtcGxlIEZvcm0tQmFzZWQgQXV0aGVudGljYXRpb24gQXJlYTwvcmVhbG0tbmFtZT4KKyAgICAgIDxmb3JtLWxvZ2luLWNvbmZpZz4KKyAgICAgICAgPGZvcm0tbG9naW4tcGFnZT4vc2VjdXJpdHkvcHJvdGVjdGVkL2xvZ2luLmpzcDwvZm9ybS1sb2dpbi1wYWdlPgorICAgICAgICA8Zm9ybS1lcnJvci1wYWdlPi9zZWN1cml0eS9wcm90ZWN0ZWQvZXJyb3IuanNwPC9mb3JtLWVycm9yLXBhZ2U+CisgICAgICA8L2Zvcm0tbG9naW4tY29uZmlnPgorICAgIDwvbG9naW4tY29uZmlnPgorICAgICAgICAKKyAgICA8IS0tIFNlY3VyaXR5IHJvbGVzIHJlZmVyZW5jZWQgYnkgdGhpcyB3ZWIgYXBwbGljYXRpb24gLS0+CisgICAgPHNlY3VyaXR5LXJvbGU+CisgICAgICA8cm9sZS1uYW1lPnJvbGUxPC9yb2xlLW5hbWU+CisgICAgPC9zZWN1cml0eS1yb2xlPgorICAgIDxzZWN1cml0eS1yb2xlPgorICAgICAgPHJvbGUtbmFtZT50b21jYXQ8L3JvbGUtbmFtZT4KKyAgICA8L3NlY3VyaXR5LXJvbGU+ICAgIAorCisgICAgPCEtLSBFbnZpcm9ubWVudCBlbnRyeSBleGFtcGxlcyAtLT4KKyAgICA8IS0tZW52LWVudHJ5PgorICAgICAgPGVudi1lbnRyeS1kZXNjcmlwdGlvbj4KKyAgICAgICAgIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0YXggZXhlbXB0aW9ucyBhbGxvd2VkIHRvIGJlIHNldC4KKyAgICAgIDwvZW52LWVudHJ5LWRlc2NyaXB0aW9uPgorICAgICAgPGVudi1lbnRyeS1uYW1lPm1heEV4ZW1wdGlvbnM8L2Vudi1lbnRyeS1uYW1lPgorICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9lbnYtZW50cnktdHlwZT4KKyAgICAgIDxlbnYtZW50cnktdmFsdWU+MTU8L2Vudi1lbnRyeS12YWx1ZT4KKyAgICA8L2Vudi1lbnRyeS0tPgorICAgIDxlbnYtZW50cnk+CisgICAgICA8ZW52LWVudHJ5LW5hbWU+bWluRXhlbXB0aW9uczwvZW52LWVudHJ5LW5hbWU+CisgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkludGVnZXI8L2Vudi1lbnRyeS10eXBlPgorICAgICAgPGVudi1lbnRyeS12YWx1ZT4xPC9lbnYtZW50cnktdmFsdWU+CisgICAgPC9lbnYtZW50cnk+CisgICAgPGVudi1lbnRyeT4KKyAgICAgIDxlbnYtZW50cnktbmFtZT5mb28vbmFtZTE8L2Vudi1lbnRyeS1uYW1lPgorICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5TdHJpbmc8L2Vudi1lbnRyeS10eXBlPgorICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZTE8L2Vudi1lbnRyeS12YWx1ZT4KKyAgICA8L2Vudi1lbnRyeT4KKyAgICA8ZW52LWVudHJ5PgorICAgICAgPGVudi1lbnRyeS1uYW1lPmZvby9iYXIvbmFtZTI8L2Vudi1lbnRyeS1uYW1lPgorICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Cb29sZWFuPC9lbnYtZW50cnktdHlwZT4KKyAgICAgIDxlbnYtZW50cnktdmFsdWU+dHJ1ZTwvZW52LWVudHJ5LXZhbHVlPgorICAgIDwvZW52LWVudHJ5PgorICAgIDxlbnYtZW50cnk+CisgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZTM8L2Vudi1lbnRyeS1uYW1lPgorICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9lbnYtZW50cnktdHlwZT4KKyAgICAgIDxlbnYtZW50cnktdmFsdWU+MTwvZW52LWVudHJ5LXZhbHVlPgorICAgIDwvZW52LWVudHJ5PgorICAgIDxlbnYtZW50cnk+CisgICAgICA8ZW52LWVudHJ5LW5hbWU+Zm9vL25hbWU0PC9lbnYtZW50cnktbmFtZT4KKyAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvZW52LWVudHJ5LXR5cGU+CisgICAgICA8ZW52LWVudHJ5LXZhbHVlPjEwPC9lbnYtZW50cnktdmFsdWU+CisgICAgPC9lbnYtZW50cnk+CisKKzwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2NhbC9jYWwxLmpzcCBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2NhbC9jYWwxLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2E3NjZkCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvY2FsL2NhbDEuanNwCkBAIC0wLDAgKzEsOTQgQEAKKzxIVE1MPgorPCEtLQorICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPEhFQUQ+PFRJVExFPiAKKwlDYWxlbmRhcjogQSBKU1AgQVBQTElDQVRJT04KKzwvVElUTEU+PC9IRUFEPgorCisKKzxCT0RZIEJHQ09MT1I9IndoaXRlIj4KKworPCVAIHBhZ2UgbGFuZ3VhZ2U9ImphdmEiIGltcG9ydD0iY2FsLioiICU+Cis8anNwOnVzZUJlYW4gaWQ9InRhYmxlIiBzY29wZT0ic2Vzc2lvbiIgY2xhc3M9ImNhbC5UYWJsZUJlYW4iIC8+CisKKzwlCisJdGFibGUucHJvY2Vzc1JlcXVlc3QocmVxdWVzdCk7CisJaWYgKHRhYmxlLmdldFByb2Nlc3NFcnJvcigpID09IGZhbHNlKSB7CislPgorCis8IS0tIGh0bWwgdGFibGUgZ29lcyBoZXJlIC0tPgorPENFTlRFUj4KKzxUQUJMRSBXSURUSD02MCUgQkdDT0xPUj15ZWxsb3cgQ0VMTFBBRERJTkc9MTU+Cis8VFI+Cis8VEQgQUxJR049Q0VOVEVSPiA8QSBIUkVGPWNhbDEuanNwP2RhdGU9cHJldj4gcHJldiA8L0E+Cis8VEQgQUxJR049Q0VOVEVSPiBDYWxlbmRhcjo8JT0gdGFibGUuZ2V0RGF0ZSgpICU+PC9URD4KKzxURCBBTElHTj1DRU5URVI+IDxBIEhSRUY9Y2FsMS5qc3A/ZGF0ZT1uZXh0PiBuZXh0IDwvQT4KKzwvVFI+Cis8L1RBQkxFPgorCis8IS0tIHRoZSBtYWluIHRhYmxlIC0tPgorPFRBQkxFIFdJRFRIPTYwJSBCR0NPTE9SPWxpZ2h0Ymx1ZSBCT1JERVI9MSBDRUxMUEFERElORz0xMD4KKzxUUj4KKzxUSD4gVGltZSA8L1RIPgorPFRIPiBBcHBvaW50bWVudCA8L1RIPgorPC9UUj4KKzxGT1JNIE1FVEhPRD1QT1NUIEFDVElPTj1jYWwxLmpzcD4KKzwlCisJZm9yKGludCBpPTA7IGk8dGFibGUuZ2V0RW50cmllcygpLmdldFJvd3MoKTsgaSsrKSB7CisJICAgY2FsLkVudHJ5IGVudHIgPSB0YWJsZS5nZXRFbnRyaWVzKCkuZ2V0RW50cnkoaSk7CQorJT4KKwk8VFI+CisJPFREPiAKKwk8QSBIUkVGPWNhbDIuanNwP3RpbWU9PCU9IGVudHIuZ2V0SG91cigpICU+PgorCQk8JT0gZW50ci5nZXRIb3VyKCkgJT4gPC9BPgorCTwvVEQ+CisJPFREIEJHQ09MT1I9PCU9IGVudHIuZ2V0Q29sb3IoKSAlPj4KKwk8JSBvdXQucHJpbnQodXRpbC5IVE1MRmlsdGVyLmZpbHRlcihlbnRyLmdldERlc2NyaXB0aW9uKCkpKTsgJT4KKwk8L1REPiAKKwk8L1RSPgorPCUKKwl9CislPgorPC9GT1JNPgorPC9UQUJMRT4KKzxCUj4KKworPCEtLSBmb290ZXIgLS0+Cis8VEFCTEUgV0lEVEg9NjAlIEJHQ09MT1I9eWVsbG93IENFTExQQURESU5HPTE1PgorPFRSPgorPFREIEFMSUdOPUNFTlRFUj4gIDwlIG91dC5wcmludCh1dGlsLkhUTUxGaWx0ZXIuZmlsdGVyKHRhYmxlLmdldE5hbWUoKSkpOyAlPiA6IAorCQkgICAgIDwlIG91dC5wcmludCh1dGlsLkhUTUxGaWx0ZXIuZmlsdGVyKHRhYmxlLmdldEVtYWlsKCkpKTsgJT4gPC9URD4KKzwvVFI+Cis8L1RBQkxFPgorPC9DRU5URVI+CisKKzwlCisJfSBlbHNlIHsKKyU+Cis8Zm9udCBzaXplPTU+CisJWW91IG11c3QgZW50ZXIgeW91ciBuYW1lIGFuZCBlbWFpbCBhZGRyZXNzIGNvcnJlY3RseS4KKzwvZm9udD4KKzwlCisJfQorJT4KKworCis8L0JPRFk+Cis8L0hUTUw+CisKKworCisKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2NhbC9jYWwyLmpzcCBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2NhbC9jYWwyLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmViZDhhCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvY2FsL2NhbDIuanNwCkBAIC0wLDAgKzEsNDQgQEAKKzxIVE1MPgorPCEtLQorICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8SEVBRD48VElUTEU+IAorCUNhbGVuZGFyOiBBIEpTUCBBUFBMSUNBVElPTgorPC9USVRMRT48L0hFQUQ+CisKKworPEJPRFkgQkdDT0xPUj0id2hpdGUiPgorPGpzcDp1c2VCZWFuIGlkPSJ0YWJsZSIgc2NvcGU9InNlc3Npb24iIGNsYXNzPSJjYWwuVGFibGVCZWFuIiAvPgorCis8JSAKKwlTdHJpbmcgdGltZSA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyICgidGltZSIpOworJT4KKworPEZPTlQgU0laRT01PiBQbGVhc2UgYWRkIHRoZSBmb2xsb3dpbmcgZXZlbnQ6Cis8QlI+IDxoMz4gRGF0ZSA8JT0gdGFibGUuZ2V0RGF0ZSgpICU+Cis8QlI+IFRpbWUgPCU9IHRpbWUgJT4gPC9oMz4KKzwvRk9OVD4KKzxGT1JNIE1FVEhPRD1QT1NUIEFDVElPTj1jYWwxLmpzcD4KKzxCUj4gCis8QlI+IDxJTlBVVCBOQU1FPSJkYXRlIiBUWVBFPUhJRERFTiBWQUxVRT0iY3VycmVudCI+Cis8QlI+IDxJTlBVVCBOQU1FPSJ0aW1lIiBUWVBFPUhJRERFTiBWQUxVRT08JT0gdGltZSAlPgorPEJSPiA8aDI+IERlc2NyaXB0aW9uIG9mIHRoZSBldmVudCA8SU5QVVQgTkFNRT0iZGVzY3JpcHRpb24iIFRZUEU9VEVYVCBTSVpFPTIwPiA8L2gyPgorPEJSPiA8SU5QVVQgVFlQRT1TVUJNSVQgVkFMVUU9InN1Ym1pdCI+Cis8L0ZPUk0+CisKKzwvQk9EWT4KKzwvSFRNTD4KKwpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvY2FsL2NhbGVuZGFyLmh0bWwgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9jYWwvY2FsZW5kYXIuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjFhNzRjCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvY2FsL2NhbGVuZGFyLmh0bWwKQEAgLTAsMCArMSw0MiBAQAorPGh0bWw+Cis8IS0tCisgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxoZWFkPgorPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorPC9oZWFkPgorCis8Ym9keSBiZ2NvbG9yPSIjRkZGRkZGIj4KKzxwPjxmb250IGNvbG9yPSIjMDAwMEZGIj48YSBocmVmPSJsb2dpbi5odG1sIj48aW1nIHNyYz0iLi4vaW1hZ2VzL2V4ZWN1dGUuZ2lmIiBhbGlnbj0icmlnaHQiIGJvcmRlcj0iMCI+PC9hPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPjxpbWcgc3JjPSIuLi9pbWFnZXMvcmV0dXJuLmdpZiIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiBhbGlnbj0icmlnaHQiIGJvcmRlcj0iMCI+PC9hPjwvZm9udD48L3A+CisKKzxoMj4gU291cmNlIENvZGUgZm9yIENhbGVuZGFyIEV4YW1wbGUuIDxicj4KKzxoMz48YSBocmVmPSJjYWwxLmpzcC5odG1sIj5jYWwxLmpzcDxmb250IGNvbG9yPSIjMDAwMEZGIj48L2E+CisgIDwvZm9udD4gPC9oMz4KKzxoMz48YSBocmVmPSJjYWwyLmpzcC5odG1sIj5jYWwyLmpzcDxmb250IGNvbG9yPSIjMDAwMEZGIj48L2E+CisgIDwvZm9udD4gPC9oMz4KKworPGJyPgorPGgyPiBCZWFucy4KKzxoMz48YSBocmVmPSJUYWJsZUJlYW4uamF2YS5odG1sIj5UYWJsZUJlYW48Zm9udCBjb2xvcj0iIzAwMDBGRiI+PC9hPgorICA8L2ZvbnQ+IDwvaDM+Cis8aDM+PGEgaHJlZj0iRW50cmllcy5qYXZhLmh0bWwiPkVudHJpZXM8Zm9udCBjb2xvcj0iIzAwMDBGRiI+PC9hPgorICA8L2ZvbnQ+IDwvaDM+Cis8aDM+PGEgaHJlZj0iRW50cnkuamF2YS5odG1sIj5FbnRyeTxmb250IGNvbG9yPSIjMDAwMEZGIj48L2E+CisgIDwvZm9udD4gPC9oMz4KKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvY2FsL2xvZ2luLmh0bWwgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9jYWwvbG9naW4uaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjhiYTQyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvY2FsL2xvZ2luLmh0bWwKQEAgLTAsMCArMSw0NiBAQAorPGh0bWw+Cis8IS0tCisgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxoZWFkPgorCTx0aXRsZT4gTG9naW4gcGFnZSBmb3IgdGhlIGNhbGVuZGFyLiA8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keSBiZ2NvbG9yPSJ3aGl0ZSI+Cis8Y2VudGVyPgorCisJPGZvbnQgc2l6ZT03IGNvbG9yPSJyZWQiPiBQbGVhc2UgRW50ZXIgdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbjogPC9mb250PgorCis8YnI+CisJPGZvcm0gbWV0aG9kPUdFVCBhY3Rpb249Y2FsMS5qc3A+CisKKwkJPGZvbnQgc2l6ZT01PiBOYW1lIDxpbnB1dCB0eXBlPXRleHQgbmFtZT0ibmFtZSIgc2l6ZT0yMD4KKwkJPC9mb250PgorCQk8YnI+CisJCTxmb250IHNpemU9NT4gRW1haWwgPGlucHV0IHR5cGU9dGV4dCBuYW1lPSJlbWFpbCIgc2l6ZT0yMD4KKwkJPC9mb250PgorCQk8YnI+CisJCTxpbnB1dCB0eXBlPXN1Ym1pdCBuYW1lPWFjdGlvbiB2YWx1ZT0iU3VibWl0Ij4KKworCTwvZm9ybT4KKzxocj4KKzxmb250IHNpemU9MyBjb2xvcj0icmVkIj4gTm90ZTogVGhpcyBhcHBsaWNhdGlvbiBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIGNvbXBsZXRlIAorZnVuY3Rpb25hbGl0eSBvZiBhIHR5cGljYWwgY2FsZW5kYXIgYXBwbGljYXRpb24uIEl0IGRlbW9zdGFydGVzIGEgd2F5IEpTUCBjYW4gYmUgCit1c2VkIHdpdGggaHRtbCB0YWJsZXMgYW5kIGZvcm1zLjwvZm9udD4KKworPC9jZW50ZXI+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9jaGVja2JveC9DaGVja1Rlc3QuaHRtbCBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2NoZWNrYm94L0NoZWNrVGVzdC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNmMzNjcKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9jaGVja2JveC9DaGVja1Rlc3QuaHRtbApAQCAtMCwwICsxLDU1IEBACis8SFRNTD4KKzwhLS0KKyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPEhFQUQ+Cis8dGl0bGU+CitjaGVja2JveC5DaGVja1Rlc3QgQmVhbiBQcm9wZXJ0aWVzCis8L3RpdGxlPgorPEJPRFkgQkdDT0xPUj0id2hpdGUiPgorPEgyPgorY2hlY2tib3guQ2hlY2tUZXN0IEJlYW4gUHJvcGVydGllcworPC9IMj4KKzxIUj4KKzxETD4KKzxEVD5wdWJsaWMgY2xhc3MgPEI+Q2hlY2tUZXN0PC9CPjxEVD5leHRlbmRzIE9iamVjdDwvREw+CisKKzxQPgorPEhSPgorCis8UD4KKworPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCI+Cis8VFIgQkdDT0xPUj0iI0VFRUVGRiI+Cis8VEQgQ09MU1BBTj0zPjxGT05UIFNJWkU9IisyIj4KKzxCPlByb3BlcnRpZXMgU3VtbWFyeTwvQj48L0ZPTlQ+PC9URD4KKzwvVFI+Cis8VFIgQkdDT0xPUj0id2hpdGUiPgorPHRkIGFsaWduPSJyaWdodCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIxJSI+Cis8Rk9OVCBTSVpFPSItMSI+CitTdHJpbmcKKzwvRk9OVD48L1REPgorPFREPjxCPkNoZWNrVGVzdDpmcnVpdDwvQj4KKzxCUj4KKyAgICAgICA8L1REPgorPHRkIHdpZHRoPSIxJSI+Cis8Rk9OVCBTSVpFPSItMSI+CitNdWx0aQorPC9GT05UPjwvVEQ+Cis8L1RBQkxFPgorPEhSPgorPC9CT0RZPgorPC9IVE1MPgpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvY2hlY2tib3gvY2hlY2suaHRtbCBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2NoZWNrYm94L2NoZWNrLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFiYzYxMAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2NoZWNrYm94L2NoZWNrLmh0bWwKQEAgLTAsMCArMSwzNyBAQAorPEhUTUw+Cis8IS0tCisgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxCT0RZIGJnY29sb3I9IndoaXRlIj4KKworCis8Rk9STSBUWVBFPVBPU1QgQUNUSU9OPWNoZWNrcmVzdWx0LmpzcD4KKzxCUj4KKzxmb250IHNpemU9NSBjb2xvcj0icmVkIj4KK0NoZWNrIGFsbCBGYXZvcml0ZSBmcnVpdHM6IDxicj4KKworPGlucHV0IFRZUEU9Y2hlY2tib3ggbmFtZT1mcnVpdCBWQUxVRT1hcHBsZXM+IEFwcGxlcyA8QlI+Cis8aW5wdXQgVFlQRT1jaGVja2JveCBuYW1lPWZydWl0IFZBTFVFPWdyYXBlcz4gR3JhcGVzIDxCUj4KKzxpbnB1dCBUWVBFPWNoZWNrYm94IG5hbWU9ZnJ1aXQgVkFMVUU9b3Jhbmdlcz4gT3JhbmdlcyA8QlI+Cis8aW5wdXQgVFlQRT1jaGVja2JveCBuYW1lPWZydWl0IFZBTFVFPW1lbG9ucz4gTWVsb25zIDxCUj4KKworCis8YnI+IDxJTlBVVCBUWVBFPXN1Ym1pdCBuYW1lPXN1Ym1pdCBWYWx1ZT0iU3VibWl0Ij4KKworPC9mb250PgorPC9GT1JNPgorPC9CT0RZPgorPC9IVE1MPgpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvY2hlY2tib3gvY2hlY2tyZXN1bHQuanNwIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvY2hlY2tib3gvY2hlY2tyZXN1bHQuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiMTg4YmIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9jaGVja2JveC9jaGVja3Jlc3VsdC5qc3AKQEAgLTAsMCArMSw2MyBAQAorPGh0bWw+Cis8IS0tCisgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxib2R5IGJnY29sb3I9IndoaXRlIj4KKzxmb250IHNpemU9NSBjb2xvcj0icmVkIj4KKzwlISBTdHJpbmdbXSBmcnVpdHM7ICU+Cis8anNwOnVzZUJlYW4gaWQ9ImZvbyIgc2NvcGU9InBhZ2UiIGNsYXNzPSJjaGVja2JveC5DaGVja1Rlc3QiIC8+CisKKzxqc3A6c2V0UHJvcGVydHkgbmFtZT0iZm9vIiBwcm9wZXJ0eT0iZnJ1aXQiIHBhcmFtPSJmcnVpdCIgLz4KKzxocj4KK1RoZSBjaGVja2VkIGZydWl0cyAoZ290IHVzaW5nIHJlcXVlc3QpIGFyZTogPGJyPgorPCUgCisJZnJ1aXRzID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXJWYWx1ZXMoImZydWl0Iik7CislPgorPHVsPgorPCUKKyAgICBpZiAoZnJ1aXRzICE9IG51bGwpIHsKKwkgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJ1aXRzLmxlbmd0aDsgaSsrKSB7CislPgorPGxpPgorPCUKKwkgICAgICBvdXQucHJpbnRsbiAodXRpbC5IVE1MRmlsdGVyLmZpbHRlcihmcnVpdHNbaV0pKTsKKwkgIH0KKwl9IGVsc2Ugb3V0LnByaW50bG4gKCJub25lIHNlbGVjdGVkIik7CislPgorPC91bD4KKzxicj4KKzxocj4KKworVGhlIGNoZWNrZWQgZnJ1aXRzIChnb3QgdXNpbmcgYmVhbnMpIGFyZSA8YnI+CisKKzwlIAorCQlmcnVpdHMgPSBmb28uZ2V0RnJ1aXQoKTsKKyU+Cis8dWw+Cis8JQorICAgIGlmICghZnJ1aXRzWzBdLmVxdWFscygiMSIpKSB7CisJICBmb3IgKGludCBpID0gMDsgaSA8IGZydWl0cy5sZW5ndGg7IGkrKykgeworJT4KKzxsaT4KKzwlCisJCSAgb3V0LnByaW50bG4gKHV0aWwuSFRNTEZpbHRlci5maWx0ZXIoZnJ1aXRzW2ldKSk7CisJICB9CisJfSBlbHNlIG91dC5wcmludGxuICgibm9uZSBzZWxlY3RlZCIpOworJT4KKzwvdWw+Cis8L2ZvbnQ+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9jaGVja2JveC9jcmVzdWx0Lmh0bWwgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9jaGVja2JveC9jcmVzdWx0Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY2OGU1YgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2NoZWNrYm94L2NyZXN1bHQuaHRtbApAQCAtMCwwICsxLDMzIEBACis8aHRtbD4KKzwhLS0KKyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPGhlYWQ+Cis8dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Cis8L2hlYWQ+CisKKzxib2R5IGJnY29sb3I9IiNGRkZGRkYiPgorPHA+PGZvbnQgY29sb3I9IiMwMDAwRkYiPjxhIGhyZWY9ImNoZWNrLmh0bWwiPjxpbWcgc3JjPSIuLi9pbWFnZXMvZXhlY3V0ZS5naWYiIGFsaWduPSJyaWdodCIgYm9yZGVyPSIwIj48L2E+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+PGltZyBzcmM9Ii4uL2ltYWdlcy9yZXR1cm4uZ2lmIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGFsaWduPSJyaWdodCIgYm9yZGVyPSIwIj48L2E+PC9mb250PjwvcD4KKworPGgzPjxhIGhyZWY9ImNoZWNrcmVzdWx0LmpzcC5odG1sIj5Tb3VyY2UgQ29kZSBmb3IgQ2hlY2tib3ggRXhhbXBsZTxmb250IGNvbG9yPSIjMDAwMEZGIj48L2E+CisgIDwvZm9udD4gPC9oMz4KKworPGgzPjxhIGhyZWY9IkNoZWNrVGVzdC5odG1sIj5Qcm9wZXJ0eSBTaGVldCBmb3IgQ2hlY2tUZXN0Cis8Zm9udCBjb2xvcj0iIzAwMDBGRiI+PC9hPiA8L2ZvbnQ+IDwvaDM+CisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2NvbG9ycy9Db2xvckdhbWVCZWFuLmh0bWwgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9jb2xvcnMvQ29sb3JHYW1lQmVhbi5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExYTMzZjEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9jb2xvcnMvQ29sb3JHYW1lQmVhbi5odG1sCkBAIC0wLDAgKzEsMTE1IEBACis8SFRNTD4KKzwhLS0KKyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPEhFQUQ+Cis8dGl0bGU+Citjb2xvcnMuQ29sb3JHYW1lQmVhbiBCZWFuIFByb3BlcnRpZXMKKzwvdGl0bGU+Cis8Qk9EWSBCR0NPTE9SPSJ3aGl0ZSI+Cis8SDI+Citjb2xvcnMuQ29sb3JHYW1lQmVhbiBCZWFuIFByb3BlcnRpZXMKKzwvSDI+Cis8SFI+Cis8REw+Cis8RFQ+cHVibGljIGNsYXNzIDxCPkNvbG9yR2FtZUJlYW48L0I+PERUPmV4dGVuZHMgT2JqZWN0PC9ETD4KKworPFA+Cis8SFI+CisKKzxQPgorCis8VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIj4KKzxUUiBCR0NPTE9SPSIjRUVFRUZGIj4KKzxURCBDT0xTUEFOPTM+PEZPTlQgU0laRT0iKzIiPgorPEI+UHJvcGVydGllcyBTdW1tYXJ5PC9CPjwvRk9OVD48L1REPgorPC9UUj4KKzxUUiBCR0NPTE9SPSJ3aGl0ZSI+Cis8dGQgYWxpZ249InJpZ2h0IiB2YWxpZ249InRvcCIgd2lkdGg9IjElIj4KKzxGT05UIFNJWkU9Ii0xIj4KK1N0cmluZworPC9GT05UPjwvVEQ+Cis8VEQ+PEI+Q29sb3JHYW1lQmVhbjpjb2xvcjI8L0I+Cis8QlI+CisgICAgICAgPC9URD4KKzx0ZCB3aWR0aD0iMSUiPgorPEZPTlQgU0laRT0iLTEiPgorU2luZ2xlCis8L0ZPTlQ+PC9URD4KKzxUUiBCR0NPTE9SPSJ3aGl0ZSI+Cis8dGQgYWxpZ249InJpZ2h0IiB2YWxpZ249InRvcCIgd2lkdGg9IjElIj4KKzxGT05UIFNJWkU9Ii0xIj4KK1N0cmluZworPC9GT05UPjwvVEQ+Cis8VEQ+PEI+Q29sb3JHYW1lQmVhbjpjb2xvcjE8L0I+Cis8QlI+CisgICAgICAgPC9URD4KKzx0ZCB3aWR0aD0iMSUiPgorPEZPTlQgU0laRT0iLTEiPgorU2luZ2xlCis8L0ZPTlQ+PC9URD4KKzxUUiBCR0NPTE9SPSJ3aGl0ZSI+Cis8dGQgYWxpZ249InJpZ2h0IiB2YWxpZ249InRvcCIgd2lkdGg9IjElIj4KKzxGT05UIFNJWkU9Ii0xIj4KK2ludAorPC9GT05UPjwvVEQ+Cis8VEQ+PEI+Q29sb3JHYW1lQmVhbjphdHRlbXB0czwvQj4KKzxCUj4KKyAgICAgICA8L1REPgorPHRkIHdpZHRoPSIxJSI+Cis8Rk9OVCBTSVpFPSItMSI+CitTaW5nbGUKKzwvRk9OVD48L1REPgorPFRSIEJHQ09MT1I9IndoaXRlIj4KKzx0ZCBhbGlnbj0icmlnaHQiIHZhbGlnbj0idG9wIiB3aWR0aD0iMSUiPgorPEZPTlQgU0laRT0iLTEiPgorYm9vbGVhbgorPC9GT05UPjwvVEQ+Cis8VEQ+PEI+Q29sb3JHYW1lQmVhbjpoaW50PC9CPgorPEJSPgorICAgICAgIDwvVEQ+Cis8dGQgd2lkdGg9IjElIj4KKzxGT05UIFNJWkU9Ii0xIj4KK1NpbmdsZQorPC9GT05UPjwvVEQ+Cis8VFIgQkdDT0xPUj0id2hpdGUiPgorPHRkIGFsaWduPSJyaWdodCIgdmFsaWduPSJ0b3AiIHdpZHRoPSIxJSI+Cis8Rk9OVCBTSVpFPSItMSI+Citib29sZWFuCis8L0ZPTlQ+PC9URD4KKzxURD48Qj5Db2xvckdhbWVCZWFuOnN1Y2Nlc3M8L0I+Cis8QlI+CisgICAgICAgPC9URD4KKzx0ZCB3aWR0aD0iMSUiPgorPEZPTlQgU0laRT0iLTEiPgorU2luZ2xlCis8L0ZPTlQ+PC9URD4KKzxUUiBCR0NPTE9SPSJ3aGl0ZSI+Cis8dGQgYWxpZ249InJpZ2h0IiB2YWxpZ249InRvcCIgd2lkdGg9IjElIj4KKzxGT05UIFNJWkU9Ii0xIj4KK2Jvb2xlYW4KKzwvRk9OVD48L1REPgorPFREPjxCPkNvbG9yR2FtZUJlYW46aGludFRha2VuPC9CPgorPEJSPgorICAgICAgIDwvVEQ+Cis8dGQgd2lkdGg9IjElIj4KKzxGT05UIFNJWkU9Ii0xIj4KK1NpbmdsZQorPC9GT05UPjwvVEQ+Cis8L1RBQkxFPgorPEhSPgorPC9CT0RZPgorPC9IVE1MPgpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvY29sb3JzL2Nsci5odG1sIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvY29sb3JzL2Nsci5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5NzEzZTEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9jb2xvcnMvY2xyLmh0bWwKQEAgLTAsMCArMSwzMyBAQAorPGh0bWw+Cis8IS0tCisgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxoZWFkPgorPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorPC9oZWFkPgorCis8Ym9keSBiZ2NvbG9yPSIjRkZGRkZGIj4KKzxwPjxmb250IGNvbG9yPSIjMDAwMEZGIj48YSBocmVmPSJjb2xvcnMuaHRtbCI+PGltZyBzcmM9Ii4uL2ltYWdlcy9leGVjdXRlLmdpZiIgYWxpZ249InJpZ2h0IiBib3JkZXI9IjAiPjwvYT48YSBocmVmPSIuLi9pbmRleC5odG1sIj48aW1nIHNyYz0iLi4vaW1hZ2VzL3JldHVybi5naWYiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgYWxpZ249InJpZ2h0IiBib3JkZXI9IjAiPjwvYT48L2ZvbnQ+PC9wPgorCis8aDM+PGEgaHJlZj0iY29scnMuanNwLmh0bWwiPlNvdXJjZSBDb2RlIGZvciBDb2xvciBFeGFtcGxlPGZvbnQgY29sb3I9IiMwMDAwRkYiPjwvYT4KKyAgPC9mb250PiA8L2gzPgorCis8aDM+PGEgaHJlZj0iQ29sb3JHYW1lQmVhbi5odG1sIj5Qcm9wZXJ0eSBTaGVldCBmb3IgQ29sb3JHYW1lQmVhbgorPGZvbnQgY29sb3I9IiMwMDAwRkYiPjwvYT4gPC9mb250PiA8L2gzPgorCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9jb2xvcnMvY29sb3JzLmh0bWwgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9jb2xvcnMvY29sb3JzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYwNjFmZQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2NvbG9ycy9jb2xvcnMuaHRtbApAQCAtMCwwICsxLDQ2IEBACis8aHRtbD4KKzwhLS0KKyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPGJvZHkgYmdjb2xvcj0gd2hpdGU+Cis8Zm9udCBzaXplPTYgY29sb3I9cmVkPgorCis8aHI+CitUaGlzIHdlYiBwYWdlIGlzIGFuIGV4YW1wbGUgdXNpbmcgSlNQIGFuZCBCRUFOcy4gCis8cD4KK0d1ZXNzIG15IGZhdm9yaXRlIHR3byBjb2xvcnMgCisKKzxwPiBJZiB5b3UgZmFpbCB0byBndWVzcyBib3RoIG9mIHRoZW0gLSB5b3UgZ2V0IHllbGxvdyBvbiByZWQuCisKKzxwPiBJZiB5b3UgZ3Vlc3Mgb25lIG9mIHRoZW0gcmlnaHQsIGVpdGhlciB5b3VyIGZvcmVncm91bmQgb3IgCisgICAgeW91ciBiYWNrZ3JvdW5kIHdpbGwgY2hhbmdlIHRvIHRoZSBjb2xvciB0aGF0IHdhcyBndWVzc2VkIHJpZ2h0LgorCis8cD4gR3Vlc3MgdGhlbSBib3RoIHJpZ2h0IGFuZCB5b3VyIGJyb3dzZXIgZm9yZWdyb3VuZC9iYWNrZ3JvdW5kIAorICAgIHdpbGwgY2hhbmdlIHRvIG15IHR3byBmYXZvcml0ZSBjb2xvcnMgdG8gZGlzcGxheSB0aGlzIHBhZ2UuCisKKzxocj4KKzxmb3JtIG1ldGhvZD1HRVQgYWN0aW9uPWNvbHJzLmpzcD4KK0NvbG9yICMxOiA8aW5wdXQgdHlwZT10ZXh0IG5hbWU9IGNvbG9yMSBzaXplPTE2PgorPGJyPgorQ29sb3IgIzI6IDxpbnB1dCB0eXBlPXRleHQgbmFtZT0gY29sb3IyIHNpemU9MTY+Cis8cD4KKzxpbnB1dCB0eXBlPXN1Ym1pdCBuYW1lPWFjdGlvbiB2YWx1ZT0iU3VibWl0Ij4KKzxpbnB1dCB0eXBlPXN1Ym1pdCBuYW1lPWFjdGlvbiB2YWx1ZT0iSGludCI+Cis8L2Zvcm0+CisKKzwvZm9udD4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2NvbG9ycy9jb2xycy5qc3AgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9jb2xvcnMvY29scnMuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiYjdjNjAKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9jb2xvcnMvY29scnMuanNwCkBAIC0wLDAgKzEsNjkgQEAKKzxodG1sPgorPCEtLQorICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8anNwOnVzZUJlYW4gaWQ9ImNiIiBzY29wZT0ic2Vzc2lvbiIgY2xhc3M9ImNvbG9ycy5Db2xvckdhbWVCZWFuIiAvPgorPGpzcDpzZXRQcm9wZXJ0eSBuYW1lPSJjYiIgcHJvcGVydHk9IioiIC8+CisKKzwlCisJY2IucHJvY2Vzc1JlcXVlc3QocmVxdWVzdCk7CislPgorCis8Ym9keSBiZ2NvbG9yPTwlPSBjYi5nZXRDb2xvcjEoKSAlPj4KKzxmb250IHNpemU9NiBjb2xvcj08JT0gY2IuZ2V0Q29sb3IyKCkgJT4+Cis8cD4KKworPCUgaWYgKGNiLmdldEhpbnQoKT09dHJ1ZSkgeyAlPgorCQorCTxwPiBIaW50ICMxOiBWYW1waXJlcyBwcmV5IGF0IG5pZ2h0IQorCTxwPiAgPHA+IEhpbnQgIzI6IE5hbmN5IHdpdGhvdXQgdGhlIG4uCisKKzwlIH0gJT4KKworPCUgaWYgIChjYi5nZXRTdWNjZXNzKCk9PXRydWUpIHsgJT4KKworICAgIDxwPiBDT05HUkFUVUxBVElPTlMhIQorCTwlIGlmICAoY2IuZ2V0SGludFRha2VuKCk9PXRydWUpIHsgJT4KKyAgICAKKyAgICAgICAgPHA+ICggYWx0aG91Z2ggSSBrbm93IHlvdSBjaGVhdGVkIGFuZCBwZWVrZWQgaW50byB0aGUgaGludHMpCisKKwk8JSB9ICU+CisKKzwlIH0gJT4KKworPHA+IFRvdGFsIGF0dGVtcHRzIHNvIGZhcjogPCU9IGNiLmdldEF0dGVtcHRzKCkgJT4KKzxwPgorCis8cD4KKworPGZvcm0gbWV0aG9kPVBPU1QgYWN0aW9uPWNvbHJzLmpzcD4KKworQ29sb3IgIzE6IDxpbnB1dCB0eXBlPXRleHQgbmFtZT0gY29sb3IxIHNpemU9MTY+CisKKzxicj4KKworQ29sb3IgIzI6IDxpbnB1dCB0eXBlPXRleHQgbmFtZT0gY29sb3IyIHNpemU9MTY+CisKKzxwPgorCis8aW5wdXQgdHlwZT1zdWJtaXQgbmFtZT1hY3Rpb24gdmFsdWU9IlN1Ym1pdCI+Cis8aW5wdXQgdHlwZT1zdWJtaXQgbmFtZT1hY3Rpb24gdmFsdWU9IkhpbnQiPgorCis8L2Zvcm0+CisKKzwvZm9udD4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2RhdGVzL2RhdGUuaHRtbCBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2RhdGVzL2RhdGUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODA4MWNhCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvZGF0ZXMvZGF0ZS5odG1sCkBAIC0wLDAgKzEsMzAgQEAKKzxodG1sPgorPCEtLQorICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8aGVhZD4KKzx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKzwvaGVhZD4KKworPGJvZHkgYmdjb2xvcj0iI0ZGRkZGRiI+Cis8cD48Zm9udCBjb2xvcj0iIzAwMDBGRiI+PGEgaHJlZj0iZGF0ZS5qc3AiPjxpbWcgc3JjPSIuLi9pbWFnZXMvZXhlY3V0ZS5naWYiIGFsaWduPSJyaWdodCIgYm9yZGVyPSIwIj48L2E+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+PGltZyBzcmM9Ii4uL2ltYWdlcy9yZXR1cm4uZ2lmIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGFsaWduPSJyaWdodCIgYm9yZGVyPSIwIj48L2E+PC9mb250PjwvcD4KKworPGgzPjxhIGhyZWY9ImRhdGUuanNwLmh0bWwiPlNvdXJjZSBDb2RlIGZvciBEYXRlIEV4YW1wbGU8Zm9udCBjb2xvcj0iIzAwMDBGRiI+PC9hPgorICA8L2ZvbnQ+IDwvaDM+CisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2RhdGVzL2RhdGUuanNwIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvZGF0ZXMvZGF0ZS5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2YzYzNiNAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2RhdGVzL2RhdGUuanNwCkBAIC0wLDAgKzEsNDAgQEAKKzxodG1sPgorPCEtLQorICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8JUAgcGFnZSBzZXNzaW9uPSJmYWxzZSIlPgorCis8Ym9keSBiZ2NvbG9yPSJ3aGl0ZSI+Cis8anNwOnVzZUJlYW4gaWQ9J2Nsb2NrJyBzY29wZT0ncGFnZScgY2xhc3M9J2RhdGVzLkpzcENhbGVuZGFyJyB0eXBlPSJkYXRlcy5Kc3BDYWxlbmRhciIgLz4KKworPGZvbnQgc2l6ZT00PgorPHVsPgorPGxpPglEYXkgb2YgbW9udGg6IGlzICA8anNwOmdldFByb3BlcnR5IG5hbWU9ImNsb2NrIiBwcm9wZXJ0eT0iZGF5T2ZNb250aCIvPgorPGxpPglZZWFyOiBpcyAgPGpzcDpnZXRQcm9wZXJ0eSBuYW1lPSJjbG9jayIgcHJvcGVydHk9InllYXIiLz4KKzxsaT4JTW9udGg6IGlzICA8anNwOmdldFByb3BlcnR5IG5hbWU9ImNsb2NrIiBwcm9wZXJ0eT0ibW9udGgiLz4KKzxsaT4JVGltZTogaXMgIDxqc3A6Z2V0UHJvcGVydHkgbmFtZT0iY2xvY2siIHByb3BlcnR5PSJ0aW1lIi8+Cis8bGk+CURhdGU6IGlzICA8anNwOmdldFByb3BlcnR5IG5hbWU9ImNsb2NrIiBwcm9wZXJ0eT0iZGF0ZSIvPgorPGxpPglEYXk6IGlzICA8anNwOmdldFByb3BlcnR5IG5hbWU9ImNsb2NrIiBwcm9wZXJ0eT0iZGF5Ii8+Cis8bGk+CURheSBPZiBZZWFyOiBpcyAgPGpzcDpnZXRQcm9wZXJ0eSBuYW1lPSJjbG9jayIgcHJvcGVydHk9ImRheU9mWWVhciIvPgorPGxpPglXZWVrIE9mIFllYXI6IGlzICA8anNwOmdldFByb3BlcnR5IG5hbWU9ImNsb2NrIiBwcm9wZXJ0eT0id2Vla09mWWVhciIvPgorPGxpPgllcmE6IGlzICA8anNwOmdldFByb3BlcnR5IG5hbWU9ImNsb2NrIiBwcm9wZXJ0eT0iZXJhIi8+Cis8bGk+CURTVCBPZmZzZXQ6IGlzICA8anNwOmdldFByb3BlcnR5IG5hbWU9ImNsb2NrIiBwcm9wZXJ0eT0iRFNUT2Zmc2V0Ii8+Cis8bGk+CVpvbmUgT2Zmc2V0OiBpcyAgPGpzcDpnZXRQcm9wZXJ0eSBuYW1lPSJjbG9jayIgcHJvcGVydHk9InpvbmVPZmZzZXQiLz4KKzwvdWw+Cis8L2ZvbnQ+CisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2Vycm9yL2VyLmh0bWwgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9lcnJvci9lci5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiZWE2ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9lcnJvci9lci5odG1sCkBAIC0wLDAgKzEsMzAgQEAKKzxodG1sPgorPCEtLQorICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8aGVhZD4KKzx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKzwvaGVhZD4KKworPGJvZHkgYmdjb2xvcj0iI0ZGRkZGRiI+Cis8cD48Zm9udCBjb2xvcj0iIzAwMDBGRiI+PGEgaHJlZj0iZXJyb3IuaHRtbCI+PGltZyBzcmM9Ii4uL2ltYWdlcy9leGVjdXRlLmdpZiIgYWxpZ249InJpZ2h0IiBib3JkZXI9IjAiPjwvYT48YSBocmVmPSIuLi9pbmRleC5odG1sIj48aW1nIHNyYz0iLi4vaW1hZ2VzL3JldHVybi5naWYiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgYWxpZ249InJpZ2h0IiBib3JkZXI9IjAiPjwvYT48L2ZvbnQ+PC9wPgorCis8aDM+PGEgaHJlZj0iZXJyLmpzcC5odG1sIj5Tb3VyY2UgQ29kZSBmb3IgRXJyb3IgRXhhbXBsZTxmb250IGNvbG9yPSIjMDAwMEZGIj48L2E+CisgIDwvZm9udD4gPC9oMz4KKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvZXJyb3IvZXJyLmpzcCBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2Vycm9yL2Vyci5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA3NjM4MAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2Vycm9yL2Vyci5qc3AKQEAgLTAsMCArMSw0MyBAQAorPGh0bWw+Cis8IS0tCisgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Ym9keSBiZ2NvbG9yPSJsaWdodGJsdWUiPgorCisJPCVAIHBhZ2UgZXJyb3JQYWdlPSJlcnJvcnBnZS5qc3AiICU+CisJPGpzcDp1c2VCZWFuIGlkPSJmb28iIHNjb3BlPSJyZXF1ZXN0IiBjbGFzcz0iZXJyb3IuU21hcnQiIC8+CisJPCUgCisJCVN0cmluZyBuYW1lID0gbnVsbDsKKworCQlpZiAocmVxdWVzdC5nZXRQYXJhbWV0ZXIoIm5hbWUiKSA9PSBudWxsKSB7CisJJT4KKwk8JUAgaW5jbHVkZSBmaWxlPSIvZXJyb3IvZXJyb3IuaHRtbCIgJT4KKwk8JQorCQl9IGVsc2UgeworCQkgIGZvby5zZXROYW1lKHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJuYW1lIikpOworCQkgIGlmIChmb28uZ2V0TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoImludGVncmEiKSkKKwkJICAJbmFtZSA9ICJhY3VyYSI7CisJCSAgaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiYWN1cmEiKSkgeworCSU+CisKKwk8SDE+IFllcyEhISA8YSBocmVmPSJodHRwOi8vd3d3LmFjdXJhLmNvbSI+QWN1cmE8L2E+IGlzIG15IGZhdm9yaXRlIGNhci4KKworCTwlIAorCQkgIH0KKwkJfQkKKwklPgkKKzwvYm9keT4KKzwvaHRtbD4KKwpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvZXJyb3IvZXJyb3IuaHRtbCBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2Vycm9yL2Vycm9yLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ4NzE4OAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2Vycm9yL2Vycm9yLmh0bWwKQEAgLTAsMCArMSwzNiBAQAorPGh0bWw+Cis8IS0tCisgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxib2R5IGJnY29sb3I9IndoaXRlIj4KKworPGgxPiBUaGlzIGV4YW1wbGUgdXNlcyA8Yj5lcnJvcnBhZ2U8L2I+IGRpcmVjdGl2ZSA8L2gxPgorPGJyPgorPGgzPiBTZWxlY3QgbXkgZmF2b3VyaXRlIGNhci48L2gzPgorPGZvcm0gbWV0aG9kPWdldCBhY3Rpb249ZXJyLmpzcD4KKzwhLS0gPGJyPiBNYWtlIGEgZ3Vlc3M6IC0tPgorPFNFTEVDVCBOQU1FPSJuYW1lIiBTSVpFPTU+Cis8T1BUSU9OIFZBTFVFPSJpbnRlZ3JhIj4gQWN1cmEgSW50ZWdyYSA8QlI+Cis8T1BUSU9OIFZBTFVFPSJibXczMjhpIj4gQk1XIDMyOEkgPEJSPgorPE9QVElPTiBWQUxVRT0iejMiPiBCTVcgWjMgPEJSPgorPE9QVElPTiBWQUxVRT0iaW5maW5pdGkiPiBJbmZpbml0aVEzIDxCUj4KKzxPUFRJT04gVkFMVUU9ImF1ZGkiPiBBdWRpIEE4IDxCUj4KKzwvU0VMRUNUPgorPGJyPiA8SU5QVVQgVFlQRT1zdWJtaXQgbmFtZT1zdWJtaXQgVmFsdWU9IlN1Ym1pdCI+Cis8L2Zvcm0+CisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2Vycm9yL2Vycm9ycGdlLmpzcCBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2Vycm9yL2Vycm9ycGdlLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTFjZTYxCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvZXJyb3IvZXJyb3JwZ2UuanNwCkBAIC0wLDAgKzEsMjQgQEAKKzxodG1sPgorPCEtLQorICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8Ym9keSBiZ2NvbG9yPSJyZWQiPgorCisJPCVAIHBhZ2UgaXNFcnJvclBhZ2U9InRydWUiICU+CisJPGgxPiBUaGUgZXhjZXB0aW9uIDwlPSBleGNlcHRpb24uZ2V0TWVzc2FnZSgpICU+IHRlbGxzIG1lIHlvdQorCSAgICAgbWFkZSBhIHdyb25nIGNob2ljZS4gCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9mb3J3YXJkL2ZvcndhcmQuanNwIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvZm9yd2FyZC9mb3J3YXJkLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTM3ZmQwCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvZm9yd2FyZC9mb3J3YXJkLmpzcApAQCAtMCwwICsxLDIyIEBACis8aHRtbD4KKzwhLS0KKyAgQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCisgIHJlc2VydmVkLgorLS0+CisKKzwlIAorICAgZG91YmxlIGZyZWVNZW0gPSBSdW50aW1lLmdldFJ1bnRpbWUoKS5mcmVlTWVtb3J5KCk7CisgICBkb3VibGUgdG90bE1lbSA9IFJ1bnRpbWUuZ2V0UnVudGltZSgpLnRvdGFsTWVtb3J5KCk7CisgICBkb3VibGUgcGVyY2VudCA9IGZyZWVNZW0vdG90bE1lbTsKKyAgIGlmIChwZXJjZW50IDwgMC41KSB7IAorJT4KKworPGpzcDpmb3J3YXJkIHBhZ2U9Ii9mb3J3YXJkL29uZS5qc3AiLz4KKworPCUgfSBlbHNlIHsgJT4KKworPGpzcDpmb3J3YXJkIHBhZ2U9InR3by5odG1sIi8+CisKKzwlIH0gJT4KKworPC9odG1sPgpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvZm9yd2FyZC9md2QuaHRtbCBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2ZvcndhcmQvZndkLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTgwYTUzZgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2ZvcndhcmQvZndkLmh0bWwKQEAgLTAsMCArMSwxOCBAQAorPGh0bWw+Cis8IS0tCisgIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAorICByZXNlcnZlZC4KKy0tPgorPGhlYWQ+Cis8dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Cis8L2hlYWQ+CisKKzxib2R5IGJnY29sb3I9IiNGRkZGRkYiPgorPHA+PGZvbnQgY29sb3I9IiMwMDAwRkYiPjxhIGhyZWY9ImZvcndhcmQuanNwIj48aW1nIHNyYz0iLi4vaW1hZ2VzL2V4ZWN1dGUuZ2lmIiBhbGlnbj0icmlnaHQiIGJvcmRlcj0iMCI+PC9hPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPjxpbWcgc3JjPSIuLi9pbWFnZXMvcmV0dXJuLmdpZiIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiBhbGlnbj0icmlnaHQiIGJvcmRlcj0iMCI+PC9hPjwvZm9udD48L3A+CisKKzxoMz48YSBocmVmPSJmb3J3YXJkLmpzcC5odG1sIj5Tb3VyY2UgQ29kZSBmb3IgRm9yd2FyZCBFeGFtcGxlPGZvbnQgY29sb3I9IiMwMDAwRkYiPjwvYT4KKyAgPC9mb250PiA8L2gzPgorCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9mb3J3YXJkL29uZS5qc3AgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9mb3J3YXJkL29uZS5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFmZTZmMgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2ZvcndhcmQvb25lLmpzcApAQCAtMCwwICsxLDExIEBACis8aHRtbD4KKzwhLS0KKyAgQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgCisgIHJlc2VydmVkLgorLS0+CisKKzxib2R5IGJnY29sb3I9IndoaXRlIj4KKzxmb250IGNvbG9yPSJyZWQiPgorCitWTSBNZW1vcnkgdXNhZ2UgPCA1MCUuCis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvZm9yd2FyZC90d28uaHRtbCBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2ZvcndhcmQvdHdvLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JjMjkxNwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2ZvcndhcmQvdHdvLmh0bWwKQEAgLTAsMCArMSwxMSBAQAorPGh0bWw+Cis8IS0tCisgIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAorICByZXNlcnZlZC4KKy0tPgorCis8Ym9keSBiZ2NvbG9yPSJ3aGl0ZSI+Cis8Zm9udCBjb2xvcj0icmVkIj4KKworVk0gTWVtb3J5IHVzYWdlID4gNTAlLgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2ltYWdlcy9jb2RlLmdpZiBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2ltYWdlcy9jb2RlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2FmMmNkCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvaW1hZ2VzL2NvZGUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2ltYWdlcy9leGVjdXRlLmdpZiBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2ltYWdlcy9leGVjdXRlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjRkNzBmCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvaW1hZ2VzL2V4ZWN1dGUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2ltYWdlcy9yZWFkLmdpZiBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2ltYWdlcy9yZWFkLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmNiNGU5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvaW1hZ2VzL3JlYWQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2ltYWdlcy9yZXR1cm4uZ2lmIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvaW1hZ2VzL3JldHVybi5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY0ZjY4ZgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2ltYWdlcy9yZXR1cm4uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2luY2x1ZGUvZm9vLmh0bWwgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9pbmNsdWRlL2Zvby5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3ZDE0NjQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9pbmNsdWRlL2Zvby5odG1sCkBAIC0wLDAgKzEsMTYgQEAKKzwhLS0KKyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KK1RvIGdldCB0aGUgY3VycmVudCB0aW1lIGluIG1zCmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9pbmNsdWRlL2Zvby5qc3AgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9pbmNsdWRlL2Zvby5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDEzMGIwNwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2luY2x1ZGUvZm9vLmpzcApAQCAtMCwwICsxLDIwIEBACis8IS0tCisgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxib2R5IGJnY29sb3I9IndoaXRlIj4KKzxmb250IGNvbG9yPSJyZWQiPgorCis8JT0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgJT4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2luY2x1ZGUvaW5jLmh0bWwgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9pbmNsdWRlL2luYy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiYjNmYjMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9pbmNsdWRlL2luYy5odG1sCkBAIC0wLDAgKzEsMjkgQEAKKzxodG1sPgorPCEtLQorICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGhlYWQ+Cis8dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Cis8L2hlYWQ+CisKKzxib2R5IGJnY29sb3I9IiNGRkZGRkYiPgorPHA+PGZvbnQgY29sb3I9IiMwMDAwRkYiPjxhIGhyZWY9ImluY2x1ZGUuanNwIj48aW1nIHNyYz0iLi4vaW1hZ2VzL2V4ZWN1dGUuZ2lmIiBhbGlnbj0icmlnaHQiIGJvcmRlcj0iMCI+PC9hPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPjxpbWcgc3JjPSIuLi9pbWFnZXMvcmV0dXJuLmdpZiIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiBhbGlnbj0icmlnaHQiIGJvcmRlcj0iMCI+PC9hPjwvZm9udD48L3A+CisKKzxoMz48YSBocmVmPSJpbmNsdWRlLmpzcC5odG1sIj5Tb3VyY2UgQ29kZSBmb3IgSW5jbHVkZSBFeGFtcGxlPGZvbnQgY29sb3I9IiMwMDAwRkYiPjwvYT4KKyAgPC9mb250PiA8L2gzPgorCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9pbmNsdWRlL2luY2x1ZGUuanNwIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvaW5jbHVkZS9pbmNsdWRlLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWY5NzM2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvaW5jbHVkZS9pbmNsdWRlLmpzcApAQCAtMCwwICsxLDM0IEBACis8aHRtbD4KKzwhLS0KKyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPGJvZHkgYmdjb2xvcj0id2hpdGUiPgorCis8Zm9udCBjb2xvcj0icmVkIj4KKworPCVAIHBhZ2UgYnVmZmVyPSI1a2IiIGF1dG9GbHVzaD0iZmFsc2UiICU+CisKKzxwPkluIHBsYWNlIGV2YWx1YXRpb24gb2YgYW5vdGhlciBKU1Agd2hpY2ggZ2l2ZXMgeW91IHRoZSBjdXJyZW50IHRpbWU6CisKKzwlQCBpbmNsdWRlIGZpbGU9ImZvby5qc3AiICU+CisKKzxwPiA8anNwOmluY2x1ZGUgcGFnZT0iL2luY2x1ZGUvZm9vLmh0bWwiIGZsdXNoPSJ0cnVlIi8+IGJ5IGluY2x1ZGluZyB0aGUgb3V0cHV0IG9mIGFub3RoZXIgSlNQOgorCis8anNwOmluY2x1ZGUgcGFnZT0iZm9vLmpzcCIgZmx1c2g9InRydWUiLz4KKworOi0pIAorCis8L2h0bWw+CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9pbmRleC5odG1sIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvaW5kZXguaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDZjMmI2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvaW5kZXguaHRtbApAQCAtMCwwICsxLDM3MyBAQAorPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4KKzxodG1sPgorXDwhLS0KKyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxoZWFkPgorICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+CisgICA8bWV0YSBuYW1lPSJHRU5FUkFUT1IiIGNvbnRlbnQ9Ik1vemlsbGEvNC42MSBbZW5dIChXaW5OVDsgSSkgW05ldHNjYXBlXSI+CisgICA8bWV0YSBuYW1lPSJBdXRob3IiIGNvbnRlbnQ9IkFuaWwgSy4gVmlqZW5kcmFuIj4KKyAgIDx0aXRsZT5KU1AgRXhhbXBsZXM8L3RpdGxlPgorPCEtLQorICBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKKyAgcmVzZXJ2ZWQuCistLT4KKzwvaGVhZD4KKzxib2R5IGJnY29sb3I9IiNGRkZGRkYiPgorPGI+PGZvbnQgZmFjZT0iQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZiI+PGZvbnQgc2l6ZT0rMj5KU1AKK1NhbXBsZXM8L2ZvbnQ+PC9mb250PjwvYj4KKzxwPlRoaXMgaXMgYSBjb2xsZWN0aW9uIG9mIHNhbXBsZXMgZGVtb25zdHJhdGluZyB0aGUgdXNhZ2Ugb2YgZGlmZmVyZW50CitwYXJ0cyBvZiB0aGUgSmF2YSBTZXJ2ZXIgUGFnZXMgKEpTUCkgc3BlY2lmaWNhdGlvbi4gIEJvdGggSlNQIDIuMCBhbmQKK0pTUCAxLjIgZXhhbXBsZXMgYXJlIHByZXNlbnRlZCBiZWxvdy4KKzxwPlRoZXNlIGV4YW1wbGVzIHdpbGwgb25seSB3b3JrIHdoZW4gdGhlc2UgcGFnZXMgYXJlIGJlaW5nIHNlcnZlZCBieSBhCitzZXJ2bGV0IGVuZ2luZTsgb2YgY291cnNlLCB3ZSByZWNvbW1lbmQKKzxhIGhyZWY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvdG9tY2F0LyI+VG9tY2F0PC9hPi4KK1RoZXkgd2lsbCBub3Qgd29yayBpZiB5b3UgYXJlIHZpZXdpbmcgdGhlc2UgcGFnZXMgdmlhIGEKKyJmaWxlOi8vLi4uIiBVUkwuCis8cD5UbyBuYXZpZ2F0ZSB5b3VyIHdheSB0aHJvdWdoIHRoZSBleGFtcGxlcywgdGhlIGZvbGxvd2luZyBpY29ucyB3aWxsCitoZWxwOgorPGJyPiZuYnNwOworPHRhYmxlIEJPUkRFUj0wIENFTExTUEFDSU5HPTUgV0lEVEg9Ijg1JSIgPgorPHRyIFZBTElHTj1UT1A+Cis8dGQgV0lEVEg9IjMwIj48aW1nIFNSQz0iaW1hZ2VzL2V4ZWN1dGUuZ2lmIiA+PC90ZD4KKworPHRkPkV4ZWN1dGUgdGhlIGV4YW1wbGU8L3RkPgorPC90cj4KKworPHRyIFZBTElHTj1UT1A+Cis8dGQgV0lEVEg9IjMwIj48aW1nIFNSQz0iaW1hZ2VzL2NvZGUuZ2lmIiBoZWlnaHQ9MjQgd2lkdGg9MjQ+PC90ZD4KKworPHRkPkxvb2sgYXQgdGhlIHNvdXJjZSBjb2RlIGZvciB0aGUgZXhhbXBsZTwvdGQ+Cis8L3RyPgorCis8IS0tPHRyIFZBTElHTj1UT1A+Cis8dGQgV0lEVEg9IjMwIj48aW1nIFNSQz0iaW1hZ2VzL3JlYWQuZ2lmIiBoZWlnaHQ9MjQgd2lkdGg9MjQ+PC90ZD4KKworPHRkPlJlYWQgbW9yZSBhYm91dCB0aGlzIGZlYXR1cmU8L3RkPgorLS0+CisKKzwvdHI+Cis8dHIgVkFMSUdOPVRPUD4KKzx0ZCBXSURUSD0iMzAiPjxpbWcgU1JDPSJpbWFnZXMvcmV0dXJuLmdpZiIgaGVpZ2h0PTI0IHdpZHRoPTI0PjwvdGQ+CisKKzx0ZD5SZXR1cm4gdG8gdGhpcyBzY3JlZW48L3RkPgorPC90cj4KKzwvdGFibGU+CisKKzxwPlRpcDogRm9yIHNlc3Npb24gc2NvcGVkIGJlYW5zIHRvIHdvcmssIHRoZSBjb29raWVzIG11c3QgYmUgZW5hYmxlZC4KK1RoaXMgY2FuIGJlIGRvbmUgdXNpbmcgYnJvd3NlciBvcHRpb25zLgorPGJyPiZuYnNwOworPGJyPgorPGI+PHU+PGZvbnQgc2l6ZT0iKzEiPkpTUCAyLjAgRXhhbXBsZXM8L2ZvbnQ+PC91PjwvYj48YnI+CisKKzx0YWJsZSBCT1JERVI9MCBDRUxMU1BBQ0lORz01IFdJRFRIPSI4NSUiID4KKzx0ciB2YWxpZ249VE9QPgorPHRkPjxiPkV4cHJlc3Npb24gTGFuZ3VhZ2U8L2I+PC90ZD4KKzwvdHI+CisKKzx0ciB2YWxpZ249VE9QPgorPHRkPkJhc2ljIEFyaXRobWV0aWM8L3RkPgorPHRkIHZhbGlnbj1UT1Agd2lkdGg9IjMwJSI+PGEgaHJlZj0ianNwMi9lbC9iYXNpYy1hcml0aG1ldGljLmpzcCI+PGltZyBzcmM9ImltYWdlcy9leGVjdXRlLmdpZiIgaHNwYWNlPTQgYm9yZGVyPTAgIGFsaWduPXRvcD48L2E+PGEgaHJlZj0ianNwMi9lbC9iYXNpYy1hcml0aG1ldGljLmpzcCI+RXhlY3V0ZTwvYT48L3RkPgorCis8dGQgd2lkdGg9IjMwJSI+PGEgaHJlZj0ianNwMi9lbC9iYXNpYy1hcml0aG1ldGljLmh0bWwiPjxpbWcgU1JDPSJpbWFnZXMvY29kZS5naWYiIEhTUEFDRT00IEJPUkRFUj0wIGhlaWdodD0yNCB3aWR0aD0yNCBhbGlnbj1UT1A+PC9hPjxhIGhyZWY9ImpzcDIvZWwvYmFzaWMtYXJpdGhtZXRpYy5odG1sIj5Tb3VyY2U8L2E+PC90ZD4KKzwvdHI+CisKKzx0ciB2YWxpZ249VE9QPgorPHRkPkJhc2ljIENvbXBhcmlzb25zPC90ZD4KKzx0ZCB2YWxpZ249VE9QIHdpZHRoPSIzMCUiPjxhIGhyZWY9ImpzcDIvZWwvYmFzaWMtY29tcGFyaXNvbnMuanNwIj48aW1nIHNyYz0iaW1hZ2VzL2V4ZWN1dGUuZ2lmIiBoc3BhY2U9NCBib3JkZXI9MCAgYWxpZ249dG9wPjwvYT48YSBocmVmPSJqc3AyL2VsL2Jhc2ljLWNvbXBhcmlzb25zLmpzcCI+RXhlY3V0ZTwvYT48L3RkPgorCis8dGQgd2lkdGg9IjMwJSI+PGEgaHJlZj0ianNwMi9lbC9iYXNpYy1jb21wYXJpc29ucy5odG1sIj48aW1nIFNSQz0iaW1hZ2VzL2NvZGUuZ2lmIiBIU1BBQ0U9NCBCT1JERVI9MCBoZWlnaHQ9MjQgd2lkdGg9MjQgYWxpZ249VE9QPjwvYT48YSBocmVmPSJqc3AyL2VsL2Jhc2ljLWNvbXBhcmlzb25zLmh0bWwiPlNvdXJjZTwvYT48L3RkPgorPC90cj4KKworPHRyIHZhbGlnbj1UT1A+Cis8dGQ+SW1wbGljaXQgT2JqZWN0czwvdGQ+Cis8dGQgdmFsaWduPVRPUCB3aWR0aD0iMzAlIj48YSBocmVmPSJqc3AyL2VsL2ltcGxpY2l0LW9iamVjdHMuanNwP2Zvbz1iYXIiPjxpbWcgc3JjPSJpbWFnZXMvZXhlY3V0ZS5naWYiIGhzcGFjZT00IGJvcmRlcj0wICBhbGlnbj10b3A+PC9hPjxhIGhyZWY9ImpzcDIvZWwvaW1wbGljaXQtb2JqZWN0cy5qc3A/Zm9vPWJhciI+RXhlY3V0ZTwvYT48L3RkPgorCis8dGQgd2lkdGg9IjMwJSI+PGEgaHJlZj0ianNwMi9lbC9pbXBsaWNpdC1vYmplY3RzLmh0bWwiPjxpbWcgU1JDPSJpbWFnZXMvY29kZS5naWYiIEhTUEFDRT00IEJPUkRFUj0wIGhlaWdodD0yNCB3aWR0aD0yNCBhbGlnbj1UT1A+PC9hPjxhIGhyZWY9ImpzcDIvZWwvaW1wbGljaXQtb2JqZWN0cy5odG1sIj5Tb3VyY2U8L2E+PC90ZD4KKzwvdHI+Cis8dHIgdmFsaWduPVRPUD4KKworPHRkPkZ1bmN0aW9uczwvdGQ+Cis8dGQgdmFsaWduPVRPUCB3aWR0aD0iMzAlIj48YSBocmVmPSJqc3AyL2VsL2Z1bmN0aW9ucy5qc3A/Zm9vPUpTUCsyLjAiPjxpbWcgc3JjPSJpbWFnZXMvZXhlY3V0ZS5naWYiIGhzcGFjZT00IGJvcmRlcj0wICBhbGlnbj10b3A+PC9hPjxhIGhyZWY9ImpzcDIvZWwvZnVuY3Rpb25zLmpzcD9mb289SlNQKzIuMCI+RXhlY3V0ZTwvYT48L3RkPgorCis8dGQgd2lkdGg9IjMwJSI+PGEgaHJlZj0ianNwMi9lbC9mdW5jdGlvbnMuaHRtbCI+PGltZyBTUkM9ImltYWdlcy9jb2RlLmdpZiIgSFNQQUNFPTQgQk9SREVSPTAgaGVpZ2h0PTI0IHdpZHRoPTI0IGFsaWduPVRPUD48L2E+PGEgaHJlZj0ianNwMi9lbC9mdW5jdGlvbnMuaHRtbCI+U291cmNlPC9hPjwvdGQ+Cis8L3RyPgorCis8dHIgdmFsaWduPVRPUD4KKzx0ZD48YnI+PGI+U2ltcGxlVGFnIEhhbmRsZXJzIGFuZCBKU1AgRnJhZ21lbnRzPC9iPjwvdGQ+Cis8L3RyPgorCis8dHIgdmFsaWduPVRPUD4KKzx0ZD5IZWxsbyBXb3JsZCBUYWc8L3RkPgorPHRkIHZhbGlnbj1UT1Agd2lkdGg9IjMwJSI+PGEgaHJlZj0ianNwMi9zaW1wbGV0YWcvaGVsbG8uanNwIj48aW1nIHNyYz0iaW1hZ2VzL2V4ZWN1dGUuZ2lmIiBoc3BhY2U9NCBib3JkZXI9MCAgYWxpZ249dG9wPjwvYT48YSBocmVmPSJqc3AyL3NpbXBsZXRhZy9oZWxsby5qc3AiPkV4ZWN1dGU8L2E+PC90ZD4KKworPHRkIHdpZHRoPSIzMCUiPjxhIGhyZWY9ImpzcDIvc2ltcGxldGFnL2hlbGxvLmh0bWwiPjxpbWcgU1JDPSJpbWFnZXMvY29kZS5naWYiIEhTUEFDRT00IEJPUkRFUj0wIGhlaWdodD0yNCB3aWR0aD0yNCBhbGlnbj1UT1A+PC9hPjxhIGhyZWY9ImpzcDIvc2ltcGxldGFnL2hlbGxvLmh0bWwiPlNvdXJjZTwvYT48L3RkPgorPC90cj4KKworPHRyIHZhbGlnbj1UT1A+Cis8dGQ+UmVwZWF0IFRhZzwvdGQ+Cis8dGQgdmFsaWduPVRPUCB3aWR0aD0iMzAlIj48YSBocmVmPSJqc3AyL3NpbXBsZXRhZy9yZXBlYXQuanNwIj48aW1nIHNyYz0iaW1hZ2VzL2V4ZWN1dGUuZ2lmIiBoc3BhY2U9NCBib3JkZXI9MCAgYWxpZ249dG9wPjwvYT48YSBocmVmPSJqc3AyL3NpbXBsZXRhZy9yZXBlYXQuanNwIj5FeGVjdXRlPC9hPjwvdGQ+CisKKzx0ZCB3aWR0aD0iMzAlIj48YSBocmVmPSJqc3AyL3NpbXBsZXRhZy9yZXBlYXQuaHRtbCI+PGltZyBTUkM9ImltYWdlcy9jb2RlLmdpZiIgSFNQQUNFPTQgQk9SREVSPTAgaGVpZ2h0PTI0IHdpZHRoPTI0IGFsaWduPVRPUD48L2E+PGEgaHJlZj0ianNwMi9zaW1wbGV0YWcvcmVwZWF0Lmh0bWwiPlNvdXJjZTwvYT48L3RkPgorPC90cj4KKworPHRyIHZhbGlnbj1UT1A+Cis8dGQ+Qm9vayBFeGFtcGxlPC90ZD4KKzx0ZCB2YWxpZ249VE9QIHdpZHRoPSIzMCUiPjxhIGhyZWY9ImpzcDIvc2ltcGxldGFnL2Jvb2suanNwIj48aW1nIHNyYz0iaW1hZ2VzL2V4ZWN1dGUuZ2lmIiBoc3BhY2U9NCBib3JkZXI9MCAgYWxpZ249dG9wPjwvYT48YSBocmVmPSJqc3AyL3NpbXBsZXRhZy9ib29rLmpzcCI+RXhlY3V0ZTwvYT48L3RkPgorCis8dGQgd2lkdGg9IjMwJSI+PGEgaHJlZj0ianNwMi9zaW1wbGV0YWcvYm9vay5odG1sIj48aW1nIFNSQz0iaW1hZ2VzL2NvZGUuZ2lmIiBIU1BBQ0U9NCBCT1JERVI9MCBoZWlnaHQ9MjQgd2lkdGg9MjQgYWxpZ249VE9QPjwvYT48YSBocmVmPSJqc3AyL3NpbXBsZXRhZy9ib29rLmh0bWwiPlNvdXJjZTwvYT48L3RkPgorPC90cj4KKworPHRyIHZhbGlnbj1UT1A+Cis8dGQ+PGJyPjxiPlRhZyBGaWxlczwvYj48L3RkPgorPC90cj4KKworPHRyIHZhbGlnbj1UT1A+Cis8dGQ+SGVsbG8gV29ybGQgVGFnIEZpbGU8L3RkPgorPHRkIHZhbGlnbj1UT1Agd2lkdGg9IjMwJSI+PGEgaHJlZj0ianNwMi90YWdmaWxlcy9oZWxsby5qc3AiPjxpbWcgc3JjPSJpbWFnZXMvZXhlY3V0ZS5naWYiIGhzcGFjZT00IGJvcmRlcj0wICBhbGlnbj10b3A+PC9hPjxhIGhyZWY9ImpzcDIvdGFnZmlsZXMvaGVsbG8uanNwIj5FeGVjdXRlPC9hPjwvdGQ+CisKKzx0ZCB3aWR0aD0iMzAlIj48YSBocmVmPSJqc3AyL3RhZ2ZpbGVzL2hlbGxvLmh0bWwiPjxpbWcgU1JDPSJpbWFnZXMvY29kZS5naWYiIEhTUEFDRT00IEJPUkRFUj0wIGhlaWdodD0yNCB3aWR0aD0yNCBhbGlnbj1UT1A+PC9hPjxhIGhyZWY9ImpzcDIvdGFnZmlsZXMvaGVsbG8uaHRtbCI+U291cmNlPC9hPjwvdGQ+Cis8L3RyPgorCis8dHIgdmFsaWduPVRPUD4KKzx0ZD5QYW5lbCBUYWcgRmlsZTwvdGQ+Cis8dGQgdmFsaWduPVRPUCB3aWR0aD0iMzAlIj48YSBocmVmPSJqc3AyL3RhZ2ZpbGVzL3BhbmVsLmpzcCI+PGltZyBzcmM9ImltYWdlcy9leGVjdXRlLmdpZiIgaHNwYWNlPTQgYm9yZGVyPTAgIGFsaWduPXRvcD48L2E+PGEgaHJlZj0ianNwMi90YWdmaWxlcy9wYW5lbC5qc3AiPkV4ZWN1dGU8L2E+PC90ZD4KKworPHRkIHdpZHRoPSIzMCUiPjxhIGhyZWY9ImpzcDIvdGFnZmlsZXMvcGFuZWwuaHRtbCI+PGltZyBTUkM9ImltYWdlcy9jb2RlLmdpZiIgSFNQQUNFPTQgQk9SREVSPTAgaGVpZ2h0PTI0IHdpZHRoPTI0IGFsaWduPVRPUD48L2E+PGEgaHJlZj0ianNwMi90YWdmaWxlcy9wYW5lbC5odG1sIj5Tb3VyY2U8L2E+PC90ZD4KKzwvdHI+CisKKzx0ciB2YWxpZ249VE9QPgorPHRkPkRpc3BsYXkgUHJvZHVjdHMgRXhhbXBsZTwvdGQ+Cis8dGQgdmFsaWduPVRPUCB3aWR0aD0iMzAlIj48YSBocmVmPSJqc3AyL3RhZ2ZpbGVzL3Byb2R1Y3RzLmpzcCI+PGltZyBzcmM9ImltYWdlcy9leGVjdXRlLmdpZiIgaHNwYWNlPTQgYm9yZGVyPTAgIGFsaWduPXRvcD48L2E+PGEgaHJlZj0ianNwMi90YWdmaWxlcy9wcm9kdWN0cy5qc3AiPkV4ZWN1dGU8L2E+PC90ZD4KKworPHRkIHdpZHRoPSIzMCUiPjxhIGhyZWY9ImpzcDIvdGFnZmlsZXMvcHJvZHVjdHMuaHRtbCI+PGltZyBTUkM9ImltYWdlcy9jb2RlLmdpZiIgSFNQQUNFPTQgQk9SREVSPTAgaGVpZ2h0PTI0IHdpZHRoPTI0IGFsaWduPVRPUD48L2E+PGEgaHJlZj0ianNwMi90YWdmaWxlcy9wcm9kdWN0cy5odG1sIj5Tb3VyY2U8L2E+PC90ZD4KKzwvdHI+CisKKzx0ciB2YWxpZ249VE9QPgorPHRkPjxicj48Yj5OZXcgSlNQIFhNTCBTeW50YXggKC5qc3B4KTwvYj48L3RkPgorPC90cj4KKworPHRyIHZhbGlnbj1UT1A+Cis8dGQ+WEhUTUwgQmFzaWMgRXhhbXBsZTwvdGQ+Cis8dGQgdmFsaWduPVRPUCB3aWR0aD0iMzAlIj48YSBocmVmPSJqc3AyL2pzcHgvYmFzaWMuanNweCI+PGltZyBzcmM9ImltYWdlcy9leGVjdXRlLmdpZiIgaHNwYWNlPTQgYm9yZGVyPTAgIGFsaWduPXRvcD48L2E+PGEgaHJlZj0ianNwMi9qc3B4L2Jhc2ljLmpzcHgiPkV4ZWN1dGU8L2E+PC90ZD4KKworPHRkIHdpZHRoPSIzMCUiPjxhIGhyZWY9ImpzcDIvanNweC9iYXNpYy5odG1sIj48aW1nIFNSQz0iaW1hZ2VzL2NvZGUuZ2lmIiBIU1BBQ0U9NCBCT1JERVI9MCBoZWlnaHQ9MjQgd2lkdGg9MjQgYWxpZ249VE9QPjwvYT48YSBocmVmPSJqc3AyL2pzcHgvYmFzaWMuaHRtbCI+U291cmNlPC9hPjwvdGQ+Cis8L3RyPgorCis8dHIgdmFsaWduPVRPUD4KKzx0ZD5TVkcgKFNjYWxhYmxlIFZlY3RvciBHcmFwaGljcyk8L3RkPgorPHRkIHZhbGlnbj1UT1Agd2lkdGg9IjMwJSI+PGEgaHJlZj0ianNwMi9qc3B4L3N2Z2V4YW1wbGUuaHRtbCI+PGltZyBzcmM9ImltYWdlcy9leGVjdXRlLmdpZiIgaHNwYWNlPTQgYm9yZGVyPTAgIGFsaWduPXRvcD48L2E+PGEgaHJlZj0ianNwMi9qc3B4L3N2Z2V4YW1wbGUuaHRtbCI+RXhlY3V0ZTwvYT48L3RkPgorCis8dGQgd2lkdGg9IjMwJSI+PGEgaHJlZj0ianNwMi9qc3B4L3RleHRSb3RhdGUuaHRtbCI+PGltZyBTUkM9ImltYWdlcy9jb2RlLmdpZiIgSFNQQUNFPTQgQk9SREVSPTAgaGVpZ2h0PTI0IHdpZHRoPTI0IGFsaWduPVRPUD48L2E+PGEgaHJlZj0ianNwMi9qc3B4L3RleHRSb3RhdGUuaHRtbCI+U291cmNlPC9hPjwvdGQ+Cis8L3RyPgorCis8dHIgdmFsaWduPVRPUD4KKzx0ZD48YnI+PGI+T3RoZXIgSlNQIDIuMCBGZWF0dXJlczwvYj48L3RkPgorPC90cj4KKworPHRyIHZhbGlnbj1UT1A+Cis8dGQ+Jmx0O2pzcDphdHRyaWJ1dGUmZ3Q7IGFuZCAmbHQ7anNwOmJvZHkmZ3Q7PC90ZD4KKzx0ZCB2YWxpZ249VE9QIHdpZHRoPSIzMCUiPjxhIGhyZWY9ImpzcDIvanNwYXR0cmlidXRlL2pzcGF0dHJpYnV0ZS5qc3AiPjxpbWcgc3JjPSJpbWFnZXMvZXhlY3V0ZS5naWYiIGhzcGFjZT00IGJvcmRlcj0wICBhbGlnbj10b3A+PC9hPjxhIGhyZWY9ImpzcDIvanNwYXR0cmlidXRlL2pzcGF0dHJpYnV0ZS5qc3AiPkV4ZWN1dGU8L2E+PC90ZD4KKworPHRkIHdpZHRoPSIzMCUiPjxhIGhyZWY9ImpzcDIvanNwYXR0cmlidXRlL2pzcGF0dHJpYnV0ZS5odG1sIj48aW1nIFNSQz0iaW1hZ2VzL2NvZGUuZ2lmIiBIU1BBQ0U9NCBCT1JERVI9MCBoZWlnaHQ9MjQgd2lkdGg9MjQgYWxpZ249VE9QPjwvYT48YSBocmVmPSJqc3AyL2pzcGF0dHJpYnV0ZS9qc3BhdHRyaWJ1dGUuaHRtbCI+U291cmNlPC9hPjwvdGQ+Cis8L3RyPgorCis8dHIgdmFsaWduPVRPUD4KKzx0ZD5TaHVmZmxlIEV4YW1wbGU8L3RkPgorPHRkIHZhbGlnbj1UT1Agd2lkdGg9IjMwJSI+PGEgaHJlZj0ianNwMi9qc3BhdHRyaWJ1dGUvc2h1ZmZsZS5qc3AiPjxpbWcgc3JjPSJpbWFnZXMvZXhlY3V0ZS5naWYiIGhzcGFjZT00IGJvcmRlcj0wICBhbGlnbj10b3A+PC9hPjxhIGhyZWY9ImpzcDIvanNwYXR0cmlidXRlL3NodWZmbGUuanNwIj5FeGVjdXRlPC9hPjwvdGQ+CisKKzx0ZCB3aWR0aD0iMzAlIj48YSBocmVmPSJqc3AyL2pzcGF0dHJpYnV0ZS9zaHVmZmxlLmh0bWwiPjxpbWcgU1JDPSJpbWFnZXMvY29kZS5naWYiIEhTUEFDRT00IEJPUkRFUj0wIGhlaWdodD0yNCB3aWR0aD0yNCBhbGlnbj1UT1A+PC9hPjxhIGhyZWY9ImpzcDIvanNwYXR0cmlidXRlL3NodWZmbGUuaHRtbCI+U291cmNlPC9hPjwvdGQ+Cis8L3RyPgorCis8dHIgdmFsaWduPVRPUD4KKzx0ZD5BdHRyaWJ1dGVzIFdpdGggRHluYW1pYyBOYW1lczwvdGQ+Cis8dGQgdmFsaWduPVRPUCB3aWR0aD0iMzAlIj48YSBocmVmPSJqc3AyL21pc2MvZHluYW1pY2F0dHJzLmpzcCI+PGltZyBzcmM9ImltYWdlcy9leGVjdXRlLmdpZiIgaHNwYWNlPTQgYm9yZGVyPTAgIGFsaWduPXRvcD48L2E+PGEgaHJlZj0ianNwMi9taXNjL2R5bmFtaWNhdHRycy5qc3AiPkV4ZWN1dGU8L2E+PC90ZD4KKworPHRkIHdpZHRoPSIzMCUiPjxhIGhyZWY9ImpzcDIvbWlzYy9keW5hbWljYXR0cnMuaHRtbCI+PGltZyBTUkM9ImltYWdlcy9jb2RlLmdpZiIgSFNQQUNFPTQgQk9SREVSPTAgaGVpZ2h0PTI0IHdpZHRoPTI0IGFsaWduPVRPUD48L2E+PGEgaHJlZj0ianNwMi9taXNjL2R5bmFtaWNhdHRycy5odG1sIj5Tb3VyY2U8L2E+PC90ZD4KKzwvdHI+CisKKzx0ciB2YWxpZ249VE9QPgorPHRkPkpTUCBDb25maWd1cmF0aW9uPC90ZD4KKzx0ZCB2YWxpZ249VE9QIHdpZHRoPSIzMCUiPjxhIGhyZWY9ImpzcDIvbWlzYy9jb25maWcuanNwIj48aW1nIHNyYz0iaW1hZ2VzL2V4ZWN1dGUuZ2lmIiBoc3BhY2U9NCBib3JkZXI9MCAgYWxpZ249dG9wPjwvYT48YSBocmVmPSJqc3AyL21pc2MvY29uZmlnLmpzcCI+RXhlY3V0ZTwvYT48L3RkPgorCis8dGQgd2lkdGg9IjMwJSI+PGEgaHJlZj0ianNwMi9taXNjL2NvbmZpZy5odG1sIj48aW1nIFNSQz0iaW1hZ2VzL2NvZGUuZ2lmIiBIU1BBQ0U9NCBCT1JERVI9MCBoZWlnaHQ9MjQgd2lkdGg9MjQgYWxpZ249VE9QPjwvYT48YSBocmVmPSJqc3AyL21pc2MvY29uZmlnLmh0bWwiPlNvdXJjZTwvYT48L3RkPgorPC90cj4KKworPC90YWJsZT4KKworPGJyPgorPGI+PHU+PGZvbnQgc2l6ZT0iKzEiPkpTUCAxLjIgRXhhbXBsZXM8L2ZvbnQ+PC91PjwvYj48YnI+Cis8dGFibGUgQk9SREVSPTAgQ0VMTFNQQUNJTkc9NSBXSURUSD0iODUlIiA+Cis8dHIgVkFMSUdOPVRPUD4KKzx0ZD5OdW1iZXJndWVzcyZuYnNwOzwvdGQ+CisKKzx0ZCBWQUxJR049VE9QIFdJRFRIPSIzMCUiPjxhIGhyZWY9Im51bS9udW1ndWVzcy5qc3AiPjxpbWcgU1JDPSJpbWFnZXMvZXhlY3V0ZS5naWYiIEhTUEFDRT00IEJPUkRFUj0wICBhbGlnbj1UT1A+PC9hPjxhIGhyZWY9Im51bS9udW1ndWVzcy5qc3AiPkV4ZWN1dGU8L2E+PC90ZD4KKworPHRkIFdJRFRIPSIzMCUiPjxhIGhyZWY9Im51bS9udW1ndWVzcy5odG1sIj48aW1nIFNSQz0iaW1hZ2VzL2NvZGUuZ2lmIiBIU1BBQ0U9NCBCT1JERVI9MCBoZWlnaHQ9MjQgd2lkdGg9MjQgYWxpZ249VE9QPjwvYT48YSBocmVmPSJudW0vbnVtZ3Vlc3MuaHRtbCI+U291cmNlPC9hPjwvdGQ+Cis8L3RyPgorCis8dHIgVkFMSUdOPVRPUD4KKzx0ZD5EYXRlJm5ic3A7PC90ZD4KKworPHRkIFZBTElHTj1UT1AgV0lEVEg9IjMwJSI+PGEgaHJlZj0iZGF0ZXMvZGF0ZS5qc3AiPjxpbWcgU1JDPSJpbWFnZXMvZXhlY3V0ZS5naWYiIEhTUEFDRT00IEJPUkRFUj0wICBhbGlnbj1UT1A+PC9hPjxhIGhyZWY9ImRhdGVzL2RhdGUuanNwIj5FeGVjdXRlPC9hPjwvdGQ+CisKKzx0ZCBXSURUSD0iMzAlIj48YSBocmVmPSJkYXRlcy9kYXRlLmh0bWwiPjxpbWcgU1JDPSJpbWFnZXMvY29kZS5naWYiIEhTUEFDRT00IEJPUkRFUj0wIGhlaWdodD0yNCB3aWR0aD0yNCBhbGlnbj1UT1A+PC9hPjxhIGhyZWY9ImRhdGVzL2RhdGUuaHRtbCI+U291cmNlPC9hPjwvdGQ+Cis8L3RyPgorCis8dHIgVkFMSUdOPVRPUD4KKzx0ZD5Tbm9vcDwvdGQ+CisKKzx0ZCBXSURUSD0iMzAlIj48YSBocmVmPSJzbnAvc25vb3AuanNwIj48aW1nIFNSQz0iaW1hZ2VzL2V4ZWN1dGUuZ2lmIiBIU1BBQ0U9NCBCT1JERVI9MCAgYWxpZ249VE9QPjwvYT48YSBocmVmPSJzbnAvc25vb3AuanNwIj5FeGVjdXRlPC9hPjwvdGQ+CisKKzx0ZCBXSURUSD0iMzAlIj48YSBocmVmPSJzbnAvc25vb3AuaHRtbCI+PGltZyBTUkM9ImltYWdlcy9jb2RlLmdpZiIgSFNQQUNFPTQgQk9SREVSPTAgaGVpZ2h0PTI0IHdpZHRoPTI0IGFsaWduPVRPUD48L2E+PGEgaHJlZj0ic25wL3Nub29wLmh0bWwiPlNvdXJjZTwvYT48L3RkPgorPC90cj4KKworPHRyIFZBTElHTj1UT1A+Cis8dGQ+RXJyb3JQYWdlJm5ic3A7PC90ZD4KKworPHRkIFdJRFRIPSIzMCUiPjxhIGhyZWY9ImVycm9yL2Vycm9yLmh0bWwiPjxpbWcgU1JDPSJpbWFnZXMvZXhlY3V0ZS5naWYiIEhTUEFDRT00IEJPUkRFUj0wICBhbGlnbj1UT1A+PC9hPjxhIGhyZWY9ImVycm9yL2Vycm9yLmh0bWwiPkV4ZWN1dGU8L2E+PC90ZD4KKworPHRkIFdJRFRIPSIzMCUiPjxhIGhyZWY9ImVycm9yL2VyLmh0bWwiPjxpbWcgU1JDPSJpbWFnZXMvY29kZS5naWYiIEhTUEFDRT00IEJPUkRFUj0wIGhlaWdodD0yNCB3aWR0aD0yNCBhbGlnbj1UT1A+PC9hPjxhIGhyZWY9ImVycm9yL2VyLmh0bWwiPlNvdXJjZTwvYT48L3RkPgorPC90cj4KKworPHRyIFZBTElHTj1UT1A+Cis8dGQ+Q2FydHMmbmJzcDs8L3RkPgorCis8dGQgVkFMSUdOPVRPUCBXSURUSD0iMzAlIj48YSBocmVmPSJzZXNzaW9ucy9jYXJ0cy5odG1sIj48aW1nIFNSQz0iaW1hZ2VzL2V4ZWN1dGUuZ2lmIiBIU1BBQ0U9NCBCT1JERVI9MCAgYWxpZ249VE9QPjwvYT48YSBocmVmPSJzZXNzaW9ucy9jYXJ0cy5odG1sIj5FeGVjdXRlPC9hPjwvdGQ+CisKKzx0ZCBXSURUSD0iMzAlIj48YSBocmVmPSJzZXNzaW9ucy9jcnQuaHRtbCI+PGltZyBTUkM9ImltYWdlcy9jb2RlLmdpZiIgSFNQQUNFPTQgQk9SREVSPTAgaGVpZ2h0PTI0IHdpZHRoPTI0IGFsaWduPVRPUD48L2E+PGEgaHJlZj0ic2Vzc2lvbnMvY3J0Lmh0bWwiPlNvdXJjZTwvYT48L3RkPgorPC90cj4KKworPHRyIFZBTElHTj1UT1A+Cis8dGQ+Q2hlY2tib3gmbmJzcDs8L3RkPgorCis8dGQgVkFMSUdOPVRPUCBXSURUSD0iMzAlIj48YSBocmVmPSJjaGVja2JveC9jaGVjay5odG1sIj48aW1nIFNSQz0iaW1hZ2VzL2V4ZWN1dGUuZ2lmIiBIU1BBQ0U9NCBCT1JERVI9MCAgYWxpZ249VE9QPjwvYT48YSBocmVmPSJjaGVja2JveC9jaGVjay5odG1sIj5FeGVjdXRlPC9hPjwvdGQ+CisKKzx0ZCBXSURUSD0iMzAlIj48YSBocmVmPSJjaGVja2JveC9jcmVzdWx0Lmh0bWwiPjxpbWcgU1JDPSJpbWFnZXMvY29kZS5naWYiIEhTUEFDRT00IEJPUkRFUj0wIGhlaWdodD0yNCB3aWR0aD0yNCBhbGlnbj1UT1A+PC9hPjxhIGhyZWY9ImNoZWNrYm94L2NyZXN1bHQuaHRtbCI+U291cmNlPC9hPjwvdGQ+Cis8L3RyPgorCis8dHIgVkFMSUdOPVRPUD4KKzx0ZD5Db2xvciZuYnNwOzwvdGQ+CisKKzx0ZCBWQUxJR049VE9QIFdJRFRIPSIzMCUiPjxhIGhyZWY9ImNvbG9ycy9jb2xvcnMuaHRtbCI+PGltZyBTUkM9ImltYWdlcy9leGVjdXRlLmdpZiIgSFNQQUNFPTQgQk9SREVSPTAgIGFsaWduPVRPUD48L2E+PGEgaHJlZj0iY29sb3JzL2NvbG9ycy5odG1sIj5FeGVjdXRlPC9hPjwvdGQ+CisKKzx0ZCBXSURUSD0iMzAlIj48YSBocmVmPSJjb2xvcnMvY2xyLmh0bWwuaHRtbCI+PGltZyBTUkM9ImltYWdlcy9jb2RlLmdpZiIgSFNQQUNFPTQgQk9SREVSPTAgaGVpZ2h0PTI0IHdpZHRoPTI0IGFsaWduPVRPUD48L2E+PGEgaHJlZj0iY29sb3JzL2Nsci5odG1sIj5Tb3VyY2U8L2E+PC90ZD4KKzwvdHI+CisKKzx0ciBWQUxJR049VE9QPgorPHRkPkNhbGVuZGFyJm5ic3A7PC90ZD4KKworPHRkIFdJRFRIPSIzMCUiPjxhIGhyZWY9ImNhbC9sb2dpbi5odG1sIj48aW1nIFNSQz0iaW1hZ2VzL2V4ZWN1dGUuZ2lmIiBIU1BBQ0U9NCBCT1JERVI9MCAgYWxpZ249VE9QPjwvYT48YSBocmVmPSJjYWwvbG9naW4uaHRtbCI+RXhlY3V0ZTwvYT48L3RkPgorCis8dGQgV0lEVEg9IjMwJSI+PGEgaHJlZj0iY2FsL2NhbGVuZGFyLmh0bWwiPjxpbWcgU1JDPSJpbWFnZXMvY29kZS5naWYiIEhTUEFDRT00IEJPUkRFUj0wIGhlaWdodD0yNCB3aWR0aD0yNCBhbGlnbj1UT1A+PC9hPjxhIGhyZWY9ImNhbC9jYWxlbmRhci5odG1sIj5Tb3VyY2U8L2E+PC90ZD4KKzwvdHI+CisKKzx0ciBWQUxJR049VE9QPgorPHRkPkluY2x1ZGUmbmJzcDs8L3RkPgorCis8dGQgVkFMSUdOPVRPUCBXSURUSD0iMzAlIj48YSBocmVmPSIvaW5jbHVkZS9pbmNsdWRlLmpzcCI+PGltZyBTUkM9ImltYWdlcy9leGVjdXRlLmdpZiIgSFNQQUNFPTQgQk9SREVSPTAgIGFsaWduPVRPUD48L2E+PGEgaHJlZj0iaW5jbHVkZS9pbmNsdWRlLmpzcCI+RXhlY3V0ZTwvYT48L3RkPgorCis8dGQgV0lEVEg9IjMwJSI+PGEgaHJlZj0iaW5jbHVkZS9pbmMuaHRtbCI+PGltZyBTUkM9ImltYWdlcy9jb2RlLmdpZiIgSFNQQUNFPTQgQk9SREVSPTAgaGVpZ2h0PTI0IHdpZHRoPTI0IGFsaWduPVRPUD48L2E+PGEgaHJlZj0iaW5jbHVkZS9pbmMuaHRtbCI+U291cmNlPC9hPjwvdGQ+Cis8L3RyPgorCis8dHIgVkFMSUdOPVRPUD4KKzx0ZD5Gb3J3YXJkJm5ic3A7PC90ZD4KKworPHRkIFZBTElHTj1UT1AgV0lEVEg9IjMwJSI+PGEgaHJlZj0iZm9yd2FyZC9mb3J3YXJkLmpzcCI+PGltZyBTUkM9ImltYWdlcy9leGVjdXRlLmdpZiIgSFNQQUNFPTQgQk9SREVSPTAgIGFsaWduPVRPUD48L2E+PGEgaHJlZj0iZm9yd2FyZC9mb3J3YXJkLmpzcCI+RXhlY3V0ZTwvYT48L3RkPgorCis8dGQgV0lEVEg9IjMwJSI+PGEgaHJlZj0iZm9yd2FyZC9md2QuaHRtbCI+PGltZyBTUkM9ImltYWdlcy9jb2RlLmdpZiIgSFNQQUNFPTQgQk9SREVSPTAgaGVpZ2h0PTI0IHdpZHRoPTI0IGFsaWduPVRPUD48L2E+PGEgaHJlZj0iZm9yd2FyZC9md2QuaHRtbCI+U291cmNlPC9hPjwvdGQ+Cis8L3RyPgorCis8dHIgVkFMSUdOPVRPUD4KKzx0ZD5QbHVnaW4mbmJzcDs8L3RkPgorCis8dGQgVkFMSUdOPVRPUCBXSURUSD0iMzAlIj48YSBocmVmPSJwbHVnaW4vcGx1Z2luLmpzcCI+PGltZyBTUkM9ImltYWdlcy9leGVjdXRlLmdpZiIgSFNQQUNFPTQgQk9SREVSPTAgIGFsaWduPVRPUD48L2E+PGEgaHJlZj0icGx1Z2luL3BsdWdpbi5qc3AiPkV4ZWN1dGU8L2E+PC90ZD4KKworPHRkIFdJRFRIPSIzMCUiPjxhIGhyZWY9InBsdWdpbi9wbHVnaW4uaHRtbCI+PGltZyBTUkM9ImltYWdlcy9jb2RlLmdpZiIgSFNQQUNFPTQgQk9SREVSPTAgaGVpZ2h0PTI0IHdpZHRoPTI0IGFsaWduPVRPUD48L2E+PGEgaHJlZj0icGx1Z2luL3BsdWdpbi5odG1sIj5Tb3VyY2U8L2E+PC90ZD4KKzwvdHI+CisKKzx0ciBWQUxJR049VE9QPgorPHRkPkpTUC1TZXJ2bGV0LUpTUCZuYnNwOzwvdGQ+CisKKzx0ZCBWQUxJR049VE9QIFdJRFRIPSIzMCUiPjxhIGhyZWY9ImpzcHRvc2Vydi9qc3B0b3NlcnZsZXQuanNwIj48aW1nIFNSQz0iaW1hZ2VzL2V4ZWN1dGUuZ2lmIiBIU1BBQ0U9NCBCT1JERVI9MCAgYWxpZ249VE9QPjwvYT48YSBocmVmPSJqc3B0b3NlcnYvanNwdG9zZXJ2bGV0LmpzcCI+RXhlY3V0ZTwvYT48L3RkPgorCis8dGQgV0lEVEg9IjMwJSI+PGEgaHJlZj0ianNwdG9zZXJ2L2p0cy5odG1sIj48aW1nIFNSQz0iaW1hZ2VzL2NvZGUuZ2lmIiBIU1BBQ0U9NCBCT1JERVI9MCBoZWlnaHQ9MjQgd2lkdGg9MjQgYWxpZ249VE9QPjwvYT48YSBocmVmPSJqc3B0b3NlcnYvanRzLmh0bWwiPlNvdXJjZTwvYT48L3RkPgorPC90cj4KKworPHRyIFZBTElHTj1UT1A+Cis8dGQ+Q3VzdG9tIHRhZyBleGFtcGxlPC90ZD4KKworPHRkIFZBTElHTj1UT1AgV0lEVEg9IjMwJSI+PGEgaHJlZj0ic2ltcGxldGFnL2Zvby5qc3AiPjxpbWcgU1JDPSJpbWFnZXMvZXhlY3V0ZS5naWYiIEhTUEFDRT00IEJPUkRFUj0wICBhbGlnbj1UT1A+PC9hPjxhIGhyZWY9InNpbXBsZXRhZy9mb28uanNwIj5FeGVjdXRlPC9hPjwvdGQ+CisKKzx0ZCBXSURUSD0iMzAlIj48YSBocmVmPSJzaW1wbGV0YWcvZm9vLmh0bWwiPjxpbWcgU1JDPSJpbWFnZXMvY29kZS5naWYiIEhTUEFDRT00IEJPUkRFUj0wIGhlaWdodD0yNCB3aWR0aD0yNCBhbGlnbj1UT1A+PC9hPjxhIGhyZWY9InNpbXBsZXRhZy9mb28uaHRtbCI+U291cmNlPC9hPjwvdGQ+Cis8L3RyPgorCis8dHIgdmFsaWduPVRPUD4KKzx0ZD5YTUwgc3ludGF4IGV4YW1wbGU8L3RkPgorPHRkIHZhbGlnbj1UT1Agd2lkdGg9IjMwJSI+PGEgaHJlZj0ieG1sL3htbC5qc3AiPjxpbWcgc3JjPSJpbWFnZXMvZXhlY3V0ZS5naWYiIGhzcGFjZT00IGJvcmRlcj0wICBhbGlnbj10b3A+PC9hPjxhIGhyZWY9InhtbC94bWwuanNwIj5FeGVjdXRlPC9hPjwvdGQ+CisKKzx0ZCB3aWR0aD0iMzAlIj48YSBocmVmPSJ4bWwveG1sLmh0bWwiPjxpbWcgU1JDPSJpbWFnZXMvY29kZS5naWYiIEhTUEFDRT00IEJPUkRFUj0wIGhlaWdodD0yNCB3aWR0aD0yNCBhbGlnbj1UT1A+PC9hPjxhIGhyZWY9InhtbC94bWwuaHRtbCI+U291cmNlPC9hPjwvdGQ+Cis8L3RyPgorCis8L3RhYmxlPgorCis8YnIvPgorPGI+PHU+PGZvbnQgc2l6ZT0iKzEiPlRhZyBQbHVnaW5zPC9mb250PjwvdT48L2I+PGJyPgorPHRhYmxlIEJPUkRFUj0wIENFTExTUEFDSU5HPTUgV0lEVEg9Ijg1JSIgPgorCis8dHIgVkFMSUdOPVRPUD4KKyAgPHRkPklmJm5ic3A7PC90ZD4KKyAgPHRkIFZBTElHTj1UT1AgV0lEVEg9IjMwJSI+CisgICAgPGEgaHJlZj0idGFncGx1Z2luL2lmLmpzcCI+PGltZyBTUkM9ImltYWdlcy9leGVjdXRlLmdpZiIgSFNQQUNFPTQgQk9SREVSPTAgIAorYWxpZ249VE9QPjwvYT4KKyAgICA8YSBocmVmPSJ0YWdwbHVnaW4vaWYuanNwIj5FeGVjdXRlPC9hPgorICA8L3RkPgorICA8dGQgV0lEVEg9IjMwJSI+CisgICAgPGEgaHJlZj0idGFncGx1Z2luL2lmLmh0bWwiPjxpbWcgU1JDPSJpbWFnZXMvY29kZS5naWYiIEhTUEFDRT00IEJPUkRFUj0wIGhlaQorZ2h0PTI0IHdpZHRoPTI0IGFsaWduPVRPUD48L2E+CisgICAgPGEgaHJlZj0idGFncGx1Z2luL2lmLmh0bWwiPlNvdXJjZTwvYT4KKyAgPC90ZD4KKzwvdHI+CisKKzx0ciBWQUxJR049VE9QPgorICA8dGQ+Rm9yRWFjaCZuYnNwOzwvdGQ+CisgIDx0ZCBWQUxJR049VE9QIFdJRFRIPSIzMCUiPgorICAgIDxhIGhyZWY9InRhZ3BsdWdpbi9mb3JlYWNoLmpzcCI+PGltZyBTUkM9ImltYWdlcy9leGVjdXRlLmdpZiIgSFNQQUNFPTQgQk9SREVSPTAgIAorYWxpZ249VE9QPjwvYT4KKyAgICA8YSBocmVmPSJ0YWdwbHVnaW4vZm9yZWFjaC5qc3AiPkV4ZWN1dGU8L2E+CisgIDwvdGQ+CisgIDx0ZCBXSURUSD0iMzAlIj4KKyAgICA8YSBocmVmPSJ0YWdwbHVnaW4vZm9yZWFjaC5odG1sIj48aW1nIFNSQz0iaW1hZ2VzL2NvZGUuZ2lmIiBIU1BBQ0U9NCBCT1JERVI9MCBoZWkKK2dodD0yNCB3aWR0aD0yNCBhbGlnbj1UT1A+PC9hPgorICAgIDxhIGhyZWY9InRhZ3BsdWdpbi9mb3JlYWNoLmh0bWwiPlNvdXJjZTwvYT4KKyAgPC90ZD4KKzwvdHI+CisKKzx0ciBWQUxJR049VE9QPgorICA8dGQ+Q2hvb3NlJm5ic3A7PC90ZD4KKyAgPHRkIFZBTElHTj1UT1AgV0lEVEg9IjMwJSI+CisgICAgPGEgaHJlZj0idGFncGx1Z2luL2Nob29zZS5qc3AiPjxpbWcgU1JDPSJpbWFnZXMvZXhlY3V0ZS5naWYiIEhTUEFDRT00IEJPUkRFUj0wICBhbGlnbj1UT1A+PC9hPgorICAgIDxhIGhyZWY9InRhZ3BsdWdpbi9jaG9vc2UuanNwIj5FeGVjdXRlPC9hPgorICA8L3RkPgorICA8dGQgV0lEVEg9IjMwJSI+CisgICAgPGEgaHJlZj0idGFncGx1Z2luL2Nob29zZS5odG1sIj48aW1nIFNSQz0iaW1hZ2VzL2NvZGUuZ2lmIiBIU1BBQ0U9NCBCT1JERVI9MCBoZWlnaHQ9MjQgd2lkdGg9MjQgYWxpZ249VE9QPjwvYT4KKyAgICA8YSBocmVmPSJ0YWdwbHVnaW4vY2hvb3NlLmh0bWwiPlNvdXJjZTwvYT4KKyAgPC90ZD4KKzwvdHI+CisKKzwvdGFibGU+CisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcDIvZWwvYmFzaWMtYXJpdGhtZXRpYy5odG1sIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvanNwMi9lbC9iYXNpYy1hcml0aG1ldGljLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU5YzcxOQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcDIvZWwvYmFzaWMtYXJpdGhtZXRpYy5odG1sCkBAIC0wLDAgKzEsMjkgQEAKKzxodG1sPgorPCEtLQorICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGhlYWQ+Cis8dGl0bGU+VmlldyBTb3VyY2UgQ29kZTwvdGl0bGU+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKzwvaGVhZD4KKworPGJvZHkgYmdjb2xvcj0iI0ZGRkZGRiI+Cis8cD48Zm9udCBjb2xvcj0iIzAwMDBGRiI+PGEgaHJlZj0iYmFzaWMtYXJpdGhtZXRpYy5qc3AiPjxpbWcgc3JjPSIuLi8uLi9pbWFnZXMvZXhlY3V0ZS5naWYiIGFsaWduPSJyaWdodCIgYm9yZGVyPSIwIj48L2E+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+PGltZyBzcmM9Ii4uLy4uL2ltYWdlcy9yZXR1cm4uZ2lmIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGFsaWduPSJyaWdodCIgYm9yZGVyPSIwIj48L2E+PC9mb250PjwvcD4KKworPGgzPjxhIGhyZWY9ImJhc2ljLWFyaXRobWV0aWMuanNwLmh0bWwiPlNvdXJjZSBDb2RlIGZvciBCYXNpYyBBcml0aG1ldGljIEV4YW1wbGU8Zm9udCBjb2xvcj0iIzAwMDBGRiI+PC9hPgorICA8L2ZvbnQ+IDwvaDM+CisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcDIvZWwvYmFzaWMtYXJpdGhtZXRpYy5qc3AgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3AyL2VsL2Jhc2ljLWFyaXRobWV0aWMuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2ZmZiMTUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3AyL2VsL2Jhc2ljLWFyaXRobWV0aWMuanNwCkBAIC0wLDAgKzEsODcgQEAKKzwhLS0KKyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorICA8aGVhZD4KKyAgICA8dGl0bGU+SlNQIDIuMCBFeHByZXNzaW9uIExhbmd1YWdlIC0gQmFzaWMgQXJpdGhtZXRpYzwvdGl0bGU+CisgIDwvaGVhZD4KKyAgPGJvZHk+CisgICAgPGgxPkpTUCAyLjAgRXhwcmVzc2lvbiBMYW5ndWFnZSAtIEJhc2ljIEFyaXRobWV0aWM8L2gxPgorICAgIDxocj4KKyAgICBUaGlzIGV4YW1wbGUgaWxsdXN0cmF0ZXMgYmFzaWMgRXhwcmVzc2lvbiBMYW5ndWFnZSBhcml0aG1ldGljLgorICAgIEFkZGl0aW9uICgrKSwgc3VidHJhY3Rpb24gKC0pLCBtdWx0aXBsaWNhdGlvbiAoKiksIGRpdmlzaW9uICgvIG9yIGRpdiksIAorICAgIGFuZCBtb2R1bHVzICglIG9yIG1vZCkgYXJlIGFsbCBzdXBwb3J0ZWQuICBFcnJvciBjb25kaXRpb25zLCBsaWtlCisgICAgZGl2aXNpb24gYnkgemVybywgYXJlIGhhbmRsZWQgZ3JhY2VmdWxseS4KKyAgICA8YnI+CisgICAgPGJsb2NrcXVvdGU+CisgICAgICA8Y29kZT4KKyAgICAgICAgPHRhYmxlIGJvcmRlcj0iMSI+CisgICAgICAgICAgPHRoZWFkPgorCSAgICA8dGQ+PGI+RUwgRXhwcmVzc2lvbjwvYj48L3RkPgorCSAgICA8dGQ+PGI+UmVzdWx0PC9iPjwvdGQ+CisJICA8L3RoZWFkPgorCSAgPHRyPgorCSAgICA8dGQ+XCR7MX08L3RkPgorCSAgICA8dGQ+JHsxfTwvdGQ+CisJICA8L3RyPgorCSAgPHRyPgorCSAgICA8dGQ+XCR7MSArIDJ9PC90ZD4KKwkgICAgPHRkPiR7MSArIDJ9PC90ZD4KKwkgIDwvdHI+CisJICA8dHI+CisJICAgIDx0ZD5cJHsxLjIgKyAyLjN9PC90ZD4KKwkgICAgPHRkPiR7MS4yICsgMi4zfTwvdGQ+CisJICA8L3RyPgorCSAgPHRyPgorCSAgICA8dGQ+XCR7MS4yRTQgKyAxLjR9PC90ZD4KKwkgICAgPHRkPiR7MS4yRTQgKyAxLjR9PC90ZD4KKwkgIDwvdHI+CisJICA8dHI+CisJICAgIDx0ZD5cJHstNCAtIDJ9PC90ZD4KKwkgICAgPHRkPiR7LTQgLSAyfTwvdGQ+CisJICA8L3RyPgorCSAgPHRyPgorCSAgICA8dGQ+XCR7MjEgKiAyfTwvdGQ+CisJICAgIDx0ZD4kezIxICogMn08L3RkPgorCSAgPC90cj4KKwkgIDx0cj4KKwkgICAgPHRkPlwkezMvNH08L3RkPgorCSAgICA8dGQ+JHszLzR9PC90ZD4KKwkgIDwvdHI+CisJICA8dHI+CisJICAgIDx0ZD5cJHszIGRpdiA0fTwvdGQ+CisJICAgIDx0ZD4kezMgZGl2IDR9PC90ZD4KKwkgIDwvdHI+CisJICA8dHI+CisJICAgIDx0ZD5cJHszLzB9PC90ZD4KKwkgICAgPHRkPiR7My8wfTwvdGQ+CisJICA8L3RyPgorCSAgPHRyPgorCSAgICA8dGQ+XCR7MTAlNH08L3RkPgorCSAgICA8dGQ+JHsxMCU0fTwvdGQ+CisJICA8L3RyPgorCSAgPHRyPgorCSAgICA8dGQ+XCR7MTAgbW9kIDR9PC90ZD4KKwkgICAgPHRkPiR7MTAgbW9kIDR9PC90ZD4KKwkgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkPlwkeygxPT0yKSA/IDMgOiA0fTwvdGQ+CisgICAgICA8dGQ+JHsoMT09MikgPyAzIDogNH08L3RkPgorICAgIDwvdHI+CisJPC90YWJsZT4KKyAgICAgIDwvY29kZT4KKyAgICA8L2Jsb2NrcXVvdGU+CisgIDwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcDIvZWwvYmFzaWMtY29tcGFyaXNvbnMuaHRtbCBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcDIvZWwvYmFzaWMtY29tcGFyaXNvbnMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmNkMTc0Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvanNwMi9lbC9iYXNpYy1jb21wYXJpc29ucy5odG1sCkBAIC0wLDAgKzEsMjkgQEAKKzxodG1sPgorPCEtLQorICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGhlYWQ+Cis8dGl0bGU+VmlldyBTb3VyY2UgQ29kZTwvdGl0bGU+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKzwvaGVhZD4KKworPGJvZHkgYmdjb2xvcj0iI0ZGRkZGRiI+Cis8cD48Zm9udCBjb2xvcj0iIzAwMDBGRiI+PGEgaHJlZj0iYmFzaWMtY29tcGFyaXNvbnMuanNwIj48aW1nIHNyYz0iLi4vLi4vaW1hZ2VzL2V4ZWN1dGUuZ2lmIiBhbGlnbj0icmlnaHQiIGJvcmRlcj0iMCI+PC9hPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPjxpbWcgc3JjPSIuLi8uLi9pbWFnZXMvcmV0dXJuLmdpZiIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiBhbGlnbj0icmlnaHQiIGJvcmRlcj0iMCI+PC9hPjwvZm9udD48L3A+CisKKzxoMz48YSBocmVmPSJiYXNpYy1jb21wYXJpc29ucy5qc3AuaHRtbCI+U291cmNlIENvZGUgZm9yIEJhc2ljIENvbXBhcmlzb25zIEV4YW1wbGU8Zm9udCBjb2xvcj0iIzAwMDBGRiI+PC9hPgorICA8L2ZvbnQ+IDwvaDM+CisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcDIvZWwvYmFzaWMtY29tcGFyaXNvbnMuanNwIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvanNwMi9lbC9iYXNpYy1jb21wYXJpc29ucy5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU4NWRiYQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcDIvZWwvYmFzaWMtY29tcGFyaXNvbnMuanNwCkBAIC0wLDAgKzEsMTE1IEBACis8IS0tCisgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbD4KKyAgPGhlYWQ+CisgICAgPHRpdGxlPkpTUCAyLjAgRXhwcmVzc2lvbiBMYW5ndWFnZSAtIEJhc2ljIENvbXBhcmlzb25zPC90aXRsZT4KKyAgPC9oZWFkPgorICA8Ym9keT4KKyAgICA8aDE+SlNQIDIuMCBFeHByZXNzaW9uIExhbmd1YWdlIC0gQmFzaWMgQ29tcGFyaXNvbnM8L2gxPgorICAgIDxocj4KKyAgICBUaGlzIGV4YW1wbGUgaWxsdXN0cmF0ZXMgYmFzaWMgRXhwcmVzc2lvbiBMYW5ndWFnZSBjb21wYXJpc29ucy4KKyAgICBUaGUgZm9sbG93aW5nIGNvbXBhcmlzb24gb3BlcmF0b3JzIGFyZSBzdXBwb3J0ZWQ6CisgICAgPHVsPgorICAgICAgPGxpPkxlc3MtdGhhbiAoJmx0OyBvciBsdCk8L2xpPgorICAgICAgPGxpPkdyZWF0ZXItdGhhbiAoJmd0OyBvciBndCk8L2xpPgorICAgICAgPGxpPkxlc3MtdGhhbi1vci1lcXVhbCAoJmx0Oz0gb3IgbGUpPC9saT4KKyAgICAgIDxsaT5HcmVhdGVyLXRoYW4tb3ItZXF1YWwgKCZndDs9IG9yIGdlKTwvbGk+CisgICAgICA8bGk+RXF1YWwgKD09IG9yIGVxKTwvbGk+CisgICAgICA8bGk+Tm90IEVxdWFsICghPSBvciBuZSk8L2xpPgorICAgIDwvdWw+CisgICAgPGJsb2NrcXVvdGU+CisgICAgICA8dT48Yj5OdW1lcmljPC9iPjwvdT4KKyAgICAgIDxjb2RlPgorICAgICAgICA8dGFibGUgYm9yZGVyPSIxIj4KKyAgICAgICAgICA8dGhlYWQ+CisJICAgIDx0ZD48Yj5FTCBFeHByZXNzaW9uPC9iPjwvdGQ+CisJICAgIDx0ZD48Yj5SZXN1bHQ8L2I+PC90ZD4KKwkgIDwvdGhlYWQ+CisJICA8dHI+CisJICAgIDx0ZD5cJHsxICZsdDsgMn08L3RkPgorCSAgICA8dGQ+JHsxIDwgMn08L3RkPgorCSAgPC90cj4KKwkgIDx0cj4KKwkgICAgPHRkPlwkezEgbHQgMn08L3RkPgorCSAgICA8dGQ+JHsxIGx0IDJ9PC90ZD4KKwkgIDwvdHI+CisJICA8dHI+CisJICAgIDx0ZD5cJHsxICZndDsgKDQvMil9PC90ZD4KKwkgICAgPHRkPiR7MSA+ICg0LzIpfTwvdGQ+CisJICA8L3RyPgorCSAgPHRyPgorCSAgICA8dGQ+XCR7MSAmZ3Q7ICg0LzIpfTwvdGQ+CisJICAgIDx0ZD4kezEgPiAoNC8yKX08L3RkPgorCSAgPC90cj4KKwkgIDx0cj4KKwkgICAgPHRkPlwkezQuMCAmZ3Q7PSAzfTwvdGQ+CisJICAgIDx0ZD4kezQuMCA+PSAzfTwvdGQ+CisJICA8L3RyPgorCSAgPHRyPgorCSAgICA8dGQ+XCR7NC4wIGdlIDN9PC90ZD4KKwkgICAgPHRkPiR7NC4wIGdlIDN9PC90ZD4KKwkgIDwvdHI+CisJICA8dHI+CisJICAgIDx0ZD5cJHs0ICZsdDs9IDN9PC90ZD4KKwkgICAgPHRkPiR7NCA8PSAzfTwvdGQ+CisJICA8L3RyPgorCSAgPHRyPgorCSAgICA8dGQ+XCR7NCBsZSAzfTwvdGQ+CisJICAgIDx0ZD4kezQgbGUgM308L3RkPgorCSAgPC90cj4KKwkgIDx0cj4KKwkgICAgPHRkPlwkezEwMC4wID09IDEwMH08L3RkPgorCSAgICA8dGQ+JHsxMDAuMCA9PSAxMDB9PC90ZD4KKwkgIDwvdHI+CisJICA8dHI+CisJICAgIDx0ZD5cJHsxMDAuMCBlcSAxMDB9PC90ZD4KKwkgICAgPHRkPiR7MTAwLjAgZXEgMTAwfTwvdGQ+CisJICA8L3RyPgorCSAgPHRyPgorCSAgICA8dGQ+XCR7KDEwKjEwKSAhPSAxMDB9PC90ZD4KKwkgICAgPHRkPiR7KDEwKjEwKSAhPSAxMDB9PC90ZD4KKwkgIDwvdHI+CisJICA8dHI+CisJICAgIDx0ZD5cJHsoMTAqMTApIG5lIDEwMH08L3RkPgorCSAgICA8dGQ+JHsoMTAqMTApIG5lIDEwMH08L3RkPgorCSAgPC90cj4KKwk8L3RhYmxlPgorICAgICAgPC9jb2RlPgorICAgICAgPGJyPgorICAgICAgPHU+PGI+QWxwaGFiZXRpYzwvYj48L3U+CisgICAgICA8Y29kZT4KKyAgICAgICAgPHRhYmxlIGJvcmRlcj0iMSI+CisgICAgICAgICAgPHRoZWFkPgorCSAgICA8dGQ+PGI+RUwgRXhwcmVzc2lvbjwvYj48L3RkPgorCSAgICA8dGQ+PGI+UmVzdWx0PC9iPjwvdGQ+CisJICA8L3RoZWFkPgorCSAgPHRyPgorCSAgICA8dGQ+XCR7J2EnICZsdDsgJ2InfTwvdGQ+CisJICAgIDx0ZD4keydhJyA8ICdiJ308L3RkPgorCSAgPC90cj4KKwkgIDx0cj4KKwkgICAgPHRkPlwkeydoaXAnICZndDsgJ2hpdCd9PC90ZD4KKwkgICAgPHRkPiR7J2hpcCcgPiAnaGl0J308L3RkPgorCSAgPC90cj4KKwkgIDx0cj4KKwkgICAgPHRkPlwkeyc0JyAmZ3Q7IDN9PC90ZD4KKwkgICAgPHRkPiR7JzQnID4gM308L3RkPgorCSAgPC90cj4KKwk8L3RhYmxlPgorICAgICAgPC9jb2RlPgorICAgIDwvYmxvY2txdW90ZT4KKyAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvanNwMi9lbC9mdW5jdGlvbnMuaHRtbCBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcDIvZWwvZnVuY3Rpb25zLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTliMDM1MAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcDIvZWwvZnVuY3Rpb25zLmh0bWwKQEAgLTAsMCArMSwzMSBAQAorPGh0bWw+Cis8IS0tCisgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aGVhZD4KKzx0aXRsZT5WaWV3IFNvdXJjZSBDb2RlPC90aXRsZT4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorPC9oZWFkPgorCis8Ym9keSBiZ2NvbG9yPSIjRkZGRkZGIj4KKzxwPjxmb250IGNvbG9yPSIjMDAwMEZGIj48YSBocmVmPSJmdW5jdGlvbnMuanNwP2Zvbz1KU1ArMi4wIj48aW1nIHNyYz0iLi4vLi4vaW1hZ2VzL2V4ZWN1dGUuZ2lmIiBhbGlnbj0icmlnaHQiIGJvcmRlcj0iMCI+PC9hPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPjxpbWcgc3JjPSIuLi8uLi9pbWFnZXMvcmV0dXJuLmdpZiIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiBhbGlnbj0icmlnaHQiIGJvcmRlcj0iMCI+PC9hPjwvZm9udD48L3A+CisKKzxoMz48YSBocmVmPSJmdW5jdGlvbnMuanNwLmh0bWwiPlNvdXJjZSBDb2RlIGZvciBmdW5jdGlvbnMuanNwPGZvbnQgY29sb3I9IiMwMDAwRkYiPjwvYT4KKyAgPC9mb250PiA8L2gzPgorPGgzPjxhIGhyZWY9IkZ1bmN0aW9ucy5qYXZhLmh0bWwiPlNvdXJjZSBDb2RlIGZvciBGdW5jdGlvbnMuamF2YTxmb250IGNvbG9yPSIjMDAwMEZGIj48L2E+CisgIDwvZm9udD4gPC9oMz4KKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvanNwMi9lbC9mdW5jdGlvbnMuanNwIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvanNwMi9lbC9mdW5jdGlvbnMuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlOTVlM2YKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3AyL2VsL2Z1bmN0aW9ucy5qc3AKQEAgLTAsMCArMSw2NCBAQAorPCEtLQorICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPCVAIHRhZ2xpYiBwcmVmaXg9Im15IiB1cmk9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvdG9tY2F0L2pzcDItZXhhbXBsZS10YWdsaWIiJT4KKworPGh0bWw+CisgIDxoZWFkPgorICAgIDx0aXRsZT5KU1AgMi4wIEV4cHJlc3Npb24gTGFuZ3VhZ2UgLSBGdW5jdGlvbnM8L3RpdGxlPgorICA8L2hlYWQ+CisgIDxib2R5PgorICAgIDxoMT5KU1AgMi4wIEV4cHJlc3Npb24gTGFuZ3VhZ2UgLSBGdW5jdGlvbnM8L2gxPgorICAgIDxocj4KKyAgICBBbiB1cGdyYWRlIGZyb20gdGhlIEpTVEwgZXhwcmVzc2lvbiBsYW5ndWFnZSwgdGhlIEpTUCAyLjAgRUwgYWxzbworICAgIGFsbG93cyBmb3Igc2ltcGxlIGZ1bmN0aW9uIGludm9jYXRpb24uICBGdW5jdGlvbnMgYXJlIGRlZmluZWQKKyAgICBieSB0YWcgbGlicmFyaWVzIGFuZCBhcmUgaW1wbGVtZW50ZWQgYnkgYSBKYXZhIHByb2dyYW1tZXIgYXMgCisgICAgc3RhdGljIG1ldGhvZHMuCisKKyAgICA8YmxvY2txdW90ZT4KKyAgICAgIDx1PjxiPkNoYW5nZSBQYXJhbWV0ZXI8L2I+PC91PgorICAgICAgPGZvcm0gYWN0aW9uPSJmdW5jdGlvbnMuanNwIiBtZXRob2Q9IkdFVCI+CisJICBmb28gPSA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iZm9vIiB2YWx1ZT0iJHtwYXJhbVsnZm9vJ119Ij4KKyAgICAgICAgICA8aW5wdXQgdHlwZT0ic3VibWl0Ij4KKyAgICAgIDwvZm9ybT4KKyAgICAgIDxicj4KKyAgICAgIDxjb2RlPgorICAgICAgICA8dGFibGUgYm9yZGVyPSIxIj4KKyAgICAgICAgICA8dGhlYWQ+CisJICAgIDx0ZD48Yj5FTCBFeHByZXNzaW9uPC9iPjwvdGQ+CisJICAgIDx0ZD48Yj5SZXN1bHQ8L2I+PC90ZD4KKwkgIDwvdGhlYWQ+CisJICA8dHI+CisJICAgIDx0ZD5cJHtwYXJhbVsiZm9vIl19PC90ZD4KKwkgICAgPHRkPiR7cGFyYW1bImZvbyJdfSZuYnNwOzwvdGQ+CisJICA8L3RyPgorCSAgPHRyPgorCSAgICA8dGQ+XCR7bXk6cmV2ZXJzZShwYXJhbVsiZm9vIl0pfTwvdGQ+CisJICAgIDx0ZD4ke215OnJldmVyc2UocGFyYW1bImZvbyJdKX0mbmJzcDs8L3RkPgorCSAgPC90cj4KKwkgIDx0cj4KKwkgICAgPHRkPlwke215OnJldmVyc2UobXk6cmV2ZXJzZShwYXJhbVsiZm9vIl0pKX08L3RkPgorCSAgICA8dGQ+JHtteTpyZXZlcnNlKG15OnJldmVyc2UocGFyYW1bImZvbyJdKSl9Jm5ic3A7PC90ZD4KKwkgIDwvdHI+CisJICA8dHI+CisJICAgIDx0ZD5cJHtteTpjb3VudFZvd2VscyhwYXJhbVsiZm9vIl0pfTwvdGQ+CisJICAgIDx0ZD4ke215OmNvdW50Vm93ZWxzKHBhcmFtWyJmb28iXSl9Jm5ic3A7PC90ZD4KKwkgIDwvdHI+CisJPC90YWJsZT4KKyAgICAgIDwvY29kZT4KKyAgICA8L2Jsb2NrcXVvdGU+CisgIDwvYm9keT4KKzwvaHRtbD4KKwpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvanNwMi9lbC9pbXBsaWNpdC1vYmplY3RzLmh0bWwgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3AyL2VsL2ltcGxpY2l0LW9iamVjdHMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTFlY2RiCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvanNwMi9lbC9pbXBsaWNpdC1vYmplY3RzLmh0bWwKQEAgLTAsMCArMSwxOSBAQAorPGh0bWw+Cis8IS0tCisgIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAorICByZXNlcnZlZC4KKy0tPgorPGhlYWQ+Cis8dGl0bGU+VmlldyBTb3VyY2UgQ29kZTwvdGl0bGU+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKzwvaGVhZD4KKworPGJvZHkgYmdjb2xvcj0iI0ZGRkZGRiI+Cis8cD48Zm9udCBjb2xvcj0iIzAwMDBGRiI+PGEgaHJlZj0iaW1wbGljaXQtb2JqZWN0cy5qc3A/Zm9vPWJhciI+PGltZyBzcmM9Ii4uLy4uL2ltYWdlcy9leGVjdXRlLmdpZiIgYWxpZ249InJpZ2h0IiBib3JkZXI9IjAiPjwvYT48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj4KKzxpbWcgc3JjPSIuLi8uLi9pbWFnZXMvcmV0dXJuLmdpZiIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiBhbGlnbj0icmlnaHQiIGJvcmRlcj0iMCI+PC9hPjwvZm9udD48L3A+CisKKzxoMz48YSBocmVmPSJpbXBsaWNpdC1vYmplY3RzLmpzcC5odG1sIj5Tb3VyY2UgQ29kZSBmb3IgSW1wbGljaXQgT2JqZWN0cyBFeGFtcGxlPGZvbnQgY29sb3I9IiMwMDAwRkYiPjwvYT4KKyAgPC9mb250PiA8L2gzPgorCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3AyL2VsL2ltcGxpY2l0LW9iamVjdHMuanNwIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvanNwMi9lbC9pbXBsaWNpdC1vYmplY3RzLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzZkNWRjCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvanNwMi9lbC9pbXBsaWNpdC1vYmplY3RzLmpzcApAQCAtMCwwICsxLDg2IEBACis8IS0tCisgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbD4KKyAgPGhlYWQ+CisgICAgPHRpdGxlPkpTUCAyLjAgRXhwcmVzc2lvbiBMYW5ndWFnZSAtIEltcGxpY2l0IE9iamVjdHM8L3RpdGxlPgorICA8L2hlYWQ+CisgIDxib2R5PgorICAgIDxoMT5KU1AgMi4wIEV4cHJlc3Npb24gTGFuZ3VhZ2UgLSBJbXBsaWNpdCBPYmplY3RzPC9oMT4KKyAgICA8aHI+CisgICAgVGhpcyBleGFtcGxlIGlsbHVzdHJhdGVzIHNvbWUgb2YgdGhlIGltcGxpY2l0IG9iamVjdHMgYXZhaWxhYmxlIAorICAgIGluIHRoZSBFeHByZXNzaW9uIExhbmFndWFnZS4gIFRoZSBmb2xsb3dpbmcgaW1wbGljaXQgb2JqZWN0cyBhcmUgCisgICAgYXZhaWxhYmxlIChub3QgYWxsIGlsbHVzdHJhdGVkIGhlcmUpOgorICAgIDx1bD4KKyAgICAgIDxsaT5wYWdlQ29udGV4dCAtIHRoZSBQYWdlQ29udGV4dCBvYmplY3Q8L2xpPgorICAgICAgPGxpPnBhZ2VTY29wZSAtIGEgTWFwIHRoYXQgbWFwcyBwYWdlLXNjb3BlZCBhdHRyaWJ1dGUgbmFtZXMgdG8gCisgICAgICAgICAgdGhlaXIgdmFsdWVzPC9saT4KKyAgICAgIDxsaT5yZXF1ZXN0U2NvcGUgLSBhIE1hcCB0aGF0IG1hcHMgcmVxdWVzdC1zY29wZWQgYXR0cmlidXRlIG5hbWVzIAorICAgICAgICAgIHRvIHRoZWlyIHZhbHVlczwvbGk+CisgICAgICA8bGk+c2Vzc2lvblNjb3BlIC0gYSBNYXAgdGhhdCBtYXBzIHNlc3Npb24tc2NvcGVkIGF0dHJpYnV0ZSBuYW1lcyAKKyAgICAgICAgICB0byB0aGVpciB2YWx1ZXM8L2xpPgorICAgICAgPGxpPmFwcGxpY2F0aW9uU2NvcGUgLSBhIE1hcCB0aGF0IG1hcHMgYXBwbGljYXRpb24tc2NvcGVkIGF0dHJpYnV0ZSAKKyAgICAgICAgICBuYW1lcyB0byB0aGVpciB2YWx1ZXM8L2xpPgorICAgICAgPGxpPnBhcmFtIC0gYSBNYXAgdGhhdCBtYXBzIHBhcmFtZXRlciBuYW1lcyB0byBhIHNpbmdsZSBTdHJpbmcgCisgICAgICAgICAgcGFyYW1ldGVyIHZhbHVlPC9saT4KKyAgICAgIDxsaT5wYXJhbVZhbHVlcyAtIGEgTWFwIHRoYXQgbWFwcyBwYXJhbWV0ZXIgbmFtZXMgdG8gYSBTdHJpbmdbXSBvZiAKKyAgICAgICAgICBhbGwgdmFsdWVzIGZvciB0aGF0IHBhcmFtZXRlcjwvbGk+CisgICAgICA8bGk+aGVhZGVyIC0gYSBNYXAgdGhhdCBtYXBzIGhlYWRlciBuYW1lcyB0byBhIHNpbmdsZSBTdHJpbmcgCisgICAgICAgICAgaGVhZGVyIHZhbHVlPC9saT4KKyAgICAgIDxsaT5oZWFkZXJWYWx1ZXMgLSBhIE1hcCB0aGF0IG1hcHMgaGVhZGVyIG5hbWVzIHRvIGEgU3RyaW5nW10gb2YgCisgICAgICAgICAgYWxsIHZhbHVlcyBmb3IgdGhhdCBoZWFkZXI8L2xpPgorICAgICAgPGxpPmluaXRQYXJhbSAtIGEgTWFwIHRoYXQgbWFwcyBjb250ZXh0IGluaXRpYWxpemF0aW9uIHBhcmFtZXRlciAKKyAgICAgICAgICBuYW1lcyB0byB0aGVpciBTdHJpbmcgcGFyYW1ldGVyIHZhbHVlPC9saT4KKyAgICAgIDxsaT5jb29raWUgLSBhIE1hcCB0aGF0IG1hcHMgY29va2llIG5hbWVzIHRvIGEgc2luZ2xlIENvb2tpZSBvYmplY3QuPC9saT4KKyAgICA8L3VsPgorCisgICAgPGJsb2NrcXVvdGU+CisgICAgICA8dT48Yj5DaGFuZ2UgUGFyYW1ldGVyPC9iPjwvdT4KKyAgICAgIDxmb3JtIGFjdGlvbj0iaW1wbGljaXQtb2JqZWN0cy5qc3AiIG1ldGhvZD0iR0VUIj4KKwkgIGZvbyA9IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJmb28iIHZhbHVlPSIke3BhcmFtWyJmb28iXX0iPgorICAgICAgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiPgorICAgICAgPC9mb3JtPgorICAgICAgPGJyPgorICAgICAgPGNvZGU+CisgICAgICAgIDx0YWJsZSBib3JkZXI9IjEiPgorICAgICAgICAgIDx0aGVhZD4KKwkgICAgPHRkPjxiPkVMIEV4cHJlc3Npb248L2I+PC90ZD4KKwkgICAgPHRkPjxiPlJlc3VsdDwvYj48L3RkPgorCSAgPC90aGVhZD4KKwkgIDx0cj4KKwkgICAgPHRkPlwke3BhcmFtLmZvb308L3RkPgorCSAgICA8dGQ+JHtwYXJhbS5mb299Jm5ic3A7PC90ZD4KKwkgIDwvdHI+CisJICA8dHI+CisJICAgIDx0ZD5cJHtwYXJhbVsiZm9vIl19PC90ZD4KKwkgICAgPHRkPiR7cGFyYW1bImZvbyJdfSZuYnNwOzwvdGQ+CisJICA8L3RyPgorCSAgPHRyPgorCSAgICA8dGQ+XCR7aGVhZGVyWyJob3N0Il19PC90ZD4KKwkgICAgPHRkPiR7aGVhZGVyWyJob3N0Il19PC90ZD4KKwkgIDwvdHI+CisJICA8dHI+CisJICAgIDx0ZD5cJHtoZWFkZXJbImFjY2VwdCJdfTwvdGQ+CisJICAgIDx0ZD4ke2hlYWRlclsiYWNjZXB0Il19PC90ZD4KKwkgIDwvdHI+CisJICA8dHI+CisJICAgIDx0ZD5cJHtoZWFkZXJbInVzZXItYWdlbnQiXX08L3RkPgorCSAgICA8dGQ+JHtoZWFkZXJbInVzZXItYWdlbnQiXX08L3RkPgorCSAgPC90cj4KKwk8L3RhYmxlPgorICAgICAgPC9jb2RlPgorICAgIDwvYmxvY2txdW90ZT4KKyAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvanNwMi9qc3BhdHRyaWJ1dGUvanNwYXR0cmlidXRlLmh0bWwgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3AyL2pzcGF0dHJpYnV0ZS9qc3BhdHRyaWJ1dGUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmFlYTM5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvanNwMi9qc3BhdHRyaWJ1dGUvanNwYXR0cmlidXRlLmh0bWwKQEAgLTAsMCArMSwzNiBAQAorPGh0bWw+Cis8IS0tCisgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aGVhZD4KKzx0aXRsZT5WaWV3IFNvdXJjZSBDb2RlPC90aXRsZT4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorPC9oZWFkPgorCis8Ym9keSBiZ2NvbG9yPSIjRkZGRkZGIj4KKzxwPjxmb250IGNvbG9yPSIjMDAwMEZGIj48YSBocmVmPSJqc3BhdHRyaWJ1dGUuanNwIj48aW1nIHNyYz0iLi4vLi4vaW1hZ2VzL2V4ZWN1dGUuZ2lmIiBhbGlnbj0icmlnaHQiIGJvcmRlcj0iMCI+PC9hPgorPGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+PGltZyBzcmM9Ii4uLy4uL2ltYWdlcy9yZXR1cm4uZ2lmIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGFsaWduPSJyaWdodCIgYm9yZGVyPSIwIj48L2E+PC9mb250PjwvcD4KKworPGgzPjxhIGhyZWY9ImpzcGF0dHJpYnV0ZS5qc3AuaHRtbCI+U291cmNlIENvZGUgZm9yIGpzcGF0dHJpYnV0ZS5qc3A8Zm9udCBjb2xvcj0iIzAwMDBGRiI+PC9hPgorICA8L2ZvbnQ+IDwvaDM+CisKKzxoMz48YSBocmVmPSJIZWxsb1dvcmxkU2ltcGxlVGFnLmphdmEuaHRtbCI+U291cmNlIENvZGUgZm9yIEhlbGxvV29ybGRTaW1wbGVUYWcuamF2YTxmb250IGNvbG9yPSIjMDAwMEZGIj48L2E+CisgIDwvZm9udD4gPC9oMz4KKworPGgzPjxhIGhyZWY9IkZvb0JlYW4uamF2YS5odG1sIj5Tb3VyY2UgQ29kZSBmb3IgRm9vQmVhbi5qYXZhPGZvbnQgY29sb3I9IiMwMDAwRkYiPjwvYT4KKyAgPC9mb250PiA8L2gzPgorCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3AyL2pzcGF0dHJpYnV0ZS9qc3BhdHRyaWJ1dGUuanNwIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvanNwMi9qc3BhdHRyaWJ1dGUvanNwYXR0cmlidXRlLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmI3MDVlCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvanNwMi9qc3BhdHRyaWJ1dGUvanNwYXR0cmlidXRlLmpzcApAQCAtMCwwICsxLDQ1IEBACis8IS0tCisgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8JUAgdGFnbGliIHByZWZpeD0ibXkiIHVyaT0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy90b21jYXQvanNwMi1leGFtcGxlLXRhZ2xpYiIlPgorCis8aHRtbD4KKyAgPGhlYWQ+CisgICAgPHRpdGxlPkpTUCAyLjAgRXhhbXBsZXMgLSBqc3A6YXR0cmlidXRlIGFuZCBqc3A6Ym9keTwvdGl0bGU+CisgIDwvaGVhZD4KKyAgPGJvZHk+CisgICAgPGgxPkpTUCAyLjAgRXhhbXBsZXMgLSBqc3A6YXR0cmlidXRlIGFuZCBqc3A6Ym9keTwvaDE+CisgICAgPGhyPgorICAgIDxwPlRoZSBuZXcgJmx0O2pzcDphdHRyaWJ1dGUmZ3Q7IGFuZCAmbHQ7anNwOmJvZHkmZ3Q7IAorICAgIHN0YW5kYXJkIGFjdGlvbnMgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgdmFsdWUgb2YgYW55IHN0YW5kYXJkCisgICAgYWN0aW9uIG9yIGN1c3RvbSBhY3Rpb24gYXR0cmlidXRlLjwvcD4KKyAgICA8cD5UaGlzIGV4YW1wbGUgdXNlcyB0aGUgJmx0O2pzcDphdHRyaWJ1dGUmZ3Q7CisgICAgc3RhbmRhcmQgYWN0aW9uIHRvIHVzZSB0aGUgb3V0cHV0IG9mIGEgY3VzdG9tIGFjdGlvbiBpbnZvY2F0aW9uCisgICAgKG9uZSB0aGF0IHNpbXBseSBvdXRwdXRzICJIZWxsbywgV29ybGQhIikgdG8gc2V0IHRoZSB2YWx1ZSBvZiBhCisgICAgYmVhbiBwcm9wZXJ0eS4gIFRoaXMgd291bGQgbm9ybWFsbHkgcmVxdWlyZSBhbiBpbnRlcm1lZGlhcnkKKyAgICBzdGVwLCBzdWNoIGFzIHVzaW5nIEpTVEwncyAmbHQ7YzpzZXQmZ3Q7IGFjdGlvbi48L3A+CisgICAgPGJyPgorICAgIDxqc3A6dXNlQmVhbiBpZD0iZm9vIiBjbGFzcz0ianNwMi5leGFtcGxlcy5Gb29CZWFuIj4KKyAgICAgIEJlYW4gY3JlYXRlZCEgIFNldHRpbmcgZm9vLmJhci4uLjxicj4KKyAgICAgIDxqc3A6c2V0UHJvcGVydHkgbmFtZT0iZm9vIiBwcm9wZXJ0eT0iYmFyIj4KKyAgICAgICAgPGpzcDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiPgorCSAgPG15OmhlbGxvV29ybGQvPgorICAgICAgICA8L2pzcDphdHRyaWJ1dGU+CisgICAgICA8L2pzcDpzZXRQcm9wZXJ0eT4KKyAgICA8L2pzcDp1c2VCZWFuPgorICAgIDxicj4KKyAgICBSZXN1bHQ6ICR7Zm9vLmJhcn0KKyAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvanNwMi9qc3BhdHRyaWJ1dGUvc2h1ZmZsZS5odG1sIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvanNwMi9qc3BhdHRyaWJ1dGUvc2h1ZmZsZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwN2M1YWEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3AyL2pzcGF0dHJpYnV0ZS9zaHVmZmxlLmh0bWwKQEAgLTAsMCArMSwzNiBAQAorPGh0bWw+Cis8IS0tCisgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aGVhZD4KKzx0aXRsZT5WaWV3IFNvdXJjZSBDb2RlPC90aXRsZT4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorPC9oZWFkPgorCis8Ym9keSBiZ2NvbG9yPSIjRkZGRkZGIj4KKzxwPjxmb250IGNvbG9yPSIjMDAwMEZGIj48YSBocmVmPSJzaHVmZmxlLmpzcCI+PGltZyBzcmM9Ii4uLy4uL2ltYWdlcy9leGVjdXRlLmdpZiIgYWxpZ249InJpZ2h0IiBib3JkZXI9IjAiPjwvYT4KKzxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPjxpbWcgc3JjPSIuLi8uLi9pbWFnZXMvcmV0dXJuLmdpZiIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiBhbGlnbj0icmlnaHQiIGJvcmRlcj0iMCI+PC9hPjwvZm9udD48L3A+CisKKzxoMz48YSBocmVmPSJzaHVmZmxlLmpzcC5odG1sIj5Tb3VyY2UgQ29kZSBmb3Igc2h1ZmZsZS5qc3A8Zm9udCBjb2xvcj0iIzAwMDBGRiI+PC9hPgorICA8L2ZvbnQ+IDwvaDM+CisKKzxoMz48YSBocmVmPSJTaHVmZmxlU2ltcGxlVGFnLmphdmEuaHRtbCI+U291cmNlIENvZGUgZm9yIFNodWZmbGVTaW1wbGVUYWcuamF2YTxmb250IGNvbG9yPSIjMDAwMEZGIj48L2E+CisgIDwvZm9udD4gPC9oMz4KKworPGgzPjxhIGhyZWY9IlRpbGVTaW1wbGVUYWcuamF2YS5odG1sIj5Tb3VyY2UgQ29kZSBmb3IgVGlsZVNpbXBsZVRhZy5qYXZhPGZvbnQgY29sb3I9IiMwMDAwRkYiPjwvYT4KKyAgPC9mb250PiA8L2gzPgorCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3AyL2pzcGF0dHJpYnV0ZS9zaHVmZmxlLmpzcCBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcDIvanNwYXR0cmlidXRlL3NodWZmbGUuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmMTM5ZmQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3AyL2pzcGF0dHJpYnV0ZS9zaHVmZmxlLmpzcApAQCAtMCwwICsxLDg5IEBACis8IS0tCisgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8JUAgdGFnbGliIHByZWZpeD0ibXkiIHVyaT0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy90b21jYXQvanNwMi1leGFtcGxlLXRhZ2xpYiIlPgorCis8aHRtbD4KKyAgPGhlYWQ+CisgICAgPHRpdGxlPkpTUCAyLjAgRXhhbXBsZXMgLSBTaHVmZmxlIEV4YW1wbGU8L3RpdGxlPgorICA8L2hlYWQ+CisgIDxib2R5PgorICAgIDxoMT5KU1AgMi4wIEV4YW1wbGVzIC0gU2h1ZmZsZSBFeGFtcGxlPC9oMT4KKyAgICA8aHI+CisgICAgPHA+VHJ5IHJlbG9hZGluZyB0aGUgcGFnZSBhIGZldyB0aW1lcy4gIEJvdGggdGhlIHJvd3MgYW5kIHRoZSBjb2x1bW5zCisgICAgYXJlIHNodWZmbGVkIGFuZCBhcHBlYXIgZGlmZmVyZW50IGVhY2ggdGltZS48L3A+CisgICAgPHA+SGVyZSdzIGhvdyB0aGUgY29kZSB3b3Jrcy4gIFRoZSBTaW1wbGVUYWcgaGFuZGxlciBjYWxsZWQgCisgICAgJmx0O215OnNodWZmbGUmZ3Q7IGFjY2VwdHMgdGhyZWUgYXR0cmlidXRlcy4gIEVhY2ggYXR0cmlidXRlIGlzIGEgCisgICAgSlNQIEZyYWdtZW50LCBtZWFuaW5nIGl0IGlzIGEgZnJhZ21lbnQgb2YgSlNQIGNvZGUgdGhhdCBjYW4gYmUKKyAgICBkeW5hbWljYWxseSBleGVjdXRlZCBieSB0aGUgc2h1ZmZsZSB0YWcgaGFuZGxlciBvbiBkZW1hbmQuICBUaGUgCisgICAgc2h1ZmZsZSB0YWcgaGFuZGxlciBleGVjdXRlcyB0aGUgdGhyZWUgZnJhZ21lbnRzIGluIGEgcmFuZG9tIG9yZGVyLgorICAgIFRvIHNodWZmbGUgYm90aCB0aGUgcm93cyBhbmQgdGhlIGNvbHVtbnMsIHRoZSBzaHVmZmxlIHRhZyBpcyB1c2VkCisgICAgd2l0aCBpdHNlbGYgYXMgYSBwYXJhbWV0ZXIuPC9wPgorICAgIDxocj4KKyAgICA8YmxvY2txdW90ZT4KKyAgICAgPGZvbnQgY29sb3I9IiNmZmZmZmYiPgorICAgICAgPHRhYmxlPgorICAgICAgICA8bXk6c2h1ZmZsZT4KKyAgICAgICAgICA8anNwOmF0dHJpYnV0ZSBuYW1lPSJmcmFnbWVudDEiPgorICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICA8bXk6c2h1ZmZsZT4KKyAgICAgICAgICAgICAgICA8anNwOmF0dHJpYnV0ZSBuYW1lPSJmcmFnbWVudDEiPgorICAgICAgICAgICAgICAgICAgPG15OnRpbGUgY29sb3I9IiNmZjAwMDAiIGxhYmVsPSJBIi8+CisgICAgICAgICAgICAgICAgPC9qc3A6YXR0cmlidXRlPgorICAgICAgICAgICAgICAgIDxqc3A6YXR0cmlidXRlIG5hbWU9ImZyYWdtZW50MiI+CisgICAgICAgICAgICAgICAgICA8bXk6dGlsZSBjb2xvcj0iIzAwZmYwMCIgbGFiZWw9IkIiLz4KKyAgICAgICAgICAgICAgICA8L2pzcDphdHRyaWJ1dGU+CisgICAgICAgICAgICAgICAgPGpzcDphdHRyaWJ1dGUgbmFtZT0iZnJhZ21lbnQzIj4KKyAgICAgICAgICAgICAgICAgIDxteTp0aWxlIGNvbG9yPSIjMDAwMGZmIiBsYWJlbD0iQyIvPgorICAgICAgICAgICAgICAgIDwvanNwOmF0dHJpYnV0ZT4KKyAgICAgICAgICAgICAgPC9teTpzaHVmZmxlPgorICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8L2pzcDphdHRyaWJ1dGU+CisgICAgICAgICAgPGpzcDphdHRyaWJ1dGUgbmFtZT0iZnJhZ21lbnQyIj4KKyAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgPG15OnNodWZmbGU+CisgICAgICAgICAgICAgICAgPGpzcDphdHRyaWJ1dGUgbmFtZT0iZnJhZ21lbnQxIj4KKyAgICAgICAgICAgICAgICAgIDxteTp0aWxlIGNvbG9yPSIjZmYwMDAwIiBsYWJlbD0iMSIvPgorICAgICAgICAgICAgICAgIDwvanNwOmF0dHJpYnV0ZT4KKyAgICAgICAgICAgICAgICA8anNwOmF0dHJpYnV0ZSBuYW1lPSJmcmFnbWVudDIiPgorICAgICAgICAgICAgICAgICAgPG15OnRpbGUgY29sb3I9IiMwMGZmMDAiIGxhYmVsPSIyIi8+CisgICAgICAgICAgICAgICAgPC9qc3A6YXR0cmlidXRlPgorICAgICAgICAgICAgICAgIDxqc3A6YXR0cmlidXRlIG5hbWU9ImZyYWdtZW50MyI+CisgICAgICAgICAgICAgICAgICA8bXk6dGlsZSBjb2xvcj0iIzAwMDBmZiIgbGFiZWw9IjMiLz4KKyAgICAgICAgICAgICAgICA8L2pzcDphdHRyaWJ1dGU+CisgICAgICAgICAgICAgIDwvbXk6c2h1ZmZsZT4KKyAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPC9qc3A6YXR0cmlidXRlPgorICAgICAgICAgIDxqc3A6YXR0cmlidXRlIG5hbWU9ImZyYWdtZW50MyI+CisgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgIDxteTpzaHVmZmxlPgorICAgICAgICAgICAgICAgIDxqc3A6YXR0cmlidXRlIG5hbWU9ImZyYWdtZW50MSI+CisgICAgICAgICAgICAgICAgICA8bXk6dGlsZSBjb2xvcj0iI2ZmMDAwMCIgbGFiZWw9IiEiLz4KKyAgICAgICAgICAgICAgICA8L2pzcDphdHRyaWJ1dGU+CisgICAgICAgICAgICAgICAgPGpzcDphdHRyaWJ1dGUgbmFtZT0iZnJhZ21lbnQyIj4KKyAgICAgICAgICAgICAgICAgIDxteTp0aWxlIGNvbG9yPSIjMDBmZjAwIiBsYWJlbD0iQCIvPgorICAgICAgICAgICAgICAgIDwvanNwOmF0dHJpYnV0ZT4KKyAgICAgICAgICAgICAgICA8anNwOmF0dHJpYnV0ZSBuYW1lPSJmcmFnbWVudDMiPgorICAgICAgICAgICAgICAgICAgPG15OnRpbGUgY29sb3I9IiMwMDAwZmYiIGxhYmVsPSIjIi8+CisgICAgICAgICAgICAgICAgPC9qc3A6YXR0cmlidXRlPgorICAgICAgICAgICAgICA8L215OnNodWZmbGU+CisgICAgICAgICAgICA8L3RyPgorICAgICAgICAgIDwvanNwOmF0dHJpYnV0ZT4KKyAgICAgICAgPC9teTpzaHVmZmxlPgorICAgICAgPC90YWJsZT4KKyAgICAgPC9mb250PgorICAgIDwvYmxvY2txdW90ZT4KKyAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvanNwMi9qc3B4L2Jhc2ljLmh0bWwgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3AyL2pzcHgvYmFzaWMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjI0MjdiCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvanNwMi9qc3B4L2Jhc2ljLmh0bWwKQEAgLTAsMCArMSwzMCBAQAorPGh0bWw+Cis8IS0tCisgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aGVhZD4KKzx0aXRsZT5WaWV3IFNvdXJjZSBDb2RlPC90aXRsZT4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorPC9oZWFkPgorCis8Ym9keSBiZ2NvbG9yPSIjRkZGRkZGIj4KKzxwPjxmb250IGNvbG9yPSIjMDAwMEZGIj48YSBocmVmPSJiYXNpYy5qc3B4Ij48aW1nIHNyYz0iLi4vLi4vaW1hZ2VzL2V4ZWN1dGUuZ2lmIiBhbGlnbj0icmlnaHQiIGJvcmRlcj0iMCI+PC9hPjxhCitocmVmPSIuLi8uLi9pbmRleC5odG1sIj48aW1nIHNyYz0iLi4vLi4vaW1hZ2VzL3JldHVybi5naWYiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgYWxpZ249InJpZ2h0IiBib3JkZXI9IjAiPjwvYT48L2ZvbnQ+PC9wPgorCis8aDM+PGEgaHJlZj0iYmFzaWMuanNweC5odG1sIj5Tb3VyY2UgQ29kZSBmb3IgWEhUTUwgQmFzaWMgRXhhbXBsZTxmb250IGNvbG9yPSIjMDAwMEZGIj48L2E+CisgIDwvZm9udD4gPC9oMz4KKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvanNwMi9qc3B4L2Jhc2ljLmpzcHggYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3AyL2pzcHgvYmFzaWMuanNweApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTJmMzViCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvanNwMi9qc3B4L2Jhc2ljLmpzcHgKQEAgLTAsMCArMSwzMCBAQAorPHRhZ3M6eGh0bWxiYXNpYyB4bWxuczp0YWdzPSJ1cm46anNwdGFnZGlyOi9XRUItSU5GL3RhZ3MiCisgICAgICAgICAgICAgICAgIHhtbG5zOmpzcD0iaHR0cDovL2phdmEuc3VuLmNvbS9KU1AvUGFnZSIKKyAgICAgICAgICAgICAgICAgeG1sbnM6Zm10PSJodHRwOi8vamF2YS5zdW4uY29tL2pzcC9qc3RsL2ZtdCIKKwkJIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KKyAgPGpzcDpkaXJlY3RpdmUucGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sIiAvPgorICA8aGVhZD4KKyAgICA8dGl0bGU+SlNQWCAtIFhIVE1MIEJhc2ljIEV4YW1wbGU8L3RpdGxlPgorICA8L2hlYWQ+CisgIDxib2R5PgorICAgIDxoMT5KU1BYIC0gWEhUTUwgQmFzaWMgRXhhbXBsZTwvaDE+CisgICAgPGhyLz4KKyAgICBUaGlzIGV4YW1wbGUgaWxsdXN0cmF0ZXMgaG93IHRvIHVzZSBKU1BYIHRvIHByb2R1Y2UgYW4gWEhUTUwgYmFzaWMKKyAgICBkb2N1bWVudCBzdWl0YWJsZSBmb3IgdXNlIHdpdGggbW9iaWxlIHBob25lcywgdGVsZXZpc2lvbnMsIAorICAgIFBEQXMsIHZlbmRpbmcgbWFjaGluZXMsIHBhZ2VycywgY2FyIG5hdmlnYXRpb24gc3lzdGVtcywKKyAgICBtb2JpbGUgZ2FtZSBtYWNoaW5lcywgZGlnaXRhbCBib29rIHJlYWRlcnMsIHNtYXJ0IHdhdGNoZXMsIGV0Yy4KKyAgICA8cC8+CisgICAgSlNQWCBsZXRzIHlvdSBjcmVhdGUgZHluYW1pYyBkb2N1bWVudHMgaW4gYSBwdXJlIFhNTCBzeW50YXggY29tcGF0aWJsZQorICAgIHdpdGggZXhpc3RpbmcgWE1MIHRvb2xzLiAgVGhlIFhNTCBzeW50YXggaW4gSlNQIDEuMiB3YXMgYXdrd2FyZCBhbmQKKyAgICByZXF1aXJlZCAmYW1wO2x0O2pzcDpyb290JmFtcDtndDsgdG8gYmUgdGhlIHJvb3QgZWxlbWVudCBvZiB0aGUgZG9jdW1lbnQuCisgICAgVGhpcyBpcyBubyBsb25nZXIgdGhlIGNhc2UgaW4gSlNQIDIuMC4KKyAgICA8cC8+CisgICAgVGhpcyBwYXJ0aWN1bGFyIGV4YW1wbGUgdXNlcyBhIHRhZyBmaWxlIHRvIHByb2R1Y2UgdGhlIERPQ1RZUEUgYW5kCisgICAgbmFtZXNwYWNlIGRlY2xhcmF0aW9ucyB0byBtYWtlIHRoZSBvdXRwdXQgb2YgdGhpcyBwYWdlIGEgdmFsaWQgWEhUTUwKKyAgICBCYXNpYyBkb2N1bWVudC4KKyAgICA8cC8+CisgICAgSnVzdCB0byBwcm92ZSB0aGlzIGlzIGxpdmUsIGhlcmUncyBzb21lIGR5bmFtaWMgY29udGVudDoKKyAgICA8anNwOnVzZUJlYW4gaWQ9Im5vdyIgY2xhc3M9ImphdmEudXRpbC5EYXRlIiAvPgorICAgIDxmbXQ6Zm9ybWF0RGF0ZSB2YWx1ZT0iJHtub3d9IiBwYXR0ZXJuPSJNTU1NIGQsIHl5eXksIEg6bW06c3MiLz4KKyAgPC9ib2R5PgorPC90YWdzOnhodG1sYmFzaWM+CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3AyL2pzcHgvc3ZnZXhhbXBsZS5odG1sIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvanNwMi9qc3B4L3N2Z2V4YW1wbGUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Zjk1NDU5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvanNwMi9qc3B4L3N2Z2V4YW1wbGUuaHRtbApAQCAtMCwwICsxLDUxIEBACis8IS0tCisgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbD4KKyAgPGhlYWQ+CisgICAgPHRpdGxlPkpTUCAyLjAgU1ZHIEV4YW1wbGU8L3RpdGxlPgorICA8L2hlYWQ+CisgIDxib2R5PgorICAgIDxoMT5KU1AgMi4wIFNWRyBFeGFtcGxlPC9oMT4KKyAgICA8aHI+CisgICAgVGhpcyBleGFtcGxlIHVzZXMgSlNQIDIuMCdzIG5ldywgc2ltcGxpZmllZCBKU1BYIHN5bnRheCB0byByZW5kZXIgYQorICAgIFNjYWxhYmxlIFZlY3RvciBHcmFwaGljcyAoU1ZHKSBkb2N1bWVudC4gIFdoZW4geW91IHZpZXcgdGhlIHNvdXJjZSwKKyAgICBub3RpY2UgdGhlIGxhY2sgb2YgYSAmbHQ7anNwOnJvb3QmZ3Q7IGVsZW1lbnQhICBUaGUgdGV4dCB0byBiZSByZW5kZXJlZCAKKyAgICBjYW4gYmUgbW9kaWZpZWQgYnkgY2hhbmdpbmcgdGhlIHZhbHVlIG9mIHRoZSBuYW1lIHBhcmFtZXRlci4KKyAgICA8cD4KKyAgICBTVkcgaGFzIG1hbnkgcG90ZW50aWFsIHVzZXMsIHN1Y2ggYXMgc2VhcmNoYWJsZSBpbWFnZXMsIG9yIGltYWdlcworICAgIGN1c3RvbWl6ZWQgd2l0aCB0aGUgbmFtZSBvZiB5b3VyIHNpdGUncyB2aXNpdG9yIChlLmcuIGEgIlN1c2FuJ3MgU3RvcmUiCisgICAgdGFiIGltYWdlKS4gIEpTUFggaXMgYSBuYXR1cmFsIGZpdCBmb3IgZ2VuZXJhdGluZyBkeW5hbWljIFhNTCBjb250ZW50CisgICAgc3VjaCBhcyBTVkcuCisgICAgPHA+CisgICAgVG8gZXhlY3V0ZSB0aGlzIGV4YW1wbGUsIGZvbGxvdyB0aGVzZSBzdGVwczoKKyAgICA8b2w+CisgICAgICA8bGk+RG93bmxvYWQgPGEgaHJlZj0iaHR0cDovL3htbC5hcGFjaGUub3JnL2JhdGlrL2luZGV4Lmh0bWwiPkJhdGlrPC9hPiwKKyAgICAgICAgICBvciBhbnkgb3RoZXIgU1ZHIHZpZXdlci48L2xpPgorICAgICAgPGxpPkNvcHkgdGhlIGZvbGxvd2luZyBVUkw6CisgICAgICA8YSBocmVmPSJodHRwOi8vbG9jYWxob3N0OjgwODAvanNwLWV4YW1wbGVzL2pzcDIvanNweC90ZXh0Um90YXRlLmpzcHg/bmFtZT1KU1BYIj4KKyAgICAgIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qc3AtZXhhbXBsZXMvanNwMi9qc3B4L3RleHRSb3RhdGUuanNweD9uYW1lPUpTUFg8L2E+CisgICAgICA8L2xpPgorICAgICAgPGxpPlBhc3RlIHRoZSBVUkwgaW50byBCYXRpaydzIExvY2F0aW9uIGZpZWxkIGFuZCBwcmVzcyBFbnRlcjwvbGk+CisgICAgICA8bGk+Q3VzdG9taXplIGJ5IGNoYW5naW5nIHRoZSBuYW1lPUpTUFggcGFyYW1ldGVyPC9saT4KKyAgICA8L29sPgorICAgIDxicj4KKyAgICBUaGUgZm9sbG93aW5nIGlzIGEgc2NyZWVuc2hvdCBvZiB0aGUgcmVzdWx0aW5nIGltYWdlLCBmb3IgdGhvc2UgdGhhdAorICAgIGRvbid0IGhhdmUgYW4gU1ZHIHZpZXdlcjoKKyAgICA8YmxvY2txdW90ZT4KKyAgICAgIDxpbWcgc3JjPSJ0ZXh0Um90YXRlLmpwZyIgYm9yZGVyPSIxIj4KKyAgICA8L2Jsb2NrcXVvdGU+CisgIDwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcDIvanNweC90ZXh0Um90YXRlLmh0bWwgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3AyL2pzcHgvdGV4dFJvdGF0ZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4NzRlY2IKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3AyL2pzcHgvdGV4dFJvdGF0ZS5odG1sCkBAIC0wLDAgKzEsMzEgQEAKKzxodG1sPgorPCEtLQorICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGhlYWQ+Cis8dGl0bGU+VmlldyBTb3VyY2UgQ29kZTwvdGl0bGU+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKzwvaGVhZD4KKworPGJvZHkgYmdjb2xvcj0iI0ZGRkZGRiI+Cis8cD48Zm9udCBjb2xvcj0iIzAwMDBGRiI+PGEgaHJlZj0idGV4dFJvdGF0ZS5qc3B4Ij48aW1nIHNyYz0iLi4vLi4vaW1hZ2VzL2V4ZWN1dGUuZ2lmIiBhbGlnbj0icmlnaHQiIGJvcmRlcj0iMCI+PC9hPjxhCitocmVmPSIuLi8uLi9pbmRleC5odG1sIj48aW1nIHNyYz0iLi4vLi4vaW1hZ2VzL3JldHVybi5naWYiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgYWxpZ249InJpZ2h0IiBib3JkZXI9IjAiPjwvYT48L2ZvbnQ+PC9wPgorCis8aDM+PGEgaHJlZj0idGV4dFJvdGF0ZS5qc3B4Lmh0bWwiPlNvdXJjZSBDb2RlIGZvciBTVkcgKFNjYWxhYmxlIFZlY3RvciBHcmFwaGljcykKK0V4YW1wbGU8Zm9udCBjb2xvcj0iIzAwMDBGRiI+PC9hPgorICA8L2ZvbnQ+IDwvaDM+CisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcDIvanNweC90ZXh0Um90YXRlLmpwZyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcDIvanNweC90ZXh0Um90YXRlLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTk4NzM2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvanNwMi9qc3B4L3RleHRSb3RhdGUuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcDIvanNweC90ZXh0Um90YXRlLmpzcHggYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3AyL2pzcHgvdGV4dFJvdGF0ZS5qc3B4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3YThiODQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3AyL2pzcHgvdGV4dFJvdGF0ZS5qc3B4CkBAIC0wLDAgKzEsMzUgQEAKKzwhLS0gCisgIC0gVGhpcyBleGFtcGxlIGlzIGJhc2VkIG9mZiB0aGUgdGV4dFJvdGF0ZS5zdmcgZXhhbXBsZSB0aGF0IGNvbWVzCisgIC0gd2l0aCBCYXRpay4gIFRoZSBvcmlnaW5hbCBleGFtcGxlIHdhcyB3cml0dGVuIGJ5IEJpbGwgSGFuZW1hbi4KKyAgLSBUaGlzIHZlcnNpb24gYnkgTWFyayBSb3RoLgorICAtLT4KKzxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgorICAgICB3aWR0aD0iNDUwIiBoZWlnaHQ9IjUwMCIgdmlld0JveD0iMCAwIDQ1MCA1MDAiCisgICAgIHhtbG5zOmM9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNwL2pzdGwvY29yZSIKKyAgICAgeG1sbnM6anNwPSJodHRwOi8vamF2YS5zdW4uY29tL0pTUC9QYWdlIj4KKyAgPGpzcDpkaXJlY3RpdmUucGFnZSBjb250ZW50VHlwZT0iaW1hZ2Uvc3ZnK3htbCIgLz4KKyAgPHRpdGxlPkpTUCAyLjAgSlNQWDwvdGl0bGU+CisgIDwhLS0gc2VsZWN0IG5hbWUgcGFyYW1ldGVyLCBvciBkZWZhdWx0IHRvIEpTUFggLS0+CisgIDxjOnNldCB2YXI9Im5hbWUiIHZhbHVlPScke2VtcHR5IHBhcmFtWyJuYW1lIl0gPyAiSlNQWCIgOiBwYXJhbVsibmFtZSJdfScvPgorICA8ZyBpZD0idGVzdENvbnRlbnQiPgorICAgIDx0ZXh0IGNsYXNzPSJ0aXRsZSIgeD0iNTAlIiB5PSIxMCUiIGZvbnQtc2l6ZT0iMTUiIHRleHQtYW5jaG9yPSJtaWRkbGUiID4KKyAgICAgICAgICAgIEpTUCAyLjAgWE1MIFN5bnRheCAoLmpzcHgpIERlbW88L3RleHQ+CisgICAgPHRleHQgY2xhc3M9InRpdGxlIiB4PSI1MCUiIHk9IjE1JSIgZm9udC1zaXplPSIxNSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgPgorICAgICAgICAgICAgVHJ5IGNoYW5naW5nIHRoZSBuYW1lIHBhcmFtZXRlciE8L3RleHQ+CisgICAgPGcgb3BhY2l0eT0iMS4wIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyMjUsIDI1MCkiIGlkPSJyb3RhdGVkVGV4dCI+CisgICAgICA8Yzpmb3JFYWNoIHZhcj0iaSIgYmVnaW49IjEiIGVuZD0iMjQiPgorICAgICAgICA8anNwOnRleHQ+CisgICAgICAgICAgPCFbQ0RBVEFbPGcgb3BhY2l0eT0iMC45NSIgdHJhbnNmb3JtPSJzY2FsZSgxLjA1KSByb3RhdGUoMTUpIj5dXT4KKyAgICAgICAgPC9qc3A6dGV4dD4KKyAgICAgICAgPHRleHQgeD0iMCIgeT0iMCIgdHJhbnNmb3JtPSJzY2FsZSgxLjYsIDEuNikiIGZpbGw9IkRhcmtTbGF0ZUJsdWUiIAorICAgICAgICAgICAgICB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjQwIiBmb250LWZhbWlseT0iU2VyaWYiIAorICAgICAgICAgICAgICBpZD0id29yZHMiPiR7bmFtZX08L3RleHQ+CisgICAgICA8L2M6Zm9yRWFjaD4KKyAgICAgIDxjOmZvckVhY2ggdmFyPSJpIiBiZWdpbj0iMSIgZW5kPSIyNCI+CisgICAgICAgIDxqc3A6dGV4dD48IVtDREFUQVs8L2c+XV0+PC9qc3A6dGV4dD4KKyAgICAgIDwvYzpmb3JFYWNoPgorICAgICAgPHRleHQgc3R5bGU9ImZvbnQtc2l6ZTo3NTtmb250LWZhbWlseTpTZXJpZjtmaWxsOndoaXRlIiAKKyAgICAgICAgICAgIHRleHQtYW5jaG9yPSJtaWRkbGUiPiR7bmFtZX08L3RleHQ+CisgICAgPC9nPgorICA8L2c+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcDIvbWlzYy9jb2RhLmpzcGYgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3AyL21pc2MvY29kYS5qc3BmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxZmFlYzMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3AyL21pc2MvY29kYS5qc3BmCkBAIC0wLDAgKzEsNSBAQAorPGhyPgorPGNlbnRlcj4KK1RoaXMgYmFubmVyIGluY2x1ZGVkIHdpdGggJmx0O2luY2x1ZGUtY29kYSZndDsKKzwvY2VudGVyPgorPGhyPgpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvanNwMi9taXNjL2NvbmZpZy5odG1sIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvanNwMi9taXNjL2NvbmZpZy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MGQ3NzgKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3AyL21pc2MvY29uZmlnLmh0bWwKQEAgLTAsMCArMSwzNCBAQAorPGh0bWw+Cis8IS0tCisgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aGVhZD4KKzx0aXRsZT5WaWV3IFNvdXJjZSBDb2RlPC90aXRsZT4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorPC9oZWFkPgorCis8Ym9keSBiZ2NvbG9yPSIjRkZGRkZGIj4KKzxwPjxmb250IGNvbG9yPSIjMDAwMEZGIj48YSBocmVmPSJjb25maWcuanNwIj48aW1nIHNyYz0iLi4vLi4vaW1hZ2VzL2V4ZWN1dGUuZ2lmIiBhbGlnbj0icmlnaHQiIGJvcmRlcj0iMCI+PC9hPgorPGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+PGltZyBzcmM9Ii4uLy4uL2ltYWdlcy9yZXR1cm4uZ2lmIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGFsaWduPSJyaWdodCIgYm9yZGVyPSIwIj48L2E+PC9mb250PjwvcD4KKworPGgzPjxhIGhyZWY9ImNvbmZpZy5qc3AuaHRtbCI+U291cmNlIENvZGUgZm9yIGNvbmZpZy5qc3A8Zm9udCBjb2xvcj0iIzAwMDBGRiI+PC9hPgorICA8L2ZvbnQ+IDwvaDM+Cis8aDM+PGEgaHJlZj0icHJlbHVkZS5qc3BmLmh0bWwiPlNvdXJjZSBDb2RlIGZvciBwcmVsdWRlLmpzcGY8Zm9udCBjb2xvcj0iIzAwMDBGRiI+PC9hPgorICA8L2ZvbnQ+IDwvaDM+Cis8aDM+PGEgaHJlZj0iY29kYS5qc3BmLmh0bWwiPlNvdXJjZSBDb2RlIGZvciBjb2RhLmpzcGY8Zm9udCBjb2xvcj0iIzAwMDBGRiI+PC9hPgorICA8L2ZvbnQ+IDwvaDM+CisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcDIvbWlzYy9jb25maWcuanNwIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvanNwMi9taXNjL2NvbmZpZy5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzkxYTA4NwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcDIvbWlzYy9jb25maWcuanNwCkBAIC0wLDAgKzEsMzEgQEAKKzwhLS0KKyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzwlQCB0YWdsaWIgcHJlZml4PSJteSIgdXJpPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3RvbWNhdC9qc3AyLWV4YW1wbGUtdGFnbGliIiU+CisgICAgPGgxPkpTUCAyLjAgRXhhbXBsZXMgLSBKU1AgQ29uZmlndXJhdGlvbjwvaDE+CisgICAgPGhyPgorICAgIDxwPlVzaW5nIGEgJmx0O2pzcC1wcm9wZXJ0eS1ncm91cCZndDsgZWxlbWVudCBpbiB0aGUgd2ViLnhtbCAKKyAgICBkZXBsb3ltZW50IGRlc2NyaXB0b3IsIHRoaXMgSlNQIHBhZ2UgaGFzIGJlZW4gY29uZmlndXJlZCBpbiB0aGUKKyAgICBmb2xsb3dpbmcgd2F5czo8L3A+CisgICAgPHVsPgorICAgICAgPGxpPlVzZXMgJmx0O2luY2x1ZGUtcHJlbHVkZSZndDsgdG8gaW5jbHVkZSB0aGUgdG9wIGJhbm5lci48L2xpPgorICAgICAgPGxpPlVzZXMgJmx0O2luY2x1ZGUtY29kYSZndDsgdG8gaW5jbHVkZSB0aGUgYm90dG9tIGJhbm5lci48L2xpPgorICAgICAgPGxpPlVzZXMgJmx0O3NjcmlwdGluZy1pbnZhbGlkJmd0OyB0cnVlIHRvIGRpc2FibGUgCisJICAmbHQ7JSBzY3JpcHRpbmcgJSZndDsgZWxlbWVudHM8L2xpPgorICAgICAgPGxpPlVzZXMgJmx0O2VsLWlnbm9yZWQmZ3Q7IHRydWUgdG8gZGlzYWJsZSAke0VMfSBlbGVtZW50czwvbGk+CisgICAgICA8bGk+VXNlcyAmbHQ7cGFnZS1lbmNvZGluZyZndDsgSVNPLTg4NTktMSB0byBzZXQgdGhlIHBhZ2UgZW5jb2RpbmcgKHRob3VnaCB0aGlzIGlzIHRoZSBkZWZhdWx0IGFueXdheSk8L2xpPgorICAgIDwvdWw+CisgICAgVGhlcmUgYXJlIHZhcmlvdXMgb3RoZXIgY29uZmlndXJhdGlvbiBvcHRpb25zIHRoYXQgY2FuIGJlIHVzZWQuCisKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcDIvbWlzYy9keW5hbWljYXR0cnMuaHRtbCBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcDIvbWlzYy9keW5hbWljYXR0cnMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDcwNzJhCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvanNwMi9taXNjL2R5bmFtaWNhdHRycy5odG1sCkBAIC0wLDAgKzEsMzIgQEAKKzxodG1sPgorPCEtLQorICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGhlYWQ+Cis8dGl0bGU+VmlldyBTb3VyY2UgQ29kZTwvdGl0bGU+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKzwvaGVhZD4KKworPGJvZHkgYmdjb2xvcj0iI0ZGRkZGRiI+Cis8cD48Zm9udCBjb2xvcj0iIzAwMDBGRiI+PGEgaHJlZj0iZHluYW1pY2F0dHJzLmpzcCI+PGltZyBzcmM9Ii4uLy4uL2ltYWdlcy9leGVjdXRlLmdpZiIgYWxpZ249InJpZ2h0IiBib3JkZXI9IjAiPjwvYT4KKzxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPjxpbWcgc3JjPSIuLi8uLi9pbWFnZXMvcmV0dXJuLmdpZiIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiBhbGlnbj0icmlnaHQiIGJvcmRlcj0iMCI+PC9hPjwvZm9udD48L3A+CisKKzxoMz48YSBocmVmPSJkeW5hbWljYXR0cnMuanNwLmh0bWwiPlNvdXJjZSBDb2RlIGZvciBkeW5hbWljYXR0cnMuanNwPGZvbnQgY29sb3I9IiMwMDAwRkYiPjwvYT4KKyAgPC9mb250PiA8L2gzPgorPGgzPjxhIGhyZWY9IkVjaG9BdHRyaWJ1dGVzVGFnLmphdmEuaHRtbCI+U291cmNlIENvZGUgZm9yIEVjaG9BdHRyaWJ1dGVzVGFnLmphdmE8Zm9udCBjb2xvcj0iIzAwMDBGRiI+PC9hPgorICA8L2ZvbnQ+IDwvaDM+CisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcDIvbWlzYy9keW5hbWljYXR0cnMuanNwIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvanNwMi9taXNjL2R5bmFtaWNhdHRycy5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODcyMTEwOAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcDIvbWlzYy9keW5hbWljYXR0cnMuanNwCkBAIC0wLDAgKzEsNDMgQEAKKzwhLS0KKyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzwlQCB0YWdsaWIgcHJlZml4PSJteSIgdXJpPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3RvbWNhdC9qc3AyLWV4YW1wbGUtdGFnbGliIiU+Cis8aHRtbD4KKyAgPGhlYWQ+CisgICAgPHRpdGxlPkpTUCAyLjAgRXhhbXBsZXMgLSBEeW5hbWljIEF0dHJpYnV0ZXM8L3RpdGxlPgorICA8L2hlYWQ+CisgIDxib2R5PgorICAgIDxoMT5KU1AgMi4wIEV4YW1wbGVzIC0gRHluYW1pYyBBdHRyaWJ1dGVzPC9oMT4KKyAgICA8aHI+CisgICAgPHA+VGhpcyBKU1AgcGFnZSBpbnZva2VzIGEgY3VzdG9tIHRhZyB0aGF0IGFjY2VwdHMgYSBkeW5hbWljIHNldCAKKyAgICBvZiBhdHRyaWJ1dGVzLiAgVGhlIHRhZyBlY2hvZXMgdGhlIG5hbWUgYW5kIHZhbHVlIG9mIGFsbCBhdHRyaWJ1dGVzCisgICAgcGFzc2VkIHRvIGl0LjwvcD4KKyAgICA8aHI+CisgICAgPGgyPkludm9jYXRpb24gMSAoc2l4IGF0dHJpYnV0ZXMpPC9oMj4KKyAgICA8dWw+CisgICAgICA8bXk6ZWNob0F0dHJpYnV0ZXMgeD0iMSIgeT0iMiIgej0iMyIgcj0icmVkIiBnPSJncmVlbiIgYj0iYmx1ZSIvPgorICAgIDwvdWw+CisgICAgPGgyPkludm9jYXRpb24gMiAoemVybyBhdHRyaWJ1dGVzKTwvaDI+CisgICAgPHVsPgorICAgICAgPG15OmVjaG9BdHRyaWJ1dGVzLz4KKyAgICA8L3VsPgorICAgIDxoMj5JbnZvY2F0aW9uIDMgKHRocmVlIGF0dHJpYnV0ZXMpPC9oMj4KKyAgICA8dWw+CisgICAgICA8bXk6ZWNob0F0dHJpYnV0ZXMgZG9nTmFtZT0iU2NydWZmeSIgCisJICAgCQkgY2F0TmFtZT0iRmx1ZmZ5IiAKKwkJCSBibG93ZmlzaE5hbWU9IlB1ZmZ5Ii8+CisgICAgPC91bD4KKyAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvanNwMi9taXNjL3ByZWx1ZGUuanNwZiBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcDIvbWlzYy9wcmVsdWRlLmpzcGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTMwYThkOAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcDIvbWlzYy9wcmVsdWRlLmpzcGYKQEAgLTAsMCArMSw1IEBACis8aHI+Cis8Y2VudGVyPgorVGhpcyBiYW5uZXIgaW5jbHVkZWQgd2l0aCAmbHQ7aW5jbHVkZS1wcmVsdWRlJmd0OworPC9jZW50ZXI+Cis8aHI+CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3AyL3NpbXBsZXRhZy9ib29rLmh0bWwgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3AyL3NpbXBsZXRhZy9ib29rLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM4YTRjOQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcDIvc2ltcGxldGFnL2Jvb2suaHRtbApAQCAtMCwwICsxLDM2IEBACis8aHRtbD4KKzwhLS0KKyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxoZWFkPgorPHRpdGxlPlZpZXcgU291cmNlIENvZGU8L3RpdGxlPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Cis8L2hlYWQ+CisKKzxib2R5IGJnY29sb3I9IiNGRkZGRkYiPgorPHA+PGZvbnQgY29sb3I9IiMwMDAwRkYiPjxhIGhyZWY9ImJvb2suanNwIj48aW1nIHNyYz0iLi4vLi4vaW1hZ2VzL2V4ZWN1dGUuZ2lmIiBhbGlnbj0icmlnaHQiIGJvcmRlcj0iMCI+PC9hPgorPGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+PGltZyBzcmM9Ii4uLy4uL2ltYWdlcy9yZXR1cm4uZ2lmIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGFsaWduPSJyaWdodCIgYm9yZGVyPSIwIj48L2E+PC9mb250PjwvcD4KKworPGgzPjxhIGhyZWY9ImJvb2suanNwLmh0bWwiPlNvdXJjZSBDb2RlIGZvciB0aGUgQm9vayBFeGFtcGxlIEpTUDxmb250IGNvbG9yPSIjMDAwMEZGIj48L2E+CisgIDwvZm9udD4gPC9oMz4KKzxoMz48YSBocmVmPSJGaW5kQm9va1NpbXBsZVRhZy5qYXZhLmh0bWwiPlNvdXJjZSBDb2RlIGZvciB0aGUgRmluZEJvb2sgU2ltcGxlVGFnIEhhbmRsZXI8Zm9udCBjb2xvcj0iIzAwMDBGRiI+PC9hPgorICA8L2ZvbnQ+IDwvaDM+Cis8aDM+PGEgaHJlZj0iQm9va0JlYW4uamF2YS5odG1sIj5Tb3VyY2UgQ29kZSBmb3IgQm9va0JlYW48Zm9udCBjb2xvcj0iIzAwMDBGRiI+PC9hPgorICA8L2ZvbnQ+IDwvaDM+Cis8aDM+PGEgaHJlZj0iRnVuY3Rpb25zLmphdmEuaHRtbCI+U291cmNlIENvZGUgZm9yIHRoZSBFTCBGdW5jdGlvbnM8Zm9udCBjb2xvcj0iIzAwMDBGRiI+PC9hPgorICA8L2ZvbnQ+IDwvaDM+CisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcDIvc2ltcGxldGFnL2Jvb2suanNwIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvanNwMi9zaW1wbGV0YWcvYm9vay5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYyYzRjNwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcDIvc2ltcGxldGFnL2Jvb2suanNwCkBAIC0wLDAgKzEsNTQgQEAKKzwhLS0KKyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzwlQCB0YWdsaWIgcHJlZml4PSJteSIgdXJpPSIvV0VCLUlORi9qc3AyL2pzcDItZXhhbXBsZS10YWdsaWIudGxkIiAlPgorPGh0bWw+CisgIDxoZWFkPgorICAgIDx0aXRsZT5KU1AgMi4wIEV4YW1wbGVzIC0gQm9vayBTaW1wbGVUYWcgSGFuZGxlcjwvdGl0bGU+CisgIDwvaGVhZD4KKyAgPGJvZHk+CisgICAgPGgxPkpTUCAyLjAgRXhhbXBsZXMgLSBCb29rIFNpbXBsZVRhZyBIYW5kbGVyPC9oMT4KKyAgICA8aHI+CisgICAgPHA+SWxsdXN0cmF0ZXMgYSBzZW1pLXJlYWxpc3RpYyB1c2Ugb2YgU2ltcGxlVGFnIGFuZCB0aGUgRXhwcmVzc2lvbiAKKyAgICBMYW5ndWFnZS4gIEZpcnN0LCBhICZsdDtteTpmaW5kQm9vayZndDsgdGFnIGlzIGludm9rZWQgdG8gcG9wdWxhdGUgCisgICAgdGhlIHBhZ2UgY29udGV4dCB3aXRoIGEgQm9va0JlYW4uICBUaGVuLCB0aGUgYm9va3MgZmllbGRzIGFyZSBwcmludGVkIAorICAgIGluIGFsbCBjYXBzLjwvcD4KKyAgICA8YnI+CisgICAgPGI+PHU+UmVzdWx0OjwvdT48L2I+PGJyPgorICAgIDxteTpmaW5kQm9vayB2YXI9ImJvb2siLz4KKyAgICA8dGFibGUgYm9yZGVyPSIxIj4KKyAgICAgICAgPHRoZWFkPgorCSAgICA8dGQ+PGI+RmllbGQ8L2I+PC90ZD4KKwkgICAgPHRkPjxiPlZhbHVlPC9iPjwvdGQ+CisJICAgIDx0ZD48Yj5DYXBpdGFsaXplZDwvYj48L3RkPgorCTwvdGhlYWQ+CisJPHRyPgorCSAgICA8dGQ+VGl0bGU8L3RkPgorCSAgICA8dGQ+JHtib29rLnRpdGxlfTwvdGQ+CisJICAgIDx0ZD4ke215OmNhcHMoYm9vay50aXRsZSl9PC90ZD4KKwk8L3RyPgorCTx0cj4KKwkgICAgPHRkPkF1dGhvcjwvdGQ+CisJICAgIDx0ZD4ke2Jvb2suYXV0aG9yfTwvdGQ+CisJICAgIDx0ZD4ke215OmNhcHMoYm9vay5hdXRob3IpfTwvdGQ+CisJPC90cj4KKwk8dHI+CisJICAgIDx0ZD5JU0JOPC90ZD4KKwkgICAgPHRkPiR7Ym9vay5pc2JufTwvdGQ+CisJICAgIDx0ZD4ke215OmNhcHMoYm9vay5pc2JuKX08L3RkPgorCTwvdHI+CisgICAgPC90YWJsZT4KKyAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvanNwMi9zaW1wbGV0YWcvaGVsbG8uaHRtbCBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcDIvc2ltcGxldGFnL2hlbGxvLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQzYjBhYQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcDIvc2ltcGxldGFnL2hlbGxvLmh0bWwKQEAgLTAsMCArMSwzMiBAQAorPGh0bWw+Cis8IS0tCisgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aGVhZD4KKzx0aXRsZT5WaWV3IFNvdXJjZSBDb2RlPC90aXRsZT4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorPC9oZWFkPgorCis8Ym9keSBiZ2NvbG9yPSIjRkZGRkZGIj4KKzxwPjxmb250IGNvbG9yPSIjMDAwMEZGIj48YSBocmVmPSJoZWxsby5qc3AiPjxpbWcgc3JjPSIuLi8uLi9pbWFnZXMvZXhlY3V0ZS5naWYiIGFsaWduPSJyaWdodCIgYm9yZGVyPSIwIj48L2E+Cis8YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj48aW1nIHNyYz0iLi4vLi4vaW1hZ2VzL3JldHVybi5naWYiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgYWxpZ249InJpZ2h0IiBib3JkZXI9IjAiPjwvYT48L2ZvbnQ+PC9wPgorCis8aDM+PGEgaHJlZj0iaGVsbG8uanNwLmh0bWwiPlNvdXJjZSBDb2RlIGZvciB0aGUgSGVsbG8gV29ybGQgVGFnIEV4YW1wbGUgSlNQPGZvbnQgY29sb3I9IiMwMDAwRkYiPjwvYT4KKyAgPC9mb250PiA8L2gzPgorPGgzPjxhIGhyZWY9IkhlbGxvV29ybGRTaW1wbGVUYWcuamF2YS5odG1sIj5Tb3VyY2UgQ29kZSBmb3IgdGhlIEhlbGxvIFdvcmxkIFNpbXBsZVRhZyBIYW5kbGVyPGZvbnQgY29sb3I9IiMwMDAwRkYiPjwvYT4KKyAgPC9mb250PiA8L2gzPgorCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3AyL3NpbXBsZXRhZy9oZWxsby5qc3AgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3AyL3NpbXBsZXRhZy9oZWxsby5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg2YThjOQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcDIvc2ltcGxldGFnL2hlbGxvLmpzcApAQCAtMCwwICsxLDMwIEBACis8IS0tCisgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8JUAgdGFnbGliIHByZWZpeD0ibXl0YWciIHVyaT0iL1dFQi1JTkYvanNwMi9qc3AyLWV4YW1wbGUtdGFnbGliLnRsZCIgJT4KKzxodG1sPgorICA8aGVhZD4KKyAgICA8dGl0bGU+SlNQIDIuMCBFeGFtcGxlcyAtIEhlbGxvIFdvcmxkIFNpbXBsZVRhZyBIYW5kbGVyPC90aXRsZT4KKyAgPC9oZWFkPgorICA8Ym9keT4KKyAgICA8aDE+SlNQIDIuMCBFeGFtcGxlcyAtIEhlbGxvIFdvcmxkIFNpbXBsZVRhZyBIYW5kbGVyPC9oMT4KKyAgICA8aHI+CisgICAgPHA+VGhpcyB0YWcgaGFuZGxlciBzaW1wbHkgZWNob3MgIkhlbGxvLCBXb3JsZCEiICBJdCdzIGFuIGV4YW1wbGUgb2YKKyAgICBhIHZlcnkgYmFzaWMgU2ltcGxlVGFnIGhhbmRsZXIgd2l0aCBubyBib2R5LjwvcD4KKyAgICA8YnI+CisgICAgPGI+PHU+UmVzdWx0OjwvdT48L2I+CisgICAgPG15dGFnOmhlbGxvV29ybGQvPgorICA8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3AyL3NpbXBsZXRhZy9yZXBlYXQuaHRtbCBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcDIvc2ltcGxldGFnL3JlcGVhdC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkZGMzOWQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3AyL3NpbXBsZXRhZy9yZXBlYXQuaHRtbApAQCAtMCwwICsxLDMyIEBACis8aHRtbD4KKzwhLS0KKyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxoZWFkPgorPHRpdGxlPlZpZXcgU291cmNlIENvZGU8L3RpdGxlPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Cis8L2hlYWQ+CisKKzxib2R5IGJnY29sb3I9IiNGRkZGRkYiPgorPHA+PGZvbnQgY29sb3I9IiMwMDAwRkYiPjxhIGhyZWY9InJlcGVhdC5qc3AiPjxpbWcgc3JjPSIuLi8uLi9pbWFnZXMvZXhlY3V0ZS5naWYiIGFsaWduPSJyaWdodCIgYm9yZGVyPSIwIj48L2E+Cis8YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj48aW1nIHNyYz0iLi4vLi4vaW1hZ2VzL3JldHVybi5naWYiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgYWxpZ249InJpZ2h0IiBib3JkZXI9IjAiPjwvYT48L2ZvbnQ+PC9wPgorCis8aDM+PGEgaHJlZj0icmVwZWF0LmpzcC5odG1sIj5Tb3VyY2UgQ29kZSBmb3IgdGhlIFJlcGVhdCBUYWcgRXhhbXBsZSBKU1A8Zm9udCBjb2xvcj0iIzAwMDBGRiI+PC9hPgorICA8L2ZvbnQ+IDwvaDM+Cis8aDM+PGEgaHJlZj0iUmVwZWF0U2ltcGxlVGFnLmphdmEuaHRtbCI+U291cmNlIENvZGUgZm9yIHRoZSBSZXBlYXQgU2ltcGxlVGFnIEhhbmRsZXI8Zm9udCBjb2xvcj0iIzAwMDBGRiI+PC9hPgorICA8L2ZvbnQ+IDwvaDM+CisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcDIvc2ltcGxldGFnL3JlcGVhdC5qc3AgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3AyL3NpbXBsZXRhZy9yZXBlYXQuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0ZDQ2MzAKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3AyL3NpbXBsZXRhZy9yZXBlYXQuanNwCkBAIC0wLDAgKzEsMzggQEAKKzwhLS0KKyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzwlQCB0YWdsaWIgcHJlZml4PSJteXRhZyIgdXJpPSIvV0VCLUlORi9qc3AyL2pzcDItZXhhbXBsZS10YWdsaWIudGxkIiAlPgorPGh0bWw+CisgIDxoZWFkPgorICAgIDx0aXRsZT5KU1AgMi4wIEV4YW1wbGVzIC0gUmVwZWF0IFNpbXBsZVRhZyBIYW5kbGVyPC90aXRsZT4KKyAgPC9oZWFkPgorICA8Ym9keT4KKyAgICA8aDE+SlNQIDIuMCBFeGFtcGxlcyAtIFJlcGVhdCBTaW1wbGVUYWcgSGFuZGxlcjwvaDE+CisgICAgPGhyPgorICAgIDxwPlRoaXMgdGFnIGhhbmRsZXIgYWNjZXB0cyBhICJudW0iIHBhcmFtZXRlciBhbmQgcmVwZWF0cyB0aGUgYm9keSBvZiB0aGUKKyAgICB0YWcgIm51bSIgdGltZXMuICBJdCdzIGEgc2ltcGxlIGV4YW1wbGUsIGJ1dCB0aGUgaW1wbGVtZW50YXRpb24gb2YgCisgICAgc3VjaCBhIHRhZyBpbiBKU1AgMi4wIGlzIHN1YnN0YW50aWFsbHkgc2ltcGxlciB0aGFuIHRoZSBlcXVpdmFsZW50IAorICAgIEpTUCAxLjItc3R5bGUgY2xhc3NpYyB0YWcgaGFuZGxlci48L3A+CisgICAgPHA+VGhlIGJvZHkgb2YgdGhlIHRhZyBpcyBlbmNhcHN1bGF0ZWQgaW4gYSAiSlNQIEZyYWdtZW50IiBhbmQgcGFzc2VkCisgICAgdG8gdGhlIHRhZyBoYW5kbGVyLCB3aGljaCB0aGVuIGV4ZWN1dGVzIGl0IGZpdmUgdGltZXMsIGluc2lkZSBhIAorICAgIGZvciBsb29wLiAgVGhlIHRhZyBoYW5kbGVyIHBhc3NlcyBpbiB0aGUgY3VycmVudCBpbnZvY2F0aW9uIGluIGEKKyAgICBzY29wZWQgdmFyaWFibGUgY2FsbGVkIGNvdW50LCB3aGljaCBjYW4gYmUgYWNjZXNzZWQgdXNpbmcgdGhlIEVMLjwvcD4KKyAgICA8YnI+CisgICAgPGI+PHU+UmVzdWx0OjwvdT48L2I+PGJyPgorICAgIDxteXRhZzpyZXBlYXQgbnVtPSI1Ij4KKyAgICAgIEludm9jYXRpb24gJHtjb3VudH0gb2YgNTxicj4KKyAgICA8L215dGFnOnJlcGVhdD4KKyAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvanNwMi90YWdmaWxlcy9oZWxsby5odG1sIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvanNwMi90YWdmaWxlcy9oZWxsby5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1ZGMyYzIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3AyL3RhZ2ZpbGVzL2hlbGxvLmh0bWwKQEAgLTAsMCArMSwzMiBAQAorPGh0bWw+Cis8IS0tCisgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aGVhZD4KKzx0aXRsZT5WaWV3IFNvdXJjZSBDb2RlPC90aXRsZT4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorPC9oZWFkPgorCis8Ym9keSBiZ2NvbG9yPSIjRkZGRkZGIj4KKzxwPjxmb250IGNvbG9yPSIjMDAwMEZGIj48YSBocmVmPSJoZWxsby5qc3AiPjxpbWcgc3JjPSIuLi8uLi9pbWFnZXMvZXhlY3V0ZS5naWYiIGFsaWduPSJyaWdodCIgYm9yZGVyPSIwIj48L2E+Cis8YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj48aW1nIHNyYz0iLi4vLi4vaW1hZ2VzL3JldHVybi5naWYiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgYWxpZ249InJpZ2h0IiBib3JkZXI9IjAiPjwvYT48L2ZvbnQ+PC9wPgorCis8aDM+PGEgaHJlZj0iaGVsbG8uanNwLmh0bWwiPlNvdXJjZSBDb2RlIGZvciBoZWxsby5qc3A8Zm9udCBjb2xvcj0iIzAwMDBGRiI+PC9hPgorICA8L2ZvbnQ+IDwvaDM+Cis8aDM+PGEgaHJlZj0iaGVsbG9Xb3JsZC50YWcuaHRtbCI+U291cmNlIENvZGUgZm9yIGhlbGxvV29ybGQudGFnPGZvbnQgY29sb3I9IiMwMDAwRkYiPjwvYT4KKyAgPC9mb250PiA8L2gzPgorCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3AyL3RhZ2ZpbGVzL2hlbGxvLmpzcCBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcDIvdGFnZmlsZXMvaGVsbG8uanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmZDA2YjIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3AyL3RhZ2ZpbGVzL2hlbGxvLmpzcApAQCAtMCwwICsxLDM0IEBACis8IS0tCisgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8JUAgdGFnbGliIHByZWZpeD0idGFncyIgdGFnZGlyPSIvV0VCLUlORi90YWdzIiAlPgorPGh0bWw+CisgIDxoZWFkPgorICAgIDx0aXRsZT5KU1AgMi4wIEV4YW1wbGVzIC0gSGVsbG8gV29ybGQgVXNpbmcgYSBUYWcgRmlsZTwvdGl0bGU+CisgIDwvaGVhZD4KKyAgPGJvZHk+CisgICAgPGgxPkpTUCAyLjAgRXhhbXBsZXMgLSBIZWxsbyBXb3JsZCBVc2luZyBhIFRhZyBGaWxlPC9oMT4KKyAgICA8aHI+CisgICAgPHA+VGhpcyBKU1AgcGFnZSBpbnZva2VzIGEgY3VzdG9tIHRhZyB0aGF0IHNpbXBseSBlY2hvcyAiSGVsbG8sIFdvcmxkISIgIAorICAgIFRoZSBjdXN0b20gdGFnIGlzIGdlbmVyYXRlZCBmcm9tIGEgdGFnIGZpbGUgaW4gdGhlIC9XRUItSU5GL3RhZ3MKKyAgICBkaXJlY3RvcnkuPC9wPgorICAgIDxwPk5vdGljZSB0aGF0IHdlIGRpZCBub3QgbmVlZCB0byB3cml0ZSBhIFRMRCBmb3IgdGhpcyB0YWcuICBXZSBqdXN0CisgICAgY3JlYXRlZCAvV0VCLUlORi90YWdzL2hlbGxvV29ybGQudGFnLCBpbXBvcnRlZCBpdCB1c2luZyB0aGUgdGFnbGliCisgICAgZGlyZWN0aXZlLCBhbmQgdXNlZCBpdCE8L3A+CisgICAgPGJyPgorICAgIDxiPjx1PlJlc3VsdDo8L3U+PC9iPgorICAgIDx0YWdzOmhlbGxvV29ybGQvPgorICA8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3AyL3RhZ2ZpbGVzL3BhbmVsLmh0bWwgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3AyL3RhZ2ZpbGVzL3BhbmVsLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNkYjVjNwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcDIvdGFnZmlsZXMvcGFuZWwuaHRtbApAQCAtMCwwICsxLDMyIEBACis8aHRtbD4KKzwhLS0KKyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxoZWFkPgorPHRpdGxlPlZpZXcgU291cmNlIENvZGU8L3RpdGxlPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Cis8L2hlYWQ+CisKKzxib2R5IGJnY29sb3I9IiNGRkZGRkYiPgorPHA+PGZvbnQgY29sb3I9IiMwMDAwRkYiPjxhIGhyZWY9InBhbmVsLmpzcCI+PGltZyBzcmM9Ii4uLy4uL2ltYWdlcy9leGVjdXRlLmdpZiIgYWxpZ249InJpZ2h0IiBib3JkZXI9IjAiPjwvYT4KKzxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPjxpbWcgc3JjPSIuLi8uLi9pbWFnZXMvcmV0dXJuLmdpZiIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiBhbGlnbj0icmlnaHQiIGJvcmRlcj0iMCI+PC9hPjwvZm9udD48L3A+CisKKzxoMz48YSBocmVmPSJwYW5lbC5qc3AuaHRtbCI+U291cmNlIENvZGUgZm9yIHBhbmVsLmpzcDxmb250IGNvbG9yPSIjMDAwMEZGIj48L2E+CisgIDwvZm9udD4gPC9oMz4KKzxoMz48YSBocmVmPSJwYW5lbC50YWcuaHRtbCI+U291cmNlIENvZGUgZm9yIHBhbmVsLnRhZzxmb250IGNvbG9yPSIjMDAwMEZGIj48L2E+CisgIDwvZm9udD4gPC9oMz4KKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvanNwMi90YWdmaWxlcy9wYW5lbC5qc3AgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3AyL3RhZ2ZpbGVzL3BhbmVsLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjA0ZTQzCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvanNwMi90YWdmaWxlcy9wYW5lbC5qc3AKQEAgLTAsMCArMSw1NyBAQAorPCEtLQorICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPCVAIHRhZ2xpYiBwcmVmaXg9InRhZ3MiIHRhZ2Rpcj0iL1dFQi1JTkYvdGFncyIgJT4KKzxodG1sPgorICA8aGVhZD4KKyAgICA8dGl0bGU+SlNQIDIuMCBFeGFtcGxlcyAtIFBhbmVscyB1c2luZyBUYWcgRmlsZXM8L3RpdGxlPgorICA8L2hlYWQ+CisgIDxib2R5PgorICAgIDxoMT5KU1AgMi4wIEV4YW1wbGVzIC0gUGFuZWxzIHVzaW5nIFRhZyBGaWxlczwvaDE+CisgICAgPGhyPgorICAgIDxwPlRoaXMgSlNQIHBhZ2UgaW52b2tlcyBhIGN1c3RvbSB0YWcgdGhhdCBkcmF3cyBhIAorICAgIHBhbmVsIGFyb3VuZCB0aGUgY29udGVudHMgb2YgdGhlIHRhZyBib2R5LiAgTm9ybWFsbHksIHN1Y2ggYSB0YWcgCisgICAgaW1wbGVtZW50YXRpb24gd291bGQgcmVxdWlyZSBhIEphdmEgY2xhc3Mgd2l0aCBtYW55IHByaW50bG4oKSBzdGF0ZW1lbnRzLAorICAgIG91dHB1dHRpbmcgSFRNTC4gIEluc3RlYWQsIHdlIGNhbiB1c2UgYSAudGFnIGZpbGUgYXMgYSB0ZW1wbGF0ZSwKKyAgICBhbmQgd2UgZG9uJ3QgbmVlZCB0byB3cml0ZSBhIHNpbmdsZSBsaW5lIG9mIEphdmEgb3IgZXZlbiBhIFRMRCE8L3A+CisgICAgPGhyPgorICAgIDx0YWJsZSBib3JkZXI9IjAiPgorICAgICAgPHRyIHZhbGlnbj0idG9wIj4KKyAgICAgICAgPHRkPgorICAgICAgICAgIDx0YWdzOnBhbmVsIGNvbG9yPSIjZmY4MDgwIiBiZ2NvbG9yPSIjZmZjMGMwIiB0aXRsZT0iUGFuZWwgMSI+CisJICAgIEZpcnN0IHBhbmVsLjxici8+CisJICA8L3RhZ3M6cGFuZWw+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZD4KKyAgICAgICAgICA8dGFnczpwYW5lbCBjb2xvcj0iIzgwZmY4MCIgYmdjb2xvcj0iI2MwZmZjMCIgdGl0bGU9IlBhbmVsIDIiPgorCSAgICBTZWNvbmQgcGFuZWwuPGJyLz4KKwkgICAgU2Vjb25kIHBhbmVsLjxici8+CisJICAgIFNlY29uZCBwYW5lbC48YnIvPgorCSAgICBTZWNvbmQgcGFuZWwuPGJyLz4KKwkgIDwvdGFnczpwYW5lbD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkPgorICAgICAgICAgIDx0YWdzOnBhbmVsIGNvbG9yPSIjODA4MGZmIiBiZ2NvbG9yPSIjYzBjMGZmIiB0aXRsZT0iUGFuZWwgMyI+CisJICAgIFRoaXJkIHBhbmVsLjxici8+CisgICAgICAgICAgICA8dGFnczpwYW5lbCBjb2xvcj0iI2ZmODBmZiIgYmdjb2xvcj0iI2ZmYzBmZiIgdGl0bGU9IklubmVyIj4KKwkgICAgICBBIHBhbmVsIGluIGEgcGFuZWwuCisJICAgIDwvdGFnczpwYW5lbD4KKwkgICAgVGhpcmQgcGFuZWwuPGJyLz4KKwkgIDwvdGFnczpwYW5lbD4KKyAgICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgPC90YWJsZT4KKyAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvanNwMi90YWdmaWxlcy9wcm9kdWN0cy5odG1sIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvanNwMi90YWdmaWxlcy9wcm9kdWN0cy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwM2U4NGQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3AyL3RhZ2ZpbGVzL3Byb2R1Y3RzLmh0bWwKQEAgLTAsMCArMSwyMSBAQAorPGh0bWw+Cis8IS0tCisgIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAorICByZXNlcnZlZC4KKy0tPgorPGhlYWQ+Cis8dGl0bGU+VmlldyBTb3VyY2UgQ29kZTwvdGl0bGU+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKzwvaGVhZD4KKworPGJvZHkgYmdjb2xvcj0iI0ZGRkZGRiI+Cis8cD48Zm9udCBjb2xvcj0iIzAwMDBGRiI+PGEgaHJlZj0icHJvZHVjdHMuanNwIj48aW1nIHNyYz0iLi4vLi4vaW1hZ2VzL2V4ZWN1dGUuZ2lmIiBhbGlnbj0icmlnaHQiIGJvcmRlcj0iMCI+PC9hPgorPGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+PGltZyBzcmM9Ii4uLy4uL2ltYWdlcy9yZXR1cm4uZ2lmIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGFsaWduPSJyaWdodCIgYm9yZGVyPSIwIj48L2E+PC9mb250PjwvcD4KKworPGgzPjxhIGhyZWY9InByb2R1Y3RzLmpzcC5odG1sIj5Tb3VyY2UgQ29kZSBmb3IgcHJvZHVjdHMuanNwPGZvbnQgY29sb3I9IiMwMDAwRkYiPjwvYT4KKyAgPC9mb250PiA8L2gzPgorPGgzPjxhIGhyZWY9ImRpc3BsYXlQcm9kdWN0cy50YWcuaHRtbCI+U291cmNlIENvZGUgZm9yIGRpc3BsYXlQcm9kdWN0cy50YWc8Zm9udCBjb2xvcj0iIzAwMDBGRiI+PC9hPgorICA8L2ZvbnQ+IDwvaDM+CisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcDIvdGFnZmlsZXMvcHJvZHVjdHMuanNwIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvanNwMi90YWdmaWxlcy9wcm9kdWN0cy5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZhNzM1NQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcDIvdGFnZmlsZXMvcHJvZHVjdHMuanNwCkBAIC0wLDAgKzEsNTMgQEAKKzwhLS0KKyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzwlQCB0YWdsaWIgcHJlZml4PSJ0YWdzIiB0YWdkaXI9Ii9XRUItSU5GL3RhZ3MiICU+Cis8aHRtbD4KKyAgPGhlYWQ+CisgICAgPHRpdGxlPkpTUCAyLjAgRXhhbXBsZXMgLSBEaXNwbGF5IFByb2R1Y3RzIFRhZyBGaWxlPC90aXRsZT4KKyAgPC9oZWFkPgorICA8Ym9keT4KKyAgICA8aDE+SlNQIDIuMCBFeGFtcGxlcyAtIERpc3BsYXkgUHJvZHVjdHMgVGFnIEZpbGU8L2gxPgorICAgIDxocj4KKyAgICA8cD5UaGlzIEpTUCBwYWdlIGludm9rZXMgYSB0YWcgZmlsZSB0aGF0IGRpc3BsYXlzIGEgbGlzdGluZyBvZiAKKyAgICBwcm9kdWN0cy4gIFRoZSBjdXN0b20gdGFnIGFjY2VwdHMgdHdvIGZyYWdtZW50cyB0aGF0IGVuYWJsZQorICAgIGN1c3RvbWl6YXRpb24gb2YgYXBwZWFyYW5jZS4gIE9uZSBmb3Igd2hlbiB0aGUgcHJvZHVjdCBpcyBvbiBzYWxlCisgICAgYW5kIG9uZSBmb3Igbm9ybWFsIHByaWNlLjwvcD4KKyAgICA8cD5UaGUgdGFnIGlzIGludm9rZWQgdHdpY2UsIHVzaW5nIGRpZmZlcmVudCBzdHlsZXM8L3A+CisgICAgPGhyPgorICAgIDxoMj5Qcm9kdWN0czwvaDI+CisgICAgPHRhZ3M6ZGlzcGxheVByb2R1Y3RzPgorICAgICAgPGpzcDphdHRyaWJ1dGUgbmFtZT0ibm9ybWFsUHJpY2UiPgorCUl0ZW06ICR7bmFtZX08YnIvPgorCVByaWNlOiAke3ByaWNlfQorICAgICAgPC9qc3A6YXR0cmlidXRlPgorICAgICAgPGpzcDphdHRyaWJ1dGUgbmFtZT0ib25TYWxlIj4KKwlJdGVtOiAke25hbWV9PGJyLz4KKwk8Zm9udCBjb2xvcj0icmVkIj48c3RyaWtlPldhczogJHtvcmlnUHJpY2V9PC9zdHJpa2U+PC9mb250Pjxici8+CisJPGI+Tm93OiAke3NhbGVQcmljZX08L2I+CisgICAgICA8L2pzcDphdHRyaWJ1dGU+CisgICAgPC90YWdzOmRpc3BsYXlQcm9kdWN0cz4KKyAgICA8aHI+CisgICAgPGgyPlByb2R1Y3RzIChTYW1lIHRhZywgYWx0ZXJuYXRlIHN0eWxlKTwvaDI+CisgICAgPHRhZ3M6ZGlzcGxheVByb2R1Y3RzPgorICAgICAgPGpzcDphdHRyaWJ1dGUgbmFtZT0ibm9ybWFsUHJpY2UiPgorCTxiPiR7bmFtZX08L2I+IEAgJHtwcmljZX0gZWEuCisgICAgICA8L2pzcDphdHRyaWJ1dGU+CisgICAgICA8anNwOmF0dHJpYnV0ZSBuYW1lPSJvblNhbGUiPgorCTxiPiR7bmFtZX08L2I+IEAgJHtzYWxlUHJpY2V9IGVhLiAod2FzOiAke29yaWdQcmljZX0pCisgICAgICA8L2pzcDphdHRyaWJ1dGU+CisgICAgPC90YWdzOmRpc3BsYXlQcm9kdWN0cz4KKyAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvanNwdG9zZXJ2L2hlbGxvLmpzcCBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcHRvc2Vydi9oZWxsby5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE4MDdmMwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcHRvc2Vydi9oZWxsby5qc3AKQEAgLTAsMCArMSwyNSBAQAorPGh0bWw+Cis8IS0tCisgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Ym9keSBiZ2NvbG9yPSJ3aGl0ZSI+CisKKzxoMT4KK0kgaGF2ZSBiZWVuIGludm9rZWQgYnkKKzwlIG91dC5wcmludCAocmVxdWVzdC5nZXRBdHRyaWJ1dGUoInNlcnZsZXROYW1lIikudG9TdHJpbmcoKSk7ICU+CitTZXJ2bGV0LgorPC9oMT4KKworPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcHRvc2Vydi9qc3B0b3NlcnZsZXQuanNwIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvanNwdG9zZXJ2L2pzcHRvc2VydmxldC5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA1ZjkxOQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcHRvc2Vydi9qc3B0b3NlcnZsZXQuanNwCkBAIC0wLDAgKzEsMjIgQEAKKzxodG1sPgorPCEtLQorICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGJvZHkgYmdjb2xvcj0id2hpdGUiPgorCis8IS0tIEZvcndhcmQgdG8gYSBzZXJ2bGV0IC0tPgorPGpzcDpmb3J3YXJkIHBhZ2U9Ii9zZXJ2bGV0VG9Kc3AiIC8+CisKKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3B0b3NlcnYvanRzLmh0bWwgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9qc3B0b3NlcnYvanRzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y4M2E0NQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL2pzcHRvc2Vydi9qdHMuaHRtbApAQCAtMCwwICsxLDMzIEBACis8aHRtbD4KKzwhLS0KKyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPGhlYWQ+Cis8dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Cis8L2hlYWQ+CisKKzxib2R5IGJnY29sb3I9IiNGRkZGRkYiPgorPHA+PGZvbnQgY29sb3I9IiMwMDAwRkYiPjxhIGhyZWY9ImpzcHRvc2VydmxldC5qc3AiPjxpbWcgc3JjPSIuLi9pbWFnZXMvZXhlY3V0ZS5naWYiIGFsaWduPSJyaWdodCIgYm9yZGVyPSIwIj48L2E+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+PGltZyBzcmM9Ii4uL2ltYWdlcy9yZXR1cm4uZ2lmIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGFsaWduPSJyaWdodCIgYm9yZGVyPSIwIj48L2E+PC9mb250PjwvcD4KKworPGgzPjxhIGhyZWY9ImpzcHRvc2VydmxldC5qc3AuaHRtbCI+U291cmNlIENvZGUgZm9yIEpTUCBjYWxsaW5nIHNlcnZsZXQgPGZvbnQgY29sb3I9IiMwMDAwRkYiPjwvYT4KKyAgPC9mb250PiA8L2gzPgorCis8aDM+PGEgaHJlZj0ic2VydmxldFRvSnNwLmphdmEuaHRtbCI+U291cmNlIENvZGUgZm9yIFNlcnZsZXQgY2FsbGluZyBKU1AgCis8Zm9udCBjb2xvcj0iIzAwMDBGRiI+PC9hPiA8L2ZvbnQ+IDwvaDM+CisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL251bS9udW1ndWVzcy5odG1sIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvbnVtL251bWd1ZXNzLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ4ZTc3MwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL251bS9udW1ndWVzcy5odG1sCkBAIC0wLDAgKzEsMzMgQEAKKzxodG1sPgorPCEtLQorICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworICBOdW1iZXIgR3Vlc3MgR2FtZQorICBXcml0dGVuIGJ5IEphc29uIEh1bnRlciwgQ1RPLCBLJkEgU29mdHdhcmUKKyAgaHR0cDovL3d3dy5zZXJ2bGV0cy5jb20KKy0tPgorPGhlYWQ+Cis8dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Cis8L2hlYWQ+CisKKzxib2R5IGJnY29sb3I9IiNGRkZGRkYiPgorPHA+PGZvbnQgY29sb3I9IiMwMDAwRkYiPjxhIGhyZWY9Im51bWd1ZXNzLmpzcCI+PGltZyBzcmM9Ii4uL2ltYWdlcy9leGVjdXRlLmdpZiIgYWxpZ249InJpZ2h0IiBib3JkZXI9IjAiPjwvYT48YSBocmVmPSIuLi9pbmRleC5odG1sIj48aW1nIHNyYz0iLi4vaW1hZ2VzL3JldHVybi5naWYiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgYWxpZ249InJpZ2h0IiBib3JkZXI9IjAiPjwvYT48L2ZvbnQ+PC9wPgorCis8aDM+PGEgaHJlZj0ibnVtZ3Vlc3MuanNwLmh0bWwiPlNvdXJjZSBDb2RlIGZvciBOdW1ndWVzcyBFeGFtcGxlPGZvbnQgY29sb3I9IiMwMDAwRkYiPjwvYT4KKyAgPC9mb250PiA8L2gzPgorCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9udW0vbnVtZ3Vlc3MuanNwIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvbnVtL251bWd1ZXNzLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjU4NDE2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvbnVtL251bWd1ZXNzLmpzcApAQCAtMCwwICsxLDY5IEBACis8IS0tCis8IS0tCisgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisgIE51bWJlciBHdWVzcyBHYW1lCisgIFdyaXR0ZW4gYnkgSmFzb24gSHVudGVyLCBDVE8sIEsmQSBTb2Z0d2FyZQorICBodHRwOi8vd3d3LnNlcnZsZXRzLmNvbQorLS0+CisKKzwlQCBwYWdlIGltcG9ydCA9ICJudW0uTnVtYmVyR3Vlc3NCZWFuIiAlPgorCis8anNwOnVzZUJlYW4gaWQ9Im51bWd1ZXNzIiBjbGFzcz0ibnVtLk51bWJlckd1ZXNzQmVhbiIgc2NvcGU9InNlc3Npb24iLz4KKzxqc3A6c2V0UHJvcGVydHkgbmFtZT0ibnVtZ3Vlc3MiIHByb3BlcnR5PSIqIi8+CisKKzxodG1sPgorPGhlYWQ+PHRpdGxlPk51bWJlciBHdWVzczwvdGl0bGU+PC9oZWFkPgorPGJvZHkgYmdjb2xvcj0id2hpdGUiPgorPGZvbnQgc2l6ZT00PgorCis8JSBpZiAobnVtZ3Vlc3MuZ2V0U3VjY2VzcygpKSB7ICU+CisKKyAgQ29uZ3JhdHVsYXRpb25zISAgWW91IGdvdCBpdC4KKyAgQW5kIGFmdGVyIGp1c3QgPCU9IG51bWd1ZXNzLmdldE51bUd1ZXNzZXMoKSAlPiB0cmllcy48cD4KKworICA8JSBudW1ndWVzcy5yZXNldCgpOyAlPgorCisgIENhcmUgdG8gPGEgaHJlZj0ibnVtZ3Vlc3MuanNwIj50cnkgYWdhaW48L2E+PworCis8JSB9IGVsc2UgaWYgKG51bWd1ZXNzLmdldE51bUd1ZXNzZXMoKSA9PSAwKSB7ICU+CisKKyAgV2VsY29tZSB0byB0aGUgTnVtYmVyIEd1ZXNzIGdhbWUuPHA+CisKKyAgSSdtIHRoaW5raW5nIG9mIGEgbnVtYmVyIGJldHdlZW4gMSBhbmQgMTAwLjxwPgorCisgIDxmb3JtIG1ldGhvZD1nZXQ+CisgIFdoYXQncyB5b3VyIGd1ZXNzPyA8aW5wdXQgdHlwZT10ZXh0IG5hbWU9Z3Vlc3M+CisgIDxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0iU3VibWl0Ij4KKyAgPC9mb3JtPgorCis8JSB9IGVsc2UgeyAlPgorCisgIEdvb2QgZ3Vlc3MsIGJ1dCBub3BlLiAgVHJ5IDxiPjwlPSBudW1ndWVzcy5nZXRIaW50KCkgJT48L2I+LgorCisgIFlvdSBoYXZlIG1hZGUgPCU9IG51bWd1ZXNzLmdldE51bUd1ZXNzZXMoKSAlPiBndWVzc2VzLjxwPgorCisgIEknbSB0aGlua2luZyBvZiBhIG51bWJlciBiZXR3ZWVuIDEgYW5kIDEwMC48cD4KKworICA8Zm9ybSBtZXRob2Q9Z2V0PgorICBXaGF0J3MgeW91ciBndWVzcz8gPGlucHV0IHR5cGU9dGV4dCBuYW1lPWd1ZXNzPgorICA8aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9IlN1Ym1pdCI+CisgIDwvZm9ybT4KKworPCUgfSAlPgorCis8L2ZvbnQ+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9wbHVnaW4vYXBwbGV0L0Nsb2NrMi5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvcGx1Z2luL2FwcGxldC9DbG9jazIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmVkYjg5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvcGx1Z2luL2FwcGxldC9DbG9jazIuamF2YQpAQCAtMCwwICsxLDIxMiBAQAorLyoKKyogQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS5hd3QuKjsKK2ltcG9ydCBqYXZhLmFwcGxldC4qOworaW1wb3J0IGphdmEudGV4dC4qOworCisvKioKKyAqIFRpbWUhCisgKgorICogQGF1dGhvciBSYWNoZWwgR29sbHViCisgKi8KKworcHVibGljIGNsYXNzIENsb2NrMiBleHRlbmRzIEFwcGxldCBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKKyAgICBUaHJlYWQgdGltZXI7ICAgICAgICAgICAgICAgIC8vIFRoZSB0aHJlYWQgdGhhdCBkaXNwbGF5cyBjbG9jaworICAgIGludCBsYXN0eHMsIGxhc3R5cywgbGFzdHhtLAorICAgICAgICBsYXN0eW0sIGxhc3R4aCwgbGFzdHloOyAgLy8gRGltZW5zaW9ucyB1c2VkIHRvIGRyYXcgaGFuZHMgCisgICAgU2ltcGxlRGF0ZUZvcm1hdCBmb3JtYXR0ZXI7ICAvLyBGb3JtYXRzIHRoZSBkYXRlIGRpc3BsYXllZAorICAgIFN0cmluZyBsYXN0ZGF0ZTsgICAgICAgICAgICAgLy8gU3RyaW5nIHRvIGhvbGQgZGF0ZSBkaXNwbGF5ZWQKKyAgICBGb250IGNsb2NrRmFjZUZvbnQ7ICAgICAgICAgIC8vIEZvbnQgZm9yIG51bWJlciBkaXNwbGF5IG9uIGNsb2NrCisgICAgRGF0ZSBjdXJyZW50RGF0ZTsgICAgICAgICAgICAvLyBVc2VkIHRvIGdldCBkYXRlIHRvIGRpc3BsYXkKKyAgICBDb2xvciBoYW5kQ29sb3I7ICAgICAgICAgICAgIC8vIENvbG9yIG9mIG1haW4gaGFuZHMgYW5kIGRpYWwKKyAgICBDb2xvciBudW1iZXJDb2xvcjsgICAgICAgICAgIC8vIENvbG9yIG9mIHNlY29uZCBoYW5kIGFuZCBudW1iZXJzCisKKyAgICBwdWJsaWMgdm9pZCBpbml0KCkgeworICAgICAgICBpbnQgeCx5OworICAgICAgICBsYXN0eHMgPSBsYXN0eXMgPSBsYXN0eG0gPSBsYXN0eW0gPSBsYXN0eGggPSBsYXN0eWggPSAwOworICAgICAgICBmb3JtYXR0ZXIgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCAoIkVFRSBNTU0gZGQgaGg6bW06c3MgeXl5eSIsIExvY2FsZS5nZXREZWZhdWx0KCkpOworICAgICAgICBjdXJyZW50RGF0ZSA9IG5ldyBEYXRlKCk7CisgICAgICAgIGxhc3RkYXRlID0gZm9ybWF0dGVyLmZvcm1hdChjdXJyZW50RGF0ZSk7CisgICAgICAgIGNsb2NrRmFjZUZvbnQgPSBuZXcgRm9udCgiU2VyaWYiLCBGb250LlBMQUlOLCAxNCk7CisgICAgICAgIGhhbmRDb2xvciA9IENvbG9yLmJsdWU7CisgICAgICAgIG51bWJlckNvbG9yID0gQ29sb3IuZGFya0dyYXk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNldEJhY2tncm91bmQobmV3IENvbG9yKEludGVnZXIucGFyc2VJbnQoZ2V0UGFyYW1ldGVyKCJiZ2NvbG9yIiksMTYpKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBFKSB7IH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGhhbmRDb2xvciA9IG5ldyBDb2xvcihJbnRlZ2VyLnBhcnNlSW50KGdldFBhcmFtZXRlcigiZmdjb2xvcjEiKSwxNikpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gRSkgeyB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBudW1iZXJDb2xvciA9IG5ldyBDb2xvcihJbnRlZ2VyLnBhcnNlSW50KGdldFBhcmFtZXRlcigiZmdjb2xvcjIiKSwxNikpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gRSkgeyB9CisgICAgICAgIHJlc2l6ZSgzMDAsMzAwKTsgICAgICAgICAgICAgIC8vIFNldCBjbG9jayB3aW5kb3cgc2l6ZQorICAgIH0KKworICAgIC8vIFBsb3Rwb2ludHMgYWxsb3dzIGNhbGN1bGF0aW9uIHRvIG9ubHkgY292ZXIgNDUgZGVncmVlcyBvZiB0aGUgY2lyY2xlLAorICAgIC8vIGFuZCB0aGVuIG1pcnJvcgorICAgIHB1YmxpYyB2b2lkIHBsb3Rwb2ludHMoaW50IHgwLCBpbnQgeTAsIGludCB4LCBpbnQgeSwgR3JhcGhpY3MgZykgeworICAgICAgICBnLmRyYXdMaW5lKHgwK3gseTAreSx4MCt4LHkwK3kpOworICAgICAgICBnLmRyYXdMaW5lKHgwK3kseTAreCx4MCt5LHkwK3gpOworICAgICAgICBnLmRyYXdMaW5lKHgwK3kseTAteCx4MCt5LHkwLXgpOworICAgICAgICBnLmRyYXdMaW5lKHgwK3gseTAteSx4MCt4LHkwLXkpOworICAgICAgICBnLmRyYXdMaW5lKHgwLXgseTAteSx4MC14LHkwLXkpOworICAgICAgICBnLmRyYXdMaW5lKHgwLXkseTAteCx4MC15LHkwLXgpOworICAgICAgICBnLmRyYXdMaW5lKHgwLXkseTAreCx4MC15LHkwK3gpOworICAgICAgICBnLmRyYXdMaW5lKHgwLXgseTAreSx4MC14LHkwK3kpOworICAgIH0KKworICAgIC8vIENpcmNsZSBpcyBqdXN0IEJyZXNlbmhhbSdzIGFsZ29yaXRobSBmb3IgYSBzY2FuIGNvbnZlcnRlZCBjaXJjbGUKKyAgICBwdWJsaWMgdm9pZCBjaXJjbGUoaW50IHgwLCBpbnQgeTAsIGludCByLCBHcmFwaGljcyBnKSB7CisgICAgICAgIGludCB4LHk7CisgICAgICAgIGZsb2F0IGQ7CisgICAgICAgIHg9MDsKKyAgICAgICAgeT1yOworICAgICAgICBkPTUvNC1yOworICAgICAgICBwbG90cG9pbnRzKHgwLHkwLHgseSxnKTsKKworICAgICAgICB3aGlsZSAoeT54KXsKKyAgICAgICAgICAgIGlmIChkPDApIHsKKyAgICAgICAgICAgICAgICBkPWQrMip4KzM7CisgICAgICAgICAgICAgICAgeCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgZD1kKzIqKHgteSkrNTsKKyAgICAgICAgICAgICAgICB4Kys7CisgICAgICAgICAgICAgICAgeS0tOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGxvdHBvaW50cyh4MCx5MCx4LHksZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBQYWludCBpcyB0aGUgbWFpbiBwYXJ0IG9mIHRoZSBwcm9ncmFtCisgICAgcHVibGljIHZvaWQgcGFpbnQoR3JhcGhpY3MgZykgeworICAgICAgICBpbnQgeGgsIHloLCB4bSwgeW0sIHhzLCB5cywgcyA9IDAsIG0gPSAxMCwgaCA9IDEwLCB4Y2VudGVyLCB5Y2VudGVyOworICAgICAgICBTdHJpbmcgdG9kYXk7CisKKyAgICAgICAgY3VycmVudERhdGUgPSBuZXcgRGF0ZSgpOworICAgICAgICBTaW1wbGVEYXRlRm9ybWF0IGZvcm1hdHRlciA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJzIixMb2NhbGUuZ2V0RGVmYXVsdCgpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHMgPSBJbnRlZ2VyLnBhcnNlSW50KGZvcm1hdHRlci5mb3JtYXQoY3VycmVudERhdGUpKTsKKyAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG4pIHsKKyAgICAgICAgICAgIHMgPSAwOworICAgICAgICB9CisgICAgICAgIGZvcm1hdHRlci5hcHBseVBhdHRlcm4oIm0iKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG0gPSBJbnRlZ2VyLnBhcnNlSW50KGZvcm1hdHRlci5mb3JtYXQoY3VycmVudERhdGUpKTsKKyAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG4pIHsKKyAgICAgICAgICAgIG0gPSAxMDsKKyAgICAgICAgfSAgICAKKyAgICAgICAgZm9ybWF0dGVyLmFwcGx5UGF0dGVybigiaCIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaCA9IEludGVnZXIucGFyc2VJbnQoZm9ybWF0dGVyLmZvcm1hdChjdXJyZW50RGF0ZSkpOworICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbikgeworICAgICAgICAgICAgaCA9IDEwOworICAgICAgICB9CisgICAgICAgIGZvcm1hdHRlci5hcHBseVBhdHRlcm4oIkVFRSBNTU0gZGQgSEg6bW06c3MgeXl5eSIpOworICAgICAgICB0b2RheSA9IGZvcm1hdHRlci5mb3JtYXQoY3VycmVudERhdGUpOworICAgICAgICB4Y2VudGVyPTgwOworICAgICAgICB5Y2VudGVyPTU1OworICAgIAorICAgIC8vIGE9IHMqIHBpLzIgLSBwaS8yICh0byBzd2l0Y2ggMCwwIGZyb20gMzowMCB0byAxMjowMCkKKyAgICAvLyB4ID0gcihjb3MgYSkgKyB4Y2VudGVyLCB5ID0gcihzaW4gYSkgKyB5Y2VudGVyCisgICAgCisgICAgICAgIHhzID0gKGludCkoTWF0aC5jb3MocyAqIDMuMTRmLzMwIC0gMy4xNGYvMikgKiA0NSArIHhjZW50ZXIpOworICAgICAgICB5cyA9IChpbnQpKE1hdGguc2luKHMgKiAzLjE0Zi8zMCAtIDMuMTRmLzIpICogNDUgKyB5Y2VudGVyKTsKKyAgICAgICAgeG0gPSAoaW50KShNYXRoLmNvcyhtICogMy4xNGYvMzAgLSAzLjE0Zi8yKSAqIDQwICsgeGNlbnRlcik7CisgICAgICAgIHltID0gKGludCkoTWF0aC5zaW4obSAqIDMuMTRmLzMwIC0gMy4xNGYvMikgKiA0MCArIHljZW50ZXIpOworICAgICAgICB4aCA9IChpbnQpKE1hdGguY29zKChoKjMwICsgbS8yKSAqIDMuMTRmLzE4MCAtIDMuMTRmLzIpICogMzAgKyB4Y2VudGVyKTsKKyAgICAgICAgeWggPSAoaW50KShNYXRoLnNpbigoaCozMCArIG0vMikgKiAzLjE0Zi8xODAgLSAzLjE0Zi8yKSAqIDMwICsgeWNlbnRlcik7CisgICAgCisgICAgLy8gRHJhdyB0aGUgY2lyY2xlIGFuZCBudW1iZXJzCisgICAgCisgICAgICAgIGcuc2V0Rm9udChjbG9ja0ZhY2VGb250KTsKKyAgICAgICAgZy5zZXRDb2xvcihoYW5kQ29sb3IpOworICAgICAgICBjaXJjbGUoeGNlbnRlcix5Y2VudGVyLDUwLGcpOworICAgICAgICBnLnNldENvbG9yKG51bWJlckNvbG9yKTsKKyAgICAgICAgZy5kcmF3U3RyaW5nKCI5Iix4Y2VudGVyLTQ1LHljZW50ZXIrMyk7IAorICAgICAgICBnLmRyYXdTdHJpbmcoIjMiLHhjZW50ZXIrNDAseWNlbnRlciszKTsKKyAgICAgICAgZy5kcmF3U3RyaW5nKCIxMiIseGNlbnRlci01LHljZW50ZXItMzcpOworICAgICAgICBnLmRyYXdTdHJpbmcoIjYiLHhjZW50ZXItMyx5Y2VudGVyKzQ1KTsKKworICAgIC8vIEVyYXNlIGlmIG5lY2Vzc2FyeSwgYW5kIHJlZHJhdworICAgIAorICAgICAgICBnLnNldENvbG9yKGdldEJhY2tncm91bmQoKSk7CisgICAgICAgIGlmICh4cyAhPSBsYXN0eHMgfHwgeXMgIT0gbGFzdHlzKSB7CisgICAgICAgICAgICBnLmRyYXdMaW5lKHhjZW50ZXIsIHljZW50ZXIsIGxhc3R4cywgbGFzdHlzKTsKKyAgICAgICAgICAgIGcuZHJhd1N0cmluZyhsYXN0ZGF0ZSwgNSwgMTI1KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoeG0gIT0gbGFzdHhtIHx8IHltICE9IGxhc3R5bSkgeworICAgICAgICAgICAgZy5kcmF3TGluZSh4Y2VudGVyLCB5Y2VudGVyLTEsIGxhc3R4bSwgbGFzdHltKTsKKyAgICAgICAgICAgIGcuZHJhd0xpbmUoeGNlbnRlci0xLCB5Y2VudGVyLCBsYXN0eG0sIGxhc3R5bSk7IH0KKyAgICAgICAgaWYgKHhoICE9IGxhc3R4aCB8fCB5aCAhPSBsYXN0eWgpIHsKKyAgICAgICAgICAgIGcuZHJhd0xpbmUoeGNlbnRlciwgeWNlbnRlci0xLCBsYXN0eGgsIGxhc3R5aCk7CisgICAgICAgICAgICBnLmRyYXdMaW5lKHhjZW50ZXItMSwgeWNlbnRlciwgbGFzdHhoLCBsYXN0eWgpOyB9CisgICAgICAgIGcuc2V0Q29sb3IobnVtYmVyQ29sb3IpOworICAgICAgICBnLmRyYXdTdHJpbmcoIiIsIDUsIDEyNSk7CisgICAgICAgIGcuZHJhd1N0cmluZyh0b2RheSwgNSwgMTI1KTsgICAgCisgICAgICAgIGcuZHJhd0xpbmUoeGNlbnRlciwgeWNlbnRlciwgeHMsIHlzKTsKKyAgICAgICAgZy5zZXRDb2xvcihoYW5kQ29sb3IpOworICAgICAgICBnLmRyYXdMaW5lKHhjZW50ZXIsIHljZW50ZXItMSwgeG0sIHltKTsKKyAgICAgICAgZy5kcmF3TGluZSh4Y2VudGVyLTEsIHljZW50ZXIsIHhtLCB5bSk7CisgICAgICAgIGcuZHJhd0xpbmUoeGNlbnRlciwgeWNlbnRlci0xLCB4aCwgeWgpOworICAgICAgICBnLmRyYXdMaW5lKHhjZW50ZXItMSwgeWNlbnRlciwgeGgsIHloKTsKKyAgICAgICAgbGFzdHhzPXhzOyBsYXN0eXM9eXM7CisgICAgICAgIGxhc3R4bT14bTsgbGFzdHltPXltOworICAgICAgICBsYXN0eGg9eGg7IGxhc3R5aD15aDsKKyAgICAgICAgbGFzdGRhdGUgPSB0b2RheTsKKyAgICAgICAgY3VycmVudERhdGU9bnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHsKKyAgICAgICAgdGltZXIgPSBuZXcgVGhyZWFkKHRoaXMpOworICAgICAgICB0aW1lci5zdGFydCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB7CisgICAgICAgIHRpbWVyID0gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgIFRocmVhZCBtZSA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCk7CisgICAgICAgIHdoaWxlICh0aW1lciA9PSBtZSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNsZWVwKDEwMCk7CisgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXBhaW50KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGUoR3JhcGhpY3MgZykgeworICAgICAgICBwYWludChnKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEFwcGxldEluZm8oKSB7CisgICAgICAgIHJldHVybiAiVGl0bGU6IEEgQ2xvY2sgXG5BdXRob3I6IFJhY2hlbCBHb2xsdWIsIDE5OTUgXG5BbiBhbmFsb2cgY2xvY2suIjsKKyAgICB9CisgIAorICAgIHB1YmxpYyBTdHJpbmdbXVtdIGdldFBhcmFtZXRlckluZm8oKSB7CisgICAgICAgIFN0cmluZ1tdW10gaW5mbyA9IHsKKyAgICAgICAgICAgIHsiYmdjb2xvciIsICJoZXhhZGVjaW1hbCBSR0IgbnVtYmVyIiwgIlRoZSBiYWNrZ3JvdW5kIGNvbG9yLiBEZWZhdWx0IGlzIHRoZSBjb2xvciBvZiB5b3VyIGJyb3dzZXIuIn0sCisgICAgICAgICAgICB7ImZnY29sb3IxIiwgImhleGFkZWNpbWFsIFJHQiBudW1iZXIiLCAiVGhlIGNvbG9yIG9mIHRoZSBoYW5kcyBhbmQgZGlhbC4gRGVmYXVsdCBpcyBibHVlLiJ9LAorICAgICAgICAgICAgeyJmZ2NvbG9yMiIsICJoZXhhZGVjaW1hbCBSR0IgbnVtYmVyIiwgIlRoZSBjb2xvciBvZiB0aGUgc2Vjb25kcyBoYW5kIGFuZCBudW1iZXJzLiBEZWZhdWx0IGlzIGRhcmsgZ3JheS4ifQorICAgICAgICB9OworICAgICAgICByZXR1cm4gaW5mbzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9wbHVnaW4vcGx1Z2luLmh0bWwgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9wbHVnaW4vcGx1Z2luLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVlNTVjNgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL3BsdWdpbi9wbHVnaW4uaHRtbApAQCAtMCwwICsxLDI5IEBACis8aHRtbD4KKzwhLS0KKyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxoZWFkPgorPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorPC9oZWFkPgorCis8Ym9keSBiZ2NvbG9yPSIjRkZGRkZGIj4KKzxwPjxmb250IGNvbG9yPSIjMDAwMEZGIj48YSBocmVmPSJwbHVnaW4uanNwIj48aW1nIHNyYz0iLi4vaW1hZ2VzL2V4ZWN1dGUuZ2lmIiBhbGlnbj0icmlnaHQiIGJvcmRlcj0iMCI+PC9hPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPjxpbWcgc3JjPSIuLi9pbWFnZXMvcmV0dXJuLmdpZiIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiBhbGlnbj0icmlnaHQiIGJvcmRlcj0iMCI+PC9hPjwvZm9udD48L3A+CisKKzxoMz48YSBocmVmPSJwbHVnaW4uanNwLmh0bWwiPlNvdXJjZSBDb2RlIGZvciBQbHVnaW4gRXhhbXBsZTxmb250IGNvbG9yPSIjMDAwMEZGIj48L2E+CisgIDwvZm9udD4gPC9oMz4KKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvcGx1Z2luL3BsdWdpbi5qc3AgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9wbHVnaW4vcGx1Z2luLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWQ1ZDRlCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvcGx1Z2luL3BsdWdpbi5qc3AKQEAgLTAsMCArMSwzMyBAQAorPGh0bWw+Cis8IS0tCisgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8dGl0bGU+IFBsdWdpbiBleGFtcGxlIDwvdGl0bGU+Cis8Ym9keSBiZ2NvbG9yPSJ3aGl0ZSI+Cis8aDM+IEN1cnJlbnQgdGltZSBpcyA6IDwvaDM+Cis8anNwOnBsdWdpbiB0eXBlPSJhcHBsZXQiIGNvZGU9IkNsb2NrMi5jbGFzcyIgY29kZWJhc2U9ImFwcGxldCIganJldmVyc2lvbj0iMS4yIiB3aWR0aD0iMTYwIiBoZWlnaHQ9IjE1MCIgPgorICAgIDxqc3A6ZmFsbGJhY2s+CisgICAgICAgIFBsdWdpbiB0YWcgT0JKRUNUIG9yIEVNQkVEIG5vdCBzdXBwb3J0ZWQgYnkgYnJvd3Nlci4KKyAgICA8L2pzcDpmYWxsYmFjaz4KKzwvanNwOnBsdWdpbj4KKzxwPgorPGg0PgorPGZvbnQgY29sb3I9cmVkPiAKK1RoZSBhYm92ZSBhcHBsZXQgaXMgbG9hZGVkIHVzaW5nIHRoZSBKYXZhIFBsdWdpbiBmcm9tIGEganNwIHBhZ2UgdXNpbmcgdGhlCitwbHVnaW4gdGFnLgorPC9mb250PgorPC9oND4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL3NlY3VyaXR5L3Byb3RlY3RlZC9lcnJvci5qc3AgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9zZWN1cml0eS9wcm90ZWN0ZWQvZXJyb3IuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMjRjYTMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9zZWN1cml0eS9wcm90ZWN0ZWQvZXJyb3IuanNwCkBAIC0wLDAgKzEsMjQgQEAKKzwhLS0KKyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorPGhlYWQ+Cis8dGl0bGU+RXJyb3IgUGFnZSBGb3IgRXhhbXBsZXM8L3RpdGxlPgorPC9oZWFkPgorPGJvZHkgYmdjb2xvcj0id2hpdGUiPgorSW52YWxpZCB1c2VybmFtZSBhbmQvb3IgcGFzc3dvcmQsIHBsZWFzZSB0cnkKKzxhIGhyZWY9JzwlPSByZXNwb25zZS5lbmNvZGVVUkwoImxvZ2luLmpzcCIpICU+Jz5hZ2FpbjwvYT4uCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9zZWN1cml0eS9wcm90ZWN0ZWQvaW5kZXguanNwIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvc2VjdXJpdHkvcHJvdGVjdGVkL2luZGV4LmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWQ5Nzc4Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvc2VjdXJpdHkvcHJvdGVjdGVkL2luZGV4LmpzcApAQCAtMCwwICsxLDc2IEBACis8IS0tCisgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8JQorICBpZiAocmVxdWVzdC5nZXRQYXJhbWV0ZXIoImxvZ29mZiIpICE9IG51bGwpIHsKKyAgICBzZXNzaW9uLmludmFsaWRhdGUoKTsKKyAgICByZXNwb25zZS5zZW5kUmVkaXJlY3QoImluZGV4LmpzcCIpOworICAgIHJldHVybjsKKyAgfQorJT4KKzxodG1sPgorPGhlYWQ+Cis8dGl0bGU+UHJvdGVjdGVkIFBhZ2UgZm9yIEV4YW1wbGVzPC90aXRsZT4KKzwvaGVhZD4KKzxib2R5IGJnY29sb3I9IndoaXRlIj4KKworWW91IGFyZSBsb2dnZWQgaW4gYXMgcmVtb3RlIHVzZXIgPGI+PCU9IHJlcXVlc3QuZ2V0UmVtb3RlVXNlcigpICU+PC9iPgoraW4gc2Vzc2lvbiA8Yj48JT0gc2Vzc2lvbi5nZXRJZCgpICU+PC9iPjxicj48YnI+CisKKzwlCisgIGlmIChyZXF1ZXN0LmdldFVzZXJQcmluY2lwYWwoKSAhPSBudWxsKSB7CislPgorICAgIFlvdXIgdXNlciBwcmluY2lwYWwgbmFtZSBpcworICAgIDxiPjwlPSByZXF1ZXN0LmdldFVzZXJQcmluY2lwYWwoKS5nZXROYW1lKCkgJT48L2I+PGJyPjxicj4KKzwlCisgIH0gZWxzZSB7CislPgorICAgIE5vIHVzZXIgcHJpbmNpcGFsIGNvdWxkIGJlIGlkZW50aWZpZWQuPGJyPjxicj4KKzwlCisgIH0KKyU+CisKKzwlCisgIFN0cmluZyByb2xlID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoInJvbGUiKTsKKyAgaWYgKHJvbGUgPT0gbnVsbCkKKyAgICByb2xlID0gIiI7CisgIGlmIChyb2xlLmxlbmd0aCgpID4gMCkgeworICAgIGlmIChyZXF1ZXN0LmlzVXNlckluUm9sZShyb2xlKSkgeworJT4KKyAgICAgIFlvdSBoYXZlIGJlZW4gZ3JhbnRlZCByb2xlIDxiPjwlPSByb2xlICU+PC9iPjxicj48YnI+Cis8JQorICAgIH0gZWxzZSB7CislPgorICAgICAgWW91IGhhdmUgPGk+bm90PC9pPiBiZWVuIGdyYW50ZWQgcm9sZSA8Yj48JT0gcm9sZSAlPjwvYj48YnI+PGJyPgorPCUKKyAgICB9CisgIH0KKyU+CisKK1RvIGNoZWNrIHdoZXRoZXIgeW91ciB1c2VybmFtZSBoYXMgYmVlbiBncmFudGVkIGEgcGFydGljdWxhciByb2xlLAorZW50ZXIgaXQgaGVyZToKKzxmb3JtIG1ldGhvZD0iR0VUIiBhY3Rpb249JzwlPSByZXNwb25zZS5lbmNvZGVVUkwoImluZGV4LmpzcCIpICU+Jz4KKzxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJyb2xlIiB2YWx1ZT0iPCU9IHJvbGUgJT4iPgorPC9mb3JtPgorPGJyPjxicj4KKworSWYgeW91IGhhdmUgY29uZmlndXJlZCB0aGlzIGFwcCBmb3IgZm9ybS1iYXNlZCBhdXRoZW50aWNhdGlvbiwgeW91IGNhbiBsb2cKK29mZiBieSBjbGlja2luZworPGEgaHJlZj0nPCU9IHJlc3BvbnNlLmVuY29kZVVSTCgiaW5kZXguanNwP2xvZ29mZj10cnVlIikgJT4nPmhlcmU8L2E+LgorVGhpcyBzaG91bGQgY2F1c2UgeW91IHRvIGJlIHJldHVybmVkIHRvIHRoZSBsb2dvbiBwYWdlIGFmdGVyIHRoZSByZWRpcmVjdAordGhhdCBpcyBwZXJmb3JtZWQuCisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL3NlY3VyaXR5L3Byb3RlY3RlZC9sb2dpbi5qc3AgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9zZWN1cml0eS9wcm90ZWN0ZWQvbG9naW4uanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmMWU2YzEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9zZWN1cml0eS9wcm90ZWN0ZWQvbG9naW4uanNwCkBAIC0wLDAgKzEsMzcgQEAKKzwhLS0KKyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorPGhlYWQ+Cis8dGl0bGU+TG9naW4gUGFnZSBmb3IgRXhhbXBsZXM8L3RpdGxlPgorPGJvZHkgYmdjb2xvcj0id2hpdGUiPgorPGZvcm0gbWV0aG9kPSJQT1NUIiBhY3Rpb249JzwlPSByZXNwb25zZS5lbmNvZGVVUkwoImpfc2VjdXJpdHlfY2hlY2siKSAlPicgPgorICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iNSI+CisgICAgPHRyPgorICAgICAgPHRoIGFsaWduPSJyaWdodCI+VXNlcm5hbWU6PC90aD4KKyAgICAgIDx0ZCBhbGlnbj0ibGVmdCI+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImpfdXNlcm5hbWUiPjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGggYWxpZ249InJpZ2h0Ij5QYXNzd29yZDo8L3RoPgorICAgICAgPHRkIGFsaWduPSJsZWZ0Ij48aW5wdXQgdHlwZT0icGFzc3dvcmQiIG5hbWU9ImpfcGFzc3dvcmQiPjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQgYWxpZ249InJpZ2h0Ij48aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iTG9nIEluIj48L3RkPgorICAgICAgPHRkIGFsaWduPSJsZWZ0Ij48aW5wdXQgdHlwZT0icmVzZXQiPjwvdGQ+CisgICAgPC90cj4KKyAgPC90YWJsZT4KKzwvZm9ybT4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL3Nlc3Npb25zL0R1bW15Q2FydC5odG1sIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvc2Vzc2lvbnMvRHVtbXlDYXJ0Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZkNjRmOQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL3Nlc3Npb25zL0R1bW15Q2FydC5odG1sCkBAIC0wLDAgKzEsNTUgQEAKKzxIVE1MPgorPCEtLQorICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8SEVBRD4KKzx0aXRsZT4KK3Nlc3Npb25zLkR1bW15Q2FydCBCZWFuIFByb3BlcnRpZXMKKzwvdGl0bGU+Cis8Qk9EWSBCR0NPTE9SPSJ3aGl0ZSI+Cis8SDI+CitzZXNzaW9ucy5EdW1teUNhcnQgQmVhbiBQcm9wZXJ0aWVzCis8L0gyPgorPEhSPgorPERMPgorPERUPnB1YmxpYyBjbGFzcyA8Qj5EdW1teUNhcnQ8L0I+PERUPmV4dGVuZHMgT2JqZWN0PC9ETD4KKworPFA+Cis8SFI+CisKKzxQPgorCis8VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIj4KKzxUUiBCR0NPTE9SPSIjRUVFRUZGIj4KKzxURCBDT0xTUEFOPTM+PEZPTlQgU0laRT0iKzIiPgorPEI+UHJvcGVydGllcyBTdW1tYXJ5PC9CPjwvRk9OVD48L1REPgorPC9UUj4KKzxUUiBCR0NPTE9SPSJ3aGl0ZSI+Cis8dGQgYWxpZ249InJpZ2h0IiB2YWxpZ249InRvcCIgd2lkdGg9IjElIj4KKzxGT05UIFNJWkU9Ii0xIj4KK1N0cmluZworPC9GT05UPjwvVEQ+Cis8VEQ+PEI+RHVtbXlDYXJ0Oml0ZW1zPC9CPgorPEJSPgorICAgICAgIDwvVEQ+Cis8dGQgd2lkdGg9IjElIj4KKzxGT05UIFNJWkU9Ii0xIj4KK011bHRpCis8L0ZPTlQ+PC9URD4KKzwvVEFCTEU+Cis8SFI+Cis8L0JPRFk+Cis8L0hUTUw+CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9zZXNzaW9ucy9jYXJ0cy5odG1sIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvc2Vzc2lvbnMvY2FydHMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDVjMDNkCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvc2Vzc2lvbnMvY2FydHMuaHRtbApAQCAtMCwwICsxLDUyIEBACis8aHRtbD4KKzwhLS0KKyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPGhlYWQ+CisgICAgPHRpdGxlPmNhcnRzPC90aXRsZT4KKzwvaGVhZD4KKworIDxib2R5IGJnY29sb3I9IndoaXRlIj4KKzxmb250IHNpemUgPSA1IGNvbG9yPSIjQ0MwMDAwIj4KKworPGZvcm0gdHlwZT1QT1NUIGFjdGlvbj1jYXJ0cy5qc3A+Cis8QlI+CitQbGVhc2UgZW50ZXIgaXRlbSB0byBhZGQgb3IgcmVtb3ZlOgorPGJyPgorQWRkIEl0ZW06CisKKzxTRUxFQ1QgTkFNRT0iaXRlbSI+Cis8T1BUSU9OPkJlYXZpcyAmIEJ1dHQtaGVhZCBWaWRlbyBjb2xsZWN0aW9uCis8T1BUSU9OPlgtZmlsZXMgbW92aWUKKzxPUFRJT04+VHdpbiBwZWFrcyB0YXBlcworPE9QVElPTj5OSU4gQ0QKKzxPUFRJT04+SlNQIEJvb2sKKzxPUFRJT04+Q29uY2VydCB0aWNrZXRzCis8T1BUSU9OPkxvdmUgbGlmZQorPE9QVElPTj5Td2l0Y2ggYmxhZGUKKzxPUFRJT04+UmV4LCBSdWdzICYgUm9jayBuJyBSb2xsCis8L1NFTEVDVD4KKworCis8YnI+IDxicj4KKzxJTlBVVCBUWVBFPXN1Ym1pdCBuYW1lPSJzdWJtaXQiIHZhbHVlPSJhZGQiPgorPElOUFVUIFRZUEU9c3VibWl0IG5hbWU9InN1Ym1pdCIgdmFsdWU9InJlbW92ZSI+CisKKzwvZm9ybT4KKyAgICAgICAKKzwvRk9OVD4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL3Nlc3Npb25zL2NhcnRzLmpzcCBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL3Nlc3Npb25zL2NhcnRzLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDZjZWVkCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvc2Vzc2lvbnMvY2FydHMuanNwCkBAIC0wLDAgKzEsNDMgQEAKKzxodG1sPgorPCEtLQorICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8anNwOnVzZUJlYW4gaWQ9ImNhcnQiIHNjb3BlPSJzZXNzaW9uIiBjbGFzcz0ic2Vzc2lvbnMuRHVtbXlDYXJ0IiAvPgorCis8anNwOnNldFByb3BlcnR5IG5hbWU9ImNhcnQiIHByb3BlcnR5PSIqIiAvPgorPCUKKwljYXJ0LnByb2Nlc3NSZXF1ZXN0KHJlcXVlc3QpOworJT4KKworCis8Rk9OVCBzaXplID0gNSBDT0xPUj0iI0NDMDAwMCI+Cis8YnI+IFlvdSBoYXZlIHRoZSBmb2xsb3dpbmcgaXRlbXMgaW4geW91ciBjYXJ0OgorPG9sPgorPCUgCisJU3RyaW5nW10gaXRlbXMgPSBjYXJ0LmdldEl0ZW1zKCk7CisJZm9yIChpbnQgaT0wOyBpPGl0ZW1zLmxlbmd0aDsgaSsrKSB7CislPgorPGxpPiA8JSBvdXQucHJpbnQodXRpbC5IVE1MRmlsdGVyLmZpbHRlcihpdGVtc1tpXSkpOyAlPiAKKzwlCisJfQorJT4KKzwvb2w+CisKKzwvRk9OVD4KKworPGhyPgorPCVAIGluY2x1ZGUgZmlsZSA9Ii9zZXNzaW9ucy9jYXJ0cy5odG1sIiAlPgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvc2Vzc2lvbnMvY3J0Lmh0bWwgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9zZXNzaW9ucy9jcnQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmU4MGY0Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvc2Vzc2lvbnMvY3J0Lmh0bWwKQEAgLTAsMCArMSwzMyBAQAorPGh0bWw+Cis8IS0tCisgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxoZWFkPgorPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorPC9oZWFkPgorCis8Ym9keSBiZ2NvbG9yPSIjRkZGRkZGIj4KKzxwPjxmb250IGNvbG9yPSIjMDAwMEZGIj48YSBocmVmPSJjYXJ0cy5odG1sIj48aW1nIHNyYz0iLi4vaW1hZ2VzL2V4ZWN1dGUuZ2lmIiBhbGlnbj0icmlnaHQiIGJvcmRlcj0iMCI+PC9hPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPjxpbWcgc3JjPSIuLi9pbWFnZXMvcmV0dXJuLmdpZiIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiBhbGlnbj0icmlnaHQiIGJvcmRlcj0iMCI+PC9hPjwvZm9udD48L3A+CisKKzxoMz48YSBocmVmPSJjYXJ0cy5qc3AuaHRtbCI+U291cmNlIENvZGUgZm9yIENhcnQgRXhhbXBsZTxmb250IGNvbG9yPSIjMDAwMEZGIj48L2E+CisgIDwvZm9udD4gPC9oMz4KKworPGgzPjxhIGhyZWY9IkR1bW15Q2FydC5odG1sIj5Qcm9wZXJ0eSBTaGVldCBmb3IgRHVtbXlDYXJ0Cis8Zm9udCBjb2xvcj0iIzAwMDBGRiI+PC9hPiA8L2ZvbnQ+IDwvaDM+CisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL3NpbXBsZXRhZy9mb28uaHRtbCBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL3NpbXBsZXRhZy9mb28uaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWIzMjJiCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvc2ltcGxldGFnL2Zvby5odG1sCkBAIC0wLDAgKzEsMjkgQEAKKzxodG1sPgorPCEtLQorICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGhlYWQ+Cis8dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Cis8L2hlYWQ+CisKKzxib2R5IGJnY29sb3I9IiNGRkZGRkYiPgorPHA+PGZvbnQgY29sb3I9IiMwMDAwRkYiPjxhIGhyZWY9ImZvby5qc3AiPjxpbWcgc3JjPSIuLi9pbWFnZXMvZXhlY3V0ZS5naWYiIGFsaWduPSJyaWdodCIgYm9yZGVyPSIwIj48L2E+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+PGltZyBzcmM9Ii4uL2ltYWdlcy9yZXR1cm4uZ2lmIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGFsaWduPSJyaWdodCIgYm9yZGVyPSIwIj48L2E+PC9mb250PjwvcD4KKworPGgzPjxhIGhyZWY9ImZvby5qc3AuaHRtbCI+U291cmNlIENvZGUgZm9yIHRoZSBTaW1wbGUgVGFnIEV4YW1wbGU8Zm9udCBjb2xvcj0iIzAwMDBGRiI+PC9hPgorICA8L2ZvbnQ+IDwvaDM+CisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL3NpbXBsZXRhZy9mb28uanNwIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvc2ltcGxldGFnL2Zvby5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUzMDA4YgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL3NpbXBsZXRhZy9mb28uanNwCkBAIC0wLDAgKzEsMzcgQEAKKzxodG1sPgorPCEtLQorICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGJvZHk+Cis8JUAgdGFnbGliIHVyaT0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy90b21jYXQvZXhhbXBsZXMtdGFnbGliIiBwcmVmaXg9ImVnIiU+CisKK1JhZGlvIHN0YXRpb25zIHRoYXQgcm9jazoKKworPHVsPgorPGVnOmZvbyBhdHQxPSI5OC41IiBhdHQyPSI5Mi4zIiBhdHQzPSIxMDcuNyI+Cis8bGk+PCU9IG1lbWJlciAlPjwvbGk+Cis8L2VnOmZvbz4KKzwvdWw+CisKKzxlZzpsb2c+CitEaWQgeW91IHNlZSBtZSBvbiB0aGUgc3RkZXJyIHdpbmRvdz8KKzwvZWc6bG9nPgorCis8ZWc6bG9nIHRvQnJvd3Nlcj0idHJ1ZSI+CitEaWQgeW91IHNlZSBtZSBvbiB0aGUgYnJvd3NlciB3aW5kb3cgYXMgd2VsbD8KKzwvZWc6bG9nPgorCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9zbnAvc25vb3AuaHRtbCBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL3NucC9zbm9vcC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmZmViMDkKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy9zbnAvc25vb3AuaHRtbApAQCAtMCwwICsxLDMwIEBACis8aHRtbD4KKzwhLS0KKyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPGhlYWQ+Cis8dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Cis8L2hlYWQ+CisKKzxib2R5IGJnY29sb3I9IiNGRkZGRkYiPgorPHA+PGZvbnQgY29sb3I9IiMwMDAwRkYiPjxhIGhyZWY9InNub29wLmpzcCI+PGltZyBzcmM9Ii4uL2ltYWdlcy9leGVjdXRlLmdpZiIgYWxpZ249InJpZ2h0IiBib3JkZXI9IjAiPjwvYT48YSBocmVmPSIuLi9pbmRleC5odG1sIj48aW1nIHNyYz0iLi4vaW1hZ2VzL3JldHVybi5naWYiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgYWxpZ249InJpZ2h0IiBib3JkZXI9IjAiPjwvYT48L2ZvbnQ+PC9wPgorCis8aDM+PGEgaHJlZj0ic25vb3AuanNwLmh0bWwiPlNvdXJjZSBDb2RlIGZvciBSZXF1ZXN0IFBhcmFtZXRlcnMgRXhhbXBsZTxmb250IGNvbG9yPSIjMDAwMEZGIj48L2E+CisgIDwvZm9udD4gPC9oMz4KKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvc25wL3Nub29wLmpzcCBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL3NucC9zbm9vcC5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA3NzIxZQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL3NucC9zbm9vcC5qc3AKQEAgLTAsMCArMSw1NSBAQAorPGh0bWw+Cis8IS0tCisgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxib2R5IGJnY29sb3I9IndoaXRlIj4KKzxoMT4gUmVxdWVzdCBJbmZvcm1hdGlvbiA8L2gxPgorPGZvbnQgc2l6ZT0iNCI+CitKU1AgUmVxdWVzdCBNZXRob2Q6IDwlPSByZXF1ZXN0LmdldE1ldGhvZCgpICU+Cis8YnI+CitSZXF1ZXN0IFVSSTogPCU9IHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpICU+Cis8YnI+CitSZXF1ZXN0IFByb3RvY29sOiA8JT0gcmVxdWVzdC5nZXRQcm90b2NvbCgpICU+Cis8YnI+CitTZXJ2bGV0IHBhdGg6IDwlPSByZXF1ZXN0LmdldFNlcnZsZXRQYXRoKCkgJT4KKzxicj4KK1BhdGggaW5mbzogPCUgb3V0LnByaW50KHV0aWwuSFRNTEZpbHRlci5maWx0ZXIocmVxdWVzdC5nZXRQYXRoSW5mbygpKSk7ICU+Cis8YnI+CitRdWVyeSBzdHJpbmc6IDwlIG91dC5wcmludCh1dGlsLkhUTUxGaWx0ZXIuZmlsdGVyKHJlcXVlc3QuZ2V0UXVlcnlTdHJpbmcoKSkpOyAlPgorPGJyPgorQ29udGVudCBsZW5ndGg6IDwlPSByZXF1ZXN0LmdldENvbnRlbnRMZW5ndGgoKSAlPgorPGJyPgorQ29udGVudCB0eXBlOiA8JT0gcmVxdWVzdC5nZXRDb250ZW50VHlwZSgpICU+Cis8YnI+CitTZXJ2ZXIgbmFtZTogPCU9IHJlcXVlc3QuZ2V0U2VydmVyTmFtZSgpICU+Cis8YnI+CitTZXJ2ZXIgcG9ydDogPCU9IHJlcXVlc3QuZ2V0U2VydmVyUG9ydCgpICU+Cis8YnI+CitSZW1vdGUgdXNlcjogPCU9IHJlcXVlc3QuZ2V0UmVtb3RlVXNlcigpICU+Cis8YnI+CitSZW1vdGUgYWRkcmVzczogPCU9IHJlcXVlc3QuZ2V0UmVtb3RlQWRkcigpICU+Cis8YnI+CitSZW1vdGUgaG9zdDogPCU9IHJlcXVlc3QuZ2V0UmVtb3RlSG9zdCgpICU+Cis8YnI+CitBdXRob3JpemF0aW9uIHNjaGVtZTogPCU9IHJlcXVlc3QuZ2V0QXV0aFR5cGUoKSAlPiAKKzxicj4KK0xvY2FsZTogPCU9IHJlcXVlc3QuZ2V0TG9jYWxlKCkgJT4KKzxocj4KK1RoZSBicm93c2VyIHlvdSBhcmUgdXNpbmcgaXMgPCUgb3V0LnByaW50KHV0aWwuSFRNTEZpbHRlci5maWx0ZXIocmVxdWVzdC5nZXRIZWFkZXIoIlVzZXItQWdlbnQiKSkpOyAlPgorPGhyPgorPC9mb250PgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvc291cmNlLmpzcCBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL3NvdXJjZS5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q5ZTk1OAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL3NvdXJjZS5qc3AKQEAgLTAsMCArMSwxOSBAQAorPCEtLQorICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvdG9tY2F0L2V4YW1wbGVzLXRhZ2xpYiIKKyAgICAgICAgcHJlZml4PSJlZyIgJT4KKworPGVnOlNob3dTb3VyY2UganNwRmlsZT0iPCU9IHJlcXVlc3QuZ2V0UXVlcnlTdHJpbmcoKSAlPiIvPgpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvdGFncGx1Z2luL2Nob29zZS5odG1sIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvdGFncGx1Z2luL2Nob29zZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliMTVjM2YKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy90YWdwbHVnaW4vY2hvb3NlLmh0bWwKQEAgLTAsMCArMSwzNSBAQAorPCEtLQorICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWw+Cis8aGVhZD4KKzx0aXRsZT5WaWV3IFNvdXJjZSBDb2RlPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHkgYmdjb2xvcj0iI0ZGRkZGRiI+Cis8cD48Zm9udCBjb2xvcj0iIzAwMDBGRiI+CisgIDxhIGhyZWY9ImNob29zZS5qc3AiPgorICAgIDxpbWcgc3JjPSIuLi9pbWFnZXMvZXhlY3V0ZS5naWYiIGFsaWduPSJyaWdodCIgYm9yZGVyPSIwIj48L2E+CisgIDxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPgorICAgIDxpbWcgc3JjPSIuLi9pbWFnZXMvcmV0dXJuLmdpZiIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiBhbGlnbj0icmlnaHQiIGJvcmRlcj0iMCI+CisgIDwvYT48L2ZvbnQ+Cis8L3A+CisKKzxoMz4KKyAgPGEgaHJlZj0iY2hvb3NlLmpzcC5odG1sIj5Tb3VyY2UgQ29kZSBmb3IgY2hvb3NlLmpzcDxmb250IGNvbG9yPSIjMDAwMEZGIi8+PC9hPgorPC9oMz4KKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvdGFncGx1Z2luL2Nob29zZS5qc3AgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy90YWdwbHVnaW4vY2hvb3NlLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDM1NDUxCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvdGFncGx1Z2luL2Nob29zZS5qc3AKQEAgLTAsMCArMSw1NyBAQAorPCEtLQorICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWw+CisgIDxoZWFkPgorICAgIDx0aXRsZT5UYWcgRXhhbXBsZXMgLSBjaG9vc2U8L3RpdGxlPgorICA8L2hlYWQ+CisgIDxib2R5PgorICAgIDxoMT5UYWcgUGx1Z2luIEV4YW1wbGVzIC0gJmx0O2M6Y2hvb3NlPjwvaDE+CisKKyAgICA8aHI+CisgICAgPC9icj4KKyAgICA8YSBocmVmPSJub3Rlcy5odG1sIj5QbHVnaW4gSW50cm9kdWN0b3J5IE5vdGVzPGZvbnQgPGZvbnQgY29sb3I9IiMwMDAwRkYiPjwvCithPgorICAgIDxici8+CisgICAgPGEgaHJlZj0iaG93dG8uaHRtbCI+QnJpZWYgSW5zdHJ1Y3Rpb25zIGZvciBXcml0aW5nIFBsdWdpbnM8Zm9udCBjb2xvcj0iIzAwMAorMAorRkYiPjwvYT4KKyAgICA8YnIvPiA8YnIvPgorICAgIDxocj4KKworICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIi8+CisgICAgPC9icj4KKworICAgIDwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzcC9qc3RsL2NvcmUiIHByZWZpeD0iYyIgJT4KKworICAgIDxjOmZvckVhY2ggdmFyPSJpbmRleCIgYmVnaW49IjAiIGVuZD0iNCI+CisgICAgICAjICR7aW5kZXh9OiAKKyAgICAgIDxjOmNob29zZT4KKwk8Yzp3aGVuIHRlc3Q9IiR7aW5kZXggPT0gMX0iPgorICAgICAgICAgIE9uZSE8L2JyPgorCTwvYzp3aGVuPgorCTxjOndoZW4gdGVzdD0iJHtpbmRleCA9PSA0fSI+CisgICAgICAgICAgRm91ciE8L2JyPgorCTwvYzp3aGVuPgorCTxjOndoZW4gdGVzdD0iJHtpbmRleCA9PSAzfSI+CisgICAgICAgICAgVGhyZWUhPC9icj4KKwk8L2M6d2hlbj4KKwk8YzpvdGhlcndpc2U+CisgICAgICAgICAgSHVoPzwvYnI+CisJPC9jOm90aGVyd2lzZT4KKyAgICAgIDwvYzpjaG9vc2U+CisgICAgPC9jOmZvckVhY2g+CisgIDwvYm9keT4KKzwvaHRtbD4gCmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy90YWdwbHVnaW4vZm9yZWFjaC5odG1sIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvdGFncGx1Z2luL2ZvcmVhY2guaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzU2YTY2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvdGFncGx1Z2luL2ZvcmVhY2guaHRtbApAQCAtMCwwICsxLDM1IEBACis8IS0tCisgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbD4KKzxoZWFkPgorPHRpdGxlPlZpZXcgU291cmNlIENvZGU8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keSBiZ2NvbG9yPSIjRkZGRkZGIj4KKzxwPjxmb250IGNvbG9yPSIjMDAwMEZGIj4KKyAgPGEgaHJlZj0iZm9yZWFjaC5qc3AiPgorICAgIDxpbWcgc3JjPSIuLi9pbWFnZXMvZXhlY3V0ZS5naWYiIGFsaWduPSJyaWdodCIgYm9yZGVyPSIwIj48L2E+CisgIDxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPgorICAgIDxpbWcgc3JjPSIuLi9pbWFnZXMvcmV0dXJuLmdpZiIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiBhbGlnbj0icmlnaHQiIGJvcmRlcj0iMCI+CisgIDwvYT48L2ZvbnQ+Cis8L3A+CisKKzxoMz4KKyAgPGEgaHJlZj0iZm9yZWFjaC5qc3AuaHRtbCI+U291cmNlIENvZGUgZm9yIGZvcmVhY2guanNwPGZvbnQgY29sb3I9IiMwMDAwRkYiLz48L2E+Cis8L2gzPgorCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy90YWdwbHVnaW4vZm9yZWFjaC5qc3AgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy90YWdwbHVnaW4vZm9yZWFjaC5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM4ZTE4ZQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL3RhZ3BsdWdpbi9mb3JlYWNoLmpzcApAQCAtMCwwICsxLDU2IEBACis8IS0tCisgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbD4KKyAgPGhlYWQ+CisgICAgPHRpdGxlPlRhZyBQbHVnaW4gRXhhbXBsZXM6IGZvckVhY2g8L3RpdGxlPgorICA8L2hlYWQ+CisgIDxib2R5PgorICAgIDxoMT5UYWcgUGx1Z2luIEV4YW1wbGVzIC0gJmx0O2M6Zm9yRWFjaD48L2gxPgorCisgICAgPGhyPgorICAgIDwvYnI+CisgICAgPGEgaHJlZj0ibm90ZXMuaHRtbCI+UGx1Z2luIEludHJvZHVjdG9yeSBOb3Rlczxmb250IDxmb250IGNvbG9yPSIjMDAwMEZGIj48LworYT4KKyAgICA8YnIvPgorICAgIDxhIGhyZWY9Imhvd3RvLmh0bWwiPkJyaWVmIEluc3RydWN0aW9ucyBmb3IgV3JpdGluZyBQbHVnaW5zPGZvbnQgY29sb3I9IiMwMDAwCitGRiI+PC9hPgorICAgIDxici8+IDxici8+CisgICAgPGhyPgorCisgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiLz4KKyAgICA8L2JyPgorCisgICAgPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNwL2pzdGwvY29yZSIgcHJlZml4PSJjIiAlPgorICAgIDwlQCBwYWdlIGltcG9ydD0iamF2YS51dGlsLlZlY3RvciIgJT4KKworICAgIDxoMz5JdGVyYXRpbmcgb3ZlciBhIHJhbmdlPC9oMz4KKyAgICA8Yzpmb3JFYWNoIHZhcj0iaXRlbSIgYmVnaW49IjEiIGVuZD0iMTAiPgorICAgICAgICAke2l0ZW19CisgICAgPC9jOmZvckVhY2g+CisKKyAgICA8JSBWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsKKwl2LmFkZCgiT25lIik7IHYuYWRkKCJUd28iKTsgdi5hZGQoIlRocmVlIik7IHYuYWRkKCJGb3VyIik7CisKKwlwYWdlQ29udGV4dC5zZXRBdHRyaWJ1dGUoInZlY3RvciIsIHYpOworICAgICU+CisKKyAgICA8aDM+SXRlcmF0aW5nIG92ZXIgYSBWZWN0b3I8L2gzPgorCisgICAgPGM6Zm9yRWFjaCBpdGVtcz0iJHt2ZWN0b3J9IiB2YXI9Iml0ZW0iID4KKwkke2l0ZW19CisgICAgPC9jOmZvckVhY2g+CisgIDwvYm9keT4KKzwvaHRtbD4gCmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy90YWdwbHVnaW4vaG93dG8uaHRtbCBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL3RhZ3BsdWdpbi9ob3d0by5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NzU0NjUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy90YWdwbHVnaW4vaG93dG8uaHRtbApAQCAtMCwwICsxLDQyIEBACis8IS0tCisgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbD4KKyAgPGhlYWQ+CisgICAgPHRpdGxlPlRhZyBQbHVnaW4gSW1wbGVtZW50YXRpb248L3RpdGxlPgorICAgIDxoMj5Ib3cgdG8gd3JpdGUgdGFnIHBsdWdpbnM8L2gyPgorICAgIDxwPgorICAgICAgVG8gd3JpdGUgYSBwbHVnaW4sIHlvdSdsbCBuZWVkIHRvIGRvd25sb2FkIHRoZSBzb3VyY2UgZm9yIFRvbWNhdCA1LgorICAgICAgVGhlcmUgYXJlIHR3byBzdGVwczoKKyAgICA8b2w+CisgICAgICA8bGk+CisgICAgICAgIEltcGxlbWVudCB0aGUgcGx1Z2luIGNsYXNzLjxwLz4KKyAgICAgICAgVGhpcyBjbGFzcywgd2hpY2ggaW1wbGVtZW50cyAKKyAgICAgICAgPHR0Pm9yZy5hcGFjaGUuamFzcGVyLmNvbXBpbGVyLnRhZ3BsdWdpbi5UYWdQbHVnaW48L3R0PgorICAgICAgICBpbnN0cnVjdHMgSmFzcGVyIHdoYXQgSmF2YSBjb2RlcyB0byBnZW5lcmF0ZSBpbiBwbGFjZSBvZiB0aGUgdGFnCisgICAgICAgIGhhbmRsZXIgY2FsbHMuCisgICAgICAgIFNlZSBKYXZhZG9jIGZvciA8dHQ+b3JnLmFwYWNoZS5qYXNwZXIuY29tcGlsZXIudGFncGx1Z2luLlRhZ1BsdWdpbjwvdHQ+CisgICAgICAgIGZvciBkZXRhaWxzLgorICAgICAgPC9saT4KKworICAgICAgPGxpPgorICAgICAgICBDcmVhdGUgdGhlIHBsdWdpbiBkZXNjcmlwdG9yIGZpbGUgPHR0PiBXRUItSU5GL3RhZ1BsdWdpbnMueG1sPC90dD48cC8+CisgICAgICAgIFRoaXMgZmlsZQorICAgICAgICBzcGVjaWZpZXMgdGhlIHBsdWdpbiBjbGFzc2VzIGFuZCB0aGVpciBjb3JyZXNwb25kaW5nIHRhZyBoYW5kbGVyCisgICAgICAgIGNsYXNzZXMuCisgICAgICA8L2xpPgorICAgIDwvb2w+CisgIDwvaGVhZD4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL3RhZ3BsdWdpbi9pZi5odG1sIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMvdGFncGx1Z2luL2lmLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg1OTU4YQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL3RhZ3BsdWdpbi9pZi5odG1sCkBAIC0wLDAgKzEsMzUgQEAKKzwhLS0KKyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorPGhlYWQ+Cis8dGl0bGU+VmlldyBTb3VyY2UgQ29kZTwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5IGJnY29sb3I9IiNGRkZGRkYiPgorPHA+PGZvbnQgY29sb3I9IiMwMDAwRkYiPgorICA8YSBocmVmPSJpZi5qc3AiPgorICAgIDxpbWcgc3JjPSIuLi9pbWFnZXMvZXhlY3V0ZS5naWYiIGFsaWduPSJyaWdodCIgYm9yZGVyPSIwIj48L2E+CisgIDxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPgorICAgIDxpbWcgc3JjPSIuLi9pbWFnZXMvcmV0dXJuLmdpZiIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiBhbGlnbj0icmlnaHQiIGJvcmRlcj0iMCI+CisgIDwvYT48L2ZvbnQ+Cis8L3A+CisKKzxoMz4KKyAgPGEgaHJlZj0iaWYuanNwLmh0bWwiPlNvdXJjZSBDb2RlIGZvciBpZi5qc3A8Zm9udCBjb2xvcj0iIzAwMDBGRiIvPjwvYT4KKzwvaDM+CisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL3RhZ3BsdWdpbi9pZi5qc3AgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy90YWdwbHVnaW4vaWYuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2YzI2NDcKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy90YWdwbHVnaW4vaWYuanNwCkBAIC0wLDAgKzEsNDQgQEAKKzwhLS0KKyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorICA8aGVhZD4KKyAgICA8dGl0bGU+VGFnIFBsdWdpbiBFeGFtcGxlczogaWY8L3RpdGxlPgorICA8L2hlYWQ+CisgIDxib2R5PgorICAgIDxoMT5UYWcgUGx1Z2luIEV4YW1wbGVzIC0gJmx0O2M6aWY+PC9oMT4KKworICAgIDxocj4KKyAgICA8L2JyPgorICAgIDxhIGhyZWY9Im5vdGVzLmh0bWwiPlBsdWdpbiBJbnRyb2R1Y3RvcnkgTm90ZXM8Zm9udCA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+PC9hPgorICAgIDxici8+CisgICAgPGEgaHJlZj0iaG93dG8uaHRtbCI+QnJpZWYgSW5zdHJ1Y3Rpb25zIGZvciBXcmlldGluZyBQbHVnaW5zPGZvbnQgY29sb3I9IiMwMDAwRkYiPjwvYT4KKyAgICA8YnIvPiA8YnIvPgorICAgIDxocj4KKworICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIi8+CisgICAgPC9icj4KKyAgICA8JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc3AvanN0bC9jb3JlIiBwcmVmaXg9ImMiICU+CisKKyAgICA8aDM+U2V0IHRoZSB0ZXN0IHJlc3VsdCB0byBhIHZhcmlhYmxlPC9oMz4KKyAgICA8YzppZiB0ZXN0PSIkezE9PTF9IiB2YXI9InRoZVRydXRoIiBzY29wZT0ic2Vzc2lvbiIvPgorICAgIFRoZSByZXN1bHQgb2YgdGVzdGluZyBmb3IgKDE9PTEpIGlzOiAke3RoZVRydXRofQorCisgICAgPGgzPkNvbmRpdGlvbmFsbHkgZXhlY3V0ZSB0aGUgYm9keTwvaDM+CisgICAgPGM6aWYgdGVzdD0iJHsyPjB9Ij4KKwlJdCdzIHRydWUgdGhhdCAoMj4wKSEKKyAgICA8L2M6aWY+CisgIDwvYm9keT4KKzwvaHRtbD4gCmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy90YWdwbHVnaW4vbm90ZXMuaHRtbCBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL3RhZ3BsdWdpbi9ub3Rlcy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxMDc0NTAKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy90YWdwbHVnaW4vbm90ZXMuaHRtbApAQCAtMCwwICsxLDM4IEBACis8IS0tCisgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbD4KKyAgPGhlYWQ+CisgICAgPHRpdGxlPlRhZyBQbHVnaW4gSW50cm9kdWN0aW9uPC90aXRsZT4KKyAgICA8aDI+VGFnIFBsdWdpbnM6IEludHJvZHVjdG9yeSBOb3RlczwvaDI+CisgICAgPHA+CisgICAgICBUb21jYXQgNSBwcm92aWRlcyBhIGZyYW1ld29yayBmb3IgaW1wbGVtZW50aW5nIHRhZyBwbHVnaW5zLiAgVGhlCisgICAgICBwbHVnaW5zIGluc3RydWN0IEphc3BlciwgYXQgdHJhbnNsYXRpb24gdGltZSwgdG8gcmVwbGFjZSB0YWcgaGFuZGxlcgorICAgICAgY2FsbHMgd2l0aCBKYXZhIHNjcmlwdGxldHMuCisgICAgICBUaGUgZnJhbWV3b3JrIGFsbG93cyB0YWcgbGlicmFyeSBhdXRob3JzIHRvIGltcGxlbWVudCBwbHVnaW5zIGZvcgorICAgICAgdGhlaXIgdGFncy4KKyAgICA8L3A+CisgICAgPHA+CisgICAgICBUb21jYXQgNSBpcyByZWxlYXNlZCB3aXRoIHBsdWdpbnMgZm9yIHNldmVyYWwgSlNUTCB0YWdzLiAgTm90ZQorICAgICAgdGhhdCB0aGVzZSBwbHVnaW5zIHdvcmsgd2l0aCBKU1RMIDEuMSBhcyB3ZWxsIGFzIEpTVEwgMS4wLCB0aG91Z2gKKyAgICAgIHRoZSBleGFtcGxlcyB1c2VzIEpTVEwgMS4xIGFuZCBKU1AgMi4wLiAgCisgICAgICBUaGVzZSBwbHVnaW5zIGFyZSBub3QgY29tcGxldGUgKGZvciBpbnN0YW5jZSwgc29tZSBpdGVtIHR5cGVzIG5vdAorICAgICAgaGFuZGxlZCBpbiAmbHQ7YzppZj4pLgorICAgICAgVGhleSBkbyBzZXJ2ZSBhcyBleGFtcGxlcyB0byBzaG93IHBsdWdpbnMgaW4gYWN0aW9uIChqdXN0CisgICAgICBleGFtaW5lIHRoZSBnZW5lcmF0ZWQgSmF2YSBmaWxlcyksIGFuZCBob3cgdGhleSBjYW4gYmUgaW1wbGVtZW50ZWQuCisgICAgPC9wPgorICA8L2hlYWQ+Cis8L2h0bWw+CisKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL3htbC94bWwuaHRtbCBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL3htbC94bWwuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzg0MTI4Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvZXhhbXBsZXMveG1sL3htbC5odG1sCkBAIC0wLDAgKzEsMzAgQEAKKzxodG1sPgorPCEtLQorICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8aGVhZD4KKzx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKzwvaGVhZD4KKworPGJvZHkgYmdjb2xvcj0iI0ZGRkZGRiI+Cis8cD48Zm9udCBjb2xvcj0iIzAwMDBGRiI+PGEgaHJlZj0ieG1sLmpzcCI+PGltZyBzcmM9Ii4uL2ltYWdlcy9leGVjdXRlLmdpZiIgYWxpZ249InJpZ2h0IiBib3JkZXI9IjAiPjwvYT48YSBocmVmPSIuLi9pbmRleC5odG1sIj48aW1nIHNyYz0iLi4vaW1hZ2VzL3JldHVybi5naWYiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgYWxpZ249InJpZ2h0IiBib3JkZXI9IjAiPjwvYT48L2ZvbnQ+PC9wPgorCis8aDM+PGEgaHJlZj0ieG1sLmpzcC5odG1sIj5Tb3VyY2UgQ29kZSBmb3IgWE1MIHN5bnRheCBFeGFtcGxlPGZvbnQgY29sb3I9IiMwMDAwRkYiPjwvYT4KKyAgPC9mb250PiA8L2gzPgorCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy94bWwveG1sLmpzcCBiL3NlcnZsZXRhcGkvanNyMTUyL2V4YW1wbGVzL3htbC94bWwuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwMTRmZjgKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9leGFtcGxlcy94bWwveG1sLmpzcApAQCAtMCwwICsxLDY5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxqc3A6cm9vdCB4bWxuczpqc3A9Imh0dHA6Ly9qYXZhLnN1bi5jb20vSlNQL1BhZ2UiCisgIHZlcnNpb249IjEuMiI+Cis8anNwOmRpcmVjdGl2ZS5wYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWwiLz4KKzxqc3A6ZGlyZWN0aXZlLnBhZ2UgaW1wb3J0PSJqYXZhLnV0aWwuRGF0ZSwgamF2YS51dGlsLkxvY2FsZSIvPgorPGpzcDpkaXJlY3RpdmUucGFnZSBpbXBvcnQ9ImphdmEudGV4dC4qIi8+CisKKzxqc3A6ZGVjbGFyYXRpb24+CisgIFN0cmluZyBnZXREYXRlVGltZVN0cihMb2NhbGUgbCkgeworICAgIERhdGVGb3JtYXQgZGYgPSBTaW1wbGVEYXRlRm9ybWF0LmdldERhdGVUaW1lSW5zdGFuY2UoRGF0ZUZvcm1hdC5NRURJVU0sIERhdGVGb3JtYXQuTUVESVVNLCBsKTsKKyAgICByZXR1cm4gZGYuZm9ybWF0KG5ldyBEYXRlKCkpOworICB9Cis8L2pzcDpkZWNsYXJhdGlvbj4KKworPGh0bWw+Cis8aGVhZD4KKyAgPHRpdGxlPkV4YW1wbGUgSlNQIGluIFhNTCBmb3JtYXQ8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keT4KK1RoaXMgaXMgdGhlIG91dHB1dCBvZiBhIHNpbXBsZSBKU1AgdXNpbmcgWE1MIGZvcm1hdC4gCis8YnIgLz4KKworPGRpdj5Vc2UgYSBqc3A6c2NyaXB0bGV0IHRvIGxvb3AgZnJvbSAxIHRvIDEwOiA8L2Rpdj4KKzxqc3A6c2NyaXB0bGV0PgorLy8gTm90ZSB3ZSBuZWVkIHRvIGRlY2xhcmUgQ0RBVEEgYmVjYXVzZSB3ZSBkb24ndCBlc2NhcGUgdGhlIGxlc3MgdGhhbiBzeW1ib2wKKzwhW0NEQVRBWworICBmb3IgKGludCBpID0gMTsgaTw9MTA7IGkrKykgeworICAgIG91dC5wcmludGxuKGkpOworICAgIGlmIChpIDwgMTApIHsKKyAgICAgIG91dC5wcmludGxuKCIsICIpOworICAgIH0KKyAgfQorXV0+Cis8L2pzcDpzY3JpcHRsZXQ+CisKKzwhLS0gQmVjYXVzZSBJIG9taXQgYnIncyBlbmQgdGFnLCBkZWNsYXJlIGl0IGFzIENEQVRBIC0tPgorPCFbQ0RBVEFbCisgIDxicj48YnI+CitdXT4KKworPGRpdiBhbGlnbj0ibGVmdCI+CisgIFVzZSBhIGpzcDpleHByZXNzaW9uIHRvIHdyaXRlIHRoZSBkYXRlIGFuZCB0aW1lIGluIHRoZSBicm93c2VyJ3MgbG9jYWxlOiAKKyAgPGpzcDpleHByZXNzaW9uPmdldERhdGVUaW1lU3RyKHJlcXVlc3QuZ2V0TG9jYWxlKCkpPC9qc3A6ZXhwcmVzc2lvbj4KKzwvZGl2PgorCisKKzxqc3A6dGV4dD4KKyAgJmx0O3AmZ3Q7VGhpcyBzZW50ZW5jZSBpcyBlbmNsb3NlZCBpbiBhIGpzcDp0ZXh0IGVsZW1lbnQuJmx0Oy9wJmd0OworPC9qc3A6dGV4dD4KKworPC9ib2R5PgorPC9odG1sPgorPC9qc3A6cm9vdD4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9hbnQvdGFzay9UeHQySHRtbC5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTIvc3JjL2FudC90YXNrL1R4dDJIdG1sLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJiZjg1YQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9hbnQvdGFzay9UeHQySHRtbC5qYXZhCkBAIC0wLDAgKzEsMTYzIEBACisvKgorKiBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK3BhY2thZ2UgdGFzazsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5EaXJlY3RvcnlTY2FubmVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0OworCisvKioKKyAqIEFudCB0YXNrIHRvIGNvbnZlcnQgYSBnaXZlbiBzZXQgb2YgZmlsZXMgZnJvbSBUZXh0IHRvIEhUTUwuCisgKiBJbnNlcnRzIGFuIEhUTUwgaGVhZGVyIGluY2x1ZGluZyBwcmUgdGFncyBhbmQgcmVwbGFjZXMgc3BlY2lhbCBjaGFyYWN0ZXJzCisgKiB3aXRoIHRoZWlyIEhUTUwgZXNjYXBlZCBlcXVpdmFsZW50cy4KKyAqCisgKiA8cD5UaGlzIHRhc2sgaXMgY3VycmVudGx5IHVzZWQgYnkgdGhlIGFudCBzY3JpcHQgdG8gYnVpbGQgb3VyIGV4YW1wbGVzPC9wPgorICoKKyAqIEBhdXRob3IgTWFyayBSb3RoCisgKi8KK3B1YmxpYyBjbGFzcyBUeHQySHRtbCAKKyAgICBleHRlbmRzIFRhc2sgCit7CisgICAgCisgICAgLyoqIFRoZSBkaXJlY3RvcnkgdG8gY29udGFpbiB0aGUgcmVzdWx0aW5nIGZpbGVzICovCisgICAgcHJpdmF0ZSBGaWxlIHRvZGlyOworICAgIAorICAgIC8qKiBUaGUgZmlsZSB0byBiZSBjb252ZXJ0ZWQgaW50byBIVE1MICovCisgICAgcHJpdmF0ZSBMaXN0IGZpbGVzZXRzID0gbmV3IExpbmtlZExpc3QoKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBkaXJlY3RvcnkgdG8gY29udGFpbiB0aGUgcmVzdWx0aW5nIGZpbGVzCisgICAgICoKKyAgICAgKiBAcGFyYW0gdG9kaXIgVGhlIGRpcmVjdG9yeQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRvZGlyKCBGaWxlIHRvZGlyICkgeworICAgICAgICB0aGlzLnRvZGlyID0gdG9kaXI7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldHMgdGhlIGZpbGVzIHRvIGJlIGNvbnZlcnRlZCBpbnRvIEhUTUwKKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWxlc2V0IFRoZSBmaWxlc2V0IHRvIGJlIGNvbnZlcnRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRGaWxlc2V0KCBGaWxlU2V0IGZzICkgeworICAgICAgICBmaWxlc2V0cy5hZGQoIGZzICk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFBlcmZvcm0gdGhlIGNvbnZlcnNpb24KKyAgICAgKgorICAgICAqIEBwYXJhbSBCdWlsZEV4Y2VwdGlvbiBUaHJvd24gaWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyBleGVjdXRpb24gb2YKKyAgICAgKiAgICB0aGlzIHRhc2suCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIAorICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24gCisgICAgeworICAgICAgICBpbnQgY291bnQgPSAwOworICAgICAgICAKKyAgICAgICAgLy8gU3RlcCB0aHJvdWdoIGVhY2ggZmlsZSBhbmQgY29udmVydC4KKyAgICAgICAgSXRlcmF0b3IgaXRlciA9IGZpbGVzZXRzLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlKCBpdGVyLmhhc05leHQoKSApIHsKKyAgICAgICAgICAgIEZpbGVTZXQgZnMgPSAoRmlsZVNldClpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIERpcmVjdG9yeVNjYW5uZXIgZHMgPSBmcy5nZXREaXJlY3RvcnlTY2FubmVyKCBwcm9qZWN0ICk7CisgICAgICAgICAgICBGaWxlIGJhc2VkaXIgPSBkcy5nZXRCYXNlZGlyKCk7CisgICAgICAgICAgICBTdHJpbmdbXSBmaWxlcyA9IGRzLmdldEluY2x1ZGVkRmlsZXMoKTsKKyAgICAgICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKysgKSB7CisgICAgICAgICAgICAgICAgRmlsZSBmcm9tID0gbmV3IEZpbGUoIGJhc2VkaXIsIGZpbGVzW2ldICk7CisgICAgICAgICAgICAgICAgRmlsZSB0byA9IG5ldyBGaWxlKCB0b2RpciwgZmlsZXNbaV0gKyAiLmh0bWwiICk7CisgICAgICAgICAgICAgICAgaWYoICF0by5leGlzdHMoKSB8fCAKKyAgICAgICAgICAgICAgICAgICAgKGZyb20ubGFzdE1vZGlmaWVkKCkgPiB0by5sYXN0TW9kaWZpZWQoKSkgKSAKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGxvZyggIkNvbnZlcnRpbmcgZmlsZSAnIiArIGZyb20uZ2V0QWJzb2x1dGVQYXRoKCkgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICInIHRvICciICsgdG8uZ2V0QWJzb2x1dGVQYXRoKCksIFByb2plY3QuTVNHX1ZFUkJPU0UgKTsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnQoIGZyb20sIHRvICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2goIElPRXhjZXB0aW9uIGUgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oICJDb3VsZCBub3QgY29udmVydCAnIiArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20uZ2V0QWJzb2x1dGVQYXRoKCkgKyAiJyB0byAnIiArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvLmdldEFic29sdXRlUGF0aCgpICsgIiciLCBlICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiggY291bnQgPiAwICkgeworICAgICAgICAgICAgICAgIGxvZyggIkNvbnZlcnRlZCAiICsgY291bnQgKyAiIGZpbGUiICsgKGNvdW50ID4gMSA/ICJzIiA6ICIiKSArIAorICAgICAgICAgICAgICAgICAgICAiIHRvICIgKyB0b2Rpci5nZXRBYnNvbHV0ZVBhdGgoKSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFBlcmZvcm0gdGhlIGFjdHVhbCBjb3B5IGFuZCBjb252ZXJzaW9uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJvbSBUaGUgaW5wdXQgZmlsZQorICAgICAqIEBwYXJhbSB0byBUaGUgb3V0cHV0IGZpbGUKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFRocm93biBpZiBhbiBlcnJvciBvY2N1cnMgZHVyaW5nIHRoZSBjb252ZXJzaW9uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGNvbnZlcnQoIEZpbGUgZnJvbSwgRmlsZSB0byApCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgLy8gT3BlbiBmaWxlczoKKyAgICAgICAgQnVmZmVyZWRSZWFkZXIgaW4gPSBuZXcgQnVmZmVyZWRSZWFkZXIoIG5ldyBGaWxlUmVhZGVyKCBmcm9tICkgKTsKKyAgICAgICAgUHJpbnRXcml0ZXIgb3V0ID0gbmV3IFByaW50V3JpdGVyKCBuZXcgRmlsZVdyaXRlciggdG8gKSApOworICAgICAgICAKKyAgICAgICAgLy8gT3V0cHV0IGhlYWRlcjoKKyAgICAgICAgb3V0LnByaW50bG4oICI8aHRtbD48Ym9keT48cHJlPiIgKTsKKyAgICAgICAgCisgICAgICAgIC8vIENvbnZlcnQsIGxpbmUtYnktbGluZToKKyAgICAgICAgU3RyaW5nIGxpbmU7CisgICAgICAgIHdoaWxlKCAobGluZSA9IGluLnJlYWRMaW5lKCkpICE9IG51bGwgKSB7CisgICAgICAgICAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICAgICAgaW50IGxlbiA9IGxpbmUubGVuZ3RoKCk7CisgICAgICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IGxlbjsgaSsrICkgeworICAgICAgICAgICAgICAgIGNoYXIgYyA9IGxpbmUuY2hhckF0KCBpICk7CisgICAgICAgICAgICAgICAgc3dpdGNoKCBjICkgeworICAgICAgICAgICAgICAgICAgICBjYXNlICcmJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoICImYW1wOyIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlICc8JzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoICImbHQ7IiApOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCBjICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgb3V0LnByaW50bG4oIHJlc3VsdC50b1N0cmluZygpICk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIE91dHB1dCBmb290ZXI6CisgICAgICAgIG91dC5wcmludGxuKCAiPC9wcmU+PC9ib2R5PjwvaHRtbD4iICk7CisgICAgICAgIAorICAgICAgICAvLyBDbG9zZSBzdHJlYW1zOgorICAgICAgICBvdXQuY2xvc2UoKTsKKyAgICAgICAgaW4uY2xvc2UoKTsKKyAgICB9CisgICAgCit9CisKKwpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvc3JjL2V0Yy9tYW5pZmVzdCBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9ldGMvbWFuaWZlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk0ODQzZQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9ldGMvbWFuaWZlc3QKQEAgLTAsMCArMSwxMCBAQAorTWFuaWZlc3QtdmVyc2lvbjogMS4wCisKK05hbWU6IGphdmF4L3NlcnZsZXQvanNwLworU3BlY2lmaWNhdGlvbi1UaXRsZTogSmF2YSBBUEkgZm9yIEphdmFTZXJ2ZXIgUGFnZXMKK1NwZWNpZmljYXRpb24tVmVyc2lvbjogMi4wCitTcGVjaWZpY2F0aW9uLVZlbmRvcjogU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgorSW1wbGVtZW50YXRpb24tVGl0bGU6IGphdmF4LnNlcnZsZXQuanNwCitJbXBsZW1lbnRhdGlvbi1WZXJzaW9uOiAyLjAuQGltcGxlbWVudGF0aW9uLnJldmlzaW9uQAorSW1wbGVtZW50YXRpb24tVmVuZG9yOiBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvZHRkL2pzcF8yXzAueHNkIGIvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2R0ZC9qc3BfMl8wLnhzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTliYmFhCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2R0ZC9qc3BfMl8wLnhzZApAQCAtMCwwICsxLDMyMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzx4c2Q6c2NoZW1hIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKKwkgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgorCSAgICB4bWxuczpqMmVlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgorCSAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgorCSAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKKwkgICAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIgorCSAgICB2ZXJzaW9uPSIyLjAiPgorICA8eHNkOmFubm90YXRpb24+CisgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorICAgICAgQCgjKWpzcF8yXzAueHNkcwkxLjE3IDAzLzE4LzAzCisgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgPC94c2Q6YW5ub3RhdGlvbj4KKworICA8eHNkOmFubm90YXRpb24+CisgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICBDb3B5cmlnaHQgMjAwMiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA5MDEgU2FuIEFudG9uaW8KKyAgICAgIFJvYWQsIFBhbG8gQWx0bywgQ2FsaWZvcm5pYSA5NDMwMywgVS5TLkEuIEFsbCByaWdodHMKKyAgICAgIHJlc2VydmVkLgorCisgICAgICBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGhhcyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCisgICAgICByZWxhdGluZyB0byB0ZWNobm9sb2d5IGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LiBJbgorICAgICAgcGFydGljdWxhciwgYW5kIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlc2UgaW50ZWxsZWN0dWFsCisgICAgICBwcm9wZXJ0eSByaWdodHMgbWF5IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIFUuUy4gcGF0ZW50cworICAgICAgbGlzdGVkIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGFuZCBvbmUgb3IgbW9yZQorICAgICAgYWRkaXRpb25hbCBwYXRlbnRzIG9yIHBlbmRpbmcgcGF0ZW50IGFwcGxpY2F0aW9ucyBpbiB0aGUKKyAgICAgIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KKworICAgICAgVGhpcyBkb2N1bWVudCBhbmQgdGhlIHRlY2hub2xvZ3kgd2hpY2ggaXQgZGVzY3JpYmVzIGFyZQorICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgdGhlaXIgdXNlLCBjb3B5aW5nLAorICAgICAgZGlzdHJpYnV0aW9uLCBhbmQgZGVjb21waWxhdGlvbi4gTm8gcGFydCBvZiB0aGlzIGRvY3VtZW50CisgICAgICBtYXkgYmUgcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvcgorICAgICAgd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LgorCisgICAgICBUaGlyZC1wYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMKKyAgICAgIGNvcHlyaWdodGVkIGFuZCBsaWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuCisKKyAgICAgIFN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBsb2dvLCBTb2xhcmlzLCBKYXZhLCBKMkVFLAorICAgICAgSmF2YVNlcnZlciBQYWdlcywgRW50ZXJwcmlzZSBKYXZhQmVhbnMgYW5kIHRoZSBKYXZhIENvZmZlZQorICAgICAgQ3VwIGxvZ28gYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1bgorICAgICAgTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCisKKyAgICAgIEZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycworICAgICAgU3ViamVjdCB0byBTdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgorCisgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgPC94c2Q6YW5ub3RhdGlvbj4KKworICA8eHNkOmFubm90YXRpb24+CisgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICBUaGlzIGlzIHRoZSBYTUwgU2NoZW1hIGZvciB0aGUgSlNQIDIuMCBkZXBsb3ltZW50IGRlc2NyaXB0b3IKKyAgICAgIHR5cGVzLiAgVGhlIEpTUCAyLjAgc2NoZW1hIGNvbnRhaW5zIGFsbCB0aGUgc3BlY2lhbAorICAgICAgc3RydWN0dXJlcyBhbmQgZGF0YXR5cGVzIHRoYXQgYXJlIG5lY2Vzc2FyeSB0byB1c2UgSlNQIGZpbGVzCisgICAgICBmcm9tIGEgd2ViIGFwcGxpY2F0aW9uLgorCisgICAgICBUaGUgY29udGVudHMgb2YgdGhpcyBzY2hlbWEgaXMgdXNlZCBieSB0aGUgd2ViLWFwcF8yXzQueHNkCisgICAgICBmaWxlIHRvIGRlZmluZSBKU1Agc3BlY2lmaWMgY29udGVudC4KKworICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgIDwveHNkOmFubm90YXRpb24+CisKKyAgPHhzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgVGhlIGZvbGxvd2luZyBjb252ZW50aW9ucyBhcHBseSB0byBhbGwgSjJFRQorICAgICAgZGVwbG95bWVudCBkZXNjcmlwdG9yIGVsZW1lbnRzIHVubGVzcyBpbmRpY2F0ZWQgb3RoZXJ3aXNlLgorCisgICAgICAtIEluIGVsZW1lbnRzIHRoYXQgc3BlY2lmeSBhIHBhdGhuYW1lIHRvIGEgZmlsZSB3aXRoaW4gdGhlCisJc2FtZSBKQVIgZmlsZSwgcmVsYXRpdmUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZSBub3QKKwlzdGFydGluZyB3aXRoICIvIikgYXJlIGNvbnNpZGVyZWQgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YKKwl0aGUgSkFSIGZpbGUncyBuYW1lc3BhY2UuICBBYnNvbHV0ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlCisJc3RhcnRpbmcgd2l0aCAiLyIpIGFsc28gc3BlY2lmeSBuYW1lcyBpbiB0aGUgcm9vdCBvZiB0aGUKKwlKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEluIGdlbmVyYWwsIHJlbGF0aXZlIG5hbWVzIGFyZQorCXByZWZlcnJlZC4gIFRoZSBleGNlcHRpb24gaXMgLndhciBmaWxlcyB3aGVyZSBhYnNvbHV0ZQorCW5hbWVzIGFyZSBwcmVmZXJyZWQgZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlIFNlcnZsZXQgQVBJLgorCisgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgPC94c2Q6YW5ub3RhdGlvbj4KKworICA8eHNkOmluY2x1ZGUgc2NoZW1hTG9jYXRpb249ImoyZWVfMV80LnhzZCIvPgorCisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImpzcC1jb25maWdUeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwlUaGUganNwLWNvbmZpZ1R5cGUgaXMgdXNlZCB0byBwcm92aWRlIGdsb2JhbCBjb25maWd1cmF0aW9uCisJaW5mb3JtYXRpb24gZm9yIHRoZSBKU1AgZmlsZXMgaW4gYSB3ZWIgYXBwbGljYXRpb24uIEl0IGhhcworCXR3byBzdWJlbGVtZW50cywgdGFnbGliIGFuZCBqc3AtcHJvcGVydHktZ3JvdXAuCisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKworICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFnbGliIgorCQkgICB0eXBlPSJqMmVlOnRhZ2xpYlR5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCIKKwkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqc3AtcHJvcGVydHktZ3JvdXAiCisJCSAgIHR5cGU9ImoyZWU6anNwLXByb3BlcnR5LWdyb3VwVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIgorCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImpzcC1maWxlVHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJVGhlIGpzcC1maWxlIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGwgcGF0aCB0byBhIEpTUCBmaWxlCisJd2l0aGluIHRoZSB3ZWIgYXBwbGljYXRpb24gYmVnaW5uaW5nIHdpdGggYSBgLycuCisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKworICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpwYXRoVHlwZSIvPgorICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJqc3AtcHJvcGVydHktZ3JvdXBUeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwlUaGUganNwLXByb3BlcnR5LWdyb3VwVHlwZSBpcyB1c2VkIHRvIGdyb3VwIGEgbnVtYmVyIG9mCisJZmlsZXMgc28gdGhleSBjYW4gYmUgZ2l2ZW4gZ2xvYmFsIHByb3BlcnR5IGluZm9ybWF0aW9uLgorCUFsbCBmaWxlcyBzbyBkZXNjcmliZWQgYXJlIGRlZW1lZCB0byBiZSBKU1AgZmlsZXMuICBUaGUKKwlmb2xsb3dpbmcgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIGNhbiBiZSBkZXNjcmliZWQ6CisKKwkgICAgLSBDb250cm9sIHdoZXRoZXIgRUwgaXMgaWdub3JlZAorCSAgICAtIENvbnRyb2wgd2hldGhlciBzY3JpcHRpbmcgZWxlbWVudHMgYXJlIGludmFsaWQKKwkgICAgLSBJbmRpY2F0ZSBwYWdlRW5jb2RpbmcgaW5mb3JtYXRpb24uCisJICAgIC0gSW5kaWNhdGUgdGhhdCBhIHJlc291cmNlIGlzIGEgSlNQIGRvY3VtZW50IChYTUwpCisJICAgIC0gUHJlbHVkZSBhbmQgQ29kYSBhdXRvbWF0aWMgaW5jbHVkZXMuCisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKworICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmdyb3VwIHJlZj0iajJlZTpkZXNjcmlwdGlvbkdyb3VwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idXJsLXBhdHRlcm4iCisJCSAgIHR5cGU9ImoyZWU6dXJsLXBhdHRlcm5UeXBlIgorCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVsLWlnbm9yZWQiCisJCSAgIHR5cGU9ImoyZWU6dHJ1ZS1mYWxzZVR5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCI+CisJPHhzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICAgIENhbiBiZSB1c2VkIHRvIGVhc2lseSBzZXQgdGhlIGlzRUxJZ25vcmVkCisJICAgIHByb3BlcnR5IG9mIGEgZ3JvdXAgb2YgSlNQIHBhZ2VzLiAgQnkgZGVmYXVsdCwgdGhlCisJICAgIEVMIGV2YWx1YXRpb24gaXMgZW5hYmxlZCBmb3IgV2ViIEFwcGxpY2F0aW9ucyB1c2luZworCSAgICBhIFNlcnZsZXQgMi40IG9yIGdyZWF0ZXIgd2ViLnhtbCwgYW5kIGRpc2FibGVkCisJICAgIG90aGVyd2lzZS4KKworCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwk8L3hzZDphbm5vdGF0aW9uPgorICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYWdlLWVuY29kaW5nIgorCQkgICB0eXBlPSJqMmVlOnN0cmluZyIKKwkJICAgbWluT2NjdXJzPSIwIj4KKwk8eHNkOmFubm90YXRpb24+CisJICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgICAgVGhlIHZhbGlkIHZhbHVlcyBvZiBwYWdlLWVuY29kaW5nIGFyZSB0aG9zZSBvZiB0aGUKKwkgICAgcGFnZUVuY29kaW5nIHBhZ2UgZGlyZWN0aXZlLiAgSXQgaXMgYQorCSAgICB0cmFuc2xhdGlvbi10aW1lIGVycm9yIHRvIG5hbWUgZGlmZmVyZW50IGVuY29kaW5ncworCSAgICBpbiB0aGUgcGFnZUVuY29kaW5nIGF0dHJpYnV0ZSBvZiB0aGUgcGFnZSBkaXJlY3RpdmUKKwkgICAgb2YgYSBKU1AgcGFnZSBhbmQgaW4gYSBKU1AgY29uZmlndXJhdGlvbiBlbGVtZW50CisJICAgIG1hdGNoaW5nIHRoZSBwYWdlLiAgSXQgaXMgYWxzbyBhIHRyYW5zbGF0aW9uLXRpbWUKKwkgICAgZXJyb3IgdG8gbmFtZSBkaWZmZXJlbnQgZW5jb2RpbmdzIGluIHRoZSBwcm9sb2cKKwkgICAgb3IgdGV4dCBkZWNsYXJhdGlvbiBvZiBhIGRvY3VtZW50IGluIFhNTCBzeW50YXggYW5kCisJICAgIGluIGEgSlNQIGNvbmZpZ3VyYXRpb24gZWxlbWVudCBtYXRjaGluZyB0aGUgZG9jdW1lbnQuCisJICAgIEl0IGlzIGxlZ2FsIHRvIG5hbWUgdGhlIHNhbWUgZW5jb2RpbmcgdGhyb3VnaAorCSAgICBtdWxpdHBsZSBtZWNoYW5pc21zLgorCisJICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCTwveHNkOmFubm90YXRpb24+CisgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNjcmlwdGluZy1pbnZhbGlkIgorCQkgICB0eXBlPSJqMmVlOnRydWUtZmFsc2VUeXBlIgorCQkgICBtaW5PY2N1cnM9IjAiPgorCTx4c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgICBDYW4gYmUgdXNlZCB0byBlYXNpbHkgZGlzYWJsZSBzY3JpcHRpbmcgaW4gYQorCSAgICBncm91cCBvZiBKU1AgcGFnZXMuICBCeSBkZWZhdWx0LCBzY3JpcHRpbmcgaXMKKwkgICAgZW5hYmxlZC4KKworCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwk8L3hzZDphbm5vdGF0aW9uPgorICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpcy14bWwiCisJCSAgIHR5cGU9ImoyZWU6dHJ1ZS1mYWxzZVR5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCI+CisJPHhzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICAgIElmIHRydWUsIGRlbm90ZXMgdGhhdCB0aGUgZ3JvdXAgb2YgcmVzb3VyY2VzCisJICAgIHRoYXQgbWF0Y2ggdGhlIFVSTCBwYXR0ZXJuIGFyZSBKU1AgZG9jdW1lbnRzLAorCSAgICBhbmQgdGh1cyBtdXN0IGJlIGludGVycHJldGVkIGFzIFhNTCBkb2N1bWVudHMuCisJICAgIElmIGZhbHNlLCB0aGUgcmVzb3VyY2VzIGFyZSBhc3N1bWVkIHRvIG5vdAorCSAgICBiZSBKU1AgZG9jdW1lbnRzLCB1bmxlc3MgdGhlcmUgaXMgYW5vdGhlcgorCSAgICBwcm9wZXJ0eSBncm91cCB0aGF0IGluZGljYXRlcyBvdGhlcndpc2UuCisKKwkgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5jbHVkZS1wcmVsdWRlIgorCQkgICB0eXBlPSJqMmVlOnBhdGhUeXBlIgorCQkgICBtaW5PY2N1cnM9IjAiCisJCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKwk8eHNkOmFubm90YXRpb24+CisJICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgICAgVGhlIGluY2x1ZGUtcHJlbHVkZSBlbGVtZW50IGlzIGEgY29udGV4dC1yZWxhdGl2ZQorCSAgICBwYXRoIHRoYXQgbXVzdCBjb3JyZXNwb25kIHRvIGFuIGVsZW1lbnQgaW4gdGhlCisJICAgIFdlYiBBcHBsaWNhdGlvbi4gIFdoZW4gdGhlIGVsZW1lbnQgaXMgcHJlc2VudCwKKwkgICAgdGhlIGdpdmVuIHBhdGggd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGluY2x1ZGVkIChhcworCSAgICBpbiBhbiBpbmNsdWRlIGRpcmVjdGl2ZSkgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoCisJICAgIEpTUCBwYWdlIGluIHRoaXMganNwLXByb3BlcnR5LWdyb3VwLgorCisJICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCTwveHNkOmFubm90YXRpb24+CisgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImluY2x1ZGUtY29kYSIKKwkJICAgdHlwZT0iajJlZTpwYXRoVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIgorCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisJPHhzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICAgIFRoZSBpbmNsdWRlLWNvZGEgZWxlbWVudCBpcyBhIGNvbnRleHQtcmVsYXRpdmUKKwkgICAgcGF0aCB0aGF0IG11c3QgY29ycmVzcG9uZCB0byBhbiBlbGVtZW50IGluIHRoZQorCSAgICBXZWIgQXBwbGljYXRpb24uICBXaGVuIHRoZSBlbGVtZW50IGlzIHByZXNlbnQsCisJICAgIHRoZSBnaXZlbiBwYXRoIHdpbGwgYmUgYXV0b21hdGljYWxseSBpbmNsdWRlZCAoYXMKKwkgICAgaW4gYW4gaW5jbHVkZSBkaXJlY3RpdmUpIGF0IHRoZSBlbmQgb2YgZWFjaAorCSAgICBKU1AgcGFnZSBpbiB0aGlzIGpzcC1wcm9wZXJ0eS1ncm91cC4KKworCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwk8L3hzZDphbm5vdGF0aW9uPgorICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0YWdsaWJUeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwlUaGUgdGFnbGliVHlwZSBkZWZpbmVzIHRoZSBzeW50YXggZm9yIGRlY2xhcmluZyBpbgorCXRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgdGhhdCBhIHRhZyBsaWJyYXJ5IGlzCisJYXZhaWxhYmxlIHRvIHRoZSBhcHBsaWNhdGlvbi4gIFRoaXMgY2FuIGJlIGRvbmUKKwl0byBvdmVycmlkZSBpbXBsaWNpdCBtYXAgZW50cmllcyBmcm9tIFRMRCBmaWxlcyBhbmQKKwlmcm9tIHRoZSBjb250YWluZXIuCisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKworICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFnbGliLXVyaSIKKwkJICAgdHlwZT0iajJlZTpzdHJpbmciPgorCTx4c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgICBBIHRhZ2xpYi11cmkgZWxlbWVudCBkZXNjcmliZXMgYSBVUkkgaWRlbnRpZnlpbmcgYQorCSAgICB0YWcgbGlicmFyeSB1c2VkIGluIHRoZSB3ZWIgYXBwbGljYXRpb24uICBUaGUgYm9keQorCSAgICBvZiB0aGUgdGFnbGliLXVyaSBlbGVtZW50IG1heSBiZSBlaXRoZXIgYW4KKwkgICAgYWJzb2x1dGUgVVJJIHNwZWNpZmljYXRpb24sIG9yIGEgcmVsYXRpdmUgVVJJLgorCSAgICBUaGVyZSBzaG91bGQgYmUgbm8gZW50cmllcyBpbiB3ZWIueG1sIHdpdGggdGhlCisJICAgIHNhbWUgdGFnbGliLXVyaSB2YWx1ZS4KKworCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwk8L3hzZDphbm5vdGF0aW9uPgorICAgICAgPC94c2Q6ZWxlbWVudD4KKworICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhZ2xpYi1sb2NhdGlvbiIKKwkJICAgdHlwZT0iajJlZTpwYXRoVHlwZSI+CisJPHhzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICAgIHRoZSB0YWdsaWItbG9jYXRpb24gZWxlbWVudCBjb250YWlucyB0aGUgbG9jYXRpb24KKwkgICAgKGFzIGEgcmVzb3VyY2UgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIHdlYgorCSAgICBhcHBsaWNhdGlvbikgd2hlcmUgdG8gZmluZCB0aGUgVGFnIExpYnJhcnkKKwkgICAgRGVzY3JpcHRpb24gZmlsZSBmb3IgdGhlIHRhZyBsaWJyYXJ5LgorCisJICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCTwveHNkOmFubm90YXRpb24+CisgICAgICA8L3hzZDplbGVtZW50PgorCisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPC94c2Q6c2NoZW1hPgorCmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvZHRkL2pzcHhtbC5kdGQgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvZHRkL2pzcHhtbC5kdGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZmZTA0NgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9kdGQvanNweG1sLmR0ZApAQCAtMCwwICsxLDE4OSBAQAorPCEtLQorICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPCEtLSBEVEQgZm9yIEpTUCAyLjAKKyAgICAgdGhhbmtzIHRvIEJvYiBGb3N0ZXIsIFdlYkdhaW4KKy0tPgorCis8IS0tIAorICAgICBUaGlzIERURCBpcyBub3QgY29uZGl0aW9uYWwgb24gYW55IHBhcmFtZXRlciBlbnRpdGllcyBpbiB0aGUgaW50ZXJuYWwKKyAgICAgc3Vic2V0IGFuZCBkb2VzIG5vdCBleHBvcnQgYW55IGdlbmVyYWwgZW50aXRpZXMuCistLT4KKworPCEtLT09PT09PT09PT09PT09PT09PSBDb25zdHJhaW5lZCBOYW1lcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKworPCFFTlRJVFkgJSBVUkkgIkNEQVRBIj4KKyAgICA8IS0tIGEgVW5pZm9ybSBSZXNvdXJjZSBJZGVudGlmaWVyLCBzZWUgW1JGQzIzOTZdIC0tPgorCis8IUVOVElUWSAlIFVyaUxpc3QgIkNEQVRBIj4KKyAgICA8IS0tIGEgc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgVW5pZm9ybSBSZXNvdXJjZSBJZGVudGlmaWVycyAtLT4KKworPCFFTlRJVFkgJSBVUkwgIkNEQVRBIj4KKyAgICA8IS0tIGEgcmVsYXRpdmUgdXJsU3BlYyBpcyBhcyBpbiBTZWN0aW9uIDIuMTAuMi4gLS0+CisKKzwhRU5USVRZICUgQmVhbklEICJJRFJFRiI+CisgICAgPCEtLSBhIHByZXZpb3VzbHkgZGVjbGFyZWQgYmVhbiBJRCBpbiB0aGUgY3VycmVudCBzY29wZS4gLS0+CisKKzwhRU5USVRZICUgUHJlZml4ICJDREFUQSI+CisgICAgPCEtLSBhIE5hbWUgdGhhdCBjb250YWlucyBubyA6IGNoYXJhY3RlcnMuIC0tPgorCis8IUVOVElUWSAlIENsYXNzTmFtZSAiQ0RBVEEiPgorICAgIDwhLS0gYSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZS4gLS0+CisKKzwhRU5USVRZICUgVHlwZU5hbWUgIkNEQVRBIj4KKyAgICA8IS0tIGEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG9yIGludGVyZmFjZSBuYW1lLiAtLT4KKworPCFFTlRJVFkgJSBCZWFuTmFtZSAiQ0RBVEEiPgorICAgIDwhLS0gYSBiZWFuIG5hbWUgYXMgZXhwZWN0ZWQgYnkgamF2YS5iZWFucy5CZWFucyBpbnN0YW50aWF0ZSgpLiAtLT4KKworPCFFTlRJVFkgJSBDb250ZW50ICJDREFUQSI+CisgICAgPCEtLSBhIE1JTUUgdHlwZSBmb2xsb3dlZCBieSBhbiBJQU5BIGNoYXJzZXQsIGFzICIgdHlwZSBbOyBTPyBbJ2NoYXJzZXQ9J10gY2hhcnNldF0gIiAtLT4KKworPCFFTlRJVFkgJSBMZW5ndGggIkNEQVRBIj4KKyAgICA8IS0tIG5uIGZvciBwaXhlbHMgb3Igbm4lIGZvciBwZXJjZW50YWdlIGxlbmd0aCAtLT4KKworPCFFTlRJVFkgJSBQaXhlbHMgIkNEQVRBIj4KKyAgICA8IS0tIGludGVnZXIgcmVwcmVzZW50aW5nIGxlbmd0aCBpbiBwaXhlbHMgLS0+CisKKzwhRU5USVRZICUgQm9vbCAiKHRydWV8ZmFsc2V8eWVzfG5vKSI+CisgICAgPCEtLSBib29sZWFuIC0tPgorCis8IS0tIHVzZWQgZm9yIG9iamVjdCwgYXBwbGV0LCBpbWcsIGlucHV0IGFuZCBpZnJhbWUgLS0+Cis8IUVOVElUWSAlIEltZ0FsaWduICIodG9wfG1pZGRsZXxib3R0b218bGVmdHxyaWdodCkiPgorCis8IS0tPT09PT09PT09PT09PT09PT09PSBFbGVtZW50IEdyb3VwcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKworPCFFTlRJVFkgJSBEaXJlY3RpdmVzICJqc3A6ZGlyZWN0aXZlLnBhZ2V8anNwOmRpcmVjdGl2ZS5pbmNsdWRlIj4KKworPCFFTlRJVFkgJSBTY3JpcHRzICJqc3A6c2NyaXB0bGV0fGpzcDpkZWNsYXJhdGlvbnxqc3A6ZXhwcmVzc2lvbiI+CisKKzwhRU5USVRZICUgQWN0aW9ucworICAgICJqc3A6dXNlQmVhbgorICAgIHxqc3A6c2V0UHJvcGVydHkKKyAgICB8anNwOmdldFByb3BlcnR5CisgICAgfGpzcDppbmNsdWRlCisgICAgfGpzcDpmb3J3YXJkCisgICAgfGpzcDpwbHVnaW4iCis+CisKKzwhRU5USVRZICUgQm9keSAiKGpzcDp0ZXh0fCVEaXJlY3RpdmVzO3wlU2NyaXB0czt8JUFjdGlvbnM7KSoiPgorCisKKzwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBFbGVtZW50cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCis8IS0tICAgIFJvb3QgZWxlbWVudCBvZiBhIEpTUCBwYWdlLgorLS0+Cis8IUVMRU1FTlQganNwOnJvb3QgJUJvZHk7PgorPCFBVFRMSVNUIGpzcDpyb290CisgICAgeG1sbnM6anNwICAgICAgIENEQVRBICAgICAgICAgICAiaHR0cDovL2phdmEuc3VuLmNvbS9KU1AvUGFnZSIKKyAgICB2ZXJzaW9uICAgICAgICAgQ0RBVEEgICAgICAgICAgICNSRVFVSVJFRAorPgorCis8IUVMRU1FTlQganNwOmRpcmVjdGl2ZS5wYWdlIEVNUFRZPgorPCFBVFRMSVNUIGpzcDpkaXJlY3RpdmUucGFnZQorICAgIGxhbmd1YWdlICAgICAgICBDREFUQSAgICAgICAgICAgImphdmEiCisgICAgZXh0ZW5kcyAgICAgICAgICVDbGFzc05hbWU7ICAgICAjSU1QTElFRAorICAgIGNvbnRlbnRUeXBlICAgICAlQ29udGVudDsgICAgICAgInRleHQvaHRtbDsgSVNPLTg4NTktMSIKKyAgICBpbXBvcnQgICAgICAgICAgQ0RBVEEgICAgICAgICAgICNJTVBMSUVECisgICAgc2Vzc2lvbiAgICAgICAgICVCb29sOyAgICAgICAgICAidHJ1ZSIKKyAgICBidWZmZXIgICAgICAgICAgQ0RBVEEgICAgICAgICAgICI4a2IiCisgICAgYXV0b0ZsdXNoICAgICAgICVCb29sOyAgICAgICAgICAidHJ1ZSIKKyAgICBpc1RocmVhZFNhZmUgICAgJUJvb2w7ICAgICAgICAgICJ0cnVlIgorICAgIGluZm8gICAgICAgICAgICBDREFUQSAgICAgICAgICAgI0lNUExJRUQKKyAgICBlcnJvclBhZ2UgICAgICAgJVVSTDsgICAgICAgICAgICNJTVBMSUVECisgICAgaXNFcnJvclBhZ2UgICAgICVCb29sOyAgICAgICAgICAiZmFsc2UiCisgICAgcGFnZUVuY29kaW5nICAgIENEQVRBICAgICAgICAgICAjSU1QTElFRAorICAgIGlzRUxJZ25vcmVkICAgICAlQm9vbDsgICAgICAgICAgI0lNUExJRUQKKz4KKworPCEtLSB0aGUganNwOmRpcmVjdGl2ZS5pbmNsdWRlIG9ubHkgYXBwZWFycyBpbiBKU1AgZG9jdW1lbnRzIGFuZCBkb2VzCisgICAgIG5vdCBhcHBlYXIgaW4gdGhlIFhNTCB2aWV3cyBvZiBKU1AgcGFnZXMuCistLT4KKworPCFFTEVNRU5UIGpzcDpkaXJlY3RpdmUuaW5jbHVkZSBFTVBUWT4KKzwhQVRUTElTVCBqc3A6ZGlyZWN0aXZlLmluY2x1ZGUKKyAgICBmaWxlICAgICAgICAgICAgJVVSSTsgICAgICAgICAgICNSRVFVSVJFRAorPgorCis8IUVMRU1FTlQganNwOnNjcmlwdGxldCAoI1BDREFUQSk+CisKKzwhRUxFTUVOVCBqc3A6ZGVjbGFyYXRpb24gKCNQQ0RBVEEpPgorCis8IUVMRU1FTlQganNwOmV4cHJlc3Npb24gKCNQQ0RBVEEpPgorCis8IUVMRU1FTlQganNwOnVzZUJlYW4gJUJvZHk7PgorPCFBVFRMSVNUIGpzcDp1c2VCZWFuCisgICAgaWQgICAgICAgICAgICAgIElEICAgICAgICAgICAgICAjUkVRVUlSRUQKKyAgICBjbGFzcyAgICAgICAgICAgJUNsYXNzTmFtZTsgICAgICNJTVBMSUVECisgICAgdHlwZSAgICAgICAgICAgICVUeXBlTmFtZTsgICAgICAjSU1QTElFRAorICAgIGJlYW5OYW1lICAgICAgICAlQmVhbk5hbWU7ICAgICAgI0lNUExJRUQKKyAgICBzY29wZSAgICAgICAgICAgKHBhZ2UKKyAgICAgICAgICAgICAgICAgICAgfHNlc3Npb24KKyAgICAgICAgICAgICAgICAgICAgfHJlcXVlc3QKKyAgICAgICAgICAgICAgICAgICAgfGFwcGxpY2F0aW9uKSAgICJwYWdlIgorPgorCis8IUVMRU1FTlQganNwOnNldFByb3BlcnR5IEVNUFRZPgorPCFBVFRMSVNUIGpzcDpzZXRQcm9wZXJ0eQorICAgIG5hbWUgICAgICAgICAgICAlQmVhbklEOyAgICAgICAgI1JFUVVJUkVECisgICAgcHJvcGVydHkgICAgICAgIENEQVRBICAgICAgICAgICAjUkVRVUlSRUQKKyAgICB2YWx1ZSAgICAgICAgICAgQ0RBVEEgICAgICAgICAgICNJTVBMSUVECisgICAgcGFyYW0gICAgICAgICAgIENEQVRBICAgICAgICAgICAjSU1QTElFRAorPgorCis8IUVMRU1FTlQganNwOmdldFByb3BlcnR5IEVNUFRZPgorPCFBVFRMSVNUIGpzcDpnZXRQcm9wZXJ0eQorICAgIG5hbWUgICAgICAgICAgICAlQmVhbklEOyAgICAgICAgI1JFUVVJUkVECisgICAgcHJvcGVydHkgICAgICAgIENEQVRBICAgICAgICAgICAjUkVRVUlSRUQKKz4KKworPCFFTEVNRU5UIGpzcDppbmNsdWRlIChqc3A6cGFyYW0qKT4KKzwhQVRUTElTVCBqc3A6aW5jbHVkZQorICAgIGZsdXNoICAgICAgICAgICAlQm9vbDsgICAgICAgICAgImZhbHNlIgorICAgIHBhZ2UgICAgICAgICAgICAlVVJMOyAgICAgICAgICAgI1JFUVVJUkVECis+CisKKzwhRUxFTUVOVCBqc3A6Zm9yd2FyZCAoanNwOnBhcmFtKik+Cis8IUFUVExJU1QganNwOmZvcndhcmQKKyAgICBwYWdlICAgICAgICAgICAgJVVSTDsgICAgICAgICAgICNSRVFVSVJFRAorPgorCis8IUVMRU1FTlQganNwOnBsdWdpbiAoanNwOnBhcmFtcz8sIGpzcDpmYWxsYmFjaz8pPgorPCFBVFRMSVNUIGpzcDpwbHVnaW4KKyAgICB0eXBlICAgICAgICAgICAgKGJlYW58YXBwbGV0KSAgICNSRVFVSVJFRAorICAgIGNvZGUgICAgICAgICAgICAlVVJJOyAgICAgICAgICAgI0lNUExJRUQKKyAgICBjb2RlYmFzZSAgICAgICAgJVVSSTsgICAgICAgICAgICNJTVBMSUVECisgICAgYWxpZ24gICAgICAgICAgICVJbWdBbGlnbjsgICAgICAjSU1QTElFRAorICAgIGFyY2hpdmUgICAgICAgICAlVXJpTGlzdDsgICAgICAgI0lNUExJRUQKKyAgICBoZWlnaHQgICAgICAgICAgJUxlbmd0aDsgICAgICAgICNJTVBMSUVECisgICAgaHNwYWNlICAgICAgICAgICVQaXhlbHM7ICAgICAgICAjSU1QTElFRAorICAgIGpyZXZlcnNpb24gICAgICBDREFUQSAgICAgICAgICAgIjEuMiIKKyAgICBuYW1lICAgICAgICAgICAgTk1UT0tFTiAgICAgICAgICNJTVBMSUVECisgICAgdnNwYWNlICAgICAgICAgICVQaXhlbHM7ICAgICAgICAjSU1QTElFRAorICAgIHdpZHRoICAgICAgICAgICAlTGVuZ3RoOyAgICAgICAgI0lNUExJRUQKKyAgICBuc3BsdWdpbnVybCAgICAgJVVSSTsgICAgICAgICAgICNJTVBMSUVECisgICAgaWVwbHVnaW51cmwgICAgICVVUkk7ICAgICAgICAgICAjSU1QTElFRAorPgorCis8IUVMRU1FTlQganNwOnBhcmFtcyAoanNwOnBhcmFtKyk+CisKKzwhRUxFTUVOVCBqc3A6cGFyYW0gRU1QVFk+Cis8IUFUVExJU1QganNwOnBhcmFtCisgICAgbmFtZSAgICAgICAgICAgIENEQVRBICAgICAgICAgICAjUkVRVUlSRUQKKyAgICB2YWx1ZSAgICAgICAgICAgQ0RBVEEgICAgICAgICAgICNSRVFVSVJFRAorPgorCis8IUVMRU1FTlQganNwOnRleHQgI1BDREFUQT4KKwpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2R0ZC9qc3B4bWwueHNkIGIvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2R0ZC9qc3B4bWwueHNkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NmVlNjUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvZHRkL2pzcHhtbC54c2QKQEAgLTAsMCArMSw1MTMgQEAKKzw/eG1sIHZlcnNpb24gPSIxLjAiPz4KKzwhLS0KKyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzwhRE9DVFlQRSBzY2hlbWEgWworPCEtLSBQYXR0ZXJucyAtLT4KKzwhRU5USVRZIElkZW50aWZpZXIgICAiKFxwe0x9fF98JCkoXHB7Tn18XHB7TH18X3wkKSoiPgorPCFFTlRJVFkgVHlwZU5hbWUgICAgICImSWRlbnRpZmllcjsoXC4mSWRlbnRpZmllcjspKiI+Cis8IUVOVElUWSBXUyAgICAgICAiXHMqIj4KKzwhRU5USVRZIEltcG9ydCAgICAgIiZUeXBlTmFtZTsoXC5cKik/Ij4KKzwhRU5USVRZIEltcG9ydExpc3QgICAiJkltcG9ydDsoJldTOywmV1M7JkltcG9ydDspKiI+Cis8IUVOVElUWSBTZXRQcm9wICAgICIoJklkZW50aWZpZXI7fFwqKSI+Cis8IUVOVElUWSBSZWxhdGl2ZVVSTCAgIlteOiMvXD9dKig6ezAsMH18WyMvXD9dLiopIj4KKzwhRU5USVRZIExlbmd0aCAgICAgIlswLTldKiYjeDI1Oz8iPgorPCFFTlRJVFkgQXNjaWlOYW1lICAgICJbQS1aYS16MC05Xy1dKiI+Cis8IUVOVElUWSBWYWxpZENvbnRlbnRUeXBlICAiJkFzY2lpTmFtZTsvJkFzY2lpTmFtZTsoOyZXUzsoY2hhcnNldD0pPyZBc2NpaU5hbWU7KT8iPgorPCFFTlRJVFkgVmFsaWRQYWdlRW5jb2RpbmcgICImQXNjaWlOYW1lOy8mQXNjaWlOYW1lOyI+Cis8IUVOVElUWSBCdWZmZXIgICAgICJbMC05XStrYiI+Cis8IUVOVElUWSBSVGV4cHIgICAgICImI3gyNTs9LiomI3gyNTsiPgorXT4KKworCis8IS0tQ29uZm9ybXMgdG8gdzNjIGh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIC0tPgorCis8eHNkOnNjaGVtYQorICAgIHhtbG5zID0gImh0dHA6Ly9qYXZhLnN1bi5jb20vSlNQL1BhZ2UiCisgICAgeG1sbnM6eHNkID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgorICAgIHhtbG5zOmpzcCA9ICJodHRwOi8vamF2YS5zdW4uY29tL0pTUC9QYWdlIgorICAgIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vamF2YS5zdW4uY29tL0pTUC9QYWdlIgorICAgIGVsZW1lbnRGb3JtRGVmYXVsdCA9ICJxdWFsaWZpZWQiCisgICAgYXR0cmlidXRlRm9ybURlZmF1bHQgPSAidW5xdWFsaWZpZWQiPgorCisgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOmRvY3VtZW50YXRpb24+CisgICAgICBYTUwgU2NoZW1hIGZvciBKU1AgMi4wLgorCisgICAgICBUaGlzIHNjaGVtYSBpcyBiYXNlZCB1cG9uIHRoZSByZWNlbnQgKE1heSA1dGgsIDIwMDEpCisgICAgICBXM0MgcmVjb21tZW5kYXRpb24gZm9yIFhNTCBTY2hlbWEuCisKKyAgICAgIEEgSlNQIHRyYW5zbGF0b3Igc2hvdWxkIHJlamVjdCBhbiBYTUwtZm9ybWF0IGZpbGUgdGhhdCBpcworICAgICAgbm90IHN0cmljdGx5IHZhbGlkIGFjY29yZGluZyB0byB0aGlzIHNjaGVtYSBvciBkb2VzIG5vdCBvYnNlcnZlCisgICAgICB0aGUgY29uc3RyYWludHMgZG9jdW1lbnRlZCBoZXJlLiBBIHRyYW5zbGF0b3IgaXMgbm90IHJlcXVpcmVkCisgICAgICB0byB1c2UgdGhpcyBzY2hlbWEgZm9yIHZhbGlkYXRpb24gb3IgdG8gdXNlIGEgdmFsaWRhdGluZyBwYXJzZXIuCisgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgPC94c2Q6YW5ub3RhdGlvbj4KKworCisgIDwhLS0gQ29tcGxleCBUeXBlcyAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWUgPSAiQm9keSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorICAgICAgICBCb2R5IGRlZmluZXMgdGhlICJ0b3AtbGV2ZWwiIGVsZW1lbnRzIGluIHJvb3QgYW5kIGJlYW5JbmZvLgorICAgICAgICBUaGVyZSBhcmUgcHJvYmFibHkgb3RoZXIgZWxlbWVudHMgdGhhdCBzaG91bGQgdXNlIGl0LgorICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6Z3JvdXAgcmVmID0gIkJvZHlncm91cCIgbWluT2NjdXJzID0gIjAiIG1heE9jY3VycyA9ICJ1bmJvdW5kZWQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKyAgPCEtLSBncm91cHMgLS0+CisKKyAgPHhzZDpncm91cCBuYW1lID0gIkJvZHlncm91cCI+CisgICAgPHhzZDpjaG9pY2U+CisgICAgICA8eHNkOmVsZW1lbnQgcmVmID0gImRpcmVjdGl2ZS5wYWdlIi8+CisgICAgICA8eHNkOmVsZW1lbnQgcmVmID0gImRpcmVjdGl2ZS5pbmNsdWRlIi8+CisgICAgICA8eHNkOmVsZW1lbnQgcmVmID0gInNjcmlwdGxldCIvPgorICAgICAgPHhzZDplbGVtZW50IHJlZiA9ICJkZWNsYXJhdGlvbiIvPgorICAgICAgPHhzZDplbGVtZW50IHJlZiA9ICJleHByZXNzaW9uIi8+CisgICAgICA8eHNkOmVsZW1lbnQgcmVmID0gInVzZUJlYW4iLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCByZWYgPSAic2V0UHJvcGVydHkiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCByZWYgPSAiZ2V0UHJvcGVydHkiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCByZWYgPSAiaW5jbHVkZSIvPgorICAgICAgPHhzZDplbGVtZW50IHJlZiA9ICJmb3J3YXJkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgcmVmID0gInBsdWdpbiIvPgorICAgICAgPHhzZDplbGVtZW50IHJlZiA9ICJ0ZXh0Ii8+CisgICAgICA8eHNkOmFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cyA9ICJsYXgiLz4KKyAgICA8L3hzZDpjaG9pY2U+CisgIDwveHNkOmdyb3VwPgorCisKKyAgPCEtLSBTaW1wbGUgdHlwZXMgYXJlIG5leHQgLS0+CisKKyAgPHhzZDpzaW1wbGVUeXBlIG5hbWUgPSAiUlRFIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisgICAgICAgIEEgcmVxdWVzdC10aW1lIGV4cHJlc3Npb24gdmFsdWUKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2UgPSAieHNkOnN0cmluZyI+CisgICAgICA8eHNkOnBhdHRlcm4gdmFsdWUgPSAiJlJUZXhwcjsiLz4KKyAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgPC94c2Q6c2ltcGxlVHlwZT4KKworICA8eHNkOnNpbXBsZVR5cGUgbmFtZSA9ICJCb29sIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisgICAgICAgIEJvb2wgd291bGQgYmUgYm9vbGVhbiBleGNlcHQgaXQgZG9lcyBub3QgYWNjZXB0IDEgYW5kIDAuCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlID0gInhzZDpOTVRPS0VOIiA+CisgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlID0gInRydWUiLz4KKyAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWUgPSAiZmFsc2UiLz4KKyAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWUgPSAieWVzIi8+CisgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlID0gIm5vIi8+CisgICAgPC94c2Q6cmVzdHJpY3Rpb24+ICAgICAKKyAgPC94c2Q6c2ltcGxlVHlwZT4KKworICA8eHNkOnNpbXBsZVR5cGUgbmFtZSA9ICJJZGVudGlmaWVyIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisgICAgICAgIElkZW50aWZpZXIgaXMgYW4gdW5xdWFsaWZpZWQgSmF2YSBpZGVudGlmaWVyLgorICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZSA9ICJ4c2Q6c3RyaW5nIj4KKyAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZSA9ICImSWRlbnRpZmllcjsiLz4KKyAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgPC94c2Q6c2ltcGxlVHlwZT4KKyAgCisgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lID0gIlR5cGVOYW1lIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisgICAgICAgIFR5cGVOYW1lIGlzIG9uZSBvciBtb3JlIEphdmEgaWRlbnRpZmllcnMgc2VwYXJhdGVkIGJ5IGRvdHMKKyAgICAgICAgd2l0aCBubyB3aGl0ZXNwYWNlLgorICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZSA9ICJ4c2Q6c3RyaW5nIj4KKyAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZSA9ICImVHlwZU5hbWU7Ii8+CisgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgIDwveHNkOnNpbXBsZVR5cGU+CisgIAorICA8eHNkOnNpbXBsZVR5cGUgbmFtZSA9ICJJbXBvcnRMaXN0Ij4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisgICAgICAgIEltcG9ydExpc3QgaXMgb25lIG9yIG1vcmUgdHlwZU5hbWVzIHNlcGFyYXRlZCBieSBjb21tYXMuCisgICAgICAgIFdoaXRlc3BhY2UgaXMgYWxsb3dlZCBiZWZvcmUgYW5kIGFmdGVyIHRoZSBjb21tYS4KKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2UgPSAieHNkOnN0cmluZyI+CisgICAgICA8eHNkOnBhdHRlcm4gdmFsdWUgPSAiJkltcG9ydExpc3Q7Ii8+CisgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgIDwveHNkOnNpbXBsZVR5cGU+CisgIAorICA8eHNkOnNpbXBsZVR5cGUgbmFtZSA9ICJTZXRQcm9wIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisgICAgICAgIFNldFByb3AgaXMgYW4gSWRlbnRpZmllciBvciAqLgorICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZSA9ICJ4c2Q6c3RyaW5nIj4KKyAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZSA9ICImU2V0UHJvcDsiLz4KKyAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgPC94c2Q6c2ltcGxlVHlwZT4KKyAgCisgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lID0gIlJlbGF0aXZlVVJMIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisgICAgICAgIFJlbGF0aXZlVVJMIGlzIGEgdXJpUmVmZXJlbmNlIHdpdGggbm8gY29sb24gY2hhcmFjdGVyCisgICAgICAgIGJlZm9yZSB0aGUgZmlyc3QgLywgPyBvciAjLCBpZiBhbnkgKFJGQzIzOTYpLgorICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorCTx4c2Q6cmVzdHJpY3Rpb24gYmFzZSA9ICJ4c2Q6YW55VVJJIj4KKyAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZSA9ICImUmVsYXRpdmVVUkw7Ii8+CisgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgIDwveHNkOnNpbXBsZVR5cGU+CisKKyAgPHhzZDpzaW1wbGVUeXBlIG5hbWUgPSAiUlRFUmVsYXRpdmVVUkwiPgorICAgIDx4c2Q6dW5pb24gbWVtYmVyVHlwZXMgPSAiUmVsYXRpdmVVUkwgUlRFIi8+CisgIDwveHNkOnNpbXBsZVR5cGU+CisKKyAgPHhzZDpzaW1wbGVUeXBlIG5hbWUgPSAiTGVuZ3RoIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisgICAgICAgIExlbmd0aCBpcyBubiBvciBubiUuCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlID0gInhzZDpzdHJpbmciPgorICAgICAgPHhzZDpwYXR0ZXJuIHZhbHVlID0gIiZMZW5ndGg7Ii8+CisgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgIDwveHNkOnNpbXBsZVR5cGU+CisgIAorCisgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lID0gIkV4cGxpY2l0QnVmZmVyU2l6ZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorICAgICAgICAgQnVmZmVyIFNpemUgd2l0aCBhbiBleHBsaWNpdCB2YWx1ZQorICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPiAKKyAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2UgPSAieHNkOnN0cmluZyI+CisgICAgICA8eHNkOnBhdHRlcm4gdmFsdWUgPSAiJkJ1ZmZlcjsiLz4KKyAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgPC94c2Q6c2ltcGxlVHlwZT4KKworICA8eHNkOnNpbXBsZVR5cGUgbmFtZSA9ICJOb25lQnVmZmVyU2l6ZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorICAgICAgICAgQnVmZmVyIFNpemUgd2l0aCBhICJub25lIiB2YWx1ZQorICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPiAKKyAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2UgPSAieHNkOnN0cmluZyI+CisgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlID0gIm5vbmUiLz4KKyAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgPC94c2Q6c2ltcGxlVHlwZT4KKworICA8eHNkOnNpbXBsZVR5cGUgbmFtZSA9ICJCdWZmZXJTaXplIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisgICAgICAgIEJ1ZmZlciBzaXplIGlzIHhrYiBvciBub25lLgorICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6dW5pb24gbWVtYmVyVHlwZXMgPSAiRXhwbGljaXRCdWZmZXJTaXplIE5vbmVCdWZmZXJTaXplIi8+CisgIDwveHNkOnNpbXBsZVR5cGU+CisgIAorICA8eHNkOnNpbXBsZVR5cGUgbmFtZSA9ICJDb250ZW50VHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorICAgICAgICBDb250ZW50IHR5cGUgYW5kIGNoYXJhY3RlciBlbmNvZGluZyBmb3IgdGhpcyBwYWdlLgorICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZSA9ICJ4c2Q6c3RyaW5nIj4KKyAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZSA9ICImVmFsaWRDb250ZW50VHlwZTsiLz4KKyAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgPC94c2Q6c2ltcGxlVHlwZT4KKworICA8eHNkOnNpbXBsZVR5cGUgbmFtZSA9ICJQYWdlRW5jb2RpbmciPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgUGFnZSBFbmNvZGluZyBmb3IgdGhpcyBwYWdlLgorICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZSA9ICJ4c2Q6c3RyaW5nIj4KKyAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZSA9ICImVmFsaWRQYWdlRW5jb2Rpbmc7Ii8+CisgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgIDwveHNkOnNpbXBsZVR5cGU+CisKKyAgPHhzZDpzaW1wbGVUeXBlIG5hbWUgPSAiU2NvcGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgdmFsaWQgc2NvcGUgdmFsdWVzCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlID0gInhzZDpOTVRPS0VOIj4KKyAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWUgPSAicGFnZSIvPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZSA9ICJzZXNzaW9uIi8+CisgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlID0gInJlcXVlc3QiLz4KKyAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWUgPSAiYXBwbGljYXRpb24iLz4KKyAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgPC94c2Q6c2ltcGxlVHlwZT4KKworICA8eHNkOnNpbXBsZVR5cGUgbmFtZSA9ICJQbHVnSW5UeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisgICAgICAgIHZhbGlkIHZhbHVlcyBmb3IgYSBwbHVnaW4gdHlwZQorICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZSA9ICJ4c2Q6Tk1UT0tFTiI+CisgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlID0gImJlYW4iLz4KKyAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWUgPSAiYXBwbGV0Ii8+CisgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgIDwveHNkOnNpbXBsZVR5cGU+CisKKyAgPHhzZDpzaW1wbGVUeXBlIG5hbWUgPSAiQWxpZ25UeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisgICAgICAgIEJ1ZmZlciBzaXplIGlzIHhrYi4KKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2UgPSAieHNkOk5NVE9LRU4iPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZSA9ICJ0b3AiLz4KKyAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWUgPSAibWlkZGxlIi8+CisgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlID0gImJvdHRvbSIvPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZSA9ICJsZWZ0Ii8+CisgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlID0gInJpZ2h0Ii8+CisgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgIDwveHNkOnNpbXBsZVR5cGU+CisKKyAgPCEtLSBFbGVtZW50cyBmb2xsb3cgLS0+CisKKyAgPHhzZDplbGVtZW50IG5hbWUgPSAicm9vdCI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorICAgICAgICBUaGUgcm9vdCBlbGVtZW50IG9mIGFsbCBKU1AgZG9jdW1lbnRzIGlzIG5hbWVkIHJvb3QuCisgICAgICAgIAorICAgICAgICBBdXRob3JzIG1heSwgaWYgdGhleSB3aXNoLCBpbmNsdWRlIHNjaGVtYSBsb2NhdGlvbiBpbmZvcm1hdGlvbi4KKyAgICAgICAgSWYgc3BlY2lmaWVkLCB0aGUgaW5mb3JtYXRpb24gbWF5IGFwcGVhciBhcyBhdHRyaWJ1dGVzIG9mCisgICAgICAgIHRoZSByb290IGVsZW1lbnQgYXMgZm9sbG93czoKKworICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20vSlNQL1BhZ2UgeHNkLWZpbGUtbG9jYXRpb24iCisKKyAgICAgICAgRG9jdW1lbnRzIHNob3VsZCBub3Qgc3BlY2lmeSB0aGUgc3lzdGVtIGlkZW50aWZpZXIgb2YgYSBEVEQKKyAgICAgICAgaW4gYSBET0NUWVBFIGRlY2xhcmF0aW9uLgorICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgorICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlID0gIkJvZHkiPgorICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWUgPSAidmVyc2lvbiIgZml4ZWQgPSAiMi4wIiB0eXBlID0gInhzZDpzdHJpbmciLz4KKyAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgorICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgIDwveHNkOmVsZW1lbnQ+CisgIAorICA8eHNkOmVsZW1lbnQgbmFtZSA9ICJkaXJlY3RpdmUucGFnZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorICAgICAgICBkaXJlY3RpdmUucGFnZSBpcyB0aGUgInBhZ2UgZGlyZWN0aXZlIi4KKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZSA9ICJsYW5ndWFnZSIgZGVmYXVsdCA9ICJqYXZhIiB0eXBlID0gInhzZDpzdHJpbmciLz4KKyAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWUgPSAiZXh0ZW5kcyIgdHlwZSA9ICJUeXBlTmFtZSIvPgorICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZSA9ICJjb250ZW50VHlwZSIgZGVmYXVsdCA9ICJ0ZXh0L2h0bWw7IElTTy04ODU5LTEiIHR5cGUgPSAiQ29udGVudFR5cGUiLz4KKyAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWUgPSAicGFnZUVuY29kaW5nIiB1c2UgPSAib3B0aW9uYWwiIHR5cGUgPSAiUGFnZUVuY29kaW5nIi8+CisgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lID0gImltcG9ydCIgdHlwZSA9ICJJbXBvcnRMaXN0Ii8+CisgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lID0gInNlc3Npb24iIGRlZmF1bHQgPSAidHJ1ZSIgdHlwZSA9ICJCb29sIi8+CisgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lID0gImJ1ZmZlciIgZGVmYXVsdCA9ICI4a2IiIHR5cGUgPSAiQnVmZmVyU2l6ZSIvPgorICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZSA9ICJhdXRvRmx1c2giIGRlZmF1bHQgPSAidHJ1ZSIgdHlwZSA9ICJCb29sIi8+CisgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lID0gImlzVGhyZWFkU2FmZSIgZGVmYXVsdCA9ICJ0cnVlIiB0eXBlID0gIkJvb2wiLz4KKyAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWUgPSAiaW5mbyIgdHlwZSA9ICJ4c2Q6c3RyaW5nIi8+CisgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lID0gImVycm9yUGFnZSIgdHlwZSA9ICJSZWxhdGl2ZVVSTCIvPgorICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZSA9ICJpc0Vycm9yUGFnZSIgZGVmYXVsdCA9ICJmYWxzZSIgdHlwZSA9ICJCb29sIi8+CisgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lID0gImlzRUxJZ25vcmVkIiB0eXBlID0gIkJvb2wiLz4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgPC94c2Q6ZWxlbWVudD4KKyAgCisgIDx4c2Q6ZWxlbWVudCBuYW1lID0gImRpcmVjdGl2ZS5pbmNsdWRlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisgICAgICAgIGRpcmVjdGl2ZS5pbmNsdWRlIGlzIHRoZSAiaW5jbHVkZSBkaXJlY3RpdmUiLgorCVRoaXMgZWxlbWVudCBkb2VzIG5vdCBhcHBlYXIgb24gWE1MIHZpZXdzIG9mIEpTUCBwYWdlcy4KKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZSA9ICJmaWxlIiB1c2UgPSAicmVxdWlyZWQiIHR5cGUgPSAiUmVsYXRpdmVVUkwiLz4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgPC94c2Q6ZWxlbWVudD4KKworICA8eHNkOmVsZW1lbnQgbmFtZSA9ICJzY3JpcHRsZXQiIHR5cGUgPSAieHNkOnN0cmluZyI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorICAgICAgICBUaGUgcmVwcmVzZW50YXRpb24gb2YgYSBzY3JpcGxldC4KKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgPC94c2Q6ZWxlbWVudD4KKyAgCisgIDx4c2Q6ZWxlbWVudCBuYW1lID0gImRlY2xhcmF0aW9uIiB0eXBlID0gInhzZDpzdHJpbmciPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgVGhlIHJlcHJzZW50YXRpb24gb2YgYSBkZWNsYXJhdGlvbi4KKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgPC94c2Q6ZWxlbWVudD4KKyAgCisgIDx4c2Q6ZWxlbWVudCBuYW1lID0gImV4cHJlc3Npb24iIHR5cGUgPSAieHNkOnN0cmluZyI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorICAgICAgICBUaGUgcmVwcmVzZW50YXRpb24gb2YgYW4gZXhwcmVzc2lvbi4KKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgPC94c2Q6ZWxlbWVudD4KKyAKKyAgPHhzZDplbGVtZW50IG5hbWUgPSAidGV4dCIgdHlwZSA9ICJ4c2Q6c3RyaW5nIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisgICAgICAgIFZlcmJhdGltIHRlbXBsYXRlIHRleHQuCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgIDwveHNkOmVsZW1lbnQ+CisKKyAgPHhzZDplbGVtZW50IG5hbWUgPSAidXNlQmVhbiI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorICAgICAgICB1c2VCZWFuIGluc3RhbnRpYXRlcyBvciBhY2Nlc3NlcyBhIGJlYW4gaW4gdGhlIHNwZWNpZmllZCBzY29wZS4KKyAgICAgICAgCisgICAgICAgIENvbnN0cmFpbnQ6IFRoZSBhbGxvd2VkIGNvbWJpbmF0aW9ucyBvZiBhdHRyaWJ1dGVzIGFyZToKKyAgICAgICAgCisgICAgICAgICAgY2xhc3MgW3R5cGVdIHwgdHlwZSBbKCBjbGFzcyB8IGJlYW5OYW1lKV0KKyAgICAgICAgCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+CisgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9IkJvZHkiPgorICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWUgPSAiaWQiIHVzZSA9ICJyZXF1aXJlZCIgdHlwZSA9ICJJZGVudGlmaWVyIi8+CisgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZSA9ICJjbGFzcyIgdHlwZSA9ICJUeXBlTmFtZSIvPgorICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWUgPSAidHlwZSIgdHlwZSA9ICJUeXBlTmFtZSIvPgorICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWUgPSAiYmVhbk5hbWUiIHR5cGUgPSAiVHlwZU5hbWUiLz4KKyAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lID0gInNjb3BlIiBkZWZhdWx0ID0gInBhZ2UiIHR5cGUgPSAiU2NvcGUiLz4KKyAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgorICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgIDwveHNkOmVsZW1lbnQ+CisgIAorICA8eHNkOmVsZW1lbnQgbmFtZSA9ICJzZXRQcm9wZXJ0eSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorICAgICAgICBzZXRQcm9wZXJ0eSBjaGFuZ2VzIHRoZSB2YWx1ZSBvZiBhbiBvYmplY3QgcHJvcGVydHkuCisgICAgICAgIAorICAgICAgICBDb25zdHJhaW50OiBUaGUgb2JqZWN0IG5hbWVkIGJ5IHRoZSBuYW1lIG11c3QgaGF2ZSBiZWVuCisgICAgICAgICJpbnRyb2R1Y2VkIiB0byB0aGUgSlNQIHByb2Nlc3NvciB1c2luZyBlaXRoZXIgdGhlCisgICAgICAgIGpzcDp1c2VCZWFuIGFjdGlvbiBvciBhIGN1c3RvbSBhY3Rpb24gd2l0aCBhbiBhc3NvY2lhdGVkCisgICAgICAgIFZhcmlhYmxlSW5mbyBlbnRyeSBmb3IgdGhpcyBuYW1lLgorCisgICAgICAgIEV4YWN0IHZhbGlkIGNvbWJpbmF0aW9ucyBhcmUgbm90IGV4cHJlc3NhYmxlIGluIFhNTCBTY2hlbWEuCisgICAgICAgIFRoZXkgYXJlOgorCisgICAgICAgIG5hbWU9IklkZW50aWZpZXIiIHByb3BlcnR5PSIqIgorICAgICAgICBuYW1lPSJJZGVudGlmaWVyIiBwcm9wZXJ0eT0iSWRlbnRmaWllciIgcGFyYW09InN0cmluZyIKKyAgICAgICAgbmFtZT0iSWRlbnRpZmllciIgcHJvcGVydHk9IklkZW50aWZpZXIiIHZhbHVlPSJzdHJpbmciCisgICAgICAgICAgICAgICAgCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWUgPSAibmFtZSIgdXNlID0gInJlcXVpcmVkIiB0eXBlID0gIklkZW50aWZpZXIiLz4KKyAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWUgPSAicHJvcGVydHkiIHVzZSA9ICJyZXF1aXJlZCIgdHlwZSA9ICJTZXRQcm9wIi8+CisgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lID0gInBhcmFtIiB0eXBlID0gInhzZDpzdHJpbmciLz4KKyAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWUgPSAidmFsdWUiIHR5cGUgPSAieHNkOnN0cmluZyIvPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICA8L3hzZDplbGVtZW50PgorCisgIDx4c2Q6ZWxlbWVudCBuYW1lID0gImdldFByb3BlcnR5Ij4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisgICAgICAgIGdldFByb3BlcnR5IG9idGFpbnMgdGhlIHZhbHVlIG9mIGFuIG9iamVjdCBwcm9wZXJ0eS4KKyAgICAgICAgCisgICAgICAgIENvbnN0cmFpbnQ6IFRoZSBvYmplY3QgbmFtZWQgYnkgdGhlIG5hbWUgbXVzdCBoYXZlIGJlZW4KKyAgICAgICAgImludHJvZHVjZWQiIHRvIHRoZSBKU1AgcHJvY2Vzc29yIHVzaW5nIGVpdGhlciB0aGUKKyAgICAgICAganNwOnVzZUJlYW4gYWN0aW9uIG9yIGEgY3VzdG9tIGFjdGlvbiB3aXRoIGFuIGFzc29jaWF0ZWQKKyAgICAgICAgVmFyaWFibGVJbmZvIGVudHJ5IGZvciB0aGlzIG5hbWUuCisgICAgICAgIAorICAgICAgICA/Pz9UaGUgc3BlYyBpcyBpbnRlcnByZXRlZCBhcyByZXN0cmljdGluZyB0aGUgdmFsdWVzIG9mCisgICAgICAgIHByb3BlcnR5IHRvIElkZW50aWZpZXIuCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWUgPSAibmFtZSIgdXNlID0gInJlcXVpcmVkIiB0eXBlID0gIklkZW50aWZpZXIiLz4KKyAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWUgPSAicHJvcGVydHkiIHVzZSA9ICJyZXF1aXJlZCIgdHlwZSA9ICJJZGVudGlmaWVyIi8+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgIDwveHNkOmVsZW1lbnQ+CisgIAorICA8eHNkOmVsZW1lbnQgbmFtZSA9ICJpbmNsdWRlIj4KKyAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgPHhzZDplbGVtZW50IHJlZiA9ICJwYXJhbSIgbWluT2NjdXJzID0gIjAiIG1heE9jY3VycyA9ICJ1bmJvdW5kZWQiLz4KKyAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZSA9ICJmbHVzaCIgZGVmYXVsdCA9ICJmYWxzZSIgdHlwZSA9ICJCb29sIi8+CisgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lID0gInBhZ2UiIHVzZSA9ICJyZXF1aXJlZCIgdHlwZSA9ICJSVEVSZWxhdGl2ZVVSTCIvPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICA8L3hzZDplbGVtZW50PgorCisgIDx4c2Q6ZWxlbWVudCBuYW1lID0gImZvcndhcmQiPgorICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICA8eHNkOmVsZW1lbnQgcmVmID0gInBhcmFtIiBtaW5PY2N1cnMgPSAiMCIgbWF4T2NjdXJzID0gInVuYm91bmRlZCIvPgorICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lID0gInBhZ2UiIHVzZSA9ICJyZXF1aXJlZCIgdHlwZSA9ICJSVEVSZWxhdGl2ZVVSTCIvPgorICAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgPC94c2Q6ZWxlbWVudD4KKyAgCisgIDx4c2Q6ZWxlbWVudCBuYW1lID0gInBsdWdpbiI+CisgICAgPHhzZDpjb21wbGV4VHlwZT4gPCEtLSBjb250ZW50IG9ubHkhIC0tPgorICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgPHhzZDplbGVtZW50IHJlZiA9ICJwYXJhbXMiIG1pbk9jY3VycyA9ICIwIiBtYXhPY2N1cnMgPSAiMSIvPgorICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZSA9ICJmYWxsYmFjayIgbWluT2NjdXJzID0gIjAiIG1heE9jY3VycyA9ICIxIiB0eXBlID0gIkJvZHkiLz4KKyAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZSA9ICJ0eXBlIiB1c2UgPSAicmVxdWlyZWQiIHR5cGUgPSAiUGx1Z0luVHlwZSIvPgorICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZSA9ICJjb2RlIiB0eXBlID0gInhzZDphbnlVUkkiLz4KKyAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWUgPSAiY29kZWJhc2UiIHR5cGUgPSAieHNkOmFueVVSSSIvPgorICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZSA9ICJhbGlnbiIgdHlwZSA9ICJBbGlnblR5cGUiLz4KKyAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWUgPSAiYXJjaGl2ZSI+CisgICAgICAgIDx4c2Q6c2ltcGxlVHlwZT4KKyAgICAgICAgICAgPHhzZDpsaXN0IGl0ZW1UeXBlPSJ4c2Q6YW55VVJJIi8+CisgICAgICAgIDwveHNkOnNpbXBsZVR5cGU+CisgICAgICA8L3hzZDphdHRyaWJ1dGU+CisgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lID0gImhlaWdodCIgdHlwZSA9ICJMZW5ndGgiLz4KKyAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWUgPSAiaHNwYWNlIiB0eXBlID0gInhzZDppbnQiLz4KKyAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWUgPSAianJldmVyc2lvbiIgZGVmYXVsdCA9ICIxLjIiIHR5cGUgPSAieHNkOnN0cmluZyIvPgorICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZSA9ICJuYW1lIiB0eXBlID0gInhzZDpOTVRPS0VOIi8+CisgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lID0gInZzcGFjZSIgdHlwZSA9ICJ4c2Q6aW50Ii8+CisgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lID0gIndpZHRoIiB0eXBlID0gIkxlbmd0aCIvPgorICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZSA9ICJuc3BsdWdpbnVybCIgdHlwZSA9ICJ4c2Q6YW55VVJJIi8+CisgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lID0gImllcGx1Z2ludXJsIiB0eXBlID0gInhzZDphbnlVUkkiLz4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgPC94c2Q6ZWxlbWVudD4KKyAgCisgIDx4c2Q6ZWxlbWVudCBuYW1lID0gInBhcmFtcyI+CisgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgPHhzZDplbGVtZW50IHJlZiA9ICJwYXJhbSIgbWluT2NjdXJzID0gIjEiIG1heE9jY3VycyA9ICJ1bmJvdW5kZWQiLz4KKyAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgPC94c2Q6ZWxlbWVudD4KKworICA8eHNkOmVsZW1lbnQgbmFtZSA9ICJwYXJhbSI+CisgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWUgPSAibmFtZSIgdXNlID0gInJlcXVpcmVkIiB0eXBlID0gInhzZDpOTVRPS0VOIi8+CisgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lID0gInZhbHVlIiB1c2UgPSAicmVxdWlyZWQiIHR5cGUgPSAieHNkOnN0cmluZyIvPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICA8L3hzZDplbGVtZW50PgorICAKKzwveHNkOnNjaGVtYT4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9kdGQvd2ViLWpzcHRhZ2xpYnJhcnlfMV8xLmR0ZCBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9kdGQvd2ViLWpzcHRhZ2xpYnJhcnlfMV8xLmR0ZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTVmYzdhCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2R0ZC93ZWItanNwdGFnbGlicmFyeV8xXzEuZHRkCkBAIC0wLDAgKzEsMjA2IEBACis8IS0tCisgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8IS0tCisKKyAgIFRoaXMgaXMgdGhlIERURCBkZWZpbmluZyB0aGUgSmF2YVNlcnZlciBQYWdlcyAxLjEgVGFnIExpYnJhcnkKKyAgIGRlc2NyaXB0b3IgKC50bGQpIChYTUwpIGZpbGUgZm9ybWF0L3N5bnRheC4KKworICAgQSBUYWcgTGlicmFyeSBpcyBhIEpBUiBmaWxlIGNvbnRhaW5pbmcgYSB2YWxpZCBpbnN0YW5jZSBvZiBhIFRhZyBMaWJyYXJ5CisgICBEZXNjcmlwdG9yICh0YWdsaWIudGxkKSBmaWxlIGluIHRoZSBNRVRBLUlORiBzdWJkaXJlY3RvcnksIGFsb25nIHdpdGggdGhlCisgICBhcHByb3ByaWF0ZSBpbXBsZW1lbnRpbmcgY2xhc3NlcywgYW5kIG90aGVyIHJlc291cmNlcyByZXF1aXJlZCB0bworICAgaW1wbGVtZW50IHRoZSB0YWdzIGRlZmluZWQgdGhlcmVpbi4KKworICAgVXNlIGlzIHN1YmplY3QgdG8gbGljZW5zZSB0ZXJtcy4KKyAgLS0+CisKKzwhLS0KK1RoZSB0YWdsaWIgdGFnIGlzIHRoZSBkb2N1bWVudCByb290LCBpdCBkZWZpbmVzOgorCit0bGlidmVyc2lvbgl0aGUgdmVyc2lvbiBvZiB0aGUgdGFnIGxpYnJhcnkgaW1wbGVtZW50YXRpb24KK2pzcHZlcnNpb24JdGhlIHZlcnNpb24gb2YgSlNQIHRoZSB0YWcgbGlicmFyeSBkZXBlbmRzIHVwb24KKworc2hvcnRuYW1lCWEgc2ltcGxlIGRlZmF1bHQgc2hvcnQgbmFtZSB0aGF0IGNvdWxkIGJlIHVzZWQgYnkKKwkJYSBKU1AgYXV0aG9yaW5nIHRvb2wgdG8gY3JlYXRlIG5hbWVzIHdpdGggYSBtbmVtb25pYworCQl2YWx1ZTsgZm9yIGV4YW1wbGUsIHRoZSBpdCBtYXkgYmUgdXNlZCBhcyB0aGUgcHJlZmVyZWQKKwkJcHJlZml4IHZhbHVlIGluIHRhZ2xpYiBkaXJlY3RpdmVzCit1cmkJCWEgdXJpIHVuaXF1ZWx5IGlkZW50aWZ5aW5nIHRoaXMgdGFnbGliCitpbmZvCQlhIHNpbXBsZSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgInVzZSIgb2YgdGhpcyB0YWdsaWIsCisJCXNob3VsZCBiZSB1c2VyIGRpc2Nlcm5hYmxlCistLT4KKworPCFFTEVNRU5UIHRhZ2xpYiAodGxpYnZlcnNpb24sIGpzcHZlcnNpb24/LCBzaG9ydG5hbWUsIHVyaT8sIGluZm8/LCB0YWcrKSA+Cis8IUFUVExJU1QgdGFnbGliIGlkIElEICNJTVBMSUVECisJICB4bWxucyBDREFUQSAjRklYRUQKKwkJImh0dHA6Ly9qYXZhLnN1bi5jb20vajJlZS9kdGRzL3dlYi1qc3B0YWdsaWJyYXJ5XzFfMS5kdGQiCis+CisKKzwhLS0KK0Rlc2NyaWJlcyB0aGlzIHZlcnNpb24gKG51bWJlcikgb2YgdGhlIHRhZ2xpYnJhcnkgKGRld2V5IGRlY2ltYWwpCisKKyNQQ0RBVEEgOjo9IFswLTldKnsgIi4iWzAtOV0gfTAuLjMKKy0tPgorCis8IUVMRU1FTlQgdGxpYnZlcnNpb24gKCNQQ0RBVEEpID4KKworPCEtLQorRGVzY3JpYmVzIHRoZSBKU1AgdmVyc2lvbiAobnVtYmVyKSB0aGlzIHRhZ2xpYnJhcnkgcmVxdWlyZXMgaW4KK29yZGVyIHRvIGZ1bmN0aW9uIChkZXdleSBkZWNpbWFsKQorCitUaGUgZGVmYXVsdCBpcyAxLjEKKworI1BDREFUQSA6Oj0gWzAtOV0qeyAiLiJbMC05XSB9MC4uMworLS0+CisKKzwhRUxFTUVOVCBqc3B2ZXJzaW9uICAoI1BDREFUQSkgPgorCis8IS0tCitEZWZpbmVzIGEgc2hvcnQgKGRlZmF1bHQpIHNob3J0bmFtZSB0byBiZSB1c2VkIGZvciB0YWdzIGFuZAordmFyaWFibGUgbmFtZXMgdXNlZC9jcmVhdGVkIGJ5IHRoaXMgdGFnIGxpYnJhcnkuICBEbyBub3QgdXNlCit3aGl0ZSBzcGFjZSwgYW5kIGRvIG5vdCBzdGFydCB3aXRoIGRpZ2l0cyBvciB1bmRlcnNjb3JlLgorCisjUENEQVRBIDo6PSBOTVRPS0VOCistLT4KKworPCFFTEVNRU5UIHNob3J0bmFtZSAgICAgICgjUENEQVRBKSA+CisKKzwhLS0KK0RlZmluZXMgYSBwdWJsaWMgVVJJIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGlzIHZlcnNpb24gb2YKK3RoZSB0YWdsaWJyYXJ5IExlYXZlIGl0IGVtcHR5IGlmIGl0IGRvZXMgbm90IGFwcGx5LgorLS0+CisKKzwhRUxFTUVOVCB1cmkJICgjUENEQVRBKSA+CisKKzwhLS0KK0RlZmluZXMgYW4gYXJiaXRyYXJ5IHRleHQgc3RyaW5nIGRlc2NpcmJpbmcgdGhlIHRhZyBsaWJyYXJ5CistLT4KKworPCFFTEVNRU5UIGluZm8JKCNQQ0RBVEEpID4KKworPCEtLQorVGhlIHRhZyBkZWZpbmVzIGEgdW5pcXVlIHRhZyBpbiB0aGlzIHRhZyBsaWJyYXJ5LCBkZWZpbmluZzoKKworLSB0aGUgdW5pcXVlIHRhZy9lbGVtZW50IG5hbWUKKy0gdGhlIHN1YmNsYXNzIG9mIGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWcgaW1wbGVtZW50YXRpb24gY2xhc3MKKy0gYW4gb3B0aW9uYWwgc3ViY2xhc3Mgb2YgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZ0V4dHJhSW5mbworLSB0aGUgYm9keSBjb250ZW50IHR5cGUgKGhpbnQpCistIG9wdGlvbmFsIHRhZy1zcGVjaWZpYyBpbmZvcm1hdGlvbgorLSBhbnkgYXR0cmlidXRlcworLS0+CisKKzwhRUxFTUVOVCB0YWcgKG5hbWUsIHRhZ2NsYXNzLCB0ZWljbGFzcz8sIGJvZHljb250ZW50PywgaW5mbz8sIGF0dHJpYnV0ZSopID4KKworPCEtLQorRGVmaW5lcyB0aGUgc3ViY2xhc3Mgb2YgamF2YXguc2VybHZldC5qc3AudGFnZXh0LlRhZyB0aGF0IGltcGxlbWVudHMKK3RoZSByZXF1ZXN0IHRpbWUgc2VtYW50aWNzIGZvciB0aGlzIHRhZy4gKHJlcXVpcmVkKQorCisjUENEQVRBIDo6PSBmdWxseSBxdWFsaWZpZWQgSmF2YSBjbGFzcyBuYW1lCistLT4KKworPCFFTEVNRU5UIHRhZ2NsYXNzICgjUENEQVRBKSA+CisKKzwhLS0KK0RlZmluZXMgdGhlIHN1YmNsYXNzIG9mIGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWdFeHRyYUluZm8gZm9yCit0aGlzIHRhZy4gKG9wdGlvbmFsKQorCitJZiB0aGlzIGlzIG5vdCBnaXZlbiwgdGhlIGNsYXNzIGlzIG5vdCBjb25zdWx0ZWQgYXQgdHJhbnNsYXRpb24gdGltZS4KKworI1BDREFUQSA6Oj0gZnVsbHkgcXVhbGlmaWVkIEphdmEgY2xhc3MgbmFtZQorLS0+CisKKzwhRUxFTUVOVCB0ZWljbGFzcyAoI1BDREFUQSkgPgorCis8IS0tCitQcm92aWRlcyBhIGhpbnQgYXMgdG8gdGhlIGNvbnRlbnQgb2YgdGhlIGJvZHkgb2YgdGhpcyB0YWcuIFByaW1hcmlseQoraW50ZW5kZWQgZm9yIHVzZSBieSBwYWdlIGNvbXBvc2l0aW9uIHRvb2xzLgorCitUaGVyZSBhcmUgY3VycmVudGx5IHRocmVlIHZhbHVlcyBzcGVjaWZpZWQ6CisKK3RhZ2RlcGVuZGVudAlUaGUgYm9keSBvZiB0aGUgdGFnIGlzIGludGVycHJldGVkIGJ5IHRoZSB0YWcKKwkJaW1wbGVtZW50YXRpb24gaXRzZWxmLCBhbmQgaXMgbW9zdCBsaWtlbHkgaW4gYQorCQlkaWZmZXJlbnQgImxhbmdhZ2UiLCBlLmcgZW1iZWRkZWQgU1FMIHN0YXRlbWVudHMuCisKK0pTUAkJVGhlIGJvZHkgb2YgdGhlIHRhZyBjb250YWlucyBuZXN0ZWQgSlNQIHN5bnRheAorCitlbXB0eQkJVGhlIGJvZHkgbXVzdCBiZSBlbXB0eQorCitUaGUgZGVmYXVsdCAoaWYgbm90IGRlZmluZWQpIGlzIEpTUAorCisjUENEQVRBIDo6PSAgdGFnZGVwZW5kZW50IHwgSlNQIHwgZW1wdHkKKworLS0+CisKKzwhRUxFTUVOVCBib2R5Y29udGVudCAoI1BDREFUQSkgPgorCis8IS0tCitUaGUgYXR0cmlidXRlIHRhZyBkZWZpbmVzIGFuIGF0dHJpYnV0ZSBmb3IgdGhlIG5lc3RpbmcgdGFnCisKK0FuIGF0dHJpYnV0ZSBkZWZpbml0aW9uIGlzIGNvbXBvc2VkIG9mOgorCistIHRoZSBhdHRyaWJ1dGVzIG5hbWUgKHJlcXVpcmVkKQorLSBpZiB0aGUgYXR0cmlidXRlIGlzIHJlcXVpcmVkIG9yIG9wdGlvbmFsIChvcHRpb25hbCkKKy0gaWYgdGhlIGF0dHJpYnV0ZXMgdmFsdWUgbWF5IGJlIGR5bmFtaWNhbGx5IGNhbGN1bGF0ZWQgYXQgcnVudGltZQorICBieSBhIHNjcmlwdGxldCBleHByZXNzaW9uIChvcHRpb25hbCkKKworLS0+CisKKzwhRUxFTUVOVCBhdHRyaWJ1dGUgKG5hbWUsIHJlcXVpcmVkPyAsIHJ0ZXhwcnZhbHVlPykgPgorCis8IS0tCitEZWZpbmVzIHRoZSBjYW5vbmljYWwgbmFtZSBvZiBhIHRhZyBvciBhdHRyaWJ1dGUgYmVpbmcgZGVmaW5lZAorCisjUENEQVRBIDo6PSBOTVRPS0VOCistLT4KKworPCFFTEVNRU5UIG5hbWUJKCNQQ0RBVEEpID4KKworPCEtLQorRGVmaW5lcyBpZiB0aGUgbmVzdGluZyBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQgb3Igb3B0aW9uYWwuCisKKyNQQ0RBVEEgOjo9IHRydWUgfCBmYWxzZSB8IHllcyB8IG5vCisKK0lmIG5vdCBwcmVzZW50IHRoZW4gdGhlIGRlZmF1bHQgaXMgImZhbHNlIiwgaS5lIHRoZSBhdHRyaWJ1dGUKK2lzIG9wdGlvbmFsLgorLS0+CisKKzwhRUxFTUVOVCByZXF1aXJlZCAgICAoI1BDREFUQSkgPgorCis8IS0tCitEZWZpbmVzIGlmIHRoZSBuZXN0aW5nIGF0dHJpYnV0ZSBjYW4gaGF2ZSBzY3JpcHRsZXQgZXhwcmVzc2lvbnMgYXMKK2EgdmFsdWUsIGkuZSB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSBtYXkgYmUgZHluYW1pY2FsbHkgY2FsY3VsYXRlZAorYXQgcmVxdWVzdCB0aW1lLCBhcyBvcHBvc2VkIHRvIGEgc3RhdGljIHZhbHVlIGRldGVybWluZWQgYXQgdHJhbnNsYXRpb24KK3RpbWUuCisKKyNQQ0RBVEEgOjo9IHRydWUgfCBmYWxzZSB8IHllcyB8IG5vCisKK0lmIG5vdCBwcmVzZW50IHRoZW4gdGhlIGRlZmF1bHQgaXMgImZhbHNlIiwgaS5lIHRoZSBhdHRyaWJ1dGUKK2hhcyBhIHN0YXRpYyB2YWx1ZQorLS0+CisKKzwhRUxFTUVOVCBydGV4cHJ2YWx1ZSAoI1BDREFUQSkgPgorCis8IUFUVExJU1QgdGxpYnZlcnNpb24gaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QganNwdmVyc2lvbiBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBzaG9ydG5hbWUgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgdXJpIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIGluZm8gaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgdGFnIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIHRhZ2NsYXNzIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIHRlaWNsYXNzIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIGJvZHljb250ZW50IGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIGF0dHJpYnV0ZSBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBuYW1lIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIHJlcXVpcmVkIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIHJ0ZXhwcnZhbHVlIGlkIElEICNJTVBMSUVEPgpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2R0ZC93ZWItanNwdGFnbGlicmFyeV8xXzIuZHRkIGIvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2R0ZC93ZWItanNwdGFnbGlicmFyeV8xXzIuZHRkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxMTY1YjIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvZHRkL3dlYi1qc3B0YWdsaWJyYXJ5XzFfMi5kdGQKQEAgLTAsMCArMSw0NzcgQEAKKzwhLS0KKyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzwhLS0KKworICAgVGhpcyBpcyB0aGUgRFREIGRlZmluaW5nIHRoZSBKYXZhU2VydmVyIFBhZ2VzIDEuMiBUYWcgTGlicmFyeQorICAgZGVzY3JpcHRvciAoLnRsZCkgKFhNTCkgZmlsZSBmb3JtYXQvc3ludGF4LgorCisgICBBIFRhZyBMaWJyYXJ5IGlzIGEgSkFSIGZpbGUgY29udGFpbmluZyBhIHZhbGlkIGluc3RhbmNlIG9mIGEgVGFnIExpYnJhcnkKKyAgIERlc2NyaXB0b3IgKHRhZ2xpYi50bGQpIGZpbGUgaW4gdGhlIE1FVEEtSU5GIHN1YmRpcmVjdG9yeSwgYWxvbmcgd2l0aCB0aGUKKyAgIGFwcHJvcHJpYXRlIGltcGxlbWVudGluZyBjbGFzc2VzLCBhbmQgb3RoZXIgcmVzb3VyY2VzIHJlcXVpcmVkIHRvCisgICBpbXBsZW1lbnQgdGhlIHRhZ3MgZGVmaW5lZCB0aGVyZWluLgorCisgICBVc2UgaXMgc3ViamVjdCB0byBsaWNlbnNlIHRlcm1zLgorICAtLT4KKworPCFOT1RBVElPTiBXRUItSlNQVEFHTElCLjFfMiBQVUJMSUMKKyAgICAgICAgICAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEpTUCBUYWcgTGlicmFyeSAxLjIvL0VOIj4KKworPCEtLQorVGhpcyBpcyB0aGUgWE1MIERURCBmb3IgdGhlIEpTUCAxLjIgVGFnIExpYnJhcnkgRGVzY3JpcHRvci4KK0FsbCBKU1AgMS4yIHRhZyBsaWJyYXJ5IGRlc2NyaXB0b3JzIG11c3QgaW5jbHVkZSBhIERPQ1RZUEUKK29mIHRoZSBmb2xsb3dpbmcgZm9ybToKKworICA8IURPQ1RZUEUgdGFnbGliCisgICAgICAgIFBVQkxJQyAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEpTUCBUYWcgTGlicmFyeSAxLjIvL0VOIgorCSJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC93ZWItanNwdGFnbGlicmFyeV8xXzIuZHRkIj4KKworLS0+CisKKzwhLS0KK1RoZSB0YWdsaWIgdGFnIGlzIHRoZSBkb2N1bWVudCByb290LCBpdCBkZWZpbmVzOgorCit0bGliLXZlcnNpb24JdGhlIHZlcnNpb24gb2YgdGhlIHRhZyBsaWJyYXJ5IGltcGxlbWVudGF0aW9uCisKK2pzcC12ZXJzaW9uCXRoZSB2ZXJzaW9uIG9mIEpTUCB0aGUgdGFnIGxpYnJhcnkgZGVwZW5kcyB1cG9uCisKK3Nob3J0LW5hbWUJYSBzaW1wbGUgZGVmYXVsdCBzaG9ydCBuYW1lIHRoYXQgY291bGQgYmUgdXNlZCBieQorCQlhIEpTUCBhdXRob3JpbmcgdG9vbCB0byBjcmVhdGUgbmFtZXMgd2l0aCBhIG1uZW1vbmljCisJCXZhbHVlOyBmb3IgZXhhbXBsZSwgdGhlIGl0IG1heSBiZSB1c2VkIGFzIHRoZSBwcmVmZXJlZAorCQlwcmVmaXggdmFsdWUgaW4gdGFnbGliIGRpcmVjdGl2ZXMKKwordXJpCQlhIHVyaSB1bmlxdWVseSBpZGVudGlmeWluZyB0aGlzIHRhZ2xpYgorCitkaXNwbGF5LW5hbWUgICAgdGhlIGRpc3BsYXktbmFtZSBlbGVtZW50IGNvbnRhaW5zIGEgc2hvcnQgbmFtZSB0aGF0CisgICAgICAgICAgICAgICAgaXMgaW50ZW5kZWQgdG8gYmUgZGlzcGxheWVkIGJ5IHRvb2xzCitzbWFsbC1pY29uICAgICAgb3B0aW9uYWwgc21hbGwtaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGJ5IHRvb2xzCisKK2xhcmdlLWljb24gICAgICBvcHRpb25hbCBsYXJnZS1pY29uIHRoYXQgY2FuIGJlIHVzZWQgYnkgdG9vbHMKKworZGVzY3JpcHRpb24JYSBzaW1wbGUgc3RyaW5nIGRlc2NyaWJpbmcgdGhlICJ1c2UiIG9mIHRoaXMgdGFnbGliLAorCQlzaG91bGQgYmUgdXNlciBkaXNjZXJuYWJsZQorCit2YWxpZGF0b3IgICAgICAgb3B0aW9uYWwgVGFnTGlicmFyeVZhbGlkYXRvciBpbmZvcm1hdGlvbgorCitsaXN0ZW5lciAgICAgICAgb3B0aW9uYWwgZXZlbnQgbGlzdGVuZXIgc3BlY2lmaWNhdGlvbgorCisKKy0tPgorCis8IUVMRU1FTlQgdGFnbGliICh0bGliLXZlcnNpb24sIGpzcC12ZXJzaW9uLCBzaG9ydC1uYW1lLCB1cmk/LAorICAgICAgICAgICAgICAgICAgZGlzcGxheS1uYW1lPywgc21hbGwtaWNvbj8sIGxhcmdlLWljb24/LCBkZXNjcmlwdGlvbj8sCisgICAgICAgICAgICAgICAgICB2YWxpZGF0b3I/LCBsaXN0ZW5lciosIHRhZyspID4KKworPCFBVFRMSVNUIHRhZ2xpYiBpZCBJRCAjSU1QTElFRAorCSAgeG1sbnMgQ0RBVEEgI0ZJWEVECisJCSJodHRwOi8vamF2YS5zdW4uY29tL0pTUC9UYWdMaWJyYXJ5RGVzY3JpcHRvciIKKz4KKworPCEtLQorRGVzY3JpYmVzIHRoaXMgdmVyc2lvbiAobnVtYmVyKSBvZiB0aGUgdGFnbGlicmFyeSAoZGV3ZXkgZGVjaW1hbCkKKworI1BDREFUQSA6Oj0gWzAtOV0qeyAiLiJbMC05XSB9MC4uMworLS0+CisKKzwhRUxFTUVOVCB0bGliLXZlcnNpb24gKCNQQ0RBVEEpID4KKworPCEtLQorRGVzY3JpYmVzIHRoZSBKU1AgdmVyc2lvbiAobnVtYmVyKSB0aGlzIHRhZ2xpYnJhcnkgcmVxdWlyZXMgaW4KK29yZGVyIHRvIGZ1bmN0aW9uIChkZXdleSBkZWNpbWFsKQorCitUaGUgZGVmYXVsdCBpcyAxLjIKKworI1BDREFUQSA6Oj0gWzAtOV0qeyAiLiJbMC05XSB9MC4uMworLS0+CisKKzwhRUxFTUVOVCBqc3AtdmVyc2lvbiAgKCNQQ0RBVEEpID4KKworPCEtLQorRGVmaW5lcyBhIHNob3J0IChkZWZhdWx0KSBzaG9ydC1uYW1lIHRvIGJlIHVzZWQgZm9yIHRhZ3MgYW5kCit2YXJpYWJsZSBuYW1lcyB1c2VkL2NyZWF0ZWQgYnkgdGhpcyB0YWcgbGlicmFyeS4gIERvIG5vdCB1c2UKK3doaXRlIHNwYWNlLCBhbmQgZG8gbm90IHN0YXJ0IHdpdGggZGlnaXRzIG9yIHVuZGVyc2NvcmUuCisKKyNQQ0RBVEEgOjo9IE5NVE9LRU4KKy0tPgorCis8IUVMRU1FTlQgc2hvcnQtbmFtZSAgICAgICgjUENEQVRBKSA+CisKKzwhLS0KK0RlZmluZXMgYSBwdWJsaWMgVVJJIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGlzIHZlcnNpb24gb2YKK3RoZSB0YWdsaWJyYXJ5LiAgTGVhdmUgaXQgZW1wdHkgaWYgaXQgZG9lcyBub3QgYXBwbHkuCistLT4KKworPCFFTEVNRU5UIHVyaQkgKCNQQ0RBVEEpID4KKworPCEtLQorRGVmaW5lcyBhbiBhcmJpdHJhcnkgdGV4dCBzdHJpbmcgZGVzY2lyYmluZyB0aGUgdGFnIGxpYnJhcnkKKy0tPgorCis8IUVMRU1FTlQgZGVzY3JpcHRpb24JKCNQQ0RBVEEpID4KKworPCEtLQorCitEZWZpbmVzIGFuIG9wdGlvbmFsIHZhbGlkYXRvciB0aGF0IGNhbiBiZSB1c2VkIHRvCit2YWxpZGF0ZSB0aGUgY29uZm9ybWFuY2Ugb2YgYSBKU1AgcGFnZSB0byB1c2luZyB0aGlzIHRhZyBsaWJyYXJ5LgorLS0+CisKKzwhRUxFTUVOVCB2YWxpZGF0b3IgKHZhbGlkYXRvci1jbGFzcywgaW5pdC1wYXJhbSosIGRlc2NyaXB0aW9uPykgPgorCisKKzwhLS0KKworRGVmaW5lcyB0aGUgVGFnTGlicmFyeVZhbGlkYXRvciBjbGFzcyB0aGF0IGNhbiBiZSB1c2VkIHRvCit2YWxpZGF0ZSB0aGUgY29uZm9ybWFuY2Ugb2YgYSBKU1AgcGFnZSB0byB1c2luZyB0aGlzIHRhZyBsaWJyYXJ5LgorLS0+CisKKzwhRUxFTUVOVCB2YWxpZGF0b3ItY2xhc3MgKCNQQ0RBVEEpID4KKworCis8IS0tCisKK1RoZSBpbml0LXBhcmFtIGVsZW1lbnQgY29udGFpbnMgYSBuYW1lL3ZhbHVlIHBhaXIgYXMgYW4KK2luaXRpYWxpemF0aW9uIHBhcmFtCistLT4KKworPCFFTEVNRU5UIGluaXQtcGFyYW0gKHBhcmFtLW5hbWUsIHBhcmFtLXZhbHVlLCBkZXNjcmlwdGlvbj8pPgorCis8IS0tCisKK1RoZSBwYXJhbS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBwYXJhbWV0ZXIuCistLT4KKworPCFFTEVNRU5UIHBhcmFtLW5hbWUgKCNQQ0RBVEEpPgorCis8IS0tCisKK1RoZSBwYXJhbS12YWx1ZSBlbGVtZW50IGNvbnRhaW5zIHRoZSB2YWx1ZSBvZiBhIHBhcmFtZXRlci4KKy0tPgorCis8IUVMRU1FTlQgcGFyYW0tdmFsdWUgKCNQQ0RBVEEpPgorCisKKzwhLS0KKworRGVmaW5lcyBhbiBvcHRpb25hbCBldmVudCBsaXN0ZW5lciBvYmplY3QgdG8gYmUgaW5zdGFudGlhdGVkIGFuZAorcmVnaXN0ZXJlZCBhdXRvbWF0aWNhbGx5LgorLS0+CisKKzwhRUxFTUVOVCBsaXN0ZW5lciAobGlzdGVuZXItY2xhc3MpID4KKworPCEtLQorCitUaGUgbGlzdGVuZXItY2xhc3MgZWxlbWVudCBkZWNsYXJlcyBhIGNsYXNzIGluIHRoZSBhcHBsaWNhdGlvbiB0aGF0CittdXN0IGJlIHJlZ2lzdGVyZWQgYXMgYSB3ZWIgYXBwbGljYXRpb24gbGlzdGVuZXIgYmVhbi4gIFNlZSB0aGUKK1NlcnZsZXQgMi4zIHNwZWNpZmljYXRpb24gZm9yIGRldGFpbHMuCistLT4KKworPCFFTEVNRU5UIGxpc3RlbmVyLWNsYXNzICgjUENEQVRBKSA+CisKKworPCEtLQorVGhlIHRhZyBkZWZpbmVzIGEgdW5pcXVlIHRhZyBpbiB0aGlzIHRhZyBsaWJyYXJ5LiAgSXQgaGFzIG9uZQorYXR0cmlidXRlLCBpZC4KKworVGhlIHRhZyBlbGVtZW50IG1heSBoYXZlIHNldmVyYWwgc3ViZWxlbWVudHMgZGVmaW5pbmc6CisKK25hbWUgICAgICAgICAgICAgIFRoZSB1bmlxdWUgYWN0aW9uIG5hbWUKKwordGFnLWNsYXNzICAgICAgICAgVGhlIHRhZyBoYW5kbGVyIGNsYXNzIGltcGxlbWVudGluZworICAgICAgICAgICAgICAgICAgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZworCit0ZWktY2xhc3MgICAgICAgICBBbiBvcHRpb25hbCBzdWJjbGFzcyBvZgorICAgICAgICAgICAgICAgICAgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZ0V4dHJhSW5mbworCitib2R5LWNvbnRlbnQgICAgICBUaGUgYm9keSBjb250ZW50IHR5cGUKKworZGlzcGxheS1uYW1lICAgICAgQSBzaG9ydCBuYW1lIHRoYXQgaXMgaW50ZW5kZWQgdG8gYmUgZGlzcGxheWVkCisgICAgICAgICAgICAgICAgICBieSB0b29scworCitzbWFsbC1pY29uICAgICAgICBPcHRpb25hbCBzbWFsbC1pY29uIHRoYXQgY2FuIGJlIHVzZWQgYnkgdG9vbHMKKworbGFyZ2UtaWNvbiAgICAgICAgT3B0aW9uYWwgbGFyZ2UtaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGJ5IHRvb2xzCisKK2Rlc2NyaXB0aW9uICAgICAgIE9wdGlvbmFsIHRhZy1zcGVjaWZpYyBpbmZvcm1hdGlvbgorCit2YXJpYWJsZSAgICAgICAgICBPcHRpb25hbCBzY3JpcHRpbmcgdmFyaWFibGUgaW5mb3JtYXRpb24KKworYXR0cmlidXRlICAgICAgICAgQWxsIGF0dHJpYnV0ZXMgb2YgdGhpcyBhY3Rpb24KKworZXhhbXBsZSAgICAgICAgICAgT3B0aW9uYWwgaW5mb3JtYWwgZGVzY3JpcHRpb24gb2YgYW4gZXhhbXBsZSBvZiBhCisgICAgICAgICAgICAgICAgICB1c2Ugb2YgdGhpcyB0YWcKKworLS0+CisKKzwhRUxFTUVOVCB0YWcgKG5hbWUsIHRhZy1jbGFzcywgdGVpLWNsYXNzPywgYm9keS1jb250ZW50PywgZGlzcGxheS1uYW1lPywKKyAgICAgICAgICAgICAgIHNtYWxsLWljb24/LCBsYXJnZS1pY29uPywgZGVzY3JpcHRpb24/LCB2YXJpYWJsZSosIGF0dHJpYnV0ZSosCisgICAgICAgICAgICAgICBleGFtcGxlPykgPgorCis8IS0tCitEZWZpbmVzIHRoZSBzdWJjbGFzcyBvZiBqYXZheC5zZXJsdmV0LmpzcC50YWdleHQuVGFnIHRoYXQgaW1wbGVtZW50cwordGhlIHJlcXVlc3QgdGltZSBzZW1hbnRpY3MgZm9yIHRoaXMgdGFnLiAocmVxdWlyZWQpCisKKyNQQ0RBVEEgOjo9IGZ1bGx5IHF1YWxpZmllZCBKYXZhIGNsYXNzIG5hbWUKKy0tPgorCis8IUVMRU1FTlQgdGFnLWNsYXNzICgjUENEQVRBKSA+CisKKzwhLS0KK0RlZmluZXMgdGhlIHN1YmNsYXNzIG9mIGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWdFeHRyYUluZm8gZm9yCit0aGlzIHRhZy4gKG9wdGlvbmFsKQorCitJZiB0aGlzIGlzIG5vdCBnaXZlbiwgdGhlIGNsYXNzIGlzIG5vdCBjb25zdWx0ZWQgYXQgdHJhbnNsYXRpb24gdGltZS4KKworI1BDREFUQSA6Oj0gZnVsbHkgcXVhbGlmaWVkIEphdmEgY2xhc3MgbmFtZQorLS0+CisKKzwhRUxFTUVOVCB0ZWktY2xhc3MgKCNQQ0RBVEEpID4KKworPCEtLQorUHJvdmlkZXMgYSBoaW50IGFzIHRvIHRoZSBjb250ZW50IG9mIHRoZSBib2R5IG9mIHRoaXMgdGFnLiBQcmltYXJpbHkKK2ludGVuZGVkIGZvciB1c2UgYnkgcGFnZSBjb21wb3NpdGlvbiB0b29scy4KKworVGhlcmUgYXJlIGN1cnJlbnRseSB0aHJlZSB2YWx1ZXMgc3BlY2lmaWVkOgorCit0YWdkZXBlbmRlbnQJVGhlIGJvZHkgb2YgdGhlIHRhZyBpcyBpbnRlcnByZXRlZCBieSB0aGUgdGFnCisJCWltcGxlbWVudGF0aW9uIGl0c2VsZiwgYW5kIGlzIG1vc3QgbGlrZWx5IGluIGEKKwkJZGlmZmVyZW50ICJsYW5nYWdlIiwgZS5nIGVtYmVkZGVkIFNRTCBzdGF0ZW1lbnRzLgorCitKU1AJCVRoZSBib2R5IG9mIHRoZSB0YWcgY29udGFpbnMgbmVzdGVkIEpTUCBzeW50YXgKKworZW1wdHkJCVRoZSBib2R5IG11c3QgYmUgZW1wdHkKKworVGhlIGRlZmF1bHQgKGlmIG5vdCBkZWZpbmVkKSBpcyBKU1AKKworI1BDREFUQSA6Oj0gIHRhZ2RlcGVuZGVudCB8IEpTUCB8IGVtcHR5CisKKy0tPgorCis8IUVMRU1FTlQgYm9keS1jb250ZW50ICgjUENEQVRBKSA+CisKKzwhLS0KKworVGhlIGRpc3BsYXktbmFtZSBlbGVtZW50IGNvbnRhaW5zIGEgc2hvcnQgbmFtZSB0aGF0IGlzIGludGVuZGVkCit0byBiZSBkaXNwbGF5ZWQgYnkgdG9vbHMuCistLT4KKworPCFFTEVNRU5UIGRpc3BsYXktbmFtZSAoI1BDREFUQSkgPgorCisKKzwhLS0KKworVGhlIGxhcmdlLWljb24gZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIGZpbGUgY29udGFpbmluZyBhIGxhcmdlCisoMzIgeCAzMikgaWNvbiBpbWFnZS4gIFRoZSBmaWxlIG5hbWUgaXMgYSByZWxhdGl2ZSBwYXRoIHdpdGhpbiB0aGUKK3RhZyBsaWJyYXJ5LiAgVGhlIGltYWdlIG11c3QgYmUgZWl0aGVyIGluIHRoZSBKUEVHIG9yIEdJRiBmb3JtYXQsIGFuZAordGhlIGZpbGUgbmFtZSBtdXN0IGVuZCB3aXRoIHRoZSBzdWZmaXggIi5qcGciIG9yICIuZ2lmIiByZXNwZWN0aXZlbHkuCitUaGUgaWNvbiBjYW4gYmUgdXNlZCBieSB0b29scy4KKy0tPgorCis8IUVMRU1FTlQgbGFyZ2UtaWNvbiAoI1BDREFUQSkgPgorCis8IS0tCisKK1RoZSBzbWFsbC1pY29uIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBmaWxlIGNvbnRhaW5pbmcgYSBsYXJnZQorKDMyIHggMzIpIGljb24gaW1hZ2UuICBUaGUgZmlsZSBuYW1lIGlzIGEgcmVsYXRpdmUgcGF0aCB3aXRoaW4gdGhlCit0YWcgbGlicmFyeS4gIFRoZSBpbWFnZSBtdXN0IGJlIGVpdGhlciBpbiB0aGUgSlBFRyBvciBHSUYgZm9ybWF0LCBhbmQKK3RoZSBmaWxlIG5hbWUgbXVzdCBlbmQgd2l0aCB0aGUgc3VmZml4ICIuanBnIiBvciAiLmdpZiIgcmVzcGVjdGl2ZWx5LgorVGhlIGljb24gY2FuIGJlIHVzZWQgYnkgdG9vbHMuCistLT4KKworPCFFTEVNRU5UIHNtYWxsLWljb24gKCNQQ0RBVEEpID4KKworPCEtLQorCitUaGUgZXhhbXBsZSBlbGVtZW50IGNvbnRhaW5zIGFuIGluZm9ybWFsIGRlc2NyaXB0aW9uIG9mIGFuIGV4YW1wbGUKK29mIHRoZSB1c2Ugb2YgYSB0YWcuCistLT4KKworPCFFTEVNRU5UIGV4YW1wbGUgKCNQQ0RBVEEpID4KKworPCEtLQorCitUaGUgdmFyaWFibGUgdGFnIHByb3ZpZGVzIGluZm9ybWF0aW9uIG9uIHRoZSBzY3JpcHRpbmcgdmFyaWFibGVzCitkZWZpbmVkIGJ5IHRoaXMgdGFnLiAgSXQgaXMgYSAodHJhbnNsYXRpb24gdGltZSkgZXJyb3IgZm9yIGEgdGFnCit0aGF0IGhhcyBvbmUgb3IgbW9yZSB2YXJpYWJsZSBzdWJlbGVtZW50cyB0byBoYXZlIGEgVGFnRXh0cmFJbmZvCitjbGFzcyB0aGF0IHJldHVybnMgYSBub24tbnVsbCBvYmplY3QuCisKK1RoZSBzdWJlbGVtZW50cyBvZiB2YXJpYWJsZSBhcmUgb2YgdGhlIGZvcm06CisKK25hbWUtZ2l2ZW4gICAgICAgICAgICAgICBUaGUgdmFyaWFibGUgbmFtZSBhcyBhIGNvbnN0YW50CisKK25hbWUtZnJvbS1hdHRyaWJ1dGUgICAgICBUaGUgbmFtZSBvZiBhbiBhdHRyaWJ1dGUgd2hvc2UgKHRyYW5zbGF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgdGltZSkgdmFsdWUgd2lsbCBnaXZlIHRoZSBuYW1lIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLiAgT25lIG9mIG5hbWUtZ2l2ZW4gb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLWZyb20tYXR0cmlidXRlIGlzIHJlcXVpcmVkLgorCit2YXJpYWJsZS1jbGFzcyAgICAgICAgICAgTmFtZSBvZiB0aGUgY2xhc3Mgb2YgdGhlIHZhcmlhYmxlLgorICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgaXMgZGVmYXVsdC4KKworZGVjbGFyZSAgICAgICAgICAgICAgICAgIFdoZXRoZXIgdGhlIHZhcmlhYmxlIGlzIGRlY2xhcmVkIG9yIG5vdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICBUcnVlIGlzIHRoZSBkZWZhdWx0LgorCitzY29wZSAgICAgICAgICAgICAgICAgICAgVGhlIHNjb3BlIG9mIHRoZSBzY3JpcHRpbmcgdmFyYWlibGUKKyAgICAgICAgICAgICAgICAgICAgICAgICBkZWZpbmVkLiAgTkVTVEVEIGlzIGRlZmF1bHQuCisKK2Rlc2NyaXB0aW9uICAgICAgICAgICAgICBPcHRpb25hbCBkZXNjcmlwdGlvbiBvZiB0aGlzIHZhcmlhYmxlCisKKy0tPgorCis8IUVMRU1FTlQgdmFyaWFibGUgKCAobmFtZS1naXZlbiB8IG5hbWUtZnJvbS1hdHRyaWJ1dGUpLCB2YXJpYWJsZS1jbGFzcz8sCisgICAgICAgICAgICAgICAgICAgIGRlY2xhcmU/LCBzY29wZT8sIGRlc2NyaXB0aW9uPykgPgorCis8IS0tCisKK1RoZSBuYW1lIGZvciB0aGUgc2NyaXB0aW5nIHZhcmlhYmxlLiAgT25lIG9mIG5hbWUtZ2l2ZW4gb3IKK25hbWUtZnJvbS1hdHRyaWJ1dGUgaXMgcmVxdWlyZWQuCistLT4KKworPCFFTEVNRU5UIG5hbWUtZ2l2ZW4gKCNQQ0RBVEEpID4KKworPCEtLQorCitUaGUgbmFtZSBvZiBhbiBhdHRyaWJ1dGUgd2hvc2UgKHRyYW5zbGF0aW9uLXRpbWUpIHZhbHVlIHdpbGwgZ2l2ZQordGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlLiAgT25lIG9mIG5hbWUtZ2l2ZW4gb3IgbmFtZS1mcm9tLWF0dHJpYnV0ZQoraXMgcmVxdWlyZWQuCistLT4KKworPCFFTEVNRU5UIG5hbWUtZnJvbS1hdHRyaWJ1dGUgKCNQQ0RBVEEpID4KKworPCEtLQorCitUaGUgb3B0aW9uYWwgbmFtZSBvZiB0aGUgY2xhc3MgZm9yIHRoZSBzY3JpcHRpbmcgdmFyaWFibGUuICBUaGUKK2RlZmF1bHQgaXMgamF2YS5sYW5nLlN0cmluZy4KKy0tPgorCis8IUVMRU1FTlQgdmFyaWFibGUtY2xhc3MgKCNQQ0RBVEEpID4KKworPCEtLQorCitXaGV0aGVyIHRoZSBzY3JpcHRpbmcgdmFyaWFibGUgaXMgdG8gYmUgZGVmaW5lZCBvciBub3QuICBTZWUKK1RhZ0V4dHJhSW5mbyBmb3IgZGV0YWlscy4gIFRoaXMgZWxlbWVudCBpcyBvcHRpb25hbCBhbmQgInRydWUiCitpcyB0aGUgZGVmYXVsdC4KKy0tPgorCis8IUVMRU1FTlQgZGVjbGFyZSAoI1BDREFUQSkgPgorCis8IS0tCisKK1RoZSBzY29wZSBvZiB0aGUgc2NyaXB0aW5nIHZhcmlhYmxlLiAgU2VlIFRhZ0V4dHJhSW5mbyBmb3IgZGV0YWlscy4KK1RoZSBlbGVtZW50IGlzIG9wdGlvbmFsIGFuZCAiTkVTVEVEIiBpcyB0aGUgZGVmYXVsdC4gIE90aGVyIGxlZ2FsCit2YWx1ZXMgYXJlICJBVF9CRUdJTiIgYW5kICJBVF9FTkQiLgorLS0+CisKKzwhRUxFTUVOVCBzY29wZSAoI1BDREFUQSkgPgorCis8IS0tCisKK1RoZSBhdHRyaWJ1dGUgdGFnIGRlZmluZXMgYW4gYXR0cmlidXRlIGZvciB0aGUgbmVzdGluZyB0YWcKKworQW4gYXR0cmlidXRlIGRlZmluaXRpb24gaXMgY29tcG9zZWQgb2Y6CisJCistIHRoZSBhdHRyaWJ1dGVzIG5hbWUgKHJlcXVpcmVkKQorLSBpZiB0aGUgYXR0cmlidXRlIGlzIHJlcXVpcmVkIG9yIG9wdGlvbmFsIChvcHRpb25hbCkKKy0gaWYgdGhlIGF0dHJpYnV0ZXMgdmFsdWUgbWF5IGJlIGR5bmFtaWNhbGx5IGNhbGN1bGF0ZWQgYXQgcnVudGltZQorICBieSBhIHNjcmlwdGxldCBleHByZXNzaW9uIChvcHRpb25hbCkKKy0gdGhlIHR5cGUgb2YgdGhlIGF0dHJpYnV0ZXMgdmFsdWUgKG9wdGlvbmFsKQorLSBhbiBpbmZvcm1hbCBkZXNjcmlwdGlvbiBvZiB0aGUgbWVhbmluZyBvZiB0aGUgYXR0cmlidXRlIChvcHRpb25hbCkKKworLS0+CisKKworPCEtLQorVGhlIGF0dHJpYnV0ZSB0YWcgZGVmaW5lcyBhbiBhdHRyaWJ1dGUgZm9yIHRoZSBuZXN0aW5nIHRhZworCitBbiBhdHRyaWJ1dGUgZGVmaW5pdGlvbiBpcyBjb21wb3NlZCBvZjoKKworLSB0aGUgYXR0cmlidXRlcyBuYW1lIChyZXF1aXJlZCkKKworLSBpZiB0aGUgYXR0cmlidXRlIGlzIHJlcXVpcmVkIG9yIG9wdGlvbmFsIChvcHRpb25hbCkKKworLSBpZiB0aGUgYXR0cmlidXRlcyB2YWx1ZSBtYXkgYmUgZHluYW1pY2FsbHkgY2FsY3VsYXRlZCBhdCBydW50aW1lCisgIGJ5IGEgc2NyaXB0bGV0IGV4cHJlc3Npb24gKG9wdGlvbmFsKQorCistIHRoZSB0eXBlIG9mIHRoZSBhdHRyaWJ1dGVzIHZhbHVlIChvcHRpb25hbCkKKworLSBhbiBpbmZvcm1hbCBkZXNjcmlwdGlvbiBvZiB0aGUgbWVhbmluZyBvZiB0aGUgYXR0cmlidXRlIChvcHRpb25hbCkKKy0tPgorCis8IUVMRU1FTlQgYXR0cmlidXRlIChuYW1lLCByZXF1aXJlZD8gLCBydGV4cHJ2YWx1ZT8sIHR5cGU/LCBkZXNjcmlwdGlvbj8pID4KKworPCEtLQorRGVmaW5lcyB0aGUgY2Fub25pY2FsIG5hbWUgb2YgYSB0YWcgb3IgYXR0cmlidXRlIGJlaW5nIGRlZmluZWQKKworI1BDREFUQSA6Oj0gTk1UT0tFTgorLS0+CisKKzwhRUxFTUVOVCBuYW1lCSgjUENEQVRBKSA+CisKKzwhLS0KK0RlZmluZXMgaWYgdGhlIG5lc3RpbmcgYXR0cmlidXRlIGlzIHJlcXVpcmVkIG9yIG9wdGlvbmFsLgorCisjUENEQVRBIDo6PSB0cnVlIHwgZmFsc2UgfCB5ZXMgfCBubworCitJZiBub3QgcHJlc2VudCB0aGVuIHRoZSBkZWZhdWx0IGlzICJmYWxzZSIsIGkuZSB0aGUgYXR0cmlidXRlCitpcyBvcHRpb25hbC4KKy0tPgorCis8IUVMRU1FTlQgcmVxdWlyZWQgICAgKCNQQ0RBVEEpID4KKworPCEtLQorRGVmaW5lcyBpZiB0aGUgbmVzdGluZyBhdHRyaWJ1dGUgY2FuIGhhdmUgc2NyaXB0bGV0IGV4cHJlc3Npb25zIGFzCithIHZhbHVlLCBpLmUgdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgbWF5IGJlIGR5bmFtaWNhbGx5IGNhbGN1bGF0ZWQKK2F0IHJlcXVlc3QgdGltZSwgYXMgb3Bwb3NlZCB0byBhIHN0YXRpYyB2YWx1ZSBkZXRlcm1pbmVkIGF0IHRyYW5zbGF0aW9uCit0aW1lLgorCisjUENEQVRBIDo6PSB0cnVlIHwgZmFsc2UgfCB5ZXMgfCBubworCitJZiBub3QgcHJlc2VudCB0aGVuIHRoZSBkZWZhdWx0IGlzICJmYWxzZSIsIGkuZSB0aGUgYXR0cmlidXRlCitoYXMgYSBzdGF0aWMgdmFsdWUKKy0tPgorCis8IUVMRU1FTlQgcnRleHBydmFsdWUgKCNQQ0RBVEEpID4KKworCis8IS0tCisKK0RlZmluZXMgdGhlIEphdmEgdHlwZSBvZiB0aGUgYXR0cmlidXRlcyB2YWx1ZS4gIEZvciBzdGF0aWMgdmFsdWVzCisodGhvc2UgZGV0ZXJtaW5lZCBhdCB0cmFuc2xhdGlvbiB0aW1lKSB0aGUgdHlwZSBpcyBhbHdheXMKK2phdmEubGFuZy5TdHJpbmcuCistLT4KKworPCFFTEVNRU5UIHR5cGUgKCNQQ0RBVEEpID4KKworCis8IS0tIElEIGF0dHJpYnV0ZXMgLS0+CisKKzwhQVRUTElTVCB0bGliLXZlcnNpb24gaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QganNwLXZlcnNpb24gaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1Qgc2hvcnQtbmFtZSBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCB1cmkgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgZGVzY3JpcHRpb24gaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgZXhhbXBsZSBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCB0YWcgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgdGFnLWNsYXNzIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIHRlaS1jbGFzcyBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBib2R5LWNvbnRlbnQgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgYXR0cmlidXRlIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIG5hbWUgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgcmVxdWlyZWQgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgcnRleHBydmFsdWUgaWQgSUQgI0lNUExJRUQ+CisKKworPCFBVFRMSVNUIHBhcmFtLW5hbWUgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgcGFyYW0tdmFsdWUgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgbGlzdGVuZXIgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgbGlzdGVuZXItY2xhc3MgaWQgSUQgI0lNUExJRUQ+CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvZHRkL3dlYi1qc3B0YWdsaWJyYXJ5XzJfMC54c2QgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvZHRkL3dlYi1qc3B0YWdsaWJyYXJ5XzJfMC54c2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODExM2IwOQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9kdGQvd2ViLWpzcHRhZ2xpYnJhcnlfMl8wLnhzZApAQCAtMCwwICsxLDEwMjUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8eHNkOnNjaGVtYQorICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCisgICAgIHhtbG5zOmoyZWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCisgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCisgICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgorICAgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCisgICAgIHZlcnNpb249IjIuMCI+CisKKyAgPHhzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICAgICVXJSAlRyUKKyAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICA8L3hzZDphbm5vdGF0aW9uPgorCisgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgIENvcHlyaWdodCAyMDAzIFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDkwMSBTYW4gQW50b25pbworICAgICAgUm9hZCwgUGFsbyBBbHRvLCBDYWxpZm9ybmlhIDk0MzAzLCBVLlMuQS4gQWxsIHJpZ2h0cworICAgICAgcmVzZXJ2ZWQuCisKKyAgICAgIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaGFzIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMKKyAgICAgIHJlbGF0aW5nIHRvIHRlY2hub2xvZ3kgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQuIEluCisgICAgICBwYXJ0aWN1bGFyLCBhbmQgd2l0aG91dCBsaW1pdGF0aW9uLCB0aGVzZSBpbnRlbGxlY3R1YWwKKyAgICAgIHByb3BlcnR5IHJpZ2h0cyBtYXkgaW5jbHVkZSBvbmUgb3IgbW9yZSBvZiB0aGUgVS5TLiBwYXRlbnRzCisgICAgICBsaXN0ZWQgYXQgaHR0cDovL3d3dy5zdW4uY29tL3BhdGVudHMgYW5kIG9uZSBvciBtb3JlCisgICAgICBhZGRpdGlvbmFsIHBhdGVudHMgb3IgcGVuZGluZyBwYXRlbnQgYXBwbGljYXRpb25zIGluIHRoZQorICAgICAgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgorCisgICAgICBUaGlzIGRvY3VtZW50IGFuZCB0aGUgdGVjaG5vbG9neSB3aGljaCBpdCBkZXNjcmliZXMgYXJlCisgICAgICBkaXN0cmlidXRlZCB1bmRlciBsaWNlbnNlcyByZXN0cmljdGluZyB0aGVpciB1c2UsIGNvcHlpbmcsCisgICAgICBkaXN0cmlidXRpb24sIGFuZCBkZWNvbXBpbGF0aW9uLiBObyBwYXJ0IG9mIHRoaXMgZG9jdW1lbnQKKyAgICAgIG1heSBiZSByZXByb2R1Y2VkIGluIGFueSBmb3JtIGJ5IGFueSBtZWFucyB3aXRob3V0IHByaW9yCisgICAgICB3cml0dGVuIGF1dGhvcml6YXRpb24gb2YgU3VuIGFuZCBpdHMgbGljZW5zb3JzLCBpZiBhbnkuCisKKyAgICAgIFRoaXJkLXBhcnR5IHNvZnR3YXJlLCBpbmNsdWRpbmcgZm9udCB0ZWNobm9sb2d5LCBpcworICAgICAgY29weXJpZ2h0ZWQgYW5kIGxpY2Vuc2VkIGZyb20gU3VuIHN1cHBsaWVycy4KKworICAgICAgU3VuLCBTdW4gTWljcm9zeXN0ZW1zLCB0aGUgU3VuIGxvZ28sIFNvbGFyaXMsIEphdmEsIEoyRUUsCisgICAgICBKYXZhU2VydmVyIFBhZ2VzLCBFbnRlcnByaXNlIEphdmFCZWFucyBhbmQgdGhlIEphdmEgQ29mZmVlCisgICAgICBDdXAgbG9nbyBhcmUgdHJhZGVtYXJrcyBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU3VuCisgICAgICBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KKworICAgICAgRmVkZXJhbCBBY3F1aXNpdGlvbnM6IENvbW1lcmNpYWwgU29mdHdhcmUgLSBHb3Zlcm5tZW50IFVzZXJzCisgICAgICBTdWJqZWN0IHRvIFN0YW5kYXJkIExpY2Vuc2UgVGVybXMgYW5kIENvbmRpdGlvbnMuCisKKyAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICA8L3hzZDphbm5vdGF0aW9uPgorCisgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOmRvY3VtZW50YXRpb24+CisgICAgICA8IVtDREFUQVsKKworCVRoaXMgaXMgdGhlIFhNTCBTY2hlbWEgZm9yIHRoZSBKU1AgVGFnbGlicmFyeQorCWRlc2NyaXB0b3IuICBBbGwgVGFnbGlicmFyeSBkZXNjcmlwdG9ycyBtdXN0CisJaW5kaWNhdGUgdGhlIHRhZyBsaWJyYXJ5IHNjaGVtYSBieSB1c2luZyB0aGUgVGFnbGlicmFyeQorCW5hbWVzcGFjZToKKworCWh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUKKworCWFuZCBieSBpbmRpY2F0aW5nIHRoZSB2ZXJzaW9uIG9mIHRoZSBzY2hlbWEgYnkKKwl1c2luZyB0aGUgdmVyc2lvbiBlbGVtZW50IGFzIHNob3duIGJlbG93OgorCisJICAgIDx0YWdsaWIgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCisJICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKwkgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Ii4uLiIKKwkgICAgICB2ZXJzaW9uPSIyLjAiPgorCSAgICAgIC4uLgorCSAgICA8L3RhZ2xpYj4KKworCVRoZSBpbnN0YW5jZSBkb2N1bWVudHMgbWF5IGluZGljYXRlIHRoZSBwdWJsaXNoZWQKKwl2ZXJzaW9uIG9mIHRoZSBzY2hlbWEgdXNpbmcgeHNpOnNjaGVtYUxvY2F0aW9uIGF0dHJpYnV0ZQorCWZvciBKMkVFIG5hbWVzcGFjZSB3aXRoIHRoZSBmb2xsb3dpbmcgbG9jYXRpb246CisKKwlodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL3dlYi1qc3B0YWdsaWJyYXJ5XzJfMC54c2QKKworCV1dPgorICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgIDwveHNkOmFubm90YXRpb24+CisKKyAgPHhzZDppbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJqMmVlXzFfNC54c2QiLz4KKworCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKworICA8eHNkOmVsZW1lbnQgbmFtZT0idGFnbGliIiB0eXBlPSJqMmVlOnRsZFRhZ2xpYlR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCVRoZSB0YWdsaWIgdGFnIGlzIHRoZSBkb2N1bWVudCByb290LgorCVRoZSBkZWZpbml0aW9uIG9mIHRhZ2xpYiBpcyBwcm92aWRlZAorCWJ5IHRoZSB0bGRUYWdsaWJUeXBlLgorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDp1bmlxdWUgbmFtZT0idGFnLW5hbWUtdW5pcXVlbmVzcyI+CisgICAgICA8eHNkOmFubm90YXRpb24+CisJPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICBUaGUgdGFnbGliIGVsZW1lbnQgY29udGFpbnMsIGFtb25nIG90aGVyIHRoaW5ncywgdGFnIGFuZAorCSAgdGFnLWZpbGUgZWxlbWVudHMuCisJICBUaGUgbmFtZSBzdWJlbGVtZW50cyBvZiB0aGVzZSBlbGVtZW50cyBtdXN0IGVhY2ggYmUgdW5pcXVlLgorCisJPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICAgIDwveHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOnRhZ3xqMmVlOnRhZy1maWxlIi8+CisgICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOm5hbWUiLz4KKyAgICA8L3hzZDp1bmlxdWU+CisKKyAgICA8eHNkOnVuaXF1ZSBuYW1lPSJmdW5jdGlvbi1uYW1lLXVuaXF1ZW5lc3MiPgorICAgICAgPHhzZDphbm5vdGF0aW9uPgorCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgVGhlIHRhZ2xpYiBlbGVtZW50IGNvbnRhaW5zIGZ1bmN0aW9uIGVsZW1lbnRzLgorCSAgVGhlIG5hbWUgc3ViZWxlbWVudHMgb2YgdGhlc2UgZWxlbWVudHMgbXVzdCBlYWNoIGJlIHVuaXF1ZS4KKworCTwveHNkOmRvY3VtZW50YXRpb24+CisgICAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTpmdW5jdGlvbiIvPgorICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTpuYW1lIi8+CisgICAgPC94c2Q6dW5pcXVlPgorCisgIDwveHNkOmVsZW1lbnQ+CisKKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYm9keS1jb250ZW50VHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAgIFNwZWNpZmllcyB0aGUgdHlwZSBvZiBib2R5IHRoYXQgaXMgdmFsaWQgZm9yIGEgdGFnLgorCVRoaXMgdmFsdWUgaXMgdXNlZCBieSB0aGUgSlNQIGNvbnRhaW5lciB0byB2YWxpZGF0ZQorCXRoYXQgYSB0YWcgaW52b2NhdGlvbiBoYXMgdGhlIGNvcnJlY3QgYm9keSBzeW50YXggYW5kCisJYnkgcGFnZSBjb21wb3NpdGlvbiB0b29scyB0byBhc3Npc3QgdGhlIHBhZ2UgYXV0aG9yCisJaW4gcHJvdmlkaW5nIGEgdmFsaWQgdGFnIGJvZHkuCisKKwlUaGVyZSBhcmUgY3VycmVudGx5IGZvdXIgdmFsdWVzIHNwZWNpZmllZDoKKworCXRhZ2RlcGVuZGVudCAgICBUaGUgYm9keSBvZiB0aGUgdGFnIGlzIGludGVycHJldGVkIGJ5IHRoZSB0YWcKKwkJCWltcGxlbWVudGF0aW9uIGl0c2VsZiwgYW5kIGlzIG1vc3QgbGlrZWx5CisJCQlpbiBhIGRpZmZlcmVudCAibGFuZ3VhZ2UiLCBlLmcgZW1iZWRkZWQgU1FMCisJCQlzdGF0ZW1lbnRzLgorCisJSlNQICAgICAgICAgICAgIFRoZSBib2R5IG9mIHRoZSB0YWcgY29udGFpbnMgbmVzdGVkIEpTUAorCQkJc3ludGF4LgorCisJZW1wdHkgICAgICAgICAgIFRoZSBib2R5IG11c3QgYmUgZW1wdHkKKworCXNjcmlwdGxlc3MgICAgICBUaGUgYm9keSBhY2NlcHRzIG9ubHkgdGVtcGxhdGUgdGV4dCwgRUwKKwkJCUV4cHJlc3Npb25zLCBhbmQgSlNQIGFjdGlvbiBlbGVtZW50cy4gIE5vCisJCQlzY3JpcHRpbmcgZWxlbWVudHMgYXJlIGFsbG93ZWQuCisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKworICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgorCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InRhZ2RlcGVuZGVudCIvPgorCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpTUCIvPgorCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImVtcHR5Ii8+CisJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic2NyaXB0bGVzcyIvPgorICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImV4dGVuc2libGVUeXBlIiBhYnN0cmFjdD0idHJ1ZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJVGhlIGV4dGVuc2libGVUeXBlIGlzIGFuIGFic3RyYWN0IGJhc2UgdHlwZSB0aGF0IGlzIHVzZWQgdG8KKwlkZWZpbmUgdGhlIHR5cGUgb2YgZXh0ZW5zaW9uLWVsZW1lbnRzLiBJbnN0YW5jZSBkb2N1bWVudHMKKwltdXN0IHN1YnN0aXR1dGUgYSBrbm93biB0eXBlIHRvIGRlZmluZSB0aGUgZXh0ZW5zaW9uIGJ5CisJdXNpbmcgeHNpOnR5cGUgYXR0cmlidXRlIHRvIGRlZmluZSB0aGUgYWN0dWFsIHR5cGUgb2YKKwlleHRlbnNpb24tZWxlbWVudHMuCisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmdW5jdGlvblR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCVRoZSBmdW5jdGlvbiBlbGVtZW50IGlzIHVzZWQgdG8gcHJvdmlkZSBpbmZvcm1hdGlvbiBvbiBlYWNoCisJZnVuY3Rpb24gaW4gdGhlIHRhZyBsaWJyYXJ5IHRoYXQgaXMgdG8gYmUgZXhwb3NlZCB0byB0aGUgRUwuCisKKwlUaGUgZnVuY3Rpb24gZWxlbWVudCBtYXkgaGF2ZSBzZXZlcmFsIHN1YmVsZW1lbnRzIGRlZmluaW5nOgorCisJZGVzY3JpcHRpb24gICAgICAgICBPcHRpb25hbCB0YWctc3BlY2lmaWMgaW5mb3JtYXRpb24KKworCWRpc3BsYXktbmFtZSAgICAgICAgQSBzaG9ydCBuYW1lIHRoYXQgaXMgaW50ZW5kZWQgdG8gYmUKKwkJCSAgICBkaXNwbGF5ZWQgYnkgdG9vbHMKKworCWljb24gICAgICAgICAgICAgICAgT3B0aW9uYWwgaWNvbiBlbGVtZW50IHRoYXQgY2FuIGJlIHVzZWQKKwkJCSAgICBieSB0b29scworCisJbmFtZSAgICAgICAgICAgICAgICBBIHVuaXF1ZSBuYW1lIGZvciB0aGlzIGZ1bmN0aW9uCisKKwlmdW5jdGlvbi1jbGFzcyAgICAgIFByb3ZpZGVzIHRoZSBuYW1lIG9mIHRoZSBKYXZhIGNsYXNzIHRoYXQKKwkJCSAgICBpbXBsZW1lbnRzIHRoZSBmdW5jdGlvbgorCisJZnVuY3Rpb24tc2lnbmF0dXJlICBQcm92aWRlcyB0aGUgc2lnbmF0dXJlLCBhcyBpbiB0aGUgSmF2YQorCQkJICAgIExhbmd1YWdlIFNwZWNpZmljYXRpb24sIG9mIHRoZSBKYXZhCisJCQkgICAgbWV0aG9kIHRoYXQgaXMgdG8gYmUgdXNlZCB0byBpbXBsZW1lbnQKKwkJCSAgICB0aGUgZnVuY3Rpb24uCisKKwlleGFtcGxlICAgICAgICAgICAgIE9wdGlvbmFsIGluZm9ybWFsIGRlc2NyaXB0aW9uIG9mIGFuCisJCQkgICAgZXhhbXBsZSBvZiBhIHVzZSBvZiB0aGlzIGZ1bmN0aW9uCisKKwlmdW5jdGlvbi1leHRlbnNpb24gIFplcm8gb3IgbW9yZSBleHRlbnNpb25zIHRoYXQgcHJvdmlkZSBleHRyYQorCQkJICAgIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZnVuY3Rpb24sIGZvciB0b29sCisJCQkgICAgY29uc3VtcHRpb24KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorCisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqMmVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIgorCQkgICB0eXBlPSJqMmVlOnRsZC1jYW5vbmljYWwtbmFtZVR5cGUiPgorCTx4c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgICBBIHVuaXF1ZSBuYW1lIGZvciB0aGlzIGZ1bmN0aW9uLgorCisJICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCTwveHNkOmFubm90YXRpb24+CisgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZ1bmN0aW9uLWNsYXNzIgorCQkgICB0eXBlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgorCTx4c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgICBQcm92aWRlcyB0aGUgZnVsbHktcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIEphdmEKKwkgICAgY2xhc3MgY29udGFpbmluZyB0aGUgc3RhdGljIG1ldGhvZCB0aGF0IGltcGxlbWVudHMKKwkgICAgdGhlIGZ1bmN0aW9uLgorCisJICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCTwveHNkOmFubm90YXRpb24+CisKKyAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZnVuY3Rpb24tc2lnbmF0dXJlIgorCQkgICB0eXBlPSJqMmVlOnN0cmluZyI+CisJPHhzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICAgIFByb3ZpZGVzIHRoZSBzaWduYXR1cmUsIG9mIHRoZSBzdGF0aWMgSmF2YSBtZXRob2QgdGhhdCBpcworCSAgICB0byBiZSB1c2VkIHRvIGltcGxlbWVudCB0aGUgZnVuY3Rpb24uICBUaGUgc3ludGF4IG9mIHRoZQorCSAgICBmdW5jdGlvbi1zaWduYXR1cmUgZWxlbWVudCBpcyBhcyBmb2xsb3dzOgorCisJCUZ1bmN0aW9uU2lnbmF0dXJlIDo6PSBSZXR1cm5UeXBlIFMgTWV0aG9kTmFtZSBTPworCQkJCSAgICAgICcoJyBTPyBQYXJhbWV0ZXJzPyBTPyAnKScKKworICAgICAgICAgICAgICAgIFJldHVyblR5cGUgICAgICAgIDo6PSBUeXBlCisKKwkJTWV0aG9kTmFtZSAgICAgICAgOjo9IElkZW50aWZpZXIKKworCQlQYXJhbWV0ZXJzICAgICAgICA6Oj0gICBQYXJhbWV0ZXIKKwkJCQkgICAgICB8ICggUGFyYW1ldGVyIFM/ICcsJyBTPyBQYXJhbWV0ZXJzICkKKworICAgICAgICAgICAgICAgIFBhcmFtZXRlciAgICAgICAgIDo6PSBUeXBlCisKKwkJV2hlcmU6CisKKyAJCSAgICAqIFR5cGUgaXMgYSBiYXNpYyB0eXBlIG9yIGEgZnVsbHkgcXVhbGlmaWVkCisJCSAgICAgIEphdmEgY2xhc3MgbmFtZSAoaW5jbHVkaW5nIHBhY2thZ2UgbmFtZSksCisJCSAgICAgIGFzIHBlciB0aGUgJ1R5cGUnIHByb2R1Y3Rpb24gaW4gdGhlIEphdmEKKwkJICAgICAgTGFuZ3VhZ2UgU3BlY2lmaWNhdGlvbiwgU2Vjb25kIEVkaXRpb24sCisJCSAgICAgIENoYXB0ZXIgMTguCisKKyAgICAgICAgICAgICAgICAgICAgKiBJZGVudGlmaWVyIGlzIGEgSmF2YSBpZGVudGlmaWVyLCBhcyBwZXIKKwkJICAgICAgdGhlICdJZGVudGlmaWVyJyBwcm9kdWN0aW9uIGluIHRoZSBKYXZhCisJCSAgICAgIExhbmd1YWdlIFNwZWNpZmljYXRpb24sIFNlY29uZAorCQkgICAgICBFZGl0aW9uLCBDaGFwdGVyIDE4LgorCisJICAgIEV4YW1wbGU6CisKKwkgICAgamF2YS5sYW5nLlN0cmluZyBuaWNrTmFtZSggamF2YS5sYW5nLlN0cmluZywgaW50ICkKKworCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwk8L3hzZDphbm5vdGF0aW9uPgorCisgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4YW1wbGUiCisJCSAgIHR5cGU9ImoyZWU6eHNkU3RyaW5nVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIj4KKwk8eHNkOmFubm90YXRpb24+CisJICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgICAgVGhlIGV4YW1wbGUgZWxlbWVudCBjb250YWlucyBhbiBpbmZvcm1hbCBkZXNjcmlwdGlvbgorCSAgICBvZiBhbiBleGFtcGxlIG9mIHRoZSB1c2Ugb2YgdGhpcyBmdW5jdGlvbi4KKworCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwk8L3hzZDphbm5vdGF0aW9uPgorCisgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZ1bmN0aW9uLWV4dGVuc2lvbiIKKwkJICAgdHlwZT0iajJlZTp0bGQtZXh0ZW5zaW9uVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIgorCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisJPHhzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICAgIEZ1bmN0aW9uIGV4dGVuc2lvbnMgYXJlIGZvciB0b29sIHVzZSBvbmx5IGFuZCBtdXN0IG5vdCBhZmZlY3QKKwkgICAgdGhlIGJlaGF2aW9yIG9mIGEgY29udGFpbmVyLgorCisJICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCTwveHNkOmFubm90YXRpb24+CisgICAgICA8L3hzZDplbGVtZW50PgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRhZ0ZpbGVUeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwlEZWZpbmVzIGFuIGFjdGlvbiBpbiB0aGlzIHRhZyBsaWJyYXJ5IHRoYXQgaXMgaW1wbGVtZW50ZWQKKwlhcyBhIC50YWcgZmlsZS4KKworCVRoZSB0YWctZmlsZSBlbGVtZW50IGhhcyB0d28gcmVxdWlyZWQgc3ViZWxlbWVudHM6CisKKwlkZXNjcmlwdGlvbiAgICAgICBPcHRpb25hbCB0YWctc3BlY2lmaWMgaW5mb3JtYXRpb24KKworCWRpc3BsYXktbmFtZSAgICAgIEEgc2hvcnQgbmFtZSB0aGF0IGlzIGludGVuZGVkIHRvIGJlCisJCQkgIGRpc3BsYXllZCBieSB0b29scworCisJaWNvbiAgICAgICAgICAgICAgT3B0aW9uYWwgaWNvbiBlbGVtZW50IHRoYXQgY2FuIGJlIHVzZWQKKwkJCSAgYnkgdG9vbHMKKworCW5hbWUgICAgICAgICAgICAgIFRoZSB1bmlxdWUgYWN0aW9uIG5hbWUKKworCXBhdGggICAgICAgICAgICAgIFdoZXJlIHRvIGZpbmQgdGhlIC50YWcgZmlsZSBpbXBsZW1lbnRpbmcgdGhpcworCQkJICBhY3Rpb24sIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSB3ZWIKKwkJCSAgYXBwbGljYXRpb24gb3IgdGhlIHJvb3Qgb2YgdGhlIEpBUiBmaWxlIGZvciBhCisJCQkgIHRhZyBsaWJyYXJ5IHBhY2thZ2VkIGluIGEgSkFSLiAgVGhpcyBtdXN0CisJCQkgIGJlZ2luIHdpdGggL1dFQi1JTkYvdGFncyBpZiB0aGUgLnRhZyBmaWxlCisJCQkgIHJlc2lkZXMgaW4gdGhlIFdBUiwgb3IgL01FVEEtSU5GL3RhZ3MgaWYgdGhlCisJCQkgIC50YWcgZmlsZSByZXNpZGVzIGluIGEgSkFSLgorCisJZXhhbXBsZSAgICAgICAgICAgT3B0aW9uYWwgaW5mb3JtYWwgZGVzY3JpcHRpb24gb2YgYW4KKwkJCSAgZXhhbXBsZSBvZiBhIHVzZSBvZiB0aGlzIHRhZworCisJdGFnLWV4dGVuc2lvbiAgICAgWmVybyBvciBtb3JlIGV4dGVuc2lvbnMgdGhhdCBwcm92aWRlIGV4dHJhCisJCQkgIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgdGFnLCBmb3IgdG9vbAorCQkJICBjb25zdW1wdGlvbgorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisKKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDpncm91cCByZWY9ImoyZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWUiCisJCSAgIHR5cGU9ImoyZWU6dGxkLWNhbm9uaWNhbC1uYW1lVHlwZSIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhdGgiCisJCSAgIHR5cGU9ImoyZWU6cGF0aFR5cGUiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGFtcGxlIgorCQkgICB0eXBlPSJqMmVlOnhzZFN0cmluZ1R5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCI+CisJPHhzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICAgIFRoZSBleGFtcGxlIGVsZW1lbnQgY29udGFpbnMgYW4gaW5mb3JtYWwgZGVzY3JpcHRpb24KKwkgICAgb2YgYW4gZXhhbXBsZSBvZiB0aGUgdXNlIG9mIGEgdGFnLgorCisJICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCTwveHNkOmFubm90YXRpb24+CisKKyAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFnLWV4dGVuc2lvbiIKKwkJICAgdHlwZT0iajJlZTp0bGQtZXh0ZW5zaW9uVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIgorCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisJPHhzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICAgIFRhZyBleHRlbnNpb25zIGFyZSBmb3IgdG9vbCB1c2Ugb25seSBhbmQgbXVzdCBub3QgYWZmZWN0CisJICAgIHRoZSBiZWhhdmlvciBvZiBhIGNvbnRhaW5lci4KKworCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwk8L3hzZDphbm5vdGF0aW9uPgorICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0YWdUeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwlUaGUgdGFnIGRlZmluZXMgYSB1bmlxdWUgdGFnIGluIHRoaXMgdGFnIGxpYnJhcnkuICBJdCBoYXMgb25lCisJYXR0cmlidXRlLCBpZC4KKworCVRoZSB0YWcgZWxlbWVudCBtYXkgaGF2ZSBzZXZlcmFsIHN1YmVsZW1lbnRzIGRlZmluaW5nOgorCisJZGVzY3JpcHRpb24gICAgICAgT3B0aW9uYWwgdGFnLXNwZWNpZmljIGluZm9ybWF0aW9uCisKKwlkaXNwbGF5LW5hbWUgICAgICBBIHNob3J0IG5hbWUgdGhhdCBpcyBpbnRlbmRlZCB0byBiZQorCQkJICBkaXNwbGF5ZWQgYnkgdG9vbHMKKworCWljb24gICAgICAgICAgICAgIE9wdGlvbmFsIGljb24gZWxlbWVudCB0aGF0IGNhbiBiZSB1c2VkCisJCQkgIGJ5IHRvb2xzCisKKwluYW1lICAgICAgICAgICAgICBUaGUgdW5pcXVlIGFjdGlvbiBuYW1lCisKKwl0YWctY2xhc3MgICAgICAgICBUaGUgdGFnIGhhbmRsZXIgY2xhc3MgaW1wbGVtZW50aW5nCisJCQkgIGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5Kc3BUYWcKKworCXRlaS1jbGFzcyAgICAgICAgIEFuIG9wdGlvbmFsIHN1YmNsYXNzIG9mCisJCQkgIGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWdFeHRyYUluZm8KKworCWJvZHktY29udGVudCAgICAgIFRoZSBib2R5IGNvbnRlbnQgdHlwZQorCisJdmFyaWFibGUgICAgICAgICAgT3B0aW9uYWwgc2NyaXB0aW5nIHZhcmlhYmxlIGluZm9ybWF0aW9uCisKKwlhdHRyaWJ1dGUgICAgICAgICBBbGwgYXR0cmlidXRlcyBvZiB0aGlzIGFjdGlvbiB0aGF0IGFyZQorCQkJICBldmFsdWF0ZWQgcHJpb3IgdG8gaW52b2NhdGlvbi4KKworCWR5bmFtaWMtYXR0cmlidXRlcyBXaGV0aGVyIHRoaXMgdGFnIHN1cHBvcnRzIGFkZGl0aW9uYWwKKwkJCSAgIGF0dHJpYnV0ZXMgd2l0aCBkeW5hbWljIG5hbWVzLiAgSWYKKwkJCSAgIHRydWUsIHRoZSB0YWctY2xhc3MgbXVzdCBpbXBsZW1lbnQgdGhlCisJCQkgICBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuRHluYW1pY0F0dHJpYnV0ZXMKKwkJCSAgIGludGVyZmFjZS4gIERlZmF1bHRzIHRvIGZhbHNlLgorCisJZXhhbXBsZSAgICAgICAgICAgT3B0aW9uYWwgaW5mb3JtYWwgZGVzY3JpcHRpb24gb2YgYW4KKwkJCSAgZXhhbXBsZSBvZiBhIHVzZSBvZiB0aGlzIHRhZworCisJdGFnLWV4dGVuc2lvbiAgICAgWmVybyBvciBtb3JlIGV4dGVuc2lvbnMgdGhhdCBwcm92aWRlIGV4dHJhCisJCQkgIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgdGFnLCBmb3IgdG9vbAorCQkJICBjb25zdW1wdGlvbgorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisKKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDpncm91cCByZWY9ImoyZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWUiCisJCSAgIHR5cGU9ImoyZWU6dGxkLWNhbm9uaWNhbC1uYW1lVHlwZSIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhZy1jbGFzcyIKKwkJICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KKwk8eHNkOmFubm90YXRpb24+CisJICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgICAgRGVmaW5lcyB0aGUgc3ViY2xhc3Mgb2YgamF2YXguc2VybHZldC5qc3AudGFnZXh0LkpzcFRhZworCSAgICB0aGF0IGltcGxlbWVudHMgdGhlIHJlcXVlc3QgdGltZSBzZW1hbnRpY3MgZm9yCisJICAgIHRoaXMgdGFnLiAocmVxdWlyZWQpCisKKwkgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKworICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0ZWktY2xhc3MiCisJCSAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIj4KKwk8eHNkOmFubm90YXRpb24+CisJICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgICAgRGVmaW5lcyB0aGUgc3ViY2xhc3Mgb2YgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZ0V4dHJhSW5mbworCSAgICBmb3IgdGhpcyB0YWcuIChvcHRpb25hbCkKKworCSAgICBJZiB0aGlzIGlzIG5vdCBnaXZlbiwgdGhlIGNsYXNzIGlzIG5vdCBjb25zdWx0ZWQgYXQKKwkgICAgdHJhbnNsYXRpb24gdGltZS4KKworCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwk8L3hzZDphbm5vdGF0aW9uPgorICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJib2R5LWNvbnRlbnQiCisJCSAgIHR5cGU9ImoyZWU6Ym9keS1jb250ZW50VHlwZSI+CisJPHhzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICAgIFNwZWNpZmllcyB0aGUgZm9ybWF0IGZvciB0aGUgYm9keSBvZiB0aGlzIHRhZy4KKwkgICAgVGhlIGRlZmF1bHQgaW4gSlNQIDEuMiB3YXMgIkpTUCIgYnV0IGJlY2F1c2UgdGhpcworCSAgICBpcyBhbiBpbnZhbGlkIHNldHRpbmcgZm9yIHNpbXBsZSB0YWcgaGFuZGxlcnMsIHRoZXJlCisJICAgIGlzIG5vIGxvbmdlciBhIGRlZmF1bHQgaW4gSlNQIDIuMC4gIEEgcmVhc29uYWJsZQorCSAgICBkZWZhdWx0IGZvciBzaW1wbGUgdGFnIGhhbmRsZXJzIGlzICJzY3JpcHRsZXNzIiBpZgorCSAgICB0aGUgdGFnIGNhbiBoYXZlIGEgYm9keS4KKworCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwk8L3hzZDphbm5vdGF0aW9uPgorICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YXJpYWJsZSIKKwkJICAgdHlwZT0iajJlZTp2YXJpYWJsZVR5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUiCisJCSAgIHR5cGU9ImoyZWU6dGxkLWF0dHJpYnV0ZVR5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkeW5hbWljLWF0dHJpYnV0ZXMiCisJCSAgIHR5cGU9ImoyZWU6Z2VuZXJpYy1ib29sZWFuVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhhbXBsZSIKKwkJICAgdHlwZT0iajJlZTp4c2RTdHJpbmdUeXBlIgorCQkgICBtaW5PY2N1cnM9IjAiPgorCTx4c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgICBUaGUgZXhhbXBsZSBlbGVtZW50IGNvbnRhaW5zIGFuIGluZm9ybWFsIGRlc2NyaXB0aW9uCisJICAgIG9mIGFuIGV4YW1wbGUgb2YgdGhlIHVzZSBvZiBhIHRhZy4KKworCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwk8L3hzZDphbm5vdGF0aW9uPgorCisgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhZy1leHRlbnNpb24iCisJCSAgIHR5cGU9ImoyZWU6dGxkLWV4dGVuc2lvblR5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCIKKwkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorCTx4c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgICBUYWcgZXh0ZW5zaW9ucyBhcmUgZm9yIHRvb2wgdXNlIG9ubHkgYW5kIG11c3Qgbm90IGFmZmVjdAorCSAgICB0aGUgYmVoYXZpb3Igb2YgYSBjb250YWluZXIuCisKKwkgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGxkLWF0dHJpYnV0ZVR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCVRoZSBhdHRyaWJ1dGUgZWxlbWVudCBkZWZpbmVzIGFuIGF0dHJpYnV0ZSBmb3IgdGhlIG5lc3RpbmcKKwl0YWcuICBUaGUgYXR0cmlidXRyZSBlbGVtZW50IG1heSBoYXZlIHNldmVyYWwgc3ViZWxlbWVudHMKKwlkZWZpbmluZzoKKworCWRlc2NyaXB0aW9uICAgICBhIGRlc2NyaXB0aW9uIG9mIHRoZSBhdHRyaWJ1dGUKKworCW5hbWUgICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlCisKKwlyZXF1aXJlZCAgICAgICAgd2hldGhlciB0aGUgYXR0cmlidXRlIGlzIHJlcXVpcmVkIG9yCisJCQlvcHRpb25hbAorCisJcnRleHBydmFsdWUgICAgIHdoZXRoZXIgdGhlIGF0dHJpYnV0ZSBpcyBhIHJ1bnRpbWUgYXR0cmlidXRlCisKKwl0eXBlICAgICAgICAgICAgdGhlIHR5cGUgb2YgdGhlIGF0dHJpYnV0ZXMKKworCWZyYWdtZW50ICAgICAgICB3aGV0aGVyIHRoaXMgYXR0cmlidXRlIGlzIGEgZnJhZ21lbnQKKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCisJCSAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgorCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIKKwkJICAgdHlwZT0iajJlZTpqYXZhLWlkZW50aWZpZXJUeXBlIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVxdWlyZWQiCisJCSAgIHR5cGU9ImoyZWU6Z2VuZXJpYy1ib29sZWFuVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIj4KKwk8eHNkOmFubm90YXRpb24+CisJICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgICAgRGVmaW5lcyBpZiB0aGUgbmVzdGluZyBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQgb3IKKwkgICAgb3B0aW9uYWwuCisKKwkgICAgSWYgbm90IHByZXNlbnQgdGhlbiB0aGUgZGVmYXVsdCBpcyAiZmFsc2UiLCBpLmUKKwkgICAgdGhlIGF0dHJpYnV0ZSBpcyBvcHRpb25hbC4KKworCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwk8L3hzZDphbm5vdGF0aW9uPgorICAgICAgPC94c2Q6ZWxlbWVudD4KKworICAgICAgPHhzZDpjaG9pY2U+CisJPHhzZDpzZXF1ZW5jZT4KKwkgIDx4c2Q6ZWxlbWVudCBuYW1lPSJydGV4cHJ2YWx1ZSIKKwkJICAgICAgIHR5cGU9ImoyZWU6Z2VuZXJpYy1ib29sZWFuVHlwZSIKKwkJICAgICAgIG1pbk9jY3Vycz0iMCI+CisJICAgIDx4c2Q6YW5ub3RhdGlvbj4KKwkgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwkJRGVmaW5lcyBpZiB0aGUgbmVzdGluZyBhdHRyaWJ1dGUgY2FuIGhhdmUgc2NyaXB0bGV0CisJCWV4cHJlc3Npb25zIGFzIGEgdmFsdWUsIGkuZSB0aGUgdmFsdWUgb2YgdGhlCisJCWF0dHJpYnV0ZSBtYXkgYmUgZHluYW1pY2FsbHkgY2FsY3VsYXRlZCBhdCByZXF1ZXN0CisJCXRpbWUsIGFzIG9wcG9zZWQgdG8gYSBzdGF0aWMgdmFsdWUgZGV0ZXJtaW5lZCBhdAorCQl0cmFuc2xhdGlvbiB0aW1lLgorCisJCUlmIG5vdCBwcmVzZW50IHRoZW4gdGhlIGRlZmF1bHQgaXMgImZhbHNlIiwgaS5lIHRoZQorCQlhdHRyaWJ1dGUgaGFzIGEgc3RhdGljIHZhbHVlCisKKwkgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCSAgICA8L3hzZDphbm5vdGF0aW9uPgorCisJICA8L3hzZDplbGVtZW50PgorCSAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUiCisJCSAgICAgICB0eXBlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiCisJCSAgICAgICBtaW5PY2N1cnM9IjAiPgorCSAgICA8eHNkOmFubm90YXRpb24+CisJICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJCURlZmluZXMgdGhlIEphdmEgdHlwZSBvZiB0aGUgYXR0cmlidXRlcyB2YWx1ZS4gIEZvcgorCQlzdGF0aWMgdmFsdWVzICh0aG9zZSBkZXRlcm1pbmVkIGF0IHRyYW5zbGF0aW9uIHRpbWUpCisJCXRoZSB0eXBlIGlzIGFsd2F5cyBqYXZhLmxhbmcuU3RyaW5nLgorCisJICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwkgICAgPC94c2Q6YW5ub3RhdGlvbj4KKwkgIDwveHNkOmVsZW1lbnQ+CisJPC94c2Q6c2VxdWVuY2U+CisJPHhzZDplbGVtZW50IG5hbWU9ImZyYWdtZW50IgorCQkgICAgIHR5cGU9ImoyZWU6Z2VuZXJpYy1ib29sZWFuVHlwZSIKKwkJICAgICBtaW5PY2N1cnM9IjAiPgorCSAgPHhzZDphbm5vdGF0aW9uPgorCSAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgICAgICAidHJ1ZSIgaWYgdGhpcyBhdHRyaWJ1dGUgaXMgb2YgdHlwZQorCSAgICAgIGphdmF4LmpzcC50YWdleHQuSnNwRnJhZ21lbnQsIHJlcHJlc2VudGluZyBkeW5hbWljCisJICAgICAgY29udGVudCB0aGF0IGNhbiBiZSByZS1ldmFsdWF0ZWQgYXMgbWFueSB0aW1lcworCSAgICAgIGFzIG5lZWRlZCBieSB0aGUgdGFnIGhhbmRsZXIuICBJZiBvbWl0dGVkIG9yICJmYWxzZSIsCisJICAgICAgdGhlIGRlZmF1bHQgaXMgc3RpbGwgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKworCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCSAgPC94c2Q6YW5ub3RhdGlvbj4KKwk8L3hzZDplbGVtZW50PgorICAgICAgPC94c2Q6Y2hvaWNlPgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRsZC1jYW5vbmljYWwtbmFtZVR5cGUiPgorCisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJRGVmaW5lcyB0aGUgY2Fub25pY2FsIG5hbWUgb2YgYSB0YWcgb3IgYXR0cmlidXRlIGJlaW5nCisJZGVmaW5lZC4KKworCVRoZSBuYW1lIG11c3QgY29uZm9ybSB0byB0aGUgbGV4aWNhbCBydWxlcyBmb3IgYW4gTk1UT0tFTi4KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorCisgICAgPHhzZDpzaW1wbGVDb250ZW50PgorICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnhzZE5NVE9LRU5UeXBlIi8+CisgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRsZC1leHRlbnNpb25UeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwlUaGUgdGxkLWV4dGVuc2lvblR5cGUgaXMgdXNlZCB0byBpbmRpY2F0ZQorCWV4dGVuc2lvbnMgdG8gYSBzcGVjaWZpYyBUTEQgZWxlbWVudC4KKworCUl0IGlzIHVzZWQgYnkgZWxlbWVudHMgdG8gZGVzaWduYXRlIGFuIGV4dGVuc2lvbiBibG9jaworCXRoYXQgaXMgdGFyZ2V0ZWQgdG8gYSBzcGVjaWZpYyBleHRlbnNpb24gZGVzaWduYXRlZCBieQorCWEgc2V0IG9mIGV4dGVuc2lvbiBlbGVtZW50cyB0aGF0IGFyZSBkZWNsYXJlZCBieSBhCisJbmFtZXNwYWNlLiBUaGUgbmFtZXNwYWNlIGlkZW50aWZpZXMgdGhlIGV4dGVuc2lvbiB0bworCXRoZSB0b29sIHRoYXQgcHJvY2Vzc2VzIHRoZSBleHRlbnNpb24uCisKKwlUaGUgdHlwZSBvZiB0aGUgZXh0ZW5zaW9uLWVsZW1lbnQgaXMgYWJzdHJhY3QuIFRoZXJlZm9yZSwKKwlhIGNvbmNyZXRlIHR5cGUgbXVzdCBiZSBzcGVjaWZpZWQgYnkgdGhlIFRMRCB1c2luZworCXhzaTp0eXBlIGF0dHJpYnV0ZSBmb3IgZWFjaCBleHRlbnNpb24tZWxlbWVudC4KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorCisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24tZWxlbWVudCIKKwkJICAgdHlwZT0iajJlZTpleHRlbnNpYmxlVHlwZSIKKwkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKworICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZSIKKwkJICAgdXNlPSJyZXF1aXJlZCIKKwkJICAgdHlwZT0ieHNkOmFueVVSSSIvPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KKworICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGxkVGFnbGliVHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJVGhlIHRhZ2xpYiB0YWcgaXMgdGhlIGRvY3VtZW50IHJvb3QsIGl0IGRlZmluZXM6CisKKwlkZXNjcmlwdGlvbiAgICAgYSBzaW1wbGUgc3RyaW5nIGRlc2NyaWJpbmcgdGhlICJ1c2UiIG9mIHRoaXMKKwkJCXRhZ2xpYiwgc2hvdWxkIGJlIHVzZXIgZGlzY2VybmFibGUKKworCWRpc3BsYXktbmFtZSAgICB0aGUgZGlzcGxheS1uYW1lIGVsZW1lbnQgY29udGFpbnMgYQorCQkJc2hvcnQgbmFtZSB0aGF0IGlzIGludGVuZGVkIHRvIGJlIGRpc3BsYXllZAorCQkJYnkgdG9vbHMKKworCWljb24gICAgICAgICAgICBvcHRpb25hbCBpY29uIHRoYXQgY2FuIGJlIHVzZWQgYnkgdG9vbHMKKworCXRsaWItdmVyc2lvbiAgICB0aGUgdmVyc2lvbiBvZiB0aGUgdGFnIGxpYnJhcnkgaW1wbGVtZW50YXRpb24KKworCXNob3J0LW5hbWUgICAgICBhIHNpbXBsZSBkZWZhdWx0IHNob3J0IG5hbWUgdGhhdCBjb3VsZCBiZQorCQkJdXNlZCBieSBhIEpTUCBhdXRob3JpbmcgdG9vbCB0byBjcmVhdGUKKwkJCW5hbWVzIHdpdGggYSBtbmVtb25pYyB2YWx1ZTsgZm9yIGV4YW1wbGUsCisJCQl0aGUgaXQgbWF5IGJlIHVzZWQgYXMgdGhlIHByZWZlcmVkIHByZWZpeAorCQkJdmFsdWUgaW4gdGFnbGliIGRpcmVjdGl2ZXMKKworCXVyaSAgICAgICAgICAgICBhIHVyaSB1bmlxdWVseSBpZGVudGlmeWluZyB0aGlzIHRhZ2xpYgorCisJdmFsaWRhdG9yICAgICAgIG9wdGlvbmFsIFRhZ0xpYnJhcnlWYWxpZGF0b3IgaW5mb3JtYXRpb24KKworCWxpc3RlbmVyICAgICAgICBvcHRpb25hbCBldmVudCBsaXN0ZW5lciBzcGVjaWZpY2F0aW9uCisKKwl0YWcgICAgICAgICAgICAgdGFncyBpbiB0aGlzIHRhZyBsaWJyYXJ5CisKKwl0YWctZmlsZSAgICAgICAgdGFnIGZpbGVzIGluIHRoaXMgdGFnIGxpYnJhcnkKKworCWZ1bmN0aW9uICAgICAgICB6ZXJvIG9yIG1vcmUgRUwgZnVuY3Rpb25zIGRlZmluZWQgaW4gdGhpcworCQkJdGFnIGxpYnJhcnkKKworCXRhZ2xpYi1leHRlbnNpb24gemVybyBvciBtb3JlIGV4dGVuc2lvbnMgdGhhdCBwcm92aWRlIGV4dHJhCisJCQlpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHRhZ2xpYiwgZm9yIHRvb2wKKwkJCWNvbnN1bXB0aW9uCisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDpncm91cCByZWY9ImoyZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRsaWItdmVyc2lvbiIKKwkJICAgdHlwZT0iajJlZTpkZXdleS12ZXJzaW9uVHlwZSI+CisJPHhzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICAgIERlc2NyaWJlcyB0aGlzIHZlcnNpb24gKG51bWJlcikgb2YgdGhlIHRhZ2xpYnJhcnkuCisJICAgIEl0IGlzIGRlc2NyaWJlZCBhcyBhIGRld2V5IGRlY2ltYWwuCisKKwkgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKworICAgICAgPC94c2Q6ZWxlbWVudD4KKworICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNob3J0LW5hbWUiCisJCSAgIHR5cGU9ImoyZWU6dGxkLWNhbm9uaWNhbC1uYW1lVHlwZSI+CisJPHhzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICAgIERlZmluZXMgYSBzaW1wbGUgZGVmYXVsdCBuYW1lIHRoYXQgY291bGQgYmUgdXNlZCBieQorCSAgICBhIEpTUCBhdXRob3JpbmcgdG9vbCB0byBjcmVhdGUgbmFtZXMgd2l0aCBhCisJICAgIG1uZW1vbmljdmFsdWU7IGZvciBleGFtcGxlLCBpdCBtYXkgYmUgdXNlZCBhcyB0aGUKKwkgICAgcHJlZmVycmVkIHByZWZpeCB2YWx1ZSBpbiB0YWdsaWIgZGlyZWN0aXZlcy4gIERvCisJICAgIG5vdCB1c2Ugd2hpdGUgc3BhY2UsIGFuZCBkbyBub3Qgc3RhcnQgd2l0aCBkaWdpdHMKKwkgICAgb3IgdW5kZXJzY29yZS4KKworCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwk8L3hzZDphbm5vdGF0aW9uPgorCisgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVyaSIKKwkJICAgdHlwZT0iajJlZTp4c2RBbnlVUklUeXBlIgorCQkgICBtaW5PY2N1cnM9IjAiPgorCTx4c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgICBEZWZpbmVzIGEgcHVibGljIFVSSSB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhpcworCSAgICB2ZXJzaW9uIG9mIHRoZSB0YWdsaWJyYXJ5LiAgTGVhdmUgaXQgZW1wdHkgaWYgaXQKKwkgICAgZG9lcyBub3QgYXBwbHkuCisKKwkgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKworICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWxpZGF0b3IiCisJCSAgIHR5cGU9ImoyZWU6dmFsaWRhdG9yVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIj4KKyAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibGlzdGVuZXIiCisJCSAgIHR5cGU9ImoyZWU6bGlzdGVuZXJUeXBlIgorCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKyAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFnIgorCQkgICB0eXBlPSJqMmVlOnRhZ1R5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCIKKwkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWctZmlsZSIKKwkJICAgdHlwZT0iajJlZTp0YWdGaWxlVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIgorCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZ1bmN0aW9uIgorCQkgICB0eXBlPSJqMmVlOmZ1bmN0aW9uVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIgorCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhZ2xpYi1leHRlbnNpb24iCisJCSAgIHR5cGU9ImoyZWU6dGxkLWV4dGVuc2lvblR5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCIKKwkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorCTx4c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgICBUYWdsaWIgZXh0ZW5zaW9ucyBhcmUgZm9yIHRvb2wgdXNlIG9ubHkgYW5kIG11c3Qgbm90IGFmZmVjdAorCSAgICB0aGUgYmVoYXZpb3Igb2YgYSBjb250YWluZXIuCisKKwkgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIKKwkJICAgdHlwZT0iajJlZTpkZXdleS12ZXJzaW9uVHlwZSIKKwkJICAgZml4ZWQ9IjIuMCIKKwkJICAgdXNlPSJyZXF1aXJlZCI+CisgICAgICA8eHNkOmFubm90YXRpb24+CisJPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICBEZXNjcmliZXMgdGhlIEpTUCB2ZXJzaW9uIChudW1iZXIpIHRoaXMgdGFnbGlicmFyeQorCSAgcmVxdWlyZXMgaW4gb3JkZXIgdG8gZnVuY3Rpb24gKGRld2V5IGRlY2ltYWwpCisKKwk8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KKworICAgIDwveHNkOmF0dHJpYnV0ZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ2YWxpZGF0b3JUeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwlBIHZhbGlkYXRvciB0aGF0IGNhbiBiZSB1c2VkIHRvIHZhbGlkYXRlCisJdGhlIGNvbmZvcm1hbmNlIG9mIGEgSlNQIHBhZ2UgdG8gdXNpbmcgdGhpcyB0YWcgbGlicmFyeSBpcworCWRlZmluZWQgYnkgYSB2YWxpZGF0b3JUeXBlLgorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisKKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgorCQkgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIgorCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhbGlkYXRvci1jbGFzcyIKKwkJICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KKwk8eHNkOmFubm90YXRpb24+CisJICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgICAgRGVmaW5lcyB0aGUgVGFnTGlicmFyeVZhbGlkYXRvciBjbGFzcyB0aGF0IGNhbiBiZSB1c2VkCisJICAgIHRvIHZhbGlkYXRlIHRoZSBjb25mb3JtYW5jZSBvZiBhIEpTUCBwYWdlIHRvIHVzaW5nIHRoaXMKKwkgICAgdGFnIGxpYnJhcnkuCisKKwkgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5pdC1wYXJhbSIKKwkJICAgdHlwZT0iajJlZTpwYXJhbS12YWx1ZVR5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorCTx4c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgICBUaGUgaW5pdC1wYXJhbSBlbGVtZW50IGNvbnRhaW5zIGEgbmFtZS92YWx1ZSBwYWlyIGFzIGFuCisJICAgIGluaXRpYWxpemF0aW9uIHBhcmFtLgorCisJICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCTwveHNkOmFubm90YXRpb24+CisKKyAgICAgIDwveHNkOmVsZW1lbnQ+CisKKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ2YXJpYWJsZS1zY29wZVR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCVRoaXMgdHlwZSBkZWZpbmVzIHNjb3BlIG9mIHRoZSBzY3JpcHRpbmcgdmFyaWFibGUuICBTZWUKKwlUYWdFeHRyYUluZm8gZm9yIGRldGFpbHMuICBUaGUgYWxsb3dlZCB2YWx1ZXMgYXJlLAorCSJORVNURUQiLCAiQVRfQkVHSU4iIGFuZCAiQVRfRU5EIi4KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorCisgICAgPHhzZDpzaW1wbGVDb250ZW50PgorICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+CisJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkVTVEVEIi8+CisJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVRfQkVHSU4iLz4KKwk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVF9FTkQiLz4KKyAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ2YXJpYWJsZVR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCVRoZSB2YXJpYWJsZVR5cGUgcHJvdmlkZXMgaW5mb3JtYXRpb24gb24gdGhlIHNjcmlwdGluZworCXZhcmlhYmxlcyBkZWZpbmVkIGJ5IHVzaW5nIHRoaXMgdGFnLiAgSXQgaXMgYSAodHJhbnNsYXRpb24KKwl0aW1lKSBlcnJvciBmb3IgYSB0YWcgdGhhdCBoYXMgb25lIG9yIG1vcmUgdmFyaWFibGUKKwlzdWJlbGVtZW50cyB0byBoYXZlIGEgVGFnRXh0cmFJbmZvIGNsYXNzIHRoYXQgcmV0dXJucyBhCisJbm9uLW51bGwgdmFsdWUgZnJvbSBhIGNhbGwgdG8gZ2V0VmFyaWFibGVJbmZvKCkuCisKKwlUaGUgc3ViZWxlbWVudHMgb2YgdmFyaWFibGVUeXBlIGFyZSBvZiB0aGUgZm9ybToKKworCWRlc2NyaXB0aW9uICAgICAgICAgICAgICBPcHRpb25hbCBkZXNjcmlwdGlvbiBvZiB0aGlzCisJCQkJIHZhcmlhYmxlCisKKwluYW1lLWdpdmVuICAgICAgICAgICAgICAgVGhlIHZhcmlhYmxlIG5hbWUgYXMgYSBjb25zdGFudAorCisJbmFtZS1mcm9tLWF0dHJpYnV0ZSAgICAgIFRoZSBuYW1lIG9mIGFuIGF0dHJpYnV0ZSB3aG9zZQorCQkJCSAodHJhbnNsYXRpb24gdGltZSkgdmFsdWUgd2lsbAorCQkJCSBnaXZlIHRoZSBuYW1lIG9mIHRoZQorCQkJCSB2YXJpYWJsZS4gIE9uZSBvZiBuYW1lLWdpdmVuIG9yCisJCQkJIG5hbWUtZnJvbS1hdHRyaWJ1dGUgaXMgcmVxdWlyZWQuCisKKwl2YXJpYWJsZS1jbGFzcyAgICAgICAgICAgTmFtZSBvZiB0aGUgY2xhc3Mgb2YgdGhlIHZhcmlhYmxlLgorCQkJCSBqYXZhLmxhbmcuU3RyaW5nIGlzIGRlZmF1bHQuCisKKwlkZWNsYXJlICAgICAgICAgICAgICAgICAgV2hldGhlciB0aGUgdmFyaWFibGUgaXMgZGVjbGFyZWQKKwkJCQkgb3Igbm90LiAgVHJ1ZSBpcyB0aGUgZGVmYXVsdC4KKworCXNjb3BlICAgICAgICAgICAgICAgICAgICBUaGUgc2NvcGUgb2YgdGhlIHNjcmlwdGluZyB2YXJhaWJsZQorCQkJCSBkZWZpbmVkLiAgTkVTVEVEIGlzIGRlZmF1bHQuCisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKworICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCisJCSAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgorCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmNob2ljZT4KKwk8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZS1naXZlbiIKKwkJICAgICB0eXBlPSJqMmVlOmphdmEtaWRlbnRpZmllclR5cGUiPgorCSAgPHhzZDphbm5vdGF0aW9uPgorCSAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgICAgICBUaGUgbmFtZSBmb3IgdGhlIHNjcmlwdGluZyB2YXJpYWJsZS4KKworCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCSAgPC94c2Q6YW5ub3RhdGlvbj4KKwk8L3hzZDplbGVtZW50PgorCisJPHhzZDplbGVtZW50IG5hbWU9Im5hbWUtZnJvbS1hdHRyaWJ1dGUiCisJCSAgICAgdHlwZT0iajJlZTpqYXZhLWlkZW50aWZpZXJUeXBlIj4KKwkgIDx4c2Q6YW5ub3RhdGlvbj4KKwkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICAgICAgVGhlIG5hbWUgb2YgYW4gYXR0cmlidXRlIHdob3NlCisJICAgICAgKHRyYW5zbGF0aW9uLXRpbWUpIHZhbHVlIHdpbGwgZ2l2ZSB0aGUgbmFtZSBvZgorCSAgICAgIHRoZSB2YXJpYWJsZS4KKworCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCSAgPC94c2Q6YW5ub3RhdGlvbj4KKwk8L3hzZDplbGVtZW50PgorICAgICAgPC94c2Q6Y2hvaWNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhcmlhYmxlLWNsYXNzIgorCQkgICB0eXBlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCI+CisJPHhzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICAgIFRoZSBvcHRpb25hbCBuYW1lIG9mIHRoZSBjbGFzcyBmb3IgdGhlIHNjcmlwdGluZworCSAgICB2YXJpYWJsZS4gIFRoZSBkZWZhdWx0IGlzIGphdmEubGFuZy5TdHJpbmcuCisKKwkgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKworICAgICAgPC94c2Q6ZWxlbWVudD4KKworICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlY2xhcmUiCisJCSAgIHR5cGU9ImoyZWU6Z2VuZXJpYy1ib29sZWFuVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIj4KKworCTx4c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgICBXaGV0aGVyIHRoZSBzY3JpcHRpbmcgdmFyaWFibGUgaXMgdG8gYmUgZGVmaW5lZAorCSAgICBvciBub3QuICBTZWUgVGFnRXh0cmFJbmZvIGZvciBkZXRhaWxzLiAgVGhpcworCSAgICBlbGVtZW50IGlzIG9wdGlvbmFsIGFuZCAidHJ1ZSIgaXMgdGhlIGRlZmF1bHQuCisKKwkgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2NvcGUiCisJCSAgIHR5cGU9ImoyZWU6dmFyaWFibGUtc2NvcGVUeXBlIgorCQkgICBtaW5PY2N1cnM9IjAiPgorCTx4c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgICBUaGUgZWxlbWVudCBpcyBvcHRpb25hbCBhbmQgIk5FU1RFRCIgaXMgdGhlIGRlZmF1bHQuCisKKwkgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPC94c2Q6c2NoZW1hPgorCmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvRXJyb3JEYXRhLmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvRXJyb3JEYXRhLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM2YzA3MwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC9FcnJvckRhdGEuamF2YQpAQCAtMCwwICsxLDg4IEBACisvKgorKiBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovIAorcGFja2FnZSBqYXZheC5zZXJ2bGV0LmpzcDsKKworLyoqCisgKiBDb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhbiBlcnJvciwgZm9yIGVycm9yIHBhZ2VzLgorICogVGhlIGluZm9ybWF0aW9uIGNvbnRhaW5lZCBpbiB0aGlzIGluc3RhbmNlIGlzIG1lYW5pbmdsZXNzIGlmIG5vdCB1c2VkCisgKiBpbiB0aGUgY29udGV4dCBvZiBhbiBlcnJvciBwYWdlLiAgVG8gaW5kaWNhdGUgYSBKU1AgaXMgYW4gZXJyb3IgcGFnZSwKKyAqIHRoZSBwYWdlIGF1dGhvciBtdXN0IHNldCB0aGUgaXNFcnJvclBhZ2UgYXR0cmlidXRlIG9mIHRoZSBwYWdlIGRpcmVjdGl2ZQorICogdG8gInRydWUiLgorICoKKyAqIEBzZWUgUGFnZUNvbnRleHQjZ2V0RXJyb3JEYXRhCisgKiBAc2luY2UgMi4wCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIEVycm9yRGF0YSB7CisKKyAgICBwcml2YXRlIFRocm93YWJsZSB0aHJvd2FibGU7CisgICAgcHJpdmF0ZSBpbnQgc3RhdHVzQ29kZTsKKyAgICBwcml2YXRlIFN0cmluZyB1cmk7CisgICAgcHJpdmF0ZSBTdHJpbmcgc2VydmxldE5hbWU7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IEVycm9yRGF0YSBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGhyb3dhYmxlIFRoZSBUaHJvd2FibGUgdGhhdCBpcyB0aGUgY2F1c2Ugb2YgdGhlIGVycm9yCisgICAgICogQHBhcmFtIHN0YXR1c0NvZGUgVGhlIHN0YXR1cyBjb2RlIG9mIHRoZSBlcnJvcgorICAgICAqIEBwYXJhbSB1cmkgVGhlIHJlcXVlc3QgVVJJCisgICAgICogQHBhcmFtIHNlcnZsZXROYW1lIFRoZSBuYW1lIG9mIHRoZSBzZXJ2bGV0IGludm9rZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgRXJyb3JEYXRhKCBUaHJvd2FibGUgdGhyb3dhYmxlLCBpbnQgc3RhdHVzQ29kZSwgU3RyaW5nIHVyaSwgCisJU3RyaW5nIHNlcnZsZXROYW1lICkKKyAgICB7CisJdGhpcy50aHJvd2FibGUgPSB0aHJvd2FibGU7CisJdGhpcy5zdGF0dXNDb2RlID0gc3RhdHVzQ29kZTsKKwl0aGlzLnVyaSA9IHVyaTsKKwl0aGlzLnNlcnZsZXROYW1lID0gc2VydmxldE5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgVGhyb3dhYmxlIHRoYXQgY2F1c2VkIHRoZSBlcnJvci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIFRocm93YWJsZSB0aGF0IGNhdXNlZCB0aGUgZXJyb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgVGhyb3dhYmxlIGdldFRocm93YWJsZSgpIHsKKwlyZXR1cm4gdGhpcy50aHJvd2FibGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc3RhdHVzIGNvZGUgb2YgdGhlIGVycm9yLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgc3RhdHVzIGNvZGUgb2YgdGhlIGVycm9yCisgICAgICovCisgICAgcHVibGljIGludCBnZXRTdGF0dXNDb2RlKCkgeworCXJldHVybiB0aGlzLnN0YXR1c0NvZGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgcmVxdWVzdCBVUkkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSByZXF1ZXN0IFVSSQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVxdWVzdFVSSSgpIHsKKwlyZXR1cm4gdGhpcy51cmk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgc2VydmxldCBpbnZva2VkLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgbmFtZSBvZiB0aGUgc2VydmxldCBpbnZva2VkCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTZXJ2bGV0TmFtZSgpIHsKKwlyZXR1cm4gdGhpcy5zZXJ2bGV0TmFtZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvSHR0cEpzcFBhZ2UuamF2YSBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC9IdHRwSnNwUGFnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwY2QxNDcKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvSHR0cEpzcFBhZ2UuamF2YQpAQCAtMCwwICsxLDU3IEBACisvKgorKiBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisgCitwYWNrYWdlIGphdmF4LnNlcnZsZXQuanNwOworCitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKy8qKgorICogVGhlIEh0dHBKc3BQYWdlIGludGVyZmFjZSBkZXNjcmliZXMgdGhlIGludGVyYWN0aW9uIHRoYXQgYSBKU1AgUGFnZQorICogSW1wbGVtZW50YXRpb24gQ2xhc3MgbXVzdCBzYXRpc2Z5IHdoZW4gdXNpbmcgdGhlIEhUVFAgcHJvdG9jb2wuCisgKgorICogPHA+CisgKiBUaGUgYmVoYXZpb3VyIGlzIGlkZW50aWNhbCB0byB0aGF0IG9mIHRoZSBKc3BQYWdlLCBleGNlcHQgZm9yIHRoZSBzaWduYXR1cmUKKyAqIG9mIHRoZSBfanNwU2VydmljZSBtZXRob2QsIHdoaWNoIGlzIG5vdyBleHByZXNzaWJsZSBpbiB0aGUgSmF2YSB0eXBlCisgKiBzeXN0ZW0gYW5kIGluY2x1ZGVkIGV4cGxpY2l0bHkgaW4gdGhlIGludGVyZmFjZS4KKyAqIAorICogQHNlZSBKc3BQYWdlCisgKi8KKworcHVibGljIGludGVyZmFjZSBIdHRwSnNwUGFnZSBleHRlbmRzIEpzcFBhZ2UgeworCisgICAgLyoqIFRoZSBfanNwU2VydmljZSgpbWV0aG9kIGNvcnJlc3BvbmRzIHRvIHRoZSBib2R5IG9mIHRoZSBKU1AgcGFnZS4gVGhpcworICAgICAqIG1ldGhvZCBpcyBkZWZpbmVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIEpTUCBjb250YWluZXIgYW5kIHNob3VsZCBuZXZlcgorICAgICAqIGJlIGRlZmluZWQgYnkgdGhlIEpTUCBwYWdlIGF1dGhvci4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiBhIHN1cGVyY2xhc3MgaXMgc3BlY2lmaWVkIHVzaW5nIHRoZSBleHRlbmRzIGF0dHJpYnV0ZSwgdGhhdAorICAgICAqIHN1cGVyY2xhc3MgbWF5IGNob29zZSB0byBwZXJmb3JtIHNvbWUgYWN0aW9ucyBpbiBpdHMgc2VydmljZSgpIG1ldGhvZAorICAgICAqIGJlZm9yZSBvciBhZnRlciBjYWxsaW5nIHRoZSBfanNwU2VydmljZSgpIG1ldGhvZC4gIFNlZSB1c2luZyB0aGUgZXh0ZW5kcworICAgICAqIGF0dHJpYnV0ZSBpbiB0aGUgSlNQX0VuZ2luZSBjaGFwdGVyIG9mIHRoZSBKU1Agc3BlY2lmaWNhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFByb3ZpZGVzIGNsaWVudCByZXF1ZXN0IGluZm9ybWF0aW9uIHRvIHRoZSBKU1AuCisgICAgICogQHBhcmFtIHJlc3BvbnNlIEFzc2lzdHMgdGhlIEpTUCBpbiBzZW5kaW5nIGEgcmVzcG9uc2UgdG8gdGhlIGNsaWVudC4KKyAgICAgKiBAdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24gVGhyb3duIGlmIGFuIGVycm9yIG9jY3VycmVkIGR1cmluZyB0aGUgCisgICAgICogICAgIHByb2Nlc3Npbmcgb2YgdGhlIEpTUCBhbmQgdGhhdCB0aGUgY29udGFpbmVyIHNob3VsZCB0YWtlIAorICAgICAqICAgICBhcHByb3ByaWF0ZSBhY3Rpb24gdG8gY2xlYW4gdXAgdGhlIHJlcXVlc3QuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBUaHJvd24gaWYgYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgd3JpdGluZyB0aGUKKyAgICAgKiAgICAgcmVzcG9uc2UgZm9yIHRoaXMgcGFnZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBfanNwU2VydmljZShIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC9Kc3BDb250ZXh0LmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvSnNwQ29udGV4dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwMmVkMzEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvSnNwQ29udGV4dC5qYXZhCkBAIC0wLDAgKzEsMjcwIEBACisvKgorKiBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovIAorcGFja2FnZSBqYXZheC5zZXJ2bGV0LmpzcDsKKworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLmVsLkV4cHJlc3Npb25FdmFsdWF0b3I7CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AuZWwuVmFyaWFibGVSZXNvbHZlcjsKKworLyoqCisgKiA8cD4KKyAqIDxjb2RlPkpzcENvbnRleHQ8L2NvZGU+IHNlcnZlcyBhcyB0aGUgYmFzZSBjbGFzcyBmb3IgdGhlIAorICogUGFnZUNvbnRleHQgY2xhc3MgYW5kIGFic3RyYWN0cyBhbGwgaW5mb3JtYXRpb24gdGhhdCBpcyBub3Qgc3BlY2lmaWMKKyAqIHRvIHNlcnZsZXRzLiAgVGhpcyBhbGxvd3MgZm9yIFNpbXBsZSBUYWcgRXh0ZW5zaW9ucyB0byBiZSB1c2VkCisgKiBvdXRzaWRlIG9mIHRoZSBjb250ZXh0IG9mIGEgcmVxdWVzdC9yZXNwb25zZSBTZXJ2bGV0LgorICogPHA+CisgKiBUaGUgSnNwQ29udGV4dCBwcm92aWRlcyBhIG51bWJlciBvZiBmYWNpbGl0aWVzIHRvIHRoZSAKKyAqIHBhZ2UvY29tcG9uZW50IGF1dGhvciBhbmQgcGFnZSBpbXBsZW1lbnRvciwgaW5jbHVkaW5nOgorICogPHVsPgorICogPGxpPmEgc2luZ2xlIEFQSSB0byBtYW5hZ2UgdGhlIHZhcmlvdXMgc2NvcGVkIG5hbWVzcGFjZXMKKyAqIDxsaT5hIG1lY2hhbmlzbSB0byBvYnRhaW4gdGhlIEpzcFdyaXRlciBmb3Igb3V0cHV0CisgKiA8bGk+YSBtZWNoYW5pc20gdG8gZXhwb3NlIHBhZ2UgZGlyZWN0aXZlIGF0dHJpYnV0ZXMgdG8gdGhlIAorICogICAgIHNjcmlwdGluZyBlbnZpcm9ubWVudAorICogPC91bD4KKyAqCisgKiA8cD48Qj5NZXRob2RzIEludGVuZGVkIGZvciBDb250YWluZXIgR2VuZXJhdGVkIENvZGU8L0I+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgbWV0aG9kcyBlbmFibGUgdGhlIDxCPm1hbmFnZW1lbnQgb2YgbmVzdGVkPC9CPiBKc3BXcml0ZXIgCisgKiBzdHJlYW1zIHRvIGltcGxlbWVudCBUYWcgRXh0ZW5zaW9uczogPGNvZGU+cHVzaEJvZHkoKTwvY29kZT4gYW5kCisgKiA8Y29kZT5wb3BCb2R5KCk8L2NvZGU+CisgKgorICogPHA+PEI+TWV0aG9kcyBJbnRlbmRlZCBmb3IgSlNQIGF1dGhvcnM8L0I+CisgKiA8cD4KKyAqIFNvbWUgbWV0aG9kcyBwcm92aWRlIDxCPnVuaWZvcm0gYWNjZXNzPC9CPiB0byB0aGUgZGl2ZXJzZSBvYmplY3RzCisgKiByZXByZXNlbnRpbmcgc2NvcGVzLgorICogVGhlIGltcGxlbWVudGF0aW9uIG11c3QgdXNlIHRoZSB1bmRlcmx5aW5nIG1hY2hpbmVyeQorICogY29ycmVzcG9uZGluZyB0byB0aGF0IHNjb3BlLCBzbyBpbmZvcm1hdGlvbiBjYW4gYmUgcGFzc2VkIGJhY2sgYW5kCisgKiBmb3J0aCBiZXR3ZWVuIHRoZSB1bmRlcmx5aW5nIGVudmlyb25tZW50IChlLmcuIFNlcnZsZXRzKSBhbmQgSlNQIHBhZ2VzLgorICogVGhlIG1ldGhvZHMgYXJlOgorICogPGNvZGU+c2V0QXR0cmlidXRlKCk8L2NvZGU+LCAgPGNvZGU+Z2V0QXR0cmlidXRlKCk8L2NvZGU+LAorICogPGNvZGU+ZmluZEF0dHJpYnV0ZSgpPC9jb2RlPiwgIDxjb2RlPnJlbW92ZUF0dHJpYnV0ZSgpPC9jb2RlPiwKKyAqIDxjb2RlPmdldEF0dHJpYnV0ZXNTY29wZSgpPC9jb2RlPiBhbmQgCisgKiA8Y29kZT5nZXRBdHRyaWJ1dGVOYW1lc0luU2NvcGUoKTwvY29kZT4uCisgKiAKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBtZXRob2RzIHByb3ZpZGUgPEI+Y29udmVuaWVudCBhY2Nlc3M8L0I+IHRvIGltcGxpY2l0IG9iamVjdHM6CisgKiA8Y29kZT5nZXRPdXQoKTwvY29kZT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgbWV0aG9kcyBwcm92aWRlIDxCPnByb2dyYW1tYXRpYyBhY2Nlc3M8L2I+IHRvIHRoZSAKKyAqIEV4cHJlc3Npb24gTGFuZ3VhZ2UgZXZhbHVhdG9yOgorICogPGNvZGU+Z2V0RXhwcmVzc2lvbkV2YWx1YXRvcigpPC9jb2RlPiwgPGNvZGU+Z2V0VmFyaWFibGVSZXNvbHZlcigpPC9jb2RlPgorICoKKyAqIEBzaW5jZSAyLjAKKyAqLworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgSnNwQ29udGV4dCB7CisKKyAgICAvKioKKyAgICAgKiBTb2xlIGNvbnN0cnVjdG9yLiAoRm9yIGludm9jYXRpb24gYnkgc3ViY2xhc3MgY29uc3RydWN0b3JzLCAKKyAgICAgKiB0eXBpY2FsbHkgaW1wbGljaXQuKQorICAgICAqLworICAgIHB1YmxpYyBKc3BDb250ZXh0KCkgeworICAgIH0KKyAgICAKKyAgICAvKiogCisgICAgICogUmVnaXN0ZXIgdGhlIG5hbWUgYW5kIHZhbHVlIHNwZWNpZmllZCB3aXRoIHBhZ2Ugc2NvcGUgc2VtYW50aWNzLgorICAgICAqIElmIHRoZSB2YWx1ZSBwYXNzZWQgaW4gaXMgPGNvZGU+bnVsbDwvY29kZT4sIHRoaXMgaGFzIHRoZSBzYW1lIAorICAgICAqIGVmZmVjdCBhcyBjYWxsaW5nIAorICAgICAqIDxjb2RlPnJlbW92ZUF0dHJpYnV0ZSggbmFtZSwgUGFnZUNvbnRleHQuUEFHRV9TQ09QRSApPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdG8gc2V0CisgICAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byBhc3NvY2lhdGUgd2l0aCB0aGUgbmFtZSwgb3IgbnVsbCBpZiB0aGUKKyAgICAgKiAgICAgYXR0cmlidXRlIGlzIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUgcGFnZSBzY29wZS4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSBuYW1lIGlzIG51bGwKKyAgICAgKi8KKworICAgIGFic3RyYWN0IHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKTsKKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVyIHRoZSBuYW1lIGFuZCB2YWx1ZSBzcGVjaWZpZWQgd2l0aCBhcHByb3ByaWF0ZSAKKyAgICAgKiBzY29wZSBzZW1hbnRpY3MuICBJZiB0aGUgdmFsdWUgcGFzc2VkIGluIGlzIDxjb2RlPm51bGw8L2NvZGU+LCAKKyAgICAgKiB0aGlzIGhhcyB0aGUgc2FtZSBlZmZlY3QgYXMgY2FsbGluZworICAgICAqIDxjb2RlPnJlbW92ZUF0dHJpYnV0ZSggbmFtZSwgc2NvcGUgKTwvY29kZT4uCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0byBzZXQKKyAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG9iamVjdCB0byBhc3NvY2lhdGUgd2l0aCB0aGUgbmFtZSwgb3IgbnVsbCBpZgorICAgICAqICAgICB0aGUgYXR0cmlidXRlIGlzIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUgc3BlY2lmaWVkIHNjb3BlLgorICAgICAqIEBwYXJhbSBzY29wZSB0aGUgc2NvcGUgd2l0aCB3aGljaCB0byBhc3NvY2lhdGUgdGhlIG5hbWUvb2JqZWN0CisgICAgICogCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgbmFtZSBpcyBudWxsCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHNjb3BlIGlzIGludmFsaWQKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGUgc2NvcGUgaXMgCisgICAgICogICAgIFBhZ2VDb250ZXh0LlNFU1NJT05fU0NPUEUgYnV0IHRoZSBwYWdlIHRoYXQgd2FzIHJlcXVlc3RlZAorICAgICAqICAgICBkb2VzIG5vdCBwYXJ0aWNpcGF0ZSBpbiBhIHNlc3Npb24gb3IgdGhlIHNlc3Npb24gaGFzIGJlZW4KKyAgICAgKiAgICAgaW52YWxpZGF0ZWQuCisgICAgICovCisKKyAgICBhYnN0cmFjdCBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSwgaW50IHNjb3BlKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIG5hbWUgaW4gdGhlIHBhZ2Ugc2NvcGUgb3IgbnVsbAorICAgICAqIGlmIG5vdCBmb3VuZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdG8gZ2V0CisgICAgICogQHJldHVybiB0aGUgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgbmFtZSBpbiB0aGUgcGFnZSBzY29wZSAKKyAgICAgKiAgICAgb3IgbnVsbCBpZiBub3QgZm91bmQuCisgICAgICogCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgbmFtZSBpcyBudWxsCisgICAgICovCisKKyAgICBhYnN0cmFjdCBwdWJsaWMgT2JqZWN0IGdldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIG5hbWUgaW4gdGhlIHNwZWNpZmllZAorICAgICAqIHNjb3BlIG9yIG51bGwgaWYgbm90IGZvdW5kLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0byBzZXQKKyAgICAgKiBAcGFyYW0gc2NvcGUgdGhlIHNjb3BlIHdpdGggd2hpY2ggdG8gYXNzb2NpYXRlIHRoZSBuYW1lL29iamVjdAorICAgICAqIEByZXR1cm4gdGhlIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIG5hbWUgaW4gdGhlIHNwZWNpZmllZAorICAgICAqICAgICBzY29wZSBvciBudWxsIGlmIG5vdCBmb3VuZC4KKyAgICAgKiAKKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSBuYW1lIGlzIG51bGwKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgc2NvcGUgaXMgaW52YWxpZCAKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGUgc2NvcGUgaXMgCisgICAgICogICAgIFBhZ2VDb250ZXh0LlNFU1NJT05fU0NPUEUgYnV0IHRoZSBwYWdlIHRoYXQgd2FzIHJlcXVlc3RlZAorICAgICAqICAgICBkb2VzIG5vdCBwYXJ0aWNpcGF0ZSBpbiBhIHNlc3Npb24gb3IgdGhlIHNlc3Npb24gaGFzIGJlZW4KKyAgICAgKiAgICAgaW52YWxpZGF0ZWQuCisgICAgICovCisKKyAgICBhYnN0cmFjdCBwdWJsaWMgT2JqZWN0IGdldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgaW50IHNjb3BlKTsKKworICAgIC8qKgorICAgICAqIFNlYXJjaGVzIGZvciB0aGUgbmFtZWQgYXR0cmlidXRlIGluIHBhZ2UsIHJlcXVlc3QsIHNlc3Npb24gKGlmIHZhbGlkKSwKKyAgICAgKiBhbmQgYXBwbGljYXRpb24gc2NvcGUocykgaW4gb3JkZXIgYW5kIHJldHVybnMgdGhlIHZhbHVlIGFzc29jaWF0ZWQgb3IKKyAgICAgKiBudWxsLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0byBzZWFyY2ggZm9yCisgICAgICogQHJldHVybiB0aGUgdmFsdWUgYXNzb2NpYXRlZCBvciBudWxsCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgbmFtZSBpcyBudWxsCisgICAgICovCisKKyAgICBhYnN0cmFjdCBwdWJsaWMgT2JqZWN0IGZpbmRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpOworCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBvYmplY3QgcmVmZXJlbmNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gbmFtZQorICAgICAqIGZyb20gYWxsIHNjb3Blcy4gIERvZXMgbm90aGluZyBpZiB0aGVyZSBpcyBubyBzdWNoIG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBvYmplY3QgdG8gcmVtb3ZlLgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIG5hbWUgaXMgbnVsbAorICAgICAqLworCisgICAgYWJzdHJhY3QgcHVibGljIHZvaWQgcmVtb3ZlQXR0cmlidXRlKFN0cmluZyBuYW1lKTsKKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGUgb2JqZWN0IHJlZmVyZW5jZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lCisgICAgICogaW4gdGhlIGdpdmVuIHNjb3BlLiAgRG9lcyBub3RoaW5nIGlmIHRoZXJlIGlzIG5vIHN1Y2ggb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIG9iamVjdCB0byByZW1vdmUuCisgICAgICogQHBhcmFtIHNjb3BlIFRoZSBzY29wZSB3aGVyZSB0byBsb29rLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBzY29wZSBpcyBpbnZhbGlkCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlIHNjb3BlIGlzIAorICAgICAqICAgICBQYWdlQ29udGV4dC5TRVNTSU9OX1NDT1BFIGJ1dCB0aGUgcGFnZSB0aGF0IHdhcyByZXF1ZXN0ZWQKKyAgICAgKiAgICAgZG9lcyBub3QgcGFydGljaXBhdGUgaW4gYSBzZXNzaW9uIG9yIHRoZSBzZXNzaW9uIGhhcyBiZWVuCisgICAgICogICAgIGludmFsaWRhdGVkLgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIG5hbWUgaXMgbnVsbAorICAgICAqLworCisgICAgYWJzdHJhY3QgcHVibGljIHZvaWQgcmVtb3ZlQXR0cmlidXRlKFN0cmluZyBuYW1lLCBpbnQgc2NvcGUpOworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBzY29wZSB3aGVyZSBhIGdpdmVuIGF0dHJpYnV0ZSBpcyBkZWZpbmVkLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0byByZXR1cm4gdGhlIHNjb3BlIGZvcgorICAgICAqIEByZXR1cm4gdGhlIHNjb3BlIG9mIHRoZSBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBuYW1lIHNwZWNpZmllZCBvciAwCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgbmFtZSBpcyBudWxsCisgICAgICovCisKKyAgICBhYnN0cmFjdCBwdWJsaWMgaW50IGdldEF0dHJpYnV0ZXNTY29wZShTdHJpbmcgbmFtZSk7CisKKyAgICAvKioKKyAgICAgKiBFbnVtZXJhdGUgYWxsIHRoZSBhdHRyaWJ1dGVzIGluIGEgZ2l2ZW4gc2NvcGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2NvcGUgdGhlIHNjb3BlIHRvIGVudW1lcmF0ZSBhbGwgdGhlIGF0dHJpYnV0ZXMgZm9yCisgICAgICogQHJldHVybiBhbiBlbnVtZXJhdGlvbiBvZiBuYW1lcyAoamF2YS5sYW5nLlN0cmluZykgb2YgYWxsIHRoZSAKKyAgICAgKiAgICAgYXR0cmlidXRlcyB0aGUgc3BlY2lmaWVkIHNjb3BlCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHNjb3BlIGlzIGludmFsaWQKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGUgc2NvcGUgaXMgCisgICAgICogICAgIFBhZ2VDb250ZXh0LlNFU1NJT05fU0NPUEUgYnV0IHRoZSBwYWdlIHRoYXQgd2FzIHJlcXVlc3RlZAorICAgICAqICAgICBkb2VzIG5vdCBwYXJ0aWNpcGF0ZSBpbiBhIHNlc3Npb24gb3IgdGhlIHNlc3Npb24gaGFzIGJlZW4KKyAgICAgKiAgICAgaW52YWxpZGF0ZWQuCisgICAgICovCisKKyAgICBhYnN0cmFjdCBwdWJsaWMgRW51bWVyYXRpb24gZ2V0QXR0cmlidXRlTmFtZXNJblNjb3BlKGludCBzY29wZSk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgb3V0IG9iamVjdCAoYSBKc3BXcml0ZXIpLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgY3VycmVudCBKc3BXcml0ZXIgc3RyZWFtIGJlaW5nIHVzZWQgZm9yIGNsaWVudCByZXNwb25zZQorICAgICAqLworICAgIGFic3RyYWN0IHB1YmxpYyBKc3BXcml0ZXIgZ2V0T3V0KCk7CisgICAgCisgICAgLyoqCisgICAgICogUHJvdmlkZXMgcHJvZ3JhbW1hdGljIGFjY2VzcyB0byB0aGUgRXhwcmVzc2lvbkV2YWx1YXRvci4KKyAgICAgKiBUaGUgSlNQIENvbnRhaW5lciBtdXN0IHJldHVybiBhIHZhbGlkIGluc3RhbmNlIG9mIGFuIAorICAgICAqIEV4cHJlc3Npb25FdmFsdWF0b3IgdGhhdCBjYW4gcGFyc2UgRUwgZXhwcmVzc2lvbnMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEEgdmFsaWQgaW5zdGFuY2Ugb2YgYW4gRXhwcmVzc2lvbkV2YWx1YXRvci4KKyAgICAgKiBAc2luY2UgMi4wCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IEV4cHJlc3Npb25FdmFsdWF0b3IgZ2V0RXhwcmVzc2lvbkV2YWx1YXRvcigpOworICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgYW4gaW5zdGFuY2Ugb2YgYSBWYXJpYWJsZVJlc29sdmVyIHRoYXQgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZQorICAgICAqIGltcGxpY2l0IG9iamVjdHMgc3BlY2lmaWVkIGluIHRoZSBKU1Agc3BlY2lmaWNhdGlvbiB1c2luZyB0aGlzIEpzcENvbnRleHQKKyAgICAgKiBhcyB0aGUgY29udGV4dCBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEEgdmFsaWQgaW5zdGFuY2Ugb2YgYSBWYXJpYWJsZVJlc29sdmVyLgorICAgICAqIEBzaW5jZSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgVmFyaWFibGVSZXNvbHZlciBnZXRWYXJpYWJsZVJlc29sdmVyKCk7CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgbmV3IEpzcFdyaXRlciBvYmplY3QgdGhhdCBzZW5kcyBvdXRwdXQgdG8gdGhlCisgICAgICogcHJvdmlkZWQgV3JpdGVyLiAgU2F2ZXMgdGhlIGN1cnJlbnQgIm91dCIgSnNwV3JpdGVyLAorICAgICAqIGFuZCB1cGRhdGVzIHRoZSB2YWx1ZSBvZiB0aGUgIm91dCIgYXR0cmlidXRlIGluIHRoZQorICAgICAqIHBhZ2Ugc2NvcGUgYXR0cmlidXRlIG5hbWVzcGFjZSBvZiB0aGUgSnNwQ29udGV4dC4KKyAgICAgKiA8cD5UaGUgcmV0dXJuZWQgSnNwV3JpdGVyIG11c3QgaW1wbGVtZW50IGFsbCBtZXRob2RzIGFuZAorICAgICAqIGJlaGF2ZSBhcyB0aG91Z2ggaXQgd2VyZSB1bmJ1ZmZlcmVkLiAgTW9yZSBzcGVjaWZpY2FsbHk6CisgICAgICogPHVsPgorICAgICAqICAgPGxpPmNsZWFyKCkgbXVzdCB0aHJvdyBhbiBJT0V4Y2VwdGlvbjwvbGk+CisgICAgICogICA8bGk+Y2xlYXJCdWZmZXIoKSBkb2VzIG5vdGhpbmc8L2xpPgorICAgICAqICAgPGxpPmdldEJ1ZmZlclNpemUoKSBhbHdheXMgcmV0dXJucyAwPC9saT4KKyAgICAgKiAgIDxsaT5nZXRSZW1haW5pbmcoKSBhbHdheXMgcmV0dXJucyAwPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSB3cml0ZXIgVGhlIFdyaXRlciBmb3IgdGhlIHJldHVybmVkIEpzcFdyaXRlciB0byBzZW5kCisgICAgICogICAgIG91dHB1dCB0by4KKyAgICAgKiBAcmV0dXJuIGEgbmV3IEpzcFdyaXRlciB0aGF0IHdyaXRlcyB0byB0aGUgZ2l2ZW4gV3JpdGVyLgorICAgICAqIEBzaW5jZSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgSnNwV3JpdGVyIHB1c2hCb2R5KCBqYXZhLmlvLldyaXRlciB3cml0ZXIgKSB7CisgICAgICAgIHJldHVybiBudWxsOyAvLyBYWFggdG8gaW1wbGVtZW50CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcHJldmlvdXMgSnNwV3JpdGVyICJvdXQiIHNhdmVkIGJ5IHRoZSBtYXRjaGluZworICAgICAqIHB1c2hCb2R5KCksIGFuZCB1cGRhdGUgdGhlIHZhbHVlIG9mIHRoZSAib3V0IiBhdHRyaWJ1dGUgaW4KKyAgICAgKiB0aGUgcGFnZSBzY29wZSBhdHRyaWJ1dGUgbmFtZXNwYWNlIG9mIHRoZSBKc3BDb250ZXh0LgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgc2F2ZWQgSnNwV3JpdGVyLgorICAgICAqLworICAgIHB1YmxpYyBKc3BXcml0ZXIgcG9wQm9keSgpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7IC8vIFhYWCB0byBpbXBsZW1lbnQKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvSnNwRW5naW5lSW5mby5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL0pzcEVuZ2luZUluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzZmMDBlCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL0pzcEVuZ2luZUluZm8uamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKgorKiBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovIAorcGFja2FnZSBqYXZheC5zZXJ2bGV0LmpzcDsKKworLyoqCisgKiBUaGUgSnNwRW5naW5lSW5mbyBpcyBhbiBhYnN0cmFjdCBjbGFzcyB0aGF0IHByb3ZpZGVzIGluZm9ybWF0aW9uIG9uIHRoZQorICogY3VycmVudCBKU1AgZW5naW5lLgorICovCisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBKc3BFbmdpbmVJbmZvIHsKKworICAgIC8qKgorICAgICAqIFNvbGUgY29uc3RydWN0b3IuIChGb3IgaW52b2NhdGlvbiBieSBzdWJjbGFzcyBjb25zdHJ1Y3RvcnMsIAorICAgICAqIHR5cGljYWxseSBpbXBsaWNpdC4pCisgICAgICovCisgICAgcHVibGljIEpzcEVuZ2luZUluZm8oKSB7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdmVyc2lvbiBudW1iZXIgb2YgdGhlIEpTUCBzcGVjaWZpY2F0aW9uIHRoYXQgaXMgc3VwcG9ydGVkIGJ5CisgICAgICogdGhpcyBKU1AgZW5naW5lLgorICAgICAqIDxwPgorICAgICAqIFNwZWNpZmljYXRpb24gdmVyc2lvbiBudW1iZXJzIHRoYXQgY29uc2lzdHMgb2YgcG9zaXRpdmUgZGVjaW1hbCBpbnRlZ2VycworICAgICAqIHNlcGFyYXRlZCBieSBwZXJpb2RzICIuIiwgZm9yIGV4YW1wbGUsICIyLjAiIG9yICIxLjIuMy40LjUuNi43Ii4KKyAgICAgKiBUaGlzIGFsbG93cyBhbiBleHRlbnNpYmxlIG51bWJlciB0byBiZSB1c2VkIHRvCisgICAgICogcmVwcmVzZW50IG1ham9yLCBtaW5vciwgbWljcm8sIGV0YyB2ZXJzaW9ucy4KKyAgICAgKiBUaGUgdmVyc2lvbiBudW1iZXIgbXVzdCBiZWdpbiB3aXRoIGEgbnVtYmVyLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHNwZWNpZmljYXRpb24gdmVyc2lvbiwgbnVsbCBpcyByZXR1cm5lZCBpZiBpdCBpcyBub3Qga25vd24KKyAgICAgKi8KKworICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0U3BlY2lmaWNhdGlvblZlcnNpb24oKTsKK30KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC9Kc3BFeGNlcHRpb24uamF2YSBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC9Kc3BFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmViOTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL0pzcEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTEyIEBACisvKgorKiBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCitwYWNrYWdlIGphdmF4LnNlcnZsZXQuanNwOworCisvKioKKyAqIEEgZ2VuZXJpYyBleGNlcHRpb24ga25vd24gdG8gdGhlIEpTUCBlbmdpbmU7IHVuY2F1Z2h0CisgKiBKc3BFeGNlcHRpb25zIHdpbGwgcmVzdWx0IGluIGFuIGludm9jYXRpb24gb2YgdGhlIGVycm9ycGFnZQorICogbWFjaGluZXJ5LgorICovCisKK3B1YmxpYyBjbGFzcyBKc3BFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24geworCisgICAgcHJpdmF0ZSBUaHJvd2FibGUgcm9vdENhdXNlOworCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBKc3BFeGNlcHRpb24uCisgICAgICovCisgICAgcHVibGljIEpzcEV4Y2VwdGlvbigpIHsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgSlNQIGV4Y2VwdGlvbiB3aXRoIHRoZQorICAgICAqIHNwZWNpZmllZCBtZXNzYWdlLiBUaGUgbWVzc2FnZSBjYW4gYmUgd3JpdHRlbiAKKyAgICAgKiB0byB0aGUgc2VydmVyIGxvZyBhbmQvb3IgZGlzcGxheWVkIGZvciB0aGUgdXNlci4gCisgICAgICoKKyAgICAgKiBAcGFyYW0gbXNnIAkJYSA8Y29kZT5TdHJpbmc8L2NvZGU+IAorICAgICAqCQkJCXNwZWNpZnlpbmcgdGhlIHRleHQgb2YgCisgICAgICoJCQkJdGhlIGV4Y2VwdGlvbiBtZXNzYWdlCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgSnNwRXhjZXB0aW9uKFN0cmluZyBtc2cpIHsKKwlzdXBlcihtc2cpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBKU1AgZXhjZXB0aW9uIHdoZW4gdGhlIEpTUCAKKyAgICAgKiBuZWVkcyB0byB0aHJvdyBhbiBleGNlcHRpb24gYW5kIGluY2x1ZGUgYSBtZXNzYWdlIAorICAgICAqIGFib3V0IHRoZSAicm9vdCBjYXVzZSIgZXhjZXB0aW9uIHRoYXQgaW50ZXJmZXJlZCB3aXRoIGl0cyAKKyAgICAgKiBub3JtYWwgb3BlcmF0aW9uLCBpbmNsdWRpbmcgYSBkZXNjcmlwdGlvbiBtZXNzYWdlLgorICAgICAqCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVzc2FnZSAJCWEgPGNvZGU+U3RyaW5nPC9jb2RlPiBjb250YWluaW5nIAorICAgICAqCQkJCXRoZSB0ZXh0IG9mIHRoZSBleGNlcHRpb24gbWVzc2FnZQorICAgICAqCisgICAgICogQHBhcmFtIHJvb3RDYXVzZQkJdGhlIDxjb2RlPlRocm93YWJsZTwvY29kZT4gZXhjZXB0aW9uIAorICAgICAqCQkJCXRoYXQgaW50ZXJmZXJlZCB3aXRoIHRoZSBzZXJ2bGV0J3MKKyAgICAgKgkJCQlub3JtYWwgb3BlcmF0aW9uLCBtYWtpbmcgdGhpcyBzZXJ2bGV0CisgICAgICoJCQkJZXhjZXB0aW9uIG5lY2Vzc2FyeQorICAgICAqCisgICAgICovCisgICAgCisgICAgcHVibGljIEpzcEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIHJvb3RDYXVzZSkgeworCXN1cGVyKG1lc3NhZ2UpOworCXRoaXMucm9vdENhdXNlID0gcm9vdENhdXNlOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBKU1AgZXhjZXB0aW9uIHdoZW4gdGhlIEpTUCAKKyAgICAgKiBuZWVkcyB0byB0aHJvdyBhbiBleGNlcHRpb24gYW5kIGluY2x1ZGUgYSBtZXNzYWdlCisgICAgICogYWJvdXQgdGhlICJyb290IGNhdXNlIiBleGNlcHRpb24gdGhhdCBpbnRlcmZlcmVkIHdpdGggaXRzCisgICAgICogbm9ybWFsIG9wZXJhdGlvbi4gIFRoZSBleGNlcHRpb24ncyBtZXNzYWdlIGlzIGJhc2VkIG9uIHRoZSBsb2NhbGl6ZWQKKyAgICAgKiBtZXNzYWdlIG9mIHRoZSB1bmRlcmx5aW5nIGV4Y2VwdGlvbi4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgbWV0aG9kIGNhbGxzIHRoZSA8Y29kZT5nZXRMb2NhbGl6ZWRNZXNzYWdlPC9jb2RlPiBtZXRob2QKKyAgICAgKiBvbiB0aGUgPGNvZGU+VGhyb3dhYmxlPC9jb2RlPiBleGNlcHRpb24gdG8gZ2V0IGEgbG9jYWxpemVkIGV4Y2VwdGlvbgorICAgICAqIG1lc3NhZ2UuIFdoZW4gc3ViY2xhc3NpbmcgPGNvZGU+SnNwRXhjZXB0aW9uPC9jb2RlPiwgCisgICAgICogdGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gdG8gY3JlYXRlIGFuIGV4Y2VwdGlvbiBtZXNzYWdlIAorICAgICAqIGRlc2lnbmVkIGZvciBhIHNwZWNpZmljIGxvY2FsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByb290Q2F1c2UgCXRoZSA8Y29kZT5UaHJvd2FibGU8L2NvZGU+IGV4Y2VwdGlvbgorICAgICAqIAkJCQl0aGF0IGludGVyZmVyZWQgd2l0aCB0aGUgSlNQJ3MKKyAgICAgKgkJCQlub3JtYWwgb3BlcmF0aW9uLCBtYWtpbmcgdGhlIEpTUCBleGNlcHRpb24KKyAgICAgKgkJCQluZWNlc3NhcnkKKyAgICAgKgorICAgICAqLworCisgICAgcHVibGljIEpzcEV4Y2VwdGlvbihUaHJvd2FibGUgcm9vdENhdXNlKSB7CisJc3VwZXIocm9vdENhdXNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7CisJdGhpcy5yb290Q2F1c2UgPSByb290Q2F1c2U7CisgICAgfQorCisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZXhjZXB0aW9uIHRoYXQgY2F1c2VkIHRoaXMgSlNQIGV4Y2VwdGlvbi4KKyAgICAgKgorICAgICAqCisgICAgICogQHJldHVybgkJCXRoZSA8Y29kZT5UaHJvd2FibGU8L2NvZGU+IAorICAgICAqCQkJCXRoYXQgY2F1c2VkIHRoaXMgSlNQIGV4Y2VwdGlvbgorICAgICAqCisgICAgICovCisgICAgCisgICAgcHVibGljIFRocm93YWJsZSBnZXRSb290Q2F1c2UoKSB7CisJcmV0dXJuIHJvb3RDYXVzZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvSnNwRmFjdG9yeS5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL0pzcEZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzUzYzQxCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL0pzcEZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDE0MiBAQAorLyoKKyogQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworcGFja2FnZSBqYXZheC5zZXJ2bGV0LmpzcDsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldFJlc3BvbnNlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLlBhZ2VDb250ZXh0OworCisvKioKKyAqIDxwPgorICogVGhlIEpzcEZhY3RvcnkgaXMgYW4gYWJzdHJhY3QgY2xhc3MgdGhhdCBkZWZpbmVzIGEgbnVtYmVyIG9mIGZhY3RvcnkKKyAqIG1ldGhvZHMgYXZhaWxhYmxlIHRvIGEgSlNQIHBhZ2UgYXQgcnVudGltZSBmb3IgdGhlIHB1cnBvc2VzIG9mIGNyZWF0aW5nCisgKiBpbnN0YW5jZXMgb2YgdmFyaW91cyBpbnRlcmZhY2VzIGFuZCBjbGFzc2VzIHVzZWQgdG8gc3VwcG9ydCB0aGUgSlNQIAorICogaW1wbGVtZW50YXRpb24uCisgKiA8cD4KKyAqIEEgY29uZm9ybWFudCBKU1AgRW5naW5lIGltcGxlbWVudGF0aW9uIHdpbGwsIGR1cmluZyBpdCdzIGluaXRpYWxpemF0aW9uCisgKiBpbnN0YW50aWF0ZSBhbiBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQgc3ViY2xhc3Mgb2YgdGhpcyBjbGFzcywgYW5kIG1ha2UgCisgKiBpdCBnbG9iYWxseSBhdmFpbGFibGUgZm9yIHVzZSBieSBKU1AgaW1wbGVtZW50YXRpb24gY2xhc3NlcyBieSByZWdpc3RlcmluZworICogdGhlIGluc3RhbmNlIGNyZWF0ZWQgd2l0aCB0aGlzIGNsYXNzIHZpYSB0aGUKKyAqIHN0YXRpYyA8Y29kZT4gc2V0RGVmYXVsdEZhY3RvcnkoKSA8L2NvZGU+IG1ldGhvZC4KKyAqIDxwPgorICogVGhlIFBhZ2VDb250ZXh0IGFuZCB0aGUgSnNwRW5naW5lSW5mbyBjbGFzc2VzIGFyZSB0aGUgb25seSBpbXBsZW1lbnRhdGlvbi1kZXBlbmRlbnQKKyAqIGNsYXNzZXMgdGhhdCBjYW4gYmUgY3JlYXRlZCBmcm9tIHRoZSBmYWN0b3J5LgorICogPHA+CisgKiBKc3BGYWN0b3J5IG9iamVjdHMgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IEpTUCBwYWdlIGF1dGhvcnMuCisgKi8KKworcHVibGljIGFic3RyYWN0IGNsYXNzIEpzcEZhY3RvcnkgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgSnNwRmFjdG9yeSBkZWZsdCA9IG51bGw7CisgICAgCisgICAgLyoqCisgICAgICogU29sZSBjb25zdHJ1Y3Rvci4gKEZvciBpbnZvY2F0aW9uIGJ5IHN1YmNsYXNzIGNvbnN0cnVjdG9ycywgCisgICAgICogdHlwaWNhbGx5IGltcGxpY2l0LikKKyAgICAgKi8KKyAgICBwdWJsaWMgSnNwRmFjdG9yeSgpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiA8cD4KKyAgICAgKiBzZXQgdGhlIGRlZmF1bHQgZmFjdG9yeSBmb3IgdGhpcyBpbXBsZW1lbnRhdGlvbi4gSXQgaXMgaWxsZWdhbCBmb3IKKyAgICAgKiBhbnkgcHJpbmNpcGFsIG90aGVyIHRoYW4gdGhlIEpTUCBFbmdpbmUgcnVudGltZSB0byBjYWxsIHRoaXMgbWV0aG9kLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZWZsdAlUaGUgZGVmYXVsdCBmYWN0b3J5IGltcGxlbWVudGF0aW9uCisgICAgICovCisKKyAgICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIHNldERlZmF1bHRGYWN0b3J5KEpzcEZhY3RvcnkgZGVmbHQpIHsKKwlKc3BGYWN0b3J5LmRlZmx0ID0gZGVmbHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZGVmYXVsdCBmYWN0b3J5IGZvciB0aGlzIGltcGxlbWVudGF0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgZGVmYXVsdCBmYWN0b3J5IGZvciB0aGlzIGltcGxlbWVudGF0aW9uCisgICAgICovCisKKyAgICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBKc3BGYWN0b3J5IGdldERlZmF1bHRGYWN0b3J5KCkgeworCXJldHVybiBkZWZsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiA8cD4KKyAgICAgKiBvYnRhaW5zIGFuIGluc3RhbmNlIG9mIGFuIGltcGxlbWVudGF0aW9uIGRlcGVuZGVudCAKKyAgICAgKiBqYXZheC5zZXJ2bGV0LmpzcC5QYWdlQ29udGV4dCBhYnN0cmFjdCBjbGFzcyBmb3IgdGhlIGNhbGxpbmcgU2VydmxldAorICAgICAqIGFuZCBjdXJyZW50bHkgcGVuZGluZyByZXF1ZXN0IGFuZCByZXNwb25zZS4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIG1ldGhvZCBpcyB0eXBpY2FsbHkgY2FsbGVkIGVhcmx5IGluIHRoZSBwcm9jZXNzaW5nIG9mIHRoZSAKKyAgICAgKiBfanNwU2VydmljZSgpIG1ldGhvZCBvZiBhIEpTUCBpbXBsZW1lbnRhdGlvbiBjbGFzcyBpbiBvcmRlciB0byAKKyAgICAgKiBvYnRhaW4gYSBQYWdlQ29udGV4dCBvYmplY3QgZm9yIHRoZSByZXF1ZXN0IGJlaW5nIHByb2Nlc3NlZC4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogSW52b2tpbmcgdGhpcyBtZXRob2Qgc2hhbGwgcmVzdWx0IGluIHRoZSBQYWdlQ29udGV4dC5pbml0aWFsaXplKCkKKyAgICAgKiBtZXRob2QgYmVpbmcgaW52b2tlZC4gVGhlIFBhZ2VDb250ZXh0IHJldHVybmVkIGlzIHByb3Blcmx5IGluaXRpYWxpemVkLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBBbGwgUGFnZUNvbnRleHQgb2JqZWN0cyBvYnRhaW5lZCB2aWEgdGhpcyBtZXRob2Qgc2hhbGwgYmUgcmVsZWFzZWQKKyAgICAgKiBieSBpbnZva2luZyByZWxlYXNlUGFnZUNvbnRleHQoKS4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VydmxldCAgIHRoZSByZXF1ZXN0aW5nIHNlcnZsZXQKKyAgICAgKiBAcGFyYW0gcmVxdWVzdAl0aGUgY3VycmVudCByZXF1ZXN0IHBlbmRpbmcgb24gdGhlIHNlcnZsZXQKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UJdGhlIGN1cnJlbnQgcmVzcG9uc2UgcGVuZGluZyBvbiB0aGUgc2VydmxldAorICAgICAqIEBwYXJhbSBlcnJvclBhZ2VVUkwgdGhlIFVSTCBvZiB0aGUgZXJyb3IgcGFnZSBmb3IgdGhlIHJlcXVlc3RpbmcgSlNQLCBvciBudWxsCisgICAgICogQHBhcmFtIG5lZWRzU2Vzc2lvbiB0cnVlIGlmIHRoZSBKU1AgcGFydGljaXBhdGVzIGluIGEgc2Vzc2lvbgorICAgICAqIEBwYXJhbSBidWZmZXIJc2l6ZSBvZiBidWZmZXIgaW4gYnl0ZXMsIFBhZ2VDb250ZXh0Lk5PX0JVRkZFUiBpZiBubyBidWZmZXIsCisgICAgICoJCQlQYWdlQ29udGV4dC5ERUZBVUxUX0JVRkZFUiBpZiBpbXBsZW1lbnRhdGlvbiBkZWZhdWx0LgorICAgICAqIEBwYXJhbSBhdXRvZmx1c2gJc2hvdWxkIHRoZSBidWZmZXIgYXV0b2ZsdXNoIHRvIHRoZSBvdXRwdXQgc3RyZWFtIG9uIGJ1ZmZlcgorICAgICAqCQkJb3ZlcmZsb3csIG9yIHRocm93IGFuIElPRXhjZXB0aW9uPworICAgICAqCisgICAgICogQHJldHVybiB0aGUgcGFnZSBjb250ZXh0CisgICAgICoKKyAgICAgKiBAc2VlIGphdmF4LnNlcnZsZXQuanNwLlBhZ2VDb250ZXh0CisgICAgICovCisKKyAgICBwdWJsaWMgYWJzdHJhY3QgUGFnZUNvbnRleHQgZ2V0UGFnZUNvbnRleHQoU2VydmxldAkgICAgICAgc2VydmxldCwKKwkJCQkgICAgCSAgICAgICBTZXJ2bGV0UmVxdWVzdCAgcmVxdWVzdCwKKwkJCQkgICAgCSAgICAgICBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UsCisJCQkJICAgIAkgICAgICAgU3RyaW5nCSAgICAgICBlcnJvclBhZ2VVUkwsCisJCQkJICAgIAkgICAgICAgYm9vbGVhbiAgICAgICAgIG5lZWRzU2Vzc2lvbiwKKwkJCQkgICAgCSAgICAgICBpbnQgICAgICAgICAgICAgYnVmZmVyLAorCQkJCSAgICAJICAgICAgIGJvb2xlYW4gICAgICAgICBhdXRvZmx1c2gpOworCisgICAgLyoqCisgICAgICogPHA+CisgICAgICogY2FsbGVkIHRvIHJlbGVhc2UgYSBwcmV2aW91c2x5IGFsbG9jYXRlZCBQYWdlQ29udGV4dCBvYmplY3QuCisgICAgICogUmVzdWx0cyBpbiBQYWdlQ29udGV4dC5yZWxlYXNlKCkgYmVpbmcgaW52b2tlZC4KKyAgICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgaW52b2tlZCBwcmlvciB0byByZXR1cm5pbmcgZnJvbSB0aGUgX2pzcFNlcnZpY2UoKSBtZXRob2Qgb2YgYSBKU1AgaW1wbGVtZW50YXRpb24KKyAgICAgKiBjbGFzcy4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gcGMgQSBQYWdlQ29udGV4dCBwcmV2aW91c2x5IG9idGFpbmVkIGJ5IGdldFBhZ2VDb250ZXh0KCkKKyAgICAgKi8KKworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlbGVhc2VQYWdlQ29udGV4dChQYWdlQ29udGV4dCBwYyk7CisKKyAgICAvKioKKyAgICAgKiA8cD4KKyAgICAgKiBjYWxsZWQgdG8gZ2V0IGltcGxlbWVudGF0aW9uLXNwZWNpZmljIGluZm9ybWF0aW9uIG9uIHRoZSBjdXJyZW50IEpTUCBlbmdpbmUuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHJldHVybiBhIEpzcEVuZ2luZUluZm8gb2JqZWN0IGRlc2NyaWJpbmcgdGhlIGN1cnJlbnQgSlNQIGVuZ2luZQorICAgICAqLworICAgIAorICAgIHB1YmxpYyBhYnN0cmFjdCBKc3BFbmdpbmVJbmZvIGdldEVuZ2luZUluZm8oKTsKK30KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC9Kc3BQYWdlLmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvSnNwUGFnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5MzA3NGQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvSnNwUGFnZS5qYXZhCkBAIC0wLDAgKzEsODkgQEAKKy8qCisqIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8gCitwYWNrYWdlIGphdmF4LnNlcnZsZXQuanNwOworCitpbXBvcnQgamF2YXguc2VydmxldC4qOworCisvKioKKyAqIFRoZSBKc3BQYWdlIGludGVyZmFjZSBkZXNjcmliZXMgdGhlIGdlbmVyaWMgaW50ZXJhY3Rpb24gdGhhdCBhIEpTUCBQYWdlCisgKiBJbXBsZW1lbnRhdGlvbiBjbGFzcyBtdXN0IHNhdGlzZnk7IHBhZ2VzIHRoYXQgdXNlIHRoZSBIVFRQIHByb3RvY29sCisgKiBhcmUgZGVzY3JpYmVkIGJ5IHRoZSBIdHRwSnNwUGFnZSBpbnRlcmZhY2UuCisgKgorICogPHA+PEI+VHdvIHBsdXMgT25lIE1ldGhvZHM8L0I+CisgKiA8cD4KKyAqIFRoZSBpbnRlcmZhY2UgZGVmaW5lcyBhIHByb3RvY29sIHdpdGggMyBtZXRob2RzOyBvbmx5IHR3byBvZgorICogdGhlbToganNwSW5pdCgpIGFuZCBqc3BEZXN0cm95KCkgYXJlIHBhcnQgb2YgdGhpcyBpbnRlcmZhY2UgYXMKKyAqIHRoZSBzaWduYXR1cmUgb2YgdGhlIHRoaXJkIG1ldGhvZDogX2pzcFNlcnZpY2UoKSBkZXBlbmRzIG9uCisgKiB0aGUgc3BlY2lmaWMgcHJvdG9jb2wgdXNlZCBhbmQgY2Fubm90IGJlIGV4cHJlc3NlZCBpbiBhIGdlbmVyaWMKKyAqIHdheSBpbiBKYXZhLgorICogPHA+CisgKiBBIGNsYXNzIGltcGxlbWVudGluZyB0aGlzIGludGVyZmFjZSBpcyByZXNwb25zaWJsZSBmb3IgaW52b2tpbmcKKyAqIHRoZSBhYm92ZSBtZXRob2RzIGF0IHRoZSBhcHByb3ByaWF0ZSB0aW1lIGJhc2VkIG9uIHRoZQorICogY29ycmVzcG9uZGluZyBTZXJ2bGV0LWJhc2VkIG1ldGhvZCBpbnZvY2F0aW9ucy4KKyAqIDxwPgorICogVGhlIGpzcEluaXQoKSBhbmQganNwRGVzdHJveSgpIG1ldGhvZHMgY2FuIGJlIGRlZmluZWQgYnkgYSBKU1AKKyAqIGF1dGhvciwgYnV0IHRoZSBfanNwU2VydmljZSgpIG1ldGhvZCBpcyBkZWZpbmVkIGF1dG9tYXRpY2FsbHkKKyAqIGJ5IHRoZSBKU1AgcHJvY2Vzc29yIGJhc2VkIG9uIHRoZSBjb250ZW50cyBvZiB0aGUgSlNQIHBhZ2UuCisgKgorICogPHA+PEI+X2pzcFNlcnZpY2UoKTwvQj4KKyAqIDxwPgorICogVGhlIF9qc3BTZXJ2aWNlKCltZXRob2QgY29ycmVzcG9uZHMgdG8gdGhlIGJvZHkgb2YgdGhlIEpTUCBwYWdlLiBUaGlzCisgKiBtZXRob2QgaXMgZGVmaW5lZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBKU1AgY29udGFpbmVyIGFuZCBzaG91bGQgbmV2ZXIKKyAqIGJlIGRlZmluZWQgYnkgdGhlIEpTUCBwYWdlIGF1dGhvci4KKyAqIDxwPgorICogSWYgYSBzdXBlcmNsYXNzIGlzIHNwZWNpZmllZCB1c2luZyB0aGUgZXh0ZW5kcyBhdHRyaWJ1dGUsIHRoYXQKKyAqIHN1cGVyY2xhc3MgbWF5IGNob29zZSB0byBwZXJmb3JtIHNvbWUgYWN0aW9ucyBpbiBpdHMgc2VydmljZSgpIG1ldGhvZAorICogYmVmb3JlIG9yIGFmdGVyIGNhbGxpbmcgdGhlIF9qc3BTZXJ2aWNlKCkgbWV0aG9kLiAgU2VlIHVzaW5nIHRoZSBleHRlbmRzCisgKiBhdHRyaWJ1dGUgaW4gdGhlIEpTUF9FbmdpbmUgY2hhcHRlciBvZiB0aGUgSlNQIHNwZWNpZmljYXRpb24uCisgKiA8cD4KKyAqIFRoZSBzcGVjaWZpYyBzaWduYXR1cmUgZGVwZW5kcyBvbiB0aGUgcHJvdG9jb2wgc3VwcG9ydGVkIGJ5IHRoZSBKU1AgcGFnZS4KKyAqCisgKiA8cHJlPgorICogcHVibGljIHZvaWQgX2pzcFNlcnZpY2UoPGVtPlNlcnZsZXRSZXF1ZXN0U3VidHlwZTwvZW0+IHJlcXVlc3QsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVtPlNlcnZsZXRSZXNwb25zZVN1YnR5cGU8L2VtPiByZXNwb25zZSkKKyAqICAgICAgICB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb247CisgKiA8L3ByZT4KKyAqLworCisKK3B1YmxpYyBpbnRlcmZhY2UgSnNwUGFnZSBleHRlbmRzIFNlcnZsZXQgeworCisgICAgLyoqCisgICAgICogVGhlIGpzcEluaXQoKSBtZXRob2QgaXMgaW52b2tlZCB3aGVuIHRoZSBKU1AgcGFnZSBpcyBpbml0aWFsaXplZC4gSXQKKyAgICAgKiBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIEpTUCBpbXBsZW1lbnRhdGlvbiAoYW5kIG9mIHRoZSBjbGFzcworICAgICAqIG1lbnRpb25lZCBieSB0aGUgZXh0ZW5kcyBhdHRyaWJ1dGUsIGlmIHByZXNlbnQpIHRoYXQgYXQgdGhpcyBwb2ludAorICAgICAqIGludm9jYXRpb25zIHRvIHRoZSBnZXRTZXJ2bGV0Q29uZmlnKCkgbWV0aG9kIHdpbGwgcmV0dXJuIHRoZSBkZXNpcmVkCisgICAgICogdmFsdWUuCisgICAgICoKKyAgICAgKiBBIEpTUCBwYWdlIGNhbiBvdmVycmlkZSB0aGlzIG1ldGhvZCBieSBpbmNsdWRpbmcgYSBkZWZpbml0aW9uIGZvciBpdAorICAgICAqIGluIGEgZGVjbGFyYXRpb24gZWxlbWVudC4KKyAgICAgKgorICAgICAqIEEgSlNQIHBhZ2Ugc2hvdWxkIHJlZGVmaW5lIHRoZSBpbml0KCkgbWV0aG9kIGZyb20gU2VydmxldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBqc3BJbml0KCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUganNwRGVzdHJveSgpIG1ldGhvZCBpcyBpbnZva2VkIHdoZW4gdGhlIEpTUCBwYWdlIGlzIGFib3V0IHRvIGJlCisgICAgICogZGVzdHJveWVkLgorICAgICAqIAorICAgICAqIEEgSlNQIHBhZ2UgY2FuIG92ZXJyaWRlIHRoaXMgbWV0aG9kIGJ5IGluY2x1ZGluZyBhIGRlZmluaXRpb24gZm9yIGl0CisgICAgICogaW4gYSBkZWNsYXJhdGlvbiBlbGVtZW50LgorICAgICAqCisgICAgICogQSBKU1AgcGFnZSBzaG91bGQgcmVkZWZpbmUgdGhlIGRlc3Ryb3koKSBtZXRob2QgZnJvbSBTZXJ2bGV0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGpzcERlc3Ryb3koKTsKKworfQpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL0pzcFRhZ0V4Y2VwdGlvbi5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL0pzcFRhZ0V4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1ZDg3NjkKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvSnNwVGFnRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSw5MiBAQAorLyoKKyogQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworcGFja2FnZSBqYXZheC5zZXJ2bGV0LmpzcDsKKworLyoqCisgKiBFeGNlcHRpb24gdG8gYmUgdXNlZCBieSBhIFRhZyBIYW5kbGVyIHRvIGluZGljYXRlIHNvbWUgdW5yZWNvdmVyYWJsZQorICogZXJyb3IuCisgKiBUaGlzIGVycm9yIGlzIHRvIGJlIGNhdWdodCBieSB0aGUgdG9wIGxldmVsIG9mIHRoZSBKU1AgcGFnZSBhbmQgd2lsbCByZXN1bHQKKyAqIGluIGFuIGVycm9yIHBhZ2UuCisgKi8KKworcHVibGljIGNsYXNzIEpzcFRhZ0V4Y2VwdGlvbiBleHRlbmRzIEpzcEV4Y2VwdGlvbiB7CisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBKc3BUYWdFeGNlcHRpb24gd2l0aCB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UuCisgICAgICogVGhlIG1lc3NhZ2UgY2FuIGJlIHdyaXR0ZW4gdG8gdGhlIHNlcnZlciBsb2cgYW5kL29yIGRpc3BsYXllZAorICAgICAqIGZvciB0aGUgdXNlci4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbXNnIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiBzcGVjaWZ5aW5nIHRoZSB0ZXh0IG9mIAorICAgICAqICAgICB0aGUgZXhjZXB0aW9uIG1lc3NhZ2UKKyAgICAgKi8KKyAgICBwdWJsaWMgSnNwVGFnRXhjZXB0aW9uKFN0cmluZyBtc2cpIHsKKwlzdXBlciggbXNnICk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBKc3BUYWdFeGNlcHRpb24gd2l0aCBubyBtZXNzYWdlLgorICAgICAqLworICAgIHB1YmxpYyBKc3BUYWdFeGNlcHRpb24oKSB7CisJc3VwZXIoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IEpzcFRhZ0V4Y2VwdGlvbiB3aGVuIHRoZSBKU1AgVGFnCisgICAgICogbmVlZHMgdG8gdGhyb3cgYW4gZXhjZXB0aW9uIGFuZCBpbmNsdWRlIGEgbWVzc2FnZSAKKyAgICAgKiBhYm91dCB0aGUgInJvb3QgY2F1c2UiIGV4Y2VwdGlvbiB0aGF0IGludGVyZmVyZWQgd2l0aCBpdHMgCisgICAgICogbm9ybWFsIG9wZXJhdGlvbiwgaW5jbHVkaW5nIGEgZGVzY3JpcHRpb24gbWVzc2FnZS4KKyAgICAgKgorICAgICAqCisgICAgICogQHBhcmFtIG1lc3NhZ2UgCQlhIDxjb2RlPlN0cmluZzwvY29kZT4gY29udGFpbmluZyAKKyAgICAgKgkJCQl0aGUgdGV4dCBvZiB0aGUgZXhjZXB0aW9uIG1lc3NhZ2UKKyAgICAgKgorICAgICAqIEBwYXJhbSByb290Q2F1c2UJCXRoZSA8Y29kZT5UaHJvd2FibGU8L2NvZGU+IGV4Y2VwdGlvbiAKKyAgICAgKgkJCQl0aGF0IGludGVyZmVyZWQgd2l0aCB0aGUgSlNQIFRhZydzCisgICAgICoJCQkJbm9ybWFsIG9wZXJhdGlvbiwgbWFraW5nIHRoaXMgSlNQIFRhZworICAgICAqCQkJCWV4Y2VwdGlvbiBuZWNlc3NhcnkKKyAgICAgKgorICAgICAqIEBzaW5jZSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgSnNwVGFnRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgcm9vdENhdXNlKSB7CisJc3VwZXIoIG1lc3NhZ2UsIHJvb3RDYXVzZSApOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBKU1AgVGFnIGV4Y2VwdGlvbiB3aGVuIHRoZSBKU1AgVGFnCisgICAgICogbmVlZHMgdG8gdGhyb3cgYW4gZXhjZXB0aW9uIGFuZCBpbmNsdWRlIGEgbWVzc2FnZQorICAgICAqIGFib3V0IHRoZSAicm9vdCBjYXVzZSIgZXhjZXB0aW9uIHRoYXQgaW50ZXJmZXJlZCB3aXRoIGl0cworICAgICAqIG5vcm1hbCBvcGVyYXRpb24uICBUaGUgZXhjZXB0aW9uJ3MgbWVzc2FnZSBpcyBiYXNlZCBvbiB0aGUgbG9jYWxpemVkCisgICAgICogbWVzc2FnZSBvZiB0aGUgdW5kZXJseWluZyBleGNlcHRpb24uCisgICAgICoKKyAgICAgKiA8cD5UaGlzIG1ldGhvZCBjYWxscyB0aGUgPGNvZGU+Z2V0TG9jYWxpemVkTWVzc2FnZTwvY29kZT4gbWV0aG9kCisgICAgICogb24gdGhlIDxjb2RlPlRocm93YWJsZTwvY29kZT4gZXhjZXB0aW9uIHRvIGdldCBhIGxvY2FsaXplZCBleGNlcHRpb24KKyAgICAgKiBtZXNzYWdlLiBXaGVuIHN1YmNsYXNzaW5nIDxjb2RlPkpzcFRhZ0V4Y2VwdGlvbjwvY29kZT4sIAorICAgICAqIHRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIHRvIGNyZWF0ZSBhbiBleGNlcHRpb24gbWVzc2FnZSAKKyAgICAgKiBkZXNpZ25lZCBmb3IgYSBzcGVjaWZpYyBsb2NhbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcm9vdENhdXNlIAl0aGUgPGNvZGU+VGhyb3dhYmxlPC9jb2RlPiBleGNlcHRpb24KKyAgICAgKiAJCQkJdGhhdCBpbnRlcmZlcmVkIHdpdGggdGhlIEpTUCBUYWcncworICAgICAqCQkJCW5vcm1hbCBvcGVyYXRpb24sIG1ha2luZyB0aGUgSlNQIFRhZyAKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uIG5lY2Vzc2FyeQorICAgICAqCisgICAgICogQHNpbmNlIDIuMAorICAgICAqLworCisgICAgcHVibGljIEpzcFRhZ0V4Y2VwdGlvbihUaHJvd2FibGUgcm9vdENhdXNlKSB7CisJc3VwZXIoIHJvb3RDYXVzZSApOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL0pzcFdyaXRlci5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL0pzcFdyaXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMTA1MGQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvSnNwV3JpdGVyLmphdmEKQEAgLTAsMCArMSw0NDIgQEAKKy8qCisqIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyAKK3BhY2thZ2UgamF2YXguc2VydmxldC5qc3A7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCisvKioKKyAqIDxwPgorICogVGhlIGFjdGlvbnMgYW5kIHRlbXBsYXRlIGRhdGEgaW4gYSBKU1AgcGFnZSBpcyB3cml0dGVuIHVzaW5nIHRoZQorICogSnNwV3JpdGVyIG9iamVjdCB0aGF0IGlzIHJlZmVyZW5jZWQgYnkgdGhlIGltcGxpY2l0IHZhcmlhYmxlIG91dCB3aGljaAorICogaXMgaW5pdGlhbGl6ZWQgYXV0b21hdGljYWxseSB1c2luZyBtZXRob2RzIGluIHRoZSBQYWdlQ29udGV4dCBvYmplY3QuCisgKjxwPgorICogVGhpcyBhYnN0cmFjdCBjbGFzcyBlbXVsYXRlcyBzb21lIG9mIHRoZSBmdW5jdGlvbmFsaXR5IGZvdW5kIGluIHRoZQorICogamF2YS5pby5CdWZmZXJlZFdyaXRlciBhbmQgamF2YS5pby5QcmludFdyaXRlciBjbGFzc2VzLAorICogaG93ZXZlciBpdCBkaWZmZXJzIGluIHRoYXQgaXQgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gZnJvbSB0aGUgcHJpbnQKKyAqIG1ldGhvZHMgd2hpbGUgUHJpbnRXcml0ZXIgZG9lcyBub3QuCisgKiA8cD48Qj5CdWZmZXJpbmc8L0I+CisgKiA8cD4KKyAqIFRoZSBpbml0aWFsIEpzcFdyaXRlciBvYmplY3QgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBQcmludFdyaXRlciBvYmplY3QKKyAqIG9mIHRoZSBTZXJ2bGV0UmVzcG9uc2UgaW4gYSB3YXkgdGhhdCBkZXBlbmRzIG9uIHdoZXRoZXIgdGhlIHBhZ2UgaXMgb3IKKyAqIGlzIG5vdCBidWZmZXJlZC4gSWYgdGhlIHBhZ2UgaXMgbm90IGJ1ZmZlcmVkLCBvdXRwdXQgd3JpdHRlbiB0byB0aGlzCisgKiBKc3BXcml0ZXIgb2JqZWN0IHdpbGwgYmUgd3JpdHRlbiB0aHJvdWdoIHRvIHRoZSBQcmludFdyaXRlciBkaXJlY3RseSwKKyAqIHdoaWNoIHdpbGwgYmUgY3JlYXRlZCBpZiBuZWNlc3NhcnkgYnkgaW52b2tpbmcgdGhlIGdldFdyaXRlcigpIG1ldGhvZAorICogb24gdGhlIHJlc3BvbnNlIG9iamVjdC4gQnV0IGlmIHRoZSBwYWdlIGlzIGJ1ZmZlcmVkLCB0aGUgUHJpbnRXcml0ZXIKKyAqIG9iamVjdCB3aWxsIG5vdCBiZSBjcmVhdGVkIHVudGlsIHRoZSBidWZmZXIgaXMgZmx1c2hlZCBhbmQKKyAqIG9wZXJhdGlvbnMgbGlrZSBzZXRDb250ZW50VHlwZSgpIGFyZSBsZWdhbC4gU2luY2UgdGhpcyBmbGV4aWJpbGl0eQorICogc2ltcGxpZmllcyBwcm9ncmFtbWluZyBzdWJzdGFudGlhbGx5LCBidWZmZXJpbmcgaXMgdGhlIGRlZmF1bHQgZm9yIEpTUAorICogcGFnZXMuCisgKiA8cD4KKyAqIEJ1ZmZlcmluZyByYWlzZXMgdGhlIGlzc3VlIG9mIHdoYXQgdG8gZG8gd2hlbiB0aGUgYnVmZmVyIGlzCisgKiBleGNlZWRlZC4gVHdvIGFwcHJvYWNoZXMgY2FuIGJlIHRha2VuOgorICogPHVsPgorICogPGxpPgorICogRXhjZWVkaW5nIHRoZSBidWZmZXIgaXMgbm90IGEgZmF0YWwgZXJyb3I7IHdoZW4gdGhlIGJ1ZmZlciBpcworICogZXhjZWVkZWQsIGp1c3QgZmx1c2ggdGhlIG91dHB1dC4KKyAqIDxsaT4KKyAqIEV4Y2VlZGluZyB0aGUgYnVmZmVyIGlzIGEgZmF0YWwgZXJyb3I7IHdoZW4gdGhlIGJ1ZmZlciBpcyBleGNlZWRlZCwKKyAqIHJhaXNlIGFuIGV4Y2VwdGlvbi4KKyAqIDwvdWw+CisgKiA8cD4KKyAqIEJvdGggYXBwcm9hY2hlcyBhcmUgdmFsaWQsIGFuZCB0aHVzIGJvdGggYXJlIHN1cHBvcnRlZCBpbiB0aGUgSlNQCisgKiB0ZWNobm9sb2d5LiBUaGUgYmVoYXZpb3Igb2YgYSBwYWdlIGlzIGNvbnRyb2xsZWQgYnkgdGhlIGF1dG9GbHVzaAorICogYXR0cmlidXRlLCB3aGljaCBkZWZhdWx0cyB0byB0cnVlLiBJbiBnZW5lcmFsLCBKU1AgcGFnZXMgdGhhdCBuZWVkIHRvCisgKiBiZSBzdXJlIHRoYXQgY29ycmVjdCBhbmQgY29tcGxldGUgZGF0YSBoYXMgYmVlbiBzZW50IHRvIHRoZWlyIGNsaWVudAorICogbWF5IHdhbnQgdG8gc2V0IGF1dG9GbHVzaCB0byBmYWxzZSwgd2l0aCBhIHR5cGljYWwgY2FzZSBiZWluZyB0aGF0CisgKiB3aGVyZSB0aGUgY2xpZW50IGlzIGFuIGFwcGxpY2F0aW9uIGl0c2VsZi4gT24gdGhlIG90aGVyIGhhbmQsIEpTUAorICogcGFnZXMgdGhhdCBzZW5kIGRhdGEgdGhhdCBpcyBtZWFuaW5nZnVsIGV2ZW4gd2hlbiBwYXJ0aWFsbHkKKyAqIGNvbnN0cnVjdGVkIG1heSB3YW50IHRvIHNldCBhdXRvRmx1c2ggdG8gdHJ1ZTsgc3VjaCBhcyB3aGVuIHRoZQorICogZGF0YSBpcyBzZW50IGZvciBpbW1lZGlhdGUgZGlzcGxheSB0aHJvdWdoIGEgYnJvd3Nlci4gRWFjaCBhcHBsaWNhdGlvbgorICogd2lsbCBuZWVkIHRvIGNvbnNpZGVyIHRoZWlyIHNwZWNpZmljIG5lZWRzLgorICogPHA+CisgKiBBbiBhbHRlcm5hdGl2ZSBjb25zaWRlcmVkIHdhcyB0byBtYWtlIHRoZSBidWZmZXIgc2l6ZSB1bmJvdW5kZWQ7IGJ1dCwKKyAqIHRoaXMgaGFkIHRoZSBkaXNhZHZhbnRhZ2UgdGhhdCBydW5hd2F5IGNvbXB1dGF0aW9ucyB3b3VsZCBjb25zdW1lIGFuCisgKiB1bmJvdW5kZWQgYW1vdW50IG9mIHJlc291cmNlcy4KKyAqIDxwPgorICogVGhlICJvdXQiIGltcGxpY2l0IHZhcmlhYmxlIG9mIGEgSlNQIGltcGxlbWVudGF0aW9uIGNsYXNzIGlzIG9mIHRoaXMgdHlwZS4KKyAqIElmIHRoZSBwYWdlIGRpcmVjdGl2ZSBzZWxlY3RzIGF1dG9mbHVzaD0idHJ1ZSIgdGhlbiBhbGwgdGhlIEkvTyBvcGVyYXRpb25zCisgKiBvbiB0aGlzIGNsYXNzIHNoYWxsIGF1dG9tYXRpY2FsbHkgZmx1c2ggdGhlIGNvbnRlbnRzIG9mIHRoZSBidWZmZXIgaWYgYW4KKyAqIG92ZXJmbG93IGNvbmRpdGlvbiB3b3VsZCByZXN1bHQgaWYgdGhlIGN1cnJlbnQgb3BlcmF0aW9uIHdlcmUgcGVyZm9ybWVkCisgKiB3aXRob3V0IGEgZmx1c2guIElmIGF1dG9mbHVzaD0iZmFsc2UiIHRoZW4gYWxsIHRoZSBJL08gb3BlcmF0aW9ucyBvbiB0aGlzCisgKiBjbGFzcyBzaGFsbCB0aHJvdyBhbiBJT0V4Y2VwdGlvbiBpZiBwZXJmb3JtaW5nIHRoZSBjdXJyZW50IG9wZXJhdGlvbiB3b3VsZAorICogcmVzdWx0IGluIGEgYnVmZmVyIG92ZXJmbG93IGNvbmRpdGlvbi4KKyAqCisgKiBAc2VlIGphdmEuaW8uV3JpdGVyCisgKiBAc2VlIGphdmEuaW8uQnVmZmVyZWRXcml0ZXIKKyAqIEBzZWUgamF2YS5pby5QcmludFdyaXRlcgorICovCisKK2Fic3RyYWN0IHB1YmxpYyBjbGFzcyBKc3BXcml0ZXIgZXh0ZW5kcyBqYXZhLmlvLldyaXRlciB7CisKKyAgICAvKioKKyAgICAgKiBDb25zdGFudCBpbmRpY2F0aW5nIHRoYXQgdGhlIFdyaXRlciBpcyBub3QgYnVmZmVyaW5nIG91dHB1dC4KKyAgICAgKi8KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50CU5PX0JVRkZFUiA9IDA7CisKKyAgICAvKioKKyAgICAgKiBDb25zdGFudCBpbmRpY2F0aW5nIHRoYXQgdGhlIFdyaXRlciBpcyBidWZmZXJlZCBhbmQgaXMgdXNpbmcgdGhlCisgICAgICogaW1wbGVtZW50YXRpb24gZGVmYXVsdCBidWZmZXIgc2l6ZS4KKyAgICAgKi8KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50CURFRkFVTFRfQlVGRkVSID0gLTE7CisKKyAgICAvKioKKyAgICAgKiBDb25zdGFudCBpbmRpY2F0aW5nIHRoYXQgdGhlIFdyaXRlciBpcyBidWZmZXJlZCBhbmQgaXMgdW5ib3VuZGVkOyB0aGlzCisgICAgICogaXMgdXNlZCBpbiBCb2R5Q29udGVudC4KKyAgICAgKi8KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50CVVOQk9VTkRFRF9CVUZGRVIgPSAtMjsKKworICAgIC8qKgorICAgICAqIFByb3RlY3RlZCBjb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBidWZmZXJTaXplIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgdG8gYmUgdXNlZCBieSB0aGUgSnNwV3JpdGVyCisgICAgICogQHBhcmFtIGF1dG9GbHVzaCB3aGV0aGVyIHRoZSBKc3BXcml0ZXIgc2hvdWxkIGJlIGF1dG9mbHVzaGluZworICAgICAqLworCisgICAgcHJvdGVjdGVkIEpzcFdyaXRlcihpbnQgYnVmZmVyU2l6ZSwgYm9vbGVhbiBhdXRvRmx1c2gpIHsKKwl0aGlzLmJ1ZmZlclNpemUgPSBidWZmZXJTaXplOworCXRoaXMuYXV0b0ZsdXNoICA9IGF1dG9GbHVzaDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZSBhIGxpbmUgc2VwYXJhdG9yLiAgVGhlIGxpbmUgc2VwYXJhdG9yIHN0cmluZyBpcyBkZWZpbmVkIGJ5IHRoZQorICAgICAqIHN5c3RlbSBwcm9wZXJ0eSA8dHQ+bGluZS5zZXBhcmF0b3I8L3R0PiwgYW5kIGlzIG5vdCBuZWNlc3NhcmlseSBhIHNpbmdsZQorICAgICAqIG5ld2xpbmUgKCdcbicpIGNoYXJhY3Rlci4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gIElPRXhjZXB0aW9uICBJZiBhbiBJL08gZXJyb3Igb2NjdXJzCisgICAgICovCisKKyAgICBhYnN0cmFjdCBwdWJsaWMgdm9pZCBuZXdMaW5lKCkgdGhyb3dzIElPRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogUHJpbnQgYSBib29sZWFuIHZhbHVlLiAgVGhlIHN0cmluZyBwcm9kdWNlZCBieSA8Y29kZT57QGxpbmsKKyAgICAgKiBqYXZhLmxhbmcuU3RyaW5nI3ZhbHVlT2YoYm9vbGVhbil9PC9jb2RlPiBpcyB3cml0dGVuIHRvIHRoZQorICAgICAqIEpzcFdyaXRlcidzIGJ1ZmZlciBvciwgaWYgbm8gYnVmZmVyIGlzIHVzZWQsIGRpcmVjdGx5IHRvIHRoZSAKKyAgICAgKiB1bmRlcmx5aW5nIHdyaXRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgICAgIGIgICBUaGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdG8gYmUgcHJpbnRlZAorICAgICAqIEB0aHJvd3MJICAgamF2YS5pby5JT0V4Y2VwdGlvbiBJZiBhbiBlcnJvciBvY2N1cmVkIHdoaWxlIHdyaXRpbmcKKyAgICAgKi8KKworICAgIGFic3RyYWN0IHB1YmxpYyB2b2lkIHByaW50KGJvb2xlYW4gYikgdGhyb3dzIElPRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogUHJpbnQgYSBjaGFyYWN0ZXIuICBUaGUgY2hhcmFjdGVyIGlzIHdyaXR0ZW4gdG8gdGhlCisgICAgICogSnNwV3JpdGVyJ3MgYnVmZmVyIG9yLCBpZiBubyBidWZmZXIgaXMgdXNlZCwgZGlyZWN0bHkgdG8gdGhlCisgICAgICogdW5kZXJseWluZyB3cml0ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gICAgICBjICAgVGhlIDxjb2RlPmNoYXI8L2NvZGU+IHRvIGJlIHByaW50ZWQKKyAgICAgKiBAdGhyb3dzCSAgIGphdmEuaW8uSU9FeGNlcHRpb24gSWYgYW4gZXJyb3Igb2NjdXJlZCB3aGlsZSB3cml0aW5nCisgICAgICovCisKKyAgICBhYnN0cmFjdCBwdWJsaWMgdm9pZCBwcmludChjaGFyIGMpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFByaW50IGFuIGludGVnZXIuICBUaGUgc3RyaW5nIHByb2R1Y2VkIGJ5IDxjb2RlPntAbGluaworICAgICAqIGphdmEubGFuZy5TdHJpbmcjdmFsdWVPZihpbnQpfTwvY29kZT4gaXMgd3JpdHRlbiB0byB0aGUKKyAgICAgKiBKc3BXcml0ZXIncyBidWZmZXIgb3IsIGlmIG5vIGJ1ZmZlciBpcyB1c2VkLCBkaXJlY3RseSB0byB0aGUKKyAgICAgKiB1bmRlcmx5aW5nIHdyaXRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgICAgIGkgICBUaGUgPGNvZGU+aW50PC9jb2RlPiB0byBiZSBwcmludGVkCisgICAgICogQHNlZSAgICAgICAgamF2YS5sYW5nLkludGVnZXIjdG9TdHJpbmcoaW50KQorICAgICAqIEB0aHJvd3MJICAgamF2YS5pby5JT0V4Y2VwdGlvbiBJZiBhbiBlcnJvciBvY2N1cmVkIHdoaWxlIHdyaXRpbmcKKyAgICAgKi8KKworICAgIGFic3RyYWN0IHB1YmxpYyB2b2lkIHByaW50KGludCBpKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBQcmludCBhIGxvbmcgaW50ZWdlci4gIFRoZSBzdHJpbmcgcHJvZHVjZWQgYnkgPGNvZGU+e0BsaW5rCisgICAgICogamF2YS5sYW5nLlN0cmluZyN2YWx1ZU9mKGxvbmcpfTwvY29kZT4gaXMgd3JpdHRlbiB0byB0aGUKKyAgICAgKiBKc3BXcml0ZXIncyBidWZmZXIgb3IsIGlmIG5vIGJ1ZmZlciBpcyB1c2VkLCBkaXJlY3RseSB0byB0aGUKKyAgICAgKiB1bmRlcmx5aW5nIHdyaXRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgICAgIGwgICBUaGUgPGNvZGU+bG9uZzwvY29kZT4gdG8gYmUgcHJpbnRlZAorICAgICAqIEBzZWUgICAgICAgIGphdmEubGFuZy5Mb25nI3RvU3RyaW5nKGxvbmcpCisgICAgICogQHRocm93cwkgICBqYXZhLmlvLklPRXhjZXB0aW9uIElmIGFuIGVycm9yIG9jY3VyZWQgd2hpbGUgd3JpdGluZworICAgICAqLworCisgICAgYWJzdHJhY3QgcHVibGljIHZvaWQgcHJpbnQobG9uZyBsKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBQcmludCBhIGZsb2F0aW5nLXBvaW50IG51bWJlci4gIFRoZSBzdHJpbmcgcHJvZHVjZWQgYnkgPGNvZGU+e0BsaW5rCisgICAgICogamF2YS5sYW5nLlN0cmluZyN2YWx1ZU9mKGZsb2F0KX08L2NvZGU+IGlzIHdyaXR0ZW4gdG8gdGhlCisgICAgICogSnNwV3JpdGVyJ3MgYnVmZmVyIG9yLCBpZiBubyBidWZmZXIgaXMgdXNlZCwgZGlyZWN0bHkgdG8gdGhlCisgICAgICogdW5kZXJseWluZyB3cml0ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gICAgICBmICAgVGhlIDxjb2RlPmZsb2F0PC9jb2RlPiB0byBiZSBwcmludGVkCisgICAgICogQHNlZSAgICAgICAgamF2YS5sYW5nLkZsb2F0I3RvU3RyaW5nKGZsb2F0KQorICAgICAqIEB0aHJvd3MJICAgamF2YS5pby5JT0V4Y2VwdGlvbiBJZiBhbiBlcnJvciBvY2N1cmVkIHdoaWxlIHdyaXRpbmcKKyAgICAgKi8KKworICAgIGFic3RyYWN0IHB1YmxpYyB2b2lkIHByaW50KGZsb2F0IGYpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFByaW50IGEgZG91YmxlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCBudW1iZXIuICBUaGUgc3RyaW5nIHByb2R1Y2VkIGJ5CisgICAgICogPGNvZGU+e0BsaW5rIGphdmEubGFuZy5TdHJpbmcjdmFsdWVPZihkb3VibGUpfTwvY29kZT4gaXMgd3JpdHRlbiB0bworICAgICAqIHRoZSBKc3BXcml0ZXIncyBidWZmZXIgb3IsIGlmIG5vIGJ1ZmZlciBpcyB1c2VkLCBkaXJlY3RseSB0byB0aGUKKyAgICAgKiB1bmRlcmx5aW5nIHdyaXRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgICAgIGQgICBUaGUgPGNvZGU+ZG91YmxlPC9jb2RlPiB0byBiZSBwcmludGVkCisgICAgICogQHNlZSAgICAgICAgamF2YS5sYW5nLkRvdWJsZSN0b1N0cmluZyhkb3VibGUpCisgICAgICogQHRocm93cwkgICBqYXZhLmlvLklPRXhjZXB0aW9uIElmIGFuIGVycm9yIG9jY3VyZWQgd2hpbGUgd3JpdGluZworICAgICAqLworCisgICAgYWJzdHJhY3QgcHVibGljIHZvaWQgcHJpbnQoZG91YmxlIGQpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFByaW50IGFuIGFycmF5IG9mIGNoYXJhY3RlcnMuICBUaGUgY2hhcmFjdGVycyBhcmUgd3JpdHRlbiB0byB0aGUKKyAgICAgKiBKc3BXcml0ZXIncyBidWZmZXIgb3IsIGlmIG5vIGJ1ZmZlciBpcyB1c2VkLCBkaXJlY3RseSB0byB0aGUKKyAgICAgKiB1bmRlcmx5aW5nIHdyaXRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgICAgIHMgICBUaGUgYXJyYXkgb2YgY2hhcnMgdG8gYmUgcHJpbnRlZAorICAgICAqCisgICAgICogQHRocm93cyAgTnVsbFBvaW50ZXJFeGNlcHRpb24gIElmIDxjb2RlPnM8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+CisgICAgICogQHRocm93cwkgICBqYXZhLmlvLklPRXhjZXB0aW9uIElmIGFuIGVycm9yIG9jY3VyZWQgd2hpbGUgd3JpdGluZworICAgICAqLworCisgICAgYWJzdHJhY3QgcHVibGljIHZvaWQgcHJpbnQoY2hhciBzW10pIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFByaW50IGEgc3RyaW5nLiAgSWYgdGhlIGFyZ3VtZW50IGlzIDxjb2RlPm51bGw8L2NvZGU+IHRoZW4gdGhlIHN0cmluZworICAgICAqIDxjb2RlPiJudWxsIjwvY29kZT4gaXMgcHJpbnRlZC4gIE90aGVyd2lzZSwgdGhlIHN0cmluZydzIGNoYXJhY3RlcnMgYXJlCisgICAgICogd3JpdHRlbiB0byB0aGUgSnNwV3JpdGVyJ3MgYnVmZmVyIG9yLCBpZiBubyBidWZmZXIgaXMgdXNlZCwgZGlyZWN0bHkKKyAgICAgKiB0byB0aGUgdW5kZXJseWluZyB3cml0ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gICAgICBzICAgVGhlIDxjb2RlPlN0cmluZzwvY29kZT4gdG8gYmUgcHJpbnRlZAorICAgICAqIEB0aHJvd3MJICAgamF2YS5pby5JT0V4Y2VwdGlvbiBJZiBhbiBlcnJvciBvY2N1cmVkIHdoaWxlIHdyaXRpbmcKKyAgICAgKi8KKworICAgIGFic3RyYWN0IHB1YmxpYyB2b2lkIHByaW50KFN0cmluZyBzKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBQcmludCBhbiBvYmplY3QuICBUaGUgc3RyaW5nIHByb2R1Y2VkIGJ5IHRoZSA8Y29kZT57QGxpbmsKKyAgICAgKiBqYXZhLmxhbmcuU3RyaW5nI3ZhbHVlT2YoT2JqZWN0KX08L2NvZGU+IG1ldGhvZCBpcyB3cml0dGVuIHRvIHRoZQorICAgICAqIEpzcFdyaXRlcidzIGJ1ZmZlciBvciwgaWYgbm8gYnVmZmVyIGlzIHVzZWQsIGRpcmVjdGx5IHRvIHRoZQorICAgICAqIHVuZGVybHlpbmcgd3JpdGVyLgorICAgICAqCisgICAgICogQHBhcmFtICAgICAgb2JqICAgVGhlIDxjb2RlPk9iamVjdDwvY29kZT4gdG8gYmUgcHJpbnRlZAorICAgICAqIEBzZWUgICAgICAgIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQorICAgICAqIEB0aHJvd3MJICAgamF2YS5pby5JT0V4Y2VwdGlvbiBJZiBhbiBlcnJvciBvY2N1cmVkIHdoaWxlIHdyaXRpbmcKKyAgICAgKi8KKworICAgIGFic3RyYWN0IHB1YmxpYyB2b2lkIHByaW50KE9iamVjdCBvYmopIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFRlcm1pbmF0ZSB0aGUgY3VycmVudCBsaW5lIGJ5IHdyaXRpbmcgdGhlIGxpbmUgc2VwYXJhdG9yIHN0cmluZy4gIFRoZQorICAgICAqIGxpbmUgc2VwYXJhdG9yIHN0cmluZyBpcyBkZWZpbmVkIGJ5IHRoZSBzeXN0ZW0gcHJvcGVydHkKKyAgICAgKiA8Y29kZT5saW5lLnNlcGFyYXRvcjwvY29kZT4sIGFuZCBpcyBub3QgbmVjZXNzYXJpbHkgYSBzaW5nbGUgbmV3bGluZQorICAgICAqIGNoYXJhY3RlciAoPGNvZGU+J1xuJzwvY29kZT4pLgorICAgICAqIEB0aHJvd3MJICAgamF2YS5pby5JT0V4Y2VwdGlvbiBJZiBhbiBlcnJvciBvY2N1cmVkIHdoaWxlIHdyaXRpbmcKKyAgICAgKi8KKworICAgIGFic3RyYWN0IHB1YmxpYyB2b2lkIHByaW50bG4oKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBQcmludCBhIGJvb2xlYW4gdmFsdWUgYW5kIHRoZW4gdGVybWluYXRlIHRoZSBsaW5lLiAgVGhpcyBtZXRob2QgYmVoYXZlcworICAgICAqIGFzIHRob3VnaCBpdCBpbnZva2VzIDxjb2RlPntAbGluayAjcHJpbnQoYm9vbGVhbil9PC9jb2RlPiBhbmQgdGhlbgorICAgICAqIDxjb2RlPntAbGluayAjcHJpbnRsbigpfTwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gICAgICB4IHRoZSBib29sZWFuIHRvIHdyaXRlCisgICAgICogQHRocm93cwkgICBqYXZhLmlvLklPRXhjZXB0aW9uIElmIGFuIGVycm9yIG9jY3VyZWQgd2hpbGUgd3JpdGluZworICAgICAqLworCisgICAgYWJzdHJhY3QgcHVibGljIHZvaWQgcHJpbnRsbihib29sZWFuIHgpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFByaW50IGEgY2hhcmFjdGVyIGFuZCB0aGVuIHRlcm1pbmF0ZSB0aGUgbGluZS4gIFRoaXMgbWV0aG9kIGJlaGF2ZXMgYXMKKyAgICAgKiB0aG91Z2ggaXQgaW52b2tlcyA8Y29kZT57QGxpbmsgI3ByaW50KGNoYXIpfTwvY29kZT4gYW5kIHRoZW4gPGNvZGU+e0BsaW5rCisgICAgICogI3ByaW50bG4oKX08L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtICAgICAgeCB0aGUgY2hhciB0byB3cml0ZQorICAgICAqIEB0aHJvd3MJICAgamF2YS5pby5JT0V4Y2VwdGlvbiBJZiBhbiBlcnJvciBvY2N1cmVkIHdoaWxlIHdyaXRpbmcKKyAgICAgKi8KKworICAgIGFic3RyYWN0IHB1YmxpYyB2b2lkIHByaW50bG4oY2hhciB4KSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBQcmludCBhbiBpbnRlZ2VyIGFuZCB0aGVuIHRlcm1pbmF0ZSB0aGUgbGluZS4gIFRoaXMgbWV0aG9kIGJlaGF2ZXMgYXMKKyAgICAgKiB0aG91Z2ggaXQgaW52b2tlcyA8Y29kZT57QGxpbmsgI3ByaW50KGludCl9PC9jb2RlPiBhbmQgdGhlbiA8Y29kZT57QGxpbmsKKyAgICAgKiAjcHJpbnRsbigpfTwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gICAgICB4IHRoZSBpbnQgdG8gd3JpdGUKKyAgICAgKiBAdGhyb3dzCSAgIGphdmEuaW8uSU9FeGNlcHRpb24gSWYgYW4gZXJyb3Igb2NjdXJlZCB3aGlsZSB3cml0aW5nCisgICAgICovCisKKyAgICBhYnN0cmFjdCBwdWJsaWMgdm9pZCBwcmludGxuKGludCB4KSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBQcmludCBhIGxvbmcgaW50ZWdlciBhbmQgdGhlbiB0ZXJtaW5hdGUgdGhlIGxpbmUuICBUaGlzIG1ldGhvZCBiZWhhdmVzCisgICAgICogYXMgdGhvdWdoIGl0IGludm9rZXMgPGNvZGU+e0BsaW5rICNwcmludChsb25nKX08L2NvZGU+IGFuZCB0aGVuCisgICAgICogPGNvZGU+e0BsaW5rICNwcmludGxuKCl9PC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgICAgIHggdGhlIGxvbmcgdG8gd3JpdGUKKyAgICAgKiBAdGhyb3dzCSAgIGphdmEuaW8uSU9FeGNlcHRpb24gSWYgYW4gZXJyb3Igb2NjdXJlZCB3aGlsZSB3cml0aW5nCisgICAgICovCisKKyAgICBhYnN0cmFjdCBwdWJsaWMgdm9pZCBwcmludGxuKGxvbmcgeCkgdGhyb3dzIElPRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogUHJpbnQgYSBmbG9hdGluZy1wb2ludCBudW1iZXIgYW5kIHRoZW4gdGVybWluYXRlIHRoZSBsaW5lLiAgVGhpcyBtZXRob2QKKyAgICAgKiBiZWhhdmVzIGFzIHRob3VnaCBpdCBpbnZva2VzIDxjb2RlPntAbGluayAjcHJpbnQoZmxvYXQpfTwvY29kZT4gYW5kIHRoZW4KKyAgICAgKiA8Y29kZT57QGxpbmsgI3ByaW50bG4oKX08L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtICAgICAgeCB0aGUgZmxvYXQgdG8gd3JpdGUKKyAgICAgKiBAdGhyb3dzCSAgIGphdmEuaW8uSU9FeGNlcHRpb24gSWYgYW4gZXJyb3Igb2NjdXJlZCB3aGlsZSB3cml0aW5nCisgICAgICovCisKKyAgICBhYnN0cmFjdCBwdWJsaWMgdm9pZCBwcmludGxuKGZsb2F0IHgpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFByaW50IGEgZG91YmxlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCBudW1iZXIgYW5kIHRoZW4gdGVybWluYXRlIHRoZQorICAgICAqIGxpbmUuICBUaGlzIG1ldGhvZCBiZWhhdmVzIGFzIHRob3VnaCBpdCBpbnZva2VzIDxjb2RlPntAbGluaworICAgICAqICNwcmludChkb3VibGUpfTwvY29kZT4gYW5kIHRoZW4gPGNvZGU+e0BsaW5rICNwcmludGxuKCl9PC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgICAgIHggdGhlIGRvdWJsZSB0byB3cml0ZQorICAgICAqIEB0aHJvd3MJICAgamF2YS5pby5JT0V4Y2VwdGlvbiBJZiBhbiBlcnJvciBvY2N1cmVkIHdoaWxlIHdyaXRpbmcKKyAgICAgKi8KKworICAgIGFic3RyYWN0IHB1YmxpYyB2b2lkIHByaW50bG4oZG91YmxlIHgpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFByaW50IGFuIGFycmF5IG9mIGNoYXJhY3RlcnMgYW5kIHRoZW4gdGVybWluYXRlIHRoZSBsaW5lLiAgVGhpcyBtZXRob2QKKyAgICAgKiBiZWhhdmVzIGFzIHRob3VnaCBpdCBpbnZva2VzIDxjb2RlPnByaW50KGNoYXJbXSk8L2NvZGU+IGFuZCB0aGVuCisgICAgICogPGNvZGU+cHJpbnRsbigpPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgICAgIHggdGhlIGNoYXJbXSB0byB3cml0ZQorICAgICAqIEB0aHJvd3MJICAgamF2YS5pby5JT0V4Y2VwdGlvbiBJZiBhbiBlcnJvciBvY2N1cmVkIHdoaWxlIHdyaXRpbmcKKyAgICAgKi8KKworICAgIGFic3RyYWN0IHB1YmxpYyB2b2lkIHByaW50bG4oY2hhciB4W10pIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFByaW50IGEgU3RyaW5nIGFuZCB0aGVuIHRlcm1pbmF0ZSB0aGUgbGluZS4gIFRoaXMgbWV0aG9kIGJlaGF2ZXMgYXMKKyAgICAgKiB0aG91Z2ggaXQgaW52b2tlcyA8Y29kZT57QGxpbmsgI3ByaW50KFN0cmluZyl9PC9jb2RlPiBhbmQgdGhlbgorICAgICAqIDxjb2RlPntAbGluayAjcHJpbnRsbigpfTwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gICAgICB4IHRoZSBTdHJpbmcgdG8gd3JpdGUKKyAgICAgKiBAdGhyb3dzCSAgIGphdmEuaW8uSU9FeGNlcHRpb24gSWYgYW4gZXJyb3Igb2NjdXJlZCB3aGlsZSB3cml0aW5nCisgICAgICovCisKKyAgICBhYnN0cmFjdCBwdWJsaWMgdm9pZCBwcmludGxuKFN0cmluZyB4KSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBQcmludCBhbiBPYmplY3QgYW5kIHRoZW4gdGVybWluYXRlIHRoZSBsaW5lLiAgVGhpcyBtZXRob2QgYmVoYXZlcyBhcworICAgICAqIHRob3VnaCBpdCBpbnZva2VzIDxjb2RlPntAbGluayAjcHJpbnQoT2JqZWN0KX08L2NvZGU+IGFuZCB0aGVuCisgICAgICogPGNvZGU+e0BsaW5rICNwcmludGxuKCl9PC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgICAgIHggdGhlIE9iamVjdCB0byB3cml0ZQorICAgICAqIEB0aHJvd3MJICAgamF2YS5pby5JT0V4Y2VwdGlvbiBJZiBhbiBlcnJvciBvY2N1cmVkIHdoaWxlIHdyaXRpbmcKKyAgICAgKi8KKworICAgIGFic3RyYWN0IHB1YmxpYyB2b2lkIHByaW50bG4oT2JqZWN0IHgpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworCisgICAgLyoqCisgICAgICogQ2xlYXIgdGhlIGNvbnRlbnRzIG9mIHRoZSBidWZmZXIuIElmIHRoZSBidWZmZXIgaGFzIGJlZW4gYWxyZWFkeQorICAgICAqIGJlZW4gZmx1c2hlZCB0aGVuIHRoZSBjbGVhciBvcGVyYXRpb24gc2hhbGwgdGhyb3cgYW4gSU9FeGNlcHRpb24KKyAgICAgKiB0byBzaWduYWwgdGhlIGZhY3QgdGhhdCBzb21lIGRhdGEgaGFzIGFscmVhZHkgYmVlbiBpcnJldm9jYWJseSAKKyAgICAgKiB3cml0dGVuIHRvIHRoZSBjbGllbnQgcmVzcG9uc2Ugc3RyZWFtLgorICAgICAqCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgkJSWYgYW4gSS9PIGVycm9yIG9jY3VycworICAgICAqLworCisgICAgYWJzdHJhY3QgcHVibGljIHZvaWQgY2xlYXIoKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBDbGVhcnMgdGhlIGN1cnJlbnQgY29udGVudHMgb2YgdGhlIGJ1ZmZlci4gVW5saWtlIGNsZWFyKCksIHRoaXMKKyAgICAgKiBtZXRob2Qgd2lsbCBub3QgdGhyb3cgYW4gSU9FeGNlcHRpb24gaWYgdGhlIGJ1ZmZlciBoYXMgYWxyZWFkeSBiZWVuCisgICAgICogZmx1c2hlZC4gSXQgbWVyZWx5IGNsZWFycyB0aGUgY3VycmVudCBjb250ZW50IG9mIHRoZSBidWZmZXIgYW5kCisgICAgICogcmV0dXJucy4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24JCUlmIGFuIEkvTyBlcnJvciBvY2N1cnMKKyAgICAgKi8KKworICAgIGFic3RyYWN0IHB1YmxpYyB2b2lkIGNsZWFyQnVmZmVyKCkgdGhyb3dzIElPRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogRmx1c2ggdGhlIHN0cmVhbS4gIElmIHRoZSBzdHJlYW0gaGFzIHNhdmVkIGFueSBjaGFyYWN0ZXJzIGZyb20gdGhlCisgICAgICogdmFyaW91cyB3cml0ZSgpIG1ldGhvZHMgaW4gYSBidWZmZXIsIHdyaXRlIHRoZW0gaW1tZWRpYXRlbHkgdG8gdGhlaXIKKyAgICAgKiBpbnRlbmRlZCBkZXN0aW5hdGlvbi4gIFRoZW4sIGlmIHRoYXQgZGVzdGluYXRpb24gaXMgYW5vdGhlciBjaGFyYWN0ZXIgb3IKKyAgICAgKiBieXRlIHN0cmVhbSwgZmx1c2ggaXQuICBUaHVzIG9uZSBmbHVzaCgpIGludm9jYXRpb24gd2lsbCBmbHVzaCBhbGwgdGhlCisgICAgICogYnVmZmVycyBpbiBhIGNoYWluIG9mIFdyaXRlcnMgYW5kIE91dHB1dFN0cmVhbXMuCisgICAgICogPHA+CisgICAgICogVGhlIG1ldGhvZCBtYXkgYmUgaW52b2tlZCBpbmRpcmVjdGx5IGlmIHRoZSBidWZmZXIgc2l6ZSBpcyBleGNlZWRlZC4KKyAgICAgKiA8cD4KKyAgICAgKiBPbmNlIGEgc3RyZWFtIGhhcyBiZWVuIGNsb3NlZCwKKyAgICAgKiBmdXJ0aGVyIHdyaXRlKCkgb3IgZmx1c2goKSBpbnZvY2F0aW9ucyB3aWxsIGNhdXNlIGFuIElPRXhjZXB0aW9uIHRvIGJlCisgICAgICogdGhyb3duLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiAgSU9FeGNlcHRpb24gIElmIGFuIEkvTyBlcnJvciBvY2N1cnMKKyAgICAgKi8KKworICAgIGFic3RyYWN0IHB1YmxpYyB2b2lkIGZsdXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogQ2xvc2UgdGhlIHN0cmVhbSwgZmx1c2hpbmcgaXQgZmlyc3QuCisgICAgICogPHA+CisgICAgICogVGhpcyBtZXRob2QgbmVlZHMgbm90IGJlIGludm9rZWQgZXhwbGljaXRseSBmb3IgdGhlIGluaXRpYWwgSnNwV3JpdGVyCisgICAgICogYXMgdGhlIGNvZGUgZ2VuZXJhdGVkIGJ5IHRoZSBKU1AgY29udGFpbmVyIHdpbGwgYXV0b21hdGljYWxseQorICAgICAqIGluY2x1ZGUgYSBjYWxsIHRvIGNsb3NlKCkuCisgICAgICogPHA+CisgICAgICogQ2xvc2luZyBhIHByZXZpb3VzbHktY2xvc2VkIHN0cmVhbSwgdW5saWtlIGZsdXNoKCksIGhhcyBubyBlZmZlY3QuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uICBJT0V4Y2VwdGlvbiAgSWYgYW4gSS9PIGVycm9yIG9jY3VycworICAgICAqLworCisgICAgYWJzdHJhY3QgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgdXNlZCBieSB0aGUgSnNwV3JpdGVyLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIGluIGJ5dGVzLCBvciAwIGlzIHVuYnVmZmVyZWQuCisgICAgICovCisKKyAgICBwdWJsaWMgaW50IGdldEJ1ZmZlclNpemUoKSB7IHJldHVybiBidWZmZXJTaXplOyB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBudW1iZXIgb2YgdW51c2VkIGJ5dGVzIGluIHRoZSBidWZmZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgdW51c2VkIGluIHRoZSBidWZmZXIKKyAgICAgKi8KKworICAgIGFic3RyYWN0IHB1YmxpYyBpbnQgZ2V0UmVtYWluaW5nKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgSnNwV3JpdGVyIGlzIGF1dG9GbHVzaGluZy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gaWYgdGhpcyBKc3BXcml0ZXIgaXMgYXV0byBmbHVzaGluZyBvciB0aHJvd2luZyBJT0V4Y2VwdGlvbnMgCisgICAgICogICAgIG9uIGJ1ZmZlciBvdmVyZmxvdyBjb25kaXRpb25zCisgICAgICovCisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0F1dG9GbHVzaCgpIHsgcmV0dXJuIGF1dG9GbHVzaDsgfQorCisgICAgLyoKKyAgICAgKiBmaWVsZHMKKyAgICAgKi8KKworICAgIC8qKgorICAgICAqIFRoZSBzaXplIG9mIHRoZSBidWZmZXIgdXNlZCBieSB0aGUgSnNwV3JpdGVyLgorICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgICAgIGJ1ZmZlclNpemU7CisgICAgCisgICAgLyoqCisgICAgICogV2hldGhlciB0aGUgSnNwV3JpdGVyIGlzIGF1dG9mbHVzaGluZy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhdXRvRmx1c2g7Cit9CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvUGFnZUNvbnRleHQuamF2YSBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC9QYWdlQ29udGV4dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxOTA2MTkKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvUGFnZUNvbnRleHQuamF2YQpAQCAtMCwwICsxLDUyMiBAQAorLyoKKyogQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworIAorcGFja2FnZSBqYXZheC5zZXJ2bGV0LmpzcDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXQ7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29uZmlnOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVzcG9uc2U7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuQm9keUNvbnRlbnQ7CisKKy8qKgorICogPHA+CisgKiBQYWdlQ29udGV4dCBleHRlbmRzIEpzcENvbnRleHQgdG8gcHJvdmlkZSB1c2VmdWwgY29udGV4dCBpbmZvcm1hdGlvbiBmb3IKKyAqIHdoZW4gSlNQIHRlY2hub2xvZ3kgaXMgdXNlZCBpbiBhIFNlcnZsZXQgZW52aXJvbm1lbnQuCisgKiA8cD4KKyAqIEEgUGFnZUNvbnRleHQgaW5zdGFuY2UgcHJvdmlkZXMgYWNjZXNzIHRvIGFsbCB0aGUgbmFtZXNwYWNlcyBhc3NvY2lhdGVkCisgKiB3aXRoIGEgSlNQIHBhZ2UsIHByb3ZpZGVzIGFjY2VzcyB0byBzZXZlcmFsIHBhZ2UgYXR0cmlidXRlcywgYXMgd2VsbCBhcworICogYSBsYXllciBhYm92ZSB0aGUgaW1wbGVtZW50YXRpb24gZGV0YWlscy4gIEltcGxpY2l0IG9iamVjdHMgYXJlIGFkZGVkCisgKiB0byB0aGUgcGFnZUNvbnRleHQgYXV0b21hdGljYWxseS4KKyAqCisgKiA8cD4gVGhlIDxjb2RlPiBQYWdlQ29udGV4dCA8L2NvZGU+IGNsYXNzIGlzIGFuIGFic3RyYWN0IGNsYXNzLCBkZXNpZ25lZCB0byBiZQorICogZXh0ZW5kZWQgdG8gcHJvdmlkZSBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQgaW1wbGVtZW50YXRpb25zIHRoZXJlb2YsIGJ5CisgKiBjb25mb3JtYW50IEpTUCBlbmdpbmUgcnVudGltZSBlbnZpcm9ubWVudHMuIEEgUGFnZUNvbnRleHQgaW5zdGFuY2UgaXMgCisgKiBvYnRhaW5lZCBieSBhIEpTUCBpbXBsZW1lbnRhdGlvbiBjbGFzcyBieSBjYWxsaW5nIHRoZQorICogSnNwRmFjdG9yeS5nZXRQYWdlQ29udGV4dCgpIG1ldGhvZCwgYW5kIGlzIHJlbGVhc2VkIGJ5IGNhbGxpbmcKKyAqIEpzcEZhY3RvcnkucmVsZWFzZVBhZ2VDb250ZXh0KCkuCisgKgorICogPHA+IEFuIGV4YW1wbGUgb2YgaG93IFBhZ2VDb250ZXh0LCBKc3BGYWN0b3J5LCBhbmQgb3RoZXIgY2xhc3NlcyBjYW4gYmUKKyAqIHVzZWQgIHdpdGhpbiBhIEpTUCBQYWdlIEltcGxlbWVudGF0aW9uIG9iamVjdCBpcyBnaXZlbiBlbHNld2hlcmUuCisgKgorICogPHA+CisgKiBUaGUgUGFnZUNvbnRleHQgcHJvdmlkZXMgYSBudW1iZXIgb2YgZmFjaWxpdGllcyB0byB0aGUgcGFnZS9jb21wb25lbnQgCisgKiBhdXRob3IgYW5kIHBhZ2UgaW1wbGVtZW50b3IsIGluY2x1ZGluZzoKKyAqIDx1bD4KKyAqIDxsaT5hIHNpbmdsZSBBUEkgdG8gbWFuYWdlIHRoZSB2YXJpb3VzIHNjb3BlZCBuYW1lc3BhY2VzCisgKiA8bGk+YSBudW1iZXIgb2YgY29udmVuaWVuY2UgQVBJJ3MgdG8gYWNjZXNzIHZhcmlvdXMgcHVibGljIG9iamVjdHMKKyAqIDxsaT5hIG1lY2hhbmlzbSB0byBvYnRhaW4gdGhlIEpzcFdyaXRlciBmb3Igb3V0cHV0CisgKiA8bGk+YSBtZWNoYW5pc20gdG8gbWFuYWdlIHNlc3Npb24gdXNhZ2UgYnkgdGhlIHBhZ2UKKyAqIDxsaT5hIG1lY2hhbmlzbSB0byBleHBvc2UgcGFnZSBkaXJlY3RpdmUgYXR0cmlidXRlcyB0byB0aGUgc2NyaXB0aW5nIAorICogICAgIGVudmlyb25tZW50CisgKiA8bGk+bWVjaGFuaXNtcyB0byBmb3J3YXJkIG9yIGluY2x1ZGUgdGhlIGN1cnJlbnQgcmVxdWVzdCB0byBvdGhlciBhY3RpdmUgCisgKiAgICAgY29tcG9uZW50cyBpbiB0aGUgYXBwbGljYXRpb24KKyAqIDxsaT5hIG1lY2hhbmlzbSB0byBoYW5kbGUgZXJyb3JwYWdlIGV4Y2VwdGlvbiBwcm9jZXNzaW5nCisgKiA8L3VsPgorICoKKyAqIDxwPjxCPk1ldGhvZHMgSW50ZW5kZWQgZm9yIENvbnRhaW5lciBHZW5lcmF0ZWQgQ29kZTwvQj4KKyAqIDxwPlNvbWUgbWV0aG9kcyBhcmUgaW50ZW5kZWQgdG8gYmUgdXNlZCBieSB0aGUgY29kZSBnZW5lcmF0ZWQgYnkgdGhlCisgKiBjb250YWluZXIsIG5vdCBieSBjb2RlIHdyaXR0ZW4gYnkgSlNQIHBhZ2UgYXV0aG9ycywgb3IgSlNQIHRhZyBsaWJyYXJ5IAorICogYXV0aG9ycy4KKyAqIDxwPlRoZSBtZXRob2RzIHN1cHBvcnRpbmcgPEI+bGlmZWN5Y2xlPC9CPiBhcmUgPGNvZGU+aW5pdGlhbGl6ZSgpPC9jb2RlPgorICogYW5kIDxjb2RlPnJlbGVhc2UoKTwvY29kZT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgbWV0aG9kcyBlbmFibGUgdGhlIDxCPm1hbmFnZW1lbnQgb2YgbmVzdGVkPC9CPiBKc3BXcml0ZXIgCisgKiBzdHJlYW1zIHRvIGltcGxlbWVudCBUYWcgRXh0ZW5zaW9uczogPGNvZGU+cHVzaEJvZHkoKTwvY29kZT4KKyAqCisgKiA8cD48Qj5NZXRob2RzIEludGVuZGVkIGZvciBKU1AgYXV0aG9yczwvQj4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBtZXRob2RzIHByb3ZpZGUgPEI+Y29udmVuaWVudCBhY2Nlc3M8L0I+IHRvIGltcGxpY2l0IG9iamVjdHM6CisgKiA8Y29kZT5nZXRFeGNlcHRpb24oKTwvY29kZT4sICA8Y29kZT5nZXRQYWdlKCk8L2NvZGU+CisgKiA8Y29kZT5nZXRSZXF1ZXN0KCk8L2NvZGU+LCAgPGNvZGU+Z2V0UmVzcG9uc2UoKTwvY29kZT4sCisgKiA8Y29kZT5nZXRTZXNzaW9uKCk8L2NvZGU+LCAgPGNvZGU+Z2V0U2VydmxldENvbmZpZygpPC9jb2RlPgorICogYW5kIDxjb2RlPmdldFNlcnZsZXRDb250ZXh0KCk8L2NvZGU+LgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBtZXRob2RzIHByb3ZpZGUgc3VwcG9ydCBmb3IgPEI+Zm9yd2FyZGluZywgaW5jbHVzaW9uCisgKiBhbmQgZXJyb3IgaGFuZGxpbmc8L0I+OgorICogPGNvZGU+Zm9yd2FyZCgpPC9jb2RlPiwgIDxjb2RlPmluY2x1ZGUoKTwvY29kZT4sCisgKiBhbmQgIDxjb2RlPmhhbmRsZVBhZ2VFeGNlcHRpb24oKTwvY29kZT4uCisgKi8KKworYWJzdHJhY3QgcHVibGljIGNsYXNzIFBhZ2VDb250ZXh0IAorICAgIGV4dGVuZHMgSnNwQ29udGV4dAoreworICAgIAorICAgIC8qKgorICAgICAqIFNvbGUgY29uc3RydWN0b3IuIChGb3IgaW52b2NhdGlvbiBieSBzdWJjbGFzcyBjb25zdHJ1Y3RvcnMsIAorICAgICAqIHR5cGljYWxseSBpbXBsaWNpdC4pCisgICAgICovCisgICAgcHVibGljIFBhZ2VDb250ZXh0KCkgeworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBQYWdlIHNjb3BlOiAodGhpcyBpcyB0aGUgZGVmYXVsdCkgdGhlIG5hbWVkIHJlZmVyZW5jZSByZW1haW5zIGF2YWlsYWJsZQorICAgICAqIGluIHRoaXMgUGFnZUNvbnRleHQgdW50aWwgdGhlIHJldHVybiBmcm9tIHRoZSBjdXJyZW50IFNlcnZsZXQuc2VydmljZSgpCisgICAgICogaW52b2NhdGlvbi4KKyAgICAgKi8KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBR0VfU0NPUEUJCT0gMTsKKworICAgIC8qKgorICAgICAqIFJlcXVlc3Qgc2NvcGU6IHRoZSBuYW1lZCByZWZlcmVuY2UgcmVtYWlucyBhdmFpbGFibGUgZnJvbSB0aGUgCisgICAgICogU2VydmxldFJlcXVlc3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBTZXJ2bGV0IHVudGlsIHRoZSBjdXJyZW50IHJlcXVlc3QgCisgICAgICogaXMgY29tcGxldGVkLgorICAgICAqLworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVRVUVTVF9TQ09QRQk9IDI7CisKKyAgICAvKioKKyAgICAgKiBTZXNzaW9uIHNjb3BlIChvbmx5IHZhbGlkIGlmIHRoaXMgcGFnZSBwYXJ0aWNpcGF0ZXMgaW4gYSBzZXNzaW9uKToKKyAgICAgKiB0aGUgbmFtZWQgcmVmZXJlbmNlIHJlbWFpbnMgYXZhaWxhYmxlIGZyb20gdGhlIEh0dHBTZXNzaW9uIChpZiBhbnkpCisgICAgICogYXNzb2NpYXRlZCB3aXRoIHRoZSBTZXJ2bGV0IHVudGlsIHRoZSBIdHRwU2Vzc2lvbiBpcyBpbnZhbGlkYXRlZC4KKyAgICAgKi8KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFU1NJT05fU0NPUEUJPSAzOworCisgICAgLyoqCisgICAgICogQXBwbGljYXRpb24gc2NvcGU6IG5hbWVkIHJlZmVyZW5jZSByZW1haW5zIGF2YWlsYWJsZSBpbiB0aGUgCisgICAgICogU2VydmxldENvbnRleHQgdW50aWwgaXQgaXMgcmVjbGFpbWVkLgorICAgICAqLworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVBQTElDQVRJT05fU0NPUEUJPSA0OworCisgICAgLyoqCisgICAgICogTmFtZSB1c2VkIHRvIHN0b3JlIHRoZSBTZXJ2bGV0IGluIHRoaXMgUGFnZUNvbnRleHQncyBuYW1ldGFibGVzLgorICAgICAqLworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRSA9ICJqYXZheC5zZXJ2bGV0LmpzcC5qc3BQYWdlIjsKKworICAgIC8qKgorICAgICAqIE5hbWUgdXNlZCB0byBzdG9yZSB0aGlzIFBhZ2VDb250ZXh0IGluIGl0J3Mgb3duIG5hbWUgdGFibGUuCisgICAgICovCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFQ09OVEVYVCA9ICJqYXZheC5zZXJ2bGV0LmpzcC5qc3BQYWdlQ29udGV4dCI7CisKKyAgICAvKioKKyAgICAgKiBOYW1lIHVzZWQgdG8gc3RvcmUgU2VydmxldFJlcXVlc3QgaW4gUGFnZUNvbnRleHQgbmFtZSB0YWJsZS4KKyAgICAgKi8KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUVVFU1QgPSAiamF2YXguc2VydmxldC5qc3AuanNwUmVxdWVzdCI7CisKKyAgICAvKioKKyAgICAgKiBOYW1lIHVzZWQgdG8gc3RvcmUgU2VydmxldFJlc3BvbnNlIGluIFBhZ2VDb250ZXh0IG5hbWUgdGFibGUuCisgICAgICovCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNQT05TRSA9ICJqYXZheC5zZXJ2bGV0LmpzcC5qc3BSZXNwb25zZSI7CisKKyAgICAvKioKKyAgICAgKiBOYW1lIHVzZWQgdG8gc3RvcmUgU2VydmxldENvbmZpZyBpbiBQYWdlQ29udGV4dCBuYW1lIHRhYmxlLgorICAgICAqLworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHID0gImphdmF4LnNlcnZsZXQuanNwLmpzcENvbmZpZyI7CisKKyAgICAvKioKKyAgICAgKiBOYW1lIHVzZWQgdG8gc3RvcmUgSHR0cFNlc3Npb24gaW4gUGFnZUNvbnRleHQgbmFtZSB0YWJsZS4KKyAgICAgKi8KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFU1NJT04gPSAiamF2YXguc2VydmxldC5qc3AuanNwU2Vzc2lvbiI7CisgICAgLyoqCisgICAgICogTmFtZSB1c2VkIHRvIHN0b3JlIGN1cnJlbnQgSnNwV3JpdGVyIGluIFBhZ2VDb250ZXh0IG5hbWUgdGFibGUuCisgICAgICovCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPVVQgPSAiamF2YXguc2VydmxldC5qc3AuanNwT3V0IjsKKworICAgIC8qKgorICAgICAqIE5hbWUgdXNlZCB0byBzdG9yZSBTZXJ2bGV0Q29udGV4dCBpbiBQYWdlQ29udGV4dCBuYW1lIHRhYmxlLgorICAgICAqLworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQTElDQVRJT04gPSAiamF2YXguc2VydmxldC5qc3AuanNwQXBwbGljYXRpb24iOworCisgICAgLyoqCisgICAgICogTmFtZSB1c2VkIHRvIHN0b3JlIHVuY2F1Z2h0IGV4Y2VwdGlvbiBpbiBTZXJ2bGV0UmVxdWVzdCBhdHRyaWJ1dGUgCisgICAgICogbGlzdCBhbmQgUGFnZUNvbnRleHQgbmFtZSB0YWJsZS4KKyAgICAgKi8KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYQ0VQVElPTiA9ICJqYXZheC5zZXJ2bGV0LmpzcC5qc3BFeGNlcHRpb24iOworCisgICAgLyoqCisgICAgICogPHA+CisgICAgICogVGhlIGluaXRpYWxpemUgbWV0aG9kIGlzIGNhbGxlZCB0byBpbml0aWFsaXplIGFuIHVuaW5pdGlhbGl6ZWQgUGFnZUNvbnRleHQKKyAgICAgKiBzbyB0aGF0IGl0IG1heSBiZSB1c2VkIGJ5IGEgSlNQIEltcGxlbWVudGF0aW9uIGNsYXNzIHRvIHNlcnZpY2UgYW4KKyAgICAgKiBpbmNvbWluZyByZXF1ZXN0IGFuZCByZXNwb25zZSB3aXRoaW4gaXQncyBfanNwU2VydmljZSgpIG1ldGhvZC4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoaXMgbWV0aG9kIGlzIHR5cGljYWxseSBjYWxsZWQgZnJvbSBKc3BGYWN0b3J5LmdldFBhZ2VDb250ZXh0KCkgaW4KKyAgICAgKiBvcmRlciB0byBpbml0aWFsaXplIHN0YXRlLgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhpcyBtZXRob2QgaXMgcmVxdWlyZWQgdG8gY3JlYXRlIGFuIGluaXRpYWwgSnNwV3JpdGVyLCBhbmQgYXNzb2NpYXRlCisgICAgICogdGhlICJvdXQiIG5hbWUgaW4gcGFnZSBzY29wZSB3aXRoIHRoaXMgbmV3bHkgY3JlYXRlZCBvYmplY3QuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIHVzZWQgYnkgcGFnZSAgb3IgdGFnIGxpYnJhcnkgYXV0aG9ycy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXJ2bGV0IFRoZSBTZXJ2bGV0IHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgUGFnZUNvbnRleHQKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgY3VycmVudGx5IHBlbmRpbmcgcmVxdWVzdCBmb3IgdGhpcyBTZXJ2bGV0CisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBjdXJyZW50bHkgcGVuZGluZyByZXNwb25zZSBmb3IgdGhpcyBTZXJ2bGV0CisgICAgICogQHBhcmFtIGVycm9yUGFnZVVSTCBUaGUgdmFsdWUgb2YgdGhlIGVycm9ycGFnZSBhdHRyaWJ1dGUgZnJvbSB0aGUgcGFnZSAKKyAgICAgKiAgICAgZGlyZWN0aXZlIG9yIG51bGwKKyAgICAgKiBAcGFyYW0gbmVlZHNTZXNzaW9uIFRoZSB2YWx1ZSBvZiB0aGUgc2Vzc2lvbiBhdHRyaWJ1dGUgZnJvbSB0aGUgCisgICAgICogICAgIHBhZ2UgZGlyZWN0aXZlCisgICAgICogQHBhcmFtIGJ1ZmZlclNpemUgVGhlIHZhbHVlIG9mIHRoZSBidWZmZXIgYXR0cmlidXRlIGZyb20gdGhlIHBhZ2UgCisgICAgICogICAgIGRpcmVjdGl2ZQorICAgICAqIEBwYXJhbSBhdXRvRmx1c2ggVGhlIHZhbHVlIG9mIHRoZSBhdXRvZmx1c2ggYXR0cmlidXRlIGZyb20gdGhlIHBhZ2UgCisgICAgICogICAgIGRpcmVjdGl2ZQorICAgICAqCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBkdXJpbmcgY3JlYXRpb24gb2YgSnNwV3JpdGVyCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgb3V0IG5vdCBjb3JyZWN0bHkgaW5pdGlhbGl6ZWQKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBJZiBvbmUgb2YgdGhlIGdpdmVuIHBhcmFtZXRlcnMKKyAgICAgKiAgICAgaXMgaW52YWxpZAorICAgICAqLworIAorICAgIGFic3RyYWN0IHB1YmxpYyB2b2lkIGluaXRpYWxpemUoU2VydmxldCBzZXJ2bGV0LCBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCAKKyAgICAgICAgU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLCBTdHJpbmcgZXJyb3JQYWdlVVJMLCBib29sZWFuIG5lZWRzU2Vzc2lvbiwgCisgICAgICAgIGludCBidWZmZXJTaXplLCBib29sZWFuIGF1dG9GbHVzaCkgIAorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogPHA+CisgICAgICogVGhpcyBtZXRob2Qgc2hhbGwgInJlc2V0IiB0aGUgaW50ZXJuYWwgc3RhdGUgb2YgYSBQYWdlQ29udGV4dCwgcmVsZWFzaW5nCisgICAgICogYWxsIGludGVybmFsIHJlZmVyZW5jZXMsIGFuZCBwcmVwYXJpbmcgdGhlIFBhZ2VDb250ZXh0IGZvciBwb3RlbnRpYWwKKyAgICAgKiByZXVzZSBieSBhIGxhdGVyIGludm9jYXRpb24gb2YgaW5pdGlhbGl6ZSgpLiBUaGlzIG1ldGhvZCBpcyB0eXBpY2FsbHkKKyAgICAgKiBjYWxsZWQgZnJvbSBKc3BGYWN0b3J5LnJlbGVhc2VQYWdlQ29udGV4dCgpLgorICAgICAqCisgICAgICogPHA+CisgICAgICogU3ViY2xhc3NlcyBzaGFsbCBlbnZlbG9wZSB0aGlzIG1ldGhvZC4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgdXNlZCBieSBwYWdlICBvciB0YWcgbGlicmFyeSBhdXRob3JzLgorICAgICAqCisgICAgICovCisKKyAgICBhYnN0cmFjdCBwdWJsaWMgdm9pZCByZWxlYXNlKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgc2Vzc2lvbiBvYmplY3QgKGFuIEh0dHBTZXNzaW9uKS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIEh0dHBTZXNzaW9uIGZvciB0aGlzIFBhZ2VDb250ZXh0IG9yIG51bGwKKyAgICAgKi8KKworICAgIGFic3RyYWN0IHB1YmxpYyBIdHRwU2Vzc2lvbiBnZXRTZXNzaW9uKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgcGFnZSBvYmplY3QgKEluIGEgU2VydmxldCBlbnZpcm9ubWVudCwgCisgICAgICogdGhpcyBpcyBhbiBpbnN0YW5jZSBvZiBqYXZheC5zZXJ2bGV0LlNlcnZsZXQpLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgUGFnZSBpbXBsZW1lbnRhdGlvbiBjbGFzcyBpbnN0YW5jZSBhc3NvY2lhdGVkIAorICAgICAqICAgICB3aXRoIHRoaXMgUGFnZUNvbnRleHQKKyAgICAgKi8KKworICAgIGFic3RyYWN0IHB1YmxpYyBPYmplY3QgZ2V0UGFnZSgpOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgcmVxdWVzdCBvYmplY3QgKGEgU2VydmxldFJlcXVlc3QpLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgU2VydmxldFJlcXVlc3QgZm9yIHRoaXMgUGFnZUNvbnRleHQKKyAgICAgKi8KKworICAgIGFic3RyYWN0IHB1YmxpYyBTZXJ2bGV0UmVxdWVzdCBnZXRSZXF1ZXN0KCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgcmVzcG9uc2Ugb2JqZWN0IChhIFNlcnZsZXRSZXNwb25zZSkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBTZXJ2bGV0UmVzcG9uc2UgZm9yIHRoaXMgUGFnZUNvbnRleHQKKyAgICAgKi8KKworICAgIGFic3RyYWN0IHB1YmxpYyBTZXJ2bGV0UmVzcG9uc2UgZ2V0UmVzcG9uc2UoKTsKKworICAgIC8qKgorICAgICAqIFRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBleGNlcHRpb24gb2JqZWN0IChhbiBFeGNlcHRpb24pLgorICAgICAqCisgICAgICogQHJldHVybiBhbnkgZXhjZXB0aW9uIHBhc3NlZCB0byB0aGlzIGFzIGFuIGVycm9ycGFnZQorICAgICAqLworCisgICAgYWJzdHJhY3QgcHVibGljIEV4Y2VwdGlvbiBnZXRFeGNlcHRpb24oKTsKKworICAgIC8qKgorICAgICAqIFRoZSBTZXJ2bGV0Q29uZmlnIGluc3RhbmNlLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgU2VydmxldENvbmZpZyBmb3IgdGhpcyBQYWdlQ29udGV4dAorICAgICAqLworCisgICAgYWJzdHJhY3QgcHVibGljIFNlcnZsZXRDb25maWcgZ2V0U2VydmxldENvbmZpZygpOworCisgICAgLyoqCisgICAgICogVGhlIFNlcnZsZXRDb250ZXh0IGluc3RhbmNlLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIFNlcnZsZXRDb250ZXh0IGZvciB0aGlzIFBhZ2VDb250ZXh0CisgICAgICovCisKKyAgICBhYnN0cmFjdCBwdWJsaWMgU2VydmxldENvbnRleHQgZ2V0U2VydmxldENvbnRleHQoKTsKKworICAgIC8qKgorICAgICAqIDxwPgorICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gcmUtZGlyZWN0LCBvciAiZm9yd2FyZCIgdGhlIGN1cnJlbnQgCisgICAgICogU2VydmxldFJlcXVlc3QgYW5kIFNlcnZsZXRSZXNwb25zZSB0byBhbm90aGVyIGFjdGl2ZSBjb21wb25lbnQgaW4gCisgICAgICogdGhlIGFwcGxpY2F0aW9uLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiB0aGUgPEk+IHJlbGF0aXZlVXJsUGF0aCA8L0k+IGJlZ2lucyB3aXRoIGEgIi8iIHRoZW4gdGhlIFVSTCBzcGVjaWZpZWQKKyAgICAgKiBpcyBjYWxjdWxhdGVkIHJlbGF0aXZlIHRvIHRoZSBET0NST09UIG9mIHRoZSA8Y29kZT4gU2VydmxldENvbnRleHQgPC9jb2RlPgorICAgICAqIGZvciB0aGlzIEpTUC4gSWYgdGhlIHBhdGggZG9lcyBub3QgYmVnaW4gd2l0aCBhICIvIiB0aGVuIHRoZSBVUkwgCisgICAgICogc3BlY2lmaWVkIGlzIGNhbGN1bGF0ZWQgcmVsYXRpdmUgdG8gdGhlIFVSTCBvZiB0aGUgcmVxdWVzdCB0aGF0IHdhcworICAgICAqIG1hcHBlZCB0byB0aGUgY2FsbGluZyBKU1AuCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIEl0IGlzIG9ubHkgdmFsaWQgdG8gY2FsbCB0aGlzIG1ldGhvZCBmcm9tIGEgPGNvZGU+IFRocmVhZCA8L2NvZGU+CisgICAgICogZXhlY3V0aW5nIHdpdGhpbiBhIDxjb2RlPiBfanNwU2VydmljZSguLi4pIDwvY29kZT4gbWV0aG9kIG9mIGEgSlNQLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBPbmNlIHRoaXMgbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCBzdWNjZXNzZnVsbHksIGl0IGlzIGlsbGVnYWwgZm9yIHRoZQorICAgICAqIGNhbGxpbmcgPGNvZGU+IFRocmVhZCA8L2NvZGU+IHRvIGF0dGVtcHQgdG8gbW9kaWZ5IHRoZSA8Y29kZT4KKyAgICAgKiBTZXJ2bGV0UmVzcG9uc2UgPC9jb2RlPiBvYmplY3QuICBBbnkgc3VjaCBhdHRlbXB0IHRvIGRvIHNvLCBzaGFsbCByZXN1bHQKKyAgICAgKiBpbiB1bmRlZmluZWQgYmVoYXZpb3IuIFR5cGljYWxseSwgY2FsbGVycyBpbW1lZGlhdGVseSByZXR1cm4gZnJvbSAKKyAgICAgKiA8Y29kZT4gX2pzcFNlcnZpY2UoLi4uKSA8L2NvZGU+IGFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIHJlbGF0aXZlVXJsUGF0aCBzcGVjaWZpZXMgdGhlIHJlbGF0aXZlIFVSTCBwYXRoIHRvIHRoZSB0YXJnZXQgCisgICAgICogICAgIHJlc291cmNlIGFzIGRlc2NyaWJlZCBhYm92ZQorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgPGNvZGU+IFNlcnZsZXRSZXNwb25zZSA8L2NvZGU+IGlzIG5vdCAKKyAgICAgKiAgICAgaW4gYSBzdGF0ZSB3aGVyZSBhIGZvcndhcmQgY2FuIGJlIHBlcmZvcm1lZAorICAgICAqIEB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiBpZiB0aGUgcGFnZSB0aGF0IHdhcyBmb3J3YXJkZWQgdG8gdGhyb3dzCisgICAgICogICAgIGEgU2VydmxldEV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW4gSS9PIGVycm9yIG9jY3VycmVkIHdoaWxlIGZvcndhcmRpbmcKKyAgICAgKi8KKworICAgIGFic3RyYWN0IHB1YmxpYyB2b2lkIGZvcndhcmQoU3RyaW5nIHJlbGF0aXZlVXJsUGF0aCkgCisgICAgICAgIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIDxwPgorICAgICAqIENhdXNlcyB0aGUgcmVzb3VyY2Ugc3BlY2lmaWVkIHRvIGJlIHByb2Nlc3NlZCBhcyBwYXJ0IG9mIHRoZSBjdXJyZW50CisgICAgICogU2VydmxldFJlcXVlc3QgYW5kIFNlcnZsZXRSZXNwb25zZSBiZWluZyBwcm9jZXNzZWQgYnkgdGhlIGNhbGxpbmcgVGhyZWFkLgorICAgICAqIFRoZSBvdXRwdXQgb2YgdGhlIHRhcmdldCByZXNvdXJjZXMgcHJvY2Vzc2luZyBvZiB0aGUgcmVxdWVzdCBpcyB3cml0dGVuCisgICAgICogZGlyZWN0bHkgdG8gdGhlIFNlcnZsZXRSZXNwb25zZSBvdXRwdXQgc3RyZWFtLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgY3VycmVudCBKc3BXcml0ZXIgIm91dCIgZm9yIHRoaXMgSlNQIGlzIGZsdXNoZWQgYXMgYSBzaWRlLWVmZmVjdAorICAgICAqIG9mIHRoaXMgY2FsbCwgcHJpb3IgdG8gcHJvY2Vzc2luZyB0aGUgaW5jbHVkZS4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogSWYgdGhlIDxJPiByZWxhdGl2ZVVybFBhdGggPC9JPiBiZWdpbnMgd2l0aCBhICIvIiB0aGVuIHRoZSBVUkwgc3BlY2lmaWVkCisgICAgICogaXMgY2FsY3VsYXRlZCByZWxhdGl2ZSB0byB0aGUgRE9DUk9PVCBvZiB0aGUgPGNvZGU+U2VydmxldENvbnRleHQ8L2NvZGU+CisgICAgICogZm9yIHRoaXMgSlNQLiBJZiB0aGUgcGF0aCBkb2VzIG5vdCBiZWdpbiB3aXRoIGEgIi8iIHRoZW4gdGhlIFVSTCAKKyAgICAgKiBzcGVjaWZpZWQgaXMgY2FsY3VsYXRlZCByZWxhdGl2ZSB0byB0aGUgVVJMIG9mIHRoZSByZXF1ZXN0IHRoYXQgd2FzCisgICAgICogbWFwcGVkIHRvIHRoZSBjYWxsaW5nIEpTUC4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogSXQgaXMgb25seSB2YWxpZCB0byBjYWxsIHRoaXMgbWV0aG9kIGZyb20gYSA8Y29kZT4gVGhyZWFkIDwvY29kZT4KKyAgICAgKiBleGVjdXRpbmcgd2l0aGluIGEgPGNvZGU+IF9qc3BTZXJ2aWNlKC4uLikgPC9jb2RlPiBtZXRob2Qgb2YgYSBKU1AuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIHJlbGF0aXZlVXJsUGF0aCBzcGVjaWZpZXMgdGhlIHJlbGF0aXZlIFVSTCBwYXRoIHRvIHRoZSB0YXJnZXQgCisgICAgICogICAgIHJlc291cmNlIHRvIGJlIGluY2x1ZGVkCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24gaWYgdGhlIHBhZ2UgdGhhdCB3YXMgZm9yd2FyZGVkIHRvIHRocm93cworICAgICAqICAgICBhIFNlcnZsZXRFeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIEkvTyBlcnJvciBvY2N1cnJlZCB3aGlsZSBmb3J3YXJkaW5nCisgICAgICovCisgICAgYWJzdHJhY3QgcHVibGljIHZvaWQgaW5jbHVkZShTdHJpbmcgcmVsYXRpdmVVcmxQYXRoKSAKKyAgICAgICAgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogPHA+CisgICAgICogQ2F1c2VzIHRoZSByZXNvdXJjZSBzcGVjaWZpZWQgdG8gYmUgcHJvY2Vzc2VkIGFzIHBhcnQgb2YgdGhlIGN1cnJlbnQKKyAgICAgKiBTZXJ2bGV0UmVxdWVzdCBhbmQgU2VydmxldFJlc3BvbnNlIGJlaW5nIHByb2Nlc3NlZCBieSB0aGUgY2FsbGluZyBUaHJlYWQuCisgICAgICogVGhlIG91dHB1dCBvZiB0aGUgdGFyZ2V0IHJlc291cmNlcyBwcm9jZXNzaW5nIG9mIHRoZSByZXF1ZXN0IGlzIHdyaXR0ZW4KKyAgICAgKiBkaXJlY3RseSB0byB0aGUgY3VycmVudCBKc3BXcml0ZXIgcmV0dXJuZWQgYnkgYSBjYWxsIHRvIGdldE91dCgpLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiBmbHVzaCBpcyB0cnVlLCBUaGUgY3VycmVudCBKc3BXcml0ZXIgIm91dCIgZm9yIHRoaXMgSlNQIAorICAgICAqIGlzIGZsdXNoZWQgYXMgYSBzaWRlLWVmZmVjdCBvZiB0aGlzIGNhbGwsIHByaW9yIHRvIHByb2Nlc3NpbmcgCisgICAgICogdGhlIGluY2x1ZGUuICBPdGhlcndpc2UsIHRoZSBKc3BXcml0ZXIgIm91dCIgaXMgbm90IGZsdXNoZWQuCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIElmIHRoZSA8aT5yZWxhdGl2ZVVybFBhdGg8L2k+IGJlZ2lucyB3aXRoIGEgIi8iIHRoZW4gdGhlIFVSTCBzcGVjaWZpZWQKKyAgICAgKiBpcyBjYWxjdWxhdGVkIHJlbGF0aXZlIHRvIHRoZSBET0NST09UIG9mIHRoZSA8Y29kZT5TZXJ2bGV0Q29udGV4dDwvY29kZT4KKyAgICAgKiBmb3IgdGhpcyBKU1AuIElmIHRoZSBwYXRoIGRvZXMgbm90IGJlZ2luIHdpdGggYSAiLyIgdGhlbiB0aGUgVVJMIAorICAgICAqIHNwZWNpZmllZCBpcyBjYWxjdWxhdGVkIHJlbGF0aXZlIHRvIHRoZSBVUkwgb2YgdGhlIHJlcXVlc3QgdGhhdCB3YXMKKyAgICAgKiBtYXBwZWQgdG8gdGhlIGNhbGxpbmcgSlNQLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBJdCBpcyBvbmx5IHZhbGlkIHRvIGNhbGwgdGhpcyBtZXRob2QgZnJvbSBhIDxjb2RlPiBUaHJlYWQgPC9jb2RlPgorICAgICAqIGV4ZWN1dGluZyB3aXRoaW4gYSA8Y29kZT4gX2pzcFNlcnZpY2UoLi4uKSA8L2NvZGU+IG1ldGhvZCBvZiBhIEpTUC4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVsYXRpdmVVcmxQYXRoIHNwZWNpZmllcyB0aGUgcmVsYXRpdmUgVVJMIHBhdGggdG8gdGhlIAorICAgICAqICAgICB0YXJnZXQgcmVzb3VyY2UgdG8gYmUgaW5jbHVkZWQKKyAgICAgKiBAcGFyYW0gZmx1c2ggVHJ1ZSBpZiB0aGUgSnNwV3JpdGVyIGlzIHRvIGJlIGZsdXNoZWQgYmVmb3JlIHRoZSBpbmNsdWRlLAorICAgICAqICAgICBvciBmYWxzZSBpZiBub3QuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24gaWYgdGhlIHBhZ2UgdGhhdCB3YXMgZm9yd2FyZGVkIHRvIHRocm93cworICAgICAqICAgICBhIFNlcnZsZXRFeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIEkvTyBlcnJvciBvY2N1cnJlZCB3aGlsZSBmb3J3YXJkaW5nCisgICAgICogQHNpbmNlIDIuMAorICAgICAqLworICAgIGFic3RyYWN0IHB1YmxpYyB2b2lkIGluY2x1ZGUoU3RyaW5nIHJlbGF0aXZlVXJsUGF0aCwgYm9vbGVhbiBmbHVzaCkgCisJdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogPHA+CisgICAgICogVGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgdG8gcHJvY2VzcyBhbiB1bmhhbmRsZWQgJ3BhZ2UnIGxldmVsCisgICAgICogZXhjZXB0aW9uIGJ5IGZvcndhcmRpbmcgdGhlIGV4Y2VwdGlvbiB0byB0aGUgc3BlY2lmaWVkCisgICAgICogZXJyb3IgcGFnZSBmb3IgdGhpcyBKU1AuICBJZiBmb3J3YXJkaW5nIGlzIG5vdCBwb3NzaWJsZSAoZm9yCisgICAgICogZXhhbXBsZSBiZWNhdXNlIHRoZSByZXNwb25zZSBoYXMgYWxyZWFkeSBiZWVuIGNvbW1pdHRlZCksIGFuCisgICAgICogaW1wbGVtZW50YXRpb24gZGVwZW5kZW50IG1lY2hhbmlzbSBzaG91bGQgYmUgdXNlZCB0byBpbnZva2UKKyAgICAgKiB0aGUgZXJyb3IgcGFnZSAoZS5nLiAiaW5jbHVkaW5nIiB0aGUgZXJyb3IgcGFnZSBpbnN0ZWFkKS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIElmIG5vIGVycm9yIHBhZ2UgaXMgZGVmaW5lZCBpbiB0aGUgcGFnZSwgdGhlIGV4Y2VwdGlvbiBzaG91bGQKKyAgICAgKiBiZSByZXRocm93biBzbyB0aGF0IHRoZSBzdGFuZGFyZCBzZXJ2bGV0IGVycm9yIGhhbmRsaW5nCisgICAgICogdGFrZXMgb3Zlci4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIEEgSlNQIGltcGxlbWVudGF0aW9uIGNsYXNzIHNoYWxsIHR5cGljYWxseSBjbGVhbiB1cCBhbnkgbG9jYWwgc3RhdGUKKyAgICAgKiBwcmlvciB0byBpbnZva2luZyB0aGlzIGFuZCB3aWxsIHJldHVybiBpbW1lZGlhdGVseSB0aGVyZWFmdGVyLiBJdCBpcworICAgICAqIGlsbGVnYWwgdG8gZ2VuZXJhdGUgYW55IG91dHB1dCB0byB0aGUgY2xpZW50LCBvciB0byBtb2RpZnkgYW55IAorICAgICAqIFNlcnZsZXRSZXNwb25zZSBzdGF0ZSBhZnRlciBpbnZva2luZyB0aGlzIGNhbGwuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBrZXB0IGZvciBiYWNrd2FyZHMgY29tcGF0aWJsaXR5IHJlYXNvbnMuICBOZXdseQorICAgICAqIGdlbmVyYXRlZCBjb2RlIHNob3VsZCB1c2UgUGFnZUNvbnRleHQuaGFuZGxlUGFnZUV4Y2VwdGlvbihUaHJvd2FibGUpLgorICAgICAqCisgICAgICogQHBhcmFtIGUgdGhlIGV4Y2VwdGlvbiB0byBiZSBoYW5kbGVkCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGludm9raW5nIHRoZSBlcnJvciBwYWdlCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBJL08gZXJyb3Igb2NjdXJyZWQgd2hpbGUgaW52b2tpbmcgdGhlIGVycm9yCisgICAgICogICAgIHBhZ2UKKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSBleGNlcHRpb24gaXMgbnVsbAorICAgICAqCisgICAgICogQHNlZSAjaGFuZGxlUGFnZUV4Y2VwdGlvbihUaHJvd2FibGUpCisgICAgICovCisKKyAgICBhYnN0cmFjdCBwdWJsaWMgdm9pZCBoYW5kbGVQYWdlRXhjZXB0aW9uKEV4Y2VwdGlvbiBlKSAKKyAgICAgICAgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogPHA+CisgICAgICogVGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgdG8gcHJvY2VzcyBhbiB1bmhhbmRsZWQgJ3BhZ2UnIGxldmVsCisgICAgICogZXhjZXB0aW9uIGJ5IGZvcndhcmRpbmcgdGhlIGV4Y2VwdGlvbiB0byB0aGUgc3BlY2lmaWVkCisgICAgICogZXJyb3IgcGFnZSBmb3IgdGhpcyBKU1AuICBJZiBmb3J3YXJkaW5nIGlzIG5vdCBwb3NzaWJsZSAoZm9yCisgICAgICogZXhhbXBsZSBiZWNhdXNlIHRoZSByZXNwb25zZSBoYXMgYWxyZWFkeSBiZWVuIGNvbW1pdHRlZCksIGFuCisgICAgICogaW1wbGVtZW50YXRpb24gZGVwZW5kZW50IG1lY2hhbmlzbSBzaG91bGQgYmUgdXNlZCB0byBpbnZva2UKKyAgICAgKiB0aGUgZXJyb3IgcGFnZSAoZS5nLiAiaW5jbHVkaW5nIiB0aGUgZXJyb3IgcGFnZSBpbnN0ZWFkKS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIElmIG5vIGVycm9yIHBhZ2UgaXMgZGVmaW5lZCBpbiB0aGUgcGFnZSwgdGhlIGV4Y2VwdGlvbiBzaG91bGQKKyAgICAgKiBiZSByZXRocm93biBzbyB0aGF0IHRoZSBzdGFuZGFyZCBzZXJ2bGV0IGVycm9yIGhhbmRsaW5nCisgICAgICogdGFrZXMgb3Zlci4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoaXMgbWV0aG9kIGlzIGludGVuZGVkIHRvIHByb2Nlc3MgYW4gdW5oYW5kbGVkICJwYWdlIiBsZXZlbCBleGNlcHRpb24KKyAgICAgKiBieSByZWRpcmVjdGluZyB0aGUgZXhjZXB0aW9uIHRvIGVpdGhlciB0aGUgc3BlY2lmaWVkIGVycm9yIHBhZ2UgZm9yIHRoaXMKKyAgICAgKiBKU1AsIG9yIGlmIG5vbmUgd2FzIHNwZWNpZmllZCwgdG8gcGVyZm9ybSBzb21lIGltcGxlbWVudGF0aW9uIGRlcGVuZGVudAorICAgICAqIGFjdGlvbi4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIEEgSlNQIGltcGxlbWVudGF0aW9uIGNsYXNzIHNoYWxsIHR5cGljYWxseSBjbGVhbiB1cCBhbnkgbG9jYWwgc3RhdGUKKyAgICAgKiBwcmlvciB0byBpbnZva2luZyB0aGlzIGFuZCB3aWxsIHJldHVybiBpbW1lZGlhdGVseSB0aGVyZWFmdGVyLiBJdCBpcworICAgICAqIGlsbGVnYWwgdG8gZ2VuZXJhdGUgYW55IG91dHB1dCB0byB0aGUgY2xpZW50LCBvciB0byBtb2RpZnkgYW55IAorICAgICAqIFNlcnZsZXRSZXNwb25zZSBzdGF0ZSBhZnRlciBpbnZva2luZyB0aGlzIGNhbGwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdCB0aGUgdGhyb3dhYmxlIHRvIGJlIGhhbmRsZWQKKyAgICAgKgorICAgICAqIEB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgaW52b2tpbmcgdGhlIGVycm9yIHBhZ2UKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIEkvTyBlcnJvciBvY2N1cnJlZCB3aGlsZSBpbnZva2luZyB0aGUgZXJyb3IKKyAgICAgKiAgICAgcGFnZQorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIGV4Y2VwdGlvbiBpcyBudWxsCisgICAgICoKKyAgICAgKiBAc2VlICNoYW5kbGVQYWdlRXhjZXB0aW9uKEV4Y2VwdGlvbikKKyAgICAgKi8KKworICAgIGFic3RyYWN0IHB1YmxpYyB2b2lkIGhhbmRsZVBhZ2VFeGNlcHRpb24oVGhyb3dhYmxlIHQpIAorICAgICAgICB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBuZXcgQm9keUNvbnRlbnQgb2JqZWN0LCBzYXZlIHRoZSBjdXJyZW50ICJvdXQiIEpzcFdyaXRlciwKKyAgICAgKiBhbmQgdXBkYXRlIHRoZSB2YWx1ZSBvZiB0aGUgIm91dCIgYXR0cmlidXRlIGluIHRoZSBwYWdlIHNjb3BlCisgICAgICogYXR0cmlidXRlIG5hbWVzcGFjZSBvZiB0aGUgUGFnZUNvbnRleHQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBuZXcgQm9keUNvbnRlbnQKKyAgICAgKi8KKworICAgIHB1YmxpYyBCb2R5Q29udGVudCBwdXNoQm9keSgpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7IC8vIFhYWCB0byBpbXBsZW1lbnQKKyAgICB9CisgICAgICAgICAKKworICAgIC8qKgorICAgICAqIFByb3ZpZGVzIGNvbnZlbmllbnQgYWNjZXNzIHRvIGVycm9yIGluZm9ybWF0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBhbiBFcnJvckRhdGEgaW5zdGFuY2UgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgCisgICAgICogZXJyb3IsIGFzIG9idGFpbmVkIGZyb20gdGhlIHJlcXVlc3QgYXR0cmlidXRlcywgYXMgcGVyIHRoZSAKKyAgICAgKiBTZXJ2bGV0IHNwZWNpZmljYXRpb24uICBJZiB0aGlzIGlzIG5vdCBhbiBlcnJvciBwYWdlICh0aGF0IGlzLAorICAgICAqIGlmIHRoZSBpc0Vycm9yUGFnZSBhdHRyaWJ1dGUgb2YgdGhlIHBhZ2UgZGlyZWN0aXZlIGlzIG5vdCBzZXQKKyAgICAgKiB0byAidHJ1ZSIpLCB0aGUgaW5mb3JtYXRpb24gaXMgbWVhbmluZ2xlc3MuCisgICAgICoKKyAgICAgKiBAc2luY2UgMi4wCisgICAgICovCisgICAgcHVibGljIEVycm9yRGF0YSBnZXRFcnJvckRhdGEoKSB7CisJcmV0dXJuIG5ldyBFcnJvckRhdGEoIAorCSAgICAoVGhyb3dhYmxlKWdldFJlcXVlc3QoKS5nZXRBdHRyaWJ1dGUoICJqYXZheC5zZXJ2bGV0LmVycm9yLmV4Y2VwdGlvbiIgKSwKKwkgICAgKChJbnRlZ2VyKWdldFJlcXVlc3QoKS5nZXRBdHRyaWJ1dGUoIAorCQkiamF2YXguc2VydmxldC5lcnJvci5zdGF0dXNfY29kZSIgKSkuaW50VmFsdWUoKSwKKwkgICAgKFN0cmluZylnZXRSZXF1ZXN0KCkuZ2V0QXR0cmlidXRlKCAiamF2YXguc2VydmxldC5lcnJvci5yZXF1ZXN0X3VyaSIgKSwKKwkgICAgKFN0cmluZylnZXRSZXF1ZXN0KCkuZ2V0QXR0cmlidXRlKCAiamF2YXguc2VydmxldC5lcnJvci5zZXJ2bGV0X25hbWUiICkgKTsKKyAgICB9CisgICAgCit9CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvU2tpcFBhZ2VFeGNlcHRpb24uamF2YSBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC9Ta2lwUGFnZUV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwZWEwY2QKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvU2tpcFBhZ2VFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDc1IEBACisvKgorKiBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCitwYWNrYWdlIGphdmF4LnNlcnZsZXQuanNwOworCisvKioKKyAqIEV4Y2VwdGlvbiB0byBpbmRpY2F0ZSB0aGUgY2FsbGluZyBwYWdlIG11c3QgY2Vhc2UgZXZhbHVhdGlvbi4KKyAqIFRocm93biBieSBhIHNpbXBsZSB0YWcgaGFuZGxlciB0byBpbmRpY2F0ZSB0aGF0IHRoZSByZW1haW5kZXIgb2YgCisgKiB0aGUgcGFnZSBtdXN0IG5vdCBiZSBldmFsdWF0ZWQuICBUaGUgcmVzdWx0IGlzIHByb3BhZ2F0ZWQgYmFjayB0bworICogdGhlIHBhZ2VpbiB0aGUgY2FzZSB3aGVyZSBvbmUgdGFnIGludm9rZXMgYW5vdGhlciAoYXMgY2FuIGJlCisgKiB0aGUgY2FzZSB3aXRoIHRhZyBmaWxlcykuICBUaGUgZWZmZWN0IGlzIHNpbWlsYXIgdG8gdGhhdCBvZiBhIAorICogQ2xhc3NpYyBUYWcgSGFuZGxlciByZXR1cm5pbmcgVGFnLlNLSVBfUEFHRSBmcm9tIGRvRW5kVGFnKCkuCisgKiBKc3AgRnJhZ21lbnRzIG1heSBhbHNvIHRocm93IHRoaXMgZXhjZXB0aW9uLiAgVGhpcyBleGNlcHRpb24KKyAqIHNob3VsZCBub3QgYmUgdGhyb3duIG1hbnVhbGx5IGluIGEgSlNQIHBhZ2Ugb3IgdGFnIGZpbGUgLSB0aGUgYmVoYXZpb3IgaXMKKyAqIHVuZGVmaW5lZC4gIFRoZSBleGNlcHRpb24gaXMgaW50ZW5kZWQgdG8gYmUgdGhyb3duIGluc2lkZSAKKyAqIFNpbXBsZVRhZyBoYW5kbGVycyBhbmQgaW4gSlNQIGZyYWdtZW50cy4KKyAqIAorICogQHNlZSBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuU2ltcGxlVGFnI2RvVGFnCisgKiBAc2VlIGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5Kc3BGcmFnbWVudCNpbnZva2UKKyAqIEBzZWUgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZyNkb0VuZFRhZworICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgY2xhc3MgU2tpcFBhZ2VFeGNlcHRpb24KKyAgICBleHRlbmRzIEpzcEV4Y2VwdGlvbgoreworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBTa2lwUGFnZUV4Y2VwdGlvbiB3aXRoIG5vIG1lc3NhZ2UuCisgICAgICovCisgICAgcHVibGljIFNraXBQYWdlRXhjZXB0aW9uKCkgeworICAgICAgICBzdXBlcigpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgU2tpcFBhZ2VFeGNlcHRpb24gd2l0aCB0aGUgcHJvdmlkZWQgbWVzc2FnZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBkZXRhaWwgbWVzc2FnZQorICAgICAqLworICAgIHB1YmxpYyBTa2lwUGFnZUV4Y2VwdGlvbiggU3RyaW5nIG1lc3NhZ2UgKSB7CisgICAgICAgIHN1cGVyKCBtZXNzYWdlICk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIFNraXBQYWdlRXhjZXB0aW9uIHdpdGggdGhlIHByb3ZpZGVkIG1lc3NhZ2UgYW5kIHJvb3QgY2F1c2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgZGV0YWlsIG1lc3NhZ2UKKyAgICAgKiBAcGFyYW0gcm9vdENhdXNlIHRoZSBvcmlnaW5hdGluZyBjYXVzZSBvZiB0aGlzIGV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBTa2lwUGFnZUV4Y2VwdGlvbiggU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSByb290Q2F1c2UgKSB7CisJc3VwZXIoIG1lc3NhZ2UsIHJvb3RDYXVzZSApOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBTa2lwUGFnZUV4Y2VwdGlvbiB3aXRoIHRoZSBwcm92aWRlZCByb290IGNhdXNlLgorICAgICAqCisgICAgICogQHBhcmFtIHJvb3RDYXVzZSB0aGUgb3JpZ2luYXRpbmcgY2F1c2Ugb2YgdGhpcyBleGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgU2tpcFBhZ2VFeGNlcHRpb24oIFRocm93YWJsZSByb290Q2F1c2UgKSB7CisJc3VwZXIoIHJvb3RDYXVzZSApOworICAgIH0KKyAgICAKK30KKworCmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvZWwvRUxFeGNlcHRpb24uamF2YSBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC9lbC9FTEV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1YzIxOGMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvZWwvRUxFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDkxIEBACisvKgorKiBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK3BhY2thZ2UgamF2YXguc2VydmxldC5qc3AuZWw7CisKKworLyoqCisgKiBSZXByZXNlbnRzIGFueSBvZiB0aGUgZXhjZXB0aW9uIGNvbmRpdGlvbnMgdGhhdCBhcmlzZSBkdXJpbmcgdGhlCisgKiBvcGVyYXRpb24gZXZhbHVhdGlvbiBvZiB0aGUgZXZhbHVhdG9yLgorICoKKyAqIEBzaW5jZSAyLjAKKyAqLworcHVibGljIGNsYXNzIEVMRXhjZXB0aW9uCisgIGV4dGVuZHMgRXhjZXB0aW9uCit7CisgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBNZW1iZXIgdmFyaWFibGVzCisgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIHByaXZhdGUgVGhyb3dhYmxlIG1Sb290Q2F1c2U7CisKKyAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8qKgorICAgKiBDcmVhdGVzIGFuIEVMRXhjZXB0aW9uIHdpdGggbm8gZGV0YWlsIG1lc3NhZ2UuCisgICAqKi8KKyAgcHVibGljIEVMRXhjZXB0aW9uICgpCisgIHsKKyAgICBzdXBlciAoKTsKKyAgfQorCisgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvKioKKyAgICogQ3JlYXRlcyBhbiBFTEV4Y2VwdGlvbiB3aXRoIHRoZSBwcm92aWRlZCBkZXRhaWwgbWVzc2FnZS4KKyAgICoKKyAgICogQHBhcmFtIHBNZXNzYWdlIHRoZSBkZXRhaWwgbWVzc2FnZQorICAgKiovCisgIHB1YmxpYyBFTEV4Y2VwdGlvbiAoU3RyaW5nIHBNZXNzYWdlKQorICB7CisgICAgc3VwZXIgKHBNZXNzYWdlKTsKKyAgfQorCisgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvKioKKyAgICogQ3JlYXRlcyBhbiBFTEV4Y2VwdGlvbiB3aXRoIHRoZSBnaXZlbiByb290IGNhdXNlLgorICAgKgorICAgKiBAcGFyYW0gcFJvb3RDYXVzZSB0aGUgb3JpZ2luYXRpbmcgY2F1c2Ugb2YgdGhpcyBleGNlcHRpb24KKyAgICoqLworICBwdWJsaWMgRUxFeGNlcHRpb24gKFRocm93YWJsZSBwUm9vdENhdXNlKQorICB7CisgICAgc3VwZXIoIHBSb290Q2F1c2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpICk7CisgICAgbVJvb3RDYXVzZSA9IHBSb290Q2F1c2U7CisgIH0KKworICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLyoqCisgICAqIENyZWF0ZXMgYW4gRUxFeGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4gZGV0YWlsIG1lc3NhZ2UgYW5kIHJvb3QgY2F1c2UuCisgICAqCisgICAqIEBwYXJhbSBwTWVzc2FnZSB0aGUgZGV0YWlsIG1lc3NhZ2UKKyAgICogQHBhcmFtIHBSb290Q2F1c2UgdGhlIG9yaWdpbmF0aW5nIGNhdXNlIG9mIHRoaXMgZXhjZXB0aW9uCisgICAqKi8KKyAgcHVibGljIEVMRXhjZXB0aW9uIChTdHJpbmcgcE1lc3NhZ2UsCisJCSAgICAgIFRocm93YWJsZSBwUm9vdENhdXNlKQorICB7CisgICAgc3VwZXIgKHBNZXNzYWdlKTsKKyAgICBtUm9vdENhdXNlID0gcFJvb3RDYXVzZTsKKyAgfQorCisgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvKioKKyAgICogUmV0dXJucyB0aGUgcm9vdCBjYXVzZS4KKyAgICoKKyAgICogQHJldHVybiB0aGUgcm9vdCBjYXVzZSBvZiB0aGlzIGV4Y2VwdGlvbgorICAgKi8KKyAgcHVibGljIFRocm93YWJsZSBnZXRSb290Q2F1c2UgKCkKKyAgeworICAgIHJldHVybiBtUm9vdENhdXNlOworICB9Cit9CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvZWwvRUxQYXJzZUV4Y2VwdGlvbi5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL2VsL0VMUGFyc2VFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWMyNjAyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL2VsL0VMUGFyc2VFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDQ5IEBACisvKgorKiBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK3BhY2thZ2UgamF2YXguc2VydmxldC5qc3AuZWw7CisKKworLyoqCisgKiBSZXByZXNlbnRzIGEgcGFyc2luZyBlcnJvciBlbmNvdW50ZXJlZCB3aGlsZSBwYXJzaW5nIGFuIEVMIGV4cHJlc3Npb24uCisgKgorICogQHNpbmNlIDIuMAorICovCisKK3B1YmxpYyBjbGFzcyBFTFBhcnNlRXhjZXB0aW9uIGV4dGVuZHMgRUxFeGNlcHRpb24geworCisgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8qKgorICAgKiBDcmVhdGVzIGFuIEVMUGFyc2VFeGNlcHRpb24gd2l0aCBubyBkZXRhaWwgbWVzc2FnZS4KKyAgICovCisgIHB1YmxpYyBFTFBhcnNlRXhjZXB0aW9uICgpCisgIHsKKyAgICBzdXBlciAoKTsKKyAgfQorCisgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvKioKKyAgICogQ3JlYXRlcyBhbiBFTFBhcnNlRXhjZXB0aW9uIHdpdGggdGhlIHByb3ZpZGVkIGRldGFpbCBtZXNzYWdlLgorICAgKgorICAgKiBAcGFyYW0gcE1lc3NhZ2UgdGhlIGRldGFpbCBtZXNzYWdlCisgICAqKi8KKyAgcHVibGljIEVMUGFyc2VFeGNlcHRpb24gKFN0cmluZyBwTWVzc2FnZSkKKyAgeworICAgIHN1cGVyIChwTWVzc2FnZSk7CisgIH0KKworICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK30KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC9lbC9FeHByZXNzaW9uLmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvZWwvRXhwcmVzc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5YmE2NDUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvZWwvRXhwcmVzc2lvbi5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisqIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworCitwYWNrYWdlIGphdmF4LnNlcnZsZXQuanNwLmVsOworCisKKy8qKgorICogPHA+VGhlIGFic3RyYWN0IGNsYXNzIGZvciBhIHByZXBhcmVkIGV4cHJlc3Npb24uPC9wPgorICoKKyAqIDxwPkFuIGluc3RhbmNlIG9mIGFuIEV4cHJlc3Npb24gY2FuIGJlIG9idGFpbmVkIHZpYSBmcm9tIGFuIAorICogRXhwcmVzc2lvbkV2YWx1YXRvciBpbnN0YW5jZS48L3A+CisgKgorICogPHA+QW4gRXhwcmVzc2lvbiBtYXkgb3Igbm90IGhhdmUgZG9uZSBhIHN5bnRhY3RpYyBwYXJzZSBvZiB0aGUgZXhwcmVzc2lvbi4KKyAqIEEgY2xpZW50IGludm9raW5nIHRoZSBldmFsdWF0ZSgpIG1ldGhvZCBzaG91bGQgYmUgcmVhZHkgZm9yIHRoZSBjYXNlIAorICogd2hlcmUgRUxQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb25zIGFyZSByYWlzZWQuIDwvcD4KKyAqCisgKiBAc2luY2UgMi4wCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBFeHByZXNzaW9uIHsKKworICAgIC8qKiAKKyAgICAgKiBFdmFsdWF0ZXMgYW4gZXhwcmVzc2lvbiB0aGF0IHdhcyBwcmV2aW91c2x5IHByZXBhcmVkLiAgSW4gc29tZSAKKyAgICAgKiBpbXBsZW1lbnRhdGlvbnMgcHJlcGFyaW5nIGFuIGV4cHJlc3Npb24gaW52b2x2ZXMgZnVsbCBzeW50YWN0aWMgCisgICAgICogdmFsaWRhdGlvbiwgYnV0IG90aGVycyBtYXkgbm90IGRvIHNvLiAgRXZhbHVhdGluZyB0aGUgZXhwcmVzc2lvbiBtYXkgCisgICAgICogcmFpc2UgYW4gRUxQYXJzZUV4Y2VwdGlvbiBhcyB3ZWxsIGFzIG90aGVyIEVMRXhjZXB0aW9ucyBkdWUgdG8gCisgICAgICogcnVuLXRpbWUgZXZhbHVhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2UmVzb2x2ZXIgQSBWYXJpYWJsZVJlc29sdmVyIGluc3RhbmNlIHRoYXQgY2FuIGJlIHVzZWQgYXQgCisgICAgICogICBydW50aW1lIHRvIHJlc29sdmUgdGhlIG5hbWUgb2YgaW1wbGljaXQgb2JqZWN0cyBpbnRvIE9iamVjdHMuCisgICAgICogQHJldHVybiBUaGUgcmVzdWx0IG9mIHRoZSBleHByZXNzaW9uIGV2YWx1YXRpb24uCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIEVMRXhjZXB0aW9uIFRocm93biBpZiB0aGUgZXhwcmVzc2lvbiBldmFsdWF0aW9uIGZhaWxlZC4KKyAgICAgKi8gCisgICAgcHVibGljIGFic3RyYWN0IE9iamVjdCBldmFsdWF0ZSggVmFyaWFibGVSZXNvbHZlciB2UmVzb2x2ZXIgKQorICAgICAgICB0aHJvd3MgRUxFeGNlcHRpb247Cit9CisKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC9lbC9FeHByZXNzaW9uRXZhbHVhdG9yLmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvZWwvRXhwcmVzc2lvbkV2YWx1YXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyMDcwZDkKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvZWwvRXhwcmVzc2lvbkV2YWx1YXRvci5qYXZhCkBAIC0wLDAgKzEsMTA2IEBACisvKgorKiBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK3BhY2thZ2UgamF2YXguc2VydmxldC5qc3AuZWw7CisKKworLyoqCisgKiA8cD5UaGUgYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgYW4gZXhwcmVzc2lvbi1sYW5ndWFnZSBldmFsdWF0b3IuCisgKiBDbGFzc2VzIHRoYXQgaW1wbGVtZW50IGFuIGV4cHJlc3Npb24gbGFuZ3VhZ2UgZXhwb3NlIHRoZWlyIGZ1bmN0aW9uYWxpdHkKKyAqIHZpYSB0aGlzIGFic3RyYWN0IGNsYXNzLjwvcD4KKyAqCisgKiA8cD5BbiBpbnN0YW5jZSBvZiB0aGUgRXhwcmVzc2lvbkV2YWx1YXRvciBjYW4gYmUgb2J0YWluZWQgdmlhIHRoZSAKKyAqIEpzcENvbnRleHQgLyBQYWdlQ29udGV4dDwvcD4KKyAqCisgKiA8cD5UaGUgcGFyc2VFeHByZXNzaW9uKCkgYW5kIGV2YWx1YXRlKCkgbWV0aG9kcyBtdXN0IGJlIHRocmVhZC1zYWZlLiAgCisgKiBUaGF0IGlzLCBtdWx0aXBsZSB0aHJlYWRzIG1heSBjYWxsIHRoZXNlIG1ldGhvZHMgb24gdGhlIHNhbWUgCisgKiBFeHByZXNzaW9uRXZhbHVhdG9yIG9iamVjdCBzaW11bHRhbmVvdXNseS4gIEltcGxlbWVudGF0aW9ucyBzaG91bGQgCisgKiBzeW5jaHJvbml6ZSBhY2Nlc3MgaWYgdGhleSBkZXBlbmQgb24gdHJhbnNpZW50IHN0YXRlLiAgSW1wbGVtZW50YXRpb25zIAorICogc2hvdWxkIG5vdCwgaG93ZXZlciwgYXNzdW1lIHRoYXQgb25seSBvbmUgb2JqZWN0IG9mIGVhY2ggCisgKiBFeHByZXNzaW9uRXZhbHVhdG9yIHR5cGUgd2lsbCBiZSBpbnN0YW50aWF0ZWQ7IGdsb2JhbCBjYWNoaW5nIHNob3VsZCAKKyAqIHRoZXJlZm9yZSBiZSBzdGF0aWMuPC9wPgorICoKKyAqIDxwPk9ubHkgYSBzaW5nbGUgRUwgZXhwcmVzc2lvbiwgc3RhcnRpbmcgd2l0aCAnJHsnIGFuZCBlbmRpbmcgd2l0aAorICogJ30nLCBjYW4gYmUgcGFyc2VkIG9yIGV2YWx1YXRlZCBhdCBhIHRpbWUuICBFTCBleHByZXNzaW9ucyAKKyAqIGNhbm5vdCBiZSBtaXhlZCB3aXRoIHN0YXRpYyB0ZXh0LiAgRm9yIGV4YW1wbGUsIGF0dGVtcHRpbmcgdG8gCisgKiBwYXJzZSBvciBldmFsdWF0ZSAiPGNvZGU+YWJjJHsxKzF9ZGVmJHsxKzF9Z2hpPC9jb2RlPiIgb3IgZXZlbgorICogIjxjb2RlPiR7MSsxfSR7MSsxfTwvY29kZT4iIHdpbGwgY2F1c2UgYW4gPGNvZGU+RUxFeGNlcHRpb248L2NvZGU+IHRvCisgKiBiZSB0aHJvd24uPC9wPgorICoKKyAqIDxwPlRoZSBmb2xsb3dpbmcgYXJlIGV4YW1wbGVzIG9mIHN5bnRhY3RpY2FsbHkgbGVnYWwgRUwgZXhwcmVzc2lvbnM6CisgKgorICogPHVsPgorICogICA8bGk+PGNvZGU+JHtwZXJzb24ubGFzdE5hbWV9PC9jb2RlPjwvbGk+CisgKiAgIDxsaT48Y29kZT4kezggKiA4fTwvY29kZT48L2xpPgorICogICA8bGk+PGNvZGU+JHtteTpyZXZlcnNlKCdoZWxsbycpfTwvY29kZT48L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2luY2UgMi4wCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBFeHByZXNzaW9uRXZhbHVhdG9yIHsKKworICAgIC8qKgorICAgICAqIFByZXBhcmUgYW4gZXhwcmVzc2lvbiBmb3IgbGF0ZXIgZXZhbHVhdGlvbi4gIFRoaXMgbWV0aG9kIHNob3VsZCBwZXJmb3JtCisgICAgICogc3ludGFjdGljIHZhbGlkYXRpb24gb2YgdGhlIGV4cHJlc3Npb247IGlmIGluIGRvaW5nIHNvIGl0IGRldGVjdHMgCisgICAgICogZXJyb3JzLCBpdCBzaG91bGQgcmFpc2UgYW4gRUxQYXJzZUV4Y2VwdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBleHByZXNzaW9uIFRoZSBleHByZXNzaW9uIHRvIGJlIGV2YWx1YXRlZC4KKyAgICAgKiBAcGFyYW0gZXhwZWN0ZWRUeXBlIFRoZSBleHBlY3RlZCB0eXBlIG9mIHRoZSByZXN1bHQgb2YgdGhlIGV2YWx1YXRpb24KKyAgICAgKiBAcGFyYW0gZk1hcHBlciBBIEZ1bmN0aW9uTWFwcGVyIHRvIHJlc29sdmUgZnVuY3Rpb25zIGZvdW5kIGluIAorICAgICAqICAgICB0aGUgZXhwcmVzc2lvbi4gIEl0IGNhbiBiZSBudWxsLCBpbiB3aGljaCBjYXNlIG5vIGZ1bmN0aW9ucyAKKyAgICAgKiAgICAgYXJlIHN1cHBvcnRlZCBmb3IgdGhpcyBpbnZvY2F0aW9uLiAgVGhlIEV4cHJlc3Npb25FdmFsdWF0b3IgCisgICAgICogICAgIG11c3Qgbm90IGhvbGQgb24gdG8gdGhlIEZ1bmN0aW9uTWFwcGVyIHJlZmVyZW5jZSBhZnRlciAKKyAgICAgKiAgICAgcmV0dXJuaW5nIGZyb20gPGNvZGU+cGFyc2VFeHByZXNzaW9uKCk8L2NvZGU+LiAgVGhlIAorICAgICAqICAgICA8Y29kZT5FeHByZXNzaW9uPC9jb2RlPiBvYmplY3QgcmV0dXJuZWQgbXVzdCBpbnZva2UgdGhlIHNhbWUgCisgICAgICogICAgIGZ1bmN0aW9ucyByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIG1hcHBpbmdzIGluIHRoZSAKKyAgICAgKiAgICAgcHJvdmlkZWQgPGNvZGU+RnVuY3Rpb25NYXBwZXI8L2NvZGU+IGluc3RhbmNlIGNoYW5nZSBiZXR3ZWVuIAorICAgICAqICAgICBjYWxsaW5nIDxjb2RlPkV4cHJlc3Npb25FdmFsdWF0b3IucGFyc2VFeHByZXNzaW9uKCk8L2NvZGU+CisgICAgICogICAgIGFuZCA8Y29kZT5FeHByZXNzaW9uLmV2YWx1YXRlKCk8L2NvZGU+LgorICAgICAqIEByZXR1cm4gVGhlIEV4cHJlc3Npb24gb2JqZWN0IGVuY2Fwc3VsYXRpbmcgdGhlIGFyZ3VtZW50cy4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRUxFeGNlcHRpb24gVGhyb3duIGlmIHBhcnNpbmcgZXJyb3JzIHdlcmUgZm91bmQuCisgICAgICovIAorICAgIHB1YmxpYyBhYnN0cmFjdCBFeHByZXNzaW9uIHBhcnNlRXhwcmVzc2lvbiggU3RyaW5nIGV4cHJlc3Npb24sIAorCQkJCSAgICAgICBDbGFzcyBleHBlY3RlZFR5cGUsIAorCQkJCSAgICAgICBGdW5jdGlvbk1hcHBlciBmTWFwcGVyICkgCisgICAgICB0aHJvd3MgRUxFeGNlcHRpb247IAorCisKKyAgICAvKiogCisgICAgICogRXZhbHVhdGVzIGFuIGV4cHJlc3Npb24uICBUaGlzIG1ldGhvZCBtYXkgcGVyZm9ybSBzb21lIHN5bnRhY3RpYyAKKyAgICAgKiB2YWxpZGF0aW9uIGFuZCwgaWYgc28sIGl0IHNob3VsZCByYWlzZSBhbiBFTFBhcnNlRXhjZXB0aW9uIGVycm9yIGlmIAorICAgICAqIGl0IGVuY291bnRlcnMgc3ludGFjdGljIGVycm9ycy4gIEVMIGV2YWx1YXRpb24gZXJyb3JzIHNob3VsZCBjYXVzZSAKKyAgICAgKiBhbiBFTEV4Y2VwdGlvbiB0byBiZSByYWlzZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXhwcmVzc2lvbiBUaGUgZXhwcmVzc2lvbiB0byBiZSBldmFsdWF0ZWQuCisgICAgICogQHBhcmFtIGV4cGVjdGVkVHlwZSBUaGUgZXhwZWN0ZWQgdHlwZSBvZiB0aGUgcmVzdWx0IG9mIHRoZSBldmFsdWF0aW9uCisgICAgICogQHBhcmFtIHZSZXNvbHZlciBBIFZhcmlhYmxlUmVzb2x2ZXIgaW5zdGFuY2UgdGhhdCBjYW4gYmUgdXNlZCBhdCAKKyAgICAgKiAgICAgcnVudGltZSB0byByZXNvbHZlIHRoZSBuYW1lIG9mIGltcGxpY2l0IG9iamVjdHMgaW50byBPYmplY3RzLgorICAgICAqIEBwYXJhbSBmTWFwcGVyIEEgRnVuY3Rpb25NYXBwZXIgdG8gcmVzb2x2ZSBmdW5jdGlvbnMgZm91bmQgaW4gCisgICAgICogICAgIHRoZSBleHByZXNzaW9uLiAgSXQgY2FuIGJlIG51bGwsIGluIHdoaWNoIGNhc2Ugbm8gZnVuY3Rpb25zIAorICAgICAqICAgICBhcmUgc3VwcG9ydGVkIGZvciB0aGlzIGludm9jYXRpb24uICAKKyAgICAgKiBAcmV0dXJuIFRoZSByZXN1bHQgb2YgdGhlIGV4cHJlc3Npb24gZXZhbHVhdGlvbi4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gRUxFeGNlcHRpb24gVGhyb3duIGlmIHRoZSBleHByZXNzaW9uIGV2YWx1YXRpb24gZmFpbGVkLgorICAgICAqLyAKKyAgICBwdWJsaWMgYWJzdHJhY3QgT2JqZWN0IGV2YWx1YXRlKCBTdHJpbmcgZXhwcmVzc2lvbiwgCisJCQkgICAgQ2xhc3MgZXhwZWN0ZWRUeXBlLCAKKwkJCSAgICBWYXJpYWJsZVJlc29sdmVyIHZSZXNvbHZlciwKKwkJCSAgICBGdW5jdGlvbk1hcHBlciBmTWFwcGVyICkgCisgICAgICB0aHJvd3MgRUxFeGNlcHRpb247IAorfQorCmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvZWwvRnVuY3Rpb25NYXBwZXIuamF2YSBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC9lbC9GdW5jdGlvbk1hcHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhZDc5YTYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvZWwvRnVuY3Rpb25NYXBwZXIuamF2YQpAQCAtMCwwICsxLDM4IEBACisvKgorKiBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK3BhY2thZ2UgamF2YXguc2VydmxldC5qc3AuZWw7CisKKy8qKgorICogPHA+VGhlIGludGVyZmFjZSB0byBhIG1hcCBiZXR3ZWVuIEVMIGZ1bmN0aW9uIG5hbWVzIGFuZCBtZXRob2RzLjwvcD4KKyAqCisgKiA8cD5DbGFzc2VzIGltcGxlbWVudGluZyB0aGlzIGludGVyZmFjZSBtYXksIGZvciBpbnN0YW5jZSwgY29uc3VsdCB0YWcgbGlicmFyeQorICogaW5mb3JtYXRpb24gdG8gcmVzb2x2ZSB0aGUgbWFwLiA8L3A+CisgKgorICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgaW50ZXJmYWNlIEZ1bmN0aW9uTWFwcGVyIHsKKyAgLyoqCisgICAqIFJlc29sdmVzIHRoZSBzcGVjaWZpZWQgbG9jYWwgbmFtZSBhbmQgcHJlZml4IGludG8gYSBKYXZhLmxhbmcuTWV0aG9kLgorICAgKiBSZXR1cm5zIG51bGwgaWYgdGhlIHByZWZpeCBhbmQgbG9jYWwgbmFtZSBhcmUgbm90IGZvdW5kLgorICAgKiAKKyAgICogQHBhcmFtIHByZWZpeCB0aGUgcHJlZml4IG9mIHRoZSBmdW5jdGlvbiwgb3IgIiIgaWYgbm8gcHJlZml4LgorICAgKiBAcGFyYW0gbG9jYWxOYW1lIHRoZSBzaG9ydCBuYW1lIG9mIHRoZSBmdW5jdGlvbgorICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgdGhlIG1ldGhvZCBtYXBwaW5nLiAgTnVsbCBtZWFucyBubyBlbnRyeSBmb3VuZC4KKyAgICoqLworICBwdWJsaWMgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIHJlc29sdmVGdW5jdGlvbihTdHJpbmcgcHJlZml4LCAKKyAgICAgIFN0cmluZyBsb2NhbE5hbWUpOworfQpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL2VsL1ZhcmlhYmxlUmVzb2x2ZXIuamF2YSBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC9lbC9WYXJpYWJsZVJlc29sdmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA3MmU4YwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC9lbC9WYXJpYWJsZVJlc29sdmVyLmphdmEKQEAgLTAsMCArMSw0OSBAQAorLyoKKyogQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitwYWNrYWdlIGphdmF4LnNlcnZsZXQuanNwLmVsOworCisvKioKKyAqIDxwPlRoaXMgY2xhc3MgaXMgdXNlZCB0byBjdXN0b21pemUgdGhlIHdheSBhbiBFeHByZXNzaW9uRXZhbHVhdG9yIHJlc29sdmVzCisgKiB2YXJpYWJsZSByZWZlcmVuY2VzIGF0IGV2YWx1YXRpb24gdGltZS4gIEZvciBleGFtcGxlLCBpbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBjYW4KKyAqIGltcGxlbWVudCB0aGVpciBvd24gdmFyaWFibGUgbG9va3VwIG1lY2hhbmlzbXMsIG9yIGludHJvZHVjZSB0aGUKKyAqIG5vdGlvbiBvZiAiaW1wbGljaXQgdmFyaWFibGVzIiB3aGljaCBvdmVycmlkZSBhbnkgb3RoZXIgdmFyaWFibGVzLgorICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBzaG91bGQgYmUgcGFzc2VkIHdoZW4gZXZhbHVhdGluZworICogYW4gZXhwcmVzc2lvbi48L3A+CisgKgorICogPHA+QW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBpbmNsdWRlcyB0aGUgY29udGV4dCBhZ2FpbnN0IHdoaWNoIHJlc29sdXRpb24KKyAqIHdpbGwgaGFwcGVuPC9wPgorICoKKyAqIEBzaW5jZSAyLjAKKyAqLworcHVibGljIGludGVyZmFjZSBWYXJpYWJsZVJlc29sdmVyCit7CisgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvKioKKyAgICogUmVzb2x2ZXMgdGhlIHNwZWNpZmllZCB2YXJpYWJsZS4KKyAgICogUmV0dXJucyBudWxsIGlmIHRoZSB2YXJpYWJsZSBpcyBub3QgZm91bmQuCisgICAqIAorICAgKiBAcGFyYW0gcE5hbWUgdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRvIHJlc29sdmUKKyAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIHRoZSB2YXJpYWJsZSByZXNvbHV0aW9uCisgICAqCisgICAqIEB0aHJvd3MgRUxFeGNlcHRpb24gaWYgYSBmYWlsdXJlIG9jY3VycmVkIHdoaWxlIHRyeWluZyB0byByZXNvbHZlCisgICAqICAgICB0aGUgZ2l2ZW4gdmFyaWFibGUKKyAgICoqLworICBwdWJsaWMgT2JqZWN0IHJlc29sdmVWYXJpYWJsZSAoU3RyaW5nIHBOYW1lKQorICAgIHRocm93cyBFTEV4Y2VwdGlvbjsKKwkJCQkJCisgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfQpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL2VsL3BhY2thZ2UuaHRtbCBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC9lbC9wYWNrYWdlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBlYWZiYgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC9lbC9wYWNrYWdlLmh0bWwKQEAgLTAsMCArMSw3NSBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9JRVRGLy9EVEQgSFRNTC8vRU4iPgorPGh0bWw+Cis8aGVhZD4KKzwhLS0KKyAgLSBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCisgIC0KKyAgLSBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKKyAgLSByZXNlcnZlZC4KKyAgLQorICAtIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAtIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAtIGFyZSBtZXQ6CisgIC0KKyAgLSAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAtICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgIC0KKyAgLSAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAtICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICAtICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAgLSAgICBkaXN0cmlidXRpb24uCisgIC0KKyAgLSAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKKyAgLSAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OiAgCisgIC0gICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIAorICAtICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgorICAtICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKKyAgLSAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgorICAtCisgIC0gNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIlRvbWNhdCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCisgIC0gICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAtICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCisgIC0gICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCisgIC0KKyAgLSA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgorICAtICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICAtICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KKyAgLQorICAtIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKKyAgLSBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICAtIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgIC0gRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgorICAtIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAgLSBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgIC0gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgorICAtIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAgLSBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAgLSBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAgLSBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAgLSBTVUNIIERBTUFHRS4KKyAgLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAtCisgIC0gVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKKyAgLSBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKKyAgLSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKKyAgLSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCisgIC0KKyAgLS0+Cis8L2hlYWQ+Cis8Ym9keSBiZ2NvbG9yPSJ3aGl0ZSI+CisKK0NsYXNzZXMgYW5kIGludGVyZmFjZXMgZm9yIHRoZSBKU1AgMi4wIEV4cHJlc3Npb24gTGFuZ3VhZ2UgQVBJLgorCis8cD4KK1RoZSBKYXZhU2VydmVyIFBhZ2VzKHRtKSAoSlNQKSAyLjAgc3BlY2lmaWNhdGlvbiBwcm92aWRlcyBhIHBvcnRhYmxlCitBUEkgZm9yIGV2YWx1YXRpbmcgIkVMIEV4cHJlc3Npb25zIi4gIEFzIG9mIEpTUCAyLjAsIEVMIGV4cHJlc3Npb25zIGNhbgorYmUgcGxhY2VkIGRpcmVjdGx5IGluIHRoZSB0ZW1wbGF0ZSB0ZXh0IG9mIEpTUCBwYWdlcyBhbmQgdGFnIGZpbGVzLgorPHA+CitUaGlzIHBhY2thZ2UgY29udGFpbnMgYSBudW1iZXIgb2YgY2xhc3NlcyBhbmQgaW50ZXJmYWNlcyB0aGF0IGRlc2NyaWJlIAorYW5kIGRlZmluZSBwcm9ncmFtbWF0aWMgYWNjZXNzIHRvIHRoZSBFeHByZXNzaW9uIExhbmd1YWdlIGV2YWx1YXRvci4gCitUaGlzIEFQSSBjYW4gYWxzbyBiZSB1c2VkIGJ5IGFuIGltcGxlbWVudGF0aW9uIG9mIEpTUCB0byBldmFsdWF0ZSB0aGUgCitleHByZXNzaW9ucywgYnV0IG90aGVyIGltcGxlbWVudGF0aW9ucywgbGlrZSBvcGVuLWNvZGluZyBpbnRvIEphdmEgCitieXRlY29kZXMsIGFyZSBhbGxvd2VkLiAgVGhpcyBwYWNrYWdlIGlzIGludGVuZGVkIHRvIGhhdmUgbm8gZGVwZW5kZW5jaWVzIAorb24gb3RoZXIgcG9ydGlvbnMgb2YgdGhlIEpTUCAyLjAgc3BlY2lmaWNhdGlvbi4gCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvcGFja2FnZS5odG1sIGIvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL3BhY2thZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGVhZmI5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDY3IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL0lFVEYvL0RURCBIVE1MLy9FTiI+Cis8aHRtbD4KKzxoZWFkPgorPCEtLQorICAtIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKKyAgLQorICAtIENvcHlyaWdodCAoYykgMTk5OSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIAorICAtIHJlc2VydmVkLgorICAtCisgIC0gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgIC0gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgIC0gYXJlIG1ldDoKKyAgLQorICAtIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgIC0gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAgLQorICAtIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgIC0gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgIC0gICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICAtICAgIGRpc3RyaWJ1dGlvbi4KKyAgLQorICAtIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZgorICAtICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6ICAKKyAgLSAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgCisgIC0gICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCisgIC0gICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAorICAtICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBhcHBlYXIuCisgIC0KKyAgLSA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiVG9tY2F0IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKKyAgLSAgICBGb3VuZGF0aW9uIiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgIC0gICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKKyAgLSAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KKyAgLQorICAtIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCisgIC0gICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgIC0gICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgorICAtCisgIC0gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAorICAtIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgIC0gT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAgLSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCisgIC0gSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICAtIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAgLSBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgIC0gVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICAtIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICAtIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorICAtIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICAtIFNVQ0ggREFNQUdFLgorICAtID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIC0KKyAgLSBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQorICAtIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQorICAtIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQorICAtIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KKyAgLQorICAtLT4KKzwvaGVhZD4KKzxib2R5IGJnY29sb3I9IndoaXRlIj4KK0NsYXNzZXMgYW5kIGludGVyZmFjZXMgZm9yIHRoZSBDb3JlIEpTUCAyLjAgQVBJLgorPHA+CitUaGUgamF2YXguc2VydmxldC5qc3AgcGFja2FnZSBjb250YWlucyBhIG51bWJlciBvZiBjbGFzc2VzIGFuZAoraW50ZXJmYWNlcyB0aGF0IGRlc2NyaWJlIGFuZCBkZWZpbmUgdGhlIGNvbnRyYWN0cyBiZXR3ZWVuIGEgSlNQIHBhZ2UKK2ltcGxlbWVudGF0aW9uIGNsYXNzIGFuZCB0aGUgcnVudGltZSBlbnZpcm9ubWVudCBwcm92aWRlZCBmb3IgYW4KK2luc3RhbmNlIG9mIHN1Y2ggYSBjbGFzcyBieSBhIGNvbmZvcm1pbmcgSlNQIGNvbnRhaW5lci4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC90YWdleHQvQm9keUNvbnRlbnQuamF2YSBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC90YWdleHQvQm9keUNvbnRlbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTA5ZTJmCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL3RhZ2V4dC9Cb2R5Q29udGVudC5qYXZhCkBAIC0wLDAgKzEsMTM4IEBACisvKgorKiBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovIAorcGFja2FnZSBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQ7CisKK2ltcG9ydCBqYXZhLmlvLlJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLldyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLio7CisKKy8qKgorICogQW4gZW5jYXBzdWxhdGlvbiBvZiB0aGUgZXZhbHVhdGlvbiBvZiB0aGUgYm9keSBvZiBhbiBhY3Rpb24gc28gaXQgaXMKKyAqIGF2YWlsYWJsZSB0byBhIHRhZyBoYW5kbGVyLiAgQm9keUNvbnRlbnQgaXMgYSBzdWJjbGFzcyBvZiBKc3BXcml0ZXIuCisgKgorICogPHA+CisgKiBOb3RlIHRoYXQgdGhlIGNvbnRlbnQgb2YgQm9keUNvbnRlbnQgaXMgdGhlIHJlc3VsdCBvZiBldmFsdWF0aW9uLCBzbworICogaXQgd2lsbCBub3QgY29udGFpbiBhY3Rpb25zIGFuZCB0aGUgbGlrZSwgYnV0IHRoZSByZXN1bHQgb2YgdGhlaXIKKyAqIGludm9jYXRpb24uCisgKiAKKyAqIDxwPgorICogQm9keUNvbnRlbnQgaGFzIG1ldGhvZHMgdG8gY29udmVydCBpdHMgY29udGVudHMgaW50bworICogYSBTdHJpbmcsIHRvIHJlYWQgaXRzIGNvbnRlbnRzLCBhbmQgdG8gY2xlYXIgdGhlIGNvbnRlbnRzLgorICoKKyAqIDxwPgorICogVGhlIGJ1ZmZlciBzaXplIG9mIGEgQm9keUNvbnRlbnQgb2JqZWN0IGlzIHVuYm91bmRlZC4gIEEKKyAqIEJvZHlDb250ZW50IG9iamVjdCBjYW5ub3QgYmUgaW4gYXV0b0ZsdXNoIG1vZGUuICBJdCBpcyBub3QgcG9zc2libGUgdG8KKyAqIGludm9rZSBmbHVzaCBvbiBhIEJvZHlDb250ZW50IG9iamVjdCwgYXMgdGhlcmUgaXMgbm8gYmFja2luZyBzdHJlYW0uCisgKgorICogPHA+CisgKiBJbnN0YW5jZXMgb2YgQm9keUNvbnRlbnQgYXJlIGNyZWF0ZWQgYnkgaW52b2tpbmcgdGhlIHB1c2hCb2R5IGFuZAorICogcG9wQm9keSBtZXRob2RzIG9mIHRoZSBQYWdlQ29udGV4dCBjbGFzcy4gIEEgQm9keUNvbnRlbnQgaXMgZW5jbG9zZWQKKyAqIHdpdGhpbiBhbm90aGVyIEpzcFdyaXRlciAobWF5YmUgYW5vdGhlciBCb2R5Q29udGVudCBvYmplY3QpIGZvbGxvd2luZworICogdGhlIHN0cnVjdHVyZSBvZiB0aGVpciBhc3NvY2lhdGVkIGFjdGlvbnMuCisgKgorICogPHA+CisgKiBBIEJvZHlDb250ZW50IGlzIG1hZGUgYXZhaWxhYmxlIHRvIGEgQm9keVRhZyB0aHJvdWdoIGEgc2V0Qm9keUNvbnRlbnQoKQorICogY2FsbC4gIFRoZSB0YWcgaGFuZGxlciBjYW4gdXNlIHRoZSBvYmplY3QgdW50aWwgYWZ0ZXIgdGhlIGNhbGwgdG8KKyAqIGRvRW5kVGFnKCkuCisgKi8KKworcHVibGljIGFic3RyYWN0IGNsYXNzIEJvZHlDb250ZW50IGV4dGVuZHMgSnNwV3JpdGVyIHsKKyAgICAKKyAgICAvKioKKyAgICAgKiBQcm90ZWN0ZWQgY29uc3RydWN0b3IuCisgICAgICoKKyAgICAgKiBVbmJvdW5kZWQgYnVmZmVyLCBubyBhdXRvZmx1c2hpbmcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZSB0aGUgZW5jbG9zaW5nIEpzcFdyaXRlcgorICAgICAqLworCisgICAgcHJvdGVjdGVkIEJvZHlDb250ZW50KEpzcFdyaXRlciBlKSB7CisJc3VwZXIoVU5CT1VOREVEX0JVRkZFUiAsIGZhbHNlKTsKKwl0aGlzLmVuY2xvc2luZ1dyaXRlciA9IGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVkZWZpbmVkIGZsdXNoKCkgc28gaXQgaXMgbm90IGxlZ2FsLgorICAgICAqCisgICAgICogPHA+CisgICAgICogSXQgaXMgbm90IHZhbGlkIHRvIGZsdXNoIGEgQm9keUNvbnRlbnQgYmVjYXVzZSB0aGVyZSBpcyBubyBiYWNraW5nCisgICAgICogc3RyZWFtIGJlaGluZCBpdC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gYWx3YXlzIHRocm93bgorICAgICAqLworCisgICAgcHVibGljIHZvaWQgZmx1c2goKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXRocm93IG5ldyBJT0V4Y2VwdGlvbigiSWxsZWdhbCB0byBmbHVzaCB3aXRoaW4gYSBjdXN0b20gdGFnIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xlYXIgdGhlIGJvZHkgd2l0aG91dCB0aHJvd2luZyBhbnkgZXhjZXB0aW9ucy4KKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBjbGVhckJvZHkoKSB7CisJdHJ5IHsKKwkgICAgdGhpcy5jbGVhcigpOworCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisJICAgIC8vIFRPRE8gLS0gY2xlYW4gdGhpcyBvbmUgdXAuCisJICAgIHRocm93IG5ldyBFcnJvcigiaW50ZXJuYWwgZXJyb3IhOyIpOworCX0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHZhbHVlIG9mIHRoaXMgQm9keUNvbnRlbnQgYXMgYSBSZWFkZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGlzIEJvZHlDb250ZW50IGFzIGEgUmVhZGVyCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFJlYWRlciBnZXRSZWFkZXIoKTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgQm9keUNvbnRlbnQgYXMgYSBTdHJpbmcuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgQm9keUNvbnRlbnQgYXMgYSBTdHJpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFN0cmluZygpOworCQorCisgICAgLyoqCisgICAgICogV3JpdGUgdGhlIGNvbnRlbnRzIG9mIHRoaXMgQm9keUNvbnRlbnQgaW50byBhIFdyaXRlci4KKyAgICAgKiBTdWJjbGFzc2VzIG1heSBvcHRpbWl6ZSBjb21tb24gaW52b2NhdGlvbiBwYXR0ZXJucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvdXQgVGhlIHdyaXRlciBpbnRvIHdoaWNoIHRvIHBsYWNlIHRoZSBjb250ZW50cyBvZgorICAgICAqICAgICB0aGlzIGJvZHkgZXZhbHVhdGlvbgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW4gSS9PIGVycm9yIG9jY3VycmVkIHdoaWxlIHdyaXRpbmcgdGhlCisgICAgICogICAgIGNvbnRlbnRzIG9mIHRoaXMgQm9keUNvbnRlbnQgdG8gdGhlIGdpdmVuIFdyaXRlcgorICAgICAqLworCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgd3JpdGVPdXQoV3JpdGVyIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uOworCisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGVuY2xvc2luZyBKc3BXcml0ZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBlbmNsb3NpbmcgSnNwV3JpdGVyIHBhc3NlZCBhdCBjb25zdHJ1Y3Rpb24gdGltZQorICAgICAqLworCisgICAgcHVibGljIEpzcFdyaXRlciBnZXRFbmNsb3NpbmdXcml0ZXIoKSB7CisJcmV0dXJuIGVuY2xvc2luZ1dyaXRlcjsKKyAgICB9CisKKworICAgIC8vIHByaXZhdGUgZmllbGRzCisKKyAgICBwcml2YXRlIEpzcFdyaXRlciBlbmNsb3NpbmdXcml0ZXI7CisgfQpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL3RhZ2V4dC9Cb2R5VGFnLmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvdGFnZXh0L0JvZHlUYWcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTJkNGY0Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL3RhZ2V4dC9Cb2R5VGFnLmphdmEKQEAgLTAsMCArMSwxODUgQEAKKy8qCisqIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KK3BhY2thZ2UgamF2YXguc2VydmxldC5qc3AudGFnZXh0OworCitpbXBvcnQgamF2YXguc2VydmxldC5qc3AuKjsKKworLyoqCisgKiBUaGUgQm9keVRhZyBpbnRlcmZhY2UgZXh0ZW5kcyBJdGVyYXRpb25UYWcgYnkgZGVmaW5pbmcgYWRkaXRpb25hbAorICogbWV0aG9kcyB0aGF0IGxldCBhIHRhZyBoYW5kbGVyIG1hbmlwdWxhdGUgdGhlIGNvbnRlbnQgb2YgZXZhbHVhdGluZyBpdHMgYm9keS4KKyAqCisgKiA8cD4KKyAqIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgdGFnIGhhbmRsZXIgdG8gbWFuaXB1bGF0ZSB0aGUgYm9keQorICogY29udGVudC4gIEZvciBleGFtcGxlIHRoZSB0YWcgaGFuZGxlciBtYXkgdGFrZSB0aGUgYm9keSBjb250ZW50LAorICogY29udmVydCBpdCBpbnRvIGEgU3RyaW5nIHVzaW5nIHRoZSBib2R5Q29udGVudC5nZXRTdHJpbmcKKyAqIG1ldGhvZCBhbmQgdGhlbiB1c2UgaXQuICBPciB0aGUgdGFnIGhhbmRsZXIgbWF5IHRha2UgdGhlIGJvZHkKKyAqIGNvbnRlbnQgYW5kIHdyaXRlIGl0IG91dCBpbnRvIGl0cyBlbmNsb3NpbmcgSnNwV3JpdGVyIHVzaW5nCisgKiB0aGUgYm9keUNvbnRlbnQud3JpdGVPdXQgbWV0aG9kLgorICoKKyAqIDxwPiBBIHRhZyBoYW5kbGVyIHRoYXQgaW1wbGVtZW50cyBCb2R5VGFnIGlzIHRyZWF0ZWQgYXMgb25lIHRoYXQKKyAqIGltcGxlbWVudHMgSXRlcmF0aW9uVGFnLCBleGNlcHQgdGhhdCB0aGUgZG9TdGFydFRhZyBtZXRob2QgY2FuCisgKiByZXR1cm4gU0tJUF9CT0RZLCBFVkFMX0JPRFlfSU5DTFVERSBvciBFVkFMX0JPRFlfQlVGRkVSRUQuCisgKgorICogPHA+CisgKiBJZiBFVkFMX0JPRFlfSU5DTFVERSBpcyByZXR1cm5lZCwgdGhlbiBldmFsdWF0aW9uIGhhcHBlbnMKKyAqIGFzIGluIEl0ZXJhdGlvblRhZy4KKyAqCisgKiA8cD4KKyAqIElmIEVWQUxfQk9EWV9CVUZGRVJFRCBpcyByZXR1cm5lZCwgdGhlbiBhIEJvZHlDb250ZW50IG9iamVjdCB3aWxsIGJlCisgKiBjcmVhdGVkIChieSBjb2RlIGdlbmVyYXRlZCBieSB0aGUgSlNQIGNvbXBpbGVyKSB0byBjYXB0dXJlIHRoZSBib2R5CisgKiBldmFsdWF0aW9uLgorICogVGhlIGNvZGUgZ2VuZXJhdGVkIGJ5IHRoZSBKU1AgY29tcGlsZXIgb2J0YWlucyB0aGUgQm9keUNvbnRlbnQgb2JqZWN0IGJ5CisgKiBjYWxsaW5nIHRoZSBwdXNoQm9keSBtZXRob2Qgb2YgdGhlIGN1cnJlbnQgcGFnZUNvbnRleHQsIHdoaWNoCisgKiBhZGRpdGlvbmFsbHkgaGFzIHRoZSBlZmZlY3Qgb2Ygc2F2aW5nIHRoZSBwcmV2aW91cyBvdXQgdmFsdWUuCisgKiBUaGUgcGFnZSBjb21waWxlciByZXR1cm5zIHRoaXMgb2JqZWN0IGJ5IGNhbGxpbmcgdGhlIHBvcEJvZHkKKyAqIG1ldGhvZCBvZiB0aGUgUGFnZUNvbnRleHQgY2xhc3M7CisgKiB0aGUgY2FsbCBhbHNvIHJlc3RvcmVzIHRoZSB2YWx1ZSBvZiBvdXQuCisgKgorICogPHA+CisgKiBUaGUgaW50ZXJmYWNlIHByb3ZpZGVzIG9uZSBuZXcgcHJvcGVydHkgd2l0aCBhIHNldHRlciBtZXRob2QgYW5kIG9uZQorICogbmV3IGFjdGlvbiBtZXRob2QuCisgKgorICogPHA+PEI+UHJvcGVydGllczwvQj4KKyAqIDxwPiBUaGVyZSBpcyBhIG5ldyBwcm9wZXJ0eTogYm9keUNvbnRlbnQsIHRvIGNvbnRhaW4gdGhlIEJvZHlDb250ZW50CisgKiBvYmplY3QsIHdoZXJlIHRoZSBKU1AgUGFnZSBpbXBsZW1lbnRhdGlvbiBvYmplY3Qgd2lsbCBwbGFjZSB0aGUKKyAqIGV2YWx1YXRpb24gKGFuZCByZWV2YWx1YXRpb24sIGlmIGFwcHJvcHJpYXRlKSBvZiB0aGUgYm9keS4gIFRoZSBzZXR0ZXIKKyAqIG1ldGhvZCAoc2V0Qm9keUNvbnRlbnQpIHdpbGwgb25seSBiZSBpbnZva2VkIGlmIGRvU3RhcnRUYWcoKSByZXR1cm5zCisgKiBFVkFMX0JPRFlfQlVGRkVSRUQgYW5kIHRoZSBjb3JyZXNwb25kaW5nIGFjdGlvbiBlbGVtZW50IGRvZXMgbm90IGhhdmUKKyAqIGFuIGVtcHR5IGJvZHkuCisgKgorICogPHA+PEI+TWV0aG9kczwvQj4KKyAqIDxwPiBJbiBhZGRpdGlvbiB0byB0aGUgc2V0dGVyIG1ldGhvZCBmb3IgdGhlIGJvZHlDb250ZW50IHByb3BlcnR5LCB0aGVyZQorICogaXMgYSBuZXcgYWN0aW9uIG1ldGhvZDogZG9Jbml0Qm9keSgpLCB3aGljaCBpcyBpbnZva2VkIHJpZ2h0IGFmdGVyCisgKiBzZXRCb2R5Q29udGVudCgpIGFuZCBiZWZvcmUgdGhlIGJvZHkgZXZhbHVhdGlvbi4gIFRoaXMgbWV0aG9kIGlzIG9ubHkKKyAqIGludm9rZWQgaWYgZG9TdGFydFRhZygpIHJldHVybnMgRVZBTF9CT0RZX0JVRkZFUkVELgorICoKKyAqIDxwPjxCPkxpZmVjeWNsZTwvQj4KKyAqIDxwPiBMaWZlY3ljbGUgZGV0YWlscyBhcmUgZGVzY3JpYmVkIGJ5IHRoZSB0cmFuc2l0aW9uIGRpYWdyYW0gYmVsb3cuCisgKiBFeGNlcHRpb25zIHRoYXQgYXJlIHRocm93biBkdXJpbmcgdGhlIGNvbXB1dGF0aW9uIG9mIGRvU3RhcnRUYWcoKSwKKyAqIHNldEJvZHlDb250ZW50KCksIGRvSW5pdEJvZHkoKSwgQk9EWSwgZG9BZnRlckJvZHkoKSBpbnRlcnJ1cHQgdGhlCisgKiBleGVjdXRpb24gc2VxdWVuY2UgYW5kIGFyZSBwcm9wYWdhdGVkIHVwIHRoZSBzdGFjaywgdW5sZXNzIHRoZQorICogdGFnIGhhbmRsZXIgaW1wbGVtZW50cyB0aGUgVHJ5Q2F0Y2hGaW5hbGx5IGludGVyZmFjZTsgc2VlIHRoYXQKKyAqIGludGVyZmFjZSBmb3IgZGV0YWlscy4KKyAqIDxwPgorICogPElNRyBzcmM9ImRvYy1maWxlcy9Cb2R5VGFnUHJvdG9jb2wuZ2lmIgorICogICAgICBhbHQ9IkxpZmVjeWNsZSBEZXRhaWxzIFRyYW5zaXRpb24gRGlhZ3JhbSBmb3IgQm9keVRhZyIvPgorICoKKyAqIDxwPjxCPkVtcHR5IGFuZCBOb24tRW1wdHkgQWN0aW9uPC9CPgorICogPHA+IElmIHRoZSBUYWdMaWJyYXJ5RGVzY3JpcHRvciBmaWxlIGluZGljYXRlcyB0aGF0IHRoZSBhY3Rpb24gbXVzdAorICogYWx3YXlzIGhhdmUgYW4gZW1wdHkgZWxlbWVudCBib2R5LCBieSBhbiAmbHQ7Ym9keS1jb250ZW50Jmd0OyBlbnRyeSAKKyAqIG9mICJlbXB0eSIsIHRoZW4gdGhlIGRvU3RhcnRUYWcoKSBtZXRob2QgbXVzdCByZXR1cm4gU0tJUF9CT0RZLgorICogT3RoZXJ3aXNlLCB0aGUgZG9TdGFydFRhZygpIG1ldGhvZCBtYXkgcmV0dXJuIFNLSVBfQk9EWSwKKyAqIEVWQUxfQk9EWV9JTkNMVURFLCBvciBFVkFMX0JPRFlfQlVGRkVSRUQuCisgKgorICogPHA+Tm90ZSB0aGF0IHdoaWNoIG1ldGhvZHMgYXJlIGludm9rZWQgYWZ0ZXIgdGhlIGRvU3RhcnRUYWcoKSBkZXBlbmRzIG9uIAorICogYm90aCB0aGUgcmV0dXJuIHZhbHVlIGFuZCBvbiBpZiB0aGUgY3VzdG9tIGFjdGlvbiBlbGVtZW50IGlzIGVtcHR5CisgKiBvciBub3QgaW4gdGhlIEpTUCBwYWdlLCBub3QgaG93IGl0J3MgZGVjbGFyZWQgaW4gdGhlIFRMRC4KKyAqCisgKiA8cD4KKyAqIElmIFNLSVBfQk9EWSBpcyByZXR1cm5lZCB0aGUgYm9keSBpcyBub3QgZXZhbHVhdGVkLCBhbmQgZG9FbmRUYWcoKSBpcworICogaW52b2tlZC4KKyAqCisgKiA8cD4KKyAqIElmIEVWQUxfQk9EWV9JTkNMVURFIGlzIHJldHVybmVkLCBhbmQgdGhlIGN1c3RvbSBhY3Rpb24gZWxlbWVudCBpcyBub3QKKyAqIGVtcHR5LCBzZXRCb2R5Q29udGVudCgpIGlzIG5vdCBpbnZva2VkLAorICogZG9Jbml0Qm9keSgpIGlzIG5vdCBpbnZva2VkLCB0aGUgYm9keSBpcyBldmFsdWF0ZWQgYW5kCisgKiAicGFzc2VkIHRocm91Z2giIHRvIHRoZSBjdXJyZW50IG91dCwgZG9BZnRlckJvZHkoKSBpcyBpbnZva2VkCisgKiBhbmQgdGhlbiwgYWZ0ZXIgemVybyBvciBtb3JlIGl0ZXJhdGlvbnMsIGRvRW5kVGFnKCkgaXMgaW52b2tlZC4KKyAqIElmIHRoZSBjdXN0b20gYWN0aW9uIGVsZW1lbnQgaXMgZW1wdHksIG9ubHkgZG9TdGFydCgpIGFuZCAKKyAqIGRvRW5kVGFnKCkgYXJlIGludm9rZWQuCisgKgorICogPHA+CisgKiBJZiBFVkFMX0JPRFlfQlVGRkVSRUQgaXMgcmV0dXJuZWQsIGFuZCB0aGUgY3VzdG9tIGFjdGlvbiBlbGVtZW50IGlzIG5vdAorICogZW1wdHksIHNldEJvZHlDb250ZW50KCkgaXMgaW52b2tlZCwKKyAqIGRvSW5pdEJvZHkoKSBpcyBpbnZva2VkLCB0aGUgYm9keSBpcyBldmFsdWF0ZWQsIGRvQWZ0ZXJCb2R5KCkgaXMKKyAqIGludm9rZWQsIGFuZCB0aGVuLCBhZnRlciB6ZXJvIG9yIG1vcmUgaXRlcmF0aW9ucywgZG9FbmRUYWcoKSBpcyBpbnZva2VkLgorICogSWYgdGhlIGN1c3RvbSBhY3Rpb24gZWxlbWVudCBpcyBlbXB0eSwgb25seSBkb1N0YXJ0KCkgYW5kIGRvRW5kVGFnKCkgCisgKiBhcmUgaW52b2tlZC4KKyAqLworCitwdWJsaWMgaW50ZXJmYWNlIEJvZHlUYWcgZXh0ZW5kcyBJdGVyYXRpb25UYWcgeworCisgICAgLyoqCisgICAgICogRGVwcmVjYXRlZCBjb25zdGFudCB0aGF0IGhhcyB0aGUgc2FtZSB2YWx1ZSBhcyBFVkFMX0JPRFlfQlVGRkVSRUQKKyAgICAgKiBhbmQgRVZBTF9CT0RZX0FHQUlOLiAgVGhpcyBuYW1lIGhhcyBiZWVuIG1hcmtlZCBhcyBkZXByZWNhdGVkCisgICAgICogdG8gZW5jb3VyYWdlIHRoZSB1c2Ugb2YgdGhlIHR3byBkaWZmZXJlbnQgdGVybXMsIHdoaWNoIGFyZSBtdWNoCisgICAgICogbW9yZSBkZXNjcmlwdGl2ZS4KKyAgICAgKgorICAgICAqIEBkZXByZWNhdGVkCUFzIG9mIEphdmEgSlNQIEFQSSAxLjIsIHVzZSBCb2R5VGFnLkVWQUxfQk9EWV9CVUZGRVJFRAorICAgICAqIG9yIEl0ZXJhdGlvblRhZy5FVkFMX0JPRFlfQUdBSU4uCisgICAgICovCisgCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgRVZBTF9CT0RZX1RBRyA9IDI7CisKKyAgICAvKioKKyAgICAgKiBSZXF1ZXN0IHRoZSBjcmVhdGlvbiBvZiBuZXcgYnVmZmVyLCBhIEJvZHlDb250ZW50IG9uIHdoaWNoIHRvCisgICAgICogZXZhbHVhdGUgdGhlIGJvZHkgb2YgdGhpcyB0YWcuCisgICAgICoKKyAgICAgKiBSZXR1cm5lZCBmcm9tIGRvU3RhcnRUYWcgd2hlbiBpdCBpbXBsZW1lbnRzIEJvZHlUYWcuCisgICAgICogVGhpcyBpcyBhbiBpbGxlZ2FsIHJldHVybiB2YWx1ZSBmb3IgZG9TdGFydFRhZyB3aGVuIHRoZSBjbGFzcworICAgICAqIGRvZXMgbm90IGltcGxlbWVudCBCb2R5VGFnLgorICAgICAqLworCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgRVZBTF9CT0RZX0JVRkZFUkVEID0gMjsKKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBib2R5Q29udGVudCBwcm9wZXJ0eS4KKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBpbnZva2VkIGJ5IHRoZSBKU1AgcGFnZSBpbXBsZW1lbnRhdGlvbiBvYmplY3QgYXQKKyAgICAgKiBtb3N0IG9uY2UgcGVyIGFjdGlvbiBpbnZvY2F0aW9uLgorICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgaW52b2tlZCBiZWZvcmUgZG9Jbml0Qm9keS4KKyAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIG5vdCBiZSBpbnZva2VkIGZvciBlbXB0eSB0YWdzIG9yIGZvciBub24tZW1wdHkKKyAgICAgKiB0YWdzIHdob3NlIGRvU3RhcnRUYWcoKSBtZXRob2QgcmV0dXJucyBTS0lQX0JPRFkgb3IgRVZBTF9CT0RZX0lOQ0xVREUuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBXaGVuIHNldEJvZHlDb250ZW50IGlzIGludm9rZWQsIHRoZSB2YWx1ZSBvZiB0aGUgaW1wbGljaXQgb2JqZWN0IG91dAorICAgICAqIGhhcyBhbHJlYWR5IGJlZW4gY2hhbmdlZCBpbiB0aGUgcGFnZUNvbnRleHQgb2JqZWN0LiAgVGhlIEJvZHlDb250ZW50CisgICAgICogb2JqZWN0IHBhc3NlZCB3aWxsIGhhdmUgbm90IGRhdGEgb24gaXQgYnV0IG1heSBoYXZlIGJlZW4gcmV1c2VkCisgICAgICogKGFuZCBjbGVhcmVkKSBmcm9tIHNvbWUgcHJldmlvdXMgaW52b2NhdGlvbi4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoZSBCb2R5Q29udGVudCBvYmplY3QgaXMgYXZhaWxhYmxlIGFuZCB3aXRoIHRoZSBhcHByb3ByaWF0ZSBjb250ZW50CisgICAgICogdW50aWwgYWZ0ZXIgdGhlIGludm9jYXRpb24gb2YgdGhlIGRvRW5kVGFnIG1ldGhvZCwgYXQgd2hpY2ggY2FzZSBpdAorICAgICAqIG1heSBiZSByZXVzZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYiB0aGUgQm9keUNvbnRlbnQKKyAgICAgKiBAc2VlICNkb0luaXRCb2R5CisgICAgICogQHNlZSAjZG9BZnRlckJvZHkKKyAgICAgKi8KKworICAgIHZvaWQgc2V0Qm9keUNvbnRlbnQoQm9keUNvbnRlbnQgYik7CisKKworICAgIC8qKgorICAgICAqIFByZXBhcmUgZm9yIGV2YWx1YXRpb24gb2YgdGhlIGJvZHkuCisgICAgICogVGhpcyBtZXRob2QgaXMgaW52b2tlZCBieSB0aGUgSlNQIHBhZ2UgaW1wbGVtZW50YXRpb24gb2JqZWN0CisgICAgICogYWZ0ZXIgc2V0Qm9keUNvbnRlbnQgYW5kIGJlZm9yZSB0aGUgZmlyc3QgdGltZQorICAgICAqIHRoZSBib2R5IGlzIHRvIGJlIGV2YWx1YXRlZC4KKyAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIG5vdCBiZSBpbnZva2VkIGZvciBlbXB0eSB0YWdzIG9yIGZvciBub24tZW1wdHkKKyAgICAgKiB0YWdzIHdob3NlIGRvU3RhcnRUYWcoKSBtZXRob2QgcmV0dXJucyBTS0lQX0JPRFkgb3IgRVZBTF9CT0RZX0lOQ0xVREUuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgSlNQIGNvbnRhaW5lciB3aWxsIHJlc3luY2hyb25pemUgdGhlIHZhbHVlcyBvZiBhbnkgQVRfQkVHSU4gYW5kCisgICAgICogTkVTVEVEIHZhcmlhYmxlcyAoZGVmaW5lZCBieSB0aGUgYXNzb2NpYXRlZCBUYWdFeHRyYUluZm8gb3IgVExEKSBhZnRlcgorICAgICAqIHRoZSBpbnZvY2F0aW9uIG9mIGRvSW5pdEJvZHkoKS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSnNwRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHByb2Nlc3NpbmcgdGhpcyB0YWcKKyAgICAgKiBAc2VlICNkb0FmdGVyQm9keQorICAgICAqLworCisgICAgdm9pZCBkb0luaXRCb2R5KCkgdGhyb3dzIEpzcEV4Y2VwdGlvbjsKKworfQpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL3RhZ2V4dC9Cb2R5VGFnU3VwcG9ydC5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL3RhZ2V4dC9Cb2R5VGFnU3VwcG9ydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2YmRjNmIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvdGFnZXh0L0JvZHlUYWdTdXBwb3J0LmphdmEKQEAgLTAsMCArMSwxNTkgQEAKKy8qCisqIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KK3BhY2thZ2UgamF2YXguc2VydmxldC5qc3AudGFnZXh0OworCitpbXBvcnQgamF2YXguc2VydmxldC5qc3AuSnNwRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLkpzcFdyaXRlcjsKKworLyoqCisgKiBBIGJhc2UgY2xhc3MgZm9yIGRlZmluaW5nIHRhZyBoYW5kbGVycyBpbXBsZW1lbnRpbmcgQm9keVRhZy4KKyAqCisgKiA8cD4KKyAqIFRoZSBCb2R5VGFnU3VwcG9ydCBjbGFzcyBpbXBsZW1lbnRzIHRoZSBCb2R5VGFnIGludGVyZmFjZSBhbmQgYWRkcworICogYWRkaXRpb25hbCBjb252ZW5pZW5jZSBtZXRob2RzIGluY2x1ZGluZyBnZXR0ZXIgbWV0aG9kcyBmb3IgdGhlCisgKiBib2R5Q29udGVudCBwcm9wZXJ0eSBhbmQgbWV0aG9kcyB0byBnZXQgYXQgdGhlIHByZXZpb3VzIG91dCBKc3BXcml0ZXIuCisgKgorICogPHA+CisgKiBNYW55IHRhZyBoYW5kbGVycyB3aWxsIGV4dGVuZCBCb2R5VGFnU3VwcG9ydCBhbmQgb25seSByZWRlZmluZSBhCisgKiBmZXcgbWV0aG9kcy4KKyAqLworCitwdWJsaWMgY2xhc3MgQm9keVRhZ1N1cHBvcnQgZXh0ZW5kcyBUYWdTdXBwb3J0IGltcGxlbWVudHMgQm9keVRhZyB7CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLCBhbGwgc3ViY2xhc3NlcyBhcmUgcmVxdWlyZWQgdG8gb25seSBkZWZpbmUKKyAgICAgKiBhIHB1YmxpYyBjb25zdHJ1Y3RvciB3aXRoIHRoZSBzYW1lIHNpZ25hdHVyZSwgYW5kIHRvIGNhbGwgdGhlCisgICAgICogc3VwZXJjbGFzcyBjb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIFRoaXMgY29uc3RydWN0b3IgaXMgY2FsbGVkIGJ5IHRoZSBjb2RlIGdlbmVyYXRlZCBieSB0aGUgSlNQCisgICAgICogdHJhbnNsYXRvci4KKyAgICAgKi8KKworICAgIHB1YmxpYyBCb2R5VGFnU3VwcG9ydCgpIHsKKwlzdXBlcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlZmF1bHQgcHJvY2Vzc2luZyBvZiB0aGUgc3RhcnQgdGFnIHJldHVybmluZyBFVkFMX0JPRFlfQlVGRkVSRUQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEVWQUxfQk9EWV9CVUZGRVJFRAorICAgICAqIEB0aHJvd3MgSnNwRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHByb2Nlc3NpbmcgdGhpcyB0YWcKKyAgICAgKiBAc2VlIEJvZHlUYWcjZG9TdGFydFRhZworICAgICAqLworIAorICAgIHB1YmxpYyBpbnQgZG9TdGFydFRhZygpIHRocm93cyBKc3BFeGNlcHRpb24geworICAgICAgICByZXR1cm4gRVZBTF9CT0RZX0JVRkZFUkVEOworICAgIH0KKworCisgICAgLyoqCisgICAgICogRGVmYXVsdCBwcm9jZXNzaW5nIG9mIHRoZSBlbmQgdGFnIHJldHVybmluZyBFVkFMX1BBR0UuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEVWQUxfUEFHRQorICAgICAqIEB0aHJvd3MgSnNwRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHByb2Nlc3NpbmcgdGhpcyB0YWcKKyAgICAgKiBAc2VlIFRhZyNkb0VuZFRhZworICAgICAqLworCisgICAgcHVibGljIGludCBkb0VuZFRhZygpIHRocm93cyBKc3BFeGNlcHRpb24geworCXJldHVybiBzdXBlci5kb0VuZFRhZygpOworICAgIH0KKworCisgICAgLy8gQWN0aW9ucyByZWxhdGVkIHRvIGJvZHkgZXZhbHVhdGlvbgorCisgICAgLyoqCisgICAgICogUHJlcGFyZSBmb3IgZXZhbHVhdGlvbiBvZiB0aGUgYm9keTogc3Rhc2ggdGhlIGJvZHlDb250ZW50IGF3YXkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYiB0aGUgQm9keUNvbnRlbnQKKyAgICAgKiBAc2VlICNkb0FmdGVyQm9keQorICAgICAqIEBzZWUgI2RvSW5pdEJvZHkoKQorICAgICAqIEBzZWUgQm9keVRhZyNzZXRCb2R5Q29udGVudAorICAgICAqLworCisgICAgcHVibGljIHZvaWQgc2V0Qm9keUNvbnRlbnQoQm9keUNvbnRlbnQgYikgeworCXRoaXMuYm9keUNvbnRlbnQgPSBiOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUHJlcGFyZSBmb3IgZXZhbHVhdGlvbiBvZiB0aGUgYm9keSBqdXN0IGJlZm9yZSB0aGUgZmlyc3QgYm9keSBldmFsdWF0aW9uOgorICAgICAqIG5vIGFjdGlvbi4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSnNwRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHByb2Nlc3NpbmcgdGhpcyB0YWcKKyAgICAgKiBAc2VlICNzZXRCb2R5Q29udGVudAorICAgICAqIEBzZWUgI2RvQWZ0ZXJCb2R5CisgICAgICogQHNlZSBCb2R5VGFnI2RvSW5pdEJvZHkKKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIGRvSW5pdEJvZHkoKSB0aHJvd3MgSnNwRXhjZXB0aW9uIHsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEFmdGVyIHRoZSBib2R5IGV2YWx1YXRpb246IGRvIG5vdCByZWV2YWx1YXRlIGFuZCBjb250aW51ZSB3aXRoIHRoZSBwYWdlLgorICAgICAqIEJ5IGRlZmF1bHQgbm90aGluZyBpcyBkb25lIHdpdGggdGhlIGJvZHlDb250ZW50IGRhdGEgKGlmIGFueSkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFNLSVBfQk9EWQorICAgICAqIEB0aHJvd3MgSnNwRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHByb2Nlc3NpbmcgdGhpcyB0YWcKKyAgICAgKiBAc2VlICNkb0luaXRCb2R5CisgICAgICogQHNlZSBCb2R5VGFnI2RvQWZ0ZXJCb2R5CisgICAgICovCisKKyAgICBwdWJsaWMgaW50IGRvQWZ0ZXJCb2R5KCkgdGhyb3dzIEpzcEV4Y2VwdGlvbiB7CisgCXJldHVybiBTS0lQX0JPRFk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZWxlYXNlIHN0YXRlLgorICAgICAqCisgICAgICogQHNlZSBUYWcjcmVsZWFzZQorICAgICAqLworCisgICAgcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKKwlib2R5Q29udGVudCA9IG51bGw7CisKKwlzdXBlci5yZWxlYXNlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGN1cnJlbnQgYm9keUNvbnRlbnQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBib2R5IGNvbnRlbnQuCisgICAgICovCisgICAgCisgICAgcHVibGljIEJvZHlDb250ZW50IGdldEJvZHlDb250ZW50KCkgeworCXJldHVybiBib2R5Q29udGVudDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdldCBzdXJyb3VuZGluZyBvdXQgSnNwV3JpdGVyLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgZW5jbG9zaW5nIEpzcFdyaXRlciwgZnJvbSB0aGUgYm9keUNvbnRlbnQuCisgICAgICovCisKKyAgICBwdWJsaWMgSnNwV3JpdGVyIGdldFByZXZpb3VzT3V0KCkgeworCXJldHVybiBib2R5Q29udGVudC5nZXRFbmNsb3NpbmdXcml0ZXIoKTsKKyAgICB9CisKKyAgICAvLyBwcm90ZWN0ZWQgZmllbGRzCisKKyAgICAvKioKKyAgICAgKiBUaGUgY3VycmVudCBCb2R5Q29udGVudCBmb3IgdGhpcyBCb2R5VGFnLgorICAgICAqLworICAgIHByb3RlY3RlZCBCb2R5Q29udGVudCAgIGJvZHlDb250ZW50OworfQpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL3RhZ2V4dC9EeW5hbWljQXR0cmlidXRlcy5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL3RhZ2V4dC9EeW5hbWljQXR0cmlidXRlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmYmJjMTEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvdGFnZXh0L0R5bmFtaWNBdHRyaWJ1dGVzLmphdmEKQEAgLTAsMCArMSw1MSBAQAorLyoKKyogQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworcGFja2FnZSBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQ7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC5Kc3BFeGNlcHRpb247CisKKy8qKgorICogRm9yIGEgdGFnIHRvIGRlY2xhcmUgdGhhdCBpdCBhY2NlcHRzIGR5bmFtaWMgYXR0cmlidXRlcywgaXQgbXVzdCBpbXBsZW1lbnQKKyAqIHRoaXMgaW50ZXJmYWNlLiAgVGhlIGVudHJ5IGZvciB0aGUgdGFnIGluIHRoZSBUYWcgTGlicmFyeSBEZXNjcmlwdG9yIG11c3QgCisgKiBhbHNvIGJlIGNvbmZpZ3VyZWQgdG8gaW5kaWNhdGUgZHluYW1pYyBhdHRyaWJ1dGVzIGFyZSBhY2NlcHRlZC4KKyAqIDxicj4KKyAqIEZvciBhbnkgYXR0cmlidXRlIHRoYXQgaXMgbm90IGRlY2xhcmVkIGluIHRoZSBUYWcgTGlicmFyeSBEZXNjcmlwdG9yIGZvcgorICogdGhpcyB0YWcsIGluc3RlYWQgb2YgZ2V0dGluZyBhbiBlcnJvciBhdCB0cmFuc2xhdGlvbiB0aW1lLCB0aGUgCisgKiA8Y29kZT5zZXREeW5hbWljQXR0cmlidXRlKCk8L2NvZGU+IG1ldGhvZCBpcyBjYWxsZWQsIHdpdGggdGhlIG5hbWUgYW5kCisgKiB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlLiAgSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSB0YWcgdG8gCisgKiByZW1lbWJlciB0aGUgbmFtZXMgYW5kIHZhbHVlcyBvZiB0aGUgZHluYW1pYyBhdHRyaWJ1dGVzLgorICoKKyAqIEBzaW5jZSAyLjAKKyAqLworcHVibGljIGludGVyZmFjZSBEeW5hbWljQXR0cmlidXRlcyB7CisgICAgCisgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW4gYSB0YWcgZGVjbGFyZWQgdG8gYWNjZXB0IGR5bmFtaWMgYXR0cmlidXRlcyBpcyBwYXNzZWQKKyAgICAgKiBhbiBhdHRyaWJ1dGUgdGhhdCBpcyBub3QgZGVjbGFyZWQgaW4gdGhlIFRhZyBMaWJyYXJ5IERlc2NyaXB0b3IuCisgICAgICogCisgICAgICogQHBhcmFtIHVyaSB0aGUgbmFtZXNwYWNlIG9mIHRoZSBhdHRyaWJ1dGUsIG9yIG51bGwgaWYgaW4gdGhlIGRlZmF1bHQKKyAgICAgKiAgICAgbmFtZXNwYWNlLgorICAgICAqIEBwYXJhbSBsb2NhbE5hbWUgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSBiZWluZyBzZXQuCisgICAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlCisgICAgICogQHRocm93cyBKc3BFeGNlcHRpb24gaWYgdGhlIHRhZyBoYW5kbGVyIHdpc2hlcyB0bworICAgICAqICAgICBzaWduYWwgdGhhdCBpdCBkb2VzIG5vdCBhY2NlcHQgdGhlIGdpdmVuIGF0dHJpYnV0ZS4gIFRoZSAKKyAgICAgKiAgICAgY29udGFpbmVyIG11c3Qgbm90IGNhbGwgZG9TdGFydFRhZygpIG9yIGRvVGFnKCkgZm9yIHRoaXMgdGFnLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldER5bmFtaWNBdHRyaWJ1dGUoCisgICAgICAgIFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIE9iamVjdCB2YWx1ZSApIAorICAgICAgICB0aHJvd3MgSnNwRXhjZXB0aW9uOworICAgIAorfQpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL3RhZ2V4dC9GdW5jdGlvbkluZm8uamF2YSBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC90YWdleHQvRnVuY3Rpb25JbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM5ODRhMwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC90YWdleHQvRnVuY3Rpb25JbmZvLmphdmEKQEAgLTAsMCArMSw4MCBAQAorLyoKKyogQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworIAorcGFja2FnZSBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQ7CisKKy8qKgorICogSW5mb3JtYXRpb24gZm9yIGEgZnVuY3Rpb24gaW4gYSBUYWcgTGlicmFyeS4KKyAqIFRoaXMgY2xhc3MgaXMgaW5zdGFudGlhdGVkIGZyb20gdGhlIFRhZyBMaWJyYXJ5IERlc2NyaXB0b3IgZmlsZSAoVExEKQorICogYW5kIGlzIGF2YWlsYWJsZSBvbmx5IGF0IHRyYW5zbGF0aW9uIHRpbWUuCisgKiAKKyAqIEBzaW5jZSAyLjAKKyAqLworcHVibGljIGNsYXNzIEZ1bmN0aW9uSW5mbyB7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgRnVuY3Rpb25JbmZvLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uCisgICAgICogQHBhcmFtIGtsYXNzIFRoZSBjbGFzcyBvZiB0aGUgZnVuY3Rpb24KKyAgICAgKiBAcGFyYW0gc2lnbmF0dXJlIFRoZSBzaWduYXR1cmUgb2YgdGhlIGZ1bmN0aW9uCisgICAgICovCisKKyAgICBwdWJsaWMgRnVuY3Rpb25JbmZvKFN0cmluZyBuYW1lLCBTdHJpbmcga2xhc3MsIFN0cmluZyBzaWduYXR1cmUpIHsKKworCXRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMuZnVuY3Rpb25DbGFzcyA9IGtsYXNzOworICAgICAgICB0aGlzLmZ1bmN0aW9uU2lnbmF0dXJlID0gc2lnbmF0dXJlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uCisgICAgICovCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGNsYXNzIG9mIHRoZSBmdW5jdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGNsYXNzIG9mIHRoZSBmdW5jdGlvbgorICAgICAqLworCisgICAgcHVibGljIFN0cmluZyBnZXRGdW5jdGlvbkNsYXNzKCkgeworICAgICAgICByZXR1cm4gZnVuY3Rpb25DbGFzczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgc2lnbmF0dXJlIG9mIHRoZSBmdW5jdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIHNpZ25hdHVyZSBvZiB0aGUgZnVuY3Rpb24KKyAgICAgKi8KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RnVuY3Rpb25TaWduYXR1cmUoKSB7CisgICAgICAgIHJldHVybiBmdW5jdGlvblNpZ25hdHVyZTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIGZpZWxkcworICAgICAqLworCisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKyAgICBwcml2YXRlIFN0cmluZyBmdW5jdGlvbkNsYXNzOworICAgIHByaXZhdGUgU3RyaW5nIGZ1bmN0aW9uU2lnbmF0dXJlOworfQpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL3RhZ2V4dC9JdGVyYXRpb25UYWcuamF2YSBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC90YWdleHQvSXRlcmF0aW9uVGFnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE2NDNiYwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC90YWdleHQvSXRlcmF0aW9uVGFnLmphdmEKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisqIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworcGFja2FnZSBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQ7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC4qOworCisvKioKKyAqIFRoZSBJdGVyYXRpb25UYWcgaW50ZXJmYWNlIGV4dGVuZHMgVGFnIGJ5IGRlZmluaW5nIG9uZSBhZGRpdGlvbmFsCisgKiBtZXRob2QgdGhhdCBjb250cm9scyB0aGUgcmVldmFsdWF0aW9uIG9mIGl0cyBib2R5LgorICoKKyAqIDxwPiBBIHRhZyBoYW5kbGVyIHRoYXQgaW1wbGVtZW50cyBJdGVyYXRpb25UYWcgaXMgdHJlYXRlZCBhcyBvbmUgdGhhdAorICogaW1wbGVtZW50cyBUYWcgcmVnYXJkaW5nICB0aGUgZG9TdGFydFRhZygpIGFuZCBkb0VuZFRhZygpIG1ldGhvZHMuCisgKiBJdGVyYXRpb25UYWcgcHJvdmlkZXMgYSBuZXcgbWV0aG9kOiA8Y29kZT5kb0FmdGVyQm9keSgpPC9jb2RlPi4KKyAqCisgKiA8cD4gVGhlIGRvQWZ0ZXJCb2R5KCkgbWV0aG9kIGlzIGludm9rZWQgYWZ0ZXIgZXZlcnkgYm9keSBldmFsdWF0aW9uCisgKiB0byBjb250cm9sIHdoZXRoZXIgdGhlIGJvZHkgd2lsbCBiZSByZWV2YWx1YXRlZCBvciBub3QuICBJZiBkb0FmdGVyQm9keSgpCisgKiByZXR1cm5zIEl0ZXJhdGlvblRhZy5FVkFMX0JPRFlfQUdBSU4sIHRoZW4gdGhlIGJvZHkgd2lsbCBiZSByZWV2YWx1YXRlZC4KKyAqIElmIGRvQWZ0ZXJCb2R5KCkgcmV0dXJucyBUYWcuU0tJUF9CT0RZLCB0aGVuIHRoZSBib2R5IHdpbGwgYmUgc2tpcHBlZAorICogYW5kIGRvRW5kVGFnKCkgd2lsbCBiZSBldmFsdWF0ZWQgaW5zdGVhZC4KKyAqCisgKiA8cD48Qj5Qcm9wZXJ0aWVzPC9CPgorICogVGhlcmUgYXJlIG5vIG5ldyBwcm9wZXJ0aWVzIGluIGFkZGl0aW9uIHRvIHRob3NlIGluIFRhZy4KKyAqCisgKiA8cD48Qj5NZXRob2RzPC9CPgorICogVGhlcmUgaXMgb25lIG5ldyBtZXRob2RzOiBkb0FmdGVyQm9keSgpLgorICoKKyAqIDxwPjxCPkxpZmVjeWNsZTwvQj4KKyAqCisgKiA8cD4gTGlmZWN5Y2xlIGRldGFpbHMgYXJlIGRlc2NyaWJlZCBieSB0aGUgdHJhbnNpdGlvbiBkaWFncmFtCisgKiBiZWxvdy4gIEV4Y2VwdGlvbnMgdGhhdCBhcmUgdGhyb3duIGR1cmluZyB0aGUgY29tcHV0YXRpb24gb2YKKyAqIGRvU3RhcnRUYWcoKSwgQk9EWSBhbmQgZG9BZnRlckJvZHkoKSBpbnRlcnJ1cHQgdGhlIGV4ZWN1dGlvbgorICogc2VxdWVuY2UgYW5kIGFyZSBwcm9wYWdhdGVkIHVwIHRoZSBzdGFjaywgdW5sZXNzIHRoZSB0YWcgaGFuZGxlcgorICogaW1wbGVtZW50cyB0aGUgVHJ5Q2F0Y2hGaW5hbGx5IGludGVyZmFjZTsgc2VlIHRoYXQgaW50ZXJmYWNlIGZvcgorICogZGV0YWlscy4KKyAqCisgKiA8cD4KKyAqIDxJTUcgc3JjPSJkb2MtZmlsZXMvSXRlcmF0aW9uVGFnUHJvdG9jb2wuZ2lmIgorICogICAgICBhbHQ9IkxpZmVjeWNsZSBEZXRhaWxzIFRyYW5zaXRpb24gRGlhZ3JhbSBmb3IgSXRlcmF0aW9uVGFnIi8+CisgKgorICogPHA+PEI+RW1wdHkgYW5kIE5vbi1FbXB0eSBBY3Rpb248L0I+CisgKiA8cD4gSWYgdGhlIFRhZ0xpYnJhcnlEZXNjcmlwdG9yIGZpbGUgaW5kaWNhdGVzIHRoYXQgdGhlIGFjdGlvbiBtdXN0CisgKiBhbHdheXMgaGF2ZSBhbiBlbXB0eSBlbGVtZW50IGJvZHksIGJ5IGEgJmx0O2JvZHktY29udGVudCZndDsgZW50cnkgb2YgCisgKiAiZW1wdHkiLCB0aGVuIHRoZSBkb1N0YXJ0VGFnKCkgbWV0aG9kIG11c3QgcmV0dXJuIFNLSVBfQk9EWS4KKyAqCisgKiA8cD5Ob3RlIHRoYXQgd2hpY2ggbWV0aG9kcyBhcmUgaW52b2tlZCBhZnRlciB0aGUgZG9TdGFydFRhZygpIGRlcGVuZHMgb24KKyAqIGJvdGggdGhlIHJldHVybiB2YWx1ZSBhbmQgb24gaWYgdGhlIGN1c3RvbSBhY3Rpb24gZWxlbWVudCBpcyBlbXB0eQorICogb3Igbm90IGluIHRoZSBKU1AgcGFnZSwgbm90IG9uIGhvdyBpdCdzIGRlY2xhcmVkIGluIHRoZSBUTEQuCisgKgorICogPHA+CisgKiBJZiBTS0lQX0JPRFkgaXMgcmV0dXJuZWQgdGhlIGJvZHkgaXMgbm90IGV2YWx1YXRlZCwgYW5kIHRoZW4gZG9FbmRUYWcoKQorICogaXMgaW52b2tlZC4KKyAqCisgKiA8cD4KKyAqIElmIEVWQUxfQk9EWV9JTkNMVURFIGlzIHJldHVybmVkLCBhbmQgdGhlIGN1c3RvbSBhY3Rpb24gZWxlbWVudCBpcyBub3QKKyAqIGVtcHR5LCB0aGUgYm9keSBpcyBldmFsdWF0ZWQgYW5kICJwYXNzZWQgdGhyb3VnaCIgdG8gdGhlIGN1cnJlbnQgb3V0LCAKKyAqIHRoZW4gZG9BZnRlckJvZHkoKSBpcyBpbnZva2VkIGFuZCwgYWZ0ZXIgemVybyBvciBtb3JlIGl0ZXJhdGlvbnMsIAorICogZG9FbmRUYWcoKSBpcyBpbnZva2VkLgorICovCisKK3B1YmxpYyBpbnRlcmZhY2UgSXRlcmF0aW9uVGFnIGV4dGVuZHMgVGFnIHsKKworICAgIC8qKgorICAgICAqIFJlcXVlc3QgdGhlIHJlZXZhbHVhdGlvbiBvZiBzb21lIGJvZHkuCisgICAgICogUmV0dXJuZWQgZnJvbSBkb0FmdGVyQm9keS4KKyAgICAgKgorICAgICAqIEZvciBjb21wYXRpYmlsaXR5IHdpdGggSlNQIDEuMSwgdGhlIHZhbHVlIGlzIGNhcmVmdWxseSBzZWxlY3RlZAorICAgICAqIHRvIGJlIHRoZSBzYW1lIGFzIHRoZSwgbm93IGRlcHJlY2F0ZWQsIEJvZHlUYWcuRVZBTF9CT0RZX1RBRywKKyAgICAgKiAKKyAgICAgKi8KKyAKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBFVkFMX0JPRFlfQUdBSU4gPSAyOworCisgICAgLyoqCisgICAgICogUHJvY2VzcyBib2R5IChyZSlldmFsdWF0aW9uLiAgVGhpcyBtZXRob2QgaXMgaW52b2tlZCBieSB0aGUKKyAgICAgKiBKU1AgUGFnZSBpbXBsZW1lbnRhdGlvbiBvYmplY3QgYWZ0ZXIgZXZlcnkgZXZhbHVhdGlvbiBvZgorICAgICAqIHRoZSBib2R5IGludG8gdGhlIEJvZHlFdmFsdWF0aW9uIG9iamVjdC4gVGhlIG1ldGhvZCBpcworICAgICAqIG5vdCBpbnZva2VkIGlmIHRoZXJlIGlzIG5vIGJvZHkgZXZhbHVhdGlvbi4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIElmIGRvQWZ0ZXJCb2R5IHJldHVybnMgRVZBTF9CT0RZX0FHQUlOLCBhIG5ldyBldmFsdWF0aW9uIG9mIHRoZQorICAgICAqIGJvZHkgd2lsbCBoYXBwZW4gKGZvbGxvd2VkIGJ5IGFub3RoZXIgaW52b2NhdGlvbiBvZiBkb0FmdGVyQm9keSkuCisgICAgICogSWYgZG9BZnRlckJvZHkgcmV0dXJucyBTS0lQX0JPRFksIG5vIG1vcmUgYm9keSBldmFsdWF0aW9ucyB3aWxsIG9jY3VyLAorICAgICAqIGFuZCB0aGUgZG9FbmRUYWcgbWV0aG9kIHdpbGwgYmUgaW52b2tlZC4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIElmIHRoaXMgdGFnIGhhbmRsZXIgaW1wbGVtZW50cyBCb2R5VGFnIGFuZCBkb0FmdGVyQm9keSByZXR1cm5zCisgICAgICogU0tJUF9CT0RZLCB0aGUgdmFsdWUgb2Ygb3V0IHdpbGwgYmUgcmVzdG9yZWQgdXNpbmcgdGhlIHBvcEJvZHkgCisgICAgICogbWV0aG9kIGluIHBhZ2VDb250ZXh0IHByaW9yIHRvIGludm9raW5nIGRvRW5kVGFnLgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhlIG1ldGhvZCByZS1pbnZvY2F0aW9ucyBtYXkgYmUgbGVhZCB0byBkaWZmZXJlbnQgYWN0aW9ucyBiZWNhdXNlCisgICAgICogdGhlcmUgbWlnaHQgaGF2ZSBiZWVuIHNvbWUgY2hhbmdlcyB0byBzaGFyZWQgc3RhdGUsIG9yIGJlY2F1c2UKKyAgICAgKiBvZiBleHRlcm5hbCBjb21wdXRhdGlvbi4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoZSBKU1AgY29udGFpbmVyIHdpbGwgcmVzeW5jaHJvbml6ZSB0aGUgdmFsdWVzIG9mIGFueSBBVF9CRUdJTiBhbmQKKyAgICAgKiBORVNURUQgdmFyaWFibGVzIChkZWZpbmVkIGJ5IHRoZSBhc3NvY2lhdGVkIFRhZ0V4dHJhSW5mbyBvciBUTEQpIGFmdGVyCisgICAgICogdGhlIGludm9jYXRpb24gb2YgZG9BZnRlckJvZHkoKS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gd2hldGhlciBhZGRpdGlvbmFsIGV2YWx1YXRpb25zIG9mIHRoZSBib2R5IGFyZSBkZXNpcmVkCisgICAgICogQHRocm93cyBKc3BFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgcHJvY2Vzc2luZyB0aGlzIHRhZworICAgICAqLworCisgICAgaW50IGRvQWZ0ZXJCb2R5KCkgdGhyb3dzIEpzcEV4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC90YWdleHQvSnNwRnJhZ21lbnQuamF2YSBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC90YWdleHQvSnNwRnJhZ21lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGY1MmJjCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL3RhZ2V4dC9Kc3BGcmFnbWVudC5qYXZhCkBAIC0wLDAgKzEsODIgQEAKKy8qCisqIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyAKK3BhY2thZ2UgamF2YXguc2VydmxldC5qc3AudGFnZXh0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLldyaXRlcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC4qOworCisvKioKKyAqIEVuY2Fwc3VsYXRlcyBhIHBvcnRpb24gb2YgSlNQIGNvZGUgaW4gYW4gb2JqZWN0IHRoYXQgCisgKiBjYW4gYmUgaW52b2tlZCBhcyBtYW55IHRpbWVzIGFzIG5lZWRlZC4gIEpTUCBGcmFnbWVudHMgYXJlIGRlZmluZWQgCisgKiB1c2luZyBKU1Agc3ludGF4IGFzIHRoZSBib2R5IG9mIGEgdGFnIGZvciBhbiBpbnZvY2F0aW9uIHRvIGEgU2ltcGxlVGFnIAorICogaGFuZGxlciwgb3IgYXMgdGhlIGJvZHkgb2YgYSAmbHQ7anNwOmF0dHJpYnV0ZSZndDsgc3RhbmRhcmQgYWN0aW9uCisgKiBzcGVjaWZ5aW5nIHRoZSB2YWx1ZSBvZiBhbiBhdHRyaWJ1dGUgdGhhdCBpcyBkZWNsYXJlZCBhcyBhIGZyYWdtZW50LAorICogb3IgdG8gYmUgb2YgdHlwZSBKc3BGcmFnbWVudCBpbiB0aGUgVExELgorICogPHA+CisgKiBUaGUgZGVmaW5pdGlvbiBvZiB0aGUgSlNQIGZyYWdtZW50IG11c3Qgb25seSBjb250YWluIHRlbXBsYXRlIAorICogdGV4dCBhbmQgSlNQIGFjdGlvbiBlbGVtZW50cy4gIEluIG90aGVyIHdvcmRzLCBpdCBtdXN0IG5vdCBjb250YWluCisgKiBzY3JpcHRsZXRzIG9yIHNjcmlwdGxldCBleHByZXNzaW9ucy4gIEF0IHRyYW5zbGF0aW9uIHRpbWUsIHRoZSAKKyAqIGNvbnRhaW5lciBnZW5lcmF0ZXMgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIEpzcEZyYWdtZW50IGFic3RyYWN0IGNsYXNzCisgKiBjYXBhYmxlIG9mIGV4ZWN1dGluZyB0aGUgZGVmaW5lZCBmcmFnbWVudC4KKyAqIDxwPgorICogQSB0YWcgaGFuZGxlciBjYW4gaW52b2tlIHRoZSBmcmFnbWVudCB6ZXJvIG9yIG1vcmUgdGltZXMsIG9yIAorICogcGFzcyBpdCBhbG9uZyB0byBvdGhlciB0YWdzLCBiZWZvcmUgcmV0dXJuaW5nLiAgVG8gY29tbXVuaWNhdGUgdmFsdWVzCisgKiB0by9mcm9tIGEgSlNQIGZyYWdtZW50LCB0YWcgaGFuZGxlcnMgc3RvcmUvcmV0cmlldmUgdmFsdWVzIGluIAorICogdGhlIEpzcENvbnRleHQgYXNzb2NpYXRlZCB3aXRoIHRoZSBmcmFnbWVudC4KKyAqIDxwPgorICogTm90ZSB0aGF0IHRhZyBsaWJyYXJ5IGRldmVsb3BlcnMgYW5kIHBhZ2UgYXV0aG9ycyBzaG91bGQgbm90IGdlbmVyYXRlCisgKiBKc3BGcmFnbWVudCBpbXBsZW1lbnRhdGlvbnMgbWFudWFsbHkuCisgKiA8cD4KKyAqIDxpPkltcGxlbWVudGF0aW9uIE5vdGU8L2k+OiBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGdlbmVyYXRlIGEgCisgKiBzZXBhcmF0ZSBjbGFzcyBmb3IgZWFjaCBmcmFnbWVudC4gIE9uZSBwb3NzaWJsZSBpbXBsZW1lbnRhdGlvbiBpcyAKKyAqIHRvIGdlbmVyYXRlIGEgc2luZ2xlIGhlbHBlciBjbGFzcyBmb3IgZWFjaCBwYWdlIHRoYXQgaW1wbGVtZW50cyAKKyAqIEpzcEZyYWdtZW50LiBVcG9uIGNvbnN0cnVjdGlvbiwgYSBkaXNjcmltaW5hdG9yIGNhbiBiZSBwYXNzZWQgdG8gCisgKiBzZWxlY3Qgd2hpY2ggZnJhZ21lbnQgdGhhdCBpbnN0YW5jZSB3aWxsIGV4ZWN1dGUuCisgKgorICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgSnNwRnJhZ21lbnQgeworCisgICAgLyoqCisgICAgICogRXhlY3V0ZXMgdGhlIGZyYWdtZW50IGFuZCBkaXJlY3RzIGFsbCBvdXRwdXQgdG8gdGhlIGdpdmVuIFdyaXRlciwKKyAgICAgKiBvciB0aGUgSnNwV3JpdGVyIHJldHVybmVkIGJ5IHRoZSBnZXRPdXQoKSBtZXRob2Qgb2YgdGhlIEpzcENvbnRleHQKKyAgICAgKiBhc3NvY2lhdGVkIHdpdGggdGhlIGZyYWdtZW50IGlmIG91dCBpcyBudWxsLgorICAgICAqCisgICAgICogQHBhcmFtIG91dCBUaGUgV3JpdGVyIHRvIG91dHB1dCB0aGUgZnJhZ21lbnQgdG8sIG9yIG51bGwgaWYgCisgICAgICogICAgIG91dHB1dCBzaG91bGQgYmUgc2VudCB0byBKc3BDb250ZXh0LmdldE91dCgpLgorICAgICAqIEB0aHJvd3MgamF2YXguc2VydmxldC5qc3AuSnNwRXhjZXB0aW9uIFRocm93biBpZiBhbiBlcnJvciBvY2N1cmVkCisgICAgICogICAgIHdoaWxlIGludm9raW5nIHRoaXMgZnJhZ21lbnQuCisgICAgICogQHRocm93cyBqYXZheC5zZXJ2bGV0LmpzcC5Ta2lwUGFnZUV4Y2VwdGlvbiBUaHJvd24gaWYgdGhlIHBhZ2UKKyAgICAgKiAgICAgdGhhdCAoZWl0aGVyIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkpIGludm9rZWQgdGhlIHRhZyBoYW5kbGVyIHRoYXQKKyAgICAgKiAgICAgaW52b2tlZCB0aGlzIGZyYWdtZW50IGlzIHRvIGNlYXNlIGV2YWx1YXRpb24uICBUaGUgY29udGFpbmVyCisgICAgICogICAgIG11c3QgdGhyb3cgdGhpcyBleGNlcHRpb24gaWYgYSBDbGFzc2ljIFRhZyBIYW5kbGVyIHJldHVybmVkCisgICAgICogICAgIFRhZy5TS0lQX1BBR0Ugb3IgaWYgYSBTaW1wbGUgVGFnIEhhbmRsZXIgdGhyZXcgU2tpcFBhZ2VFeGNlcHRpb24uCisgICAgICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIElmIHRoZXJlIHdhcyBhbiBlcnJvciB3cml0aW5nIHRvIHRoZSAKKyAgICAgKiAgICAgc3RyZWFtLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGludm9rZSggV3JpdGVyIG91dCApCisgICAgICAgIHRocm93cyBKc3BFeGNlcHRpb24sIElPRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgSnNwQ29udGV4dCB0aGF0IGlzIGJvdW5kIHRvIHRoaXMgSnNwRnJhZ21lbnQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBKc3BDb250ZXh0IHVzZWQgYnkgdGhpcyBmcmFnbWVudCBhdCBpbnZvY2F0aW9uIHRpbWUuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IEpzcENvbnRleHQgZ2V0SnNwQ29udGV4dCgpOworCit9CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvdGFnZXh0L0pzcFRhZy5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL3RhZ2V4dC9Kc3BUYWcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTFkNDgyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL3RhZ2V4dC9Kc3BUYWcuamF2YQpAQCAtMCwwICsxLDI1IEBACisvKgorKiBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCitwYWNrYWdlIGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dDsKKworLyoqCisgKiBTZXJ2ZXMgYXMgYSBiYXNlIGNsYXNzIGZvciBUYWcgYW5kIFNpbXBsZVRhZy4gIAorICogVGhpcyBpcyBtb3N0bHkgZm9yIG9yZ2FuaXphdGlvbmFsIGFuZCB0eXBlLXNhZmV0eSBwdXJwb3Nlcy4KKyAqCisgKiBAc2luY2UgMi4wCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSnNwVGFnIHsKK30KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC90YWdleHQvUGFnZURhdGEuamF2YSBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC90YWdleHQvUGFnZURhdGEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGU2MmQ2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL3RhZ2V4dC9QYWdlRGF0YS5qYXZhCkBAIC0wLDAgKzEsNDggQEAKKy8qCisqIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworCitwYWNrYWdlIGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dDsKKworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CisKKy8qKgorICogVHJhbnNsYXRpb24tdGltZSBpbmZvcm1hdGlvbiBvbiBhIEpTUCBwYWdlLiAgVGhlIGluZm9ybWF0aW9uCisgKiBjb3JyZXNwb25kcyB0byB0aGUgWE1MIHZpZXcgb2YgdGhlIEpTUCBwYWdlLgorICoKKyAqIDxwPgorICogT2JqZWN0cyBvZiB0aGlzIHR5cGUgYXJlIGdlbmVyYXRlZCBieSB0aGUgSlNQIHRyYW5zbGF0b3IsIGUuZy4KKyAqIHdoZW4gYmVpbmcgcGFzZWQgdG8gYSBUYWdMaWJyYXJ5VmFsaWRhdG9yIGluc3RhbmNlLgorICovCisKK2Fic3RyYWN0IHB1YmxpYyBjbGFzcyBQYWdlRGF0YSB7CisKKyAgICAvKioKKyAgICAgKiBTb2xlIGNvbnN0cnVjdG9yLiAoRm9yIGludm9jYXRpb24gYnkgc3ViY2xhc3MgY29uc3RydWN0b3JzLCAKKyAgICAgKiB0eXBpY2FsbHkgaW1wbGljaXQuKQorICAgICAqLworICAgIHB1YmxpYyBQYWdlRGF0YSgpIHsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyBhbiBpbnB1dCBzdHJlYW0gb24gdGhlIFhNTCB2aWV3IG9mIGEgSlNQIHBhZ2UuCisgICAgICogVGhlIHN0cmVhbSBpcyBlbmNvZGVkIGluIFVURi04LiAgUmVjYWxsIHRodCB0aGUgWE1MIHZpZXcgb2YgYSAKKyAgICAgKiBKU1AgcGFnZSBoYXMgdGhlIGluY2x1ZGUgZGlyZWN0aXZlcyBleHBhbmRlZC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIEFuIGlucHV0IHN0cmVhbSBvbiB0aGUgZG9jdW1lbnQuCisgICAgICovCisgICBhYnN0cmFjdCBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKTsKK30KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC90YWdleHQvU2ltcGxlVGFnLmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvdGFnZXh0L1NpbXBsZVRhZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5YTQxNGYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvdGFnZXh0L1NpbXBsZVRhZy5qYXZhCkBAIC0wLDAgKzEsMTM5IEBACisvKgorKiBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCitwYWNrYWdlIGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dDsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLkpzcENvbnRleHQ7CisKKy8qKgorICogSW50ZXJmYWNlIGZvciBkZWZpbmluZyBTaW1wbGUgVGFnIEhhbmRsZXJzLgorICogCisgKiA8cD5TaW1wbGUgVGFnIEhhbmRsZXJzIGRpZmZlciBmcm9tIENsYXNzaWMgVGFnIEhhbmRsZXJzIGluIHRoYXQgaW5zdGVhZCAKKyAqIG9mIHN1cHBvcnRpbmcgPGNvZGU+ZG9TdGFydFRhZygpPC9jb2RlPiBhbmQgPGNvZGU+ZG9FbmRUYWcoKTwvY29kZT4sIAorICogdGhlIDxjb2RlPlNpbXBsZVRhZzwvY29kZT4gaW50ZXJmYWNlIHByb3ZpZGVzIGEgc2ltcGxlIAorICogPGNvZGU+ZG9UYWcoKTwvY29kZT4gbWV0aG9kLCB3aGljaCBpcyBjYWxsZWQgb25jZSBhbmQgb25seSBvbmNlIGZvciBhbnkgCisgKiBnaXZlbiB0YWcgaW52b2NhdGlvbi4gIEFsbCB0YWcgbG9naWMsIGl0ZXJhdGlvbiwgYm9keSBldmFsdWF0aW9ucywgZXRjLiAKKyAqIGFyZSB0byBiZSBwZXJmb3JtZWQgaW4gdGhpcyBzaW5nbGUgbWV0aG9kLiAgVGh1cywgc2ltcGxlIHRhZyBoYW5kbGVycyAKKyAqIGhhdmUgdGhlIGVxdWl2YWxlbnQgcG93ZXIgb2YgPGNvZGU+Qm9keVRhZzwvY29kZT4sIGJ1dCB3aXRoIGEgbXVjaCAKKyAqIHNpbXBsZXIgbGlmZWN5Y2xlIGFuZCBpbnRlcmZhY2UuPC9wPgorICoKKyAqIDxwPlRvIHN1cHBvcnQgYm9keSBjb250ZW50LCB0aGUgPGNvZGU+c2V0SnNwQm9keSgpPC9jb2RlPiAKKyAqIG1ldGhvZCBpcyBwcm92aWRlZC4gIFRoZSBjb250YWluZXIgaW52b2tlcyB0aGUgPGNvZGU+c2V0SnNwQm9keSgpPC9jb2RlPiAKKyAqIG1ldGhvZCB3aXRoIGEgPGNvZGU+SnNwRnJhZ21lbnQ8L2NvZGU+IG9iamVjdCBlbmNhcHN1bGF0aW5nIHRoZSBib2R5IG9mIAorICogdGhlIHRhZy4gIFRoZSB0YWcgaGFuZGxlciBpbXBsZW1lbnRhdGlvbiBjYW4gY2FsbCAKKyAqIDxjb2RlPmludm9rZSgpPC9jb2RlPiBvbiB0aGF0IGZyYWdtZW50IHRvIGV2YWx1YXRlIHRoZSBib2R5IGFzCisgKiBtYW55IHRpbWVzIGFzIGl0IG5lZWRzLjwvcD4KKyAqCisgKiA8cD5BIFNpbXBsZVRhZyBoYW5kbGVyIG11c3QgaGF2ZSBhIHB1YmxpYyBuby1hcmdzIGNvbnN0cnVjdG9yLiAgTW9zdAorICogU2ltcGxlVGFnIGhhbmRsZXJzIHNob3VsZCBleHRlbmQgU2ltcGxlVGFnU3VwcG9ydC48L3A+CisgKiAKKyAqIDxwPjxiPkxpZmVjeWNsZTwvYj48L3A+CisgKgorICogPHA+VGhlIGZvbGxvd2luZyBpcyBhIG5vbi1ub3JtYXRpdmUsIGJyaWVmIG92ZXJ2aWV3IG9mIHRoZSAKKyAqIFNpbXBsZVRhZyBsaWZlY3ljbGUuICBSZWZlciB0byB0aGUgSlNQIFNwZWNpZmljYXRpb24gZm9yIGRldGFpbHMuPC9wPgorICoKKyAqIDxvbD4KKyAqICAgPGxpPkEgbmV3IHRhZyBoYW5kbGVyIGluc3RhbmNlIGlzIGNyZWF0ZWQgZWFjaCB0aW1lIGJ5IHRoZSBjb250YWluZXIgCisgKiAgICAgICBieSBjYWxsaW5nIHRoZSBwcm92aWRlZCB6ZXJvLWFyZ3MgY29uc3RydWN0b3IuICBVbmxpa2UgY2xhc3NpYworICogICAgICAgdGFnIGhhbmRsZXJzLCBzaW1wbGUgdGFnIGhhbmRsZXJzIGFyZSBuZXZlciBjYWNoZWQgYW5kIHJldXNlZCBieQorICogICAgICAgdGhlIEpTUCBjb250YWluZXIuPC9saT4KKyAqICAgPGxpPlRoZSA8Y29kZT5zZXRKc3BDb250ZXh0KCk8L2NvZGU+IGFuZCA8Y29kZT5zZXRQYXJlbnQoKTwvY29kZT4gCisgKiAgICAgICBtZXRob2RzIGFyZSBjYWxsZWQgYnkgdGhlIGNvbnRhaW5lci4gIFRoZSA8Y29kZT5zZXRQYXJlbnQoKTwvY29kZT4KKyAqICAgICAgIG1ldGhvZCBpcyBvbmx5IGNhbGxlZCBpZiB0aGUgZWxlbWVudCBpcyBuZXN0ZWQgd2l0aGluIGFub3RoZXIgdGFnIAorICogICAgICAgaW52b2NhdGlvbi48L2xpPgorICogICA8bGk+VGhlIHNldHRlcnMgZm9yIGVhY2ggYXR0cmlidXRlIGRlZmluZWQgZm9yIHRoaXMgdGFnIGFyZSBjYWxsZWQKKyAqICAgICAgIGJ5IHRoZSBjb250YWluZXIuPC9saT4KKyAqICAgPGxpPklmIGEgYm9keSBleGlzdHMsIHRoZSA8Y29kZT5zZXRKc3BCb2R5KCk8L2NvZGU+IG1ldGhvZCBpcyBjYWxsZWQgCisgKiAgICAgICBieSB0aGUgY29udGFpbmVyIHRvIHNldCB0aGUgYm9keSBvZiB0aGlzIHRhZywgYXMgYSAKKyAqICAgICAgIDxjb2RlPkpzcEZyYWdtZW50PC9jb2RlPi4gIElmIHRoZSBhY3Rpb24gZWxlbWVudCBpcyBlbXB0eSBpbgorICogICAgICAgdGhlIHBhZ2UsIHRoaXMgbWV0aG9kIGlzIG5vdCBjYWxsZWQgYXQgYWxsLjwvbGk+CisgKiAgIDxsaT5UaGUgPGNvZGU+ZG9UYWcoKTwvY29kZT4gbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgY29udGFpbmVyLiAgQWxsCisgKiAgICAgICB0YWcgbG9naWMsIGl0ZXJhdGlvbiwgYm9keSBldmFsdWF0aW9ucywgZXRjLiBvY2N1ciBpbiB0aGlzIAorICogICAgICAgbWV0aG9kLjwvbGk+CisgKiAgIDxsaT5UaGUgPGNvZGU+ZG9UYWcoKTwvY29kZT4gbWV0aG9kIHJldHVybnMgYW5kIGFsbCB2YXJpYWJsZXMgYXJlCisgKiAgICAgICBzeW5jaHJvbml6ZWQuPC9saT4KKyAqIDwvb2w+CisgKiAKKyAqIEBzZWUgU2ltcGxlVGFnU3VwcG9ydAorICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgaW50ZXJmYWNlIFNpbXBsZVRhZyBleHRlbmRzIEpzcFRhZyB7CisgICAgCisgICAgLyoqIAorICAgICAqIENhbGxlZCBieSB0aGUgY29udGFpbmVyIHRvIGludm9rZSB0aGlzIHRhZy4KKyAgICAgKiBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgaXMgcHJvdmlkZWQgYnkgdGhlIHRhZyBsaWJyYXJ5CisgICAgICogZGV2ZWxvcGVyLCBhbmQgaGFuZGxlcyBhbGwgdGFnIHByb2Nlc3NpbmcsIGJvZHkgaXRlcmF0aW9uLCBldGMuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgSlNQIGNvbnRhaW5lciB3aWxsIHJlc3luY2hyb25pemUgYW55IEFUX0JFR0lOIGFuZCBBVF9FTkQKKyAgICAgKiB2YXJpYWJsZXMgKGRlZmluZWQgYnkgdGhlIGFzc29jaWF0ZWQgdGFnIGZpbGUsIFRhZ0V4dHJhSW5mbywgb3IgVExEKQorICAgICAqIGFmdGVyIHRoZSBpbnZvY2F0aW9uIG9mIGRvVGFnKCkuCisgICAgICogCisgICAgICogQHRocm93cyBqYXZheC5zZXJ2bGV0LmpzcC5Kc3BFeGNlcHRpb24gSWYgYW4gZXJyb3Igb2NjdXJyZWQgCisgICAgICogICAgIHdoaWxlIHByb2Nlc3NpbmcgdGhpcyB0YWcuCisgICAgICogQHRocm93cyBqYXZheC5zZXJ2bGV0LmpzcC5Ta2lwUGFnZUV4Y2VwdGlvbiBJZiB0aGUgcGFnZSB0aGF0CisgICAgICogICAgIChlaXRoZXIgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSkgaW52b2tlZCB0aGlzIHRhZyBpcyB0bworICAgICAqICAgICBjZWFzZSBldmFsdWF0aW9uLiAgQSBTaW1wbGUgVGFnIEhhbmRsZXIgZ2VuZXJhdGVkIGZyb20gYSAKKyAgICAgKiAgICAgdGFnIGZpbGUgbXVzdCB0aHJvdyB0aGlzIGV4Y2VwdGlvbiBpZiBhbiBpbnZva2VkIENsYXNzaWMgCisgICAgICogICAgIFRhZyBIYW5kbGVyIHJldHVybmVkIFNLSVBfUEFHRSBvciBpZiBhbiBpbnZva2VkIFNpbXBsZQorICAgICAqICAgICBUYWcgSGFuZGxlciB0aHJldyBTa2lwUGFnZUV4Y2VwdGlvbiBvciBpZiBhbiBpbnZva2VkIEpzcCBGcmFnbWVudAorICAgICAqICAgICB0aHJldyBhIFNraXBQYWdlRXhjZXB0aW9uLgorICAgICAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiBJZiB0aGVyZSB3YXMgYW4gZXJyb3Igd3JpdGluZyB0byB0aGUKKyAgICAgKiAgICAgb3V0cHV0IHN0cmVhbS4KKyAgICAgKi8gCisgICAgcHVibGljIHZvaWQgZG9UYWcoKSAKKyAgICAgICAgdGhyb3dzIGphdmF4LnNlcnZsZXQuanNwLkpzcEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbjsKKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBwYXJlbnQgb2YgdGhpcyB0YWcsIGZvciBjb2xsYWJvcmF0aW9uIHB1cnBvc2VzLgorICAgICAqIDxwPgorICAgICAqIFRoZSBjb250YWluZXIgaW52b2tlcyB0aGlzIG1ldGhvZCBvbmx5IGlmIHRoaXMgdGFnIGludm9jYXRpb24gaXMgCisgICAgICogbmVzdGVkIHdpdGhpbiBhbm90aGVyIHRhZyBpbnZvY2F0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmVudCB0aGUgdGFnIHRoYXQgZW5jbG9zZXMgdGhpcyB0YWcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXJlbnQoIEpzcFRhZyBwYXJlbnQgKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBwYXJlbnQgb2YgdGhpcyB0YWcsIGZvciBjb2xsYWJvcmF0aW9uIHB1cnBvc2VzLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgcGFyZW50IG9mIHRoaXMgdGFnCisgICAgICovIAorICAgIHB1YmxpYyBKc3BUYWcgZ2V0UGFyZW50KCk7CisgICAgCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IHRoZSBjb250YWluZXIgdG8gcHJvdmlkZSB0aGlzIHRhZyBoYW5kbGVyIHdpdGgKKyAgICAgKiB0aGUgPGNvZGU+SnNwQ29udGV4dDwvY29kZT4gZm9yIHRoaXMgaW52b2NhdGlvbi4KKyAgICAgKiBBbiBpbXBsZW1lbnRhdGlvbiBzaG91bGQgc2F2ZSB0aGlzIHZhbHVlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBwYyB0aGUgcGFnZSBjb250ZXh0IGZvciB0aGlzIGludm9jYXRpb24KKyAgICAgKiBAc2VlIFRhZyNzZXRQYWdlQ29udGV4dAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEpzcENvbnRleHQoIEpzcENvbnRleHQgcGMgKTsKKyAgICAgICAgICAgICAgICAKKyAgICAvKiogCisgICAgICogUHJvdmlkZXMgdGhlIGJvZHkgb2YgdGhpcyB0YWcgYXMgYSBKc3BGcmFnbWVudCBvYmplY3QsIGFibGUgdG8gYmUgCisgICAgICogaW52b2tlZCB6ZXJvIG9yIG1vcmUgdGltZXMgYnkgdGhlIHRhZyBoYW5kbGVyLiAKKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBpbnZva2VkIGJ5IHRoZSBKU1AgcGFnZSBpbXBsZW1lbnRhdGlvbiAKKyAgICAgKiBvYmplY3QgcHJpb3IgdG8gPGNvZGU+ZG9UYWcoKTwvY29kZT4uICBJZiB0aGUgYWN0aW9uIGVsZW1lbnQgaXMKKyAgICAgKiBlbXB0eSBpbiB0aGUgcGFnZSwgdGhpcyBtZXRob2QgaXMgbm90IGNhbGxlZCBhdCBhbGwuCisgICAgICogCisgICAgICogQHBhcmFtIGpzcEJvZHkgVGhlIGZyYWdtZW50IGVuY2Fwc3VsYXRpbmcgdGhlIGJvZHkgb2YgdGhpcyB0YWcuCisgICAgICovIAorICAgIHB1YmxpYyB2b2lkIHNldEpzcEJvZHkoIEpzcEZyYWdtZW50IGpzcEJvZHkgKTsKKworICAgIAorfQpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL3RhZ2V4dC9TaW1wbGVUYWdTdXBwb3J0LmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvdGFnZXh0L1NpbXBsZVRhZ1N1cHBvcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODI0NjM5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL3RhZ2V4dC9TaW1wbGVUYWdTdXBwb3J0LmphdmEKQEAgLTAsMCArMSwyMTIgQEAKKy8qCisqIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KK3BhY2thZ2UgamF2YXguc2VydmxldC5qc3AudGFnZXh0OworCitpbXBvcnQgamF2YXguc2VydmxldC5qc3AuSnNwQ29udGV4dDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC5Kc3BFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworLyoqCisgKiBBIGJhc2UgY2xhc3MgZm9yIGRlZmluaW5nIHRhZyBoYW5kbGVycyBpbXBsZW1lbnRpbmcgU2ltcGxlVGFnLgorICogPHA+CisgKiBUaGUgU2ltcGxlVGFnU3VwcG9ydCBjbGFzcyBpcyBhIHV0aWxpdHkgY2xhc3MgaW50ZW5kZWQgdG8gYmUgdXNlZAorICogYXMgdGhlIGJhc2UgY2xhc3MgZm9yIG5ldyBzaW1wbGUgdGFnIGhhbmRsZXJzLiAgVGhlIFNpbXBsZVRhZ1N1cHBvcnQKKyAqIGNsYXNzIGltcGxlbWVudHMgdGhlIFNpbXBsZVRhZyBpbnRlcmZhY2UgYW5kIGFkZHMgYWRkaXRpb25hbAorICogY29udmVuaWVuY2UgbWV0aG9kcyBpbmNsdWRpbmcgZ2V0dGVyIG1ldGhvZHMgZm9yIHRoZSBwcm9wZXJ0aWVzIGluCisgKiBTaW1wbGVUYWcuCisgKgorICogQHNpbmNlIDIuMAorICovCitwdWJsaWMgY2xhc3MgU2ltcGxlVGFnU3VwcG9ydCAKKyAgICBpbXBsZW1lbnRzIFNpbXBsZVRhZworeworICAgIC8qKiBSZWZlcmVuY2UgdG8gdGhlIGVuY2xvc2luZyB0YWcuICovCisgICAgcHJpdmF0ZSBKc3BUYWcgcGFyZW50VGFnOworICAgIAorICAgIC8qKiBUaGUgSlNQIGNvbnRleHQgZm9yIHRoZSB1cGNvbWluZyB0YWcgaW52b2NhdGlvbi4gKi8KKyAgICBwcml2YXRlIEpzcENvbnRleHQganNwQ29udGV4dDsKKyAgICAKKyAgICAvKiogVGhlIGJvZHkgb2YgdGhlIHRhZy4gKi8KKyAgICBwcml2YXRlIEpzcEZyYWdtZW50IGpzcEJvZHk7CisgICAgCisgICAgLyoqCisgICAgICogU29sZSBjb25zdHJ1Y3Rvci4gKEZvciBpbnZvY2F0aW9uIGJ5IHN1YmNsYXNzIGNvbnN0cnVjdG9ycywgCisgICAgICogdHlwaWNhbGx5IGltcGxpY2l0LikKKyAgICAgKi8KKyAgICBwdWJsaWMgU2ltcGxlVGFnU3VwcG9ydCgpIHsKKyAgICB9CisgICAgCisgICAgLyoqIAorICAgICAqIERlZmF1bHQgcHJvY2Vzc2luZyBvZiB0aGUgdGFnIGRvZXMgbm90aGluZy4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSnNwRXhjZXB0aW9uIFN1YmNsYXNzZXMgY2FuIHRocm93IEpzcEV4Y2VwdGlvbiB0byBpbmRpY2F0ZQorICAgICAqICAgICBhbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBwcm9jZXNzaW5nIHRoaXMgdGFnLgorICAgICAqIEB0aHJvd3MgamF2YXguc2VydmxldC5qc3AuU2tpcFBhZ2VFeGNlcHRpb24gSWYgdGhlIHBhZ2UgdGhhdAorICAgICAqICAgICAoZWl0aGVyIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkpIGludm9rZWQgdGhpcyB0YWcgaXMgdG8KKyAgICAgKiAgICAgY2Vhc2UgZXZhbHVhdGlvbi4gIEEgU2ltcGxlIFRhZyBIYW5kbGVyIGdlbmVyYXRlZCBmcm9tIGEgCisgICAgICogICAgIHRhZyBmaWxlIG11c3QgdGhyb3cgdGhpcyBleGNlcHRpb24gaWYgYW4gaW52b2tlZCBDbGFzc2ljIAorICAgICAqICAgICBUYWcgSGFuZGxlciByZXR1cm5lZCBTS0lQX1BBR0Ugb3IgaWYgYW4gaW52b2tlZCBTaW1wbGUKKyAgICAgKiAgICAgVGFnIEhhbmRsZXIgdGhyZXcgU2tpcFBhZ2VFeGNlcHRpb24gb3IgaWYgYW4gaW52b2tlZCBKc3AgRnJhZ21lbnQKKyAgICAgKiAgICAgdGhyZXcgYSBTa2lwUGFnZUV4Y2VwdGlvbi4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFN1YmNsYXNzZXMgY2FuIHRocm93IElPRXhjZXB0aW9uIGlmIHRoZXJlIHdhcworICAgICAqICAgICBhbiBlcnJvciB3cml0aW5nIHRvIHRoZSBvdXRwdXQgc3RyZWFtCisgICAgICogQHNlZSBTaW1wbGVUYWcjZG9UYWcoKQorICAgICAqLyAKKyAgICBwdWJsaWMgdm9pZCBkb1RhZygpIAorICAgICAgICB0aHJvd3MgSnNwRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgcGFyZW50IG9mIHRoaXMgdGFnLCBmb3IgY29sbGFib3JhdGlvbiBwdXJwb3Nlcy4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgY29udGFpbmVyIGludm9rZXMgdGhpcyBtZXRob2Qgb25seSBpZiB0aGlzIHRhZyBpbnZvY2F0aW9uIGlzCisgICAgICogbmVzdGVkIHdpdGhpbiBhbm90aGVyIHRhZyBpbnZvY2F0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmVudCB0aGUgdGFnIHRoYXQgZW5jbG9zZXMgdGhpcyB0YWcKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXJlbnQoIEpzcFRhZyBwYXJlbnQgKSB7CisgICAgICAgIHRoaXMucGFyZW50VGFnID0gcGFyZW50OworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBwYXJlbnQgb2YgdGhpcyB0YWcsIGZvciBjb2xsYWJvcmF0aW9uIHB1cnBvc2VzLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgcGFyZW50IG9mIHRoaXMgdGFnCisgICAgICovIAorICAgIHB1YmxpYyBKc3BUYWcgZ2V0UGFyZW50KCkgeworICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnRUYWc7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFN0b3JlcyB0aGUgcHJvdmlkZWQgSlNQIGNvbnRleHQgaW4gdGhlIHByaXZhdGUganNwQ29udGV4dCBmaWVsZC4KKyAgICAgKiBTdWJjbGFzc2VzIGNhbiBhY2Nlc3MgdGhlIDxjb2RlPkpzcENvbnRleHQ8L2NvZGU+IHZpYSAKKyAgICAgKiA8Y29kZT5nZXRKc3BDb250ZXh0KCk8L2NvZGU+LgorICAgICAqIAorICAgICAqIEBwYXJhbSBwYyB0aGUgcGFnZSBjb250ZXh0IGZvciB0aGlzIGludm9jYXRpb24KKyAgICAgKiBAc2VlIFNpbXBsZVRhZyNzZXRKc3BDb250ZXh0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SnNwQ29udGV4dCggSnNwQ29udGV4dCBwYyApIHsKKyAgICAgICAgdGhpcy5qc3BDb250ZXh0ID0gcGM7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHBhZ2UgY29udGV4dCBwYXNzZWQgaW4gYnkgdGhlIGNvbnRhaW5lciB2aWEgCisgICAgICogc2V0SnNwQ29udGV4dC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHBhZ2UgY29udGV4dCBmb3IgdGhpcyBpbnZvY2F0aW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIEpzcENvbnRleHQgZ2V0SnNwQ29udGV4dCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuanNwQ29udGV4dDsKKyAgICB9CisgICAgICAgICAgICAgICAgCisgICAgLyoqIAorICAgICAqIFN0b3JlcyB0aGUgcHJvdmlkZWQgSnNwRnJhZ21lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0ganNwQm9keSBUaGUgZnJhZ21lbnQgZW5jYXBzdWxhdGluZyB0aGUgYm9keSBvZiB0aGlzIHRhZy4KKyAgICAgKiAgICAgSWYgdGhlIGFjdGlvbiBlbGVtZW50IGlzIGVtcHR5IGluIHRoZSBwYWdlLCB0aGlzIG1ldGhvZCBpcyAKKyAgICAgKiAgICAgbm90IGNhbGxlZCBhdCBhbGwuCisgICAgICogQHNlZSBTaW1wbGVUYWcjc2V0SnNwQm9keQorICAgICAqLyAKKyAgICBwdWJsaWMgdm9pZCBzZXRKc3BCb2R5KCBKc3BGcmFnbWVudCBqc3BCb2R5ICkgeworICAgICAgICB0aGlzLmpzcEJvZHkgPSBqc3BCb2R5OworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBib2R5IHBhc3NlZCBpbiBieSB0aGUgY29udGFpbmVyIHZpYSBzZXRKc3BCb2R5LgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgZnJhZ21lbnQgZW5jYXBzdWxhdGluZyB0aGUgYm9keSBvZiB0aGlzIHRhZywgb3IKKyAgICAgKiAgICBudWxsIGlmIHRoZSBhY3Rpb24gZWxlbWVudCBpcyBlbXB0eSBpbiB0aGUgcGFnZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgSnNwRnJhZ21lbnQgZ2V0SnNwQm9keSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuanNwQm9keTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaW5kIHRoZSBpbnN0YW5jZSBvZiBhIGdpdmVuIGNsYXNzIHR5cGUgdGhhdCBpcyBjbG9zZXN0IHRvIGEgZ2l2ZW4KKyAgICAgKiBpbnN0YW5jZS4KKyAgICAgKiBUaGlzIG1ldGhvZCB1c2VzIHRoZSBnZXRQYXJlbnQgbWV0aG9kIGZyb20gdGhlIFRhZyBhbmQvb3IgU2ltcGxlVGFnCisgICAgICogaW50ZXJmYWNlcy4gIFRoaXMgbWV0aG9kIGlzIHVzZWQgZm9yIGNvb3JkaW5hdGlvbiBhbW9uZyAKKyAgICAgKiBjb29wZXJhdGluZyB0YWdzLgorICAgICAqCisgICAgICogPHA+IEZvciBldmVyeSBpbnN0YW5jZSBvZiBUYWdBZGFwdGVyCisgICAgICogZW5jb3VudGVyZWQgd2hpbGUgdHJhdmVyc2luZyB0aGUgYW5jZXN0b3JzLCB0aGUgdGFnIGhhbmRsZXIgcmV0dXJuZWQgYnkKKyAgICAgKiA8dHQ+VGFnQWRhcHRlci5nZXRBZGFwdGVlKCk8L3R0PiAtIGluc3RlYWQgb2YgdGhlIFRhZ0FkcGF0ZXIgaXRzZWxmIC0KKyAgICAgKiBpcyBjb21wYXJlZCB0byA8dHQ+a2xhc3M8L3R0Pi4gSWYgdGhlIHRhZyBoYW5kbGVyIG1hdGNoZXMsIGl0IC0gYW5kCisgICAgICogbm90IGl0cyBUYWdBZGFwdGVyIC0gaXMgcmV0dXJuZWQuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSBzcGVjaWZpY2F0aW9uIG9ubHkgcHJvdmlkZXMgb25lIGZvcm1hbAorICAgICAqIHdheSBvZiBpbmRpY2F0aW5nIHRoZSBvYnNlcnZhYmxlIHR5cGUgb2YgYSB0YWcgaGFuZGxlcjogaXRzCisgICAgICogdGFnIGhhbmRsZXIgaW1wbGVtZW50YXRpb24gY2xhc3MsIGRlc2NyaWJlZCBpbiB0aGUgdGFnLWNsYXNzCisgICAgICogc3ViZWxlbWVudCBvZiB0aGUgdGFnIGVsZW1lbnQuICBUaGlzIGlzIGV4dGVuZGVkIGluIGFuCisgICAgICogaW5mb3JtYWwgbWFubmVyIGJ5IGFsbG93aW5nIHRoZSB0YWcgbGlicmFyeSBhdXRob3IgdG8KKyAgICAgKiBpbmRpY2F0ZSBpbiB0aGUgZGVzY3JpcHRpb24gc3ViZWxlbWVudCBhbiBvYnNlcnZhYmxlIHR5cGUuCisgICAgICogVGhlIHR5cGUgc2hvdWxkIGJlIGEgc3VidHlwZSBvZiB0aGUgdGFnIGhhbmRsZXIgaW1wbGVtZW50YXRpb24KKyAgICAgKiBjbGFzcyBvciB2b2lkLgorICAgICAqIFRoaXMgYWRkaXRpdGlvbmFsIGNvbnN0cmFpbnQgY2FuIGJlIGV4cGxvaXRlZCBieSBhCisgICAgICogc3BlY2lhbGl6ZWQgY29udGFpbmVyIHRoYXQga25vd3MgYWJvdXQgdGhhdCBzcGVjaWZpYyB0YWcgbGlicmFyeSwKKyAgICAgKiBhcyBpbiB0aGUgY2FzZSBvZiB0aGUgSlNQIHN0YW5kYXJkIHRhZyBsaWJyYXJ5LgorICAgICAqCisgICAgICogPHA+CisgICAgICogV2hlbiBhIHRhZyBsaWJyYXJ5IGF1dGhvciBwcm92aWRlcyBpbmZvcm1hdGlvbiBvbiB0aGUKKyAgICAgKiBvYnNlcnZhYmxlIHR5cGUgb2YgYSB0YWcgaGFuZGxlciwgY2xpZW50IHByb2dyYW1tYXRpYyBjb2RlCisgICAgICogc2hvdWxkIGFkaGVyZSB0byB0aGF0IGNvbnN0cmFpbnQuICBTcGVjaWZpY2FsbHksIHRoZSBDbGFzcworICAgICAqIHBhc3NlZCB0byBmaW5kQW5jZXN0b3JXaXRoQ2xhc3Mgc2hvdWxkIGJlIGEgc3VidHlwZSBvZiB0aGUKKyAgICAgKiBvYnNlcnZhYmxlIHR5cGUuCisgICAgICogCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJvbSBUaGUgaW5zdGFuY2UgZnJvbSB3aGVyZSB0byBzdGFydCBsb29raW5nLgorICAgICAqIEBwYXJhbSBrbGFzcyBUaGUgc3ViY2xhc3Mgb2YgSnNwVGFnIG9yIGludGVyZmFjZSB0byBiZSBtYXRjaGVkCisgICAgICogQHJldHVybiB0aGUgbmVhcmVzdCBhbmNlc3RvciB0aGF0IGltcGxlbWVudHMgdGhlIGludGVyZmFjZQorICAgICAqIG9yIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBjbGFzcyBzcGVjaWZpZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEpzcFRhZyBmaW5kQW5jZXN0b3JXaXRoQ2xhc3MoCisJSnNwVGFnIGZyb20sIENsYXNzIGtsYXNzKSAKKyAgICB7CisJYm9vbGVhbiBpc0ludGVyZmFjZSA9IGZhbHNlOworCisJaWYgKGZyb20gPT0gbnVsbCB8fCBrbGFzcyA9PSBudWxsCisJICAgICAgICB8fCAoIUpzcFRhZy5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGtsYXNzKQorCQkgICAgJiYgIShpc0ludGVyZmFjZSA9IGtsYXNzLmlzSW50ZXJmYWNlKCkpKSkgeworCSAgICByZXR1cm4gbnVsbDsKKwl9CisKKwlmb3IgKDs7KSB7CisJICAgIEpzcFRhZyBwYXJlbnQgPSBudWxsOworCSAgICBpZiggZnJvbSBpbnN0YW5jZW9mIFNpbXBsZVRhZyApIHsKKwkJcGFyZW50ID0gKChTaW1wbGVUYWcpZnJvbSkuZ2V0UGFyZW50KCk7CisJICAgIH0KKwkgICAgZWxzZSBpZiggZnJvbSBpbnN0YW5jZW9mIFRhZyApIHsKKwkJcGFyZW50ID0gKChUYWcpZnJvbSkuZ2V0UGFyZW50KCk7CisJICAgIH0KKwkgICAgaWYgKHBhcmVudCA9PSBudWxsKSB7CisJCXJldHVybiBudWxsOworCSAgICB9CisKKwkgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFRhZ0FkYXB0ZXIpIHsKKwkJcGFyZW50ID0gKChUYWdBZGFwdGVyKSBwYXJlbnQpLmdldEFkYXB0ZWUoKTsKKwkgICAgfQorCisJICAgIGlmICgoaXNJbnRlcmZhY2UgJiYga2xhc3MuaXNJbnN0YW5jZShwYXJlbnQpKQorCQkgICAgfHwga2xhc3MuaXNBc3NpZ25hYmxlRnJvbShwYXJlbnQuZ2V0Q2xhc3MoKSkpIHsKKwkJcmV0dXJuIHBhcmVudDsKKwkgICAgfQorCisJICAgIGZyb20gPSBwYXJlbnQ7CisJfQorICAgIH0gICAgCit9CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvdGFnZXh0L1RhZy5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL3RhZ2V4dC9UYWcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGNiY2Y3Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL3RhZ2V4dC9UYWcuamF2YQpAQCAtMCwwICsxLDI2MiBAQAorLyoKKyogQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworIAorcGFja2FnZSBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQ7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC4qOworCisKKy8qKgorICogVGhlIGludGVyZmFjZSBvZiBhIGNsYXNzaWMgdGFnIGhhbmRsZXIgdGhhdCBkb2VzIG5vdCB3YW50IHRvIG1hbmlwdWxhdGUgCisgKiBpdHMgYm9keS4gIFRoZSBUYWcgaW50ZXJmYWNlIGRlZmluZXMgdGhlIGJhc2ljIHByb3RvY29sIGJldHdlZW4gYSBUYWcgCisgKiBoYW5kbGVyIGFuZCBKU1AgcGFnZSBpbXBsZW1lbnRhdGlvbiBjbGFzcy4gIEl0IGRlZmluZXMgdGhlIGxpZmUgY3ljbGUgCisgKiBhbmQgdGhlIG1ldGhvZHMgdG8gYmUgaW52b2tlZCBhdCBzdGFydCBhbmQgZW5kIHRhZy4KKyAqCisgKiA8cD48Qj5Qcm9wZXJ0aWVzPC9CPjwvcD4KKyAqCisgKiA8cD5UaGUgVGFnIGludGVyZmFjZSBzcGVjaWZpZXMgdGhlIHNldHRlciBhbmQgZ2V0dGVyIG1ldGhvZHMgZm9yIHRoZSBjb3JlCisgKiBwYWdlQ29udGV4dCBhbmQgcGFyZW50IHByb3BlcnRpZXMuPC9wPgorICoKKyAqIDxwPlRoZSBKU1AgcGFnZSBpbXBsZW1lbnRhdGlvbiBvYmplY3QgaW52b2tlcyBzZXRQYWdlQ29udGV4dCBhbmQKKyAqIHNldFBhcmVudCwgaW4gdGhhdCBvcmRlciwgYmVmb3JlIGludm9raW5nIGRvU3RhcnRUYWcoKSBvciBkb0VuZFRhZygpLjwvcD4KKyAqCisgKiA8cD48Qj5NZXRob2RzPC9CPjwvcD4KKyAqCisgKiA8cD5UaGVyZSBhcmUgdHdvIG1haW4gYWN0aW9uczogZG9TdGFydFRhZyBhbmQgZG9FbmRUYWcuICBPbmNlIGFsbAorICogYXBwcm9wcmlhdGUgcHJvcGVydGllcyBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQsIHRoZSBkb1N0YXJ0VGFnIGFuZAorICogZG9FbmRUYWcgbWV0aG9kcyBjYW4gYmUgaW52b2tlZCBvbiB0aGUgdGFnIGhhbmRsZXIuICBCZXR3ZWVuIHRoZXNlCisgKiBpbnZvY2F0aW9ucywgdGhlIHRhZyBoYW5kbGVyIGlzIGFzc3VtZWQgdG8gaG9sZCBhIHN0YXRlIHRoYXQgbXVzdAorICogYmUgcHJlc2VydmVkLiAgQWZ0ZXIgdGhlIGRvRW5kVGFnIGludm9jYXRpb24sIHRoZSB0YWcgaGFuZGxlciBpcworICogYXZhaWxhYmxlIGZvciBmdXJ0aGVyIGludm9jYXRpb25zIChhbmQgaXQgaXMgZXhwZWN0ZWQgdG8gaGF2ZQorICogcmV0YWluZWQgaXRzIHByb3BlcnRpZXMpLjwvcD4KKyAqCisgKiA8cD48Qj5MaWZlY3ljbGU8L0I+PC9wPgorICoKKyAqIDxwPkxpZmVjeWNsZSBkZXRhaWxzIGFyZSBkZXNjcmliZWQgYnkgdGhlIHRyYW5zaXRpb24gZGlhZ3JhbSBiZWxvdywKKyAqIHdpdGggdGhlIGZvbGxvd2luZyBjb21tZW50czoKKyAqIDx1bD4KKyAqIDxsaT4gWzFdIFRoaXMgdHJhbnNpdGlvbiBpcyBpbnRlbmRlZCB0byBiZSBmb3IgcmVsZWFzaW5nIGxvbmctdGVybSBkYXRhLgorICogbm8gZ3VhcmFudGVlcyBhcmUgYXNzdW1lZCBvbiB3aGV0aGVyIGFueSBwcm9wZXJ0aWVzIGhhdmUgYmVlbiByZXRhaW5lZAorICogb3Igbm90LgorICogPGxpPiBbMl0gVGhpcyB0cmFuc2l0aW9uIGhhcHBlbnMgaWYgYW5kIG9ubHkgaWYgdGhlIHRhZyBlbmRzIG5vcm1hbGx5CisgKiB3aXRob3V0IHJhaXNpbmcgYW4gZXhjZXB0aW9uCisgKiA8bGk+IFszXSBTb21lIHNldHRlcnMgbWF5IGJlIGNhbGxlZCBhZ2FpbiBiZWZvcmUgYSB0YWcgaGFuZGxlciBpcyAKKyAqIHJldXNlZC4gIEZvciBpbnN0YW5jZSwgPGNvZGU+c2V0UGFyZW50KCk8L2NvZGU+IGlzIGNhbGxlZCBpZiBpdCdzIAorICogcmV1c2VkIHdpdGhpbiB0aGUgc2FtZSBwYWdlIGJ1dCBhdCBhIGRpZmZlcmVudCBsZXZlbCwgCisgKiA8Y29kZT5zZXRQYWdlQ29udGV4dCgpPC9jb2RlPiBpcyBjYWxsZWQgaWYgaXQncyB1c2VkIGluIGFub3RoZXIgcGFnZSwgCisgKiBhbmQgYXR0cmlidXRlIHNldHRlcnMgYXJlIGNhbGxlZCBpZiB0aGUgdmFsdWVzIGRpZmZlciBvciBhcmUgZXhwcmVzc2VkIAorICogYXMgcmVxdWVzdC10aW1lIGF0dHJpYnV0ZSB2YWx1ZXMuCisgKiA8bGk+IENoZWNrIHRoZSBUcnlDYXRjaEZpbmFsbHkgaW50ZXJmYWNlIGZvciBhZGRpdGlvbmFsIGRldGFpbHMgcmVsYXRlZAorICogdG8gZXhjZXB0aW9uIGhhbmRsaW5nIGFuZCByZXNvdXJjZSBtYW5hZ2VtZW50LgorICogPC91bD48L3A+CisgKgorICogPElNRyBzcmM9ImRvYy1maWxlcy9UYWdQcm90b2NvbC5naWYiCisgKiAgICAgIGFsdD0iTGlmZWN5Y2xlIERldGFpbHMgVHJhbnNpdGlvbiBEaWFncmFtIGZvciBUYWciLz4KKyAqIAorICogPHA+T25jZSBhbGwgaW52b2NhdGlvbnMgb24gdGhlIHRhZyBoYW5kbGVyCisgKiBhcmUgY29tcGxldGVkLCB0aGUgcmVsZWFzZSBtZXRob2QgaXMgaW52b2tlZCBvbiBpdC4gIE9uY2UgYSByZWxlYXNlCisgKiBtZXRob2QgaXMgaW52b2tlZCA8ZW0+YWxsPC9lbT4gcHJvcGVydGllcywgaW5jbHVkaW5nIHBhcmVudCBhbmQKKyAqIHBhZ2VDb250ZXh0LCBhcmUgYXNzdW1lZCB0byBoYXZlIGJlZW4gcmVzZXQgdG8gYW4gdW5zcGVjaWZpZWQgdmFsdWUuCisgKiBUaGUgcGFnZSBjb21waWxlciBndWFyYW50ZWVzIHRoYXQgcmVsZWFzZSgpIHdpbGwgYmUgaW52b2tlZCBvbiB0aGUgVGFnCisgKiBoYW5kbGVyIGJlZm9yZSB0aGUgaGFuZGxlciBpcyByZWxlYXNlZCB0byB0aGUgR0MuPC9wPgorICoKKyAqIDxwPjxCPkVtcHR5IGFuZCBOb24tRW1wdHkgQWN0aW9uPC9CPjwvcD4KKyAqIDxwPklmIHRoZSBUYWdMaWJyYXJ5RGVzY3JpcHRvciBmaWxlIGluZGljYXRlcyB0aGF0IHRoZSBhY3Rpb24gbXVzdAorICogYWx3YXlzIGhhdmUgYW4gZW1wdHkgYWN0aW9uLCBieSBhbiAmbHQ7Ym9keS1jb250ZW50Jmd0OyBlbnRyeSBvZiAiZW1wdHkiLAorICogdGhlbiB0aGUgZG9TdGFydFRhZygpIG1ldGhvZCBtdXN0IHJldHVybiBTS0lQX0JPRFkuPC9wPgorICoKKyAqIDxwPk90aGVyd2lzZSwgdGhlIGRvU3RhcnRUYWcoKSBtZXRob2QgbWF5IHJldHVybiBTS0lQX0JPRFkgb3IKKyAqIEVWQUxfQk9EWV9JTkNMVURFLjwvcD4KKyAqCisgKiA8cD5JZiBTS0lQX0JPRFkgaXMgcmV0dXJuZWQgdGhlIGJvZHksIGlmIHByZXNlbnQsIGlzIG5vdCBldmFsdWF0ZWQuPC9wPgorICogCisgKiA8cD5JZiBFVkFMX0JPRFlfSU5DTFVERSBpcyByZXR1cm5lZCwgdGhlIGJvZHkgaXMgZXZhbHVhdGVkIGFuZAorICogInBhc3NlZCB0aHJvdWdoIiB0byB0aGUgY3VycmVudCBvdXQuPC9wPgorKi8KKworcHVibGljIGludGVyZmFjZSBUYWcgZXh0ZW5kcyBKc3BUYWcgeworCisgICAgLyoqCisgICAgICogU2tpcCBib2R5IGV2YWx1YXRpb24uCisgICAgICogVmFsaWQgcmV0dXJuIHZhbHVlIGZvciBkb1N0YXJ0VGFnIGFuZCBkb0FmdGVyQm9keS4KKyAgICAgKi8KKyAKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBTS0lQX0JPRFkgPSAwOworIAorICAgIC8qKgorICAgICAqIEV2YWx1YXRlIGJvZHkgaW50byBleGlzdGluZyBvdXQgc3RyZWFtLgorICAgICAqIFZhbGlkIHJldHVybiB2YWx1ZSBmb3IgZG9TdGFydFRhZy4KKyAgICAgKi8KKyAKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBFVkFMX0JPRFlfSU5DTFVERSA9IDE7CisKKyAgICAvKioKKyAgICAgKiBTa2lwIHRoZSByZXN0IG9mIHRoZSBwYWdlLgorICAgICAqIFZhbGlkIHJldHVybiB2YWx1ZSBmb3IgZG9FbmRUYWcuCisgICAgICovCisKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBTS0lQX1BBR0UgPSA1OworCisgICAgLyoqCisgICAgICogQ29udGludWUgZXZhbHVhdGluZyB0aGUgcGFnZS4KKyAgICAgKiBWYWxpZCByZXR1cm4gdmFsdWUgZm9yIGRvRW5kVGFnKCkuCisgICAgICovCisKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBFVkFMX1BBR0UgPSA2OworCisgICAgLy8gU2V0dGVycyBmb3IgVGFnIGhhbmRsZXIgZGF0YQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGN1cnJlbnQgcGFnZSBjb250ZXh0LgorICAgICAqIFRoaXMgbWV0aG9kIGlzIGludm9rZWQgYnkgdGhlIEpTUCBwYWdlIGltcGxlbWVudGF0aW9uIG9iamVjdAorICAgICAqIHByaW9yIHRvIGRvU3RhcnRUYWcoKS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIHZhbHVlIGlzICpub3QqIHJlc2V0IGJ5IGRvRW5kVGFnKCkgYW5kIG11c3QgYmUgZXhwbGljaXRseSByZXNldAorICAgICAqIGJ5IGEgcGFnZSBpbXBsZW1lbnRhdGlvbiBpZiBpdCBjaGFuZ2VzIGJldHdlZW4gY2FsbHMgdG8gZG9TdGFydFRhZygpLgorICAgICAqCisgICAgICogQHBhcmFtIHBjIFRoZSBwYWdlIGNvbnRleHQgZm9yIHRoaXMgdGFnIGhhbmRsZXIuCisgICAgICovCisKKyAgICB2b2lkIHNldFBhZ2VDb250ZXh0KFBhZ2VDb250ZXh0IHBjKTsKKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBwYXJlbnQgKGNsb3Nlc3QgZW5jbG9zaW5nIHRhZyBoYW5kbGVyKSBvZiB0aGlzIHRhZyBoYW5kbGVyLgorICAgICAqIEludm9rZWQgYnkgdGhlIEpTUCBwYWdlIGltcGxlbWVudGF0aW9uIG9iamVjdCBwcmlvciB0byBkb1N0YXJ0VGFnKCkuCisgICAgICogPHA+CisgICAgICogVGhpcyB2YWx1ZSBpcyAqbm90KiByZXNldCBieSBkb0VuZFRhZygpIGFuZCBtdXN0IGJlIGV4cGxpY2l0bHkgcmVzZXQKKyAgICAgKiBieSBhIHBhZ2UgaW1wbGVtZW50YXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdCBUaGUgcGFyZW50IHRhZywgb3IgbnVsbC4KKyAgICAgKi8KKworCisgICAgdm9pZCBzZXRQYXJlbnQoVGFnIHQpOworCisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHBhcmVudCAoY2xvc2VzdCBlbmNsb3NpbmcgdGFnIGhhbmRsZXIpIGZvciB0aGlzIHRhZyBoYW5kbGVyLgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhlIGdldFBhcmVudCgpIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBuYXZpZ2F0ZSB0aGUgbmVzdGVkIHRhZworICAgICAqIGhhbmRsZXIgc3RydWN0dXJlIGF0IHJ1bnRpbWUgZm9yIGNvb3BlcmF0aW9uIGFtb25nIGN1c3RvbSBhY3Rpb25zOworICAgICAqIGZvciBleGFtcGxlLCB0aGUgZmluZEFuY2VzdG9yV2l0aENsYXNzKCkgbWV0aG9kIGluIFRhZ1N1cHBvcnQKKyAgICAgKiBwcm92aWRlcyBhIGNvbnZlbmllbnQgd2F5IG9mIGRvaW5nIHRoaXMuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSBzcGVjaWZpY2F0aW9uIG9ubHkgcHJvdmlkZXMgb25lIGZvcm1hbAorICAgICAqIHdheSBvZiBpbmRpY2F0aW5nIHRoZSBvYnNlcnZhYmxlIHR5cGUgb2YgYSB0YWcgaGFuZGxlcjogaXRzCisgICAgICogdGFnIGhhbmRsZXIgaW1wbGVtZW50YXRpb24gY2xhc3MsIGRlc2NyaWJlZCBpbiB0aGUgdGFnLWNsYXNzCisgICAgICogc3ViZWxlbWVudCBvZiB0aGUgdGFnIGVsZW1lbnQuICBUaGlzIGlzIGV4dGVuZGVkIGluIGFuCisgICAgICogaW5mb3JtYWwgbWFubmVyIGJ5IGFsbG93aW5nIHRoZSB0YWcgbGlicmFyeSBhdXRob3IgdG8KKyAgICAgKiBpbmRpY2F0ZSBpbiB0aGUgZGVzY3JpcHRpb24gc3ViZWxlbWVudCBhbiBvYnNlcnZhYmxlIHR5cGUuCisgICAgICogVGhlIHR5cGUgc2hvdWxkIGJlIGEgc3VidHlwZSBvZiB0aGUgdGFnIGhhbmRsZXIgaW1wbGVtZW50YXRpb24KKyAgICAgKiBjbGFzcyBvciB2b2lkLgorICAgICAqIFRoaXMgYWRkaXRpdGlvbmFsIGNvbnN0cmFpbnQgY2FuIGJlIGV4cGxvaXRlZCBieSBhCisgICAgICogc3BlY2lhbGl6ZWQgY29udGFpbmVyIHRoYXQga25vd3MgYWJvdXQgdGhhdCBzcGVjaWZpYyB0YWcgbGlicmFyeSwKKyAgICAgKiBhcyBpbiB0aGUgY2FzZSBvZiB0aGUgSlNQIHN0YW5kYXJkIHRhZyBsaWJyYXJ5LgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgY3VycmVudCBwYXJlbnQsIG9yIG51bGwgaWYgbm9uZS4KKyAgICAgKiBAc2VlIFRhZ1N1cHBvcnQjZmluZEFuY2VzdG9yV2l0aENsYXNzCisgICAgICovCisKKyAgICBUYWcgZ2V0UGFyZW50KCk7CisKKworICAgIC8vIEFjdGlvbnMgZm9yIGJhc2ljIHN0YXJ0L2VuZCBwcm9jZXNzaW5nLgorCisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBzdGFydCB0YWcgZm9yIHRoaXMgaW5zdGFuY2UuCisgICAgICogVGhpcyBtZXRob2QgaXMgaW52b2tlZCBieSB0aGUgSlNQIHBhZ2UgaW1wbGVtZW50YXRpb24gb2JqZWN0LgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhlIGRvU3RhcnRUYWcgbWV0aG9kIGFzc3VtZXMgdGhhdCB0aGUgcHJvcGVydGllcyBwYWdlQ29udGV4dCBhbmQKKyAgICAgKiBwYXJlbnQgaGF2ZSBiZWVuIHNldC4gSXQgYWxzbyBhc3N1bWVzIHRoYXQgYW55IHByb3BlcnRpZXMgZXhwb3NlZCBhcworICAgICAqIGF0dHJpYnV0ZXMgaGF2ZSBiZWVuIHNldCB0b28uICBXaGVuIHRoaXMgbWV0aG9kIGlzIGludm9rZWQsIHRoZSBib2R5CisgICAgICogaGFzIG5vdCB5ZXQgYmVlbiBldmFsdWF0ZWQuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIFRhZy5FVkFMX0JPRFlfSU5DTFVERSBvcgorICAgICAqIEJvZHlUYWcuRVZBTF9CT0RZX0JVRkZFUkVEIHRvIGluZGljYXRlCisgICAgICogdGhhdCB0aGUgYm9keSBvZiB0aGUgYWN0aW9uIHNob3VsZCBiZSBldmFsdWF0ZWQgb3IgU0tJUF9CT0RZIHRvCisgICAgICogaW5kaWNhdGUgb3RoZXJ3aXNlLgorICAgICAqCisgICAgICogPHA+CisgICAgICogV2hlbiBhIFRhZyByZXR1cm5zIEVWQUxfQk9EWV9JTkNMVURFIHRoZSByZXN1bHQgb2YgZXZhbHVhdGluZworICAgICAqIHRoZSBib2R5IChpZiBhbnkpIGlzIGluY2x1ZGVkIGludG8gdGhlIGN1cnJlbnQgIm91dCIgSnNwV3JpdGVyIGFzIGl0CisgICAgICogaGFwcGVucyBhbmQgdGhlbiBkb0VuZFRhZygpIGlzIGludm9rZWQuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBCb2R5VGFnLkVWQUxfQk9EWV9CVUZGRVJFRCBpcyBvbmx5IHZhbGlkICBpZiB0aGUgdGFnIGhhbmRsZXIKKyAgICAgKiBpbXBsZW1lbnRzIEJvZHlUYWcuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgSlNQIGNvbnRhaW5lciB3aWxsIHJlc3luY2hyb25pemUgdGhlIHZhbHVlcyBvZiBhbnkgQVRfQkVHSU4gYW5kCisgICAgICogTkVTVEVEIHZhcmlhYmxlcyAoZGVmaW5lZCBieSB0aGUgYXNzb2NpYXRlZCBUYWdFeHRyYUluZm8gb3IgVExEKQorICAgICAqIGFmdGVyIHRoZSBpbnZvY2F0aW9uIG9mIGRvU3RhcnRUYWcoKSwgZXhjZXB0IGZvciBhIHRhZyBoYW5kbGVyCisgICAgICogaW1wbGVtZW50aW5nIEJvZHlUYWcgd2hvc2UgZG9TdGFydFRhZygpIG1ldGhvZCByZXR1cm5zCisgICAgICogQm9keVRhZy5FVkFMX0JPRFlfQlVGRkVSRUQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEVWQUxfQk9EWV9JTkNMVURFIGlmIHRoZSB0YWcgd2FudHMgdG8gcHJvY2VzcyBib2R5LCBTS0lQX0JPRFkgCisgICAgICogICAgIGlmIGl0IGRvZXMgbm90IHdhbnQgdG8gcHJvY2VzcyBpdC4KKyAgICAgKiBAdGhyb3dzIEpzcEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBwcm9jZXNzaW5nIHRoaXMgdGFnCisgICAgICogQHNlZSBCb2R5VGFnCisgICAgICovCisgCisgICAgaW50IGRvU3RhcnRUYWcoKSB0aHJvd3MgSnNwRXhjZXB0aW9uOworIAorCisgICAgLyoqCisgICAgICogUHJvY2VzcyB0aGUgZW5kIHRhZyBmb3IgdGhpcyBpbnN0YW5jZS4KKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBpbnZva2VkIGJ5IHRoZSBKU1AgcGFnZSBpbXBsZW1lbnRhdGlvbiBvYmplY3QKKyAgICAgKiBvbiBhbGwgVGFnIGhhbmRsZXJzLgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgYWZ0ZXIgcmV0dXJuaW5nIGZyb20gZG9TdGFydFRhZy4gVGhlCisgICAgICogYm9keSBvZiB0aGUgYWN0aW9uIG1heSBvciBtYXkgbm90IGhhdmUgYmVlbiBldmFsdWF0ZWQsIGRlcGVuZGluZyBvbgorICAgICAqIHRoZSByZXR1cm4gdmFsdWUgb2YgZG9TdGFydFRhZy4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIElmIHRoaXMgbWV0aG9kIHJldHVybnMgRVZBTF9QQUdFLCB0aGUgcmVzdCBvZiB0aGUgcGFnZSBjb250aW51ZXMKKyAgICAgKiB0byBiZSBldmFsdWF0ZWQuICBJZiB0aGlzIG1ldGhvZCByZXR1cm5zIFNLSVBfUEFHRSwgdGhlIHJlc3Qgb2YKKyAgICAgKiB0aGUgcGFnZSBpcyBub3QgZXZhbHVhdGVkLCB0aGUgcmVxdWVzdCBpcyBjb21wbGV0ZWQsIGFuZCAKKyAgICAgKiB0aGUgZG9FbmRUYWcoKSBtZXRob2RzIG9mIGVuY2xvc2luZyB0YWdzIGFyZSBub3QgaW52b2tlZC4gIElmIHRoaXMKKyAgICAgKiByZXF1ZXN0IHdhcyBmb3J3YXJkZWQgb3IgaW5jbHVkZWQgZnJvbSBhbm90aGVyIHBhZ2UgKG9yIFNlcnZsZXQpLAorICAgICAqIG9ubHkgdGhlIGN1cnJlbnQgcGFnZSBldmFsdWF0aW9uIGlzIHN0b3BwZWQuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgSlNQIGNvbnRhaW5lciB3aWxsIHJlc3luY2hyb25pemUgdGhlIHZhbHVlcyBvZiBhbnkgQVRfQkVHSU4gYW5kCisgICAgICogQVRfRU5EIHZhcmlhYmxlcyAoZGVmaW5lZCBieSB0aGUgYXNzb2NpYXRlZCBUYWdFeHRyYUluZm8gb3IgVExEKQorICAgICAqIGFmdGVyIHRoZSBpbnZvY2F0aW9uIG9mIGRvRW5kVGFnKCkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGluZGljYXRpb24gb2Ygd2hldGhlciB0byBjb250aW51ZSBldmFsdWF0aW5nIHRoZSBKU1AgcGFnZS4KKyAgICAgKiBAdGhyb3dzIEpzcEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBwcm9jZXNzaW5nIHRoaXMgdGFnCisgICAgICovCisKKyAgICBpbnQgZG9FbmRUYWcoKSB0aHJvd3MgSnNwRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogQ2FsbGVkIG9uIGEgVGFnIGhhbmRsZXIgdG8gcmVsZWFzZSBzdGF0ZS4KKyAgICAgKiBUaGUgcGFnZSBjb21waWxlciBndWFyYW50ZWVzIHRoYXQgSlNQIHBhZ2UgaW1wbGVtZW50YXRpb24KKyAgICAgKiBvYmplY3RzIHdpbGwgaW52b2tlIHRoaXMgbWV0aG9kIG9uIGFsbCB0YWcgaGFuZGxlcnMsCisgICAgICogYnV0IHRoZXJlIG1heSBiZSBtdWx0aXBsZSBpbnZvY2F0aW9ucyBvbiBkb1N0YXJ0VGFnIGFuZCBkb0VuZFRhZyBpbiBiZXR3ZWVuLgorICAgICAqLworCisgICAgdm9pZCByZWxlYXNlKCk7CisKK30KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC90YWdleHQvVGFnQWRhcHRlci5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL3RhZ2V4dC9UYWdBZGFwdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDMyNWY5MwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC90YWdleHQvVGFnQWRhcHRlci5qYXZhCkBAIC0wLDAgKzEsMTU4IEBACisvKgorKiBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisgCitwYWNrYWdlIGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dDsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLio7CisKKworLyoqCisgKiBXcmFwcyBhbnkgU2ltcGxlVGFnIGFuZCBleHBvc2VzIGl0IHVzaW5nIGEgVGFnIGludGVyZmFjZS4gIFRoaXMgaXMgdXNlZAorICogdG8gYWxsb3cgY29sbGFib3JhdGlvbiBiZXR3ZWVuIGNsYXNzaWMgVGFnIGhhbmRsZXJzIGFuZCBTaW1wbGVUYWcKKyAqIGhhbmRsZXJzLgorICogPHA+CisgKiBCZWNhdXNlIFNpbXBsZVRhZyBkb2VzIG5vdCBleHRlbmQgVGFnLCBhbmQgYmVjYXVzZSBUYWcuc2V0UGFyZW50KCkKKyAqIG9ubHkgYWNjZXB0cyBhIFRhZyBpbnN0YW5jZSwgYSBjbGFzc2ljIHRhZyBoYW5kbGVyIChvbmUKKyAqIHRoYXQgaW1wbGVtZW50cyBUYWcpIGNhbm5vdCBoYXZlIGEgU2ltcGxlVGFnIGFzIGl0cyBwYXJlbnQuICBUbyByZW1lZHkKKyAqIHRoaXMsIGEgVGFnQWRhcHRlciBpcyBjcmVhdGVkIHRvIHdyYXAgdGhlIFNpbXBsZVRhZyBwYXJlbnQsIGFuZCB0aGUKKyAqIGFkYXB0ZXIgaXMgcGFzc2VkIHRvIHNldFBhcmVudCgpIGluc3RlYWQuICBBIGNsYXNzaWMgVGFnIEhhbmRsZXIgY2FuCisgKiBjYWxsIGdldEFkYXB0ZWUoKSB0byByZXRyaWV2ZSB0aGUgZW5jYXBzdWxhdGVkIFNpbXBsZVRhZyBpbnN0YW5jZS4KKyAqCisgKiBAc2luY2UgMi4wCisgKi8KK3B1YmxpYyBjbGFzcyBUYWdBZGFwdGVyIAorICAgIGltcGxlbWVudHMgVGFnCit7CisgICAgLyoqIFRoZSBzaW1wbGUgdGFnIHRoYXQncyBiZWluZyBhZGFwdGVkLiAqLworICAgIHByaXZhdGUgU2ltcGxlVGFnIHNpbXBsZVRhZ0FkYXB0ZWU7CisKKyAgICAvKiogVGhlIHBhcmVudCwgb2YgdGhpcyB0YWcsIGNvbnZlcnRlZCAoaWYgbmVjZXNzYXJ5KSB0byBiZSBvZiB0eXBlIFRhZy4gKi8KKyAgICBwcml2YXRlIFRhZyBwYXJlbnQ7CisKKyAgICAvLyBGbGFnIGluZGljYXRpbmcgd2hldGhlciB3ZSBoYXZlIGFscmVhZHkgZGV0ZXJtaW5lZCB0aGUgcGFyZW50CisgICAgcHJpdmF0ZSBib29sZWFuIHBhcmVudERldGVybWluZWQ7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IFRhZ0FkYXB0ZXIgdGhhdCB3cmFwcyB0aGUgZ2l2ZW4gU2ltcGxlVGFnIGFuZCAKKyAgICAgKiByZXR1cm5zIHRoZSBwYXJlbnQgdGFnIHdoZW4gZ2V0UGFyZW50KCkgaXMgY2FsbGVkLgorICAgICAqCisgICAgICogQHBhcmFtIGFkYXB0ZWUgVGhlIFNpbXBsZVRhZyBiZWluZyBhZGFwdGVkIGFzIGEgVGFnLgorICAgICAqLworICAgIHB1YmxpYyBUYWdBZGFwdGVyKCBTaW1wbGVUYWcgYWRhcHRlZSApIHsKKyAgICAgICAgaWYoIGFkYXB0ZWUgPT0gbnVsbCApIHsKKwkgICAgLy8gQ2Fubm90IHdyYXAgYSBudWxsIGFkYXB0ZWUuCisJICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLnNpbXBsZVRhZ0FkYXB0ZWUgPSBhZGFwdGVlOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBNdXN0IG5vdCBiZSBjYWxsZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGMgaWdub3JlZC4KKyAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIE11c3Qgbm90IGJlIGNhbGxlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhZ2VDb250ZXh0KFBhZ2VDb250ZXh0IHBjKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiggCisgICAgICAgICAgICAiSWxsZWdhbCB0byBpbnZva2Ugc2V0UGFnZUNvbnRleHQoKSBvbiBUYWdBZGFwdGVyIHdyYXBwZXIiICk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBNdXN0IG5vdCBiZSBjYWxsZWQuICBUaGUgcGFyZW50IG9mIHRoaXMgdGFnIGlzIGFsd2F5cyAKKyAgICAgKiBnZXRBZGFwdGVlKCkuZ2V0UGFyZW50KCkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyZW50VGFnIGlnbm9yZWQuCisgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBNdXN0IG5vdCBiZSBjYWxsZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGFyZW50KCBUYWcgcGFyZW50VGFnICkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIAorICAgICAgICAgICAgIklsbGVnYWwgdG8gaW52b2tlIHNldFBhcmVudCgpIG9uIFRhZ0FkYXB0ZXIgd3JhcHBlciIgKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHBhcmVudCBvZiB0aGlzIHRhZywgd2hpY2ggaXMgYWx3YXlzCisgICAgICogZ2V0QWRhcHRlZSgpLmdldFBhcmVudCgpLiAgCisgICAgICoKKyAgICAgKiBUaGlzIHdpbGwgZWl0aGVyIGJlIHRoZSBlbmNsb3NpbmcgVGFnIChpZiBnZXRBZGFwdGVlKCkuZ2V0UGFyZW50KCkKKyAgICAgKiBpbXBsZW1lbnRzIFRhZyksIG9yIGFuIGFkYXB0ZXIgdG8gdGhlIGVuY2xvc2luZyBUYWcgKGlmIAorICAgICAqIGdldEFkYXB0ZWUoKS5nZXRQYXJlbnQoKSBkb2VzIG5vdCBpbXBsZW1lbnQgVGFnKS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIHBhcmVudCBvZiB0aGUgdGFnIGJlaW5nIGFkYXB0ZWQuCisgICAgICovCisgICAgcHVibGljIFRhZyBnZXRQYXJlbnQoKSB7CisJaWYgKCFwYXJlbnREZXRlcm1pbmVkKSB7CisJICAgIEpzcFRhZyBhZGFwdGVlUGFyZW50ID0gc2ltcGxlVGFnQWRhcHRlZS5nZXRQYXJlbnQoKTsKKwkgICAgaWYgKGFkYXB0ZWVQYXJlbnQgIT0gbnVsbCkgeworCQlpZiAoYWRhcHRlZVBhcmVudCBpbnN0YW5jZW9mIFRhZykgeworCQkgICAgdGhpcy5wYXJlbnQgPSAoVGFnKSBhZGFwdGVlUGFyZW50OworCQl9IGVsc2UgeworCQkgICAgLy8gTXVzdCBiZSBTaW1wbGVUYWcgLSBubyBvdGhlciB0eXBlcyBkZWZpbmVkLgorCQkgICAgdGhpcy5wYXJlbnQgPSBuZXcgVGFnQWRhcHRlcigoU2ltcGxlVGFnKSBhZGFwdGVlUGFyZW50KTsKKwkJfQorCSAgICB9CisJICAgIHBhcmVudERldGVybWluZWQgPSB0cnVlOworCX0KKworCXJldHVybiB0aGlzLnBhcmVudDsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdGFnIHRoYXQgaXMgYmVpbmcgYWRhcHRlZCB0byB0aGUgVGFnIGludGVyZmFjZS4KKyAgICAgKiBUaGlzIHNob3VsZCBiZSBhbiBpbnN0YW5jZSBvZiBTaW1wbGVUYWcgaW4gSlNQIDIuMCwgYnV0IHJvb20KKyAgICAgKiBpcyBsZWZ0IGZvciBvdGhlciBraW5kcyBvZiB0YWdzIGluIGZ1dHVyZSBzcGVjIHZlcnNpb25zLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgdGFnIHRoYXQgaXMgYmVpbmcgYWRhcHRlZAorICAgICAqLworICAgIHB1YmxpYyBKc3BUYWcgZ2V0QWRhcHRlZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuc2ltcGxlVGFnQWRhcHRlZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNdXN0IG5vdCBiZSBjYWxsZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGFsd2F5cyB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIE11c3Qgbm90IGJlIGNhbGxlZAorICAgICAqIEB0aHJvd3MgSnNwRXhjZXB0aW9uIG5ldmVyIHRocm93bgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZG9TdGFydFRhZygpIHRocm93cyBKc3BFeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIAorICAgICAgICAgICAgIklsbGVnYWwgdG8gaW52b2tlIGRvU3RhcnRUYWcoKSBvbiBUYWdBZGFwdGVyIHdyYXBwZXIiICk7CisgICAgfQorIAorICAgIC8qKgorICAgICAqIE11c3Qgbm90IGJlIGNhbGxlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYWx3YXlzIHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gTXVzdCBub3QgYmUgY2FsbGVkCisgICAgICogQHRocm93cyBKc3BFeGNlcHRpb24gbmV2ZXIgdGhyb3duCisgICAgICovCisgICAgcHVibGljIGludCBkb0VuZFRhZygpIHRocm93cyBKc3BFeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIAorICAgICAgICAgICAgIklsbGVnYWwgdG8gaW52b2tlIGRvRW5kVGFnKCkgb24gVGFnQWRhcHRlciB3cmFwcGVyIiApOworICAgIH0KKworICAgIC8qKgorICAgICAqIE11c3Qgbm90IGJlIGNhbGxlZC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gTXVzdCBub3QgYmUgY2FsbGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCAKKyAgICAgICAgICAgICJJbGxlZ2FsIHRvIGludm9rZSByZWxlYXNlKCkgb24gVGFnQWRhcHRlciB3cmFwcGVyIiApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC90YWdleHQvVGFnQXR0cmlidXRlSW5mby5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL3RhZ2V4dC9UYWdBdHRyaWJ1dGVJbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE0ZjdkMwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC90YWdleHQvVGFnQXR0cmlidXRlSW5mby5qYXZhCkBAIC0wLDAgKzEsMTc3IEBACisvKgorKiBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyAKK3BhY2thZ2UgamF2YXguc2VydmxldC5qc3AudGFnZXh0OworCisvKioKKyAqIEluZm9ybWF0aW9uIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIGEgVGFnLCBhdmFpbGFibGUgYXQgdHJhbnNsYXRpb24gdGltZS4KKyAqIFRoaXMgY2xhc3MgaXMgaW5zdGFudGlhdGVkIGZyb20gdGhlIFRhZyBMaWJyYXJ5IERlc2NyaXB0b3IgZmlsZSAoVExEKS4KKyAqCisgKiA8cD4KKyAqIE9ubHkgdGhlIGluZm9ybWF0aW9uIG5lZWRlZCB0byBnZW5lcmF0ZSBjb2RlIGlzIGluY2x1ZGVkIGhlcmUuICBPdGhlciBpbmZvcm1hdGlvbgorICogbGlrZSBTQ0hFTUEgZm9yIHZhbGlkYXRpb24gYmVsb25ncyBlbHNld2hlcmUuCisgKi8KKworcHVibGljIGNsYXNzIFRhZ0F0dHJpYnV0ZUluZm8geworICAgIC8qKgorICAgICAqICJpZCIgaXMgd2lyZWQgaW4gdG8gYmUgSUQuICBUaGVyZSBpcyBubyByZWFsIGJlbmVmaXQgaW4gaGF2aW5nIGl0IGJlIHNvbWV0aGluZyBlbHNlCisgICAgICogSURSRUZzIGFyZSBub3QgaGFuZGxlZCBhbnkgZGlmZmVyZW50bHkuCisgICAgICovCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJpZCI7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgVGFnQXR0cmlidXRlSW5mby4KKyAgICAgKiBUaGlzIGNsYXNzIGlzIHRvIGJlIGluc3RhbnRpYXRlZCBvbmx5IGZyb20gdGhlCisgICAgICogVGFnTGlicmFyeSBjb2RlIHVuZGVyIHJlcXVlc3QgZnJvbSBzb21lIEpTUCBjb2RlIHRoYXQgaXMgcGFyc2luZyBhCisgICAgICogVExEIChUYWcgTGlicmFyeSBEZXNjcmlwdG9yKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUuCisgICAgICogQHBhcmFtIHJlcXVpcmVkIElmIHRoaXMgYXR0cmlidXRlIGlzIHJlcXVpcmVkIGluIHRhZyBpbnN0YW5jZXMuCisgICAgICogQHBhcmFtIHR5cGUgVGhlIG5hbWUgb2YgdGhlIHR5cGUgb2YgdGhlIGF0dHJpYnV0ZS4KKyAgICAgKiBAcGFyYW0gcmVxVGltZSBXaGV0aGVyIHRoaXMgYXR0cmlidXRlIGhvbGRzIGEgcmVxdWVzdC10aW1lIEF0dHJpYnV0ZS4KKyAgICAgKi8KKworICAgIHB1YmxpYyBUYWdBdHRyaWJ1dGVJbmZvKFN0cmluZyBuYW1lLCBib29sZWFuIHJlcXVpcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0eXBlLCBib29sZWFuIHJlcVRpbWUpCisgICAgeworCXRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMucmVxdWlyZWQgPSByZXF1aXJlZDsKKyAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKwl0aGlzLnJlcVRpbWUgPSByZXFUaW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIEpTUCAyLjAgQ29uc3RydWN0b3IgZm9yIFRhZ0F0dHJpYnV0ZUluZm8uCisgICAgICogVGhpcyBjbGFzcyBpcyB0byBiZSBpbnN0YW50aWF0ZWQgb25seSBmcm9tIHRoZQorICAgICAqIFRhZ0xpYnJhcnkgY29kZSB1bmRlciByZXF1ZXN0IGZyb20gc29tZSBKU1AgY29kZSB0aGF0IGlzIHBhcnNpbmcgYQorICAgICAqIFRMRCAoVGFnIExpYnJhcnkgRGVzY3JpcHRvcikuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlLgorICAgICAqIEBwYXJhbSByZXF1aXJlZCBJZiB0aGlzIGF0dHJpYnV0ZSBpcyByZXF1aXJlZCBpbiB0YWcgaW5zdGFuY2VzLgorICAgICAqIEBwYXJhbSB0eXBlIFRoZSBuYW1lIG9mIHRoZSB0eXBlIG9mIHRoZSBhdHRyaWJ1dGUuCisgICAgICogQHBhcmFtIHJlcVRpbWUgV2hldGhlciB0aGlzIGF0dHJpYnV0ZSBob2xkcyBhIHJlcXVlc3QtdGltZSBBdHRyaWJ1dGUuCisgICAgICogQHBhcmFtIGZyYWdtZW50IFdoZXRoZXIgdGhpcyBhdHRyaWJ1dGUgaXMgb2YgdHlwZSBKc3BGcmFnbWVudAorICAgICAqCisgICAgICogQHNpbmNlIDIuMAorICAgICAqLworCisgICAgcHVibGljIFRhZ0F0dHJpYnV0ZUluZm8oU3RyaW5nIG5hbWUsIGJvb2xlYW4gcmVxdWlyZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHR5cGUsIGJvb2xlYW4gcmVxVGltZSwKKwkJCSAgICBib29sZWFuIGZyYWdtZW50KQorICAgIHsKKwl0aGlzKCBuYW1lLCByZXF1aXJlZCwgdHlwZSwgcmVxVGltZSApOworCXRoaXMuZnJhZ21lbnQgPSBmcmFnbWVudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgbmFtZSBvZiB0aGlzIGF0dHJpYnV0ZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZQorICAgICAqLworCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCXJldHVybiBuYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSB0eXBlIChhcyBhIFN0cmluZykgb2YgdGhpcyBhdHRyaWJ1dGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSB0eXBlIG9mIHRoZSBhdHRyaWJ1dGUKKyAgICAgKi8KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7CisJcmV0dXJuIHR5cGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciB0aGlzIGF0dHJpYnV0ZSBjYW4gaG9sZCBhIHJlcXVlc3QtdGltZSB2YWx1ZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gaWYgdGhlIGF0dHJpYnV0ZSBjYW4gaG9sZCBhIHJlcXVlc3QtdGltZSB2YWx1ZS4KKyAgICAgKi8KKworICAgIHB1YmxpYyBib29sZWFuIGNhbkJlUmVxdWVzdFRpbWUoKSB7CisJcmV0dXJuIHJlcVRpbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciB0aGlzIGF0dHJpYnV0ZSBpcyByZXF1aXJlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gaWYgdGhlIGF0dHJpYnV0ZSBpcyByZXF1aXJlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JlcXVpcmVkKCkgeworICAgICAgICByZXR1cm4gcmVxdWlyZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVuaWVuY2Ugc3RhdGljIG1ldGhvZCB0aGF0IGdvZXMgdGhyb3VnaCBhbiBhcnJheSBvZiBUYWdBdHRyaWJ1dGVJbmZvCisgICAgICogb2JqZWN0cyBhbmQgbG9va3MgZm9yICJpZCIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYSBBbiBhcnJheSBvZiBUYWdBdHRyaWJ1dGVJbmZvCisgICAgICogQHJldHVybiBUaGUgVGFnQXR0cmlidXRlSW5mbyByZWZlcmVuY2Ugd2l0aCBuYW1lICJpZCIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFRhZ0F0dHJpYnV0ZUluZm8gZ2V0SWRBdHRyaWJ1dGUoVGFnQXR0cmlidXRlSW5mbyBhW10pIHsKKwlmb3IgKGludCBpPTA7IGk8YS5sZW5ndGg7IGkrKykgeworCSAgICBpZiAoYVtpXS5nZXROYW1lKCkuZXF1YWxzKElEKSkgeworCQlyZXR1cm4gYVtpXTsKKwkgICAgfQorCX0KKwlyZXR1cm4gbnVsbDsJCS8vIG5vIHN1Y2ggYXR0cmlidXRlCisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciB0aGlzIGF0dHJpYnV0ZSBpcyBvZiB0eXBlIEpzcEZyYWdtZW50LgorICAgICAqCisgICAgICogQHJldHVybiBpZiB0aGUgYXR0cmlidXRlIGlzIG9mIHR5cGUgSnNwRnJhZ21lbnQKKyAgICAgKgorICAgICAqIEBzaW5jZSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0ZyYWdtZW50KCkgeworCXJldHVybiBmcmFnbWVudDsKKyAgICB9CisKKworICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgYSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBUYWdBdHRyaWJ1dGVJbmZvLCBzdWl0YWJsZQorICAgICAqIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgVGFnQXR0cmlidXRlSW5mbworICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBiLmFwcGVuZCgibmFtZSA9ICIrbmFtZSsiICIpOworICAgICAgICBiLmFwcGVuZCgidHlwZSA9ICIrdHlwZSsiICIpOworCWIuYXBwZW5kKCJyZXFUaW1lID0gIityZXFUaW1lKyIgIik7CisgICAgICAgIGIuYXBwZW5kKCJyZXF1aXJlZCA9ICIrcmVxdWlyZWQrIiAiKTsKKyAgICAgICAgYi5hcHBlbmQoImZyYWdtZW50ID0gIitmcmFnbWVudCsiICIpOworICAgICAgICByZXR1cm4gYi50b1N0cmluZygpOworICAgIH0KKworICAgIC8qCisgICAgICogcHJpdmF0ZSBmaWVsZHMKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBuYW1lOworICAgIHByaXZhdGUgU3RyaW5nIHR5cGU7CisgICAgcHJpdmF0ZSBib29sZWFuIHJlcVRpbWU7CisgICAgcHJpdmF0ZSBib29sZWFuIHJlcXVpcmVkOworCisgICAgLyoKKyAgICAgKiBwcml2YXRlIGZpZWxkcyBmb3IgSlNQIDIuMAorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBmcmFnbWVudDsKK30KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC90YWdleHQvVGFnRGF0YS5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL3RhZ2V4dC9UYWdEYXRhLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTgwMDNlYQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC90YWdleHQvVGFnRGF0YS5qYXZhCkBAIC0wLDAgKzEsMTUzIEBACisvKgorKiBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK3BhY2thZ2UgamF2YXguc2VydmxldC5qc3AudGFnZXh0OworCitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKKworLyoqCisgKiBUaGUgKHRyYW5zbGF0aW9uLXRpbWUgb25seSkgYXR0cmlidXRlL3ZhbHVlIGluZm9ybWF0aW9uIGZvciBhIHRhZyBpbnN0YW5jZS4KKyAqCisgKiA8cD4KKyAqIFRhZ0RhdGEgaXMgb25seSB1c2VkIGFzIGFuIGFyZ3VtZW50IHRvIHRoZSBpc1ZhbGlkLCB2YWxpZGF0ZSwgYW5kIAorICogZ2V0VmFyaWFibGVJbmZvIG1ldGhvZHMgb2YgVGFnRXh0cmFJbmZvLCB3aGljaCBhcmUgaW52b2tlZCBhdCAKKyAqIHRyYW5zbGF0aW9uIHRpbWUuCisgKi8KKworcHVibGljIGNsYXNzIFRhZ0RhdGEgaW1wbGVtZW50cyBDbG9uZWFibGUgeworCisgICAgLyoqCisgICAgICogRGlzdGluZ3Vpc2hlZCB2YWx1ZSBmb3IgYW4gYXR0cmlidXRlIHRvIGluZGljYXRlIGl0cyB2YWx1ZQorICAgICAqIGlzIGEgcmVxdWVzdC10aW1lIGV4cHJlc3Npb24gKHdoaWNoIGlzIG5vdCB5ZXQgYXZhaWxhYmxlIGJlY2F1c2UKKyAgICAgKiBUYWdEYXRhIGluc3RhbmNlcyBhcmUgdXNlZCBhdCB0cmFuc2xhdGlvbi10aW1lKS4KKyAgICAgKi8KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IFJFUVVFU1RfVElNRV9WQUxVRSA9IG5ldyBPYmplY3QoKTsKKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIFRhZ0RhdGEuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBBIHR5cGljYWwgY29uc3RydWN0b3IgbWF5IGJlCisgICAgICogPHByZT4KKyAgICAgKiBzdGF0aWMgZmluYWwgT2JqZWN0W11bXSBhdHQgPSB7eyJjb25uZWN0aW9uIiwgImNvbm4wIn0sIHsiaWQiLCAicXVlcnkwIn19OworICAgICAqIHN0YXRpYyBmaW5hbCBUYWdEYXRhIHRkID0gbmV3IFRhZ0RhdGEoYXR0KTsKKyAgICAgKiA8L3ByZT4KKyAgICAgKgorICAgICAqIEFsbCB2YWx1ZXMgbXVzdCBiZSBTdHJpbmdzIGV4Y2VwdCBmb3IgdGhvc2UgaG9sZGluZyB0aGUKKyAgICAgKiBkaXN0aW5ndWlzaGVkIG9iamVjdCBSRVFVRVNUX1RJTUVfVkFMVUUuCisKKyAgICAgKiBAcGFyYW0gYXR0cyB0aGUgc3RhdGljIGF0dHJpYnV0ZSBhbmQgdmFsdWVzLiAgTWF5IGJlIG51bGwuCisgICAgICovCisgICAgcHVibGljIFRhZ0RhdGEoT2JqZWN0W10gYXR0c1tdKSB7CisJaWYgKGF0dHMgPT0gbnVsbCkgeworCSAgICBhdHRyaWJ1dGVzID0gbmV3IEhhc2h0YWJsZSgpOworCX0gZWxzZSB7CisJICAgIGF0dHJpYnV0ZXMgPSBuZXcgSGFzaHRhYmxlKGF0dHMubGVuZ3RoKTsKKwl9CisKKwlpZiAoYXR0cyAhPSBudWxsKSB7CisJICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cy5sZW5ndGg7IGkrKykgeworCQlhdHRyaWJ1dGVzLnB1dChhdHRzW2ldWzBdLCBhdHRzW2ldWzFdKTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgYSBUYWdEYXRhLgorICAgICAqCisgICAgICogSWYgeW91IGFscmVhZHkgaGF2ZSB0aGUgYXR0cmlidXRlcyBpbiBhIGhhc2h0YWJsZSwgdXNlIHRoaXMKKyAgICAgKiBjb25zdHJ1Y3Rvci4gCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXR0cnMgQSBoYXNodGFibGUgdG8gZ2V0IHRoZSB2YWx1ZXMgZnJvbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgVGFnRGF0YShIYXNodGFibGUgYXR0cnMpIHsKKyAgICAgICAgdGhpcy5hdHRyaWJ1dGVzID0gYXR0cnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHZhbHVlIG9mIHRoZSB0YWcncyBpZCBhdHRyaWJ1dGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgdGFnJ3MgaWQgYXR0cmlidXRlLCBvciBudWxsIGlmIG5vIHN1Y2gKKyAgICAgKiAgICAgYXR0cmlidXRlIHdhcyBzcGVjaWZpZWQuCisgICAgICovCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkgeworCXJldHVybiBnZXRBdHRyaWJ1dGVTdHJpbmcoVGFnQXR0cmlidXRlSW5mby5JRCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUuCisgICAgICogSWYgYSBzdGF0aWMgdmFsdWUgaXMgc3BlY2lmaWVkIGZvciBhbiBhdHRyaWJ1dGUgdGhhdCBhY2NlcHRzIGEKKyAgICAgKiByZXF1ZXN0LXRpbWUgYXR0cmlidXRlIGV4cHJlc3Npb24gdGhlbiB0aGF0IHN0YXRpYyB2YWx1ZSBpcyByZXR1cm5lZCwKKyAgICAgKiBldmVuIGlmIHRoZSB2YWx1ZSBpcyBwcm92aWRlZCBpbiB0aGUgYm9keSBvZiBhIDxqc3A6YXR0cmlidXRlPiBhY3Rpb24uCisgICAgICogVGhlIGRpc3Rpbmd1aXNoZWQgb2JqZWN0IFJFUVVFU1RfVElNRV9WQUxVRSBpcyBvbmx5IHJldHVybmVkIGlmCisgICAgICogdGhlIHZhbHVlIGlzIHNwZWNpZmllZCBhcyBhIHJlcXVlc3QtdGltZSBhdHRyaWJ1dGUgZXhwcmVzc2lvbgorICAgICAqIG9yIHZpYSB0aGUgJmx0O2pzcDphdHRyaWJ1dGUmZ3Q7IGFjdGlvbiB3aXRoIGEgYm9keSB0aGF0IGNvbnRhaW5zCisgICAgICogZHluYW1pYyBjb250ZW50IChzY3JpcHRsZXRzLCBzY3JpcHRpbmcgZXhwcmVzc2lvbnMsIEVMIGV4cHJlc3Npb25zLCAKKyAgICAgKiBzdGFuZGFyZCBhY3Rpb25zLCBvciBjdXN0b20gYWN0aW9ucykuICBSZXR1cm5zIG51bGwgaWYgdGhlIGF0dHJpYnV0ZSAKKyAgICAgKiBpcyBub3Qgc2V0LiAKKyAgICAgKgorICAgICAqIEBwYXJhbSBhdHROYW1lIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUKKyAgICAgKiBAcmV0dXJuIHRoZSBhdHRyaWJ1dGUncyB2YWx1ZQorICAgICAqLworCisgICAgcHVibGljIE9iamVjdCBnZXRBdHRyaWJ1dGUoU3RyaW5nIGF0dE5hbWUpIHsKKwlyZXR1cm4gYXR0cmlidXRlcy5nZXQoYXR0TmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSB2YWx1ZSBvZiBhbiBhdHRyaWJ1dGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXR0TmFtZSB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlCisgICAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIGF0dE5hbWUsCisJCQkgICAgIE9iamVjdCB2YWx1ZSkgeworCWF0dHJpYnV0ZXMucHV0KGF0dE5hbWUsIHZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHZhbHVlIGZvciBhIGdpdmVuIGF0dHJpYnV0ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhdHROYW1lIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUKKyAgICAgKiBAcmV0dXJuIHRoZSBhdHRyaWJ1dGUgdmFsdWUgc3RyaW5nCisgICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24gaWYgYXR0cmlidXRlIHZhbHVlIGlzIG5vdCBhIFN0cmluZworICAgICAqLworCisgICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVTdHJpbmcoU3RyaW5nIGF0dE5hbWUpIHsKKwlPYmplY3QgbyA9IGF0dHJpYnV0ZXMuZ2V0KGF0dE5hbWUpOworCWlmIChvID09IG51bGwpIHsKKwkgICAgcmV0dXJuIG51bGw7CisJfSBlbHNlIHsKKwkgICAgcmV0dXJuIChTdHJpbmcpIG87CisJfQkKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbnVtZXJhdGVzIHRoZSBhdHRyaWJ1dGVzLgorICAgICAqCisgICAgICpAcmV0dXJuIEFuIGVudW1lcmF0aW9uIG9mIHRoZSBhdHRyaWJ1dGVzIGluIGEgVGFnRGF0YQorICAgICAqLworICAgIHB1YmxpYyBqYXZhLnV0aWwuRW51bWVyYXRpb24gZ2V0QXR0cmlidXRlcygpIHsKKyAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZXMua2V5cygpOworICAgIH07CisKKyAgICAvLyBwcml2YXRlIGRhdGEKKworICAgIHByaXZhdGUgSGFzaHRhYmxlIGF0dHJpYnV0ZXM7CS8vIHRoZSB0YWduYW1lL3ZhbHVlIG1hcAorfQpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL3RhZ2V4dC9UYWdFeHRyYUluZm8uamF2YSBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC90YWdleHQvVGFnRXh0cmFJbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg4NThmMQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC90YWdleHQvVGFnRXh0cmFJbmZvLmphdmEKQEAgLTAsMCArMSwxNDMgQEAKKy8qCisqIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworIAorcGFja2FnZSBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQ7CisKKy8qKgorICogT3B0aW9uYWwgY2xhc3MgcHJvdmlkZWQgYnkgdGhlIHRhZyBsaWJyYXJ5IGF1dGhvciB0byBkZXNjcmliZSBhZGRpdGlvbmFsCisgKiB0cmFuc2xhdGlvbi10aW1lIGluZm9ybWF0aW9uIG5vdCBkZXNjcmliZWQgaW4gdGhlIFRMRC4KKyAqIFRoZSBUYWdFeHRyYUluZm8gY2xhc3MgaXMgbWVudGlvbmVkIGluIHRoZSBUYWcgTGlicmFyeSBEZXNjcmlwdG9yIGZpbGUgKFRMRCkuCisgKgorICogPHA+CisgKiBUaGlzIGNsYXNzIGNhbiBiZSB1c2VkOgorICogPHVsPgorICogPGxpPiB0byBpbmRpY2F0ZSB0aGF0IHRoZSB0YWcgZGVmaW5lcyBzY3JpcHRpbmcgdmFyaWFibGVzCisgKiA8bGk+IHRvIHBlcmZvcm0gdHJhbnNsYXRpb24tdGltZSB2YWxpZGF0aW9uIG9mIHRoZSB0YWcgYXR0cmlidXRlcy4KKyAqIDwvdWw+CisgKgorICogPHA+CisgKiBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIEpTUCB0cmFuc2xhdG9yIHRoYXQgdGhlIGluaXRpYWwgdmFsdWUKKyAqIHRvIGJlIHJldHVybmVkIGJ5IGNhbGxzIHRvIGdldFRhZ0luZm8oKSBjb3JyZXNwb25kcyB0byBhIFRhZ0luZm8KKyAqIG9iamVjdCBmb3IgdGhlIHRhZyBiZWluZyB0cmFuc2xhdGVkLiBJZiBhbiBleHBsaWNpdCBjYWxsIHRvCisgKiBzZXRUYWdJbmZvKCkgaXMgZG9uZSwgdGhlbiB0aGUgb2JqZWN0IHBhc3NlZCB3aWxsIGJlIHJldHVybmVkIGluCisgKiBzdWJzZXF1ZW50IGNhbGxzIHRvIGdldFRhZ0luZm8oKS4KKyAqIAorICogPHA+CisgKiBUaGUgb25seSB3YXkgdG8gYWZmZWN0IHRoZSB2YWx1ZSByZXR1cm5lZCBieSBnZXRUYWdJbmZvKCkKKyAqIGlzIHRocm91Z2ggYSBzZXRUYWdJbmZvKCkgY2FsbCwgYW5kIHRodXMsIFRhZ0V4dHJhSW5mby5zZXRUYWdJbmZvKCkgaXMKKyAqIHRvIGJlIGNhbGxlZCBieSB0aGUgSlNQIHRyYW5zbGF0b3IsIHdpdGggYSBUYWdJbmZvIG9iamVjdCB0aGF0CisgKiBjb3JyZXNwb25kcyB0byB0aGUgdGFnIGJlaW5nIHRyYW5zbGF0ZWQuIFRoZSBjYWxsIHNob3VsZCBoYXBwZW4gYmVmb3JlCisgKiBhbnkgaW52b2NhdGlvbiBvbiB2YWxpZGF0ZSgpIGFuZCBiZWZvcmUgYW55IGludm9jYXRpb24gb24KKyAqIGdldFZhcmlhYmxlSW5mbygpLgorICoKKyAqIDxwPgorICogPHR0Pk5PVEU6PC90dD4gSXQgaXMgYSAodHJhbnNsYXRpb24gdGltZSkgZXJyb3IgZm9yIGEgdGFnIGRlZmluaXRpb24KKyAqIGluIGEgVExEIHdpdGggb25lIG9yIG1vcmUgdmFyaWFibGUgc3ViZWxlbWVudHMgdG8gaGF2ZSBhbiBhc3NvY2lhdGVkCisgKiBUYWdFeHRyYUluZm8gaW1wbGVtZW50YXRpb24gdGhhdCByZXR1cm5zIGEgVmFyaWFibGVJbmZvIGFycmF5IHdpdGgKKyAqIG9uZSBvciBtb3JlIGVsZW1lbnRzIGZyb20gYSBjYWxsIHRvIGdldFZhcmlhYmxlSW5mbygpLgorICovCisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBUYWdFeHRyYUluZm8geworCisgICAgLyoqCisgICAgICogU29sZSBjb25zdHJ1Y3Rvci4gKEZvciBpbnZvY2F0aW9uIGJ5IHN1YmNsYXNzIGNvbnN0cnVjdG9ycywgCisgICAgICogdHlwaWNhbGx5IGltcGxpY2l0LikKKyAgICAgKi8KKyAgICBwdWJsaWMgVGFnRXh0cmFJbmZvKCkgeworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBpbmZvcm1hdGlvbiBvbiBzY3JpcHRpbmcgdmFyaWFibGVzIGRlZmluZWQgYnkgdGhlIHRhZyBhc3NvY2lhdGVkIHdpdGgKKyAgICAgKiB0aGlzIFRhZ0V4dHJhSW5mbyBpbnN0YW5jZS4KKyAgICAgKiBSZXF1ZXN0LXRpbWUgYXR0cmlidXRlcyBhcmUgaW5kaWNhdGVkIGFzIHN1Y2ggaW4gdGhlIFRhZ0RhdGEgcGFyYW1ldGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGRhdGEgVGhlIFRhZ0RhdGEgaW5zdGFuY2UuCisgICAgICogQHJldHVybiBBbiBhcnJheSBvZiBWYXJpYWJsZUluZm8gZGF0YSwgb3IgbnVsbCBvciBhIHplcm8gbGVuZ3RoIGFycmF5CisgICAgICogICAgICAgICBpZiBubyBzY3JpcHRpbmcgdmFyaWFibGVzIGFyZSB0byBiZSBkZWZpbmVkLgorICAgICAqLworICAgIHB1YmxpYyBWYXJpYWJsZUluZm9bXSBnZXRWYXJpYWJsZUluZm8oVGFnRGF0YSBkYXRhKSB7CisJcmV0dXJuIFpFUk9fVkFSSUFCTEVfSU5GTzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcmFuc2xhdGlvbi10aW1lIHZhbGlkYXRpb24gb2YgdGhlIGF0dHJpYnV0ZXMuIAorICAgICAqIFJlcXVlc3QtdGltZSBhdHRyaWJ1dGVzIGFyZSBpbmRpY2F0ZWQgYXMgc3VjaCBpbiB0aGUgVGFnRGF0YSBwYXJhbWV0ZXIuCisgICAgICogTm90ZSB0aGF0IHRoZSBwcmVmZXJyZWQgd2F5IHRvIGRvIHZhbGlkYXRpb24gaXMgd2l0aCB0aGUgdmFsaWRhdGUoKQorICAgICAqIG1ldGhvZCwgc2luY2UgaXQgY2FuIHJldHVybiBtb3JlIGRldGFpbGVkIGluZm9ybWF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGRhdGEgVGhlIFRhZ0RhdGEgaW5zdGFuY2UuCisgICAgICogQHJldHVybiBXaGV0aGVyIHRoaXMgdGFnIGluc3RhbmNlIGlzIHZhbGlkLgorICAgICAqIEBzZWUgVGFnRXh0cmFJbmZvI3ZhbGlkYXRlCisgICAgICovCisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKFRhZ0RhdGEgZGF0YSkgeworCXJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRyYW5zbGF0aW9uLXRpbWUgdmFsaWRhdGlvbiBvZiB0aGUgYXR0cmlidXRlcy4KKyAgICAgKiBSZXF1ZXN0LXRpbWUgYXR0cmlidXRlcyBhcmUgaW5kaWNhdGVkIGFzIHN1Y2ggaW4gdGhlIFRhZ0RhdGEgcGFyYW1ldGVyLgorICAgICAqIEJlY2F1c2Ugb2YgdGhlIGhpZ2hlciBxdWFsaXR5IHZhbGlkYXRpb24gbWVzc2FnZXMgcG9zc2libGUsIAorICAgICAqIHRoaXMgaXMgdGhlIHByZWZlcnJlZCB3YXkgdG8gZG8gdmFsaWRhdGlvbiAoYWx0aG91Z2ggaXNWYWxpZCgpIAorICAgICAqIHN0aWxsIHdvcmtzKS4gIAorICAgICAqIAorICAgICAqIDxwPkpTUCAyLjAgYW5kIGhpZ2hlciBjb250YWluZXJzIGNhbGwgdmFsaWRhdGUoKSBpbnN0ZWFkIG9mIGlzVmFsaWQoKS4KKyAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBpcyB0byBjYWxsIGlzVmFsaWQoKS4gIElmIAorICAgICAqIGlzVmFsaWQoKSByZXR1cm5zIGZhbHNlLCBhIGdlbmVyaWMgVmFsaWRhdGlvbk1lc3NhZ2VbXSBpcyByZXR1cm5lZAorICAgICAqIGluZGljYXRpbmcgaXNWYWxpZCgpIHJldHVybmVkIGZhbHNlLjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkYXRhIFRoZSBUYWdEYXRhIGluc3RhbmNlLgorICAgICAqIEByZXR1cm4gQSBudWxsIG9iamVjdCwgb3IgemVybyBsZW5ndGggYXJyYXkgaWYgbm8gZXJyb3JzLCBhbiAKKyAgICAgKiAgICAgYXJyYXkgb2YgVmFsaWRhdGlvbk1lc3NhZ2VzIG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgMi4wCisgICAgICovCisgICAgcHVibGljIFZhbGlkYXRpb25NZXNzYWdlW10gdmFsaWRhdGUoIFRhZ0RhdGEgZGF0YSApIHsKKwlWYWxpZGF0aW9uTWVzc2FnZVtdIHJlc3VsdCA9IG51bGw7CisKKwlpZiggIWlzVmFsaWQoIGRhdGEgKSApIHsKKwkgICAgcmVzdWx0ID0gbmV3IFZhbGlkYXRpb25NZXNzYWdlW10geworCQluZXcgVmFsaWRhdGlvbk1lc3NhZ2UoIGRhdGEuZ2V0SWQoKSwgImlzVmFsaWQoKSA9PSBmYWxzZSIgKSB9OworCX0KKworCXJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBUYWdJbmZvIGZvciB0aGlzIGNsYXNzLgorICAgICAqCisgICAgICogQHBhcmFtIHRhZ0luZm8gVGhlIFRhZ0luZm8gdGhpcyBpbnN0YW5jZSBpcyBleHRlbmRpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRUYWdJbmZvKFRhZ0luZm8gdGFnSW5mbykgeworCXRoaXMudGFnSW5mbyA9IHRhZ0luZm87CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBUYWdJbmZvIGZvciB0aGlzIGNsYXNzLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgdGFnaW5mbyBpbnN0YW5jZSB0aGlzIGluc3RhbmNlIGlzIGV4dGVuZGluZworICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBUYWdJbmZvIGdldFRhZ0luZm8oKSB7CisJcmV0dXJuIHRhZ0luZm87CisgICAgfQorICAgIAorICAgIC8vIHByaXZhdGUgZGF0YQorICAgIHByaXZhdGUgVGFnSW5mbyB0YWdJbmZvOworCisgICAgLy8gemVybyBsZW5ndGggVmFyaWFibGVJbmZvIGFycmF5CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVmFyaWFibGVJbmZvW10gWkVST19WQVJJQUJMRV9JTkZPID0geyB9OworfQorCmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvdGFnZXh0L1RhZ0ZpbGVJbmZvLmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvdGFnZXh0L1RhZ0ZpbGVJbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE5M2QwMgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC90YWdleHQvVGFnRmlsZUluZm8uamF2YQpAQCAtMCwwICsxLDg1IEBACisvKgorKiBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyAKK3BhY2thZ2UgamF2YXguc2VydmxldC5qc3AudGFnZXh0OworCisvKioKKyAqIFRhZyBpbmZvcm1hdGlvbiBmb3IgYSB0YWcgZmlsZSBpbiBhIFRhZyBMaWJyYXJ5OworICogVGhpcyBjbGFzcyBpcyBpbnN0YW50aWF0ZWQgZnJvbSB0aGUgVGFnIExpYnJhcnkgRGVzY3JpcHRvciBmaWxlIChUTEQpCisgKiBhbmQgaXMgYXZhaWxhYmxlIG9ubHkgYXQgdHJhbnNsYXRpb24gdGltZS4KKyAqCisgKiBAc2luY2UgMi4wCisgKi8KK3B1YmxpYyBjbGFzcyBUYWdGaWxlSW5mbyB7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgVGFnRmlsZUluZm8gZnJvbSBkYXRhIGluIHRoZSBKU1AgMi4wIGZvcm1hdCBmb3IgVExELgorICAgICAqIFRoaXMgY2xhc3MgaXMgdG8gYmUgaW5zdGFudGlhdGVkIG9ubHkgZnJvbSB0aGUgVGFnTGlicmFyeSBjb2RlCisgICAgICogdW5kZXIgcmVxdWVzdCBmcm9tIHNvbWUgSlNQIGNvZGUgdGhhdCBpcyBwYXJzaW5nIGEKKyAgICAgKiBUTEQgKFRhZyBMaWJyYXJ5IERlc2NyaXB0b3IpLgorICAgICAqCisgICAgICogTm90ZSB0aGF0LCBzaW5jZSBUYWdMaWJpYnJhcnlJbmZvIHJlZmxlY3RzIGJvdGggVExEIGluZm9ybWF0aW9uCisgICAgICogYW5kIHRhZ2xpYiBkaXJlY3RpdmUgaW5mb3JtYXRpb24sIGEgVGFnRmlsZUluZm8gaW5zdGFuY2UgaXMKKyAgICAgKiBkZXBlbmRlbnQgb24gYSB0YWdsaWIgZGlyZWN0aXZlLiAgVGhpcyBpcyBwcm9iYWJseSBhCisgICAgICogZGVzaWduIGVycm9yLCB3aGljaCBtYXkgYmUgZml4ZWQgaW4gdGhlIGZ1dHVyZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIFRoZSB1bmlxdWUgYWN0aW9uIG5hbWUgb2YgdGhpcyB0YWcKKyAgICAgKiBAcGFyYW0gcGF0aCBXaGVyZSB0byBmaW5kIHRoZSAudGFnIGZpbGUgaW1wbGVtZW50aW5nIHRoaXMgCisgICAgICogICAgIGFjdGlvbiwgcmVsYXRpdmUgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBUTEQgZmlsZS4KKyAgICAgKiBAcGFyYW0gdGFnSW5mbyBUaGUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyB0YWcsIGFzIHBhcnNlZAorICAgICAqICAgICBmcm9tIHRoZSBkaXJlY3RpdmVzIGluIHRoZSB0YWcgZmlsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgVGFnRmlsZUluZm8oIFN0cmluZyBuYW1lLCBTdHJpbmcgcGF0aCwgVGFnSW5mbyB0YWdJbmZvICkgeworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB0aGlzLnBhdGggPSBwYXRoOworICAgICAgICB0aGlzLnRhZ0luZm8gPSB0YWdJbmZvOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSB1bmlxdWUgYWN0aW9uIG5hbWUgb2YgdGhpcyB0YWcuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSAoc2hvcnQpIG5hbWUgb2YgdGhlIHRhZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXJlIHRvIGZpbmQgdGhlIC50YWcgZmlsZSBpbXBsZW1lbnRpbmcgdGhpcyBhY3Rpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBwYXRoIG9mIHRoZSB0YWcgZmlsZSwgcmVsYXRpdmUgdG8gdGhlIFRMRCwgb3IgIi4iIGlmIAorICAgICAqICAgICB0aGUgdGFnIGZpbGUgd2FzIGRlZmluZWQgaW4gYW4gaW1wbGljaXQgdGFnIGZpbGUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRQYXRoKCkgeworICAgICAgICByZXR1cm4gcGF0aDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgdGFnLCBwYXJzZWQgZnJvbSB0aGUgZGlyZWN0aXZlcyAKKyAgICAgKiBpbiB0aGUgdGFnIGZpbGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgVGFnSW5mbyBvYmplY3QgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHRhZworICAgICAqLworICAgIHB1YmxpYyBUYWdJbmZvIGdldFRhZ0luZm8oKSB7CisgICAgICAgIHJldHVybiB0YWdJbmZvOworICAgIH0KKworICAgIC8vIHByaXZhdGUgZmllbGRzIGZvciAyLjAgaW5mbworICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisgICAgcHJpdmF0ZSBTdHJpbmcgcGF0aDsKKyAgICBwcml2YXRlIFRhZ0luZm8gdGFnSW5mbzsKK30KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC90YWdleHQvVGFnSW5mby5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL3RhZ2V4dC9UYWdJbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRkMzQxZgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC90YWdleHQvVGFnSW5mby5qYXZhCkBAIC0wLDAgKzEsNDQ2IEBACisvKgorKiBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyAKK3BhY2thZ2UgamF2YXguc2VydmxldC5qc3AudGFnZXh0OworCisvKioKKyAqIFRhZyBpbmZvcm1hdGlvbiBmb3IgYSB0YWcgaW4gYSBUYWcgTGlicmFyeTsKKyAqIFRoaXMgY2xhc3MgaXMgaW5zdGFudGlhdGVkIGZyb20gdGhlIFRhZyBMaWJyYXJ5IERlc2NyaXB0b3IgZmlsZSAoVExEKQorICogYW5kIGlzIGF2YWlsYWJsZSBvbmx5IGF0IHRyYW5zbGF0aW9uIHRpbWUuCisgKgorICogCisqLworCitwdWJsaWMgY2xhc3MgVGFnSW5mbyB7CisKKyAgICAvKioKKyAgICAgKiBTdGF0aWMgY29uc3RhbnQgZm9yIGdldEJvZHlDb250ZW50KCkgd2hlbiBpdCBpcyBKU1AuCisgICAgICovCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCT0RZX0NPTlRFTlRfSlNQID0gIkpTUCI7CisKKyAgICAvKioKKyAgICAgKiBTdGF0aWMgY29uc3RhbnQgZm9yIGdldEJvZHlDb250ZW50KCkgd2hlbiBpdCBpcyBUYWcgZGVwZW5kZW50LgorICAgICAqLworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQk9EWV9DT05URU5UX1RBR19ERVBFTkRFTlQgPSAiVEFHREVQRU5ERU5UIjsKKworCisgICAgLyoqCisgICAgICogU3RhdGljIGNvbnN0YW50IGZvciBnZXRCb2R5Q29udGVudCgpIHdoZW4gaXQgaXMgZW1wdHkuCisgICAgICovCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCT0RZX0NPTlRFTlRfRU1QVFkgPSAiRU1QVFkiOworICAgIAorICAgIC8qKgorICAgICAqIFN0YXRpYyBjb25zdGFudCBmb3IgZ2V0Qm9keUNvbnRlbnQoKSB3aGVuIGl0IGlzIHNjcmlwdGxlc3MuCisgICAgICogCisgICAgICogQHNpbmNlIDIuMAorICAgICAqLyAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCT0RZX0NPTlRFTlRfU0NSSVBUTEVTUyA9ICJTQ1JJUFRMRVNTIjsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGZvciBUYWdJbmZvIGZyb20gZGF0YSBpbiB0aGUgSlNQIDEuMSBmb3JtYXQgZm9yIFRMRC4KKyAgICAgKiBUaGlzIGNsYXNzIGlzIHRvIGJlIGluc3RhbnRpYXRlZCBvbmx5IGZyb20gdGhlIFRhZ0xpYnJhcnkgY29kZQorICAgICAqIHVuZGVyIHJlcXVlc3QgZnJvbSBzb21lIEpTUCBjb2RlIHRoYXQgaXMgcGFyc2luZyBhCisgICAgICogVExEIChUYWcgTGlicmFyeSBEZXNjcmlwdG9yKS4KKyAgICAgKgorICAgICAqIE5vdGUgdGhhdCwgc2luY2UgVGFnTGliaWJyYXJ5SW5mbyByZWZsZWN0cyBib3RoIFRMRCBpbmZvcm1hdGlvbgorICAgICAqIGFuZCB0YWdsaWIgZGlyZWN0aXZlIGluZm9ybWF0aW9uLCBhIFRhZ0luZm8gaW5zdGFuY2UgaXMKKyAgICAgKiBkZXBlbmRlbnQgb24gYSB0YWdsaWIgZGlyZWN0aXZlLiAgVGhpcyBpcyBwcm9iYWJseSBhCisgICAgICogZGVzaWduIGVycm9yLCB3aGljaCBtYXkgYmUgZml4ZWQgaW4gdGhlIGZ1dHVyZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0YWdOYW1lIFRoZSBuYW1lIG9mIHRoaXMgdGFnCisgICAgICogQHBhcmFtIHRhZ0NsYXNzTmFtZSBUaGUgbmFtZSBvZiB0aGUgdGFnIGhhbmRsZXIgY2xhc3MKKyAgICAgKiBAcGFyYW0gYm9keWNvbnRlbnQgSW5mb3JtYXRpb24gb24gdGhlIGJvZHkgY29udGVudCBvZiB0aGVzZSB0YWdzCisgICAgICogQHBhcmFtIGluZm9TdHJpbmcgVGhlIChvcHRpb25hbCkgc3RyaW5nIGluZm9ybWF0aW9uIGZvciB0aGlzIHRhZworICAgICAqIEBwYXJhbSB0YWdsaWIgVGhlIGluc3RhbmNlIG9mIHRoZSB0YWcgbGlicmFyeSB0aGF0IGNvbnRhaW5zIHVzLgorICAgICAqIEBwYXJhbSB0YWdFeHRyYUluZm8gVGhlIGluc3RhbmNlIHByb3ZpZGluZyBleHRyYSBUYWcgaW5mby4gIE1heSBiZSBudWxsCisgICAgICogQHBhcmFtIGF0dHJpYnV0ZUluZm8gQW4gYXJyYXkgb2YgQXR0cmlidXRlSW5mbyBkYXRhIGZyb20gZGVzY3JpcHRvci4KKyAgICAgKiBNYXkgYmUgbnVsbDsKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBUYWdJbmZvKFN0cmluZyB0YWdOYW1lLAorCSAgICBTdHJpbmcgdGFnQ2xhc3NOYW1lLAorCSAgICBTdHJpbmcgYm9keWNvbnRlbnQsCisJICAgIFN0cmluZyBpbmZvU3RyaW5nLAorCSAgICBUYWdMaWJyYXJ5SW5mbyB0YWdsaWIsCisJICAgIFRhZ0V4dHJhSW5mbyB0YWdFeHRyYUluZm8sCisJICAgIFRhZ0F0dHJpYnV0ZUluZm9bXSBhdHRyaWJ1dGVJbmZvKSB7CisJdGhpcy50YWdOYW1lICAgICAgID0gdGFnTmFtZTsKKwl0aGlzLnRhZ0NsYXNzTmFtZSAgPSB0YWdDbGFzc05hbWU7CisJdGhpcy5ib2R5Q29udGVudCAgID0gYm9keWNvbnRlbnQ7CisJdGhpcy5pbmZvU3RyaW5nICAgID0gaW5mb1N0cmluZzsKKwl0aGlzLnRhZ0xpYnJhcnkgICAgPSB0YWdsaWI7CisJdGhpcy50YWdFeHRyYUluZm8gID0gdGFnRXh0cmFJbmZvOworCXRoaXMuYXR0cmlidXRlSW5mbyA9IGF0dHJpYnV0ZUluZm87CisKKwlpZiAodGFnRXh0cmFJbmZvICE9IG51bGwpCisgICAgICAgICAgICB0YWdFeHRyYUluZm8uc2V0VGFnSW5mbyh0aGlzKTsKKyAgICB9CisJCQkgCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIFRhZ0luZm8gZnJvbSBkYXRhIGluIHRoZSBKU1AgMS4yIGZvcm1hdCBmb3IgVExELgorICAgICAqIFRoaXMgY2xhc3MgaXMgdG8gYmUgaW5zdGFudGlhdGVkIG9ubHkgZnJvbSB0aGUgVGFnTGlicmFyeSBjb2RlCisgICAgICogdW5kZXIgcmVxdWVzdCBmcm9tIHNvbWUgSlNQIGNvZGUgdGhhdCBpcyBwYXJzaW5nIGEKKyAgICAgKiBUTEQgKFRhZyBMaWJyYXJ5IERlc2NyaXB0b3IpLgorICAgICAqCisgICAgICogTm90ZSB0aGF0LCBzaW5jZSBUYWdMaWJpYnJhcnlJbmZvIHJlZmxlY3RzIGJvdGggVExEIGluZm9ybWF0aW9uCisgICAgICogYW5kIHRhZ2xpYiBkaXJlY3RpdmUgaW5mb3JtYXRpb24sIGEgVGFnSW5mbyBpbnN0YW5jZSBpcworICAgICAqIGRlcGVuZGVudCBvbiBhIHRhZ2xpYiBkaXJlY3RpdmUuICBUaGlzIGlzIHByb2JhYmx5IGEKKyAgICAgKiBkZXNpZ24gZXJyb3IsIHdoaWNoIG1heSBiZSBmaXhlZCBpbiB0aGUgZnV0dXJlLgorICAgICAqCisgICAgICogQHBhcmFtIHRhZ05hbWUgVGhlIG5hbWUgb2YgdGhpcyB0YWcKKyAgICAgKiBAcGFyYW0gdGFnQ2xhc3NOYW1lIFRoZSBuYW1lIG9mIHRoZSB0YWcgaGFuZGxlciBjbGFzcworICAgICAqIEBwYXJhbSBib2R5Y29udGVudCBJbmZvcm1hdGlvbiBvbiB0aGUgYm9keSBjb250ZW50IG9mIHRoZXNlIHRhZ3MKKyAgICAgKiBAcGFyYW0gaW5mb1N0cmluZyBUaGUgKG9wdGlvbmFsKSBzdHJpbmcgaW5mb3JtYXRpb24gZm9yIHRoaXMgdGFnCisgICAgICogQHBhcmFtIHRhZ2xpYiBUaGUgaW5zdGFuY2Ugb2YgdGhlIHRhZyBsaWJyYXJ5IHRoYXQgY29udGFpbnMgdXMuCisgICAgICogQHBhcmFtIHRhZ0V4dHJhSW5mbyBUaGUgaW5zdGFuY2UgcHJvdmlkaW5nIGV4dHJhIFRhZyBpbmZvLiAgTWF5IGJlIG51bGwKKyAgICAgKiBAcGFyYW0gYXR0cmlidXRlSW5mbyBBbiBhcnJheSBvZiBBdHRyaWJ1dGVJbmZvIGRhdGEgZnJvbSBkZXNjcmlwdG9yLgorICAgICAqIE1heSBiZSBudWxsOworICAgICAqIEBwYXJhbSBkaXNwbGF5TmFtZSBBIHNob3J0IG5hbWUgdG8gYmUgZGlzcGxheWVkIGJ5IHRvb2xzCisgICAgICogQHBhcmFtIHNtYWxsSWNvbiBQYXRoIHRvIGEgc21hbGwgaWNvbiB0byBiZSBkaXNwbGF5ZWQgYnkgdG9vbHMKKyAgICAgKiBAcGFyYW0gbGFyZ2VJY29uIFBhdGggdG8gYSBsYXJnZSBpY29uIHRvIGJlIGRpc3BsYXllZCBieSB0b29scworICAgICAqIEBwYXJhbSB0dmkgQW4gYXJyYXkgb2YgYSBUYWdWYXJpYWJsZUluZm8gKG9yIG51bGwpCisgICAgICovCisgICAgcHVibGljIFRhZ0luZm8oU3RyaW5nIHRhZ05hbWUsCisJICAgIFN0cmluZyB0YWdDbGFzc05hbWUsCisJICAgIFN0cmluZyBib2R5Y29udGVudCwKKwkgICAgU3RyaW5nIGluZm9TdHJpbmcsCisJICAgIFRhZ0xpYnJhcnlJbmZvIHRhZ2xpYiwKKwkgICAgVGFnRXh0cmFJbmZvIHRhZ0V4dHJhSW5mbywKKwkgICAgVGFnQXR0cmlidXRlSW5mb1tdIGF0dHJpYnV0ZUluZm8sCisJICAgIFN0cmluZyBkaXNwbGF5TmFtZSwKKwkgICAgU3RyaW5nIHNtYWxsSWNvbiwKKwkgICAgU3RyaW5nIGxhcmdlSWNvbiwKKwkgICAgVGFnVmFyaWFibGVJbmZvW10gdHZpKSB7CisJdGhpcy50YWdOYW1lICAgICAgID0gdGFnTmFtZTsKKwl0aGlzLnRhZ0NsYXNzTmFtZSAgPSB0YWdDbGFzc05hbWU7CisJdGhpcy5ib2R5Q29udGVudCAgID0gYm9keWNvbnRlbnQ7CisJdGhpcy5pbmZvU3RyaW5nICAgID0gaW5mb1N0cmluZzsKKwl0aGlzLnRhZ0xpYnJhcnkgICAgPSB0YWdsaWI7CisJdGhpcy50YWdFeHRyYUluZm8gID0gdGFnRXh0cmFJbmZvOworCXRoaXMuYXR0cmlidXRlSW5mbyA9IGF0dHJpYnV0ZUluZm87CisJdGhpcy5kaXNwbGF5TmFtZSA9IGRpc3BsYXlOYW1lOworCXRoaXMuc21hbGxJY29uID0gc21hbGxJY29uOworCXRoaXMubGFyZ2VJY29uID0gbGFyZ2VJY29uOworCXRoaXMudGFnVmFyaWFibGVJbmZvID0gdHZpOworCisJaWYgKHRhZ0V4dHJhSW5mbyAhPSBudWxsKQorICAgICAgICAgICAgdGFnRXh0cmFJbmZvLnNldFRhZ0luZm8odGhpcyk7CisgICAgfQorCQkJIAorICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGZvciBUYWdJbmZvIGZyb20gZGF0YSBpbiB0aGUgSlNQIDIuMCBmb3JtYXQgZm9yIFRMRC4KKyAgICAgKiBUaGlzIGNsYXNzIGlzIHRvIGJlIGluc3RhbnRpYXRlZCBvbmx5IGZyb20gdGhlIFRhZ0xpYnJhcnkgY29kZQorICAgICAqIHVuZGVyIHJlcXVlc3QgZnJvbSBzb21lIEpTUCBjb2RlIHRoYXQgaXMgcGFyc2luZyBhCisgICAgICogVExEIChUYWcgTGlicmFyeSBEZXNjcmlwdG9yKS4KKyAgICAgKgorICAgICAqIE5vdGUgdGhhdCwgc2luY2UgVGFnTGliaWJyYXJ5SW5mbyByZWZsZWN0cyBib3RoIFRMRCBpbmZvcm1hdGlvbgorICAgICAqIGFuZCB0YWdsaWIgZGlyZWN0aXZlIGluZm9ybWF0aW9uLCBhIFRhZ0luZm8gaW5zdGFuY2UgaXMKKyAgICAgKiBkZXBlbmRlbnQgb24gYSB0YWdsaWIgZGlyZWN0aXZlLiAgVGhpcyBpcyBwcm9iYWJseSBhCisgICAgICogZGVzaWduIGVycm9yLCB3aGljaCBtYXkgYmUgZml4ZWQgaW4gdGhlIGZ1dHVyZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0YWdOYW1lIFRoZSBuYW1lIG9mIHRoaXMgdGFnCisgICAgICogQHBhcmFtIHRhZ0NsYXNzTmFtZSBUaGUgbmFtZSBvZiB0aGUgdGFnIGhhbmRsZXIgY2xhc3MKKyAgICAgKiBAcGFyYW0gYm9keWNvbnRlbnQgSW5mb3JtYXRpb24gb24gdGhlIGJvZHkgY29udGVudCBvZiB0aGVzZSB0YWdzCisgICAgICogQHBhcmFtIGluZm9TdHJpbmcgVGhlIChvcHRpb25hbCkgc3RyaW5nIGluZm9ybWF0aW9uIGZvciB0aGlzIHRhZworICAgICAqIEBwYXJhbSB0YWdsaWIgVGhlIGluc3RhbmNlIG9mIHRoZSB0YWcgbGlicmFyeSB0aGF0IGNvbnRhaW5zIHVzLgorICAgICAqIEBwYXJhbSB0YWdFeHRyYUluZm8gVGhlIGluc3RhbmNlIHByb3ZpZGluZyBleHRyYSBUYWcgaW5mby4gIE1heSBiZSBudWxsCisgICAgICogQHBhcmFtIGF0dHJpYnV0ZUluZm8gQW4gYXJyYXkgb2YgQXR0cmlidXRlSW5mbyBkYXRhIGZyb20gZGVzY3JpcHRvci4KKyAgICAgKiBNYXkgYmUgbnVsbDsKKyAgICAgKiBAcGFyYW0gZGlzcGxheU5hbWUgQSBzaG9ydCBuYW1lIHRvIGJlIGRpc3BsYXllZCBieSB0b29scworICAgICAqIEBwYXJhbSBzbWFsbEljb24gUGF0aCB0byBhIHNtYWxsIGljb24gdG8gYmUgZGlzcGxheWVkIGJ5IHRvb2xzCisgICAgICogQHBhcmFtIGxhcmdlSWNvbiBQYXRoIHRvIGEgbGFyZ2UgaWNvbiB0byBiZSBkaXNwbGF5ZWQgYnkgdG9vbHMKKyAgICAgKiBAcGFyYW0gdHZpIEFuIGFycmF5IG9mIGEgVGFnVmFyaWFibGVJbmZvIChvciBudWxsKQorICAgICAqIEBwYXJhbSBkeW5hbWljQXR0cmlidXRlcyBUcnVlIGlmIHN1cHBvcnRzIGR5bmFtaWMgYXR0cmlidXRlcworICAgICAqCisgICAgICogQHNpbmNlIDIuMAorICAgICAqLworICAgIHB1YmxpYyBUYWdJbmZvKFN0cmluZyB0YWdOYW1lLAorICAgICAgICAgICAgU3RyaW5nIHRhZ0NsYXNzTmFtZSwKKyAgICAgICAgICAgIFN0cmluZyBib2R5Y29udGVudCwKKyAgICAgICAgICAgIFN0cmluZyBpbmZvU3RyaW5nLAorICAgICAgICAgICAgVGFnTGlicmFyeUluZm8gdGFnbGliLAorICAgICAgICAgICAgVGFnRXh0cmFJbmZvIHRhZ0V4dHJhSW5mbywKKyAgICAgICAgICAgIFRhZ0F0dHJpYnV0ZUluZm9bXSBhdHRyaWJ1dGVJbmZvLAorICAgICAgICAgICAgU3RyaW5nIGRpc3BsYXlOYW1lLAorICAgICAgICAgICAgU3RyaW5nIHNtYWxsSWNvbiwKKyAgICAgICAgICAgIFN0cmluZyBsYXJnZUljb24sCisgICAgICAgICAgICBUYWdWYXJpYWJsZUluZm9bXSB0dmksCisgICAgICAgICAgICBib29sZWFuIGR5bmFtaWNBdHRyaWJ1dGVzKSB7CisgICAgICAgIHRoaXMudGFnTmFtZSAgICAgICA9IHRhZ05hbWU7CisgICAgICAgIHRoaXMudGFnQ2xhc3NOYW1lICA9IHRhZ0NsYXNzTmFtZTsKKyAgICAgICAgdGhpcy5ib2R5Q29udGVudCAgID0gYm9keWNvbnRlbnQ7CisgICAgICAgIHRoaXMuaW5mb1N0cmluZyAgICA9IGluZm9TdHJpbmc7CisgICAgICAgIHRoaXMudGFnTGlicmFyeSAgICA9IHRhZ2xpYjsKKyAgICAgICAgdGhpcy50YWdFeHRyYUluZm8gID0gdGFnRXh0cmFJbmZvOworICAgICAgICB0aGlzLmF0dHJpYnV0ZUluZm8gPSBhdHRyaWJ1dGVJbmZvOworICAgICAgICB0aGlzLmRpc3BsYXlOYW1lID0gZGlzcGxheU5hbWU7CisgICAgICAgIHRoaXMuc21hbGxJY29uID0gc21hbGxJY29uOworICAgICAgICB0aGlzLmxhcmdlSWNvbiA9IGxhcmdlSWNvbjsKKyAgICAgICAgdGhpcy50YWdWYXJpYWJsZUluZm8gPSB0dmk7CisgICAgICAgIHRoaXMuZHluYW1pY0F0dHJpYnV0ZXMgPSBkeW5hbWljQXR0cmlidXRlczsKKworICAgICAgICBpZiAodGFnRXh0cmFJbmZvICE9IG51bGwpCisgICAgICAgICAgICB0YWdFeHRyYUluZm8uc2V0VGFnSW5mbyh0aGlzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgVGFnLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgKHNob3J0KSBuYW1lIG9mIHRoZSB0YWcuCisgICAgICovCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFRhZ05hbWUoKSB7CisJcmV0dXJuIHRhZ05hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXR0cmlidXRlIGluZm9ybWF0aW9uIChpbiB0aGUgVExEKSBvbiB0aGlzIHRhZy4KKyAgICAgKiBUaGUgcmV0dXJuIGlzIGFuIGFycmF5IGRlc2NyaWJpbmcgdGhlIGF0dHJpYnV0ZXMgb2YgdGhpcyB0YWcsIGFzCisgICAgICogaW5kaWNhdGVkIGluIHRoZSBUTEQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBhcnJheSBvZiBUYWdBdHRyaWJ1dGVJbmZvIGZvciB0aGlzIHRhZywgb3IgYQorICAgICAqICAgICAgICAgemVyby1sZW5ndGggYXJyYXkgaWYgdGhlIHRhZyBoYXMgbm8gYXR0cmlidXRlcy4KKyAgICAgKi8KKworICAgcHVibGljIFRhZ0F0dHJpYnV0ZUluZm9bXSBnZXRBdHRyaWJ1dGVzKCkgeworICAgICAgIHJldHVybiBhdHRyaWJ1dGVJbmZvOworICAgfQorCisgICAgLyoqCisgICAgICogSW5mb3JtYXRpb24gb24gdGhlIHNjcmlwdGluZyBvYmplY3RzIGNyZWF0ZWQgYnkgdGhpcyB0YWcgYXQgcnVudGltZS4KKyAgICAgKiBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIG9uIHRoZSBhc3NvY2lhdGVkIFRhZ0V4dHJhSW5mbyBjbGFzcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkYXRhIFRhZ0RhdGEgZGVzY3JpYmluZyB0aGlzIGFjdGlvbi4KKyAgICAgKiBAcmV0dXJuIGlmIGEgVGFnRXh0cmFJbmZvIG9iamVjdCBpcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBUYWdJbmZvLCB0aGUKKyAgICAgKiAgICAgcmVzdWx0IG9mIGdldFRhZ0V4dHJhSW5mbygpLmdldFZhcmlhYmxlSW5mbyggZGF0YSApLCBvdGhlcndpc2UKKyAgICAgKiAgICAgbnVsbC4KKyAgICAgKi8KKyAgIHB1YmxpYyBWYXJpYWJsZUluZm9bXSBnZXRWYXJpYWJsZUluZm8oVGFnRGF0YSBkYXRhKSB7CisgICAgICAgVmFyaWFibGVJbmZvW10gcmVzdWx0ID0gbnVsbDsKKyAgICAgICBUYWdFeHRyYUluZm8gdGVpID0gZ2V0VGFnRXh0cmFJbmZvKCk7CisgICAgICAgaWYgKHRlaSAhPSBudWxsKSB7CisJICAgcmVzdWx0ID0gdGVpLmdldFZhcmlhYmxlSW5mbyggZGF0YSApOworICAgICAgIH0KKyAgICAgICByZXR1cm4gcmVzdWx0OworICAgfQorCisgICAgLyoqCisgICAgICogVHJhbnNsYXRpb24tdGltZSB2YWxpZGF0aW9uIG9mIHRoZSBhdHRyaWJ1dGVzLiAKKyAgICAgKiBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIG9uIHRoZSBhc3NvY2lhdGVkIFRhZ0V4dHJhSW5mbyBjbGFzcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkYXRhIFRoZSB0cmFuc2xhdGlvbi10aW1lIFRhZ0RhdGEgaW5zdGFuY2UuCisgICAgICogQHJldHVybiBXaGV0aGVyIHRoZSBkYXRhIGlzIHZhbGlkLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoVGFnRGF0YSBkYXRhKSB7CisgICAgICAgIFRhZ0V4dHJhSW5mbyB0ZWkgPSBnZXRUYWdFeHRyYUluZm8oKTsKKyAgICAgICAgaWYgKHRlaSA9PSBudWxsKSB7CisJICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0ZWkuaXNWYWxpZChkYXRhKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcmFuc2xhdGlvbi10aW1lIHZhbGlkYXRpb24gb2YgdGhlIGF0dHJpYnV0ZXMuCisgICAgICogVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCBvbiB0aGUgYXNzb2NpYXRlZCBUYWdFeHRyYUluZm8gY2xhc3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGF0YSBUaGUgdHJhbnNsYXRpb24tdGltZSBUYWdEYXRhIGluc3RhbmNlLgorICAgICAqIEByZXR1cm4gQSBudWxsIG9iamVjdCwgb3IgemVybyBsZW5ndGggYXJyYXkgaWYgbm8gZXJyb3JzLCBhbgorICAgICAqICAgICBhcnJheSBvZiBWYWxpZGF0aW9uTWVzc2FnZXMgb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgVmFsaWRhdGlvbk1lc3NhZ2VbXSB2YWxpZGF0ZSggVGFnRGF0YSBkYXRhICkgeworCVRhZ0V4dHJhSW5mbyB0ZWkgPSBnZXRUYWdFeHRyYUluZm8oKTsKKwlpZiggdGVpID09IG51bGwgKSB7CisJICAgIHJldHVybiBudWxsOworCX0KKwlyZXR1cm4gdGVpLnZhbGlkYXRlKCBkYXRhICk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBpbnN0YW5jZSBmb3IgZXh0cmEgdGFnIGluZm9ybWF0aW9uLgorICAgICAqIAorICAgICAqIEBwYXJhbSB0ZWkgdGhlIFRhZ0V4dHJhSW5mbyBpbnN0YW5jZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRhZ0V4dHJhSW5mbyhUYWdFeHRyYUluZm8gdGVpKSB7CisJdGFnRXh0cmFJbmZvID0gdGVpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIGluc3RhbmNlIChpZiBhbnkpIGZvciBleHRyYSB0YWcgaW5mb3JtYXRpb24uCisgICAgICogCisgICAgICogQHJldHVybiBUaGUgVGFnRXh0cmFJbmZvIGluc3RhbmNlLCBpZiBhbnkuCisgICAgICovCisgICAgcHVibGljIFRhZ0V4dHJhSW5mbyBnZXRUYWdFeHRyYUluZm8oKSB7CisJcmV0dXJuIHRhZ0V4dHJhSW5mbzsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIE5hbWUgb2YgdGhlIGNsYXNzIHRoYXQgcHJvdmlkZXMgdGhlIGhhbmRsZXIgZm9yIHRoaXMgdGFnLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgbmFtZSBvZiB0aGUgdGFnIGhhbmRsZXIgY2xhc3MuCisgICAgICovCisgICAgCisgICAgcHVibGljIFN0cmluZyBnZXRUYWdDbGFzc05hbWUoKSB7CisJcmV0dXJuIHRhZ0NsYXNzTmFtZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSBib2R5Y29udGVudCBpbmZvcm1hdGlvbiBmb3IgdGhpcyB0YWcuCisgICAgICogSWYgdGhlIGJvZHljb250ZW50IGlzIG5vdCBkZWZpbmVkIGZvciB0aGlzCisgICAgICogdGFnLCB0aGUgZGVmYXVsdCBvZiBKU1Agd2lsbCBiZSByZXR1cm5lZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGJvZHkgY29udGVudCBzdHJpbmcuCisgICAgICovCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEJvZHlDb250ZW50KCkgeworCXJldHVybiBib2R5Q29udGVudDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSBpbmZvcm1hdGlvbiBzdHJpbmcgZm9yIHRoZSB0YWcuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBpbmZvIHN0cmluZywgb3IgbnVsbCBpZiAKKyAgICAgKiAgICAgICAgIG5vdCBkZWZpbmVkCisgICAgICovCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEluZm9TdHJpbmcoKSB7CisJcmV0dXJuIGluZm9TdHJpbmc7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIFRhZ0xpYnJhcnlJbmZvIHByb3BlcnR5LgorICAgICAqCisgICAgICogTm90ZSB0aGF0IGEgVGFnTGlicmFyeUluZm8gZWxlbWVudCBpcyBkZXBlbmRlbnQKKyAgICAgKiBub3QganVzdCBvbiB0aGUgVExEIGluZm9ybWF0aW9uIGJ1dCBhbHNvIG9uIHRoZQorICAgICAqIHNwZWNpZmljIHRhZ2xpYiBpbnN0YW5jZSB1c2VkLiAgVGhpcyBtZWFucyB0aGF0CisgICAgICogYSBmYWlyIGFtb3VudCBvZiB3b3JrIG5lZWRzIHRvIGJlIGRvbmUgdG8gY29uc3RydWN0CisgICAgICogYW5kIGluaXRpYWxpemUgVGFnTGliIG9iamVjdHMuCisgICAgICoKKyAgICAgKiBJZiB1c2VkIGNhcmVmdWxseSwgdGhpcyBzZXR0ZXIgY2FuIGJlIHVzZWQgdG8gYXZvaWQgaGF2aW5nIHRvCisgICAgICogY3JlYXRlIG5ldyBUYWdJbmZvIGVsZW1lbnRzIGZvciBlYWNoIHRhZ2xpYiBkaXJlY3RpdmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGwgdGhlIFRhZ0xpYnJhcnlJbmZvIHRvIGFzc2lnbgorICAgICAqLworCisgICAgcHVibGljIHZvaWQgc2V0VGFnTGlicmFyeShUYWdMaWJyYXJ5SW5mbyB0bCkgeworCXRhZ0xpYnJhcnkgPSB0bDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgaW5zdGFuY2Ugb2YgVGFiTGlicmFyeUluZm8gd2UgYmVsb25nIHRvLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgdGFnIGxpYnJhcnkgaW5zdGFuY2Ugd2UgYmVsb25nIHRvCisgICAgICovCisKKyAgICBwdWJsaWMgVGFnTGlicmFyeUluZm8gZ2V0VGFnTGlicmFyeSgpIHsKKwlyZXR1cm4gdGFnTGlicmFyeTsKKyAgICB9CisKKworICAgIC8vID09PT09PT09PT09PT09IEpTUCAyLjAgVExEIEluZm9ybWF0aW9uID09PT09PT09CisKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgZGlzcGxheU5hbWUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEEgc2hvcnQgbmFtZSB0byBiZSBkaXNwbGF5ZWQgYnkgdG9vbHMsCisgICAgICogICAgICAgICBvciBudWxsIGlmIG5vdCBkZWZpbmVkCisgICAgICovCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlOYW1lKCkgeworCXJldHVybiBkaXNwbGF5TmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHBhdGggdG8gdGhlIHNtYWxsIGljb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFBhdGggdG8gYSBzbWFsbCBpY29uIHRvIGJlIGRpc3BsYXllZCBieSB0b29scywKKyAgICAgKiAgICAgICAgIG9yIG51bGwgaWYgbm90IGRlZmluZWQKKyAgICAgKi8KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U21hbGxJY29uKCkgeworCXJldHVybiBzbWFsbEljb247CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBwYXRoIHRvIHRoZSBsYXJnZSBpY29uLgorICAgICAqCisgICAgICogQHJldHVybiBQYXRoIHRvIGEgbGFyZ2UgaWNvbiB0byBiZSBkaXNwbGF5ZWQgYnkgdG9vbHMsCisgICAgICogICAgICAgICBvciBudWxsIGlmIG5vdCBkZWZpbmVkCisgICAgICovCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldExhcmdlSWNvbigpIHsKKwlyZXR1cm4gbGFyZ2VJY29uOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBUYWdWYXJpYWJsZUluZm8gb2JqZWN0cyBhc3NvY2lhdGVkIHdpdGggdGhpcyBUYWdJbmZvLgorICAgICAqCisgICAgICogQHJldHVybiBBcnJheSBvZiBUYWdWYXJpYWJsZUluZm8gb2JqZWN0cyBjb3JyZXNwb25kaW5nIHRvCisgICAgICogICAgICAgICB2YXJpYWJsZXMgZGVjbGFyZWQgYnkgdGhpcyB0YWcsIG9yIGEgemVybyBsZW5ndGgKKyAgICAgKiAgICAgICAgIGFycmF5IGlmIG5vIHZhcmlhYmxlcyBoYXZlIGJlZW4gZGVjbGFyZWQKKyAgICAgKi8KKworICAgIHB1YmxpYyBUYWdWYXJpYWJsZUluZm9bXSBnZXRUYWdWYXJpYWJsZUluZm9zKCkgeworCXJldHVybiB0YWdWYXJpYWJsZUluZm87CisgICAgfQorCisKKyAgICAvLyA9PT09PT09PT09PT09PSBKU1AgMi4wIFRMRCBJbmZvcm1hdGlvbiA9PT09PT09PQorCisgICAgLyoqCisgICAgICogR2V0IGR5bmFtaWNBdHRyaWJ1dGVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFRhZ0luZm8uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGFnIGhhbmRsZXIgc3VwcG9ydHMgZHluYW1pYyBhdHRyaWJ1dGVzCisgICAgICogQHNpbmNlIDIuMAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc0R5bmFtaWNBdHRyaWJ1dGVzKCkgeworICAgICAgICByZXR1cm4gZHluYW1pY0F0dHJpYnV0ZXM7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBwcml2YXRlIGZpZWxkcyBmb3IgMS4xIGluZm8KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyAgICAgICAgICAgICB0YWdOYW1lOyAvLyB0aGUgbmFtZSBvZiB0aGUgdGFnCisgICAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICAgdGFnQ2xhc3NOYW1lOworICAgIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgIGJvZHlDb250ZW50OworICAgIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgIGluZm9TdHJpbmc7CisgICAgcHJpdmF0ZSBUYWdMaWJyYXJ5SW5mbyAgICAgdGFnTGlicmFyeTsKKyAgICBwcml2YXRlIFRhZ0V4dHJhSW5mbyAgICAgICB0YWdFeHRyYUluZm87IC8vIGluc3RhbmNlIG9mIFRhZ0V4dHJhSW5mbworICAgIHByaXZhdGUgVGFnQXR0cmlidXRlSW5mb1tdIGF0dHJpYnV0ZUluZm87CisKKyAgICAvKgorICAgICAqIHByaXZhdGUgZmllbGRzIGZvciAxLjIgaW5mbworICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgIGRpc3BsYXlOYW1lOworICAgIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgIHNtYWxsSWNvbjsKKyAgICBwcml2YXRlIFN0cmluZyAgICAgICAgICAgICBsYXJnZUljb247CisgICAgcHJpdmF0ZSBUYWdWYXJpYWJsZUluZm9bXSAgdGFnVmFyaWFibGVJbmZvOworCisgICAgLyoKKyAgICAgKiBBZGRpdGlvbmFsIHByaXZhdGUgZmllbGRzIGZvciAyLjAgaW5mbworICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBkeW5hbWljQXR0cmlidXRlczsKK30KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC90YWdleHQvVGFnTGlicmFyeUluZm8uamF2YSBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC90YWdleHQvVGFnTGlicmFyeUluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTU0OGJmCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL3RhZ2V4dC9UYWdMaWJyYXJ5SW5mby5qYXZhCkBAIC0wLDAgKzEsMjg2IEBACisvKgorKiBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisgCitwYWNrYWdlIGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dDsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWdJbmZvOworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWdGaWxlSW5mbzsKKworLyoqCisgKiBUcmFuc2xhdGlvbi10aW1lIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCBhIHRhZ2xpYiBkaXJlY3RpdmUsIGFuZCBpdHMKKyAqIHVuZGVybHlpbmcgVExEIGZpbGUuCisgKgorICogTW9zdCBvZiB0aGUgaW5mb3JtYXRpb24gaXMgZGlyZWN0bHkgZnJvbSB0aGUgVExELCBleGNlcHQgZm9yCisgKiB0aGUgcHJlZml4IGFuZCB0aGUgdXJpIHZhbHVlcyB1c2VkIGluIHRoZSB0YWdsaWIgZGlyZWN0aXZlCisgKgorICoKKyAqLworCithYnN0cmFjdCBwdWJsaWMgY2xhc3MgVGFnTGlicmFyeUluZm8geworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuCisgICAgICoKKyAgICAgKiBUaGlzIHdpbGwgaW52b2tlIHRoZSBjb25zdHJ1Y3RvcnMgZm9yIFRhZ0luZm8sIGFuZCBUYWdBdHRyaWJ1dGVJbmZvCisgICAgICogYWZ0ZXIgcGFyc2luZyB0aGUgVExEIGZpbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJlZml4IHRoZSBwcmVmaXggYWN0dWFsbHkgdXNlZCBieSB0aGUgdGFnbGliIGRpcmVjdGl2ZQorICAgICAqIEBwYXJhbSB1cmkgdGhlIFVSSSBhY3R1YWxseSB1c2VkIGJ5IHRoZSB0YWdsaWIgZGlyZWN0aXZlCisgICAgICovCisgICAgcHJvdGVjdGVkIFRhZ0xpYnJhcnlJbmZvKFN0cmluZyBwcmVmaXgsIFN0cmluZyB1cmkpIHsKKwl0aGlzLnByZWZpeCA9IHByZWZpeDsKKwl0aGlzLnVyaSAgICA9IHVyaTsKKyAgICB9CisKKyAgICAvLyA9PT09IG1ldGhvZHMgYWNjZXNzaW5nIHRhZ2xpYiBpbmZvcm1hdGlvbiA9PT09PT09CisKKyAgICAvKioKKyAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIHVyaSBhdHRyaWJ1dGUgZnJvbSB0aGUgdGFnbGliIGRpcmVjdGl2ZSBmb3IgCisgICAgICogdGhpcyBsaWJyYXJ5LgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIHVyaSBhdHRyaWJ1dGUKKyAgICAgKi8KKyAgIAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0VVJJKCkgeworICAgICAgICByZXR1cm4gdXJpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBwcmVmaXggYXNzaWduZWQgdG8gdGhpcyB0YWdsaWIgZnJvbSB0aGUgdGFnbGliIGRpcmVjdGl2ZQorICAgICAqCisgICAgICogQHJldHVybiB0aGUgcHJlZml4IGFzc2lnbmVkIHRvIHRoaXMgdGFnbGliIGZyb20gdGhlIHRhZ2xpYiBkaXJlY3RpdmUKKyAgICAgKi8KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4U3RyaW5nKCkgeworCXJldHVybiBwcmVmaXg7CisgICAgfQorCisgICAgLy8gPT09PSBtZXRob2RzIHVzaW5nIHRoZSBUTEQgZGF0YSA9PT09PT09CisKKyAgICAvKioKKyAgICAgKiBUaGUgcHJlZmVycmVkIHNob3J0IG5hbWUgKHByZWZpeCkgYXMgaW5kaWNhdGVkIGluIHRoZSBUTEQuCisgICAgICogVGhpcyBtYXkgYmUgdXNlZCBieSBhdXRob3JpbmcgdG9vbHMgYXMgdGhlIHByZWZlcnJlZCBwcmVmaXgKKyAgICAgKiB0byB1c2Ugd2hlbiBjcmVhdGluZyBhbiB0YWdsaWIgZGlyZWN0aXZlIGZvciB0aGlzIGxpYnJhcnkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBwcmVmZXJyZWQgc2hvcnQgbmFtZSBmb3IgdGhlIGxpYnJhcnkKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFNob3J0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIHNob3J0bmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgInJlbGlhYmxlIiBVUk4gaW5kaWNhdGVkIGluIHRoZSBUTEQgKHRoZSB1cmkgZWxlbWVudCkuCisgICAgICogVGhpcyBtYXkgYmUgdXNlZCBieSBhdXRob3JpbmcgdG9vbHMgYXMgYSBnbG9iYWwgaWRlbnRpZmllcgorICAgICAqIHRvIHVzZSB3aGVuIGNyZWF0aW5nIGEgdGFnbGliIGRpcmVjdGl2ZSBmb3IgdGhpcyBsaWJyYXJ5LgorICAgICAqCisgICAgICogQHJldHVybiBhIHJlbGlhYmxlIFVSTiB0byBhIFRMRCBsaWtlIHRoaXMKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlbGlhYmxlVVJOKCkgeworICAgICAgICByZXR1cm4gdXJuOworICAgIH0KKworCisgICAgLyoqCisgICAgICogSW5mb3JtYXRpb24gKGRvY3VtZW50YXRpb24pIGZvciB0aGlzIFRMRC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGluZm8gc3RyaW5nIGZvciB0aGlzIHRhZyBsaWIKKyAgICAgKi8KKyAgIAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5mb1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIGluZm87CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBIHN0cmluZyBkZXNjcmliaW5nIHRoZSByZXF1aXJlZCB2ZXJzaW9uIG9mIHRoZSBKU1AgY29udGFpbmVyLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIChtaW5pbWFsKSByZXF1aXJlZCB2ZXJzaW9uIG9mIHRoZSBKU1AgY29udGFpbmVyLgorICAgICAqIEBzZWUgamF2YXguc2VydmxldC5qc3AuSnNwRW5naW5lSW5mbworICAgICAqLworICAgCisgICAgcHVibGljIFN0cmluZyBnZXRSZXF1aXJlZFZlcnNpb24oKSB7CisgICAgICAgIHJldHVybiBqc3B2ZXJzaW9uOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQW4gYXJyYXkgZGVzY3JpYmluZyB0aGUgdGFncyB0aGF0IGFyZSBkZWZpbmVkIGluIHRoaXMgdGFnIGxpYnJhcnkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBUYWdJbmZvIG9iamVjdHMgY29ycmVzcG9uZGluZyB0byB0aGUgdGFncyBkZWZpbmVkIGJ5IHRoaXMKKyAgICAgKiAgICAgICAgIHRhZyBsaWJyYXJ5LCBvciBhIHplcm8gbGVuZ3RoIGFycmF5IGlmIHRoaXMgdGFnIGxpYnJhcnkKKyAgICAgKiAgICAgICAgIGRlZmluZXMgbm8gdGFncworICAgICAqLworICAgIHB1YmxpYyBUYWdJbmZvW10gZ2V0VGFncygpIHsKKyAgICAgICAgcmV0dXJuIHRhZ3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogQW4gYXJyYXkgZGVzY3JpYmluZyB0aGUgdGFnIGZpbGVzIHRoYXQgYXJlIGRlZmluZWQgaW4gdGhpcyB0YWcgbGlicmFyeS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIFRhZ0ZpbGVJbmZvIG9iamVjdHMgY29ycmVzcG9uZGluZyB0byB0aGUgdGFnIGZpbGVzIGRlZmluZWQKKyAgICAgKiAgICAgICAgIGJ5IHRoaXMgdGFnIGxpYnJhcnksIG9yIGEgemVybyBsZW5ndGggYXJyYXkgaWYgdGhpcworICAgICAqICAgICAgICAgdGFnIGxpYnJhcnkgZGVmaW5lcyBubyB0YWdzIGZpbGVzCisgICAgICogQHNpbmNlIDIuMAorICAgICAqLworICAgIHB1YmxpYyBUYWdGaWxlSW5mb1tdIGdldFRhZ0ZpbGVzKCkgeworICAgICAgICByZXR1cm4gdGFnRmlsZXM7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIFRhZ0luZm8gZm9yIGEgZ2l2ZW4gdGFnIG5hbWUsIGxvb2tpbmcgdGhyb3VnaCBhbGwgdGhlCisgICAgICogdGFncyBpbiB0aGlzIHRhZyBsaWJyYXJ5LgorICAgICAqCisgICAgICogQHBhcmFtIHNob3J0bmFtZSBUaGUgc2hvcnQgbmFtZSAobm8gcHJlZml4KSBvZiB0aGUgdGFnCisgICAgICogQHJldHVybiB0aGUgVGFnSW5mbyBmb3IgdGhlIHRhZyB3aXRoIHRoZSBzcGVjaWZpZWQgc2hvcnQgbmFtZSwgb3IKKyAgICAgKiAgICAgICAgIG51bGwgaWYgbm8gc3VjaCB0YWcgaXMgZm91bmQKKyAgICAgKi8KKworICAgIHB1YmxpYyBUYWdJbmZvIGdldFRhZyhTdHJpbmcgc2hvcnRuYW1lKSB7CisgICAgICAgIFRhZ0luZm8gdGFnc1tdID0gZ2V0VGFncygpOworCisgICAgICAgIGlmICh0YWdzID09IG51bGwgfHwgdGFncy5sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGludCBpPTA7IGkgPCB0YWdzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAodGFnc1tpXS5nZXRUYWdOYW1lKCkuZXF1YWxzKHNob3J0bmFtZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGFnc1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIFRhZ0ZpbGVJbmZvIGZvciBhIGdpdmVuIHRhZyBuYW1lLCBsb29raW5nIHRocm91Z2ggYWxsIHRoZQorICAgICAqIHRhZyBmaWxlcyBpbiB0aGlzIHRhZyBsaWJyYXJ5LgorICAgICAqCisgICAgICogQHBhcmFtIHNob3J0bmFtZSBUaGUgc2hvcnQgbmFtZSAobm8gcHJlZml4KSBvZiB0aGUgdGFnCisgICAgICogQHJldHVybiB0aGUgVGFnRmlsZUluZm8gZm9yIHRoZSBzcGVjaWZpZWQgVGFnIGZpbGUsIG9yIG51bGwKKyAgICAgKiAgICAgICAgIGlmIG5vIFRhZyBmaWxlIGlzIGZvdW5kCisgICAgICogQHNpbmNlIDIuMAorICAgICAqLworICAgIHB1YmxpYyBUYWdGaWxlSW5mbyBnZXRUYWdGaWxlKFN0cmluZyBzaG9ydG5hbWUpIHsKKyAgICAgICAgVGFnRmlsZUluZm8gdGFnRmlsZXNbXSA9IGdldFRhZ0ZpbGVzKCk7CisKKyAgICAgICAgaWYgKHRhZ0ZpbGVzID09IG51bGwgfHwgdGFnRmlsZXMubGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgdGFnRmlsZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmICh0YWdGaWxlc1tpXS5nZXROYW1lKCkuZXF1YWxzKHNob3J0bmFtZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGFnRmlsZXNbaV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQW4gYXJyYXkgZGVzY3JpYmluZyB0aGUgZnVuY3Rpb25zIHRoYXQgYXJlIGRlZmluZWQgaW4gdGhpcyB0YWcgbGlicmFyeS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGZ1bmN0aW9ucyBkZWZpbmVkIGluIHRoaXMgdGFnIGxpYnJhcnksIG9yIGEgemVybworICAgICAqICAgICAgICAgbGVuZ3RoIGFycmF5IGlmIHRoZSB0YWcgbGlicmFyeSBkZWZpbmVzIG5vIGZ1bmN0aW9ucy4KKyAgICAgKiBAc2luY2UgMi4wCisgICAgICovCisgICAgcHVibGljIEZ1bmN0aW9uSW5mb1tdIGdldEZ1bmN0aW9ucygpIHsKKyAgICAgICAgcmV0dXJuIGZ1bmN0aW9uczsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgRnVuY3Rpb25JbmZvIGZvciBhIGdpdmVuIGZ1bmN0aW9uIG5hbWUsIGxvb2tpbmcgdGhyb3VnaCBhbGwgdGhlCisgICAgICogZnVuY3Rpb25zIGluIHRoaXMgdGFnIGxpYnJhcnkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSAobm8gcHJlZml4KSBvZiB0aGUgZnVuY3Rpb24KKyAgICAgKiBAcmV0dXJuIHRoZSBGdW5jdGlvbkluZm8gZm9yIHRoZSBmdW5jdGlvbiB3aXRoIHRoZSBnaXZlbiBuYW1lLCBvciBudWxsCisgICAgICogICAgICAgICBpZiBubyBzdWNoIGZ1bmN0aW9uIGV4aXN0cworICAgICAqIEBzaW5jZSAyLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgRnVuY3Rpb25JbmZvIGdldEZ1bmN0aW9uKFN0cmluZyBuYW1lKSB7CisKKyAgICAgICAgaWYgKGZ1bmN0aW9ucyA9PSBudWxsIHx8IGZ1bmN0aW9ucy5sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJObyBmdW5jdGlvbnMiKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgZnVuY3Rpb25zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoZnVuY3Rpb25zW2ldLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb25zW2ldOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworCisgICAgLy8gUHJvdGVjdGVkIGZpZWxkcworCisgICAgLyoqCisgICAgICogVGhlIHByZWZpeCBhc3NpZ25lZCB0byB0aGlzIHRhZ2xpYiBmcm9tIHRoZSB0YWdsaWIgZGlyZWN0aXZlLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgICAgICAgIHByZWZpeDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIHVyaSBhdHRyaWJ1dGUgZnJvbSB0aGUgdGFnbGliIGRpcmVjdGl2ZSBmb3IgCisgICAgICogdGhpcyBsaWJyYXJ5LgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgICAgICAgIHVyaTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBBbiBhcnJheSBkZXNjcmliaW5nIHRoZSB0YWdzIHRoYXQgYXJlIGRlZmluZWQgaW4gdGhpcyB0YWcgbGlicmFyeS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgVGFnSW5mb1tdICAgICB0YWdzOworICAgIAorICAgIC8qKgorICAgICAqIEFuIGFycmF5IGRlc2NyaWJpbmcgdGhlIHRhZyBmaWxlcyB0aGF0IGFyZSBkZWZpbmVkIGluIHRoaXMgdGFnIGxpYnJhcnkuCisgICAgICoKKyAgICAgKiBAc2luY2UgMi4wCisgICAgICovCisgICAgcHJvdGVjdGVkIFRhZ0ZpbGVJbmZvW10gdGFnRmlsZXM7CisgICAgCisgICAgLyoqCisgICAgICogQW4gYXJyYXkgZGVzY3JpYmluZyB0aGUgZnVuY3Rpb25zIHRoYXQgYXJlIGRlZmluZWQgaW4gdGhpcyB0YWcgbGlicmFyeS4KKyAgICAgKgorICAgICAqIEBzaW5jZSAyLjAKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRnVuY3Rpb25JbmZvW10gZnVuY3Rpb25zOworCisgICAgLy8gVGFnIExpYnJhcnkgRGF0YQorICAgIAorICAgIC8qKgorICAgICAqIFRoZSB2ZXJzaW9uIG9mIHRoZSB0YWcgbGlicmFyeS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHRsaWJ2ZXJzaW9uOyAvLyByZXF1aXJlZAorICAgIAorICAgIC8qKgorICAgICAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBKU1Agc3BlY2lmaWNhdGlvbiB0aGlzIHRhZyBsaWJyYXJ5IGlzIHdyaXR0ZW4gdG8uCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBqc3B2ZXJzaW9uOyAgLy8gcmVxdWlyZWQKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgcHJlZmVycmVkIHNob3J0IG5hbWUgKHByZWZpeCkgYXMgaW5kaWNhdGVkIGluIHRoZSBUTEQuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBzaG9ydG5hbWU7ICAgLy8gcmVxdWlyZWQKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgInJlbGlhYmxlIiBVUk4gaW5kaWNhdGVkIGluIHRoZSBUTEQuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyB1cm47ICAgICAgICAgLy8gcmVxdWlyZWQKKyAgICAKKyAgICAvKioKKyAgICAgKiBJbmZvcm1hdGlvbiAoZG9jdW1lbnRhdGlvbikgZm9yIHRoaXMgVExELgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgaW5mbzsgICAgICAgIC8vIG9wdGlvbmFsCit9CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvdGFnZXh0L1RhZ0xpYnJhcnlWYWxpZGF0b3IuamF2YSBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC90YWdleHQvVGFnTGlicmFyeVZhbGlkYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxYWNiODEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvdGFnZXh0L1RhZ0xpYnJhcnlWYWxpZGF0b3IuamF2YQpAQCAtMCwwICsxLDE0MyBAQAorLyoKKyogQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitwYWNrYWdlIGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dDsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogVHJhbnNsYXRpb24tdGltZSB2YWxpZGF0b3IgY2xhc3MgZm9yIGEgSlNQIHBhZ2UuIAorICogQSB2YWxpZGF0b3Igb3BlcmF0ZXMgb24gdGhlIFhNTCB2aWV3IGFzc29jaWF0ZWQgd2l0aCB0aGUgSlNQIHBhZ2UuCisgKgorICogPHA+CisgKiBUaGUgVExEIGZpbGUgYXNzb2NpYXRlcyBhIFRhZ0xpYnJhcnlWYWxpZGF0b3IgY2xhc3MgYW5kIHNvbWUgaW5pdAorICogYXJndW1lbnRzIHdpdGggYSB0YWcgbGlicmFyeS4KKyAqCisgKiA8cD4KKyAqIFRoZSBKU1AgY29udGFpbmVyIGlzIHJlcG9uc2libGUgZm9yIGxvY2F0aW5nIGFuIGFwcHJvcHJpYXRlCisgKiBpbnN0YW5jZSBvZiB0aGUgYXBwcm9wcmlhdGUgc3ViY2xhc3MgYnkKKyAqCisgKiA8dWw+CisgKiA8bGk+IG5ldyBhIGZyZXNoIGluc3RhbmNlLCBvciByZXVzZSBhbiBhdmFpbGFibGUgb25lCisgKiA8bGk+IGludm9rZSB0aGUgc2V0SW5pdFBhcmFtcyhNYXApIG1ldGhvZCBvbiB0aGUgaW5zdGFuY2UKKyAqIDwvdWw+CisgKgorICogb25jZSBpbml0aWFsaXplZCwgdGhlIHZhbGlkYXRlKFN0cmluZywgU3RyaW5nLCBQYWdlRGF0YSkgbWV0aG9kIHdpbGwKKyAqIGJlIGludm9rZWQsIHdoZXJlIHRoZSBmaXJzdCB0d28gYXJndW1lbnRzIGFyZSB0aGUgcHJlZml4CisgKiBhbmQgdXJpIGZvciB0aGlzIHRhZyBsaWJyYXJ5IGluIHRoZSBYTUwgVmlldy4gIFRoZSBwcmVmaXggaXMgaW50ZW5kZWQKKyAqIHRvIG1ha2UgaXQgZWFzaWVyIHRvIHByb2R1Y2UgYW4gZXJyb3IgbWVzc2FnZS4gIEhvd2V2ZXIsIGl0IGlzIG5vdAorICogYWx3YXlzIGFjY3VyYXRlLiAgSW4gdGhlIGNhc2Ugd2hlcmUgYSBzaW5nbGUgVVJJIGlzIG1hcHBlZCB0byBtb3JlIAorICogdGhhbiBvbmUgcHJlZml4IGluIHRoZSBYTUwgdmlldywgdGhlIHByZWZpeCBvZiB0aGUgZmlyc3QgVVJJIGlzIHByb3ZpZGVkLgorICogVGhlcmVmb3JlLCB0byBwcm92aWRlIGhpZ2ggcXVhbGl0eSBlcnJvciBtZXNzYWdlcyBpbiBjYXNlcyB3aGVyZSB0aGUgCisgKiB0YWcgZWxlbWVudHMgdGhlbXNlbHZlcyBhcmUgY2hlY2tlZCwgdGhlIHByZWZpeCBwYXJhbWV0ZXIgc2hvdWxkIGJlIAorICogaWdub3JlZCBhbmQgdGhlIGFjdHVhbCBwcmVmaXggb2YgdGhlIGVsZW1lbnQgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZC4gIAorICogVGFnTGlicmFyeVZhbGlkYXRvcnMgc2hvdWxkIGFsd2F5cyB1c2UgdGhlIHVyaSB0byBpZGVudGlmeSBlbGVtZW50cyAKKyAqIGFzIGJlbG9uaW5nIHRvIHRoZSB0YWcgbGlicmFyeSwgbm90IHRoZSBwcmVmaXguCisgKgorICogPHA+CisgKiBBIFRhZ0xpYnJhcnlWYWxpZGF0b3IgaW5zdGFuY2UKKyAqIG1heSBjcmVhdGUgYXV4aWxpYXJ5IG9iamVjdHMgaW50ZXJuYWxseSB0byBwZXJmb3JtCisgKiB0aGUgdmFsaWRhdGlvbiAoZS5nLiBhbiBYU2NoZW1hIHZhbGlkYXRvcikgYW5kIG1heSByZXVzZSBpdCBmb3IgYWxsCisgKiB0aGUgcGFnZXMgaW4gYSBnaXZlbiB0cmFuc2xhdGlvbiBydW4uCisgKgorICogPHA+CisgKiBUaGUgSlNQIGNvbnRhaW5lciBpcyBub3QgZ3VhcmFudGVlZCB0byBzZXJpYWxpemUgaW52b2NhdGlvbnMgb2YKKyAqIHZhbGlkYXRlKCkgbWV0aG9kLCBhbmQgVGFnTGlicmFyeVZhbGlkYXRvcnMgc2hvdWxkIHBlcmZvcm0gYW55CisgKiBzeW5jaHJvbml6YXRpb24gdGhleSBtYXkgcmVxdWlyZS4KKyAqCisgKiA8cD4KKyAqIEFzIG9mIEpTUCAyLjAsIGEgSlNQIGNvbnRhaW5lciBtdXN0IHByb3ZpZGUgYSBqc3A6aWQgYXR0cmlidXRlIHRvCisgKiBwcm92aWRlIGhpZ2hlciBxdWFsaXR5IHZhbGlkYXRpb24gZXJyb3JzLgorICogVGhlIGNvbnRhaW5lciB3aWxsIHRyYWNrIHRoZSBKU1AgcGFnZXMKKyAqIGFzIHBhc3NlZCB0byB0aGUgY29udGFpbmVyLCBhbmQgd2lsbCBhc3NpZ24gdG8gZWFjaCBlbGVtZW50CisgKiBhIHVuaXF1ZSAiaWQiLCB3aGljaCBpcyBwYXNzZWQgYXMgdGhlIHZhbHVlIG9mIHRoZSBqc3A6aWQKKyAqIGF0dHJpYnV0ZS4gIEVhY2ggWE1MIGVsZW1lbnQgaW4gdGhlIFhNTCB2aWV3IGF2YWlsYWJsZSB3aWxsCisgKiBiZSBleHRlbmRlZCB3aXRoIHRoaXMgYXR0cmlidXRlLiAgVGhlIFRhZ0xpYnJhcnlWYWxpZGF0b3IKKyAqIGNhbiB0aGVuIHVzZSB0aGUgYXR0cmlidXRlIGluIG9uZSBvciBtb3JlIFZhbGlkYXRpb25NZXNzYWdlCisgKiBvYmplY3RzLiAgVGhlIGNvbnRhaW5lciB0aGVuLCBpbiB0dXJuLCBjYW4gdXNlIHRoZXNlCisgKiB2YWx1ZXMgdG8gcHJvdmlkZSBtb3JlIHByZWNpc2UgaW5mb3JtYXRpb24gb24gdGhlIGxvY2F0aW9uCisgKiBvZiBhbiBlcnJvci4KKyAqCisgKiA8cD4KKyAqIFRoZSBhY3R1YWwgcHJlZml4IG9mIHRoZSA8Y29kZT5pZDwvY29kZT4gYXR0cmlidXRlIG1heSBvciBtYXkgbm90IGJlIAorICogPGNvZGU+anNwPC9jb2RlPiBidXQgaXQgd2lsbCBhbHdheXMgbWFwIHRvIHRoZSBuYW1lc3BhY2UKKyAqIDxjb2RlPmh0dHA6Ly9qYXZhLnN1bi5jb20vSlNQL1BhZ2U8L2NvZGU+LiAgQSBUYWdMaWJyYXJ5VmFsaWRhdG9yCisgKiBpbXBsZW1lbnRhdGlvbiBtdXN0IHJlbHkgb24gdGhlIHVyaSwgbm90IHRoZSBwcmVmaXgsIG9mIHRoZSA8Y29kZT5pZDwvY29kZT4KKyAqIGF0dHJpYnV0ZS4KKyAqLworCithYnN0cmFjdCBwdWJsaWMgY2xhc3MgVGFnTGlicmFyeVZhbGlkYXRvciB7CisKKyAgICAvKioKKyAgICAgKiBTb2xlIGNvbnN0cnVjdG9yLiAoRm9yIGludm9jYXRpb24gYnkgc3ViY2xhc3MgY29uc3RydWN0b3JzLCAKKyAgICAgKiB0eXBpY2FsbHkgaW1wbGljaXQuKQorICAgICAqLworICAgIHB1YmxpYyBUYWdMaWJyYXJ5VmFsaWRhdG9yKCkgeworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGluaXQgZGF0YSBpbiB0aGUgVExEIGZvciB0aGlzIHZhbGlkYXRvci4KKyAgICAgKiBQYXJhbWV0ZXIgbmFtZXMgYXJlIGtleXMsIGFuZCBwYXJhbWV0ZXIgdmFsdWVzIGFyZSB0aGUgdmFsdWVzLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcCBBIE1hcCBkZXNjcmliaW5nIHRoZSBpbml0IHBhcmFtZXRlcnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJbml0UGFyYW1ldGVycyhNYXAgbWFwKSB7CisJaW5pdFBhcmFtZXRlcnMgPSBtYXA7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGluaXQgcGFyYW1ldGVycyBkYXRhIGFzIGFuIGltbXV0YWJsZSBNYXAuCisgICAgICogUGFyYW1ldGVyIG5hbWVzIGFyZSBrZXlzLCBhbmQgcGFyYW1ldGVyIHZhbHVlcyBhcmUgdGhlIHZhbHVlcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGluaXQgcGFyYW1ldGVycyBhcyBhbiBpbW11dGFibGUgbWFwLgorICAgICAqLworICAgIHB1YmxpYyBNYXAgZ2V0SW5pdFBhcmFtZXRlcnMoKSB7CisJcmV0dXJuIGluaXRQYXJhbWV0ZXJzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFZhbGlkYXRlIGEgSlNQIHBhZ2UuCisgICAgICogVGhpcyB3aWxsIGdldCBpbnZva2VkIG9uY2UgcGVyIHVuaXF1ZSB0YWcgbGlicmFyeSBVUkkgaW4gdGhlCisgICAgICogWE1MIHZpZXcuICBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBudWxsIGlmIHRoZSBwYWdlIGlzIHZhbGlkOyBvdGhlcndpc2UKKyAgICAgKiB0aGUgbWV0aG9kIHNob3VsZCByZXR1cm4gYW4gYXJyYXkgb2YgVmFsaWRhdGlvbk1lc3NhZ2Ugb2JqZWN0cy4KKyAgICAgKiBBbiBhcnJheSBvZiBsZW5ndGggemVybyBpcyBhbHNvIGludGVycHJldGVkIGFzIG5vIGVycm9ycy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcmVmaXggdGhlIGZpcnN0IHByZWZpeCB3aXRoIHdoaWNoIHRoZSB0YWcgbGlicmFyeSBpcyAKKyAgICAgKiAgICAgYXNzb2NpYXRlZCwgaW4gdGhlIFhNTCB2aWV3LiAgTm90ZSB0aGF0IHNvbWUgdGFncyBtYXkgdXNlIAorICAgICAqICAgICBhIGRpZmZlcmVudCBwcmVmaXggaWYgdGhlIG5hbWVzcGFjZSBpcyByZWRlZmluZWQuCisgICAgICogQHBhcmFtIHVyaSB0aGUgdGFnIGxpYnJhcnkncyB1bmlxdWUgaWRlbnRpZmllcgorICAgICAqIEBwYXJhbSBwYWdlIHRoZSBKc3BEYXRhIHBhZ2Ugb2JqZWN0CisgICAgICogQHJldHVybiBBIG51bGwgb2JqZWN0LCBvciB6ZXJvIGxlbmd0aCBhcnJheSBpZiBubyBlcnJvcnMsIGFuIGFycmF5CisgICAgICogb2YgVmFsaWRhdGlvbk1lc3NhZ2VzIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgVmFsaWRhdGlvbk1lc3NhZ2VbXSB2YWxpZGF0ZShTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpLCAKKyAgICAgICAgUGFnZURhdGEgcGFnZSkgCisgICAgeworCXJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbGVhc2UgYW55IGRhdGEga2VwdCBieSB0aGlzIGluc3RhbmNlIGZvciB2YWxpZGF0aW9uIHB1cnBvc2VzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7CisJaW5pdFBhcmFtZXRlcnMgPSBudWxsOworICAgIH0KKworICAgIC8vIFByaXZhdGUgZGF0YQorICAgIHByaXZhdGUgTWFwIGluaXRQYXJhbWV0ZXJzOworCit9CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvdGFnZXh0L1RhZ1N1cHBvcnQuamF2YSBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC90YWdleHQvVGFnU3VwcG9ydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlNmNhM2MKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvdGFnZXh0L1RhZ1N1cHBvcnQuamF2YQpAQCAtMCwwICsxLDI5MyBAQAorLyoKKyogQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworcGFja2FnZSBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQ7CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLkpzcEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC5QYWdlQ29udGV4dDsKKworLyoqCisgKiBBIGJhc2UgY2xhc3MgZm9yIGRlZmluaW5nIG5ldyB0YWcgaGFuZGxlcnMgaW1wbGVtZW50aW5nIFRhZy4KKyAqCisgKiA8cD4gVGhlIFRhZ1N1cHBvcnQgY2xhc3MgaXMgYSB1dGlsaXR5IGNsYXNzIGludGVuZGVkIHRvIGJlIHVzZWQgYXMKKyAqIHRoZSBiYXNlIGNsYXNzIGZvciBuZXcgdGFnIGhhbmRsZXJzLiAgVGhlIFRhZ1N1cHBvcnQgY2xhc3MKKyAqIGltcGxlbWVudHMgdGhlIFRhZyBhbmQgSXRlcmF0aW9uVGFnIGludGVyZmFjZXMgYW5kIGFkZHMgYWRkaXRpb25hbAorICogY29udmVuaWVuY2UgbWV0aG9kcyBpbmNsdWRpbmcgZ2V0dGVyIG1ldGhvZHMgZm9yIHRoZSBwcm9wZXJ0aWVzIGluCisgKiBUYWcuICBUYWdTdXBwb3J0IGhhcyBvbmUgc3RhdGljIG1ldGhvZCB0aGF0IGlzIGluY2x1ZGVkIHRvCisgKiBmYWNpbGl0YXRlIGNvb3JkaW5hdGlvbiBhbW9uZyBjb29wZXJhdGluZyB0YWdzLgorICoKKyAqIDxwPiBNYW55IHRhZyBoYW5kbGVycyB3aWxsIGV4dGVuZCBUYWdTdXBwb3J0IGFuZCBvbmx5IHJlZGVmaW5lIGEKKyAqIGZldyBtZXRob2RzLiAKKyAqLworCitwdWJsaWMgY2xhc3MgVGFnU3VwcG9ydCBpbXBsZW1lbnRzIEl0ZXJhdGlvblRhZywgU2VyaWFsaXphYmxlIHsKKworICAgIC8qKgorICAgICAqIEZpbmQgdGhlIGluc3RhbmNlIG9mIGEgZ2l2ZW4gY2xhc3MgdHlwZSB0aGF0IGlzIGNsb3Nlc3QgdG8gYSBnaXZlbgorICAgICAqIGluc3RhbmNlLgorICAgICAqIFRoaXMgbWV0aG9kIHVzZXMgdGhlIGdldFBhcmVudCBtZXRob2QgZnJvbSB0aGUgVGFnCisgICAgICogaW50ZXJmYWNlLgorICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgZm9yIGNvb3JkaW5hdGlvbiBhbW9uZyBjb29wZXJhdGluZyB0YWdzLgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgc3BlY2lmaWNhdGlvbiBvbmx5IHByb3ZpZGVzIG9uZSBmb3JtYWwKKyAgICAgKiB3YXkgb2YgaW5kaWNhdGluZyB0aGUgb2JzZXJ2YWJsZSB0eXBlIG9mIGEgdGFnIGhhbmRsZXI6IGl0cworICAgICAqIHRhZyBoYW5kbGVyIGltcGxlbWVudGF0aW9uIGNsYXNzLCBkZXNjcmliZWQgaW4gdGhlIHRhZy1jbGFzcworICAgICAqIHN1YmVsZW1lbnQgb2YgdGhlIHRhZyBlbGVtZW50LiAgVGhpcyBpcyBleHRlbmRlZCBpbiBhbgorICAgICAqIGluZm9ybWFsIG1hbm5lciBieSBhbGxvd2luZyB0aGUgdGFnIGxpYnJhcnkgYXV0aG9yIHRvCisgICAgICogaW5kaWNhdGUgaW4gdGhlIGRlc2NyaXB0aW9uIHN1YmVsZW1lbnQgYW4gb2JzZXJ2YWJsZSB0eXBlLgorICAgICAqIFRoZSB0eXBlIHNob3VsZCBiZSBhIHN1YnR5cGUgb2YgdGhlIHRhZyBoYW5kbGVyIGltcGxlbWVudGF0aW9uCisgICAgICogY2xhc3Mgb3Igdm9pZC4KKyAgICAgKiBUaGlzIGFkZGl0aXRpb25hbCBjb25zdHJhaW50IGNhbiBiZSBleHBsb2l0ZWQgYnkgYQorICAgICAqIHNwZWNpYWxpemVkIGNvbnRhaW5lciB0aGF0IGtub3dzIGFib3V0IHRoYXQgc3BlY2lmaWMgdGFnIGxpYnJhcnksCisgICAgICogYXMgaW4gdGhlIGNhc2Ugb2YgdGhlIEpTUCBzdGFuZGFyZCB0YWcgbGlicmFyeS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFdoZW4gYSB0YWcgbGlicmFyeSBhdXRob3IgcHJvdmlkZXMgaW5mb3JtYXRpb24gb24gdGhlCisgICAgICogb2JzZXJ2YWJsZSB0eXBlIG9mIGEgdGFnIGhhbmRsZXIsIGNsaWVudCBwcm9ncmFtbWF0aWMgY29kZQorICAgICAqIHNob3VsZCBhZGhlcmUgdG8gdGhhdCBjb25zdHJhaW50LiAgU3BlY2lmaWNhbGx5LCB0aGUgQ2xhc3MKKyAgICAgKiBwYXNzZWQgdG8gZmluZEFuY2VzdG9yV2l0aENsYXNzIHNob3VsZCBiZSBhIHN1YnR5cGUgb2YgdGhlCisgICAgICogb2JzZXJ2YWJsZSB0eXBlLgorICAgICAqIAorICAgICAqCisgICAgICogQHBhcmFtIGZyb20gVGhlIGluc3RhbmNlIGZyb20gd2hlcmUgdG8gc3RhcnQgbG9va2luZy4KKyAgICAgKiBAcGFyYW0ga2xhc3MgVGhlIHN1YmNsYXNzIG9mIFRhZyBvciBpbnRlcmZhY2UgdG8gYmUgbWF0Y2hlZAorICAgICAqIEByZXR1cm4gdGhlIG5lYXJlc3QgYW5jZXN0b3IgdGhhdCBpbXBsZW1lbnRzIHRoZSBpbnRlcmZhY2UKKyAgICAgKiBvciBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgY2xhc3Mgc3BlY2lmaWVkCisgICAgICovCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFRhZyBmaW5kQW5jZXN0b3JXaXRoQ2xhc3MoVGFnIGZyb20sIENsYXNzIGtsYXNzKSB7CisJYm9vbGVhbiBpc0ludGVyZmFjZSA9IGZhbHNlOworCisJaWYgKGZyb20gPT0gbnVsbCB8fAorCSAgICBrbGFzcyA9PSBudWxsIHx8CisJICAgICghVGFnLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oa2xhc3MpICYmCisJICAgICAhKGlzSW50ZXJmYWNlID0ga2xhc3MuaXNJbnRlcmZhY2UoKSkpKSB7CisJICAgIHJldHVybiBudWxsOworCX0KKworCWZvciAoOzspIHsKKwkgICAgVGFnIHRhZyA9IGZyb20uZ2V0UGFyZW50KCk7CisKKwkgICAgaWYgKHRhZyA9PSBudWxsKSB7CisJCXJldHVybiBudWxsOworCSAgICB9CisKKwkgICAgaWYgKChpc0ludGVyZmFjZSAmJiBrbGFzcy5pc0luc3RhbmNlKHRhZykpIHx8CisJICAgICAgICBrbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHRhZy5nZXRDbGFzcygpKSkKKwkJcmV0dXJuIHRhZzsKKwkgICAgZWxzZQorCQlmcm9tID0gdGFnOworCX0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLCBhbGwgc3ViY2xhc3NlcyBhcmUgcmVxdWlyZWQgdG8gZGVmaW5lIG9ubHkKKyAgICAgKiBhIHB1YmxpYyBjb25zdHJ1Y3RvciB3aXRoIHRoZSBzYW1lIHNpZ25hdHVyZSwgYW5kIHRvIGNhbGwgdGhlCisgICAgICogc3VwZXJjbGFzcyBjb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIFRoaXMgY29uc3RydWN0b3IgaXMgY2FsbGVkIGJ5IHRoZSBjb2RlIGdlbmVyYXRlZCBieSB0aGUgSlNQCisgICAgICogdHJhbnNsYXRvci4KKyAgICAgKi8KKworICAgIHB1YmxpYyBUYWdTdXBwb3J0KCkgeyB9CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IHByb2Nlc3Npbmcgb2YgdGhlIHN0YXJ0IHRhZywgcmV0dXJuaW5nIFNLSVBfQk9EWS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gU0tJUF9CT0RZCisgICAgICogQHRocm93cyBKc3BFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHByb2Nlc3NpbmcgdGhpcyB0YWcKKyAgICAgKgorICAgICAqIEBzZWUgVGFnI2RvU3RhcnRUYWcoKQorICAgICAqLworIAorICAgIHB1YmxpYyBpbnQgZG9TdGFydFRhZygpIHRocm93cyBKc3BFeGNlcHRpb24geworICAgICAgICByZXR1cm4gU0tJUF9CT0RZOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlZmF1bHQgcHJvY2Vzc2luZyBvZiB0aGUgZW5kIHRhZyByZXR1cm5pbmcgRVZBTF9QQUdFLgorICAgICAqCisgICAgICogQHJldHVybiBFVkFMX1BBR0UKKyAgICAgKiBAdGhyb3dzIEpzcEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgcHJvY2Vzc2luZyB0aGlzIHRhZworICAgICAqCisgICAgICogQHNlZSBUYWcjZG9FbmRUYWcoKQorICAgICAqLworCisgICAgcHVibGljIGludCBkb0VuZFRhZygpIHRocm93cyBKc3BFeGNlcHRpb24geworCXJldHVybiBFVkFMX1BBR0U7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IHByb2Nlc3NpbmcgZm9yIGEgYm9keS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gU0tJUF9CT0RZCisgICAgICogQHRocm93cyBKc3BFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHByb2Nlc3NpbmcgdGhpcyB0YWcKKyAgICAgKgorICAgICAqIEBzZWUgSXRlcmF0aW9uVGFnI2RvQWZ0ZXJCb2R5KCkKKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgaW50IGRvQWZ0ZXJCb2R5KCkgdGhyb3dzIEpzcEV4Y2VwdGlvbiB7CisJcmV0dXJuIFNLSVBfQk9EWTsKKyAgICB9CisKKyAgICAvLyBBY3Rpb25zIHJlbGF0ZWQgdG8gYm9keSBldmFsdWF0aW9uCisKKworICAgIC8qKgorICAgICAqIFJlbGVhc2Ugc3RhdGUuCisgICAgICoKKyAgICAgKiBAc2VlIFRhZyNyZWxlYXNlKCkKKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7CisJcGFyZW50ID0gbnVsbDsKKwlpZCA9IG51bGw7CisJaWYoIHZhbHVlcyAhPSBudWxsICkgeworCSAgICB2YWx1ZXMuY2xlYXIoKTsKKwl9CisJdmFsdWVzID0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG5lc3RpbmcgdGFnIG9mIHRoaXMgdGFnLgorICAgICAqCisgICAgICogQHBhcmFtIHQgVGhlIHBhcmVudCBUYWcuCisgICAgICogQHNlZSBUYWcjc2V0UGFyZW50KFRhZykKKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIHNldFBhcmVudChUYWcgdCkgeworCXBhcmVudCA9IHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIFRhZyBpbnN0YW5jZSBtb3N0IGNsb3NlbHkgZW5jbG9zaW5nIHRoaXMgdGFnIGluc3RhbmNlLgorICAgICAqIEBzZWUgVGFnI2dldFBhcmVudCgpCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBwYXJlbnQgdGFnIGluc3RhbmNlIG9yIG51bGwKKyAgICAgKi8KKworICAgIHB1YmxpYyBUYWcgZ2V0UGFyZW50KCkgeworCXJldHVybiBwYXJlbnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBpZCBhdHRyaWJ1dGUgZm9yIHRoaXMgdGFnLgorICAgICAqCisgICAgICogQHBhcmFtIGlkIFRoZSBTdHJpbmcgZm9yIHRoZSBpZC4KKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBpZCkgeworCXRoaXMuaWQgPSBpZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIGlkIGF0dHJpYnV0ZSBvZiB0aGlzIHRhZzsgb3IgbnVsbC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBpZCBhdHRyaWJ1dGUsIG9yIG51bGwKKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkgeworCXJldHVybiBpZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHBhZ2UgY29udGV4dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYWdlQ29udGV4dCBUaGUgUGFnZUNvbnRleHQuCisgICAgICogQHNlZSBUYWcjc2V0UGFnZUNvbnRleHQKKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIHNldFBhZ2VDb250ZXh0KFBhZ2VDb250ZXh0IHBhZ2VDb250ZXh0KSB7CisJdGhpcy5wYWdlQ29udGV4dCA9IHBhZ2VDb250ZXh0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEFzc29jaWF0ZSBhIHZhbHVlIHdpdGggYSBTdHJpbmcga2V5LgorICAgICAqCisgICAgICogQHBhcmFtIGsgVGhlIGtleSBTdHJpbmcuCisgICAgICogQHBhcmFtIG8gVGhlIHZhbHVlIHRvIGFzc29jaWF0ZS4KKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBrLCBPYmplY3QgbykgeworCWlmICh2YWx1ZXMgPT0gbnVsbCkgeworCSAgICB2YWx1ZXMgPSBuZXcgSGFzaHRhYmxlKCk7CisJfQorCXZhbHVlcy5wdXQoaywgbyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGEgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBhIGtleS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBrIFRoZSBzdHJpbmcga2V5LgorICAgICAqIEByZXR1cm4gVGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5LCBvciBudWxsLgorICAgICAqLworCisgICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZShTdHJpbmcgaykgeworCWlmICh2YWx1ZXMgPT0gbnVsbCkgeworCSAgICByZXR1cm4gbnVsbDsKKwl9IGVsc2UgeworCSAgICByZXR1cm4gdmFsdWVzLmdldChrKTsKKwl9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlIGEgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGEga2V5LgorICAgICAqCisgICAgICogQHBhcmFtIGsgVGhlIHN0cmluZyBrZXkuCisgICAgICovCisKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVWYWx1ZShTdHJpbmcgaykgeworCWlmICh2YWx1ZXMgIT0gbnVsbCkgeworCSAgICB2YWx1ZXMucmVtb3ZlKGspOworCX0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbnVtZXJhdGUgdGhlIGtleXMgZm9yIHRoZSB2YWx1ZXMga2VwdCBieSB0aGlzIHRhZyBoYW5kbGVyLgorICAgICAqCisgICAgICogQHJldHVybiBBbiBlbnVtZXJhdGlvbiBvZiBhbGwgdGhlIGtleXMgZm9yIHRoZSB2YWx1ZXMgc2V0LAorICAgICAqICAgICBvciBudWxsIG9yIGFuIGVtcHR5IEVudW1lcmF0aW9uIGlmIG5vIHZhbHVlcyBoYXZlIGJlZW4gc2V0LgorICAgICAqLworCisgICAgcHVibGljIEVudW1lcmF0aW9uIGdldFZhbHVlcygpIHsKKwlpZiAodmFsdWVzID09IG51bGwpIHsKKwkgICAgcmV0dXJuIG51bGw7CisJfQorCXJldHVybiB2YWx1ZXMua2V5cygpOworICAgIH0KKworICAgIC8vIHByaXZhdGUgZmllbGRzCisKKyAgICBwcml2YXRlICAgVGFnICAgICAgICAgcGFyZW50OworICAgIHByaXZhdGUgICBIYXNodGFibGUgICB2YWx1ZXM7CisgICAgLyoqCisgICAgICogVGhlIHZhbHVlIG9mIHRoZSBpZCBhdHRyaWJ1dGUgb2YgdGhpcyB0YWc7IG9yIG51bGwuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZwkgIGlkOworCisgICAgLy8gcHJvdGVjdGVkIGZpZWxkcworCisgICAgLyoqCisgICAgICogVGhlIFBhZ2VDb250ZXh0LgorICAgICAqLworICAgIHByb3RlY3RlZCBQYWdlQ29udGV4dCBwYWdlQ29udGV4dDsKK30KKwpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL3RhZ2V4dC9UYWdWYXJpYWJsZUluZm8uamF2YSBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC90YWdleHQvVGFnVmFyaWFibGVJbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmExNzU5ZgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC90YWdleHQvVGFnVmFyaWFibGVJbmZvLmphdmEKQEAgLTAsMCArMSwxMjAgQEAKKy8qCisqIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworIAorcGFja2FnZSBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQ7CisKKy8qKgorICogVmFyaWFibGUgaW5mb3JtYXRpb24gZm9yIGEgdGFnIGluIGEgVGFnIExpYnJhcnk7CisgKiBUaGlzIGNsYXNzIGlzIGluc3RhbnRpYXRlZCBmcm9tIHRoZSBUYWcgTGlicmFyeSBEZXNjcmlwdG9yIGZpbGUgKFRMRCkKKyAqIGFuZCBpcyBhdmFpbGFibGUgb25seSBhdCB0cmFuc2xhdGlvbiB0aW1lLgorICoKKyAqIFRoaXMgb2JqZWN0IHNob3VsZCBiZSBpbW11dGFibGUuCisgKgorICogVGhpcyBpbmZvcm1hdGlvbiBpcyBvbmx5IGF2YWlsYWJsZSBpbiBKU1AgMS4yIGZvcm1hdCBUTERzIG9yIGFib3ZlLgorICovCisKK3B1YmxpYyBjbGFzcyBUYWdWYXJpYWJsZUluZm8geworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIFRhZ1ZhcmlhYmxlSW5mby4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lR2l2ZW4gdmFsdWUgb2YgJmx0O25hbWUtZ2l2ZW4mZ3Q7CisgICAgICogQHBhcmFtIG5hbWVGcm9tQXR0cmlidXRlIHZhbHVlIG9mICZsdDtuYW1lLWZyb20tYXR0cmlidXRlJmd0OworICAgICAqIEBwYXJhbSBjbGFzc05hbWUgdmFsdWUgb2YgJmx0O3ZhcmlhYmxlLWNsYXNzJmd0OworICAgICAqIEBwYXJhbSBkZWNsYXJlIHZhbHVlIG9mICZsdDtkZWNsYXJlJmd0OworICAgICAqIEBwYXJhbSBzY29wZSB2YWx1ZSBvZiAmbHQ7c2NvcGUmZ3Q7CisgICAgICovCisgICAgcHVibGljIFRhZ1ZhcmlhYmxlSW5mbygKKwkgICAgU3RyaW5nIG5hbWVHaXZlbiwKKwkgICAgU3RyaW5nIG5hbWVGcm9tQXR0cmlidXRlLAorCSAgICBTdHJpbmcgY2xhc3NOYW1lLAorCSAgICBib29sZWFuIGRlY2xhcmUsCisJICAgIGludCBzY29wZSkgeworCXRoaXMubmFtZUdpdmVuICAgICAgICAgPSBuYW1lR2l2ZW47CisJdGhpcy5uYW1lRnJvbUF0dHJpYnV0ZSA9IG5hbWVGcm9tQXR0cmlidXRlOworCXRoaXMuY2xhc3NOYW1lICAgICAgICAgPSBjbGFzc05hbWU7CisJdGhpcy5kZWNsYXJlICAgICAgICAgICA9IGRlY2xhcmU7CisJdGhpcy5zY29wZSAgICAgICAgICAgICA9IHNjb3BlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBib2R5IG9mIHRoZSAmbHQ7bmFtZS1naXZlbiZndDsgZWxlbWVudC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIHZhcmlhYmxlIG5hbWUgYXMgYSBjb25zdGFudAorICAgICAqLworCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lR2l2ZW4oKSB7CisJcmV0dXJuIG5hbWVHaXZlbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgYm9keSBvZiB0aGUgJmx0O25hbWUtZnJvbS1hdHRyaWJ1dGUmZ3Q7IGVsZW1lbnQuCisgICAgICogVGhpcyBpcyB0aGUgbmFtZSBvZiBhbiBhdHRyaWJ1dGUgd2hvc2UgKHRyYW5zbGF0aW9uLXRpbWUpCisgICAgICogdmFsdWUgd2lsbCBnaXZlIHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZS4gIE9uZSBvZgorICAgICAqICZsdDtuYW1lLWdpdmVuJmd0OyBvciAmbHQ7bmFtZS1mcm9tLWF0dHJpYnV0ZSZndDsgaXMgcmVxdWlyZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBhdHRyaWJ1dGUgd2hvc2UgdmFsdWUgZGVmaW5lcyB0aGUgdmFyaWFibGUgbmFtZQorICAgICAqLworCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lRnJvbUF0dHJpYnV0ZSgpIHsKKwlyZXR1cm4gbmFtZUZyb21BdHRyaWJ1dGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGJvZHkgb2YgdGhlICZsdDt2YXJpYWJsZS1jbGFzcyZndDsgZWxlbWVudC4gIAorICAgICAqCisgICAgICogQHJldHVybiBUaGUgbmFtZSBvZiB0aGUgY2xhc3Mgb2YgdGhlIHZhcmlhYmxlIG9yCisgICAgICogICAgICAgICAnamF2YS5sYW5nLlN0cmluZycgaWYgbm90IGRlZmluZWQgaW4gdGhlIFRMRC4KKyAgICAgKi8KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgeworCXJldHVybiBjbGFzc05hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGJvZHkgb2YgdGhlICZsdDtkZWNsYXJlJmd0OyBlbGVtZW50LgorICAgICAqCisgICAgICogQHJldHVybiBXaGV0aGVyIHRoZSB2YXJpYWJsZSBpcyB0byBiZSBkZWNsYXJlZCBvciBub3QuCisgICAgICogICAgICAgICBJZiBub3QgZGVmaW5lZCBpbiB0aGUgVExELCAndHJ1ZScgd2lsbCBiZSByZXR1cm5lZC4KKyAgICAgKi8KKworICAgIHB1YmxpYyBib29sZWFuIGdldERlY2xhcmUoKSB7CisJcmV0dXJuIGRlY2xhcmU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGJvZHkgb2YgdGhlICZsdDtzY29wZSZndDsgZWxlbWVudC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIHNjb3BlIHRvIGdpdmUgdGhlIHZhcmlhYmxlLiAgTkVTVEVECisgICAgICogICAgICAgICBzY29wZSB3aWxsIGJlIHJldHVybmVkIGlmIG5vdCBkZWZpbmVkIGluIAorICAgICAqICAgICAgICAgdGhlIFRMRC4KKyAgICAgKi8KKworICAgIHB1YmxpYyBpbnQgZ2V0U2NvcGUoKSB7CisJcmV0dXJuIHNjb3BlOworICAgIH0KKworCisgICAgLyoKKyAgICAgKiBwcml2YXRlIGZpZWxkcworICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nICAgbmFtZUdpdmVuOyAgICAgICAgIC8vIDxuYW1lLWdpdmVuPgorICAgIHByaXZhdGUgU3RyaW5nICAgbmFtZUZyb21BdHRyaWJ1dGU7IC8vIDxuYW1lLWZyb20tYXR0cmlidXRlPgorICAgIHByaXZhdGUgU3RyaW5nICAgY2xhc3NOYW1lOyAgICAgICAgIC8vIDxjbGFzcz4KKyAgICBwcml2YXRlIGJvb2xlYW4gIGRlY2xhcmU7ICAgICAgICAgICAvLyA8ZGVjbGFyZT4KKyAgICBwcml2YXRlIGludCAgICAgIHNjb3BlOyAgICAgICAgICAgICAvLyA8c2NvcGU+Cit9CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvdGFnZXh0L1RyeUNhdGNoRmluYWxseS5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL3RhZ2V4dC9UcnlDYXRjaEZpbmFsbHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDg0OWViCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL3RhZ2V4dC9UcnlDYXRjaEZpbmFsbHkuamF2YQpAQCAtMCwwICsxLDk4IEBACisvKgorKiBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyAKK3BhY2thZ2UgamF2YXguc2VydmxldC5qc3AudGFnZXh0OworCisKKworLyoqCisgKiBUaGUgYXV4aWxpYXJ5IGludGVyZmFjZSBvZiBhIFRhZywgSXRlcmF0aW9uVGFnIG9yIEJvZHlUYWcgdGFnCisgKiBoYW5kbGVyIHRoYXQgd2FudHMgYWRkaXRpb25hbCBob29rcyBmb3IgbWFuYWdpbmcgcmVzb3VyY2VzLgorICoKKyAqIDxwPlRoaXMgaW50ZXJmYWNlIHByb3ZpZGVzIHR3byBuZXcgbWV0aG9kczogZG9DYXRjaChUaHJvd2FibGUpCisgKiBhbmQgZG9GaW5hbGx5KCkuICBUaGUgcHJvdG90eXBpY2FsIGludm9jYXRpb24gaXMgYXMgZm9sbG93czoKKyAqCisgKiA8cHJlPgorICogaCA9IGdldCBhIFRhZygpOyAgLy8gZ2V0IGEgdGFnIGhhbmRsZXIsIHBlcmhhcHMgZnJvbSBwb29sCisgKgorICogaC5zZXRQYWdlQ29udGV4dChwYyk7ICAvLyBpbml0aWFsaXplIGFzIGRlc2lyZWQKKyAqIGguc2V0UGFyZW50KG51bGwpOworICogaC5zZXRGb28oImZvbyIpOworICogCisgKiAvLyB0YWcgaW52b2NhdGlvbiBwcm90b2NvbDsgc2VlIFRhZy5qYXZhCisgKiB0cnkgeworICogICBkb1N0YXJ0VGFnKCkuLi4KKyAqICAgLi4uLgorICogICBkb0VuZFRhZygpLi4uCisgKiB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICogICAvLyByZWFjdCB0byBleGNlcHRpb25hbCBjb25kaXRpb24KKyAqICAgaC5kb0NhdGNoKHQpOworICogfSBmaW5hbGx5IHsKKyAqICAgLy8gcmVzdG9yZSBkYXRhIGludmFyaWFudHMgYW5kIHJlbGVhc2UgcGVyLWludm9jYXRpb24gcmVzb3VyY2VzCisgKiAgIGguZG9GaW5hbGx5KCk7CisgKiB9CisgKiAKKyAqIC4uLiBvdGhlciBpbnZvY2F0aW9ucyBwZXJoYXBzIHdpdGggc29tZSBuZXcgc2V0dGVycworICogLi4uCisgKiBoLnJlbGVhc2UoKTsgIC8vIHJlbGVhc2UgbG9uZy10ZXJtIHJlc291cmNlcworICogPC9wcmU+CisgKi8KKworcHVibGljIGludGVyZmFjZSBUcnlDYXRjaEZpbmFsbHkgeworCisgICAgLyoqCisgICAgICogSW52b2tlZCBpZiBhIFRocm93YWJsZSBvY2N1cnMgd2hpbGUgZXZhbHVhdGluZyB0aGUgQk9EWQorICAgICAqIGluc2lkZSBhIHRhZyBvciBpbiBhbnkgb2YgdGhlIGZvbGxvd2luZyBtZXRob2RzOgorICAgICAqIFRhZy5kb1N0YXJ0VGFnKCksIFRhZy5kb0VuZFRhZygpLAorICAgICAqIEl0ZXJhdGlvblRhZy5kb0FmdGVyQm9keSgpIGFuZCBCb2R5VGFnLmRvSW5pdEJvZHkoKS4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgbWV0aG9kIGlzIG5vdCBpbnZva2VkIGlmIHRoZSBUaHJvd2FibGUgb2NjdXJzIGR1cmluZworICAgICAqIG9uZSBvZiB0aGUgc2V0dGVyIG1ldGhvZHMuCisgICAgICoKKyAgICAgKiA8cD5UaGlzIG1ldGhvZCBtYXkgdGhyb3cgYW4gZXhjZXB0aW9uICh0aGUgc2FtZSBvciBhIG5ldyBvbmUpCisgICAgICogdGhhdCB3aWxsIGJlIHByb3BhZ2F0ZWQgZnVydGhlciB1cCB0aGUgbmVzdCBjaGFpbi4gIElmIGFuIGV4Y2VwdGlvbgorICAgICAqIGlzIHRocm93biwgZG9GaW5hbGx5KCkgd2lsbCBiZSBpbnZva2VkLgorICAgICAqCisgICAgICogPHA+VGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB0byByZXNwb25kIHRvIGFuIGV4Y2VwdGlvbmFsCisgICAgICogY29uZGl0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHQgVGhlIHRocm93YWJsZSBleGNlcHRpb24gbmF2aWdhdGluZyB0aHJvdWdoIHRoaXMgdGFnLgorICAgICAqIEB0aHJvd3MgVGhyb3dhYmxlIGlmIHRoZSBleGNlcHRpb24gaXMgdG8gYmUgcmV0aHJvd24gZnVydGhlciB1cCAKKyAgICAgKiAgICAgdGhlIG5lc3QgY2hhaW4uCisgICAgICovCisgCisgICAgdm9pZCBkb0NhdGNoKFRocm93YWJsZSB0KSB0aHJvd3MgVGhyb3dhYmxlOworCisgICAgLyoqCisgICAgICogSW52b2tlZCBpbiBhbGwgY2FzZXMgYWZ0ZXIgZG9FbmRUYWcoKSBmb3IgYW55IGNsYXNzIGltcGxlbWVudGluZworICAgICAqIFRhZywgSXRlcmF0aW9uVGFnIG9yIEJvZHlUYWcuICBUaGlzIG1ldGhvZCBpcyBpbnZva2VkIGV2ZW4gaWYKKyAgICAgKiBhbiBleGNlcHRpb24gaGFzIG9jY3VycmVkIGluIHRoZSBCT0RZIG9mIHRoZSB0YWcsCisgICAgICogb3IgaW4gYW55IG9mIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKKyAgICAgKiBUYWcuZG9TdGFydFRhZygpLCBUYWcuZG9FbmRUYWcoKSwKKyAgICAgKiBJdGVyYXRpb25UYWcuZG9BZnRlckJvZHkoKSBhbmQgQm9keVRhZy5kb0luaXRCb2R5KCkuCisgICAgICoKKyAgICAgKiA8cD5UaGlzIG1ldGhvZCBpcyBub3QgaW52b2tlZCBpZiB0aGUgVGhyb3dhYmxlIG9jY3VycyBkdXJpbmcKKyAgICAgKiBvbmUgb2YgdGhlIHNldHRlciBtZXRob2RzLgorICAgICAqCisgICAgICogPHA+VGhpcyBtZXRob2Qgc2hvdWxkIG5vdCB0aHJvdyBhbiBFeGNlcHRpb24uCisgICAgICoKKyAgICAgKiA8cD5UaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCB0byBtYWludGFpbiBwZXItaW52b2NhdGlvbiBkYXRhCisgICAgICogaW50ZWdyaXR5IGFuZCByZXNvdXJjZSBtYW5hZ2VtZW50IGFjdGlvbnMuCisgICAgICovCisKKyAgICB2b2lkIGRvRmluYWxseSgpOworfQpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL3RhZ2V4dC9WYWxpZGF0aW9uTWVzc2FnZS5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL3RhZ2V4dC9WYWxpZGF0aW9uTWVzc2FnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1NDQ1NTMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvdGFnZXh0L1ZhbGlkYXRpb25NZXNzYWdlLmphdmEKQEAgLTAsMCArMSw4NSBAQAorLyoKKyogQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisKK3BhY2thZ2UgamF2YXguc2VydmxldC5qc3AudGFnZXh0OworCisKKy8qKgorICogQSB2YWxpZGF0aW9uIG1lc3NhZ2UgZnJvbSBlaXRoZXIgVGFnTGlicmFyeVZhbGlkYXRvciBvciBUYWdFeHRyYUluZm8uCisgKiA8cD4KKyAqIEFzIG9mIEpTUCAyLjAsIGEgSlNQIGNvbnRhaW5lciBtdXN0IHN1cHBvcnQgYSBqc3A6aWQgYXR0cmlidXRlCisgKiB0byBwcm92aWRlIGhpZ2hlciBxdWFsaXR5IHZhbGlkYXRpb24gZXJyb3JzLgorICogVGhlIGNvbnRhaW5lciB3aWxsIHRyYWNrIHRoZSBKU1AgcGFnZXMKKyAqIGFzIHBhc3NlZCB0byB0aGUgY29udGFpbmVyLCBhbmQgd2lsbCBhc3NpZ24gdG8gZWFjaCBlbGVtZW50CisgKiBhIHVuaXF1ZSAiaWQiLCB3aGljaCBpcyBwYXNzZWQgYXMgdGhlIHZhbHVlIG9mIHRoZSBqc3A6aWQKKyAqIGF0dHJpYnV0ZS4gIEVhY2ggWE1MIGVsZW1lbnQgaW4gdGhlIFhNTCB2aWV3IGF2YWlsYWJsZSB3aWxsCisgKiBiZSBleHRlbmRlZCB3aXRoIHRoaXMgYXR0cmlidXRlLiAgVGhlIFRhZ0xpYnJhcnlWYWxpZGF0b3IKKyAqIGNhbiB0aGVuIHVzZSB0aGUgYXR0cmlidXRlIGluIG9uZSBvciBtb3JlIFZhbGlkYXRpb25NZXNzYWdlCisgKiBvYmplY3RzLiAgVGhlIGNvbnRhaW5lciB0aGVuLCBpbiB0dXJuLCBjYW4gdXNlIHRoZXNlCisgKiB2YWx1ZXMgdG8gcHJvdmlkZSBtb3JlIHByZWNpc2UgaW5mb3JtYXRpb24gb24gdGhlIGxvY2F0aW9uCisgKiBvZiBhbiBlcnJvci4KKyAqICAKKyAqIDxwPgorICogVGhlIGFjdHVhbCBwcmVmaXggb2YgdGhlIDxjb2RlPmlkPC9jb2RlPiBhdHRyaWJ1dGUgbWF5IG9yIG1heSBub3QgYmUgCisgKiA8Y29kZT5qc3A8L2NvZGU+IGJ1dCBpdCB3aWxsIGFsd2F5cyBtYXAgdG8gdGhlIG5hbWVzcGFjZQorICogPGNvZGU+aHR0cDovL2phdmEuc3VuLmNvbS9KU1AvUGFnZTwvY29kZT4uICBBIFRhZ0xpYnJhcnlWYWxpZGF0b3IKKyAqIGltcGxlbWVudGF0aW9uIG11c3QgcmVseSBvbiB0aGUgdXJpLCBub3QgdGhlIHByZWZpeCwgb2YgdGhlIDxjb2RlPmlkPC9jb2RlPgorICogYXR0cmlidXRlLgorICovCisKK3B1YmxpYyBjbGFzcyBWYWxpZGF0aW9uTWVzc2FnZSB7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBWYWxpZGF0aW9uTWVzc2FnZS4gIFRoZSBtZXNzYWdlIFN0cmluZyBzaG91bGQgYmUKKyAgICAgKiBub24tbnVsbC4gIFRoZSB2YWx1ZSBvZiBpZCBtYXkgYmUgbnVsbCwgaWYgdGhlIG1lc3NhZ2UKKyAgICAgKiBpcyBub3Qgc3BlY2lmaWMgdG8gYW55IFhNTCBlbGVtZW50LCBvciBpZiBubyBqc3A6aWQKKyAgICAgKiBhdHRyaWJ1dGVzIHdlcmUgcGFzc2VkIG9uLiAgSWYgbm9uLW51bGwsIHRoZSB2YWx1ZSBvZgorICAgICAqIGlkIG11c3QgYmUgdGhlIHZhbHVlIG9mIGEganNwOmlkIGF0dHJpYnV0ZSBmb3IgdGhlIFBhZ2VEYXRhCisgICAgICogcGFzc2VkIGludG8gdGhlIHZhbGlkYXRlKCkgbWV0aG9kLgorICAgICAqCisgICAgICogQHBhcmFtIGlkIEVpdGhlciBudWxsLCBvciB0aGUgdmFsdWUgb2YgYSBqc3A6aWQgYXR0cmlidXRlLgorICAgICAqIEBwYXJhbSBtZXNzYWdlIEEgbG9jYWxpemVkIHZhbGlkYXRpb24gbWVzc2FnZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgVmFsaWRhdGlvbk1lc3NhZ2UoU3RyaW5nIGlkLCBTdHJpbmcgbWVzc2FnZSkgeworCXRoaXMuaWQgPSBpZDsKKwl0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBqc3A6aWQuCisgICAgICogTnVsbCBtZWFucyB0aGF0IHRoZXJlIGlzIG5vIGluZm9ybWF0aW9uIGF2YWlsYWJsZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGpzcDppZCBpbmZvcm1hdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkgeworCXJldHVybiBpZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGxvY2FsaXplZCB2YWxpZGF0aW9uIG1lc3NhZ2UuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEEgdmFsaWRhdGlvbiBtZXNzYWdlCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCl7CisJcmV0dXJuIG1lc3NhZ2U7CisgICAgfQorCisgICAgLy8gUHJpdmF0ZSBkYXRhCisgICAgcHJpdmF0ZSBTdHJpbmcgaWQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgbWVzc2FnZTsKK30KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC90YWdleHQvVmFyaWFibGVJbmZvLmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvdGFnZXh0L1ZhcmlhYmxlSW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjZjZkMTEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvdGFnZXh0L1ZhcmlhYmxlSW5mby5qYXZhCkBAIC0wLDAgKzEsMjgzIEBACisvKgorKiBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyAKK3BhY2thZ2UgamF2YXguc2VydmxldC5qc3AudGFnZXh0OworCisvKioKKyAqIEluZm9ybWF0aW9uIG9uIHRoZSBzY3JpcHRpbmcgdmFyaWFibGVzIHRoYXQgYXJlIGNyZWF0ZWQvbW9kaWZpZWQgYnkKKyAqIGEgdGFnIChhdCBydW4tdGltZSkuIFRoaXMgaW5mb3JtYXRpb24gaXMgcHJvdmlkZWQgYnkgVGFnRXh0cmFJbmZvCisgKiBjbGFzc2VzIGFuZCBpdCBpcyB1c2VkIGJ5IHRoZSB0cmFuc2xhdGlvbiBwaGFzZSBvZiBKU1AuCisgKgorICogPHA+CisgKiBTY3JpcHRpbmcgdmFyaWFibGVzIGdlbmVyYXRlZCBieSBhIGN1c3RvbSBhY3Rpb24gaGF2ZSBhbiBhc3NvY2lhdGVkIAorICogc2NvcGUgb2YgZWl0aGVyIEFUX0JFR0lOLCBORVNURUQsIG9yIEFUX0VORC4KKyAqCisgKiA8cD4KKyAqIFRoZSBjbGFzcyBuYW1lIChWYXJpYWJsZUluZm8uZ2V0Q2xhc3NOYW1lKSBpbiB0aGUgcmV0dXJuZWQgb2JqZWN0cworICogaXMgdXNlZCB0byBkZXRlcm1pbmUgdGhlIHR5cGVzIG9mIHRoZSBzY3JpcHRpbmcgdmFyaWFibGVzLgorICogTm90ZSB0aGF0IGJlY2F1c2Ugc2NyaXB0aW5nIHZhcmlhYmxlcyBhcmUgYXNzaWduZWQgdGhlaXIgdmFsdWVzCisgKiBmcm9tIHNjb3BlZCBhdHRyaWJ1dGVzIHdoaWNoIGNhbm5vdCBiZSBvZiBwcmltaXRpdmUgdHlwZXMsCisgKiAmcXVvdDtib3hlZCZxdW90OyB0eXBlcyBzdWNoIGFzIDxjb2RlPmphdmEubGFuZy5JbnRlZ2VyPC9jb2RlPiBtdXN0IAorICogYmUgdXNlZCBpbnN0ZWFkIG9mIHByaW1pdGl2ZXMuCisgKgorICogPHA+CisgKiBUaGUgY2xhc3MgbmFtZSBtYXkgYmUgYSBGdWxseSBRdWFsaWZpZWQgQ2xhc3MgTmFtZSwgb3IgYSBzaG9ydAorICogY2xhc3MgbmFtZS4KKyAqCisgKiA8cD4KKyAqIElmIGEgRnVsbHkgUXVhbGlmaWVkIENsYXNzIE5hbWUgaXMgcHJvdmlkZWQsIGl0IHNob3VsZCByZWZlciB0byBhCisgKiBjbGFzcyB0aGF0IHNob3VsZCBiZSBpbiB0aGUgQ0xBU1NQQVRIIGZvciB0aGUgV2ViIEFwcGxpY2F0aW9uIChzZWUKKyAqIFNlcnZsZXQgMi40IHNwZWNpZmljYXRpb24gLSBlc3NlbnRpYWxseSBpdCBpcyBXRUItSU5GL2xpYiBhbmQKKyAqIFdFQi1JTkYvY2xhc3NlcykuIEZhaWx1cmUgdG8gYmUgc28gd2lsbCBsZWFkIHRvIGEgdHJhbnNsYXRpb24tdGltZQorICogZXJyb3IuCisgKgorICogPHA+CisgKiBJZiBhIHNob3J0IGNsYXNzIG5hbWUgaXMgZ2l2ZW4gaW4gdGhlIFZhcmlhYmxlSW5mbyBvYmplY3RzLCB0aGVuCisgKiB0aGUgY2xhc3MgbmFtZSBtdXN0IGJlIHRoYXQgb2YgYSBwdWJsaWMgY2xhc3MgaW4gdGhlIGNvbnRleHQgb2YgdGhlCisgKiBpbXBvcnQgZGlyZWN0aXZlcyBvZiB0aGUgcGFnZSB3aGVyZSB0aGUgY3VzdG9tIGFjdGlvbiBhcHBlYXJzLiAKKyAqIFRoZSBjbGFzcyBtdXN0IGFsc28gYmUgaW4gdGhlIENMQVNTUEFUSCBmb3IgdGhlIFdlYiBBcHBsaWNhdGlvbiAKKyAqIChzZWUgU2VydmxldCAyLjQgc3BlY2lmaWNhdGlvbiAtIGVzc2VudGlhbGx5IGl0IGlzIFdFQi1JTkYvbGliIGFuZAorICogV0VCLUlORi9jbGFzc2VzKS4gRmFpbHVyZSB0byBiZSBzbyB3aWxsIGxlYWQgdG8gYSB0cmFuc2xhdGlvbi10aW1lCisgKiBlcnJvci4KKyAqCisgKiA8cD48Qj5Vc2FnZSBDb21tZW50czwvQj4KKyAqIDxwPgorICogRnJlcXVlbnRseSBhIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIHdpbGwgcmVmZXIgdG8gYSBjbGFzcyB0aGF0CisgKiBpcyBrbm93biB0byB0aGUgdGFnIGxpYnJhcnkgYW5kIHRodXMsIGRlbGl2ZXJlZCBpbiB0aGUgc2FtZSBKQVIKKyAqIGZpbGUgYXMgdGhlIHRhZyBoYW5kbGVycy4gSW4gbW9zdCBvdGhlciByZW1haW5pbmcgY2FzZXMgaXQgd2lsbAorICogcmVmZXIgdG8gYSBjbGFzcyB0aGF0IGlzIGluIHRoZSBwbGF0Zm9ybSBvbiB3aGljaCB0aGUgSlNQIHByb2Nlc3NvcgorICogaXMgYnVpbHQgKGxpa2UgSjJFRSkuIFVzaW5nIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lcyBpbiB0aGlzCisgKiBtYW5uZXIgbWFrZXMgdGhlIHVzYWdlIHJlbGF0aXZlbHkgcmVzaXN0YW50IHRvIGNvbmZpZ3VyYXRpb24KKyAqIGVycm9ycy4KKyAqCisgKiA8cD4KKyAqIEEgc2hvcnQgbmFtZSBpcyB1c3VhbGx5IGdlbmVyYXRlZCBieSB0aGUgdGFnIGxpYnJhcnkgYmFzZWQgb24gc29tZQorICogYXR0cmlidXRlcyBwYXNzZWQgdGhyb3VnaCBmcm9tIHRoZSBjdXN0b20gYWN0aW9uIHVzZXIgKHRoZSBhdXRob3IpLAorICogYW5kIGl0IGlzIHRodXMgbGVzcyByb2J1c3Q6IGZvciBpbnN0YW5jZSBhIG1pc3NpbmcgaW1wb3J0IGRpcmVjdGl2ZQorICogaW4gdGhlIHJlZmVycmluZyBKU1AgcGFnZSB3aWxsIGxlYWQgdG8gYW4gaW52YWxpZCBzaG9ydCBuYW1lIGNsYXNzCisgKiBhbmQgYSB0cmFuc2xhdGlvbiBlcnJvci4KKyAqCisgKiA8cD48Qj5TeW5jaHJvbml6YXRpb24gUHJvdG9jb2w8L0I+CisgKgorICogPHA+CisgKiBUaGUgcmVzdWx0IG9mIHRoZSBpbnZvY2F0aW9uIG9uIGdldFZhcmlhYmxlSW5mbyBpcyBhbiBhcnJheSBvZgorICogVmFyaWFibGVJbmZvIG9iamVjdHMuICBFYWNoIHN1Y2ggb2JqZWN0IGRlc2NyaWJlcyBhIHNjcmlwdGluZworICogdmFyaWFibGUgYnkgcHJvdmlkaW5nIGl0cyBuYW1lLCBpdHMgdHlwZSwgd2hldGhlciB0aGUgdmFyaWFibGUgaXMKKyAqIG5ldyBvciBub3QsIGFuZCB3aGF0IGl0cyBzY29wZSBpcy4gIFNjb3BlIGlzIGJlc3QgZGVzY3JpYmVkIHRocm91Z2gKKyAqIGEgcGljdHVyZToKKyAqCisgKiA8cD4KKyAqIDxJTUcgc3JjPSJkb2MtZmlsZXMvVmFyaWFibGVJbmZvLTEuZ2lmIgorICogICAgICBhbHQ9Ik5FU1RFRCwgQVRfQkVHSU4gYW5kIEFUX0VORCBWYXJpYWJsZSBTY29wZXMiLz4KKyAqCisgKjxwPgorICogVGhlIEpTUCAyLjAgc3BlY2lmaWNhdGlvbiBkZWZpbmVzIHRoZSBpbnRlcnByZXRhdGlvbiBvZiAzIHZhbHVlczoKKyAqIAorICogPHVsPgorICogPGxpPiBORVNURUQsIGlmIHRoZSBzY3JpcHRpbmcgdmFyaWFibGUgaXMgYXZhaWxhYmxlIGJldHdlZW4KKyAqIHRoZSBzdGFydCB0YWcgYW5kIHRoZSBlbmQgdGFnIG9mIHRoZSBhY3Rpb24gdGhhdCBkZWZpbmVzIGl0LgorICogPGxpPgorICogQVRfQkVHSU4sIGlmIHRoZSBzY3JpcHRpbmcgdmFyaWFibGUgaXMgYXZhaWxhYmxlIGZyb20gdGhlIHN0YXJ0IHRhZworICogb2YgdGhlIGFjdGlvbiB0aGF0IGRlZmluZXMgaXQgdW50aWwgdGhlIGVuZCBvZiB0aGUgc2NvcGUuCisgKiA8bGk+IEFUX0VORCwgaWYgdGhlIHNjcmlwdGluZyB2YXJpYWJsZSBpcyBhdmFpbGFibGUgYWZ0ZXIgdGhlIGVuZCB0YWcKKyAqIG9mIHRoZSBhY3Rpb24gdGhhdCBkZWZpbmVzIGl0IHVudGlsIHRoZSBlbmQgb2YgdGhlIHNjb3BlLgorICogPC91bD4KKyAqCisgKiBUaGUgc2NvcGUgdmFsdWUgZm9yIGEgdmFyaWFibGUgaW1wbGllcyB3aGF0IG1ldGhvZHMgbWF5IGFmZmVjdCBpdHMKKyAqIHZhbHVlIGFuZCB0aHVzIHdoZXJlIHN5bmNocm9uaXphdGlvbiBpcyBuZWVkZWQgYXMgaWxsdXN0cmF0ZWQgYnkKKyAqIHRoZSB0YWJsZSBiZWxvdy4gIDxiPk5vdGU6PC9iPiB0aGUgc3luY2hyb25pemF0aW9uIG9mIHRoZSB2YXJpYWJsZShzKQorICogd2lsbCBvY2N1ciA8ZW0+YWZ0ZXI8L2VtPiB0aGUgcmVzcGVjdGl2ZSBtZXRob2QgaGFzIGJlZW4gY2FsbGVkLgorICoKKyAqIDxibG9ja3F1b3RlPgorICogPHRhYmxlIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMiIgYm9yZGVyPSIwIiB3aWR0aD0iNTUlIgorICogICAgICAgIGJnY29sb3I9IiM5OTk5OTkiIHN1bW1hcnk9IlZhcmlhYmxlIFN5bmNocm9uaXphdGlvbiBQb2ludHMiPgorICogPHRib2R5PgorICogICA8dHIgYWxpZ249ImNlbnRlciI+CisgKiAgICAgPHRkIHZhbGlnbj0idG9wIiBjb2xzcGFuPSI2IiBiZ2NvbG9yPSIjOTk5OTk5Ij48dT48Yj5WYXJpYWJsZSBTeW5jaHJvbml6YXRpb24KKyAqICAgICBQb2ludHM8L2I+PC91Pjxicj4KKyAqICAgICA8L3RkPgorICogICA8L3RyPgorICogICA8dHI+CisgKiAgICAgPHRoIHZhbGlnbj0idG9wIiBiZ2NvbG9yPSIjYzBjMGMwIj4mbmJzcDs8L3RoPgorICogICAgIDx0aCB2YWxpZ249InRvcCIgYmdjb2xvcj0iI2MwYzBjMCIgYWxpZ249ImNlbnRlciI+ZG9TdGFydFRhZygpPC90aD4KKyAqICAgICA8dGggdmFsaWduPSJ0b3AiIGJnY29sb3I9IiNjMGMwYzAiIGFsaWduPSJjZW50ZXIiPmRvSW5pdEJvZHkoKTwvdGg+CisgKiAgICAgPHRoIHZhbGlnbj0idG9wIiBiZ2NvbG9yPSIjYzBjMGMwIiBhbGlnbj0iY2VudGVyIj5kb0FmdGVyQm9keSgpPC90aD4KKyAqICAgICA8dGggdmFsaWduPSJ0b3AiIGJnY29sb3I9IiNjMGMwYzAiIGFsaWduPSJjZW50ZXIiPmRvRW5kVGFnKCk8L3RoPgorICogICAgIDx0aCB2YWxpZ249InRvcCIgYmdjb2xvcj0iI2MwYzBjMCIgYWxpZ249ImNlbnRlciI+ZG9UYWcoKTwvdGg+CisgKiAgIDwvdHI+CisgKiAgIDx0cj4KKyAqICAgICA8dGQgdmFsaWduPSJ0b3AiIGJnY29sb3I9IiNjMGMwYzAiPjxiPlRhZzxicj4KKyAqICAgICA8L2I+PC90ZD4KKyAqICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiIGJnY29sb3I9IiNmZmZmZmYiPkFUX0JFR0lOLCBORVNURUQ8YnI+CisgKiAgICAgPC90ZD4KKyAqICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiIGJnY29sb3I9IiNmZmZmZmYiPjxicj4KKyAqICAgICA8L3RkPgorICogICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciIgYmdjb2xvcj0iI2ZmZmZmZiI+PGJyPgorICogICAgIDwvdGQ+CisgKiAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIiBiZ2NvbG9yPSIjZmZmZmZmIj5BVF9CRUdJTiwgQVRfRU5EPGJyPgorICogICAgIDwvdGQ+CisgKiAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIiBiZ2NvbG9yPSIjZmZmZmZmIj48YnI+CisgKiAgICAgPC90ZD4KKyAqICAgPC90cj4KKyAqICAgPHRyPgorICogICAgIDx0ZCB2YWxpZ249InRvcCIgYmdjb2xvcj0iI2MwYzBjMCI+PGI+SXRlcmF0aW9uVGFnPGJyPgorICogICAgIDwvYj48L3RkPgorICogICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciIgYmdjb2xvcj0iI2ZmZmZmZiI+QVRfQkVHSU4sIE5FU1RFRDxicj4KKyAqICAgICA8L3RkPgorICogICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciIgYmdjb2xvcj0iI2ZmZmZmZiI+PGJyPgorICogICAgIDwvdGQ+CisgKiAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIiBiZ2NvbG9yPSIjZmZmZmZmIj5BVF9CRUdJTiwgTkVTVEVEPGJyPgorICogICAgIDwvdGQ+CisgKiAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIiBiZ2NvbG9yPSIjZmZmZmZmIj5BVF9CRUdJTiwgQVRfRU5EPGJyPgorICogICAgIDwvdGQ+CisgKiAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIiBiZ2NvbG9yPSIjZmZmZmZmIj48YnI+CisgKiAgICAgPC90ZD4KKyAqICAgPC90cj4KKyAqICAgPHRyPgorICogICAgIDx0ZCB2YWxpZ249InRvcCIgYmdjb2xvcj0iI2MwYzBjMCI+PGI+Qm9keVRhZzxicj4KKyAqICAgICA8L2I+PC90ZD4KKyAqICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiIGJnY29sb3I9IiNmZmZmZmYiPkFUX0JFR0lOLCBORVNURUQ8c3VwPjE8L3N1cD48YnI+CisgKiAgICAgPC90ZD4KKyAqICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiIGJnY29sb3I9IiNmZmZmZmYiPkFUX0JFR0lOLCBORVNURUQ8c3VwPjE8L3N1cD48YnI+CisgKiAgICAgPC90ZD4KKyAqICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiIGJnY29sb3I9IiNmZmZmZmYiPkFUX0JFR0lOLCBORVNURUQ8YnI+CisgKiAgICAgPC90ZD4KKyAqICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiIGJnY29sb3I9IiNmZmZmZmYiPkFUX0JFR0lOLCBBVF9FTkQ8YnI+CisgKiAgICAgPC90ZD4KKyAqICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiIGJnY29sb3I9IiNmZmZmZmYiPjxicj4KKyAqICAgICA8L3RkPgorICogICA8L3RyPgorICogICA8dHI+CisgKiAgICAgPHRkIHZhbGlnbj0idG9wIiBiZ2NvbG9yPSIjYzBjMGMwIj48Yj5TaW1wbGVUYWc8YnI+CisgKiAgICAgPC9iPjwvdGQ+CisgKiAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIiBiZ2NvbG9yPSIjZmZmZmZmIj48YnI+CisgKiAgICAgPC90ZD4KKyAqICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiIGJnY29sb3I9IiNmZmZmZmYiPjxicj4KKyAqICAgICA8L3RkPgorICogICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciIgYmdjb2xvcj0iI2ZmZmZmZiI+PGJyPgorICogICAgIDwvdGQ+CisgKiAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIiBiZ2NvbG9yPSIjZmZmZmZmIj48YnI+CisgKiAgICAgPC90ZD4KKyAqICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiIGJnY29sb3I9IiNmZmZmZmYiPkFUX0JFR0lOLCBBVF9FTkQ8YnI+CisgKiAgICAgPC90ZD4KKyAqICAgPC90cj4KKyAqIDwvdGJvZHk+CisgKiA8L3RhYmxlPgorICogPHN1cD4xPC9zdXA+IENhbGxlZCBhZnRlciA8Y29kZT5kb1N0YXJ0VGFnKCk8L2NvZGU+IGlmIAorICogPGNvZGU+RVZBTF9CT0RZX0lOQ0xVREU8L2NvZGU+IGlzIHJldHVybmVkLCBvciBhZnRlciAKKyAqIDxjb2RlPmRvSW5pdEJvZHkoKTwvY29kZT4gb3RoZXJ3aXNlLgorICogPC9ibG9ja3F1b3RlPgorICoKKyAqIDxwPjxCPlZhcmlhYmxlIEluZm9ybWF0aW9uIGluIHRoZSBUTEQ8L0I+CisgKiA8cD4KKyAqIFNjcmlwdGluZyB2YXJpYWJsZSBpbmZvcm1hdGlvbiBjYW4gYWxzbyBiZSBlbmNvZGVkIGRpcmVjdGx5IGZvciBtb3N0IGNhc2VzCisgKiBpbnRvIHRoZSBUYWcgTGlicmFyeSBEZXNjcmlwdG9yIHVzaW5nIHRoZSAmbHQ7dmFyaWFibGUmZ3Q7IHN1YmVsZW1lbnQgb2YgdGhlCisgKiAmbHQ7dGFnJmd0OyBlbGVtZW50LiAgU2VlIHRoZSBKU1Agc3BlY2lmaWNhdGlvbi4KKyAqLworCitwdWJsaWMgY2xhc3MgVmFyaWFibGVJbmZvIHsKKworICAgIC8qKgorICAgICAqIFNjb3BlIGluZm9ybWF0aW9uIHRoYXQgc2NyaXB0aW5nIHZhcmlhYmxlIGlzIHZpc2libGUgb25seSB3aXRoaW4gdGhlCisgICAgICogc3RhcnQvZW5kIHRhZ3MuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkVTVEVEID0gMDsKKworICAgIC8qKgorICAgICAqIFNjb3BlIGluZm9ybWF0aW9uIHRoYXQgc2NyaXB0aW5nIHZhcmlhYmxlIGlzIHZpc2libGUgYWZ0ZXIgc3RhcnQgdGFnLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFUX0JFR0lOID0gMTsKKworICAgIC8qKgorICAgICAqIFNjb3BlIGluZm9ybWF0aW9uIHRoYXQgc2NyaXB0aW5nIHZhcmlhYmxlIGlzIHZpc2libGUgYWZ0ZXIgZW5kIHRhZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVF9FTkQgPSAyOworCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvcgorICAgICAqIFRoZXNlIG9iamVjdHMgY2FuIGJlIGNyZWF0ZWQgKGF0IHRyYW5zbGF0aW9uIHRpbWUpIGJ5IHRoZSBUYWdFeHRyYUluZm8KKyAgICAgKiBpbnN0YW5jZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFyTmFtZSBUaGUgbmFtZSBvZiB0aGUgc2NyaXB0aW5nIHZhcmlhYmxlCisgICAgICogQHBhcmFtIGNsYXNzTmFtZSBUaGUgdHlwZSBvZiB0aGlzIHZhcmlhYmxlCisgICAgICogQHBhcmFtIGRlY2xhcmUgSWYgdHJ1ZSwgaXQgaXMgYSBuZXcgdmFyaWFibGUgKGluIHNvbWUgbGFuZ3VhZ2VzIHRoaXMgd2lsbAorICAgICAqICAgICByZXF1aXJlIGEgZGVjbGFyYXRpb24pCisgICAgICogQHBhcmFtIHNjb3BlIEluZGljYXRpb24gb24gdGhlIGxleGljYWwgc2NvcGUgb2YgdGhlIHZhcmlhYmxlCisgICAgICovCisKKyAgICBwdWJsaWMgVmFyaWFibGVJbmZvKFN0cmluZyB2YXJOYW1lLAorCQkJU3RyaW5nIGNsYXNzTmFtZSwKKwkJCWJvb2xlYW4gZGVjbGFyZSwKKwkJCWludCBzY29wZSkgeworCXRoaXMudmFyTmFtZSA9IHZhck5hbWU7CisJdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7CisJdGhpcy5kZWNsYXJlID0gZGVjbGFyZTsKKwl0aGlzLnNjb3BlID0gc2NvcGU7CisgICAgfQorCisgICAgLy8gQWNjZXNzb3IgbWV0aG9kcworICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHNjcmlwdGluZyB2YXJpYWJsZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHNjcmlwdGluZyB2YXJpYWJsZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFyTmFtZSgpIHsgCisgICAgICAgIHJldHVybiB2YXJOYW1lOyAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGlzIHZhcmlhYmxlLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgdHlwZSBvZiB0aGlzIHZhcmlhYmxlCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7IAorICAgICAgICByZXR1cm4gY2xhc3NOYW1lOyAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgaXMgYSBuZXcgdmFyaWFibGUuCisgICAgICogSWYgc28sIGluIHNvbWUgbGFuZ3VhZ2VzIHRoaXMgd2lsbCByZXF1aXJlIGEgZGVjbGFyYXRpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBpcyBhIG5ldyB2YXJpYWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXREZWNsYXJlKCkgeyAKKyAgICAgICAgcmV0dXJuIGRlY2xhcmU7IAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBsZXhpY2FsIHNjb3BlIG9mIHRoZSB2YXJpYWJsZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBsZXhpY2FsIHNjb3BlIG9mIHRoZSB2YXJpYWJsZSwgZWl0aGVyIEFUX0JFR0lOLCBBVF9FTkQsCisgICAgICogICAgb3IgTkVTVEVELgorICAgICAqIEBzZWUgI0FUX0JFR0lOCisgICAgICogQHNlZSAjQVRfRU5ECisgICAgICogQHNlZSAjTkVTVEVECisgICAgICovCisgICAgcHVibGljIGludCBnZXRTY29wZSgpIHsgCisgICAgICAgIHJldHVybiBzY29wZTsgCisgICAgfQorCisKKyAgICAvLyA9PSBwcml2YXRlIGRhdGEKKyAgICBwcml2YXRlIFN0cmluZyB2YXJOYW1lOworICAgIHByaXZhdGUgU3RyaW5nIGNsYXNzTmFtZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gZGVjbGFyZTsKKyAgICBwcml2YXRlIGludCBzY29wZTsKK30KKwpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL3RhZ2V4dC9kb2MtZmlsZXMvQm9keVRhZ1Byb3RvY29sLmdpZiBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC90YWdleHQvZG9jLWZpbGVzL0JvZHlUYWdQcm90b2NvbC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYxZTgyYgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTUyL3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2pzcC90YWdleHQvZG9jLWZpbGVzL0JvZHlUYWdQcm90b2NvbC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL3RhZ2V4dC9kb2MtZmlsZXMvSXRlcmF0aW9uVGFnUHJvdG9jb2wuZ2lmIGIvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL3RhZ2V4dC9kb2MtZmlsZXMvSXRlcmF0aW9uVGFnUHJvdG9jb2wuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyNjIzNDEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvdGFnZXh0L2RvYy1maWxlcy9JdGVyYXRpb25UYWdQcm90b2NvbC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL3RhZ2V4dC9kb2MtZmlsZXMvVGFnUHJvdG9jb2wuZ2lmIGIvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL3RhZ2V4dC9kb2MtZmlsZXMvVGFnUHJvdG9jb2wuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhMTg4MGUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvdGFnZXh0L2RvYy1maWxlcy9UYWdQcm90b2NvbC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL3RhZ2V4dC9kb2MtZmlsZXMvVmFyaWFibGVJbmZvLTEuZ2lmIGIvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL3RhZ2V4dC9kb2MtZmlsZXMvVmFyaWFibGVJbmZvLTEuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyZWFiZWIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvdGFnZXh0L2RvYy1maWxlcy9WYXJpYWJsZUluZm8tMS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL3RhZ2V4dC9wYWNrYWdlLmh0bWwgYi9zZXJ2bGV0YXBpL2pzcjE1Mi9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9qc3AvdGFnZXh0L3BhY2thZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzRhZmM4Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTIvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvanNwL3RhZ2V4dC9wYWNrYWdlLmh0bWwKQEAgLTAsMCArMSw4NSBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9JRVRGLy9EVEQgSFRNTC8vRU4iPgorPGh0bWw+Cis8aGVhZD4KKzwhLS0KKyAgLSBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCisgIC0KKyAgLSBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKKyAgLSByZXNlcnZlZC4KKyAgLQorICAtIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAtIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAtIGFyZSBtZXQ6CisgIC0KKyAgLSAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAtICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgIC0KKyAgLSAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAtICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICAtICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAgLSAgICBkaXN0cmlidXRpb24uCisgIC0KKyAgLSAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKKyAgLSAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OiAgCisgIC0gICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIAorICAtICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgorICAtICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKKyAgLSAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgorICAtCisgIC0gNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIlRvbWNhdCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCisgIC0gICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAtICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gCisgIC0gICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCisgIC0KKyAgLSA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgorICAtICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICAtICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KKyAgLQorICAtIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKKyAgLSBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICAtIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgIC0gRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgorICAtIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAgLSBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgIC0gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgorICAtIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAgLSBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAgLSBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAgLSBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAgLSBTVUNIIERBTUFHRS4KKyAgLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAtCisgIC0gVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKKyAgLSBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKKyAgLSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKKyAgLSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCisgIC0KKyAgLS0+Cis8L2hlYWQ+Cis8Ym9keSBiZ2NvbG9yPSJ3aGl0ZSI+CisKK0NsYXNzZXMgYW5kIGludGVyZmFjZXMgZm9yIHRoZSBkZWZpbml0aW9uIG9mIEphdmFTZXJ2ZXIgUGFnZXMgVGFnIExpYnJhcmllcy4KKworPHA+CitUaGUgSmF2YVNlcnZlciBQYWdlcyh0bSkgKEpTUCkgMi4wIHNwZWNpZmljYXRpb24gcHJvdmlkZXMgYSBwb3J0YWJsZQorbWVjaGFuaXNtIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgdGFnIGxpYnJhcmllcy4KKzxwPgorQSBKU1AgdGFnIGxpYnJhcnkgY29udGFpbnMKKzx1bD4KKzxsaT5BIFRhZyBMaWJyYXJ5IERlc2NyaXB0b3I8L2xpPgorPGxpPkEgbnVtYmVyIG9mIFRhZyBGaWxlcyBvciBUYWcgaGFuZGxlciBjbGFzc2VzIGRlZmluaW5nIAorICAgIHJlcXVlc3QtdGltZSBiZWhhdmlvcjwvbGk+Cis8bGk+QWRkaXRpb25hbCBjbGFzc2VzIGFuZCByZXNvdXJjZXMgdXNlZCBhdCBydW50aW1lPC9saT4KKzxsaT5Qb3NzaWJseSBzb21lIGFkZGl0aW9uYWwgY2xhc3NlcyB0byBwcm92aWRlIGV4dHJhIHRyYW5zbGF0aW9uIAorICAgIGluZm9ybWF0aW9uPC9saT4KKzwvdWw+Cis8cD4KK1RoZSBKU1AgMi4wIHNwZWNpZmljYXRpb24gYW5kIHRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gYm90aCBjb250YWluCitzaW1wbGUgYW5kIG1vZGVyYXRlbHkgY29tcGxleCBleGFtcGxlcyBvZiBhY3Rpb25zIGRlZmluZWQgdXNpbmcgdGhpcworbWVjaGFuaXNtLiAgVGhlc2UgYXJlIGF2YWlsYWJsZSBhdCBKU1AncyB3ZWIgc2l0ZSwgYXQKKzxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvanNwIj5odHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL2pzcDwvYT4uCitTb21lIHJlYWRlcnMgbWF5IHdhbnQgdG8gY29uc3VsdCB0aG9zZSB0byBnZXQgYSBxdWljayBmZWVsIGZvciBob3cKK3RoZSBtZWNoYW5pc21zIHdvcmsgdG9nZXRoZXIuCisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTU0Ly5jdnNpZ25vcmUgYi9zZXJ2bGV0YXBpL2pzcjE1NC8uY3ZzaWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiYzE1NzQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1NC8uY3ZzaWdub3JlCkBAIC0wLDAgKzEsNCBAQAorYnVpbGQKK2J1aWxkLnByb3BlcnRpZXMuc2FtcGxlCitkaXN0CitsaWIKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTU0L0JVSUxESU5HLnR4dCBiL3NlcnZsZXRhcGkvanNyMTU0L0JVSUxESU5HLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDQ2YzU5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTQvQlVJTERJTkcudHh0CkBAIC0wLDAgKzEsMTM0IEBACiskSWQkCisKKworICAgICAgICAgICAgICAgQnVpbGRpbmcgVGhlIEphdmEgU2VydmxldCBhbmQgSlNQIEFQSSBDbGFzc2VzCisgICAgICAgICAgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhpcyBzdWJwcm9qZWN0IGNvbnRhaW5zIHRoZSBzb3VyY2UgY29kZSBmb3IgdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzZXMgb2YgdGhlCitKYXZhIFNlcnZsZXQgYW5kIEpTUCBBUElzIChwYWNrYWdlcyBqYXZheC5zZXJ2bGV0LCBqYXZheC5zZXJ2bGV0Lmh0dHAsCitqYXZheC5zZXJ2bGV0LmpzcCwgYW5kIGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dCkuICBJbiBvcmRlciB0byBidWlsZCB0aGVzZQorc291cmNlcyBzdWNjZXNzZnVsbHksIHlvdSBtdXN0IGRvIHRoZSBmb2xsb3dpbmc6CisKKworKDEpIERvd25sb2FkIGFuZCBJbnN0YWxsIHRoZSBBbnQgQmluYXJ5IERpc3RyaWJ1dGlvbgorCitOT1RFOiAgVGhlc2UgaW5zdHJ1Y3Rpb25zIGFzc3VtZSB0aGF0IHlvdSBhcmUgdXNpbmcgdGhlIEFudCAxLjMgcmVsZWFzZS4KK1Byb2NlZHVyZXMgZm9yIEFudCAxLjQgYW5kIGxhdGVyIHZlcnNpb25zIHNob3VsZCBiZSBzaW1pbGFyLCBidXQgaGF2ZSBub3QKK2JlZW4gdGVzdGVkLgorCisqIERvd25sb2FkIGEgYmluYXJ5IGRpc3RyaWJ1dGlvbiBvZiBBbnQgMS4zIGZyb206CisKKyAgICBodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2J1aWxkcy9qYWthcnRhLWFudC9yZWxlYXNlL3YxLjMvYmluLworCisgIE9uIGEgV2luZG93cyBwbGF0Zm9ybSwgeW91IHdpbGwgbmVlZDoKKyAgICBqYWthcnRhLWFudC0xLjMtYmluLnppcAorICAgIGpha2FydGEtYW50LTEuMy1vcHRpb25hbC5qYXIKKworICBPbiBhIFVuaXggcGxhdGZvcm0sIHlvdSB3aWxsIG5lZWQ6CisgICAgamFrYXJ0YS1hbnQtMS4zLWJpbi50YXIuZ3oKKyAgICBqYWthcnRhLWFudC0xLjMtb3B0aW9uYWwuamFyCisKKyogVW5wYWNrIHRoZSBiaW5hcnkgZGlzdHJpYnV0aW9uIGludG8gYSBjb252ZW5pZW50IGxvY2F0aW9uIHNvIHRoYXQgdGhlCisgIEFudCByZWxlYXNlIHJlc2lkZXMgaW4gaXRzIG93biBkaXJlY3RvcnkgKGNvbnZlbnRpb25hbGx5IG5hbWVkCisgICJqYWthcnRhLWFudC0xLjMiKS4gIEZvciB0aGUgcHVycG9zZXMgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGlzIGRvY3VtZW50LAorICB0aGUgc3ltYm9saWMgbmFtZSAiJHthbnQuaG9tZX0iIGlzIHVzZWQgdG8gcmVmZXIgdG8gdGhlIGZ1bGwgcGF0aG5hbWUgb2YKKyAgdGhlIHJlbGVhc2UgZGlyZWN0b3J5LgorCisqIENvcHkgdGhlIGZpbGUgImpha2FydGEtYW50LTEuMy1vcHRpb25hbC5qYXIiLCBkb3dubG9hZGVkIGFib3ZlLCBpbnRvCisgIHRoZSBkaXJlY3RvcnkgIiR7YW50LmhvbWV9L2xpYiIuICBUaGlzIG1ha2VzIGF2YWlsYWJsZSBzZXZlcmFsIEFudAorICBleHRlbnNpb24gY29tbWFuZHMgdGhhdCBhcmUgY29tbW9ubHkgcmVxdWlyZWQgd2hlbiBidWlsZGluZyBKYWthcnRhCisgIGJhc2VkIHByb2plY3RzLgorCisqIE1vZGlmeSB0aGUgUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBpbmNsdWRlIGRpcmVjdG9yeQorICAiJHthbnQuaG9tZX0vYmluIiBpbiBpdHMgbGlzdC4gIFRoaXMgbWFrZXMgdGhlICJhbnQiIGNvbW1hbmQgbGluZSBzY3JpcHQKKyAgYXZhaWxhYmxlLCB3aGljaCB3aWxsIGJlIHVzZWQgdG8gYWN0dWFsbHkgcGVyZm9ybSB0aGUgYnVpbGQuCisKKworKDIpIERvd25sb2FkIGFuZCBJbnN0YWxsIHRoZSBKQVhQLzEuMSBSZWZlcmVuY2UgSW1wbGVtZW50YXRpb24gKE9QVElPTkFMKQorCitOT1RFOiAgQWx0aG91Z2ggdGhpcyBzdGVwIGlzIG5vdCByZXF1aXJlZCB0byBidWlsZCB0aGlzIHBhcnRpY3VsYXIgc3VicHJvamVjdCwKK2l0IGlzIGNvbW1vbmx5IHJlcXVpcmVkIHRvIGJ1aWxkIG90aGVyIEpha2FydGEgcHJvamVjdHMuICBIZW5jZSwgdGhlIHN0ZXBzCityZXF1aXJlZCBhcmUgZG9jdW1lbnRlZCBoZXJlLgorCisqIERvd25sb2FkIGEgYmluYXJ5IGRpc3RyaWJ1dGlvbiBvZiBKQVhQIDEuMSAoRmluYWwgVmVyc2lvbikgZnJvbToKKworICAgIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2Rvd25sb2FkLmh0bWwKKworKiBVbnBhY2sgdGhlIGJpbmFyeSBkaXN0cmlidXRpb24gaW50byBhIGNvbnZlbmllbnQgbG9jYXRpb24gc28gdGhhdCB0aGUKKyAgSkFYUC8xLjEgcmVsZWFzZSByZXNpZGVzIGluIGl0cyBvd24gZGlyZWN0b3J5IChjb252ZW50aW9uYWxseSBuYW1lZAorICAiamF4cC0xLjEiLiAgRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGUgcmVtYWluZGVyIG9mIHRoaXMgZG9jdW1lbnQsIHRoZQorICBzeW1ib2xpYyBuYW1lICIke2pheHAuaG9tZX0iIGlzIHVzZWQgdG8gcmVmZXIgdG8gdGhlIGZ1bGwgcGF0aG5hbWUgb2YKKyAgdGhlIHJlbGVhc2UgZGlyZWN0b3J5LgorCisqIE1ha2UgdGhlIEpBUiBmaWxlcyBvZiB0aGlzIGRpc3RyaWJ1dGlvbiAoImNyaW1zb24uamFyIiwgImpheHAuamFyIiwgYW5kCisgICJ4YWxhbi5qYXIiKSBhdmFpbGFibGUgZm9yIHVzZSBieSBwZXJmb3JtaW5nIE9ORSBvZiB0aGUgZm9sbG93aW5nIG9wdGlvbnM6CisKKyAgLSBSZW1vdmUgdGhlIGV4aXN0aW5nICJqYXhwLmphciIgYW5kICJwYXJzZXIuamFyIiBmaWxlcyBmb3VuZCBpbiB0aGUKKyAgICAiJHthbnQuaG9tZX0vbGliIiBkaXJlY3RvcnksIGFuZCBjb3B5IHRoZXNlIEpBUiBmaWxlcyBpbnRvIHRoZQorICAgICIke2FudC5ob21lfS9saWIiIGRpcmVjdG9yeSAocHJlZmVyZWQgb3B0aW9uKS4KKworICAtIEFkZCB0aGVzZSBmaWxlcyB0byB5b3VyIENMQVNTUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKworCisoMykgRG93bmxvYWQgYW5kIEluc3RhbGwgU3VicHJvamVjdCBTb3VyY2UgQ29kZQorCisqIFVzZSBBbm9ueW1vdXMgQ1ZTIChhcyBkZXNjcmliZWQgb24gdGhlIEpha2FydGEgd2ViIHNpdGUgYXQKKyAgPGh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvc2l0ZS9jdnNpbmRleC5odG1sPiwgb3IKKyAgZG93bmxvYWQgYSBzb3VyY2UgZGlzdHJpYnV0aW9uIGZyb206CisKKyAgICBodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2J1aWxkcy9qYWthcnRhLXNlcnZsZXRhcGktNC9uaWdodGx5L3NyYy8KKworICBPbiBhIFdpbmRvd3MgcGxhdGZvcm0sIHlvdSB3aWxsIG5lZWQ6CisgICAgamFrYXJ0YS1zZXJ2bGV0YXBpLTQtc3JjLVlZWVlNTURELnppcAorCisgIE9uIGEgVW5peCBwbGF0Zm9ybSwgeW91IHdpbGwgbmVlZDoKKyAgICBqYWthcnRhLXNlcnZsZXRhcGktNC1zcmMtWVlZWU1NREQuemlwCisKKyAgKEFsdGVybmF0aXZlbHksIHlvdSBjYW4gZG93bmxvYWQgdGhlIFNlcnZsZXQgQVBJIHNvdXJjZSBkaXN0cmlidXRpb24KKyAgZnJvbSB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgeW91IGZpbmQgYSByZWxlYXNlZCB2ZXJzaW9uIG9mIFRvbWNhdCA0LgorICBTdWNoIGRpc3RyaWJ1dGlvbnMgd2lsbCBjb250YWluIGV4YWN0bHkgdGhlIFNlcnZsZXQgQVBJIGNsYXNzZXMgdXNlZAorICB0byBidWlsZCB0aGUgInNlcnZsZXQuamFyIiBmaWxlIGluc2lkZSB0aGF0IFRvbWNhdCBkaXN0cmlidXRpb24uKQorCisqIFVucGFjayB0aGUgc291cmNlIGRpc3RyaWJ1dGlvbiBpbnRvIGEgY29udmVuaWVudCBsb2NhdGlvbiBzbyB0aGF0IHRoZQorICBkaXN0cmlidXRpb24gcmVzaWRlcyBpbiBpdHMgb3duIGRpcmVjdG9yeSAoY29udmVudGlvbmFsbHkgbmFtZWQKKyAgImpha2FydGEtc2VydmxldGFwaS00IikuICBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoZSByZW1haW5kZXIgb2YgdGhpcyBkb2N1bWVudCwKKyAgdGhlIHN5bWJvbGljIG5hbWUgIiR7c2VydmxldGFwaS5zb3VyY2V9IiBpcyB1c2VkIHRvIHJlZmVyIHRvIHRoZSBmdWxsCisgIHBhdGhuYW1lIG9mIHRoZSByZWxlYXNlIGRpcmVjdG9yeS4KKworCisoNCkgQ3VzdG9taXplIEJ1aWxkIFByb3BlcnRpZXMgRm9yIFRoaXMgU3VicHJvamVjdAorCitNb3N0IEpha2FydGEgc3VicHJvamVjdHMgYWxsb3cgeW91IHRvIGN1c3RvbWl6ZSBBbnQgcHJvcGVydGllcyAod2l0aCBkZWZhdWx0Cit2YWx1ZXMgZGVmaW5lZCBpbiB0aGUgImJ1aWxkLnhtbCIgZmlsZS4gIFRoaXMgaXMgZG9uZSBieSBjcmVhdGluZyBhIHRleHQgZmlsZQorbmFtZWQgImJ1aWxkLnByb3BlcnRpZXMiIGluIHRoZSBzb3VyY2UgZGlzdHJpYnV0aW9uIGRpcmVjdG9yeSAoZm9yIHByb3BlcnR5CitkZWZpbml0aW9ucyBsb2NhbCB0byB0aGlzIHN1YnByb2plY3QpIGFuZC9vciB5b3VyIHVzZXIgaG9tZSBkaXJlY3RvcnkgKGZvcgorcHJvcGVydHkgZGVmaW5pdGlvbnMgc2hhcmVkIGFjcm9zcyBzdWJwcm9qZWN0cykuCisKK1RoZSAiamFrYXJ0YS1zZXJ2bGV0YXBpLTQiIHN1YnByb2plY3QgZG9lcyBub3QgZGVmaW5lIGFueSBjdXN0b21pemFibGUKK2J1aWxkIHByb3BlcnRpZXMuCisKKworKDUpIEJ1aWxkIEEgQmluYXJ5IERpc3RyaWJ1dGlvbgorCitPcGVuIGEgY29tbWFuZCBsaW5lIHNoZWxsLCBhbmQgaXNzdWUgdGhlIGZvbGxvd2luZyBjb21tYW5kczoKKworICBjZCAke3NlcnZsZXRhcGkuc291cmNlfQorICBhbnQgLXByb2plY3RoZWxwCisKK0lmIGV2ZXJ5dGhpbmcgaXMgaW5zdGFsbGVkIGNvcnJlY3RseSwgeW91IHNob3VsZCBzZWUgYSBsaXN0IG9mIHRoZSBBbnQKKyJ0YXJnZXRzIiB0aGF0IHJlcHJlc2VudCBkaWZmZXJlbnQgY29tbWFuZHMgeW91IG1pZ2h0IHdpc2ggdG8gYnVpbGQuICBCeQorY29udmVudGlvbiwgdGhlICJkaXN0IiB0YXJnZXQgY3JlYXRlcyBhIGNvbXBsZXRlIGJpbmFyeSBkaXN0cmlidXRpb24uICBUbworZXhlY3V0ZSBpdCwgdHlwZSB0aGUgZm9sbG93aW5nIGNvbW1hbmRzOgorCisgIGNkICR7c2VydmxldGFwaS5zb3VyY2V9CisgIGFudCBkaXN0CisKK1RoaXMgd2lsbCBjcmVhdGUgYSBjb21wbGV0ZSBiaW5hcnkgZGlzdHJpYnV0aW9uIG9mIHRoZSBzdWJwcm9qZWN0IChlcXVpdmFsZW50CitpbiBzdHJ1Y3R1cmUgdG8gdGhlIGNvcnJlc3BvbmRpbmcgYmluYXJ5IGRpc3RyaWJ1dGlvbiBkb3dubG9hZGFibGUgZnJvbSB0aGUKK0pha2FydGEgd2ViIHNpdGUpLCBpbiB0aGUgIiR7c2VydmxldGFwaS5zb3VyY2V9L2Rpc3QiIGRpcmVjdG9yeS4gIEl0IHdpbGwgaGF2ZQordGhlIGNvbnRlbnRzIGRlc2NyaWJlZCBpbiB0aGUgY29ycmVzcG9uZGluZyAiUkVBRE1FLnR4dCIgZmlsZS4KKworVGhlIGZpbGUgbW9zdCBjb21tb25seSByZXF1aXJlZCBieSBvdGhlciBwcm9qZWN0cyB3aWxsIGJlIHRoZSAic2VydmxldC5qYXIiCitmaWxlLCBmb3VuZCBpbiAiJHtzZXJ2bGV0YXBpLnNvdXJjZX0vbGliL3NlcnZsZXQuamFyIi4gIE1ha2UgYSBub3RlIG9mIHRoZQorZnVsbCBwYXRobmFtZSB0byB0aGlzIGZpbGUsIGJlY2F1c2UgeW91IHdpbGwgbmVlZCBpdCB3aGVuIGN1c3RvbWl6aW5nIGJ1aWxkCitwcm9wZXJ0aWVzIGZvciBvdGhlciBKYWthcnRhIHN1YnByb2plY3RzIHRoYXQgZGVwZW5kIG9uIHRoZXNlIGNsYXNzZXMuCmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1NC9MSUNFTlNFIGIvc2VydmxldGFwaS9qc3IxNTQvTElDRU5TRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjQ1Njk1Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTQvTElDRU5TRQpAQCAtMCwwICsxLDIwMiBAQAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAorICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLworCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KKworICAgMS4gRGVmaW5pdGlvbnMuCisKKyAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCisgICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KKworICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KKworICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAorICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgorICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKKyAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQorICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKKyAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQorICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KKworICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KKworICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCisgICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCisgICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgorCisgICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAorICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAorICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAorICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgorCisgICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgorICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQorICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCisgICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgorCisgICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0CisgICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCisgICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCisgICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcworICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCisgICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCisgICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgorCisgICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZworICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucworICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5CisgICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCisgICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgorICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAorICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KKyAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCisgICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQorICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0CisgICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQorICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCisKKyAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKKyAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgorCisgICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKKyAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQorICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KKworICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCisgICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKKyAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCisgICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgorICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQorICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKKyAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCisgICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCisgICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAorICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcworICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCisgICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCisKKyAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCisgICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKKyAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91CisgICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKKyAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAorCisgICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCisKKyAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcworICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKKyAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAorICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKKyAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCisKKyAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cworICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKKyAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKKyAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKKyAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKKyAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAorICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKKyAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKKyAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCisgICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCisgICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAorICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCisgICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKKyAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKKyAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKKyAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAorICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgorICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCisgICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKKyAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCisKKyAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKKyAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaworICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgorICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQorICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKKyAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KKworICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQorICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAorICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCisgICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KKworICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCisgICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCisgICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKKyAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKKyAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQorICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CisgICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCisKKyAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAorICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCisgICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQorICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKKyAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKKyAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQorICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQorICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAorICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKKyAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKKyAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKworICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZworICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKKyAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCisgICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcworICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKKyAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCisgICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCisgICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKKyAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KKyAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgorCisgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKworICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgorCisgICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZworICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgorICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKKyAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCisgICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKKyAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKKyAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgorICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgorCisgICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KKworICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTU0L1JFQURNRS50eHQgYi9zZXJ2bGV0YXBpL2pzcjE1NC9SRUFETUUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0YjgzMjgKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1NC9SRUFETUUudHh0CkBAIC0wLDAgKzEsMjggQEAKKyRJZCQKKworICAgICAgICAgICAgICAgICAgICAgIEphdmEgU2VydmxldCBhbmQgSlNQIEFQSSBDbGFzc2VzCisgICAgICAgICAgICAgICAgICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhpcyBzdWJwcm9qZWN0IGNvbnRhaW5zIHRoZSBjb21waWxlZCBjb2RlIGZvciB0aGUgaW1wbGVtZW50YXRpb24gY2xhc3NlcyBvZgordGhlIEphdmEgU2VydmxldCBhbmQgSlNQIEFQSXMgKHBhY2thZ2VzIGphdmF4LnNlcnZsZXQsIGphdmF4LnNlcnZsZXQuaHR0cCwKK2phdmF4LnNlcnZsZXQuanNwLCBhbmQgamF2YXguc2VydmxldC5qc3AudGFnZXh0KS4gIEl0IGluY2x1ZGVzIHRoZSBmb2xsb3dpbmcKK2NvbnRlbnRzOgorCisKKyAgQlVJTERJTkcudHh0ICAgICAgICAgICAgICAgIEluc3RydWN0aW9ucyBmb3IgYnVpbGRpbmcgZnJvbSBzb3VyY2VzCisgIExJQ0VOU0UgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSBmb3IgdGhpcyByZWxlYXNlCisgIFJFQURNRS50eHQgICAgICAgICAgICAgICAgICBUaGlzIGRvY3VtZW50CisgIGRvY3MvICAgICAgICAgICAgICAgICAgICAgICBEb2N1bWVudGF0aW9uIGZvciB0aGlzIHJlbGVhc2UKKyAgICAgIGFwaS8gICAgICAgICAgICAgICAgICAgIEphdmFkb2NzIGZvciBTZXJ2bGV0IGFuZCBKU1AgQVBJIGNsYXNzZXMKKyAgbGliLyAgICAgICAgICAgICAgICAgICAgICAgIEJpbmFyeSBKQVIgZmlsZXMgZm9yIHRoaXMgcmVsZWFzZQorICAgICAgc2VydmxldC5qYXIgICAgICAgICAgICAgQmluYXJ5IFNlcnZsZXQgYW5kIEpTUCBBUEkgY2xhc3NlcworICBzcmMvICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlcyBmb3IgU2VydmxldCBhbmQgSlNQIEFQSSBjbGFzc2VzCisKK0luIGdlbmVyYWwsIHlvdSB3aWxsIG5lZWQgdG8gYWRkIHRoZSAic2VydmxldC5qYXIiIGZpbGUgKGZvdW5kIGluIHRoZSAibGliIgorc3ViZGlyZWN0b3J5IG9mIHRoaXMgcmVsZWFzZSkgaW50byB0aGUgY29tcGlsYXRpb24gY2xhc3MgcGF0aCBmb3IgeW91cgorcHJvamVjdHMgdGhhdCBkZXBlbmQgb24gdGhlc2UgQVBJcy4KKworVGhlIGNvbXBpbGVkICJzZXJ2bGV0LmphciIgZmlsZSBpbmNsdWRlZCBpbiB0aGlzIHN1YnByb2plY3QgaXMgYXV0b21hdGljYWxseQoraW5jbHVkZWQgaW4gYmluYXJ5IGRpc3RyaWJ1dGlvbnMgb2YgVG9tY2F0IDQuMCwgc28geW91IG5lZWQgbm90IGRvd25sb2FkIHRoaXMKK3N1YnByb2plY3Qgc2VwYXJhdGVseSB1bmxlc3MgeW91IHdpc2ggdG8gdXRpbGl6ZSB0aGUgSmF2YWRvY3MsIG9yIHBlcnVzZSB0aGUKK3NvdXJjZSBjb2RlIHRvIHNlZSBob3cgdGhlIEFQSSBjbGFzc2VzIGFyZSBpbXBsZW1lbnRlZC4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTU0L2J1aWxkLnhtbCBiL3NlcnZsZXRhcGkvanNyMTU0L2J1aWxkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2MxNzdmCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTQvYnVpbGQueG1sCkBAIC0wLDAgKzEsMTc4IEBACis8cHJvamVjdCBuYW1lPSJTZXJ2bGV0IEFQSSBDbGFzc2VzIiBkZWZhdWx0PSJjb21waWxlIiBiYXNlZGlyPSIuIj4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PSBFbnZpcm9ubWVudGFsIFByb3BlcnRpZXMgPT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKyAgPCEtLSBMb2FkIHVzZXIgcHJvcGVydHkgZGVmaW5pdGlvbiBvdmVycmlkZXMgLS0+CisgIDxwcm9wZXJ0eSBmaWxlPSJidWlsZC5wcm9wZXJ0aWVzIi8+CisgIDxwcm9wZXJ0eSBmaWxlPSIke3VzZXIuaG9tZX0vYnVpbGQucHJvcGVydGllcyIvPgorCisgIDwhLS0gRXN0YWJsaXNoIHByb3BlcnR5IGRlZmluaXRpb24gZGVmYXVsdHMgLS0+CisgIDxwcm9wZXJ0eSBuYW1lPSJjb21waWxlLmRlYnVnIiAgICAgICB2YWx1ZT0idHJ1ZSIvPgorICA8cHJvcGVydHkgbmFtZT0iY29tcGlsZS5kZXByZWNhdGlvbiIgdmFsdWU9ImZhbHNlIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJjb21waWxlLm9wdGltaXplIiAgICB2YWx1ZT0idHJ1ZSIvPgorICA8cHJvcGVydHkgbmFtZT0iaW1wbGVtZW50YXRpb24ucmV2aXNpb24iIHZhbHVlPSJwdWJsaWNfZHJhZnQiLz4KKyAgPHByb3BlcnR5IG5hbWU9InNlcnZsZXQtYXBpLmJ1aWxkIiAgICB2YWx1ZT0iYnVpbGQiLz4KKyAgPHByb3BlcnR5IG5hbWU9InNlcnZsZXQtYXBpLmRpc3QiICAgICB2YWx1ZT0iZGlzdCIvPgorICA8cHJvcGVydHkgbmFtZT0ic2VydmxldC1hcGkuamFyIiB2YWx1ZT0iJHtzZXJ2bGV0LWFwaS5kaXN0fS9saWIvc2VydmxldC1hcGkuamFyIi8+CisgIDxwYXRoIGlkPSJleGFtcGxlcy5jbGFzc3BhdGgiPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtzZXJ2bGV0LWFwaS5idWlsZH0vY2xhc3NlcyIvPgorICA8L3BhdGg+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PSBQcmVwYXJlIERpcmVjdG9yaWVzID09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgIDx0YXJnZXQgbmFtZT0icHJlcGFyZSI+CisKKyAgICA8IS0tICJCdWlsZCIgSGllcmFyY2h5IC0tPgorICAgIDxta2RpciBkaXI9IiR7c2VydmxldC1hcGkuYnVpbGR9Ii8+CisgICAgPG1rZGlyIGRpcj0iJHtzZXJ2bGV0LWFwaS5idWlsZH0vY2xhc3NlcyIvPgorICAgIDxta2RpciBkaXI9IiR7c2VydmxldC1hcGkuYnVpbGR9L2RvY3MiLz4KKyAgICA8bWtkaXIgZGlyPSIke3NlcnZsZXQtYXBpLmJ1aWxkfS9kb2NzL2FwaSIvPgorICAgIDxta2RpciBkaXI9IiR7c2VydmxldC1hcGkuYnVpbGR9L2V4YW1wbGVzIi8+CisKKyAgICA8IS0tICJEaXN0IiBIaWVyYXJjaHkgLS0+CisgICAgPG1rZGlyIGRpcj0iJHtzZXJ2bGV0LWFwaS5kaXN0fSIvPgorICAgIDxta2RpciBkaXI9IiR7c2VydmxldC1hcGkuZGlzdH0vZG9jcyIvPgorICAgIDxta2RpciBkaXI9IiR7c2VydmxldC1hcGkuZGlzdH0vZG9jcy9hcGkiLz4KKyAgICA8bWtkaXIgZGlyPSIke3NlcnZsZXQtYXBpLmRpc3R9L2xpYiIvPgorICAgIDxta2RpciBkaXI9IiR7c2VydmxldC1hcGkuZGlzdH0vc3JjIi8+CisgICAgPG1rZGlyIGRpcj0iJHtzZXJ2bGV0LWFwaS5kaXN0fS9leGFtcGxlcyIvPgorCisgICAgPHVwdG9kYXRlIHByb3BlcnR5PSJkb2NzLnVwdG9kYXRlIiB0YXJnZXRmaWxlPSIke3NlcnZsZXQtYXBpLmJ1aWxkfS9kb2NzL2FwaS9pbmRleC5odG1sIj4KKyAgICAgIDxzcmNmaWxlcyBkaXI9InNyYy9zaGFyZSIgaW5jbHVkZXM9IioqLyouamF2YSIgLz4KKyAgICA8L3VwdG9kYXRlPgorICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT0gU3RhdGljIEZpbGVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJzdGF0aWMiIGRlcGVuZHM9InByZXBhcmUiPgorCisgICAgPCEtLSAiRGlzdCIgSGllcmFyY2h5IC0tPgorICAgIDxjb3B5IHRvZGlyPSIke3NlcnZsZXQtYXBpLmRpc3R9Ij4KKyAgICAgIDxmaWxlc2V0IGRpcj0iLiIgaW5jbHVkZXM9IkJVSUxESU5HLnR4dCIvPgorICAgICAgPGZpbGVzZXQgZGlyPSIuIiBpbmNsdWRlcz0iTElDRU5TRSIvPgorICAgICAgPGZpbGVzZXQgZGlyPSIuIiBpbmNsdWRlcz0iUkVBRE1FLnR4dCIvPgorICAgIDwvY29weT4KKworICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09IENvbXBpbGUgQ2xhc3NlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJjb21waWxlIiBkZXBlbmRzPSJzdGF0aWMiCisgICBkZXNjcmlwdGlvbj0iQ29tcGlsZSBBUEkgY2xhc3NlcyAoRGVmYXVsdCkiPgorCisgICAgPCEtLSBKYXZhIGNsYXNzZXMgLS0+CisgICAgPGphdmFjIHNyY2Rpcj0ic3JjL3NoYXJlIiBkZXN0ZGlyPSIke3NlcnZsZXQtYXBpLmJ1aWxkfS9jbGFzc2VzIgorICAgICAgICAgICBkZWJ1Zz0iJHtjb21waWxlLmRlYnVnfSIgZGVwcmVjYXRpb249IiR7Y29tcGlsZS5kZXByZWNhdGlvbn0iCisgICAgICAgIG9wdGltaXplPSIke2NvbXBpbGUub3B0aW1pemV9Ii8+CisKKyAgICA8IS0tIEFzc29jaWF0ZWQgcHJvcGVydHkgZmlsZXMgLS0+CisgICAgPGNvcHkgdG9kaXI9IiR7c2VydmxldC1hcGkuYnVpbGR9L2NsYXNzZXMiPgorICAgICAgICA8ZmlsZXNldCBkaXI9InNyYy9zaGFyZSI+CisgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5wcm9wZXJ0aWVzIi8+CisgICAgICAgIDwvZmlsZXNldD4KKyAgICA8L2NvcHk+CisKKyAgICA8IS0tIFNlcnZsZXQgcmVzb3VyY2VzIC0tPgorICAgIDxjb3B5IHRvZGlyPSIke3NlcnZsZXQtYXBpLmJ1aWxkfS9jbGFzc2VzL2phdmF4L3NlcnZsZXQvcmVzb3VyY2VzIj4KKyAgICAgICAgPGZpbGVzZXQgZGlyPSJzcmMvc2hhcmUvZHRkIiBpbmNsdWRlcz0iKi5kdGQsKi54c2QiPgorICAgICAgICAgIDxleGNsdWRlIG5hbWU9ImpzcCouZHRkIi8+CisgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0id2ViLWpzcCouZHRkIi8+CisgICAgICAgIDwvZmlsZXNldD4KKyAgICA8L2NvcHk+CisKKyAgPC90YXJnZXQ+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PSBCdWlsZCBKYXZhRG9jID09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJqYXZhZG9jIiBkZXBlbmRzPSJwcmVwYXJlIiB1bmxlc3M9ImRvY3MudXB0b2RhdGUiPgorCisgICAgPGphdmFkb2MgcGFja2FnZW5hbWVzPSJqYXZheC5zZXJ2bGV0LioiCisgICAgICAgICAgICAgc291cmNlcGF0aD0iJHtiYXNlZGlyfS9zcmMvc2hhcmUiCisgICAgICAgICAgICAgZGVzdGRpcj0iJHtzZXJ2bGV0LWFwaS5idWlsZH0vZG9jcy9hcGkiCisgICAgICAgICAgICAgdXNlPSJ0cnVlIgorICAgICAgICAgICAgIHdpbmRvd3RpdGxlPSJTZXJ2bGV0IEFQSSBEb2N1bWVudGF0aW9uIgorICAgICAgICAgICAgIGRvY3RpdGxlPSJTZXJ2bGV0IEFQSSBEb2N1bWVudGF0aW9uIgorICAgICAgICAgICAgIGJvdHRvbT0iQ29weXJpZ2h0ICZhbXA7Y29weTsgMTk5OS0yMDAyIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIi8+CisKKyAgPC90YXJnZXQ+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PSBCdWlsZCBKYXZhRG9jID09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJleGFtcGxlcyIgZGVwZW5kcz0icHJlcGFyZSI+CisKKyAgICA8Y29weSB0b2Rpcj0iJHtzZXJ2bGV0LWFwaS5idWlsZH0vZXhhbXBsZXMiPgorICAgICAgPGZpbGVzZXQgZGlyPSJleGFtcGxlcyI+CisgICAgICAgIDxleGNsdWRlIG5hbWU9ImJ1aWxkLioiLz4KKyAgICAgIDwvZmlsZXNldD4KKyAgICA8L2NvcHk+CisKKyAgICA8amF2YWMgICBzcmNkaXI9ImV4YW1wbGVzL1dFQi1JTkYvY2xhc3NlcyIgCisgICAgICAgICAgICAgZGVzdGRpcj0iJHtzZXJ2bGV0LWFwaS5idWlsZH0vZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzIgorICAgICAgICAgICAgIGRlYnVnPSIke2NvbXBpbGUuZGVidWd9IiBkZXByZWNhdGlvbj0iJHtjb21waWxlLmRlcHJlY2F0aW9ufSIKKyAgICAgICAgICAgICBvcHRpbWl6ZT0iJHtjb21waWxlLm9wdGltaXplfSIKKyAgICAgICAgICAgICBleGNsdWRlcz0iKiovQ1ZTLyoqIj4KKyAgICAgIDxjbGFzc3BhdGggcmVmaWQ9ImV4YW1wbGVzLmNsYXNzcGF0aCIgLz4KKyAgICA8L2phdmFjPgorCisgICAgPGphciAgIGphcmZpbGU9IiR7c2VydmxldC1hcGkuZGlzdH0vZXhhbXBsZXMvZXhhbXBsZXMud2FyIgorICAgICAgICAgICBiYXNlZGlyPSIke3NlcnZsZXQtYXBpLmJ1aWxkfS9leGFtcGxlcyIgaW5jbHVkZXM9IioqIi8+CisKKyAgPC90YXJnZXQ+CisKKworICA8IS0tID09PT09PT09PT09PT09PT09PT09PSBEaXN0cmlidXRpb24gRmlsZXMgPT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgPHRhcmdldCBuYW1lPSJqYXIiIGRlcGVuZHM9ImNvbXBpbGUiCisgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSB0aGUgamFyIj4KKworICAgIDwhLS0gUHJlcGFyZSBNYW5pZmVzdCAtLT4KKyAgICA8Y29weSB0b2ZpbGU9IiR7c2VydmxldC1hcGkuYnVpbGR9L21hbmlmZXN0IgorICAgICAgICAgICAgZmlsZT0ic3JjL2V0Yy9tYW5pZmVzdCIgb3ZlcndyaXRlPSJ5ZXMiPgorICAgICAgPGZpbHRlcnNldD4KKyAgICAgICAgPGZpbHRlciB0b2tlbj0iaW1wbGVtZW50YXRpb24ucmV2aXNpb24iCisgICAgICAgICAgICAgICAgdmFsdWU9IiR7aW1wbGVtZW50YXRpb24ucmV2aXNpb259Ii8+CisgICAgICA8L2ZpbHRlcnNldD4KKyAgICA8L2NvcHk+CisKKyAgICA8IS0tIENyZWF0ZSBKQVIgZmlsZSAtLT4KKyAgICA8amFyIGphcmZpbGU9IiR7c2VydmxldC1hcGkuamFyfSIKKyAgICAgICAgIGJhc2VkaXI9IiR7c2VydmxldC1hcGkuYnVpbGR9L2NsYXNzZXMiCisgICAgICAgICBtYW5pZmVzdD0iJHtzZXJ2bGV0LWFwaS5idWlsZH0vbWFuaWZlc3QiPgorICAgICAgPGluY2x1ZGUgbmFtZT0iamF2YXgvc2VydmxldC8qKiIvPgorICAgICAgPGV4Y2x1ZGUgbmFtZT0iamF2YXgvc2VydmxldC9qc3AvKioiLz4KKyAgICA8L2phcj4KKworICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImRpc3QiIGRlcGVuZHM9ImNvbXBpbGUsZXhhbXBsZXMsamF2YWRvYyxqYXIiCisgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBiaW5hcnkgZGlzdHJpYnV0aW9uIj4KKworICAgIDwhLS0gQ29weSBKYXZhZG9jcyAtLT4KKyAgICA8Y29weSB0b2Rpcj0iJHtzZXJ2bGV0LWFwaS5kaXN0fS9kb2NzL2FwaSI+CisgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtzZXJ2bGV0LWFwaS5idWlsZH0vZG9jcy9hcGkiLz4KKyAgICA8L2NvcHk+CisKKyAgICA8IS0tIENvcHkgQVBJIHNvdXJjZSBmaWxlcyAtLT4KKyAgICA8Y29weSB0b2Rpcj0iJHtzZXJ2bGV0LWFwaS5kaXN0fS9zcmMiPgorICAgICAgICA8ZmlsZXNldCBkaXI9InNyYy9zaGFyZSIvPgorICAgIDwvY29weT4KKworICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PSBDbGVhbiBHZW5lcmF0ZWQgRmlsZXMgPT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImNsZWFuIgorICAgZGVzY3JpcHRpb249IkNsZWFuIHByZXZpb3VzIGJ1aWxkIHJlc3VsdHMiPgorCisgICAgPGRlbGV0ZSBkaXI9IiR7c2VydmxldC1hcGkuYnVpbGR9Ii8+CisgICAgPGRlbGV0ZSBkaXI9IiR7c2VydmxldC1hcGkuZGlzdH0iLz4KKworICA8L3RhcmdldD4KKworCisgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PSBBbGwgSW4gT25lIEJ1aWxkID09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8dGFyZ2V0IG5hbWU9ImFsbCIgZGVwZW5kcz0iY2xlYW4sZGlzdCIKKyAgIGRlc2NyaXB0aW9uPSJDbGVhbiwgY29tcGlsZSwgYW5kIGRpc3QiLz4KKworCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1NC9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvQ29va2llRXhhbXBsZS5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTQvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL0Nvb2tpZUV4YW1wbGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDcwYmVmCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTQvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL0Nvb2tpZUV4YW1wbGUuamF2YQpAQCAtMCwwICsxLDEyMSBAQAorLyoKKyogQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLyogJElkJAorICoKKyAqLworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEudGV4dC4qOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworaW1wb3J0IHV0aWwuSFRNTEZpbHRlcjsKKworLyoqCisgKiBFeGFtcGxlIHNlcnZsZXQgc2hvd2luZyByZXF1ZXN0IGhlYWRlcnMKKyAqCisgKiBAYXV0aG9yIEphbWVzIER1bmNhbiBEYXZpZHNvbiA8ZHVuY2FuQGVuZy5zdW4uY29tPgorICovCisKK3B1YmxpYyBjbGFzcyBDb29raWVFeGFtcGxlIGV4dGVuZHMgSHR0cFNlcnZsZXQgeworCisgICAgUmVzb3VyY2VCdW5kbGUgcmIgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoIkxvY2FsU3RyaW5ncyIpOworICAgIAorICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvaHRtbCIpOworCisgICAgICAgIFByaW50V3JpdGVyIG91dCA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworICAgICAgICBvdXQucHJpbnRsbigiPGh0bWw+Iik7CisgICAgICAgIG91dC5wcmludGxuKCI8Ym9keSBiZ2NvbG9yPVwid2hpdGVcIj4iKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjxoZWFkPiIpOworCisgICAgICAgIFN0cmluZyB0aXRsZSA9IHJiLmdldFN0cmluZygiY29va2llcy50aXRsZSIpOworICAgICAgICBvdXQucHJpbnRsbigiPHRpdGxlPiIgKyB0aXRsZSArICI8L3RpdGxlPiIpOworICAgICAgICBvdXQucHJpbnRsbigiPC9oZWFkPiIpOworICAgICAgICBvdXQucHJpbnRsbigiPGJvZHk+Iik7CisKKwkvLyByZWxhdGl2ZSBsaW5rcworCisgICAgICAgIC8vIFhYWAorICAgICAgICAvLyBtYWtpbmcgdGhlc2UgYWJzb2x1dGUgdGlsbCB3ZSB3b3JrIG91dCB0aGUKKyAgICAgICAgLy8gYWRkaXRpb24gb2YgYSBQYXRoSW5mbyBpc3N1ZSAKKwkKKyAgICAgICAgb3V0LnByaW50bG4oIjxhIGhyZWY9XCIuLi9jb29raWVzLmh0bWxcIj4iKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjxpbWcgc3JjPVwiLi4vaW1hZ2VzL2NvZGUuZ2lmXCIgaGVpZ2h0PTI0ICIgKworICAgICAgICAgICAgICAgICAgICAid2lkdGg9MjQgYWxpZ249cmlnaHQgYm9yZGVyPTAgYWx0PVwidmlldyBjb2RlXCI+PC9hPiIpOworICAgICAgICBvdXQucHJpbnRsbigiPGEgaHJlZj1cIi4uL2luZGV4Lmh0bWxcIj4iKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjxpbWcgc3JjPVwiLi4vaW1hZ2VzL3JldHVybi5naWZcIiBoZWlnaHQ9MjQgIiArCisgICAgICAgICAgICAgICAgICAgICJ3aWR0aD0yNCBhbGlnbj1yaWdodCBib3JkZXI9MCBhbHQ9XCJyZXR1cm5cIj48L2E+Iik7CisKKyAgICAgICAgb3V0LnByaW50bG4oIjxoMz4iICsgdGl0bGUgKyAiPC9oMz4iKTsKKworICAgICAgICBDb29raWVbXSBjb29raWVzID0gcmVxdWVzdC5nZXRDb29raWVzKCk7CisgICAgICAgIGlmICgoY29va2llcyAhPSBudWxsKSAmJiAoY29va2llcy5sZW5ndGggPiAwKSkgeworICAgICAgICAgICAgb3V0LnByaW50bG4ocmIuZ2V0U3RyaW5nKCJjb29raWVzLmNvb2tpZXMiKSArICI8YnI+Iik7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvb2tpZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBDb29raWUgY29va2llID0gY29va2llc1tpXTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoIkNvb2tpZSBOYW1lOiAiICsgSFRNTEZpbHRlci5maWx0ZXIoY29va2llLmdldE5hbWUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiPGJyPiIpOworICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCIgIENvb2tpZSBWYWx1ZTogIiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEhUTUxGaWx0ZXIuZmlsdGVyKGNvb2tpZS5nZXRWYWx1ZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjxicj48YnI+Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvdXQucHJpbnRsbihyYi5nZXRTdHJpbmcoImNvb2tpZXMubm8tY29va2llcyIpKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBjb29raWVOYW1lID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoImNvb2tpZW5hbWUiKTsKKyAgICAgICAgU3RyaW5nIGNvb2tpZVZhbHVlID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoImNvb2tpZXZhbHVlIik7CisgICAgICAgIGlmIChjb29raWVOYW1lICE9IG51bGwgJiYgY29va2llVmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgQ29va2llIGNvb2tpZSA9IG5ldyBDb29raWUoY29va2llTmFtZSwgY29va2llVmFsdWUpOworICAgICAgICAgICAgcmVzcG9uc2UuYWRkQ29va2llKGNvb2tpZSk7CisgICAgICAgICAgICBvdXQucHJpbnRsbigiPFA+Iik7CisgICAgICAgICAgICBvdXQucHJpbnRsbihyYi5nZXRTdHJpbmcoImNvb2tpZXMuc2V0IikgKyAiPGJyPiIpOworICAgICAgICAgICAgb3V0LnByaW50KHJiLmdldFN0cmluZygiY29va2llcy5uYW1lIikgKyAiICAiIAorICAgICAgICAgICAgICAgICAgICAgICsgSFRNTEZpbHRlci5maWx0ZXIoY29va2llTmFtZSkgKyAiPGJyPiIpOworICAgICAgICAgICAgb3V0LnByaW50KHJiLmdldFN0cmluZygiY29va2llcy52YWx1ZSIpICsgIiAgIiAKKyAgICAgICAgICAgICAgICAgICAgICArIEhUTUxGaWx0ZXIuZmlsdGVyKGNvb2tpZVZhbHVlKSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIG91dC5wcmludGxuKCI8UD4iKTsKKyAgICAgICAgb3V0LnByaW50bG4ocmIuZ2V0U3RyaW5nKCJjb29raWVzLm1ha2UtY29va2llIikgKyAiPGJyPiIpOworICAgICAgICBvdXQucHJpbnQoIjxmb3JtIGFjdGlvbj1cIiIpOworICAgICAgICBvdXQucHJpbnRsbigiQ29va2llRXhhbXBsZVwiIG1ldGhvZD1QT1NUPiIpOworICAgICAgICBvdXQucHJpbnQocmIuZ2V0U3RyaW5nKCJjb29raWVzLm5hbWUiKSArICIgICIpOworICAgICAgICBvdXQucHJpbnRsbigiPGlucHV0IHR5cGU9dGV4dCBsZW5ndGg9MjAgbmFtZT1jb29raWVuYW1lPjxicj4iKTsKKyAgICAgICAgb3V0LnByaW50KHJiLmdldFN0cmluZygiY29va2llcy52YWx1ZSIpICsgIiAgIik7CisgICAgICAgIG91dC5wcmludGxuKCI8aW5wdXQgdHlwZT10ZXh0IGxlbmd0aD0yMCBuYW1lPWNvb2tpZXZhbHVlPjxicj4iKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjxpbnB1dCB0eXBlPXN1Ym1pdD48L2Zvcm0+Iik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIAorICAgICAgICBvdXQucHJpbnRsbigiPC9ib2R5PiIpOworICAgICAgICBvdXQucHJpbnRsbigiPC9odG1sPiIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRvUG9zdChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIGRvR2V0KHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICB9CisKK30KKworCmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1NC9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvSGVsbG9Xb3JsZEV4YW1wbGUuamF2YSBiL3NlcnZsZXRhcGkvanNyMTU0L2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9IZWxsb1dvcmxkRXhhbXBsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3MTM2MDAKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1NC9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvSGVsbG9Xb3JsZEV4YW1wbGUuamF2YQpAQCAtMCwwICsxLDc1IEBACisvKgorKiBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisvKiAkSWQkCisgKgorICovCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS50ZXh0Lio7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisvKioKKyAqIFRoZSBzaW1wbGVzdCBwb3NzaWJsZSBzZXJ2bGV0LgorICoKKyAqIEBhdXRob3IgSmFtZXMgRHVuY2FuIERhdmlkc29uCisgKi8KKworcHVibGljIGNsYXNzIEhlbGxvV29ybGRFeGFtcGxlIGV4dGVuZHMgSHR0cFNlcnZsZXQgeworCisKKyAgICBwdWJsaWMgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIFJlc291cmNlQnVuZGxlIHJiID0KKyAgICAgICAgICAgIFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgiTG9jYWxTdHJpbmdzIixyZXF1ZXN0LmdldExvY2FsZSgpKTsKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvaHRtbCIpOworICAgICAgICBQcmludFdyaXRlciBvdXQgPSByZXNwb25zZS5nZXRXcml0ZXIoKTsKKworICAgICAgICBvdXQucHJpbnRsbigiPGh0bWw+Iik7CisgICAgICAgIG91dC5wcmludGxuKCI8aGVhZD4iKTsKKworCSAgICBTdHJpbmcgdGl0bGUgPSByYi5nZXRTdHJpbmcoImhlbGxvd29ybGQudGl0bGUiKTsKKworCSAgICBvdXQucHJpbnRsbigiPHRpdGxlPiIgKyB0aXRsZSArICI8L3RpdGxlPiIpOworICAgICAgICBvdXQucHJpbnRsbigiPC9oZWFkPiIpOworICAgICAgICBvdXQucHJpbnRsbigiPGJvZHkgYmdjb2xvcj1cIndoaXRlXCI+Iik7CisKKwkvLyBub3RlIHRoYXQgYWxsIGxpbmtzIGFyZSBjcmVhdGVkIHRvIGJlIHJlbGF0aXZlLiB0aGlzCisJLy8gZW5zdXJlcyB0aGF0IHdlIGNhbiBtb3ZlIHRoZSB3ZWIgYXBwbGljYXRpb24gdGhhdCB0aGlzCisJLy8gc2VydmxldCBiZWxvbmdzIHRvIHRvIGEgZGlmZmVyZW50IHBsYWNlIGluIHRoZSB1cmwKKwkvLyB0cmVlIGFuZCBub3QgaGF2ZSBhbnkgaGFybWZ1bCBzaWRlIGVmZmVjdHMuCisKKyAgICAgICAgLy8gWFhYCisgICAgICAgIC8vIG1ha2luZyB0aGVzZSBhYnNvbHV0ZSB0aWxsIHdlIHdvcmsgb3V0IHRoZQorICAgICAgICAvLyBhZGRpdGlvbiBvZiBhIFBhdGhJbmZvIGlzc3VlCisKKwkgICAgb3V0LnByaW50bG4oIjxhIGhyZWY9XCIuLi9oZWxsb3dvcmxkLmh0bWxcIj4iKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjxpbWcgc3JjPVwiLi4vaW1hZ2VzL2NvZGUuZ2lmXCIgaGVpZ2h0PTI0ICIgKworICAgICAgICAgICAgICAgICAgICAid2lkdGg9MjQgYWxpZ249cmlnaHQgYm9yZGVyPTAgYWx0PVwidmlldyBjb2RlXCI+PC9hPiIpOworICAgICAgICBvdXQucHJpbnRsbigiPGEgaHJlZj1cIi4uL2luZGV4Lmh0bWxcIj4iKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjxpbWcgc3JjPVwiLi4vaW1hZ2VzL3JldHVybi5naWZcIiBoZWlnaHQ9MjQgIiArCisgICAgICAgICAgICAgICAgICAgICJ3aWR0aD0yNCBhbGlnbj1yaWdodCBib3JkZXI9MCBhbHQ9XCJyZXR1cm5cIj48L2E+Iik7CisgICAgICAgIG91dC5wcmludGxuKCI8aDE+IiArIHRpdGxlICsgIjwvaDE+Iik7CisgICAgICAgIG91dC5wcmludGxuKCI8L2JvZHk+Iik7CisgICAgICAgIG91dC5wcmludGxuKCI8L2h0bWw+Iik7CisgICAgfQorfQorCisKKwpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTQvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL0xvY2FsU3RyaW5ncy5wcm9wZXJ0aWVzIGIvc2VydmxldGFwaS9qc3IxNTQvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL0xvY2FsU3RyaW5ncy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhM2NiYWEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1NC9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvTG9jYWxTdHJpbmdzLnByb3BlcnRpZXMKQEAgLTAsMCArMSw1MiBAQAorIyBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyAkSWQkCisKKyMgRGVmYXVsdCBsb2NhbGl6ZWQgcmVzb3VyY2VzIGZvciBleGFtcGxlIHNlcnZsZXRzCisjIFRoaXMgbG9jYWxlIGlzIGVuX1VTCisKK2hlbGxvd29ybGQudGl0bGU9SGVsbG8gV29ybGQhCisKK3JlcXVlc3RpbmZvLnRpdGxlPVJlcXVlc3QgSW5mb3JtYXRpb24gRXhhbXBsZQorcmVxdWVzdGluZm8ubGFiZWwubWV0aG9kPU1ldGhvZDoKK3JlcXVlc3RpbmZvLmxhYmVsLnJlcXVlc3R1cmk9UmVxdWVzdCBVUkk6CityZXF1ZXN0aW5mby5sYWJlbC5wcm90b2NvbD1Qcm90b2NvbDoKK3JlcXVlc3RpbmZvLmxhYmVsLnBhdGhpbmZvPVBhdGggSW5mbzoKK3JlcXVlc3RpbmZvLmxhYmVsLnJlbW90ZWFkZHI9UmVtb3RlIEFkZHJlc3M6CisKK3JlcXVlc3RoZWFkZXIudGl0bGU9UmVxdWVzdCBIZWFkZXIgRXhhbXBsZQorCityZXF1ZXN0cGFyYW1zLnRpdGxlPVJlcXVlc3QgUGFyYW1ldGVycyBFeGFtcGxlCityZXF1ZXN0cGFyYW1zLnBhcmFtcy1pbi1yZXE9UGFyYW1ldGVycyBpbiB0aGlzIHJlcXVlc3Q6CityZXF1ZXN0cGFyYW1zLm5vLXBhcmFtcz1ObyBQYXJhbWV0ZXJzLCBQbGVhc2UgZW50ZXIgc29tZQorcmVxdWVzdHBhcmFtcy5maXJzdG5hbWU9Rmlyc3QgTmFtZToKK3JlcXVlc3RwYXJhbXMubGFzdG5hbWU9TGFzdCBOYW1lOgorCitjb29raWVzLnRpdGxlPUNvb2tpZXMgRXhhbXBsZQorY29va2llcy5jb29raWVzPVlvdXIgYnJvd3NlciBpcyBzZW5kaW5nIHRoZSBmb2xsb3dpbmcgY29va2llczoKK2Nvb2tpZXMubm8tY29va2llcz1Zb3VyIGJyb3dzZXIgaXNuJ3Qgc2VuZGluZyBhbnkgY29va2llcworY29va2llcy5tYWtlLWNvb2tpZT1DcmVhdGUgYSBjb29raWUgdG8gc2VuZCB0byB5b3VyIGJyb3dzZXIKK2Nvb2tpZXMubmFtZT1OYW1lOgorY29va2llcy52YWx1ZT1WYWx1ZToKK2Nvb2tpZXMuc2V0PVlvdSBqdXN0IHNlbnQgdGhlIGZvbGxvd2luZyBjb29raWUgdG8geW91ciBicm93c2VyOgorCitzZXNzaW9ucy50aXRsZT1TZXNzaW9ucyBFeGFtcGxlCitzZXNzaW9ucy5pZD1TZXNzaW9uIElEOgorc2Vzc2lvbnMuY3JlYXRlZD1DcmVhdGVkOgorc2Vzc2lvbnMubGFzdGFjY2Vzc2VkPUxhc3QgQWNjZXNzZWQ6CitzZXNzaW9ucy5kYXRhPVRoZSBmb2xsb3dpbmcgZGF0YSBpcyBpbiB5b3VyIHNlc3Npb246CitzZXNzaW9ucy5hZGRkYXRhPUFkZCBkYXRhIHRvIHlvdXIgc2Vzc2lvbgorc2Vzc2lvbnMuZGF0YW5hbWU9TmFtZSBvZiBTZXNzaW9uIEF0dHJpYnV0ZToKK3Nlc3Npb25zLmRhdGF2YWx1ZT1WYWx1ZSBvZiBTZXNzaW9uIEF0dHJpYnV0ZToKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTU0L2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9Mb2NhbFN0cmluZ3NfZW4ucHJvcGVydGllcyBiL3NlcnZsZXRhcGkvanNyMTU0L2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9Mb2NhbFN0cmluZ3NfZW4ucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTNjYmFhCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTQvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL0xvY2FsU3RyaW5nc19lbi5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNTIgQEAKKyMgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMgJElkJAorCisjIERlZmF1bHQgbG9jYWxpemVkIHJlc291cmNlcyBmb3IgZXhhbXBsZSBzZXJ2bGV0cworIyBUaGlzIGxvY2FsZSBpcyBlbl9VUworCitoZWxsb3dvcmxkLnRpdGxlPUhlbGxvIFdvcmxkIQorCityZXF1ZXN0aW5mby50aXRsZT1SZXF1ZXN0IEluZm9ybWF0aW9uIEV4YW1wbGUKK3JlcXVlc3RpbmZvLmxhYmVsLm1ldGhvZD1NZXRob2Q6CityZXF1ZXN0aW5mby5sYWJlbC5yZXF1ZXN0dXJpPVJlcXVlc3QgVVJJOgorcmVxdWVzdGluZm8ubGFiZWwucHJvdG9jb2w9UHJvdG9jb2w6CityZXF1ZXN0aW5mby5sYWJlbC5wYXRoaW5mbz1QYXRoIEluZm86CityZXF1ZXN0aW5mby5sYWJlbC5yZW1vdGVhZGRyPVJlbW90ZSBBZGRyZXNzOgorCityZXF1ZXN0aGVhZGVyLnRpdGxlPVJlcXVlc3QgSGVhZGVyIEV4YW1wbGUKKworcmVxdWVzdHBhcmFtcy50aXRsZT1SZXF1ZXN0IFBhcmFtZXRlcnMgRXhhbXBsZQorcmVxdWVzdHBhcmFtcy5wYXJhbXMtaW4tcmVxPVBhcmFtZXRlcnMgaW4gdGhpcyByZXF1ZXN0OgorcmVxdWVzdHBhcmFtcy5uby1wYXJhbXM9Tm8gUGFyYW1ldGVycywgUGxlYXNlIGVudGVyIHNvbWUKK3JlcXVlc3RwYXJhbXMuZmlyc3RuYW1lPUZpcnN0IE5hbWU6CityZXF1ZXN0cGFyYW1zLmxhc3RuYW1lPUxhc3QgTmFtZToKKworY29va2llcy50aXRsZT1Db29raWVzIEV4YW1wbGUKK2Nvb2tpZXMuY29va2llcz1Zb3VyIGJyb3dzZXIgaXMgc2VuZGluZyB0aGUgZm9sbG93aW5nIGNvb2tpZXM6Citjb29raWVzLm5vLWNvb2tpZXM9WW91ciBicm93c2VyIGlzbid0IHNlbmRpbmcgYW55IGNvb2tpZXMKK2Nvb2tpZXMubWFrZS1jb29raWU9Q3JlYXRlIGEgY29va2llIHRvIHNlbmQgdG8geW91ciBicm93c2VyCitjb29raWVzLm5hbWU9TmFtZToKK2Nvb2tpZXMudmFsdWU9VmFsdWU6Citjb29raWVzLnNldD1Zb3UganVzdCBzZW50IHRoZSBmb2xsb3dpbmcgY29va2llIHRvIHlvdXIgYnJvd3NlcjoKKworc2Vzc2lvbnMudGl0bGU9U2Vzc2lvbnMgRXhhbXBsZQorc2Vzc2lvbnMuaWQ9U2Vzc2lvbiBJRDoKK3Nlc3Npb25zLmNyZWF0ZWQ9Q3JlYXRlZDoKK3Nlc3Npb25zLmxhc3RhY2Nlc3NlZD1MYXN0IEFjY2Vzc2VkOgorc2Vzc2lvbnMuZGF0YT1UaGUgZm9sbG93aW5nIGRhdGEgaXMgaW4geW91ciBzZXNzaW9uOgorc2Vzc2lvbnMuYWRkZGF0YT1BZGQgZGF0YSB0byB5b3VyIHNlc3Npb24KK3Nlc3Npb25zLmRhdGFuYW1lPU5hbWUgb2YgU2Vzc2lvbiBBdHRyaWJ1dGU6CitzZXNzaW9ucy5kYXRhdmFsdWU9VmFsdWUgb2YgU2Vzc2lvbiBBdHRyaWJ1dGU6CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1NC9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvTG9jYWxTdHJpbmdzX2VzLnByb3BlcnRpZXMgYi9zZXJ2bGV0YXBpL2pzcjE1NC9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvTG9jYWxTdHJpbmdzX2VzLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFlNjcxMgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTU0L2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9Mb2NhbFN0cmluZ3NfZXMucHJvcGVydGllcwpAQCAtMCwwICsxLDUyIEBACisjIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjICRJZCQKKyMKKyMgRGVmYXVsdCBsb2NhbGl6ZWQgc3RyaW5nIGluZm9ybWF0aW9uCisjIExvY2FsaXplZCBwYXJhIExvY2FsZSBlc19FUworCitoZWxsb3dvcmxkLnRpdGxlPUhvbGEgTXVuZG8hCisKK3JlcXVlc3RpbmZvLnRpdGxlPUVqZW1wbG8gZGUgSW5mb3JtYWNpb24gZGUgUmVxdWVzdAorcmVxdWVzdGluZm8ubGFiZWwubWV0aG9kPU1ldG9kbzoKK3JlcXVlc3RpbmZvLmxhYmVsLnJlcXVlc3R1cmk9UmVxdWVzdCBVUkk6CityZXF1ZXN0aW5mby5sYWJlbC5wcm90b2NvbD1Qcm90b2NvbG86CityZXF1ZXN0aW5mby5sYWJlbC5wYXRoaW5mbz1QYXRoIEluZm86CityZXF1ZXN0aW5mby5sYWJlbC5yZW1vdGVhZGRyPURpcmVjY2lvbiBSZW1vdGE6CisKK3JlcXVlc3RoZWFkZXIudGl0bGU9RWplbXBsbyBkZSBDYWJlY2VyYSBkZSBSZXF1ZXN0CisKK3JlcXVlc3RwYXJhbXMudGl0bGU9RWplbXBsbyBkZSBwYXJhbWV0cm9zIGRlIFJlcXVlc3QKK3JlcXVlc3RwYXJhbXMucGFyYW1zLWluLXJlcT1QYXJhbWV0cm9zIGVuIGVzdGUgUmVxdWVzdDoKK3JlcXVlc3RwYXJhbXMubm8tcGFyYW1zPU5vIGhheSBwYXJhbWV0cm8uIHBvciBmYXZvciB1c2EgYWxndW5vCityZXF1ZXN0cGFyYW1zLmZpcnN0bmFtZT1Ob21icmU6CityZXF1ZXN0cGFyYW1zLmxhc3RuYW1lPUFwZWxsaWRvczoKKworY29va2llcy50aXRsZT1FamVtcGxvIGRlIENvb2tpZXMKK2Nvb2tpZXMuY29va2llcz1UdSBuYXZlZ2Fkb3IgZXN0YSBlbnZpYW5kbyBsb3Mgc2lndWllbnRlcyBjb29raWVzOgorY29va2llcy5uby1jb29raWVzPVR1IG5hdmVnYWRvciBubyBlc3RhIGVudmlhbmRvIGNvb2tpZXMKK2Nvb2tpZXMubWFrZS1jb29raWU9Q3JlYSB1biBjb29raWUgcGFyYSBlbnZpYXJsbyBhIHR1IG5hdmVnYWRvcgorY29va2llcy5uYW1lPU5vbWJyZToKK2Nvb2tpZXMudmFsdWU9VmFsb3I6Citjb29raWVzLnNldD1BY2FiYXMgZGUgZW52aWFyIGEgdHUgbmF2ZWdhZG9yIGVzdG9zIGNvb2tpZXM6CisKK3Nlc3Npb25zLnRpdGxlPWVqZW1wbG8gZGUgU2VzaW9uZXMKK3Nlc3Npb25zLmlkPUlEIGRlIFNlc2lvbjoKK3Nlc3Npb25zLmNyZWF0ZWQ9Q3JlYWRvOgorc2Vzc2lvbnMubGFzdGFjY2Vzc2VkPVVsdGltbyBBY2Nlc286CitzZXNzaW9ucy5kYXRhPUxvIHNpZ3VpZW50ZXMgZGF0b3MgZXN0YW4gZW4gdHUgc2VzaW9uOgorc2Vzc2lvbnMuYWRkZGF0YT1B8WFkZSBkYXRvcyBhIHR1IHNlc2lvbjoKK3Nlc3Npb25zLmRhdGFuYW1lPU5vbWJyZSBkZWwgYXRyaWJ1dG8gZGUgc2VzaW9uOgorc2Vzc2lvbnMuZGF0YXZhbHVlPVZhbG9yIGRlbCBhdHJpYnV0byBkZSBzZXNpb246CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1NC9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvTG9jYWxTdHJpbmdzX2ZyLnByb3BlcnRpZXMgYi9zZXJ2bGV0YXBpL2pzcjE1NC9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvTG9jYWxTdHJpbmdzX2ZyLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjEyY2IwNQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTU0L2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9Mb2NhbFN0cmluZ3NfZnIucHJvcGVydGllcwpAQCAtMCwwICsxLDUyIEBACisjIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjICRJZCQKKworIyBEZWZhdWx0IGxvY2FsaXplZCByZXNvdXJjZXMgZm9yIGV4YW1wbGUgc2VydmxldHMKKyMgVGhpcyBsb2NhbGUgaXMgZnJfRlIKKworaGVsbG93b3JsZC50aXRsZT1TYWx1dCBsZSBNb25kZSEKKworcmVxdWVzdGluZm8udGl0bGU9RXhlbXBsZSBkJydpbmZvcm1hdGlvbiBzdXIgbGEgcmVxdep0ZQorcmVxdWVzdGluZm8ubGFiZWwubWV0aG9kPU3pdGhvZGU6CityZXF1ZXN0aW5mby5sYWJlbC5yZXF1ZXN0dXJpPVVSSSBkZSByZXF16nRlOgorcmVxdWVzdGluZm8ubGFiZWwucHJvdG9jb2w9UHJvdG9jb2xlOgorcmVxdWVzdGluZm8ubGFiZWwucGF0aGluZm89SW5mbyBkZSBjaGVtaW46CityZXF1ZXN0aW5mby5sYWJlbC5yZW1vdGVhZGRyPUFkcmVzc2UgZGlzdGFudGU6CisKK3JlcXVlc3RoZWFkZXIudGl0bGU9RXhlbXBsZSBkJydpbmZvcm1hdGlvbiBzdXIgbGVzIGVudOp0ZSBkZSByZXF16nRlCisKK3JlcXVlc3RwYXJhbXMudGl0bGU9RXhlbXBsZSBkZSByZXF16nRlIGF2ZWMgcGFyYW3qdHJlcworcmVxdWVzdHBhcmFtcy5wYXJhbXMtaW4tcmVxPVBhcmFt6nRyZXMgZGFucyBsYSByZXF16nRlOgorcmVxdWVzdHBhcmFtcy5uby1wYXJhbXM9UGFzIGRlIHBhcmFt6nRyZSwgbWVyY2kgZGFucyBzYWlzaXIgcXVlbHF1J3VucworcmVxdWVzdHBhcmFtcy5maXJzdG5hbWU9UHLpbm9tOgorcmVxdWVzdHBhcmFtcy5sYXN0bmFtZT1Ob206CisKK2Nvb2tpZXMudGl0bGU9RXhlbXBsZSBkJyd1dGlsaXNhdGlvbiBkZSBDb29raWVzCitjb29raWVzLmNvb2tpZXM9Vm90cmUgbmF2aWdhdGV1ciByZXRvdXJuZSBsZXMgY29va2llcyBzdWl2YW50OgorY29va2llcy5uby1jb29raWVzPVZvdHJlIG5hdmlnYXRldXIgbmUgcmV0b3VybmUgYXVjdW4gY29va2llCitjb29raWVzLm1ha2UtY29va2llPUNy6WF0aW9uIGQnJ3VuIGNvb2tpZSDgIHJldG91cm5lciDgIHZvdHJlIG5hdmlnYXRldXIKK2Nvb2tpZXMubmFtZT1Ob206Citjb29raWVzLnZhbHVlPVZhbGV1cjoKK2Nvb2tpZXMuc2V0PVZvdXMgdmVuZXogZCcnZW52b3llciBsZSBjb29raWUgc3VpdmFudCDgIHZvdHJlIG5hdmlnYXRldXI6CisKK3Nlc3Npb25zLnRpdGxlPUV4ZW1wbGUgZGUgU2Vzc2lvbnMKK3Nlc3Npb25zLmlkPUlEIGRlIFNlc3Npb246CitzZXNzaW9ucy5jcmVhdGVkPUNy6WUgbGU6CitzZXNzaW9ucy5sYXN0YWNjZXNzZWQ9RGVybmllciBhY2PoczoKK3Nlc3Npb25zLmRhdGE9TGVzIGRvbm7pZXMgZXhpc3RhbnRlcyBkYW5zIHZvdHJlIHNlc3Npb246CitzZXNzaW9ucy5hZGRkYXRhPUFqb3V0ZXIgZGVzIGRvbm7pZXMg4CB2b3RyZSBzZXNzaW9uCitzZXNzaW9ucy5kYXRhbmFtZT1Ob20gZGUgbCcnQXR0cmlidXQgZGUgU2Vzc2lvbjoKK3Nlc3Npb25zLmRhdGF2YWx1ZT1WYWxldXIgZGUgbCcnQXR0cmlidXQgZGUgU2Vzc2lvbjoKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTU0L2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9Mb2NhbFN0cmluZ3NfcHQucHJvcGVydGllcyBiL3NlcnZsZXRhcGkvanNyMTU0L2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9Mb2NhbFN0cmluZ3NfcHQucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMThhMGIyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTQvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL0xvY2FsU3RyaW5nc19wdC5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNTIgQEAKKyMgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMgJElkJAorCisjIERlZmF1bHQgbG9jYWxpemVkIHJlc291cmNlcyBmb3IgZXhhbXBsZSBzZXJ2bGV0cworIyBUaGlzIGxvY2FsZSBpcyBwdF9QVAorCitoZWxsb3dvcmxkLnRpdGxlPU9sYSBNdW5kbyEKKworcmVxdWVzdGluZm8udGl0bGU9RXhlbXBsbyBkYSBJbmZvcm1hY2FvIGRvIFBlZGlkbworcmVxdWVzdGluZm8ubGFiZWwubWV0aG9kPU1ldG9kbzoKK3JlcXVlc3RpbmZvLmxhYmVsLnJlcXVlc3R1cmk9VVJJIGRvIFBlZGlkbzoKK3JlcXVlc3RpbmZvLmxhYmVsLnByb3RvY29sPVByb3RvY29sbzoKK3JlcXVlc3RpbmZvLmxhYmVsLnBhdGhpbmZvPUluZm9ybWFjYW8gZG8gQ2FtaW5obzoKK3JlcXVlc3RpbmZvLmxhYmVsLnJlbW90ZWFkZHI9RW5kZXJlY28gUmVtb3RvOgorCityZXF1ZXN0aGVhZGVyLnRpdGxlPUV4ZW1wbG8gZGEgQ2ViZWNlaXJhIGRvIFBlZGlkbworCityZXF1ZXN0cGFyYW1zLnRpdGxlPUV4YW1wbG8gZGUgUGFyYW1ldHJvcyBkbyBQZWRpZG8KK3JlcXVlc3RwYXJhbXMucGFyYW1zLWluLXJlcT1QYXJhbWV0cm9zIG5lc3RlIHBlZGlkbzoKK3JlcXVlc3RwYXJhbXMubm8tcGFyYW1zPVNlbSBQYXJhbWV0cm9zLCBQb3IgZmF2b3IgZW50cmUgYWxndW5zCityZXF1ZXN0cGFyYW1zLmZpcnN0bmFtZT1QcmltZWlybyBOb21lOgorcmVxdWVzdHBhcmFtcy5sYXN0bmFtZT1BcGVsaWRvOgorCitjb29raWVzLnRpdGxlPUNFeGFtcGxvIGRlIENvb2tpZXMKK2Nvb2tpZXMuY29va2llcz1PIHNlIGJyb3dzZXIgZXN0YSBhIGVudmlhciBvcyBzZWd1aW50ZXMgY29va2llczoKK2Nvb2tpZXMubm8tY29va2llcz1PIHNldSBicm93c2VyIG5hbyBlc3RhIGEgZW52aWFyIG5lbmh1bnMgY29va2llcworY29va2llcy5tYWtlLWNvb2tpZT1DcmllIHVtIGNvb2tpZSBwYXJhIGVudmlhciBwYXJhIG8gc2V1IGJyb3dzZXIKK2Nvb2tpZXMubmFtZT1Ob21lOgorY29va2llcy52YWx1ZT1WYWxvcjoKK2Nvb2tpZXMuc2V0PUFjYWJvdSBkZSBlbnZpYXIgbyBzZWd1aW50ZSBjb29raWUgcGFyYSBvIHNldSBicm93c2VyOgorCitzZXNzaW9ucy50aXRsZT1FeGFtcGxvIGRlIHNlc3NvZXMKK3Nlc3Npb25zLmlkPUlkZW50aWZpY2Fkb3IgZGEgU2Vzc2FvOgorc2Vzc2lvbnMuY3JlYXRlZD1DcmlhZGE6CitzZXNzaW9ucy5sYXN0YWNjZXNzZWQ9VWx0aW1hIHZleiBhY2VkaWRhOgorc2Vzc2lvbnMuZGF0YT1PcyBzZWd1aW50ZXMgZGFkb3MgZmF6ZW0gcGFydGUgZGEgc3VhIHNlc3NhbzoKK3Nlc3Npb25zLmFkZGRhdGE9QWRpY2lvbmUgZGF0YSBhIHN1YSBzZXNzYW8KK3Nlc3Npb25zLmRhdGFuYW1lPU5vbWUgZG8gYXRyaWJ1dG8gZGEgc2Vzc2FvOgorc2Vzc2lvbnMuZGF0YXZhbHVlPVZhbG9yIGRvIGF0cmlidXRvIGRhIFNlc3NhbzoKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTU0L2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9SZXF1ZXN0SGVhZGVyRXhhbXBsZS5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTQvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL1JlcXVlc3RIZWFkZXJFeGFtcGxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM3ODhkMwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTU0L2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9SZXF1ZXN0SGVhZGVyRXhhbXBsZS5qYXZhCkBAIC0wLDAgKzEsOTAgQEAKKy8qCisqIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy8qICRJZCQKKyAqCisgKi8KKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLnRleHQuKjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lio7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7CisKK2ltcG9ydCB1dGlsLkhUTUxGaWx0ZXI7CisKKy8qKgorICogRXhhbXBsZSBzZXJ2bGV0IHNob3dpbmcgcmVxdWVzdCBoZWFkZXJzCisgKgorICogQGF1dGhvciBKYW1lcyBEdW5jYW4gRGF2aWRzb24gPGR1bmNhbkBlbmcuc3VuLmNvbT4KKyAqLworCitwdWJsaWMgY2xhc3MgUmVxdWVzdEhlYWRlckV4YW1wbGUgZXh0ZW5kcyBIdHRwU2VydmxldCB7CisKKyAgICBSZXNvdXJjZUJ1bmRsZSByYiA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgiTG9jYWxTdHJpbmdzIik7CisgICAgCisgICAgcHVibGljIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uCisgICAgeworICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9odG1sIik7CisKKyAgICAgICAgUHJpbnRXcml0ZXIgb3V0ID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisgICAgICAgIG91dC5wcmludGxuKCI8aHRtbD4iKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjxib2R5IGJnY29sb3I9XCJ3aGl0ZVwiPiIpOworICAgICAgICBvdXQucHJpbnRsbigiPGhlYWQ+Iik7CisKKyAgICAgICAgU3RyaW5nIHRpdGxlID0gcmIuZ2V0U3RyaW5nKCJyZXF1ZXN0aGVhZGVyLnRpdGxlIik7CisgICAgICAgIG91dC5wcmludGxuKCI8dGl0bGU+IiArIHRpdGxlICsgIjwvdGl0bGU+Iik7CisgICAgICAgIG91dC5wcmludGxuKCI8L2hlYWQ+Iik7CisgICAgICAgIG91dC5wcmludGxuKCI8Ym9keT4iKTsKKworCS8vIGFsbCBsaW5rcyByZWxhdGl2ZQorCisgICAgICAgIC8vIFhYWAorICAgICAgICAvLyBtYWtpbmcgdGhlc2UgYWJzb2x1dGUgdGlsbCB3ZSB3b3JrIG91dCB0aGUKKyAgICAgICAgLy8gYWRkaXRpb24gb2YgYSBQYXRoSW5mbyBpc3N1ZSAKKwkKKyAgICAgICAgb3V0LnByaW50bG4oIjxhIGhyZWY9XCIuLi9yZXFoZWFkZXJzLmh0bWxcIj4iKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjxpbWcgc3JjPVwiLi4vaW1hZ2VzL2NvZGUuZ2lmXCIgaGVpZ2h0PTI0ICIgKworICAgICAgICAgICAgICAgICAgICAid2lkdGg9MjQgYWxpZ249cmlnaHQgYm9yZGVyPTAgYWx0PVwidmlldyBjb2RlXCI+PC9hPiIpOworICAgICAgICBvdXQucHJpbnRsbigiPGEgaHJlZj1cIi4uL2luZGV4Lmh0bWxcIj4iKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjxpbWcgc3JjPVwiLi4vaW1hZ2VzL3JldHVybi5naWZcIiBoZWlnaHQ9MjQgIiArCisgICAgICAgICAgICAgICAgICAgICJ3aWR0aD0yNCBhbGlnbj1yaWdodCBib3JkZXI9MCBhbHQ9XCJyZXR1cm5cIj48L2E+Iik7CisKKyAgICAgICAgb3V0LnByaW50bG4oIjxoMz4iICsgdGl0bGUgKyAiPC9oMz4iKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjx0YWJsZSBib3JkZXI9MD4iKTsKKyAgICAgICAgRW51bWVyYXRpb24gZSA9IHJlcXVlc3QuZ2V0SGVhZGVyTmFtZXMoKTsKKyAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBoZWFkZXJOYW1lID0gKFN0cmluZyllLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICBTdHJpbmcgaGVhZGVyVmFsdWUgPSByZXF1ZXN0LmdldEhlYWRlcihoZWFkZXJOYW1lKTsKKyAgICAgICAgICAgIG91dC5wcmludGxuKCI8dHI+PHRkIGJnY29sb3I9XCIjQ0NDQ0NDXCI+Iik7CisgICAgICAgICAgICBvdXQucHJpbnRsbihIVE1MRmlsdGVyLmZpbHRlcihoZWFkZXJOYW1lKSk7CisgICAgICAgICAgICBvdXQucHJpbnRsbigiPC90ZD48dGQ+Iik7CisgICAgICAgICAgICBvdXQucHJpbnRsbihIVE1MRmlsdGVyLmZpbHRlcihoZWFkZXJWYWx1ZSkpOworICAgICAgICAgICAgb3V0LnByaW50bG4oIjwvdGQ+PC90cj4iKTsKKyAgICAgICAgfQorICAgICAgICBvdXQucHJpbnRsbigiPC90YWJsZT4iKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkb1Bvc3QoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uCisgICAgeworICAgICAgICBkb0dldChyZXF1ZXN0LCByZXNwb25zZSk7CisgICAgfQorCit9CisKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTU0L2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9SZXF1ZXN0SW5mb0V4YW1wbGUuamF2YSBiL3NlcnZsZXRhcGkvanNyMTU0L2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9SZXF1ZXN0SW5mb0V4YW1wbGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTRkZjFhCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTQvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL1JlcXVlc3RJbmZvRXhhbXBsZS5qYXZhCkBAIC0wLDAgKzEsMTE0IEBACisvKgorKiBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisvKiAkSWQkCisgKgorICovCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS50ZXh0Lio7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCitpbXBvcnQgdXRpbC5IVE1MRmlsdGVyOworCisvKioKKyAqIEV4YW1wbGUgc2VydmxldCBzaG93aW5nIHJlcXVlc3QgaW5mb3JtYXRpb24uCisgKgorICogQGF1dGhvciBKYW1lcyBEdW5jYW4gRGF2aWRzb24gPGR1bmNhbkBlbmcuc3VuLmNvbT4KKyAqLworCitwdWJsaWMgY2xhc3MgUmVxdWVzdEluZm9FeGFtcGxlIGV4dGVuZHMgSHR0cFNlcnZsZXQgeworCisKKyAgICBSZXNvdXJjZUJ1bmRsZSByYiA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgiTG9jYWxTdHJpbmdzIik7CisKKyAgICBwdWJsaWMgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L2h0bWwiKTsKKworICAgICAgICBQcmludFdyaXRlciBvdXQgPSByZXNwb25zZS5nZXRXcml0ZXIoKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjxodG1sPiIpOworICAgICAgICBvdXQucHJpbnRsbigiPGJvZHk+Iik7CisgICAgICAgIG91dC5wcmludGxuKCI8aGVhZD4iKTsKKworICAgICAgICBTdHJpbmcgdGl0bGUgPSByYi5nZXRTdHJpbmcoInJlcXVlc3RpbmZvLnRpdGxlIik7CisgICAgICAgIG91dC5wcmludGxuKCI8dGl0bGU+IiArIHRpdGxlICsgIjwvdGl0bGU+Iik7CisgICAgICAgIG91dC5wcmludGxuKCI8L2hlYWQ+Iik7CisgICAgICAgIG91dC5wcmludGxuKCI8Ym9keSBiZ2NvbG9yPVwid2hpdGVcIj4iKTsKKworICAgICAgICAvLyBpbWcgc3R1ZmYgbm90IHJlcSdkIGZvciBzb3VyY2UgY29kZSBodG1sIHNob3dpbmcKKwkvLyBhbGwgbGlua3MgcmVsYXRpdmUhCisKKyAgICAgICAgLy8gWFhYCisgICAgICAgIC8vIG1ha2luZyB0aGVzZSBhYnNvbHV0ZSB0aWxsIHdlIHdvcmsgb3V0IHRoZQorICAgICAgICAvLyBhZGRpdGlvbiBvZiBhIFBhdGhJbmZvIGlzc3VlCisJCisgICAgICAgIG91dC5wcmludGxuKCI8YSBocmVmPVwiLi4vcmVxaW5mby5odG1sXCI+Iik7CisgICAgICAgIG91dC5wcmludGxuKCI8aW1nIHNyYz1cIi4uL2ltYWdlcy9jb2RlLmdpZlwiIGhlaWdodD0yNCAiICsKKyAgICAgICAgICAgICAgICAgICAgIndpZHRoPTI0IGFsaWduPXJpZ2h0IGJvcmRlcj0wIGFsdD1cInZpZXcgY29kZVwiPjwvYT4iKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjxhIGhyZWY9XCIuLi9pbmRleC5odG1sXCI+Iik7CisgICAgICAgIG91dC5wcmludGxuKCI8aW1nIHNyYz1cIi4uL2ltYWdlcy9yZXR1cm4uZ2lmXCIgaGVpZ2h0PTI0ICIgKworICAgICAgICAgICAgICAgICAgICAid2lkdGg9MjQgYWxpZ249cmlnaHQgYm9yZGVyPTAgYWx0PVwicmV0dXJuXCI+PC9hPiIpOworCisgICAgICAgIG91dC5wcmludGxuKCI8aDM+IiArIHRpdGxlICsgIjwvaDM+Iik7CisgICAgICAgIG91dC5wcmludGxuKCI8dGFibGUgYm9yZGVyPTA+PHRyPjx0ZD4iKTsKKyAgICAgICAgb3V0LnByaW50bG4ocmIuZ2V0U3RyaW5nKCJyZXF1ZXN0aW5mby5sYWJlbC5tZXRob2QiKSk7CisgICAgICAgIG91dC5wcmludGxuKCI8L3RkPjx0ZD4iKTsKKyAgICAgICAgb3V0LnByaW50bG4ocmVxdWVzdC5nZXRNZXRob2QoKSk7CisgICAgICAgIG91dC5wcmludGxuKCI8L3RkPjwvdHI+PHRyPjx0ZD4iKTsKKyAgICAgICAgb3V0LnByaW50bG4ocmIuZ2V0U3RyaW5nKCJyZXF1ZXN0aW5mby5sYWJlbC5yZXF1ZXN0dXJpIikpOworICAgICAgICBvdXQucHJpbnRsbigiPC90ZD48dGQ+Iik7ICAgICAgICAKKyAgICAgICAgb3V0LnByaW50bG4oSFRNTEZpbHRlci5maWx0ZXIocmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCkpKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjwvdGQ+PC90cj48dHI+PHRkPiIpOyAgICAgICAgCisgICAgICAgIG91dC5wcmludGxuKHJiLmdldFN0cmluZygicmVxdWVzdGluZm8ubGFiZWwucHJvdG9jb2wiKSk7CisgICAgICAgIG91dC5wcmludGxuKCI8L3RkPjx0ZD4iKTsgICAgICAgIAorICAgICAgICBvdXQucHJpbnRsbihyZXF1ZXN0LmdldFByb3RvY29sKCkpOworICAgICAgICBvdXQucHJpbnRsbigiPC90ZD48L3RyPjx0cj48dGQ+Iik7CisgICAgICAgIG91dC5wcmludGxuKHJiLmdldFN0cmluZygicmVxdWVzdGluZm8ubGFiZWwucGF0aGluZm8iKSk7CisgICAgICAgIG91dC5wcmludGxuKCI8L3RkPjx0ZD4iKTsgICAgICAgIAorICAgICAgICBvdXQucHJpbnRsbihIVE1MRmlsdGVyLmZpbHRlcihyZXF1ZXN0LmdldFBhdGhJbmZvKCkpKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjwvdGQ+PC90cj48dHI+PHRkPiIpOworICAgICAgICBvdXQucHJpbnRsbihyYi5nZXRTdHJpbmcoInJlcXVlc3RpbmZvLmxhYmVsLnJlbW90ZWFkZHIiKSk7CisKKyAJU3RyaW5nIGNpcGhlclN1aXRlPQorIAkgICAgKFN0cmluZylyZXF1ZXN0LmdldEF0dHJpYnV0ZSgiamF2YXguc2VydmxldC5yZXF1ZXN0LmNpcGhlcl9zdWl0ZSIpOworICAgICAgICBvdXQucHJpbnRsbigiPC90ZD48dGQ+Iik7ICAgICAgICAgICAgICAgIAorICAgICAgICBvdXQucHJpbnRsbihyZXF1ZXN0LmdldFJlbW90ZUFkZHIoKSk7CisgICAgICAgIG91dC5wcmludGxuKCI8L3RhYmxlPiIpOworCisgCWlmKGNpcGhlclN1aXRlIT1udWxsKXsKKyAJICAgIG91dC5wcmludGxuKCI8L3RkPjwvdHI+PHRyPjx0ZD4iKTsJCisgCSAgICBvdXQucHJpbnRsbigiU1NMQ2lwaGVyU3VpdGU6Iik7CisgCSAgICBvdXQucHJpbnRsbigiPC90ZD4iKTsKKyAJICAgIG91dC5wcmludGxuKCI8dGQ+Iik7CSAgICAKKyAJICAgIG91dC5wcmludGxuKHJlcXVlc3QuZ2V0QXR0cmlidXRlKCJqYXZheC5zZXJ2bGV0LnJlcXVlc3QuY2lwaGVyX3N1aXRlIikpOworCSAgICBvdXQucHJpbnRsbigiPC90ZD4iKTsJICAgIAorIAl9CisJCisgICAgfQorCisgICAgcHVibGljIHZvaWQgZG9Qb3N0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgZG9HZXQocmVxdWVzdCwgcmVzcG9uc2UpOworICAgIH0KKworfQorCmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1NC9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvUmVxdWVzdFBhcmFtRXhhbXBsZS5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTQvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL1JlcXVlc3RQYXJhbUV4YW1wbGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjUyZWVlCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTQvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL1JlcXVlc3RQYXJhbUV4YW1wbGUuamF2YQpAQCAtMCwwICsxLDEwNiBAQAorLyoKKyogQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLyogJElkJAorICoKKyAqLworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEudGV4dC4qOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworaW1wb3J0IHV0aWwuSFRNTEZpbHRlcjsKKworLyoqCisgKiBFeGFtcGxlIHNlcnZsZXQgc2hvd2luZyByZXF1ZXN0IGhlYWRlcnMKKyAqCisgKiBAYXV0aG9yIEphbWVzIER1bmNhbiBEYXZpZHNvbiA8ZHVuY2FuQGVuZy5zdW4uY29tPgorICovCisKK3B1YmxpYyBjbGFzcyBSZXF1ZXN0UGFyYW1FeGFtcGxlIGV4dGVuZHMgSHR0cFNlcnZsZXQgeworCisKKyAgICBSZXNvdXJjZUJ1bmRsZSByYiA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgiTG9jYWxTdHJpbmdzIik7CisgICAgCisgICAgcHVibGljIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uCisgICAgeworICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9odG1sIik7CisKKyAgICAgICAgUHJpbnRXcml0ZXIgb3V0ID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisgICAgICAgIG91dC5wcmludGxuKCI8aHRtbD4iKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjxib2R5PiIpOworICAgICAgICBvdXQucHJpbnRsbigiPGhlYWQ+Iik7CisKKyAgICAgICAgU3RyaW5nIHRpdGxlID0gcmIuZ2V0U3RyaW5nKCJyZXF1ZXN0cGFyYW1zLnRpdGxlIik7CisgICAgICAgIG91dC5wcmludGxuKCI8dGl0bGU+IiArIHRpdGxlICsgIjwvdGl0bGU+Iik7CisgICAgICAgIG91dC5wcmludGxuKCI8L2hlYWQ+Iik7CisgICAgICAgIG91dC5wcmludGxuKCI8Ym9keSBiZ2NvbG9yPVwid2hpdGVcIj4iKTsKKworICAgICAgICAvLyBpbWcgc3R1ZmYgbm90IHJlcSdkIGZvciBzb3VyY2UgY29kZSBodG1sIHNob3dpbmcKKworCS8vIGFsbCBsaW5rcyByZWxhdGl2ZQorCisgICAgICAgIC8vIFhYWAorICAgICAgICAvLyBtYWtpbmcgdGhlc2UgYWJzb2x1dGUgdGlsbCB3ZSB3b3JrIG91dCB0aGUKKyAgICAgICAgLy8gYWRkaXRpb24gb2YgYSBQYXRoSW5mbyBpc3N1ZSAKKwkKKyAgICAgICAgb3V0LnByaW50bG4oIjxhIGhyZWY9XCIuLi9yZXFwYXJhbXMuaHRtbFwiPiIpOworICAgICAgICBvdXQucHJpbnRsbigiPGltZyBzcmM9XCIuLi9pbWFnZXMvY29kZS5naWZcIiBoZWlnaHQ9MjQgIiArCisgICAgICAgICAgICAgICAgICAgICJ3aWR0aD0yNCBhbGlnbj1yaWdodCBib3JkZXI9MCBhbHQ9XCJ2aWV3IGNvZGVcIj48L2E+Iik7CisgICAgICAgIG91dC5wcmludGxuKCI8YSBocmVmPVwiLi4vaW5kZXguaHRtbFwiPiIpOworICAgICAgICBvdXQucHJpbnRsbigiPGltZyBzcmM9XCIuLi9pbWFnZXMvcmV0dXJuLmdpZlwiIGhlaWdodD0yNCAiICsKKyAgICAgICAgICAgICAgICAgICAgIndpZHRoPTI0IGFsaWduPXJpZ2h0IGJvcmRlcj0wIGFsdD1cInJldHVyblwiPjwvYT4iKTsKKworICAgICAgICBvdXQucHJpbnRsbigiPGgzPiIgKyB0aXRsZSArICI8L2gzPiIpOworICAgICAgICBTdHJpbmcgZmlyc3ROYW1lID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoImZpcnN0bmFtZSIpOworICAgICAgICBTdHJpbmcgbGFzdE5hbWUgPSByZXF1ZXN0LmdldFBhcmFtZXRlcigibGFzdG5hbWUiKTsKKyAgICAgICAgb3V0LnByaW50bG4ocmIuZ2V0U3RyaW5nKCJyZXF1ZXN0cGFyYW1zLnBhcmFtcy1pbi1yZXEiKSArICI8YnI+Iik7CisgICAgICAgIGlmIChmaXJzdE5hbWUgIT0gbnVsbCB8fCBsYXN0TmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICBvdXQucHJpbnRsbihyYi5nZXRTdHJpbmcoInJlcXVlc3RwYXJhbXMuZmlyc3RuYW1lIikpOworICAgICAgICAgICAgb3V0LnByaW50bG4oIiA9ICIgKyBIVE1MRmlsdGVyLmZpbHRlcihmaXJzdE5hbWUpICsgIjxicj4iKTsKKyAgICAgICAgICAgIG91dC5wcmludGxuKHJiLmdldFN0cmluZygicmVxdWVzdHBhcmFtcy5sYXN0bmFtZSIpKTsKKyAgICAgICAgICAgIG91dC5wcmludGxuKCIgPSAiICsgSFRNTEZpbHRlci5maWx0ZXIobGFzdE5hbWUpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG91dC5wcmludGxuKHJiLmdldFN0cmluZygicmVxdWVzdHBhcmFtcy5uby1wYXJhbXMiKSk7CisgICAgICAgIH0KKyAgICAgICAgb3V0LnByaW50bG4oIjxQPiIpOworICAgICAgICBvdXQucHJpbnQoIjxmb3JtIGFjdGlvbj1cIiIpOworICAgICAgICBvdXQucHJpbnQoIlJlcXVlc3RQYXJhbUV4YW1wbGVcIiAiKTsKKyAgICAgICAgb3V0LnByaW50bG4oIm1ldGhvZD1QT1NUPiIpOworICAgICAgICBvdXQucHJpbnRsbihyYi5nZXRTdHJpbmcoInJlcXVlc3RwYXJhbXMuZmlyc3RuYW1lIikpOworICAgICAgICBvdXQucHJpbnRsbigiPGlucHV0IHR5cGU9dGV4dCBzaXplPTIwIG5hbWU9Zmlyc3RuYW1lPiIpOworICAgICAgICBvdXQucHJpbnRsbigiPGJyPiIpOworICAgICAgICBvdXQucHJpbnRsbihyYi5nZXRTdHJpbmcoInJlcXVlc3RwYXJhbXMubGFzdG5hbWUiKSk7CisgICAgICAgIG91dC5wcmludGxuKCI8aW5wdXQgdHlwZT10ZXh0IHNpemU9MjAgbmFtZT1sYXN0bmFtZT4iKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjxicj4iKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjxpbnB1dCB0eXBlPXN1Ym1pdD4iKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjwvZm9ybT4iKTsKKworICAgICAgICBvdXQucHJpbnRsbigiPC9ib2R5PiIpOworICAgICAgICBvdXQucHJpbnRsbigiPC9odG1sPiIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRvUG9zdChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIGRvR2V0KHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTU0L2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9TZXNzaW9uRXhhbXBsZS5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTQvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL1Nlc3Npb25FeGFtcGxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVlNzg4MgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTU0L2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9TZXNzaW9uRXhhbXBsZS5qYXZhCkBAIC0wLDAgKzEsMTQwIEBACisvKgorKiBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisvKiAkSWQkCisgKgorICovCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS50ZXh0Lio7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCitpbXBvcnQgdXRpbC5IVE1MRmlsdGVyOworCisvKioKKyAqIEV4YW1wbGUgc2VydmxldCBzaG93aW5nIHJlcXVlc3QgaGVhZGVycworICoKKyAqIEBhdXRob3IgSmFtZXMgRHVuY2FuIERhdmlkc29uIDxkdW5jYW5AZW5nLnN1bi5jb20+CisgKi8KKworcHVibGljIGNsYXNzIFNlc3Npb25FeGFtcGxlIGV4dGVuZHMgSHR0cFNlcnZsZXQgeworCisgICAgUmVzb3VyY2VCdW5kbGUgcmIgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoIkxvY2FsU3RyaW5ncyIpOworICAgIAorICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvaHRtbCIpOworCisgICAgICAgIFByaW50V3JpdGVyIG91dCA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworICAgICAgICBvdXQucHJpbnRsbigiPGh0bWw+Iik7CisgICAgICAgIG91dC5wcmludGxuKCI8Ym9keSBiZ2NvbG9yPVwid2hpdGVcIj4iKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjxoZWFkPiIpOworCisgICAgICAgIFN0cmluZyB0aXRsZSA9IHJiLmdldFN0cmluZygic2Vzc2lvbnMudGl0bGUiKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjx0aXRsZT4iICsgdGl0bGUgKyAiPC90aXRsZT4iKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjwvaGVhZD4iKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjxib2R5PiIpOworCisgICAgICAgIC8vIGltZyBzdHVmZiBub3QgcmVxJ2QgZm9yIHNvdXJjZSBjb2RlIGh0bWwgc2hvd2luZworCS8vIHJlbGF0aXZlIGxpbmtzIGV2ZXJ5d2hlcmUhCisKKyAgICAgICAgLy8gWFhYCisgICAgICAgIC8vIG1ha2luZyB0aGVzZSBhYnNvbHV0ZSB0aWxsIHdlIHdvcmsgb3V0IHRoZQorICAgICAgICAvLyBhZGRpdGlvbiBvZiBhIFBhdGhJbmZvIGlzc3VlIAorCQorICAgICAgICBvdXQucHJpbnRsbigiPGEgaHJlZj1cIi4uL3Nlc3Npb25zLmh0bWxcIj4iKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjxpbWcgc3JjPVwiLi4vaW1hZ2VzL2NvZGUuZ2lmXCIgaGVpZ2h0PTI0ICIgKworICAgICAgICAgICAgICAgICAgICAid2lkdGg9MjQgYWxpZ249cmlnaHQgYm9yZGVyPTAgYWx0PVwidmlldyBjb2RlXCI+PC9hPiIpOworICAgICAgICBvdXQucHJpbnRsbigiPGEgaHJlZj1cIi4uL2luZGV4Lmh0bWxcIj4iKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjxpbWcgc3JjPVwiLi4vaW1hZ2VzL3JldHVybi5naWZcIiBoZWlnaHQ9MjQgIiArCisgICAgICAgICAgICAgICAgICAgICJ3aWR0aD0yNCBhbGlnbj1yaWdodCBib3JkZXI9MCBhbHQ9XCJyZXR1cm5cIj48L2E+Iik7CisKKyAgICAgICAgb3V0LnByaW50bG4oIjxoMz4iICsgdGl0bGUgKyAiPC9oMz4iKTsKKworICAgICAgICBIdHRwU2Vzc2lvbiBzZXNzaW9uID0gcmVxdWVzdC5nZXRTZXNzaW9uKHRydWUpOworICAgICAgICBvdXQucHJpbnRsbihyYi5nZXRTdHJpbmcoInNlc3Npb25zLmlkIikgKyAiICIgKyBzZXNzaW9uLmdldElkKCkpOworICAgICAgICBvdXQucHJpbnRsbigiPGJyPiIpOworICAgICAgICBvdXQucHJpbnRsbihyYi5nZXRTdHJpbmcoInNlc3Npb25zLmNyZWF0ZWQiKSArICIgIik7CisgICAgICAgIG91dC5wcmludGxuKG5ldyBEYXRlKHNlc3Npb24uZ2V0Q3JlYXRpb25UaW1lKCkpICsgIjxicj4iKTsKKyAgICAgICAgb3V0LnByaW50bG4ocmIuZ2V0U3RyaW5nKCJzZXNzaW9ucy5sYXN0YWNjZXNzZWQiKSArICIgIik7CisgICAgICAgIG91dC5wcmludGxuKG5ldyBEYXRlKHNlc3Npb24uZ2V0TGFzdEFjY2Vzc2VkVGltZSgpKSk7CisKKyAgICAgICAgU3RyaW5nIGRhdGFOYW1lID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoImRhdGFuYW1lIik7CisgICAgICAgIFN0cmluZyBkYXRhVmFsdWUgPSByZXF1ZXN0LmdldFBhcmFtZXRlcigiZGF0YXZhbHVlIik7CisgICAgICAgIGlmIChkYXRhTmFtZSAhPSBudWxsICYmIGRhdGFWYWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBzZXNzaW9uLnNldEF0dHJpYnV0ZShkYXRhTmFtZSwgZGF0YVZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIG91dC5wcmludGxuKCI8UD4iKTsKKyAgICAgICAgb3V0LnByaW50bG4ocmIuZ2V0U3RyaW5nKCJzZXNzaW9ucy5kYXRhIikgKyAiPGJyPiIpOworICAgICAgICBFbnVtZXJhdGlvbiBuYW1lcyA9IHNlc3Npb24uZ2V0QXR0cmlidXRlTmFtZXMoKTsKKyAgICAgICAgd2hpbGUgKG5hbWVzLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIG5hbWVzLm5leHRFbGVtZW50KCk7IAorICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gc2Vzc2lvbi5nZXRBdHRyaWJ1dGUobmFtZSkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIG91dC5wcmludGxuKEhUTUxGaWx0ZXIuZmlsdGVyKG5hbWUpICsgIiA9ICIgCisgICAgICAgICAgICAgICAgICAgICAgICArIEhUTUxGaWx0ZXIuZmlsdGVyKHZhbHVlKSArICI8YnI+Iik7CisgICAgICAgIH0KKworICAgICAgICBvdXQucHJpbnRsbigiPFA+Iik7CisgICAgICAgIG91dC5wcmludCgiPGZvcm0gYWN0aW9uPVwiIik7CisJb3V0LnByaW50KHJlc3BvbnNlLmVuY29kZVVSTCgiU2Vzc2lvbkV4YW1wbGUiKSk7CisgICAgICAgIG91dC5wcmludCgiXCIgIik7CisgICAgICAgIG91dC5wcmludGxuKCJtZXRob2Q9UE9TVD4iKTsKKyAgICAgICAgb3V0LnByaW50bG4ocmIuZ2V0U3RyaW5nKCJzZXNzaW9ucy5kYXRhbmFtZSIpKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjxpbnB1dCB0eXBlPXRleHQgc2l6ZT0yMCBuYW1lPWRhdGFuYW1lPiIpOworICAgICAgICBvdXQucHJpbnRsbigiPGJyPiIpOworICAgICAgICBvdXQucHJpbnRsbihyYi5nZXRTdHJpbmcoInNlc3Npb25zLmRhdGF2YWx1ZSIpKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjxpbnB1dCB0eXBlPXRleHQgc2l6ZT0yMCBuYW1lPWRhdGF2YWx1ZT4iKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjxicj4iKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjxpbnB1dCB0eXBlPXN1Ym1pdD4iKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjwvZm9ybT4iKTsKKworICAgICAgICBvdXQucHJpbnRsbigiPFA+R0VUIGJhc2VkIGZvcm06PGJyPiIpOworICAgICAgICBvdXQucHJpbnQoIjxmb3JtIGFjdGlvbj1cIiIpOworCW91dC5wcmludChyZXNwb25zZS5lbmNvZGVVUkwoIlNlc3Npb25FeGFtcGxlIikpOworICAgICAgICBvdXQucHJpbnQoIlwiICIpOworICAgICAgICBvdXQucHJpbnRsbigibWV0aG9kPUdFVD4iKTsKKyAgICAgICAgb3V0LnByaW50bG4ocmIuZ2V0U3RyaW5nKCJzZXNzaW9ucy5kYXRhbmFtZSIpKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjxpbnB1dCB0eXBlPXRleHQgc2l6ZT0yMCBuYW1lPWRhdGFuYW1lPiIpOworICAgICAgICBvdXQucHJpbnRsbigiPGJyPiIpOworICAgICAgICBvdXQucHJpbnRsbihyYi5nZXRTdHJpbmcoInNlc3Npb25zLmRhdGF2YWx1ZSIpKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjxpbnB1dCB0eXBlPXRleHQgc2l6ZT0yMCBuYW1lPWRhdGF2YWx1ZT4iKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjxicj4iKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjxpbnB1dCB0eXBlPXN1Ym1pdD4iKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjwvZm9ybT4iKTsKKworICAgICAgICBvdXQucHJpbnQoIjxwPjxhIGhyZWY9XCIiKTsKKwlvdXQucHJpbnQocmVzcG9uc2UuZW5jb2RlVVJMKCJTZXNzaW9uRXhhbXBsZT9kYXRhbmFtZT1mb28mZGF0YXZhbHVlPWJhciIpKTsKKwlvdXQucHJpbnRsbigiXCIgPlVSTCBlbmNvZGVkIDwvYT4iKTsKKwkKKyAgICAgICAgb3V0LnByaW50bG4oIjwvYm9keT4iKTsKKyAgICAgICAgb3V0LnByaW50bG4oIjwvaHRtbD4iKTsKKyAgICAgICAgCisgICAgICAgIG91dC5wcmludGxuKCI8L2JvZHk+Iik7CisgICAgICAgIG91dC5wcmludGxuKCI8L2h0bWw+Iik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZG9Qb3N0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgZG9HZXQocmVxdWVzdCwgcmVzcG9uc2UpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTQvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2NvbXByZXNzaW9uRmlsdGVycy9Db21wcmVzc2lvbkZpbHRlci5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTQvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2NvbXByZXNzaW9uRmlsdGVycy9Db21wcmVzc2lvbkZpbHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ZjE4ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1NC9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvY29tcHJlc3Npb25GaWx0ZXJzL0NvbXByZXNzaW9uRmlsdGVyLmphdmEKQEAgLTAsMCArMSwyMTggQEAKKy8qCisqIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworcGFja2FnZSBjb21wcmVzc2lvbkZpbHRlcnM7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LkZpbHRlcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LkZpbHRlckNoYWluOworaW1wb3J0IGphdmF4LnNlcnZsZXQuRmlsdGVyQ29uZmlnOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldFJlc3BvbnNlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CisKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiA8Y29kZT5qYXZheC5zZXJ2bGV0LkZpbHRlcjwvY29kZT4gdXNlZCB0byBjb21wcmVzcworICogdGhlIFNlcnZsZXRSZXNwb25zZSBpZiBpdCBpcyBiaWdnZXIgdGhhbiBhIHRocmVzaG9sZC4KKyAqCisgKiBAYXV0aG9yIEFteSBSb2gKKyAqIEBhdXRob3IgRG1pdHJpIFZhbGRpbgorICogQHZlcnNpb24gJFJldmlzaW9uJCwgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIENvbXByZXNzaW9uRmlsdGVyIGltcGxlbWVudHMgRmlsdGVyeworCisgICAgLyoqCisgICAgICogVGhlIGZpbHRlciBjb25maWd1cmF0aW9uIG9iamVjdCB3ZSBhcmUgYXNzb2NpYXRlZCB3aXRoLiAgSWYgdGhpcyB2YWx1ZQorICAgICAqIGlzIG51bGwsIHRoaXMgZmlsdGVyIGluc3RhbmNlIGlzIG5vdCBjdXJyZW50bHkgY29uZmlndXJlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIEZpbHRlckNvbmZpZyBjb25maWcgPSBudWxsOworCisgICAgLyoqCisgICAgICogTWluaW1hbCByZWFzb25hYmxlIHRocmVzaG9sZAorICAgICAqLworICAgIHByaXZhdGUgaW50IG1pblRocmVzaG9sZCA9IDEyODsKKworCisgICAgLyoqCisgICAgICogVGhlIHRocmVzaG9sZCBudW1iZXIgdG8gY29tcHJlc3MKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IGNvbXByZXNzaW9uVGhyZXNob2xkOworCisgICAgLyoqCisgICAgICogRGVidWcgbGV2ZWwgZm9yIHRoaXMgZmlsdGVyCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgZGVidWcgPSAwOworCisgICAgLyoqCisgICAgICogUGxhY2UgdGhpcyBmaWx0ZXIgaW50byBzZXJ2aWNlLgorICAgICAqCisgICAgICogQHBhcmFtIGZpbHRlckNvbmZpZyBUaGUgZmlsdGVyIGNvbmZpZ3VyYXRpb24gb2JqZWN0CisgICAgICovCisKKyAgICBwdWJsaWMgdm9pZCBpbml0KEZpbHRlckNvbmZpZyBmaWx0ZXJDb25maWcpIHsKKworICAgICAgICBjb25maWcgPSBmaWx0ZXJDb25maWc7CisgICAgICAgIGlmIChmaWx0ZXJDb25maWcgIT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gZmlsdGVyQ29uZmlnLmdldEluaXRQYXJhbWV0ZXIoImRlYnVnIik7CisgICAgICAgICAgICBpZiAodmFsdWUhPW51bGwpIHsKKyAgICAgICAgICAgICAgICBkZWJ1ZyA9IEludGVnZXIucGFyc2VJbnQodmFsdWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkZWJ1ZyA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJpbmcgc3RyID0gZmlsdGVyQ29uZmlnLmdldEluaXRQYXJhbWV0ZXIoImNvbXByZXNzaW9uVGhyZXNob2xkIik7CisgICAgICAgICAgICBpZiAoc3RyIT1udWxsKSB7CisgICAgICAgICAgICAgICAgY29tcHJlc3Npb25UaHJlc2hvbGQgPSBJbnRlZ2VyLnBhcnNlSW50KHN0cik7CisgICAgICAgICAgICAgICAgaWYgKGNvbXByZXNzaW9uVGhyZXNob2xkICE9IDAgJiYgY29tcHJlc3Npb25UaHJlc2hvbGQgPCBtaW5UaHJlc2hvbGQpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRlYnVnID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJjb21wcmVzc2lvblRocmVzaG9sZCBzaG91bGQgYmUgZWl0aGVyIDAgLSBubyBjb21wcmVzc2lvbiBvciA+PSAiICsgbWluVGhyZXNob2xkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY29tcHJlc3Npb25UaHJlc2hvbGQgc2V0IHRvICIgKyBtaW5UaHJlc2hvbGQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uVGhyZXNob2xkID0gbWluVGhyZXNob2xkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY29tcHJlc3Npb25UaHJlc2hvbGQgPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb21wcmVzc2lvblRocmVzaG9sZCA9IDA7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qKgorICAgICogVGFrZSB0aGlzIGZpbHRlciBvdXQgb2Ygc2VydmljZS4KKyAgICAqLworICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3koKSB7CisKKyAgICAgICAgdGhpcy5jb25maWcgPSBudWxsOworCisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIDxjb2RlPmRvRmlsdGVyPC9jb2RlPiBtZXRob2Qgb2YgdGhlIEZpbHRlciBpcyBjYWxsZWQgYnkgdGhlIGNvbnRhaW5lcgorICAgICAqIGVhY2ggdGltZSBhIHJlcXVlc3QvcmVzcG9uc2UgcGFpciBpcyBwYXNzZWQgdGhyb3VnaCB0aGUgY2hhaW4gZHVlCisgICAgICogdG8gYSBjbGllbnQgcmVxdWVzdCBmb3IgYSByZXNvdXJjZSBhdCB0aGUgZW5kIG9mIHRoZSBjaGFpbi4KKyAgICAgKiBUaGUgRmlsdGVyQ2hhaW4gcGFzc2VkIGludG8gdGhpcyBtZXRob2QgYWxsb3dzIHRoZSBGaWx0ZXIgdG8gcGFzcyBvbiB0aGUKKyAgICAgKiByZXF1ZXN0IGFuZCByZXNwb25zZSB0byB0aGUgbmV4dCBlbnRpdHkgaW4gdGhlIGNoYWluLjxwPgorICAgICAqIFRoaXMgbWV0aG9kIGZpcnN0IGV4YW1pbmVzIHRoZSByZXF1ZXN0IHRvIGNoZWNrIHdoZXRoZXIgdGhlIGNsaWVudCBzdXBwb3J0CisgICAgICogY29tcHJlc3Npb24uIDxicj4KKyAgICAgKiBJdCBzaW1wbHkganVzdCBwYXNzIHRoZSByZXF1ZXN0IGFuZCByZXNwb25zZSBpZiB0aGVyZSBpcyBubyBzdXBwb3J0IGZvcgorICAgICAqIGNvbXByZXNzaW9uLjxicj4KKyAgICAgKiBJZiB0aGUgY29tcHJlc3Npb24gc3VwcG9ydCBpcyBhdmFpbGFibGUsIGl0IGNyZWF0ZXMgYQorICAgICAqIENvbXByZXNzaW9uU2VydmxldFJlc3BvbnNlV3JhcHBlciBvYmplY3Qgd2hpY2ggY29tcHJlc3NlcyB0aGUgY29udGVudCBhbmQKKyAgICAgKiBtb2RpZmllcyB0aGUgaGVhZGVyIGlmIHRoZSBjb250ZW50IGxlbmd0aCBpcyBiaWcgZW5vdWdoLgorICAgICAqIEl0IHRoZW4gaW52b2tlcyB0aGUgbmV4dCBlbnRpdHkgaW4gdGhlIGNoYWluIHVzaW5nIHRoZSBGaWx0ZXJDaGFpbiBvYmplY3QKKyAgICAgKiAoPGNvZGU+Y2hhaW4uZG9GaWx0ZXIoKTwvY29kZT4pLCA8YnI+CisgICAgICoqLworCisgICAgcHVibGljIHZvaWQgZG9GaWx0ZXIgKCBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBGaWx0ZXJDaGFpbiBjaGFpbiApIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKGRlYnVnID4gMCkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJAZG9GaWx0ZXIiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb21wcmVzc2lvblRocmVzaG9sZCA9PSAwKSB7CisgICAgICAgICAgICBpZiAoZGVidWcgPiAwKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJkb0ZpbHRlciBnZXRzIGNhbGxlZCwgYnV0IGNvbXByZXNzaW9uVHJlc2hvbGQgaXMgc2V0IHRvIDAgLSBubyBjb21wcmVzc2lvbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2hhaW4uZG9GaWx0ZXIocmVxdWVzdCwgcmVzcG9uc2UpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiBzdXBwb3J0Q29tcHJlc3Npb24gPSBmYWxzZTsKKyAgICAgICAgaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBIdHRwU2VydmxldFJlcXVlc3QpIHsKKyAgICAgICAgICAgIGlmIChkZWJ1ZyA+IDEpIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInJlcXVlc3RVUkkgPSAiICsgKChIdHRwU2VydmxldFJlcXVlc3QpcmVxdWVzdCkuZ2V0UmVxdWVzdFVSSSgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQXJlIHdlIGFsbG93ZWQgdG8gY29tcHJlc3MgPworICAgICAgICAgICAgU3RyaW5nIHMgPSAoU3RyaW5nKSAoKEh0dHBTZXJ2bGV0UmVxdWVzdClyZXF1ZXN0KS5nZXRQYXJhbWV0ZXIoImd6aXAiKTsKKyAgICAgICAgICAgIGlmICgiZmFsc2UiLmVxdWFscyhzKSkgeworICAgICAgICAgICAgICAgIGlmIChkZWJ1ZyA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJnb3QgcGFyYW1ldGVyIGd6aXA9ZmFsc2UgLS0+IGRvbid0IGNvbXByZXNzLCBqdXN0IGNoYWluIGZpbHRlciIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjaGFpbi5kb0ZpbHRlcihyZXF1ZXN0LCByZXNwb25zZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBFbnVtZXJhdGlvbiBlID0KKyAgICAgICAgICAgICAgICAoKEh0dHBTZXJ2bGV0UmVxdWVzdClyZXF1ZXN0KS5nZXRIZWFkZXJzKCJBY2NlcHQtRW5jb2RpbmciKTsKKyAgICAgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKWUubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICBpZiAobmFtZS5pbmRleE9mKCJnemlwIikgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRlYnVnID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJzdXBwb3J0cyBjb21wcmVzc2lvbiIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRDb21wcmVzc2lvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRlYnVnID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJubyBzdXBwb3J0IGZvciBjb21wcmVzaW9uIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXN1cHBvcnRDb21wcmVzc2lvbikgeworICAgICAgICAgICAgaWYgKGRlYnVnID4gMCkgeworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZG9GaWx0ZXIgZ2V0cyBjYWxsZWQgd28gY29tcHJlc3Npb24iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNoYWluLmRvRmlsdGVyKHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChyZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBTZXJ2bGV0UmVzcG9uc2UpIHsKKyAgICAgICAgICAgICAgICBDb21wcmVzc2lvblNlcnZsZXRSZXNwb25zZVdyYXBwZXIgd3JhcHBlZFJlc3BvbnNlID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IENvbXByZXNzaW9uU2VydmxldFJlc3BvbnNlV3JhcHBlcigoSHR0cFNlcnZsZXRSZXNwb25zZSlyZXNwb25zZSk7CisgICAgICAgICAgICAgICAgd3JhcHBlZFJlc3BvbnNlLnNldERlYnVnTGV2ZWwoZGVidWcpOworICAgICAgICAgICAgICAgIHdyYXBwZWRSZXNwb25zZS5zZXRDb21wcmVzc2lvblRocmVzaG9sZChjb21wcmVzc2lvblRocmVzaG9sZCk7CisgICAgICAgICAgICAgICAgaWYgKGRlYnVnID4gMCkgeworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImRvRmlsdGVyIGdldHMgY2FsbGVkIHdpdGggY29tcHJlc3Npb24iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgY2hhaW4uZG9GaWx0ZXIocmVxdWVzdCwgd3JhcHBlZFJlc3BvbnNlKTsKKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICB3cmFwcGVkUmVzcG9uc2UuZmluaXNoUmVzcG9uc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IGZpbHRlciBjb25maWcKKyAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gaW5pdC4gUmVxdWlyZWQgYnkgV2VibG9naWMgNi4xCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsdGVyQ29uZmlnIFRoZSBmaWx0ZXIgY29uZmlndXJhdGlvbiBvYmplY3QKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGaWx0ZXJDb25maWcoRmlsdGVyQ29uZmlnIGZpbHRlckNvbmZpZykgeworICAgICAgICBpbml0KGZpbHRlckNvbmZpZyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGZpbHRlciBjb25maWcKKyAgICAgKiBSZXF1aXJlZCBieSBXZWJsb2dpYyA2LjEKKyAgICAgKi8KKyAgICBwdWJsaWMgRmlsdGVyQ29uZmlnIGdldEZpbHRlckNvbmZpZygpIHsKKyAgICAgICAgcmV0dXJuIGNvbmZpZzsKKyAgICB9CisKK30KKwpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTQvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2NvbXByZXNzaW9uRmlsdGVycy9Db21wcmVzc2lvbkZpbHRlclRlc3RTZXJ2bGV0LmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1NC9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvY29tcHJlc3Npb25GaWx0ZXJzL0NvbXByZXNzaW9uRmlsdGVyVGVzdFNlcnZsZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2UyYjY3Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTQvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2NvbXByZXNzaW9uRmlsdGVycy9Db21wcmVzc2lvbkZpbHRlclRlc3RTZXJ2bGV0LmphdmEKQEAgLTAsMCArMSw1NyBAQAorLyoKKyogQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitwYWNrYWdlIGNvbXByZXNzaW9uRmlsdGVyczsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YXguc2VydmxldC4qOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCisvKioKKyAqIFZlcnkgU2ltcGxlIHRlc3Qgc2VydmxldCB0byB0ZXN0IGNvbXByZXNzaW9uIGZpbHRlcgorICogQGF1dGhvciBBbXkgUm9oCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kLCAkRGF0ZSQKKyAqLworCitwdWJsaWMgY2xhc3MgQ29tcHJlc3Npb25GaWx0ZXJUZXN0U2VydmxldCBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworICAgIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgICAgICB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCisgICAgICAgIFNlcnZsZXRPdXRwdXRTdHJlYW0gb3V0ID0gcmVzcG9uc2UuZ2V0T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7CisKKyAgICAgICAgRW51bWVyYXRpb24gZSA9ICgoSHR0cFNlcnZsZXRSZXF1ZXN0KXJlcXVlc3QpLmdldEhlYWRlcnMoIkFjY2VwdC1FbmNvZGluZyIpOworICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKWUubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgIG91dC5wcmludGxuKG5hbWUpOworICAgICAgICAgICAgaWYgKG5hbWUuaW5kZXhPZigiZ3ppcCIpICE9IC0xKSB7CisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oImd6aXAgc3VwcG9ydGVkIC0tIGFibGUgdG8gY29tcHJlc3MiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCJnemlwIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgICAgb3V0LnByaW50bG4oIkNvbXByZXNzaW9uIEZpbHRlciBUZXN0IFNlcnZsZXQiKTsKKyAgICAgICAgb3V0LmNsb3NlKCk7CisgICAgfQorCit9CisKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTU0L2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9jb21wcmVzc2lvbkZpbHRlcnMvQ29tcHJlc3Npb25SZXNwb25zZVN0cmVhbS5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTQvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2NvbXByZXNzaW9uRmlsdGVycy9Db21wcmVzc2lvblJlc3BvbnNlU3RyZWFtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNlZjMyMgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTU0L2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9jb21wcmVzc2lvbkZpbHRlcnMvQ29tcHJlc3Npb25SZXNwb25zZVN0cmVhbS5qYXZhCkBAIC0wLDAgKzEsMzE3IEBACisvKgorKiBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCitwYWNrYWdlIGNvbXByZXNzaW9uRmlsdGVyczsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLnppcC5HWklQT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldE91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKKworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIDxiPlNlcnZsZXRPdXRwdXRTdHJlYW08L2I+IHRoYXQgd29ya3Mgd2l0aAorICogdGhlIENvbXByZXNzaW9uU2VydmxldFJlc3BvbnNlV3JhcHBlciBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBAYXV0aG9yIEFteSBSb2gKKyAqIEBhdXRob3IgRG1pdHJpIFZhbGRpbgorICogQHZlcnNpb24gJFJldmlzaW9uJCwgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIENvbXByZXNzaW9uUmVzcG9uc2VTdHJlYW0KKyAgICBleHRlbmRzIFNlcnZsZXRPdXRwdXRTdHJlYW0geworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgc2VydmxldCBvdXRwdXQgc3RyZWFtIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIFJlc3BvbnNlLgorICAgICAqCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSBhc3NvY2lhdGVkIHJlc3BvbnNlCisgICAgICovCisgICAgcHVibGljIENvbXByZXNzaW9uUmVzcG9uc2VTdHJlYW0oSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIElPRXhjZXB0aW9ueworCisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIGNsb3NlZCA9IGZhbHNlOworICAgICAgICB0aGlzLnJlc3BvbnNlID0gcmVzcG9uc2U7CisgICAgICAgIHRoaXMub3V0cHV0ID0gcmVzcG9uc2UuZ2V0T3V0cHV0U3RyZWFtKCk7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgdGhyZXNob2xkIG51bWJlciB3aGljaCBkZWNpZGVzIHRvIGNvbXByZXNzIG9yIG5vdC4KKyAgICAgKiBVc2VycyBjYW4gY29uZmlndXJlIGluIHdlYi54bWwgdG8gc2V0IGl0IHRvIGZpdCB0aGVpciBuZWVkcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IGNvbXByZXNzaW9uVGhyZXNob2xkID0gMDsKKworICAgIC8qKgorICAgICAqIERlYnVnIGxldmVsCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgZGVidWcgPSAwOworCisgICAgLyoqCisgICAgICogVGhlIGJ1ZmZlciB0aHJvdWdoIHdoaWNoIGFsbCBvZiBvdXIgb3V0cHV0IGJ5dGVzIGFyZSBwYXNzZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJ5dGVbXSBidWZmZXIgPSBudWxsOworCisgICAgLyoqCisgICAgICogVGhlIG51bWJlciBvZiBkYXRhIGJ5dGVzIGN1cnJlbnRseSBpbiB0aGUgYnVmZmVyLgorICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgYnVmZmVyQ291bnQgPSAwOworCisgICAgLyoqCisgICAgICogVGhlIHVuZGVybHlpbmcgZ3ppcCBvdXRwdXQgc3RyZWFtIHRvIHdoaWNoIHdlIHNob3VsZCB3cml0ZSBkYXRhLgorICAgICAqLworICAgIHByb3RlY3RlZCBHWklQT3V0cHV0U3RyZWFtIGd6aXBzdHJlYW0gPSBudWxsOworCisgICAgLyoqCisgICAgICogSGFzIHRoaXMgc3RyZWFtIGJlZW4gY2xvc2VkPworICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGNsb3NlZCA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogVGhlIGNvbnRlbnQgbGVuZ3RoIHBhc3Qgd2hpY2ggd2Ugd2lsbCBub3Qgd3JpdGUsIG9yIC0xIGlmIHRoZXJlIGlzCisgICAgICogbm8gZGVmaW5lZCBjb250ZW50IGxlbmd0aC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IGxlbmd0aCA9IC0xOworCisgICAgLyoqCisgICAgICogVGhlIHJlc3BvbnNlIHdpdGggd2hpY2ggdGhpcyBzZXJ2bGV0IG91dHB1dCBzdHJlYW0gaXMgYXNzb2NpYXRlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdW5kZXJseWluZyBzZXJ2a2V0IG91dHB1dCBzdHJlYW0gdG8gd2hpY2ggd2Ugc2hvdWxkIHdyaXRlIGRhdGEuCisgICAgICovCisgICAgcHJvdGVjdGVkIFNlcnZsZXRPdXRwdXRTdHJlYW0gb3V0cHV0ID0gbnVsbDsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKyAgICAvKioKKyAgICAgKiBTZXQgZGVidWcgbGV2ZWwKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREZWJ1Z0xldmVsKGludCBkZWJ1ZykgeworICAgICAgICB0aGlzLmRlYnVnID0gZGVidWc7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNvbXByZXNzaW9uVGhyZXNob2xkIG51bWJlciBhbmQgY3JlYXRlIGJ1ZmZlciBmb3IgdGhpcyBzaXplCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0QnVmZmVyKGludCB0aHJlc2hvbGQpIHsKKyAgICAgICAgY29tcHJlc3Npb25UaHJlc2hvbGQgPSB0aHJlc2hvbGQ7CisgICAgICAgIGJ1ZmZlciA9IG5ldyBieXRlW2NvbXByZXNzaW9uVGhyZXNob2xkXTsKKyAgICAgICAgaWYgKGRlYnVnID4gMSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJidWZmZXIgaXMgc2V0IHRvICIrY29tcHJlc3Npb25UaHJlc2hvbGQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvc2UgdGhpcyBvdXRwdXQgc3RyZWFtLCBjYXVzaW5nIGFueSBidWZmZXJlZCBkYXRhIHRvIGJlIGZsdXNoZWQgYW5kCisgICAgICogYW55IGZ1cnRoZXIgb3V0cHV0IGRhdGEgdG8gdGhyb3cgYW4gSU9FeGNlcHRpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIGlmIChkZWJ1ZyA+IDEpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY2xvc2UoKSBAIENvbXByZXNzaW9uUmVzcG9uc2VTdHJlYW0iKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2xvc2VkKQorICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJUaGlzIG91dHB1dCBzdHJlYW0gaGFzIGFscmVhZHkgYmVlbiBjbG9zZWQiKTsKKworICAgICAgICBpZiAoZ3ppcHN0cmVhbSAhPSBudWxsKSB7CisgICAgICAgICAgICBmbHVzaFRvR1ppcCgpOworICAgICAgICAgICAgZ3ppcHN0cmVhbS5jbG9zZSgpOworICAgICAgICAgICAgZ3ppcHN0cmVhbSA9IG51bGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoYnVmZmVyQ291bnQgPiAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGRlYnVnID4gMikgeworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJvdXRwdXQud3JpdGUoIik7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQud3JpdGUoYnVmZmVyLCAwLCBidWZmZXJDb3VudCk7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvdXRwdXQud3JpdGUoYnVmZmVyLCAwLCBidWZmZXJDb3VudCk7CisgICAgICAgICAgICAgICAgYnVmZmVyQ291bnQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgb3V0cHV0LmNsb3NlKCk7CisgICAgICAgIGNsb3NlZCA9IHRydWU7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEZsdXNoIGFueSBidWZmZXJlZCBkYXRhIGZvciB0aGlzIG91dHB1dCBzdHJlYW0sIHdoaWNoIGFsc28gY2F1c2VzIHRoZQorICAgICAqIHJlc3BvbnNlIHRvIGJlIGNvbW1pdHRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKGRlYnVnID4gMSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJmbHVzaCgpIEAgQ29tcHJlc3Npb25SZXNwb25zZVN0cmVhbSIpOworICAgICAgICB9CisgICAgICAgIGlmIChjbG9zZWQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiQ2Fubm90IGZsdXNoIGEgY2xvc2VkIG91dHB1dCBzdHJlYW0iKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChnemlwc3RyZWFtICE9IG51bGwpIHsKKyAgICAgICAgICAgIGd6aXBzdHJlYW0uZmx1c2goKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHVibGljIHZvaWQgZmx1c2hUb0daaXAoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIGlmIChkZWJ1ZyA+IDEpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZmx1c2hUb0daaXAoKSBAIENvbXByZXNzaW9uUmVzcG9uc2VTdHJlYW0iKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYnVmZmVyQ291bnQgPiAwKSB7CisgICAgICAgICAgICBpZiAoZGVidWcgPiAxKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJmbHVzaGluZyBvdXQgdG8gR1ppcFN0cmVhbSwgYnVmZmVyQ291bnQgPSAiICsgYnVmZmVyQ291bnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd3JpdGVUb0daaXAoYnVmZmVyLCAwLCBidWZmZXJDb3VudCk7CisgICAgICAgICAgICBidWZmZXJDb3VudCA9IDA7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlIHRoZSBzcGVjaWZpZWQgYnl0ZSB0byBvdXIgb3V0cHV0IHN0cmVhbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiIFRoZSBieXRlIHRvIGJlIHdyaXR0ZW4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHdyaXRlKGludCBiKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIGlmIChkZWJ1ZyA+IDEpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigid3JpdGUgIitiKyIgaW4gQ29tcHJlc3Npb25SZXNwb25zZVN0cmVhbSAiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2xvc2VkKQorICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJDYW5ub3Qgd3JpdGUgdG8gYSBjbG9zZWQgb3V0cHV0IHN0cmVhbSIpOworCisgICAgICAgIGlmIChidWZmZXJDb3VudCA+PSBidWZmZXIubGVuZ3RoKSB7CisgICAgICAgICAgICBmbHVzaFRvR1ppcCgpOworICAgICAgICB9CisKKyAgICAgICAgYnVmZmVyW2J1ZmZlckNvdW50KytdID0gKGJ5dGUpIGI7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFdyaXRlIDxjb2RlPmIubGVuZ3RoPC9jb2RlPiBieXRlcyBmcm9tIHRoZSBzcGVjaWZpZWQgYnl0ZSBhcnJheQorICAgICAqIHRvIG91ciBvdXRwdXQgc3RyZWFtLgorICAgICAqCisgICAgICogQHBhcmFtIGIgVGhlIGJ5dGUgYXJyYXkgdG8gYmUgd3JpdHRlbgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZSBiW10pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgd3JpdGUoYiwgMCwgYi5sZW5ndGgpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBXcml0ZSA8Y29kZT5sZW48L2NvZGU+IGJ5dGVzIGZyb20gdGhlIHNwZWNpZmllZCBieXRlIGFycmF5LCBzdGFydGluZworICAgICAqIGF0IHRoZSBzcGVjaWZpZWQgb2Zmc2V0LCB0byBvdXIgb3V0cHV0IHN0cmVhbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiIFRoZSBieXRlIGFycmF5IGNvbnRhaW5pbmcgdGhlIGJ5dGVzIHRvIGJlIHdyaXR0ZW4KKyAgICAgKiBAcGFyYW0gb2ZmIFplcm8tcmVsYXRpdmUgc3RhcnRpbmcgb2Zmc2V0IG9mIHRoZSBieXRlcyB0byBiZSB3cml0dGVuCisgICAgICogQHBhcmFtIGxlbiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHdyaXR0ZW4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHdyaXRlKGJ5dGUgYltdLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIGlmIChkZWJ1ZyA+IDEpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigid3JpdGUsIGJ1ZmZlckNvdW50ID0gIiArIGJ1ZmZlckNvdW50ICsgIiBsZW4gPSAiICsgbGVuICsgIiBvZmYgPSAiICsgb2ZmKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGVidWcgPiAyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ3cml0ZSgiKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQud3JpdGUoYiwgb2ZmLCBsZW4pOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIpIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY2xvc2VkKQorICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJDYW5ub3Qgd3JpdGUgdG8gYSBjbG9zZWQgb3V0cHV0IHN0cmVhbSIpOworCisgICAgICAgIGlmIChsZW4gPT0gMCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvLyBDYW4gd2Ugd3JpdGUgaW50byBidWZmZXIgPworICAgICAgICBpZiAobGVuIDw9IChidWZmZXIubGVuZ3RoIC0gYnVmZmVyQ291bnQpKSB7CisgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGIsIG9mZiwgYnVmZmVyLCBidWZmZXJDb3VudCwgbGVuKTsKKyAgICAgICAgICAgIGJ1ZmZlckNvdW50ICs9IGxlbjsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRoZXJlIGlzIG5vdCBlbm91Z2ggc3BhY2UgaW4gYnVmZmVyLiBGbHVzaCBpdCAuLi4KKyAgICAgICAgZmx1c2hUb0daaXAoKTsKKworICAgICAgICAvLyAuLi4gYW5kIHRyeSBhZ2Fpbi4gTm90ZSwgdGhhdCBidWZmZXJDb3VudCA9IDAgaGVyZSAhCisgICAgICAgIGlmIChsZW4gPD0gKGJ1ZmZlci5sZW5ndGggLSBidWZmZXJDb3VudCkpIHsKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYiwgb2ZmLCBidWZmZXIsIGJ1ZmZlckNvdW50LCBsZW4pOworICAgICAgICAgICAgYnVmZmVyQ291bnQgKz0gbGVuOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gd3JpdGUgZGlyZWN0IHRvIGd6aXAKKyAgICAgICAgd3JpdGVUb0daaXAoYiwgb2ZmLCBsZW4pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlVG9HWmlwKGJ5dGUgYltdLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIGlmIChkZWJ1ZyA+IDEpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigid3JpdGVUb0daaXAsIGxlbiA9ICIgKyBsZW4pOworICAgICAgICB9CisgICAgICAgIGlmIChkZWJ1ZyA+IDIpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIndyaXRlVG9HWmlwKCIpOworICAgICAgICAgICAgU3lzdGVtLm91dC53cml0ZShiLCBvZmYsIGxlbik7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIikiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ3ppcHN0cmVhbSA9PSBudWxsKSB7CisgICAgICAgICAgICBpZiAoZGVidWcgPiAxKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJuZXcgR1pJUE91dHB1dFN0cmVhbSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzcG9uc2UuYWRkSGVhZGVyKCJDb250ZW50LUVuY29kaW5nIiwgImd6aXAiKTsKKyAgICAgICAgICAgIGd6aXBzdHJlYW0gPSBuZXcgR1pJUE91dHB1dFN0cmVhbShvdXRwdXQpOworICAgICAgICB9CisgICAgICAgIGd6aXBzdHJlYW0ud3JpdGUoYiwgb2ZmLCBsZW4pOworCisgICAgfQorCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQYWNrYWdlIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogSGFzIHRoaXMgcmVzcG9uc2Ugc3RyZWFtIGJlZW4gY2xvc2VkPworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGNsb3NlZCgpIHsKKworICAgICAgICByZXR1cm4gKHRoaXMuY2xvc2VkKTsKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTQvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2NvbXByZXNzaW9uRmlsdGVycy9Db21wcmVzc2lvblNlcnZsZXRSZXNwb25zZVdyYXBwZXIuamF2YSBiL3NlcnZsZXRhcGkvanNyMTU0L2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9jb21wcmVzc2lvbkZpbHRlcnMvQ29tcHJlc3Npb25TZXJ2bGV0UmVzcG9uc2VXcmFwcGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM1M2ZkNgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTU0L2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9jb21wcmVzc2lvbkZpbHRlcnMvQ29tcHJlc3Npb25TZXJ2bGV0UmVzcG9uc2VXcmFwcGVyLmphdmEKQEAgLTAsMCArMSwyNzYgQEAKKy8qCisqIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KK3BhY2thZ2UgY29tcHJlc3Npb25GaWx0ZXJzOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldFJlc3BvbnNlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldFJlc3BvbnNlV3JhcHBlcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZVdyYXBwZXI7CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgPGI+SHR0cFNlcnZsZXRSZXNwb25zZVdyYXBwZXI8L2I+IHRoYXQgd29ya3Mgd2l0aAorICogdGhlIENvbXByZXNzaW9uU2VydmxldFJlc3BvbnNlU3RyZWFtIGltcGxlbWVudGF0aW9uLi4KKyAqCisgKiBAYXV0aG9yIEFteSBSb2gKKyAqIEBhdXRob3IgRG1pdHJpIFZhbGRpbgorICogQHZlcnNpb24gJFJldmlzaW9uJCwgJERhdGUkCisgKi8KKworcHVibGljIGNsYXNzIENvbXByZXNzaW9uU2VydmxldFJlc3BvbnNlV3JhcHBlciBleHRlbmRzIEh0dHBTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyIHsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9yCisKKyAgICAvKioKKyAgICAgKiBDYWxscyB0aGUgcGFyZW50IGNvbnN0cnVjdG9yIHdoaWNoIGNyZWF0ZXMgYSBTZXJ2bGV0UmVzcG9uc2UgYWRhcHRvcgorICAgICAqIHdyYXBwaW5nIHRoZSBnaXZlbiByZXNwb25zZSBvYmplY3QuCisgICAgICovCisKKyAgICBwdWJsaWMgQ29tcHJlc3Npb25TZXJ2bGV0UmVzcG9uc2VXcmFwcGVyKEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHsKKyAgICAgICAgc3VwZXIocmVzcG9uc2UpOworICAgICAgICBvcmlnUmVzcG9uc2UgPSByZXNwb25zZTsKKyAgICAgICAgaWYgKGRlYnVnID4gMSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDb21wcmVzc2lvblNlcnZsZXRSZXNwb25zZVdyYXBwZXIgY29uc3RydWN0b3IgZ2V0cyBjYWxsZWQiKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKyAgICAvKioKKyAgICAgKiBPcmlnaW5hbCByZXNwb25zZQorICAgICAqLworCisgICAgcHJvdGVjdGVkIEh0dHBTZXJ2bGV0UmVzcG9uc2Ugb3JpZ1Jlc3BvbnNlID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIERlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgUmVzcG9uc2UgaW1wbGVtZW50YXRpb24uCisgICAgICovCisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBpbmZvID0gIkNvbXByZXNzaW9uU2VydmxldFJlc3BvbnNlV3JhcHBlciI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgU2VydmxldE91dHB1dFN0cmVhbSB0aGF0IGhhcyBiZWVuIHJldHVybmVkIGJ5CisgICAgICogPGNvZGU+Z2V0T3V0cHV0U3RyZWFtKCk8L2NvZGU+LCBpZiBhbnkuCisgICAgICovCisKKyAgICBwcm90ZWN0ZWQgU2VydmxldE91dHB1dFN0cmVhbSBzdHJlYW0gPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgUHJpbnRXcml0ZXIgdGhhdCBoYXMgYmVlbiByZXR1cm5lZCBieQorICAgICAqIDxjb2RlPmdldFdyaXRlcigpPC9jb2RlPiwgaWYgYW55LgorICAgICAqLworCisgICAgcHJvdGVjdGVkIFByaW50V3JpdGVyIHdyaXRlciA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdGhyZXNob2xkIG51bWJlciB0byBjb21wcmVzcworICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgdGhyZXNob2xkID0gMDsKKworICAgIC8qKgorICAgICAqIERlYnVnIGxldmVsCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgZGVidWcgPSAwOworCisgICAgLyoqCisgICAgICogQ29udGVudCB0eXBlCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBjb250ZW50VHlwZSA9IG51bGw7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogU2V0IGNvbnRlbnQgdHlwZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbnRlbnRUeXBlKFN0cmluZyBjb250ZW50VHlwZSkgeworICAgICAgICBpZiAoZGVidWcgPiAxKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInNldENvbnRlbnRUeXBlIHRvICIrY29udGVudFR5cGUpOworICAgICAgICB9CisgICAgICAgIHRoaXMuY29udGVudFR5cGUgPSBjb250ZW50VHlwZTsKKyAgICAgICAgb3JpZ1Jlc3BvbnNlLnNldENvbnRlbnRUeXBlKGNvbnRlbnRUeXBlKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aHJlc2hvbGQgbnVtYmVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29tcHJlc3Npb25UaHJlc2hvbGQoaW50IHRocmVzaG9sZCkgeworICAgICAgICBpZiAoZGVidWcgPiAxKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInNldENvbXByZXNzaW9uVGhyZXNob2xkIHRvICIgKyB0aHJlc2hvbGQpOworICAgICAgICB9CisgICAgICAgIHRoaXMudGhyZXNob2xkID0gdGhyZXNob2xkOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IGRlYnVnIGxldmVsCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVidWdMZXZlbChpbnQgZGVidWcpIHsKKyAgICAgICAgdGhpcy5kZWJ1ZyA9IGRlYnVnOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuZCByZXR1cm4gYSBTZXJ2bGV0T3V0cHV0U3RyZWFtIHRvIHdyaXRlIHRoZSBjb250ZW50CisgICAgICogYXNzb2NpYXRlZCB3aXRoIHRoaXMgUmVzcG9uc2UuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgU2VydmxldE91dHB1dFN0cmVhbSBjcmVhdGVPdXRwdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoZGVidWcgPiAxKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImNyZWF0ZU91dHB1dFN0cmVhbSBnZXRzIGNhbGxlZCIpOworICAgICAgICB9CisKKyAgICAgICAgQ29tcHJlc3Npb25SZXNwb25zZVN0cmVhbSBzdHJlYW0gPSBuZXcgQ29tcHJlc3Npb25SZXNwb25zZVN0cmVhbShvcmlnUmVzcG9uc2UpOworICAgICAgICBzdHJlYW0uc2V0RGVidWdMZXZlbChkZWJ1Zyk7CisgICAgICAgIHN0cmVhbS5zZXRCdWZmZXIodGhyZXNob2xkKTsKKworICAgICAgICByZXR1cm4gc3RyZWFtOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBGaW5pc2ggYSByZXNwb25zZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBmaW5pc2hSZXNwb25zZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICh3cml0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHdyaXRlci5jbG9zZSgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RyZWFtICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTZXJ2bGV0UmVzcG9uc2UgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBGbHVzaCB0aGUgYnVmZmVyIGFuZCBjb21taXQgdGhpcyByZXNwb25zZS4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGZsdXNoQnVmZmVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGRlYnVnID4gMSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJmbHVzaCBidWZmZXIgQCBDb21wcmVzc2lvblNlcnZsZXRSZXNwb25zZVdyYXBwZXIiKTsKKyAgICAgICAgfQorICAgICAgICAoKENvbXByZXNzaW9uUmVzcG9uc2VTdHJlYW0pc3RyZWFtKS5mbHVzaCgpOworCisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzZXJ2bGV0IG91dHB1dCBzdHJlYW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgUmVzcG9uc2UuCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiA8Y29kZT5nZXRXcml0ZXI8L2NvZGU+IGhhcworICAgICAqICBhbHJlYWR5IGJlZW4gY2FsbGVkIGZvciB0aGlzIHJlc3BvbnNlCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIFNlcnZsZXRPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAod3JpdGVyICE9IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJnZXRXcml0ZXIoKSBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZCBmb3IgdGhpcyByZXNwb25zZSIpOworCisgICAgICAgIGlmIChzdHJlYW0gPT0gbnVsbCkKKyAgICAgICAgICAgIHN0cmVhbSA9IGNyZWF0ZU91dHB1dFN0cmVhbSgpOworICAgICAgICBpZiAoZGVidWcgPiAxKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInN0cmVhbSBpcyBzZXQgdG8gIitzdHJlYW0rIiBpbiBnZXRPdXRwdXRTdHJlYW0iKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAoc3RyZWFtKTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgd3JpdGVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFJlc3BvbnNlLgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgPGNvZGU+Z2V0T3V0cHV0U3RyZWFtPC9jb2RlPiBoYXMKKyAgICAgKiAgYWxyZWFkeSBiZWVuIGNhbGxlZCBmb3IgdGhpcyByZXNwb25zZQorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gaW5wdXQvb3V0cHV0IGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBQcmludFdyaXRlciBnZXRXcml0ZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIGlmICh3cml0ZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAod3JpdGVyKTsKKworICAgICAgICBpZiAoc3RyZWFtICE9IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJnZXRPdXRwdXRTdHJlYW0oKSBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZCBmb3IgdGhpcyByZXNwb25zZSIpOworCisgICAgICAgIHN0cmVhbSA9IGNyZWF0ZU91dHB1dFN0cmVhbSgpOworICAgICAgICBpZiAoZGVidWcgPiAxKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInN0cmVhbSBpcyBzZXQgdG8gIitzdHJlYW0rIiBpbiBnZXRXcml0ZXIiKTsKKyAgICAgICAgfQorICAgICAgICAvL1N0cmluZyBjaGFyc2V0ID0gZ2V0Q2hhcnNldEZyb21Db250ZW50VHlwZShjb250ZW50VHlwZSk7CisgICAgICAgIFN0cmluZyBjaGFyRW5jID0gb3JpZ1Jlc3BvbnNlLmdldENoYXJhY3RlckVuY29kaW5nKCk7CisgICAgICAgIGlmIChkZWJ1ZyA+IDEpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY2hhcmFjdGVyIGVuY29kaW5nIGlzICIgKyBjaGFyRW5jKTsKKyAgICAgICAgfQorICAgICAgICAvLyBIdHRwU2VydmxldFJlc3BvbnNlLmdldENoYXJhY3RlckVuY29kaW5nKCkgc2hvdWxkbid0IHJldHVybiBudWxsCisgICAgICAgIC8vIGFjY29yZGluZyB0aGUgc3BlYywgc28gZmVlbCBmcmVlIHRvIHJlbW92ZSB0aGF0ICJpZiIKKyAgICAgICAgaWYgKGNoYXJFbmMgIT0gbnVsbCkgeworICAgICAgICAgICAgd3JpdGVyID0gbmV3IFByaW50V3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoc3RyZWFtLCBjaGFyRW5jKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIoc3RyZWFtKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuICh3cml0ZXIpOworCisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXRDb250ZW50TGVuZ3RoKGludCBsZW5ndGgpIHsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybnMgY2hhcmFjdGVyIGZyb20gY29udGVudCB0eXBlLiBUaGlzIG1ldGhvZCB3YXMgdGFrZW4gZnJvbSB0b21jYXQuCisgICAgICogQGF1dGhvciByYWpvCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldENoYXJzZXRGcm9tQ29udGVudFR5cGUoU3RyaW5nIHR5cGUpIHsKKworICAgICAgICBpZiAodHlwZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBpbnQgc2VtaSA9IHR5cGUuaW5kZXhPZigiOyIpOworICAgICAgICBpZiAoc2VtaSA9PSAtMSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIGFmdGVyU2VtaSA9IHR5cGUuc3Vic3RyaW5nKHNlbWkgKyAxKTsKKyAgICAgICAgaW50IGNoYXJzZXRMb2NhdGlvbiA9IGFmdGVyU2VtaS5pbmRleE9mKCJjaGFyc2V0PSIpOworICAgICAgICBpZihjaGFyc2V0TG9jYXRpb24gPT0gLTEpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU3RyaW5nIGFmdGVyQ2hhcnNldCA9IGFmdGVyU2VtaS5zdWJzdHJpbmcoY2hhcnNldExvY2F0aW9uICsgOCk7CisgICAgICAgICAgICBTdHJpbmcgZW5jb2RpbmcgPSBhZnRlckNoYXJzZXQudHJpbSgpOworICAgICAgICAgICAgcmV0dXJuIGVuY29kaW5nOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1NC9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvZmlsdGVycy9FeGFtcGxlRmlsdGVyLmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1NC9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvZmlsdGVycy9FeGFtcGxlRmlsdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA3OGNmNQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTU0L2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9maWx0ZXJzL0V4YW1wbGVGaWx0ZXIuamF2YQpAQCAtMCwwICsxLDEzOSBAQAorLyoKKyogQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitwYWNrYWdlIGZpbHRlcnM7CisKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5GaWx0ZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5GaWx0ZXJDaGFpbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LkZpbHRlckNvbmZpZzsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldFJlc3BvbnNlOworCisKKy8qKgorICogRXhhbXBsZSBmaWx0ZXIgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gZWl0aGVyIGFuIGluZGl2aWR1YWwgc2VydmxldAorICogb3IgdG8gYSBVUkwgcGF0dGVybi4gIFRoaXMgZmlsdGVyIHBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zOgorICogPHVsPgorICogPGxpPkF0dGFjaGVzIGl0c2VsZiBhcyBhIHJlcXVlc3QgYXR0cmlidXRlLCB1bmRlciB0aGUgYXR0cmlidXRlIG5hbWUKKyAqICAgICBkZWZpbmVkIGJ5IHRoZSB2YWx1ZSBvZiB0aGUgPGNvZGU+YXR0cmlidXRlPC9jb2RlPiBpbml0aWFsaXphdGlvbgorICogICAgIHBhcmFtZXRlci48L2xpPgorICogPGxpPkNhbGN1bGF0ZXMgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgcmVxdWlyZWQgdG8gcGVyZm9ybSB0aGUKKyAqICAgICBzZXJ2bGV0IHByb2Nlc3NpbmcgcmVxdWlyZWQgYnkgdGhpcyByZXF1ZXN0LCBpbmNsdWRpbmcgYW55CisgKiAgICAgc3Vic2VxdWVudGx5IGRlZmluZWQgZmlsdGVycywgYW5kIGxvZ3MgdGhlIHJlc3VsdCB0byB0aGUgc2VydmxldAorICogICAgIGNvbnRleHQgbG9nIGZvciB0aGlzIGFwcGxpY2F0aW9uLgorICogPC91bD4KKyAqCisgKiBAYXV0aG9yIENyYWlnIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIEV4YW1wbGVGaWx0ZXIgaW1wbGVtZW50cyBGaWx0ZXIgeworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbnN0YW5jZSBWYXJpYWJsZXMKKworCisgICAgLyoqCisgICAgICogVGhlIHJlcXVlc3QgYXR0cmlidXRlIG5hbWUgdW5kZXIgd2hpY2ggd2Ugc3RvcmUgYSByZWZlcmVuY2UgdG8gb3Vyc2VsZi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBhdHRyaWJ1dGUgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZmlsdGVyIGNvbmZpZ3VyYXRpb24gb2JqZWN0IHdlIGFyZSBhc3NvY2lhdGVkIHdpdGguICBJZiB0aGlzIHZhbHVlCisgICAgICogaXMgbnVsbCwgdGhpcyBmaWx0ZXIgaW5zdGFuY2UgaXMgbm90IGN1cnJlbnRseSBjb25maWd1cmVkLgorICAgICAqLworICAgIHByaXZhdGUgRmlsdGVyQ29uZmlnIGZpbHRlckNvbmZpZyA9IG51bGw7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBUYWtlIHRoaXMgZmlsdGVyIG91dCBvZiBzZXJ2aWNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3koKSB7CisKKyAgICAgICAgdGhpcy5hdHRyaWJ1dGUgPSBudWxsOworICAgICAgICB0aGlzLmZpbHRlckNvbmZpZyA9IG51bGw7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRpbWUgdGhlIHByb2Nlc3NpbmcgdGhhdCBpcyBwZXJmb3JtZWQgYnkgYWxsIHN1YnNlcXVlbnQgZmlsdGVycyBpbiB0aGUKKyAgICAgKiBjdXJyZW50IGZpbHRlciBzdGFjaywgaW5jbHVkaW5nIHRoZSB1bHRpbWF0ZWx5IGludm9rZWQgc2VydmxldC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzdWx0IFRoZSBzZXJ2bGV0IHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqIEBwYXJhbSBjaGFpbiBUaGUgZmlsdGVyIGNoYWluIHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0IGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRvRmlsdGVyKFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGaWx0ZXJDaGFpbiBjaGFpbikKKwl0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisJLy8gU3RvcmUgb3Vyc2VsdmVzIGFzIGEgcmVxdWVzdCBhdHRyaWJ1dGUgKGlmIHJlcXVlc3RlZCkKKwlpZiAoYXR0cmlidXRlICE9IG51bGwpCisJICAgIHJlcXVlc3Quc2V0QXR0cmlidXRlKGF0dHJpYnV0ZSwgdGhpcyk7CisKKwkvLyBUaW1lIGFuZCBsb2cgdGhlIHN1YnNlcXVlbnQgcHJvY2Vzc2luZworCWxvbmcgc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIGNoYWluLmRvRmlsdGVyKHJlcXVlc3QsIHJlc3BvbnNlKTsKKwlsb25nIHN0b3BUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisJZmlsdGVyQ29uZmlnLmdldFNlcnZsZXRDb250ZXh0KCkubG9nCisJICAgICh0aGlzLnRvU3RyaW5nKCkgKyAiOiAiICsgKHN0b3BUaW1lIC0gc3RhcnRUaW1lKSArCisJICAgICAiIG1pbGxpc2Vjb25kcyIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBQbGFjZSB0aGlzIGZpbHRlciBpbnRvIHNlcnZpY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsdGVyQ29uZmlnIFRoZSBmaWx0ZXIgY29uZmlndXJhdGlvbiBvYmplY3QKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbml0KEZpbHRlckNvbmZpZyBmaWx0ZXJDb25maWcpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKKworCXRoaXMuZmlsdGVyQ29uZmlnID0gZmlsdGVyQ29uZmlnOworICAgICAgICB0aGlzLmF0dHJpYnV0ZSA9IGZpbHRlckNvbmZpZy5nZXRJbml0UGFyYW1ldGVyKCJhdHRyaWJ1dGUiKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisKKwlpZiAoZmlsdGVyQ29uZmlnID09IG51bGwpCisJICAgIHJldHVybiAoIkludm9rZXJGaWx0ZXIoKSIpOworCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIkludm9rZXJGaWx0ZXIoIik7CisJc2IuYXBwZW5kKGZpbHRlckNvbmZpZyk7CisJc2IuYXBwZW5kKCIpIik7CisJcmV0dXJuIChzYi50b1N0cmluZygpKTsKKworICAgIH0KKworCit9CisKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTU0L2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9maWx0ZXJzL1JlcXVlc3REdW1wZXJGaWx0ZXIuamF2YSBiL3NlcnZsZXRhcGkvanNyMTU0L2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9maWx0ZXJzL1JlcXVlc3REdW1wZXJGaWx0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDczNzA1Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTQvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2ZpbHRlcnMvUmVxdWVzdER1bXBlckZpbHRlci5qYXZhCkBAIC0wLDAgKzEsMjAwIEBACisvKgorKiBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKworcGFja2FnZSBmaWx0ZXJzOworCisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7CitpbXBvcnQgamF2YS5zcWwuVGltZXN0YW1wOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuRmlsdGVyOworaW1wb3J0IGphdmF4LnNlcnZsZXQuRmlsdGVyQ2hhaW47CitpbXBvcnQgamF2YXguc2VydmxldC5GaWx0ZXJDb25maWc7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuQ29va2llOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CisKKworLyoqCisgKiBFeGFtcGxlIGZpbHRlciB0aGF0IGR1bXBzIGludGVyZXN0aW5nIHN0YXRlIGluZm9ybWF0aW9uIGFib3V0IGEgcmVxdWVzdAorICogdG8gdGhlIGFzc29jaWF0ZWQgc2VydmxldCBjb250ZXh0IGxvZyBmaWxlLCBiZWZvcmUgYWxsb3dpbmcgdGhlIHNlcnZsZXQKKyAqIHRvIHByb2Nlc3MgdGhlIHJlcXVlc3QgaW4gdGhlIHVzdWFsIHdheS4gIFRoaXMgY2FuIGJlIGluc3RhbGxlZCBhcyBuZWVkZWQKKyAqIHRvIGFzc2lzdCBpbiBkZWJ1Z2dpbmcgcHJvYmxlbXMuCisgKgorICogQGF1dGhvciBDcmFpZyBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBSZXF1ZXN0RHVtcGVyRmlsdGVyIGltcGxlbWVudHMgRmlsdGVyIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBmaWx0ZXIgY29uZmlndXJhdGlvbiBvYmplY3Qgd2UgYXJlIGFzc29jaWF0ZWQgd2l0aC4gIElmIHRoaXMgdmFsdWUKKyAgICAgKiBpcyBudWxsLCB0aGlzIGZpbHRlciBpbnN0YW5jZSBpcyBub3QgY3VycmVudGx5IGNvbmZpZ3VyZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBGaWx0ZXJDb25maWcgZmlsdGVyQ29uZmlnID0gbnVsbDsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFRha2UgdGhpcyBmaWx0ZXIgb3V0IG9mIHNlcnZpY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZGVzdHJveSgpIHsKKworICAgICAgICB0aGlzLmZpbHRlckNvbmZpZyA9IG51bGw7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRpbWUgdGhlIHByb2Nlc3NpbmcgdGhhdCBpcyBwZXJmb3JtZWQgYnkgYWxsIHN1YnNlcXVlbnQgZmlsdGVycyBpbiB0aGUKKyAgICAgKiBjdXJyZW50IGZpbHRlciBzdGFjaywgaW5jbHVkaW5nIHRoZSB1bHRpbWF0ZWx5IGludm9rZWQgc2VydmxldC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBzZXJ2bGV0IHJlcXVlc3Qgd2UgYXJlIHByb2Nlc3NpbmcKKyAgICAgKiBAcGFyYW0gcmVzdWx0IFRoZSBzZXJ2bGV0IHJlc3BvbnNlIHdlIGFyZSBjcmVhdGluZworICAgICAqIEBwYXJhbSBjaGFpbiBUaGUgZmlsdGVyIGNoYWluIHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0IGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRvRmlsdGVyKFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGaWx0ZXJDaGFpbiBjaGFpbikKKwl0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIGlmIChmaWx0ZXJDb25maWcgPT0gbnVsbCkKKwkgICAgcmV0dXJuOworCisJLy8gUmVuZGVyIHRoZSBnZW5lcmljIHNlcnZsZXQgcmVxdWVzdCBwcm9wZXJ0aWVzCisJU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOworCVByaW50V3JpdGVyIHdyaXRlciA9IG5ldyBQcmludFdyaXRlcihzdyk7CisJd3JpdGVyLnByaW50bG4oIlJlcXVlc3QgUmVjZWl2ZWQgYXQgIiArCisJCSAgICAgICAobmV3IFRpbWVzdGFtcChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSkpKTsKKwl3cml0ZXIucHJpbnRsbigiIGNoYXJhY3RlckVuY29kaW5nPSIgKyByZXF1ZXN0LmdldENoYXJhY3RlckVuY29kaW5nKCkpOworCXdyaXRlci5wcmludGxuKCIgICAgIGNvbnRlbnRMZW5ndGg9IiArIHJlcXVlc3QuZ2V0Q29udGVudExlbmd0aCgpKTsKKwl3cml0ZXIucHJpbnRsbigiICAgICAgIGNvbnRlbnRUeXBlPSIgKyByZXF1ZXN0LmdldENvbnRlbnRUeXBlKCkpOworCXdyaXRlci5wcmludGxuKCIgICAgICAgICAgICBsb2NhbGU9IiArIHJlcXVlc3QuZ2V0TG9jYWxlKCkpOworCXdyaXRlci5wcmludCgiICAgICAgICAgICBsb2NhbGVzPSIpOworCUVudW1lcmF0aW9uIGxvY2FsZXMgPSByZXF1ZXN0LmdldExvY2FsZXMoKTsKKwlib29sZWFuIGZpcnN0ID0gdHJ1ZTsKKwl3aGlsZSAobG9jYWxlcy5oYXNNb3JlRWxlbWVudHMoKSkgeworCSAgICBMb2NhbGUgbG9jYWxlID0gKExvY2FsZSkgbG9jYWxlcy5uZXh0RWxlbWVudCgpOworCSAgICBpZiAoZmlyc3QpCisJICAgICAgICBmaXJzdCA9IGZhbHNlOworCSAgICBlbHNlCisJICAgICAgICB3cml0ZXIucHJpbnQoIiwgIik7CisJICAgIHdyaXRlci5wcmludChsb2NhbGUudG9TdHJpbmcoKSk7CisJfQorCXdyaXRlci5wcmludGxuKCk7CisJRW51bWVyYXRpb24gbmFtZXMgPSByZXF1ZXN0LmdldFBhcmFtZXRlck5hbWVzKCk7CisJd2hpbGUgKG5hbWVzLmhhc01vcmVFbGVtZW50cygpKSB7CisJICAgIFN0cmluZyBuYW1lID0gKFN0cmluZykgbmFtZXMubmV4dEVsZW1lbnQoKTsKKwkgICAgd3JpdGVyLnByaW50KCIgICAgICAgICBwYXJhbWV0ZXI9IiArIG5hbWUgKyAiPSIpOworCSAgICBTdHJpbmcgdmFsdWVzW10gPSByZXF1ZXN0LmdldFBhcmFtZXRlclZhbHVlcyhuYW1lKTsKKwkgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKKwkgICAgICAgIGlmIChpID4gMCkKKwkJICAgIHdyaXRlci5wcmludCgiLCAiKTsKKwkJd3JpdGVyLnByaW50KHZhbHVlc1tpXSk7CisJICAgIH0KKwkgICAgd3JpdGVyLnByaW50bG4oKTsKKwl9CisJd3JpdGVyLnByaW50bG4oIiAgICAgICAgICBwcm90b2NvbD0iICsgcmVxdWVzdC5nZXRQcm90b2NvbCgpKTsKKwl3cml0ZXIucHJpbnRsbigiICAgICAgICByZW1vdGVBZGRyPSIgKyByZXF1ZXN0LmdldFJlbW90ZUFkZHIoKSk7CisJd3JpdGVyLnByaW50bG4oIiAgICAgICAgcmVtb3RlSG9zdD0iICsgcmVxdWVzdC5nZXRSZW1vdGVIb3N0KCkpOworCXdyaXRlci5wcmludGxuKCIgICAgICAgICAgICBzY2hlbWU9IiArIHJlcXVlc3QuZ2V0U2NoZW1lKCkpOworCXdyaXRlci5wcmludGxuKCIgICAgICAgIHNlcnZlck5hbWU9IiArIHJlcXVlc3QuZ2V0U2VydmVyTmFtZSgpKTsKKwl3cml0ZXIucHJpbnRsbigiICAgICAgICBzZXJ2ZXJQb3J0PSIgKyByZXF1ZXN0LmdldFNlcnZlclBvcnQoKSk7CisJd3JpdGVyLnByaW50bG4oIiAgICAgICAgICBpc1NlY3VyZT0iICsgcmVxdWVzdC5pc1NlY3VyZSgpKTsKKworCS8vIFJlbmRlciB0aGUgSFRUUCBzZXJ2bGV0IHJlcXVlc3QgcHJvcGVydGllcworCWlmIChyZXF1ZXN0IGluc3RhbmNlb2YgSHR0cFNlcnZsZXRSZXF1ZXN0KSB7CisJICAgIHdyaXRlci5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKKwkgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IGhyZXF1ZXN0ID0gKEh0dHBTZXJ2bGV0UmVxdWVzdCkgcmVxdWVzdDsKKwkgICAgd3JpdGVyLnByaW50bG4oIiAgICAgICBjb250ZXh0UGF0aD0iICsgaHJlcXVlc3QuZ2V0Q29udGV4dFBhdGgoKSk7CisJICAgIENvb2tpZSBjb29raWVzW10gPSBocmVxdWVzdC5nZXRDb29raWVzKCk7CisgICAgICAgICAgICBpZiAoY29va2llcyA9PSBudWxsKQorICAgICAgICAgICAgICAgIGNvb2tpZXMgPSBuZXcgQ29va2llWzBdOworCSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvb2tpZXMubGVuZ3RoOyBpKyspIHsKKwkgICAgICAgIHdyaXRlci5wcmludGxuKCIgICAgICAgICAgICBjb29raWU9IiArIGNvb2tpZXNbaV0uZ2V0TmFtZSgpICsKKwkJCSAgICAgICAiPSIgKyBjb29raWVzW2ldLmdldFZhbHVlKCkpOworCSAgICB9CisJICAgIG5hbWVzID0gaHJlcXVlc3QuZ2V0SGVhZGVyTmFtZXMoKTsKKwkgICAgd2hpbGUgKG5hbWVzLmhhc01vcmVFbGVtZW50cygpKSB7CisJICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIG5hbWVzLm5leHRFbGVtZW50KCk7CisJCVN0cmluZyB2YWx1ZSA9IGhyZXF1ZXN0LmdldEhlYWRlcihuYW1lKTsKKwkgICAgICAgIHdyaXRlci5wcmludGxuKCIgICAgICAgICAgICBoZWFkZXI9IiArIG5hbWUgKyAiPSIgKyB2YWx1ZSk7CisJICAgIH0KKwkgICAgd3JpdGVyLnByaW50bG4oIiAgICAgICAgICAgIG1ldGhvZD0iICsgaHJlcXVlc3QuZ2V0TWV0aG9kKCkpOworCSAgICB3cml0ZXIucHJpbnRsbigiICAgICAgICAgIHBhdGhJbmZvPSIgKyBocmVxdWVzdC5nZXRQYXRoSW5mbygpKTsKKwkgICAgd3JpdGVyLnByaW50bG4oIiAgICAgICBxdWVyeVN0cmluZz0iICsgaHJlcXVlc3QuZ2V0UXVlcnlTdHJpbmcoKSk7CisJICAgIHdyaXRlci5wcmludGxuKCIgICAgICAgIHJlbW90ZVVzZXI9IiArIGhyZXF1ZXN0LmdldFJlbW90ZVVzZXIoKSk7CisJICAgIHdyaXRlci5wcmludGxuKCJyZXF1ZXN0ZWRTZXNzaW9uSWQ9IiArCisJCQkgICBocmVxdWVzdC5nZXRSZXF1ZXN0ZWRTZXNzaW9uSWQoKSk7CisJICAgIHdyaXRlci5wcmludGxuKCIgICAgICAgIHJlcXVlc3RVUkk9IiArIGhyZXF1ZXN0LmdldFJlcXVlc3RVUkkoKSk7CisJICAgIHdyaXRlci5wcmludGxuKCIgICAgICAgc2VydmxldFBhdGg9IiArIGhyZXF1ZXN0LmdldFNlcnZsZXRQYXRoKCkpOworCX0KKwl3cml0ZXIucHJpbnRsbigiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7CisKKwkvLyBMb2cgdGhlIHJlc3VsdGluZyBzdHJpbmcKKwl3cml0ZXIuZmx1c2goKTsKKwlmaWx0ZXJDb25maWcuZ2V0U2VydmxldENvbnRleHQoKS5sb2coc3cuZ2V0QnVmZmVyKCkudG9TdHJpbmcoKSk7CisKKwkvLyBQYXNzIGNvbnRyb2wgb24gdG8gdGhlIG5leHQgZmlsdGVyCisgICAgICAgIGNoYWluLmRvRmlsdGVyKHJlcXVlc3QsIHJlc3BvbnNlKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUGxhY2UgdGhpcyBmaWx0ZXIgaW50byBzZXJ2aWNlLgorICAgICAqCisgICAgICogQHBhcmFtIGZpbHRlckNvbmZpZyBUaGUgZmlsdGVyIGNvbmZpZ3VyYXRpb24gb2JqZWN0CisgICAgICovCisgICAgcHVibGljIHZvaWQgaW5pdChGaWx0ZXJDb25maWcgZmlsdGVyQ29uZmlnKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7CisKKwl0aGlzLmZpbHRlckNvbmZpZyA9IGZpbHRlckNvbmZpZzsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisKKwlpZiAoZmlsdGVyQ29uZmlnID09IG51bGwpCisJICAgIHJldHVybiAoIlJlcXVlc3REdW1wZXJGaWx0ZXIoKSIpOworCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIlJlcXVlc3REdW1wZXJGaWx0ZXIoIik7CisJc2IuYXBwZW5kKGZpbHRlckNvbmZpZyk7CisJc2IuYXBwZW5kKCIpIik7CisJcmV0dXJuIChzYi50b1N0cmluZygpKTsKKworICAgIH0KKworCit9CisKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTU0L2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9maWx0ZXJzL1NldENoYXJhY3RlckVuY29kaW5nRmlsdGVyLmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1NC9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvZmlsdGVycy9TZXRDaGFyYWN0ZXJFbmNvZGluZ0ZpbHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkNTdjYWMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1NC9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvZmlsdGVycy9TZXRDaGFyYWN0ZXJFbmNvZGluZ0ZpbHRlci5qYXZhCkBAIC0wLDAgKzEsMTcxIEBACisvKgorKiBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK3BhY2thZ2UgZmlsdGVyczsKKworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LkZpbHRlcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LkZpbHRlckNoYWluOworaW1wb3J0IGphdmF4LnNlcnZsZXQuRmlsdGVyQ29uZmlnOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldFJlc3BvbnNlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuVW5hdmFpbGFibGVFeGNlcHRpb247CisKKworLyoqCisgKiA8cD5FeGFtcGxlIGZpbHRlciB0aGF0IHNldHMgdGhlIGNoYXJhY3RlciBlbmNvZGluZyB0byBiZSB1c2VkIGluIHBhcnNpbmcgdGhlCisgKiBpbmNvbWluZyByZXF1ZXN0LCBlaXRoZXIgdW5jb25kaXRpb25hbGx5IG9yIG9ubHkgaWYgdGhlIGNsaWVudCBkaWQgbm90CisgKiBzcGVjaWZ5IGEgY2hhcmFjdGVyIGVuY29kaW5nLiAgQ29uZmlndXJhdGlvbiBvZiB0aGlzIGZpbHRlciBpcyBiYXNlZCBvbgorICogdGhlIGZvbGxvd2luZyBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzOjwvcD4KKyAqIDx1bD4KKyAqIDxsaT48c3Ryb25nPmVuY29kaW5nPC9zdHJvbmc+IC0gVGhlIGNoYXJhY3RlciBlbmNvZGluZyB0byBiZSBjb25maWd1cmVkCisgKiAgICAgZm9yIHRoaXMgcmVxdWVzdCwgZWl0aGVyIGNvbmRpdGlvbmFsbHkgb3IgdW5jb25kaXRpb25hbGx5IGJhc2VkIG9uCisgKiAgICAgdGhlIDxjb2RlPmlnbm9yZTwvY29kZT4gaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyLiAgVGhpcyBwYXJhbWV0ZXIKKyAqICAgICBpcyByZXF1aXJlZCwgc28gdGhlcmUgaXMgbm8gZGVmYXVsdC48L2xpPgorICogPGxpPjxzdHJvbmc+aWdub3JlPC9zdHJvbmc+IC0gSWYgc2V0IHRvICJ0cnVlIiwgYW55IGNoYXJhY3RlciBlbmNvZGluZworICogICAgIHNwZWNpZmllZCBieSB0aGUgY2xpZW50IGlzIGlnbm9yZWQsIGFuZCB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhlCisgKiAgICAgPGNvZGU+c2VsZWN0RW5jb2RpbmcoKTwvY29kZT4gbWV0aG9kIGlzIHNldC4gIElmIHNldCB0byAiZmFsc2UsCisgKiAgICAgPGNvZGU+c2VsZWN0RW5jb2RpbmcoKTwvY29kZT4gaXMgY2FsbGVkIDxzdHJvbmc+b25seTwvc3Ryb25nPiBpZiB0aGUKKyAqICAgICBjbGllbnQgaGFzIG5vdCBhbHJlYWR5IHNwZWNpZmllZCBhbiBlbmNvZGluZy4gIEJ5IGRlZmF1bHQsIHRoaXMKKyAqICAgICBwYXJhbWV0ZXIgaXMgc2V0IHRvICJ0cnVlIi48L2xpPgorICogPC91bD4KKyAqCisgKiA8cD5BbHRob3VnaCB0aGlzIGZpbHRlciBjYW4gYmUgdXNlZCB1bmNoYW5nZWQsIGl0IGlzIGFsc28gZWFzeSB0bworICogc3ViY2xhc3MgaXQgYW5kIG1ha2UgdGhlIDxjb2RlPnNlbGVjdEVuY29kaW5nKCk8L2NvZGU+IG1ldGhvZCBtb3JlCisgKiBpbnRlbGxpZ2VudCBhYm91dCB3aGF0IGVuY29kaW5nIHRvIGNob29zZSwgYmFzZWQgb24gY2hhcmFjdGVyaXN0aWNzIG9mCisgKiB0aGUgaW5jb21pbmcgcmVxdWVzdCAoc3VjaCBhcyB0aGUgdmFsdWVzIG9mIHRoZSA8Y29kZT5BY2NlcHQtTGFuZ3VhZ2U8L2NvZGU+CisgKiBhbmQgPGNvZGU+VXNlci1BZ2VudDwvY29kZT4gaGVhZGVycywgb3IgYSB2YWx1ZSBzdGFzaGVkIGluIHRoZSBjdXJyZW50CisgKiB1c2VyJ3Mgc2Vzc2lvbi48L3A+CisgKgorICogQGF1dGhvciBDcmFpZyBNY0NsYW5haGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAorICovCisKK3B1YmxpYyBjbGFzcyBTZXRDaGFyYWN0ZXJFbmNvZGluZ0ZpbHRlciBpbXBsZW1lbnRzIEZpbHRlciB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBjaGFyYWN0ZXIgZW5jb2RpbmcgdG8gc2V0IGZvciByZXF1ZXN0cyB0aGF0IHBhc3MgdGhyb3VnaAorICAgICAqIHRoaXMgZmlsdGVyLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZW5jb2RpbmcgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgZmlsdGVyIGNvbmZpZ3VyYXRpb24gb2JqZWN0IHdlIGFyZSBhc3NvY2lhdGVkIHdpdGguICBJZiB0aGlzIHZhbHVlCisgICAgICogaXMgbnVsbCwgdGhpcyBmaWx0ZXIgaW5zdGFuY2UgaXMgbm90IGN1cnJlbnRseSBjb25maWd1cmVkLgorICAgICAqLworICAgIHByb3RlY3RlZCBGaWx0ZXJDb25maWcgZmlsdGVyQ29uZmlnID0gbnVsbDsKKworCisgICAgLyoqCisgICAgICogU2hvdWxkIGEgY2hhcmFjdGVyIGVuY29kaW5nIHNwZWNpZmllZCBieSB0aGUgY2xpZW50IGJlIGlnbm9yZWQ/CisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaWdub3JlID0gdHJ1ZTsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFRha2UgdGhpcyBmaWx0ZXIgb3V0IG9mIHNlcnZpY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZGVzdHJveSgpIHsKKworICAgICAgICB0aGlzLmVuY29kaW5nID0gbnVsbDsKKyAgICAgICAgdGhpcy5maWx0ZXJDb25maWcgPSBudWxsOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZWxlY3QgYW5kIHNldCAoaWYgc3BlY2lmaWVkKSB0aGUgY2hhcmFjdGVyIGVuY29kaW5nIHRvIGJlIHVzZWQgdG8KKyAgICAgKiBpbnRlcnByZXQgcmVxdWVzdCBwYXJhbWV0ZXJzIGZvciB0aGlzIHJlcXVlc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc2VydmxldCByZXF1ZXN0IHdlIGFyZSBwcm9jZXNzaW5nCisgICAgICogQHBhcmFtIHJlc3VsdCBUaGUgc2VydmxldCByZXNwb25zZSB3ZSBhcmUgY3JlYXRpbmcKKyAgICAgKiBAcGFyYW0gY2hhaW4gVGhlIGZpbHRlciBjaGFpbiB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiBhbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIGlmIGEgc2VydmxldCBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkb0ZpbHRlcihTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgRmlsdGVyQ2hhaW4gY2hhaW4pCisJdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICAvLyBDb25kaXRpb25hbGx5IHNlbGVjdCBhbmQgc2V0IHRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcgdG8gYmUgdXNlZAorICAgICAgICBpZiAoaWdub3JlIHx8IChyZXF1ZXN0LmdldENoYXJhY3RlckVuY29kaW5nKCkgPT0gbnVsbCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBlbmNvZGluZyA9IHNlbGVjdEVuY29kaW5nKHJlcXVlc3QpOworICAgICAgICAgICAgaWYgKGVuY29kaW5nICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmVxdWVzdC5zZXRDaGFyYWN0ZXJFbmNvZGluZyhlbmNvZGluZyk7CisgICAgICAgIH0KKworCS8vIFBhc3MgY29udHJvbCBvbiB0byB0aGUgbmV4dCBmaWx0ZXIKKyAgICAgICAgY2hhaW4uZG9GaWx0ZXIocmVxdWVzdCwgcmVzcG9uc2UpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBQbGFjZSB0aGlzIGZpbHRlciBpbnRvIHNlcnZpY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsdGVyQ29uZmlnIFRoZSBmaWx0ZXIgY29uZmlndXJhdGlvbiBvYmplY3QKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbml0KEZpbHRlckNvbmZpZyBmaWx0ZXJDb25maWcpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKKworCXRoaXMuZmlsdGVyQ29uZmlnID0gZmlsdGVyQ29uZmlnOworICAgICAgICB0aGlzLmVuY29kaW5nID0gZmlsdGVyQ29uZmlnLmdldEluaXRQYXJhbWV0ZXIoImVuY29kaW5nIik7CisgICAgICAgIFN0cmluZyB2YWx1ZSA9IGZpbHRlckNvbmZpZy5nZXRJbml0UGFyYW1ldGVyKCJpZ25vcmUiKTsKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCisgICAgICAgICAgICB0aGlzLmlnbm9yZSA9IHRydWU7CisgICAgICAgIGVsc2UgaWYgKHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSkKKyAgICAgICAgICAgIHRoaXMuaWdub3JlID0gdHJ1ZTsKKyAgICAgICAgZWxzZSBpZiAodmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgieWVzIikpCisgICAgICAgICAgICB0aGlzLmlnbm9yZSA9IHRydWU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRoaXMuaWdub3JlID0gZmFsc2U7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm90ZWN0ZWQgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBTZWxlY3QgYW4gYXBwcm9wcmlhdGUgY2hhcmFjdGVyIGVuY29kaW5nIHRvIGJlIHVzZWQsIGJhc2VkIG9uIHRoZQorICAgICAqIGNoYXJhY3RlcmlzdGljcyBvZiB0aGUgY3VycmVudCByZXF1ZXN0IGFuZC9vciBmaWx0ZXIgaW5pdGlhbGl6YXRpb24KKyAgICAgKiBwYXJhbWV0ZXJzLiAgSWYgbm8gY2hhcmFjdGVyIGVuY29kaW5nIHNob3VsZCBiZSBzZXQsIHJldHVybgorICAgICAqIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIDxwPgorICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHVuY29uZGl0aW9uYWxseSByZXR1cm5zIHRoZSB2YWx1ZSBjb25maWd1cmVkCisgICAgICogYnkgdGhlIDxzdHJvbmc+ZW5jb2Rpbmc8L3N0cm9uZz4gaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyIGZvciB0aGlzCisgICAgICogZmlsdGVyLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHNlcnZsZXQgcmVxdWVzdCB3ZSBhcmUgcHJvY2Vzc2luZworICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgc2VsZWN0RW5jb2RpbmcoU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworCisgICAgICAgIHJldHVybiAodGhpcy5lbmNvZGluZyk7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTQvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2xpc3RlbmVycy9Db250ZXh0TGlzdGVuZXIuamF2YSBiL3NlcnZsZXRhcGkvanNyMTU0L2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9saXN0ZW5lcnMvQ29udGV4dExpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYxZTA1NAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTU0L2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9saXN0ZW5lcnMvQ29udGV4dExpc3RlbmVyLmphdmEKQEAgLTAsMCArMSwxNTUgQEAKKy8qCisqIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworcGFja2FnZSBsaXN0ZW5lcnM7CisKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dEF0dHJpYnV0ZUV2ZW50OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHRBdHRyaWJ1dGVMaXN0ZW5lcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0RXZlbnQ7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dExpc3RlbmVyOworCisKKy8qKgorICogRXhhbXBsZSBsaXN0ZW5lciBmb3IgY29udGV4dC1yZWxhdGVkIGFwcGxpY2F0aW9uIGV2ZW50cywgd2hpY2ggd2VyZQorICogaW50cm9kdWNlZCBpbiB0aGUgMi4zIHZlcnNpb24gb2YgdGhlIFNlcnZsZXQgQVBJLiAgVGhpcyBsaXN0ZW5lcgorICogbWVyZWx5IGRvY3VtZW50cyB0aGUgb2NjdXJyZW5jZSBvZiBzdWNoIGV2ZW50cyBpbiB0aGUgYXBwbGljYXRpb24gbG9nCisgKiBhc3NvY2lhdGVkIHdpdGggb3VyIHNlcnZsZXQgY29udGV4dC4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIENvbnRleHRMaXN0ZW5lcgorICAgIGltcGxlbWVudHMgU2VydmxldENvbnRleHRBdHRyaWJ1dGVMaXN0ZW5lciwgU2VydmxldENvbnRleHRMaXN0ZW5lciB7CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEluc3RhbmNlIFZhcmlhYmxlcworCisKKyAgICAvKioKKyAgICAgKiBUaGUgc2VydmxldCBjb250ZXh0IHdpdGggd2hpY2ggd2UgYXJlIGFzc29jaWF0ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBTZXJ2bGV0Q29udGV4dCBjb250ZXh0ID0gbnVsbDsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIFJlY29yZCB0aGUgZmFjdCB0aGF0IGEgc2VydmxldCBjb250ZXh0IGF0dHJpYnV0ZSB3YXMgYWRkZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnQgVGhlIHNlcnZsZXQgY29udGV4dCBhdHRyaWJ1dGUgZXZlbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhdHRyaWJ1dGVBZGRlZChTZXJ2bGV0Q29udGV4dEF0dHJpYnV0ZUV2ZW50IGV2ZW50KSB7CisKKwlsb2coImF0dHJpYnV0ZUFkZGVkKCciICsgZXZlbnQuZ2V0TmFtZSgpICsgIicsICciICsKKwkgICAgZXZlbnQuZ2V0VmFsdWUoKSArICInKSIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZWNvcmQgdGhlIGZhY3QgdGhhdCBhIHNlcnZsZXQgY29udGV4dCBhdHRyaWJ1dGUgd2FzIHJlbW92ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnQgVGhlIHNlcnZsZXQgY29udGV4dCBhdHRyaWJ1dGUgZXZlbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhdHRyaWJ1dGVSZW1vdmVkKFNlcnZsZXRDb250ZXh0QXR0cmlidXRlRXZlbnQgZXZlbnQpIHsKKworCWxvZygiYXR0cmlidXRlUmVtb3ZlZCgnIiArIGV2ZW50LmdldE5hbWUoKSArICInLCAnIiArCisJICAgIGV2ZW50LmdldFZhbHVlKCkgKyAiJykiKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVjb3JkIHRoZSBmYWN0IHRoYXQgYSBzZXJ2bGV0IGNvbnRleHQgYXR0cmlidXRlIHdhcyByZXBsYWNlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudCBUaGUgc2VydmxldCBjb250ZXh0IGF0dHJpYnV0ZSBldmVudAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGF0dHJpYnV0ZVJlcGxhY2VkKFNlcnZsZXRDb250ZXh0QXR0cmlidXRlRXZlbnQgZXZlbnQpIHsKKworCWxvZygiYXR0cmlidXRlUmVwbGFjZWQoJyIgKyBldmVudC5nZXROYW1lKCkgKyAiJywgJyIgKworCSAgICBldmVudC5nZXRWYWx1ZSgpICsgIicpIik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlY29yZCB0aGUgZmFjdCB0aGF0IHRoaXMgd2ViIGFwcGxpY2F0aW9uIGhhcyBiZWVuIGRlc3Ryb3llZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudCBUaGUgc2VydmxldCBjb250ZXh0IGV2ZW50CisgICAgICovCisgICAgcHVibGljIHZvaWQgY29udGV4dERlc3Ryb3llZChTZXJ2bGV0Q29udGV4dEV2ZW50IGV2ZW50KSB7CisKKwlsb2coImNvbnRleHREZXN0cm95ZWQoKSIpOworCXRoaXMuY29udGV4dCA9IG51bGw7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlY29yZCB0aGUgZmFjdCB0aGF0IHRoaXMgd2ViIGFwcGxpY2F0aW9uIGhhcyBiZWVuIGluaXRpYWxpemVkLgorICAgICAqCisgICAgICogQHBhcmFtIGV2ZW50IFRoZSBzZXJ2bGV0IGNvbnRleHQgZXZlbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjb250ZXh0SW5pdGlhbGl6ZWQoU2VydmxldENvbnRleHRFdmVudCBldmVudCkgeworCisJdGhpcy5jb250ZXh0ID0gZXZlbnQuZ2V0U2VydmxldENvbnRleHQoKTsKKwlsb2coImNvbnRleHRJbml0aWFsaXplZCgpIik7CisKKyAgICB9CisKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByaXZhdGUgTWV0aG9kcworCisKKyAgICAvKioKKyAgICAgKiBMb2cgYSBtZXNzYWdlIHRvIHRoZSBzZXJ2bGV0IGNvbnRleHQgYXBwbGljYXRpb24gbG9nLgorICAgICAqCisgICAgICogQHBhcmFtIG1lc3NhZ2UgTWVzc2FnZSB0byBiZSBsb2dnZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgbG9nKFN0cmluZyBtZXNzYWdlKSB7CisKKwlpZiAoY29udGV4dCAhPSBudWxsKQorCSAgICBjb250ZXh0LmxvZygiQ29udGV4dExpc3RlbmVyOiAiICsgbWVzc2FnZSk7CisJZWxzZQorCSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNvbnRleHRMaXN0ZW5lcjogIiArIG1lc3NhZ2UpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBMb2cgYSBtZXNzYWdlIGFuZCBhc3NvY2lhdGVkIGV4Y2VwdGlvbiB0byB0aGUgc2VydmxldCBjb250ZXh0CisgICAgICogYXBwbGljYXRpb24gbG9nLgorICAgICAqCisgICAgICogQHBhcmFtIG1lc3NhZ2UgTWVzc2FnZSB0byBiZSBsb2dnZWQKKyAgICAgKiBAcGFyYW0gdGhyb3dhYmxlIEV4Y2VwdGlvbiB0byBiZSBsb2dnZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgbG9nKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgdGhyb3dhYmxlKSB7CisKKwlpZiAoY29udGV4dCAhPSBudWxsKQorCSAgICBjb250ZXh0LmxvZygiQ29udGV4dExpc3RlbmVyOiAiICsgbWVzc2FnZSwgdGhyb3dhYmxlKTsKKwllbHNlIHsKKwkgICAgU3lzdGVtLm91dC5wcmludGxuKCJDb250ZXh0TGlzdGVuZXI6ICIgKyBtZXNzYWdlKTsKKwkgICAgdGhyb3dhYmxlLnByaW50U3RhY2tUcmFjZShTeXN0ZW0ub3V0KTsKKwl9CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTQvZXhhbXBsZXMvV0VCLUlORi9jbGFzc2VzL2xpc3RlbmVycy9TZXNzaW9uTGlzdGVuZXIuamF2YSBiL3NlcnZsZXRhcGkvanNyMTU0L2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9saXN0ZW5lcnMvU2Vzc2lvbkxpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDEzZTkxZgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTU0L2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy9saXN0ZW5lcnMvU2Vzc2lvbkxpc3RlbmVyLmphdmEKQEAgLTAsMCArMSwxODIgQEAKKy8qCisqIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworcGFja2FnZSBsaXN0ZW5lcnM7CisKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dEV2ZW50OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHRMaXN0ZW5lcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb25BdHRyaWJ1dGVMaXN0ZW5lcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb25CaW5kaW5nRXZlbnQ7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uRXZlbnQ7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uTGlzdGVuZXI7CisKKworLyoqCisgKiBFeGFtcGxlIGxpc3RlbmVyIGZvciBjb250ZXh0LXJlbGF0ZWQgYXBwbGljYXRpb24gZXZlbnRzLCB3aGljaCB3ZXJlCisgKiBpbnRyb2R1Y2VkIGluIHRoZSAyLjMgdmVyc2lvbiBvZiB0aGUgU2VydmxldCBBUEkuICBUaGlzIGxpc3RlbmVyCisgKiBtZXJlbHkgZG9jdW1lbnRzIHRoZSBvY2N1cnJlbmNlIG9mIHN1Y2ggZXZlbnRzIGluIHRoZSBhcHBsaWNhdGlvbiBsb2cKKyAqIGFzc29jaWF0ZWQgd2l0aCBvdXIgc2VydmxldCBjb250ZXh0LgorICoKKyAqIEBhdXRob3IgQ3JhaWcgUi4gTWNDbGFuYWhhbgorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgU2Vzc2lvbkxpc3RlbmVyCisgICAgaW1wbGVtZW50cyBTZXJ2bGV0Q29udGV4dExpc3RlbmVyLAorCSAgICAgICBIdHRwU2Vzc2lvbkF0dHJpYnV0ZUxpc3RlbmVyLCBIdHRwU2Vzc2lvbkxpc3RlbmVyIHsKKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisKKworICAgIC8qKgorICAgICAqIFRoZSBzZXJ2bGV0IGNvbnRleHQgd2l0aCB3aGljaCB3ZSBhcmUgYXNzb2NpYXRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFNlcnZsZXRDb250ZXh0IGNvbnRleHQgPSBudWxsOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHMKKworCisgICAgLyoqCisgICAgICogUmVjb3JkIHRoZSBmYWN0IHRoYXQgYSBzZXJ2bGV0IGNvbnRleHQgYXR0cmlidXRlIHdhcyBhZGRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudCBUaGUgc2Vzc2lvbiBhdHRyaWJ1dGUgZXZlbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhdHRyaWJ1dGVBZGRlZChIdHRwU2Vzc2lvbkJpbmRpbmdFdmVudCBldmVudCkgeworCisJbG9nKCJhdHRyaWJ1dGVBZGRlZCgnIiArIGV2ZW50LmdldFNlc3Npb24oKS5nZXRJZCgpICsgIicsICciICsKKwkgICAgZXZlbnQuZ2V0TmFtZSgpICsgIicsICciICsgZXZlbnQuZ2V0VmFsdWUoKSArICInKSIpOworCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZWNvcmQgdGhlIGZhY3QgdGhhdCBhIHNlcnZsZXQgY29udGV4dCBhdHRyaWJ1dGUgd2FzIHJlbW92ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnQgVGhlIHNlc3Npb24gYXR0cmlidXRlIGV2ZW50CisgICAgICovCisgICAgcHVibGljIHZvaWQgYXR0cmlidXRlUmVtb3ZlZChIdHRwU2Vzc2lvbkJpbmRpbmdFdmVudCBldmVudCkgeworCisJbG9nKCJhdHRyaWJ1dGVSZW1vdmVkKCciICsgZXZlbnQuZ2V0U2Vzc2lvbigpLmdldElkKCkgKyAiJywgJyIgKworCSAgICBldmVudC5nZXROYW1lKCkgKyAiJywgJyIgKyBldmVudC5nZXRWYWx1ZSgpICsgIicpIik7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlY29yZCB0aGUgZmFjdCB0aGF0IGEgc2VydmxldCBjb250ZXh0IGF0dHJpYnV0ZSB3YXMgcmVwbGFjZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnQgVGhlIHNlc3Npb24gYXR0cmlidXRlIGV2ZW50CisgICAgICovCisgICAgcHVibGljIHZvaWQgYXR0cmlidXRlUmVwbGFjZWQoSHR0cFNlc3Npb25CaW5kaW5nRXZlbnQgZXZlbnQpIHsKKworCWxvZygiYXR0cmlidXRlUmVwbGFjZWQoJyIgKyBldmVudC5nZXRTZXNzaW9uKCkuZ2V0SWQoKSArICInLCAnIiArCisJICAgIGV2ZW50LmdldE5hbWUoKSArICInLCAnIiArIGV2ZW50LmdldFZhbHVlKCkgKyAiJykiKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVjb3JkIHRoZSBmYWN0IHRoYXQgdGhpcyB3ZWIgYXBwbGljYXRpb24gaGFzIGJlZW4gZGVzdHJveWVkLgorICAgICAqCisgICAgICogQHBhcmFtIGV2ZW50IFRoZSBzZXJ2bGV0IGNvbnRleHQgZXZlbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjb250ZXh0RGVzdHJveWVkKFNlcnZsZXRDb250ZXh0RXZlbnQgZXZlbnQpIHsKKworCWxvZygiY29udGV4dERlc3Ryb3llZCgpIik7CisJdGhpcy5jb250ZXh0ID0gbnVsbDsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVjb3JkIHRoZSBmYWN0IHRoYXQgdGhpcyB3ZWIgYXBwbGljYXRpb24gaGFzIGJlZW4gaW5pdGlhbGl6ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnQgVGhlIHNlcnZsZXQgY29udGV4dCBldmVudAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNvbnRleHRJbml0aWFsaXplZChTZXJ2bGV0Q29udGV4dEV2ZW50IGV2ZW50KSB7CisKKwl0aGlzLmNvbnRleHQgPSBldmVudC5nZXRTZXJ2bGV0Q29udGV4dCgpOworCWxvZygiY29udGV4dEluaXRpYWxpemVkKCkiKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVjb3JkIHRoZSBmYWN0IHRoYXQgYSBzZXNzaW9uIGhhcyBiZWVuIGNyZWF0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnQgVGhlIHNlc3Npb24gZXZlbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXNzaW9uQ3JlYXRlZChIdHRwU2Vzc2lvbkV2ZW50IGV2ZW50KSB7CisKKwlsb2coInNlc3Npb25DcmVhdGVkKCciICsgZXZlbnQuZ2V0U2Vzc2lvbigpLmdldElkKCkgKyAiJykiKTsKKworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVjb3JkIHRoZSBmYWN0IHRoYXQgYSBzZXNzaW9uIGhhcyBiZWVuIGRlc3Ryb3llZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudCBUaGUgc2Vzc2lvbiBldmVudAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNlc3Npb25EZXN0cm95ZWQoSHR0cFNlc3Npb25FdmVudCBldmVudCkgeworCisJbG9nKCJzZXNzaW9uRGVzdHJveWVkKCciICsgZXZlbnQuZ2V0U2Vzc2lvbigpLmdldElkKCkgKyAiJykiKTsKKworICAgIH0KKworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJpdmF0ZSBNZXRob2RzCisKKworICAgIC8qKgorICAgICAqIExvZyBhIG1lc3NhZ2UgdG8gdGhlIHNlcnZsZXQgY29udGV4dCBhcHBsaWNhdGlvbiBsb2cuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVzc2FnZSBNZXNzYWdlIHRvIGJlIGxvZ2dlZAorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBsb2coU3RyaW5nIG1lc3NhZ2UpIHsKKworCWlmIChjb250ZXh0ICE9IG51bGwpCisJICAgIGNvbnRleHQubG9nKCJTZXNzaW9uTGlzdGVuZXI6ICIgKyBtZXNzYWdlKTsKKwllbHNlCisJICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU2Vzc2lvbkxpc3RlbmVyOiAiICsgbWVzc2FnZSk7CisKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIExvZyBhIG1lc3NhZ2UgYW5kIGFzc29jaWF0ZWQgZXhjZXB0aW9uIHRvIHRoZSBzZXJ2bGV0IGNvbnRleHQKKyAgICAgKiBhcHBsaWNhdGlvbiBsb2cuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVzc2FnZSBNZXNzYWdlIHRvIGJlIGxvZ2dlZAorICAgICAqIEBwYXJhbSB0aHJvd2FibGUgRXhjZXB0aW9uIHRvIGJlIGxvZ2dlZAorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBsb2coU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSB0aHJvd2FibGUpIHsKKworCWlmIChjb250ZXh0ICE9IG51bGwpCisJICAgIGNvbnRleHQubG9nKCJTZXNzaW9uTGlzdGVuZXI6ICIgKyBtZXNzYWdlLCB0aHJvd2FibGUpOworCWVsc2UgeworCSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNlc3Npb25MaXN0ZW5lcjogIiArIG1lc3NhZ2UpOworCSAgICB0aHJvd2FibGUucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5vdXQpOworCX0KKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1NC9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvdXRpbC9IVE1MRmlsdGVyLmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1NC9leGFtcGxlcy9XRUItSU5GL2NsYXNzZXMvdXRpbC9IVE1MRmlsdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjcyZDM1MgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTU0L2V4YW1wbGVzL1dFQi1JTkYvY2xhc3Nlcy91dGlsL0hUTUxGaWx0ZXIuamF2YQpAQCAtMCwwICsxLDY4IEBACisvKgorKiBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCitwYWNrYWdlIHV0aWw7CisKKy8qKgorICogSFRNTCBmaWx0ZXIgdXRpbGl0eS4KKyAqCisgKiBAYXV0aG9yIENyYWlnIFIuIE1jQ2xhbmFoYW4KKyAqIEBhdXRob3IgVGltIFR5ZQorICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKKyAqLworCitwdWJsaWMgZmluYWwgY2xhc3MgSFRNTEZpbHRlciB7CisKKworICAgIC8qKgorICAgICAqIEZpbHRlciB0aGUgc3BlY2lmaWVkIG1lc3NhZ2Ugc3RyaW5nIGZvciBjaGFyYWN0ZXJzIHRoYXQgYXJlIHNlbnNpdGl2ZQorICAgICAqIGluIEhUTUwuICBUaGlzIGF2b2lkcyBwb3RlbnRpYWwgYXR0YWNrcyBjYXVzZWQgYnkgaW5jbHVkaW5nIEphdmFTY3JpcHQKKyAgICAgKiBjb2RlcyBpbiB0aGUgcmVxdWVzdCBVUkwgdGhhdCBpcyBvZnRlbiByZXBvcnRlZCBpbiBlcnJvciBtZXNzYWdlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIHN0cmluZyB0byBiZSBmaWx0ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGZpbHRlcihTdHJpbmcgbWVzc2FnZSkgeworCisgICAgICAgIGlmIChtZXNzYWdlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKG51bGwpOworCisgICAgICAgIGNoYXIgY29udGVudFtdID0gbmV3IGNoYXJbbWVzc2FnZS5sZW5ndGgoKV07CisgICAgICAgIG1lc3NhZ2UuZ2V0Q2hhcnMoMCwgbWVzc2FnZS5sZW5ndGgoKSwgY29udGVudCwgMCk7CisgICAgICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKGNvbnRlbnQubGVuZ3RoICsgNTApOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbnRlbnQubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHN3aXRjaCAoY29udGVudFtpXSkgeworICAgICAgICAgICAgY2FzZSAnPCc6CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiJmx0OyIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnPic6CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiJmd0OyIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnJic6CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiJmFtcDsiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJyInOgorICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIiZxdW90OyIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGNvbnRlbnRbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAocmVzdWx0LnRvU3RyaW5nKCkpOworCisgICAgfQorCisKK30KKwpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTQvZXhhbXBsZXMvV0VCLUlORi93ZWIueG1sIGIvc2VydmxldGFwaS9qc3IxNTQvZXhhbXBsZXMvV0VCLUlORi93ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMDU3MGYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1NC9leGFtcGxlcy9XRUItSU5GL3dlYi54bWwKQEAgLTAsMCArMSwyNDkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KKzwhLS0KKyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPCFET0NUWVBFIHdlYi1hcHAKKyAgICBQVUJMSUMgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBXZWIgQXBwbGljYXRpb24gMi4zLy9FTiIKKyAgICAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvd2ViLWFwcF8yXzMuZHRkIj4KKworPHdlYi1hcHA+CisKKyAgICA8ZGlzcGxheS1uYW1lPlNlcnZsZXQgMi40IEV4YW1wbGVzPC9kaXNwbGF5LW5hbWU+CisgICAgPGRlc2NyaXB0aW9uPgorICAgICAgU2VydmxldCAyLjQgRXhhbXBsZXMuCisgICAgPC9kZXNjcmlwdGlvbj4KKworICAgIDwhLS0gRGVmaW5lIHNlcnZsZXQtbWFwcGVkIGFuZCBwYXRoLW1hcHBlZCBleGFtcGxlIGZpbHRlcnMgLS0+CisgICAgPGZpbHRlcj4KKyAgICAgICAgPGZpbHRlci1uYW1lPlNlcnZsZXQgTWFwcGVkIEZpbHRlcjwvZmlsdGVyLW5hbWU+CisgICAgICAgIDxmaWx0ZXItY2xhc3M+ZmlsdGVycy5FeGFtcGxlRmlsdGVyPC9maWx0ZXItY2xhc3M+CisJPGluaXQtcGFyYW0+CisJICAgIDxwYXJhbS1uYW1lPmF0dHJpYnV0ZTwvcGFyYW0tbmFtZT4KKwkgICAgPHBhcmFtLXZhbHVlPmZpbHRlcnMuRXhhbXBsZUZpbHRlci5TRVJWTEVUX01BUFBFRDwvcGFyYW0tdmFsdWU+CisJPC9pbml0LXBhcmFtPgorICAgIDwvZmlsdGVyPgorICAgIDxmaWx0ZXI+CisgICAgICAgIDxmaWx0ZXItbmFtZT5QYXRoIE1hcHBlZCBGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8ZmlsdGVyLWNsYXNzPmZpbHRlcnMuRXhhbXBsZUZpbHRlcjwvZmlsdGVyLWNsYXNzPgorCTxpbml0LXBhcmFtPgorCSAgICA8cGFyYW0tbmFtZT5hdHRyaWJ1dGU8L3BhcmFtLW5hbWU+CisJICAgIDxwYXJhbS12YWx1ZT5maWx0ZXJzLkV4YW1wbGVGaWx0ZXIuUEFUSF9NQVBQRUQ8L3BhcmFtLXZhbHVlPgorCTwvaW5pdC1wYXJhbT4KKyAgICA8L2ZpbHRlcj4KKyAgICA8ZmlsdGVyPgorICAgICAgICA8ZmlsdGVyLW5hbWU+UmVxdWVzdCBEdW1wZXIgRmlsdGVyPC9maWx0ZXItbmFtZT4KKyAgICAgICAgPGZpbHRlci1jbGFzcz5maWx0ZXJzLlJlcXVlc3REdW1wZXJGaWx0ZXI8L2ZpbHRlci1jbGFzcz4KKyAgICA8L2ZpbHRlcj4KKworICAgIDwhLS0gRXhhbXBsZSBmaWx0ZXIgdG8gc2V0IGNoYXJhY3RlciBlbmNvZGluZyBvbiBlYWNoIHJlcXVlc3QgLS0+CisgICAgPGZpbHRlcj4KKyAgICAgICAgPGZpbHRlci1uYW1lPlNldCBDaGFyYWN0ZXIgRW5jb2Rpbmc8L2ZpbHRlci1uYW1lPgorICAgICAgICA8ZmlsdGVyLWNsYXNzPmZpbHRlcnMuU2V0Q2hhcmFjdGVyRW5jb2RpbmdGaWx0ZXI8L2ZpbHRlci1jbGFzcz4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5lbmNvZGluZzwvcGFyYW0tbmFtZT4KKyAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5FVUNfSlA8L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgPC9maWx0ZXI+CisKKyAgICA8ZmlsdGVyPgorICAgICAgICA8ZmlsdGVyLW5hbWU+Q29tcHJlc3Npb24gRmlsdGVyPC9maWx0ZXItbmFtZT4KKyAgICAgICAgPGZpbHRlci1jbGFzcz5jb21wcmVzc2lvbkZpbHRlcnMuQ29tcHJlc3Npb25GaWx0ZXI8L2ZpbHRlci1jbGFzcz4KKworICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICA8cGFyYW0tbmFtZT5jb21wcmVzc2lvblRocmVzaG9sZDwvcGFyYW0tbmFtZT4KKyAgICAgICAgICA8cGFyYW0tdmFsdWU+MTA8L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgIDxwYXJhbS1uYW1lPmRlYnVnPC9wYXJhbS1uYW1lPgorICAgICAgICAgIDxwYXJhbS12YWx1ZT4wPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgIDwvZmlsdGVyPgorCisgICAgPCEtLSBEZWZpbmUgZmlsdGVyIG1hcHBpbmdzIGZvciB0aGUgZGVmaW5lZCBmaWx0ZXJzIC0tPgorICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPlNlcnZsZXQgTWFwcGVkIEZpbHRlcjwvZmlsdGVyLW5hbWU+CisJPHNlcnZsZXQtbmFtZT5pbnZva2VyPC9zZXJ2bGV0LW5hbWU+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKyAgICA8ZmlsdGVyLW1hcHBpbmc+CisgICAgICAgIDxmaWx0ZXItbmFtZT5QYXRoIE1hcHBlZCBGaWx0ZXI8L2ZpbHRlci1uYW1lPgorCTx1cmwtcGF0dGVybj4vc2VydmxldC8qPC91cmwtcGF0dGVybj4KKyAgICA8L2ZpbHRlci1tYXBwaW5nPgorCisKKzwhLS0gRXhhbXBsZSBmaWx0ZXIgbWFwcGluZyB0byBhcHBseSB0aGUgIlNldCBDaGFyYWN0ZXIgRW5jb2RpbmciIGZpbHRlcgorICAgICB0byAqYWxsKiByZXF1ZXN0cyBwcm9jZXNzZWQgYnkgdGhpcyB3ZWIgYXBwbGljYXRpb24gLS0+Cis8IS0tCisgICAgPGZpbHRlci1tYXBwaW5nPgorICAgICAgICA8ZmlsdGVyLW5hbWU+U2V0IENoYXJhY3RlciBFbmNvZGluZzwvZmlsdGVyLW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vKjwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKy0tPgorCis8IS0tCisgICAgPGZpbHRlci1tYXBwaW5nPgorICAgICAgPGZpbHRlci1uYW1lPkNvbXByZXNzaW9uIEZpbHRlcjwvZmlsdGVyLW5hbWU+CisgICAgICA8dXJsLXBhdHRlcm4+L0NvbXByZXNzaW9uVGVzdDwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKy0tPgorCis8IS0tCisgICAgPGZpbHRlci1tYXBwaW5nPgorICAgICAgICA8ZmlsdGVyLW5hbWU+UmVxdWVzdCBEdW1wZXIgRmlsdGVyPC9maWx0ZXItbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi8qPC91cmwtcGF0dGVybj4KKyAgICA8L2ZpbHRlci1tYXBwaW5nPgorLS0+CisKKyAgICA8IS0tIERlZmluZSBleGFtcGxlIGFwcGxpY2F0aW9uIGV2ZW50cyBsaXN0ZW5lcnMgLS0+CisgICAgPGxpc3RlbmVyPgorICAgICAgICA8bGlzdGVuZXItY2xhc3M+bGlzdGVuZXJzLkNvbnRleHRMaXN0ZW5lcjwvbGlzdGVuZXItY2xhc3M+CisgICAgPC9saXN0ZW5lcj4KKyAgICA8bGlzdGVuZXI+CisgICAgICAgIDxsaXN0ZW5lci1jbGFzcz5saXN0ZW5lcnMuU2Vzc2lvbkxpc3RlbmVyPC9saXN0ZW5lci1jbGFzcz4KKyAgICA8L2xpc3RlbmVyPgorCisgICAgPCEtLSBEZWZpbmUgc2VydmxldHMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhlIGV4YW1wbGUgYXBwbGljYXRpb24gLS0+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5Db21wcmVzc2lvbkZpbHRlclRlc3RTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPmNvbXByZXNzaW9uRmlsdGVycy5Db21wcmVzc2lvbkZpbHRlclRlc3RTZXJ2bGV0PC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5IZWxsb1dvcmxkRXhhbXBsZTwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5IZWxsb1dvcmxkRXhhbXBsZTwvc2VydmxldC1jbGFzcz4KKyAgICA8L3NlcnZsZXQ+CisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+UmVxdWVzdEluZm9FeGFtcGxlPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPlJlcXVlc3RJbmZvRXhhbXBsZTwvc2VydmxldC1jbGFzcz4KKyAgICA8L3NlcnZsZXQ+CisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+UmVxdWVzdEhlYWRlckV4YW1wbGU8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+UmVxdWVzdEhlYWRlckV4YW1wbGU8L3NlcnZsZXQtY2xhc3M+CisgICAgPC9zZXJ2bGV0PgorICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPlJlcXVlc3RQYXJhbUV4YW1wbGU8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+UmVxdWVzdFBhcmFtRXhhbXBsZTwvc2VydmxldC1jbGFzcz4KKyAgICA8L3NlcnZsZXQ+CisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+Q29va2llRXhhbXBsZTwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5Db29raWVFeGFtcGxlPC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5TZXNzaW9uRXhhbXBsZTwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5TZXNzaW9uRXhhbXBsZTwvc2VydmxldC1jbGFzcz4KKyAgICA8L3NlcnZsZXQ+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkNvbXByZXNzaW9uRmlsdGVyVGVzdFNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9Db21wcmVzc2lvblRlc3Q8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+SGVsbG9Xb3JsZEV4YW1wbGU8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9zZXJ2bGV0L0hlbGxvV29ybGRFeGFtcGxlPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPlJlcXVlc3RJbmZvRXhhbXBsZTwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L3NlcnZsZXQvUmVxdWVzdEluZm9FeGFtcGxlLyo8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+UmVxdWVzdEhlYWRlckV4YW1wbGU8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9zZXJ2bGV0L1JlcXVlc3RIZWFkZXJFeGFtcGxlPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPlJlcXVlc3RQYXJhbUV4YW1wbGU8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9zZXJ2bGV0L1JlcXVlc3RQYXJhbUV4YW1wbGU8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+Q29va2llRXhhbXBsZTwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L3NlcnZsZXQvQ29va2llRXhhbXBsZTwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5TZXNzaW9uRXhhbXBsZTwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L3NlcnZsZXQvU2Vzc2lvbkV4YW1wbGU8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlY3VyaXR5LWNvbnN0cmFpbnQ+CisgICAgICA8ZGlzcGxheS1uYW1lPkV4YW1wbGUgU2VjdXJpdHkgQ29uc3RyYWludDwvZGlzcGxheS1uYW1lPgorICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgorICAgICAgICAgPHdlYi1yZXNvdXJjZS1uYW1lPlByb3RlY3RlZCBBcmVhPC93ZWItcmVzb3VyY2UtbmFtZT4KKwkgPCEtLSBEZWZpbmUgdGhlIGNvbnRleHQtcmVsYXRpdmUgVVJMKHMpIHRvIGJlIHByb3RlY3RlZCAtLT4KKyAgICAgICAgIDx1cmwtcGF0dGVybj4vanNwL3NlY3VyaXR5L3Byb3RlY3RlZC8qPC91cmwtcGF0dGVybj4KKwkgPCEtLSBJZiB5b3UgbGlzdCBodHRwIG1ldGhvZHMsIG9ubHkgdGhvc2UgbWV0aG9kcyBhcmUgcHJvdGVjdGVkIC0tPgorCSA8aHR0cC1tZXRob2Q+REVMRVRFPC9odHRwLW1ldGhvZD4KKyAgICAgICAgIDxodHRwLW1ldGhvZD5HRVQ8L2h0dHAtbWV0aG9kPgorICAgICAgICAgPGh0dHAtbWV0aG9kPlBPU1Q8L2h0dHAtbWV0aG9kPgorCSA8aHR0cC1tZXRob2Q+UFVUPC9odHRwLW1ldGhvZD4KKyAgICAgIDwvd2ViLXJlc291cmNlLWNvbGxlY3Rpb24+CisgICAgICA8YXV0aC1jb25zdHJhaW50PgorICAgICAgICAgPCEtLSBBbnlvbmUgd2l0aCBvbmUgb2YgdGhlIGxpc3RlZCByb2xlcyBtYXkgYWNjZXNzIHRoaXMgYXJlYSAtLT4KKyAgICAgICAgIDxyb2xlLW5hbWU+dG9tY2F0PC9yb2xlLW5hbWU+CisJIDxyb2xlLW5hbWU+cm9sZTE8L3JvbGUtbmFtZT4KKyAgICAgIDwvYXV0aC1jb25zdHJhaW50PgorICAgIDwvc2VjdXJpdHktY29uc3RyYWludD4KKworICAgIDwhLS0gRGVmYXVsdCBsb2dpbiBjb25maWd1cmF0aW9uIHVzZXMgZm9ybS1iYXNlZCBhdXRoZW50aWNhdGlvbiAtLT4KKyAgICA8bG9naW4tY29uZmlnPgorICAgICAgPGF1dGgtbWV0aG9kPkZPUk08L2F1dGgtbWV0aG9kPgorICAgICAgPHJlYWxtLW5hbWU+RXhhbXBsZSBGb3JtLUJhc2VkIEF1dGhlbnRpY2F0aW9uIEFyZWE8L3JlYWxtLW5hbWU+CisgICAgICA8Zm9ybS1sb2dpbi1jb25maWc+CisgICAgICAgIDxmb3JtLWxvZ2luLXBhZ2U+L2pzcC9zZWN1cml0eS9wcm90ZWN0ZWQvbG9naW4uanNwPC9mb3JtLWxvZ2luLXBhZ2U+CisgICAgICAgIDxmb3JtLWVycm9yLXBhZ2U+L2pzcC9zZWN1cml0eS9wcm90ZWN0ZWQvZXJyb3IuanNwPC9mb3JtLWVycm9yLXBhZ2U+CisgICAgICA8L2Zvcm0tbG9naW4tY29uZmlnPgorICAgIDwvbG9naW4tY29uZmlnPgorCisgICAgPCEtLSBTZWN1cml0eSByb2xlcyByZWZlcmVuY2VkIGJ5IHRoaXMgd2ViIGFwcGxpY2F0aW9uIC0tPgorICAgIDxzZWN1cml0eS1yb2xlPgorICAgICAgPHJvbGUtbmFtZT5yb2xlMTwvcm9sZS1uYW1lPgorICAgIDwvc2VjdXJpdHktcm9sZT4KKyAgICA8c2VjdXJpdHktcm9sZT4KKyAgICAgIDxyb2xlLW5hbWU+dG9tY2F0PC9yb2xlLW5hbWU+CisgICAgPC9zZWN1cml0eS1yb2xlPgorCisgICAgPCEtLSBFbnZpcm9ubWVudCBlbnRyeSBleGFtcGxlcyAtLT4KKyAgICA8IS0tZW52LWVudHJ5PgorICAgICAgPGVudi1lbnRyeS1kZXNjcmlwdGlvbj4KKyAgICAgICAgIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0YXggZXhlbXB0aW9ucyBhbGxvd2VkIHRvIGJlIHNldC4KKyAgICAgIDwvZW52LWVudHJ5LWRlc2NyaXB0aW9uPgorICAgICAgPGVudi1lbnRyeS1uYW1lPm1heEV4ZW1wdGlvbnM8L2Vudi1lbnRyeS1uYW1lPgorICAgICAgPGVudi1lbnRyeS12YWx1ZT4xNTwvZW52LWVudHJ5LXZhbHVlPgorICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9lbnYtZW50cnktdHlwZT4KKyAgICA8L2Vudi1lbnRyeS0tPgorICAgIDxlbnYtZW50cnk+CisgICAgICA8ZW52LWVudHJ5LW5hbWU+bWluRXhlbXB0aW9uczwvZW52LWVudHJ5LW5hbWU+CisgICAgICA8ZW52LWVudHJ5LXZhbHVlPjE8L2Vudi1lbnRyeS12YWx1ZT4KKyAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvZW52LWVudHJ5LXR5cGU+CisgICAgPC9lbnYtZW50cnk+CisgICAgPGVudi1lbnRyeT4KKyAgICAgIDxlbnYtZW50cnktbmFtZT5mb28vbmFtZTE8L2Vudi1lbnRyeS1uYW1lPgorICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZTE8L2Vudi1lbnRyeS12YWx1ZT4KKyAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9lbnYtZW50cnktdHlwZT4KKyAgICA8L2Vudi1lbnRyeT4KKyAgICA8ZW52LWVudHJ5PgorICAgICAgPGVudi1lbnRyeS1uYW1lPmZvby9iYXIvbmFtZTI8L2Vudi1lbnRyeS1uYW1lPgorICAgICAgPGVudi1lbnRyeS12YWx1ZT50cnVlPC9lbnYtZW50cnktdmFsdWU+CisgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJvb2xlYW48L2Vudi1lbnRyeS10eXBlPgorICAgIDwvZW52LWVudHJ5PgorICAgIDxlbnYtZW50cnk+CisgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZTM8L2Vudi1lbnRyeS1uYW1lPgorICAgICAgPGVudi1lbnRyeS12YWx1ZT4xPC9lbnYtZW50cnktdmFsdWU+CisgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkludGVnZXI8L2Vudi1lbnRyeS10eXBlPgorICAgIDwvZW52LWVudHJ5PgorICAgIDxlbnYtZW50cnk+CisgICAgICA8ZW52LWVudHJ5LW5hbWU+Zm9vL25hbWU0PC9lbnYtZW50cnktbmFtZT4KKyAgICAgIDxlbnYtZW50cnktdmFsdWU+MTA8L2Vudi1lbnRyeS12YWx1ZT4KKyAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvZW52LWVudHJ5LXR5cGU+CisgICAgPC9lbnYtZW50cnk+CisKKzwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTU0L2V4YW1wbGVzL2Nvb2tpZXMuaHRtbCBiL3NlcnZsZXRhcGkvanNyMTU0L2V4YW1wbGVzL2Nvb2tpZXMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTljY2JhCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTQvZXhhbXBsZXMvY29va2llcy5odG1sCkBAIC0wLDAgKzEsNjAgQEAKKzwhLS0KKyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorPGhlYWQ+Cis8dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Cis8L2hlYWQ+CisKKzxib2R5IGJnY29sb3I9IiNGRkZGRkYiPgorPHA+PGZvbnQgY29sb3I9IiMwMDAwRkYiPjxhIGhyZWY9InNlcnZsZXQvQ29va2llRXhhbXBsZSI+PGltZyBzcmM9ImltYWdlcy9leGVjdXRlLmdpZiIgYWxpZ249InJpZ2h0IiBib3JkZXI9IjAiPjwvYT48YSBocmVmPSJpbmRleC5odG1sIj48aW1nIHNyYz0iaW1hZ2VzL3JldHVybi5naWYiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgYWxpZ249InJpZ2h0IiBib3JkZXI9IjAiPjwvYT48L2ZvbnQ+PC9wPgorPGgzPlNvdXJjZSBDb2RlIGZvciBDb29raWUgRXhhbXBsZTxmb250IGNvbG9yPSIjMDAwMEZGIj48YnI+CisgIDwvZm9udD4gPC9oMz4KKzxmb250IGNvbG9yPSIjMDAwMEZGIj48L2ZvbnQ+IAorPHByZT48Zm9udCBjb2xvcj0iIzAwMDBGRiI+aW1wb3J0PC9mb250PiBqYXZhLmlvLio7Cis8Zm9udCBjb2xvcj0iIzAwMDBGRiI+aW1wb3J0PC9mb250PiBqYXZheC5zZXJ2bGV0Lio7Cis8Zm9udCBjb2xvcj0iIzAwMDBGRiI+aW1wb3J0PC9mb250PiBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKKworPGZvbnQgY29sb3I9IiMwMDAwRkYiPnB1YmxpYyBjbGFzczwvZm9udD4gQ29va2llRXhhbXBsZSA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+ZXh0ZW5kczwvZm9udD4gSHR0cFNlcnZsZXQgeworCisgICAgPGZvbnQgY29sb3I9IiMwMDAwRkYiPnB1YmxpYyB2b2lkPC9mb250PiBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+dGhyb3dzPC9mb250PiBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoJnF1b3Q7PGZvbnQgY29sb3I9IiMwMDk5MDAiPnRleHQvaHRtbDwvZm9udD4mcXVvdDspOworICAgICAgICBQcmludFdyaXRlciBvdXQgPSByZXNwb25zZS5nZXRXcml0ZXIoKTsKKyAgICAgICAgCisgICAgICAgIDxmb250IGNvbG9yPSIjQ0MwMDAwIj4vLyBwcmludCBvdXQgY29va2llczwvZm9udD4KKworICAgICAgICBDb29raWVbXSBjb29raWVzID0gcmVxdWVzdC5nZXRDb29raWVzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpICZsdDsgY29va2llcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgQ29va2llIGMgPSBjb29raWVzW2ldOworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBjLmdldE5hbWUoKTsKKyAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGMuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgIG91dC5wcmludGxuKG5hbWUgKyAmcXVvdDs8Zm9udCBjb2xvcj0iIzAwOTkwMCI+ID0gPC9mb250PiZxdW90OyArIHZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIDxmb250IGNvbG9yPSIjQ0MwMDAwIj4vLyBzZXQgYSBjb29raWU8L2ZvbnQ+CisKKyAgICAgICAgU3RyaW5nIG5hbWUgPSByZXF1ZXN0LmdldFBhcmFtZXRlcigmcXVvdDs8Zm9udCBjb2xvcj0iIzAwOTkwMCI+Y29va2llTmFtZTwvZm9udD4mcXVvdDspOworICAgICAgICBpZiAobmFtZSAhPSBudWxsICZhbXA7JmFtcDsgbmFtZS5sZW5ndGgoKSAmZ3Q7IDApIHsKKyAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCZxdW90Ozxmb250IGNvbG9yPSIjMDA5OTAwIj5jb29raWVWYWx1ZTwvZm9udD4mcXVvdDspOworICAgICAgICAgICAgQ29va2llIGMgPSBuZXcgQ29va2llKG5hbWUsIHZhbHVlKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLmFkZENvb2tpZShjKTsKKyAgICAgICAgfQorICAgIH0KK308L3ByZT4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTU0L2V4YW1wbGVzL2hlbGxvd29ybGQuaHRtbCBiL3NlcnZsZXRhcGkvanNyMTU0L2V4YW1wbGVzL2hlbGxvd29ybGQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWJkZjAwCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTQvZXhhbXBsZXMvaGVsbG93b3JsZC5odG1sCkBAIC0wLDAgKzEsNDkgQEAKKzwhLS0KKyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorPGhlYWQ+Cis8dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Cis8L2hlYWQ+CisKKzxib2R5IGJnY29sb3I9IiNGRkZGRkYiPgorPHA+PGZvbnQgY29sb3I9IiMwMDAwRkYiPjxhIGhyZWY9InNlcnZsZXQvSGVsbG9Xb3JsZEV4YW1wbGUiPjxpbWcgc3JjPSJpbWFnZXMvZXhlY3V0ZS5naWYiIGFsaWduPSJyaWdodCIgYm9yZGVyPSIwIj48L2E+PGEgaHJlZj0iaW5kZXguaHRtbCI+PGltZyBzcmM9ImltYWdlcy9yZXR1cm4uZ2lmIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGFsaWduPSJyaWdodCIgYm9yZGVyPSIwIj48L2E+PC9mb250PjwvcD4KKzxoMz5Tb3VyY2UgQ29kZSBmb3IgSGVsbG9Xb3JsZCBFeGFtcGxlPGZvbnQgY29sb3I9IiMwMDAwRkYiPjxicj4KKyAgPC9mb250PiA8L2gzPgorPGZvbnQgY29sb3I9IiMwMDAwRkYiPjwvZm9udD4KKzxwcmU+PGZvbnQgY29sb3I9IiMwMDAwRkYiPmltcG9ydDwvZm9udD4gamF2YS5pby4qOworPGZvbnQgY29sb3I9IiMwMDAwRkYiPmltcG9ydDwvZm9udD4gamF2YXguc2VydmxldC4qOworPGZvbnQgY29sb3I9IiMwMDAwRkYiPmltcG9ydDwvZm9udD4gamF2YXguc2VydmxldC5odHRwLio7CisKKzxmb250IGNvbG9yPSIjMDAwMEZGIj5wdWJsaWMgY2xhc3M8L2ZvbnQ+IEhlbGxvV29ybGQgPGZvbnQgY29sb3I9IiMwMDAwRkYiPmV4dGVuZHM8L2ZvbnQ+IEh0dHBTZXJ2bGV0IHsKKworICAgIDxmb250IGNvbG9yPSIjMDAwMEZGIj5wdWJsaWMgdm9pZDwvZm9udD4gZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgPGZvbnQgY29sb3I9IiMwMDAwRkYiPnRocm93czwvZm9udD4gSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCZxdW90Ozxmb250IGNvbG9yPSIjMDA5OTAwIj50ZXh0L2h0bWw8L2ZvbnQ+JnF1b3Q7KTsKKyAgICAgICAgUHJpbnRXcml0ZXIgb3V0ID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisgICAgICAgIG91dC5wcmludGxuKCZxdW90Ozxmb250IGNvbG9yPSIjMDA5OTAwIj4mbHQ7aHRtbCZndDs8L2ZvbnQ+JnF1b3Q7KTsKKyAgICAgICAgb3V0LnByaW50bG4oJnF1b3Q7PGZvbnQgY29sb3I9IiMwMDk5MDAiPiZsdDtoZWFkJmd0OzwvZm9udD4mcXVvdDspOworICAgICAgICBvdXQucHJpbnRsbigmcXVvdDs8Zm9udCBjb2xvcj0iIzAwOTkwMCI+Jmx0O3RpdGxlJmd0O0hlbGxvIFdvcmxkISZsdDsvdGl0bGUmZ3Q7PC9mb250PiZxdW90Oyk7CisgICAgICAgIG91dC5wcmludGxuKCZxdW90Ozxmb250IGNvbG9yPSIjMDA5OTAwIj4mbHQ7L2hlYWQmZ3Q7PC9mb250PiZxdW90Oyk7CisgICAgICAgIG91dC5wcmludGxuKCZxdW90Ozxmb250IGNvbG9yPSIjMDA5OTAwIj4mbHQ7Ym9keSZndDs8L2ZvbnQ+JnF1b3Q7KTsKKyAgICAgICAgb3V0LnByaW50bG4oJnF1b3Q7PGZvbnQgY29sb3I9IiMwMDk5MDAiPiZsdDtoMSZndDtIZWxsbyBXb3JsZCEmbHQ7L2gxJmd0OzwvZm9udD4mcXVvdDspOworICAgICAgICBvdXQucHJpbnRsbigmcXVvdDs8Zm9udCBjb2xvcj0iIzAwOTkwMCI+Jmx0Oy9ib2R5Jmd0OzwvZm9udD4mcXVvdDspOworICAgICAgICBvdXQucHJpbnRsbigmcXVvdDs8Zm9udCBjb2xvcj0iIzAwOTkwMCI+Jmx0Oy9odG1sJmd0OzwvZm9udD4mcXVvdDspOworICAgIH0KK308L3ByZT4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTU0L2V4YW1wbGVzL2ltYWdlcy9jb2RlLmdpZiBiL3NlcnZsZXRhcGkvanNyMTU0L2V4YW1wbGVzL2ltYWdlcy9jb2RlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2FmMmNkCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTQvZXhhbXBsZXMvaW1hZ2VzL2NvZGUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTU0L2V4YW1wbGVzL2ltYWdlcy9leGVjdXRlLmdpZiBiL3NlcnZsZXRhcGkvanNyMTU0L2V4YW1wbGVzL2ltYWdlcy9leGVjdXRlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjRkNzBmCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTQvZXhhbXBsZXMvaW1hZ2VzL2V4ZWN1dGUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTU0L2V4YW1wbGVzL2ltYWdlcy9yZXR1cm4uZ2lmIGIvc2VydmxldGFwaS9qc3IxNTQvZXhhbXBsZXMvaW1hZ2VzL3JldHVybi5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY0ZjY4ZgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTU0L2V4YW1wbGVzL2ltYWdlcy9yZXR1cm4uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTU0L2V4YW1wbGVzL2luZGV4Lmh0bWwgYi9zZXJ2bGV0YXBpL2pzcjE1NC9leGFtcGxlcy9pbmRleC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1YThhYjIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1NC9leGFtcGxlcy9pbmRleC5odG1sCkBAIC0wLDAgKzEsMTIwIEBACis8IS0tCisgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgorPGh0bWw+Cis8aGVhZD4KKyAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorICAgPG1ldGEgbmFtZT0iR0VORVJBVE9SIiBjb250ZW50PSJNb3ppbGxhLzQuNjEgW2VuXSAoV2luTlQ7IEkpIFtOZXRzY2FwZV0iPgorICAgPG1ldGEgbmFtZT0iQXV0aG9yIiBjb250ZW50PSJBbmlsIEsuIFZpamVuZHJhbiI+CisgICA8dGl0bGU+U2VydmxldCBFeGFtcGxlczwvdGl0bGU+Cis8L2hlYWQ+Cis8Ym9keSBiZ2NvbG9yPSIjRkZGRkZGIj4KKzxiPjxmb250IGZhY2U9IkFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWYiPjxmb250IHNpemU9KzI+U2VydmxldAorRXhhbXBsZXMgd2l0aCBDb2RlPC9mb250PjwvZm9udD48L2I+Cis8cD5UaGlzIGlzIGEgY29sbGVjdGlvbiBvZiBleGFtcGxlcyB3aGljaCBkZW1vbnN0cmF0ZSBzb21lIG9mIHRoZSBtb3JlCitmcmVxdWVudGx5IHVzZWQgcGFydHMgb2YgdGhlIFNlcnZsZXQgQVBJLiBGYW1pbGlhcml0eSB3aXRoIHRoZSBKYXZhKHRtKQorUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgaXMgYXNzdW1lZC4KKzxwPlRoZXNlIGV4YW1wbGVzIHdpbGwgb25seSB3b3JrIHdoZW4gdmlld2VkIHZpYSBhbiBodHRwIFVSTC4gVGhleSB3aWxsCitub3Qgd29yayBpZiB5b3UgYXJlIHZpZXdpbmcgdGhlc2UgcGFnZXMgdmlhIGEgImZpbGU6Ly8uLi4iIFVSTC4gUGxlYXNlCityZWZlciB0byB0aGUgPGk+UkVBRE1FPC9pPiBmaWxlIHByb3ZpZGUgd2l0aCB0aGlzIFRvbWNhdCByZWxlYXNlIHJlZ2FyZGluZworaG93IHRvIGNvbmZpZ3VyZSBhbmQgc3RhcnQgdGhlIHByb3ZpZGVkIHdlYiBzZXJ2ZXIuCis8cD5XaGVyZXZlciB5b3Ugc2VlIGEgZm9ybSwgZW50ZXIgc29tZSBkYXRhIGFuZCBzZWUgaG93IHRoZSBzZXJ2bGV0IHJlYWN0cy4KK1doZW4gcGxheWluZyB3aXRoIHRoZSBDb29raWUgYW5kIFNlc3Npb24gRXhhbXBsZXMsIGp1bXAgYmFjayB0byB0aGUgSGVhZGVycworRXhhbXBsZSB0byBzZWUgZXhhY3RseSB3aGF0IHlvdXIgYnJvd3NlciBpcyBzZW5kaW5nIHRoZSBzZXJ2ZXIuCis8cD5UbyBuYXZpZ2F0ZSB5b3VyIHdheSB0aHJvdWdoIHRoZSBleGFtcGxlcywgdGhlIGZvbGxvd2luZyBpY29ucyB3aWxsCitoZWxwOgorPGJyPiZuYnNwOworPHRhYmxlIEJPUkRFUj0wIENFTExTUEFDSU5HPTUgV0lEVEg9Ijg1JSIgPgorPHRyIFZBTElHTj1UT1A+Cis8dGQgV0lEVEg9IjMwIj48aW1nIFNSQz0iaW1hZ2VzL2V4ZWN1dGUuZ2lmIiA+PC90ZD4KKworPHRkPkV4ZWN1dGUgdGhlIGV4YW1wbGU8L3RkPgorPC90cj4KKworPHRyIFZBTElHTj1UT1A+Cis8dGQgV0lEVEg9IjMwIj48aW1nIFNSQz0iaW1hZ2VzL2NvZGUuZ2lmIiBoZWlnaHQ9MjQgd2lkdGg9MjQ+PC90ZD4KKworPHRkPkxvb2sgYXQgdGhlIHNvdXJjZSBjb2RlIGZvciB0aGUgZXhhbXBsZTwvdGQ+Cis8L3RyPgorCis8dHIgVkFMSUdOPVRPUD4KKzx0ZCBXSURUSD0iMzAiPjxpbWcgU1JDPSJpbWFnZXMvcmV0dXJuLmdpZiIgaGVpZ2h0PTI0IHdpZHRoPTI0PjwvdGQ+CisKKzx0ZD5SZXR1cm4gdG8gdGhpcyBzY3JlZW48L3RkPgorPC90cj4KKzwvdGFibGU+CisKKzxwPlRpcDogVG8gc2VlIHRoZSBjb29raWUgaW50ZXJhY3Rpb25zIHdpdGggeW91ciBicm93c2VyLCB0cnkgdHVybmluZyBvbgordGhlICJub3RpZnkgd2hlbiBzZXR0aW5nIGEgY29va2llIiBvcHRpb24gaW4geW91ciBicm93c2VyIHByZWZlcmVuY2VzLgorVGhpcyB3aWxsIGxldCB5b3Ugc2VlIHdoZW4gYSBzZXNzaW9uIGlzIGNyZWF0ZWQgYW5kIGdpdmUgc29tZSBmZWVkYmFjaword2hlbiBsb29raW5nIGF0IHRoZSBjb29raWUgZGVtby4KKzxicj4mbmJzcDsKKzx0YWJsZSBCT1JERVI9MCBDRUxMU1BBQ0lORz01IFdJRFRIPSI4NSUiID4KKzx0ciBWQUxJR049VE9QPgorPHRkPkhlbGxvIFdvcmxkPC90ZD4KKworPHRkIFZBTElHTj1UT1AgV0lEVEg9IjMwJSI+PGEgaHJlZj0ic2VydmxldC9IZWxsb1dvcmxkRXhhbXBsZSI+PGltZyBTUkM9ImltYWdlcy9leGVjdXRlLmdpZiIgSFNQQUNFPTQgQk9SREVSPTAgIGFsaWduPVRPUD48L2E+PGEgaHJlZj0ic2VydmxldC9IZWxsb1dvcmxkRXhhbXBsZSI+RXhlY3V0ZTwvYT48L3RkPgorCis8dGQgV0lEVEg9IjMwJSI+PGEgaHJlZj0iaGVsbG93b3JsZC5odG1sIj48aW1nIFNSQz0iaW1hZ2VzL2NvZGUuZ2lmIiBIU1BBQ0U9NCBCT1JERVI9MCBoZWlnaHQ9MjQgd2lkdGg9MjQgYWxpZ249VE9QPjwvYT48YSBocmVmPSJoZWxsb3dvcmxkLmh0bWwiPlNvdXJjZTwvYT48L3RkPgorPC90cj4KKworPHRyIFZBTElHTj1UT1A+Cis8dGQ+UmVxdWVzdCBJbmZvPC90ZD4KKworPHRkIFdJRFRIPSIzMCUiPjxhIGhyZWY9InNlcnZsZXQvUmVxdWVzdEluZm9FeGFtcGxlIj48aW1nIFNSQz0iaW1hZ2VzL2V4ZWN1dGUuZ2lmIiBIU1BBQ0U9NCBCT1JERVI9MCAgYWxpZ249VE9QPjwvYT48YSBocmVmPSJzZXJ2bGV0L1JlcXVlc3RJbmZvRXhhbXBsZSI+RXhlY3V0ZTwvYT48L3RkPgorCis8dGQgV0lEVEg9IjMwJSI+PGEgaHJlZj0icmVxaW5mby5odG1sIj48aW1nIFNSQz0iaW1hZ2VzL2NvZGUuZ2lmIiBIU1BBQ0U9NCBCT1JERVI9MCBoZWlnaHQ9MjQgd2lkdGg9MjQgYWxpZ249VE9QPjwvYT48YSBocmVmPSJyZXFpbmZvLmh0bWwiPlNvdXJjZTwvYT48L3RkPgorPC90cj4KKworPHRyIFZBTElHTj1UT1A+Cis8dGQ+UmVxdWVzdCBIZWFkZXJzPC90ZD4KKworPHRkIFdJRFRIPSIzMCUiPjxhIGhyZWY9InNlcnZsZXQvUmVxdWVzdEhlYWRlckV4YW1wbGUiPjxpbWcgU1JDPSJpbWFnZXMvZXhlY3V0ZS5naWYiIEhTUEFDRT00IEJPUkRFUj0wICBhbGlnbj1UT1A+PC9hPjxhIGhyZWY9InNlcnZsZXQvUmVxdWVzdEhlYWRlckV4YW1wbGUiPkV4ZWN1dGU8L2E+PC90ZD4KKworPHRkIFdJRFRIPSIzMCUiPjxhIGhyZWY9InJlcWhlYWRlcnMuaHRtbCI+PGltZyBTUkM9ImltYWdlcy9jb2RlLmdpZiIgSFNQQUNFPTQgQk9SREVSPTAgaGVpZ2h0PTI0IHdpZHRoPTI0IGFsaWduPVRPUD48L2E+PGEgaHJlZj0icmVxaGVhZGVycy5odG1sIj5Tb3VyY2U8L2E+PC90ZD4KKzwvdHI+CisKKzx0ciBWQUxJR049VE9QPgorPHRkPlJlcXVlc3QgUGFyYW1ldGVyczwvdGQ+CisKKzx0ZCBXSURUSD0iMzAlIj48YSBocmVmPSJzZXJ2bGV0L1JlcXVlc3RQYXJhbUV4YW1wbGUiPjxpbWcgU1JDPSJpbWFnZXMvZXhlY3V0ZS5naWYiIEhTUEFDRT00IEJPUkRFUj0wICBhbGlnbj1UT1A+PC9hPjxhIGhyZWY9InNlcnZsZXQvUmVxdWVzdFBhcmFtRXhhbXBsZSI+RXhlY3V0ZTwvYT48L3RkPgorCis8dGQgV0lEVEg9IjMwJSI+PGEgaHJlZj0icmVxcGFyYW1zLmh0bWwiPjxpbWcgU1JDPSJpbWFnZXMvY29kZS5naWYiIEhTUEFDRT00IEJPUkRFUj0wIGhlaWdodD0yNCB3aWR0aD0yNCBhbGlnbj1UT1A+PC9hPjxhIGhyZWY9InJlcXBhcmFtcy5odG1sIj5Tb3VyY2U8L2E+PC90ZD4KKzwvdHI+CisKKzx0ciBWQUxJR049VE9QPgorPHRkPkNvb2tpZXM8L3RkPgorCis8dGQgV0lEVEg9IjMwJSI+PGEgaHJlZj0ic2VydmxldC9Db29raWVFeGFtcGxlIj48aW1nIFNSQz0iaW1hZ2VzL2V4ZWN1dGUuZ2lmIiBIU1BBQ0U9NCBCT1JERVI9MCAgYWxpZ249VE9QPjwvYT48YSBocmVmPSJzZXJ2bGV0L0Nvb2tpZUV4YW1wbGUiPkV4ZWN1dGU8L2E+PC90ZD4KKworPHRkIFdJRFRIPSIzMCUiPjxhIGhyZWY9ImNvb2tpZXMuaHRtbCI+PGltZyBTUkM9ImltYWdlcy9jb2RlLmdpZiIgSFNQQUNFPTQgQk9SREVSPTAgaGVpZ2h0PTI0IHdpZHRoPTI0IGFsaWduPVRPUD48L2E+PGEgaHJlZj0iY29va2llcy5odG1sIj5Tb3VyY2U8L2E+PC90ZD4KKzwvdHI+CisKKzx0ciBWQUxJR049VE9QPgorPHRkPlNlc3Npb25zPC90ZD4KKworPHRkIFdJRFRIPSIzMCUiPjxhIGhyZWY9InNlcnZsZXQvU2Vzc2lvbkV4YW1wbGUiPjxpbWcgU1JDPSJpbWFnZXMvZXhlY3V0ZS5naWYiIEhTUEFDRT00IEJPUkRFUj0wICBhbGlnbj1UT1A+PC9hPjxhIGhyZWY9InNlcnZsZXQvU2Vzc2lvbkV4YW1wbGUiPkV4ZWN1dGU8L2E+PC90ZD4KKworPHRkIFdJRFRIPSIzMCUiPjxhIGhyZWY9InNlc3Npb25zLmh0bWwiPjxpbWcgU1JDPSJpbWFnZXMvY29kZS5naWYiIEhTUEFDRT00IEJPUkRFUj0wIGhlaWdodD0yNCB3aWR0aD0yNCBhbGlnbj1UT1A+PC9hPjxhIGhyZWY9InNlc3Npb25zLmh0bWwiPlNvdXJjZTwvYT48L3RkPgorPC90cj4KKzwvdGFibGU+CisKKzxwPk5vdGU6IFRoZSBzb3VyY2UgY29kZSBmb3IgdGhlc2UgZXhhbXBsZXMgZG9lcyBub3QgY29udGFpbiBhbGwgb2YgdGhlCitzb3VyY2UgY29kZSB0aGF0IGlzIGFjdHVhbGx5IGluIHRoZSBleGFtcGxlLCBvbmx5IHRoZSBpbXBvcnRhbnQgc2VjdGlvbnMKK29mIGNvZGUuIENvZGUgbm90IGltcG9ydGFudCB0byB1bmRlcnN0YW5kIHRoZSBleGFtcGxlIGhhcyBiZWVuIHJlbW92ZWQKK2ZvciBjbGFyaXR5LgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTQvZXhhbXBsZXMvcmVxaGVhZGVycy5odG1sIGIvc2VydmxldGFwaS9qc3IxNTQvZXhhbXBsZXMvcmVxaGVhZGVycy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5YzIzOTEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1NC9leGFtcGxlcy9yZXFoZWFkZXJzLmh0bWwKQEAgLTAsMCArMSw0OCBAQAorPCEtLQorICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWw+Cis8aGVhZD4KKzx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKzwvaGVhZD4KKworPGJvZHkgYmdjb2xvcj0iI0ZGRkZGRiI+Cis8cD48Zm9udCBjb2xvcj0iIzAwMDBGRiI+PGEgaHJlZj0ic2VydmxldC9SZXF1ZXN0SGVhZGVyRXhhbXBsZSI+PGltZyBzcmM9ImltYWdlcy9leGVjdXRlLmdpZiIgYWxpZ249InJpZ2h0IiBib3JkZXI9IjAiPjwvYT48YSBocmVmPSJpbmRleC5odG1sIj48aW1nIHNyYz0iaW1hZ2VzL3JldHVybi5naWYiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgYWxpZ249InJpZ2h0IiBib3JkZXI9IjAiPjwvYT48L2ZvbnQ+PC9wPgorPGgzPlNvdXJjZSBDb2RlIGZvciBSZXF1ZXN0SGVhZGVyIEV4YW1wbGU8Zm9udCBjb2xvcj0iIzAwMDBGRiI+PGJyPgorICA8L2ZvbnQ+IDwvaDM+Cis8Zm9udCBjb2xvcj0iIzAwMDBGRiI+PC9mb250PgorPHByZT48Zm9udCBjb2xvcj0iIzAwMDBGRiI+aW1wb3J0PC9mb250PiBqYXZhLmlvLio7Cis8Zm9udCBjb2xvcj0iIzAwMDBGRiI+aW1wb3J0PC9mb250PiBqYXZhLnV0aWwuKjsKKzxmb250IGNvbG9yPSIjMDAwMEZGIj5pbXBvcnQ8L2ZvbnQ+IGphdmF4LnNlcnZsZXQuKjsKKzxmb250IGNvbG9yPSIjMDAwMEZGIj5pbXBvcnQ8L2ZvbnQ+IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCis8Zm9udCBjb2xvcj0iIzAwMDBGRiI+cHVibGljIGNsYXNzPC9mb250PiBSZXF1ZXN0SGVhZGVyRXhhbXBsZSA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+ZXh0ZW5kczwvZm9udD4gSHR0cFNlcnZsZXQgeworCisgICAgPGZvbnQgY29sb3I9IiMwMDAwRkYiPnB1YmxpYyB2b2lkPC9mb250PiBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+dGhyb3dzPC9mb250PiBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoJnF1b3Q7PGZvbnQgY29sb3I9IiMwMDk5MDAiPnRleHQvaHRtbDwvZm9udD4mcXVvdDspOworICAgICAgICBQcmludFdyaXRlciBvdXQgPSByZXNwb25zZS5nZXRXcml0ZXIoKTsKKyAgICAgICAgRW51bWVyYXRpb24gZSA9IHJlcXVlc3QuZ2V0SGVhZGVyTmFtZXMoKTsKKyAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZyllLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSByZXF1ZXN0LmdldEhlYWRlcihuYW1lKTsKKyAgICAgICAgICAgIG91dC5wcmludGxuKG5hbWUgKyAmcXVvdDs8Zm9udCBjb2xvcj0iIzAwOTkwMCI+ID0gPC9mb250PiZxdW90OyArIHZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KK308L3ByZT4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTU0L2V4YW1wbGVzL3JlcWluZm8uaHRtbCBiL3NlcnZsZXRhcGkvanNyMTU0L2V4YW1wbGVzL3JlcWluZm8uaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDkyNmI3Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTQvZXhhbXBsZXMvcmVxaW5mby5odG1sCkBAIC0wLDAgKzEsNjcgQEAKKzwhLS0KKyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sPgorPGhlYWQ+Cis8dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Cis8L2hlYWQ+CisKKzxib2R5IGJnY29sb3I9IiNGRkZGRkYiPgorPHA+PGZvbnQgY29sb3I9IiMwMDAwRkYiPjxhIGhyZWY9InNlcnZsZXQvUmVxdWVzdEluZm9FeGFtcGxlIj48aW1nIHNyYz0iaW1hZ2VzL2V4ZWN1dGUuZ2lmIiBhbGlnbj0icmlnaHQiIGJvcmRlcj0iMCI+PC9hPjxhIGhyZWY9ImluZGV4Lmh0bWwiPjxpbWcgc3JjPSJpbWFnZXMvcmV0dXJuLmdpZiIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiBhbGlnbj0icmlnaHQiIGJvcmRlcj0iMCI+PC9hPjwvZm9udD48L3A+Cis8aDM+U291cmNlIENvZGUgZm9yIFJlcXVlc3QgSW5mbyBFeGFtcGxlPGZvbnQgY29sb3I9IiMwMDAwRkYiPjxicj4KKyAgPC9mb250PiA8L2gzPgorPGZvbnQgY29sb3I9IiMwMDAwRkYiPjwvZm9udD4gCis8cHJlPjxmb250IGNvbG9yPSIjMDAwMEZGIj5pbXBvcnQ8L2ZvbnQ+IGphdmEuaW8uKjsKKzxmb250IGNvbG9yPSIjMDAwMEZGIj5pbXBvcnQ8L2ZvbnQ+IGphdmF4LnNlcnZsZXQuKjsKKzxmb250IGNvbG9yPSIjMDAwMEZGIj5pbXBvcnQ8L2ZvbnQ+IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCis8Zm9udCBjb2xvcj0iIzAwMDBGRiI+cHVibGljIGNsYXNzPC9mb250PiBSZXF1ZXN0SW5mbyA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+ZXh0ZW5kczwvZm9udD4gSHR0cFNlcnZsZXQgeworCisgICAgPGZvbnQgY29sb3I9IiMwMDAwRkYiPnB1YmxpYyB2b2lkPC9mb250PiBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+dGhyb3dzPC9mb250PiBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoJnF1b3Q7PGZvbnQgY29sb3I9IiMwMDk5MDAiPnRleHQvaHRtbDwvZm9udD4mcXVvdDspOworICAgICAgICBQcmludFdyaXRlciBvdXQgPSByZXNwb25zZS5nZXRXcml0ZXIoKTsKKyAgICAgICAgb3V0LnByaW50bG4oJnF1b3Q7PGZvbnQgY29sb3I9IiMwMDk5MDAiPiZsdDtodG1sJmd0OzwvZm9udD4mcXVvdDspOworICAgICAgICBvdXQucHJpbnRsbigmcXVvdDs8Zm9udCBjb2xvcj0iIzAwOTkwMCI+Jmx0O2JvZHkmZ3Q7PC9mb250PiZxdW90Oyk7CisgICAgICAgIG91dC5wcmludGxuKCZxdW90Ozxmb250IGNvbG9yPSIjMDA5OTAwIj4mbHQ7aGVhZCZndDs8L2ZvbnQ+JnF1b3Q7KTsKKyAgICAgICAgb3V0LnByaW50bG4oJnF1b3Q7PGZvbnQgY29sb3I9IiMwMDk5MDAiPiZsdDt0aXRsZSZndDtSZXF1ZXN0IEluZm9ybWF0aW9uIEV4YW1wbGUmbHQ7L3RpdGxlJmd0OzwvZm9udD4mcXVvdDspOworICAgICAgICBvdXQucHJpbnRsbigmcXVvdDs8Zm9udCBjb2xvcj0iIzAwOTkwMCI+Jmx0Oy9oZWFkJmd0OzwvZm9udD4mcXVvdDspOworICAgICAgICBvdXQucHJpbnRsbigmcXVvdDs8Zm9udCBjb2xvcj0iIzAwOTkwMCI+Jmx0O2JvZHkmZ3Q7PC9mb250PiZxdW90Oyk7CisgICAgICAgIG91dC5wcmludGxuKCZxdW90Ozxmb250IGNvbG9yPSIjMDA5OTAwIj4mbHQ7aDMmZ3Q7UmVxdWVzdCBJbmZvcm1hdGlvbiBFeGFtcGxlJmx0Oy9oMyZndDs8L2ZvbnQ+JnF1b3Q7KTsKKyAgICAgICAgb3V0LnByaW50bG4oJnF1b3Q7PGZvbnQgY29sb3I9IiMwMDk5MDAiPk1ldGhvZDogPC9mb250PiZxdW90OyArIHJlcXVlc3QuZ2V0TWV0aG9kKCkpOworICAgICAgICBvdXQucHJpbnRsbigmcXVvdDs8Zm9udCBjb2xvcj0iIzAwOTkwMCI+UmVxdWVzdCBVUkk6IDwvZm9udD4mcXVvdDsgKyByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKSk7CisgICAgICAgIG91dC5wcmludGxuKCZxdW90Ozxmb250IGNvbG9yPSIjMDA5OTAwIj5Qcm90b2NvbDogPC9mb250PiZxdW90OyArIHJlcXVlc3QuZ2V0UHJvdG9jb2woKSk7CisgICAgICAgIG91dC5wcmludGxuKCZxdW90Ozxmb250IGNvbG9yPSIjMDA5OTAwIj5QYXRoSW5mbzogPC9mb250PiZxdW90OyArIHJlcXVlc3QuZ2V0UGF0aEluZm8oKSk7CisgICAgICAgIG91dC5wcmludGxuKCZxdW90Ozxmb250IGNvbG9yPSIjMDA5OTAwIj5SZW1vdGUgQWRkcmVzczogPC9mb250PiZxdW90OyArIHJlcXVlc3QuZ2V0UmVtb3RlQWRkcigpKTsKKyAgICAgICAgb3V0LnByaW50bG4oJnF1b3Q7PGZvbnQgY29sb3I9IiMwMDk5MDAiPiZsdDsvYm9keSZndDs8L2ZvbnQ+JnF1b3Q7KTsKKyAgICAgICAgb3V0LnByaW50bG4oJnF1b3Q7PGZvbnQgY29sb3I9IiMwMDk5MDAiPiZsdDsvaHRtbCZndDs8L2ZvbnQ+JnF1b3Q7KTsKKyAgICB9CisKKzxmb250IGNvbG9yPSIjRkYwMDAwIj4gICAgLyoqCisgICAgICogV2UgYXJlIGdvaW5nIHRvIHBlcmZvcm0gdGhlIHNhbWUgb3BlcmF0aW9ucyBmb3IgUE9TVCByZXF1ZXN0cworICAgICAqIGFzIGZvciBHRVQgbWV0aG9kcywgc28gdGhpcyBtZXRob2QganVzdCBzZW5kcyB0aGUgcmVxdWVzdCB0bworICAgICAqIHRoZSBkb0dldCBtZXRob2QuCisgICAgICovPC9mb250PgorCisgICAgPGZvbnQgY29sb3I9IiMwMDAwRkYiPnB1YmxpYyB2b2lkPC9mb250PiBkb1Bvc3QoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgPGZvbnQgY29sb3I9IiMwMDAwRkYiPnRocm93czwvZm9udD4gSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIGRvR2V0KHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICB9Cit9PC9wcmU+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1NC9leGFtcGxlcy9yZXFwYXJhbXMuaHRtbCBiL3NlcnZsZXRhcGkvanNyMTU0L2V4YW1wbGVzL3JlcXBhcmFtcy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4MWQ3YzcKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1NC9leGFtcGxlcy9yZXFwYXJhbXMuaHRtbApAQCAtMCwwICsxLDU1IEBACis8IS0tCisgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbD4KKzxoZWFkPgorPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorPC9oZWFkPgorCis8Ym9keSBiZ2NvbG9yPSIjRkZGRkZGIj4KKzxwPjxmb250IGNvbG9yPSIjMDAwMEZGIj48YSBocmVmPSJzZXJ2bGV0L1JlcXVlc3RQYXJhbUV4YW1wbGUiPjxpbWcgc3JjPSJpbWFnZXMvZXhlY3V0ZS5naWYiIGFsaWduPSJyaWdodCIgYm9yZGVyPSIwIj48L2E+PGEgaHJlZj0iaW5kZXguaHRtbCI+PGltZyBzcmM9ImltYWdlcy9yZXR1cm4uZ2lmIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIGFsaWduPSJyaWdodCIgYm9yZGVyPSIwIj48L2E+PC9mb250PjwvcD4KKzxoMz5Tb3VyY2UgQ29kZSBmb3IgUmVxdWVzdCBQYXJhbWV0ZXIgRXhhbXBsZTxmb250IGNvbG9yPSIjMDAwMEZGIj48YnI+CisgIDwvZm9udD4gPC9oMz4KKzxmb250IGNvbG9yPSIjMDAwMEZGIj48L2ZvbnQ+IAorPHByZT48Zm9udCBjb2xvcj0iIzAwMDBGRiI+aW1wb3J0PC9mb250PiBqYXZhLmlvLio7Cis8Zm9udCBjb2xvcj0iIzAwMDBGRiI+aW1wb3J0PC9mb250PiBqYXZhLnV0aWwuKjsKKzxmb250IGNvbG9yPSIjMDAwMEZGIj5pbXBvcnQ8L2ZvbnQ+IGphdmF4LnNlcnZsZXQuKjsKKzxmb250IGNvbG9yPSIjMDAwMEZGIj5pbXBvcnQ8L2ZvbnQ+IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCis8Zm9udCBjb2xvcj0iIzAwMDBGRiI+cHVibGljIGNsYXNzPC9mb250PiBSZXF1ZXN0UGFyYW1FeGFtcGxlIDxmb250IGNvbG9yPSIjMDAwMEZGIj5leHRlbmRzPC9mb250PiBIdHRwU2VydmxldCB7CisKKyAgICA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+cHVibGljIHZvaWQ8L2ZvbnQ+IGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQorICAgIDxmb250IGNvbG9yPSIjMDAwMEZGIj50aHJvd3M8L2ZvbnQ+IElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uCisgICAgeworICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgmcXVvdDs8Zm9udCBjb2xvcj0iIzAwOTkwMCI+dGV4dC9odG1sPC9mb250PiZxdW90Oyk7CisgICAgICAgIFByaW50V3JpdGVyIG91dCA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworICAgICAgICBvdXQucHJpbnRsbigmcXVvdDtHRVQgUmVxdWVzdC4gTm8gRm9ybSBEYXRhIFBvc3RlZCZxdW90Oyk7CisgICAgfQorCisgICAgPGZvbnQgY29sb3I9IiMwMDAwRkYiPnB1YmxpYyB2b2lkPC9mb250PiBkb1Bvc3QoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKQorICAgIDxmb250IGNvbG9yPSIjMDAwMEZGIj50aHJvd3M8L2ZvbnQ+IElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uCisgICAgeworICAgICAgICBFbnVtZXJhdGlvbiBlID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXJOYW1lcygpOworCVByaW50V3JpdGVyIG91dCA9IHJlcy5nZXRXcml0ZXIgKCk7CisgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpZS5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIobmFtZSk7CisgICAgICAgICAgICBvdXQucHJpbnRsbihuYW1lICsgJnF1b3Q7PGZvbnQgY29sb3I9IiMwMDk5MDAiPiA9IDwvZm9udD4mcXVvdDsgKyB2YWx1ZSk7CisgICAgICAgIH0KKyAgICB9Cit9PC9wcmU+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1NC9leGFtcGxlcy9zZXNzaW9ucy5odG1sIGIvc2VydmxldGFwaS9qc3IxNTQvZXhhbXBsZXMvc2Vzc2lvbnMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzlkNjg0Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTQvZXhhbXBsZXMvc2Vzc2lvbnMuaHRtbApAQCAtMCwwICsxLDY5IEBACis8IS0tCisgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbD4KKzxoZWFkPgorPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorPC9oZWFkPgorCis8Ym9keSBiZ2NvbG9yPSIjRkZGRkZGIj4KKzxwPjxmb250IGNvbG9yPSIjMDAwMEZGIj48YSBocmVmPSJzZXJ2bGV0L1Nlc3Npb25FeGFtcGxlIj48aW1nIHNyYz0iaW1hZ2VzL2V4ZWN1dGUuZ2lmIiBhbGlnbj0icmlnaHQiIGJvcmRlcj0iMCI+PC9hPjxhIGhyZWY9ImluZGV4Lmh0bWwiPjxpbWcgc3JjPSJpbWFnZXMvcmV0dXJuLmdpZiIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiBhbGlnbj0icmlnaHQiIGJvcmRlcj0iMCI+PC9hPjwvZm9udD48L3A+Cis8aDM+U291cmNlIENvZGUgZm9yIFNlc3Npb24gRXhhbXBsZTxmb250IGNvbG9yPSIjMDAwMEZGIj48YnI+CisgIDwvZm9udD4gPC9oMz4KKzxmb250IGNvbG9yPSIjMDAwMEZGIj48L2ZvbnQ+IAorPHByZT48Zm9udCBjb2xvcj0iIzAwMDBGRiI+aW1wb3J0PC9mb250PiBqYXZhLmlvLio7Cis8Zm9udCBjb2xvcj0iIzAwMDBGRiI+aW1wb3J0PC9mb250PiBqYXZhLnV0aWwuKjsKKzxmb250IGNvbG9yPSIjMDAwMEZGIj5pbXBvcnQ8L2ZvbnQ+IGphdmF4LnNlcnZsZXQuKjsKKzxmb250IGNvbG9yPSIjMDAwMEZGIj5pbXBvcnQ8L2ZvbnQ+IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCis8Zm9udCBjb2xvcj0iIzAwMDBGRiI+cHVibGljIGNsYXNzPC9mb250PiBTZXNzaW9uRXhhbXBsZSA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+ZXh0ZW5kczwvZm9udD4gSHR0cFNlcnZsZXQgeworCisgICAgPGZvbnQgY29sb3I9IiMwMDAwRkYiPnB1YmxpYyB2b2lkPC9mb250PiBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICA8Zm9udCBjb2xvcj0iIzAwMDBGRiI+dGhyb3dzPC9mb250PiBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoJnF1b3Q7PGZvbnQgY29sb3I9IiMwMDk5MDAiPnRleHQvaHRtbDwvZm9udD4mcXVvdDspOworICAgICAgICBQcmludFdyaXRlciBvdXQgPSByZXNwb25zZS5nZXRXcml0ZXIoKTsKKyAgICAgICAgCisgICAgICAgIEh0dHBTZXNzaW9uIHNlc3Npb24gPSByZXF1ZXN0LmdldFNlc3Npb24odHJ1ZSk7CisKKyAgICAgICAgPGZvbnQgY29sb3I9IiNDQzAwMDAiPi8vIHByaW50IHNlc3Npb24gaW5mbzwvZm9udD4KKworICAgICAgICBEYXRlIGNyZWF0ZWQgPSBuZXcgRGF0ZShzZXNzaW9uLmdldENyZWF0aW9uVGltZSgpKTsKKyAgICAgICAgRGF0ZSBhY2Nlc3NlZCA9IG5ldyBEYXRlKHNlc3Npb24uZ2V0TGFzdEFjY2Vzc2VkVGltZSgpKTsKKyAgICAgICAgb3V0LnByaW50bG4oJnF1b3Q7PGZvbnQgY29sb3I9IiMwMDk5MDAiPklEIDwvZm9udD4mcXVvdDsgKyBzZXNzaW9uLmdldElkKCkpOworICAgICAgICBvdXQucHJpbnRsbigmcXVvdDs8Zm9udCBjb2xvcj0iIzAwOTkwMCI+Q3JlYXRlZDogPC9mb250PiZxdW90OyArIGNyZWF0ZWQpOworICAgICAgICBvdXQucHJpbnRsbigmcXVvdDs8Zm9udCBjb2xvcj0iIzAwOTkwMCI+TGFzdCBBY2Nlc3NlZDogPC9mb250PiZxdW90OyArIGFjY2Vzc2VkKTsKKworICAgICAgICA8Zm9udCBjb2xvcj0iI0NDMDAwMCI+Ly8gc2V0IHNlc3Npb24gaW5mbyBpZiBuZWVkZWQ8L2ZvbnQ+CisKKyAgICAgICAgU3RyaW5nIGRhdGFOYW1lID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoJnF1b3Q7PGZvbnQgY29sb3I9IiMwMDk5MDAiPmRhdGFOYW1lPC9mb250PiZxdW90Oyk7CisgICAgICAgIGlmIChkYXRhTmFtZSAhPSBudWxsICZhbXA7JmFtcDsgZGF0YU5hbWUubGVuZ3RoKCkgJmd0OyAwKSB7CisgICAgICAgICAgICBTdHJpbmcgZGF0YVZhbHVlID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoJnF1b3Q7PGZvbnQgY29sb3I9IiMwMDk5MDAiPmRhdGFWYWx1ZTwvZm9udD4mcXVvdDspOworICAgICAgICAgICAgc2Vzc2lvbi5zZXRBdHRyaWJ1dGUoZGF0YU5hbWUsIGRhdGFWYWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBwcmludCBzZXNzaW9uIGNvbnRlbnRzCisKKyAgICAgICAgRW51bWVyYXRpb24gZSA9IHNlc3Npb24uZ2V0QXR0cmlidXRlTmFtZXMoKTsKKyAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZyllLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBzZXNzaW9uLmdldEF0dHJpYnV0ZShuYW1lKS50b1N0cmluZygpOworICAgICAgICAgICAgb3V0LnByaW50bG4obmFtZSArICZxdW90OyA8Zm9udCBjb2xvcj0iIzAwOTkwMCI+PSA8L2ZvbnQ+JnF1b3Q7ICsgdmFsdWUpOworICAgICAgICB9CisgICAgfQorfTwvcHJlPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTQvc3JjL2V0Yy9tYW5pZmVzdCBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9ldGMvbWFuaWZlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI1NzY5OAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9ldGMvbWFuaWZlc3QKQEAgLTAsMCArMSwxMCBAQAorTWFuaWZlc3QtdmVyc2lvbjogMS4wCisKK05hbWU6IGphdmF4L3NlcnZsZXQvCitTcGVjaWZpY2F0aW9uLVRpdGxlOiBKYXZhIEFQSSBmb3IgU2VydmxldHMKK1NwZWNpZmljYXRpb24tVmVyc2lvbjogMi40CitTcGVjaWZpY2F0aW9uLVZlbmRvcjogU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgorSW1wbGVtZW50YXRpb24tVGl0bGU6IGphdmF4LnNlcnZsZXQKK0ltcGxlbWVudGF0aW9uLVZlcnNpb246IDIuNC5AaW1wbGVtZW50YXRpb24ucmV2aXNpb25ACitJbXBsZW1lbnRhdGlvbi1WZW5kb3I6IEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9kdGQvWE1MU2NoZW1hLmR0ZCBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9kdGQvWE1MU2NoZW1hLmR0ZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjdkZGJlCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2R0ZC9YTUxTY2hlbWEuZHRkCkBAIC0wLDAgKzEsNDE3IEBACis8IS0tCisgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8IS0tIERURCBmb3IgWE1MIFNjaGVtYXM6IFBhcnQgMTogU3RydWN0dXJlcworICAgICBQdWJsaWMgSWRlbnRpZmllcjogIi0vL1czQy8vRFREIFhNTFNDSEVNQSAyMDAxMDIvL0VOIgorICAgICBPZmZpY2lhbCBMb2NhdGlvbjogaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEuZHRkIC0tPgorPCEtLSAkSWQkIC0tPgorPCEtLSBOb3RlIHRoaXMgRFREIGlzIE5PVCBub3JtYXRpdmUsIG9yIGV2ZW4gZGVmaW5pdGl2ZS4gLS0+ICAgICAgICAgICA8IS0tZC0tPgorPCEtLSBwcm9zZSBjb3B5IGluIHRoZSBzdHJ1Y3R1cmVzIFJFQyBpcyB0aGUgZGVmaW5pdGl2ZSB2ZXJzaW9uIC0tPiAgICA8IS0tZC0tPgorPCEtLSAod2hpY2ggc2hvdWxkbid0IGRpZmZlciBmcm9tIHRoaXMgb25lIGV4Y2VwdCBmb3IgdGhpcyAtLT4gICAgICAgICA8IS0tZC0tPgorPCEtLSBjb21tZW50IGFuZCBlbnRpdHkgZXhwYW5zaW9ucywgYnV0IGp1c3QgaW4gY2FzZSkgLS0+ICAgICAgICAgICAgICA8IS0tZC0tPgorPCEtLSBXaXRoIHRoZSBleGNlcHRpb24gb2YgY2FzZXMgd2l0aCBtdWx0aXBsZSBuYW1lc3BhY2UKKyAgICAgcHJlZml4ZXMgZm9yIHRoZSBYTUwgU2NoZW1hIG5hbWVzcGFjZSwgYW55IFhNTCBkb2N1bWVudCB3aGljaCBpcworICAgICBub3QgdmFsaWQgcGVyIHRoaXMgRFREIGdpdmVuIHJlZGVmaW5pdGlvbnMgaW4gaXRzIGludGVybmFsIHN1YnNldCBvZiB0aGUKKyAgICAgJ3AnIGFuZCAncycgcGFyYW1ldGVyIGVudGl0aWVzIGJlbG93IGFwcHJvcHJpYXRlIHRvIGl0cyBuYW1lc3BhY2UKKyAgICAgZGVjbGFyYXRpb24gb2YgdGhlIFhNTCBTY2hlbWEgbmFtZXNwYWNlIGlzIGFsbW9zdCBjZXJ0YWlubHkgbm90CisgICAgIGEgdmFsaWQgc2NoZW1hLiAtLT4KKworPCEtLSBUaGUgc2ltcGxlVHlwZSBlbGVtZW50IGFuZCBpdHMgY29uc3RpdHVlbnQgcGFydHMKKyAgICAgYXJlIGRlZmluZWQgaW4gWE1MIFNjaGVtYTogUGFydCAyOiBEYXRhdHlwZXMgLS0+Cis8IUVOVElUWSAlIHhzLWRhdGF0eXBlcyBQVUJMSUMgJ2RhdGF0eXBlcycgJ2RhdGF0eXBlcy5kdGQnID4KKworPCFFTlRJVFkgJSBwICd4czonPiA8IS0tIGNhbiBiZSBvdmVycmlkZW4gaW4gdGhlIGludGVybmFsIHN1YnNldCBvZiBhCisgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hIGRvY3VtZW50IHRvIGVzdGFibGlzaCBhIGRpZmZlcmVudAorICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBwcmVmaXggLS0+Cis8IUVOVElUWSAlIHMgJzp4cyc+IDwhLS0gaWYgJXAgaXMgZGVmaW5lZCAoZS5nLiBhcyBmb286KSB0aGVuIHlvdSBtdXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgYWxzbyBkZWZpbmUgJXMgYXMgdGhlIHN1ZmZpeCBmb3IgdGhlIGFwcHJvcHJpYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlIGRlY2xhcmF0aW9uIChlLmcuIDpmb28pIC0tPgorPCFFTlRJVFkgJSBuZHMgJ3htbG5zJXM7Jz4KKworPCEtLSBEZWZpbmUgYWxsIHRoZSBlbGVtZW50IG5hbWVzLCB3aXRoIG9wdGlvbmFsIHByZWZpeCAtLT4KKzwhRU5USVRZICUgc2NoZW1hICIlcDtzY2hlbWEiPgorPCFFTlRJVFkgJSBjb21wbGV4VHlwZSAiJXA7Y29tcGxleFR5cGUiPgorPCFFTlRJVFkgJSBjb21wbGV4Q29udGVudCAiJXA7Y29tcGxleENvbnRlbnQiPgorPCFFTlRJVFkgJSBzaW1wbGVDb250ZW50ICIlcDtzaW1wbGVDb250ZW50Ij4KKzwhRU5USVRZICUgZXh0ZW5zaW9uICIlcDtleHRlbnNpb24iPgorPCFFTlRJVFkgJSBlbGVtZW50ICIlcDtlbGVtZW50Ij4KKzwhRU5USVRZICUgdW5pcXVlICIlcDt1bmlxdWUiPgorPCFFTlRJVFkgJSBrZXkgIiVwO2tleSI+Cis8IUVOVElUWSAlIGtleXJlZiAiJXA7a2V5cmVmIj4KKzwhRU5USVRZICUgc2VsZWN0b3IgIiVwO3NlbGVjdG9yIj4KKzwhRU5USVRZICUgZmllbGQgIiVwO2ZpZWxkIj4KKzwhRU5USVRZICUgZ3JvdXAgIiVwO2dyb3VwIj4KKzwhRU5USVRZICUgYWxsICIlcDthbGwiPgorPCFFTlRJVFkgJSBjaG9pY2UgIiVwO2Nob2ljZSI+Cis8IUVOVElUWSAlIHNlcXVlbmNlICIlcDtzZXF1ZW5jZSI+Cis8IUVOVElUWSAlIGFueSAiJXA7YW55Ij4KKzwhRU5USVRZICUgYW55QXR0cmlidXRlICIlcDthbnlBdHRyaWJ1dGUiPgorPCFFTlRJVFkgJSBhdHRyaWJ1dGUgIiVwO2F0dHJpYnV0ZSI+Cis8IUVOVElUWSAlIGF0dHJpYnV0ZUdyb3VwICIlcDthdHRyaWJ1dGVHcm91cCI+Cis8IUVOVElUWSAlIGluY2x1ZGUgIiVwO2luY2x1ZGUiPgorPCFFTlRJVFkgJSBpbXBvcnQgIiVwO2ltcG9ydCI+Cis8IUVOVElUWSAlIHJlZGVmaW5lICIlcDtyZWRlZmluZSI+Cis8IUVOVElUWSAlIG5vdGF0aW9uICIlcDtub3RhdGlvbiI+CisKKzwhLS0gYW5ub3RhdGlvbiBlbGVtZW50cyAtLT4KKzwhRU5USVRZICUgYW5ub3RhdGlvbiAiJXA7YW5ub3RhdGlvbiI+Cis8IUVOVElUWSAlIGFwcGluZm8gIiVwO2FwcGluZm8iPgorPCFFTlRJVFkgJSBkb2N1bWVudGF0aW9uICIlcDtkb2N1bWVudGF0aW9uIj4KKworPCEtLSBDdXN0b21pc2F0aW9uIGVudGl0aWVzIGZvciB0aGUgQVRUTElTVCBvZiBlYWNoIGVsZW1lbnQgdHlwZS4KKyAgICAgRGVmaW5lIG9uZSBvZiB0aGVzZSBpZiB5b3VyIHNjaGVtYSB0YWtlcyBhZHZhbnRhZ2Ugb2YgdGhlCisgICAgIGFueUF0dHJpYnV0ZT0nIyNvdGhlcicgaW4gdGhlIHNjaGVtYSBmb3Igc2NoZW1hcyAtLT4KKworPCFFTlRJVFkgJSBzY2hlbWFBdHRycyAnJz4KKzwhRU5USVRZICUgY29tcGxleFR5cGVBdHRycyAnJz4KKzwhRU5USVRZICUgY29tcGxleENvbnRlbnRBdHRycyAnJz4KKzwhRU5USVRZICUgc2ltcGxlQ29udGVudEF0dHJzICcnPgorPCFFTlRJVFkgJSBleHRlbnNpb25BdHRycyAnJz4KKzwhRU5USVRZICUgZWxlbWVudEF0dHJzICcnPgorPCFFTlRJVFkgJSBncm91cEF0dHJzICcnPgorPCFFTlRJVFkgJSBhbGxBdHRycyAnJz4KKzwhRU5USVRZICUgY2hvaWNlQXR0cnMgJyc+Cis8IUVOVElUWSAlIHNlcXVlbmNlQXR0cnMgJyc+Cis8IUVOVElUWSAlIGFueUF0dHJzICcnPgorPCFFTlRJVFkgJSBhbnlBdHRyaWJ1dGVBdHRycyAnJz4KKzwhRU5USVRZICUgYXR0cmlidXRlQXR0cnMgJyc+Cis8IUVOVElUWSAlIGF0dHJpYnV0ZUdyb3VwQXR0cnMgJyc+Cis8IUVOVElUWSAlIHVuaXF1ZUF0dHJzICcnPgorPCFFTlRJVFkgJSBrZXlBdHRycyAnJz4KKzwhRU5USVRZICUga2V5cmVmQXR0cnMgJyc+Cis8IUVOVElUWSAlIHNlbGVjdG9yQXR0cnMgJyc+Cis8IUVOVElUWSAlIGZpZWxkQXR0cnMgJyc+Cis8IUVOVElUWSAlIGluY2x1ZGVBdHRycyAnJz4KKzwhRU5USVRZICUgaW1wb3J0QXR0cnMgJyc+Cis8IUVOVElUWSAlIHJlZGVmaW5lQXR0cnMgJyc+Cis8IUVOVElUWSAlIG5vdGF0aW9uQXR0cnMgJyc+Cis8IUVOVElUWSAlIGFubm90YXRpb25BdHRycyAnJz4KKzwhRU5USVRZICUgYXBwaW5mb0F0dHJzICcnPgorPCFFTlRJVFkgJSBkb2N1bWVudGF0aW9uQXR0cnMgJyc+CisKKzwhRU5USVRZICUgY29tcGxleERlcml2YXRpb25TZXQgIkNEQVRBIj4KKyAgICAgIDwhLS0gI2FsbCBvciBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBkcmF3biBmcm9tIGRlcml2YXRpb25DaG9pY2UgLS0+Cis8IUVOVElUWSAlIGJsb2NrU2V0ICJDREFUQSI+CisgICAgICA8IS0tICNhbGwgb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3QgZHJhd24gZnJvbQorICAgICAgICAgICAgICAgICAgICAgIGRlcml2YXRpb25DaG9pY2UgKyAnc3Vic3RpdHV0aW9uJyAtLT4KKworPCFFTlRJVFkgJSBtZ3MgJyVhbGw7IHwgJWNob2ljZTsgfCAlc2VxdWVuY2U7Jz4KKzwhRU5USVRZICUgY3MgJyVjaG9pY2U7IHwgJXNlcXVlbmNlOyc+Cis8IUVOVElUWSAlIGZvcm1WYWx1ZXMgJyhxdWFsaWZpZWR8dW5xdWFsaWZpZWQpJz4KKworCis8IUVOVElUWSAlIGF0dHJEZWNscyAgICAnKCglYXR0cmlidXRlO3wgJWF0dHJpYnV0ZUdyb3VwOykqLCglYW55QXR0cmlidXRlOyk/KSc+CisKKzwhRU5USVRZICUgcGFydGljbGVBbmRBdHRycyAnKCglbWdzOyB8ICVncm91cDspPywgJWF0dHJEZWNsczspJz4KKworPCEtLSBUaGlzIGlzIHVzZWQgaW4gcGFydDIgLS0+Cis8IUVOVElUWSAlIHJlc3RyaWN0aW9uMSAnKCglbWdzOyB8ICVncm91cDspPyknPgorCisleHMtZGF0YXR5cGVzOworCis8IS0tIHRoZSBkdXBsaWNhdGlvbiBiZWxvdyBpcyB0byBwcm9kdWNlIGFuIHVuYW1iaWd1b3VzIGNvbnRlbnQgbW9kZWwKKyAgICAgd2hpY2ggYWxsb3dzIGFubm90YXRpb24gZXZlcnl3aGVyZSAtLT4KKzwhRUxFTUVOVCAlc2NoZW1hOyAoKCVpbmNsdWRlOyB8ICVpbXBvcnQ7IHwgJXJlZGVmaW5lOyB8ICVhbm5vdGF0aW9uOykqLAorICAgICAgICAgICAgICAgICAgICAoKCVzaW1wbGVUeXBlOyB8ICVjb21wbGV4VHlwZTsKKyAgICAgICAgICAgICAgICAgICAgICB8ICVlbGVtZW50OyB8ICVhdHRyaWJ1dGU7CisgICAgICAgICAgICAgICAgICAgICAgfCAlYXR0cmlidXRlR3JvdXA7IHwgJWdyb3VwOworICAgICAgICAgICAgICAgICAgICAgIHwgJW5vdGF0aW9uOyApLAorICAgICAgICAgICAgICAgICAgICAgKCVhbm5vdGF0aW9uOykqKSogKT4KKzwhQVRUTElTVCAlc2NoZW1hOworICAgdGFyZ2V0TmFtZXNwYWNlICAgICAgJVVSSXJlZjsgICAgICAgICAgICAgICAjSU1QTElFRAorICAgdmVyc2lvbiAgICAgICAgICAgICAgQ0RBVEEgICAgICAgICAgICAgICAgICAjSU1QTElFRAorICAgJW5kczsgICAgICAgICAgICAgICAgJVVSSXJlZjsgICAgICAgICAgICAgICAjRklYRUQgJ2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJworICAgeG1sbnMgICAgICAgICAgICAgICAgQ0RBVEEgICAgICAgICAgICAgICAgICAjSU1QTElFRAorICAgZmluYWxEZWZhdWx0ICAgICAgICAgJWNvbXBsZXhEZXJpdmF0aW9uU2V0OyAnJworICAgYmxvY2tEZWZhdWx0ICAgICAgICAgJWJsb2NrU2V0OyAgICAgICAgICAgICAnJworICAgaWQgICAgICAgICAgICAgICAgICAgSUQgICAgICAgICAgICAgICAgICAgICAjSU1QTElFRAorICAgZWxlbWVudEZvcm1EZWZhdWx0ICAgJWZvcm1WYWx1ZXM7ICAgICAgICAgICAndW5xdWFsaWZpZWQnCisgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdCAlZm9ybVZhbHVlczsgICAgICAgICAgICd1bnF1YWxpZmllZCcKKyAgIHhtbDpsYW5nICAgICAgICAgICAgIENEQVRBICAgICAgICAgICAgICAgICAgI0lNUExJRUQKKyAgICVzY2hlbWFBdHRyczs+Cis8IS0tIE5vdGUgdGhlIHhtbG5zIGRlY2xhcmF0aW9uIGlzIE5PVCBpbiB0aGUgU2NoZW1hIGZvciBTY2hlbWFzLAorICAgICBiZWNhdXNlIGF0IHRoZSBJbmZvc2V0IGxldmVsIHdoZXJlIHNjaGVtYXMgb3BlcmF0ZSwKKyAgICAgeG1sbnMoOnByZWZpeCkgaXMgTk9UIGFuIGF0dHJpYnV0ZSEgLS0+Cis8IS0tIFRoZSBkZWNsYXJhdGlvbiBvZiB4bWxucyBpcyBhIGNvbnZlbmllbmNlIGZvciBzY2hlbWEgYXV0aG9ycyAtLT4KKyAKKzwhLS0gVGhlIGlkIGF0dHJpYnV0ZSBoZXJlIGFuZCBiZWxvdyBpcyBmb3IgdXNlIGluIGV4dGVybmFsIHJlZmVyZW5jZXMKKyAgICAgZnJvbSBub24tc2NoZW1hcyB1c2luZyBzaW1wbGUgZnJhZ21lbnQgaWRlbnRpZmllcnMuCisgICAgIEl0IGlzIE5PVCB1c2VkIGZvciBzY2hlbWEtdG8tc2NoZW1hIHJlZmVyZW5jZSwgaW50ZXJuYWwgb3IKKyAgICAgZXh0ZXJuYWwuIC0tPgorCis8IS0tIGEgdHlwZSBpcyBhIG5hbWVkIGNvbnRlbnQgdHlwZSBzcGVjaWZpY2F0aW9uIHdoaWNoIGFsbG93cyBhdHRyaWJ1dGUKKyAgICAgZGVjbGFyYXRpb25zLS0+Cis8IS0tIC0tPgorCis8IUVMRU1FTlQgJWNvbXBsZXhUeXBlOyAoKCVhbm5vdGF0aW9uOyk/LAorICAgICAgICAgICAgICAgICAgICAgICAgICglc2ltcGxlQ29udGVudDt8JWNvbXBsZXhDb250ZW50O3wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJXBhcnRpY2xlQW5kQXR0cnM7KSk+CisKKzwhQVRUTElTVCAlY29tcGxleFR5cGU7CisgICAgICAgICAgbmFtZSAgICAgICVOQ05hbWU7ICAgICAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKKyAgICAgICAgICBpZCAgICAgICAgSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjSU1QTElFRAorICAgICAgICAgIGFic3RyYWN0ICAlYm9vbGVhbjsgICAgICAgICAgICAgICAgICAgICAgICNJTVBMSUVECisgICAgICAgICAgZmluYWwgICAgICVjb21wbGV4RGVyaXZhdGlvblNldDsgICAgICAgICAgI0lNUExJRUQKKyAgICAgICAgICBibG9jayAgICAgJWNvbXBsZXhEZXJpdmF0aW9uU2V0OyAgICAgICAgICAjSU1QTElFRAorICAgICAgICAgIG1peGVkICh0cnVlfGZhbHNlKSAnZmFsc2UnCisgICAgICAgICAgJWNvbXBsZXhUeXBlQXR0cnM7PgorCis8IS0tIHBhcnRpY2xlQW5kQXR0cnMgaXMgc2hvcnRoYW5kIGZvciBhIHJvb3QgdHlwZSAtLT4KKzwhLS0gbWl4ZWQgaXMgZGlzYWxsb3dlZCBpZiBzaW1wbGVDb250ZW50LCBvdmVycmlkZW4gaWYgY29tcGxleENvbnRlbnQKKyAgICAgaGFzIG9uZSB0b28uIC0tPgorCis8IS0tIElmIGFueUF0dHJpYnV0ZSBhcHBlYXJzIGluIG9uZSBvciBtb3JlIHJlZmVyZW5jZWQgYXR0cmlidXRlR3JvdXBzCisgICAgIGFuZC9vciBleHBsaWNpdGx5LCB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoZSBwZXJtaXNzaW9ucyBpcyB1c2VkIC0tPgorCis8IUVMRU1FTlQgJWNvbXBsZXhDb250ZW50OyAoKCVhbm5vdGF0aW9uOyk/LCAoJXJlc3RyaWN0aW9uO3wlZXh0ZW5zaW9uOykpPgorPCFBVFRMSVNUICVjb21wbGV4Q29udGVudDsKKyAgICAgICAgICBtaXhlZCAodHJ1ZXxmYWxzZSkgI0lNUExJRUQKKyAgICAgICAgICBpZCAgICBJRCAgICAgICAgICAgI0lNUExJRUQKKyAgICAgICAgICAlY29tcGxleENvbnRlbnRBdHRyczs+CisKKzwhLS0gcmVzdHJpY3Rpb24gc2hvdWxkIHVzZSB0aGUgYnJhbmNoIGRlZmluZWQgYWJvdmUsIG5vdCB0aGUgc2ltcGxlCisgICAgIG9uZSBmcm9tIHBhcnQyOyBleHRlbnNpb24gc2hvdWxkIHVzZSB0aGUgZnVsbCBtb2RlbCAgLS0+CisKKzwhRUxFTUVOVCAlc2ltcGxlQ29udGVudDsgKCglYW5ub3RhdGlvbjspPywgKCVyZXN0cmljdGlvbjt8JWV4dGVuc2lvbjspKT4KKzwhQVRUTElTVCAlc2ltcGxlQ29udGVudDsKKyAgICAgICAgICBpZCAgICBJRCAgICAgICAgICAgI0lNUExJRUQKKyAgICAgICAgICAlc2ltcGxlQ29udGVudEF0dHJzOz4KKworPCEtLSByZXN0cmljdGlvbiBzaG91bGQgdXNlIHRoZSBzaW1wbGUgYnJhbmNoIGZyb20gcGFydDIsIG5vdCB0aGUgCisgICAgIG9uZSBkZWZpbmVkIGFib3ZlOyBleHRlbnNpb24gc2hvdWxkIGhhdmUgbm8gcGFydGljbGUgIC0tPgorCis8IUVMRU1FTlQgJWV4dGVuc2lvbjsgKCglYW5ub3RhdGlvbjspPywgKCVwYXJ0aWNsZUFuZEF0dHJzOykpPgorPCFBVFRMSVNUICVleHRlbnNpb247CisgICAgICAgICAgYmFzZSAgJVFOYW1lOyAgICAgICNSRVFVSVJFRAorICAgICAgICAgIGlkICAgIElEICAgICAgICAgICAjSU1QTElFRAorICAgICAgICAgICVleHRlbnNpb25BdHRyczs+CisKKzwhLS0gYW4gZWxlbWVudCBpcyBkZWNsYXJlZCBieSBlaXRoZXI6CisgYSBuYW1lIGFuZCBhIHR5cGUgKGVpdGhlciBuZXN0ZWQgb3IgcmVmZXJlbmNlZCB2aWEgdGhlIHR5cGUgYXR0cmlidXRlKQorIG9yIGEgcmVmIHRvIGFuIGV4aXN0aW5nIGVsZW1lbnQgZGVjbGFyYXRpb24gLS0+CisKKzwhRUxFTUVOVCAlZWxlbWVudDsgKCglYW5ub3RhdGlvbjspPywgKCVjb21wbGV4VHlwZTt8ICVzaW1wbGVUeXBlOyk/LAorICAgICAgICAgICAgICAgICAgICAgKCV1bmlxdWU7IHwgJWtleTsgfCAla2V5cmVmOykqKT4KKzwhLS0gc2ltcGxlVHlwZSBvciBjb21wbGV4VHlwZSBvbmx5IGlmIG5vIHR5cGV8cmVmIGF0dHJpYnV0ZSAtLT4KKzwhLS0gcmVmIG5vdCBhbGxvd2VkIGF0IHRvcCBsZXZlbCAtLT4KKzwhQVRUTElTVCAlZWxlbWVudDsKKyAgICAgICAgICAgIG5hbWUgICAgICAgICAgICAgICAlTkNOYW1lOyAgICAgICAgICAgICAgICNJTVBMSUVECisgICAgICAgICAgICBpZCAgICAgICAgICAgICAgICAgSUQgICAgICAgICAgICAgICAgICAgICAjSU1QTElFRAorICAgICAgICAgICAgcmVmICAgICAgICAgICAgICAgICVRTmFtZTsgICAgICAgICAgICAgICAgI0lNUExJRUQKKyAgICAgICAgICAgIHR5cGUgICAgICAgICAgICAgICAlUU5hbWU7ICAgICAgICAgICAgICAgICNJTVBMSUVECisgICAgICAgICAgICBtaW5PY2N1cnMgICAgICAgICAgJW5vbk5lZ2F0aXZlSW50ZWdlcjsgICAjSU1QTElFRAorICAgICAgICAgICAgbWF4T2NjdXJzICAgICAgICAgIENEQVRBICAgICAgICAgICAgICAgICAgI0lNUExJRUQKKyAgICAgICAgICAgIG5pbGxhYmxlICAgICAgICAgICAlYm9vbGVhbjsgICAgICAgICAgICAgICNJTVBMSUVECisgICAgICAgICAgICBzdWJzdGl0dXRpb25Hcm91cCAgJVFOYW1lOyAgICAgICAgICAgICAgICAjSU1QTElFRAorICAgICAgICAgICAgYWJzdHJhY3QgICAgICAgICAgICVib29sZWFuOyAgICAgICAgICAgICAgI0lNUExJRUQKKyAgICAgICAgICAgIGZpbmFsICAgICAgICAgICAgICAlY29tcGxleERlcml2YXRpb25TZXQ7ICNJTVBMSUVECisgICAgICAgICAgICBibG9jayAgICAgICAgICAgICAgJWJsb2NrU2V0OyAgICAgICAgICAgICAjSU1QTElFRAorICAgICAgICAgICAgZGVmYXVsdCAgICAgICAgICAgIENEQVRBICAgICAgICAgICAgICAgICAgI0lNUExJRUQKKyAgICAgICAgICAgIGZpeGVkICAgICAgICAgICAgICBDREFUQSAgICAgICAgICAgICAgICAgICNJTVBMSUVECisgICAgICAgICAgICBmb3JtICAgICAgICAgICAgICAgJWZvcm1WYWx1ZXM7ICAgICAgICAgICAjSU1QTElFRAorICAgICAgICAgICAgJWVsZW1lbnRBdHRyczs+Cis8IS0tIHR5cGUgYW5kIHJlZiBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLgorICAgICBuYW1lIGFuZCByZWYgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSwgb25lIGlzIHJlcXVpcmVkIC0tPgorPCEtLSBJbiB0aGUgYWJzZW5jZSBvZiB0eXBlIEFORCByZWYsIHR5cGUgZGVmYXVsdHMgdG8gdHlwZSBvZgorICAgICBzdWJzdGl0dXRpb25Hcm91cCwgaWYgYW55LCBlbHNlIHRoZSB1ci10eXBlLCBpLmUuIHVuY29uc3RyYWluZWQgLS0+Cis8IS0tIGRlZmF1bHQgYW5kIGZpeGVkIGFyZSBtdXR1YWxseSBleGNsdXNpdmUgLS0+CisKKzwhRUxFTUVOVCAlZ3JvdXA7ICgoJWFubm90YXRpb247KT8sKCVtZ3M7KT8pPgorPCFBVFRMSVNUICVncm91cDsgCisgICAgICAgICAgbmFtZSAgICAgICAgJU5DTmFtZTsgICAgICAgICAgICAgICAjSU1QTElFRAorICAgICAgICAgIHJlZiAgICAgICAgICVRTmFtZTsgICAgICAgICAgICAgICAgI0lNUExJRUQKKyAgICAgICAgICBtaW5PY2N1cnMgICAlbm9uTmVnYXRpdmVJbnRlZ2VyOyAgICNJTVBMSUVECisgICAgICAgICAgbWF4T2NjdXJzICAgQ0RBVEEgICAgICAgICAgICAgICAgICAjSU1QTElFRAorICAgICAgICAgIGlkICAgICAgICAgIElEICAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKKyAgICAgICAgICAlZ3JvdXBBdHRyczs+CisKKzwhRUxFTUVOVCAlYWxsOyAoKCVhbm5vdGF0aW9uOyk/LCAoJWVsZW1lbnQ7KSopPgorPCFBVFRMSVNUICVhbGw7CisgICAgICAgICAgbWluT2NjdXJzICAgKDEpICAgICAgICAgICAgICAgICAgICAjSU1QTElFRAorICAgICAgICAgIG1heE9jY3VycyAgICgxKSAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKKyAgICAgICAgICBpZCAgICAgICAgICBJRCAgICAgICAgICAgICAgICAgICAgICNJTVBMSUVECisgICAgICAgICAgJWFsbEF0dHJzOz4KKworPCFFTEVNRU5UICVjaG9pY2U7ICgoJWFubm90YXRpb247KT8sICglZWxlbWVudDt8ICVncm91cDt8ICVjczsgfCAlYW55OykqKT4KKzwhQVRUTElTVCAlY2hvaWNlOworICAgICAgICAgIG1pbk9jY3VycyAgICVub25OZWdhdGl2ZUludGVnZXI7ICAgI0lNUExJRUQKKyAgICAgICAgICBtYXhPY2N1cnMgICBDREFUQSAgICAgICAgICAgICAgICAgICNJTVBMSUVECisgICAgICAgICAgaWQgICAgICAgICAgSUQgICAgICAgICAgICAgICAgICAgICAjSU1QTElFRAorICAgICAgICAgICVjaG9pY2VBdHRyczs+CisKKzwhRUxFTUVOVCAlc2VxdWVuY2U7ICgoJWFubm90YXRpb247KT8sICglZWxlbWVudDt8ICVncm91cDt8ICVjczsgfCAlYW55OykqKT4KKzwhQVRUTElTVCAlc2VxdWVuY2U7CisgICAgICAgICAgbWluT2NjdXJzICAgJW5vbk5lZ2F0aXZlSW50ZWdlcjsgICAjSU1QTElFRAorICAgICAgICAgIG1heE9jY3VycyAgIENEQVRBICAgICAgICAgICAgICAgICAgI0lNUExJRUQKKyAgICAgICAgICBpZCAgICAgICAgICBJRCAgICAgICAgICAgICAgICAgICAgICNJTVBMSUVECisgICAgICAgICAgJXNlcXVlbmNlQXR0cnM7PgorCis8IS0tIGFuIGFub255bW91cyBncm91cGluZyBpbiBhIG1vZGVsLCBvcgorICAgICBhIHRvcC1sZXZlbCBuYW1lZCBncm91cCBkZWZpbml0aW9uLCBvciBhIHJlZmVyZW5jZSB0byBzYW1lIC0tPgorCis8IS0tIE5vdGUgdGhhdCBpZiBvcmRlciBpcyAnYWxsJywgZ3JvdXAgaXMgbm90IGFsbG93ZWQgaW5zaWRlLgorICAgICBJZiBvcmRlciBpcyAnYWxsJyBUSElTIGdyb3VwIG11c3QgYmUgYWxvbmUgKG9yIHJlZmVyZW5jZWQgYWxvbmUpIGF0CisgICAgIHRoZSB0b3AgbGV2ZWwgb2YgYSBjb250ZW50IG1vZGVsIC0tPgorPCEtLSBJZiBvcmRlciBpcyAnYWxsJywgbWluT2NjdXJzPT1tYXhPY2N1cnM9PTEgb24gZWxlbWVudC9hbnkgaW5zaWRlIC0tPgorPCEtLSBTaG91bGQgYWxsb3cgbWluT2NjdXJzPTAgaW5zaWRlIG9yZGVyPSdhbGwnIC4gLiAuIC0tPgorCis8IUVMRU1FTlQgJWFueTsgKCVhbm5vdGF0aW9uOyk/PgorPCFBVFRMSVNUICVhbnk7CisgICAgICAgICAgICBuYW1lc3BhY2UgICAgICAgQ0RBVEEgICAgICAgICAgICAgICAgICAnIyNhbnknCisgICAgICAgICAgICBwcm9jZXNzQ29udGVudHMgKHNraXB8bGF4fHN0cmljdCkgICAgICAnc3RyaWN0JworICAgICAgICAgICAgbWluT2NjdXJzICAgICAgICVub25OZWdhdGl2ZUludGVnZXI7ICAgJzEnCisgICAgICAgICAgICBtYXhPY2N1cnMgICAgICAgQ0RBVEEgICAgICAgICAgICAgICAgICAnMScKKyAgICAgICAgICAgIGlkICAgICAgICAgICAgICBJRCAgICAgICAgICAgICAgICAgICAgICNJTVBMSUVECisgICAgICAgICAgICAlYW55QXR0cnM7PgorCis8IS0tIG5hbWVzcGFjZSBpcyBpbnRlcnByZXRlZCBhcyBmb2xsb3dzOgorICAgICAgICAgICAgICAgICAgIyNhbnkgICAgICAtIC0gYW55IG5vbi1jb25mbGljdGluZyBXRlhNTCBhdCBhbGwKKworICAgICAgICAgICAgICAgICAgIyNvdGhlciAgICAtIC0gYW55IG5vbi1jb25mbGljdGluZyBXRlhNTCBmcm9tIG5hbWVzcGFjZSBvdGhlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYW4gdGFyZ2V0TmFtZXNwYWNlCisKKyAgICAgICAgICAgICAgICAgICMjbG9jYWwgICAgLSAtIGFueSB1bnF1YWxpZmllZCBub24tY29uZmxpY3RpbmcgV0ZYTUwvYXR0cmlidXRlCisgICAgICAgICAgICAgICAgICBvbmUgb3IgICAgIC0gLSBhbnkgbm9uLWNvbmZsaWN0aW5nIFdGWE1MIGZyb20KKyAgICAgICAgICAgICAgICAgIG1vcmUgVVJJICAgICAgICB0aGUgbGlzdGVkIG5hbWVzcGFjZXMKKyAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZXMKKworICAgICAgICAgICAgICAgICAgIyN0YXJnZXROYW1lc3BhY2UgIyNsb2NhbCBtYXkgYXBwZWFyIGluIHRoZSBhYm92ZSBsaXN0LAorICAgICAgICAgICAgICAgICAgICB3aXRoIHRoZSBvYnZpb3VzIG1lYW5pbmcgLS0+CisKKzwhRUxFTUVOVCAlYW55QXR0cmlidXRlOyAoJWFubm90YXRpb247KT8+Cis8IUFUVExJU1QgJWFueUF0dHJpYnV0ZTsKKyAgICAgICAgICAgIG5hbWVzcGFjZSAgICAgICBDREFUQSAgICAgICAgICAgICAgJyMjYW55JworICAgICAgICAgICAgcHJvY2Vzc0NvbnRlbnRzIChza2lwfGxheHxzdHJpY3QpICAnc3RyaWN0JworICAgICAgICAgICAgaWQgICAgICAgICAgICAgIElEICAgICAgICAgICAgICAgICAjSU1QTElFRAorICAgICAgICAgICAgJWFueUF0dHJpYnV0ZUF0dHJzOz4KKzwhLS0gbmFtZXNwYWNlIGlzIGludGVycHJldGVkIGFzIGZvciAnYW55JyBhYm92ZSAtLT4KKworPCEtLSBzaW1wbGVUeXBlIG9ubHkgaWYgbm8gdHlwZXxyZWYgYXR0cmlidXRlIC0tPgorPCEtLSByZWYgbm90IGFsbG93ZWQgYXQgdG9wIGxldmVsLCBuYW1lIGlmZiBhdCB0b3AgbGV2ZWwgLS0+Cis8IUVMRU1FTlQgJWF0dHJpYnV0ZTsgKCglYW5ub3RhdGlvbjspPywgKCVzaW1wbGVUeXBlOyk/KT4KKzwhQVRUTElTVCAlYXR0cmlidXRlOworICAgICAgICAgIG5hbWUgICAgICAlTkNOYW1lOyAgICAgICNJTVBMSUVECisgICAgICAgICAgaWQgICAgICAgIElEICAgICAgICAgICAgI0lNUExJRUQKKyAgICAgICAgICByZWYgICAgICAgJVFOYW1lOyAgICAgICAjSU1QTElFRAorICAgICAgICAgIHR5cGUgICAgICAlUU5hbWU7ICAgICAgICNJTVBMSUVECisgICAgICAgICAgdXNlICAgICAgIChwcm9oaWJpdGVkfG9wdGlvbmFsfHJlcXVpcmVkKSAjSU1QTElFRAorICAgICAgICAgIGRlZmF1bHQgICBDREFUQSAgICAgICAgICNJTVBMSUVECisgICAgICAgICAgZml4ZWQgICAgIENEQVRBICAgICAgICAgI0lNUExJRUQKKyAgICAgICAgICBmb3JtICAgICAgJWZvcm1WYWx1ZXM7ICAjSU1QTElFRAorICAgICAgICAgICVhdHRyaWJ1dGVBdHRyczs+Cis8IS0tIHR5cGUgYW5kIHJlZiBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLgorICAgICBuYW1lIGFuZCByZWYgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSwgb25lIGlzIHJlcXVpcmVkIC0tPgorPCEtLSBkZWZhdWx0IGZvciB1c2UgaXMgb3B0aW9uYWwgd2hlbiBuZXN0ZWQsIG5vbmUgb3RoZXJ3aXNlIC0tPgorPCEtLSBkZWZhdWx0IGFuZCBmaXhlZCBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlIC0tPgorPCEtLSB0eXBlIGF0dHIgYW5kIHNpbXBsZVR5cGUgY29udGVudCBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlIC0tPgorCis8IS0tIGFuIGF0dHJpYnV0ZUdyb3VwIGlzIGEgbmFtZWQgY29sbGVjdGlvbiBvZiBhdHRyaWJ1dGUgZGVjbHMsIG9yIGEKKyAgICAgcmVmZXJlbmNlIHRoZXJldG8gLS0+Cis8IUVMRU1FTlQgJWF0dHJpYnV0ZUdyb3VwOyAoKCVhbm5vdGF0aW9uOyk/LAorICAgICAgICAgICAgICAgICAgICAgICAoJWF0dHJpYnV0ZTsgfCAlYXR0cmlidXRlR3JvdXA7KSosCisgICAgICAgICAgICAgICAgICAgICAgICglYW55QXR0cmlidXRlOyk/KSA+Cis8IUFUVExJU1QgJWF0dHJpYnV0ZUdyb3VwOworICAgICAgICAgICAgICAgICBuYW1lICAgICAgICVOQ05hbWU7ICAgICAgICNJTVBMSUVECisgICAgICAgICAgICAgICAgIGlkICAgICAgICAgSUQgICAgICAgICAgICAgI0lNUExJRUQKKyAgICAgICAgICAgICAgICAgcmVmICAgICAgICAlUU5hbWU7ICAgICAgICAjSU1QTElFRAorICAgICAgICAgICAgICAgICAlYXR0cmlidXRlR3JvdXBBdHRyczs+CisKKzwhLS0gcmVmIGlmZiBubyBjb250ZW50LCBubyBuYW1lLiAgcmVmIGlmZiBub3QgdG9wIGxldmVsIC0tPgorCis8IS0tIGJldHRlciByZWZlcmVuY2UgbWVjaGFuaXNtcyAtLT4KKzwhRUxFTUVOVCAldW5pcXVlOyAoKCVhbm5vdGF0aW9uOyk/LCAlc2VsZWN0b3I7LCAoJWZpZWxkOykrKT4KKzwhQVRUTElTVCAldW5pcXVlOworICAgICAgICAgIG5hbWUgICAgICVOQ05hbWU7ICAgICAgICNSRVFVSVJFRAorCSAgaWQgICAgICAgSUQgICAgICAgICAgICAgI0lNUExJRUQKKwkgICV1bmlxdWVBdHRyczs+CisKKzwhRUxFTUVOVCAla2V5OyAgICAoKCVhbm5vdGF0aW9uOyk/LCAlc2VsZWN0b3I7LCAoJWZpZWxkOykrKT4KKzwhQVRUTElTVCAla2V5OworICAgICAgICAgIG5hbWUgICAgICVOQ05hbWU7ICAgICAgICNSRVFVSVJFRAorCSAgaWQgICAgICAgSUQgICAgICAgICAgICAgI0lNUExJRUQKKwkgICVrZXlBdHRyczs+CisKKzwhRUxFTUVOVCAla2V5cmVmOyAoKCVhbm5vdGF0aW9uOyk/LCAlc2VsZWN0b3I7LCAoJWZpZWxkOykrKT4KKzwhQVRUTElTVCAla2V5cmVmOworICAgICAgICAgIG5hbWUgICAgICVOQ05hbWU7ICAgICAgICNSRVFVSVJFRAorCSAgcmVmZXIgICAgJVFOYW1lOyAgICAgICAgI1JFUVVJUkVECisJICBpZCAgICAgICBJRCAgICAgICAgICAgICAjSU1QTElFRAorCSAgJWtleXJlZkF0dHJzOz4KKworPCFFTEVNRU5UICVzZWxlY3RvcjsgKCglYW5ub3RhdGlvbjspPyk+Cis8IUFUVExJU1QgJXNlbGVjdG9yOworICAgICAgICAgIHhwYXRoICVYUGF0aEV4cHI7ICNSRVFVSVJFRAorICAgICAgICAgIGlkICAgIElEICAgICAgICAgICNJTVBMSUVECisgICAgICAgICAgJXNlbGVjdG9yQXR0cnM7PgorPCFFTEVNRU5UICVmaWVsZDsgKCglYW5ub3RhdGlvbjspPyk+Cis8IUFUVExJU1QgJWZpZWxkOworICAgICAgICAgIHhwYXRoICVYUGF0aEV4cHI7ICNSRVFVSVJFRAorICAgICAgICAgIGlkICAgIElEICAgICAgICAgICNJTVBMSUVECisgICAgICAgICAgJWZpZWxkQXR0cnM7PgorCis8IS0tIFNjaGVtYSBjb21iaW5hdGlvbiBtZWNoYW5pc21zIC0tPgorPCFFTEVNRU5UICVpbmNsdWRlOyAoJWFubm90YXRpb247KT8+Cis8IUFUVExJU1QgJWluY2x1ZGU7CisgICAgICAgICAgc2NoZW1hTG9jYXRpb24gJVVSSXJlZjsgI1JFUVVJUkVECisgICAgICAgICAgaWQgICAgICAgICAgICAgSUQgICAgICAgI0lNUExJRUQKKyAgICAgICAgICAlaW5jbHVkZUF0dHJzOz4KKworPCFFTEVNRU5UICVpbXBvcnQ7ICglYW5ub3RhdGlvbjspPz4KKzwhQVRUTElTVCAlaW1wb3J0OworICAgICAgICAgIG5hbWVzcGFjZSAgICAgICVVUklyZWY7ICNJTVBMSUVECisgICAgICAgICAgc2NoZW1hTG9jYXRpb24gJVVSSXJlZjsgI0lNUExJRUQKKyAgICAgICAgICBpZCAgICAgICAgICAgICBJRCAgICAgICAjSU1QTElFRAorICAgICAgICAgICVpbXBvcnRBdHRyczs+CisKKzwhRUxFTUVOVCAlcmVkZWZpbmU7ICglYW5ub3RhdGlvbjsgfCAlc2ltcGxlVHlwZTsgfCAlY29tcGxleFR5cGU7IHwKKyAgICAgICAgICAgICAgICAgICAgICAlYXR0cmlidXRlR3JvdXA7IHwgJWdyb3VwOykqPgorPCFBVFRMSVNUICVyZWRlZmluZTsKKyAgICAgICAgICBzY2hlbWFMb2NhdGlvbiAlVVJJcmVmOyAjUkVRVUlSRUQKKyAgICAgICAgICBpZCAgICAgICAgICAgICBJRCAgICAgICAjSU1QTElFRAorICAgICAgICAgICVyZWRlZmluZUF0dHJzOz4KKworPCFFTEVNRU5UICVub3RhdGlvbjsgKCVhbm5vdGF0aW9uOyk/PgorPCFBVFRMSVNUICVub3RhdGlvbjsKKwkgIG5hbWUgICAgICAgICVOQ05hbWU7ICAgICNSRVFVSVJFRAorCSAgaWQgICAgICAgICAgSUQgICAgICAgICAgI0lNUExJRUQKKwkgIHB1YmxpYyAgICAgIENEQVRBICAgICAgICNSRVFVSVJFRAorCSAgc3lzdGVtICAgICAgJVVSSXJlZjsgICAgI0lNUExJRUQKKwkgICVub3RhdGlvbkF0dHJzOz4KKworPCEtLSBBbm5vdGF0aW9uIGlzIGVpdGhlciBhcHBsaWNhdGlvbiBpbmZvcm1hdGlvbiBvciBkb2N1bWVudGF0aW9uIC0tPgorPCEtLSBCeSBoYXZpbmcgdGhlc2UgaGVyZSB0aGV5IGFyZSBhdmFpbGFibGUgZm9yIGRhdGF0eXBlcyBhcyB3ZWxsCisgICAgIGFzIGFsbCB0aGUgc3RydWN0dXJlcyBlbGVtZW50cyAtLT4KKworPCFFTEVNRU5UICVhbm5vdGF0aW9uOyAoJWFwcGluZm87IHwgJWRvY3VtZW50YXRpb247KSo+Cis8IUFUVExJU1QgJWFubm90YXRpb247ICVhbm5vdGF0aW9uQXR0cnM7PgorCis8IS0tIFVzZXIgbXVzdCBkZWZpbmUgYW5ub3RhdGlvbiBlbGVtZW50cyBpbiBpbnRlcm5hbCBzdWJzZXQgZm9yIHRoaXMKKyAgICAgdG8gd29yayAtLT4KKzwhRUxFTUVOVCAlYXBwaW5mbzsgQU5ZPiAgIDwhLS0gdG9vIHJlc3RyaWN0aXZlIC0tPgorPCFBVFRMSVNUICVhcHBpbmZvOworICAgICAgICAgIHNvdXJjZSAgICAgJVVSSXJlZjsgICAgICAjSU1QTElFRAorICAgICAgICAgIGlkICAgICAgICAgSUQgICAgICAgICAjSU1QTElFRAorICAgICAgICAgICVhcHBpbmZvQXR0cnM7PgorPCFFTEVNRU5UICVkb2N1bWVudGF0aW9uOyBBTlk+ICAgPCEtLSB0b28gcmVzdHJpY3RpdmUgLS0+Cis8IUFUVExJU1QgJWRvY3VtZW50YXRpb247CisgICAgICAgICAgc291cmNlICAgICAlVVJJcmVmOyAgICNJTVBMSUVECisgICAgICAgICAgaWQgICAgICAgICBJRCAgICAgICAgICNJTVBMSUVECisgICAgICAgICAgeG1sOmxhbmcgICBDREFUQSAgICAgICNJTVBMSUVECisgICAgICAgICAgJWRvY3VtZW50YXRpb25BdHRyczs+CisKKzwhTk9UQVRJT04gWE1MU2NoZW1hU3RydWN0dXJlcyBQVUJMSUMKKyAgICAgICAgICAgJ3N0cnVjdHVyZXMnICdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS54c2QnID4KKzwhTk9UQVRJT04gWE1MIFBVQkxJQworICAgICAgICAgICAnUkVDLXhtbC0xOTk4LTAyMTAnICdodHRwOi8vd3d3LnczLm9yZy9UUi8xOTk4L1JFQy14bWwtMTk5ODAyMTAnID4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9kdGQvZGF0YXR5cGVzLmR0ZCBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9kdGQvZGF0YXR5cGVzLmR0ZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjdkMTg1Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2R0ZC9kYXRhdHlwZXMuZHRkCkBAIC0wLDAgKzEsMjE4IEBACis8IS0tCisgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8IS0tCisgICAgICAgIERURCBmb3IgWE1MIFNjaGVtYXM6IFBhcnQgMjogRGF0YXR5cGVzCisgICAgICAgICRJZCQKKyAgICAgICAgTm90ZSB0aGlzIERURCBpcyBOT1Qgbm9ybWF0aXZlLCBvciBldmVuIGRlZmluaXRpdmUuIC0gLSB0aGUKKyAgICAgICAgcHJvc2UgY29weSBpbiB0aGUgZGF0YXR5cGVzIFJFQyBpcyB0aGUgZGVmaW5pdGl2ZSB2ZXJzaW9uCisgICAgICAgICh3aGljaCBzaG91bGRuJ3QgZGlmZmVyIGZyb20gdGhpcyBvbmUgZXhjZXB0IGZvciB0aGlzIGNvbW1lbnQKKyAgICAgICAgYW5kIGVudGl0eSBleHBhbnNpb25zLCBidXQganVzdCBpbiBjYXNlKQorICAtLT4KKworPCEtLQorICAgICAgICBUaGlzIERURCBjYW5ub3QgYmUgdXNlZCBvbiBpdHMgb3duLCBpdCBpcyBpbnRlbmRlZAorICAgICAgICBvbmx5IGZvciBpbmNvcnBvcmF0aW9uIGluIFhNTFNjaGVtYS5kdGQsIHEudi4KKyAgLS0+CisKKzwhLS0gRGVmaW5lIGFsbCB0aGUgZWxlbWVudCBuYW1lcywgd2l0aCBvcHRpb25hbCBwcmVmaXggLS0+Cis8IUVOVElUWSAlIHNpbXBsZVR5cGUgIiVwO3NpbXBsZVR5cGUiPgorPCFFTlRJVFkgJSByZXN0cmljdGlvbiAiJXA7cmVzdHJpY3Rpb24iPgorPCFFTlRJVFkgJSBsaXN0ICIlcDtsaXN0Ij4KKzwhRU5USVRZICUgdW5pb24gIiVwO3VuaW9uIj4KKzwhRU5USVRZICUgbWF4RXhjbHVzaXZlICIlcDttYXhFeGNsdXNpdmUiPgorPCFFTlRJVFkgJSBtaW5FeGNsdXNpdmUgIiVwO21pbkV4Y2x1c2l2ZSI+Cis8IUVOVElUWSAlIG1heEluY2x1c2l2ZSAiJXA7bWF4SW5jbHVzaXZlIj4KKzwhRU5USVRZICUgbWluSW5jbHVzaXZlICIlcDttaW5JbmNsdXNpdmUiPgorPCFFTlRJVFkgJSB0b3RhbERpZ2l0cyAiJXA7dG90YWxEaWdpdHMiPgorPCFFTlRJVFkgJSBmcmFjdGlvbkRpZ2l0cyAiJXA7ZnJhY3Rpb25EaWdpdHMiPgorPCFFTlRJVFkgJSBsZW5ndGggIiVwO2xlbmd0aCI+Cis8IUVOVElUWSAlIG1pbkxlbmd0aCAiJXA7bWluTGVuZ3RoIj4KKzwhRU5USVRZICUgbWF4TGVuZ3RoICIlcDttYXhMZW5ndGgiPgorPCFFTlRJVFkgJSBlbnVtZXJhdGlvbiAiJXA7ZW51bWVyYXRpb24iPgorPCFFTlRJVFkgJSB3aGl0ZVNwYWNlICIlcDt3aGl0ZVNwYWNlIj4KKzwhRU5USVRZICUgcGF0dGVybiAiJXA7cGF0dGVybiI+CisKKzwhLS0KKyAgICAgICAgQ3VzdG9taXNhdGlvbiBlbnRpdGllcyBmb3IgdGhlIEFUVExJU1Qgb2YgZWFjaCBlbGVtZW50CisgICAgICAgIHR5cGUuIERlZmluZSBvbmUgb2YgdGhlc2UgaWYgeW91ciBzY2hlbWEgdGFrZXMgYWR2YW50YWdlCisgICAgICAgIG9mIHRoZSBhbnlBdHRyaWJ1dGU9JyMjb3RoZXInIGluIHRoZSBzY2hlbWEgZm9yIHNjaGVtYXMKKyAgLS0+CisKKzwhRU5USVRZICUgc2ltcGxlVHlwZUF0dHJzICIiPgorPCFFTlRJVFkgJSByZXN0cmljdGlvbkF0dHJzICIiPgorPCFFTlRJVFkgJSBsaXN0QXR0cnMgIiI+Cis8IUVOVElUWSAlIHVuaW9uQXR0cnMgIiI+Cis8IUVOVElUWSAlIG1heEV4Y2x1c2l2ZUF0dHJzICIiPgorPCFFTlRJVFkgJSBtaW5FeGNsdXNpdmVBdHRycyAiIj4KKzwhRU5USVRZICUgbWF4SW5jbHVzaXZlQXR0cnMgIiI+Cis8IUVOVElUWSAlIG1pbkluY2x1c2l2ZUF0dHJzICIiPgorPCFFTlRJVFkgJSB0b3RhbERpZ2l0c0F0dHJzICIiPgorPCFFTlRJVFkgJSBmcmFjdGlvbkRpZ2l0c0F0dHJzICIiPgorPCFFTlRJVFkgJSBsZW5ndGhBdHRycyAiIj4KKzwhRU5USVRZICUgbWluTGVuZ3RoQXR0cnMgIiI+Cis8IUVOVElUWSAlIG1heExlbmd0aEF0dHJzICIiPgorPCFFTlRJVFkgJSBlbnVtZXJhdGlvbkF0dHJzICIiPgorPCFFTlRJVFkgJSB3aGl0ZVNwYWNlQXR0cnMgIiI+Cis8IUVOVElUWSAlIHBhdHRlcm5BdHRycyAiIj4KKworPCEtLSBEZWZpbmUgc29tZSBlbnRpdGllcyBmb3IgaW5mb3JtYXRpdmUgdXNlIGFzIGF0dHJpYnV0ZQorICAgICAgICB0eXBlcyAtLT4KKzwhRU5USVRZICUgVVJJcmVmICJDREFUQSI+Cis8IUVOVElUWSAlIFhQYXRoRXhwciAiQ0RBVEEiPgorPCFFTlRJVFkgJSBRTmFtZSAiTk1UT0tFTiI+Cis8IUVOVElUWSAlIFFOYW1lcyAiTk1UT0tFTlMiPgorPCFFTlRJVFkgJSBOQ05hbWUgIk5NVE9LRU4iPgorPCFFTlRJVFkgJSBub25OZWdhdGl2ZUludGVnZXIgIk5NVE9LRU4iPgorPCFFTlRJVFkgJSBib29sZWFuICIodHJ1ZXxmYWxzZSkiPgorPCFFTlRJVFkgJSBzaW1wbGVEZXJpdmF0aW9uU2V0ICJDREFUQSI+Cis8IS0tCisgICAgICAgICNhbGwgb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3QgZHJhd24gZnJvbSBkZXJpdmF0aW9uQ2hvaWNlCisgIC0tPgorCis8IS0tCisgICAgICAgIE5vdGUgdGhhdCB0aGUgdXNlIG9mICdmYWNldCcgYmVsb3cgaXMgbGVzcyByZXN0cmljdGl2ZQorICAgICAgICB0aGFuIGlzIHJlYWxseSBpbnRlbmRlZDogIFRoZXJlIHNob3VsZCBpbiBmYWN0IGJlIG5vCisgICAgICAgIG1vcmUgdGhhbiBvbmUgb2YgZWFjaCBvZiBtaW5JbmNsdXNpdmUsIG1pbkV4Y2x1c2l2ZSwKKyAgICAgICAgbWF4SW5jbHVzaXZlLCBtYXhFeGNsdXNpdmUsIHRvdGFsRGlnaXRzLCBmcmFjdGlvbkRpZ2l0cywKKyAgICAgICAgbGVuZ3RoLCBtYXhMZW5ndGgsIG1pbkxlbmd0aCB3aXRoaW4gZGF0YXR5cGUsCisgICAgICAgIGFuZCB0aGUgbWluLSBhbmQgbWF4LSB2YXJpYW50cyBvZiBJbmNsdXNpdmUgYW5kIEV4Y2x1c2l2ZQorICAgICAgICBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLiBPbiB0aGUgb3RoZXIgaGFuZCwgIHBhdHRlcm4gYW5kCisgICAgICAgIGVudW1lcmF0aW9uIG1heSByZXBlYXQuCisgIC0tPgorPCFFTlRJVFkgJSBtaW5Cb3VuZCAiKCVtaW5JbmNsdXNpdmU7IHwgJW1pbkV4Y2x1c2l2ZTspIj4KKzwhRU5USVRZICUgbWF4Qm91bmQgIiglbWF4SW5jbHVzaXZlOyB8ICVtYXhFeGNsdXNpdmU7KSI+Cis8IUVOVElUWSAlIGJvdW5kcyAiJW1pbkJvdW5kOyB8ICVtYXhCb3VuZDsiPgorPCFFTlRJVFkgJSBudW1lcmljICIldG90YWxEaWdpdHM7IHwgJWZyYWN0aW9uRGlnaXRzOyI+Cis8IUVOVElUWSAlIG9yZGVyZWQgIiVib3VuZHM7IHwgJW51bWVyaWM7Ij4KKzwhRU5USVRZICUgdW5vcmRlcmVkCisgICAiJXBhdHRlcm47IHwgJWVudW1lcmF0aW9uOyB8ICV3aGl0ZVNwYWNlOyB8ICVsZW5ndGg7IHwKKyAgICVtYXhMZW5ndGg7IHwgJW1pbkxlbmd0aDsiPgorPCFFTlRJVFkgJSBmYWNldCAiJW9yZGVyZWQ7IHwgJXVub3JkZXJlZDsiPgorPCFFTlRJVFkgJSBmYWNldEF0dHIgCisgICAgICAgICJ2YWx1ZSBDREFUQSAjUkVRVUlSRUQKKyAgICAgICAgaWQgSUQgI0lNUExJRUQiPgorPCFFTlRJVFkgJSBmaXhlZEF0dHIgImZpeGVkICVib29sZWFuOyAjSU1QTElFRCI+Cis8IUVOVElUWSAlIGZhY2V0TW9kZWwgIiglYW5ub3RhdGlvbjspPyI+Cis8IUVMRU1FTlQgJXNpbXBsZVR5cGU7CisgICAgICAgICgoJWFubm90YXRpb247KT8sICglcmVzdHJpY3Rpb247IHwgJWxpc3Q7IHwgJXVuaW9uOykpPgorPCFBVFRMSVNUICVzaW1wbGVUeXBlOworICAgIG5hbWUgICAgICAlTkNOYW1lOyAjSU1QTElFRAorICAgIGZpbmFsICAgICAlc2ltcGxlRGVyaXZhdGlvblNldDsgI0lNUExJRUQKKyAgICBpZCAgICAgICAgSUQgICAgICAgI0lNUExJRUQKKyAgICAlc2ltcGxlVHlwZUF0dHJzOz4KKzwhLS0gbmFtZSBpcyByZXF1aXJlZCBhdCB0b3AgbGV2ZWwgLS0+Cis8IUVMRU1FTlQgJXJlc3RyaWN0aW9uOyAoKCVhbm5vdGF0aW9uOyk/LAorICAgICAgICAgICAgICAgICAgICAgICAgICglcmVzdHJpY3Rpb24xOyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICgoJXNpbXBsZVR5cGU7KT8sKCVmYWNldDspKikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICglYXR0ckRlY2xzOykpPgorPCFBVFRMSVNUICVyZXN0cmljdGlvbjsKKyAgICBiYXNlICAgICAgJVFOYW1lOyAgICAgICAgICAgICAgICAgICNJTVBMSUVECisgICAgaWQgICAgICAgIElEICAgICAgICNJTVBMSUVECisgICAgJXJlc3RyaWN0aW9uQXR0cnM7PgorPCEtLQorICAgICAgICBiYXNlIGFuZCBzaW1wbGVUeXBlIGNoaWxkIGFyZSBtdXR1YWxseSBleGNsdXNpdmUsCisgICAgICAgIG9uZSBpcyByZXF1aXJlZC4KKworICAgICAgICByZXN0cmljdGlvbiBpcyBzaGFyZWQgYmV0d2VlbiBzaW1wbGVUeXBlIGFuZAorICAgICAgICBzaW1wbGVDb250ZW50IGFuZCBjb21wbGV4Q29udGVudCAoaW4gWE1MU2NoZW1hLnhzZCkuCisgICAgICAgIHJlc3RyaWN0aW9uMSBpcyBmb3IgdGhlIGxhdHRlciBjYXNlcywgd2hlbiB0aGlzCisgICAgICAgIGlzIHJlc3RyaWN0aW5nIGEgY29tcGxleCB0eXBlLCBhcyBpcyBhdHRyRGVjbHMuCisgIC0tPgorPCFFTEVNRU5UICVsaXN0OyAoKCVhbm5vdGF0aW9uOyk/LCglc2ltcGxlVHlwZTspPyk+Cis8IUFUVExJU1QgJWxpc3Q7CisgICAgaXRlbVR5cGUgICAgICAlUU5hbWU7ICAgICAgICAgICAgICNJTVBMSUVECisgICAgaWQgICAgICAgIElEICAgICAgICNJTVBMSUVECisgICAgJWxpc3RBdHRyczs+Cis8IS0tCisgICAgICAgIGl0ZW1UeXBlIGFuZCBzaW1wbGVUeXBlIGNoaWxkIGFyZSBtdXR1YWxseSBleGNsdXNpdmUsCisgICAgICAgIG9uZSBpcyByZXF1aXJlZAorICAtLT4KKzwhRUxFTUVOVCAldW5pb247ICgoJWFubm90YXRpb247KT8sKCVzaW1wbGVUeXBlOykqKT4KKzwhQVRUTElTVCAldW5pb247CisgICAgaWQgICAgICAgICAgICBJRCAgICAgICAjSU1QTElFRAorICAgIG1lbWJlclR5cGVzICAgJVFOYW1lczsgICAgICAgICAgICAjSU1QTElFRAorICAgICV1bmlvbkF0dHJzOz4KKzwhLS0KKyAgICAgICAgQXQgbGVhc3Qgb25lIGl0ZW0gaW4gbWVtYmVyVHlwZXMgb3Igb25lIHNpbXBsZVR5cGUKKyAgICAgICAgY2hpbGQgaXMgcmVxdWlyZWQKKyAgLS0+CisKKzwhRUxFTUVOVCAlbWF4RXhjbHVzaXZlOyAlZmFjZXRNb2RlbDs+Cis8IUFUVExJU1QgJW1heEV4Y2x1c2l2ZTsKKyAgICAgICAgJWZhY2V0QXR0cjsKKyAgICAgICAgJWZpeGVkQXR0cjsKKyAgICAgICAgJW1heEV4Y2x1c2l2ZUF0dHJzOz4KKzwhRUxFTUVOVCAlbWluRXhjbHVzaXZlOyAlZmFjZXRNb2RlbDs+Cis8IUFUVExJU1QgJW1pbkV4Y2x1c2l2ZTsKKyAgICAgICAgJWZhY2V0QXR0cjsKKyAgICAgICAgJWZpeGVkQXR0cjsKKyAgICAgICAgJW1pbkV4Y2x1c2l2ZUF0dHJzOz4KKworPCFFTEVNRU5UICVtYXhJbmNsdXNpdmU7ICVmYWNldE1vZGVsOz4KKzwhQVRUTElTVCAlbWF4SW5jbHVzaXZlOworICAgICAgICAlZmFjZXRBdHRyOworICAgICAgICAlZml4ZWRBdHRyOworICAgICAgICAlbWF4SW5jbHVzaXZlQXR0cnM7PgorPCFFTEVNRU5UICVtaW5JbmNsdXNpdmU7ICVmYWNldE1vZGVsOz4KKzwhQVRUTElTVCAlbWluSW5jbHVzaXZlOworICAgICAgICAlZmFjZXRBdHRyOworICAgICAgICAlZml4ZWRBdHRyOworICAgICAgICAlbWluSW5jbHVzaXZlQXR0cnM7PgorCis8IUVMRU1FTlQgJXRvdGFsRGlnaXRzOyAlZmFjZXRNb2RlbDs+Cis8IUFUVExJU1QgJXRvdGFsRGlnaXRzOworICAgICAgICAlZmFjZXRBdHRyOworICAgICAgICAlZml4ZWRBdHRyOworICAgICAgICAldG90YWxEaWdpdHNBdHRyczs+Cis8IUVMRU1FTlQgJWZyYWN0aW9uRGlnaXRzOyAlZmFjZXRNb2RlbDs+Cis8IUFUVExJU1QgJWZyYWN0aW9uRGlnaXRzOworICAgICAgICAlZmFjZXRBdHRyOworICAgICAgICAlZml4ZWRBdHRyOworICAgICAgICAlZnJhY3Rpb25EaWdpdHNBdHRyczs+CisKKzwhRUxFTUVOVCAlbGVuZ3RoOyAlZmFjZXRNb2RlbDs+Cis8IUFUVExJU1QgJWxlbmd0aDsKKyAgICAgICAgJWZhY2V0QXR0cjsKKyAgICAgICAgJWZpeGVkQXR0cjsKKyAgICAgICAgJWxlbmd0aEF0dHJzOz4KKzwhRUxFTUVOVCAlbWluTGVuZ3RoOyAlZmFjZXRNb2RlbDs+Cis8IUFUVExJU1QgJW1pbkxlbmd0aDsKKyAgICAgICAgJWZhY2V0QXR0cjsKKyAgICAgICAgJWZpeGVkQXR0cjsKKyAgICAgICAgJW1pbkxlbmd0aEF0dHJzOz4KKzwhRUxFTUVOVCAlbWF4TGVuZ3RoOyAlZmFjZXRNb2RlbDs+Cis8IUFUVExJU1QgJW1heExlbmd0aDsKKyAgICAgICAgJWZhY2V0QXR0cjsKKyAgICAgICAgJWZpeGVkQXR0cjsKKyAgICAgICAgJW1heExlbmd0aEF0dHJzOz4KKworPCEtLSBUaGlzIG9uZSBjYW4gYmUgcmVwZWF0ZWQgLS0+Cis8IUVMRU1FTlQgJWVudW1lcmF0aW9uOyAlZmFjZXRNb2RlbDs+Cis8IUFUVExJU1QgJWVudW1lcmF0aW9uOworICAgICAgICAlZmFjZXRBdHRyOworICAgICAgICAlZW51bWVyYXRpb25BdHRyczs+CisKKzwhRUxFTUVOVCAld2hpdGVTcGFjZTsgJWZhY2V0TW9kZWw7PgorPCFBVFRMSVNUICV3aGl0ZVNwYWNlOworICAgICAgICAlZmFjZXRBdHRyOworICAgICAgICAlZml4ZWRBdHRyOworICAgICAgICAld2hpdGVTcGFjZUF0dHJzOz4KKworPCEtLSBUaGlzIG9uZSBjYW4gYmUgcmVwZWF0ZWQgLS0+Cis8IUVMRU1FTlQgJXBhdHRlcm47ICVmYWNldE1vZGVsOz4KKzwhQVRUTElTVCAlcGF0dGVybjsKKyAgICAgICAgJWZhY2V0QXR0cjsKKyAgICAgICAgJXBhdHRlcm5BdHRyczs+CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvZHRkL2oyZWVfMV80LnhzZCBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9kdGQvajJlZV8xXzQueHNkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmOWYyZWIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvZHRkL2oyZWVfMV80LnhzZApAQCAtMCwwICsxLDE2MjEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8eHNkOnNjaGVtYQorICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCisgICAgIHhtbG5zOmoyZWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCisgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCisgICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgorICAgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCisgICAgIHZlcnNpb249IjEuNCI+CisgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOmRvY3VtZW50YXRpb24+CisgICAgICBAKCMpajJlZV8xXzQueHNkcwkxLjQzIDAzLzA5LzE2CisgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgPC94c2Q6YW5ub3RhdGlvbj4KKworICA8eHNkOmFubm90YXRpb24+CisgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICBDb3B5cmlnaHQgMjAwMiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA5MDEgU2FuIEFudG9uaW8KKyAgICAgIFJvYWQsIFBhbG8gQWx0bywgQ2FsaWZvcm5pYSA5NDMwMywgVS5TLkEuIEFsbCByaWdodHMKKyAgICAgIHJlc2VydmVkLgorCisgICAgICBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGhhcyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCisgICAgICByZWxhdGluZyB0byB0ZWNobm9sb2d5IGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LiBJbgorICAgICAgcGFydGljdWxhciwgYW5kIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlc2UgaW50ZWxsZWN0dWFsCisgICAgICBwcm9wZXJ0eSByaWdodHMgbWF5IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIFUuUy4gcGF0ZW50cworICAgICAgbGlzdGVkIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGFuZCBvbmUgb3IgbW9yZQorICAgICAgYWRkaXRpb25hbCBwYXRlbnRzIG9yIHBlbmRpbmcgcGF0ZW50IGFwcGxpY2F0aW9ucyBpbiB0aGUKKyAgICAgIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KKworICAgICAgVGhpcyBkb2N1bWVudCBhbmQgdGhlIHRlY2hub2xvZ3kgd2hpY2ggaXQgZGVzY3JpYmVzIGFyZQorICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgdGhlaXIgdXNlLCBjb3B5aW5nLAorICAgICAgZGlzdHJpYnV0aW9uLCBhbmQgZGVjb21waWxhdGlvbi4gTm8gcGFydCBvZiB0aGlzIGRvY3VtZW50CisgICAgICBtYXkgYmUgcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvcgorICAgICAgd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LgorCisgICAgICBUaGlyZC1wYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMKKyAgICAgIGNvcHlyaWdodGVkIGFuZCBsaWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuCisKKyAgICAgIFN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBsb2dvLCBTb2xhcmlzLCBKYXZhLCBKMkVFLAorICAgICAgSmF2YVNlcnZlciBQYWdlcywgRW50ZXJwcmlzZSBKYXZhQmVhbnMgYW5kIHRoZSBKYXZhIENvZmZlZQorICAgICAgQ3VwIGxvZ28gYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1bgorICAgICAgTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCisKKyAgICAgIEZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycworICAgICAgU3ViamVjdCB0byBTdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgorCisgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgPC94c2Q6YW5ub3RhdGlvbj4KKzx4c2Q6YW5ub3RhdGlvbj4KKzx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworVGhlIGZvbGxvd2luZyBkZWZpbml0aW9ucyB0aGF0IGFwcGVhciBpbiB0aGUgY29tbW9uCitzaGFyZWFibGUgc2NoZW1hKHMpIG9mIEoyRUUgZGVwbG95bWVudCBkZXNjcmlwdG9ycyBzaG91bGQgYmUKK2ludGVycHJldGVkIHdpdGggcmVzcGVjdCB0byB0aGUgY29udGV4dCB0aGV5IGFyZSBpbmNsdWRlZDoKKworRGVwbG95bWVudCBDb21wb25lbnQgbWF5IGluZGljYXRlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorICAgIGoyZWUgYXBwbGljYXRpb247CisgICAgYXBwbGljYXRpb24gY2xpZW50OworICAgIHdlYiBhcHBsaWNhdGlvbjsKKyAgICBlbnRlcnByaXNlIGJlYW47CisgICAgcmVzb3VyY2UgYWRhcHRlcjsKKworRGVwbG95bWVudCBGaWxlIG1heSBpbmRpY2F0ZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKyAgICBlYXIgZmlsZTsKKyAgICB3YXIgZmlsZTsKKyAgICBqYXIgZmlsZTsKKyAgICByYXIgZmlsZTsKKworPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKzwveHNkOmFubm90YXRpb24+CisKKyAgPHhzZDppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiCisJICAgICAgc2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cudzMub3JnLzIwMDEveG1sLnhzZCIvPgorCisgIDx4c2Q6aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0KKwkiaHR0cDovL3d3dy5pYm0uY29tL3dlYnNlcnZpY2VzL3hzZC9qMmVlX3dlYl9zZXJ2aWNlc19jbGllbnRfMV8xLnhzZCIvPgorCisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmdyb3VwIG5hbWU9ImRlc2NyaXB0aW9uR3JvdXAiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCVRoaXMgZ3JvdXAga2VlcHMgdGhlIHVzYWdlIG9mIHRoZSBjb250YWluZWQgZGVzY3JpcHRpb24gcmVsYXRlZAorCWVsZW1lbnRzIGNvbnNpc3RlbnQgYWNyb3NzIEoyRUUgZGVwbG95bWVudCBkZXNjcmlwdG9ycy4KKworCUFsbCBlbGVtZW50cyBtYXkgb2NjdXIgbXVsdGlwbGUgdGltZXMgd2l0aCBkaWZmZXJlbnQgbGFuZ3VhZ2VzLAorCXRvIHN1cHBvcnQgbG9jYWxpemF0aW9uIG9mIHRoZSBjb250ZW50LgorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKKwkJICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCIKKwkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNwbGF5LW5hbWUiCisJCSAgIHR5cGU9ImoyZWU6ZGlzcGxheS1uYW1lVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIgorCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imljb24iCisJCSAgIHR5cGU9ImoyZWU6aWNvblR5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCIKKwkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgPC94c2Q6Z3JvdXA+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRlc2NyaXB0aW9uVHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJVGhlIGRlc2NyaXB0aW9uIHR5cGUgaXMgdXNlZCBieSBhIGRlc2NyaXB0aW9uIGVsZW1lbnQgdG8KKwlwcm92aWRlIHRleHQgZGVzY3JpYmluZyB0aGUgcGFyZW50IGVsZW1lbnQuICBUaGUgZWxlbWVudHMKKwl0aGF0IHVzZSB0aGlzIHR5cGUgc2hvdWxkIGluY2x1ZGUgYW55IGluZm9ybWF0aW9uIHRoYXQgdGhlCisJRGVwbG95bWVudCBDb21wb25lbnQncyBEZXBsb3ltZW50IEZpbGUgZmlsZSBwcm9kdWNlciB3YW50cworCXRvIHByb3ZpZGUgdG8gdGhlIGNvbnN1bWVyIG9mIHRoZSBEZXBsb3ltZW50IENvbXBvbmVudCdzCisJRGVwbG95bWVudCBGaWxlIChpLmUuLCB0byB0aGUgRGVwbG95ZXIpLiBUeXBpY2FsbHksIHRoZQorCXRvb2xzIHVzZWQgYnkgc3VjaCBhIERlcGxveW1lbnQgRmlsZSBjb25zdW1lciB3aWxsIGRpc3BsYXkKKwl0aGUgZGVzY3JpcHRpb24gd2hlbiBwcm9jZXNzaW5nIHRoZSBwYXJlbnQgZWxlbWVudCB0aGF0CisJY29udGFpbnMgdGhlIGRlc2NyaXB0aW9uLgorCisJVGhlIGxhbmcgYXR0cmlidXRlIGRlZmluZXMgdGhlIGxhbmd1YWdlIHRoYXQgdGhlCisJZGVzY3JpcHRpb24gaXMgcHJvdmlkZWQgaW4uIFRoZSBkZWZhdWx0IHZhbHVlIGlzICJlbiIgKEVuZ2xpc2gpLgorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzaW1wbGVDb250ZW50PgorICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iajJlZTp4c2RTdHJpbmdUeXBlIj4KKwk8eHNkOmF0dHJpYnV0ZSByZWY9InhtbDpsYW5nIi8+CisgICAgICA8L3hzZDpleHRlbnNpb24+CisgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZGV3ZXktdmVyc2lvblR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCVRoaXMgdHlwZSBkZWZpbmVzIGEgZGV3ZXkgZGVjaW1hbCB3aGljaCBpcyB1c2VkCisJdG8gZGVzY3JpYmUgdmVyc2lvbnMgb2YgZG9jdW1lbnRzLgorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisKKyAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpkZWNpbWFsIj4KKyAgICAgIDx4c2Q6d2hpdGVTcGFjZSB2YWx1ZT0iY29sbGFwc2UiLz4KKyAgICA8L3hzZDpyZXN0cmljdGlvbj4KKworICA8L3hzZDpzaW1wbGVUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkaXNwbGF5LW5hbWVUeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisJPCFbQ0RBVEFbCisKKwkgIFRoZSBkaXNwbGF5LW5hbWUgdHlwZSBjb250YWlucyBhIHNob3J0IG5hbWUgdGhhdCBpcyBpbnRlbmRlZAorCSAgdG8gYmUgZGlzcGxheWVkIGJ5IHRvb2xzLiBJdCBpcyB1c2VkIGJ5IGRpc3BsYXktbmFtZQorCSAgZWxlbWVudHMuICBUaGUgZGlzcGxheSBuYW1lIG5lZWQgbm90IGJlIHVuaXF1ZS4KKworCSAgRXhhbXBsZToKKworCSAgLi4uCisJICAgICA8ZGlzcGxheS1uYW1lIHhtbDpsYW5nPSJlbiI+RW1wbG95ZWUgU2VsZiBTZXJ2aWNlPC9kaXNwbGF5LW5hbWU+CisKKwkgIFRoZSB2YWx1ZSBvZiB0aGUgeG1sOmxhbmcgYXR0cmlidXRlIGlzICJlbiIgKEVuZ2xpc2gpIGJ5IGRlZmF1bHQuCisKKwkgIF1dPgorICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KKwk8eHNkOmF0dHJpYnV0ZSByZWY9InhtbDpsYW5nIi8+CisgICAgICA8L3hzZDpleHRlbnNpb24+CisgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVqYi1saW5rVHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCTwhW0NEQVRBWworCisJICBUaGUgZWpiLWxpbmtUeXBlIGlzIHVzZWQgYnkgZWpiLWxpbmsKKwkgIGVsZW1lbnRzIGluIHRoZSBlamItcmVmIG9yIGVqYi1sb2NhbC1yZWYgZWxlbWVudHMgdG8gc3BlY2lmeQorCSAgdGhhdCBhbiBFSkIgcmVmZXJlbmNlIGlzIGxpbmtlZCB0byBlbnRlcnByaXNlIGJlYW4uCisKKwkgIFRoZSB2YWx1ZSBvZiB0aGUgZWpiLWxpbmsgZWxlbWVudCBtdXN0IGJlIHRoZSBlamItbmFtZSBvZiBhbgorCSAgZW50ZXJwcmlzZSBiZWFuIGluIHRoZSBzYW1lIGVqYi1qYXIgZmlsZSBvciBpbiBhbm90aGVyIGVqYi1qYXIKKwkgIGZpbGUgaW4gdGhlIHNhbWUgSjJFRSBhcHBsaWNhdGlvbiB1bml0LgorCisJICBBbHRlcm5hdGl2ZWx5LCB0aGUgbmFtZSBpbiB0aGUgZWpiLWxpbmsgZWxlbWVudCBtYXkgYmUKKwkgIGNvbXBvc2VkIG9mIGEgcGF0aCBuYW1lIHNwZWNpZnlpbmcgdGhlIGVqYi1qYXIgY29udGFpbmluZyB0aGUKKwkgIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuIHdpdGggdGhlIGVqYi1uYW1lIG9mIHRoZSB0YXJnZXQKKwkgIGJlYW4gYXBwZW5kZWQgYW5kIHNlcGFyYXRlZCBmcm9tIHRoZSBwYXRoIG5hbWUgYnkgIiMiLiAgVGhlCisJICBwYXRoIG5hbWUgaXMgcmVsYXRpdmUgdG8gdGhlIERlcGxveW1lbnQgRmlsZSBjb250YWluaW5nCisJICBEZXBsb3ltZW50IENvbXBvbmVudCB0aGF0IGlzIHJlZmVyZW5jaW5nIHRoZSBlbnRlcnByaXNlCisJICBiZWFuLiAgVGhpcyBhbGxvd3MgbXVsdGlwbGUgZW50ZXJwcmlzZSBiZWFucyB3aXRoIHRoZSBzYW1lCisJICBlamItbmFtZSB0byBiZSB1bmlxdWVseSBpZGVudGlmaWVkLgorCisJICBFeGFtcGxlczoKKworCSAgICAgIDxlamItbGluaz5FbXBsb3llZVJlY29yZDwvZWpiLWxpbms+CisKKwkgICAgICA8ZWpiLWxpbms+Li4vcHJvZHVjdHMvcHJvZHVjdC5qYXIjUHJvZHVjdEVKQjwvZWpiLWxpbms+CisKKwkgIF1dPgorICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciLz4KKyAgICA8L3hzZDpzaW1wbGVDb250ZW50PgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWpiLWxvY2FsLXJlZlR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCVRoZSBlamItbG9jYWwtcmVmVHlwZSBpcyB1c2VkIGJ5IGVqYi1sb2NhbC1yZWYgZWxlbWVudHMgZm9yCisJdGhlIGRlY2xhcmF0aW9uIG9mIGEgcmVmZXJlbmNlIHRvIGFuIGVudGVycHJpc2UgYmVhbidzIGxvY2FsCisJaG9tZS4gVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mOgorCisJICAgIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24KKwkgICAgLSB0aGUgRUpCIHJlZmVyZW5jZSBuYW1lIHVzZWQgaW4gdGhlIGNvZGUgb2YgdGhlIERlcGxveW1lbnQKKwkgICAgICBDb21wb25lbnQgdGhhdCdzIHJlZmVyZW5jaW5nIHRoZSBlbnRlcnByaXNlIGJlYW4KKwkgICAgLSB0aGUgZXhwZWN0ZWQgdHlwZSBvZiB0aGUgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4KKwkgICAgLSB0aGUgZXhwZWN0ZWQgbG9jYWwgaG9tZSBhbmQgbG9jYWwgaW50ZXJmYWNlcyBvZiB0aGUKKwkgICAgICByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbgorCSAgICAtIG9wdGlvbmFsIGVqYi1saW5rIGluZm9ybWF0aW9uLCB1c2VkIHRvIHNwZWNpZnkgdGhlCisJICAgICAgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorCisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKKwkJICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCIKKwkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItcmVmLW5hbWUiCisJCSAgIHR5cGU9ImoyZWU6ZWpiLXJlZi1uYW1lVHlwZSIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1yZWYtdHlwZSIKKwkJICAgdHlwZT0iajJlZTplamItcmVmLXR5cGVUeXBlIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9jYWwtaG9tZSIKKwkJICAgdHlwZT0iajJlZTpsb2NhbC1ob21lVHlwZSIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvY2FsIgorCQkgICB0eXBlPSJqMmVlOmxvY2FsVHlwZSIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1saW5rIgorCQkgICB0eXBlPSJqMmVlOmVqYi1saW5rVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWpiLXJlZi1uYW1lVHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCTwhW0NEQVRBWworCisJICBUaGUgZWpiLXJlZi1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYW4gRUpCCisJICByZWZlcmVuY2UuIFRoZSBFSkIgcmVmZXJlbmNlIGlzIGFuIGVudHJ5IGluIHRoZQorCSAgRGVwbG95bWVudCBDb21wb25lbnQncyBlbnZpcm9ubWVudCBhbmQgaXMgcmVsYXRpdmUgdG8gdGhlCisJICBqYXZhOmNvbXAvZW52IGNvbnRleHQuICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlCisJICBEZXBsb3ltZW50IENvbXBvbmVudC4KKworCSAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBuYW1lIGlzIHByZWZpeGVkIHdpdGggImVqYi8iLgorCisJICBFeGFtcGxlOgorCisJICA8ZWpiLXJlZi1uYW1lPmVqYi9QYXlyb2xsPC9lamItcmVmLW5hbWU+CisKKwkgIF1dPgorICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpqbmRpLW5hbWVUeXBlIi8+CisgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVqYi1yZWYtdHlwZVR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCVRoZSBlamItcmVmLXR5cGVUeXBlIGNvbnRhaW5zIHRoZSBleHBlY3RlZCB0eXBlIG9mIHRoZQorCXJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuLgorCisJVGhlIGVqYi1yZWYtdHlwZSBkZXNpZ25hdGVzIGEgdmFsdWUKKwl0aGF0IG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisKKwkgICAgRW50aXR5CisJICAgIFNlc3Npb24KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgorCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVudGl0eSIvPgorCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlc3Npb24iLz4KKyAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlamItcmVmVHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJVGhlIGVqYi1yZWZUeXBlIGlzIHVzZWQgYnkgZWpiLXJlZiBlbGVtZW50cyBmb3IgdGhlCisJZGVjbGFyYXRpb24gb2YgYSByZWZlcmVuY2UgdG8gYW4gZW50ZXJwcmlzZSBiZWFuJ3MgaG9tZS4gVGhlCisJZGVjbGFyYXRpb24gY29uc2lzdHMgb2Y6CisKKwkgICAgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgorCSAgICAtIHRoZSBFSkIgcmVmZXJlbmNlIG5hbWUgdXNlZCBpbiB0aGUgY29kZSBvZgorCSAgICAgIHRoZSBEZXBsb3ltZW50IENvbXBvbmVudCB0aGF0J3MgcmVmZXJlbmNpbmcgdGhlIGVudGVycHJpc2UKKwkgICAgICBiZWFuCisJICAgIC0gdGhlIGV4cGVjdGVkIHR5cGUgb2YgdGhlIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuCisJICAgIC0gdGhlIGV4cGVjdGVkIGhvbWUgYW5kIHJlbW90ZSBpbnRlcmZhY2VzIG9mIHRoZSByZWZlcmVuY2VkCisJICAgICAgZW50ZXJwcmlzZSBiZWFuCisJICAgIC0gb3B0aW9uYWwgZWpiLWxpbmsgaW5mb3JtYXRpb24sIHVzZWQgdG8gc3BlY2lmeSB0aGUKKwkgICAgICByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbgorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisKKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgorCQkgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIgorCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1yZWYtbmFtZSIKKwkJICAgdHlwZT0iajJlZTplamItcmVmLW5hbWVUeXBlIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLXJlZi10eXBlIgorCQkgICB0eXBlPSJqMmVlOmVqYi1yZWYtdHlwZVR5cGUiLz4KKworICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImhvbWUiCisJCSAgIHR5cGU9ImoyZWU6aG9tZVR5cGUiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZW1vdGUiCisJCSAgIHR5cGU9ImoyZWU6cmVtb3RlVHlwZSIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1saW5rIgorCQkgICB0eXBlPSJqMmVlOmVqYi1saW5rVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW1wdHlUeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwlUaGlzIHR5cGUgaXMgdXNlZCB0byBkZXNpZ25hdGUgYW4gZW1wdHkKKwllbGVtZW50IHdoZW4gdXNlZC4KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudi1lbnRyeS10eXBlLXZhbHVlc1R5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKwk8IVtDREFUQVsKKworCSAgVGhpcyB0eXBlIGNvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgSmF2YSB0eXBlIG9mIHRoZQorCSAgZW52aXJvbm1lbnQgZW50cnkgdmFsdWUgdGhhdCBpcyBleHBlY3RlZCBieSB0aGUKKwkgIGFwcGxpY2F0aW9uJ3MgY29kZS4KKworCSAgVGhlIGZvbGxvd2luZyBhcmUgdGhlIGxlZ2FsIHZhbHVlcyBvZiBlbnYtZW50cnktdHlwZS12YWx1ZXNUeXBlOgorCisJICAgICAgamF2YS5sYW5nLkJvb2xlYW4KKwkgICAgICBqYXZhLmxhbmcuQnl0ZQorCSAgICAgIGphdmEubGFuZy5DaGFyYWN0ZXIKKwkgICAgICBqYXZhLmxhbmcuU3RyaW5nCisJICAgICAgamF2YS5sYW5nLlNob3J0CisJICAgICAgamF2YS5sYW5nLkludGVnZXIKKwkgICAgICBqYXZhLmxhbmcuTG9uZworCSAgICAgIGphdmEubGFuZy5GbG9hdAorCSAgICAgIGphdmEubGFuZy5Eb3VibGUKKworCSAgRXhhbXBsZToKKworCSAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Cb29sZWFuPC9lbnYtZW50cnktdHlwZT4KKworCSAgXV0+CisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzaW1wbGVDb250ZW50PgorICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+CisJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS5sYW5nLkJvb2xlYW4iLz4KKwk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqYXZhLmxhbmcuQnl0ZSIvPgorCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEubGFuZy5DaGFyYWN0ZXIiLz4KKwk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqYXZhLmxhbmcuU3RyaW5nIi8+CisJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS5sYW5nLlNob3J0Ii8+CisJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS5sYW5nLkludGVnZXIiLz4KKwk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqYXZhLmxhbmcuTG9uZyIvPgorCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEubGFuZy5GbG9hdCIvPgorCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEubGFuZy5Eb3VibGUiLz4KKyAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbnYtZW50cnlUeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwlUaGUgZW52LWVudHJ5VHlwZSBpcyB1c2VkIHRvIGRlY2xhcmUgYW4gYXBwbGljYXRpb24ncworCWVudmlyb25tZW50IGVudHJ5LiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwKKwlkZXNjcmlwdGlvbiwgdGhlIG5hbWUgb2YgdGhlIGVudmlyb25tZW50IGVudHJ5LCBhbmQgYW4KKwlvcHRpb25hbCB2YWx1ZS4gIElmIGEgdmFsdWUgaXMgbm90IHNwZWNpZmllZCwgb25lIG11c3QgYmUKKwlzdXBwbGllZCBkdXJpbmcgZGVwbG95bWVudC4KKworCUl0IGlzIHVzZWQgYnkgZW52LWVudHJ5IGVsZW1lbnRzLgorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisKKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgorCQkgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIgorCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudi1lbnRyeS1uYW1lIgorCQkgICB0eXBlPSJqMmVlOmpuZGktbmFtZVR5cGUiPgorCTx4c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKwkgICAgPCFbQ0RBVEFbCisKKwkgICAgICBUaGUgZW52LWVudHJ5LW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhCisJICAgICAgRGVwbG95bWVudCBDb21wb25lbnQncyBlbnZpcm9ubWVudCBlbnRyeS4gIFRoZSBuYW1lCisJICAgICAgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYKKwkgICAgICBjb250ZXh0LiAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGEKKwkgICAgICBEZXBsb3ltZW50IENvbXBvbmVudC4gVGhlIHVuaXF1ZW5lc3MKKwkgICAgICBjb25zdHJhaW50cyBtdXN0IGJlIGRlZmluZWQgd2l0aGluIHRoZSBkZWNsYXJlZAorCSAgICAgIGNvbnRleHQuCisKKwkgICAgICBFeGFtcGxlOgorCisJICAgICAgPGVudi1lbnRyeS1uYW1lPm1pbkFtb3VudDwvZW52LWVudHJ5LW5hbWU+CisKKwkgICAgICBdXT4KKwkgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDwveHNkOmVsZW1lbnQ+CisKKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnYtZW50cnktdHlwZSIKKwkJICAgdHlwZT0iajJlZTplbnYtZW50cnktdHlwZS12YWx1ZXNUeXBlIi8+CisKKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnYtZW50cnktdmFsdWUiCisJCSAgIHR5cGU9ImoyZWU6eHNkU3RyaW5nVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIj4KKwk8eHNkOmFubm90YXRpb24+CisJICA8eHNkOmRvY3VtZW50YXRpb24+CisJICAgIDwhW0NEQVRBWworCisJICAgICAgVGhlIGVudi1lbnRyeS12YWx1ZSBkZXNpZ25hdGVzIHRoZSB2YWx1ZSBvZiBhCisJICAgICAgRGVwbG95bWVudCBDb21wb25lbnQncyBlbnZpcm9ubWVudCBlbnRyeS4gVGhlIHZhbHVlCisJICAgICAgbXVzdCBiZSBhIFN0cmluZyB0aGF0IGlzIHZhbGlkIGZvciB0aGUKKwkgICAgICBjb25zdHJ1Y3RvciBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgdGhhdCB0YWtlcyBhCisJICAgICAgc2luZ2xlIFN0cmluZyBwYXJhbWV0ZXIsIG9yIGZvciBqYXZhLmxhbmcuQ2hhcmFjdGVyLAorCSAgICAgIGEgc2luZ2xlIGNoYXJhY3Rlci4KKworCSAgICAgIEV4YW1wbGU6CisKKwkgICAgICA8ZW52LWVudHJ5LXZhbHVlPjEwMC4wMDwvZW52LWVudHJ5LXZhbHVlPgorCisJICAgICAgXV0+CisJICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCTwveHNkOmFubm90YXRpb24+CisgICAgICA8L3hzZDplbGVtZW50PgorCisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJVGhlIGVsZW1lbnRzIHRoYXQgdXNlIHRoaXMgdHlwZSBkZXNpZ25hdGUgdGhlIG5hbWUgb2YgYQorCUphdmEgY2xhc3Mgb3IgaW50ZXJmYWNlLiAgVGhlIG5hbWUgaXMgaW4gdGhlIGZvcm0gb2YgYQorCSJiaW5hcnkgbmFtZSIsIGFzIGRlZmluZWQgaW4gdGhlIEpMUy4gIFRoaXMgaXMgdGhlIGZvcm0KKwlvZiBuYW1lIHVzZWQgaW4gQ2xhc3MuZm9yTmFtZSgpLiAgVG9vbHMgdGhhdCBuZWVkIHRoZQorCWNhbm9uaWNhbCBuYW1lICh0aGUgbmFtZSB1c2VkIGluIHNvdXJjZSBjb2RlKSB3aWxsIG5lZWQKKwl0byBjb252ZXJ0IHRoaXMgYmluYXJ5IG5hbWUgdG8gdGhlIGNhbm9uaWNhbCBuYW1lLgorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzaW1wbGVDb250ZW50PgorICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyIvPgorICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJnZW5lcmljLWJvb2xlYW5UeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwlUaGlzIHR5cGUgZGVmaW5lcyBmb3VyIGRpZmZlcmVudCB2YWx1ZXMgd2hpY2ggY2FuIGRlc2lnbmF0ZQorCWJvb2xlYW4gdmFsdWVzLiBUaGlzIGluY2x1ZGVzIHZhbHVlcyB5ZXMgYW5kIG5vIHdoaWNoIGFyZQorCW5vdCBkZXNpZ25hdGVkIGJ5IHhzZDpib29sZWFuCisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+CisgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KKwk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ0cnVlIi8+CisJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZmFsc2UiLz4KKwk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ5ZXMiLz4KKwk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJubyIvPgorICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImhvbWVUeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisJPCFbQ0RBVEFbCisKKwkgIFRoZSBob21lVHlwZSBkZWZpbmVzIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZgorCSAgYW4gZW50ZXJwcmlzZSBiZWFuJ3MgaG9tZSBpbnRlcmZhY2UuCisKKwkgIEV4YW1wbGU6CisKKwkgICAgICA8aG9tZT5jb20uYWFyZHZhcmsucGF5cm9sbC5QYXlyb2xsSG9tZTwvaG9tZT4KKworCSAgXV0+CisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzaW1wbGVDb250ZW50PgorICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiLz4KKyAgICA8L3hzZDpzaW1wbGVDb250ZW50PgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaWNvblR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCVRoZSBpY29uIHR5cGUgY29udGFpbnMgc21hbGwtaWNvbiBhbmQgbGFyZ2UtaWNvbiBlbGVtZW50cworCXRoYXQgc3BlY2lmeSB0aGUgZmlsZSBuYW1lcyBmb3Igc21hbGwgYW5kIGxhcmdlIEdJRiBvcgorCUpQRUcgaWNvbiBpbWFnZXMgdXNlZCB0byByZXByZXNlbnQgdGhlIHBhcmVudCBlbGVtZW50IGluIGEKKwlHVUkgdG9vbC4KKworCVRoZSB4bWw6bGFuZyBhdHRyaWJ1dGUgZGVmaW5lcyB0aGUgbGFuZ3VhZ2UgdGhhdCB0aGUKKwlpY29uIGZpbGUgbmFtZXMgYXJlIHByb3ZpZGVkIGluLiBJdHMgdmFsdWUgaXMgImVuIiAoRW5nbGlzaCkKKwlieSBkZWZhdWx0LgorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisKKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNtYWxsLWljb24iIHR5cGU9ImoyZWU6cGF0aFR5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCI+CisJPHhzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpkb2N1bWVudGF0aW9uPgorCSAgICA8IVtDREFUQVsKKworCSAgICAgIFRoZSBzbWFsbC1pY29uIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBmaWxlCisJICAgICAgY29udGFpbmluZyBhIHNtYWxsICgxNiB4IDE2KSBpY29uIGltYWdlLiBUaGUgZmlsZQorCSAgICAgIG5hbWUgaXMgYSByZWxhdGl2ZSBwYXRoIHdpdGhpbiB0aGUgRGVwbG95bWVudAorCSAgICAgIENvbXBvbmVudCdzIERlcGxveW1lbnQgRmlsZS4KKworCSAgICAgIFRoZSBpbWFnZSBtYXkgYmUgZWl0aGVyIGluIHRoZSBKUEVHIG9yIEdJRiBmb3JtYXQuCisJICAgICAgVGhlIGljb24gY2FuIGJlIHVzZWQgYnkgdG9vbHMuCisKKwkgICAgICBFeGFtcGxlOgorCisJICAgICAgPHNtYWxsLWljb24+ZW1wbG95ZWUtc2VydmljZS1pY29uMTZ4MTYuanBnPC9zbWFsbC1pY29uPgorCisJICAgICAgXV0+CisJICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCTwveHNkOmFubm90YXRpb24+CisgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxhcmdlLWljb24iIHR5cGU9ImoyZWU6cGF0aFR5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCI+CisJPHhzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpkb2N1bWVudGF0aW9uPgorCSAgICA8IVtDREFUQVsKKworCSAgICAgIFRoZSBsYXJnZS1pY29uIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBmaWxlCisJICAgICAgY29udGFpbmluZyBhIGxhcmdlCisJICAgICAgKDMyIHggMzIpIGljb24gaW1hZ2UuIFRoZSBmaWxlIG5hbWUgaXMgYSByZWxhdGl2ZQorCSAgICAgIHBhdGggd2l0aGluIHRoZSBEZXBsb3ltZW50IENvbXBvbmVudCdzIERlcGxveW1lbnQKKwkgICAgICBGaWxlLgorCisJICAgICAgVGhlIGltYWdlIG1heSBiZSBlaXRoZXIgaW4gdGhlIEpQRUcgb3IgR0lGIGZvcm1hdC4KKwkgICAgICBUaGUgaWNvbiBjYW4gYmUgdXNlZCBieSB0b29scy4KKworCSAgICAgIEV4YW1wbGU6CisKKwkgICAgICA8bGFyZ2UtaWNvbj5lbXBsb3llZS1zZXJ2aWNlLWljb24zMngzMi5qcGc8L2xhcmdlLWljb24+CisKKwkgICAgICBdXT4KKwkgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDwveHNkOmVsZW1lbnQ+CisKKyAgICA8L3hzZDpzZXF1ZW5jZT4KKworICAgIDx4c2Q6YXR0cmlidXRlIHJlZj0ieG1sOmxhbmciLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+CisKKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImphdmEtaWRlbnRpZmllclR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCVRoZSBqYXZhLWlkZW50aWZpZXJUeXBlIGRlZmluZXMgYSBKYXZhIGlkZW50aWZpZXIuCisJVGhlIHVzZXJzIG9mIHRoaXMgdHlwZSBzaG91bGQgZnVydGhlciB2ZXJpZnkgdGhhdAorCXRoZSBjb250ZW50IGRvZXMgbm90IGNvbnRhaW4gSmF2YSByZXNlcnZlZCBrZXl3b3Jkcy4KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgorCTx4c2Q6cGF0dGVybiB2YWx1ZT0iKCR8X3xccHtMfSkoXHB7TH18XHB7TmR9fF98JCkqIi8+CisgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICA8L3hzZDpzaW1wbGVDb250ZW50PgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iamF2YS10eXBlVHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJVGhpcyBpcyBhIGdlbmVyaWMgdHlwZSB0aGF0IGRlc2lnbmF0ZXMgYSBKYXZhIHByaW1pdGl2ZQorCXR5cGUgb3IgYSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIEphdmEgaW50ZXJmYWNlL3R5cGUsCisJb3IgYW4gYXJyYXkgb2Ygc3VjaCB0eXBlcy4KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgorCTx4c2Q6cGF0dGVybiB2YWx1ZT0iW15ccHtafV0qIi8+CisgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICA8L3hzZDpzaW1wbGVDb250ZW50PgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iam5kaS1uYW1lVHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJVGhlIGpuZGktbmFtZVR5cGUgdHlwZSBkZXNpZ25hdGVzIGEgSk5ESSBuYW1lIGluIHRoZQorCURlcGxveW1lbnQgQ29tcG9uZW50J3MgZW52aXJvbm1lbnQgYW5kIGlzIHJlbGF0aXZlIHRvIHRoZQorCWphdmE6Y29tcC9lbnYgY29udGV4dC4gIEEgSk5ESSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUKKwlEZXBsb3ltZW50IENvbXBvbmVudC4KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciLz4KKyAgICA8L3hzZDpzaW1wbGVDb250ZW50PgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Z3JvdXAgbmFtZT0iam5kaUVudmlyb25tZW50UmVmc0dyb3VwIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwlUaGlzIGdyb3VwIGtlZXBzIHRoZSB1c2FnZSBvZiB0aGUgY29udGFpbmVkIEpOREkgZW52aXJvbm1lbnQKKwlyZWZlcmVuY2UgZWxlbWVudHMgY29uc2lzdGVudCBhY3Jvc3MgSjJFRSBkZXBsb3ltZW50IGRlc2NyaXB0b3JzLgorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnYtZW50cnkiCisJCSAgIHR5cGU9ImoyZWU6ZW52LWVudHJ5VHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1yZWYiCisJCSAgIHR5cGU9ImoyZWU6ZWpiLXJlZlR5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItbG9jYWwtcmVmIgorCQkgICB0eXBlPSJqMmVlOmVqYi1sb2NhbC1yZWZUeXBlIgorCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmdyb3VwIHJlZj0iajJlZTpzZXJ2aWNlLXJlZkdyb3VwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVzb3VyY2UtcmVmIgorCQkgICB0eXBlPSJqMmVlOnJlc291cmNlLXJlZlR5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNvdXJjZS1lbnYtcmVmIgorCQkgICB0eXBlPSJqMmVlOnJlc291cmNlLWVudi1yZWZUeXBlIgorCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYiCisJCSAgIHR5cGU9ImoyZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWZUeXBlIgorCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgIDwveHNkOmdyb3VwPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsaXN0ZW5lclR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCVRoZSBsaXN0ZW5lclR5cGUgaW5kaWNhdGVzIHRoZSBkZXBsb3ltZW50IHByb3BlcnRpZXMgZm9yIGEgd2ViCisJYXBwbGljYXRpb24gbGlzdGVuZXIgYmVhbi4KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorCisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqMmVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsaXN0ZW5lci1jbGFzcyIKKwkJICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KKwk8eHNkOmFubm90YXRpb24+CisJICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgICAgVGhlIGxpc3RlbmVyLWNsYXNzIGVsZW1lbnQgZGVjbGFyZXMgYSBjbGFzcyBpbiB0aGUKKwkgICAgYXBwbGljYXRpb24gbXVzdCBiZSByZWdpc3RlcmVkIGFzIGEgd2ViCisJICAgIGFwcGxpY2F0aW9uIGxpc3RlbmVyIGJlYW4uIFRoZSB2YWx1ZSBpcyB0aGUgZnVsbHkKKwkgICAgcXVhbGlmaWVkIGNsYXNzbmFtZSBvZiB0aGUgbGlzdGVuZXIgY2xhc3MuCisKKwkgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibG9jYWwtaG9tZVR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCVRoZSBsb2NhbC1ob21lVHlwZSBkZWZpbmVzIHRoZSBmdWxseS1xdWFsaWZpZWQKKwluYW1lIG9mIGFuIGVudGVycHJpc2UgYmVhbidzIGxvY2FsIGhvbWUgaW50ZXJmYWNlLgorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzaW1wbGVDb250ZW50PgorICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiLz4KKyAgICA8L3hzZDpzaW1wbGVDb250ZW50PgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibG9jYWxUeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwlUaGUgbG9jYWxUeXBlIGRlZmluZXMgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIGFuCisJZW50ZXJwcmlzZSBiZWFuJ3MgbG9jYWwgaW50ZXJmYWNlLgorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzaW1wbGVDb250ZW50PgorICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiLz4KKyAgICA8L3hzZDpzaW1wbGVDb250ZW50PgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi1saW5rVHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJVGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tbGlua1R5cGUgaXMgdXNlZCB0byBsaW5rIGEgbWVzc2FnZQorCWRlc3RpbmF0aW9uIHJlZmVyZW5jZSBvciBtZXNzYWdlLWRyaXZlbiBiZWFuIHRvIGEgbWVzc2FnZQorCWRlc3RpbmF0aW9uLgorCisJVGhlIEFzc2VtYmxlciBzZXRzIHRoZSB2YWx1ZSB0byByZWZsZWN0IHRoZSBmbG93IG9mIG1lc3NhZ2VzCisJYmV0d2VlbiBwcm9kdWNlcnMgYW5kIGNvbnN1bWVycyBpbiB0aGUgYXBwbGljYXRpb24uCisKKwlUaGUgdmFsdWUgbXVzdCBiZSB0aGUgbWVzc2FnZS1kZXN0aW5hdGlvbi1uYW1lIG9mIGEgbWVzc2FnZQorCWRlc3RpbmF0aW9uIGluIHRoZSBzYW1lIERlcGxveW1lbnQgRmlsZSBvciBpbiBhbm90aGVyCisJRGVwbG95bWVudCBGaWxlIGluIHRoZSBzYW1lIEoyRUUgYXBwbGljYXRpb24gdW5pdC4KKworCUFsdGVybmF0aXZlbHksIHRoZSB2YWx1ZSBtYXkgYmUgY29tcG9zZWQgb2YgYSBwYXRoIG5hbWUKKwlzcGVjaWZ5aW5nIGEgRGVwbG95bWVudCBGaWxlIGNvbnRhaW5pbmcgdGhlIHJlZmVyZW5jZWQKKwltZXNzYWdlIGRlc3RpbmF0aW9uIHdpdGggdGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tbmFtZSBvZiB0aGUKKwlkZXN0aW5hdGlvbiBhcHBlbmRlZCBhbmQgc2VwYXJhdGVkIGZyb20gdGhlIHBhdGggbmFtZSBieQorCSIjIi4gVGhlIHBhdGggbmFtZSBpcyByZWxhdGl2ZSB0byB0aGUgRGVwbG95bWVudCBGaWxlCisJY29udGFpbmluZyBEZXBsb3ltZW50IENvbXBvbmVudCB0aGF0IGlzIHJlZmVyZW5jaW5nIHRoZQorCW1lc3NhZ2UgZGVzdGluYXRpb24uICBUaGlzIGFsbG93cyBtdWx0aXBsZSBtZXNzYWdlCisJZGVzdGluYXRpb25zIHdpdGggdGhlIHNhbWUgbmFtZSB0byBiZSB1bmlxdWVseSBpZGVudGlmaWVkLgorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzaW1wbGVDb250ZW50PgorICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyIvPgorICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZlR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKwk8IVtDREFUQVsKKworCSAgVGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tcmVmIGVsZW1lbnQgY29udGFpbnMgYSBkZWNsYXJhdGlvbgorCSAgb2YgRGVwbG95bWVudCBDb21wb25lbnQncyByZWZlcmVuY2UgdG8gYSBtZXNzYWdlIGRlc3RpbmF0aW9uCisJICBhc3NvY2lhdGVkIHdpdGggYSByZXNvdXJjZSBpbiBEZXBsb3ltZW50IENvbXBvbmVudCdzCisJICBlbnZpcm9ubWVudC4gSXQgY29uc2lzdHMgb2Y6CisKKwkJICAtIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uCisJCSAgLSB0aGUgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZlcmVuY2UgbmFtZQorCQkgIC0gdGhlIG1lc3NhZ2UgZGVzdGluYXRpb24gdHlwZQorCQkgIC0gYSBzcGVjaWZpY2F0aW9uIGFzIHRvIHdoZXRoZXIgdGhlCisJCSAgICBkZXN0aW5hdGlvbiBpcyB1c2VkIGZvcgorCQkgICAgY29uc3VtaW5nIG9yIHByb2R1Y2luZyBtZXNzYWdlcywgb3IgYm90aAorCQkgIC0gYSBsaW5rIHRvIHRoZSBtZXNzYWdlIGRlc3RpbmF0aW9uCisKKwkgIEV4YW1wbGVzOgorCisJICA8bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWY+CisJCSAgPG1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLW5hbWU+am1zL1N0b2NrUXVldWUKKwkJICA8L21lc3NhZ2UtZGVzdGluYXRpb24tcmVmLW5hbWU+CisJCSAgPG1lc3NhZ2UtZGVzdGluYXRpb24tdHlwZT5qYXZheC5qbXMuUXVldWUKKwkJICA8L21lc3NhZ2UtZGVzdGluYXRpb24tdHlwZT4KKwkJICA8bWVzc2FnZS1kZXN0aW5hdGlvbi11c2FnZT5Db25zdW1lcworCQkgIDwvbWVzc2FnZS1kZXN0aW5hdGlvbi11c2FnZT4KKwkJICA8bWVzc2FnZS1kZXN0aW5hdGlvbi1saW5rPkNvcnBvcmF0ZVN0b2NrcworCQkgIDwvbWVzc2FnZS1kZXN0aW5hdGlvbi1saW5rPgorCSAgPC9tZXNzYWdlLWRlc3RpbmF0aW9uLXJlZj4KKworCSAgXV0+CisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKKwkJICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCIKKwkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIgorCQkgICB0eXBlPSJqMmVlOmpuZGktbmFtZVR5cGUiPgorCTx4c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgICBUaGUgbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcworCSAgICB0aGUgbmFtZSBvZiBhIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmZXJlbmNlOyBpdHMKKwkgICAgdmFsdWUgaXMgdGhlIGVudmlyb25tZW50IGVudHJ5IG5hbWUgdXNlZCBpbgorCSAgICBEZXBsb3ltZW50IENvbXBvbmVudCBjb2RlLiAgVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUKKwkgICAgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYgY29udGV4dCBhbmQgbXVzdCBiZQorCSAgICB1bmlxdWUgd2l0aGluIGFuIGVqYi1qYXIgKGZvciBlbnRlcnByaXNlIGJlYW5zKSBvciBhCisJICAgIERlcGxveW1lbnQgRmlsZSAoZm9yIG90aGVycykuCisKKwkgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlIgorCQkgICB0eXBlPSJqMmVlOm1lc3NhZ2UtZGVzdGluYXRpb24tdHlwZVR5cGUiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLXVzYWdlIgorCQkgICB0eXBlPSJqMmVlOm1lc3NhZ2UtZGVzdGluYXRpb24tdXNhZ2VUeXBlIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi1saW5rIgorCQkgICB0eXBlPSJqMmVlOm1lc3NhZ2UtZGVzdGluYXRpb24tbGlua1R5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCIvPgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KKworICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlVHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCTwhW0NEQVRBWworCisJICBUaGUgbWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlVHlwZSBzcGVjaWZpZXMgdGhlIHR5cGUgb2YKKwkgIHRoZSBkZXN0aW5hdGlvbi4gVGhlIHR5cGUgaXMgc3BlY2lmaWVkIGJ5IHRoZSBKYXZhIGludGVyZmFjZQorCSAgZXhwZWN0ZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgdGhlIGRlc3RpbmF0aW9uLgorCisJICBFeGFtcGxlOgorCisJICAgIDxtZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGU+amF2YXguam1zLlF1ZXVlCisJICAgIDwvbWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlPgorCisJICBdXT4KKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+CisgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIvPgorICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLXVzYWdlVHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJVGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tdXNhZ2VUeXBlIHNwZWNpZmllcyB0aGUgdXNlIG9mIHRoZQorCW1lc3NhZ2UgZGVzdGluYXRpb24gaW5kaWNhdGVkIGJ5IHRoZSByZWZlcmVuY2UuICBUaGUgdmFsdWUKKwlpbmRpY2F0ZXMgd2hldGhlciBtZXNzYWdlcyBhcmUgY29uc3VtZWQgZnJvbSB0aGUgbWVzc2FnZQorCWRlc3RpbmF0aW9uLCBwcm9kdWNlZCBmb3IgdGhlIGRlc3RpbmF0aW9uLCBvciBib3RoLiAgVGhlCisJQXNzZW1ibGVyIG1ha2VzIHVzZSBvZiB0aGlzIGluZm9ybWF0aW9uIGluIGxpbmtpbmcgcHJvZHVjZXJzCisJb2YgYSBkZXN0aW5hdGlvbiB3aXRoIGl0cyBjb25zdW1lcnMuCisKKwlUaGUgdmFsdWUgb2YgdGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tdXNhZ2UgZWxlbWVudCBtdXN0IGJlCisJb25lIG9mIHRoZSBmb2xsb3dpbmc6CisJICAgIENvbnN1bWVzCisJICAgIFByb2R1Y2VzCisJICAgIENvbnN1bWVzUHJvZHVjZXMKKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgorCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN1bWVzIi8+CisJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjZXMiLz4KKwk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdW1lc1Byb2R1Y2VzIi8+CisgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICA8L3hzZDpzaW1wbGVDb250ZW50PgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvblR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKwk8IVtDREFUQVsKKworCSAgVGhlIG1lc3NhZ2UtZGVzdGluYXRpb25UeXBlIHNwZWNpZmllcyBhIG1lc3NhZ2UKKwkgIGRlc3RpbmF0aW9uLiBUaGUgbG9naWNhbCBkZXN0aW5hdGlvbiBkZXNjcmliZWQgYnkgdGhpcworCSAgZWxlbWVudCBpcyBtYXBwZWQgdG8gYSBwaHlzaWNhbCBkZXN0aW5hdGlvbiBieSB0aGUgRGVwbG95ZXIuCisKKwkgIFRoZSBtZXNzYWdlIGRlc3RpbmF0aW9uIGVsZW1lbnQgY29udGFpbnM6CisKKwkJICAtIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uCisJCSAgLSBhbiBvcHRpb25hbCBkaXNwbGF5LW5hbWUKKwkJICAtIGFuIG9wdGlvbmFsIGljb24KKwkJICAtIGEgbWVzc2FnZSBkZXN0aW5hdGlvbiBuYW1lIHdoaWNoIG11c3QgYmUgdW5pcXVlCisJCSAgICBhbW9uZyBtZXNzYWdlIGRlc3RpbmF0aW9uIG5hbWVzIHdpdGhpbiB0aGUgc2FtZQorCQkgICAgRGVwbG95bWVudCBGaWxlLgorCisJICBFeGFtcGxlOgorCisJICA8bWVzc2FnZS1kZXN0aW5hdGlvbj4KKwkJICA8bWVzc2FnZS1kZXN0aW5hdGlvbi1uYW1lPkNvcnBvcmF0ZVN0b2NrcworCQkgIDwvbWVzc2FnZS1kZXN0aW5hdGlvbi1uYW1lPgorCSAgPC9tZXNzYWdlLWRlc3RpbmF0aW9uPgorCisJICBdXT4KKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDpncm91cCByZWY9ImoyZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24tbmFtZSIKKwkJICAgdHlwZT0iajJlZTpzdHJpbmciPgorCTx4c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgICBUaGUgbWVzc2FnZS1kZXN0aW5hdGlvbi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIGEKKwkgICAgbmFtZSBmb3IgYSBtZXNzYWdlIGRlc3RpbmF0aW9uLiAgVGhpcyBuYW1lIG11c3QgYmUKKwkgICAgdW5pcXVlIGFtb25nIHRoZSBuYW1lcyBvZiBtZXNzYWdlIGRlc3RpbmF0aW9ucworCSAgICB3aXRoaW4gdGhlIERlcGxveW1lbnQgRmlsZS4KKworCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwk8L3hzZDphbm5vdGF0aW9uPgorICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwYXJhbS12YWx1ZVR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCVRoaXMgdHlwZSBpcyBhIGdlbmVyYWwgdHlwZSB0aGF0IGNhbiBiZSB1c2VkIHRvIGRlY2xhcmUKKwlwYXJhbWV0ZXIvdmFsdWUgbGlzdHMuCisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKworICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCisJCSAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgorCQkgICBtaW5PY2N1cnM9IjAiCisJCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFyYW0tbmFtZSIKKwkJICAgdHlwZT0iajJlZTpzdHJpbmciPgorCTx4c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgICBUaGUgcGFyYW0tbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEKKwkgICAgcGFyYW1ldGVyLgorCisJICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCTwveHNkOmFubm90YXRpb24+CisgICAgICA8L3hzZDplbGVtZW50PgorCisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFyYW0tdmFsdWUiCisJCSAgIHR5cGU9ImoyZWU6eHNkU3RyaW5nVHlwZSI+CisJPHhzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICAgIFRoZSBwYXJhbS12YWx1ZSBlbGVtZW50IGNvbnRhaW5zIHRoZSB2YWx1ZSBvZiBhCisJICAgIHBhcmFtZXRlci4KKworCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwk8L3hzZDphbm5vdGF0aW9uPgorICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwYXRoVHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJVGhlIGVsZW1lbnRzIHRoYXQgdXNlIHRoaXMgdHlwZSBkZXNpZ25hdGUgZWl0aGVyIGEgcmVsYXRpdmUKKwlwYXRoIG9yIGFuIGFic29sdXRlIHBhdGggc3RhcnRpbmcgd2l0aCBhICIvIi4KKworCUluIGVsZW1lbnRzIHRoYXQgc3BlY2lmeSBhIHBhdGhuYW1lIHRvIGEgZmlsZSB3aXRoaW4gdGhlCisJc2FtZSBEZXBsb3ltZW50IEZpbGUsIHJlbGF0aXZlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2Ugbm90CisJc3RhcnRpbmcgd2l0aCAiLyIpIGFyZSBjb25zaWRlcmVkIHJlbGF0aXZlIHRvIHRoZSByb290IG9mCisJdGhlIERlcGxveW1lbnQgRmlsZSdzIG5hbWVzcGFjZS4gIEFic29sdXRlIGZpbGVuYW1lcyAoaS5lLiwKKwl0aG9zZSBzdGFydGluZyB3aXRoICIvIikgYWxzbyBzcGVjaWZ5IG5hbWVzIGluIHRoZSByb290IG9mCisJdGhlIERlcGxveW1lbnQgRmlsZSdzIG5hbWVzcGFjZS4gIEluIGdlbmVyYWwsIHJlbGF0aXZlIG5hbWVzCisJYXJlIHByZWZlcnJlZC4gIFRoZSBleGNlcHRpb24gaXMgLndhciBmaWxlcyB3aGVyZSBhYnNvbHV0ZQorCW5hbWVzIGFyZSBwcmVmZXJyZWQgZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlIFNlcnZsZXQgQVBJLgorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzaW1wbGVDb250ZW50PgorICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyIvPgorICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZW1vdGVUeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisJPCFbQ0RBVEFbCisKKwkgIFRoZSByZW1vdGUgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUKKwkgIG9mIHRoZSBlbnRlcnByaXNlIGJlYW4ncyByZW1vdGUgaW50ZXJmYWNlLgorCisJICBFeGFtcGxlOgorCisJICAgICAgPHJlbW90ZT5jb20ud29tYmF0LmVtcGwuRW1wbG95ZWVTZXJ2aWNlPC9yZW1vdGU+CisKKwkgIF1dPgorICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIi8+CisgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlcy1hdXRoVHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJVGhlIHJlcy1hdXRoVHlwZSBzcGVjaWZpZXMgd2hldGhlciB0aGUgRGVwbG95bWVudCBDb21wb25lbnQKKwljb2RlIHNpZ25zIG9uIHByb2dyYW1tYXRpY2FsbHkgdG8gdGhlIHJlc291cmNlIG1hbmFnZXIsIG9yCisJd2hldGhlciB0aGUgQ29udGFpbmVyIHdpbGwgc2lnbiBvbiB0byB0aGUgcmVzb3VyY2UgbWFuYWdlcgorCW9uIGJlaGFsZiBvZiB0aGUgRGVwbG95bWVudCBDb21wb25lbnQuIEluIHRoZSBsYXR0ZXIgY2FzZSwKKwl0aGUgQ29udGFpbmVyIHVzZXMgaW5mb3JtYXRpb24gdGhhdCBpcyBzdXBwbGllZCBieSB0aGUKKwlEZXBsb3llci4KKworCVRoZSB2YWx1ZSBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoKKworCSAgICBBcHBsaWNhdGlvbgorCSAgICBDb250YWluZXIKKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgorCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uIi8+CisJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyIi8+CisgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICA8L3hzZDpzaW1wbGVDb250ZW50PgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVzLXNoYXJpbmctc2NvcGVUeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwlUaGUgcmVzLXNoYXJpbmctc2NvcGUgdHlwZSBzcGVjaWZpZXMgd2hldGhlciBjb25uZWN0aW9ucworCW9idGFpbmVkIHRocm91Z2ggdGhlIGdpdmVuIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbgorCWZhY3RvcnkgcmVmZXJlbmNlIGNhbiBiZSBzaGFyZWQuIFRoZSB2YWx1ZSwgaWYgc3BlY2lmaWVkLAorCW11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOgorCisJICAgIFNoYXJlYWJsZQorCSAgICBVbnNoYXJlYWJsZQorCisJVGhlIGRlZmF1bHQgdmFsdWUgaXMgU2hhcmVhYmxlLgorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzaW1wbGVDb250ZW50PgorICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+CisJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hhcmVhYmxlIi8+CisJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5zaGFyZWFibGUiLz4KKyAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZXNvdXJjZS1lbnYtcmVmVHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCTwhW0NEQVRBWworCisJICBUaGUgcmVzb3VyY2UtZW52LXJlZlR5cGUgaXMgdXNlZCB0byBkZWZpbmUKKwkgIHJlc291cmNlLWVudi10eXBlIGVsZW1lbnRzLiAgSXQgY29udGFpbnMgYSBkZWNsYXJhdGlvbiBvZiBhCisJICBEZXBsb3ltZW50IENvbXBvbmVudCdzIHJlZmVyZW5jZSB0byBhbiBhZG1pbmlzdGVyZWQgb2JqZWN0CisJICBhc3NvY2lhdGVkIHdpdGggYSByZXNvdXJjZSBpbiB0aGUgRGVwbG95bWVudCBDb21wb25lbnQncworCSAgZW52aXJvbm1lbnQuICBJdCBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgdGhlCisJICByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2UgbmFtZSwgYW5kIGFuIGluZGljYXRpb24gb2YKKwkgIHRoZSByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2UgdHlwZSBleHBlY3RlZCBieSB0aGUKKwkgIERlcGxveW1lbnQgQ29tcG9uZW50IGNvZGUuCisKKwkgIEV4YW1wbGU6CisKKwkgIDxyZXNvdXJjZS1lbnYtcmVmPgorCSAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+am1zL1N0b2NrUXVldWUKKwkgICAgICA8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KKwkgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmF4Lmptcy5RdWV1ZQorCSAgICAgIDwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgorCSAgPC9yZXNvdXJjZS1lbnYtcmVmPgorCisJICBdXT4KKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKworICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCisJCSAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgorCQkgICBtaW5PY2N1cnM9IjAiCisJCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVzb3VyY2UtZW52LXJlZi1uYW1lIgorCQkgICB0eXBlPSJqMmVlOmpuZGktbmFtZVR5cGUiPgorCTx4c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgICBUaGUgcmVzb3VyY2UtZW52LXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lCisJICAgIG9mIGEgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMKKwkgICAgdGhlIGVudmlyb25tZW50IGVudHJ5IG5hbWUgdXNlZCBpbgorCSAgICB0aGUgRGVwbG95bWVudCBDb21wb25lbnQgY29kZS4gIFRoZSBuYW1lIGlzIGEgSk5ESQorCSAgICBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQgYW5kIG11c3QKKwkgICAgYmUgdW5pcXVlIHdpdGhpbiBhIERlcGxveW1lbnQgQ29tcG9uZW50LgorCisJICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCTwveHNkOmFubm90YXRpb24+CisgICAgICA8L3hzZDplbGVtZW50PgorCisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVzb3VyY2UtZW52LXJlZi10eXBlIgorCQkgICB0eXBlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgorCTx4c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgICBUaGUgcmVzb3VyY2UtZW52LXJlZi10eXBlIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSB0eXBlCisJICAgIG9mIGEgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlLiAgSXQgaXMgdGhlCisJICAgIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgSmF2YSBsYW5ndWFnZSBjbGFzcyBvcgorCSAgICBpbnRlcmZhY2UuCisKKwkgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDwveHNkOmVsZW1lbnQ+CisKKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZXNvdXJjZS1yZWZUeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisJPCFbQ0RBVEFbCisKKwkgIFRoZSByZXNvdXJjZS1yZWZUeXBlIGNvbnRhaW5zIGEgZGVjbGFyYXRpb24gb2YgYQorCSAgRGVwbG95bWVudCBDb21wb25lbnQncyByZWZlcmVuY2UgdG8gYW4gZXh0ZXJuYWwgcmVzb3VyY2UuIEl0CisJICBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgdGhlIHJlc291cmNlIG1hbmFnZXIKKwkgIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2UgbmFtZSwgdGhlIGluZGljYXRpb24gb2YgdGhlCisJICByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSB0eXBlIGV4cGVjdGVkIGJ5IHRoZQorCSAgRGVwbG95bWVudCBDb21wb25lbnQgY29kZSwgdGhlIHR5cGUgb2YgYXV0aGVudGljYXRpb24KKwkgIChBcHBsaWNhdGlvbiBvciBDb250YWluZXIpLCBhbmQgYW4gb3B0aW9uYWwgc3BlY2lmaWNhdGlvbiBvZgorCSAgdGhlIHNoYXJlYWJpbGl0eSBvZiBjb25uZWN0aW9ucyBvYnRhaW5lZCBmcm9tIHRoZSByZXNvdXJjZQorCSAgKFNoYXJlYWJsZSBvciBVbnNoYXJlYWJsZSkuCisKKwkgIEV4YW1wbGU6CisKKwkgIDxyZXNvdXJjZS1yZWY+CisJICAgICAgPHJlcy1yZWYtbmFtZT5qZGJjL0VtcGxveWVlQXBwREI8L3Jlcy1yZWYtbmFtZT4KKwkgICAgICA8cmVzLXR5cGU+amF2YXguc3FsLkRhdGFTb3VyY2U8L3Jlcy10eXBlPgorCSAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgorCSAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgorCSAgPC9yZXNvdXJjZS1yZWY+CisKKwkgIF1dPgorICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorCisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKKwkJICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCIKKwkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXMtcmVmLW5hbWUiCisJCSAgIHR5cGU9ImoyZWU6am5kaS1uYW1lVHlwZSI+CisJPHhzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICAgIFRoZSByZXMtcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYQorCSAgICByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2UuCisJICAgIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZQorCSAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQuCisJICAgIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhIERlcGxveW1lbnQgRmlsZS4KKworCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwk8L3hzZDphbm5vdGF0aW9uPgorICAgICAgPC94c2Q6ZWxlbWVudD4KKworICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlcy10eXBlIgorCQkgICB0eXBlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgorCTx4c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgICBUaGUgcmVzLXR5cGUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIHR5cGUgb2YgdGhlIGRhdGEKKwkgICAgc291cmNlLiBUaGUgdHlwZSBpcyBzcGVjaWZpZWQgYnkgdGhlIGZ1bGx5IHF1YWxpZmllZAorCSAgICBKYXZhIGxhbmd1YWdlIGNsYXNzIG9yIGludGVyZmFjZQorCSAgICBleHBlY3RlZCB0byBiZSBpbXBsZW1lbnRlZCBieSB0aGUgZGF0YSBzb3VyY2UuCisKKwkgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDwveHNkOmVsZW1lbnQ+CisKKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXMtYXV0aCIKKwkJICAgdHlwZT0iajJlZTpyZXMtYXV0aFR5cGUiLz4KKworICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlcy1zaGFyaW5nLXNjb3BlIgorCQkgICB0eXBlPSJqMmVlOnJlcy1zaGFyaW5nLXNjb3BlVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icm9sZS1uYW1lVHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJVGhlIHJvbGUtbmFtZVR5cGUgZGVzaWduYXRlcyB0aGUgbmFtZSBvZiBhIHNlY3VyaXR5IHJvbGUuCisKKwlUaGUgbmFtZSBtdXN0IGNvbmZvcm0gdG8gdGhlIGxleGljYWwgcnVsZXMgZm9yIGEgdG9rZW4uCisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKworICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciLz4KKyAgICA8L3hzZDpzaW1wbGVDb250ZW50PgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icnVuLWFzVHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJVGhlIHJ1bi1hc1R5cGUgc3BlY2lmaWVzIHRoZSBydW4tYXMgaWRlbnRpdHkgdG8gYmUKKwl1c2VkIGZvciB0aGUgZXhlY3V0aW9uIG9mIGEgY29tcG9uZW50LiBJdCBjb250YWlucyBhbgorCW9wdGlvbmFsIGRlc2NyaXB0aW9uLCBhbmQgdGhlIG5hbWUgb2YgYSBzZWN1cml0eSByb2xlLgorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisKKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgorCQkgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIgorCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJvbGUtbmFtZSIKKwkJICAgdHlwZT0iajJlZTpyb2xlLW5hbWVUeXBlIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VjdXJpdHktcm9sZS1yZWZUeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwlUaGUgc2VjdXJpdHktcm9sZS1yZWZUeXBlIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiBhCisJc2VjdXJpdHkgcm9sZSByZWZlcmVuY2UgaW4gYSBjb21wb25lbnQncyBvciBhCisJRGVwbG95bWVudCBDb21wb25lbnQncyBjb2RlLiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2YgYW4KKwlvcHRpb25hbCBkZXNjcmlwdGlvbiwgdGhlIHNlY3VyaXR5IHJvbGUgbmFtZSB1c2VkIGluIHRoZQorCWNvZGUsIGFuZCBhbiBvcHRpb25hbCBsaW5rIHRvIGEgc2VjdXJpdHkgcm9sZS4gSWYgdGhlCisJc2VjdXJpdHkgcm9sZSBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgRGVwbG95ZXIgbXVzdCBjaG9vc2UgYW4KKwlhcHByb3ByaWF0ZSBzZWN1cml0eSByb2xlLgorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisKKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgorCQkgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIgorCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJvbGUtbmFtZSIKKwkJICAgdHlwZT0iajJlZTpyb2xlLW5hbWVUeXBlIj4KKwk8eHNkOmFubm90YXRpb24+CisJICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgICAgVGhlIHZhbHVlIG9mIHRoZSByb2xlLW5hbWUgZWxlbWVudCBtdXN0IGJlIHRoZSBTdHJpbmcgdXNlZAorCSAgICBhcyB0aGUgcGFyYW1ldGVyIHRvIHRoZQorCSAgICBFSkJDb250ZXh0LmlzQ2FsbGVySW5Sb2xlKFN0cmluZyByb2xlTmFtZSkgbWV0aG9kIG9yIHRoZQorCSAgICBIdHRwU2VydmxldFJlcXVlc3QuaXNVc2VySW5Sb2xlKFN0cmluZyByb2xlKSBtZXRob2QuCisKKwkgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDwveHNkOmVsZW1lbnQ+CisKKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyb2xlLWxpbmsiCisJCSAgIHR5cGU9ImoyZWU6cm9sZS1uYW1lVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIj4KKwk8eHNkOmFubm90YXRpb24+CisJICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgICAgVGhlIHJvbGUtbGluayBlbGVtZW50IGlzIGEgcmVmZXJlbmNlIHRvIGEgZGVmaW5lZAorCSAgICBzZWN1cml0eSByb2xlLiBUaGUgcm9sZS1saW5rIGVsZW1lbnQgbXVzdCBjb250YWluCisJICAgIHRoZSBuYW1lIG9mIG9uZSBvZiB0aGUgc2VjdXJpdHkgcm9sZXMgZGVmaW5lZCBpbiB0aGUKKwkgICAgc2VjdXJpdHktcm9sZSBlbGVtZW50cy4KKworCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwk8L3hzZDphbm5vdGF0aW9uPgorICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZWN1cml0eS1yb2xlVHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCTwhW0NEQVRBWworCisJICBUaGUgc2VjdXJpdHktcm9sZVR5cGUgY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2YgYSBzZWN1cml0eQorCSAgcm9sZS4gVGhlIGRlZmluaXRpb24gY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhlCisJICBzZWN1cml0eSByb2xlLCBhbmQgdGhlIHNlY3VyaXR5IHJvbGUgbmFtZS4KKworCSAgRXhhbXBsZToKKworCSAgICAgIDxzZWN1cml0eS1yb2xlPgorCSAgICAgIDxkZXNjcmlwdGlvbj4KKwkJICBUaGlzIHJvbGUgaW5jbHVkZXMgYWxsIGVtcGxveWVlcyB3aG8gYXJlIGF1dGhvcml6ZWQKKwkJICB0byBhY2Nlc3MgdGhlIGVtcGxveWVlIHNlcnZpY2UgYXBwbGljYXRpb24uCisJICAgICAgPC9kZXNjcmlwdGlvbj4KKwkgICAgICA8cm9sZS1uYW1lPmVtcGxveWVlPC9yb2xlLW5hbWU+CisJICAgICAgPC9zZWN1cml0eS1yb2xlPgorCisJICBdXT4KKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKworICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCisJCSAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgorCQkgICBtaW5PY2N1cnM9IjAiCisJCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icm9sZS1uYW1lIgorCQkgICB0eXBlPSJqMmVlOnJvbGUtbmFtZVR5cGUiLz4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzdHJpbmciPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCVRoaXMgaXMgYSBzcGVjaWFsIHN0cmluZyBkYXRhdHlwZSB0aGF0IGlzIGRlZmluZWQgYnkgSjJFRSBhcworCWEgYmFzZSB0eXBlIGZvciBkZWZpbmluZyBjb2xsYXBzZWQgc3RyaW5ncy4gV2hlbiBzY2hlbWFzCisJcmVxdWlyZSB0cmFpbGluZy9sZWFkaW5nIHNwYWNlIGVsaW1pbmF0aW9uIGFzIHdlbGwgYXMKKwljb2xsYXBzaW5nIHRoZSBleGlzdGluZyB3aGl0ZXNwYWNlLCB0aGlzIGJhc2UgdHlwZSBtYXkgYmUKKwl1c2VkLgorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzaW1wbGVDb250ZW50PgorICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnRva2VuIj4KKwk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+CisgICAgICA8L3hzZDpleHRlbnNpb24+CisgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRydWUtZmFsc2VUeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwlUaGlzIHNpbXBsZSB0eXBlIGRlc2lnbmF0ZXMgYSBib29sZWFuIHdpdGggb25seSB0d28KKwlwZXJtaXNzaWJsZSB2YWx1ZXMKKworCS0gdHJ1ZQorCS0gZmFsc2UKKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTp4c2RCb29sZWFuVHlwZSI+CisJPHhzZDpwYXR0ZXJuIHZhbHVlPSIodHJ1ZXxmYWxzZSkiLz4KKyAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ1cmwtcGF0dGVyblR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCVRoZSB1cmwtcGF0dGVyblR5cGUgY29udGFpbnMgdGhlIHVybCBwYXR0ZXJuIG9mIHRoZSBtYXBwaW5nLgorCUl0IG11c3QgZm9sbG93IHRoZSBydWxlcyBzcGVjaWZpZWQgaW4gU2VjdGlvbiAxMS4yIG9mIHRoZQorCVNlcnZsZXQgQVBJIFNwZWNpZmljYXRpb24uIFRoaXMgcGF0dGVybiBpcyBhc3N1bWVkIHRvIGJlIGluCisJVVJMLWRlY29kZWQgZm9ybSBhbmQgbXVzdCBub3QgY29udGFpbiBDUigjeEQpIG9yIExGKCN4QSkuCisJSWYgaXQgY29udGFpbnMgdGhvc2UgY2hhcmFjdGVycywgdGhlIGNvbnRhaW5lciBtdXN0IGluZm9ybQorCXRoZSBkZXZlbG9wZXIgd2l0aCBhIGRlc2NyaXB0aXZlIGVycm9yIG1lc3NhZ2UuCisJVGhlIGNvbnRhaW5lciBtdXN0IHByZXNlcnZlIGFsbCBjaGFyYWN0ZXJzIGluY2x1ZGluZyB3aGl0ZXNwYWNlcy4KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpzdHJpbmciLz4KKyAgICA8L3hzZDpzaW1wbGVDb250ZW50PgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieHNkQW55VVJJVHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJVGhpcyB0eXBlIGFkZHMgYW4gImlkIiBhdHRyaWJ1dGUgdG8geHNkOmFueVVSSS4KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDphbnlVUkkiPgorCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KKyAgICAgIDwveHNkOmV4dGVuc2lvbj4KKyAgICA8L3hzZDpzaW1wbGVDb250ZW50PgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieHNkQm9vbGVhblR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCVRoaXMgdHlwZSBhZGRzIGFuICJpZCIgYXR0cmlidXRlIHRvIHhzZDpib29sZWFuLgorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzaW1wbGVDb250ZW50PgorICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOmJvb2xlYW4iPgorCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KKyAgICAgIDwveHNkOmV4dGVuc2lvbj4KKyAgICA8L3hzZDpzaW1wbGVDb250ZW50PgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieHNkSW50ZWdlclR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCVRoaXMgdHlwZSBhZGRzIGFuICJpZCIgYXR0cmlidXRlIHRvIHhzZDppbnRlZ2VyLgorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzaW1wbGVDb250ZW50PgorICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOmludGVnZXIiPgorCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KKyAgICAgIDwveHNkOmV4dGVuc2lvbj4KKyAgICA8L3hzZDpzaW1wbGVDb250ZW50PgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieHNkTk1UT0tFTlR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCVRoaXMgdHlwZSBhZGRzIGFuICJpZCIgYXR0cmlidXRlIHRvIHhzZDpOTVRPS0VOLgorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzaW1wbGVDb250ZW50PgorICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgorCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KKyAgICAgIDwveHNkOmV4dGVuc2lvbj4KKyAgICA8L3hzZDpzaW1wbGVDb250ZW50PgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieHNkTm9uTmVnYXRpdmVJbnRlZ2VyVHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJVGhpcyB0eXBlIGFkZHMgYW4gImlkIiBhdHRyaWJ1dGUgdG8geHNkOm5vbk5lZ2F0aXZlSW50ZWdlci4KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpub25OZWdhdGl2ZUludGVnZXIiPgorCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KKyAgICAgIDwveHNkOmV4dGVuc2lvbj4KKyAgICA8L3hzZDpzaW1wbGVDb250ZW50PgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieHNkUG9zaXRpdmVJbnRlZ2VyVHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJVGhpcyB0eXBlIGFkZHMgYW4gImlkIiBhdHRyaWJ1dGUgdG8geHNkOnBvc2l0aXZlSW50ZWdlci4KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpwb3NpdGl2ZUludGVnZXIiPgorCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KKyAgICAgIDwveHNkOmV4dGVuc2lvbj4KKyAgICA8L3hzZDpzaW1wbGVDb250ZW50PgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieHNkUU5hbWVUeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwlUaGlzIHR5cGUgYWRkcyBhbiAiaWQiIGF0dHJpYnV0ZSB0byB4c2Q6UU5hbWUuCisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+CisgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6UU5hbWUiPgorCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KKyAgICAgIDwveHNkOmV4dGVuc2lvbj4KKyAgICA8L3hzZDpzaW1wbGVDb250ZW50PgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieHNkU3RyaW5nVHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJVGhpcyB0eXBlIGFkZHMgYW4gImlkIiBhdHRyaWJ1dGUgdG8geHNkOnN0cmluZy4KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpzdHJpbmciPgorCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KKyAgICAgIDwveHNkOmV4dGVuc2lvbj4KKyAgICA8L3hzZDpzaW1wbGVDb250ZW50PgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPC94c2Q6c2NoZW1hPgorCmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvZHRkL2oyZWVfd2ViX3NlcnZpY2VzXzFfMS54c2QgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvZHRkL2oyZWVfd2ViX3NlcnZpY2VzXzFfMS54c2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZiNWJkMgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9kdGQvajJlZV93ZWJfc2VydmljZXNfMV8xLnhzZApAQCAtMCwwICsxLDUwNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzx4c2Q6c2NoZW1hIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKKwkgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgorCSAgICB4bWxuczpqMmVlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgorCSAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgorCSAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKKwkgICAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIgorCSAgICB2ZXJzaW9uPSIxLjEiPgorICA8eHNkOmFubm90YXRpb24+CisgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorICAgICAgQCgjKWoyZWVfd2ViX3NlcnZpY2VzXzFfMS54c2RzCTEuMTEgMDIvMTEvMDMKKyAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICA8L3hzZDphbm5vdGF0aW9uPgorCisgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgIENvcHlyaWdodCAyMDAyIFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDkwMSBTYW4gQW50b25pbworICAgICAgUm9hZCwgUGFsbyBBbHRvLCBDYWxpZm9ybmlhIDk0MzAzLCBVLlMuQS4gQWxsIHJpZ2h0cworICAgICAgcmVzZXJ2ZWQuCisKKyAgICAgIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaGFzIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMKKyAgICAgIHJlbGF0aW5nIHRvIHRlY2hub2xvZ3kgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQuIEluCisgICAgICBwYXJ0aWN1bGFyLCBhbmQgd2l0aG91dCBsaW1pdGF0aW9uLCB0aGVzZSBpbnRlbGxlY3R1YWwKKyAgICAgIHByb3BlcnR5IHJpZ2h0cyBtYXkgaW5jbHVkZSBvbmUgb3IgbW9yZSBvZiB0aGUgVS5TLiBwYXRlbnRzCisgICAgICBsaXN0ZWQgYXQgaHR0cDovL3d3dy5zdW4uY29tL3BhdGVudHMgYW5kIG9uZSBvciBtb3JlCisgICAgICBhZGRpdGlvbmFsIHBhdGVudHMgb3IgcGVuZGluZyBwYXRlbnQgYXBwbGljYXRpb25zIGluIHRoZQorICAgICAgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgorCisgICAgICBUaGlzIGRvY3VtZW50IGFuZCB0aGUgdGVjaG5vbG9neSB3aGljaCBpdCBkZXNjcmliZXMgYXJlCisgICAgICBkaXN0cmlidXRlZCB1bmRlciBsaWNlbnNlcyByZXN0cmljdGluZyB0aGVpciB1c2UsIGNvcHlpbmcsCisgICAgICBkaXN0cmlidXRpb24sIGFuZCBkZWNvbXBpbGF0aW9uLiBObyBwYXJ0IG9mIHRoaXMgZG9jdW1lbnQKKyAgICAgIG1heSBiZSByZXByb2R1Y2VkIGluIGFueSBmb3JtIGJ5IGFueSBtZWFucyB3aXRob3V0IHByaW9yCisgICAgICB3cml0dGVuIGF1dGhvcml6YXRpb24gb2YgU3VuIGFuZCBpdHMgbGljZW5zb3JzLCBpZiBhbnkuCisKKyAgICAgIFRoaXJkLXBhcnR5IHNvZnR3YXJlLCBpbmNsdWRpbmcgZm9udCB0ZWNobm9sb2d5LCBpcworICAgICAgY29weXJpZ2h0ZWQgYW5kIGxpY2Vuc2VkIGZyb20gU3VuIHN1cHBsaWVycy4KKworICAgICAgU3VuLCBTdW4gTWljcm9zeXN0ZW1zLCB0aGUgU3VuIGxvZ28sIFNvbGFyaXMsIEphdmEsIEoyRUUsCisgICAgICBKYXZhU2VydmVyIFBhZ2VzLCBFbnRlcnByaXNlIEphdmFCZWFucyBhbmQgdGhlIEphdmEgQ29mZmVlCisgICAgICBDdXAgbG9nbyBhcmUgdHJhZGVtYXJrcyBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU3VuCisgICAgICBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KKworICAgICAgRmVkZXJhbCBBY3F1aXNpdGlvbnM6IENvbW1lcmNpYWwgU29mdHdhcmUgLSBHb3Zlcm5tZW50IFVzZXJzCisgICAgICBTdWJqZWN0IHRvIFN0YW5kYXJkIExpY2Vuc2UgVGVybXMgYW5kIENvbmRpdGlvbnMuCisKKyAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICA8L3hzZDphbm5vdGF0aW9uPgorICA8eHNkOmFubm90YXRpb24+CisgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICAoQykgQ29weXJpZ2h0IEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gMjAwMgorCisgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgPC94c2Q6YW5ub3RhdGlvbj4KKworICA8eHNkOmFubm90YXRpb24+CisgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorICAgICAgPCFbQ0RBVEFbCisKKwlUaGUgd2Vic2VydmljZXMgZWxlbWVudCBpcyB0aGUgcm9vdCBlbGVtZW50IGZvciB0aGUgd2ViIHNlcnZpY2VzCisJZGVwbG95bWVudCBkZXNjcmlwdG9yLiAgSXQgc3BlY2lmaWVzIHRoZSBzZXQgb2Ygd2ViIHNlcnZpY2UKKwlkZXNjcmlwdGlvbnMgdGhhdCBhcmUgdG8gYmUgZGVwbG95ZWQgaW50byB0aGUgSjJFRSBBcHBsaWNhdGlvbgorCVNlcnZlciBhbmQgdGhlIGRlcGVuZGVuY2llcyB0aGV5IGhhdmUgb24gY29udGFpbmVyIHJlc291cmNlcyBhbmQKKwlzZXJ2aWNlcy4gIFRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgbXVzdCBiZSBuYW1lZAorCSJNRVRBLUlORi93ZWJzZXJ2aWNlcy54bWwiIGluIHRoZSB3ZWIgc2VydmljZXMnIGphciBmaWxlLgorCisJVXNlZCBpbjogd2Vic2VydmljZXMueG1sCisKKwlBbGwgd2Vic2VydmljZXMgZGVwbG95bWVudCBkZXNjcmlwdG9ycyBtdXN0IGluZGljYXRlIHRoZQorCXdlYnNlcnZpY2VzIHNjaGVtYSBieSB1c2luZyB0aGUgSjJFRSBuYW1lc3BhY2U6CisKKwlodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlCisKKwlhbmQgYnkgaW5kaWNhdGluZyB0aGUgdmVyc2lvbiBvZiB0aGUgc2NoZW1hIGJ5IHVzaW5nIHRoZSB2ZXJzaW9uCisJZWxlbWVudCBhcyBzaG93biBiZWxvdzoKKworCSAgICA8d2Vic2VydmljZXMgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCisJICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKwkgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUKKwkJaHR0cDovL3d3dy5pYm0uY29tL3dlYnNlcnZpY2VzL3hzZC9qMmVlX3dlYl9zZXJ2aWNlc18xXzEueHNkIgorCSAgICAgIHZlcnNpb249IjEuMSI+CisJICAgICAgLi4uCisJICAgIDwvd2Vic2VydmljZXM+CisKKwlUaGUgaW5zdGFuY2UgZG9jdW1lbnRzIG1heSBpbmRpY2F0ZSB0aGUgcHVibGlzaGVkIHZlcnNpb24gb2YgdGhlCisJc2NoZW1hIHVzaW5nIHRoZSB4c2k6c2NoZW1hTG9jYXRpb24gYXR0cmlidXRlIGZvciB0aGUgSjJFRQorCW5hbWVzcGFjZSB3aXRoIHRoZSBmb2xsb3dpbmcgbG9jYXRpb246CisKKwlodHRwOi8vd3d3LmlibS5jb20vd2Vic2VydmljZXMveHNkL2oyZWVfd2ViX3NlcnZpY2VzXzFfMS54c2QKKworCV1dPgorICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgIDwveHNkOmFubm90YXRpb24+CisKKyAgPHhzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgVGhlIGZvbGxvd2luZyBjb252ZW50aW9ucyBhcHBseSB0byBhbGwgSjJFRQorICAgICAgZGVwbG95bWVudCBkZXNjcmlwdG9yIGVsZW1lbnRzIHVubGVzcyBpbmRpY2F0ZWQgb3RoZXJ3aXNlLgorCisgICAgICAtIEluIGVsZW1lbnRzIHRoYXQgc3BlY2lmeSBhIHBhdGhuYW1lIHRvIGEgZmlsZSB3aXRoaW4gdGhlCisJc2FtZSBKQVIgZmlsZSwgcmVsYXRpdmUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZSBub3QKKwlzdGFydGluZyB3aXRoICIvIikgYXJlIGNvbnNpZGVyZWQgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YKKwl0aGUgSkFSIGZpbGUncyBuYW1lc3BhY2UuICBBYnNvbHV0ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlCisJc3RhcnRpbmcgd2l0aCAiLyIpIGFsc28gc3BlY2lmeSBuYW1lcyBpbiB0aGUgcm9vdCBvZiB0aGUKKwlKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEluIGdlbmVyYWwsIHJlbGF0aXZlIG5hbWVzIGFyZQorCXByZWZlcnJlZC4gIFRoZSBleGNlcHRpb24gaXMgLndhciBmaWxlcyB3aGVyZSBhYnNvbHV0ZQorCW5hbWVzIGFyZSBwcmVmZXJyZWQgZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlIFNlcnZsZXQgQVBJLgorCisgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgPC94c2Q6YW5ub3RhdGlvbj4KKworICA8eHNkOmluY2x1ZGUgc2NoZW1hTG9jYXRpb249ImoyZWVfMV80LnhzZCIvPgorCisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworCisgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3ZWJzZXJ2aWNlcyIgdHlwZT0iajJlZTp3ZWJzZXJ2aWNlc1R5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCVRoZSB3ZWJzZXJ2aWNlcyBlbGVtZW50IGlzIHRoZSByb290IGVsZW1lbnQgZm9yIHRoZSB3ZWIgc2VydmljZXMKKwlkZXBsb3ltZW50IGRlc2NyaXB0b3IuICBJdCBzcGVjaWZpZXMgdGhlIHNldCBvZiB3ZWIgc2VydmljZQorCWRlc2NyaXB0aW9ucyB0aGF0IGFyZSB0byBiZSBkZXBsb3llZCBpbnRvIHRoZSBKMkVFIEFwcGxpY2F0aW9uIFNlcnZlcgorCWFuZCB0aGUgZGVwZW5kZW5jaWVzIHRoZXkgaGF2ZSBvbiBjb250YWluZXIgcmVzb3VyY2VzIGFuZCBzZXJ2aWNlcy4KKworCVVzZWQgaW46IHdlYnNlcnZpY2VzLnhtbAorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisKKyAgICA8eHNkOmtleSBuYW1lPSJ3ZWJzZXJ2aWNlLWRlc2NyaXB0aW9uLW5hbWUta2V5Ij4KKyAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KKwk8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgIFRoZSB3ZWJzZXJ2aWNlLWRlc2NyaXB0aW9uLW5hbWUgaWRlbnRpZmllcyB0aGUgY29sbGVjdGlvbiBvZgorCSAgcG9ydC1jb21wb25lbnRzIGFzc29jaWF0ZWQgd2l0aCBhIFdTREwgZmlsZSBhbmQgSkFYLVJQQyBtYXBwaW5nLiBUaGUKKwkgIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCisKKwk8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6d2Vic2VydmljZS1kZXNjcmlwdGlvbiIvPgorICAgICAgPHhzZDpmaWVsZCB4cGF0aD0iajJlZTp3ZWJzZXJ2aWNlLWRlc2NyaXB0aW9uLW5hbWUiLz4KKyAgICA8L3hzZDprZXk+CisgIDwveHNkOmVsZW1lbnQ+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBvcnQtY29tcG9uZW50VHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJVGhlIHBvcnQtY29tcG9uZW50IGVsZW1lbnQgYXNzb2NpYXRlcyBhIFdTREwgcG9ydCB3aXRoIGEgd2ViIHNlcnZpY2UKKwlpbnRlcmZhY2UgYW5kIGltcGxlbWVudGF0aW9uLiAgSXQgZGVmaW5lcyB0aGUgbmFtZSBvZiB0aGUgcG9ydCBhcyBhCisJY29tcG9uZW50LCBvcHRpb25hbCBkZXNjcmlwdGlvbiwgb3B0aW9uYWwgZGlzcGxheSBuYW1lLCBvcHRpb25hbCBpY29uaWMKKwlyZXByZXNlbnRhdGlvbnMsIFdTREwgcG9ydCBRTmFtZSwgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UsIFNlcnZpY2UKKwlJbXBsZW1lbnRhdGlvbiBCZWFuLgorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisKKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgorCQkgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNwbGF5LW5hbWUiCisJCSAgIHR5cGU9ImoyZWU6ZGlzcGxheS1uYW1lVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpY29uIgorCQkgICB0eXBlPSJqMmVlOmljb25UeXBlIgorCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvcnQtY29tcG9uZW50LW5hbWUiCisJCSAgIHR5cGU9ImoyZWU6c3RyaW5nIj4KKwk8eHNkOmFubm90YXRpb24+CisJICA8eHNkOmRvY3VtZW50YXRpb24+CisJICAgIDwhW0NEQVRBWworCisJICAgICAgVGhlIHBvcnQtY29tcG9uZW50LW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgYSBwb3J0IGNvbXBvbmVudCdzCisJICAgICAgbmFtZS4gIFRoaXMgbmFtZSBpcyBhc3NpZ25lZCBieSB0aGUgbW9kdWxlIHByb2R1Y2VyIHRvIG5hbWUKKwkgICAgICB0aGUgc2VydmljZSBpbXBsZW1lbnRhdGlvbiBiZWFuIGluIHRoZSBtb2R1bGUncyBkZXBsb3ltZW50CisJICAgICAgZGVzY3JpcHRvci4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgYW1vbmcgdGhlIHBvcnQgY29tcG9uZW50CisJICAgICAgbmFtZXMgZGVmaW5lZCBpbiB0aGUgc2FtZSBtb2R1bGUuCisKKwkgICAgICBVc2VkIGluOiBwb3J0LWNvbXBvbmVudAorCisJICAgICAgRXhhbXBsZToKKwkJICAgICAgPHBvcnQtY29tcG9uZW50LW5hbWU+RW1wbG95ZWVTZXJ2aWNlCisJCSAgICAgIDwvcG9ydC1jb21wb25lbnQtbmFtZT4KKworCSAgICAgIF1dPgorCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwk8L3hzZDphbm5vdGF0aW9uPgorICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3c2RsLXBvcnQiCisJCSAgIHR5cGU9ImoyZWU6eHNkUU5hbWVUeXBlIj4KKwk8eHNkOmFubm90YXRpb24+CisJICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgICAgRGVmaW5lcyB0aGUgbmFtZSBzcGFjZSBhbmQgbG9jYWwgbmFtZSBwYXJ0IG9mIHRoZSBXU0RMIHBvcnQgUU5hbWUuCisKKwkgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmljZS1lbmRwb2ludC1pbnRlcmZhY2UiCisJCSAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+CisJPHhzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpkb2N1bWVudGF0aW9uPgorCSAgICA8IVtDREFUQVsKKworCSAgICAgIFRoZSBzZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZSBlbGVtZW50IGNvbnRhaW5zIHRoZQorCSAgICAgIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBwb3J0IGNvbXBvbmVudCdzIFNlcnZpY2UgRW5kcG9pbnQKKwkgICAgICBJbnRlcmZhY2UuCisKKwkgICAgICBVc2VkIGluOiBwb3J0LWNvbXBvbmVudAorCisJICAgICAgRXhhbXBsZToKKwkJICAgICAgPHJlbW90ZT5jb20ud29tYmF0LmVtcGwuRW1wbG95ZWVTZXJ2aWNlPC9yZW1vdGU+CisKKwkgICAgICBdXT4KKwkgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmljZS1pbXBsLWJlYW4iCisJCSAgIHR5cGU9ImoyZWU6c2VydmljZS1pbXBsLWJlYW5UeXBlIi8+CisKKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJoYW5kbGVyIgorCQkgICB0eXBlPSJqMmVlOnBvcnQtY29tcG9uZW50X2hhbmRsZXJUeXBlIgorCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icG9ydC1jb21wb25lbnRfaGFuZGxlclR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCURlY2xhcmVzIHRoZSBoYW5kbGVyIGZvciBhIHBvcnQtY29tcG9uZW50LiBIYW5kbGVycyBjYW4gYWNjZXNzIHRoZQorCWluaXQtcGFyYW0gbmFtZS92YWx1ZSBwYWlycyB1c2luZyB0aGUgSGFuZGxlckluZm8gaW50ZXJmYWNlLgorCisJVXNlZCBpbjogcG9ydC1jb21wb25lbnQKKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmdyb3VwIHJlZj0iajJlZTpkZXNjcmlwdGlvbkdyb3VwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaGFuZGxlci1uYW1lIgorCQkgICB0eXBlPSJqMmVlOnN0cmluZyI+CisJPHhzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICAgIERlZmluZXMgdGhlIG5hbWUgb2YgdGhlIGhhbmRsZXIuIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUKKwkgICAgbW9kdWxlLgorCisJICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCTwveHNkOmFubm90YXRpb24+CisgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImhhbmRsZXItY2xhc3MiCisJCSAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+CisJPHhzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICAgIERlZmluZXMgYSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBmb3IgdGhlIGhhbmRsZXIgaW1wbGVtZW50YXRpb24uCisKKwkgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5pdC1wYXJhbSIKKwkJICAgdHlwZT0iajJlZTpwYXJhbS12YWx1ZVR5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKworICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNvYXAtaGVhZGVyIgorCQkgICB0eXBlPSJqMmVlOnhzZFFOYW1lVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisJPHhzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICAgIERlZmluZXMgdGhlIFFOYW1lIG9mIGEgU09BUCBoZWFkZXIgdGhhdCB3aWxsIGJlIHByb2Nlc3NlZCBieSB0aGUKKwkgICAgaGFuZGxlci4KKworCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwk8L3hzZDphbm5vdGF0aW9uPgorICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzb2FwLXJvbGUiCisJCSAgIHR5cGU9ImoyZWU6c3RyaW5nIgorCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKwk8eHNkOmFubm90YXRpb24+CisJICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgICAgVGhlIHNvYXAtcm9sZSBlbGVtZW50IGNvbnRhaW5zIGEgU09BUCBhY3RvciBkZWZpbml0aW9uIHRoYXQgdGhlCisJICAgIEhhbmRsZXIgd2lsbCBwbGF5IGFzIGEgcm9sZS4KKworCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwk8L3hzZDphbm5vdGF0aW9uPgorICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXJ2aWNlLWltcGwtYmVhblR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCVRoZSBzZXJ2aWNlLWltcGwtYmVhbiBlbGVtZW50IGRlZmluZXMgdGhlIHdlYiBzZXJ2aWNlIGltcGxlbWVudGF0aW9uLgorCUEgc2VydmljZSBpbXBsZW1lbnRhdGlvbiBjYW4gYmUgYW4gRUpCIGJlYW4gY2xhc3Mgb3IgSkFYLVJQQyB3ZWIKKwljb21wb25lbnQuICBFeGlzdGluZyBFSkIgaW1wbGVtZW50YXRpb25zIGFyZSBleHBvc2VkIGFzIGEgd2ViIHNlcnZpY2UKKwl1c2luZyBhbiBlamItbGluay4KKworCVVzZWQgaW46IHBvcnQtY29tcG9uZW50CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOmNob2ljZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItbGluayIKKwkJICAgdHlwZT0iajJlZTplamItbGlua1R5cGUiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2bGV0LWxpbmsiCisJCSAgIHR5cGU9ImoyZWU6c2VydmxldC1saW5rVHlwZSIvPgorICAgIDwveHNkOmNob2ljZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXJ2bGV0LWxpbmtUeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisJPCFbQ0RBVEFbCisKKwkgIFRoZSBzZXJ2bGV0LWxpbmsgZWxlbWVudCBpcyB1c2VkIGluIHRoZSBzZXJ2aWNlLWltcGwtYmVhbiBlbGVtZW50CisJICB0byBzcGVjaWZ5IHRoYXQgYSBTZXJ2aWNlIEltcGxlbWVudGF0aW9uIEJlYW4gaXMgZGVmaW5lZCBhcyBhCisJICBKQVgtUlBDIFNlcnZpY2UgRW5kcG9pbnQuCisKKwkgIFRoZSB2YWx1ZSBvZiB0aGUgc2VydmxldC1saW5rIGVsZW1lbnQgbXVzdCBiZSB0aGUgc2VydmxldC1uYW1lIG9mCisJICBhIEpBWC1SUEMgU2VydmljZSBFbmRwb2ludCBpbiB0aGUgc2FtZSBXQVIgZmlsZS4KKworCSAgVXNlZCBpbjogc2VydmljZS1pbXBsLWJlYW4KKworCSAgRXhhbXBsZToKKwkJICA8c2VydmxldC1saW5rPlN0b2NrUXVvdGVTZXJ2aWNlPC9zZXJ2bGV0LWxpbms+CisKKwkgIF1dPgorICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciLz4KKyAgICA8L3hzZDpzaW1wbGVDb250ZW50PgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2Vic2VydmljZS1kZXNjcmlwdGlvblR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCVRoZSB3ZWJzZXJ2aWNlLWRlc2NyaXB0aW9uIGVsZW1lbnQgZGVmaW5lcyBhIFdTREwgZG9jdW1lbnQgZmlsZQorCWFuZCB0aGUgc2V0IG9mIFBvcnQgY29tcG9uZW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIFdTREwgcG9ydHMKKwlkZWZpbmVkIGluIHRoZSBXU0RMIGRvY3VtZW50LiAgVGhlcmUgbWF5IGJlIG11bHRpcGxlCisJd2Vic2VydmljZS1kZXNjcmlwdGlvbnMgZGVmaW5lZCB3aXRoaW4gYSBtb2R1bGUuCisKKwlBbGwgV1NETCBmaWxlIHBvcnRzIG11c3QgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgcG9ydC1jb21wb25lbnQgZWxlbWVudAorCWRlZmluZWQuCisKKwlVc2VkIGluOiB3ZWJzZXJ2aWNlcworCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisKKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgorCQkgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNwbGF5LW5hbWUiCisJCSAgIHR5cGU9ImoyZWU6ZGlzcGxheS1uYW1lVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpY29uIgorCQkgICB0eXBlPSJqMmVlOmljb25UeXBlIgorCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndlYnNlcnZpY2UtZGVzY3JpcHRpb24tbmFtZSIKKwkJICAgdHlwZT0iajJlZTpzdHJpbmciPgorCTx4c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgICBUaGUgd2Vic2VydmljZS1kZXNjcmlwdGlvbi1uYW1lIGlkZW50aWZpZXMgdGhlIGNvbGxlY3Rpb24gb2YKKwkgICAgcG9ydC1jb21wb25lbnRzIGFzc29jaWF0ZWQgd2l0aCBhIFdTREwgZmlsZSBhbmQgSkFYLVJQQworCSAgICBtYXBwaW5nLiBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KKworCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwk8L3hzZDphbm5vdGF0aW9uPgorICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3c2RsLWZpbGUiCisJCSAgIHR5cGU9ImoyZWU6cGF0aFR5cGUiPgorCTx4c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgICBUaGUgd3NkbC1maWxlIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBXU0RMIGZpbGUgaW4gdGhlCisJICAgIG1vZHVsZS4gIFRoZSBmaWxlIG5hbWUgaXMgYSByZWxhdGl2ZSBwYXRoIHdpdGhpbiB0aGUgbW9kdWxlLgorCisJICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCTwveHNkOmFubm90YXRpb24+CisgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpheHJwYy1tYXBwaW5nLWZpbGUiCisJCSAgIHR5cGU9ImoyZWU6cGF0aFR5cGUiPgorCTx4c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgICBUaGUgamF4cnBjLW1hcHBpbmctZmlsZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgZmlsZSB0aGF0CisJICAgIGRlc2NyaWJlcyB0aGUgSkFYLVJQQyBtYXBwaW5nIGJldHdlZW4gdGhlIEphdmEgaW50ZXJhY2VzIHVzZWQgYnkKKwkgICAgdGhlIGFwcGxpY2F0aW9uIGFuZCB0aGUgV1NETCBkZXNjcmlwdGlvbiBpbiB0aGUgd3NkbC1maWxlLiAgVGhlCisJICAgIGZpbGUgbmFtZSBpcyBhIHJlbGF0aXZlIHBhdGggd2l0aGluIHRoZSBtb2R1bGUuCisKKwkgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9ydC1jb21wb25lbnQiCisJCSAgIHR5cGU9ImoyZWU6cG9ydC1jb21wb25lbnRUeXBlIgorCQkgICBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKwk8eHNkOmtleSBuYW1lPSJwb3J0LWNvbXBvbmVudF9oYW5kbGVyLW5hbWUta2V5Ij4KKwkgIDx4c2Q6YW5ub3RhdGlvbj4KKwkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICAgICAgRGVmaW5lcyB0aGUgbmFtZSBvZiB0aGUgaGFuZGxlci4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUKKwkgICAgICB3aXRoaW4gdGhlIG1vZHVsZS4KKworCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCSAgPC94c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6aGFuZGxlciIvPgorCSAgPHhzZDpmaWVsZCB4cGF0aD0iajJlZTpoYW5kbGVyLW5hbWUiLz4KKwk8L3hzZDprZXk+CisgICAgICA8L3hzZDplbGVtZW50PgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYnNlcnZpY2VzVHlwZSI+CisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqMmVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3ZWJzZXJ2aWNlLWRlc2NyaXB0aW9uIgorCQkgICB0eXBlPSJqMmVlOndlYnNlcnZpY2UtZGVzY3JpcHRpb25UeXBlIgorCQkgICBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKwk8eHNkOmtleSBuYW1lPSJwb3J0LWNvbXBvbmVudC1uYW1lLWtleSI+CisJICA8eHNkOmFubm90YXRpb24+CisJICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKwkgICAgICA8IVtDREFUQVsKKworCQlUaGUgcG9ydC1jb21wb25lbnQtbmFtZSBlbGVtZW50IHNwZWNpZmllcyBhIHBvcnQKKwkJY29tcG9uZW50J3MgbmFtZS4gIFRoaXMgbmFtZSBpcyBhc3NpZ25lZCBieSB0aGUgbW9kdWxlCisJCXByb2R1Y2VyIHRvIG5hbWUgdGhlIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gYmVhbiBpbiB0aGUKKwkJbW9kdWxlJ3MgZGVwbG95bWVudCBkZXNjcmlwdG9yLiBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZQorCQlhbW9uZyB0aGUgcG9ydCBjb21wb25lbnQgbmFtZXMgZGVmaW5lZCBpbiB0aGUgc2FtZSBtb2R1bGUuCisKKwkJVXNlZCBpbjogcG9ydC1jb21wb25lbnQKKworCQlFeGFtcGxlOgorCQkJPHBvcnQtY29tcG9uZW50LW5hbWU+RW1wbG95ZWVTZXJ2aWNlCisJCQk8L3BvcnQtY29tcG9uZW50LW5hbWU+CisKKwkJXV0+CisJICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisJICA8L3hzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTpwb3J0LWNvbXBvbmVudCIvPgorCSAgPHhzZDpmaWVsZCB4cGF0aD0iajJlZTpwb3J0LWNvbXBvbmVudC1uYW1lIi8+CisJPC94c2Q6a2V5PgorICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKworICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iCisJCSAgIHR5cGU9ImoyZWU6ZGV3ZXktdmVyc2lvblR5cGUiCisJCSAgIGZpeGVkPSIxLjEiCisJCSAgIHVzZT0icmVxdWlyZWQiPgorICAgICAgPHhzZDphbm5vdGF0aW9uPgorCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgVGhlIHJlcXVpcmVkIHZhbHVlIGZvciB0aGUgdmVyc2lvbiBpcyAxLjEuCisKKwk8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8L3hzZDphdHRyaWJ1dGU+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPC94c2Q6c2NoZW1hPgorCmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvZHRkL2oyZWVfd2ViX3NlcnZpY2VzX2NsaWVudF8xXzEueHNkIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2R0ZC9qMmVlX3dlYl9zZXJ2aWNlc19jbGllbnRfMV8xLnhzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWE0YmFlCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2R0ZC9qMmVlX3dlYl9zZXJ2aWNlc19jbGllbnRfMV8xLnhzZApAQCAtMCwwICsxLDM1OCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzx4c2Q6c2NoZW1hIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKKwkgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgorCSAgICB4bWxuczpqMmVlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgorCSAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgorCSAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKKwkgICAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIgorCSAgICB2ZXJzaW9uPSIxLjEiPgorICA8eHNkOmFubm90YXRpb24+CisgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorICAgICAgQCgjKWoyZWVfd2ViX3NlcnZpY2VzX2NsaWVudF8xXzEueHNkcwkxLjEwIDAyLzExLzAzCisgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgPC94c2Q6YW5ub3RhdGlvbj4KKworICA8eHNkOmFubm90YXRpb24+CisgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICBDb3B5cmlnaHQgMjAwMiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA5MDEgU2FuIEFudG9uaW8KKyAgICAgIFJvYWQsIFBhbG8gQWx0bywgQ2FsaWZvcm5pYSA5NDMwMywgVS5TLkEuIEFsbCByaWdodHMKKyAgICAgIHJlc2VydmVkLgorCisgICAgICBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGhhcyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCisgICAgICByZWxhdGluZyB0byB0ZWNobm9sb2d5IGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LiBJbgorICAgICAgcGFydGljdWxhciwgYW5kIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlc2UgaW50ZWxsZWN0dWFsCisgICAgICBwcm9wZXJ0eSByaWdodHMgbWF5IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIFUuUy4gcGF0ZW50cworICAgICAgbGlzdGVkIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGFuZCBvbmUgb3IgbW9yZQorICAgICAgYWRkaXRpb25hbCBwYXRlbnRzIG9yIHBlbmRpbmcgcGF0ZW50IGFwcGxpY2F0aW9ucyBpbiB0aGUKKyAgICAgIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KKworICAgICAgVGhpcyBkb2N1bWVudCBhbmQgdGhlIHRlY2hub2xvZ3kgd2hpY2ggaXQgZGVzY3JpYmVzIGFyZQorICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgdGhlaXIgdXNlLCBjb3B5aW5nLAorICAgICAgZGlzdHJpYnV0aW9uLCBhbmQgZGVjb21waWxhdGlvbi4gTm8gcGFydCBvZiB0aGlzIGRvY3VtZW50CisgICAgICBtYXkgYmUgcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvcgorICAgICAgd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LgorCisgICAgICBUaGlyZC1wYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMKKyAgICAgIGNvcHlyaWdodGVkIGFuZCBsaWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuCisKKyAgICAgIFN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBsb2dvLCBTb2xhcmlzLCBKYXZhLCBKMkVFLAorICAgICAgSmF2YVNlcnZlciBQYWdlcywgRW50ZXJwcmlzZSBKYXZhQmVhbnMgYW5kIHRoZSBKYXZhIENvZmZlZQorICAgICAgQ3VwIGxvZ28gYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1bgorICAgICAgTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCisKKyAgICAgIEZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycworICAgICAgU3ViamVjdCB0byBTdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgorCisgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgPHhzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgKEMpIENvcHlyaWdodCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIDIwMDIKKworICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgIDwveHNkOmFubm90YXRpb24+CisKKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icG9ydC1jb21wb25lbnQtcmVmVHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJVGhlIHBvcnQtY29tcG9uZW50LXJlZiBlbGVtZW50IGRlY2xhcmVzIGEgY2xpZW50IGRlcGVuZGVuY3kKKwlvbiB0aGUgY29udGFpbmVyIGZvciByZXNvbHZpbmcgYSBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZQorCXRvIGEgV1NETCBwb3J0LiBJdCBvcHRpb25hbGx5IGFzc29jaWF0ZXMgdGhlIFNlcnZpY2UgRW5kcG9pbnQKKwlJbnRlcmZhY2Ugd2l0aCBhIHBhcnRpY3VsYXIgcG9ydC1jb21wb25lbnQuIFRoaXMgaXMgb25seSB1c2VkCisJYnkgdGhlIGNvbnRhaW5lciBmb3IgYSBTZXJ2aWNlLmdldFBvcnQoQ2xhc3MpIG1ldGhvZCBjYWxsLgorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisKKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZpY2UtZW5kcG9pbnQtaW50ZXJmYWNlIgorCQkgICB0eXBlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgorCTx4c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgICBUaGUgc2VydmljZS1lbmRwb2ludC1pbnRlcmZhY2UgZWxlbWVudCBkZWZpbmVzIGEgZnVsbHkgcXVhbGlmaWVkCisJICAgIEphdmEgY2xhc3MgdGhhdCByZXByZXNlbnRzIHRoZSBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZSBvZiBhCisJICAgIFdTREwgcG9ydC4KKworCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwk8L3hzZDphbm5vdGF0aW9uPgorICAgICAgPC94c2Q6ZWxlbWVudD4KKworICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvcnQtY29tcG9uZW50LWxpbmsiCisJCSAgIHR5cGU9ImoyZWU6c3RyaW5nIgorCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSI+CisJPHhzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICAgIFRoZSBwb3J0LWNvbXBvbmVudC1saW5rIGVsZW1lbnQgbGlua3MgYSBwb3J0LWNvbXBvbmVudC1yZWYKKwkgICAgdG8gYSBzcGVjaWZpYyBwb3J0LWNvbXBvbmVudCByZXF1aXJlZCB0byBiZSBtYWRlIGF2YWlsYWJsZQorCSAgICBieSBhIHNlcnZpY2UgcmVmZXJlbmNlLgorCisJICAgIFRoZSB2YWx1ZSBvZiBhIHBvcnQtY29tcG9uZW50LWxpbmsgbXVzdCBiZSB0aGUKKwkgICAgcG9ydC1jb21wb25lbnQtbmFtZSBvZiBhIHBvcnQtY29tcG9uZW50IGluIHRoZSBzYW1lIG1vZHVsZQorCSAgICBvciBhbm90aGVyIG1vZHVsZSBpbiB0aGUgc2FtZSBhcHBsaWNhdGlvbiB1bml0LiBUaGUgc3ludGF4CisJICAgIGZvciBzcGVjaWZpY2F0aW9uIGZvbGxvd3MgdGhlIHN5bnRheCBkZWZpbmVkIGZvciBlamItbGluaworCSAgICBpbiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgorCisJICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCTwveHNkOmFubm90YXRpb24+CisgICAgICA8L3hzZDplbGVtZW50PgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmdyb3VwIG5hbWU9InNlcnZpY2UtcmVmR3JvdXAiPgorICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmljZS1yZWYiCisJCSAgIHR5cGU9ImoyZWU6c2VydmljZS1yZWZUeXBlIgorCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKwk8eHNkOmtleSBuYW1lPSJzZXJ2aWNlLXJlZl9oYW5kbGVyLW5hbWUta2V5Ij4KKwkgIDx4c2Q6YW5ub3RhdGlvbj4KKwkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICAgICAgRGVmaW5lcyB0aGUgbmFtZSBvZiB0aGUgaGFuZGxlci4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUKKwkgICAgICB3aXRoaW4gdGhlIG1vZHVsZS4KKworCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCSAgPC94c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6aGFuZGxlciIvPgorCSAgPHhzZDpmaWVsZCB4cGF0aD0iajJlZTpoYW5kbGVyLW5hbWUiLz4KKwk8L3hzZDprZXk+CisgICAgICA8L3hzZDplbGVtZW50PgorICAgIDwveHNkOnNlcXVlbmNlPgorICA8L3hzZDpncm91cD4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VydmljZS1yZWZUeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwlUaGUgc2VydmljZS1yZWYgZWxlbWVudCBkZWNsYXJlcyBhIHJlZmVyZW5jZSB0byBhIFdlYgorCXNlcnZpY2UuIEl0IGNvbnRhaW5zIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCBkaXNwbGF5IG5hbWUgYW5kCisJaWNvbnMsIGEgZGVjbGFyYXRpb24gb2YgdGhlIHJlcXVpcmVkIFNlcnZpY2UgaW50ZXJmYWNlLAorCWFuIG9wdGlvbmFsIFdTREwgZG9jdW1lbnQgbG9jYXRpb24sIGFuIG9wdGlvbmFsIHNldAorCW9mIEpBWC1SUEMgbWFwcGluZ3MsIGFuIG9wdGlvbmFsIFFOYW1lIGZvciB0aGUgc2VydmljZSBlbGVtZW50LAorCWFuIG9wdGlvbmFsIHNldCBvZiBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZXMgdG8gYmUgcmVzb2x2ZWQKKwlieSB0aGUgY29udGFpbmVyIHRvIGEgV1NETCBwb3J0LCBhbmQgYW4gb3B0aW9uYWwgc2V0IG9mIGhhbmRsZXJzLgorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisKKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDpncm91cCByZWY9ImoyZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZpY2UtcmVmLW5hbWUiCisJCSAgIHR5cGU9ImoyZWU6am5kaS1uYW1lVHlwZSI+CisJPHhzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICAgIFRoZSBzZXJ2aWNlLXJlZi1uYW1lIGVsZW1lbnQgZGVjbGFyZXMgbG9naWNhbCBuYW1lIHRoYXQgdGhlCisJICAgIGNvbXBvbmVudHMgaW4gdGhlIG1vZHVsZSB1c2UgdG8gbG9vayB1cCB0aGUgV2ViIHNlcnZpY2UuIEl0CisJICAgIGlzIHJlY29tbWVuZGVkIHRoYXQgYWxsIHNlcnZpY2UgcmVmZXJlbmNlIG5hbWVzIHN0YXJ0IHdpdGgKKwkgICAgInNlcnZpY2UvIi4KKworCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwk8L3hzZDphbm5vdGF0aW9uPgorICAgICAgPC94c2Q6ZWxlbWVudD4KKworICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZpY2UtaW50ZXJmYWNlIgorCQkgICB0eXBlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgorCTx4c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgICBUaGUgc2VydmljZS1pbnRlcmZhY2UgZWxlbWVudCBkZWNsYXJlcyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzCisJICAgIG5hbWUgb2YgdGhlIEpBWC1SUEMgU2VydmljZSBpbnRlcmZhY2UgdGhlIGNsaWVudCBkZXBlbmRzIG9uLgorCSAgICBJbiBtb3N0IGNhc2VzIHRoZSB2YWx1ZSB3aWxsIGJlIGphdmF4LnhtbC5ycGMuU2VydmljZS4gIEEgSkFYLVJQQworCSAgICBnZW5lcmF0ZWQgU2VydmljZSBJbnRlcmZhY2UgY2xhc3MgbWF5IGFsc28gYmUgc3BlY2lmaWVkLgorCisJICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCTwveHNkOmFubm90YXRpb24+CisgICAgICA8L3hzZDplbGVtZW50PgorCisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0id3NkbC1maWxlIgorCQkgICB0eXBlPSJqMmVlOnhzZEFueVVSSVR5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIj4KKwk8eHNkOmFubm90YXRpb24+CisJICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgICAgVGhlIHdzZGwtZmlsZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBVUkkgbG9jYXRpb24gb2YgYSBXU0RMCisJICAgIGZpbGUuIFRoZSBsb2NhdGlvbiBpcyByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUgbW9kdWxlLgorCisJICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCTwveHNkOmFubm90YXRpb24+CisgICAgICA8L3hzZDplbGVtZW50PgorCisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iamF4cnBjLW1hcHBpbmctZmlsZSIKKwkJICAgdHlwZT0iajJlZTpwYXRoVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiPgorCTx4c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgICBUaGUgamF4cnBjLW1hcHBpbmctZmlsZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgZmlsZSB0aGF0CisJICAgIGRlc2NyaWJlcyB0aGUgSkFYLVJQQyBtYXBwaW5nIGJldHdlZW4gdGhlIEphdmEgaW50ZXJhY2VzIHVzZWQgYnkKKwkgICAgdGhlIGFwcGxpY2F0aW9uIGFuZCB0aGUgV1NETCBkZXNjcmlwdGlvbiBpbiB0aGUgd3NkbC1maWxlLiAgVGhlCisJICAgIGZpbGUgbmFtZSBpcyBhIHJlbGF0aXZlIHBhdGggd2l0aGluIHRoZSBtb2R1bGUgZmlsZS4KKworCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwk8L3hzZDphbm5vdGF0aW9uPgorICAgICAgPC94c2Q6ZWxlbWVudD4KKworICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZpY2UtcW5hbWUiCisJCSAgIHR5cGU9ImoyZWU6eHNkUU5hbWVUeXBlIgorCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSI+CisJPHhzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICAgIFRoZSBzZXJ2aWNlLXFuYW1lIGVsZW1lbnQgZGVjbGFyZXMgdGhlIHNwZWNpZmljIFdTREwgc2VydmljZQorCSAgICBlbGVtZW50IHRoYXQgaXMgYmVpbmcgcmVmZXJlZCB0by4gIEl0IGlzIG5vdCBzcGVjaWZpZWQgaWYgbm8KKwkgICAgd3NkbC1maWxlIGlzIGRlY2xhcmVkLgorCisJICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCTwveHNkOmFubm90YXRpb24+CisgICAgICA8L3hzZDplbGVtZW50PgorCisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9ydC1jb21wb25lbnQtcmVmIgorCQkgICB0eXBlPSJqMmVlOnBvcnQtY29tcG9uZW50LXJlZlR5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorCTx4c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgICBUaGUgcG9ydC1jb21wb25lbnQtcmVmIGVsZW1lbnQgZGVjbGFyZXMgYSBjbGllbnQgZGVwZW5kZW5jeQorCSAgICBvbiB0aGUgY29udGFpbmVyIGZvciByZXNvbHZpbmcgYSBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZQorCSAgICB0byBhIFdTREwgcG9ydC4gSXQgb3B0aW9uYWxseSBhc3NvY2lhdGVzIHRoZSBTZXJ2aWNlIEVuZHBvaW50CisJICAgIEludGVyZmFjZSB3aXRoIGEgcGFydGljdWxhciBwb3J0LWNvbXBvbmVudC4gVGhpcyBpcyBvbmx5IHVzZWQKKwkgICAgYnkgdGhlIGNvbnRhaW5lciBmb3IgYSBTZXJ2aWNlLmdldFBvcnQoQ2xhc3MpIG1ldGhvZCBjYWxsLgorCisJICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCTwveHNkOmFubm90YXRpb24+CisgICAgICA8L3hzZDplbGVtZW50PgorCisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaGFuZGxlciIKKwkJICAgdHlwZT0iajJlZTpzZXJ2aWNlLXJlZl9oYW5kbGVyVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisJPHhzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICAgIERlY2xhcmVzIHRoZSBoYW5kbGVyIGZvciBhIHBvcnQtY29tcG9uZW50LiBIYW5kbGVycyBjYW4KKwkgICAgYWNjZXNzIHRoZSBpbml0LXBhcmFtIG5hbWUvdmFsdWUgcGFpcnMgdXNpbmcgdGhlCisJICAgIEhhbmRsZXJJbmZvIGludGVyZmFjZS4gSWYgcG9ydC1uYW1lIGlzIG5vdCBzcGVjaWZpZWQsIHRoZQorCSAgICBoYW5kbGVyIGlzIGFzc3VtZWQgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIGFsbCBwb3J0cyBvZiB0aGUKKwkgICAgc2VydmljZS4KKworCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwk8L3hzZDphbm5vdGF0aW9uPgorICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXJ2aWNlLXJlZl9oYW5kbGVyVHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJRGVjbGFyZXMgdGhlIGhhbmRsZXIgZm9yIGEgcG9ydC1jb21wb25lbnQuIEhhbmRsZXJzIGNhbiBhY2Nlc3MgdGhlCisJaW5pdC1wYXJhbSBuYW1lL3ZhbHVlIHBhaXJzIHVzaW5nIHRoZSBIYW5kbGVySW5mbyBpbnRlcmZhY2UuIElmCisJcG9ydC1uYW1lIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBoYW5kbGVyIGlzIGFzc3VtZWQgdG8gYmUgYXNzb2NpYXRlZAorCXdpdGggYWxsIHBvcnRzIG9mIHRoZSBzZXJ2aWNlLgorCisJVXNlZCBpbjogc2VydmljZS1yZWYKKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmdyb3VwIHJlZj0iajJlZTpkZXNjcmlwdGlvbkdyb3VwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaGFuZGxlci1uYW1lIgorCQkgICB0eXBlPSJqMmVlOnN0cmluZyI+CisJPHhzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICAgIERlZmluZXMgdGhlIG5hbWUgb2YgdGhlIGhhbmRsZXIuIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlCisJICAgIHdpdGhpbiB0aGUgbW9kdWxlLgorCisJICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCTwveHNkOmFubm90YXRpb24+CisgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImhhbmRsZXItY2xhc3MiCisJCSAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+CisJPHhzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICAgIERlZmluZXMgYSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBmb3IgdGhlIGhhbmRsZXIKKwkgICAgaW1wbGVtZW50YXRpb24uCisKKwkgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5pdC1wYXJhbSIKKwkJICAgdHlwZT0iajJlZTpwYXJhbS12YWx1ZVR5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKworICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNvYXAtaGVhZGVyIgorCQkgICB0eXBlPSJqMmVlOnhzZFFOYW1lVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisJPHhzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICAgIERlZmluZXMgdGhlIFFOYW1lIG9mIGEgU09BUCBoZWFkZXIgdGhhdCB3aWxsIGJlIHByb2Nlc3NlZAorCSAgICBieSB0aGUgaGFuZGxlci4KKworCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwk8L3hzZDphbm5vdGF0aW9uPgorICAgICAgPC94c2Q6ZWxlbWVudD4KKworICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNvYXAtcm9sZSIKKwkJICAgdHlwZT0iajJlZTpzdHJpbmciCisJCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorCTx4c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgICBUaGUgc29hcC1yb2xlIGVsZW1lbnQgY29udGFpbnMgYSBTT0FQIGFjdG9yIGRlZmluaXRpb24gdGhhdAorCSAgICB0aGUgSGFuZGxlciB3aWxsIHBsYXkgYXMgYSByb2xlLgorCisJICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCTwveHNkOmFubm90YXRpb24+CisgICAgICA8L3hzZDplbGVtZW50PgorCisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9ydC1uYW1lIgorCQkgICB0eXBlPSJqMmVlOnN0cmluZyIKKwkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisJPHhzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICAgIFRoZSBwb3J0LW5hbWUgZWxlbWVudCBkZWZpbmVzIHRoZSBXU0RMIHBvcnQtbmFtZSB0aGF0IGEKKwkgICAgaGFuZGxlciBzaG91bGQgYmUgYXNzb2NpYXRlZCB3aXRoLgorCisJICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCTwveHNkOmFubm90YXRpb24+CisgICAgICA8L3hzZDplbGVtZW50PgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwveHNkOnNjaGVtYT4KKwpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2R0ZC9qc3BfMl8wLnhzZCBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9kdGQvanNwXzJfMC54c2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk5YmJhYQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9kdGQvanNwXzJfMC54c2QKQEAgLTAsMCArMSwzMjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8eHNkOnNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCisJICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKKwkgICAgeG1sbnM6ajJlZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKKwkgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKKwkgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCisJICAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKKwkgICAgdmVyc2lvbj0iMi4wIj4KKyAgPHhzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICAgIEAoIylqc3BfMl8wLnhzZHMJMS4xNyAwMy8xOC8wMworICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgIDwveHNkOmFubm90YXRpb24+CisKKyAgPHhzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgQ29weXJpZ2h0IDIwMDIgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgOTAxIFNhbiBBbnRvbmlvCisgICAgICBSb2FkLCBQYWxvIEFsdG8sIENhbGlmb3JuaWEgOTQzMDMsIFUuUy5BLiBBbGwgcmlnaHRzCisgICAgICByZXNlcnZlZC4KKworICAgICAgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBoYXMgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cworICAgICAgcmVsYXRpbmcgdG8gdGVjaG5vbG9neSBkZXNjcmliZWQgaW4gdGhpcyBkb2N1bWVudC4gSW4KKyAgICAgIHBhcnRpY3VsYXIsIGFuZCB3aXRob3V0IGxpbWl0YXRpb24sIHRoZXNlIGludGVsbGVjdHVhbAorICAgICAgcHJvcGVydHkgcmlnaHRzIG1heSBpbmNsdWRlIG9uZSBvciBtb3JlIG9mIHRoZSBVLlMuIHBhdGVudHMKKyAgICAgIGxpc3RlZCBhdCBodHRwOi8vd3d3LnN1bi5jb20vcGF0ZW50cyBhbmQgb25lIG9yIG1vcmUKKyAgICAgIGFkZGl0aW9uYWwgcGF0ZW50cyBvciBwZW5kaW5nIHBhdGVudCBhcHBsaWNhdGlvbnMgaW4gdGhlCisgICAgICBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCisKKyAgICAgIFRoaXMgZG9jdW1lbnQgYW5kIHRoZSB0ZWNobm9sb2d5IHdoaWNoIGl0IGRlc2NyaWJlcyBhcmUKKyAgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIGxpY2Vuc2VzIHJlc3RyaWN0aW5nIHRoZWlyIHVzZSwgY29weWluZywKKyAgICAgIGRpc3RyaWJ1dGlvbiwgYW5kIGRlY29tcGlsYXRpb24uIE5vIHBhcnQgb2YgdGhpcyBkb2N1bWVudAorICAgICAgbWF5IGJlIHJlcHJvZHVjZWQgaW4gYW55IGZvcm0gYnkgYW55IG1lYW5zIHdpdGhvdXQgcHJpb3IKKyAgICAgIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBvZiBTdW4gYW5kIGl0cyBsaWNlbnNvcnMsIGlmIGFueS4KKworICAgICAgVGhpcmQtcGFydHkgc29mdHdhcmUsIGluY2x1ZGluZyBmb250IHRlY2hub2xvZ3ksIGlzCisgICAgICBjb3B5cmlnaHRlZCBhbmQgbGljZW5zZWQgZnJvbSBTdW4gc3VwcGxpZXJzLgorCisgICAgICBTdW4sIFN1biBNaWNyb3N5c3RlbXMsIHRoZSBTdW4gbG9nbywgU29sYXJpcywgSmF2YSwgSjJFRSwKKyAgICAgIEphdmFTZXJ2ZXIgUGFnZXMsIEVudGVycHJpc2UgSmF2YUJlYW5zIGFuZCB0aGUgSmF2YSBDb2ZmZWUKKyAgICAgIEN1cCBsb2dvIGFyZSB0cmFkZW1hcmtzIG9yIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiBTdW4KKyAgICAgIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgorCisgICAgICBGZWRlcmFsIEFjcXVpc2l0aW9uczogQ29tbWVyY2lhbCBTb2Z0d2FyZSAtIEdvdmVybm1lbnQgVXNlcnMKKyAgICAgIFN1YmplY3QgdG8gU3RhbmRhcmQgTGljZW5zZSBUZXJtcyBhbmQgQ29uZGl0aW9ucy4KKworICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgIDwveHNkOmFubm90YXRpb24+CisKKyAgPHhzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgVGhpcyBpcyB0aGUgWE1MIFNjaGVtYSBmb3IgdGhlIEpTUCAyLjAgZGVwbG95bWVudCBkZXNjcmlwdG9yCisgICAgICB0eXBlcy4gIFRoZSBKU1AgMi4wIHNjaGVtYSBjb250YWlucyBhbGwgdGhlIHNwZWNpYWwKKyAgICAgIHN0cnVjdHVyZXMgYW5kIGRhdGF0eXBlcyB0aGF0IGFyZSBuZWNlc3NhcnkgdG8gdXNlIEpTUCBmaWxlcworICAgICAgZnJvbSBhIHdlYiBhcHBsaWNhdGlvbi4KKworICAgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgc2NoZW1hIGlzIHVzZWQgYnkgdGhlIHdlYi1hcHBfMl80LnhzZAorICAgICAgZmlsZSB0byBkZWZpbmUgSlNQIHNwZWNpZmljIGNvbnRlbnQuCisKKyAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICA8L3hzZDphbm5vdGF0aW9uPgorCisgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKyAgICAgIFRoZSBmb2xsb3dpbmcgY29udmVudGlvbnMgYXBwbHkgdG8gYWxsIEoyRUUKKyAgICAgIGRlcGxveW1lbnQgZGVzY3JpcHRvciBlbGVtZW50cyB1bmxlc3MgaW5kaWNhdGVkIG90aGVyd2lzZS4KKworICAgICAgLSBJbiBlbGVtZW50cyB0aGF0IHNwZWNpZnkgYSBwYXRobmFtZSB0byBhIGZpbGUgd2l0aGluIHRoZQorCXNhbWUgSkFSIGZpbGUsIHJlbGF0aXZlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2Ugbm90CisJc3RhcnRpbmcgd2l0aCAiLyIpIGFyZSBjb25zaWRlcmVkIHJlbGF0aXZlIHRvIHRoZSByb290IG9mCisJdGhlIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgQWJzb2x1dGUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZQorCXN0YXJ0aW5nIHdpdGggIi8iKSBhbHNvIHNwZWNpZnkgbmFtZXMgaW4gdGhlIHJvb3Qgb2YgdGhlCisJSkFSIGZpbGUncyBuYW1lc3BhY2UuICBJbiBnZW5lcmFsLCByZWxhdGl2ZSBuYW1lcyBhcmUKKwlwcmVmZXJyZWQuICBUaGUgZXhjZXB0aW9uIGlzIC53YXIgZmlsZXMgd2hlcmUgYWJzb2x1dGUKKwluYW1lcyBhcmUgcHJlZmVycmVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBTZXJ2bGV0IEFQSS4KKworICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgIDwveHNkOmFubm90YXRpb24+CisKKyAgPHhzZDppbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJqMmVlXzFfNC54c2QiLz4KKworCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJqc3AtY29uZmlnVHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJVGhlIGpzcC1jb25maWdUeXBlIGlzIHVzZWQgdG8gcHJvdmlkZSBnbG9iYWwgY29uZmlndXJhdGlvbgorCWluZm9ybWF0aW9uIGZvciB0aGUgSlNQIGZpbGVzIGluIGEgd2ViIGFwcGxpY2F0aW9uLiBJdCBoYXMKKwl0d28gc3ViZWxlbWVudHMsIHRhZ2xpYiBhbmQganNwLXByb3BlcnR5LWdyb3VwLgorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisKKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhZ2xpYiIKKwkJICAgdHlwZT0iajJlZTp0YWdsaWJUeXBlIgorCQkgICBtaW5PY2N1cnM9IjAiCisJCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ianNwLXByb3BlcnR5LWdyb3VwIgorCQkgICB0eXBlPSJqMmVlOmpzcC1wcm9wZXJ0eS1ncm91cFR5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCIKKwkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJqc3AtZmlsZVR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCVRoZSBqc3AtZmlsZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxsIHBhdGggdG8gYSBKU1AgZmlsZQorCXdpdGhpbiB0aGUgd2ViIGFwcGxpY2F0aW9uIGJlZ2lubmluZyB3aXRoIGEgYC8nLgorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisKKyAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+CisgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6cGF0aFR5cGUiLz4KKyAgICA8L3hzZDpzaW1wbGVDb250ZW50PgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ianNwLXByb3BlcnR5LWdyb3VwVHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJVGhlIGpzcC1wcm9wZXJ0eS1ncm91cFR5cGUgaXMgdXNlZCB0byBncm91cCBhIG51bWJlciBvZgorCWZpbGVzIHNvIHRoZXkgY2FuIGJlIGdpdmVuIGdsb2JhbCBwcm9wZXJ0eSBpbmZvcm1hdGlvbi4KKwlBbGwgZmlsZXMgc28gZGVzY3JpYmVkIGFyZSBkZWVtZWQgdG8gYmUgSlNQIGZpbGVzLiAgVGhlCisJZm9sbG93aW5nIGFkZGl0aW9uYWwgcHJvcGVydGllcyBjYW4gYmUgZGVzY3JpYmVkOgorCisJICAgIC0gQ29udHJvbCB3aGV0aGVyIEVMIGlzIGlnbm9yZWQKKwkgICAgLSBDb250cm9sIHdoZXRoZXIgc2NyaXB0aW5nIGVsZW1lbnRzIGFyZSBpbnZhbGlkCisJICAgIC0gSW5kaWNhdGUgcGFnZUVuY29kaW5nIGluZm9ybWF0aW9uLgorCSAgICAtIEluZGljYXRlIHRoYXQgYSByZXNvdXJjZSBpcyBhIEpTUCBkb2N1bWVudCAoWE1MKQorCSAgICAtIFByZWx1ZGUgYW5kIENvZGEgYXV0b21hdGljIGluY2x1ZGVzLgorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisKKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDpncm91cCByZWY9ImoyZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVybC1wYXR0ZXJuIgorCQkgICB0eXBlPSJqMmVlOnVybC1wYXR0ZXJuVHlwZSIKKwkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbC1pZ25vcmVkIgorCQkgICB0eXBlPSJqMmVlOnRydWUtZmFsc2VUeXBlIgorCQkgICBtaW5PY2N1cnM9IjAiPgorCTx4c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgICBDYW4gYmUgdXNlZCB0byBlYXNpbHkgc2V0IHRoZSBpc0VMSWdub3JlZAorCSAgICBwcm9wZXJ0eSBvZiBhIGdyb3VwIG9mIEpTUCBwYWdlcy4gIEJ5IGRlZmF1bHQsIHRoZQorCSAgICBFTCBldmFsdWF0aW9uIGlzIGVuYWJsZWQgZm9yIFdlYiBBcHBsaWNhdGlvbnMgdXNpbmcKKwkgICAgYSBTZXJ2bGV0IDIuNCBvciBncmVhdGVyIHdlYi54bWwsIGFuZCBkaXNhYmxlZAorCSAgICBvdGhlcndpc2UuCisKKwkgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFnZS1lbmNvZGluZyIKKwkJICAgdHlwZT0iajJlZTpzdHJpbmciCisJCSAgIG1pbk9jY3Vycz0iMCI+CisJPHhzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICAgIFRoZSB2YWxpZCB2YWx1ZXMgb2YgcGFnZS1lbmNvZGluZyBhcmUgdGhvc2Ugb2YgdGhlCisJICAgIHBhZ2VFbmNvZGluZyBwYWdlIGRpcmVjdGl2ZS4gIEl0IGlzIGEKKwkgICAgdHJhbnNsYXRpb24tdGltZSBlcnJvciB0byBuYW1lIGRpZmZlcmVudCBlbmNvZGluZ3MKKwkgICAgaW4gdGhlIHBhZ2VFbmNvZGluZyBhdHRyaWJ1dGUgb2YgdGhlIHBhZ2UgZGlyZWN0aXZlCisJICAgIG9mIGEgSlNQIHBhZ2UgYW5kIGluIGEgSlNQIGNvbmZpZ3VyYXRpb24gZWxlbWVudAorCSAgICBtYXRjaGluZyB0aGUgcGFnZS4gIEl0IGlzIGFsc28gYSB0cmFuc2xhdGlvbi10aW1lCisJICAgIGVycm9yIHRvIG5hbWUgZGlmZmVyZW50IGVuY29kaW5ncyBpbiB0aGUgcHJvbG9nCisJICAgIG9yIHRleHQgZGVjbGFyYXRpb24gb2YgYSBkb2N1bWVudCBpbiBYTUwgc3ludGF4IGFuZAorCSAgICBpbiBhIEpTUCBjb25maWd1cmF0aW9uIGVsZW1lbnQgbWF0Y2hpbmcgdGhlIGRvY3VtZW50LgorCSAgICBJdCBpcyBsZWdhbCB0byBuYW1lIHRoZSBzYW1lIGVuY29kaW5nIHRocm91Z2gKKwkgICAgbXVsaXRwbGUgbWVjaGFuaXNtcy4KKworCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwk8L3hzZDphbm5vdGF0aW9uPgorICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzY3JpcHRpbmctaW52YWxpZCIKKwkJICAgdHlwZT0iajJlZTp0cnVlLWZhbHNlVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIj4KKwk8eHNkOmFubm90YXRpb24+CisJICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgICAgQ2FuIGJlIHVzZWQgdG8gZWFzaWx5IGRpc2FibGUgc2NyaXB0aW5nIGluIGEKKwkgICAgZ3JvdXAgb2YgSlNQIHBhZ2VzLiAgQnkgZGVmYXVsdCwgc2NyaXB0aW5nIGlzCisJICAgIGVuYWJsZWQuCisKKwkgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaXMteG1sIgorCQkgICB0eXBlPSJqMmVlOnRydWUtZmFsc2VUeXBlIgorCQkgICBtaW5PY2N1cnM9IjAiPgorCTx4c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgICBJZiB0cnVlLCBkZW5vdGVzIHRoYXQgdGhlIGdyb3VwIG9mIHJlc291cmNlcworCSAgICB0aGF0IG1hdGNoIHRoZSBVUkwgcGF0dGVybiBhcmUgSlNQIGRvY3VtZW50cywKKwkgICAgYW5kIHRodXMgbXVzdCBiZSBpbnRlcnByZXRlZCBhcyBYTUwgZG9jdW1lbnRzLgorCSAgICBJZiBmYWxzZSwgdGhlIHJlc291cmNlcyBhcmUgYXNzdW1lZCB0byBub3QKKwkgICAgYmUgSlNQIGRvY3VtZW50cywgdW5sZXNzIHRoZXJlIGlzIGFub3RoZXIKKwkgICAgcHJvcGVydHkgZ3JvdXAgdGhhdCBpbmRpY2F0ZXMgb3RoZXJ3aXNlLgorCisJICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCTwveHNkOmFubm90YXRpb24+CisgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImluY2x1ZGUtcHJlbHVkZSIKKwkJICAgdHlwZT0iajJlZTpwYXRoVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIgorCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisJPHhzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICAgIFRoZSBpbmNsdWRlLXByZWx1ZGUgZWxlbWVudCBpcyBhIGNvbnRleHQtcmVsYXRpdmUKKwkgICAgcGF0aCB0aGF0IG11c3QgY29ycmVzcG9uZCB0byBhbiBlbGVtZW50IGluIHRoZQorCSAgICBXZWIgQXBwbGljYXRpb24uICBXaGVuIHRoZSBlbGVtZW50IGlzIHByZXNlbnQsCisJICAgIHRoZSBnaXZlbiBwYXRoIHdpbGwgYmUgYXV0b21hdGljYWxseSBpbmNsdWRlZCAoYXMKKwkgICAgaW4gYW4gaW5jbHVkZSBkaXJlY3RpdmUpIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaAorCSAgICBKU1AgcGFnZSBpbiB0aGlzIGpzcC1wcm9wZXJ0eS1ncm91cC4KKworCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwk8L3hzZDphbm5vdGF0aW9uPgorICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbmNsdWRlLWNvZGEiCisJCSAgIHR5cGU9ImoyZWU6cGF0aFR5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCIKKwkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorCTx4c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgICBUaGUgaW5jbHVkZS1jb2RhIGVsZW1lbnQgaXMgYSBjb250ZXh0LXJlbGF0aXZlCisJICAgIHBhdGggdGhhdCBtdXN0IGNvcnJlc3BvbmQgdG8gYW4gZWxlbWVudCBpbiB0aGUKKwkgICAgV2ViIEFwcGxpY2F0aW9uLiAgV2hlbiB0aGUgZWxlbWVudCBpcyBwcmVzZW50LAorCSAgICB0aGUgZ2l2ZW4gcGF0aCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgaW5jbHVkZWQgKGFzCisJICAgIGluIGFuIGluY2x1ZGUgZGlyZWN0aXZlKSBhdCB0aGUgZW5kIG9mIGVhY2gKKwkgICAgSlNQIHBhZ2UgaW4gdGhpcyBqc3AtcHJvcGVydHktZ3JvdXAuCisKKwkgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGFnbGliVHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJVGhlIHRhZ2xpYlR5cGUgZGVmaW5lcyB0aGUgc3ludGF4IGZvciBkZWNsYXJpbmcgaW4KKwl0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIHRoYXQgYSB0YWcgbGlicmFyeSBpcworCWF2YWlsYWJsZSB0byB0aGUgYXBwbGljYXRpb24uICBUaGlzIGNhbiBiZSBkb25lCisJdG8gb3ZlcnJpZGUgaW1wbGljaXQgbWFwIGVudHJpZXMgZnJvbSBUTEQgZmlsZXMgYW5kCisJZnJvbSB0aGUgY29udGFpbmVyLgorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisKKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhZ2xpYi11cmkiCisJCSAgIHR5cGU9ImoyZWU6c3RyaW5nIj4KKwk8eHNkOmFubm90YXRpb24+CisJICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgICAgQSB0YWdsaWItdXJpIGVsZW1lbnQgZGVzY3JpYmVzIGEgVVJJIGlkZW50aWZ5aW5nIGEKKwkgICAgdGFnIGxpYnJhcnkgdXNlZCBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uLiAgVGhlIGJvZHkKKwkgICAgb2YgdGhlIHRhZ2xpYi11cmkgZWxlbWVudCBtYXkgYmUgZWl0aGVyIGFuCisJICAgIGFic29sdXRlIFVSSSBzcGVjaWZpY2F0aW9uLCBvciBhIHJlbGF0aXZlIFVSSS4KKwkgICAgVGhlcmUgc2hvdWxkIGJlIG5vIGVudHJpZXMgaW4gd2ViLnhtbCB3aXRoIHRoZQorCSAgICBzYW1lIHRhZ2xpYi11cmkgdmFsdWUuCisKKwkgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDwveHNkOmVsZW1lbnQ+CisKKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWdsaWItbG9jYXRpb24iCisJCSAgIHR5cGU9ImoyZWU6cGF0aFR5cGUiPgorCTx4c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgICB0aGUgdGFnbGliLWxvY2F0aW9uIGVsZW1lbnQgY29udGFpbnMgdGhlIGxvY2F0aW9uCisJICAgIChhcyBhIHJlc291cmNlIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSB3ZWIKKwkgICAgYXBwbGljYXRpb24pIHdoZXJlIHRvIGZpbmQgdGhlIFRhZyBMaWJyYXJ5CisJICAgIERlc2NyaXB0aW9uIGZpbGUgZm9yIHRoZSB0YWcgbGlicmFyeS4KKworCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwk8L3hzZDphbm5vdGF0aW9uPgorICAgICAgPC94c2Q6ZWxlbWVudD4KKworICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwveHNkOnNjaGVtYT4KKwpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2R0ZC9qc3B4bWwuZHRkIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2R0ZC9qc3B4bWwuZHRkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmZmUwNDYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvZHRkL2pzcHhtbC5kdGQKQEAgLTAsMCArMSwxODkgQEAKKzwhLS0KKyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzwhLS0gRFREIGZvciBKU1AgMi4wCisgICAgIHRoYW5rcyB0byBCb2IgRm9zdGVyLCBXZWJHYWluCistLT4KKworPCEtLSAKKyAgICAgVGhpcyBEVEQgaXMgbm90IGNvbmRpdGlvbmFsIG9uIGFueSBwYXJhbWV0ZXIgZW50aXRpZXMgaW4gdGhlIGludGVybmFsCisgICAgIHN1YnNldCBhbmQgZG9lcyBub3QgZXhwb3J0IGFueSBnZW5lcmFsIGVudGl0aWVzLgorLS0+CisKKzwhLS09PT09PT09PT09PT09PT09PT0gQ29uc3RyYWluZWQgTmFtZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisKKzwhRU5USVRZICUgVVJJICJDREFUQSI+CisgICAgPCEtLSBhIFVuaWZvcm0gUmVzb3VyY2UgSWRlbnRpZmllciwgc2VlIFtSRkMyMzk2XSAtLT4KKworPCFFTlRJVFkgJSBVcmlMaXN0ICJDREFUQSI+CisgICAgPCEtLSBhIHNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mIFVuaWZvcm0gUmVzb3VyY2UgSWRlbnRpZmllcnMgLS0+CisKKzwhRU5USVRZICUgVVJMICJDREFUQSI+CisgICAgPCEtLSBhIHJlbGF0aXZlIHVybFNwZWMgaXMgYXMgaW4gU2VjdGlvbiAyLjEwLjIuIC0tPgorCis8IUVOVElUWSAlIEJlYW5JRCAiSURSRUYiPgorICAgIDwhLS0gYSBwcmV2aW91c2x5IGRlY2xhcmVkIGJlYW4gSUQgaW4gdGhlIGN1cnJlbnQgc2NvcGUuIC0tPgorCis8IUVOVElUWSAlIFByZWZpeCAiQ0RBVEEiPgorICAgIDwhLS0gYSBOYW1lIHRoYXQgY29udGFpbnMgbm8gOiBjaGFyYWN0ZXJzLiAtLT4KKworPCFFTlRJVFkgJSBDbGFzc05hbWUgIkNEQVRBIj4KKyAgICA8IS0tIGEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUuIC0tPgorCis8IUVOVElUWSAlIFR5cGVOYW1lICJDREFUQSI+CisgICAgPCEtLSBhIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBvciBpbnRlcmZhY2UgbmFtZS4gLS0+CisKKzwhRU5USVRZICUgQmVhbk5hbWUgIkNEQVRBIj4KKyAgICA8IS0tIGEgYmVhbiBuYW1lIGFzIGV4cGVjdGVkIGJ5IGphdmEuYmVhbnMuQmVhbnMgaW5zdGFudGlhdGUoKS4gLS0+CisKKzwhRU5USVRZICUgQ29udGVudCAiQ0RBVEEiPgorICAgIDwhLS0gYSBNSU1FIHR5cGUgZm9sbG93ZWQgYnkgYW4gSUFOQSBjaGFyc2V0LCBhcyAiIHR5cGUgWzsgUz8gWydjaGFyc2V0PSddIGNoYXJzZXRdICIgLS0+CisKKzwhRU5USVRZICUgTGVuZ3RoICJDREFUQSI+CisgICAgPCEtLSBubiBmb3IgcGl4ZWxzIG9yIG5uJSBmb3IgcGVyY2VudGFnZSBsZW5ndGggLS0+CisKKzwhRU5USVRZICUgUGl4ZWxzICJDREFUQSI+CisgICAgPCEtLSBpbnRlZ2VyIHJlcHJlc2VudGluZyBsZW5ndGggaW4gcGl4ZWxzIC0tPgorCis8IUVOVElUWSAlIEJvb2wgIih0cnVlfGZhbHNlfHllc3xubykiPgorICAgIDwhLS0gYm9vbGVhbiAtLT4KKworPCEtLSB1c2VkIGZvciBvYmplY3QsIGFwcGxldCwgaW1nLCBpbnB1dCBhbmQgaWZyYW1lIC0tPgorPCFFTlRJVFkgJSBJbWdBbGlnbiAiKHRvcHxtaWRkbGV8Ym90dG9tfGxlZnR8cmlnaHQpIj4KKworPCEtLT09PT09PT09PT09PT09PT09PT0gRWxlbWVudCBHcm91cHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisKKzwhRU5USVRZICUgRGlyZWN0aXZlcyAianNwOmRpcmVjdGl2ZS5wYWdlfGpzcDpkaXJlY3RpdmUuaW5jbHVkZSI+CisKKzwhRU5USVRZICUgU2NyaXB0cyAianNwOnNjcmlwdGxldHxqc3A6ZGVjbGFyYXRpb258anNwOmV4cHJlc3Npb24iPgorCis8IUVOVElUWSAlIEFjdGlvbnMKKyAgICAianNwOnVzZUJlYW4KKyAgICB8anNwOnNldFByb3BlcnR5CisgICAgfGpzcDpnZXRQcm9wZXJ0eQorICAgIHxqc3A6aW5jbHVkZQorICAgIHxqc3A6Zm9yd2FyZAorICAgIHxqc3A6cGx1Z2luIgorPgorCis8IUVOVElUWSAlIEJvZHkgIihqc3A6dGV4dHwlRGlyZWN0aXZlczt8JVNjcmlwdHM7fCVBY3Rpb25zOykqIj4KKworCis8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gRWxlbWVudHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworPCEtLSAgICBSb290IGVsZW1lbnQgb2YgYSBKU1AgcGFnZS4KKy0tPgorPCFFTEVNRU5UIGpzcDpyb290ICVCb2R5Oz4KKzwhQVRUTElTVCBqc3A6cm9vdAorICAgIHhtbG5zOmpzcCAgICAgICBDREFUQSAgICAgICAgICAgImh0dHA6Ly9qYXZhLnN1bi5jb20vSlNQL1BhZ2UiCisgICAgdmVyc2lvbiAgICAgICAgIENEQVRBICAgICAgICAgICAjUkVRVUlSRUQKKz4KKworPCFFTEVNRU5UIGpzcDpkaXJlY3RpdmUucGFnZSBFTVBUWT4KKzwhQVRUTElTVCBqc3A6ZGlyZWN0aXZlLnBhZ2UKKyAgICBsYW5ndWFnZSAgICAgICAgQ0RBVEEgICAgICAgICAgICJqYXZhIgorICAgIGV4dGVuZHMgICAgICAgICAlQ2xhc3NOYW1lOyAgICAgI0lNUExJRUQKKyAgICBjb250ZW50VHlwZSAgICAgJUNvbnRlbnQ7ICAgICAgICJ0ZXh0L2h0bWw7IElTTy04ODU5LTEiCisgICAgaW1wb3J0ICAgICAgICAgIENEQVRBICAgICAgICAgICAjSU1QTElFRAorICAgIHNlc3Npb24gICAgICAgICAlQm9vbDsgICAgICAgICAgInRydWUiCisgICAgYnVmZmVyICAgICAgICAgIENEQVRBICAgICAgICAgICAiOGtiIgorICAgIGF1dG9GbHVzaCAgICAgICAlQm9vbDsgICAgICAgICAgInRydWUiCisgICAgaXNUaHJlYWRTYWZlICAgICVCb29sOyAgICAgICAgICAidHJ1ZSIKKyAgICBpbmZvICAgICAgICAgICAgQ0RBVEEgICAgICAgICAgICNJTVBMSUVECisgICAgZXJyb3JQYWdlICAgICAgICVVUkw7ICAgICAgICAgICAjSU1QTElFRAorICAgIGlzRXJyb3JQYWdlICAgICAlQm9vbDsgICAgICAgICAgImZhbHNlIgorICAgIHBhZ2VFbmNvZGluZyAgICBDREFUQSAgICAgICAgICAgI0lNUExJRUQKKyAgICBpc0VMSWdub3JlZCAgICAgJUJvb2w7ICAgICAgICAgICNJTVBMSUVECis+CisKKzwhLS0gdGhlIGpzcDpkaXJlY3RpdmUuaW5jbHVkZSBvbmx5IGFwcGVhcnMgaW4gSlNQIGRvY3VtZW50cyBhbmQgZG9lcworICAgICBub3QgYXBwZWFyIGluIHRoZSBYTUwgdmlld3Mgb2YgSlNQIHBhZ2VzLgorLS0+CisKKzwhRUxFTUVOVCBqc3A6ZGlyZWN0aXZlLmluY2x1ZGUgRU1QVFk+Cis8IUFUVExJU1QganNwOmRpcmVjdGl2ZS5pbmNsdWRlCisgICAgZmlsZSAgICAgICAgICAgICVVUkk7ICAgICAgICAgICAjUkVRVUlSRUQKKz4KKworPCFFTEVNRU5UIGpzcDpzY3JpcHRsZXQgKCNQQ0RBVEEpPgorCis8IUVMRU1FTlQganNwOmRlY2xhcmF0aW9uICgjUENEQVRBKT4KKworPCFFTEVNRU5UIGpzcDpleHByZXNzaW9uICgjUENEQVRBKT4KKworPCFFTEVNRU5UIGpzcDp1c2VCZWFuICVCb2R5Oz4KKzwhQVRUTElTVCBqc3A6dXNlQmVhbgorICAgIGlkICAgICAgICAgICAgICBJRCAgICAgICAgICAgICAgI1JFUVVJUkVECisgICAgY2xhc3MgICAgICAgICAgICVDbGFzc05hbWU7ICAgICAjSU1QTElFRAorICAgIHR5cGUgICAgICAgICAgICAlVHlwZU5hbWU7ICAgICAgI0lNUExJRUQKKyAgICBiZWFuTmFtZSAgICAgICAgJUJlYW5OYW1lOyAgICAgICNJTVBMSUVECisgICAgc2NvcGUgICAgICAgICAgIChwYWdlCisgICAgICAgICAgICAgICAgICAgIHxzZXNzaW9uCisgICAgICAgICAgICAgICAgICAgIHxyZXF1ZXN0CisgICAgICAgICAgICAgICAgICAgIHxhcHBsaWNhdGlvbikgICAicGFnZSIKKz4KKworPCFFTEVNRU5UIGpzcDpzZXRQcm9wZXJ0eSBFTVBUWT4KKzwhQVRUTElTVCBqc3A6c2V0UHJvcGVydHkKKyAgICBuYW1lICAgICAgICAgICAgJUJlYW5JRDsgICAgICAgICNSRVFVSVJFRAorICAgIHByb3BlcnR5ICAgICAgICBDREFUQSAgICAgICAgICAgI1JFUVVJUkVECisgICAgdmFsdWUgICAgICAgICAgIENEQVRBICAgICAgICAgICAjSU1QTElFRAorICAgIHBhcmFtICAgICAgICAgICBDREFUQSAgICAgICAgICAgI0lNUExJRUQKKz4KKworPCFFTEVNRU5UIGpzcDpnZXRQcm9wZXJ0eSBFTVBUWT4KKzwhQVRUTElTVCBqc3A6Z2V0UHJvcGVydHkKKyAgICBuYW1lICAgICAgICAgICAgJUJlYW5JRDsgICAgICAgICNSRVFVSVJFRAorICAgIHByb3BlcnR5ICAgICAgICBDREFUQSAgICAgICAgICAgI1JFUVVJUkVECis+CisKKzwhRUxFTUVOVCBqc3A6aW5jbHVkZSAoanNwOnBhcmFtKik+Cis8IUFUVExJU1QganNwOmluY2x1ZGUKKyAgICBmbHVzaCAgICAgICAgICAgJUJvb2w7ICAgICAgICAgICJmYWxzZSIKKyAgICBwYWdlICAgICAgICAgICAgJVVSTDsgICAgICAgICAgICNSRVFVSVJFRAorPgorCis8IUVMRU1FTlQganNwOmZvcndhcmQgKGpzcDpwYXJhbSopPgorPCFBVFRMSVNUIGpzcDpmb3J3YXJkCisgICAgcGFnZSAgICAgICAgICAgICVVUkw7ICAgICAgICAgICAjUkVRVUlSRUQKKz4KKworPCFFTEVNRU5UIGpzcDpwbHVnaW4gKGpzcDpwYXJhbXM/LCBqc3A6ZmFsbGJhY2s/KT4KKzwhQVRUTElTVCBqc3A6cGx1Z2luCisgICAgdHlwZSAgICAgICAgICAgIChiZWFufGFwcGxldCkgICAjUkVRVUlSRUQKKyAgICBjb2RlICAgICAgICAgICAgJVVSSTsgICAgICAgICAgICNJTVBMSUVECisgICAgY29kZWJhc2UgICAgICAgICVVUkk7ICAgICAgICAgICAjSU1QTElFRAorICAgIGFsaWduICAgICAgICAgICAlSW1nQWxpZ247ICAgICAgI0lNUExJRUQKKyAgICBhcmNoaXZlICAgICAgICAgJVVyaUxpc3Q7ICAgICAgICNJTVBMSUVECisgICAgaGVpZ2h0ICAgICAgICAgICVMZW5ndGg7ICAgICAgICAjSU1QTElFRAorICAgIGhzcGFjZSAgICAgICAgICAlUGl4ZWxzOyAgICAgICAgI0lNUExJRUQKKyAgICBqcmV2ZXJzaW9uICAgICAgQ0RBVEEgICAgICAgICAgICIxLjIiCisgICAgbmFtZSAgICAgICAgICAgIE5NVE9LRU4gICAgICAgICAjSU1QTElFRAorICAgIHZzcGFjZSAgICAgICAgICAlUGl4ZWxzOyAgICAgICAgI0lNUExJRUQKKyAgICB3aWR0aCAgICAgICAgICAgJUxlbmd0aDsgICAgICAgICNJTVBMSUVECisgICAgbnNwbHVnaW51cmwgICAgICVVUkk7ICAgICAgICAgICAjSU1QTElFRAorICAgIGllcGx1Z2ludXJsICAgICAlVVJJOyAgICAgICAgICAgI0lNUExJRUQKKz4KKworPCFFTEVNRU5UIGpzcDpwYXJhbXMgKGpzcDpwYXJhbSspPgorCis8IUVMRU1FTlQganNwOnBhcmFtIEVNUFRZPgorPCFBVFRMSVNUIGpzcDpwYXJhbQorICAgIG5hbWUgICAgICAgICAgICBDREFUQSAgICAgICAgICAgI1JFUVVJUkVECisgICAgdmFsdWUgICAgICAgICAgIENEQVRBICAgICAgICAgICAjUkVRVUlSRUQKKz4KKworPCFFTEVNRU5UIGpzcDp0ZXh0ICNQQ0RBVEE+CisKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9kdGQvanNweG1sLnhzZCBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9kdGQvanNweG1sLnhzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODZlZTY1Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2R0ZC9qc3B4bWwueHNkCkBAIC0wLDAgKzEsNTEzIEBACis8P3htbCB2ZXJzaW9uID0iMS4wIj8+Cis8IS0tCisgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8IURPQ1RZUEUgc2NoZW1hIFsKKzwhLS0gUGF0dGVybnMgLS0+Cis8IUVOVElUWSBJZGVudGlmaWVyICAgIihccHtMfXxffCQpKFxwe059fFxwe0x9fF98JCkqIj4KKzwhRU5USVRZIFR5cGVOYW1lICAgICAiJklkZW50aWZpZXI7KFwuJklkZW50aWZpZXI7KSoiPgorPCFFTlRJVFkgV1MgICAgICAgIlxzKiI+Cis8IUVOVElUWSBJbXBvcnQgICAgICImVHlwZU5hbWU7KFwuXCopPyI+Cis8IUVOVElUWSBJbXBvcnRMaXN0ICAgIiZJbXBvcnQ7KCZXUzssJldTOyZJbXBvcnQ7KSoiPgorPCFFTlRJVFkgU2V0UHJvcCAgICAiKCZJZGVudGlmaWVyO3xcKikiPgorPCFFTlRJVFkgUmVsYXRpdmVVUkwgICJbXjojL1w/XSooOnswLDB9fFsjL1w/XS4qKSI+Cis8IUVOVElUWSBMZW5ndGggICAgICJbMC05XSomI3gyNTs/Ij4KKzwhRU5USVRZIEFzY2lpTmFtZSAgICAiW0EtWmEtejAtOV8tXSoiPgorPCFFTlRJVFkgVmFsaWRDb250ZW50VHlwZSAgIiZBc2NpaU5hbWU7LyZBc2NpaU5hbWU7KDsmV1M7KGNoYXJzZXQ9KT8mQXNjaWlOYW1lOyk/Ij4KKzwhRU5USVRZIFZhbGlkUGFnZUVuY29kaW5nICAiJkFzY2lpTmFtZTsvJkFzY2lpTmFtZTsiPgorPCFFTlRJVFkgQnVmZmVyICAgICAiWzAtOV0ra2IiPgorPCFFTlRJVFkgUlRleHByICAgICAiJiN4MjU7PS4qJiN4MjU7Ij4KK10+CisKKworPCEtLUNvbmZvcm1zIHRvIHczYyBodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSAtLT4KKworPHhzZDpzY2hlbWEKKyAgICB4bWxucyA9ICJodHRwOi8vamF2YS5zdW4uY29tL0pTUC9QYWdlIgorICAgIHhtbG5zOnhzZCA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKKyAgICB4bWxuczpqc3AgPSAiaHR0cDovL2phdmEuc3VuLmNvbS9KU1AvUGFnZSIKKyAgICB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS9KU1AvUGFnZSIKKyAgICBlbGVtZW50Rm9ybURlZmF1bHQgPSAicXVhbGlmaWVkIgorICAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0ID0gInVucXVhbGlmaWVkIj4KKworICA8eHNkOmFubm90YXRpb24+CisgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorICAgICAgWE1MIFNjaGVtYSBmb3IgSlNQIDIuMC4KKworICAgICAgVGhpcyBzY2hlbWEgaXMgYmFzZWQgdXBvbiB0aGUgcmVjZW50IChNYXkgNXRoLCAyMDAxKQorICAgICAgVzNDIHJlY29tbWVuZGF0aW9uIGZvciBYTUwgU2NoZW1hLgorCisgICAgICBBIEpTUCB0cmFuc2xhdG9yIHNob3VsZCByZWplY3QgYW4gWE1MLWZvcm1hdCBmaWxlIHRoYXQgaXMKKyAgICAgIG5vdCBzdHJpY3RseSB2YWxpZCBhY2NvcmRpbmcgdG8gdGhpcyBzY2hlbWEgb3IgZG9lcyBub3Qgb2JzZXJ2ZQorICAgICAgdGhlIGNvbnN0cmFpbnRzIGRvY3VtZW50ZWQgaGVyZS4gQSB0cmFuc2xhdG9yIGlzIG5vdCByZXF1aXJlZAorICAgICAgdG8gdXNlIHRoaXMgc2NoZW1hIGZvciB2YWxpZGF0aW9uIG9yIHRvIHVzZSBhIHZhbGlkYXRpbmcgcGFyc2VyLgorICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgIDwveHNkOmFubm90YXRpb24+CisKKworICA8IS0tIENvbXBsZXggVHlwZXMgLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lID0gIkJvZHkiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgQm9keSBkZWZpbmVzIHRoZSAidG9wLWxldmVsIiBlbGVtZW50cyBpbiByb290IGFuZCBiZWFuSW5mby4KKyAgICAgICAgVGhlcmUgYXJlIHByb2JhYmx5IG90aGVyIGVsZW1lbnRzIHRoYXQgc2hvdWxkIHVzZSBpdC4KKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOmdyb3VwIHJlZiA9ICJCb2R5Z3JvdXAiIG1pbk9jY3VycyA9ICIwIiBtYXhPY2N1cnMgPSAidW5ib3VuZGVkIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgIDwhLS0gZ3JvdXBzIC0tPgorCisgIDx4c2Q6Z3JvdXAgbmFtZSA9ICJCb2R5Z3JvdXAiPgorICAgIDx4c2Q6Y2hvaWNlPgorICAgICAgPHhzZDplbGVtZW50IHJlZiA9ICJkaXJlY3RpdmUucGFnZSIvPgorICAgICAgPHhzZDplbGVtZW50IHJlZiA9ICJkaXJlY3RpdmUuaW5jbHVkZSIvPgorICAgICAgPHhzZDplbGVtZW50IHJlZiA9ICJzY3JpcHRsZXQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCByZWYgPSAiZGVjbGFyYXRpb24iLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCByZWYgPSAiZXhwcmVzc2lvbiIvPgorICAgICAgPHhzZDplbGVtZW50IHJlZiA9ICJ1c2VCZWFuIi8+CisgICAgICA8eHNkOmVsZW1lbnQgcmVmID0gInNldFByb3BlcnR5Ii8+CisgICAgICA8eHNkOmVsZW1lbnQgcmVmID0gImdldFByb3BlcnR5Ii8+CisgICAgICA8eHNkOmVsZW1lbnQgcmVmID0gImluY2x1ZGUiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCByZWYgPSAiZm9yd2FyZCIvPgorICAgICAgPHhzZDplbGVtZW50IHJlZiA9ICJwbHVnaW4iLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCByZWYgPSAidGV4dCIvPgorICAgICAgPHhzZDphbnkgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHMgPSAibGF4Ii8+CisgICAgPC94c2Q6Y2hvaWNlPgorICA8L3hzZDpncm91cD4KKworCisgIDwhLS0gU2ltcGxlIHR5cGVzIGFyZSBuZXh0IC0tPgorCisgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lID0gIlJURSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorICAgICAgICBBIHJlcXVlc3QtdGltZSBleHByZXNzaW9uIHZhbHVlCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlID0gInhzZDpzdHJpbmciPgorICAgICAgPHhzZDpwYXR0ZXJuIHZhbHVlID0gIiZSVGV4cHI7Ii8+CisgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgIDwveHNkOnNpbXBsZVR5cGU+CisKKyAgPHhzZDpzaW1wbGVUeXBlIG5hbWUgPSAiQm9vbCI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorICAgICAgICBCb29sIHdvdWxkIGJlIGJvb2xlYW4gZXhjZXB0IGl0IGRvZXMgbm90IGFjY2VwdCAxIGFuZCAwLgorICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZSA9ICJ4c2Q6Tk1UT0tFTiIgPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZSA9ICJ0cnVlIi8+CisgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlID0gImZhbHNlIi8+CisgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlID0gInllcyIvPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZSA9ICJubyIvPgorICAgIDwveHNkOnJlc3RyaWN0aW9uPiAgICAgCisgIDwveHNkOnNpbXBsZVR5cGU+CisKKyAgPHhzZDpzaW1wbGVUeXBlIG5hbWUgPSAiSWRlbnRpZmllciI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorICAgICAgICBJZGVudGlmaWVyIGlzIGFuIHVucXVhbGlmaWVkIEphdmEgaWRlbnRpZmllci4KKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2UgPSAieHNkOnN0cmluZyI+CisgICAgICA8eHNkOnBhdHRlcm4gdmFsdWUgPSAiJklkZW50aWZpZXI7Ii8+CisgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgIDwveHNkOnNpbXBsZVR5cGU+CisgIAorICA8eHNkOnNpbXBsZVR5cGUgbmFtZSA9ICJUeXBlTmFtZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorICAgICAgICBUeXBlTmFtZSBpcyBvbmUgb3IgbW9yZSBKYXZhIGlkZW50aWZpZXJzIHNlcGFyYXRlZCBieSBkb3RzCisgICAgICAgIHdpdGggbm8gd2hpdGVzcGFjZS4KKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2UgPSAieHNkOnN0cmluZyI+CisgICAgICA8eHNkOnBhdHRlcm4gdmFsdWUgPSAiJlR5cGVOYW1lOyIvPgorICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICA8L3hzZDpzaW1wbGVUeXBlPgorICAKKyAgPHhzZDpzaW1wbGVUeXBlIG5hbWUgPSAiSW1wb3J0TGlzdCI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorICAgICAgICBJbXBvcnRMaXN0IGlzIG9uZSBvciBtb3JlIHR5cGVOYW1lcyBzZXBhcmF0ZWQgYnkgY29tbWFzLgorICAgICAgICBXaGl0ZXNwYWNlIGlzIGFsbG93ZWQgYmVmb3JlIGFuZCBhZnRlciB0aGUgY29tbWEuCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlID0gInhzZDpzdHJpbmciPgorICAgICAgPHhzZDpwYXR0ZXJuIHZhbHVlID0gIiZJbXBvcnRMaXN0OyIvPgorICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICA8L3hzZDpzaW1wbGVUeXBlPgorICAKKyAgPHhzZDpzaW1wbGVUeXBlIG5hbWUgPSAiU2V0UHJvcCI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorICAgICAgICBTZXRQcm9wIGlzIGFuIElkZW50aWZpZXIgb3IgKi4KKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2UgPSAieHNkOnN0cmluZyI+CisgICAgICA8eHNkOnBhdHRlcm4gdmFsdWUgPSAiJlNldFByb3A7Ii8+CisgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgIDwveHNkOnNpbXBsZVR5cGU+CisgIAorICA8eHNkOnNpbXBsZVR5cGUgbmFtZSA9ICJSZWxhdGl2ZVVSTCI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorICAgICAgICBSZWxhdGl2ZVVSTCBpcyBhIHVyaVJlZmVyZW5jZSB3aXRoIG5vIGNvbG9uIGNoYXJhY3RlcgorICAgICAgICBiZWZvcmUgdGhlIGZpcnN0IC8sID8gb3IgIywgaWYgYW55IChSRkMyMzk2KS4KKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKwk8eHNkOnJlc3RyaWN0aW9uIGJhc2UgPSAieHNkOmFueVVSSSI+CisgICAgICA8eHNkOnBhdHRlcm4gdmFsdWUgPSAiJlJlbGF0aXZlVVJMOyIvPgorICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICA8L3hzZDpzaW1wbGVUeXBlPgorCisgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lID0gIlJURVJlbGF0aXZlVVJMIj4KKyAgICA8eHNkOnVuaW9uIG1lbWJlclR5cGVzID0gIlJlbGF0aXZlVVJMIFJURSIvPgorICA8L3hzZDpzaW1wbGVUeXBlPgorCisgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lID0gIkxlbmd0aCI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorICAgICAgICBMZW5ndGggaXMgbm4gb3Igbm4lLgorICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZSA9ICJ4c2Q6c3RyaW5nIj4KKyAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZSA9ICImTGVuZ3RoOyIvPgorICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICA8L3hzZDpzaW1wbGVUeXBlPgorICAKKworICA8eHNkOnNpbXBsZVR5cGUgbmFtZSA9ICJFeHBsaWNpdEJ1ZmZlclNpemUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgIEJ1ZmZlciBTaXplIHdpdGggYW4gZXhwbGljaXQgdmFsdWUKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4gCisgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlID0gInhzZDpzdHJpbmciPgorICAgICAgPHhzZDpwYXR0ZXJuIHZhbHVlID0gIiZCdWZmZXI7Ii8+CisgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgIDwveHNkOnNpbXBsZVR5cGU+CisKKyAgPHhzZDpzaW1wbGVUeXBlIG5hbWUgPSAiTm9uZUJ1ZmZlclNpemUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgIEJ1ZmZlciBTaXplIHdpdGggYSAibm9uZSIgdmFsdWUKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4gCisgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlID0gInhzZDpzdHJpbmciPgorICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZSA9ICJub25lIi8+CisgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgIDwveHNkOnNpbXBsZVR5cGU+CisKKyAgPHhzZDpzaW1wbGVUeXBlIG5hbWUgPSAiQnVmZmVyU2l6ZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorICAgICAgICBCdWZmZXIgc2l6ZSBpcyB4a2Igb3Igbm9uZS4KKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnVuaW9uIG1lbWJlclR5cGVzID0gIkV4cGxpY2l0QnVmZmVyU2l6ZSBOb25lQnVmZmVyU2l6ZSIvPgorICA8L3hzZDpzaW1wbGVUeXBlPgorICAKKyAgPHhzZDpzaW1wbGVUeXBlIG5hbWUgPSAiQ29udGVudFR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgQ29udGVudCB0eXBlIGFuZCBjaGFyYWN0ZXIgZW5jb2RpbmcgZm9yIHRoaXMgcGFnZS4KKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2UgPSAieHNkOnN0cmluZyI+CisgICAgICA8eHNkOnBhdHRlcm4gdmFsdWUgPSAiJlZhbGlkQ29udGVudFR5cGU7Ii8+CisgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgIDwveHNkOnNpbXBsZVR5cGU+CisKKyAgPHhzZDpzaW1wbGVUeXBlIG5hbWUgPSAiUGFnZUVuY29kaW5nIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisgICAgICAgIFBhZ2UgRW5jb2RpbmcgZm9yIHRoaXMgcGFnZS4KKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2UgPSAieHNkOnN0cmluZyI+CisgICAgICA8eHNkOnBhdHRlcm4gdmFsdWUgPSAiJlZhbGlkUGFnZUVuY29kaW5nOyIvPgorICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICA8L3hzZDpzaW1wbGVUeXBlPgorCisgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lID0gIlNjb3BlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisgICAgICAgIHZhbGlkIHNjb3BlIHZhbHVlcworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZSA9ICJ4c2Q6Tk1UT0tFTiI+CisgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlID0gInBhZ2UiLz4KKyAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWUgPSAic2Vzc2lvbiIvPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZSA9ICJyZXF1ZXN0Ii8+CisgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlID0gImFwcGxpY2F0aW9uIi8+CisgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgIDwveHNkOnNpbXBsZVR5cGU+CisKKyAgPHhzZDpzaW1wbGVUeXBlIG5hbWUgPSAiUGx1Z0luVHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorICAgICAgICB2YWxpZCB2YWx1ZXMgZm9yIGEgcGx1Z2luIHR5cGUKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2UgPSAieHNkOk5NVE9LRU4iPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZSA9ICJiZWFuIi8+CisgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlID0gImFwcGxldCIvPgorICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICA8L3hzZDpzaW1wbGVUeXBlPgorCisgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lID0gIkFsaWduVHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorICAgICAgICBCdWZmZXIgc2l6ZSBpcyB4a2IuCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlID0gInhzZDpOTVRPS0VOIj4KKyAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWUgPSAidG9wIi8+CisgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlID0gIm1pZGRsZSIvPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZSA9ICJib3R0b20iLz4KKyAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWUgPSAibGVmdCIvPgorICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZSA9ICJyaWdodCIvPgorICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICA8L3hzZDpzaW1wbGVUeXBlPgorCisgIDwhLS0gRWxlbWVudHMgZm9sbG93IC0tPgorCisgIDx4c2Q6ZWxlbWVudCBuYW1lID0gInJvb3QiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgVGhlIHJvb3QgZWxlbWVudCBvZiBhbGwgSlNQIGRvY3VtZW50cyBpcyBuYW1lZCByb290LgorICAgICAgICAKKyAgICAgICAgQXV0aG9ycyBtYXksIGlmIHRoZXkgd2lzaCwgaW5jbHVkZSBzY2hlbWEgbG9jYXRpb24gaW5mb3JtYXRpb24uCisgICAgICAgIElmIHNwZWNpZmllZCwgdGhlIGluZm9ybWF0aW9uIG1heSBhcHBlYXIgYXMgYXR0cmlidXRlcyBvZgorICAgICAgICB0aGUgcm9vdCBlbGVtZW50IGFzIGZvbGxvd3M6CisKKyAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL0pTUC9QYWdlIHhzZC1maWxlLWxvY2F0aW9uIgorCisgICAgICAgIERvY3VtZW50cyBzaG91bGQgbm90IHNwZWNpZnkgdGhlIHN5c3RlbSBpZGVudGlmaWVyIG9mIGEgRFRECisgICAgICAgIGluIGEgRE9DVFlQRSBkZWNsYXJhdGlvbi4KKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KKyAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZSA9ICJCb2R5Ij4KKyAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lID0gInZlcnNpb24iIGZpeGVkID0gIjIuMCIgdHlwZSA9ICJ4c2Q6c3RyaW5nIi8+CisgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KKyAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICA8L3hzZDplbGVtZW50PgorICAKKyAgPHhzZDplbGVtZW50IG5hbWUgPSAiZGlyZWN0aXZlLnBhZ2UiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgZGlyZWN0aXZlLnBhZ2UgaXMgdGhlICJwYWdlIGRpcmVjdGl2ZSIuCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWUgPSAibGFuZ3VhZ2UiIGRlZmF1bHQgPSAiamF2YSIgdHlwZSA9ICJ4c2Q6c3RyaW5nIi8+CisgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lID0gImV4dGVuZHMiIHR5cGUgPSAiVHlwZU5hbWUiLz4KKyAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWUgPSAiY29udGVudFR5cGUiIGRlZmF1bHQgPSAidGV4dC9odG1sOyBJU08tODg1OS0xIiB0eXBlID0gIkNvbnRlbnRUeXBlIi8+CisgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lID0gInBhZ2VFbmNvZGluZyIgdXNlID0gIm9wdGlvbmFsIiB0eXBlID0gIlBhZ2VFbmNvZGluZyIvPgorICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZSA9ICJpbXBvcnQiIHR5cGUgPSAiSW1wb3J0TGlzdCIvPgorICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZSA9ICJzZXNzaW9uIiBkZWZhdWx0ID0gInRydWUiIHR5cGUgPSAiQm9vbCIvPgorICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZSA9ICJidWZmZXIiIGRlZmF1bHQgPSAiOGtiIiB0eXBlID0gIkJ1ZmZlclNpemUiLz4KKyAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWUgPSAiYXV0b0ZsdXNoIiBkZWZhdWx0ID0gInRydWUiIHR5cGUgPSAiQm9vbCIvPgorICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZSA9ICJpc1RocmVhZFNhZmUiIGRlZmF1bHQgPSAidHJ1ZSIgdHlwZSA9ICJCb29sIi8+CisgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lID0gImluZm8iIHR5cGUgPSAieHNkOnN0cmluZyIvPgorICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZSA9ICJlcnJvclBhZ2UiIHR5cGUgPSAiUmVsYXRpdmVVUkwiLz4KKyAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWUgPSAiaXNFcnJvclBhZ2UiIGRlZmF1bHQgPSAiZmFsc2UiIHR5cGUgPSAiQm9vbCIvPgorICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZSA9ICJpc0VMSWdub3JlZCIgdHlwZSA9ICJCb29sIi8+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgIDwveHNkOmVsZW1lbnQ+CisgIAorICA8eHNkOmVsZW1lbnQgbmFtZSA9ICJkaXJlY3RpdmUuaW5jbHVkZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorICAgICAgICBkaXJlY3RpdmUuaW5jbHVkZSBpcyB0aGUgImluY2x1ZGUgZGlyZWN0aXZlIi4KKwlUaGlzIGVsZW1lbnQgZG9lcyBub3QgYXBwZWFyIG9uIFhNTCB2aWV3cyBvZiBKU1AgcGFnZXMuCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWUgPSAiZmlsZSIgdXNlID0gInJlcXVpcmVkIiB0eXBlID0gIlJlbGF0aXZlVVJMIi8+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgIDwveHNkOmVsZW1lbnQ+CisKKyAgPHhzZDplbGVtZW50IG5hbWUgPSAic2NyaXB0bGV0IiB0eXBlID0gInhzZDpzdHJpbmciPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgVGhlIHJlcHJlc2VudGF0aW9uIG9mIGEgc2NyaXBsZXQuCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgIDwveHNkOmVsZW1lbnQ+CisgIAorICA8eHNkOmVsZW1lbnQgbmFtZSA9ICJkZWNsYXJhdGlvbiIgdHlwZSA9ICJ4c2Q6c3RyaW5nIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisgICAgICAgIFRoZSByZXByc2VudGF0aW9uIG9mIGEgZGVjbGFyYXRpb24uCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgIDwveHNkOmVsZW1lbnQ+CisgIAorICA8eHNkOmVsZW1lbnQgbmFtZSA9ICJleHByZXNzaW9uIiB0eXBlID0gInhzZDpzdHJpbmciPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgVGhlIHJlcHJlc2VudGF0aW9uIG9mIGFuIGV4cHJlc3Npb24uCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgIDwveHNkOmVsZW1lbnQ+CisgCisgIDx4c2Q6ZWxlbWVudCBuYW1lID0gInRleHQiIHR5cGUgPSAieHNkOnN0cmluZyI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorICAgICAgICBWZXJiYXRpbSB0ZW1wbGF0ZSB0ZXh0LgorICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICA8L3hzZDplbGVtZW50PgorCisgIDx4c2Q6ZWxlbWVudCBuYW1lID0gInVzZUJlYW4iPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgdXNlQmVhbiBpbnN0YW50aWF0ZXMgb3IgYWNjZXNzZXMgYSBiZWFuIGluIHRoZSBzcGVjaWZpZWQgc2NvcGUuCisgICAgICAgIAorICAgICAgICBDb25zdHJhaW50OiBUaGUgYWxsb3dlZCBjb21iaW5hdGlvbnMgb2YgYXR0cmlidXRlcyBhcmU6CisgICAgICAgIAorICAgICAgICAgIGNsYXNzIFt0eXBlXSB8IHR5cGUgWyggY2xhc3MgfCBiZWFuTmFtZSldCisgICAgICAgIAorICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgorICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJCb2R5Ij4KKyAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lID0gImlkIiB1c2UgPSAicmVxdWlyZWQiIHR5cGUgPSAiSWRlbnRpZmllciIvPgorICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWUgPSAiY2xhc3MiIHR5cGUgPSAiVHlwZU5hbWUiLz4KKyAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lID0gInR5cGUiIHR5cGUgPSAiVHlwZU5hbWUiLz4KKyAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lID0gImJlYW5OYW1lIiB0eXBlID0gIlR5cGVOYW1lIi8+CisgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZSA9ICJzY29wZSIgZGVmYXVsdCA9ICJwYWdlIiB0eXBlID0gIlNjb3BlIi8+CisgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KKyAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICA8L3hzZDplbGVtZW50PgorICAKKyAgPHhzZDplbGVtZW50IG5hbWUgPSAic2V0UHJvcGVydHkiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgc2V0UHJvcGVydHkgY2hhbmdlcyB0aGUgdmFsdWUgb2YgYW4gb2JqZWN0IHByb3BlcnR5LgorICAgICAgICAKKyAgICAgICAgQ29uc3RyYWludDogVGhlIG9iamVjdCBuYW1lZCBieSB0aGUgbmFtZSBtdXN0IGhhdmUgYmVlbgorICAgICAgICAiaW50cm9kdWNlZCIgdG8gdGhlIEpTUCBwcm9jZXNzb3IgdXNpbmcgZWl0aGVyIHRoZQorICAgICAgICBqc3A6dXNlQmVhbiBhY3Rpb24gb3IgYSBjdXN0b20gYWN0aW9uIHdpdGggYW4gYXNzb2NpYXRlZAorICAgICAgICBWYXJpYWJsZUluZm8gZW50cnkgZm9yIHRoaXMgbmFtZS4KKworICAgICAgICBFeGFjdCB2YWxpZCBjb21iaW5hdGlvbnMgYXJlIG5vdCBleHByZXNzYWJsZSBpbiBYTUwgU2NoZW1hLgorICAgICAgICBUaGV5IGFyZToKKworICAgICAgICBuYW1lPSJJZGVudGlmaWVyIiBwcm9wZXJ0eT0iKiIKKyAgICAgICAgbmFtZT0iSWRlbnRpZmllciIgcHJvcGVydHk9IklkZW50ZmlpZXIiIHBhcmFtPSJzdHJpbmciCisgICAgICAgIG5hbWU9IklkZW50aWZpZXIiIHByb3BlcnR5PSJJZGVudGlmaWVyIiB2YWx1ZT0ic3RyaW5nIgorICAgICAgICAgICAgICAgIAorICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lID0gIm5hbWUiIHVzZSA9ICJyZXF1aXJlZCIgdHlwZSA9ICJJZGVudGlmaWVyIi8+CisgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lID0gInByb3BlcnR5IiB1c2UgPSAicmVxdWlyZWQiIHR5cGUgPSAiU2V0UHJvcCIvPgorICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZSA9ICJwYXJhbSIgdHlwZSA9ICJ4c2Q6c3RyaW5nIi8+CisgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lID0gInZhbHVlIiB0eXBlID0gInhzZDpzdHJpbmciLz4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgPC94c2Q6ZWxlbWVudD4KKworICA8eHNkOmVsZW1lbnQgbmFtZSA9ICJnZXRQcm9wZXJ0eSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorICAgICAgICBnZXRQcm9wZXJ0eSBvYnRhaW5zIHRoZSB2YWx1ZSBvZiBhbiBvYmplY3QgcHJvcGVydHkuCisgICAgICAgIAorICAgICAgICBDb25zdHJhaW50OiBUaGUgb2JqZWN0IG5hbWVkIGJ5IHRoZSBuYW1lIG11c3QgaGF2ZSBiZWVuCisgICAgICAgICJpbnRyb2R1Y2VkIiB0byB0aGUgSlNQIHByb2Nlc3NvciB1c2luZyBlaXRoZXIgdGhlCisgICAgICAgIGpzcDp1c2VCZWFuIGFjdGlvbiBvciBhIGN1c3RvbSBhY3Rpb24gd2l0aCBhbiBhc3NvY2lhdGVkCisgICAgICAgIFZhcmlhYmxlSW5mbyBlbnRyeSBmb3IgdGhpcyBuYW1lLgorICAgICAgICAKKyAgICAgICAgPz8/VGhlIHNwZWMgaXMgaW50ZXJwcmV0ZWQgYXMgcmVzdHJpY3RpbmcgdGhlIHZhbHVlcyBvZgorICAgICAgICBwcm9wZXJ0eSB0byBJZGVudGlmaWVyLgorICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lID0gIm5hbWUiIHVzZSA9ICJyZXF1aXJlZCIgdHlwZSA9ICJJZGVudGlmaWVyIi8+CisgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lID0gInByb3BlcnR5IiB1c2UgPSAicmVxdWlyZWQiIHR5cGUgPSAiSWRlbnRpZmllciIvPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICA8L3hzZDplbGVtZW50PgorICAKKyAgPHhzZDplbGVtZW50IG5hbWUgPSAiaW5jbHVkZSI+CisgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgIDx4c2Q6ZWxlbWVudCByZWYgPSAicGFyYW0iIG1pbk9jY3VycyA9ICIwIiBtYXhPY2N1cnMgPSAidW5ib3VuZGVkIi8+CisgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWUgPSAiZmx1c2giIGRlZmF1bHQgPSAiZmFsc2UiIHR5cGUgPSAiQm9vbCIvPgorICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZSA9ICJwYWdlIiB1c2UgPSAicmVxdWlyZWQiIHR5cGUgPSAiUlRFUmVsYXRpdmVVUkwiLz4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgPC94c2Q6ZWxlbWVudD4KKworICA8eHNkOmVsZW1lbnQgbmFtZSA9ICJmb3J3YXJkIj4KKyAgICA8eHNkOmNvbXBsZXhUeXBlPgorICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgPHhzZDplbGVtZW50IHJlZiA9ICJwYXJhbSIgbWluT2NjdXJzID0gIjAiIG1heE9jY3VycyA9ICJ1bmJvdW5kZWQiLz4KKyAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZSA9ICJwYWdlIiB1c2UgPSAicmVxdWlyZWQiIHR5cGUgPSAiUlRFUmVsYXRpdmVVUkwiLz4KKyAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgIDwveHNkOmVsZW1lbnQ+CisgIAorICA8eHNkOmVsZW1lbnQgbmFtZSA9ICJwbHVnaW4iPgorICAgIDx4c2Q6Y29tcGxleFR5cGU+IDwhLS0gY29udGVudCBvbmx5ISAtLT4KKyAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgIDx4c2Q6ZWxlbWVudCByZWYgPSAicGFyYW1zIiBtaW5PY2N1cnMgPSAiMCIgbWF4T2NjdXJzID0gIjEiLz4KKyAgICAgICAgPHhzZDplbGVtZW50IG5hbWUgPSAiZmFsbGJhY2siIG1pbk9jY3VycyA9ICIwIiBtYXhPY2N1cnMgPSAiMSIgdHlwZSA9ICJCb2R5Ii8+CisgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWUgPSAidHlwZSIgdXNlID0gInJlcXVpcmVkIiB0eXBlID0gIlBsdWdJblR5cGUiLz4KKyAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWUgPSAiY29kZSIgdHlwZSA9ICJ4c2Q6YW55VVJJIi8+CisgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lID0gImNvZGViYXNlIiB0eXBlID0gInhzZDphbnlVUkkiLz4KKyAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWUgPSAiYWxpZ24iIHR5cGUgPSAiQWxpZ25UeXBlIi8+CisgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lID0gImFyY2hpdmUiPgorICAgICAgICA8eHNkOnNpbXBsZVR5cGU+CisgICAgICAgICAgIDx4c2Q6bGlzdCBpdGVtVHlwZT0ieHNkOmFueVVSSSIvPgorICAgICAgICA8L3hzZDpzaW1wbGVUeXBlPgorICAgICAgPC94c2Q6YXR0cmlidXRlPgorICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZSA9ICJoZWlnaHQiIHR5cGUgPSAiTGVuZ3RoIi8+CisgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lID0gImhzcGFjZSIgdHlwZSA9ICJ4c2Q6aW50Ii8+CisgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lID0gImpyZXZlcnNpb24iIGRlZmF1bHQgPSAiMS4yIiB0eXBlID0gInhzZDpzdHJpbmciLz4KKyAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWUgPSAibmFtZSIgdHlwZSA9ICJ4c2Q6Tk1UT0tFTiIvPgorICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZSA9ICJ2c3BhY2UiIHR5cGUgPSAieHNkOmludCIvPgorICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZSA9ICJ3aWR0aCIgdHlwZSA9ICJMZW5ndGgiLz4KKyAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWUgPSAibnNwbHVnaW51cmwiIHR5cGUgPSAieHNkOmFueVVSSSIvPgorICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZSA9ICJpZXBsdWdpbnVybCIgdHlwZSA9ICJ4c2Q6YW55VVJJIi8+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgIDwveHNkOmVsZW1lbnQ+CisgIAorICA8eHNkOmVsZW1lbnQgbmFtZSA9ICJwYXJhbXMiPgorICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWYgPSAicGFyYW0iIG1pbk9jY3VycyA9ICIxIiBtYXhPY2N1cnMgPSAidW5ib3VuZGVkIi8+CisgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgIDwveHNkOmVsZW1lbnQ+CisKKyAgPHhzZDplbGVtZW50IG5hbWUgPSAicGFyYW0iPgorICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lID0gIm5hbWUiIHVzZSA9ICJyZXF1aXJlZCIgdHlwZSA9ICJ4c2Q6Tk1UT0tFTiIvPgorICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZSA9ICJ2YWx1ZSIgdXNlID0gInJlcXVpcmVkIiB0eXBlID0gInhzZDpzdHJpbmciLz4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKyAgPC94c2Q6ZWxlbWVudD4KKyAgCis8L3hzZDpzY2hlbWE+CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvZHRkL3dlYi1hcHBfMl8yLmR0ZCBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9kdGQvd2ViLWFwcF8yXzIuZHRkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3ZWIxN2UKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvZHRkL3dlYi1hcHBfMl8yLmR0ZApAQCAtMCwwICsxLDU4MCBAQAorPCEtLQorICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8IS0tCitUaGUgd2ViLWFwcCBlbGVtZW50IGlzIHRoZSByb290IG9mIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZm9yCithIHdlYiBhcHBsaWNhdGlvbgorLS0+CisKKzwhRUxFTUVOVCB3ZWItYXBwIChpY29uPywgZGlzcGxheS1uYW1lPywgZGVzY3JpcHRpb24/LCBkaXN0cmlidXRhYmxlPywKK2NvbnRleHQtcGFyYW0qLCBzZXJ2bGV0Kiwgc2VydmxldC1tYXBwaW5nKiwgc2Vzc2lvbi1jb25maWc/LAorbWltZS1tYXBwaW5nKiwgd2VsY29tZS1maWxlLWxpc3Q/LCBlcnJvci1wYWdlKiwgdGFnbGliKiwKK3Jlc291cmNlLXJlZiosIHNlY3VyaXR5LWNvbnN0cmFpbnQqLCBsb2dpbi1jb25maWc/LCBzZWN1cml0eS1yb2xlKiwKK2Vudi1lbnRyeSosIGVqYi1yZWYqKT4KKworPCEtLQorVGhlIGljb24gZWxlbWVudCBjb250YWlucyBhIHNtYWxsLWljb24gYW5kIGEgbGFyZ2UtaWNvbiBlbGVtZW50Cit3aGljaCBzcGVjaWZ5IHRoZSBsb2NhdGlvbiB3aXRoaW4gdGhlIHdlYiBhcHBsaWNhdGlvbiBmb3IgYSBzbWFsbCBhbmQKK2xhcmdlIGltYWdlIHVzZWQgdG8gcmVwcmVzZW50IHRoZSB3ZWIgYXBwbGljYXRpb24gaW4gYSBHVUkgdG9vbC4gQXQgYQorbWluaW11bSwgdG9vbHMgbXVzdCBhY2NlcHQgR0lGIGFuZCBKUEVHIGZvcm1hdCBpbWFnZXMuCistLT4KKworPCFFTEVNRU5UIGljb24gKHNtYWxsLWljb24/LCBsYXJnZS1pY29uPyk+CisKKzwhLS0KK1RoZSBzbWFsbC1pY29uIGVsZW1lbnQgY29udGFpbnMgdGhlIGxvY2F0aW9uIHdpdGhpbiB0aGUgd2ViCithcHBsaWNhdGlvbiBvZiBhIGZpbGUgY29udGFpbmluZyBhIHNtYWxsICgxNngxNiBwaXhlbCkgaWNvbiBpbWFnZS4KKy0tPgorCis8IUVMRU1FTlQgc21hbGwtaWNvbiAoI1BDREFUQSk+CisKKzwhLS0KK1RoZSBsYXJnZS1pY29uIGVsZW1lbnQgY29udGFpbnMgdGhlIGxvY2F0aW9uIHdpdGhpbiB0aGUgd2ViCithcHBsaWNhdGlvbiBvZiBhIGZpbGUgY29udGFpbmluZyBhIGxhcmdlICgzMngzMiBwaXhlbCkgaWNvbiBpbWFnZS4KKy0tPgorCis8IUVMRU1FTlQgbGFyZ2UtaWNvbiAoI1BDREFUQSk+CisKKzwhLS0KK1RoZSBkaXNwbGF5LW5hbWUgZWxlbWVudCBjb250YWlucyBhIHNob3J0IG5hbWUgdGhhdCBpcyBpbnRlbmRlZAordG8gYmUgZGlzcGxheWVkIGJ5IEdVSSB0b29scworLS0+CisKKzwhRUxFTUVOVCBkaXNwbGF5LW5hbWUgKCNQQ0RBVEEpPgorCis8IS0tCitUaGUgZGVzY3JpcHRpb24gZWxlbWVudCBpcyB1c2VkIHRvIHByb3ZpZGUgZGVzY3JpcHRpdmUgdGV4dCBhYm91dAordGhlIHBhcmVudCBlbGVtZW50LgorLS0+CisKKzwhRUxFTUVOVCBkZXNjcmlwdGlvbiAoI1BDREFUQSk+CisKKzwhLS0KK1RoZSBkaXN0cmlidXRhYmxlIGVsZW1lbnQsIGJ5IGl0cyBwcmVzZW5jZSBpbiBhIHdlYiBhcHBsaWNhdGlvbgorZGVwbG95bWVudCBkZXNjcmlwdG9yLCBpbmRpY2F0ZXMgdGhhdCB0aGlzIHdlYiBhcHBsaWNhdGlvbiBpcworcHJvZ3JhbW1lZCBhcHByb3ByaWF0ZWx5IHRvIGJlIGRlcGxveWVkIGludG8gYSBkaXN0cmlidXRlZCBzZXJ2bGV0Citjb250YWluZXIKKy0tPgorCis8IUVMRU1FTlQgZGlzdHJpYnV0YWJsZSBFTVBUWT4KKworPCEtLQorVGhlIGNvbnRleHQtcGFyYW0gZWxlbWVudCBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgYSB3ZWIKK2FwcGxpY2F0aW9uJ3Mgc2VydmxldCBjb250ZXh0IGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMuCistLT4KKworPCFFTEVNRU5UIGNvbnRleHQtcGFyYW0gKHBhcmFtLW5hbWUsIHBhcmFtLXZhbHVlLCBkZXNjcmlwdGlvbj8pPgorCis8IS0tCitUaGUgcGFyYW0tbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgcGFyYW1ldGVyLgorLS0+CisKKzwhRUxFTUVOVCBwYXJhbS1uYW1lICgjUENEQVRBKT4KKworPCEtLQorVGhlIHBhcmFtLXZhbHVlIGVsZW1lbnQgY29udGFpbnMgdGhlIHZhbHVlIG9mIGEgcGFyYW1ldGVyLgorLS0+CisKKzwhRUxFTUVOVCBwYXJhbS12YWx1ZSAoI1BDREFUQSk+CisKKzwhLS0KK1RoZSBzZXJ2bGV0IGVsZW1lbnQgY29udGFpbnMgdGhlIGRlY2xhcmF0aXZlIGRhdGEgb2YgYQorc2VydmxldC4gSWYgYSBqc3AtZmlsZSBpcyBzcGVjaWZpZWQgYW5kIHRoZSBsb2FkLW9uLXN0YXJ0dXAgZWxlbWVudCBpcworcHJlc2VudCwgdGhlbiB0aGUgSlNQIHNob3VsZCBiZSBwcmVjb21waWxlZCBhbmQgbG9hZGVkLgorLS0+CisKKzwhRUxFTUVOVCBzZXJ2bGV0IChpY29uPywgc2VydmxldC1uYW1lLCBkaXNwbGF5LW5hbWU/LCBkZXNjcmlwdGlvbj8sCisoc2VydmxldC1jbGFzc3xqc3AtZmlsZSksIGluaXQtcGFyYW0qLCBsb2FkLW9uLXN0YXJ0dXA/LCBzZWN1cml0eS1yb2xlLXJlZiopPgorCis8IS0tCitUaGUgc2VydmxldC1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIGNhbm9uaWNhbCBuYW1lIG9mIHRoZQorc2VydmxldC4KKy0tPgorCis8IUVMRU1FTlQgc2VydmxldC1uYW1lICgjUENEQVRBKT4KKworPCEtLQorVGhlIHNlcnZsZXQtY2xhc3MgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUKK29mIHRoZSBzZXJ2bGV0LgorLS0+CisKKzwhRUxFTUVOVCBzZXJ2bGV0LWNsYXNzICgjUENEQVRBKT4KKworPCEtLQorVGhlIGpzcC1maWxlIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGwgcGF0aCB0byBhIEpTUCBmaWxlIHdpdGhpbgordGhlIHdlYiBhcHBsaWNhdGlvbi4KKy0tPgorCis8IUVMRU1FTlQganNwLWZpbGUgKCNQQ0RBVEEpPgorCis8IS0tCitUaGUgaW5pdC1wYXJhbSBlbGVtZW50IGNvbnRhaW5zIGEgbmFtZS92YWx1ZSBwYWlyIGFzIGFuCitpbml0aWFsaXphdGlvbiBwYXJhbSBvZiB0aGUgc2VydmxldAorLS0+CisKKzwhRUxFTUVOVCBpbml0LXBhcmFtIChwYXJhbS1uYW1lLCBwYXJhbS12YWx1ZSwgZGVzY3JpcHRpb24/KT4KKworPCEtLQorVGhlIGxvYWQtb24tc3RhcnR1cCBlbGVtZW50IGluZGljYXRlcyB0aGF0IHRoaXMgc2VydmxldCBzaG91bGQgYmUKK2xvYWRlZCBvbiB0aGUgc3RhcnR1cCBvZiB0aGUgd2ViIGFwcGxpY2F0aW9uLiBUaGUgb3B0aW9uYWwgY29udGVudHMgb2YKK3RoZXNlIGVsZW1lbnQgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgaW5kaWNhdGluZyB0aGUgb3JkZXIgaW4gd2hpY2gKK3RoZSBzZXJ2bGV0IHNob3VsZCBiZSBsb2FkZWQuIExvd2VyIGludGVnZXJzIGFyZSBsb2FkZWQgYmVmb3JlIGhpZ2hlcgoraW50ZWdlcnMuIElmIG5vIHZhbHVlIGlzIHNwZWNpZmllZCwgb3IgaWYgdGhlIHZhbHVlIHNwZWNpZmllZCBpcyBub3QgYQorcG9zaXRpdmUgaW50ZWdlciwgdGhlIGNvbnRhaW5lciBpcyBmcmVlIHRvIGxvYWQgaXQgYXQgYW55IHRpbWUgaW4gdGhlCitzdGFydHVwIHNlcXVlbmNlLgorLS0+CisKKzwhRUxFTUVOVCBsb2FkLW9uLXN0YXJ0dXAgKCNQQ0RBVEEpPgorCis8IS0tCitUaGUgc2VydmxldC1tYXBwaW5nIGVsZW1lbnQgZGVmaW5lcyBhIG1hcHBpbmcgYmV0d2VlbiBhIHNlcnZsZXQKK2FuZCBhIHVybCBwYXR0ZXJuCistLT4KKworPCFFTEVNRU5UIHNlcnZsZXQtbWFwcGluZyAoc2VydmxldC1uYW1lLCB1cmwtcGF0dGVybik+CisKKzwhLS0KK1RoZSB1cmwtcGF0dGVybiBlbGVtZW50IGNvbnRhaW5zIHRoZSB1cmwgcGF0dGVybiBvZiB0aGUKK21hcHBpbmcuIE11c3QgZm9sbG93IHRoZSBydWxlcyBzcGVjaWZpZWQgaW4gU2VjdGlvbiAxMCBvZiB0aGUgU2VydmxldAorQVBJIFNwZWNpZmljYXRpb24uCistLT4KKworPCFFTEVNRU5UIHVybC1wYXR0ZXJuICgjUENEQVRBKT4KKworPCEtLQorVGhlIHNlc3Npb24tY29uZmlnIGVsZW1lbnQgZGVmaW5lcyB0aGUgc2Vzc2lvbiBwYXJhbWV0ZXJzIGZvcgordGhpcyB3ZWIgYXBwbGljYXRpb24uCistLT4KKworPCFFTEVNRU5UIHNlc3Npb24tY29uZmlnIChzZXNzaW9uLXRpbWVvdXQ/KT4KKworPCEtLQorVGhlIHNlc3Npb24tdGltZW91dCBlbGVtZW50IGRlZmluZXMgdGhlIGRlZmF1bHQgc2Vzc2lvbiB0aW1lb3V0CitpbnRlcnZhbCBmb3IgYWxsIHNlc3Npb25zIGNyZWF0ZWQgaW4gdGhpcyB3ZWIgYXBwbGljYXRpb24uIFRoZQorc3BlY2lmaWVkIHRpbWVvdXQgbXVzdCBiZSBleHByZXNzZWQgaW4gYSB3aG9sZSBudW1iZXIgb2YgbWludXRlcy4KKy0tPgorCis8IUVMRU1FTlQgc2Vzc2lvbi10aW1lb3V0ICgjUENEQVRBKT4KKworPCEtLQorVGhlIG1pbWUtbWFwcGluZyBlbGVtZW50IGRlZmluZXMgYSBtYXBwaW5nIGJldHdlZW4gYW4gZXh0ZW5zaW9uCithbmQgYSBtaW1lIHR5cGUuCistLT4KKworPCFFTEVNRU5UIG1pbWUtbWFwcGluZyAoZXh0ZW5zaW9uLCBtaW1lLXR5cGUpPgorCis8IS0tCitUaGUgZXh0ZW5zaW9uIGVsZW1lbnQgY29udGFpbnMgYSBzdHJpbmcgZGVzY3JpYmluZyBhbgorZXh0ZW5zaW9uLiBleGFtcGxlOiAidHh0IgorLS0+CisKKzwhRUxFTUVOVCBleHRlbnNpb24gKCNQQ0RBVEEpPgorCis8IS0tCitUaGUgbWltZS10eXBlIGVsZW1lbnQgY29udGFpbnMgYSBkZWZpbmVkIG1pbWUgdHlwZS4gZXhhbXBsZToKKyJ0ZXh0L3BsYWluIgorLS0+CisKKzwhRUxFTUVOVCBtaW1lLXR5cGUgKCNQQ0RBVEEpPgorCis8IS0tCitUaGUgd2VsY29tZS1maWxlLWxpc3QgY29udGFpbnMgYW4gb3JkZXJlZCBsaXN0IG9mIHdlbGNvbWUgZmlsZXMKK2VsZW1lbnRzLgorLS0+CisKKzwhRUxFTUVOVCB3ZWxjb21lLWZpbGUtbGlzdCAod2VsY29tZS1maWxlKyk+CisKKzwhLS0KK1RoZSB3ZWxjb21lLWZpbGUgZWxlbWVudCBjb250YWlucyBmaWxlIG5hbWUgdG8gdXNlIGFzIGEgZGVmYXVsdAord2VsY29tZSBmaWxlLCBzdWNoIGFzIGluZGV4Lmh0bWwKKy0tPgorCis8IUVMRU1FTlQgd2VsY29tZS1maWxlICgjUENEQVRBKT4KKworPCEtLQorVGhlIHRhZ2xpYiBlbGVtZW50IGlzIHVzZWQgdG8gZGVzY3JpYmUgYSBKU1AgdGFnIGxpYnJhcnkuCistLT4KKworPCFFTEVNRU5UIHRhZ2xpYiAodGFnbGliLXVyaSwgdGFnbGliLWxvY2F0aW9uKT4KKworPCEtLQorVGhlIHRhZ2xpYi11cmkgZWxlbWVudCBkZXNjcmliZXMgYSBVUkksIHJlbGF0aXZlIHRvIHRoZSBsb2NhdGlvbgorb2YgdGhlIHdlYi54bWwgZG9jdW1lbnQsIGlkZW50aWZ5aW5nIGEgVGFnIExpYnJhcnkgdXNlZCBpbiB0aGUgV2ViCitBcHBsaWNhdGlvbi4KKy0tPgorCis8IUVMRU1FTlQgdGFnbGliLXVyaSAoI1BDREFUQSk+CisKKzwhLS0KK3RoZSB0YWdsaWItbG9jYXRpb24gZWxlbWVudCBjb250YWlucyB0aGUgbG9jYXRpb24gKGFzIGEgcmVzb3VyY2UKK3JlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSB3ZWIgYXBwbGljYXRpb24pIHdoZXJlIHRvIGZpbmQgdGhlIFRhZworTGliYXJ5IERlc2NyaXB0aW9uIGZpbGUgZm9yIHRoZSB0YWcgbGlicmFyeS4KKy0tPgorCis8IUVMRU1FTlQgdGFnbGliLWxvY2F0aW9uICgjUENEQVRBKT4KKworPCEtLQorVGhlIGVycm9yLXBhZ2UgZWxlbWVudCBjb250YWlucyBhIG1hcHBpbmcgYmV0d2VlbiBhbiBlcnJvciBjb2RlCitvciBleGNlcHRpb24gdHlwZSB0byB0aGUgcGF0aCBvZiBhIHJlc291cmNlIGluIHRoZSB3ZWIgYXBwbGljYXRpb24KKy0tPgorCis8IUVMRU1FTlQgZXJyb3ItcGFnZSAoKGVycm9yLWNvZGUgfCBleGNlcHRpb24tdHlwZSksIGxvY2F0aW9uKT4KKworPCEtLQorVGhlIGVycm9yLWNvZGUgY29udGFpbnMgYW4gSFRUUCBlcnJvciBjb2RlLCBleDogNDA0CistLT4KKworPCFFTEVNRU5UIGVycm9yLWNvZGUgKCNQQ0RBVEEpPgorCis8IS0tCitUaGUgZXhjZXB0aW9uIHR5cGUgY29udGFpbnMgYSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiBhCitKYXZhIGV4Y2VwdGlvbiB0eXBlLgorLS0+CisKKzwhRUxFTUVOVCBleGNlcHRpb24tdHlwZSAoI1BDREFUQSk+CisKKzwhLS0KK1RoZSBsb2NhdGlvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBsb2NhdGlvbiBvZiB0aGUgcmVzb3VyY2UgaW4gdGhlCit3ZWIgYXBwbGljYXRpb24KKy0tPgorCis8IUVMRU1FTlQgbG9jYXRpb24gKCNQQ0RBVEEpPgorCis8IS0tCitUaGUgcmVzb3VyY2UtcmVmIGVsZW1lbnQgY29udGFpbnMgYSBkZWNsYXJhdGlvbiBvZiBhIFdlYgorQXBwbGljYXRpb24ncyByZWZlcmVuY2UgdG8gYW4gZXh0ZXJuYWwgcmVzb3VyY2UuCistLT4KKworPCFFTEVNRU5UIHJlc291cmNlLXJlZiAoZGVzY3JpcHRpb24/LCByZXMtcmVmLW5hbWUsIHJlcy10eXBlLCByZXMtYXV0aCk+CisKKzwhLS0KK1RoZSByZXMtcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIHJlc291cmNlCitmYWN0b3J5IHJlZmVyZW5jZSBuYW1lLgorLS0+CisKKzwhRUxFTUVOVCByZXMtcmVmLW5hbWUgKCNQQ0RBVEEpPgorCis8IS0tCitUaGUgcmVzLXR5cGUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIChKYXZhIGNsYXNzKSB0eXBlIG9mIHRoZSBkYXRhCitzb3VyY2UuCistLT4KKworPCFFTEVNRU5UIHJlcy10eXBlICgjUENEQVRBKT4KKworPCEtLQorVGhlIHJlcy1hdXRoIGVsZW1lbnQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGFwcGxpY2F0aW9uIGNvbXBvbmVudAorY29kZSBwZXJmb3JtcyByZXNvdXJjZSBzaWdub24gcHJvZ3JhbW1hdGljYWxseSBvciB3aGV0aGVyIHRoZQorY29udGFpbmVyIHNpZ25zIG9udG8gdGhlIHJlc291cmNlIGJhc2VkIG9uIHRoZSBwcmluY2lwbGUgbWFwcGluZworaW5mb3JtYXRpb24gc3VwcGxpZWQgYnkgdGhlIGRlcGxveWVyLiBNdXN0IGJlIENPTlRBSU5FUiBvciBTRVJWTEVUCistLT4KKworPCFFTEVNRU5UIHJlcy1hdXRoICgjUENEQVRBKT4KKworPCEtLQorVGhlIHNlY3VyaXR5LWNvbnN0cmFpbnQgZWxlbWVudCBpcyB1c2VkIHRvIGFzc29jaWF0ZSBzZWN1cml0eQorY29uc3RyYWludHMgd2l0aCBvbmUgb3IgbW9yZSB3ZWIgcmVzb3VyY2UgY29sbGVjdGlvbnMKKy0tPgorCis8IUVMRU1FTlQgc2VjdXJpdHktY29uc3RyYWludCAod2ViLXJlc291cmNlLWNvbGxlY3Rpb24rLAorYXV0aC1jb25zdHJhaW50PywgdXNlci1kYXRhLWNvbnN0cmFpbnQ/KT4KKworPCEtLQorVGhlIHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uIGVsZW1lbnQgaXMgdXNlZCB0byBpZGVudGlmeSBhIHN1YnNldAorb2YgdGhlIHJlc291cmNlcyBhbmQgSFRUUCBtZXRob2RzIG9uIHRob3NlIHJlc291cmNlcyB3aXRoaW4gYSB3ZWIKK2FwcGxpY2F0aW9uIHRvIHdoaWNoIGEgc2VjdXJpdHkgY29uc3RyYWludCBhcHBsaWVzLiBJZiBubyBIVFRQIG1ldGhvZHMKK2FyZSBzcGVjaWZpZWQsIHRoZW4gdGhlIHNlY3VyaXR5IGNvbnN0cmFpbnQgYXBwbGllcyB0byBhbGwgSFRUUAorbWV0aG9kcy4KKy0tPgorCis8IUVMRU1FTlQgd2ViLXJlc291cmNlLWNvbGxlY3Rpb24gKHdlYi1yZXNvdXJjZS1uYW1lLCBkZXNjcmlwdGlvbj8sCit1cmwtcGF0dGVybiosIGh0dHAtbWV0aG9kKik+CisKKzwhLS0KK1RoZSB3ZWItcmVzb3VyY2UtbmFtZSBjb250YWlucyB0aGUgbmFtZSBvZiB0aGlzIHdlYiByZXNvdXJjZQorY29sbGVjdGlvbgorLS0+CisKKzwhRUxFTUVOVCB3ZWItcmVzb3VyY2UtbmFtZSAoI1BDREFUQSk+CisKKzwhLS0KK1RoZSBodHRwLW1ldGhvZCBjb250YWlucyBhbiBIVFRQIG1ldGhvZCAoR0VUIHwgUE9TVCB8Li4uKQorLS0+CisKKzwhRUxFTUVOVCBodHRwLW1ldGhvZCAoI1BDREFUQSk+CisKKzwhLS0KK1RoZSB1c2VyLWRhdGEtY29uc3RyYWludCBlbGVtZW50IGlzIHVzZWQgdG8gaW5kaWNhdGUgaG93IGRhdGEKK2NvbW11bmljYXRlZCBiZXR3ZWVuIHRoZSBjbGllbnQgYW5kIGNvbnRhaW5lciBzaG91bGQgYmUgcHJvdGVjdGVkCistLT4KKworPCFFTEVNRU5UIHVzZXItZGF0YS1jb25zdHJhaW50IChkZXNjcmlwdGlvbj8sIHRyYW5zcG9ydC1ndWFyYW50ZWUpPgorCis8IS0tCitUaGUgdHJhbnNwb3J0LWd1YXJhbnRlZSBlbGVtZW50IHNwZWNpZmllcyB0aGF0IHRoZSBjb21tdW5pY2F0aW9uCitiZXR3ZWVuIGNsaWVudCBhbmQgc2VydmVyIHNob3VsZCBiZSBOT05FLCBJTlRFR1JBTCwgb3IKK0NPTkZJREVOVElBTC4gTk9ORSBtZWFucyB0aGF0IHRoZSBhcHBsaWNhdGlvbiBkb2VzIG5vdCByZXF1aXJlIGFueQordHJhbnNwb3J0IGd1YXJhbnRlZXMuIEEgdmFsdWUgb2YgSU5URUdSQUwgbWVhbnMgdGhhdCB0aGUgYXBwbGljYXRpb24KK3JlcXVpcmVzIHRoYXQgdGhlIGRhdGEgc2VudCBiZXR3ZWVuIHRoZSBjbGllbnQgYW5kIHNlcnZlciBiZSBzZW50IGluCitzdWNoIGEgd2F5IHRoYXQgaXQgY2FuJ3QgYmUgY2hhbmdlZCBpbiB0cmFuc2l0LiBDT05GSURFTlRJQUwgbWVhbnMKK3RoYXQgdGhlIGFwcGxpY2F0aW9uIHJlcXVpcmVzIHRoYXQgdGhlIGRhdGEgYmUgdHJhbnNtaXR0ZWQgaW4gYQorZmFzaGlvbiB0aGF0IHByZXZlbnRzIG90aGVyIGVudGl0aWVzIGZyb20gb2JzZXJ2aW5nIHRoZSBjb250ZW50cyBvZgordGhlIHRyYW5zbWlzc2lvbi4gSW4gbW9zdCBjYXNlcywgdGhlIHByZXNlbmNlIG9mIHRoZSBJTlRFR1JBTCBvcgorQ09ORklERU5USUFMIGZsYWcgd2lsbCBpbmRpY2F0ZSB0aGF0IHRoZSB1c2Ugb2YgU1NMIGlzIHJlcXVpcmVkLgorLS0+CisKKzwhRUxFTUVOVCB0cmFuc3BvcnQtZ3VhcmFudGVlICgjUENEQVRBKT4KKworPCEtLQorVGhlIGF1dGgtY29uc3RyYWludCBlbGVtZW50IGluZGljYXRlcyB0aGUgdXNlciByb2xlcyB0aGF0IHNob3VsZAorYmUgcGVybWl0dGVkIGFjY2VzcyB0byB0aGlzIHJlc291cmNlIGNvbGxlY3Rpb24uIFRoZSByb2xlIHVzZWQgaGVyZQorbXVzdCBhcHBlYXIgaW4gYSBzZWN1cml0eS1yb2xlLXJlZiBlbGVtZW50LgorLS0+CisKKzwhRUxFTUVOVCBhdXRoLWNvbnN0cmFpbnQgKGRlc2NyaXB0aW9uPywgcm9sZS1uYW1lKik+CisKKzwhLS0KK1RoZSByb2xlLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIHNlY3VyaXR5IHJvbGUuCistLT4KKworPCFFTEVNRU5UIHJvbGUtbmFtZSAoI1BDREFUQSk+CisKKzwhLS0KK1RoZSBsb2dpbi1jb25maWcgZWxlbWVudCBpcyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgYXV0aGVudGljYXRpb24KK21ldGhvZCB0aGF0IHNob3VsZCBiZSB1c2VkLCB0aGUgcmVhbG0gbmFtZSB0aGF0IHNob3VsZCBiZSB1c2VkIGZvcgordGhpcyBhcHBsaWNhdGlvbiwgYW5kIHRoZSBhdHRyaWJ1dGVzIHRoYXQgYXJlIG5lZWRlZCBieSB0aGUgZm9ybSBsb2dpbgorbWVjaGFuaXNtLgorLS0+CisKKzwhRUxFTUVOVCBsb2dpbi1jb25maWcgKGF1dGgtbWV0aG9kPywgcmVhbG0tbmFtZT8sIGZvcm0tbG9naW4tY29uZmlnPyk+CisKKzwhLS0KK1RoZSByZWFsbSBuYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSByZWFsbSBuYW1lIHRvIHVzZSBpbiBIVFRQCitCYXNpYyBhdXRob3JpemF0aW9uCistLT4KKworPCFFTEVNRU5UIHJlYWxtLW5hbWUgKCNQQ0RBVEEpPgorCis8IS0tCitUaGUgZm9ybS1sb2dpbi1jb25maWcgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGxvZ2luIGFuZCBlcnJvciBwYWdlcwordGhhdCBzaG91bGQgYmUgdXNlZCBpbiBmb3JtIGJhc2VkIGxvZ2luLiBJZiBmb3JtIGJhc2VkIGF1dGhlbnRpY2F0aW9uCitpcyBub3QgdXNlZCwgdGhlc2UgZWxlbWVudHMgYXJlIGlnbm9yZWQuCistLT4KKworPCFFTEVNRU5UIGZvcm0tbG9naW4tY29uZmlnIChmb3JtLWxvZ2luLXBhZ2UsIGZvcm0tZXJyb3ItcGFnZSk+CisKKzwhLS0KK1RoZSBmb3JtLWxvZ2luLXBhZ2UgZWxlbWVudCBkZWZpbmVzIHRoZSBsb2NhdGlvbiBpbiB0aGUgd2ViIGFwcAord2hlcmUgdGhlIHBhZ2UgdGhhdCBjYW4gYmUgdXNlZCBmb3IgbG9naW4gY2FuIGJlIGZvdW5kCistLT4KKworPCFFTEVNRU5UIGZvcm0tbG9naW4tcGFnZSAoI1BDREFUQSk+CisKKzwhLS0KK1RoZSBmb3JtLWVycm9yLXBhZ2UgZWxlbWVudCBkZWZpbmVzIHRoZSBsb2NhdGlvbiBpbiB0aGUgd2ViIGFwcAord2hlcmUgdGhlIGVycm9yIHBhZ2UgdGhhdCBpcyBkaXNwbGF5ZWQgd2hlbiBsb2dpbiBpcyBub3Qgc3VjY2Vzc2Z1bAorY2FuIGJlIGZvdW5kCistLT4KKworPCFFTEVNRU5UIGZvcm0tZXJyb3ItcGFnZSAoI1BDREFUQSk+CisKKzwhLS0KK1RoZSBhdXRoLW1ldGhvZCBlbGVtZW50IGlzIHVzZWQgdG8gY29uZmlndXJlIHRoZSBhdXRoZW50aWNhdGlvbgorbWVjaGFuaXNtIGZvciB0aGUgd2ViIGFwcGxpY2F0aW9uLiBBcyBhIHByZXJlcXVpc2l0ZSB0byBnYWluaW5nIGFjY2VzcwordG8gYW55IHdlYiByZXNvdXJjZXMgd2hpY2ggYXJlIHByb3RlY3RlZCBieSBhbiBhdXRob3JpemF0aW9uCitjb25zdHJhaW50LCBhIHVzZXIgbXVzdCBoYXZlIGF1dGhlbnRpY2F0ZWQgdXNpbmcgdGhlIGNvbmZpZ3VyZWQKK21lY2hhbmlzbS4gTGVnYWwgdmFsdWVzIGZvciB0aGlzIGVsZW1lbnQgYXJlICJCQVNJQyIsICJESUdFU1QiLAorIkZPUk0iLCBvciAiQ0xJRU5ULUNFUlQiLgorLS0+CisKKzwhRUxFTUVOVCBhdXRoLW1ldGhvZCAoI1BDREFUQSk+CisKKzwhLS0KK1RoZSBzZWN1cml0eS1yb2xlIGVsZW1lbnQgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIGEgc2VjdXJpdHkKK3JvbGUgd2hpY2ggaXMgdXNlZCBpbiB0aGUgc2VjdXJpdHktY29uc3RyYWludHMgcGxhY2VkIG9uIHRoZSB3ZWIKK2FwcGxpY2F0aW9uLgorLS0+CisKKzwhRUxFTUVOVCBzZWN1cml0eS1yb2xlIChkZXNjcmlwdGlvbj8sIHJvbGUtbmFtZSk+CisKKzwhLS0KK1RoZSByb2xlLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIHJvbGUuIFRoaXMgZWxlbWVudAorbXVzdCBjb250YWluIGEgbm9uLWVtcHR5IHN0cmluZy4KKy0tPgorCis8IUVMRU1FTlQgc2VjdXJpdHktcm9sZS1yZWYgKGRlc2NyaXB0aW9uPywgcm9sZS1uYW1lLCByb2xlLWxpbmspPgorCis8IS0tCitUaGUgcm9sZS1saW5rIGVsZW1lbnQgaXMgdXNlZCB0byBsaW5rIGEgc2VjdXJpdHkgcm9sZSByZWZlcmVuY2UKK3RvIGEgZGVmaW5lZCBzZWN1cml0eSByb2xlLiBUaGUgcm9sZS1saW5rIGVsZW1lbnQgbXVzdCBjb250YWluIHRoZQorbmFtZSBvZiBvbmUgb2YgdGhlIHNlY3VyaXR5IHJvbGVzIGRlZmluZWQgaW4gdGhlIHNlY3VyaXR5LXJvbGUKK2VsZW1lbnRzLgorLS0+CisKKzwhRUxFTUVOVCByb2xlLWxpbmsgKCNQQ0RBVEEpPgorCis8IS0tCitUaGUgZW52LWVudHJ5IGVsZW1lbnQgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIGFuCithcHBsaWNhdGlvbidzIGVudmlyb25tZW50IGVudHJ5LiBUaGlzIGVsZW1lbnQgaXMgcmVxdWlyZWQgdG8gYmUKK2hvbm9yZWQgb24gaW4gSjJFRSBjb21wbGlhbnQgc2VydmxldCBjb250YWluZXJzLgorLS0+CisKKzwhRUxFTUVOVCBlbnYtZW50cnkgKGRlc2NyaXB0aW9uPywgZW52LWVudHJ5LW5hbWUsIGVudi1lbnRyeS12YWx1ZT8sCitlbnYtZW50cnktdHlwZSk+CisKKzwhLS0KK1RoZSBlbnYtZW50cnktbmFtZSBjb250YWlucyB0aGUgbmFtZSBvZiBhbiBhcHBsaWNhdGlvbidzCitlbnZpcm9ubWVudCBlbnRyeQorLS0+CisKKzwhRUxFTUVOVCBlbnYtZW50cnktbmFtZSAoI1BDREFUQSk+CisKKzwhLS0KK1RoZSBlbnYtZW50cnktdmFsdWUgZWxlbWVudCBjb250YWlucyB0aGUgdmFsdWUgb2YgYW4KK2FwcGxpY2F0aW9uJ3MgZW52aXJvbm1lbnQgZW50cnkKKy0tPgorCis8IUVMRU1FTlQgZW52LWVudHJ5LXZhbHVlICgjUENEQVRBKT4KKworPCEtLQorVGhlIGVudi1lbnRyeS10eXBlIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5IHF1YWxpZmllZCBKYXZhIHR5cGUKK29mIHRoZSBlbnZpcm9ubWVudCBlbnRyeSB2YWx1ZSB0aGF0IGlzIGV4cGVjdGVkIGJ5IHRoZSBhcHBsaWNhdGlvbgorY29kZS4gVGhlIGZvbGxvd2luZyBhcmUgdGhlIGxlZ2FsIHZhbHVlcyBvZiBlbnYtZW50cnktdHlwZToKK2phdmEubGFuZy5Cb29sZWFuLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuSW50ZWdlciwKK2phdmEubGFuZy5Eb3VibGUsIGphdmEubGFuZy5GbG9hdC4KKy0tPgorCis8IUVMRU1FTlQgZW52LWVudHJ5LXR5cGUgKCNQQ0RBVEEpPgorCis8IS0tCitUaGUgZWpiLXJlZiBlbGVtZW50IGlzIHVzZWQgdG8gZGVjbGFyZSBhIHJlZmVyZW5jZSB0byBhbgorZW50ZXJwcmlzZSBiZWFuLiAKKy0tPgorCis8IUVMRU1FTlQgZWpiLXJlZiAoZGVzY3JpcHRpb24/LCBlamItcmVmLW5hbWUsIGVqYi1yZWYtdHlwZSwgaG9tZSwgcmVtb3RlLAorZWpiLWxpbms/KT4KKworPCEtLQorVGhlIGVqYi1yZWYtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGFuIEVKQgorcmVmZXJlbmNlLiBUaGlzIGlzIHRoZSBKTkRJIG5hbWUgdGhhdCB0aGUgc2VydmxldCBjb2RlIHVzZXMgdG8gZ2V0IGEKK3JlZmVyZW5jZSB0byB0aGUgZW50ZXJwcmlzZSBiZWFuLgorLS0+CisKKzwhRUxFTUVOVCBlamItcmVmLW5hbWUgKCNQQ0RBVEEpPgorCis8IS0tCitUaGUgZWpiLXJlZi10eXBlIGVsZW1lbnQgY29udGFpbnMgdGhlIGV4cGVjdGVkIGphdmEgY2xhc3MgdHlwZSBvZgordGhlIHJlZmVyZW5jZWQgRUpCLgorLS0+CisKKzwhRUxFTUVOVCBlamItcmVmLXR5cGUgKCNQQ0RBVEEpPgorCis8IS0tCitUaGUgZWpiLWhvbWUgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlCitFSkIncyBob21lIGludGVyZmFjZQorLS0+CisKKzwhRUxFTUVOVCBob21lICgjUENEQVRBKT4KKworPCEtLQorVGhlIGVqYi1yZW1vdGUgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlCitFSkIncyByZW1vdGUgaW50ZXJmYWNlCistLT4KKworPCFFTEVNRU5UIHJlbW90ZSAoI1BDREFUQSk+CisKKzwhLS0KK1RoZSBlamItbGluayBlbGVtZW50IGlzIHVzZWQgaW4gdGhlIGVqYi1yZWYgZWxlbWVudCB0byBzcGVjaWZ5Cit0aGF0IGFuIEVKQiByZWZlcmVuY2UgaXMgbGlua2VkIHRvIGFuIEVKQiBpbiBhbiBlbmNvbXBhc3NpbmcgSmF2YTIKK0VudGVycHJpc2UgRWRpdGlvbiAoSjJFRSkgYXBwbGljYXRpb24gcGFja2FnZS4gVGhlIHZhbHVlIG9mIHRoZQorZWpiLWxpbmsgZWxlbWVudCBtdXN0IGJlIHRoZSBlamItbmFtZSBvZiBhbmQgRUpCIGluIHRoZSBKMkVFCithcHBsaWNhdGlvbiBwYWNrYWdlLgorLS0+CisKKzwhRUxFTUVOVCBlamItbGluayAoI1BDREFUQSk+CisKKzwhLS0KK1RoZSBJRCBtZWNoYW5pc20gaXMgdG8gYWxsb3cgdG9vbHMgdG8gZWFzaWx5IG1ha2UgdG9vbC1zcGVjaWZpYworcmVmZXJlbmNlcyB0byB0aGUgZWxlbWVudHMgb2YgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvci4gVGhpcyBhbGxvd3MKK3Rvb2xzIHRoYXQgcHJvZHVjZSBhZGRpdGlvbmFsIGRlcGxveW1lbnQgaW5mb3JtYXRpb24gKGkuZSBpbmZvcm1hdGlvbgorYmV5b25kIHRoZSBzdGFuZGFyZCBkZXBsb3ltZW50IGRlc2NyaXB0b3IgaW5mb3JtYXRpb24pIHRvIHN0b3JlIHRoZQorbm9uLXN0YW5kYXJkIGluZm9ybWF0aW9uIGluIGEgc2VwYXJhdGUgZmlsZSwgYW5kIGVhc2lseSByZWZlciBmcm9tCit0aGVzZSB0b29scy1zcGVjaWZpYyBmaWxlcyB0byB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIHN0YW5kYXJkIHdlYi1hcHAKK2RlcGxveW1lbnQgZGVzY3JpcHRvci4KKy0tPgorCis8IUFUVExJU1Qgd2ViLWFwcCBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBpY29uIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIHNtYWxsLWljb24gaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgbGFyZ2UtaWNvbiBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBkaXNwbGF5LW5hbWUgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgZGVzY3JpcHRpb24gaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgZGlzdHJpYnV0YWJsZSBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBjb250ZXh0LXBhcmFtIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIHBhcmFtLW5hbWUgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgcGFyYW0tdmFsdWUgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1Qgc2VydmxldCBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBzZXJ2bGV0LW5hbWUgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1Qgc2VydmxldC1jbGFzcyBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBqc3AtZmlsZSBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBpbml0LXBhcmFtIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIGxvYWQtb24tc3RhcnR1cCBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBzZXJ2bGV0LW1hcHBpbmcgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgdXJsLXBhdHRlcm4gaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1Qgc2Vzc2lvbi1jb25maWcgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1Qgc2Vzc2lvbi10aW1lb3V0IGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIG1pbWUtbWFwcGluZyBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBleHRlbnNpb24gaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgbWltZS10eXBlIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIHdlbGNvbWUtZmlsZS1saXN0IGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIHdlbGNvbWUtZmlsZSBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCB0YWdsaWIgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgdGFnbGliLXVyaSBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCB0YWdsaWItbG9jYXRpb24gaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgZXJyb3ItcGFnZSBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBlcnJvci1jb2RlIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIGV4Y2VwdGlvbi10eXBlIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIGxvY2F0aW9uIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIHJlc291cmNlLXJlZiBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCByZXMtcmVmLW5hbWUgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgcmVzLXR5cGUgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgcmVzLWF1dGggaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1Qgc2VjdXJpdHktY29uc3RyYWludCBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCB3ZWItcmVzb3VyY2UtY29sbGVjdGlvbiBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCB3ZWItcmVzb3VyY2UtbmFtZSBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBodHRwLW1ldGhvZCBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCB1c2VyLWRhdGEtY29uc3RyYWludCBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCB0cmFuc3BvcnQtZ3VhcmFudGVlIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIGF1dGgtY29uc3RyYWludCBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCByb2xlLW5hbWUgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgbG9naW4tY29uZmlnIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIHJlYWxtLW5hbWUgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgZm9ybS1sb2dpbi1jb25maWcgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgZm9ybS1sb2dpbi1wYWdlIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIGZvcm0tZXJyb3ItcGFnZSBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBhdXRoLW1ldGhvZCBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBzZWN1cml0eS1yb2xlIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIHNlY3VyaXR5LXJvbGUtcmVmIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIHJvbGUtbGluayBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBlbnYtZW50cnkgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgZW52LWVudHJ5LW5hbWUgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgZW52LWVudHJ5LXZhbHVlIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIGVudi1lbnRyeS10eXBlIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIGVqYi1yZWYgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgZWpiLXJlZi1uYW1lIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIGVqYi1yZWYtdHlwZSBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBob21lIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIHJlbW90ZSBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBlamItbGluayBpZCBJRCAjSU1QTElFRD4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9kdGQvd2ViLWFwcF8yXzMuZHRkIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2R0ZC93ZWItYXBwXzJfMy5kdGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdiZWQ4OAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9kdGQvd2ViLWFwcF8yXzMuZHRkCkBAIC0wLDAgKzEsMTA3NCBAQAorPCEtLQorICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPCEtLQorQ29weXJpZ2h0IDIwMDAtMjAwMSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIDkwMSBTYW4gQW50b25pbyBSb2FkLAorUGFsbyBBbHRvLCBDQSAgOTQzMDMsIFUuUy5BLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworVGhpcyBwcm9kdWN0IG9yIGRvY3VtZW50IGlzIHByb3RlY3RlZCBieSBjb3B5cmlnaHQgYW5kIGRpc3RyaWJ1dGVkCit1bmRlciBsaWNlbnNlcyByZXN0cmljdGluZyBpdHMgdXNlLCBjb3B5aW5nLCBkaXN0cmlidXRpb24sIGFuZAorZGVjb21waWxhdGlvbi4gIE5vIHBhcnQgb2YgdGhpcyBwcm9kdWN0IG9yIGRvY3VtZW50YXRpb24gbWF5IGJlCityZXByb2R1Y2VkIGluIGFueSBmb3JtIGJ5IGFueSBtZWFucyB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbgorb2YgU3VuIGFuZCBpdHMgbGljZW5zb3JzLCBpZiBhbnkuCisKK1RoaXJkIHBhcnR5IHNvZnR3YXJlLCBpbmNsdWRpbmcgZm9udCB0ZWNobm9sb2d5LCBpcyBjb3B5cmlnaHRlZCBhbmQKK2xpY2Vuc2VkIGZyb20gU3VuIHN1cHBsaWVycy4KKworU3VuLCBTdW4gTWljcm9zeXN0ZW1zLCB0aGUgU3VuIExvZ28sIFNvbGFyaXMsIEphdmEsIEphdmFTZXJ2ZXIgUGFnZXMsIEphdmEKK05hbWluZyBhbmQgRGlyZWN0b3J5IEludGVyZmFjZSwgSkRCQywgSkRLLCBKYXZhTWFpbCBhbmQgRW50ZXJwcmlzZSBKYXZhQmVhbnMsCithcmUgdHJhZGVtYXJrcyBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jIGluIHRoZSBVLlMuCithbmQgb3RoZXIgY291bnRyaWVzLgorCitBbGwgU1BBUkMgdHJhZGVtYXJrcyBhcmUgdXNlZCB1bmRlciBsaWNlbnNlIGFuZCBhcmUgdHJhZGVtYXJrcworb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFNQQVJDIEludGVybmF0aW9uYWwsIEluYy4KK2luIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuIFByb2R1Y3RzIGJlYXJpbmcgU1BBUkMKK3RyYWRlbWFya3MgYXJlIGJhc2VkIHVwb24gYW4gYXJjaGl0ZWN0dXJlIGRldmVsb3BlZCBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCisKK1Bvc3RTY3JpcHQgaXMgYSByZWdpc3RlcmVkIHRyYWRlbWFyayBvZiBBZG9iZSBTeXN0ZW1zLCBJbmMuCisKK0ZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycyBTdWJqZWN0IHRvCitTdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgorCitET0NVTUVOVEFUSU9OIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFMTCBFWFBSRVNTIE9SIElNUExJRUQKK0NPTkRJVElPTlMsIFJFUFJFU0VOVEFUSU9OUyBBTkQgV0FSUkFOVElFUywgSU5DTFVESU5HIEFOWQorSU1QTElFRCBXQVJSQU5UWSBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorUFVSUE9TRSBPUiBOT04tSU5GUklOR0VNRU5ULCBBUkUgRElTQ0xBSU1FRCwgRVhDRVBUCitUTyBUSEUgRVhURU5UIFRIQVQgU1VDSCBESVNDTEFJTUVSUyBBUkUgSEVMRCBUTyBCRSBMRUdBTExZCitJTlZBTElELgorCitfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKK0NvcHlyaWdodCAyMDAwLTIwMDEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwKKzkwMSBTYW4gQW50b25pbyBSb2FkLCBQYWxvIEFsdG8sIENBICA5NDMwMywgRXRhdHMtVW5pcy4KK1RvdXMgZHJvaXRzIHJlJ3NlcnZlJ3MuCisKKworQ2UgcHJvZHVpdCBvdSBkb2N1bWVudCBlc3QgcHJvdGUnZ2UnIHBhciB1biBjb3B5cmlnaHQgZXQgZGlzdHJpYnVlJyBhdmVjCitkZXMgbGljZW5jZXMgcXVpIGVuIHJlc3RyZWlnbmVudCBsJ3V0aWxpc2F0aW9uLCBsYSBjb3BpZSwgbGEgZGlzdHJpYnV0aW9uLAorZXQgbGEgZGUnY29tcGlsYXRpb24uICBBdWN1bmUgcGFydGllIGRlIGNlIHByb2R1aXQgb3UgZGUgc2EgZG9jdW1lbnRhdGlvbgorYXNzb2NpZSdlIG5lIHBldXQgZV50cmUgcmVwcm9kdWl0ZSBzb3VzIGF1Y3VuZSBmb3JtZSwgcGFyIHF1ZWxxdWUgbW95ZW4KK3F1ZSBjZSBzb2l0LCBzYW5zIGwnYXV0b3Jpc2F0aW9uIHByZSdhbGFibGUgZXQgZSdjcml0ZSBkZSBTdW4gZXQgZGUgc2VzCitiYWlsbGV1cnMgZGUgbGljZW5jZSwgcydpbCB5IGVuIGEuCisKK0xlIGxvZ2ljaWVsIGRlJ3RlbnUgcGFyIGRlcyB0aWVycywgZXQgcXVpIGNvbXByZW5kIGxhIHRlY2hub2xvZ2llCityZWxhdGl2ZSBhdXggcG9saWNlcyBkZSBjYXJhY3RlYHJlcywgZXN0IHByb3RlJ2dlJyBwYXIgdW4gY29weXJpZ2h0CitldCBsaWNlbmNpZScgcGFyIGRlcyBmb3Vybmlzc2V1cnMgZGUgU3VuLgorCitTdW4sIFN1biBNaWNyb3N5c3RlbXMsIGxlIGxvZ28gU3VuLCBTb2xhcmlzLCBKYXZhLCBKYXZhU2VydmVyIFBhZ2VzLCBKYXZhCitOYW1pbmcgYW5kIERpcmVjdG9yeSBJbnRlcmZhY2UsIEpEQkMsIEpESywgSmF2YU1haWwsIGV0IEVudGVycHJpc2UgSmF2YUJlYW5zLAorc29udCBkZXMgbWFycXVlcyBkZSBmYWJyaXF1ZSBvdSBkZXMgbWFycXVlcyBkZSdwb3NlJ2VzIGRlIFN1bgorTWljcm9zeXN0ZW1zLCBJbmMuIGF1eCBFdGF0cy1VbmlzIGV0IGRhbnMgZCdhdXRyZXMgcGF5cy4KKworVG91dGVzIGxlcyBtYXJxdWVzIFNQQVJDIHNvbnQgdXRpbGlzZSdlcyBzb3VzIGxpY2VuY2UgZXQgc29udAorZGVzIG1hcnF1ZXMgZGUgZmFicmlxdWUgb3UgZGVzIG1hcnF1ZXMgZGUncG9zZSdlcyBkZSBTUEFSQworSW50ZXJuYXRpb25hbCwgSW5jLiBhdXggRXRhdHMtVW5pcyBldCAgZGFucworZCdhdXRyZXMgcGF5cy4gTGVzIHByb2R1aXRzIHBvcnRhbnQgbGVzIG1hcnF1ZXMgU1BBUkMgc29udAorYmFzZSdzIHN1ciB1bmUgYXJjaGl0ZWN0dXJlIGRlJ3ZlbG9wcGUnZSBwYXIgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgorCitQb3N0Y3JpcHQgZXN0IHVuZSBtYXJxdWUgZW5yZWdpc3RyZSdlIGQnQWRvYmUgU3lzdGVtcyBJbmMuCisKK0xBIERPQ1VNRU5UQVRJT04gRVNUIEZPVVJOSUUgIkVOIEwnRVRBVCIgRVQgVE9VVEVTIEFVVFJFUyBDT05ESVRJT05TLAorREVDTEFSQVRJT05TIEVUIEdBUkFOVElFUyBFWFBSRVNTRVMgT1UgVEFDSVRFUyBTT05UIEZPUk1FTExFTUVOVCBFWENMVUVTLAorREFOUyBMQSBNRVNVUkUgQVVUT1JJU0VFIFBBUiBMQSBMT0kgQVBQTElDQUJMRSwgWSBDT01QUklTIE5PVEFNTUVOVAorVE9VVEUgR0FSQU5USUUgSU1QTElDSVRFIFJFTEFUSVZFIEEgTEEgUVVBTElURSBNQVJDSEFOREUsIEEgTCdBUFRJVFVERQorQSBVTkUgVVRJTElTQVRJT04gUEFSVElDVUxJRVJFIE9VIEEgTCdBQlNFTkNFIERFIENPTlRSRUZBQ09OLgorLS0+CisKKzwhLS0KK1RoaXMgaXMgdGhlIFhNTCBEVEQgZm9yIHRoZSBTZXJ2bGV0IDIuMyBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCitBbGwgU2VydmxldCAyLjMgZGVwbG95bWVudCBkZXNjcmlwdG9ycyBtdXN0IGluY2x1ZGUgYSBET0NUWVBFCitvZiB0aGUgZm9sbG93aW5nIGZvcm06CisKKyAgPCFET0NUWVBFIHdlYi1hcHAgUFVCTElDCisJIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBXZWIgQXBwbGljYXRpb24gMi4zLy9FTiIKKwkiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvd2ViLWFwcF8yXzMuZHRkIj4KKworLS0+CisKKzwhLS0KK1RoZSBmb2xsb3dpbmcgY29udmVudGlvbnMgYXBwbHkgdG8gYWxsIEoyRUUgZGVwbG95bWVudCBkZXNjcmlwdG9yCitlbGVtZW50cyB1bmxlc3MgaW5kaWNhdGVkIG90aGVyd2lzZS4KKworLSBJbiBlbGVtZW50cyB0aGF0IGNvbnRhaW4gUENEQVRBLCBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlCisgIGluIHRoZSBkYXRhIG1heSBiZSBpZ25vcmVkLgorCistIEluIGVsZW1lbnRzIHdob3NlIHZhbHVlIGlzIGFuICJlbnVtZXJhdGVkIHR5cGUiLCB0aGUgdmFsdWUgaXMKKyAgY2FzZSBzZW5zaXRpdmUuCisKKy0gSW4gZWxlbWVudHMgdGhhdCBzcGVjaWZ5IGEgcGF0aG5hbWUgdG8gYSBmaWxlIHdpdGhpbiB0aGUgc2FtZQorICBKQVIgZmlsZSwgcmVsYXRpdmUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZSBub3Qgc3RhcnRpbmcgd2l0aCAiLyIpCisgIGFyZSBjb25zaWRlcmVkIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSBKQVIgZmlsZSdzIG5hbWVzcGFjZS4KKyAgQWJzb2x1dGUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZSBzdGFydGluZyB3aXRoICIvIikgYWxzbyBzcGVjaWZ5CisgIG5hbWVzIGluIHRoZSByb290IG9mIHRoZSBKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEluIGdlbmVyYWwsIHJlbGF0aXZlCisgIG5hbWVzIGFyZSBwcmVmZXJyZWQuICBUaGUgZXhjZXB0aW9uIGlzIC53YXIgZmlsZXMgd2hlcmUgYWJzb2x1dGUKKyAgbmFtZXMgYXJlIHByZWZlcnJlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgc2VydmxldCBBUEkuCistLT4KKworCis8IS0tCitUaGUgd2ViLWFwcCBlbGVtZW50IGlzIHRoZSByb290IG9mIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZm9yCithIHdlYiBhcHBsaWNhdGlvbi4KKy0tPgorPCFFTEVNRU5UIHdlYi1hcHAgKGljb24/LCBkaXNwbGF5LW5hbWU/LCBkZXNjcmlwdGlvbj8sIGRpc3RyaWJ1dGFibGU/LAorY29udGV4dC1wYXJhbSosIGZpbHRlciosIGZpbHRlci1tYXBwaW5nKiwgbGlzdGVuZXIqLCBzZXJ2bGV0KiwKK3NlcnZsZXQtbWFwcGluZyosIHNlc3Npb24tY29uZmlnPywgbWltZS1tYXBwaW5nKiwgd2VsY29tZS1maWxlLWxpc3Q/LAorZXJyb3ItcGFnZSosIHRhZ2xpYiosIHJlc291cmNlLWVudi1yZWYqLCByZXNvdXJjZS1yZWYqLCBzZWN1cml0eS1jb25zdHJhaW50KiwKK2xvZ2luLWNvbmZpZz8sIHNlY3VyaXR5LXJvbGUqLCBlbnYtZW50cnkqLCBlamItcmVmKiwgIGVqYi1sb2NhbC1yZWYqKT4KKworPCEtLQorVGhlIGF1dGgtY29uc3RyYWludCBlbGVtZW50IGluZGljYXRlcyB0aGUgdXNlciByb2xlcyB0aGF0IHNob3VsZAorYmUgcGVybWl0dGVkIGFjY2VzcyB0byB0aGlzIHJlc291cmNlIGNvbGxlY3Rpb24uIFRoZSByb2xlLW5hbWUKK3VzZWQgaGVyZSBtdXN0IGVpdGhlciBjb3JyZXNwb25kIHRvIHRoZSByb2xlLW5hbWUgb2Ygb25lIG9mIHRoZQorc2VjdXJpdHktcm9sZSBlbGVtZW50cyBkZWZpbmVkIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbiwgb3IgYmUKK3RoZSBzcGVjaWFsbHkgcmVzZXJ2ZWQgcm9sZS1uYW1lICIqIiB0aGF0IGlzIGEgY29tcGFjdCBzeW50YXggZm9yCitpbmRpY2F0aW5nIGFsbCByb2xlcyBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uLiBJZiBib3RoICIqIiBhbmQKK3JvbGVuYW1lcyBhcHBlYXIsIHRoZSBjb250YWluZXIgaW50ZXJwcmV0cyB0aGlzIGFzIGFsbCByb2xlcy4KK0lmIG5vIHJvbGVzIGFyZSBkZWZpbmVkLCBubyB1c2VyIGlzIGFsbG93ZWQgYWNjZXNzIHRvIHRoZSBwb3J0aW9uIG9mCit0aGUgd2ViIGFwcGxpY2F0aW9uIGRlc2NyaWJlZCBieSB0aGUgY29udGFpbmluZyBzZWN1cml0eS1jb25zdHJhaW50LgorVGhlIGNvbnRhaW5lciBtYXRjaGVzIHJvbGUgbmFtZXMgY2FzZSBzZW5zaXRpdmVseSB3aGVuIGRldGVybWluaW5nCithY2Nlc3MuCisKKworVXNlZCBpbjogc2VjdXJpdHktY29uc3RyYWludAorLS0+Cis8IUVMRU1FTlQgYXV0aC1jb25zdHJhaW50IChkZXNjcmlwdGlvbj8sIHJvbGUtbmFtZSopPgorCis8IS0tCitUaGUgYXV0aC1tZXRob2QgZWxlbWVudCBpcyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgYXV0aGVudGljYXRpb24KK21lY2hhbmlzbSBmb3IgdGhlIHdlYiBhcHBsaWNhdGlvbi4gQXMgYSBwcmVyZXF1aXNpdGUgdG8gZ2FpbmluZyBhY2Nlc3MgdG8gYW55IHdlYiByZXNvdXJjZXMgd2hpY2ggYXJlIHByb3RlY3RlZCBieSBhbiBhdXRob3JpemF0aW9uCitjb25zdHJhaW50LCBhIHVzZXIgbXVzdCBoYXZlIGF1dGhlbnRpY2F0ZWQgdXNpbmcgdGhlIGNvbmZpZ3VyZWQKK21lY2hhbmlzbS4gTGVnYWwgdmFsdWVzIGZvciB0aGlzIGVsZW1lbnQgYXJlICJCQVNJQyIsICJESUdFU1QiLAorIkZPUk0iLCBvciAiQ0xJRU5ULUNFUlQiLgorCitVc2VkIGluOiBsb2dpbi1jb25maWcKKy0tPgorPCFFTEVNRU5UIGF1dGgtbWV0aG9kICgjUENEQVRBKT4KKworPCEtLQorVGhlIGNvbnRleHQtcGFyYW0gZWxlbWVudCBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgYSB3ZWIKK2FwcGxpY2F0aW9uJ3Mgc2VydmxldCBjb250ZXh0IGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMuCisKK1VzZWQgaW46IHdlYi1hcHAKKy0tPgorPCFFTEVNRU5UIGNvbnRleHQtcGFyYW0gKHBhcmFtLW5hbWUsIHBhcmFtLXZhbHVlLCBkZXNjcmlwdGlvbj8pPgorCis8IS0tCitUaGUgZGVzY3JpcHRpb24gZWxlbWVudCBpcyB1c2VkIHRvIHByb3ZpZGUgdGV4dCBkZXNjcmliaW5nIHRoZSBwYXJlbnQKK2VsZW1lbnQuICBUaGUgZGVzY3JpcHRpb24gZWxlbWVudCBzaG91bGQgaW5jbHVkZSBhbnkgaW5mb3JtYXRpb24gdGhhdAordGhlIHdlYiBhcHBsaWNhdGlvbiB3YXIgZmlsZSBwcm9kdWNlciB3YW50cyB0byBwcm92aWRlIHRvIHRoZSBjb25zdW1lciBvZgordGhlIHdlYiBhcHBsaWNhdGlvbiB3YXIgZmlsZSAoaS5lLiwgdG8gdGhlIERlcGxveWVyKS4gVHlwaWNhbGx5LCB0aGUgdG9vbHMKK3VzZWQgYnkgdGhlIHdlYiBhcHBsaWNhdGlvbiB3YXIgZmlsZSBjb25zdW1lciB3aWxsIGRpc3BsYXkgdGhlIGRlc2NyaXB0aW9uCit3aGVuIHByb2Nlc3NpbmcgdGhlIHBhcmVudCBlbGVtZW50IHRoYXQgY29udGFpbnMgdGhlIGRlc2NyaXB0aW9uLgorCitVc2VkIGluOiBhdXRoLWNvbnN0cmFpbnQsIGNvbnRleHQtcGFyYW0sIGVqYi1sb2NhbC1yZWYsIGVqYi1yZWYsCitlbnYtZW50cnksIGZpbHRlciwgaW5pdC1wYXJhbSwgcmVzb3VyY2UtZW52LXJlZiwgcmVzb3VyY2UtcmVmLCBydW4tYXMsCitzZWN1cml0eS1yb2xlLCBzZWN1cml0eS1yb2xlLXJlZiwgc2VydmxldCwgdXNlci1kYXRhLWNvbnN0cmFpbnQsCit3ZWItYXBwLCB3ZWItcmVzb3VyY2UtY29sbGVjdGlvbgorLS0+Cis8IUVMRU1FTlQgZGVzY3JpcHRpb24gKCNQQ0RBVEEpPgorCis8IS0tCitUaGUgZGlzcGxheS1uYW1lIGVsZW1lbnQgY29udGFpbnMgYSBzaG9ydCBuYW1lIHRoYXQgaXMgaW50ZW5kZWQgdG8gYmUKK2Rpc3BsYXllZCBieSB0b29scy4gIFRoZSBkaXNwbGF5IG5hbWUgbmVlZCBub3QgYmUgdW5pcXVlLgorCitVc2VkIGluOiBmaWx0ZXIsIHNlY3VyaXR5LWNvbnN0cmFpbnQsIHNlcnZsZXQsIHdlYi1hcHAKKworRXhhbXBsZToKKworPGRpc3BsYXktbmFtZT5FbXBsb3llZSBTZWxmIFNlcnZpY2U8L2Rpc3BsYXktbmFtZT4KKy0tPgorPCFFTEVNRU5UIGRpc3BsYXktbmFtZSAoI1BDREFUQSk+CisKKzwhLS0KK1RoZSBkaXN0cmlidXRhYmxlIGVsZW1lbnQsIGJ5IGl0cyBwcmVzZW5jZSBpbiBhIHdlYiBhcHBsaWNhdGlvbgorZGVwbG95bWVudCBkZXNjcmlwdG9yLCBpbmRpY2F0ZXMgdGhhdCB0aGlzIHdlYiBhcHBsaWNhdGlvbiBpcworcHJvZ3JhbW1lZCBhcHByb3ByaWF0ZWx5IHRvIGJlIGRlcGxveWVkIGludG8gYSBkaXN0cmlidXRlZCBzZXJ2bGV0Citjb250YWluZXIKKworVXNlZCBpbjogd2ViLWFwcAorLS0+Cis8IUVMRU1FTlQgZGlzdHJpYnV0YWJsZSBFTVBUWT4KKworPCEtLQorVGhlIGVqYi1saW5rIGVsZW1lbnQgaXMgdXNlZCBpbiB0aGUgZWpiLXJlZiBvciBlamItbG9jYWwtcmVmCitlbGVtZW50cyB0byBzcGVjaWZ5IHRoYXQgYW4gRUpCIHJlZmVyZW5jZSBpcyBsaW5rZWQgdG8gYW4KK2VudGVycHJpc2UgYmVhbi4KKworVGhlIG5hbWUgaW4gdGhlIGVqYi1saW5rIGVsZW1lbnQgaXMgY29tcG9zZWQgb2YgYQorcGF0aCBuYW1lIHNwZWNpZnlpbmcgdGhlIGVqYi1qYXIgY29udGFpbmluZyB0aGUgcmVmZXJlbmNlZCBlbnRlcnByaXNlCitiZWFuIHdpdGggdGhlIGVqYi1uYW1lIG9mIHRoZSB0YXJnZXQgYmVhbiBhcHBlbmRlZCBhbmQgc2VwYXJhdGVkIGZyb20KK3RoZSBwYXRoIG5hbWUgYnkgIiMiLiAgVGhlIHBhdGggbmFtZSBpcyByZWxhdGl2ZSB0byB0aGUgd2FyIGZpbGUKK2NvbnRhaW5pbmcgdGhlIHdlYiBhcHBsaWNhdGlvbiB0aGF0IGlzIHJlZmVyZW5jaW5nIHRoZSBlbnRlcnByaXNlIGJlYW4uCitUaGlzIGFsbG93cyBtdWx0aXBsZSBlbnRlcnByaXNlIGJlYW5zIHdpdGggdGhlIHNhbWUgZWpiLW5hbWUgdG8gYmUKK3VuaXF1ZWx5IGlkZW50aWZpZWQuCisKK1VzZWQgaW46IGVqYi1sb2NhbC1yZWYsIGVqYi1yZWYKKworRXhhbXBsZXM6CisKKwk8ZWpiLWxpbms+RW1wbG95ZWVSZWNvcmQ8L2VqYi1saW5rPgorCisJPGVqYi1saW5rPi4uL3Byb2R1Y3RzL3Byb2R1Y3QuamFyI1Byb2R1Y3RFSkI8L2VqYi1saW5rPgorCistLT4KKzwhRUxFTUVOVCBlamItbGluayAoI1BDREFUQSk+CisKKzwhLS0KK1RoZSBlamItbG9jYWwtcmVmIGVsZW1lbnQgaXMgdXNlZCBmb3IgdGhlIGRlY2xhcmF0aW9uIG9mIGEgcmVmZXJlbmNlIHRvCithbiBlbnRlcnByaXNlIGJlYW4ncyBsb2NhbCBob21lLiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2Y6CisKKwktIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uCisJLSB0aGUgRUpCIHJlZmVyZW5jZSBuYW1lIHVzZWQgaW4gdGhlIGNvZGUgb2YgdGhlIHdlYiBhcHBsaWNhdGlvbgorCSAgdGhhdCdzIHJlZmVyZW5jaW5nIHRoZSBlbnRlcnByaXNlIGJlYW4KKwktIHRoZSBleHBlY3RlZCB0eXBlIG9mIHRoZSByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbgorCS0gdGhlIGV4cGVjdGVkIGxvY2FsIGhvbWUgYW5kIGxvY2FsIGludGVyZmFjZXMgb2YgdGhlIHJlZmVyZW5jZWQKKwkgIGVudGVycHJpc2UgYmVhbgorCS0gb3B0aW9uYWwgZWpiLWxpbmsgaW5mb3JtYXRpb24sIHVzZWQgdG8gc3BlY2lmeSB0aGUgcmVmZXJlbmNlZAorCSAgZW50ZXJwcmlzZSBiZWFuCisKK1VzZWQgaW46IHdlYi1hcHAKKy0tPgorPCFFTEVNRU5UIGVqYi1sb2NhbC1yZWYgKGRlc2NyaXB0aW9uPywgZWpiLXJlZi1uYW1lLCBlamItcmVmLXR5cGUsCisJCWxvY2FsLWhvbWUsIGxvY2FsLCBlamItbGluaz8pPgorCis8IS0tCitUaGUgZWpiLXJlZiBlbGVtZW50IGlzIHVzZWQgZm9yIHRoZSBkZWNsYXJhdGlvbiBvZiBhIHJlZmVyZW5jZSB0bworYW4gZW50ZXJwcmlzZSBiZWFuJ3MgaG9tZS4gVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mOgorCisJLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgorCS0gdGhlIEVKQiByZWZlcmVuY2UgbmFtZSB1c2VkIGluIHRoZSBjb2RlIG9mCisJICB0aGUgd2ViIGFwcGxpY2F0aW9uIHRoYXQncyByZWZlcmVuY2luZyB0aGUgZW50ZXJwcmlzZSBiZWFuCisJLSB0aGUgZXhwZWN0ZWQgdHlwZSBvZiB0aGUgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4KKwktIHRoZSBleHBlY3RlZCBob21lIGFuZCByZW1vdGUgaW50ZXJmYWNlcyBvZiB0aGUgcmVmZXJlbmNlZAorCSAgZW50ZXJwcmlzZSBiZWFuCisJLSBvcHRpb25hbCBlamItbGluayBpbmZvcm1hdGlvbiwgdXNlZCB0byBzcGVjaWZ5IHRoZSByZWZlcmVuY2VkCisJICBlbnRlcnByaXNlIGJlYW4KKworVXNlZCBpbjogd2ViLWFwcAorLS0+Cis8IUVMRU1FTlQgZWpiLXJlZiAoZGVzY3JpcHRpb24/LCBlamItcmVmLW5hbWUsIGVqYi1yZWYtdHlwZSwKKwkJaG9tZSwgcmVtb3RlLCBlamItbGluaz8pPgorCis8IS0tCitUaGUgZWpiLXJlZi1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYW4gRUpCIHJlZmVyZW5jZS4gVGhlCitFSkIgcmVmZXJlbmNlIGlzIGFuIGVudHJ5IGluIHRoZSB3ZWIgYXBwbGljYXRpb24ncyBlbnZpcm9ubWVudCBhbmQgaXMKK3JlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQuICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZQord2l0aGluIHRoZSB3ZWIgYXBwbGljYXRpb24uCisKK0l0IGlzIHJlY29tbWVuZGVkIHRoYXQgbmFtZSBpcyBwcmVmaXhlZCB3aXRoICJlamIvIi4KKworVXNlZCBpbjogZWpiLWxvY2FsLXJlZiwgZWpiLXJlZgorCitFeGFtcGxlOgorCis8ZWpiLXJlZi1uYW1lPmVqYi9QYXlyb2xsPC9lamItcmVmLW5hbWU+CistLT4KKzwhRUxFTUVOVCBlamItcmVmLW5hbWUgKCNQQ0RBVEEpPgorCis8IS0tCitUaGUgZWpiLXJlZi10eXBlIGVsZW1lbnQgY29udGFpbnMgdGhlIGV4cGVjdGVkIHR5cGUgb2YgdGhlCityZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbi4KKworVGhlIGVqYi1yZWYtdHlwZSBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisKKwk8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgorCTxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgorCitVc2VkIGluOiBlamItbG9jYWwtcmVmLCBlamItcmVmCistLT4KKzwhRUxFTUVOVCBlamItcmVmLXR5cGUgKCNQQ0RBVEEpPgorCis8IS0tCitUaGUgZW52LWVudHJ5IGVsZW1lbnQgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIGEgd2ViIGFwcGxpY2F0aW9uJ3MKK2Vudmlyb25tZW50IGVudHJ5LiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwKK2Rlc2NyaXB0aW9uLCB0aGUgbmFtZSBvZiB0aGUgZW52aXJvbm1lbnQgZW50cnksIGFuZCBhbiBvcHRpb25hbAordmFsdWUuICBJZiBhIHZhbHVlIGlzIG5vdCBzcGVjaWZpZWQsIG9uZSBtdXN0IGJlIHN1cHBsaWVkCitkdXJpbmcgZGVwbG95bWVudC4KKy0tPgorPCFFTEVNRU5UIGVudi1lbnRyeSAoZGVzY3JpcHRpb24/LCBlbnYtZW50cnktbmFtZSwgZW52LWVudHJ5LXZhbHVlPywKK2Vudi1lbnRyeS10eXBlKT4KKworPCEtLQorVGhlIGVudi1lbnRyeS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSB3ZWIgYXBwbGljYXRpb25zJ3MKK2Vudmlyb25tZW50IGVudHJ5LiAgVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlCitqYXZhOmNvbXAvZW52IGNvbnRleHQuICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYSB3ZWIgYXBwbGljYXRpb24uCisKK0V4YW1wbGU6CisKKzxlbnYtZW50cnktbmFtZT5taW5BbW91bnQ8L2Vudi1lbnRyeS1uYW1lPgorCitVc2VkIGluOiBlbnYtZW50cnkKKy0tPgorPCFFTEVNRU5UIGVudi1lbnRyeS1uYW1lICgjUENEQVRBKT4KKworPCEtLQorVGhlIGVudi1lbnRyeS10eXBlIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5LXF1YWxpZmllZCBKYXZhIHR5cGUgb2YKK3RoZSBlbnZpcm9ubWVudCBlbnRyeSB2YWx1ZSB0aGF0IGlzIGV4cGVjdGVkIGJ5IHRoZSB3ZWIgYXBwbGljYXRpb24ncworY29kZS4KKworVGhlIGZvbGxvd2luZyBhcmUgdGhlIGxlZ2FsIHZhbHVlcyBvZiBlbnYtZW50cnktdHlwZToKKworCWphdmEubGFuZy5Cb29sZWFuCisJamF2YS5sYW5nLkJ5dGUKKwlqYXZhLmxhbmcuQ2hhcmFjdGVyCisJamF2YS5sYW5nLlN0cmluZworCWphdmEubGFuZy5TaG9ydAorCWphdmEubGFuZy5JbnRlZ2VyCisJamF2YS5sYW5nLkxvbmcKKwlqYXZhLmxhbmcuRmxvYXQKKwlqYXZhLmxhbmcuRG91YmxlCisKK1VzZWQgaW46IGVudi1lbnRyeQorLS0+Cis8IUVMRU1FTlQgZW52LWVudHJ5LXR5cGUgKCNQQ0RBVEEpPgorCis8IS0tCitUaGUgZW52LWVudHJ5LXZhbHVlIGVsZW1lbnQgY29udGFpbnMgdGhlIHZhbHVlIG9mIGEgd2ViIGFwcGxpY2F0aW9uJ3MKK2Vudmlyb25tZW50IGVudHJ5LiBUaGUgdmFsdWUgbXVzdCBiZSBhIFN0cmluZyB0aGF0IGlzIHZhbGlkIGZvciB0aGUKK2NvbnN0cnVjdG9yIG9mIHRoZSBzcGVjaWZpZWQgdHlwZSB0aGF0IHRha2VzIGEgc2luZ2xlIFN0cmluZworcGFyYW1ldGVyLCBvciBmb3IgamF2YS5sYW5nLkNoYXJhY3RlciwgYSBzaW5nbGUgY2hhcmFjdGVyLgorCitFeGFtcGxlOgorCis8ZW52LWVudHJ5LXZhbHVlPjEwMC4wMDwvZW52LWVudHJ5LXZhbHVlPgorCitVc2VkIGluOiBlbnYtZW50cnkKKy0tPgorPCFFTEVNRU5UIGVudi1lbnRyeS12YWx1ZSAoI1BDREFUQSk+CisKKzwhLS0KK1RoZSBlcnJvci1jb2RlIGNvbnRhaW5zIGFuIEhUVFAgZXJyb3IgY29kZSwgZXg6IDQwNAorCitVc2VkIGluOiBlcnJvci1wYWdlCistLT4KKzwhRUxFTUVOVCBlcnJvci1jb2RlICgjUENEQVRBKT4KKworPCEtLQorVGhlIGVycm9yLXBhZ2UgZWxlbWVudCBjb250YWlucyBhIG1hcHBpbmcgYmV0d2VlbiBhbiBlcnJvciBjb2RlCitvciBleGNlcHRpb24gdHlwZSB0byB0aGUgcGF0aCBvZiBhIHJlc291cmNlIGluIHRoZSB3ZWIgYXBwbGljYXRpb24KKworVXNlZCBpbjogd2ViLWFwcAorLS0+Cis8IUVMRU1FTlQgZXJyb3ItcGFnZSAoKGVycm9yLWNvZGUgfCBleGNlcHRpb24tdHlwZSksIGxvY2F0aW9uKT4KKworPCEtLQorVGhlIGV4Y2VwdGlvbiB0eXBlIGNvbnRhaW5zIGEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgYQorSmF2YSBleGNlcHRpb24gdHlwZS4KKworVXNlZCBpbjogZXJyb3ItcGFnZQorLS0+Cis8IUVMRU1FTlQgZXhjZXB0aW9uLXR5cGUgKCNQQ0RBVEEpPgorCis8IS0tCitUaGUgZXh0ZW5zaW9uIGVsZW1lbnQgY29udGFpbnMgYSBzdHJpbmcgZGVzY3JpYmluZyBhbgorZXh0ZW5zaW9uLiBleGFtcGxlOiAidHh0IgorCitVc2VkIGluOiBtaW1lLW1hcHBpbmcKKy0tPgorPCFFTEVNRU5UIGV4dGVuc2lvbiAoI1BDREFUQSk+CisKKzwhLS0KK0RlY2xhcmVzIGEgZmlsdGVyIGluIHRoZSB3ZWIgYXBwbGljYXRpb24uIFRoZSBmaWx0ZXIgaXMgbWFwcGVkIHRvCitlaXRoZXIgYSBzZXJ2bGV0IG9yIGEgVVJMIHBhdHRlcm4gaW4gdGhlIGZpbHRlci1tYXBwaW5nIGVsZW1lbnQsIHVzaW5nCit0aGUgZmlsdGVyLW5hbWUgdmFsdWUgdG8gcmVmZXJlbmNlLiBGaWx0ZXJzIGNhbiBhY2Nlc3MgdGhlCitpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzIGRlY2xhcmVkIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgYXQKK3J1bnRpbWUgdmlhIHRoZSBGaWx0ZXJDb25maWcgaW50ZXJmYWNlLgorCitVc2VkIGluOiB3ZWItYXBwCistLT4KKzwhRUxFTUVOVCBmaWx0ZXIgKGljb24/LCBmaWx0ZXItbmFtZSwgZGlzcGxheS1uYW1lPywgZGVzY3JpcHRpb24/LAorZmlsdGVyLWNsYXNzLCBpbml0LXBhcmFtKik+CisKKzwhLS0KK1RoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3NuYW1lIG9mIHRoZSBmaWx0ZXIuCisKK1VzZWQgaW46IGZpbHRlcgorLS0+Cis8IUVMRU1FTlQgZmlsdGVyLWNsYXNzICgjUENEQVRBKT4KKworPCEtLQorRGVjbGFyYXRpb24gb2YgdGhlIGZpbHRlciBtYXBwaW5ncyBpbiB0aGlzIHdlYiBhcHBsaWNhdGlvbi4gVGhlCitjb250YWluZXIgdXNlcyB0aGUgZmlsdGVyLW1hcHBpbmcgZGVjbGFyYXRpb25zIHRvIGRlY2lkZSB3aGljaCBmaWx0ZXJzCit0byBhcHBseSB0byBhIHJlcXVlc3QsIGFuZCBpbiB3aGF0IG9yZGVyLiBUaGUgY29udGFpbmVyIG1hdGNoZXMgdGhlCityZXF1ZXN0IFVSSSB0byBhIFNlcnZsZXQgaW4gdGhlIG5vcm1hbCB3YXkuIFRvIGRldGVybWluZSB3aGljaCBmaWx0ZXJzCit0byBhcHBseSBpdCBtYXRjaGVzIGZpbHRlci1tYXBwaW5nIGRlY2xhcmF0aW9ucyBlaXRoZXIgb24gc2VydmxldC1uYW1lLAorb3Igb24gdXJsLXBhdHRlcm4gZm9yIGVhY2ggZmlsdGVyLW1hcHBpbmcgZWxlbWVudCwgZGVwZW5kaW5nIG9uIHdoaWNoCitzdHlsZSBpcyB1c2VkLiBUaGUgb3JkZXIgaW4gd2hpY2ggZmlsdGVycyBhcmUgaW52b2tlZCBpcyB0aGUgb3JkZXIgaW4KK3doaWNoIGZpbHRlci1tYXBwaW5nIGRlY2xhcmF0aW9ucyB0aGF0IG1hdGNoIGEgcmVxdWVzdCBVUkkgZm9yIGEKK3NlcnZsZXQgYXBwZWFyIGluIHRoZSBsaXN0IG9mIGZpbHRlci1tYXBwaW5nIGVsZW1lbnRzLlRoZSBmaWx0ZXItbmFtZQordmFsdWUgbXVzdCBiZSB0aGUgdmFsdWUgb2YgdGhlIDxmaWx0ZXItbmFtZT4gc3ViLWVsZW1lbnRzIG9mIG9uZSBvZiB0aGUKKzxmaWx0ZXI+IGRlY2xhcmF0aW9ucyBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLgorCitVc2VkIGluOiB3ZWItYXBwCistLT4KKzwhRUxFTUVOVCBmaWx0ZXItbWFwcGluZyAoZmlsdGVyLW5hbWUsICh1cmwtcGF0dGVybiB8IHNlcnZsZXQtbmFtZSkpPgorCis8IS0tCitUaGUgbG9naWNhbCBuYW1lIG9mIHRoZSBmaWx0ZXIuIFRoaXMgbmFtZSBpcyB1c2VkIHRvIG1hcCB0aGUgZmlsdGVyLgorRWFjaCBmaWx0ZXIgbmFtZSBpcyB1bmlxdWUgd2l0aGluIHRoZSB3ZWIgYXBwbGljYXRpb24uCisKK1VzZWQgaW46IGZpbHRlciwgZmlsdGVyLW1hcHBpbmcKKy0tPgorPCFFTEVNRU5UIGZpbHRlci1uYW1lICgjUENEQVRBKT4KKworPCEtLQorVGhlIGZvcm0tZXJyb3ItcGFnZSBlbGVtZW50IGRlZmluZXMgdGhlIGxvY2F0aW9uIGluIHRoZSB3ZWIgYXBwCit3aGVyZSB0aGUgZXJyb3IgcGFnZSB0aGF0IGlzIGRpc3BsYXllZCB3aGVuIGxvZ2luIGlzIG5vdCBzdWNjZXNzZnVsCitjYW4gYmUgZm91bmQuIFRoZSBwYXRoIGJlZ2lucyB3aXRoIGEgbGVhZGluZyAvIGFuZCBpcyBpbnRlcnByZXRlZAorcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIFdBUi4KKworVXNlZCBpbjogZm9ybS1sb2dpbi1jb25maWcKKy0tPgorPCFFTEVNRU5UIGZvcm0tZXJyb3ItcGFnZSAoI1BDREFUQSk+CisKKzwhLS0KK1RoZSBmb3JtLWxvZ2luLWNvbmZpZyBlbGVtZW50IHNwZWNpZmllcyB0aGUgbG9naW4gYW5kIGVycm9yIHBhZ2VzCit0aGF0IHNob3VsZCBiZSB1c2VkIGluIGZvcm0gYmFzZWQgbG9naW4uIElmIGZvcm0gYmFzZWQgYXV0aGVudGljYXRpb24KK2lzIG5vdCB1c2VkLCB0aGVzZSBlbGVtZW50cyBhcmUgaWdub3JlZC4KKworVXNlZCBpbjogbG9naW4tY29uZmlnCistLT4KKzwhRUxFTUVOVCBmb3JtLWxvZ2luLWNvbmZpZyAoZm9ybS1sb2dpbi1wYWdlLCBmb3JtLWVycm9yLXBhZ2UpPgorCis8IS0tCitUaGUgZm9ybS1sb2dpbi1wYWdlIGVsZW1lbnQgZGVmaW5lcyB0aGUgbG9jYXRpb24gaW4gdGhlIHdlYiBhcHAKK3doZXJlIHRoZSBwYWdlIHRoYXQgY2FuIGJlIHVzZWQgZm9yIGxvZ2luIGNhbiBiZSBmb3VuZC4gVGhlIHBhdGgKK2JlZ2lucyB3aXRoIGEgbGVhZGluZyAvIGFuZCBpcyBpbnRlcnByZXRlZCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUgV0FSLgorCitVc2VkIGluOiBmb3JtLWxvZ2luLWNvbmZpZworLS0+Cis8IUVMRU1FTlQgZm9ybS1sb2dpbi1wYWdlICgjUENEQVRBKT4KKworPCEtLQorVGhlIGhvbWUgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGVudGVycHJpc2UKK2JlYW4ncyBob21lIGludGVyZmFjZS4KKworVXNlZCBpbjogZWpiLXJlZgorCitFeGFtcGxlOgorCis8aG9tZT5jb20uYWFyZHZhcmsucGF5cm9sbC5QYXlyb2xsSG9tZTwvaG9tZT4KKy0tPgorPCFFTEVNRU5UIGhvbWUgKCNQQ0RBVEEpPgorCis8IS0tCitUaGUgaHR0cC1tZXRob2QgY29udGFpbnMgYW4gSFRUUCBtZXRob2QgKEdFVCB8IFBPU1QgfC4uLikuCisKK1VzZWQgaW46IHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uCistLT4KKzwhRUxFTUVOVCBodHRwLW1ldGhvZCAoI1BDREFUQSk+CisKKzwhLS0KK1RoZSBpY29uIGVsZW1lbnQgY29udGFpbnMgc21hbGwtaWNvbiBhbmQgbGFyZ2UtaWNvbiBlbGVtZW50cyB0aGF0CitzcGVjaWZ5IHRoZSBmaWxlIG5hbWVzIGZvciBzbWFsbCBhbmQgYSBsYXJnZSBHSUYgb3IgSlBFRyBpY29uIGltYWdlcwordXNlZCB0byByZXByZXNlbnQgdGhlIHBhcmVudCBlbGVtZW50IGluIGEgR1VJIHRvb2wuCisKK1VzZWQgaW46IGZpbHRlciwgc2VydmxldCwgd2ViLWFwcAorLS0+Cis8IUVMRU1FTlQgaWNvbiAoc21hbGwtaWNvbj8sIGxhcmdlLWljb24/KT4KKworPCEtLQorVGhlIGluaXQtcGFyYW0gZWxlbWVudCBjb250YWlucyBhIG5hbWUvdmFsdWUgcGFpciBhcyBhbgoraW5pdGlhbGl6YXRpb24gcGFyYW0gb2YgdGhlIHNlcnZsZXQKKworVXNlZCBpbjogZmlsdGVyLCBzZXJ2bGV0CistLT4KKzwhRUxFTUVOVCBpbml0LXBhcmFtIChwYXJhbS1uYW1lLCBwYXJhbS12YWx1ZSwgZGVzY3JpcHRpb24/KT4KKworPCEtLQorVGhlIGpzcC1maWxlIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGwgcGF0aCB0byBhIEpTUCBmaWxlIHdpdGhpbgordGhlIHdlYiBhcHBsaWNhdGlvbiBiZWdpbm5pbmcgd2l0aCBhIGAvJy4KKworVXNlZCBpbjogc2VydmxldAorLS0+Cis8IUVMRU1FTlQganNwLWZpbGUgKCNQQ0RBVEEpPgorCis8IS0tCitUaGUgbGFyZ2UtaWNvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgZmlsZQorY29udGFpbmluZyBhIGxhcmdlICgzMiB4IDMyKSBpY29uIGltYWdlLiBUaGUgZmlsZQorbmFtZSBpcyBhIHJlbGF0aXZlIHBhdGggd2l0aGluIHRoZSB3ZWIgYXBwbGljYXRpb24ncword2FyIGZpbGUuCisKK1RoZSBpbWFnZSBtYXkgYmUgZWl0aGVyIGluIHRoZSBKUEVHIG9yIEdJRiBmb3JtYXQuCitUaGUgaWNvbiBjYW4gYmUgdXNlZCBieSB0b29scy4KKworVXNlZCBpbjogaWNvbgorCitFeGFtcGxlOgorCis8bGFyZ2UtaWNvbj5lbXBsb3llZS1zZXJ2aWNlLWljb24zMngzMi5qcGc8L2xhcmdlLWljb24+CistLT4KKzwhRUxFTUVOVCBsYXJnZS1pY29uICgjUENEQVRBKT4KKworPCEtLQorVGhlIGxpc3RlbmVyIGVsZW1lbnQgaW5kaWNhdGVzIHRoZSBkZXBsb3ltZW50IHByb3BlcnRpZXMgZm9yIGEgd2ViCithcHBsaWNhdGlvbiBsaXN0ZW5lciBiZWFuLgorCitVc2VkIGluOiB3ZWItYXBwCistLT4KKzwhRUxFTUVOVCBsaXN0ZW5lciAobGlzdGVuZXItY2xhc3MpPgorCis8IS0tCitUaGUgbGlzdGVuZXItY2xhc3MgZWxlbWVudCBkZWNsYXJlcyBhIGNsYXNzIGluIHRoZSBhcHBsaWNhdGlvbiBtdXN0IGJlCityZWdpc3RlcmVkIGFzIGEgd2ViIGFwcGxpY2F0aW9uIGxpc3RlbmVyIGJlYW4uIFRoZSB2YWx1ZSBpcyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzbmFtZSBvZiB0aGUgbGlzdGVuZXIgY2xhc3MuCisKKworVXNlZCBpbjogbGlzdGVuZXIKKy0tPgorPCFFTEVNRU5UIGxpc3RlbmVyLWNsYXNzICgjUENEQVRBKT4KKworPCEtLQorVGhlIGxvYWQtb24tc3RhcnR1cCBlbGVtZW50IGluZGljYXRlcyB0aGF0IHRoaXMgc2VydmxldCBzaG91bGQgYmUKK2xvYWRlZCAoaW5zdGFudGlhdGVkIGFuZCBoYXZlIGl0cyBpbml0KCkgY2FsbGVkKSBvbiB0aGUgc3RhcnR1cAorb2YgdGhlIHdlYiBhcHBsaWNhdGlvbi4gVGhlIG9wdGlvbmFsIGNvbnRlbnRzIG9mCit0aGVzZSBlbGVtZW50IG11c3QgYmUgYW4gaW50ZWdlciBpbmRpY2F0aW5nIHRoZSBvcmRlciBpbiB3aGljaAordGhlIHNlcnZsZXQgc2hvdWxkIGJlIGxvYWRlZC4gSWYgdGhlIHZhbHVlIGlzIGEgbmVnYXRpdmUgaW50ZWdlciwKK29yIHRoZSBlbGVtZW50IGlzIG5vdCBwcmVzZW50LCB0aGUgY29udGFpbmVyIGlzIGZyZWUgdG8gbG9hZCB0aGUKK3NlcnZsZXQgd2hlbmV2ZXIgaXQgY2hvb3Nlcy4gSWYgdGhlIHZhbHVlIGlzIGEgcG9zaXRpdmUgaW50ZWdlcgorb3IgMCwgdGhlIGNvbnRhaW5lciBtdXN0IGxvYWQgYW5kIGluaXRpYWxpemUgdGhlIHNlcnZsZXQgYXMgdGhlCithcHBsaWNhdGlvbiBpcyBkZXBsb3llZC4gVGhlIGNvbnRhaW5lciBtdXN0IGd1YXJhbnRlZSB0aGF0CitzZXJ2bGV0cyBtYXJrZWQgd2l0aCBsb3dlciBpbnRlZ2VycyBhcmUgbG9hZGVkIGJlZm9yZSBzZXJ2bGV0cworbWFya2VkIHdpdGggaGlnaGVyIGludGVnZXJzLiBUaGUgY29udGFpbmVyIG1heSBjaG9vc2UgdGhlIG9yZGVyCitvZiBsb2FkaW5nIG9mIHNlcnZsZXRzIHdpdGggdGhlIHNhbWUgbG9hZC1vbi1zdGFydC11cCB2YWx1ZS4KKworVXNlZCBpbjogc2VydmxldAorLS0+Cis8IUVMRU1FTlQgbG9hZC1vbi1zdGFydHVwICgjUENEQVRBKT4KKworPCEtLQorCitUaGUgbG9jYWwgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlCitlbnRlcnByaXNlIGJlYW4ncyBsb2NhbCBpbnRlcmZhY2UuCisKK1VzZWQgaW46IGVqYi1sb2NhbC1yZWYKKworLS0+Cis8IUVMRU1FTlQgbG9jYWwgKCNQQ0RBVEEpPgorCis8IS0tCisKK1RoZSBsb2NhbC1ob21lIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZQorZW50ZXJwcmlzZSBiZWFuJ3MgbG9jYWwgaG9tZSBpbnRlcmZhY2UuCisKK1VzZWQgaW46IGVqYi1sb2NhbC1yZWYKKy0tPgorPCFFTEVNRU5UIGxvY2FsLWhvbWUgKCNQQ0RBVEEpPgorCis8IS0tCitUaGUgbG9jYXRpb24gZWxlbWVudCBjb250YWlucyB0aGUgbG9jYXRpb24gb2YgdGhlIHJlc291cmNlIGluIHRoZSB3ZWIKK2FwcGxpY2F0aW9uIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSB3ZWIgYXBwbGljYXRpb24uIFRoZSB2YWx1ZSBvZgordGhlIGxvY2F0aW9uIG11c3QgaGF2ZSBhIGxlYWRpbmcgYC8nLgorCitVc2VkIGluOiBlcnJvci1wYWdlCistLT4KKzwhRUxFTUVOVCBsb2NhdGlvbiAoI1BDREFUQSk+CisKKzwhLS0KK1RoZSBsb2dpbi1jb25maWcgZWxlbWVudCBpcyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgYXV0aGVudGljYXRpb24KK21ldGhvZCB0aGF0IHNob3VsZCBiZSB1c2VkLCB0aGUgcmVhbG0gbmFtZSB0aGF0IHNob3VsZCBiZSB1c2VkIGZvcgordGhpcyBhcHBsaWNhdGlvbiwgYW5kIHRoZSBhdHRyaWJ1dGVzIHRoYXQgYXJlIG5lZWRlZCBieSB0aGUgZm9ybSBsb2dpbgorbWVjaGFuaXNtLgorCitVc2VkIGluOiB3ZWItYXBwCistLT4KKzwhRUxFTUVOVCBsb2dpbi1jb25maWcgKGF1dGgtbWV0aG9kPywgcmVhbG0tbmFtZT8sIGZvcm0tbG9naW4tY29uZmlnPyk+CisKKzwhLS0KK1RoZSBtaW1lLW1hcHBpbmcgZWxlbWVudCBkZWZpbmVzIGEgbWFwcGluZyBiZXR3ZWVuIGFuIGV4dGVuc2lvbgorYW5kIGEgbWltZSB0eXBlLgorCitVc2VkIGluOiB3ZWItYXBwCistLT4KKzwhRUxFTUVOVCBtaW1lLW1hcHBpbmcgKGV4dGVuc2lvbiwgbWltZS10eXBlKT4KKworPCEtLQorVGhlIG1pbWUtdHlwZSBlbGVtZW50IGNvbnRhaW5zIGEgZGVmaW5lZCBtaW1lIHR5cGUuIGV4YW1wbGU6CisidGV4dC9wbGFpbiIKKworVXNlZCBpbjogbWltZS1tYXBwaW5nCistLT4KKzwhRUxFTUVOVCBtaW1lLXR5cGUgKCNQQ0RBVEEpPgorCis8IS0tCitUaGUgcGFyYW0tbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgcGFyYW1ldGVyLiBFYWNoIHBhcmFtZXRlcgorbmFtZSBtdXN0IGJlIHVuaXF1ZSBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uLgorCisKK1VzZWQgaW46IGNvbnRleHQtcGFyYW0sIGluaXQtcGFyYW0KKy0tPgorPCFFTEVNRU5UIHBhcmFtLW5hbWUgKCNQQ0RBVEEpPgorCis8IS0tCitUaGUgcGFyYW0tdmFsdWUgZWxlbWVudCBjb250YWlucyB0aGUgdmFsdWUgb2YgYSBwYXJhbWV0ZXIuCisKK1VzZWQgaW46IGNvbnRleHQtcGFyYW0sIGluaXQtcGFyYW0KKy0tPgorPCFFTEVNRU5UIHBhcmFtLXZhbHVlICgjUENEQVRBKT4KKworPCEtLQorVGhlIHJlYWxtIG5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIHJlYWxtIG5hbWUgdG8gdXNlIGluIEhUVFAKK0Jhc2ljIGF1dGhvcml6YXRpb24uCisKK1VzZWQgaW46IGxvZ2luLWNvbmZpZworLS0+Cis8IUVMRU1FTlQgcmVhbG0tbmFtZSAoI1BDREFUQSk+CisKKzwhLS0KK1RoZSByZW1vdGUgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGVudGVycHJpc2UKK2JlYW4ncyByZW1vdGUgaW50ZXJmYWNlLgorCitVc2VkIGluOiBlamItcmVmCisKK0V4YW1wbGU6CisKKzxyZW1vdGU+Y29tLndvbWJhdC5lbXBsLkVtcGxveWVlU2VydmljZTwvcmVtb3RlPgorLS0+Cis8IUVMRU1FTlQgcmVtb3RlICgjUENEQVRBKT4KKworPCEtLQorVGhlIHJlcy1hdXRoIGVsZW1lbnQgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIHdlYiBhcHBsaWNhdGlvbiBjb2RlIHNpZ25zCitvbiBwcm9ncmFtbWF0aWNhbGx5IHRvIHRoZSByZXNvdXJjZSBtYW5hZ2VyLCBvciB3aGV0aGVyIHRoZSBDb250YWluZXIKK3dpbGwgc2lnbiBvbiB0byB0aGUgcmVzb3VyY2UgbWFuYWdlciBvbiBiZWhhbGYgb2YgdGhlIHdlYiBhcHBsaWNhdGlvbi4gSW4gdGhlCitsYXR0ZXIgY2FzZSwgdGhlIENvbnRhaW5lciB1c2VzIGluZm9ybWF0aW9uIHRoYXQgaXMgc3VwcGxpZWQgYnkgdGhlCitEZXBsb3llci4KKworVGhlIHZhbHVlIG9mIHRoaXMgZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoKKworCTxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+CisJPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+CisKK1VzZWQgaW46IHJlc291cmNlLXJlZgorLS0+Cis8IUVMRU1FTlQgcmVzLWF1dGggKCNQQ0RBVEEpPgorCis8IS0tCitUaGUgcmVzLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEgcmVzb3VyY2UgbWFuYWdlcgorY29ubmVjdGlvbiBmYWN0b3J5IHJlZmVyZW5jZS4gIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZQoramF2YTpjb21wL2VudiBjb250ZXh0LiAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGEgd2ViIGFwcGxpY2F0aW9uLgorCitVc2VkIGluOiByZXNvdXJjZS1yZWYKKy0tPgorPCFFTEVNRU5UIHJlcy1yZWYtbmFtZSAoI1BDREFUQSk+CisKKzwhLS0KK1RoZSByZXMtc2hhcmluZy1zY29wZSBlbGVtZW50IHNwZWNpZmllcyB3aGV0aGVyIGNvbm5lY3Rpb25zIG9idGFpbmVkCit0aHJvdWdoIHRoZSBnaXZlbiByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2UgY2FuIGJlCitzaGFyZWQuIFRoZSB2YWx1ZSBvZiB0aGlzIGVsZW1lbnQsIGlmIHNwZWNpZmllZCwgbXVzdCBiZSBvbmUgb2YgdGhlCit0d28gZm9sbG93aW5nOgorCisJPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+CisJPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KKworVGhlIGRlZmF1bHQgdmFsdWUgaXMgU2hhcmVhYmxlLgorCitVc2VkIGluOiByZXNvdXJjZS1yZWYKKy0tPgorPCFFTEVNRU5UIHJlcy1zaGFyaW5nLXNjb3BlICgjUENEQVRBKT4KKworPCEtLQorVGhlIHJlcy10eXBlIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSB0eXBlIG9mIHRoZSBkYXRhIHNvdXJjZS4gVGhlIHR5cGUKK2lzIHNwZWNpZmllZCBieSB0aGUgZnVsbHkgcXVhbGlmaWVkIEphdmEgbGFuZ3VhZ2UgY2xhc3Mgb3IgaW50ZXJmYWNlCitleHBlY3RlZCB0byBiZSBpbXBsZW1lbnRlZCBieSB0aGUgZGF0YSBzb3VyY2UuCisKK1VzZWQgaW46IHJlc291cmNlLXJlZgorLS0+Cis8IUVMRU1FTlQgcmVzLXR5cGUgKCNQQ0RBVEEpPgorCis8IS0tCitUaGUgcmVzb3VyY2UtZW52LXJlZiBlbGVtZW50IGNvbnRhaW5zIGEgZGVjbGFyYXRpb24gb2YgYSB3ZWIgYXBwbGljYXRpb24ncworcmVmZXJlbmNlIHRvIGFuIGFkbWluaXN0ZXJlZCBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2UKK2luIHRoZSB3ZWIgYXBwbGljYXRpb24ncyBlbnZpcm9ubWVudC4gIEl0IGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsCitkZXNjcmlwdGlvbiwgdGhlIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZSBuYW1lLCBhbmQgYW4KK2luZGljYXRpb24gb2YgdGhlIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZSB0eXBlIGV4cGVjdGVkIGJ5Cit0aGUgd2ViIGFwcGxpY2F0aW9uIGNvZGUuCisKK1VzZWQgaW46IHdlYi1hcHAKKworRXhhbXBsZToKKworPHJlc291cmNlLWVudi1yZWY+CisgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5qbXMvU3RvY2tRdWV1ZTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgorICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YXguam1zLlF1ZXVlPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Cis8L3Jlc291cmNlLWVudi1yZWY+CistLT4KKzwhRUxFTUVOVCByZXNvdXJjZS1lbnYtcmVmIChkZXNjcmlwdGlvbj8sIHJlc291cmNlLWVudi1yZWYtbmFtZSwKKwkJcmVzb3VyY2UtZW52LXJlZi10eXBlKT4KKworPCEtLQorVGhlIHJlc291cmNlLWVudi1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhIHJlc291cmNlCitlbnZpcm9ubWVudCByZWZlcmVuY2U7IGl0cyB2YWx1ZSBpcyB0aGUgZW52aXJvbm1lbnQgZW50cnkgbmFtZSB1c2VkIGluCit0aGUgd2ViIGFwcGxpY2F0aW9uIGNvZGUuICBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUKK2phdmE6Y29tcC9lbnYgY29udGV4dCBhbmQgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGEgd2ViIGFwcGxpY2F0aW9uLgorCitVc2VkIGluOiByZXNvdXJjZS1lbnYtcmVmCistLT4KKzwhRUxFTUVOVCByZXNvdXJjZS1lbnYtcmVmLW5hbWUgKCNQQ0RBVEEpPgorCis8IS0tCitUaGUgcmVzb3VyY2UtZW52LXJlZi10eXBlIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSB0eXBlIG9mIGEgcmVzb3VyY2UKK2Vudmlyb25tZW50IHJlZmVyZW5jZS4gIEl0IGlzIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIEphdmEKK2xhbmd1YWdlIGNsYXNzIG9yIGludGVyZmFjZS4KKworVXNlZCBpbjogcmVzb3VyY2UtZW52LXJlZgorLS0+Cis8IUVMRU1FTlQgcmVzb3VyY2UtZW52LXJlZi10eXBlICgjUENEQVRBKT4KKworPCEtLQorVGhlIHJlc291cmNlLXJlZiBlbGVtZW50IGNvbnRhaW5zIGEgZGVjbGFyYXRpb24gb2YgYSB3ZWIgYXBwbGljYXRpb24ncworcmVmZXJlbmNlIHRvIGFuIGV4dGVybmFsIHJlc291cmNlLiBJdCBjb25zaXN0cyBvZiBhbiBvcHRpb25hbAorZGVzY3JpcHRpb24sIHRoZSByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2UgbmFtZSwKK3RoZSBpbmRpY2F0aW9uIG9mIHRoZSByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSB0eXBlCitleHBlY3RlZCBieSB0aGUgd2ViIGFwcGxpY2F0aW9uIGNvZGUsIHRoZSB0eXBlIG9mIGF1dGhlbnRpY2F0aW9uCisoQXBwbGljYXRpb24gb3IgQ29udGFpbmVyKSwgYW5kIGFuIG9wdGlvbmFsIHNwZWNpZmljYXRpb24gb2YgdGhlCitzaGFyZWFiaWxpdHkgb2YgY29ubmVjdGlvbnMgb2J0YWluZWQgZnJvbSB0aGUgcmVzb3VyY2UgKFNoYXJlYWJsZSBvcgorVW5zaGFyZWFibGUpLgorCitVc2VkIGluOiB3ZWItYXBwCisKK0V4YW1wbGU6CisKKyAgICA8cmVzb3VyY2UtcmVmPgorCTxyZXMtcmVmLW5hbWU+amRiYy9FbXBsb3llZUFwcERCPC9yZXMtcmVmLW5hbWU+CisJPHJlcy10eXBlPmphdmF4LnNxbC5EYXRhU291cmNlPC9yZXMtdHlwZT4KKwk8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KKwk8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KKyAgICA8L3Jlc291cmNlLXJlZj4KKy0tPgorPCFFTEVNRU5UIHJlc291cmNlLXJlZiAoZGVzY3JpcHRpb24/LCByZXMtcmVmLW5hbWUsIHJlcy10eXBlLCByZXMtYXV0aCwKKwkJcmVzLXNoYXJpbmctc2NvcGU/KT4KKworPCEtLQorVGhlIHJvbGUtbGluayBlbGVtZW50IGlzIGEgcmVmZXJlbmNlIHRvIGEgZGVmaW5lZCBzZWN1cml0eSByb2xlLiBUaGUKK3JvbGUtbGluayBlbGVtZW50IG11c3QgY29udGFpbiB0aGUgbmFtZSBvZiBvbmUgb2YgdGhlIHNlY3VyaXR5IHJvbGVzCitkZWZpbmVkIGluIHRoZSBzZWN1cml0eS1yb2xlIGVsZW1lbnRzLgorCitVc2VkIGluOiBzZWN1cml0eS1yb2xlLXJlZgorLS0+Cis8IUVMRU1FTlQgcm9sZS1saW5rICgjUENEQVRBKT4KKworPCEtLQorVGhlIHJvbGUtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgc2VjdXJpdHkgcm9sZS4KKworVGhlIG5hbWUgbXVzdCBjb25mb3JtIHRvIHRoZSBsZXhpY2FsIHJ1bGVzIGZvciBhbiBOTVRPS0VOLgorCitVc2VkIGluOiBhdXRoLWNvbnN0cmFpbnQsIHJ1bi1hcywgc2VjdXJpdHktcm9sZSwgc2VjdXJpdHktcm9sZS1yZWYKKy0tPgorPCFFTEVNRU5UIHJvbGUtbmFtZSAoI1BDREFUQSk+CisKKzwhLS0KK1RoZSBydW4tYXMgZWxlbWVudCBzcGVjaWZpZXMgdGhlIHJ1bi1hcyBpZGVudGl0eSB0byBiZSB1c2VkIGZvciB0aGUKK2V4ZWN1dGlvbiBvZiB0aGUgd2ViIGFwcGxpY2F0aW9uLiBJdCBjb250YWlucyBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgYW5kCit0aGUgbmFtZSBvZiBhIHNlY3VyaXR5IHJvbGUuCisKK1VzZWQgaW46IHNlcnZsZXQKKy0tPgorPCFFTEVNRU5UIHJ1bi1hcyAoZGVzY3JpcHRpb24/LCByb2xlLW5hbWUpPgorCis8IS0tCitUaGUgc2VjdXJpdHktY29uc3RyYWludCBlbGVtZW50IGlzIHVzZWQgdG8gYXNzb2NpYXRlIHNlY3VyaXR5Citjb25zdHJhaW50cyB3aXRoIG9uZSBvciBtb3JlIHdlYiByZXNvdXJjZSBjb2xsZWN0aW9ucworCitVc2VkIGluOiB3ZWItYXBwCistLT4KKzwhRUxFTUVOVCBzZWN1cml0eS1jb25zdHJhaW50IChkaXNwbGF5LW5hbWU/LCB3ZWItcmVzb3VyY2UtY29sbGVjdGlvbissCithdXRoLWNvbnN0cmFpbnQ/LCB1c2VyLWRhdGEtY29uc3RyYWludD8pPgorCis8IS0tCitUaGUgc2VjdXJpdHktcm9sZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBkZWZpbml0aW9uIG9mIGEgc2VjdXJpdHkKK3JvbGUuIFRoZSBkZWZpbml0aW9uIGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoZQorc2VjdXJpdHkgcm9sZSwgYW5kIHRoZSBzZWN1cml0eSByb2xlIG5hbWUuCisKK1VzZWQgaW46IHdlYi1hcHAKKworRXhhbXBsZToKKworICAgIDxzZWN1cml0eS1yb2xlPgorCTxkZXNjcmlwdGlvbj4KKwkgICAgVGhpcyByb2xlIGluY2x1ZGVzIGFsbCBlbXBsb3llZXMgd2hvIGFyZSBhdXRob3JpemVkCisJICAgIHRvIGFjY2VzcyB0aGUgZW1wbG95ZWUgc2VydmljZSBhcHBsaWNhdGlvbi4KKwk8L2Rlc2NyaXB0aW9uPgorCTxyb2xlLW5hbWU+ZW1wbG95ZWU8L3JvbGUtbmFtZT4KKyAgICA8L3NlY3VyaXR5LXJvbGU+CistLT4KKzwhRUxFTUVOVCBzZWN1cml0eS1yb2xlIChkZXNjcmlwdGlvbj8sIHJvbGUtbmFtZSk+CisKKzwhLS0KK1RoZSBzZWN1cml0eS1yb2xlLXJlZiBlbGVtZW50IGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiBhIHNlY3VyaXR5Cityb2xlIHJlZmVyZW5jZSBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uJ3MgY29kZS4gVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzCitvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgdGhlIHNlY3VyaXR5IHJvbGUgbmFtZSB1c2VkIGluIHRoZSBjb2RlLAorYW5kIGFuIG9wdGlvbmFsIGxpbmsgdG8gYSBzZWN1cml0eSByb2xlLiBJZiB0aGUgc2VjdXJpdHkgcm9sZSBpcyBub3QKK3NwZWNpZmllZCwgdGhlIERlcGxveWVyIG11c3QgY2hvb3NlIGFuIGFwcHJvcHJpYXRlIHNlY3VyaXR5IHJvbGUuCisKK1RoZSB2YWx1ZSBvZiB0aGUgcm9sZS1uYW1lIGVsZW1lbnQgbXVzdCBiZSB0aGUgU3RyaW5nIHVzZWQgYXMgdGhlCitwYXJhbWV0ZXIgdG8gdGhlIEVKQkNvbnRleHQuaXNDYWxsZXJJblJvbGUoU3RyaW5nIHJvbGVOYW1lKSBtZXRob2QKK29yIHRoZSBIdHRwU2VydmxldFJlcXVlc3QuaXNVc2VySW5Sb2xlKFN0cmluZyByb2xlKSBtZXRob2QuCisKK1VzZWQgaW46IHNlcnZsZXQKKworLS0+Cis8IUVMRU1FTlQgc2VjdXJpdHktcm9sZS1yZWYgKGRlc2NyaXB0aW9uPywgcm9sZS1uYW1lLCByb2xlLWxpbms/KT4KKworPCEtLQorVGhlIHNlcnZsZXQgZWxlbWVudCBjb250YWlucyB0aGUgZGVjbGFyYXRpdmUgZGF0YSBvZiBhCitzZXJ2bGV0LiBJZiBhIGpzcC1maWxlIGlzIHNwZWNpZmllZCBhbmQgdGhlIGxvYWQtb24tc3RhcnR1cCBlbGVtZW50IGlzCitwcmVzZW50LCB0aGVuIHRoZSBKU1Agc2hvdWxkIGJlIHByZWNvbXBpbGVkIGFuZCBsb2FkZWQuCisKK1VzZWQgaW46IHdlYi1hcHAKKy0tPgorPCFFTEVNRU5UIHNlcnZsZXQgKGljb24/LCBzZXJ2bGV0LW5hbWUsIGRpc3BsYXktbmFtZT8sIGRlc2NyaXB0aW9uPywKKyhzZXJ2bGV0LWNsYXNzfGpzcC1maWxlKSwgaW5pdC1wYXJhbSosIGxvYWQtb24tc3RhcnR1cD8sIHJ1bi1hcz8sIHNlY3VyaXR5LXJvbGUtcmVmKik+CisKKzwhLS0KK1RoZSBzZXJ2bGV0LWNsYXNzIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lCitvZiB0aGUgc2VydmxldC4KKworVXNlZCBpbjogc2VydmxldAorLS0+Cis8IUVMRU1FTlQgc2VydmxldC1jbGFzcyAoI1BDREFUQSk+CisKKzwhLS0KK1RoZSBzZXJ2bGV0LW1hcHBpbmcgZWxlbWVudCBkZWZpbmVzIGEgbWFwcGluZyBiZXR3ZWVuIGEgc2VydmxldAorYW5kIGEgdXJsIHBhdHRlcm4KKworVXNlZCBpbjogd2ViLWFwcAorLS0+Cis8IUVMRU1FTlQgc2VydmxldC1tYXBwaW5nIChzZXJ2bGV0LW5hbWUsIHVybC1wYXR0ZXJuKT4KKworPCEtLQorVGhlIHNlcnZsZXQtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBjYW5vbmljYWwgbmFtZSBvZiB0aGUKK3NlcnZsZXQuIEVhY2ggc2VydmxldCBuYW1lIGlzIHVuaXF1ZSB3aXRoaW4gdGhlIHdlYiBhcHBsaWNhdGlvbi4KKworVXNlZCBpbjogZmlsdGVyLW1hcHBpbmcsIHNlcnZsZXQsIHNlcnZsZXQtbWFwcGluZworLS0+Cis8IUVMRU1FTlQgc2VydmxldC1uYW1lICgjUENEQVRBKT4KKworPCEtLQorVGhlIHNlc3Npb24tY29uZmlnIGVsZW1lbnQgZGVmaW5lcyB0aGUgc2Vzc2lvbiBwYXJhbWV0ZXJzIGZvcgordGhpcyB3ZWIgYXBwbGljYXRpb24uCisKK1VzZWQgaW46IHdlYi1hcHAKKy0tPgorPCFFTEVNRU5UIHNlc3Npb24tY29uZmlnIChzZXNzaW9uLXRpbWVvdXQ/KT4KKworPCEtLQorVGhlIHNlc3Npb24tdGltZW91dCBlbGVtZW50IGRlZmluZXMgdGhlIGRlZmF1bHQgc2Vzc2lvbiB0aW1lb3V0CitpbnRlcnZhbCBmb3IgYWxsIHNlc3Npb25zIGNyZWF0ZWQgaW4gdGhpcyB3ZWIgYXBwbGljYXRpb24uIFRoZQorc3BlY2lmaWVkIHRpbWVvdXQgbXVzdCBiZSBleHByZXNzZWQgaW4gYSB3aG9sZSBudW1iZXIgb2YgbWludXRlcy4KK0lmIHRoZSB0aW1lb3V0IGlzIDAgb3IgbGVzcywgdGhlIGNvbnRhaW5lciBlbnN1cmVzIHRoZSBkZWZhdWx0CitiZWhhdmlvdXIgb2Ygc2Vzc2lvbnMgaXMgbmV2ZXIgdG8gdGltZSBvdXQuCisKK1VzZWQgaW46IHNlc3Npb24tY29uZmlnCistLT4KKzwhRUxFTUVOVCBzZXNzaW9uLXRpbWVvdXQgKCNQQ0RBVEEpPgorCis8IS0tCitUaGUgc21hbGwtaWNvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgZmlsZQorY29udGFpbmluZyBhIHNtYWxsICgxNiB4IDE2KSBpY29uIGltYWdlLiBUaGUgZmlsZQorbmFtZSBpcyBhIHJlbGF0aXZlIHBhdGggd2l0aGluIHRoZSB3ZWIgYXBwbGljYXRpb24ncword2FyIGZpbGUuCisKK1RoZSBpbWFnZSBtYXkgYmUgZWl0aGVyIGluIHRoZSBKUEVHIG9yIEdJRiBmb3JtYXQuCitUaGUgaWNvbiBjYW4gYmUgdXNlZCBieSB0b29scy4KKworVXNlZCBpbjogaWNvbgorCitFeGFtcGxlOgorCis8c21hbGwtaWNvbj5lbXBsb3llZS1zZXJ2aWNlLWljb24xNngxNi5qcGc8L3NtYWxsLWljb24+CistLT4KKzwhRUxFTUVOVCBzbWFsbC1pY29uICgjUENEQVRBKT4KKworPCEtLQorVGhlIHRhZ2xpYiBlbGVtZW50IGlzIHVzZWQgdG8gZGVzY3JpYmUgYSBKU1AgdGFnIGxpYnJhcnkuCisKK1VzZWQgaW46IHdlYi1hcHAKKy0tPgorPCFFTEVNRU5UIHRhZ2xpYiAodGFnbGliLXVyaSwgdGFnbGliLWxvY2F0aW9uKT4KKworPCEtLQordGhlIHRhZ2xpYi1sb2NhdGlvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBsb2NhdGlvbiAoYXMgYSByZXNvdXJjZQorcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIHdlYiBhcHBsaWNhdGlvbikgd2hlcmUgdG8gZmluZCB0aGUgVGFnCitMaWJhcnkgRGVzY3JpcHRpb24gZmlsZSBmb3IgdGhlIHRhZyBsaWJyYXJ5LgorCitVc2VkIGluOiB0YWdsaWIKKy0tPgorPCFFTEVNRU5UIHRhZ2xpYi1sb2NhdGlvbiAoI1BDREFUQSk+CisKKzwhLS0KK1RoZSB0YWdsaWItdXJpIGVsZW1lbnQgZGVzY3JpYmVzIGEgVVJJLCByZWxhdGl2ZSB0byB0aGUgbG9jYXRpb24KK29mIHRoZSB3ZWIueG1sIGRvY3VtZW50LCBpZGVudGlmeWluZyBhIFRhZyBMaWJyYXJ5IHVzZWQgaW4gdGhlIFdlYgorQXBwbGljYXRpb24uCisKK1VzZWQgaW46IHRhZ2xpYgorLS0+Cis8IUVMRU1FTlQgdGFnbGliLXVyaSAoI1BDREFUQSk+CisKKzwhLS0KK1RoZSB0cmFuc3BvcnQtZ3VhcmFudGVlIGVsZW1lbnQgc3BlY2lmaWVzIHRoYXQgdGhlIGNvbW11bmljYXRpb24KK2JldHdlZW4gY2xpZW50IGFuZCBzZXJ2ZXIgc2hvdWxkIGJlIE5PTkUsIElOVEVHUkFMLCBvcgorQ09ORklERU5USUFMLiBOT05FIG1lYW5zIHRoYXQgdGhlIGFwcGxpY2F0aW9uIGRvZXMgbm90IHJlcXVpcmUgYW55Cit0cmFuc3BvcnQgZ3VhcmFudGVlcy4gQSB2YWx1ZSBvZiBJTlRFR1JBTCBtZWFucyB0aGF0IHRoZSBhcHBsaWNhdGlvbgorcmVxdWlyZXMgdGhhdCB0aGUgZGF0YSBzZW50IGJldHdlZW4gdGhlIGNsaWVudCBhbmQgc2VydmVyIGJlIHNlbnQgaW4KK3N1Y2ggYSB3YXkgdGhhdCBpdCBjYW4ndCBiZSBjaGFuZ2VkIGluIHRyYW5zaXQuIENPTkZJREVOVElBTCBtZWFucwordGhhdCB0aGUgYXBwbGljYXRpb24gcmVxdWlyZXMgdGhhdCB0aGUgZGF0YSBiZSB0cmFuc21pdHRlZCBpbiBhCitmYXNoaW9uIHRoYXQgcHJldmVudHMgb3RoZXIgZW50aXRpZXMgZnJvbSBvYnNlcnZpbmcgdGhlIGNvbnRlbnRzIG9mCit0aGUgdHJhbnNtaXNzaW9uLiBJbiBtb3N0IGNhc2VzLCB0aGUgcHJlc2VuY2Ugb2YgdGhlIElOVEVHUkFMIG9yCitDT05GSURFTlRJQUwgZmxhZyB3aWxsIGluZGljYXRlIHRoYXQgdGhlIHVzZSBvZiBTU0wgaXMgcmVxdWlyZWQuCisKK1VzZWQgaW46IHVzZXItZGF0YS1jb25zdHJhaW50CistLT4KKzwhRUxFTUVOVCB0cmFuc3BvcnQtZ3VhcmFudGVlICgjUENEQVRBKT4KKworPCEtLQorVGhlIHVybC1wYXR0ZXJuIGVsZW1lbnQgY29udGFpbnMgdGhlIHVybCBwYXR0ZXJuIG9mIHRoZSBtYXBwaW5nLiBNdXN0Citmb2xsb3cgdGhlIHJ1bGVzIHNwZWNpZmllZCBpbiBTZWN0aW9uIDExLjIgb2YgdGhlIFNlcnZsZXQgQVBJCitTcGVjaWZpY2F0aW9uLgorCitVc2VkIGluOiBmaWx0ZXItbWFwcGluZywgc2VydmxldC1tYXBwaW5nLCB3ZWItcmVzb3VyY2UtY29sbGVjdGlvbgorLS0+Cis8IUVMRU1FTlQgdXJsLXBhdHRlcm4gKCNQQ0RBVEEpPgorCis8IS0tCitUaGUgdXNlci1kYXRhLWNvbnN0cmFpbnQgZWxlbWVudCBpcyB1c2VkIHRvIGluZGljYXRlIGhvdyBkYXRhCitjb21tdW5pY2F0ZWQgYmV0d2VlbiB0aGUgY2xpZW50IGFuZCBjb250YWluZXIgc2hvdWxkIGJlIHByb3RlY3RlZC4KKworVXNlZCBpbjogc2VjdXJpdHktY29uc3RyYWludAorLS0+Cis8IUVMRU1FTlQgdXNlci1kYXRhLWNvbnN0cmFpbnQgKGRlc2NyaXB0aW9uPywgdHJhbnNwb3J0LWd1YXJhbnRlZSk+CisKKzwhLS0KK1RoZSB3ZWItcmVzb3VyY2UtY29sbGVjdGlvbiBlbGVtZW50IGlzIHVzZWQgdG8gaWRlbnRpZnkgYSBzdWJzZXQKK29mIHRoZSByZXNvdXJjZXMgYW5kIEhUVFAgbWV0aG9kcyBvbiB0aG9zZSByZXNvdXJjZXMgd2l0aGluIGEgd2ViCithcHBsaWNhdGlvbiB0byB3aGljaCBhIHNlY3VyaXR5IGNvbnN0cmFpbnQgYXBwbGllcy4gSWYgbm8gSFRUUCBtZXRob2RzCithcmUgc3BlY2lmaWVkLCB0aGVuIHRoZSBzZWN1cml0eSBjb25zdHJhaW50IGFwcGxpZXMgdG8gYWxsIEhUVFAKK21ldGhvZHMuCisKK1VzZWQgaW46IHNlY3VyaXR5LWNvbnN0cmFpbnQKKy0tPgorPCFFTEVNRU5UIHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uICh3ZWItcmVzb3VyY2UtbmFtZSwgZGVzY3JpcHRpb24/LAordXJsLXBhdHRlcm4qLCBodHRwLW1ldGhvZCopPgorCis8IS0tCitUaGUgd2ViLXJlc291cmNlLW5hbWUgY29udGFpbnMgdGhlIG5hbWUgb2YgdGhpcyB3ZWIgcmVzb3VyY2UKK2NvbGxlY3Rpb24uCisKK1VzZWQgaW46IHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uCistLT4KKzwhRUxFTUVOVCB3ZWItcmVzb3VyY2UtbmFtZSAoI1BDREFUQSk+CisKKzwhLS0KK1RoZSB3ZWxjb21lLWZpbGUgZWxlbWVudCBjb250YWlucyBmaWxlIG5hbWUgdG8gdXNlIGFzIGEgZGVmYXVsdAord2VsY29tZSBmaWxlLCBzdWNoIGFzIGluZGV4Lmh0bWwKKworVXNlZCBpbjogd2VsY29tZS1maWxlLWxpc3QKKy0tPgorPCFFTEVNRU5UIHdlbGNvbWUtZmlsZSAoI1BDREFUQSk+CisKKzwhLS0KK1RoZSB3ZWxjb21lLWZpbGUtbGlzdCBjb250YWlucyBhbiBvcmRlcmVkIGxpc3Qgb2Ygd2VsY29tZSBmaWxlcworZWxlbWVudHMuCisKK1VzZWQgaW46IHdlYi1hcHAKKy0tPgorPCFFTEVNRU5UIHdlbGNvbWUtZmlsZS1saXN0ICh3ZWxjb21lLWZpbGUrKT4KKworPCEtLQorVGhlIElEIG1lY2hhbmlzbSBpcyB0byBhbGxvdyB0b29scyB0aGF0IHByb2R1Y2UgYWRkaXRpb25hbCBkZXBsb3ltZW50CitpbmZvcm1hdGlvbiAoaS5lLiwgaW5mb3JtYXRpb24gYmV5b25kIHRoZSBzdGFuZGFyZCBkZXBsb3ltZW50CitkZXNjcmlwdG9yIGluZm9ybWF0aW9uKSB0byBzdG9yZSB0aGUgbm9uLXN0YW5kYXJkIGluZm9ybWF0aW9uIGluIGEKK3NlcGFyYXRlIGZpbGUsIGFuZCBlYXNpbHkgcmVmZXIgZnJvbSB0aGVzZSB0b29sLXNwZWNpZmljIGZpbGVzIHRvIHRoZQoraW5mb3JtYXRpb24gaW4gdGhlIHN0YW5kYXJkIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KKworVG9vbHMgYXJlIG5vdCBhbGxvd2VkIHRvIGFkZCB0aGUgbm9uLXN0YW5kYXJkIGluZm9ybWF0aW9uIGludG8gdGhlCitzdGFuZGFyZCBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCistLT4KKworPCFBVFRMSVNUIGF1dGgtY29uc3RyYWludCBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBhdXRoLW1ldGhvZCBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBjb250ZXh0LXBhcmFtIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIGRlc2NyaXB0aW9uIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIGRpc3BsYXktbmFtZSBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBkaXN0cmlidXRhYmxlIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIGVqYi1saW5rIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIGVqYi1sb2NhbC1yZWYgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgZWpiLXJlZiBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBlamItcmVmLW5hbWUgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgZWpiLXJlZi10eXBlIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIGVudi1lbnRyeSBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBlbnYtZW50cnktbmFtZSBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBlbnYtZW50cnktdHlwZSBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBlbnYtZW50cnktdmFsdWUgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgZXJyb3ItY29kZSBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBlcnJvci1wYWdlIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIGV4Y2VwdGlvbi10eXBlIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIGV4dGVuc2lvbiBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBmaWx0ZXIgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgZmlsdGVyLWNsYXNzIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIGZpbHRlci1tYXBwaW5nIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIGZpbHRlci1uYW1lIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIGZvcm0tZXJyb3ItcGFnZSBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBmb3JtLWxvZ2luLWNvbmZpZyBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBmb3JtLWxvZ2luLXBhZ2UgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgaG9tZSBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBodHRwLW1ldGhvZCBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBpY29uIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIGluaXQtcGFyYW0gaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QganNwLWZpbGUgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgbGFyZ2UtaWNvbiBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBsaXN0ZW5lciBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBsaXN0ZW5lci1jbGFzcyBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBsb2FkLW9uLXN0YXJ0dXAgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgbG9jYWwgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgbG9jYWwtaG9tZSBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBsb2NhdGlvbiBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBsb2dpbi1jb25maWcgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgbWltZS1tYXBwaW5nIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIG1pbWUtdHlwZSBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBwYXJhbS1uYW1lIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIHBhcmFtLXZhbHVlIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIHJlYWxtLW5hbWUgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgcmVtb3RlIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIHJlcy1hdXRoIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIHJlcy1yZWYtbmFtZSBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCByZXMtc2hhcmluZy1zY29wZSBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCByZXMtdHlwZSBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCByZXNvdXJjZS1lbnYtcmVmIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIHJlc291cmNlLWVudi1yZWYtbmFtZSBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCByZXNvdXJjZS1lbnYtcmVmLXR5cGUgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgcmVzb3VyY2UtcmVmIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIHJvbGUtbGluayBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCByb2xlLW5hbWUgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgcnVuLWFzIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIHNlY3VyaXR5LWNvbnN0cmFpbnQgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1Qgc2VjdXJpdHktcm9sZSBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBzZWN1cml0eS1yb2xlLXJlZiBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBzZXJ2bGV0IGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIHNlcnZsZXQtY2xhc3MgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1Qgc2VydmxldC1tYXBwaW5nIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIHNlcnZsZXQtbmFtZSBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBzZXNzaW9uLWNvbmZpZyBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBzZXNzaW9uLXRpbWVvdXQgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1Qgc21hbGwtaWNvbiBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCB0YWdsaWIgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgdGFnbGliLWxvY2F0aW9uIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIHRhZ2xpYi11cmkgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgdHJhbnNwb3J0LWd1YXJhbnRlZSBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCB1cmwtcGF0dGVybiBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCB1c2VyLWRhdGEtY29uc3RyYWludCBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCB3ZWItYXBwIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIHdlYi1yZXNvdXJjZS1uYW1lIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIHdlbGNvbWUtZmlsZSBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCB3ZWxjb21lLWZpbGUtbGlzdCBpZCBJRCAjSU1QTElFRD4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9kdGQvd2ViLWFwcF8yXzQueHNkIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2R0ZC93ZWItYXBwXzJfNC54c2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVkYmZhMgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9kdGQvd2ViLWFwcF8yXzQueHNkCkBAIC0wLDAgKzEsMTI0OCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzx4c2Q6c2NoZW1hIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKKwkgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgorCSAgICB4bWxuczpqMmVlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgorCSAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgorCSAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKKwkgICAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIgorCSAgICB2ZXJzaW9uPSIyLjQiPgorICA8eHNkOmFubm90YXRpb24+CisgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorICAgICAgJVclICVFJQorICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgIDwveHNkOmFubm90YXRpb24+CisKKyAgPHhzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgQ29weXJpZ2h0IDIwMDQgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgOTAxIFNhbiBBbnRvbmlvCisgICAgICBSb2FkLCBQYWxvIEFsdG8sIENhbGlmb3JuaWEgOTQzMDMsIFUuUy5BLiBBbGwgcmlnaHRzCisgICAgICByZXNlcnZlZC4KKworICAgICAgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBoYXMgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cworICAgICAgcmVsYXRpbmcgdG8gdGVjaG5vbG9neSBkZXNjcmliZWQgaW4gdGhpcyBkb2N1bWVudC4gSW4KKyAgICAgIHBhcnRpY3VsYXIsIGFuZCB3aXRob3V0IGxpbWl0YXRpb24sIHRoZXNlIGludGVsbGVjdHVhbAorICAgICAgcHJvcGVydHkgcmlnaHRzIG1heSBpbmNsdWRlIG9uZSBvciBtb3JlIG9mIHRoZSBVLlMuIHBhdGVudHMKKyAgICAgIGxpc3RlZCBhdCBodHRwOi8vd3d3LnN1bi5jb20vcGF0ZW50cyBhbmQgb25lIG9yIG1vcmUKKyAgICAgIGFkZGl0aW9uYWwgcGF0ZW50cyBvciBwZW5kaW5nIHBhdGVudCBhcHBsaWNhdGlvbnMgaW4gdGhlCisgICAgICBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCisKKyAgICAgIFRoaXMgZG9jdW1lbnQgYW5kIHRoZSB0ZWNobm9sb2d5IHdoaWNoIGl0IGRlc2NyaWJlcyBhcmUKKyAgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIGxpY2Vuc2VzIHJlc3RyaWN0aW5nIHRoZWlyIHVzZSwgY29weWluZywKKyAgICAgIGRpc3RyaWJ1dGlvbiwgYW5kIGRlY29tcGlsYXRpb24uIE5vIHBhcnQgb2YgdGhpcyBkb2N1bWVudAorICAgICAgbWF5IGJlIHJlcHJvZHVjZWQgaW4gYW55IGZvcm0gYnkgYW55IG1lYW5zIHdpdGhvdXQgcHJpb3IKKyAgICAgIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBvZiBTdW4gYW5kIGl0cyBsaWNlbnNvcnMsIGlmIGFueS4KKworICAgICAgVGhpcmQtcGFydHkgc29mdHdhcmUsIGluY2x1ZGluZyBmb250IHRlY2hub2xvZ3ksIGlzCisgICAgICBjb3B5cmlnaHRlZCBhbmQgbGljZW5zZWQgZnJvbSBTdW4gc3VwcGxpZXJzLgorCisgICAgICBTdW4sIFN1biBNaWNyb3N5c3RlbXMsIHRoZSBTdW4gbG9nbywgU29sYXJpcywgSmF2YSwgSjJFRSwKKyAgICAgIEphdmFTZXJ2ZXIgUGFnZXMsIEVudGVycHJpc2UgSmF2YUJlYW5zIGFuZCB0aGUgSmF2YSBDb2ZmZWUKKyAgICAgIEN1cCBsb2dvIGFyZSB0cmFkZW1hcmtzIG9yIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiBTdW4KKyAgICAgIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgorCisgICAgICBGZWRlcmFsIEFjcXVpc2l0aW9uczogQ29tbWVyY2lhbCBTb2Z0d2FyZSAtIEdvdmVybm1lbnQgVXNlcnMKKyAgICAgIFN1YmplY3QgdG8gU3RhbmRhcmQgTGljZW5zZSBUZXJtcyBhbmQgQ29uZGl0aW9ucy4KKworICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgIDwveHNkOmFubm90YXRpb24+CisKKyAgPHhzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICAgIDwhW0NEQVRBWworCisJVGhpcyBpcyB0aGUgWE1MIFNjaGVtYSBmb3IgdGhlIFNlcnZsZXQgMi40IGRlcGxveW1lbnQgZGVzY3JpcHRvci4KKwlUaGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIG11c3QgYmUgbmFtZWQgIldFQi1JTkYvd2ViLnhtbCIgaW4gdGhlCisJd2ViIGFwcGxpY2F0aW9uJ3Mgd2FyIGZpbGUuICBBbGwgU2VydmxldCBkZXBsb3ltZW50IGRlc2NyaXB0b3JzCisJbXVzdCBpbmRpY2F0ZSB0aGUgd2ViIGFwcGxpY2F0aW9uIHNjaGVtYSBieSB1c2luZyB0aGUgSjJFRQorCW5hbWVzcGFjZToKKworCWh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUKKworCWFuZCBieSBpbmRpY2F0aW5nIHRoZSB2ZXJzaW9uIG9mIHRoZSBzY2hlbWEgYnkKKwl1c2luZyB0aGUgdmVyc2lvbiBlbGVtZW50IGFzIHNob3duIGJlbG93OgorCisJICAgIDx3ZWItYXBwIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgorCSAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisJICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSIuLi4iCisJICAgICAgdmVyc2lvbj0iMi40Ij4KKwkgICAgICAuLi4KKwkgICAgPC93ZWItYXBwPgorCisJVGhlIGluc3RhbmNlIGRvY3VtZW50cyBtYXkgaW5kaWNhdGUgdGhlIHB1Ymxpc2hlZCB2ZXJzaW9uIG9mCisJdGhlIHNjaGVtYSB1c2luZyB0aGUgeHNpOnNjaGVtYUxvY2F0aW9uIGF0dHJpYnV0ZSBmb3IgSjJFRQorCW5hbWVzcGFjZSB3aXRoIHRoZSBmb2xsb3dpbmcgbG9jYXRpb246CisKKwlodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL3dlYi1hcHBfMl80LnhzZAorCisJXV0+CisgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgPC94c2Q6YW5ub3RhdGlvbj4KKworICA8eHNkOmFubm90YXRpb24+CisgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICBUaGUgZm9sbG93aW5nIGNvbnZlbnRpb25zIGFwcGx5IHRvIGFsbCBKMkVFCisgICAgICBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZWxlbWVudHMgdW5sZXNzIGluZGljYXRlZCBvdGhlcndpc2UuCisKKyAgICAgIC0gSW4gZWxlbWVudHMgdGhhdCBzcGVjaWZ5IGEgcGF0aG5hbWUgdG8gYSBmaWxlIHdpdGhpbiB0aGUKKwlzYW1lIEpBUiBmaWxlLCByZWxhdGl2ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlIG5vdAorCXN0YXJ0aW5nIHdpdGggIi8iKSBhcmUgY29uc2lkZXJlZCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZgorCXRoZSBKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEFic29sdXRlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2UKKwlzdGFydGluZyB3aXRoICIvIikgYWxzbyBzcGVjaWZ5IG5hbWVzIGluIHRoZSByb290IG9mIHRoZQorCUpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgSW4gZ2VuZXJhbCwgcmVsYXRpdmUgbmFtZXMgYXJlCisJcHJlZmVycmVkLiAgVGhlIGV4Y2VwdGlvbiBpcyAud2FyIGZpbGVzIHdoZXJlIGFic29sdXRlCisJbmFtZXMgYXJlIHByZWZlcnJlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgU2VydmxldCBBUEkuCisKKyAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICA8L3hzZDphbm5vdGF0aW9uPgorCisgIDx4c2Q6aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0iajJlZV8xXzQueHNkIi8+CisgIDx4c2Q6aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0ianNwXzJfMC54c2QiLz4KKworCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKworICA8eHNkOmVsZW1lbnQgbmFtZT0id2ViLWFwcCIgdHlwZT0iajJlZTp3ZWItYXBwVHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJVGhlIHdlYi1hcHAgZWxlbWVudCBpcyB0aGUgcm9vdCBvZiB0aGUgZGVwbG95bWVudAorCWRlc2NyaXB0b3IgZm9yIGEgd2ViIGFwcGxpY2F0aW9uLiAgTm90ZSB0aGF0IHRoZSBzdWItZWxlbWVudHMKKwlvZiB0aGlzIGVsZW1lbnQgY2FuIGJlIGluIHRoZSBhcmJpdHJhcnkgb3JkZXIuIEJlY2F1c2Ugb2YKKwl0aGF0LCB0aGUgbXVsdGlwbGljaXR5IG9mIHRoZSBlbGVtZW50cyBvZiBkaXN0cmlidXRhYmxlLAorCXNlc3Npb24tY29uZmlnLCB3ZWxjb21lLWZpbGUtbGlzdCwganNwLWNvbmZpZywgbG9naW4tY29uZmlnLAorCWFuZCBsb2NhbGUtZW5jb2RpbmctbWFwcGluZy1saXN0IHdhcyBjaGFuZ2VkIGZyb20gIj8iIHRvICIqIgorCWluIHRoaXMgc2NoZW1hLiAgSG93ZXZlciwgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBpbnN0YW5jZQorCWZpbGUgbXVzdCBub3QgY29udGFpbiBtdWx0aXBsZSBlbGVtZW50cyBvZiBzZXNzaW9uLWNvbmZpZywKKwlqc3AtY29uZmlnLCBhbmQgbG9naW4tY29uZmlnLiBXaGVuIHRoZXJlIGFyZSBtdWx0aXBsZSBlbGVtZW50cyBvZgorCXdlbGNvbWUtZmlsZS1saXN0IG9yIGxvY2FsZS1lbmNvZGluZy1tYXBwaW5nLWxpc3QsIHRoZSBjb250YWluZXIKKwltdXN0IGNvbmNhdGluYXRlIHRoZSBlbGVtZW50IGNvbnRlbnRzLiAgVGhlIG11bHRpcGxlIG9jY3VyYW5jZQorCW9mIHRoZSBlbGVtZW50IGRpc3RyaWJ1dGFibGUgaXMgcmVkdW5kYW50IGFuZCB0aGUgY29udGFpbmVyCisJdHJlYXRzIHRoYXQgY2FzZSBleGFjdGx5IGluIHRoZSBzYW1lIHdheSB3aGVuIHRoZXJlIGlzIG9ubHkKKwlvbmUgZGlzdHJpYnV0YWJsZS4KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorCisgICAgPHhzZDp1bmlxdWUgbmFtZT0id2ViLWFwcC1zZXJ2bGV0LW5hbWUtdW5pcXVlbmVzcyI+CisgICAgICA8eHNkOmFubm90YXRpb24+CisJPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICBUaGUgc2VydmxldCBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgc2VydmxldC4KKwkgIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUgd2ViIGFwcGxpY2F0aW9uLgorCisJPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICAgIDwveHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOnNlcnZsZXQiLz4KKyAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6c2VydmxldC1uYW1lIi8+CisgICAgPC94c2Q6dW5pcXVlPgorCisgICAgPHhzZDp1bmlxdWUgbmFtZT0id2ViLWFwcC1maWx0ZXItbmFtZS11bmlxdWVuZXNzIj4KKyAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KKwk8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgIFRoZSBmaWx0ZXIgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIGZpbHRlci4KKwkgIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUgd2ViIGFwcGxpY2F0aW9uLgorCisJPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICAgIDwveHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOmZpbHRlciIvPgorICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTpmaWx0ZXItbmFtZSIvPgorICAgIDwveHNkOnVuaXF1ZT4KKworICAgIDx4c2Q6dW5pcXVlIG5hbWU9IndlYi1hcHAtZWpiLWxvY2FsLXJlZi1uYW1lLXVuaXF1ZW5lc3MiPgorICAgICAgPHhzZDphbm5vdGF0aW9uPgorCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgVGhlIGVqYi1sb2NhbC1yZWYtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGFuIEVKQgorCSAgcmVmZXJlbmNlLiBUaGUgRUpCIHJlZmVyZW5jZSBpcyBhbiBlbnRyeSBpbiB0aGUgd2ViCisJICBhcHBsaWNhdGlvbidzIGVudmlyb25tZW50IGFuZCBpcyByZWxhdGl2ZSB0byB0aGUKKwkgIGphdmE6Y29tcC9lbnYgY29udGV4dC4gIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbgorCSAgdGhlIHdlYiBhcHBsaWNhdGlvbi4KKworCSAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBuYW1lIGlzIHByZWZpeGVkIHdpdGggImVqYi8iLgorCisJPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICAgIDwveHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOmVqYi1sb2NhbC1yZWYiLz4KKyAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6ZWpiLXJlZi1uYW1lIi8+CisgICAgPC94c2Q6dW5pcXVlPgorCisgICAgPHhzZDp1bmlxdWUgbmFtZT0id2ViLWFwcC1lamItcmVmLW5hbWUtdW5pcXVlbmVzcyI+CisgICAgICA8eHNkOmFubm90YXRpb24+CisJPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICBUaGUgZWpiLXJlZi1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYW4gRUpCCisJICByZWZlcmVuY2UuIFRoZSBFSkIgcmVmZXJlbmNlIGlzIGFuIGVudHJ5IGluIHRoZSB3ZWIKKwkgIGFwcGxpY2F0aW9uJ3MgZW52aXJvbm1lbnQgYW5kIGlzIHJlbGF0aXZlIHRvIHRoZQorCSAgamF2YTpjb21wL2VudiBjb250ZXh0LiAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluCisJICB0aGUgd2ViIGFwcGxpY2F0aW9uLgorCisJICBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IG5hbWUgaXMgcHJlZml4ZWQgd2l0aCAiZWpiLyIuCisKKwk8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6ZWpiLXJlZiIvPgorICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTplamItcmVmLW5hbWUiLz4KKyAgICA8L3hzZDp1bmlxdWU+CisKKyAgICA8eHNkOnVuaXF1ZSBuYW1lPSJ3ZWItYXBwLXJlc291cmNlLWVudi1yZWYtdW5pcXVlbmVzcyI+CisgICAgICA8eHNkOmFubm90YXRpb24+CisJPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICBUaGUgcmVzb3VyY2UtZW52LXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mCisJICBhIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZTsgaXRzIHZhbHVlIGlzIHRoZQorCSAgZW52aXJvbm1lbnQgZW50cnkgbmFtZSB1c2VkIGluIHRoZSB3ZWIgYXBwbGljYXRpb24gY29kZS4KKwkgIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52CisJICBjb250ZXh0IGFuZCBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYSB3ZWIgYXBwbGljYXRpb24uCisKKwk8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6cmVzb3VyY2UtZW52LXJlZiIvPgorICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTpyZXNvdXJjZS1lbnYtcmVmLW5hbWUiLz4KKyAgICA8L3hzZDp1bmlxdWU+CisKKyAgICA8eHNkOnVuaXF1ZSBuYW1lPSJ3ZWItYXBwLW1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLXVuaXF1ZW5lc3MiPgorICAgICAgPHhzZDphbm5vdGF0aW9uPgorCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgVGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YKKwkgIGEgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZlcmVuY2U7IGl0cyB2YWx1ZSBpcyB0aGUKKwkgIGVudmlyb25tZW50IGVudHJ5IG5hbWUgdXNlZCBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uIGNvZGUuCisJICBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudgorCSAgY29udGV4dCBhbmQgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGEgd2ViIGFwcGxpY2F0aW9uLgorCisJPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICAgIDwveHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOm1lc3NhZ2UtZGVzdGluYXRpb24tcmVmIi8+CisgICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOm1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLW5hbWUiLz4KKyAgICA8L3hzZDp1bmlxdWU+CisKKyAgICA8eHNkOnVuaXF1ZSBuYW1lPSJ3ZWItYXBwLXJlcy1yZWYtbmFtZS11bmlxdWVuZXNzIj4KKyAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KKwk8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgIFRoZSByZXMtcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYQorCSAgcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlLiAgVGhlIG5hbWUKKwkgIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQuCisJICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYSB3ZWIgYXBwbGljYXRpb24uCisKKwk8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6cmVzb3VyY2UtcmVmIi8+CisgICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOnJlcy1yZWYtbmFtZSIvPgorICAgIDwveHNkOnVuaXF1ZT4KKworICAgIDx4c2Q6dW5pcXVlIG5hbWU9IndlYi1hcHAtZW52LWVudHJ5LW5hbWUtdW5pcXVlbmVzcyI+CisgICAgICA8eHNkOmFubm90YXRpb24+CisJPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICBUaGUgZW52LWVudHJ5LW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIHdlYgorCSAgYXBwbGljYXRpb24ncyBlbnZpcm9ubWVudCBlbnRyeS4gIFRoZSBuYW1lIGlzIGEgSk5ESQorCSAgbmFtZSByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0LiAgVGhlIG5hbWUKKwkgIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhIHdlYiBhcHBsaWNhdGlvbi4KKworCTwveHNkOmRvY3VtZW50YXRpb24+CisgICAgICA8L3hzZDphbm5vdGF0aW9uPgorCisgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOmVudi1lbnRyeSIvPgorICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTplbnYtZW50cnktbmFtZSIvPgorICAgIDwveHNkOnVuaXF1ZT4KKworICAgIDx4c2Q6a2V5IG5hbWU9IndlYi1hcHAtcm9sZS1uYW1lLWtleSI+CisgICAgICA8eHNkOmFubm90YXRpb24+CisJPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICBBIHJvbGUtbmFtZS1rZXkgaXMgc3BlY2lmaWVkIHRvIGFsbG93IHRoZSByZWZlcmVuY2VzCisJICBmcm9tIHRoZSBzZWN1cml0eS1yb2xlLXJlZnMuCisKKwk8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6c2VjdXJpdHktcm9sZSIvPgorICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTpyb2xlLW5hbWUiLz4KKyAgICA8L3hzZDprZXk+CisKKyAgICA8eHNkOmtleXJlZiBuYW1lPSJ3ZWItYXBwLXJvbGUtbmFtZS1yZWZlcmVuY2VzIgorCQlyZWZlcj0iajJlZTp3ZWItYXBwLXJvbGUtbmFtZS1rZXkiPgorICAgICAgPHhzZDphbm5vdGF0aW9uPgorCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgVGhlIGtleXJlZiBpbmRpY2F0ZXMgdGhlIHJlZmVyZW5jZXMgZnJvbQorCSAgc2VjdXJpdHktcm9sZS1yZWYgdG8gYSBzcGVjaWZpZWQgcm9sZS1uYW1lLgorCisJPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICAgIDwveHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOnNlcnZsZXQvajJlZTpzZWN1cml0eS1yb2xlLXJlZiIvPgorICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTpyb2xlLWxpbmsiLz4KKyAgICA8L3hzZDprZXlyZWY+CisgIDwveHNkOmVsZW1lbnQ+CisKKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXV0aC1jb25zdHJhaW50VHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJVGhlIGF1dGgtY29uc3RyYWludFR5cGUgaW5kaWNhdGVzIHRoZSB1c2VyIHJvbGVzIHRoYXQKKwlzaG91bGQgYmUgcGVybWl0dGVkIGFjY2VzcyB0byB0aGlzIHJlc291cmNlCisJY29sbGVjdGlvbi4gVGhlIHJvbGUtbmFtZSB1c2VkIGhlcmUgbXVzdCBlaXRoZXIgY29ycmVzcG9uZAorCXRvIHRoZSByb2xlLW5hbWUgb2Ygb25lIG9mIHRoZSBzZWN1cml0eS1yb2xlIGVsZW1lbnRzCisJZGVmaW5lZCBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24sIG9yIGJlIHRoZSBzcGVjaWFsbHkKKwlyZXNlcnZlZCByb2xlLW5hbWUgIioiIHRoYXQgaXMgYSBjb21wYWN0IHN5bnRheCBmb3IKKwlpbmRpY2F0aW5nIGFsbCByb2xlcyBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uLiBJZiBib3RoICIqIgorCWFuZCByb2xlbmFtZXMgYXBwZWFyLCB0aGUgY29udGFpbmVyIGludGVycHJldHMgdGhpcyBhcyBhbGwKKwlyb2xlcy4gIElmIG5vIHJvbGVzIGFyZSBkZWZpbmVkLCBubyB1c2VyIGlzIGFsbG93ZWQgYWNjZXNzCisJdG8gdGhlIHBvcnRpb24gb2YgdGhlIHdlYiBhcHBsaWNhdGlvbiBkZXNjcmliZWQgYnkgdGhlCisJY29udGFpbmluZyBzZWN1cml0eS1jb25zdHJhaW50LiAgVGhlIGNvbnRhaW5lciBtYXRjaGVzCisJcm9sZSBuYW1lcyBjYXNlIHNlbnNpdGl2ZWx5IHdoZW4gZGV0ZXJtaW5pbmcgYWNjZXNzLgorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisKKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgorCQkgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJvbGUtbmFtZSIKKwkJICAgdHlwZT0iajJlZTpyb2xlLW5hbWVUeXBlIgorCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXV0aC1tZXRob2RUeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwlUaGUgYXV0aC1tZXRob2RUeXBlIGlzIHVzZWQgdG8gY29uZmlndXJlIHRoZSBhdXRoZW50aWNhdGlvbgorCW1lY2hhbmlzbSBmb3IgdGhlIHdlYiBhcHBsaWNhdGlvbi4gQXMgYSBwcmVyZXF1aXNpdGUgdG8KKwlnYWluaW5nIGFjY2VzcyB0byBhbnkgd2ViIHJlc291cmNlcyB3aGljaCBhcmUgcHJvdGVjdGVkIGJ5CisJYW4gYXV0aG9yaXphdGlvbiBjb25zdHJhaW50LCBhIHVzZXIgbXVzdCBoYXZlIGF1dGhlbnRpY2F0ZWQKKwl1c2luZyB0aGUgY29uZmlndXJlZCBtZWNoYW5pc20uIExlZ2FsIHZhbHVlcyBhcmUgIkJBU0lDIiwKKwkiRElHRVNUIiwgIkZPUk0iLCAiQ0xJRU5ULUNFUlQiLCBvciBhIHZlbmRvci1zcGVjaWZpYworCWF1dGhlbnRpY2F0aW9uIHNjaGVtZS4KKworCVVzZWQgaW46IGxvZ2luLWNvbmZpZworCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisKKyAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+CisgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIi8+CisgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRpc3BhdGNoZXJUeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwlUaGUgZGlzcGF0Y2hlciBoYXMgZm91ciBsZWdhbCB2YWx1ZXM6IEZPUldBUkQsIFJFUVVFU1QsIElOQ0xVREUsCisJYW5kIEVSUk9SLiBBIHZhbHVlIG9mIEZPUldBUkQgbWVhbnMgdGhlIEZpbHRlciB3aWxsIGJlIGFwcGxpZWQKKwl1bmRlciBSZXF1ZXN0RGlzcGF0Y2hlci5mb3J3YXJkKCkgY2FsbHMuICBBIHZhbHVlIG9mIFJFUVVFU1QKKwltZWFucyB0aGUgRmlsdGVyIHdpbGwgYmUgYXBwbGllZCB1bmRlciBvcmRpbmFyeSBjbGllbnQgY2FsbHMgdG8KKwl0aGUgcGF0aCBvciBzZXJ2bGV0LiBBIHZhbHVlIG9mIElOQ0xVREUgbWVhbnMgdGhlIEZpbHRlciB3aWxsIGJlCisJYXBwbGllZCB1bmRlciBSZXF1ZXN0RGlzcGF0Y2hlci5pbmNsdWRlKCkgY2FsbHMuICBBIHZhbHVlIG9mCisJRVJST1IgbWVhbnMgdGhlIEZpbHRlciB3aWxsIGJlIGFwcGxpZWQgdW5kZXIgdGhlIGVycm9yIHBhZ2UKKwltZWNoYW5pc20uICBUaGUgYWJzZW5jZSBvZiBhbnkgZGlzcGF0Y2hlciBlbGVtZW50cyBpbiBhCisJZmlsdGVyLW1hcHBpbmcgaW5kaWNhdGVzIGEgZGVmYXVsdCBvZiBhcHBseWluZyBmaWx0ZXJzIG9ubHkgdW5kZXIKKwlvcmRpbmFyeSBjbGllbnQgY2FsbHMgdG8gdGhlIHBhdGggb3Igc2VydmxldC4KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorCisgICAgPHhzZDpzaW1wbGVDb250ZW50PgorICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+CisJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRk9SV0FSRCIvPgorCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklOQ0xVREUiLz4KKwk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSRVFVRVNUIi8+CisJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRVJST1IiLz4KKyAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImVuY29kaW5nVHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJVGhlIGVuY29kaW5nVHlwZSBkZWZpbmVzIElBTkEgY2hhcmFjdGVyIHNldHMuCisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKworICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+CisgICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9IlteXHNdKyIvPgorICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICA8L3hzZDpzaW1wbGVUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlcnJvci1jb2RlVHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJVGhlIGVycm9yLWNvZGUgY29udGFpbnMgYW4gSFRUUCBlcnJvciBjb2RlLCBleDogNDA0CisKKwlVc2VkIGluOiBlcnJvci1wYWdlCisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKworICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTp4c2RQb3NpdGl2ZUludGVnZXJUeXBlIj4KKwk8eHNkOnBhdHRlcm4gdmFsdWU9IlxkezN9Ii8+CisJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgorICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVycm9yLXBhZ2VUeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwlUaGUgZXJyb3ItcGFnZVR5cGUgY29udGFpbnMgYSBtYXBwaW5nIGJldHdlZW4gYW4gZXJyb3IgY29kZQorCW9yIGV4Y2VwdGlvbiB0eXBlIHRvIHRoZSBwYXRoIG9mIGEgcmVzb3VyY2UgaW4gdGhlIHdlYgorCWFwcGxpY2F0aW9uLgorCisJVXNlZCBpbjogd2ViLWFwcAorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisKKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDpjaG9pY2U+CisJPHhzZDplbGVtZW50IG5hbWU9ImVycm9yLWNvZGUiCisJCSAgICAgdHlwZT0iajJlZTplcnJvci1jb2RlVHlwZSIvPgorCisJPHhzZDplbGVtZW50IG5hbWU9ImV4Y2VwdGlvbi10eXBlIgorCQkgICAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+CisJICA8eHNkOmFubm90YXRpb24+CisJICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgICAgIFRoZSBleGNlcHRpb24tdHlwZSBjb250YWlucyBhIGZ1bGx5IHF1YWxpZmllZCBjbGFzcworCSAgICAgIG5hbWUgb2YgYSBKYXZhIGV4Y2VwdGlvbiB0eXBlLgorCisJICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisJICA8L3hzZDphbm5vdGF0aW9uPgorCTwveHNkOmVsZW1lbnQ+CisgICAgICA8L3hzZDpjaG9pY2U+CisKKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2NhdGlvbiIKKwkJICAgdHlwZT0iajJlZTp3YXItcGF0aFR5cGUiPgorCTx4c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgICBUaGUgbG9jYXRpb24gZWxlbWVudCBjb250YWlucyB0aGUgbG9jYXRpb24gb2YgdGhlCisJICAgIHJlc291cmNlIGluIHRoZSB3ZWIgYXBwbGljYXRpb24gcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YKKwkgICAgdGhlIHdlYiBhcHBsaWNhdGlvbi4gVGhlIHZhbHVlIG9mIHRoZSBsb2NhdGlvbiBtdXN0IGhhdmUKKwkgICAgYSBsZWFkaW5nIGAvJy4KKworCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwk8L3hzZDphbm5vdGF0aW9uPgorICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmaWx0ZXItbWFwcGluZ1R5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCURlY2xhcmF0aW9uIG9mIHRoZSBmaWx0ZXIgbWFwcGluZ3MgaW4gdGhpcyB3ZWIKKwlhcHBsaWNhdGlvbiBpcyBkb25lIGJ5IHVzaW5nIGZpbHRlci1tYXBwaW5nVHlwZS4KKwlUaGUgY29udGFpbmVyIHVzZXMgdGhlIGZpbHRlci1tYXBwaW5nCisJZGVjbGFyYXRpb25zIHRvIGRlY2lkZSB3aGljaCBmaWx0ZXJzIHRvIGFwcGx5IHRvIGEgcmVxdWVzdCwKKwlhbmQgaW4gd2hhdCBvcmRlci4gVGhlIGNvbnRhaW5lciBtYXRjaGVzIHRoZSByZXF1ZXN0IFVSSSB0bworCWEgU2VydmxldCBpbiB0aGUgbm9ybWFsIHdheS4gVG8gZGV0ZXJtaW5lIHdoaWNoIGZpbHRlcnMgdG8KKwlhcHBseSBpdCBtYXRjaGVzIGZpbHRlci1tYXBwaW5nIGRlY2xhcmF0aW9ucyBlaXRoZXIgb24KKwlzZXJ2bGV0LW5hbWUsIG9yIG9uIHVybC1wYXR0ZXJuIGZvciBlYWNoIGZpbHRlci1tYXBwaW5nCisJZWxlbWVudCwgZGVwZW5kaW5nIG9uIHdoaWNoIHN0eWxlIGlzIHVzZWQuIFRoZSBvcmRlciBpbgorCXdoaWNoIGZpbHRlcnMgYXJlIGludm9rZWQgaXMgdGhlIG9yZGVyIGluIHdoaWNoCisJZmlsdGVyLW1hcHBpbmcgZGVjbGFyYXRpb25zIHRoYXQgbWF0Y2ggYSByZXF1ZXN0IFVSSSBmb3IgYQorCXNlcnZsZXQgYXBwZWFyIGluIHRoZSBsaXN0IG9mIGZpbHRlci1tYXBwaW5nIGVsZW1lbnRzLlRoZQorCWZpbHRlci1uYW1lIHZhbHVlIG11c3QgYmUgdGhlIHZhbHVlIG9mIHRoZSBmaWx0ZXItbmFtZQorCXN1Yi1lbGVtZW50cyBvZiBvbmUgb2YgdGhlIGZpbHRlciBkZWNsYXJhdGlvbnMgaW4gdGhlCisJZGVwbG95bWVudCBkZXNjcmlwdG9yLgorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisKKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpbHRlci1uYW1lIgorCQkgICB0eXBlPSJqMmVlOmZpbHRlci1uYW1lVHlwZSIvPgorICAgICAgPHhzZDpjaG9pY2U+CisJPHhzZDplbGVtZW50IG5hbWU9InVybC1wYXR0ZXJuIgorCQkgICAgIHR5cGU9ImoyZWU6dXJsLXBhdHRlcm5UeXBlIi8+CisJPHhzZDplbGVtZW50IG5hbWU9InNlcnZsZXQtbmFtZSIKKwkJICAgICB0eXBlPSJqMmVlOnNlcnZsZXQtbmFtZVR5cGUiLz4KKyAgICAgIDwveHNkOmNob2ljZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNwYXRjaGVyIgorCQkgICB0eXBlPSJqMmVlOmRpc3BhdGNoZXJUeXBlIgorCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iNCIvPgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZpbHRlci1uYW1lVHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJVGhlIGxvZ2ljYWwgbmFtZSBvZiB0aGUgZmlsdGVyIGlzIGRlY2xhcmUKKwlieSB1c2luZyBmaWx0ZXItbmFtZVR5cGUuIFRoaXMgbmFtZSBpcyB1c2VkIHRvIG1hcCB0aGUKKwlmaWx0ZXIuICBFYWNoIGZpbHRlciBuYW1lIGlzIHVuaXF1ZSB3aXRoaW4gdGhlIHdlYgorCWFwcGxpY2F0aW9uLgorCisJVXNlZCBpbjogZmlsdGVyLCBmaWx0ZXItbWFwcGluZworCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisKKyAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+CisgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJqMmVlOm5vbkVtcHR5U3RyaW5nVHlwZSIvPgorICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmaWx0ZXJUeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwlUaGUgZmlsdGVyVHlwZSBpcyB1c2VkIHRvIGRlY2xhcmUgYSBmaWx0ZXIgaW4gdGhlIHdlYgorCWFwcGxpY2F0aW9uLiBUaGUgZmlsdGVyIGlzIG1hcHBlZCB0byBlaXRoZXIgYSBzZXJ2bGV0IG9yIGEKKwlVUkwgcGF0dGVybiBpbiB0aGUgZmlsdGVyLW1hcHBpbmcgZWxlbWVudCwgdXNpbmcgdGhlCisJZmlsdGVyLW5hbWUgdmFsdWUgdG8gcmVmZXJlbmNlLiBGaWx0ZXJzIGNhbiBhY2Nlc3MgdGhlCisJaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycyBkZWNsYXJlZCBpbiB0aGUgZGVwbG95bWVudAorCWRlc2NyaXB0b3IgYXQgcnVudGltZSB2aWEgdGhlIEZpbHRlckNvbmZpZyBpbnRlcmZhY2UuCisKKwlVc2VkIGluOiB3ZWItYXBwCisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKworICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmdyb3VwIHJlZj0iajJlZTpkZXNjcmlwdGlvbkdyb3VwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmlsdGVyLW5hbWUiCisJCSAgIHR5cGU9ImoyZWU6ZmlsdGVyLW5hbWVUeXBlIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmlsdGVyLWNsYXNzIgorCQkgICB0eXBlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgorCTx4c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgICBUaGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzbmFtZSBvZiB0aGUgZmlsdGVyLgorCisJICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCTwveHNkOmFubm90YXRpb24+CisgICAgICA8L3hzZDplbGVtZW50PgorCisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5pdC1wYXJhbSIKKwkJICAgdHlwZT0iajJlZTpwYXJhbS12YWx1ZVR5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorCTx4c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgICBUaGUgaW5pdC1wYXJhbSBlbGVtZW50IGNvbnRhaW5zIGEgbmFtZS92YWx1ZSBwYWlyIGFzCisJICAgIGFuIGluaXRpYWxpemF0aW9uIHBhcmFtIG9mIGEgc2VydmxldCBmaWx0ZXIKKworCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwk8L3hzZDphbm5vdGF0aW9uPgorICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmb3JtLWxvZ2luLWNvbmZpZ1R5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCVRoZSBmb3JtLWxvZ2luLWNvbmZpZ1R5cGUgc3BlY2lmaWVzIHRoZSBsb2dpbiBhbmQgZXJyb3IKKwlwYWdlcyB0aGF0IHNob3VsZCBiZSB1c2VkIGluIGZvcm0gYmFzZWQgbG9naW4uIElmIGZvcm0gYmFzZWQKKwlhdXRoZW50aWNhdGlvbiBpcyBub3QgdXNlZCwgdGhlc2UgZWxlbWVudHMgYXJlIGlnbm9yZWQuCisKKwlVc2VkIGluOiBsb2dpbi1jb25maWcKKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorCisgICAgPHhzZDpzZXF1ZW5jZT4KKworICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZvcm0tbG9naW4tcGFnZSIKKwkJICAgdHlwZT0iajJlZTp3YXItcGF0aFR5cGUiPgorCTx4c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgICBUaGUgZm9ybS1sb2dpbi1wYWdlIGVsZW1lbnQgZGVmaW5lcyB0aGUgbG9jYXRpb24gaW4gdGhlIHdlYgorCSAgICBhcHAgd2hlcmUgdGhlIHBhZ2UgdGhhdCBjYW4gYmUgdXNlZCBmb3IgbG9naW4gY2FuIGJlCisJICAgIGZvdW5kLiAgVGhlIHBhdGggYmVnaW5zIHdpdGggYSBsZWFkaW5nIC8gYW5kIGlzIGludGVycHJldGVkCisJICAgIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSBXQVIuCisKKwkgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDwveHNkOmVsZW1lbnQ+CisKKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmb3JtLWVycm9yLXBhZ2UiCisJCSAgIHR5cGU9ImoyZWU6d2FyLXBhdGhUeXBlIj4KKwk8eHNkOmFubm90YXRpb24+CisJICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgICAgVGhlIGZvcm0tZXJyb3ItcGFnZSBlbGVtZW50IGRlZmluZXMgdGhlIGxvY2F0aW9uIGluCisJICAgIHRoZSB3ZWIgYXBwIHdoZXJlIHRoZSBlcnJvciBwYWdlIHRoYXQgaXMgZGlzcGxheWVkCisJICAgIHdoZW4gbG9naW4gaXMgbm90IHN1Y2Nlc3NmdWwgY2FuIGJlIGZvdW5kLgorCSAgICBUaGUgcGF0aCBiZWdpbnMgd2l0aCBhIGxlYWRpbmcgLyBhbmQgaXMgaW50ZXJwcmV0ZWQKKwkgICAgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIFdBUi4KKworCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwk8L3hzZDphbm5vdGF0aW9uPgorICAgICAgPC94c2Q6ZWxlbWVudD4KKworICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Imh0dHAtbWV0aG9kVHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorCisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwlUaGUgaHR0cC1tZXRob2QgY29udGFpbnMgYW4gSFRUUCBtZXRob2QgcmVjb2duaXplZCBieSB0aGUKKwl3ZWItYXBwLCBmb3IgZXhhbXBsZSBHRVQsIFBPU1QsIC4uLgorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisKKyAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+CisgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KKwk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHRVQiLz4KKwk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQT1NUIi8+CisJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUFVUIi8+CisJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREVMRVRFIi8+CisJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSEVBRCIvPgorCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9QVElPTlMiLz4KKwk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUUkFDRSIvPgorICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImxvY2FsZS1lbmNvZGluZy1tYXBwaW5nLWxpc3RUeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwlUaGUgbG9jYWxlLWVuY29kaW5nLW1hcHBpbmctbGlzdCBjb250YWlucyBvbmUgb3IgbW9yZQorCWxvY2FsZS1lbmNvZGluZy1tYXBwaW5nKHMpLgorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisKKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvY2FsZS1lbmNvZGluZy1tYXBwaW5nIgorCQkgICB0eXBlPSJqMmVlOmxvY2FsZS1lbmNvZGluZy1tYXBwaW5nVHlwZSIKKwkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsb2NhbGUtZW5jb2RpbmctbWFwcGluZ1R5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCVRoZSBsb2NhbGUtZW5jb2RpbmctbWFwcGluZyBjb250YWlucyBsb2NhbGUgbmFtZSBhbmQKKwllbmNvZGluZyBuYW1lLiBUaGUgbG9jYWxlIG5hbWUgbXVzdCBiZSBlaXRoZXIgIkxhbmd1YWdlLWNvZGUiLAorCXN1Y2ggYXMgImphIiwgZGVmaW5lZCBieSBJU08tNjM5IG9yICJMYW5ndWFnZS1jb2RlX0NvdW50cnktY29kZSIsCisJc3VjaCBhcyAiamFfSlAiLiAgIkNvdW50cnkgY29kZSIgaXMgZGVmaW5lZCBieSBJU08tMzE2Ni4KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorCisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2NhbGUiCisJCSAgIHR5cGU9ImoyZWU6bG9jYWxlVHlwZSIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVuY29kaW5nIgorCQkgICB0eXBlPSJqMmVlOmVuY29kaW5nVHlwZSIvPgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ibG9jYWxlVHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJVGhlIGxvY2FsZVR5cGUgZGVmaW5lcyB2YWxpZCBsb2NhbGUgZGVmaW5lZCBieSBJU08tNjM5LTEKKwlhbmQgSVNPLTMxNjYuCisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKworICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+CisgICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9IlthLXpdezJ9KF98LSk/KFtccHtMfVwtXHB7TmR9XXsyfSk/Ii8+CisgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgIDwveHNkOnNpbXBsZVR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImxvZ2luLWNvbmZpZ1R5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCVRoZSBsb2dpbi1jb25maWdUeXBlIGlzIHVzZWQgdG8gY29uZmlndXJlIHRoZSBhdXRoZW50aWNhdGlvbgorCW1ldGhvZCB0aGF0IHNob3VsZCBiZSB1c2VkLCB0aGUgcmVhbG0gbmFtZSB0aGF0IHNob3VsZCBiZQorCXVzZWQgZm9yIHRoaXMgYXBwbGljYXRpb24sIGFuZCB0aGUgYXR0cmlidXRlcyB0aGF0IGFyZQorCW5lZWRlZCBieSB0aGUgZm9ybSBsb2dpbiBtZWNoYW5pc20uCisKKwlVc2VkIGluOiB3ZWItYXBwCisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKworICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXV0aC1tZXRob2QiCisJCSAgIHR5cGU9ImoyZWU6YXV0aC1tZXRob2RUeXBlIgorCQkgICBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZWFsbS1uYW1lIgorCQkgICB0eXBlPSJqMmVlOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KKwk8eHNkOmFubm90YXRpb24+CisJICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgICAgVGhlIHJlYWxtIG5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIHJlYWxtIG5hbWUgdG8KKwkgICAgdXNlIGluIEhUVFAgQmFzaWMgYXV0aG9yaXphdGlvbi4KKworCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwk8L3hzZDphbm5vdGF0aW9uPgorICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmb3JtLWxvZ2luLWNvbmZpZyIKKwkJICAgdHlwZT0iajJlZTpmb3JtLWxvZ2luLWNvbmZpZ1R5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCIvPgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1pbWUtbWFwcGluZ1R5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCVRoZSBtaW1lLW1hcHBpbmdUeXBlIGRlZmluZXMgYSBtYXBwaW5nIGJldHdlZW4gYW4gZXh0ZW5zaW9uCisJYW5kIGEgbWltZSB0eXBlLgorCisJVXNlZCBpbjogd2ViLWFwcAorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisKKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDphbm5vdGF0aW9uPgorCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgVGhlIGV4dGVuc2lvbiBlbGVtZW50IGNvbnRhaW5zIGEgc3RyaW5nIGRlc2NyaWJpbmcgYW4KKwkgIGV4dGVuc2lvbi4gZXhhbXBsZTogInR4dCIKKworCTwveHNkOmRvY3VtZW50YXRpb24+CisgICAgICA8L3hzZDphbm5vdGF0aW9uPgorCisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIgorCQkgICB0eXBlPSJqMmVlOnN0cmluZyIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1pbWUtdHlwZSIKKwkJICAgdHlwZT0iajJlZTptaW1lLXR5cGVUeXBlIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWltZS10eXBlVHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJVGhlIG1pbWUtdHlwZVR5cGUgaXMgdXNlZCB0byBpbmRpY2F0ZSBhIGRlZmluZWQgbWltZSB0eXBlLgorCisJRXhhbXBsZToKKwkidGV4dC9wbGFpbiIKKworCVVzZWQgaW46IG1pbWUtbWFwcGluZworCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisKKyAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+CisgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KKyAgICAgICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9IlteXHB7Q2N9XlxzXSsvW15ccHtDY31eXHNdKyIvPgorICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5vbkVtcHR5U3RyaW5nVHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCVRoaXMgdHlwZSBkZWZpbmVzIGEgc3RyaW5nIHdoaWNoIGNvbnRhaW5zIGF0IGxlYXN0IG9uZQorCWNoYXJhY3Rlci4KKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+CisgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KKwk8eHNkOm1pbkxlbmd0aCB2YWx1ZT0iMSIvPgorICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+CisgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlY3VyaXR5LWNvbnN0cmFpbnRUeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwlUaGUgc2VjdXJpdHktY29uc3RyYWludFR5cGUgaXMgdXNlZCB0byBhc3NvY2lhdGUKKwlzZWN1cml0eSBjb25zdHJhaW50cyB3aXRoIG9uZSBvciBtb3JlIHdlYiByZXNvdXJjZQorCWNvbGxlY3Rpb25zCisKKwlVc2VkIGluOiB3ZWItYXBwCisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKworICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlzcGxheS1uYW1lIgorCQkgICB0eXBlPSJqMmVlOmRpc3BsYXktbmFtZVR5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCIKKwkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3ZWItcmVzb3VyY2UtY29sbGVjdGlvbiIKKwkJICAgdHlwZT0iajJlZTp3ZWItcmVzb3VyY2UtY29sbGVjdGlvblR5cGUiCisJCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXV0aC1jb25zdHJhaW50IgorCQkgICB0eXBlPSJqMmVlOmF1dGgtY29uc3RyYWludFR5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVzZXItZGF0YS1jb25zdHJhaW50IgorCQkgICB0eXBlPSJqMmVlOnVzZXItZGF0YS1jb25zdHJhaW50VHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VydmxldC1tYXBwaW5nVHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJVGhlIHNlcnZsZXQtbWFwcGluZ1R5cGUgZGVmaW5lcyBhIG1hcHBpbmcgYmV0d2VlbiBhCisJc2VydmxldCBhbmQgYSB1cmwgcGF0dGVybi4KKworCVVzZWQgaW46IHdlYi1hcHAKKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorCisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2bGV0LW5hbWUiCisJCSAgIHR5cGU9ImoyZWU6c2VydmxldC1uYW1lVHlwZSIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVybC1wYXR0ZXJuIgorCQkgICB0eXBlPSJqMmVlOnVybC1wYXR0ZXJuVHlwZSIvPgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcnZsZXQtbmFtZVR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCVRoZSBzZXJ2bGV0LW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgY2Fub25pY2FsIG5hbWUgb2YgdGhlCisJc2VydmxldC4gRWFjaCBzZXJ2bGV0IG5hbWUgaXMgdW5pcXVlIHdpdGhpbiB0aGUgd2ViCisJYXBwbGljYXRpb24uCisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKworICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImoyZWU6bm9uRW1wdHlTdHJpbmdUeXBlIi8+CisgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcnZsZXRUeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwlUaGUgc2VydmxldFR5cGUgaXMgdXNlZCB0byBkZWNsYXJlIGEgc2VydmxldC4KKwlJdCBjb250YWlucyB0aGUgZGVjbGFyYXRpdmUgZGF0YSBvZiBhCisJc2VydmxldC4gSWYgYSBqc3AtZmlsZSBpcyBzcGVjaWZpZWQgYW5kIHRoZSBsb2FkLW9uLXN0YXJ0dXAKKwllbGVtZW50IGlzIHByZXNlbnQsIHRoZW4gdGhlIEpTUCBzaG91bGQgYmUgcHJlY29tcGlsZWQgYW5kCisJbG9hZGVkLgorCisJVXNlZCBpbjogd2ViLWFwcAorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisKKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDpncm91cCByZWY9ImoyZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZsZXQtbmFtZSIKKwkJICAgdHlwZT0iajJlZTpzZXJ2bGV0LW5hbWVUeXBlIi8+CisgICAgICA8eHNkOmNob2ljZT4KKwk8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmxldC1jbGFzcyIKKwkJICAgICB0eXBlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgorCSAgPHhzZDphbm5vdGF0aW9uPgorCSAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgICAgICBUaGUgc2VydmxldC1jbGFzcyBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseQorCSAgICAgIHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBzZXJ2bGV0LgorCisJICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisJICA8L3hzZDphbm5vdGF0aW9uPgorCTwveHNkOmVsZW1lbnQ+CisKKwk8eHNkOmVsZW1lbnQgbmFtZT0ianNwLWZpbGUiCisJCSAgICAgdHlwZT0iajJlZTpqc3AtZmlsZVR5cGUiLz4KKworICAgICAgPC94c2Q6Y2hvaWNlPgorCisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5pdC1wYXJhbSIKKwkJICAgdHlwZT0iajJlZTpwYXJhbS12YWx1ZVR5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2FkLW9uLXN0YXJ0dXAiCisJCSAgIHR5cGU9ImoyZWU6eHNkSW50ZWdlclR5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCI+CisJPHhzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICAgIFRoZSBsb2FkLW9uLXN0YXJ0dXAgZWxlbWVudCBpbmRpY2F0ZXMgdGhhdCB0aGlzCisJICAgIHNlcnZsZXQgc2hvdWxkIGJlIGxvYWRlZCAoaW5zdGFudGlhdGVkIGFuZCBoYXZlCisJICAgIGl0cyBpbml0KCkgY2FsbGVkKSBvbiB0aGUgc3RhcnR1cCBvZiB0aGUgd2ViCisJICAgIGFwcGxpY2F0aW9uLiBUaGUgb3B0aW9uYWwgY29udGVudHMgb2YgdGhlc2UKKwkgICAgZWxlbWVudCBtdXN0IGJlIGFuIGludGVnZXIgaW5kaWNhdGluZyB0aGUgb3JkZXIgaW4KKwkgICAgd2hpY2ggdGhlIHNlcnZsZXQgc2hvdWxkIGJlIGxvYWRlZC4gSWYgdGhlIHZhbHVlCisJICAgIGlzIGEgbmVnYXRpdmUgaW50ZWdlciwgb3IgdGhlIGVsZW1lbnQgaXMgbm90CisJICAgIHByZXNlbnQsIHRoZSBjb250YWluZXIgaXMgZnJlZSB0byBsb2FkIHRoZSBzZXJ2bGV0CisJICAgIHdoZW5ldmVyIGl0IGNob29zZXMuIElmIHRoZSB2YWx1ZSBpcyBhIHBvc2l0aXZlCisJICAgIGludGVnZXIgb3IgMCwgdGhlIGNvbnRhaW5lciBtdXN0IGxvYWQgYW5kCisJICAgIGluaXRpYWxpemUgdGhlIHNlcnZsZXQgYXMgdGhlIGFwcGxpY2F0aW9uIGlzCisJICAgIGRlcGxveWVkLiBUaGUgY29udGFpbmVyIG11c3QgZ3VhcmFudGVlIHRoYXQKKwkgICAgc2VydmxldHMgbWFya2VkIHdpdGggbG93ZXIgaW50ZWdlcnMgYXJlIGxvYWRlZAorCSAgICBiZWZvcmUgc2VydmxldHMgbWFya2VkIHdpdGggaGlnaGVyIGludGVnZXJzLiBUaGUKKwkgICAgY29udGFpbmVyIG1heSBjaG9vc2UgdGhlIG9yZGVyIG9mIGxvYWRpbmcgb2YKKwkgICAgc2VydmxldHMgd2l0aCB0aGUgc2FtZSBsb2FkLW9uLXN0YXJ0LXVwIHZhbHVlLgorCisJICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCTwveHNkOmFubm90YXRpb24+CisgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJ1bi1hcyIKKwkJICAgdHlwZT0iajJlZTpydW4tYXNUeXBlIgorCQkgICBtaW5PY2N1cnM9IjAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWN1cml0eS1yb2xlLXJlZiIKKwkJICAgdHlwZT0iajJlZTpzZWN1cml0eS1yb2xlLXJlZlR5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXNzaW9uLWNvbmZpZ1R5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCVRoZSBzZXNzaW9uLWNvbmZpZ1R5cGUgZGVmaW5lcyB0aGUgc2Vzc2lvbiBwYXJhbWV0ZXJzCisJZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorCisJVXNlZCBpbjogd2ViLWFwcAorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisKKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlc3Npb24tdGltZW91dCIKKwkJICAgdHlwZT0iajJlZTp4c2RJbnRlZ2VyVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIj4KKwk8eHNkOmFubm90YXRpb24+CisJICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgICAgVGhlIHNlc3Npb24tdGltZW91dCBlbGVtZW50IGRlZmluZXMgdGhlIGRlZmF1bHQKKwkgICAgc2Vzc2lvbiB0aW1lb3V0IGludGVydmFsIGZvciBhbGwgc2Vzc2lvbnMgY3JlYXRlZAorCSAgICBpbiB0aGlzIHdlYiBhcHBsaWNhdGlvbi4gVGhlIHNwZWNpZmllZCB0aW1lb3V0CisJICAgIG11c3QgYmUgZXhwcmVzc2VkIGluIGEgd2hvbGUgbnVtYmVyIG9mIG1pbnV0ZXMuCisJICAgIElmIHRoZSB0aW1lb3V0IGlzIDAgb3IgbGVzcywgdGhlIGNvbnRhaW5lciBlbnN1cmVzCisJICAgIHRoZSBkZWZhdWx0IGJlaGF2aW91ciBvZiBzZXNzaW9ucyBpcyBuZXZlciB0byB0aW1lCisJICAgIG91dC4gSWYgdGhpcyBlbGVtZW50IGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBjb250YWluZXIKKwkgICAgbXVzdCBzZXQgaXRzIGRlZmF1bHQgdGltZW91dCBwZXJpb2QuCisKKwkgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHJhbnNwb3J0LWd1YXJhbnRlZVR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCVRoZSB0cmFuc3BvcnQtZ3VhcmFudGVlVHlwZSBzcGVjaWZpZXMgdGhhdCB0aGUgY29tbXVuaWNhdGlvbgorCWJldHdlZW4gY2xpZW50IGFuZCBzZXJ2ZXIgc2hvdWxkIGJlIE5PTkUsIElOVEVHUkFMLCBvcgorCUNPTkZJREVOVElBTC4gTk9ORSBtZWFucyB0aGF0IHRoZSBhcHBsaWNhdGlvbiBkb2VzIG5vdAorCXJlcXVpcmUgYW55IHRyYW5zcG9ydCBndWFyYW50ZWVzLiBBIHZhbHVlIG9mIElOVEVHUkFMIG1lYW5zCisJdGhhdCB0aGUgYXBwbGljYXRpb24gcmVxdWlyZXMgdGhhdCB0aGUgZGF0YSBzZW50IGJldHdlZW4gdGhlCisJY2xpZW50IGFuZCBzZXJ2ZXIgYmUgc2VudCBpbiBzdWNoIGEgd2F5IHRoYXQgaXQgY2FuJ3QgYmUKKwljaGFuZ2VkIGluIHRyYW5zaXQuIENPTkZJREVOVElBTCBtZWFucyB0aGF0IHRoZSBhcHBsaWNhdGlvbgorCXJlcXVpcmVzIHRoYXQgdGhlIGRhdGEgYmUgdHJhbnNtaXR0ZWQgaW4gYSBmYXNoaW9uIHRoYXQKKwlwcmV2ZW50cyBvdGhlciBlbnRpdGllcyBmcm9tIG9ic2VydmluZyB0aGUgY29udGVudHMgb2YgdGhlCisJdHJhbnNtaXNzaW9uLiBJbiBtb3N0IGNhc2VzLCB0aGUgcHJlc2VuY2Ugb2YgdGhlIElOVEVHUkFMIG9yCisJQ09ORklERU5USUFMIGZsYWcgd2lsbCBpbmRpY2F0ZSB0aGF0IHRoZSB1c2Ugb2YgU1NMIGlzCisJcmVxdWlyZWQuCisKKwlVc2VkIGluOiB1c2VyLWRhdGEtY29uc3RyYWludAorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisKKyAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+CisgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KKwk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOT05FIi8+CisJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU5URUdSQUwiLz4KKwk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDT05GSURFTlRJQUwiLz4KKyAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ1c2VyLWRhdGEtY29uc3RyYWludFR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCVRoZSB1c2VyLWRhdGEtY29uc3RyYWludFR5cGUgaXMgdXNlZCB0byBpbmRpY2F0ZSBob3cKKwlkYXRhIGNvbW11bmljYXRlZCBiZXR3ZWVuIHRoZSBjbGllbnQgYW5kIGNvbnRhaW5lciBzaG91bGQgYmUKKwlwcm90ZWN0ZWQuCisKKwlVc2VkIGluOiBzZWN1cml0eS1jb25zdHJhaW50CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKworICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCisJCSAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgorCQkgICBtaW5PY2N1cnM9IjAiCisJCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHJhbnNwb3J0LWd1YXJhbnRlZSIKKwkJICAgdHlwZT0iajJlZTp0cmFuc3BvcnQtZ3VhcmFudGVlVHlwZSIvPgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Indhci1wYXRoVHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJVGhlIGVsZW1lbnRzIHRoYXQgdXNlIHRoaXMgdHlwZSBkZXNpZ25hdGUgYSBwYXRoIHN0YXJ0aW5nCisJd2l0aCBhICIvIiBhbmQgaW50ZXJwcmV0ZWQgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgYSBXQVIKKwlmaWxlLgorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzaW1wbGVDb250ZW50PgorICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+CisJPHhzZDpwYXR0ZXJuIHZhbHVlPSIvLioiLz4KKyAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IndlYi1hcHAtdmVyc2lvblR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCVRoaXMgdHlwZSBjb250YWlucyB0aGUgcmVjb2duaXplZCB2ZXJzaW9ucyBvZgorCXdlYi1hcHBsaWNhdGlvbiBzdXBwb3J0ZWQuIEl0IGlzIHVzZWQgdG8gZGVzaWduYXRlIHRoZQorCXZlcnNpb24gb2YgdGhlIHdlYiBhcHBsaWNhdGlvbi4KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KKyAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjIuNCIvPgorICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICA8L3hzZDpzaW1wbGVUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWItYXBwVHlwZSI+CisKKyAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKyAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqMmVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXN0cmlidXRhYmxlIgorCQkgICB0eXBlPSJqMmVlOmVtcHR5VHlwZSIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnRleHQtcGFyYW0iCisJCSAgIHR5cGU9ImoyZWU6cGFyYW0tdmFsdWVUeXBlIj4KKworCTx4c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgICBUaGUgY29udGV4dC1wYXJhbSBlbGVtZW50IGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbgorCSAgICBvZiBhIHdlYiBhcHBsaWNhdGlvbidzIHNlcnZsZXQgY29udGV4dAorCSAgICBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzLgorCisJICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCTwveHNkOmFubm90YXRpb24+CisgICAgICA8L3hzZDplbGVtZW50PgorCisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmlsdGVyIgorCQkgICB0eXBlPSJqMmVlOmZpbHRlclR5cGUiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWx0ZXItbWFwcGluZyIKKwkJICAgdHlwZT0iajJlZTpmaWx0ZXItbWFwcGluZ1R5cGUiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsaXN0ZW5lciIKKwkJICAgdHlwZT0iajJlZTpsaXN0ZW5lclR5cGUiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2bGV0IgorCQkgICB0eXBlPSJqMmVlOnNlcnZsZXRUeXBlIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmxldC1tYXBwaW5nIgorCQkgICB0eXBlPSJqMmVlOnNlcnZsZXQtbWFwcGluZ1R5cGUiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXNzaW9uLWNvbmZpZyIKKwkJICAgdHlwZT0iajJlZTpzZXNzaW9uLWNvbmZpZ1R5cGUiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtaW1lLW1hcHBpbmciCisJCSAgIHR5cGU9ImoyZWU6bWltZS1tYXBwaW5nVHlwZSIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndlbGNvbWUtZmlsZS1saXN0IgorCQkgICB0eXBlPSJqMmVlOndlbGNvbWUtZmlsZS1saXN0VHlwZSIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVycm9yLXBhZ2UiCisJCSAgIHR5cGU9ImoyZWU6ZXJyb3ItcGFnZVR5cGUiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqc3AtY29uZmlnIgorCQkgICB0eXBlPSJqMmVlOmpzcC1jb25maWdUeXBlIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VjdXJpdHktY29uc3RyYWludCIKKwkJICAgdHlwZT0iajJlZTpzZWN1cml0eS1jb25zdHJhaW50VHlwZSIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvZ2luLWNvbmZpZyIKKwkJICAgdHlwZT0iajJlZTpsb2dpbi1jb25maWdUeXBlIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VjdXJpdHktcm9sZSIKKwkJICAgdHlwZT0iajJlZTpzZWN1cml0eS1yb2xlVHlwZSIvPgorICAgICAgPHhzZDpncm91cCByZWY9ImoyZWU6am5kaUVudmlyb25tZW50UmVmc0dyb3VwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbiIKKwkJICAgdHlwZT0iajJlZTptZXNzYWdlLWRlc3RpbmF0aW9uVHlwZSIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvY2FsZS1lbmNvZGluZy1tYXBwaW5nLWxpc3QiCisJCSAgIHR5cGU9ImoyZWU6bG9jYWxlLWVuY29kaW5nLW1hcHBpbmctbGlzdFR5cGUiLz4KKyAgICA8L3hzZDpjaG9pY2U+CisKKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIgorCQkgICB0eXBlPSJqMmVlOndlYi1hcHAtdmVyc2lvblR5cGUiCisJCSAgIHVzZT0icmVxdWlyZWQiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWItcmVzb3VyY2UtY29sbGVjdGlvblR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCVRoZSB3ZWItcmVzb3VyY2UtY29sbGVjdGlvblR5cGUgaXMgdXNlZCB0byBpZGVudGlmeSBhIHN1YnNldAorCW9mIHRoZSByZXNvdXJjZXMgYW5kIEhUVFAgbWV0aG9kcyBvbiB0aG9zZSByZXNvdXJjZXMgd2l0aGluCisJYSB3ZWIgYXBwbGljYXRpb24gdG8gd2hpY2ggYSBzZWN1cml0eSBjb25zdHJhaW50IGFwcGxpZXMuIElmCisJbm8gSFRUUCBtZXRob2RzIGFyZSBzcGVjaWZpZWQsIHRoZW4gdGhlIHNlY3VyaXR5IGNvbnN0cmFpbnQKKwlhcHBsaWVzIHRvIGFsbCBIVFRQIG1ldGhvZHMuCisKKwlVc2VkIGluOiBzZWN1cml0eS1jb25zdHJhaW50CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKworICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0id2ViLXJlc291cmNlLW5hbWUiCisJCSAgIHR5cGU9ImoyZWU6c3RyaW5nIj4KKwk8eHNkOmFubm90YXRpb24+CisJICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgICAgVGhlIHdlYi1yZXNvdXJjZS1uYW1lIGNvbnRhaW5zIHRoZSBuYW1lIG9mIHRoaXMgd2ViCisJICAgIHJlc291cmNlIGNvbGxlY3Rpb24uCisKKwkgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCisJCSAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgorCQkgICBtaW5PY2N1cnM9IjAiCisJCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idXJsLXBhdHRlcm4iCisJCSAgIHR5cGU9ImoyZWU6dXJsLXBhdHRlcm5UeXBlIgorCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imh0dHAtbWV0aG9kIgorCQkgICB0eXBlPSJqMmVlOmh0dHAtbWV0aG9kVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlbGNvbWUtZmlsZS1saXN0VHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJVGhlIHdlbGNvbWUtZmlsZS1saXN0IGNvbnRhaW5zIGFuIG9yZGVyZWQgbGlzdCBvZiB3ZWxjb21lCisJZmlsZXMgZWxlbWVudHMuCisKKwlVc2VkIGluOiB3ZWItYXBwCisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKworICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0id2VsY29tZS1maWxlIgorCQkgICB0eXBlPSJ4c2Q6c3RyaW5nIgorCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisJPHhzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICAgIFRoZSB3ZWxjb21lLWZpbGUgZWxlbWVudCBjb250YWlucyBmaWxlIG5hbWUgdG8gdXNlCisJICAgIGFzIGEgZGVmYXVsdCB3ZWxjb21lIGZpbGUsIHN1Y2ggYXMgaW5kZXguaHRtbAorCisJICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCTwveHNkOmFubm90YXRpb24+CisgICAgICA8L3hzZDplbGVtZW50PgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwveHNkOnNjaGVtYT4KKwpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2R0ZC93ZWItanNwdGFnbGlicmFyeV8xXzEuZHRkIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2R0ZC93ZWItanNwdGFnbGlicmFyeV8xXzEuZHRkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhNWZjN2EKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvZHRkL3dlYi1qc3B0YWdsaWJyYXJ5XzFfMS5kdGQKQEAgLTAsMCArMSwyMDYgQEAKKzwhLS0KKyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzwhLS0KKworICAgVGhpcyBpcyB0aGUgRFREIGRlZmluaW5nIHRoZSBKYXZhU2VydmVyIFBhZ2VzIDEuMSBUYWcgTGlicmFyeQorICAgZGVzY3JpcHRvciAoLnRsZCkgKFhNTCkgZmlsZSBmb3JtYXQvc3ludGF4LgorCisgICBBIFRhZyBMaWJyYXJ5IGlzIGEgSkFSIGZpbGUgY29udGFpbmluZyBhIHZhbGlkIGluc3RhbmNlIG9mIGEgVGFnIExpYnJhcnkKKyAgIERlc2NyaXB0b3IgKHRhZ2xpYi50bGQpIGZpbGUgaW4gdGhlIE1FVEEtSU5GIHN1YmRpcmVjdG9yeSwgYWxvbmcgd2l0aCB0aGUKKyAgIGFwcHJvcHJpYXRlIGltcGxlbWVudGluZyBjbGFzc2VzLCBhbmQgb3RoZXIgcmVzb3VyY2VzIHJlcXVpcmVkIHRvCisgICBpbXBsZW1lbnQgdGhlIHRhZ3MgZGVmaW5lZCB0aGVyZWluLgorCisgICBVc2UgaXMgc3ViamVjdCB0byBsaWNlbnNlIHRlcm1zLgorICAtLT4KKworPCEtLQorVGhlIHRhZ2xpYiB0YWcgaXMgdGhlIGRvY3VtZW50IHJvb3QsIGl0IGRlZmluZXM6CisKK3RsaWJ2ZXJzaW9uCXRoZSB2ZXJzaW9uIG9mIHRoZSB0YWcgbGlicmFyeSBpbXBsZW1lbnRhdGlvbgoranNwdmVyc2lvbgl0aGUgdmVyc2lvbiBvZiBKU1AgdGhlIHRhZyBsaWJyYXJ5IGRlcGVuZHMgdXBvbgorCitzaG9ydG5hbWUJYSBzaW1wbGUgZGVmYXVsdCBzaG9ydCBuYW1lIHRoYXQgY291bGQgYmUgdXNlZCBieQorCQlhIEpTUCBhdXRob3JpbmcgdG9vbCB0byBjcmVhdGUgbmFtZXMgd2l0aCBhIG1uZW1vbmljCisJCXZhbHVlOyBmb3IgZXhhbXBsZSwgdGhlIGl0IG1heSBiZSB1c2VkIGFzIHRoZSBwcmVmZXJlZAorCQlwcmVmaXggdmFsdWUgaW4gdGFnbGliIGRpcmVjdGl2ZXMKK3VyaQkJYSB1cmkgdW5pcXVlbHkgaWRlbnRpZnlpbmcgdGhpcyB0YWdsaWIKK2luZm8JCWEgc2ltcGxlIHN0cmluZyBkZXNjcmliaW5nIHRoZSAidXNlIiBvZiB0aGlzIHRhZ2xpYiwKKwkJc2hvdWxkIGJlIHVzZXIgZGlzY2VybmFibGUKKy0tPgorCis8IUVMRU1FTlQgdGFnbGliICh0bGlidmVyc2lvbiwganNwdmVyc2lvbj8sIHNob3J0bmFtZSwgdXJpPywgaW5mbz8sIHRhZyspID4KKzwhQVRUTElTVCB0YWdsaWIgaWQgSUQgI0lNUExJRUQKKwkgIHhtbG5zIENEQVRBICNGSVhFRAorCQkiaHR0cDovL2phdmEuc3VuLmNvbS9qMmVlL2R0ZHMvd2ViLWpzcHRhZ2xpYnJhcnlfMV8xLmR0ZCIKKz4KKworPCEtLQorRGVzY3JpYmVzIHRoaXMgdmVyc2lvbiAobnVtYmVyKSBvZiB0aGUgdGFnbGlicmFyeSAoZGV3ZXkgZGVjaW1hbCkKKworI1BDREFUQSA6Oj0gWzAtOV0qeyAiLiJbMC05XSB9MC4uMworLS0+CisKKzwhRUxFTUVOVCB0bGlidmVyc2lvbiAoI1BDREFUQSkgPgorCis8IS0tCitEZXNjcmliZXMgdGhlIEpTUCB2ZXJzaW9uIChudW1iZXIpIHRoaXMgdGFnbGlicmFyeSByZXF1aXJlcyBpbgorb3JkZXIgdG8gZnVuY3Rpb24gKGRld2V5IGRlY2ltYWwpCisKK1RoZSBkZWZhdWx0IGlzIDEuMQorCisjUENEQVRBIDo6PSBbMC05XSp7ICIuIlswLTldIH0wLi4zCistLT4KKworPCFFTEVNRU5UIGpzcHZlcnNpb24gICgjUENEQVRBKSA+CisKKzwhLS0KK0RlZmluZXMgYSBzaG9ydCAoZGVmYXVsdCkgc2hvcnRuYW1lIHRvIGJlIHVzZWQgZm9yIHRhZ3MgYW5kCit2YXJpYWJsZSBuYW1lcyB1c2VkL2NyZWF0ZWQgYnkgdGhpcyB0YWcgbGlicmFyeS4gIERvIG5vdCB1c2UKK3doaXRlIHNwYWNlLCBhbmQgZG8gbm90IHN0YXJ0IHdpdGggZGlnaXRzIG9yIHVuZGVyc2NvcmUuCisKKyNQQ0RBVEEgOjo9IE5NVE9LRU4KKy0tPgorCis8IUVMRU1FTlQgc2hvcnRuYW1lICAgICAgKCNQQ0RBVEEpID4KKworPCEtLQorRGVmaW5lcyBhIHB1YmxpYyBVUkkgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIHRoaXMgdmVyc2lvbiBvZgordGhlIHRhZ2xpYnJhcnkgTGVhdmUgaXQgZW1wdHkgaWYgaXQgZG9lcyBub3QgYXBwbHkuCistLT4KKworPCFFTEVNRU5UIHVyaQkgKCNQQ0RBVEEpID4KKworPCEtLQorRGVmaW5lcyBhbiBhcmJpdHJhcnkgdGV4dCBzdHJpbmcgZGVzY2lyYmluZyB0aGUgdGFnIGxpYnJhcnkKKy0tPgorCis8IUVMRU1FTlQgaW5mbwkoI1BDREFUQSkgPgorCis8IS0tCitUaGUgdGFnIGRlZmluZXMgYSB1bmlxdWUgdGFnIGluIHRoaXMgdGFnIGxpYnJhcnksIGRlZmluaW5nOgorCistIHRoZSB1bmlxdWUgdGFnL2VsZW1lbnQgbmFtZQorLSB0aGUgc3ViY2xhc3Mgb2YgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZyBpbXBsZW1lbnRhdGlvbiBjbGFzcworLSBhbiBvcHRpb25hbCBzdWJjbGFzcyBvZiBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnRXh0cmFJbmZvCistIHRoZSBib2R5IGNvbnRlbnQgdHlwZSAoaGludCkKKy0gb3B0aW9uYWwgdGFnLXNwZWNpZmljIGluZm9ybWF0aW9uCistIGFueSBhdHRyaWJ1dGVzCistLT4KKworPCFFTEVNRU5UIHRhZyAobmFtZSwgdGFnY2xhc3MsIHRlaWNsYXNzPywgYm9keWNvbnRlbnQ/LCBpbmZvPywgYXR0cmlidXRlKikgPgorCis8IS0tCitEZWZpbmVzIHRoZSBzdWJjbGFzcyBvZiBqYXZheC5zZXJsdmV0LmpzcC50YWdleHQuVGFnIHRoYXQgaW1wbGVtZW50cwordGhlIHJlcXVlc3QgdGltZSBzZW1hbnRpY3MgZm9yIHRoaXMgdGFnLiAocmVxdWlyZWQpCisKKyNQQ0RBVEEgOjo9IGZ1bGx5IHF1YWxpZmllZCBKYXZhIGNsYXNzIG5hbWUKKy0tPgorCis8IUVMRU1FTlQgdGFnY2xhc3MgKCNQQ0RBVEEpID4KKworPCEtLQorRGVmaW5lcyB0aGUgc3ViY2xhc3Mgb2YgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZ0V4dHJhSW5mbyBmb3IKK3RoaXMgdGFnLiAob3B0aW9uYWwpCisKK0lmIHRoaXMgaXMgbm90IGdpdmVuLCB0aGUgY2xhc3MgaXMgbm90IGNvbnN1bHRlZCBhdCB0cmFuc2xhdGlvbiB0aW1lLgorCisjUENEQVRBIDo6PSBmdWxseSBxdWFsaWZpZWQgSmF2YSBjbGFzcyBuYW1lCistLT4KKworPCFFTEVNRU5UIHRlaWNsYXNzICgjUENEQVRBKSA+CisKKzwhLS0KK1Byb3ZpZGVzIGEgaGludCBhcyB0byB0aGUgY29udGVudCBvZiB0aGUgYm9keSBvZiB0aGlzIHRhZy4gUHJpbWFyaWx5CitpbnRlbmRlZCBmb3IgdXNlIGJ5IHBhZ2UgY29tcG9zaXRpb24gdG9vbHMuCisKK1RoZXJlIGFyZSBjdXJyZW50bHkgdGhyZWUgdmFsdWVzIHNwZWNpZmllZDoKKwordGFnZGVwZW5kZW50CVRoZSBib2R5IG9mIHRoZSB0YWcgaXMgaW50ZXJwcmV0ZWQgYnkgdGhlIHRhZworCQlpbXBsZW1lbnRhdGlvbiBpdHNlbGYsIGFuZCBpcyBtb3N0IGxpa2VseSBpbiBhCisJCWRpZmZlcmVudCAibGFuZ2FnZSIsIGUuZyBlbWJlZGRlZCBTUUwgc3RhdGVtZW50cy4KKworSlNQCQlUaGUgYm9keSBvZiB0aGUgdGFnIGNvbnRhaW5zIG5lc3RlZCBKU1Agc3ludGF4CisKK2VtcHR5CQlUaGUgYm9keSBtdXN0IGJlIGVtcHR5CisKK1RoZSBkZWZhdWx0IChpZiBub3QgZGVmaW5lZCkgaXMgSlNQCisKKyNQQ0RBVEEgOjo9ICB0YWdkZXBlbmRlbnQgfCBKU1AgfCBlbXB0eQorCistLT4KKworPCFFTEVNRU5UIGJvZHljb250ZW50ICgjUENEQVRBKSA+CisKKzwhLS0KK1RoZSBhdHRyaWJ1dGUgdGFnIGRlZmluZXMgYW4gYXR0cmlidXRlIGZvciB0aGUgbmVzdGluZyB0YWcKKworQW4gYXR0cmlidXRlIGRlZmluaXRpb24gaXMgY29tcG9zZWQgb2Y6CisKKy0gdGhlIGF0dHJpYnV0ZXMgbmFtZSAocmVxdWlyZWQpCistIGlmIHRoZSBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQgb3Igb3B0aW9uYWwgKG9wdGlvbmFsKQorLSBpZiB0aGUgYXR0cmlidXRlcyB2YWx1ZSBtYXkgYmUgZHluYW1pY2FsbHkgY2FsY3VsYXRlZCBhdCBydW50aW1lCisgIGJ5IGEgc2NyaXB0bGV0IGV4cHJlc3Npb24gKG9wdGlvbmFsKQorCistLT4KKworPCFFTEVNRU5UIGF0dHJpYnV0ZSAobmFtZSwgcmVxdWlyZWQ/ICwgcnRleHBydmFsdWU/KSA+CisKKzwhLS0KK0RlZmluZXMgdGhlIGNhbm9uaWNhbCBuYW1lIG9mIGEgdGFnIG9yIGF0dHJpYnV0ZSBiZWluZyBkZWZpbmVkCisKKyNQQ0RBVEEgOjo9IE5NVE9LRU4KKy0tPgorCis8IUVMRU1FTlQgbmFtZQkoI1BDREFUQSkgPgorCis8IS0tCitEZWZpbmVzIGlmIHRoZSBuZXN0aW5nIGF0dHJpYnV0ZSBpcyByZXF1aXJlZCBvciBvcHRpb25hbC4KKworI1BDREFUQSA6Oj0gdHJ1ZSB8IGZhbHNlIHwgeWVzIHwgbm8KKworSWYgbm90IHByZXNlbnQgdGhlbiB0aGUgZGVmYXVsdCBpcyAiZmFsc2UiLCBpLmUgdGhlIGF0dHJpYnV0ZQoraXMgb3B0aW9uYWwuCistLT4KKworPCFFTEVNRU5UIHJlcXVpcmVkICAgICgjUENEQVRBKSA+CisKKzwhLS0KK0RlZmluZXMgaWYgdGhlIG5lc3RpbmcgYXR0cmlidXRlIGNhbiBoYXZlIHNjcmlwdGxldCBleHByZXNzaW9ucyBhcworYSB2YWx1ZSwgaS5lIHRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlIG1heSBiZSBkeW5hbWljYWxseSBjYWxjdWxhdGVkCithdCByZXF1ZXN0IHRpbWUsIGFzIG9wcG9zZWQgdG8gYSBzdGF0aWMgdmFsdWUgZGV0ZXJtaW5lZCBhdCB0cmFuc2xhdGlvbgordGltZS4KKworI1BDREFUQSA6Oj0gdHJ1ZSB8IGZhbHNlIHwgeWVzIHwgbm8KKworSWYgbm90IHByZXNlbnQgdGhlbiB0aGUgZGVmYXVsdCBpcyAiZmFsc2UiLCBpLmUgdGhlIGF0dHJpYnV0ZQoraGFzIGEgc3RhdGljIHZhbHVlCistLT4KKworPCFFTEVNRU5UIHJ0ZXhwcnZhbHVlICgjUENEQVRBKSA+CisKKzwhQVRUTElTVCB0bGlidmVyc2lvbiBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBqc3B2ZXJzaW9uIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIHNob3J0bmFtZSBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCB1cmkgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgaW5mbyBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCB0YWcgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgdGFnY2xhc3MgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgdGVpY2xhc3MgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgYm9keWNvbnRlbnQgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgYXR0cmlidXRlIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIG5hbWUgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgcmVxdWlyZWQgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgcnRleHBydmFsdWUgaWQgSUQgI0lNUExJRUQ+CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvZHRkL3dlYi1qc3B0YWdsaWJyYXJ5XzFfMi5kdGQgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvZHRkL3dlYi1qc3B0YWdsaWJyYXJ5XzFfMi5kdGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDExNjViMgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9kdGQvd2ViLWpzcHRhZ2xpYnJhcnlfMV8yLmR0ZApAQCAtMCwwICsxLDQ3NyBAQAorPCEtLQorICBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKworICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPCEtLQorCisgICBUaGlzIGlzIHRoZSBEVEQgZGVmaW5pbmcgdGhlIEphdmFTZXJ2ZXIgUGFnZXMgMS4yIFRhZyBMaWJyYXJ5CisgICBkZXNjcmlwdG9yICgudGxkKSAoWE1MKSBmaWxlIGZvcm1hdC9zeW50YXguCisKKyAgIEEgVGFnIExpYnJhcnkgaXMgYSBKQVIgZmlsZSBjb250YWluaW5nIGEgdmFsaWQgaW5zdGFuY2Ugb2YgYSBUYWcgTGlicmFyeQorICAgRGVzY3JpcHRvciAodGFnbGliLnRsZCkgZmlsZSBpbiB0aGUgTUVUQS1JTkYgc3ViZGlyZWN0b3J5LCBhbG9uZyB3aXRoIHRoZQorICAgYXBwcm9wcmlhdGUgaW1wbGVtZW50aW5nIGNsYXNzZXMsIGFuZCBvdGhlciByZXNvdXJjZXMgcmVxdWlyZWQgdG8KKyAgIGltcGxlbWVudCB0aGUgdGFncyBkZWZpbmVkIHRoZXJlaW4uCisKKyAgIFVzZSBpcyBzdWJqZWN0IHRvIGxpY2Vuc2UgdGVybXMuCisgIC0tPgorCis8IU5PVEFUSU9OIFdFQi1KU1BUQUdMSUIuMV8yIFBVQkxJQworICAgICAgICAgICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgSlNQIFRhZyBMaWJyYXJ5IDEuMi8vRU4iPgorCis8IS0tCitUaGlzIGlzIHRoZSBYTUwgRFREIGZvciB0aGUgSlNQIDEuMiBUYWcgTGlicmFyeSBEZXNjcmlwdG9yLgorQWxsIEpTUCAxLjIgdGFnIGxpYnJhcnkgZGVzY3JpcHRvcnMgbXVzdCBpbmNsdWRlIGEgRE9DVFlQRQorb2YgdGhlIGZvbGxvd2luZyBmb3JtOgorCisgIDwhRE9DVFlQRSB0YWdsaWIKKyAgICAgICAgUFVCTElDICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgSlNQIFRhZyBMaWJyYXJ5IDEuMi8vRU4iCisJImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL3dlYi1qc3B0YWdsaWJyYXJ5XzFfMi5kdGQiPgorCistLT4KKworPCEtLQorVGhlIHRhZ2xpYiB0YWcgaXMgdGhlIGRvY3VtZW50IHJvb3QsIGl0IGRlZmluZXM6CisKK3RsaWItdmVyc2lvbgl0aGUgdmVyc2lvbiBvZiB0aGUgdGFnIGxpYnJhcnkgaW1wbGVtZW50YXRpb24KKworanNwLXZlcnNpb24JdGhlIHZlcnNpb24gb2YgSlNQIHRoZSB0YWcgbGlicmFyeSBkZXBlbmRzIHVwb24KKworc2hvcnQtbmFtZQlhIHNpbXBsZSBkZWZhdWx0IHNob3J0IG5hbWUgdGhhdCBjb3VsZCBiZSB1c2VkIGJ5CisJCWEgSlNQIGF1dGhvcmluZyB0b29sIHRvIGNyZWF0ZSBuYW1lcyB3aXRoIGEgbW5lbW9uaWMKKwkJdmFsdWU7IGZvciBleGFtcGxlLCB0aGUgaXQgbWF5IGJlIHVzZWQgYXMgdGhlIHByZWZlcmVkCisJCXByZWZpeCB2YWx1ZSBpbiB0YWdsaWIgZGlyZWN0aXZlcworCit1cmkJCWEgdXJpIHVuaXF1ZWx5IGlkZW50aWZ5aW5nIHRoaXMgdGFnbGliCisKK2Rpc3BsYXktbmFtZSAgICB0aGUgZGlzcGxheS1uYW1lIGVsZW1lbnQgY29udGFpbnMgYSBzaG9ydCBuYW1lIHRoYXQKKyAgICAgICAgICAgICAgICBpcyBpbnRlbmRlZCB0byBiZSBkaXNwbGF5ZWQgYnkgdG9vbHMKK3NtYWxsLWljb24gICAgICBvcHRpb25hbCBzbWFsbC1pY29uIHRoYXQgY2FuIGJlIHVzZWQgYnkgdG9vbHMKKworbGFyZ2UtaWNvbiAgICAgIG9wdGlvbmFsIGxhcmdlLWljb24gdGhhdCBjYW4gYmUgdXNlZCBieSB0b29scworCitkZXNjcmlwdGlvbglhIHNpbXBsZSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgInVzZSIgb2YgdGhpcyB0YWdsaWIsCisJCXNob3VsZCBiZSB1c2VyIGRpc2Nlcm5hYmxlCisKK3ZhbGlkYXRvciAgICAgICBvcHRpb25hbCBUYWdMaWJyYXJ5VmFsaWRhdG9yIGluZm9ybWF0aW9uCisKK2xpc3RlbmVyICAgICAgICBvcHRpb25hbCBldmVudCBsaXN0ZW5lciBzcGVjaWZpY2F0aW9uCisKKworLS0+CisKKzwhRUxFTUVOVCB0YWdsaWIgKHRsaWItdmVyc2lvbiwganNwLXZlcnNpb24sIHNob3J0LW5hbWUsIHVyaT8sCisgICAgICAgICAgICAgICAgICBkaXNwbGF5LW5hbWU/LCBzbWFsbC1pY29uPywgbGFyZ2UtaWNvbj8sIGRlc2NyaXB0aW9uPywKKyAgICAgICAgICAgICAgICAgIHZhbGlkYXRvcj8sIGxpc3RlbmVyKiwgdGFnKykgPgorCis8IUFUVExJU1QgdGFnbGliIGlkIElEICNJTVBMSUVECisJICB4bWxucyBDREFUQSAjRklYRUQKKwkJImh0dHA6Ly9qYXZhLnN1bi5jb20vSlNQL1RhZ0xpYnJhcnlEZXNjcmlwdG9yIgorPgorCis8IS0tCitEZXNjcmliZXMgdGhpcyB2ZXJzaW9uIChudW1iZXIpIG9mIHRoZSB0YWdsaWJyYXJ5IChkZXdleSBkZWNpbWFsKQorCisjUENEQVRBIDo6PSBbMC05XSp7ICIuIlswLTldIH0wLi4zCistLT4KKworPCFFTEVNRU5UIHRsaWItdmVyc2lvbiAoI1BDREFUQSkgPgorCis8IS0tCitEZXNjcmliZXMgdGhlIEpTUCB2ZXJzaW9uIChudW1iZXIpIHRoaXMgdGFnbGlicmFyeSByZXF1aXJlcyBpbgorb3JkZXIgdG8gZnVuY3Rpb24gKGRld2V5IGRlY2ltYWwpCisKK1RoZSBkZWZhdWx0IGlzIDEuMgorCisjUENEQVRBIDo6PSBbMC05XSp7ICIuIlswLTldIH0wLi4zCistLT4KKworPCFFTEVNRU5UIGpzcC12ZXJzaW9uICAoI1BDREFUQSkgPgorCis8IS0tCitEZWZpbmVzIGEgc2hvcnQgKGRlZmF1bHQpIHNob3J0LW5hbWUgdG8gYmUgdXNlZCBmb3IgdGFncyBhbmQKK3ZhcmlhYmxlIG5hbWVzIHVzZWQvY3JlYXRlZCBieSB0aGlzIHRhZyBsaWJyYXJ5LiAgRG8gbm90IHVzZQord2hpdGUgc3BhY2UsIGFuZCBkbyBub3Qgc3RhcnQgd2l0aCBkaWdpdHMgb3IgdW5kZXJzY29yZS4KKworI1BDREFUQSA6Oj0gTk1UT0tFTgorLS0+CisKKzwhRUxFTUVOVCBzaG9ydC1uYW1lICAgICAgKCNQQ0RBVEEpID4KKworPCEtLQorRGVmaW5lcyBhIHB1YmxpYyBVUkkgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIHRoaXMgdmVyc2lvbiBvZgordGhlIHRhZ2xpYnJhcnkuICBMZWF2ZSBpdCBlbXB0eSBpZiBpdCBkb2VzIG5vdCBhcHBseS4KKy0tPgorCis8IUVMRU1FTlQgdXJpCSAoI1BDREFUQSkgPgorCis8IS0tCitEZWZpbmVzIGFuIGFyYml0cmFyeSB0ZXh0IHN0cmluZyBkZXNjaXJiaW5nIHRoZSB0YWcgbGlicmFyeQorLS0+CisKKzwhRUxFTUVOVCBkZXNjcmlwdGlvbgkoI1BDREFUQSkgPgorCis8IS0tCisKK0RlZmluZXMgYW4gb3B0aW9uYWwgdmFsaWRhdG9yIHRoYXQgY2FuIGJlIHVzZWQgdG8KK3ZhbGlkYXRlIHRoZSBjb25mb3JtYW5jZSBvZiBhIEpTUCBwYWdlIHRvIHVzaW5nIHRoaXMgdGFnIGxpYnJhcnkuCistLT4KKworPCFFTEVNRU5UIHZhbGlkYXRvciAodmFsaWRhdG9yLWNsYXNzLCBpbml0LXBhcmFtKiwgZGVzY3JpcHRpb24/KSA+CisKKworPCEtLQorCitEZWZpbmVzIHRoZSBUYWdMaWJyYXJ5VmFsaWRhdG9yIGNsYXNzIHRoYXQgY2FuIGJlIHVzZWQgdG8KK3ZhbGlkYXRlIHRoZSBjb25mb3JtYW5jZSBvZiBhIEpTUCBwYWdlIHRvIHVzaW5nIHRoaXMgdGFnIGxpYnJhcnkuCistLT4KKworPCFFTEVNRU5UIHZhbGlkYXRvci1jbGFzcyAoI1BDREFUQSkgPgorCisKKzwhLS0KKworVGhlIGluaXQtcGFyYW0gZWxlbWVudCBjb250YWlucyBhIG5hbWUvdmFsdWUgcGFpciBhcyBhbgoraW5pdGlhbGl6YXRpb24gcGFyYW0KKy0tPgorCis8IUVMRU1FTlQgaW5pdC1wYXJhbSAocGFyYW0tbmFtZSwgcGFyYW0tdmFsdWUsIGRlc2NyaXB0aW9uPyk+CisKKzwhLS0KKworVGhlIHBhcmFtLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIHBhcmFtZXRlci4KKy0tPgorCis8IUVMRU1FTlQgcGFyYW0tbmFtZSAoI1BDREFUQSk+CisKKzwhLS0KKworVGhlIHBhcmFtLXZhbHVlIGVsZW1lbnQgY29udGFpbnMgdGhlIHZhbHVlIG9mIGEgcGFyYW1ldGVyLgorLS0+CisKKzwhRUxFTUVOVCBwYXJhbS12YWx1ZSAoI1BDREFUQSk+CisKKworPCEtLQorCitEZWZpbmVzIGFuIG9wdGlvbmFsIGV2ZW50IGxpc3RlbmVyIG9iamVjdCB0byBiZSBpbnN0YW50aWF0ZWQgYW5kCityZWdpc3RlcmVkIGF1dG9tYXRpY2FsbHkuCistLT4KKworPCFFTEVNRU5UIGxpc3RlbmVyIChsaXN0ZW5lci1jbGFzcykgPgorCis8IS0tCisKK1RoZSBsaXN0ZW5lci1jbGFzcyBlbGVtZW50IGRlY2xhcmVzIGEgY2xhc3MgaW4gdGhlIGFwcGxpY2F0aW9uIHRoYXQKK211c3QgYmUgcmVnaXN0ZXJlZCBhcyBhIHdlYiBhcHBsaWNhdGlvbiBsaXN0ZW5lciBiZWFuLiAgU2VlIHRoZQorU2VydmxldCAyLjMgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscy4KKy0tPgorCis8IUVMRU1FTlQgbGlzdGVuZXItY2xhc3MgKCNQQ0RBVEEpID4KKworCis8IS0tCitUaGUgdGFnIGRlZmluZXMgYSB1bmlxdWUgdGFnIGluIHRoaXMgdGFnIGxpYnJhcnkuICBJdCBoYXMgb25lCithdHRyaWJ1dGUsIGlkLgorCitUaGUgdGFnIGVsZW1lbnQgbWF5IGhhdmUgc2V2ZXJhbCBzdWJlbGVtZW50cyBkZWZpbmluZzoKKworbmFtZSAgICAgICAgICAgICAgVGhlIHVuaXF1ZSBhY3Rpb24gbmFtZQorCit0YWctY2xhc3MgICAgICAgICBUaGUgdGFnIGhhbmRsZXIgY2xhc3MgaW1wbGVtZW50aW5nCisgICAgICAgICAgICAgICAgICBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnCisKK3RlaS1jbGFzcyAgICAgICAgIEFuIG9wdGlvbmFsIHN1YmNsYXNzIG9mCisgICAgICAgICAgICAgICAgICBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnRXh0cmFJbmZvCisKK2JvZHktY29udGVudCAgICAgIFRoZSBib2R5IGNvbnRlbnQgdHlwZQorCitkaXNwbGF5LW5hbWUgICAgICBBIHNob3J0IG5hbWUgdGhhdCBpcyBpbnRlbmRlZCB0byBiZSBkaXNwbGF5ZWQKKyAgICAgICAgICAgICAgICAgIGJ5IHRvb2xzCisKK3NtYWxsLWljb24gICAgICAgIE9wdGlvbmFsIHNtYWxsLWljb24gdGhhdCBjYW4gYmUgdXNlZCBieSB0b29scworCitsYXJnZS1pY29uICAgICAgICBPcHRpb25hbCBsYXJnZS1pY29uIHRoYXQgY2FuIGJlIHVzZWQgYnkgdG9vbHMKKworZGVzY3JpcHRpb24gICAgICAgT3B0aW9uYWwgdGFnLXNwZWNpZmljIGluZm9ybWF0aW9uCisKK3ZhcmlhYmxlICAgICAgICAgIE9wdGlvbmFsIHNjcmlwdGluZyB2YXJpYWJsZSBpbmZvcm1hdGlvbgorCithdHRyaWJ1dGUgICAgICAgICBBbGwgYXR0cmlidXRlcyBvZiB0aGlzIGFjdGlvbgorCitleGFtcGxlICAgICAgICAgICBPcHRpb25hbCBpbmZvcm1hbCBkZXNjcmlwdGlvbiBvZiBhbiBleGFtcGxlIG9mIGEKKyAgICAgICAgICAgICAgICAgIHVzZSBvZiB0aGlzIHRhZworCistLT4KKworPCFFTEVNRU5UIHRhZyAobmFtZSwgdGFnLWNsYXNzLCB0ZWktY2xhc3M/LCBib2R5LWNvbnRlbnQ/LCBkaXNwbGF5LW5hbWU/LAorICAgICAgICAgICAgICAgc21hbGwtaWNvbj8sIGxhcmdlLWljb24/LCBkZXNjcmlwdGlvbj8sIHZhcmlhYmxlKiwgYXR0cmlidXRlKiwKKyAgICAgICAgICAgICAgIGV4YW1wbGU/KSA+CisKKzwhLS0KK0RlZmluZXMgdGhlIHN1YmNsYXNzIG9mIGphdmF4LnNlcmx2ZXQuanNwLnRhZ2V4dC5UYWcgdGhhdCBpbXBsZW1lbnRzCit0aGUgcmVxdWVzdCB0aW1lIHNlbWFudGljcyBmb3IgdGhpcyB0YWcuIChyZXF1aXJlZCkKKworI1BDREFUQSA6Oj0gZnVsbHkgcXVhbGlmaWVkIEphdmEgY2xhc3MgbmFtZQorLS0+CisKKzwhRUxFTUVOVCB0YWctY2xhc3MgKCNQQ0RBVEEpID4KKworPCEtLQorRGVmaW5lcyB0aGUgc3ViY2xhc3Mgb2YgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZ0V4dHJhSW5mbyBmb3IKK3RoaXMgdGFnLiAob3B0aW9uYWwpCisKK0lmIHRoaXMgaXMgbm90IGdpdmVuLCB0aGUgY2xhc3MgaXMgbm90IGNvbnN1bHRlZCBhdCB0cmFuc2xhdGlvbiB0aW1lLgorCisjUENEQVRBIDo6PSBmdWxseSBxdWFsaWZpZWQgSmF2YSBjbGFzcyBuYW1lCistLT4KKworPCFFTEVNRU5UIHRlaS1jbGFzcyAoI1BDREFUQSkgPgorCis8IS0tCitQcm92aWRlcyBhIGhpbnQgYXMgdG8gdGhlIGNvbnRlbnQgb2YgdGhlIGJvZHkgb2YgdGhpcyB0YWcuIFByaW1hcmlseQoraW50ZW5kZWQgZm9yIHVzZSBieSBwYWdlIGNvbXBvc2l0aW9uIHRvb2xzLgorCitUaGVyZSBhcmUgY3VycmVudGx5IHRocmVlIHZhbHVlcyBzcGVjaWZpZWQ6CisKK3RhZ2RlcGVuZGVudAlUaGUgYm9keSBvZiB0aGUgdGFnIGlzIGludGVycHJldGVkIGJ5IHRoZSB0YWcKKwkJaW1wbGVtZW50YXRpb24gaXRzZWxmLCBhbmQgaXMgbW9zdCBsaWtlbHkgaW4gYQorCQlkaWZmZXJlbnQgImxhbmdhZ2UiLCBlLmcgZW1iZWRkZWQgU1FMIHN0YXRlbWVudHMuCisKK0pTUAkJVGhlIGJvZHkgb2YgdGhlIHRhZyBjb250YWlucyBuZXN0ZWQgSlNQIHN5bnRheAorCitlbXB0eQkJVGhlIGJvZHkgbXVzdCBiZSBlbXB0eQorCitUaGUgZGVmYXVsdCAoaWYgbm90IGRlZmluZWQpIGlzIEpTUAorCisjUENEQVRBIDo6PSAgdGFnZGVwZW5kZW50IHwgSlNQIHwgZW1wdHkKKworLS0+CisKKzwhRUxFTUVOVCBib2R5LWNvbnRlbnQgKCNQQ0RBVEEpID4KKworPCEtLQorCitUaGUgZGlzcGxheS1uYW1lIGVsZW1lbnQgY29udGFpbnMgYSBzaG9ydCBuYW1lIHRoYXQgaXMgaW50ZW5kZWQKK3RvIGJlIGRpc3BsYXllZCBieSB0b29scy4KKy0tPgorCis8IUVMRU1FTlQgZGlzcGxheS1uYW1lICgjUENEQVRBKSA+CisKKworPCEtLQorCitUaGUgbGFyZ2UtaWNvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgZmlsZSBjb250YWluaW5nIGEgbGFyZ2UKKygzMiB4IDMyKSBpY29uIGltYWdlLiAgVGhlIGZpbGUgbmFtZSBpcyBhIHJlbGF0aXZlIHBhdGggd2l0aGluIHRoZQordGFnIGxpYnJhcnkuICBUaGUgaW1hZ2UgbXVzdCBiZSBlaXRoZXIgaW4gdGhlIEpQRUcgb3IgR0lGIGZvcm1hdCwgYW5kCit0aGUgZmlsZSBuYW1lIG11c3QgZW5kIHdpdGggdGhlIHN1ZmZpeCAiLmpwZyIgb3IgIi5naWYiIHJlc3BlY3RpdmVseS4KK1RoZSBpY29uIGNhbiBiZSB1c2VkIGJ5IHRvb2xzLgorLS0+CisKKzwhRUxFTUVOVCBsYXJnZS1pY29uICgjUENEQVRBKSA+CisKKzwhLS0KKworVGhlIHNtYWxsLWljb24gZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIGZpbGUgY29udGFpbmluZyBhIGxhcmdlCisoMzIgeCAzMikgaWNvbiBpbWFnZS4gIFRoZSBmaWxlIG5hbWUgaXMgYSByZWxhdGl2ZSBwYXRoIHdpdGhpbiB0aGUKK3RhZyBsaWJyYXJ5LiAgVGhlIGltYWdlIG11c3QgYmUgZWl0aGVyIGluIHRoZSBKUEVHIG9yIEdJRiBmb3JtYXQsIGFuZAordGhlIGZpbGUgbmFtZSBtdXN0IGVuZCB3aXRoIHRoZSBzdWZmaXggIi5qcGciIG9yICIuZ2lmIiByZXNwZWN0aXZlbHkuCitUaGUgaWNvbiBjYW4gYmUgdXNlZCBieSB0b29scy4KKy0tPgorCis8IUVMRU1FTlQgc21hbGwtaWNvbiAoI1BDREFUQSkgPgorCis8IS0tCisKK1RoZSBleGFtcGxlIGVsZW1lbnQgY29udGFpbnMgYW4gaW5mb3JtYWwgZGVzY3JpcHRpb24gb2YgYW4gZXhhbXBsZQorb2YgdGhlIHVzZSBvZiBhIHRhZy4KKy0tPgorCis8IUVMRU1FTlQgZXhhbXBsZSAoI1BDREFUQSkgPgorCis8IS0tCisKK1RoZSB2YXJpYWJsZSB0YWcgcHJvdmlkZXMgaW5mb3JtYXRpb24gb24gdGhlIHNjcmlwdGluZyB2YXJpYWJsZXMKK2RlZmluZWQgYnkgdGhpcyB0YWcuICBJdCBpcyBhICh0cmFuc2xhdGlvbiB0aW1lKSBlcnJvciBmb3IgYSB0YWcKK3RoYXQgaGFzIG9uZSBvciBtb3JlIHZhcmlhYmxlIHN1YmVsZW1lbnRzIHRvIGhhdmUgYSBUYWdFeHRyYUluZm8KK2NsYXNzIHRoYXQgcmV0dXJucyBhIG5vbi1udWxsIG9iamVjdC4KKworVGhlIHN1YmVsZW1lbnRzIG9mIHZhcmlhYmxlIGFyZSBvZiB0aGUgZm9ybToKKworbmFtZS1naXZlbiAgICAgICAgICAgICAgIFRoZSB2YXJpYWJsZSBuYW1lIGFzIGEgY29uc3RhbnQKKworbmFtZS1mcm9tLWF0dHJpYnV0ZSAgICAgIFRoZSBuYW1lIG9mIGFuIGF0dHJpYnV0ZSB3aG9zZSAodHJhbnNsYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lKSB2YWx1ZSB3aWxsIGdpdmUgdGhlIG5hbWUgb2YgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUuICBPbmUgb2YgbmFtZS1naXZlbiBvcgorICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUtZnJvbS1hdHRyaWJ1dGUgaXMgcmVxdWlyZWQuCisKK3ZhcmlhYmxlLWNsYXNzICAgICAgICAgICBOYW1lIG9mIHRoZSBjbGFzcyBvZiB0aGUgdmFyaWFibGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBpcyBkZWZhdWx0LgorCitkZWNsYXJlICAgICAgICAgICAgICAgICAgV2hldGhlciB0aGUgdmFyaWFibGUgaXMgZGVjbGFyZWQgb3Igbm90LgorICAgICAgICAgICAgICAgICAgICAgICAgIFRydWUgaXMgdGhlIGRlZmF1bHQuCisKK3Njb3BlICAgICAgICAgICAgICAgICAgICBUaGUgc2NvcGUgb2YgdGhlIHNjcmlwdGluZyB2YXJhaWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluZWQuICBORVNURUQgaXMgZGVmYXVsdC4KKworZGVzY3JpcHRpb24gICAgICAgICAgICAgIE9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoaXMgdmFyaWFibGUKKworLS0+CisKKzwhRUxFTUVOVCB2YXJpYWJsZSAoIChuYW1lLWdpdmVuIHwgbmFtZS1mcm9tLWF0dHJpYnV0ZSksIHZhcmlhYmxlLWNsYXNzPywKKyAgICAgICAgICAgICAgICAgICAgZGVjbGFyZT8sIHNjb3BlPywgZGVzY3JpcHRpb24/KSA+CisKKzwhLS0KKworVGhlIG5hbWUgZm9yIHRoZSBzY3JpcHRpbmcgdmFyaWFibGUuICBPbmUgb2YgbmFtZS1naXZlbiBvcgorbmFtZS1mcm9tLWF0dHJpYnV0ZSBpcyByZXF1aXJlZC4KKy0tPgorCis8IUVMRU1FTlQgbmFtZS1naXZlbiAoI1BDREFUQSkgPgorCis8IS0tCisKK1RoZSBuYW1lIG9mIGFuIGF0dHJpYnV0ZSB3aG9zZSAodHJhbnNsYXRpb24tdGltZSkgdmFsdWUgd2lsbCBnaXZlCit0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUuICBPbmUgb2YgbmFtZS1naXZlbiBvciBuYW1lLWZyb20tYXR0cmlidXRlCitpcyByZXF1aXJlZC4KKy0tPgorCis8IUVMRU1FTlQgbmFtZS1mcm9tLWF0dHJpYnV0ZSAoI1BDREFUQSkgPgorCis8IS0tCisKK1RoZSBvcHRpb25hbCBuYW1lIG9mIHRoZSBjbGFzcyBmb3IgdGhlIHNjcmlwdGluZyB2YXJpYWJsZS4gIFRoZQorZGVmYXVsdCBpcyBqYXZhLmxhbmcuU3RyaW5nLgorLS0+CisKKzwhRUxFTUVOVCB2YXJpYWJsZS1jbGFzcyAoI1BDREFUQSkgPgorCis8IS0tCisKK1doZXRoZXIgdGhlIHNjcmlwdGluZyB2YXJpYWJsZSBpcyB0byBiZSBkZWZpbmVkIG9yIG5vdC4gIFNlZQorVGFnRXh0cmFJbmZvIGZvciBkZXRhaWxzLiAgVGhpcyBlbGVtZW50IGlzIG9wdGlvbmFsIGFuZCAidHJ1ZSIKK2lzIHRoZSBkZWZhdWx0LgorLS0+CisKKzwhRUxFTUVOVCBkZWNsYXJlICgjUENEQVRBKSA+CisKKzwhLS0KKworVGhlIHNjb3BlIG9mIHRoZSBzY3JpcHRpbmcgdmFyaWFibGUuICBTZWUgVGFnRXh0cmFJbmZvIGZvciBkZXRhaWxzLgorVGhlIGVsZW1lbnQgaXMgb3B0aW9uYWwgYW5kICJORVNURUQiIGlzIHRoZSBkZWZhdWx0LiAgT3RoZXIgbGVnYWwKK3ZhbHVlcyBhcmUgIkFUX0JFR0lOIiBhbmQgIkFUX0VORCIuCistLT4KKworPCFFTEVNRU5UIHNjb3BlICgjUENEQVRBKSA+CisKKzwhLS0KKworVGhlIGF0dHJpYnV0ZSB0YWcgZGVmaW5lcyBhbiBhdHRyaWJ1dGUgZm9yIHRoZSBuZXN0aW5nIHRhZworCitBbiBhdHRyaWJ1dGUgZGVmaW5pdGlvbiBpcyBjb21wb3NlZCBvZjoKKwkKKy0gdGhlIGF0dHJpYnV0ZXMgbmFtZSAocmVxdWlyZWQpCistIGlmIHRoZSBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQgb3Igb3B0aW9uYWwgKG9wdGlvbmFsKQorLSBpZiB0aGUgYXR0cmlidXRlcyB2YWx1ZSBtYXkgYmUgZHluYW1pY2FsbHkgY2FsY3VsYXRlZCBhdCBydW50aW1lCisgIGJ5IGEgc2NyaXB0bGV0IGV4cHJlc3Npb24gKG9wdGlvbmFsKQorLSB0aGUgdHlwZSBvZiB0aGUgYXR0cmlidXRlcyB2YWx1ZSAob3B0aW9uYWwpCistIGFuIGluZm9ybWFsIGRlc2NyaXB0aW9uIG9mIHRoZSBtZWFuaW5nIG9mIHRoZSBhdHRyaWJ1dGUgKG9wdGlvbmFsKQorCistLT4KKworCis8IS0tCitUaGUgYXR0cmlidXRlIHRhZyBkZWZpbmVzIGFuIGF0dHJpYnV0ZSBmb3IgdGhlIG5lc3RpbmcgdGFnCisKK0FuIGF0dHJpYnV0ZSBkZWZpbml0aW9uIGlzIGNvbXBvc2VkIG9mOgorCistIHRoZSBhdHRyaWJ1dGVzIG5hbWUgKHJlcXVpcmVkKQorCistIGlmIHRoZSBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQgb3Igb3B0aW9uYWwgKG9wdGlvbmFsKQorCistIGlmIHRoZSBhdHRyaWJ1dGVzIHZhbHVlIG1heSBiZSBkeW5hbWljYWxseSBjYWxjdWxhdGVkIGF0IHJ1bnRpbWUKKyAgYnkgYSBzY3JpcHRsZXQgZXhwcmVzc2lvbiAob3B0aW9uYWwpCisKKy0gdGhlIHR5cGUgb2YgdGhlIGF0dHJpYnV0ZXMgdmFsdWUgKG9wdGlvbmFsKQorCistIGFuIGluZm9ybWFsIGRlc2NyaXB0aW9uIG9mIHRoZSBtZWFuaW5nIG9mIHRoZSBhdHRyaWJ1dGUgKG9wdGlvbmFsKQorLS0+CisKKzwhRUxFTUVOVCBhdHRyaWJ1dGUgKG5hbWUsIHJlcXVpcmVkPyAsIHJ0ZXhwcnZhbHVlPywgdHlwZT8sIGRlc2NyaXB0aW9uPykgPgorCis8IS0tCitEZWZpbmVzIHRoZSBjYW5vbmljYWwgbmFtZSBvZiBhIHRhZyBvciBhdHRyaWJ1dGUgYmVpbmcgZGVmaW5lZAorCisjUENEQVRBIDo6PSBOTVRPS0VOCistLT4KKworPCFFTEVNRU5UIG5hbWUJKCNQQ0RBVEEpID4KKworPCEtLQorRGVmaW5lcyBpZiB0aGUgbmVzdGluZyBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQgb3Igb3B0aW9uYWwuCisKKyNQQ0RBVEEgOjo9IHRydWUgfCBmYWxzZSB8IHllcyB8IG5vCisKK0lmIG5vdCBwcmVzZW50IHRoZW4gdGhlIGRlZmF1bHQgaXMgImZhbHNlIiwgaS5lIHRoZSBhdHRyaWJ1dGUKK2lzIG9wdGlvbmFsLgorLS0+CisKKzwhRUxFTUVOVCByZXF1aXJlZCAgICAoI1BDREFUQSkgPgorCis8IS0tCitEZWZpbmVzIGlmIHRoZSBuZXN0aW5nIGF0dHJpYnV0ZSBjYW4gaGF2ZSBzY3JpcHRsZXQgZXhwcmVzc2lvbnMgYXMKK2EgdmFsdWUsIGkuZSB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSBtYXkgYmUgZHluYW1pY2FsbHkgY2FsY3VsYXRlZAorYXQgcmVxdWVzdCB0aW1lLCBhcyBvcHBvc2VkIHRvIGEgc3RhdGljIHZhbHVlIGRldGVybWluZWQgYXQgdHJhbnNsYXRpb24KK3RpbWUuCisKKyNQQ0RBVEEgOjo9IHRydWUgfCBmYWxzZSB8IHllcyB8IG5vCisKK0lmIG5vdCBwcmVzZW50IHRoZW4gdGhlIGRlZmF1bHQgaXMgImZhbHNlIiwgaS5lIHRoZSBhdHRyaWJ1dGUKK2hhcyBhIHN0YXRpYyB2YWx1ZQorLS0+CisKKzwhRUxFTUVOVCBydGV4cHJ2YWx1ZSAoI1BDREFUQSkgPgorCisKKzwhLS0KKworRGVmaW5lcyB0aGUgSmF2YSB0eXBlIG9mIHRoZSBhdHRyaWJ1dGVzIHZhbHVlLiAgRm9yIHN0YXRpYyB2YWx1ZXMKKyh0aG9zZSBkZXRlcm1pbmVkIGF0IHRyYW5zbGF0aW9uIHRpbWUpIHRoZSB0eXBlIGlzIGFsd2F5cworamF2YS5sYW5nLlN0cmluZy4KKy0tPgorCis8IUVMRU1FTlQgdHlwZSAoI1BDREFUQSkgPgorCisKKzwhLS0gSUQgYXR0cmlidXRlcyAtLT4KKworPCFBVFRMSVNUIHRsaWItdmVyc2lvbiBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBqc3AtdmVyc2lvbiBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBzaG9ydC1uYW1lIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIHVyaSBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBkZXNjcmlwdGlvbiBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBleGFtcGxlIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIHRhZyBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCB0YWctY2xhc3MgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgdGVpLWNsYXNzIGlkIElEICNJTVBMSUVEPgorPCFBVFRMSVNUIGJvZHktY29udGVudCBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBhdHRyaWJ1dGUgaWQgSUQgI0lNUExJRUQ+Cis8IUFUVExJU1QgbmFtZSBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCByZXF1aXJlZCBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBydGV4cHJ2YWx1ZSBpZCBJRCAjSU1QTElFRD4KKworCis8IUFUVExJU1QgcGFyYW0tbmFtZSBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBwYXJhbS12YWx1ZSBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBsaXN0ZW5lciBpZCBJRCAjSU1QTElFRD4KKzwhQVRUTElTVCBsaXN0ZW5lci1jbGFzcyBpZCBJRCAjSU1QTElFRD4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9kdGQvd2ViLWpzcHRhZ2xpYnJhcnlfMl8wLnhzZCBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9kdGQvd2ViLWpzcHRhZ2xpYnJhcnlfMl8wLnhzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGQ0NmRmCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2R0ZC93ZWItanNwdGFnbGlicmFyeV8yXzAueHNkCkBAIC0wLDAgKzEsMTAyMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyAgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKKyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzx4c2Q6c2NoZW1hCisgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKKyAgICAgeG1sbnM6ajJlZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKKyAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKKyAgICAgeG1sbnM6eG1sPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiCisgICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgorICAgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCisgICAgIHZlcnNpb249IjIuMCI+CisKKyAgPHhzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICAgICVXJSAlRyUKKyAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICA8L3hzZDphbm5vdGF0aW9uPgorICA8eHNkOmFubm90YXRpb24+CisgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisgICAgICBDb3B5cmlnaHQgMjAwMiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA5MDEgU2FuIEFudG9uaW8KKyAgICAgIFJvYWQsIFBhbG8gQWx0bywgQ2FsaWZvcm5pYSA5NDMwMywgVS5TLkEuIEFsbCByaWdodHMKKyAgICAgIHJlc2VydmVkLgorCisgICAgICBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGhhcyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCisgICAgICByZWxhdGluZyB0byB0ZWNobm9sb2d5IGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LiBJbgorICAgICAgcGFydGljdWxhciwgYW5kIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlc2UgaW50ZWxsZWN0dWFsCisgICAgICBwcm9wZXJ0eSByaWdodHMgbWF5IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIFUuUy4gcGF0ZW50cworICAgICAgbGlzdGVkIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGFuZCBvbmUgb3IgbW9yZQorICAgICAgYWRkaXRpb25hbCBwYXRlbnRzIG9yIHBlbmRpbmcgcGF0ZW50IGFwcGxpY2F0aW9ucyBpbiB0aGUKKyAgICAgIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KKworICAgICAgVGhpcyBkb2N1bWVudCBhbmQgdGhlIHRlY2hub2xvZ3kgd2hpY2ggaXQgZGVzY3JpYmVzIGFyZQorICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgdGhlaXIgdXNlLCBjb3B5aW5nLAorICAgICAgZGlzdHJpYnV0aW9uLCBhbmQgZGVjb21waWxhdGlvbi4gTm8gcGFydCBvZiB0aGlzIGRvY3VtZW50CisgICAgICBtYXkgYmUgcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvcgorICAgICAgd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LgorCisgICAgICBUaGlyZC1wYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMKKyAgICAgIGNvcHlyaWdodGVkIGFuZCBsaWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuCisKKyAgICAgIFN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBsb2dvLCBTb2xhcmlzLCBKYXZhLCBKMkVFLAorICAgICAgSmF2YVNlcnZlciBQYWdlcywgRW50ZXJwcmlzZSBKYXZhQmVhbnMgYW5kIHRoZSBKYXZhIENvZmZlZQorICAgICAgQ3VwIGxvZ28gYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1bgorICAgICAgTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCisKKyAgICAgIEZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycworICAgICAgU3ViamVjdCB0byBTdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgorCisgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgPC94c2Q6YW5ub3RhdGlvbj4KKworICA8eHNkOmFubm90YXRpb24+CisgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorICAgICAgPCFbQ0RBVEFbCisKKwlUaGlzIGlzIHRoZSBYTUwgU2NoZW1hIGZvciB0aGUgSlNQIFRhZ2xpYnJhcnkKKwlkZXNjcmlwdG9yLiAgQWxsIFRhZ2xpYnJhcnkgZGVzY3JpcHRvcnMgbXVzdAorCWluZGljYXRlIHRoZSB0YWcgbGlicmFyeSBzY2hlbWEgYnkgdXNpbmcgdGhlIFRhZ2xpYnJhcnkKKwluYW1lc3BhY2U6CisKKwlodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlCisKKwlhbmQgYnkgaW5kaWNhdGluZyB0aGUgdmVyc2lvbiBvZiB0aGUgc2NoZW1hIGJ5CisJdXNpbmcgdGhlIHZlcnNpb24gZWxlbWVudCBhcyBzaG93biBiZWxvdzoKKworCSAgICA8dGFnbGliIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgorCSAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisJICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSIuLi4iCisJICAgICAgdmVyc2lvbj0iMi4wIj4KKwkgICAgICAuLi4KKwkgICAgPC90YWdsaWI+CisKKwlUaGUgaW5zdGFuY2UgZG9jdW1lbnRzIG1heSBpbmRpY2F0ZSB0aGUgcHVibGlzaGVkCisJdmVyc2lvbiBvZiB0aGUgc2NoZW1hIHVzaW5nIHhzaTpzY2hlbWFMb2NhdGlvbiBhdHRyaWJ1dGUKKwlmb3IgSjJFRSBuYW1lc3BhY2Ugd2l0aCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uOgorCisJaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS93ZWItanNwdGFnbGlicmFyeV8yXzAueHNkCisKKwldXT4KKyAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICA8L3hzZDphbm5vdGF0aW9uPgorCisgIDx4c2Q6aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0iajJlZV8xXzQueHNkIi8+CisKKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisKKyAgPHhzZDplbGVtZW50IG5hbWU9InRhZ2xpYiIgdHlwZT0iajJlZTp0bGRUYWdsaWJUeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwlUaGUgdGFnbGliIHRhZyBpcyB0aGUgZG9jdW1lbnQgcm9vdC4KKwlUaGUgZGVmaW5pdGlvbiBvZiB0YWdsaWIgaXMgcHJvdmlkZWQKKwlieSB0aGUgdGxkVGFnbGliVHlwZS4KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgIDx4c2Q6dW5pcXVlIG5hbWU9InRhZy1uYW1lLXVuaXF1ZW5lc3MiPgorICAgICAgPHhzZDphbm5vdGF0aW9uPgorCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgVGhlIHRhZ2xpYiBlbGVtZW50IGNvbnRhaW5zLCBhbW9uZyBvdGhlciB0aGluZ3MsIHRhZyBhbmQKKwkgIHRhZy1maWxlIGVsZW1lbnRzLgorCSAgVGhlIG5hbWUgc3ViZWxlbWVudHMgb2YgdGhlc2UgZWxlbWVudHMgbXVzdCBlYWNoIGJlIHVuaXF1ZS4KKworCTwveHNkOmRvY3VtZW50YXRpb24+CisgICAgICA8L3hzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTp0YWd8ajJlZTp0YWctZmlsZSIvPgorICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTpuYW1lIi8+CisgICAgPC94c2Q6dW5pcXVlPgorCisgICAgPHhzZDp1bmlxdWUgbmFtZT0iZnVuY3Rpb24tbmFtZS11bmlxdWVuZXNzIj4KKyAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KKwk8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgIFRoZSB0YWdsaWIgZWxlbWVudCBjb250YWlucyBmdW5jdGlvbiBlbGVtZW50cy4KKwkgIFRoZSBuYW1lIHN1YmVsZW1lbnRzIG9mIHRoZXNlIGVsZW1lbnRzIG11c3QgZWFjaCBiZSB1bmlxdWUuCisKKwk8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6ZnVuY3Rpb24iLz4KKyAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6bmFtZSIvPgorICAgIDwveHNkOnVuaXF1ZT4KKworICA8L3hzZDplbGVtZW50PgorCisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImJvZHktY29udGVudFR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworICAgICAgICBTcGVjaWZpZXMgdGhlIHR5cGUgb2YgYm9keSB0aGF0IGlzIHZhbGlkIGZvciBhIHRhZy4KKwlUaGlzIHZhbHVlIGlzIHVzZWQgYnkgdGhlIEpTUCBjb250YWluZXIgdG8gdmFsaWRhdGUKKwl0aGF0IGEgdGFnIGludm9jYXRpb24gaGFzIHRoZSBjb3JyZWN0IGJvZHkgc3ludGF4IGFuZAorCWJ5IHBhZ2UgY29tcG9zaXRpb24gdG9vbHMgdG8gYXNzaXN0IHRoZSBwYWdlIGF1dGhvcgorCWluIHByb3ZpZGluZyBhIHZhbGlkIHRhZyBib2R5LgorCisJVGhlcmUgYXJlIGN1cnJlbnRseSBmb3VyIHZhbHVlcyBzcGVjaWZpZWQ6CisKKwl0YWdkZXBlbmRlbnQgICAgVGhlIGJvZHkgb2YgdGhlIHRhZyBpcyBpbnRlcnByZXRlZCBieSB0aGUgdGFnCisJCQlpbXBsZW1lbnRhdGlvbiBpdHNlbGYsIGFuZCBpcyBtb3N0IGxpa2VseQorCQkJaW4gYSBkaWZmZXJlbnQgImxhbmd1YWdlIiwgZS5nIGVtYmVkZGVkIFNRTAorCQkJc3RhdGVtZW50cy4KKworCUpTUCAgICAgICAgICAgICBUaGUgYm9keSBvZiB0aGUgdGFnIGNvbnRhaW5zIG5lc3RlZCBKU1AKKwkJCXN5bnRheC4KKworCWVtcHR5ICAgICAgICAgICBUaGUgYm9keSBtdXN0IGJlIGVtcHR5CisKKwlzY3JpcHRsZXNzICAgICAgVGhlIGJvZHkgYWNjZXB0cyBvbmx5IHRlbXBsYXRlIHRleHQsIEVMCisJCQlFeHByZXNzaW9ucywgYW5kIEpTUCBhY3Rpb24gZWxlbWVudHMuICBObworCQkJc2NyaXB0aW5nIGVsZW1lbnRzIGFyZSBhbGxvd2VkLgorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisKKyAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+CisgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KKwk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ0YWdkZXBlbmRlbnQiLz4KKwk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKU1AiLz4KKwk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJlbXB0eSIvPgorCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNjcmlwdGxlc3MiLz4KKyAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJleHRlbnNpYmxlVHlwZSIgYWJzdHJhY3Q9InRydWUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCVRoZSBleHRlbnNpYmxlVHlwZSBpcyBhbiBhYnN0cmFjdCBiYXNlIHR5cGUgdGhhdCBpcyB1c2VkIHRvCisJZGVmaW5lIHRoZSB0eXBlIG9mIGV4dGVuc2lvbi1lbGVtZW50cy4gSW5zdGFuY2UgZG9jdW1lbnRzCisJbXVzdCBzdWJzdGl0dXRlIGEga25vd24gdHlwZSB0byBkZWZpbmUgdGhlIGV4dGVuc2lvbiBieQorCXVzaW5nIHhzaTp0eXBlIGF0dHJpYnV0ZSB0byBkZWZpbmUgdGhlIGFjdHVhbCB0eXBlIG9mCisJZXh0ZW5zaW9uLWVsZW1lbnRzLgorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZnVuY3Rpb25UeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwlUaGUgZnVuY3Rpb24gZWxlbWVudCBpcyB1c2VkIHRvIHByb3ZpZGUgaW5mb3JtYXRpb24gb24gZWFjaAorCWZ1bmN0aW9uIGluIHRoZSB0YWcgbGlicmFyeSB0aGF0IGlzIHRvIGJlIGV4cG9zZWQgdG8gdGhlIEVMLgorCisJVGhlIGZ1bmN0aW9uIGVsZW1lbnQgbWF5IGhhdmUgc2V2ZXJhbCBzdWJlbGVtZW50cyBkZWZpbmluZzoKKworCWRlc2NyaXB0aW9uICAgICAgICAgT3B0aW9uYWwgdGFnLXNwZWNpZmljIGluZm9ybWF0aW9uCisKKwlkaXNwbGF5LW5hbWUgICAgICAgIEEgc2hvcnQgbmFtZSB0aGF0IGlzIGludGVuZGVkIHRvIGJlCisJCQkgICAgZGlzcGxheWVkIGJ5IHRvb2xzCisKKwlpY29uICAgICAgICAgICAgICAgIE9wdGlvbmFsIGljb24gZWxlbWVudCB0aGF0IGNhbiBiZSB1c2VkCisJCQkgICAgYnkgdG9vbHMKKworCW5hbWUgICAgICAgICAgICAgICAgQSB1bmlxdWUgbmFtZSBmb3IgdGhpcyBmdW5jdGlvbgorCisJZnVuY3Rpb24tY2xhc3MgICAgICBQcm92aWRlcyB0aGUgbmFtZSBvZiB0aGUgSmF2YSBjbGFzcyB0aGF0CisJCQkgICAgaW1wbGVtZW50cyB0aGUgZnVuY3Rpb24KKworCWZ1bmN0aW9uLXNpZ25hdHVyZSAgUHJvdmlkZXMgdGhlIHNpZ25hdHVyZSwgYXMgaW4gdGhlIEphdmEKKwkJCSAgICBMYW5ndWFnZSBTcGVjaWZpY2F0aW9uLCBvZiB0aGUgSmF2YQorCQkJICAgIG1ldGhvZCB0aGF0IGlzIHRvIGJlIHVzZWQgdG8gaW1wbGVtZW50CisJCQkgICAgdGhlIGZ1bmN0aW9uLgorCisJZXhhbXBsZSAgICAgICAgICAgICBPcHRpb25hbCBpbmZvcm1hbCBkZXNjcmlwdGlvbiBvZiBhbgorCQkJICAgIGV4YW1wbGUgb2YgYSB1c2Ugb2YgdGhpcyBmdW5jdGlvbgorCisJZnVuY3Rpb24tZXh0ZW5zaW9uICBaZXJvIG9yIG1vcmUgZXh0ZW5zaW9ucyB0aGF0IHByb3ZpZGUgZXh0cmEKKwkJCSAgICBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGZ1bmN0aW9uLCBmb3IgdG9vbAorCQkJICAgIGNvbnN1bXB0aW9uCisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKworICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmdyb3VwIHJlZj0iajJlZTpkZXNjcmlwdGlvbkdyb3VwIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIKKwkJICAgdHlwZT0iajJlZTp0bGQtY2Fub25pY2FsLW5hbWVUeXBlIj4KKwk8eHNkOmFubm90YXRpb24+CisJICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgICAgQSB1bmlxdWUgbmFtZSBmb3IgdGhpcyBmdW5jdGlvbi4KKworCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwk8L3hzZDphbm5vdGF0aW9uPgorICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmdW5jdGlvbi1jbGFzcyIKKwkJICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KKwk8eHNkOmFubm90YXRpb24+CisJICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgICAgUHJvdmlkZXMgdGhlIGZ1bGx5LXF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBKYXZhCisJICAgIGNsYXNzIGNvbnRhaW5pbmcgdGhlIHN0YXRpYyBtZXRob2QgdGhhdCBpbXBsZW1lbnRzCisJICAgIHRoZSBmdW5jdGlvbi4KKworCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwk8L3hzZDphbm5vdGF0aW9uPgorCisgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZ1bmN0aW9uLXNpZ25hdHVyZSIKKwkJICAgdHlwZT0iajJlZTpzdHJpbmciPgorCTx4c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgICBQcm92aWRlcyB0aGUgc2lnbmF0dXJlLCBvZiB0aGUgc3RhdGljIEphdmEgbWV0aG9kIHRoYXQgaXMKKwkgICAgdG8gYmUgdXNlZCB0byBpbXBsZW1lbnQgdGhlIGZ1bmN0aW9uLiAgVGhlIHN5bnRheCBvZiB0aGUKKwkgICAgZnVuY3Rpb24tc2lnbmF0dXJlIGVsZW1lbnQgaXMgYXMgZm9sbG93czoKKworCQlGdW5jdGlvblNpZ25hdHVyZSA6Oj0gUmV0dXJuVHlwZSBTIE1ldGhvZE5hbWUgUz8KKwkJCQkgICAgICAnKCcgUz8gUGFyYW1ldGVycz8gUz8gJyknCisKKyAgICAgICAgICAgICAgICBSZXR1cm5UeXBlICAgICAgICA6Oj0gVHlwZQorCisJCU1ldGhvZE5hbWUgICAgICAgIDo6PSBJZGVudGlmaWVyCisKKwkJUGFyYW1ldGVycyAgICAgICAgOjo9ICAgUGFyYW1ldGVyCisJCQkJICAgICAgfCAoIFBhcmFtZXRlciBTPyAnLCcgUz8gUGFyYW1ldGVycyApCisKKyAgICAgICAgICAgICAgICBQYXJhbWV0ZXIgICAgICAgICA6Oj0gVHlwZQorCisJCVdoZXJlOgorCisgCQkgICAgKiBUeXBlIGlzIGEgYmFzaWMgdHlwZSBvciBhIGZ1bGx5IHF1YWxpZmllZCBKYXZhIGNsYXNzIG5hbWUKKwkJICAgICAgKGluY2x1ZGluZyBwYWNrYWdlIG5hbWUpLCBhcyBwZXIgdGhlICdUeXBlJyBwcm9kdWN0aW9uCisJCSAgICAgIGluIHRoZSBKYXZhIExhbmd1YWdlIFNwZWNpZmljYXRpb24sIFNlY29uZCBFZGl0aW9uLAorCQkgICAgICBDaGFwdGVyIDE4LgorCisgICAgICAgICAgICAgICAgICAgICogSWRlbnRpZmllciBpcyBhIEphdmEgaWRlbnRpZmllciwgYXMgcGVyIHRoZSAnSWRlbnRpZmllcicKKwkJICAgICAgcHJvZHVjdGlvbiBpbiB0aGUgSmF2YSBMYW5ndWFnZSBTcGVjaWZpY2F0aW9uLCBTZWNvbmQKKwkJICAgICAgRWRpdGlvbiwgQ2hhcHRlciAxOC4KKworCSAgICBFeGFtcGxlOgorCisJICAgIGphdmEubGFuZy5TdHJpbmcgbmlja05hbWUoIGphdmEubGFuZy5TdHJpbmcsIGludCApCisKKwkgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKworICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGFtcGxlIgorCQkgICB0eXBlPSJqMmVlOnhzZFN0cmluZ1R5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCI+CisJPHhzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICAgIFRoZSBleGFtcGxlIGVsZW1lbnQgY29udGFpbnMgYW4gaW5mb3JtYWwgZGVzY3JpcHRpb24KKwkgICAgb2YgYW4gZXhhbXBsZSBvZiB0aGUgdXNlIG9mIHRoaXMgZnVuY3Rpb24uCisKKwkgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKworICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmdW5jdGlvbi1leHRlbnNpb24iCisJCSAgIHR5cGU9ImoyZWU6dGxkLWV4dGVuc2lvblR5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCIKKwkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorCTx4c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgICBGdW5jdGlvbiBleHRlbnNpb25zIGFyZSBmb3IgdG9vbCB1c2Ugb25seSBhbmQgbXVzdCBub3QgYWZmZWN0CisJICAgIHRoZSBiZWhhdmlvciBvZiBhIGNvbnRhaW5lci4KKworCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwk8L3hzZDphbm5vdGF0aW9uPgorICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0YWdGaWxlVHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJRGVmaW5lcyBhbiBhY3Rpb24gaW4gdGhpcyB0YWcgbGlicmFyeSB0aGF0IGlzIGltcGxlbWVudGVkCisJYXMgYSAudGFnIGZpbGUuCisKKwlUaGUgdGFnLWZpbGUgZWxlbWVudCBoYXMgdHdvIHJlcXVpcmVkIHN1YmVsZW1lbnRzOgorCisJZGVzY3JpcHRpb24gICAgICAgT3B0aW9uYWwgdGFnLXNwZWNpZmljIGluZm9ybWF0aW9uCisKKwlkaXNwbGF5LW5hbWUgICAgICBBIHNob3J0IG5hbWUgdGhhdCBpcyBpbnRlbmRlZCB0byBiZQorCQkJICBkaXNwbGF5ZWQgYnkgdG9vbHMKKworCWljb24gICAgICAgICAgICAgIE9wdGlvbmFsIGljb24gZWxlbWVudCB0aGF0IGNhbiBiZSB1c2VkCisJCQkgIGJ5IHRvb2xzCisKKwluYW1lICAgICAgICAgICAgICBUaGUgdW5pcXVlIGFjdGlvbiBuYW1lCisKKwlwYXRoICAgICAgICAgICAgICBXaGVyZSB0byBmaW5kIHRoZSAudGFnIGZpbGUgaW1wbGVtZW50aW5nIHRoaXMKKwkJCSAgYWN0aW9uLCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUgd2ViCisJCQkgIGFwcGxpY2F0aW9uIG9yIHRoZSByb290IG9mIHRoZSBKQVIgZmlsZSBmb3IgYQorCQkJICB0YWcgbGlicmFyeSBwYWNrYWdlZCBpbiBhIEpBUi4gIFRoaXMgbXVzdAorCQkJICBiZWdpbiB3aXRoIC9XRUItSU5GL3RhZ3MgaWYgdGhlIC50YWcgZmlsZQorCQkJICByZXNpZGVzIGluIHRoZSBXQVIsIG9yIC9NRVRBLUlORi90YWdzIGlmIHRoZQorCQkJICAudGFnIGZpbGUgcmVzaWRlcyBpbiBhIEpBUi4KKworCWV4YW1wbGUgICAgICAgICAgIE9wdGlvbmFsIGluZm9ybWFsIGRlc2NyaXB0aW9uIG9mIGFuCisJCQkgIGV4YW1wbGUgb2YgYSB1c2Ugb2YgdGhpcyB0YWcKKworCXRhZy1leHRlbnNpb24gICAgIFplcm8gb3IgbW9yZSBleHRlbnNpb25zIHRoYXQgcHJvdmlkZSBleHRyYQorCQkJICBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHRhZywgZm9yIHRvb2wKKwkJCSAgY29uc3VtcHRpb24KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorCisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqMmVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIgorCQkgICB0eXBlPSJqMmVlOnRsZC1jYW5vbmljYWwtbmFtZVR5cGUiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXRoIgorCQkgICB0eXBlPSJqMmVlOnBhdGhUeXBlIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhhbXBsZSIKKwkJICAgdHlwZT0iajJlZTp4c2RTdHJpbmdUeXBlIgorCQkgICBtaW5PY2N1cnM9IjAiPgorCTx4c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgICBUaGUgZXhhbXBsZSBlbGVtZW50IGNvbnRhaW5zIGFuIGluZm9ybWFsIGRlc2NyaXB0aW9uCisJICAgIG9mIGFuIGV4YW1wbGUgb2YgdGhlIHVzZSBvZiBhIHRhZy4KKworCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwk8L3hzZDphbm5vdGF0aW9uPgorCisgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhZy1leHRlbnNpb24iCisJCSAgIHR5cGU9ImoyZWU6dGxkLWV4dGVuc2lvblR5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCIKKwkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorCTx4c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgICBUYWcgZXh0ZW5zaW9ucyBhcmUgZm9yIHRvb2wgdXNlIG9ubHkgYW5kIG11c3Qgbm90IGFmZmVjdAorCSAgICB0aGUgYmVoYXZpb3Igb2YgYSBjb250YWluZXIuCisKKwkgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGFnVHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJVGhlIHRhZyBkZWZpbmVzIGEgdW5pcXVlIHRhZyBpbiB0aGlzIHRhZyBsaWJyYXJ5LiAgSXQgaGFzIG9uZQorCWF0dHJpYnV0ZSwgaWQuCisKKwlUaGUgdGFnIGVsZW1lbnQgbWF5IGhhdmUgc2V2ZXJhbCBzdWJlbGVtZW50cyBkZWZpbmluZzoKKworCWRlc2NyaXB0aW9uICAgICAgIE9wdGlvbmFsIHRhZy1zcGVjaWZpYyBpbmZvcm1hdGlvbgorCisJZGlzcGxheS1uYW1lICAgICAgQSBzaG9ydCBuYW1lIHRoYXQgaXMgaW50ZW5kZWQgdG8gYmUKKwkJCSAgZGlzcGxheWVkIGJ5IHRvb2xzCisKKwlpY29uICAgICAgICAgICAgICBPcHRpb25hbCBpY29uIGVsZW1lbnQgdGhhdCBjYW4gYmUgdXNlZAorCQkJICBieSB0b29scworCisJbmFtZSAgICAgICAgICAgICAgVGhlIHVuaXF1ZSBhY3Rpb24gbmFtZQorCisJdGFnLWNsYXNzICAgICAgICAgVGhlIHRhZyBoYW5kbGVyIGNsYXNzIGltcGxlbWVudGluZworCQkJICBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuSnNwVGFnCisKKwl0ZWktY2xhc3MgICAgICAgICBBbiBvcHRpb25hbCBzdWJjbGFzcyBvZgorCQkJICBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnRXh0cmFJbmZvCisKKwlib2R5LWNvbnRlbnQgICAgICBUaGUgYm9keSBjb250ZW50IHR5cGUKKworCXZhcmlhYmxlICAgICAgICAgIE9wdGlvbmFsIHNjcmlwdGluZyB2YXJpYWJsZSBpbmZvcm1hdGlvbgorCisJYXR0cmlidXRlICAgICAgICAgQWxsIGF0dHJpYnV0ZXMgb2YgdGhpcyBhY3Rpb24gdGhhdCBhcmUKKwkJCSAgZXZhbHVhdGVkIHByaW9yIHRvIGludm9jYXRpb24uCisKKwlkeW5hbWljLWF0dHJpYnV0ZXMgV2hldGhlciB0aGlzIHRhZyBzdXBwb3J0cyBhZGRpdGlvbmFsCisJCQkgICBhdHRyaWJ1dGVzIHdpdGggZHluYW1pYyBuYW1lcy4gIElmCisJCQkgICB0cnVlLCB0aGUgdGFnLWNsYXNzIG11c3QgaW1wbGVtZW50IHRoZQorCQkJICAgamF2YXguc2VydmxldC5qc3AudGFnZXh0LkR5bmFtaWNBdHRyaWJ1dGVzCisJCQkgICBpbnRlcmZhY2UuICBEZWZhdWx0cyB0byBmYWxzZS4KKworCWV4YW1wbGUgICAgICAgICAgIE9wdGlvbmFsIGluZm9ybWFsIGRlc2NyaXB0aW9uIG9mIGFuCisJCQkgIGV4YW1wbGUgb2YgYSB1c2Ugb2YgdGhpcyB0YWcKKworCXRhZy1leHRlbnNpb24gICAgIFplcm8gb3IgbW9yZSBleHRlbnNpb25zIHRoYXQgcHJvdmlkZSBleHRyYQorCQkJICBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHRhZywgZm9yIHRvb2wKKwkJCSAgY29uc3VtcHRpb24KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorCisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqMmVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIgorCQkgICB0eXBlPSJqMmVlOnRsZC1jYW5vbmljYWwtbmFtZVR5cGUiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWctY2xhc3MiCisJCSAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+CisJPHhzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICAgIERlZmluZXMgdGhlIHN1YmNsYXNzIG9mIGphdmF4LnNlcmx2ZXQuanNwLnRhZ2V4dC5Kc3BUYWcKKwkgICAgdGhhdCBpbXBsZW1lbnRzIHRoZSByZXF1ZXN0IHRpbWUgc2VtYW50aWNzIGZvcgorCSAgICB0aGlzIHRhZy4gKHJlcXVpcmVkKQorCisJICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCTwveHNkOmFubm90YXRpb24+CisKKyAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGVpLWNsYXNzIgorCQkgICB0eXBlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCI+CisJPHhzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICAgIERlZmluZXMgdGhlIHN1YmNsYXNzIG9mIGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWdFeHRyYUluZm8KKwkgICAgZm9yIHRoaXMgdGFnLiAob3B0aW9uYWwpCisKKwkgICAgSWYgdGhpcyBpcyBub3QgZ2l2ZW4sIHRoZSBjbGFzcyBpcyBub3QgY29uc3VsdGVkIGF0CisJICAgIHRyYW5zbGF0aW9uIHRpbWUuCisKKwkgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYm9keS1jb250ZW50IgorCQkgICB0eXBlPSJqMmVlOmJvZHktY29udGVudFR5cGUiPgorCTx4c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgICBTcGVjaWZpZXMgdGhlIGZvcm1hdCBmb3IgdGhlIGJvZHkgb2YgdGhpcyB0YWcuCisJICAgIFRoZSBkZWZhdWx0IGluIEpTUCAxLjIgd2FzICJKU1AiIGJ1dCBiZWNhdXNlIHRoaXMKKwkgICAgaXMgYW4gaW52YWxpZCBzZXR0aW5nIGZvciBzaW1wbGUgdGFnIGhhbmRsZXJzLCB0aGVyZQorCSAgICBpcyBubyBsb25nZXIgYSBkZWZhdWx0IGluIEpTUCAyLjAuICBBIHJlYXNvbmFibGUKKwkgICAgZGVmYXVsdCBmb3Igc2ltcGxlIHRhZyBoYW5kbGVycyBpcyAic2NyaXB0bGVzcyIgaWYKKwkgICAgdGhlIHRhZyBjYW4gaGF2ZSBhIGJvZHkuCisKKwkgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFyaWFibGUiCisJCSAgIHR5cGU9ImoyZWU6dmFyaWFibGVUeXBlIgorCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlIgorCQkgICB0eXBlPSJqMmVlOnRsZC1hdHRyaWJ1dGVUeXBlIgorCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZHluYW1pYy1hdHRyaWJ1dGVzIgorCQkgICB0eXBlPSJqMmVlOmdlbmVyaWMtYm9vbGVhblR5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4YW1wbGUiCisJCSAgIHR5cGU9ImoyZWU6eHNkU3RyaW5nVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIj4KKwk8eHNkOmFubm90YXRpb24+CisJICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgICAgVGhlIGV4YW1wbGUgZWxlbWVudCBjb250YWlucyBhbiBpbmZvcm1hbCBkZXNjcmlwdGlvbgorCSAgICBvZiBhbiBleGFtcGxlIG9mIHRoZSB1c2Ugb2YgYSB0YWcuCisKKwkgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKworICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWctZXh0ZW5zaW9uIgorCQkgICB0eXBlPSJqMmVlOnRsZC1leHRlbnNpb25UeXBlIgorCQkgICBtaW5PY2N1cnM9IjAiCisJCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKwk8eHNkOmFubm90YXRpb24+CisJICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgICAgVGFnIGV4dGVuc2lvbnMgYXJlIGZvciB0b29sIHVzZSBvbmx5IGFuZCBtdXN0IG5vdCBhZmZlY3QKKwkgICAgdGhlIGJlaGF2aW9yIG9mIGEgY29udGFpbmVyLgorCisJICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCTwveHNkOmFubm90YXRpb24+CisgICAgICA8L3hzZDplbGVtZW50PgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRsZC1hdHRyaWJ1dGVUeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwlUaGUgYXR0cmlidXRlIGVsZW1lbnQgZGVmaW5lcyBhbiBhdHRyaWJ1dGUgZm9yIHRoZSBuZXN0aW5nCisJdGFnLiAgVGhlIGF0dHJpYnV0cmUgZWxlbWVudCBtYXkgaGF2ZSBzZXZlcmFsIHN1YmVsZW1lbnRzCisJZGVmaW5pbmc6CisKKwlkZXNjcmlwdGlvbiAgICAgYSBkZXNjcmlwdGlvbiBvZiB0aGUgYXR0cmlidXRlCisKKwluYW1lICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZQorCisJcmVxdWlyZWQgICAgICAgIHdoZXRoZXIgdGhlIGF0dHJpYnV0ZSBpcyByZXF1aXJlZCBvcgorCQkJb3B0aW9uYWwKKworCXJ0ZXhwcnZhbHVlICAgICB3aGV0aGVyIHRoZSBhdHRyaWJ1dGUgaXMgYSBydW50aW1lIGF0dHJpYnV0ZQorCisJdHlwZSAgICAgICAgICAgIHRoZSB0eXBlIG9mIHRoZSBhdHRyaWJ1dGVzCisKKwlmcmFnbWVudCAgICAgICAgd2hldGhlciB0aGlzIGF0dHJpYnV0ZSBpcyBhIGZyYWdtZW50CisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgorCQkgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWUiCisJCSAgIHR5cGU9ImoyZWU6amF2YS1pZGVudGlmaWVyVHlwZSIvPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlcXVpcmVkIgorCQkgICB0eXBlPSJqMmVlOmdlbmVyaWMtYm9vbGVhblR5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCI+CisJPHhzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICAgIERlZmluZXMgaWYgdGhlIG5lc3RpbmcgYXR0cmlidXRlIGlzIHJlcXVpcmVkIG9yCisJICAgIG9wdGlvbmFsLgorCisJICAgIElmIG5vdCBwcmVzZW50IHRoZW4gdGhlIGRlZmF1bHQgaXMgImZhbHNlIiwgaS5lCisJICAgIHRoZSBhdHRyaWJ1dGUgaXMgb3B0aW9uYWwuCisKKwkgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDwveHNkOmVsZW1lbnQ+CisKKyAgICAgIDx4c2Q6Y2hvaWNlPgorCTx4c2Q6c2VxdWVuY2U+CisJICA8eHNkOmVsZW1lbnQgbmFtZT0icnRleHBydmFsdWUiCisJCSAgICAgICB0eXBlPSJqMmVlOmdlbmVyaWMtYm9vbGVhblR5cGUiCisJCSAgICAgICBtaW5PY2N1cnM9IjAiPgorCSAgICA8eHNkOmFubm90YXRpb24+CisJICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJCURlZmluZXMgaWYgdGhlIG5lc3RpbmcgYXR0cmlidXRlIGNhbiBoYXZlIHNjcmlwdGxldAorCQlleHByZXNzaW9ucyBhcyBhIHZhbHVlLCBpLmUgdGhlIHZhbHVlIG9mIHRoZQorCQlhdHRyaWJ1dGUgbWF5IGJlIGR5bmFtaWNhbGx5IGNhbGN1bGF0ZWQgYXQgcmVxdWVzdAorCQl0aW1lLCBhcyBvcHBvc2VkIHRvIGEgc3RhdGljIHZhbHVlIGRldGVybWluZWQgYXQKKwkJdHJhbnNsYXRpb24gdGltZS4KKworCQlJZiBub3QgcHJlc2VudCB0aGVuIHRoZSBkZWZhdWx0IGlzICJmYWxzZSIsIGkuZSB0aGUKKwkJYXR0cmlidXRlIGhhcyBhIHN0YXRpYyB2YWx1ZQorCisJICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwkgICAgPC94c2Q6YW5ub3RhdGlvbj4KKworCSAgPC94c2Q6ZWxlbWVudD4KKwkgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlIgorCQkgICAgICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIgorCQkgICAgICAgbWluT2NjdXJzPSIwIj4KKwkgICAgPHhzZDphbm5vdGF0aW9uPgorCSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCQlEZWZpbmVzIHRoZSBKYXZhIHR5cGUgb2YgdGhlIGF0dHJpYnV0ZXMgdmFsdWUuICBGb3IKKwkJc3RhdGljIHZhbHVlcyAodGhvc2UgZGV0ZXJtaW5lZCBhdCB0cmFuc2xhdGlvbiB0aW1lKQorCQl0aGUgdHlwZSBpcyBhbHdheXMgamF2YS5sYW5nLlN0cmluZy4KKworCSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisJICAgIDwveHNkOmFubm90YXRpb24+CisJICA8L3hzZDplbGVtZW50PgorCTwveHNkOnNlcXVlbmNlPgorCTx4c2Q6ZWxlbWVudCBuYW1lPSJmcmFnbWVudCIKKwkJICAgICB0eXBlPSJqMmVlOmdlbmVyaWMtYm9vbGVhblR5cGUiCisJCSAgICAgbWluT2NjdXJzPSIwIj4KKwkgIDx4c2Q6YW5ub3RhdGlvbj4KKwkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICAgICAgInRydWUiIGlmIHRoaXMgYXR0cmlidXRlIGlzIG9mIHR5cGUKKwkgICAgICBqYXZheC5qc3AudGFnZXh0LkpzcEZyYWdtZW50LCByZXByZXNlbnRpbmcgZHluYW1pYworCSAgICAgIGNvbnRlbnQgdGhhdCBjYW4gYmUgcmUtZXZhbHVhdGVkIGFzIG1hbnkgdGltZXMKKwkgICAgICBhcyBuZWVkZWQgYnkgdGhlIHRhZyBoYW5kbGVyLiAgSWYgb21pdHRlZCBvciAiZmFsc2UiLAorCSAgICAgIHRoZSBkZWZhdWx0IGlzIHN0aWxsIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisKKwkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwkgIDwveHNkOmFubm90YXRpb24+CisJPC94c2Q6ZWxlbWVudD4KKyAgICAgIDwveHNkOmNob2ljZT4KKyAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0bGQtY2Fub25pY2FsLW5hbWVUeXBlIj4KKworICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCURlZmluZXMgdGhlIGNhbm9uaWNhbCBuYW1lIG9mIGEgdGFnIG9yIGF0dHJpYnV0ZSBiZWluZworCWRlZmluZWQuCisKKwlUaGUgbmFtZSBtdXN0IGNvbmZvcm0gdG8gdGhlIGxleGljYWwgcnVsZXMgZm9yIGFuIE5NVE9LRU4uCisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKworICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTp4c2ROTVRPS0VOVHlwZSIvPgorICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+CisgIDwveHNkOmNvbXBsZXhUeXBlPgorCis8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisKKyAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0bGQtZXh0ZW5zaW9uVHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJVGhlIHRsZC1leHRlbnNpb25UeXBlIGlzIHVzZWQgdG8gaW5kaWNhdGUKKwlleHRlbnNpb25zIHRvIGEgc3BlY2lmaWMgVExEIGVsZW1lbnQuCisKKwlJdCBpcyB1c2VkIGJ5IGVsZW1lbnRzIHRvIGRlc2lnbmF0ZSBhbiBleHRlbnNpb24gYmxvY2sKKwl0aGF0IGlzIHRhcmdldGVkIHRvIGEgc3BlY2lmaWMgZXh0ZW5zaW9uIGRlc2lnbmF0ZWQgYnkKKwlhIHNldCBvZiBleHRlbnNpb24gZWxlbWVudHMgdGhhdCBhcmUgZGVjbGFyZWQgYnkgYQorCW5hbWVzcGFjZS4gVGhlIG5hbWVzcGFjZSBpZGVudGlmaWVzIHRoZSBleHRlbnNpb24gdG8KKwl0aGUgdG9vbCB0aGF0IHByb2Nlc3NlcyB0aGUgZXh0ZW5zaW9uLgorCisJVGhlIHR5cGUgb2YgdGhlIGV4dGVuc2lvbi1lbGVtZW50IGlzIGFic3RyYWN0LiBUaGVyZWZvcmUsCisJYSBjb25jcmV0ZSB0eXBlIG11c3QgYmUgc3BlY2lmaWVkIGJ5IHRoZSBUTEQgdXNpbmcKKwl4c2k6dHlwZSBhdHRyaWJ1dGUgZm9yIGVhY2ggZXh0ZW5zaW9uLWVsZW1lbnQuCisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKworICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uLWVsZW1lbnQiCisJCSAgIHR5cGU9ImoyZWU6ZXh0ZW5zaWJsZVR5cGUiCisJCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgPC94c2Q6c2VxdWVuY2U+CisKKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lc3BhY2UiCisJCSAgIHVzZT0icmVxdWlyZWQiCisJCSAgIHR5cGU9InhzZDphbnlVUkkiLz4KKyAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+CisKKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRsZFRhZ2xpYlR5cGUiPgorICAgIDx4c2Q6YW5ub3RhdGlvbj4KKyAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCVRoZSB0YWdsaWIgdGFnIGlzIHRoZSBkb2N1bWVudCByb290LCBpdCBkZWZpbmVzOgorCisJZGVzY3JpcHRpb24gICAgIGEgc2ltcGxlIHN0cmluZyBkZXNjcmliaW5nIHRoZSAidXNlIiBvZiB0aGlzIHRhZ2xpYiwKKwkJCXNob3VsZCBiZSB1c2VyIGRpc2Nlcm5hYmxlCisKKwlkaXNwbGF5LW5hbWUgICAgdGhlIGRpc3BsYXktbmFtZSBlbGVtZW50IGNvbnRhaW5zIGEKKwkJCXNob3J0IG5hbWUgdGhhdCBpcyBpbnRlbmRlZCB0byBiZSBkaXNwbGF5ZWQKKwkJCWJ5IHRvb2xzCisKKwlpY29uICAgICAgICAgICAgb3B0aW9uYWwgaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGJ5IHRvb2xzCisKKwl0bGliLXZlcnNpb24gICAgdGhlIHZlcnNpb24gb2YgdGhlIHRhZyBsaWJyYXJ5IGltcGxlbWVudGF0aW9uCisKKwlzaG9ydC1uYW1lICAgICAgYSBzaW1wbGUgZGVmYXVsdCBzaG9ydCBuYW1lIHRoYXQgY291bGQgYmUKKwkJCXVzZWQgYnkgYSBKU1AgYXV0aG9yaW5nIHRvb2wgdG8gY3JlYXRlCisJCQluYW1lcyB3aXRoIGEgbW5lbW9uaWMgdmFsdWU7IGZvciBleGFtcGxlLAorCQkJdGhlIGl0IG1heSBiZSB1c2VkIGFzIHRoZSBwcmVmZXJlZCBwcmVmaXgKKwkJCXZhbHVlIGluIHRhZ2xpYiBkaXJlY3RpdmVzCisKKwl1cmkgICAgICAgICAgICAgYSB1cmkgdW5pcXVlbHkgaWRlbnRpZnlpbmcgdGhpcyB0YWdsaWIKKworCXZhbGlkYXRvciAgICAgICBvcHRpb25hbCBUYWdMaWJyYXJ5VmFsaWRhdG9yIGluZm9ybWF0aW9uCisKKwlsaXN0ZW5lciAgICAgICAgb3B0aW9uYWwgZXZlbnQgbGlzdGVuZXIgc3BlY2lmaWNhdGlvbgorCisJdGFnICAgICAgICAgICAgIHRhZ3MgaW4gdGhpcyB0YWcgbGlicmFyeQorCisJdGFnLWZpbGUgICAgICAgIHRhZyBmaWxlcyBpbiB0aGlzIHRhZyBsaWJyYXJ5CisKKwlmdW5jdGlvbiAgICAgICAgemVybyBvciBtb3JlIEVMIGZ1bmN0aW9ucyBkZWZpbmVkIGluIHRoaXMKKwkJCXRhZyBsaWJyYXJ5CisKKwl0YWdsaWItZXh0ZW5zaW9uIHplcm8gb3IgbW9yZSBleHRlbnNpb25zIHRoYXQgcHJvdmlkZSBleHRyYQorCQkJaW5mb3JtYXRpb24gYWJvdXQgdGhpcyB0YWdsaWIsIGZvciB0b29sCisJCQljb25zdW1wdGlvbgorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqMmVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0bGliLXZlcnNpb24iCisJCSAgIHR5cGU9ImoyZWU6ZGV3ZXktdmVyc2lvblR5cGUiPgorCTx4c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgICBEZXNjcmliZXMgdGhpcyB2ZXJzaW9uIChudW1iZXIpIG9mIHRoZSB0YWdsaWJyYXJ5LgorCSAgICBJdCBpcyBkZXNjcmliZWQgYXMgYSBkZXdleSBkZWNpbWFsLgorCisJICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCTwveHNkOmFubm90YXRpb24+CisKKyAgICAgIDwveHNkOmVsZW1lbnQ+CisKKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzaG9ydC1uYW1lIgorCQkgICB0eXBlPSJqMmVlOnRsZC1jYW5vbmljYWwtbmFtZVR5cGUiPgorCTx4c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgICBEZWZpbmVzIGEgc2ltcGxlIGRlZmF1bHQgbmFtZSB0aGF0IGNvdWxkIGJlIHVzZWQgYnkKKwkgICAgYSBKU1AgYXV0aG9yaW5nIHRvb2wgdG8gY3JlYXRlIG5hbWVzIHdpdGggYQorCSAgICBtbmVtb25pY3ZhbHVlOyBmb3IgZXhhbXBsZSwgaXQgbWF5IGJlIHVzZWQgYXMgdGhlCisJICAgIHByZWZlcnJlZCBwcmVmaXggdmFsdWUgaW4gdGFnbGliIGRpcmVjdGl2ZXMuICBEbworCSAgICBub3QgdXNlIHdoaXRlIHNwYWNlLCBhbmQgZG8gbm90IHN0YXJ0IHdpdGggZGlnaXRzCisJICAgIG9yIHVuZGVyc2NvcmUuCisKKwkgIDwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKworICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1cmkiCisJCSAgIHR5cGU9ImoyZWU6eHNkQW55VVJJVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIj4KKwk8eHNkOmFubm90YXRpb24+CisJICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgICAgRGVmaW5lcyBhIHB1YmxpYyBVUkkgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIHRoaXMKKwkgICAgdmVyc2lvbiBvZiB0aGUgdGFnbGlicmFyeS4gIExlYXZlIGl0IGVtcHR5IGlmIGl0CisJICAgIGRvZXMgbm90IGFwcGx5LgorCisJICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCTwveHNkOmFubm90YXRpb24+CisKKyAgICAgIDwveHNkOmVsZW1lbnQ+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFsaWRhdG9yIgorCQkgICB0eXBlPSJqMmVlOnZhbGlkYXRvclR5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCI+CisgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imxpc3RlbmVyIgorCQkgICB0eXBlPSJqMmVlOmxpc3RlbmVyVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhZyIKKwkJICAgdHlwZT0iajJlZTp0YWdUeXBlIgorCQkgICBtaW5PY2N1cnM9IjAiCisJCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFnLWZpbGUiCisJCSAgIHR5cGU9ImoyZWU6dGFnRmlsZVR5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCIKKwkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmdW5jdGlvbiIKKwkJICAgdHlwZT0iajJlZTpmdW5jdGlvblR5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCIKKwkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWdsaWItZXh0ZW5zaW9uIgorCQkgICB0eXBlPSJqMmVlOnRsZC1leHRlbnNpb25UeXBlIgorCQkgICBtaW5PY2N1cnM9IjAiCisJCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKwk8eHNkOmFubm90YXRpb24+CisJICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgICAgVGFnbGliIGV4dGVuc2lvbnMgYXJlIGZvciB0b29sIHVzZSBvbmx5IGFuZCBtdXN0IG5vdCBhZmZlY3QKKwkgICAgdGhlIGJlaGF2aW9yIG9mIGEgY29udGFpbmVyLgorCisJICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCTwveHNkOmFubm90YXRpb24+CisgICAgICA8L3hzZDplbGVtZW50PgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iCisJCSAgIHR5cGU9ImoyZWU6ZGV3ZXktdmVyc2lvblR5cGUiCisJCSAgIGZpeGVkPSIyLjAiCisJCSAgIHVzZT0icmVxdWlyZWQiPgorICAgICAgPHhzZDphbm5vdGF0aW9uPgorCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgRGVzY3JpYmVzIHRoZSBKU1AgdmVyc2lvbiAobnVtYmVyKSB0aGlzIHRhZ2xpYnJhcnkKKwkgIHJlcXVpcmVzIGluIG9yZGVyIHRvIGZ1bmN0aW9uIChkZXdleSBkZWNpbWFsKQorCisJPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICAgIDwveHNkOmFubm90YXRpb24+CisKKyAgICA8L3hzZDphdHRyaWJ1dGU+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idmFsaWRhdG9yVHlwZSI+CisgICAgPHhzZDphbm5vdGF0aW9uPgorICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJQSB2YWxpZGF0b3IgdGhhdCBjYW4gYmUgdXNlZCB0byB2YWxpZGF0ZQorCXRoZSBjb25mb3JtYW5jZSBvZiBhIEpTUCBwYWdlIHRvIHVzaW5nIHRoaXMgdGFnIGxpYnJhcnkgaXMKKwlkZWZpbmVkIGJ5IGEgdmFsaWRhdG9yVHlwZS4KKworICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKyAgICA8L3hzZDphbm5vdGF0aW9uPgorCisgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKKwkJICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCIKKwkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWxpZGF0b3ItY2xhc3MiCisJCSAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+CisJPHhzZDphbm5vdGF0aW9uPgorCSAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICAgIERlZmluZXMgdGhlIFRhZ0xpYnJhcnlWYWxpZGF0b3IgY2xhc3MgdGhhdCBjYW4gYmUgdXNlZAorCSAgICB0byB2YWxpZGF0ZSB0aGUgY29uZm9ybWFuY2Ugb2YgYSBKU1AgcGFnZSB0byB1c2luZyB0aGlzCisJICAgIHRhZyBsaWJyYXJ5LgorCisJICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCTwveHNkOmFubm90YXRpb24+CisgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImluaXQtcGFyYW0iCisJCSAgIHR5cGU9ImoyZWU6cGFyYW0tdmFsdWVUeXBlIgorCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKwk8eHNkOmFubm90YXRpb24+CisJICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgICAgVGhlIGluaXQtcGFyYW0gZWxlbWVudCBjb250YWlucyBhIG5hbWUvdmFsdWUgcGFpciBhcyBhbgorCSAgICBpbml0aWFsaXphdGlvbiBwYXJhbS4KKworCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwk8L3hzZDphbm5vdGF0aW9uPgorCisgICAgICA8L3hzZDplbGVtZW50PgorCisgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idmFyaWFibGUtc2NvcGVUeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwlUaGlzIHR5cGUgZGVmaW5lcyBzY29wZSBvZiB0aGUgc2NyaXB0aW5nIHZhcmlhYmxlLiAgU2VlCisJVGFnRXh0cmFJbmZvIGZvciBkZXRhaWxzLiAgVGhlIGFsbG93ZWQgdmFsdWVzIGFyZSwKKwkiTkVTVEVEIiwgIkFUX0JFR0lOIiBhbmQgIkFUX0VORCIuCisKKyAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+CisgICAgPC94c2Q6YW5ub3RhdGlvbj4KKworICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KKyAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgorCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5FU1RFRCIvPgorCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFUX0JFR0lOIi8+CisJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVRfRU5EIi8+CisgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICA8L3hzZDpzaW1wbGVDb250ZW50PgorICA8L3hzZDpjb21wbGV4VHlwZT4KKworPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idmFyaWFibGVUeXBlIj4KKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwlUaGUgdmFyaWFibGVUeXBlIHByb3ZpZGVzIGluZm9ybWF0aW9uIG9uIHRoZSBzY3JpcHRpbmcKKwl2YXJpYWJsZXMgZGVmaW5lZCBieSB1c2luZyB0aGlzIHRhZy4gIEl0IGlzIGEgKHRyYW5zbGF0aW9uCisJdGltZSkgZXJyb3IgZm9yIGEgdGFnIHRoYXQgaGFzIG9uZSBvciBtb3JlIHZhcmlhYmxlCisJc3ViZWxlbWVudHMgdG8gaGF2ZSBhIFRhZ0V4dHJhSW5mbyBjbGFzcyB0aGF0IHJldHVybnMgYQorCW5vbi1udWxsIHZhbHVlIGZyb20gYSBjYWxsIHRvIGdldFZhcmlhYmxlSW5mbygpLgorCisJVGhlIHN1YmVsZW1lbnRzIG9mIHZhcmlhYmxlVHlwZSBhcmUgb2YgdGhlIGZvcm06CisKKwlkZXNjcmlwdGlvbiAgICAgICAgICAgICAgT3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhpcworCQkJCSB2YXJpYWJsZQorCisJbmFtZS1naXZlbiAgICAgICAgICAgICAgIFRoZSB2YXJpYWJsZSBuYW1lIGFzIGEgY29uc3RhbnQKKworCW5hbWUtZnJvbS1hdHRyaWJ1dGUgICAgICBUaGUgbmFtZSBvZiBhbiBhdHRyaWJ1dGUgd2hvc2UKKwkJCQkgKHRyYW5zbGF0aW9uIHRpbWUpIHZhbHVlIHdpbGwKKwkJCQkgZ2l2ZSB0aGUgbmFtZSBvZiB0aGUKKwkJCQkgdmFyaWFibGUuICBPbmUgb2YgbmFtZS1naXZlbiBvcgorCQkJCSBuYW1lLWZyb20tYXR0cmlidXRlIGlzIHJlcXVpcmVkLgorCisJdmFyaWFibGUtY2xhc3MgICAgICAgICAgIE5hbWUgb2YgdGhlIGNsYXNzIG9mIHRoZSB2YXJpYWJsZS4KKwkJCQkgamF2YS5sYW5nLlN0cmluZyBpcyBkZWZhdWx0LgorCisJZGVjbGFyZSAgICAgICAgICAgICAgICAgIFdoZXRoZXIgdGhlIHZhcmlhYmxlIGlzIGRlY2xhcmVkCisJCQkJIG9yIG5vdC4gIFRydWUgaXMgdGhlIGRlZmF1bHQuCisKKwlzY29wZSAgICAgICAgICAgICAgICAgICAgVGhlIHNjb3BlIG9mIHRoZSBzY3JpcHRpbmcgdmFyYWlibGUKKwkJCQkgZGVmaW5lZC4gIE5FU1RFRCBpcyBkZWZhdWx0LgorCisgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisKKyAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgorCQkgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPHhzZDpjaG9pY2U+CisJPHhzZDplbGVtZW50IG5hbWU9Im5hbWUtZ2l2ZW4iCisJCSAgICAgdHlwZT0iajJlZTpqYXZhLWlkZW50aWZpZXJUeXBlIj4KKwkgIDx4c2Q6YW5ub3RhdGlvbj4KKwkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgorCisJICAgICAgVGhlIG5hbWUgZm9yIHRoZSBzY3JpcHRpbmcgdmFyaWFibGUuCisKKwkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwkgIDwveHNkOmFubm90YXRpb24+CisJPC94c2Q6ZWxlbWVudD4KKworCTx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lLWZyb20tYXR0cmlidXRlIgorCQkgICAgIHR5cGU9ImoyZWU6amF2YS1pZGVudGlmaWVyVHlwZSI+CisJICA8eHNkOmFubm90YXRpb24+CisJICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgICAgIFRoZSBuYW1lIG9mIGFuIGF0dHJpYnV0ZSB3aG9zZQorCSAgICAgICh0cmFuc2xhdGlvbi10aW1lKSB2YWx1ZSB3aWxsIGdpdmUgdGhlIG5hbWUgb2YKKwkgICAgICB0aGUgdmFyaWFibGUuCisKKwkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwkgIDwveHNkOmFubm90YXRpb24+CisJPC94c2Q6ZWxlbWVudD4KKyAgICAgIDwveHNkOmNob2ljZT4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YXJpYWJsZS1jbGFzcyIKKwkJICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIgorCQkgICBtaW5PY2N1cnM9IjAiPgorCTx4c2Q6YW5ub3RhdGlvbj4KKwkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KKworCSAgICBUaGUgb3B0aW9uYWwgbmFtZSBvZiB0aGUgY2xhc3MgZm9yIHRoZSBzY3JpcHRpbmcKKwkgICAgdmFyaWFibGUuICBUaGUgZGVmYXVsdCBpcyBqYXZhLmxhbmcuU3RyaW5nLgorCisJICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCTwveHNkOmFubm90YXRpb24+CisKKyAgICAgIDwveHNkOmVsZW1lbnQ+CisKKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZWNsYXJlIgorCQkgICB0eXBlPSJqMmVlOmdlbmVyaWMtYm9vbGVhblR5cGUiCisJCSAgIG1pbk9jY3Vycz0iMCI+CisKKwk8eHNkOmFubm90YXRpb24+CisJICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgICAgV2hldGhlciB0aGUgc2NyaXB0aW5nIHZhcmlhYmxlIGlzIHRvIGJlIGRlZmluZWQKKwkgICAgb3Igbm90LiAgU2VlIFRhZ0V4dHJhSW5mbyBmb3IgZGV0YWlscy4gIFRoaXMKKwkgICAgZWxlbWVudCBpcyBvcHRpb25hbCBhbmQgInRydWUiIGlzIHRoZSBkZWZhdWx0LgorCisJICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCTwveHNkOmFubm90YXRpb24+CisgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNjb3BlIgorCQkgICB0eXBlPSJqMmVlOnZhcmlhYmxlLXNjb3BlVHlwZSIKKwkJICAgbWluT2NjdXJzPSIwIj4KKwk8eHNkOmFubm90YXRpb24+CisJICA8eHNkOmRvY3VtZW50YXRpb24+CisKKwkgICAgVGhlIGVsZW1lbnQgaXMgb3B0aW9uYWwgYW5kICJORVNURUQiIGlzIHRoZSBkZWZhdWx0LgorCisJICA8L3hzZDpkb2N1bWVudGF0aW9uPgorCTwveHNkOmFubm90YXRpb24+CisgICAgICA8L3hzZDplbGVtZW50PgorICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KKyAgPC94c2Q6Y29tcGxleFR5cGU+CisKKzwveHNkOnNjaGVtYT4KKwpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2R0ZC94bWwueHNkIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2R0ZC94bWwueHNkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiZWEwZmQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvZHRkL3htbC54c2QKQEAgLTAsMCArMSw5NiBAQAorPD94bWwgdmVyc2lvbj0nMS4wJz8+Cis8IS0tCisgIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8IURPQ1RZUEUgeHM6c2NoZW1hIFBVQkxJQyAiLS8vVzNDLy9EVEQgWE1MU0NIRU1BIDIwMDEwMi8vRU4iICJYTUxTY2hlbWEuZHRkIiA+Cis8eHM6c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIiB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbDpsYW5nPSJlbiI+CisKKyA8eHM6YW5ub3RhdGlvbj4KKyAgPHhzOmRvY3VtZW50YXRpb24+CisgICBTZWUgaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlLmh0bWwgYW5kCisgICBodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMteG1sIGZvciBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIG5hbWVzcGFjZS4KKyAgPC94czpkb2N1bWVudGF0aW9uPgorIDwveHM6YW5ub3RhdGlvbj4KKworIDx4czphbm5vdGF0aW9uPgorICA8eHM6ZG9jdW1lbnRhdGlvbj5UaGlzIHNjaGVtYSBkZWZpbmVzIGF0dHJpYnV0ZXMgYW5kIGFuIGF0dHJpYnV0ZSBncm91cAorICAgICAgICBzdWl0YWJsZSBmb3IgdXNlIGJ5CisgICAgICAgIHNjaGVtYXMgd2lzaGluZyB0byBhbGxvdyB4bWw6YmFzZSwgeG1sOmxhbmcgb3IgeG1sOnNwYWNlIGF0dHJpYnV0ZXMKKyAgICAgICAgb24gZWxlbWVudHMgdGhleSBkZWZpbmUuCisKKyAgICAgICAgVG8gZW5hYmxlIHRoaXMsIHN1Y2ggYSBzY2hlbWEgbXVzdCBpbXBvcnQgdGhpcyBzY2hlbWEKKyAgICAgICAgZm9yIHRoZSBYTUwgbmFtZXNwYWNlLCBlLmcuIGFzIGZvbGxvd3M6CisgICAgICAgICZsdDtzY2hlbWEgLiAuIC4+CisgICAgICAgICAuIC4gLgorICAgICAgICAgJmx0O2ltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIKKyAgICAgICAgICAgICAgICAgICAgc2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMDMveG1sLnhzZCIvPgorCisgICAgICAgIFN1YnNlcXVlbnRseSwgcXVhbGlmaWVkIHJlZmVyZW5jZSB0byBhbnkgb2YgdGhlIGF0dHJpYnV0ZXMKKyAgICAgICAgb3IgdGhlIGdyb3VwIGRlZmluZWQgYmVsb3cgd2lsbCBoYXZlIHRoZSBkZXNpcmVkIGVmZmVjdCwgZS5nLgorCisgICAgICAgICZsdDt0eXBlIC4gLiAuPgorICAgICAgICAgLiAuIC4KKyAgICAgICAgICZsdDthdHRyaWJ1dGVHcm91cCByZWY9InhtbDpzcGVjaWFsQXR0cnMiLz4KKyAKKyAgICAgICAgIHdpbGwgZGVmaW5lIGEgdHlwZSB3aGljaCB3aWxsIHNjaGVtYS12YWxpZGF0ZSBhbiBpbnN0YW5jZQorICAgICAgICAgZWxlbWVudCB3aXRoIGFueSBvZiB0aG9zZSBhdHRyaWJ1dGVzPC94czpkb2N1bWVudGF0aW9uPgorIDwveHM6YW5ub3RhdGlvbj4KKworIDx4czphbm5vdGF0aW9uPgorICA8eHM6ZG9jdW1lbnRhdGlvbj5JbiBrZWVwaW5nIHdpdGggdGhlIFhNTCBTY2hlbWEgV0cncyBzdGFuZGFyZCB2ZXJzaW9uaW5nCisgICBwb2xpY3ksIHRoaXMgc2NoZW1hIGRvY3VtZW50IHdpbGwgcGVyc2lzdCBhdAorICAgaHR0cDovL3d3dy53My5vcmcvMjAwMS8wMy94bWwueHNkLgorICAgQXQgdGhlIGRhdGUgb2YgaXNzdWUgaXQgY2FuIGFsc28gYmUgZm91bmQgYXQKKyAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDEveG1sLnhzZC4KKyAgIFRoZSBzY2hlbWEgZG9jdW1lbnQgYXQgdGhhdCBVUkkgbWF5IGhvd2V2ZXIgY2hhbmdlIGluIHRoZSBmdXR1cmUsCisgICBpbiBvcmRlciB0byByZW1haW4gY29tcGF0aWJsZSB3aXRoIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBYTUwgU2NoZW1hCisgICBpdHNlbGYuICBJbiBvdGhlciB3b3JkcywgaWYgdGhlIFhNTCBTY2hlbWEgbmFtZXNwYWNlIGNoYW5nZXMsIHRoZSB2ZXJzaW9uCisgICBvZiB0aGlzIGRvY3VtZW50IGF0CisgICBodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2Qgd2lsbCBjaGFuZ2UKKyAgIGFjY29yZGluZ2x5OyB0aGUgdmVyc2lvbiBhdAorICAgaHR0cDovL3d3dy53My5vcmcvMjAwMS8wMy94bWwueHNkIHdpbGwgbm90IGNoYW5nZS4KKyAgPC94czpkb2N1bWVudGF0aW9uPgorIDwveHM6YW5ub3RhdGlvbj4KKworIDx4czphdHRyaWJ1dGUgbmFtZT0ibGFuZyIgdHlwZT0ieHM6bGFuZ3VhZ2UiPgorICA8eHM6YW5ub3RhdGlvbj4KKyAgIDx4czpkb2N1bWVudGF0aW9uPkluIGR1ZSBjb3Vyc2UsIHdlIHNob3VsZCBpbnN0YWxsIHRoZSByZWxldmFudCBJU08gMi0gYW5kIDMtbGV0dGVyCisgICAgICAgICBjb2RlcyBhcyB0aGUgZW51bWVyYXRlZCBwb3NzaWJsZSB2YWx1ZXMgLiAuIC48L3hzOmRvY3VtZW50YXRpb24+CisgIDwveHM6YW5ub3RhdGlvbj4KKyA8L3hzOmF0dHJpYnV0ZT4KKworIDx4czphdHRyaWJ1dGUgbmFtZT0ic3BhY2UiIGRlZmF1bHQ9InByZXNlcnZlIj4KKyAgPHhzOnNpbXBsZVR5cGU+CisgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6TkNOYW1lIj4KKyAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImRlZmF1bHQiLz4KKyAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InByZXNlcnZlIi8+CisgICA8L3hzOnJlc3RyaWN0aW9uPgorICA8L3hzOnNpbXBsZVR5cGU+CisgPC94czphdHRyaWJ1dGU+CisKKyA8eHM6YXR0cmlidXRlIG5hbWU9ImJhc2UiIHR5cGU9InhzOmFueVVSSSI+CisgIDx4czphbm5vdGF0aW9uPgorICAgPHhzOmRvY3VtZW50YXRpb24+U2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL3htbGJhc2UvIGZvcgorICAgICAgICAgICAgICAgICAgICAgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBhdHRyaWJ1dGUuPC94czpkb2N1bWVudGF0aW9uPgorICA8L3hzOmFubm90YXRpb24+CisgPC94czphdHRyaWJ1dGU+CisKKyA8eHM6YXR0cmlidXRlR3JvdXAgbmFtZT0ic3BlY2lhbEF0dHJzIj4KKyAgPHhzOmF0dHJpYnV0ZSByZWY9InhtbDpiYXNlIi8+CisgIDx4czphdHRyaWJ1dGUgcmVmPSJ4bWw6bGFuZyIvPgorICA8eHM6YXR0cmlidXRlIHJlZj0ieG1sOnNwYWNlIi8+CisgPC94czphdHRyaWJ1dGVHcm91cD4KKworPC94czpzY2hlbWE+CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9GaWx0ZXIuamF2YSBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L0ZpbHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiNmQ2YjcKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9GaWx0ZXIuamF2YQpAQCAtMCwwICsxLDkxIEBACisvKgorKiBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCitwYWNrYWdlIGphdmF4LnNlcnZsZXQ7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCisJLyoqIAorCSogQSBmaWx0ZXIgaXMgYW4gb2JqZWN0IHRoYXQgcGVyZm9ybXMgZmlsdGVyaW5nIHRhc2tzIG9uIGVpdGhlciB0aGUgcmVxdWVzdCB0byBhIHJlc291cmNlIChhIHNlcnZsZXQgb3Igc3RhdGljIGNvbnRlbnQpLCBvciBvbiB0aGUgcmVzcG9uc2UgZnJvbSBhIHJlc291cmNlLCBvciBib3RoLgorICAgICAgICAqIDxicj48YnI+CisJKiBGaWx0ZXJzIHBlcmZvcm0gZmlsdGVyaW5nIGluIHRoZSA8Y29kZT5kb0ZpbHRlcjwvY29kZT4gbWV0aG9kLiBFdmVyeSBGaWx0ZXIgaGFzIGFjY2VzcyB0byAKKwkqKiBhIEZpbHRlckNvbmZpZyBvYmplY3QgZnJvbSB3aGljaCBpdCBjYW4gb2J0YWluIGl0cyBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzLCBhCisJKiogcmVmZXJlbmNlIHRvIHRoZSBTZXJ2bGV0Q29udGV4dCB3aGljaCBpdCBjYW4gdXNlLCBmb3IgZXhhbXBsZSwgdG8gbG9hZCByZXNvdXJjZXMKKwkqKiBuZWVkZWQgZm9yIGZpbHRlcmluZyB0YXNrcy4KKwkqKiA8cD4KKwkqKiBGaWx0ZXJzIGFyZSBjb25maWd1cmVkIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3Igb2YgYSB3ZWIgYXBwbGljYXRpb24KKwkqKiA8cD4KKwkqKiBFeGFtcGxlcyB0aGF0IGhhdmUgYmVlbiBpZGVudGlmaWVkIGZvciB0aGlzIGRlc2lnbiBhcmU8YnI+CisJKiogMSkgQXV0aGVudGljYXRpb24gRmlsdGVycyA8YnI+CisJKiogMikgTG9nZ2luZyBhbmQgQXVkaXRpbmcgRmlsdGVycyA8YnI+CisJKiogMykgSW1hZ2UgY29udmVyc2lvbiBGaWx0ZXJzIDxicj4KKyAgICAJKiogNCkgRGF0YSBjb21wcmVzc2lvbiBGaWx0ZXJzIDxicj4KKwkqKiA1KSBFbmNyeXB0aW9uIEZpbHRlcnMgPGJyPgorCSoqIDYpIFRva2VuaXppbmcgRmlsdGVycyA8YnI+CisJKiogNykgRmlsdGVycyB0aGF0IHRyaWdnZXIgcmVzb3VyY2UgYWNjZXNzIGV2ZW50cyA8YnI+CisJKiogOCkgWFNML1QgZmlsdGVycyA8YnI+CisJKiogOSkgTWltZS10eXBlIGNoYWluIEZpbHRlciA8YnI+CisJICogQHNpbmNlCVNlcnZsZXQgMi4zCisJKi8KKworcHVibGljIGludGVyZmFjZSBGaWx0ZXIgeworCisJLyoqIAorCSogQ2FsbGVkIGJ5IHRoZSB3ZWIgY29udGFpbmVyIHRvIGluZGljYXRlIHRvIGEgZmlsdGVyIHRoYXQgaXQgaXMgYmVpbmcgcGxhY2VkIGludG8KKwkqIHNlcnZpY2UuIFRoZSBzZXJ2bGV0IGNvbnRhaW5lciBjYWxscyB0aGUgaW5pdCBtZXRob2QgZXhhY3RseSBvbmNlIGFmdGVyIGluc3RhbnRpYXRpbmcgdGhlCisJKiBmaWx0ZXIuIFRoZSBpbml0IG1ldGhvZCBtdXN0IGNvbXBsZXRlIHN1Y2Nlc3NmdWxseSBiZWZvcmUgdGhlIGZpbHRlciBpcyBhc2tlZCB0byBkbyBhbnkKKwkqIGZpbHRlcmluZyB3b3JrLiA8YnI+PGJyPgorCisgICAgIAkqIFRoZSB3ZWIgY29udGFpbmVyIGNhbm5vdCBwbGFjZSB0aGUgZmlsdGVyIGludG8gc2VydmljZSBpZiB0aGUgaW5pdCBtZXRob2QgZWl0aGVyPGJyPgorICAgICAgICAqIDEuVGhyb3dzIGEgU2VydmxldEV4Y2VwdGlvbiA8YnI+CisgICAgICAgICogMi5Eb2VzIG5vdCByZXR1cm4gd2l0aGluIGEgdGltZSBwZXJpb2QgZGVmaW5lZCBieSB0aGUgd2ViIGNvbnRhaW5lciAKKwkqLworCXB1YmxpYyB2b2lkIGluaXQoRmlsdGVyQ29uZmlnIGZpbHRlckNvbmZpZykgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb247CisJCisJCisJLyoqCisJKiBUaGUgPGNvZGU+ZG9GaWx0ZXI8L2NvZGU+IG1ldGhvZCBvZiB0aGUgRmlsdGVyIGlzIGNhbGxlZCBieSB0aGUgY29udGFpbmVyCisJKiBlYWNoIHRpbWUgYSByZXF1ZXN0L3Jlc3BvbnNlIHBhaXIgaXMgcGFzc2VkIHRocm91Z2ggdGhlIGNoYWluIGR1ZQorCSogdG8gYSBjbGllbnQgcmVxdWVzdCBmb3IgYSByZXNvdXJjZSBhdCB0aGUgZW5kIG9mIHRoZSBjaGFpbi4gVGhlIEZpbHRlckNoYWluIHBhc3NlZCBpbiB0byB0aGlzCisJKiBtZXRob2QgYWxsb3dzIHRoZSBGaWx0ZXIgdG8gcGFzcyBvbiB0aGUgcmVxdWVzdCBhbmQgcmVzcG9uc2UgdG8gdGhlIG5leHQgZW50aXR5IGluIHRoZQorCSogY2hhaW4uPHA+CisJKiBBIHR5cGljYWwgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2Qgd291bGQgZm9sbG93IHRoZSBmb2xsb3dpbmcgcGF0dGVybjotIDxicj4KKwkqIDEuIEV4YW1pbmUgdGhlIHJlcXVlc3Q8YnI+CisJKiAyLiBPcHRpb25hbGx5IHdyYXAgdGhlIHJlcXVlc3Qgb2JqZWN0IHdpdGggYSBjdXN0b20gaW1wbGVtZW50YXRpb24gdG8KKwkqIGZpbHRlciBjb250ZW50IG9yIGhlYWRlcnMgZm9yIGlucHV0IGZpbHRlcmluZyA8YnI+CisJKiAzLiBPcHRpb25hbGx5IHdyYXAgdGhlIHJlc3BvbnNlIG9iamVjdCB3aXRoIGEgY3VzdG9tIGltcGxlbWVudGF0aW9uIHRvCisJKiBmaWx0ZXIgY29udGVudCBvciBoZWFkZXJzIGZvciBvdXRwdXQgZmlsdGVyaW5nIDxicj4KKwkqIDQuIGEpIDxzdHJvbmc+RWl0aGVyPC9zdHJvbmc+IGludm9rZSB0aGUgbmV4dCBlbnRpdHkgaW4gdGhlIGNoYWluIHVzaW5nIHRoZSBGaWx0ZXJDaGFpbiBvYmplY3QgKDxjb2RlPmNoYWluLmRvRmlsdGVyKCk8L2NvZGU+KSwgPGJyPiAgIAorCSoqIDQuIGIpIDxzdHJvbmc+b3I8L3N0cm9uZz4gbm90IHBhc3Mgb24gdGhlIHJlcXVlc3QvcmVzcG9uc2UgcGFpciB0byB0aGUgbmV4dCBlbnRpdHkgaW4gdGhlIGZpbHRlciBjaGFpbiB0byBibG9jayB0aGUgcmVxdWVzdCBwcm9jZXNzaW5nPGJyPgorCSoqIDUuIERpcmVjdGx5IHNldCBoZWFkZXJzIG9uIHRoZSByZXNwb25zZSBhZnRlciBpbnZvY2F0aW9uIG9mIHRoZSBuZXh0IGVudGl0eSBpbiB0aGUgZmlsdGVyIGNoYWluLgorCSoqLworICAgIHB1YmxpYyB2b2lkIGRvRmlsdGVyICggU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLCBGaWx0ZXJDaGFpbiBjaGFpbiApIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbjsKKworCS8qKgorCSogQ2FsbGVkIGJ5IHRoZSB3ZWIgY29udGFpbmVyIHRvIGluZGljYXRlIHRvIGEgZmlsdGVyIHRoYXQgaXQgaXMgYmVpbmcgdGFrZW4gb3V0IG9mIHNlcnZpY2UuIFRoaXMgCisJKiBtZXRob2QgaXMgb25seSBjYWxsZWQgb25jZSBhbGwgdGhyZWFkcyB3aXRoaW4gdGhlIGZpbHRlcidzIGRvRmlsdGVyIG1ldGhvZCBoYXZlIGV4aXRlZCBvciBhZnRlcgorCSogYSB0aW1lb3V0IHBlcmlvZCBoYXMgcGFzc2VkLiBBZnRlciB0aGUgd2ViIGNvbnRhaW5lciBjYWxscyB0aGlzIG1ldGhvZCwgaXQgd2lsbCBub3QgY2FsbCB0aGUKKwkqIGRvRmlsdGVyIG1ldGhvZCBhZ2FpbiBvbiB0aGlzIGluc3RhbmNlIG9mIHRoZSBmaWx0ZXIuIDxicj48YnI+CisJKiAKKyAgICAgCSogVGhpcyBtZXRob2QgZ2l2ZXMgdGhlIGZpbHRlciBhbiBvcHBvcnR1bml0eSB0byBjbGVhbiB1cCBhbnkgcmVzb3VyY2VzIHRoYXQgYXJlIGJlaW5nIGhlbGQgKGZvcgorCSogZXhhbXBsZSwgbWVtb3J5LCBmaWxlIGhhbmRsZXMsIHRocmVhZHMpIGFuZCBtYWtlIHN1cmUgdGhhdCBhbnkgcGVyc2lzdGVudCBzdGF0ZSBpcyBzeW5jaHJvbml6ZWQKKwkqIHdpdGggdGhlIGZpbHRlcidzIGN1cnJlbnQgc3RhdGUgaW4gbWVtb3J5LgorCSovCisKKwlwdWJsaWMgdm9pZCBkZXN0cm95KCk7CisKKworfQorCmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9GaWx0ZXJDaGFpbi5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvRmlsdGVyQ2hhaW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjIxMGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvRmlsdGVyQ2hhaW4uamF2YQpAQCAtMCwwICsxLDQ1IEBACisvKgorKiBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCitwYWNrYWdlIGphdmF4LnNlcnZsZXQ7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgKiBBIEZpbHRlckNoYWluIGlzIGFuIG9iamVjdCBwcm92aWRlZCBieSB0aGUgc2VydmxldCBjb250YWluZXIgdG8gdGhlIGRldmVsb3BlcgorICAgICogZ2l2aW5nIGEgdmlldyBpbnRvIHRoZSBpbnZvY2F0aW9uIGNoYWluIG9mIGEgZmlsdGVyZWQgcmVxdWVzdCBmb3IgYSByZXNvdXJjZS4gRmlsdGVycworICAgICogdXNlIHRoZSBGaWx0ZXJDaGFpbiB0byBpbnZva2UgdGhlIG5leHQgZmlsdGVyIGluIHRoZSBjaGFpbiwgb3IgaWYgdGhlIGNhbGxpbmcgZmlsdGVyCisgICAgKiBpcyB0aGUgbGFzdCBmaWx0ZXIgaW4gdGhlIGNoYWluLCB0byBpbnZva2UgdGhlIHJlc291cmNlIGF0IHRoZSBlbmQgb2YgdGhlIGNoYWluLgorICAgICoKKyAgICAqIEBzZWUgRmlsdGVyCisgICAgKiBAc2luY2UgU2VydmxldCAyLjMKKyAgICAqKi8KKworcHVibGljIGludGVyZmFjZSBGaWx0ZXJDaGFpbiB7CisJCisJLyoqCisJKiBDYXVzZXMgdGhlIG5leHQgZmlsdGVyIGluIHRoZSBjaGFpbiB0byBiZSBpbnZva2VkLCBvciBpZiB0aGUgY2FsbGluZyBmaWx0ZXIgaXMgdGhlIGxhc3QgZmlsdGVyCisJKiBpbiB0aGUgY2hhaW4sIGNhdXNlcyB0aGUgcmVzb3VyY2UgYXQgdGhlIGVuZCBvZiB0aGUgY2hhaW4gdG8gYmUgaW52b2tlZC4KKwkqCisJKiBAcGFyYW0gcmVxdWVzdCB0aGUgcmVxdWVzdCB0byBwYXNzIGFsb25nIHRoZSBjaGFpbi4KKwkqIEBwYXJhbSByZXNwb25zZSB0aGUgcmVzcG9uc2UgdG8gcGFzcyBhbG9uZyB0aGUgY2hhaW4uCisJKgorCSogQHNpbmNlIDIuMworCSovCisJCisgICAgcHVibGljIHZvaWQgZG9GaWx0ZXIgKCBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UgKSB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb247CisKK30KKwpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvRmlsdGVyQ29uZmlnLmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9GaWx0ZXJDb25maWcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWM2MDlkCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvRmlsdGVyQ29uZmlnLmphdmEKQEAgLTAsMCArMSw5MSBAQAorLyoKKyogQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitwYWNrYWdlIGphdmF4LnNlcnZsZXQ7CisKKworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKKworCSAvKiogCisJICoKKwkgKiBBIGZpbHRlciBjb25maWd1cmF0aW9uIG9iamVjdCB1c2VkIGJ5IGEgc2VydmxldCBjb250YWluZXIKKwkgKiB0byBwYXNzIGluZm9ybWF0aW9uIHRvIGEgZmlsdGVyIGR1cmluZyBpbml0aWFsaXphdGlvbi4KKwkgKiBAc2VlIEZpbHRlciAKKwkgICogQHNpbmNlCVNlcnZsZXQgMi4zCisJICoKKwkgKi8KKworCitwdWJsaWMgaW50ZXJmYWNlIEZpbHRlckNvbmZpZyB7CisKKwkvKiogCisJKiBSZXR1cm5zIHRoZSBmaWx0ZXItbmFtZSBvZiB0aGlzIGZpbHRlciBhcyBkZWZpbmVkIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuIAorCSovCisJCisJcHVibGljIFN0cmluZyBnZXRGaWx0ZXJOYW1lKCk7CisKKworIC8qKgorICAgICAqIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIHtAbGluayBTZXJ2bGV0Q29udGV4dH0gaW4gd2hpY2ggdGhlIGNhbGxlcgorICAgICAqIGlzIGV4ZWN1dGluZy4KKyAgICAgKgorICAgICAqCisgICAgICogQHJldHVybgkJYSB7QGxpbmsgU2VydmxldENvbnRleHR9IG9iamVjdCwgdXNlZAorICAgICAqCQkJYnkgdGhlIGNhbGxlciB0byBpbnRlcmFjdCB3aXRoIGl0cyBzZXJ2bGV0IAorICAgICAqICAgICAgICAgICAgICAgICAgY29udGFpbmVyCisgICAgICogCisgICAgICogQHNlZQkJU2VydmxldENvbnRleHQKKyAgICAgKgorICAgICAqLworCisgICAgcHVibGljIFNlcnZsZXRDb250ZXh0IGdldFNlcnZsZXRDb250ZXh0KCk7CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIDxjb2RlPlN0cmluZzwvY29kZT4gY29udGFpbmluZyB0aGUgdmFsdWUgb2YgdGhlIAorICAgICAqIG5hbWVkIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgCisgICAgICogdGhlIHBhcmFtZXRlciBkb2VzIG5vdCBleGlzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lCWEgPGNvZGU+U3RyaW5nPC9jb2RlPiBzcGVjaWZ5aW5nIHRoZSBuYW1lCisgICAgICoJCQlvZiB0aGUgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyCisgICAgICoKKyAgICAgKiBAcmV0dXJuCQlhIDxjb2RlPlN0cmluZzwvY29kZT4gY29udGFpbmluZyB0aGUgdmFsdWUgCisgICAgICoJCQlvZiB0aGUgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyCisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5pdFBhcmFtZXRlcihTdHJpbmcgbmFtZSk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG5hbWVzIG9mIHRoZSBmaWx0ZXIncyBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzCisgICAgICogYXMgYW4gPGNvZGU+RW51bWVyYXRpb248L2NvZGU+IG9mIDxjb2RlPlN0cmluZzwvY29kZT4gb2JqZWN0cywgCisgICAgICogb3IgYW4gZW1wdHkgPGNvZGU+RW51bWVyYXRpb248L2NvZGU+IGlmIHRoZSBmaWx0ZXIgaGFzCisgICAgICogbm8gaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycy4KKyAgICAgKgorICAgICAqIEByZXR1cm4JCWFuIDxjb2RlPkVudW1lcmF0aW9uPC9jb2RlPiBvZiA8Y29kZT5TdHJpbmc8L2NvZGU+IAorICAgICAqCQkJb2JqZWN0cyBjb250YWluaW5nIHRoZSBuYW1lcyBvZiB0aGUgZmlsdGVyJ3MgCisgICAgICoJCQlpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzCisgICAgICoKKyAgICAgKgorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0SW5pdFBhcmFtZXRlck5hbWVzKCk7CisKKworCisKK30KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L0dlbmVyaWNTZXJ2bGV0LmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9HZW5lcmljU2VydmxldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0MDgxZDcKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9HZW5lcmljU2VydmxldC5qYXZhCkBAIC0wLDAgKzEsMzIzIEBACisvKgorKiBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCitwYWNrYWdlIGphdmF4LnNlcnZsZXQ7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKKworLyoqCisgKgorICogRGVmaW5lcyBhIGdlbmVyaWMsIHByb3RvY29sLWluZGVwZW5kZW50CisgKiBzZXJ2bGV0LiBUbyB3cml0ZSBhbiBIVFRQIHNlcnZsZXQgZm9yIHVzZSBvbiB0aGUKKyAqIFdlYiwgZXh0ZW5kIHtAbGluayBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXR9IGluc3RlYWQuCisgKgorICogPHA+PGNvZGU+R2VuZXJpY1NlcnZsZXQ8L2NvZGU+IGltcGxlbWVudHMgdGhlIDxjb2RlPlNlcnZsZXQ8L2NvZGU+CisgKiBhbmQgPGNvZGU+U2VydmxldENvbmZpZzwvY29kZT4gaW50ZXJmYWNlcy4gPGNvZGU+R2VuZXJpY1NlcnZsZXQ8L2NvZGU+CisgKiBtYXkgYmUgZGlyZWN0bHkgZXh0ZW5kZWQgYnkgYSBzZXJ2bGV0LCBhbHRob3VnaCBpdCdzIG1vcmUgY29tbW9uIHRvIGV4dGVuZAorICogYSBwcm90b2NvbC1zcGVjaWZpYyBzdWJjbGFzcyBzdWNoIGFzIDxjb2RlPkh0dHBTZXJ2bGV0PC9jb2RlPi4KKyAqCisgKiA8cD48Y29kZT5HZW5lcmljU2VydmxldDwvY29kZT4gbWFrZXMgd3JpdGluZyBzZXJ2bGV0cworICogZWFzaWVyLiBJdCBwcm92aWRlcyBzaW1wbGUgdmVyc2lvbnMgb2YgdGhlIGxpZmVjeWNsZSBtZXRob2RzIAorICogPGNvZGU+aW5pdDwvY29kZT4gYW5kIDxjb2RlPmRlc3Ryb3k8L2NvZGU+IGFuZCBvZiB0aGUgbWV0aG9kcyAKKyAqIGluIHRoZSA8Y29kZT5TZXJ2bGV0Q29uZmlnPC9jb2RlPiBpbnRlcmZhY2UuIDxjb2RlPkdlbmVyaWNTZXJ2bGV0PC9jb2RlPgorICogYWxzbyBpbXBsZW1lbnRzIHRoZSA8Y29kZT5sb2c8L2NvZGU+IG1ldGhvZCwgZGVjbGFyZWQgaW4gdGhlCisgKiA8Y29kZT5TZXJ2bGV0Q29udGV4dDwvY29kZT4gaW50ZXJmYWNlLiAKKyAqCisgKiA8cD5UbyB3cml0ZSBhIGdlbmVyaWMgc2VydmxldCwgeW91IG5lZWQgb25seQorICogb3ZlcnJpZGUgdGhlIGFic3RyYWN0IDxjb2RlPnNlcnZpY2U8L2NvZGU+IG1ldGhvZC4gCisgKgorICoKKyAqIEBhdXRob3IgCVZhcmlvdXMKKyAqIEB2ZXJzaW9uIAkkVmVyc2lvbiQKKyAqCisgKgorICoKKyAqLworCisgCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgR2VuZXJpY1NlcnZsZXQgCisgICAgaW1wbGVtZW50cyBTZXJ2bGV0LCBTZXJ2bGV0Q29uZmlnLCBqYXZhLmlvLlNlcmlhbGl6YWJsZQoreworCisgICAgcHJpdmF0ZSB0cmFuc2llbnQgU2VydmxldENvbmZpZyBjb25maWc7CisgICAgCisKKyAgICAvKioKKyAgICAgKgorICAgICAqIERvZXMgbm90aGluZy4gQWxsIG9mIHRoZSBzZXJ2bGV0IGluaXRpYWxpemF0aW9uCisgICAgICogaXMgZG9uZSBieSBvbmUgb2YgdGhlIDxjb2RlPmluaXQ8L2NvZGU+IG1ldGhvZHMuCisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyBHZW5lcmljU2VydmxldCgpIHsgfQorICAgIAorICAgIAorICAgIAorICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IHRoZSBzZXJ2bGV0IGNvbnRhaW5lciB0byBpbmRpY2F0ZSB0byBhIHNlcnZsZXQgdGhhdCB0aGUKKyAgICAgKiBzZXJ2bGV0IGlzIGJlaW5nIHRha2VuIG91dCBvZiBzZXJ2aWNlLiAgU2VlIHtAbGluayBTZXJ2bGV0I2Rlc3Ryb3l9LgorICAgICAqCisgICAgICogCisgICAgICovCisKKyAgICBwdWJsaWMgdm9pZCBkZXN0cm95KCkgeworICAgIH0KKyAgICAKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiBjb250YWluaW5nIHRoZSB2YWx1ZSBvZiB0aGUgbmFtZWQKKyAgICAgKiBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBwYXJhbWV0ZXIgZG9lcworICAgICAqIG5vdCBleGlzdC4gIFNlZSB7QGxpbmsgU2VydmxldENvbmZpZyNnZXRJbml0UGFyYW1ldGVyfS4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgbWV0aG9kIGlzIHN1cHBsaWVkIGZvciBjb252ZW5pZW5jZS4gSXQgZ2V0cyB0aGUgCisgICAgICogdmFsdWUgb2YgdGhlIG5hbWVkIHBhcmFtZXRlciBmcm9tIHRoZSBzZXJ2bGV0J3MgCisgICAgICogPGNvZGU+U2VydmxldENvbmZpZzwvY29kZT4gb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgCQlhIDxjb2RlPlN0cmluZzwvY29kZT4gc3BlY2lmeWluZyB0aGUgbmFtZSAKKyAgICAgKgkJCQlvZiB0aGUgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFN0cmluZyAJCWEgPGNvZGU+U3RyaW5nPC9jb2RlPiBjb250YWluaW5nIHRoZSB2YWx1ZQorICAgICAqCQkJCW9mIHRoZSBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIKKyAgICAgKgorICAgICAqLyAKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5pdFBhcmFtZXRlcihTdHJpbmcgbmFtZSkgeworCXJldHVybiBnZXRTZXJ2bGV0Q29uZmlnKCkuZ2V0SW5pdFBhcmFtZXRlcihuYW1lKTsKKyAgICB9CisgICAgCisgICAgCisKKyAgIC8qKgorICAgICogUmV0dXJucyB0aGUgbmFtZXMgb2YgdGhlIHNlcnZsZXQncyBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzIAorICAgICogYXMgYW4gPGNvZGU+RW51bWVyYXRpb248L2NvZGU+IG9mIDxjb2RlPlN0cmluZzwvY29kZT4gb2JqZWN0cywKKyAgICAqIG9yIGFuIGVtcHR5IDxjb2RlPkVudW1lcmF0aW9uPC9jb2RlPiBpZiB0aGUgc2VydmxldCBoYXMgbm8KKyAgICAqIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMuICBTZWUge0BsaW5rCisgICAgKiBTZXJ2bGV0Q29uZmlnI2dldEluaXRQYXJhbWV0ZXJOYW1lc30uCisgICAgKgorICAgICogPHA+VGhpcyBtZXRob2QgaXMgc3VwcGxpZWQgZm9yIGNvbnZlbmllbmNlLiBJdCBnZXRzIHRoZSAKKyAgICAqIHBhcmFtZXRlciBuYW1lcyBmcm9tIHRoZSBzZXJ2bGV0J3MgPGNvZGU+U2VydmxldENvbmZpZzwvY29kZT4gb2JqZWN0LiAKKyAgICAqCisgICAgKgorICAgICogQHJldHVybiBFbnVtZXJhdGlvbiAJYW4gZW51bWVyYXRpb24gb2YgPGNvZGU+U3RyaW5nPC9jb2RlPgorICAgICoJCQkJb2JqZWN0cyBjb250YWluaW5nIHRoZSBuYW1lcyBvZiAKKyAgICAqCQkJCXRoZSBzZXJ2bGV0J3MgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycworICAgICoKKyAgICAqLworCisgICAgcHVibGljIEVudW1lcmF0aW9uIGdldEluaXRQYXJhbWV0ZXJOYW1lcygpIHsKKwlyZXR1cm4gZ2V0U2VydmxldENvbmZpZygpLmdldEluaXRQYXJhbWV0ZXJOYW1lcygpOworICAgIH0gICAKKyAgICAKKyAgICAgCisgCisgICAgIAorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGlzIHNlcnZsZXQncyB7QGxpbmsgU2VydmxldENvbmZpZ30gb2JqZWN0LgorICAgICAqCisgICAgICogQHJldHVybiBTZXJ2bGV0Q29uZmlnIAl0aGUgPGNvZGU+U2VydmxldENvbmZpZzwvY29kZT4gb2JqZWN0CisgICAgICoJCQkJdGhhdCBpbml0aWFsaXplZCB0aGlzIHNlcnZsZXQKKyAgICAgKgorICAgICAqLworICAgIAorICAgIHB1YmxpYyBTZXJ2bGV0Q29uZmlnIGdldFNlcnZsZXRDb25maWcoKSB7CisJcmV0dXJuIGNvbmZpZzsKKyAgICB9CisgICAgCisgICAgCisgCisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUge0BsaW5rIFNlcnZsZXRDb250ZXh0fSBpbiB3aGljaCB0aGlzIHNlcnZsZXQKKyAgICAgKiBpcyBydW5uaW5nLiAgU2VlIHtAbGluayBTZXJ2bGV0Q29uZmlnI2dldFNlcnZsZXRDb250ZXh0fS4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgbWV0aG9kIGlzIHN1cHBsaWVkIGZvciBjb252ZW5pZW5jZS4gSXQgZ2V0cyB0aGUgCisgICAgICogY29udGV4dCBmcm9tIHRoZSBzZXJ2bGV0J3MgPGNvZGU+U2VydmxldENvbmZpZzwvY29kZT4gb2JqZWN0LgorICAgICAqCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFNlcnZsZXRDb250ZXh0IAl0aGUgPGNvZGU+U2VydmxldENvbnRleHQ8L2NvZGU+IG9iamVjdAorICAgICAqCQkJCXBhc3NlZCB0byB0aGlzIHNlcnZsZXQgYnkgdGhlIDxjb2RlPmluaXQ8L2NvZGU+CisgICAgICoJCQkJbWV0aG9kCisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyBTZXJ2bGV0Q29udGV4dCBnZXRTZXJ2bGV0Q29udGV4dCgpIHsKKwlyZXR1cm4gZ2V0U2VydmxldENvbmZpZygpLmdldFNlcnZsZXRDb250ZXh0KCk7CisgICAgfQorCisKKworIAorCisgICAgLyoqCisgICAgICogUmV0dXJucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VydmxldCwgc3VjaCBhcyAKKyAgICAgKiBhdXRob3IsIHZlcnNpb24sIGFuZCBjb3B5cmlnaHQuIAorICAgICAqIEJ5IGRlZmF1bHQsIHRoaXMgbWV0aG9kIHJldHVybnMgYW4gZW1wdHkgc3RyaW5nLiAgT3ZlcnJpZGUgdGhpcyBtZXRob2QKKyAgICAgKiB0byBoYXZlIGl0IHJldHVybiBhIG1lYW5pbmdmdWwgdmFsdWUuICBTZWUge0BsaW5rCisgICAgICogU2VydmxldCNnZXRTZXJ2bGV0SW5mb30uCisgICAgICoKKyAgICAgKgorICAgICAqIEByZXR1cm4gU3RyaW5nIAkJaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBzZXJ2bGV0LCBieSBkZWZhdWx0IGFuCisgICAgICogCQkJCWVtcHR5IHN0cmluZworICAgICAqCisgICAgICovCisgICAgCisgICAgcHVibGljIFN0cmluZyBnZXRTZXJ2bGV0SW5mbygpIHsKKwlyZXR1cm4gIiI7CisgICAgfQorCisKKworCisgICAgLyoqCisgICAgICoKKyAgICAgKiBDYWxsZWQgYnkgdGhlIHNlcnZsZXQgY29udGFpbmVyIHRvIGluZGljYXRlIHRvIGEgc2VydmxldCB0aGF0IHRoZQorICAgICAqIHNlcnZsZXQgaXMgYmVpbmcgcGxhY2VkIGludG8gc2VydmljZS4gIFNlZSB7QGxpbmsgU2VydmxldCNpbml0fS4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgaW1wbGVtZW50YXRpb24gc3RvcmVzIHRoZSB7QGxpbmsgU2VydmxldENvbmZpZ30KKyAgICAgKiBvYmplY3QgaXQgcmVjZWl2ZXMgZnJvbSB0aGUgc2VydmxldCBjb250YWluZXIgZm9yIGxhdGVyIHVzZS4KKyAgICAgKiBXaGVuIG92ZXJyaWRpbmcgdGhpcyBmb3JtIG9mIHRoZSBtZXRob2QsIGNhbGwgCisgICAgICogPGNvZGU+c3VwZXIuaW5pdChjb25maWcpPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25maWcgCQkJdGhlIDxjb2RlPlNlcnZsZXRDb25maWc8L2NvZGU+IG9iamVjdAorICAgICAqCQkJCQl0aGF0IGNvbnRhaW5zIGNvbmZpZ3V0YXRpb24KKyAgICAgKgkJCQkJaW5mb3JtYXRpb24gZm9yIHRoaXMgc2VydmxldAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uIAlpZiBhbiBleGNlcHRpb24gb2NjdXJzIHRoYXQKKyAgICAgKgkJCQkJaW50ZXJydXB0cyB0aGUgc2VydmxldCdzIG5vcm1hbAorICAgICAqCQkJCQlvcGVyYXRpb24KKyAgICAgKgorICAgICAqIAorICAgICAqIEBzZWUgCQkJCVVuYXZhaWxhYmxlRXhjZXB0aW9uCisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIGluaXQoU2VydmxldENvbmZpZyBjb25maWcpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKKwl0aGlzLmNvbmZpZyA9IGNvbmZpZzsKKwl0aGlzLmluaXQoKTsKKyAgICB9CisKKworCisKKworICAgIC8qKgorICAgICAqCisgICAgICogQSBjb252ZW5pZW5jZSBtZXRob2Qgd2hpY2ggY2FuIGJlIG92ZXJyaWRkZW4gc28gdGhhdCB0aGVyZSdzIG5vIG5lZWQKKyAgICAgKiB0byBjYWxsIDxjb2RlPnN1cGVyLmluaXQoY29uZmlnKTwvY29kZT4uCisgICAgICoKKyAgICAgKiA8cD5JbnN0ZWFkIG9mIG92ZXJyaWRpbmcge0BsaW5rICNpbml0KFNlcnZsZXRDb25maWcpfSwgc2ltcGx5IG92ZXJyaWRlCisgICAgICogdGhpcyBtZXRob2QgYW5kIGl0IHdpbGwgYmUgY2FsbGVkIGJ5CisgICAgICogPGNvZGU+R2VuZXJpY1NlcnZsZXQuaW5pdChTZXJ2bGV0Q29uZmlnIGNvbmZpZyk8L2NvZGU+LgorICAgICAqIFRoZSA8Y29kZT5TZXJ2bGV0Q29uZmlnPC9jb2RlPiBvYmplY3QgY2FuIHN0aWxsIGJlIHJldHJpZXZlZCB2aWEge0BsaW5rCisgICAgICogI2dldFNlcnZsZXRDb25maWd9LiAKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiAJaWYgYW4gZXhjZXB0aW9uIG9jY3VycyB0aGF0CisgICAgICoJCQkJCWludGVycnVwdHMgdGhlIHNlcnZsZXQncworICAgICAqCQkJCQlub3JtYWwgb3BlcmF0aW9uCisgICAgICoKKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBpbml0KCkgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgfQorICAgIAorCisKKworICAgIC8qKgorICAgICAqIAorICAgICAqIFdyaXRlcyB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UgdG8gYSBzZXJ2bGV0IGxvZyBmaWxlLCBwcmVwZW5kZWQgYnkgdGhlCisgICAgICogc2VydmxldCdzIG5hbWUuICBTZWUge0BsaW5rIFNlcnZsZXRDb250ZXh0I2xvZyhTdHJpbmcpfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtc2cgCWEgPGNvZGU+U3RyaW5nPC9jb2RlPiBzcGVjaWZ5aW5nCisgICAgICoJCQl0aGUgbWVzc2FnZSB0byBiZSB3cml0dGVuIHRvIHRoZSBsb2cgZmlsZQorICAgICAqCisgICAgICovCisgICAgIAorICAgIHB1YmxpYyB2b2lkIGxvZyhTdHJpbmcgbXNnKSB7CisJZ2V0U2VydmxldENvbnRleHQoKS5sb2coZ2V0U2VydmxldE5hbWUoKSArICI6ICIrIG1zZyk7CisgICAgfQorICAgCisgICAKKyAgIAorICAgCisgICAgLyoqCisgICAgICogV3JpdGVzIGFuIGV4cGxhbmF0b3J5IG1lc3NhZ2UgYW5kIGEgc3RhY2sgdHJhY2UKKyAgICAgKiBmb3IgYSBnaXZlbiA8Y29kZT5UaHJvd2FibGU8L2NvZGU+IGV4Y2VwdGlvbgorICAgICAqIHRvIHRoZSBzZXJ2bGV0IGxvZyBmaWxlLCBwcmVwZW5kZWQgYnkgdGhlIHNlcnZsZXQncyBuYW1lLgorICAgICAqIFNlZSB7QGxpbmsgU2VydmxldENvbnRleHQjbG9nKFN0cmluZywgVGhyb3dhYmxlKX0uCisgICAgICoKKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXNzYWdlIAkJYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHRoYXQgZGVzY3JpYmVzCisgICAgICoJCQkJdGhlIGVycm9yIG9yIGV4Y2VwdGlvbgorICAgICAqCisgICAgICogQHBhcmFtIHQJCQl0aGUgPGNvZGU+amF2YS5sYW5nLlRocm93YWJsZTwvY29kZT4gZXJyb3IKKyAgICAgKiAJCQkJb3IgZXhjZXB0aW9uCisgICAgICoKKyAgICAgKgorICAgICAqLworICAgCisgICAgcHVibGljIHZvaWQgbG9nKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgdCkgeworCWdldFNlcnZsZXRDb250ZXh0KCkubG9nKGdldFNlcnZsZXROYW1lKCkgKyAiOiAiICsgbWVzc2FnZSwgdCk7CisgICAgfQorICAgIAorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIENhbGxlZCBieSB0aGUgc2VydmxldCBjb250YWluZXIgdG8gYWxsb3cgdGhlIHNlcnZsZXQgdG8gcmVzcG9uZCB0bworICAgICAqIGEgcmVxdWVzdC4gIFNlZSB7QGxpbmsgU2VydmxldCNzZXJ2aWNlfS4KKyAgICAgKiAKKyAgICAgKiA8cD5UaGlzIG1ldGhvZCBpcyBkZWNsYXJlZCBhYnN0cmFjdCBzbyBzdWJjbGFzc2VzLCBzdWNoIGFzIAorICAgICAqIDxjb2RlPkh0dHBTZXJ2bGV0PC9jb2RlPiwgbXVzdCBvdmVycmlkZSBpdC4KKyAgICAgKgorICAgICAqCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxIAl0aGUgPGNvZGU+U2VydmxldFJlcXVlc3Q8L2NvZGU+IG9iamVjdAorICAgICAqCQkJdGhhdCBjb250YWlucyB0aGUgY2xpZW50J3MgcmVxdWVzdAorICAgICAqCisgICAgICogQHBhcmFtIHJlcyAJdGhlIDxjb2RlPlNlcnZsZXRSZXNwb25zZTwvY29kZT4gb2JqZWN0CisgICAgICoJCQl0aGF0IHdpbGwgY29udGFpbiB0aGUgc2VydmxldCdzIHJlc3BvbnNlCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gCWlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMgdGhhdAorICAgICAqCQkJCQlpbnRlcmZlcmVzIHdpdGggdGhlIHNlcnZsZXQncworICAgICAqCQkJCQlub3JtYWwgb3BlcmF0aW9uIG9jY3VycmVkCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIAkJaWYgYW4gaW5wdXQgb3Igb3V0cHV0CisgICAgICoJCQkJCWV4Y2VwdGlvbiBvY2N1cnMKKyAgICAgKgorICAgICAqLworCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2VydmljZShTZXJ2bGV0UmVxdWVzdCByZXEsIFNlcnZsZXRSZXNwb25zZSByZXMpCisJdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uOworICAgIAorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMgc2VydmxldCBpbnN0YW5jZS4KKyAgICAgKiBTZWUge0BsaW5rIFNlcnZsZXRDb25maWcjZ2V0U2VydmxldE5hbWV9LgorICAgICAqCisgICAgICogQHJldHVybiAgICAgICAgICB0aGUgbmFtZSBvZiB0aGlzIHNlcnZsZXQgaW5zdGFuY2UKKyAgICAgKgorICAgICAqCisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmxldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBjb25maWcuZ2V0U2VydmxldE5hbWUoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9Mb2NhbFN0cmluZ3MucHJvcGVydGllcyBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L0xvY2FsU3RyaW5ncy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxZGNmNDgKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9Mb2NhbFN0cmluZ3MucHJvcGVydGllcwpAQCAtMCwwICsxLDIwIEBACisjIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIERlZmF1bHQgbG9jYWxpemVkIHN0cmluZyBpbmZvcm1hdGlvbgorIyBMb2NhbGl6ZWQgZm9yIExvY2FsZSBlbl9VUworCitlcnIubm90X2lzbzg4NTlfMT1Ob3QgYW4gSVNPIDg4NTktMSBjaGFyYWN0ZXI6IHswfQordmFsdWUudHJ1ZT10cnVlCit2YWx1ZS5mYWxzZT1mYWxzZQpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvTG9jYWxTdHJpbmdzX2ZyLnByb3BlcnRpZXMgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9Mb2NhbFN0cmluZ3NfZnIucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODczMDliCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvTG9jYWxTdHJpbmdzX2ZyLnByb3BlcnRpZXMKQEAgLTAsMCArMSwyMiBAQAorIyBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyBEZWZhdWx0IGxvY2FsaXplZCBzdHJpbmcgaW5mb3JtYXRpb24KKyMgTG9jYWxpemVkIGZvciBMb2NhbGUgZnJfRlIKKworZXJyLm5vdF9pc284ODU5XzE9ezB9IG4nJ2VzdCBwYXMgdW4gY2FyYWN06HJlIElTTyA4ODU5LTEKK3ZhbHVlLnRydWU9dHJ1ZQordmFsdWUuZmFsc2U9ZmFsc2UgCisKKwpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvTG9jYWxTdHJpbmdzX2phLnByb3BlcnRpZXMgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9Mb2NhbFN0cmluZ3NfamEucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWQzNzA5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvTG9jYWxTdHJpbmdzX2phLnByb3BlcnRpZXMKQEAgLTAsMCArMSwyMCBAQAorIyBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyBEZWZhdWx0IGxvY2FsaXplZCBzdHJpbmcgaW5mb3JtYXRpb24KKyMgTG9jYWxpemVkIGZvciBMb2NhbGUgamFfSlAKKworZXJyLm5vdF9pc284ODU5XzE9SVNPIDg4NTktMSBcdTMwNmVcdTY1ODdcdTViNTdcdTMwNjdcdTMwNmZcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTM6IHswfQordmFsdWUudHJ1ZT10cnVlCit2YWx1ZS5mYWxzZT1mYWxzZQpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvUmVxdWVzdERpc3BhdGNoZXIuamF2YSBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L1JlcXVlc3REaXNwYXRjaGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk5MzcyOAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L1JlcXVlc3REaXNwYXRjaGVyLmphdmEKQEAgLTAsMCArMSwxMzggQEAKKy8qCisqIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworcGFja2FnZSBqYXZheC5zZXJ2bGV0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworCisvKioKKyAqIERlZmluZXMgYW4gb2JqZWN0IHRoYXQgcmVjZWl2ZXMgcmVxdWVzdHMgZnJvbSB0aGUgY2xpZW50CisgKiBhbmQgc2VuZHMgdGhlbSB0byBhbnkgcmVzb3VyY2UgKHN1Y2ggYXMgYSBzZXJ2bGV0LCAKKyAqIEhUTUwgZmlsZSwgb3IgSlNQIGZpbGUpIG9uIHRoZSBzZXJ2ZXIuIFRoZSBzZXJ2bGV0CisgKiBjb250YWluZXIgY3JlYXRlcyB0aGUgPGNvZGU+UmVxdWVzdERpc3BhdGNoZXI8L2NvZGU+IG9iamVjdCwKKyAqIHdoaWNoIGlzIHVzZWQgYXMgYSB3cmFwcGVyIGFyb3VuZCBhIHNlcnZlciByZXNvdXJjZSBsb2NhdGVkCisgKiBhdCBhIHBhcnRpY3VsYXIgcGF0aCBvciBnaXZlbiBieSBhIHBhcnRpY3VsYXIgbmFtZS4KKyAqCisgKiA8cD5UaGlzIGludGVyZmFjZSBpcyBpbnRlbmRlZCB0byB3cmFwIHNlcnZsZXRzLAorICogYnV0IGEgc2VydmxldCBjb250YWluZXIgY2FuIGNyZWF0ZSA8Y29kZT5SZXF1ZXN0RGlzcGF0Y2hlcjwvY29kZT4KKyAqIG9iamVjdHMgdG8gd3JhcCBhbnkgdHlwZSBvZiByZXNvdXJjZS4KKyAqCisgKiBAYXV0aG9yIAlWYXJpb3VzCisgKiBAdmVyc2lvbiAJJFZlcnNpb24kCisgKgorICogQHNlZSAJU2VydmxldENvbnRleHQjZ2V0UmVxdWVzdERpc3BhdGNoZXIoamF2YS5sYW5nLlN0cmluZykKKyAqIEBzZWUgCVNlcnZsZXRDb250ZXh0I2dldE5hbWVkRGlzcGF0Y2hlcihqYXZhLmxhbmcuU3RyaW5nKQorICogQHNlZSAJU2VydmxldFJlcXVlc3QjZ2V0UmVxdWVzdERpc3BhdGNoZXIoamF2YS5sYW5nLlN0cmluZykKKyAqCisgKi8KKyAKK3B1YmxpYyBpbnRlcmZhY2UgUmVxdWVzdERpc3BhdGNoZXIgeworCisKKworCisKKy8qKgorICogRm9yd2FyZHMgYSByZXF1ZXN0IGZyb20KKyAqIGEgc2VydmxldCB0byBhbm90aGVyIHJlc291cmNlIChzZXJ2bGV0LCBKU1AgZmlsZSwgb3IKKyAqIEhUTUwgZmlsZSkgb24gdGhlIHNlcnZlci4gVGhpcyBtZXRob2QgYWxsb3dzCisgKiBvbmUgc2VydmxldCB0byBkbyBwcmVsaW1pbmFyeSBwcm9jZXNzaW5nIG9mCisgKiBhIHJlcXVlc3QgYW5kIGFub3RoZXIgcmVzb3VyY2UgdG8gZ2VuZXJhdGUKKyAqIHRoZSByZXNwb25zZS4KKyAqCisgKiA8cD5Gb3IgYSA8Y29kZT5SZXF1ZXN0RGlzcGF0Y2hlcjwvY29kZT4gb2J0YWluZWQgdmlhIAorICogPGNvZGU+Z2V0UmVxdWVzdERpc3BhdGNoZXIoKTwvY29kZT4sIHRoZSA8Y29kZT5TZXJ2bGV0UmVxdWVzdDwvY29kZT4gCisgKiBvYmplY3QgaGFzIGl0cyBwYXRoIGVsZW1lbnRzIGFuZCBwYXJhbWV0ZXJzIGFkanVzdGVkIHRvIG1hdGNoCisgKiB0aGUgcGF0aCBvZiB0aGUgdGFyZ2V0IHJlc291cmNlLgorICoKKyAqIDxwPjxjb2RlPmZvcndhcmQ8L2NvZGU+IHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlIHRoZSByZXNwb25zZSBoYXMgYmVlbiAKKyAqIGNvbW1pdHRlZCB0byB0aGUgY2xpZW50IChiZWZvcmUgcmVzcG9uc2UgYm9keSBvdXRwdXQgaGFzIGJlZW4gZmx1c2hlZCkuICAKKyAqIElmIHRoZSByZXNwb25zZSBhbHJlYWR5IGhhcyBiZWVuIGNvbW1pdHRlZCwgdGhpcyBtZXRob2QgdGhyb3dzCisgKiBhbiA8Y29kZT5JbGxlZ2FsU3RhdGVFeGNlcHRpb248L2NvZGU+LgorICogVW5jb21taXR0ZWQgb3V0cHV0IGluIHRoZSByZXNwb25zZSBidWZmZXIgaXMgYXV0b21hdGljYWxseSBjbGVhcmVkIAorICogYmVmb3JlIHRoZSBmb3J3YXJkLgorICoKKyAqIDxwPlRoZSByZXF1ZXN0IGFuZCByZXNwb25zZSBwYXJhbWV0ZXJzIG11c3QgYmUgZWl0aGVyIHRoZSBzYW1lCisgKiBvYmplY3RzIGFzIHdlcmUgcGFzc2VkIHRvIHRoZSBjYWxsaW5nIHNlcnZsZXQncyBzZXJ2aWNlIG1ldGhvZCBvciBiZQorICogc3ViY2xhc3NlcyBvZiB0aGUge0BsaW5rIFNlcnZsZXRSZXF1ZXN0V3JhcHBlcn0gb3Ige0BsaW5rIFNlcnZsZXRSZXNwb25zZVdyYXBwZXJ9IGNsYXNzZXMKKyAqIHRoYXQgd3JhcCB0aGVtLgorICoKKyAqCisgKiBAcGFyYW0gcmVxdWVzdAkJYSB7QGxpbmsgU2VydmxldFJlcXVlc3R9IG9iamVjdAorICoJCQkJdGhhdCByZXByZXNlbnRzIHRoZSByZXF1ZXN0IHRoZSBjbGllbnQKKyAqIAkJCQltYWtlcyBvZiB0aGUgc2VydmxldAorICoKKyAqIEBwYXJhbSByZXNwb25zZQkJYSB7QGxpbmsgU2VydmxldFJlc3BvbnNlfSBvYmplY3QKKyAqCQkJCXRoYXQgcmVwcmVzZW50cyB0aGUgcmVzcG9uc2UgdGhlIHNlcnZsZXQKKyAqCQkJCXJldHVybnMgdG8gdGhlIGNsaWVudAorICoKKyAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbglpZiB0aGUgdGFyZ2V0IHJlc291cmNlIHRocm93cyB0aGlzIGV4Y2VwdGlvbgorICoKKyAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24JaWYgdGhlIHRhcmdldCByZXNvdXJjZSB0aHJvd3MgdGhpcyBleGNlcHRpb24KKyAqCisgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbglpZiB0aGUgcmVzcG9uc2Ugd2FzIGFscmVhZHkgY29tbWl0dGVkCisgKgorICovCisKKyAgICBwdWJsaWMgdm9pZCBmb3J3YXJkKFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKwl0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb247CisKKworCisKKyAgICAvKioKKyAgICAgKgorICAgICAqIEluY2x1ZGVzIHRoZSBjb250ZW50IG9mIGEgcmVzb3VyY2UgKHNlcnZsZXQsIEpTUCBwYWdlLAorICAgICAqIEhUTUwgZmlsZSkgaW4gdGhlIHJlc3BvbnNlLiBJbiBlc3NlbmNlLCB0aGlzIG1ldGhvZCBlbmFibGVzIAorICAgICAqIHByb2dyYW1tYXRpYyBzZXJ2ZXItc2lkZSBpbmNsdWRlcy4KKyAgICAgKgorICAgICAqIDxwPlRoZSB7QGxpbmsgU2VydmxldFJlc3BvbnNlfSBvYmplY3QgaGFzIGl0cyBwYXRoIGVsZW1lbnRzCisgICAgICogYW5kIHBhcmFtZXRlcnMgcmVtYWluIHVuY2hhbmdlZCBmcm9tIHRoZSBjYWxsZXIncy4gVGhlIGluY2x1ZGVkCisgICAgICogc2VydmxldCBjYW5ub3QgY2hhbmdlIHRoZSByZXNwb25zZSBzdGF0dXMgY29kZSBvciBzZXQgaGVhZGVyczsKKyAgICAgKiBhbnkgYXR0ZW1wdCB0byBtYWtlIGEgY2hhbmdlIGlzIGlnbm9yZWQuCisgICAgICoKKyAgICAgKiA8cD5UaGUgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcGFyYW1ldGVycyBtdXN0IGJlIGVpdGhlciB0aGUgc2FtZQorICAgICAqIG9iamVjdHMgYXMgd2VyZSBwYXNzZWQgdG8gdGhlIGNhbGxpbmcgc2VydmxldCdzIHNlcnZpY2UgbWV0aG9kIG9yIGJlCisgICAgICogc3ViY2xhc3NlcyBvZiB0aGUge0BsaW5rIFNlcnZsZXRSZXF1ZXN0V3JhcHBlcn0gb3Ige0BsaW5rIFNlcnZsZXRSZXNwb25zZVdyYXBwZXJ9IGNsYXNzZXMKKyAgICAgKiB0aGF0IHdyYXAgdGhlbS4KKyAgICAgKiAKKyAgICAgKgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgCQkJYSB7QGxpbmsgU2VydmxldFJlcXVlc3R9IG9iamVjdCAKKyAgICAgKgkJCQkJdGhhdCBjb250YWlucyB0aGUgY2xpZW50J3MgcmVxdWVzdAorICAgICAqCisgICAgICogQHBhcmFtIHJlc3BvbnNlIAkJCWEge0BsaW5rIFNlcnZsZXRSZXNwb25zZX0gb2JqZWN0IAorICAgICAqIAkJCQkJdGhhdCBjb250YWlucyB0aGUgc2VydmxldCdzIHJlc3BvbnNlCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gCWlmIHRoZSBpbmNsdWRlZCByZXNvdXJjZSB0aHJvd3MgdGhpcyBleGNlcHRpb24KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gCQlpZiB0aGUgaW5jbHVkZWQgcmVzb3VyY2UgdGhyb3dzIHRoaXMgZXhjZXB0aW9uCisgICAgICoKKyAgICAgKgorICAgICAqLworICAgICAKKyAgICBwdWJsaWMgdm9pZCBpbmNsdWRlKFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKwl0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb247Cit9CisKKworCisKKworCisKKwpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvU2VydmxldC5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvU2VydmxldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkNTY4ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9TZXJ2bGV0LmphdmEKQEAgLTAsMCArMSwxOTIgQEAKKy8qCisqIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyAKK3BhY2thZ2UgamF2YXguc2VydmxldDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKworLyoqCisgKiBEZWZpbmVzIG1ldGhvZHMgdGhhdCBhbGwgc2VydmxldHMgbXVzdCBpbXBsZW1lbnQuCisgKgorICogPHA+QSBzZXJ2bGV0IGlzIGEgc21hbGwgSmF2YSBwcm9ncmFtIHRoYXQgcnVucyB3aXRoaW4gYSBXZWIgc2VydmVyLgorICogU2VydmxldHMgcmVjZWl2ZSBhbmQgcmVzcG9uZCB0byByZXF1ZXN0cyBmcm9tIFdlYiBjbGllbnRzLAorICogdXN1YWxseSBhY3Jvc3MgSFRUUCwgdGhlIEh5cGVyVGV4dCBUcmFuc2ZlciBQcm90b2NvbC4gCisgKgorICogPHA+VG8gaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLCB5b3UgY2FuIHdyaXRlIGEgZ2VuZXJpYyBzZXJ2bGV0CisgKiB0aGF0IGV4dGVuZHMKKyAqIDxjb2RlPmphdmF4LnNlcnZsZXQuR2VuZXJpY1NlcnZsZXQ8L2NvZGU+IG9yIGFuIEhUVFAgc2VydmxldCB0aGF0CisgKiBleHRlbmRzIDxjb2RlPmphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldDwvY29kZT4uCisgKgorICogPHA+VGhpcyBpbnRlcmZhY2UgZGVmaW5lcyBtZXRob2RzIHRvIGluaXRpYWxpemUgYSBzZXJ2bGV0LAorICogdG8gc2VydmljZSByZXF1ZXN0cywgYW5kIHRvIHJlbW92ZSBhIHNlcnZsZXQgZnJvbSB0aGUgc2VydmVyLgorICogVGhlc2UgYXJlIGtub3duIGFzIGxpZmUtY3ljbGUgbWV0aG9kcyBhbmQgYXJlIGNhbGxlZCBpbiB0aGUKKyAqIGZvbGxvd2luZyBzZXF1ZW5jZToKKyAqIDxvbD4KKyAqIDxsaT5UaGUgc2VydmxldCBpcyBjb25zdHJ1Y3RlZCwgdGhlbiBpbml0aWFsaXplZCB3aXRoIHRoZSA8Y29kZT5pbml0PC9jb2RlPiBtZXRob2QuCisgKiA8bGk+QW55IGNhbGxzIGZyb20gY2xpZW50cyB0byB0aGUgPGNvZGU+c2VydmljZTwvY29kZT4gbWV0aG9kIGFyZSBoYW5kbGVkLgorICogPGxpPlRoZSBzZXJ2bGV0IGlzIHRha2VuIG91dCBvZiBzZXJ2aWNlLCB0aGVuIGRlc3Ryb3llZCB3aXRoIHRoZSAKKyAqIDxjb2RlPmRlc3Ryb3k8L2NvZGU+IG1ldGhvZCwgdGhlbiBnYXJiYWdlIGNvbGxlY3RlZCBhbmQgZmluYWxpemVkLgorICogPC9vbD4KKyAqCisgKiA8cD5JbiBhZGRpdGlvbiB0byB0aGUgbGlmZS1jeWNsZSBtZXRob2RzLCB0aGlzIGludGVyZmFjZQorICogcHJvdmlkZXMgdGhlIDxjb2RlPmdldFNlcnZsZXRDb25maWc8L2NvZGU+IG1ldGhvZCwgd2hpY2ggdGhlIHNlcnZsZXQgCisgKiBjYW4gdXNlIHRvIGdldCBhbnkgc3RhcnR1cCBpbmZvcm1hdGlvbiwgYW5kIHRoZSA8Y29kZT5nZXRTZXJ2bGV0SW5mbzwvY29kZT4KKyAqIG1ldGhvZCwgd2hpY2ggYWxsb3dzIHRoZSBzZXJ2bGV0IHRvIHJldHVybiBiYXNpYyBpbmZvcm1hdGlvbiBhYm91dCBpdHNlbGYsCisgKiBzdWNoIGFzIGF1dGhvciwgdmVyc2lvbiwgYW5kIGNvcHlyaWdodC4KKyAqCisgKiBAYXV0aG9yIAlWYXJpb3VzCisgKiBAdmVyc2lvbiAJJFZlcnNpb24kCisgKgorICogQHNlZSAJR2VuZXJpY1NlcnZsZXQKKyAqIEBzZWUgCWphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldAorICoKKyAqLworCisKK3B1YmxpYyBpbnRlcmZhY2UgU2VydmxldCB7CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYnkgdGhlIHNlcnZsZXQgY29udGFpbmVyIHRvIGluZGljYXRlIHRvIGEgc2VydmxldCB0aGF0IHRoZSAKKyAgICAgKiBzZXJ2bGV0IGlzIGJlaW5nIHBsYWNlZCBpbnRvIHNlcnZpY2UuCisgICAgICoKKyAgICAgKiA8cD5UaGUgc2VydmxldCBjb250YWluZXIgY2FsbHMgdGhlIDxjb2RlPmluaXQ8L2NvZGU+CisgICAgICogbWV0aG9kIGV4YWN0bHkgb25jZSBhZnRlciBpbnN0YW50aWF0aW5nIHRoZSBzZXJ2bGV0LgorICAgICAqIFRoZSA8Y29kZT5pbml0PC9jb2RlPiBtZXRob2QgbXVzdCBjb21wbGV0ZSBzdWNjZXNzZnVsbHkKKyAgICAgKiBiZWZvcmUgdGhlIHNlcnZsZXQgY2FuIHJlY2VpdmUgYW55IHJlcXVlc3RzLgorICAgICAqCisgICAgICogPHA+VGhlIHNlcnZsZXQgY29udGFpbmVyIGNhbm5vdCBwbGFjZSB0aGUgc2VydmxldCBpbnRvIHNlcnZpY2UKKyAgICAgKiBpZiB0aGUgPGNvZGU+aW5pdDwvY29kZT4gbWV0aG9kCisgICAgICogPG9sPgorICAgICAqIDxsaT5UaHJvd3MgYSA8Y29kZT5TZXJ2bGV0RXhjZXB0aW9uPC9jb2RlPgorICAgICAqIDxsaT5Eb2VzIG5vdCByZXR1cm4gd2l0aGluIGEgdGltZSBwZXJpb2QgZGVmaW5lZCBieSB0aGUgV2ViIHNlcnZlcgorICAgICAqIDwvb2w+CisgICAgICoKKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25maWcJCQlhIDxjb2RlPlNlcnZsZXRDb25maWc8L2NvZGU+IG9iamVjdCAKKyAgICAgKgkJCQkJY29udGFpbmluZyB0aGUgc2VydmxldCdzCisgICAgICogCQkJCQljb25maWd1cmF0aW9uIGFuZCBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24gCWlmIGFuIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQgdGhhdAorICAgICAqCQkJCQlpbnRlcmZlcmVzIHdpdGggdGhlIHNlcnZsZXQncyBub3JtYWwKKyAgICAgKgkJCQkJb3BlcmF0aW9uCisgICAgICoKKyAgICAgKiBAc2VlIAkJCQlVbmF2YWlsYWJsZUV4Y2VwdGlvbgorICAgICAqIEBzZWUgCQkJCSNnZXRTZXJ2bGV0Q29uZmlnCisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIGluaXQoU2VydmxldENvbmZpZyBjb25maWcpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uOworICAgIAorICAgIAorCisgICAgLyoqCisgICAgICoKKyAgICAgKiBSZXR1cm5zIGEge0BsaW5rIFNlcnZsZXRDb25maWd9IG9iamVjdCwgd2hpY2ggY29udGFpbnMKKyAgICAgKiBpbml0aWFsaXphdGlvbiBhbmQgc3RhcnR1cCBwYXJhbWV0ZXJzIGZvciB0aGlzIHNlcnZsZXQuCisgICAgICogVGhlIDxjb2RlPlNlcnZsZXRDb25maWc8L2NvZGU+IG9iamVjdCByZXR1cm5lZCBpcyB0aGUgb25lIAorICAgICAqIHBhc3NlZCB0byB0aGUgPGNvZGU+aW5pdDwvY29kZT4gbWV0aG9kLiAKKyAgICAgKgorICAgICAqIDxwPkltcGxlbWVudGF0aW9ucyBvZiB0aGlzIGludGVyZmFjZSBhcmUgcmVzcG9uc2libGUgZm9yIHN0b3JpbmcgdGhlIAorICAgICAqIDxjb2RlPlNlcnZsZXRDb25maWc8L2NvZGU+IG9iamVjdCBzbyB0aGF0IHRoaXMgCisgICAgICogbWV0aG9kIGNhbiByZXR1cm4gaXQuIFRoZSB7QGxpbmsgR2VuZXJpY1NlcnZsZXR9CisgICAgICogY2xhc3MsIHdoaWNoIGltcGxlbWVudHMgdGhpcyBpbnRlcmZhY2UsIGFscmVhZHkgZG9lcyB0aGlzLgorICAgICAqCisgICAgICogQHJldHVybgkJdGhlIDxjb2RlPlNlcnZsZXRDb25maWc8L2NvZGU+IG9iamVjdAorICAgICAqCQkJdGhhdCBpbml0aWFsaXplcyB0aGlzIHNlcnZsZXQKKyAgICAgKgorICAgICAqIEBzZWUgCQkjaW5pdAorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgU2VydmxldENvbmZpZyBnZXRTZXJ2bGV0Q29uZmlnKCk7CisgICAgCisgICAgCisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYnkgdGhlIHNlcnZsZXQgY29udGFpbmVyIHRvIGFsbG93IHRoZSBzZXJ2bGV0IHRvIHJlc3BvbmQgdG8gCisgICAgICogYSByZXF1ZXN0LgorICAgICAqCisgICAgICogPHA+VGhpcyBtZXRob2QgaXMgb25seSBjYWxsZWQgYWZ0ZXIgdGhlIHNlcnZsZXQncyA8Y29kZT5pbml0KCk8L2NvZGU+CisgICAgICogbWV0aG9kIGhhcyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAqIAorICAgICAqIDxwPiAgVGhlIHN0YXR1cyBjb2RlIG9mIHRoZSByZXNwb25zZSBhbHdheXMgc2hvdWxkIGJlIHNldCBmb3IgYSBzZXJ2bGV0IAorICAgICAqIHRoYXQgdGhyb3dzIG9yIHNlbmRzIGFuIGVycm9yLgorICAgICAqCisgICAgICogCisgICAgICogPHA+U2VydmxldHMgdHlwaWNhbGx5IHJ1biBpbnNpZGUgbXVsdGl0aHJlYWRlZCBzZXJ2bGV0IGNvbnRhaW5lcnMKKyAgICAgKiB0aGF0IGNhbiBoYW5kbGUgbXVsdGlwbGUgcmVxdWVzdHMgY29uY3VycmVudGx5LiBEZXZlbG9wZXJzIG11c3QgCisgICAgICogYmUgYXdhcmUgdG8gc3luY2hyb25pemUgYWNjZXNzIHRvIGFueSBzaGFyZWQgcmVzb3VyY2VzIHN1Y2ggYXMgZmlsZXMsCisgICAgICogbmV0d29yayBjb25uZWN0aW9ucywgYW5kIGFzIHdlbGwgYXMgdGhlIHNlcnZsZXQncyBjbGFzcyBhbmQgaW5zdGFuY2UgCisgICAgICogdmFyaWFibGVzLiAKKyAgICAgKiBNb3JlIGluZm9ybWF0aW9uIG9uIG11bHRpdGhyZWFkZWQgcHJvZ3JhbW1pbmcgaW4gSmF2YSBpcyBhdmFpbGFibGUgaW4gCisgICAgICogPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9TZXJpZXMvVHV0b3JpYWwvamF2YS90aHJlYWRzL211bHRpdGhyZWFkZWQuaHRtbCI+CisgICAgICogdGhlIEphdmEgdHV0b3JpYWwgb24gbXVsdGktdGhyZWFkZWQgcHJvZ3JhbW1pbmc8L2E+LgorICAgICAqCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxIAl0aGUgPGNvZGU+U2VydmxldFJlcXVlc3Q8L2NvZGU+IG9iamVjdCB0aGF0IGNvbnRhaW5zCisgICAgICoJCQl0aGUgY2xpZW50J3MgcmVxdWVzdAorICAgICAqCisgICAgICogQHBhcmFtIHJlcyAJdGhlIDxjb2RlPlNlcnZsZXRSZXNwb25zZTwvY29kZT4gb2JqZWN0IHRoYXQgY29udGFpbnMKKyAgICAgKgkJCXRoZSBzZXJ2bGV0J3MgcmVzcG9uc2UKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbiAJaWYgYW4gZXhjZXB0aW9uIG9jY3VycyB0aGF0IGludGVyZmVyZXMKKyAgICAgKgkJCQkJd2l0aCB0aGUgc2VydmxldCdzIG5vcm1hbCBvcGVyYXRpb24gCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIAkJaWYgYW4gaW5wdXQgb3Igb3V0cHV0IGV4Y2VwdGlvbiBvY2N1cnMKKyAgICAgKgorICAgICAqLworCisgICAgcHVibGljIHZvaWQgc2VydmljZShTZXJ2bGV0UmVxdWVzdCByZXEsIFNlcnZsZXRSZXNwb25zZSByZXMpCisJdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uOworCQorCQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VydmxldCwgc3VjaAorICAgICAqIGFzIGF1dGhvciwgdmVyc2lvbiwgYW5kIGNvcHlyaWdodC4KKyAgICAgKiAKKyAgICAgKiA8cD5UaGUgc3RyaW5nIHRoYXQgdGhpcyBtZXRob2QgcmV0dXJucyBzaG91bGQKKyAgICAgKiBiZSBwbGFpbiB0ZXh0IGFuZCBub3QgbWFya3VwIG9mIGFueSBraW5kIChzdWNoIGFzIEhUTUwsIFhNTCwKKyAgICAgKiBldGMuKS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gCQlhIDxjb2RlPlN0cmluZzwvY29kZT4gY29udGFpbmluZyBzZXJ2bGV0IGluZm9ybWF0aW9uCisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmxldEluZm8oKTsKKyAgICAKKyAgICAKKworICAgIC8qKgorICAgICAqCisgICAgICogQ2FsbGVkIGJ5IHRoZSBzZXJ2bGV0IGNvbnRhaW5lciB0byBpbmRpY2F0ZSB0byBhIHNlcnZsZXQgdGhhdCB0aGUKKyAgICAgKiBzZXJ2bGV0IGlzIGJlaW5nIHRha2VuIG91dCBvZiBzZXJ2aWNlLiAgVGhpcyBtZXRob2QgaXMKKyAgICAgKiBvbmx5IGNhbGxlZCBvbmNlIGFsbCB0aHJlYWRzIHdpdGhpbiB0aGUgc2VydmxldCdzCisgICAgICogPGNvZGU+c2VydmljZTwvY29kZT4gbWV0aG9kIGhhdmUgZXhpdGVkIG9yIGFmdGVyIGEgdGltZW91dAorICAgICAqIHBlcmlvZCBoYXMgcGFzc2VkLiBBZnRlciB0aGUgc2VydmxldCBjb250YWluZXIgY2FsbHMgdGhpcyAKKyAgICAgKiBtZXRob2QsIGl0IHdpbGwgbm90IGNhbGwgdGhlIDxjb2RlPnNlcnZpY2U8L2NvZGU+IG1ldGhvZCBhZ2FpbgorICAgICAqIG9uIHRoaXMgc2VydmxldC4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgbWV0aG9kIGdpdmVzIHRoZSBzZXJ2bGV0IGFuIG9wcG9ydHVuaXR5IAorICAgICAqIHRvIGNsZWFuIHVwIGFueSByZXNvdXJjZXMgdGhhdCBhcmUgYmVpbmcgaGVsZCAoZm9yIGV4YW1wbGUsIG1lbW9yeSwKKyAgICAgKiBmaWxlIGhhbmRsZXMsIHRocmVhZHMpIGFuZCBtYWtlIHN1cmUgdGhhdCBhbnkgcGVyc2lzdGVudCBzdGF0ZSBpcworICAgICAqIHN5bmNocm9uaXplZCB3aXRoIHRoZSBzZXJ2bGV0J3MgY3VycmVudCBzdGF0ZSBpbiBtZW1vcnkuCisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3koKTsKK30KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L1NlcnZsZXRDb25maWcuamF2YSBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L1NlcnZsZXRDb25maWcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWY5YjFiCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvU2VydmxldENvbmZpZy5qYXZhCkBAIC0wLDAgKzEsOTQgQEAKKy8qCisqIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KK3BhY2thZ2UgamF2YXguc2VydmxldDsKKworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKKworCisKKy8qKgorICogCisgKiBBIHNlcnZsZXQgY29uZmlndXJhdGlvbiBvYmplY3QgdXNlZCBieSBhIHNlcnZsZXQgY29udGFpbmVyCisgKiB0byBwYXNzIGluZm9ybWF0aW9uIHRvIGEgc2VydmxldCBkdXJpbmcgaW5pdGlhbGl6YXRpb24uIAorICoKKyAqLworIAorcHVibGljIGludGVyZmFjZSBTZXJ2bGV0Q29uZmlnIHsKKyAgICAKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhpcyBzZXJ2bGV0IGluc3RhbmNlLgorICAgICAqIFRoZSBuYW1lIG1heSBiZSBwcm92aWRlZCB2aWEgc2VydmVyIGFkbWluaXN0cmF0aW9uLCBhc3NpZ25lZCBpbiB0aGUgCisgICAgICogd2ViIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQgZGVzY3JpcHRvciwgb3IgZm9yIGFuIHVucmVnaXN0ZXJlZCAoYW5kIHRodXMKKyAgICAgKiB1bm5hbWVkKSBzZXJ2bGV0IGluc3RhbmNlIGl0IHdpbGwgYmUgdGhlIHNlcnZsZXQncyBjbGFzcyBuYW1lLgorICAgICAqCisgICAgICogQHJldHVybgkJdGhlIG5hbWUgb2YgdGhlIHNlcnZsZXQgaW5zdGFuY2UKKyAgICAgKgorICAgICAqCisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmxldE5hbWUoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIHtAbGluayBTZXJ2bGV0Q29udGV4dH0gaW4gd2hpY2ggdGhlIGNhbGxlcgorICAgICAqIGlzIGV4ZWN1dGluZy4KKyAgICAgKgorICAgICAqCisgICAgICogQHJldHVybgkJYSB7QGxpbmsgU2VydmxldENvbnRleHR9IG9iamVjdCwgdXNlZAorICAgICAqCQkJYnkgdGhlIGNhbGxlciB0byBpbnRlcmFjdCB3aXRoIGl0cyBzZXJ2bGV0IAorICAgICAqICAgICAgICAgICAgICAgICAgY29udGFpbmVyCisgICAgICogCisgICAgICogQHNlZQkJU2VydmxldENvbnRleHQKKyAgICAgKgorICAgICAqLworCisgICAgcHVibGljIFNlcnZsZXRDb250ZXh0IGdldFNlcnZsZXRDb250ZXh0KCk7CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIDxjb2RlPlN0cmluZzwvY29kZT4gY29udGFpbmluZyB0aGUgdmFsdWUgb2YgdGhlIAorICAgICAqIG5hbWVkIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgCisgICAgICogdGhlIHBhcmFtZXRlciBkb2VzIG5vdCBleGlzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lCWEgPGNvZGU+U3RyaW5nPC9jb2RlPiBzcGVjaWZ5aW5nIHRoZSBuYW1lCisgICAgICoJCQlvZiB0aGUgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyCisgICAgICoKKyAgICAgKiBAcmV0dXJuCQlhIDxjb2RlPlN0cmluZzwvY29kZT4gY29udGFpbmluZyB0aGUgdmFsdWUgCisgICAgICoJCQlvZiB0aGUgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyCisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5pdFBhcmFtZXRlcihTdHJpbmcgbmFtZSk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG5hbWVzIG9mIHRoZSBzZXJ2bGV0J3MgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycworICAgICAqIGFzIGFuIDxjb2RlPkVudW1lcmF0aW9uPC9jb2RlPiBvZiA8Y29kZT5TdHJpbmc8L2NvZGU+IG9iamVjdHMsIAorICAgICAqIG9yIGFuIGVtcHR5IDxjb2RlPkVudW1lcmF0aW9uPC9jb2RlPiBpZiB0aGUgc2VydmxldCBoYXMKKyAgICAgKiBubyBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzLgorICAgICAqCisgICAgICogQHJldHVybgkJYW4gPGNvZGU+RW51bWVyYXRpb248L2NvZGU+IG9mIDxjb2RlPlN0cmluZzwvY29kZT4gCisgICAgICoJCQlvYmplY3RzIGNvbnRhaW5pbmcgdGhlIG5hbWVzIG9mIHRoZSBzZXJ2bGV0J3MgCisgICAgICoJCQlpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzCisgICAgICoKKyAgICAgKgorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0SW5pdFBhcmFtZXRlck5hbWVzKCk7CisKKworfQpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvU2VydmxldENvbnRleHQuamF2YSBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L1NlcnZsZXRDb250ZXh0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM4ZjE3ZAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L1NlcnZsZXRDb250ZXh0LmphdmEKQEAgLTAsMCArMSw2NDMgQEAKKy8qCisqIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KK3BhY2thZ2UgamF2YXguc2VydmxldDsKKworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworCisvKioKKyAqIAorICogRGVmaW5lcyBhIHNldCBvZiBtZXRob2RzIHRoYXQgYSBzZXJ2bGV0IHVzZXMgdG8gY29tbXVuaWNhdGUgd2l0aCBpdHMKKyAqIHNlcnZsZXQgY29udGFpbmVyLCBmb3IgZXhhbXBsZSwgdG8gZ2V0IHRoZSBNSU1FIHR5cGUgb2YgYSBmaWxlLCBkaXNwYXRjaAorICogcmVxdWVzdHMsIG9yIHdyaXRlIHRvIGEgbG9nIGZpbGUuCisgKgorICogPHA+VGhlcmUgaXMgb25lIGNvbnRleHQgcGVyICJ3ZWIgYXBwbGljYXRpb24iIHBlciBKYXZhIFZpcnR1YWwgTWFjaGluZS4gIChBCisgKiAid2ViIGFwcGxpY2F0aW9uIiBpcyBhIGNvbGxlY3Rpb24gb2Ygc2VydmxldHMgYW5kIGNvbnRlbnQgaW5zdGFsbGVkIHVuZGVyIGEKKyAqIHNwZWNpZmljIHN1YnNldCBvZiB0aGUgc2VydmVyJ3MgVVJMIG5hbWVzcGFjZSBzdWNoIGFzIDxjb2RlPi9jYXRhbG9nPC9jb2RlPgorICogYW5kIHBvc3NpYmx5IGluc3RhbGxlZCB2aWEgYSA8Y29kZT4ud2FyPC9jb2RlPiBmaWxlLikgCisgKgorICogPHA+SW4gdGhlIGNhc2Ugb2YgYSB3ZWIKKyAqIGFwcGxpY2F0aW9uIG1hcmtlZCAiZGlzdHJpYnV0ZWQiIGluIGl0cyBkZXBsb3ltZW50IGRlc2NyaXB0b3IsIHRoZXJlIHdpbGwKKyAqIGJlIG9uZSBjb250ZXh0IGluc3RhbmNlIGZvciBlYWNoIHZpcnR1YWwgbWFjaGluZS4gIEluIHRoaXMgc2l0dWF0aW9uLCB0aGUgCisgKiBjb250ZXh0IGNhbm5vdCBiZSB1c2VkIGFzIGEgbG9jYXRpb24gdG8gc2hhcmUgZ2xvYmFsIGluZm9ybWF0aW9uIChiZWNhdXNlCisgKiB0aGUgaW5mb3JtYXRpb24gd29uJ3QgYmUgdHJ1bHkgZ2xvYmFsKS4gIFVzZSBhbiBleHRlcm5hbCByZXNvdXJjZSBsaWtlIAorICogYSBkYXRhYmFzZSBpbnN0ZWFkLgorICoKKyAqIDxwPlRoZSA8Y29kZT5TZXJ2bGV0Q29udGV4dDwvY29kZT4gb2JqZWN0IGlzIGNvbnRhaW5lZCB3aXRoaW4gCisgKiB0aGUge0BsaW5rIFNlcnZsZXRDb25maWd9IG9iamVjdCwgd2hpY2ggdGhlIFdlYiBzZXJ2ZXIgcHJvdmlkZXMgdGhlCisgKiBzZXJ2bGV0IHdoZW4gdGhlIHNlcnZsZXQgaXMgaW5pdGlhbGl6ZWQuCisgKgorICogQGF1dGhvciAJVmFyaW91cworICogQHZlcnNpb24gCSRWZXJzaW9uJAorICoKKyAqIEBzZWUgCVNlcnZsZXQjZ2V0U2VydmxldENvbmZpZworICogQHNlZSAJU2VydmxldENvbmZpZyNnZXRTZXJ2bGV0Q29udGV4dAorICoKKyAqLworCitwdWJsaWMgaW50ZXJmYWNlIFNlcnZsZXRDb250ZXh0IHsKKworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIDxjb2RlPlNlcnZsZXRDb250ZXh0PC9jb2RlPiBvYmplY3QgdGhhdCAKKyAgICAgKiBjb3JyZXNwb25kcyB0byBhIHNwZWNpZmllZCBVUkwgb24gdGhlIHNlcnZlci4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgbWV0aG9kIGFsbG93cyBzZXJ2bGV0cyB0byBnYWluCisgICAgICogYWNjZXNzIHRvIHRoZSBjb250ZXh0IGZvciB2YXJpb3VzIHBhcnRzIG9mIHRoZSBzZXJ2ZXIsIGFuZCBhcworICAgICAqIG5lZWRlZCBvYnRhaW4ge0BsaW5rIFJlcXVlc3REaXNwYXRjaGVyfSBvYmplY3RzIGZyb20gdGhlIGNvbnRleHQuCisgICAgICogVGhlIGdpdmVuIHBhdGggbXVzdCBiZSBiZWdpbiB3aXRoICIvIiwgaXMgaW50ZXJwcmV0ZWQgcmVsYXRpdmUgCisgICAgICogdG8gdGhlIHNlcnZlcidzIGRvY3VtZW50IHJvb3QgYW5kIGlzIG1hdGNoZWQgYWdhaW5zdCB0aGUgY29udGV4dCByb290cyBvZgorICAgICAqIG90aGVyIHdlYiBhcHBsaWNhdGlvbnMgaG9zdGVkIG9uIHRoaXMgY29udGFpbmVyLgorICAgICAqIAorICAgICAqIDxwPkluIGEgc2VjdXJpdHkgY29uc2Npb3VzIGVudmlyb25tZW50LCB0aGUgc2VydmxldCBjb250YWluZXIgbWF5CisgICAgICogcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGZvciBhIGdpdmVuIFVSTC4KKyAgICAgKiAgICAgICAKKyAgICAgKiBAcGFyYW0gdXJpcGF0aCAJYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHNwZWNpZnlpbmcgdGhlIGNvbnRleHQgcGF0aCBvZgorICAgICAqCQkJYW5vdGhlciB3ZWIgYXBwbGljYXRpb24gaW4gdGhlIGNvbnRhaW5lci4KKyAgICAgKiBAcmV0dXJuCQl0aGUgPGNvZGU+U2VydmxldENvbnRleHQ8L2NvZGU+IG9iamVjdCB0aGF0CisgICAgICoJCQljb3JyZXNwb25kcyB0byB0aGUgbmFtZWQgVVJMLCBvciBudWxsIGlmIGVpdGhlcgorCQkJbm9uZSBleGlzdHMgb3IgdGhlIGNvbnRhaW5lciB3aXNoZXMgdG8gcmVzdHJpY3QgCisgICAgICogCQkJdGhpcyBhY2Nlc3MuCisgICAgICoKKyAgICAgKiBAc2VlIAkJUmVxdWVzdERpc3BhdGNoZXIKKyAgICAgKgorICAgICAqLworCisgICAgcHVibGljIFNlcnZsZXRDb250ZXh0IGdldENvbnRleHQoU3RyaW5nIHVyaXBhdGgpOworICAgIAorICAgIAorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbWFqb3IgdmVyc2lvbiBvZiB0aGUgSmF2YSBTZXJ2bGV0IEFQSSB0aGF0IHRoaXMKKyAgICAgKiBzZXJ2bGV0IGNvbnRhaW5lciBzdXBwb3J0cy4gQWxsIGltcGxlbWVudGF0aW9ucyB0aGF0IGNvbXBseQorICAgICAqIHdpdGggVmVyc2lvbiAyLjQgbXVzdCBoYXZlIHRoaXMgbWV0aG9kCisgICAgICogcmV0dXJuIHRoZSBpbnRlZ2VyIDIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIAkJMgorICAgICAqCisgICAgICovCisgICAgCisgICAgcHVibGljIGludCBnZXRNYWpvclZlcnNpb24oKTsKKyAgICAKKyAgICAKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG1pbm9yIHZlcnNpb24gb2YgdGhlIFNlcnZsZXQgQVBJIHRoYXQgdGhpcworICAgICAqIHNlcnZsZXQgY29udGFpbmVyIHN1cHBvcnRzLiBBbGwgaW1wbGVtZW50YXRpb25zIHRoYXQgY29tcGx5CisgICAgICogd2l0aCBWZXJzaW9uIDIuNCBtdXN0IGhhdmUgdGhpcyBtZXRob2QKKyAgICAgKiByZXR1cm4gdGhlIGludGVnZXIgNC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gCQk0CisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyBpbnQgZ2V0TWlub3JWZXJzaW9uKCk7CisgICAgCisgICAgCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBNSU1FIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBmaWxlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiAKKyAgICAgKiB0aGUgTUlNRSB0eXBlIGlzIG5vdCBrbm93bi4gVGhlIE1JTUUgdHlwZSBpcyBkZXRlcm1pbmVkCisgICAgICogYnkgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHNlcnZsZXQgY29udGFpbmVyLCBhbmQgbWF5IGJlIHNwZWNpZmllZAorICAgICAqIGluIGEgd2ViIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQgZGVzY3JpcHRvci4gQ29tbW9uIE1JTUUKKyAgICAgKiB0eXBlcyBhcmUgPGNvZGU+InRleHQvaHRtbCI8L2NvZGU+IGFuZCA8Y29kZT4iaW1hZ2UvZ2lmIjwvY29kZT4uCisgICAgICoKKyAgICAgKgorICAgICAqIEBwYXJhbSAgIGZpbGUgICAgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHNwZWNpZnlpbmcgdGhlIG5hbWUKKyAgICAgKgkJCW9mIGEgZmlsZQorICAgICAqCisgICAgICogQHJldHVybiAJCWEgPGNvZGU+U3RyaW5nPC9jb2RlPiBzcGVjaWZ5aW5nIHRoZSBmaWxlJ3MgTUlNRSB0eXBlCisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWltZVR5cGUoU3RyaW5nIGZpbGUpOworICAgIAorICAgIC8qKgorICAgICogUmV0dXJucyBhIGRpcmVjdG9yeS1saWtlIGxpc3Rpbmcgb2YgYWxsIHRoZSBwYXRocyB0byByZXNvdXJjZXMgd2l0aGluIHRoZSB3ZWIgYXBwbGljYXRpb24gd2hvc2UgbG9uZ2VzdCBzdWItcGF0aAorICAgICogbWF0Y2hlcyB0aGUgc3VwcGxpZWQgcGF0aCBhcmd1bWVudC4gUGF0aHMgaW5kaWNhdGluZyBzdWJkaXJlY3RvcnkgcGF0aHMgZW5kIHdpdGggYSAnLycuIFRoZSByZXR1cm5lZCBwYXRocyBhcmUgYWxsIAorICAgICogcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIHdlYiBhcHBsaWNhdGlvbiBhbmQgaGF2ZSBhIGxlYWRpbmcgJy8nLiBGb3IgZXhhbXBsZSwgZm9yIGEgd2ViIGFwcGxpY2F0aW9uIAorICAgICogY29udGFpbmluZzxicj48YnI+CisKKyAgICAqIC93ZWxjb21lLmh0bWw8YnI+CisgICAgKiAvY2F0YWxvZy9pbmRleC5odG1sPGJyPgorICAgICogL2NhdGFsb2cvcHJvZHVjdHMuaHRtbDxicj4KKyAgICAqIC9jYXRhbG9nL29mZmVycy9ib29rcy5odG1sPGJyPgorICAgICogL2NhdGFsb2cvb2ZmZXJzL211c2ljLmh0bWw8YnI+CisgICAgKiAvY3VzdG9tZXIvbG9naW4uanNwPGJyPgorICAgICogL1dFQi1JTkYvd2ViLnhtbDxicj4KKyAgICAqIC9XRUItSU5GL2NsYXNzZXMvY29tLmFjbWUuT3JkZXJTZXJ2bGV0LmNsYXNzLDxicj48YnI+CisgICAgKgorICAgICogZ2V0UmVzb3VyY2VQYXRocygiLyIpIHJldHVybnMgeyIvd2VsY29tZS5odG1sIiwgIi9jYXRhbG9nLyIsICIvY3VzdG9tZXIvIiwgIi9XRUItSU5GLyJ9PGJyPgorICAgICogZ2V0UmVzb3VyY2VQYXRocygiL2NhdGFsb2cvIikgcmV0dXJucyB7Ii9jYXRhbG9nL2luZGV4Lmh0bWwiLCAiL2NhdGFsb2cvcHJvZHVjdHMuaHRtbCIsICIvY2F0YWxvZy9vZmZlcnMvIn0uPGJyPgorCSAgIAorCisKKyAgICAqQHBhcmFtIHBhdGgJCXRoZSBwYXJ0aWFsIHBhdGggdXNlZCB0byBtYXRjaCB0aGUgcmVzb3VyY2VzLAorICAgICoJCQkJd2hpY2ggbXVzdCBzdGFydCB3aXRoIGEgLworICAgICpAcmV0dXJuIGEgU2V0IGNvbnRhaW5pbmcgdGhlIGRpcmVjdG9yeSBsaXN0aW5nLCBvciBudWxsIGlmIHRoZXJlIGFyZSBubyByZXNvdXJjZXMgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbiB3aG9zZSBwYXRoCisJKiBiZWdpbnMgd2l0aCB0aGUgc3VwcGxpZWQgcGF0aC4KKworICAgICogQHNpbmNlIFNlcnZsZXQgMi4zCisgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgU2V0IGdldFJlc291cmNlUGF0aHMoU3RyaW5nIHBhdGgpOworICAgIAorICAgIAorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIFVSTCB0byB0aGUgcmVzb3VyY2UgdGhhdCBpcyBtYXBwZWQgdG8gYSBzcGVjaWZpZWQKKyAgICAgKiBwYXRoLiBUaGUgcGF0aCBtdXN0IGJlZ2luIHdpdGggYSAiLyIgYW5kIGlzIGludGVycHJldGVkCisgICAgICogYXMgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgY29udGV4dCByb290LgorICAgICAqCisgICAgICogPHA+VGhpcyBtZXRob2QgYWxsb3dzIHRoZSBzZXJ2bGV0IGNvbnRhaW5lciB0byBtYWtlIGEgcmVzb3VyY2UgCisgICAgICogYXZhaWxhYmxlIHRvIHNlcnZsZXRzIGZyb20gYW55IHNvdXJjZS4gUmVzb3VyY2VzIAorICAgICAqIGNhbiBiZSBsb2NhdGVkIG9uIGEgbG9jYWwgb3IgcmVtb3RlCisgICAgICogZmlsZSBzeXN0ZW0sIGluIGEgZGF0YWJhc2UsIG9yIGluIGEgPGNvZGU+LndhcjwvY29kZT4gZmlsZS4gCisgICAgICoKKyAgICAgKiA8cD5UaGUgc2VydmxldCBjb250YWluZXIgbXVzdCBpbXBsZW1lbnQgdGhlIFVSTCBoYW5kbGVycworICAgICAqIGFuZCA8Y29kZT5VUkxDb25uZWN0aW9uPC9jb2RlPiBvYmplY3RzIHRoYXQgYXJlIG5lY2Vzc2FyeQorICAgICAqIHRvIGFjY2VzcyB0aGUgcmVzb3VyY2UuCisgICAgICoKKyAgICAgKiA8cD5UaGlzIG1ldGhvZCByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+CisgICAgICogaWYgbm8gcmVzb3VyY2UgaXMgbWFwcGVkIHRvIHRoZSBwYXRobmFtZS4KKyAgICAgKgorICAgICAqIDxwPlNvbWUgY29udGFpbmVycyBtYXkgYWxsb3cgd3JpdGluZyB0byB0aGUgVVJMIHJldHVybmVkIGJ5CisgICAgICogdGhpcyBtZXRob2QgdXNpbmcgdGhlIG1ldGhvZHMgb2YgdGhlIFVSTCBjbGFzcy4KKyAgICAgKgorICAgICAqIDxwPlRoZSByZXNvdXJjZSBjb250ZW50IGlzIHJldHVybmVkIGRpcmVjdGx5LCBzbyBiZSBhd2FyZSB0aGF0IAorICAgICAqIHJlcXVlc3RpbmcgYSA8Y29kZT4uanNwPC9jb2RlPiBwYWdlIHJldHVybnMgdGhlIEpTUCBzb3VyY2UgY29kZS4KKyAgICAgKiBVc2UgYSA8Y29kZT5SZXF1ZXN0RGlzcGF0Y2hlcjwvY29kZT4gaW5zdGVhZCB0byBpbmNsdWRlIHJlc3VsdHMgb2YgCisgICAgICogYW4gZXhlY3V0aW9uLgorICAgICAqCisgICAgICogPHA+VGhpcyBtZXRob2QgaGFzIGEgZGlmZmVyZW50IHB1cnBvc2UgdGhhbgorICAgICAqIDxjb2RlPmphdmEubGFuZy5DbGFzcy5nZXRSZXNvdXJjZTwvY29kZT4sCisgICAgICogd2hpY2ggbG9va3MgdXAgcmVzb3VyY2VzIGJhc2VkIG9uIGEgY2xhc3MgbG9hZGVyLiBUaGlzCisgICAgICogbWV0aG9kIGRvZXMgbm90IHVzZSBjbGFzcyBsb2FkZXJzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBwYXRoIAkJCQlhIDxjb2RlPlN0cmluZzwvY29kZT4gc3BlY2lmeWluZworICAgICAqCQkJCQkJdGhlIHBhdGggdG8gdGhlIHJlc291cmNlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIAkJCQkJdGhlIHJlc291cmNlIGxvY2F0ZWQgYXQgdGhlIG5hbWVkIHBhdGgsCisgICAgICogCQkJCQkJb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gcmVzb3VyY2UKKyAgICAgKgkJCQkJCWF0IHRoYXQgcGF0aAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBNYWxmb3JtZWRVUkxFeGNlcHRpb24gCWlmIHRoZSBwYXRobmFtZSBpcyBub3QgZ2l2ZW4gaW4gCisgICAgICogCQkJCQkJdGhlIGNvcnJlY3QgZm9ybQorICAgICAqCisgICAgICovCisgICAgCisgICAgcHVibGljIFVSTCBnZXRSZXNvdXJjZShTdHJpbmcgcGF0aCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKKyAgICAKKyAgICAKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHJlc291cmNlIGxvY2F0ZWQgYXQgdGhlIG5hbWVkIHBhdGggYXMKKyAgICAgKiBhbiA8Y29kZT5JbnB1dFN0cmVhbTwvY29kZT4gb2JqZWN0LgorICAgICAqCisgICAgICogPHA+VGhlIGRhdGEgaW4gdGhlIDxjb2RlPklucHV0U3RyZWFtPC9jb2RlPiBjYW4gYmUgCisgICAgICogb2YgYW55IHR5cGUgb3IgbGVuZ3RoLiBUaGUgcGF0aCBtdXN0IGJlIHNwZWNpZmllZCBhY2NvcmRpbmcKKyAgICAgKiB0byB0aGUgcnVsZXMgZ2l2ZW4gaW4gPGNvZGU+Z2V0UmVzb3VyY2U8L2NvZGU+LgorICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gcmVzb3VyY2UgZXhpc3RzIGF0CisgICAgICogdGhlIHNwZWNpZmllZCBwYXRoLiAKKyAgICAgKiAKKyAgICAgKiA8cD5NZXRhLWluZm9ybWF0aW9uIHN1Y2ggYXMgY29udGVudCBsZW5ndGggYW5kIGNvbnRlbnQgdHlwZQorICAgICAqIHRoYXQgaXMgYXZhaWxhYmxlIHZpYSA8Y29kZT5nZXRSZXNvdXJjZTwvY29kZT4KKyAgICAgKiBtZXRob2QgaXMgbG9zdCB3aGVuIHVzaW5nIHRoaXMgbWV0aG9kLgorICAgICAqCisgICAgICogPHA+VGhlIHNlcnZsZXQgY29udGFpbmVyIG11c3QgaW1wbGVtZW50IHRoZSBVUkwgaGFuZGxlcnMKKyAgICAgKiBhbmQgPGNvZGU+VVJMQ29ubmVjdGlvbjwvY29kZT4gb2JqZWN0cyBuZWNlc3NhcnkgdG8gYWNjZXNzCisgICAgICogdGhlIHJlc291cmNlLgorICAgICAqCisgICAgICogPHA+VGhpcyBtZXRob2QgaXMgZGlmZmVyZW50IGZyb20gCisgICAgICogPGNvZGU+amF2YS5sYW5nLkNsYXNzLmdldFJlc291cmNlQXNTdHJlYW08L2NvZGU+LAorICAgICAqIHdoaWNoIHVzZXMgYSBjbGFzcyBsb2FkZXIuIFRoaXMgbWV0aG9kIGFsbG93cyBzZXJ2bGV0IGNvbnRhaW5lcnMgCisgICAgICogdG8gbWFrZSBhIHJlc291cmNlIGF2YWlsYWJsZQorICAgICAqIHRvIGEgc2VydmxldCBmcm9tIGFueSBsb2NhdGlvbiwgd2l0aG91dCB1c2luZyBhIGNsYXNzIGxvYWRlci4KKyAgICAgKiAKKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXRoIAlhIDxjb2RlPlN0cmluZzwvY29kZT4gc3BlY2lmeWluZyB0aGUgcGF0aAorICAgICAqCQkJdG8gdGhlIHJlc291cmNlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIAkJdGhlIDxjb2RlPklucHV0U3RyZWFtPC9jb2RlPiByZXR1cm5lZCB0byB0aGUgCisgICAgICoJCQlzZXJ2bGV0LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyByZXNvdXJjZQorICAgICAqCQkJZXhpc3RzIGF0IHRoZSBzcGVjaWZpZWQgcGF0aCAKKyAgICAgKgorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0UmVzb3VyY2VBc1N0cmVhbShTdHJpbmcgcGF0aCk7CisgICAgCisKKworCisgICAgLyoqCisgICAgICogCisgICAgICogUmV0dXJucyBhIHtAbGluayBSZXF1ZXN0RGlzcGF0Y2hlcn0gb2JqZWN0IHRoYXQgYWN0cworICAgICAqIGFzIGEgd3JhcHBlciBmb3IgdGhlIHJlc291cmNlIGxvY2F0ZWQgYXQgdGhlIGdpdmVuIHBhdGguCisgICAgICogQSA8Y29kZT5SZXF1ZXN0RGlzcGF0Y2hlcjwvY29kZT4gb2JqZWN0IGNhbiBiZSB1c2VkIHRvIGZvcndhcmQgCisgICAgICogYSByZXF1ZXN0IHRvIHRoZSByZXNvdXJjZSBvciB0byBpbmNsdWRlIHRoZSByZXNvdXJjZSBpbiBhIHJlc3BvbnNlLgorICAgICAqIFRoZSByZXNvdXJjZSBjYW4gYmUgZHluYW1pYyBvciBzdGF0aWMuCisgICAgICoKKyAgICAgKiA8cD5UaGUgcGF0aG5hbWUgbXVzdCBiZWdpbiB3aXRoIGEgIi8iIGFuZCBpcyBpbnRlcnByZXRlZCBhcyByZWxhdGl2ZQorICAgICAqIHRvIHRoZSBjdXJyZW50IGNvbnRleHQgcm9vdC4gIFVzZSA8Y29kZT5nZXRDb250ZXh0PC9jb2RlPiB0byBvYnRhaW4KKyAgICAgKiBhIDxjb2RlPlJlcXVlc3REaXNwYXRjaGVyPC9jb2RlPiBmb3IgcmVzb3VyY2VzIGluIGZvcmVpZ24gY29udGV4dHMuCisgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgPGNvZGU+U2VydmxldENvbnRleHQ8L2NvZGU+CisgICAgICogY2Fubm90IHJldHVybiBhIDxjb2RlPlJlcXVlc3REaXNwYXRjaGVyPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXRoIAlhIDxjb2RlPlN0cmluZzwvY29kZT4gc3BlY2lmeWluZyB0aGUgcGF0aG5hbWUKKyAgICAgKgkJCXRvIHRoZSByZXNvdXJjZQorICAgICAqCisgICAgICogQHJldHVybiAJCWEgPGNvZGU+UmVxdWVzdERpc3BhdGNoZXI8L2NvZGU+IG9iamVjdAorICAgICAqCQkJdGhhdCBhY3RzIGFzIGEgd3JhcHBlciBmb3IgdGhlIHJlc291cmNlCisgICAgICoJCQlhdCB0aGUgc3BlY2lmaWVkIHBhdGgsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIAorICAgICAqCQkJdGhlIDxjb2RlPlNlcnZsZXRDb250ZXh0PC9jb2RlPiBjYW5ub3QgcmV0dXJuCisgICAgICoJCQlhIDxjb2RlPlJlcXVlc3REaXNwYXRjaGVyPC9jb2RlPgorICAgICAqCisgICAgICogQHNlZSAJCVJlcXVlc3REaXNwYXRjaGVyCisgICAgICogQHNlZSAJCVNlcnZsZXRDb250ZXh0I2dldENvbnRleHQKKyAgICAgKgorICAgICAqLworCisgICAgcHVibGljIFJlcXVlc3REaXNwYXRjaGVyIGdldFJlcXVlc3REaXNwYXRjaGVyKFN0cmluZyBwYXRoKTsKKworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEge0BsaW5rIFJlcXVlc3REaXNwYXRjaGVyfSBvYmplY3QgdGhhdCBhY3RzCisgICAgICogYXMgYSB3cmFwcGVyIGZvciB0aGUgbmFtZWQgc2VydmxldC4KKyAgICAgKgorICAgICAqIDxwPlNlcnZsZXRzIChhbmQgSlNQIHBhZ2VzIGFsc28pIG1heSBiZSBnaXZlbiBuYW1lcyB2aWEgc2VydmVyIAorICAgICAqIGFkbWluaXN0cmF0aW9uIG9yIHZpYSBhIHdlYiBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCisgICAgICogQSBzZXJ2bGV0IGluc3RhbmNlIGNhbiBkZXRlcm1pbmUgaXRzIG5hbWUgdXNpbmcgCisgICAgICoge0BsaW5rIFNlcnZsZXRDb25maWcjZ2V0U2VydmxldE5hbWV9LgorICAgICAqCisgICAgICogPHA+VGhpcyBtZXRob2QgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgCisgICAgICogPGNvZGU+U2VydmxldENvbnRleHQ8L2NvZGU+CisgICAgICogY2Fubm90IHJldHVybiBhIDxjb2RlPlJlcXVlc3REaXNwYXRjaGVyPC9jb2RlPiBmb3IgYW55IHJlYXNvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIAlhIDxjb2RlPlN0cmluZzwvY29kZT4gc3BlY2lmeWluZyB0aGUgbmFtZQorICAgICAqCQkJb2YgYSBzZXJ2bGV0IHRvIHdyYXAKKyAgICAgKgorICAgICAqIEByZXR1cm4gCQlhIDxjb2RlPlJlcXVlc3REaXNwYXRjaGVyPC9jb2RlPiBvYmplY3QKKyAgICAgKgkJCXRoYXQgYWN0cyBhcyBhIHdyYXBwZXIgZm9yIHRoZSBuYW1lZCBzZXJ2bGV0LAorICAgICAqCQkJb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIDxjb2RlPlNlcnZsZXRDb250ZXh0PC9jb2RlPgorICAgICAqCQkJY2Fubm90IHJldHVybiBhIDxjb2RlPlJlcXVlc3REaXNwYXRjaGVyPC9jb2RlPgorICAgICAqCisgICAgICogQHNlZSAJCVJlcXVlc3REaXNwYXRjaGVyCisgICAgICogQHNlZSAJCVNlcnZsZXRDb250ZXh0I2dldENvbnRleHQKKyAgICAgKiBAc2VlIAkJU2VydmxldENvbmZpZyNnZXRTZXJ2bGV0TmFtZQorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgUmVxdWVzdERpc3BhdGNoZXIgZ2V0TmFtZWREaXNwYXRjaGVyKFN0cmluZyBuYW1lKTsKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKgorICAgICAqIEBkZXByZWNhdGVkCUFzIG9mIEphdmEgU2VydmxldCBBUEkgMi4xLCB3aXRoIG5vIGRpcmVjdCByZXBsYWNlbWVudC4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgbWV0aG9kIHdhcyBvcmlnaW5hbGx5IGRlZmluZWQgdG8gcmV0cmlldmUgYSBzZXJ2bGV0CisgICAgICogZnJvbSBhIDxjb2RlPlNlcnZsZXRDb250ZXh0PC9jb2RlPi4gSW4gdGhpcyB2ZXJzaW9uLCB0aGlzIG1ldGhvZCAKKyAgICAgKiBhbHdheXMgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBhbmQgcmVtYWlucyBvbmx5IHRvIHByZXNlcnZlIAorICAgICAqIGJpbmFyeSBjb21wYXRpYmlsaXR5LiBUaGlzIG1ldGhvZCB3aWxsIGJlIHBlcm1hbmVudGx5IHJlbW92ZWQgCisgICAgICogaW4gYSBmdXR1cmUgdmVyc2lvbiBvZiB0aGUgSmF2YSBTZXJ2bGV0IEFQSS4KKyAgICAgKgorICAgICAqIDxwPkluIGxpZXUgb2YgdGhpcyBtZXRob2QsIHNlcnZsZXRzIGNhbiBzaGFyZSBpbmZvcm1hdGlvbiB1c2luZyB0aGUgCisgICAgICogPGNvZGU+U2VydmxldENvbnRleHQ8L2NvZGU+IGNsYXNzIGFuZCBjYW4gcGVyZm9ybSBzaGFyZWQgYnVzaW5lc3MgbG9naWMKKyAgICAgKiBieSBpbnZva2luZyBtZXRob2RzIG9uIGNvbW1vbiBub24tc2VydmxldCBjbGFzc2VzLgorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgU2VydmxldCBnZXRTZXJ2bGV0KFN0cmluZyBuYW1lKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbjsKKyAgICAKKyAgCisgIAorICAKKyAgICAKKworICAgIC8qKgorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQJQXMgb2YgSmF2YSBTZXJ2bGV0IEFQSSAyLjAsIHdpdGggbm8gcmVwbGFjZW1lbnQuCisgICAgICoKKyAgICAgKiA8cD5UaGlzIG1ldGhvZCB3YXMgb3JpZ2luYWxseSBkZWZpbmVkIHRvIHJldHVybiBhbiA8Y29kZT5FbnVtZXJhdGlvbjwvY29kZT4KKyAgICAgKiBvZiBhbGwgdGhlIHNlcnZsZXRzIGtub3duIHRvIHRoaXMgc2VydmxldCBjb250ZXh0LiBJbiB0aGlzCisgICAgICogdmVyc2lvbiwgdGhpcyBtZXRob2QgYWx3YXlzIHJldHVybnMgYW4gZW1wdHkgZW51bWVyYXRpb24gYW5kCisgICAgICogcmVtYWlucyBvbmx5IHRvIHByZXNlcnZlIGJpbmFyeSBjb21wYXRpYmlsaXR5LiBUaGlzIG1ldGhvZAorICAgICAqIHdpbGwgYmUgcGVybWFuZW50bHkgcmVtb3ZlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uIG9mIHRoZSBKYXZhCisgICAgICogU2VydmxldCBBUEkuCisgICAgICoKKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0U2VydmxldHMoKTsKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKworICAgIC8qKgorICAgICAqIEBkZXByZWNhdGVkCUFzIG9mIEphdmEgU2VydmxldCBBUEkgMi4xLCB3aXRoIG5vIHJlcGxhY2VtZW50LgorICAgICAqCisgICAgICogPHA+VGhpcyBtZXRob2Qgd2FzIG9yaWdpbmFsbHkgZGVmaW5lZCB0byByZXR1cm4gYW4gCisgICAgICogPGNvZGU+RW51bWVyYXRpb248L2NvZGU+CisgICAgICogb2YgYWxsIHRoZSBzZXJ2bGV0IG5hbWVzIGtub3duIHRvIHRoaXMgY29udGV4dC4gSW4gdGhpcyB2ZXJzaW9uLAorICAgICAqIHRoaXMgbWV0aG9kIGFsd2F5cyByZXR1cm5zIGFuIGVtcHR5IDxjb2RlPkVudW1lcmF0aW9uPC9jb2RlPiBhbmQgCisgICAgICogcmVtYWlucyBvbmx5IHRvIHByZXNlcnZlIGJpbmFyeSBjb21wYXRpYmlsaXR5LiBUaGlzIG1ldGhvZCB3aWxsIAorICAgICAqIGJlIHBlcm1hbmVudGx5IHJlbW92ZWQgaW4gYSBmdXR1cmUgdmVyc2lvbiBvZiB0aGUgSmF2YSBTZXJ2bGV0IEFQSS4KKyAgICAgKgorICAgICAqLworIAorICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRTZXJ2bGV0TmFtZXMoKTsKKyAgICAKKyAgCisgIAorICAgIAorICAgIAorICAgIC8qKgorICAgICAqCisgICAgICogV3JpdGVzIHRoZSBzcGVjaWZpZWQgbWVzc2FnZSB0byBhIHNlcnZsZXQgbG9nIGZpbGUsIHVzdWFsbHkKKyAgICAgKiBhbiBldmVudCBsb2cuIFRoZSBuYW1lIGFuZCB0eXBlIG9mIHRoZSBzZXJ2bGV0IGxvZyBmaWxlIGlzIAorICAgICAqIHNwZWNpZmljIHRvIHRoZSBzZXJ2bGV0IGNvbnRhaW5lci4KKyAgICAgKgorICAgICAqCisgICAgICogQHBhcmFtIG1zZyAJYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHNwZWNpZnlpbmcgdGhlIAorICAgICAqCQkJbWVzc2FnZSB0byBiZSB3cml0dGVuIHRvIHRoZSBsb2cgZmlsZQorICAgICAqCisgICAgICovCisgICAgIAorICAgIHB1YmxpYyB2b2lkIGxvZyhTdHJpbmcgbXNnKTsKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKworICAgIC8qKgorICAgICAqIEBkZXByZWNhdGVkCUFzIG9mIEphdmEgU2VydmxldCBBUEkgMi4xLCB1c2UKKyAgICAgKiAJCQl7QGxpbmsgI2xvZyhTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIHRocm93YWJsZSl9IAorICAgICAqCQkJaW5zdGVhZC4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgbWV0aG9kIHdhcyBvcmlnaW5hbGx5IGRlZmluZWQgdG8gd3JpdGUgYW4gCisgICAgICogZXhjZXB0aW9uJ3Mgc3RhY2sgdHJhY2UgYW5kIGFuIGV4cGxhbmF0b3J5IGVycm9yIG1lc3NhZ2UKKyAgICAgKiB0byB0aGUgc2VydmxldCBsb2cgZmlsZS4KKyAgICAgKgorICAgICAqLworCisgICAgcHVibGljIHZvaWQgbG9nKEV4Y2VwdGlvbiBleGNlcHRpb24sIFN0cmluZyBtc2cpOworICAgIAorICAgIAorICAgIAorICAgIAorCisgICAgLyoqCisgICAgICogV3JpdGVzIGFuIGV4cGxhbmF0b3J5IG1lc3NhZ2UgYW5kIGEgc3RhY2sgdHJhY2UKKyAgICAgKiBmb3IgYSBnaXZlbiA8Y29kZT5UaHJvd2FibGU8L2NvZGU+IGV4Y2VwdGlvbgorICAgICAqIHRvIHRoZSBzZXJ2bGV0IGxvZyBmaWxlLiBUaGUgbmFtZSBhbmQgdHlwZSBvZiB0aGUgc2VydmxldCBsb2cgCisgICAgICogZmlsZSBpcyBzcGVjaWZpYyB0byB0aGUgc2VydmxldCBjb250YWluZXIsIHVzdWFsbHkgYW4gZXZlbnQgbG9nLgorICAgICAqCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVzc2FnZSAJCWEgPGNvZGU+U3RyaW5nPC9jb2RlPiB0aGF0IAorICAgICAqCQkJCWRlc2NyaWJlcyB0aGUgZXJyb3Igb3IgZXhjZXB0aW9uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGhyb3dhYmxlIAl0aGUgPGNvZGU+VGhyb3dhYmxlPC9jb2RlPiBlcnJvciAKKyAgICAgKgkJCQlvciBleGNlcHRpb24KKyAgICAgKgorICAgICAqLworICAgIAorICAgIHB1YmxpYyB2b2lkIGxvZyhTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIHRocm93YWJsZSk7CisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIDxjb2RlPlN0cmluZzwvY29kZT4gY29udGFpbmluZyB0aGUgcmVhbCBwYXRoIAorICAgICAqIGZvciBhIGdpdmVuIHZpcnR1YWwgcGF0aC4gRm9yIGV4YW1wbGUsIHRoZSBwYXRoICIvaW5kZXguaHRtbCIKKyAgICAgKiByZXR1cm5zIHRoZSBhYnNvbHV0ZSBmaWxlIHBhdGggb24gdGhlIHNlcnZlcidzIGZpbGVzeXN0ZW0gd291bGQgYmUKKyAgICAgKiBzZXJ2ZWQgYnkgYSByZXF1ZXN0IGZvciAiaHR0cDovL2hvc3QvY29udGV4dFBhdGgvaW5kZXguaHRtbCIsCisgICAgICogd2hlcmUgY29udGV4dFBhdGggaXMgdGhlIGNvbnRleHQgcGF0aCBvZiB0aGlzIFNlcnZsZXRDb250ZXh0Li4KKyAgICAgKgorICAgICAqIDxwPlRoZSByZWFsIHBhdGggcmV0dXJuZWQgd2lsbCBiZSBpbiBhIGZvcm0KKyAgICAgKiBhcHByb3ByaWF0ZSB0byB0aGUgY29tcHV0ZXIgYW5kIG9wZXJhdGluZyBzeXN0ZW0gb24KKyAgICAgKiB3aGljaCB0aGUgc2VydmxldCBjb250YWluZXIgaXMgcnVubmluZywgaW5jbHVkaW5nIHRoZQorICAgICAqIHByb3BlciBwYXRoIHNlcGFyYXRvcnMuIFRoaXMgbWV0aG9kIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4KKyAgICAgKiBpZiB0aGUgc2VydmxldCBjb250YWluZXIgY2Fubm90IHRyYW5zbGF0ZSB0aGUgdmlydHVhbCBwYXRoCisgICAgICogdG8gYSByZWFsIHBhdGggZm9yIGFueSByZWFzb24gKHN1Y2ggYXMgd2hlbiB0aGUgY29udGVudCBpcworICAgICAqIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGZyb20gYSA8Y29kZT4ud2FyPC9jb2RlPiBhcmNoaXZlKS4KKyAgICAgKgorICAgICAqCisgICAgICogQHBhcmFtIHBhdGggCWEgPGNvZGU+U3RyaW5nPC9jb2RlPiBzcGVjaWZ5aW5nIGEgdmlydHVhbCBwYXRoCisgICAgICoKKyAgICAgKgorICAgICAqIEByZXR1cm4gCQlhIDxjb2RlPlN0cmluZzwvY29kZT4gc3BlY2lmeWluZyB0aGUgcmVhbCBwYXRoLAorICAgICAqICAgICAgICAgICAgICAgICAgb3IgbnVsbCBpZiB0aGUgdHJhbnNsYXRpb24gY2Fubm90IGJlIHBlcmZvcm1lZAorICAgICAqCQkJCisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVhbFBhdGgoU3RyaW5nIHBhdGgpOworICAgIAorICAgIAorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIGFuZCB2ZXJzaW9uIG9mIHRoZSBzZXJ2bGV0IGNvbnRhaW5lciBvbiB3aGljaAorICAgICAqIHRoZSBzZXJ2bGV0IGlzIHJ1bm5pbmcuIAorICAgICAqCisgICAgICogPHA+VGhlIGZvcm0gb2YgdGhlIHJldHVybmVkIHN0cmluZyBpcyAKKyAgICAgKiA8aT5zZXJ2ZXJuYW1lPC9pPi88aT52ZXJzaW9ubnVtYmVyPC9pPi4KKyAgICAgKiBGb3IgZXhhbXBsZSwgdGhlIEphdmFTZXJ2ZXIgV2ViIERldmVsb3BtZW50IEtpdCBtYXkgcmV0dXJuIHRoZSBzdHJpbmcKKyAgICAgKiA8Y29kZT5KYXZhU2VydmVyIFdlYiBEZXYgS2l0LzEuMDwvY29kZT4uCisgICAgICoKKyAgICAgKiA8cD5UaGUgc2VydmxldCBjb250YWluZXIgbWF5IHJldHVybiBvdGhlciBvcHRpb25hbCBpbmZvcm1hdGlvbiAKKyAgICAgKiBhZnRlciB0aGUgcHJpbWFyeSBzdHJpbmcgaW4gcGFyZW50aGVzZXMsIGZvciBleGFtcGxlLAorICAgICAqIDxjb2RlPkphdmFTZXJ2ZXIgV2ViIERldiBLaXQvMS4wIChKREsgMS4xLjY7IFdpbmRvd3MgTlQgNC4wIHg4Nik8L2NvZGU+LgorICAgICAqCisgICAgICoKKyAgICAgKiBAcmV0dXJuIAkJYSA8Y29kZT5TdHJpbmc8L2NvZGU+IGNvbnRhaW5pbmcgYXQgbGVhc3QgdGhlIAorICAgICAqCQkJc2VydmxldCBjb250YWluZXIgbmFtZSBhbmQgdmVyc2lvbiBudW1iZXIKKyAgICAgKgorICAgICAqLworCisgICAgcHVibGljIFN0cmluZyBnZXRTZXJ2ZXJJbmZvKCk7CisgICAgCisgICAgCisKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IGNvbnRhaW5pbmcgdGhlIHZhbHVlIG9mIHRoZSBuYW1lZAorICAgICAqIGNvbnRleHQtd2lkZSBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSAKKyAgICAgKiBwYXJhbWV0ZXIgZG9lcyBub3QgZXhpc3QuCisgICAgICoKKyAgICAgKiA8cD5UaGlzIG1ldGhvZCBjYW4gbWFrZSBhdmFpbGFibGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiB1c2VmdWwKKyAgICAgKiB0byBhbiBlbnRpcmUgIndlYiBhcHBsaWNhdGlvbiIuICBGb3IgZXhhbXBsZSwgaXQgY2FuIHByb3ZpZGUgYSAKKyAgICAgKiB3ZWJtYXN0ZXIncyBlbWFpbCBhZGRyZXNzIG9yIHRoZSBuYW1lIG9mIGEgc3lzdGVtIHRoYXQgaG9sZHMgCisgICAgICogY3JpdGljYWwgZGF0YS4KKyAgICAgKgorICAgICAqIEBwYXJhbQluYW1lCWEgPGNvZGU+U3RyaW5nPC9jb2RlPiBjb250YWluaW5nIHRoZSBuYW1lIG9mIHRoZQorICAgICAqICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyIHdob3NlIHZhbHVlIGlzIHJlcXVlc3RlZAorICAgICAqIAorICAgICAqIEByZXR1cm4gCQlhIDxjb2RlPlN0cmluZzwvY29kZT4gY29udGFpbmluZyBhdCBsZWFzdCB0aGUgCisgICAgICoJCQlzZXJ2bGV0IGNvbnRhaW5lciBuYW1lIGFuZCB2ZXJzaW9uIG51bWJlcgorICAgICAqCisgICAgICogQHNlZSBTZXJ2bGV0Q29uZmlnI2dldEluaXRQYXJhbWV0ZXIKKyAgICAgKi8KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5pdFBhcmFtZXRlcihTdHJpbmcgbmFtZSk7CisgICAgCisgICAgCisKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG5hbWVzIG9mIHRoZSBjb250ZXh0J3MgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycyBhcyBhbgorICAgICAqIDxjb2RlPkVudW1lcmF0aW9uPC9jb2RlPiBvZiA8Y29kZT5TdHJpbmc8L2NvZGU+IG9iamVjdHMsIG9yIGFuCisgICAgICogZW1wdHkgPGNvZGU+RW51bWVyYXRpb248L2NvZGU+IGlmIHRoZSBjb250ZXh0IGhhcyBubyBpbml0aWFsaXphdGlvbgorICAgICAqIHBhcmFtZXRlcnMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIAkJYW4gPGNvZGU+RW51bWVyYXRpb248L2NvZGU+IG9mIDxjb2RlPlN0cmluZzwvY29kZT4gCisgICAgICogICAgICAgICAgICAgICAgICBvYmplY3RzIGNvbnRhaW5pbmcgdGhlIG5hbWVzIG9mIHRoZSBjb250ZXh0J3MKKyAgICAgKiAgICAgICAgICAgICAgICAgIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMKKyAgICAgKgorICAgICAqIEBzZWUgU2VydmxldENvbmZpZyNnZXRJbml0UGFyYW1ldGVyCisgICAgICovCisKKyAgICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0SW5pdFBhcmFtZXRlck5hbWVzKCk7CisgICAgCisgICAgCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzZXJ2bGV0IGNvbnRhaW5lciBhdHRyaWJ1dGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgCisgICAgICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gYXR0cmlidXRlIGJ5IHRoYXQgbmFtZS4KKyAgICAgKiBBbiBhdHRyaWJ1dGUgYWxsb3dzIGEgc2VydmxldCBjb250YWluZXIgdG8gZ2l2ZSB0aGUKKyAgICAgKiBzZXJ2bGV0IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gbm90CisgICAgICogYWxyZWFkeSBwcm92aWRlZCBieSB0aGlzIGludGVyZmFjZS4gU2VlIHlvdXIKKyAgICAgKiBzZXJ2ZXIgZG9jdW1lbnRhdGlvbiBmb3IgaW5mb3JtYXRpb24gYWJvdXQgaXRzIGF0dHJpYnV0ZXMuCisgICAgICogQSBsaXN0IG9mIHN1cHBvcnRlZCBhdHRyaWJ1dGVzIGNhbiBiZSByZXRyaWV2ZWQgdXNpbmcKKyAgICAgKiA8Y29kZT5nZXRBdHRyaWJ1dGVOYW1lczwvY29kZT4uCisgICAgICoKKyAgICAgKiA8cD5UaGUgYXR0cmlidXRlIGlzIHJldHVybmVkIGFzIGEgPGNvZGU+amF2YS5sYW5nLk9iamVjdDwvY29kZT4KKyAgICAgKiBvciBzb21lIHN1YmNsYXNzLgorICAgICAqIEF0dHJpYnV0ZSBuYW1lcyBzaG91bGQgZm9sbG93IHRoZSBzYW1lIGNvbnZlbnRpb24gYXMgcGFja2FnZQorICAgICAqIG5hbWVzLiBUaGUgSmF2YSBTZXJ2bGV0IEFQSSBzcGVjaWZpY2F0aW9uIHJlc2VydmVzIG5hbWVzCisgICAgICogbWF0Y2hpbmcgPGNvZGU+amF2YS4qPC9jb2RlPiwgPGNvZGU+amF2YXguKjwvY29kZT4sCisgICAgICogYW5kIDxjb2RlPnN1bi4qPC9jb2RlPi4KKyAgICAgKgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgCWEgPGNvZGU+U3RyaW5nPC9jb2RlPiBzcGVjaWZ5aW5nIHRoZSBuYW1lIAorICAgICAqCQkJb2YgdGhlIGF0dHJpYnV0ZQorICAgICAqCisgICAgICogQHJldHVybiAJCWFuIDxjb2RlPk9iamVjdDwvY29kZT4gY29udGFpbmluZyB0aGUgdmFsdWUgCisgICAgICoJCQlvZiB0aGUgYXR0cmlidXRlLCBvciA8Y29kZT5udWxsPC9jb2RlPgorICAgICAqCQkJaWYgbm8gYXR0cmlidXRlIGV4aXN0cyBtYXRjaGluZyB0aGUgZ2l2ZW4KKyAgICAgKgkJCW5hbWUKKyAgICAgKgorICAgICAqIEBzZWUgCQlTZXJ2bGV0Q29udGV4dCNnZXRBdHRyaWJ1dGVOYW1lcworICAgICAqCisgICAgICovCisgIAorICAgIHB1YmxpYyBPYmplY3QgZ2V0QXR0cmlidXRlKFN0cmluZyBuYW1lKTsKKyAgICAKKyAgICAKKyAgICAKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYW4gPGNvZGU+RW51bWVyYXRpb248L2NvZGU+IGNvbnRhaW5pbmcgdGhlIAorICAgICAqIGF0dHJpYnV0ZSBuYW1lcyBhdmFpbGFibGUKKyAgICAgKiB3aXRoaW4gdGhpcyBzZXJ2bGV0IGNvbnRleHQuIFVzZSB0aGUKKyAgICAgKiB7QGxpbmsgI2dldEF0dHJpYnV0ZX0gbWV0aG9kIHdpdGggYW4gYXR0cmlidXRlIG5hbWUKKyAgICAgKiB0byBnZXQgdGhlIHZhbHVlIG9mIGFuIGF0dHJpYnV0ZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gCQlhbiA8Y29kZT5FbnVtZXJhdGlvbjwvY29kZT4gb2YgYXR0cmlidXRlIAorICAgICAqCQkJbmFtZXMKKyAgICAgKgorICAgICAqIEBzZWUJCSNnZXRBdHRyaWJ1dGUKKyAgICAgKgorICAgICAqLworCisgICAgcHVibGljIEVudW1lcmF0aW9uIGdldEF0dHJpYnV0ZU5hbWVzKCk7CisgICAgCisgICAgCisgICAgCisgICAgCisgICAgLyoqCisgICAgICoKKyAgICAgKiBCaW5kcyBhbiBvYmplY3QgdG8gYSBnaXZlbiBhdHRyaWJ1dGUgbmFtZSBpbiB0aGlzIHNlcnZsZXQgY29udGV4dC4gSWYKKyAgICAgKiB0aGUgbmFtZSBzcGVjaWZpZWQgaXMgYWxyZWFkeSB1c2VkIGZvciBhbiBhdHRyaWJ1dGUsIHRoaXMKKyAgICAgKiBtZXRob2Qgd2lsbCByZXBsYWNlIHRoZSBhdHRyaWJ1dGUgd2l0aCB0aGUgbmV3IHRvIHRoZSBuZXcgYXR0cmlidXRlLgorICAgICAqIDxwPklmIGxpc3RlbmVycyBhcmUgY29uZmlndXJlZCBvbiB0aGUgPGNvZGU+U2VydmxldENvbnRleHQ8L2NvZGU+IHRoZSAgCisgICAgICogY29udGFpbmVyIG5vdGlmaWVzIHRoZW0gYWNjb3JkaW5nbHkuCisgICAgICogPHA+CisgICAgICogSWYgYSBudWxsIHZhbHVlIGlzIHBhc3NlZCwgdGhlIGVmZmVjdCBpcyB0aGUgc2FtZSBhcyBjYWxsaW5nIAorICAgICAqIDxjb2RlPnJlbW92ZUF0dHJpYnV0ZSgpPC9jb2RlPi4KKyAgICAgKiAKKyAgICAgKiA8cD5BdHRyaWJ1dGUgbmFtZXMgc2hvdWxkIGZvbGxvdyB0aGUgc2FtZSBjb252ZW50aW9uIGFzIHBhY2thZ2UKKyAgICAgKiBuYW1lcy4gVGhlIEphdmEgU2VydmxldCBBUEkgc3BlY2lmaWNhdGlvbiByZXNlcnZlcyBuYW1lcworICAgICAqIG1hdGNoaW5nIDxjb2RlPmphdmEuKjwvY29kZT4sIDxjb2RlPmphdmF4Lio8L2NvZGU+LCBhbmQKKyAgICAgKiA8Y29kZT5zdW4uKjwvY29kZT4uCisgICAgICoKKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIAlhIDxjb2RlPlN0cmluZzwvY29kZT4gc3BlY2lmeWluZyB0aGUgbmFtZSAKKyAgICAgKgkJCW9mIHRoZSBhdHRyaWJ1dGUKKyAgICAgKgorICAgICAqIEBwYXJhbSBvYmplY3QgCWFuIDxjb2RlPk9iamVjdDwvY29kZT4gcmVwcmVzZW50aW5nIHRoZQorICAgICAqCQkJYXR0cmlidXRlIHRvIGJlIGJvdW5kCisgICAgICoKKyAgICAgKgorICAgICAqCisgICAgICovCisgICAgCisgICAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBuYW1lLCBPYmplY3Qgb2JqZWN0KTsKKyAgICAKKyAgICAKKworCisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIHRoZSBhdHRyaWJ1dGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBmcm9tIAorICAgICAqIHRoZSBzZXJ2bGV0IGNvbnRleHQuIEFmdGVyIHJlbW92YWwsIHN1YnNlcXVlbnQgY2FsbHMgdG8KKyAgICAgKiB7QGxpbmsgI2dldEF0dHJpYnV0ZX0gdG8gcmV0cmlldmUgdGhlIGF0dHJpYnV0ZSdzIHZhbHVlCisgICAgICogd2lsbCByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCisKKyAgICAgKiA8cD5JZiBsaXN0ZW5lcnMgYXJlIGNvbmZpZ3VyZWQgb24gdGhlIDxjb2RlPlNlcnZsZXRDb250ZXh0PC9jb2RlPiB0aGUgCisgICAgICogY29udGFpbmVyIG5vdGlmaWVzIHRoZW0gYWNjb3JkaW5nbHkuCisKKyAgICAgKgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUJYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHNwZWNpZnlpbmcgdGhlIG5hbWUgCisgICAgICogCQkJb2YgdGhlIGF0dHJpYnV0ZSB0byBiZSByZW1vdmVkCisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUF0dHJpYnV0ZShTdHJpbmcgbmFtZSk7CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGlzIHdlYiBhcHBsaWNhdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoaXMgU2VydmxldENvbnRleHQgYXMgc3BlY2lmaWVkIGluIHRoZSBkZXBsb3ltZW50CisgICAgICogZGVzY3JpcHRvciBmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24gYnkgdGhlIGRpc3BsYXktbmFtZSBlbGVtZW50LgorICAgICAqCisgICAgICoKKyAgICAgKiBAcmV0dXJuCSAgICBUaGUgbmFtZSBvZiB0aGUgd2ViIGFwcGxpY2F0aW9uIG9yIG51bGwgaWYgbm8gbmFtZSBoYXMgYmVlbiBkZWNsYXJlZCBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLgorICAgICAqIEBzaW5jZSBTZXJ2bGV0IDIuMworICAgICAqLworICAgIAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmxldENvbnRleHROYW1lKCk7Cit9CisKKwpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvU2VydmxldENvbnRleHRBdHRyaWJ1dGVFdmVudC5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvU2VydmxldENvbnRleHRBdHRyaWJ1dGVFdmVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3YWY5YTkKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9TZXJ2bGV0Q29udGV4dEF0dHJpYnV0ZUV2ZW50LmphdmEKQEAgLTAsMCArMSw1OSBAQAorLyoKKyogQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworcGFja2FnZSBqYXZheC5zZXJ2bGV0OworCisKKwkvKiogCisJKiBUaGlzIGlzIHRoZSBldmVudCBjbGFzcyBmb3Igbm90aWZpY2F0aW9ucyBhYm91dCBjaGFuZ2VzIHRvIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZQorCSogIHNlcnZsZXQgY29udGV4dCBvZiBhIHdlYiBhcHBsaWNhdGlvbi4KKwkqIEBzZWUgU2VydmxldENvbnRleHRBdHRyaWJ1dGVMaXN0ZW5lcgorCSAqIEBzaW5jZQl2IDIuMworCSovCisKK3B1YmxpYyBjbGFzcyBTZXJ2bGV0Q29udGV4dEF0dHJpYnV0ZUV2ZW50IGV4dGVuZHMgU2VydmxldENvbnRleHRFdmVudCB7IAorCXByaXZhdGUgU3RyaW5nIG5hbWU7CisJcHJpdmF0ZSBPYmplY3QgdmFsdWU7CisKKwkvKiogQ29uc3RydWN0IGEgU2VydmxldENvbnRleHRBdHRyaWJ1dGVFdmVudCBmcm9tIHRoZSBnaXZlbiBjb250ZXh0IGZvciB0aGUKKwkqKiBnaXZlbiBhdHRyaWJ1dGUgbmFtZSBhbmQgYXR0cmlidXRlIHZhbHVlLiAKKwkqLworCXB1YmxpYyBTZXJ2bGV0Q29udGV4dEF0dHJpYnV0ZUV2ZW50KFNlcnZsZXRDb250ZXh0IHNvdXJjZSwgU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgeworCSAgICBzdXBlcihzb3VyY2UpOworCSAgICB0aGlzLm5hbWUgPSBuYW1lOworCSAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisJfQorCQorCS8qKgorCSogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdGhhdCBjaGFuZ2VkIG9uIHRoZSBTZXJ2bGV0Q29udGV4dC4KKwkqCisJKi8KKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiB0aGlzLm5hbWU7CisJfQorCQorCS8qKgorCSogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSB0aGF0IGhhcyBiZWVuIGFkZGVkLCByZW1vdmVkLCBvciByZXBsYWNlZC4KKwkqIElmIHRoZSBhdHRyaWJ1dGUgd2FzIGFkZGVkLCB0aGlzIGlzIHRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlLiBJZiB0aGUgYXR0cmlidXRlIHdhcworCSogcmVtb3ZlZCwgdGhpcyBpcyB0aGUgdmFsdWUgb2YgdGhlIHJlbW92ZWQgYXR0cmlidXRlLiBJZiB0aGUgYXR0cmlidXRlIHdhcyByZXBsYWNlZCwgdGhpcworCSogaXMgdGhlIG9sZCB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlLgorCSoKKwkqLworCQorCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7CisJICAgIHJldHVybiB0aGlzLnZhbHVlOyAgIAorCX0KK30KKwpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvU2VydmxldENvbnRleHRBdHRyaWJ1dGVMaXN0ZW5lci5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvU2VydmxldENvbnRleHRBdHRyaWJ1dGVMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkOGI5MzgKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9TZXJ2bGV0Q29udGV4dEF0dHJpYnV0ZUxpc3RlbmVyLmphdmEKQEAgLTAsMCArMSwzNiBAQAorLyoKKyogQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworcGFja2FnZSBqYXZheC5zZXJ2bGV0OworCitpbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7CisKKwkvKiogSW1wbGVtZW50YXRpb25zIG9mIHRoaXMgaW50ZXJmYWNlIHJlY2VpdmUgbm90aWZpY2F0aW9ucyBvZgorCSoqIGNoYW5nZXMgdG8gdGhlIGF0dHJpYnV0ZSBsaXN0IG9uIHRoZSBzZXJ2bGV0IGNvbnRleHQgb2YgYSB3ZWIgYXBwbGljYXRpb24uIAorCSogVG8gcmVjZWl2ZSBub3RpZmljYXRpb24gZXZlbnRzLCB0aGUgaW1wbGVtZW50YXRpb24gY2xhc3MKKwkqIG11c3QgYmUgY29uZmlndXJlZCBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGZvciB0aGUgd2ViIGFwcGxpY2F0aW9uLgorCSogQHNlZSBTZXJ2bGV0Q29udGV4dEF0dHJpYnV0ZUV2ZW50CisJICogQHNpbmNlCXYgMi4zCisJKi8KKworcHVibGljIGludGVyZmFjZSBTZXJ2bGV0Q29udGV4dEF0dHJpYnV0ZUxpc3RlbmVyIGV4dGVuZHMgRXZlbnRMaXN0ZW5lciB7CisJLyoqIE5vdGlmaWNhdGlvbiB0aGF0IGEgbmV3IGF0dHJpYnV0ZSB3YXMgYWRkZWQgdG8gdGhlIHNlcnZsZXQgY29udGV4dC4gQ2FsbGVkIGFmdGVyIHRoZSBhdHRyaWJ1dGUgaXMgYWRkZWQuKi8KK3B1YmxpYyB2b2lkIGF0dHJpYnV0ZUFkZGVkKFNlcnZsZXRDb250ZXh0QXR0cmlidXRlRXZlbnQgc2NhYik7CisJLyoqIE5vdGlmaWNhdGlvbiB0aGF0IGFuIGV4aXN0aW5nIGF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIHNlcnZsZXQgY29udGV4dC4gQ2FsbGVkIGFmdGVyIHRoZSBhdHRyaWJ1dGUgaXMgcmVtb3ZlZC4qLworcHVibGljIHZvaWQgYXR0cmlidXRlUmVtb3ZlZChTZXJ2bGV0Q29udGV4dEF0dHJpYnV0ZUV2ZW50IHNjYWIpOworCS8qKiBOb3RpZmljYXRpb24gdGhhdCBhbiBhdHRyaWJ1dGUgb24gdGhlIHNlcnZsZXQgY29udGV4dCBoYXMgYmVlbiByZXBsYWNlZC4gQ2FsbGVkIGFmdGVyIHRoZSBhdHRyaWJ1dGUgaXMgcmVwbGFjZWQuICovCitwdWJsaWMgdm9pZCBhdHRyaWJ1dGVSZXBsYWNlZChTZXJ2bGV0Q29udGV4dEF0dHJpYnV0ZUV2ZW50IHNjYWIpOworfQorCmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9TZXJ2bGV0Q29udGV4dEV2ZW50LmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9TZXJ2bGV0Q29udGV4dEV2ZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I3Yjg4NwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L1NlcnZsZXRDb250ZXh0RXZlbnQuamF2YQpAQCAtMCwwICsxLDQ2IEBACisvKgorKiBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCitwYWNrYWdlIGphdmF4LnNlcnZsZXQ7CisKKworCS8qKiAKKwkgKiBUaGlzIGlzIHRoZSBldmVudCBjbGFzcyBmb3Igbm90aWZpY2F0aW9ucyBhYm91dCBjaGFuZ2VzIHRvCisJICogdGhlIHNlcnZsZXQgY29udGV4dCBvZiBhIHdlYiBhcHBsaWNhdGlvbi4KKwkgKiBAc2VlIFNlcnZsZXRDb250ZXh0TGlzdGVuZXIKKwkgKiBAc2luY2UJdiAyLjMKKwkgKi8KKworcHVibGljIGNsYXNzIFNlcnZsZXRDb250ZXh0RXZlbnQgZXh0ZW5kcyBqYXZhLnV0aWwuRXZlbnRPYmplY3QgeyAKKworCS8qKiBDb25zdHJ1Y3QgYSBTZXJ2bGV0Q29udGV4dEV2ZW50IGZyb20gdGhlIGdpdmVuIGNvbnRleHQuCisJICoKKwkgKiBAcGFyYW0gc291cmNlIC0gdGhlIFNlcnZsZXRDb250ZXh0IHRoYXQgaXMgc2VuZGluZyB0aGUgZXZlbnQuCisJICovCisgICAgcHVibGljIFNlcnZsZXRDb250ZXh0RXZlbnQoU2VydmxldENvbnRleHQgc291cmNlKSB7CisJc3VwZXIoc291cmNlKTsKKyAgICB9CisgICAgCisJLyoqCisJICogUmV0dXJuIHRoZSBTZXJ2bGV0Q29udGV4dCB0aGF0IGNoYW5nZWQuCisJICoKKwkgKiBAcmV0dXJuIHRoZSBTZXJ2bGV0Q29udGV4dCB0aGF0IHNlbnQgdGhlIGV2ZW50LgorCSAqLworICAgIHB1YmxpYyBTZXJ2bGV0Q29udGV4dCBnZXRTZXJ2bGV0Q29udGV4dCAoKSB7IAorCXJldHVybiAoU2VydmxldENvbnRleHQpIHN1cGVyLmdldFNvdXJjZSgpOworICAgIH0KKyAgICAKK30KKwpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvU2VydmxldENvbnRleHRMaXN0ZW5lci5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvU2VydmxldENvbnRleHRMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5M2QyYzEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9TZXJ2bGV0Q29udGV4dExpc3RlbmVyLmphdmEKQEAgLTAsMCArMSw1MCBAQAorLyoKKyogQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworcGFja2FnZSBqYXZheC5zZXJ2bGV0OworCitpbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7CisKKwkvKiogCisJICogSW1wbGVtZW50YXRpb25zIG9mIHRoaXMgaW50ZXJmYWNlIHJlY2VpdmUgbm90aWZpY2F0aW9ucyBhYm91dAorCSAqIGNoYW5nZXMgdG8gdGhlIHNlcnZsZXQgY29udGV4dCBvZiB0aGUgd2ViIGFwcGxpY2F0aW9uIHRoZXkgYXJlCisJICogcGFydCBvZi4KKwkgKiBUbyByZWNlaXZlIG5vdGlmaWNhdGlvbiBldmVudHMsIHRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcworCSAqIG11c3QgYmUgY29uZmlndXJlZCBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGZvciB0aGUgd2ViCisJICogYXBwbGljYXRpb24uCisJICogQHNlZSBTZXJ2bGV0Q29udGV4dEV2ZW50CisJICogQHNpbmNlCXYgMi4zCisJICovCisKK3B1YmxpYyBpbnRlcmZhY2UgU2VydmxldENvbnRleHRMaXN0ZW5lciBleHRlbmRzIEV2ZW50TGlzdGVuZXIgeworCS8qKgorCSAqKiBOb3RpZmljYXRpb24gdGhhdCB0aGUgd2ViIGFwcGxpY2F0aW9uIGluaXRpYWxpemF0aW9uCisJICoqIHByb2Nlc3MgaXMgc3RhcnRpbmcuCisJICoqIEFsbCBTZXJ2bGV0Q29udGV4dExpc3RlbmVycyBhcmUgbm90aWZpZWQgb2YgY29udGV4dAorCSAqKiBpbml0aWFsaXphdGlvbiBiZWZvcmUgYW55IGZpbHRlciBvciBzZXJ2bGV0IGluIHRoZSB3ZWIKKwkgKiogYXBwbGljYXRpb24gaXMgaW5pdGlhbGl6ZWQuCisJICovCisKKyAgICBwdWJsaWMgdm9pZCBjb250ZXh0SW5pdGlhbGl6ZWQgKCBTZXJ2bGV0Q29udGV4dEV2ZW50IHNjZSApOworCisJLyoqCisJICoqIE5vdGlmaWNhdGlvbiB0aGF0IHRoZSBzZXJ2bGV0IGNvbnRleHQgaXMgYWJvdXQgdG8gYmUgc2h1dCBkb3duLgorCSAqKiBBbGwgc2VydmxldHMgYW5kIGZpbHRlcnMgaGF2ZSBiZWVuIGRlc3Ryb3koKWVkIGJlZm9yZSBhbnkKKwkgKiogU2VydmxldENvbnRleHRMaXN0ZW5lcnMgYXJlIG5vdGlmaWVkIG9mIGNvbnRleHQKKwkgKiogZGVzdHJ1Y3Rpb24uCisJICovCisgICAgcHVibGljIHZvaWQgY29udGV4dERlc3Ryb3llZCAoIFNlcnZsZXRDb250ZXh0RXZlbnQgc2NlICk7Cit9CisKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L1NlcnZsZXRFeGNlcHRpb24uamF2YSBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L1NlcnZsZXRFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTUzM2NiCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvU2VydmxldEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTQxIEBACisvKgorKiBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCitwYWNrYWdlIGphdmF4LnNlcnZsZXQ7CisKKworLyoqCisgKiBEZWZpbmVzIGEgZ2VuZXJhbCBleGNlcHRpb24gYSBzZXJ2bGV0IGNhbiB0aHJvdyB3aGVuIGl0CisgKiBlbmNvdW50ZXJzIGRpZmZpY3VsdHkuCisgKgorICogQGF1dGhvciAJVmFyaW91cworICogQHZlcnNpb24gCSRWZXJzaW9uJAorICoKKyAqLworCisKK3B1YmxpYyBjbGFzcyBTZXJ2bGV0RXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKKworICAgIHByaXZhdGUgVGhyb3dhYmxlIHJvb3RDYXVzZTsKKworCisKKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBzZXJ2bGV0IGV4Y2VwdGlvbi4KKyAgICAgKgorICAgICAqLworCisgICAgcHVibGljIFNlcnZsZXRFeGNlcHRpb24oKSB7CisJc3VwZXIoKTsKKyAgICB9CisgICAgCisgICAKKworICAgIAorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBzZXJ2bGV0IGV4Y2VwdGlvbiB3aXRoIHRoZQorICAgICAqIHNwZWNpZmllZCBtZXNzYWdlLiBUaGUgbWVzc2FnZSBjYW4gYmUgd3JpdHRlbiAKKyAgICAgKiB0byB0aGUgc2VydmVyIGxvZyBhbmQvb3IgZGlzcGxheWVkIGZvciB0aGUgdXNlci4gCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVzc2FnZSAJCWEgPGNvZGU+U3RyaW5nPC9jb2RlPiAKKyAgICAgKgkJCQlzcGVjaWZ5aW5nIHRoZSB0ZXh0IG9mIAorICAgICAqCQkJCXRoZSBleGNlcHRpb24gbWVzc2FnZQorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgU2VydmxldEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgeworCXN1cGVyKG1lc3NhZ2UpOworICAgIH0KKyAgICAKKyAgIAorICAgCisgICAgCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHNlcnZsZXQgZXhjZXB0aW9uIHdoZW4gdGhlIHNlcnZsZXQgCisgICAgICogbmVlZHMgdG8gdGhyb3cgYW4gZXhjZXB0aW9uIGFuZCBpbmNsdWRlIGEgbWVzc2FnZSAKKyAgICAgKiBhYm91dCB0aGUgInJvb3QgY2F1c2UiIGV4Y2VwdGlvbiB0aGF0IGludGVyZmVyZWQgd2l0aCBpdHMgCisgICAgICogbm9ybWFsIG9wZXJhdGlvbiwgaW5jbHVkaW5nIGEgZGVzY3JpcHRpb24gbWVzc2FnZS4KKyAgICAgKgorICAgICAqCisgICAgICogQHBhcmFtIG1lc3NhZ2UgCQlhIDxjb2RlPlN0cmluZzwvY29kZT4gY29udGFpbmluZyAKKyAgICAgKgkJCQl0aGUgdGV4dCBvZiB0aGUgZXhjZXB0aW9uIG1lc3NhZ2UKKyAgICAgKgorICAgICAqIEBwYXJhbSByb290Q2F1c2UJCXRoZSA8Y29kZT5UaHJvd2FibGU8L2NvZGU+IGV4Y2VwdGlvbiAKKyAgICAgKgkJCQl0aGF0IGludGVyZmVyZWQgd2l0aCB0aGUgc2VydmxldCdzCisgICAgICoJCQkJbm9ybWFsIG9wZXJhdGlvbiwgbWFraW5nIHRoaXMgc2VydmxldAorICAgICAqCQkJCWV4Y2VwdGlvbiBuZWNlc3NhcnkKKyAgICAgKgorICAgICAqLworICAgIAorICAgIHB1YmxpYyBTZXJ2bGV0RXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgcm9vdENhdXNlKSB7CisJc3VwZXIobWVzc2FnZSk7CisJdGhpcy5yb290Q2F1c2UgPSByb290Q2F1c2U7CisgICAgfQorCisKKworCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHNlcnZsZXQgZXhjZXB0aW9uIHdoZW4gdGhlIHNlcnZsZXQgCisgICAgICogbmVlZHMgdG8gdGhyb3cgYW4gZXhjZXB0aW9uIGFuZCBpbmNsdWRlIGEgbWVzc2FnZQorICAgICAqIGFib3V0IHRoZSAicm9vdCBjYXVzZSIgZXhjZXB0aW9uIHRoYXQgaW50ZXJmZXJlZCB3aXRoIGl0cworICAgICAqIG5vcm1hbCBvcGVyYXRpb24uICBUaGUgZXhjZXB0aW9uJ3MgbWVzc2FnZSBpcyBiYXNlZCBvbiB0aGUgbG9jYWxpemVkCisgICAgICogbWVzc2FnZSBvZiB0aGUgdW5kZXJseWluZyBleGNlcHRpb24uCisgICAgICoKKyAgICAgKiA8cD5UaGlzIG1ldGhvZCBjYWxscyB0aGUgPGNvZGU+Z2V0TG9jYWxpemVkTWVzc2FnZTwvY29kZT4gbWV0aG9kCisgICAgICogb24gdGhlIDxjb2RlPlRocm93YWJsZTwvY29kZT4gZXhjZXB0aW9uIHRvIGdldCBhIGxvY2FsaXplZCBleGNlcHRpb24KKyAgICAgKiBtZXNzYWdlLiBXaGVuIHN1YmNsYXNzaW5nIDxjb2RlPlNlcnZsZXRFeGNlcHRpb248L2NvZGU+LCAKKyAgICAgKiB0aGlzIG1ldGhvZCBjYW4gYmUgb3ZlcnJpZGRlbiB0byBjcmVhdGUgYW4gZXhjZXB0aW9uIG1lc3NhZ2UgCisgICAgICogZGVzaWduZWQgZm9yIGEgc3BlY2lmaWMgbG9jYWxlLgorICAgICAqCisgICAgICogQHBhcmFtIHJvb3RDYXVzZSAJdGhlIDxjb2RlPlRocm93YWJsZTwvY29kZT4gZXhjZXB0aW9uCisgICAgICogCQkJCXRoYXQgaW50ZXJmZXJlZCB3aXRoIHRoZSBzZXJ2bGV0J3MKKyAgICAgKgkJCQlub3JtYWwgb3BlcmF0aW9uLCBtYWtpbmcgdGhlIHNlcnZsZXQgZXhjZXB0aW9uCisgICAgICoJCQkJbmVjZXNzYXJ5CisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyBTZXJ2bGV0RXhjZXB0aW9uKFRocm93YWJsZSByb290Q2F1c2UpIHsKKwlzdXBlcihyb290Q2F1c2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKKwl0aGlzLnJvb3RDYXVzZSA9IHJvb3RDYXVzZTsKKyAgICB9CisgIAorICAKKyAKKyAKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBleGNlcHRpb24gdGhhdCBjYXVzZWQgdGhpcyBzZXJ2bGV0IGV4Y2VwdGlvbi4KKyAgICAgKgorICAgICAqCisgICAgICogQHJldHVybgkJCXRoZSA8Y29kZT5UaHJvd2FibGU8L2NvZGU+IAorICAgICAqCQkJCXRoYXQgY2F1c2VkIHRoaXMgc2VydmxldCBleGNlcHRpb24KKyAgICAgKgorICAgICAqLworICAgIAorICAgIHB1YmxpYyBUaHJvd2FibGUgZ2V0Um9vdENhdXNlKCkgeworCXJldHVybiByb290Q2F1c2U7CisgICAgfQorfQorCisKKworCisKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L1NlcnZsZXRJbnB1dFN0cmVhbS5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvU2VydmxldElucHV0U3RyZWFtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNjM2E0NQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L1NlcnZsZXRJbnB1dFN0cmVhbS5qYXZhCkBAIC0wLDAgKzEsMTA1IEBACisvKgorKiBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCitwYWNrYWdlIGphdmF4LnNlcnZsZXQ7CisKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKy8qKgorICogCisgKiBQcm92aWRlcyBhbiBpbnB1dCBzdHJlYW0gZm9yIHJlYWRpbmcgYmluYXJ5IGRhdGEgZnJvbSBhIGNsaWVudAorICogcmVxdWVzdCwgaW5jbHVkaW5nIGFuIGVmZmljaWVudCA8Y29kZT5yZWFkTGluZTwvY29kZT4gbWV0aG9kCisgKiBmb3IgcmVhZGluZyBkYXRhIG9uZSBsaW5lIGF0IGEgdGltZS4gV2l0aCBzb21lIHByb3RvY29scywgc3VjaAorICogYXMgSFRUUCBQT1NUIGFuZCBQVVQsIGEgPGNvZGU+U2VydmxldElucHV0U3RyZWFtPC9jb2RlPgorICogb2JqZWN0IGNhbiBiZSB1c2VkIHRvIHJlYWQgZGF0YSBzZW50IGZyb20gdGhlIGNsaWVudC4KKyAqCisgKiA8cD5BIDxjb2RlPlNlcnZsZXRJbnB1dFN0cmVhbTwvY29kZT4gb2JqZWN0IGlzIG5vcm1hbGx5IHJldHJpZXZlZCB2aWEKKyAqIHRoZSB7QGxpbmsgU2VydmxldFJlcXVlc3QjZ2V0SW5wdXRTdHJlYW19IG1ldGhvZC4KKyAqCisgKgorICogPHA+VGhpcyBpcyBhbiBhYnN0cmFjdCBjbGFzcyB0aGF0IGEgc2VydmxldCBjb250YWluZXIgaW1wbGVtZW50cy4KKyAqIFN1YmNsYXNzZXMgb2YgdGhpcyBjbGFzcworICogbXVzdCBpbXBsZW1lbnQgdGhlIDxjb2RlPmphdmEuaW8uSW5wdXRTdHJlYW0ucmVhZCgpPC9jb2RlPiBtZXRob2QuCisgKgorICoKKyAqIEBhdXRob3IgCVZhcmlvdXMKKyAqIEB2ZXJzaW9uIAkkVmVyc2lvbiQKKyAqCisgKiBAc2VlCQlTZXJ2bGV0UmVxdWVzdCAKKyAqCisgKi8KKworcHVibGljIGFic3RyYWN0IGNsYXNzIFNlcnZsZXRJbnB1dFN0cmVhbSBleHRlbmRzIElucHV0U3RyZWFtIHsKKworCisKKyAgICAvKioKKyAgICAgKiBEb2VzIG5vdGhpbmcsIGJlY2F1c2UgdGhpcyBpcyBhbiBhYnN0cmFjdCBjbGFzcy4KKyAgICAgKgorICAgICAqLworCisgICAgcHJvdGVjdGVkIFNlcnZsZXRJbnB1dFN0cmVhbSgpIHsgfQorCisgIAorICAKKyAgICAKKyAgICAvKioKKyAgICAgKgorICAgICAqIFJlYWRzIHRoZSBpbnB1dCBzdHJlYW0sIG9uZSBsaW5lIGF0IGEgdGltZS4gU3RhcnRpbmcgYXQgYW4KKyAgICAgKiBvZmZzZXQsIHJlYWRzIGJ5dGVzIGludG8gYW4gYXJyYXksIHVudGlsIGl0IHJlYWRzIGEgY2VydGFpbiBudW1iZXIKKyAgICAgKiBvZiBieXRlcyBvciByZWFjaGVzIGEgbmV3bGluZSBjaGFyYWN0ZXIsIHdoaWNoIGl0IHJlYWRzIGludG8gdGhlCisgICAgICogYXJyYXkgYXMgd2VsbC4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgbWV0aG9kIHJldHVybnMgLTEgaWYgaXQgcmVhY2hlcyB0aGUgZW5kIG9mIHRoZSBpbnB1dAorICAgICAqIHN0cmVhbSBiZWZvcmUgcmVhZGluZyB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMuCisgICAgICoKKyAgICAgKgorICAgICAqCisgICAgICogQHBhcmFtIGIgCQlhbiBhcnJheSBvZiBieXRlcyBpbnRvIHdoaWNoIGRhdGEgaXMgcmVhZAorICAgICAqCisgICAgICogQHBhcmFtIG9mZiAJCWFuIGludGVnZXIgc3BlY2lmeWluZyB0aGUgY2hhcmFjdGVyIGF0IHdoaWNoCisgICAgICoJCQkJdGhpcyBtZXRob2QgYmVnaW5zIHJlYWRpbmcKKyAgICAgKgorICAgICAqIEBwYXJhbSBsZW4JCWFuIGludGVnZXIgc3BlY2lmeWluZyB0aGUgbWF4aW11bSBudW1iZXIgb2YgCisgICAgICoJCQkJYnl0ZXMgdG8gcmVhZAorICAgICAqCisgICAgICogQHJldHVybgkJCWFuIGludGVnZXIgc3BlY2lmeWluZyB0aGUgYWN0dWFsIG51bWJlciBvZiBieXRlcyAKKyAgICAgKgkJCQlyZWFkLCBvciAtMSBpZiB0aGUgZW5kIG9mIHRoZSBzdHJlYW0gaXMgcmVhY2hlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbglpZiBhbiBpbnB1dCBvciBvdXRwdXQgZXhjZXB0aW9uIGhhcyBvY2N1cnJlZAorICAgICAqCisgICAgICovCisgICAgIAorICAgIHB1YmxpYyBpbnQgcmVhZExpbmUoYnl0ZVtdIGIsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKwlpZiAobGVuIDw9IDApIHsKKwkgICAgcmV0dXJuIDA7CisJfQorCWludCBjb3VudCA9IDAsIGM7CisKKwl3aGlsZSAoKGMgPSByZWFkKCkpICE9IC0xKSB7CisJICAgIGJbb2ZmKytdID0gKGJ5dGUpYzsKKwkgICAgY291bnQrKzsKKwkgICAgaWYgKGMgPT0gJ1xuJyB8fCBjb3VudCA9PSBsZW4pIHsKKwkJYnJlYWs7CisJICAgIH0KKwl9CisJcmV0dXJuIGNvdW50ID4gMCA/IGNvdW50IDogLTE7CisgICAgfQorfQorCisKKwpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvU2VydmxldE91dHB1dFN0cmVhbS5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvU2VydmxldE91dHB1dFN0cmVhbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2NWIxZDEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9TZXJ2bGV0T3V0cHV0U3RyZWFtLmphdmEKQEAgLTAsMCArMSwzNjMgQEAKKy8qCisqIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KK3BhY2thZ2UgamF2YXguc2VydmxldDsKKworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5DaGFyQ29udmVyc2lvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7CisKKy8qKgorICogUHJvdmlkZXMgYW4gb3V0cHV0IHN0cmVhbSBmb3Igc2VuZGluZyBiaW5hcnkgZGF0YSB0byB0aGUKKyAqIGNsaWVudC4gQSA8Y29kZT5TZXJ2bGV0T3V0cHV0U3RyZWFtPC9jb2RlPiBvYmplY3QgaXMgbm9ybWFsbHkgcmV0cmlldmVkIAorICogdmlhIHRoZSB7QGxpbmsgU2VydmxldFJlc3BvbnNlI2dldE91dHB1dFN0cmVhbX0gbWV0aG9kLgorICoKKyAqIDxwPlRoaXMgaXMgYW4gYWJzdHJhY3QgY2xhc3MgdGhhdCB0aGUgc2VydmxldCBjb250YWluZXIgaW1wbGVtZW50cy4KKyAqIFN1YmNsYXNzZXMgb2YgdGhpcyBjbGFzcworICogbXVzdCBpbXBsZW1lbnQgdGhlIDxjb2RlPmphdmEuaW8uT3V0cHV0U3RyZWFtLndyaXRlKGludCk8L2NvZGU+CisgKiBtZXRob2QuCisgKgorICogCisgKiBAYXV0aG9yIAlWYXJpb3VzCisgKiBAdmVyc2lvbiAJJFZlcnNpb24kCisgKgorICogQHNlZSAJU2VydmxldFJlc3BvbnNlCisgKgorICovCisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBTZXJ2bGV0T3V0cHV0U3RyZWFtIGV4dGVuZHMgT3V0cHV0U3RyZWFtIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMU1RSSU5HX0ZJTEUgPSAiamF2YXguc2VydmxldC5Mb2NhbFN0cmluZ3MiOworICAgIHByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIGxTdHJpbmdzID0KKwlSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoTFNUUklOR19GSUxFKTsKKworCisgICAgCisgICAgLyoqCisgICAgICoKKyAgICAgKiBEb2VzIG5vdGhpbmcsIGJlY2F1c2UgdGhpcyBpcyBhbiBhYnN0cmFjdCBjbGFzcy4KKyAgICAgKgorICAgICAqLworCisgICAgcHJvdGVjdGVkIFNlcnZsZXRPdXRwdXRTdHJlYW0oKSB7IH0KKworCisgICAgLyoqCisgICAgICogV3JpdGVzIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiB0byB0aGUgY2xpZW50LCAKKyAgICAgKiB3aXRob3V0IGEgY2FycmlhZ2UgcmV0dXJuLWxpbmUgZmVlZCAoQ1JMRikgCisgICAgICogY2hhcmFjdGVyIGF0IHRoZSBlbmQuCisgICAgICoKKyAgICAgKgorICAgICAqIEBwYXJhbSBzCQkJdGhlIDxjb2RlPlN0cmluZzwvY29kZT4gdG8gc2VuZCB0byB0aGUgY2xpZW50CisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIAlpZiBhbiBpbnB1dCBvciBvdXRwdXQgZXhjZXB0aW9uIG9jY3VycmVkCisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIHByaW50KFN0cmluZyBzKSB0aHJvd3MgSU9FeGNlcHRpb24geworCWlmIChzPT1udWxsKSBzPSJudWxsIjsKKwlpbnQgbGVuID0gcy5sZW5ndGgoKTsKKwlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJICAgIGNoYXIgYyA9IHMuY2hhckF0IChpKTsKKworCSAgICAvLworCSAgICAvLyBYWFggTk9URTogIFRoaXMgaXMgY2xlYXJseSBpbmNvcnJlY3QgZm9yIG1hbnkgc3RyaW5ncywKKwkgICAgLy8gYnV0IGlzIHRoZSBvbmx5IGNvbnNpc3RlbnQgYXBwcm9hY2ggd2l0aGluIHRoZSBjdXJyZW50CisJICAgIC8vIHNlcnZsZXQgZnJhbWV3b3JrLiAgSXQgbXVzdCBzdWZmaWNlIHVudGlsIHNlcnZsZXQgb3V0cHV0CisJICAgIC8vIHN0cmVhbXMgcHJvcGVybHkgZW5jb2RlIHRoZWlyIG91dHB1dC4KKwkgICAgLy8KKwkgICAgaWYgKChjICYgMHhmZjAwKSAhPSAwKSB7CS8vIGhpZ2ggb3JkZXIgYnl0ZSBtdXN0IGJlIHplcm8KKwkJU3RyaW5nIGVyck1zZyA9IGxTdHJpbmdzLmdldFN0cmluZygiZXJyLm5vdF9pc284ODU5XzEiKTsKKwkJT2JqZWN0W10gZXJyQXJncyA9IG5ldyBPYmplY3RbMV07CisJCWVyckFyZ3NbMF0gPSBuZXcgQ2hhcmFjdGVyKGMpOworCQllcnJNc2cgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChlcnJNc2csIGVyckFyZ3MpOworCQl0aHJvdyBuZXcgQ2hhckNvbnZlcnNpb25FeGNlcHRpb24oZXJyTXNnKTsKKwkgICAgfQorCSAgICB3cml0ZSAoYyk7CisJfQorICAgIH0KKworCisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgYSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZSB0byB0aGUgY2xpZW50LAorICAgICAqIHdpdGggbm8gY2FycmlhZ2UgcmV0dXJuLWxpbmUgZmVlZCAoQ1JMRikgCisgICAgICogY2hhcmFjdGVyIGF0IHRoZSBlbmQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYgkJCXRoZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZSAKKyAgICAgKgkJCQl0byBzZW5kIHRvIHRoZSBjbGllbnQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gCWlmIGFuIGlucHV0IG9yIG91dHB1dCBleGNlcHRpb24gb2NjdXJyZWQKKyAgICAgKgorICAgICAqLworCisgICAgcHVibGljIHZvaWQgcHJpbnQoYm9vbGVhbiBiKSB0aHJvd3MgSU9FeGNlcHRpb24geworCVN0cmluZyBtc2c7CisJaWYgKGIpIHsKKwkgICAgbXNnID0gbFN0cmluZ3MuZ2V0U3RyaW5nKCJ2YWx1ZS50cnVlIik7CisJfSBlbHNlIHsKKwkgICAgbXNnID0gbFN0cmluZ3MuZ2V0U3RyaW5nKCJ2YWx1ZS5mYWxzZSIpOworCX0KKwlwcmludChtc2cpOworICAgIH0KKworCisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgYSBjaGFyYWN0ZXIgdG8gdGhlIGNsaWVudCwKKyAgICAgKiB3aXRoIG5vIGNhcnJpYWdlIHJldHVybi1saW5lIGZlZWQgKENSTEYpIAorICAgICAqIGF0IHRoZSBlbmQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYwkJCXRoZSBjaGFyYWN0ZXIgdG8gc2VuZCB0byB0aGUgY2xpZW50CisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIAlpZiBhbiBpbnB1dCBvciBvdXRwdXQgZXhjZXB0aW9uIG9jY3VycmVkCisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIHByaW50KGNoYXIgYykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwcmludChTdHJpbmcudmFsdWVPZihjKSk7CisgICAgfQorCisKKworCisgICAgLyoqCisgICAgICoKKyAgICAgKiBXcml0ZXMgYW4gaW50IHRvIHRoZSBjbGllbnQsCisgICAgICogd2l0aCBubyBjYXJyaWFnZSByZXR1cm4tbGluZSBmZWVkIChDUkxGKSAKKyAgICAgKiBhdCB0aGUgZW5kLgorICAgICAqCisgICAgICogQHBhcmFtIGkJCQl0aGUgaW50IHRvIHNlbmQgdG8gdGhlIGNsaWVudAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiAJaWYgYW4gaW5wdXQgb3Igb3V0cHV0IGV4Y2VwdGlvbiBvY2N1cnJlZAorICAgICAqCisgICAgICovICAKKworICAgIHB1YmxpYyB2b2lkIHByaW50KGludCBpKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByaW50KFN0cmluZy52YWx1ZU9mKGkpKTsKKyAgICB9CisKKworCisgCisgICAgLyoqCisgICAgICogCisgICAgICogV3JpdGVzIGEgPGNvZGU+bG9uZzwvY29kZT4gdmFsdWUgdG8gdGhlIGNsaWVudCwKKyAgICAgKiB3aXRoIG5vIGNhcnJpYWdlIHJldHVybi1saW5lIGZlZWQgKENSTEYpIGF0IHRoZSBlbmQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbAkJCXRoZSA8Y29kZT5sb25nPC9jb2RlPiB2YWx1ZSAKKyAgICAgKgkJCQl0byBzZW5kIHRvIHRoZSBjbGllbnQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gCWlmIGFuIGlucHV0IG9yIG91dHB1dCBleGNlcHRpb24gCisgICAgICoJCQkJb2NjdXJyZWQKKyAgICAgKiAKKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIHByaW50KGxvbmcgbCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwcmludChTdHJpbmcudmFsdWVPZihsKSk7CisgICAgfQorCisKKworICAgIC8qKgorICAgICAqCisgICAgICogV3JpdGVzIGEgPGNvZGU+ZmxvYXQ8L2NvZGU+IHZhbHVlIHRvIHRoZSBjbGllbnQsCisgICAgICogd2l0aCBubyBjYXJyaWFnZSByZXR1cm4tbGluZSBmZWVkIChDUkxGKSBhdCB0aGUgZW5kLgorICAgICAqCisgICAgICogQHBhcmFtIGYJCQl0aGUgPGNvZGU+ZmxvYXQ8L2NvZGU+IHZhbHVlCisgICAgICoJCQkJdG8gc2VuZCB0byB0aGUgY2xpZW50CisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uCWlmIGFuIGlucHV0IG9yIG91dHB1dCBleGNlcHRpb24gb2NjdXJyZWQKKyAgICAgKgorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgdm9pZCBwcmludChmbG9hdCBmKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByaW50KFN0cmluZy52YWx1ZU9mKGYpKTsKKyAgICB9CisKKworCisgICAgLyoqCisgICAgICoKKyAgICAgKiBXcml0ZXMgYSA8Y29kZT5kb3VibGU8L2NvZGU+IHZhbHVlIHRvIHRoZSBjbGllbnQsCisgICAgICogd2l0aCBubyBjYXJyaWFnZSByZXR1cm4tbGluZSBmZWVkIChDUkxGKSBhdCB0aGUgZW5kLgorICAgICAqIAorICAgICAqIEBwYXJhbSBkCQkJdGhlIDxjb2RlPmRvdWJsZTwvY29kZT4gdmFsdWUKKyAgICAgKgkJCQl0byBzZW5kIHRvIHRoZSBjbGllbnQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gCWlmIGFuIGlucHV0IG9yIG91dHB1dCBleGNlcHRpb24gb2NjdXJyZWQKKyAgICAgKgorICAgICAqLworCisgICAgcHVibGljIHZvaWQgcHJpbnQoZG91YmxlIGQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHJpbnQoU3RyaW5nLnZhbHVlT2YoZCkpOworICAgIH0KKworCisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgYSBjYXJyaWFnZSByZXR1cm4tbGluZSBmZWVkIChDUkxGKQorICAgICAqIHRvIHRoZSBjbGllbnQuCisgICAgICoKKyAgICAgKgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiAJaWYgYW4gaW5wdXQgb3Igb3V0cHV0IGV4Y2VwdGlvbiBvY2N1cnJlZAorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgdm9pZCBwcmludGxuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwcmludCgiXHJcbiIpOworICAgIH0KKworCisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHRvIHRoZSBjbGllbnQsIAorICAgICAqIGZvbGxvd2VkIGJ5IGEgY2FycmlhZ2UgcmV0dXJuLWxpbmUgZmVlZCAoQ1JMRikuCisgICAgICoKKyAgICAgKgorICAgICAqIEBwYXJhbSBzCQkJdGhlIDxjb2RlPlN0cmluZzwvY29kZT4gdG8gd3JpdGUgdG8gdGhlIGNsaWVudAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiAJaWYgYW4gaW5wdXQgb3Igb3V0cHV0IGV4Y2VwdGlvbiBvY2N1cnJlZAorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgdm9pZCBwcmludGxuKFN0cmluZyBzKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByaW50KHMpOworCXByaW50bG4oKTsKKyAgICB9CisKKworCisKKyAgICAvKioKKyAgICAgKgorICAgICAqIFdyaXRlcyBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIHRvIHRoZSBjbGllbnQsIAorICAgICAqIGZvbGxvd2VkIGJ5IGEgCisgICAgICogY2FycmlhZ2UgcmV0dXJuLWxpbmUgZmVlZCAoQ1JMRikuCisgICAgICoKKyAgICAgKgorICAgICAqIEBwYXJhbSBiCQkJdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIAorICAgICAqCQkJCXRvIHdyaXRlIHRvIHRoZSBjbGllbnQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gCWlmIGFuIGlucHV0IG9yIG91dHB1dCBleGNlcHRpb24gb2NjdXJyZWQKKyAgICAgKgorICAgICAqLworCisgICAgcHVibGljIHZvaWQgcHJpbnRsbihib29sZWFuIGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHJpbnQoYik7CisJcHJpbnRsbigpOworICAgIH0KKworCisKKyAgICAvKioKKyAgICAgKgorICAgICAqIFdyaXRlcyBhIGNoYXJhY3RlciB0byB0aGUgY2xpZW50LCBmb2xsb3dlZCBieSBhIGNhcnJpYWdlCisgICAgICogcmV0dXJuLWxpbmUgZmVlZCAoQ1JMRikuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYwkJCXRoZSBjaGFyYWN0ZXIgdG8gd3JpdGUgdG8gdGhlIGNsaWVudAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiAJaWYgYW4gaW5wdXQgb3Igb3V0cHV0IGV4Y2VwdGlvbiBvY2N1cnJlZAorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgdm9pZCBwcmludGxuKGNoYXIgYykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwcmludChjKTsKKwlwcmludGxuKCk7CisgICAgfQorCisKKworICAgIC8qKgorICAgICAqCisgICAgICogV3JpdGVzIGFuIGludCB0byB0aGUgY2xpZW50LCBmb2xsb3dlZCBieSBhIAorICAgICAqIGNhcnJpYWdlIHJldHVybi1saW5lIGZlZWQgKENSTEYpIGNoYXJhY3Rlci4KKyAgICAgKgorICAgICAqCisgICAgICogQHBhcmFtIGkJCQl0aGUgaW50IHRvIHdyaXRlIHRvIHRoZSBjbGllbnQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gCWlmIGFuIGlucHV0IG9yIG91dHB1dCBleGNlcHRpb24gb2NjdXJyZWQKKyAgICAgKgorICAgICAqLworCisgICAgcHVibGljIHZvaWQgcHJpbnRsbihpbnQgaSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwcmludChpKTsKKwlwcmludGxuKCk7CisgICAgfQorCisKKworICAgIC8qKiAgCisgICAgICoKKyAgICAgKiBXcml0ZXMgYSA8Y29kZT5sb25nPC9jb2RlPiB2YWx1ZSB0byB0aGUgY2xpZW50LCBmb2xsb3dlZCBieSBhIAorICAgICAqIGNhcnJpYWdlIHJldHVybi1saW5lIGZlZWQgKENSTEYpLgorICAgICAqCisgICAgICoKKyAgICAgKiBAcGFyYW0gbAkJCXRoZSA8Y29kZT5sb25nPC9jb2RlPiB2YWx1ZSB0byB3cml0ZSB0byB0aGUgY2xpZW50CisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIAlpZiBhbiBpbnB1dCBvciBvdXRwdXQgZXhjZXB0aW9uIG9jY3VycmVkCisgICAgICoKKyAgICAgKi8gIAorCisgICAgcHVibGljIHZvaWQgcHJpbnRsbihsb25nIGwpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHJpbnQobCk7CisJcHJpbnRsbigpOworICAgIH0KKworCisKKyAgICAvKioKKyAgICAgKgorICAgICAqIFdyaXRlcyBhIDxjb2RlPmZsb2F0PC9jb2RlPiB2YWx1ZSB0byB0aGUgY2xpZW50LCAKKyAgICAgKiBmb2xsb3dlZCBieSBhIGNhcnJpYWdlIHJldHVybi1saW5lIGZlZWQgKENSTEYpLgorICAgICAqCisgICAgICogQHBhcmFtIGYJCQl0aGUgPGNvZGU+ZmxvYXQ8L2NvZGU+IHZhbHVlIAorICAgICAqCQkJCXRvIHdyaXRlIHRvIHRoZSBjbGllbnQKKyAgICAgKgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiAJaWYgYW4gaW5wdXQgb3Igb3V0cHV0IGV4Y2VwdGlvbiAKKyAgICAgKgkJCQlvY2N1cnJlZAorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgdm9pZCBwcmludGxuKGZsb2F0IGYpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHJpbnQoZik7CisJcHJpbnRsbigpOworICAgIH0KKworCisKKyAgICAvKioKKyAgICAgKgorICAgICAqIFdyaXRlcyBhIDxjb2RlPmRvdWJsZTwvY29kZT4gdmFsdWUgdG8gdGhlIGNsaWVudCwgCisgICAgICogZm9sbG93ZWQgYnkgYSBjYXJyaWFnZSByZXR1cm4tbGluZSBmZWVkIChDUkxGKS4KKyAgICAgKgorICAgICAqCisgICAgICogQHBhcmFtIGQJCQl0aGUgPGNvZGU+ZG91YmxlPC9jb2RlPiB2YWx1ZQorICAgICAqCQkJCXRvIHdyaXRlIHRvIHRoZSBjbGllbnQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gCWlmIGFuIGlucHV0IG9yIG91dHB1dCBleGNlcHRpb24gb2NjdXJyZWQKKyAgICAgKgorICAgICAqLworCisgICAgcHVibGljIHZvaWQgcHJpbnRsbihkb3VibGUgZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwcmludChkKTsKKwlwcmludGxuKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvU2VydmxldFJlcXVlc3QuamF2YSBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L1NlcnZsZXRSZXF1ZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJjZjYwZAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L1NlcnZsZXRSZXF1ZXN0LmphdmEKQEAgLTAsMCArMSw1OTcgQEAKKy8qCisqIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KK3BhY2thZ2UgamF2YXguc2VydmxldDsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisKKworLyoqCisgKiBEZWZpbmVzIGFuIG9iamVjdCB0byBwcm92aWRlIGNsaWVudCByZXF1ZXN0IGluZm9ybWF0aW9uIHRvIGEgc2VydmxldC4gIFRoZQorICogc2VydmxldCBjb250YWluZXIgY3JlYXRlcyBhIDxjb2RlPlNlcnZsZXRSZXF1ZXN0PC9jb2RlPiBvYmplY3QgYW5kIHBhc3NlcworICogaXQgYXMgYW4gYXJndW1lbnQgdG8gdGhlIHNlcnZsZXQncyA8Y29kZT5zZXJ2aWNlPC9jb2RlPiBtZXRob2QuCisgKgorICogPHA+QSA8Y29kZT5TZXJ2bGV0UmVxdWVzdDwvY29kZT4gb2JqZWN0IHByb3ZpZGVzIGRhdGEgaW5jbHVkaW5nCisgKiBwYXJhbWV0ZXIgbmFtZSBhbmQgdmFsdWVzLCBhdHRyaWJ1dGVzLCBhbmQgYW4gaW5wdXQgc3RyZWFtLgorICogSW50ZXJmYWNlcyB0aGF0IGV4dGVuZCA8Y29kZT5TZXJ2bGV0UmVxdWVzdDwvY29kZT4gY2FuIHByb3ZpZGUKKyAqIGFkZGl0aW9uYWwgcHJvdG9jb2wtc3BlY2lmaWMgZGF0YSAoZm9yIGV4YW1wbGUsIEhUVFAgZGF0YSBpcworICogcHJvdmlkZWQgYnkge0BsaW5rIGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3R9LgorICogCisgKiBAYXV0aG9yIAlWYXJpb3VzCisgKiBAdmVyc2lvbiAJJFZlcnNpb24kCisgKgorICogQHNlZSAJamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdAorICoKKyAqLworCitwdWJsaWMgaW50ZXJmYWNlIFNlcnZsZXRSZXF1ZXN0IHsKKworCisKKworICAgIC8qKgorICAgICAqCisgICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIG5hbWVkIGF0dHJpYnV0ZSBhcyBhbiA8Y29kZT5PYmplY3Q8L2NvZGU+LAorICAgICAqIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGF0dHJpYnV0ZSBvZiB0aGUgZ2l2ZW4gbmFtZSBleGlzdHMuIAorICAgICAqCisgICAgICogPHA+IEF0dHJpYnV0ZXMgY2FuIGJlIHNldCB0d28gd2F5cy4gIFRoZSBzZXJ2bGV0IGNvbnRhaW5lciBtYXkgc2V0CisgICAgICogYXR0cmlidXRlcyB0byBtYWtlIGF2YWlsYWJsZSBjdXN0b20gaW5mb3JtYXRpb24gYWJvdXQgYSByZXF1ZXN0LgorICAgICAqIEZvciBleGFtcGxlLCBmb3IgcmVxdWVzdHMgbWFkZSB1c2luZyBIVFRQUywgdGhlIGF0dHJpYnV0ZQorICAgICAqIDxjb2RlPmphdmF4LnNlcnZsZXQucmVxdWVzdC5YNTA5Q2VydGlmaWNhdGU8L2NvZGU+IGNhbiBiZSB1c2VkIHRvCisgICAgICogcmV0cmlldmUgaW5mb3JtYXRpb24gb24gdGhlIGNlcnRpZmljYXRlIG9mIHRoZSBjbGllbnQuICBBdHRyaWJ1dGVzCisgICAgICogY2FuIGFsc28gYmUgc2V0IHByb2dyYW1hdGljYWxseSB1c2luZyAKKyAgICAgKiB7QGxpbmsgU2VydmxldFJlcXVlc3Qjc2V0QXR0cmlidXRlfS4gIFRoaXMgYWxsb3dzIGluZm9ybWF0aW9uIHRvIGJlCisgICAgICogZW1iZWRkZWQgaW50byBhIHJlcXVlc3QgYmVmb3JlIGEge0BsaW5rIFJlcXVlc3REaXNwYXRjaGVyfSBjYWxsLgorICAgICAqCisgICAgICogPHA+QXR0cmlidXRlIG5hbWVzIHNob3VsZCBmb2xsb3cgdGhlIHNhbWUgY29udmVudGlvbnMgYXMgcGFja2FnZQorICAgICAqIG5hbWVzLiBUaGlzIHNwZWNpZmljYXRpb24gcmVzZXJ2ZXMgbmFtZXMgbWF0Y2hpbmcgPGNvZGU+amF2YS4qPC9jb2RlPiwKKyAgICAgKiA8Y29kZT5qYXZheC4qPC9jb2RlPiwgYW5kIDxjb2RlPnN1bi4qPC9jb2RlPi4gCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZQlhIDxjb2RlPlN0cmluZzwvY29kZT4gc3BlY2lmeWluZyB0aGUgbmFtZSBvZiAKKyAgICAgKgkJCXRoZSBhdHRyaWJ1dGUKKyAgICAgKgorICAgICAqIEByZXR1cm4JCWFuIDxjb2RlPk9iamVjdDwvY29kZT4gY29udGFpbmluZyB0aGUgdmFsdWUgCisgICAgICoJCQlvZiB0aGUgYXR0cmlidXRlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgorICAgICAqCQkJdGhlIGF0dHJpYnV0ZSBkb2VzIG5vdCBleGlzdAorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgT2JqZWN0IGdldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSk7CisgICAgCisgICAgCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGFuIDxjb2RlPkVudW1lcmF0aW9uPC9jb2RlPiBjb250YWluaW5nIHRoZQorICAgICAqIG5hbWVzIG9mIHRoZSBhdHRyaWJ1dGVzIGF2YWlsYWJsZSB0byB0aGlzIHJlcXVlc3QuIAorICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYW4gZW1wdHkgPGNvZGU+RW51bWVyYXRpb248L2NvZGU+CisgICAgICogaWYgdGhlIHJlcXVlc3QgaGFzIG5vIGF0dHJpYnV0ZXMgYXZhaWxhYmxlIHRvIGl0LgorICAgICAqIAorICAgICAqCisgICAgICogQHJldHVybgkJYW4gPGNvZGU+RW51bWVyYXRpb248L2NvZGU+IG9mIHN0cmluZ3MgCisgICAgICoJCQljb250YWluaW5nIHRoZSBuYW1lcyAKKyAgICAgKiAJCQlvZiB0aGUgcmVxdWVzdCdzIGF0dHJpYnV0ZXMKKyAgICAgKgorICAgICAqLworCisgICAgcHVibGljIEVudW1lcmF0aW9uIGdldEF0dHJpYnV0ZU5hbWVzKCk7CisgICAgCisgICAgCisgICAgCisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgY2hhcmFjdGVyIGVuY29kaW5nIHVzZWQgaW4gdGhlIGJvZHkgb2YgdGhpcworICAgICAqIHJlcXVlc3QuIFRoaXMgbWV0aG9kIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHJlcXVlc3QKKyAgICAgKiBkb2VzIG5vdCBzcGVjaWZ5IGEgY2hhcmFjdGVyIGVuY29kaW5nCisgICAgICogCisgICAgICoKKyAgICAgKiBAcmV0dXJuCQlhIDxjb2RlPlN0cmluZzwvY29kZT4gY29udGFpbmluZyB0aGUgbmFtZSBvZiAKKyAgICAgKgkJCXRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcsIG9yIDxjb2RlPm51bGw8L2NvZGU+CisgICAgICoJCQlpZiB0aGUgcmVxdWVzdCBkb2VzIG5vdCBzcGVjaWZ5IGEgY2hhcmFjdGVyIGVuY29kaW5nCisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2hhcmFjdGVyRW5jb2RpbmcoKTsKKworIC8qKgorICAgICAqIE92ZXJyaWRlcyB0aGUgbmFtZSBvZiB0aGUgY2hhcmFjdGVyIGVuY29kaW5nIHVzZWQgaW4gdGhlIGJvZHkgb2YgdGhpcworICAgICAqIHJlcXVlc3QuIFRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkIHByaW9yIHRvIHJlYWRpbmcgcmVxdWVzdCBwYXJhbWV0ZXJzCisgICAgICogb3IgcmVhZGluZyBpbnB1dCB1c2luZyBnZXRSZWFkZXIoKS4KKyAgICAgKiAKKyAgICAgKgorICAgICAqIEBwYXJhbSBlbnYJYSA8Y29kZT5TdHJpbmc8L2NvZGU+IGNvbnRhaW5pbmcgdGhlIG5hbWUgb2YgCisgICAgICoJCQl0aGUgY2hhcmFjdGVyIGVuY29kaW5nLgorICAgICAqIEB0aHJvd3MJCWphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBpZiB0aGlzIGlzIG5vdCBhIHZhbGlkIGVuY29kaW5nCisgICAgICovCisKKyAgICBwdWJsaWMgdm9pZCBzZXRDaGFyYWN0ZXJFbmNvZGluZyhTdHJpbmcgZW52KSB0aHJvd3MgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbGVuZ3RoLCBpbiBieXRlcywgb2YgdGhlIHJlcXVlc3QgYm9keSAKKyAgICAgKiBhbmQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIGlucHV0IHN0cmVhbSwgb3IgLTEgaWYgdGhlCisgICAgICogbGVuZ3RoIGlzIG5vdCBrbm93bi4gRm9yIEhUVFAgc2VydmxldHMsIHNhbWUgYXMgdGhlIHZhbHVlCisgICAgICogb2YgdGhlIENHSSB2YXJpYWJsZSBDT05URU5UX0xFTkdUSC4KKyAgICAgKgorICAgICAqIEByZXR1cm4JCWFuIGludGVnZXIgY29udGFpbmluZyB0aGUgbGVuZ3RoIG9mIHRoZSAKKyAgICAgKiAJCQlyZXF1ZXN0IGJvZHkgb3IgLTEgaWYgdGhlIGxlbmd0aCBpcyBub3Qga25vd24KKyAgICAgKgorICAgICAqLworCisgICAgcHVibGljIGludCBnZXRDb250ZW50TGVuZ3RoKCk7CisgICAgCisgICAgCisgICAgCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBNSU1FIHR5cGUgb2YgdGhlIGJvZHkgb2YgdGhlIHJlcXVlc3QsIG9yIAorICAgICAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSB0eXBlIGlzIG5vdCBrbm93bi4gRm9yIEhUVFAgc2VydmxldHMsIAorICAgICAqIHNhbWUgYXMgdGhlIHZhbHVlIG9mIHRoZSBDR0kgdmFyaWFibGUgQ09OVEVOVF9UWVBFLgorICAgICAqCisgICAgICogQHJldHVybgkJYSA8Y29kZT5TdHJpbmc8L2NvZGU+IGNvbnRhaW5pbmcgdGhlIG5hbWUgCisgICAgICoJCQlvZiB0aGUgTUlNRSB0eXBlIG9mIAorICAgICAqIAkJCXRoZSByZXF1ZXN0LCBvciBudWxsIGlmIHRoZSB0eXBlIGlzIG5vdCBrbm93bgorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRUeXBlKCk7CisgICAgCisgICAgCisgICAgCisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIGJvZHkgb2YgdGhlIHJlcXVlc3QgYXMgYmluYXJ5IGRhdGEgdXNpbmcKKyAgICAgKiBhIHtAbGluayBTZXJ2bGV0SW5wdXRTdHJlYW19LiAgRWl0aGVyIHRoaXMgbWV0aG9kIG9yIAorICAgICAqIHtAbGluayAjZ2V0UmVhZGVyfSBtYXkgYmUgY2FsbGVkIHRvIHJlYWQgdGhlIGJvZHksIG5vdCBib3RoLgorICAgICAqCisgICAgICogQHJldHVybgkJCWEge0BsaW5rIFNlcnZsZXRJbnB1dFN0cmVhbX0gb2JqZWN0IGNvbnRhaW5pbmcKKyAgICAgKiAJCQkJdGhlIGJvZHkgb2YgdGhlIHJlcXVlc3QKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uICBpZiB0aGUge0BsaW5rICNnZXRSZWFkZXJ9IG1ldGhvZAorICAgICAqIAkJCQkJIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkIGZvciB0aGlzIHJlcXVlc3QKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gICAgCWlmIGFuIGlucHV0IG9yIG91dHB1dCBleGNlcHRpb24gb2NjdXJyZWQKKyAgICAgKgorICAgICAqLworCisgICAgcHVibGljIFNlcnZsZXRJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbjsgCisgICAgIAorICAgIAorICAgIAorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgYSByZXF1ZXN0IHBhcmFtZXRlciBhcyBhIDxjb2RlPlN0cmluZzwvY29kZT4sCisgICAgICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHBhcmFtZXRlciBkb2VzIG5vdCBleGlzdC4gUmVxdWVzdCBwYXJhbWV0ZXJzCisgICAgICogYXJlIGV4dHJhIGluZm9ybWF0aW9uIHNlbnQgd2l0aCB0aGUgcmVxdWVzdC4gIEZvciBIVFRQIHNlcnZsZXRzLAorICAgICAqIHBhcmFtZXRlcnMgYXJlIGNvbnRhaW5lZCBpbiB0aGUgcXVlcnkgc3RyaW5nIG9yIHBvc3RlZCBmb3JtIGRhdGEuCisgICAgICoKKyAgICAgKiA8cD5Zb3Ugc2hvdWxkIG9ubHkgdXNlIHRoaXMgbWV0aG9kIHdoZW4geW91IGFyZSBzdXJlIHRoZQorICAgICAqIHBhcmFtZXRlciBoYXMgb25seSBvbmUgdmFsdWUuIElmIHRoZSBwYXJhbWV0ZXIgbWlnaHQgaGF2ZQorICAgICAqIG1vcmUgdGhhbiBvbmUgdmFsdWUsIHVzZSB7QGxpbmsgI2dldFBhcmFtZXRlclZhbHVlc30uCisgICAgICoKKyAgICAgKiA8cD5JZiB5b3UgdXNlIHRoaXMgbWV0aG9kIHdpdGggYSBtdWx0aXZhbHVlZAorICAgICAqIHBhcmFtZXRlciwgdGhlIHZhbHVlIHJldHVybmVkIGlzIGVxdWFsIHRvIHRoZSBmaXJzdCB2YWx1ZQorICAgICAqIGluIHRoZSBhcnJheSByZXR1cm5lZCBieSA8Y29kZT5nZXRQYXJhbWV0ZXJWYWx1ZXM8L2NvZGU+LgorICAgICAqCisgICAgICogPHA+SWYgdGhlIHBhcmFtZXRlciBkYXRhIHdhcyBzZW50IGluIHRoZSByZXF1ZXN0IGJvZHksIHN1Y2ggYXMgb2NjdXJzCisgICAgICogd2l0aCBhbiBIVFRQIFBPU1QgcmVxdWVzdCwgdGhlbiByZWFkaW5nIHRoZSBib2R5IGRpcmVjdGx5IHZpYSB7QGxpbmsKKyAgICAgKiAjZ2V0SW5wdXRTdHJlYW19IG9yIHtAbGluayAjZ2V0UmVhZGVyfSBjYW4gaW50ZXJmZXJlCisgICAgICogd2l0aCB0aGUgZXhlY3V0aW9uIG9mIHRoaXMgbWV0aG9kLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgCWEgPGNvZGU+U3RyaW5nPC9jb2RlPiBzcGVjaWZ5aW5nIHRoZSAKKyAgICAgKgkJCW5hbWUgb2YgdGhlIHBhcmFtZXRlcgorICAgICAqCisgICAgICogQHJldHVybgkJYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHJlcHJlc2VudGluZyB0aGUgCisgICAgICoJCQlzaW5nbGUgdmFsdWUgb2YgdGhlIHBhcmFtZXRlcgorICAgICAqCisgICAgICogQHNlZSAJCSNnZXRQYXJhbWV0ZXJWYWx1ZXMKKyAgICAgKgorICAgICAqLworCisgICAgcHVibGljIFN0cmluZyBnZXRQYXJhbWV0ZXIoU3RyaW5nIG5hbWUpOworICAgIAorICAgIAorICAgIAorCisgICAgLyoqCisgICAgICoKKyAgICAgKiBSZXR1cm5zIGFuIDxjb2RlPkVudW1lcmF0aW9uPC9jb2RlPiBvZiA8Y29kZT5TdHJpbmc8L2NvZGU+CisgICAgICogb2JqZWN0cyBjb250YWluaW5nIHRoZSBuYW1lcyBvZiB0aGUgcGFyYW1ldGVycyBjb250YWluZWQKKyAgICAgKiBpbiB0aGlzIHJlcXVlc3QuIElmIHRoZSByZXF1ZXN0IGhhcyAKKyAgICAgKiBubyBwYXJhbWV0ZXJzLCB0aGUgbWV0aG9kIHJldHVybnMgYW4gCisgICAgICogZW1wdHkgPGNvZGU+RW51bWVyYXRpb248L2NvZGU+LiAKKyAgICAgKgorICAgICAqIEByZXR1cm4JCWFuIDxjb2RlPkVudW1lcmF0aW9uPC9jb2RlPiBvZiA8Y29kZT5TdHJpbmc8L2NvZGU+CisgICAgICoJCQlvYmplY3RzLCBlYWNoIDxjb2RlPlN0cmluZzwvY29kZT4gY29udGFpbmluZworICAgICAqIAkJCXRoZSBuYW1lIG9mIGEgcmVxdWVzdCBwYXJhbWV0ZXI7IG9yIGFuIAorICAgICAqCQkJZW1wdHkgPGNvZGU+RW51bWVyYXRpb248L2NvZGU+IGlmIHRoZQorICAgICAqCQkJcmVxdWVzdCBoYXMgbm8gcGFyYW1ldGVycworICAgICAqCisgICAgICovCisgICAgIAorICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRQYXJhbWV0ZXJOYW1lcygpOworICAgIAorICAgIAorICAgIAorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhbiBhcnJheSBvZiA8Y29kZT5TdHJpbmc8L2NvZGU+IG9iamVjdHMgY29udGFpbmluZyAKKyAgICAgKiBhbGwgb2YgdGhlIHZhbHVlcyB0aGUgZ2l2ZW4gcmVxdWVzdCBwYXJhbWV0ZXIgaGFzLCBvciAKKyAgICAgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcGFyYW1ldGVyIGRvZXMgbm90IGV4aXN0LgorICAgICAqCisgICAgICogPHA+SWYgdGhlIHBhcmFtZXRlciBoYXMgYSBzaW5nbGUgdmFsdWUsIHRoZSBhcnJheSBoYXMgYSBsZW5ndGgKKyAgICAgKiBvZiAxLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUJYSA8Y29kZT5TdHJpbmc8L2NvZGU+IGNvbnRhaW5pbmcgdGhlIG5hbWUgb2YgCisgICAgICoJCQl0aGUgcGFyYW1ldGVyIHdob3NlIHZhbHVlIGlzIHJlcXVlc3RlZAorICAgICAqCisgICAgICogQHJldHVybgkJYW4gYXJyYXkgb2YgPGNvZGU+U3RyaW5nPC9jb2RlPiBvYmplY3RzIAorICAgICAqCQkJY29udGFpbmluZyB0aGUgcGFyYW1ldGVyJ3MgdmFsdWVzCisgICAgICoKKyAgICAgKiBAc2VlCQkjZ2V0UGFyYW1ldGVyCisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRQYXJhbWV0ZXJWYWx1ZXMoU3RyaW5nIG5hbWUpOworIAorICAgIC8qKiBSZXR1cm5zIGEgamF2YS51dGlsLk1hcCBvZiB0aGUgcGFyYW1ldGVycyBvZiB0aGlzIHJlcXVlc3QuCisgICAgICogUmVxdWVzdCBwYXJhbWV0ZXJzCisgICAgICogYXJlIGV4dHJhIGluZm9ybWF0aW9uIHNlbnQgd2l0aCB0aGUgcmVxdWVzdC4gIEZvciBIVFRQIHNlcnZsZXRzLAorICAgICAqIHBhcmFtZXRlcnMgYXJlIGNvbnRhaW5lZCBpbiB0aGUgcXVlcnkgc3RyaW5nIG9yIHBvc3RlZCBmb3JtIGRhdGEuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGFuIGltbXV0YWJsZSBqYXZhLnV0aWwuTWFwIGNvbnRhaW5pbmcgcGFyYW1ldGVyIG5hbWVzIGFzIAorICAgICAqIGtleXMgYW5kIHBhcmFtZXRlciB2YWx1ZXMgYXMgbWFwIHZhbHVlcy4gVGhlIGtleXMgaW4gdGhlIHBhcmFtZXRlcgorICAgICAqIG1hcCBhcmUgb2YgdHlwZSBTdHJpbmcuIFRoZSB2YWx1ZXMgaW4gdGhlIHBhcmFtZXRlciBtYXAgYXJlIG9mIHR5cGUKKyAgICAgKiBTdHJpbmcgYXJyYXkuCisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyBNYXAgZ2V0UGFyYW1ldGVyTWFwKCk7CisgICAgCisgICAgCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIGFuZCB2ZXJzaW9uIG9mIHRoZSBwcm90b2NvbCB0aGUgcmVxdWVzdCB1c2VzCisgICAgICogaW4gdGhlIGZvcm0gPGk+cHJvdG9jb2wvbWFqb3JWZXJzaW9uLm1pbm9yVmVyc2lvbjwvaT4sIGZvciAKKyAgICAgKiBleGFtcGxlLCBIVFRQLzEuMS4gRm9yIEhUVFAgc2VydmxldHMsIHRoZSB2YWx1ZQorICAgICAqIHJldHVybmVkIGlzIHRoZSBzYW1lIGFzIHRoZSB2YWx1ZSBvZiB0aGUgQ0dJIHZhcmlhYmxlIAorICAgICAqIDxjb2RlPlNFUlZFUl9QUk9UT0NPTDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuCQlhIDxjb2RlPlN0cmluZzwvY29kZT4gY29udGFpbmluZyB0aGUgcHJvdG9jb2wgCisgICAgICoJCQluYW1lIGFuZCB2ZXJzaW9uIG51bWJlcgorICAgICAqCisgICAgICovCisgICAgCisgICAgcHVibGljIFN0cmluZyBnZXRQcm90b2NvbCgpOworICAgIAorICAgIAorICAgIAorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgc2NoZW1lIHVzZWQgdG8gbWFrZSB0aGlzIHJlcXVlc3QsIAorICAgICAqIGZvciBleGFtcGxlLAorICAgICAqIDxjb2RlPmh0dHA8L2NvZGU+LCA8Y29kZT5odHRwczwvY29kZT4sIG9yIDxjb2RlPmZ0cDwvY29kZT4uCisgICAgICogRGlmZmVyZW50IHNjaGVtZXMgaGF2ZSBkaWZmZXJlbnQgcnVsZXMgZm9yIGNvbnN0cnVjdGluZyBVUkxzLAorICAgICAqIGFzIG5vdGVkIGluIFJGQyAxNzM4LgorICAgICAqCisgICAgICogQHJldHVybgkJYSA8Y29kZT5TdHJpbmc8L2NvZGU+IGNvbnRhaW5pbmcgdGhlIG5hbWUgCisgICAgICoJCQlvZiB0aGUgc2NoZW1lIHVzZWQgdG8gbWFrZSB0aGlzIHJlcXVlc3QKKyAgICAgKgorICAgICAqLworCisgICAgcHVibGljIFN0cmluZyBnZXRTY2hlbWUoKTsKKyAgICAKKyAgICAKKyAgICAKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGhvc3QgbmFtZSBvZiB0aGUgc2VydmVyIHRvIHdoaWNoIHRoZSByZXF1ZXN0IHdhcyBzZW50LgorICAgICAqIEl0IGlzIHRoZSB2YWx1ZSBvZiB0aGUgcGFydCBiZWZvcmUgIjoiIGluIHRoZSA8Y29kZT5Ib3N0PC9jb2RlPgorICAgICAqIGhlYWRlciB2YWx1ZSwgaWYgYW55LCBvciB0aGUgcmVzb2x2ZWQgc2VydmVyIG5hbWUsIG9yIHRoZSBzZXJ2ZXIgSVAgYWRkcmVzcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4JCWEgPGNvZGU+U3RyaW5nPC9jb2RlPiBjb250YWluaW5nIHRoZSBuYW1lIAorICAgICAqCQkJb2YgdGhlIHNlcnZlcgorICAgICAqLworCisgICAgcHVibGljIFN0cmluZyBnZXRTZXJ2ZXJOYW1lKCk7CisgICAgCisgICAgCisgICAgCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBwb3J0IG51bWJlciB0byB3aGljaCB0aGUgcmVxdWVzdCB3YXMgc2VudC4KKyAgICAgKiBJdCBpcyB0aGUgdmFsdWUgb2YgdGhlIHBhcnQgYWZ0ZXIgIjoiIGluIHRoZSA8Y29kZT5Ib3N0PC9jb2RlPgorICAgICAqIGhlYWRlciB2YWx1ZSwgaWYgYW55LCBvciB0aGUgc2VydmVyIHBvcnQgd2hlcmUgdGhlIGNsaWVudCBjb25uZWN0aW9uCisgICAgICogd2FzIGFjY2VwdGVkIG9uLgorICAgICAqCisgICAgICogQHJldHVybgkJYW4gaW50ZWdlciBzcGVjaWZ5aW5nIHRoZSBwb3J0IG51bWJlcgorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgaW50IGdldFNlcnZlclBvcnQoKTsKKyAgICAKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIGJvZHkgb2YgdGhlIHJlcXVlc3QgYXMgY2hhcmFjdGVyIGRhdGEgdXNpbmcKKyAgICAgKiBhIDxjb2RlPkJ1ZmZlcmVkUmVhZGVyPC9jb2RlPi4gIFRoZSByZWFkZXIgdHJhbnNsYXRlcyB0aGUgY2hhcmFjdGVyCisgICAgICogZGF0YSBhY2NvcmRpbmcgdG8gdGhlIGNoYXJhY3RlciBlbmNvZGluZyB1c2VkIG9uIHRoZSBib2R5LgorICAgICAqIEVpdGhlciB0aGlzIG1ldGhvZCBvciB7QGxpbmsgI2dldElucHV0U3RyZWFtfSBtYXkgYmUgY2FsbGVkIHRvIHJlYWQgdGhlCisgICAgICogYm9keSwgbm90IGJvdGguCisgICAgICogCisgICAgICoKKyAgICAgKiBAcmV0dXJuCQkJCQlhIDxjb2RlPkJ1ZmZlcmVkUmVhZGVyPC9jb2RlPgorICAgICAqCQkJCQkJY29udGFpbmluZyB0aGUgYm9keSBvZiB0aGUgcmVxdWVzdAkKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiAJaWYgdGhlIGNoYXJhY3RlciBzZXQgZW5jb2RpbmcKKyAgICAgKiAJCQkJCQl1c2VkIGlzIG5vdCBzdXBwb3J0ZWQgYW5kIHRoZSAKKyAgICAgKgkJCQkJCXRleHQgY2Fubm90IGJlIGRlY29kZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uICAgCWlmIHtAbGluayAjZ2V0SW5wdXRTdHJlYW19IG1ldGhvZAorICAgICAqIAkJCQkJCWhhcyBiZWVuIGNhbGxlZCBvbiB0aGlzIHJlcXVlc3QKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gIAkJCWlmIGFuIGlucHV0IG9yIG91dHB1dCBleGNlcHRpb24gb2NjdXJyZWQKKyAgICAgKgorICAgICAqIEBzZWUgCQkJCQkjZ2V0SW5wdXRTdHJlYW0KKyAgICAgKgorICAgICAqLworCisgICAgcHVibGljIEJ1ZmZlcmVkUmVhZGVyIGdldFJlYWRlcigpIHRocm93cyBJT0V4Y2VwdGlvbjsKKyAgICAKKyAgICAKKyAgICAKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIEludGVybmV0IFByb3RvY29sIChJUCkgYWRkcmVzcyBvZiB0aGUgY2xpZW50IAorICAgICAqIG9yIGxhc3QgcHJveHkgdGhhdCBzZW50IHRoZSByZXF1ZXN0LgorICAgICAqIEZvciBIVFRQIHNlcnZsZXRzLCBzYW1lIGFzIHRoZSB2YWx1ZSBvZiB0aGUgCisgICAgICogQ0dJIHZhcmlhYmxlIDxjb2RlPlJFTU9URV9BRERSPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEByZXR1cm4JCWEgPGNvZGU+U3RyaW5nPC9jb2RlPiBjb250YWluaW5nIHRoZSAKKyAgICAgKgkJCUlQIGFkZHJlc3Mgb2YgdGhlIGNsaWVudCB0aGF0IHNlbnQgdGhlIHJlcXVlc3QKKyAgICAgKgorICAgICAqLworICAgIAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVtb3RlQWRkcigpOworICAgIAorICAgIAorICAgIAorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGNsaWVudAorICAgICAqIG9yIHRoZSBsYXN0IHByb3h5IHRoYXQgc2VudCB0aGUgcmVxdWVzdC4KKyAgICAgKiBJZiB0aGUgZW5naW5lIGNhbm5vdCBvciBjaG9vc2VzIG5vdCB0byByZXNvbHZlIHRoZSBob3N0bmFtZSAKKyAgICAgKiAodG8gaW1wcm92ZSBwZXJmb3JtYW5jZSksIHRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGRvdHRlZC1zdHJpbmcgZm9ybSBvZiAKKyAgICAgKiB0aGUgSVAgYWRkcmVzcy4gRm9yIEhUVFAgc2VydmxldHMsIHNhbWUgYXMgdGhlIHZhbHVlIG9mIHRoZSBDR0kgdmFyaWFibGUgCisgICAgICogPGNvZGU+UkVNT1RFX0hPU1Q8L2NvZGU+LgorICAgICAqCisgICAgICogQHJldHVybgkJYSA8Y29kZT5TdHJpbmc8L2NvZGU+IGNvbnRhaW5pbmcgdGhlIGZ1bGx5IAorICAgICAqCQkJcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGNsaWVudAorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlbW90ZUhvc3QoKTsKKyAgICAKKyAgICAKKyAgICAKKworICAgIC8qKgorICAgICAqCisgICAgICogU3RvcmVzIGFuIGF0dHJpYnV0ZSBpbiB0aGlzIHJlcXVlc3QuCisgICAgICogQXR0cmlidXRlcyBhcmUgcmVzZXQgYmV0d2VlbiByZXF1ZXN0cy4gIFRoaXMgbWV0aG9kIGlzIG1vc3QKKyAgICAgKiBvZnRlbiB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGgge0BsaW5rIFJlcXVlc3REaXNwYXRjaGVyfS4KKyAgICAgKgorICAgICAqIDxwPkF0dHJpYnV0ZSBuYW1lcyBzaG91bGQgZm9sbG93IHRoZSBzYW1lIGNvbnZlbnRpb25zIGFzCisgICAgICogcGFja2FnZSBuYW1lcy4gTmFtZXMgYmVnaW5uaW5nIHdpdGggPGNvZGU+amF2YS4qPC9jb2RlPiwKKyAgICAgKiA8Y29kZT5qYXZheC4qPC9jb2RlPiwgYW5kIDxjb2RlPmNvbS5zdW4uKjwvY29kZT4sIGFyZQorICAgICAqIHJlc2VydmVkIGZvciB1c2UgYnkgU3VuIE1pY3Jvc3lzdGVtcy4KKyAgICAgKjxicj4gSWYgdGhlIG9iamVjdCBwYXNzZWQgaW4gaXMgbnVsbCwgdGhlIGVmZmVjdCBpcyB0aGUgc2FtZSBhcworICAgICAqIGNhbGxpbmcge0BsaW5rICNyZW1vdmVBdHRyaWJ1dGV9LgorICAgICAqIDxicj4gSXQgaXMgd2FybmVkIHRoYXQgd2hlbiB0aGUgcmVxdWVzdCBpcyBkaXNwYXRjaGVkIGZyb20gdGhlCisgICAgICogc2VydmxldCByZXNpZGVzIGluIGEgZGlmZmVyZW50IHdlYiBhcHBsaWNhdGlvbiBieQorICAgICAqIDxjb2RlPlJlcXVlc3REaXNwYXRjaGVyPC9jb2RlPiwgdGhlIG9iamVjdCBzZXQgYnkgdGhpcyBtZXRob2QKKyAgICAgKiBtYXkgbm90IGJlIGNvcnJlY3RseSByZXRyaWV2ZWQgaW4gdGhlIGNhbGxlciBzZXJ2bGV0LgorICAgICAqCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZQkJCWEgPGNvZGU+U3RyaW5nPC9jb2RlPiBzcGVjaWZ5aW5nIAorICAgICAqCQkJCQl0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlCisgICAgICoKKyAgICAgKiBAcGFyYW0gbwkJCQl0aGUgPGNvZGU+T2JqZWN0PC9jb2RlPiB0byBiZSBzdG9yZWQKKyAgICAgKgorICAgICAqLworCisgICAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBuYW1lLCBPYmplY3Qgbyk7CisgICAgCisgICAgCisgICAgCisKKyAgICAvKioKKyAgICAgKgorICAgICAqIFJlbW92ZXMgYW4gYXR0cmlidXRlIGZyb20gdGhpcyByZXF1ZXN0LiAgVGhpcyBtZXRob2QgaXMgbm90CisgICAgICogZ2VuZXJhbGx5IG5lZWRlZCBhcyBhdHRyaWJ1dGVzIG9ubHkgcGVyc2lzdCBhcyBsb25nIGFzIHRoZSByZXF1ZXN0CisgICAgICogaXMgYmVpbmcgaGFuZGxlZC4KKyAgICAgKgorICAgICAqIDxwPkF0dHJpYnV0ZSBuYW1lcyBzaG91bGQgZm9sbG93IHRoZSBzYW1lIGNvbnZlbnRpb25zIGFzCisgICAgICogcGFja2FnZSBuYW1lcy4gTmFtZXMgYmVnaW5uaW5nIHdpdGggPGNvZGU+amF2YS4qPC9jb2RlPiwKKyAgICAgKiA8Y29kZT5qYXZheC4qPC9jb2RlPiwgYW5kIDxjb2RlPmNvbS5zdW4uKjwvY29kZT4sIGFyZQorICAgICAqIHJlc2VydmVkIGZvciB1c2UgYnkgU3VuIE1pY3Jvc3lzdGVtcy4KKyAgICAgKgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUJCQlhIDxjb2RlPlN0cmluZzwvY29kZT4gc3BlY2lmeWluZyAKKyAgICAgKgkJCQkJdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0byByZW1vdmUKKyAgICAgKgorICAgICAqLworCisgICAgcHVibGljIHZvaWQgcmVtb3ZlQXR0cmlidXRlKFN0cmluZyBuYW1lKTsKKyAgICAKKyAgICAKKyAgICAKKworICAgIC8qKgorICAgICAqCisgICAgICogUmV0dXJucyB0aGUgcHJlZmVycmVkIDxjb2RlPkxvY2FsZTwvY29kZT4gdGhhdCB0aGUgY2xpZW50IHdpbGwgCisgICAgICogYWNjZXB0IGNvbnRlbnQgaW4sIGJhc2VkIG9uIHRoZSBBY2NlcHQtTGFuZ3VhZ2UgaGVhZGVyLgorICAgICAqIElmIHRoZSBjbGllbnQgcmVxdWVzdCBkb2Vzbid0IHByb3ZpZGUgYW4gQWNjZXB0LUxhbmd1YWdlIGhlYWRlciwKKyAgICAgKiB0aGlzIG1ldGhvZCByZXR1cm5zIHRoZSBkZWZhdWx0IGxvY2FsZSBmb3IgdGhlIHNlcnZlci4KKyAgICAgKgorICAgICAqCisgICAgICogQHJldHVybgkJdGhlIHByZWZlcnJlZCA8Y29kZT5Mb2NhbGU8L2NvZGU+IGZvciB0aGUgY2xpZW50CisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyBMb2NhbGUgZ2V0TG9jYWxlKCk7CisgICAgCisgICAgCisgICAgCisKKyAgICAvKioKKyAgICAgKgorICAgICAqIFJldHVybnMgYW4gPGNvZGU+RW51bWVyYXRpb248L2NvZGU+IG9mIDxjb2RlPkxvY2FsZTwvY29kZT4gb2JqZWN0cworICAgICAqIGluZGljYXRpbmcsIGluIGRlY3JlYXNpbmcgb3JkZXIgc3RhcnRpbmcgd2l0aCB0aGUgcHJlZmVycmVkIGxvY2FsZSwgdGhlCisgICAgICogbG9jYWxlcyB0aGF0IGFyZSBhY2NlcHRhYmxlIHRvIHRoZSBjbGllbnQgYmFzZWQgb24gdGhlIEFjY2VwdC1MYW5ndWFnZQorICAgICAqIGhlYWRlci4KKyAgICAgKiBJZiB0aGUgY2xpZW50IHJlcXVlc3QgZG9lc24ndCBwcm92aWRlIGFuIEFjY2VwdC1MYW5ndWFnZSBoZWFkZXIsCisgICAgICogdGhpcyBtZXRob2QgcmV0dXJucyBhbiA8Y29kZT5FbnVtZXJhdGlvbjwvY29kZT4gY29udGFpbmluZyBvbmUgCisgICAgICogPGNvZGU+TG9jYWxlPC9jb2RlPiwgdGhlIGRlZmF1bHQgbG9jYWxlIGZvciB0aGUgc2VydmVyLgorICAgICAqCisgICAgICoKKyAgICAgKiBAcmV0dXJuCQlhbiA8Y29kZT5FbnVtZXJhdGlvbjwvY29kZT4gb2YgcHJlZmVycmVkIAorICAgICAqICAgICAgICAgICAgICAgICAgPGNvZGU+TG9jYWxlPC9jb2RlPiBvYmplY3RzIGZvciB0aGUgY2xpZW50CisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRMb2NhbGVzKCk7CisgICAgCisgICAgCisgICAgCisKKyAgICAvKioKKyAgICAgKgorICAgICAqIFJldHVybnMgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGlzIHJlcXVlc3Qgd2FzIG1hZGUgdXNpbmcgYQorICAgICAqIHNlY3VyZSBjaGFubmVsLCBzdWNoIGFzIEhUVFBTLgorICAgICAqCisgICAgICoKKyAgICAgKiBAcmV0dXJuCQlhIGJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGUgcmVxdWVzdCB3YXMgbWFkZSB1c2luZyBhCisgICAgICogICAgICAgICAgICAgICAgICBzZWN1cmUgY2hhbm5lbAorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1NlY3VyZSgpOworICAgIAorICAgIAorICAgIAorCisgICAgLyoqCisgICAgICoKKyAgICAgKiBSZXR1cm5zIGEge0BsaW5rIFJlcXVlc3REaXNwYXRjaGVyfSBvYmplY3QgdGhhdCBhY3RzIGFzIGEgd3JhcHBlciBmb3IKKyAgICAgKiB0aGUgcmVzb3VyY2UgbG9jYXRlZCBhdCB0aGUgZ2l2ZW4gcGF0aC4gIAorICAgICAqIEEgPGNvZGU+UmVxdWVzdERpc3BhdGNoZXI8L2NvZGU+IG9iamVjdCBjYW4gYmUgdXNlZCB0byBmb3J3YXJkCisgICAgICogYSByZXF1ZXN0IHRvIHRoZSByZXNvdXJjZSBvciB0byBpbmNsdWRlIHRoZSByZXNvdXJjZSBpbiBhIHJlc3BvbnNlLgorICAgICAqIFRoZSByZXNvdXJjZSBjYW4gYmUgZHluYW1pYyBvciBzdGF0aWMuCisgICAgICoKKyAgICAgKiA8cD5UaGUgcGF0aG5hbWUgc3BlY2lmaWVkIG1heSBiZSByZWxhdGl2ZSwgYWx0aG91Z2ggaXQgY2Fubm90IGV4dGVuZAorICAgICAqIG91dHNpZGUgdGhlIGN1cnJlbnQgc2VydmxldCBjb250ZXh0LiAgSWYgdGhlIHBhdGggYmVnaW5zIHdpdGggCisgICAgICogYSAiLyIgaXQgaXMgaW50ZXJwcmV0ZWQgYXMgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgY29udGV4dCByb290LiAgCisgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgc2VydmxldCBjb250YWluZXIKKyAgICAgKiBjYW5ub3QgcmV0dXJuIGEgPGNvZGU+UmVxdWVzdERpc3BhdGNoZXI8L2NvZGU+LgorICAgICAqCisgICAgICogPHA+VGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGlzIG1ldGhvZCBhbmQge0BsaW5rCisgICAgICogU2VydmxldENvbnRleHQjZ2V0UmVxdWVzdERpc3BhdGNoZXJ9IGlzIHRoYXQgdGhpcyBtZXRob2QgY2FuIHRha2UgYQorICAgICAqIHJlbGF0aXZlIHBhdGguCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0aCAgICAgIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiBzcGVjaWZ5aW5nIHRoZSBwYXRobmFtZQorICAgICAqICAgICAgICAgICAgICAgICAgdG8gdGhlIHJlc291cmNlLiBJZiBpdCBpcyByZWxhdGl2ZSwgaXQgbXVzdCBiZQorICAgICAqICAgICAgICAgICAgICAgICAgcmVsYXRpdmUgYWdhaW5zdCB0aGUgY3VycmVudCBzZXJ2bGV0LgorICAgICAqCisgICAgICogQHJldHVybiAgICAgICAgICBhIDxjb2RlPlJlcXVlc3REaXNwYXRjaGVyPC9jb2RlPiBvYmplY3QKKyAgICAgKiAgICAgICAgICAgICAgICAgIHRoYXQgYWN0cyBhcyBhIHdyYXBwZXIgZm9yIHRoZSByZXNvdXJjZQorICAgICAqICAgICAgICAgICAgICAgICAgYXQgdGhlIHNwZWNpZmllZCBwYXRoLCBvciA8Y29kZT5udWxsPC9jb2RlPgorICAgICAqICAgICAgICAgICAgICAgICAgaWYgdGhlIHNlcnZsZXQgY29udGFpbmVyIGNhbm5vdCByZXR1cm4gYQorICAgICAqICAgICAgICAgICAgICAgICAgPGNvZGU+UmVxdWVzdERpc3BhdGNoZXI8L2NvZGU+CisgICAgICoKKyAgICAgKiBAc2VlICAgICAgICAgICAgIFJlcXVlc3REaXNwYXRjaGVyCisgICAgICogQHNlZSAgICAgICAgICAgICBTZXJ2bGV0Q29udGV4dCNnZXRSZXF1ZXN0RGlzcGF0Y2hlcgorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgUmVxdWVzdERpc3BhdGNoZXIgZ2V0UmVxdWVzdERpc3BhdGNoZXIoU3RyaW5nIHBhdGgpOworICAgIAorICAgIAorICAgIAorCisgICAgLyoqCisgICAgICogCisgICAgICogQGRlcHJlY2F0ZWQgCUFzIG9mIFZlcnNpb24gMi4xIG9mIHRoZSBKYXZhIFNlcnZsZXQgQVBJLAorICAgICAqIAkJCXVzZSB7QGxpbmsgU2VydmxldENvbnRleHQjZ2V0UmVhbFBhdGh9IGluc3RlYWQuCisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVhbFBhdGgoU3RyaW5nIHBhdGgpOworICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIEludGVybmV0IFByb3RvY29sIChJUCkgc291cmNlIHBvcnQgb2YgdGhlIGNsaWVudAorICAgICAqIG9yIGxhc3QgcHJveHkgdGhhdCBzZW50IHRoZSByZXF1ZXN0LgorICAgICAqCisgICAgICogQHJldHVybglhbiBpbnRlZ2VyIHNwZWNpZnlpbmcgdGhlIHBvcnQgbnVtYmVyCisgICAgICoKKyAgICAgKiBAc2luY2UgMi40CisgICAgICovICAgIAorICAgIHB1YmxpYyBpbnQgZ2V0UmVtb3RlUG9ydCgpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBob3N0IG5hbWUgb2YgdGhlIEludGVybmV0IFByb3RvY29sIChJUCkgaW50ZXJmYWNlIG9uCisgICAgICogd2hpY2ggdGhlIHJlcXVlc3Qgd2FzIHJlY2VpdmVkLgorICAgICAqCisgICAgICogQHJldHVybglhIDxjb2RlPlN0cmluZzwvY29kZT4gY29udGFpbmluZyB0aGUgaG9zdAorICAgICAqCQluYW1lIG9mIHRoZSBJUCBvbiB3aGljaCB0aGUgcmVxdWVzdCB3YXMgcmVjZWl2ZWQuCisgICAgICoKKyAgICAgKiBAc2luY2UgMi40CisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRMb2NhbE5hbWUoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIEludGVybmV0IFByb3RvY29sIChJUCkgYWRkcmVzcyBvZiB0aGUgaW50ZXJmYWNlIG9uCisgICAgICogd2hpY2ggdGhlIHJlcXVlc3QgIHdhcyByZWNlaXZlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4JYSA8Y29kZT5TdHJpbmc8L2NvZGU+IGNvbnRhaW5pbmcgdGhlCisgICAgICoJCUlQIGFkZHJlc3Mgb24gd2hpY2ggdGhlIHJlcXVlc3Qgd2FzIHJlY2VpdmVkLiAKKyAgICAgKgorICAgICAqIEBzaW5jZSAyLjQKKyAgICAgKgorICAgICAqLyAgICAgICAKKyAgICBwdWJsaWMgU3RyaW5nIGdldExvY2FsQWRkcigpOworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBJbnRlcm5ldCBQcm90b2NvbCAoSVApIHBvcnQgbnVtYmVyIG9mIHRoZSBpbnRlcmZhY2UKKyAgICAgKiBvbiB3aGljaCB0aGUgcmVxdWVzdCB3YXMgcmVjZWl2ZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGFuIGludGVnZXIgc3BlY2lmeWluZyB0aGUgcG9ydCBudW1iZXIKKyAgICAgKgorICAgICAqIEBzaW5jZSAyLjQKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldExvY2FsUG9ydCgpOworCit9CisKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L1NlcnZsZXRSZXF1ZXN0QXR0cmlidXRlRXZlbnQuamF2YSBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L1NlcnZsZXRSZXF1ZXN0QXR0cmlidXRlRXZlbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2E5ZWI0Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVFdmVudC5qYXZhCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisqIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KK3BhY2thZ2UgamF2YXguc2VydmxldDsKKworCisgICAgLyoqIAorICAgICAgKiBUaGlzIGlzIHRoZSBldmVudCBjbGFzcyBmb3Igbm90aWZpY2F0aW9ucyBvZiBjaGFuZ2VzIHRvIHRoZSAKKyAgICAgICogYXR0cmlidXRlcyBvZiB0aGUgc2VydmxldCByZXF1ZXN0IGluIGFuIGFwcGxpY2F0aW9uLgorICAgICAgKiBAc2VlIFNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlTGlzdGVuZXIKKyAgICAgICogQHNpbmNlCVNlcnZsZXQgMi40CisgICAgICAqLworCitwdWJsaWMgY2xhc3MgU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVFdmVudCBleHRlbmRzIFNlcnZsZXRSZXF1ZXN0RXZlbnQgeyAKKyAgICBwcml2YXRlIFN0cmluZyBuYW1lOworICAgIHByaXZhdGUgT2JqZWN0IHZhbHVlOworCisgICAgIC8qKiBDb25zdHJ1Y3QgYSBTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZUV2ZW50IGdpdmluZyB0aGUgc2VydmxldCBjb250ZXh0CisgICAgICAqIG9mIHRoaXMgd2ViIGFwcGxpY2F0aW9uLCB0aGUgU2VydmxldFJlcXVlc3Qgd2hvc2UgYXR0cmlidXRlcyBhcmUKKyAgICAgICogY2hhbmdpbmcgYW5kIHRoZSBuYW1lIGFuZCB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlLgorICAgICAgKgorICAgICAgKiBAcGFyYW0gc2MJCXRoZSBTZXJ2bGV0Q29udGV4dCB0aGF0IGlzIHNlbmRpbmcgdGhlIGV2ZW50LgorICAgICAgKiBAcGFyYW0gcmVxdWVzdAkJdGhlIFNlcnZsZXRSZXF1ZXN0IHRoYXQgaXMgc2VuZGluZyB0aGUgZXZlbnQuCisgICAgICAqIEBwYXJhbSBuYW1lCQl0aGUgbmFtZSBvZiB0aGUgcmVxdWVzdCBhdHRyaWJ1dGUuCisgICAgICAqIEBwYXJhbSB2YWx1ZQkJdGhlIHZhbHVlIG9mIHRoZSByZXF1ZXN0IGF0dHJpYnV0ZS4KKyAgICAgICovCisgICAgcHVibGljIFNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlRXZlbnQoU2VydmxldENvbnRleHQgc2MsIFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgc3VwZXIoc2MsIHJlcXVlc3QpOworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHRoYXQgY2hhbmdlZCBvbiB0aGUgU2VydmxldFJlcXVlc3QuCisgICAgICAqCisgICAgICAqIEByZXR1cm4JCXRoZSBuYW1lIG9mIHRoZSBjaGFuZ2VkIHJlcXVlc3QgYXR0cmlidXRlCisgICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSB0aGF0IGhhcyBiZWVuIGFkZGVkLCByZW1vdmVkIG9yIAorICAgICAgKiByZXBsYWNlZC4gSWYgdGhlIGF0dHJpYnV0ZSB3YXMgYWRkZWQsIHRoaXMgaXMgdGhlIHZhbHVlIG9mIHRoZSAKKyAgICAgICogYXR0cmlidXRlLiBJZiB0aGUgYXR0cmlidXRlIHdhcyByZW1vdmVkLCB0aGlzIGlzIHRoZSB2YWx1ZSBvZiB0aGUgCisgICAgICAqIHJlbW92ZWQgYXR0cmlidXRlLiBJZiB0aGUgYXR0cmlidXRlIHdhcyByZXBsYWNlZCwgdGhpcyBpcyB0aGUgb2xkIAorICAgICAgKiB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlLgorICAgICAgKgorICAgICAgKiBAcmV0dXJuCQl0aGUgdmFsdWUgb2YgdGhlIGNoYW5nZWQgcmVxdWVzdCBhdHRyaWJ1dGUKKyAgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMudmFsdWU7ICAgCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVMaXN0ZW5lci5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2OGJiYzUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9TZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZUxpc3RlbmVyLmphdmEKQEAgLTAsMCArMSw0OSBAQAorLyoKKyogQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworcGFja2FnZSBqYXZheC5zZXJ2bGV0OworCitpbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7CisKKyAgICAvKioKKyAgICAgKiBBIFNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlTGlzdGVuZXIgY2FuIGJlIGltcGxlbWVudGVkIGJ5IHRoZQorICAgICAqIGRldmVsb3BlciBpbnRlcmVzdGVkIGluIGJlaW5nIG5vdGlmaWVkIG9mIHJlcXVlc3QgYXR0cmlidXRlCisgICAgICogY2hhbmdlcy4gTm90aWZpY2F0aW9ucyB3aWxsIGJlIGdlbmVyYXRlZCB3aGlsZSB0aGUgcmVxdWVzdAorICAgICAqIGlzIHdpdGhpbiB0aGUgc2NvcGUgb2YgdGhlIHdlYiBhcHBsaWNhdGlvbiBpbiB3aGljaCB0aGUgbGlzdGVuZXIKKyAgICAgKiBpcyByZWdpc3RlcmVkLiBBIHJlcXVlc3QgaXMgZGVmaW5lZCBhcyBjb21pbmcgaW50byBzY29wZSB3aGVuCisgICAgICogaXQgaXMgYWJvdXQgdG8gZW50ZXIgdGhlIGZpcnN0IHNlcnZsZXQgb3IgZmlsdGVyIGluIGVhY2ggd2ViCisgICAgICogYXBwbGljYXRpb24sIGFzIGdvaW5nIG91dCBvZiBzY29wZSB3aGVuIGl0IGV4aXRzIHRoZSBsYXN0IHNlcnZsZXQKKyAgICAgKiBvciB0aGUgZmlyc3QgZmlsdGVyIGluIHRoZSBjaGFpbi4KKyAgICAgKgorICAgICAqIEBzaW5jZSBTZXJ2bGV0IDIuNAorICAgICAqLworCitwdWJsaWMgaW50ZXJmYWNlIFNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlTGlzdGVuZXIgZXh0ZW5kcyBFdmVudExpc3RlbmVyIHsKKyAgICAvKiogTm90aWZpY2F0aW9uIHRoYXQgYSBuZXcgYXR0cmlidXRlIHdhcyBhZGRlZCB0byB0aGUKKyAgICAgKiogc2VydmxldCByZXF1ZXN0LiBDYWxsZWQgYWZ0ZXIgdGhlIGF0dHJpYnV0ZSBpcyBhZGRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhdHRyaWJ1dGVBZGRlZChTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZUV2ZW50IHNyYWUpOworCisgICAgLyoqIE5vdGlmaWNhdGlvbiB0aGF0IGFuIGV4aXN0aW5nIGF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlCisgICAgICoqIHNlcnZsZXQgcmVxdWVzdC4gQ2FsbGVkIGFmdGVyIHRoZSBhdHRyaWJ1dGUgaXMgcmVtb3ZlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhdHRyaWJ1dGVSZW1vdmVkKFNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlRXZlbnQgc3JhZSk7CisKKyAgICAvKiogTm90aWZpY2F0aW9uIHRoYXQgYW4gYXR0cmlidXRlIHdhcyByZXBsYWNlZCBvbiB0aGUKKyAgICAgKiogc2VydmxldCByZXF1ZXN0LiBDYWxsZWQgYWZ0ZXIgdGhlIGF0dHJpYnV0ZSBpcyByZXBsYWNlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhdHRyaWJ1dGVSZXBsYWNlZChTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZUV2ZW50IHNyYWUpOworfQorCmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9TZXJ2bGV0UmVxdWVzdEV2ZW50LmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9TZXJ2bGV0UmVxdWVzdEV2ZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc1YjIxMwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L1NlcnZsZXRSZXF1ZXN0RXZlbnQuamF2YQpAQCAtMCwwICsxLDU1IEBACisvKgorKiBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCitwYWNrYWdlIGphdmF4LnNlcnZsZXQ7CisKKworICAgIC8qKiAKKyAgICAgICogRXZlbnRzIG9mIHRoaXMga2luZCBpbmRpY2F0ZSBsaWZlY3ljbGUKKyAgICAgICogZXZlbnRzIGZvciBhIFNlcnZsZXRSZXF1ZXN0LgorICAgICAgKiBUaGUgc291cmNlIG9mIHRoZSBldmVudAorICAgICAgKiBpcyB0aGUgU2VydmxldENvbnRleHQgb2YgdGhpcyB3ZWIgYXBwbGljYXRpb24uCisgICAgICAqIEBzZWUgU2VydmxldFJlcXVlc3RMaXN0ZW5lcgorICAgICAgKiBAc2luY2UJU2VydmxldCAyLjQKKyAgICAgICovCisKK3B1YmxpYyBjbGFzcyBTZXJ2bGV0UmVxdWVzdEV2ZW50IGV4dGVuZHMgamF2YS51dGlsLkV2ZW50T2JqZWN0IHsgCisgICAgcHJpdmF0ZSBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0OworCisgICAgLyoqIENvbnN0cnVjdCBhIFNlcnZsZXRSZXF1ZXN0RXZlbnQgZm9yIHRoZSBnaXZlbiBTZXJ2bGV0Q29udGV4dAorICAgICAgKiBhbmQgU2VydmxldFJlcXVlc3QuCisgICAgICAqCisgICAgICAqIEBwYXJhbSBzYwkJdGhlIFNlcnZsZXRDb250ZXh0IG9mIHRoZSB3ZWIgYXBwbGljYXRpb24uCisgICAgICAqIEBwYXJhbSByZXF1ZXN0CQl0aGUgU2VydmxldFJlcXVlc3QgdGhhdCBpcyBzZW5kaW5nIHRoZSBldmVudC4KKyAgICAgICovCisgICAgcHVibGljIFNlcnZsZXRSZXF1ZXN0RXZlbnQoU2VydmxldENvbnRleHQgc2MsIFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgc3VwZXIoc2MpOworICAgICAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0OworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgICogUmV0dXJucyB0aGUgU2VydmxldFJlcXVlc3QgdGhhdCBpcyBjaGFuZ2luZy4KKyAgICAgICovCisgICAgcHVibGljIFNlcnZsZXRSZXF1ZXN0IGdldFNlcnZsZXRSZXF1ZXN0ICgpIHsgCisgICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICAqIFJldHVybnMgdGhlIFNlcnZsZXRDb250ZXh0IG9mIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorICAgICAgKi8KKyAgICBwdWJsaWMgU2VydmxldENvbnRleHQgZ2V0U2VydmxldENvbnRleHQgKCkgeyAKKyAgICAgICAgcmV0dXJuIChTZXJ2bGV0Q29udGV4dCkgc3VwZXIuZ2V0U291cmNlKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvU2VydmxldFJlcXVlc3RMaXN0ZW5lci5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvU2VydmxldFJlcXVlc3RMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1MThiMTkKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9TZXJ2bGV0UmVxdWVzdExpc3RlbmVyLmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyoKKyogQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworcGFja2FnZSBqYXZheC5zZXJ2bGV0OworCitpbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7CisKKyAgICAvKioKKyAgICAgKiBBIFNlcnZsZXRSZXF1ZXN0TGlzdGVuZXIgY2FuIGJlIGltcGxlbWVudGVkIGJ5IHRoZSBkZXZlbG9wZXIKKyAgICAgKiBpbnRlcmVzdGVkIGluIGJlaW5nIG5vdGlmaWVkIG9mIHJlcXVlc3RzIGNvbWluZyBpbiBhbmQgb3V0IG9mCisgICAgICogc2NvcGUgaW4gYSB3ZWIgY29tcG9uZW50LiBBIHJlcXVlc3QgaXMgZGVmaW5lZCBhcyBjb21pbmcgaW50bworICAgICAqIHNjb3BlIHdoZW4gaXQgaXMgYWJvdXQgdG8gZW50ZXIgdGhlIGZpcnN0IHNlcnZsZXQgb3IgZmlsdGVyCisgICAgICogaW4gZWFjaCB3ZWIgYXBwbGljYXRpb24sIGFzIGdvaW5nIG91dCBvZiBzY29wZSB3aGVuIGl0IGV4aXRzCisgICAgICogdGhlIGxhc3Qgc2VydmxldCBvciB0aGUgZmlyc3QgZmlsdGVyIGluIHRoZSBjaGFpbi4KKyAgICAgKgorICAgICAqIEBzaW5jZSBTZXJ2bGV0IDIuNAorICAgICAqLworCisKK3B1YmxpYyBpbnRlcmZhY2UgU2VydmxldFJlcXVlc3RMaXN0ZW5lciBleHRlbmRzIEV2ZW50TGlzdGVuZXIgeworCisgICAgLyoqIFRoZSByZXF1ZXN0IGlzIGFib3V0IHRvIGdvIG91dCBvZiBzY29wZSBvZiB0aGUgd2ViIGFwcGxpY2F0aW9uLiAqLworICAgIHB1YmxpYyB2b2lkIHJlcXVlc3REZXN0cm95ZWQgKCBTZXJ2bGV0UmVxdWVzdEV2ZW50IHNyZSApOworCisgICAgLyoqIFRoZSByZXF1ZXN0IGlzIGFib3V0IHRvIGNvbWUgaW50byBzY29wZSBvZiB0aGUgd2ViIGFwcGxpY2F0aW9uLiAqLworICAgIHB1YmxpYyB2b2lkIHJlcXVlc3RJbml0aWFsaXplZCAoIFNlcnZsZXRSZXF1ZXN0RXZlbnQgc3JlICk7Cit9CmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9TZXJ2bGV0UmVxdWVzdFdyYXBwZXIuamF2YSBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L1NlcnZsZXRSZXF1ZXN0V3JhcHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1ZjIzMmUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9TZXJ2bGV0UmVxdWVzdFdyYXBwZXIuamF2YQpAQCAtMCwwICsxLDQwMCBAQAorLyoKKyogQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworcGFja2FnZSBqYXZheC5zZXJ2bGV0OworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKworCisvKioKKyAqIAorICogUHJvdmlkZXMgYSBjb252ZW5pZW50IGltcGxlbWVudGF0aW9uIG9mIHRoZSBTZXJ2bGV0UmVxdWVzdCBpbnRlcmZhY2UgdGhhdAorICogY2FuIGJlIHN1YmNsYXNzZWQgYnkgZGV2ZWxvcGVycyB3aXNoaW5nIHRvIGFkYXB0IHRoZSByZXF1ZXN0IHRvIGEgU2VydmxldC4KKyAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgV3JhcHBlciBvciBEZWNvcmF0b3IgcGF0dGVybi4gTWV0aG9kcyBkZWZhdWx0IHRvCisgKiBjYWxsaW5nIHRocm91Z2ggdG8gdGhlIHdyYXBwZWQgcmVxdWVzdCBvYmplY3QuCisgICogQHNpbmNlCXYgMi4zCisgKiAKKyAqIAorICoKKyAqIEBzZWUgCWphdmF4LnNlcnZsZXQuU2VydmxldFJlcXVlc3QKKyAqCisgKi8KKworcHVibGljIGNsYXNzIFNlcnZsZXRSZXF1ZXN0V3JhcHBlciBpbXBsZW1lbnRzIFNlcnZsZXRSZXF1ZXN0IHsKKyAgICBwcml2YXRlIFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3Q7CisKKwkvKioKKwkqIENyZWF0ZXMgYSBTZXJ2bGV0UmVxdWVzdCBhZGFwdG9yIHdyYXBwaW5nIHRoZSBnaXZlbiByZXF1ZXN0IG9iamVjdC4gCisJKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHJlcXVlc3QgaXMgbnVsbAorCSovCisKKyAgICBwdWJsaWMgU2VydmxldFJlcXVlc3RXcmFwcGVyKFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKwlpZiAocmVxdWVzdCA9PSBudWxsKSB7CisJICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlcXVlc3QgY2Fubm90IGJlIG51bGwiKTsgICAKKwl9CisJdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDsKKyAgICB9CisKKwkvKioKKwkqIFJldHVybiB0aGUgd3JhcHBlZCByZXF1ZXN0IG9iamVjdC4KKwkqLworCXB1YmxpYyBTZXJ2bGV0UmVxdWVzdCBnZXRSZXF1ZXN0KCkgeworCQlyZXR1cm4gdGhpcy5yZXF1ZXN0OworCX0KKwkKKwkvKioKKwkqIFNldHMgdGhlIHJlcXVlc3Qgb2JqZWN0IGJlaW5nIHdyYXBwZWQuIAorCSogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSByZXF1ZXN0IGlzIG51bGwuCisJKi8KKwkKKwlwdWJsaWMgdm9pZCBzZXRSZXF1ZXN0KFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKwkgICAgaWYgKHJlcXVlc3QgPT0gbnVsbCkgeworCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZXF1ZXN0IGNhbm5vdCBiZSBudWxsIik7CisJICAgIH0KKwkgICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDsKKwl9CisKKyAgICAvKioKKyAgICAgKgorICAgICAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoaXMgbWV0aG9kIGlzIHRvIGNhbGwgZ2V0QXR0cmlidXRlKFN0cmluZyBuYW1lKQorICAgICAqIG9uIHRoZSB3cmFwcGVkIHJlcXVlc3Qgb2JqZWN0LgorICAgICAqLworCisgICAgcHVibGljIE9iamVjdCBnZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHsKKwlyZXR1cm4gdGhpcy5yZXF1ZXN0LmdldEF0dHJpYnV0ZShuYW1lKTsKKwl9CisgICAgCisgICAgCisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBpcyB0byByZXR1cm4gZ2V0QXR0cmlidXRlTmFtZXMoKQorICAgICAqIG9uIHRoZSB3cmFwcGVkIHJlcXVlc3Qgb2JqZWN0LgorICAgICAqLworCisgICAgcHVibGljIEVudW1lcmF0aW9uIGdldEF0dHJpYnV0ZU5hbWVzKCkgeworCXJldHVybiB0aGlzLnJlcXVlc3QuZ2V0QXR0cmlidXRlTmFtZXMoKTsKKwl9ICAgIAorICAgIAorICAgIAorICAgIAorICAgIC8qKgorICAgICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBpcyB0byByZXR1cm4gZ2V0Q2hhcmFjdGVyRW5jb2RpbmcoKQorICAgICAqIG9uIHRoZSB3cmFwcGVkIHJlcXVlc3Qgb2JqZWN0LgorICAgICAqLworCisgICAgcHVibGljIFN0cmluZyBnZXRDaGFyYWN0ZXJFbmNvZGluZygpIHsKKwlyZXR1cm4gdGhpcy5yZXF1ZXN0LmdldENoYXJhY3RlckVuY29kaW5nKCk7CisJfQorCQorICAgIC8qKgorICAgICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBpcyB0byBzZXQgdGhlIGNoYXJhY3RlciBlbmNvZGluZworICAgICAqIG9uIHRoZSB3cmFwcGVkIHJlcXVlc3Qgb2JqZWN0LgorICAgICAqLworCisgICAgcHVibGljIHZvaWQgc2V0Q2hhcmFjdGVyRW5jb2RpbmcoU3RyaW5nIGVuYykgdGhyb3dzIGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7CisJdGhpcy5yZXF1ZXN0LnNldENoYXJhY3RlckVuY29kaW5nKGVuYyk7CisJfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBpcyB0byByZXR1cm4gZ2V0Q29udGVudExlbmd0aCgpCisgICAgICogb24gdGhlIHdyYXBwZWQgcmVxdWVzdCBvYmplY3QuCisgICAgICovCisKKyAgICBwdWJsaWMgaW50IGdldENvbnRlbnRMZW5ndGgoKSB7CisJcmV0dXJuIHRoaXMucmVxdWVzdC5nZXRDb250ZW50TGVuZ3RoKCk7CisgICAgfQorICAgIAorICAgIAorICAgIAorCisgICAgICAgLyoqCisgICAgICAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoaXMgbWV0aG9kIGlzIHRvIHJldHVybiBnZXRDb250ZW50VHlwZSgpCisgICAgICogb24gdGhlIHdyYXBwZWQgcmVxdWVzdCBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZSgpIHsKKwlyZXR1cm4gdGhpcy5yZXF1ZXN0LmdldENvbnRlbnRUeXBlKCk7CisgICAgfQorICAgIAorICAgIAorICAgIAorCisgICAgIC8qKgorICAgICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBpcyB0byByZXR1cm4gZ2V0SW5wdXRTdHJlYW0oKQorICAgICAqIG9uIHRoZSB3cmFwcGVkIHJlcXVlc3Qgb2JqZWN0LgorICAgICAqLworCisgICAgcHVibGljIFNlcnZsZXRJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcmV0dXJuIHRoaXMucmVxdWVzdC5nZXRJbnB1dFN0cmVhbSgpOworCX0KKyAgICAgCisgICAgCisgICAgCisKKyAgICAvKioKKyAgICAgICogVGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgdGhpcyBtZXRob2QgaXMgdG8gcmV0dXJuIGdldFBhcmFtZXRlcihTdHJpbmcgbmFtZSkKKyAgICAgKiBvbiB0aGUgd3JhcHBlZCByZXF1ZXN0IG9iamVjdC4KKyAgICAgKi8KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFyYW1ldGVyKFN0cmluZyBuYW1lKSB7CisJcmV0dXJuIHRoaXMucmVxdWVzdC5nZXRQYXJhbWV0ZXIobmFtZSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBpcyB0byByZXR1cm4gZ2V0UGFyYW1ldGVyTWFwKCkKKyAgICAgKiBvbiB0aGUgd3JhcHBlZCByZXF1ZXN0IG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWFwIGdldFBhcmFtZXRlck1hcCgpIHsKKwlyZXR1cm4gdGhpcy5yZXF1ZXN0LmdldFBhcmFtZXRlck1hcCgpOworICAgIH0KKyAgICAKKyAgICAKKyAgICAKKworICAgIC8qKgorICAgICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBpcyB0byByZXR1cm4gZ2V0UGFyYW1ldGVyTmFtZXMoKQorICAgICAqIG9uIHRoZSB3cmFwcGVkIHJlcXVlc3Qgb2JqZWN0LgorICAgICAqLworICAgICAKKyAgICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0UGFyYW1ldGVyTmFtZXMoKSB7CisJcmV0dXJuIHRoaXMucmVxdWVzdC5nZXRQYXJhbWV0ZXJOYW1lcygpOworICAgIH0KKyAgICAKKyAgICAKKyAgICAKKworICAgICAgIC8qKgorICAgICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBpcyB0byByZXR1cm4gZ2V0UGFyYW1ldGVyVmFsdWVzKFN0cmluZyBuYW1lKQorICAgICAqIG9uIHRoZSB3cmFwcGVkIHJlcXVlc3Qgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRQYXJhbWV0ZXJWYWx1ZXMoU3RyaW5nIG5hbWUpIHsKKwlyZXR1cm4gdGhpcy5yZXF1ZXN0LmdldFBhcmFtZXRlclZhbHVlcyhuYW1lKTsKKwl9CisgICAgCisgICAgCisgICAgCisKKyAgICAgLyoqCisgICAgICAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoaXMgbWV0aG9kIGlzIHRvIHJldHVybiBnZXRQcm90b2NvbCgpCisgICAgICogb24gdGhlIHdyYXBwZWQgcmVxdWVzdCBvYmplY3QuCisgICAgICovCisgICAgCisgICAgcHVibGljIFN0cmluZyBnZXRQcm90b2NvbCgpIHsKKwlyZXR1cm4gdGhpcy5yZXF1ZXN0LmdldFByb3RvY29sKCk7CisJfQorICAgIAorICAgIAorICAgIAorCisgICAgLyoqCisgICAgICAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoaXMgbWV0aG9kIGlzIHRvIHJldHVybiBnZXRTY2hlbWUoKQorICAgICAqIG9uIHRoZSB3cmFwcGVkIHJlcXVlc3Qgb2JqZWN0LgorICAgICAqLworICAgIAorCisgICAgcHVibGljIFN0cmluZyBnZXRTY2hlbWUoKSB7CisJcmV0dXJuIHRoaXMucmVxdWVzdC5nZXRTY2hlbWUoKTsKKwl9CisgICAgCisgICAgCisgICAgCisKKyAgICAvKioKKyAgICAgICogVGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgdGhpcyBtZXRob2QgaXMgdG8gcmV0dXJuIGdldFNlcnZlck5hbWUoKQorICAgICAqIG9uIHRoZSB3cmFwcGVkIHJlcXVlc3Qgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmVyTmFtZSgpIHsKKwlyZXR1cm4gdGhpcy5yZXF1ZXN0LmdldFNlcnZlck5hbWUoKTsKKwl9CisgICAgCisgICAgCisgICAgCisKKyAgIC8qKgorICAgICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBpcyB0byByZXR1cm4gZ2V0U2VydmVyUG9ydCgpCisgICAgICogb24gdGhlIHdyYXBwZWQgcmVxdWVzdCBvYmplY3QuCisgICAgICovCisKKyAgICBwdWJsaWMgaW50IGdldFNlcnZlclBvcnQoKSB7CisJcmV0dXJuIHRoaXMucmVxdWVzdC5nZXRTZXJ2ZXJQb3J0KCk7CisJfQorICAgIAorICAgIAorICAgIAorICAvKioKKyAgICAgICogVGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgdGhpcyBtZXRob2QgaXMgdG8gcmV0dXJuIGdldFJlYWRlcigpCisgICAgICogb24gdGhlIHdyYXBwZWQgcmVxdWVzdCBvYmplY3QuCisgICAgICovCisKKyAgICBwdWJsaWMgQnVmZmVyZWRSZWFkZXIgZ2V0UmVhZGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlyZXR1cm4gdGhpcy5yZXF1ZXN0LmdldFJlYWRlcigpOworCX0KKyAgICAKKyAgICAKKyAgICAKKworICAgIC8qKgorICAgICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBpcyB0byByZXR1cm4gZ2V0UmVtb3RlQWRkcigpCisgICAgICogb24gdGhlIHdyYXBwZWQgcmVxdWVzdCBvYmplY3QuCisgICAgICovCisgICAgCisgICAgcHVibGljIFN0cmluZyBnZXRSZW1vdGVBZGRyKCkgeworCXJldHVybiB0aGlzLnJlcXVlc3QuZ2V0UmVtb3RlQWRkcigpOworICAgIH0KKyAgICAKKyAgICAKKyAgICAKKworICAgICAgLyoqCisgICAgICAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoaXMgbWV0aG9kIGlzIHRvIHJldHVybiBnZXRSZW1vdGVIb3N0KCkKKyAgICAgKiBvbiB0aGUgd3JhcHBlZCByZXF1ZXN0IG9iamVjdC4KKyAgICAgKi8KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVtb3RlSG9zdCgpIHsKKwlyZXR1cm4gdGhpcy5yZXF1ZXN0LmdldFJlbW90ZUhvc3QoKTsKKyAgICB9CisgICAgCisgICAgCisgICAgCisKKyAgICAvKioKKyAgICAgICogVGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgdGhpcyBtZXRob2QgaXMgdG8gcmV0dXJuIHNldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgT2JqZWN0IG8pCisgICAgICogb24gdGhlIHdyYXBwZWQgcmVxdWVzdCBvYmplY3QuCisgICAgICovCisKKyAgICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIE9iamVjdCBvKSB7CisJdGhpcy5yZXF1ZXN0LnNldEF0dHJpYnV0ZShuYW1lLCBvKTsKKyAgICB9CisgICAgCisgICAgCisgICAgCisKKyAgICAvKioKKyAgICAgICogVGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgdGhpcyBtZXRob2QgaXMgdG8gY2FsbCByZW1vdmVBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpCisgICAgICogb24gdGhlIHdyYXBwZWQgcmVxdWVzdCBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlQXR0cmlidXRlKFN0cmluZyBuYW1lKSB7CisJdGhpcy5yZXF1ZXN0LnJlbW92ZUF0dHJpYnV0ZShuYW1lKTsKKyAgICB9CisgICAgCisgICAgCisgICAgCisKKyAgIC8qKgorICAgICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBpcyB0byByZXR1cm4gZ2V0TG9jYWxlKCkKKyAgICAgKiBvbiB0aGUgd3JhcHBlZCByZXF1ZXN0IG9iamVjdC4KKyAgICAgKi8KKworICAgIHB1YmxpYyBMb2NhbGUgZ2V0TG9jYWxlKCkgeworCXJldHVybiB0aGlzLnJlcXVlc3QuZ2V0TG9jYWxlKCk7CisgICAgfQorICAgIAorICAgIAorICAgIAorCisgICAgIC8qKgorICAgICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBpcyB0byByZXR1cm4gZ2V0TG9jYWxlcygpCisgICAgICogb24gdGhlIHdyYXBwZWQgcmVxdWVzdCBvYmplY3QuCisgICAgICovCisKKyAgICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0TG9jYWxlcygpIHsKKwlyZXR1cm4gdGhpcy5yZXF1ZXN0LmdldExvY2FsZXMoKTsKKyAgICB9CisgICAgCisgICAgCisgICAgCisKKyAgICAvKioKKyAgICAgICogVGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgdGhpcyBtZXRob2QgaXMgdG8gcmV0dXJuIGlzU2VjdXJlKCkKKyAgICAgKiBvbiB0aGUgd3JhcHBlZCByZXF1ZXN0IG9iamVjdC4KKyAgICAgKi8KKworICAgIHB1YmxpYyBib29sZWFuIGlzU2VjdXJlKCkgeworCXJldHVybiB0aGlzLnJlcXVlc3QuaXNTZWN1cmUoKTsKKyAgICB9CisgICAgCisgICAgCisgICAgCisKKyAgICAvKioKKyAgICAgICogVGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgdGhpcyBtZXRob2QgaXMgdG8gcmV0dXJuIGdldFJlcXVlc3REaXNwYXRjaGVyKFN0cmluZyBwYXRoKQorICAgICAqIG9uIHRoZSB3cmFwcGVkIHJlcXVlc3Qgb2JqZWN0LgorICAgICAqLworCisgICAgcHVibGljIFJlcXVlc3REaXNwYXRjaGVyIGdldFJlcXVlc3REaXNwYXRjaGVyKFN0cmluZyBwYXRoKSB7CisJcmV0dXJuIHRoaXMucmVxdWVzdC5nZXRSZXF1ZXN0RGlzcGF0Y2hlcihwYXRoKTsKKyAgICB9CisgICAgCisgICAgCisgICAgCisKKyAgICAvKioKKyAgICAgICogVGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgdGhpcyBtZXRob2QgaXMgdG8gcmV0dXJuIGdldFJlYWxQYXRoKFN0cmluZyBwYXRoKQorICAgICAqIG9uIHRoZSB3cmFwcGVkIHJlcXVlc3Qgb2JqZWN0LgorICAgICAqLworCisgICAgcHVibGljIFN0cmluZyBnZXRSZWFsUGF0aChTdHJpbmcgcGF0aCkgeworCXJldHVybiB0aGlzLnJlcXVlc3QuZ2V0UmVhbFBhdGgocGF0aCk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoaXMgbWV0aG9kIGlzIHRvIHJldHVybgorICAgICAqIGdldFJlbW90ZVBvcnQoKSBvbiB0aGUgd3JhcHBlZCByZXF1ZXN0IG9iamVjdC4KKyAgICAgKgorICAgICAqIEBzaW5jZSAyLjQKKyAgICAgKi8gICAgCisgICAgcHVibGljIGludCBnZXRSZW1vdGVQb3J0KCl7CisgICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3QuZ2V0UmVtb3RlUG9ydCgpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgdGhpcyBtZXRob2QgaXMgdG8gcmV0dXJuCisgICAgICogZ2V0TG9jYWxOYW1lKCkgb24gdGhlIHdyYXBwZWQgcmVxdWVzdCBvYmplY3QuCisgICAgICoKKyAgICAgKiBAc2luY2UgMi40CisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRMb2NhbE5hbWUoKXsKKyAgICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdC5nZXRMb2NhbE5hbWUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBpcyB0byByZXR1cm4KKyAgICAgKiBnZXRMb2NhbEFkZHIoKSBvbiB0aGUgd3JhcHBlZCByZXF1ZXN0IG9iamVjdC4KKyAgICAgKgorICAgICAqIEBzaW5jZSAyLjQKKyAgICAgKi8gICAgICAgCisgICAgcHVibGljIFN0cmluZyBnZXRMb2NhbEFkZHIoKXsKKyAgICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdC5nZXRMb2NhbEFkZHIoKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoaXMgbWV0aG9kIGlzIHRvIHJldHVybgorICAgICAqIGdldExvY2FsUG9ydCgpIG9uIHRoZSB3cmFwcGVkIHJlcXVlc3Qgb2JqZWN0LgorICAgICAqCisgICAgICogQHNpbmNlIDIuNAorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0TG9jYWxQb3J0KCl7CisgICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3QuZ2V0TG9jYWxQb3J0KCk7CisgICAgfQorICAgIAorfQorCmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9TZXJ2bGV0UmVzcG9uc2UuamF2YSBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L1NlcnZsZXRSZXNwb25zZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3MGQ5YTAKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9TZXJ2bGV0UmVzcG9uc2UuamF2YQpAQCAtMCwwICsxLDQ1MiBAQAorLyoKKyogQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworcGFja2FnZSBqYXZheC5zZXJ2bGV0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CisKKworLyoqCisgKiBEZWZpbmVzIGFuIG9iamVjdCB0byBhc3Npc3QgYSBzZXJ2bGV0IGluIHNlbmRpbmcgYSByZXNwb25zZSB0byB0aGUgY2xpZW50LgorICogVGhlIHNlcnZsZXQgY29udGFpbmVyIGNyZWF0ZXMgYSA8Y29kZT5TZXJ2bGV0UmVzcG9uc2U8L2NvZGU+IG9iamVjdCBhbmQKKyAqIHBhc3NlcyBpdCBhcyBhbiBhcmd1bWVudCB0byB0aGUgc2VydmxldCdzIDxjb2RlPnNlcnZpY2U8L2NvZGU+IG1ldGhvZC4KKyAqCisgKiA8cD5UbyBzZW5kIGJpbmFyeSBkYXRhIGluIGEgTUlNRSBib2R5IHJlc3BvbnNlLCB1c2UKKyAqIHRoZSB7QGxpbmsgU2VydmxldE91dHB1dFN0cmVhbX0gcmV0dXJuZWQgYnkge0BsaW5rICNnZXRPdXRwdXRTdHJlYW19LgorICogVG8gc2VuZCBjaGFyYWN0ZXIgZGF0YSwgdXNlIHRoZSA8Y29kZT5QcmludFdyaXRlcjwvY29kZT4gb2JqZWN0IAorICogcmV0dXJuZWQgYnkge0BsaW5rICNnZXRXcml0ZXJ9LiBUbyBtaXggYmluYXJ5IGFuZCB0ZXh0IGRhdGEsCisgKiBmb3IgZXhhbXBsZSwgdG8gY3JlYXRlIGEgbXVsdGlwYXJ0IHJlc3BvbnNlLCB1c2UgYQorICogPGNvZGU+U2VydmxldE91dHB1dFN0cmVhbTwvY29kZT4gYW5kIG1hbmFnZSB0aGUgY2hhcmFjdGVyIHNlY3Rpb25zCisgKiBtYW51YWxseS4KKyAqCisgKiA8cD5UaGUgY2hhcnNldCBmb3IgdGhlIE1JTUUgYm9keSByZXNwb25zZSBjYW4gYmUgc3BlY2lmaWVkCisgKiBleHBsaWNpdGx5IHVzaW5nIHRoZSB7QGxpbmsgI3NldENoYXJhY3RlckVuY29kaW5nfSBhbmQKKyAqIHtAbGluayAjc2V0Q29udGVudFR5cGV9IG1ldGhvZHMsIG9yIGltcGxpY2l0bHkKKyAqIHVzaW5nIHRoZSB7QGxpbmsgI3NldExvY2FsZX0gbWV0aG9kLgorICogRXhwbGljaXQgc3BlY2lmaWNhdGlvbnMgdGFrZSBwcmVjZWRlbmNlIG92ZXIKKyAqIGltcGxpY2l0IHNwZWNpZmljYXRpb25zLiBJZiBubyBjaGFyc2V0IGlzIHNwZWNpZmllZCwgSVNPLTg4NTktMSB3aWxsIGJlCisgKiB1c2VkLiBUaGUgPGNvZGU+c2V0Q2hhcmFjdGVyRW5jb2Rpbmc8L2NvZGU+LAorICogPGNvZGU+c2V0Q29udGVudFR5cGU8L2NvZGU+LCBvciA8Y29kZT5zZXRMb2NhbGU8L2NvZGU+IG1ldGhvZCBtdXN0CisgKiBiZSBjYWxsZWQgYmVmb3JlIDxjb2RlPmdldFdyaXRlcjwvY29kZT4gYW5kIGJlZm9yZSBjb21taXR0aW5nCisgKiB0aGUgcmVzcG9uc2UgZm9yIHRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcgdG8gYmUgdXNlZC4KKyAqIAorICogPHA+U2VlIHRoZSBJbnRlcm5ldCBSRkNzIHN1Y2ggYXMgCisgKiA8YSBocmVmPSJodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMyMDQ1LnR4dCI+CisgKiBSRkMgMjA0NTwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gTUlNRS4gUHJvdG9jb2xzIHN1Y2ggYXMgU01UUAorICogYW5kIEhUVFAgZGVmaW5lIHByb2ZpbGVzIG9mIE1JTUUsIGFuZCB0aG9zZSBzdGFuZGFyZHMKKyAqIGFyZSBzdGlsbCBldm9sdmluZy4KKyAqCisgKiBAYXV0aG9yIAlWYXJpb3VzCisgKiBAdmVyc2lvbiAJJFZlcnNpb24kCisgKgorICogQHNlZQkJU2VydmxldE91dHB1dFN0cmVhbQorICoKKyAqLworIAorcHVibGljIGludGVyZmFjZSBTZXJ2bGV0UmVzcG9uc2UgeworCisKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcgKE1JTUUgY2hhcnNldCkKKyAgICAgKiB1c2VkIGZvciB0aGUgYm9keSBzZW50IGluIHRoaXMgcmVzcG9uc2UuCisgICAgICogVGhlIGNoYXJhY3RlciBlbmNvZGluZyBtYXkgaGF2ZSBiZWVuIHNwZWNpZmllZCBleHBsaWNpdGx5CisgICAgICogdXNpbmcgdGhlIHtAbGluayAjc2V0Q2hhcmFjdGVyRW5jb2Rpbmd9IG9yCisgICAgICoge0BsaW5rICNzZXRDb250ZW50VHlwZX0gbWV0aG9kcywgb3IgaW1wbGljaXRseSB1c2luZyB0aGUKKyAgICAgKiB7QGxpbmsgI3NldExvY2FsZX0gbWV0aG9kLiBFeHBsaWNpdCBzcGVjaWZpY2F0aW9ucyB0YWtlCisgICAgICogcHJlY2VkZW5jZSBvdmVyIGltcGxpY2l0IHNwZWNpZmljYXRpb25zLiBDYWxscyBtYWRlCisgICAgICogdG8gdGhlc2UgbWV0aG9kcyBhZnRlciA8Y29kZT5nZXRXcml0ZXI8L2NvZGU+IGhhcyBiZWVuCisgICAgICogY2FsbGVkIG9yIGFmdGVyIHRoZSByZXNwb25zZSBoYXMgYmVlbiBjb21taXR0ZWQgaGF2ZSBubworICAgICAqIGVmZmVjdCBvbiB0aGUgY2hhcmFjdGVyIGVuY29kaW5nLiBJZiBubyBjaGFyYWN0ZXIgZW5jb2RpbmcKKyAgICAgKiBoYXMgYmVlbiBzcGVjaWZpZWQsIDxjb2RlPklTTy04ODU5LTE8L2NvZGU+IGlzIHJldHVybmVkLgorICAgICAqIDxwPlNlZSBSRkMgMjA0NyAoaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMjA0Ny50eHQpCisgICAgICogZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgY2hhcmFjdGVyIGVuY29kaW5nIGFuZCBNSU1FLgorICAgICAqCisgICAgICogQHJldHVybgkJYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHNwZWNpZnlpbmcgdGhlCisgICAgICoJCQluYW1lIG9mIHRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcsIGZvcgorICAgICAqCQkJZXhhbXBsZSwgPGNvZGU+VVRGLTg8L2NvZGU+CisgICAgICoKKyAgICAgKi8KKyAgCisgICAgcHVibGljIFN0cmluZyBnZXRDaGFyYWN0ZXJFbmNvZGluZygpOworICAgIAorICAgIAorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY29udGVudCB0eXBlIHVzZWQgZm9yIHRoZSBNSU1FIGJvZHkKKyAgICAgKiBzZW50IGluIHRoaXMgcmVzcG9uc2UuIFRoZSBjb250ZW50IHR5cGUgcHJvcGVyIG11c3QKKyAgICAgKiBoYXZlIGJlZW4gc3BlY2lmaWVkIHVzaW5nIHtAbGluayAjc2V0Q29udGVudFR5cGV9CisgICAgICogYmVmb3JlIHRoZSByZXNwb25zZSBpcyBjb21taXR0ZWQuIElmIG5vIGNvbnRlbnQgdHlwZQorICAgICAqIGhhcyBiZWVuIHNwZWNpZmllZCwgdGhpcyBtZXRob2QgcmV0dXJucyBudWxsLgorICAgICAqIElmIGEgY29udGVudCB0eXBlIGhhcyBiZWVuIHNwZWNpZmllZCBhbmQgYQorICAgICAqIGNoYXJhY3RlciBlbmNvZGluZyBoYXMgYmVlbiBleHBsaWNpdGx5IG9yIGltcGxpY2l0bHkKKyAgICAgKiBzcGVjaWZpZWQgYXMgZGVzY3JpYmVkIGluIHtAbGluayAjZ2V0Q2hhcmFjdGVyRW5jb2Rpbmd9LAorICAgICAqIHRoZSBjaGFyc2V0IHBhcmFtZXRlciBpcyBpbmNsdWRlZCBpbiB0aGUgc3RyaW5nIHJldHVybmVkLgorICAgICAqIElmIG5vIGNoYXJhY3RlciBlbmNvZGluZyBoYXMgYmVlbiBzcGVjaWZpZWQsIHRoZQorICAgICAqIGNoYXJzZXQgcGFyYW1ldGVyIGlzIG9taXR0ZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCQlhIDxjb2RlPlN0cmluZzwvY29kZT4gc3BlY2lmeWluZyB0aGUKKyAgICAgKgkJCWNvbnRlbnQgdHlwZSwgZm9yIGV4YW1wbGUsCisgICAgICoJCQk8Y29kZT50ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTg8L2NvZGU+LAorICAgICAqCQkJb3IgbnVsbAorICAgICAqCisgICAgICogQHNpbmNlIDIuNAorICAgICAqLworICAKKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRUeXBlKCk7CisgICAgCisgICAgCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEge0BsaW5rIFNlcnZsZXRPdXRwdXRTdHJlYW19IHN1aXRhYmxlIGZvciB3cml0aW5nIGJpbmFyeSAKKyAgICAgKiBkYXRhIGluIHRoZSByZXNwb25zZS4gVGhlIHNlcnZsZXQgY29udGFpbmVyIGRvZXMgbm90IGVuY29kZSB0aGUKKyAgICAgKiBiaW5hcnkgZGF0YS4gIAorICAgICAKKyAgICAgKiA8cD4gQ2FsbGluZyBmbHVzaCgpIG9uIHRoZSBTZXJ2bGV0T3V0cHV0U3RyZWFtIGNvbW1pdHMgdGhlIHJlc3BvbnNlLgorICAgICAKKyAgICAgKiBFaXRoZXIgdGhpcyBtZXRob2Qgb3Ige0BsaW5rICNnZXRXcml0ZXJ9IG1heSAKKyAgICAgKiBiZSBjYWxsZWQgdG8gd3JpdGUgdGhlIGJvZHksIG5vdCBib3RoLgorICAgICAqCisgICAgICogQHJldHVybgkJCQlhIHtAbGluayBTZXJ2bGV0T3V0cHV0U3RyZWFtfSBmb3Igd3JpdGluZyBiaW5hcnkgZGF0YQkKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSA8Y29kZT5nZXRXcml0ZXI8L2NvZGU+IG1ldGhvZAorICAgICAqIAkJCQkJaGFzIGJlZW4gY2FsbGVkIG9uIHRoaXMgcmVzcG9uc2UKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gCQlpZiBhbiBpbnB1dCBvciBvdXRwdXQgZXhjZXB0aW9uIG9jY3VycmVkCisgICAgICoKKyAgICAgKiBAc2VlIAkJCQkjZ2V0V3JpdGVyCisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyBTZXJ2bGV0T3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbjsKKyAgICAKKyAgICAKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSA8Y29kZT5QcmludFdyaXRlcjwvY29kZT4gb2JqZWN0IHRoYXQKKyAgICAgKiBjYW4gc2VuZCBjaGFyYWN0ZXIgdGV4dCB0byB0aGUgY2xpZW50LgorICAgICAqIFRoZSA8Y29kZT5QcmludFdyaXRlcjwvY29kZT4gdXNlcyB0aGUgY2hhcmFjdGVyCisgICAgICogZW5jb2RpbmcgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRDaGFyYWN0ZXJFbmNvZGluZ30uCisgICAgICogSWYgdGhlIHJlc3BvbnNlJ3MgY2hhcmFjdGVyIGVuY29kaW5nIGhhcyBub3QgYmVlbgorICAgICAqIHNwZWNpZmllZCBhcyBkZXNjcmliZWQgaW4gPGNvZGU+Z2V0Q2hhcmFjdGVyRW5jb2Rpbmc8L2NvZGU+CisgICAgICogKGkuZS4sIHRoZSBtZXRob2QganVzdCByZXR1cm5zIHRoZSBkZWZhdWx0IHZhbHVlIAorICAgICAqIDxjb2RlPklTTy04ODU5LTE8L2NvZGU+KSwgPGNvZGU+Z2V0V3JpdGVyPC9jb2RlPgorICAgICAqIHVwZGF0ZXMgaXQgdG8gPGNvZGU+SVNPLTg4NTktMTwvY29kZT4uCisgICAgICogPHA+Q2FsbGluZyBmbHVzaCgpIG9uIHRoZSA8Y29kZT5QcmludFdyaXRlcjwvY29kZT4KKyAgICAgKiBjb21taXRzIHRoZSByZXNwb25zZS4KKyAgICAgKiA8cD5FaXRoZXIgdGhpcyBtZXRob2Qgb3Ige0BsaW5rICNnZXRPdXRwdXRTdHJlYW19IG1heSBiZSBjYWxsZWQKKyAgICAgKiB0byB3cml0ZSB0aGUgYm9keSwgbm90IGJvdGguCisgICAgICoKKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIAkJYSA8Y29kZT5QcmludFdyaXRlcjwvY29kZT4gb2JqZWN0IHRoYXQgCisgICAgICoJCQljYW4gcmV0dXJuIGNoYXJhY3RlciBkYXRhIHRvIHRoZSBjbGllbnQgCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24KKyAgICAgKgkJCWlmIHRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcgcmV0dXJuZWQKKyAgICAgKgkJCWJ5IDxjb2RlPmdldENoYXJhY3RlckVuY29kaW5nPC9jb2RlPiBjYW5ub3QgYmUgdXNlZAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgKgkJCWlmIHRoZSA8Y29kZT5nZXRPdXRwdXRTdHJlYW08L2NvZGU+CisgICAgICogCQkJbWV0aG9kIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkIGZvciB0aGlzIAorICAgICAqCQkJcmVzcG9uc2Ugb2JqZWN0CisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uCisgICAgICoJCQlpZiBhbiBpbnB1dCBvciBvdXRwdXQgZXhjZXB0aW9uIG9jY3VycmVkCisgICAgICoKKyAgICAgKiBAc2VlIAkJI2dldE91dHB1dFN0cmVhbQorICAgICAqIEBzZWUgCQkjc2V0Q2hhcmFjdGVyRW5jb2RpbmcKKyAgICAgKgorICAgICAqLworCisgICAgcHVibGljIFByaW50V3JpdGVyIGdldFdyaXRlcigpIHRocm93cyBJT0V4Y2VwdGlvbjsKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcgKE1JTUUgY2hhcnNldCkgb2YgdGhlIHJlc3BvbnNlCisgICAgICogYmVpbmcgc2VudCB0byB0aGUgY2xpZW50LCBmb3IgZXhhbXBsZSwgdG8gVVRGLTguCisgICAgICogSWYgdGhlIGNoYXJhY3RlciBlbmNvZGluZyBoYXMgYWxyZWFkeSBiZWVuIHNldCBieQorICAgICAqIHtAbGluayAjc2V0Q29udGVudFR5cGV9IG9yIHtAbGluayAjc2V0TG9jYWxlfSwKKyAgICAgKiB0aGlzIG1ldGhvZCBvdmVycmlkZXMgaXQuCisgICAgICogQ2FsbGluZyB7QGxpbmsgI3NldENvbnRlbnRUeXBlfSB3aXRoIHRoZSA8Y29kZT5TdHJpbmc8L2NvZGU+CisgICAgICogb2YgPGNvZGU+dGV4dC9odG1sPC9jb2RlPiBhbmQgY2FsbGluZworICAgICAqIHRoaXMgbWV0aG9kIHdpdGggdGhlIDxjb2RlPlN0cmluZzwvY29kZT4gb2YgPGNvZGU+VVRGLTg8L2NvZGU+CisgICAgICogaXMgZXF1aXZhbGVudCB3aXRoIGNhbGxpbmcKKyAgICAgKiA8Y29kZT5zZXRDb250ZW50VHlwZTwvY29kZT4gd2l0aCB0aGUgPGNvZGU+U3RyaW5nPC9jb2RlPiBvZgorICAgICAqIDxjb2RlPnRleHQvaHRtbDsgY2hhcnNldD1VVEYtODwvY29kZT4uCisgICAgICogPHA+VGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCByZXBlYXRlZGx5IHRvIGNoYW5nZSB0aGUgY2hhcmFjdGVyCisgICAgICogZW5jb2RpbmcuCisgICAgICogVGhpcyBtZXRob2QgaGFzIG5vIGVmZmVjdCBpZiBpdCBpcyBjYWxsZWQgYWZ0ZXIKKyAgICAgKiA8Y29kZT5nZXRXcml0ZXI8L2NvZGU+IGhhcyBiZWVuCisgICAgICogY2FsbGVkIG9yIGFmdGVyIHRoZSByZXNwb25zZSBoYXMgYmVlbiBjb21taXR0ZWQuCisgICAgICogPHA+Q29udGFpbmVycyBtdXN0IGNvbW11bmljYXRlIHRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcgdXNlZCBmb3IKKyAgICAgKiB0aGUgc2VydmxldCByZXNwb25zZSdzIHdyaXRlciB0byB0aGUgY2xpZW50IGlmIHRoZSBwcm90b2NvbAorICAgICAqIHByb3ZpZGVzIGEgd2F5IGZvciBkb2luZyBzby4gSW4gdGhlIGNhc2Ugb2YgSFRUUCwgdGhlIGNoYXJhY3RlcgorICAgICAqIGVuY29kaW5nIGlzIGNvbW11bmljYXRlZCBhcyBwYXJ0IG9mIHRoZSA8Y29kZT5Db250ZW50LVR5cGU8L2NvZGU+CisgICAgICogaGVhZGVyIGZvciB0ZXh0IG1lZGlhIHR5cGVzLiBOb3RlIHRoYXQgdGhlIGNoYXJhY3RlciBlbmNvZGluZworICAgICAqIGNhbm5vdCBiZSBjb21tdW5pY2F0ZWQgdmlhIEhUVFAgaGVhZGVycyBpZiB0aGUgc2VydmxldCBkb2VzIG5vdAorICAgICAqIHNwZWNpZnkgYSBjb250ZW50IHR5cGU7IGhvd2V2ZXIsIGl0IGlzIHN0aWxsIHVzZWQgdG8gZW5jb2RlIHRleHQKKyAgICAgKiB3cml0dGVuIHZpYSB0aGUgc2VydmxldCByZXNwb25zZSdzIHdyaXRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjaGFyc2V0IAlhIFN0cmluZyBzcGVjaWZ5aW5nIG9ubHkgdGhlIGNoYXJhY3RlciBzZXQKKyAgICAgKiAJCQlkZWZpbmVkIGJ5IElBTkEgQ2hhcmFjdGVyIFNldHMKKyAgICAgKgkJCShodHRwOi8vd3d3LmlhbmEub3JnL2Fzc2lnbm1lbnRzL2NoYXJhY3Rlci1zZXRzKQorICAgICAqCisgICAgICogQHNlZQkJI3NldENvbnRlbnRUeXBlCisgICAgICogCQkJI3NldExvY2FsZQorICAgICAqCisgICAgICogQHNpbmNlIDIuNAorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgdm9pZCBzZXRDaGFyYWN0ZXJFbmNvZGluZyhTdHJpbmcgY2hhcnNldCk7CisgICAgCisgICAgCisKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGxlbmd0aCBvZiB0aGUgY29udGVudCBib2R5IGluIHRoZSByZXNwb25zZQorICAgICAqIEluIEhUVFAgc2VydmxldHMsIHRoaXMgbWV0aG9kIHNldHMgdGhlIEhUVFAgQ29udGVudC1MZW5ndGggaGVhZGVyLgorICAgICAqCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGVuIAlhbiBpbnRlZ2VyIHNwZWNpZnlpbmcgdGhlIGxlbmd0aCBvZiB0aGUgCisgICAgICogCQkJY29udGVudCBiZWluZyByZXR1cm5lZCB0byB0aGUgY2xpZW50OyBzZXRzCisgICAgICoJCQl0aGUgQ29udGVudC1MZW5ndGggaGVhZGVyCisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIHNldENvbnRlbnRMZW5ndGgoaW50IGxlbik7CisgICAgCisgICAgCisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBjb250ZW50IHR5cGUgb2YgdGhlIHJlc3BvbnNlIGJlaW5nIHNlbnQgdG8KKyAgICAgKiB0aGUgY2xpZW50LCBpZiB0aGUgcmVzcG9uc2UgaGFzIG5vdCBiZWVuIGNvbW1pdHRlZCB5ZXQuCisgICAgICogVGhlIGdpdmVuIGNvbnRlbnQgdHlwZSBtYXkgaW5jbHVkZSBhIGNoYXJhY3RlciBlbmNvZGluZworICAgICAqIHNwZWNpZmljYXRpb24sIGZvciBleGFtcGxlLCA8Y29kZT50ZXh0L2h0bWw7Y2hhcnNldD1VVEYtODwvY29kZT4uCisgICAgICogVGhlIHJlc3BvbnNlJ3MgY2hhcmFjdGVyIGVuY29kaW5nIGlzIG9ubHkgc2V0IGZyb20gdGhlIGdpdmVuCisgICAgICogY29udGVudCB0eXBlIGlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBiZWZvcmUgPGNvZGU+Z2V0V3JpdGVyPC9jb2RlPgorICAgICAqIGlzIGNhbGxlZC4KKyAgICAgKiA8cD5UaGlzIG1ldGhvZCBtYXkgYmUgY2FsbGVkIHJlcGVhdGVkbHkgdG8gY2hhbmdlIGNvbnRlbnQgdHlwZSBhbmQKKyAgICAgKiBjaGFyYWN0ZXIgZW5jb2RpbmcuCisgICAgICogVGhpcyBtZXRob2QgaGFzIG5vIGVmZmVjdCBpZiBjYWxsZWQgYWZ0ZXIgdGhlIHJlc3BvbnNlCisgICAgICogaGFzIGJlZW4gY29tbWl0dGVkLiBJdCBkb2VzIG5vdCBzZXQgdGhlIHJlc3BvbnNlJ3MgY2hhcmFjdGVyCisgICAgICogZW5jb2RpbmcgaWYgaXQgaXMgY2FsbGVkIGFmdGVyIDxjb2RlPmdldFdyaXRlcjwvY29kZT4KKyAgICAgKiBoYXMgYmVlbiBjYWxsZWQgb3IgYWZ0ZXIgdGhlIHJlc3BvbnNlIGhhcyBiZWVuIGNvbW1pdHRlZC4KKyAgICAgKiA8cD5Db250YWluZXJzIG11c3QgY29tbXVuaWNhdGUgdGhlIGNvbnRlbnQgdHlwZSBhbmQgdGhlIGNoYXJhY3RlcgorICAgICAqIGVuY29kaW5nIHVzZWQgZm9yIHRoZSBzZXJ2bGV0IHJlc3BvbnNlJ3Mgd3JpdGVyIHRvIHRoZSBjbGllbnQgaWYKKyAgICAgKiB0aGUgcHJvdG9jb2wgcHJvdmlkZXMgYSB3YXkgZm9yIGRvaW5nIHNvLiBJbiB0aGUgY2FzZSBvZiBIVFRQLAorICAgICAqIHRoZSA8Y29kZT5Db250ZW50LVR5cGU8L2NvZGU+IGhlYWRlciBpcyB1c2VkLgorICAgICAqCisgICAgICogQHBhcmFtIHR5cGUgCWEgPGNvZGU+U3RyaW5nPC9jb2RlPiBzcGVjaWZ5aW5nIHRoZSBNSU1FIAorICAgICAqCQkJdHlwZSBvZiB0aGUgY29udGVudAorICAgICAqCisgICAgICogQHNlZSAJCSNzZXRMb2NhbGUKKyAgICAgKiBAc2VlIAkJI3NldENoYXJhY3RlckVuY29kaW5nCisgICAgICogQHNlZSAJCSNnZXRPdXRwdXRTdHJlYW0KKyAgICAgKiBAc2VlIAkJI2dldFdyaXRlcgorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgdm9pZCBzZXRDb250ZW50VHlwZShTdHJpbmcgdHlwZSk7CisgICAgCisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBwcmVmZXJyZWQgYnVmZmVyIHNpemUgZm9yIHRoZSBib2R5IG9mIHRoZSByZXNwb25zZS4gIAorICAgICAqIFRoZSBzZXJ2bGV0IGNvbnRhaW5lciB3aWxsIHVzZSBhIGJ1ZmZlciBhdCBsZWFzdCBhcyBsYXJnZSBhcyAKKyAgICAgKiB0aGUgc2l6ZSByZXF1ZXN0ZWQuICBUaGUgYWN0dWFsIGJ1ZmZlciBzaXplIHVzZWQgY2FuIGJlIGZvdW5kCisgICAgICogdXNpbmcgPGNvZGU+Z2V0QnVmZmVyU2l6ZTwvY29kZT4uCisgICAgICoKKyAgICAgKiA8cD5BIGxhcmdlciBidWZmZXIgYWxsb3dzIG1vcmUgY29udGVudCB0byBiZSB3cml0dGVuIGJlZm9yZSBhbnl0aGluZyBpcworICAgICAqIGFjdHVhbGx5IHNlbnQsIHRodXMgcHJvdmlkaW5nIHRoZSBzZXJ2bGV0IHdpdGggbW9yZSB0aW1lIHRvIHNldAorICAgICAqIGFwcHJvcHJpYXRlIHN0YXR1cyBjb2RlcyBhbmQgaGVhZGVycy4gIEEgc21hbGxlciBidWZmZXIgZGVjcmVhc2VzIAorICAgICAqIHNlcnZlciBtZW1vcnkgbG9hZCBhbmQgYWxsb3dzIHRoZSBjbGllbnQgdG8gc3RhcnQgcmVjZWl2aW5nIGRhdGEgbW9yZQorICAgICAqIHF1aWNrbHkuCisgICAgICoKKyAgICAgKiA8cD5UaGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgYW55IHJlc3BvbnNlIGJvZHkgY29udGVudCBpcworICAgICAqIHdyaXR0ZW47IGlmIGNvbnRlbnQgaGFzIGJlZW4gd3JpdHRlbiBvciB0aGUgcmVzcG9uc2Ugb2JqZWN0IGhhcworICAgICAqIGJlZW4gY29tbWl0dGVkLCB0aGlzIG1ldGhvZCB0aHJvd3MgYW4gCisgICAgICogPGNvZGU+SWxsZWdhbFN0YXRlRXhjZXB0aW9uPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzaXplIAl0aGUgcHJlZmVycmVkIGJ1ZmZlciBzaXplCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uICBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gIAlpZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIKKyAgICAgKgkJCQkJCWNvbnRlbnQgaGFzIGJlZW4gd3JpdHRlbgorICAgICAqCisgICAgICogQHNlZSAJCSNnZXRCdWZmZXJTaXplCisgICAgICogQHNlZSAJCSNmbHVzaEJ1ZmZlcgorICAgICAqIEBzZWUgCQkjaXNDb21taXR0ZWQKKyAgICAgKiBAc2VlIAkJI3Jlc2V0CisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIHNldEJ1ZmZlclNpemUoaW50IHNpemUpOworICAgIAorICAgIAorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYWN0dWFsIGJ1ZmZlciBzaXplIHVzZWQgZm9yIHRoZSByZXNwb25zZS4gIElmIG5vIGJ1ZmZlcmluZworICAgICAqIGlzIHVzZWQsIHRoaXMgbWV0aG9kIHJldHVybnMgMC4KKyAgICAgKgorICAgICAqIEByZXR1cm4JIAl0aGUgYWN0dWFsIGJ1ZmZlciBzaXplIHVzZWQKKyAgICAgKgorICAgICAqIEBzZWUgCQkjc2V0QnVmZmVyU2l6ZQorICAgICAqIEBzZWUgCQkjZmx1c2hCdWZmZXIKKyAgICAgKiBAc2VlIAkJI2lzQ29tbWl0dGVkCisgICAgICogQHNlZSAJCSNyZXNldAorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgaW50IGdldEJ1ZmZlclNpemUoKTsKKyAgICAKKyAgICAKKworICAgIC8qKgorICAgICAqIEZvcmNlcyBhbnkgY29udGVudCBpbiB0aGUgYnVmZmVyIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIGNsaWVudC4gIEEgY2FsbAorICAgICAqIHRvIHRoaXMgbWV0aG9kIGF1dG9tYXRpY2FsbHkgY29tbWl0cyB0aGUgcmVzcG9uc2UsIG1lYW5pbmcgdGhlIHN0YXR1cyAKKyAgICAgKiBjb2RlIGFuZCBoZWFkZXJzIHdpbGwgYmUgd3JpdHRlbi4KKyAgICAgKgorICAgICAqIEBzZWUgCQkjc2V0QnVmZmVyU2l6ZQorICAgICAqIEBzZWUgCQkjZ2V0QnVmZmVyU2l6ZQorICAgICAqIEBzZWUgCQkjaXNDb21taXR0ZWQKKyAgICAgKiBAc2VlIAkJI3Jlc2V0CisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIGZsdXNoQnVmZmVyKCkgdGhyb3dzIElPRXhjZXB0aW9uOworICAgIAorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIENsZWFycyB0aGUgY29udGVudCBvZiB0aGUgdW5kZXJseWluZyBidWZmZXIgaW4gdGhlIHJlc3BvbnNlIHdpdGhvdXQKKyAgICAgKiBjbGVhcmluZyBoZWFkZXJzIG9yIHN0YXR1cyBjb2RlLiBJZiB0aGUgCisgICAgICogcmVzcG9uc2UgaGFzIGJlZW4gY29tbWl0dGVkLCB0aGlzIG1ldGhvZCB0aHJvd3MgYW4gCisgICAgICogPGNvZGU+SWxsZWdhbFN0YXRlRXhjZXB0aW9uPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBzZWUgCQkjc2V0QnVmZmVyU2l6ZQorICAgICAqIEBzZWUgCQkjZ2V0QnVmZmVyU2l6ZQorICAgICAqIEBzZWUgCQkjaXNDb21taXR0ZWQKKyAgICAgKiBAc2VlIAkJI3Jlc2V0CisgICAgICoKKyAgICAgKiBAc2luY2UgMi4zCisgICAgICovCisKKyAgICBwdWJsaWMgdm9pZCByZXNldEJ1ZmZlcigpOworICAgIAorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIGJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGUgcmVzcG9uc2UgaGFzIGJlZW4KKyAgICAgKiBjb21taXR0ZWQuICBBIGNvbW1pdHRlZCByZXNwb25zZSBoYXMgYWxyZWFkeSBoYWQgaXRzIHN0YXR1cyAKKyAgICAgKiBjb2RlIGFuZCBoZWFkZXJzIHdyaXR0ZW4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuCQlhIGJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGUgcmVzcG9uc2UgaGFzIGJlZW4KKyAgICAgKiAgCQljb21taXR0ZWQKKyAgICAgKgorICAgICAqIEBzZWUgCQkjc2V0QnVmZmVyU2l6ZQorICAgICAqIEBzZWUgCQkjZ2V0QnVmZmVyU2l6ZQorICAgICAqIEBzZWUgCQkjZmx1c2hCdWZmZXIKKyAgICAgKiBAc2VlIAkJI3Jlc2V0CisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyBib29sZWFuIGlzQ29tbWl0dGVkKCk7CisgICAgCisgICAgCisKKyAgICAvKioKKyAgICAgKiBDbGVhcnMgYW55IGRhdGEgdGhhdCBleGlzdHMgaW4gdGhlIGJ1ZmZlciBhcyB3ZWxsIGFzIHRoZSBzdGF0dXMgY29kZSBhbmQKKyAgICAgKiBoZWFkZXJzLiAgSWYgdGhlIHJlc3BvbnNlIGhhcyBiZWVuIGNvbW1pdHRlZCwgdGhpcyBtZXRob2QgdGhyb3dzIGFuIAorICAgICAqIDxjb2RlPklsbGVnYWxTdGF0ZUV4Y2VwdGlvbjwvY29kZT4uCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiAgaWYgdGhlIHJlc3BvbnNlIGhhcyBhbHJlYWR5IGJlZW4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWl0dGVkCisgICAgICoKKyAgICAgKiBAc2VlIAkJI3NldEJ1ZmZlclNpemUKKyAgICAgKiBAc2VlIAkJI2dldEJ1ZmZlclNpemUKKyAgICAgKiBAc2VlIAkJI2ZsdXNoQnVmZmVyCisgICAgICogQHNlZSAJCSNpc0NvbW1pdHRlZAorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgdm9pZCByZXNldCgpOworICAgIAorICAgIAorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbG9jYWxlIG9mIHRoZSByZXNwb25zZSwgaWYgdGhlIHJlc3BvbnNlIGhhcyBub3QgYmVlbgorICAgICAqIGNvbW1pdHRlZCB5ZXQuIEl0IGFsc28gc2V0cyB0aGUgcmVzcG9uc2UncyBjaGFyYWN0ZXIgZW5jb2RpbmcKKyAgICAgKiBhcHByb3ByaWF0ZWx5IGZvciB0aGUgbG9jYWxlLCBpZiB0aGUgY2hhcmFjdGVyIGVuY29kaW5nIGhhcyBub3QKKyAgICAgKiBiZWVuIGV4cGxpY2l0bHkgc2V0IHVzaW5nIHtAbGluayAjc2V0Q29udGVudFR5cGV9IG9yCisgICAgICoge0BsaW5rICNzZXRDaGFyYWN0ZXJFbmNvZGluZ30sIDxjb2RlPmdldFdyaXRlcjwvY29kZT4gaGFzbid0CisgICAgICogYmVlbiBjYWxsZWQgeWV0LCBhbmQgdGhlIHJlc3BvbnNlIGhhc24ndCBiZWVuIGNvbW1pdHRlZCB5ZXQuCisgICAgICogSWYgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBjb250YWlucyBhIAorICAgICAqIDxjb2RlPmxvY2FsZS1lbmNvZGluZy1tYXBwaW5nLWxpc3Q8L2NvZGU+IGVsZW1lbnQsIGFuZCB0aGF0CisgICAgICogZWxlbWVudCBwcm92aWRlcyBhIG1hcHBpbmcgZm9yIHRoZSBnaXZlbiBsb2NhbGUsIHRoYXQgbWFwcGluZworICAgICAqIGlzIHVzZWQuIE90aGVyd2lzZSwgdGhlIG1hcHBpbmcgZnJvbSBsb2NhbGUgdG8gY2hhcmFjdGVyCisgICAgICogZW5jb2RpbmcgaXMgY29udGFpbmVyIGRlcGVuZGVudC4KKyAgICAgKiA8cD5UaGlzIG1ldGhvZCBtYXkgYmUgY2FsbGVkIHJlcGVhdGVkbHkgdG8gY2hhbmdlIGxvY2FsZSBhbmQKKyAgICAgKiBjaGFyYWN0ZXIgZW5jb2RpbmcuIFRoZSBtZXRob2QgaGFzIG5vIGVmZmVjdCBpZiBjYWxsZWQgYWZ0ZXIgdGhlCisgICAgICogcmVzcG9uc2UgaGFzIGJlZW4gY29tbWl0dGVkLiBJdCBkb2VzIG5vdCBzZXQgdGhlIHJlc3BvbnNlJ3MKKyAgICAgKiBjaGFyYWN0ZXIgZW5jb2RpbmcgaWYgaXQgaXMgY2FsbGVkIGFmdGVyIHtAbGluayAjc2V0Q29udGVudFR5cGV9CisgICAgICogaGFzIGJlZW4gY2FsbGVkIHdpdGggYSBjaGFyc2V0IHNwZWNpZmljYXRpb24sIGFmdGVyCisgICAgICoge0BsaW5rICNzZXRDaGFyYWN0ZXJFbmNvZGluZ30gaGFzIGJlZW4gY2FsbGVkLCBhZnRlcgorICAgICAqIDxjb2RlPmdldFdyaXRlcjwvY29kZT4gaGFzIGJlZW4gY2FsbGVkLCBvciBhZnRlciB0aGUgcmVzcG9uc2UKKyAgICAgKiBoYXMgYmVlbiBjb21taXR0ZWQuCisgICAgICogPHA+Q29udGFpbmVycyBtdXN0IGNvbW11bmljYXRlIHRoZSBsb2NhbGUgYW5kIHRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcKKyAgICAgKiB1c2VkIGZvciB0aGUgc2VydmxldCByZXNwb25zZSdzIHdyaXRlciB0byB0aGUgY2xpZW50IGlmIHRoZSBwcm90b2NvbAorICAgICAqIHByb3ZpZGVzIGEgd2F5IGZvciBkb2luZyBzby4gSW4gdGhlIGNhc2Ugb2YgSFRUUCwgdGhlIGxvY2FsZSBpcworICAgICAqIGNvbW11bmljYXRlZCB2aWEgdGhlIDxjb2RlPkNvbnRlbnQtTGFuZ3VhZ2U8L2NvZGU+IGhlYWRlciwKKyAgICAgKiB0aGUgY2hhcmFjdGVyIGVuY29kaW5nIGFzIHBhcnQgb2YgdGhlIDxjb2RlPkNvbnRlbnQtVHlwZTwvY29kZT4KKyAgICAgKiBoZWFkZXIgZm9yIHRleHQgbWVkaWEgdHlwZXMuIE5vdGUgdGhhdCB0aGUgY2hhcmFjdGVyIGVuY29kaW5nCisgICAgICogY2Fubm90IGJlIGNvbW11bmljYXRlZCB2aWEgSFRUUCBoZWFkZXJzIGlmIHRoZSBzZXJ2bGV0IGRvZXMgbm90CisgICAgICogc3BlY2lmeSBhIGNvbnRlbnQgdHlwZTsgaG93ZXZlciwgaXQgaXMgc3RpbGwgdXNlZCB0byBlbmNvZGUgdGV4dAorICAgICAqIHdyaXR0ZW4gdmlhIHRoZSBzZXJ2bGV0IHJlc3BvbnNlJ3Mgd3JpdGVyLgorICAgICAqIAorICAgICAqIEBwYXJhbSBsb2MgIHRoZSBsb2NhbGUgb2YgdGhlIHJlc3BvbnNlCisgICAgICoKKyAgICAgKiBAc2VlIAkJI2dldExvY2FsZQorICAgICAqIEBzZWUgCQkjc2V0Q29udGVudFR5cGUKKyAgICAgKiBAc2VlIAkJI3NldENoYXJhY3RlckVuY29kaW5nCisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIHNldExvY2FsZShMb2NhbGUgbG9jKTsKKyAgICAKKyAgICAKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGxvY2FsZSBzcGVjaWZpZWQgZm9yIHRoaXMgcmVzcG9uc2UKKyAgICAgKiB1c2luZyB0aGUge0BsaW5rICNzZXRMb2NhbGV9IG1ldGhvZC4gQ2FsbHMgbWFkZSB0bworICAgICAqIDxjb2RlPnNldExvY2FsZTwvY29kZT4gYWZ0ZXIgdGhlIHJlc3BvbnNlIGlzIGNvbW1pdHRlZAorICAgICAqIGhhdmUgbm8gZWZmZWN0LiBJZiBubyBsb2NhbGUgaGFzIGJlZW4gc3BlY2lmaWVkLAorICAgICAqIHRoZSBjb250YWluZXIncyBkZWZhdWx0IGxvY2FsZSBpcyByZXR1cm5lZC4KKyAgICAgKiAKKyAgICAgKiBAc2VlIAkJI3NldExvY2FsZQorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgTG9jYWxlIGdldExvY2FsZSgpOworCisKKworfQorCisKKworCisKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L1NlcnZsZXRSZXNwb25zZVdyYXBwZXIuamF2YSBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L1NlcnZsZXRSZXNwb25zZVdyYXBwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTk1ZTI4Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvU2VydmxldFJlc3BvbnNlV3JhcHBlci5qYXZhCkBAIC0wLDAgKzEsMjE3IEBACisvKgorKiBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCitwYWNrYWdlIGphdmF4LnNlcnZsZXQ7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKKworLyoqCisgKiAKKyAqIFByb3ZpZGVzIGEgY29udmVuaWVudCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgU2VydmxldFJlc3BvbnNlIGludGVyZmFjZSB0aGF0CisgKiBjYW4gYmUgc3ViY2xhc3NlZCBieSBkZXZlbG9wZXJzIHdpc2hpbmcgdG8gYWRhcHQgdGhlIHJlc3BvbnNlIGZyb20gYSBTZXJ2bGV0LgorICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSBXcmFwcGVyIG9yIERlY29yYXRvciBwYXR0ZXJuLiBNZXRob2RzIGRlZmF1bHQgdG8KKyAqIGNhbGxpbmcgdGhyb3VnaCB0byB0aGUgd3JhcHBlZCByZXNwb25zZSBvYmplY3QuCisgKiAKKyAqIEBhdXRob3IgCVZhcmlvdXMKKyAqIEB2ZXJzaW9uIAkkVmVyc2lvbiQKKyAqIEBzaW5jZQl2IDIuMworICoKKyAqIEBzZWUgCWphdmF4LnNlcnZsZXQuU2VydmxldFJlc3BvbnNlCisgKgorICovCisKKyAKK3B1YmxpYyBjbGFzcyBTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyIGltcGxlbWVudHMgU2VydmxldFJlc3BvbnNlIHsKKwlwcml2YXRlIFNlcnZsZXRSZXNwb25zZSByZXNwb25zZTsKKwkvKioKKwkqIENyZWF0ZXMgYSBTZXJ2bGV0UmVzcG9uc2UgYWRhcHRvciB3cmFwcGluZyB0aGUgZ2l2ZW4gcmVzcG9uc2Ugb2JqZWN0LgorCSogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSByZXNwb25zZSBpcyBudWxsLgorCSovCisKKworCXB1YmxpYyBTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyKFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgeworCSAgICBpZiAocmVzcG9uc2UgPT0gbnVsbCkgeworCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZXNwb25zZSBjYW5ub3QgYmUgbnVsbCIpOworCSAgICB9CisJICAgIHRoaXMucmVzcG9uc2UgPSByZXNwb25zZTsKKwl9CisKKwkvKioKKwkqIFJldHVybiB0aGUgd3JhcHBlZCBTZXJ2bGV0UmVzcG9uc2Ugb2JqZWN0LgorCSovCisKKwlwdWJsaWMgU2VydmxldFJlc3BvbnNlIGdldFJlc3BvbnNlKCkgeworCQlyZXR1cm4gdGhpcy5yZXNwb25zZTsKKwl9CQorCQorCQorCS8qKgorCSogU2V0cyB0aGUgcmVzcG9uc2UgYmVpbmcgd3JhcHBlZC4gCisJKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHJlc3BvbnNlIGlzIG51bGwuCisJKi8KKwkKKwlwdWJsaWMgdm9pZCBzZXRSZXNwb25zZShTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHsKKwkgICAgaWYgKHJlc3BvbnNlID09IG51bGwpIHsKKwkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVzcG9uc2UgY2Fubm90IGJlIG51bGwiKTsKKwkgICAgfQorCSAgICB0aGlzLnJlc3BvbnNlID0gcmVzcG9uc2U7CisJfQorCisgICAgLyoqCisgICAgICogVGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgdGhpcyBtZXRob2QgaXMgdG8gY2FsbCBzZXRDaGFyYWN0ZXJFbmNvZGluZyhTdHJpbmcgY2hhcnNldCkKKyAgICAgKiBvbiB0aGUgd3JhcHBlZCByZXNwb25zZSBvYmplY3QuCisgICAgICoKKyAgICAgKiBAc2luY2UgMi40CisgICAgICovCisKKyAgICBwdWJsaWMgdm9pZCBzZXRDaGFyYWN0ZXJFbmNvZGluZyhTdHJpbmcgY2hhcnNldCkgeworCXRoaXMucmVzcG9uc2Uuc2V0Q2hhcmFjdGVyRW5jb2RpbmcoY2hhcnNldCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgdGhpcyBtZXRob2QgaXMgdG8gcmV0dXJuIGdldENoYXJhY3RlckVuY29kaW5nKCkKKyAgICAgKiBvbiB0aGUgd3JhcHBlZCByZXNwb25zZSBvYmplY3QuCisgICAgICovCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldENoYXJhY3RlckVuY29kaW5nKCkgeworCXJldHVybiB0aGlzLnJlc3BvbnNlLmdldENoYXJhY3RlckVuY29kaW5nKCk7CisJfQorICAgIAorICAgIAorCSAgLyoqCisgICAgICogVGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgdGhpcyBtZXRob2QgaXMgdG8gcmV0dXJuIGdldE91dHB1dFN0cmVhbSgpCisgICAgICogb24gdGhlIHdyYXBwZWQgcmVzcG9uc2Ugb2JqZWN0LgorICAgICAqLworCisgICAgcHVibGljIFNlcnZsZXRPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlyZXR1cm4gdGhpcy5yZXNwb25zZS5nZXRPdXRwdXRTdHJlYW0oKTsKKyAgICB9ICAKKyAgICAgIAorICAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBpcyB0byByZXR1cm4gZ2V0V3JpdGVyKCkKKyAgICAgKiBvbiB0aGUgd3JhcHBlZCByZXNwb25zZSBvYmplY3QuCisgICAgICovCisKKworICAgIHB1YmxpYyBQcmludFdyaXRlciBnZXRXcml0ZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXJldHVybiB0aGlzLnJlc3BvbnNlLmdldFdyaXRlcigpOworCX0KKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBpcyB0byBjYWxsIHNldENvbnRlbnRMZW5ndGgoaW50IGxlbikKKyAgICAgKiBvbiB0aGUgd3JhcHBlZCByZXNwb25zZSBvYmplY3QuCisgICAgICovCisKKyAgICBwdWJsaWMgdm9pZCBzZXRDb250ZW50TGVuZ3RoKGludCBsZW4pIHsKKwl0aGlzLnJlc3BvbnNlLnNldENvbnRlbnRMZW5ndGgobGVuKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogVGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgdGhpcyBtZXRob2QgaXMgdG8gY2FsbCBzZXRDb250ZW50VHlwZShTdHJpbmcgdHlwZSkKKyAgICAgKiBvbiB0aGUgd3JhcHBlZCByZXNwb25zZSBvYmplY3QuCisgICAgICovCisKKyAgICBwdWJsaWMgdm9pZCBzZXRDb250ZW50VHlwZShTdHJpbmcgdHlwZSkgeworCXRoaXMucmVzcG9uc2Uuc2V0Q29udGVudFR5cGUodHlwZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgdGhpcyBtZXRob2QgaXMgdG8gcmV0dXJuIGdldENvbnRlbnRUeXBlKCkKKyAgICAgKiBvbiB0aGUgd3JhcHBlZCByZXNwb25zZSBvYmplY3QuCisgICAgICoKKyAgICAgKiBAc2luY2UgMi40CisgICAgICovCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRUeXBlKCkgeworCXJldHVybiB0aGlzLnJlc3BvbnNlLmdldENvbnRlbnRUeXBlKCk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoaXMgbWV0aG9kIGlzIHRvIGNhbGwgc2V0QnVmZmVyU2l6ZShpbnQgc2l6ZSkKKyAgICAgKiBvbiB0aGUgd3JhcHBlZCByZXNwb25zZSBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QnVmZmVyU2l6ZShpbnQgc2l6ZSkgeworCXRoaXMucmVzcG9uc2Uuc2V0QnVmZmVyU2l6ZShzaXplKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogVGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgdGhpcyBtZXRob2QgaXMgdG8gcmV0dXJuIGdldEJ1ZmZlclNpemUoKQorICAgICAqIG9uIHRoZSB3cmFwcGVkIHJlc3BvbnNlIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEJ1ZmZlclNpemUoKSB7CisJcmV0dXJuIHRoaXMucmVzcG9uc2UuZ2V0QnVmZmVyU2l6ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoaXMgbWV0aG9kIGlzIHRvIGNhbGwgZmx1c2hCdWZmZXIoKQorICAgICAqIG9uIHRoZSB3cmFwcGVkIHJlc3BvbnNlIG9iamVjdC4KKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIGZsdXNoQnVmZmVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwl0aGlzLnJlc3BvbnNlLmZsdXNoQnVmZmVyKCk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoaXMgbWV0aG9kIGlzIHRvIHJldHVybiBpc0NvbW1pdHRlZCgpCisgICAgICogb24gdGhlIHdyYXBwZWQgcmVzcG9uc2Ugb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzQ29tbWl0dGVkKCkgeworCXJldHVybiB0aGlzLnJlc3BvbnNlLmlzQ29tbWl0dGVkKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgdGhpcyBtZXRob2QgaXMgdG8gY2FsbCByZXNldCgpCisgICAgICogb24gdGhlIHdyYXBwZWQgcmVzcG9uc2Ugb2JqZWN0LgorICAgICAqLworCisgICAgcHVibGljIHZvaWQgcmVzZXQoKSB7CisJdGhpcy5yZXNwb25zZS5yZXNldCgpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBpcyB0byBjYWxsIHJlc2V0QnVmZmVyKCkKKyAgICAgKiBvbiB0aGUgd3JhcHBlZCByZXNwb25zZSBvYmplY3QuCisgICAgICovCisgICAgIAorICAgIHB1YmxpYyB2b2lkIHJlc2V0QnVmZmVyKCkgeworCXRoaXMucmVzcG9uc2UucmVzZXRCdWZmZXIoKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogVGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgdGhpcyBtZXRob2QgaXMgdG8gY2FsbCBzZXRMb2NhbGUoTG9jYWxlIGxvYykKKyAgICAgKiBvbiB0aGUgd3JhcHBlZCByZXNwb25zZSBvYmplY3QuCisgICAgICovCisKKyAgICBwdWJsaWMgdm9pZCBzZXRMb2NhbGUoTG9jYWxlIGxvYykgeworCXRoaXMucmVzcG9uc2Uuc2V0TG9jYWxlKGxvYyk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoaXMgbWV0aG9kIGlzIHRvIHJldHVybiBnZXRMb2NhbGUoKQorICAgICAqIG9uIHRoZSB3cmFwcGVkIHJlc3BvbnNlIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTG9jYWxlIGdldExvY2FsZSgpIHsKKwlyZXR1cm4gdGhpcy5yZXNwb25zZS5nZXRMb2NhbGUoKTsKKyAgICB9CisKKworfQorCisKKworCisKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L1NpbmdsZVRocmVhZE1vZGVsLmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9TaW5nbGVUaHJlYWRNb2RlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0NmZmMDIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9TaW5nbGVUaHJlYWRNb2RlbC5qYXZhCkBAIC0wLDAgKzEsNDggQEAKKy8qCisqIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KK3BhY2thZ2UgamF2YXguc2VydmxldDsKKworLyoqCisgKiBFbnN1cmVzIHRoYXQgc2VydmxldHMgaGFuZGxlCisgKiBvbmx5IG9uZSByZXF1ZXN0IGF0IGEgdGltZS4gVGhpcyBpbnRlcmZhY2UgaGFzIG5vIG1ldGhvZHMuCisgKgorICogPHA+SWYgYSBzZXJ2bGV0IGltcGxlbWVudHMgdGhpcyBpbnRlcmZhY2UsIHlvdSBhcmUgPGk+Z3VhcmFudGVlZDwvaT4KKyAqIHRoYXQgbm8gdHdvIHRocmVhZHMgd2lsbCBleGVjdXRlIGNvbmN1cnJlbnRseSBpbiB0aGUKKyAqIHNlcnZsZXQncyA8Y29kZT5zZXJ2aWNlPC9jb2RlPiBtZXRob2QuIFRoZSBzZXJ2bGV0IGNvbnRhaW5lcgorICogY2FuIG1ha2UgdGhpcyBndWFyYW50ZWUgYnkgc3luY2hyb25pemluZyBhY2Nlc3MgdG8gYSBzaW5nbGUKKyAqIGluc3RhbmNlIG9mIHRoZSBzZXJ2bGV0LCBvciBieSBtYWludGFpbmluZyBhIHBvb2wgb2Ygc2VydmxldAorICogaW5zdGFuY2VzIGFuZCBkaXNwYXRjaGluZyBlYWNoIG5ldyByZXF1ZXN0IHRvIGEgZnJlZSBzZXJ2bGV0LgorICoKKyAqIDxwPk5vdGUgdGhhdCBTaW5nbGVUaHJlYWRNb2RlbCBkb2VzIG5vdCBzb2x2ZSBhbGwgdGhyZWFkIHNhZmV0eQorICogaXNzdWVzLiAgRm9yIGV4YW1wbGUsIHNlc3Npb24gYXR0cmlidXRlcyBhbmQgc3RhdGljIHZhcmlhYmxlcyBjYW4KKyAqIHN0aWxsIGJlIGFjY2Vzc2VkIGJ5IG11bHRpcGxlIHJlcXVlc3RzIG9uIG11bHRpcGxlIHRocmVhZHMKKyAqIGF0IHRoZSBzYW1lIHRpbWUsIGV2ZW4gd2hlbiBTaW5nbGVUaHJlYWRNb2RlbCBzZXJ2bGV0cyBhcmUgdXNlZC4KKyAqIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgYSBkZXZlbG9wZXIgdGFrZSBvdGhlciBtZWFucyB0byByZXNvbHZlCisgKiB0aG9zZSBpc3N1ZXMgaW5zdGVhZCBvZiBpbXBsZW1lbnRpbmcgdGhpcyBpbnRlcmZhY2UsIHN1Y2ggYXMKKyAqIGF2b2lkaW5nIHRoZSB1c2FnZSBvZiBhbiBpbnN0YW5jZSB2YXJpYWJsZSBvciBzeW5jaHJvbml6aW5nCisgKiB0aGUgYmxvY2sgb2YgdGhlIGNvZGUgYWNjZXNzaW5nIHRob3NlIHJlc291cmNlcy4KKyAqIFRoaXMgaW50ZXJmYWNlIGlzIGRlcHJlY2F0ZWQgaW4gU2VydmxldCBBUEkgdmVyc2lvbiAyLjQuCisgKgorICoKKyAqIEBhdXRob3IJVmFyaW91cworICogQHZlcnNpb24JJFZlcnNpb24kCisgKgorICogQGRlcHJlY2F0ZWQJQXMgb2YgSmF2YSBTZXJ2bGV0IEFQSSAyLjQsIHdpdGggbm8gZGlyZWN0CisgKglyZXBsYWNlbWVudC4KKyAqLworCitwdWJsaWMgaW50ZXJmYWNlIFNpbmdsZVRocmVhZE1vZGVsIHsKK30KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L1VuYXZhaWxhYmxlRXhjZXB0aW9uLmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9VbmF2YWlsYWJsZUV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjMGQ3ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9VbmF2YWlsYWJsZUV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjA1IEBACisvKgorKiBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK3BhY2thZ2UgamF2YXguc2VydmxldDsKKworCisvKioKKyAqIERlZmluZXMgYW4gZXhjZXB0aW9uIHRoYXQgYSBzZXJ2bGV0IG9yIGZpbHRlciB0aHJvd3MgdG8gaW5kaWNhdGUKKyAqIHRoYXQgaXQgaXMgcGVybWFuZW50bHkgb3IgdGVtcG9yYXJpbHkgdW5hdmFpbGFibGUuIAorICoKKyAqIDxwPldoZW4gYSBzZXJ2bGV0IG9yIGZpbHRlciBpcyBwZXJtYW5lbnRseSB1bmF2YWlsYWJsZSwgc29tZXRoaW5nIGlzIHdyb25nCisgKiB3aXRoIGl0LCBhbmQgaXQgY2Fubm90IGhhbmRsZQorICogcmVxdWVzdHMgdW50aWwgc29tZSBhY3Rpb24gaXMgdGFrZW4uIEZvciBleGFtcGxlLCBhIHNlcnZsZXQKKyAqIG1pZ2h0IGJlIGNvbmZpZ3VyZWQgaW5jb3JyZWN0bHksIG9yIGEgZmlsdGVyJ3Mgc3RhdGUgbWF5IGJlIGNvcnJ1cHRlZC4KKyAqIFRoZSBjb21wb25lbnQgc2hvdWxkIGxvZyBib3RoIHRoZSBlcnJvciBhbmQgdGhlIGNvcnJlY3RpdmUgYWN0aW9uCisgKiB0aGF0IGlzIG5lZWRlZC4KKyAqCisgKiA8cD5BIHNlcnZsZXQgb3IgZmlsdGVyIGlzIHRlbXBvcmFyaWx5IHVuYXZhaWxhYmxlIGlmIGl0IGNhbm5vdCBoYW5kbGUKKyAqIHJlcXVlc3RzIG1vbWVudGFyaWx5IGR1ZSB0byBzb21lIHN5c3RlbS13aWRlIHByb2JsZW0uIEZvciBleGFtcGxlLAorICogYSB0aGlyZC10aWVyIHNlcnZlciBtaWdodCBub3QgYmUgYWNjZXNzaWJsZSwgb3IgdGhlcmUgbWF5IGJlIAorICogaW5zdWZmaWNpZW50IG1lbW9yeSBvciBkaXNrIHN0b3JhZ2UgdG8gaGFuZGxlIHJlcXVlc3RzLiBBIHN5c3RlbQorICogYWRtaW5pc3RyYXRvciBtYXkgbmVlZCB0byB0YWtlIGNvcnJlY3RpdmUgYWN0aW9uLgorICoKKyAqIDxwPlNlcnZsZXQgY29udGFpbmVycyBjYW4gc2FmZWx5IHRyZWF0IGJvdGggdHlwZXMgb2YgdW5hdmFpbGFibGUKKyAqIGV4Y2VwdGlvbnMgaW4gdGhlIHNhbWUgd2F5LiBIb3dldmVyLCB0cmVhdGluZyB0ZW1wb3JhcnkgdW5hdmFpbGFiaWxpdHkKKyAqIGVmZmVjdGl2ZWx5IG1ha2VzIHRoZSBzZXJ2bGV0IGNvbnRhaW5lciBtb3JlIHJvYnVzdC4gU3BlY2lmaWNhbGx5LAorICogdGhlIHNlcnZsZXQgY29udGFpbmVyIG1pZ2h0IGJsb2NrIHJlcXVlc3RzIHRvIHRoZSBzZXJ2bGV0IG9yIGZpbHRlciBmb3IgYSBwZXJpb2QKKyAqIG9mIHRpbWUgc3VnZ2VzdGVkIGJ5IHRoZSBleGNlcHRpb24sIHJhdGhlciB0aGFuIHJlamVjdGluZyB0aGVtIHVudGlsCisgKiB0aGUgc2VydmxldCBjb250YWluZXIgcmVzdGFydHMuCisgKgorICoKKyAqIEBhdXRob3IgCVZhcmlvdXMKKyAqIEB2ZXJzaW9uIAkkVmVyc2lvbiQKKyAqCisgKi8KKworcHVibGljIGNsYXNzIFVuYXZhaWxhYmxlRXhjZXB0aW9uCitleHRlbmRzIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgcHJpdmF0ZSBTZXJ2bGV0ICAgICBzZXJ2bGV0OyAgICAgICAgICAgLy8gd2hhdCdzIHVuYXZhaWxhYmxlCisgICAgcHJpdmF0ZSBib29sZWFuICAgICBwZXJtYW5lbnQ7ICAgICAgICAgLy8gbmVlZHMgYWRtaW4gYWN0aW9uPworICAgIHByaXZhdGUgaW50ICAgICAgICAgc2Vjb25kczsgICAgICAgICAgIC8vIHVuYXZhaWxhYmlsaXR5IGVzdGltYXRlCisKKyAgICAvKioKKyAgICAgKiAKKyAgICAgKiBAZGVwcmVjYXRlZAlBcyBvZiBKYXZhIFNlcnZsZXQgQVBJIDIuMiwgdXNlIHtAbGluaworICAgICAqIAkJCSNVbmF2YWlsYWJsZUV4Y2VwdGlvbihTdHJpbmcpfSBpbnN0ZWFkLgorICAgICAqCisgICAgICogQHBhcmFtIHNlcnZsZXQgCXRoZSA8Y29kZT5TZXJ2bGV0PC9jb2RlPiBpbnN0YW5jZSB0aGF0IGlzCisgICAgICogICAgICAgICAgICAgICAgICB1bmF2YWlsYWJsZQorICAgICAqCisgICAgICogQHBhcmFtIG1zZyAJYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHNwZWNpZnlpbmcgdGhlCisgICAgICogICAgICAgICAgICAgICAgICBkZXNjcmlwdGl2ZSBtZXNzYWdlCisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyBVbmF2YWlsYWJsZUV4Y2VwdGlvbihTZXJ2bGV0IHNlcnZsZXQsIFN0cmluZyBtc2cpIHsKKwlzdXBlcihtc2cpOworCXRoaXMuc2VydmxldCA9IHNlcnZsZXQ7CisJcGVybWFuZW50ID0gdHJ1ZTsKKyAgICB9CisgCisgICAgLyoqCisgICAgICogQGRlcHJlY2F0ZWQJQXMgb2YgSmF2YSBTZXJ2bGV0IEFQSSAyLjIsIHVzZSB7QGxpbmsKKyAgICAgKgkJCSNVbmF2YWlsYWJsZUV4Y2VwdGlvbihTdHJpbmcsIGludCl9IGluc3RlYWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2Vjb25kcwlhbiBpbnRlZ2VyIHNwZWNpZnlpbmcgdGhlIG51bWJlciBvZiBzZWNvbmRzCisgICAgICogCQkJdGhlIHNlcnZsZXQgZXhwZWN0cyB0byBiZSB1bmF2YWlsYWJsZTsgaWYKKyAgICAgKgkJCXplcm8gb3IgbmVnYXRpdmUsIGluZGljYXRlcyB0aGF0IHRoZSBzZXJ2bGV0CisgICAgICoJCQljYW4ndCBtYWtlIGFuIGVzdGltYXRlCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VydmxldAl0aGUgPGNvZGU+U2VydmxldDwvY29kZT4gdGhhdCBpcyB1bmF2YWlsYWJsZQorICAgICAqIAorICAgICAqIEBwYXJhbSBtc2cJYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHNwZWNpZnlpbmcgdGhlIGRlc2NyaXB0aXZlIAorICAgICAqCQkJbWVzc2FnZSwgd2hpY2ggY2FuIGJlIHdyaXR0ZW4gdG8gYSBsb2cgZmlsZSBvciAKKyAgICAgKgkJCWRpc3BsYXllZCBmb3IgdGhlIHVzZXIuCisgICAgICoKKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgVW5hdmFpbGFibGVFeGNlcHRpb24oaW50IHNlY29uZHMsIFNlcnZsZXQgc2VydmxldCwgU3RyaW5nIG1zZykgeworCXN1cGVyKG1zZyk7CisJdGhpcy5zZXJ2bGV0ID0gc2VydmxldDsKKwlpZiAoc2Vjb25kcyA8PSAwKQorCSAgICB0aGlzLnNlY29uZHMgPSAtMTsKKwllbHNlCisJICAgIHRoaXMuc2Vjb25kcyA9IHNlY29uZHM7CisJcGVybWFuZW50ID0gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBleGNlcHRpb24gd2l0aCBhIGRlc2NyaXB0aXZlCisgICAgICogbWVzc2FnZSBpbmRpY2F0aW5nIHRoYXQgdGhlIHNlcnZsZXQgaXMgcGVybWFuZW50bHkKKyAgICAgKiB1bmF2YWlsYWJsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtc2cgCWEgPGNvZGU+U3RyaW5nPC9jb2RlPiBzcGVjaWZ5aW5nIHRoZQorICAgICAqICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpdmUgbWVzc2FnZQorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgVW5hdmFpbGFibGVFeGNlcHRpb24oU3RyaW5nIG1zZykgeworCXN1cGVyKG1zZyk7CisKKwlwZXJtYW5lbnQgPSB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgZXhjZXB0aW9uIHdpdGggYSBkZXNjcmlwdGl2ZSBtZXNzYWdlCisgICAgICogaW5kaWNhdGluZyB0aGF0IHRoZSBzZXJ2bGV0IGlzIHRlbXBvcmFyaWx5IHVuYXZhaWxhYmxlCisgICAgICogYW5kIGdpdmluZyBhbiBlc3RpbWF0ZSBvZiBob3cgbG9uZyBpdCB3aWxsIGJlIHVuYXZhaWxhYmxlLgorICAgICAqIAorICAgICAqIDxwPkluIHNvbWUgY2FzZXMsIHRoZSBzZXJ2bGV0IGNhbm5vdCBtYWtlIGFuIGVzdGltYXRlLiBGb3IKKyAgICAgKiBleGFtcGxlLCB0aGUgc2VydmxldCBtaWdodCBrbm93IHRoYXQgYSBzZXJ2ZXIgaXQgbmVlZHMgaXMKKyAgICAgKiBub3QgcnVubmluZywgYnV0IG5vdCBiZSBhYmxlIHRvIHJlcG9ydCBob3cgbG9uZyBpdCB3aWxsIHRha2UKKyAgICAgKiB0byBiZSByZXN0b3JlZCB0byBmdW5jdGlvbmFsaXR5LiBUaGlzIGNhbiBiZSBpbmRpY2F0ZWQgd2l0aAorICAgICAqIGEgbmVnYXRpdmUgb3IgemVybyB2YWx1ZSBmb3IgdGhlIDxjb2RlPnNlY29uZHM8L2NvZGU+IGFyZ3VtZW50LgorICAgICAqCisgICAgICogQHBhcmFtIG1zZwlhIDxjb2RlPlN0cmluZzwvY29kZT4gc3BlY2lmeWluZyB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aXZlIG1lc3NhZ2UsIHdoaWNoIGNhbiBiZSB3cml0dGVuCisgICAgICogICAgICAgICAgICAgICAgICB0byBhIGxvZyBmaWxlIG9yIGRpc3BsYXllZCBmb3IgdGhlIHVzZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2Vjb25kcwlhbiBpbnRlZ2VyIHNwZWNpZnlpbmcgdGhlIG51bWJlciBvZiBzZWNvbmRzCisgICAgICogCQkJdGhlIHNlcnZsZXQgZXhwZWN0cyB0byBiZSB1bmF2YWlsYWJsZTsgaWYKKyAgICAgKgkJCXplcm8gb3IgbmVnYXRpdmUsIGluZGljYXRlcyB0aGF0IHRoZSBzZXJ2bGV0CisgICAgICoJCQljYW4ndCBtYWtlIGFuIGVzdGltYXRlCisgICAgICoKKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgVW5hdmFpbGFibGVFeGNlcHRpb24oU3RyaW5nIG1zZywgaW50IHNlY29uZHMpIHsKKwlzdXBlcihtc2cpOworCisJaWYgKHNlY29uZHMgPD0gMCkKKwkgICAgdGhpcy5zZWNvbmRzID0gLTE7CisJZWxzZQorCSAgICB0aGlzLnNlY29uZHMgPSBzZWNvbmRzOworCisJcGVybWFuZW50ID0gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICoKKyAgICAgKiBSZXR1cm5zIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gaW5kaWNhdGluZworICAgICAqIHdoZXRoZXIgdGhlIHNlcnZsZXQgaXMgcGVybWFuZW50bHkgdW5hdmFpbGFibGUuCisgICAgICogSWYgc28sIHNvbWV0aGluZyBpcyB3cm9uZyB3aXRoIHRoZSBzZXJ2bGV0LCBhbmQgdGhlCisgICAgICogc3lzdGVtIGFkbWluaXN0cmF0b3IgbXVzdCB0YWtlIHNvbWUgY29ycmVjdGl2ZSBhY3Rpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuCQk8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc2VydmxldCBpcworICAgICAqCQkJcGVybWFuZW50bHkgdW5hdmFpbGFibGU7IDxjb2RlPmZhbHNlPC9jb2RlPgorICAgICAqCQkJaWYgdGhlIHNlcnZsZXQgaXMgYXZhaWxhYmxlIG9yIHRlbXBvcmFyaWx5CisgICAgICoJCQl1bmF2YWlsYWJsZQorICAgICAqCisgICAgICovCisgICAgIAorICAgIHB1YmxpYyBib29sZWFuIGlzUGVybWFuZW50KCkgeworCXJldHVybiBwZXJtYW5lbnQ7CisgICAgfQorICAKKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZAlBcyBvZiBKYXZhIFNlcnZsZXQgQVBJIDIuMiwgd2l0aCBubyByZXBsYWNlbWVudC4KKyAgICAgKgorICAgICAqIFJldHVybnMgdGhlIHNlcnZsZXQgdGhhdCBpcyByZXBvcnRpbmcgaXRzIHVuYXZhaWxhYmlsaXR5LgorICAgICAqIAorICAgICAqIEByZXR1cm4JCXRoZSA8Y29kZT5TZXJ2bGV0PC9jb2RlPiBvYmplY3QgdGhhdCBpcyAKKyAgICAgKgkJCXRocm93aW5nIHRoZSA8Y29kZT5VbmF2YWlsYWJsZUV4Y2VwdGlvbjwvY29kZT4KKyAgICAgKgorICAgICAqLworICAgICAKKyAgICBwdWJsaWMgU2VydmxldCBnZXRTZXJ2bGV0KCkgeworCXJldHVybiBzZXJ2bGV0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBzZWNvbmRzIHRoZSBzZXJ2bGV0IGV4cGVjdHMgdG8gCisgICAgICogYmUgdGVtcG9yYXJpbHkgdW5hdmFpbGFibGUuICAKKyAgICAgKgorICAgICAqIDxwPklmIHRoaXMgbWV0aG9kIHJldHVybnMgYSBuZWdhdGl2ZSBudW1iZXIsIHRoZSBzZXJ2bGV0CisgICAgICogaXMgcGVybWFuZW50bHkgdW5hdmFpbGFibGUgb3IgY2Fubm90IHByb3ZpZGUgYW4gZXN0aW1hdGUgb2YKKyAgICAgKiBob3cgbG9uZyBpdCB3aWxsIGJlIHVuYXZhaWxhYmxlLiBObyBlZmZvcnQgaXMKKyAgICAgKiBtYWRlIHRvIGNvcnJlY3QgZm9yIHRoZSB0aW1lIGVsYXBzZWQgc2luY2UgdGhlIGV4Y2VwdGlvbiB3YXMKKyAgICAgKiBmaXJzdCByZXBvcnRlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4JCWFuIGludGVnZXIgc3BlY2lmeWluZyB0aGUgbnVtYmVyIG9mIHNlY29uZHMKKyAgICAgKgkJCXRoZSBzZXJ2bGV0IHdpbGwgYmUgdGVtcG9yYXJpbHkgdW5hdmFpbGFibGUsCisgICAgICoJCQlvciBhIG5lZ2F0aXZlIG51bWJlciBpZiB0aGUgc2VydmxldCBpcyBwZXJtYW5lbnRseQorICAgICAqCQkJdW5hdmFpbGFibGUgb3IgY2Fubm90IG1ha2UgYW4gZXN0aW1hdGUKKyAgICAgKgorICAgICAqLworICAgICAKKyAgICBwdWJsaWMgaW50IGdldFVuYXZhaWxhYmxlU2Vjb25kcygpIHsKKwlyZXR1cm4gcGVybWFuZW50ID8gLTEgOiBzZWNvbmRzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2h0dHAvQ29va2llLmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9odHRwL0Nvb2tpZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjYmM2YjQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9odHRwL0Nvb2tpZS5qYXZhCkBAIC0wLDAgKzEsNTM2IEBACisvKgorKiBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCitwYWNrYWdlIGphdmF4LnNlcnZsZXQuaHR0cDsKKworaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKKworLyoqCisgKgorICogQ3JlYXRlcyBhIGNvb2tpZSwgYSBzbWFsbCBhbW91bnQgb2YgaW5mb3JtYXRpb24gc2VudCBieSBhIHNlcnZsZXQgdG8gCisgKiBhIFdlYiBicm93c2VyLCBzYXZlZCBieSB0aGUgYnJvd3NlciwgYW5kIGxhdGVyIHNlbnQgYmFjayB0byB0aGUgc2VydmVyLgorICogQSBjb29raWUncyB2YWx1ZSBjYW4gdW5pcXVlbHkgCisgKiBpZGVudGlmeSBhIGNsaWVudCwgc28gY29va2llcyBhcmUgY29tbW9ubHkgdXNlZCBmb3Igc2Vzc2lvbiBtYW5hZ2VtZW50LgorICogCisgKiA8cD5BIGNvb2tpZSBoYXMgYSBuYW1lLCBhIHNpbmdsZSB2YWx1ZSwgYW5kIG9wdGlvbmFsIGF0dHJpYnV0ZXMKKyAqIHN1Y2ggYXMgYSBjb21tZW50LCBwYXRoIGFuZCBkb21haW4gcXVhbGlmaWVycywgYSBtYXhpbXVtIGFnZSwgYW5kIGEKKyAqIHZlcnNpb24gbnVtYmVyLiBTb21lIFdlYiBicm93c2VycyBoYXZlIGJ1Z3MgaW4gaG93IHRoZXkgaGFuZGxlIHRoZSAKKyAqIG9wdGlvbmFsIGF0dHJpYnV0ZXMsIHNvIHVzZSB0aGVtIHNwYXJpbmdseSB0byBpbXByb3ZlIHRoZSBpbnRlcm9wZXJhYmlsaXR5IAorICogb2YgeW91ciBzZXJ2bGV0cy4KKyAqCisgKiA8cD5UaGUgc2VydmxldCBzZW5kcyBjb29raWVzIHRvIHRoZSBicm93c2VyIGJ5IHVzaW5nIHRoZQorICoge0BsaW5rIEh0dHBTZXJ2bGV0UmVzcG9uc2UjYWRkQ29va2llfSBtZXRob2QsIHdoaWNoIGFkZHMKKyAqIGZpZWxkcyB0byBIVFRQIHJlc3BvbnNlIGhlYWRlcnMgdG8gc2VuZCBjb29raWVzIHRvIHRoZSAKKyAqIGJyb3dzZXIsIG9uZSBhdCBhIHRpbWUuIFRoZSBicm93c2VyIGlzIGV4cGVjdGVkIHRvIAorICogc3VwcG9ydCAyMCBjb29raWVzIGZvciBlYWNoIFdlYiBzZXJ2ZXIsIDMwMCBjb29raWVzIHRvdGFsLCBhbmQKKyAqIG1heSBsaW1pdCBjb29raWUgc2l6ZSB0byA0IEtCIGVhY2guCisgKiAKKyAqIDxwPlRoZSBicm93c2VyIHJldHVybnMgY29va2llcyB0byB0aGUgc2VydmxldCBieSBhZGRpbmcgCisgKiBmaWVsZHMgdG8gSFRUUCByZXF1ZXN0IGhlYWRlcnMuIENvb2tpZXMgY2FuIGJlIHJldHJpZXZlZAorICogZnJvbSBhIHJlcXVlc3QgYnkgdXNpbmcgdGhlIHtAbGluayBIdHRwU2VydmxldFJlcXVlc3QjZ2V0Q29va2llc30gbWV0aG9kLgorICogU2V2ZXJhbCBjb29raWVzIG1pZ2h0IGhhdmUgdGhlIHNhbWUgbmFtZSBidXQgZGlmZmVyZW50IHBhdGggYXR0cmlidXRlcy4KKyAqIAorICogPHA+Q29va2llcyBhZmZlY3QgdGhlIGNhY2hpbmcgb2YgdGhlIFdlYiBwYWdlcyB0aGF0IHVzZSB0aGVtLiAKKyAqIEhUVFAgMS4wIGRvZXMgbm90IGNhY2hlIHBhZ2VzIHRoYXQgdXNlIGNvb2tpZXMgY3JlYXRlZCB3aXRoCisgKiB0aGlzIGNsYXNzLiBUaGlzIGNsYXNzIGRvZXMgbm90IHN1cHBvcnQgdGhlIGNhY2hlIGNvbnRyb2wKKyAqIGRlZmluZWQgd2l0aCBIVFRQIDEuMS4KKyAqCisgKiA8cD5UaGlzIGNsYXNzIHN1cHBvcnRzIGJvdGggdGhlIFZlcnNpb24gMCAoYnkgTmV0c2NhcGUpIGFuZCBWZXJzaW9uIDEgCisgKiAoYnkgUkZDIDIxMDkpIGNvb2tpZSBzcGVjaWZpY2F0aW9ucy4gQnkgZGVmYXVsdCwgY29va2llcyBhcmUKKyAqIGNyZWF0ZWQgdXNpbmcgVmVyc2lvbiAwIHRvIGVuc3VyZSB0aGUgYmVzdCBpbnRlcm9wZXJhYmlsaXR5LgorICoKKyAqCisgKiBAYXV0aG9yCVZhcmlvdXMKKyAqIEB2ZXJzaW9uCSRWZXJzaW9uJAorICoKKyAqLworCisvLyBYWFggd291bGQgaW1wbGVtZW50IGphdmEuaW8uU2VyaWFsaXphYmxlIHRvbywgYnV0IGNhbid0IGRvIHRoYXQKKy8vIHNvIGxvbmcgYXMgc3VuLnNlcnZsZXQuKiBtdXN0IHJ1biBvbiBvbGRlciBKREsgMS4wMiBKVk1zIHdoaWNoCisvLyBkb24ndCBpbmNsdWRlIHRoYXQgc3VwcG9ydC4KKworcHVibGljIGNsYXNzIENvb2tpZSBpbXBsZW1lbnRzIENsb25lYWJsZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTFNUUklOR19GSUxFID0KKwkiamF2YXguc2VydmxldC5odHRwLkxvY2FsU3RyaW5ncyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgbFN0cmluZ3MgPQorCVJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShMU1RSSU5HX0ZJTEUpOworICAgIAorICAgIC8vCisgICAgLy8gVGhlIHZhbHVlIG9mIHRoZSBjb29raWUgaXRzZWxmLgorICAgIC8vCisgICAgCisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsJLy8gTkFNRT0gLi4uICIkTmFtZSIgc3R5bGUgaXMgcmVzZXJ2ZWQKKyAgICBwcml2YXRlIFN0cmluZyB2YWx1ZTsJLy8gdmFsdWUgb2YgTkFNRQorCisgICAgLy8KKyAgICAvLyBBdHRyaWJ1dGVzIGVuY29kZWQgaW4gdGhlIGhlYWRlcidzIGNvb2tpZSBmaWVsZHMuCisgICAgLy8KKyAgICAKKyAgICBwcml2YXRlIFN0cmluZyBjb21tZW50OwkvLyA7Q29tbWVudD1WQUxVRSAuLi4gZGVzY3JpYmVzIGNvb2tpZSdzIHVzZQorCQkJCS8vIDtEaXNjYXJkIC4uLiBpbXBsaWVkIGJ5IG1heEFnZSA8IDAKKyAgICBwcml2YXRlIFN0cmluZyBkb21haW47CS8vIDtEb21haW49VkFMVUUgLi4uIGRvbWFpbiB0aGF0IHNlZXMgY29va2llCisgICAgcHJpdmF0ZSBpbnQgbWF4QWdlID0gLTE7CS8vIDtNYXgtQWdlPVZBTFVFIC4uLiBjb29raWVzIGF1dG8tZXhwaXJlCisgICAgcHJpdmF0ZSBTdHJpbmcgcGF0aDsJLy8gO1BhdGg9VkFMVUUgLi4uIFVSTHMgdGhhdCBzZWUgdGhlIGNvb2tpZQorICAgIHByaXZhdGUgYm9vbGVhbiBzZWN1cmU7CS8vIDtTZWN1cmUgLi4uIGUuZy4gdXNlIFNTTAorICAgIHByaXZhdGUgaW50IHZlcnNpb24gPSAwOwkvLyA7VmVyc2lvbj0xIC4uLiBtZWFucyBSRkMgMjEwOSsrIHN0eWxlCisgICAgCisgICAgCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgY29va2llIHdpdGggYSBzcGVjaWZpZWQgbmFtZSBhbmQgdmFsdWUuCisgICAgICoKKyAgICAgKiA8cD5UaGUgbmFtZSBtdXN0IGNvbmZvcm0gdG8gUkZDIDIxMDkuIFRoYXQgbWVhbnMgaXQgY2FuIGNvbnRhaW4gCisgICAgICogb25seSBBU0NJSSBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBhbmQgY2Fubm90IGNvbnRhaW4gY29tbWFzLCAKKyAgICAgKiBzZW1pY29sb25zLCBvciB3aGl0ZSBzcGFjZSBvciBiZWdpbiB3aXRoIGEgJCBjaGFyYWN0ZXIuIFRoZSBjb29raWUncworICAgICAqIG5hbWUgY2Fubm90IGJlIGNoYW5nZWQgYWZ0ZXIgY3JlYXRpb24uCisgICAgICoKKyAgICAgKiA8cD5UaGUgdmFsdWUgY2FuIGJlIGFueXRoaW5nIHRoZSBzZXJ2ZXIgY2hvb3NlcyB0byBzZW5kLiBJdHMKKyAgICAgKiB2YWx1ZSBpcyBwcm9iYWJseSBvZiBpbnRlcmVzdCBvbmx5IHRvIHRoZSBzZXJ2ZXIuIFRoZSBjb29raWUncworICAgICAqIHZhbHVlIGNhbiBiZSBjaGFuZ2VkIGFmdGVyIGNyZWF0aW9uIHdpdGggdGhlCisgICAgICogPGNvZGU+c2V0VmFsdWU8L2NvZGU+IG1ldGhvZC4KKyAgICAgKgorICAgICAqIDxwPkJ5IGRlZmF1bHQsIGNvb2tpZXMgYXJlIGNyZWF0ZWQgYWNjb3JkaW5nIHRvIHRoZSBOZXRzY2FwZQorICAgICAqIGNvb2tpZSBzcGVjaWZpY2F0aW9uLiBUaGUgdmVyc2lvbiBjYW4gYmUgY2hhbmdlZCB3aXRoIHRoZSAKKyAgICAgKiA8Y29kZT5zZXRWZXJzaW9uPC9jb2RlPiBtZXRob2QuCisgICAgICoKKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIAkJCWEgPGNvZGU+U3RyaW5nPC9jb2RlPiBzcGVjaWZ5aW5nIHRoZSBuYW1lIG9mIHRoZSBjb29raWUKKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZQkJCWEgPGNvZGU+U3RyaW5nPC9jb2RlPiBzcGVjaWZ5aW5nIHRoZSB2YWx1ZSBvZiB0aGUgY29va2llCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbglpZiB0aGUgY29va2llIG5hbWUgY29udGFpbnMgaWxsZWdhbCBjaGFyYWN0ZXJzCisgICAgICoJCQkJCShmb3IgZXhhbXBsZSwgYSBjb21tYSwgc3BhY2UsIG9yIHNlbWljb2xvbikKKyAgICAgKgkJCQkJb3IgaXQgaXMgb25lIG9mIHRoZSB0b2tlbnMgcmVzZXJ2ZWQgZm9yIHVzZQorICAgICAqCQkJCQlieSB0aGUgY29va2llIHByb3RvY29sCisgICAgICogQHNlZSAjc2V0VmFsdWUKKyAgICAgKiBAc2VlICNzZXRWZXJzaW9uCisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyBDb29raWUoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgeworCWlmICghaXNUb2tlbihuYW1lKQorCQl8fCBuYW1lLmVxdWFsc0lnbm9yZUNhc2UoIkNvbW1lbnQiKQkvLyByZmMyMDE5CisJCXx8IG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiRGlzY2FyZCIpCS8vIDIwMTkrKworCQl8fCBuYW1lLmVxdWFsc0lnbm9yZUNhc2UoIkRvbWFpbiIpCisJCXx8IG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiRXhwaXJlcyIpCS8vIChvbGQgY29va2llcykKKwkJfHwgbmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJNYXgtQWdlIikJLy8gcmZjMjAxOQorCQl8fCBuYW1lLmVxdWFsc0lnbm9yZUNhc2UoIlBhdGgiKQorCQl8fCBuYW1lLmVxdWFsc0lnbm9yZUNhc2UoIlNlY3VyZSIpCisJCXx8IG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiVmVyc2lvbiIpCisJCXx8IG5hbWUuc3RhcnRzV2l0aCgiJCIpCisJICAgICkgeworCSAgICBTdHJpbmcgZXJyTXNnID0gbFN0cmluZ3MuZ2V0U3RyaW5nKCJlcnIuY29va2llX25hbWVfaXNfdG9rZW4iKTsKKwkgICAgT2JqZWN0W10gZXJyQXJncyA9IG5ldyBPYmplY3RbMV07CisJICAgIGVyckFyZ3NbMF0gPSBuYW1lOworCSAgICBlcnJNc2cgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChlcnJNc2csIGVyckFyZ3MpOworCSAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGVyck1zZyk7CisJfQorCisJdGhpcy5uYW1lID0gbmFtZTsKKwl0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgfQorCisKKworCisKKyAgICAvKioKKyAgICAgKgorICAgICAqIFNwZWNpZmllcyBhIGNvbW1lbnQgdGhhdCBkZXNjcmliZXMgYSBjb29raWUncyBwdXJwb3NlLgorICAgICAqIFRoZSBjb21tZW50IGlzIHVzZWZ1bCBpZiB0aGUgYnJvd3NlciBwcmVzZW50cyB0aGUgY29va2llIAorICAgICAqIHRvIHRoZSB1c2VyLiBDb21tZW50cworICAgICAqIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IE5ldHNjYXBlIFZlcnNpb24gMCBjb29raWVzLgorICAgICAqCisgICAgICogQHBhcmFtIHB1cnBvc2UJCWEgPGNvZGU+U3RyaW5nPC9jb2RlPiBzcGVjaWZ5aW5nIHRoZSBjb21tZW50IAorICAgICAqCQkJCXRvIGRpc3BsYXkgdG8gdGhlIHVzZXIKKyAgICAgKgorICAgICAqIEBzZWUgI2dldENvbW1lbnQKKyAgICAgKgorICAgICAqLworCisgICAgcHVibGljIHZvaWQgc2V0Q29tbWVudChTdHJpbmcgcHVycG9zZSkgeworCWNvbW1lbnQgPSBwdXJwb3NlOworICAgIH0KKyAgICAKKyAgICAKKyAgICAKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGNvbW1lbnQgZGVzY3JpYmluZyB0aGUgcHVycG9zZSBvZiB0aGlzIGNvb2tpZSwgb3IKKyAgICAgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgY29va2llIGhhcyBubyBjb21tZW50LgorICAgICAqCisgICAgICogQHJldHVybgkJCWEgPGNvZGU+U3RyaW5nPC9jb2RlPiBjb250YWluaW5nIHRoZSBjb21tZW50LAorICAgICAqCQkJCW9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKKyAgICAgKgorICAgICAqIEBzZWUgI3NldENvbW1lbnQKKyAgICAgKgorICAgICAqLyAKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29tbWVudCgpIHsKKwlyZXR1cm4gY29tbWVudDsKKyAgICB9CisgICAgCisgICAgCisgICAgCisKKworICAgIC8qKgorICAgICAqCisgICAgICogU3BlY2lmaWVzIHRoZSBkb21haW4gd2l0aGluIHdoaWNoIHRoaXMgY29va2llIHNob3VsZCBiZSBwcmVzZW50ZWQuCisgICAgICoKKyAgICAgKiA8cD5UaGUgZm9ybSBvZiB0aGUgZG9tYWluIG5hbWUgaXMgc3BlY2lmaWVkIGJ5IFJGQyAyMTA5LiBBIGRvbWFpbgorICAgICAqIG5hbWUgYmVnaW5zIHdpdGggYSBkb3QgKDxjb2RlPi5mb28uY29tPC9jb2RlPikgYW5kIG1lYW5zIHRoYXQKKyAgICAgKiB0aGUgY29va2llIGlzIHZpc2libGUgdG8gc2VydmVycyBpbiBhIHNwZWNpZmllZCBEb21haW4gTmFtZSBTeXN0ZW0KKyAgICAgKiAoRE5TKSB6b25lIChmb3IgZXhhbXBsZSwgPGNvZGU+d3d3LmZvby5jb208L2NvZGU+LCBidXQgbm90IAorICAgICAqIDxjb2RlPmEuYi5mb28uY29tPC9jb2RlPikuIEJ5IGRlZmF1bHQsIGNvb2tpZXMgYXJlIG9ubHkgcmV0dXJuZWQKKyAgICAgKiB0byB0aGUgc2VydmVyIHRoYXQgc2VudCB0aGVtLgorICAgICAqCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0dGVybgkJYSA8Y29kZT5TdHJpbmc8L2NvZGU+IGNvbnRhaW5pbmcgdGhlIGRvbWFpbiBuYW1lCisgICAgICoJCQkJd2l0aGluIHdoaWNoIHRoaXMgY29va2llIGlzIHZpc2libGU7CisgICAgICoJCQkJZm9ybSBpcyBhY2NvcmRpbmcgdG8gUkZDIDIxMDkKKyAgICAgKgorICAgICAqIEBzZWUgI2dldERvbWFpbgorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgdm9pZCBzZXREb21haW4oU3RyaW5nIHBhdHRlcm4pIHsKKwlkb21haW4gPSBwYXR0ZXJuLnRvTG93ZXJDYXNlKCk7CS8vIElFIGFsbGVnZWRseSBuZWVkcyB0aGlzCisgICAgfQorICAgIAorICAgIAorICAgIAorICAgIAorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZG9tYWluIG5hbWUgc2V0IGZvciB0aGlzIGNvb2tpZS4gVGhlIGZvcm0gb2YgCisgICAgICogdGhlIGRvbWFpbiBuYW1lIGlzIHNldCBieSBSRkMgMjEwOS4KKyAgICAgKgorICAgICAqIEByZXR1cm4JCQlhIDxjb2RlPlN0cmluZzwvY29kZT4gY29udGFpbmluZyB0aGUgZG9tYWluIG5hbWUKKyAgICAgKgorICAgICAqIEBzZWUgI3NldERvbWFpbgorICAgICAqCisgICAgICovIAorCisgICAgcHVibGljIFN0cmluZyBnZXREb21haW4oKSB7CisJcmV0dXJuIGRvbWFpbjsKKyAgICB9CisKKworCisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBtYXhpbXVtIGFnZSBvZiB0aGUgY29va2llIGluIHNlY29uZHMuCisgICAgICoKKyAgICAgKiA8cD5BIHBvc2l0aXZlIHZhbHVlIGluZGljYXRlcyB0aGF0IHRoZSBjb29raWUgd2lsbCBleHBpcmUKKyAgICAgKiBhZnRlciB0aGF0IG1hbnkgc2Vjb25kcyBoYXZlIHBhc3NlZC4gTm90ZSB0aGF0IHRoZSB2YWx1ZSBpcworICAgICAqIHRoZSA8aT5tYXhpbXVtPC9pPiBhZ2Ugd2hlbiB0aGUgY29va2llIHdpbGwgZXhwaXJlLCBub3QgdGhlIGNvb2tpZSdzCisgICAgICogY3VycmVudCBhZ2UuCisgICAgICoKKyAgICAgKiA8cD5BIG5lZ2F0aXZlIHZhbHVlIG1lYW5zCisgICAgICogdGhhdCB0aGUgY29va2llIGlzIG5vdCBzdG9yZWQgcGVyc2lzdGVudGx5IGFuZCB3aWxsIGJlIGRlbGV0ZWQKKyAgICAgKiB3aGVuIHRoZSBXZWIgYnJvd3NlciBleGl0cy4gQSB6ZXJvIHZhbHVlIGNhdXNlcyB0aGUgY29va2llCisgICAgICogdG8gYmUgZGVsZXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBleHBpcnkJCWFuIGludGVnZXIgc3BlY2lmeWluZyB0aGUgbWF4aW11bSBhZ2Ugb2YgdGhlCisgICAgICogCQkJCWNvb2tpZSBpbiBzZWNvbmRzOyBpZiBuZWdhdGl2ZSwgbWVhbnMKKyAgICAgKgkJCQl0aGUgY29va2llIGlzIG5vdCBzdG9yZWQ7IGlmIHplcm8sIGRlbGV0ZXMKKyAgICAgKgkJCQl0aGUgY29va2llCisgICAgICoKKyAgICAgKgorICAgICAqIEBzZWUgI2dldE1heEFnZQorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgdm9pZCBzZXRNYXhBZ2UoaW50IGV4cGlyeSkgeworCW1heEFnZSA9IGV4cGlyeTsKKyAgICB9CisKKworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBtYXhpbXVtIGFnZSBvZiB0aGUgY29va2llLCBzcGVjaWZpZWQgaW4gc2Vjb25kcywKKyAgICAgKiBCeSBkZWZhdWx0LCA8Y29kZT4tMTwvY29kZT4gaW5kaWNhdGluZyB0aGUgY29va2llIHdpbGwgcGVyc2lzdAorICAgICAqIHVudGlsIGJyb3dzZXIgc2h1dGRvd24uCisgICAgICoKKyAgICAgKgorICAgICAqIEByZXR1cm4JCQlhbiBpbnRlZ2VyIHNwZWNpZnlpbmcgdGhlIG1heGltdW0gYWdlIG9mIHRoZQorICAgICAqCQkJCWNvb2tpZSBpbiBzZWNvbmRzOyBpZiBuZWdhdGl2ZSwgbWVhbnMKKyAgICAgKgkJCQl0aGUgY29va2llIHBlcnNpc3RzIHVudGlsIGJyb3dzZXIgc2h1dGRvd24KKyAgICAgKgorICAgICAqCisgICAgICogQHNlZSAjc2V0TWF4QWdlCisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyBpbnQgZ2V0TWF4QWdlKCkgeworCXJldHVybiBtYXhBZ2U7CisgICAgfQorICAgIAorICAgIAorICAgIAorCisgICAgLyoqCisgICAgICogU3BlY2lmaWVzIGEgcGF0aCBmb3IgdGhlIGNvb2tpZQorICAgICAqIHRvIHdoaWNoIHRoZSBjbGllbnQgc2hvdWxkIHJldHVybiB0aGUgY29va2llLgorICAgICAqCisgICAgICogPHA+VGhlIGNvb2tpZSBpcyB2aXNpYmxlIHRvIGFsbCB0aGUgcGFnZXMgaW4gdGhlIGRpcmVjdG9yeQorICAgICAqIHlvdSBzcGVjaWZ5LCBhbmQgYWxsIHRoZSBwYWdlcyBpbiB0aGF0IGRpcmVjdG9yeSdzIHN1YmRpcmVjdG9yaWVzLiAKKyAgICAgKiBBIGNvb2tpZSdzIHBhdGggbXVzdCBpbmNsdWRlIHRoZSBzZXJ2bGV0IHRoYXQgc2V0IHRoZSBjb29raWUsCisgICAgICogZm9yIGV4YW1wbGUsIDxpPi9jYXRhbG9nPC9pPiwgd2hpY2ggbWFrZXMgdGhlIGNvb2tpZQorICAgICAqIHZpc2libGUgdG8gYWxsIGRpcmVjdG9yaWVzIG9uIHRoZSBzZXJ2ZXIgdW5kZXIgPGk+L2NhdGFsb2c8L2k+LgorICAgICAqCisgICAgICogPHA+Q29uc3VsdCBSRkMgMjEwOSAoYXZhaWxhYmxlIG9uIHRoZSBJbnRlcm5ldCkgZm9yIG1vcmUKKyAgICAgKiBpbmZvcm1hdGlvbiBvbiBzZXR0aW5nIHBhdGggbmFtZXMgZm9yIGNvb2tpZXMuCisgICAgICoKKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmkJCWEgPGNvZGU+U3RyaW5nPC9jb2RlPiBzcGVjaWZ5aW5nIGEgcGF0aAorICAgICAqCisgICAgICoKKyAgICAgKiBAc2VlICNnZXRQYXRoCisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIHNldFBhdGgoU3RyaW5nIHVyaSkgeworCXBhdGggPSB1cmk7CisgICAgfQorCisKKworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgcGF0aCBvbiB0aGUgc2VydmVyIAorICAgICAqIHRvIHdoaWNoIHRoZSBicm93c2VyIHJldHVybnMgdGhpcyBjb29raWUuIFRoZQorICAgICAqIGNvb2tpZSBpcyB2aXNpYmxlIHRvIGFsbCBzdWJwYXRocyBvbiB0aGUgc2VydmVyLgorICAgICAqCisgICAgICoKKyAgICAgKiBAcmV0dXJuCQlhIDxjb2RlPlN0cmluZzwvY29kZT4gc3BlY2lmeWluZyBhIHBhdGggdGhhdCBjb250YWlucworICAgICAqCQkJYSBzZXJ2bGV0IG5hbWUsIGZvciBleGFtcGxlLCA8aT4vY2F0YWxvZzwvaT4KKyAgICAgKgorICAgICAqIEBzZWUgI3NldFBhdGgKKyAgICAgKgorICAgICAqLyAKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpIHsKKwlyZXR1cm4gcGF0aDsKKyAgICB9CisKKworCisKKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB0byB0aGUgYnJvd3NlciB3aGV0aGVyIHRoZSBjb29raWUgc2hvdWxkIG9ubHkgYmUgc2VudAorICAgICAqIHVzaW5nIGEgc2VjdXJlIHByb3RvY29sLCBzdWNoIGFzIEhUVFBTIG9yIFNTTC4KKyAgICAgKgorICAgICAqIDxwPlRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPmZhbHNlPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmbGFnCWlmIDxjb2RlPnRydWU8L2NvZGU+LCBzZW5kcyB0aGUgY29va2llIGZyb20gdGhlIGJyb3dzZXIKKyAgICAgKgkJCXRvIHRoZSBzZXJ2ZXIgb25seSB3aGVuIHVzaW5nIGEgc2VjdXJlIHByb3RvY29sOworICAgICAqCQkJaWYgPGNvZGU+ZmFsc2U8L2NvZGU+LCBzZW50IG9uIGFueSBwcm90b2NvbAorICAgICAqCisgICAgICogQHNlZSAjZ2V0U2VjdXJlCisgICAgICoKKyAgICAgKi8KKyAKKyAgICBwdWJsaWMgdm9pZCBzZXRTZWN1cmUoYm9vbGVhbiBmbGFnKSB7CisJc2VjdXJlID0gZmxhZzsKKyAgICB9CisKKworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBicm93c2VyIGlzIHNlbmRpbmcgY29va2llcworICAgICAqIG9ubHkgb3ZlciBhIHNlY3VyZSBwcm90b2NvbCwgb3IgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZQorICAgICAqIGJyb3dzZXIgY2FuIHNlbmQgY29va2llcyB1c2luZyBhbnkgcHJvdG9jb2wuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCQk8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgYnJvd3NlciB1c2VzIGEgc2VjdXJlIHByb3RvY29sOworICAgICAqIAkJCSBvdGhlcndpc2UsIDxjb2RlPnRydWU8L2NvZGU+CisgICAgICoKKyAgICAgKiBAc2VlICNzZXRTZWN1cmUKKyAgICAgKgorICAgICAqLworCisgICAgcHVibGljIGJvb2xlYW4gZ2V0U2VjdXJlKCkgeworCXJldHVybiBzZWN1cmU7CisgICAgfQorCisKKworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBjb29raWUuIFRoZSBuYW1lIGNhbm5vdCBiZSBjaGFuZ2VkIGFmdGVyCisgICAgICogY3JlYXRpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuCQlhIDxjb2RlPlN0cmluZzwvY29kZT4gc3BlY2lmeWluZyB0aGUgY29va2llJ3MgbmFtZQorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJcmV0dXJuIG5hbWU7CisgICAgfQorCisKKworCisKKyAgICAvKioKKyAgICAgKgorICAgICAqIEFzc2lnbnMgYSBuZXcgdmFsdWUgdG8gYSBjb29raWUgYWZ0ZXIgdGhlIGNvb2tpZSBpcyBjcmVhdGVkLgorICAgICAqIElmIHlvdSB1c2UgYSBiaW5hcnkgdmFsdWUsIHlvdSBtYXkgd2FudCB0byB1c2UgQkFTRTY0IGVuY29kaW5nLgorICAgICAqCisgICAgICogPHA+V2l0aCBWZXJzaW9uIDAgY29va2llcywgdmFsdWVzIHNob3VsZCBub3QgY29udGFpbiB3aGl0ZSAKKyAgICAgKiBzcGFjZSwgYnJhY2tldHMsIHBhcmVudGhlc2VzLCBlcXVhbHMgc2lnbnMsIGNvbW1hcywKKyAgICAgKiBkb3VibGUgcXVvdGVzLCBzbGFzaGVzLCBxdWVzdGlvbiBtYXJrcywgYXQgc2lnbnMsIGNvbG9ucywKKyAgICAgKiBhbmQgc2VtaWNvbG9ucy4gRW1wdHkgdmFsdWVzIG1heSBub3QgYmVoYXZlIHRoZSBzYW1lIHdheQorICAgICAqIG9uIGFsbCBicm93c2Vycy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuZXdWYWx1ZQkJYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHNwZWNpZnlpbmcgdGhlIG5ldyB2YWx1ZSAKKyAgICAgKgorICAgICAqCisgICAgICogQHNlZSAjZ2V0VmFsdWUKKyAgICAgKiBAc2VlIENvb2tpZQorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmV3VmFsdWUpIHsKKwl2YWx1ZSA9IG5ld1ZhbHVlOworICAgIH0KKworCisKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBjb29raWUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCQkJYSA8Y29kZT5TdHJpbmc8L2NvZGU+IGNvbnRhaW5pbmcgdGhlIGNvb2tpZSdzCisgICAgICoJCQkJcHJlc2VudCB2YWx1ZQorICAgICAqCisgICAgICogQHNlZSAjc2V0VmFsdWUKKyAgICAgKiBAc2VlIENvb2tpZQorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgeworCXJldHVybiB2YWx1ZTsKKyAgICB9CisKKworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB2ZXJzaW9uIG9mIHRoZSBwcm90b2NvbCB0aGlzIGNvb2tpZSBjb21wbGllcyAKKyAgICAgKiB3aXRoLiBWZXJzaW9uIDEgY29tcGxpZXMgd2l0aCBSRkMgMjEwOSwgCisgICAgICogYW5kIHZlcnNpb24gMCBjb21wbGllcyB3aXRoIHRoZSBvcmlnaW5hbAorICAgICAqIGNvb2tpZSBzcGVjaWZpY2F0aW9uIGRyYWZ0ZWQgYnkgTmV0c2NhcGUuIENvb2tpZXMgcHJvdmlkZWQKKyAgICAgKiBieSBhIGJyb3dzZXIgdXNlIGFuZCBpZGVudGlmeSB0aGUgYnJvd3NlcidzIGNvb2tpZSB2ZXJzaW9uLgorICAgICAqIAorICAgICAqCisgICAgICogQHJldHVybgkJCTAgaWYgdGhlIGNvb2tpZSBjb21wbGllcyB3aXRoIHRoZQorICAgICAqCQkJCW9yaWdpbmFsIE5ldHNjYXBlIHNwZWNpZmljYXRpb247IDEKKyAgICAgKgkJCQlpZiB0aGUgY29va2llIGNvbXBsaWVzIHdpdGggUkZDIDIxMDkKKyAgICAgKgorICAgICAqIEBzZWUgI3NldFZlcnNpb24KKyAgICAgKgorICAgICAqLworCisgICAgcHVibGljIGludCBnZXRWZXJzaW9uKCkgeworCXJldHVybiB2ZXJzaW9uOworICAgIH0KKworCisKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHZlcnNpb24gb2YgdGhlIGNvb2tpZSBwcm90b2NvbCB0aGlzIGNvb2tpZSBjb21wbGllcworICAgICAqIHdpdGguIFZlcnNpb24gMCBjb21wbGllcyB3aXRoIHRoZSBvcmlnaW5hbCBOZXRzY2FwZSBjb29raWUKKyAgICAgKiBzcGVjaWZpY2F0aW9uLiBWZXJzaW9uIDEgY29tcGxpZXMgd2l0aCBSRkMgMjEwOS4KKyAgICAgKgorICAgICAqIDxwPlNpbmNlIFJGQyAyMTA5IGlzIHN0aWxsIHNvbWV3aGF0IG5ldywgY29uc2lkZXIKKyAgICAgKiB2ZXJzaW9uIDEgYXMgZXhwZXJpbWVudGFsOyBkbyBub3QgdXNlIGl0IHlldCBvbiBwcm9kdWN0aW9uIHNpdGVzLgorICAgICAqCisgICAgICoKKyAgICAgKiBAcGFyYW0gdgkJCTAgaWYgdGhlIGNvb2tpZSBzaG91bGQgY29tcGx5IHdpdGggCisgICAgICoJCQkJdGhlIG9yaWdpbmFsIE5ldHNjYXBlIHNwZWNpZmljYXRpb247CisgICAgICoJCQkJMSBpZiB0aGUgY29va2llIHNob3VsZCBjb21wbHkgd2l0aCBSRkMgMjEwOQorICAgICAqCisgICAgICogQHNlZSAjZ2V0VmVyc2lvbgorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgdm9pZCBzZXRWZXJzaW9uKGludCB2KSB7CisJdmVyc2lvbiA9IHY7CisgICAgfQorCisgICAgLy8gTm90ZSAtLSBkaXNhYmxlZCBmb3Igbm93IHRvIGFsbG93IGZ1bGwgTmV0c2NhcGUgY29tcGF0aWJpbGl0eQorICAgIC8vIGZyb20gUkZDIDIwNjgsIHRva2VuIHNwZWNpYWwgY2FzZSBjaGFyYWN0ZXJzCisgICAgLy8gCisgICAgLy8gcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHRzcGVjaWFscyA9ICIoKTw+QCw7OlxcXCIvW10/PXt9IFx0IjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyB0c3BlY2lhbHMgPSAiLDsgIjsKKyAgICAKKyAgICAKKyAgICAKKworICAgIC8qCisgICAgICogVGVzdHMgYSBzdHJpbmcgYW5kIHJldHVybnMgdHJ1ZSBpZiB0aGUgc3RyaW5nIGNvdW50cyBhcyBhIAorICAgICAqIHJlc2VydmVkIHRva2VuIGluIHRoZSBKYXZhIGxhbmd1YWdlLgorICAgICAqIAorICAgICAqIEBwYXJhbSB2YWx1ZQkJdGhlIDxjb2RlPlN0cmluZzwvY29kZT4gdG8gYmUgdGVzdGVkCisgICAgICoKKyAgICAgKiBAcmV0dXJuCQkJPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIDxjb2RlPlN0cmluZzwvY29kZT4gaXMKKyAgICAgKgkJCQlhIHJlc2VydmVkIHRva2VuOyA8Y29kZT5mYWxzZTwvY29kZT4KKyAgICAgKgkJCQlpZiBpdCBpcyBub3QJCQkKKyAgICAgKi8KKworICAgIHByaXZhdGUgYm9vbGVhbiBpc1Rva2VuKFN0cmluZyB2YWx1ZSkgeworCWludCBsZW4gPSB2YWx1ZS5sZW5ndGgoKTsKKworCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkgICAgY2hhciBjID0gdmFsdWUuY2hhckF0KGkpOworCisJICAgIGlmIChjIDwgMHgyMCB8fCBjID49IDB4N2YgfHwgdHNwZWNpYWxzLmluZGV4T2YoYykgIT0gLTEpCisJCXJldHVybiBmYWxzZTsKKwl9CisJcmV0dXJuIHRydWU7CisgICAgfQorCisKKworCisKKworICAgIC8qKgorICAgICAqCisgICAgICogT3ZlcnJpZGVzIHRoZSBzdGFuZGFyZCA8Y29kZT5qYXZhLmxhbmcuT2JqZWN0LmNsb25lPC9jb2RlPiAKKyAgICAgKiBtZXRob2QgdG8gcmV0dXJuIGEgY29weSBvZiB0aGlzIGNvb2tpZS4KKyAgICAgKgkJCisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyBPYmplY3QgY2xvbmUoKSB7CisJdHJ5IHsKKwkgICAgcmV0dXJuIHN1cGVyLmNsb25lKCk7CisJfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZSkgeworCSAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisJfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvaHR0cC9IdHRwU2VydmxldC5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvaHR0cC9IdHRwU2VydmxldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4NDc5YjkKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9odHRwL0h0dHBTZXJ2bGV0LmphdmEKQEAgLTAsMCArMSwxMDE4IEBACisvKgorKiBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCitwYWNrYWdlIGphdmF4LnNlcnZsZXQuaHR0cDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuR2VuZXJpY1NlcnZsZXQ7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldE91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldFJlc3BvbnNlOworCisKKy8qKgorICoKKyAqIFByb3ZpZGVzIGFuIGFic3RyYWN0IGNsYXNzIHRvIGJlIHN1YmNsYXNzZWQgdG8gY3JlYXRlCisgKiBhbiBIVFRQIHNlcnZsZXQgc3VpdGFibGUgZm9yIGEgV2ViIHNpdGUuIEEgc3ViY2xhc3Mgb2YKKyAqIDxjb2RlPkh0dHBTZXJ2bGV0PC9jb2RlPiBtdXN0IG92ZXJyaWRlIGF0IGxlYXN0IAorICogb25lIG1ldGhvZCwgdXN1YWxseSBvbmUgb2YgdGhlc2U6CisgKgorICogPHVsPgorICogPGxpPiA8Y29kZT5kb0dldDwvY29kZT4sIGlmIHRoZSBzZXJ2bGV0IHN1cHBvcnRzIEhUVFAgR0VUIHJlcXVlc3RzCisgKiA8bGk+IDxjb2RlPmRvUG9zdDwvY29kZT4sIGZvciBIVFRQIFBPU1QgcmVxdWVzdHMKKyAqIDxsaT4gPGNvZGU+ZG9QdXQ8L2NvZGU+LCBmb3IgSFRUUCBQVVQgcmVxdWVzdHMKKyAqIDxsaT4gPGNvZGU+ZG9EZWxldGU8L2NvZGU+LCBmb3IgSFRUUCBERUxFVEUgcmVxdWVzdHMKKyAqIDxsaT4gPGNvZGU+aW5pdDwvY29kZT4gYW5kIDxjb2RlPmRlc3Ryb3k8L2NvZGU+LCAKKyAqIHRvIG1hbmFnZSByZXNvdXJjZXMgdGhhdCBhcmUgaGVsZCBmb3IgdGhlIGxpZmUgb2YgdGhlIHNlcnZsZXQKKyAqIDxsaT4gPGNvZGU+Z2V0U2VydmxldEluZm88L2NvZGU+LCB3aGljaCB0aGUgc2VydmxldCB1c2VzIHRvCisgKiBwcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IGl0c2VsZiAKKyAqIDwvdWw+CisgKgorICogPHA+VGhlcmUncyBhbG1vc3Qgbm8gcmVhc29uIHRvIG92ZXJyaWRlIHRoZSA8Y29kZT5zZXJ2aWNlPC9jb2RlPgorICogbWV0aG9kLiA8Y29kZT5zZXJ2aWNlPC9jb2RlPiBoYW5kbGVzIHN0YW5kYXJkIEhUVFAKKyAqIHJlcXVlc3RzIGJ5IGRpc3BhdGNoaW5nIHRoZW0gdG8gdGhlIGhhbmRsZXIgbWV0aG9kcworICogZm9yIGVhY2ggSFRUUCByZXF1ZXN0IHR5cGUgKHRoZSA8Y29kZT5kbzwvY29kZT48aT5YWFg8L2k+CisgKiBtZXRob2RzIGxpc3RlZCBhYm92ZSkuCisgKgorICogPHA+TGlrZXdpc2UsIHRoZXJlJ3MgYWxtb3N0IG5vIHJlYXNvbiB0byBvdmVycmlkZSB0aGUgCisgKiA8Y29kZT5kb09wdGlvbnM8L2NvZGU+IGFuZCA8Y29kZT5kb1RyYWNlPC9jb2RlPiBtZXRob2RzLgorICogCisgKiA8cD5TZXJ2bGV0cyB0eXBpY2FsbHkgcnVuIG9uIG11bHRpdGhyZWFkZWQgc2VydmVycywKKyAqIHNvIGJlIGF3YXJlIHRoYXQgYSBzZXJ2bGV0IG11c3QgaGFuZGxlIGNvbmN1cnJlbnQKKyAqIHJlcXVlc3RzIGFuZCBiZSBjYXJlZnVsIHRvIHN5bmNocm9uaXplIGFjY2VzcyB0byBzaGFyZWQgcmVzb3VyY2VzLgorICogU2hhcmVkIHJlc291cmNlcyBpbmNsdWRlIGluLW1lbW9yeSBkYXRhIHN1Y2ggYXMKKyAqIGluc3RhbmNlIG9yIGNsYXNzIHZhcmlhYmxlcyBhbmQgZXh0ZXJuYWwgb2JqZWN0cworICogc3VjaCBhcyBmaWxlcywgZGF0YWJhc2UgY29ubmVjdGlvbnMsIGFuZCBuZXR3b3JrIAorICogY29ubmVjdGlvbnMuCisgKiBTZWUgdGhlCisgKiA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL1Nlcmllcy9UdXRvcmlhbC9qYXZhL3RocmVhZHMvbXVsdGl0aHJlYWRlZC5odG1sIj4KKyAqIEphdmEgVHV0b3JpYWwgb24gTXVsdGl0aHJlYWRlZCBQcm9ncmFtbWluZzwvYT4gZm9yIG1vcmUKKyAqIGluZm9ybWF0aW9uIG9uIGhhbmRsaW5nIG11bHRpcGxlIHRocmVhZHMgaW4gYSBKYXZhIHByb2dyYW0uCisgKgorICogQGF1dGhvcglWYXJpb3VzCisgKiBAdmVyc2lvbgkkVmVyc2lvbiQKKyAqCisgKi8KKworCisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBIdHRwU2VydmxldCBleHRlbmRzIEdlbmVyaWNTZXJ2bGV0CisgICAgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZQoreworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfREVMRVRFID0gIkRFTEVURSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRF9IRUFEID0gIkhFQUQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfR0VUID0gIkdFVCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRF9PUFRJT05TID0gIk9QVElPTlMiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfUE9TVCA9ICJQT1NUIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9EX1BVVCA9ICJQVVQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfVFJBQ0UgPSAiVFJBQ0UiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9JRk1PRFNJTkNFID0gIklmLU1vZGlmaWVkLVNpbmNlIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0xBU1RNT0QgPSAiTGFzdC1Nb2RpZmllZCI7CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExTVFJJTkdfRklMRSA9CisJImphdmF4LnNlcnZsZXQuaHR0cC5Mb2NhbFN0cmluZ3MiOworICAgIHByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIGxTdHJpbmdzID0KKwlSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoTFNUUklOR19GSUxFKTsKKyAgIAorICAgCisgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBEb2VzIG5vdGhpbmcsIGJlY2F1c2UgdGhpcyBpcyBhbiBhYnN0cmFjdCBjbGFzcy4KKyAgICAgKiAKKyAgICAgKi8KKworICAgIHB1YmxpYyBIdHRwU2VydmxldCgpIHsgfQorICAgIAorICAgIAorCisgICAgLyoqCisgICAgICoKKyAgICAgKiBDYWxsZWQgYnkgdGhlIHNlcnZlciAodmlhIHRoZSA8Y29kZT5zZXJ2aWNlPC9jb2RlPiBtZXRob2QpIHRvCisgICAgICogYWxsb3cgYSBzZXJ2bGV0IHRvIGhhbmRsZSBhIEdFVCByZXF1ZXN0LiAKKyAgICAgKgorICAgICAqIDxwPk92ZXJyaWRpbmcgdGhpcyBtZXRob2QgdG8gc3VwcG9ydCBhIEdFVCByZXF1ZXN0IGFsc28KKyAgICAgKiBhdXRvbWF0aWNhbGx5IHN1cHBvcnRzIGFuIEhUVFAgSEVBRCByZXF1ZXN0LiBBIEhFQUQKKyAgICAgKiByZXF1ZXN0IGlzIGEgR0VUIHJlcXVlc3QgdGhhdCByZXR1cm5zIG5vIGJvZHkgaW4gdGhlCisgICAgICogcmVzcG9uc2UsIG9ubHkgdGhlIHJlcXVlc3QgaGVhZGVyIGZpZWxkcy4KKyAgICAgKgorICAgICAqIDxwPldoZW4gb3ZlcnJpZGluZyB0aGlzIG1ldGhvZCwgcmVhZCB0aGUgcmVxdWVzdCBkYXRhLAorICAgICAqIHdyaXRlIHRoZSByZXNwb25zZSBoZWFkZXJzLCBnZXQgdGhlIHJlc3BvbnNlJ3Mgd3JpdGVyIG9yIAorICAgICAqIG91dHB1dCBzdHJlYW0gb2JqZWN0LCBhbmQgZmluYWxseSwgd3JpdGUgdGhlIHJlc3BvbnNlIGRhdGEuCisgICAgICogSXQncyBiZXN0IHRvIGluY2x1ZGUgY29udGVudCB0eXBlIGFuZCBlbmNvZGluZy4gV2hlbiB1c2luZworICAgICAqIGEgPGNvZGU+UHJpbnRXcml0ZXI8L2NvZGU+IG9iamVjdCB0byByZXR1cm4gdGhlIHJlc3BvbnNlLAorICAgICAqIHNldCB0aGUgY29udGVudCB0eXBlIGJlZm9yZSBhY2Nlc3NpbmcgdGhlCisgICAgICogPGNvZGU+UHJpbnRXcml0ZXI8L2NvZGU+IG9iamVjdC4KKyAgICAgKgorICAgICAqIDxwPlRoZSBzZXJ2bGV0IGNvbnRhaW5lciBtdXN0IHdyaXRlIHRoZSBoZWFkZXJzIGJlZm9yZQorICAgICAqIGNvbW1pdHRpbmcgdGhlIHJlc3BvbnNlLCBiZWNhdXNlIGluIEhUVFAgdGhlIGhlYWRlcnMgbXVzdCBiZSBzZW50CisgICAgICogYmVmb3JlIHRoZSByZXNwb25zZSBib2R5LgorICAgICAqCisgICAgICogPHA+V2hlcmUgcG9zc2libGUsIHNldCB0aGUgQ29udGVudC1MZW5ndGggaGVhZGVyICh3aXRoIHRoZQorICAgICAqIHtAbGluayBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXNwb25zZSNzZXRDb250ZW50TGVuZ3RofSBtZXRob2QpLAorICAgICAqIHRvIGFsbG93IHRoZSBzZXJ2bGV0IGNvbnRhaW5lciB0byB1c2UgYSBwZXJzaXN0ZW50IGNvbm5lY3Rpb24gCisgICAgICogdG8gcmV0dXJuIGl0cyByZXNwb25zZSB0byB0aGUgY2xpZW50LCBpbXByb3ZpbmcgcGVyZm9ybWFuY2UuCisgICAgICogVGhlIGNvbnRlbnQgbGVuZ3RoIGlzIGF1dG9tYXRpY2FsbHkgc2V0IGlmIHRoZSBlbnRpcmUgcmVzcG9uc2UgZml0cworICAgICAqIGluc2lkZSB0aGUgcmVzcG9uc2UgYnVmZmVyLgorICAgICAqCisgICAgICogPHA+V2hlbiB1c2luZyBIVFRQIDEuMSBjaHVua2VkIGVuY29kaW5nICh3aGljaCBtZWFucyB0aGF0IHRoZSByZXNwb25zZQorICAgICAqIGhhcyBhIFRyYW5zZmVyLUVuY29kaW5nIGhlYWRlciksIGRvIG5vdCBzZXQgdGhlIENvbnRlbnQtTGVuZ3RoIGhlYWRlci4KKyAgICAgKgorICAgICAqIDxwPlRoZSBHRVQgbWV0aG9kIHNob3VsZCBiZSBzYWZlLCB0aGF0IGlzLCB3aXRob3V0CisgICAgICogYW55IHNpZGUgZWZmZWN0cyBmb3Igd2hpY2ggdXNlcnMgYXJlIGhlbGQgcmVzcG9uc2libGUuCisgICAgICogRm9yIGV4YW1wbGUsIG1vc3QgZm9ybSBxdWVyaWVzIGhhdmUgbm8gc2lkZSBlZmZlY3RzLgorICAgICAqIElmIGEgY2xpZW50IHJlcXVlc3QgaXMgaW50ZW5kZWQgdG8gY2hhbmdlIHN0b3JlZCBkYXRhLAorICAgICAqIHRoZSByZXF1ZXN0IHNob3VsZCB1c2Ugc29tZSBvdGhlciBIVFRQIG1ldGhvZC4KKyAgICAgKgorICAgICAqIDxwPlRoZSBHRVQgbWV0aG9kIHNob3VsZCBhbHNvIGJlIGlkZW1wb3RlbnQsIG1lYW5pbmcKKyAgICAgKiB0aGF0IGl0IGNhbiBiZSBzYWZlbHkgcmVwZWF0ZWQuIFNvbWV0aW1lcyBtYWtpbmcgYQorICAgICAqIG1ldGhvZCBzYWZlIGFsc28gbWFrZXMgaXQgaWRlbXBvdGVudC4gRm9yIGV4YW1wbGUsIAorICAgICAqIHJlcGVhdGluZyBxdWVyaWVzIGlzIGJvdGggc2FmZSBhbmQgaWRlbXBvdGVudCwgYnV0CisgICAgICogYnV5aW5nIGEgcHJvZHVjdCBvbmxpbmUgb3IgbW9kaWZ5aW5nIGRhdGEgaXMgbmVpdGhlcgorICAgICAqIHNhZmUgbm9yIGlkZW1wb3RlbnQuIAorICAgICAqCisgICAgICogPHA+SWYgdGhlIHJlcXVlc3QgaXMgaW5jb3JyZWN0bHkgZm9ybWF0dGVkLCA8Y29kZT5kb0dldDwvY29kZT4KKyAgICAgKiByZXR1cm5zIGFuIEhUVFAgIkJhZCBSZXF1ZXN0IiBtZXNzYWdlLgorICAgICAqIAorICAgICAqCisgICAgICogQHBhcmFtIHJlcQlhbiB7QGxpbmsgSHR0cFNlcnZsZXRSZXF1ZXN0fSBvYmplY3QgdGhhdAorICAgICAqCQkJY29udGFpbnMgdGhlIHJlcXVlc3QgdGhlIGNsaWVudCBoYXMgbWFkZQorICAgICAqCQkJb2YgdGhlIHNlcnZsZXQKKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNwCWFuIHtAbGluayBIdHRwU2VydmxldFJlc3BvbnNlfSBvYmplY3QgdGhhdAorICAgICAqCQkJY29udGFpbnMgdGhlIHJlc3BvbnNlIHRoZSBzZXJ2bGV0IHNlbmRzCisgICAgICoJCQl0byB0aGUgY2xpZW50CisgICAgICogCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbglpZiBhbiBpbnB1dCBvciBvdXRwdXQgZXJyb3IgaXMgCisgICAgICoJCQkJZGV0ZWN0ZWQgd2hlbiB0aGUgc2VydmxldCBoYW5kbGVzCisgICAgICoJCQkJdGhlIEdFVCByZXF1ZXN0CisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24JaWYgdGhlIHJlcXVlc3QgZm9yIHRoZSBHRVQKKyAgICAgKgkJCQkJY291bGQgbm90IGJlIGhhbmRsZWQKKyAgICAgKgorICAgICAqIAorICAgICAqIEBzZWUgamF2YXguc2VydmxldC5TZXJ2bGV0UmVzcG9uc2Ujc2V0Q29udGVudFR5cGUKKyAgICAgKgorICAgICAqLworCisgICAgcHJvdGVjdGVkIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwKQorCXRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgorICAgIHsKKwlTdHJpbmcgcHJvdG9jb2wgPSByZXEuZ2V0UHJvdG9jb2woKTsKKwlTdHJpbmcgbXNnID0gbFN0cmluZ3MuZ2V0U3RyaW5nKCJodHRwLm1ldGhvZF9nZXRfbm90X3N1cHBvcnRlZCIpOworCWlmIChwcm90b2NvbC5lbmRzV2l0aCgiMS4xIikpIHsKKwkgICAgcmVzcC5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19NRVRIT0RfTk9UX0FMTE9XRUQsIG1zZyk7CisJfSBlbHNlIHsKKwkgICAgcmVzcC5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19CQURfUkVRVUVTVCwgbXNnKTsKKwl9CisgICAgfQorCisKKworCisKKyAgICAvKioKKyAgICAgKgorICAgICAqIFJldHVybnMgdGhlIHRpbWUgdGhlIDxjb2RlPkh0dHBTZXJ2bGV0UmVxdWVzdDwvY29kZT4KKyAgICAgKiBvYmplY3Qgd2FzIGxhc3QgbW9kaWZpZWQsCisgICAgICogaW4gbWlsbGlzZWNvbmRzIHNpbmNlIG1pZG5pZ2h0IEphbnVhcnkgMSwgMTk3MCBHTVQuCisgICAgICogSWYgdGhlIHRpbWUgaXMgdW5rbm93biwgdGhpcyBtZXRob2QgcmV0dXJucyBhIG5lZ2F0aXZlCisgICAgICogbnVtYmVyICh0aGUgZGVmYXVsdCkuCisgICAgICoKKyAgICAgKiA8cD5TZXJ2bGV0cyB0aGF0IHN1cHBvcnQgSFRUUCBHRVQgcmVxdWVzdHMgYW5kIGNhbiBxdWlja2x5IGRldGVybWluZQorICAgICAqIHRoZWlyIGxhc3QgbW9kaWZpY2F0aW9uIHRpbWUgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgorICAgICAqIFRoaXMgbWFrZXMgYnJvd3NlciBhbmQgcHJveHkgY2FjaGVzIHdvcmsgbW9yZSBlZmZlY3RpdmVseSwKKyAgICAgKiByZWR1Y2luZyB0aGUgbG9hZCBvbiBzZXJ2ZXIgYW5kIG5ldHdvcmsgcmVzb3VyY2VzLgorICAgICAqCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxCXRoZSA8Y29kZT5IdHRwU2VydmxldFJlcXVlc3Q8L2NvZGU+IAorICAgICAqCQkJb2JqZWN0IHRoYXQgaXMgc2VudCB0byB0aGUgc2VydmxldAorICAgICAqCisgICAgICogQHJldHVybgkJYSA8Y29kZT5sb25nPC9jb2RlPiBpbnRlZ2VyIHNwZWNpZnlpbmcKKyAgICAgKgkJCXRoZSB0aW1lIHRoZSA8Y29kZT5IdHRwU2VydmxldFJlcXVlc3Q8L2NvZGU+CisgICAgICoJCQlvYmplY3Qgd2FzIGxhc3QgbW9kaWZpZWQsIGluIG1pbGxpc2Vjb25kcworICAgICAqCQkJc2luY2UgbWlkbmlnaHQsIEphbnVhcnkgMSwgMTk3MCBHTVQsIG9yCisgICAgICoJCQktMSBpZiB0aGUgdGltZSBpcyBub3Qga25vd24KKyAgICAgKgorICAgICAqLworCisgICAgcHJvdGVjdGVkIGxvbmcgZ2V0TGFzdE1vZGlmaWVkKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEpIHsKKwlyZXR1cm4gLTE7CisgICAgfQorCisKKworCisgICAgLyoqCisgICAgICogCisgICAgICoKKyAgICAgKiA8cD5SZWNlaXZlcyBhbiBIVFRQIEhFQUQgcmVxdWVzdCBmcm9tIHRoZSBwcm90ZWN0ZWQKKyAgICAgKiA8Y29kZT5zZXJ2aWNlPC9jb2RlPiBtZXRob2QgYW5kIGhhbmRsZXMgdGhlCisgICAgICogcmVxdWVzdC4KKyAgICAgKiBUaGUgY2xpZW50IHNlbmRzIGEgSEVBRCByZXF1ZXN0IHdoZW4gaXQgd2FudHMKKyAgICAgKiB0byBzZWUgb25seSB0aGUgaGVhZGVycyBvZiBhIHJlc3BvbnNlLCBzdWNoIGFzCisgICAgICogQ29udGVudC1UeXBlIG9yIENvbnRlbnQtTGVuZ3RoLiBUaGUgSFRUUCBIRUFECisgICAgICogbWV0aG9kIGNvdW50cyB0aGUgb3V0cHV0IGJ5dGVzIGluIHRoZSByZXNwb25zZQorICAgICAqIHRvIHNldCB0aGUgQ29udGVudC1MZW5ndGggaGVhZGVyIGFjY3VyYXRlbHkuCisgICAgICoKKyAgICAgKiA8cD5JZiB5b3Ugb3ZlcnJpZGUgdGhpcyBtZXRob2QsIHlvdSBjYW4gYXZvaWQgY29tcHV0aW5nCisgICAgICogdGhlIHJlc3BvbnNlIGJvZHkgYW5kIGp1c3Qgc2V0IHRoZSByZXNwb25zZSBoZWFkZXJzCisgICAgICogZGlyZWN0bHkgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZS4gTWFrZSBzdXJlIHRoYXQgdGhlCisgICAgICogPGNvZGU+ZG9IZWFkPC9jb2RlPiBtZXRob2QgeW91IHdyaXRlIGlzIGJvdGggc2FmZQorICAgICAqIGFuZCBpZGVtcG90ZW50ICh0aGF0IGlzLCBwcm90ZWN0cyBpdHNlbGYgZnJvbSBiZWluZworICAgICAqIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBmb3Igb25lIEhUVFAgSEVBRCByZXF1ZXN0KS4KKyAgICAgKgorICAgICAqIDxwPklmIHRoZSBIVFRQIEhFQUQgcmVxdWVzdCBpcyBpbmNvcnJlY3RseSBmb3JtYXR0ZWQsCisgICAgICogPGNvZGU+ZG9IZWFkPC9jb2RlPiByZXR1cm5zIGFuIEhUVFAgIkJhZCBSZXF1ZXN0IgorICAgICAqIG1lc3NhZ2UuCisgICAgICoKKyAgICAgKgorICAgICAqIEBwYXJhbSByZXEJdGhlIHJlcXVlc3Qgb2JqZWN0IHRoYXQgaXMgcGFzc2VkCisgICAgICoJCQl0byB0aGUgc2VydmxldAorICAgICAqCQkJCisgICAgICogQHBhcmFtIHJlc3AJdGhlIHJlc3BvbnNlIG9iamVjdCB0aGF0IHRoZSBzZXJ2bGV0CisgICAgICoJCQl1c2VzIHRvIHJldHVybiB0aGUgaGVhZGVycyB0byB0aGUgY2xpZW4KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24JCWlmIGFuIGlucHV0IG9yIG91dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbglpZiB0aGUgcmVxdWVzdCBmb3IgdGhlIEhFQUQKKyAgICAgKgkJCQkJY291bGQgbm90IGJlIGhhbmRsZWQKKyAgICAgKi8KKworICAgIHByb3RlY3RlZCB2b2lkIGRvSGVhZChIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3ApCisJdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uCisgICAgeworCU5vQm9keVJlc3BvbnNlIHJlc3BvbnNlID0gbmV3IE5vQm9keVJlc3BvbnNlKHJlc3ApOworCQorCWRvR2V0KHJlcSwgcmVzcG9uc2UpOworCXJlc3BvbnNlLnNldENvbnRlbnRMZW5ndGgoKTsKKyAgICB9CisgICAgCisKKworCisKKyAgICAvKioKKyAgICAgKgorICAgICAqIENhbGxlZCBieSB0aGUgc2VydmVyICh2aWEgdGhlIDxjb2RlPnNlcnZpY2U8L2NvZGU+IG1ldGhvZCkKKyAgICAgKiB0byBhbGxvdyBhIHNlcnZsZXQgdG8gaGFuZGxlIGEgUE9TVCByZXF1ZXN0LgorICAgICAqCisgICAgICogVGhlIEhUVFAgUE9TVCBtZXRob2QgYWxsb3dzIHRoZSBjbGllbnQgdG8gc2VuZAorICAgICAqIGRhdGEgb2YgdW5saW1pdGVkIGxlbmd0aCB0byB0aGUgV2ViIHNlcnZlciBhIHNpbmdsZSB0aW1lCisgICAgICogYW5kIGlzIHVzZWZ1bCB3aGVuIHBvc3RpbmcgaW5mb3JtYXRpb24gc3VjaCBhcworICAgICAqIGNyZWRpdCBjYXJkIG51bWJlcnMuCisgICAgICoKKyAgICAgKiA8cD5XaGVuIG92ZXJyaWRpbmcgdGhpcyBtZXRob2QsIHJlYWQgdGhlIHJlcXVlc3QgZGF0YSwKKyAgICAgKiB3cml0ZSB0aGUgcmVzcG9uc2UgaGVhZGVycywgZ2V0IHRoZSByZXNwb25zZSdzIHdyaXRlciBvciBvdXRwdXQKKyAgICAgKiBzdHJlYW0gb2JqZWN0LCBhbmQgZmluYWxseSwgd3JpdGUgdGhlIHJlc3BvbnNlIGRhdGEuIEl0J3MgYmVzdCAKKyAgICAgKiB0byBpbmNsdWRlIGNvbnRlbnQgdHlwZSBhbmQgZW5jb2RpbmcuIFdoZW4gdXNpbmcgYQorICAgICAqIDxjb2RlPlByaW50V3JpdGVyPC9jb2RlPiBvYmplY3QgdG8gcmV0dXJuIHRoZSByZXNwb25zZSwgc2V0IHRoZSAKKyAgICAgKiBjb250ZW50IHR5cGUgYmVmb3JlIGFjY2Vzc2luZyB0aGUgPGNvZGU+UHJpbnRXcml0ZXI8L2NvZGU+IG9iamVjdC4gCisgICAgICoKKyAgICAgKiA8cD5UaGUgc2VydmxldCBjb250YWluZXIgbXVzdCB3cml0ZSB0aGUgaGVhZGVycyBiZWZvcmUgY29tbWl0dGluZyB0aGUKKyAgICAgKiByZXNwb25zZSwgYmVjYXVzZSBpbiBIVFRQIHRoZSBoZWFkZXJzIG11c3QgYmUgc2VudCBiZWZvcmUgdGhlIAorICAgICAqIHJlc3BvbnNlIGJvZHkuCisgICAgICoKKyAgICAgKiA8cD5XaGVyZSBwb3NzaWJsZSwgc2V0IHRoZSBDb250ZW50LUxlbmd0aCBoZWFkZXIgKHdpdGggdGhlCisgICAgICoge0BsaW5rIGphdmF4LnNlcnZsZXQuU2VydmxldFJlc3BvbnNlI3NldENvbnRlbnRMZW5ndGh9IG1ldGhvZCksCisgICAgICogdG8gYWxsb3cgdGhlIHNlcnZsZXQgY29udGFpbmVyIHRvIHVzZSBhIHBlcnNpc3RlbnQgY29ubmVjdGlvbiAKKyAgICAgKiB0byByZXR1cm4gaXRzIHJlc3BvbnNlIHRvIHRoZSBjbGllbnQsIGltcHJvdmluZyBwZXJmb3JtYW5jZS4KKyAgICAgKiBUaGUgY29udGVudCBsZW5ndGggaXMgYXV0b21hdGljYWxseSBzZXQgaWYgdGhlIGVudGlyZSByZXNwb25zZSBmaXRzCisgICAgICogaW5zaWRlIHRoZSByZXNwb25zZSBidWZmZXIuICAKKyAgICAgKgorICAgICAqIDxwPldoZW4gdXNpbmcgSFRUUCAxLjEgY2h1bmtlZCBlbmNvZGluZyAod2hpY2ggbWVhbnMgdGhhdCB0aGUgcmVzcG9uc2UKKyAgICAgKiBoYXMgYSBUcmFuc2Zlci1FbmNvZGluZyBoZWFkZXIpLCBkbyBub3Qgc2V0IHRoZSBDb250ZW50LUxlbmd0aCBoZWFkZXIuIAorICAgICAqCisgICAgICogPHA+VGhpcyBtZXRob2QgZG9lcyBub3QgbmVlZCB0byBiZSBlaXRoZXIgc2FmZSBvciBpZGVtcG90ZW50LgorICAgICAqIE9wZXJhdGlvbnMgcmVxdWVzdGVkIHRocm91Z2ggUE9TVCBjYW4gaGF2ZSBzaWRlIGVmZmVjdHMgZm9yCisgICAgICogd2hpY2ggdGhlIHVzZXIgY2FuIGJlIGhlbGQgYWNjb3VudGFibGUsIGZvciBleGFtcGxlLCAKKyAgICAgKiB1cGRhdGluZyBzdG9yZWQgZGF0YSBvciBidXlpbmcgaXRlbXMgb25saW5lLgorICAgICAqCisgICAgICogPHA+SWYgdGhlIEhUVFAgUE9TVCByZXF1ZXN0IGlzIGluY29ycmVjdGx5IGZvcm1hdHRlZCwKKyAgICAgKiA8Y29kZT5kb1Bvc3Q8L2NvZGU+IHJldHVybnMgYW4gSFRUUCAiQmFkIFJlcXVlc3QiIG1lc3NhZ2UuCisgICAgICoKKyAgICAgKgorICAgICAqIEBwYXJhbSByZXEJYW4ge0BsaW5rIEh0dHBTZXJ2bGV0UmVxdWVzdH0gb2JqZWN0IHRoYXQKKyAgICAgKgkJCWNvbnRhaW5zIHRoZSByZXF1ZXN0IHRoZSBjbGllbnQgaGFzIG1hZGUKKyAgICAgKgkJCW9mIHRoZSBzZXJ2bGV0CisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzcAlhbiB7QGxpbmsgSHR0cFNlcnZsZXRSZXNwb25zZX0gb2JqZWN0IHRoYXQKKyAgICAgKgkJCWNvbnRhaW5zIHRoZSByZXNwb25zZSB0aGUgc2VydmxldCBzZW5kcworICAgICAqCQkJdG8gdGhlIGNsaWVudAorICAgICAqIAorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24JaWYgYW4gaW5wdXQgb3Igb3V0cHV0IGVycm9yIGlzIAorICAgICAqCQkJCWRldGVjdGVkIHdoZW4gdGhlIHNlcnZsZXQgaGFuZGxlcworICAgICAqCQkJCXRoZSByZXF1ZXN0CisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24JaWYgdGhlIHJlcXVlc3QgZm9yIHRoZSBQT1NUCisgICAgICoJCQkJCWNvdWxkIG5vdCBiZSBoYW5kbGVkCisgICAgICoKKyAgICAgKgorICAgICAqIEBzZWUgamF2YXguc2VydmxldC5TZXJ2bGV0T3V0cHV0U3RyZWFtCisgICAgICogQHNlZSBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXNwb25zZSNzZXRDb250ZW50VHlwZQorICAgICAqCisgICAgICoKKyAgICAgKi8KKworICAgIHByb3RlY3RlZCB2b2lkIGRvUG9zdChIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3ApCisJdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uCisgICAgeworCVN0cmluZyBwcm90b2NvbCA9IHJlcS5nZXRQcm90b2NvbCgpOworCVN0cmluZyBtc2cgPSBsU3RyaW5ncy5nZXRTdHJpbmcoImh0dHAubWV0aG9kX3Bvc3Rfbm90X3N1cHBvcnRlZCIpOworCWlmIChwcm90b2NvbC5lbmRzV2l0aCgiMS4xIikpIHsKKwkgICAgcmVzcC5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19NRVRIT0RfTk9UX0FMTE9XRUQsIG1zZyk7CisJfSBlbHNlIHsKKwkgICAgcmVzcC5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19CQURfUkVRVUVTVCwgbXNnKTsKKwl9CisgICAgfQorCisKKworCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IHRoZSBzZXJ2ZXIgKHZpYSB0aGUgPGNvZGU+c2VydmljZTwvY29kZT4gbWV0aG9kKQorICAgICAqIHRvIGFsbG93IGEgc2VydmxldCB0byBoYW5kbGUgYSBQVVQgcmVxdWVzdC4KKyAgICAgKgorICAgICAqIFRoZSBQVVQgb3BlcmF0aW9uIGFsbG93cyBhIGNsaWVudCB0byAKKyAgICAgKiBwbGFjZSBhIGZpbGUgb24gdGhlIHNlcnZlciBhbmQgaXMgc2ltaWxhciB0byAKKyAgICAgKiBzZW5kaW5nIGEgZmlsZSBieSBGVFAuCisgICAgICoKKyAgICAgKiA8cD5XaGVuIG92ZXJyaWRpbmcgdGhpcyBtZXRob2QsIGxlYXZlIGludGFjdAorICAgICAqIGFueSBjb250ZW50IGhlYWRlcnMgc2VudCB3aXRoIHRoZSByZXF1ZXN0IChpbmNsdWRpbmcKKyAgICAgKiBDb250ZW50LUxlbmd0aCwgQ29udGVudC1UeXBlLCBDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nLAorICAgICAqIENvbnRlbnQtRW5jb2RpbmcsIENvbnRlbnQtQmFzZSwgQ29udGVudC1MYW5ndWFnZSwgQ29udGVudC1Mb2NhdGlvbiwKKyAgICAgKiBDb250ZW50LU1ENSwgYW5kIENvbnRlbnQtUmFuZ2UpLiBJZiB5b3VyIG1ldGhvZCBjYW5ub3QKKyAgICAgKiBoYW5kbGUgYSBjb250ZW50IGhlYWRlciwgaXQgbXVzdCBpc3N1ZSBhbiBlcnJvciBtZXNzYWdlCisgICAgICogKEhUVFAgNTAxIC0gTm90IEltcGxlbWVudGVkKSBhbmQgZGlzY2FyZCB0aGUgcmVxdWVzdC4KKyAgICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBIVFRQIDEuMSwgc2VlIFJGQyAyNjE2CisgICAgICogPGEgaHJlZj0iaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMjYxNi50eHQiPjwvYT4uCisgICAgICoKKyAgICAgKiA8cD5UaGlzIG1ldGhvZCBkb2VzIG5vdCBuZWVkIHRvIGJlIGVpdGhlciBzYWZlIG9yIGlkZW1wb3RlbnQuCisgICAgICogT3BlcmF0aW9ucyB0aGF0IDxjb2RlPmRvUHV0PC9jb2RlPiBwZXJmb3JtcyBjYW4gaGF2ZSBzaWRlCisgICAgICogZWZmZWN0cyBmb3Igd2hpY2ggdGhlIHVzZXIgY2FuIGJlIGhlbGQgYWNjb3VudGFibGUuIFdoZW4gdXNpbmcKKyAgICAgKiB0aGlzIG1ldGhvZCwgaXQgbWF5IGJlIHVzZWZ1bCB0byBzYXZlIGEgY29weSBvZiB0aGUKKyAgICAgKiBhZmZlY3RlZCBVUkwgaW4gdGVtcG9yYXJ5IHN0b3JhZ2UuCisgICAgICoKKyAgICAgKiA8cD5JZiB0aGUgSFRUUCBQVVQgcmVxdWVzdCBpcyBpbmNvcnJlY3RseSBmb3JtYXR0ZWQsCisgICAgICogPGNvZGU+ZG9QdXQ8L2NvZGU+IHJldHVybnMgYW4gSFRUUCAiQmFkIFJlcXVlc3QiIG1lc3NhZ2UuCisgICAgICoKKyAgICAgKgorICAgICAqIEBwYXJhbSByZXEJdGhlIHtAbGluayBIdHRwU2VydmxldFJlcXVlc3R9IG9iamVjdCB0aGF0CisgICAgICoJCQljb250YWlucyB0aGUgcmVxdWVzdCB0aGUgY2xpZW50IG1hZGUgb2YKKyAgICAgKgkJCXRoZSBzZXJ2bGV0CisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzcAl0aGUge0BsaW5rIEh0dHBTZXJ2bGV0UmVzcG9uc2V9IG9iamVjdCB0aGF0CisgICAgICoJCQljb250YWlucyB0aGUgcmVzcG9uc2UgdGhlIHNlcnZsZXQgcmV0dXJucworICAgICAqCQkJdG8gdGhlIGNsaWVudAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbglpZiBhbiBpbnB1dCBvciBvdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICoJCQkJd2hpbGUgdGhlIHNlcnZsZXQgaXMgaGFuZGxpbmcgdGhlCisgICAgICoJCQkJUFVUIHJlcXVlc3QKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbglpZiB0aGUgcmVxdWVzdCBmb3IgdGhlIFBVVAorICAgICAqCQkJCQljYW5ub3QgYmUgaGFuZGxlZAorICAgICAqCisgICAgICovCisgIAorICAgIHByb3RlY3RlZCB2b2lkIGRvUHV0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcCkKKwl0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KKyAgICB7CisJU3RyaW5nIHByb3RvY29sID0gcmVxLmdldFByb3RvY29sKCk7CisJU3RyaW5nIG1zZyA9IGxTdHJpbmdzLmdldFN0cmluZygiaHR0cC5tZXRob2RfcHV0X25vdF9zdXBwb3J0ZWQiKTsKKwlpZiAocHJvdG9jb2wuZW5kc1dpdGgoIjEuMSIpKSB7CisJICAgIHJlc3Auc2VuZEVycm9yKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfTUVUSE9EX05PVF9BTExPV0VELCBtc2cpOworCX0gZWxzZSB7CisJICAgIHJlc3Auc2VuZEVycm9yKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfQkFEX1JFUVVFU1QsIG1zZyk7CisJfQorICAgIH0KKworCisKKworICAgIC8qKgorICAgICAqIAorICAgICAqIENhbGxlZCBieSB0aGUgc2VydmVyICh2aWEgdGhlIDxjb2RlPnNlcnZpY2U8L2NvZGU+IG1ldGhvZCkKKyAgICAgKiB0byBhbGxvdyBhIHNlcnZsZXQgdG8gaGFuZGxlIGEgREVMRVRFIHJlcXVlc3QuCisgICAgICoKKyAgICAgKiBUaGUgREVMRVRFIG9wZXJhdGlvbiBhbGxvd3MgYSBjbGllbnQgdG8gcmVtb3ZlIGEgZG9jdW1lbnQKKyAgICAgKiBvciBXZWIgcGFnZSBmcm9tIHRoZSBzZXJ2ZXIuCisgICAgICogCisgICAgICogPHA+VGhpcyBtZXRob2QgZG9lcyBub3QgbmVlZCB0byBiZSBlaXRoZXIgc2FmZQorICAgICAqIG9yIGlkZW1wb3RlbnQuIE9wZXJhdGlvbnMgcmVxdWVzdGVkIHRocm91Z2gKKyAgICAgKiBERUxFVEUgY2FuIGhhdmUgc2lkZSBlZmZlY3RzIGZvciB3aGljaCB1c2VycworICAgICAqIGNhbiBiZSBoZWxkIGFjY291bnRhYmxlLiBXaGVuIHVzaW5nCisgICAgICogdGhpcyBtZXRob2QsIGl0IG1heSBiZSB1c2VmdWwgdG8gc2F2ZSBhIGNvcHkgb2YgdGhlCisgICAgICogYWZmZWN0ZWQgVVJMIGluIHRlbXBvcmFyeSBzdG9yYWdlLgorICAgICAqCisgICAgICogPHA+SWYgdGhlIEhUVFAgREVMRVRFIHJlcXVlc3QgaXMgaW5jb3JyZWN0bHkgZm9ybWF0dGVkLAorICAgICAqIDxjb2RlPmRvRGVsZXRlPC9jb2RlPiByZXR1cm5zIGFuIEhUVFAgIkJhZCBSZXF1ZXN0IgorICAgICAqIG1lc3NhZ2UuCisgICAgICoKKyAgICAgKgorICAgICAqIEBwYXJhbSByZXEJdGhlIHtAbGluayBIdHRwU2VydmxldFJlcXVlc3R9IG9iamVjdCB0aGF0CisgICAgICoJCQljb250YWlucyB0aGUgcmVxdWVzdCB0aGUgY2xpZW50IG1hZGUgb2YKKyAgICAgKgkJCXRoZSBzZXJ2bGV0CisgICAgICoKKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNwCXRoZSB7QGxpbmsgSHR0cFNlcnZsZXRSZXNwb25zZX0gb2JqZWN0IHRoYXQKKyAgICAgKgkJCWNvbnRhaW5zIHRoZSByZXNwb25zZSB0aGUgc2VydmxldCByZXR1cm5zCisgICAgICoJCQl0byB0aGUgY2xpZW50CQkJCQorICAgICAqCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uCWlmIGFuIGlucHV0IG9yIG91dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKgkJCQl3aGlsZSB0aGUgc2VydmxldCBpcyBoYW5kbGluZyB0aGUKKyAgICAgKgkJCQlERUxFVEUgcmVxdWVzdAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBTZXJ2bGV0RXhjZXB0aW9uCWlmIHRoZSByZXF1ZXN0IGZvciB0aGUKKyAgICAgKgkJCQkJREVMRVRFIGNhbm5vdCBiZSBoYW5kbGVkCisgICAgICoKKyAgICAgKi8KKyAgICAgCisgICAgcHJvdGVjdGVkIHZvaWQgZG9EZWxldGUoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwKKwkJCSAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3ApCisJdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uCisgICAgeworCVN0cmluZyBwcm90b2NvbCA9IHJlcS5nZXRQcm90b2NvbCgpOworCVN0cmluZyBtc2cgPSBsU3RyaW5ncy5nZXRTdHJpbmcoImh0dHAubWV0aG9kX2RlbGV0ZV9ub3Rfc3VwcG9ydGVkIik7CisJaWYgKHByb3RvY29sLmVuZHNXaXRoKCIxLjEiKSkgeworCSAgICByZXNwLnNlbmRFcnJvcihIdHRwU2VydmxldFJlc3BvbnNlLlNDX01FVEhPRF9OT1RfQUxMT1dFRCwgbXNnKTsKKwl9IGVsc2UgeworCSAgICByZXNwLnNlbmRFcnJvcihIdHRwU2VydmxldFJlc3BvbnNlLlNDX0JBRF9SRVFVRVNULCBtc2cpOworCX0KKyAgICB9CisgICAgCisKKyAgICBwcml2YXRlIHN0YXRpYyBNZXRob2RbXSBnZXRBbGxEZWNsYXJlZE1ldGhvZHMoQ2xhc3MgYykgeworCisgICAgICAgIGlmIChjLmVxdWFscyhqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXQuY2xhc3MpKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIE1ldGhvZFtdIHBhcmVudE1ldGhvZHMgPSBnZXRBbGxEZWNsYXJlZE1ldGhvZHMoYy5nZXRTdXBlcmNsYXNzKCkpOworICAgICAgICBNZXRob2RbXSB0aGlzTWV0aG9kcyA9IGMuZ2V0RGVjbGFyZWRNZXRob2RzKCk7CisJCisgICAgICAgIGlmICgocGFyZW50TWV0aG9kcyAhPSBudWxsKSAmJiAocGFyZW50TWV0aG9kcy5sZW5ndGggPiAwKSkgeworICAgICAgICAgICAgTWV0aG9kW10gYWxsTWV0aG9kcyA9CisgICAgICAgICAgICAgICAgbmV3IE1ldGhvZFtwYXJlbnRNZXRob2RzLmxlbmd0aCArIHRoaXNNZXRob2RzLmxlbmd0aF07CisJICAgIFN5c3RlbS5hcnJheWNvcHkocGFyZW50TWV0aG9kcywgMCwgYWxsTWV0aG9kcywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50TWV0aG9kcy5sZW5ndGgpOworCSAgICBTeXN0ZW0uYXJyYXljb3B5KHRoaXNNZXRob2RzLCAwLCBhbGxNZXRob2RzLCBwYXJlbnRNZXRob2RzLmxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc01ldGhvZHMubGVuZ3RoKTsKKworCSAgICB0aGlzTWV0aG9kcyA9IGFsbE1ldGhvZHM7CisJfQorCisJcmV0dXJuIHRoaXNNZXRob2RzOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IHRoZSBzZXJ2ZXIgKHZpYSB0aGUgPGNvZGU+c2VydmljZTwvY29kZT4gbWV0aG9kKQorICAgICAqIHRvIGFsbG93IGEgc2VydmxldCB0byBoYW5kbGUgYSBPUFRJT05TIHJlcXVlc3QuCisgICAgICoKKyAgICAgKiBUaGUgT1BUSU9OUyByZXF1ZXN0IGRldGVybWluZXMgd2hpY2ggSFRUUCBtZXRob2RzIAorICAgICAqIHRoZSBzZXJ2ZXIgc3VwcG9ydHMgYW5kCisgICAgICogcmV0dXJucyBhbiBhcHByb3ByaWF0ZSBoZWFkZXIuIEZvciBleGFtcGxlLCBpZiBhIHNlcnZsZXQKKyAgICAgKiBvdmVycmlkZXMgPGNvZGU+ZG9HZXQ8L2NvZGU+LCB0aGlzIG1ldGhvZCByZXR1cm5zIHRoZQorICAgICAqIGZvbGxvd2luZyBoZWFkZXI6CisgICAgICoKKyAgICAgKiA8cD48Y29kZT5BbGxvdzogR0VULCBIRUFELCBUUkFDRSwgT1BUSU9OUzwvY29kZT4KKyAgICAgKgorICAgICAqIDxwPlRoZXJlJ3Mgbm8gbmVlZCB0byBvdmVycmlkZSB0aGlzIG1ldGhvZCB1bmxlc3MgdGhlCisgICAgICogc2VydmxldCBpbXBsZW1lbnRzIG5ldyBIVFRQIG1ldGhvZHMsIGJleW9uZCB0aG9zZSAKKyAgICAgKiBpbXBsZW1lbnRlZCBieSBIVFRQIDEuMS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXEJdGhlIHtAbGluayBIdHRwU2VydmxldFJlcXVlc3R9IG9iamVjdCB0aGF0CisgICAgICoJCQljb250YWlucyB0aGUgcmVxdWVzdCB0aGUgY2xpZW50IG1hZGUgb2YKKyAgICAgKgkJCXRoZSBzZXJ2bGV0CisgICAgICoKKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNwCXRoZSB7QGxpbmsgSHR0cFNlcnZsZXRSZXNwb25zZX0gb2JqZWN0IHRoYXQKKyAgICAgKgkJCWNvbnRhaW5zIHRoZSByZXNwb25zZSB0aGUgc2VydmxldCByZXR1cm5zCisgICAgICoJCQl0byB0aGUgY2xpZW50CQkJCQorICAgICAqCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uCWlmIGFuIGlucHV0IG9yIG91dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKgkJCQl3aGlsZSB0aGUgc2VydmxldCBpcyBoYW5kbGluZyB0aGUKKyAgICAgKgkJCQlPUFRJT05TIHJlcXVlc3QKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbglpZiB0aGUgcmVxdWVzdCBmb3IgdGhlCisgICAgICoJCQkJCU9QVElPTlMgY2Fubm90IGJlIGhhbmRsZWQKKyAgICAgKgorICAgICAqLworICAgICAgICAgCisgICAgcHJvdGVjdGVkIHZvaWQgZG9PcHRpb25zKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcCkKKwl0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KKyAgICB7CisJTWV0aG9kW10gbWV0aG9kcyA9IGdldEFsbERlY2xhcmVkTWV0aG9kcyh0aGlzLmdldENsYXNzKCkpOworCQorCWJvb2xlYW4gQUxMT1dfR0VUID0gZmFsc2U7CisJYm9vbGVhbiBBTExPV19IRUFEID0gZmFsc2U7CisJYm9vbGVhbiBBTExPV19QT1NUID0gZmFsc2U7CisJYm9vbGVhbiBBTExPV19QVVQgPSBmYWxzZTsKKwlib29sZWFuIEFMTE9XX0RFTEVURSA9IGZhbHNlOworCWJvb2xlYW4gQUxMT1dfVFJBQ0UgPSB0cnVlOworCWJvb2xlYW4gQUxMT1dfT1BUSU9OUyA9IHRydWU7CisJCisJZm9yIChpbnQgaT0wOyBpPG1ldGhvZHMubGVuZ3RoOyBpKyspIHsKKwkgICAgTWV0aG9kIG0gPSBtZXRob2RzW2ldOworCSAgICAKKwkgICAgaWYgKG0uZ2V0TmFtZSgpLmVxdWFscygiZG9HZXQiKSkgeworCQlBTExPV19HRVQgPSB0cnVlOworCQlBTExPV19IRUFEID0gdHJ1ZTsKKwkgICAgfQorCSAgICBpZiAobS5nZXROYW1lKCkuZXF1YWxzKCJkb1Bvc3QiKSkgCisJCUFMTE9XX1BPU1QgPSB0cnVlOworCSAgICBpZiAobS5nZXROYW1lKCkuZXF1YWxzKCJkb1B1dCIpKQorCQlBTExPV19QVVQgPSB0cnVlOworCSAgICBpZiAobS5nZXROYW1lKCkuZXF1YWxzKCJkb0RlbGV0ZSIpKQorCQlBTExPV19ERUxFVEUgPSB0cnVlOworCSAgICAKKwl9CisJCisJU3RyaW5nIGFsbG93ID0gbnVsbDsKKwlpZiAoQUxMT1dfR0VUKQorCSAgICBpZiAoYWxsb3c9PW51bGwpIGFsbG93PU1FVEhPRF9HRVQ7CisJaWYgKEFMTE9XX0hFQUQpCisJICAgIGlmIChhbGxvdz09bnVsbCkgYWxsb3c9TUVUSE9EX0hFQUQ7CisJICAgIGVsc2UgYWxsb3cgKz0gIiwgIiArIE1FVEhPRF9IRUFEOworCWlmIChBTExPV19QT1NUKQorCSAgICBpZiAoYWxsb3c9PW51bGwpIGFsbG93PU1FVEhPRF9QT1NUOworCSAgICBlbHNlIGFsbG93ICs9ICIsICIgKyBNRVRIT0RfUE9TVDsKKwlpZiAoQUxMT1dfUFVUKQorCSAgICBpZiAoYWxsb3c9PW51bGwpIGFsbG93PU1FVEhPRF9QVVQ7CisJICAgIGVsc2UgYWxsb3cgKz0gIiwgIiArIE1FVEhPRF9QVVQ7CisJaWYgKEFMTE9XX0RFTEVURSkKKwkgICAgaWYgKGFsbG93PT1udWxsKSBhbGxvdz1NRVRIT0RfREVMRVRFOworCSAgICBlbHNlIGFsbG93ICs9ICIsICIgKyBNRVRIT0RfREVMRVRFOworCWlmIChBTExPV19UUkFDRSkKKwkgICAgaWYgKGFsbG93PT1udWxsKSBhbGxvdz1NRVRIT0RfVFJBQ0U7CisJICAgIGVsc2UgYWxsb3cgKz0gIiwgIiArIE1FVEhPRF9UUkFDRTsKKwlpZiAoQUxMT1dfT1BUSU9OUykKKwkgICAgaWYgKGFsbG93PT1udWxsKSBhbGxvdz1NRVRIT0RfT1BUSU9OUzsKKwkgICAgZWxzZSBhbGxvdyArPSAiLCAiICsgTUVUSE9EX09QVElPTlM7CisJCisJcmVzcC5zZXRIZWFkZXIoIkFsbG93IiwgYWxsb3cpOworICAgIH0KKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYnkgdGhlIHNlcnZlciAodmlhIHRoZSA8Y29kZT5zZXJ2aWNlPC9jb2RlPiBtZXRob2QpCisgICAgICogdG8gYWxsb3cgYSBzZXJ2bGV0IHRvIGhhbmRsZSBhIFRSQUNFIHJlcXVlc3QuCisgICAgICoKKyAgICAgKiBBIFRSQUNFIHJldHVybnMgdGhlIGhlYWRlcnMgc2VudCB3aXRoIHRoZSBUUkFDRQorICAgICAqIHJlcXVlc3QgdG8gdGhlIGNsaWVudCwgc28gdGhhdCB0aGV5IGNhbiBiZSB1c2VkIGluCisgICAgICogZGVidWdnaW5nLiBUaGVyZSdzIG5vIG5lZWQgdG8gb3ZlcnJpZGUgdGhpcyBtZXRob2QuIAorICAgICAqCisgICAgICoKKyAgICAgKgorICAgICAqIEBwYXJhbSByZXEJdGhlIHtAbGluayBIdHRwU2VydmxldFJlcXVlc3R9IG9iamVjdCB0aGF0CisgICAgICoJCQljb250YWlucyB0aGUgcmVxdWVzdCB0aGUgY2xpZW50IG1hZGUgb2YKKyAgICAgKgkJCXRoZSBzZXJ2bGV0CisgICAgICoKKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNwCXRoZSB7QGxpbmsgSHR0cFNlcnZsZXRSZXNwb25zZX0gb2JqZWN0IHRoYXQKKyAgICAgKgkJCWNvbnRhaW5zIHRoZSByZXNwb25zZSB0aGUgc2VydmxldCByZXR1cm5zCisgICAgICoJCQl0byB0aGUgY2xpZW50CQkJCQorICAgICAqCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uCWlmIGFuIGlucHV0IG9yIG91dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKgkJCQl3aGlsZSB0aGUgc2VydmxldCBpcyBoYW5kbGluZyB0aGUKKyAgICAgKgkJCQlUUkFDRSByZXF1ZXN0CisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24JaWYgdGhlIHJlcXVlc3QgZm9yIHRoZQorICAgICAqCQkJCQlUUkFDRSBjYW5ub3QgYmUgaGFuZGxlZAorICAgICAqCisgICAgICovCisKKyAgICBwcm90ZWN0ZWQgdm9pZCBkb1RyYWNlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcCkgCisJdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uCisgICAgeworCQorCWludCByZXNwb25zZUxlbmd0aDsKKwkKKwlTdHJpbmcgQ1JMRiA9ICJcclxuIjsKKwlTdHJpbmcgcmVzcG9uc2VTdHJpbmcgPSAiVFJBQ0UgIisgcmVxLmdldFJlcXVlc3RVUkkoKSsKKwkgICAgIiAiICsgcmVxLmdldFByb3RvY29sKCk7CisJCisJRW51bWVyYXRpb24gcmVxSGVhZGVyRW51bSA9IHJlcS5nZXRIZWFkZXJOYW1lcygpOworCQorCXdoaWxlKCByZXFIZWFkZXJFbnVtLmhhc01vcmVFbGVtZW50cygpICkgeworCSAgICBTdHJpbmcgaGVhZGVyTmFtZSA9IChTdHJpbmcpcmVxSGVhZGVyRW51bS5uZXh0RWxlbWVudCgpOworCSAgICByZXNwb25zZVN0cmluZyArPSBDUkxGICsgaGVhZGVyTmFtZSArICI6ICIgKworCQlyZXEuZ2V0SGVhZGVyKGhlYWRlck5hbWUpOyAKKwl9CisJCisJcmVzcG9uc2VTdHJpbmcgKz0gQ1JMRjsKKwkKKwlyZXNwb25zZUxlbmd0aCA9IHJlc3BvbnNlU3RyaW5nLmxlbmd0aCgpOworCQorCXJlc3Auc2V0Q29udGVudFR5cGUoIm1lc3NhZ2UvaHR0cCIpOworCXJlc3Auc2V0Q29udGVudExlbmd0aChyZXNwb25zZUxlbmd0aCk7CisJU2VydmxldE91dHB1dFN0cmVhbSBvdXQgPSByZXNwLmdldE91dHB1dFN0cmVhbSgpOworCW91dC5wcmludChyZXNwb25zZVN0cmluZyk7CQorCW91dC5jbG9zZSgpOworCXJldHVybjsKKyAgICB9CQkKKworCisKKworCisgICAgLyoqCisgICAgICoKKyAgICAgKiBSZWNlaXZlcyBzdGFuZGFyZCBIVFRQIHJlcXVlc3RzIGZyb20gdGhlIHB1YmxpYworICAgICAqIDxjb2RlPnNlcnZpY2U8L2NvZGU+IG1ldGhvZCBhbmQgZGlzcGF0Y2hlcworICAgICAqIHRoZW0gdG8gdGhlIDxjb2RlPmRvPC9jb2RlPjxpPlhYWDwvaT4gbWV0aG9kcyBkZWZpbmVkIGluIAorICAgICAqIHRoaXMgY2xhc3MuIFRoaXMgbWV0aG9kIGlzIGFuIEhUVFAtc3BlY2lmaWMgdmVyc2lvbiBvZiB0aGUgCisgICAgICoge0BsaW5rIGphdmF4LnNlcnZsZXQuU2VydmxldCNzZXJ2aWNlfSBtZXRob2QuIFRoZXJlJ3Mgbm8KKyAgICAgKiBuZWVkIHRvIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgorICAgICAqCisgICAgICoKKyAgICAgKgorICAgICAqIEBwYXJhbSByZXEJdGhlIHtAbGluayBIdHRwU2VydmxldFJlcXVlc3R9IG9iamVjdCB0aGF0CisgICAgICoJCQljb250YWlucyB0aGUgcmVxdWVzdCB0aGUgY2xpZW50IG1hZGUgb2YKKyAgICAgKgkJCXRoZSBzZXJ2bGV0CisgICAgICoKKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNwCXRoZSB7QGxpbmsgSHR0cFNlcnZsZXRSZXNwb25zZX0gb2JqZWN0IHRoYXQKKyAgICAgKgkJCWNvbnRhaW5zIHRoZSByZXNwb25zZSB0aGUgc2VydmxldCByZXR1cm5zCisgICAgICoJCQl0byB0aGUgY2xpZW50CQkJCQorICAgICAqCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uCWlmIGFuIGlucHV0IG9yIG91dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKgkJCQl3aGlsZSB0aGUgc2VydmxldCBpcyBoYW5kbGluZyB0aGUKKyAgICAgKgkJCQlIVFRQIHJlcXVlc3QKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gU2VydmxldEV4Y2VwdGlvbglpZiB0aGUgSFRUUCByZXF1ZXN0CisgICAgICoJCQkJCWNhbm5vdCBiZSBoYW5kbGVkCisgICAgICogCisgICAgICogQHNlZSAJCQkJamF2YXguc2VydmxldC5TZXJ2bGV0I3NlcnZpY2UKKyAgICAgKgorICAgICAqLworCisgICAgcHJvdGVjdGVkIHZvaWQgc2VydmljZShIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3ApCisJdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uCisgICAgeworCVN0cmluZyBtZXRob2QgPSByZXEuZ2V0TWV0aG9kKCk7CisKKwlpZiAobWV0aG9kLmVxdWFscyhNRVRIT0RfR0VUKSkgeworCSAgICBsb25nIGxhc3RNb2RpZmllZCA9IGdldExhc3RNb2RpZmllZChyZXEpOworCSAgICBpZiAobGFzdE1vZGlmaWVkID09IC0xKSB7CisJCS8vIHNlcnZsZXQgZG9lc24ndCBzdXBwb3J0IGlmLW1vZGlmaWVkLXNpbmNlLCBubyByZWFzb24KKwkJLy8gdG8gZ28gdGhyb3VnaCBmdXJ0aGVyIGV4cGVuc2l2ZSBsb2dpYworCQlkb0dldChyZXEsIHJlc3ApOworCSAgICB9IGVsc2UgeworCQlsb25nIGlmTW9kaWZpZWRTaW5jZSA9IHJlcS5nZXREYXRlSGVhZGVyKEhFQURFUl9JRk1PRFNJTkNFKTsKKwkJaWYgKGlmTW9kaWZpZWRTaW5jZSA8IChsYXN0TW9kaWZpZWQgLyAxMDAwICogMTAwMCkpIHsKKwkJICAgIC8vIElmIHRoZSBzZXJ2bGV0IG1vZCB0aW1lIGlzIGxhdGVyLCBjYWxsIGRvR2V0KCkKKyAgICAgICAgICAgICAgICAgICAgLy8gUm91bmQgZG93biB0byB0aGUgbmVhcmVzdCBzZWNvbmQgZm9yIGEgcHJvcGVyIGNvbXBhcmUKKyAgICAgICAgICAgICAgICAgICAgLy8gQSBpZk1vZGlmaWVkU2luY2Ugb2YgLTEgd2lsbCBhbHdheXMgYmUgbGVzcworCQkgICAgbWF5YmVTZXRMYXN0TW9kaWZpZWQocmVzcCwgbGFzdE1vZGlmaWVkKTsKKwkJICAgIGRvR2V0KHJlcSwgcmVzcCk7CisJCX0gZWxzZSB7CisJCSAgICByZXNwLnNldFN0YXR1cyhIdHRwU2VydmxldFJlc3BvbnNlLlNDX05PVF9NT0RJRklFRCk7CisJCX0KKwkgICAgfQorCisJfSBlbHNlIGlmIChtZXRob2QuZXF1YWxzKE1FVEhPRF9IRUFEKSkgeworCSAgICBsb25nIGxhc3RNb2RpZmllZCA9IGdldExhc3RNb2RpZmllZChyZXEpOworCSAgICBtYXliZVNldExhc3RNb2RpZmllZChyZXNwLCBsYXN0TW9kaWZpZWQpOworCSAgICBkb0hlYWQocmVxLCByZXNwKTsKKworCX0gZWxzZSBpZiAobWV0aG9kLmVxdWFscyhNRVRIT0RfUE9TVCkpIHsKKwkgICAgZG9Qb3N0KHJlcSwgcmVzcCk7CisJICAgIAorCX0gZWxzZSBpZiAobWV0aG9kLmVxdWFscyhNRVRIT0RfUFVUKSkgeworCSAgICBkb1B1dChyZXEsIHJlc3ApOwkKKwkgICAgCisJfSBlbHNlIGlmIChtZXRob2QuZXF1YWxzKE1FVEhPRF9ERUxFVEUpKSB7CisJICAgIGRvRGVsZXRlKHJlcSwgcmVzcCk7CisJICAgIAorCX0gZWxzZSBpZiAobWV0aG9kLmVxdWFscyhNRVRIT0RfT1BUSU9OUykpIHsKKwkgICAgZG9PcHRpb25zKHJlcSxyZXNwKTsKKwkgICAgCisJfSBlbHNlIGlmIChtZXRob2QuZXF1YWxzKE1FVEhPRF9UUkFDRSkpIHsKKwkgICAgZG9UcmFjZShyZXEscmVzcCk7CisJICAgIAorCX0gZWxzZSB7CisJICAgIC8vCisJICAgIC8vIE5vdGUgdGhhdCB0aGlzIG1lYW5zIE5PIHNlcnZsZXQgc3VwcG9ydHMgd2hhdGV2ZXIKKwkgICAgLy8gbWV0aG9kIHdhcyByZXF1ZXN0ZWQsIGFueXdoZXJlIG9uIHRoaXMgc2VydmVyLgorCSAgICAvLworCisJICAgIFN0cmluZyBlcnJNc2cgPSBsU3RyaW5ncy5nZXRTdHJpbmcoImh0dHAubWV0aG9kX25vdF9pbXBsZW1lbnRlZCIpOworCSAgICBPYmplY3RbXSBlcnJBcmdzID0gbmV3IE9iamVjdFsxXTsKKwkgICAgZXJyQXJnc1swXSA9IG1ldGhvZDsKKwkgICAgZXJyTXNnID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZXJyTXNnLCBlcnJBcmdzKTsKKwkgICAgCisJICAgIHJlc3Auc2VuZEVycm9yKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfTk9UX0lNUExFTUVOVEVELCBlcnJNc2cpOworCX0KKyAgICB9CisgICAgCisKKworCisKKyAgICAvKgorICAgICAqIFNldHMgdGhlIExhc3QtTW9kaWZpZWQgZW50aXR5IGhlYWRlciBmaWVsZCwgaWYgaXQgaGFzIG5vdAorICAgICAqIGFscmVhZHkgYmVlbiBzZXQgYW5kIGlmIHRoZSB2YWx1ZSBpcyBtZWFuaW5nZnVsLiAgQ2FsbGVkIGJlZm9yZQorICAgICAqIGRvR2V0LCB0byBlbnN1cmUgdGhhdCBoZWFkZXJzIGFyZSBzZXQgYmVmb3JlIHJlc3BvbnNlIGRhdGEgaXMKKyAgICAgKiB3cml0dGVuLiAgQSBzdWJjbGFzcyBtaWdodCBoYXZlIHNldCB0aGlzIGhlYWRlciBhbHJlYWR5LCBzbyB3ZQorICAgICAqIGNoZWNrLgorICAgICAqLworCisgICAgcHJpdmF0ZSB2b2lkIG1heWJlU2V0TGFzdE1vZGlmaWVkKEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcCwKKwkJCQkgICAgICBsb25nIGxhc3RNb2RpZmllZCkgeworCWlmIChyZXNwLmNvbnRhaW5zSGVhZGVyKEhFQURFUl9MQVNUTU9EKSkKKwkgICAgcmV0dXJuOworCWlmIChsYXN0TW9kaWZpZWQgPj0gMCkKKwkgICAgcmVzcC5zZXREYXRlSGVhZGVyKEhFQURFUl9MQVNUTU9ELCBsYXN0TW9kaWZpZWQpOworICAgIH0KKyAgIAorICAgCisgICAKKyAgICAKKyAgICAvKioKKyAgICAgKgorICAgICAqIERpc3BhdGNoZXMgY2xpZW50IHJlcXVlc3RzIHRvIHRoZSBwcm90ZWN0ZWQKKyAgICAgKiA8Y29kZT5zZXJ2aWNlPC9jb2RlPiBtZXRob2QuIFRoZXJlJ3Mgbm8gbmVlZCB0bworICAgICAqIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgorICAgICAqCisgICAgICogCisgICAgICogQHBhcmFtIHJlcQl0aGUge0BsaW5rIEh0dHBTZXJ2bGV0UmVxdWVzdH0gb2JqZWN0IHRoYXQKKyAgICAgKgkJCWNvbnRhaW5zIHRoZSByZXF1ZXN0IHRoZSBjbGllbnQgbWFkZSBvZgorICAgICAqCQkJdGhlIHNlcnZsZXQKKyAgICAgKgorICAgICAqCisgICAgICogQHBhcmFtIHJlcwl0aGUge0BsaW5rIEh0dHBTZXJ2bGV0UmVzcG9uc2V9IG9iamVjdCB0aGF0CisgICAgICoJCQljb250YWlucyB0aGUgcmVzcG9uc2UgdGhlIHNlcnZsZXQgcmV0dXJucworICAgICAqCQkJdG8gdGhlIGNsaWVudAkJCQkKKyAgICAgKgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbglpZiBhbiBpbnB1dCBvciBvdXRwdXQgZXJyb3Igb2NjdXJzCisgICAgICoJCQkJd2hpbGUgdGhlIHNlcnZsZXQgaXMgaGFuZGxpbmcgdGhlCisgICAgICoJCQkJSFRUUCByZXF1ZXN0CisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIFNlcnZsZXRFeGNlcHRpb24JaWYgdGhlIEhUVFAgcmVxdWVzdCBjYW5ub3QKKyAgICAgKgkJCQkJYmUgaGFuZGxlZAorICAgICAqCisgICAgICogCisgICAgICogQHNlZSBqYXZheC5zZXJ2bGV0LlNlcnZsZXQjc2VydmljZQorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgdm9pZCBzZXJ2aWNlKFNlcnZsZXRSZXF1ZXN0IHJlcSwgU2VydmxldFJlc3BvbnNlIHJlcykKKwl0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KKyAgICB7CisJSHR0cFNlcnZsZXRSZXF1ZXN0CXJlcXVlc3Q7CisJSHR0cFNlcnZsZXRSZXNwb25zZQlyZXNwb25zZTsKKwkKKwl0cnkgeworCSAgICByZXF1ZXN0ID0gKEh0dHBTZXJ2bGV0UmVxdWVzdCkgcmVxOworCSAgICByZXNwb25zZSA9IChIdHRwU2VydmxldFJlc3BvbnNlKSByZXM7CisJfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKKwkgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24oIm5vbi1IVFRQIHJlcXVlc3Qgb3IgcmVzcG9uc2UiKTsKKwl9CisJc2VydmljZShyZXF1ZXN0LCByZXNwb25zZSk7CisgICAgfQorfQorCisKKworCisvKgorICogQSByZXNwb25zZSB0aGF0IGluY2x1ZGVzIG5vIGJvZHksIGZvciB1c2UgaW4gKGR1bWIpICJIRUFEIiBzdXBwb3J0LgorICogVGhpcyBqdXN0IHN3YWxsb3dzIHRoYXQgYm9keSwgY291bnRpbmcgdGhlIGJ5dGVzIGluIG9yZGVyIHRvIHNldAorICogdGhlIGNvbnRlbnQgbGVuZ3RoIGFwcHJvcHJpYXRlbHkuICBBbGwgb3RoZXIgbWV0aG9kcyBkZWxlZ2F0ZSBkaXJlY3RseQorICogdG8gdGhlIEhUVFAgU2VydmxldCBSZXNwb25zZSBvYmplY3QgdXNlZCB0byBjb25zdHJ1Y3QgdGhpcyBvbmUuCisgKi8KKy8vIGZpbGUgcHJpdmF0ZQorY2xhc3MgTm9Cb2R5UmVzcG9uc2UgaW1wbGVtZW50cyBIdHRwU2VydmxldFJlc3BvbnNlIHsKKyAgICBwcml2YXRlIEh0dHBTZXJ2bGV0UmVzcG9uc2UJCXJlc3A7CisgICAgcHJpdmF0ZSBOb0JvZHlPdXRwdXRTdHJlYW0JCW5vQm9keTsKKyAgICBwcml2YXRlIFByaW50V3JpdGVyCQkJd3JpdGVyOworICAgIHByaXZhdGUgYm9vbGVhbgkJCWRpZFNldENvbnRlbnRMZW5ndGg7CisKKyAgICAvLyBmaWxlIHByaXZhdGUKKyAgICBOb0JvZHlSZXNwb25zZShIdHRwU2VydmxldFJlc3BvbnNlIHIpIHsKKwlyZXNwID0gcjsKKwlub0JvZHkgPSBuZXcgTm9Cb2R5T3V0cHV0U3RyZWFtKCk7CisgICAgfQorCisgICAgLy8gZmlsZSBwcml2YXRlCisgICAgdm9pZCBzZXRDb250ZW50TGVuZ3RoKCkgeworCWlmICghZGlkU2V0Q29udGVudExlbmd0aCkKKwkgIHJlc3Auc2V0Q29udGVudExlbmd0aChub0JvZHkuZ2V0Q29udGVudExlbmd0aCgpKTsKKyAgICB9CisKKworICAgIC8vIFNFUlZMRVQgUkVTUE9OU0UgaW50ZXJmYWNlIG1ldGhvZHMKKworICAgIHB1YmxpYyB2b2lkIHNldENvbnRlbnRMZW5ndGgoaW50IGxlbikgeworCXJlc3Auc2V0Q29udGVudExlbmd0aChsZW4pOworCWRpZFNldENvbnRlbnRMZW5ndGggPSB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENoYXJhY3RlckVuY29kaW5nKFN0cmluZyBjaGFyc2V0KQorICAgICAgeyByZXNwLnNldENoYXJhY3RlckVuY29kaW5nKGNoYXJzZXQpOyB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDb250ZW50VHlwZShTdHJpbmcgdHlwZSkKKyAgICAgIHsgcmVzcC5zZXRDb250ZW50VHlwZSh0eXBlKTsgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZSgpCisgICAgICB7IHJldHVybiByZXNwLmdldENvbnRlbnRUeXBlKCk7IH0KKworICAgIHB1YmxpYyBTZXJ2bGV0T3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgeyByZXR1cm4gbm9Cb2R5OyB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldENoYXJhY3RlckVuY29kaW5nKCkKKwl7IHJldHVybiByZXNwLmdldENoYXJhY3RlckVuY29kaW5nKCk7IH0KKworICAgIHB1YmxpYyBQcmludFdyaXRlciBnZXRXcml0ZXIoKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbgorICAgIHsKKwlpZiAod3JpdGVyID09IG51bGwpIHsKKwkgICAgT3V0cHV0U3RyZWFtV3JpdGVyCXc7CisKKwkgICAgdyA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIobm9Cb2R5LCBnZXRDaGFyYWN0ZXJFbmNvZGluZygpKTsKKwkgICAgd3JpdGVyID0gbmV3IFByaW50V3JpdGVyKHcpOworCX0KKwlyZXR1cm4gd3JpdGVyOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEJ1ZmZlclNpemUoaW50IHNpemUpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgIHsgcmVzcC5zZXRCdWZmZXJTaXplKHNpemUpOyB9CisKKyAgICBwdWJsaWMgaW50IGdldEJ1ZmZlclNpemUoKQorICAgICAgeyByZXR1cm4gcmVzcC5nZXRCdWZmZXJTaXplKCk7IH0KKworICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAgeyByZXNwLnJlc2V0KCk7IH0KKyAgICAgIAorICAgICAgcHVibGljIHZvaWQgcmVzZXRCdWZmZXIoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICB7IHJlc3AucmVzZXRCdWZmZXIoKTsgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNDb21taXR0ZWQoKQorICAgICAgeyByZXR1cm4gcmVzcC5pc0NvbW1pdHRlZCgpOyB9CisKKyAgICBwdWJsaWMgdm9pZCBmbHVzaEJ1ZmZlcigpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgeyByZXNwLmZsdXNoQnVmZmVyKCk7IH0KKworICAgIHB1YmxpYyB2b2lkIHNldExvY2FsZShMb2NhbGUgbG9jKQorICAgICAgeyByZXNwLnNldExvY2FsZShsb2MpOyB9CisKKyAgICBwdWJsaWMgTG9jYWxlIGdldExvY2FsZSgpCisgICAgICB7IHJldHVybiByZXNwLmdldExvY2FsZSgpOyB9CisKKworICAgIC8vIEhUVFAgU0VSVkxFVCBSRVNQT05TRSBpbnRlcmZhY2UgbWV0aG9kcworCisgICAgcHVibGljIHZvaWQgYWRkQ29va2llKENvb2tpZSBjb29raWUpCisgICAgICB7IHJlc3AuYWRkQ29va2llKGNvb2tpZSk7IH0KKworICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zSGVhZGVyKFN0cmluZyBuYW1lKQorICAgICAgeyByZXR1cm4gcmVzcC5jb250YWluc0hlYWRlcihuYW1lKTsgfQorCisgICAgLyoqIEBkZXByZWNhdGVkICovCisgICAgcHVibGljIHZvaWQgc2V0U3RhdHVzKGludCBzYywgU3RyaW5nIHNtKQorICAgICAgeyByZXNwLnNldFN0YXR1cyhzYywgc20pOyB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTdGF0dXMoaW50IHNjKQorICAgICAgeyByZXNwLnNldFN0YXR1cyhzYyk7IH0KKworICAgIHB1YmxpYyB2b2lkIHNldEhlYWRlcihTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKQorICAgICAgeyByZXNwLnNldEhlYWRlcihuYW1lLCB2YWx1ZSk7IH0KKworICAgIHB1YmxpYyB2b2lkIHNldEludEhlYWRlcihTdHJpbmcgbmFtZSwgaW50IHZhbHVlKQorICAgICAgeyByZXNwLnNldEludEhlYWRlcihuYW1lLCB2YWx1ZSk7IH0KKworICAgIHB1YmxpYyB2b2lkIHNldERhdGVIZWFkZXIoU3RyaW5nIG5hbWUsIGxvbmcgZGF0ZSkKKyAgICAgIHsgcmVzcC5zZXREYXRlSGVhZGVyKG5hbWUsIGRhdGUpOyB9CisKKyAgICBwdWJsaWMgdm9pZCBzZW5kRXJyb3IoaW50IHNjLCBTdHJpbmcgbXNnKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgIHsgcmVzcC5zZW5kRXJyb3Ioc2MsIG1zZyk7IH0KKworICAgIHB1YmxpYyB2b2lkIHNlbmRFcnJvcihpbnQgc2MpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgeyByZXNwLnNlbmRFcnJvcihzYyk7IH0KKworICAgIHB1YmxpYyB2b2lkIHNlbmRSZWRpcmVjdChTdHJpbmcgbG9jYXRpb24pIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgeyByZXNwLnNlbmRSZWRpcmVjdChsb2NhdGlvbik7IH0KKyAgICAKKyAgICBwdWJsaWMgU3RyaW5nIGVuY29kZVVSTChTdHJpbmcgdXJsKSAKKyAgICAgIHsgcmV0dXJuIHJlc3AuZW5jb2RlVVJMKHVybCk7IH0KKworICAgIHB1YmxpYyBTdHJpbmcgZW5jb2RlUmVkaXJlY3RVUkwoU3RyaW5nIHVybCkKKyAgICAgIHsgcmV0dXJuIHJlc3AuZW5jb2RlUmVkaXJlY3RVUkwodXJsKTsgfQorICAgICAgCisgICAgcHVibGljIHZvaWQgYWRkSGVhZGVyKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpCisgICAgICB7IHJlc3AuYWRkSGVhZGVyKG5hbWUsIHZhbHVlKTsgfQorICAgICAgCisgICAgcHVibGljIHZvaWQgYWRkRGF0ZUhlYWRlcihTdHJpbmcgbmFtZSwgbG9uZyB2YWx1ZSkKKyAgICAgIHsgcmVzcC5hZGREYXRlSGVhZGVyKG5hbWUsIHZhbHVlKTsgfQorICAgICAgCisgICAgcHVibGljIHZvaWQgYWRkSW50SGVhZGVyKFN0cmluZyBuYW1lLCBpbnQgdmFsdWUpCisgICAgICB7IHJlc3AuYWRkSW50SGVhZGVyKG5hbWUsIHZhbHVlKTsgfQorICAgICAgCisgICAgICAKKyAgICAgIAorCisgICAgLyoqCisgICAgICogQGRlcHJlY2F0ZWQJQXMgb2YgVmVyc2lvbiAyLjEsIHJlcGxhY2VkIGJ5CisgICAgICogCQkJe0BsaW5rIEh0dHBTZXJ2bGV0UmVzcG9uc2UjZW5jb2RlVVJMfS4KKyAgICAgKgorICAgICAqLworICAgICAKKyAgICAgCisgICAgcHVibGljIFN0cmluZyBlbmNvZGVVcmwoU3RyaW5nIHVybCkgCisgICAgICB7IHJldHVybiB0aGlzLmVuY29kZVVSTCh1cmwpOyB9CisgICAgICAKKyAgICAgIAorICAgICAgCisgICAgICAKKyAgICAgIAorICAgICAgCisgICAgICAKKworICAgIC8qKgorICAgICAqIEBkZXByZWNhdGVkCUFzIG9mIFZlcnNpb24gMi4xLCByZXBsYWNlZCBieQorICAgICAqCQkJe0BsaW5rIEh0dHBTZXJ2bGV0UmVzcG9uc2UjZW5jb2RlUmVkaXJlY3RVUkx9LgorICAgICAqCisgICAgICovCisgICAgIAorICAgICAKKyAgICBwdWJsaWMgU3RyaW5nIGVuY29kZVJlZGlyZWN0VXJsKFN0cmluZyB1cmwpCisgICAgICB7IHJldHVybiB0aGlzLmVuY29kZVJlZGlyZWN0VVJMKHVybCk7IH0KKworfQorCisKKworCisKKworCisvKgorICogU2VydmxldCBvdXRwdXQgc3RyZWFtIHRoYXQgZ29iYmxlcyB1cCBhbGwgaXRzIGRhdGEuCisgKi8KKyAKKy8vIGZpbGUgcHJpdmF0ZQorY2xhc3MgTm9Cb2R5T3V0cHV0U3RyZWFtIGV4dGVuZHMgU2VydmxldE91dHB1dFN0cmVhbSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTFNUUklOR19GSUxFID0KKwkiamF2YXguc2VydmxldC5odHRwLkxvY2FsU3RyaW5ncyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgbFN0cmluZ3MgPQorCVJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShMU1RSSU5HX0ZJTEUpOworCisgICAgcHJpdmF0ZSBpbnQJCWNvbnRlbnRMZW5ndGggPSAwOworCisgICAgLy8gZmlsZSBwcml2YXRlCisgICAgTm9Cb2R5T3V0cHV0U3RyZWFtKCkge30KKworICAgIC8vIGZpbGUgcHJpdmF0ZQorICAgIGludCBnZXRDb250ZW50TGVuZ3RoKCkgeworCXJldHVybiBjb250ZW50TGVuZ3RoOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlKGludCBiKSB7CisJY29udGVudExlbmd0aCsrOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlKGJ5dGUgYnVmW10sIGludCBvZmZzZXQsIGludCBsZW4pCisJdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworCWlmIChsZW4gPj0gMCkgeworCSAgICBjb250ZW50TGVuZ3RoICs9IGxlbjsKKwl9IGVsc2UgeworCSAgICAvLyBYWFgKKwkgICAgLy8gaXNuJ3QgdGhpcyByZWFsbHkgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uPworCSAgICAKKwkgICAgU3RyaW5nIG1zZyA9IGxTdHJpbmdzLmdldFN0cmluZygiZXJyLmlvLm5lZ2F0aXZlbGVuZ3RoIik7CisJICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigibmVnYXRpdmUgbGVuZ3RoIik7CisJfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2h0dHAvSHR0cFNlcnZsZXRSZXF1ZXN0LmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9odHRwL0h0dHBTZXJ2bGV0UmVxdWVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwYTVkMzYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9odHRwL0h0dHBTZXJ2bGV0UmVxdWVzdC5qYXZhCkBAIC0wLDAgKzEsNjYwIEBACisvKgorKiBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK3BhY2thZ2UgamF2YXguc2VydmxldC5odHRwOworCitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CisKKy8qKgorICoKKyAqIEV4dGVuZHMgdGhlIHtAbGluayBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXF1ZXN0fSBpbnRlcmZhY2UKKyAqIHRvIHByb3ZpZGUgcmVxdWVzdCBpbmZvcm1hdGlvbiBmb3IgSFRUUCBzZXJ2bGV0cy4gCisgKgorICogPHA+VGhlIHNlcnZsZXQgY29udGFpbmVyIGNyZWF0ZXMgYW4gPGNvZGU+SHR0cFNlcnZsZXRSZXF1ZXN0PC9jb2RlPiAKKyAqIG9iamVjdCBhbmQgcGFzc2VzIGl0IGFzIGFuIGFyZ3VtZW50IHRvIHRoZSBzZXJ2bGV0J3Mgc2VydmljZQorICogbWV0aG9kcyAoPGNvZGU+ZG9HZXQ8L2NvZGU+LCA8Y29kZT5kb1Bvc3Q8L2NvZGU+LCBldGMpLgorICoKKyAqCisgKiBAYXV0aG9yIAlWYXJpb3VzCisgKiBAdmVyc2lvbgkkVmVyc2lvbiQKKyAqCisgKgorICovCisKK3B1YmxpYyBpbnRlcmZhY2UgSHR0cFNlcnZsZXRSZXF1ZXN0IGV4dGVuZHMgU2VydmxldFJlcXVlc3QgeworCisgICAgLyoqCisgICAgKiBTdHJpbmcgaWRlbnRpZmllciBmb3IgQmFzaWMgYXV0aGVudGljYXRpb24uIFZhbHVlICJCQVNJQyIKKyAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJBU0lDX0FVVEggPSAiQkFTSUMiOworICAgIC8qKgorICAgICogU3RyaW5nIGlkZW50aWZpZXIgZm9yIEZvcm0gYXV0aGVudGljYXRpb24uIFZhbHVlICJGT1JNIgorICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9BVVRIID0gIkZPUk0iOworICAgIC8qKgorICAgICogU3RyaW5nIGlkZW50aWZpZXIgZm9yIENsaWVudCBDZXJ0aWZpY2F0ZSBhdXRoZW50aWNhdGlvbi4gVmFsdWUgIkNMSUVOVF9DRVJUIgorICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xJRU5UX0NFUlRfQVVUSCA9ICJDTElFTlRfQ0VSVCI7CisgICAgLyoqCisgICAgKiBTdHJpbmcgaWRlbnRpZmllciBmb3IgRGlnZXN0IGF1dGhlbnRpY2F0aW9uLiBWYWx1ZSAiRElHRVNUIgorICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElHRVNUX0FVVEggPSAiRElHRVNUIjsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGF1dGhlbnRpY2F0aW9uIHNjaGVtZSB1c2VkIHRvIHByb3RlY3QKKyAgICAgKiB0aGUgc2VydmxldC4gQWxsIHNlcnZsZXQgY29udGFpbmVycyBzdXBwb3J0IGJhc2ljLCBmb3JtIGFuZCBjbGllbnQgCisgICAgICogY2VydGlmaWNhdGUgYXV0aGVudGljYXRpb24sIGFuZCBtYXkgYWRkaXRpb25hbGx5IHN1cHBvcnQgZGlnZXN0IAorICAgICAqIGF1dGhlbnRpY2F0aW9uLgorICAgICAqIElmIHRoZSBzZXJ2bGV0IGlzIG5vdCBhdXRoZW50aWNhdGVkIDxjb2RlPm51bGw8L2NvZGU+IGlzIHJldHVybmVkLiAKKyAgICAgKgorICAgICAqIDxwPlNhbWUgYXMgdGhlIHZhbHVlIG9mIHRoZSBDR0kgdmFyaWFibGUgQVVUSF9UWVBFLgorICAgICAqCisgICAgICoKKyAgICAgKiBAcmV0dXJuCQlvbmUgb2YgdGhlIHN0YXRpYyBtZW1iZXJzIEJBU0lDX0FVVEgsIAorICAgICAqCQkJRk9STV9BVVRILCBDTElFTlRfQ0VSVF9BVVRILCBESUdFU1RfQVVUSAorICAgICAqCQkJKHN1aXRhYmxlIGZvciA9PSBjb21wYXJpc29uKSBvcgorICAgICAqCQkJdGhlIGNvbnRhaW5lci1zcGVjaWZpYyBzdHJpbmcgaW5kaWNhdGluZworICAgICAqCQkJdGhlIGF1dGhlbnRpY2F0aW9uIHNjaGVtZSwgb3IKKyAgICAgKgkJCTxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSByZXF1ZXN0IHdhcyAKKyAgICAgKgkJCW5vdCBhdXRoZW50aWNhdGVkLiAgICAgCisgICAgICoKKyAgICAgKi8KKyAgIAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXV0aFR5cGUoKTsKKyAgICAKKyAgIAorICAgIAorCisgICAgLyoqCisgICAgICoKKyAgICAgKiBSZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgYWxsIG9mIHRoZSA8Y29kZT5Db29raWU8L2NvZGU+CisgICAgICogb2JqZWN0cyB0aGUgY2xpZW50IHNlbnQgd2l0aCB0aGlzIHJlcXVlc3QuCisgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBjb29raWVzIHdlcmUgc2VudC4KKyAgICAgKgorICAgICAqIEByZXR1cm4JCWFuIGFycmF5IG9mIGFsbCB0aGUgPGNvZGU+Q29va2llczwvY29kZT4KKyAgICAgKgkJCWluY2x1ZGVkIHdpdGggdGhpcyByZXF1ZXN0LCBvciA8Y29kZT5udWxsPC9jb2RlPgorICAgICAqCQkJaWYgdGhlIHJlcXVlc3QgaGFzIG5vIGNvb2tpZXMKKyAgICAgKgorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgQ29va2llW10gZ2V0Q29va2llcygpOworICAgIAorICAgIAorICAgIAorCisgICAgLyoqCisgICAgICoKKyAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHJlcXVlc3QgaGVhZGVyCisgICAgICogYXMgYSA8Y29kZT5sb25nPC9jb2RlPiB2YWx1ZSB0aGF0IHJlcHJlc2VudHMgYSAKKyAgICAgKiA8Y29kZT5EYXRlPC9jb2RlPiBvYmplY3QuIFVzZSB0aGlzIG1ldGhvZCB3aXRoCisgICAgICogaGVhZGVycyB0aGF0IGNvbnRhaW4gZGF0ZXMsIHN1Y2ggYXMKKyAgICAgKiA8Y29kZT5JZi1Nb2RpZmllZC1TaW5jZTwvY29kZT4uIAorICAgICAqCisgICAgICogPHA+VGhlIGRhdGUgaXMgcmV0dXJuZWQgYXMKKyAgICAgKiB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBzaW5jZSBKYW51YXJ5IDEsIDE5NzAgR01ULgorICAgICAqIFRoZSBoZWFkZXIgbmFtZSBpcyBjYXNlIGluc2Vuc2l0aXZlLgorICAgICAqCisgICAgICogPHA+SWYgdGhlIHJlcXVlc3QgZGlkIG5vdCBoYXZlIGEgaGVhZGVyIG9mIHRoZQorICAgICAqIHNwZWNpZmllZCBuYW1lLCB0aGlzIG1ldGhvZCByZXR1cm5zIC0xLiBJZiB0aGUgaGVhZGVyCisgICAgICogY2FuJ3QgYmUgY29udmVydGVkIHRvIGEgZGF0ZSwgdGhlIG1ldGhvZCB0aHJvd3MKKyAgICAgKiBhbiA8Y29kZT5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb248L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUJCWEgPGNvZGU+U3RyaW5nPC9jb2RlPiBzcGVjaWZ5aW5nIHRoZQorICAgICAqCQkJCW5hbWUgb2YgdGhlIGhlYWRlcgorICAgICAqCisgICAgICogQHJldHVybgkJCWEgPGNvZGU+bG9uZzwvY29kZT4gdmFsdWUKKyAgICAgKgkJCQlyZXByZXNlbnRpbmcgdGhlIGRhdGUgc3BlY2lmaWVkCisgICAgICoJCQkJaW4gdGhlIGhlYWRlciBleHByZXNzZWQgYXMKKyAgICAgKgkJCQl0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcworICAgICAqCQkJCXNpbmNlIEphbnVhcnkgMSwgMTk3MCBHTVQsCisgICAgICoJCQkJb3IgLTEgaWYgdGhlIG5hbWVkIGhlYWRlcgorICAgICAqCQkJCXdhcyBub3QgaW5jbHVkZWQgd2l0aCB0aGUKKyAgICAgKgkJCQlyZXF1ZXN0CisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uCUlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbglJZiB0aGUgaGVhZGVyIHZhbHVlCisgICAgICoJCQkJCQkJY2FuJ3QgYmUgY29udmVydGVkCisgICAgICoJCQkJCQkJdG8gYSBkYXRlCisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyBsb25nIGdldERhdGVIZWFkZXIoU3RyaW5nIG5hbWUpOworICAgIAorICAgIAorICAgIAorCisgICAgLyoqCisgICAgICoKKyAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHJlcXVlc3QgaGVhZGVyCisgICAgICogYXMgYSA8Y29kZT5TdHJpbmc8L2NvZGU+LiBJZiB0aGUgcmVxdWVzdCBkaWQgbm90IGluY2x1ZGUgYSBoZWFkZXIKKyAgICAgKiBvZiB0aGUgc3BlY2lmaWVkIG5hbWUsIHRoaXMgbWV0aG9kIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogSWYgdGhlcmUgYXJlIG11bHRpcGxlIGhlYWRlcnMgd2l0aCB0aGUgc2FtZSBuYW1lLCB0aGlzIG1ldGhvZAorICAgICAqIHJldHVybnMgdGhlIGZpcnN0IGhlYWQgaW4gdGhlIHJlcXVlc3QuCisgICAgICogVGhlIGhlYWRlciBuYW1lIGlzIGNhc2UgaW5zZW5zaXRpdmUuIFlvdSBjYW4gdXNlCisgICAgICogdGhpcyBtZXRob2Qgd2l0aCBhbnkgcmVxdWVzdCBoZWFkZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZQkJYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHNwZWNpZnlpbmcgdGhlCisgICAgICoJCQkJaGVhZGVyIG5hbWUKKyAgICAgKgorICAgICAqIEByZXR1cm4JCQlhIDxjb2RlPlN0cmluZzwvY29kZT4gY29udGFpbmluZyB0aGUKKyAgICAgKgkJCQl2YWx1ZSBvZiB0aGUgcmVxdWVzdGVkCisgICAgICoJCQkJaGVhZGVyLCBvciA8Y29kZT5udWxsPC9jb2RlPgorICAgICAqCQkJCWlmIHRoZSByZXF1ZXN0IGRvZXMgbm90CisgICAgICoJCQkJaGF2ZSBhIGhlYWRlciBvZiB0aGF0IG5hbWUKKyAgICAgKgorICAgICAqLwkJCQorCisgICAgcHVibGljIFN0cmluZyBnZXRIZWFkZXIoU3RyaW5nIG5hbWUpOyAKKworCisKKworICAgIC8qKgorICAgICAqCisgICAgICogUmV0dXJucyBhbGwgdGhlIHZhbHVlcyBvZiB0aGUgc3BlY2lmaWVkIHJlcXVlc3QgaGVhZGVyCisgICAgICogYXMgYW4gPGNvZGU+RW51bWVyYXRpb248L2NvZGU+IG9mIDxjb2RlPlN0cmluZzwvY29kZT4gb2JqZWN0cy4KKyAgICAgKgorICAgICAqIDxwPlNvbWUgaGVhZGVycywgc3VjaCBhcyA8Y29kZT5BY2NlcHQtTGFuZ3VhZ2U8L2NvZGU+IGNhbiBiZSBzZW50CisgICAgICogYnkgY2xpZW50cyBhcyBzZXZlcmFsIGhlYWRlcnMgZWFjaCB3aXRoIGEgZGlmZmVyZW50IHZhbHVlIHJhdGhlciB0aGFuCisgICAgICogc2VuZGluZyB0aGUgaGVhZGVyIGFzIGEgY29tbWEgc2VwYXJhdGVkIGxpc3QuCisgICAgICoKKyAgICAgKiA8cD5JZiB0aGUgcmVxdWVzdCBkaWQgbm90IGluY2x1ZGUgYW55IGhlYWRlcnMKKyAgICAgKiBvZiB0aGUgc3BlY2lmaWVkIG5hbWUsIHRoaXMgbWV0aG9kIHJldHVybnMgYW4gZW1wdHkKKyAgICAgKiA8Y29kZT5FbnVtZXJhdGlvbjwvY29kZT4uCisgICAgICogVGhlIGhlYWRlciBuYW1lIGlzIGNhc2UgaW5zZW5zaXRpdmUuIFlvdSBjYW4gdXNlCisgICAgICogdGhpcyBtZXRob2Qgd2l0aCBhbnkgcmVxdWVzdCBoZWFkZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZQkJYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHNwZWNpZnlpbmcgdGhlCisgICAgICoJCQkJaGVhZGVyIG5hbWUKKyAgICAgKgorICAgICAqIEByZXR1cm4JCQlhbiA8Y29kZT5FbnVtZXJhdGlvbjwvY29kZT4gY29udGFpbmluZworICAgICAqICAgICAgICAgICAgICAgICAgCXRoZSB2YWx1ZXMgb2YgdGhlIHJlcXVlc3RlZCBoZWFkZXIuIElmCisgICAgICogICAgICAgICAgICAgICAgICAJdGhlIHJlcXVlc3QgZG9lcyBub3QgaGF2ZSBhbnkgaGVhZGVycyBvZgorICAgICAqICAgICAgICAgICAgICAgICAgCXRoYXQgbmFtZSByZXR1cm4gYW4gZW1wdHkKKyAgICAgKiAgICAgICAgICAgICAgICAgIAllbnVtZXJhdGlvbi4gSWYgCisgICAgICogICAgICAgICAgICAgICAgICAJdGhlIGNvbnRhaW5lciBkb2VzIG5vdCBhbGxvdyBhY2Nlc3MgdG8KKyAgICAgKiAgICAgICAgICAgICAgICAgIAloZWFkZXIgaW5mb3JtYXRpb24sIHJldHVybiBudWxsCisgICAgICoKKyAgICAgKi8JCQkKKworICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRIZWFkZXJzKFN0cmluZyBuYW1lKTsgCisgICAgCisgICAgCisgICAgCisgICAgCisKKyAgICAvKioKKyAgICAgKgorICAgICAqIFJldHVybnMgYW4gZW51bWVyYXRpb24gb2YgYWxsIHRoZSBoZWFkZXIgbmFtZXMKKyAgICAgKiB0aGlzIHJlcXVlc3QgY29udGFpbnMuIElmIHRoZSByZXF1ZXN0IGhhcyBubworICAgICAqIGhlYWRlcnMsIHRoaXMgbWV0aG9kIHJldHVybnMgYW4gZW1wdHkgZW51bWVyYXRpb24uCisgICAgICoKKyAgICAgKiA8cD5Tb21lIHNlcnZsZXQgY29udGFpbmVycyBkbyBub3QgYWxsb3cKKyAgICAgKiBzZXJ2bGV0cyB0byBhY2Nlc3MgaGVhZGVycyB1c2luZyB0aGlzIG1ldGhvZCwgaW4KKyAgICAgKiB3aGljaCBjYXNlIHRoaXMgbWV0aG9kIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4KKyAgICAgKgorICAgICAqIEByZXR1cm4JCQlhbiBlbnVtZXJhdGlvbiBvZiBhbGwgdGhlCisgICAgICoJCQkJaGVhZGVyIG5hbWVzIHNlbnQgd2l0aCB0aGlzCisgICAgICoJCQkJcmVxdWVzdDsgaWYgdGhlIHJlcXVlc3QgaGFzCisgICAgICoJCQkJbm8gaGVhZGVycywgYW4gZW1wdHkgZW51bWVyYXRpb247CisgICAgICoJCQkJaWYgdGhlIHNlcnZsZXQgY29udGFpbmVyIGRvZXMgbm90CisgICAgICoJCQkJYWxsb3cgc2VydmxldHMgdG8gdXNlIHRoaXMgbWV0aG9kLAorICAgICAqCQkJCTxjb2RlPm51bGw8L2NvZGU+CisgICAgICoJCQkJCisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRIZWFkZXJOYW1lcygpOworICAgIAorICAgIAorICAgIAorCisgICAgLyoqCisgICAgICoKKyAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHJlcXVlc3QgaGVhZGVyCisgICAgICogYXMgYW4gPGNvZGU+aW50PC9jb2RlPi4gSWYgdGhlIHJlcXVlc3QgZG9lcyBub3QgaGF2ZSBhIGhlYWRlcgorICAgICAqIG9mIHRoZSBzcGVjaWZpZWQgbmFtZSwgdGhpcyBtZXRob2QgcmV0dXJucyAtMS4gSWYgdGhlCisgICAgICogaGVhZGVyIGNhbm5vdCBiZSBjb252ZXJ0ZWQgdG8gYW4gaW50ZWdlciwgdGhpcyBtZXRob2QKKyAgICAgKiB0aHJvd3MgYSA8Y29kZT5OdW1iZXJGb3JtYXRFeGNlcHRpb248L2NvZGU+LgorICAgICAqCisgICAgICogPHA+VGhlIGhlYWRlciBuYW1lIGlzIGNhc2UgaW5zZW5zaXRpdmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZQkJYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHNwZWNpZnlpbmcgdGhlIG5hbWUKKyAgICAgKgkJCQlvZiBhIHJlcXVlc3QgaGVhZGVyCisgICAgICoKKyAgICAgKiBAcmV0dXJuCQkJYW4gaW50ZWdlciBleHByZXNzaW5nIHRoZSB2YWx1ZSAKKyAgICAgKiAJCQkJb2YgdGhlIHJlcXVlc3QgaGVhZGVyIG9yIC0xCisgICAgICoJCQkJaWYgdGhlIHJlcXVlc3QgZG9lc24ndCBoYXZlIGEKKyAgICAgKgkJCQloZWFkZXIgb2YgdGhpcyBuYW1lCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uCU51bWJlckZvcm1hdEV4Y2VwdGlvbgkJSWYgdGhlIGhlYWRlciB2YWx1ZQorICAgICAqCQkJCQkJCWNhbid0IGJlIGNvbnZlcnRlZAorICAgICAqCQkJCQkJCXRvIGFuIDxjb2RlPmludDwvY29kZT4KKyAgICAgKi8KKworICAgIHB1YmxpYyBpbnQgZ2V0SW50SGVhZGVyKFN0cmluZyBuYW1lKTsKKyAgICAKKyAgICAKKyAgICAKKworICAgIC8qKgorICAgICAqCisgICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgSFRUUCBtZXRob2Qgd2l0aCB3aGljaCB0aGlzIAorICAgICAqIHJlcXVlc3Qgd2FzIG1hZGUsIGZvciBleGFtcGxlLCBHRVQsIFBPU1QsIG9yIFBVVC4KKyAgICAgKiBTYW1lIGFzIHRoZSB2YWx1ZSBvZiB0aGUgQ0dJIHZhcmlhYmxlIFJFUVVFU1RfTUVUSE9ELgorICAgICAqCisgICAgICogQHJldHVybgkJCWEgPGNvZGU+U3RyaW5nPC9jb2RlPiAKKyAgICAgKgkJCQlzcGVjaWZ5aW5nIHRoZSBuYW1lCisgICAgICoJCQkJb2YgdGhlIG1ldGhvZCB3aXRoIHdoaWNoCisgICAgICoJCQkJdGhpcyByZXF1ZXN0IHdhcyBtYWRlCisgICAgICoKKyAgICAgKi8KKyAKKyAgICBwdWJsaWMgU3RyaW5nIGdldE1ldGhvZCgpOworICAgIAorICAgIAorICAgIAorCisgICAgLyoqCisgICAgICoKKyAgICAgKiBSZXR1cm5zIGFueSBleHRyYSBwYXRoIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aAorICAgICAqIHRoZSBVUkwgdGhlIGNsaWVudCBzZW50IHdoZW4gaXQgbWFkZSB0aGlzIHJlcXVlc3QuCisgICAgICogVGhlIGV4dHJhIHBhdGggaW5mb3JtYXRpb24gZm9sbG93cyB0aGUgc2VydmxldCBwYXRoCisgICAgICogYnV0IHByZWNlZGVzIHRoZSBxdWVyeSBzdHJpbmcgYW5kIHdpbGwgc3RhcnQgd2l0aAorICAgICAqIGEgIi8iIGNoYXJhY3Rlci4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgbWV0aG9kIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUKKyAgICAgKiB3YXMgbm8gZXh0cmEgcGF0aCBpbmZvcm1hdGlvbi4KKyAgICAgKgorICAgICAqIDxwPlNhbWUgYXMgdGhlIHZhbHVlIG9mIHRoZSBDR0kgdmFyaWFibGUgUEFUSF9JTkZPLgorICAgICAqCisgICAgICoKKyAgICAgKiBAcmV0dXJuCQlhIDxjb2RlPlN0cmluZzwvY29kZT4sIGRlY29kZWQgYnkgdGhlCisgICAgICoJCQl3ZWIgY29udGFpbmVyLCBzcGVjaWZ5aW5nIAorICAgICAqCQkJZXh0cmEgcGF0aCBpbmZvcm1hdGlvbiB0aGF0IGNvbWVzCisgICAgICoJCQlhZnRlciB0aGUgc2VydmxldCBwYXRoIGJ1dCBiZWZvcmUKKyAgICAgKgkJCXRoZSBxdWVyeSBzdHJpbmcgaW4gdGhlIHJlcXVlc3QgVVJMOworICAgICAqCQkJb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIFVSTCBkb2VzIG5vdCBoYXZlCisgICAgICoJCQlhbnkgZXh0cmEgcGF0aCBpbmZvcm1hdGlvbgorICAgICAqCisgICAgICovCisgICAgIAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aEluZm8oKTsKKyAgICAKKworIAorCisgICAgLyoqCisgICAgICoKKyAgICAgKiBSZXR1cm5zIGFueSBleHRyYSBwYXRoIGluZm9ybWF0aW9uIGFmdGVyIHRoZSBzZXJ2bGV0IG5hbWUKKyAgICAgKiBidXQgYmVmb3JlIHRoZSBxdWVyeSBzdHJpbmcsIGFuZCB0cmFuc2xhdGVzIGl0IHRvIGEgcmVhbAorICAgICAqIHBhdGguIFNhbWUgYXMgdGhlIHZhbHVlIG9mIHRoZSBDR0kgdmFyaWFibGUgUEFUSF9UUkFOU0xBVEVELgorICAgICAqCisgICAgICogPHA+SWYgdGhlIFVSTCBkb2VzIG5vdCBoYXZlIGFueSBleHRyYSBwYXRoIGluZm9ybWF0aW9uLAorICAgICAqIHRoaXMgbWV0aG9kIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gb3IgdGhlIHNlcnZsZXQgY29udGFpbmVyCisgICAgICogY2Fubm90IHRyYW5zbGF0ZSB0aGUgdmlydHVhbCBwYXRoIHRvIGEgcmVhbCBwYXRoIGZvciBhbnkgcmVhc29uCisgICAgICogKHN1Y2ggYXMgd2hlbiB0aGUgd2ViIGFwcGxpY2F0aW9uIGlzIGV4ZWN1dGVkIGZyb20gYW4gYXJjaGl2ZSkuCisgICAgICoKKyAgICAgKiBUaGUgd2ViIGNvbnRhaW5lciBkb2VzIG5vdCBkZWNvZGUgdGhpcyBzdHJpbmcuCisgICAgICoKKyAgICAgKgorICAgICAqIEByZXR1cm4JCWEgPGNvZGU+U3RyaW5nPC9jb2RlPiBzcGVjaWZ5aW5nIHRoZQorICAgICAqCQkJcmVhbCBwYXRoLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgorICAgICAqCQkJdGhlIFVSTCBkb2VzIG5vdCBoYXZlIGFueSBleHRyYSBwYXRoCisgICAgICoJCQlpbmZvcm1hdGlvbgorICAgICAqCisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aFRyYW5zbGF0ZWQoKTsKKyAgICAKKworIAorCisgICAgLyoqCisgICAgICoKKyAgICAgKiBSZXR1cm5zIHRoZSBwb3J0aW9uIG9mIHRoZSByZXF1ZXN0IFVSSSB0aGF0IGluZGljYXRlcyB0aGUgY29udGV4dAorICAgICAqIG9mIHRoZSByZXF1ZXN0LiAgVGhlIGNvbnRleHQgcGF0aCBhbHdheXMgY29tZXMgZmlyc3QgaW4gYSByZXF1ZXN0CisgICAgICogVVJJLiAgVGhlIHBhdGggc3RhcnRzIHdpdGggYSAiLyIgY2hhcmFjdGVyIGJ1dCBkb2VzIG5vdCBlbmQgd2l0aCBhICIvIgorICAgICAqIGNoYXJhY3Rlci4gIEZvciBzZXJ2bGV0cyBpbiB0aGUgZGVmYXVsdCAocm9vdCkgY29udGV4dCwgdGhpcyBtZXRob2QKKyAgICAgKiByZXR1cm5zICIiLiBUaGUgY29udGFpbmVyIGRvZXMgbm90IGRlY29kZSB0aGlzIHN0cmluZy4KKyAgICAgKgorICAgICAqCisgICAgICogQHJldHVybgkJYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHNwZWNpZnlpbmcgdGhlCisgICAgICoJCQlwb3J0aW9uIG9mIHRoZSByZXF1ZXN0IFVSSSB0aGF0IGluZGljYXRlcyB0aGUgY29udGV4dAorICAgICAqCQkJb2YgdGhlIHJlcXVlc3QKKyAgICAgKgorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRleHRQYXRoKCk7CisgICAgCisgICAgCisgICAgCisKKyAgICAvKioKKyAgICAgKgorICAgICAqIFJldHVybnMgdGhlIHF1ZXJ5IHN0cmluZyB0aGF0IGlzIGNvbnRhaW5lZCBpbiB0aGUgcmVxdWVzdAorICAgICAqIFVSTCBhZnRlciB0aGUgcGF0aC4gVGhpcyBtZXRob2QgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPgorICAgICAqIGlmIHRoZSBVUkwgZG9lcyBub3QgaGF2ZSBhIHF1ZXJ5IHN0cmluZy4gU2FtZSBhcyB0aGUgdmFsdWUKKyAgICAgKiBvZiB0aGUgQ0dJIHZhcmlhYmxlIFFVRVJZX1NUUklORy4gCisgICAgICoKKyAgICAgKiBAcmV0dXJuCQlhIDxjb2RlPlN0cmluZzwvY29kZT4gY29udGFpbmluZyB0aGUgcXVlcnkKKyAgICAgKgkJCXN0cmluZyBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgVVJMIAorICAgICAqCQkJY29udGFpbnMgbm8gcXVlcnkgc3RyaW5nLiBUaGUgdmFsdWUgaXMgbm90CisgICAgICoJCQlkZWNvZGVkIGJ5IHRoZSBjb250YWluZXIuCisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UXVlcnlTdHJpbmcoKTsKKyAgICAKKyAgICAKKyAgICAKKworICAgIC8qKgorICAgICAqCisgICAgICogUmV0dXJucyB0aGUgbG9naW4gb2YgdGhlIHVzZXIgbWFraW5nIHRoaXMgcmVxdWVzdCwgaWYgdGhlCisgICAgICogdXNlciBoYXMgYmVlbiBhdXRoZW50aWNhdGVkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgdXNlciAKKyAgICAgKiBoYXMgbm90IGJlZW4gYXV0aGVudGljYXRlZC4KKyAgICAgKiBXaGV0aGVyIHRoZSB1c2VyIG5hbWUgaXMgc2VudCB3aXRoIGVhY2ggc3Vic2VxdWVudCByZXF1ZXN0CisgICAgICogZGVwZW5kcyBvbiB0aGUgYnJvd3NlciBhbmQgdHlwZSBvZiBhdXRoZW50aWNhdGlvbi4gU2FtZSBhcyB0aGUgCisgICAgICogdmFsdWUgb2YgdGhlIENHSSB2YXJpYWJsZSBSRU1PVEVfVVNFUi4KKyAgICAgKgorICAgICAqIEByZXR1cm4JCWEgPGNvZGU+U3RyaW5nPC9jb2RlPiBzcGVjaWZ5aW5nIHRoZSBsb2dpbgorICAgICAqCQkJb2YgdGhlIHVzZXIgbWFraW5nIHRoaXMgcmVxdWVzdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KKyAgICAgKgkJCWlmIHRoZSB1c2VyIGxvZ2luIGlzIG5vdCBrbm93bgorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlbW90ZVVzZXIoKTsKKyAgICAKKyAgICAKKyAgICAKKworICAgIC8qKgorICAgICAqCisgICAgICogUmV0dXJucyBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBhdXRoZW50aWNhdGVkIHVzZXIgaXMgaW5jbHVkZWQKKyAgICAgKiBpbiB0aGUgc3BlY2lmaWVkIGxvZ2ljYWwgInJvbGUiLiAgUm9sZXMgYW5kIHJvbGUgbWVtYmVyc2hpcCBjYW4gYmUKKyAgICAgKiBkZWZpbmVkIHVzaW5nIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMuICBJZiB0aGUgdXNlciBoYXMgbm90IGJlZW4KKyAgICAgKiBhdXRoZW50aWNhdGVkLCB0aGUgbWV0aG9kIHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIHJvbGUJCWEgPGNvZGU+U3RyaW5nPC9jb2RlPiBzcGVjaWZ5aW5nIHRoZSBuYW1lCisgICAgICoJCQkJb2YgdGhlIHJvbGUKKyAgICAgKgorICAgICAqIEByZXR1cm4JCWEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gaW5kaWNhdGluZyB3aGV0aGVyCisgICAgICoJCQl0aGUgdXNlciBtYWtpbmcgdGhpcyByZXF1ZXN0IGJlbG9uZ3MgdG8gYSBnaXZlbiByb2xlOworICAgICAqCQkJPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZSB1c2VyIGhhcyBub3QgYmVlbiAKKyAgICAgKgkJCWF1dGhlbnRpY2F0ZWQKKyAgICAgKgorICAgICAqLworCisgICAgcHVibGljIGJvb2xlYW4gaXNVc2VySW5Sb2xlKFN0cmluZyByb2xlKTsKKyAgICAKKyAgICAKKyAgICAKKworICAgIC8qKgorICAgICAqCisgICAgICogUmV0dXJucyBhIDxjb2RlPmphdmEuc2VjdXJpdHkuUHJpbmNpcGFsPC9jb2RlPiBvYmplY3QgY29udGFpbmluZworICAgICAqIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IGF1dGhlbnRpY2F0ZWQgdXNlci4gSWYgdGhlIHVzZXIgaGFzIG5vdCBiZWVuCisgICAgICogYXV0aGVudGljYXRlZCwgdGhlIG1ldGhvZCByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHJldHVybgkJYSA8Y29kZT5qYXZhLnNlY3VyaXR5LlByaW5jaXBhbDwvY29kZT4gY29udGFpbmluZworICAgICAqCQkJdGhlIG5hbWUgb2YgdGhlIHVzZXIgbWFraW5nIHRoaXMgcmVxdWVzdDsKKyAgICAgKgkJCTxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSB1c2VyIGhhcyBub3QgYmVlbiAKKyAgICAgKgkJCWF1dGhlbnRpY2F0ZWQKKyAgICAgKgorICAgICAqLworCisgICAgcHVibGljIGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsIGdldFVzZXJQcmluY2lwYWwoKTsKKyAgICAKKyAgICAKKyAgICAKKworICAgIC8qKgorICAgICAqCisgICAgICogUmV0dXJucyB0aGUgc2Vzc2lvbiBJRCBzcGVjaWZpZWQgYnkgdGhlIGNsaWVudC4gVGhpcyBtYXkKKyAgICAgKiBub3QgYmUgdGhlIHNhbWUgYXMgdGhlIElEIG9mIHRoZSBjdXJyZW50IHZhbGlkIHNlc3Npb24KKyAgICAgKiBmb3IgdGhpcyByZXF1ZXN0LgorICAgICAqIElmIHRoZSBjbGllbnQgZGlkIG5vdCBzcGVjaWZ5IGEgc2Vzc2lvbiBJRCwgdGhpcyBtZXRob2QgcmV0dXJucworICAgICAqIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICoKKyAgICAgKiBAcmV0dXJuCQlhIDxjb2RlPlN0cmluZzwvY29kZT4gc3BlY2lmeWluZyB0aGUgc2Vzc2lvbgorICAgICAqCQkJSUQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSByZXF1ZXN0IGRpZAorICAgICAqCQkJbm90IHNwZWNpZnkgYSBzZXNzaW9uIElECisgICAgICoKKyAgICAgKiBAc2VlCQkjaXNSZXF1ZXN0ZWRTZXNzaW9uSWRWYWxpZAorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlcXVlc3RlZFNlc3Npb25JZCgpOworICAgIAorICAgIAorICAgIAorICAgIAorICAgIC8qKgorICAgICAqCisgICAgICogUmV0dXJucyB0aGUgcGFydCBvZiB0aGlzIHJlcXVlc3QncyBVUkwgZnJvbSB0aGUgcHJvdG9jb2wKKyAgICAgKiBuYW1lIHVwIHRvIHRoZSBxdWVyeSBzdHJpbmcgaW4gdGhlIGZpcnN0IGxpbmUgb2YgdGhlIEhUVFAgcmVxdWVzdC4KKyAgICAgKiBUaGUgd2ViIGNvbnRhaW5lciBkb2VzIG5vdCBkZWNvZGUgdGhpcyBTdHJpbmcuCisgICAgICogRm9yIGV4YW1wbGU6CisgICAgICoKKyAgICAgKiAKKworICAgICAqIDx0YWJsZSBzdW1tYXJ5PSJFeGFtcGxlcyBvZiBSZXR1cm5lZCBWYWx1ZXMiPgorICAgICAqIDx0ciBhbGlnbj1sZWZ0Pjx0aD5GaXJzdCBsaW5lIG9mIEhUVFAgcmVxdWVzdCAgICAgIDwvdGg+CisgICAgICogPHRoPiAgICAgUmV0dXJuZWQgVmFsdWU8L3RoPgorICAgICAqIDx0cj48dGQ+UE9TVCAvc29tZS9wYXRoLmh0bWwgSFRUUC8xLjE8dGQ+PHRkPi9zb21lL3BhdGguaHRtbAorICAgICAqIDx0cj48dGQ+R0VUIGh0dHA6Ly9mb28uYmFyL2EuaHRtbCBIVFRQLzEuMAorICAgICAqIDx0ZD48dGQ+L2EuaHRtbAorICAgICAqIDx0cj48dGQ+SEVBRCAveHl6P2E9YiBIVFRQLzEuMTx0ZD48dGQ+L3h5egorICAgICAqIDwvdGFibGU+CisgICAgICoKKyAgICAgKiA8cD5UbyByZWNvbnN0cnVjdCBhbiBVUkwgd2l0aCBhIHNjaGVtZSBhbmQgaG9zdCwgdXNlCisgICAgICoge0BsaW5rIEh0dHBVdGlscyNnZXRSZXF1ZXN0VVJMfS4KKyAgICAgKgorICAgICAqIEByZXR1cm4JCWEgPGNvZGU+U3RyaW5nPC9jb2RlPiBjb250YWluaW5nCisgICAgICoJCQl0aGUgcGFydCBvZiB0aGUgVVJMIGZyb20gdGhlIAorICAgICAqCQkJcHJvdG9jb2wgbmFtZSB1cCB0byB0aGUgcXVlcnkgc3RyaW5nCisgICAgICoKKyAgICAgKiBAc2VlCQlIdHRwVXRpbHMjZ2V0UmVxdWVzdFVSTAorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlcXVlc3RVUkkoKTsKKyAgICAKKyAgICAvKioKKyAgICAgKgorICAgICAqIFJlY29uc3RydWN0cyB0aGUgVVJMIHRoZSBjbGllbnQgdXNlZCB0byBtYWtlIHRoZSByZXF1ZXN0LgorICAgICAqIFRoZSByZXR1cm5lZCBVUkwgY29udGFpbnMgYSBwcm90b2NvbCwgc2VydmVyIG5hbWUsIHBvcnQKKyAgICAgKiBudW1iZXIsIGFuZCBzZXJ2ZXIgcGF0aCwgYnV0IGl0IGRvZXMgbm90IGluY2x1ZGUgcXVlcnkKKyAgICAgKiBzdHJpbmcgcGFyYW1ldGVycy4KKyAgICAgKgorICAgICAqIDxwPkJlY2F1c2UgdGhpcyBtZXRob2QgcmV0dXJucyBhIDxjb2RlPlN0cmluZ0J1ZmZlcjwvY29kZT4sCisgICAgICogbm90IGEgc3RyaW5nLCB5b3UgY2FuIG1vZGlmeSB0aGUgVVJMIGVhc2lseSwgZm9yIGV4YW1wbGUsCisgICAgICogdG8gYXBwZW5kIHF1ZXJ5IHBhcmFtZXRlcnMuCisgICAgICoKKyAgICAgKiA8cD5UaGlzIG1ldGhvZCBpcyB1c2VmdWwgZm9yIGNyZWF0aW5nIHJlZGlyZWN0IG1lc3NhZ2VzCisgICAgICogYW5kIGZvciByZXBvcnRpbmcgZXJyb3JzLgorICAgICAqCisgICAgICogQHJldHVybgkJYSA8Y29kZT5TdHJpbmdCdWZmZXI8L2NvZGU+IG9iamVjdCBjb250YWluaW5nCisgICAgICoJCQl0aGUgcmVjb25zdHJ1Y3RlZCBVUkwKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdCdWZmZXIgZ2V0UmVxdWVzdFVSTCgpOworICAgIAorCisgICAgLyoqCisgICAgICoKKyAgICAgKiBSZXR1cm5zIHRoZSBwYXJ0IG9mIHRoaXMgcmVxdWVzdCdzIFVSTCB0aGF0IGNhbGxzCisgICAgICogdGhlIHNlcnZsZXQuIFRoaXMgcGF0aCBzdGFydHMgd2l0aCBhICIvIiBjaGFyYWN0ZXIKKyAgICAgKiBhbmQgaW5jbHVkZXMgZWl0aGVyIHRoZSBzZXJ2bGV0IG5hbWUgb3IgYSBwYXRoIHRvCisgICAgICogdGhlIHNlcnZsZXQsIGJ1dCBkb2VzIG5vdCBpbmNsdWRlIGFueSBleHRyYSBwYXRoCisgICAgICogaW5mb3JtYXRpb24gb3IgYSBxdWVyeSBzdHJpbmcuIFNhbWUgYXMgdGhlIHZhbHVlIG9mCisgICAgICogdGhlIENHSSB2YXJpYWJsZSBTQ1JJUFRfTkFNRS4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIGFuIGVtcHR5IHN0cmluZyAoIiIpIGlmIHRoZQorICAgICAqIHNlcnZsZXQgdXNlZCB0byBwcm9jZXNzIHRoaXMgcmVxdWVzdCB3YXMgbWF0Y2hlZCB1c2luZworICAgICAqIHRoZSAiLyoiIHBhdHRlcm4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuCQlhIDxjb2RlPlN0cmluZzwvY29kZT4gY29udGFpbmluZworICAgICAqCQkJdGhlIG5hbWUgb3IgcGF0aCBvZiB0aGUgc2VydmxldCBiZWluZworICAgICAqCQkJY2FsbGVkLCBhcyBzcGVjaWZpZWQgaW4gdGhlIHJlcXVlc3QgVVJMLAorICAgICAqCQkJZGVjb2RlZCwgb3IgYW4gZW1wdHkgc3RyaW5nIGlmIHRoZSBzZXJ2bGV0CisgICAgICoJCQl1c2VkIHRvIHByb2Nlc3MgdGhlIHJlcXVlc3QgaXMgbWF0Y2hlZAorICAgICAqCQkJdXNpbmcgdGhlICIvKiIgcGF0dGVybi4KKyAgICAgKgorICAgICAqLworCisgICAgcHVibGljIFN0cmluZyBnZXRTZXJ2bGV0UGF0aCgpOworICAgIAorICAgIAorICAgIAorCisgICAgLyoqCisgICAgICoKKyAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IDxjb2RlPkh0dHBTZXNzaW9uPC9jb2RlPgorICAgICAqIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJlcXVlc3Qgb3IsIGlmIHRoZXJlIGlzIG5vCisgICAgICogY3VycmVudCBzZXNzaW9uIGFuZCA8Y29kZT5jcmVhdGU8L2NvZGU+IGlzIHRydWUsIHJldHVybnMgCisgICAgICogYSBuZXcgc2Vzc2lvbi4KKyAgICAgKgorICAgICAqIDxwPklmIDxjb2RlPmNyZWF0ZTwvY29kZT4gaXMgPGNvZGU+ZmFsc2U8L2NvZGU+CisgICAgICogYW5kIHRoZSByZXF1ZXN0IGhhcyBubyB2YWxpZCA8Y29kZT5IdHRwU2Vzc2lvbjwvY29kZT4sCisgICAgICogdGhpcyBtZXRob2QgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKgorICAgICAqIDxwPlRvIG1ha2Ugc3VyZSB0aGUgc2Vzc2lvbiBpcyBwcm9wZXJseSBtYWludGFpbmVkLAorICAgICAqIHlvdSBtdXN0IGNhbGwgdGhpcyBtZXRob2QgYmVmb3JlIAorICAgICAqIHRoZSByZXNwb25zZSBpcyBjb21taXR0ZWQuIElmIHRoZSBjb250YWluZXIgaXMgdXNpbmcgY29va2llcworICAgICAqIHRvIG1haW50YWluIHNlc3Npb24gaW50ZWdyaXR5IGFuZCBpcyBhc2tlZCB0byBjcmVhdGUgYSBuZXcgc2Vzc2lvbgorICAgICAqIHdoZW4gdGhlIHJlc3BvbnNlIGlzIGNvbW1pdHRlZCwgYW4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlzIHRocm93bi4KKyAgICAgKgorICAgICAqCisgICAgICoKKyAgICAgKgorICAgICAqIEBwYXJhbSBjcmVhdGUJPGNvZGU+dHJ1ZTwvY29kZT4gdG8gY3JlYXRlCisgICAgICoJCQlhIG5ldyBzZXNzaW9uIGZvciB0aGlzIHJlcXVlc3QgaWYgbmVjZXNzYXJ5OyAKKyAgICAgKgkJCTxjb2RlPmZhbHNlPC9jb2RlPiB0byByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4KKyAgICAgKgkJCWlmIHRoZXJlJ3Mgbm8gY3VycmVudCBzZXNzaW9uCisgICAgICoJCQkKKyAgICAgKgorICAgICAqIEByZXR1cm4gCQl0aGUgPGNvZGU+SHR0cFNlc3Npb248L2NvZGU+IGFzc29jaWF0ZWQgCisgICAgICoJCQl3aXRoIHRoaXMgcmVxdWVzdCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgorICAgICAqIAkJCTxjb2RlPmNyZWF0ZTwvY29kZT4gaXMgPGNvZGU+ZmFsc2U8L2NvZGU+CisgICAgICoJCQlhbmQgdGhlIHJlcXVlc3QgaGFzIG5vIHZhbGlkIHNlc3Npb24KKyAgICAgKgorICAgICAqIEBzZWUJI2dldFNlc3Npb24oKQorICAgICAqCisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyBIdHRwU2Vzc2lvbiBnZXRTZXNzaW9uKGJvb2xlYW4gY3JlYXRlKTsKKyAgICAKKyAgICAKKyAgICAKKyAgIAorCisgICAgLyoqCisgICAgICoKKyAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHNlc3Npb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmVxdWVzdCwKKyAgICAgKiBvciBpZiB0aGUgcmVxdWVzdCBkb2VzIG5vdCBoYXZlIGEgc2Vzc2lvbiwgY3JlYXRlcyBvbmUuCisgICAgICogCisgICAgICogQHJldHVybgkJdGhlIDxjb2RlPkh0dHBTZXNzaW9uPC9jb2RlPiBhc3NvY2lhdGVkCisgICAgICoJCQl3aXRoIHRoaXMgcmVxdWVzdAorICAgICAqCisgICAgICogQHNlZQkjZ2V0U2Vzc2lvbihib29sZWFuKQorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgSHR0cFNlc3Npb24gZ2V0U2Vzc2lvbigpOworICAgIAorICAgIAorICAgIAorICAgIAorICAgIAorCisgICAgLyoqCisgICAgICoKKyAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgcmVxdWVzdGVkIHNlc3Npb24gSUQgaXMgc3RpbGwgdmFsaWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCQkJPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcworICAgICAqCQkJCXJlcXVlc3QgaGFzIGFuIGlkIGZvciBhIHZhbGlkIHNlc3Npb24KKyAgICAgKgkJCQlpbiB0aGUgY3VycmVudCBzZXNzaW9uIGNvbnRleHQ7CisgICAgICoJCQkJPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQorICAgICAqCisgICAgICogQHNlZQkJCSNnZXRSZXF1ZXN0ZWRTZXNzaW9uSWQKKyAgICAgKiBAc2VlCQkJI2dldFNlc3Npb24KKyAgICAgKiBAc2VlCQkJSHR0cFNlc3Npb25Db250ZXh0CisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyBib29sZWFuIGlzUmVxdWVzdGVkU2Vzc2lvbklkVmFsaWQoKTsKKyAgICAKKyAgICAKKyAgICAKKworICAgIC8qKgorICAgICAqCisgICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIHJlcXVlc3RlZCBzZXNzaW9uIElEIGNhbWUgaW4gYXMgYSBjb29raWUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCQkJPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNlc3Npb24gSUQKKyAgICAgKgkJCQljYW1lIGluIGFzIGEKKyAgICAgKgkJCQljb29raWU7IG90aGVyd2lzZSwgPGNvZGU+ZmFsc2U8L2NvZGU+CisgICAgICoKKyAgICAgKgorICAgICAqIEBzZWUJCQkjZ2V0U2Vzc2lvbgorICAgICAqCisgICAgICovIAorCisgICAgcHVibGljIGJvb2xlYW4gaXNSZXF1ZXN0ZWRTZXNzaW9uSWRGcm9tQ29va2llKCk7CisgICAgCisgICAgCisgICAgCisKKyAgICAvKioKKyAgICAgKgorICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSByZXF1ZXN0ZWQgc2Vzc2lvbiBJRCBjYW1lIGluIGFzIHBhcnQgb2YgdGhlIAorICAgICAqIHJlcXVlc3QgVVJMLgorICAgICAqCisgICAgICogQHJldHVybgkJCTxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzZXNzaW9uIElECisgICAgICoJCQkJY2FtZSBpbiBhcyBwYXJ0IG9mIGEgVVJMOyBvdGhlcndpc2UsCisgICAgICoJCQkJPGNvZGU+ZmFsc2U8L2NvZGU+CisgICAgICoKKyAgICAgKgorICAgICAqIEBzZWUJCQkjZ2V0U2Vzc2lvbgorICAgICAqCisgICAgICovCisgICAgCisgICAgcHVibGljIGJvb2xlYW4gaXNSZXF1ZXN0ZWRTZXNzaW9uSWRGcm9tVVJMKCk7CisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgLyoqCisgICAgICoKKyAgICAgKiBAZGVwcmVjYXRlZAkJQXMgb2YgVmVyc2lvbiAyLjEgb2YgdGhlIEphdmEgU2VydmxldAorICAgICAqCQkJCUFQSSwgdXNlIHtAbGluayAjaXNSZXF1ZXN0ZWRTZXNzaW9uSWRGcm9tVVJMfQorICAgICAqCQkJCWluc3RlYWQuCisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyBib29sZWFuIGlzUmVxdWVzdGVkU2Vzc2lvbklkRnJvbVVybCgpOworCisKKyAgICAKK30KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2h0dHAvSHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlci5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvaHR0cC9IdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzYxZTM4ZgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2h0dHAvSHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlci5qYXZhCkBAIC0wLDAgKzEsMjYyIEBACisvKgorKiBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCitwYWNrYWdlIGphdmF4LnNlcnZsZXQuaHR0cDsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldFJlcXVlc3RXcmFwcGVyOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKKworLyoqCisgKiAKKyAqIFByb3ZpZGVzIGEgY29udmVuaWVudCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgSHR0cFNlcnZsZXRSZXF1ZXN0IGludGVyZmFjZSB0aGF0CisgKiBjYW4gYmUgc3ViY2xhc3NlZCBieSBkZXZlbG9wZXJzIHdpc2hpbmcgdG8gYWRhcHQgdGhlIHJlcXVlc3QgdG8gYSBTZXJ2bGV0LgorICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSBXcmFwcGVyIG9yIERlY29yYXRvciBwYXR0ZXJuLiBNZXRob2RzIGRlZmF1bHQgdG8KKyAqIGNhbGxpbmcgdGhyb3VnaCB0byB0aGUgd3JhcHBlZCByZXF1ZXN0IG9iamVjdC4KKyAqIAorICoKKyAqIEBzZWUgCWphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3QKKyAgKiBAc2luY2UJdiAyLjMKKyAqCisgKi8KKworCitwdWJsaWMgY2xhc3MgSHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlciBleHRlbmRzIFNlcnZsZXRSZXF1ZXN0V3JhcHBlciBpbXBsZW1lbnRzIEh0dHBTZXJ2bGV0UmVxdWVzdCB7CisKKwkvKiogCisJKiBDb25zdHJ1Y3RzIGEgcmVxdWVzdCBvYmplY3Qgd3JhcHBpbmcgdGhlIGdpdmVuIHJlcXVlc3QuCisJKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHJlcXVlc3QgaXMgbnVsbAorCSovCisgICAgcHVibGljIEh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKwkgICAgc3VwZXIocmVxdWVzdCk7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgSHR0cFNlcnZsZXRSZXF1ZXN0IF9nZXRIdHRwU2VydmxldFJlcXVlc3QoKSB7CisJcmV0dXJuIChIdHRwU2VydmxldFJlcXVlc3QpIHN1cGVyLmdldFJlcXVlc3QoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBpcyB0byByZXR1cm4gZ2V0QXV0aFR5cGUoKQorICAgICAqIG9uIHRoZSB3cmFwcGVkIHJlcXVlc3Qgb2JqZWN0LgorICAgICAqLworCisgICAgcHVibGljIFN0cmluZyBnZXRBdXRoVHlwZSgpIHsKKwlyZXR1cm4gdGhpcy5fZ2V0SHR0cFNlcnZsZXRSZXF1ZXN0KCkuZ2V0QXV0aFR5cGUoKTsKKyAgICB9CisgICAKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBpcyB0byByZXR1cm4gZ2V0Q29va2llcygpCisgICAgICogb24gdGhlIHdyYXBwZWQgcmVxdWVzdCBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIENvb2tpZVtdIGdldENvb2tpZXMoKSB7CisJcmV0dXJuIHRoaXMuX2dldEh0dHBTZXJ2bGV0UmVxdWVzdCgpLmdldENvb2tpZXMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBpcyB0byByZXR1cm4gZ2V0RGF0ZUhlYWRlcihTdHJpbmcgbmFtZSkKKyAgICAgKiBvbiB0aGUgd3JhcHBlZCByZXF1ZXN0IG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXREYXRlSGVhZGVyKFN0cmluZyBuYW1lKSB7CisJcmV0dXJuIHRoaXMuX2dldEh0dHBTZXJ2bGV0UmVxdWVzdCgpLmdldERhdGVIZWFkZXIobmFtZSk7CisgICAgfQorICAgICAgICAJCisgICAgLyoqCisgICAgICogVGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgdGhpcyBtZXRob2QgaXMgdG8gcmV0dXJuIGdldEhlYWRlcihTdHJpbmcgbmFtZSkKKyAgICAgKiBvbiB0aGUgd3JhcHBlZCByZXF1ZXN0IG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEhlYWRlcihTdHJpbmcgbmFtZSkgeworCXJldHVybiB0aGlzLl9nZXRIdHRwU2VydmxldFJlcXVlc3QoKS5nZXRIZWFkZXIobmFtZSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoaXMgbWV0aG9kIGlzIHRvIHJldHVybiBnZXRIZWFkZXJzKFN0cmluZyBuYW1lKQorICAgICAqIG9uIHRoZSB3cmFwcGVkIHJlcXVlc3Qgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRIZWFkZXJzKFN0cmluZyBuYW1lKSB7CisJcmV0dXJuIHRoaXMuX2dldEh0dHBTZXJ2bGV0UmVxdWVzdCgpLmdldEhlYWRlcnMobmFtZSk7CisgICAgfSAgCisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBpcyB0byByZXR1cm4gZ2V0SGVhZGVyTmFtZXMoKQorICAgICAqIG9uIHRoZSB3cmFwcGVkIHJlcXVlc3Qgb2JqZWN0LgorICAgICAqLworICAKKyAgICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0SGVhZGVyTmFtZXMoKSB7CisJcmV0dXJuIHRoaXMuX2dldEh0dHBTZXJ2bGV0UmVxdWVzdCgpLmdldEhlYWRlck5hbWVzKCk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoaXMgbWV0aG9kIGlzIHRvIHJldHVybiBnZXRJbnRIZWFkZXIoU3RyaW5nIG5hbWUpCisgICAgICogb24gdGhlIHdyYXBwZWQgcmVxdWVzdCBvYmplY3QuCisgICAgICovCisKKyAgICAgcHVibGljIGludCBnZXRJbnRIZWFkZXIoU3RyaW5nIG5hbWUpIHsKKwlyZXR1cm4gdGhpcy5fZ2V0SHR0cFNlcnZsZXRSZXF1ZXN0KCkuZ2V0SW50SGVhZGVyKG5hbWUpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBpcyB0byByZXR1cm4gZ2V0TWV0aG9kKCkKKyAgICAgKiBvbiB0aGUgd3JhcHBlZCByZXF1ZXN0IG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE1ldGhvZCgpIHsKKwlyZXR1cm4gdGhpcy5fZ2V0SHR0cFNlcnZsZXRSZXF1ZXN0KCkuZ2V0TWV0aG9kKCk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoaXMgbWV0aG9kIGlzIHRvIHJldHVybiBnZXRQYXRoSW5mbygpCisgICAgICogb24gdGhlIHdyYXBwZWQgcmVxdWVzdCBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRQYXRoSW5mbygpIHsKKwlyZXR1cm4gdGhpcy5fZ2V0SHR0cFNlcnZsZXRSZXF1ZXN0KCkuZ2V0UGF0aEluZm8oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBpcyB0byByZXR1cm4gZ2V0UGF0aFRyYW5zbGF0ZWQoKQorICAgICAqIG9uIHRoZSB3cmFwcGVkIHJlcXVlc3Qgb2JqZWN0LgorICAgICAqLworCisgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aFRyYW5zbGF0ZWQoKSB7CisJcmV0dXJuIHRoaXMuX2dldEh0dHBTZXJ2bGV0UmVxdWVzdCgpLmdldFBhdGhUcmFuc2xhdGVkKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgdGhpcyBtZXRob2QgaXMgdG8gcmV0dXJuIGdldENvbnRleHRQYXRoKCkKKyAgICAgKiBvbiB0aGUgd3JhcHBlZCByZXF1ZXN0IG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRleHRQYXRoKCkgeworCXJldHVybiB0aGlzLl9nZXRIdHRwU2VydmxldFJlcXVlc3QoKS5nZXRDb250ZXh0UGF0aCgpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBpcyB0byByZXR1cm4gZ2V0UXVlcnlTdHJpbmcoKQorICAgICAqIG9uIHRoZSB3cmFwcGVkIHJlcXVlc3Qgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UXVlcnlTdHJpbmcoKSB7CisJcmV0dXJuIHRoaXMuX2dldEh0dHBTZXJ2bGV0UmVxdWVzdCgpLmdldFF1ZXJ5U3RyaW5nKCk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoaXMgbWV0aG9kIGlzIHRvIHJldHVybiBnZXRSZW1vdGVVc2VyKCkKKyAgICAgKiBvbiB0aGUgd3JhcHBlZCByZXF1ZXN0IG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlbW90ZVVzZXIoKSB7CisJcmV0dXJuIHRoaXMuX2dldEh0dHBTZXJ2bGV0UmVxdWVzdCgpLmdldFJlbW90ZVVzZXIoKTsKKyAgICB9CisgICAgCisgCisgICAgLyoqCisgICAgICogVGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgdGhpcyBtZXRob2QgaXMgdG8gcmV0dXJuIGlzVXNlckluUm9sZShTdHJpbmcgcm9sZSkKKyAgICAgKiBvbiB0aGUgd3JhcHBlZCByZXF1ZXN0IG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1VzZXJJblJvbGUoU3RyaW5nIHJvbGUpIHsKKwlyZXR1cm4gdGhpcy5fZ2V0SHR0cFNlcnZsZXRSZXF1ZXN0KCkuaXNVc2VySW5Sb2xlKHJvbGUpOworICAgIH0KKyAgICAKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBpcyB0byByZXR1cm4gZ2V0VXNlclByaW5jaXBhbCgpCisgICAgICogb24gdGhlIHdyYXBwZWQgcmVxdWVzdCBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsIGdldFVzZXJQcmluY2lwYWwoKSB7CisJcmV0dXJuIHRoaXMuX2dldEh0dHBTZXJ2bGV0UmVxdWVzdCgpLmdldFVzZXJQcmluY2lwYWwoKTsKKyAgICB9CisgICAgCisgICAKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBpcyB0byByZXR1cm4gZ2V0UmVxdWVzdGVkU2Vzc2lvbklkKCkKKyAgICAgKiBvbiB0aGUgd3JhcHBlZCByZXF1ZXN0IG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlcXVlc3RlZFNlc3Npb25JZCgpIHsKKwlyZXR1cm4gdGhpcy5fZ2V0SHR0cFNlcnZsZXRSZXF1ZXN0KCkuZ2V0UmVxdWVzdGVkU2Vzc2lvbklkKCk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoaXMgbWV0aG9kIGlzIHRvIHJldHVybiBnZXRSZXF1ZXN0VVJJKCkKKyAgICAgKiBvbiB0aGUgd3JhcHBlZCByZXF1ZXN0IG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlcXVlc3RVUkkoKSB7CisJcmV0dXJuIHRoaXMuX2dldEh0dHBTZXJ2bGV0UmVxdWVzdCgpLmdldFJlcXVlc3RVUkkoKTsKKyAgICB9CisJLyoqCisgICAgICogVGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgdGhpcyBtZXRob2QgaXMgdG8gcmV0dXJuIGdldFJlcXVlc3RVUkwoKQorICAgICAqIG9uIHRoZSB3cmFwcGVkIHJlcXVlc3Qgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdCdWZmZXIgZ2V0UmVxdWVzdFVSTCgpIHsKKwlyZXR1cm4gdGhpcy5fZ2V0SHR0cFNlcnZsZXRSZXF1ZXN0KCkuZ2V0UmVxdWVzdFVSTCgpOworICAgIH0KKwkKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBpcyB0byByZXR1cm4gZ2V0U2VydmxldFBhdGgoKQorICAgICAqIG9uIHRoZSB3cmFwcGVkIHJlcXVlc3Qgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmxldFBhdGgoKSB7CisJcmV0dXJuIHRoaXMuX2dldEh0dHBTZXJ2bGV0UmVxdWVzdCgpLmdldFNlcnZsZXRQYXRoKCk7CisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoaXMgbWV0aG9kIGlzIHRvIHJldHVybiBnZXRTZXNzaW9uKGJvb2xlYW4gY3JlYXRlKQorICAgICAqIG9uIHRoZSB3cmFwcGVkIHJlcXVlc3Qgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBIdHRwU2Vzc2lvbiBnZXRTZXNzaW9uKGJvb2xlYW4gY3JlYXRlKSB7CisJcmV0dXJuIHRoaXMuX2dldEh0dHBTZXJ2bGV0UmVxdWVzdCgpLmdldFNlc3Npb24oY3JlYXRlKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogVGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgdGhpcyBtZXRob2QgaXMgdG8gcmV0dXJuIGdldFNlc3Npb24oKQorICAgICAqIG9uIHRoZSB3cmFwcGVkIHJlcXVlc3Qgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBIdHRwU2Vzc2lvbiBnZXRTZXNzaW9uKCkgeworCXJldHVybiB0aGlzLl9nZXRIdHRwU2VydmxldFJlcXVlc3QoKS5nZXRTZXNzaW9uKCk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoaXMgbWV0aG9kIGlzIHRvIHJldHVybiBpc1JlcXVlc3RlZFNlc3Npb25JZFZhbGlkKCkKKyAgICAgKiBvbiB0aGUgd3JhcHBlZCByZXF1ZXN0IG9iamVjdC4KKyAgICAgKi8gCisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JlcXVlc3RlZFNlc3Npb25JZFZhbGlkKCkgeworCXJldHVybiB0aGlzLl9nZXRIdHRwU2VydmxldFJlcXVlc3QoKS5pc1JlcXVlc3RlZFNlc3Npb25JZFZhbGlkKCk7CisgICAgfQorICAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBpcyB0byByZXR1cm4gaXNSZXF1ZXN0ZWRTZXNzaW9uSWRGcm9tQ29va2llKCkKKyAgICAgKiBvbiB0aGUgd3JhcHBlZCByZXF1ZXN0IG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JlcXVlc3RlZFNlc3Npb25JZEZyb21Db29raWUoKSB7CisJcmV0dXJuIHRoaXMuX2dldEh0dHBTZXJ2bGV0UmVxdWVzdCgpLmlzUmVxdWVzdGVkU2Vzc2lvbklkRnJvbUNvb2tpZSgpOworICAgIH0KKyAgICAKKyAgICAJICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBpcyB0byByZXR1cm4gaXNSZXF1ZXN0ZWRTZXNzaW9uSWRGcm9tVVJMKCkKKyAgICAgKiBvbiB0aGUgd3JhcHBlZCByZXF1ZXN0IG9iamVjdC4KKyAgICAgKi8gCisgICAgcHVibGljIGJvb2xlYW4gaXNSZXF1ZXN0ZWRTZXNzaW9uSWRGcm9tVVJMKCkgeworCXJldHVybiB0aGlzLl9nZXRIdHRwU2VydmxldFJlcXVlc3QoKS5pc1JlcXVlc3RlZFNlc3Npb25JZEZyb21VUkwoKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogVGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgdGhpcyBtZXRob2QgaXMgdG8gcmV0dXJuIGlzUmVxdWVzdGVkU2Vzc2lvbklkRnJvbVVybCgpCisgICAgICogb24gdGhlIHdyYXBwZWQgcmVxdWVzdCBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNSZXF1ZXN0ZWRTZXNzaW9uSWRGcm9tVXJsKCkgeworCXJldHVybiB0aGlzLl9nZXRIdHRwU2VydmxldFJlcXVlc3QoKS5pc1JlcXVlc3RlZFNlc3Npb25JZEZyb21VcmwoKTsKKyAgICB9CisKKworICAgIAorfQpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvaHR0cC9IdHRwU2VydmxldFJlc3BvbnNlLmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9odHRwL0h0dHBTZXJ2bGV0UmVzcG9uc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTc5MDUwCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvaHR0cC9IdHRwU2VydmxldFJlc3BvbnNlLmphdmEKQEAgLTAsMCArMSw2MzYgQEAKKy8qCisqIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KK3BhY2thZ2UgamF2YXguc2VydmxldC5odHRwOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldFJlc3BvbnNlOworCisvKioKKyAqCisgKiBFeHRlbmRzIHRoZSB7QGxpbmsgU2VydmxldFJlc3BvbnNlfSBpbnRlcmZhY2UgdG8gcHJvdmlkZSBIVFRQLXNwZWNpZmljCisgKiBmdW5jdGlvbmFsaXR5IGluIHNlbmRpbmcgYSByZXNwb25zZS4gIEZvciBleGFtcGxlLCBpdCBoYXMgbWV0aG9kcworICogdG8gYWNjZXNzIEhUVFAgaGVhZGVycyBhbmQgY29va2llcy4KKyAqCisgKiA8cD5UaGUgc2VydmxldCBjb250YWluZXIgY3JlYXRlcyBhbiA8Y29kZT5IdHRwU2VydmxldFJlc3BvbnNlPC9jb2RlPiBvYmplY3QKKyAqIGFuZCBwYXNzZXMgaXQgYXMgYW4gYXJndW1lbnQgdG8gdGhlIHNlcnZsZXQncyBzZXJ2aWNlIG1ldGhvZHMKKyAqICg8Y29kZT5kb0dldDwvY29kZT4sIDxjb2RlPmRvUG9zdDwvY29kZT4sIGV0YykuCisgKgorICogCisgKiBAYXV0aG9yCVZhcmlvdXMKKyAqIEB2ZXJzaW9uCSRWZXJzaW9uJAorICoKKyAqIEBzZWUJCWphdmF4LnNlcnZsZXQuU2VydmxldFJlc3BvbnNlCisgKgorICovCisKKworCitwdWJsaWMgaW50ZXJmYWNlIEh0dHBTZXJ2bGV0UmVzcG9uc2UgZXh0ZW5kcyBTZXJ2bGV0UmVzcG9uc2UgeworCisgICAgLyoqCisgICAgICogQWRkcyB0aGUgc3BlY2lmaWVkIGNvb2tpZSB0byB0aGUgcmVzcG9uc2UuICBUaGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkCisgICAgICogbXVsdGlwbGUgdGltZXMgdG8gc2V0IG1vcmUgdGhhbiBvbmUgY29va2llLgorICAgICAqCisgICAgICogQHBhcmFtIGNvb2tpZSB0aGUgQ29va2llIHRvIHJldHVybiB0byB0aGUgY2xpZW50CisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIGFkZENvb2tpZShDb29raWUgY29va2llKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgbmFtZWQgcmVzcG9uc2UgaGVhZGVyIAorICAgICAqIGhhcyBhbHJlYWR5IGJlZW4gc2V0LgorICAgICAqIAorICAgICAqIEBwYXJhbQluYW1lCXRoZSBoZWFkZXIgbmFtZQorICAgICAqIEByZXR1cm4JCTxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBuYW1lZCByZXNwb25zZSBoZWFkZXIgCisgICAgICoJCQloYXMgYWxyZWFkeSBiZWVuIHNldDsgCisgICAgICogCQkJPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQorICAgICAqLworCisgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNIZWFkZXIoU3RyaW5nIG5hbWUpOworCisgICAgLyoqCisgICAgICogRW5jb2RlcyB0aGUgc3BlY2lmaWVkIFVSTCBieSBpbmNsdWRpbmcgdGhlIHNlc3Npb24gSUQgaW4gaXQsCisgICAgICogb3IsIGlmIGVuY29kaW5nIGlzIG5vdCBuZWVkZWQsIHJldHVybnMgdGhlIFVSTCB1bmNoYW5nZWQuCisgICAgICogVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIGluY2x1ZGVzIHRoZSBsb2dpYyB0bworICAgICAqIGRldGVybWluZSB3aGV0aGVyIHRoZSBzZXNzaW9uIElEIG5lZWRzIHRvIGJlIGVuY29kZWQgaW4gdGhlIFVSTC4KKyAgICAgKiBGb3IgZXhhbXBsZSwgaWYgdGhlIGJyb3dzZXIgc3VwcG9ydHMgY29va2llcywgb3Igc2Vzc2lvbgorICAgICAqIHRyYWNraW5nIGlzIHR1cm5lZCBvZmYsIFVSTCBlbmNvZGluZyBpcyB1bm5lY2Vzc2FyeS4KKyAgICAgKiAKKyAgICAgKiA8cD5Gb3Igcm9idXN0IHNlc3Npb24gdHJhY2tpbmcsIGFsbCBVUkxzIGVtaXR0ZWQgYnkgYSBzZXJ2bGV0IAorICAgICAqIHNob3VsZCBiZSBydW4gdGhyb3VnaCB0aGlzCisgICAgICogbWV0aG9kLiAgT3RoZXJ3aXNlLCBVUkwgcmV3cml0aW5nIGNhbm5vdCBiZSB1c2VkIHdpdGggYnJvd3NlcnMKKyAgICAgKiB3aGljaCBkbyBub3Qgc3VwcG9ydCBjb29raWVzLgorICAgICAqCisgICAgICogQHBhcmFtCXVybAl0aGUgdXJsIHRvIGJlIGVuY29kZWQuCisgICAgICogQHJldHVybgkJdGhlIGVuY29kZWQgVVJMIGlmIGVuY29kaW5nIGlzIG5lZWRlZDsKKyAgICAgKiAJCQl0aGUgdW5jaGFuZ2VkIFVSTCBvdGhlcndpc2UuCisgICAgICovCisKKyAgICBwdWJsaWMgU3RyaW5nIGVuY29kZVVSTChTdHJpbmcgdXJsKTsKKworICAgIC8qKgorICAgICAqIEVuY29kZXMgdGhlIHNwZWNpZmllZCBVUkwgZm9yIHVzZSBpbiB0aGUKKyAgICAgKiA8Y29kZT5zZW5kUmVkaXJlY3Q8L2NvZGU+IG1ldGhvZCBvciwgaWYgZW5jb2RpbmcgaXMgbm90IG5lZWRlZCwKKyAgICAgKiByZXR1cm5zIHRoZSBVUkwgdW5jaGFuZ2VkLiAgVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kCisgICAgICogaW5jbHVkZXMgdGhlIGxvZ2ljIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBzZXNzaW9uIElECisgICAgICogbmVlZHMgdG8gYmUgZW5jb2RlZCBpbiB0aGUgVVJMLiAgQmVjYXVzZSB0aGUgcnVsZXMgZm9yIG1ha2luZworICAgICAqIHRoaXMgZGV0ZXJtaW5hdGlvbiBjYW4gZGlmZmVyIGZyb20gdGhvc2UgdXNlZCB0byBkZWNpZGUgd2hldGhlciB0bworICAgICAqIGVuY29kZSBhIG5vcm1hbCBsaW5rLCB0aGlzIG1ldGhvZCBpcyBzZXBhcmF0ZWQgZnJvbSB0aGUKKyAgICAgKiA8Y29kZT5lbmNvZGVVUkw8L2NvZGU+IG1ldGhvZC4KKyAgICAgKiAKKyAgICAgKiA8cD5BbGwgVVJMcyBzZW50IHRvIHRoZSA8Y29kZT5IdHRwU2VydmxldFJlc3BvbnNlLnNlbmRSZWRpcmVjdDwvY29kZT4KKyAgICAgKiBtZXRob2Qgc2hvdWxkIGJlIHJ1biB0aHJvdWdoIHRoaXMgbWV0aG9kLiAgT3RoZXJ3aXNlLCBVUkwKKyAgICAgKiByZXdyaXRpbmcgY2Fubm90IGJlIHVzZWQgd2l0aCBicm93c2VycyB3aGljaCBkbyBub3Qgc3VwcG9ydAorICAgICAqIGNvb2tpZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0JdXJsCXRoZSB1cmwgdG8gYmUgZW5jb2RlZC4KKyAgICAgKiBAcmV0dXJuCQl0aGUgZW5jb2RlZCBVUkwgaWYgZW5jb2RpbmcgaXMgbmVlZGVkOworICAgICAqIAkJCXRoZSB1bmNoYW5nZWQgVVJMIG90aGVyd2lzZS4KKyAgICAgKgorICAgICAqIEBzZWUgI3NlbmRSZWRpcmVjdAorICAgICAqIEBzZWUgI2VuY29kZVVybAorICAgICAqLworCisgICAgcHVibGljIFN0cmluZyBlbmNvZGVSZWRpcmVjdFVSTChTdHJpbmcgdXJsKTsKKworICAgIC8qKgorICAgICAqIEBkZXByZWNhdGVkCUFzIG9mIHZlcnNpb24gMi4xLCB1c2UgZW5jb2RlVVJMKFN0cmluZyB1cmwpIGluc3RlYWQKKyAgICAgKgorICAgICAqIEBwYXJhbQl1cmwJdGhlIHVybCB0byBiZSBlbmNvZGVkLgorICAgICAqIEByZXR1cm4JCXRoZSBlbmNvZGVkIFVSTCBpZiBlbmNvZGluZyBpcyBuZWVkZWQ7IAorICAgICAqIAkJCXRoZSB1bmNoYW5nZWQgVVJMIG90aGVyd2lzZS4KKyAgICAgKi8KKworICAgIHB1YmxpYyBTdHJpbmcgZW5jb2RlVXJsKFN0cmluZyB1cmwpOworICAgIAorICAgIC8qKgorICAgICAqIEBkZXByZWNhdGVkCUFzIG9mIHZlcnNpb24gMi4xLCB1c2UgCisgICAgICoJCQllbmNvZGVSZWRpcmVjdFVSTChTdHJpbmcgdXJsKSBpbnN0ZWFkCisgICAgICoKKyAgICAgKiBAcGFyYW0JdXJsCXRoZSB1cmwgdG8gYmUgZW5jb2RlZC4KKyAgICAgKiBAcmV0dXJuCQl0aGUgZW5jb2RlZCBVUkwgaWYgZW5jb2RpbmcgaXMgbmVlZGVkOyAKKyAgICAgKiAJCQl0aGUgdW5jaGFuZ2VkIFVSTCBvdGhlcndpc2UuCisgICAgICovCisKKyAgICBwdWJsaWMgU3RyaW5nIGVuY29kZVJlZGlyZWN0VXJsKFN0cmluZyB1cmwpOworCisgICAgLyoqCisgICAgICogU2VuZHMgYW4gZXJyb3IgcmVzcG9uc2UgdG8gdGhlIGNsaWVudCB1c2luZyB0aGUgc3BlY2lmaWVkCisgICAgICogc3RhdHVzLiAgVGhlIHNlcnZlciBkZWZhdWx0cyB0byBjcmVhdGluZyB0aGUKKyAgICAgKiByZXNwb25zZSB0byBsb29rIGxpa2UgYW4gSFRNTC1mb3JtYXR0ZWQgc2VydmVyIGVycm9yIHBhZ2UKKyAgICAgKiBjb250YWluaW5nIHRoZSBzcGVjaWZpZWQgbWVzc2FnZSwgc2V0dGluZyB0aGUgY29udGVudCB0eXBlCisgICAgICogdG8gInRleHQvaHRtbCIsIGxlYXZpbmcgY29va2llcyBhbmQgb3RoZXIgaGVhZGVycyB1bm1vZGlmaWVkLgorICAgICAqCisgICAgICogSWYgYW4gZXJyb3ItcGFnZSBkZWNsYXJhdGlvbiBoYXMgYmVlbiBtYWRlIGZvciB0aGUgd2ViIGFwcGxpY2F0aW9uCisgICAgICogY29ycmVzcG9uZGluZyB0byB0aGUgc3RhdHVzIGNvZGUgcGFzc2VkIGluLCBpdCB3aWxsIGJlIHNlcnZlZCBiYWNrIGluIAorICAgICAqIHByZWZlcmVuY2UgdG8gdGhlIHN1Z2dlc3RlZCBtc2cgcGFyYW1ldGVyLiAKKyAgICAgKgorICAgICAqIDxwPklmIHRoZSByZXNwb25zZSBoYXMgYWxyZWFkeSBiZWVuIGNvbW1pdHRlZCwgdGhpcyBtZXRob2QgdGhyb3dzIAorICAgICAqIGFuIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbi4KKyAgICAgKiBBZnRlciB1c2luZyB0aGlzIG1ldGhvZCwgdGhlIHJlc3BvbnNlIHNob3VsZCBiZSBjb25zaWRlcmVkCisgICAgICogdG8gYmUgY29tbWl0dGVkIGFuZCBzaG91bGQgbm90IGJlIHdyaXR0ZW4gdG8uCisgICAgICoKKyAgICAgKiBAcGFyYW0Jc2MJdGhlIGVycm9yIHN0YXR1cyBjb2RlCisgICAgICogQHBhcmFtCW1zZwl0aGUgZGVzY3JpcHRpdmUgbWVzc2FnZQorICAgICAqIEBleGNlcHRpb24JSU9FeGNlcHRpb24JSWYgYW4gaW5wdXQgb3Igb3V0cHV0IGV4Y2VwdGlvbiBvY2N1cnMKKyAgICAgKiBAZXhjZXB0aW9uCUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbglJZiB0aGUgcmVzcG9uc2Ugd2FzIGNvbW1pdHRlZAorICAgICAqLworICAgCisgICAgcHVibGljIHZvaWQgc2VuZEVycm9yKGludCBzYywgU3RyaW5nIG1zZykgdGhyb3dzIElPRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogU2VuZHMgYW4gZXJyb3IgcmVzcG9uc2UgdG8gdGhlIGNsaWVudCB1c2luZyB0aGUgc3BlY2lmaWVkIHN0YXR1cworICAgICAqIGNvZGUgYW5kIGNsZWFyaW5nIHRoZSBidWZmZXIuIAorICAgICAqIDxwPklmIHRoZSByZXNwb25zZSBoYXMgYWxyZWFkeSBiZWVuIGNvbW1pdHRlZCwgdGhpcyBtZXRob2QgdGhyb3dzIAorICAgICAqIGFuIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbi4KKyAgICAgKiBBZnRlciB1c2luZyB0aGlzIG1ldGhvZCwgdGhlIHJlc3BvbnNlIHNob3VsZCBiZSBjb25zaWRlcmVkCisgICAgICogdG8gYmUgY29tbWl0dGVkIGFuZCBzaG91bGQgbm90IGJlIHdyaXR0ZW4gdG8uCisgICAgICoKKyAgICAgKiBAcGFyYW0Jc2MJdGhlIGVycm9yIHN0YXR1cyBjb2RlCisgICAgICogQGV4Y2VwdGlvbglJT0V4Y2VwdGlvbglJZiBhbiBpbnB1dCBvciBvdXRwdXQgZXhjZXB0aW9uIG9jY3VycworICAgICAqIEBleGNlcHRpb24JSWxsZWdhbFN0YXRlRXhjZXB0aW9uCUlmIHRoZSByZXNwb25zZSB3YXMgY29tbWl0dGVkCisgICAgICoJCQkJCQliZWZvcmUgdGhpcyBtZXRob2QgY2FsbAorICAgICAqLworCisgICAgcHVibGljIHZvaWQgc2VuZEVycm9yKGludCBzYykgdGhyb3dzIElPRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogU2VuZHMgYSB0ZW1wb3JhcnkgcmVkaXJlY3QgcmVzcG9uc2UgdG8gdGhlIGNsaWVudCB1c2luZyB0aGUKKyAgICAgKiBzcGVjaWZpZWQgcmVkaXJlY3QgbG9jYXRpb24gVVJMLiAgVGhpcyBtZXRob2QgY2FuIGFjY2VwdCByZWxhdGl2ZSBVUkxzOworICAgICAqIHRoZSBzZXJ2bGV0IGNvbnRhaW5lciBtdXN0IGNvbnZlcnQgdGhlIHJlbGF0aXZlIFVSTCB0byBhbiBhYnNvbHV0ZSBVUkwKKyAgICAgKiBiZWZvcmUgc2VuZGluZyB0aGUgcmVzcG9uc2UgdG8gdGhlIGNsaWVudC4gSWYgdGhlIGxvY2F0aW9uIGlzIHJlbGF0aXZlIAorICAgICAqIHdpdGhvdXQgYSBsZWFkaW5nICcvJyB0aGUgY29udGFpbmVyIGludGVycHJldHMgaXQgYXMgcmVsYXRpdmUgdG8KKyAgICAgKiB0aGUgY3VycmVudCByZXF1ZXN0IFVSSS4gSWYgdGhlIGxvY2F0aW9uIGlzIHJlbGF0aXZlIHdpdGggYSBsZWFkaW5nCisgICAgICogJy8nIHRoZSBjb250YWluZXIgaW50ZXJwcmV0cyBpdCBhcyByZWxhdGl2ZSB0byB0aGUgc2VydmxldCBjb250YWluZXIgcm9vdC4KKyAgICAgKgorICAgICAqIDxwPklmIHRoZSByZXNwb25zZSBoYXMgYWxyZWFkeSBiZWVuIGNvbW1pdHRlZCwgdGhpcyBtZXRob2QgdGhyb3dzIAorICAgICAqIGFuIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbi4KKyAgICAgKiBBZnRlciB1c2luZyB0aGlzIG1ldGhvZCwgdGhlIHJlc3BvbnNlIHNob3VsZCBiZSBjb25zaWRlcmVkCisgICAgICogdG8gYmUgY29tbWl0dGVkIGFuZCBzaG91bGQgbm90IGJlIHdyaXR0ZW4gdG8uCisgICAgICoKKyAgICAgKiBAcGFyYW0JCWxvY2F0aW9uCXRoZSByZWRpcmVjdCBsb2NhdGlvbiBVUkwKKyAgICAgKiBAZXhjZXB0aW9uCUlPRXhjZXB0aW9uCUlmIGFuIGlucHV0IG9yIG91dHB1dCBleGNlcHRpb24gb2NjdXJzCisgICAgICogQGV4Y2VwdGlvbglJbGxlZ2FsU3RhdGVFeGNlcHRpb24JSWYgdGhlIHJlc3BvbnNlIHdhcyBjb21taXR0ZWQgb3IKKyBpZiBhIHBhcnRpYWwgVVJMIGlzIGdpdmVuIGFuZCBjYW5ub3QgYmUgY29udmVydGVkIGludG8gYSB2YWxpZCBVUkwKKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIHNlbmRSZWRpcmVjdChTdHJpbmcgbG9jYXRpb24pIHRocm93cyBJT0V4Y2VwdGlvbjsKKyAgICAKKyAgICAvKioKKyAgICAgKiAKKyAgICAgKiBTZXRzIGEgcmVzcG9uc2UgaGVhZGVyIHdpdGggdGhlIGdpdmVuIG5hbWUgYW5kCisgICAgICogZGF0ZS12YWx1ZS4gIFRoZSBkYXRlIGlzIHNwZWNpZmllZCBpbiB0ZXJtcyBvZgorICAgICAqIG1pbGxpc2Vjb25kcyBzaW5jZSB0aGUgZXBvY2guICBJZiB0aGUgaGVhZGVyIGhhZCBhbHJlYWR5CisgICAgICogYmVlbiBzZXQsIHRoZSBuZXcgdmFsdWUgb3ZlcndyaXRlcyB0aGUgcHJldmlvdXMgb25lLiAgVGhlCisgICAgICogPGNvZGU+Y29udGFpbnNIZWFkZXI8L2NvZGU+IG1ldGhvZCBjYW4gYmUgdXNlZCB0byB0ZXN0IGZvciB0aGUKKyAgICAgKiBwcmVzZW5jZSBvZiBhIGhlYWRlciBiZWZvcmUgc2V0dGluZyBpdHMgdmFsdWUuCisgICAgICogCisgICAgICogQHBhcmFtCW5hbWUJdGhlIG5hbWUgb2YgdGhlIGhlYWRlciB0byBzZXQKKyAgICAgKiBAcGFyYW0JZGF0ZQl0aGUgYXNzaWduZWQgZGF0ZSB2YWx1ZQorICAgICAqIAorICAgICAqIEBzZWUgI2NvbnRhaW5zSGVhZGVyCisgICAgICogQHNlZSAjYWRkRGF0ZUhlYWRlcgorICAgICAqLworCisgICAgcHVibGljIHZvaWQgc2V0RGF0ZUhlYWRlcihTdHJpbmcgbmFtZSwgbG9uZyBkYXRlKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiAKKyAgICAgKiBBZGRzIGEgcmVzcG9uc2UgaGVhZGVyIHdpdGggdGhlIGdpdmVuIG5hbWUgYW5kCisgICAgICogZGF0ZS12YWx1ZS4gIFRoZSBkYXRlIGlzIHNwZWNpZmllZCBpbiB0ZXJtcyBvZgorICAgICAqIG1pbGxpc2Vjb25kcyBzaW5jZSB0aGUgZXBvY2guICBUaGlzIG1ldGhvZCBhbGxvd3MgcmVzcG9uc2UgaGVhZGVycyAKKyAgICAgKiB0byBoYXZlIG11bHRpcGxlIHZhbHVlcy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0JbmFtZQl0aGUgbmFtZSBvZiB0aGUgaGVhZGVyIHRvIHNldAorICAgICAqIEBwYXJhbQlkYXRlCXRoZSBhZGRpdGlvbmFsIGRhdGUgdmFsdWUKKyAgICAgKiAKKyAgICAgKiBAc2VlICNzZXREYXRlSGVhZGVyCisgICAgICovCisKKyAgICBwdWJsaWMgdm9pZCBhZGREYXRlSGVhZGVyKFN0cmluZyBuYW1lLCBsb25nIGRhdGUpOworICAgIAorICAgIC8qKgorICAgICAqCisgICAgICogU2V0cyBhIHJlc3BvbnNlIGhlYWRlciB3aXRoIHRoZSBnaXZlbiBuYW1lIGFuZCB2YWx1ZS4KKyAgICAgKiBJZiB0aGUgaGVhZGVyIGhhZCBhbHJlYWR5IGJlZW4gc2V0LCB0aGUgbmV3IHZhbHVlIG92ZXJ3cml0ZXMgdGhlCisgICAgICogcHJldmlvdXMgb25lLiAgVGhlIDxjb2RlPmNvbnRhaW5zSGVhZGVyPC9jb2RlPiBtZXRob2QgY2FuIGJlCisgICAgICogdXNlZCB0byB0ZXN0IGZvciB0aGUgcHJlc2VuY2Ugb2YgYSBoZWFkZXIgYmVmb3JlIHNldHRpbmcgaXRzCisgICAgICogdmFsdWUuCisgICAgICogCisgICAgICogQHBhcmFtCW5hbWUJdGhlIG5hbWUgb2YgdGhlIGhlYWRlcgorICAgICAqIEBwYXJhbQl2YWx1ZQl0aGUgaGVhZGVyIHZhbHVlICBJZiBpdCBjb250YWlucyBvY3RldCBzdHJpbmcsCisgICAgICoJCWl0IHNob3VsZCBiZSBlbmNvZGVkIGFjY29yZGluZyB0byBSRkMgMjA0NworICAgICAqCQkoaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMjA0Ny50eHQpCisgICAgICoKKyAgICAgKiBAc2VlICNjb250YWluc0hlYWRlcgorICAgICAqIEBzZWUgI2FkZEhlYWRlcgorICAgICAqLworCisgICAgcHVibGljIHZvaWQgc2V0SGVhZGVyKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpOworICAgIAorICAgIC8qKgorICAgICAqIEFkZHMgYSByZXNwb25zZSBoZWFkZXIgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBhbmQgdmFsdWUuCisgICAgICogVGhpcyBtZXRob2QgYWxsb3dzIHJlc3BvbnNlIGhlYWRlcnMgdG8gaGF2ZSBtdWx0aXBsZSB2YWx1ZXMuCisgICAgICogCisgICAgICogQHBhcmFtCW5hbWUJdGhlIG5hbWUgb2YgdGhlIGhlYWRlcgorICAgICAqIEBwYXJhbQl2YWx1ZQl0aGUgYWRkaXRpb25hbCBoZWFkZXIgdmFsdWUgICBJZiBpdCBjb250YWlucworICAgICAqCQlvY3RldCBzdHJpbmcsIGl0IHNob3VsZCBiZSBlbmNvZGVkCisgICAgICoJCWFjY29yZGluZyB0byBSRkMgMjA0NworICAgICAqCQkoaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMjA0Ny50eHQpCisgICAgICoKKyAgICAgKiBAc2VlICNzZXRIZWFkZXIKKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIGFkZEhlYWRlcihTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKTsKKworICAgIC8qKgorICAgICAqIFNldHMgYSByZXNwb25zZSBoZWFkZXIgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBhbmQKKyAgICAgKiBpbnRlZ2VyIHZhbHVlLiAgSWYgdGhlIGhlYWRlciBoYWQgYWxyZWFkeSBiZWVuIHNldCwgdGhlIG5ldyB2YWx1ZQorICAgICAqIG92ZXJ3cml0ZXMgdGhlIHByZXZpb3VzIG9uZS4gIFRoZSA8Y29kZT5jb250YWluc0hlYWRlcjwvY29kZT4KKyAgICAgKiBtZXRob2QgY2FuIGJlIHVzZWQgdG8gdGVzdCBmb3IgdGhlIHByZXNlbmNlIG9mIGEgaGVhZGVyIGJlZm9yZQorICAgICAqIHNldHRpbmcgaXRzIHZhbHVlLgorICAgICAqCisgICAgICogQHBhcmFtCW5hbWUJdGhlIG5hbWUgb2YgdGhlIGhlYWRlcgorICAgICAqIEBwYXJhbQl2YWx1ZQl0aGUgYXNzaWduZWQgaW50ZWdlciB2YWx1ZQorICAgICAqCisgICAgICogQHNlZSAjY29udGFpbnNIZWFkZXIKKyAgICAgKiBAc2VlICNhZGRJbnRIZWFkZXIKKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIHNldEludEhlYWRlcihTdHJpbmcgbmFtZSwgaW50IHZhbHVlKTsKKworICAgIC8qKgorICAgICAqIEFkZHMgYSByZXNwb25zZSBoZWFkZXIgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBhbmQKKyAgICAgKiBpbnRlZ2VyIHZhbHVlLiAgVGhpcyBtZXRob2QgYWxsb3dzIHJlc3BvbnNlIGhlYWRlcnMgdG8gaGF2ZSBtdWx0aXBsZQorICAgICAqIHZhbHVlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbQluYW1lCXRoZSBuYW1lIG9mIHRoZSBoZWFkZXIKKyAgICAgKiBAcGFyYW0JdmFsdWUJdGhlIGFzc2lnbmVkIGludGVnZXIgdmFsdWUKKyAgICAgKgorICAgICAqIEBzZWUgI3NldEludEhlYWRlcgorICAgICAqLworCisgICAgcHVibGljIHZvaWQgYWRkSW50SGVhZGVyKFN0cmluZyBuYW1lLCBpbnQgdmFsdWUpOworCisKKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBzdGF0dXMgY29kZSBmb3IgdGhpcyByZXNwb25zZS4gIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8KKyAgICAgKiBzZXQgdGhlIHJldHVybiBzdGF0dXMgY29kZSB3aGVuIHRoZXJlIGlzIG5vIGVycm9yIChmb3IgZXhhbXBsZSwKKyAgICAgKiBmb3IgdGhlIHN0YXR1cyBjb2RlcyBTQ19PSyBvciBTQ19NT1ZFRF9URU1QT1JBUklMWSkuICBJZiB0aGVyZQorICAgICAqIGlzIGFuIGVycm9yLCBhbmQgdGhlIGNhbGxlciB3aXNoZXMgdG8gaW52b2tlIGFuIGVycm9yLXBhZ2UgZGVmaW5lZAorICAgICAqIGluIHRoZSB3ZWIgYXBwbGljYXRpb24sIHRoZSA8Y29kZT5zZW5kRXJyb3I8L2NvZGU+IG1ldGhvZCBzaG91bGQgYmUgdXNlZAorICAgICAqIGluc3RlYWQuCisgICAgICogPHA+IFRoZSBjb250YWluZXIgY2xlYXJzIHRoZSBidWZmZXIgYW5kIHNldHMgdGhlIExvY2F0aW9uIGhlYWRlciwgcHJlc2VydmluZworICAgICAqIGNvb2tpZXMgYW5kIG90aGVyIGhlYWRlcnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0Jc2MJdGhlIHN0YXR1cyBjb2RlCisgICAgICoKKyAgICAgKiBAc2VlICNzZW5kRXJyb3IKKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIHNldFN0YXR1cyhpbnQgc2MpOworICAKKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZCBBcyBvZiB2ZXJzaW9uIDIuMSwgZHVlIHRvIGFtYmlndW91cyBtZWFuaW5nIG9mIHRoZSAKKyAgICAgKiBtZXNzYWdlIHBhcmFtZXRlci4gVG8gc2V0IGEgc3RhdHVzIGNvZGUgCisgICAgICogdXNlIDxjb2RlPnNldFN0YXR1cyhpbnQpPC9jb2RlPiwgdG8gc2VuZCBhbiBlcnJvciB3aXRoIGEgZGVzY3JpcHRpb24KKyAgICAgKiB1c2UgPGNvZGU+c2VuZEVycm9yKGludCwgU3RyaW5nKTwvY29kZT4uCisgICAgICoKKyAgICAgKiBTZXRzIHRoZSBzdGF0dXMgY29kZSBhbmQgbWVzc2FnZSBmb3IgdGhpcyByZXNwb25zZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0Jc2MJdGhlIHN0YXR1cyBjb2RlCisgICAgICogQHBhcmFtCXNtCXRoZSBzdGF0dXMgbWVzc2FnZQorICAgICAqLworCisgICAgcHVibGljIHZvaWQgc2V0U3RhdHVzKGludCBzYywgU3RyaW5nIHNtKTsKKworICAgIAorICAgIC8qCisgICAgICogU2VydmVyIHN0YXR1cyBjb2Rlczsgc2VlIFJGQyAyMDY4LgorICAgICAqLworCisgICAgLyoqCisgICAgICogU3RhdHVzIGNvZGUgKDEwMCkgaW5kaWNhdGluZyB0aGUgY2xpZW50IGNhbiBjb250aW51ZS4KKyAgICAgKi8KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDX0NPTlRJTlVFID0gMTAwOworCisgICAgCisgICAgLyoqCisgICAgICogU3RhdHVzIGNvZGUgKDEwMSkgaW5kaWNhdGluZyB0aGUgc2VydmVyIGlzIHN3aXRjaGluZyBwcm90b2NvbHMKKyAgICAgKiBhY2NvcmRpbmcgdG8gVXBncmFkZSBoZWFkZXIuCisgICAgICovCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ19TV0lUQ0hJTkdfUFJPVE9DT0xTID0gMTAxOworCisgICAgLyoqCisgICAgICogU3RhdHVzIGNvZGUgKDIwMCkgaW5kaWNhdGluZyB0aGUgcmVxdWVzdCBzdWNjZWVkZWQgbm9ybWFsbHkuCisgICAgICovCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ19PSyA9IDIwMDsKKworICAgIC8qKgorICAgICAqIFN0YXR1cyBjb2RlICgyMDEpIGluZGljYXRpbmcgdGhlIHJlcXVlc3Qgc3VjY2VlZGVkIGFuZCBjcmVhdGVkCisgICAgICogYSBuZXcgcmVzb3VyY2Ugb24gdGhlIHNlcnZlci4KKyAgICAgKi8KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDX0NSRUFURUQgPSAyMDE7CisKKyAgICAvKioKKyAgICAgKiBTdGF0dXMgY29kZSAoMjAyKSBpbmRpY2F0aW5nIHRoYXQgYSByZXF1ZXN0IHdhcyBhY2NlcHRlZCBmb3IKKyAgICAgKiBwcm9jZXNzaW5nLCBidXQgd2FzIG5vdCBjb21wbGV0ZWQuCisgICAgICovCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ19BQ0NFUFRFRCA9IDIwMjsKKworICAgIC8qKgorICAgICAqIFN0YXR1cyBjb2RlICgyMDMpIGluZGljYXRpbmcgdGhhdCB0aGUgbWV0YSBpbmZvcm1hdGlvbiBwcmVzZW50ZWQKKyAgICAgKiBieSB0aGUgY2xpZW50IGRpZCBub3Qgb3JpZ2luYXRlIGZyb20gdGhlIHNlcnZlci4KKyAgICAgKi8KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDX05PTl9BVVRIT1JJVEFUSVZFX0lORk9STUFUSU9OID0gMjAzOworCisgICAgLyoqCisgICAgICogU3RhdHVzIGNvZGUgKDIwNCkgaW5kaWNhdGluZyB0aGF0IHRoZSByZXF1ZXN0IHN1Y2NlZWRlZCBidXQgdGhhdAorICAgICAqIHRoZXJlIHdhcyBubyBuZXcgaW5mb3JtYXRpb24gdG8gcmV0dXJuLgorICAgICAqLworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NfTk9fQ09OVEVOVCA9IDIwNDsKKworICAgIC8qKgorICAgICAqIFN0YXR1cyBjb2RlICgyMDUpIGluZGljYXRpbmcgdGhhdCB0aGUgYWdlbnQgPGVtPlNIT1VMRDwvZW0+IHJlc2V0CisgICAgICogdGhlIGRvY3VtZW50IHZpZXcgd2hpY2ggY2F1c2VkIHRoZSByZXF1ZXN0IHRvIGJlIHNlbnQuCisgICAgICovCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ19SRVNFVF9DT05URU5UID0gMjA1OworCisgICAgLyoqCisgICAgICogU3RhdHVzIGNvZGUgKDIwNikgaW5kaWNhdGluZyB0aGF0IHRoZSBzZXJ2ZXIgaGFzIGZ1bGZpbGxlZAorICAgICAqIHRoZSBwYXJ0aWFsIEdFVCByZXF1ZXN0IGZvciB0aGUgcmVzb3VyY2UuCisgICAgICovCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ19QQVJUSUFMX0NPTlRFTlQgPSAyMDY7CisKKyAgICAvKioKKyAgICAgKiBTdGF0dXMgY29kZSAoMzAwKSBpbmRpY2F0aW5nIHRoYXQgdGhlIHJlcXVlc3RlZCByZXNvdXJjZQorICAgICAqIGNvcnJlc3BvbmRzIHRvIGFueSBvbmUgb2YgYSBzZXQgb2YgcmVwcmVzZW50YXRpb25zLCBlYWNoIHdpdGgKKyAgICAgKiBpdHMgb3duIHNwZWNpZmljIGxvY2F0aW9uLgorICAgICAqLworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NfTVVMVElQTEVfQ0hPSUNFUyA9IDMwMDsKKworICAgIC8qKgorICAgICAqIFN0YXR1cyBjb2RlICgzMDEpIGluZGljYXRpbmcgdGhhdCB0aGUgcmVzb3VyY2UgaGFzIHBlcm1hbmVudGx5CisgICAgICogbW92ZWQgdG8gYSBuZXcgbG9jYXRpb24sIGFuZCB0aGF0IGZ1dHVyZSByZWZlcmVuY2VzIHNob3VsZCB1c2UgYQorICAgICAqIG5ldyBVUkkgd2l0aCB0aGVpciByZXF1ZXN0cy4KKyAgICAgKi8KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDX01PVkVEX1BFUk1BTkVOVExZID0gMzAxOworCisgICAgLyoqCisgICAgICogU3RhdHVzIGNvZGUgKDMwMikgaW5kaWNhdGluZyB0aGF0IHRoZSByZXNvdXJjZSBoYXMgdGVtcG9yYXJpbHkKKyAgICAgKiBtb3ZlZCB0byBhbm90aGVyIGxvY2F0aW9uLCBidXQgdGhhdCBmdXR1cmUgcmVmZXJlbmNlcyBzaG91bGQKKyAgICAgKiBzdGlsbCB1c2UgdGhlIG9yaWdpbmFsIFVSSSB0byBhY2Nlc3MgdGhlIHJlc291cmNlLgorICAgICAqCisgICAgICogVGhpcyBkZWZpbml0aW9uIGlzIGJlaW5nIHJldGFpbmVkIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KKyAgICAgKiBTQ19GT1VORCBpcyBub3cgdGhlIHByZWZlcnJlZCBkZWZpbml0aW9uLgorICAgICAqLworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NfTU9WRURfVEVNUE9SQVJJTFkgPSAzMDI7CisKKyAgICAvKioKKyAgICAqIFN0YXR1cyBjb2RlICgzMDIpIGluZGljYXRpbmcgdGhhdCB0aGUgcmVzb3VyY2UgcmVzaWRlCisgICAgKiB0ZW1wb3JhcmlseSB1bmRlciBhIGRpZmZlcmVudCBVUkkuIFNpbmNlIHRoZSByZWRpcmVjdGlvbiBtaWdodAorICAgICogYmUgYWx0ZXJlZCBvbiBvY2Nhc2lvbiwgdGhlIGNsaWVudCBzaG91bGQgY29udGludWUgdG8gdXNlIHRoZQorICAgICogUmVxdWVzdC1VUkkgZm9yIGZ1dHVyZSByZXF1ZXN0cy4oSFRUUC8xLjEpIFRvIHJlcHJlc2VudCB0aGUKKyAgICAqIHN0YXR1cyBjb2RlICgzMDIpLCBpdCBpcyByZWNvbW1lbmRlZCB0byB1c2UgdGhpcyB2YXJpYWJsZS4KKyAgICAqLworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NfRk9VTkQgPSAzMDI7CisKKyAgICAvKioKKyAgICAgKiBTdGF0dXMgY29kZSAoMzAzKSBpbmRpY2F0aW5nIHRoYXQgdGhlIHJlc3BvbnNlIHRvIHRoZSByZXF1ZXN0CisgICAgICogY2FuIGJlIGZvdW5kIHVuZGVyIGEgZGlmZmVyZW50IFVSSS4KKyAgICAgKi8KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDX1NFRV9PVEhFUiA9IDMwMzsKKworICAgIC8qKgorICAgICAqIFN0YXR1cyBjb2RlICgzMDQpIGluZGljYXRpbmcgdGhhdCBhIGNvbmRpdGlvbmFsIEdFVCBvcGVyYXRpb24KKyAgICAgKiBmb3VuZCB0aGF0IHRoZSByZXNvdXJjZSB3YXMgYXZhaWxhYmxlIGFuZCBub3QgbW9kaWZpZWQuCisgICAgICovCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ19OT1RfTU9ESUZJRUQgPSAzMDQ7CisKKyAgICAvKioKKyAgICAgKiBTdGF0dXMgY29kZSAoMzA1KSBpbmRpY2F0aW5nIHRoYXQgdGhlIHJlcXVlc3RlZCByZXNvdXJjZQorICAgICAqIDxlbT5NVVNUPC9lbT4gYmUgYWNjZXNzZWQgdGhyb3VnaCB0aGUgcHJveHkgZ2l2ZW4gYnkgdGhlCisgICAgICogPGNvZGU+PGVtPkxvY2F0aW9uPC9lbT48L2NvZGU+IGZpZWxkLgorICAgICAqLworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NfVVNFX1BST1hZID0gMzA1OworCisgICAgIC8qKgorICAgICAqIFN0YXR1cyBjb2RlICgzMDcpIGluZGljYXRpbmcgdGhhdCB0aGUgcmVxdWVzdGVkIHJlc291cmNlIAorICAgICAqIHJlc2lkZXMgdGVtcG9yYXJpbHkgdW5kZXIgYSBkaWZmZXJlbnQgVVJJLiBUaGUgdGVtcG9yYXJ5IFVSSQorICAgICAqIDxlbT5TSE9VTEQ8L2VtPiBiZSBnaXZlbiBieSB0aGUgPGNvZGU+PGVtPkxvY2F0aW9uPC9lbT48L2NvZGU+IAorICAgICAqIGZpZWxkIGluIHRoZSByZXNwb25zZS4KKyAgICAgKi8KKworICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ19URU1QT1JBUllfUkVESVJFQ1QgPSAzMDc7CisKKyAgICAvKioKKyAgICAgKiBTdGF0dXMgY29kZSAoNDAwKSBpbmRpY2F0aW5nIHRoZSByZXF1ZXN0IHNlbnQgYnkgdGhlIGNsaWVudCB3YXMKKyAgICAgKiBzeW50YWN0aWNhbGx5IGluY29ycmVjdC4KKyAgICAgKi8KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDX0JBRF9SRVFVRVNUID0gNDAwOworCisgICAgLyoqCisgICAgICogU3RhdHVzIGNvZGUgKDQwMSkgaW5kaWNhdGluZyB0aGF0IHRoZSByZXF1ZXN0IHJlcXVpcmVzIEhUVFAKKyAgICAgKiBhdXRoZW50aWNhdGlvbi4KKyAgICAgKi8KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDX1VOQVVUSE9SSVpFRCA9IDQwMTsKKworICAgIC8qKgorICAgICAqIFN0YXR1cyBjb2RlICg0MDIpIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlLgorICAgICAqLworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NfUEFZTUVOVF9SRVFVSVJFRCA9IDQwMjsKKworICAgIC8qKgorICAgICAqIFN0YXR1cyBjb2RlICg0MDMpIGluZGljYXRpbmcgdGhlIHNlcnZlciB1bmRlcnN0b29kIHRoZSByZXF1ZXN0CisgICAgICogYnV0IHJlZnVzZWQgdG8gZnVsZmlsbCBpdC4KKyAgICAgKi8KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDX0ZPUkJJRERFTiA9IDQwMzsKKworICAgIC8qKgorICAgICAqIFN0YXR1cyBjb2RlICg0MDQpIGluZGljYXRpbmcgdGhhdCB0aGUgcmVxdWVzdGVkIHJlc291cmNlIGlzIG5vdAorICAgICAqIGF2YWlsYWJsZS4KKyAgICAgKi8KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDX05PVF9GT1VORCA9IDQwNDsKKworICAgIC8qKgorICAgICAqIFN0YXR1cyBjb2RlICg0MDUpIGluZGljYXRpbmcgdGhhdCB0aGUgbWV0aG9kIHNwZWNpZmllZCBpbiB0aGUKKyAgICAgKiA8Y29kZT48ZW0+UmVxdWVzdC1MaW5lPC9lbT48L2NvZGU+IGlzIG5vdCBhbGxvd2VkIGZvciB0aGUgcmVzb3VyY2UKKyAgICAgKiBpZGVudGlmaWVkIGJ5IHRoZSA8Y29kZT48ZW0+UmVxdWVzdC1VUkk8L2VtPjwvY29kZT4uCisgICAgICovCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ19NRVRIT0RfTk9UX0FMTE9XRUQgPSA0MDU7CisKKyAgICAvKioKKyAgICAgKiBTdGF0dXMgY29kZSAoNDA2KSBpbmRpY2F0aW5nIHRoYXQgdGhlIHJlc291cmNlIGlkZW50aWZpZWQgYnkgdGhlCisgICAgICogcmVxdWVzdCBpcyBvbmx5IGNhcGFibGUgb2YgZ2VuZXJhdGluZyByZXNwb25zZSBlbnRpdGllcyB3aGljaCBoYXZlCisgICAgICogY29udGVudCBjaGFyYWN0ZXJpc3RpY3Mgbm90IGFjY2VwdGFibGUgYWNjb3JkaW5nIHRvIHRoZSBhY2NlcHQKKyAgICAgKiBoZWFkZXJzIHNlbnQgaW4gdGhlIHJlcXVlc3QuCisgICAgICovCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ19OT1RfQUNDRVBUQUJMRSA9IDQwNjsKKworICAgIC8qKgorICAgICAqIFN0YXR1cyBjb2RlICg0MDcpIGluZGljYXRpbmcgdGhhdCB0aGUgY2xpZW50IDxlbT5NVVNUPC9lbT4gZmlyc3QKKyAgICAgKiBhdXRoZW50aWNhdGUgaXRzZWxmIHdpdGggdGhlIHByb3h5LgorICAgICAqLworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NfUFJPWFlfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQgPSA0MDc7CisKKyAgICAvKioKKyAgICAgKiBTdGF0dXMgY29kZSAoNDA4KSBpbmRpY2F0aW5nIHRoYXQgdGhlIGNsaWVudCBkaWQgbm90IHByb2R1Y2UgYQorICAgICAqIHJlcXVlc3Qgd2l0aGluIHRoZSB0aW1lIHRoYXQgdGhlIHNlcnZlciB3YXMgcHJlcGFyZWQgdG8gd2FpdC4KKyAgICAgKi8KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDX1JFUVVFU1RfVElNRU9VVCA9IDQwODsKKworICAgIC8qKgorICAgICAqIFN0YXR1cyBjb2RlICg0MDkpIGluZGljYXRpbmcgdGhhdCB0aGUgcmVxdWVzdCBjb3VsZCBub3QgYmUKKyAgICAgKiBjb21wbGV0ZWQgZHVlIHRvIGEgY29uZmxpY3Qgd2l0aCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUKKyAgICAgKiByZXNvdXJjZS4KKyAgICAgKi8KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDX0NPTkZMSUNUID0gNDA5OworCisgICAgLyoqCisgICAgICogU3RhdHVzIGNvZGUgKDQxMCkgaW5kaWNhdGluZyB0aGF0IHRoZSByZXNvdXJjZSBpcyBubyBsb25nZXIKKyAgICAgKiBhdmFpbGFibGUgYXQgdGhlIHNlcnZlciBhbmQgbm8gZm9yd2FyZGluZyBhZGRyZXNzIGlzIGtub3duLgorICAgICAqIFRoaXMgY29uZGl0aW9uIDxlbT5TSE9VTEQ8L2VtPiBiZSBjb25zaWRlcmVkIHBlcm1hbmVudC4KKyAgICAgKi8KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDX0dPTkUgPSA0MTA7CisKKyAgICAvKioKKyAgICAgKiBTdGF0dXMgY29kZSAoNDExKSBpbmRpY2F0aW5nIHRoYXQgdGhlIHJlcXVlc3QgY2Fubm90IGJlIGhhbmRsZWQKKyAgICAgKiB3aXRob3V0IGEgZGVmaW5lZCA8Y29kZT48ZW0+Q29udGVudC1MZW5ndGg8L2VtPjwvY29kZT4uCisgICAgICovCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ19MRU5HVEhfUkVRVUlSRUQgPSA0MTE7CisKKyAgICAvKioKKyAgICAgKiBTdGF0dXMgY29kZSAoNDEyKSBpbmRpY2F0aW5nIHRoYXQgdGhlIHByZWNvbmRpdGlvbiBnaXZlbiBpbiBvbmUKKyAgICAgKiBvciBtb3JlIG9mIHRoZSByZXF1ZXN0LWhlYWRlciBmaWVsZHMgZXZhbHVhdGVkIHRvIGZhbHNlIHdoZW4gaXQKKyAgICAgKiB3YXMgdGVzdGVkIG9uIHRoZSBzZXJ2ZXIuCisgICAgICovCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ19QUkVDT05ESVRJT05fRkFJTEVEID0gNDEyOworCisgICAgLyoqCisgICAgICogU3RhdHVzIGNvZGUgKDQxMykgaW5kaWNhdGluZyB0aGF0IHRoZSBzZXJ2ZXIgaXMgcmVmdXNpbmcgdG8gcHJvY2VzcworICAgICAqIHRoZSByZXF1ZXN0IGJlY2F1c2UgdGhlIHJlcXVlc3QgZW50aXR5IGlzIGxhcmdlciB0aGFuIHRoZSBzZXJ2ZXIgaXMKKyAgICAgKiB3aWxsaW5nIG9yIGFibGUgdG8gcHJvY2Vzcy4KKyAgICAgKi8KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDX1JFUVVFU1RfRU5USVRZX1RPT19MQVJHRSA9IDQxMzsKKworICAgIC8qKgorICAgICAqIFN0YXR1cyBjb2RlICg0MTQpIGluZGljYXRpbmcgdGhhdCB0aGUgc2VydmVyIGlzIHJlZnVzaW5nIHRvIHNlcnZpY2UKKyAgICAgKiB0aGUgcmVxdWVzdCBiZWNhdXNlIHRoZSA8Y29kZT48ZW0+UmVxdWVzdC1VUkk8L2VtPjwvY29kZT4gaXMgbG9uZ2VyCisgICAgICogdGhhbiB0aGUgc2VydmVyIGlzIHdpbGxpbmcgdG8gaW50ZXJwcmV0LgorICAgICAqLworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NfUkVRVUVTVF9VUklfVE9PX0xPTkcgPSA0MTQ7CisKKyAgICAvKioKKyAgICAgKiBTdGF0dXMgY29kZSAoNDE1KSBpbmRpY2F0aW5nIHRoYXQgdGhlIHNlcnZlciBpcyByZWZ1c2luZyB0byBzZXJ2aWNlCisgICAgICogdGhlIHJlcXVlc3QgYmVjYXVzZSB0aGUgZW50aXR5IG9mIHRoZSByZXF1ZXN0IGlzIGluIGEgZm9ybWF0IG5vdAorICAgICAqIHN1cHBvcnRlZCBieSB0aGUgcmVxdWVzdGVkIHJlc291cmNlIGZvciB0aGUgcmVxdWVzdGVkIG1ldGhvZC4KKyAgICAgKi8KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDX1VOU1VQUE9SVEVEX01FRElBX1RZUEUgPSA0MTU7CisKKyAgICAvKioKKyAgICAgKiBTdGF0dXMgY29kZSAoNDE2KSBpbmRpY2F0aW5nIHRoYXQgdGhlIHNlcnZlciBjYW5ub3Qgc2VydmUgdGhlCisgICAgICogcmVxdWVzdGVkIGJ5dGUgcmFuZ2UuCisgICAgICovCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ19SRVFVRVNURURfUkFOR0VfTk9UX1NBVElTRklBQkxFID0gNDE2OworCisgICAgLyoqCisgICAgICogU3RhdHVzIGNvZGUgKDQxNykgaW5kaWNhdGluZyB0aGF0IHRoZSBzZXJ2ZXIgY291bGQgbm90IG1lZXQgdGhlCisgICAgICogZXhwZWN0YXRpb24gZ2l2ZW4gaW4gdGhlIEV4cGVjdCByZXF1ZXN0IGhlYWRlci4KKyAgICAgKi8KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDX0VYUEVDVEFUSU9OX0ZBSUxFRCA9IDQxNzsKKworICAgIC8qKgorICAgICAqIFN0YXR1cyBjb2RlICg1MDApIGluZGljYXRpbmcgYW4gZXJyb3IgaW5zaWRlIHRoZSBIVFRQIHNlcnZlcgorICAgICAqIHdoaWNoIHByZXZlbnRlZCBpdCBmcm9tIGZ1bGZpbGxpbmcgdGhlIHJlcXVlc3QuCisgICAgICovCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IgPSA1MDA7CisKKyAgICAvKioKKyAgICAgKiBTdGF0dXMgY29kZSAoNTAxKSBpbmRpY2F0aW5nIHRoZSBIVFRQIHNlcnZlciBkb2VzIG5vdCBzdXBwb3J0CisgICAgICogdGhlIGZ1bmN0aW9uYWxpdHkgbmVlZGVkIHRvIGZ1bGZpbGwgdGhlIHJlcXVlc3QuCisgICAgICovCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ19OT1RfSU1QTEVNRU5URUQgPSA1MDE7CisKKyAgICAvKioKKyAgICAgKiBTdGF0dXMgY29kZSAoNTAyKSBpbmRpY2F0aW5nIHRoYXQgdGhlIEhUVFAgc2VydmVyIHJlY2VpdmVkIGFuCisgICAgICogaW52YWxpZCByZXNwb25zZSBmcm9tIGEgc2VydmVyIGl0IGNvbnN1bHRlZCB3aGVuIGFjdGluZyBhcyBhCisgICAgICogcHJveHkgb3IgZ2F0ZXdheS4KKyAgICAgKi8KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDX0JBRF9HQVRFV0FZID0gNTAyOworCisgICAgLyoqCisgICAgICogU3RhdHVzIGNvZGUgKDUwMykgaW5kaWNhdGluZyB0aGF0IHRoZSBIVFRQIHNlcnZlciBpcworICAgICAqIHRlbXBvcmFyaWx5IG92ZXJsb2FkZWQsIGFuZCB1bmFibGUgdG8gaGFuZGxlIHRoZSByZXF1ZXN0LgorICAgICAqLworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NfU0VSVklDRV9VTkFWQUlMQUJMRSA9IDUwMzsKKworICAgIC8qKgorICAgICAqIFN0YXR1cyBjb2RlICg1MDQpIGluZGljYXRpbmcgdGhhdCB0aGUgc2VydmVyIGRpZCBub3QgcmVjZWl2ZQorICAgICAqIGEgdGltZWx5IHJlc3BvbnNlIGZyb20gdGhlIHVwc3RyZWFtIHNlcnZlciB3aGlsZSBhY3RpbmcgYXMKKyAgICAgKiBhIGdhdGV3YXkgb3IgcHJveHkuCisgICAgICovCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ19HQVRFV0FZX1RJTUVPVVQgPSA1MDQ7CisKKyAgICAvKioKKyAgICAgKiBTdGF0dXMgY29kZSAoNTA1KSBpbmRpY2F0aW5nIHRoYXQgdGhlIHNlcnZlciBkb2VzIG5vdCBzdXBwb3J0CisgICAgICogb3IgcmVmdXNlcyB0byBzdXBwb3J0IHRoZSBIVFRQIHByb3RvY29sIHZlcnNpb24gdGhhdCB3YXMgdXNlZAorICAgICAqIGluIHRoZSByZXF1ZXN0IG1lc3NhZ2UuCisgICAgICovCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ19IVFRQX1ZFUlNJT05fTk9UX1NVUFBPUlRFRCA9IDUwNTsKK30KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2h0dHAvSHR0cFNlcnZsZXRSZXNwb25zZVdyYXBwZXIuamF2YSBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2h0dHAvSHR0cFNlcnZsZXRSZXNwb25zZVdyYXBwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTFlNGJjCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvaHR0cC9IdHRwU2VydmxldFJlc3BvbnNlV3JhcHBlci5qYXZhCkBAIC0wLDAgKzEsMTk1IEBACisvKgorKiBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCitwYWNrYWdlIGphdmF4LnNlcnZsZXQuaHR0cDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXNwb25zZVdyYXBwZXI7CisKKy8qKgorICogCisgKiBQcm92aWRlcyBhIGNvbnZlbmllbnQgaW1wbGVtZW50YXRpb24gb2YgdGhlIEh0dHBTZXJ2bGV0UmVzcG9uc2UgaW50ZXJmYWNlIHRoYXQKKyAqIGNhbiBiZSBzdWJjbGFzc2VkIGJ5IGRldmVsb3BlcnMgd2lzaGluZyB0byBhZGFwdCB0aGUgcmVzcG9uc2UgZnJvbSBhIFNlcnZsZXQuCisgKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIFdyYXBwZXIgb3IgRGVjb3JhdG9yIHBhdHRlcm4uIE1ldGhvZHMgZGVmYXVsdCB0bworICogY2FsbGluZyB0aHJvdWdoIHRvIHRoZSB3cmFwcGVkIHJlc3BvbnNlIG9iamVjdC4KKyAqIAorICogQGF1dGhvciAJVmFyaW91cworICogQHZlcnNpb24gCSRWZXJzaW9uJAorICAqIEBzaW5jZQl2IDIuMworICoKKyAqIEBzZWUgCWphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlCisgKgorICovCisKK3B1YmxpYyBjbGFzcyBIdHRwU2VydmxldFJlc3BvbnNlV3JhcHBlciBleHRlbmRzIFNlcnZsZXRSZXNwb25zZVdyYXBwZXIgaW1wbGVtZW50cyBIdHRwU2VydmxldFJlc3BvbnNlIHsKKworCisgICAgLyoqIAorICAgICogQ29uc3RydWN0cyBhIHJlc3BvbnNlIGFkYXB0b3Igd3JhcHBpbmcgdGhlIGdpdmVuIHJlc3BvbnNlLgorICAgICogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSByZXNwb25zZSBpcyBudWxsCisgICAgKi8KKyAgICBwdWJsaWMgSHR0cFNlcnZsZXRSZXNwb25zZVdyYXBwZXIoSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgeworCSAgICBzdXBlcihyZXNwb25zZSk7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgSHR0cFNlcnZsZXRSZXNwb25zZSBfZ2V0SHR0cFNlcnZsZXRSZXNwb25zZSgpIHsKKwlyZXR1cm4gKEh0dHBTZXJ2bGV0UmVzcG9uc2UpIHN1cGVyLmdldFJlc3BvbnNlKCk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoaXMgbWV0aG9kIGlzIHRvIGNhbGwgYWRkQ29va2llKENvb2tpZSBjb29raWUpCisgICAgICogb24gdGhlIHdyYXBwZWQgcmVzcG9uc2Ugb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZENvb2tpZShDb29raWUgY29va2llKSB7CisJdGhpcy5fZ2V0SHR0cFNlcnZsZXRSZXNwb25zZSgpLmFkZENvb2tpZShjb29raWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoaXMgbWV0aG9kIGlzIHRvIGNhbGwgY29udGFpbnNIZWFkZXIoU3RyaW5nIG5hbWUpCisgICAgICogb24gdGhlIHdyYXBwZWQgcmVzcG9uc2Ugb2JqZWN0LgorICAgICAqLworCisgCisgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNIZWFkZXIoU3RyaW5nIG5hbWUpIHsKKwlyZXR1cm4gdGhpcy5fZ2V0SHR0cFNlcnZsZXRSZXNwb25zZSgpLmNvbnRhaW5zSGVhZGVyKG5hbWUpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBpcyB0byBjYWxsIGVuY29kZVVSTChTdHJpbmcgdXJsKQorICAgICAqIG9uIHRoZSB3cmFwcGVkIHJlc3BvbnNlIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGVuY29kZVVSTChTdHJpbmcgdXJsKSB7CisJcmV0dXJuIHRoaXMuX2dldEh0dHBTZXJ2bGV0UmVzcG9uc2UoKS5lbmNvZGVVUkwodXJsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBpcyB0byByZXR1cm4gZW5jb2RlUmVkaXJlY3RVUkwoU3RyaW5nIHVybCkKKyAgICAgKiBvbiB0aGUgd3JhcHBlZCByZXNwb25zZSBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBlbmNvZGVSZWRpcmVjdFVSTChTdHJpbmcgdXJsKSB7CisJcmV0dXJuIHRoaXMuX2dldEh0dHBTZXJ2bGV0UmVzcG9uc2UoKS5lbmNvZGVSZWRpcmVjdFVSTCh1cmwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoaXMgbWV0aG9kIGlzIHRvIGNhbGwgZW5jb2RlVXJsKFN0cmluZyB1cmwpCisgICAgICogb24gdGhlIHdyYXBwZWQgcmVzcG9uc2Ugb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZW5jb2RlVXJsKFN0cmluZyB1cmwpIHsKKwlyZXR1cm4gdGhpcy5fZ2V0SHR0cFNlcnZsZXRSZXNwb25zZSgpLmVuY29kZVVybCh1cmwpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBpcyB0byByZXR1cm4gZW5jb2RlUmVkaXJlY3RVcmwoU3RyaW5nIHVybCkKKyAgICAgKiBvbiB0aGUgd3JhcHBlZCByZXNwb25zZSBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBlbmNvZGVSZWRpcmVjdFVybChTdHJpbmcgdXJsKSB7CisJcmV0dXJuIHRoaXMuX2dldEh0dHBTZXJ2bGV0UmVzcG9uc2UoKS5lbmNvZGVSZWRpcmVjdFVybCh1cmwpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBpcyB0byBjYWxsIHNlbmRFcnJvcihpbnQgc2MsIFN0cmluZyBtc2cpCisgICAgICogb24gdGhlIHdyYXBwZWQgcmVzcG9uc2Ugb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNlbmRFcnJvcihpbnQgc2MsIFN0cmluZyBtc2cpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJdGhpcy5fZ2V0SHR0cFNlcnZsZXRSZXNwb25zZSgpLnNlbmRFcnJvcihzYywgbXNnKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBpcyB0byBjYWxsIHNlbmRFcnJvcihpbnQgc2MpCisgICAgICogb24gdGhlIHdyYXBwZWQgcmVzcG9uc2Ugb2JqZWN0LgorICAgICAqLworCisKKyAgICBwdWJsaWMgdm9pZCBzZW5kRXJyb3IoaW50IHNjKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXRoaXMuX2dldEh0dHBTZXJ2bGV0UmVzcG9uc2UoKS5zZW5kRXJyb3Ioc2MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoaXMgbWV0aG9kIGlzIHRvIHJldHVybiBzZW5kUmVkaXJlY3QoU3RyaW5nIGxvY2F0aW9uKQorICAgICAqIG9uIHRoZSB3cmFwcGVkIHJlc3BvbnNlIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZW5kUmVkaXJlY3QoU3RyaW5nIGxvY2F0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXRoaXMuX2dldEh0dHBTZXJ2bGV0UmVzcG9uc2UoKS5zZW5kUmVkaXJlY3QobG9jYXRpb24pOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBpcyB0byBjYWxsIHNldERhdGVIZWFkZXIoU3RyaW5nIG5hbWUsIGxvbmcgZGF0ZSkKKyAgICAgKiBvbiB0aGUgd3JhcHBlZCByZXNwb25zZSBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGF0ZUhlYWRlcihTdHJpbmcgbmFtZSwgbG9uZyBkYXRlKSB7CisJdGhpcy5fZ2V0SHR0cFNlcnZsZXRSZXNwb25zZSgpLnNldERhdGVIZWFkZXIobmFtZSwgZGF0ZSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoaXMgbWV0aG9kIGlzIHRvIGNhbGwgYWRkRGF0ZUhlYWRlcihTdHJpbmcgbmFtZSwgbG9uZyBkYXRlKQorICAgICAqIG9uIHRoZSB3cmFwcGVkIHJlc3BvbnNlIG9iamVjdC4KKyAgICAgKi8KKyAgIHB1YmxpYyB2b2lkIGFkZERhdGVIZWFkZXIoU3RyaW5nIG5hbWUsIGxvbmcgZGF0ZSkgeworCXRoaXMuX2dldEh0dHBTZXJ2bGV0UmVzcG9uc2UoKS5hZGREYXRlSGVhZGVyKG5hbWUsIGRhdGUpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBpcyB0byByZXR1cm4gc2V0SGVhZGVyKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpCisgICAgICogb24gdGhlIHdyYXBwZWQgcmVzcG9uc2Ugb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEhlYWRlcihTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7CisJdGhpcy5fZ2V0SHR0cFNlcnZsZXRSZXNwb25zZSgpLnNldEhlYWRlcihuYW1lLCB2YWx1ZSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoaXMgbWV0aG9kIGlzIHRvIHJldHVybiBhZGRIZWFkZXIoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkKKyAgICAgKiBvbiB0aGUgd3JhcHBlZCByZXNwb25zZSBvYmplY3QuCisgICAgICovCisgICAgIHB1YmxpYyB2b2lkIGFkZEhlYWRlcihTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7CisJdGhpcy5fZ2V0SHR0cFNlcnZsZXRSZXNwb25zZSgpLmFkZEhlYWRlcihuYW1lLCB2YWx1ZSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoaXMgbWV0aG9kIGlzIHRvIGNhbGwgc2V0SW50SGVhZGVyKFN0cmluZyBuYW1lLCBpbnQgdmFsdWUpCisgICAgICogb24gdGhlIHdyYXBwZWQgcmVzcG9uc2Ugb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEludEhlYWRlcihTdHJpbmcgbmFtZSwgaW50IHZhbHVlKSB7CisJdGhpcy5fZ2V0SHR0cFNlcnZsZXRSZXNwb25zZSgpLnNldEludEhlYWRlcihuYW1lLCB2YWx1ZSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoaXMgbWV0aG9kIGlzIHRvIGNhbGwgYWRkSW50SGVhZGVyKFN0cmluZyBuYW1lLCBpbnQgdmFsdWUpCisgICAgICogb24gdGhlIHdyYXBwZWQgcmVzcG9uc2Ugb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEludEhlYWRlcihTdHJpbmcgbmFtZSwgaW50IHZhbHVlKSB7CisJdGhpcy5fZ2V0SHR0cFNlcnZsZXRSZXNwb25zZSgpLmFkZEludEhlYWRlcihuYW1lLCB2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgdGhpcyBtZXRob2QgaXMgdG8gY2FsbCBzZXRTdGF0dXMoaW50IHNjKQorICAgICAqIG9uIHRoZSB3cmFwcGVkIHJlc3BvbnNlIG9iamVjdC4KKyAgICAgKi8KKworCisgICAgcHVibGljIHZvaWQgc2V0U3RhdHVzKGludCBzYykgeworCXRoaXMuX2dldEh0dHBTZXJ2bGV0UmVzcG9uc2UoKS5zZXRTdGF0dXMoc2MpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBpcyB0byBjYWxsIHNldFN0YXR1cyhpbnQgc2MsIFN0cmluZyBzbSkKKyAgICAgKiBvbiB0aGUgd3JhcHBlZCByZXNwb25zZSBvYmplY3QuCisgICAgICovCisgICAgIHB1YmxpYyB2b2lkIHNldFN0YXR1cyhpbnQgc2MsIFN0cmluZyBzbSkgeworCXRoaXMuX2dldEh0dHBTZXJ2bGV0UmVzcG9uc2UoKS5zZXRTdGF0dXMoc2MsIHNtKTsKKyAgICB9CisKKyAgIAorfQpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvaHR0cC9IdHRwU2Vzc2lvbi5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvaHR0cC9IdHRwU2Vzc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5NTc5NzUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9odHRwL0h0dHBTZXNzaW9uLmphdmEKQEAgLTAsMCArMSw0MjMgQEAKKy8qCisqIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KK3BhY2thZ2UgamF2YXguc2VydmxldC5odHRwOworCitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7CisKKy8qKgorICoKKyAqIFByb3ZpZGVzIGEgd2F5IHRvIGlkZW50aWZ5IGEgdXNlciBhY3Jvc3MgbW9yZSB0aGFuIG9uZSBwYWdlCisgKiByZXF1ZXN0IG9yIHZpc2l0IHRvIGEgV2ViIHNpdGUgYW5kIHRvIHN0b3JlIGluZm9ybWF0aW9uIGFib3V0IHRoYXQgdXNlci4KKyAqCisgKiA8cD5UaGUgc2VydmxldCBjb250YWluZXIgdXNlcyB0aGlzIGludGVyZmFjZSB0byBjcmVhdGUgYSBzZXNzaW9uCisgKiBiZXR3ZWVuIGFuIEhUVFAgY2xpZW50IGFuZCBhbiBIVFRQIHNlcnZlci4gVGhlIHNlc3Npb24gcGVyc2lzdHMKKyAqIGZvciBhIHNwZWNpZmllZCB0aW1lIHBlcmlvZCwgYWNyb3NzIG1vcmUgdGhhbiBvbmUgY29ubmVjdGlvbiBvcgorICogcGFnZSByZXF1ZXN0IGZyb20gdGhlIHVzZXIuIEEgc2Vzc2lvbiB1c3VhbGx5IGNvcnJlc3BvbmRzIHRvIG9uZSAKKyAqIHVzZXIsIHdobyBtYXkgdmlzaXQgYSBzaXRlIG1hbnkgdGltZXMuIFRoZSBzZXJ2ZXIgY2FuIG1haW50YWluIGEgCisgKiBzZXNzaW9uIGluIG1hbnkgd2F5cyBzdWNoIGFzIHVzaW5nIGNvb2tpZXMgb3IgcmV3cml0aW5nIFVSTHMuCisgKgorICogPHA+VGhpcyBpbnRlcmZhY2UgYWxsb3dzIHNlcnZsZXRzIHRvIAorICogPHVsPgorICogPGxpPlZpZXcgYW5kIG1hbmlwdWxhdGUgaW5mb3JtYXRpb24gYWJvdXQgYSBzZXNzaW9uLCBzdWNoIGFzCisgKiAgICAgdGhlIHNlc3Npb24gaWRlbnRpZmllciwgY3JlYXRpb24gdGltZSwgYW5kIGxhc3QgYWNjZXNzZWQgdGltZQorICogPGxpPkJpbmQgb2JqZWN0cyB0byBzZXNzaW9ucywgYWxsb3dpbmcgdXNlciBpbmZvcm1hdGlvbiB0byBwZXJzaXN0IAorICogICAgIGFjcm9zcyBtdWx0aXBsZSB1c2VyIGNvbm5lY3Rpb25zCisgKiA8L3VsPgorICoKKyAqIDxwPldoZW4gYW4gYXBwbGljYXRpb24gc3RvcmVzIGFuIG9iamVjdCBpbiBvciByZW1vdmVzIGFuIG9iamVjdCBmcm9tIGEKKyAqIHNlc3Npb24sIHRoZSBzZXNzaW9uIGNoZWNrcyB3aGV0aGVyIHRoZSBvYmplY3QgaW1wbGVtZW50cworICoge0BsaW5rIEh0dHBTZXNzaW9uQmluZGluZ0xpc3RlbmVyfS4gSWYgaXQgZG9lcywgCisgKiB0aGUgc2VydmxldCBub3RpZmllcyB0aGUgb2JqZWN0IHRoYXQgaXQgaGFzIGJlZW4gYm91bmQgdG8gb3IgdW5ib3VuZCAKKyAqIGZyb20gdGhlIHNlc3Npb24uIE5vdGlmaWNhdGlvbnMgYXJlIHNlbnQgYWZ0ZXIgdGhlIGJpbmRpbmcgbWV0aG9kcyBjb21wbGV0ZS4gCisgKiBGb3Igc2Vzc2lvbiB0aGF0IGFyZSBpbnZhbGlkYXRlZCBvciBleHBpcmUsIG5vdGlmaWNhdGlvbnMgYXJlIHNlbnQgYWZ0ZXIKKyAqIHRoZSBzZXNzaW9uIGhhcyBiZWVuIGludmFsaWRhdGVkIG9yIGV4cGlyZWQuCisgKgorICogPHA+IFdoZW4gY29udGFpbmVyIG1pZ3JhdGVzIGEgc2Vzc2lvbiBiZXR3ZWVuIFZNcyBpbiBhIGRpc3RyaWJ1dGVkIGNvbnRhaW5lcgorICogc2V0dGluZywgYWxsIHNlc3Npb24gYXR0cmlidXRlcyBpbXBsZW1lbnRpbmcgdGhlIHtAbGluayBIdHRwU2Vzc2lvbkFjdGl2YXRpb25MaXN0ZW5lcn0KKyAqIGludGVyZmFjZSBhcmUgbm90aWZpZWQuCisgKiAKKyAqIDxwPkEgc2VydmxldCBzaG91bGQgYmUgYWJsZSB0byBoYW5kbGUgY2FzZXMgaW4gd2hpY2gKKyAqIHRoZSBjbGllbnQgZG9lcyBub3QgY2hvb3NlIHRvIGpvaW4gYSBzZXNzaW9uLCBzdWNoIGFzIHdoZW4gY29va2llcyBhcmUKKyAqIGludGVudGlvbmFsbHkgdHVybmVkIG9mZi4gVW50aWwgdGhlIGNsaWVudCBqb2lucyB0aGUgc2Vzc2lvbiwKKyAqIDxjb2RlPmlzTmV3PC9jb2RlPiByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+LiAgSWYgdGhlIGNsaWVudCBjaG9vc2VzIAorICogbm90IHRvIGpvaW4KKyAqIHRoZSBzZXNzaW9uLCA8Y29kZT5nZXRTZXNzaW9uPC9jb2RlPiB3aWxsIHJldHVybiBhIGRpZmZlcmVudCBzZXNzaW9uCisgKiBvbiBlYWNoIHJlcXVlc3QsIGFuZCA8Y29kZT5pc05ldzwvY29kZT4gd2lsbCBhbHdheXMgcmV0dXJuCisgKiA8Y29kZT50cnVlPC9jb2RlPi4KKyAqCisgKiA8cD5TZXNzaW9uIGluZm9ybWF0aW9uIGlzIHNjb3BlZCBvbmx5IHRvIHRoZSBjdXJyZW50IHdlYiBhcHBsaWNhdGlvbgorICogKDxjb2RlPlNlcnZsZXRDb250ZXh0PC9jb2RlPiksIHNvIGluZm9ybWF0aW9uIHN0b3JlZCBpbiBvbmUgY29udGV4dAorICogd2lsbCBub3QgYmUgZGlyZWN0bHkgdmlzaWJsZSBpbiBhbm90aGVyLgorICoKKyAqIEBhdXRob3IJVmFyaW91cworICogQHZlcnNpb24JJFZlcnNpb24kCisgKgorICoKKyAqIEBzZWUgCUh0dHBTZXNzaW9uQmluZGluZ0xpc3RlbmVyCisgKiBAc2VlIAlIdHRwU2Vzc2lvbkNvbnRleHQKKyAqCisgKi8KKworcHVibGljIGludGVyZmFjZSBIdHRwU2Vzc2lvbiB7CisKKworCisKKyAgICAvKioKKyAgICAgKgorICAgICAqIFJldHVybnMgdGhlIHRpbWUgd2hlbiB0aGlzIHNlc3Npb24gd2FzIGNyZWF0ZWQsIG1lYXN1cmVkCisgICAgICogaW4gbWlsbGlzZWNvbmRzIHNpbmNlIG1pZG5pZ2h0IEphbnVhcnkgMSwgMTk3MCBHTVQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCQkJCWEgPGNvZGU+bG9uZzwvY29kZT4gc3BlY2lmeWluZworICAgICAqIAkJCQkJd2hlbiB0aGlzIHNlc3Npb24gd2FzIGNyZWF0ZWQsCisgICAgICoJCQkJCWV4cHJlc3NlZCBpbiAKKyAgICAgKgkJCQkJbWlsbGlzZWNvbmRzIHNpbmNlIDEvMS8xOTcwIEdNVAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24JaWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIG9uIGFuCisgICAgICoJCQkJCWludmFsaWRhdGVkIHNlc3Npb24KKyAgICAgKgorICAgICAqLworCisgICAgcHVibGljIGxvbmcgZ2V0Q3JlYXRpb25UaW1lKCk7CisgICAgCisgICAgCisgICAgCisgICAgCisgICAgLyoqCisgICAgICoKKyAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHVuaXF1ZSBpZGVudGlmaWVyIGFzc2lnbmVkIAorICAgICAqIHRvIHRoaXMgc2Vzc2lvbi4gVGhlIGlkZW50aWZpZXIgaXMgYXNzaWduZWQgCisgICAgICogYnkgdGhlIHNlcnZsZXQgY29udGFpbmVyIGFuZCBpcyBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQuCisgICAgICogCisgICAgICogQHJldHVybgkJCQlhIHN0cmluZyBzcGVjaWZ5aW5nIHRoZSBpZGVudGlmaWVyCisgICAgICoJCQkJCWFzc2lnbmVkIHRvIHRoaXMgc2Vzc2lvbgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24JaWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIG9uIGFuCisgICAgICoJCQkJCWludmFsaWRhdGVkIHNlc3Npb24KKyAgICAgKgorICAgICAqLworCisgICAgcHVibGljIFN0cmluZyBnZXRJZCgpOworICAgIAorICAgIAorICAgIAorCisgICAgLyoqCisgICAgICoKKyAgICAgKiBSZXR1cm5zIHRoZSBsYXN0IHRpbWUgdGhlIGNsaWVudCBzZW50IGEgcmVxdWVzdCBhc3NvY2lhdGVkIHdpdGgKKyAgICAgKiB0aGlzIHNlc3Npb24sIGFzIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHNpbmNlIG1pZG5pZ2h0CisgICAgICogSmFudWFyeSAxLCAxOTcwIEdNVCwgYW5kIG1hcmtlZCBieSB0aGUgdGltZSB0aGUgY29udGFpbmVyIHJlY2VpdmVkIHRoZSByZXF1ZXN0LiAKKyAgICAgKgorICAgICAqIDxwPkFjdGlvbnMgdGhhdCB5b3VyIGFwcGxpY2F0aW9uIHRha2VzLCBzdWNoIGFzIGdldHRpbmcgb3Igc2V0dGluZworICAgICAqIGEgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzZXNzaW9uLCBkbyBub3QgYWZmZWN0IHRoZSBhY2Nlc3MKKyAgICAgKiB0aW1lLgorICAgICAqCisgICAgICogQHJldHVybgkJCQlhIDxjb2RlPmxvbmc8L2NvZGU+CisgICAgICoJCQkJCXJlcHJlc2VudGluZyB0aGUgbGFzdCB0aW1lIAorICAgICAqCQkJCQl0aGUgY2xpZW50IHNlbnQgYSByZXF1ZXN0IGFzc29jaWF0ZWQKKyAgICAgKgkJCQkJd2l0aCB0aGlzIHNlc3Npb24sIGV4cHJlc3NlZCBpbiAKKyAgICAgKgkJCQkJbWlsbGlzZWNvbmRzIHNpbmNlIDEvMS8xOTcwIEdNVAorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24JaWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIG9uIGFuCisgICAgICoJCQkJCWludmFsaWRhdGVkIHNlc3Npb24KKyAgICAgKgorICAgICAqLworCisgICAgcHVibGljIGxvbmcgZ2V0TGFzdEFjY2Vzc2VkVGltZSgpOworICAgIAorICAgIAorICAgIC8qKgorICAgICogUmV0dXJucyB0aGUgU2VydmxldENvbnRleHQgdG8gd2hpY2ggdGhpcyBzZXNzaW9uIGJlbG9uZ3MuCisgICAgKiAgICAKKyAgICAqIEByZXR1cm4gVGhlIFNlcnZsZXRDb250ZXh0IG9iamVjdCBmb3IgdGhlIHdlYiBhcHBsaWNhdGlvbgorICAgICogQHNpbmNlIDIuMworICAgICovCisKKyAgICBwdWJsaWMgU2VydmxldENvbnRleHQgZ2V0U2VydmxldENvbnRleHQoKTsKKworCisgICAgLyoqCisgICAgICoKKyAgICAgKiBTcGVjaWZpZXMgdGhlIHRpbWUsIGluIHNlY29uZHMsIGJldHdlZW4gY2xpZW50IHJlcXVlc3RzIGJlZm9yZSB0aGUgCisgICAgICogc2VydmxldCBjb250YWluZXIgd2lsbCBpbnZhbGlkYXRlIHRoaXMgc2Vzc2lvbi4gIEEgbmVnYXRpdmUgdGltZQorICAgICAqIGluZGljYXRlcyB0aGUgc2Vzc2lvbiBzaG91bGQgbmV2ZXIgdGltZW91dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnRlcnZhbAkJQW4gaW50ZWdlciBzcGVjaWZ5aW5nIHRoZSBudW1iZXIKKyAgICAgKiAJCQkJb2Ygc2Vjb25kcyAKKyAgICAgKgorICAgICAqLworICAgIAorICAgIHB1YmxpYyB2b2lkIHNldE1heEluYWN0aXZlSW50ZXJ2YWwoaW50IGludGVydmFsKTsKKworCisKKworICAgLyoqCisgICAgKiBSZXR1cm5zIHRoZSBtYXhpbXVtIHRpbWUgaW50ZXJ2YWwsIGluIHNlY29uZHMsIHRoYXQgCisgICAgKiB0aGUgc2VydmxldCBjb250YWluZXIgd2lsbCBrZWVwIHRoaXMgc2Vzc2lvbiBvcGVuIGJldHdlZW4gCisgICAgKiBjbGllbnQgYWNjZXNzZXMuIEFmdGVyIHRoaXMgaW50ZXJ2YWwsIHRoZSBzZXJ2bGV0IGNvbnRhaW5lcgorICAgICogd2lsbCBpbnZhbGlkYXRlIHRoZSBzZXNzaW9uLiAgVGhlIG1heGltdW0gdGltZSBpbnRlcnZhbCBjYW4gYmUgc2V0CisgICAgKiB3aXRoIHRoZSA8Y29kZT5zZXRNYXhJbmFjdGl2ZUludGVydmFsPC9jb2RlPiBtZXRob2QuCisgICAgKiBBIG5lZ2F0aXZlIHRpbWUgaW5kaWNhdGVzIHRoZSBzZXNzaW9uIHNob3VsZCBuZXZlciB0aW1lb3V0LgorICAgICogIAorICAgICoKKyAgICAqIEByZXR1cm4JCWFuIGludGVnZXIgc3BlY2lmeWluZyB0aGUgbnVtYmVyIG9mCisgICAgKgkJCXNlY29uZHMgdGhpcyBzZXNzaW9uIHJlbWFpbnMgb3BlbgorICAgICoJCQliZXR3ZWVuIGNsaWVudCByZXF1ZXN0cworICAgICoKKyAgICAqIEBzZWUJCSNzZXRNYXhJbmFjdGl2ZUludGVydmFsCisgICAgKgorICAgICoKKyAgICAqLworCisgICAgcHVibGljIGludCBnZXRNYXhJbmFjdGl2ZUludGVydmFsKCk7CisgICAgCisgICAgCisKKworICAgLyoqCisgICAgKgorICAgICogQGRlcHJlY2F0ZWQgCUFzIG9mIFZlcnNpb24gMi4xLCB0aGlzIG1ldGhvZCBpcworICAgICoJCQlkZXByZWNhdGVkIGFuZCBoYXMgbm8gcmVwbGFjZW1lbnQuCisgICAgKgkJCUl0IHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZQorICAgICoJCQl2ZXJzaW9uIG9mIHRoZSBKYXZhIFNlcnZsZXQgQVBJLgorICAgICoKKyAgICAqLworCisgICAgcHVibGljIEh0dHBTZXNzaW9uQ29udGV4dCBnZXRTZXNzaW9uQ29udGV4dCgpOworICAgIAorICAgIAorICAgIAorICAgIAorICAgIC8qKgorICAgICAqCisgICAgICogUmV0dXJucyB0aGUgb2JqZWN0IGJvdW5kIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGluIHRoaXMgc2Vzc2lvbiwgb3IKKyAgICAgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBvYmplY3QgaXMgYm91bmQgdW5kZXIgdGhlIG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZQkJYSBzdHJpbmcgc3BlY2lmeWluZyB0aGUgbmFtZSBvZiB0aGUgb2JqZWN0CisgICAgICoKKyAgICAgKiBAcmV0dXJuCQkJdGhlIG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZQorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24JaWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIG9uIGFuCisgICAgICoJCQkJCWludmFsaWRhdGVkIHNlc3Npb24KKyAgICAgKgorICAgICAqLworICAKKyAgICBwdWJsaWMgT2JqZWN0IGdldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSk7CisgICAgCisgICAgCisgICAgCisgICAgCisgICAgLyoqCisgICAgICoKKyAgICAgKiBAZGVwcmVjYXRlZCAJQXMgb2YgVmVyc2lvbiAyLjIsIHRoaXMgbWV0aG9kIGlzCisgICAgICogCQkJcmVwbGFjZWQgYnkge0BsaW5rICNnZXRBdHRyaWJ1dGV9LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUJCWEgc3RyaW5nIHNwZWNpZnlpbmcgdGhlIG5hbWUgb2YgdGhlIG9iamVjdAorICAgICAqCisgICAgICogQHJldHVybgkJCXRoZSBvYmplY3Qgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uCWlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbiBhbgorICAgICAqCQkJCQlpbnZhbGlkYXRlZCBzZXNzaW9uCisgICAgICoKKyAgICAgKi8KKyAgCisgICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZShTdHJpbmcgbmFtZSk7CisgICAgCisgICAgCisgICAgCisKKyAgICAvKioKKyAgICAgKgorICAgICAqIFJldHVybnMgYW4gPGNvZGU+RW51bWVyYXRpb248L2NvZGU+IG9mIDxjb2RlPlN0cmluZzwvY29kZT4gb2JqZWN0cworICAgICAqIGNvbnRhaW5pbmcgdGhlIG5hbWVzIG9mIGFsbCB0aGUgb2JqZWN0cyBib3VuZCB0byB0aGlzIHNlc3Npb24uIAorICAgICAqCisgICAgICogQHJldHVybgkJCWFuIDxjb2RlPkVudW1lcmF0aW9uPC9jb2RlPiBvZiAKKyAgICAgKgkJCQk8Y29kZT5TdHJpbmc8L2NvZGU+IG9iamVjdHMgc3BlY2lmeWluZyB0aGUKKyAgICAgKgkJCQluYW1lcyBvZiBhbGwgdGhlIG9iamVjdHMgYm91bmQgdG8KKyAgICAgKgkJCQl0aGlzIHNlc3Npb24KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uCWlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbiBhbgorICAgICAqCQkJCQlpbnZhbGlkYXRlZCBzZXNzaW9uCisgICAgICoKKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0QXR0cmlidXRlTmFtZXMoKTsKKyAgICAKKyAgICAKKyAgICAKKworICAgIC8qKgorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQgCUFzIG9mIFZlcnNpb24gMi4yLCB0aGlzIG1ldGhvZCBpcworICAgICAqIAkJCXJlcGxhY2VkIGJ5IHtAbGluayAjZ2V0QXR0cmlidXRlTmFtZXN9CisgICAgICoKKyAgICAgKiBAcmV0dXJuCQkJCWFuIGFycmF5IG9mIDxjb2RlPlN0cmluZzwvY29kZT4KKyAgICAgKgkJCQkJb2JqZWN0cyBzcGVjaWZ5aW5nIHRoZQorICAgICAqCQkJCQluYW1lcyBvZiBhbGwgdGhlIG9iamVjdHMgYm91bmQgdG8KKyAgICAgKgkJCQkJdGhpcyBzZXNzaW9uCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbglpZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgb24gYW4KKyAgICAgKgkJCQkJaW52YWxpZGF0ZWQgc2Vzc2lvbgorICAgICAqCisgICAgICovCisgICAgCisgICAgcHVibGljIFN0cmluZ1tdIGdldFZhbHVlTmFtZXMoKTsKKyAgICAKKyAgICAKKyAgICAKKworICAgIC8qKgorICAgICAqIEJpbmRzIGFuIG9iamVjdCB0byB0aGlzIHNlc3Npb24sIHVzaW5nIHRoZSBuYW1lIHNwZWNpZmllZC4KKyAgICAgKiBJZiBhbiBvYmplY3Qgb2YgdGhlIHNhbWUgbmFtZSBpcyBhbHJlYWR5IGJvdW5kIHRvIHRoZSBzZXNzaW9uLAorICAgICAqIHRoZSBvYmplY3QgaXMgcmVwbGFjZWQuCisgICAgICoKKyAgICAgKiA8cD5BZnRlciB0aGlzIG1ldGhvZCBleGVjdXRlcywgYW5kIGlmIHRoZSBuZXcgb2JqZWN0CisgICAgICogaW1wbGVtZW50cyA8Y29kZT5IdHRwU2Vzc2lvbkJpbmRpbmdMaXN0ZW5lcjwvY29kZT4sCisgICAgICogdGhlIGNvbnRhaW5lciBjYWxscyAKKyAgICAgKiA8Y29kZT5IdHRwU2Vzc2lvbkJpbmRpbmdMaXN0ZW5lci52YWx1ZUJvdW5kPC9jb2RlPi4gVGhlIGNvbnRhaW5lciB0aGVuICAgCisgICAgICogbm90aWZpZXMgYW55IDxjb2RlPkh0dHBTZXNzaW9uQXR0cmlidXRlTGlzdGVuZXI8L2NvZGU+cyBpbiB0aGUgd2ViIAorICAgICAqIGFwcGxpY2F0aW9uLgorICAgICAKKyAgICAgKiA8cD5JZiBhbiBvYmplY3Qgd2FzIGFscmVhZHkgYm91bmQgdG8gdGhpcyBzZXNzaW9uIG9mIHRoaXMgbmFtZQorICAgICAqIHRoYXQgaW1wbGVtZW50cyA8Y29kZT5IdHRwU2Vzc2lvbkJpbmRpbmdMaXN0ZW5lcjwvY29kZT4sIGl0cyAKKyAgICAgKiA8Y29kZT5IdHRwU2Vzc2lvbkJpbmRpbmdMaXN0ZW5lci52YWx1ZVVuYm91bmQ8L2NvZGU+IG1ldGhvZCBpcyBjYWxsZWQuCisgICAgICoKKyAgICAgKiA8cD5JZiB0aGUgdmFsdWUgcGFzc2VkIGluIGlzIG51bGwsIHRoaXMgaGFzIHRoZSBzYW1lIGVmZmVjdCBhcyBjYWxsaW5nIAorICAgICAqIDxjb2RlPnJlbW92ZUF0dHJpYnV0ZSgpPGNvZGU+LgorICAgICAqCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZQkJCXRoZSBuYW1lIHRvIHdoaWNoIHRoZSBvYmplY3QgaXMgYm91bmQ7CisgICAgICoJCQkJCWNhbm5vdCBiZSBudWxsCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUJCQl0aGUgb2JqZWN0IHRvIGJlIGJvdW5kCisgICAgICoKKyAgICAgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbglpZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgb24gYW4KKyAgICAgKgkJCQkJaW52YWxpZGF0ZWQgc2Vzc2lvbgorICAgICAqCisgICAgICovCisgCisgICAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpOworICAgIAorCisKKworICAgIAorICAgIC8qKgorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQgCUFzIG9mIFZlcnNpb24gMi4yLCB0aGlzIG1ldGhvZCBpcworICAgICAqIAkJCXJlcGxhY2VkIGJ5IHtAbGluayAjc2V0QXR0cmlidXRlfQorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUJCQl0aGUgbmFtZSB0byB3aGljaCB0aGUgb2JqZWN0IGlzIGJvdW5kOworICAgICAqCQkJCQljYW5ub3QgYmUgbnVsbAorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlCQkJdGhlIG9iamVjdCB0byBiZSBib3VuZDsgY2Fubm90IGJlIG51bGwKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uCWlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbiBhbgorICAgICAqCQkJCQlpbnZhbGlkYXRlZCBzZXNzaW9uCisgICAgICoKKyAgICAgKi8KKyAKKyAgICBwdWJsaWMgdm9pZCBwdXRWYWx1ZShTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKTsKKworCisKKworCisgICAgLyoqCisgICAgICoKKyAgICAgKiBSZW1vdmVzIHRoZSBvYmplY3QgYm91bmQgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgZnJvbQorICAgICAqIHRoaXMgc2Vzc2lvbi4gSWYgdGhlIHNlc3Npb24gZG9lcyBub3QgaGF2ZSBhbiBvYmplY3QKKyAgICAgKiBib3VuZCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSwgdGhpcyBtZXRob2QgZG9lcyBub3RoaW5nLgorICAgICAqCisgICAgICogPHA+QWZ0ZXIgdGhpcyBtZXRob2QgZXhlY3V0ZXMsIGFuZCBpZiB0aGUgb2JqZWN0CisgICAgICogaW1wbGVtZW50cyA8Y29kZT5IdHRwU2Vzc2lvbkJpbmRpbmdMaXN0ZW5lcjwvY29kZT4sCisgICAgICogdGhlIGNvbnRhaW5lciBjYWxscyAKKyAgICAgKiA8Y29kZT5IdHRwU2Vzc2lvbkJpbmRpbmdMaXN0ZW5lci52YWx1ZVVuYm91bmQ8L2NvZGU+LiBUaGUgY29udGFpbmVyCisgICAgICogdGhlbiBub3RpZmllcyBhbnkgPGNvZGU+SHR0cFNlc3Npb25BdHRyaWJ1dGVMaXN0ZW5lcjwvY29kZT5zIGluIHRoZSB3ZWIgCisgICAgICogYXBwbGljYXRpb24uCisgICAgICogCisgICAgICogCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZQkJCQl0aGUgbmFtZSBvZiB0aGUgb2JqZWN0IHRvCisgICAgICoJCQkJCQlyZW1vdmUgZnJvbSB0aGlzIHNlc3Npb24KKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uCWlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbiBhbgorICAgICAqCQkJCQlpbnZhbGlkYXRlZCBzZXNzaW9uCisgICAgICovCisKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpOworCisKKworCisKKyAgICAvKioKKyAgICAgKgorICAgICAqIEBkZXByZWNhdGVkIAlBcyBvZiBWZXJzaW9uIDIuMiwgdGhpcyBtZXRob2QgaXMKKyAgICAgKiAJCQlyZXBsYWNlZCBieSB7QGxpbmsgI3JlbW92ZUF0dHJpYnV0ZX0KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lCQkJCXRoZSBuYW1lIG9mIHRoZSBvYmplY3QgdG8KKyAgICAgKgkJCQkJCXJlbW92ZSBmcm9tIHRoaXMgc2Vzc2lvbgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24JaWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIG9uIGFuCisgICAgICoJCQkJCWludmFsaWRhdGVkIHNlc3Npb24KKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVZhbHVlKFN0cmluZyBuYW1lKTsKKworCisKKworICAgIC8qKgorICAgICAqCisgICAgICogSW52YWxpZGF0ZXMgdGhpcyBzZXNzaW9uIHRoZW4gdW5iaW5kcyBhbnkgb2JqZWN0cyBib3VuZAorICAgICAqIHRvIGl0LiAKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uCWlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbiBhbgorICAgICAqCQkJCQlhbHJlYWR5IGludmFsaWRhdGVkIHNlc3Npb24KKyAgICAgKgorICAgICAqLworCisgICAgcHVibGljIHZvaWQgaW52YWxpZGF0ZSgpOworICAgIAorICAgIAorICAgIAorICAgIAorICAgIC8qKgorICAgICAqCisgICAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY2xpZW50IGRvZXMgbm90IHlldCBrbm93IGFib3V0IHRoZQorICAgICAqIHNlc3Npb24gb3IgaWYgdGhlIGNsaWVudCBjaG9vc2VzIG5vdCB0byBqb2luIHRoZSBzZXNzaW9uLiAgRm9yIAorICAgICAqIGV4YW1wbGUsIGlmIHRoZSBzZXJ2ZXIgdXNlZCBvbmx5IGNvb2tpZS1iYXNlZCBzZXNzaW9ucywgYW5kCisgICAgICogdGhlIGNsaWVudCBoYWQgZGlzYWJsZWQgdGhlIHVzZSBvZiBjb29raWVzLCB0aGVuIGEgc2Vzc2lvbiB3b3VsZAorICAgICAqIGJlIG5ldyBvbiBlYWNoIHJlcXVlc3QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIAkJCQk8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgCisgICAgICoJCQkJCXNlcnZlciBoYXMgY3JlYXRlZCBhIHNlc3Npb24sIAorICAgICAqCQkJCQlidXQgdGhlIGNsaWVudCBoYXMgbm90IHlldCBqb2luZWQKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uCWlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbiBhbgorICAgICAqCQkJCQlhbHJlYWR5IGludmFsaWRhdGVkIHNlc3Npb24KKyAgICAgKgorICAgICAqLworCisgICAgcHVibGljIGJvb2xlYW4gaXNOZXcoKTsKKworCisKK30KKwpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvaHR0cC9IdHRwU2Vzc2lvbkFjdGl2YXRpb25MaXN0ZW5lci5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvaHR0cC9IdHRwU2Vzc2lvbkFjdGl2YXRpb25MaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1OTYzYWUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9odHRwL0h0dHBTZXNzaW9uQWN0aXZhdGlvbkxpc3RlbmVyLmphdmEKQEAgLTAsMCArMSwzNiBAQAorLyoKKyogQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworcGFja2FnZSBqYXZheC5zZXJ2bGV0Lmh0dHA7CisKK2ltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKKworICAgIC8qKiBPYmplY3RzIHRoYXQgYXJlIGJvdW5kIHRvIGEgc2Vzc2lvbiBtYXkgbGlzdGVuIHRvIGNvbnRhaW5lcgorICAgICoqIGV2ZW50cyBub3RpZnlpbmcgdGhlbSB0aGF0IHNlc3Npb25zIHdpbGwgYmUgcGFzc2l2YXRlZCBhbmQgdGhhdAorICAgICoqIHNlc3Npb24gd2lsbCBiZSBhY3RpdmF0ZWQuIEEgY29udGFpbmVyIHRoYXQgbWlncmF0ZXMgc2Vzc2lvbiBiZXR3ZWVuIFZNcworICAgICoqIG9yIHBlcnNpc3RzIHNlc3Npb25zIGlzIHJlcXVpcmVkIHRvIG5vdGlmeSBhbGwgYXR0cmlidXRlcyBib3VuZCB0byBzZXNzaW9ucworICAgICoqIGltcGxlbWVudGluZyBIdHRwU2Vzc2lvbkFjdGl2YXRpb25MaXN0ZW5lci4KKyAgICAqKgorICAgICogQHNpbmNlIDIuMworICAgICovCisgICAgCitwdWJsaWMgaW50ZXJmYWNlIEh0dHBTZXNzaW9uQWN0aXZhdGlvbkxpc3RlbmVyIGV4dGVuZHMgRXZlbnRMaXN0ZW5lciB7IAorCisgICAgLyoqIE5vdGlmaWNhdGlvbiB0aGF0IHRoZSBzZXNzaW9uIGlzIGFib3V0IHRvIGJlIHBhc3NpdmF0ZWQuKi8KKyAgICBwdWJsaWMgdm9pZCBzZXNzaW9uV2lsbFBhc3NpdmF0ZShIdHRwU2Vzc2lvbkV2ZW50IHNlKTsgCisgICAgLyoqIE5vdGlmaWNhdGlvbiB0aGF0IHRoZSBzZXNzaW9uIGhhcyBqdXN0IGJlZW4gYWN0aXZhdGVkLiovCisgICAgcHVibGljIHZvaWQgc2Vzc2lvbkRpZEFjdGl2YXRlKEh0dHBTZXNzaW9uRXZlbnQgc2UpOworfSAKKwpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvaHR0cC9IdHRwU2Vzc2lvbkF0dHJpYnV0ZUxpc3RlbmVyLmphdmEgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9odHRwL0h0dHBTZXNzaW9uQXR0cmlidXRlTGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzBlOWY1Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvaHR0cC9IdHRwU2Vzc2lvbkF0dHJpYnV0ZUxpc3RlbmVyLmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyoKKyogQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworcGFja2FnZSBqYXZheC5zZXJ2bGV0Lmh0dHA7CisKK2ltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKKworCS8qKiBUaGlzIGxpc3RlbmVyIGludGVyZmFjZSBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gb3JkZXIgdG8KKwkqIGdldCBub3RpZmljYXRpb25zIG9mIGNoYW5nZXMgdG8gdGhlIGF0dHJpYnV0ZSBsaXN0cyBvZiBzZXNzaW9ucyB3aXRoaW4KKwkqIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorCSogQHNpbmNlCXYgMi4zCisqLworCitwdWJsaWMgaW50ZXJmYWNlIEh0dHBTZXNzaW9uQXR0cmlidXRlTGlzdGVuZXIgZXh0ZW5kcyBFdmVudExpc3RlbmVyIHsKKwkvKiogTm90aWZpY2F0aW9uIHRoYXQgYW4gYXR0cmlidXRlIGhhcyBiZWVuIGFkZGVkIHRvIGEgc2Vzc2lvbi4gQ2FsbGVkIGFmdGVyIHRoZSBhdHRyaWJ1dGUgaXMgYWRkZWQuKi8KKyAgICBwdWJsaWMgdm9pZCBhdHRyaWJ1dGVBZGRlZCAoIEh0dHBTZXNzaW9uQmluZGluZ0V2ZW50IHNlICk7CisJLyoqIE5vdGlmaWNhdGlvbiB0aGF0IGFuIGF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkIGZyb20gYSBzZXNzaW9uLiBDYWxsZWQgYWZ0ZXIgdGhlIGF0dHJpYnV0ZSBpcyByZW1vdmVkLiAqLworICAgIHB1YmxpYyB2b2lkIGF0dHJpYnV0ZVJlbW92ZWQgKCBIdHRwU2Vzc2lvbkJpbmRpbmdFdmVudCBzZSApOworCS8qKiBOb3RpZmljYXRpb24gdGhhdCBhbiBhdHRyaWJ1dGUgaGFzIGJlZW4gcmVwbGFjZWQgaW4gYSBzZXNzaW9uLiBDYWxsZWQgYWZ0ZXIgdGhlIGF0dHJpYnV0ZSBpcyByZXBsYWNlZC4gKi8KKyAgICBwdWJsaWMgdm9pZCBhdHRyaWJ1dGVSZXBsYWNlZCAoIEh0dHBTZXNzaW9uQmluZGluZ0V2ZW50IHNlICk7CisKK30KKwpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvaHR0cC9IdHRwU2Vzc2lvbkJpbmRpbmdFdmVudC5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvaHR0cC9IdHRwU2Vzc2lvbkJpbmRpbmdFdmVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlODRmMzIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9odHRwL0h0dHBTZXNzaW9uQmluZGluZ0V2ZW50LmphdmEKQEAgLTAsMCArMSwxNTEgQEAKKy8qCisqIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworcGFja2FnZSBqYXZheC5zZXJ2bGV0Lmh0dHA7CisKKworCisvKioKKyAqCisgKiBFdmVudHMgb2YgdGhpcyB0eXBlIGFyZSBlaXRoZXIgc2VudCB0byBhbiBvYmplY3QgdGhhdCBpbXBsZW1lbnRzCisgKiB7QGxpbmsgSHR0cFNlc3Npb25CaW5kaW5nTGlzdGVuZXJ9IHdoZW4gaXQgaXMgYm91bmQgb3IgCisgKiB1bmJvdW5kIGZyb20gYSBzZXNzaW9uLCBvciB0byBhIHtAbGluayBIdHRwU2Vzc2lvbkF0dHJpYnV0ZUxpc3RlbmVyfSAKKyAqIHRoYXQgaGFzIGJlZW4gY29uZmlndXJlZCBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIHdoZW4gYW55IGF0dHJpYnV0ZSBpcworICogYm91bmQsIHVuYm91bmQgb3IgcmVwbGFjZWQgaW4gYSBzZXNzaW9uLgorICoKKyAqIDxwPlRoZSBzZXNzaW9uIGJpbmRzIHRoZSBvYmplY3QgYnkgYSBjYWxsIHRvCisgKiA8Y29kZT5IdHRwU2Vzc2lvbi5zZXRBdHRyaWJ1dGU8L2NvZGU+IGFuZCB1bmJpbmRzIHRoZSBvYmplY3QKKyAqIGJ5IGEgY2FsbCB0byA8Y29kZT5IdHRwU2Vzc2lvbi5yZW1vdmVBdHRyaWJ1dGU8L2NvZGU+LgorICoKKyAqCisgKgorICogQGF1dGhvcgkJVmFyaW91cworICogQHZlcnNpb24JCSRWZXJzaW9uJAorICogCisgKiBAc2VlIAkJSHR0cFNlc3Npb24KKyAqIEBzZWUgCQlIdHRwU2Vzc2lvbkJpbmRpbmdMaXN0ZW5lcgorICogQHNlZQkJCUh0dHBTZXNzaW9uQXR0cmlidXRlTGlzdGVuZXIKKyAqLworCitwdWJsaWMgY2xhc3MgSHR0cFNlc3Npb25CaW5kaW5nRXZlbnQgZXh0ZW5kcyBIdHRwU2Vzc2lvbkV2ZW50IHsKKworCisKKworICAgIC8qIFRoZSBuYW1lIHRvIHdoaWNoIHRoZSBvYmplY3QgaXMgYmVpbmcgYm91bmQgb3IgdW5ib3VuZCAqLworCisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKyAgICAKKyAgICAvKiBUaGUgb2JqZWN0IGlzIGJlaW5nIGJvdW5kIG9yIHVuYm91bmQgKi8KKworICAgIHByaXZhdGUgT2JqZWN0IHZhbHVlOworICAgIAorICAKKworICAgIC8qKgorICAgICAqCisgICAgICogQ29uc3RydWN0cyBhbiBldmVudCB0aGF0IG5vdGlmaWVzIGFuIG9iamVjdCB0aGF0IGl0CisgICAgICogaGFzIGJlZW4gYm91bmQgdG8gb3IgdW5ib3VuZCBmcm9tIGEgc2Vzc2lvbi4gCisgICAgICogVG8gcmVjZWl2ZSB0aGUgZXZlbnQsIHRoZSBvYmplY3QgbXVzdCBpbXBsZW1lbnQKKyAgICAgKiB7QGxpbmsgSHR0cFNlc3Npb25CaW5kaW5nTGlzdGVuZXJ9LgorICAgICAqCisgICAgICoKKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXNzaW9uIAl0aGUgc2Vzc2lvbiB0byB3aGljaCB0aGUgb2JqZWN0IGlzIGJvdW5kIG9yIHVuYm91bmQKKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIAl0aGUgbmFtZSB3aXRoIHdoaWNoIHRoZSBvYmplY3QgaXMgYm91bmQgb3IgdW5ib3VuZAorICAgICAqCisgICAgICogQHNlZQkJCSNnZXROYW1lCisgICAgICogQHNlZQkJCSNnZXRTZXNzaW9uCisgICAgICoKKyAgICAgKi8KKworICAgIHB1YmxpYyBIdHRwU2Vzc2lvbkJpbmRpbmdFdmVudChIdHRwU2Vzc2lvbiBzZXNzaW9uLCBTdHJpbmcgbmFtZSkgeworCXN1cGVyKHNlc3Npb24pOworCXRoaXMubmFtZSA9IG5hbWU7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqCisgICAgICogQ29uc3RydWN0cyBhbiBldmVudCB0aGF0IG5vdGlmaWVzIGFuIG9iamVjdCB0aGF0IGl0CisgICAgICogaGFzIGJlZW4gYm91bmQgdG8gb3IgdW5ib3VuZCBmcm9tIGEgc2Vzc2lvbi4gCisgICAgICogVG8gcmVjZWl2ZSB0aGUgZXZlbnQsIHRoZSBvYmplY3QgbXVzdCBpbXBsZW1lbnQKKyAgICAgKiB7QGxpbmsgSHR0cFNlc3Npb25CaW5kaW5nTGlzdGVuZXJ9LgorICAgICAqCisgICAgICoKKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXNzaW9uIAl0aGUgc2Vzc2lvbiB0byB3aGljaCB0aGUgb2JqZWN0IGlzIGJvdW5kIG9yIHVuYm91bmQKKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIAl0aGUgbmFtZSB3aXRoIHdoaWNoIHRoZSBvYmplY3QgaXMgYm91bmQgb3IgdW5ib3VuZAorICAgICAqCisgICAgICogQHNlZQkJCSNnZXROYW1lCisgICAgICogQHNlZQkJCSNnZXRTZXNzaW9uCisgICAgICoKKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgSHR0cFNlc3Npb25CaW5kaW5nRXZlbnQoSHR0cFNlc3Npb24gc2Vzc2lvbiwgU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgeworCXN1cGVyKHNlc3Npb24pOworCXRoaXMubmFtZSA9IG5hbWU7CisJdGhpcy52YWx1ZSA9IHZhbHVlOworICAgIH0KKyAgICAKKyAgICAKKyAgIAkvKiogUmV0dXJuIHRoZSBzZXNzaW9uIHRoYXQgY2hhbmdlZC4gKi8KKyAgICBwdWJsaWMgSHR0cFNlc3Npb24gZ2V0U2Vzc2lvbiAoKSB7IAorCXJldHVybiBzdXBlci5nZXRTZXNzaW9uKCk7CisgICAgfQorIAorICAgCisgIAorICAgIAorICAgIC8qKgorICAgICAqCisgICAgICogUmV0dXJucyB0aGUgbmFtZSB3aXRoIHdoaWNoIHRoZSBhdHRyaWJ1dGUgaXMgYm91bmQgdG8gb3IKKyAgICAgKiB1bmJvdW5kIGZyb20gdGhlIHNlc3Npb24uCisgICAgICoKKyAgICAgKgorICAgICAqIEByZXR1cm4JCWEgc3RyaW5nIHNwZWNpZnlpbmcgdGhlIG5hbWUgd2l0aCB3aGljaAorICAgICAqCQkJdGhlIG9iamVjdCBpcyBib3VuZCB0byBvciB1bmJvdW5kIGZyb20KKyAgICAgKgkJCXRoZSBzZXNzaW9uCisgICAgICoKKyAgICAgKgorICAgICAqLworCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCXJldHVybiBuYW1lOworICAgIH0KKyAgICAKKyAgICAvKioKKwkqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgdGhhdCBoYXMgYmVlbiBhZGRlZCwgcmVtb3ZlZCBvciByZXBsYWNlZC4KKwkqIElmIHRoZSBhdHRyaWJ1dGUgd2FzIGFkZGVkIChvciBib3VuZCksIHRoaXMgaXMgdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUuIElmIHRoZSBhdHRyaWJ1dGUgd2FzCisJKiByZW1vdmVkIChvciB1bmJvdW5kKSwgdGhpcyBpcyB0aGUgdmFsdWUgb2YgdGhlIHJlbW92ZWQgYXR0cmlidXRlLiBJZiB0aGUgYXR0cmlidXRlIHdhcyByZXBsYWNlZCwgdGhpcworCSogaXMgdGhlIG9sZCB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlLgorCSoKKyAgICAgICAgKiBAc2luY2UgMi4zCisJKi8KKwkKKwlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgeworCSAgICByZXR1cm4gdGhpcy52YWx1ZTsgICAKKwl9CisgICAgCit9CisKKworCisKKworCisKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2h0dHAvSHR0cFNlc3Npb25CaW5kaW5nTGlzdGVuZXIuamF2YSBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2h0dHAvSHR0cFNlc3Npb25CaW5kaW5nTGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDc2NzQ0Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvaHR0cC9IdHRwU2Vzc2lvbkJpbmRpbmdMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisqIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworcGFja2FnZSBqYXZheC5zZXJ2bGV0Lmh0dHA7CisKK2ltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKKworCisgCisgCisKKy8qKgorICogQ2F1c2VzIGFuIG9iamVjdCB0byBiZSBub3RpZmllZCB3aGVuIGl0IGlzIGJvdW5kIHRvCisgKiBvciB1bmJvdW5kIGZyb20gYSBzZXNzaW9uLiBUaGUgb2JqZWN0IGlzIG5vdGlmaWVkCisgKiBieSBhbiB7QGxpbmsgSHR0cFNlc3Npb25CaW5kaW5nRXZlbnR9IG9iamVjdC4gVGhpcyBtYXkgYmUgYXMgYSByZXN1bHQKKyAqIG9mIGEgc2VydmxldCBwcm9ncmFtbWVyIGV4cGxpY2l0bHkgdW5iaW5kaW5nIGFuIGF0dHJpYnV0ZSBmcm9tIGEgc2Vzc2lvbiwKKyAqIGR1ZSB0byBhIHNlc3Npb24gYmVpbmcgaW52YWxpZGF0ZWQsIG9yIGR1ZSB0byBhIHNlc3Npb24gdGltaW5nIG91dC4KKyAqCisgKgorICogQGF1dGhvcgkJVmFyaW91cworICogQHZlcnNpb24JCSRWZXJzaW9uJAorICoKKyAqIEBzZWUgSHR0cFNlc3Npb24KKyAqIEBzZWUgSHR0cFNlc3Npb25CaW5kaW5nRXZlbnQKKyAqCisgKi8KKworcHVibGljIGludGVyZmFjZSBIdHRwU2Vzc2lvbkJpbmRpbmdMaXN0ZW5lciBleHRlbmRzIEV2ZW50TGlzdGVuZXIgeworCisKKworICAgIC8qKgorICAgICAqCisgICAgICogTm90aWZpZXMgdGhlIG9iamVjdCB0aGF0IGl0IGlzIGJlaW5nIGJvdW5kIHRvCisgICAgICogYSBzZXNzaW9uIGFuZCBpZGVudGlmaWVzIHRoZSBzZXNzaW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGV2ZW50CQl0aGUgZXZlbnQgdGhhdCBpZGVudGlmaWVzIHRoZQorICAgICAqCQkJCXNlc3Npb24gCisgICAgICoKKyAgICAgKiBAc2VlICN2YWx1ZVVuYm91bmQKKyAgICAgKgorICAgICAqLyAKKworICAgIHB1YmxpYyB2b2lkIHZhbHVlQm91bmQoSHR0cFNlc3Npb25CaW5kaW5nRXZlbnQgZXZlbnQpOworICAgIAorICAgIAorCisgICAgLyoqCisgICAgICoKKyAgICAgKiBOb3RpZmllcyB0aGUgb2JqZWN0IHRoYXQgaXQgaXMgYmVpbmcgdW5ib3VuZAorICAgICAqIGZyb20gYSBzZXNzaW9uIGFuZCBpZGVudGlmaWVzIHRoZSBzZXNzaW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGV2ZW50CQl0aGUgZXZlbnQgdGhhdCBpZGVudGlmaWVzCisgICAgICoJCQkJdGhlIHNlc3Npb24gCisgICAgICoJCisgICAgICogQHNlZSAjdmFsdWVCb3VuZAorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgdm9pZCB2YWx1ZVVuYm91bmQoSHR0cFNlc3Npb25CaW5kaW5nRXZlbnQgZXZlbnQpOworICAgIAorICAgIAorfQorCmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9odHRwL0h0dHBTZXNzaW9uQ29udGV4dC5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvaHR0cC9IdHRwU2Vzc2lvbkNvbnRleHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDdiZmU2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvaHR0cC9IdHRwU2Vzc2lvbkNvbnRleHQuamF2YQpAQCAtMCwwICsxLDcwIEBACisvKgorKiBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKworcGFja2FnZSBqYXZheC5zZXJ2bGV0Lmh0dHA7CisKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CisKKy8qKgorICoKKyAqIEBhdXRob3IJCVZhcmlvdXMKKyAqIEB2ZXJzaW9uCQkkVmVyc2lvbiQKKyAqCisgKiBAZGVwcmVjYXRlZAkJQXMgb2YgSmF2YSh0bSkgU2VydmxldCBBUEkgMi4xCisgKgkJCWZvciBzZWN1cml0eSByZWFzb25zLCB3aXRoIG5vIHJlcGxhY2VtZW50LgorICoJCQlUaGlzIGludGVyZmFjZSB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUKKyAqCQkJdmVyc2lvbiBvZiB0aGlzIEFQSS4KKyAqCisgKiBAc2VlCQkJSHR0cFNlc3Npb24KKyAqIEBzZWUJCQlIdHRwU2Vzc2lvbkJpbmRpbmdFdmVudAorICogQHNlZQkJCUh0dHBTZXNzaW9uQmluZGluZ0xpc3RlbmVyCisgKgorICovCisKKworcHVibGljIGludGVyZmFjZSBIdHRwU2Vzc2lvbkNvbnRleHQgeworCisgICAgLyoqCisgICAgICoKKyAgICAgKiBAZGVwcmVjYXRlZCAJQXMgb2YgSmF2YSBTZXJ2bGV0IEFQSSAyLjEgd2l0aAorICAgICAqCQkJbm8gcmVwbGFjZW1lbnQuIFRoaXMgbWV0aG9kIG11c3QgCisgICAgICoJCQlyZXR1cm4gbnVsbCBhbmQgd2lsbCBiZSByZW1vdmVkIGluCisgICAgICoJCQlhIGZ1dHVyZSB2ZXJzaW9uIG9mIHRoaXMgQVBJLgorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgSHR0cFNlc3Npb24gZ2V0U2Vzc2lvbihTdHJpbmcgc2Vzc2lvbklkKTsKKyAgICAKKyAgICAKKyAgICAKKyAgCisgICAgLyoqCisgICAgICoKKyAgICAgKiBAZGVwcmVjYXRlZAlBcyBvZiBKYXZhIFNlcnZsZXQgQVBJIDIuMSB3aXRoCisgICAgICoJCQlubyByZXBsYWNlbWVudC4gVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gCisgICAgICoJCQlhbiBlbXB0eSA8Y29kZT5FbnVtZXJhdGlvbjwvY29kZT4gYW5kIHdpbGwgYmUgcmVtb3ZlZAorICAgICAqCQkJaW4gYSBmdXR1cmUgdmVyc2lvbiBvZiB0aGlzIEFQSS4KKyAgICAgKgorICAgICAqLworCisgICAgcHVibGljIEVudW1lcmF0aW9uIGdldElkcygpOworfQorCisKKworCisKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2h0dHAvSHR0cFNlc3Npb25FdmVudC5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvaHR0cC9IdHRwU2Vzc2lvbkV2ZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFhODVmOQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2h0dHAvSHR0cFNlc3Npb25FdmVudC5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisqIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KK3BhY2thZ2UgamF2YXguc2VydmxldC5odHRwOworCisKKwkvKiogVGhpcyBpcyB0aGUgY2xhc3MgcmVwcmVzZW50aW5nIGV2ZW50IG5vdGlmaWNhdGlvbnMgZm9yCisJKiBjaGFuZ2VzIHRvIHNlc3Npb25zIHdpdGhpbiBhIHdlYiBhcHBsaWNhdGlvbi4KKwkgKiBAc2luY2UJdiAyLjMKKwkqLworcHVibGljIGNsYXNzIEh0dHBTZXNzaW9uRXZlbnQgZXh0ZW5kcyBqYXZhLnV0aWwuRXZlbnRPYmplY3QgeworCS8qKiBDb25zdHJ1Y3QgYSBzZXNzaW9uIGV2ZW50IGZyb20gdGhlIGdpdmVuIHNvdXJjZS4qLworCSBwdWJsaWMgSHR0cFNlc3Npb25FdmVudChIdHRwU2Vzc2lvbiBzb3VyY2UpIHsKKwkJc3VwZXIoc291cmNlKTsKK30KKwkvKiogUmV0dXJuIHRoZSBzZXNzaW9uIHRoYXQgY2hhbmdlZC4qLworICAgIHB1YmxpYyBIdHRwU2Vzc2lvbiBnZXRTZXNzaW9uICgpIHsgCisJcmV0dXJuIChIdHRwU2Vzc2lvbikgc3VwZXIuZ2V0U291cmNlKCk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9odHRwL0h0dHBTZXNzaW9uTGlzdGVuZXIuamF2YSBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2h0dHAvSHR0cFNlc3Npb25MaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxYTkyMjQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9odHRwL0h0dHBTZXNzaW9uTGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDQ0IEBACisvKgorKiBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCitwYWNrYWdlIGphdmF4LnNlcnZsZXQuaHR0cDsKKworaW1wb3J0IGphdmEudXRpbC5FdmVudExpc3RlbmVyOworCisJLyoqIAorCSogSW1wbGVtZW50YXRpb25zIG9mIHRoaXMgaW50ZXJmYWNlIGFyZSBub3RpZmllZCBvZiBjaGFuZ2VzIHRvIHRoZSAKKwkqIGxpc3Qgb2YgYWN0aXZlIHNlc3Npb25zIGluIGEgd2ViIGFwcGxpY2F0aW9uLgorCSogVG8gcmVjZWl2ZSBub3RpZmljYXRpb24gZXZlbnRzLCB0aGUgaW1wbGVtZW50YXRpb24gY2xhc3MKKwkqIG11c3QgYmUgY29uZmlndXJlZCBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGZvciB0aGUgd2ViIGFwcGxpY2F0aW9uLgorCSogQHNlZSBIdHRwU2Vzc2lvbkV2ZW50CisJICogQHNpbmNlCXYgMi4zCisJKi8KKworcHVibGljIGludGVyZmFjZSBIdHRwU2Vzc2lvbkxpc3RlbmVyIGV4dGVuZHMgRXZlbnRMaXN0ZW5lciB7CisgICAgCisJLyoqIAorCSogTm90aWZpY2F0aW9uIHRoYXQgYSBzZXNzaW9uIHdhcyBjcmVhdGVkLgorCSogQHBhcmFtIHNlIHRoZSBub3RpZmljYXRpb24gZXZlbnQKKwkqLworICAgIHB1YmxpYyB2b2lkIHNlc3Npb25DcmVhdGVkICggSHR0cFNlc3Npb25FdmVudCBzZSApOworICAgIAorCS8qKiAKKwkqIE5vdGlmaWNhdGlvbiB0aGF0IGEgc2Vzc2lvbiBpcyBhYm91dCB0byBiZSBpbnZhbGlkYXRlZC4KKwkqIEBwYXJhbSBzZSB0aGUgbm90aWZpY2F0aW9uIGV2ZW50CisJKi8KKyAgICBwdWJsaWMgdm9pZCBzZXNzaW9uRGVzdHJveWVkICggSHR0cFNlc3Npb25FdmVudCBzZSApOworICAgIAorfQorCmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9odHRwL0h0dHBVdGlscy5qYXZhIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvaHR0cC9IdHRwVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmM1ZDkwCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvaHR0cC9IdHRwVXRpbHMuamF2YQpAQCAtMCwwICsxLDMwNiBAQAorLyoKKyogQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitwYWNrYWdlIGphdmF4LnNlcnZsZXQuaHR0cDsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldElucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOworaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworLyoqCisgKiBAZGVwcmVjYXRlZAkJQXMgb2YgSmF2YSh0bSkgU2VydmxldCBBUEkgMi4zLiAKKyAqCQkJVGhlc2UgbWV0aG9kcyB3ZXJlIG9ubHkgdXNlZnVsCisgKgkJCXdpdGggdGhlIGRlZmF1bHQgZW5jb2RpbmcgYW5kIGhhdmUgYmVlbiBtb3ZlZAorICoJCQl0byB0aGUgcmVxdWVzdCBpbnRlcmZhY2VzLgorICoKKyovCisKKworcHVibGljIGNsYXNzIEh0dHBVdGlscyB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTFNUUklOR19GSUxFID0KKwkiamF2YXguc2VydmxldC5odHRwLkxvY2FsU3RyaW5ncyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgbFN0cmluZ3MgPQorCVJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShMU1RSSU5HX0ZJTEUpOworICAgICAgICAKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGFuIGVtcHR5IDxjb2RlPkh0dHBVdGlsczwvY29kZT4gb2JqZWN0LgorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgSHR0cFV0aWxzKCkge30KKyAgICAKKyAgICAKKyAgICAKKyAgICAKKworICAgIC8qKgorICAgICAqCisgICAgICogUGFyc2VzIGEgcXVlcnkgc3RyaW5nIHBhc3NlZCBmcm9tIHRoZSBjbGllbnQgdG8gdGhlCisgICAgICogc2VydmVyIGFuZCBidWlsZHMgYSA8Y29kZT5IYXNoVGFibGU8L2NvZGU+IG9iamVjdAorICAgICAqIHdpdGgga2V5LXZhbHVlIHBhaXJzLiAKKyAgICAgKiBUaGUgcXVlcnkgc3RyaW5nIHNob3VsZCBiZSBpbiB0aGUgZm9ybSBvZiBhIHN0cmluZworICAgICAqIHBhY2thZ2VkIGJ5IHRoZSBHRVQgb3IgUE9TVCBtZXRob2QsIHRoYXQgaXMsIGl0CisgICAgICogc2hvdWxkIGhhdmUga2V5LXZhbHVlIHBhaXJzIGluIHRoZSBmb3JtIDxpPmtleT12YWx1ZTwvaT4sCisgICAgICogd2l0aCBlYWNoIHBhaXIgc2VwYXJhdGVkIGZyb20gdGhlIG5leHQgYnkgYSAmYW1wOyBjaGFyYWN0ZXIuCisgICAgICoKKyAgICAgKiA8cD5BIGtleSBjYW4gYXBwZWFyIG1vcmUgdGhhbiBvbmNlIGluIHRoZSBxdWVyeSBzdHJpbmcKKyAgICAgKiB3aXRoIGRpZmZlcmVudCB2YWx1ZXMuIEhvd2V2ZXIsIHRoZSBrZXkgYXBwZWFycyBvbmx5IG9uY2UgaW4gCisgICAgICogdGhlIGhhc2h0YWJsZSwgd2l0aCBpdHMgdmFsdWUgYmVpbmcKKyAgICAgKiBhbiBhcnJheSBvZiBzdHJpbmdzIGNvbnRhaW5pbmcgdGhlIG11bHRpcGxlIHZhbHVlcyBzZW50CisgICAgICogYnkgdGhlIHF1ZXJ5IHN0cmluZy4KKyAgICAgKiAKKyAgICAgKiA8cD5UaGUga2V5cyBhbmQgdmFsdWVzIGluIHRoZSBoYXNodGFibGUgYXJlIHN0b3JlZCBpbiB0aGVpcgorICAgICAqIGRlY29kZWQgZm9ybSwgc28KKyAgICAgKiBhbnkgKyBjaGFyYWN0ZXJzIGFyZSBjb252ZXJ0ZWQgdG8gc3BhY2VzLCBhbmQgY2hhcmFjdGVycworICAgICAqIHNlbnQgaW4gaGV4YWRlY2ltYWwgbm90YXRpb24gKGxpa2UgPGk+JXh4PC9pPikgYXJlCisgICAgICogY29udmVydGVkIHRvIEFTQ0lJIGNoYXJhY3RlcnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcwkJYSBzdHJpbmcgY29udGFpbmluZyB0aGUgcXVlcnkgdG8gYmUgcGFyc2VkCisgICAgICoKKyAgICAgKiBAcmV0dXJuCQlhIDxjb2RlPkhhc2hUYWJsZTwvY29kZT4gb2JqZWN0IGJ1aWx0CisgICAgICogCQkJZnJvbSB0aGUgcGFyc2VkIGtleS12YWx1ZSBwYWlycworICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24JaWYgdGhlIHF1ZXJ5IHN0cmluZyAKKyAgICAgKgkJCQkJCWlzIGludmFsaWQKKyAgICAgKgorICAgICAqLworCisgICAgc3RhdGljIHB1YmxpYyBIYXNodGFibGUgcGFyc2VRdWVyeVN0cmluZyhTdHJpbmcgcykgeworCisJU3RyaW5nIHZhbEFycmF5W10gPSBudWxsOworCQorCWlmIChzID09IG51bGwpIHsKKwkgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCX0KKwlIYXNodGFibGUgaHQgPSBuZXcgSGFzaHRhYmxlKCk7CisJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocywgIiYiKTsKKwl3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKSB7CisJICAgIFN0cmluZyBwYWlyID0gKFN0cmluZylzdC5uZXh0VG9rZW4oKTsKKwkgICAgaW50IHBvcyA9IHBhaXIuaW5kZXhPZignPScpOworCSAgICBpZiAocG9zID09IC0xKSB7CisJCS8vIFhYWAorCQkvLyBzaG91bGQgZ2l2ZSBtb3JlIGRldGFpbCBhYm91dCB0aGUgaWxsZWdhbCBhcmd1bWVudAorCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJICAgIH0KKwkgICAgU3RyaW5nIGtleSA9IHBhcnNlTmFtZShwYWlyLnN1YnN0cmluZygwLCBwb3MpLCBzYik7CisJICAgIFN0cmluZyB2YWwgPSBwYXJzZU5hbWUocGFpci5zdWJzdHJpbmcocG9zKzEsIHBhaXIubGVuZ3RoKCkpLCBzYik7CisJICAgIGlmIChodC5jb250YWluc0tleShrZXkpKSB7CisJCVN0cmluZyBvbGRWYWxzW10gPSAoU3RyaW5nIFtdKSBodC5nZXQoa2V5KTsKKwkJdmFsQXJyYXkgPSBuZXcgU3RyaW5nW29sZFZhbHMubGVuZ3RoICsgMV07CisJCWZvciAoaW50IGkgPSAwOyBpIDwgb2xkVmFscy5sZW5ndGg7IGkrKykgCisJCSAgICB2YWxBcnJheVtpXSA9IG9sZFZhbHNbaV07CisJCXZhbEFycmF5W29sZFZhbHMubGVuZ3RoXSA9IHZhbDsKKwkgICAgfSBlbHNlIHsKKwkJdmFsQXJyYXkgPSBuZXcgU3RyaW5nWzFdOworCQl2YWxBcnJheVswXSA9IHZhbDsKKwkgICAgfQorCSAgICBodC5wdXQoa2V5LCB2YWxBcnJheSk7CisJfQorCXJldHVybiBodDsKKyAgICB9CisKKworCisKKyAgICAvKioKKyAgICAgKgorICAgICAqIFBhcnNlcyBkYXRhIGZyb20gYW4gSFRNTCBmb3JtIHRoYXQgdGhlIGNsaWVudCBzZW5kcyB0byAKKyAgICAgKiB0aGUgc2VydmVyIHVzaW5nIHRoZSBIVFRQIFBPU1QgbWV0aG9kIGFuZCB0aGUgCisgICAgICogPGk+YXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkPC9pPiBNSU1FIHR5cGUuCisgICAgICoKKyAgICAgKiA8cD5UaGUgZGF0YSBzZW50IGJ5IHRoZSBQT1NUIG1ldGhvZCBjb250YWlucyBrZXktdmFsdWUKKyAgICAgKiBwYWlycy4gQSBrZXkgY2FuIGFwcGVhciBtb3JlIHRoYW4gb25jZSBpbiB0aGUgUE9TVCBkYXRhCisgICAgICogd2l0aCBkaWZmZXJlbnQgdmFsdWVzLiBIb3dldmVyLCB0aGUga2V5IGFwcGVhcnMgb25seSBvbmNlIGluIAorICAgICAqIHRoZSBoYXNodGFibGUsIHdpdGggaXRzIHZhbHVlIGJlaW5nCisgICAgICogYW4gYXJyYXkgb2Ygc3RyaW5ncyBjb250YWluaW5nIHRoZSBtdWx0aXBsZSB2YWx1ZXMgc2VudAorICAgICAqIGJ5IHRoZSBQT1NUIG1ldGhvZC4KKyAgICAgKgorICAgICAqIDxwPlRoZSBrZXlzIGFuZCB2YWx1ZXMgaW4gdGhlIGhhc2h0YWJsZSBhcmUgc3RvcmVkIGluIHRoZWlyCisgICAgICogZGVjb2RlZCBmb3JtLCBzbworICAgICAqIGFueSArIGNoYXJhY3RlcnMgYXJlIGNvbnZlcnRlZCB0byBzcGFjZXMsIGFuZCBjaGFyYWN0ZXJzCisgICAgICogc2VudCBpbiBoZXhhZGVjaW1hbCBub3RhdGlvbiAobGlrZSA8aT4leHg8L2k+KSBhcmUKKyAgICAgKiBjb252ZXJ0ZWQgdG8gQVNDSUkgY2hhcmFjdGVycy4KKyAgICAgKgorICAgICAqCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGVuCWFuIGludGVnZXIgc3BlY2lmeWluZyB0aGUgbGVuZ3RoLAorICAgICAqCQkJaW4gY2hhcmFjdGVycywgb2YgdGhlIAorICAgICAqCQkJPGNvZGU+U2VydmxldElucHV0U3RyZWFtPC9jb2RlPgorICAgICAqCQkJb2JqZWN0IHRoYXQgaXMgYWxzbyBwYXNzZWQgdG8gdGhpcworICAgICAqCQkJbWV0aG9kCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW4JdGhlIDxjb2RlPlNlcnZsZXRJbnB1dFN0cmVhbTwvY29kZT4KKyAgICAgKgkJCW9iamVjdCB0aGF0IGNvbnRhaW5zIHRoZSBkYXRhIHNlbnQKKyAgICAgKgkJCWZyb20gdGhlIGNsaWVudAorICAgICAqIAorICAgICAqIEByZXR1cm4JCWEgPGNvZGU+SGFzaFRhYmxlPC9jb2RlPiBvYmplY3QgYnVpbHQKKyAgICAgKgkJCWZyb20gdGhlIHBhcnNlZCBrZXktdmFsdWUgcGFpcnMKKyAgICAgKgorICAgICAqCisgICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24JaWYgdGhlIGRhdGEKKyAgICAgKgkJCXNlbnQgYnkgdGhlIFBPU1QgbWV0aG9kIGlzIGludmFsaWQKKyAgICAgKgorICAgICAqLworICAgICAKKworICAgIHN0YXRpYyBwdWJsaWMgSGFzaHRhYmxlIHBhcnNlUG9zdERhdGEoaW50IGxlbiwgCisJCQkJCSAgU2VydmxldElucHV0U3RyZWFtIGluKQorICAgIHsKKwkvLyBYWFgKKwkvLyBzaG91bGQgYSBsZW5ndGggb2YgMCBiZSBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKwkKKwlpZiAobGVuIDw9MCkKKwkgICAgcmV0dXJuIG5ldyBIYXNodGFibGUoKTsgLy8gY2hlYXAgaGFjayB0byByZXR1cm4gYW4gZW1wdHkgaGFzaAorCisJaWYgKGluID09IG51bGwpIHsKKwkgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCX0KKwkKKwkvLworCS8vIE1ha2Ugc3VyZSB3ZSByZWFkIHRoZSBlbnRpcmUgUE9TVGVkIGJvZHkuCisJLy8KKyAgICAgICAgYnl0ZVtdIHBvc3RlZEJ5dGVzID0gbmV3IGJ5dGUgW2xlbl07CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gMDsKKyAgICAgICAKKwkgICAgZG8geworCQlpbnQgaW5wdXRMZW4gPSBpbi5yZWFkIChwb3N0ZWRCeXRlcywgb2Zmc2V0LCBsZW4gLSBvZmZzZXQpOworCQlpZiAoaW5wdXRMZW4gPD0gMCkgeworCQkgICAgU3RyaW5nIG1zZyA9IGxTdHJpbmdzLmdldFN0cmluZygiZXJyLmlvLnNob3J0X3JlYWQiKTsKKwkJICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gKG1zZyk7CisJCX0KKwkJb2Zmc2V0ICs9IGlucHV0TGVuOworCSAgICB9IHdoaWxlICgobGVuIC0gb2Zmc2V0KSA+IDApOworCisJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCSAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKwl9CisKKyAgICAgICAgLy8gWFhYIHdlIHNob3VsZG4ndCBhc3N1bWUgdGhhdCB0aGUgb25seSBraW5kIG9mIFBPU1QgYm9keQorICAgICAgICAvLyBpcyBGT1JNIGRhdGEgZW5jb2RlZCB1c2luZyBBU0NJSSBvciBJU08gTGF0aW4vMSAuLi4gb3IKKyAgICAgICAgLy8gdGhhdCB0aGUgYm9keSBzaG91bGQgYWx3YXlzIGJlIHRyZWF0ZWQgYXMgRk9STSBkYXRhLgorICAgICAgICAvLworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTdHJpbmcgcG9zdGVkQm9keSA9IG5ldyBTdHJpbmcocG9zdGVkQnl0ZXMsIDAsIGxlbiwgIjg4NTlfMSIpOworICAgICAgICAgICAgcmV0dXJuIHBhcnNlUXVlcnlTdHJpbmcocG9zdGVkQm9keSk7CisgICAgICAgIH0gY2F0Y2ggKGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBYWFggZnVuY3Rpb24gc2hvdWxkIGFjY2VwdCBhbiBlbmNvZGluZyBwYXJhbWV0ZXIgJiB0aHJvdyB0aGlzCisgICAgICAgICAgICAvLyBleGNlcHRpb24uICBPdGhlcndpc2UgdGhyb3cgc29tZXRoaW5nIGV4cGVjdGVkLgorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKworCisKKyAgICAvKgorICAgICAqIFBhcnNlIGEgbmFtZSBpbiB0aGUgcXVlcnkgc3RyaW5nLgorICAgICAqLworCisgICAgc3RhdGljIHByaXZhdGUgU3RyaW5nIHBhcnNlTmFtZShTdHJpbmcgcywgU3RyaW5nQnVmZmVyIHNiKSB7CisJc2Iuc2V0TGVuZ3RoKDApOworCWZvciAoaW50IGkgPSAwOyBpIDwgcy5sZW5ndGgoKTsgaSsrKSB7CisJICAgIGNoYXIgYyA9IHMuY2hhckF0KGkpOyAKKwkgICAgc3dpdGNoIChjKSB7CisJICAgIGNhc2UgJysnOgorCQlzYi5hcHBlbmQoJyAnKTsKKwkJYnJlYWs7CisJICAgIGNhc2UgJyUnOgorCQl0cnkgeworCQkgICAgc2IuYXBwZW5kKChjaGFyKSBJbnRlZ2VyLnBhcnNlSW50KHMuc3Vic3RyaW5nKGkrMSwgaSszKSwgCisJCQkJCQkgICAgICAxNikpOworCQkgICAgaSArPSAyOworCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworCQkgICAgLy8gWFhYCisJCSAgICAvLyBuZWVkIHRvIGJlIG1vcmUgc3BlY2lmaWMgYWJvdXQgaWxsZWdhbCBhcmcKKwkJICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJfSBjYXRjaCAoU3RyaW5nSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisJCSAgICBTdHJpbmcgcmVzdCAgPSBzLnN1YnN0cmluZyhpKTsKKwkJICAgIHNiLmFwcGVuZChyZXN0KTsKKwkJICAgIGlmIChyZXN0Lmxlbmd0aCgpPT0yKQorCQkJaSsrOworCQl9CisJCQorCQlicmVhazsKKwkgICAgZGVmYXVsdDoKKwkJc2IuYXBwZW5kKGMpOworCQlicmVhazsKKwkgICAgfQorCX0KKwlyZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICB9CisKKworCisKKyAgICAvKioKKyAgICAgKgorICAgICAqIFJlY29uc3RydWN0cyB0aGUgVVJMIHRoZSBjbGllbnQgdXNlZCB0byBtYWtlIHRoZSByZXF1ZXN0LAorICAgICAqIHVzaW5nIGluZm9ybWF0aW9uIGluIHRoZSA8Y29kZT5IdHRwU2VydmxldFJlcXVlc3Q8L2NvZGU+IG9iamVjdC4KKyAgICAgKiBUaGUgcmV0dXJuZWQgVVJMIGNvbnRhaW5zIGEgcHJvdG9jb2wsIHNlcnZlciBuYW1lLCBwb3J0CisgICAgICogbnVtYmVyLCBhbmQgc2VydmVyIHBhdGgsIGJ1dCBpdCBkb2VzIG5vdCBpbmNsdWRlIHF1ZXJ5CisgICAgICogc3RyaW5nIHBhcmFtZXRlcnMuCisgICAgICogCisgICAgICogPHA+QmVjYXVzZSB0aGlzIG1ldGhvZCByZXR1cm5zIGEgPGNvZGU+U3RyaW5nQnVmZmVyPC9jb2RlPiwKKyAgICAgKiBub3QgYSBzdHJpbmcsIHlvdSBjYW4gbW9kaWZ5IHRoZSBVUkwgZWFzaWx5LCBmb3IgZXhhbXBsZSwKKyAgICAgKiB0byBhcHBlbmQgcXVlcnkgcGFyYW1ldGVycy4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgbWV0aG9kIGlzIHVzZWZ1bCBmb3IgY3JlYXRpbmcgcmVkaXJlY3QgbWVzc2FnZXMKKyAgICAgKiBhbmQgZm9yIHJlcG9ydGluZyBlcnJvcnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxCWEgPGNvZGU+SHR0cFNlcnZsZXRSZXF1ZXN0PC9jb2RlPiBvYmplY3QKKyAgICAgKgkJCWNvbnRhaW5pbmcgdGhlIGNsaWVudCdzIHJlcXVlc3QKKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuCQlhIDxjb2RlPlN0cmluZ0J1ZmZlcjwvY29kZT4gb2JqZWN0IGNvbnRhaW5pbmcKKyAgICAgKgkJCXRoZSByZWNvbnN0cnVjdGVkIFVSTAorICAgICAqCisgICAgICovCisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZ0J1ZmZlciBnZXRSZXF1ZXN0VVJMIChIdHRwU2VydmxldFJlcXVlc3QgcmVxKSB7CisJU3RyaW5nQnVmZmVyIHVybCA9IG5ldyBTdHJpbmdCdWZmZXIgKCk7CisJU3RyaW5nIHNjaGVtZSA9IHJlcS5nZXRTY2hlbWUgKCk7CisJaW50IHBvcnQgPSByZXEuZ2V0U2VydmVyUG9ydCAoKTsKKwlTdHJpbmcgdXJsUGF0aCA9IHJlcS5nZXRSZXF1ZXN0VVJJKCk7CisJCisJLy9TdHJpbmcJCXNlcnZsZXRQYXRoID0gcmVxLmdldFNlcnZsZXRQYXRoICgpOworCS8vU3RyaW5nCQlwYXRoSW5mbyA9IHJlcS5nZXRQYXRoSW5mbyAoKTsKKworCXVybC5hcHBlbmQgKHNjaGVtZSk7CQkvLyBodHRwLCBodHRwcworCXVybC5hcHBlbmQgKCI6Ly8iKTsKKwl1cmwuYXBwZW5kIChyZXEuZ2V0U2VydmVyTmFtZSAoKSk7CisJaWYgKChzY2hlbWUuZXF1YWxzICgiaHR0cCIpICYmIHBvcnQgIT0gODApCisJCXx8IChzY2hlbWUuZXF1YWxzICgiaHR0cHMiKSAmJiBwb3J0ICE9IDQ0MykpIHsKKwkgICAgdXJsLmFwcGVuZCAoJzonKTsKKwkgICAgdXJsLmFwcGVuZCAocmVxLmdldFNlcnZlclBvcnQgKCkpOworCX0KKwkvL2lmIChzZXJ2bGV0UGF0aCAhPSBudWxsKQorCS8vICAgIHVybC5hcHBlbmQgKHNlcnZsZXRQYXRoKTsKKwkvL2lmIChwYXRoSW5mbyAhPSBudWxsKQorCS8vICAgIHVybC5hcHBlbmQgKHBhdGhJbmZvKTsKKwl1cmwuYXBwZW5kKHVybFBhdGgpOworCXJldHVybiB1cmw7CisgICAgfQorfQorCisKKwpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvaHR0cC9Mb2NhbFN0cmluZ3MucHJvcGVydGllcyBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2h0dHAvTG9jYWxTdHJpbmdzLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY0ZDRjOAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2h0dHAvTG9jYWxTdHJpbmdzLnByb3BlcnRpZXMKQEAgLTAsMCArMSwyNyBAQAorIyBDb3B5cmlnaHQgMjAwNCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyBEZWZhdWx0IGxvY2FsaXplZCBzdHJpbmcgaW5mb3JtYXRpb24KKyMgTG9jYWxpemVkIGZvciBMb2NhbGUgZW5fVVMKKworZXJyLmNvb2tpZV9uYW1lX2lzX3Rva2VuPUNvb2tpZSBuYW1lIFwiezB9XCIgaXMgYSByZXNlcnZlZCB0b2tlbgorZXJyLmlvLm5lZ2F0aXZlbGVuZ3RoPU5lZ2F0aXZlIExlbmd0aCBnaXZlbiBpbiB3cml0ZSBtZXRob2QKK2Vyci5pby5zaG9ydF9yZWFkPVNob3J0IFJlYWQKKworaHR0cC5tZXRob2Rfbm90X2ltcGxlbWVudGVkPU1ldGhvZCB7MH0gaXMgbm90IGRlZmluZWQgaW4gUkZDIDIwNjggYW5kIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIFNlcnZsZXQgQVBJIAorCitodHRwLm1ldGhvZF9nZXRfbm90X3N1cHBvcnRlZD1IVFRQIG1ldGhvZCBHRVQgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIFVSTAoraHR0cC5tZXRob2RfcG9zdF9ub3Rfc3VwcG9ydGVkPUhUVFAgbWV0aG9kIFBPU1QgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIFVSTAoraHR0cC5tZXRob2RfcHV0X25vdF9zdXBwb3J0ZWQ9SFRUUCBtZXRob2QgUFVUIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBVUkwKK2h0dHAubWV0aG9kX2RlbGV0ZV9ub3Rfc3VwcG9ydGVkPUh0dHAgbWV0aG9kIERFTEVURSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgVVJMCmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9odHRwL0xvY2FsU3RyaW5nc19lcy5wcm9wZXJ0aWVzIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvaHR0cC9Mb2NhbFN0cmluZ3NfZXMucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjMwZTZiCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvaHR0cC9Mb2NhbFN0cmluZ3NfZXMucHJvcGVydGllcwpAQCAtMCwwICsxLDI5IEBACisjIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjICRJZCQKKyMKKyMgRGVmYXVsdCBsb2NhbGl6ZWQgc3RyaW5nIGluZm9ybWF0aW9uCisjIExvY2FsaXplZCBwYXJhIExvY2FsZSBlc19FUworCitlcnIuY29va2llX25hbWVfaXNfdG9rZW49RWwgTm9tYnJlIGRlIENvb2tpZSB7MH0gZXMgdW5hIHBhbGFicmEgcmVzZXJ2YWRhCitlcnIuaW8ubmVnYXRpdmVsZW5ndGg9TG9uZ2l0dWQgTmVnYXRpdmEgZW4gZWwgbWV0b2RvIHdyaXRlCitlcnIuaW8uc2hvcnRfcmVhZD1MZWN0dXJhIENvcnRhCisKK2h0dHAubWV0aG9kX25vdF9pbXBsZW1lbnRlZD1FbCBNZXRvZG8gezB9IG5vIGVzdGEgZGVmaW5pZG8gZW4gbGEgZXNwZWNpZmljYWNpb24gUkZDIDIwNjggeSBubyBlcyBzb3BvcnRhZG8gcG9yIGxhIEFQSSBTZXJ2bGV0IAorCitodHRwLm1ldGhvZF9nZXRfbm90X3N1cHBvcnRlZD1FbCBNZXRvZG8gSFRUUCBHRVQgbm8gZXMgc29wb3J0YWRvIHBvciBlc3RhIFVSTAoraHR0cC5tZXRob2RfcG9zdF9ub3Rfc3VwcG9ydGVkPUVsIE1ldG9kbyBIVFRQIFBPU1Qgbm8gZXMgc29wb3J0YWRvIHBvciBlc3RhIFVSTAoraHR0cC5tZXRob2RfcHV0X25vdF9zdXBwb3J0ZWQ9RWwgTWV0b2RvIEhUVFAgUFVUIG5vIGVzIHNvcG9ydGFkbyBwb3IgZXN0YSBVUkwKK2h0dHAubWV0aG9kX2RlbGV0ZV9ub3Rfc3VwcG9ydGVkPUVsIE1ldG9kbyBIVFRQIERFTEVURSBubyBlcyBzb3BvcnRhZG8gcG9yIGVzdGEgVVJMCmRpZmYgLS1naXQgYS9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9odHRwL0xvY2FsU3RyaW5nc19mci5wcm9wZXJ0aWVzIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvaHR0cC9Mb2NhbFN0cmluZ3NfZnIucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmJjMDljCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvaHR0cC9Mb2NhbFN0cmluZ3NfZnIucHJvcGVydGllcwpAQCAtMCwwICsxLDI3IEBACisjIENvcHlyaWdodCAyMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIERlZmF1bHQgbG9jYWxpemVkIHN0cmluZyBpbmZvcm1hdGlvbgorIyBMb2NhbGl6ZWQgZm9yIExvY2FsZSBmcl9GUgorCitlcnIuY29va2llX25hbWVfaXNfdG9rZW49TGUgbm9tIGRlIGNvb2tpZSBcInswfVwiIGVzdCB1biBcInRva2VuXCIgculzZXJ26QorZXJyLmlvLm5lZ2F0aXZlbGVuZ3RoPVRhaWxsZSBu6WdhdGl2ZSBkb25u6WUgZGFucyBsYSBt6XRob2RlIFwid3JpdGVcIgorZXJyLmlvLnNob3J0X3JlYWQ9TGVjdHVyZSBwYXJ0aWVsbGUKKworaHR0cC5tZXRob2Rfbm90X2ltcGxlbWVudGVkPUxlIG3pdGhvZGUgezB9IG4nJ2VzdCBwYXMgZOlmaW5pZSBkYW5zIGxhIFJGQyAyMDY4IGV0IG4nJ2VzdCBwYXMgc3VwcG9ydOllIHBhciBsJydBUEkgU2VydmxldAorCitodHRwLm1ldGhvZF9nZXRfbm90X3N1cHBvcnRlZD1MYSBt6XRob2RlIEhUVFAgR0VUIG4nJ2VzdCBwYXMgc3VwcG9ydOllIHBhciBjZXR0ZSBVUkwKK2h0dHAubWV0aG9kX3Bvc3Rfbm90X3N1cHBvcnRlZD1MYSBt6XRob2RlIEhUVFAgUE9TVCBuJydlc3QgcGFzIHN1cHBvcnTpZSBwYXIgY2V0dGUgVVJMCitodHRwLm1ldGhvZF9wdXRfbm90X3N1cHBvcnRlZD1MYSBt6XRob2RlIEhUVFAgUFVUIG4nJ2VzdCBwYXMgc3VwcG9ydOllIHBhciBjZXR0ZSBVUkwKK2h0dHAubWV0aG9kX2RlbGV0ZV9ub3Rfc3VwcG9ydGVkPUxhIG3pdGhvZGUgSFRUUCBERUxFVEUgbicnZXN0IHBhcyBzdXBwb3J06WUgcGFyIGNldHRlIFVSTCAKZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L2h0dHAvTG9jYWxTdHJpbmdzX2phLnByb3BlcnRpZXMgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9odHRwL0xvY2FsU3RyaW5nc19qYS5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkZmJkZDUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9odHRwL0xvY2FsU3RyaW5nc19qYS5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMjcgQEAKKyMgQ29weXJpZ2h0IDIwMDQgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMgRGVmYXVsdCBsb2NhbGl6ZWQgc3RyaW5nIGluZm9ybWF0aW9uCisjIExvY2FsaXplZCBmb3IgTG9jYWxlIGphX0pQCisKK2Vyci5jb29raWVfbmFtZV9pc190b2tlbj1cdTMwYWZcdTMwYzNcdTMwYWRcdTMwZmNcdTU0MGQgXCJ7MH1cIiBcdTMwNmZcdTRlODhcdTdkMDRcdTZlMDhcdTMwNmVcdTMwYzhcdTMwZmNcdTMwYWZcdTMwZjNcdTMwNjdcdTMwNTlcdTMwMDIKK2Vyci5pby5uZWdhdGl2ZWxlbmd0aD13cml0ZVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzA2Ylx1OGNhMFx1MzA2ZVx1OTU3N1x1MzA1NVx1MzA0Y1x1NjMwN1x1NWI5YVx1MzA1NVx1MzA4Y1x1MzA3ZVx1MzA1N1x1MzA1Zlx1MzAwMgorZXJyLmlvLnNob3J0X3JlYWQ9XHU4YWFkXHUzMDdmXHU4ZmJjXHUzMDdmXHUzMDRjXHUzMDU5XHUzMDUwXHUzMDZiXHU3ZDQyXHUzMDhmXHUzMDhhXHUzMDdlXHUzMDU3XHUzMDVmXHUzMDAyCisKK2h0dHAubWV0aG9kX25vdF9pbXBsZW1lbnRlZD1cdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzkgezB9IFx1MzA2ZlJGQyAyMDY4XHUzMDZiXHUzMDZmXHU1YjlhXHU3ZmE5XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDRhXHUzMDg5XHUzMDVhXHUzMDAxXHUzMGI1XHUzMGZjXHUzMGQ2XHUzMGVjXHUzMGMzXHUzMGM4QVBJXHUzMDY3XHUzMDZmXHUzMGI1XHUzMGRkXHUzMGZjXHUzMGM4XHUzMDU1XHUzMDhjXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyCisKK2h0dHAubWV0aG9kX2dldF9ub3Rfc3VwcG9ydGVkPUhUVFBcdTMwNmVHRVRcdTMwZTFcdTMwYmRcdTMwYzNcdTMwYzlcdTMwNmZcdTMwMDFcdTMwNTNcdTMwNmVVUkxcdTMwNjdcdTMwNmZcdTMwYjVcdTMwZGRcdTMwZmNcdTMwYzhcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDIKK2h0dHAubWV0aG9kX3Bvc3Rfbm90X3N1cHBvcnRlZD1IVFRQXHUzMDZlUE9TVFx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzA2Zlx1MzAwMVx1MzA1M1x1MzA2ZVVSTFx1MzA2N1x1MzA2Zlx1MzBiNVx1MzBkZFx1MzBmY1x1MzBjOFx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMgoraHR0cC5tZXRob2RfcHV0X25vdF9zdXBwb3J0ZWQ9SFRUUFx1MzA2ZVBVVFx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzA2Zlx1MzAwMVx1MzA1M1x1MzA2ZVVSTFx1MzA2N1x1MzA2Zlx1MzBiNVx1MzBkZFx1MzBmY1x1MzBjOFx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMgoraHR0cC5tZXRob2RfZGVsZXRlX25vdF9zdXBwb3J0ZWQ9SFRUUFx1MzA2ZURFTEVURVx1MzBlMVx1MzBiZFx1MzBjM1x1MzBjOVx1MzA2Zlx1MzAwMVx1MzA1M1x1MzA2ZVVSTFx1MzA2N1x1MzA2Zlx1MzBiNVx1MzBkZFx1MzBmY1x1MzBjOFx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMgpkaWZmIC0tZ2l0IGEvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvaHR0cC9wYWNrYWdlLmh0bWwgYi9zZXJ2bGV0YXBpL2pzcjE1NC9zcmMvc2hhcmUvamF2YXgvc2VydmxldC9odHRwL3BhY2thZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmRiZGY2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvaHR0cC9wYWNrYWdlLmh0bWwKQEAgLTAsMCArMSwyMyBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgorPEhUTUw+Cis8SEVBRD4KKzwhLS0KKworICBDb3B5cmlnaHQgMjAwMSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyAgVGhpcyBzb2Z0d2FyZSBpcyB0aGUgcHJvcHJpZXRhcnkgaW5mb3JtYXRpb24gb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAgCisgIFVzZSBpcyBzdWJqZWN0IHRvIGxpY2Vuc2UgdGVybXMuCisKKy0tPgorCis8L0hFQUQ+Cis8Qk9EWSBCR0NPTE9SPSJ3aGl0ZSI+CisKK1RoZSBqYXZheC5zZXJ2bGV0Lmh0dHAgcGFja2FnZSBjb250YWlucyBhIG51bWJlciBvZiBjbGFzc2VzIGFuZCBpbnRlcmZhY2VzCit0aGF0IGRlc2NyaWJlIGFuZCBkZWZpbmUgdGhlIGNvbnRyYWN0cyBiZXR3ZWVuIGEgc2VydmxldCBjbGFzcworcnVubmluZyB1bmRlciB0aGUgSFRUUCBwcm90b2NvbCBhbmQgdGhlIHJ1bnRpbWUgZW52aXJvbm1lbnQgcHJvdmlkZWQKK2ZvciBhbiBpbnN0YW5jZSBvZiBzdWNoIGEgY2xhc3MgYnkgYSBjb25mb3JtaW5nIHNlcnZsZXQgY29udGFpbmVyLgorCisKKzwvQk9EWT4KKzwvSFRNTD4KZGlmZiAtLWdpdCBhL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L3BhY2thZ2UuaHRtbCBiL3NlcnZsZXRhcGkvanNyMTU0L3NyYy9zaGFyZS9qYXZheC9zZXJ2bGV0L3BhY2thZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTcyMGE4Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmxldGFwaS9qc3IxNTQvc3JjL3NoYXJlL2phdmF4L3NlcnZsZXQvcGFja2FnZS5odG1sCkBAIC0wLDAgKzEsMjMgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KKzxIVE1MPgorPEhFQUQ+Cis8IS0tCisKKyAgQ29weXJpZ2h0IDIwMDEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisgIFRoaXMgc29mdHdhcmUgaXMgdGhlIHByb3ByaWV0YXJ5IGluZm9ybWF0aW9uIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIAorICBVc2UgaXMgc3ViamVjdCB0byBsaWNlbnNlIHRlcm1zLgorCistLT4KKworPC9IRUFEPgorPEJPRFkgQkdDT0xPUj0id2hpdGUiPgorCitUaGUgamF2YXguc2VydmxldCBwYWNrYWdlIGNvbnRhaW5zIGEgbnVtYmVyIG9mIGNsYXNzZXMgYW5kIGludGVyZmFjZXMgdGhhdAorZGVzY3JpYmUgYW5kIGRlZmluZSB0aGUgY29udHJhY3RzIGJldHdlZW4gYSBzZXJ2bGV0IGNsYXNzIGFuZCB0aGUKK3J1bnRpbWUgZW52aXJvbm1lbnQgcHJvdmlkZWQgZm9yIGFuIGluc3RhbmNlIG9mIHN1Y2ggYSBjbGFzcyBieSBhCitjb25mb3JtaW5nIHNlcnZsZXQgY29udGFpbmVyLgorCisKKzwvQk9EWT4KKzwvSFRNTD4K